diff --git a/src/driver/usb/mtp/usb_mtp.h b/src/driver/usb/mtp/usb_mtp.h new file mode 100644 index 000000000..0e007d311 --- /dev/null +++ b/src/driver/usb/mtp/usb_mtp.h @@ -0,0 +1,697 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * 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. + */ + +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ + + /****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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 USB_MTP_H +#define USB_MTP_H + +#include +#include +#include + +// Define __PACKED if not already defined +#ifndef __PACKED +#define __PACKED __attribute__((packed)) +#endif + +// clang-format off +#define MTP_STANDARD_VERSION 100 + +// Container Types +#define MTP_CONTAINER_TYPE_UNDEFINED 0 +#define MTP_CONTAINER_TYPE_COMMAND 1 +#define MTP_CONTAINER_TYPE_DATA 2 +#define MTP_CONTAINER_TYPE_RESPONSE 3 +#define MTP_CONTAINER_TYPE_EVENT 4 + +// Container Offsets +#define MTP_CONTAINER_LENGTH_OFFSET 0 +#define MTP_CONTAINER_TYPE_OFFSET 4 +#define MTP_CONTAINER_CODE_OFFSET 6 +#define MTP_CONTAINER_TRANSACTION_ID_OFFSET 8 +#define MTP_CONTAINER_PARAMETER_OFFSET 12 +#define MTP_CONTAINER_HEADER_SIZE 12 + +// Maximum buffer size for a MTP packet. +#define MTP_BUFFER_SIZE 16384 + +// MTP Data Types +#define MTP_TYPE_UNDEFINED 0x0000 // Undefined +#define MTP_TYPE_INT8 0x0001 // Signed 8-bit integer +#define MTP_TYPE_UINT8 0x0002 // Unsigned 8-bit integer +#define MTP_TYPE_INT16 0x0003 // Signed 16-bit integer +#define MTP_TYPE_UINT16 0x0004 // Unsigned 16-bit integer +#define MTP_TYPE_INT32 0x0005 // Signed 32-bit integer +#define MTP_TYPE_UINT32 0x0006 // Unsigned 32-bit integer +#define MTP_TYPE_INT64 0x0007 // Signed 64-bit integer +#define MTP_TYPE_UINT64 0x0008 // Unsigned 64-bit integer +#define MTP_TYPE_INT128 0x0009 // Signed 128-bit integer +#define MTP_TYPE_UINT128 0x000A // Unsigned 128-bit integer +#define MTP_TYPE_AINT8 0x4001 // Array of signed 8-bit integers +#define MTP_TYPE_AUINT8 0x4002 // Array of unsigned 8-bit integers +#define MTP_TYPE_AINT16 0x4003 // Array of signed 16-bit integers +#define MTP_TYPE_AUINT16 0x4004 // Array of unsigned 16-bit integers +#define MTP_TYPE_AINT32 0x4005 // Array of signed 32-bit integers +#define MTP_TYPE_AUINT32 0x4006 // Array of unsigned 32-bit integers +#define MTP_TYPE_AINT64 0x4007 // Array of signed 64-bit integers +#define MTP_TYPE_AUINT64 0x4008 // Array of unsigned 64-bit integers +#define MTP_TYPE_AINT128 0x4009 // Array of signed 128-bit integers +#define MTP_TYPE_AUINT128 0x400A // Array of unsigned 128-bit integers +#define MTP_TYPE_STR 0xFFFF // Variable-length Unicode string + +// MTP Format Codes +#define MTP_FORMAT_UNDEFINED 0x3000 // Undefined object +#define MTP_FORMAT_ASSOCIATION 0x3001 // Association (for example, a folder) +#define MTP_FORMAT_SCRIPT 0x3002 // Device model-specific script +#define MTP_FORMAT_EXECUTABLE 0x3003 // Device model-specific binary executable +#define MTP_FORMAT_TEXT 0x3004 // Text file +#define MTP_FORMAT_HTML 0x3005 // Hypertext Markup Language file (text) +#define MTP_FORMAT_DPOF 0x3006 // Digital Print Order Format file (text) +#define MTP_FORMAT_AIFF 0x3007 // Audio clip +#define MTP_FORMAT_WAV 0x3008 // Audio clip +#define MTP_FORMAT_MP3 0x3009 // Audio clip +#define MTP_FORMAT_AVI 0x300A // Video clip +#define MTP_FORMAT_MPEG 0x300B // Video clip +#define MTP_FORMAT_ASF 0x300C // Microsoft Advanced Streaming Format (video) +#define MTP_FORMAT_DEFINED 0x3800 // Unknown image object +#define MTP_FORMAT_EXIF_JPEG 0x3801 // Exchangeable File Format, JEIDA standard +#define MTP_FORMAT_TIFF_EP 0x3802 // Tag Image File Format for Electronic Photography +#define MTP_FORMAT_FLASHPIX 0x3803 // Structured Storage Image Format +#define MTP_FORMAT_BMP 0x3804 // Microsoft Windows Bitmap file +#define MTP_FORMAT_CIFF 0x3805 // Canon Camera Image File Format +#define MTP_FORMAT_GIF 0x3807 // Graphics Interchange Format +#define MTP_FORMAT_JFIF 0x3808 // JPEG File Interchange Format +#define MTP_FORMAT_CD 0x3809 // PhotoCD Image Pac +#define MTP_FORMAT_PICT 0x380A // Quickdraw Image Format +#define MTP_FORMAT_PNG 0x380B // Portable Network Graphics +#define MTP_FORMAT_TIFF 0x380D // Tag Image File Format +#define MTP_FORMAT_TIFF_IT 0x380E // Tag Image File Format for Information Technology (graphic arts) +#define MTP_FORMAT_JP2 0x380F // JPEG2000 Baseline File Format +#define MTP_FORMAT_JPX 0x3810 // JPEG2000 Extended File Format +#define MTP_FORMAT_DNG 0x3811 // Digital Negative +#define MTP_FORMAT_HEIF 0x3812 // HEIF images +#define MTP_FORMAT_UNDEFINED_FIRMWARE 0xB802 +#define MTP_FORMAT_WINDOWS_IMAGE_FORMAT 0xB881 +#define MTP_FORMAT_UNDEFINED_AUDIO 0xB900 +#define MTP_FORMAT_WMA 0xB901 +#define MTP_FORMAT_OGG 0xB902 +#define MTP_FORMAT_AAC 0xB903 +#define MTP_FORMAT_AUDIBLE 0xB904 +#define MTP_FORMAT_FLAC 0xB906 +#define MTP_FORMAT_UNDEFINED_VIDEO 0xB980 +#define MTP_FORMAT_WMV 0xB981 +#define MTP_FORMAT_MP4_CONTAINER 0xB982 // ISO 14496-1 +#define MTP_FORMAT_MP2 0xB983 +#define MTP_FORMAT_3GP_CONTAINER 0xB984 // 3GPP file format. Details: http://www.3gpp.org/ftp/Specs/html-info/26244.htm (page title - \u201cTransparent end-to-end packet switched streaming service, 3GPP file format\u201d). +#define MTP_FORMAT_UNDEFINED_COLLECTION 0xBA00 +#define MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM 0xBA01 +#define MTP_FORMAT_ABSTRACT_IMAGE_ALBUM 0xBA02 +#define MTP_FORMAT_ABSTRACT_AUDIO_ALBUM 0xBA03 +#define MTP_FORMAT_ABSTRACT_VIDEO_ALBUM 0xBA04 +#define MTP_FORMAT_ABSTRACT_AV_PLAYLIST 0xBA05 +#define MTP_FORMAT_ABSTRACT_CONTACT_GROUP 0xBA06 +#define MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER 0xBA07 +#define MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION 0xBA08 +#define MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST 0xBA09 +#define MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST 0xBA0A +#define MTP_FORMAT_ABSTRACT_MEDIACAST 0xBA0B // For use with mediacasts; references multimedia enclosures of RSS feeds or episodic content +#define MTP_FORMAT_WPL_PLAYLIST 0xBA10 +#define MTP_FORMAT_M3U_PLAYLIST 0xBA11 +#define MTP_FORMAT_MPL_PLAYLIST 0xBA12 +#define MTP_FORMAT_ASX_PLAYLIST 0xBA13 +#define MTP_FORMAT_PLS_PLAYLIST 0xBA14 +#define MTP_FORMAT_UNDEFINED_DOCUMENT 0xBA80 +#define MTP_FORMAT_ABSTRACT_DOCUMENT 0xBA81 +#define MTP_FORMAT_XML_DOCUMENT 0xBA82 +#define MTP_FORMAT_MS_WORD_DOCUMENT 0xBA83 +#define MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT 0xBA84 +#define MTP_FORMAT_MS_EXCEL_SPREADSHEET 0xBA85 +#define MTP_FORMAT_MS_POWERPOINT_PRESENTATION 0xBA86 +#define MTP_FORMAT_UNDEFINED_MESSAGE 0xBB00 +#define MTP_FORMAT_ABSTRACT_MESSSAGE 0xBB01 +#define MTP_FORMAT_UNDEFINED_CONTACT 0xBB80 +#define MTP_FORMAT_ABSTRACT_CONTACT 0xBB81 +#define MTP_FORMAT_VCARD_2 0xBB82 + +// MTP Object Property Codes +#define MTP_PROPERTY_STORAGE_ID 0xDC01 +#define MTP_PROPERTY_OBJECT_FORMAT 0xDC02 +#define MTP_PROPERTY_PROTECTION_STATUS 0xDC03 +#define MTP_PROPERTY_OBJECT_SIZE 0xDC04 +#define MTP_PROPERTY_ASSOCIATION_TYPE 0xDC05 +#define MTP_PROPERTY_ASSOCIATION_DESC 0xDC06 +#define MTP_PROPERTY_OBJECT_FILE_NAME 0xDC07 +#define MTP_PROPERTY_DATE_CREATED 0xDC08 +#define MTP_PROPERTY_DATE_MODIFIED 0xDC09 +#define MTP_PROPERTY_KEYWORDS 0xDC0A +#define MTP_PROPERTY_PARENT_OBJECT 0xDC0B +#define MTP_PROPERTY_ALLOWED_FOLDER_CONTENTS 0xDC0C +#define MTP_PROPERTY_HIDDEN 0xDC0D +#define MTP_PROPERTY_SYSTEM_OBJECT 0xDC0E +#define MTP_PROPERTY_PERSISTENT_UID 0xDC41 +#define MTP_PROPERTY_SYNC_ID 0xDC42 +#define MTP_PROPERTY_PROPERTY_BAG 0xDC43 +#define MTP_PROPERTY_NAME 0xDC44 +#define MTP_PROPERTY_CREATED_BY 0xDC45 +#define MTP_PROPERTY_ARTIST 0xDC46 +#define MTP_PROPERTY_DATE_AUTHORED 0xDC47 +#define MTP_PROPERTY_DESCRIPTION 0xDC48 +#define MTP_PROPERTY_URL_REFERENCE 0xDC49 +#define MTP_PROPERTY_LANGUAGE_LOCALE 0xDC4A +#define MTP_PROPERTY_COPYRIGHT_INFORMATION 0xDC4B +#define MTP_PROPERTY_SOURCE 0xDC4C +#define MTP_PROPERTY_ORIGIN_LOCATION 0xDC4D +#define MTP_PROPERTY_DATE_ADDED 0xDC4E +#define MTP_PROPERTY_NON_CONSUMABLE 0xDC4F +#define MTP_PROPERTY_CORRUPT_UNPLAYABLE 0xDC50 +#define MTP_PROPERTY_PRODUCER_SERIAL_NUMBER 0xDC51 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_FORMAT 0xDC81 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_SIZE 0xDC82 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_HEIGHT 0xDC83 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_WIDTH 0xDC84 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DURATION 0xDC85 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DATA 0xDC86 +#define MTP_PROPERTY_WIDTH 0xDC87 +#define MTP_PROPERTY_HEIGHT 0xDC88 +#define MTP_PROPERTY_DURATION 0xDC89 +#define MTP_PROPERTY_RATING 0xDC8A +#define MTP_PROPERTY_TRACK 0xDC8B +#define MTP_PROPERTY_GENRE 0xDC8C +#define MTP_PROPERTY_CREDITS 0xDC8D +#define MTP_PROPERTY_LYRICS 0xDC8E +#define MTP_PROPERTY_SUBSCRIPTION_CONTENT_ID 0xDC8F +#define MTP_PROPERTY_PRODUCED_BY 0xDC90 +#define MTP_PROPERTY_USE_COUNT 0xDC91 +#define MTP_PROPERTY_SKIP_COUNT 0xDC92 +#define MTP_PROPERTY_LAST_ACCESSED 0xDC93 +#define MTP_PROPERTY_PARENTAL_RATING 0xDC94 +#define MTP_PROPERTY_META_GENRE 0xDC95 +#define MTP_PROPERTY_COMPOSER 0xDC96 +#define MTP_PROPERTY_EFFECTIVE_RATING 0xDC97 +#define MTP_PROPERTY_SUBTITLE 0xDC98 +#define MTP_PROPERTY_ORIGINAL_RELEASE_DATE 0xDC99 +#define MTP_PROPERTY_ALBUM_NAME 0xDC9A +#define MTP_PROPERTY_ALBUM_ARTIST 0xDC9B +#define MTP_PROPERTY_MOOD 0xDC9C +#define MTP_PROPERTY_DRM_STATUS 0xDC9D +#define MTP_PROPERTY_SUB_DESCRIPTION 0xDC9E +#define MTP_PROPERTY_IS_CROPPED 0xDCD1 +#define MTP_PROPERTY_IS_COLOUR_CORRECTED 0xDCD2 +#define MTP_PROPERTY_IMAGE_BIT_DEPTH 0xDCD3 +#define MTP_PROPERTY_F_NUMBER 0xDCD4 +#define MTP_PROPERTY_EXPOSURE_TIME 0xDCD5 +#define MTP_PROPERTY_EXPOSURE_INDEX 0xDCD6 +#define MTP_PROPERTY_TOTAL_BITRATE 0xDE91 +#define MTP_PROPERTY_BITRATE_TYPE 0xDE92 +#define MTP_PROPERTY_SAMPLE_RATE 0xDE93 +#define MTP_PROPERTY_NUMBER_OF_CHANNELS 0xDE94 +#define MTP_PROPERTY_AUDIO_BIT_DEPTH 0xDE95 +#define MTP_PROPERTY_SCAN_TYPE 0xDE97 +#define MTP_PROPERTY_AUDIO_WAVE_CODEC 0xDE99 +#define MTP_PROPERTY_AUDIO_BITRATE 0xDE9A +#define MTP_PROPERTY_VIDEO_FOURCC_CODEC 0xDE9B +#define MTP_PROPERTY_VIDEO_BITRATE 0xDE9C +#define MTP_PROPERTY_FRAMES_PER_THOUSAND_SECONDS 0xDE9D +#define MTP_PROPERTY_KEYFRAME_DISTANCE 0xDE9E +#define MTP_PROPERTY_BUFFER_SIZE 0xDE9F +#define MTP_PROPERTY_ENCODING_QUALITY 0xDEA0 +#define MTP_PROPERTY_ENCODING_PROFILE 0xDEA1 +#define MTP_PROPERTY_DISPLAY_NAME 0xDCE0 +#define MTP_PROPERTY_BODY_TEXT 0xDCE1 +#define MTP_PROPERTY_SUBJECT 0xDCE2 +#define MTP_PROPERTY_PRIORITY 0xDCE3 +#define MTP_PROPERTY_GIVEN_NAME 0xDD00 +#define MTP_PROPERTY_MIDDLE_NAMES 0xDD01 +#define MTP_PROPERTY_FAMILY_NAME 0xDD02 +#define MTP_PROPERTY_PREFIX 0xDD03 +#define MTP_PROPERTY_SUFFIX 0xDD04 +#define MTP_PROPERTY_PHONETIC_GIVEN_NAME 0xDD05 +#define MTP_PROPERTY_PHONETIC_FAMILY_NAME 0xDD06 +#define MTP_PROPERTY_EMAIL_PRIMARY 0xDD07 +#define MTP_PROPERTY_EMAIL_PERSONAL_1 0xDD08 +#define MTP_PROPERTY_EMAIL_PERSONAL_2 0xDD09 +#define MTP_PROPERTY_EMAIL_BUSINESS_1 0xDD0A +#define MTP_PROPERTY_EMAIL_BUSINESS_2 0xDD0B +#define MTP_PROPERTY_EMAIL_OTHERS 0xDD0C +#define MTP_PROPERTY_PHONE_NUMBER_PRIMARY 0xDD0D +#define MTP_PROPERTY_PHONE_NUMBER_PERSONAL 0xDD0E +#define MTP_PROPERTY_PHONE_NUMBER_PERSONAL_2 0xDD0F +#define MTP_PROPERTY_PHONE_NUMBER_BUSINESS 0xDD10 +#define MTP_PROPERTY_PHONE_NUMBER_BUSINESS_2 0xDD11 +#define MTP_PROPERTY_PHONE_NUMBER_MOBILE 0xDD12 +#define MTP_PROPERTY_PHONE_NUMBER_MOBILE_2 0xDD13 +#define MTP_PROPERTY_FAX_NUMBER_PRIMARY 0xDD14 +#define MTP_PROPERTY_FAX_NUMBER_PERSONAL 0xDD15 +#define MTP_PROPERTY_FAX_NUMBER_BUSINESS 0xDD16 +#define MTP_PROPERTY_PAGER_NUMBER 0xDD17 +#define MTP_PROPERTY_PHONE_NUMBER_OTHERS 0xDD18 +#define MTP_PROPERTY_PRIMARY_WEB_ADDRESS 0xDD19 +#define MTP_PROPERTY_PERSONAL_WEB_ADDRESS 0xDD1A +#define MTP_PROPERTY_BUSINESS_WEB_ADDRESS 0xDD1B +#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS 0xDD1C +#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_2 0xDD1D +#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_3 0xDD1E +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_FULL 0xDD1F +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_1 0xDD20 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_2 0xDD21 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_CITY 0xDD22 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_REGION 0xDD23 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE 0xDD24 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_COUNTRY 0xDD25 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_FULL 0xDD26 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_1 0xDD27 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_2 0xDD28 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_CITY 0xDD29 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_REGION 0xDD2A +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE 0xDD2B +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_COUNTRY 0xDD2C +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_FULL 0xDD2D +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_1 0xDD2E +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_2 0xDD2F +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_CITY 0xDD30 +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_REGION 0xDD31 +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_POSTAL_CODE 0xDD32 +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_COUNTRY 0xDD33 +#define MTP_PROPERTY_ORGANIZATION_NAME 0xDD34 +#define MTP_PROPERTY_PHONETIC_ORGANIZATION_NAME 0xDD35 +#define MTP_PROPERTY_ROLE 0xDD36 +#define MTP_PROPERTY_BIRTHDATE 0xDD37 +#define MTP_PROPERTY_MESSAGE_TO 0xDD40 +#define MTP_PROPERTY_MESSAGE_CC 0xDD41 +#define MTP_PROPERTY_MESSAGE_BCC 0xDD42 +#define MTP_PROPERTY_MESSAGE_READ 0xDD43 +#define MTP_PROPERTY_MESSAGE_RECEIVED_TIME 0xDD44 +#define MTP_PROPERTY_MESSAGE_SENDER 0xDD45 +#define MTP_PROPERTY_ACTIVITY_BEGIN_TIME 0xDD50 +#define MTP_PROPERTY_ACTIVITY_END_TIME 0xDD51 +#define MTP_PROPERTY_ACTIVITY_LOCATION 0xDD52 +#define MTP_PROPERTY_ACTIVITY_REQUIRED_ATTENDEES 0xDD54 +#define MTP_PROPERTY_ACTIVITY_OPTIONAL_ATTENDEES 0xDD55 +#define MTP_PROPERTY_ACTIVITY_RESOURCES 0xDD56 +#define MTP_PROPERTY_ACTIVITY_ACCEPTED 0xDD57 +#define MTP_PROPERTY_ACTIVITY_TENTATIVE 0xDD58 +#define MTP_PROPERTY_ACTIVITY_DECLINED 0xDD59 +#define MTP_PROPERTY_ACTIVITY_REMAINDER_TIME 0xDD5A +#define MTP_PROPERTY_ACTIVITY_OWNER 0xDD5B +#define MTP_PROPERTY_ACTIVITY_STATUS 0xDD5C +#define MTP_PROPERTY_OWNER 0xDD5D +#define MTP_PROPERTY_EDITOR 0xDD5E +#define MTP_PROPERTY_WEBMASTER 0xDD5F +#define MTP_PROPERTY_URL_SOURCE 0xDD60 +#define MTP_PROPERTY_URL_DESTINATION 0xDD61 +#define MTP_PROPERTY_TIME_BOOKMARK 0xDD62 +#define MTP_PROPERTY_OBJECT_BOOKMARK 0xDD63 +#define MTP_PROPERTY_BYTE_BOOKMARK 0xDD64 +#define MTP_PROPERTY_LAST_BUILD_DATE 0xDD70 +#define MTP_PROPERTY_TIME_TO_LIVE 0xDD71 +#define MTP_PROPERTY_MEDIA_GUID 0xDD72 + +// MTP Device Property Codes +#define MTP_DEVICE_PROPERTY_UNDEFINED 0x5000 +#define MTP_DEVICE_PROPERTY_BATTERY_LEVEL 0x5001 +#define MTP_DEVICE_PROPERTY_FUNCTIONAL_MODE 0x5002 +#define MTP_DEVICE_PROPERTY_IMAGE_SIZE 0x5003 +#define MTP_DEVICE_PROPERTY_COMPRESSION_SETTING 0x5004 +#define MTP_DEVICE_PROPERTY_WHITE_BALANCE 0x5005 +#define MTP_DEVICE_PROPERTY_RGB_GAIN 0x5006 +#define MTP_DEVICE_PROPERTY_F_NUMBER 0x5007 +#define MTP_DEVICE_PROPERTY_FOCAL_LENGTH 0x5008 +#define MTP_DEVICE_PROPERTY_FOCUS_DISTANCE 0x5009 +#define MTP_DEVICE_PROPERTY_FOCUS_MODE 0x500A +#define MTP_DEVICE_PROPERTY_EXPOSURE_METERING_MODE 0x500B +#define MTP_DEVICE_PROPERTY_FLASH_MODE 0x500C +#define MTP_DEVICE_PROPERTY_EXPOSURE_TIME 0x500D +#define MTP_DEVICE_PROPERTY_EXPOSURE_PROGRAM_MODE 0x500E +#define MTP_DEVICE_PROPERTY_EXPOSURE_INDEX 0x500F +#define MTP_DEVICE_PROPERTY_EXPOSURE_BIAS_COMPENSATION 0x5010 +#define MTP_DEVICE_PROPERTY_DATETIME 0x5011 +#define MTP_DEVICE_PROPERTY_CAPTURE_DELAY 0x5012 +#define MTP_DEVICE_PROPERTY_STILL_CAPTURE_MODE 0x5013 +#define MTP_DEVICE_PROPERTY_CONTRAST 0x5014 +#define MTP_DEVICE_PROPERTY_SHARPNESS 0x5015 +#define MTP_DEVICE_PROPERTY_DIGITAL_ZOOM 0x5016 +#define MTP_DEVICE_PROPERTY_EFFECT_MODE 0x5017 +#define MTP_DEVICE_PROPERTY_BURST_NUMBER 0x5018 +#define MTP_DEVICE_PROPERTY_BURST_INTERVAL 0x5019 +#define MTP_DEVICE_PROPERTY_TIMELAPSE_NUMBER 0x501A +#define MTP_DEVICE_PROPERTY_TIMELAPSE_INTERVAL 0x501B +#define MTP_DEVICE_PROPERTY_FOCUS_METERING_MODE 0x501C +#define MTP_DEVICE_PROPERTY_UPLOAD_URL 0x501D +#define MTP_DEVICE_PROPERTY_ARTIST 0x501E +#define MTP_DEVICE_PROPERTY_COPYRIGHT_INFO 0x501F +#define MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER 0xD401 +#define MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME 0xD402 +#define MTP_DEVICE_PROPERTY_VOLUME 0xD403 +#define MTP_DEVICE_PROPERTY_SUPPORTED_FORMATS_ORDERED 0xD404 +#define MTP_DEVICE_PROPERTY_DEVICE_ICON 0xD405 +#define MTP_DEVICE_PROPERTY_PLAYBACK_RATE 0xD410 +#define MTP_DEVICE_PROPERTY_PLAYBACK_OBJECT 0xD411 +#define MTP_DEVICE_PROPERTY_PLAYBACK_CONTAINER_INDEX 0xD412 +#define MTP_DEVICE_PROPERTY_SESSION_INITIATOR_VERSION_INFO 0xD406 +#define MTP_DEVICE_PROPERTY_PERCEIVED_DEVICE_TYPE 0xD407 + +// MTP Operation Codes +#define MTP_OPERATION_GET_DEVICE_INFO 0x1001 +#define MTP_OPERATION_OPEN_SESSION 0x1002 +#define MTP_OPERATION_CLOSE_SESSION 0x1003 +#define MTP_OPERATION_GET_STORAGE_IDS 0x1004 +#define MTP_OPERATION_GET_STORAGE_INFO 0x1005 +#define MTP_OPERATION_GET_NUM_OBJECTS 0x1006 +#define MTP_OPERATION_GET_OBJECT_HANDLES 0x1007 +#define MTP_OPERATION_GET_OBJECT_INFO 0x1008 +#define MTP_OPERATION_GET_OBJECT 0x1009 +#define MTP_OPERATION_GET_THUMB 0x100A +#define MTP_OPERATION_DELETE_OBJECT 0x100B +#define MTP_OPERATION_SEND_OBJECT_INFO 0x100C +#define MTP_OPERATION_SEND_OBJECT 0x100D +#define MTP_OPERATION_INITIATE_CAPTURE 0x100E +#define MTP_OPERATION_FORMAT_STORE 0x100F +#define MTP_OPERATION_RESET_DEVICE 0x1010 +#define MTP_OPERATION_SELF_TEST 0x1011 +#define MTP_OPERATION_SET_OBJECT_PROTECTION 0x1012 +#define MTP_OPERATION_POWER_DOWN 0x1013 +#define MTP_OPERATION_GET_DEVICE_PROP_DESC 0x1014 +#define MTP_OPERATION_GET_DEVICE_PROP_VALUE 0x1015 +#define MTP_OPERATION_SET_DEVICE_PROP_VALUE 0x1016 +#define MTP_OPERATION_RESET_DEVICE_PROP_VALUE 0x1017 +#define MTP_OPERATION_TERMINATE_OPEN_CAPTURE 0x1018 +#define MTP_OPERATION_MOVE_OBJECT 0x1019 +#define MTP_OPERATION_COPY_OBJECT 0x101A +#define MTP_OPERATION_GET_PARTIAL_OBJECT 0x101B +#define MTP_OPERATION_INITIATE_OPEN_CAPTURE 0x101C +#define MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED 0x9801 +#define MTP_OPERATION_GET_OBJECT_PROP_DESC 0x9802 +#define MTP_OPERATION_GET_OBJECT_PROP_VALUE 0x9803 +#define MTP_OPERATION_SET_OBJECT_PROP_VALUE 0x9804 +#define MTP_OPERATION_GET_OBJECT_PROP_LIST 0x9805 +#define MTP_OPERATION_SET_OBJECT_PROP_LIST 0x9806 +#define MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC 0x9807 +#define MTP_OPERATION_SEND_OBJECT_PROP_LIST 0x9808 +#define MTP_OPERATION_GET_OBJECT_REFERENCES 0x9810 +#define MTP_OPERATION_SET_OBJECT_REFERENCES 0x9811 +#define MTP_OPERATION_SKIP 0x9820 + +// Android extensions for direct file IO + +// Same as GetPartialObject, but with 64 bit offset +#define MTP_OPERATION_GET_PARTIAL_OBJECT_64 0x95C1 +// Same as GetPartialObject64, but copying host to device +#define MTP_OPERATION_SEND_PARTIAL_OBJECT 0x95C2 +// Truncates file to 64 bit length +#define MTP_OPERATION_TRUNCATE_OBJECT 0x95C3 +// Must be called before using SendPartialObject and TruncateObject +#define MTP_OPERATION_BEGIN_EDIT_OBJECT 0x95C4 +// Called to commit changes made by SendPartialObject and TruncateObject +#define MTP_OPERATION_END_EDIT_OBJECT 0x95C5 + +// MTP Response Codes +#define MTP_RESPONSE_UNDEFINED 0x2000 +#define MTP_RESPONSE_OK 0x2001 +#define MTP_RESPONSE_GENERAL_ERROR 0x2002 +#define MTP_RESPONSE_SESSION_NOT_OPEN 0x2003 +#define MTP_RESPONSE_INVALID_TRANSACTION_ID 0x2004 +#define MTP_RESPONSE_OPERATION_NOT_SUPPORTED 0x2005 +#define MTP_RESPONSE_PARAMETER_NOT_SUPPORTED 0x2006 +#define MTP_RESPONSE_INCOMPLETE_TRANSFER 0x2007 +#define MTP_RESPONSE_INVALID_STORAGE_ID 0x2008 +#define MTP_RESPONSE_INVALID_OBJECT_HANDLE 0x2009 +#define MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED 0x200A +#define MTP_RESPONSE_INVALID_OBJECT_FORMAT_CODE 0x200B +#define MTP_RESPONSE_STORAGE_FULL 0x200C +#define MTP_RESPONSE_OBJECT_WRITE_PROTECTED 0x200D +#define MTP_RESPONSE_STORE_READ_ONLY 0x200E +#define MTP_RESPONSE_ACCESS_DENIED 0x200F +#define MTP_RESPONSE_NO_THUMBNAIL_PRESENT 0x2010 +#define MTP_RESPONSE_SELF_TEST_FAILED 0x2011 +#define MTP_RESPONSE_PARTIAL_DELETION 0x2012 +#define MTP_RESPONSE_STORE_NOT_AVAILABLE 0x2013 +#define MTP_RESPONSE_SPECIFICATION_BY_FORMAT_UNSUPPORTED 0x2014 +#define MTP_RESPONSE_NO_VALID_OBJECT_INFO 0x2015 +#define MTP_RESPONSE_INVALID_CODE_FORMAT 0x2016 +#define MTP_RESPONSE_UNKNOWN_VENDOR_CODE 0x2017 +#define MTP_RESPONSE_CAPTURE_ALREADY_TERMINATED 0x2018 +#define MTP_RESPONSE_DEVICE_BUSY 0x2019 +#define MTP_RESPONSE_INVALID_PARENT_OBJECT 0x201A +#define MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT 0x201B +#define MTP_RESPONSE_INVALID_DEVICE_PROP_VALUE 0x201C +#define MTP_RESPONSE_INVALID_PARAMETER 0x201D +#define MTP_RESPONSE_SESSION_ALREADY_OPEN 0x201E +#define MTP_RESPONSE_TRANSACTION_CANCELLED 0x201F +#define MTP_RESPONSE_SPECIFICATION_OF_DESTINATION_UNSUPPORTED 0x2020 +#define MTP_RESPONSE_INVALID_OBJECT_PROP_CODE 0xA801 +#define MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT 0xA802 +#define MTP_RESPONSE_INVALID_OBJECT_PROP_VALUE 0xA803 +#define MTP_RESPONSE_INVALID_OBJECT_REFERENCE 0xA804 +#define MTP_RESPONSE_GROUP_NOT_SUPPORTED 0xA805 +#define MTP_RESPONSE_INVALID_DATASET 0xA806 +#define MTP_RESPONSE_SPECIFICATION_BY_GROUP_UNSUPPORTED 0xA807 +#define MTP_RESPONSE_SPECIFICATION_BY_DEPTH_UNSUPPORTED 0xA808 +#define MTP_RESPONSE_OBJECT_TOO_LARGE 0xA809 +#define MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED 0xA80A +#define MTP_RESPONSE_NO_RESPONSE 0xFFFF + +// MTP Event Codes +#define MTP_EVENT_UNDEFINED 0x4000 +#define MTP_EVENT_CANCEL_TRANSACTION 0x4001 +#define MTP_EVENT_OBJECT_ADDED 0x4002 +#define MTP_EVENT_OBJECT_REMOVED 0x4003 +#define MTP_EVENT_STORE_ADDED 0x4004 +#define MTP_EVENT_STORE_REMOVED 0x4005 +#define MTP_EVENT_DEVICE_PROP_CHANGED 0x4006 +#define MTP_EVENT_OBJECT_INFO_CHANGED 0x4007 +#define MTP_EVENT_DEVICE_INFO_CHANGED 0x4008 +#define MTP_EVENT_REQUEST_OBJECT_TRANSFER 0x4009 +#define MTP_EVENT_STORE_FULL 0x400A +#define MTP_EVENT_DEVICE_RESET 0x400B +#define MTP_EVENT_STORAGE_INFO_CHANGED 0x400C +#define MTP_EVENT_CAPTURE_COMPLETE 0x400D +#define MTP_EVENT_UNREPORTED_STATUS 0x400E +#define MTP_EVENT_OBJECT_PROP_CHANGED 0xC801 +#define MTP_EVENT_OBJECT_PROP_DESC_CHANGED 0xC802 +#define MTP_EVENT_OBJECT_REFERENCES_CHANGED 0xC803 + +// Storage Type +#define MTP_STORAGE_FIXED_ROM 0x0001 +#define MTP_STORAGE_REMOVABLE_ROM 0x0002 +#define MTP_STORAGE_FIXED_RAM 0x0003 +#define MTP_STORAGE_REMOVABLE_RAM 0x0004 + +// Storage File System +#define MTP_STORAGE_FILESYSTEM_FLAT 0x0001 +#define MTP_STORAGE_FILESYSTEM_HIERARCHICAL 0x0002 +#define MTP_STORAGE_FILESYSTEM_DCF 0x0003 + +// Storage Access Capability +#define MTP_STORAGE_READ_WRITE 0x0000 +#define MTP_STORAGE_READ_ONLY_WITHOUT_DELETE 0x0001 +#define MTP_STORAGE_READ_ONLY_WITH_DELETE 0x0002 + +// Association Type +#define MTP_ASSOCIATION_TYPE_UNDEFINED 0x0000 +#define MTP_ASSOCIATION_TYPE_GENERIC_FOLDER 0x0001 + +// MTP class reqeusts +#define MTP_REQUEST_CANCEL 0x64 +#define MTP_REQUEST_GET_EXT_EVENT_DATA 0x65 +#define MTP_REQUEST_RESET 0x66 +#define MTP_REQUEST_GET_DEVICE_STATUS 0x67 +// clang-format on + +/* MTP reading only or reading/writing */ +#define MTP_PROP_GET 0x00U +#define MTP_PROP_GET_SET 0x01U + +#define USB_MTP_CLASS 0x06 + +#define USB_MTP_SUB_CLASS 0x01U +#define USB_MTP_PROTOCOL 0x01U + +struct mtp_header { + uint32_t conlen; + uint16_t contype; + uint16_t code; + uint32_t trans_id; + uint32_t param[]; +}; + +struct mtp_string { + uint8_t len; + uint16_t string[255]; +}; + +struct mtp_device_info { + uint16_t StandardVersion; + uint32_t VendorExtensionID; + uint16_t VendorExtensionVersion; + uint8_t VendorExtensionDesc_len; + uint16_t VendorExtensionDesc[255]; + uint16_t FunctionalMode; + uint32_t OperationsSupported_len; + uint16_t OperationsSupported[255]; + uint32_t EventsSupported_len; + uint16_t EventsSupported[255]; + uint32_t DevicePropertiesSupported_len; + uint16_t DevicePropertiesSupported[255]; + uint32_t CaptureFormats_len; + uint16_t CaptureFormats[255]; + uint32_t ImageFormats_len; + uint16_t ImageFormats[255]; + uint8_t Manufacturer_len; + uint16_t Manufacturer[255]; + uint8_t Model_len; + uint16_t Model[255]; + uint8_t DeviceVersion_len; + uint16_t DeviceVersion[255]; + uint8_t SerialNumber_len; + uint16_t SerialNumber[255]; +} __PACKED; + +struct mtp_object_props_support { + uint32_t ObjectPropCode_len; + uint16_t ObjectPropCode[255]; +} __PACKED; + +struct mtp_device_prop_desc { + uint16_t DevicePropertyCode; + uint16_t DataType; + uint8_t GetSet; + uint16_t DefaultValue[1]; + uint16_t CurrentValue[1]; + uint8_t FormFlag; +} __PACKED; + +struct mtp_storage_id { + uint32_t StorageIDS_len; + uint32_t StorageIDS[255]; +} __PACKED; + +struct mtp_storage_info { + uint16_t StorageType; + uint16_t FilesystemType; + uint16_t AccessCapability; + uint64_t MaxCapability; + uint64_t FreeSpaceInBytes; + uint32_t FreeSpaceInObjects; + uint8_t StorageDescription_len; + uint8_t StorageDescription[255]; + uint8_t VolumeIdentifier_len; + uint8_t VolumeIdentifier[255]; +} __PACKED; + +struct mtp_object_handles { + uint32_t ObjectHandle_len; + uint32_t ObjectHandle[255]; +} __PACKED; + +struct mtp_object_prop_desc { + uint16_t ObjectPropertyCode; + uint16_t DataType; + uint8_t GetSet; + uint8_t DefValue[16]; + uint32_t GroupCode; + uint8_t FormFlag; +} __PACKED; + +struct mtp_object_prop_element { + uint32_t ObjectHandle; + uint16_t PropertyCode; + uint16_t Datatype; + uint8_t value[8]; +} __PACKED; + +struct mtp_object_prop_list { + uint32_t element_len; + struct mtp_object_prop_element element[1]; +} __PACKED; + +struct mtp_object_info { + uint32_t StorageId; + uint16_t ObjectFormat; + uint16_t ProtectionStatus; + uint32_t ObjectCompressedSize; + uint16_t ThumbFormat; + uint32_t ThumbCompressedSize; + uint32_t ThumbPixWidth; + uint32_t ThumbPixHeight; + uint32_t ImagePixWidth; + uint32_t ImagePixHeight; + uint32_t ImageBitDepth; + uint32_t ParentObject; + uint16_t AssociationType; + uint32_t AssociationDesc; + uint32_t SequenceNumber; + uint8_t Filename_len; + uint16_t Filename[0]; + // uint8_t CaptureDate[6]; + // uint8_t ModificationDate[6]; +} __PACKED; + +/*Length of template descriptor: 30 bytes*/ +#define MTP_DESCRIPTOR_LEN (9 + 7 + 7 + 7) + +// clang-format off +#define MTP_DESCRIPTOR_INIT(bFirstInterface, out_ep, in_ep, int_ep, wMaxPacketSize, str_idx) \ + /* Interface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x03, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_IMAGE, /* bInterfaceClass */ \ + USB_MTP_SUB_CLASS, /* bInterfaceSubClass */ \ + USB_MTP_PROTOCOL, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + int_ep, /* bEndpointAddress */ \ + 0x03, /* bmAttributes */ \ + WBVAL(0x1c), /* wMaxPacketSize */ \ + 0x0A /* bInterval */ +// clang-format on + +#endif diff --git a/src/driver/usb/mtp/usbd_mtp.c b/src/driver/usb/mtp/usbd_mtp.c new file mode 100644 index 000000000..7e0da215b --- /dev/null +++ b/src/driver/usb/mtp/usbd_mtp.c @@ -0,0 +1,1711 @@ +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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. + *****************************************************************************/ + +#include "usbd_core.h" +#include "driver/usb/mtp/usbd_mtp.h" +#include "driver/usb/mtp/usbd_mtp_support.h" +#include "driver/usb/mtp/usbd_mtp_device_info.h" +#include "usb_osal.h" +#include "driver/usb/mtp/usbd_mtp_file.h" +#include "driver/usb/mtp/usbd_mtp_object.h" + +#include +#if defined(KERNEL_RTTHREAD) +#include +#include +#include +#include +#include +#endif +/* Max USB packet size */ +#ifndef CONFIG_USB_HS +#define MTP_BULK_EP_MPS 64 +#else +#define MTP_BULK_EP_MPS 512 +#endif +#define DATA_BUFFER_SIZE CONFIG_USBDEV_MTP_MAX_BUFSIZE +#define MAX_WITTE_FILE_SIZE CONFIG_USBDEV_MTP_MAX_BUFSIZE +#define MTP_OUT_EP_IDX 0 +#define MTP_IN_EP_IDX 1 +#define MTP_INT_EP_IDX 2 + +#define MTP_THREAD_EVENT_SEND 0x100 +#define MTP_EVENT_Q_SIZE 8 + +/* MTP Stage */ +enum Stage { + MTP_READ_COMMAND = 0, + MTP_DATA_OUT = 1, + MTP_DATA_IN = 2, + MTP_SEND_RESPONSE = 3, + MTP_WAIT_RESPONSE = 4, +}; + +/* Compatibility structure wrappers for unified mtp_header */ +struct mtp_container_command { + uint32_t conlen; + uint16_t contype; + uint16_t code; + uint32_t trans_id; + uint32_t param1; + uint32_t param2; + uint32_t param3; + uint32_t param4; + uint32_t param5; +}; + +struct mtp_container_data { + uint32_t conlen; + uint16_t contype; + uint16_t code; + uint32_t trans_id; + uint8_t data[CONFIG_USBDEV_MTP_MAX_BUFSIZE - MTP_CONTAINER_HEADER_SIZE]; +}; + +struct mtp_container_response { + uint32_t conlen; + uint16_t contype; + uint16_t code; + uint32_t trans_id; + uint32_t param1; + uint32_t param2; + uint32_t param3; + uint32_t param4; + uint32_t param5; +}; + +/* Macro wrappers for backward compatibility + Use pointer-style macros to avoid accidental expansion inside + expressions like "g_usbd_mtp.con_command" which the preprocessor + would replace. Code should use the following macros as pointers, + e.g. USBD_MTP_CON_COMMAND->param1, (uint8_t *)USBD_MTP_CON_DATA, etc. +*/ +#define USBD_MTP_CON_COMMAND ((struct mtp_container_command *)&g_usbd_mtp.header) +#define USBD_MTP_CON_RESPONSE ((struct mtp_container_response *)&g_usbd_mtp.header) +#define USBD_MTP_CON_DATA ((struct mtp_container_data *)&g_usbd_mtp.header) + +USB_NOCACHE_RAM_SECTION struct usbd_mtp_priv { + USB_MEM_ALIGNX struct mtp_header header; + USB_MEM_ALIGNX uint8_t payload[CONFIG_USBDEV_MTP_MAX_BUFSIZE - MTP_CONTAINER_HEADER_SIZE]; + enum Stage stage; + uint8_t session_state; + uint32_t response_code; + /*-----priv-----*/ + char path[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + mtp_object_manager_t obj_manager; // object manager + USB_MEM_ALIGNX uint8_t usbd_mtp_data_in[CONFIG_USBDEV_MTP_MAX_BUFSIZE]; + USB_MEM_ALIGNX uint8_t usbd_mtp_data_out[CONFIG_USBDEV_MTP_MAX_BUFSIZE]; + uint32_t usbd_mtp_rcnt; + uint32_t usbd_mtp_wcnt; + struct mtp_file mtp_file_in; // file data + struct mtp_file mtp_file_out; +#if defined(CONFIG_USBDEV_MTP_THREAD) + usb_osal_mq_t usbd_mtp_mq; + usb_osal_thread_t usbd_mtp_thread; + uint32_t nbytes; +#endif + uint8_t busid; + /* async event queue */ + struct { + uint16_t code; + uint32_t p1; + uint32_t p2; + uint32_t p3; + } event_q[MTP_EVENT_Q_SIZE]; + uint8_t ev_q_head; + uint8_t ev_q_tail; + usb_osal_mutex_t ev_mutex; + uint8_t int_busy; /* INT transfer in progress */ + USB_MEM_ALIGNX uint8_t event_buf[MTP_CONTAINER_HEADER_SIZE + 12]; /* 3 params */ +} g_usbd_mtp; + + +/* Describe EndPoints configuration */ +static struct usbd_endpoint mtp_ep_data[3]; + +static int mtp_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USB_LOG_DBG("MTP Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + switch (setup->bRequest) { + case MTP_REQUEST_CANCEL: + break; + case MTP_REQUEST_GET_EXT_EVENT_DATA: + break; + case MTP_REQUEST_RESET: + break; + case MTP_REQUEST_GET_DEVICE_STATUS: + *(uint16_t *)(*data) = 0x08; //len + *(uint16_t *)(*data + 2) = MTP_RESPONSE_OK; // resepone + *len = 8; + break; + + default: + USB_LOG_WRN("Unhandled MTP Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + return 0; +} + + +/* Rebuild full path from handle */ +static inline int usbd_mtp_rebuild_path(uint32_t handle, char *full_path, size_t max_len) +{ + return mtp_rebuild_full_path(&g_usbd_mtp.obj_manager, handle, full_path, max_len); +} + + +/* Delete object by handle. If it's a directory, all children will be deleted too. */ +static int usbd_mtp_unlink_object_by_handle(uint32_t handle) +{ + if (handle == 0) { + return -1; + } + + return mtp_free_handle_recursive(&g_usbd_mtp.obj_manager, handle, + usbd_mtp_unlink, usbd_mtp_rmdir_recursive); //usbd_mtp_rmdir +} + +static void usbd_mtp_send_response_param(uint32_t code, uint32_t param1, + uint32_t param2, uint32_t param3, + uint32_t param4, uint32_t param5) +{ + USB_LOG_DBG("Send response\r\n"); + USB_LOG_DBG("Response params: code=0x%08lx p1=0x%08lx p2=0x%08lx p3=0x%08lx\r\n", + code, param1, param2, param3); + g_usbd_mtp.stage = MTP_WAIT_RESPONSE; + + USBD_MTP_CON_RESPONSE->conlen = 32; + USBD_MTP_CON_RESPONSE->contype = MTP_CONTAINER_TYPE_RESPONSE; + USBD_MTP_CON_RESPONSE->code = code; + USBD_MTP_CON_RESPONSE->trans_id = USBD_MTP_CON_COMMAND->trans_id; + USBD_MTP_CON_RESPONSE->param1 = (uint32_t)param1; + USBD_MTP_CON_RESPONSE->param2 = (uint32_t)param2; + USBD_MTP_CON_RESPONSE->param3 = (uint32_t)param3; + USBD_MTP_CON_RESPONSE->param4 = (uint32_t)param4; + USBD_MTP_CON_RESPONSE->param5 = (uint32_t)param5; + + usbd_ep_start_write(g_usbd_mtp.busid, mtp_ep_data[MTP_IN_EP_IDX].ep_addr, (uint8_t *)USBD_MTP_CON_RESPONSE, 32); + + USB_LOG_DBG("Started IN write of response, len=32\r\n"); +} + +static void usbd_mtp_send_response(uint32_t code) +{ + USB_LOG_DBG("Send response\r\n"); + + g_usbd_mtp.stage = MTP_WAIT_RESPONSE; + + USBD_MTP_CON_RESPONSE->conlen = MTP_CONTAINER_HEADER_SIZE; + USBD_MTP_CON_RESPONSE->contype = MTP_CONTAINER_TYPE_RESPONSE; + USBD_MTP_CON_RESPONSE->code = code; + USBD_MTP_CON_RESPONSE->trans_id = USBD_MTP_CON_COMMAND->trans_id; + + usbd_ep_start_write(g_usbd_mtp.busid, mtp_ep_data[MTP_IN_EP_IDX].ep_addr, + (uint8_t *)USBD_MTP_CON_RESPONSE, + MTP_CONTAINER_HEADER_SIZE); +} + +static void usbd_mtp_send_info(uint8_t *data, uint32_t len) +{ + USB_LOG_DBG("Send info\r\n"); + + g_usbd_mtp.stage = MTP_SEND_RESPONSE; + + USBD_MTP_CON_DATA->conlen = MTP_CONTAINER_HEADER_SIZE + len; + USBD_MTP_CON_DATA->contype = MTP_CONTAINER_TYPE_DATA; + USBD_MTP_CON_DATA->code = MTP_RESPONSE_OK; + USBD_MTP_CON_DATA->trans_id = USBD_MTP_CON_COMMAND->trans_id; + + memcpy(USBD_MTP_CON_DATA->data, data, len); + usbd_ep_start_write(g_usbd_mtp.busid, mtp_ep_data[MTP_IN_EP_IDX].ep_addr, + (uint8_t *)USBD_MTP_CON_DATA, + MTP_CONTAINER_HEADER_SIZE + len); +} + +/* Dequeue and start sending next event. Caller MUST hold ev_mutex. */ +static void usbd_mtp_event_send_queued_locked(void) +{ + if (!g_usbd_mtp.int_busy && g_usbd_mtp.ev_q_head != g_usbd_mtp.ev_q_tail) { + uint8_t *p = g_usbd_mtp.event_buf; + uint16_t code = g_usbd_mtp.event_q[g_usbd_mtp.ev_q_tail].code; + uint32_t p1 = g_usbd_mtp.event_q[g_usbd_mtp.ev_q_tail].p1; + uint32_t p2 = g_usbd_mtp.event_q[g_usbd_mtp.ev_q_tail].p2; + uint32_t p3 = g_usbd_mtp.event_q[g_usbd_mtp.ev_q_tail].p3; + g_usbd_mtp.ev_q_tail = (uint8_t)((g_usbd_mtp.ev_q_tail + 1) % MTP_EVENT_Q_SIZE); + + PUT_U32_AT(p, (uint32_t)(MTP_CONTAINER_HEADER_SIZE + 12)); // container length + PUT_U16_AT(p, MTP_CONTAINER_TYPE_EVENT); // container type + PUT_U16_AT(p, code); // event code + PUT_U32_AT(p, 0U); // transaction ID = 0 for events + PUT_U32_AT(p, p1); // parameter 1 + PUT_U32_AT(p, p2); // parameter 2 + PUT_U32_AT(p, p3); // parameter 3 + + g_usbd_mtp.int_busy = 1; + usbd_ep_start_write(g_usbd_mtp.busid, mtp_ep_data[MTP_INT_EP_IDX].ep_addr, g_usbd_mtp.event_buf, MTP_CONTAINER_HEADER_SIZE + 12); + } +} + +/* Enqueue an event (thread-safe). If a worker thread exists it will be notified, + otherwise attempt to send immediately while holding the mutex. */ +static void usbd_mtp_event_enqueue(uint16_t code, uint32_t p1, uint32_t p2, uint32_t p3) +{ + if (g_usbd_mtp.ev_mutex) { + usb_osal_mutex_take(g_usbd_mtp.ev_mutex); + g_usbd_mtp.event_q[g_usbd_mtp.ev_q_head].code = code; + g_usbd_mtp.event_q[g_usbd_mtp.ev_q_head].p1 = p1; + g_usbd_mtp.event_q[g_usbd_mtp.ev_q_head].p2 = p2; + g_usbd_mtp.event_q[g_usbd_mtp.ev_q_head].p3 = p3; + g_usbd_mtp.ev_q_head = (uint8_t)((g_usbd_mtp.ev_q_head + 1) % MTP_EVENT_Q_SIZE); + + if (g_usbd_mtp.usbd_mtp_mq) { + /* notify worker to process queued events */ + usb_osal_mq_send(g_usbd_mtp.usbd_mtp_mq, (uintptr_t)MTP_THREAD_EVENT_SEND); + } else { + /* no worker: try to send right away while holding mutex */ + usbd_mtp_event_send_queued_locked(); + } + usb_osal_mutex_give(g_usbd_mtp.ev_mutex); + } +} + + +static void usbd_mtp_get_device_info(void) +{ + /* + * Optimized DeviceInfo payload builder for minimal RAM usage. + * Writes directly into USBD_MTP_CON_DATA->data to avoid large + * temporary buffer allocation on stack. + */ + uint8_t *p = USBD_MTP_CON_DATA->data; + uint32_t i, j, cnt; + + /* StandardVersion (uint16) */ + PUT_U16_AT(p, MTP_STANDARD_VERSION); + + /* VendorExtensionID (uint32) */ + PUT_U32_AT(p, 0x06); + + /* VendorExtensionVersion (uint16) */ + PUT_U16_AT(p, 100); + + /* VendorExtensionDesc: mtp_string format (uint8 len, then uint16 chars) */ + i = (uint16_t)(sizeof(VendExtDesc) / sizeof(uint16_t)); + PUT_U8_AT(p, i); + for (j = 0; j < i; j++) { + PUT_U16_AT(p, VendExtDesc[j]); + } + + /* FunctionalMode (uint16) */ + PUT_U16_AT(p, 0x0000); + + /* OperationsSupported: write uint32 length then uint16 elements */ + i = (uint32_t)(sizeof(supported_op) / sizeof(uint16_t)); + PUT_U32_AT(p, i); + for (j = 0; j < i; j++) { + PUT_U16_AT(p, supported_op[j]); + } + + /* EventsSupported */ + i = (uint32_t)(sizeof(supported_event) / sizeof(uint16_t)); + PUT_U32_AT(p, i); + for (j = 0; j < i; j++) { + PUT_U16_AT(p, supported_event[j]); + } + + /* DevicePropertiesSupported: iterate until prop_code == 0xFFFF */ + cnt = 0; + for (j = 0; j < 255; j++) { + if (support_device_properties[j].prop_code == 0xFFFFU) + break; + cnt++; + } + PUT_U32_AT(p, cnt); + for (j = 0; j < cnt; j++) { + PUT_U16_AT(p, support_device_properties[j].prop_code); + } + + /* CaptureFormats: iterate until format_code == 0xFFFF */ + cnt = 0; + for (j = 0; j < 255; j++) { + if (support_format_properties[j].format_code == 0xFFFFU) + break; + cnt++; + } + PUT_U32_AT(p, cnt); + for (j = 0; j < cnt; j++) { + PUT_U16_AT(p, support_format_properties[j].format_code); + } + + /* PlaybackFormats: fixed length defined by config */ + cnt = 0; + for (j = 0; j < 255; j++) { + if (support_format_properties[j].format_code == 0xFFFFU) + break; + cnt++; + } + PUT_U32_AT(p, cnt); + for (j = 0; j < cnt; j++) { + PUT_U16_AT(p, support_format_properties[j].format_code); + } + + /* Manufacturer (mtp_string) */ + PUT_STRING_AT(p, Manuf, sizeof(Manuf)/sizeof(uint16_t)); + /* Model */ + PUT_STRING_AT(p, Model, sizeof(Model)/sizeof(uint16_t)); + /* DeviceVersion */ + PUT_STRING_AT(p, DeviceVers, sizeof(DeviceVers)/sizeof(uint16_t)); + /* SerialNumber */ + PUT_STRING_AT(p, SerialNbr, sizeof(SerialNbr)/sizeof(uint16_t)); + + /* Send info with calculated payload length */ + usbd_mtp_send_info(USBD_MTP_CON_DATA->data, (uint32_t)(p - USBD_MTP_CON_DATA->data)); +} + +static void usbd_mtp_open_session(void) +{ + g_usbd_mtp.session_state = 1; + usbd_mtp_send_response(MTP_RESPONSE_OK); +} + +static void usbd_mtp_get_storage_ids(void) +{ + /* FIXME: Build storage ID list */ + uint8_t *p = USBD_MTP_CON_DATA->data; + + PUT_U32_AT(p, MTP_STORAGE_IDS); + PUT_U32_AT(p, MTP_STORAGE_ID); + + usbd_mtp_send_info(USBD_MTP_CON_DATA->data, (uint32_t)(p - USBD_MTP_CON_DATA->data)); +} + +static void usbd_mtp_get_storage_info(void) +{ + uint8_t *p = USBD_MTP_CON_DATA->data; + const char *storage_desc = "SD Card"; + const char *volume_identifier = "SD Card1"; + + struct mtp_statfs stfs; + + if (usbd_mtp_statfs(usbd_mtp_fs_root_path(), &stfs)) + USB_LOG_ERR("Failed to get storage info \r\n"); + + PUT_U16_AT(p, MTP_STORAGE_REMOVABLE_RAM); + PUT_U16_AT(p, MTP_STORAGE_FILESYSTEM_FLAT); + PUT_U16_AT(p, MTP_STORAGE_READ_WRITE); + PUT_U64_AT(p, (uint64_t)stfs.f_blocks * (uint64_t)stfs.f_bsize); + PUT_U64_AT(p, (uint64_t)stfs.f_bfree * (uint64_t)stfs.f_bsize); + PUT_U32_AT(p, 0xFFFFFFFFU); + /* StorageDescription - MTP string format (uint8 len, then uint16 chars) */ + PUT_STRING_AT(p, storage_desc, strlen(storage_desc)+1); + /* VolumeLabel - MTP string format (uint8 len, then uint16 chars) */ + PUT_STRING_AT(p, volume_identifier, strlen(volume_identifier)+1); + + usbd_mtp_send_info(USBD_MTP_CON_DATA->data, (uint32_t)(p - USBD_MTP_CON_DATA->data)); +} + +uint16_t _get_format_by_name(char *file_name) +{ + uint32_t objformat; + char file_ext[5]; + + memset(file_ext, 0, sizeof(file_ext)); + + char* ext = strrchr(file_name, '.'); + + /* Get file type */ + if (ext != 0U && (strlen(ext + 1) <= 5)) { + strcpy(file_ext, (ext + 1)); + } else { + objformat = MTP_FORMAT_UNDEFINED; + return objformat; + } + + if ((strcmp(file_ext, "TXT") == 0) || (strcmp(file_ext, "txt") == 0)) { + objformat = MTP_FORMAT_TEXT; + } else if ((strcmp(file_ext, "JPG") == 0) || (strcmp(file_ext, "jpg") == 0)) { + objformat = MTP_FORMAT_EXIF_JPEG; + } else if ((strcmp(file_ext, "BMP") == 0) || (strcmp(file_ext, "bmp") == 0)) { + objformat = MTP_FORMAT_BMP; + } else if ((strcmp(file_ext, "PNG") == 0) || (strcmp(file_ext, "png") == 0)) { + objformat = MTP_FORMAT_PNG; + } else if ((strcmp(file_ext, "MP4") == 0) || (strcmp(file_ext, "mp4") == 0)) { + objformat = MTP_FORMAT_MP4_CONTAINER; + } else if ((strcmp(file_ext, "WAV") == 0) || (strcmp(file_ext, "wav") == 0)) { + objformat = MTP_FORMAT_WAV; + } else if ((strcmp(file_ext, "PDF") == 0) || (strcmp(file_ext, "pdf") == 0)) { + objformat = MTP_FORMAT_UNDEFINED; + } else { + objformat = MTP_FORMAT_UNDEFINED; + } + + /* Return object format */ + return objformat; +} + +void _string_to_unicode(void *dest, void *src, int len) +{ + uint16_t *dest_str = (uint16_t *)dest; + uint8_t *src_str = (uint8_t *)src; + + for (int i = 0; i < len; i++) { + *dest_str = (uint16_t)*src_str; + dest_str++; + src_str++; + } +} + +/* Convert UTF-8 string to UTF-16LE + * src: UTF-8 string + * dest: UTF-16LE output buffer (uint16_t array) + * dest_max_words: output buffer size (UTF-16 words) + * Return: number of UTF-16 characters (excluding null terminator) + */ +static int utf8_to_utf16le(const char *src, uint16_t *dest, int dest_max_words) +{ + if (!src || !dest || dest_max_words <= 0) return 0; + + int dest_idx = 0; + int src_idx = 0; + + while (src[src_idx] != '\0' && dest_idx < dest_max_words - 1) { + uint32_t ch = 0; + int bytes_read = 0; + + uint8_t c = (uint8_t)src[src_idx]; + + if (c < 0x80) { + /* ASCII: 1 byte */ + ch = c; + bytes_read = 1; + } else if ((c & 0xE0) == 0xC0) { + /* 2 byte UTF-8: 110xxxxx 10xxxxxx */ + if (src[src_idx + 1] == '\0') break; + ch = ((c & 0x1F) << 6) | (src[src_idx + 1] & 0x3F); + bytes_read = 2; + } else if ((c & 0xF0) == 0xE0) { + /* 3 byte UTF-8: 1110xxxx 10xxxxxx 10xxxxxx */ + if (src[src_idx + 1] == '\0' || src[src_idx + 2] == '\0') break; + ch = ((c & 0x0F) << 12) | ((src[src_idx + 1] & 0x3F) << 6) | (src[src_idx + 2] & 0x3F); + bytes_read = 3; + } else { + /* skip invalid byte */ + src_idx++; + continue; + } + + /* Write UTF-16LE character to destination */ + dest[dest_idx++] = (uint16_t)ch; + src_idx += bytes_read; + } + + dest[dest_idx] = 0; /* null terminator */ + return dest_idx; +} + +/* Convert UTF-16LE to UTF-8 + * src: UTF-16LE string (uint16_t array) + * len: UTF-16 character count (not byte count) + * dest: UTF-8 output buffer + * dest_size: output buffer size (bytes) + * return: length of converted UTF-8 string (excluding null terminator) + */ +static int utf16le_to_utf8(char *dest, const uint16_t *src, int len, int dest_size) +{ + if (!dest || !src || dest_size <= 0) return -1; + + int dest_idx = 0; + int src_idx = 0; + + while (src_idx < len && dest_idx < dest_size - 1) { + uint16_t ch = src[src_idx++]; + + if (ch < 0x80) { + /* ASCII: 1 byte UTF-8 */ + if (dest_idx + 1 >= dest_size) break; + dest[dest_idx++] = (char)ch; + } else if (ch < 0x800) { + /* 2 byte UTF-8: 110xxxxx 10xxxxxx */ + if (dest_idx + 2 >= dest_size) break; + dest[dest_idx++] = (char)(0xC0 | (ch >> 6)); + dest[dest_idx++] = (char)(0x80 | (ch & 0x3F)); + } else { + /* 3 byte UTF-8: 1110xxxx 10xxxxxx 10xxxxxx */ + /* Note: This simplifies the processing, not handling the proxy pair (U+D800~U+DFFF) */ + if (dest_idx + 3 >= dest_size) break; + dest[dest_idx++] = (char)(0xE0 | (ch >> 12)); + dest[dest_idx++] = (char)(0x80 | ((ch >> 6) & 0x3F)); + dest[dest_idx++] = (char)(0x80 | (ch & 0x3F)); + } + } + + dest[dest_idx] = '\0'; + return dest_idx; +} + +void _unicode_to_string(void *dest, void *src, int len) +{ + uint16_t *src_str = (uint16_t *)src; + utf16le_to_utf8((char *)dest, src_str, len, CONFIG_USBDEV_MTP_MAX_PATHNAME); +} + +/* Convert UTF-8 string to UTF-16LE and write to MTP buffer + * buf_ptr: pointer to buffer pointer (will be updated) + * utf8_str: UTF-8 source string + */ +static void put_utf8_as_utf16(uint8_t **buf_ptr, const char *utf8_str, + uint8_t *buf_start, size_t buf_size) +{ + /* calculate UTF-16LE length */ + int utf16_len = 0; + const char *src = utf8_str; + while (*src != '\0') { + int bytes_read = 0; + uint8_t c = (uint8_t)*src; + + if (c < 0x80) { + bytes_read = 1; + } else if ((c & 0xE0) == 0xC0) { + if (src[1] == '\0') break; + bytes_read = 2; + } else if ((c & 0xF0) == 0xE0) { + if (src[1] == '\0' || src[2] == '\0') break; + bytes_read = 3; + } else { + src++; + continue; + } + src += bytes_read; + utf16_len++; + } + + /* calculate used size */ + size_t used_size = (*buf_ptr) - buf_start; + + /* check if there is enough space to write length field (1 byte) */ + if (used_size + 1 > buf_size) { + USB_LOG_ERR("Buffer overflow at length field in put_utf8_as_utf16\n"); + return; + } + + PUT_U8_AT((*buf_ptr), utf16_len + 1); /* length (including null terminator) */ + used_size += 1; + + /* re-traverse, convert and write */ + src = utf8_str; + while (*src != '\0') { + uint32_t ch; + int bytes_read = 0; + uint8_t c = (uint8_t)*src; + + if (c < 0x80) { + ch = c; + bytes_read = 1; + } else if ((c & 0xE0) == 0xC0) { + if (src[1] == '\0') break; + ch = ((c & 0x1F) << 6) | (src[1] & 0x3F); + bytes_read = 2; + } else if ((c & 0xF0) == 0xE0) { + if (src[1] == '\0' || src[2] == '\0') break; + ch = ((c & 0x0F) << 12) | ((src[1] & 0x3F) << 6) | (src[2] & 0x3F); + bytes_read = 3; + } else { + src++; + continue; + } + + /* check if there is enough space to write uint16_t (2 bytes) */ + if (used_size + 2 > buf_size) { + USB_LOG_ERR("Buffer overflow at data field in put_utf8_as_utf16\n"); + return; + } + + PUT_U16_AT((*buf_ptr), (uint16_t)ch); + used_size += 2; + src += bytes_read; + } + + /* check if there is enough space to write null terminator (2 bytes) */ + if (used_size + 2 > buf_size) { + USB_LOG_ERR("Buffer overflow at null terminator in put_utf8_as_utf16\n"); + return; + } + + PUT_U16_AT((*buf_ptr), 0); /* null terminator */ +} + +static int mtp_object_handles_list(struct mtp_object_handle *object_handle, + uint32_t parent_handle, const char *pathname) +{ + uint32_t i = 0, size = 0, protection_status; + char *path = (char*)pathname; + char fullpath[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + void *dir = NULL; + MTP_DIRENT *dirent = NULL; + uint8_t file_name_len; + struct stat statbuf; + int ret = 0; + + dir = usbd_mtp_opendir(pathname); + if (dir == NULL) { + USB_LOG_DBG("Failed to open %s\r\n", pathname); + return -1; + } + + USB_LOG_DBG("[MTP_ENUM] opendir success for %s, starting enumeration\r\n", pathname); + + int idx = 0; + int empty_dir = 1; + while ((dirent = usbd_mtp_readdir_raw(dir)) != NULL) { + empty_dir = 0; + /* Get file information */ + memset(fullpath, 0, sizeof(fullpath)); + strcpy(fullpath, path); + usbd_mtp_make_fullpath(fullpath, dirent); + USB_LOG_DBG("[%d] fullpath:%s\r\n", idx, fullpath); + const char *file_name = strrchr(fullpath, '/'); + if (file_name) { + file_name++; /* skip '/' */ + } else { + file_name = path; + } + + size = usbd_mtp_get_file_size(fullpath); + if (size < 0) + break; + + ret = usbd_mtp_stat(fullpath, &statbuf); + if (ret < 0) + continue; + + /* alloc handle - alloc full path for file operation and persistence + * persistence mechanism: if path exists, reuse same handle */ + uint32_t handle = mtp_alloc_handle(&g_usbd_mtp.obj_manager, MTP_STORAGE_ID, + parent_handle, fullpath, + statbuf.st_mode & S_IFDIR ? MTP_FORMAT_ASSOCIATION : (uint16_t)_get_format_by_name(file_name), + size, statbuf.st_mode & S_IFDIR ? true : false); + if (handle == 0) { + USB_LOG_ERR("Failed to allocate handle for %s\n", fullpath); + continue; + } + + /* Add to handle list */ + object_handle->ObjectHandle[i] = handle; + + USB_LOG_DBG("file:%s(%lu-%lu-%lu-%lu)\r\n", fullpath, + handle, object_handle->ObjectHandle[i], g_usbd_mtp.obj_manager.total_objects, i); + + + if (i >= CONFIG_USBDEV_MTP_MAX_OBJECTS) + break; + i++; + idx++; + } + + USB_LOG_DBG("[MTP_RESP] Final handle array: "); + for (uint32_t k = 0; k < i; k++) { + USB_LOG_DBG("0x%lx ", object_handle->ObjectHandle[k]); + } + USB_LOG_DBG("\r\n"); + + if (empty_dir) { + USB_LOG_DBG("[MTP_WARN] Directory %s appears to be empty or readdir failed!\r\n", pathname); + } + + object_handle->ObjectHandle_len = i; + usbd_mtp_closedir(dir); + + return 0; +} + +static void usbd_mtp_get_object_handles(struct mtp_container_command *cmd) +{ + struct mtp_object_handle *p_object_handle = (struct mtp_object_handle *)USBD_MTP_CON_DATA->data; + int ret; + char full_path[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + + USB_LOG_DBG("GetObjHandles, StorageID:0x%lx, FormatCode:0x%lx, ParentHandle:0x%lx\r\n", + cmd->param1, + cmd->param2, + cmd->param3); + + if (cmd->param3 != 0x00000000 && + cmd->param3 != 0xffffffff) { + mtp_object_t *parent_obj; + if (mtp_get_object_by_handle(&g_usbd_mtp.obj_manager, cmd->param3, &parent_obj) == 0) { + if (mtp_rebuild_full_path(&g_usbd_mtp.obj_manager, cmd->param3, + full_path, sizeof(full_path)) == 0) { + USB_LOG_DBG("ParentHandle 0x%lx -> path: %s (format=0x%x)\r\n", + cmd->param3, + full_path, + parent_obj->format); + } + } else { + USB_LOG_ERR("ParentHandle 0x%lx not found!\r\n", cmd->param3); + } + } + + memset(p_object_handle, 0U, sizeof(struct mtp_object_handle)); + + if (cmd->param1 != MTP_STORAGE_ID && + cmd->param1 != 0xffffffff) { + usbd_mtp_send_response(MTP_RESPONSE_STORE_NOT_AVAILABLE); + return; + } + + if (cmd->param2 != 0x00000000) { + usbd_mtp_send_response(MTP_RESPONSE_SPECIFICATION_BY_FORMAT_UNSUPPORTED); + return; + } + + if (cmd->param3 == 0x00000000 || + cmd->param3 == 0xffffffff) { + /* Use 0xFFFFFFFF as the canonical "no parent / root" value per MTP */ + ret = mtp_object_handles_list(p_object_handle, 0xFFFFFFFFU, usbd_mtp_fs_root_path()); + if (ret < 0) { + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + } else { + mtp_object_t *parent_obj; + ret = mtp_get_object_by_handle(&g_usbd_mtp.obj_manager, cmd->param3, &parent_obj); + if (ret < 0) { + USB_LOG_ERR("Invalid handle: 0x%lx\n", cmd->param3); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + if (parent_obj->format != MTP_FORMAT_ASSOCIATION) { + USB_LOG_ERR("Handle 0x%lx is not a directory (format=0x%x)\n", + cmd->param3, parent_obj->format); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + /* Rebuild parent object's full path */ + if (mtp_rebuild_full_path(&g_usbd_mtp.obj_manager, cmd->param3, + full_path, sizeof(full_path)) != 0) { + USB_LOG_ERR("Failed to rebuild path for parent handle 0x%lx\n", + cmd->param3); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + ret = mtp_object_handles_list(p_object_handle, cmd->param3, + full_path); + if (ret < 0) { + USB_LOG_ERR("Failed to list handles for directory: %s\n", full_path); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + } + + USB_LOG_DBG("[MTP_RESP] Returning %lu handles for Parent 0x%lx: ", + (unsigned long)p_object_handle->ObjectHandle_len, + (unsigned long)cmd->param3); + for (uint32_t i = 0; i < p_object_handle->ObjectHandle_len && i < 8; i++) { + USB_LOG_DBG("0x%lx ", (unsigned long)p_object_handle->ObjectHandle[i]); + } + if (p_object_handle->ObjectHandle_len > 8) { + USB_LOG_DBG("..."); + } + USB_LOG_DBG("\r\n"); + + usbd_mtp_send_info((uint8_t *)p_object_handle, sizeof(uint32_t) * (p_object_handle->ObjectHandle_len + 1U)); +} + +static void usbd_mtp_get_object_info(struct mtp_container_command *cmd) +{ + mtp_object_t *obj; + int ret; + uint8_t *p = (uint8_t *)USBD_MTP_CON_DATA->data; + uint8_t *buf_start = p; + size_t buf_size = CONFIG_USBDEV_MTP_MAX_BUFSIZE - MTP_CONTAINER_HEADER_SIZE; + char full_path[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + + USB_LOG_DBG("GetObjInfo, ObjectHandle:0x%lx\r\n", + cmd->param1); + + ret = mtp_get_object_by_handle(&g_usbd_mtp.obj_manager, + cmd->param1, &obj); + if (ret < 0) { + USB_LOG_ERR("Invalid object by handle:0x%lx\r\n", cmd->param1); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + /* Rebuild full path */ + if (mtp_rebuild_full_path(&g_usbd_mtp.obj_manager, obj->handle, + full_path, sizeof(full_path)) != 0) { + USB_LOG_ERR("Failed to rebuild full path for handle 0x%lx\n", + (unsigned long)obj->handle); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + USB_LOG_DBG("format:0x%04x, size:%ld, name:%s, path:%s\r\n", + obj->format, + obj->size, + obj->name, + full_path); + USB_LOG_DBG("[MTP_INFO] parent_handle=0x%lx will be sent to PC\r\n", + (unsigned long)obj->parent_handle); + + PUT_U32_AT(p, MTP_STORAGE_ID); /* storage id */ + PUT_U16_AT(p, obj->format); /* object format */ + PUT_U16_AT(p, 0U); /* protection status */ + PUT_U32_AT(p, obj->size); /* object compressed size */ + PUT_U16_AT(p, MTP_FORMAT_UNDEFINED); /* thumb format */ + PUT_U32_AT(p, 0U); /* thumb compressed size */ + PUT_U32_AT(p, 0U); /* thumb pix width */ + PUT_U32_AT(p, 0U); /* thumb pix height */ + PUT_U32_AT(p, 0U); /* pix width */ + PUT_U32_AT(p, 0U); /* pix height */ + PUT_U32_AT(p, 0U); /* pix depth */ + PUT_U32_AT(p, obj->parent_handle); /* parent object */ + if (obj->format == MTP_FORMAT_ASSOCIATION) /* Association Type */ + PUT_U16_AT(p, 0x0001U); /* generic folder */ + else + PUT_U16_AT(p, 0x0000U); /* Undefined/Not Association */ + PUT_U32_AT(p, 0U); /* association desc */ + PUT_U32_AT(p, 0U); /* sequence number */ + /* Filename in MTP: convert UTF-8 to UTF-16LE and write to buffer */ + put_utf8_as_utf16(&p, obj->name, buf_start, buf_size); + { + struct stat st; + char time_str[32]; + struct tm tmval; + /* Fill CaptureDate and ModificationDate in MTP format: year(uint16 LE), month(uint8), day(uint8), hour(uint8), minute(uint8) -> 6 bytes */ + if (usbd_mtp_stat(full_path, &st) == 0) { + /* Creation/Change time: use st_mtime */ + localtime_r(&st.st_mtime, &tmval); + snprintf(time_str, sizeof(time_str), "%04d%02d%02dT%02d%02d%02d", + tmval.tm_year + 1900, + tmval.tm_mon + 1, + tmval.tm_mday, + tmval.tm_hour, + tmval.tm_min, + tmval.tm_sec); + PUT_STRING_AT(p, time_str, strlen(time_str) + 1); + + /* Modification time, reuse the same code as above for creation time */ + PUT_STRING_AT(p, time_str, strlen(time_str) + 1); + } else { + strncpy(time_str, "19800101T000000", sizeof(time_str)); + + PUT_STRING_AT(p, time_str, strlen(time_str) + 1); + PUT_STRING_AT(p, time_str, strlen(time_str) + 1); + } + + /* Keywords: empty string (one byte length 0) */ + PUT_U8_AT(p, 0U); + } + + usbd_mtp_send_info(USBD_MTP_CON_DATA->data, (uint32_t)(p - USBD_MTP_CON_DATA->data)); +} + +static void usbd_mtp_get_object(struct mtp_container_command *cmd) +{ + int fd; + int32_t ret; + mtp_object_t *obj; + char full_path[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + + ret = mtp_get_object_by_handle(&g_usbd_mtp.obj_manager, + cmd->param1, &obj); + if (ret < 0) { + USB_LOG_ERR("Failed to get object handle: 0x%lx\n", + (unsigned long)cmd->param1); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + if (obj->format == MTP_FORMAT_ASSOCIATION) { + USB_LOG_ERR("The object is a folder\r\n"); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + /* Rebuild full path */ + if (mtp_rebuild_full_path(&g_usbd_mtp.obj_manager, obj->handle, + full_path, sizeof(full_path)) != 0) { + USB_LOG_ERR("Failed to rebuild full path for handle 0x%lx\n", + (unsigned long)obj->handle); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + /* Read */ + fd = usbd_mtp_open(full_path, O_RDONLY, 0); + if (fd < 0) { + USB_LOG_ERR("Failed to open file(%s)\r\n", full_path); + usbd_mtp_send_response(MTP_RESPONSE_INCOMPLETE_TRANSFER); + return; + } + + int32_t data_length = obj->size; + + /* first packet */ + ret = usbd_mtp_read(fd, USBD_MTP_CON_DATA->data, + MIN(data_length, CONFIG_USBDEV_MTP_MAX_BUFSIZE - MTP_CONTAINER_HEADER_SIZE)); + USBD_MTP_CON_DATA->conlen = MTP_CONTAINER_HEADER_SIZE + data_length; + USBD_MTP_CON_DATA->contype = MTP_CONTAINER_TYPE_DATA; + USBD_MTP_CON_DATA->code = MTP_RESPONSE_OK; + USBD_MTP_CON_DATA->trans_id = cmd->trans_id; + + data_length = ((data_length - ret) < 0) ? data_length : (data_length - ret); + + if (data_length == 0) { + g_usbd_mtp.stage = MTP_SEND_RESPONSE; + if (usbd_mtp_close(fd) < 0) { + USB_LOG_ERR("Failed to close file(%s)\r\n", full_path); + usbd_mtp_send_response(MTP_RESPONSE_INCOMPLETE_TRANSFER); + return; + } + } else { + g_usbd_mtp.stage = MTP_DATA_IN; + g_usbd_mtp.mtp_file_in.handle = cmd->param1; + g_usbd_mtp.mtp_file_in.fd = fd; + g_usbd_mtp.mtp_file_in.data_length = data_length; + } + usbd_ep_start_write(g_usbd_mtp.busid, mtp_ep_data[MTP_IN_EP_IDX].ep_addr, + (uint8_t *)USBD_MTP_CON_DATA, + MIN(USBD_MTP_CON_DATA->conlen, CONFIG_USBDEV_MTP_MAX_BUFSIZE)); + + return; +} + +void usbd_mtp_data_in(void) +{ + int32_t ret; + int32_t data_length = g_usbd_mtp.mtp_file_in.data_length; + + if (data_length <= 0) + return; + + ret = usbd_mtp_read(g_usbd_mtp.mtp_file_in.fd, + g_usbd_mtp.usbd_mtp_data_in, + MIN(data_length, CONFIG_USBDEV_MTP_MAX_BUFSIZE)); + if (ret < 0) { + USB_LOG_ERR("Failed to read file\r\n"); + if (usbd_mtp_close(g_usbd_mtp.mtp_file_in.fd) < 0) { + USB_LOG_ERR("Falie to close file\r\n"); + } + usbd_mtp_send_response(MTP_RESPONSE_INCOMPLETE_TRANSFER); + return; + } + + data_length = ((data_length - ret) < 0) ? data_length : (data_length - ret); + + g_usbd_mtp.mtp_file_in.data_length = data_length; + + if (g_usbd_mtp.mtp_file_in.data_length == 0) { + if (usbd_mtp_close(g_usbd_mtp.mtp_file_in.fd) < 0) { + USB_LOG_ERR("Falie to close file\r\n"); + return; + } + g_usbd_mtp.stage = MTP_SEND_RESPONSE; + } + + usbd_ep_start_write(g_usbd_mtp.busid, mtp_ep_data[MTP_IN_EP_IDX].ep_addr, + g_usbd_mtp.usbd_mtp_data_in, ret); + + return; +} + +static void usbd_mtp_get_object_prop_desc(struct mtp_container_command *cmd) +{ + uint8_t *p = USBD_MTP_CON_DATA->data; + uint16_t undef_format = MTP_FORMAT_UNDEFINED; + uint32_t storageid = MTP_STORAGE_ID; + USB_LOG_DBG("param:%#lx(1)-%#lx(2)\r\n", cmd->param1, cmd->param2); + + uint16_t prop_code = (uint16_t)(cmd->param2); + PUT_U16_AT(p, prop_code); //obj prop code + + switch (prop_code) /* switch obj prop code */ + { + case MTP_PROPERTY_STORAGE_ID: + PUT_U16_AT(p, MTP_TYPE_UINT32); /* data type */ + PUT_U8_AT(p, MTP_PROP_GET); /* get/set */ + PUT_U32_AT(p, storageid); /* default value */ + PUT_U32_AT(p, 0U); /* group code */ + PUT_U8_AT(p, 0U); /* form flag */ + break; + + case MTP_PROPERTY_OBJECT_FORMAT: + PUT_U16_AT(p, MTP_TYPE_UINT16); /* data type */ + PUT_U8_AT(p, MTP_PROP_GET); /* get/set */ + PUT_U16_AT(p, undef_format); /* default value */ + PUT_U32_AT(p, 0U); /* group code */ + PUT_U8_AT(p, 0U); /* form flag */ + break; + + case MTP_PROPERTY_PROTECTION_STATUS: + PUT_U16_AT(p, MTP_TYPE_UINT16); /* data type */ + PUT_U8_AT(p, MTP_PROP_GET_SET); /* get/set */ + PUT_U16_AT(p, 0U); /* default value */ + PUT_U32_AT(p, 0U); /* group code */ + PUT_U8_AT(p, 0U); /* form flag */ + break; + + case MTP_PROPERTY_OBJECT_FILE_NAME: + PUT_U16_AT(p, MTP_TYPE_STR); /* data type */ + PUT_U8_AT(p, MTP_PROP_GET_SET); /* get/set */ + PUT_U8_AT(p, sizeof(DefaultFileName)/sizeof(uint16_t)); /* default value length */ + for (uint32_t i = 0; i < sizeof(DefaultFileName)/sizeof(uint16_t); i++) { + PUT_U16_AT(p, DefaultFileName[i]); /* default value string */ + } + PUT_U32_AT(p, 0U); /* group code */ + PUT_U8_AT(p, 0U); /* form flag */ + break; + + case MTP_PROPERTY_PARENT_OBJECT: + PUT_U16_AT(p, MTP_TYPE_UINT32); /* data type */ + PUT_U8_AT(p, MTP_PROP_GET); /* get/set */ + PUT_U32_AT(p, 0U); /* default value */ + PUT_U32_AT(p, 0U); /* group code */ + PUT_U8_AT(p, 0U); /* form flag */ + break; + + case MTP_PROPERTY_OBJECT_SIZE: + PUT_U16_AT(p, MTP_TYPE_UINT64); /* data type */ + PUT_U8_AT(p, MTP_PROP_GET); /* get/set */ + PUT_U64_AT(p, 0U); /* default value */ + PUT_U32_AT(p, 0U); /* group code */ + PUT_U8_AT(p, 0U); /* form flag */ + break; + + case MTP_PROPERTY_NAME: + PUT_U16_AT(p, MTP_TYPE_STR); /* data type */ + PUT_U8_AT(p, MTP_PROP_GET_SET); /* get/set */ + PUT_U8_AT(p, sizeof(DefaultFileName)/sizeof(uint16_t)); /* default value length */ + for (uint32_t i = 0; i < sizeof(DefaultFileName)/sizeof(uint16_t); i++) { + PUT_U16_AT(p, DefaultFileName[i]); + } + PUT_U32_AT(p, 0U); /* group code */ + PUT_U8_AT(p, 0U); /* form flag */ + break; + + case MTP_PROPERTY_PERSISTENT_UID: + PUT_U16_AT(p, MTP_TYPE_UINT128); /* data type */ + PUT_U8_AT(p, MTP_PROP_GET); /* get/set */ + for (uint32_t i = 0; i < 16; i++) { + PUT_U8_AT(p, 0U); + } + PUT_U32_AT(p, 0U); /* group code */ + PUT_U8_AT(p, 0U); /* form flag */ + break; + default: + usbd_mtp_send_response(MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED); + return; + } + + usbd_mtp_send_info(USBD_MTP_CON_DATA->data, (uint32_t)(p - USBD_MTP_CON_DATA->data)); +} + +static void usbd_mtp_get_object_props_supported(void) +{ + struct mtp_object_props_support object_props_support; + const formats_property *format_property; + uint32_t i; + int found = 0; + + for (i = 0; i < sizeof(support_format_properties) / sizeof(formats_property); i++) { + format_property = &support_format_properties[i]; + if (format_property->format_code == MTP_FORMAT_UNDEFINED) { + found = 1; + break; + } + } + + if (found == 1) { + for (i = 0; i < 255; i++) { + if (format_property->properties[i] != 0xFFFF) { + object_props_support.ObjectPropCode[i] = format_property->properties[i]; + } else { + break; + } + } + object_props_support.ObjectPropCode_len = i; + usbd_mtp_send_info((uint8_t *)&object_props_support, sizeof(struct mtp_object_props_support)); + } +} + + +void usbd_mtp_send_object_info(struct mtp_container_command *cmd) +{ + static uint32_t last_trans_id = 0x0; + static uint32_t last_parent_handle = 0x0; // FIXME + uint32_t parent_handle; + struct mtp_statfs stfs; + int fd = -1; + char filename_tmp[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + struct mtp_object_info *object_info; + int ret; + + if (cmd->trans_id != last_trans_id) { + last_trans_id = cmd->trans_id; + last_parent_handle = cmd->param2; + /* place object in root by default; actual parent will be taken from dataset */ + memset(g_usbd_mtp.path, 0, sizeof(g_usbd_mtp.path)); + strncpy(g_usbd_mtp.path, usbd_mtp_fs_root_path(), sizeof(g_usbd_mtp.path) - 1); + + /* No response, prepare to receive object info dataset */ + USB_LOG_DBG("Prepare to read ObjectInfo dataset on OUT ep (len=%d)\r\n", CONFIG_USBDEV_MTP_MAX_BUFSIZE); + usbd_ep_start_read(g_usbd_mtp.busid, mtp_ep_data[MTP_OUT_EP_IDX].ep_addr, + (uint8_t *)USBD_MTP_CON_DATA, CONFIG_USBDEV_MTP_MAX_BUFSIZE); // CONFIG_USBDEV_MSC_MAX_BUFSIZE + return; + } + + if ((g_usbd_mtp.obj_manager.total_objects + 1U) >= MTP_HANDLE_POOL_SIZE) { + USB_LOG_ERR("Object limit reached\r\n"); + goto __error_access; + } + + /* Get ObjectInfo Dataset */ + object_info = (struct mtp_object_info *)&USBD_MTP_CON_DATA->data[0]; + + /* UTF-16LE -> UTF-8 */ + memset(filename_tmp, 0, sizeof(filename_tmp)); + _unicode_to_string(filename_tmp, + object_info->Filename, + object_info->Filename_len); + + USB_LOG_DBG("ObjInfo: StorageId=0x%08lx, Fmt=0x%04x, parent=0x%08lx, fname=%s\r\n", + object_info->StorageId, object_info->ObjectFormat, object_info->ParentObject, filename_tmp); + + /* Check Storage Space */ + if (usbd_mtp_statfs(usbd_mtp_fs_root_path(), &stfs)) { + USB_LOG_ERR("Failed to get storage info\r\n"); + goto __error_store_full; + } + + uint64_t required_size = (uint64_t)object_info->ObjectCompressedSize; + uint64_t free_space = (uint64_t)stfs.f_bfree * (uint64_t)stfs.f_bsize; + + if (required_size > free_space) { + USB_LOG_ERR("Store full! Req:%lld, Free:%lld\r\n", required_size, free_space); + goto __error_store_full; + } + + /* Determine parent from dataset */ + parent_handle = last_parent_handle; + if (parent_handle != 0xFFFFFFFFU && + parent_handle != 0x00000000U) { + mtp_object_t *parent_obj; + ret = mtp_get_object_by_handle(&g_usbd_mtp.obj_manager, parent_handle, &parent_obj); + if (ret != 0) { + USB_LOG_ERR("Invalid parent handle in dataset: 0x%08lx\r\n", (unsigned long)parent_handle); + goto __error_access; + } + memset(g_usbd_mtp.path, 0, sizeof(g_usbd_mtp.path)); + if (mtp_rebuild_full_path(&g_usbd_mtp.obj_manager, parent_handle, + g_usbd_mtp.path, sizeof(g_usbd_mtp.path)) != 0) { + USB_LOG_ERR("Failed to rebuild parent path for handle 0x%lx\n", (unsigned long)parent_handle); + goto __error_access; + } + } + + /* Construct Full Path safely */ + size_t path_len = strlen(g_usbd_mtp.path); + size_t name_len = strlen(filename_tmp); + + if (path_len + 1 + name_len >= sizeof(g_usbd_mtp.path)) { + USB_LOG_ERR("Path too long\r\n"); + goto __error_access; + } + + strcat(g_usbd_mtp.path, "/"); + strcat(g_usbd_mtp.path, filename_tmp); + + USB_LOG_DBG("Target: %s, Size: %lu\n", g_usbd_mtp.path, object_info->ObjectCompressedSize); + + USB_LOG_DBG("Creating object: format=0x%04x protection=%u\r\n", object_info->ObjectFormat, object_info->ProtectionStatus); + uint8_t *ptr = (uint8_t*)object_info + sizeof(struct mtp_object_info) + object_info->Filename_len * 2; + GET_STRING_AT(ptr, filename_tmp); /* CreateData */ + USB_LOG_DBG("CreatData: %s\r\n", filename_tmp); + GET_STRING_AT(ptr, filename_tmp); /* ModifyData */ + USB_LOG_DBG("ModifyData: %s\r\n", filename_tmp); + + /* Create file or directory */ + if (object_info->ObjectFormat != MTP_FORMAT_ASSOCIATION) { + fd = usbd_mtp_open(g_usbd_mtp.path, O_CREAT | O_TRUNC | O_RDWR, 0644); + } else { + ret = usbd_mtp_mkdir(g_usbd_mtp.path); + fd = (ret == 0) ? 0 : -1; + } + + if (fd < 0) { + USB_LOG_ERR("Failed to create file/dir (fd=%d)\r\n", fd); + goto __error_access; + } + + /* Allocate Object Handle */ + uint32_t new_handle = mtp_alloc_handle(&g_usbd_mtp.obj_manager, MTP_STORAGE_ID, + parent_handle, g_usbd_mtp.path, + object_info->ObjectFormat, + object_info->ObjectCompressedSize, + object_info->ObjectFormat == MTP_FORMAT_ASSOCIATION ? true : false); + if (new_handle == 0) { + USB_LOG_ERR("Failed to allocate object handle\r\n"); + if (object_info->ObjectFormat != MTP_FORMAT_ASSOCIATION) { + usbd_mtp_close(fd); + usbd_mtp_unlink(g_usbd_mtp.path); /* Clean up created file */ + } + goto __error_access; + } + + if (object_info->ObjectFormat != MTP_FORMAT_ASSOCIATION) { + usbd_mtp_close(fd); + } + g_usbd_mtp.mtp_file_out.handle = new_handle; + + /* Send OK response with StorageID, ParentObject, ObjectHandle (3 params) + * Response packet size must be 32 bytes, otherwise the host will fail */ + usbd_mtp_send_response_param(MTP_RESPONSE_OK, MTP_STORAGE_ID, + parent_handle, + new_handle, 0, 0); + USB_LOG_DBG("Response params: code=0x%08lx p1=0x%08lx p2=0x%08lx p3=0x%08lx\r\n", + (unsigned long)MTP_RESPONSE_OK, (unsigned long)MTP_STORAGE_ID, (unsigned long)parent_handle, (unsigned long)new_handle); + /* enqueue OBJECT_ADDED event (handle,0,0) */ + usbd_mtp_event_enqueue(MTP_EVENT_OBJECT_ADDED, new_handle, 0U, 0U); + return; + +__error_store_full: + usbd_mtp_send_response(MTP_RESPONSE_STORAGE_FULL); + return; + +__error_access: + /* Covers: Access Denied, Path Too Long, Invalid Parent, Creation Fail */ + usbd_mtp_send_response(MTP_RESPONSE_ACCESS_DENIED); + return; +} + +void usbd_mtp_data_out(void) +{ + int32_t ret; + int32_t data_length = g_usbd_mtp.usbd_mtp_wcnt; + if (data_length <= 0) { + usbd_mtp_send_response(MTP_RESPONSE_OK); + return; + } + + ret = usbd_mtp_write(g_usbd_mtp.mtp_file_out.fd, + g_usbd_mtp.usbd_mtp_data_out, + g_usbd_mtp.mtp_file_out.data_length); + if (ret <= 0) { + usbd_mtp_send_response(MTP_RESPONSE_INCOMPLETE_TRANSFER); + if (usbd_mtp_close(g_usbd_mtp.mtp_file_out.fd) < 0) { + USB_LOG_ERR("Falie to close file\r\n"); + } + return; + } + + data_length = ((data_length - ret) < 0) ? data_length : (data_length - ret); + + g_usbd_mtp.mtp_file_out.data_length = MIN(data_length, CONFIG_USBDEV_MTP_MAX_BUFSIZE); + + g_usbd_mtp.usbd_mtp_wcnt = data_length; + if (g_usbd_mtp.usbd_mtp_wcnt == 0) { + if (usbd_mtp_close(g_usbd_mtp.mtp_file_out.fd) < 0) { + USB_LOG_ERR("Falie to close file\r\n"); + return; + } + usbd_mtp_send_response(MTP_RESPONSE_OK); + /* enqueue OBJECT_INFO_CHANGED for the object that was written */ + usbd_mtp_event_enqueue(MTP_EVENT_OBJECT_INFO_CHANGED, g_usbd_mtp.mtp_file_out.handle, 0U, 0U); + return; + } + usbd_ep_start_read(g_usbd_mtp.busid, mtp_ep_data[MTP_OUT_EP_IDX].ep_addr, + g_usbd_mtp.usbd_mtp_data_out, CONFIG_USBDEV_MTP_MAX_BUFSIZE); +} + +void usbd_mtp_send_object(struct mtp_container_command *cmd) +{ + static uint32_t last_trans_id = 0x0; + int fd; + int32_t ret; + mtp_object_t *obj; + char full_path[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + + if (cmd->trans_id != last_trans_id) { + last_trans_id = cmd->trans_id; + usbd_ep_start_read(g_usbd_mtp.busid, mtp_ep_data[MTP_OUT_EP_IDX].ep_addr, (uint8_t *)USBD_MTP_CON_DATA, CONFIG_USBDEV_MTP_MAX_BUFSIZE); + return; + } + + ret = mtp_get_object_by_handle(&g_usbd_mtp.obj_manager, g_usbd_mtp.mtp_file_out.handle, &obj); + + if (ret < 0) { + USB_LOG_ERR("Failed to get file handle: 0x%lx\n", (unsigned long)g_usbd_mtp.mtp_file_out.handle); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + /* Rebuild full path */ + if (mtp_rebuild_full_path(&g_usbd_mtp.obj_manager, obj->handle, + full_path, sizeof(full_path)) != 0) { + USB_LOG_ERR("Failed to rebuild full path for handle 0x%lx\n", (unsigned long)obj->handle); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + /* Write file */ + fd = usbd_mtp_open(full_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) { + USB_LOG_ERR("Failed to open file(%s)\r\n", full_path); + usbd_mtp_send_response(MTP_RESPONSE_INCOMPLETE_TRANSFER); + return; + } + + uint32_t data_length = USBD_MTP_CON_DATA->conlen - MTP_CONTAINER_HEADER_SIZE; + if (data_length > CONFIG_USBDEV_MTP_MAX_BUFSIZE - MTP_CONTAINER_HEADER_SIZE) + g_usbd_mtp.stage = MTP_DATA_OUT; + + g_usbd_mtp.usbd_mtp_wcnt = data_length; + g_usbd_mtp.mtp_file_out.fd = fd; + g_usbd_mtp.mtp_file_out.data_length = MIN(data_length, + CONFIG_USBDEV_MTP_MAX_BUFSIZE - MTP_CONTAINER_HEADER_SIZE); + memcpy(g_usbd_mtp.usbd_mtp_data_out, USBD_MTP_CON_DATA->data, + MIN(data_length, CONFIG_USBDEV_MTP_MAX_BUFSIZE - MTP_CONTAINER_HEADER_SIZE)); + + usbd_mtp_data_out(); + + return; +} + +void usbd_mtp_delete_object(struct mtp_container_command *cmd) +{ + int ret = 0; + uint32_t handle = cmd->param1; + uint32_t parent_handle = 0; + + /* Don't support delete the root object! */ + if (handle == 0xffffffff) { + USB_LOG_ERR("Don't support delete the root object!\r\n"); + usbd_mtp_send_response(MTP_RESPONSE_OPERATION_NOT_SUPPORTED); + return; + } + + ret = mtp_get_parent_by_handle(&g_usbd_mtp.obj_manager, handle, &parent_handle); + if (ret < 0) { + USB_LOG_ERR("Failed to get parent handle for object handle 0x%lx\n", (unsigned long)handle); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + ret = usbd_mtp_unlink_object_by_handle(handle); + + if (ret < 0) { + USB_LOG_ERR("Failed to delete object handle 0x%lx\n", (unsigned long)handle); + usbd_mtp_send_response(MTP_RESPONSE_INVALID_OBJECT_HANDLE); + return; + } + + usbd_mtp_send_response(MTP_RESPONSE_OK); + /* enqueue OBJECT_REMOVED event */ + usbd_mtp_event_enqueue(MTP_EVENT_OBJECT_REMOVED, handle, 0U, 0U); +} + +static void usbd_mtp_get_device_prop_desc(void) +{ + int i = 0; + uint8_t *p = USBD_MTP_CON_DATA->data; + + PUT_U16_AT(p, MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME); /* DevicePropertyCode */ + PUT_U16_AT(p, MTP_TYPE_STR); /* DataType */ + PUT_U8_AT(p, MTP_PROP_GET_SET); /* GetSet */ + /* DefaultValue_len/CurrentValue_len are measured in UTF-16 code units */ + PUT_U8_AT(p, (uint32_t)(sizeof(DevicePropDefVal) / sizeof(uint16_t))); /* DefaultValue_len */ + for (i = 0; i < (sizeof(DevicePropDefVal) / sizeof(uint16_t)); i++) { + PUT_U16_AT(p, DevicePropDefVal[i]); + } + PUT_U8_AT(p, (uint32_t)(sizeof(DevicePropCurDefVal) / sizeof(uint16_t))); /* CurrentValue_len */ + for (i = 0; i < (sizeof(DevicePropCurDefVal) / sizeof(uint16_t)); i++) { + PUT_U16_AT(p, DevicePropCurDefVal[i]); + } + PUT_U8_AT(p, 0U); /* FormFlag */ + usbd_mtp_send_info(USBD_MTP_CON_DATA->data, + (uint32_t)(p - USBD_MTP_CON_DATA->data)); +} + +static int usbd_mtp_decode(struct mtp_container_command *cmd) +{ + USB_LOG_DBG("Decode MTP command: code=0x%04x, contype=%u, conlen=%lu, trans_id=%lu, param1=0x%08lx, param2=0x%08lx, param3=0x%08lx\r\n", + cmd->code, cmd->contype, (unsigned long)cmd->conlen, (unsigned long)cmd->trans_id, + (unsigned long)cmd->param1, (unsigned long)cmd->param2, (unsigned long)cmd->param3); + switch (cmd->code) { + case MTP_OPERATION_GET_DEVICE_INFO: + usbd_mtp_get_device_info(); + break; + case MTP_OPERATION_OPEN_SESSION: + usbd_mtp_open_session(); + break; + case MTP_OPERATION_CLOSE_SESSION: + g_usbd_mtp.session_state = 0; /* Close session */ + usbd_mtp_send_response(MTP_RESPONSE_OK); + break; + case MTP_OPERATION_GET_STORAGE_IDS: + usbd_mtp_get_storage_ids(); + break; + case MTP_OPERATION_GET_STORAGE_INFO: + usbd_mtp_get_storage_info(); + break; + case MTP_OPERATION_GET_OBJECT_HANDLES: + usbd_mtp_get_object_handles(cmd); + break; + case MTP_OPERATION_GET_OBJECT_INFO: + usbd_mtp_get_object_info(cmd); + break; + case MTP_OPERATION_GET_OBJECT_REFERENCES: + usbd_mtp_send_response(MTP_RESPONSE_OPERATION_NOT_SUPPORTED); + break; + case MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED: + usbd_mtp_get_object_props_supported(); + break; + case MTP_OPERATION_GET_OBJECT_PROP_DESC: + usbd_mtp_get_object_prop_desc(cmd); + break; + case MTP_OPERATION_GET_OBJECT_PROP_LIST: + usbd_mtp_send_response(MTP_RESPONSE_OPERATION_NOT_SUPPORTED); + break; + case MTP_OPERATION_SET_OBJECT_PROP_VALUE: + /* usbd_mtp_set_object_prop_value(); */ + usbd_mtp_send_response(MTP_RESPONSE_OPERATION_NOT_SUPPORTED); + break; + case MTP_OPERATION_GET_OBJECT_PROP_VALUE: + /* usbd_mtp_get_object_prop_value(); */ + usbd_mtp_send_response(MTP_RESPONSE_OPERATION_NOT_SUPPORTED); + break; + case MTP_OPERATION_GET_DEVICE_PROP_DESC: + usbd_mtp_get_device_prop_desc(); + break; + case MTP_OPERATION_GET_OBJECT: + usbd_mtp_get_object(cmd); + break; + case MTP_OPERATION_SEND_OBJECT_INFO: + usbd_mtp_send_object_info(cmd); + break; + case MTP_OPERATION_SEND_OBJECT: + usbd_mtp_send_object(cmd); + break; + case MTP_OPERATION_DELETE_OBJECT: + usbd_mtp_delete_object(cmd); + break; + + default: + USB_LOG_WRN("code:%04x\r\n", cmd->code); + break; + } + return 0; +} + +static void usbd_mtp_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_DBG("bulk_out callback: ep=0x%02x nbytes=%lu stage=%d\r\n", ep, nbytes, g_usbd_mtp.stage); + switch (g_usbd_mtp.stage) { + case MTP_READ_COMMAND: + #ifdef CONFIG_USBDEV_MTP_THREAD + usb_osal_mq_send(g_usbd_mtp.usbd_mtp_mq, MTP_READ_COMMAND); + #else + usbd_mtp_decode((struct mtp_header *)&g_usbd_mtp.header); + #endif + break; + case MTP_DATA_OUT: + #ifdef CONFIG_USBDEV_MTP_THREAD + usb_osal_mq_send(g_usbd_mtp.usbd_mtp_mq, MTP_DATA_OUT); + #else + usbd_mtp_data_out(); + #endif + break; + default: + break; + } +} + +static void usbd_mtp_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + switch (g_usbd_mtp.stage) { + case MTP_DATA_IN: + #ifdef CONFIG_USBDEV_MTP_THREAD + usb_osal_mq_send(g_usbd_mtp.usbd_mtp_mq, MTP_DATA_IN); + #else + usbd_mtp_data_in(); + #endif + break; + case MTP_SEND_RESPONSE: + usbd_mtp_send_response(MTP_RESPONSE_OK); + break; + case MTP_WAIT_RESPONSE: + g_usbd_mtp.stage = MTP_READ_COMMAND; + usbd_ep_start_read(g_usbd_mtp.busid, mtp_ep_data[MTP_OUT_EP_IDX].ep_addr, (uint8_t *)&g_usbd_mtp.header, CONFIG_USBDEV_MTP_MAX_BUFSIZE); + break; + default: + break; + } +} + +static void usbd_mtp_event_int(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + /* INT IN transfer completed (interrupt context): avoid blocking calls. + * Clear busy flag and notify worker thread to send next event, or + * directly try to start next event when no thread is configured. + */ + (void)busid; (void)ep; (void)nbytes; + g_usbd_mtp.int_busy = 0; +#ifdef CONFIG_USBDEV_MTP_THREAD + if (g_usbd_mtp.usbd_mtp_mq) { + /* notify worker to process queued events (non-blocking) */ + usb_osal_mq_send(g_usbd_mtp.usbd_mtp_mq, (uintptr_t)MTP_THREAD_EVENT_SEND); + } +#else + /* No thread: try to send next event directly (non-blocking, no mutex) + * We implement a nolock sender to avoid mutex in interrupt. + */ + { + if (g_usbd_mtp.ev_q_head != g_usbd_mtp.ev_q_tail && !g_usbd_mtp.int_busy) { + uint8_t *p = g_usbd_mtp.event_buf; + uint16_t code = g_usbd_mtp.event_q[g_usbd_mtp.ev_q_tail].code; + uint32_t p1 = g_usbd_mtp.event_q[g_usbd_mtp.ev_q_tail].p1; + uint32_t p2 = g_usbd_mtp.event_q[g_usbd_mtp.ev_q_tail].p2; + uint32_t p3 = g_usbd_mtp.event_q[g_usbd_mtp.ev_q_tail].p3; + g_usbd_mtp.ev_q_tail = (uint8_t)((g_usbd_mtp.ev_q_tail + 1) % MTP_EVENT_Q_SIZE); + + PUT_U32_AT(p, (uint32_t)(MTP_CONTAINER_HEADER_SIZE + 12)); // container length + PUT_U16_AT(p, MTP_CONTAINER_TYPE_EVENT); // container type + PUT_U16_AT(p, code); // event code + PUT_U32_AT(p, 0U); // transaction ID = 0 for events + PUT_U32_AT(p, p1); // parameter 1 + PUT_U32_AT(p, p2); // parameter 2 + PUT_U32_AT(p, p3); // parameter 3 + + g_usbd_mtp.int_busy = 1; + usbd_ep_start_write(g_usbd_mtp.busid, mtp_ep_data[MTP_INT_EP_IDX].ep_addr, g_usbd_mtp.event_buf, MTP_CONTAINER_HEADER_SIZE + 12); + } + } +#endif +} + +static void mtp_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONFIGURED: + USB_LOG_DBG("Start reading command\r\n"); + g_usbd_mtp.stage = MTP_READ_COMMAND; + usbd_ep_start_read(busid, mtp_ep_data[MTP_OUT_EP_IDX].ep_addr, (uint8_t *)&g_usbd_mtp.header, CONFIG_USBDEV_MTP_MAX_BUFSIZE); + break; + + default: + break; + } +} + +#ifdef CONFIG_USBDEV_MTP_THREAD +static void usbdev_mtp_thread(void *argument) +{ + uintptr_t event; + int ret; + + while (1) { + ret = usb_osal_mq_recv(g_usbd_mtp.usbd_mtp_mq, (uintptr_t *)&event, USB_OSAL_WAITING_FOREVER); + if (ret < 0) { + continue; + } + USB_LOG_DBG("%d\r\n", event); + if (event == MTP_DATA_OUT) { + usbd_mtp_data_out(); + } else if (event == MTP_DATA_IN) { + usbd_mtp_data_in(); + } else if (event == MTP_READ_COMMAND) { + struct mtp_container_command cmd = *(struct mtp_container_command *)&g_usbd_mtp.header; + usbd_mtp_decode(&cmd); + } else if (event == MTP_THREAD_EVENT_SEND) { + /* send next pending event (worker context) */ + if (g_usbd_mtp.ev_mutex) { + usb_osal_mutex_take(g_usbd_mtp.ev_mutex); + usbd_mtp_event_send_queued_locked(); + usb_osal_mutex_give(g_usbd_mtp.ev_mutex); + } + } else { + } + } +} +#endif + +struct usbd_interface *usbd_mtp_init_intf(uint8_t busid, + struct usbd_interface *intf, + const uint8_t out_ep, + const uint8_t in_ep, + const uint8_t int_ep) +{ + USB_LOG_DBG("usbd_mtp_init_intf called: busid=%d out_ep=0x%02x in_ep=0x%02x int_ep=0x%02x\r\n", busid, out_ep, in_ep, int_ep); + g_usbd_mtp.busid = busid; + + /* Initialize object manager */ + if (mtp_object_manager_init(&g_usbd_mtp.obj_manager) != 0) { + USB_LOG_ERR("Failed to initialize MTP object manager\r\n"); + return NULL; + } + + intf->class_interface_handler = mtp_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = mtp_notify_handler; + + mtp_ep_data[MTP_OUT_EP_IDX].ep_addr = out_ep; + mtp_ep_data[MTP_OUT_EP_IDX].ep_cb = usbd_mtp_bulk_out; + mtp_ep_data[MTP_IN_EP_IDX].ep_addr = in_ep; + mtp_ep_data[MTP_IN_EP_IDX].ep_cb = usbd_mtp_bulk_in; + mtp_ep_data[MTP_INT_EP_IDX].ep_addr = int_ep; + mtp_ep_data[MTP_INT_EP_IDX].ep_cb = usbd_mtp_event_int; + + usbd_add_endpoint(busid, &mtp_ep_data[MTP_OUT_EP_IDX]); + usbd_add_endpoint(busid, &mtp_ep_data[MTP_IN_EP_IDX]); + usbd_add_endpoint(busid, &mtp_ep_data[MTP_INT_EP_IDX]); //event + +#ifdef CONFIG_USBDEV_MTP_THREAD + g_usbd_mtp.usbd_mtp_mq = usb_osal_mq_create(DATA_BUFFER_SIZE / MAX_WITTE_FILE_SIZE); + if (g_usbd_mtp.usbd_mtp_mq == NULL) { + mtp_object_manager_deinit(&g_usbd_mtp.obj_manager); + return NULL; + } + g_usbd_mtp.usbd_mtp_thread = usb_osal_thread_create("usbd_mtp", CONFIG_USBDEV_MTP_STACKSIZE, CONFIG_USBDEV_MTP_PRIO, usbdev_mtp_thread, NULL); + if (g_usbd_mtp.usbd_mtp_thread == NULL) { + usb_osal_mq_delete(g_usbd_mtp.usbd_mtp_mq); + mtp_object_manager_deinit(&g_usbd_mtp.obj_manager); + return NULL; + } +#endif + /* init event queue and mutex */ + g_usbd_mtp.ev_q_head = 0; + g_usbd_mtp.ev_q_tail = 0; + g_usbd_mtp.int_busy = 0; + g_usbd_mtp.ev_mutex = usb_osal_mutex_create(); + + return intf; +} + +/* Get MTP object manager instance */ +mtp_object_manager_t *usbd_mtp_get_obj_manager(void) +{ + return &g_usbd_mtp.obj_manager; +} diff --git a/src/driver/usb/mtp/usbd_mtp.h b/src/driver/usb/mtp/usbd_mtp.h new file mode 100644 index 000000000..559ce5f16 --- /dev/null +++ b/src/driver/usb/mtp/usbd_mtp.h @@ -0,0 +1,45 @@ +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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 USBD_MTP_H +#define USBD_MTP_H + +#include "driver/usb/mtp/usb_mtp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct usbd_interface *usbd_mtp_init_intf(uint8_t busid, + struct usbd_interface *intf, + const uint8_t out_ep, + const uint8_t in_ep, + const uint8_t int_ep); + +int usbd_mtp_notify_object_add(const char *path); +int usbd_mtp_notify_object_remove(const char *path); + +#include "usbd_mtp_object.h" + +/* MTP object manager accessor */ +mtp_object_manager_t *usbd_mtp_get_obj_manager(void); + + + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_MTP_H */ diff --git a/src/driver/usb/mtp/usbd_mtp_device_info.h b/src/driver/usb/mtp/usbd_mtp_device_info.h new file mode 100644 index 000000000..745b84802 --- /dev/null +++ b/src/driver/usb/mtp/usbd_mtp_device_info.h @@ -0,0 +1,101 @@ +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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 USB_MTP_DEVICE_INFO_H +#define USB_MTP_DEVICE_INFO_H +#include +#include "driver/usb/mtp/usb_mtp.h" + +static const uint16_t VendExtDesc[] = { 'm', 'i', 'c', 'r', 'o', 's', 'o', 'f', 't', '.', 'c', 'o', 'm', ':', ' ', '1', '.', '0', ';', ' ', 0 }; /* last 2 bytes must be 0*/ + +// static const uint16_t SuppOP[] = { MTP_OP_GET_DEVICE_INFO, MTP_OP_OPEN_SESSION, MTP_OP_CLOSE_SESSION, +// MTP_OP_GET_STORAGE_IDS, MTP_OP_GET_STORAGE_INFO, MTP_OP_GET_NUM_OBJECTS, +// MTP_OP_GET_OBJECT_HANDLES, MTP_OP_GET_OBJECT_INFO, MTP_OP_GET_OBJECT, +// MTP_OP_DELETE_OBJECT, MTP_OP_SEND_OBJECT_INFO, MTP_OP_SEND_OBJECT, +// MTP_OP_GET_DEVICE_PROP_DESC, MTP_OP_GET_OBJECT_PROPS_SUPPORTED +// }; +// /* MTP_OP_GET_OBJECT_PROPLIST,MTP_OP_GET_OBJECT_PROP_DESC, +// MTP_OP_GET_DEVICE_PROP_VALUE, +// MTP_OP_SET_OBJECT_PROP_VALUE,MTP_OP_GET_OBJECT_PROP_VALUE +// MTP_OP_GET_OBJECT_PROP_REFERENCES,*/ +// static const uint16_t SuppEvents[] = { MTP_EVENT_OBJECTADDED }; + +// static const uint16_t DevicePropSupp[] = { MTP_DEV_PROP_DEVICE_FRIENDLY_NAME, MTP_DEV_PROP_BATTERY_LEVEL }; + +// static const uint16_t SuppCaptFormat[] = { MTP_OBJ_FORMAT_UNDEFINED, MTP_OBJ_FORMAT_ASSOCIATION, MTP_OBJ_FORMAT_TEXT }; + +// static const uint16_t SuppImgFormat[] = { MTP_OBJ_FORMAT_UNDEFINED, MTP_OBJ_FORMAT_TEXT, MTP_OBJ_FORMAT_ASSOCIATION, +// MTP_OBJ_FORMAT_EXECUTABLE, MTP_OBJ_FORMAT_WAV, MTP_OBJ_FORMAT_MP3, +// MTP_OBJ_FORMAT_EXIF_JPEG, MTP_OBJ_FORMAT_MPEG, MTP_OBJ_FORMAT_MP4_CONTAINER, +// MTP_OBJ_FORMAT_WINDOWS_IMAGE_FORMAT, MTP_OBJ_FORMAT_PNG, MTP_OBJ_FORMAT_WMA, +// MTP_OBJ_FORMAT_WMV }; + +static const uint16_t Manuf[] = { 'F', 'i', 'r', 'm', 'a', 'm', 'e', 'n', 't', 0 }; /* last 2 bytes must be 0*/ +static const uint16_t Model[] = { 'F', 'i', 'r', 'm', 'a', 'm', 'e', 'n', 't', 0 }; /* last 2 bytes must be 0*/ +static const uint16_t DeviceVers[] = { 'V', '1', '.', '0', '0', 0 }; /* last 2 bytes must be 0*/ +/*SerialNbr shall be 32 character hexadecimal string for legacy compatibility reasons */ +static const uint16_t SerialNbr[] = { '0', '0', '0', '0', '1', '0', '0', '0', '0', '1', '0', '0', '0', '0', + '1', '0', '0', '0', '0', '1', '0', '0', '0', '0', '1', '0', '0', '0', + '0', '1', '0', '0', 0 }; /* last 2 bytes must be 0*/ + +static const uint16_t DefaultFileName[] = { 'N', 'e', 'w', ' ', 'F', 'o', 'l', 'd', 'e', 'r', 0 }; + +static const uint16_t DevicePropDefVal[] = { 'F', 'M', 'T', ' ', 'D', 'e', 'v', 'i', 'c', 'e', 0 }; +static const uint16_t DevicePropCurDefVal[] = { 'F', 'M', 'T', ' ', 'D', 'e', 'v', 'i', 'c', 'e', 0 }; + +/* required for all object format : storageID, objectFormat, ObjectCompressedSize, +persistent unique object identifier, name*/ +// static const uint16_t ObjectPropCode[] = { MTP_OB_PROP_STORAGE_ID, MTP_OB_PROP_OBJECT_FORMAT, MTP_OB_PROP_OBJECT_SIZE, +// MTP_OB_PROP_OBJ_FILE_NAME, MTP_OB_PROP_PARENT_OBJECT, MTP_OB_PROP_NAME, +// MTP_OB_PROP_PERS_UNIQ_OBJ_IDEN, MTP_OB_PROP_PROTECTION_STATUS, +// MTP_OB_PROP_DISPLAY_NAME}; + +#define MTP_STORAGE_ID 0x00010001U /* SD card is inserted*/ +#define MTP_STORAGE_IDS 1 + +/** + * Write 8/16/32/64/128-bit little-endian values into buffer. + * Macro-based for inline efficiency without large stack allocation. + */ +#define PUT_U8_AT(buf, x) do { (buf)[0] = (uint8_t)(x); (buf) += 1; } while (0) +#define PUT_U16_AT(buf, x) do { uint16_t _v = (uint16_t)(x); memcpy(buf, &_v, 2); (buf) += 2; } while (0) +#define PUT_U32_AT(buf, x) do { uint32_t _v = (uint32_t)(x); memcpy(buf, &_v, 4); (buf) += 4; } while (0) +#define PUT_U64_AT(buf, x) do { uint64_t _v = (uint64_t)(x); memcpy(buf, &_v, 8); (buf) += 8; } while (0) +#define PUT_STRING_AT(buf, str, len) do { PUT_U8_AT(buf, len);\ + for (uint16_t i = 0; i < len; i++) { \ + PUT_U16_AT(buf, (uint16_t)str[i]); \ + } \ + } while (0) + +#define GET_U8_AT(buf) ({ uint8_t _v = *(uint8_t *)(buf); (buf) += 1; _v;}) +#define GET_U16_AT(buf) ({ uint16_t _v; memcpy(&_v, buf, 2); (buf) += 2; _v;}) +#define GET_U32_AT(buf) ({ uint32_t _v; memcpy(&_v, buf, 4); (buf) += 4; _v;}) +#define GET_U64_AT(buf) ({ uint64_t _v; memcpy(&_v, buf, 8); (buf) += 8; _v;}) +#define GET_STRING_AT(buf, str) \ + do { uint8_t *_str = (uint8_t *)str;\ + uint8_t _str_len = GET_U8_AT(buf); \ + for (uint16_t i = 0; i < _str_len; i++) { \ + uint16_t str_src = GET_U16_AT(buf); \ + if (_str != NULL) { _str[i] = (uint8_t)str_src; } \ + } \ + } while (0) + +struct mtp_object_handle { + uint32_t ObjectHandle_len; + uint32_t ObjectHandle[CONFIG_USBDEV_MTP_MAX_OBJECTS]; +} __PACKED; + +#endif \ No newline at end of file diff --git a/src/driver/usb/mtp/usbd_mtp_file.c b/src/driver/usb/mtp/usbd_mtp_file.c new file mode 100644 index 000000000..370aabaed --- /dev/null +++ b/src/driver/usb/mtp/usbd_mtp_file.c @@ -0,0 +1,287 @@ +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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. + *****************************************************************************/ + +#include "driver/usb/mtp/usbd_mtp_file.h" +#include "stdio.h" +#include "fcntl.h" +#include "dirent.h" +#include "unistd.h" +#include "sys/stat.h" +#include "sys/statfs.h" +#include "string.h" + +static const char mtp_root_path[] = CONFIG_USBDEV_MTP_ROOT_PATH; + +const char *usbd_mtp_fs_root_path(void) +{ + return mtp_root_path; +} + +/* directory operation */ +int usbd_mtp_mkdir(const char *path) +{ + return mkdir(path, 0); +} + +int usbd_mtp_rmdir(const char *path) +{ + return rmdir(path); +} + +int usbd_mtp_rmdir_recursive(const char *path) +{ + #define MAX_PATH_DEPTH 16 + int depth_len[MAX_PATH_DEPTH]; /* records the depth of the path*/ + int stack_top = 0; + DIR *dir; + struct dirent *entry; + struct stat statbuf; + char full_path[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + int has_subdir; + int ret = 0; + + /* Initialize path */ + strncpy(full_path, path, CONFIG_USBDEV_MTP_MAX_PATHNAME - 1); + full_path[CONFIG_USBDEV_MTP_MAX_PATHNAME - 1] = '\0'; + depth_len[0] = strlen(full_path); + + while (stack_top >= 0) { + /* Try to delete directory, empty or not */ + if (rmdir(full_path) == 0) { + /* Deletion succeeded, directory is empty or already an empty directory */ + stack_top--; + if (stack_top >= 0) { + full_path[depth_len[stack_top]] = '\0'; /* Fallback to parent directory */ + } + continue; + } + + /* rmdir failed, directory is not empty, need to traverse and delete contents */ + dir = opendir(full_path); + if (dir == NULL) { + USB_LOG_ERR("[MTP_RMDIR] Failed to open directory: %s\n", full_path); + stack_top--; + if (stack_top >= 0) { + full_path[depth_len[stack_top]] = '\0'; /* Fallback to parent directory */ + } + ret = -1; + continue; + } + + has_subdir = 0; + + /* Traverse all entries in the directory */ + while ((entry = readdir(dir)) != NULL) { + /* Skip "." and ".." */ + if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { + continue; + } + + /* Build full path */ + int current_len = strlen(full_path); + snprintf(full_path + current_len, PATH_MAX - current_len, "/%s", entry->d_name); + + /* Get file status */ + if (stat(full_path, &statbuf) != 0) { + USB_LOG_ERR("[MTP_RMDIR] Failed to stat: %s\n", full_path); + ret = -1; + full_path[current_len] = '\0'; /* Restore original path */ + continue; + } + + /* If it is a subdirectory */ + if (S_ISDIR(statbuf.st_mode)) { + /* Check stack depth */ + if (stack_top >= MAX_PATH_DEPTH - 1) { + USB_LOG_ERR("[MTP_RMDIR] Directory depth exceeds %d levels: %s\n", MAX_PATH_DEPTH, full_path); + closedir(dir); + return -1; + } + + /* Save current path length and enter subdirectory */ + stack_top++; + depth_len[stack_top] = strlen(full_path); + has_subdir = 1; + break; + } else { + /* If it is a file, delete directly */ + if (unlink(full_path) != 0) { + USB_LOG_ERR("[MTP_RMDIR] Failed to unlink file: %s\n", full_path); + ret = -1; + } + full_path[current_len] = '\0'; /* Restore original path */ + } + } + + closedir(dir); + + /* If no subdirectory, try to delete current directory again and fallback */ + if (!has_subdir) { + if (rmdir(full_path) != 0) { + USB_LOG_ERR("[MTP_RMDIR] Failed to remove directory: %s\n", full_path); + ret = -1; + } + stack_top--; + if (stack_top >= 0) { + full_path[depth_len[stack_top]] = '\0'; /* Fallback to parent directory */ + } + } + } + + return ret; +} + +MTP_DIR *usbd_mtp_opendir(const char *path) +{ + return opendir(path); +} + +int usbd_mtp_closedir(MTP_DIR *d) +{ + DIR *dir = (DIR *)d; + return closedir(dir); +} + +struct mtp_dirent *usbd_mtp_readdir(MTP_DIR *d) +{ + DIR *dir = (DIR *)d; + struct dirent *dirent; + static struct mtp_dirent mtp_dirent; + + dirent = readdir(dir); + if (dirent == NULL) + return NULL; + + mtp_dirent.d_type = dirent->d_type; + mtp_dirent.d_namlen = dirent->d_namlen; + mtp_dirent.d_reclen = dirent->d_reclen; + strcpy(mtp_dirent.d_name, dirent->d_name); + + return &mtp_dirent; +} + +MTP_DIRENT *usbd_mtp_readdir_raw(MTP_DIR *d) +{ + DIR *dir = (DIR *)d; + struct dirent *dirent = readdir(dir); + if (dirent == NULL) { + USB_LOG_DBG("[MTP_READDIR] readdir returned NULL\r\n"); + } else { + USB_LOG_DBG("[MTP_READDIR] Got file: %s (len=%d)\r\n", dirent->d_name, dirent->d_namlen); + } + return (MTP_DIRENT *)dirent; +} + +int usbd_mtp_make_fullpath(char *path, MTP_DIRENT *d) +{ + struct dirent *dirent = (struct dirent *)d; + strcat(path, "/"); + strcat(path, dirent->d_name); + return 0; +} + +int usbd_mtp_get_file_info(void *d, + char *file_name, + uint8_t *file_name_len, + uint32_t *protection_status) +{ + DIR *dir = (DIR *)d; + struct dirent *dirent; + + dirent = readdir(dir); + if (dirent == NULL) { + USB_LOG_DBG("[MTP_READDIR] readdir returned NULL\r\n"); + return 0; + } + + *file_name_len = dirent->d_namlen; + strcpy(file_name, dirent->d_name); + *protection_status = 0; + + USB_LOG_DBG("[MTP_READDIR] Got file: %s (len=%d)\r\n", dirent->d_name, dirent->d_namlen); + + return 1; /* if still read the file, please return 1 */ +} + +/* directory operation */ +int usbd_mtp_unlink(const char *pathname) +{ + return unlink(pathname); +} + +int usbd_mtp_open(const char *path, int flags, int mode) +{ + return open(path, flags, mode); +} + +int usbd_mtp_close(int fd) +{ + return close(fd); +} + +int usbd_mtp_read(int fd, void *buf, size_t len) +{ + return read(fd, (char *)buf, len); +} + +int usbd_mtp_write(int fd, const void *buf, size_t len) +{ + return write(fd, buf, len); +} + +int usbd_mtp_statfs(const char *path, struct mtp_statfs *buf) +{ + struct statfs s; + if(statfs(path, &s) < 0) + return -1; + buf->f_bfree = s.f_bfree; + buf->f_blocks = s.f_blocks; + buf->f_bsize = s.f_bsize; + USB_LOG_DBG("max_capability:%lld free_space:%lld\n", + (uint64_t)buf->f_bsize * (uint64_t)buf->f_blocks, + (uint64_t)buf->f_bsize * (uint64_t)buf->f_bfree); + + return 0; +} + +int usbd_mtp_stat(const char *file, struct stat *buf) +{ + struct stat s; + if(stat(file, &s) < 0) + return -1; + + *buf = s; + + return 0; +} + +uint32_t usbd_mtp_get_file_size(const char *file) +{ + struct stat s; + if(stat(file, &s) < 0) + return -1; + + return s.st_size; +} + +int usbd_mtp_get_fullpath(char *buf, const char *directory, const char *filename) +{ + char *fullpath; + fullpath = dfs_normalize_path(directory, filename); + strcpy(buf, fullpath); + rt_free(fullpath); + return 0; +} diff --git a/src/driver/usb/mtp/usbd_mtp_file.h b/src/driver/usb/mtp/usbd_mtp_file.h new file mode 100644 index 000000000..b7946bbcb --- /dev/null +++ b/src/driver/usb/mtp/usbd_mtp_file.h @@ -0,0 +1,82 @@ +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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 __USBD_MTP_FILE_H__ +#define __USBD_MTP_FILE_H__ + +#include +#include +#include "usbd_core.h" + +/* gcc toolchain does not implement dirent.h, so we define our own MTP_DIR and mtp_dirent */ + +typedef void MTP_DIR; + +typedef void MTP_DIRENT; + +struct mtp_statfs { + size_t f_bsize; /* block size */ + size_t f_blocks; /* total data blocks in file system */ + size_t f_bfree; /* free blocks in file system */ +}; + +struct mtp_dirent { + uint8_t d_type; /* The type of the file */ + uint8_t d_namlen; /* The length of the not including the terminating null file name */ + uint16_t d_reclen; /* length of this record */ + char d_name[CONFIG_USBDEV_MTP_MAX_PATHNAME]; /* The null-terminated file name */ +}; + +struct mtp_file { + uint32_t handle; + int fd; + int offset; + int32_t data_length; +}; + +const char *usbd_mtp_fs_root_path(void); +const char *usbd_mtp_fs_description(void); + +int usbd_mtp_mkdir(const char *path); +int usbd_mtp_rmdir(const char *path); +int usbd_mtp_rmdir_recursive(const char *path); +MTP_DIR *usbd_mtp_opendir(const char *name); +int usbd_mtp_closedir(MTP_DIR *d); +struct mtp_dirent *usbd_mtp_readdir(MTP_DIR *d); + +int usbd_mtp_statfs(const char *path, struct mtp_statfs *buf); +int usbd_mtp_stat(const char *file, struct stat *buf); + +int usbd_mtp_open(const char *path, int flags, int mode); +int usbd_mtp_close(int fd); +int usbd_mtp_read(int fd, void *buf, size_t len); +int usbd_mtp_write(int fd, const void *buf, size_t len); + +int usbd_mtp_unlink(const char *path); + +MTP_DIRENT *usbd_mtp_readdir_raw(MTP_DIR *d); + +int usbd_mtp_get_file_info(void *d, + char *file_name, + uint8_t *file_name_len, + uint32_t *protection_status); + +int usbd_mtp_set_file_mtime(const char *dfs_path, struct tm *p_tm); +int usbd_mtp_make_fullpath(char *path, MTP_DIRENT *d); +int usbd_mtp_get_fullpath(char *buf, const char *directory, const char *filename); +uint32_t usbd_mtp_get_file_size(const char *file); + +#endif \ No newline at end of file diff --git a/src/driver/usb/mtp/usbd_mtp_object.c b/src/driver/usb/mtp/usbd_mtp_object.c new file mode 100644 index 000000000..be69f7220 --- /dev/null +++ b/src/driver/usb/mtp/usbd_mtp_object.c @@ -0,0 +1,790 @@ +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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. + *****************************************************************************/ + +#include "driver/usb/mtp/usbd_mtp_object.h" +#include "driver/usb/mtp/usbd_mtp.h" +#include "usb_log.h" +#include +#include +#include + +/* Hash function: Generate stable handle based on path */ +/* Using FNV-1a hash algorithm variant */ +static uint32_t mtp_hash_path(uint32_t storage_id, uint32_t parent_handle, const char *path) { + uint32_t hash = 2166136261u; /* FNV offset basis */ + + /* Mix storage_id and parent_handle */ + hash ^= (storage_id << 8) | (storage_id >> 24); + hash *= 16777619u; /* FNV prime */ + + hash ^= parent_handle; + hash *= 16777619u; + + /* Mix path string */ + const unsigned char *str = (const unsigned char *)path; + while (*str) { + hash ^= *str++; + hash *= 16777619u; + } + + /* Ensure hash value is within valid range (avoid special values) */ + /* MTP specification: 0 means invalid, 0xFFFFFFFF means root directory */ + /* Map hash to [1, 0xFFFFFFFE] range */ + hash = hash & 0xFFFFFFFEu; /* Clear lowest bit to avoid 0 */ + if (hash == 0) hash = 1; /* Ensure non-zero */ + if (hash == 0xFFFFFFFF) hash = 0xFFFFFFFE; /* Avoid using root directory marker */ + + return hash; +} + +/* Initialize object manager */ +int mtp_object_manager_init(mtp_object_manager_t *manager) { + if (!manager) return -1; + + /* Fully initialize structure */ + memset(manager, 0, sizeof(mtp_object_manager_t)); + + /* Create mutex */ + manager->mutex = rt_mutex_create("mtp_obj", RT_IPC_FLAG_PRIO); + if (!manager->mutex) { + return -1; + } + + USB_LOG_DBG("MTP object manager initialized (hash mode)\n"); + return 0; +} + +/* Deinitialize object manager */ +void mtp_object_manager_deinit(mtp_object_manager_t *manager) { + if (!manager) return; + + if (manager->mutex) { + rt_mutex_delete(manager->mutex); + manager->mutex = NULL; + } + + USB_LOG_DBG("MTP object manager deinitialized\n"); +} + +/* Find object by handle (must be called while holding lock) */ +static int mtp_find_object_by_handle_unlocked(mtp_object_manager_t *manager, + uint32_t handle, + mtp_object_t **obj) { + if (!manager || handle == 0 || !obj) return -1; + + /* Linear search for object (handle == matching handle) */ + for (uint32_t i = 0; i < MTP_HANDLE_POOL_SIZE; i++) { + if (manager->objects[i].handle == handle) { + *obj = &manager->objects[i]; + return 0; + } + } + + return -1; /* Not found */ +} + +/* Forward declaration: Rebuild full path of object (unlocked version) */ +static int mtp_rebuild_full_path_unlocked(mtp_object_manager_t *manager, uint32_t handle, + char *full_path, size_t max_len); + +/* Allocate handle (Hash-based allocation, automatic persistence) */ +/* Same path always generates same handle, no additional persistence mechanism needed */ +int mtp_alloc_handle(mtp_object_manager_t *manager, uint32_t storage_id, + uint32_t parent_handle, const char *path, + uint16_t format, uint32_t size, bool is_dir) { + if (!manager || !path) return 0; + + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + /* ========== Hash-based handle allocation ========== */ + /* Same path generates same handle, naturally supports persistence */ + uint32_t new_handle = mtp_hash_path(storage_id, parent_handle, path); + + /* Check if handle already exists */ + mtp_object_t *existing_obj = NULL; + if (mtp_find_object_by_handle_unlocked(manager, new_handle, &existing_obj) == 0) { + /* Handle already exists, update object info (same path, reuse directly) */ + USB_LOG_DBG("[MTP_REUSE] Reusing hash handle 0x%lx for %s\n", + (unsigned long)new_handle, path); + + existing_obj->format = format; + existing_obj->size = size; + existing_obj->is_dir = is_dir ? 1 : 0; + existing_obj->timestamp = rt_tick_get(); + + rt_mutex_release(manager->mutex); + return new_handle; + } + + /* ========== Handle does not exist, allocate new object ========== */ + USB_LOG_DBG("[MTP_ALLOC] Allocated hash handle 0x%lx for %s\n", + (unsigned long)new_handle, path); + + /* Find free slot */ + int obj_index = -1; + for (uint32_t i = 0; i < MTP_HANDLE_POOL_SIZE; i++) { + if (manager->objects[i].handle == 0) { + obj_index = (int)i; + break; + } + } + + if (obj_index < 0) { + USB_LOG_ERR("Object pool full!\n"); + rt_mutex_release(manager->mutex); + return 0; + } + + /* Extract object name (last component of path) */ + const char *name_start = strrchr(path, '/'); + if (name_start) { + name_start++; /* Skip '/' */ + } else { + name_start = path; + } + + size_t name_len = strlen(name_start); + if (name_len == 0 || name_len >= sizeof(manager->objects[0].name)) { + USB_LOG_ERR("Invalid name length: %zu\n", name_len); + rt_mutex_release(manager->mutex); + return 0; + } + + /* Initialize object */ + mtp_object_t *obj = &manager->objects[obj_index]; + + /* Increment object count */ + manager->total_objects++; + + obj->handle = new_handle; + obj->storage_id = storage_id; + obj->parent_handle = parent_handle; + obj->format = format; + obj->size = size; + obj->is_dir = is_dir ? 1 : 0; + obj->is_hidden = 0; + obj->is_readonly = 0; + obj->timestamp = rt_tick_get(); + + /* Only store object name (not full path) */ + strncpy(obj->name, name_start, sizeof(obj->name) - 1); + obj->name[sizeof(obj->name) - 1] = '\0'; + + USB_LOG_DBG("Allocated handle 0x%lx for %s (parent=0x%lx)\n", + (unsigned long)obj->handle, path, (unsigned long)parent_handle); + + rt_mutex_release(manager->mutex); + return obj->handle; +} + +/* Free handle */ +int mtp_free_handle(mtp_object_manager_t *manager, uint32_t handle) { + if (!manager || handle == 0) return -1; + + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + mtp_object_t *obj; + if (mtp_find_object_by_handle_unlocked(manager, handle, &obj) != 0) { + rt_mutex_release(manager->mutex); + return -1; + } + + /* Clear object (mark as free) */ + USB_LOG_DBG("Freeing handle 0x%lx (%s)\n", (unsigned long)handle, obj->name); + memset(obj, 0, sizeof(mtp_object_t)); + manager->total_objects--; + + rt_mutex_release(manager->mutex); + return 0; +} + +/* Cascading delete object and its children (using DFS post-order traversal) */ +/* delete_file: Callback function to delete files */ +/* delete_dir: Callback function to delete directories */ +int mtp_free_handle_recursive(mtp_object_manager_t *manager, + uint32_t handle, + mtp_delete_file_fn delete_file, + mtp_delete_dir_fn delete_dir) { + if (!manager || handle == 0) return -1; + if (!delete_file || !delete_dir) return -1; + + uint32_t *delete_stack = NULL; + uint16_t stack_top = 0; + char path_buffer[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + + delete_stack = (uint32_t *)usb_osal_malloc(sizeof(uint32_t) * manager->total_objects); + if (delete_stack == NULL) { + USB_LOG_ERR("Failed to allocate memory for delete stack\n"); + return -1; + } + + /* Push initial handle onto stack */ + delete_stack[stack_top++] = handle; + + while (stack_top > 0) { + uint32_t cur_handle = delete_stack[--stack_top]; /* Pop */ + + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + /* Get current object */ + mtp_object_t *obj = NULL; + int found = mtp_find_object_by_handle_unlocked(manager, cur_handle, &obj); + + if (found != 0 || !obj) { + rt_mutex_release(manager->mutex); + USB_LOG_DBG("[MTP_DEL] Skip removed handle 0x%lx\n", (unsigned long)cur_handle); + continue; /* Object already deleted, skip */ + } + + if (obj->format == MTP_FORMAT_ASSOCIATION) { + /* Directory: Check if there are child objects */ + /* static uint32_t children[64]; */ + /* uint32_t child_count = 0; */ + bool need_push_parent = true; + + /* Get child objects while holding lock */ + for (uint32_t i = 0; i < MTP_HANDLE_POOL_SIZE; i++) { + if (manager->objects[i].handle != 0 && + manager->objects[i].parent_handle == cur_handle) { + if (need_push_parent) { + USB_LOG_DBG("[MTP_DEL] Directory handle 0x%lx has children, postponing delete\n", + (unsigned long)cur_handle); + need_push_parent = false; + if (stack_top < manager->total_objects) { + delete_stack[stack_top++] = cur_handle; + } + } + if (stack_top < manager->total_objects) { + delete_stack[stack_top++] = manager->objects[i].handle; + } + } + } + + if (stack_top >= manager->total_objects) { + USB_LOG_ERR("Delete stack overflow!\n"); + rt_mutex_release(manager->mutex); + usb_osal_free(delete_stack); + return -1; + } + + if (need_push_parent == false) { + /* Has children: Push current directory back onto stack (delete parent later) */ + rt_mutex_release(manager->mutex); + continue; /* Children already stacked, skip current round deletion */ + } + /* No children: Continue with delete empty directory logic */ + } + + /* Rebuild path (must be done while holding lock) */ + int path_ret = mtp_rebuild_full_path_unlocked(manager, cur_handle, + path_buffer, sizeof(path_buffer)); + rt_mutex_release(manager->mutex); + + /* Execute file system delete operation (not within lock to avoid deadlock) */ + if (path_ret == 0) { + if (obj->format == MTP_FORMAT_ASSOCIATION) { + delete_dir(path_buffer); /* Delete empty directory */ + } else { + delete_file(path_buffer); /* Delete file */ + } + } + + /* Free handle */ + mtp_free_handle(manager, cur_handle); + } + + usb_osal_free(delete_stack); + return 0; +} + +/* Rebuild full path of object (unlocked version, must be called while holding lock) */ +/* Used for internal path checking in mtp_alloc_handle to avoid deadlock */ +/* Optimization: Store object pointers directly to avoid repeated lookups */ +static int mtp_rebuild_full_path_unlocked(mtp_object_manager_t *manager, uint32_t handle, + char *full_path, size_t max_len) { + if (!manager || handle == 0 || !full_path || max_len == 0) return -1; + + /* Store object pointers (32 bytes stack space, acceptable) */ + mtp_object_t *components[MTP_MAX_DIR_DEPTH]; + int component_count = 0; + uint32_t current_handle = handle; + + /* Traverse upwards to collect object pointers (maximum 8 levels) */ + while (component_count < MTP_MAX_DIR_DEPTH && current_handle != 0xFFFFFFFF) { + mtp_object_t *obj = NULL; + if (mtp_find_object_by_handle_unlocked(manager, current_handle, &obj) != 0 || !obj) { + break; /* Object does not exist */ + } + + components[component_count++] = obj; + current_handle = obj->parent_handle; + + if (obj->parent_handle == 0xFFFFFFFF) { + break; /* Reached root directory */ + } + } + + if (component_count == 0) return -1; + + /* Reverse concatenate full path (from root to leaf, using safe string operations) */ + full_path[0] = '\0'; + size_t current_len = 0; + + for (int i = component_count - 1; i >= 0; i--) { + mtp_object_t *obj = components[i]; + size_t name_len = strlen(obj->name); + + /* Check if there's space to add "/" and name */ + if (current_len + 1 + name_len + 1 > max_len) { + USB_LOG_DBG("Path too long during rebuild\n"); + return -1; /* Path too long */ + } + + /* Add path separator */ + if (current_len > 0 || full_path[0] != '/') { + strcpy(full_path + current_len, "/"); + current_len += 1; + } + + /* Add name */ + strcpy(full_path + current_len, obj->name); + current_len += name_len; + } + + if (current_len >= max_len) { + USB_LOG_DBG("Path too long, current_len=%d, max_len=%d\n", current_len, max_len); + return -1; /* Path too long */ + } + + full_path[current_len] = '\0'; + return 0; +} + +/* Get object by handle */ +int mtp_get_object_by_handle(mtp_object_manager_t *manager, uint32_t handle, + mtp_object_t **obj) { + if (!manager || handle == 0 || !obj) return -1; + + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + int ret = mtp_find_object_by_handle_unlocked(manager, handle, obj); + + rt_mutex_release(manager->mutex); + return ret; +} + +/* Get parent handle by handle */ +int mtp_get_parent_by_handle(mtp_object_manager_t *manager, uint32_t handle, + uint32_t *parent_handle) { + mtp_object_t *obj = NULL; + if (!manager || handle == 0 || !parent_handle) return -1; + + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + int ret = mtp_find_object_by_handle_unlocked(manager, handle, &obj); + if (ret == 0 && obj) { + *parent_handle = obj->parent_handle; + } + + rt_mutex_release(manager->mutex); + return ret; +} + +/* Rebuild full path of object (recursively search upwards for parent objects) */ +/* Optimized version: Use handle array instead of string array, greatly reduce stack usage (2048 bytes -> 32 bytes) */ +int mtp_rebuild_full_path(mtp_object_manager_t *manager, uint32_t handle, + char *full_path, size_t max_len) { + if (!manager || handle == 0 || !full_path || max_len == 0) return -1; + + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + /* Optimization: Only store handle (4 bytes) instead of string (64 bytes), greatly reduce stack usage */ + /* Reduced from 2048 bytes (32×64) to 32 bytes (8×4) */ + uint32_t component_handles[MTP_MAX_DIR_DEPTH]; + int component_count = 0; + uint32_t current_handle = handle; + bool success = false; + + /* Traverse upwards to build path components (maximum 8 levels depth) */ + /* Actual file systems rarely exceed 8 levels depth, this limit is sufficient */ + for (int depth = 0; depth < MTP_MAX_DIR_DEPTH && current_handle != 0xFFFFFFFF; depth++) { + mtp_object_t *obj = NULL; + int ret = mtp_find_object_by_handle_unlocked(manager, current_handle, &obj); + if (ret != 0 || !obj) { + break; /* Object does not exist, stop */ + } + + /* Store handle instead of string (reduce stack usage) */ + component_handles[component_count++] = current_handle; + current_handle = obj->parent_handle; + + /* Check if reached root directory */ + if (obj->parent_handle == 0xFFFFFFFF) { + success = true; + break; + } + } + + if (success && component_count > 0) { + /* Reverse concatenate full path (from root to leaf, using safe string operations) */ + full_path[0] = '\0'; + size_t current_len = 0; + + for (int i = component_count - 1; i >= 0; i--) { + mtp_object_t *obj = NULL; + if (mtp_find_object_by_handle_unlocked(manager, component_handles[i], &obj) != 0) { + rt_mutex_release(manager->mutex); + return -1; /* Object lost */ + } + + size_t name_len = strlen(obj->name); + + /* Check if there's space to add "/" and name */ + if (current_len + 1 + name_len + 1 > max_len) { + rt_mutex_release(manager->mutex); + return -1; /* Path too long */ + } + + /* Add path separator (needed before each component) */ + strcpy(full_path + current_len, "/"); + current_len += 1; + strcpy(full_path + current_len, obj->name); + current_len += name_len; + } + + full_path[current_len] = '\0'; + rt_mutex_release(manager->mutex); + return 0; + } + + rt_mutex_release(manager->mutex); + return -1; +} + +/* MSH command: Display MTP object manager status + * Usage: + * mtp_obj - Show overview statistics + * mtp_obj stat - Show detailed statistics + * mtp_obj handles - Show all handles + * mtp_obj dirs - Show directories only + * mtp_obj files - Show files only + * mtp_obj - Show specific handle details + */ +static int msh_mtp_obj(int argc, char **argv) +{ + mtp_object_manager_t *manager = usbd_mtp_get_obj_manager(); + if (!manager) { + console_printf("MTP object manager not initialized\n"); + return -1; + } + + /* No parameters: Show overview statistics */ + if (argc == 1) { + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + uint32_t used = 0; + uint32_t dirs = 0; + uint32_t files = 0; + + for (uint32_t i = 0; i < MTP_HANDLE_POOL_SIZE; i++) { + if (manager->objects[i].handle != 0) { + used++; + if (manager->objects[i].is_dir) { + dirs++; + } else { + files++; + } + } + } + + rt_mutex_release(manager->mutex); + + console_printf("========== MTP Object Manager Status ==========\n"); + console_printf("Total objects: %lu / %u\n", (unsigned long)manager->total_objects, MTP_HANDLE_POOL_SIZE); + console_printf(" - Dirs: %lu\n", (unsigned long)dirs); + console_printf(" - Files: %lu\n", (unsigned long)files); + console_printf("Usage: %.1f%%\n", (float)used * 100.0f / MTP_HANDLE_POOL_SIZE); + console_printf("\n"); + console_printf("Commands:\n"); + console_printf(" mtp_obj stat - Show detailed statistics\n"); + console_printf(" mtp_obj handles - List all handles\n"); + console_printf(" mtp_obj dirs - List directories only\n"); + console_printf(" mtp_obj files - List files only\n"); + console_printf(" mtp_obj - Show handle details\n"); + return 0; + } + + const char *cmd = argv[1]; + + /* Detailed statistics */ + if (strcmp(cmd, "stat") == 0) { + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + uint32_t used = 0; + uint32_t dirs = 0; + uint32_t files = 0; + uint32_t hidden = 0; + uint32_t readonly = 0; + uint32_t total_size = 0; + + for (uint32_t i = 0; i < MTP_HANDLE_POOL_SIZE; i++) { + if (manager->objects[i].handle != 0) { + used++; + if (manager->objects[i].is_dir) { + dirs++; + } else { + files++; + total_size += manager->objects[i].size; + } + if (manager->objects[i].is_hidden) hidden++; + if (manager->objects[i].is_readonly) readonly++; + } + } + + rt_mutex_release(manager->mutex); + + console_printf("========== MTP Object Manager Statistics ==========\n"); + console_printf("Pool Size: %u\n", MTP_HANDLE_POOL_SIZE); + console_printf("Total Objects: %lu\n", (unsigned long)manager->total_objects); + console_printf("Used Slots: %lu\n", (unsigned long)used); + console_printf("Free Slots: %lu\n", (unsigned long)(MTP_HANDLE_POOL_SIZE - used)); + console_printf("Usage: %.2f%%\n", (float)used * 100.0f / MTP_HANDLE_POOL_SIZE); + console_printf("\n"); + console_printf("Object Types:\n"); + console_printf(" Directories: %lu\n", (unsigned long)dirs); + console_printf(" Files: %lu\n", (unsigned long)files); + console_printf("\n"); + console_printf("Attributes:\n"); + console_printf(" Hidden: %lu\n", (unsigned long)hidden); + console_printf(" Read-only: %lu\n", (unsigned long)readonly); + console_printf("\n"); + console_printf("Total File Size: %lu bytes (%.2f KB)\n", + (unsigned long)total_size, (float)total_size / 1024.0f); + return 0; + } + + /* Show all handles */ + if (strcmp(cmd, "handles") == 0) { + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + console_printf("========== MTP Object Handles ==========\n"); + console_printf("%-10s %-6s %-10s %-8s %-10s %s\n", + "Handle", "Type", "Format", "Size", "Parent", "Name"); + console_printf("%s\n", "------------------------------------------------------------"); + + uint32_t count = 0; + for (uint32_t i = 0; i < MTP_HANDLE_POOL_SIZE; i++) { + if (manager->objects[i].handle != 0) { + mtp_object_t *obj = &manager->objects[i]; + const char *type = obj->is_dir ? "DIR " : "FILE"; + + char parent_str[16]; + if (obj->parent_handle == 0xFFFFFFFF) { + strcpy(parent_str, "ROOT"); + } else if (obj->parent_handle == 0) { + strcpy(parent_str, "-"); + } else { + snprintf(parent_str, sizeof(parent_str), "0x%08lx", + (unsigned long)obj->parent_handle); + } + + console_printf("0x%08lx %-6s 0x%04x %-8lu %s %s\n", + (unsigned long)obj->handle, + type, + obj->format, + (unsigned long)obj->size, + parent_str, + obj->name); + count++; + } + } + + rt_mutex_release(manager->mutex); + + console_printf("\nTotal: %lu objects\n", (unsigned long)count); + return 0; + } + + /* Show directories only */ + if (strcmp(cmd, "dirs") == 0) { + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + console_printf("========== MTP Directories ==========\n"); + console_printf("%-10s %-10s %-10s %s\n", "Handle", "Format", "Parent", "Name"); + console_printf("%s\n", "----------------------------------------------"); + + uint32_t count = 0; + for (uint32_t i = 0; i < MTP_HANDLE_POOL_SIZE; i++) { + if (manager->objects[i].handle != 0 && manager->objects[i].is_dir) { + mtp_object_t *obj = &manager->objects[i]; + + char parent_str[16]; + if (obj->parent_handle == 0xFFFFFFFF) { + strcpy(parent_str, "ROOT"); + } else if (obj->parent_handle == 0) { + strcpy(parent_str, "-"); + } else { + snprintf(parent_str, sizeof(parent_str), "0x%08lx", + (unsigned long)obj->parent_handle); + } + + console_printf("0x%08lx 0x%04x %s %s\n", + (unsigned long)obj->handle, + obj->format, + parent_str, + obj->name); + count++; + } + } + + rt_mutex_release(manager->mutex); + + console_printf("\nTotal: %lu directories\n", (unsigned long)count); + return 0; + } + + /* Show files only */ + if (strcmp(cmd, "files") == 0) { + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + console_printf("========== MTP Files ==========\n"); + console_printf("%-10s %-6s %-10s %-10s %s\n", + "Handle", "Format", "Size", "Parent", "Name"); + console_printf("%s\n", "--------------------------------------------------------"); + + uint32_t count = 0; + uint32_t total_size = 0; + for (uint32_t i = 0; i < MTP_HANDLE_POOL_SIZE; i++) { + if (manager->objects[i].handle != 0 && !manager->objects[i].is_dir) { + mtp_object_t *obj = &manager->objects[i]; + + char parent_str[16]; + if (obj->parent_handle == 0xFFFFFFFF) { + strcpy(parent_str, "ROOT"); + } else if (obj->parent_handle == 0) { + strcpy(parent_str, "-"); + } else { + snprintf(parent_str, sizeof(parent_str), "0x%08lx", + (unsigned long)obj->parent_handle); + } + + console_printf("0x%08lx %-6s %-10lu %s %s\n", + (unsigned long)obj->handle, + "FILE", + (unsigned long)obj->size, + parent_str, + obj->name); + total_size += obj->size; + count++; + } + } + + rt_mutex_release(manager->mutex); + + console_printf("\nTotal: %lu files, %lu bytes (%.2f KB)\n", + (unsigned long)count, (unsigned long)total_size, (float)total_size / 1024.0f); + return 0; + } + + /* Show specific handle details */ + if (argc == 2) { + /* Try to parse as handle value */ + uint32_t handle = 0; + if (strncmp(cmd, "0x", 2) == 0 || strncmp(cmd, "0X", 2) == 0) { + handle = (uint32_t)strtoul(cmd, NULL, 16); + } else { + handle = (uint32_t)atoi(cmd); + } + + if (handle != 0) { + rt_mutex_take(manager->mutex, RT_WAITING_FOREVER); + + mtp_object_t *obj = NULL; + int ret = mtp_find_object_by_handle_unlocked(manager, handle, &obj); + + if (ret == 0 && obj) { + char path_buffer[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + int path_ret = mtp_rebuild_full_path_unlocked(manager, handle, + path_buffer, sizeof(path_buffer)); + + console_printf("========== MTP Object Details ==========\n"); + console_printf("Handle: 0x%08lx (%lu)\n", + (unsigned long)obj->handle, (unsigned long)obj->handle); + console_printf("Name: %s\n", obj->name); + if (path_ret == 0) { + console_printf("Full Path: %s\n", path_buffer); + } + console_printf("Storage ID: 0x%08lx\n", (unsigned long)obj->storage_id); + console_printf("Parent: 0x%08lx %s\n", + (unsigned long)obj->parent_handle, + (obj->parent_handle == 0xFFFFFFFF) ? "(ROOT)" : + (obj->parent_handle == 0) ? "(NONE)" : ""); + console_printf("Format: 0x%04x\n", obj->format); + console_printf("Type: %s\n", obj->is_dir ? "Directory" : "File"); + console_printf("Size: %lu bytes\n", (unsigned long)obj->size); + console_printf("Hidden: %s\n", obj->is_hidden ? "Yes" : "No"); + console_printf("Read-only: %s\n", obj->is_readonly ? "Yes" : "No"); + console_printf("Timestamp: %lu ticks\n", (unsigned long)obj->timestamp); + + /* Show child objects */ + if (obj->is_dir) { + uint32_t children[64]; + uint32_t child_count = 0; + + for (uint32_t i = 0; i < MTP_HANDLE_POOL_SIZE; i++) { + if (manager->objects[i].handle != 0 && + manager->objects[i].parent_handle == handle) { + if (child_count < 64) { + children[child_count++] = manager->objects[i].handle; + } + } + } + + if (child_count > 0) { + console_printf("\nChildren (%lu):\n", (unsigned long)child_count); + for (uint32_t i = 0; i < child_count; i++) { + mtp_object_t *child_obj = NULL; + if (mtp_find_object_by_handle_unlocked(manager, children[i], &child_obj) == 0) { + console_printf(" [0x%08lx] %s%s\n", + (unsigned long)child_obj->handle, + child_obj->name, + child_obj->is_dir ? "/" : ""); + } + } + } + } + + rt_mutex_release(manager->mutex); + return 0; + } else { + rt_mutex_release(manager->mutex); + console_printf("Handle 0x%08lx not found\n", (unsigned long)handle); + return -1; + } + } + } + + /* Unknown command */ + console_printf("Usage:\n"); + console_printf(" mtp_obj - Show overview\n"); + console_printf(" mtp_obj stat - Show statistics\n"); + console_printf(" mtp_obj handles - List all handles\n"); + console_printf(" mtp_obj dirs - List directories\n"); + console_printf(" mtp_obj files - List files\n"); + console_printf(" mtp_obj - Show handle details\n"); + return -1; +} +MSH_CMD_EXPORT(msh_mtp_obj, MTP object manager status); diff --git a/src/driver/usb/mtp/usbd_mtp_object.h b/src/driver/usb/mtp/usbd_mtp_object.h new file mode 100644 index 000000000..ac9aa0df2 --- /dev/null +++ b/src/driver/usb/mtp/usbd_mtp_object.h @@ -0,0 +1,73 @@ +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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 __USBD_MTP_OBJECT_H__ +#define __USBD_MTP_OBJECT_H__ + +#include +#include +#include +#include "usb_config.h" +#include "driver/usb/mtp/usb_mtp.h" + +#define MTP_HANDLE_POOL_SIZE CONFIG_USBDEV_MTP_MAX_OBJECTS /* handle pool size */ +#define MTP_MAX_DIR_DEPTH 16 /* max directory depth */ + +/* MTP object entry */ +typedef struct { + uint32_t handle; /* MTP handle (handle == 0 as empty) */ + uint32_t storage_id; /* Storage ID */ + uint32_t parent_handle; /* Parent object handle (0xFFFFFFFF as root directory) */ + char name[64]; /* Object name (filename or directory name, max 63 bytes + '\0') */ + uint32_t size; /* File size (directory is 0) */ + uint32_t timestamp; /* timestamp */ + uint16_t format; /* Object format */ + uint8_t is_dir; /* is directory */ + uint8_t is_hidden; /* is hidden */ + uint8_t is_readonly; /* is readonly */ +} mtp_object_t; + +/* objects manager */ +typedef struct { + mtp_object_t objects[MTP_HANDLE_POOL_SIZE]; /* objects pool */ + uint32_t next_handle; /* Next allocated handle */ + uint32_t total_objects; /* Current number of objects */ + rt_mutex_t mutex; /* Mutex lock */ +} mtp_object_manager_t; + +/* delete callback function type (for cascade delete) */ +typedef int (*mtp_delete_file_fn)(const char *path); /* delete file callback */ +typedef int (*mtp_delete_dir_fn)(const char *path); /* delete directory callback */ + +int mtp_object_manager_init(mtp_object_manager_t *manager); +void mtp_object_manager_deinit(mtp_object_manager_t *manager); + +int mtp_alloc_handle(mtp_object_manager_t *manager, uint32_t storage_id, + uint32_t parent_handle, const char *path, + uint16_t format, uint32_t size, bool is_dir); +int mtp_free_handle(mtp_object_manager_t *manager, uint32_t handle); +int mtp_free_handle_recursive(mtp_object_manager_t *manager, + uint32_t handle, + mtp_delete_file_fn delete_file, + mtp_delete_dir_fn delete_dir); /* cascade delete (including sub-objects) */ +int mtp_get_object_by_handle(mtp_object_manager_t *manager, uint32_t handle, + mtp_object_t **obj); +int mtp_get_parent_by_handle(mtp_object_manager_t *manager, uint32_t handle, + uint32_t *parent_handle); +int mtp_rebuild_full_path(mtp_object_manager_t *manager, uint32_t handle, + char *full_path, size_t max_len); + +#endif /* __USBD_MTP_OBJECT_H__ */ diff --git a/src/driver/usb/mtp/usbd_mtp_support.h b/src/driver/usb/mtp/usbd_mtp_support.h new file mode 100644 index 000000000..9d7105107 --- /dev/null +++ b/src/driver/usb/mtp/usbd_mtp_support.h @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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 USBD_MTP_SUPPORT_H +#define USBD_MTP_SUPPORT_H + +#define MTP_VERSION 100 + +typedef struct _profile_property { + uint16_t prop_code; + uint16_t data_type; + uint8_t getset; + uint64_t default_value; + uint32_t group_code; + uint8_t form_flag; + uint16_t format_code; +} profile_property; + +typedef struct _format_property { + uint16_t format_code; + uint16_t *properties; +} formats_property; + +const char mtp_extension_string[] = "microsoft.com: 1.0; android.com: 1.0;"; + +const uint16_t supported_op[] = { + MTP_OPERATION_GET_DEVICE_INFO, //0x1001 + MTP_OPERATION_OPEN_SESSION, //0x1002 + MTP_OPERATION_CLOSE_SESSION, //0x1003 + MTP_OPERATION_GET_STORAGE_IDS, //0x1004 + MTP_OPERATION_GET_STORAGE_INFO, //0x1005 + //MTP_OPERATION_GET_NUM_OBJECTS ,//0x1006 + MTP_OPERATION_GET_OBJECT_HANDLES, //0x1007 + MTP_OPERATION_GET_OBJECT_INFO, //0x1008 + MTP_OPERATION_GET_OBJECT, //0x1009 + //MTP_OPERATION_GET_THUMB ,//0x100A + MTP_OPERATION_DELETE_OBJECT, //0x100B + MTP_OPERATION_SEND_OBJECT_INFO, //0x100C + MTP_OPERATION_SEND_OBJECT, //0x100D + MTP_OPERATION_GET_DEVICE_PROP_DESC, //0x1014 + // MTP_OPERATION_GET_DEVICE_PROP_VALUE ,//0x1015 + // MTP_OPERATION_SET_DEVICE_PROP_VALUE ,//0x1016 + //MTP_OPERATION_RESET_DEVICE_PROP_VALUE ,//0x1017 + // MTP_OPERATION_GET_PARTIAL_OBJECT ,//0x101B + MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED, //0x9801 + // MTP_OPERATION_GET_OBJECT_PROP_DESC, //0x9802 + // MTP_OPERATION_GET_OBJECT_PROP_VALUE ,//0x9803 + // MTP_OPERATION_SET_OBJECT_PROP_VALUE ,//0x9804 + // MTP_OPERATION_GET_OBJECT_PROP_LIST ,//0x9805 + //MTP_OPERATION_GET_OBJECT_REFERENCES ,//0x9810 + //MTP_OPERATION_SET_OBJECT_REFERENCES ,//0x9811 + // MTP_OPERATION_GET_PARTIAL_OBJECT_64 ,//0x95C1 + // MTP_OPERATION_SEND_PARTIAL_OBJECT ,//0x95C2 + // MTP_OPERATION_TRUNCATE_OBJECT ,//0x95C3 + // MTP_OPERATION_BEGIN_EDIT_OBJECT ,//0x95C4 + // MTP_OPERATION_END_EDIT_OBJECT //0x95C5 +}; + +int supported_op_size = sizeof(supported_op); + +const uint16_t supported_event[] = { + MTP_EVENT_OBJECT_ADDED, // 0x4002 + MTP_EVENT_OBJECT_REMOVED, // 0x4003 + MTP_EVENT_STORE_ADDED, // 0x4004 + MTP_EVENT_STORE_REMOVED, // 0x4005 + MTP_EVENT_STORAGE_INFO_CHANGED, // 0x400C + MTP_EVENT_OBJECT_INFO_CHANGED, // 0x4007 + MTP_EVENT_DEVICE_PROP_CHANGED, // 0x4006 + MTP_EVENT_OBJECT_PROP_CHANGED // 0xC801 +}; + +int supported_event_size = sizeof(supported_event); + +const formats_property support_format_properties[] = { + // format code prop code + { MTP_FORMAT_UNDEFINED, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF } }, + { MTP_FORMAT_ASSOCIATION, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF } } +#if 0 + { MTP_FORMAT_TEXT , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_HTML , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_MP4_CONTAINER, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_3GP_CONTAINER, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_WAV , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED,MTP_PROPERTY_ARTIST,MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, + MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, MTP_PROPERTY_NUMBER_OF_CHANNELS,MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_MP3 , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED,MTP_PROPERTY_ARTIST,MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, + MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, MTP_PROPERTY_NUMBER_OF_CHANNELS,MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_MPEG , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_EXIF_JPEG , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, + MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_BMP , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, + MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_GIF , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, + MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_JFIF , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, + MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_WMA , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, + MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, + MTP_PROPERTY_NUMBER_OF_CHANNELS, MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_OGG , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, + MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, + MTP_PROPERTY_NUMBER_OF_CHANNELS, MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_AAC , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, + MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, + MTP_PROPERTY_NUMBER_OF_CHANNELS, MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_ABSTRACT_AV_PLAYLIST, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_WPL_PLAYLIST, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_M3U_PLAYLIST, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_PLS_PLAYLIST, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_XML_DOCUMENT, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_FLAC , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_AVI , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_ASF , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_MS_WORD_DOCUMENT, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_MS_EXCEL_SPREADSHEET, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_MS_POWERPOINT_PRESENTATION, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + } +#endif + , + + { 0xFFFF, (uint16_t[]){ 0xFFFF } } + +}; + +const profile_property support_object_properties[] = { + // prop_code data_type getset default_value group_code form_flag format_code + { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000001, 0x00, 0xFFFF }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_UNDEFINED, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_ASSOCIATION, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_TEXT, 0x000000000, 0x00, MTP_FORMAT_TEXT }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_HTML, 0x000000000, 0x00, MTP_FORMAT_HTML }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_WAV, 0x000000000, 0x00, MTP_FORMAT_WAV }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MP3, 0x000000000, 0x00, MTP_FORMAT_MP3 }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MPEG, 0x000000000, 0x00, MTP_FORMAT_MPEG }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_EXIF_JPEG, 0x000000000, 0x00, MTP_FORMAT_EXIF_JPEG }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_BMP, 0x000000000, 0x00, MTP_FORMAT_BMP }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_AIFF, 0x000000000, 0x00, MTP_FORMAT_AIFF }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MPEG, 0x000000000, 0x00, MTP_FORMAT_MPEG }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_WMA, 0x000000000, 0x00, MTP_FORMAT_WMA }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_OGG, 0x000000000, 0x00, MTP_FORMAT_OGG }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_AAC, 0x000000000, 0x00, MTP_FORMAT_AAC }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MP4_CONTAINER, 0x000000000, 0x00, MTP_FORMAT_MP4_CONTAINER }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_3GP_CONTAINER, 0x000000000, 0x00, MTP_FORMAT_3GP_CONTAINER }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_ABSTRACT_AV_PLAYLIST, 0x000000000, 0x00, MTP_FORMAT_ABSTRACT_AV_PLAYLIST }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_WPL_PLAYLIST, 0x000000000, 0x00, MTP_FORMAT_WPL_PLAYLIST }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_M3U_PLAYLIST, 0x000000000, 0x00, MTP_FORMAT_M3U_PLAYLIST }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_PLS_PLAYLIST, 0x000000000, 0x00, MTP_FORMAT_PLS_PLAYLIST }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_XML_DOCUMENT, 0x000000000, 0x00, MTP_FORMAT_XML_DOCUMENT }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_FLAC, 0x000000000, 0x00, MTP_FORMAT_FLAC }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_AVI, 0x000000000, 0x00, MTP_FORMAT_AVI }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_ASF, 0x000000000, 0x00, MTP_FORMAT_ASF }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MS_WORD_DOCUMENT, 0x000000000, 0x00, MTP_FORMAT_MS_WORD_DOCUMENT }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MS_EXCEL_SPREADSHEET, 0x000000000, 0x00, MTP_FORMAT_MS_EXCEL_SPREADSHEET }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MS_POWERPOINT_PRESENTATION, 0x000000000, 0x00, MTP_FORMAT_MS_POWERPOINT_PRESENTATION }, + + { MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64, 0x00, 0x0000000000000000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_PROTECTION_STATUS, MTP_TYPE_UINT16, 0x00, 0x0000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_DISPLAY_NAME, MTP_TYPE_STR, 0x00, 0x0000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR, 0x01, 0x0000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_DATE_CREATED, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_DATE_MODIFIED, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_PERSISTENT_UID, MTP_TYPE_UINT128, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_NAME, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + + { MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64, 0x00, 0x0000000000000000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_PROTECTION_STATUS, MTP_TYPE_UINT16, 0x00, 0x0000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_DISPLAY_NAME, MTP_TYPE_STR, 0x00, 0x0000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR, 0x01, 0x0000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_DATE_CREATED, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_DATE_MODIFIED, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_PERSISTENT_UID, MTP_TYPE_UINT128, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_NAME, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + + //{MTP_PROPERTY_ASSOCIATION_TYPE, MTP_TYPE_UINT16, 0x00, 0x0001 , 0x000000000 , 0x00 , 0xFFFF }, + { MTP_PROPERTY_ASSOCIATION_DESC, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, 0xFFFF }, + { MTP_PROPERTY_PROTECTION_STATUS, MTP_TYPE_UINT16, 0x00, 0x0000, 0x000000000, 0x00, 0xFFFF }, + { MTP_PROPERTY_HIDDEN, MTP_TYPE_UINT16, 0x00, 0x0000, 0x000000000, 0x00, 0xFFFF }, + + { 0xFFFF, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00 } +}; + +const profile_property support_device_properties[] = { + // prop_code data_type getset default_value group_code form_flag + //{MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER, MTP_TYPE_UINT32, 0x00, 0x00000000 , 0x000000000 , 0x00 }, + //{MTP_DEVICE_PROPERTY_IMAGE_SIZE, MTP_TYPE_UINT32, 0x00, 0x00000000 , 0x000000000 , 0x00 }, + { MTP_DEVICE_PROPERTY_BATTERY_LEVEL, MTP_TYPE_UINT16, 0x00, 0x00000000, 0x000000000, 0x00 }, + { MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME, MTP_TYPE_STR, 0x00, 0x00000000, 0x000000000, 0x00 }, + + { 0xFFFF, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00 } +}; + +#endif \ No newline at end of file diff --git a/src/driver/usb/usbd_cdc_mtp.c b/src/driver/usb/usbd_cdc_mtp.c new file mode 100644 index 000000000..a88f5866a --- /dev/null +++ b/src/driver/usb/usbd_cdc_mtp.c @@ -0,0 +1,465 @@ +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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. + *****************************************************************************/ + +#include "usbd_core.h" +#include "usbd_cdc.h" +#include "driver/usb/mtp/usbd_mtp.h" +#include "driver/usb/usbd_cdc_mtp.h" +#include "hal/usb/usbd_cdc.h" + +/*!< endpoint address */ +#define MTP_IN_EP 0x81 +#define MTP_OUT_EP 0x01 +#define MTP_INT_EP 0x82 + +#define CDC_IN_EP 0x83 +#define CDC_OUT_EP 0x03 +#define CDC_INT_EP 0x84 + +#define USBD_VID CONFIG_USBD_VID +#define USBD_PID CONFIG_USBD_PID +#define USBD_MAX_POWER 500 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN + MTP_DESCRIPTOR_LEN) +#define INTF_NUM 3 // mtp(1) + cdc(2) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#define MTP_EP_MPS 512 +#else +#define CDC_MAX_MPS 64 +#define MTP_EP_MPS 64 +#endif + +static struct usbd_cdc_dev usbd_dev = { 0 }; + +#define WCID_VENDOR_CODE 0x01 + +__ALIGN_BEGIN const uint8_t WCID_StringDescriptor_MSOS[18] __ALIGN_END = { + /////////////////////////////////////// + /// MS OS string descriptor + /////////////////////////////////////// + 0x12, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + /* MSFT100 */ + 'M', 0x00, 'S', 0x00, 'F', 0x00, 'T', 0x00, /* wcChar_7 */ + '1', 0x00, '0', 0x00, '0', 0x00, /* wcChar_7 */ + WCID_VENDOR_CODE, /* bVendorCode */ + 0x00, /* bReserved */ +}; + +__ALIGN_BEGIN const uint8_t WINUSB_WCIDDescriptor[40] __ALIGN_END = { + /////////////////////////////////////// + /// WCID descriptor + /////////////////////////////////////// + 0x28, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x04, 0x00, /* wIndex */ + 0x01, /* bCount */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_7 */ + + /////////////////////////////////////// + /// WCID function descriptor + /////////////////////////////////////// + 0x00, /* bFirstInterfaceNumber */ + 0x01, /* bReserved */ + /* MTP */ + 'M', 'T', 'P', 0x00, 0x00, 0x00, 0x00, 0x00, /* cCID_8 */ + /* */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* cSubCID_8 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_6 */ +}; + +__ALIGN_BEGIN const uint8_t WINUSB_IF0_WCIDProperties[142] __ALIGN_END = { + /////////////////////////////////////// + /// WCID property descriptor + /////////////////////////////////////// + 0x8e, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x05, 0x00, /* wIndex */ + 0x01, 0x00, /* wCount */ + + /////////////////////////////////////// + /// registry propter descriptor + /////////////////////////////////////// + 0x84, 0x00, 0x00, 0x00, /* dwSize */ + 0x01, 0x00, 0x00, 0x00, /* dwPropertyDataType */ + 0x28, 0x00, /* wPropertyNameLength */ + /* DeviceInterfaceGUID */ + 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, /* wcName_20 */ + 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, /* wcName_20 */ + 't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00, /* wcName_20 */ + 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, /* wcName_20 */ + 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00, /* wcName_20 */ + 0x4e, 0x00, 0x00, 0x00, /* dwPropertyDataLength */ + + /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */ + '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00, /* wcData_39 */ + 'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00, /* wcData_39 */ + '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00, /* wcData_39 */ + '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00, /* wcData_39 */ + '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00, /* wcData_39 */ + 'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00, /* wcData_39 */ + '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00, /* wcData_39 */ + 'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00, /* wcData_39 */ + 'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00, /* wcData_39 */ + '6', 0x00, '}', 0x00, 0x00, 0x00, /* wcData_39 */ + +}; + +const uint8_t bos_descriptor[] = { + 0x05, 0x0f, 0x16, 0x00, 0x02, + 0x07, 0x10, 0x02, 0x06, 0x00, 0x00, 0x00, + 0x0a, 0x10, 0x03, 0x00, 0x0f, 0x00, 0x01, 0x01, 0xf4, 0x01 +}; + + +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0200, 0x01) +}; + +static const uint8_t config_descriptor_hs[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MTP_DESCRIPTOR_INIT(0x00, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP, USB_BULK_EP_MPS_HS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), +}; + +static const uint8_t config_descriptor_fs[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MTP_DESCRIPTOR_INIT(0x00, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP, USB_BULK_EP_MPS_FS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), +}; + +static const uint8_t device_quality_descriptor[] = { + USB_DEVICE_QUALIFIER_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, 0x01), +}; + +static const uint8_t other_speed_config_descriptor_hs[] = { + USB_OTHER_SPEED_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MTP_DESCRIPTOR_INIT(0x00, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP, USB_BULK_EP_MPS_FS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), +}; + +static const uint8_t other_speed_config_descriptor_fs[] = { + USB_OTHER_SPEED_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MTP_DESCRIPTOR_INIT(0x00, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP, USB_BULK_EP_MPS_HS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "Firmament", /* Manufacturer */ + "Firmament AutoPilot", /* Product */ + "2025053000", /* Serial Number */ +}; + +/* Serial Number */ +static char serial_number[16] = { 0 }; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + (void)speed; + + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + if (speed == USB_SPEED_HIGH) { + return config_descriptor_hs; + } else if (speed == USB_SPEED_FULL) { + return config_descriptor_fs; + } else { + return NULL; + } +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + (void)speed; + + return device_quality_descriptor; +} + +static const uint8_t *other_speed_config_descriptor_callback(uint8_t speed) +{ + if (speed == USB_SPEED_HIGH) { + return other_speed_config_descriptor_hs; + } else if (speed == USB_SPEED_FULL) { + return other_speed_config_descriptor_fs; + } else { + return NULL; + } +} + +static const char *string_get_serialnumber(void) +{ + uint32_t deviceserial0, deviceserial1, deviceserial2; + + deviceserial0 = *(uint32_t*)UID_BASE; + deviceserial1 = *(uint32_t*)(UID_BASE + 4); + deviceserial2 = *(uint32_t*)(UID_BASE + 8); + + deviceserial0 += deviceserial2; + + rt_snprintf((char *)serial_number, sizeof(serial_number), "FMT-%04x%04x\0", + (uint16_t)deviceserial0, (uint16_t)deviceserial1); + return (const char *)serial_number; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + (void)speed; + + if (index >= (sizeof(string_descriptors) / sizeof(char *))) { + return NULL; + } + if (index == 3) { // Serial Number + return string_get_serialnumber(); + } + return string_descriptors[index]; +} + +const uint8_t *WINUSB_IFx_WCIDProperties[] = { + WINUSB_IF0_WCIDProperties, +}; + +struct usb_msosv1_descriptor msosv1_desc = { + .string = WCID_StringDescriptor_MSOS, + .vendor_code = WCID_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .comp_id_property = WINUSB_IFx_WCIDProperties, +}; + +const struct usb_bos_descriptor bos_desc = { + .string = bos_descriptor, + .string_len = 22 +}; + +const struct usb_descriptor fmt_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .other_speed_descriptor_callback = other_speed_config_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .bos_descriptor = &bos_desc, + .msosv1_descriptor = &msosv1_desc, +}; + +#define MSG_MAX_MPS CDC_MAX_MPS +static bool is_read_busy = false; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[MSG_MAX_MPS]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[MSG_MAX_MPS]; + +struct usb_xfer_msg { + uint8_t *msg_buffer; /** Data buffer */ + void *user_ptr; /** User buf address */ + uint32_t total_nbytes; /** User buffer length */ + uint32_t total_xfer_nbytes; /** The total number of bytes transferred */ + bool is_unalign; /** Is the user buffer misaligned */ +}; + +static struct usb_xfer_msg cdc_tx_msg = {.msg_buffer = write_buffer}; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + hal_usbd_cdc_notify_status(&usbd_dev, USBD_STATUS_DISCONNECT); + console_printf("usb disconnected\r\n"); + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, MSG_MAX_MPS); + hal_usbd_cdc_notify_status(&usbd_dev, USBD_STATUS_CONNECT); + console_printf("usb connected\r\n"); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + uint32_t size; + size = ringbuffer_put(usbd_dev.rx_rb, read_buffer, nbytes); + if (size != nbytes) { + console_printf("usb rx buffer full\r\n"); + } + /* setup next out ep read transfer */ + if ((usbd_dev.rx_rb->size - ringbuffer_getlen(usbd_dev.rx_rb) - 1) >= MSG_MAX_MPS) { + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, MSG_MAX_MPS); + } else { + is_read_busy = true; + } + + hal_usbd_cdc_notify_status(&usbd_dev, USBD_STATUS_RX); +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + cdc_tx_msg.total_xfer_nbytes += nbytes; + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); + } else { + /* unalign transfer */ + if (cdc_tx_msg.is_unalign) + { + if (cdc_tx_msg.total_xfer_nbytes < cdc_tx_msg.total_nbytes) + { + int ret = 0; + uint32_t bufsz = cdc_tx_msg.total_nbytes - cdc_tx_msg.total_xfer_nbytes; + uint8_t *ptr = (uint8_t *)cdc_tx_msg.user_ptr + cdc_tx_msg.total_xfer_nbytes; + if (bufsz > MSG_MAX_MPS) + bufsz = MSG_MAX_MPS; + memcpy(cdc_tx_msg.msg_buffer, ptr, bufsz); + /** + * @brief started next transmit + */ + ret = usbd_ep_start_write(busid, CDC_IN_EP, cdc_tx_msg.msg_buffer, bufsz); + if (ret) + { + USB_LOG_ERR("cdc ep write err:%d\n", ret); + } + else + { + return; + } + } + } + + hal_usbd_cdc_notify_status(&usbd_dev, USBD_STATUS_TX_COMPLETE); + } +} + +/* endpoint call back */ +struct usbd_endpoint cdc_out_ep = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +static struct usbd_interface intf0; +static struct usbd_interface intf1; + +static struct usbd_interface intf2; + +void mtp_init(uint8_t busid, uint32_t reg_base) +{ + usbd_desc_register(busid, &fmt_descriptor); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + usbd_add_interface(busid, usbd_mtp_init_intf(busid, &intf2, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP)); + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +static rt_size_t usbd_cdc_read(usbd_cdc_dev_t usbd, rt_off_t pos, void* buf, rt_size_t size) +{ + rt_size_t rb; + + RT_ASSERT(usbd->rx_rb != NULL); + + rb = ringbuffer_get(usbd->rx_rb, buf, size); + if (is_read_busy && ((usbd_dev.rx_rb->size - ringbuffer_getlen(usbd_dev.rx_rb) - 1) >= MSG_MAX_MPS)) { + is_read_busy = false; + usbd_ep_start_read(0, CDC_OUT_EP, read_buffer, MSG_MAX_MPS); + } + return rb; +} + +static rt_size_t usbd_cdc_write(usbd_cdc_dev_t usbd, rt_off_t pos, const void* buf, rt_size_t size) +{ + rt_err_t res = RT_EOK; + rt_size_t tx_size = 0; + uint32_t bufsz = 0; + uint8_t *send_ptr = (uint8_t *)buf; + cdc_tx_msg.user_ptr = (void *)buf; + cdc_tx_msg.total_nbytes = size; + cdc_tx_msg.total_xfer_nbytes = 0; + + if ((uintptr_t)buf & 0x3) { /** check if buffer is aligned to 4 bytes */ + cdc_tx_msg.is_unalign = true; + if (cdc_tx_msg.total_nbytes > MSG_MAX_MPS) + { + bufsz = MSG_MAX_MPS; + } + else + { + bufsz = cdc_tx_msg.total_nbytes; + } + memcpy(cdc_tx_msg.msg_buffer, cdc_tx_msg.user_ptr, bufsz); + send_ptr = (uint8_t *)cdc_tx_msg.msg_buffer; + } else { + cdc_tx_msg.is_unalign = false; + send_ptr = (uint8_t *)buf; + bufsz = size; + } + + res = usbd_ep_start_write(0, CDC_IN_EP, send_ptr, bufsz); + if (res) + { + USB_LOG_ERR("cdc ep write err:%d\n", res); + tx_size = 0; + } + else + { + tx_size = size; + } + + return tx_size; +} + +struct usbd_cdc_ops usbd_ops = { + .dev_init = NULL, + .dev_read = usbd_cdc_read, + .dev_write = usbd_cdc_write, + .dev_control = NULL +}; + +rt_err_t drv_usb_cdc_init(void) +{ + rt_err_t err; + + usbd_dev.ops = &usbd_ops; + err = hal_usbd_cdc_register(&usbd_dev, "usbd0", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE | RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX, RT_NULL); + if (err != RT_EOK) { + return err; + } + mtp_init(0, USB_OTG_FS_BASE_ADDR); + return RT_EOK; +} + diff --git a/src/driver/usb/usbd_cdc_mtp.h b/src/driver/usb/usbd_cdc_mtp.h new file mode 100644 index 000000000..546d88352 --- /dev/null +++ b/src/driver/usb/usbd_cdc_mtp.h @@ -0,0 +1,31 @@ +/****************************************************************************** + * Copyright 2020-2026 The Firmament Authors. All Rights Reserved. + * + * 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 __DRV_USBD_CDC_MTP_H__ +#define __DRV_USBD_CDC_MTP_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +rt_err_t drv_usb_cdc_init(void); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/.clang-format b/src/lib/CherryUSB/.clang-format new file mode 100644 index 000000000..336989ded --- /dev/null +++ b/src/lib/CherryUSB/.clang-format @@ -0,0 +1,171 @@ +# clang-format configuration file. Intended for clang-format >= 11.0 +# +# For more information, see: +# +# https://clang.llvm.org/docs/ClangFormat.html +# https://clang.llvm.org/docs/ClangFormatStyleOptions.html +# +--- +# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto +Language: Cpp +# BasedOnStyle: LLVM +# 访问说明符(public、private等)的偏移 +AccessModifierOffset: -4 +# 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行) +AlignAfterOpenBracket: Align +# 连续赋值时,对齐所有等号 +AlignConsecutiveAssignments: false +# 对齐位域 +AlignConsecutiveBitFields: true +# 连续声明时,对齐所有声明的变量名 +AlignConsecutiveDeclarations: false +# 连续宏时,进行对齐 +AlignConsecutiveMacros: true +# 左对齐逃脱换行(使用反斜杠换行)的反斜杠 +AlignEscapedNewlines: Left +# 水平对齐二元和三元表达式的操作数 +AlignOperands: true +# 对齐连续的尾随的注释 +AlignTrailingComments: true +# 允许函数声明的所有参数在放在下一行 +AllowAllParametersOfDeclarationOnNextLine: false +# 允许短的块放在同一行 +AllowShortBlocksOnASingleLine: false +# 允许短的case标签放在同一行 +AllowShortCaseLabelsOnASingleLine: false +# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All +AllowShortFunctionsOnASingleLine: None +# 允许短的if语句保持在同一行 +AllowShortIfStatementsOnASingleLine: false +# 允许短的循环保持在同一行 +AllowShortLoopsOnASingleLine: false +# 总是在定义返回类型后换行(deprecated) +AlwaysBreakAfterDefinitionReturnType: None +# 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数), +# AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义) +AlwaysBreakAfterReturnType: None +# 总是在多行string字面量前换行 +AlwaysBreakBeforeMultilineStrings: false +# 总是在template声明后换行 +AlwaysBreakTemplateDeclarations: false +# false表示函数实参要么都在同一行,要么都各自一行 +BinPackArguments: true +# false表示所有形参要么都在同一行,要么都各自一行 +BinPackParameters: true +# 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效 +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false # Unknown to clang-format-5.0 + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true # Unknown to clang-format-4.0 + SplitEmptyRecord: true # Unknown to clang-format-4.0 + SplitEmptyNamespace: true # Unknown to clang-format-4.0 +# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行) +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Custom +#BreakBeforeInheritanceComma: false # Unknown to clang-format-4.0 +# 在三元运算符前换行 +BreakBeforeTernaryOperators: false +# 在构造函数的初始化列表的逗号前换行 +BreakConstructorInitializersBeforeComma: false +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: false +# 每行字符的限制,0表示没有限制 +ColumnLimit: 0 +# 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false # Unknown to clang-format-4.0 +# 构造函数的初始化列表要么都在同一行,要么都各自一行 +ConstructorInitializerAllOnOneLineOrOnePerLine: false +# 构造函数的初始化列表的缩进宽度 +ConstructorInitializerIndentWidth: 4 +# 延续的行的缩进宽度 +ContinuationIndentWidth: 4 +# 去除C++11的列表初始化的大括号{后和}前的空格 +Cpp11BracedListStyle: false +# 继承最常用的指针和引用的对齐方式 +DerivePointerAlignment: false +# 关闭格式化 +DisableFormat: false +ForEachMacros: + - 'SHELL_EXPORT_CMD' + +# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental) +ExperimentalAutoDetectBinPacking: false +# 缩进case标签 +IndentCaseLabels: true +# 缩进宽度 +IndentWidth: 4 +# 函数返回类型换行时,缩进函数声明或函数定义的函数名 +IndentWrappedFunctionNames: false +# 保留在块开始处的空行 +KeepEmptyLinesAtTheStartOfBlocks: false +# 开始一个块的宏的正则表达式 +MacroBlockBegin: '' +# 结束一个块的宏的正则表达式 +MacroBlockEnd: '' +# 连续空行的最大数量 +MaxEmptyLinesToKeep: 1 +# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All +NamespaceIndentation: None +# 使用ObjC块时缩进宽度 +ObjCBlockIndentWidth: 4 +# 在ObjC的@property后添加一个空格 +ObjCSpaceAfterProperty: false +# 在ObjC的protocol列表前添加一个空格 +ObjCSpaceBeforeProtocolList: true +# 在call(后对函数调用换行的penalty +PenaltyBreakBeforeFirstCallParameter: 30 +# 在一个注释中引入换行的penalty +PenaltyBreakComment: 10 +# 第一次在<<前换行的penalty +PenaltyBreakFirstLessLess: 0 +# 在一个字符串字面量中引入换行的penalty +PenaltyBreakString: 10 +# 对于每个在行字符数限制之外的字符的penalty +PenaltyExcessCharacter: 100 +# 将函数的返回类型放到它自己的行的penalty +PenaltyReturnTypeOnItsOwnLine: 60 +# 指针和引用的对齐: Left, Right, Middle +PointerAlignment: Right +# 允许重新排版注释 +ReflowComments: false +# 允许排序#include +SortIncludes: false +# 在C风格类型转换后添加空格 +SpaceAfterCStyleCast: false +# 在赋值运算符之前添加空格 +SpaceBeforeAssignmentOperators: true +# 开圆括号之前添加一个空格: Never, ControlStatements, Always +SpaceBeforeParens: ControlStatements +# 在空的圆括号中添加空格 +SpaceInEmptyParentheses: false +# 在尾随的评论前添加的空格数(只适用于//) +SpacesBeforeTrailingComments: 1 +# 在尖括号的<后和>前添加空格 +SpacesInAngles: false +# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格 +SpacesInContainerLiterals: false +# 在C风格类型转换的括号中添加空格 +SpacesInCStyleCastParentheses: false +# 在圆括号的(后和)前添加空格 +SpacesInParentheses: false +# 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响 +SpacesInSquareBrackets: false +# 标准: Cpp03, Cpp11, Auto +Standard: Cpp03 +# tab宽度 +TabWidth: 4 +# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always +UseTab: Never +... + diff --git a/src/lib/CherryUSB/.cmake-format.json b/src/lib/CherryUSB/.cmake-format.json new file mode 100644 index 000000000..a2f9b5ef3 --- /dev/null +++ b/src/lib/CherryUSB/.cmake-format.json @@ -0,0 +1,311 @@ +{ + "_help_parse": "Options affecting listfile parsing", + "parse": { + "_help_additional_commands": [ + "Specify structure for custom cmake functions" + ], + "additional_commands": { + "foo": { + "flags": [ + "BAR", + "BAZ" + ], + "kwargs": { + "HEADERS": "*", + "SOURCES": "*", + "DEPENDS": "*" + } + } + }, + "_help_override_spec": [ + "Override configurations per-command where available" + ], + "override_spec": {}, + "_help_vartags": [ + "Specify variable tags." + ], + "vartags": [], + "_help_proptags": [ + "Specify property tags." + ], + "proptags": [] + }, + "_help_format": "Options affecting formatting.", + "format": { + "_help_disable": [ + "Disable formatting entirely, making cmake-format a no-op" + ], + "disable": false, + "_help_line_width": [ + "How wide to allow formatted cmake files" + ], + "line_width": 120, + "_help_tab_size": [ + "How many spaces to tab for indent" + ], + "tab_size": 4, + "_help_use_tabchars": [ + "If true, lines are indented using tab characters (utf-8", + "0x09) instead of space characters (utf-8 0x20).", + "In cases where the layout would require a fractional tab", + "character, the behavior of the fractional indentation is", + "governed by " + ], + "use_tabchars": false, + "_help_fractional_tab_policy": [ + "If is True, then the value of this variable", + "indicates how fractional indentions are handled during", + "whitespace replacement. If set to 'use-space', fractional", + "indentation is left as spaces (utf-8 0x20). If set to", + "`round-up` fractional indentation is replaced with a single", + "tab character (utf-8 0x09) effectively shifting the column", + "to the next tabstop" + ], + "fractional_tab_policy": "use-space", + "_help_max_subgroups_hwrap": [ + "If an argument group contains more than this many sub-groups", + "(parg or kwarg groups) then force it to a vertical layout." + ], + "max_subgroups_hwrap": 2, + "_help_max_pargs_hwrap": [ + "If a positional argument group contains more than this many", + "arguments, then force it to a vertical layout." + ], + "max_pargs_hwrap": 6, + "_help_max_rows_cmdline": [ + "If a cmdline positional group consumes more than this many", + "lines without nesting, then invalidate the layout (and nest)" + ], + "max_rows_cmdline": 2, + "_help_separate_ctrl_name_with_space": [ + "If true, separate flow control names from their parentheses", + "with a space" + ], + "separate_ctrl_name_with_space": false, + "_help_separate_fn_name_with_space": [ + "If true, separate function names from parentheses with a", + "space" + ], + "separate_fn_name_with_space": false, + "_help_dangle_parens": [ + "If a statement is wrapped to more than one line, than dangle", + "the closing parenthesis on its own line." + ], + "dangle_parens": true, + "_help_dangle_align": [ + "If the trailing parenthesis must be 'dangled' on its on", + "line, then align it to this reference: `prefix`: the start", + "of the statement, `prefix-indent`: the start of the", + "statement, plus one indentation level, `child`: align to", + "the column of the arguments" + ], + "dangle_align": "prefix", + "_help_min_prefix_chars": [ + "If the statement spelling length (including space and", + "parenthesis) is smaller than this amount, then force reject", + "nested layouts." + ], + "min_prefix_chars": 4, + "_help_max_prefix_chars": [ + "If the statement spelling length (including space and", + "parenthesis) is larger than the tab width by more than this", + "amount, then force reject un-nested layouts." + ], + "max_prefix_chars": 10, + "_help_max_lines_hwrap": [ + "If a candidate layout is wrapped horizontally but it exceeds", + "this many lines, then reject the layout." + ], + "max_lines_hwrap": 2, + "_help_line_ending": [ + "What style line endings to use in the output." + ], + "line_ending": "unix", + "_help_command_case": [ + "Format command names consistently as 'lower' or 'upper' case" + ], + "command_case": "canonical", + "_help_keyword_case": [ + "Format keywords consistently as 'lower' or 'upper' case" + ], + "keyword_case": "unchanged", + "_help_always_wrap": [ + "A list of command names which should always be wrapped" + ], + "always_wrap": [], + "_help_enable_sort": [ + "If true, the argument lists which are known to be sortable", + "will be sorted lexicographicall" + ], + "enable_sort": true, + "_help_autosort": [ + "If true, the parsers may infer whether or not an argument", + "list is sortable (without annotation)." + ], + "autosort": false, + "_help_require_valid_layout": [ + "By default, if cmake-format cannot successfully fit", + "everything into the desired linewidth it will apply the", + "last, most agressive attempt that it made. If this flag is", + "True, however, cmake-format will print error, exit with non-", + "zero status code, and write-out nothing" + ], + "require_valid_layout": false, + "_help_layout_passes": [ + "A dictionary mapping layout nodes to a list of wrap", + "decisions. See the documentation for more information." + ], + "layout_passes": {} + }, + "_help_markup": "Options affecting comment reflow and formatting.", + "markup": { + "_help_bullet_char": [ + "What character to use for bulleted lists" + ], + "bullet_char": "*", + "_help_enum_char": [ + "What character to use as punctuation after numerals in an", + "enumerated list" + ], + "enum_char": ".", + "_help_first_comment_is_literal": [ + "If comment markup is enabled, don't reflow the first comment", + "block in each listfile. Use this to preserve formatting of", + "your copyright/license statements." + ], + "first_comment_is_literal": true, + "_help_literal_comment_pattern": [ + "If comment markup is enabled, don't reflow any comment block", + "which matches this (regex) pattern. Default is `None`", + "(disabled)." + ], + "literal_comment_pattern": null, + "_help_fence_pattern": [ + "Regular expression to match preformat fences in comments", + "default= ``r'^\\s*([`~]{3}[`~]*)(.*)$'``" + ], + "fence_pattern": "^\\s*([`~]{3}[`~]*)(.*)$", + "_help_ruler_pattern": [ + "Regular expression to match rulers in comments default=", + "``r'^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$'``" + ], + "ruler_pattern": "^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$", + "_help_explicit_trailing_pattern": [ + "If a comment line matches starts with this pattern then it", + "is explicitly a trailing comment for the preceeding", + "argument. Default is '#<'" + ], + "explicit_trailing_pattern": "#<", + "_help_hashruler_min_length": [ + "If a comment line starts with at least this many consecutive", + "hash characters, then don't lstrip() them off. This allows", + "for lazy hash rulers where the first hash char is not", + "separated by space" + ], + "hashruler_min_length": 10, + "_help_canonicalize_hashrulers": [ + "If true, then insert a space between the first hash char and", + "remaining hash chars in a hash ruler, and normalize its", + "length to fill the column" + ], + "canonicalize_hashrulers": true, + "_help_enable_markup": [ + "enable comment markup parsing and reflow" + ], + "enable_markup": true + }, + "_help_lint": "Options affecting the linter", + "lint": { + "_help_disabled_codes": [ + "a list of lint codes to disable" + ], + "disabled_codes": [], + "_help_function_pattern": [ + "regular expression pattern describing valid function names" + ], + "function_pattern": "[0-9a-z_]+", + "_help_macro_pattern": [ + "regular expression pattern describing valid macro names" + ], + "macro_pattern": "[0-9A-Z_]+", + "_help_global_var_pattern": [ + "regular expression pattern describing valid names for", + "variables with global (cache) scope" + ], + "global_var_pattern": "[A-Z][0-9A-Z_]+", + "_help_internal_var_pattern": [ + "regular expression pattern describing valid names for", + "variables with global scope (but internal semantic)" + ], + "internal_var_pattern": "_[A-Z][0-9A-Z_]+", + "_help_local_var_pattern": [ + "regular expression pattern describing valid names for", + "variables with local scope" + ], + "local_var_pattern": "[a-z][a-z0-9_]+", + "_help_private_var_pattern": [ + "regular expression pattern describing valid names for", + "privatedirectory variables" + ], + "private_var_pattern": "_[0-9a-z_]+", + "_help_public_var_pattern": [ + "regular expression pattern describing valid names for public", + "directory variables" + ], + "public_var_pattern": "[A-Z][0-9A-Z_]+", + "_help_argument_var_pattern": [ + "regular expression pattern describing valid names for", + "function/macro arguments and loop variables." + ], + "argument_var_pattern": "[a-z][a-z0-9_]+", + "_help_keyword_pattern": [ + "regular expression pattern describing valid names for", + "keywords used in functions or macros" + ], + "keyword_pattern": "[A-Z][0-9A-Z_]+", + "_help_max_conditionals_custom_parser": [ + "In the heuristic for C0201, how many conditionals to match", + "within a loop in before considering the loop a parser." + ], + "max_conditionals_custom_parser": 2, + "_help_min_statement_spacing": [ + "Require at least this many newlines between statements" + ], + "min_statement_spacing": 1, + "_help_max_statement_spacing": [ + "Require no more than this many newlines between statements" + ], + "max_statement_spacing": 2, + "max_returns": 6, + "max_branches": 12, + "max_arguments": 5, + "max_localvars": 15, + "max_statements": 50 + }, + "_help_encode": "Options affecting file encoding", + "encode": { + "_help_emit_byteorder_mark": [ + "If true, emit the unicode byte-order mark (BOM) at the start", + "of the file" + ], + "emit_byteorder_mark": false, + "_help_input_encoding": [ + "Specify the encoding of the input file. Defaults to utf-8" + ], + "input_encoding": "utf-8", + "_help_output_encoding": [ + "Specify the encoding of the output file. Defaults to utf-8.", + "Note that cmake only claims to support utf-8 so be careful", + "when using anything else" + ], + "output_encoding": "utf-8" + }, + "_help_misc": "Miscellaneous configurations options.", + "misc": { + "_help_per_command": [ + "A dictionary containing any per-command configuration", + "overrides. Currently only `command_case` is supported." + ], + "per_command": {} + } +} diff --git a/src/lib/CherryUSB/.gitattributes b/src/lib/CherryUSB/.gitattributes new file mode 100644 index 000000000..74d8c6b21 --- /dev/null +++ b/src/lib/CherryUSB/.gitattributes @@ -0,0 +1,47 @@ +*.c linguist-language=C +*.C linguist-language=C +*.h linguist-language=C +*.H linguist-language=C + +* text=auto + +*.S text +*.asm text +*.c text +*.cc text +*.cpp text +*.cxx text +*.h text +*.htm text +*.html text +*.in text +*.ld text +*.m4 text +*.mak text +*.mk text +*.py text +*.rb text +*.s text +*.sct text +*.sh text +*.txt text +*.xml text +SConscript text +Makefile text +AUTHORS text +COPYING text + +*.LZO -text +*.Opt -text +*.Uv2 -text +*.ewp -text +*.eww -text +*.vcproj -text +*.bat -text +*.dos -text +*.icf -text +*.inf -text +*.ini -text +*.sct -text +*.xsd -text +Jamfile -text \ No newline at end of file diff --git a/src/lib/CherryUSB/.github/ISSUE_TEMPLATE/1-bug-report.yml b/src/lib/CherryUSB/.github/ISSUE_TEMPLATE/1-bug-report.yml new file mode 100644 index 000000000..d9c40aba2 --- /dev/null +++ b/src/lib/CherryUSB/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -0,0 +1,85 @@ +name: "🐞 上报bug / Bug report" +description: "提交bug以让改进软件功能 / Create a report to help us improve" +labels: ["peding"] +body: + - type: markdown + attributes: + value: | + 感谢上报新的问题!请填写以下信息,以帮助我们更好地理解问题。请注意,如果您不按模板填写issue,那您的issue可能会被关闭或者删除! + 我们的工作语言是中文或者英文,请使用这两种语言之一填写issue。 + + Thank you for reporting a new issue! Please fill in the following information to help us better understand the problem. Please note that if you do not fill in the issue according to the template, your issue may be closed or deleted! + Our working languages are Chinese or English, please use one of these two languages to fill in the issue. + - type: textarea + id: bug-description + attributes: + label: 描述一下这个bug / Describe the bug + description: 请使用简介并详细的语句,来描述这个bug。 / A clear and concise description of what the bug is. + placeholder: 我准备……我想要……但是实际上它……了 / I am doing ... What I expect is ... What actually happening is ... + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: 复现步骤 / To Reproduce + description: 按照下面的步骤,可以复现bug / Steps to reproduce the behavior + placeholder: 首先……然后……接着…… / Go to '...', Click on '....', Scroll down to '....' + validations: + required: true + - type: textarea + id: target + attributes: + label: 设备信息 / Target Device + description: 您使用的板子/芯片型号、使用的引脚、以及USB IP类型 / Your target board/chip model, the pins you used, and the type of USB IP you used + placeholder: |- + 板子型号:HPM5301EVKLite + 引脚:PA24 PA25 + USB IP:/ + validations: + required: true + + - type: textarea + id: log + attributes: + label: 日志 / Log + description: 请提供输出 log + placeholder: |- + [D/USB] EP0 send 18 bytes, 0 remained + [D/USB] EP0 recv out status + [D/USB] EP0 send 0 bytes, 0 remained + [D/USB] EP0 send 18 bytes, 0 remained + [D/USB] EP0 recv out status + validations: + required: true + + - type: markdown + attributes: + value: | + 以下的部分仅在移植的时候需要填写,如果不是移植问题,请忽略这部分。 + The following section is only required when porting, if it is not a porting issue, please ignore this section. + + - type: textarea + id: configure + attributes: + label: 配置 / Configuration + description: 请确认 USB 中断,时钟,引脚,寄存器地址是否正确,并截图 / Please confirm that the USB interrupt, clock, pin, and register address are correct, and provide a screenshot + + - type: textarea + id: USBIrq + attributes: + label: USB中断 / USB Interrupt + description: 请确认是否能进入USB中断 + + - type: textarea + id: cache + attributes: + label: 缓存 / Cache + description: 芯片是否带有 cache功能,是否做了 no cache 处理,并截图 / Whether the chip has a cache function, whether no cache processing is done, and provide a screenshot + + - type: checkboxes + id: bussiness + attributes: + label: 商业 / Business + description: 是否流片并销售 / Whether it is mass-produced and sold + options: + - label: 是 / Yes \ No newline at end of file diff --git a/src/lib/CherryUSB/.github/workflows/build_tests.yml b/src/lib/CherryUSB/.github/workflows/build_tests.yml new file mode 100644 index 000000000..5ce6e416d --- /dev/null +++ b/src/lib/CherryUSB/.github/workflows/build_tests.yml @@ -0,0 +1,83 @@ +name: Build Tests + +on: + push: + branches: + - master + - release/v1.5 + pull_request: + branches: + - master + - release/v1.5 + +jobs: + build_hpmicro: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install -y cmake ninja-build + + - name: Download hpm_sdk + run: | + cd ~ + git clone https://github.com/hpmicro/hpm_sdk.git + + - name: Download RISC-V toolchain + run: | + cd ~ + wget https://github.com/hpmicro/riscv-gnu-toolchain/releases/download/2023.10.18/rv32imac_zicsr_zifencei_multilib_b_ext-linux.tar.gz + tar -xzf rv32imac_zicsr_zifencei_multilib_b_ext-linux.tar.gz + + - name: Build hpm demo + run: | + cd tests/hpmicro + export HPM_SDK_BASE=~/hpm_sdk + export GNURISCV_TOOLCHAIN_PATH=~/rv32imac_zicsr_zifencei_multilib_b_ext-linux + export HPM_SDK_TOOLCHAIN_VARIANT= + cmake -S . -B build -GNinja -DBOARD=hpm6800evk -DHPM_BUILD_TYPE=flash_sdram_xip -DCMAKE_BUILD_TYPE=debug -DEXTRA_C_FLAGS="-Werror";cmake --build build + + build_bouffalolab: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install -y cmake make + + - name: Download bouffalo_sdk + run: | + cd ~ + git clone https://github.com/bouffalolab/bouffalo_sdk.git + + - name: Download RISC-V toolchain + run: | + cd ~ + git clone https://github.com/bouffalolab/toolchain_gcc_t-head_linux.git + + - name: Build bouffalo demo + run: | + cd tests/bouffalolab + export BL_SDK_BASE=~/bouffalo_sdk + export PATH=~/toolchain_gcc_t-head_linux/bin:$PATH + make CHIP=bl616 BOARD=bl616dk -j12 + + build_espressif: + strategy: + matrix: + idf_ver: ["latest"] + runs-on: ubuntu-latest + container: espressif/idf:${{ matrix.idf_ver }} + steps: + - uses: actions/checkout@v3 + with: + submodules: 'recursive' + - name: Build espressif demo + shell: bash + run: | + . ${IDF_PATH}/export.sh + pip install idf-component-manager ruamel.yaml idf-build-apps --upgrade + idf-build-apps build -p ./tests/espressif --recursive --target esp32s3 \ No newline at end of file diff --git a/src/lib/CherryUSB/.github/workflows/cppcheck.yml b/src/lib/CherryUSB/.github/workflows/cppcheck.yml new file mode 100644 index 000000000..666afd277 --- /dev/null +++ b/src/lib/CherryUSB/.github/workflows/cppcheck.yml @@ -0,0 +1,17 @@ +name: Cppcheck action + +on: + push: + pull_request: + +jobs: + build: + name: cppcheck + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: cppcheck + shell: bash + run: | + sudo apt install cppcheck + cppcheck --enable=warning,portability,performance --language=c --platform=unix32 --std=c99 --force . -i third_party/ -i class/template -i port/template/ diff --git a/src/lib/CherryUSB/.github/workflows/deploy-docs.yml b/src/lib/CherryUSB/.github/workflows/deploy-docs.yml new file mode 100644 index 000000000..65af1f414 --- /dev/null +++ b/src/lib/CherryUSB/.github/workflows/deploy-docs.yml @@ -0,0 +1,28 @@ +name: Deploy docs + +on: + push: + branches: + - master + +permissions: + contents: write + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: true + - uses: ammaraskar/sphinx-action@8.0.2 + with: + docs-folder: "docs/" + - uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages + folder: docs/build/html + + diff --git a/src/lib/CherryUSB/.gitignore b/src/lib/CherryUSB/.gitignore new file mode 100644 index 000000000..9ebda7a01 --- /dev/null +++ b/src/lib/CherryUSB/.gitignore @@ -0,0 +1,24 @@ +.vscode +build +**/Drivers/** +**/MDK-ARM/DebugConfig/** +**/MDK-ARM/RTE/** +**/obj/** +**/RET/** +**/Listings/** +**/Objects/** +*.map +*.o +*.d +*.htm +*.dep +*.lnp +*.iex +*.lst +*.axf +*.crf +*.hex +*.Bak +*.uvguix.* +*.scvd +*.usb.tmp \ No newline at end of file diff --git a/src/lib/CherryUSB/.readthedocs.yaml b/src/lib/CherryUSB/.readthedocs.yaml new file mode 100644 index 000000000..ed14f4de2 --- /dev/null +++ b/src/lib/CherryUSB/.readthedocs.yaml @@ -0,0 +1,35 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + # You can also specify other tool versions: + # nodejs: "20" + # rust: "1.70" + # golang: "1.20" + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/source/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + # fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: +# - pdf +# - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: docs/requirements.txt \ No newline at end of file diff --git a/src/lib/CherryUSB/CMakeLists.txt b/src/lib/CherryUSB/CMakeLists.txt new file mode 100644 index 000000000..5c3e651bb --- /dev/null +++ b/src/lib/CherryUSB/CMakeLists.txt @@ -0,0 +1,210 @@ +cmake_minimum_required(VERSION 3.15) + +if(CONFIG_CHERRYUSB OR ESP_PLATFORM) + +if(BL_SDK_BASE) + message(STATUS "enable cherryusb in bouffalo_sdk") + + set(CONFIG_CHERRYUSB_DEVICE_CDC_ACM 1) + set(CONFIG_CHERRYUSB_DEVICE_HID 1) + set(CONFIG_CHERRYUSB_DEVICE_MSC 1) + set(CONFIG_CHERRYUSB_DEVICE_AUDIO 1) + set(CONFIG_CHERRYUSB_DEVICE_VIDEO 1) + + set(CONFIG_CHERRYUSB_HOST_CDC_ACM 1) + set(CONFIG_CHERRYUSB_HOST_CDC_ECM 1) + set(CONFIG_CHERRYUSB_HOST_CDC_NCM 1) + set(CONFIG_CHERRYUSB_HOST_HID 1) + set(CONFIG_CHERRYUSB_HOST_MSC 1) + set(CONFIG_CHERRYUSB_HOST_VIDEO 1) + set(CONFIG_CHERRYUSB_HOST_AUDIO 1) + set(CONFIG_CHERRYUSB_HOST_CDC_RNDIS 1) + # set(CONFIG_CHERRYUSB_HOST_BLUETOOTH 1) + set(CONFIG_CHERRYUSB_HOST_ASIX 1) + set(CONFIG_CHERRYUSB_HOST_RTL8152 1) + set(CONFIG_CHERRYUSB_HOST_CH34X 1) + set(CONFIG_CHERRYUSB_HOST_CP210X 1) + set(CONFIG_CHERRYUSB_HOST_FTDI 1) + set(CONFIG_CHERRYUSB_HOST_PL2303 1) + + set(CONFIG_CHERRYUSB_DEVICE_BL 1) + set(CONFIG_CHERRYUSB_HOST_EHCI_BL 1) + set(CONFIG_CHERRYUSB_OSAL "freertos") + + include(${CMAKE_CURRENT_LIST_DIR}/cherryusb.cmake) + list(REMOVE_DUPLICATES cherryusb_srcs) + list(REMOVE_DUPLICATES cherryusb_incs) + + sdk_generate_library(cherryusb) + sdk_add_include_directories(${cherryusb_incs}) + sdk_library_add_sources(${cherryusb_srcs}) +elseif(ESP_PLATFORM) + message(STATUS "enable cherryusb in esp-idf") + + set(CONFIG_CHERRYUSB_DEVICE_DWC2_ESP 1) + set(CONFIG_CHERRYUSB_HOST_DWC2_ESP 1) + set(CONFIG_CHERRYUSB_OSAL "idf") + + include(${CMAKE_CURRENT_LIST_DIR}/cherryusb.cmake) + list(REMOVE_DUPLICATES cherryusb_srcs) + list(REMOVE_DUPLICATES cherryusb_incs) + + set(ldfragments "osal/idf/linker.lf") + + if(CONFIG_CHERRYUSB_HOST_CDC_ECM + OR CONFIG_CHERRYUSB_HOST_CDC_RNDIS + OR CONFIG_CHERRYUSB_HOST_CDC_NCM + OR CONFIG_CHERRYUSB_HOST_ASIX + OR CONFIG_CHERRYUSB_HOST_RTL8152 + ) + idf_component_get_property(lwip lwip COMPONENT_LIB) + target_compile_definitions(${lwip} PRIVATE "-DPBUF_POOL_BUFSIZE=1600") + endif() + + idf_component_get_property(freertos_include freertos ORIG_INCLUDE_PATH) + + if(CONFIG_CHERRYUSB_HOST_MSC) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/platform/idf/usbh_fatfs.c) + endif() + + set(priv_req esp_mm esp_netif esp_timer fatfs) + if(${IDF_VERSION_MAJOR} LESS 6) + list(APPEND priv_req usb) + endif() + idf_component_register( + SRCS + ${cherryusb_srcs} + INCLUDE_DIRS + ${cherryusb_incs} + ${freertos_include} + PRIV_REQUIRES + ${priv_req} + LDFRAGMENTS + ${ldfragments} + ) + + if(CONFIG_CHERRYUSB_HOST) + target_linker_script(${COMPONENT_LIB} INTERFACE "osal/idf/usbh_class_info.ld") + + # 强制链接器不删除符号 + if(CONFIG_CHERRYUSB_HOST_CDC_ACM) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u cdc_acm_none_class_info") + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u cdc_data_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_HID) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u hid_custom_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_MSC) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u msc_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_CDC_ECM) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u cdc_ecm_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_CDC_RNDIS) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u rndis_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_CDC_NCM) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u cdc_ncm_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_VIDEO) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u video_ctrl_class_info") + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u video_streaming_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_AUDIO) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u audio_ctrl_intf_class_info") + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u audio_streaming_intf_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_BLUETOOTH) + if(CONFIG_USBHOST_BLUETOOTH_HCI_H4) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u bluetooth_h4_nrf_class_info") + else() + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u bluetooth_class_info") + endif() + endif() + if(CONFIG_CHERRYUSB_HOST_ASIX) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u asix_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_RTL8152) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u rtl8152_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_FTDI) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u ftdi_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_CH34X) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u ch34x_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_CP210X) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u cp210x_class_info") + endif() + if(CONFIG_CHERRYUSB_HOST_PL2303) + target_link_libraries(${COMPONENT_LIB} INTERFACE "-u pl2303_class_info") + endif() + endif() + + if(CONFIG_CHERRYUSB) + set_source_files_properties("class/audio/usbd_audio.c" PROPERTIES COMPILE_FLAGS -Wno-maybe-uninitialized) + endif() +elseif(ZEPHYR_BASE) + message(STATUS "enable cherryusb in zephyr") + + set(CONFIG_CHERRYUSB_OSAL "zephyr") + include(${CMAKE_CURRENT_LIST_DIR}/cherryusb.cmake) + list(REMOVE_DUPLICATES cherryusb_srcs) + list(REMOVE_DUPLICATES cherryusb_incs) + + if (CONFIG_SHELL) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/platform/zephyr/usb_cmd.c) + endif () + if (CONFIG_FILE_SYSTEM AND CONFIG_CHERRYUSB_HOST) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/platform/zephyr/usbh_msc_disk.c) + endif () + + zephyr_library() + if(cherryusb_incs) + zephyr_include_directories(${cherryusb_incs}) + endif() + if(cherryusb_srcs) + zephyr_library_sources(${cherryusb_srcs}) + endif() + + if (CONFIG_CHERRYUSB_HOST) + zephyr_linker_sources(SECTIONS zephyr/usbh_class_info.ld) + endif() +elseif(HPM_SDK_BASE) + message(STATUS "enable cherryusb in hpm_sdk") + + set(CONFIG_CHERRYUSB_DEVICE_CDC_ACM 1) + set(CONFIG_CHERRYUSB_DEVICE_HID 1) + set(CONFIG_CHERRYUSB_DEVICE_MSC 1) + set(CONFIG_CHERRYUSB_DEVICE_AUDIO 1) + set(CONFIG_CHERRYUSB_DEVICE_VIDEO 1) + + set(CONFIG_CHERRYUSB_HOST_CDC_ACM 1) + set(CONFIG_CHERRYUSB_HOST_CDC_ECM 1) + set(CONFIG_CHERRYUSB_HOST_CDC_NCM 1) + set(CONFIG_CHERRYUSB_HOST_HID 1) + set(CONFIG_CHERRYUSB_HOST_MSC 1) + set(CONFIG_CHERRYUSB_HOST_VIDEO 1) + set(CONFIG_CHERRYUSB_HOST_AUDIO 1) + set(CONFIG_CHERRYUSB_HOST_CDC_RNDIS 1) + # set(CONFIG_CHERRYUSB_HOST_BLUETOOTH 1) + set(CONFIG_CHERRYUSB_HOST_ASIX 1) + set(CONFIG_CHERRYUSB_HOST_RTL8152 1) + set(CONFIG_CHERRYUSB_HOST_CH34X 1) + set(CONFIG_CHERRYUSB_HOST_CP210X 1) + set(CONFIG_CHERRYUSB_HOST_FTDI 1) + set(CONFIG_CHERRYUSB_HOST_PL2303 1) + + set(CONFIG_CHERRYUSB_DEVICE_HPM 1) + set(CONFIG_CHERRYUSB_HOST_EHCI_HPM 1) + set(CONFIG_CHERRYUSB_OSAL "freertos") + + include(${CMAKE_CURRENT_LIST_DIR}/cherryusb.cmake) + list(REMOVE_DUPLICATES cherryusb_srcs) + list(REMOVE_DUPLICATES cherryusb_incs) + + sdk_inc(${cherryusb_incs}) + sdk_src(${cherryusb_srcs}) +endif() + +endif() \ No newline at end of file diff --git a/src/lib/CherryUSB/CherryUSB.svg b/src/lib/CherryUSB/CherryUSB.svg new file mode 100644 index 000000000..91de329f8 --- /dev/null +++ b/src/lib/CherryUSB/CherryUSB.svg @@ -0,0 +1,3 @@ + + +
CherryUSB
CherryUSB
Hardware
Hardware
CDNS3
CDNS3
CHIPIDEA
CHIPIDEA
XHCI
XHCI
EHCI
EHCI
OHCI
OHCI
DWC2
DWC2
MUSB
MUSB
FOTG
FOTG
Device Controller Driver (DCD)
Device Controller Driver (DCD)
Host Controller Driver (HCD)
Host Controller Driver (HCD)
OS Abstraction Layer (OSAL)
OS Abstraction Layer (OSAL)
USB Host
USB Host
USB Host Core
USB Host Core
HID
HID
MSC
MSC
CDC
CDC
UAC
UAC
UVC
UVC
RNDIS
RNDIS
VENDOR
VENDOR
HUB
HUB
USB Device
USB Device
USB Device Core
USB Device Core
HID
HID
MSC
MSC
CDC
CDC
UAC
UAC
UVC
UVC
RNDIS
RNDIS
VENDOR
VENDOR
DFU
DFU
optional
optional
required
required
\ No newline at end of file diff --git a/src/lib/CherryUSB/Kconfig b/src/lib/CherryUSB/Kconfig new file mode 100644 index 000000000..812a55856 --- /dev/null +++ b/src/lib/CherryUSB/Kconfig @@ -0,0 +1,438 @@ +# Kconfig file for CherryUSB +menuconfig CHERRYUSB + bool "CherryUSB Configuration" + default n + +if CHERRYUSB + + menuconfig CHERRYUSB_DEVICE + bool "Enable usb device mode" + default n + + if CHERRYUSB_DEVICE + choice + prompt "Select usb device speed" + default CHERRYUSB_DEVICE_SPEED_FS + config CHERRYUSB_DEVICE_SPEED_FS + bool "FS" + config CHERRYUSB_DEVICE_SPEED_HS + bool "HS" + config CHERRYUSB_DEVICE_SPEED_AUTO + bool "AUTO" + endchoice + + choice + prompt "Select usb device ip, and some ip need config in usb_config.h, please check" + default CHERRYUSB_DEVICE_CUSTOM + config CHERRYUSB_DEVICE_CUSTOM + bool "CUSTOM (Implement it yourself)" + config CHERRYUSB_DEVICE_FSDEV_ST + bool "fsdev_st" + config CHERRYUSB_DEVICE_FSDEV_CUSTOM + bool "fsdev_custom" + config CHERRYUSB_DEVICE_DWC2_ST + bool "dwc2_st" + config CHERRYUSB_DEVICE_DWC2_ESP + bool "dwc2_esp" + config CHERRYUSB_DEVICE_DWC2_KENDRYTE + bool "dwc2_kendryte" + config CHERRYUSB_DEVICE_DWC2_AT + bool "dwc2_at" + config CHERRYUSB_DEVICE_DWC2_HC + bool "dwc2_hc" + config CHERRYUSB_DEVICE_DWC2_NATION + bool "dwc2_nation" + config CHERRYUSB_DEVICE_DWC2_GD + bool "dwc2_gd" + config CHERRYUSB_DEVICE_DWC2_CUSTOM + bool "dwc2_custom" + config CHERRYUSB_DEVICE_MUSB_ES + bool "musb_es" + config CHERRYUSB_DEVICE_MUSB_SUNXI + bool "musb_sunxi" + config CHERRYUSB_DEVICE_MUSB_BK + bool "musb_bk" + config CHERRYUSB_DEVICE_MUSB_SIFLI + bool "musb_sifli" + config CHERRYUSB_DEVICE_MUSB_CUSTOM + bool "musb_custom" + config CHERRYUSB_DEVICE_CHIPIDEA_MCX + bool "chipidea_mcx" + config CHERRYUSB_DEVICE_CHIPIDEA_CUSTOM + bool "chipidea_custom" + config CHERRYUSB_DEVICE_KINETIS_MCX + bool "kinetis_mcx" + config CHERRYUSB_DEVICE_KINETIS_MM32 + bool "kinetis_mm32" + config CHERRYUSB_DEVICE_KINETIS_CUSTOM + bool "kinetis_custom" + config CHERRYUSB_DEVICE_BL + bool "bouffalo" + config CHERRYUSB_DEVICE_HPM + bool "hpm" + config CHERRYUSB_DEVICE_AIC + bool "aic" + config CHERRYUSB_DEVICE_RP2040 + bool "rp2040" + config CHERRYUSB_DEVICE_CH32 + bool "ch32" + config CHERRYUSB_DEVICE_PUSB2 + bool "pusb2" + endchoice + + config CHERRYUSB_DEVICE_CDC_ACM + bool + prompt "Enable usb cdc acm device" + default n + + config CHERRYUSB_DEVICE_HID + bool + prompt "Enable usb hid device" + default n + + config CHERRYUSB_DEVICE_MSC + bool + prompt "Enable usb msc device" + default n + + config CHERRYUSB_DEVICE_AUDIO + bool + prompt "Enable usb audio device" + default n + + config CHERRYUSB_DEVICE_VIDEO + bool + prompt "Enable usb video device" + default n + + config CHERRYUSB_DEVICE_CDC_RNDIS + bool + prompt "Enable usb cdc rndis device" + default n + + config CHERRYUSB_DEVICE_CDC_ECM + bool + prompt "Enable usb cdc ecm device" + default n + + config CHERRYUSB_DEVICE_CDC_NCM + bool + prompt "Enable usb cdc ncm device" + depends on !IDF_CMAKE + default n + + config CHERRYUSB_DEVICE_MTP + bool + prompt "Enable usb mtp device, it is commercial charge" + default n + + config CHERRYUSB_DEVICE_ADB + bool + prompt "Enable usb adb device" + default n + + config CHERRYUSB_DEVICE_DFU + bool + prompt "Enable usb dfu device" + default n + + config USBDEV_REQUEST_BUFFER_LEN + int + prompt "Set device control transfer max buffer size" + default 512 + + config USBDEV_MSC_MAX_BUFSIZE + int + prompt "Set usb msc device max buffer size" + default 512 + help + Set the maximum buffer size for usb msc device, it is used to transfer data. + you can change it to a larger value if you need larger speed but must be a power of blocksize. + + config USBDEV_RNDIS_USING_LWIP + bool + prompt "Enable usb rndis device with lwip for lan" + default n + + config USBDEV_CDC_ECM_USING_LWIP + bool + prompt "Enable usb cdc ecm device with lwip for lan" + default n + + choice + prompt "Select usb device template, please select class driver first" + default CHERRYUSB_DEVICE_TEMPLATE_NONE + config CHERRYUSB_DEVICE_TEMPLATE_NONE + bool + prompt "none (Implement it yourself)" + config CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM + bool + prompt "cdc_acm" + depends on CHERRYUSB_DEVICE_CDC_ACM + config CHERRYUSB_DEVICE_TEMPLATE_MSC + bool + prompt "msc_ram" + depends on CHERRYUSB_DEVICE_MSC + config CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD + bool + prompt "hid_keyboard" + depends on CHERRYUSB_DEVICE_HID + config CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE + bool + prompt "hid_mouse" + depends on CHERRYUSB_DEVICE_HID + config CHERRYUSB_DEVICE_TEMPLATE_HID_CUSTOM + bool + prompt "hid_custom" + depends on CHERRYUSB_DEVICE_HID + config CHERRYUSB_DEVICE_TEMPLATE_VIDEO + bool + prompt "video" + depends on CHERRYUSB_DEVICE_VIDEO + config CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V1_MIC_SPEAKER + bool + prompt "audio_v1_mic_speaker_multichan" + depends on CHERRYUSB_DEVICE_AUDIO + config CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V2_MIC_SPEAKER + bool + prompt "audio_v2_mic_speaker_multichan" + depends on CHERRYUSB_DEVICE_AUDIO + config CHERRYUSB_DEVICE_TEMPLATE_CDC_RNDIS + bool + prompt "cdc_rndis" + depends on CHERRYUSB_DEVICE_CDC_RNDIS + config CHERRYUSB_DEVICE_TEMPLATE_CDC_ECM + bool + prompt "cdc_ecm" + depends on CHERRYUSB_DEVICE_CDC_ECM + config CHERRYUSB_DEVICE_TEMPLATE_CDC_NCM + bool + prompt "cdc_ncm" + depends on CHERRYUSB_DEVICE_CDC_NCM + config CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC + bool + prompt "cdc_acm_msc" + depends on CHERRYUSB_DEVICE_CDC_ACM && CHERRYUSB_DEVICE_MSC + config CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC_HID + bool + prompt "cdc_acm_msc_hid" + depends on CHERRYUSB_DEVICE_CDC_ACM && CHERRYUSB_DEVICE_MSC && CHERRYUSB_DEVICE_HID + config CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1 + bool + prompt "winusbv1" + config CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2 + bool + prompt "winusbv2" + config CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC + bool + prompt "winusbv2_cdc" + depends on CHERRYUSB_DEVICE_CDC_ACM + config CHERRYUSB_DEVICE_TEMPLATE_WEBUSB_HID + bool + prompt "webusb_hid" + depends on CHERRYUSB_DEVICE_HID + endchoice + endif + + menuconfig CHERRYUSB_HOST + bool "Enable usb host mode" + default n + + if CHERRYUSB_HOST + choice + prompt "Select usb host ip, and some ip need config in usb_config.h, please check" + default CHERRYUSB_HOST_CUSTOM + config CHERRYUSB_HOST_CUSTOM + bool "CUSTOM (Implement it yourself)" + config CHERRYUSB_HOST_EHCI_BL + bool "ehci_bouffalo" + config CHERRYUSB_HOST_EHCI_HPM + bool "ehci_hpm" + config CHERRYUSB_HOST_EHCI_AIC + bool "ehci_aic" + config CHERRYUSB_HOST_EHCI_MCX + bool "ehci_mcx" + config CHERRYUSB_HOST_EHCI_NUC980 + bool "ehci_nuc980" + config CHERRYUSB_HOST_EHCI_MA35D0 + bool "ehci_ma35d0" + config CHERRYUSB_HOST_EHCI_CUSTOM + bool "ehci_custom" + config CHERRYUSB_HOST_DWC2_ST + bool "dwc2_st" + config CHERRYUSB_HOST_DWC2_ESP + bool "dwc2_esp" + config CHERRYUSB_HOST_DWC2_KENDRYTE + bool "dwc2_kendryte" + config CHERRYUSB_HOST_DWC2_HC + bool "dwc2_hc" + config CHERRYUSB_HOST_DWC2_NATION + bool "dwc2_nation" + config CHERRYUSB_HOST_DWC2_CUSTOM + bool "dwc2_custom" + config CHERRYUSB_HOST_MUSB_ES + bool "musb_es" + config CHERRYUSB_HOST_MUSB_SUNXI + bool "musb_sunxi" + config CHERRYUSB_HOST_MUSB_BK + bool "musb_bk" + config CHERRYUSB_HOST_MUSB_SIFLI + bool "musb_sifli" + config CHERRYUSB_HOST_MUSB_CUSTOM + bool "musb_custom" + config CHERRYUSB_HOST_PUSB2 + bool "pusb2" + config CHERRYUSB_HOST_XHCI_PHYTIUM + bool "xhci_phytium" + config CHERRYUSB_HOST_XHCI_CUSTOM + bool "xhci" + config CHERRYUSB_HOST_KINETIS_MCX + bool "kinetis_mcx" + config CHERRYUSB_HOST_KINETIS_MM32 + bool "kinetis_mm32" + config CHERRYUSB_HOST_KINETIS_CUSTOM + bool "kinetis_custom" + config CHERRYUSB_HOST_RP2040 + bool "rp2040" + endchoice + + config CHERRYUSB_HOST_CDC_ACM + bool + prompt "Enable usb cdc acm driver" + default n + + config CHERRYUSB_HOST_HID + bool + prompt "Enable usb hid driver" + default n + + config CHERRYUSB_HOST_MSC + bool + prompt "Enable usb msc driver" + default n + + config CHERRYUSB_HOST_CDC_ECM + bool + prompt "Enable usb cdc ecm driver" + select USBHOST_PLATFORM_CDC_ECM + default n + + config CHERRYUSB_HOST_CDC_RNDIS + bool + prompt "Enable usb rndis driver" + select USBHOST_PLATFORM_CDC_RNDIS + default n + + config CHERRYUSB_HOST_CDC_NCM + bool + prompt "Enable usb cdc ncm driver" + select USBHOST_PLATFORM_CDC_NCM + default n + + config CHERRYUSB_HOST_VIDEO + bool + prompt "Enable usb video driver, it is commercial charge" + default n + + config CHERRYUSB_HOST_AUDIO + bool + prompt "Enable usb audio driver, it is commercial charge" + default n + + config CHERRYUSB_HOST_BLUETOOTH + bool + prompt "Enable usb bluetooth driver" + depends on !IDF_CMAKE + default n + + config CHERRYUSB_HOST_ASIX + bool + prompt "Enable usb asix driver" + select USBHOST_PLATFORM_ASIX + default n + + config CHERRYUSB_HOST_RTL8152 + bool + prompt "Enable usb rtl8152 driver" + select USBHOST_PLATFORM_RTL8152 + default n + + config CHERRYUSB_HOST_FTDI + bool + prompt "Enable usb ftdi driver" + default n + + config CHERRYUSB_HOST_CH34X + bool + prompt "Enable usb ch34x driver" + default n + + config CHERRYUSB_HOST_CP210X + bool + prompt "Enable usb cp210x driver" + default n + + config CHERRYUSB_HOST_PL2303 + bool + prompt "Enable usb pl2303 driver" + default n + + config CHERRYUSB_HOST_AOA + bool + prompt "Enable usb aoa driver" + default n + + config USBHOST_PLATFORM_CDC_ECM + bool + + config USBHOST_PLATFORM_CDC_RNDIS + bool + + config USBHOST_PLATFORM_CDC_NCM + bool + + config USBHOST_PLATFORM_ASIX + bool + + config USBHOST_PLATFORM_RTL8152 + bool + + config USBHOST_PSC_PRIO + int + prompt "Set hubport change thread priority, 0 is the max priority" + default 0 + + config USBHOST_PSC_STACKSIZE + int + prompt "Set hubport change thread stacksize" + default 4096 + + config USBHOST_REQUEST_BUFFER_LEN + int + prompt "Set host control transfer max buffer size" + default 512 + + config USBHOST_CONTROL_TRANSFER_TIMEOUT + int + prompt "Set host control transfer timeout, unit is ms" + default 500 + + menu "Select USB host template, please select class driver first" + config TEST_USBH_CDC_ACM + int + prompt "demo for test cdc acm" + default 0 + depends on CHERRYUSB_HOST_CDC_ACM + config TEST_USBH_HID + int + prompt "demo for test hid" + default 0 + depends on CHERRYUSB_HOST_HID + config TEST_USBH_MSC + int + prompt "demo for test msc" + default 0 + depends on CHERRYUSB_HOST_MSC + endmenu + endif +endif diff --git a/src/lib/CherryUSB/Kconfig.rtt b/src/lib/CherryUSB/Kconfig.rtt new file mode 100644 index 000000000..89cfbbfce --- /dev/null +++ b/src/lib/CherryUSB/Kconfig.rtt @@ -0,0 +1,465 @@ +# Kconfig file for package CherryUSB +menuconfig RT_USING_CHERRYUSB + bool "Using USB with CherryUSB" + default n + +if RT_USING_CHERRYUSB + + menuconfig RT_CHERRYUSB_DEVICE + bool "Enable usb device mode" + default n + + if RT_CHERRYUSB_DEVICE + choice + prompt "Select usb device speed" + default RT_CHERRYUSB_DEVICE_SPEED_FS + config RT_CHERRYUSB_DEVICE_SPEED_FS + bool "FS" + config RT_CHERRYUSB_DEVICE_SPEED_HS + bool "HS" + config RT_CHERRYUSB_DEVICE_SPEED_AUTO + bool "AUTO" + endchoice + + choice + prompt "Select usb device ip, and some ip need config in usb_config.h, please check" + default RT_CHERRYUSB_DEVICE_CUSTOM + config RT_CHERRYUSB_DEVICE_CUSTOM + bool "CUSTOM (Implement it yourself)" + config RT_CHERRYUSB_DEVICE_FSDEV_ST + bool "fsdev_st" + config RT_CHERRYUSB_DEVICE_FSDEV_CUSTOM + bool "fsdev_custom" + config RT_CHERRYUSB_DEVICE_DWC2_ST + bool "dwc2_st" + config RT_CHERRYUSB_DEVICE_DWC2_ESP + bool "dwc2_esp" + config RT_CHERRYUSB_DEVICE_DWC2_KENDRYTE + bool "dwc2_kendryte" + config RT_CHERRYUSB_DEVICE_DWC2_AT + bool "dwc2_at" + config RT_CHERRYUSB_DEVICE_DWC2_HC + bool "dwc2_hc" + config RT_CHERRYUSB_DEVICE_DWC2_NATION + bool "dwc2_nation" + config RT_CHERRYUSB_DEVICE_DWC2_GD + bool "dwc2_gd" + config RT_CHERRYUSB_DEVICE_DWC2_CUSTOM + bool "dwc2_custom" + config RT_CHERRYUSB_DEVICE_MUSB_ES + bool "musb_es" + config RT_CHERRYUSB_DEVICE_MUSB_SUNXI + bool "musb_sunxi" + config RT_CHERRYUSB_DEVICE_MUSB_BK + bool "musb_bk" + config RT_CHERRYUSB_DEVICE_MUSB_SIFLI + bool "musb_sifli" + config RT_CHERRYUSB_DEVICE_MUSB_CUSTOM + bool "musb_custom" + config RT_CHERRYUSB_DEVICE_CHIPIDEA_MCX + bool "chipidea_mcx" + config RT_CHERRYUSB_DEVICE_CHIPIDEA_CUSTOM + bool "chipidea_custom" + config RT_CHERRYUSB_DEVICE_KINETIS_MCX + bool "kinetis_mcx" + config RT_CHERRYUSB_DEVICE_KINETIS_MM32 + bool "kinetis_mm32" + config RT_CHERRYUSB_DEVICE_KINETIS_CUSTOM + bool "kinetis_custom" + config RT_CHERRYUSB_DEVICE_BL + bool "bouffalo" + config RT_CHERRYUSB_DEVICE_HPM + bool "hpm" + config RT_CHERRYUSB_DEVICE_AIC + bool "aic" + config RT_CHERRYUSB_DEVICE_RP2040 + bool "rp2040" + config RT_CHERRYUSB_DEVICE_CH32 + bool "ch32" + config RT_CHERRYUSB_DEVICE_PUSB2 + bool "pusb2" + config RT_CHERRYUSB_DEVICE_NRF5X + bool "nrf5x" + endchoice + + config RT_CHERRYUSB_DEVICE_CDC_ACM + bool + prompt "Enable usb cdc acm device" + default n + + config RT_CHERRYUSB_DEVICE_HID + bool + prompt "Enable usb hid device" + default n + + config RT_CHERRYUSB_DEVICE_MSC + bool + prompt "Enable usb msc device" + default n + + config RT_CHERRYUSB_DEVICE_AUDIO + bool + prompt "Enable usb audio device" + default n + + config RT_CHERRYUSB_DEVICE_VIDEO + bool + prompt "Enable usb video device" + default n + + config RT_CHERRYUSB_DEVICE_CDC_RNDIS + bool + prompt "Enable usb cdc rndis device" + default n + + config RT_CHERRYUSB_DEVICE_CDC_ECM + bool + prompt "Enable usb cdc ecm device" + default n + + config RT_CHERRYUSB_DEVICE_CDC_NCM + bool + prompt "Enable usb cdc ncm device" + default n + + config RT_CHERRYUSB_DEVICE_MTP + bool + prompt "Enable usb mtp device, it is commercial charge" + default n + + config RT_CHERRYUSB_DEVICE_ADB + bool + prompt "Enable usb adb device" + default n + + config RT_CHERRYUSB_DEVICE_DFU + bool + prompt "Enable usb dfu device" + default n + + config RT_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV + bool + prompt "Enable chardev for cdc acm device" + default n + + config CONFIG_USBDEV_REQUEST_BUFFER_LEN + int + prompt "Set device control transfer max buffer size" + default 512 + + config CONFIG_USBDEV_MSC_MAX_BUFSIZE + int + prompt "Set usb msc device max buffer size" + default 512 + help + Set the maximum buffer size for usb msc device, it is used to transfer data. + you can change it to a larger value if you need larger speed but must be a power of blocksize. + + config CONFIG_USBDEV_RNDIS_USING_LWIP + bool + prompt "Enable usb rndis device with lwip for lan" + default n + + config CONFIG_USBDEV_CDC_ECM_USING_LWIP + bool + prompt "Enable usb cdc ecm device with lwip for lan" + default n + + choice + prompt "Select usb device template, please select class driver first" + default RT_CHERRYUSB_DEVICE_TEMPLATE_NONE + config RT_CHERRYUSB_DEVICE_TEMPLATE_NONE + bool + prompt "none (Implement it yourself)" + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM + bool + prompt "cdc_acm" + depends on RT_CHERRYUSB_DEVICE_CDC_ACM + config RT_CHERRYUSB_DEVICE_TEMPLATE_MSC + bool + prompt "msc_ram" + depends on RT_CHERRYUSB_DEVICE_MSC + config RT_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV + bool + prompt "msc_blkdev" + depends on RT_CHERRYUSB_DEVICE_MSC + config RT_CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD + bool + prompt "hid_keyboard" + depends on RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE + bool + prompt "hid_mouse" + depends on RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_HID_CUSTOM + bool + prompt "hid_custom" + depends on RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_VIDEO + bool + prompt "video" + depends on RT_CHERRYUSB_DEVICE_VIDEO + config RT_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V1_MIC_SPEAKER + bool + prompt "audio_v1_mic_speaker_multichan" + depends on RT_CHERRYUSB_DEVICE_AUDIO + config RT_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V2_MIC_SPEAKER + bool + prompt "audio_v2_mic_speaker_multichan" + depends on RT_CHERRYUSB_DEVICE_AUDIO + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_RNDIS + bool + prompt "cdc_rndis" + depends on RT_CHERRYUSB_DEVICE_CDC_RNDIS + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ECM + bool + prompt "cdc_ecm" + depends on RT_CHERRYUSB_DEVICE_CDC_ECM + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_NCM + bool + prompt "cdc_ncm" + depends on RT_CHERRYUSB_DEVICE_CDC_NCM + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC + bool + prompt "cdc_acm_msc" + depends on RT_CHERRYUSB_DEVICE_CDC_ACM && RT_CHERRYUSB_DEVICE_MSC + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC_HID + bool + prompt "cdc_acm_msc_hid" + depends on RT_CHERRYUSB_DEVICE_CDC_ACM && RT_CHERRYUSB_DEVICE_MSC && RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1 + bool + prompt "winusbv1" + config RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2 + bool + prompt "winusbv2" + config RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC + bool + prompt "winusbv2_cdc" + depends on RT_CHERRYUSB_DEVICE_CDC_ACM + config RT_CHERRYUSB_DEVICE_TEMPLATE_WEBUSB_HID + bool + prompt "webusb_hid" + depends on RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_ADB + bool + prompt "adb" + depends on RT_CHERRYUSB_DEVICE_ADB + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_CHARDEV + bool + prompt "cdc_acm_chardev" + depends on RT_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV + endchoice + + config CONFIG_USBDEV_MSC_BLOCK_DEV_NAME + string "usb device msc block device name" + depends on RT_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV + default "sd0" + + endif + + menuconfig RT_CHERRYUSB_HOST + bool "Enable usb host mode" + default n + + if RT_CHERRYUSB_HOST + choice + prompt "Select usb host ip, and some ip need config in usb_config.h, please check" + default RT_CHERRYUSB_HOST_CUSTOM + config RT_CHERRYUSB_HOST_CUSTOM + bool "CUSTOM (Implement it yourself)" + config RT_CHERRYUSB_HOST_EHCI_BL + bool "ehci_bouffalo" + config RT_CHERRYUSB_HOST_EHCI_HPM + bool "ehci_hpm" + config RT_CHERRYUSB_HOST_EHCI_AIC + bool "ehci_aic" + config RT_CHERRYUSB_HOST_EHCI_MCX + bool "ehci_mcx" + config RT_CHERRYUSB_HOST_EHCI_NUC980 + bool "ehci_nuc980" + config RT_CHERRYUSB_HOST_EHCI_MA35D0 + bool "ehci_ma35d0" + config RT_CHERRYUSB_HOST_EHCI_CUSTOM + bool "ehci_custom" + config RT_CHERRYUSB_HOST_DWC2_ST + bool "dwc2_st" + config RT_CHERRYUSB_HOST_DWC2_ESP + bool "dwc2_esp" + config RT_CHERRYUSB_HOST_DWC2_KENDRYTE + bool "dwc2_kendryte" + config RT_CHERRYUSB_HOST_DWC2_HC + bool "dwc2_hc" + config RT_CHERRYUSB_HOST_DWC2_NATION + bool "dwc2_nation" + config RT_CHERRYUSB_HOST_DWC2_CUSTOM + bool "dwc2_custom" + config RT_CHERRYUSB_HOST_MUSB_ES + bool "musb_es" + config RT_CHERRYUSB_HOST_MUSB_SUNXI + bool "musb_sunxi" + config RT_CHERRYUSB_HOST_MUSB_BK + bool "musb_bk" + config RT_CHERRYUSB_HOST_MUSB_SIFLI + bool "musb_sifli" + config RT_CHERRYUSB_HOST_MUSB_CUSTOM + bool "musb_custom" + config RT_CHERRYUSB_HOST_PUSB2 + bool "pusb2" + config RT_CHERRYUSB_HOST_XHCI + bool "xhci" + config RT_CHERRYUSB_HOST_RP2040 + bool "rp2040" + endchoice + + config RT_CHERRYUSB_HOST_CDC_ACM + bool + prompt "Enable usb cdc acm driver" + default n + + config RT_CHERRYUSB_HOST_HID + bool + prompt "Enable usb hid driver" + default n + + config RT_CHERRYUSB_HOST_MSC + bool + prompt "Enable usb msc driver" + default n + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + + config RT_CHERRYUSB_HOST_CDC_ECM + bool + prompt "Enable usb cdc ecm driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_CDC_ECM + default n + + config RT_CHERRYUSB_HOST_CDC_RNDIS + bool + prompt "Enable usb rndis driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_CDC_RNDIS + default n + + config RT_CHERRYUSB_HOST_CDC_NCM + bool + prompt "Enable usb cdc ncm driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_CDC_NCM + default n + + config RT_CHERRYUSB_HOST_VIDEO + bool + prompt "Enable usb video driver, it is commercial charge" + default n + + config RT_CHERRYUSB_HOST_AUDIO + bool + prompt "Enable usb audio driver, it is commercial charge" + default n + + config RT_CHERRYUSB_HOST_BLUETOOTH + bool + prompt "Enable usb bluetooth driver" + default n + + config RT_CHERRYUSB_HOST_ASIX + bool + prompt "Enable usb asix driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_ASIX + default n + + config RT_CHERRYUSB_HOST_RTL8152 + bool + prompt "Enable usb rtl8152 driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_RTL8152 + default n + + config RT_CHERRYUSB_HOST_FTDI + bool + prompt "Enable usb ftdi driver" + default n + + config RT_CHERRYUSB_HOST_CH34X + bool + prompt "Enable usb ch34x driver" + default n + + config RT_CHERRYUSB_HOST_CP210X + bool + prompt "Enable usb cp210x driver" + default n + + config RT_CHERRYUSB_HOST_PL2303 + bool + prompt "Enable usb pl2303 driver" + default n + + config CONFIG_USBHOST_PLATFORM_CDC_ECM + bool + + config CONFIG_USBHOST_PLATFORM_CDC_RNDIS + bool + + config CONFIG_USBHOST_PLATFORM_CDC_NCM + bool + + config CONFIG_USBHOST_PLATFORM_ASIX + bool + + config CONFIG_USBHOST_PLATFORM_RTL8152 + bool + + config CONFIG_USBHOST_PSC_PRIO + int + prompt "Set hubport change thread priority, 0 is the max priority" + default 0 + + config CONFIG_USBHOST_PSC_STACKSIZE + int + prompt "Set hubport change thread stacksize" + default 4096 + + config CONFIG_USBHOST_REQUEST_BUFFER_LEN + int + prompt "Set host control transfer max buffer size" + default 512 + + config CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT + int + prompt "Set host control transfer timeout, unit is ms" + default 500 + + config RT_LWIP_PBUF_POOL_BUFSIZE + int "The size of each pbuf in the pbuf pool" + range 1500 2000 + default 1600 + + config CONFIG_USB_DFS_MOUNT_POINT + string "usb host dfs mount point" + depends on RT_CHERRYUSB_HOST_MSC + default "/" + + menu "Select USB host template, please select class driver first" + config CONFIG_TEST_USBH_CDC_ACM + int + prompt "demo for test cdc acm, cannot enable this demo, we have used serial framework instead" + default 0 + depends on RT_CHERRYUSB_HOST_CDC_ACM + config CONFIG_TEST_USBH_HID + int + prompt "demo for test hid" + default 0 + depends on RT_CHERRYUSB_HOST_HID + config CONFIG_TEST_USBH_MSC + int + prompt "demo for test msc, cannot enable this demo, we have used dfs instead" + default 0 + depends on RT_CHERRYUSB_HOST_MSC + endmenu + endif +endif diff --git a/src/lib/CherryUSB/Kconfig.rttpkg b/src/lib/CherryUSB/Kconfig.rttpkg new file mode 100644 index 000000000..a48d67951 --- /dev/null +++ b/src/lib/CherryUSB/Kconfig.rttpkg @@ -0,0 +1,506 @@ +# Kconfig file for package CherryUSB +menuconfig PKG_USING_CHERRYUSB + depends on RT_VER_NUM < 0x50200 + bool "CherryUSB: tiny and portable USB host/device stack for embedded system with USB IP" + default n + +if PKG_USING_CHERRYUSB + + menuconfig PKG_CHERRYUSB_DEVICE + bool "Enable usb device mode" + default n + + if PKG_CHERRYUSB_DEVICE + choice + prompt "Select usb device speed" + default PKG_CHERRYUSB_DEVICE_SPEED_FS + config PKG_CHERRYUSB_DEVICE_SPEED_FS + bool "FS" + config PKG_CHERRYUSB_DEVICE_SPEED_HS + bool "HS" + config PKG_CHERRYUSB_DEVICE_SPEED_AUTO + bool "AUTO" + endchoice + + choice + prompt "Select usb device ip, and some ip need config in usb_config.h, please check" + default PKG_CHERRYUSB_DEVICE_CUSTOM + config PKG_CHERRYUSB_DEVICE_CUSTOM + bool "CUSTOM (Implement it yourself)" + config PKG_CHERRYUSB_DEVICE_FSDEV_ST + bool "fsdev_st" + config PKG_CHERRYUSB_DEVICE_FSDEV_CUSTOM + bool "fsdev_custom" + config PKG_CHERRYUSB_DEVICE_DWC2_ST + bool "dwc2_st" + config PKG_CHERRYUSB_DEVICE_DWC2_ESP + bool "dwc2_esp" + config PKG_CHERRYUSB_DEVICE_DWC2_KENDRYTE + bool "dwc2_kendryte" + config PKG_CHERRYUSB_DEVICE_DWC2_AT + bool "dwc2_at" + config PKG_CHERRYUSB_DEVICE_DWC2_HC + bool "dwc2_hc" + config PKG_CHERRYUSB_DEVICE_DWC2_NATION + bool "dwc2_nation" + config PKG_CHERRYUSB_DEVICE_DWC2_GD + bool "dwc2_gd" + config PKG_CHERRYUSB_DEVICE_DWC2_CUSTOM + bool "dwc2_custom" + config PKG_CHERRYUSB_DEVICE_MUSB_ES + bool "musb_es" + config PKG_CHERRYUSB_DEVICE_MUSB_SUNXI + bool "musb_sunxi" + config PKG_CHERRYUSB_DEVICE_MUSB_BK + bool "musb_bk" + config PKG_CHERRYUSB_DEVICE_MUSB_SIFLI + bool "musb_sifli" + config PKG_CHERRYUSB_DEVICE_MUSB_CUSTOM + bool "musb_custom" + config PKG_CHERRYUSB_DEVICE_CHIPIDEA_MCX + bool "chipidea_mcx" + config PKG_CHERRYUSB_DEVICE_CHIPIDEA_CUSTOM + bool "chipidea_custom" + config PKG_CHERRYUSB_DEVICE_KINETIS_MCX + bool "kinetis_mcx" + config PKG_CHERRYUSB_DEVICE_KINETIS_MM32 + bool "kinetis_mm32" + config PKG_CHERRYUSB_DEVICE_KINETIS_CUSTOM + bool "kinetis_custom" + config PKG_CHERRYUSB_DEVICE_BL + bool "bouffalo" + config PKG_CHERRYUSB_DEVICE_HPM + bool "hpm" + config PKG_CHERRYUSB_DEVICE_AIC + bool "aic" + config PKG_CHERRYUSB_DEVICE_RP2040 + bool "rp2040" + config PKG_CHERRYUSB_DEVICE_CH32 + bool "ch32" + config PKG_CHERRYUSB_DEVICE_PUSB2 + bool "pusb2" + endchoice + + config PKG_CHERRYUSB_DEVICE_CDC_ACM + bool + prompt "Enable usb cdc acm device" + default n + + config PKG_CHERRYUSB_DEVICE_HID + bool + prompt "Enable usb hid device" + default n + + config PKG_CHERRYUSB_DEVICE_MSC + bool + prompt "Enable usb msc device" + default n + + config PKG_CHERRYUSB_DEVICE_AUDIO + bool + prompt "Enable usb audio device" + default n + + config PKG_CHERRYUSB_DEVICE_VIDEO + bool + prompt "Enable usb video device" + default n + + config PKG_CHERRYUSB_DEVICE_CDC_RNDIS + bool + prompt "Enable usb cdc rndis device" + default n + + config PKG_CHERRYUSB_DEVICE_CDC_ECM + bool + prompt "Enable usb cdc ecm device" + default n + + config PKG_CHERRYUSB_DEVICE_CDC_NCM + bool + prompt "Enable usb cdc ncm device" + default n + + config PKG_CHERRYUSB_DEVICE_MTP + bool + prompt "Enable usb mtp device, it is commercial charge" + default n + + config PKG_CHERRYUSB_DEVICE_ADB + bool + prompt "Enable usb adb device" + default n + + config PKG_CHERRYUSB_DEVICE_DFU + bool + prompt "Enable usb dfu device" + default n + + config PKG_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV + bool + prompt "Enable chardev for cdc acm device" + default n + + config CONFIG_USBDEV_REQUEST_BUFFER_LEN + int + prompt "Set device control transfer max buffer size" + default 512 + + config CONFIG_USBDEV_MSC_MAX_BUFSIZE + int + prompt "Set usb msc device max buffer size" + default 512 + help + Set the maximum buffer size for usb msc device, it is used to transfer data. + you can change it to a larger value if you need larger speed but must be a power of blocksize. + + config CONFIG_USBDEV_RNDIS_USING_LWIP + bool + prompt "Enable usb rndis device with lwip for lan" + default n + + config CONFIG_USBDEV_CDC_ECM_USING_LWIP + bool + prompt "Enable usb cdc ecm device with lwip for lan" + default n + + choice + prompt "Select usb device template, please select class driver first" + default PKG_CHERRYUSB_DEVICE_TEMPLATE_NONE + config PKG_CHERRYUSB_DEVICE_TEMPLATE_NONE + bool + prompt "none (Implement it yourself)" + config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM + bool + prompt "cdc_acm" + depends on PKG_CHERRYUSB_DEVICE_CDC_ACM + config PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC + bool + prompt "msc_ram" + depends on PKG_CHERRYUSB_DEVICE_MSC + config PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV + bool + prompt "msc_blkdev" + depends on PKG_CHERRYUSB_DEVICE_MSC + config PKG_CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD + bool + prompt "hid_keyboard" + depends on PKG_CHERRYUSB_DEVICE_HID + config PKG_CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE + bool + prompt "hid_mouse" + depends on PKG_CHERRYUSB_DEVICE_HID + config PKG_CHERRYUSB_DEVICE_TEMPLATE_HID_CUSTOM + bool + prompt "hid_custom" + depends on PKG_CHERRYUSB_DEVICE_HID + config PKG_CHERRYUSB_DEVICE_TEMPLATE_VIDEO + bool + prompt "video" + depends on PKG_CHERRYUSB_DEVICE_VIDEO + config PKG_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V1_MIC_SPEAKER + bool + prompt "audio_v1_mic_speaker_multichan" + depends on PKG_CHERRYUSB_DEVICE_AUDIO + config PKG_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V2_MIC_SPEAKER + bool + prompt "audio_v2_mic_speaker_multichan" + depends on PKG_CHERRYUSB_DEVICE_AUDIO + config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_RNDIS + bool + prompt "cdc_rndis" + depends on PKG_CHERRYUSB_DEVICE_CDC_RNDIS + config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ECM + bool + prompt "cdc_ecm" + depends on PKG_CHERRYUSB_DEVICE_CDC_ECM + config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_NCM + bool + prompt "cdc_ncm" + depends on PKG_CHERRYUSB_DEVICE_CDC_NCM + config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC + bool + prompt "cdc_acm_msc" + depends on PKG_CHERRYUSB_DEVICE_CDC_ACM && PKG_CHERRYUSB_DEVICE_MSC + config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC_HID + bool + prompt "cdc_acm_msc_hid" + depends on PKG_CHERRYUSB_DEVICE_CDC_ACM && PKG_CHERRYUSB_DEVICE_MSC && PKG_CHERRYUSB_DEVICE_HID + config PKG_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1 + bool + prompt "winusbv1" + config PKG_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2 + bool + prompt "winusbv2" + config PKG_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC + bool + prompt "winusbv2_cdc" + depends on PKG_CHERRYUSB_DEVICE_CDC_ACM + config PKG_CHERRYUSB_DEVICE_TEMPLATE_WEBUSB_HID + bool + prompt "webusb_hid" + depends on PKG_CHERRYUSB_DEVICE_HID + config PKG_CHERRYUSB_DEVICE_TEMPLATE_ADB + bool + prompt "adb" + depends on PKG_CHERRYUSB_DEVICE_ADB + config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_CHARDEV + bool + prompt "cdc_acm_chardev" + depends on PKG_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV + endchoice + + config CONFIG_USBDEV_MSC_BLOCK_DEV_NAME + string "usb device msc block device name" + depends on PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV + default "sd0" + + endif + + menuconfig PKG_CHERRYUSB_HOST + bool "Enable usb host mode" + default n + + if PKG_CHERRYUSB_HOST + choice + prompt "Select usb host ip, and some ip need config in usb_config.h, please check" + default PKG_CHERRYUSB_HOST_CUSTOM + config PKG_CHERRYUSB_HOST_CUSTOM + bool "CUSTOM (Implement it yourself)" + config PKG_CHERRYUSB_HOST_EHCI_BL + bool "ehci_bouffalo" + config PKG_CHERRYUSB_HOST_EHCI_HPM + bool "ehci_hpm" + config PKG_CHERRYUSB_HOST_EHCI_AIC + bool "ehci_aic" + config PKG_CHERRYUSB_HOST_EHCI_MCX + bool "ehci_mcx" + config PKG_CHERRYUSB_HOST_EHCI_NUC980 + bool "ehci_nuc980" + config PKG_CHERRYUSB_HOST_EHCI_MA35D0 + bool "ehci_ma35d0" + config PKG_CHERRYUSB_HOST_EHCI_CUSTOM + bool "ehci_custom" + config PKG_CHERRYUSB_HOST_DWC2_ST + bool "dwc2_st" + config PKG_CHERRYUSB_HOST_DWC2_ESP + bool "dwc2_esp" + config PKG_CHERRYUSB_HOST_DWC2_KENDRYTE + bool "dwc2_kendryte" + config PKG_CHERRYUSB_HOST_DWC2_HC + bool "dwc2_hc" + config PKG_CHERRYUSB_HOST_DWC2_NATION + bool "dwc2_nation" + config PKG_CHERRYUSB_HOST_DWC2_CUSTOM + bool "dwc2_custom" + config PKG_CHERRYUSB_HOST_MUSB_ES + bool "musb_es" + config PKG_CHERRYUSB_HOST_MUSB_SUNXI + bool "musb_sunxi" + config PKG_CHERRYUSB_HOST_MUSB_BK + bool "musb_bk" + config PKG_CHERRYUSB_HOST_MUSB_SIFLI + bool "musb_sifli" + config PKG_CHERRYUSB_HOST_MUSB_CUSTOM + bool "musb_custom" + config PKG_CHERRYUSB_HOST_PUSB2 + bool "pusb2" + config PKG_CHERRYUSB_HOST_XHCI + bool "xhci" + config PKG_CHERRYUSB_HOST_RP2040 + bool "rp2040" + endchoice + + config PKG_CHERRYUSB_HOST_CDC_ACM + bool + prompt "Enable usb cdc acm driver" + default n + + config PKG_CHERRYUSB_HOST_HID + bool + prompt "Enable usb hid driver" + default n + + config PKG_CHERRYUSB_HOST_MSC + bool + prompt "Enable usb msc driver" + default n + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + + config PKG_CHERRYUSB_HOST_CDC_ECM + bool + prompt "Enable usb cdc ecm driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_CDC_ECM + default n + + config PKG_CHERRYUSB_HOST_CDC_RNDIS + bool + prompt "Enable usb rndis driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_CDC_RNDIS + default n + + config PKG_CHERRYUSB_HOST_CDC_NCM + bool + prompt "Enable usb cdc ncm driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_CDC_NCM + default n + + config PKG_CHERRYUSB_HOST_VIDEO + bool + prompt "Enable usb video driver, it is commercial charge" + default n + + config PKG_CHERRYUSB_HOST_AUDIO + bool + prompt "Enable usb audio driver, it is commercial charge" + default n + + config PKG_CHERRYUSB_HOST_BLUETOOTH + bool + prompt "Enable usb bluetooth driver" + default n + + config PKG_CHERRYUSB_HOST_ASIX + bool + prompt "Enable usb asix driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_ASIX + default n + + config PKG_CHERRYUSB_HOST_RTL8152 + bool + prompt "Enable usb rtl8152 driver" + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_RTL8152 + default n + + config PKG_CHERRYUSB_HOST_FTDI + bool + prompt "Enable usb ftdi driver" + default n + + config PKG_CHERRYUSB_HOST_CH34X + bool + prompt "Enable usb ch34x driver" + default n + + config PKG_CHERRYUSB_HOST_CP210X + bool + prompt "Enable usb cp210x driver" + default n + + config PKG_CHERRYUSB_HOST_PL2303 + bool + prompt "Enable usb pl2303 driver" + default n + + config CONFIG_USBHOST_PLATFORM_CDC_ECM + bool + + config CONFIG_USBHOST_PLATFORM_CDC_RNDIS + bool + + config CONFIG_USBHOST_PLATFORM_CDC_NCM + bool + + config CONFIG_USBHOST_PLATFORM_ASIX + bool + + config CONFIG_USBHOST_PLATFORM_RTL8152 + bool + + config CONFIG_USBHOST_PSC_PRIO + int + prompt "Set hubport change thread priority, 0 is the max priority" + default 0 + + config CONFIG_USBHOST_PSC_STACKSIZE + int + prompt "Set hubport change thread stacksize" + default 4096 + + config CONFIG_USBHOST_REQUEST_BUFFER_LEN + int + prompt "Set host control transfer max buffer size" + default 512 + + config CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT + int + prompt "Set host control transfer timeout, unit is ms" + default 500 + + config RT_LWIP_PBUF_POOL_BUFSIZE + int "The size of each pbuf in the pbuf pool" + range 1500 2000 + default 1600 + + config CONFIG_USB_DFS_MOUNT_POINT + string "usb host dfs mount point" + depends on RT_CHERRYUSB_HOST_MSC + default "/" + + menu "Select USB host template, please select class driver first" + config CONFIG_TEST_USBH_CDC_ACM + int + prompt "demo for test cdc acm, cannot enable this demo, we have used serial framework instead" + default 0 + depends on PKG_CHERRYUSB_HOST_CDC_ACM + config CONFIG_TEST_USBH_HID + int + prompt "demo for test hid" + default 0 + depends on PKG_CHERRYUSB_HOST_HID + config CONFIG_TEST_USBH_MSC + int + prompt "demo for test msc, cannot enable this demo, we have used dfs instead" + default 0 + depends on PKG_CHERRYUSB_HOST_MSC + endmenu + endif + + config PKG_CHERRYUSB_PATH + string + default "/packages/system/CherryUSB" + + choice + prompt "Version" + default PKG_USING_CHERRYUSB_V010503 + help + Select the package version + + config PKG_USING_CHERRYUSB_LATEST_VERSION + bool "latest" + config PKG_USING_CHERRYUSB_V010502 + bool "v1.5.3" + config PKG_USING_CHERRYUSB_V010502 + bool "v1.5.2" + config PKG_USING_CHERRYUSB_V010501 + bool "v1.5.1" + config PKG_USING_CHERRYUSB_V010500 + bool "v1.5.0" + config PKG_USING_CHERRYUSB_V010403 + bool "v1.4.3" + config PKG_USING_CHERRYUSB_V010301 + bool "v1.3.1" + config PKG_USING_CHERRYUSB_V010200 + bool "v1.2.0" + config PKG_USING_CHERRYUSB_V001002 + bool "v0.10.2" + endchoice + + config PKG_CHERRYUSB_VER + string + default "latest" if PKG_USING_CHERRYUSB_LATEST_VERSION + default "v1.5.3" if PKG_USING_CHERRYUSB_V010503 + default "v1.5.2" if PKG_USING_CHERRYUSB_V010502 + default "v1.5.1" if PKG_USING_CHERRYUSB_V010501 + default "v1.5.0" if PKG_USING_CHERRYUSB_V010500 + default "v1.4.3" if PKG_USING_CHERRYUSB_V010403 + default "v1.3.1" if PKG_USING_CHERRYUSB_V010301 + default "v1.2.0" if PKG_USING_CHERRYUSB_V010200 + default "v0.10.2" if PKG_USING_CHERRYUSB_V001002 +endif diff --git a/src/lib/CherryUSB/LICENSE b/src/lib/CherryUSB/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/src/lib/CherryUSB/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/src/lib/CherryUSB/README.md b/src/lib/CherryUSB/README.md new file mode 100644 index 000000000..d364ed64f --- /dev/null +++ b/src/lib/CherryUSB/README.md @@ -0,0 +1,232 @@ +**English | [简体中文](README_zh.md)** + +

CherryUSB

+

+ + + + +

+ +CherryUSB is a tiny and beautiful, high performance and portable USB host and device stack for embedded system with USB IP. + +![CherryUSB](CherryUSB.svg) + +## Why choose CherryUSB + +### Easy to study USB + +In order to make it easier for users to learn USB basics, enumeration, driver loading and IP drivers, the code has been written with the following advantages: + +- Lean code, simple logic, no complex C syntax +- Tree-based programming with cascading code +- Class-drivers and porting-drivers are templating and simplification +- Clear API classification (slave: initialisation, registration api, command callback api, data sending and receiving api; host: initialisation, lookup api, data sending and receiving api) + +### Easy to use USB + +In order to facilitate the use of the USB interface and to take into account the fact that users have learned about uart and dma, the following advantages have been designed for the data sending and receiving class of interface: + +- Equivalent to using uart tx dma/uart rx dma +- There is no limit to the length of send and receive, the user does not need to care about the USB packetization process (the porting driver does it) + +### Easy to bring out USB performance + +Taking into account USB performance issues and trying to achieve the theoretical bandwidth of the USB hardware, the design of the data transceiver class interface has the following advantages: + +- Porting drivers directly to registers, no abstraction layer encapsulation +- Memory zero copy +- If IP has DMA then uses DMA mode (DMA with hardware packetization) +- Unlimited length make it easier to interface with hardware DMA and take advantage of DMA +- Packetization is handled in interrupt + +Performance show:https://cherryusb.cherry-embedded.org/show/ + +## Directory Structure + +| Directory | Description | +|:-------------:|:---------------------------:| +|class | usb class driver | +|common | usb spec macros and utils | +|core | usb core implementation | +|demo | usb device and host demo | +|osal | os wrapper | +|platform | class support for other os | +|docs | doc for guiding | +|port | usb dcd and hcd porting | +|tools | tool url | + +## Device Stack Overview + +CherryUSB Device Stack provides a unified framework of functions for standard device requests, CLASS requests, VENDOR requests and custom special requests. The object-oriented and chained approach allows the user to quickly get started with composite devices without having to worry about the underlying logic. At the same time, a standard dcd porting interface has been standardised for adapting different USB IPs to achieve ip-oriented programming. + +CherryUSB Device Stack has the following functions: + +- Support USB2.0 full and high speed(USB3.0 super speed TODO) +- Support endpoint irq callback register by users, let users do whatever they wants in endpoint irq callback. +- Support Composite Device +- Support Communication Device Class (CDC_ACM, CDC_ECM) +- Support Human Interface Device (HID) +- Support Mass Storage Class (MSC) +- Support USB VIDEO CLASS (UVC1.0, UVC1.5) +- Support USB AUDIO CLASS (UAC1.0, UAC2.0) +- Support Device Firmware Upgrade CLASS (DFU) +- Support USB MIDI CLASS (MIDI) +- Support Remote NDIS (RNDIS) +- Support Media Transfer Protocol (MTP) +- Support WINUSB1.0, WINUSB2.0, WEBUSB, BOS +- Support Vendor class +- Support UF2 +- Support Android Debug Bridge (Only support shell) +- Support multi device with the same USB IP + +CherryUSB Device Stack resource usage (GCC 10.2 with -O2, disable log): + +| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | +|:-------------:|:--------------:|:-------------------------:|:-------------:|:----------------:| +|usbd_core.c | ~4500 | (512(default) + 320) * bus | 0 | 0 | +|usbd_cdc_acm.c | ~900 | 0 | 0 | 0 | +|usbd_msc.c | ~5000 | (128 + 512(default)) * bus | 16 * bus | 0 | +|usbd_hid.c | ~300 | 0 | 0 | 0 | +|usbd_audio.c | ~4000 | 0 | 0 | 0 | +|usbd_video.c | ~7000 | 0 | 132 * bus | 0 | +|usbd_rndis.c | ~2500 | 2 * 1580(default)+156+8 | 80 | 0 | +|usbd_cdc_ecm.c | ~900 | 2 * 1514(default)+16 | 42 | 0 | +|usbd_mtp.c | ~9000 | 2048(default)+128 | sizeof(struct mtp_object) * n| 0 | + +## Host Stack Overview + +The CherryUSB Host Stack has a standard enumeration implementation for devices mounted on root hubs and external hubs, and a standard interface for different Classes to indicate what the Class driver needs to do after enumeration and after disconnection. A standard hcd porting interface has also been standardised for adapting different USB IPs for IP-oriented programming. Finally, the host stack is managed using os, and provides osal to make a adaptation for different os. + +CherryUSB Host Stack has the following functions: + +- Support low speed, full speed, high speed and super speed devices +- Automatic loading of supported Class drivers +- Support blocking transfers and asynchronous transfers +- Support Composite Device +- Multi-level HUB support, expandable up to 7 levels(Testing hub with 10 ports works well,only support dwc2/ehci/xhci/rp2040) +- Support Communication Device Class (CDC_ACM, CDC_ECM, CDC_NCM) +- Support Human Interface Device (HID) +- Support Mass Storage Class (MSC) +- Support USB Video CLASS (UVC1.0, UVC1.5) +- Support USB Audio CLASS (UAC1.0) +- Support Remote NDIS (RNDIS) +- Support USB Bluetooth class (support nimble and zephyr bluetooth stack, support **CLASS:0xE0** or vendor class like cdc acm) +- Support Vendor class (serial, net, wifi) +- Support USB modeswitch +- Support Android Open Accessory +- Support multi host with the same USB IP + +The CherryUSB Host stack also provides the lsusb function, which allows you to view information about all mounted devices, including those on external hubs, with the help of a shell plugin. + +CherryUSB Host Stack resource usage (GCC 10.2 with -O2, disable log): + +| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | +|:-------------:|:--------------:|:-------------------------------:|:---------------------------:|:------------:| +|usbh_core.c | ~4500 | (512(default) + 8 * (1+x) *n) * bus | sizeof(struct usbh_hub) * bus | raw_config_desc | +|usbh_hub.c | ~3500 | (32 + 4 * (1+x)) * bus | 12 + sizeof(struct usbh_hub) * x | 0 | +|usbh_cdc_acm.c | ~600 | 7 * x | 4 + sizeof(struct usbh_cdc_acm) * x | 0 | +|usbh_msc.c | ~2000 | 128 * x | 4 + sizeof(struct usbh_msc) * x | 0 | +|usbh_hid.c | ~800 | 64 * x | 4 + sizeof(struct usbh_hid) * x | 0 | +|usbh_video.c | ~5000 | 128 * x | 4 + sizeof(struct usbh_video) * x | 0 | +|usbh_audio.c | ~4000 | 128 * x | 4 + sizeof(struct usbh_audio) * x | 0 | +|usbh_rndis.c | ~3000 | 512 + 2 * 2048(default)| sizeof(struct usbh_rndis) * 1 | 0 | +|usbh_cdc_ecm.c | ~1500 | 2 * 1514 + 16 | sizeof(struct usbh_cdc_ecm) * 1 | 0 | +|usbh_cdc_ncm.c | ~2000 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_cdc_ncm) * 1| 0 | +|usbh_bluetooth.c | ~1000 | 2 * 2048(default) | sizeof(struct usbh_bluetooth) * 1 | 0 | +|usbh_asix.c | ~7000 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_asix) * 1 | 0 | +|usbh_rtl8152.c | ~9000 | 16K+ 2K(default) + 2 + 32 | sizeof(struct usbh_rtl8152) * 1 | 0 | + +Among them, `sizeof(struct usbh_hub)` and `sizeof(struct usbh_hubport)` are affected by the following macros: + +``` +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 +``` + +x is affected by the following macros: + +``` +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 +``` + +## USB IP Support + +Only standard and commercial USB IP are listed. + +| IP | device | host | Support status | +|:----------------:|:----------:|:--------:|:--------------:| +| OHCI(intel) | none | OHCI | √ | +| EHCI(intel) | none | EHCI | √ | +| XHCI(intel) | none | XHCI | √ | +| UHCI(intel) | none | UHCI | × | +| DWC2(synopsys) | DWC2 | DWC2 | √ | +| MUSB(mentor) | MUSB | MUSB | √ | +| FOTG210(faraday)| FOTG210 | EHCI | √ | +| CHIPIDEA(synopsys)| CHIPIDEA | EHCI | √ | +| CDNS2(cadence) | CDNS2 | CDNS2 | √ | +| CDNS3(cadence) | CDNS3 | XHCI | × | +| DWC3(synopsys) | DWC3 | XHCI | × | + +## Documentation Tutorial + +Quickly start, USB basic concepts, API manual, Class basic concepts and examples, see [CherryUSB Documentation Tutorial](https://cherryusb.readthedocs.io/). + +## Video Tutorial + +CherryUSB Cheese (based V1.4.3): https://www.bilibili.com/cheese/play/ss707687201 . + +## Descriptor Generator Tool + +TODO + +## Demo Repo + +| Manufacturer | CHIP or Series | USB IP| Repo Url | Support version | Note | +|:--------------------:|:------------------:|:-----:|:--------:|:------------------:|:-------------:| +|Bouffalolab | BL702/BL616/BL808 | bouffalolab/ehci|[bouffalo_sdk](https://github.com/CherryUSB/bouffalo_sdk)|<= latest | Official | +|ST | STM32F1x/STM32F4/STM32H7 | fsdev/dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Community | +|HPMicro | HPM6000/HPM5000 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Official | +|Essemi | ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Official | +|Phytium | e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|>=1.4.0 | Official | +|Artinchip | d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest | Official | +|Espressif | esp32s2/esp32s3/esp32p4 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)/[espressif](https://github.com/espressif/esp-idf/tree/master/examples/peripherals/usb)|<= latest | Official | +|Kendryte | k230 | dwc2 |[k230_repo](https://github.com/CherryUSB/k230_sdk)|v1.2.0 | Official | +|Actionstech | ATS30xx | dwc2 |[action_zephyr_repo](https://github.com/CherryUSB/lv_port_actions_technology/tree/master/action_technology_sdk)|>=1.4.0 | Official | +|SiFli | SF32LB5x | musb |[SiFli_sdk](https://github.com/OpenSiFli/SiFli-SDK)|>=1.5.0 | Official | +|NXP | mcx | kinetis/chipidea/ehci |[nxp_mcx_repo](https://github.com/CherryUSB/cherryusb_mcx)|<= latest | Community | +|Nationstech | n32h4x | dwc2 |[nation_repo](https://github.com/CherryUSB/cherryusb_nation)|>=1.5.0 | Official ongoing | +|Raspberry pi | rp2040/rp2350 | rp2040 |[pico-sdk](https://github.com/CherryUSB/pico-sdk)|<= latest | Official ongoing | +|AllwinnerTech | F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | no more update | +|Bekencorp | bk7256/bk7258 | musb |[bk_idk](https://github.com/CherryUSB/bk_idk)| v0.7.0 | Official | +|Sophgo | cv18xx | dwc2 |[cvi_alios_open](https://github.com/CherryUSB/cvi_alios_open)| v0.7.0 | Official | +|WCH | CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2/>=v1.5.0 | no more update | + +## Package Support + +CherryUSB package is available as follows: + +- [RT-Thread](https://packages.rt-thread.org/detail.html?package=CherryUSB) +- [YOC](https://www.xrvm.cn/document?temp=usb-host-protocol-stack-device-driver-adaptation-instructions&slug=yocbook) +- [ESP-Registry](https://components.espressif.com/components/cherry-embedded/cherryusb) + +## Commercial Support + +Refer to https://cherryusb.readthedocs.io/zh-cn/latest/support/index.html. + +## Contact + +CherryUSB discord: https://discord.com/invite/wFfvrSAey8. + +## Company Support + +Thanks to the following companies for their support (in no particular order): + + diff --git a/src/lib/CherryUSB/README_zh.md b/src/lib/CherryUSB/README_zh.md new file mode 100644 index 000000000..1e1ec40ca --- /dev/null +++ b/src/lib/CherryUSB/README_zh.md @@ -0,0 +1,234 @@ +**[English](README.md) | 简体中文** + +

CherryUSB

+

+ + + + +

+ +CherryUSB 是一个小而美的、可移植性高的、用于嵌入式系统(带 USB IP)的高性能 USB 主从协议栈。 + +![CherryUSB](CherryUSB.svg) + +## 为什么选择 CherryUSB + +### 易于学习 USB + +为了方便用户学习 USB 基本知识、枚举、驱动加载、IP 驱动,因此,编写的代码具备以下优点: + +- 代码精简,逻辑简单,无复杂 C 语言语法 +- 树状化编程,代码层层递进 +- Class 驱动和 porting 驱动模板化、精简化 +- API 分类清晰(从机:初始化、注册类、命令回调类、数据收发类;主机:初始化、查找类、数据收发类) + +### 易于使用 USB + +为了方便用户使用 USB 接口,考虑到用户学习过 uart 和 dma,因此,设计的数据收发类接口具备以下优点: + +- 等价于使用 uart tx dma/uart rx dma +- 收发长度没有限制,用户不需要关心 USB 分包过程(分包过程在 porting 中处理) + +### 易于发挥 USB 性能 + +考虑到 USB 性能问题,尽量达到 USB 硬件理论带宽,因此,设计的数据收发类接口具备以下优点: + +- Porting 驱动直接对接寄存器,无抽象层封装 +- Memory zero copy +- IP 如果带 DMA 则使用 DMA 模式(DMA 带硬件分包功能) +- 长度无限制,方便对接硬件 DMA 并且发挥 DMA 的优势 +- 分包过程在中断中执行 + +性能展示:https://cherryusb.cherry-embedded.org/show/ + +## 目录结构 + +| 目录名 | 描述 | +|:-------------:|:-------------------------------:| +|class | usb class 类主从驱动 | +|common | usb spec 定义、常用宏、标准接口定义 | +|core | usb 主从协议栈核心实现 | +|demo | 主从 class demo | +|docs | 文档 | +|osal | os 封装层 | +|platform | 其他 os 全家桶适配 | +|port | usb 主从需要实现的 porting 接口 | +|tools | 工具链接 | + +## Device 协议栈简介 + +CherryUSB Device 协议栈对标准设备请求、CLASS 请求、VENDOR 请求以及 custom 特殊请求规范了一套统一的函数框架,采用面向对象和链表的方式,能够使得用户快速上手复合设备,不用管底层的逻辑。同时,规范了一套标准的 dcd porting 接口,用于适配不同的 USB IP,达到面向 ip 编程。 + +CherryUSB Device 协议栈当前实现以下功能: + +- 支持 USB2.0 全速和高速设备(USB3.0 超高速 TODO) +- 支持端点中断注册功能,porting 给用户自己处理中断里的数据 +- 支持复合设备 +- 支持 Communication Device Class (CDC_ACM, CDC_ECM) +- 支持 Human Interface Device (HID) +- 支持 Mass Storage Class (MSC) +- 支持 USB VIDEO CLASS (UVC1.0、UVC1.5) +- 支持 USB AUDIO CLASS (UAC1.0、UAC2.0) +- 支持 Device Firmware Upgrade CLASS (DFU) +- 支持 USB MIDI CLASS (MIDI) +- 支持 Remote NDIS (RNDIS) +- 支持 Media Transfer Protocol (MTP) +- 支持 WINUSB1.0、WINUSB2.0、WEBUSB、BOS +- 支持 Vendor 类 class +- 支持 UF2 +- 支持 Android Debug Bridge (Only support shell) +- 支持相同 USB IP 的多从机 + +CherryUSB Device 协议栈资源占用说明(GCC 10.2 with -O2): + +| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | +|:-------------:|:--------------:|:-------------------------:|:-------------:|:----------------:| +|usbd_core.c | ~4500 | (512(default) + 320) * bus | 0 | 0 | +|usbd_cdc_acm.c | ~900 | 0 | 0 | 0 | +|usbd_msc.c | ~5000 | (128 + 512(default)) * bus | 16 * bus | 0 | +|usbd_hid.c | ~300 | 0 | 0 | 0 | +|usbd_audio.c | ~4000 | 0 | 0 | 0 | +|usbd_video.c | ~7000 | 0 | 132 * bus | 0 | +|usbd_rndis.c | ~2500 | 2 * 1580(default)+156+8 | 80 | 0 | +|usbd_cdc_ecm.c | ~900 | 2 * 1514(default)+16 | 42 | 0 | +|usbd_mtp.c | ~9000 | 2048(default)+128 | sizeof(struct mtp_object) * n| 0 | + +## Host 协议栈简介 + +CherryUSB Host 协议栈对挂载在 root hub、外部 hub 上的设备规范了一套标准的枚举实现,对不同的 Class 类也规范了一套标准接口,用来指示在枚举后和断开连接后该 Class 驱动需要做的事情。同时,规范了一套标准的 hcd porting 接口,用于适配不同的 USB IP,达到面向 IP 编程。最后,协议栈使用 OS 管理,并提供了 osal 用来适配不同的 os。 + +CherryUSB Host 协议栈当前实现以下功能: + +- 支持 low speed,full speed,high speed 和 super speed 设备 +- 自动加载支持的Class 驱动 +- 支持阻塞式传输和异步传输 +- 支持复合设备 +- 支持多级 HUB,最高可拓展到 7 级(目前测试 1拖 10 没有问题,仅支持 dwc2/ehci/xhci/rp2040) +- 支持 Communication Device Class (CDC_ACM, CDC_ECM, CDC_NCM) +- 支持 Human Interface Device (HID) +- 支持 Mass Storage Class (MSC) +- Support USB Video CLASS (UVC1.0、UVC1.5) +- Support USB Audio CLASS (UAC1.0) +- 支持 Remote NDIS (RNDIS) +- 支持 USB Bluetooth (支持 nimble and zephyr bluetooth 协议栈,支持 **CLASS: 0xE0** 或者厂家自定义类,类似于 cdc acm 功能) +- 支持 Vendor 类 class (serial, net, wifi) +- 支持 USB modeswitch +- 支持 Android Open Accessory +- 支持相同 USB IP 的多主机 + +同时,CherryUSB Host 协议栈还提供了 lsusb 的功能,借助 shell 插件可以查看所有挂载设备的信息,包括外部 hub 上的设备的信息。 + +CherryUSB Host 协议栈资源占用说明(GCC 10.2 with -O2,关闭 log): + +| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | +|:-------------:|:--------------:|:-------------------------------:|:---------------------------:|:------------:| +|usbh_core.c | ~4500 | (512(default) + 8 * (1+x) *n) * bus | sizeof(struct usbh_hub) * bus | raw_config_desc | +|usbh_hub.c | ~3500 | (32 + 4 * (1+x)) * bus | 12 + sizeof(struct usbh_hub) * x | 0 | +|usbh_cdc_acm.c | ~600 | 7 * x | 4 + sizeof(struct usbh_cdc_acm) * x | 0 | +|usbh_msc.c | ~2000 | 128 * x | 4 + sizeof(struct usbh_msc) * x | 0 | +|usbh_hid.c | ~800 | 64 * x | 4 + sizeof(struct usbh_hid) * x | 0 | +|usbh_video.c | ~5000 | 128 * x | 4 + sizeof(struct usbh_video) * x | 0 | +|usbh_audio.c | ~4000 | 128 * x | 4 + sizeof(struct usbh_audio) * x | 0 | +|usbh_rndis.c | ~3000 | 512 + 2 * 2048(default)| sizeof(struct usbh_rndis) * 1 | 0 | +|usbh_cdc_ecm.c | ~1500 | 2 * 1514 + 16 | sizeof(struct usbh_cdc_ecm) * 1 | 0 | +|usbh_cdc_ncm.c | ~2000 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_cdc_ncm) * 1| 0 | +|usbh_bluetooth.c | ~1000 | 2 * 2048(default) | sizeof(struct usbh_bluetooth) * 1 | 0 | +|usbh_asix.c | ~7000 | 2 * 2048(default) + 16 + 32 | sizeof(struct usbh_asix) * 1 | 0 | +|usbh_rtl8152.c | ~9000 | 16K+ 2K(default) + 2 + 32 | sizeof(struct usbh_rtl8152) * 1 | 0 | + +其中,`sizeof(struct usbh_hub)` 和 `sizeof(struct usbh_hubport)` 受以下宏影响: + +``` +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 +``` + +x 受以下宏影响: + +``` +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 +``` + +## USB IP 支持情况 + +仅列举标准 USB IP 和商业性 USB IP + +| IP | device | host | Support status | +|:----------------:|:----------:|:--------:|:--------------:| +| OHCI(intel) | none | OHCI | √ | +| EHCI(intel) | none | EHCI | √ | +| XHCI(intel) | none | XHCI | √ | +| UHCI(intel) | none | UHCI | × | +| DWC2(synopsys) | DWC2 | DWC2 | √ | +| MUSB(mentor) | MUSB | MUSB | √ | +| FOTG210(faraday)| FOTG210 | EHCI | √ | +| CHIPIDEA(synopsys)| CHIPIDEA | EHCI | √ | +| CDNS2(cadence) | CDNS2 | CDNS2 | √ | +| CDNS3(cadence) | CDNS3 | XHCI | × | +| DWC3(synopsys) | DWC3 | XHCI | × | + +## 文档教程 + +CherryUSB 快速入门、USB 基本概念、API 手册、Class 基本概念和例程,参考 [CherryUSB Documentation Tutorial](https://cherryusb.readthedocs.io/)。 + +## 视频教程 + +CherryUSB 课程(基于 V1.4.3):https://www.bilibili.com/cheese/play/ss707687201 。 + +## 描述符生成工具 + +TODO + +## 示例仓库 + +| Manufacturer | CHIP or Series | USB IP| Repo Url | Support version | Note | +|:--------------------:|:------------------:|:-----:|:--------:|:------------------:|:-------------:| +|Bouffalolab | BL702/BL616/BL808 | bouffalolab/ehci|[bouffalo_sdk](https://github.com/CherryUSB/bouffalo_sdk)|<= latest | Official | +|ST | STM32F1x/STM32F4/STM32H7 | fsdev/dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Community | +|HPMicro | HPM6000/HPM5000 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Official | +|Essemi | ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Official | +|Phytium | e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|>=1.4.0 | Official | +|Artinchip | d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest | Official | +|Espressif | esp32s2/esp32s3/esp32p4 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)/[espressif](https://github.com/espressif/esp-idf/tree/master/examples/peripherals/usb)|<= latest | Official | +|Kendryte | k230 | dwc2 |[k230_repo](https://github.com/CherryUSB/k230_sdk)|v1.2.0 | Official | +|Actionstech | ATS30xx | dwc2 |[action_zephyr_repo](https://github.com/CherryUSB/lv_port_actions_technology/tree/master/action_technology_sdk)|>=1.4.0 | Official | +|SiFli | SF32LB5x | musb |[SiFli_sdk](https://github.com/OpenSiFli/SiFli-SDK)|>=1.5.0 | Official | +|NXP | mcx | kinetis/chipidea/ehci |[nxp_mcx_repo](https://github.com/CherryUSB/cherryusb_mcx)|<= latest | Community | +|Nationstech | n32h4x | dwc2 |[nation_repo](https://github.com/CherryUSB/cherryusb_nation)|>=1.5.0 | Official ongoing | +|Raspberry pi | rp2040/rp2350 | rp2040 |[pico-sdk](https://github.com/CherryUSB/pico-sdk)|<= latest | Official ongoing | +|AllwinnerTech | F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | no more update | +|Bekencorp | bk7256/bk7258 | musb |[bk_idk](https://github.com/CherryUSB/bk_idk)| v0.7.0 | Official | +|Sophgo | cv18xx | dwc2 |[cvi_alios_open](https://github.com/CherryUSB/cvi_alios_open)| v0.7.0 | Official | +|WCH | CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2/>=v1.5.0 | no more update | + +## 软件包支持 + +CherryUSB 软件包可以通过以下方式获取: + +- [RT-Thread](https://packages.rt-thread.org/detail.html?package=CherryUSB) +- [YOC](https://www.xrvm.cn/document?temp=usb-host-protocol-stack-device-driver-adaptation-instructions&slug=yocbook) +- [ESP-Registry](https://components.espressif.com/components/cherry-embedded/cherryusb) + +## 商业支持 + +参考 https://cherryusb.readthedocs.io/zh-cn/latest/support/index.html 。 + +## 联系 + +CherryUSB QQ群:642693751 + +CherryUSB 微信群:与我联系后邀请加入 + +## 支持企业 + +感谢以下企业支持(顺序不分先后): + + diff --git a/src/lib/CherryUSB/SConscript b/src/lib/CherryUSB/SConscript new file mode 100644 index 000000000..a4bc81630 --- /dev/null +++ b/src/lib/CherryUSB/SConscript @@ -0,0 +1,328 @@ +from building import * + +cwd = GetCurrentDir() +path = [cwd] +path += [cwd + '/common'] +path += [cwd + '/core'] +path += [cwd + '/class/hub'] +path += [cwd + '/class/cdc'] +path += [cwd + '/class/msc'] +path += [cwd + '/class/hid'] +path += [cwd + '/class/audio'] +path += [cwd + '/class/video'] +path += [cwd + '/class/wireless'] +path += [cwd + '/class/midi'] +path += [cwd + '/class/adb'] +path += [cwd + '/class/dfu'] +path += [cwd + '/class/midi'] +path += [cwd + '/class/vendor/net'] +path += [cwd + '/class/vendor/serial'] +path += [cwd + '/class/vendor/wifi'] +src = [] + +LIBS = [] +LIBPATH = [] +CPPDEFINES = [] + +# USB DEVICE +if GetDepend(['PKG_CHERRYUSB_DEVICE']): + path += [cwd + '/osal'] + src += Glob('core/usbd_core.c') + src += Glob('osal/usb_osal_rtthread.c') + + if GetDepend(['PKG_CHERRYUSB_DEVICE_SPEED_HS']): + CPPDEFINES+=['CONFIG_USB_HS'] + + if GetDepend(['PKG_CHERRYUSB_DEVICE_FSDEV_ST']): + src += Glob('port/fsdev/usb_dc_fsdev.c') + src += Glob('port/fsdev/usb_glue_st.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_FSDEV_CUSTOM']): + src += Glob('port/fsdev/usb_dc_fsdev.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_DWC2_ST']): + src += Glob('port/dwc2/usb_dc_dwc2.c') + src += Glob('port/dwc2/usb_glue_st.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_DWC2_ESP']): + src += Glob('port/dwc2/usb_dc_dwc2.c') + src += Glob('port/dwc2/usb_glue_esp.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_DWC2_KENDRYTE']): + src += Glob('port/dwc2/usb_dc_dwc2.c') + src += Glob('port/dwc2/usb_glue_kendryte.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_DWC2_AT']): + src += Glob('port/dwc2/usb_dc_dwc2.c') + src += Glob('port/dwc2/usb_glue_at.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_DWC2_HC']): + src += Glob('port/dwc2/usb_dc_dwc2.c') + src += Glob('port/dwc2/usb_glue_hc.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_DWC2_NATION']): + src += Glob('port/dwc2/usb_dc_dwc2.c') + src += Glob('port/dwc2/usb_glue_nation.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_DWC2_GD']): + src += Glob('port/dwc2/usb_dc_dwc2.c') + src += Glob('port/dwc2/usb_glue_gd.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_DWC2_CUSTOM']): + src += Glob('port/dwc2/usb_dc_dwc2.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_MUSB_ES']): + src += Glob('port/musb/usb_dc_musb.c') + src += Glob('port/musb/usb_glue_es.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_MUSB_SUNXI']): + src += Glob('port/musb/usb_dc_musb.c') + src += Glob('port/musb/usb_glue_sunxi.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_MUSB_BK']): + src += Glob('port/musb/usb_dc_musb.c') + src += Glob('port/musb/usb_glue_bk.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_MUSB_SIFLI']): + src += Glob('port/musb/usb_dc_musb.c') + src += Glob('port/musb/usb_glue_sifli.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_MUSB_CUSTOM']): + src += Glob('port/musb/usb_dc_musb.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_CHIPIDEA_MCX']): + path += [cwd + '/port/chipidea'] + src += Glob('port/chipidea/usb_dc_chipidea.c') + src += Glob('port/nxp/usb_glue_mcx.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_CHIPIDEA_CUSTOM']): + path += [cwd + '/port/chipidea'] + src += Glob('port/chipidea/usb_dc_chipidea.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_KINETIS_MCX']): + src += Glob('port/kinetis/usb_dc_kinetis.c') + src += Glob('port/kinetis/usb_glue_mcx.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_KINETIS_CUSTOM']): + src += Glob('port/kinetis/usb_dc_kinetis.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_BL']): + src += Glob('port/bouffalolab/usb_dc_bl.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_HPM']): + path += [cwd + '/port/hpmicro'] + src += Glob('port/hpmicro/usb_dc_hpm.c') + src += Glob('port/hpmicro/usb_glue_hpm.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_AIC']): + src += Glob('port/aic/usb_dc_aic.c') + src += Glob('port/aic/usb_dc_aic_ll.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_CH32']): + if GetDepend(['PKG_CHERRYUSB_DEVICE_HS']): + src += Glob('port/ch32/usb_dc_usbhs.c') + else: + src += Glob('port/ch32/usb_dc_usbfs.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_PUSB2']): + path += [cwd + '/port/pusb2/rt-thread'] + src += Glob('port/pusb2/rt-thread/usb_dc_glue_phytium.c') + if GetDepend(['ARCH_ARMV8']): + LIBPATH = [cwd + '/port/pusb2'] + LIBS = ['libpusb2_dc_a64.a'] + if GetDepend(['ARCH_ARM_CORTEX_A']): + LIBPATH = [cwd + '/port/pusb2'] + LIBS = ['libpusb2_dc_a32_softfp_neon.a'] + if GetDepend(['PKG_CHERRYUSB_DEVICE_NRF5X']): + src += Glob('port/nrf5x/usb_dc_nrf5x.c') + + if GetDepend(['PKG_CHERRYUSB_DEVICE_CDC_ACM']): + src += Glob('class/cdc/usbd_cdc_acm.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_HID']): + src += Glob('class/hid/usbd_hid.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_MSC']): + src += Glob('class/msc/usbd_msc.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_AUDIO']): + src += Glob('class/audio/usbd_audio.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_VIDEO']): + src += Glob('class/video/usbd_video.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_CDC_RNDIS']): + src += Glob('class/wireless/usbd_rndis.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_CDC_ECM']): + src += Glob('class/cdc/usbd_cdc_ecm.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_CDC_NCM']): + src += Glob('class/cdc/usbd_cdc_ncm.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_DFU']): + src += Glob('class/dfu/usbd_dfu.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_ADB']): + src += Glob('class/adb/usbd_adb.c') + src += Glob('platform/rtthread/usbd_adb_shell.c') + + if GetDepend(['PKG_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV']): + src += Glob('platform/rtthread/usbd_serial.c') + + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM']): + src += Glob('demo/cdc_acm_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC']) or GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV']): + src += Glob('demo/msc_ram_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE']): + src += Glob('demo/hid_mouse_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD']): + src += Glob('demo/hid_keyboard_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_HID_CUSTOM']): + src += Glob('demo/hid_custom_inout_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_VIDEO']): + src += Glob('demo/video_static_mjpeg_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V1_MIC_SPEAKER']): + src += Glob('demo/audio_v1_mic_speaker_multichan_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V2_MIC_SPEAKER']): + src += Glob('demo/audio_v2_mic_speaker_multichan_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_RNDIS']): + src += Glob('demo/cdc_rndis_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ECM']): + src += Glob('demo/cdc_ecm_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_NCM']): + src += Glob('demo/cdc_ncm_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC']): + src += Glob('demo/cdc_acm_msc_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC_HID']): + src += Glob('demo/cdc_acm_hid_msc_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1']): + src += Glob('demo/winusb1.0_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2']): + src += Glob('demo/winusb2.0_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC']): + src += Glob('demo/winusb2.0_cdc_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_WEBUSB_HID']): + src += Glob('demo/webusb_hid_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_ADB']): + src += Glob('demo/adb/usbd_adb_template.c') + if GetDepend(['PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_CHARDEV']): + src += Glob('demo/cdc_acm_rttchardev_template.c') + +# USB HOST +if GetDepend(['PKG_CHERRYUSB_HOST']): + src += Glob('core/usbh_core.c') + src += Glob('class/hub/usbh_hub.c') + src += Glob('osal/usb_osal_rtthread.c') + + if GetDepend(['PKG_CHERRYUSB_HOST_EHCI_BL']): + src += Glob('port/ehci/usb_hc_ehci.c') + src += Glob('port/ehci/usb_glue_bouffalo.c') + if GetDepend(['PKG_CHERRYUSB_HOST_EHCI_HPM']): + path += [cwd + '/port/hpmicro'] + src += Glob('port/ehci/usb_hc_ehci.c') + src += Glob('port/hpmicro/usb_hc_hpm.c') + src += Glob('port/hpmicro/usb_glue_hpm.c') + if GetDepend(['PKG_CHERRYUSB_HOST_EHCI_AIC']): + path += [cwd + '/port/ehci'] + path += [cwd + '/port/ohci'] + src += Glob('port/ehci/usb_hc_ehci.c') + src += Glob('port/ehci/usb_glue_aic.c') + src += Glob('port/ohci/usb_hc_ohci.c') + if GetDepend(['PKG_CHERRYUSB_HOST_EHCI_MCX']): + path += [cwd + '/port/chipidea'] + src += Glob('port/ehci/usb_hc_ehci.c') + src += Glob('port/nxp/usb_glue_mcx.c') + if GetDepend(['PKG_CHERRYUSB_HOST_EHCI_NUC980']): + src += Glob('port/ehci/usb_hc_ehci.c') + src += Glob('port/ehci/usb_glue_nuc980.c') + if GetDepend(['PKG_CHERRYUSB_HOST_EHCI_MA35D0']): + src += Glob('port/ehci/usb_hc_ehci.c') + src += Glob('port/ehci/usb_glue_ma35d0.c') + if GetDepend(['PKG_CHERRYUSB_HOST_EHCI_CUSTOM']): + src += Glob('port/ehci/usb_hc_ehci.c') + if GetDepend(['PKG_CHERRYUSB_HOST_DWC2_ST']): + src += Glob('port/dwc2/usb_hc_dwc2.c') + src += Glob('port/dwc2/usb_glue_st.c') + if GetDepend(['PKG_CHERRYUSB_HOST_DWC2_ESP']): + src += Glob('port/dwc2/usb_hc_dwc2.c') + src += Glob('port/dwc2/usb_glue_esp.c') + if GetDepend(['PKG_CHERRYUSB_HOST_DWC2_KENDRYTE']): + src += Glob('port/dwc2/usb_hc_dwc2.c') + src += Glob('port/dwc2/usb_glue_kendryte.c') + if GetDepend(['PKG_CHERRYUSB_HOST_DWC2_HC']): + src += Glob('port/dwc2/usb_hc_dwc2.c') + src += Glob('port/dwc2/usb_glue_hc.c') + if GetDepend(['PKG_CHERRYUSB_HOST_DWC2_NATION']): + src += Glob('port/dwc2/usb_hc_dwc2.c') + src += Glob('port/dwc2/usb_glue_nation.c') + if GetDepend(['PKG_CHERRYUSB_HOST_DWC2_CUSTOM']): + src += Glob('port/dwc2/usb_hc_dwc2.c') + if GetDepend(['PKG_CHERRYUSB_HOST_MUSB_STANDARD']): + src += Glob('port/musb/usb_hc_musb.c') + if GetDepend(['PKG_CHERRYUSB_HOST_MUSB_ES']): + src += Glob('port/musb/usb_hc_musb.c') + src += Glob('port/musb/usb_glue_es.c') + if GetDepend(['PKG_CHERRYUSB_HOST_MUSB_SUNXI']): + src += Glob('port/musb/usb_hc_musb.c') + src += Glob('port/musb/usb_glue_sunxi.c') + if GetDepend(['PKG_CHERRYUSB_HOST_MUSB_BK']): + src += Glob('port/musb/usb_hc_musb.c') + src += Glob('port/musb/usb_glue_bk.c') + if GetDepend(['PKG_CHERRYUSB_HOST_MUSB_SIFLI']): + src += Glob('port/musb/usb_hc_musb.c') + src += Glob('port/musb/usb_glue_sifli.c') + if GetDepend(['PKG_CHERRYUSB_HOST_MUSB_CUSTOM']): + src += Glob('port/musb/usb_hc_musb.c') + if GetDepend(['PKG_CHERRYUSB_HOST_KINETIS_MCX']): + src += Glob('port/kinetis/usb_hc_kinetis.c') + src += Glob('port/kinetis/usb_glue_mcx.c') + if GetDepend(['PKG_CHERRYUSB_HOST_KINETIS_CUSTOM']): + src += Glob('port/kinetis/usb_hc_kinetis.c') + if GetDepend(['PKG_CHERRYUSB_HOST_PUSB2']): + path += [cwd + '/port/pusb2/rt-thread'] + src += Glob('port/pusb2/rt-thread/usb_hc_glue_phytium.c') + if GetDepend(['ARCH_ARMV8']): + LIBPATH = [cwd + '/port/pusb2'] + LIBS = ['libpusb2_hc_a64.a'] + if GetDepend(['ARCH_ARM_CORTEX_A']): + LIBPATH = [cwd + '/port/pusb2'] + LIBS = ['libpusb2_hc_a32_softfp_neon.a'] + + if GetDepend(['PKG_CHERRYUSB_HOST_XHCI']): + path += [cwd + '/port/xhci/phytium/rt-thread'] + src += Glob('port/xhci/phytium/rt-thread/usb_glue_phytium_plat.c') + src += Glob('port/xhci/phytium/rt-thread/usb_glue_phytium.c') + if GetDepend(['ARCH_ARMV8']): + LIBPATH = [cwd + '/port/xhci/phytium'] + LIBS = ['libxhci_a64.a'] + if GetDepend(['ARCH_ARM_CORTEX_A']): + LIBPATH = [cwd + '/port/xhci/phytium'] + LIBS = ['libxhci_a32_softfp_neon.a'] + + if GetDepend(['PKG_CHERRYUSB_HOST_CDC_ACM']): + src += Glob('class/cdc/usbh_cdc_acm.c') + if GetDepend(['PKG_CHERRYUSB_HOST_HID']): + src += Glob('class/hid/usbh_hid.c') + if GetDepend(['PKG_CHERRYUSB_HOST_MSC']): + src += Glob('class/msc/usbh_msc.c') + if GetDepend(['PKG_CHERRYUSB_HOST_CDC_RNDIS']): + src += Glob('class/wireless/usbh_rndis.c') + if GetDepend(['PKG_CHERRYUSB_HOST_CDC_ECM']): + src += Glob('class/cdc/usbh_cdc_ecm.c') + if GetDepend(['PKG_CHERRYUSB_HOST_CDC_NCM']): + src += Glob('class/cdc/usbh_cdc_ncm.c') + if GetDepend(['PKG_CHERRYUSB_HOST_VIDEO']): + src += Glob('class/video/usbh_video.c') + if GetDepend(['PKG_CHERRYUSB_HOST_AUDIO']): + src += Glob('class/audio/usbh_audio.c') + if GetDepend(['PKG_CHERRYUSB_HOST_BLUETOOTH']): + src += Glob('class/wireless/usbh_bluetooth.c') + if GetDepend(['PKG_CHERRYUSB_HOST_ASIX']): + src += Glob('class/vendor/net/usbh_asix.c') + if GetDepend(['PKG_CHERRYUSB_HOST_RTL8152']): + src += Glob('class/vendor/net/usbh_rtl8152.c') + if GetDepend(['PKG_CHERRYUSB_HOST_FTDI']): + src += Glob('class/vendor/serial/usbh_ftdi.c') + if GetDepend(['PKG_CHERRYUSB_HOST_CH34X']): + src += Glob('class/vendor/serial/usbh_ch34x.c') + if GetDepend(['PKG_CHERRYUSB_HOST_CP210X']): + src += Glob('class/vendor/serial/usbh_cp210x.c') + if GetDepend(['PKG_CHERRYUSB_HOST_PL2303']): + src += Glob('class/vendor/serial/usbh_pl2303.c') + + if GetDepend(['CONFIG_TEST_USBH_HID']): + src += Glob('demo/usb_host.c') + + if GetDepend(['PKG_CHERRYUSB_HOST_CDC_ACM']) \ + or GetDepend(['PKG_CHERRYUSB_HOST_FTDI']) \ + or GetDepend(['PKG_CHERRYUSB_HOST_CH34X']) \ + or GetDepend(['PKG_CHERRYUSB_HOST_CP210X']) \ + or GetDepend(['PKG_CHERRYUSB_HOST_PL2303']): + src += Glob('platform/rtthread/usbh_serial.c') + + if GetDepend('RT_USING_DFS') and GetDepend(['PKG_CHERRYUSB_HOST_MSC']): + src += Glob('platform/rtthread/usbh_dfs.c') + + if GetDepend('PKG_CHERRYUSB_HOST_CDC_ECM') \ + or GetDepend('PKG_CHERRYUSB_HOST_CDC_RNDIS') \ + or GetDepend('PKG_CHERRYUSB_HOST_CDC_NCM') \ + or GetDepend('PKG_CHERRYUSB_HOST_ASIX') \ + or GetDepend('PKG_CHERRYUSB_HOST_RTL8152'): + src += Glob('platform/rtthread/usbh_lwip.c') + +src += Glob('platform/rtthread/usb_msh.c') +src += Glob('platform/rtthread/usb_check.c') + +group = DefineGroup('CherryUSB', src, depend = ['PKG_USING_CHERRYUSB'], LIBS = LIBS, LIBPATH=LIBPATH, CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') + diff --git a/src/lib/CherryUSB/VERSION b/src/lib/CherryUSB/VERSION new file mode 100644 index 000000000..4c224bf3c --- /dev/null +++ b/src/lib/CherryUSB/VERSION @@ -0,0 +1,5 @@ +VERSION_MAJOR = 1 +VERSION_MINOR = 5 +PATCHLEVEL = 3 +VERSION_TWEAK = 0 +EXTRAVERSION = 0 diff --git a/src/lib/CherryUSB/cherryusb.cmake b/src/lib/CherryUSB/cherryusb.cmake new file mode 100644 index 000000000..540ce97f0 --- /dev/null +++ b/src/lib/CherryUSB/cherryusb.cmake @@ -0,0 +1,371 @@ +# +# Copyright (c) 2024, sakumisu +# +# SPDX-License-Identifier: Apache-2.0 +# + +# cmake-format: off + +# set(CONFIG_CHERRYUSB_DEVICE 1) +# set(CONFIG_CHERRYUSB_DEVICE_CDC 1) +# set(CONFIG_CHERRYUSB_DEVICE_HID 1) +# set(CONFIG_CHERRYUSB_DEVICE_MSC 1) +# set(CONFIG_CHERRYUSB_DEVICE_AUDIO 1) +# set(CONFIG_CHERRYUSB_DEVICE_VIDEO 1) +# set(CONFIG_CHERRYUSB_DEVICE_DWC2_ST 1) + +# set(CONFIG_CHERRYUSB_HOST 1) +# set(CONFIG_CHERRYUSB_HOST_CDC_ACM 1) +# set(CONFIG_CHERRYUSB_HOST_CDC_ECM 1) +# set(CONFIG_CHERRYUSB_HOST_CDC_NCM 1) +# set(CONFIG_CHERRYUSB_HOST_HID 1) +# set(CONFIG_CHERRYUSB_HOST_MSC 1) +# set(CONFIG_CHERRYUSB_HOST_VIDEO 1) +# set(CONFIG_CHERRYUSB_HOST_AUDIO 1) +# set(CONFIG_CHERRYUSB_HOST_CDC_RNDIS 1) +# set(CONFIG_CHERRYUSB_HOST_BLUETOOTH 1) +# set(CONFIG_CHERRYUSB_HOST_ASIX 1) +# set(CONFIG_CHERRYUSB_HOST_RTL8152 1) +# set(CONFIG_CHERRYUSB_HOST_DWC2_ST 1) + +# set(CONFIG_CHERRYUSB_OSAL "freertos") +# cmake-format: on + +list( + APPEND + cherryusb_incs + ${CMAKE_CURRENT_LIST_DIR} + ${CMAKE_CURRENT_LIST_DIR}/common + ${CMAKE_CURRENT_LIST_DIR}/core + ${CMAKE_CURRENT_LIST_DIR}/class/hub + ${CMAKE_CURRENT_LIST_DIR}/class/cdc + ${CMAKE_CURRENT_LIST_DIR}/class/hid + ${CMAKE_CURRENT_LIST_DIR}/class/msc + ${CMAKE_CURRENT_LIST_DIR}/class/audio + ${CMAKE_CURRENT_LIST_DIR}/class/video + ${CMAKE_CURRENT_LIST_DIR}/class/wireless + ${CMAKE_CURRENT_LIST_DIR}/class/midi + ${CMAKE_CURRENT_LIST_DIR}/class/adb + ${CMAKE_CURRENT_LIST_DIR}/class/dfu + ${CMAKE_CURRENT_LIST_DIR}/class/vendor/net + ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial + ${CMAKE_CURRENT_LIST_DIR}/class/vendor/wifi + ${CMAKE_CURRENT_LIST_DIR}/class/aoa +) + +if(CONFIG_CHERRYUSB_DEVICE) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/core/usbd_core.c) + if(CONFIG_CHERRYUSB_DEVICE_CDC_ACM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/cdc/usbd_cdc_acm.c) + endif() + if(CONFIG_CHERRYUSB_DEVICE_HID) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/hid/usbd_hid.c) + endif() + if(CONFIG_CHERRYUSB_DEVICE_MSC) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/msc/usbd_msc.c) + endif() + if(CONFIG_CHERRYUSB_DEVICE_AUDIO) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/audio/usbd_audio.c) + endif() + if(CONFIG_CHERRYUSB_DEVICE_VIDEO) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/video/usbd_video.c) + endif() + if(CONFIG_CHERRYUSB_DEVICE_CDC_ECM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/cdc/usbd_cdc_ecm.c) + endif() + if(CONFIG_CHERRYUSB_DEVICE_CDC_NCM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/cdc/usbd_cdc_ncm.c) + endif() + if(CONFIG_CHERRYUSB_DEVICE_CDC_RNDIS) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/wireless/usbd_rndis.c) + endif() + if(CONFIG_CHERRYUSB_DEVICE_DFU) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/dfu/usbd_dfu.c) + endif() + if(CONFIG_CHERRYUSB_DEVICE_ADB) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/adb/usbd_adb.c) + endif() + + if(CONFIG_CHERRYUSB_DEVICE_FSDEV_ST) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/fsdev/usb_dc_fsdev.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/fsdev/usb_glue_st.c) + elseif(CONFIG_CHERRYUSB_DEVICE_FSDEV_CUSTOM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/fsdev/usb_dc_fsdev.c) + elseif(CONFIG_CHERRYUSB_DEVICE_DWC2_ST) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_dc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_st.c) + elseif(CONFIG_CHERRYUSB_DEVICE_DWC2_ESP) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_dc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_esp.c) + elseif(CONFIG_CHERRYUSB_DEVICE_DWC2_KENDRYTE) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_dc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_kendryte.c) + elseif(CONFIG_CHERRYUSB_DEVICE_DWC2_AT) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_dc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_at.c) + elseif(CONFIG_CHERRYUSB_DEVICE_DWC2_HC) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_dc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_hc.c) + elseif(CONFIG_CHERRYUSB_DEVICE_DWC2_GD) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_dc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_gd.c) + elseif(CONFIG_CHERRYUSB_DEVICE_DWC2_CUSTOM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_dc_dwc2.c) + elseif(CONFIG_CHERRYUSB_DEVICE_MUSB_ES) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_dc_musb.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_glue_es.c) + elseif(CONFIG_CHERRYUSB_DEVICE_MUSB_SUNXI) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_dc_musb.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_glue_sunxi.c) + elseif(CONFIG_CHERRYUSB_DEVICE_MUSB_BK) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_dc_musb.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_glue_bk.c) + elseif(CONFIG_CHERRYUSB_DEVICE_MUSB_SIFLI) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_dc_musb.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_glue_sifli.c) + elseif(CONFIG_CHERRYUSB_DEVICE_MUSB_CUSTOM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_dc_musb.c) + elseif(CONFIG_CHERRYUSB_DEVICE_CHIPIDEA_MCX) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/chipidea/usb_dc_chipidea.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/nxp/usb_glue_mcx.c) + elseif(CONFIG_CHERRYUSB_DEVICE_KINETIS_MCX) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/kinetis/usb_dc_kinetis.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/kinetis/usb_glue_mcx.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/chipidea) + elseif(CONFIG_CHERRYUSB_DEVICE_CHIPIDEA_CUSTOM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/chipidea/usb_dc_chipidea.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/chipidea) + elseif(CONFIG_CHERRYUSB_DEVICE_HPM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/hpmicro/usb_dc_hpm.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/hpmicro/usb_glue_hpm.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/hpmicro) + elseif(CONFIG_CHERRYUSB_DEVICE_BL) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/bouffalolab/usb_dc_bl.c) + elseif(CONFIG_CHERRYUSB_DEVICE_AIC) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/aic/usb_dc_aic.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/aic/usb_dc_aic_ll.c) + elseif(CONFIG_CHERRYUSB_DEVICE_RP2040) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/rp2040/usb_dc_rp2040.c) + endif() + +endif() + +if(CONFIG_CHERRYUSB_HOST) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/core/usbh_core.c + ${CMAKE_CURRENT_LIST_DIR}/class/hub/usbh_hub.c + ) + + if(CONFIG_CHERRYUSB_HOST_CDC_ACM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/cdc/usbh_cdc_acm.c) + endif() + if(CONFIG_CHERRYUSB_HOST_CDC_ECM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/cdc/usbh_cdc_ecm.c) + endif() + if(CONFIG_CHERRYUSB_HOST_CDC_RNDIS) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/wireless/usbh_rndis.c) + endif() + if(CONFIG_CHERRYUSB_HOST_CDC_NCM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/cdc/usbh_cdc_ncm.c) + endif() + if(CONFIG_CHERRYUSB_HOST_HID) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/hid/usbh_hid.c) + endif() + if(CONFIG_CHERRYUSB_HOST_MSC) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/msc/usbh_msc.c) + + if(CONFIG_CHERRYUSB_HOST_MSC_FATFS) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/third_party/fatfs-0.14/source/port/fatfs_usbh.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/third_party/fatfs-0.14/source/diskio.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/third_party/fatfs-0.14/source/ff.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/third_party/fatfs-0.14/source/ffsystem.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/third_party/fatfs-0.14/source/ffunicode.c) + + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/third_party/fatfs-0.14/source) + endif() + endif() + if(CONFIG_CHERRYUSB_HOST_VIDEO) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/video/usbh_video.c) + endif() + if(CONFIG_CHERRYUSB_HOST_AUDIO) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/audio/usbh_audio.c) + endif() + if(CONFIG_CHERRYUSB_HOST_BLUETOOTH) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/wireless/usbh_bluetooth.c) + + set(BLUETOOTH_PATH ${CMAKE_CURRENT_LIST_DIR}/third_party/zephyr_bluetooth-2.7.5) + + list( + APPEND + cherryusb_srcs + ${BLUETOOTH_PATH}/ble_hci_usbh.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/beacon/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/central/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/central_hr/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/central_ht/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/central_multilink/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/central_multilink/src/central_multilink.c + # ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/handsfree/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/ibeacon/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral/src/cts.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_csc/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_dis/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_esp/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_hids/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_hids/src/hog.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_hr/src/main.c + # ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_ht/src/main.c + # ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_ht/src/hts.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_identity/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_identity/src/peripheral_identity.c + # ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_ots/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/peripheral_sc_only/src/main.c + ${BLUETOOTH_PATH}/zephyr_bluetooth/examples/scan_adv/src/main.c + ) + + include(${BLUETOOTH_PATH}/zephyr_bluetooth/zephyr_bluetooth.cmake) + list(APPEND cherryusb_srcs ${zephyr_bluetooth_srcs}) + list(APPEND cherryusb_incs ${zephyr_bluetooth_incs}) + endif() + + if(CONFIG_CHERRYUSB_HOST_ASIX) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/net/usbh_asix.c) + endif() + if(CONFIG_CHERRYUSB_HOST_RTL8152) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/net/usbh_rtl8152.c) + endif() + if(CONFIG_CHERRYUSB_HOST_CH34X) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial/usbh_ch34x.c) + endif() + if(CONFIG_CHERRYUSB_HOST_CP210X) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial/usbh_cp210x.c) + endif() + if(CONFIG_CHERRYUSB_HOST_FTDI) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial/usbh_ftdi.c) + endif() + if(CONFIG_CHERRYUSB_HOST_PL2303) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial/usbh_pl2303.c) + endif() + if(CONFIG_CHERRYUSB_HOST_AOA) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/aoa/usbh_aoa.c) + endif() + + if(CONFIG_CHERRYUSB_HOST_CDC_ECM + OR CONFIG_CHERRYUSB_HOST_CDC_RNDIS + OR CONFIG_CHERRYUSB_HOST_CDC_NCM + OR CONFIG_CHERRYUSB_HOST_ASIX + OR CONFIG_CHERRYUSB_HOST_RTL8152 + ) + if("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "idf") + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/platform/idf/usbh_net.c) + else() + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/platform/lwip/usbh_lwip.c) + endif() + endif() + + if(CONFIG_CHERRYUSB_HOST_EHCI_BL) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci.c) + # list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci_iso.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_glue_bouffalo.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/ehci) + elseif(CONFIG_CHERRYUSB_HOST_EHCI_HPM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci.c) + # list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci_iso.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/hpmicro/usb_hc_hpm.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/hpmicro/usb_glue_hpm.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/hpmicro) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/ehci) + elseif(CONFIG_CHERRYUSB_HOST_EHCI_AIC) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ohci/usb_hc_ohci.c) + # list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci_iso.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_glue_aic.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/ehci) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/ohci) + elseif(CONFIG_CHERRYUSB_HOST_EHCI_MCX) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci.c) + # list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci_iso.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/nxp/usb_glue_mcx.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/ehci) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/chipidea) + elseif(CONFIG_CHERRYUSB_HOST_EHCI_CUSTOM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci.c) + # list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/ehci/usb_hc_ehci_iso.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/port/ehci) + elseif(CONFIG_CHERRYUSB_HOST_DWC2_ST) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_hc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_st.c) + elseif(CONFIG_CHERRYUSB_HOST_DWC2_ESP) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_hc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_esp.c) + elseif(CONFIG_CHERRYUSB_HOST_DWC2_KENDRYTE) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_hc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_kendryte.c) + elseif(CONFIG_CHERRYUSB_HOST_DWC2_HC) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_hc_dwc2.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_glue_hc.c) + elseif(CONFIG_CHERRYUSB_HOST_DWC2_CUSTOM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/dwc2/usb_hc_dwc2.c) + elseif(CONFIG_CHERRYUSB_HOST_MUSB_ES) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_hc_musb.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_glue_es.c) + elseif(CONFIG_CHERRYUSB_HOST_MUSB_SUNXI) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_hc_musb.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_glue_sunxi.c) + elseif(CONFIG_CHERRYUSB_HOST_MUSB_BK) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_hc_musb.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_glue_bk.c) + elseif(CONFIG_CHERRYUSB_HOST_MUSB_SIFLI) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_hc_musb.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_glue_sifli.c) + elseif(CONFIG_CHERRYUSB_HOST_MUSB_CUSTOM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_hc_musb.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/musb/usb_glue_bk.c) + elseif(CONFIG_CHERRYUSB_HOST_KINETIS_MCX) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/kinetis/usb_hc_kinetis.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/kinetis/usb_glue_mcx.c) + elseif(CONFIG_CHERRYUSB_HOST_KINETIS_CUSTOM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/kinetis/usb_hc_kinetis.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/kinetis/usb_glue_mcx.c) + elseif(CONFIG_CHERRYUSB_HOST_RP2040) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/rp2040/usb_hc_rp2040.c) + endif() + + if(CONFIG_TEST_USBH_CDC_ACM OR CONFIG_TEST_USBH_HID OR CONFIG_TEST_USBH_MSC) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/demo/usb_host.c) + endif() +endif() + +if(CONFIG_CHERRYUSB_DEVICE AND CONFIG_CHERRYUSB_HOST) +list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/core/usbotg_core.c) +endif() + +if(DEFINED CONFIG_CHERRYUSB_OSAL) + if("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "freertos") + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/osal/usb_osal_freertos.c) + elseif("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "rtthread") + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/osal/usb_osal_rtthread.c) + elseif("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "idf") + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/osal/idf) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/osal/idf/usb_osal_idf.c) + elseif("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "threadx") + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/osal/usb_osal_threadx.c) + elseif("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "zephyr") + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/osal/usb_osal_zephyr.c) + endif() +endif() + +if(CONFIG_CHERRYRB) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/third_party/cherryrb/chry_ringbuffer.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/third_party/cherryrb) +endif() + +if(CONFIG_CHERRYMP) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/third_party/cherrymp/chry_mempool.c) + list(APPEND cherryusb_incs ${CMAKE_CURRENT_LIST_DIR}/third_party/cherrymp) + if("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "freertos") + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/third_party/cherrymp/chry_mempool_osal_freertos.c) + elseif("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "rtthread") + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/third_party/cherrymp/chry_mempool_osal_rtthread.c) + endif() +endif() diff --git a/src/lib/CherryUSB/cherryusb_config_template.h b/src/lib/CherryUSB/cherryusb_config_template.h new file mode 100644 index 000000000..34c19cba1 --- /dev/null +++ b/src/lib/CherryUSB/cherryusb_config_template.h @@ -0,0 +1,324 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +/* ================ USB common Configuration ================ */ + +#ifdef __RTTHREAD__ +#include + +#define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) +#else +#define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) +#endif + +#ifndef CONFIG_USB_DBG_LEVEL +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +// #define CONFIG_USB_DCACHE_ENABLE + +/* data align size when use dma or use dcache */ +#ifdef CONFIG_USB_DCACHE_ENABLE +#define CONFIG_USB_ALIGN_SIZE 32 // 32 or 64 +#else +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* use usb_memcpy default for high performance but cost more flash memory. + * And, arm libc has a bug that memcpy() may cause data misalignment when the size is not a multiple of 4. +*/ +// #define CONFIG_USB_MEMCPY_DISABLE + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +/* enable advance desc register api */ +#define CONFIG_USBDEV_ADVANCE_DESC + +/* move ep0 setup handler from isr to thread */ +// #define CONFIG_USBDEV_EP0_THREAD + +#ifndef CONFIG_USBDEV_EP0_PRIO +#define CONFIG_USBDEV_EP0_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_EP0_STACKSIZE +#define CONFIG_USBDEV_EP0_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */ +// #define CONFIG_USBDEV_MSC_POLLING + +/* move msc read & write from isr to thread */ +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_BUFSIZE +#define CONFIG_USBDEV_MTP_MAX_BUFSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_OBJECTS +#define CONFIG_USBDEV_MTP_MAX_OBJECTS 256 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_PATHNAME +#define CONFIG_USBDEV_MTP_MAX_PATHNAME 256 +#endif + +#define CONFIG_USBDEV_MTP_THREAD + +#ifndef CONFIG_USBDEV_MTP_PRIO +#define CONFIG_USBDEV_MTP_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MTP_STACKSIZE +#define CONFIG_USBDEV_MTP_STACKSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP +#define CONFIG_USBDEV_CDC_ECM_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 1 +#endif + +// #define CONFIG_USBDEV_SOF_ENABLE + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +/* enable dwc2 buffer dma mode for device + * in xxx32 chips, only pb14/pb15 can support dma mode, pa11/pa12 is not supported(only a few supports, but we ignore them) +*/ +// #define CONFIG_USB_DWC2_DMA_ENABLE + +/* ---------------- MUSB Configuration ---------------- */ +#define CONFIG_USB_MUSB_EP_NUM 8 +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 1 +#endif + +/* ---------------- EHCI Configuration ---------------- */ + +#define CONFIG_USB_EHCI_HCCR_OFFSET (0x0) +#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 +#define CONFIG_USB_EHCI_QH_NUM 10 +#define CONFIG_USB_EHCI_QTD_NUM (CONFIG_USB_EHCI_QH_NUM * 3) +#define CONFIG_USB_EHCI_ITD_NUM 4 +// #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE +// #define CONFIG_USB_EHCI_CONFIGFLAG +// #define CONFIG_USB_EHCI_ISO +// #define CONFIG_USB_EHCI_WITH_OHCI +// #define CONFIG_USB_EHCI_DESC_DCACHE_ENABLE + +/* ---------------- OHCI Configuration ---------------- */ +#define CONFIG_USB_OHCI_HCOR_OFFSET (0x0) +#define CONFIG_USB_OHCI_ED_NUM 10 +#define CONFIG_USB_OHCI_TD_NUM 3 +// #define CONFIG_USB_OHCI_DESC_DCACHE_ENABLE + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +/* ---------------- DWC2 Configuration ---------------- */ +// nothing to define + +/* ---------------- MUSB Configuration ---------------- */ +#define CONFIG_USB_MUSB_PIPE_NUM 8 +// #define CONFIG_USB_MUSB_SUNXI +// #define CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + +/* When your chip hardware supports high-speed and wants to initialize it in high-speed mode, + * the relevant IP will configure the internal or external high-speed PHY according to CONFIG_USB_HS. + * + * in xxx32 chips, only pb14/pb15 can support hs mode, pa11/pa12 is not supported(only a few supports, but we ignore them). +*/ +// #define CONFIG_USB_HS + +#ifndef usb_phyaddr2ramaddr +#define usb_phyaddr2ramaddr(addr) (addr) +#endif + +#ifndef usb_ramaddr2phyaddr +#define usb_ramaddr2phyaddr(addr) (addr) +#endif + +/* Enable OTG support, only support hpmicro now */ +// #define CONFIG_USB_OTG_ENABLE + +#endif diff --git a/src/lib/CherryUSB/class/adb/usbd_adb.c b/src/lib/CherryUSB/class/adb/usbd_adb.c new file mode 100644 index 000000000..417439a87 --- /dev/null +++ b/src/lib/CherryUSB/class/adb/usbd_adb.c @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_adb.h" + +#define ADB_OUT_EP_IDX 0 +#define ADB_IN_EP_IDX 1 + +#define ADB_STATE_READ_MSG 0 +#define ADB_STATE_READ_DATA 1 +#define ADB_STATE_WRITE_MSG 2 +#define ADB_STATE_WRITE_DATA 3 +#define ADB_STATE_AWRITE_MSG 4 +#define ADB_STATE_AWRITE_DATA 5 + +#define MAX_PAYLOAD_V1 (4 * 1024) +#define MAX_PAYLOAD_V2 (256 * 1024) +#define MAX_PAYLOAD MAX_PAYLOAD_V1 +#define A_VERSION 0x01000000 + +#define A_SYNC 0x434e5953 +#define A_CNXN 0x4e584e43 +#define A_OPEN 0x4e45504f +#define A_OKAY 0x59414b4f +#define A_CLSE 0x45534c43 +#define A_WRTE 0x45545257 +#define A_AUTH 0x48545541 + +struct adb_msg { + uint32_t command; /* command identifier constant (A_CNXN, ...) */ + uint32_t arg0; /* first argument */ + uint32_t arg1; /* second argument */ + uint32_t data_length; /* length of payload (0 is allowed) */ + uint32_t data_crc32; /* crc32 of data payload */ + uint32_t magic; /* command ^ 0xffffffff */ +}; + +struct adb_packet { + USB_MEM_ALIGNX struct adb_msg msg; + USB_MEM_ALIGNX uint8_t payload[USB_ALIGN_UP(MAX_PAYLOAD, CONFIG_USB_ALIGN_SIZE)]; +}; + +struct usbd_adb { + uint8_t state; + uint8_t common_state; + uint8_t write_state; + bool writable; + uint32_t localid; + uint32_t shell_remoteid; + uint32_t file_remoteid; +} adb_client; + +static struct usbd_endpoint adb_ep_data[2]; + +USB_NOCACHE_RAM_SECTION struct adb_packet tx_packet; +USB_NOCACHE_RAM_SECTION struct adb_packet rx_packet; + +static inline uint32_t adb_packet_checksum(struct adb_packet *packet) +{ + uint32_t sum = 0; + uint32_t i; + + for (i = 0; i < packet->msg.data_length; ++i) { + sum += (uint32_t)(packet->payload[i]); + } + + return sum; +} + +static uint32_t usbd_adb_get_remoteid(uint32_t localid) +{ + if (localid == ADB_SHELL_LOALID) { + return adb_client.shell_remoteid; + } else { + return adb_client.file_remoteid; + } +} + +static void adb_send_msg(struct adb_packet *packet) +{ + adb_client.common_state = ADB_STATE_WRITE_MSG; + + packet->msg.data_crc32 = adb_packet_checksum(packet); + packet->msg.magic = packet->msg.command ^ 0xffffffff; + + usbd_ep_start_write(0, adb_ep_data[ADB_IN_EP_IDX].ep_addr, (uint8_t *)&packet->msg, sizeof(struct adb_msg)); +} + +static void adb_send_okay(struct adb_packet *packet, uint32_t localid) +{ + packet->msg.command = A_OKAY; + packet->msg.arg0 = localid; + packet->msg.arg1 = usbd_adb_get_remoteid(localid); + packet->msg.data_length = 0; + + adb_send_msg(&tx_packet); +} + +static void adb_send_close(struct adb_packet *packet, uint32_t localid, uint32_t remoteid) +{ + packet->msg.command = A_CLSE; + packet->msg.arg0 = localid; + packet->msg.arg1 = remoteid; + packet->msg.data_length = 0; + + adb_send_msg(&tx_packet); +} + +void usbd_adb_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)ep; + + if (adb_client.common_state == ADB_STATE_READ_MSG) { + if (nbytes != sizeof(struct adb_msg)) { + USB_LOG_ERR("invalid adb msg size:%d\r\n", (unsigned int)nbytes); + return; + } + + USB_LOG_DBG("command:%x arg0:%x arg1:%x len:%d\r\n", + rx_packet.msg.command, + rx_packet.msg.arg0, + rx_packet.msg.arg1, + rx_packet.msg.data_length); + + if (rx_packet.msg.data_length) { + /* setup next out ep read transfer */ + adb_client.common_state = ADB_STATE_READ_DATA; + usbd_ep_start_read(busid, adb_ep_data[ADB_OUT_EP_IDX].ep_addr, rx_packet.payload, rx_packet.msg.data_length); + } else { + if (rx_packet.msg.command == A_CLSE) { + adb_client.writable = false; + usbd_adb_notify_write_done(); + USB_LOG_INFO("Close remoteid:%x\r\n", rx_packet.msg.arg0); + } + adb_client.common_state = ADB_STATE_READ_MSG; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, adb_ep_data[ADB_OUT_EP_IDX].ep_addr, (uint8_t *)&rx_packet.msg, sizeof(struct adb_msg)); + } + } else if (adb_client.common_state == ADB_STATE_READ_DATA) { + switch (rx_packet.msg.command) { + case A_SYNC: + + break; + case A_CNXN: /* CONNECT(version, maxdata, "system-id-string") */ + char *support_feature = "device::" + "ro.product.name=cherryadb;" + "ro.product.model=cherrysh;" + "ro.product.device=cherryadb;" + "features=cmd,shell_v1"; + + tx_packet.msg.command = A_CNXN; + tx_packet.msg.arg0 = A_VERSION; + tx_packet.msg.arg1 = MAX_PAYLOAD; + tx_packet.msg.data_length = strlen(support_feature); + memcpy(tx_packet.payload, support_feature, strlen(support_feature)); + + adb_send_msg(&tx_packet); + + adb_client.writable = false; + break; + case A_OPEN: /* OPEN(local-id, 0, "destination") */ + rx_packet.payload[rx_packet.msg.data_length] = '\0'; + + if (strncmp((const char *)rx_packet.payload, "shell:", 6) == 0) { + adb_client.localid = ADB_SHELL_LOALID; + adb_client.shell_remoteid = rx_packet.msg.arg0; + adb_send_okay(&tx_packet, ADB_SHELL_LOALID); + + USB_LOG_INFO("Open shell service, remoteid:%x\r\n", rx_packet.msg.arg0); + } else if (strncmp((const char *)rx_packet.payload, "sync:", 5) == 0) { + adb_client.localid = ADB_FILE_LOALID; + adb_client.file_remoteid = rx_packet.msg.arg0; + adb_send_okay(&tx_packet, ADB_FILE_LOALID); + USB_LOG_INFO("Open file service, remoteid:%x\r\n", rx_packet.msg.arg0); + } + break; + case A_OKAY: + + break; + case A_CLSE: + + break; + case A_WRTE: /* WRITE(local-id, remote-id, "data") */ + if ((rx_packet.msg.arg0 == adb_client.shell_remoteid) && (rx_packet.msg.arg1 == ADB_SHELL_LOALID)) { + adb_send_okay(&tx_packet, rx_packet.msg.arg1); + } else if ((rx_packet.msg.arg0 == adb_client.file_remoteid) && (rx_packet.msg.arg1 == ADB_FILE_LOALID)) { + adb_send_okay(&tx_packet, rx_packet.msg.arg1); + } else { + adb_send_close(&tx_packet, 0, rx_packet.msg.arg0); + } + break; + case A_AUTH: + + break; + + default: + break; + } + } +} + +void usbd_adb_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)ep; + (void)nbytes; + + if (adb_client.common_state == ADB_STATE_WRITE_MSG) { + if (tx_packet.msg.data_length) { + adb_client.common_state = ADB_STATE_WRITE_DATA; + usbd_ep_start_write(busid, adb_ep_data[ADB_IN_EP_IDX].ep_addr, tx_packet.payload, tx_packet.msg.data_length); + } else { + if (rx_packet.msg.command == A_WRTE) { + adb_client.writable = true; + if (adb_client.localid == ADB_SHELL_LOALID) { + usbd_adb_notify_shell_read(rx_packet.payload, rx_packet.msg.data_length); + } else { + } + } + adb_client.common_state = ADB_STATE_READ_MSG; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, adb_ep_data[ADB_OUT_EP_IDX].ep_addr, (uint8_t *)&rx_packet.msg, sizeof(struct adb_msg)); + } + } else if (adb_client.common_state == ADB_STATE_WRITE_DATA) { + adb_client.common_state = ADB_STATE_READ_MSG; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, adb_ep_data[ADB_OUT_EP_IDX].ep_addr, (uint8_t *)&rx_packet.msg, sizeof(struct adb_msg)); + } else if (adb_client.write_state == ADB_STATE_AWRITE_MSG) { + if (tx_packet.msg.data_length) { + adb_client.write_state = ADB_STATE_AWRITE_DATA; + usbd_ep_start_write(busid, adb_ep_data[ADB_IN_EP_IDX].ep_addr, tx_packet.payload, tx_packet.msg.data_length); + } else { + } + } else if (adb_client.write_state == ADB_STATE_AWRITE_DATA) { + usbd_adb_notify_write_done(); + } +} + +void adb_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + (void)arg; + + switch (event) { + case USBD_EVENT_INIT: + break; + case USBD_EVENT_DEINIT: + break; + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONFIGURED: + adb_client.common_state = ADB_STATE_READ_MSG; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, adb_ep_data[ADB_OUT_EP_IDX].ep_addr, (uint8_t *)&rx_packet.msg, sizeof(struct adb_msg)); + break; + + default: + break; + } +} + +struct usbd_interface *usbd_adb_init_intf(uint8_t busid, struct usbd_interface *intf, uint8_t in_ep, uint8_t out_ep) +{ + (void)busid; + + intf->class_interface_handler = NULL; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = adb_notify_handler; + + adb_ep_data[ADB_OUT_EP_IDX].ep_addr = out_ep; + adb_ep_data[ADB_OUT_EP_IDX].ep_cb = usbd_adb_bulk_out; + adb_ep_data[ADB_IN_EP_IDX].ep_addr = in_ep; + adb_ep_data[ADB_IN_EP_IDX].ep_cb = usbd_adb_bulk_in; + + usbd_add_endpoint(busid, &adb_ep_data[ADB_OUT_EP_IDX]); + usbd_add_endpoint(busid, &adb_ep_data[ADB_IN_EP_IDX]); + + return intf; +} + +bool usbd_adb_can_write(void) +{ + return adb_client.writable; +} + +int usbd_abd_write(uint32_t localid, const uint8_t *data, uint32_t len) +{ + struct adb_packet *packet; + + packet = &tx_packet; + packet->msg.command = A_WRTE; + packet->msg.arg0 = localid; + packet->msg.arg1 = usbd_adb_get_remoteid(localid); + packet->msg.data_length = len; + memcpy(packet->payload, data, len); + + packet->msg.data_crc32 = adb_packet_checksum(packet); + packet->msg.magic = packet->msg.command ^ 0xffffffff; + + adb_client.write_state = ADB_STATE_AWRITE_MSG; + usbd_ep_start_write(0, adb_ep_data[ADB_IN_EP_IDX].ep_addr, (uint8_t *)&packet->msg, sizeof(struct adb_msg)); + return 0; +} + +void usbd_adb_close(uint32_t localid) +{ + adb_send_close(&tx_packet, 0, usbd_adb_get_remoteid(localid)); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/class/adb/usbd_adb.h b/src/lib/CherryUSB/class/adb/usbd_adb.h new file mode 100644 index 000000000..4dbc730f6 --- /dev/null +++ b/src/lib/CherryUSB/class/adb/usbd_adb.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_ADB_H +#define USBD_ADB_H + +#include + +#define ADB_SHELL_LOALID 0x01 +#define ADB_FILE_LOALID 0x02 + +// clang-format off +#define ADB_DESCRIPTOR_INIT(bFirstInterface, in_ep, out_ep, wMaxPacketSize) \ + USB_INTERFACE_DESCRIPTOR_INIT(bFirstInterface, 0x00, 0x02, 0xff, 0x42, 0x01, 0x02), \ + USB_ENDPOINT_DESCRIPTOR_INIT(in_ep, 0x02, wMaxPacketSize, 0x00), \ + USB_ENDPOINT_DESCRIPTOR_INIT(out_ep, 0x02, wMaxPacketSize, 0x00) +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +struct usbd_interface *usbd_adb_init_intf(uint8_t busid, struct usbd_interface *intf, uint8_t in_ep, uint8_t out_ep); + +void usbd_adb_notify_shell_read(uint8_t *data, uint32_t len); +void usbd_adb_notify_file_read(uint8_t *data, uint32_t len); +void usbd_adb_notify_write_done(void); +bool usbd_adb_can_write(void); +int usbd_abd_write(uint32_t localid, const uint8_t *data, uint32_t len); +void usbd_adb_close(uint32_t localid); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_ADB_H */ \ No newline at end of file diff --git a/src/lib/CherryUSB/class/aoa/usb_aoa.h b/src/lib/CherryUSB/class/aoa/usb_aoa.h new file mode 100644 index 000000000..6b6c715c2 --- /dev/null +++ b/src/lib/CherryUSB/class/aoa/usb_aoa.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_AOA_H +#define USB_AOA_H + +//AOA 1.0 +#define AOA_ACCESSORY_VENDOR_ID 0x18D1 +#define AOA_ACCESSORY_PRODUCT_ID 0x2D00 +#define AOA_ACCESSORY_ADB_PRODUCT_ID 0x2D01 + +//AOA 2.0 +#define AOA_AUDIO_PRODUCT_ID 0x2D02 +#define AOA_AUDIO_ADB_PRODUCT_ID 0x2D03 +#define AOA_ACCESSORY_AUDIO_PRODUCT_ID 0x2D04 +#define AOA_ACCESSORY_AUDIO_ADB_PRODUCT_ID 0x2D05 + +//AOA 1.0 +#define AOA_ACCESSORY_GET_PROTOCOL 51 +#define AOA_ACCESSORY_SEND_STRING 52 +#define AOA_ACCESSORY_START 53 + +//AOA 2.0 +#define AOA_ACCESSORY_REGISTER_HID 54 +#define AOA_ACCESSORY_UNREGISTER_HID 55 +#define AOA_ACCESSORY_SET_HID_REPORT_DESC 56 +#define AOA_ACCESSORY_SEND_HID_EVENT 57 +#define AOA_ACCESSORY_SET_AUDIO_MODE 58 + +#define AOA_ACCESSORY_STRING_MANUFACTURER 0 +#define AOA_ACCESSORY_STRING_MODEL 1 +#define AOA_ACCESSORY_STRING_DESCRIPTION 2 +#define AOA_ACCESSORY_STRING_VERSION 3 +#define AOA_ACCESSORY_STRING_URI 4 +#define AOA_ACCESSORY_STRING_SERIAL 5 + +struct aoa_string_info { + char acc_manufacturer[64]; + char acc_model[64]; + char acc_description[64]; + char acc_version[64]; + char acc_uri[64]; + char acc_serial[64]; +}; + +#endif /* USB_AOA_H */ \ No newline at end of file diff --git a/src/lib/CherryUSB/class/aoa/usbh_aoa.c b/src/lib/CherryUSB/class/aoa/usbh_aoa.c new file mode 100644 index 000000000..02d9fab55 --- /dev/null +++ b/src/lib/CherryUSB/class/aoa/usbh_aoa.c @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_aoa.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_aoa" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/aoa" + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_aoa_buffer[USB_ALIGN_UP(128, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_aoa g_aoa_class; + +int usbh_aoa_switch(struct usbh_hubport *hport, struct aoa_string_info *info) +{ + struct usb_setup_packet *setup; + int ret; + + setup = hport->setup; + + if (setup == NULL) { + return -USB_ERR_INVAL; + } + + USB_LOG_INFO("Try switch into aoa mode\r\n"); + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_GET_PROTOCOL; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = 2; + + ret = usbh_control_transfer(hport, setup, g_aoa_buffer); + if (ret < 0) { + return ret; + } + + USB_LOG_INFO("AOA version: v%d.%d\r\n", g_aoa_buffer[0], g_aoa_buffer[1]); + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_SEND_STRING; + setup->wValue = 0; + setup->wIndex = AOA_ACCESSORY_STRING_MANUFACTURER; + setup->wLength = strlen(info->acc_manufacturer) + 1; + + memcpy(g_aoa_buffer, info->acc_manufacturer, strlen(info->acc_manufacturer)); + ret = usbh_control_transfer(hport, setup, g_aoa_buffer); + if (ret < 0) { + return ret; + } + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_SEND_STRING; + setup->wValue = 0; + setup->wIndex = AOA_ACCESSORY_STRING_MODEL; + setup->wLength = strlen(info->acc_model) + 1; + + memcpy(g_aoa_buffer, info->acc_model, strlen(info->acc_model)); + ret = usbh_control_transfer(hport, setup, g_aoa_buffer); + if (ret < 0) { + return ret; + } + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_SEND_STRING; + setup->wValue = 0; + setup->wIndex = AOA_ACCESSORY_STRING_DESCRIPTION; + setup->wLength = strlen(info->acc_description) + 1; + + memcpy(g_aoa_buffer, info->acc_description, strlen(info->acc_description)); + ret = usbh_control_transfer(hport, setup, g_aoa_buffer); + if (ret < 0) { + return ret; + } + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_SEND_STRING; + setup->wValue = 0; + setup->wIndex = AOA_ACCESSORY_STRING_VERSION; + setup->wLength = strlen(info->acc_version) + 1; + + memcpy(g_aoa_buffer, info->acc_version, strlen(info->acc_version)); + ret = usbh_control_transfer(hport, setup, g_aoa_buffer); + if (ret < 0) { + return ret; + } + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_SEND_STRING; + setup->wValue = 0; + setup->wIndex = AOA_ACCESSORY_STRING_URI; + setup->wLength = strlen(info->acc_uri) + 1; + + memcpy(g_aoa_buffer, info->acc_uri, strlen(info->acc_uri)); + ret = usbh_control_transfer(hport, setup, g_aoa_buffer); + if (ret < 0) { + return ret; + } + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_SEND_STRING; + setup->wValue = 0; + setup->wIndex = AOA_ACCESSORY_STRING_SERIAL; + setup->wLength = strlen(info->acc_serial) + 1; + + memcpy(g_aoa_buffer, info->acc_serial, strlen(info->acc_serial)); + ret = usbh_control_transfer(hport, setup, g_aoa_buffer); + if (ret < 0) { + return ret; + } + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_START; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = 0; + + ret = usbh_control_transfer(hport, setup, NULL); + if (ret < 0) { + return ret; + } + + USB_LOG_INFO("Switch into aoa mode success, wait usb device restart...\r\n"); + return 0; +} + +int usbh_aoa_register_hid(struct usbh_aoa *aoa_class, uint16_t id, uint8_t *report, uint32_t report_len) +{ + struct usb_setup_packet *setup; + int ret; + uint8_t len; + uint32_t offset; + + if (!aoa_class || !aoa_class->hport) { + return -USB_ERR_INVAL; + } + setup = aoa_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_REGISTER_HID; + setup->wValue = id; + setup->wIndex = report_len; + setup->wLength = 0; + + ret = usbh_control_transfer(aoa_class->hport, setup, NULL); + if (ret < 0) { + return ret; + } + + offset = 0; + while (report_len > 0) { + len = report_len > 64 ? 64 : report_len; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_SET_HID_REPORT_DESC; + setup->wValue = id; + setup->wIndex = offset; + setup->wLength = len; + + memcpy(g_aoa_buffer, report + offset, len); + ret = usbh_control_transfer(aoa_class->hport, setup, g_aoa_buffer); + if (ret < 0) { + return ret; + } + offset += len; + report_len -= len; + } + return ret; +} + +int usbh_aoa_send_hid_event(struct usbh_aoa *aoa_class, uint16_t id, uint8_t *event, uint32_t event_len) +{ + struct usb_setup_packet *setup; + + if (!aoa_class || !aoa_class->hport) { + return -USB_ERR_INVAL; + } + setup = aoa_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = AOA_ACCESSORY_SEND_HID_EVENT; + setup->wValue = id; + setup->wIndex = 0; + setup->wLength = event_len; + + memcpy(g_aoa_buffer, event, event_len); + return usbh_control_transfer(aoa_class->hport, setup, event); +} + +static int usbh_aoa_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + + struct usbh_aoa *aoa_class = &g_aoa_class; + + memset(aoa_class, 0, sizeof(struct usbh_aoa)); + + aoa_class->hport = hport; + aoa_class->intf = intf; + + hport->config.intf[intf].priv = aoa_class; + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(aoa_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(aoa_class->bulkout, ep_desc); + } + } + + strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN); + + USB_LOG_INFO("Register AOA Class:%s\r\n", hport->config.intf[intf].devname); + + usbh_aoa_run(aoa_class); + return 0; +} + +static int usbh_aoa_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_aoa *aoa_class = (struct usbh_aoa *)hport->config.intf[intf].priv; + + if (aoa_class) { + if (aoa_class->bulkin) { + usbh_kill_urb(&aoa_class->bulkin_urb); + } + + if (aoa_class->bulkout) { + usbh_kill_urb(&aoa_class->bulkout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + USB_LOG_INFO("Unregister AOA Class:%s\r\n", hport->config.intf[intf].devname); + usbh_aoa_stop(aoa_class); + } + + memset(aoa_class, 0, sizeof(struct usbh_aoa)); + } + + return ret; +} + +__WEAK void usbh_aoa_run(struct usbh_aoa *aoa_class) +{ + (void)aoa_class; +} + +__WEAK void usbh_aoa_stop(struct usbh_aoa *aoa_class) +{ + (void)aoa_class; +} + +static const uint16_t aoa_id_table[][2] = { + { AOA_ACCESSORY_VENDOR_ID, AOA_ACCESSORY_PRODUCT_ID }, + { AOA_ACCESSORY_VENDOR_ID, AOA_ACCESSORY_ADB_PRODUCT_ID }, + { AOA_ACCESSORY_VENDOR_ID, AOA_AUDIO_PRODUCT_ID }, + { AOA_ACCESSORY_VENDOR_ID, AOA_AUDIO_ADB_PRODUCT_ID }, + { AOA_ACCESSORY_VENDOR_ID, AOA_ACCESSORY_AUDIO_PRODUCT_ID }, + { AOA_ACCESSORY_VENDOR_ID, AOA_ACCESSORY_AUDIO_ADB_PRODUCT_ID }, + { 0, 0 }, +}; + +const struct usbh_class_driver aoa_class_driver = { + .driver_name = "aoa", + .connect = usbh_aoa_connect, + .disconnect = usbh_aoa_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info aoa_intf_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0xff, + .bInterfaceProtocol = 0x00, + .id_table = aoa_id_table, + .class_driver = &aoa_class_driver +}; \ No newline at end of file diff --git a/src/lib/CherryUSB/class/aoa/usbh_aoa.h b/src/lib/CherryUSB/class/aoa/usbh_aoa.h new file mode 100644 index 000000000..3b184e8b9 --- /dev/null +++ b/src/lib/CherryUSB/class/aoa/usbh_aoa.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_AOA_H +#define USBH_AOA_H + +#include "usb_aoa.h" + +struct usbh_aoa { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + + struct usbh_urb bulkout_urb; + struct usbh_urb bulkin_urb; + + uint8_t intf; + uint8_t minor; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_aoa_switch(struct usbh_hubport *hport, struct aoa_string_info *info); +int usbh_aoa_register_hid(struct usbh_aoa *aoa_class, uint16_t id, uint8_t *report, uint32_t report_len); +int usbh_aoa_send_hid_event(struct usbh_aoa *aoa_class, uint16_t id, uint8_t *event, uint32_t event_len); + +void usbh_aoa_run(struct usbh_aoa *aoa_class); +void usbh_aoa_stop(struct usbh_aoa *aoa_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_AOA_H */ \ No newline at end of file diff --git a/src/lib/CherryUSB/class/audio/usb_audio.h b/src/lib/CherryUSB/class/audio/usb_audio.h new file mode 100644 index 000000000..6c25c3de2 --- /dev/null +++ b/src/lib/CherryUSB/class/audio/usb_audio.h @@ -0,0 +1,1346 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_AUDIO_H +#define USB_AUDIO_H + +/** Audio Interface Subclass Codes + * Refer to Table A-2 from audio10.pdf + */ +#define AUDIO_SUBCLASS_UNDEFINED 0x00 +#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01 +#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02 +#define AUDIO_SUBCLASS_MIDISTREAMING 0x03 + +#define AUDIO_PROTOCOL_UNDEFINED 0x00 +#define AUDIO_PROTOCOLv20 0x20 /* IP version 2.0 */ + +/** Audio Class-Specific Request Codes + * Refer to Table A-9 from audio10.pdf + */ +#define AUDIO_REQUEST_UNDEFINED 0x00 +#define AUDIO_REQUEST_SET_CUR 0x01 +#define AUDIO_REQUEST_GET_CUR 0x81 +#define AUDIO_REQUEST_SET_MIN 0x02 +#define AUDIO_REQUEST_GET_MIN 0x82 +#define AUDIO_REQUEST_SET_MAX 0x03 +#define AUDIO_REQUEST_GET_MAX 0x83 +#define AUDIO_REQUEST_SET_RES 0x04 +#define AUDIO_REQUEST_GET_RES 0x84 +#define AUDIO_REQUEST_SET_MEM 0x05 +#define AUDIO_REQUEST_GET_MEM 0x85 +#define AUDIO_REQUEST_GET_STAT 0xFF + +/** Audio Class-Specific Request Codes + * Refer from audio20_final.pdf + */ +#define AUDIO_REQUEST_CUR 0x01 +#define AUDIO_REQUEST_RANGE 0x02 +/** Audio Class-Specific Control Interface Descriptor Subtypes + * Refer to Table A-5 from audio10.pdf + */ +#define AUDIO_CONTROL_UNDEF 0x01U +#define AUDIO_CONTROL_HEADER 0x01U +#define AUDIO_CONTROL_INPUT_TERMINAL 0x02U +#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03U +#define AUDIO_CONTROL_MIXER_UNIT 0x04U +#define AUDIO_CONTROL_SELECTOR_UNIT 0x05U +#define AUDIO_CONTROL_FEATURE_UNIT 0x06U +#define AUDIO_CONTROL_EFFECT_UNIT 0x07U +#define AUDIO_CONTROL_PROCESSING_UNIT 0x08U +#define AUDIO_CONTROL_EXTENSION_UNIT 0x09U +#define AUDIO_CONTROL_CLOCK_SOURCE 0x0aU +#define AUDIO_CONTROL_CLOCK_SELECTOR 0x0bU +#define AUDIO_CONTROL_CLOCK_MULTIPLIER 0x0cU +#define AUDIO_CONTROL_SAMPLERATE_CONVERTER 0x0dU + +/** Audio Class-Specific AS Interface Descriptor Subtypes + * Refer to Table A-6 from audio10.pdf + */ +#define AUDIO_STREAMING_UNDEFINED 0x00U +#define AUDIO_STREAMING_GENERAL 0x01U +#define AUDIO_STREAMING_FORMAT_TYPE 0x02U +#define AUDIO_STREAMING_ENCODER 0x03U +#define AUDIO_STREAMING_DECODER 0x04U + +/* Clock Source Descriptor Clock Types */ +#define AUDIO_CLKSRC_EXTERNAL 0x00 /* External clock */ +#define AUDIO_CLKSRC_INTERNAL_FIXED 0x01 /* Internal fixed clock */ +#define AUDIO_CLKSRC_INTERNAL_VAR 0x02 /* Internal variable clock */ +#define AUDIO_CLKSRC_INTERNAL_PROG 0x03 /* Internal programmable clock */ + +/* Effect Unit Effect Types */ +#define AUDIO_EFFECT_UNDEF 0x00 +#define AUDIO_EFFECT_PARAM_EQ_SECTION 0x01 +#define AUDIO_EFFECT_REVERBERATION 0x02 +#define AUDIO_EFFECT_MOD_DELAY 0x03 +#define AUDIO_EFFECT_DYN_RANGE_COMP 0x04 + +/* Processing Unit Process Types */ +#define AUDIO_PROCESS_UNDEFINED 0x00 +#define AUDIO_PROCESS_UPDOWNMIX 0x01 +#define AUDIO_PROCESS_DOLBY_PROLOGIC 0x02 +#define AUDIO_PROCESS_STEREO_EXTENDER 0x03 + +/* Audio Class-Specific Endpoint Descriptor Subtypes */ +#define AUDIO_ENDPOINT_UNDEFINED 0x00U +#define AUDIO_ENDPOINT_GENERAL 0x01U + +/* Encoder Type Codes */ +#define AUDIO_ENCODER_UNDEF 0x00 +#define AUDIO_ENCODER_OTHER 0x01 +#define AUDIO_ENCODER_MPEG 0x02 +#define AUDIO_ENCODER_AC3 0x03 +#define AUDIO_ENCODER_WMA 0x04 +#define AUDIO_ENCODER_DTS 0x05 + +/* Decoder Type Codes */ +#define AUDIO_DECODER_UNDEF 0x00 +#define AUDIO_DECODER_OTHER 0x01 +#define AUDIO_DECODER_MPEG 0x02 +#define AUDIO_DECODER_AC3 0x03 +#define AUDIO_DECODER_WMA 0x04 +#define AUDIO_DECODER_DTS 0x05 + +/* Audio Descriptor Types */ +#define AUDIO_UNDEFINED_DESCRIPTOR_TYPE 0x20 +#define AUDIO_DEVICE_DESCRIPTOR_TYPE 0x21 +#define AUDIO_CONFIGURATION_DESCRIPTOR_TYPE 0x22 +#define AUDIO_STRING_DESCRIPTOR_TYPE 0x23 +#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24 +#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25 + +/* Audio Data Format Type I Codes */ +#define AUDIO_FORMAT_TYPE_I_UNDEFINED 0x0000 +#define AUDIO_FORMAT_PCM 0x0001 +#define AUDIO_FORMAT_PCM8 0x0002 +#define AUDIO_FORMAT_IEEE_FLOAT 0x0003 +#define AUDIO_FORMAT_ALAW 0x0004 +#define AUDIO_FORMAT_MULAW 0x0005 + +#define AUDIO_V2_FORMAT_PCM 0x00000001 +#define AUDIO_V2_FORMAT_PCM8 0x00000002 +#define AUDIO_V2_FORMAT_IEEE_FLOAT 0x00000004 +#define AUDIO_V2_FORMAT_ALAW 0x00000008 +#define AUDIO_V2_FORMAT_MULAW 0x00000010 + +/* bmChannelConfig: a bitmap field that indicates which spatial locations + * are occupied by the channels present in the cluster. The bit allocations + * are as follows: + */ +#define AUDIO_CHANNEL_M 0 /* Mono */ +#define AUDIO_CHANNEL_FL (1 << 0) /* Front Left */ +#define AUDIO_CHANNEL_FR (1 << 1) /* Front Right */ +#define AUDIO_CHANNEL_FC (1 << 2) /* Front Center */ +#define AUDIO_CHANNEL_LFE (1 << 3) /* Low Frequency Effects */ +#define AUDIO_CHANNEL_BL (1 << 4) /* Back Left */ +#define AUDIO_CHANNEL_BR (1 << 5) /* Back Right */ +#define AUDIO_CHANNEL_FLC (1 << 6) /* Front Left of Center */ +#define AUDIO_CHANNEL_FRC (1 << 7) /* Front Right of Center */ +#define AUDIO_CHANNEL_BC (1 << 8) /* Back Center */ +#define AUDIO_CHANNEL_SL (1 << 9) /* Side Left */ +#define AUDIO_CHANNEL_SR (1 << 10) /* Side Right */ +#define AUDIO_CHANNEL_TC (1 << 11) /* Top Center */ +#define AUDIO_CHANNEL_TFL (1 << 12) /* Top Front Left */ +#define AUDIO_CHANNEL_TFC (1 << 13) /* Top Front Center */ +#define AUDIO_CHANNEL_TFR (1 << 14) /* Top Front Right */ +#define AUDIO_CHANNEL_TBL (1 << 15) /* Top Back Left */ +#define AUDIO_CHANNEL_TBC (1 << 16) /* Top Back Center */ +#define AUDIO_CHANNEL_TBR (1 << 17) /* Top Back Right */ +#define AUDIO_CHANNEL_TFLC (1 << 18) /* Top Front Left of Center */ +#define AUDIO_CHANNEL_TFRC (1 << 19) /* Top Front Right of Center */ +#define AUDIO_CHANNEL_LLFE (1 << 20) /* Left Low Frequency Effects */ +#define AUDIO_CHANNEL_RLFE (1 << 21) /* Right Low Frequency Effects */ +#define AUDIO_CHANNEL_TSL (1 << 22) /* Top Side Left */ +#define AUDIO_CHANNEL_TSR (1 << 23) /* Top Side Right */ +#define AUDIO_CHANNEL_BOC (1 << 24) /* Bottom Center */ +#define AUDIO_CHANNEL_BLC (1 << 25) /* Back Left of Center */ +#define AUDIO_CHANNEL_BRC (1 << 26) /* Back Right of Center */ + /* Bits 27-30: Reserved */ +#define AUDIO_CHANNEL_RD (1 << 31) /* Raw Data */ + +/* Audio Function Category Codes */ +#define AUDIO_CATEGORY_UNDEF 0x00 /* Undefined */ +#define AUDIO_CATEGORY_SPEAKER 0x01 /* Desktop speaker */ +#define AUDIO_CATEGORY_THEATER 0x02 /* Home theater */ +#define AUDIO_CATEGORY_MICROPHONE 0x03 /* Microphone */ +#define AUDIO_CATEGORY_HEADSET 0x04 /* Headset */ +#define AUDIO_CATEGORY_TELEPHONE 0x05 /* Telephone */ +#define AUDIO_CATEGORY_CONVERTER 0x06 /* Converter */ +#define AUDIO_CATEGORY_RECORDER 0x07 /* Voice/Sound recorder */ +#define AUDIO_CATEGORY_IO_BOX 0x08 /* I/O box */ +#define AUDIO_CATEGORY_INSTRUMENT 0x09 /* Musical instrument */ +#define AUDIO_CATEGORY_PROAUDIO 0x0a /* Pro-audio */ +#define AUDIO_CATEGORY_AV 0x0b /* Audio/video */ +#define AUDIO_CATEGORY_CONTROL 0x0c /* Control panel */ +#define AUDIO_CATEGORY_OTHER 0xff + +/* Clock Source Control Selectors */ +#define AUDIO_CS_CONTROL_UNDEF 0x00 +#define AUDIO_CS_CONTROL_SAM_FREQ 0x01 +#define AUDIO_CS_CONTROL_CLOCK_VALID 0x02 + +/* Clock Selector Control Selectors */ +#define AUDIO_CX_CONTROL_UNDEF 0x00 +#define AUDIO_CX_CONTROL_CLOCKSEL 0x01 + +/* Clock Multiplier Control Selectors */ +#define AUDIO_CM_CONTROL_UNDEF 0x00 +#define AUDIO_CM_CONTROL_NUMERATOR 0x01 +#define AUDIO_CM_CONTROL_DENOMINATOR 0x02 + +/* Terminal Control Selectors */ +#define AUDIO_TE_CONTROL_UNDEF 0x00 +#define AUDIO_TE_CONTROL_COPY_PROTECT 0x01 +#define AUDIO_TE_CONTROL_CONNECTOR 0x02 +#define AUDIO_TE_CONTROL_OVERLOAD 0x03 +#define AUDIO_TE_CONTROL_CLUSTER 0x04 +#define AUDIO_TE_CONTROL_UNDERFLOW 0x05 +#define AUDIO_TE_CONTROL_OVERFLOW 0x06 +#define AUDIO_TE_CONTROL_LATENCY 0x07 + +/* Mixer Control Selectors */ +#define AUDIO_MU_CONTROL_UNDEF 0x00 +#define AUDIO_MU_CONTROL_MIXER 0x01 +#define AUDIO_MU_CONTROL_CLUSTER 0x02 +#define AUDIO_MU_CONTROL_UNDERFLOW 0x03 +#define AUDIO_MU_CONTROL_OVERFLOW 0x04 +#define AUDIO_MU_CONTROL_LATENCY 0x05 + +/* Selector Control Selectors */ +#define AUDIO_SU_CONTROL_UNDEFINE 0x00 +#define AUDIO_SU_CONTROL_SELECTOR 0x01 +#define AUDIO_SU_CONTROL_LATENCY 0x02 + +/* Feature Unit Control Selectors */ +#define AUDIO_FU_CONTROL_UNDEF 0x00 +#define AUDIO_FU_CONTROL_MUTE 0x01 +#define AUDIO_FU_CONTROL_VOLUME 0x02 +#define AUDIO_FU_CONTROL_BASS 0x03 +#define AUDIO_FU_CONTROL_MID 0x04 +#define AUDIO_FU_CONTROL_TREBLE 0x05 +#define AUDIO_FU_CONTROL_EQUALIZER 0x06 +#define AUDIO_FU_CONTROL_AGC 0x07 +#define AUDIO_FU_CONTROL_DELAY 0x08 +#define AUDIO_FU_CONTROL_BASS_BOOST 0x09 +#define AUDIO_FU_CONTROL_LOUDNESS 0x0a +#define AUDIO_FU_CONTROL_INP_GAIN 0x0b +#define AUDIO_FU_CONTROL_INP_GAIN_PAD 0x0c +#define AUDIO_FU_CONTROL_PHASE_INVERT 0x0d +#define AUDIO_FU_CONTROL_UNDERFLOW 0x0e +#define AUDIO_FU_CONTROL_OVERFLOW 0x0f +#define AUDIO_FU_CONTROL_LATENCY 0x10 + +/* Feature Unit Control Bits */ +#define AUDIO_CONTROL_MUTE 0x0001 +#define AUDIO_CONTROL_VOLUME 0x0002 +#define AUDIO_CONTROL_BASS 0x0004 +#define AUDIO_CONTROL_MID 0x0008 +#define AUDIO_CONTROL_TREBLE 0x0010 +#define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020 +#define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040 +#define AUDIO_CONTROL_DEALY 0x0080 +#define AUDIO_CONTROL_BASS_BOOST 0x0100 +#define AUDIO_CONTROL_LOUDNESS 0x0200 + +#define AUDIO_V2_CONTROL_UNDEF 0x00 +#define AUDIO_V2_CONTROL_MUTE (0x03 << 0) +#define AUDIO_V2_CONTROL_VOLUME (0x03 << 2) +#define AUDIO_V2_CONTROL_BASS (0x03 << 4) +#define AUDIO_V2_CONTROL_MID (0x03 << 6) +#define AUDIO_V2_CONTROL_TREBLE (0x03 << 8) +#define AUDIO_V2_CONTROL_EQUALIZER (0x03 << 10) +#define AUDIO_V2_CONTROL_AGC (0x03 << 12) +#define AUDIO_V2_CONTROL_DELAY (0x03 << 14) +#define AUDIO_V2_CONTROL_BASS_BOOST (0x03 << 16) +#define AUDIO_V2_CONTROL_LOUDNESS (0x03 << 18) +#define AUDIO_V2_CONTROL_INP_GAIN (0x03 << 20) +#define AUDIO_V2_CONTROL_INP_GAIN_PAD (0x03 << 22) +#define AUDIO_V2_CONTROL_PHASE_INVERT (0x03 << 24) +#define AUDIO_V2_CONTROL_UNDERFLOW (0x03 << 26) +#define AUDIO_V2_CONTROL_OVERFLOW (0x03 << 28) + +/* Parametric Equalizer Section Effect Unit Control Selectors */ +#define AUDIO_PE_CONTROL_UNDEF 0x00 +#define AUDIO_PE_CONTROL_ENABLE 0x01 +#define AUDIO_PE_CONTROL_CENTERFREQ 0x02 +#define AUDIO_PE_CONTROL_QFACTOR 0x03 +#define AUDIO_PE_CONTROL_GAIN 0x04 +#define AUDIO_PE_CONTROL_UNDERFLOW 0x05 +#define AUDIO_PE_CONTROL_OVERFLOW 0x06 +#define AUDIO_PE_CONTROL_LATENCY 0x07 + +/* Reverberation Effect Unit Control Selectors */ +#define AUDIO_RV_CONTROL_UNDEF 0x00 +#define AUDIO_RV_CONTROL_ENABLE 0x01 +#define AUDIO_RV_CONTROL_TYPE 0x02 +#define AUDIO_RV_CONTROL_LEVEL 0x03 +#define AUDIO_RV_CONTROL_TIME 0x04 +#define AUDIO_RV_CONTROL_FEEDBACK 0x05 +#define AUDIO_RV_CONTROL_PREDELAY 0x06 +#define AUDIO_RV_CONTROL_DENSITY 0x07 +#define AUDIO_RV_CONTROL_HF_ROLLOFF 0x08 +#define AUDIO_RV_CONTROL_UNDERFLOW 0x09 +#define AUDIO_RV_CONTROL_OVERFLOW 0x0a +#define AUDIO_RV_CONTROL_LATENCY 0x0b + +/* Modulation Delay Effect Unit Control Selectors */ +#define AUDIO_MD_CONTROL_UNDEF 0x00 +#define AUDIO_MD_CONTROL_ENABLE 0x01 +#define AUDIO_MD_CONTROL_BALANCE 0x02 +#define AUDIO_MD_CONTROL_RATE 0x03 +#define AUDIO_MD_CONTROL_DEPTH 0x04 +#define AUDIO_MD_CONTROL_TIME 0x05 +#define AUDIO_MD_CONTROL_FEEDBACK 0x06 +#define AUDIO_MD_CONTROL_UNDERFLOW 0x07 +#define AUDIO_MD_CONTROL_OVERFLOW 0x08 +#define AUDIO_MD_CONTROL_LATENCY 0x09 + +/* Dynamic Range Compressor Effect Unit Control Selectors */ +#define AUDIO_DR_CONTROL_UNDEF 0x00 +#define AUDIO_DR_CONTROL_ENABLE 0x01 +#define AUDIO_DR_CONTROL_COMP_RATE 0x02 +#define AUDIO_DR_CONTROL_MAXAMPL 0x03 +#define AUDIO_DR_CONTROL_THRESHOLD 0x04 +#define AUDIO_DR_CONTROL_ATTACK_TIME 0x05 +#define AUDIO_DR_CONTROL_RELEASE_TIME 0x06 +#define AUDIO_DR_CONTROL_UNDERFLOW 0x07 +#define AUDIO_DR_CONTROL_OVERFLOW 0x08 +#define AUDIO_DR_CONTROL_LATENCY 0x09 + +/* Up/Down-mix Processing Unit Control Selectors */ +#define AUDIO_UD_CONTROL_UNDEF 0x00 +#define AUDIO_UD_CONTROL_ENABLE 0x01 +#define AUDIO_UD_CONTROL_MODE_SELECT 0x02 +#define AUDIO_UD_CONTROL_CLUSTER 0x03 +#define AUDIO_UD_CONTROL_UNDERFLOW 0x04 +#define AUDIO_UD_CONTROL_OVERFLOW 0x05 +#define AUDIO_UD_CONTROL_LATENCY 0x06 + +/* Dolby Prologic?Processing Unit Control Selectors */ +#define AUDIO_DP_CONTROL_UNDEF 0x00 +#define AUDIO_DP_CONTROL_ENABLE 0x01 +#define AUDIO_DP_CONTROL_MODE_SELECT 0x02 +#define AUDIO_DP_CONTROL_CLUSTER 0x03 +#define AUDIO_DP_CONTROL_UNDERFLOW 0x04 +#define AUDIO_DP_CONTROL_OVERFLOW 0x05 +#define AUDIO_DP_CONTROL_LATENCY 0x06 + +/* Stereo Extender Processing Unit Control Selectors */ +#define AUDIO_STEXT_CONTROL_UNDEF 0x00 +#define AUDIO_STEXT_CONTROL_ENABLE 0x01 +#define AUDIO_STEXT_CONTROL_WIDTH 0x02 +#define AUDIO_STEXT_CONTROL_UNDERFLOW 0x03 +#define AUDIO_STEXT_CONTROL_OVERFLOW 0x04 +#define AUDIO_STEXT_CONTROL_LATENCY 0x05 + +/* Extension Unit Control Selectors */ + +#define AUDIO_XU_CONTROL_UNDEF 0x00 +#define AUDIO_XU_CONTROL_ENABLE 0x01 +#define AUDIO_XU_CONTROL_CLUSTER 0x02 +#define AUDIO_XU_CONTROL_UNDERFLOW 0x03 +#define AUDIO_XU_CONTROL_OVERFLOW 0x04 +#define AUDIO_XU_CONTROL_LATENCY 0x05 + +/* AudioStreaming Interface Control Selectors */ + +#define AUDIO_AS_CONTROL_UNDEF 0x00 +#define AUDIO_AS_CONTROL_ACT_ALT 0x01 +#define AUDIO_AS_CONTROL_VAL_ALT 0x02 +#define AUDIO_AS_CONTROL_AUDIO_FORMAT 0x03 + +/* Encoder Control Selectors */ + +#define AUDIO_EN_CONTROL_UNDEF 0x00 +#define AUDIO_EN_CONTROL_BIT_RATE 0x01 +#define AUDIO_EN_CONTROL_QUALITY 0x02 +#define AUDIO_EN_CONTROL_VBR 0x03 +#define AUDIO_EN_CONTROL_TYPE 0x04 +#define AUDIO_EN_CONTROL_UNDERFLOW 0x05 +#define AUDIO_EN_CONTROL_OVERFLOW 0x06 +#define AUDIO_EN_CONTROL_ENCODER_ERR 0x07 +#define AUDIO_EN_CONTROL_PARAM1 0x08 +#define AUDIO_EN_CONTROL_PARAM2 0x09 +#define AUDIO_EN_CONTROL_PARAM3 0x0a +#define AUDIO_EN_CONTROL_PARAM4 0x0b +#define AUDIO_EN_CONTROL_PARAM5 0x0c +#define AUDIO_EN_CONTROL_PARAM6 0x0d +#define AUDIO_EN_CONTROL_PARAM7 0x0e +#define AUDIO_EN_CONTROL_PARAM8 0x0f + +/* MPEG Decoder Control Selectors */ + +#define AUDIO_MPGD_CONTROL_UNDEF 0x00 +#define AUDIO_MPGD_CONTROL_DUAL_CHAN 0x01 +#define AUDIO_MPGD_CONTROL_2ND_STEREO 0x02 +#define AUDIO_MPGD_CONTROL_MULTILING 0x03 +#define AUDIO_MPGD_CONTROL_DYN_RANGE 0x04 +#define AUDIO_MPGD_CONTROL_SCALING 0x05 +#define AUDIO_MPGD_CONTROL_HILO_SCALE 0x06 +#define AUDIO_MPGD_CONTROL_UNDERFLOW 0x07 +#define AUDIO_MPGD_CONTROL_OVERFLOW 0x08 +#define AUDIO_MPGD_CONTROL_DECODE_ERR 0x09 + +/* AC-3 Decoder Control Selectors */ + +#define AUDIO_AC3D_CONTROL_UNDEF 0x00 +#define AUDIO_AC3D_CONTROL_MODE 0x01 +#define AUDIO_AC3D_CONTROL_DYN_RANGE 0x02 +#define AUDIO_AC3D_CONTROL_SCALING 0x03 +#define AUDIO_AC3D_CONTROL_HILO_SCALE 0x04 +#define AUDIO_AC3D_CONTROL_UNDERFLOW 0x05 +#define AUDIO_AC3D_CONTROL_OVERFLOW 0x06 +#define AUDIO_AC3D_CONTROL_DECODE_ERR 0x07 + +/* WMA Decoder Control Selectors */ + +#define AUDIO_WMAD_CONTROL_UNDEF 0x00 +#define AUDIO_WMAD_CONTROL_UNDERFLOW 0x01 +#define AUDIO_WMAD_CONTROL_OVERFLOW 0x02 +#define AUDIO_WMAD_CONTROL_DECODE_ERR 0x03 + +/* DTS Decoder Control Selectors */ + +#define AUDIO_DTSD_CONTROL_UNDEF 0x00 +#define AUDIO_DTSD_CONTROL_UNDERFLOW 0x01 +#define AUDIO_DTSD_CONTROL_OVERFLOW 0x02 +#define AUDIO_DTSD_CONTROL_DECODE_ERR 0x03 + +/* Endpoint Control Selectors */ +#define AUDIO_EP_CONTROL_UNDEF 0x00 +#define AUDIO_EP_CONTROL_SAMPLING_FEQ 0x01 +#define AUDIO_EP_CONTROL_PITCH 0x02 + +/* Encoder Error Codes */ + +/* <0: Reserved for vendor extensions */ + +#define AUDIO_ENCODER_SUCCESS 0 /* No Error */ +#define AUDIO_ENCODER_ERROR_NOMEM 1 /* Out of Memory */ +#define AUDIO_ENCODER_ERROR_BW 2 /* Out of Bandwidth */ +#define AUDIO_ENCODER_ERROR_CYCLE 3 /* Out of Processing Cycles */ +#define AUDIO_ENCODER_ERROR_FRAME 4 /* General Format Frame Error */ +#define AUDIO_ENCODER_ERROR_TOOSMALL 5 /* Format Frame Too Small */ +#define AUDIO_ENCODER_ERROR_TOOBIG 6 /* Format Frame Too Large */ +#define AUDIO_ENCODER_ERROR_BADFORMAT 7 /* Bad Data Format */ +#define AUDIO_ENCODER_ERROR_NCHAN 8 /* Incorrect Number of Channels */ +#define AUDIO_ENCODER_ERROR_RATE 9 /* Incorrect Sampling Rate */ +#define AUDIO_ENCODER_ERROR_BITRATE 10 /* Unable to Meet Target Bitrate */ +#define AUDIO_ENCODER_ERROR_PARMS 11 /* Inconsistent Set of Parameters */ +#define AUDIO_ENCODER_ERROR_NOTREADY 12 /* Not Ready */ +#define AUDIO_ENCODER_ERROR_BUSY 13 /* Busy */ + /* >13: Reserved */ + +/* Format Type Codes */ + +#define AUDIO_FORMAT_TYPE_UNDEF 0x00 +#define AUDIO_FORMAT_TYPEI 0x01 +#define AUDIO_FORMAT_TYPEII 0x02 +#define AUDIO_FORMAT_TYPEIII 0x03 +#define AUDIO_FORMAT_TYPEIV 0x04 +#define AUDIO_FORMAT_EXT_TYPEI 0x81 +#define AUDIO_FORMAT_EXT_TYPEII 0x82 +#define AUDIO_FORMAT_EXT_TYPEIII 0x83 + +/* Audio Data Format Type I Bit Allocations */ + +#define AUDIO_FORMAT_TYPEI_PCM (1 << 0) +#define AUDIO_FORMAT_TYPEI_PCM8 (1 << 1) +#define AUDIO_FORMAT_TYPEI_IEEEFLOAT (1 << 2) +#define AUDIO_FORMAT_TYPEI_ALAW (1 << 3) +#define AUDIO_FORMAT_TYPEI_MULAW (1 << 4) +#define AUDIO_FORMAT_TYPEI_RAWDATA (1 << 31) + +/* Audio Data Format Type II Bit Allocations */ + +#define AUDIO_FORMAT_TYPEII_MPEG (1 << 0) +#define AUDIO_FORMAT_TYPEII_AC3 (1 << 1) +#define AUDIO_FORMAT_TYPEII_WMA (1 << 2) +#define AUDIO_FORMAT_TYPEII_DTS (1 << 3) +#define AUDIO_FORMAT_TYPEII_RAWDATA (1 << 31) + +/* Audio Data Format Type III Bit Allocations */ + +#define AUDIO_FORMAT_TYPEIII_IEC61937_AC3 (1 << 0) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG1_L1 (1 << 1) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG1_L2_3 (1 << 1) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_NOEXT (1 << 2) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_EXT (1 << 3) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_AAC_ADTS (1 << 4) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_L1_LS (1 << 5) +#define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_L2_3_LS (1 << 6) +#define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_I (1 << 7) +#define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_II (1 << 8) +#define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_III (1 << 9) +#define AUDIO_FORMAT_TYPEIII_IEC61937_ATRAC (1 << 10) +#define AUDIO_FORMAT_TYPEIII_IEC61937_ATRAC2_3 (1 << 11) +#define AUDIO_FORMAT_TYPEIII_WMA (1 << 12) + +/* Audio Data Format Type IV Bit Allocations */ + +#define AUDIO_FORMAT_TYPEIV_PCM (1 << 0) +#define AUDIO_FORMAT_TYPEIV_PCM8 (1 << 1) +#define AUDIO_FORMAT_TYPEIV_IEEE_FLOAT (1 << 2) +#define AUDIO_FORMAT_TYPEIV_ALAW (1 << 3) +#define AUDIO_FORMAT_TYPEIV_MULAW (1 << 4) +#define AUDIO_FORMAT_TYPEIV_MPEG (1 << 5) +#define AUDIO_FORMAT_TYPEIV_AC3 (1 << 6) +#define AUDIO_FORMAT_TYPEIV_WMA (1 << 7) +#define AUDIO_FORMAT_TYPEIV_IEC61937_AC3 (1 << 8) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG1_L1 (1 << 9) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG1_L2_3 (1 << 10) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_NOEXT (1 << 10) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_EXT (1 << 11) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_AAC_ADTS (1 << 12) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_L1_LS (1 << 13) +#define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_L2_3_LS (1 << 14) +#define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_I (1 << 15) +#define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_II (1 << 16) +#define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_III (1 << 17) +#define AUDIO_FORMAT_TYPEIV_IEC61937_ATRAC (1 << 18) +#define AUDIO_FORMAT_TYPEIV_IEC61937_ATRAC2_3 (1 << 19) +#define AUDIO_FORMAT_TYPEIV_TYPE_III_WMA (1 << 20) +#define AUDIO_FORMAT_TYPEIV_IEC60958_PCM (1 << 21) + +/* Side Band Protocol Codes */ +#define AUDIO_SIDEBAND_PROTOCOL_UNDEF 0x00 +#define AUDIO_PRES_TIMESTAMP_PROTOCOL 0x01 + +/** USB Terminal Types + * Refer to Table 2-1 - Table 2-4 from termt10.pdf + */ + +/* USB Terminal Types */ +#define AUDIO_TERMINAL_UNDEF 0x0100 +#define AUDIO_TERMINAL_STREAMING 0x0101 +#define AUDIO_TERMINAL_VENDOR 0x01ff + +/* Input Terminal Types */ +#define AUDIO_INTERM_UNDEF 0x0200 /* Undefined Type */ +#define AUDIO_INTERM_MIC 0x0201 /* A generic microhpone */ +#define AUDIO_INTERM_DESKTOP_MIC 0x0202 /* A desktop microphone */ +#define AUDIO_INTERM_PERSONAL_MIC 0x0203 /* Head-mounted or clip-on microphone */ +#define AUDIO_INTERM_OMNI_MIC 0x0204 /* Omni-directional microphone */ +#define AUDIO_INTERM_MIC_ARRAY 0x0205 /* Microphone array */ +#define AUDIO_INTERM_PROC_MIC_ARRAY 0x0206 /* Microphone array with signal processor */ + +/* Output Terminal Types */ +#define AUDIO_OUTTERM_UNDEF 0x0300 /* Undefined Type */ +#define AUDIO_OUTTERM_SPEAKER 0x0301 /* Generic speakers */ +#define AUDIO_OUTTERM_HEADPHONES 0x0302 /* A head-mounted audio output device */ +#define AUDIO_OUTTERM_HEADDISPLAY 0x0303 /* Head Mounted Display Audio */ +#define AUDIO_OUTTERM_DESKTOP 0x0304 /* Desktop speaker */ +#define AUDIO_OUTTERM_ROOM 0x0305 /* Room speaker */ +#define AUDIO_OUTTERM_COMMS 0x0306 /* Communication speaker */ +#define AUDIO_OUTTERM_LOFREQ 0x0307 /* Low frequency effects speaker */ + +/* Bi-directional Terminal Types */ +#define AUDIO_BIDITERM_UNDEF 0x0400 /* Undefined Type */ +#define AUDIO_BIDITERM_HANDSET 0x0401 /* Hand-held bi-directional audio device */ +#define AUDIO_BIDITERM_HEADSET 0x0402 /* Head-mounted bi-directional audio device */ +#define AUDIO_BIDITERM_SPEAKERPHONE 0x0403 /* Speakerphone, no echo reduction */ +#define AUDIO_BIDITERM_ECHOSUPPRESS 0x0404 /* Echo-suppressing speakerphone */ +#define AUDIO_BIDITERM_ECHOCANCEL 0x0405 /* Echo-canceling speakerphone */ + +/* Telephony Terminal Types */ +#define AUDIO_TELETERM_UNDEF 0x0500 /* Undefined Type */ +#define AUDIO_TELETERM_PHONELINE 0x0501 /* Analog telephone line jack, an ISDN line, + * a proprietary PBX interface, or a wireless link */ +#define AUDIO_TELETERM_TELEPHONE 0x0502 /* Device can be used as a telephone */ +#define AUDIO_TELETERM_DOWNLINE 0x0503 /* Down Line Phone */ + +/* External Terminal Types */ +#define AUDIO_EXTTERM_UNDEF 0x0600 /* Undefined Type */ +#define AUDIO_EXTTERM_ANALOG 0x0601 /* Generic analog connector */ +#define AUDIO_EXTTERM_DIGITAL 0x0602 /* Generic digital audio interface */ +#define AUDIO_EXTTERM_LINE 0x0603 /* Analog connector at standard line levels */ +#define AUDIO_EXTTERM_LEGACY 0x0604 /* Legacy audio line out connector */ +#define AUDIO_EXTTERM_SPDIF 0x0605 /* SPDIF interface */ +#define AUDIO_EXTTERM_1394DA 0x0606 /* 1394 DA stream */ +#define AUDIO_EXTTERM_1394DV 0x0607 /* 1394 DV stream soundtrack */ +#define AUDIO_EXTTERM_ADAT 0x0608 /* ADAT Lightpipe */ +#define AUDIO_EXTTERM_TDIF 0x0609 /* TDIF - Tascam Digital Interface */ +#define AUDIO_EXTTERM_MADI 0x060a /* MADI - Multi-channel Audio Digital Interface (AES) */ + +/* Embedded Function Terminal Types */ +#define AUDIO_EMBEDTERM_UNDEF 0x0700 /* Undefined Type */ +#define AUDIO_EMBEDTERM_CALIBRATION 0x0701 /* Level Calibration Noise Source */ +#define AUDIO_EMBEDTERM_EQUALIZATION 0x0702 /* Equalization Noise */ +#define AUDIO_EMBEDTERM_CD 0x0703 /* CD player */ +#define AUDIO_EMBEDTERM_DAT 0x0704 /* Digital Audio Tape */ +#define AUDIO_EMBEDTERM_DCC 0x0705 /* Digital Compact Cassette */ +#define AUDIO_EMBEDTERM_COMPRESSED 0x0706 /* Compressed Audio Player */ +#define AUDIO_EMBEDTERM_TAPE 0x0707 /* Analog Audio Tape */ +#define AUDIO_EMBEDTERM_PHONOGRAPH 0x0708 /* Analog vinyl record player */ +#define AUDIO_EMBEDTERM_VCR 0x0709 /* Audio track of VCR */ +#define AUDIO_EMBEDTERM_VIDDISC 0x070a /* Audio track of VideoDisc player */ +#define AUDIO_EMBEDTERM_DVD 0x070b /* Audio track of DVD player */ +#define AUDIO_EMBEDTERM_TVTUNER 0x070c /* Audio track of TV tuner */ +#define AUDIO_EMBEDTERM_SATELLITE 0x070d /* Audio track of satellite receiver */ +#define AUDIO_EMBEDTERM_CABLETUNER 0x070e /* Audio track of cable tuner */ +#define AUDIO_EMBEDTERM_DSS 0x070f /* Audio track of DSS receiver */ +#define AUDIO_EMBEDTERM_RADIO 0x0710 /* AM/FM radio receiver */ +#define AUDIO_EMBEDTERM_TRANSMITTER 0x0711 /* AM/FM radio transmitter */ +#define AUDIO_EMBEDTERM_MULTITRACK 0x0712 /* A multi-track recording system */ +#define AUDIO_EMBEDTERM_SYNTHESIZER 0x0713 /* Synthesizer */ +#define AUDIO_EMBEDTERM_PIANO 0x0714 /* Piano */ +#define AUDIO_EMBEDTERM_GUITAR 0x0715 /* Guitar */ +#define AUDIO_EMBEDTERM_PERCUSSON 0x0716 /* Percussion Instrument */ +#define AUDIO_EMBEDTERM_INSTRUMENT 0x0717 /* Other Musical Instrument */ + +#define AUDIO_FORMAT_TYPE_I 0x01 +#define AUDIO_FORMAT_TYPE_II 0x02 +#define AUDIO_FORMAT_TYPE_III 0x03 + +struct audio_cs_if_ac_header_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint16_t bcdADC; + uint16_t wTotalLength; + uint8_t bInCollection; + uint8_t baInterfaceNr[]; +} __PACKED; + +#define AUDIO_SIZEOF_AC_HEADER_DESC(bInCollection) (8 + (bInCollection)) + +struct audio_cs_if_ac_input_terminal_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t bNrChannels; + uint16_t wChannelConfig; + uint8_t iChannelNames; + uint8_t iTerminal; +} __PACKED; + +#define AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC (12) + +struct audio_cs_if_ac_output_terminal_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t bSourceID; + uint8_t iTerminal; +} __PACKED; + +#define AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC (9) + +struct audio_cs_if_ac_feature_unit_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bUnitID; + uint8_t bSourceID; + uint8_t bControlSize; + uint8_t bmaControls[1]; + uint8_t iFeature; +} __PACKED; + +#define AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(bNrChannels, bControlSize) (7 + ((bNrChannels) + 1) * (bControlSize)) + +struct audio_cs_if_ac_selector_unit_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bUnitID; + uint8_t bNrInPins; + uint8_t baSourceID[1]; + uint8_t iSelector; +} __PACKED; + +#define AUDIO_SIZEOF_AC_SELECTOR_UNIT_DESC(bNrInPins) (6 + (bNrInPins)) + +struct audio_cs_if_as_general_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bTerminalLink; + uint8_t bDelay; + uint16_t wFormatTag; +} __PACKED; + +#define AUDIO_SIZEOF_AS_GENERAL_DESC (7) + +struct audio_cs_if_as_format_type_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bFormatType; + uint8_t bNrChannels; + uint8_t bSubframeSize; + uint8_t bBitResolution; + uint8_t bSamFreqType; + uint8_t tSamFreq[3]; +} __PACKED; + +#define AUDIO_SIZEOF_FORMAT_TYPE_DESC(bSamFreqType) (8 + 3 * (bSamFreqType)) + +struct audio_ep_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; + uint8_t bRefresh; + uint8_t bSynchAddress; +} __PACKED; + +#define AUDIO_SIZEOF_EP_DESC (9) + +struct audio_cs_ep_ep_general_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmAttributes; + uint8_t bLockDelayUnits; + uint16_t wLockDelay; +} __PACKED; + +#define AUDIO_SIZEOF_CS_EP_GENERAL_DESC (7) + +// clang-format off +#define AUDIO_AC_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, wTotalLength, stridx, ...) \ + /* Interface Association Descriptor */ \ + 0x08, \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, \ + bFirstInterface, \ + bInterfaceCount, \ + USB_DEVICE_CLASS_AUDIO, \ + AUDIO_SUBCLASS_AUDIOCONTROL, \ + AUDIO_PROTOCOL_UNDEFINED, \ + 0x00, \ + /* ------------------ AudioControl Interface ------------------ */\ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + stridx, /* iInterface */ \ + 0x08 + PP_NARG(__VA_ARGS__), /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ \ + WBVAL(0x0100), /* bcdADC */ \ + WBVAL(wTotalLength), /* wTotalLength */ \ + PP_NARG(__VA_ARGS__), /* bInCollection */ \ + __VA_ARGS__ /* baInterfaceNr */ + +#define AUDIO_AC_DESCRIPTOR_LEN(bInCollection) (0x08 + 0x09 + 0x08 + bInCollection) + +#define AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bNrChannels, wChannelConfig) \ + 0x0C, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */ \ + bTerminalID, /* bTerminalID */ \ + WBVAL(wTerminalType), /* wTerminalType : Microphone 0x0201 */ \ + 0x00, /* bAssocTerminal */ \ + bNrChannels, /* bNrChannels */ \ + WBVAL(wChannelConfig), /* wChannelConfig : Mono sets no position bits */ \ + 0x00, /* iChannelNames */ \ + 0x00 /* iTerminal */ + +#define AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bSourceID) \ + 0x09, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ \ + bTerminalID, /* bTerminalID */ \ + WBVAL(wTerminalType), /* wTerminalType : USB Streaming */ \ + 0x00, /* bAssocTerminal */ \ + bSourceID, /* bSourceID */ \ + 0x00 /* iTerminal */ + +#define AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(bUnitID, bSourceID, bControlSize, ...) \ + 0x07 + PP_NARG(__VA_ARGS__), /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */ \ + bUnitID, /* bUnitID */ \ + bSourceID, /* bSourceID */ \ + bControlSize, /* bControlSize */ \ + __VA_ARGS__, /* bmaControls(0) Mute */ \ + 0x00 /* iTerminal */ + +#define AUDIO_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval, ...) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x01, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x07, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ + bTerminalLink, /* bTerminalLink : Unit ID of the Output Terminal*/ \ + 0x01, /* bDelay */ \ + WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag : AUDIO_FORMAT_PCM */ \ + 0x08 + PP_NARG(__VA_ARGS__), /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ + bNrChannels, /* bNrChannels */ \ + bSubFrameSize, /* bSubFrameSize : Bytes per audio subframe */ \ + bBitResolution, /* bBitResolution : bits per sample */ \ + (PP_NARG(__VA_ARGS__)/3), /* bSamFreqType : only one frequency supported */ \ + __VA_ARGS__, /* tSamFreq : Audio sampling frequency coded on 3 bytes */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bEndpointAddress, /* bEndpointAddress : IN endpoint 1 */ \ + bmAttributes, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + bInterval, /* bInterval : one packet per frame */ \ + 0x00, /* bRefresh */ \ + 0x00, /* bSynchAddress */ \ + 0x07, /* bLength */ \ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ + AUDIO_EP_CONTROL_SAMPLING_FEQ, /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */ \ + 0x00, /* bLockDelayUnits */ \ + 0x00, /* wLockDelay */ \ + 0x00 + +#define AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, wMaxPacketSize, bInterval, bFeedbackEndpointAddress, ...) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x01, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x07, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ + bTerminalLink, /* bTerminalLink : Unit ID of the Output Terminal*/ \ + 0x01, /* bDelay */ \ + WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag : AUDIO_FORMAT_PCM */ \ + 0x08 + PP_NARG(__VA_ARGS__), /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ + bNrChannels, /* bNrChannels */ \ + bSubFrameSize, /* bSubFrameSize : Bytes per audio subframe */ \ + bBitResolution, /* bBitResolution : bits per sample */ \ + (PP_NARG(__VA_ARGS__)/3), /* bSamFreqType : only one frequency supported */ \ + __VA_ARGS__, /* tSamFreq : Audio sampling frequency coded on 3 bytes */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bEndpointAddress, /* bEndpointAddress : IN endpoint 1 */ \ + 0x05, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + bInterval, /* bInterval : one packet per frame */ \ + 0x00, /* bRefresh */ \ + bFeedbackEndpointAddress, /* bSynchAddress */ \ + 0x07, /* bLength */ \ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ + AUDIO_EP_CONTROL_SAMPLING_FEQ, /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */ \ + 0x00, /* bLockDelayUnits */ \ + 0x00, /* wLockDelay */ \ + 0x00, \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bFeedbackEndpointAddress, /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */ \ + 0x11, /* bmAttributes: TransferType=Isochronous SyncType=None EndpointType=Feedback */ \ + WBVAL(4), /* XXXX wMaxPacketSize in Bytes */ \ + bInterval, /* bInterval */ \ + 0x03, /* bRefresh, 8ms */ \ + 0x00 /* bSynchAddress */ + +#define AUDIO_AS_DESCRIPTOR_LEN(bSamFreqType) (0x09 + 0x09 + 0x07 + 0x08 + 3 * (bSamFreqType) + 0x09 + 0x07) +#define AUDIO_AS_FEEDBACK_DESCRIPTOR_LEN(bSamFreqType) (0x09 + 0x09 + 0x07 + 0x08 + 3 * (bSamFreqType) + 0x09 + 0x07 + 0x09) + +#define AUDIO_AS_ALTSETTING_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval, ...) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + bAlternateSetting, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x07, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ + bTerminalLink, /* bTerminalLink : Unit ID of the Output Terminal*/ \ + 0x01, /* bDelay */ \ + WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag : AUDIO_FORMAT_PCM */ \ + 0x08 + PP_NARG(__VA_ARGS__), /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ + bNrChannels, /* bNrChannels */ \ + bSubFrameSize, /* bSubFrameSize : Bytes per audio subframe */ \ + bBitResolution, /* bBitResolution : bits per sample */ \ + (PP_NARG(__VA_ARGS__)/3), /* bSamFreqType : only one frequency supported */ \ + __VA_ARGS__, /* tSamFreq : Audio sampling frequency coded on 3 bytes */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bEndpointAddress, /* bEndpointAddress : IN endpoint 1 */ \ + bmAttributes, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + bInterval, /* bInterval : one packet per frame */ \ + 0x00, /* bRefresh */ \ + 0x00, /* bSynchAddress */ \ + 0x07, /* bLength */ \ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ + AUDIO_EP_CONTROL_SAMPLING_FEQ, /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */ \ + 0x00, /* bLockDelayUnits */ \ + 0x00, /* wLockDelay */ \ + 0x00 + +#define AUDIO_AS_ALTSETTING_DESCRIPTOR_LEN(bSamFreqType) (0x09 + 0x07 + 0x08 + 3 * (bSamFreqType) + 0x09 + 0x07) + +#define AUDIO_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + 0x00 /* iInterface */ + +struct audio_v2_channel_cluster_descriptor { + uint8_t bNrChannels; + uint32_t bmChannelConfig; + uint8_t iChannelNames; +} __PACKED; + +#define AUDIO_V2_SIZEOF_CHANNEL_CLUSTER_DESC (6) + +struct audio_v2_cs_if_ac_header_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint16_t bcdADC; + uint8_t bCategory; + uint16_t wTotalLength; + uint8_t bmControls; +} __PACKED; + +#define AUDIO_V2_SIZEOF_AC_HEADER_DESC (9) + +struct audio_v2_cs_if_ac_clock_source_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bClockID; + uint8_t bmAttributes; + uint8_t bmControls; + uint8_t bAssocTerminal; + uint8_t iClockSource; +} __PACKED; + +#define AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC (8) + +struct audio_v2_cs_if_ac_clock_selector_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bClockID; + uint8_t bNrInPins; + uint8_t baCSourceID[1]; + uint8_t iClockSelector; +} __PACKED; + +#define AUDIO_SIZEOF_AC_CLOCK_SELECTOR_DESC(bNrInPins) (7 + (bNrInPins)) + +struct audio_v2_cs_if_ac_clock_multiplier_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bClockID; + uint8_t bCSourceID; + uint8_t bmControls; + uint8_t iClockMultiplier; +} __PACKED; + +#define AUDIO_SIZEOF_AC_CLOCK_MULTIPLIER_DESC (7) + +struct audio_v2_cs_if_ac_input_terminal_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t bCSourceID; + uint8_t bNrChannels; + uint32_t wChannelConfig; + uint8_t iChannelNames; + uint16_t bmControls; + uint8_t iTerminal; +} __PACKED; + +#define AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC (17) + +struct audio_v2_cs_if_ac_output_terminal_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t bSourceID; + uint8_t bCSourceID; + uint16_t bmControls; + uint8_t iTerminal; +} __PACKED; + +#define AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC (12) + +struct audio_v2_cs_if_ac_feature_unit_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bUnitID; + uint8_t bSourceID; + uint32_t bmaControls[1]; + uint8_t iFeature; +} __PACKED; + +#define AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(bNrChannels) (6 + ((bNrChannels) + 1) * 4) + +struct audio_v2_cs_if_as_general_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bTerminalLink; + uint8_t bmControls; + uint8_t bFormatType; + uint32_t bmFormats; + uint8_t bNrChannels; + uint32_t bmChannelConfig; + uint8_t iChannelNames; +} __PACKED; + +#define AUDIO_V2_SIZEOF_AS_GENERAL_DESC (16) + +struct audio_v2_control_range1_param_block { + uint16_t wNumSubRanges; + struct + { + uint8_t bMin; + uint8_t bMax; + uint8_t bRes; + }subrange[]; +} __PACKED; + +struct audio_v2_control_range2_param_block { + uint16_t wNumSubRanges; + struct + { + uint16_t wMin; + uint16_t wMax; + uint16_t wRes; + }subrange[]; +} __PACKED; + +struct audio_v2_control_range3_param_block { + uint16_t wNumSubRanges; + struct + { + uint32_t dMin; + uint32_t dMax; + uint32_t dRes; + }subrange[]; +} __PACKED; + +#define AUDIO_V2_AC_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, wTotalLength, bCategory, bmControls, stridx) \ + /* Interface Association Descriptor */ \ + 0x08, \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, \ + bFirstInterface, \ + bInterfaceCount, \ + USB_DEVICE_CLASS_AUDIO, \ + AUDIO_SUBCLASS_UNDEFINED, \ + AUDIO_PROTOCOLv20, \ + 0x00, \ + /* ------------------ AudioControl Interface ------------------ */\ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ + stridx, /* iInterface */ \ + 0x09, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ \ + WBVAL(0x0200), /* bcdADC */ \ + bCategory, /* bCategory */ \ + WBVAL(wTotalLength), /* wTotalLength */ \ + bmControls /* bmControls */ \ + +#define AUDIO_V2_AC_DESCRIPTOR_LEN (0x08 + 0x09 + 0x09) + +#define AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(bClockID, bmAttributes, bmControls) \ + 0x08, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_CLOCK_SOURCE, /* bDescriptorSubtype */ \ + bClockID, /* bClockID */ \ + bmAttributes, /* bmAttributes */ \ + bmControls, /* bmControls */ \ + 0x00, /* bAssocTerminal */ \ + 0x00 /* iClockSource */ + +#define AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bCSourceID, bNrChannels, wChannelConfig, bmControls) \ + 0x11, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */ \ + bTerminalID, /* bTerminalID */ \ + WBVAL(wTerminalType), /* wTerminalType : Microphone 0x0201 */ \ + 0x00, /* bAssocTerminal */ \ + bCSourceID, /* bCSourceID */ \ + bNrChannels, /* bNrChannels */ \ + DBVAL(wChannelConfig), /* wChannelConfig : Mono sets no position bits */ \ + 0x00, /* iChannelNames */ \ + WBVAL(bmControls), /* bmControls */ \ + 0x00 /* iTerminal */ + +#define AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bSourceID, bCSourceID, bmControls) \ + 0x0c, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ \ + bTerminalID, /* bTerminalID */ \ + WBVAL(wTerminalType), /* wTerminalType : USB Streaming */ \ + 0x00, /* bAssocTerminal */ \ + bSourceID, /* bSourceID */ \ + bCSourceID, /* bCSourceID */ \ + WBVAL(bmControls), /* bmControls */ \ + 0x00 /* iTerminal */ + +#define AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(bUnitID, bSourceID, ...) \ + 0x06 + (PP_NARG(__VA_ARGS__)), /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */ \ + bUnitID, /* bUnitID */ \ + bSourceID, /* bSourceID */ \ + __VA_ARGS__, /* bmaControls(0) Mute */ \ + 0x00 /* iTerminal */ + +#define AUDIO_V2_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x01, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x10, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ + bTerminalLink, /* bTerminalLink : Unit ID of the Output or Input Terminal*/ \ + 0x00, /* bmControls */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType : AUDIO_FORMAT_TYPE_I */ \ + DBVAL(AUDIO_V2_FORMAT_PCM), /* bmFormats PCM */ \ + bNrChannels, /* bNrChannels */ \ + DBVAL(bmChannelConfig), /* bmChannelConfig */ \ + 0x00, /* iChannelNames */ \ + 0x06, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ + bSubslotSize, /* bSubslotSize */ \ + bBitResolution, /* bBitResolution */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bEndpointAddress, /* bEndpointAddress 3 out endpoint for Audio */ \ + bmAttributes, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */ \ + bInterval, /* bInterval */ \ + 0x08, /* bLength */ \ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ + 0x00, /* bmAttributes */ \ + 0x00, /* bmControls */ \ + 0x00, /* bLockDelayUnits */ \ + 0x00, /* wLockDelay */ \ + 0x00 + +#define AUDIO_V2_AS_ALTSETTING_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + bAlternateSetting, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x10, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ + bTerminalLink, /* bTerminalLink : Unit ID of the Output or Input Terminal*/ \ + 0x00, /* bmControls */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType : AUDIO_FORMAT_TYPE_I */ \ + DBVAL(AUDIO_V2_FORMAT_PCM), /* bmFormats PCM */ \ + bNrChannels, /* bNrChannels */ \ + DBVAL(bmChannelConfig), /* bmChannelConfig */ \ + 0x00, /* iChannelNames */ \ + 0x06, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ + bSubslotSize, /* bSubslotSize */ \ + bBitResolution, /* bBitResolution */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bEndpointAddress, /* bEndpointAddress 3 out endpoint for Audio */ \ + bmAttributes, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */ \ + bInterval, /* bInterval */ \ + 0x08, /* bLength */ \ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ + 0x00, /* bmAttributes */ \ + 0x00, /* bmControls */ \ + 0x00, /* bLockDelayUnits */ \ + 0x00, /* wLockDelay */ \ + 0x00 + +#define AUDIO_V2_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ + 0x00 /* iInterface */ + +#define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, wMaxPacketSize, bInterval, bFeedbackEndpointAddress) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x01, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x10, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ + bTerminalLink, /* bTerminalLink : Unit ID of the Output or Input Terminal*/ \ + 0x00, /* bmControls */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType : AUDIO_FORMAT_TYPE_I */ \ + DBVAL(AUDIO_V2_FORMAT_PCM), /* bmFormats PCM */ \ + bNrChannels, /* bNrChannels */ \ + DBVAL(bmChannelConfig), /* bmChannelConfig */ \ + 0x00, /* iChannelNames */ \ + 0x06, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ + bSubslotSize, /* bSubslotSize */ \ + bBitResolution, /* bBitResolution */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bEndpointAddress, /* bEndpointAddress 3 out endpoint for Audio */ \ + 0x05, /* bmAttributes: TransferType=Isochronous SyncType=Asynchronous EndpointType=Data*/ \ + WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */ \ + bInterval, /* bInterval */ \ + 0x08, /* bLength */ \ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ + 0x00, /* bmAttributes */ \ + 0x00, /* bmControls */ \ + 0x00, /* bLockDelayUnits */ \ + 0x00, /* wLockDelay */ \ + 0x00, \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bFeedbackEndpointAddress, /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */ \ + 0x11, /* bmAttributes: TransferType=Isochronous SyncType=None EndpointType=Feedback */ \ + WBVAL(4), /* XXXX wMaxPacketSize in Bytes */ \ + bInterval /* bInterval */ + +// clang-format on + +#define AUDIO_V2_AS_DESCRIPTOR_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08) +#define AUDIO_V2_AS_ALTSETTING0_DESCRIPTOR_LEN (0x09) +#define AUDIO_V2_AS_ALTSETTING_DESCRIPTOR_LEN (0x09 + 0x10 + 0x06 + 0x07 + 0x08) +#define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08 + 0x07) + +#define AUDIO_SAMPLE_FREQ_NUM(num) (uint8_t)(num), (uint8_t)((num >> 8)) +#define AUDIO_SAMPLE_FREQ_3B(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16)) +#define AUDIO_SAMPLE_FREQ_4B(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), \ + (uint8_t)((frq >> 16)), (uint8_t)((frq >> 24)) + +/* format 10.14 */ +#define AUDIO_FREQ_TO_FEEDBACK_FS(freq) ((freq << 10) / 1000) +#define AUDIO_FEEDBACK_TO_BUF_FS(buf, feedback) \ + buf[0] = ((feedback << 4) & 0xFFU); \ + buf[1] = (((feedback << 4) >> 8U) & 0xFFU); \ + buf[2] = (((feedback << 4) >> 16U) & 0xFFU) + +/* format 16.16 */ +#define AUDIO_FREQ_TO_FEEDBACK_HS(freq) ((freq << 13) / 1000) +#define AUDIO_FEEDBACK_TO_BUF_HS(buf, feedback) \ + buf[0] = (((feedback & 0x00001FFFu) << 3) & 0xFFu); \ + buf[1] = ((((feedback & 0x00001FFFu) << 3) >> 8) & 0xFFu); \ + buf[2] = (((feedback & 0x01FFE000u) >> 13) & 0xFFu); \ + buf[3] = (((feedback & 0x01FFE000u) >> 21) & 0xFFu) + +#endif /* USB_AUDIO_H */ diff --git a/src/lib/CherryUSB/class/audio/usbd_audio.c b/src/lib/CherryUSB/class/audio/usbd_audio.c new file mode 100644 index 000000000..2f8130e36 --- /dev/null +++ b/src/lib/CherryUSB/class/audio/usbd_audio.c @@ -0,0 +1,389 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_audio.h" + +struct audio_entity_param { + uint32_t wCur; + uint32_t wMin; + uint32_t wMax; + uint32_t wRes; +}; + +struct usbd_audio_priv { + struct audio_entity_info *table; + uint8_t num; + uint16_t uac_version; +} g_usbd_audio[CONFIG_USBDEV_MAX_BUS]; + +static int audio_class_endpoint_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + uint8_t control_selector; + uint32_t sampling_freq = 0; + uint8_t ep; + + control_selector = HI_BYTE(setup->wValue); + ep = LO_BYTE(setup->wIndex); + + switch (control_selector) { + case AUDIO_EP_CONTROL_SAMPLING_FEQ: + switch (setup->bRequest) { + case AUDIO_REQUEST_SET_CUR: + memcpy((uint8_t *)&sampling_freq, *data, *len); + USB_LOG_DBG("Set ep:0x%02x %d Hz\r\n", ep, (int)sampling_freq); + usbd_audio_set_sampling_freq(busid, ep, sampling_freq); + break; + case AUDIO_REQUEST_GET_CUR: + case AUDIO_REQUEST_GET_MIN: + case AUDIO_REQUEST_GET_MAX: + case AUDIO_REQUEST_GET_RES: + sampling_freq = usbd_audio_get_sampling_freq(busid, ep); + memcpy(*data, &sampling_freq, 3); + USB_LOG_DBG("Get ep:0x%02x %d Hz\r\n", ep, (int)sampling_freq); + *len = 3; + break; + } + + break; + default: + USB_LOG_WRN("Unhandled Audio Class control selector 0x%02x\r\n", control_selector); + return -1; + } + return 0; +} + +static int audio_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USB_LOG_DBG("Audio Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + uint8_t entity_id; + uint8_t ep = 0; + uint8_t subtype = 0x01; + uint8_t control_selector; + uint8_t ch; + uint8_t mute; + uint16_t volume; + int volume_db = 0; + uint32_t sampling_freq = 0; + + const char *mute_string[2] = { "off", "on" }; + + entity_id = HI_BYTE(setup->wIndex); + control_selector = HI_BYTE(setup->wValue); + ch = LO_BYTE(setup->wValue); + + ARG_UNUSED(mute_string); + + for (uint8_t i = 0; i < g_usbd_audio[busid].num; i++) { + if (g_usbd_audio[busid].table[i].bEntityId == entity_id) { + subtype = g_usbd_audio[busid].table[i].bDescriptorSubtype; + ep = g_usbd_audio[busid].table[i].ep; + break; + } + } + + if (subtype == 0x01) { + USB_LOG_ERR("Do not find subtype for 0x%02x\r\n", entity_id); + return -1; + } + + USB_LOG_DBG("Audio entity_id:%02x, subtype:%02x, cs:%02x\r\n", entity_id, subtype, control_selector); + + switch (subtype) { + case AUDIO_CONTROL_FEATURE_UNIT: + switch (control_selector) { + case AUDIO_FU_CONTROL_MUTE: + if (g_usbd_audio[busid].uac_version < 0x0200) { + switch (setup->bRequest) { + case AUDIO_REQUEST_SET_CUR: + mute = (*data)[0]; + usbd_audio_set_mute(busid, ep, ch, mute); + break; + case AUDIO_REQUEST_GET_CUR: + (*data)[0] = usbd_audio_get_mute(busid, ep, ch); + *len = 1; + break; + default: + USB_LOG_WRN("Unhandled Audio Class bRequest 0x%02x in cs 0x%02x\r\n", setup->bRequest, control_selector); + return -1; + } + } else { + switch (setup->bRequest) { + case AUDIO_REQUEST_CUR: + if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { + (*data)[0] = usbd_audio_get_mute(busid, ep, ch); + *len = 1; + } else { + mute = (*data)[0]; + usbd_audio_set_mute(busid, ep, ch, mute); + } + break; + default: + //USB_LOG_WRN("Unhandled Audio Class bRequest 0x%02x in cs 0x%02x\r\n", setup->bRequest, control_selector); + return -1; + } + } + break; + case AUDIO_FU_CONTROL_VOLUME: + if (g_usbd_audio[busid].uac_version < 0x0200) { + switch (setup->bRequest) { + case AUDIO_REQUEST_SET_CUR: + memcpy(&volume, *data, *len); + if (volume < 0x8000) { + volume_db = volume / 256; + } else { + volume_db = (volume - 0x10000) / 256; + } + USB_LOG_DBG("Set ep:0x%02x ch:%d vol_hex:0x%04x, vol_db:%d dB\r\n", ep, ch, volume, volume_db); + usbd_audio_set_volume(busid, ep, ch, volume_db); + break; + case AUDIO_REQUEST_GET_CUR: + volume_db = usbd_audio_get_volume(busid, ep, ch); + if (volume_db >= 0) { + volume = volume_db * 256; + } else { + volume = volume_db * 256 + 0x10000; + } + USB_LOG_DBG("Get ep:0x%02x ch:%d vol_hex:0x%04x, vol_db:%d dB\r\n", ep, ch, volume, volume_db); + memcpy(*data, &volume, 2); + *len = 2; + break; + case AUDIO_REQUEST_GET_MIN: + (*data)[0] = 0x00; /* -100 dB */ + (*data)[1] = 0x9c; + *len = 2; + break; + case AUDIO_REQUEST_GET_MAX: + (*data)[0] = 0x00; /* 0 dB */ + (*data)[1] = 0x00; + *len = 2; + break; + case AUDIO_REQUEST_GET_RES: + (*data)[0] = 0x00; /* 1 dB */ + (*data)[1] = 0x01; + *len = 2; + break; + default: + USB_LOG_WRN("Unhandled Audio Class bRequest 0x%02x in cs 0x%02x\r\n", setup->bRequest, control_selector); + return -1; + } + } else { + switch (setup->bRequest) { + case AUDIO_REQUEST_CUR: + if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { + volume_db = usbd_audio_get_volume(busid, ep, ch); + if (volume_db >= 0) { + volume = volume_db * 256; + } else { + volume = volume_db * 256 + 0x10000; + } + USB_LOG_DBG("Get ep:0x%02x ch:%d vol_hex:0x%04x, vol_db:%d dB\r\n", ep, ch, volume, volume_db); + memcpy(*data, &volume, 2); + *len = 2; + } else { + memcpy(&volume, *data, *len); + if (volume < 0x8000) { + volume_db = volume / 256; + } else { + volume_db = (volume - 0x10000) / 256; + } + USB_LOG_DBG("Set ep:0x%02x ch:%d vol_hex:0x%04x, vol_db:%d dB\r\n", ep, ch, volume, volume_db); + usbd_audio_set_volume(busid, ep, ch, volume_db); + } + break; + case AUDIO_REQUEST_RANGE: + if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { + *((uint16_t *)(*data + 0)) = 1; + *((uint16_t *)(*data + 2)) = 0x9c00; /* MIN -100 dB */ + *((uint16_t *)(*data + 4)) = 0x0000; /* MAX 0 dB */ + *((uint16_t *)(*data + 6)) = 0x100; /* RES 1 dB */ + *len = 8; + } else { + } + break; + default: + //USB_LOG_WRN("Unhandled Audio Class bRequest 0x%02x in cs 0x%02x\r\n", setup->bRequest, control_selector); + return -1; + } + } + break; + + default: + USB_LOG_WRN("Unhandled Audio Class cs 0x%02x \r\n", control_selector); + return -1; + } + break; + case AUDIO_CONTROL_CLOCK_SOURCE: + switch (control_selector) { + case AUDIO_CS_CONTROL_SAM_FREQ: + switch (setup->bRequest) { + case AUDIO_REQUEST_CUR: + if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { + sampling_freq = usbd_audio_get_sampling_freq(busid, ep); + memcpy(*data, &sampling_freq, 4); + USB_LOG_DBG("Get ep:0x%02x %d Hz\r\n", ep, (int)sampling_freq); + *len = 4; + } else { + memcpy(&sampling_freq, *data, setup->wLength); + USB_LOG_DBG("Set ep:0x%02x %d Hz\r\n", ep, (int)sampling_freq); + usbd_audio_set_sampling_freq(busid, ep, sampling_freq); + } + break; + case AUDIO_REQUEST_RANGE: + if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { + uint8_t *sampling_freq_table = NULL; + uint16_t num; + + usbd_audio_get_sampling_freq_table(busid, ep, &sampling_freq_table); + num = (uint16_t)((uint16_t)(sampling_freq_table[1] << 8) | ((uint16_t)sampling_freq_table[0])); + memcpy(*data, sampling_freq_table, (12 * num + 2)); + *len = (12 * num + 2); + } else { + } + break; + default: + //USB_LOG_WRN("Unhandled Audio Class bRequest 0x%02x in cs 0x%02x\r\n", setup->bRequest, control_selector); + return -1; + } + break; + case AUDIO_CS_CONTROL_CLOCK_VALID: + if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { + (*data)[0] = 1; + *len = 1; + } else { + return -1; + } + break; + + default: + //USB_LOG_WRN("Unhandled Audio Class cs 0x%02x \r\n", control_selector); + return -1; + } + break; + + default: + break; + } + return 0; +} + +static void audio_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + switch (event) { + case USBD_EVENT_RESET: + + break; + + case USBD_EVENT_SET_INTERFACE: { + struct usb_interface_descriptor *intf = (struct usb_interface_descriptor *)arg; + if (intf->bAlternateSetting) { + usbd_audio_open(busid, intf->bInterfaceNumber); + } else { + usbd_audio_close(busid, intf->bInterfaceNumber); + } + } + + break; + + default: + break; + } +} + +struct usbd_interface *usbd_audio_init_intf(uint8_t busid, + struct usbd_interface *intf, + uint16_t uac_version, + struct audio_entity_info *table, + uint8_t num) +{ + if (uac_version < 0x0200) { + intf->class_interface_handler = audio_class_interface_request_handler; + intf->class_endpoint_handler = audio_class_endpoint_request_handler; + intf->vendor_handler = NULL; + intf->notify_handler = audio_notify_handler; + } else { + intf->class_interface_handler = audio_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = audio_notify_handler; + } + + g_usbd_audio[busid].uac_version = uac_version; + g_usbd_audio[busid].table = table; + g_usbd_audio[busid].num = num; + + return intf; +} + +__WEAK void usbd_audio_set_volume(uint8_t busid, uint8_t ep, uint8_t ch, int volume_db) +{ + (void)busid; + (void)ep; + (void)ch; + (void)volume_db; +} + +__WEAK int usbd_audio_get_volume(uint8_t busid, uint8_t ep, uint8_t ch) +{ + (void)busid; + (void)ep; + (void)ch; + + return 0; +} + +__WEAK void usbd_audio_set_mute(uint8_t busid, uint8_t ep, uint8_t ch, bool mute) +{ + (void)busid; + (void)ep; + (void)ch; + (void)mute; +} + +__WEAK bool usbd_audio_get_mute(uint8_t busid, uint8_t ep, uint8_t ch) +{ + (void)busid; + (void)ep; + (void)ch; + + return 0; +} + +__WEAK void usbd_audio_set_sampling_freq(uint8_t busid, uint8_t ep, uint32_t sampling_freq) +{ + (void)busid; + (void)ep; + (void)sampling_freq; +} + +__WEAK uint32_t usbd_audio_get_sampling_freq(uint8_t busid, uint8_t ep) +{ + (void)busid; + (void)ep; + + return 0; +} + +__WEAK void usbd_audio_get_sampling_freq_table(uint8_t busid, uint8_t ep, uint8_t **sampling_freq_table) +{ + (void)busid; + (void)ep; + (void)sampling_freq_table; +} + +__WEAK void usbd_audio_open(uint8_t busid, uint8_t intf) +{ + (void)busid; + (void)intf; +} + +__WEAK void usbd_audio_close(uint8_t busid, uint8_t intf) +{ + (void)busid; + (void)intf; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/class/audio/usbd_audio.h b/src/lib/CherryUSB/class/audio/usbd_audio.h new file mode 100644 index 000000000..75a0b17dc --- /dev/null +++ b/src/lib/CherryUSB/class/audio/usbd_audio.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_AUDIO_H +#define USBD_AUDIO_H + +#include "usb_audio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct audio_entity_info { + uint8_t bDescriptorSubtype; + uint8_t bEntityId; + uint8_t ep; +}; + +/* Init audio interface driver */ +struct usbd_interface *usbd_audio_init_intf(uint8_t busid, struct usbd_interface *intf, + uint16_t uac_version, + struct audio_entity_info *table, + uint8_t num); + +void usbd_audio_open(uint8_t busid, uint8_t intf); +void usbd_audio_close(uint8_t busid, uint8_t intf); + +void usbd_audio_set_volume(uint8_t busid, uint8_t ep, uint8_t ch, int volume_db); +int usbd_audio_get_volume(uint8_t busid, uint8_t ep, uint8_t ch); +void usbd_audio_set_mute(uint8_t busid, uint8_t ep, uint8_t ch, bool mute); +bool usbd_audio_get_mute(uint8_t busid, uint8_t ep, uint8_t ch); +void usbd_audio_set_sampling_freq(uint8_t busid, uint8_t ep, uint32_t sampling_freq); +uint32_t usbd_audio_get_sampling_freq(uint8_t busid, uint8_t ep); + +void usbd_audio_get_sampling_freq_table(uint8_t busid, uint8_t ep, uint8_t **sampling_freq_table); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_AUDIO_H */ diff --git a/src/lib/CherryUSB/class/audio/usbh_audio.c b/src/lib/CherryUSB/class/audio/usbh_audio.c new file mode 100644 index 000000000..4aed30fe8 --- /dev/null +++ b/src/lib/CherryUSB/class/audio/usbh_audio.c @@ -0,0 +1,660 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_audio.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_audio" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/audio%d" + +/* general descriptor field offsets */ +#define DESC_bLength 0 /** Length offset */ +#define DESC_bDescriptorType 1 /** Descriptor type offset */ +#define DESC_bDescriptorSubType 2 /** Descriptor subtype offset */ + +/* interface descriptor field offsets */ +#define INTF_DESC_bInterfaceNumber 2 /** Interface number offset */ +#define INTF_DESC_bAlternateSetting 3 /** Alternate setting offset */ + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_audio_buf[USB_ALIGN_UP(128, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_audio g_audio_class[CONFIG_USBHOST_MAX_AUDIO_CLASS]; +static uint32_t g_devinuse = 0; + +static struct usbh_audio *usbh_audio_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_AUDIO_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_audio_class[devno], 0, sizeof(struct usbh_audio)); + g_audio_class[devno].minor = devno; + return &g_audio_class[devno]; + } + } + return NULL; +} + +static void usbh_audio_class_free(struct usbh_audio *audio_class) +{ + uint8_t devno = audio_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(audio_class, 0, sizeof(struct usbh_audio)); +} + +int usbh_audio_open(struct usbh_audio *audio_class, const char *name, uint32_t samp_freq, uint8_t bitresolution) +{ + struct usb_setup_packet *setup; + struct usb_endpoint_descriptor *ep_desc; + uint8_t mult; + uint16_t mps; + int ret; + uint8_t intf = 0xff; + uint8_t altsetting = 1; + + if (!audio_class || !audio_class->hport) { + return -USB_ERR_INVAL; + } + setup = audio_class->hport->setup; + + if (audio_class->is_opened) { + return 0; + } + + for (uint8_t i = 0; i < audio_class->stream_intf_num; i++) { + if (strcmp(name, audio_class->as_msg_table[i].stream_name) == 0) { + intf = audio_class->as_msg_table[i].stream_intf; + for (uint8_t j = 1; j < audio_class->as_msg_table[i].num_of_altsetting; j++) { + if (audio_class->as_msg_table[i].as_format[j].bBitResolution == bitresolution) { + for (uint8_t k = 0; k < audio_class->as_msg_table[i].as_format[j].bSamFreqType; k++) { + uint32_t freq = 0; + + memcpy(&freq, &audio_class->as_msg_table[i].as_format[j].tSamFreq[3 * k], 3); + if (freq == samp_freq) { + altsetting = j; + goto freq_found; + } + } + } + } + } + } + return -USB_ERR_NODEV; + +freq_found: + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = USB_REQUEST_SET_INTERFACE; + setup->wValue = altsetting; + setup->wIndex = intf; + setup->wLength = 0; + + ret = usbh_control_transfer(audio_class->hport, setup, NULL); + if (ret < 0) { + return ret; + } + + ep_desc = &audio_class->hport->config.intf[intf].altsetting[altsetting].ep[0].ep_desc; + + if (audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].ep_attr & AUDIO_EP_CONTROL_SAMPLING_FEQ) { + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_ENDPOINT; + setup->bRequest = AUDIO_REQUEST_SET_CUR; + setup->wValue = (AUDIO_EP_CONTROL_SAMPLING_FEQ << 8) | 0x00; + setup->wIndex = ep_desc->bEndpointAddress; + setup->wLength = 3; + + memcpy(g_audio_buf, &samp_freq, 3); + ret = usbh_control_transfer(audio_class->hport, setup, g_audio_buf); + if (ret < 0) { + return ret; + } + } + + mult = (ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_MASK) >> USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT; + mps = ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_MASK; + if (ep_desc->bEndpointAddress & 0x80) { + audio_class->isoin_mps = mps * (mult + 1); + USBH_EP_INIT(audio_class->isoin, ep_desc); + } else { + audio_class->isoout_mps = mps * (mult + 1); + USBH_EP_INIT(audio_class->isoout, ep_desc); + } + + USB_LOG_INFO("Open audio stream :%s, altsetting: %u\r\n", name, altsetting); + audio_class->is_opened = true; + return ret; +} + +int usbh_audio_close(struct usbh_audio *audio_class, const char *name) +{ + struct usb_setup_packet *setup; + struct usb_endpoint_descriptor *ep_desc; + int ret; + uint8_t intf = 0xff; + uint8_t altsetting = 1; + + if (!audio_class || !audio_class->hport) { + return -USB_ERR_INVAL; + } + setup = audio_class->hport->setup; + + for (uint8_t i = 0; i < audio_class->stream_intf_num; i++) { + if (strcmp(name, audio_class->as_msg_table[i].stream_name) == 0) { + intf = audio_class->as_msg_table[i].stream_intf; + } + } + + if (intf == 0xff) { + return -USB_ERR_NODEV; + } + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = USB_REQUEST_SET_INTERFACE; + setup->wValue = 0; + setup->wIndex = intf; + setup->wLength = 0; + + ret = usbh_control_transfer(audio_class->hport, setup, NULL); + if (ret < 0) { + return ret; + } + USB_LOG_INFO("Close audio stream :%s\r\n", name); + audio_class->is_opened = false; + + ep_desc = &audio_class->hport->config.intf[intf].altsetting[altsetting].ep[0].ep_desc; + if (ep_desc->bEndpointAddress & 0x80) { + if (audio_class->isoin) { + audio_class->isoin = NULL; + } + } else { + if (audio_class->isoout) { + audio_class->isoout = NULL; + } + } + + return ret; +} + +int usbh_audio_set_volume(struct usbh_audio *audio_class, const char *name, uint8_t ch, int volume_db) +{ + struct usb_setup_packet *setup; + int ret; + uint8_t feature_id = 0xff; + uint8_t intf; + uint16_t volume_hex; + int volume_min_db; + int volume_max_db; + + if (!audio_class || !audio_class->hport) { + return -USB_ERR_INVAL; + } + + if ((volume_db > 127) || (volume_db < -127)) { + return -USB_ERR_INVAL; + } + + setup = audio_class->hport->setup; + + for (uint8_t i = 0; i < audio_class->stream_intf_num; i++) { + if (strcmp(name, audio_class->as_msg_table[i].stream_name) == 0) { + feature_id = audio_class->as_msg_table[i].feature_terminal_id; + intf = audio_class->as_msg_table[i].stream_intf; + } + } + + if (feature_id == 0xff) { + return -USB_ERR_NODEV; + } + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = AUDIO_REQUEST_GET_CUR; + setup->wValue = (AUDIO_FU_CONTROL_VOLUME << 8) | ch; + setup->wIndex = (feature_id << 8) | audio_class->ctrl_intf; + setup->wLength = 2; + + ret = usbh_control_transfer(audio_class->hport, setup, g_audio_buf); + if (ret < 0) { + return ret; + } + + memcpy(&audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_cur, g_audio_buf, 2); + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = AUDIO_REQUEST_GET_MIN; + setup->wValue = (AUDIO_FU_CONTROL_VOLUME << 8) | ch; + setup->wIndex = (feature_id << 8) | audio_class->ctrl_intf; + setup->wLength = 2; + + ret = usbh_control_transfer(audio_class->hport, setup, g_audio_buf); + if (ret < 0) { + return ret; + } + + memcpy(&audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_min, g_audio_buf, 2); + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = AUDIO_REQUEST_GET_MAX; + setup->wValue = (AUDIO_FU_CONTROL_VOLUME << 8) | ch; + setup->wIndex = (feature_id << 8) | audio_class->ctrl_intf; + setup->wLength = 2; + + ret = usbh_control_transfer(audio_class->hport, setup, g_audio_buf); + if (ret < 0) { + return ret; + } + memcpy(&audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_max, g_audio_buf, 2); + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = AUDIO_REQUEST_GET_RES; + setup->wValue = (AUDIO_FU_CONTROL_VOLUME << 8) | ch; + setup->wIndex = (feature_id << 8) | audio_class->ctrl_intf; + setup->wLength = 2; + + ret = usbh_control_transfer(audio_class->hport, setup, g_audio_buf); + if (ret < 0) { + return ret; + } + memcpy(&audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_res, g_audio_buf, 2); + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = AUDIO_REQUEST_SET_CUR; + setup->wValue = (AUDIO_FU_CONTROL_VOLUME << 8) | ch; + setup->wIndex = (feature_id << 8) | audio_class->ctrl_intf; + setup->wLength = 2; + + if (audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_min < 0x8000) { + volume_min_db = audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_min / 256; + } else { + volume_min_db = (audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_min - 0x10000) / 256; + } + + if (audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_max < 0x8000) { + volume_max_db = audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_max / 256; + } else { + volume_max_db = (audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_max - 0x10000) / 256; + } + + USB_LOG_INFO("Get ch:%u dB range: %ddB ~ %ddB\r\n", ch, volume_min_db, volume_max_db); + + if (volume_db >= 0) { + volume_hex = volume_db * 256; + if (volume_hex > audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_max) { + return -USB_ERR_RANGE; + } + } else { + volume_hex = volume_db * 256 + 0x10000; + if (volume_hex < audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_min) { + return -USB_ERR_RANGE; + } + } + + memcpy(g_audio_buf, &volume_hex, 2); + ret = usbh_control_transfer(audio_class->hport, setup, g_audio_buf); + if (ret < 0) { + return ret; + } + audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].volume_cur = volume_hex; + return ret; +} + +int usbh_audio_set_mute(struct usbh_audio *audio_class, const char *name, uint8_t ch, bool mute) +{ + struct usb_setup_packet *setup; + int ret; + uint8_t feature_id = 0xff; + uint8_t intf = 0xff; + + if (!audio_class || !audio_class->hport) { + return -USB_ERR_INVAL; + } + setup = audio_class->hport->setup; + + for (uint8_t i = 0; i < audio_class->stream_intf_num; i++) { + if (strcmp(name, audio_class->as_msg_table[i].stream_name) == 0) { + feature_id = audio_class->as_msg_table[i].feature_terminal_id; + intf = audio_class->as_msg_table[i].stream_intf; + } + } + + if (feature_id == 0xff) { + return -USB_ERR_NODEV; + } + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = AUDIO_REQUEST_SET_CUR; + setup->wValue = (AUDIO_FU_CONTROL_MUTE << 8) | ch; + setup->wIndex = (feature_id << 8) | audio_class->ctrl_intf; + setup->wLength = 1; + + memcpy(g_audio_buf, &mute, 1); + ret = usbh_control_transfer(audio_class->hport, setup, g_audio_buf); + if (ret < 0) { + return ret; + } + audio_class->as_msg_table[intf - audio_class->ctrl_intf - 1].mute = mute; + return ret; +} + +void usbh_audio_list_module(struct usbh_audio *audio_class) +{ + USB_LOG_INFO("============= Audio module information ===================\r\n"); + USB_LOG_RAW("bcdADC :%04x\r\n", audio_class->bcdADC); + USB_LOG_RAW("Num of audio stream :%u\r\n", audio_class->stream_intf_num); + + for (uint8_t i = 0; i < audio_class->stream_intf_num; i++) { + USB_LOG_RAW("\tstream name :%s\r\n", audio_class->as_msg_table[i].stream_name); + USB_LOG_RAW("\tstream intf :%u\r\n", audio_class->as_msg_table[i].stream_intf); + USB_LOG_RAW("\tNum of altsetting :%u\r\n", audio_class->as_msg_table[i].num_of_altsetting); + + for (uint8_t j = 0; j < audio_class->as_msg_table[i].num_of_altsetting; j++) { + if (j == 0) { + USB_LOG_RAW("\t\tIngore altsetting 0\r\n"); + continue; + } + USB_LOG_RAW("\t\tAltsetting :%u\r\n", j); + USB_LOG_RAW("\t\t\tbNrChannels :%u\r\n", audio_class->as_msg_table[i].as_format[j].bNrChannels); + USB_LOG_RAW("\t\t\tbBitResolution :%u\r\n", audio_class->as_msg_table[i].as_format[j].bBitResolution); + USB_LOG_RAW("\t\t\tbSamFreqType :%u\r\n", audio_class->as_msg_table[i].as_format[j].bSamFreqType); + + for (uint8_t k = 0; k < audio_class->as_msg_table[i].as_format[j].bSamFreqType; k++) { + uint32_t freq = 0; + + memcpy(&freq, &audio_class->as_msg_table[i].as_format[j].tSamFreq[3 * k], 3); + USB_LOG_RAW("\t\t\t\tSampleFreq :%u\r\n", freq); + } + } + } + + USB_LOG_INFO("============= Audio module information ===================\r\n"); +} + +static int usbh_audio_ctrl_connect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret; + uint8_t cur_iface = 0; + uint8_t cur_iface_count = 0; + uint8_t cur_alt_setting = 0; + uint8_t input_offset = 0; + uint8_t output_offset = 0; + uint8_t feature_unit_offset = 0; + uint8_t *p; + struct usbh_audio_ac_msg ac_msg_table[CONFIG_USBHOST_AUDIO_MAX_STREAMS]; + + struct usbh_audio *audio_class = usbh_audio_class_alloc(); + if (audio_class == NULL) { + USB_LOG_ERR("Fail to alloc audio_class\r\n"); + return -USB_ERR_NOMEM; + } + + audio_class->hport = hport; + audio_class->ctrl_intf = intf; + hport->config.intf[intf].priv = audio_class; + + p = hport->raw_config_desc; + while (p[DESC_bLength]) { + switch (p[DESC_bDescriptorType]) { + case USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION: + cur_iface_count = p[3]; + break; + case USB_DESCRIPTOR_TYPE_INTERFACE: + cur_iface = p[INTF_DESC_bInterfaceNumber]; + cur_alt_setting = p[INTF_DESC_bAlternateSetting]; + break; + case USB_DESCRIPTOR_TYPE_ENDPOINT: + break; + case AUDIO_INTERFACE_DESCRIPTOR_TYPE: + if (cur_iface == audio_class->ctrl_intf) { + switch (p[DESC_bDescriptorSubType]) { + case AUDIO_CONTROL_HEADER: { + struct audio_cs_if_ac_header_descriptor *desc = (struct audio_cs_if_ac_header_descriptor *)p; + audio_class->bcdADC = desc->bcdADC; + audio_class->bInCollection = desc->bInCollection; + } break; + case AUDIO_CONTROL_INPUT_TERMINAL: { + struct audio_cs_if_ac_input_terminal_descriptor *desc = (struct audio_cs_if_ac_input_terminal_descriptor *)p; + + memcpy(&ac_msg_table[input_offset].ac_input, desc, sizeof(struct audio_cs_if_ac_input_terminal_descriptor)); + input_offset++; + } break; + case AUDIO_CONTROL_OUTPUT_TERMINAL: { + struct audio_cs_if_ac_output_terminal_descriptor *desc = (struct audio_cs_if_ac_output_terminal_descriptor *)p; + + memcpy(&ac_msg_table[output_offset].ac_output, desc, sizeof(struct audio_cs_if_ac_output_terminal_descriptor)); + output_offset++; + } break; + case AUDIO_CONTROL_FEATURE_UNIT: { + struct audio_cs_if_ac_feature_unit_descriptor *desc = (struct audio_cs_if_ac_feature_unit_descriptor *)p; + + memcpy(&ac_msg_table[feature_unit_offset].ac_feature_unit, desc, desc->bLength); + feature_unit_offset++; + } break; + default: + USB_LOG_ERR("Do not support %02x subtype\r\n", p[DESC_bDescriptorSubType]); + return -USB_ERR_NOTSUPP; + } + } else if ((cur_iface > audio_class->ctrl_intf) && (cur_iface < (audio_class->ctrl_intf + cur_iface_count))) { + switch (p[DESC_bDescriptorSubType]) { + case AUDIO_STREAMING_GENERAL: { + struct audio_cs_if_as_general_descriptor *desc = (struct audio_cs_if_as_general_descriptor *)p; + + /* all altsetting have the same general */ + audio_class->as_msg_table[cur_iface - audio_class->ctrl_intf - 1].stream_intf = cur_iface; + memcpy(&audio_class->as_msg_table[cur_iface - audio_class->ctrl_intf - 1].as_general, desc, sizeof(struct audio_cs_if_as_general_descriptor)); + } break; + case AUDIO_STREAMING_FORMAT_TYPE: { + struct audio_cs_if_as_format_type_descriptor *desc = (struct audio_cs_if_as_format_type_descriptor *)p; + audio_class->as_msg_table[cur_iface - audio_class->ctrl_intf - 1].num_of_altsetting = (cur_alt_setting + 1); + memcpy(&audio_class->as_msg_table[cur_iface - audio_class->ctrl_intf - 1].as_format[cur_alt_setting], desc, desc->bLength); + } break; + default: + break; + } + } + break; + case AUDIO_ENDPOINT_DESCRIPTOR_TYPE: + if ((cur_iface > audio_class->ctrl_intf) && (cur_iface < (audio_class->ctrl_intf + cur_iface_count))) { + if (p[DESC_bDescriptorSubType] == AUDIO_ENDPOINT_GENERAL) { + struct audio_cs_ep_ep_general_descriptor *desc = (struct audio_cs_ep_ep_general_descriptor *)p; + audio_class->as_msg_table[cur_iface - audio_class->ctrl_intf - 1].ep_attr = desc->bmAttributes; + } + } + break; + default: + break; + } + /* skip to next descriptor */ + p += p[DESC_bLength]; + } + + if ((input_offset != output_offset) && (input_offset != feature_unit_offset)) { + USB_LOG_ERR("Audio control descriptor is invalid\r\n"); + return -USB_ERR_INVAL; + } + + if (cur_iface_count == 0xff) { + USB_LOG_ERR("Audio descriptor must have iad descriptor\r\n"); + return -USB_ERR_INVAL; + } + + audio_class->stream_intf_num = input_offset; + + for (uint8_t i = 0; i < audio_class->stream_intf_num; i++) { + /* Search 0x0101 in input or output desc */ + for (uint8_t streamidx = 0; streamidx < audio_class->stream_intf_num; streamidx++) { + if (audio_class->as_msg_table[i].as_general.bTerminalLink == ac_msg_table[streamidx].ac_input.bTerminalID) { + /* INPUT --> FEATURE UNIT --> OUTPUT */ + audio_class->as_msg_table[i].input_terminal_id = ac_msg_table[streamidx].ac_input.bTerminalID; + + /* Search input terminal id in feature desc */ + for (uint8_t featureidx = 0; featureidx < audio_class->stream_intf_num; featureidx++) { + if (ac_msg_table[streamidx].ac_input.bTerminalID == ac_msg_table[featureidx].ac_feature_unit.bSourceID) { + audio_class->as_msg_table[i].feature_terminal_id = ac_msg_table[featureidx].ac_feature_unit.bUnitID; + + /* Search feature unit id in output desc */ + for (uint8_t outputid = 0; outputid < audio_class->stream_intf_num; outputid++) { + if (ac_msg_table[featureidx].ac_feature_unit.bUnitID == ac_msg_table[outputid].ac_output.bSourceID) { + audio_class->as_msg_table[i].output_terminal_id = ac_msg_table[outputid].ac_output.bTerminalID; + + switch (ac_msg_table[outputid].ac_output.wTerminalType) { + case AUDIO_OUTTERM_SPEAKER: + audio_class->as_msg_table[i].stream_name = "speaker"; + break; + case AUDIO_OUTTERM_HEADPHONES: + audio_class->as_msg_table[i].stream_name = "headphoens"; + break; + case AUDIO_OUTTERM_HEADDISPLAY: + audio_class->as_msg_table[i].stream_name = "headdisplay"; + break; + default: + audio_class->as_msg_table[i].stream_name = "unknown"; + break; + } + break; + } + } + break; + } + } + } else if (audio_class->as_msg_table[i].as_general.bTerminalLink == ac_msg_table[streamidx].ac_output.bTerminalID) { + /* OUTPUT --> FEATURE UNIT --> INPUT */ + audio_class->as_msg_table[i].output_terminal_id = ac_msg_table[streamidx].ac_output.bTerminalID; + + /* Search output terminal id in feature desc */ + for (uint8_t featureidx = 0; featureidx < audio_class->stream_intf_num; featureidx++) { + if (ac_msg_table[streamidx].ac_output.bSourceID == ac_msg_table[featureidx].ac_feature_unit.bUnitID) { + audio_class->as_msg_table[i].feature_terminal_id = ac_msg_table[featureidx].ac_feature_unit.bUnitID; + + /* Search feature unit id in input desc */ + for (uint8_t inputid = 0; inputid < audio_class->stream_intf_num; inputid++) { + if (ac_msg_table[featureidx].ac_feature_unit.bSourceID == ac_msg_table[inputid].ac_input.bTerminalID) { + audio_class->as_msg_table[i].input_terminal_id = ac_msg_table[inputid].ac_input.bTerminalID; + + switch (ac_msg_table[inputid].ac_input.wTerminalType) { + case AUDIO_INTERM_MIC: + audio_class->as_msg_table[i].stream_name = "mic"; + break; + default: + audio_class->as_msg_table[i].stream_name = "unknown"; + break; + } + break; + } + } + break; + } + } + } + } + } + + for (uint8_t i = 0; i < audio_class->stream_intf_num; i++) { + if (audio_class->as_msg_table[i].stream_name == NULL) { + USB_LOG_ERR("Audio stream search fail\r\n"); + return -USB_ERR_NODEV; + } + } + + for (uint8_t i = 0; i < audio_class->stream_intf_num; i++) { + ret = usbh_audio_close(audio_class, audio_class->as_msg_table[i].stream_name); + if (ret < 0) { + USB_LOG_ERR("Fail to close audio stream :%s\r\n", audio_class->as_msg_table[i].stream_name); + return ret; + } + } + + usbh_audio_list_module(audio_class); + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, audio_class->minor); + USB_LOG_INFO("Register Audio Class:%s\r\n", hport->config.intf[intf].devname); + + usbh_audio_run(audio_class); + return 0; +} + +static int usbh_audio_ctrl_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_audio *audio_class = (struct usbh_audio *)hport->config.intf[intf].priv; + + if (audio_class) { + if (audio_class->isoin) { + } + + if (audio_class->isoout) { + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister Audio Class:%s\r\n", hport->config.intf[intf].devname); + usbh_audio_stop(audio_class); + } + + usbh_audio_class_free(audio_class); + } + + return ret; +} + +static int usbh_audio_data_connect(struct usbh_hubport *hport, uint8_t intf) +{ + (void)hport; + (void)intf; + return 0; +} + +static int usbh_audio_data_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + (void)hport; + (void)intf; + return 0; +} + +__WEAK void usbh_audio_run(struct usbh_audio *audio_class) +{ + (void)audio_class; +} + +__WEAK void usbh_audio_stop(struct usbh_audio *audio_class) +{ + (void)audio_class; +} + +const struct usbh_class_driver audio_ctrl_class_driver = { + .driver_name = "audio_ctrl", + .connect = usbh_audio_ctrl_connect, + .disconnect = usbh_audio_ctrl_disconnect +}; + +const struct usbh_class_driver audio_streaming_class_driver = { + .driver_name = "audio_streaming", + .connect = usbh_audio_data_connect, + .disconnect = usbh_audio_data_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info audio_ctrl_intf_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS, + .bInterfaceClass = USB_DEVICE_CLASS_AUDIO, + .bInterfaceSubClass = AUDIO_SUBCLASS_AUDIOCONTROL, + .bInterfaceProtocol = 0x00, + .id_table = NULL, + .class_driver = &audio_ctrl_class_driver +}; + +CLASS_INFO_DEFINE const struct usbh_class_info audio_streaming_intf_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS, + .bInterfaceClass = USB_DEVICE_CLASS_AUDIO, + .bInterfaceSubClass = AUDIO_SUBCLASS_AUDIOSTREAMING, + .bInterfaceProtocol = 0x00, + .id_table = NULL, + .class_driver = &audio_streaming_class_driver +}; diff --git a/src/lib/CherryUSB/class/audio/usbh_audio.h b/src/lib/CherryUSB/class/audio/usbh_audio.h new file mode 100644 index 000000000..2e583ac0b --- /dev/null +++ b/src/lib/CherryUSB/class/audio/usbh_audio.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_AUDIO_H +#define USBH_AUDIO_H + +#include "usb_audio.h" + +#ifndef CONFIG_USBHOST_AUDIO_MAX_STREAMS +#define CONFIG_USBHOST_AUDIO_MAX_STREAMS 3 +#endif + +struct usbh_audio_ac_msg { + struct audio_cs_if_ac_input_terminal_descriptor ac_input; + struct audio_cs_if_ac_feature_unit_descriptor ac_feature_unit; + struct audio_cs_if_ac_output_terminal_descriptor ac_output; +}; + +struct usbh_audio_as_msg { + const char *stream_name; + uint8_t stream_intf; + uint8_t input_terminal_id; + uint8_t feature_terminal_id; + uint8_t output_terminal_id; + uint8_t ep_attr; + uint8_t num_of_altsetting; + uint16_t volume_min; + uint16_t volume_max; + uint16_t volume_res; + uint16_t volume_cur; + bool mute; + struct audio_cs_if_as_general_descriptor as_general; + struct audio_cs_if_as_format_type_descriptor as_format[CONFIG_USBHOST_MAX_INTF_ALTSETTINGS]; +}; + +struct usbh_audio { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *isoin; /* ISO IN endpoint */ + struct usb_endpoint_descriptor *isoout; /* ISO OUT endpoint */ + + uint8_t ctrl_intf; /* interface number */ + uint8_t minor; + uint16_t isoin_mps; + uint16_t isoout_mps; + bool is_opened; + uint16_t bcdADC; + uint8_t bInCollection; + uint8_t stream_intf_num; + struct usbh_audio_as_msg as_msg_table[CONFIG_USBHOST_AUDIO_MAX_STREAMS]; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_audio_open(struct usbh_audio *audio_class, const char *name, uint32_t samp_freq, uint8_t bitresolution); +int usbh_audio_close(struct usbh_audio *audio_class, const char *name); +int usbh_audio_set_volume(struct usbh_audio *audio_class, const char *name, uint8_t ch, int volume_db); +int usbh_audio_set_mute(struct usbh_audio *audio_class, const char *name, uint8_t ch, bool mute); + +void usbh_audio_run(struct usbh_audio *audio_class); +void usbh_audio_stop(struct usbh_audio *audio_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_AUDIO_H */ diff --git a/src/lib/CherryUSB/class/cdc/usb_cdc.h b/src/lib/CherryUSB/class/cdc/usb_cdc.h new file mode 100644 index 000000000..65ab025f9 --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usb_cdc.h @@ -0,0 +1,696 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_CDC_H +#define USB_CDC_H + +/*------------------------------------------------------------------------------ + * Definitions based on usbcdc11.pdf (www.usb.org) + *----------------------------------------------------------------------------*/ +/* Communication device class specification version 1.10 */ +#define CDC_V1_10 0x0110U +// Communication device class specification version 1.2 +#define CDC_V1_2_0 0x0120U + +/* Communication interface class code */ +/* (usbcdc11.pdf, 4.2, Table 15) */ +#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02U + +/* Communication interface class subclass codes */ +/* (usbcdc11.pdf, 4.3, Table 16) */ +#define CDC_SUBCLASS_NONE 0x00 /* Reserved */ +#define CDC_SUBCLASS_DLC 0x01 /* Direct Line Control Model */ +#define CDC_SUBCLASS_ACM 0x02 /* Abstract Control Model */ +#define CDC_SUBCLASS_TCM 0x03 /* Telephone Control Model */ +#define CDC_SUBCLASS_MCM 0x04 /* Multi-Channel Control Model */ +#define CDC_SUBCLASS_CAPI 0x05 /* CAPI Control Model */ +#define CDC_SUBCLASS_ECM 0x06 /* Ethernet Networking Control Model */ +#define CDC_SUBCLASS_ATM 0x07 /* ATM Networking Control Model */ + /* 0x08-0x0d Reserved (future use) */ +#define CDC_SUBCLASS_MBIM 0x0e /* MBIM Control Model */ + /* 0x0f-0x7f Reserved (future use) */ + /* 0x80-0xfe Reserved (vendor specific) */ + +#define CDC_DIRECT_LINE_CONTROL_MODEL 0x01U +#define CDC_ABSTRACT_CONTROL_MODEL 0x02U +#define CDC_TELEPHONE_CONTROL_MODEL 0x03U +#define CDC_MULTI_CHANNEL_CONTROL_MODEL 0x04U +#define CDC_CAPI_CONTROL_MODEL 0x05U +#define CDC_ETHERNET_NETWORKING_CONTROL_MODEL 0x06U +#define CDC_ATM_NETWORKING_CONTROL_MODEL 0x07U +#define CDC_WIRELESS_HANDSET_CONTROL_MODEL 0x08U +#define CDC_DEVICE_MANAGEMENT 0x09U +#define CDC_MOBILE_DIRECT_LINE_MODEL 0x0AU +#define CDC_OBEX 0x0BU +#define CDC_ETHERNET_EMULATION_MODEL 0x0CU +#define CDC_NETWORK_CONTROL_MODEL 0x0DU + +/* Communication interface class control protocol codes */ +/* (usbcdc11.pdf, 4.4, Table 17) */ +#define CDC_COMMON_PROTOCOL_NONE 0x00U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS 0x01U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101 0x02U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101_AND_ANNEXO 0x03U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_GSM_707 0x04U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_3GPP_27007 0x05U +#define CDC_COMMON_PROTOCOL_AT_COMMANDS_CDMA 0x06U +#define CDC_COMMON_PROTOCOL_ETHERNET_EMULATION_MODEL 0x07U +// NCM Communication Interface Protocol Codes +// (usbncm10.pdf, 4.2, Table 4-2) +#define CDC_NCM_PROTOCOL_NONE 0x00U +#define CDC_NCM_PROTOCOL_OEM 0xFEU + +/* Data interface class code */ +/* (usbcdc11.pdf, 4.5, Table 18) */ +#define CDC_DATA_INTERFACE_CLASS 0x0A + +/* Data Interface Sub-Class Codes ********************************************/ +#define CDC_DATA_SUBCLASS_NONE 0x00 + +/* Data interface class protocol codes */ +/* (usbcdc11.pdf, 4.7, Table 19) */ +#define CDC_DATA_PROTOCOL_ISDN_BRI 0x30 +#define CDC_DATA_PROTOCOL_HDLC 0x31 +#define CDC_DATA_PROTOCOL_TRANSPARENT 0x32 +#define CDC_DATA_PROTOCOL_Q921_MANAGEMENT 0x50 +#define CDC_DATA_PROTOCOL_Q921_DATA_LINK 0x51 +#define CDC_DATA_PROTOCOL_Q921_MULTIPLEXOR 0x52 +#define CDC_DATA_PROTOCOL_V42 0x90 +#define CDC_DATA_PROTOCOL_EURO_ISDN 0x91 +#define CDC_DATA_PROTOCOL_V24_RATE_ADAPTATION 0x92 +#define CDC_DATA_PROTOCOL_CAPI 0x93 +#define CDC_DATA_PROTOCOL_HOST_BASED_DRIVER 0xFD +#define CDC_DATA_PROTOCOL_DESCRIBED_IN_PUFD 0xFE + +/* Type values for bDescriptorType field of functional descriptors */ +/* (usbcdc11.pdf, 5.2.3, Table 24) */ +#define CDC_CS_INTERFACE 0x24 +#define CDC_CS_ENDPOINT 0x25 + +/* Type values for bDescriptorSubtype field of functional descriptors */ +/* (usbcdc11.pdf, 5.2.3, Table 25) */ +#define CDC_FUNC_DESC_HEADER 0x00 +#define CDC_FUNC_DESC_CALL_MANAGEMENT 0x01 +#define CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT 0x02 +#define CDC_FUNC_DESC_DIRECT_LINE_MANAGEMENT 0x03 +#define CDC_FUNC_DESC_TELEPHONE_RINGER 0x04 +#define CDC_FUNC_DESC_REPORTING_CAPABILITIES 0x05 +#define CDC_FUNC_DESC_UNION 0x06 +#define CDC_FUNC_DESC_COUNTRY_SELECTION 0x07 +#define CDC_FUNC_DESC_TELEPHONE_OPERATIONAL_MODES 0x08 +#define CDC_FUNC_DESC_USB_TERMINAL 0x09 +#define CDC_FUNC_DESC_NETWORK_CHANNEL 0x0A +#define CDC_FUNC_DESC_PROTOCOL_UNIT 0x0B +#define CDC_FUNC_DESC_EXTENSION_UNIT 0x0C +#define CDC_FUNC_DESC_MULTI_CHANNEL_MANAGEMENT 0x0D +#define CDC_FUNC_DESC_CAPI_CONTROL_MANAGEMENT 0x0E +#define CDC_FUNC_DESC_ETHERNET_NETWORKING 0x0F +#define CDC_FUNC_DESC_ATM_NETWORKING 0x10 +#define CDC_FUNC_DESC_WIRELESS_HANDSET_CONTROL_MODEL 0x11 +#define CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL 0x12 +#define CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL_DETAIL 0x13 +#define CDC_FUNC_DESC_DEVICE_MANAGEMENT_MODEL 0x14 +#define CDC_FUNC_DESC_OBEX 0x15 +#define CDC_FUNC_DESC_COMMAND_SET 0x16 +#define CDC_FUNC_DESC_COMMAND_SET_DETAIL 0x17 +#define CDC_FUNC_DESC_TELEPHONE_CONTROL_MODEL 0x18 +#define CDC_FUNC_DESC_OBEX_SERVICE_IDENTIFIER 0x19 +#define CDC_FUNC_DESC_NCM 0x1A + +/* CDC class-specific request codes */ +/* (usbcdc11.pdf, 6.2, Table 46) */ +/* see Table 45 for info about the specific requests. */ +#define CDC_REQUEST_SEND_ENCAPSULATED_COMMAND 0x00 +#define CDC_REQUEST_GET_ENCAPSULATED_RESPONSE 0x01 +#define CDC_REQUEST_SET_COMM_FEATURE 0x02 +#define CDC_REQUEST_GET_COMM_FEATURE 0x03 +#define CDC_REQUEST_CLEAR_COMM_FEATURE 0x04 +#define CDC_REQUEST_SET_AUX_LINE_STATE 0x10 +#define CDC_REQUEST_SET_HOOK_STATE 0x11 +#define CDC_REQUEST_PULSE_SETUP 0x12 +#define CDC_REQUEST_SEND_PULSE 0x13 +#define CDC_REQUEST_SET_PULSE_TIME 0x14 +#define CDC_REQUEST_RING_AUX_JACK 0x15 +#define CDC_REQUEST_SET_LINE_CODING 0x20 +#define CDC_REQUEST_GET_LINE_CODING 0x21 +#define CDC_REQUEST_SET_CONTROL_LINE_STATE 0x22 +#define CDC_REQUEST_SEND_BREAK 0x23 +#define CDC_REQUEST_SET_RINGER_PARMS 0x30 +#define CDC_REQUEST_GET_RINGER_PARMS 0x31 +#define CDC_REQUEST_SET_OPERATION_PARMS 0x32 +#define CDC_REQUEST_GET_OPERATION_PARMS 0x33 +#define CDC_REQUEST_SET_LINE_PARMS 0x34 +#define CDC_REQUEST_GET_LINE_PARMS 0x35 +#define CDC_REQUEST_DIAL_DIGITS 0x36 +#define CDC_REQUEST_SET_UNIT_PARAMETER 0x37 +#define CDC_REQUEST_GET_UNIT_PARAMETER 0x38 +#define CDC_REQUEST_CLEAR_UNIT_PARAMETER 0x39 +#define CDC_REQUEST_GET_PROFILE 0x3A +#define CDC_REQUEST_SET_ETHERNET_MULTICAST_FILTERS 0x40 +#define CDC_REQUEST_SET_ETHERNET_PMP_FILTER 0x41 +#define CDC_REQUEST_GET_ETHERNET_PMP_FILTER 0x42 +#define CDC_REQUEST_SET_ETHERNET_PACKET_FILTER 0x43 +#define CDC_REQUEST_GET_ETHERNET_STATISTIC 0x44 +#define CDC_REQUEST_SET_ATM_DATA_FORMAT 0x50 +#define CDC_REQUEST_GET_ATM_DEVICE_STATISTICS 0x51 +#define CDC_REQUEST_SET_ATM_DEFAULT_VC 0x52 +#define CDC_REQUEST_GET_ATM_VC_STATISTICS 0x53 +#define CDC_REQUEST_GET_NTB_PARAMETERS 0x80 +#define CDC_REQUEST_GET_NET_ADDRESS 0x81 +#define CDC_REQUEST_SET_NET_ADDRESS 0x82 +#define CDC_REQUEST_GET_NTB_FORMAT 0x83 +#define CDC_REQUEST_SET_NTB_FORMAT 0x84 +#define CDC_REQUEST_GET_NTB_INPUT_SIZE 0x85 +#define CDC_REQUEST_SET_NTB_INPUT_SIZE 0x86 +#define CDC_REQUEST_GET_MAX_DATAGRAM_SIZE 0x87 +#define CDC_REQUEST_SET_MAX_DATAGRAM_SIZE 0x88 +#define CDC_REQUEST_GET_CRC_MODE 0x89 +#define CDC_REQUEST_SET_CRC_MODE 0x90 + +/* Communication feature selector codes */ +/* (usbcdc11.pdf, 6.2.2..6.2.4, Table 47) */ +#define CDC_ABSTRACT_STATE 0x01 +#define CDC_COUNTRY_SETTING 0x02 + +/** Control Signal Bitmap Values for SetControlLineState */ +#define SET_CONTROL_LINE_STATE_RTS 0x02 +#define SET_CONTROL_LINE_STATE_DTR 0x01 + +/* Feature Status returned for ABSTRACT_STATE Selector */ +/* (usbcdc11.pdf, 6.2.3, Table 48) */ +#define CDC_IDLE_SETTING (1 << 0) +#define CDC_DATA_MULTPLEXED_STATE (1 << 1) + +/* Control signal bitmap values for the SetControlLineState request */ +/* (usbcdc11.pdf, 6.2.14, Table 51) */ +#define CDC_DTE_PRESENT (1 << 0) +#define CDC_ACTIVATE_CARRIER (1 << 1) + +/* CDC class-specific notification codes */ +/* (usbcdc11.pdf, 6.3, Table 68) */ +/* see Table 67 for Info about class-specific notifications */ +#define CDC_NOTIFICATION_NETWORK_CONNECTION 0x00 +#define CDC_RESPONSE_AVAILABLE 0x01 +#define CDC_AUX_JACK_HOOK_STATE 0x08 +#define CDC_RING_DETECT 0x09 +#define CDC_NOTIFICATION_SERIAL_STATE 0x20 +#define CDC_CALL_STATE_CHANGE 0x28 +#define CDC_LINE_STATE_CHANGE 0x29 +#define CDC_CONNECTION_SPEED_CHANGE 0x2A + +/* UART state bitmap values (Serial state notification). */ +/* (usbcdc11.pdf, 6.3.5, Table 69) */ +#define CDC_SERIAL_STATE_OVERRUN (1 << 6) /* receive data overrun error has occurred */ +#define CDC_SERIAL_STATE_OVERRUN_Pos (6) +#define CDC_SERIAL_STATE_OVERRUN_Msk (1 << CDC_SERIAL_STATE_OVERRUN_Pos) +#define CDC_SERIAL_STATE_PARITY (1 << 5) /* parity error has occurred */ +#define CDC_SERIAL_STATE_PARITY_Pos (5) +#define CDC_SERIAL_STATE_PARITY_Msk (1 << CDC_SERIAL_STATE_PARITY_Pos) +#define CDC_SERIAL_STATE_FRAMING (1 << 4) /* framing error has occurred */ +#define CDC_SERIAL_STATE_FRAMING_Pos (4) +#define CDC_SERIAL_STATE_FRAMING_Msk (1 << CDC_SERIAL_STATE_FRAMING_Pos) +#define CDC_SERIAL_STATE_RING (1 << 3) /* state of ring signal detection */ +#define CDC_SERIAL_STATE_RING_Pos (3) +#define CDC_SERIAL_STATE_RING_Msk (1 << CDC_SERIAL_STATE_RING_Pos) +#define CDC_SERIAL_STATE_BREAK (1 << 2) /* state of break detection */ +#define CDC_SERIAL_STATE_BREAK_Pos (2) +#define CDC_SERIAL_STATE_BREAK_Msk (1 << CDC_SERIAL_STATE_BREAK_Pos) +#define CDC_SERIAL_STATE_TX_CARRIER (1 << 1) /* state of transmission carrier */ +#define CDC_SERIAL_STATE_TX_CARRIER_Pos (1) +#define CDC_SERIAL_STATE_TX_CARRIER_Msk (1 << CDC_SERIAL_STATE_TX_CARRIER_Pos) +#define CDC_SERIAL_STATE_RX_CARRIER (1 << 0) /* state of receiver carrier */ +#define CDC_SERIAL_STATE_RX_CARRIER_Pos (0) +#define CDC_SERIAL_STATE_RX_CARRIER_Msk (1 << CDC_SERIAL_STATE_RX_CARRIER_Pos) + +#define CDC_ECM_XMIT_OK (1 << 0) +#define CDC_ECM_RVC_OK (1 << 1) +#define CDC_ECM_XMIT_ERROR (1 << 2) +#define CDC_ECM_RCV_ERROR (1 << 3) +#define CDC_ECM_RCV_NO_BUFFER (1 << 4) +#define CDC_ECM_DIRECTED_BYTES_XMIT (1 << 5) +#define CDC_ECM_DIRECTED_FRAMES_XMIT (1 << 6) +#define CDC_ECM_MULTICAST_BYTES_XMIT (1 << 7) +#define CDC_ECM_MULTICAST_FRAMES_XMIT (1 << 8) +#define CDC_ECM_BROADCAST_BYTES_XMIT (1 << 9) +#define CDC_ECM_BROADCAST_FRAMES_XMIT (1 << 10) +#define CDC_ECM_DIRECTED_BYTES_RCV (1 << 11) +#define CDC_ECM_DIRECTED_FRAMES_RCV (1 << 12) +#define CDC_ECM_MULTICAST_BYTES_RCV (1 << 13) +#define CDC_ECM_MULTICAST_FRAMES_RCV (1 << 14) +#define CDC_ECM_BROADCAST_BYTES_RCV (1 << 15) +#define CDC_ECM_BROADCAST_FRAMES_RCV (1 << 16) +#define CDC_ECM_RCV_CRC_ERROR (1 << 17) +#define CDC_ECM_TRANSMIT_QUEUE_LENGTH (1 << 18) +#define CDC_ECM_RCV_ERROR_ALIGNMENT (1 << 19) +#define CDC_ECM_XMIT_ONE_COLLISION (1 << 20) +#define CDC_ECM_XMIT_MORE_COLLISIONS (1 << 21) +#define CDC_ECM_XMIT_DEFERRED (1 << 22) +#define CDC_ECM_XMIT_MAX_COLLISIONS (1 << 23) +#define CDC_ECM_RCV_OVERRUN (1 << 24) +#define CDC_ECM_XMIT_UNDERRUN (1 << 25) +#define CDC_ECM_XMIT_HEARTBEAT_FAILURE (1 << 26) +#define CDC_ECM_XMIT_TIMES_CRS_LOST (1 << 27) +#define CDC_ECM_XMIT_LATE_COLLISIONS (1 << 28) + +#define CDC_ECM_MAC_STR_DESC (uint8_t *)"010202030000" +#define CDC_ECM_MAC_ADDR0 0x00U /* 01 */ +#define CDC_ECM_MAC_ADDR1 0x02U /* 02 */ +#define CDC_ECM_MAC_ADDR2 0x02U /* 03 */ +#define CDC_ECM_MAC_ADDR3 0x03U /* 00 */ +#define CDC_ECM_MAC_ADDR4 0x00U /* 00 */ +#define CDC_ECM_MAC_ADDR5 0x00U /* 00 */ + +#define CDC_ECM_NET_DISCONNECTED 0x00U +#define CDC_ECM_NET_CONNECTED 0x01U + +#define CDC_ECM_ETH_STATS_RESERVED 0xE0U +#define CDC_ECM_BMREQUEST_TYPE_ECM 0xA1U + +#define CDC_ECM_CONNECT_SPEED_UPSTREAM 0x004C4B40U /* 5Mbps */ +#define CDC_ECM_CONNECT_SPEED_DOWNSTREAM 0x004C4B40U /* 5Mbps */ + +#define CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION 0x00 +#define CDC_ECM_NOTIFY_CODE_RESPONSE_AVAILABLE 0x01 +#define CDC_ECM_NOTIFY_CODE_CONNECTION_SPEED_CHANGE 0x2A + +#define CDC_NCM_NTH16_SIGNATURE 0x484D434E +#define CDC_NCM_NDP16_SIGNATURE_NCM0 0x304D434E +#define CDC_NCM_NDP16_SIGNATURE_NCM1 0x314D434E + +/*------------------------------------------------------------------------------ + * Structures based on usbcdc11.pdf (www.usb.org) + *----------------------------------------------------------------------------*/ + +/* Header functional descriptor */ +/* (usbcdc11.pdf, 5.2.3.1) */ +/* This header must precede any list of class-specific descriptors. */ +struct cdc_header_descriptor { + uint8_t bFunctionLength; /* size of this descriptor in bytes */ + uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ + uint8_t bDescriptorSubtype; /* Header functional descriptor subtype */ + uint16_t bcdCDC; /* USB CDC specification release version */ +} __PACKED; + +/* Call management functional descriptor */ +/* (usbcdc11.pdf, 5.2.3.2) */ +/* Describes the processing of calls for the communication class interface. */ +struct cdc_call_management_descriptor { + uint8_t bFunctionLength; /* size of this descriptor in bytes */ + uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ + uint8_t bDescriptorSubtype; /* call management functional descriptor subtype */ + uint8_t bmCapabilities; /* capabilities that this configuration supports */ + uint8_t bDataInterface; /* interface number of the data class interface used for call management (optional) */ +} __PACKED; + +/* Abstract control management functional descriptor */ +/* (usbcdc11.pdf, 5.2.3.3) */ +/* Describes the command supported by the communication interface class with the Abstract Control Model subclass code. */ +struct cdc_abstract_control_management_descriptor { + uint8_t bFunctionLength; /* size of this descriptor in bytes */ + uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ + uint8_t bDescriptorSubtype; /* abstract control management functional descriptor subtype */ + uint8_t bmCapabilities; /* capabilities supported by this configuration */ +} __PACKED; + +/* Union functional descriptors */ +/* (usbcdc11.pdf, 5.2.3.8) */ +/* Describes the relationship between a group of interfaces that can be considered to form a functional unit. */ +struct cdc_union_descriptor { + uint8_t bFunctionLength; /* size of this descriptor in bytes */ + uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */ + uint8_t bDescriptorSubtype; /* union functional descriptor subtype */ + uint8_t bMasterInterface; /* interface number designated as master */ +} __PACKED; + +/* Union functional descriptors with one slave interface */ +/* (usbcdc11.pdf, 5.2.3.8) */ +struct cdc_union_1slave_descriptor { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bControlInterface; + uint8_t bSubordinateInterface0; +} __PACKED; + +/* Line coding structure for GET_LINE_CODING / SET_LINE_CODING class requests*/ +/* Format of the data returned when a GetLineCoding request is received */ +/* (usbcdc11.pdf, 6.2.13) */ +struct cdc_line_coding { + uint32_t dwDTERate; /* Data terminal rate in bits per second */ + uint8_t bCharFormat; /* Number of stop bits */ + uint8_t bParityType; /* Parity bit type */ + uint8_t bDataBits; /* Number of data bits */ +} __PACKED; + +/** Data structure for the notification about SerialState */ +struct cdc_acm_notification { + uint8_t bmRequestType; + uint8_t bNotificationType; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; + uint16_t data; +} __PACKED; + +/** Ethernet Networking Functional Descriptor */ +struct cdc_eth_descriptor { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t iMACAddress; + uint32_t bmEthernetStatistics; + uint16_t wMaxSegmentSize; + uint16_t wNumberMCFilters; + uint8_t bNumberPowerFilters; +} __PACKED; + +struct cdc_eth_notification { + uint8_t bmRequestType; + uint8_t bNotificationType; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; + uint8_t data[8]; +} __PACKED; + +struct cdc_ncm_ntb_parameters { + uint16_t wLength; + uint16_t bmNtbFormatsSupported; + uint32_t dwNtbInMaxSize; + uint16_t wNdbInDivisor; + uint16_t wNdbInPayloadRemainder; + uint16_t wNdbInAlignment; + uint16_t wReserved; + uint32_t dwNtbOutMaxSize; + uint16_t wNdbOutDivisor; + uint16_t wNdbOutPayloadRemainder; + uint16_t wNdbOutAlignment; + uint16_t wNtbOutMaxDatagrams; +}; + +struct cdc_ncm_nth16 { + uint32_t dwSignature; + uint16_t wHeaderLength; + uint16_t wSequence; + uint16_t wBlockLength; + uint16_t wNdpIndex; +}; + +struct cdc_ncm_ndp16_datagram { + uint16_t wDatagramIndex; + uint16_t wDatagramLength; +}; + +struct cdc_ncm_ndp16 { + uint32_t dwSignature; + uint16_t wLength; + uint16_t wNextNdpIndex; + struct cdc_ncm_ndp16_datagram datagram[]; +}; + +/*Length of template descriptor: 66 bytes*/ +#define CDC_ACM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 4 + 5 + 7 + 9 + 7 + 7) +// clang-format off +#define CDC_ACM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, str_idx) \ + /* Interface Associate */ \ + 0x08, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ + bFirstInterface, /* bFirstInterface */ \ + 0x02, /* bInterfaceCount */ \ + USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \ + CDC_ABSTRACT_CONTROL_MODEL, /* bFunctionSubClass */ \ + CDC_COMMON_PROTOCOL_NONE, /* bFunctionProtocol */ \ + 0x00, /* iFunction */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \ + CDC_ABSTRACT_CONTROL_MODEL, /* bInterfaceSubClass */ \ + CDC_COMMON_PROTOCOL_NONE, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \ + WBVAL(CDC_V1_10), /* bcdCDC */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_CALL_MANAGEMENT, /* bDescriptorSubtype */ \ + 0x00, /* bmCapabilities */ \ + (uint8_t)(bFirstInterface + 1), /* bDataInterface */ \ + 0x04, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype */ \ + 0x02, /* bmCapabilities */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \ + bFirstInterface, /* bMasterInterface */ \ + (uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + int_ep, /* bEndpointAddress */ \ + 0x03, /* bmAttributes */ \ + 0x08, 0x00, /* wMaxPacketSize */ \ + 0x0a, /* bInterval */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + (uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \ + 0x00, /* bInterfaceSubClass */ \ + 0x00, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00 /* bInterval */ +// clang-format on + +/*Length of template descriptor: 66 bytes*/ +#define CDC_RNDIS_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 4 + 5 + 7 + 9 + 7 + 7) +// clang-format off +#define CDC_RNDIS_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, str_idx) \ + /* Interface Associate */ \ + 0x08, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ + bFirstInterface, /* bFirstInterface */ \ + 0x02, /* bInterfaceCount */ \ + USB_DEVICE_CLASS_WIRELESS, /* bFunctionClass */ \ + 0x01, /* bFunctionSubClass */ \ + 0x03, /* bFunctionProtocol */ \ + 0x00, /* iFunction */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_WIRELESS, /* bInterfaceClass */ \ + 0x01, /* bInterfaceSubClass */ \ + 0x03, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \ + WBVAL(CDC_V1_10), /* bcdCDC */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_CALL_MANAGEMENT, /* bDescriptorSubtype */ \ + 0x00, /* bmCapabilities */ \ + (uint8_t)(bFirstInterface + 1), /* bDataInterface */ \ + 0x04, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype */ \ + 0x00, /* bmCapabilities */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \ + bFirstInterface, /* bMasterInterface */ \ + (uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + int_ep, /* bEndpointAddress */ \ + 0x03, /* bmAttributes */ \ + 0x08, 0x00, /* wMaxPacketSize */ \ + 0x05, /* bInterval */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + (uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \ + 0x00, /* bInterfaceSubClass */ \ + 0x00, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00 /* bInterval */ +// clang-format on + +#define DBVAL_BE(x) ((x >> 24) & 0xFF), ((x >> 16) & 0xFF), ((x >> 8) & 0xFF), (x & 0xFF) + +/*Length of template descriptor: 71 bytes*/ +#define CDC_ECM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 13 + 7 + 9 + 7 + 7) +// clang-format off +#define CDC_ECM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, str_idx) \ + /* Interface Associate */ \ + 0x08, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ + bFirstInterface, /* bFirstInterface */ \ + 0x02, /* bInterfaceCount */ \ + USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \ + CDC_ETHERNET_NETWORKING_CONTROL_MODEL, /* bFunctionSubClass */ \ + CDC_COMMON_PROTOCOL_NONE, /* bFunctionProtocol */ \ + 0x00, /* iFunction */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \ + CDC_ETHERNET_NETWORKING_CONTROL_MODEL, /* bInterfaceSubClass */ \ + CDC_COMMON_PROTOCOL_NONE, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \ + WBVAL(CDC_V1_10), /* bcdCDC */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \ + bFirstInterface, /* bMasterInterface */ \ + (uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \ + /* CDC_ECM Functional Descriptor */ \ + 0x0D, /* bFunctionLength */\ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */\ + CDC_FUNC_DESC_ETHERNET_NETWORKING, /* Ethernet Networking functional descriptor subtype */\ + str_idx, /* Device's MAC string index */\ + DBVAL_BE(0x00000000), /* Ethernet statistics (bitmap) */\ + WBVAL(1514), /* wMaxSegmentSize: Ethernet Maximum Segment size, typically 1514 bytes */\ + WBVAL(0), /* wNumberMCFilters: the number of multicast filters */ \ + 0, /* bNumberPowerFilters: the number of wakeup power filters */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + int_ep, /* bEndpointAddress */ \ + 0x03, /* bmAttributes */ \ + 0x10, 0x00, /* wMaxPacketSize */ \ + 0x05, /* bInterval */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + (uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \ + 0x00, /* bInterfaceSubClass */ \ + 0x00, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00 /* bInterval */ +// clang-format on + +/*Length of template descriptor: 77 bytes*/ +#define CDC_NCM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 13 + 6 + 7 + 9 + 7 + 7) +// clang-format off +#define CDC_NCM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, str_idx) \ + /* Interface Associate */ \ + 0x08, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ + bFirstInterface, /* bFirstInterface */ \ + 0x02, /* bInterfaceCount */ \ + USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \ + CDC_NETWORK_CONTROL_MODEL, /* bFunctionSubClass */ \ + CDC_COMMON_PROTOCOL_NONE, /* bFunctionProtocol */ \ + 0x00, /* iFunction */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \ + CDC_NETWORK_CONTROL_MODEL, /* bInterfaceSubClass */ \ + CDC_COMMON_PROTOCOL_NONE, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \ + WBVAL(CDC_V1_10), /* bcdCDC */ \ + 0x05, /* bLength */ \ + CDC_CS_INTERFACE, /* bDescriptorType */ \ + CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \ + bFirstInterface, /* bMasterInterface */ \ + (uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \ + /* CDC ETH Functional Descriptor */ \ + 0x0D, /* bFunctionLength */\ + CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */\ + CDC_FUNC_DESC_ETHERNET_NETWORKING, /* Ethernet Networking functional descriptor subtype */\ + str_idx, /* Device's MAC string index */\ + DBVAL_BE(0x00000000), /* Ethernet statistics (bitmap) */\ + WBVAL(1514), /* wMaxSegmentSize: Ethernet Maximum Segment size, typically 1514 bytes */\ + WBVAL(0), /* wNumberMCFilters: the number of multicast filters */ \ + 0, /* bNumberPowerFilters: the number of wakeup power filters */ \ + 0x06, \ + CDC_CS_INTERFACE, \ + CDC_FUNC_DESC_NCM, \ + 0x00, 0x01, \ + 0x23, \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + int_ep, /* bEndpointAddress */ \ + 0x03, /* bmAttributes */ \ + 0x10, 0x00, /* wMaxPacketSize */ \ + 0x10, /* bInterval */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + (uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \ + 0x00, /* bInterfaceSubClass */ \ + 0x00, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00 /* bInterval */ +// clang-format on + +#endif /* USB_CDC_H */ diff --git a/src/lib/CherryUSB/class/cdc/usbd_cdc.h b/src/lib/CherryUSB/class/cdc/usbd_cdc.h new file mode 100644 index 000000000..2cf3df1a3 --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbd_cdc.h @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_CDC_H +#define USBD_CDC_H + +// legacy for old version + +#include "usbd_cdc_acm.h" + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/class/cdc/usbd_cdc_acm.c b/src/lib/CherryUSB/class/cdc/usbd_cdc_acm.c new file mode 100644 index 000000000..a2fb87b65 --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbd_cdc_acm.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_cdc_acm.h" + +const char *stop_name[] = { "1", "1.5", "2" }; +const char *parity_name[] = { "N", "O", "E", "M", "S" }; + +static int cdc_acm_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USB_LOG_DBG("CDC Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + struct cdc_line_coding line_coding; + bool dtr, rts; + uint8_t intf_num = LO_BYTE(setup->wIndex); + + switch (setup->bRequest) { + case CDC_REQUEST_SET_LINE_CODING: + + /*******************************************************************************/ + /* Line Coding Structure */ + /*-----------------------------------------------------------------------------*/ + /* Offset | Field | Size | Value | Description */ + /* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/ + /* 4 | bCharFormat | 1 | Number | Stop bits */ + /* 0 - 1 Stop bit */ + /* 1 - 1.5 Stop bits */ + /* 2 - 2 Stop bits */ + /* 5 | bParityType | 1 | Number | Parity */ + /* 0 - None */ + /* 1 - Odd */ + /* 2 - Even */ + /* 3 - Mark */ + /* 4 - Space */ + /* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */ + /*******************************************************************************/ + memcpy(&line_coding, *data, setup->wLength); + USB_LOG_DBG("Set intf:%d linecoding <%d %d %s %s>\r\n", + intf_num, + (unsigned int)line_coding.dwDTERate, + line_coding.bDataBits, + parity_name[line_coding.bParityType], + stop_name[line_coding.bCharFormat]); + + usbd_cdc_acm_set_line_coding(busid, intf_num, &line_coding); + break; + + case CDC_REQUEST_SET_CONTROL_LINE_STATE: + dtr = (setup->wValue & 0x0001); + rts = (setup->wValue & 0x0002); + USB_LOG_DBG("Set intf:%d DTR 0x%x,RTS 0x%x\r\n", + intf_num, + dtr, + rts); + usbd_cdc_acm_set_dtr(busid, intf_num, dtr); + usbd_cdc_acm_set_rts(busid, intf_num, rts); + break; + + case CDC_REQUEST_GET_LINE_CODING: + usbd_cdc_acm_get_line_coding(busid, intf_num, &line_coding); + memcpy(*data, &line_coding, 7); + *len = 7; + USB_LOG_DBG("Get intf:%d linecoding %d %d %d %d\r\n", + intf_num, + (unsigned int)line_coding.dwDTERate, + line_coding.bCharFormat, + line_coding.bParityType, + line_coding.bDataBits); + break; + case CDC_REQUEST_SEND_BREAK: + usbd_cdc_acm_send_break(busid, intf_num); + break; + default: + USB_LOG_WRN("Unhandled CDC Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + return 0; +} + +struct usbd_interface *usbd_cdc_acm_init_intf(uint8_t busid, struct usbd_interface *intf) +{ + (void)busid; + + intf->class_interface_handler = cdc_acm_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = NULL; + + return intf; +} + +__WEAK void usbd_cdc_acm_set_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding) +{ + (void)busid; + (void)intf; + (void)line_coding; +} + +__WEAK void usbd_cdc_acm_get_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding) +{ + (void)busid; + (void)intf; + + line_coding->dwDTERate = 2000000; + line_coding->bDataBits = 8; + line_coding->bParityType = 0; + line_coding->bCharFormat = 0; +} + +__WEAK void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) +{ + (void)busid; + (void)intf; + (void)dtr; +} + +__WEAK void usbd_cdc_acm_set_rts(uint8_t busid, uint8_t intf, bool rts) +{ + (void)busid; + (void)intf; + (void)rts; +} + +__WEAK void usbd_cdc_acm_send_break(uint8_t busid, uint8_t intf) +{ + (void)busid; + (void)intf; +} diff --git a/src/lib/CherryUSB/class/cdc/usbd_cdc_acm.h b/src/lib/CherryUSB/class/cdc/usbd_cdc_acm.h new file mode 100644 index 000000000..662c238c8 --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbd_cdc_acm.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_CDC_ACM_H +#define USBD_CDC_ACM_H + +#include "usb_cdc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Init cdc acm interface driver */ +struct usbd_interface *usbd_cdc_acm_init_intf(uint8_t busid, struct usbd_interface *intf); + +/* Setup request command callback api */ +void usbd_cdc_acm_set_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding); +void usbd_cdc_acm_get_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding); +void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr); +void usbd_cdc_acm_set_rts(uint8_t busid, uint8_t intf, bool rts); +void usbd_cdc_acm_send_break(uint8_t busid, uint8_t intf); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_CDC_ACM_H */ diff --git a/src/lib/CherryUSB/class/cdc/usbd_cdc_ecm.c b/src/lib/CherryUSB/class/cdc/usbd_cdc_ecm.c new file mode 100644 index 000000000..2a4b77724 --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbd_cdc_ecm.c @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2023, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_cdc_ecm.h" + +#define CDC_ECM_OUT_EP_IDX 0 +#define CDC_ECM_IN_EP_IDX 1 +#define CDC_ECM_INT_EP_IDX 2 + +/* Ethernet Maximum Segment size, typically 1514 bytes */ +#define CONFIG_CDC_ECM_ETH_MAX_SEGSZE 1536U + +/* Describe EndPoints configuration */ +static struct usbd_endpoint cdc_ecm_ep_data[3]; + +#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_rx_buffer[USB_ALIGN_UP(CONFIG_CDC_ECM_ETH_MAX_SEGSZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_tx_buffer[USB_ALIGN_UP(CONFIG_CDC_ECM_ETH_MAX_SEGSZE, CONFIG_USB_ALIGN_SIZE)]; +#endif +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_notify_buf[USB_ALIGN_UP(16, CONFIG_USB_ALIGN_SIZE)]; + +volatile uint32_t g_cdc_ecm_rx_data_length = 0; +volatile uint32_t g_cdc_ecm_tx_data_length = 0; + +static volatile uint8_t g_current_net_status = 0; +static volatile uint8_t g_cmd_intf = 0; + +static uint32_t g_connect_speed_table[2] = { CDC_ECM_CONNECT_SPEED_UPSTREAM, + CDC_ECM_CONNECT_SPEED_DOWNSTREAM }; + +void usbd_cdc_ecm_send_notify(uint8_t notifycode, uint8_t value, uint32_t *speed) +{ + struct cdc_eth_notification *notify = (struct cdc_eth_notification *)g_cdc_ecm_notify_buf; + uint8_t bytes2send = 0; + + notify->bmRequestType = CDC_ECM_BMREQUEST_TYPE_ECM; + notify->bNotificationType = notifycode; + + switch (notifycode) { + case CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION: + notify->wValue = value; + notify->wIndex = g_cmd_intf; + notify->wLength = 0U; + + for (uint8_t i = 0U; i < 8U; i++) { + notify->data[i] = 0U; + } + bytes2send = 8U; + break; + case CDC_ECM_NOTIFY_CODE_RESPONSE_AVAILABLE: + notify->wValue = 0U; + notify->wIndex = g_cmd_intf; + notify->wLength = 0U; + for (uint8_t i = 0U; i < 8U; i++) { + notify->data[i] = 0U; + } + bytes2send = 8U; + break; + case CDC_ECM_NOTIFY_CODE_CONNECTION_SPEED_CHANGE: + notify->wValue = 0U; + notify->wIndex = g_cmd_intf; + notify->wLength = 0x0008U; + bytes2send = 16U; + + memcpy(notify->data, speed, 8); + break; + + default: + break; + } + + if (usb_device_is_configured(0)) { + if (bytes2send) { + usbd_ep_start_write(0, cdc_ecm_ep_data[CDC_ECM_INT_EP_IDX].ep_addr, g_cdc_ecm_notify_buf, bytes2send); + } + } +} + +static int cdc_ecm_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USB_LOG_DBG("CDC ECM Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + (void)busid; + (void)data; + (void)len; + + g_cmd_intf = LO_BYTE(setup->wIndex); + + switch (setup->bRequest) { + case CDC_REQUEST_SET_ETHERNET_PACKET_FILTER: + /* bit0 Promiscuous + * bit1 ALL Multicast + * bit2 Directed + * bit3 Broadcast + * bit4 Multicast + */ +#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP + g_connect_speed_table[0] = 100000000; /* 100 Mbps */ + g_connect_speed_table[1] = 100000000; /* 100 Mbps */ + usbd_cdc_ecm_set_connect(true, g_connect_speed_table); +#endif + break; + default: + USB_LOG_WRN("Unhandled CDC ECM Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + return 0; +} + +void cdc_ecm_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + (void)busid; + (void)arg; + + switch (event) { + case USBD_EVENT_RESET: + g_current_net_status = 0; + g_cdc_ecm_rx_data_length = 0; + g_cdc_ecm_tx_data_length = 0; + break; + case USBD_EVENT_CONFIGURED: +#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP + usbd_cdc_ecm_start_read(g_cdc_ecm_rx_buffer, CONFIG_CDC_ECM_ETH_MAX_SEGSZE); +#endif + break; + + default: + break; + } +} + +void cdc_ecm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + + g_cdc_ecm_rx_data_length = nbytes; + usbd_cdc_ecm_data_recv_done(g_cdc_ecm_rx_data_length); +} + +void cdc_ecm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + + if ((nbytes % usbd_get_ep_mps(0, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(0, ep, NULL, 0); + } else { + usbd_cdc_ecm_data_send_done(g_cdc_ecm_tx_data_length); + g_cdc_ecm_tx_data_length = 0; + } +} + +void cdc_ecm_int_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + (void)ep; + (void)nbytes; + + if (g_current_net_status == 2) { + g_current_net_status = 3; + usbd_cdc_ecm_send_notify(CDC_ECM_NOTIFY_CODE_CONNECTION_SPEED_CHANGE, 0, g_connect_speed_table); + } else { + g_current_net_status = 0; + } +} + +int usbd_cdc_ecm_start_write(uint8_t *buf, uint32_t len) +{ + if (!usb_device_is_configured(0)) { + return -USB_ERR_NOTCONN; + } + + if (g_cdc_ecm_tx_data_length > 0) { + return -USB_ERR_BUSY; + } + + g_cdc_ecm_tx_data_length = len; + + USB_LOG_DBG("txlen:%d\r\n", g_cdc_ecm_tx_data_length); + return usbd_ep_start_write(0, cdc_ecm_ep_data[CDC_ECM_IN_EP_IDX].ep_addr, buf, len); +} + +int usbd_cdc_ecm_start_read(uint8_t *buf, uint32_t len) +{ + if (!usb_device_is_configured(0)) { + return -USB_ERR_NOTCONN; + } + + g_cdc_ecm_rx_data_length = 0; + return usbd_ep_start_read(0, cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_addr, buf, len); +} + +#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP +struct pbuf *usbd_cdc_ecm_eth_rx(void) +{ + struct pbuf *p; + + if (g_cdc_ecm_rx_data_length == 0) { + return NULL; + } + p = pbuf_alloc(PBUF_RAW, g_cdc_ecm_rx_data_length, PBUF_POOL); + if (p == NULL) { + usbd_cdc_ecm_start_read(g_cdc_ecm_rx_buffer, CONFIG_CDC_ECM_ETH_MAX_SEGSZE); + return NULL; + } + usb_memcpy(p->payload, (uint8_t *)g_cdc_ecm_rx_buffer, g_cdc_ecm_rx_data_length); + p->len = g_cdc_ecm_rx_data_length; + + USB_LOG_DBG("rxlen:%d\r\n", g_cdc_ecm_rx_data_length); + usbd_cdc_ecm_start_read(g_cdc_ecm_rx_buffer, CONFIG_CDC_ECM_ETH_MAX_SEGSZE); + return p; +} + +int usbd_cdc_ecm_eth_tx(struct pbuf *p) +{ + struct pbuf *q; + uint8_t *buffer; + + if (!usb_device_is_configured(0)) { + return -USB_ERR_NOTCONN; + } + + if (g_cdc_ecm_tx_data_length > 0) { + return -USB_ERR_BUSY; + } + + if (p->tot_len > sizeof(g_cdc_ecm_tx_buffer)) { + p->tot_len = sizeof(g_cdc_ecm_tx_buffer); + } + + buffer = g_cdc_ecm_tx_buffer; + for (q = p; q != NULL; q = q->next) { + usb_memcpy(buffer, q->payload, q->len); + buffer += q->len; + } + + return usbd_cdc_ecm_start_write(g_cdc_ecm_tx_buffer, p->tot_len); +} +#endif + +struct usbd_interface *usbd_cdc_ecm_init_intf(struct usbd_interface *intf, const uint8_t int_ep, const uint8_t out_ep, const uint8_t in_ep) +{ + intf->class_interface_handler = cdc_ecm_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = cdc_ecm_notify_handler; + + cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_addr = out_ep; + cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_cb = cdc_ecm_bulk_out; + cdc_ecm_ep_data[CDC_ECM_IN_EP_IDX].ep_addr = in_ep; + cdc_ecm_ep_data[CDC_ECM_IN_EP_IDX].ep_cb = cdc_ecm_bulk_in; + cdc_ecm_ep_data[CDC_ECM_INT_EP_IDX].ep_addr = int_ep; + cdc_ecm_ep_data[CDC_ECM_INT_EP_IDX].ep_cb = cdc_ecm_int_in; + + usbd_add_endpoint(0, &cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX]); + usbd_add_endpoint(0, &cdc_ecm_ep_data[CDC_ECM_IN_EP_IDX]); + usbd_add_endpoint(0, &cdc_ecm_ep_data[CDC_ECM_INT_EP_IDX]); + + return intf; +} + +int usbd_cdc_ecm_set_connect(bool connect, uint32_t speed[2]) +{ + if (!usb_device_is_configured(0)) { + return -USB_ERR_NOTCONN; + } + + if (connect) { + g_current_net_status = 2; + memcpy(g_connect_speed_table, speed, 8); + usbd_cdc_ecm_send_notify(CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION, CDC_ECM_NET_CONNECTED, NULL); + } else { + g_current_net_status = 1; + usbd_cdc_ecm_send_notify(CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION, CDC_ECM_NET_DISCONNECTED, NULL); + } + + return 0; +} + +__WEAK void usbd_cdc_ecm_data_recv_done(uint32_t len) +{ + (void)len; +} + +__WEAK void usbd_cdc_ecm_data_send_done(uint32_t len) +{ + (void)len; +} diff --git a/src/lib/CherryUSB/class/cdc/usbd_cdc_ecm.h b/src/lib/CherryUSB/class/cdc/usbd_cdc_ecm.h new file mode 100644 index 000000000..780e7e2bd --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbd_cdc_ecm.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_CDC_ECM_H +#define USBD_CDC_ECM_H + +#include "usb_cdc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Init cdc ecm interface driver */ +struct usbd_interface *usbd_cdc_ecm_init_intf(struct usbd_interface *intf, const uint8_t int_ep, const uint8_t out_ep, const uint8_t in_ep); + +int usbd_cdc_ecm_set_connect(bool connect, uint32_t speed[2]); + +void usbd_cdc_ecm_data_recv_done(uint32_t len); +void usbd_cdc_ecm_data_send_done(uint32_t len); +int usbd_cdc_ecm_start_write(uint8_t *buf, uint32_t len); +int usbd_cdc_ecm_start_read(uint8_t *buf, uint32_t len); + +#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP +#include "lwip/netif.h" +#include "lwip/pbuf.h" +struct pbuf *usbd_cdc_ecm_eth_rx(void); +int usbd_cdc_ecm_eth_tx(struct pbuf *p); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_CDC_ECM_H */ diff --git a/src/lib/CherryUSB/class/cdc/usbh_cdc_acm.c b/src/lib/CherryUSB/class/cdc/usbh_cdc_acm.c new file mode 100644 index 000000000..3adf189bd --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbh_cdc_acm.c @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_cdc_acm.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_cdc_acm" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/ttyACM%d" + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_acm_buf[CONFIG_USBHOST_MAX_CDC_ACM_CLASS][USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_cdc_acm g_cdc_acm_class[CONFIG_USBHOST_MAX_CDC_ACM_CLASS]; +static uint32_t g_devinuse = 0; + +static struct usbh_cdc_acm *usbh_cdc_acm_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_CDC_ACM_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_cdc_acm_class[devno], 0, sizeof(struct usbh_cdc_acm)); + g_cdc_acm_class[devno].minor = devno; + return &g_cdc_acm_class[devno]; + } + } + return NULL; +} + +static void usbh_cdc_acm_class_free(struct usbh_cdc_acm *cdc_acm_class) +{ + uint8_t devno = cdc_acm_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(cdc_acm_class, 0, sizeof(struct usbh_cdc_acm)); +} + +int usbh_cdc_acm_set_line_coding(struct usbh_cdc_acm *cdc_acm_class, struct cdc_line_coding *line_coding) +{ + struct usb_setup_packet *setup; + + if (!cdc_acm_class || !cdc_acm_class->hport) { + return -USB_ERR_INVAL; + } + setup = cdc_acm_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SET_LINE_CODING; + setup->wValue = 0; + setup->wIndex = cdc_acm_class->intf; + setup->wLength = 7; + + memcpy(g_cdc_acm_buf[cdc_acm_class->minor], line_coding, sizeof(struct cdc_line_coding)); + + return usbh_control_transfer(cdc_acm_class->hport, setup, g_cdc_acm_buf[cdc_acm_class->minor]); +} + +int usbh_cdc_acm_get_line_coding(struct usbh_cdc_acm *cdc_acm_class, struct cdc_line_coding *line_coding) +{ + struct usb_setup_packet *setup; + int ret; + + if (!cdc_acm_class || !cdc_acm_class->hport) { + return -USB_ERR_INVAL; + } + setup = cdc_acm_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_LINE_CODING; + setup->wValue = 0; + setup->wIndex = cdc_acm_class->intf; + setup->wLength = 7; + + ret = usbh_control_transfer(cdc_acm_class->hport, setup, g_cdc_acm_buf[cdc_acm_class->minor]); + if (ret < 0) { + return ret; + } + memcpy(line_coding, g_cdc_acm_buf[cdc_acm_class->minor], sizeof(struct cdc_line_coding)); + return ret; +} + +int usbh_cdc_acm_set_line_state(struct usbh_cdc_acm *cdc_acm_class, bool dtr, bool rts) +{ + struct usb_setup_packet *setup; + + if (!cdc_acm_class || !cdc_acm_class->hport) { + return -USB_ERR_INVAL; + } + setup = cdc_acm_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SET_CONTROL_LINE_STATE; + setup->wValue = (dtr << 0) | (rts << 1); + setup->wIndex = cdc_acm_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(cdc_acm_class->hport, setup, NULL); +} + +static int usbh_cdc_acm_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret = 0; + + struct usbh_cdc_acm *cdc_acm_class = usbh_cdc_acm_class_alloc(); + if (cdc_acm_class == NULL) { + USB_LOG_ERR("Fail to alloc cdc_acm_class\r\n"); + return -USB_ERR_NOMEM; + } + + cdc_acm_class->hport = hport; + cdc_acm_class->intf = intf; + + hport->config.intf[intf].priv = cdc_acm_class; + hport->config.intf[intf + 1].priv = NULL; + +#ifdef CONFIG_USBHOST_CDC_ACM_NOTIFY + ep_desc = &hport->config.intf[intf].altsetting[0].ep[0].ep_desc; + USBH_EP_INIT(cdc_acm_class->intin, ep_desc); +#endif + for (uint8_t i = 0; i < hport->config.intf[intf + 1].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf + 1].altsetting[0].ep[i].ep_desc; + + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(cdc_acm_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(cdc_acm_class->bulkout, ep_desc); + } + } + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, cdc_acm_class->minor); + + USB_LOG_INFO("Register CDC ACM Class:%s\r\n", hport->config.intf[intf].devname); + +#if 0 + USB_LOG_INFO("Test cdc acm rx and tx and rx for 5 times, baudrate is 115200\r\n"); + + struct cdc_line_coding linecoding; + uint8_t count = 5; + + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_cdc_acm_set_line_coding(cdc_acm_class, &linecoding); + usbh_cdc_acm_set_line_state(cdc_acm_class, true, false); + + memset(g_cdc_acm_buf, 'a', sizeof(g_cdc_acm_buf)); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, g_cdc_acm_buf, sizeof(g_cdc_acm_buf), 0xfffffff); + USB_LOG_RAW("out ret:%d\r\n", ret); + while (count--) { + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, g_cdc_acm_buf, sizeof(g_cdc_acm_buf), 0xfffffff); + USB_LOG_RAW("in ret:%d\r\n", ret); + if (ret > 0) { + for (uint32_t i = 0; i < ret; i++) { + USB_LOG_RAW("%02x ", g_cdc_acm_buf[i]); + } + } + USB_LOG_RAW("\r\n"); + } +#endif + + usbh_cdc_acm_run(cdc_acm_class); + return ret; +} + +static int usbh_cdc_acm_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_cdc_acm *cdc_acm_class = (struct usbh_cdc_acm *)hport->config.intf[intf].priv; + + if (cdc_acm_class) { + if (cdc_acm_class->bulkin) { + usbh_kill_urb(&cdc_acm_class->bulkin_urb); + } + + if (cdc_acm_class->bulkout) { + usbh_kill_urb(&cdc_acm_class->bulkout_urb); + } + +#ifdef CONFIG_USBHOST_CDC_ACM_NOTIFY + if (cdc_acm_class->intin) { + usbh_kill_urb(&cdc_acm_class->intin_urb); + } +#endif + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister CDC ACM Class:%s\r\n", hport->config.intf[intf].devname); + usbh_cdc_acm_stop(cdc_acm_class); + } + + usbh_cdc_acm_class_free(cdc_acm_class); + } + + return ret; +} + +int usbh_cdc_acm_bulk_in_transfer(struct usbh_cdc_acm *cdc_acm_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &cdc_acm_class->bulkin_urb; + + usbh_bulk_urb_fill(urb, cdc_acm_class->hport, cdc_acm_class->bulkin, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +int usbh_cdc_acm_bulk_out_transfer(struct usbh_cdc_acm *cdc_acm_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &cdc_acm_class->bulkout_urb; + + usbh_bulk_urb_fill(urb, cdc_acm_class->hport, cdc_acm_class->bulkout, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +static int usbh_cdc_data_connect(struct usbh_hubport *hport, uint8_t intf) +{ + (void)hport; + (void)intf; + return 0; +} + +static int usbh_cdc_data_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + (void)hport; + (void)intf; + return 0; +} + +__WEAK void usbh_cdc_acm_run(struct usbh_cdc_acm *cdc_acm_class) +{ + (void)cdc_acm_class; +} + +__WEAK void usbh_cdc_acm_stop(struct usbh_cdc_acm *cdc_acm_class) +{ + (void)cdc_acm_class; +} + +const struct usbh_class_driver cdc_acm_class_driver = { + .driver_name = "cdc_acm", + .connect = usbh_cdc_acm_connect, + .disconnect = usbh_cdc_acm_disconnect +}; + +const struct usbh_class_driver cdc_data_class_driver = { + .driver_name = "cdc_data", + .connect = usbh_cdc_data_connect, + .disconnect = usbh_cdc_data_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cdc_acm_none_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_CDC, + .bInterfaceSubClass = CDC_ABSTRACT_CONTROL_MODEL, + .bInterfaceProtocol = CDC_COMMON_PROTOCOL_NONE, + .id_table = NULL, + .class_driver = &cdc_acm_class_driver +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cdc_acm_at_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_CDC, + .bInterfaceSubClass = CDC_ABSTRACT_CONTROL_MODEL, + .bInterfaceProtocol = CDC_COMMON_PROTOCOL_AT_COMMANDS, + .id_table = NULL, + .class_driver = &cdc_acm_class_driver +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cdc_data_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = USB_DEVICE_CLASS_CDC_DATA, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = NULL, + .class_driver = &cdc_data_class_driver +}; diff --git a/src/lib/CherryUSB/class/cdc/usbh_cdc_acm.h b/src/lib/CherryUSB/class/cdc/usbh_cdc_acm.h new file mode 100644 index 000000000..80800bf9f --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbh_cdc_acm.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_CDC_ACM_H +#define USBH_CDC_ACM_H + +#include "usb_cdc.h" + +struct usbh_cdc_acm { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ +#ifdef CONFIG_USBHOST_CDC_ACM_NOTIFY + struct usb_endpoint_descriptor *intin; /* INTR IN endpoint (optional) */ +#endif + struct usbh_urb bulkout_urb; + struct usbh_urb bulkin_urb; +#ifdef CONFIG_USBHOST_CDC_ACM_NOTIFY + struct usbh_urb intin_urb; +#endif + + struct cdc_line_coding linecoding; + + uint8_t intf; + uint8_t minor; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_cdc_acm_set_line_coding(struct usbh_cdc_acm *cdc_acm_class, struct cdc_line_coding *line_coding); +int usbh_cdc_acm_get_line_coding(struct usbh_cdc_acm *cdc_acm_class, struct cdc_line_coding *line_coding); +int usbh_cdc_acm_set_line_state(struct usbh_cdc_acm *cdc_acm_class, bool dtr, bool rts); + +int usbh_cdc_acm_bulk_in_transfer(struct usbh_cdc_acm *cdc_acm_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); +int usbh_cdc_acm_bulk_out_transfer(struct usbh_cdc_acm *cdc_acm_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); + +void usbh_cdc_acm_run(struct usbh_cdc_acm *cdc_acm_class); +void usbh_cdc_acm_stop(struct usbh_cdc_acm *cdc_acm_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_CDC_ACM_H */ diff --git a/src/lib/CherryUSB/class/cdc/usbh_cdc_ecm.c b/src/lib/CherryUSB/class/cdc/usbh_cdc_ecm.c new file mode 100644 index 000000000..73eaa430e --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbh_cdc_ecm.c @@ -0,0 +1,332 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_cdc_ecm.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_cdc_ecm" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/cdc_ether" + +/* general descriptor field offsets */ +#define DESC_bLength 0 /** Length offset */ +#define DESC_bDescriptorType 1 /** Descriptor type offset */ +#define DESC_bDescriptorSubType 2 /** Descriptor subtype offset */ + +/* interface descriptor field offsets */ +#define INTF_DESC_bInterfaceNumber 2 /** Interface number offset */ +#define INTF_DESC_bAlternateSetting 3 /** Alternate setting offset */ + +#define CONFIG_USBHOST_CDC_ECM_PKT_FILTER 0x000C +#define CONFIG_USBHOST_CDC_ECM_ETH_MAX_SIZE 1514U + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_rx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_CDC_ECM_ETH_MAX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_tx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_CDC_ECM_ETH_MAX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_inttx_buffer[USB_ALIGN_UP(16, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_cdc_ecm g_cdc_ecm_class; + +static int usbh_cdc_ecm_set_eth_packet_filter(struct usbh_cdc_ecm *cdc_ecm_class, uint16_t filter_value) +{ + struct usb_setup_packet *setup; + + if (!cdc_ecm_class || !cdc_ecm_class->hport) { + return -USB_ERR_INVAL; + } + setup = cdc_ecm_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SET_ETHERNET_PACKET_FILTER; + setup->wValue = filter_value; + setup->wIndex = cdc_ecm_class->ctrl_intf; + setup->wLength = 0; + + return usbh_control_transfer(cdc_ecm_class->hport, setup, NULL); +} + +int usbh_cdc_ecm_get_connect_status(struct usbh_cdc_ecm *cdc_ecm_class) +{ + int ret; + + usbh_int_urb_fill(&cdc_ecm_class->intin_urb, cdc_ecm_class->hport, cdc_ecm_class->intin, g_cdc_ecm_inttx_buffer, 16, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&cdc_ecm_class->intin_urb); + if (ret < 0) { + return ret; + } + + if (g_cdc_ecm_inttx_buffer[1] == CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION) { + if (g_cdc_ecm_inttx_buffer[2] == CDC_ECM_NET_CONNECTED) { + cdc_ecm_class->connect_status = true; + } else { + cdc_ecm_class->connect_status = false; + } + } else if (g_cdc_ecm_inttx_buffer[1] == CDC_ECM_NOTIFY_CODE_CONNECTION_SPEED_CHANGE) { + memcpy(cdc_ecm_class->speed, &g_cdc_ecm_inttx_buffer[8], 8); + } + return 0; +} + +static int usbh_cdc_ecm_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret; + uint8_t altsetting = 0; + char mac_buffer[12]; + uint8_t *p; + uint8_t cur_iface = 0xff; + uint8_t mac_str_idx = 0xff; + + struct usbh_cdc_ecm *cdc_ecm_class = &g_cdc_ecm_class; + + memset(cdc_ecm_class, 0, sizeof(struct usbh_cdc_ecm)); + + cdc_ecm_class->hport = hport; + cdc_ecm_class->ctrl_intf = intf; + cdc_ecm_class->data_intf = intf + 1; + + hport->config.intf[intf].priv = cdc_ecm_class; + hport->config.intf[intf + 1].priv = NULL; + + p = hport->raw_config_desc; + while (p[DESC_bLength]) { + switch (p[DESC_bDescriptorType]) { + case USB_DESCRIPTOR_TYPE_INTERFACE: + cur_iface = p[INTF_DESC_bInterfaceNumber]; + //cur_alt_setting = p[INTF_DESC_bAlternateSetting]; + break; + case CDC_CS_INTERFACE: + if ((cur_iface == cdc_ecm_class->ctrl_intf) && p[DESC_bDescriptorSubType] == CDC_FUNC_DESC_ETHERNET_NETWORKING) { + struct cdc_eth_descriptor *desc = (struct cdc_eth_descriptor *)p; + mac_str_idx = desc->iMACAddress; + cdc_ecm_class->max_segment_size = desc->wMaxSegmentSize; + goto get_mac; + } + break; + + default: + break; + } + /* skip to next descriptor */ + p += p[DESC_bLength]; + } + +get_mac: + if (mac_str_idx == 0xff) { + USB_LOG_ERR("Do not find cdc ecm mac string\r\n"); + return -1; + } + + memset(mac_buffer, 0, 12); + ret = usbh_get_string_desc(cdc_ecm_class->hport, mac_str_idx, (uint8_t *)mac_buffer, 12); + if (ret < 0) { + return ret; + } + + for (int i = 0, j = 0; i < 12; i += 2, j++) { + char byte_str[3]; + byte_str[0] = mac_buffer[i]; + byte_str[1] = mac_buffer[i + 1]; + byte_str[2] = '\0'; + + uint32_t byte = strtoul(byte_str, NULL, 16); + cdc_ecm_class->mac[j] = (unsigned char)byte; + } + + USB_LOG_INFO("CDC ECM MAC address %02x:%02x:%02x:%02x:%02x:%02x\r\n", + cdc_ecm_class->mac[0], + cdc_ecm_class->mac[1], + cdc_ecm_class->mac[2], + cdc_ecm_class->mac[3], + cdc_ecm_class->mac[4], + cdc_ecm_class->mac[5]); + + if (cdc_ecm_class->max_segment_size > CONFIG_USBHOST_CDC_ECM_ETH_MAX_SIZE) { + USB_LOG_ERR("CDC ECM Max Segment Size is overflow, default is %u, but now %u\r\n", CONFIG_USBHOST_CDC_ECM_ETH_MAX_SIZE, cdc_ecm_class->max_segment_size); + } else { + USB_LOG_INFO("CDC ECM Max Segment Size:%u\r\n", cdc_ecm_class->max_segment_size); + } + + /* enable int ep */ + ep_desc = &hport->config.intf[intf].altsetting[0].ep[0].ep_desc; + USBH_EP_INIT(cdc_ecm_class->intin, ep_desc); + + if (hport->config.intf[intf + 1].altsetting_num > 1) { + altsetting = hport->config.intf[intf + 1].altsetting_num - 1; + + for (uint8_t i = 0; i < hport->config.intf[intf + 1].altsetting[altsetting].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf + 1].altsetting[altsetting].ep[i].ep_desc; + + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(cdc_ecm_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(cdc_ecm_class->bulkout, ep_desc); + } + } + + USB_LOG_INFO("Select cdc ecm altsetting: %d\r\n", altsetting); + usbh_set_interface(cdc_ecm_class->hport, cdc_ecm_class->data_intf, altsetting); + } else { + for (uint8_t i = 0; i < hport->config.intf[intf + 1].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf + 1].altsetting[0].ep[i].ep_desc; + + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(cdc_ecm_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(cdc_ecm_class->bulkout, ep_desc); + } + } + } + + /* bit0 Promiscuous + * bit1 ALL Multicast + * bit2 Directed + * bit3 Broadcast + * bit4 Multicast + */ + ret = usbh_cdc_ecm_set_eth_packet_filter(cdc_ecm_class, CONFIG_USBHOST_CDC_ECM_PKT_FILTER); + if (ret < 0) { + return ret; + } + USB_LOG_INFO("Set CDC ECM packet filter:%04x\r\n", CONFIG_USBHOST_CDC_ECM_PKT_FILTER); + + strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN); + + USB_LOG_INFO("Register CDC ECM Class:%s\r\n", hport->config.intf[intf].devname); + + usbh_cdc_ecm_run(cdc_ecm_class); + return ret; +} + +static int usbh_cdc_ecm_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_cdc_ecm *cdc_ecm_class = (struct usbh_cdc_ecm *)hport->config.intf[intf].priv; + + if (cdc_ecm_class) { + if (cdc_ecm_class->bulkin) { + usbh_kill_urb(&cdc_ecm_class->bulkin_urb); + } + + if (cdc_ecm_class->bulkout) { + usbh_kill_urb(&cdc_ecm_class->bulkout_urb); + } + + if (cdc_ecm_class->intin) { + usbh_kill_urb(&cdc_ecm_class->intin_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister CDC ECM Class:%s\r\n", hport->config.intf[intf].devname); + usbh_cdc_ecm_stop(cdc_ecm_class); + } + + memset(cdc_ecm_class, 0, sizeof(struct usbh_cdc_ecm)); + } + + return ret; +} + +void usbh_cdc_ecm_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + uint32_t g_cdc_ecm_rx_length; + int ret; + + (void)CONFIG_USB_OSAL_THREAD_GET_ARGV; + USB_LOG_INFO("Create cdc ecm rx thread\r\n"); + // clang-format off +find_class: + // clang-format on + g_cdc_ecm_class.connect_status = false; + if (usbh_find_class_instance("/dev/cdc_ether") == NULL) { + goto delete; + } + + while (g_cdc_ecm_class.connect_status == false) { + ret = usbh_cdc_ecm_get_connect_status(&g_cdc_ecm_class); + if (ret < 0) { + usb_osal_msleep(100); + goto find_class; + } + usb_osal_msleep(128); + } + + g_cdc_ecm_rx_length = 0; + while (1) { + usbh_bulk_urb_fill(&g_cdc_ecm_class.bulkin_urb, g_cdc_ecm_class.hport, g_cdc_ecm_class.bulkin, g_cdc_ecm_rx_buffer, CONFIG_USBHOST_CDC_ECM_ETH_MAX_SIZE, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&g_cdc_ecm_class.bulkin_urb); + if (ret < 0) { + goto find_class; + } + + g_cdc_ecm_rx_length = g_cdc_ecm_class.bulkin_urb.actual_length; + + /* A transfer is complete because last packet is a short packet. + * Short packet is not zero, match g_cdc_ecm_rx_length % USB_GET_MAXPACKETSIZE(g_cdc_ecm_class.bulkin->wMaxPacketSize). + * Short packet is zero, check if g_cdc_ecm_class.bulkin_urb.actual_length < transfer_size, for example transfer is complete with size is 512 < 1514. + * This case is always true + */ + if (g_cdc_ecm_rx_length % USB_GET_MAXPACKETSIZE(g_cdc_ecm_class.bulkin->wMaxPacketSize) || + (g_cdc_ecm_class.bulkin_urb.actual_length < CONFIG_USBHOST_CDC_ECM_ETH_MAX_SIZE)) { + USB_LOG_DBG("rxlen:%d\r\n", g_cdc_ecm_rx_length); + + usbh_cdc_ecm_eth_input(g_cdc_ecm_rx_buffer, g_cdc_ecm_rx_length); + + g_cdc_ecm_rx_length = 0; + } else { + /* There's no way to run here. */ + } + } + // clang-format off +delete: + USB_LOG_INFO("Delete cdc ecm rx thread\r\n"); + usb_osal_thread_delete(NULL); + // clang-format on +} + +uint8_t *usbh_cdc_ecm_get_eth_txbuf(void) +{ + return g_cdc_ecm_tx_buffer; +} + +int usbh_cdc_ecm_eth_output(uint32_t buflen) +{ + if (g_cdc_ecm_class.connect_status == false) { + return -USB_ERR_NOTCONN; + } + + USB_LOG_DBG("txlen:%d\r\n", buflen); + + usbh_bulk_urb_fill(&g_cdc_ecm_class.bulkout_urb, g_cdc_ecm_class.hport, g_cdc_ecm_class.bulkout, g_cdc_ecm_tx_buffer, buflen, USB_OSAL_WAITING_FOREVER, NULL, NULL); + return usbh_submit_urb(&g_cdc_ecm_class.bulkout_urb); +} + +__WEAK void usbh_cdc_ecm_run(struct usbh_cdc_ecm *cdc_ecm_class) +{ + (void)cdc_ecm_class; +} + +__WEAK void usbh_cdc_ecm_stop(struct usbh_cdc_ecm *cdc_ecm_class) +{ + (void)cdc_ecm_class; +} + +const struct usbh_class_driver cdc_ecm_class_driver = { + .driver_name = "cdc_ecm", + .connect = usbh_cdc_ecm_connect, + .disconnect = usbh_cdc_ecm_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cdc_ecm_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_CDC, + .bInterfaceSubClass = CDC_ETHERNET_NETWORKING_CONTROL_MODEL, + .bInterfaceProtocol = CDC_COMMON_PROTOCOL_NONE, + .id_table = NULL, + .class_driver = &cdc_ecm_class_driver +}; \ No newline at end of file diff --git a/src/lib/CherryUSB/class/cdc/usbh_cdc_ecm.h b/src/lib/CherryUSB/class/cdc/usbh_cdc_ecm.h new file mode 100644 index 000000000..a3ab84a5c --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbh_cdc_ecm.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_CDC_ECM_H +#define USBH_CDC_ECM_H + +#include "usb_cdc.h" + +struct usbh_cdc_ecm { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usb_endpoint_descriptor *intin; /* Interrupt IN endpoint */ + struct usbh_urb bulkout_urb; /* Bulk out endpoint */ + struct usbh_urb bulkin_urb; /* Bulk IN endpoint */ + struct usbh_urb intin_urb; /* Interrupt IN endpoint */ + + uint8_t ctrl_intf; /* Control interface number */ + uint8_t data_intf; /* Data interface number */ + uint8_t minor; + + uint8_t mac[6]; + bool connect_status; + uint16_t max_segment_size; + uint32_t speed[2]; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_cdc_ecm_get_connect_status(struct usbh_cdc_ecm *cdc_ecm_class); + +void usbh_cdc_ecm_run(struct usbh_cdc_ecm *cdc_ecm_class); +void usbh_cdc_ecm_stop(struct usbh_cdc_ecm *cdc_ecm_class); + +uint8_t *usbh_cdc_ecm_get_eth_txbuf(void); +int usbh_cdc_ecm_eth_output(uint32_t buflen); +void usbh_cdc_ecm_eth_input(uint8_t *buf, uint32_t buflen); +void usbh_cdc_ecm_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_CDC_ECM_H */ diff --git a/src/lib/CherryUSB/class/cdc/usbh_cdc_ncm.c b/src/lib/CherryUSB/class/cdc/usbh_cdc_ncm.c new file mode 100644 index 000000000..2ee6e4cec --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbh_cdc_ncm.c @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_cdc_ncm.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_cdc_ncm" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/cdc_ncm" + +/* general descriptor field offsets */ +#define DESC_bLength 0 /** Length offset */ +#define DESC_bDescriptorType 1 /** Descriptor type offset */ +#define DESC_bDescriptorSubType 2 /** Descriptor subtype offset */ + +/* interface descriptor field offsets */ +#define INTF_DESC_bInterfaceNumber 2 /** Interface number offset */ +#define INTF_DESC_bAlternateSetting 3 /** Alternate setting offset */ + +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_SEGSZE 1514U + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ncm_rx_buffer[CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ncm_tx_buffer[CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ncm_inttx_buffer[USB_ALIGN_UP(16, CONFIG_USB_ALIGN_SIZE)]; + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ncm_buf[USB_ALIGN_UP(32, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_cdc_ncm g_cdc_ncm_class; + +static int usbh_cdc_ncm_get_ntb_parameters(struct usbh_cdc_ncm *cdc_ncm_class, struct cdc_ncm_ntb_parameters *param) +{ + struct usb_setup_packet *setup; + int ret; + + if (!cdc_ncm_class || !cdc_ncm_class->hport) { + return -USB_ERR_INVAL; + } + setup = cdc_ncm_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_NTB_PARAMETERS; + setup->wValue = 0; + setup->wIndex = cdc_ncm_class->ctrl_intf; + setup->wLength = 28; + + ret = usbh_control_transfer(cdc_ncm_class->hport, setup, g_cdc_ncm_buf); + if (ret < 8) { + return ret; + } + + memcpy((uint8_t *)param, g_cdc_ncm_buf, MIN(ret - 8, sizeof(struct cdc_ncm_ntb_parameters))); + return 0; +} + +static void print_ntb_parameters(struct cdc_ncm_ntb_parameters *param) +{ + USB_LOG_RAW("CDC NCM ntb parameters:\r\n"); + USB_LOG_RAW("wLength: 0x%02x \r\n", param->wLength); + USB_LOG_RAW("bmNtbFormatsSupported: %s \r\n", param->bmNtbFormatsSupported ? "NTB16" : "NTB32"); + + USB_LOG_RAW("dwNtbInMaxSize: 0x%08x \r\n", (unsigned int)param->dwNtbInMaxSize); + USB_LOG_RAW("wNdbInDivisor: 0x%02x \r\n", param->wNdbInDivisor); + USB_LOG_RAW("wNdbInPayloadRemainder: 0x%02x \r\n", param->wNdbInPayloadRemainder); + USB_LOG_RAW("wNdbInAlignment: 0x%02x \r\n", param->wNdbInAlignment); + + USB_LOG_RAW("dwNtbOutMaxSize: 0x%08x \r\n", (unsigned int)param->dwNtbOutMaxSize); + USB_LOG_RAW("wNdbOutDivisor: 0x%02x \r\n", param->wNdbOutDivisor); + USB_LOG_RAW("wNdbOutPayloadRemainder: 0x%02x \r\n", param->wNdbOutPayloadRemainder); + USB_LOG_RAW("wNdbOutAlignment: 0x%02x \r\n", param->wNdbOutAlignment); + + USB_LOG_RAW("wNtbOutMaxDatagrams: 0x%02x \r\n", param->wNtbOutMaxDatagrams); +} + +int usbh_cdc_ncm_get_connect_status(struct usbh_cdc_ncm *cdc_ncm_class) +{ + int ret; + + usbh_int_urb_fill(&cdc_ncm_class->intin_urb, cdc_ncm_class->hport, cdc_ncm_class->intin, g_cdc_ncm_inttx_buffer, 16, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&cdc_ncm_class->intin_urb); + if (ret < 0) { + return ret; + } + + if (g_cdc_ncm_inttx_buffer[1] == CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION) { + if (g_cdc_ncm_inttx_buffer[2] == CDC_ECM_NET_CONNECTED) { + cdc_ncm_class->connect_status = true; + } else { + cdc_ncm_class->connect_status = false; + } + } else if (g_cdc_ncm_inttx_buffer[1] == CDC_ECM_NOTIFY_CODE_CONNECTION_SPEED_CHANGE) { + memcpy(cdc_ncm_class->speed, &g_cdc_ncm_inttx_buffer[8], 8); + } + return 0; +} + +static int usbh_cdc_ncm_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret; + uint8_t altsetting = 0; + char mac_buffer[12]; + uint8_t *p; + uint8_t cur_iface = 0xff; + uint8_t mac_str_idx = 0xff; + + struct usbh_cdc_ncm *cdc_ncm_class = &g_cdc_ncm_class; + + memset(cdc_ncm_class, 0, sizeof(struct usbh_cdc_ncm)); + + cdc_ncm_class->hport = hport; + cdc_ncm_class->ctrl_intf = intf; + cdc_ncm_class->data_intf = intf + 1; + + hport->config.intf[intf].priv = cdc_ncm_class; + hport->config.intf[intf + 1].priv = NULL; + + p = hport->raw_config_desc; + while (p[DESC_bLength]) { + switch (p[DESC_bDescriptorType]) { + case USB_DESCRIPTOR_TYPE_INTERFACE: + cur_iface = p[INTF_DESC_bInterfaceNumber]; + //cur_alt_setting = p[INTF_DESC_bAlternateSetting]; + break; + case CDC_CS_INTERFACE: + if ((cur_iface == cdc_ncm_class->ctrl_intf) && p[DESC_bDescriptorSubType] == CDC_FUNC_DESC_ETHERNET_NETWORKING) { + struct cdc_eth_descriptor *desc = (struct cdc_eth_descriptor *)p; + mac_str_idx = desc->iMACAddress; + cdc_ncm_class->max_segment_size = desc->wMaxSegmentSize; + goto get_mac; + } + break; + + default: + break; + } + /* skip to next descriptor */ + p += p[DESC_bLength]; + } + +get_mac: + if (mac_str_idx == 0xff) { + USB_LOG_ERR("Do not find cdc ncm mac string\r\n"); + return -1; + } + + memset(mac_buffer, 0, 12); + ret = usbh_get_string_desc(cdc_ncm_class->hport, mac_str_idx, (uint8_t *)mac_buffer, 12); + if (ret < 0) { + return ret; + } + + for (int i = 0, j = 0; i < 12; i += 2, j++) { + char byte_str[3]; + byte_str[0] = mac_buffer[i]; + byte_str[1] = mac_buffer[i + 1]; + byte_str[2] = '\0'; + + uint32_t byte = strtoul(byte_str, NULL, 16); + cdc_ncm_class->mac[j] = (unsigned char)byte; + } + + USB_LOG_INFO("CDC NCM MAC address %02x:%02x:%02x:%02x:%02x:%02x\r\n", + cdc_ncm_class->mac[0], + cdc_ncm_class->mac[1], + cdc_ncm_class->mac[2], + cdc_ncm_class->mac[3], + cdc_ncm_class->mac[4], + cdc_ncm_class->mac[5]); + + if (cdc_ncm_class->max_segment_size > CONFIG_USBHOST_CDC_NCM_ETH_MAX_SEGSZE) { + USB_LOG_ERR("CDC NCM Max Segment Size is overflow, default is %u, but now %u\r\n", CONFIG_USBHOST_CDC_NCM_ETH_MAX_SEGSZE, cdc_ncm_class->max_segment_size); + } else { + USB_LOG_INFO("CDC NCM Max Segment Size:%u\r\n", cdc_ncm_class->max_segment_size); + } + + usbh_cdc_ncm_get_ntb_parameters(cdc_ncm_class, &cdc_ncm_class->ntb_param); + print_ntb_parameters(&cdc_ncm_class->ntb_param); + + /* enable int ep */ + ep_desc = &hport->config.intf[intf].altsetting[0].ep[0].ep_desc; + USBH_EP_INIT(cdc_ncm_class->intin, ep_desc); + + if (hport->config.intf[intf + 1].altsetting_num > 1) { + altsetting = hport->config.intf[intf + 1].altsetting_num - 1; + + for (uint8_t i = 0; i < hport->config.intf[intf + 1].altsetting[altsetting].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf + 1].altsetting[altsetting].ep[i].ep_desc; + + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(cdc_ncm_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(cdc_ncm_class->bulkout, ep_desc); + } + } + + USB_LOG_INFO("Select cdc ncm altsetting: %d\r\n", altsetting); + usbh_set_interface(cdc_ncm_class->hport, cdc_ncm_class->data_intf, altsetting); + } else { + for (uint8_t i = 0; i < hport->config.intf[intf + 1].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf + 1].altsetting[0].ep[i].ep_desc; + + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(cdc_ncm_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(cdc_ncm_class->bulkout, ep_desc); + } + } + } + + strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN); + + USB_LOG_INFO("Register CDC NCM Class:%s\r\n", hport->config.intf[intf].devname); + + usbh_cdc_ncm_run(cdc_ncm_class); + return ret; +} + +static int usbh_cdc_ncm_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_cdc_ncm *cdc_ncm_class = (struct usbh_cdc_ncm *)hport->config.intf[intf].priv; + + if (cdc_ncm_class) { + if (cdc_ncm_class->bulkin) { + usbh_kill_urb(&cdc_ncm_class->bulkin_urb); + } + + if (cdc_ncm_class->bulkout) { + usbh_kill_urb(&cdc_ncm_class->bulkout_urb); + } + + if (cdc_ncm_class->intin) { + usbh_kill_urb(&cdc_ncm_class->intin_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister CDC NCM Class:%s\r\n", hport->config.intf[intf].devname); + usbh_cdc_ncm_stop(cdc_ncm_class); + } + + memset(cdc_ncm_class, 0, sizeof(struct usbh_cdc_ncm)); + } + + return ret; +} + +void usbh_cdc_ncm_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + uint32_t g_cdc_ncm_rx_length; + int ret; +#if CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE <= (16 * 1024) + uint32_t transfer_size = CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE; +#else + uint32_t transfer_size = (16 * 1024); +#endif + + (void)CONFIG_USB_OSAL_THREAD_GET_ARGV; + USB_LOG_INFO("Create cdc ncm rx thread\r\n"); + // clang-format off +find_class: + // clang-format on + g_cdc_ncm_class.connect_status = false; + if (usbh_find_class_instance("/dev/cdc_ncm") == NULL) { + goto delete; + } + + while (g_cdc_ncm_class.connect_status == false) { + ret = usbh_cdc_ncm_get_connect_status(&g_cdc_ncm_class); + if (ret < 0) { + usb_osal_msleep(100); + goto find_class; + } + } + + g_cdc_ncm_rx_length = 0; + while (1) { + usbh_bulk_urb_fill(&g_cdc_ncm_class.bulkin_urb, g_cdc_ncm_class.hport, g_cdc_ncm_class.bulkin, &g_cdc_ncm_rx_buffer[g_cdc_ncm_rx_length], transfer_size, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&g_cdc_ncm_class.bulkin_urb); + if (ret < 0) { + goto find_class; + } + + g_cdc_ncm_rx_length += g_cdc_ncm_class.bulkin_urb.actual_length; + + /* A transfer is complete because last packet is a short packet. + * Short packet is not zero, match g_cdc_ncm_rx_length % USB_GET_MAXPACKETSIZE(g_cdc_ncm_class.bulkin->wMaxPacketSize). + * Short packet is zero, check if g_cdc_ncm_class.bulkin_urb.actual_length < transfer_size, for example transfer is complete with size is 1024 < 2048. + */ + if ((g_cdc_ncm_rx_length % USB_GET_MAXPACKETSIZE(g_cdc_ncm_class.bulkin->wMaxPacketSize)) || + (g_cdc_ncm_class.bulkin_urb.actual_length < transfer_size)) { + USB_LOG_DBG("rxlen:%d\r\n", g_cdc_ncm_rx_length); + + struct cdc_ncm_nth16 *nth16 = (struct cdc_ncm_nth16 *)&g_cdc_ncm_rx_buffer[0]; + if ((nth16->dwSignature != CDC_NCM_NTH16_SIGNATURE) || + (nth16->wHeaderLength != 12) || + (nth16->wBlockLength != g_cdc_ncm_rx_length)) { + USB_LOG_ERR("invalid rx nth16\r\n"); + g_cdc_ncm_rx_length = 0; + continue; + } + + struct cdc_ncm_ndp16 *ndp16 = (struct cdc_ncm_ndp16 *)&g_cdc_ncm_rx_buffer[nth16->wNdpIndex]; + if ((ndp16->dwSignature != CDC_NCM_NDP16_SIGNATURE_NCM0) && (ndp16->dwSignature != CDC_NCM_NDP16_SIGNATURE_NCM1)) { + USB_LOG_ERR("invalid rx ndp16\r\n"); + g_cdc_ncm_rx_length = 0; + continue; + } + + uint16_t datagram_num = (ndp16->wLength - 8) / 4; + + USB_LOG_DBG("datagram num:%02x\r\n", datagram_num); + for (uint16_t i = 0; i < datagram_num; i++) { + struct cdc_ncm_ndp16_datagram *ndp16_datagram = (struct cdc_ncm_ndp16_datagram *)&g_cdc_ncm_rx_buffer[nth16->wNdpIndex + 8 + 4 * i]; + if (ndp16_datagram->wDatagramIndex && ndp16_datagram->wDatagramLength) { + USB_LOG_DBG("ndp16_datagram index:%02x, length:%02x\r\n", ndp16_datagram->wDatagramIndex, ndp16_datagram->wDatagramLength); + + uint8_t *buf = (uint8_t *)&g_cdc_ncm_rx_buffer[ndp16_datagram->wDatagramIndex]; + usbh_cdc_ncm_eth_input(buf, ndp16_datagram->wDatagramLength); + } + } + + g_cdc_ncm_rx_length = 0; + } else { +#if CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE <= (16 * 1024) + if (g_cdc_ncm_rx_length == CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE) { +#else + if ((g_cdc_ncm_rx_length + (16 * 1024)) > CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE) { +#endif + USB_LOG_ERR("Rx packet is overflow, please reduce tcp window size or increase CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE\r\n"); + while (1) { + } + } + } + } + // clang-format off +delete: + USB_LOG_INFO("Delete cdc ncm rx thread\r\n"); + usb_osal_thread_delete(NULL); + // clang-format on +} + +uint8_t *usbh_cdc_ncm_get_eth_txbuf(void) +{ + return &g_cdc_ncm_tx_buffer[16]; +} + +int usbh_cdc_ncm_eth_output(uint32_t buflen) +{ + struct cdc_ncm_ndp16_datagram *ndp16_datagram; + + if (g_cdc_ncm_class.connect_status == false) { + return -USB_ERR_NOTCONN; + } + + struct cdc_ncm_nth16 *nth16 = (struct cdc_ncm_nth16 *)&g_cdc_ncm_tx_buffer[0]; + + nth16->dwSignature = CDC_NCM_NTH16_SIGNATURE; + nth16->wHeaderLength = 12; + nth16->wSequence = g_cdc_ncm_class.bulkout_sequence++; + nth16->wBlockLength = 16 + 16 + USB_ALIGN_UP(buflen, 4); + nth16->wNdpIndex = 16 + USB_ALIGN_UP(buflen, 4); + + struct cdc_ncm_ndp16 *ndp16 = (struct cdc_ncm_ndp16 *)&g_cdc_ncm_tx_buffer[nth16->wNdpIndex]; + + ndp16->dwSignature = CDC_NCM_NDP16_SIGNATURE_NCM0; + ndp16->wLength = 16; + ndp16->wNextNdpIndex = 0; + + ndp16_datagram = (struct cdc_ncm_ndp16_datagram *)&g_cdc_ncm_tx_buffer[nth16->wNdpIndex + 8 + 4 * 0]; + ndp16_datagram->wDatagramIndex = 16; + ndp16_datagram->wDatagramLength = buflen; + + ndp16_datagram = (struct cdc_ncm_ndp16_datagram *)&g_cdc_ncm_tx_buffer[nth16->wNdpIndex + 8 + 4 * 1]; + ndp16_datagram->wDatagramIndex = 0; + ndp16_datagram->wDatagramLength = 0; + + USB_LOG_DBG("txlen:%d\r\n", nth16->wBlockLength); + + usbh_bulk_urb_fill(&g_cdc_ncm_class.bulkout_urb, g_cdc_ncm_class.hport, g_cdc_ncm_class.bulkout, g_cdc_ncm_tx_buffer, nth16->wBlockLength, USB_OSAL_WAITING_FOREVER, NULL, NULL); + return usbh_submit_urb(&g_cdc_ncm_class.bulkout_urb); +} + +__WEAK void usbh_cdc_ncm_run(struct usbh_cdc_ncm *cdc_ncm_class) +{ + (void)cdc_ncm_class; +} + +__WEAK void usbh_cdc_ncm_stop(struct usbh_cdc_ncm *cdc_ncm_class) +{ + (void)cdc_ncm_class; +} + +const struct usbh_class_driver cdc_ncm_class_driver = { + .driver_name = "cdc_ncm", + .connect = usbh_cdc_ncm_connect, + .disconnect = usbh_cdc_ncm_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cdc_ncm_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_CDC, + .bInterfaceSubClass = CDC_NETWORK_CONTROL_MODEL, + .bInterfaceProtocol = CDC_COMMON_PROTOCOL_NONE, + .id_table = NULL, + .class_driver = &cdc_ncm_class_driver +}; diff --git a/src/lib/CherryUSB/class/cdc/usbh_cdc_ncm.h b/src/lib/CherryUSB/class/cdc/usbh_cdc_ncm.h new file mode 100644 index 000000000..b86122a23 --- /dev/null +++ b/src/lib/CherryUSB/class/cdc/usbh_cdc_ncm.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_CDC_NCM_H +#define USBH_CDC_NCM_H + +#include "usb_cdc.h" + +struct usbh_cdc_ncm { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usb_endpoint_descriptor *intin; /* Interrupt IN endpoint */ + struct usbh_urb bulkout_urb; /* Bulk out endpoint */ + struct usbh_urb bulkin_urb; /* Bulk IN endpoint */ + struct usbh_urb intin_urb; /* Interrupt IN endpoint */ + + uint8_t ctrl_intf; /* Control interface number */ + uint8_t data_intf; /* Data interface number */ + uint8_t minor; + + struct cdc_ncm_ntb_parameters ntb_param; + uint16_t bulkin_sequence; + uint16_t bulkout_sequence; + + uint8_t mac[6]; + bool connect_status; + uint16_t max_segment_size; + uint32_t speed[2]; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_cdc_ncm_get_connect_status(struct usbh_cdc_ncm *cdc_ncm_class); + +void usbh_cdc_ncm_run(struct usbh_cdc_ncm *cdc_ncm_class); +void usbh_cdc_ncm_stop(struct usbh_cdc_ncm *cdc_ncm_class); + +uint8_t *usbh_cdc_ncm_get_eth_txbuf(void); +int usbh_cdc_ncm_eth_output(uint32_t buflen); +void usbh_cdc_ncm_eth_input(uint8_t *buf, uint32_t buflen); +void usbh_cdc_ncm_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_CDC_NCM_H */ diff --git a/src/lib/CherryUSB/class/dfu/usb_dfu.h b/src/lib/CherryUSB/class/dfu/usb_dfu.h new file mode 100644 index 000000000..f1ccba88c --- /dev/null +++ b/src/lib/CherryUSB/class/dfu/usb_dfu.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_DFU_H +#define USB_DFU_H + +/**\addtogroup USB_MODULE_DFU USB DFU class + * \brief This module contains USB Device Firmware Upgrade class definitions. + * \details This module based on + * + [USB Device Firmware Upgrade Specification, Revision 1.1] + * (https://www.usb.org/sites/default/files/DFU_1.1.pdf) + * @{ */ + +/** DFU Specification release */ +#define DFU_VERSION 0x0110 + +/** DFU Class Subclass */ +#define DFU_SUBCLASS_DFU 0x01 + +/** DFU Class runtime Protocol */ +#define DFU_PROTOCOL_RUNTIME 0x01 + +/** DFU Class DFU mode Protocol */ +#define DFU_PROTOCOL_MODE 0x02 + +/** + * @brief DFU Class Specific Requests + */ +#define DFU_REQUEST_DETACH 0x00 +#define DFU_REQUEST_DNLOAD 0x01 +#define DFU_REQUEST_UPLOAD 0x02 +#define DFU_REQUEST_GETSTATUS 0x03 +#define DFU_REQUEST_CLRSTATUS 0x04 +#define DFU_REQUEST_GETSTATE 0x05 +#define DFU_REQUEST_ABORT 0x06 + +/** DFU FUNCTIONAL descriptor type */ +#define DFU_FUNC_DESC 0x21 + +/** DFU attributes DFU Functional Descriptor */ +#define DFU_ATTR_WILL_DETACH 0x08 +#define DFU_ATTR_MANIFESTATION_TOLERANT 0x04 +#define DFU_ATTR_CAN_UPLOAD 0x02 +#define DFU_ATTR_CAN_DNLOAD 0x01 + +/** bStatus values for the DFU_GETSTATUS response */ +#define DFU_STATUS_OK 0x00U +#define DFU_STATUS_ERR_TARGET 0x01U +#define DFU_STATUS_ERR_FILE 0x02U +#define DFU_STATUS_ERR_WRITE 0x03U +#define DFU_STATUS_ERR_ERASE 0x04U +#define DFU_STATUS_ERR_CHECK_ERASED 0x05U +#define DFU_STATUS_ERR_PROG 0x06U +#define DFU_STATUS_ERR_VERIFY 0x07U +#define DFU_STATUS_ERR_ADDRESS 0x08U +#define DFU_STATUS_ERR_NOTDONE 0x09U +#define DFU_STATUS_ERR_FIRMWARE 0x0AU +#define DFU_STATUS_ERR_VENDOR 0x0BU +#define DFU_STATUS_ERR_USB 0x0CU +#define DFU_STATUS_ERR_POR 0x0DU +#define DFU_STATUS_ERR_UNKNOWN 0x0EU +#define DFU_STATUS_ERR_STALLEDPKT 0x0FU + +/** bState values for the DFU_GETSTATUS response */ +#define DFU_STATE_APP_IDLE 0U +#define DFU_STATE_APP_DETACH 1U +#define DFU_STATE_DFU_IDLE 2U +#define DFU_STATE_DFU_DNLOAD_SYNC 3U +#define DFU_STATE_DFU_DNLOAD_BUSY 4U +#define DFU_STATE_DFU_DNLOAD_IDLE 5U +#define DFU_STATE_DFU_MANIFEST_SYNC 6U +#define DFU_STATE_DFU_MANIFEST 7U +#define DFU_STATE_DFU_MANIFEST_WAIT_RESET 8U +#define DFU_STATE_DFU_UPLOAD_IDLE 9U +#define DFU_STATE_DFU_ERROR 10U + +/** DFU Manifestation State */ +#define DFU_MANIFEST_COMPLETE 0U +#define DFU_MANIFEST_IN_PROGRESS 1U + +/** Special Commands with Download Request */ +#define DFU_CMD_GETCOMMANDS 0U +#define DFU_CMD_SETADDRESSPOINTER 0x21U +#define DFU_CMD_ERASE 0x41U +#define DFU_MEDIA_ERASE 0x00U +#define DFU_MEDIA_PROGRAM 0x01U + +/** Other defines */ +/* Bit Detach capable = bit 3 in bmAttributes field */ +#define DFU_DETACH_MASK (1U << 3) +#define DFU_MANIFEST_MASK (1U << 2) + +/** Run-Time Functional Descriptor */ +struct dfu_runtime_descriptor { + uint8_t bLength; /**<\brief Descriptor length in bytes.*/ + uint8_t bDescriptorType; /**<\brief DFU functional descriptor type.*/ + uint8_t bmAttributes; /**<\brief USB DFU capabilities \ref USB_DFU_CAPAB*/ + uint16_t wDetachTimeout; /**<\brief USB DFU detach timeout in ms.*/ + uint16_t wTransferSize; /**<\brief USB DFU maximum transfer block size in bytes.*/ + uint16_t bcdDFUVersion; /**<\brief USB DFU version \ref VERSION_BCD utility macro.*/ +} __PACKED; + +/**\brief Payload packet to response in DFU_GETSTATUS request */ +struct dfu_info { + uint8_t bStatus; /**<\brief An indication of the status resulting from the + * execution of the most recent request.*/ + uint8_t bPollTimeout; /**<\brief Minimum time (LSB) in ms, that the host should wait + * before sending a subsequent DFU_GETSTATUS request.*/ + uint16_t wPollTimeout; /**<\brief Minimum time (MSB) in ms, that the host should wait + * before sending a subsequent DFU_GETSTATUS request.*/ + uint8_t bState; /**<\brief An indication of the state that the device is going + * to enter immediately following transmission of this response.*/ + uint8_t iString; /**<\brief Index of the status string descriptor.*/ +}; + +// clang-format off +#define DFU_DESCRIPTOR_INIT() \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + 0x00, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints Default Control Pipe only */ \ + USB_DEVICE_CLASS_APP_SPECIFIC, /* bInterfaceClass */ \ + 0x01, /* bInterfaceSubClass Device Firmware Upgrade */ \ + 0x02, /* bInterfaceProtocol DFU mode */ \ + 0x04, /* iInterface */ /*!< Device Firmware Update Functional Descriptor */ \ + 0x09, /* bLength */ \ + 0x21, /* DFU Functional Descriptor */ \ + 0x0B, /* bmAttributes */ \ + WBVAL(0x00ff), /* wDetachTimeOut */ \ + WBVAL(USBD_DFU_XFER_SIZE), /* wTransferSize */ \ + WBVAL(0x011a) /* bcdDFUVersion */ +// clang-format on + +#endif /* USB_DFU_H */ diff --git a/src/lib/CherryUSB/class/dfu/usbd_dfu.c b/src/lib/CherryUSB/class/dfu/usbd_dfu.c new file mode 100644 index 000000000..2da382884 --- /dev/null +++ b/src/lib/CherryUSB/class/dfu/usbd_dfu.c @@ -0,0 +1,504 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_dfu.h" + +/** Modify the following three parameters according to different platforms */ +#ifndef USBD_DFU_XFER_SIZE +#define USBD_DFU_XFER_SIZE 1024 +#endif + +#ifndef USBD_DFU_APP_DEFAULT_ADD +#define USBD_DFU_APP_DEFAULT_ADD 0x8004000 +#endif + +#ifndef FLASH_PROGRAM_TIME +#define FLASH_PROGRAM_TIME 50 +#endif + +#ifndef FLASH_ERASE_TIME +#define FLASH_ERASE_TIME 50 +#endif + +struct usbd_dfu_priv { + struct dfu_info info; + union { + uint32_t d32[USBD_DFU_XFER_SIZE / 4U]; + uint8_t d8[USBD_DFU_XFER_SIZE]; + } buffer; + + uint32_t wblock_num; + uint32_t wlength; + uint32_t data_ptr; + uint32_t alt_setting; + + uint8_t dev_status[6]; + uint8_t ReservedForAlign[2]; + uint8_t dev_state; + uint8_t manif_state; + uint8_t firmwar_flag; +} g_usbd_dfu; + +static void dfu_reset(void) +{ + memset(&g_usbd_dfu, 0, sizeof(g_usbd_dfu)); + + g_usbd_dfu.alt_setting = 0U; + g_usbd_dfu.data_ptr = USBD_DFU_APP_DEFAULT_ADD; + g_usbd_dfu.wblock_num = 0U; + g_usbd_dfu.wlength = 0U; + + g_usbd_dfu.manif_state = DFU_MANIFEST_COMPLETE; + g_usbd_dfu.dev_state = DFU_STATE_DFU_IDLE; + + g_usbd_dfu.dev_status[0] = DFU_STATUS_OK; + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = DFU_STATE_DFU_IDLE; + g_usbd_dfu.dev_status[5] = 0U; +} + +static uint16_t dfu_getstatus(uint32_t add, uint8_t cmd, uint8_t *buffer) +{ + switch (cmd) { + case DFU_MEDIA_PROGRAM: + buffer[1] = (uint8_t)FLASH_PROGRAM_TIME; + buffer[2] = (uint8_t)(FLASH_PROGRAM_TIME << 8); + buffer[3] = 0; + break; + + case DFU_MEDIA_ERASE: + buffer[1] = (uint8_t)FLASH_ERASE_TIME; + buffer[2] = (uint8_t)(FLASH_ERASE_TIME << 8); + buffer[3] = 0; + default: + + break; + } + return (0); +} + +static void dfu_request_detach(void) +{ + if ((g_usbd_dfu.dev_state == DFU_STATE_DFU_IDLE) || + (g_usbd_dfu.dev_state == DFU_STATE_DFU_DNLOAD_SYNC) || + (g_usbd_dfu.dev_state == DFU_STATE_DFU_DNLOAD_IDLE) || + (g_usbd_dfu.dev_state == DFU_STATE_DFU_MANIFEST_SYNC) || + (g_usbd_dfu.dev_state == DFU_STATE_DFU_UPLOAD_IDLE)) { + /* Update the state machine */ + g_usbd_dfu.dev_state = DFU_STATE_DFU_IDLE; + g_usbd_dfu.dev_status[0] = DFU_STATUS_OK; + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; /*bwPollTimeout=0ms*/ + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + g_usbd_dfu.dev_status[5] = 0U; /*iString*/ + g_usbd_dfu.wblock_num = 0U; + g_usbd_dfu.wlength = 0U; + } +} + +static void dfu_request_upload(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + struct usb_setup_packet *req = setup; + uint32_t addr; + /* Data setup request */ + if (req->wLength > 0U) { + if ((g_usbd_dfu.dev_state == DFU_STATE_DFU_IDLE) || (g_usbd_dfu.dev_state == DFU_STATE_DFU_UPLOAD_IDLE)) { + /* Update the global length and block number */ + g_usbd_dfu.wblock_num = req->wValue; + g_usbd_dfu.wlength = MIN(req->wLength, USBD_DFU_XFER_SIZE); + + /* DFU Get Command */ + if (g_usbd_dfu.wblock_num == 0U) { + /* Update the state machine */ + g_usbd_dfu.dev_state = (g_usbd_dfu.wlength > 3U) ? DFU_STATE_DFU_IDLE : DFU_STATE_DFU_UPLOAD_IDLE; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + + /* Store the values of all supported commands */ + g_usbd_dfu.buffer.d8[0] = DFU_CMD_GETCOMMANDS; + g_usbd_dfu.buffer.d8[1] = DFU_CMD_SETADDRESSPOINTER; + g_usbd_dfu.buffer.d8[2] = DFU_CMD_ERASE; + + /* Send the status data over EP0 */ + memcpy(*data, g_usbd_dfu.buffer.d8, 3); + *len = 3; + } else if (g_usbd_dfu.wblock_num > 1U) { + g_usbd_dfu.dev_state = DFU_STATE_DFU_UPLOAD_IDLE; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + + addr = ((g_usbd_dfu.wblock_num - 2U) * USBD_DFU_XFER_SIZE) + g_usbd_dfu.data_ptr; + + /* Return the physical address where data are stored */ + dfu_read_flash((uint8_t *)addr, g_usbd_dfu.buffer.d8, g_usbd_dfu.wlength); + + /* Send the status data over EP0 */ + memcpy(*data, g_usbd_dfu.buffer.d8, g_usbd_dfu.wlength); + *len = g_usbd_dfu.wlength; + } else /* unsupported g_usbd_dfu.wblock_num */ + { + g_usbd_dfu.dev_state = DFU_STATUS_ERR_STALLEDPKT; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + + /* Call the error management function (command will be NAKed */ + USB_LOG_ERR("Dfu_request_upload unsupported g_usbd_dfu.wblock_num\r\n"); + } + } + /* Unsupported state */ + else { + g_usbd_dfu.wlength = 0U; + g_usbd_dfu.wblock_num = 0U; + + /* Call the error management function (command will be NAKed */ + USB_LOG_ERR("Dfu_request_upload unsupported state\r\n"); + } + } + /* No Data setup request */ + else { + g_usbd_dfu.dev_state = DFU_STATE_DFU_IDLE; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + } +} + +static void dfu_request_dnload(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + /* Data setup request */ + struct usb_setup_packet *req = setup; + if (req->wLength > 0U) { + if ((g_usbd_dfu.dev_state == DFU_STATE_DFU_IDLE) || (g_usbd_dfu.dev_state == DFU_STATE_DFU_DNLOAD_IDLE)) { + /* Update the global length and block number */ + g_usbd_dfu.wblock_num = req->wValue; + g_usbd_dfu.wlength = MIN(req->wLength, USBD_DFU_XFER_SIZE); + + /* Update the state machine */ + g_usbd_dfu.dev_state = DFU_STATE_DFU_DNLOAD_SYNC; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + + /*!< Data has received complete */ + memcpy((uint8_t *)g_usbd_dfu.buffer.d8, (uint8_t *)*data, g_usbd_dfu.wlength); + /*!< Set flag = 1 Write the firmware to the flash in the next dfu_request_getstatus */ + g_usbd_dfu.firmwar_flag = 1; + } + /* Unsupported state */ + else { + USB_LOG_ERR("Dfu_request_dnload unsupported state\r\n"); + } + } + /* 0 Data DNLOAD request */ + else { + /* End of DNLOAD operation*/ + if ((g_usbd_dfu.dev_state == DFU_STATE_DFU_DNLOAD_IDLE) || (g_usbd_dfu.dev_state == DFU_STATE_DFU_IDLE)) { + g_usbd_dfu.manif_state = DFU_MANIFEST_IN_PROGRESS; + g_usbd_dfu.dev_state = DFU_STATE_DFU_MANIFEST_SYNC; + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + } else { + /* Call the error management function (command will be NAKed */ + USB_LOG_ERR("Dfu_request_dnload End of DNLOAD operation but dev_state %02x \r\n", g_usbd_dfu.dev_state); + } + } +} + +static int8_t dfu_getstatus_special_handler(void) +{ + uint32_t addr; + if (g_usbd_dfu.dev_state == DFU_STATE_DFU_DNLOAD_BUSY) { + /* Decode the Special Command */ + if (g_usbd_dfu.wblock_num == 0U) { + if (g_usbd_dfu.wlength == 1U) { + if (g_usbd_dfu.buffer.d8[0] == DFU_CMD_GETCOMMANDS) { + /* Nothing to do */ + } + } else if (g_usbd_dfu.wlength == 5U) { + if (g_usbd_dfu.buffer.d8[0] == DFU_CMD_SETADDRESSPOINTER) { + g_usbd_dfu.data_ptr = g_usbd_dfu.buffer.d8[1]; + g_usbd_dfu.data_ptr += (uint32_t)g_usbd_dfu.buffer.d8[2] << 8; + g_usbd_dfu.data_ptr += (uint32_t)g_usbd_dfu.buffer.d8[3] << 16; + g_usbd_dfu.data_ptr += (uint32_t)g_usbd_dfu.buffer.d8[4] << 24; + } else if (g_usbd_dfu.buffer.d8[0] == DFU_CMD_ERASE) { + g_usbd_dfu.data_ptr = g_usbd_dfu.buffer.d8[1]; + g_usbd_dfu.data_ptr += (uint32_t)g_usbd_dfu.buffer.d8[2] << 8; + g_usbd_dfu.data_ptr += (uint32_t)g_usbd_dfu.buffer.d8[3] << 16; + g_usbd_dfu.data_ptr += (uint32_t)g_usbd_dfu.buffer.d8[4] << 24; + + USB_LOG_DBG("Erase start add %08x \r\n", g_usbd_dfu.data_ptr); + /*!< Erase */ + dfu_erase_flash(g_usbd_dfu.data_ptr); + } else { + return -1; + } + } else { + /* Reset the global length and block number */ + g_usbd_dfu.wlength = 0U; + g_usbd_dfu.wblock_num = 0U; + /* Call the error management function (command will be NAKed) */ + USB_LOG_ERR("Reset the global length and block number\r\n"); + } + } + /* Regular Download Command */ + else { + if (g_usbd_dfu.wblock_num > 1U) { + /* Decode the required address */ + addr = ((g_usbd_dfu.wblock_num - 2U) * USBD_DFU_XFER_SIZE) + g_usbd_dfu.data_ptr; + + /* Perform the write operation */ + /* Write flash */ + USB_LOG_DBG("Write start add %08x length %d\r\n", addr, g_usbd_dfu.wlength); + dfu_write_flash(g_usbd_dfu.buffer.d8, (uint8_t *)addr, g_usbd_dfu.wlength); + } + } + + /* Reset the global length and block number */ + g_usbd_dfu.wlength = 0U; + g_usbd_dfu.wblock_num = 0U; + + /* Update the state machine */ + g_usbd_dfu.dev_state = DFU_STATE_DFU_DNLOAD_SYNC; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + } + return 0; +} + +static void dfu_request_getstatus(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + /*!< Determine whether to leave DFU mode */ + if (g_usbd_dfu.manif_state == DFU_MANIFEST_IN_PROGRESS && + g_usbd_dfu.dev_state == DFU_STATE_DFU_MANIFEST_SYNC && + g_usbd_dfu.dev_status[1] == 0U && + g_usbd_dfu.dev_status[2] == 0U && + g_usbd_dfu.dev_status[3] == 0U && + g_usbd_dfu.dev_status[4] == g_usbd_dfu.dev_state) { + g_usbd_dfu.manif_state = DFU_MANIFEST_COMPLETE; + + if ((0x0B & DFU_MANIFEST_MASK) != 0U) { + g_usbd_dfu.dev_state = DFU_STATE_DFU_MANIFEST_SYNC; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + return; + } else { + g_usbd_dfu.dev_state = DFU_STATE_DFU_MANIFEST_WAIT_RESET; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + /* Generate system reset to allow jumping to the user code */ + dfu_leave(); + } + } + + switch (g_usbd_dfu.dev_state) { + case DFU_STATE_DFU_DNLOAD_SYNC: + if (g_usbd_dfu.wlength != 0U) { + g_usbd_dfu.dev_state = DFU_STATE_DFU_DNLOAD_BUSY; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + + if ((g_usbd_dfu.wblock_num == 0U) && (g_usbd_dfu.buffer.d8[0] == DFU_CMD_ERASE)) { + dfu_getstatus(g_usbd_dfu.data_ptr, DFU_MEDIA_ERASE, g_usbd_dfu.dev_status); + } else { + dfu_getstatus(g_usbd_dfu.data_ptr, DFU_MEDIA_PROGRAM, g_usbd_dfu.dev_status); + } + } else /* (g_usbd_dfu.wlength==0)*/ + { + g_usbd_dfu.dev_state = DFU_STATE_DFU_DNLOAD_IDLE; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + } + break; + + case DFU_STATE_DFU_MANIFEST_SYNC: + if (g_usbd_dfu.manif_state == DFU_MANIFEST_IN_PROGRESS) { + g_usbd_dfu.dev_state = DFU_STATE_DFU_MANIFEST; + + g_usbd_dfu.dev_status[1] = 1U; /*bwPollTimeout = 1ms*/ + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + } else { + if ((g_usbd_dfu.manif_state == DFU_MANIFEST_COMPLETE) && + ((0x0B & DFU_MANIFEST_MASK) != 0U)) { + g_usbd_dfu.dev_state = DFU_STATE_DFU_IDLE; + + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + } + } + break; + + default: + break; + } + + /* Send the status data over EP0 */ + memcpy(*data, g_usbd_dfu.dev_status, 6); + *len = 6; + + if (g_usbd_dfu.firmwar_flag == 1) { + if (dfu_getstatus_special_handler() != 0) { + USB_LOG_ERR("dfu_getstatus_special_handler error \r\n"); + } + g_usbd_dfu.firmwar_flag = 0; + } +} + +static void dfu_request_clrstatus(void) +{ + if (g_usbd_dfu.dev_state == DFU_STATE_DFU_ERROR) { + g_usbd_dfu.dev_state = DFU_STATE_DFU_IDLE; + g_usbd_dfu.dev_status[0] = DFU_STATUS_OK; /* bStatus */ + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; /* bwPollTimeout=0ms */ + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; /* bState */ + g_usbd_dfu.dev_status[5] = 0U; /* iString */ + } else { + /* State Error */ + g_usbd_dfu.dev_state = DFU_STATE_DFU_ERROR; + g_usbd_dfu.dev_status[0] = DFU_STATUS_ERR_UNKNOWN; /* bStatus */ + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; /* bwPollTimeout=0ms */ + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; /* bState */ + g_usbd_dfu.dev_status[5] = 0U; /* iString */ + } +} + +static void dfu_request_getstate(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + /* Return the current state of the DFU interface */ + (*data)[0] = g_usbd_dfu.dev_state; + *len = 1; +} + +void dfu_request_abort(void) +{ + if ((g_usbd_dfu.dev_state == DFU_STATE_DFU_IDLE) || + (g_usbd_dfu.dev_state == DFU_STATE_DFU_DNLOAD_SYNC) || + (g_usbd_dfu.dev_state == DFU_STATE_DFU_DNLOAD_IDLE) || + (g_usbd_dfu.dev_state == DFU_STATE_DFU_MANIFEST_SYNC) || + (g_usbd_dfu.dev_state == DFU_STATE_DFU_UPLOAD_IDLE)) { + g_usbd_dfu.dev_state = DFU_STATE_DFU_IDLE; + g_usbd_dfu.dev_status[0] = DFU_STATUS_OK; + g_usbd_dfu.dev_status[1] = 0U; + g_usbd_dfu.dev_status[2] = 0U; + g_usbd_dfu.dev_status[3] = 0U; /* bwPollTimeout=0ms */ + g_usbd_dfu.dev_status[4] = g_usbd_dfu.dev_state; + g_usbd_dfu.dev_status[5] = 0U; /* iString */ + g_usbd_dfu.wblock_num = 0U; + g_usbd_dfu.wlength = 0U; + } +} + +static int dfu_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USB_LOG_DBG("DFU Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + switch (setup->bRequest) { + case DFU_REQUEST_DETACH: + dfu_request_detach(); + break; + case DFU_REQUEST_DNLOAD: + dfu_request_dnload(setup, data, len); + break; + case DFU_REQUEST_UPLOAD: + dfu_request_upload(setup, data, len); + break; + case DFU_REQUEST_GETSTATUS: + dfu_request_getstatus(setup, data, len); + break; + case DFU_REQUEST_CLRSTATUS: + dfu_request_clrstatus(); + break; + case DFU_REQUEST_GETSTATE: + dfu_request_getstate(setup, data, len); + break; + case DFU_REQUEST_ABORT: + dfu_request_abort(); + break; + default: + USB_LOG_WRN("Unhandled DFU Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + return 0; +} + +static void dfu_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + switch (event) { + case USBD_EVENT_RESET: + dfu_reset(); + break; + default: + break; + } +} + +struct usbd_interface *usbd_dfu_init_intf(struct usbd_interface *intf) +{ + intf->class_interface_handler = dfu_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = dfu_notify_handler; + + return intf; +} + +__WEAK uint8_t *dfu_read_flash(uint8_t *src, uint8_t *dest, uint32_t len) +{ + return dest; +} + +__WEAK uint16_t dfu_write_flash(uint8_t *src, uint8_t *dest, uint32_t len) +{ + return 0; +} + +__WEAK uint16_t dfu_erase_flash(uint32_t add) +{ + return 0; +} + +__WEAK void dfu_leave(void) +{ +} diff --git a/src/lib/CherryUSB/class/dfu/usbd_dfu.h b/src/lib/CherryUSB/class/dfu/usbd_dfu.h new file mode 100644 index 000000000..9081d0dda --- /dev/null +++ b/src/lib/CherryUSB/class/dfu/usbd_dfu.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_DFU_H +#define USBD_DFU_H + +#include "usb_dfu.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Init dfu interface driver */ +struct usbd_interface *usbd_dfu_init_intf(struct usbd_interface *intf); + +/* Interface functions that need to be implemented by the user */ +uint8_t *dfu_read_flash(uint8_t *src, uint8_t *dest, uint32_t len); +uint16_t dfu_write_flash(uint8_t *src, uint8_t *dest, uint32_t len); +uint16_t dfu_erase_flash(uint32_t add); +void dfu_leave(void); +#ifdef __cplusplus +} +#endif + +#endif /* USBD_DFU_H */ diff --git a/src/lib/CherryUSB/class/hid/usb_hid.h b/src/lib/CherryUSB/class/hid/usb_hid.h new file mode 100644 index 000000000..c96e38364 --- /dev/null +++ b/src/lib/CherryUSB/class/hid/usb_hid.h @@ -0,0 +1,669 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_HID_H +#define USB_HID_H + +/* Subclass codes (HID 4.2) */ +#define HID_SUBCLASS_NONE 0 /* No subclass */ +#define HID_SUBCLASS_BOOTIF 1 /* Boot Interface Subclass */ + +/* HID Protocol Codes (HID 4.3) */ +#define HID_PROTOCOL_NONE 0x00 +#define HID_PROTOCOL_BOOT 0x00 +#define HID_PROTOCOL_KEYBOARD 0x01 +#define HID_PROTOCOL_REPORT 0x01 +#define HID_PROTOCOL_MOUSE 0x02 + +/* HID Class Descriptor Types (HID 7.1) */ +#define HID_DESCRIPTOR_TYPE_HID 0x21 +#define HID_DESCRIPTOR_TYPE_HID_REPORT 0x22 +#define HID_DESCRIPTOR_TYPE_HID_PHYSICAL 0x23 + +/* HID Class Specific Requests (HID 7.2) */ +#define HID_REQUEST_GET_REPORT 0x01 +#define HID_REQUEST_GET_IDLE 0x02 +#define HID_REQUEST_GET_PROTOCOL 0x03 +#define HID_REQUEST_SET_REPORT 0x09 +#define HID_REQUEST_SET_IDLE 0x0A +#define HID_REQUEST_SET_PROTOCOL 0x0B + +/* Report Type (MS byte of wValue for GET_REPORT) (HID 7.2.1) */ +#define HID_REPORT_INPUT 0x01 +#define HID_REPORT_OUTPUT 0x02 +#define HID_REPORT_FEATURE 0x03 + +/* HID Descriptor ***********************************************************/ + +#define HID_COUNTRY_NONE 0x00 /* Not Supported */ +#define HID_COUNTRY_ARABIC 0x01 /* Arabic */ +#define HID_COUNTRY_BELGIAN 0x02 /* Belgian */ +#define HID_COUNTRY_CANADA 0x03 /* Canadian-Bilingual */ +#define HID_COUNTRY_CANADRFR 0x04 /* Canadian-French */ +#define HID_COUNTRY_CZECH 0x05 /* Czech Republic */ +#define HID_COUNTRY_DANISH 0x06 /* Danish */ +#define HID_COUNTRY_FINNISH 0x07 /* Finnish */ +#define HID_COUNTRY_FRENCH 0x08 /* French */ +#define HID_COUNTRY_GERMAN 0x09 /* German */ +#define HID_COUNTRY_GREEK 0x10 /* Greek */ +#define HID_COUNTRY_HEBREW 0x11 /* Hebrew */ +#define HID_COUNTRY_HUNGARY 0x12 /* Hungary */ +#define HID_COUNTRY_ISO 0x13 /* International (ISO) */ +#define HID_COUNTRY_ITALIAN 0x14 /* Italian */ +#define HID_COUNTRY_JAPAN 0x15 /* Japan (Katakana) */ +#define HID_COUNTRY_KOREAN 0x16 /* Korean */ +#define HID_COUNTRY_LATINAM 0x17 /* Latin American */ +#define HID_COUNTRY_DUTCH 0x18 /* Netherlands/Dutch */ +#define HID_COUNTRY_NORWEGIAN 0x19 /* Norwegian */ +#define HID_COUNTRY_PERSIAN 0x20 /* Persian (Farsi) */ +#define HID_COUNTRY_POLAND 0x21 /* Poland */ +#define HID_COUNTRY_PORTUGUESE 0x22 /* Portuguese */ +#define HID_COUNTRY_RUSSIA 0x23 /* Russia */ +#define HID_COUNTRY_SLOVAKIA 0x24 /* Slovakia */ +#define HID_COUNTRY_SPANISH 0x25 /* Spanish */ +#define HID_COUNTRY_SWEDISH 0x26 /* Swedish */ +#define HID_COUNTRY_SWISSFR 0x27 /* Swiss/French */ +#define HID_COUNTRY_SWISSGR 0x28 /* Swiss/German */ +#define HID_COUNTRY_SWITZERLAND 0x29 /* Switzerland */ +#define HID_COUNTRY_TAIWAN 0x30 /* Taiwan */ +#define HID_COUNTRY_TURKISHQ 0x31 /* Turkish-Q */ +#define HID_COUNTRY_UK 0x32 /* UK */ +#define HID_COUNTRY_US 0x33 /* US */ +#define HID_COUNTRY_YUGOSLAVIA 0x34 /* Yugoslavia */ +#define HID_COUNTRY_TURKISHF 0x35 /* Turkish-F */ + +/* HID report items */ +#define HID_REPORT_ITEM_SIZE_MASK 0x03 +#define HID_REPORT_ITEM_SIZE_0 0x00 /* No data follows */ +#define HID_REPORT_ITEM_SIZE_1 0x01 /* 1 byte of data follows */ +#define HID_REPORT_ITEM_SIZE_2 0x02 /* 2 bytes of data follow */ +#define HID_REPORT_ITEM_SIZE_4 0x03 /* 4 bytes of data follow */ +#define HID_REPORT_ITEM_TYPE_MASK 0x0c +#define HID_REPORT_ITEM_TYPE_MAIN 0x00 +#define HID_REPORT_ITEM_TYPE_GLOBAL 0x04 +#define HID_REPORT_ITEM_TYPE_LOCAL 0x08 +#define HID_REPORT_ITEM_TAG_MASK 0xf0 + +/* Main Items (HID 6.2.2.4) */ +#define HID_MAIN_ITEM_CONSTANT (1 << 0) /* Constant(1) vs Data(0) */ +#define HID_MAIN_ITEM_VARIABLE (1 << 1) /* Variable(1) vs Array(0) */ +#define HID_MAIN_ITEM_RELATIVE (1 << 2) /* Relative(1) vs Absolute(0) */ +#define HID_MAIN_ITEM_WRAP (1 << 3) /* Wrap(1) vs No Wrap(0) */ +#define HID_MAIN_ITEM_NONLINEAR (1 << 4) /* Non Linear(1) vs Linear(0) */ +#define HID_MAIN_ITEM_NOPREFERRED (1 << 5) /* No Preferred (1) vs Preferred State(0) */ +#define HID_MAIN_ITEM_NULLSTATE (1 << 6) /* Null state(1) vs No Null position(0) */ +#define HID_MAIN_ITEM_VOLATILE (1 << 7) /* Volatile(1) vs Non volatile(0) */ +#define HID_MAIN_ITEM_BUFFEREDBYTES (1 << 8) /* Buffered Bytes(1) vs Bit Field(0) */ + +#define HID_MAIN_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK) +#define HID_MAIN_ITEM_INPUT_PREFIX 0x80 +#define HID_MAIN_ITEM_INPUT_CONSTANT HID_MAIN_ITEM_CONSTANT +#define HID_MAIN_ITEM_INPUT_VARIABLE HID_MAIN_ITEM_VARIABLE +#define HID_MAIN_ITEM_INPUT_RELATIVE HID_MAIN_ITEM_RELATIVE +#define HID_MAIN_ITEM_INPUT_WRAP HID_MAIN_ITEM_WRAP +#define HID_MAIN_ITEM_INPUT_NONLINEAR HID_MAIN_ITEM_NONLINEAR +#define HID_MAIN_ITEM_INPUT_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED +#define HID_MAIN_ITEM_INPUT_NULLSTATE HID_MAIN_ITEM_NULLSTATE +#define HID_MAIN_ITEM_INPUT_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES + +#define HID_MAIN_ITEM_OUTPUT_PREFIX 0x90 +#define HID_MAIN_ITEM_OUTPUT_CONSTANT HID_MAIN_ITEM_CONSTANT +#define HID_MAIN_ITEM_OUTPUT_VARIABLE HID_MAIN_ITEM_VARIABLE +#define HID_MAIN_ITEM_OUTPUT_RELATIVE HID_MAIN_ITEM_RELATIVE +#define HID_MAIN_ITEM_OUTPUT_WRAP HID_MAIN_ITEM_WRAP +#define HID_MAIN_ITEM_OUTPUT_NONLINEAR HID_MAIN_ITEM_NONLINEAR +#define HID_MAIN_ITEM_OUTPUT_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED +#define HID_MAIN_ITEM_OUTPUT_NULLSTATE HID_MAIN_ITEM_NULLSTATE +#define HID_MAIN_ITEM_OUTPUT_VOLATILE HID_MAIN_ITEM_VOLATILE +#define HID_MAIN_ITEM_OUTPUT_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES + +#define HID_MAIN_ITEM_FEATURE_PREFIX 0xb0 +#define HID_MAIN_ITEM_FEATURE_CONSTANT HID_MAIN_ITEM_CONSTANT +#define HID_MAIN_ITEM_FEATURE_VARIABLE HID_MAIN_ITEM_VARIABLE +#define HID_MAIN_ITEM_FEATURE_RELATIVE HID_MAIN_ITEM_RELATIVE +#define HID_MAIN_ITEM_FEATURE_WRAP HID_MAIN_ITEM_WRAP +#define HID_MAIN_ITEM_FEATURE_NONLINEAR HID_MAIN_ITEM_NONLINEAR +#define HID_MAIN_ITEM_FEATURE_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED +#define HID_MAIN_ITEM_FEATURE_NULLSTATE HID_MAIN_ITEM_NULLSTATE +#define HID_MAIN_ITEM_FEATURE_VOLATILE HID_MAIN_ITEM_VOLATILE +#define HID_MAIN_ITEM_FEATURE_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES + +#define HID_MAIN_ITEM_COLLECTION_PREFIX 0xa0 +#define HID_MAIN_ITEM_COLLECTION_PHYSICAL 0x00 /* Physical (group of axes) */ +#define HID_MAIN_ITEM_COLLECTION_APPL 0x01 /* Application (mouse, keyboard) */ +#define HID_MAIN_ITEM_COLLECTION_LOGICAL 0x02 /* Logical (interrelated data) */ +#define HID_MAIN_ITEM_COLLECTION_REPORT 0x03 /* Report */ +#define HID_MAIN_ITEM_COLLECTION_ARRAY 0x04 /* Named Array */ +#define HID_MAIN_ITEM_COLLECTION_SWITCH 0x05 /* Usage Switch */ +#define HID_MAIN_ITEM_COLLECTION_MODIFIER 0x06 /* Usage Modifier */ +#define HID_MAIN_ITEM_ENDCOLLECTION_PREFIX 0xc0 + +/* Global Items (HID 6.2.2.7) */ +#define HID_GLOBAL_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK) +#define HID_GLOBAL_ITEM_USAGEPAGE_PREFIX 0x04 /* Usage Page */ +#define HID_GLOBAL_ITEM_LOGICALMIN_PREFIX 0x14 /* Logical Minimum */ +#define HID_GLOBAL_ITEM_LOGICALMAX_PREFIX 0x24 /* Logical Maximum */ +#define HID_GLOBAL_ITEM_PHYSICALMIN_PREFIX 0x34 /* Physical Minimum */ +#define HID_GLOBAL_ITEM_PHYSMICALAX_PREFIX 0x44 /* Physical Maximum */ +#define HID_GLOBAL_ITEM_UNITEXP_PREFIX 0x54 /* Unit Exponent */ +#define HID_GLOBAL_ITEM_UNIT_PREFIX 0x64 /* Unit */ +#define HID_GLOBAL_ITEM_REPORTSIZE_PREFIX 0x74 /* Report Size */ +#define HID_GLOBAL_ITEM_REPORTID_PREFIX 0x84 /* Report ID */ +#define HID_GLOBAL_ITEM_REPORTCOUNT_PREFIX 0x94 /* Report Count */ +#define HID_GLOBAL_ITEM_PUSH_PREFIX 0xa4 /* Push */ +#define HID_GLOBAL_ITEM_POP_PREFIX 0xb4 /* Pop */ + +/* Local Items (HID 6.2.2.8) */ +#define HID_LOCAL_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK) +#define HID_LOCAL_ITEM_USAGE_PREFIX 0x08 /* Usage */ +#define HID_LOCAL_ITEM_USAGEMIN_PREFIX 0x18 /* Usage Minimum */ +#define HID_LOCAL_ITEM_USAGEMAX_PREFIX 0x28 /* Usage Maximum */ +#define HID_LOCAL_ITEM_DESIGNATORIDX_PREFIX 0x38 /* Designator Index */ +#define HID_LOCAL_ITEM_DESIGNATORMIN_PREFIX 0x48 /* Designator Minimum */ +#define HID_LOCAL_ITEM_DESIGNATORMAX_PREFIX 0x58 /* Designator Maximum */ +#define HID_LOCAL_ITEM_STRINGIDX_PREFIX 0x78 /* String Index */ +#define HID_LOCAL_ITEM_STRINGMIN_PREFIX 0x88 /* String Minimum */ +#define HID_LOCAL_ITEM_STRINGMAX_PREFIX 0x98 /* xx */ +#define HID_LOCAL_ITEM_DELIMITER_PREFIX 0xa8 /* Delimiter */ + +/* Modifier Keys (HID 8.3) */ +#define HID_MODIFIER_LCTRL (1 << 0) /* Left Ctrl */ +#define HID_MODIFIER_LSHIFT (1 << 1) /* Left Shift */ +#define HID_MODIFIER_LALT (1 << 2) /* Left Alt */ +#define HID_MODIFIER_LGUI (1 << 3) /* Left GUI */ +#define HID_MODIFIER_RCTRL (1 << 4) /* Right Ctrl */ +#define HID_MODIFIER_RSHIFT (1 << 5) /* Right Shift */ +#define HID_MODIFIER_RALT (1 << 6) /* Right Alt */ +#define HID_MODIFIER_RGUI (1 << 7) /* Right GUI */ + +/* Keyboard output report (1 byte) (HID B.1) */ +#define HID_KBD_OUTPUT_REPORT_NUMLOCK (1 << 0) +#define HID_KBD_OUTPUT_REPORT_CAPSLOCK (1 << 1) +#define HID_KBD_OUTPUT_REPORT_SCROLLLOCK (1 << 2) +#define HID_KBD_OUTPUT_REPORT_COMPOSE (1 << 3) +#define HID_KBD_OUTPUT_REPORT_KANA (1 << 4) + +/* Mouse input report (HID B.2) */ +#define HID_MOUSE_INPUT_REPORT_BUTTON1 (1 << 0) +#define HID_MOUSE_INPUT_REPORT_BUTTON2 (1 << 1) +#define HID_MOUSE_INPUT_REPORT_BUTTON3 (1 << 2) +#define HID_MOUSE_INPUT_REPORT_BUTTON_MASK (7) + +#define HID_MOUSE_INPUT_BUTTON_LEFT (1 << 0) +#define HID_MOUSE_INPUT_BUTTON_RIGHT (1 << 1) +#define HID_MOUSE_INPUT_BUTTON_MIDDLE (1 << 2) +#define HID_MOUSE_INPUT_BUTTON_BACKWARD (1 << 3) +#define HID_MOUSE_INPUT_BUTTON_FORWARD (1 << 4) + +/* Joystick input report (4 bytes) (HID D.1) */ +#define HID_JS_INPUT_REPORT_HATSWITCH_SHIFT (0) +#define HID_JS_INPUT_REPORT_HATSWITCH_MASK (15 << HID_JSIN_HATSWITCH_SHIFT) +#define HID_JS_INPUT_REPORT_BUTTON1 (1 << 4) +#define HID_JS_INPUT_REPORT_BUTTON2 (1 << 5) +#define HID_JS_INPUT_REPORT_BUTTON3 (1 << 6) +#define HID_JS_INPUT_REPORT_BUTTON4 (1 << 7) + +/* Usage pages (HuT 3) */ +#define HID_USAGE_PAGE_UNDEFINED 0x00 /* Undefined */ +#define HID_USAGE_PAGE_GENERIC_DCTRL 0x01 /* Generic Desktop Controls */ +#define HID_USAGE_PAGE_SIMCTRL 0x02 /* Simulation Controls */ +#define HID_USAGE_PAGE_VRCTRL 0x03 /* VR Controls */ +#define HID_USAGE_PAGE_SPORTCTRL 0x04 /* Sport Controls */ +#define HID_USAGE_PAGE_GAMECTRL 0x05 /* Game Controls */ +#define HID_USAGE_PAGE_GENERIC_DEVCTRL 0x06 /* Generic Device Controls */ +#define HID_USAGE_PAGE_KBD 0x07 /* Keyboard/Keypad */ +#define HID_USAGE_PAGE_LEDS 0x08 /* LEDs */ +#define HID_USAGE_PAGE_BUTTON 0x09 /* Button */ +#define HID_USAGE_PAGE_ORDINAL 0x0a /* Ordinal */ +#define HID_USAGE_PAGE_TELEPHONY 0x0b /* Telephony */ +#define HID_USAGE_PAGE_CONSUMER 0x0c /* Consumer */ +#define HID_USAGE_PAGE_DIGITIZER 0x0d /* Digitizer */ + /* 0x0e Reserved */ +#define HID_USAGE_PAGE_PIDPAGE 0x0f /* PID Page Physical Interface Device */ +#define HID_USAGE_PAGE_UNICODE 0x10 /* Unicode */ + /* 0x11-13 Reserved */ +#define HID_USAGE_PAGE_ALPHA_DISPLAY 0x14 /* Alphanumeric Display */ + /* 0x15-3f Reserved */ +#define HID_USAGE_PAGE_MEDICAL 0x40 /* Medical Instruments */ + /* 0x41-7f Reserved */ + /* 0x80-83 Monitor Devices */ + /* 0x84-87 Power Devices */ + /* 0x88-8b Reserved */ +#define HID_USAGE_PAGE_BARCODE_SCANNER 0x8c /* Bar Code Scanner page */ +#define HID_USAGE_PAGE_SCALE 0x8d /* Scale page */ +#define HID_USAGE_PAGE_MSR 0x8e /* Magnetic Stripe Reading (MSR) Devices */ +#define HID_USAGE_PAGE_POS 0x8f /* Point of Sale devices */ +#define HID_USAGE_PAGE_CAMERA_CTRL 0x90 /* Camera Control Page */ + +/* Generic Desktop Page Usage IDs (HuT 4) */ +#define HID_DESKTOP_USAGE_UNDEFINED 0x00 /* Undefined */ +#define HID_DESKTOP_USAGE_POINTER 0x01 /* Pointer */ +#define HID_DESKTOP_USAGE_MOUSE 0x02 /* Mouse */ + /* 0x03 Reserved */ +#define HID_DESKTOP_USAGE_JOYSTICK 0x04 /* Joystick */ +#define HID_DESKTOP_USAGE_GAMEPAD 0x05 /* Game Pad */ +#define HID_DESKTOP_USAGE_KEYBOARD 0x06 /* Keyboard */ +#define HID_DESKTOP_USAGE_KEYPAD 0x07 /* Keypad */ +#define HID_DESKTOP_USAGE_MULTIAXIS 0x08 /* Multi-axis Controller */ +#define HID_DESKTOP_USAGE_TABLET 0x09 /* Tablet PC System Controls */ + /* 0x0a-2f Reserved */ +#define HID_DESKTOP_USAGE_X 0x30 /* X */ +#define HID_DESKTOP_USAGE_Y 0x31 /* Y */ +#define HID_DESKTOP_USAGE_Z 0x32 /* Z */ +#define HID_DESKTOP_USAGE_RX 0x33 /* Rx */ +#define HID_DESKTOP_USAGE_RY 0x34 /* Ry */ +#define HID_DESKTOP_USAGE_RZ 0x35 /* Rz */ +#define HID_DESKTOP_USAGE_SLIDER 0x36 /* Slider */ +#define HID_DESKTOP_USAGE_DIAL 0x37 /* Dial */ +#define HID_DESKTOP_USAGE_WHEEL 0x38 /* Wheel */ +#define HID_DESKTOP_USAGE_HATSWITCH 0x39 /* Hat switch */ +#define HID_DESKTOP_USAGE_COUNTED 0x3a /* Counted Buffer */ +#define HID_DESKTOP_USAGE_BYTECOUNT 0x3b /* Byte Count */ +#define HID_DESKTOP_USAGE_MOTION 0x3c /* Motion Wakeup */ +#define HID_DESKTOP_USAGE_START 0x3d /* Start */ +#define HID_DESKTOP_USAGE_SELECT 0x3e /* Select */ + /* 0x3f Reserved */ +#define HID_DESKTOP_USAGE_VX 0x40 /* Vx */ +#define HID_DESKTOP_USAGE_VY 0x41 /* Vy */ +#define HID_DESKTOP_USAGE_VZ 0x42 /* Vz */ +#define HID_DESKTOP_USAGE_VBRX 0x43 /* Vbrx */ +#define HID_DESKTOP_USAGE_VBRY 0x44 /* Vbry */ +#define HID_DESKTOP_USAGE_VBRZ 0x45 /* Vbrz */ +#define HID_DESKTOP_USAGE_VNO 0x46 /* Vno */ +#define HID_DESKTOP_USAGE_FEATURE 0x47 /* Feature Notification */ +#define HID_DESKTOP_USAGE_RESOLUTION 0x48 /* Resolution Multiplier */ + /* 0x49-7f Reserved */ +#define HID_DESKTOP_USAGE_CONTROL 0x80 /* System Control */ +#define HID_DESKTOP_USAGE_POWERDOWN 0x81 /* System Power Down */ +#define HID_DESKTOP_USAGE_SLEEP 0x82 /* System Sleep */ +#define HID_DESKTOP_USAGE_WAKEUP 0x83 /* System Wake Up */ +#define HID_DESKTOP_USAGE_CONTEXT_MENU 0x84 /* System Context Menu */ +#define HID_DESKTOP_USAGE_MAIN_MENU 0x85 /* System Main Menu */ +#define HID_DESKTOP_USAGE_APP_MENU 0x86 /* System App Menu */ +#define HID_DESKTOP_USAGE_MENU_HELP 0x87 /* System Menu Help */ +#define HID_DESKTOP_USAGE_MENU_EXIT 0x88 /* System Menu Exit */ +#define HID_DESKTOP_USAGE_MENU_SELECT 0x89 /* System Menu Select */ +#define HID_DESKTOP_USAGE_MENU_RIGHT 0x8a /* System Menu Right */ +#define HID_DESKTOP_USAGE_MENU_LEFT 0x8b /* System Menu Left */ +#define HID_DESKTOP_USAGE_MENU_UP 0x8c /* System Menu Up */ +#define HID_DESKTOP_USAGE_MENU_DOWN 0x8d /* System Menu Down */ +#define HID_DESKTOP_USAGE_COLD_RESTART 0x8e /* System Cold Restart */ +#define HID_DESKTOP_USAGE_WARM_RESTART 0x8f /* System Warm Restart */ +#define HID_DESKTOP_USAGE_DPAD_UP 0x90 /* D-pad Up */ +#define HID_DESKTOP_USAGE_DPAD_DOWN 0x91 /* D-pad Down */ +#define HID_DESKTOP_USAGE_DPAD_RIGHT 0x92 /* D-pad Right */ +#define HID_DESKTOP_USAGE_DPAD_LEFT 0x93 /* D-pad Left */ + /* 0x94-9f Reserved */ +#define HID_DESKTOP_USAGE_DOCK 0xa0 /* System Dock */ +#define HID_DESKTOP_USAGE_UNDOCK 0xa1 /* System Undock */ +#define HID_DESKTOP_USAGE_SETUP 0xa2 /* System Setup */ +#define HID_DESKTOP_USAGE_BREAK 0xa3 /* System Break */ +#define HID_DESKTOP_USAGE_DEBUG_BREAK 0xa4 /* System Debugger Break */ +#define HID_DESKTOP_USAGE_APP_BREAK 0xa5 /* Application Break */ +#define HID_DESKTOP_USAGE_APP_DEBUG_BREAK 0xa6 /* Application Debugger Break */ +#define HID_DESKTOP_USAGE_MUTE 0xa7 /* System Speaker Mute */ +#define HID_DESKTOP_USAGE_HIBERNATE 0xa8 /* System Hibernate */ + /* 0xa9-af Reserved */ +#define HID_DESKTOP_USAGE_DISPLAY_INVERT 0xb0 /* System Display Invert */ +#define HID_DESKTOP_USAGE_DISPALY_INTERNAL 0xb1 /* System Display Internal */ +#define HID_DESKTOP_USAGE_DISPLAY_EXTERNAL 0xb2 /* System Display External */ +#define HID_DESKTOP_USAGE_DISPLAY_BOTH 0xb3 /* System Display Both */ +#define HID_DESKTOP_USAGE_DISPLAY_DUAL 0xb4 /* System Display Dual */ +#define HID_DESKTOP_USAGE_DISPLAY_TOGGLE 0xb5 /* System Display Toggle Int/Ext */ +#define HID_DESKTOP_USAGE_DISPLAY_SWAP 0xb6 /* System Display Swap */ +#define HID_DESKTOP_USAGE_ 0xb7 /* System Display LCD Autoscale */ + /* 0xb8-ffff Reserved */ + +/* Keyboard usage IDs (HuT 10) */ +#define HID_KBD_USAGE_NONE 0x00 /* Reserved (no event indicated) */ +#define HID_KBD_USAGE_ERRORROLLOVER 0x01 /* Keyboard ErrorRollOver */ +#define HID_KBD_USAGE_POSTFAIL 0x02 /* Keyboard POSTFail */ +#define HID_KBD_USAGE_ERRUNDEF 0x03 /* Keyboard ErrorUndefined */ +#define HID_KBD_USAGE_A 0x04 /* Keyboard a or A (B-Z follow) */ +#define HID_KBD_USAGE_1 0x1e /* Keyboard 1 (2-9 follow) */ +#define HID_KBD_USAGE_EXCLAM 0x1e /* Keyboard 1 and ! */ +#define HID_KBD_USAGE_AT 0x1f /* Keyboard 2 and @ */ +#define HID_KBD_USAGE_POUND 0x20 /* Keyboard 3 and # */ +#define HID_KBD_USAGE_DOLLAR 0x21 /* Keyboard 4 and $ */ +#define HID_KBD_USAGE_PERCENT 0x22 /* Keyboard 5 and % */ +#define HID_KBD_USAGE_CARAT 0x23 /* Keyboard 6 and ^ */ +#define HID_KBD_USAGE_AMPERSAND 0x24 /* Keyboard 7 and & */ +#define HID_KBD_USAGE_ASTERISK 0x25 /* Keyboard 8 and * */ +#define HID_KBD_USAGE_LPAREN 0x26 /* Keyboard 9 and ( */ +#define HID_KBD_USAGE_0 0x27 /* Keyboard 0 and ) */ +#define HID_KBD_USAGE_RPAREN 0x27 /* Keyboard 0 and ) */ +#define HID_KBD_USAGE_ENTER 0x28 /* Keyboard Return (ENTER) */ +#define HID_KBD_USAGE_ESCAPE 0x29 /* Keyboard ESCAPE */ +#define HID_KBD_USAGE_DELETE 0x2a /* Keyboard DELETE (Backspace) */ +#define HID_KBD_USAGE_TAB 0x2b /* Keyboard Tab */ +#define HID_KBD_USAGE_SPACE 0x2c /* Keyboard Spacebar */ +#define HID_KBD_USAGE_HYPHEN 0x2d /* Keyboard - and (underscore) */ +#define HID_KBD_USAGE_UNDERSCORE 0x2d /* Keyboard - and (underscore) */ +#define HID_KBD_USAGE_EQUAL 0x2e /* Keyboard = and + */ +#define HID_KBD_USAGE_PLUS 0x2e /* Keyboard = and + */ +#define HID_KBD_USAGE_LBRACKET 0x2f /* Keyboard [ and { */ +#define HID_KBD_USAGE_LBRACE 0x2f /* Keyboard [ and { */ +#define HID_KBD_USAGE_RBRACKET 0x30 /* Keyboard ] and } */ +#define HID_KBD_USAGE_RBRACE 0x30 /* Keyboard ] and } */ +#define HID_KBD_USAGE_BSLASH 0x31 /* Keyboard \ and | */ +#define HID_KBD_USAGE_VERTBAR 0x31 /* Keyboard \ and | */ +#define HID_KBD_USAGE_NONUSPOUND 0x32 /* Keyboard Non-US # and ~ */ +#define HID_KBD_USAGE_TILDE 0x32 /* Keyboard Non-US # and ~ */ +#define HID_KBD_USAGE_SEMICOLON 0x33 /* Keyboard ; and : */ +#define HID_KBD_USAGE_COLON 0x33 /* Keyboard ; and : */ +#define HID_KBD_USAGE_SQUOTE 0x34 /* Keyboard ' and " */ +#define HID_KBD_USAGE_DQUOUTE 0x34 /* Keyboard ' and " */ +#define HID_KBD_USAGE_GACCENT 0x35 /* Keyboard Grave Accent and Tilde */ +#define HID_KBD_USAGE_GTILDE 0x35 /* Keyboard Grave Accent and Tilde */ +#define HID_KBD_USAGE_COMMON 0x36 /* Keyboard , and < */ +#define HID_KBD_USAGE_LT 0x36 /* Keyboard , and < */ +#define HID_KBD_USAGE_PERIOD 0x37 /* Keyboard . and > */ +#define HID_KBD_USAGE_GT 0x37 /* Keyboard . and > */ +#define HID_KBD_USAGE_DIV 0x38 /* Keyboard / and ? */ +#define HID_KBD_USAGE_QUESTION 0x38 /* Keyboard / and ? */ +#define HID_KBD_USAGE_CAPSLOCK 0x39 /* Keyboard Caps Lock */ +#define HID_KBD_USAGE_F1 0x3a /* Keyboard F1 */ +#define HID_KBD_USAGE_F2 0x3b /* Keyboard F2 */ +#define HID_KBD_USAGE_F3 0x3c /* Keyboard F3 */ +#define HID_KBD_USAGE_F4 0x3d /* Keyboard F4 */ +#define HID_KBD_USAGE_F5 0x3e /* Keyboard F5 */ +#define HID_KBD_USAGE_F6 0x3f /* Keyboard F6 */ +#define HID_KBD_USAGE_F7 0x40 /* Keyboard F7 */ +#define HID_KBD_USAGE_F8 0x41 /* Keyboard F8 */ +#define HID_KBD_USAGE_F9 0x42 /* Keyboard F9 */ +#define HID_KBD_USAGE_F10 0x43 /* Keyboard F10 */ +#define HID_KBD_USAGE_F11 0x44 /* Keyboard F11 */ +#define HID_KBD_USAGE_F12 0x45 /* Keyboard F12 */ +#define HID_KBD_USAGE_PRINTSCN 0x46 /* Keyboard PrintScreen */ +#define HID_KBD_USAGE_SCROLLLOCK 0x47 /* Keyboard Scroll Lock */ +#define HID_KBD_USAGE_PAUSE 0x48 /* Keyboard Pause */ +#define HID_KBD_USAGE_INSERT 0x49 /* Keyboard Insert */ +#define HID_KBD_USAGE_HOME 0x4a /* Keyboard Home */ +#define HID_KBD_USAGE_PAGEUP 0x4b /* Keyboard PageUp */ +#define HID_KBD_USAGE_DELFWD 0x4c /* Keyboard Delete Forward */ +#define HID_KBD_USAGE_END 0x4d /* Keyboard End */ +#define HID_KBD_USAGE_PAGEDOWN 0x4e /* Keyboard PageDown */ +#define HID_KBD_USAGE_RIGHT 0x4f /* eyboard RightArrow */ +#define HID_KBD_USAGE_LEFT 0x50 /* Keyboard LeftArrow */ +#define HID_KBD_USAGE_DOWN 0x51 /* Keyboard DownArrow */ +#define HID_KBD_USAGE_UP 0x52 /* Keyboard UpArrow */ +#define HID_KBD_USAGE_KPDNUMLOCK 0x53 /* Keypad Num Lock and Clear */ +#define HID_KBD_USAGE_KPDNUMLOCKCLEAR 0x53 /* Keypad Num Lock and Clear */ +#define HID_KBD_USAGE_KPDDIV 0x54 /* Keypad / */ +#define HID_KBD_USAGE_KPDMUL 0x55 /* Keypad * */ +#define HID_KBD_USAGE_KPDHMINUS 0x56 /* Keypad - */ +#define HID_KBD_USAGE_KPDPLUS 0x57 /* Keypad + */ +#define HID_KBD_USAGE_KPDEMTER 0x58 /* Keypad ENTER */ +#define HID_KBD_USAGE_KPD1 0x59 /* Keypad 1 (2-9 follow) */ +#define HID_KBD_USAGE_KPDEND 0x59 /* Keypad 1 and End */ +#define HID_KBD_USAGE_KPDDOWN 0x5a /* Keypad 2 and Down Arrow */ +#define HID_KBD_USAGE_KPDPAGEDN 0x5b /* Keypad 3 and PageDn */ +#define HID_KBD_USAGE_KPDLEFT 0x5c /* Keypad 4 and Left Arrow */ +#define HID_KBD_USAGE_KPDRIGHT 0x5e /* Keypad 6 and Right Arrow */ +#define HID_KBD_USAGE_KPDHOME 0x5f /* Keypad 7 and Home */ +#define HID_KBD_USAGE_KPDUP 0x60 /* Keypad 8 and Up Arrow */ +#define HID_KBD_USAGE_KPDPAGEUP 0x61 /* Keypad 9 and PageUp */ +#define HID_KBD_USAGE_KPD0 0x62 /* Keypad 0 and Insert */ +#define HID_KBD_USAGE_KPDINSERT 0x62 /* Keypad 0 and Insert */ +#define HID_KBD_USAGE_KPDDECIMALPT 0x63 /* Keypad . and Delete */ +#define HID_KBD_USAGE_KPDDELETE 0x63 /* Keypad . and Delete */ +#define HID_KBD_USAGE_NONSLASH 0x64 /* Keyboard Non-US \ and | */ +#define HID_KBD_USAGE_NONUSVERT 0x64 /* Keyboard Non-US \ and | */ +#define HID_KBD_USAGE_APPLICATION 0x65 /* Keyboard Application */ +#define HID_KBD_USAGE_POWER 0x66 /* Keyboard Power */ +#define HID_KBD_USAGE_KPDEQUAL 0x67 /* Keypad = */ +#define HID_KBD_USAGE_F13 0x68 /* Keyboard F13 */ +#define HID_KBD_USAGE_F14 0x69 /* Keyboard F14 */ +#define HID_KBD_USAGE_F15 0x6a /* Keyboard F15 */ +#define HID_KBD_USAGE_F16 0x6b /* Keyboard F16 */ +#define HID_KBD_USAGE_F17 0x6c /* Keyboard F17 */ +#define HID_KBD_USAGE_F18 0x6d /* Keyboard F18 */ +#define HID_KBD_USAGE_F19 0x6e /* Keyboard F19 */ +#define HID_KBD_USAGE_F20 0x6f /* Keyboard F20 */ +#define HID_KBD_USAGE_F21 0x70 /* Keyboard F21 */ +#define HID_KBD_USAGE_F22 0x71 /* Keyboard F22 */ +#define HID_KBD_USAGE_F23 0x72 /* Keyboard F23 */ +#define HID_KBD_USAGE_F24 0x73 /* Keyboard F24 */ +#define HID_KBD_USAGE_EXECUTE 0x74 /* Keyboard Execute */ +#define HID_KBD_USAGE_HELP 0x75 /* Keyboard Help */ +#define HID_KBD_USAGE_MENU 0x76 /* Keyboard Menu */ +#define HID_KBD_USAGE_SELECT 0x77 /* Keyboard Select */ +#define HID_KBD_USAGE_STOP 0x78 /* Keyboard Stop */ +#define HID_KBD_USAGE_AGAIN 0x79 /* Keyboard Again */ +#define HID_KBD_USAGE_UNDO 0x7a /* Keyboard Undo */ +#define HID_KBD_USAGE_CUT 0x7b /* Keyboard Cut */ +#define HID_KBD_USAGE_COPY 0x7c /* Keyboard Copy */ +#define HID_KBD_USAGE_PASTE 0x7d /* Keyboard Paste */ +#define HID_KBD_USAGE_FIND 0x7e /* Keyboard Find */ +#define HID_KBD_USAGE_MUTE 0x7f /* Keyboard Mute */ +#define HID_KBD_USAGE_VOLUP 0x80 /* Keyboard Volume Up */ +#define HID_KBD_USAGE_VOLDOWN 0x81 /* Keyboard Volume Down */ +#define HID_KBD_USAGE_LCAPSLOCK 0x82 /* Keyboard Locking Caps Lock */ +#define HID_KBD_USAGE_LNUMLOCK 0x83 /* Keyboard Locking Num Lock */ +#define HID_KBD_USAGE_LSCROLLLOCK 0x84 /* Keyboard Locking Scroll Lock */ +#define HID_KBD_USAGE_KPDCOMMA 0x85 /* Keypad Comma */ +#define HID_KBD_USAGE_KPDEQUALSIGN 0x86 /* Keypad Equal Sign */ +#define HID_KBD_USAGE_INTERNATIONAL1 0x87 /* Keyboard International 1 */ +#define HID_KBD_USAGE_INTERNATIONAL2 0x88 /* Keyboard International 2 */ +#define HID_KBD_USAGE_INTERNATIONAL3 0x89 /* Keyboard International 3 */ +#define HID_KBD_USAGE_INTERNATIONAL4 0x8a /* Keyboard International 4 */ +#define HID_KBD_USAGE_INTERNATIONAL5 0x8b /* Keyboard International 5 */ +#define HID_KBD_USAGE_INTERNATIONAL6 0x8c /* Keyboard International 6 */ +#define HID_KBD_USAGE_INTERNATIONAL7 0x8d /* Keyboard International 7 */ +#define HID_KBD_USAGE_INTERNATIONAL8 0x8e /* Keyboard International 8 */ +#define HID_KBD_USAGE_INTERNATIONAL9 0x8f /* Keyboard International 9 */ +#define HID_KBD_USAGE_LANG1 0x90 /* Keyboard LANG1 */ +#define HID_KBD_USAGE_LANG2 0x91 /* Keyboard LANG2 */ +#define HID_KBD_USAGE_LANG3 0x92 /* Keyboard LANG3 */ +#define HID_KBD_USAGE_LANG4 0x93 /* Keyboard LANG4 */ +#define HID_KBD_USAGE_LANG5 0x94 /* Keyboard LANG5 */ +#define HID_KBD_USAGE_LANG6 0x95 /* Keyboard LANG6 */ +#define HID_KBD_USAGE_LANG7 0x96 /* Keyboard LANG7 */ +#define HID_KBD_USAGE_LANG8 0x97 /* Keyboard LANG8 */ +#define HID_KBD_USAGE_LANG9 0x98 /* Keyboard LANG9 */ +#define HID_KBD_USAGE_ALTERASE 0x99 /* Keyboard Alternate Erase */ +#define HID_KBD_USAGE_SYSREQ 0x9a /* Keyboard SysReq/Attention */ +#define HID_KBD_USAGE_CANCEL 0x9b /* Keyboard Cancel */ +#define HID_KBD_USAGE_CLEAR 0x9c /* Keyboard Clear */ +#define HID_KBD_USAGE_PRIOR 0x9d /* Keyboard Prior */ +#define HID_KBD_USAGE_RETURN 0x9e /* Keyboard Return */ +#define HID_KBD_USAGE_SEPARATOR 0x9f /* Keyboard Separator */ +#define HID_KBD_USAGE_OUT 0xa0 /* Keyboard Out */ +#define HID_KBD_USAGE_OPER 0xa1 /* Keyboard Oper */ +#define HID_KBD_USAGE_CLEARAGAIN 0xa2 /* Keyboard Clear/Again */ +#define HID_KBD_USAGE_CLRSEL 0xa3 /* Keyboard CrSel/Props */ +#define HID_KBD_USAGE_EXSEL 0xa4 /* Keyboard ExSel */ +#define HID_KBD_USAGE_KPD00 0xb0 /* Keypad 00 */ +#define HID_KBD_USAGE_KPD000 0xb1 /* Keypad 000 */ +#define HID_KBD_USAGE_THOUSEPARATOR 0xb2 /* Thousands Separator */ +#define HID_KBD_USAGE_DECSEPARATOR 0xb3 /* Decimal Separator */ +#define HID_KBD_USAGE_CURRUNIT 0xb4 /* Currency Unit */ +#define HID_KBD_USAGE_CURRSUBUNIT 0xb5 /* Currency Sub-unit */ +#define HID_KBD_USAGE_KPDLPAREN 0xb6 /* Keypad ( */ +#define HID_KBD_USAGE_KPDRPAREN 0xb7 /* Keypad ) */ +#define HID_KBD_USAGE_KPDLBRACE 0xb8 /* Keypad { */ +#define HID_KBD_USAGE_KPDRBRACE 0xb9 /* Keypad } */ +#define HID_KBD_USAGE_KPDTAB 0xba /* Keypad Tab */ +#define HID_KBD_USAGE_KPDBACKSPACE 0xbb /* Keypad Backspace */ +#define HID_KBD_USAGE_KPDA 0xbc /* Keypad A (B-F follow) */ +#define HID_KBD_USAGE_KPDXOR 0xc2 /* Keypad XOR */ +#define HID_KBD_USAGE_KPDEXP 0xc3 /* Keypad ^ */ +#define HID_KBD_USAGE_KPDPERCENT 0xc4 /* Keypad % */ +#define HID_KBD_USAGE_KPDLT 0xc5 /* Keypad < */ +#define HID_KBD_USAGE_KPDGT 0xc6 /* Keypad > */ +#define HID_KBD_USAGE_KPDAMPERSAND 0xc7 /* Keypad & */ +#define HID_KBD_USAGE_KPDAND 0xc8 /* Keypad && */ +#define HID_KBD_USAGE_KPDVERT 0xc9 /* Keypad | */ +#define HID_KBD_USAGE_KPDOR 0xca /* Keypad || */ +#define HID_KBD_USAGE_KPDCOLON 0xcb /* Keypad : */ +#define HID_KBD_USAGE_KPDPOUND 0xcc /* Keypad # */ +#define HID_KBD_USAGE_KPDSPACE 0xcd /* Keypad Space */ +#define HID_KBD_USAGE_KPDAT 0xce /* Keypad @ */ +#define HID_KBD_USAGE_KPDEXCLAM 0xcf /* Keypad ! */ +#define HID_KBD_USAGE_KPDMEMSTORE 0xd0 /* Keypad Memory Store */ +#define HID_KBD_USAGE_KPDMEMRECALL 0xd1 /* Keypad Memory Recall */ +#define HID_KBD_USAGE_KPDMEMCLEAR 0xd2 /* Keypad Memory Clear */ +#define HID_KBD_USAGE_KPDMEMADD 0xd3 /* Keypad Memory Add */ +#define HID_KBD_USAGE_KPDMEMSUB 0xd4 /* Keypad Memory Subtract */ +#define HID_KBD_USAGE_KPDMEMMULT 0xd5 /* Keypad Memory Multiply */ +#define HID_KBD_USAGE_KPDMEMDIV 0xd6 /* Keypad Memory Divide */ +#define HID_KBD_USAGE_KPDPLUSMINUS 0xd7 /* Keypad +/- */ +#define HID_KBD_USAGE_KPDCLEAR 0xd8 /* Keypad Clear */ +#define HID_KBD_USAGE_KPDCLEARENTRY 0xd9 /* Keypad Clear Entry */ +#define HID_KBD_USAGE_KPDBINARY 0xda /* Keypad Binary */ +#define HID_KBD_USAGE_KPDOCTAL 0xdb /* Keypad Octal */ +#define HID_KBD_USAGE_KPDDECIMAL 0xdc /* Keypad Decimal */ +#define HID_KBD_USAGE_KPDHEXADECIMAL 0xdd /* Keypad Hexadecimal */ +#define HID_KBD_USAGE_LCTRL 0xe0 /* Keyboard LeftControl */ +#define HID_KBD_USAGE_LSHIFT 0xe1 /* Keyboard LeftShift */ +#define HID_KBD_USAGE_LALT 0xe2 /* Keyboard LeftAlt */ +#define HID_KBD_USAGE_LGUI 0xe3 /* Keyboard Left GUI */ +#define HID_KBD_USAGE_RCTRL 0xe4 /* Keyboard RightControl */ +#define HID_KBD_USAGE_RSHIFT 0xe5 /* Keyboard RightShift */ +#define HID_KBD_USAGE_RALT 0xe6 /* Keyboard RightAlt */ +#define HID_KBD_USAGE_RGUI 0xe7 /* Keyboard Right GUI */ + +#define HID_KBD_USAGE_MAX 0xe7 + +/* HID Report Definitions */ +struct usb_hid_class_subdescriptor { + uint8_t bDescriptorType; /* Class descriptor type (See 7.1) */ + uint16_t wDescriptorLength; /* Size of the report descriptor */ +} __PACKED; + +struct usb_hid_descriptor { + uint8_t bLength; /* Size of the HID descriptor */ + uint8_t bDescriptorType; /* HID descriptor type */ + uint16_t bcdHID; /* HID class specification release */ + uint8_t bCountryCode; /* Country code */ + uint8_t bNumDescriptors; /* Number of descriptors (>=1) */ + + /* + * Specification says at least one Class Descriptor needs to + * be present (Report Descriptor). + */ + struct usb_hid_class_subdescriptor subdesc[1]; +} __PACKED; + +/* Standard Reports *********************************************************/ + +/* Keyboard input report (8 bytes) (HID B.1) */ +struct usb_hid_kbd_report { + uint8_t modifier; /* Modifier keys. See HID_MODIFER_* definitions */ + uint8_t reserved; + uint8_t key[6]; /* Keycode 1-6 */ +}; + +/* Keyboard output report (1 byte) (HID B.1), + * see HID_KBD_OUTPUT_* definitions + */ + +/* Mouse input report (HID B.2) */ +struct usb_hid_mouse_report { + uint8_t buttons; /* See HID_MOUSE_INPUT_BUTTON_* definitions */ + int8_t xdisp; /* X displacement */ + int8_t ydisp; /* y displacement */ + /* Device specific additional bytes may follow */ + uint8_t wdisp; /* Wheel displacement */ +}; + +/* Joystick input report (1 bytes) (HID D.1) */ +struct usb_hid_js_report { + int8_t xpos; /* X position */ + int8_t ypos; /* X position */ + uint8_t buttons; /* See USBHID_JSIN_* definitions */ + uint8_t throttle; /* Throttle */ +}; + +// clang-format off +#define HID_MOUSE_DESCRIPTOR_LEN (9 + 9 + 7) + +#define HID_MOUSE_DESCRIPTOR_INIT(bInterfaceNumber, bInterfaceSubClass, wItemLength, int_ep, wMaxPacketSize, bInterval) \ + 0x09, /* bLength: Interface Descriptor size */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ \ + bInterfaceNumber, /* bInterfaceNumber: Number of Interface */ \ + 0x00, /* bAlternateSetting: Alternate setting */ \ + 0x01, /* bNumEndpoints */ \ + 0x03, /* bInterfaceClass: HID */ \ + bInterfaceSubClass, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ \ + 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ \ + 0x00, /* iInterface: Index of string descriptor */ \ + 0x09, /* bLength: HID Descriptor size */ \ + HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ \ + 0x11, /* bcdHID: HID Class Spec release number */ \ + 0x01, \ + 0x00, /* bCountryCode: Hardware target country */ \ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ \ + 0x22, /* bDescriptorType */ \ + WBVAL(wItemLength), /* wItemLength: Total length of Report descriptor */ \ + 0x07, /* bLength: Endpoint Descriptor size */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ + int_ep, /* bEndpointAddress: Endpoint Address (IN) */ \ + 0x03, /* bmAttributes: Interrupt endpoint */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize: x Byte max */ \ + bInterval /* bInterval: Polling Interval */ + +#define HID_KEYBOARD_DESCRIPTOR_LEN (9 + 9 + 7) + +#define HID_KEYBOARD_DESCRIPTOR_INIT(bInterfaceNumber, bInterfaceSubClass, wItemLength, int_ep, wMaxPacketSize, bInterval) \ + 0x09, /* bLength: Interface Descriptor size */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ \ + bInterfaceNumber, /* bInterfaceNumber: Number of Interface */ \ + 0x00, /* bAlternateSetting: Alternate setting */ \ + 0x01, /* bNumEndpoints */ \ + 0x03, /* bInterfaceClass: HID */ \ + bInterfaceSubClass, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ \ + 0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ \ + 0x00, /* iInterface: Index of string descriptor */ \ + 0x09, /* bLength: HID Descriptor size */ \ + HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ \ + 0x11, /* bcdHID: HID Class Spec release number */ \ + 0x01, \ + 0x00, /* bCountryCode: Hardware target country */ \ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ \ + 0x22, /* bDescriptorType */ \ + WBVAL(wItemLength), /* wItemLength: Total length of Report descriptor */ \ + 0x07, /* bLength: Endpoint Descriptor size */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ + int_ep, /* bEndpointAddress: Endpoint Address (IN) */ \ + 0x03, /* bmAttributes: Interrupt endpoint */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize: x Byte max */ \ + bInterval /* bInterval: Polling Interval */ + +#define HID_CUSTOM_INOUT_DESCRIPTOR_LEN (9 + 9 + 7 + 7) + +#define HID_CUSTOM_INOUT_DESCRIPTOR_INIT(bInterfaceNumber, bInterfaceSubClass, wItemLength, out_ep, in_ep, wMaxPacketSize, bInterval) \ + 0x09, /* bLength: Interface Descriptor size */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ \ + bInterfaceNumber, /* bInterfaceNumber: Number of Interface */ \ + 0x00, /* bAlternateSetting: Alternate setting */ \ + 0x02, /* bNumEndpoints */ \ + 0x03, /* bInterfaceClass: HID */ \ + bInterfaceSubClass, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ \ + 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ \ + 0x00, /* iInterface: Index of string descriptor */ \ + 0x09, /* bLength: HID Descriptor size */ \ + HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ \ + 0x11, /* bcdHID: HID Class Spec release number */ \ + 0x01, \ + 0x00, /* bCountryCode: Hardware target country */ \ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ \ + 0x22, /* bDescriptorType */ \ + WBVAL(wItemLength), /* wItemLength: Total length of Report descriptor */ \ + 0x07, /* bLength: Endpoint Descriptor size */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ + out_ep, /* bEndpointAddress: Endpoint Address (OUT) */ \ + 0x03, /* bmAttributes: Interrupt endpoint */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize: x Byte max */ \ + bInterval, /* bInterval: Polling Interval */ \ + 0x07, /* bLength: Endpoint Descriptor size */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ + in_ep, /* bEndpointAddress: Endpoint Address (IN) */ \ + 0x03, /* bmAttributes: Interrupt endpoint */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize: x Byte max */ \ + bInterval /* bInterval: Polling Interval */ +// clang-format on + +#endif /* USB_HID_H */ diff --git a/src/lib/CherryUSB/class/hid/usbd_hid.c b/src/lib/CherryUSB/class/hid/usbd_hid.c new file mode 100644 index 000000000..fed749f2f --- /dev/null +++ b/src/lib/CherryUSB/class/hid/usbd_hid.c @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_hid.h" + +static int hid_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USB_LOG_DBG("HID Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + uint8_t intf_num = LO_BYTE(setup->wIndex); + + switch (setup->bRequest) { + case HID_REQUEST_GET_REPORT: + /* report id ,report type */ + usbd_hid_get_report(busid, intf_num, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue), data, len); + break; + case HID_REQUEST_GET_IDLE: + (*data)[0] = usbd_hid_get_idle(busid, intf_num, LO_BYTE(setup->wValue)); + *len = 1; + break; + case HID_REQUEST_GET_PROTOCOL: + (*data)[0] = usbd_hid_get_protocol(busid, intf_num); + *len = 1; + break; + case HID_REQUEST_SET_REPORT: + /* report id ,report type, report, report len */ + usbd_hid_set_report(busid, intf_num, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue), *data, *len); + break; + case HID_REQUEST_SET_IDLE: + /* report id, duration */ + usbd_hid_set_idle(busid, intf_num, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue)); + break; + case HID_REQUEST_SET_PROTOCOL: + /* protocol */ + usbd_hid_set_protocol(busid, intf_num, LO_BYTE(setup->wValue)); + break; + + default: + USB_LOG_WRN("Unhandled HID Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + return 0; +} + +struct usbd_interface *usbd_hid_init_intf(uint8_t busid, struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len) +{ + (void)busid; + + intf->class_interface_handler = hid_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = NULL; + + intf->hid_report_descriptor = desc; + intf->hid_report_descriptor_len = desc_len; + return intf; +} + +/* + * Appendix G: HID Request Support Requirements + * + * The following table enumerates the requests that need to be supported by various types of HID class devices. + * Device type GetReport SetReport GetIdle SetIdle GetProtocol SetProtocol + * ------------------------------------------------------------------------------------------ + * Boot Mouse Required Optional Optional Optional Required Required + * Non-Boot Mouse Required Optional Optional Optional Optional Optional + * Boot Keyboard Required Optional Required Required Required Required + * Non-Boot Keybrd Required Optional Required Required Optional Optional + * Other Device Required Optional Optional Optional Optional Optional + */ + +__WEAK void usbd_hid_get_report(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t report_type, uint8_t **data, uint32_t *len) +{ + (void)busid; + (void)intf; + (void)report_id; + (void)report_type; + (*data[0]) = 0; + *len = 1; +} + +__WEAK uint8_t usbd_hid_get_idle(uint8_t busid, uint8_t intf, uint8_t report_id) +{ + (void)busid; + (void)intf; + (void)report_id; + return 0; +} + +__WEAK uint8_t usbd_hid_get_protocol(uint8_t busid, uint8_t intf) +{ + (void)busid; + (void)intf; + return 0; +} + +__WEAK void usbd_hid_set_report(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t report_type, uint8_t *report, uint32_t report_len) +{ + (void)busid; + (void)intf; + (void)report_id; + (void)report_type; + (void)report; + (void)report_len; +} + +__WEAK void usbd_hid_set_idle(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t duration) +{ + (void)busid; + (void)intf; + (void)report_id; + (void)duration; +} + +__WEAK void usbd_hid_set_protocol(uint8_t busid, uint8_t intf, uint8_t protocol) +{ + (void)busid; + (void)intf; + (void)protocol; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/class/hid/usbd_hid.h b/src/lib/CherryUSB/class/hid/usbd_hid.h new file mode 100644 index 000000000..9ab31b900 --- /dev/null +++ b/src/lib/CherryUSB/class/hid/usbd_hid.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_HID_H +#define USBD_HID_H + +#include "usb_hid.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Init hid interface driver */ +struct usbd_interface *usbd_hid_init_intf(uint8_t busid, struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len); + +/* Setup request command callback api */ +void usbd_hid_get_report(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t report_type, uint8_t **data, uint32_t *len); +uint8_t usbd_hid_get_idle(uint8_t busid, uint8_t intf, uint8_t report_id); +uint8_t usbd_hid_get_protocol(uint8_t busid, uint8_t intf); +void usbd_hid_set_report(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t report_type, uint8_t *report, uint32_t report_len); +void usbd_hid_set_idle(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t duration); +void usbd_hid_set_protocol(uint8_t busid, uint8_t intf, uint8_t protocol); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_HID_H */ diff --git a/src/lib/CherryUSB/class/hid/usbh_hid.c b/src/lib/CherryUSB/class/hid/usbh_hid.c new file mode 100644 index 000000000..c4400cac5 --- /dev/null +++ b/src/lib/CherryUSB/class/hid/usbh_hid.c @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_hid.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_hid" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/input%d" + +/* general descriptor field offsets */ +#define DESC_bLength 0 /** Length offset */ +#define DESC_bDescriptorType 1 /** Descriptor type offset */ + +/* interface descriptor field offsets */ +#define INTF_DESC_bInterfaceNumber 2 /** Interface number offset */ +#define INTF_DESC_bAlternateSetting 3 /** Alternate setting offset */ + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hid_buf[CONFIG_USBHOST_MAX_HID_CLASS][USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_hid g_hid_class[CONFIG_USBHOST_MAX_HID_CLASS]; +static uint32_t g_devinuse = 0; + +static struct usbh_hid *usbh_hid_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_HID_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_hid_class[devno], 0, sizeof(struct usbh_hid)); + g_hid_class[devno].minor = devno; + return &g_hid_class[devno]; + } + } + return NULL; +} + +static void usbh_hid_class_free(struct usbh_hid *hid_class) +{ + uint8_t devno = hid_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(hid_class, 0, sizeof(struct usbh_hid)); +} + +int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *buffer, uint32_t buflen) +{ + struct usb_setup_packet *setup; + + if (!hid_class || !hid_class->hport) { + return -USB_ERR_INVAL; + } + setup = hid_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; + setup->wValue = HID_DESCRIPTOR_TYPE_HID_REPORT << 8; + setup->wIndex = hid_class->intf; + setup->wLength = buflen; + + return usbh_control_transfer(hid_class->hport, setup, buffer); +} + +int usbh_hid_set_idle(struct usbh_hid *hid_class, uint8_t report_id, uint8_t duration) +{ + struct usb_setup_packet *setup; + + if (!hid_class || !hid_class->hport) { + return -USB_ERR_INVAL; + } + setup = hid_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = HID_REQUEST_SET_IDLE; + setup->wValue = (duration << 8) | report_id; + setup->wIndex = hid_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(hid_class->hport, setup, NULL); +} + +int usbh_hid_get_idle(struct usbh_hid *hid_class, uint8_t *buffer) +{ + struct usb_setup_packet *setup; + int ret; + + if (!hid_class || !hid_class->hport) { + return -USB_ERR_INVAL; + } + setup = hid_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = HID_REQUEST_GET_IDLE; + setup->wValue = 0; + setup->wIndex = hid_class->intf; + setup->wLength = 1; + + ret = usbh_control_transfer(hid_class->hport, setup, g_hid_buf[hid_class->minor]); + if (ret < 8) { + return ret; + } + memcpy(buffer, g_hid_buf[hid_class->minor], MIN((uint32_t)ret - 8, 1)); + return ret; +} + +int usbh_hid_set_protocol(struct usbh_hid *hid_class, uint8_t protocol) +{ + struct usb_setup_packet *setup; + + if (!hid_class || !hid_class->hport) { + return -USB_ERR_INVAL; + } + setup = hid_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = HID_REQUEST_SET_PROTOCOL; + setup->wValue = protocol; + setup->wIndex = 0; + setup->wLength = 0; + + return usbh_control_transfer(hid_class->hport, setup, NULL); +} + +int usbh_hid_get_protocol(struct usbh_hid *hid_class, uint8_t *protocol) +{ + struct usb_setup_packet *setup; + int ret; + + if (!hid_class || !hid_class->hport) { + return -USB_ERR_INVAL; + } + setup = hid_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = HID_REQUEST_GET_PROTOCOL; + setup->wValue = 0; + setup->wIndex = hid_class->intf; + setup->wLength = 1; + + ret = usbh_control_transfer(hid_class->hport, setup, g_hid_buf[hid_class->minor]); + if (ret < 8) { + return ret; + } + memcpy(protocol, g_hid_buf[hid_class->minor], MIN((uint32_t)ret - 8, 1)); + return ret; +} + +int usbh_hid_set_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen) +{ + struct usb_setup_packet *setup; + + if (!hid_class || !hid_class->hport) { + return -USB_ERR_INVAL; + } + setup = hid_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = HID_REQUEST_SET_REPORT; + setup->wValue = (uint16_t)(((uint32_t)report_type << 8U) | (uint32_t)report_id); + setup->wIndex = 0; + setup->wLength = buflen; + + return usbh_control_transfer(hid_class->hport, setup, buffer); +} + +int usbh_hid_get_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen) +{ + struct usb_setup_packet *setup; + int ret; + + if (!hid_class || !hid_class->hport) { + return -USB_ERR_INVAL; + } + setup = hid_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = HID_REQUEST_GET_REPORT; + setup->wValue = (uint16_t)(((uint32_t)report_type << 8U) | (uint32_t)report_id); + setup->wIndex = 0; + setup->wLength = buflen; + + ret = usbh_control_transfer(hid_class->hport, setup, g_hid_buf[hid_class->minor]); + if (ret < 8) { + return ret; + } + memcpy(buffer, g_hid_buf[hid_class->minor], MIN((uint32_t)ret - 8, buflen)); + return ret; +} + +int usbh_hid_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret; + uint8_t cur_iface = 0xff; + uint8_t *p; + bool found = false; + + struct usbh_hid *hid_class = usbh_hid_class_alloc(); + if (hid_class == NULL) { + USB_LOG_ERR("Fail to alloc hid_class\r\n"); + return -USB_ERR_NOMEM; + } + + hid_class->hport = hport; + hid_class->intf = intf; + + hport->config.intf[intf].priv = hid_class; + + p = hport->raw_config_desc; + while (p[DESC_bLength]) { + switch (p[DESC_bDescriptorType]) { + case USB_DESCRIPTOR_TYPE_INTERFACE: + cur_iface = p[INTF_DESC_bInterfaceNumber]; + if (cur_iface == intf) { + hid_class->protocol = p[7]; + struct usb_hid_descriptor *desc = (struct usb_hid_descriptor *)(p + 9); + + if (desc->bDescriptorType != HID_DESCRIPTOR_TYPE_HID) { + USB_LOG_ERR("HID descriptor not found\r\n"); + return -USB_ERR_INVAL; + } + + if (desc->subdesc[0].bDescriptorType != HID_DESCRIPTOR_TYPE_HID_REPORT) { + USB_LOG_ERR("HID report descriptor not found\r\n"); + return -USB_ERR_INVAL; + } + + hid_class->report_size = desc->subdesc[0].wDescriptorLength; + found = true; + goto found; + } + break; + default: + break; + } + /* skip to next descriptor */ + p += p[DESC_bLength]; + } + + if (found == false) { + USB_LOG_ERR("HID interface not found\r\n"); + return -USB_ERR_INVAL; + } +found: + // /* 0x0 = boot protocol, 0x1 = report protocol */ + // ret = usbh_hid_set_protocol(hid_class, 0x1); + // if (ret < 0) { + // return ret; + // } + + ret = usbh_hid_set_idle(hid_class, 0, 0); + if (ret < 0) { + USB_LOG_WRN("Do not support set idle\r\n"); + } + + /* We read report desc but do nothing (because of too much memory usage for parsing report desc, parsed by users) */ + ret = usbh_hid_get_report_descriptor(hid_class, g_hid_buf[hid_class->minor], MIN(sizeof(g_hid_buf[hid_class->minor]), hid_class->report_size)); + if (ret < 0) { + return ret; + } + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(hid_class->intin, ep_desc); + } else { + USBH_EP_INIT(hid_class->intout, ep_desc); + } + } + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, hid_class->minor); + + USB_LOG_INFO("Register HID Class:%s\r\n", hport->config.intf[intf].devname); + + usbh_hid_run(hid_class); + return ret; +} + +int usbh_hid_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_hid *hid_class = (struct usbh_hid *)hport->config.intf[intf].priv; + + if (hid_class) { + if (hid_class->intin) { + usbh_kill_urb(&hid_class->intin_urb); + } + + if (hid_class->intout) { + usbh_kill_urb(&hid_class->intout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister HID Class:%s\r\n", hport->config.intf[intf].devname); + usbh_hid_stop(hid_class); + } + + usbh_hid_class_free(hid_class); + } + + return ret; +} + +__WEAK void usbh_hid_run(struct usbh_hid *hid_class) +{ + (void)hid_class; +} + +__WEAK void usbh_hid_stop(struct usbh_hid *hid_class) +{ + (void)hid_class; +} + +const struct usbh_class_driver hid_class_driver = { + .driver_name = "hid", + .connect = usbh_hid_connect, + .disconnect = usbh_hid_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info hid_custom_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = USB_DEVICE_CLASS_HID, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = NULL, + .class_driver = &hid_class_driver +}; diff --git a/src/lib/CherryUSB/class/hid/usbh_hid.h b/src/lib/CherryUSB/class/hid/usbh_hid.h new file mode 100644 index 000000000..8b87e0c0b --- /dev/null +++ b/src/lib/CherryUSB/class/hid/usbh_hid.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_HID_H +#define USBH_HID_H + +#include "usb_hid.h" + +struct usbh_hid { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *intin; /* INTR IN endpoint */ + struct usb_endpoint_descriptor *intout; /* INTR OUT endpoint */ + struct usbh_urb intin_urb; /* INTR IN urb */ + struct usbh_urb intout_urb; /* INTR OUT urb */ + + uint16_t report_size; + + uint8_t protocol; + uint8_t intf; /* interface number */ + uint8_t minor; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *buffer, uint32_t buflen); +int usbh_hid_set_idle(struct usbh_hid *hid_class, uint8_t report_id, uint8_t duration); +int usbh_hid_get_idle(struct usbh_hid *hid_class, uint8_t *buffer); +int usbh_hid_set_protocol(struct usbh_hid *hid_class, uint8_t protocol); +int usbh_hid_get_protocol(struct usbh_hid *hid_class, uint8_t *protocol); +int usbh_hid_set_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen); +int usbh_hid_get_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen); + +void usbh_hid_run(struct usbh_hid *hid_class); +void usbh_hid_stop(struct usbh_hid *hid_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_HID_H */ diff --git a/src/lib/CherryUSB/class/hub/usb_hub.h b/src/lib/CherryUSB/class/hub/usb_hub.h new file mode 100644 index 000000000..68e0ecf17 --- /dev/null +++ b/src/lib/CherryUSB/class/hub/usb_hub.h @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_HUB_H +#define USB_HUB_H + +/* HUB Class Descriptor Types */ +#define HUB_DESCRIPTOR_TYPE_HUB 0x29 +#define HUB_DESCRIPTOR_TYPE_HUB3 0x2A + +#define HUB_MAX_DEPTH 5 + +#define HUB_SUBCLASS 0x00 +#define HUB_PROTOCOL_STT 0x01 +#define HUB_PROTOCOL_MTT 0x02 + +/* Hub class requests */ +#define HUB_REQUEST_GET_STATUS USB_REQUEST_GET_STATUS +#define HUB_REQUEST_CLEAR_FEATURE USB_REQUEST_CLEAR_FEATURE +#define HUB_REQUEST_SET_FEATURE USB_REQUEST_SET_FEATURE +#define HUB_REQUEST_GET_DESCRIPTOR USB_REQUEST_GET_DESCRIPTOR +#define HUB_REQUEST_SET_DESCRIPTOR USB_REQUEST_SET_DESCRIPTOR +#define HUB_REQUEST_CLEAR_TT_BUFFER (0x08) +#define HUB_REQUEST_RESET_TT (0x09) +#define HUB_REQUEST_GET_TT_STATE (0x0a) +#define HUB_REQUEST_STOP_TT (0x0b) +#define HUB_REQUEST_SET_HUB_DEPTH (0x0C) + +/* Hub class features */ +#define HUB_FEATURE_HUB_C_LOCALPOWER (0x0) +#define HUB_FEATURE_HUB_C_OVERCURRENT (0x1) + +/* Port features */ +#define HUB_PORT_FEATURE_CONNECTION (0x00) +#define HUB_PORT_FEATURE_ENABLE (0x01) +#define HUB_PORT_FEATURE_SUSPEND (0x02) +#define HUB_PORT_FEATURE_OVERCURRENT (0x03) +#define HUB_PORT_FEATURE_RESET (0x04) +#define HUB_PORT_FEATURE_L1 (0x05) /* USB 2.0 only */ + +#define HUB_PORT_FEATURE_POWER (0x08) /* USB 2.0 only */ +#define HUB_PORT_FEATURE_POWER_SS (0x09) /* USB 3.0 only */ +/* This is a bit tricky because HUB_PORT_FEATURE_POWER_SS and + HUB_PORT_FEATURE_LOWSPEED share the same bit. */ +#define HUB_PORT_FEATURE_LOWSPEED (0x09) /* USB 2.0 only */ +#define HUB_PORT_FEATURE_HIGHSPEED (0x0a) /* USB 2.0 only */ +#define HUB_PORT_FEATURE_TEST (0x0b) /* USB 2.0 only */ +#define HUB_PORT_FEATURE_INDICATOR (0x0c) /* USB 2.0 only */ + +/* Port status change (wPortChange) */ +#define HUB_PORT_FEATURE_C_CONNECTION (0x10) +#define HUB_PORT_FEATURE_C_ENABLE (0x11) /* USB 2.0 only */ +#define HUB_PORT_FEATURE_C_SUSPEND (0x12) /* USB 2.0 only */ +#define HUB_PORT_FEATURE_C_OVER_CURREN (0x13) +#define HUB_PORT_FEATURE_C_RESET (0x14) +#define HUB_PORT_FEATURE_C_BH_RESET (0x15) /* USB 3.0 only */ +#define HUB_PORT_FEATURE_C_LINK_STATE (0x16) /* USB 3.0 only */ +#define HUB_PORT_FEATURE_C_CONFIG_ERR (0x17) /* USB 3.0 only */ + +/* Hub status */ +#define HUB_STATUS_LOCALPOWER (1 << 0) +#define HUB_STATUS_OVERCURRENT (1 << 1) + +/* Hub status change */ +#define HUB_STATUS_C_LOCALPOWER (1 << 0) +#define HUB_STATUS_C_OVERCURRENT (1 << 1) + +/* Hub port status */ +#define HUB_PORT_STATUS_CONNECTION (1 << 0) +#define HUB_PORT_STATUS_ENABLE (1 << 1) +#define HUB_PORT_STATUS_SUSPEND (1 << 2) /* USB 2.0 only */ +#define HUB_PORT_STATUS_OVERCURRENT (1 << 3) +#define HUB_PORT_STATUS_RESET (1 << 4) +#define HUB_PORT_STATUS_L1 (1 << 5) /* USB 2.0 only */ + +/* Port Link State (PORT_LINK_STATE), USB 3.0 only */ +#define HUB_PORT_STATUS_LS_U0 (0x00 << 5) +#define HUB_PORT_STATUS_LS_U1 (0x01 << 5) +#define HUB_PORT_STATUS_LS_U2 (0x02 << 5) +#define HUB_PORT_STATUS_LS_U3 (0x03 << 5) +#define HUB_PORT_STATUS_LS_SS_DISABLED (0x04 << 5) +#define HUB_PORT_STATUS_LS_RX_DETECT (0x05 << 5) +#define HUB_PORT_STATUS_LS_SS_INACTIVE (0x06 << 5) +#define HUB_PORT_STATUS_LS_POLLING (0x07 << 5) +#define HUB_PORT_STATUS_LS_RECOVERY (0x08 << 5) +#define HUB_PORT_STATUS_LS_HOT_RESET (0x09 << 5) +#define HUB_PORT_STATUS_LS_COMP_MOD (0x0a << 5) +#define HUB_PORT_STATUS_LS_LOOPBACK (0x0b << 5) + +#define HUB_PORT_STATUS_POWER (1 << 8) +#define HUB_PORT_STATUS_POWER_SS (1 << 9) /* USB 3.0 only */ +#define HUB_PORT_STATUS_LOW_SPEED (1 << 9) /* USB 2.0 only */ +#define HUB_PORT_STATUS_HIGH_SPEED (1 << 10) /* USB 2.0 only */ +#define HUB_PORT_STATUS_TEST (1 << 11) /* USB 2.0 only */ +#define HUB_PORT_STATUS_INDICATOR (1 << 12) /* USB 2.0 only */ + +/* Hub port status change */ +#define HUB_PORT_STATUS_C_CONNECTION (1 << 0) +#define HUB_PORT_STATUS_C_ENABLE (1 << 1) /* USB 2.0 only */ +#define HUB_PORT_STATUS_C_SUSPEND (1 << 2) /* USB 2.0 only */ +#define HUB_PORT_STATUS_C_OVERCURRENT (1 << 3) +#define HUB_PORT_STATUS_C_RESET (1 << 4) +#define HUB_PORT_STATUS_C_L1 (1 << 5) /* USB 2.0 only */ +#define HUB_PORT_STATUS_C_BH_RESET (1 << 5) /* USB 3.0 only */ +#define HUB_PORT_STATUS_C_PORTLINK (1 << 6) /* USB 3.0 only */ +#define HUB_PORT_STATUS_C_CONFIGERR (1 << 7) /* USB 3.0 only */ + +/* Hub characteristics */ +#define HUB_CHAR_LPSM_SHIFT (0) /* Bits 0-1: Logical Power Switching Mode */ +#define HUB_CHAR_LPSM_MASK (3 << HUB_CHAR_LPSM_SHIFT) +#define HUB_CHAR_LPSM_GANGED (0 << HUB_CHAR_LPSM_SHIFT) +#define HUB_CHAR_LPSM_INDIVIDUAL (1 << HUB_CHAR_LPSM_SHIFT) +#define HUB_CHAR_COMPOUND (1 << 2) /* Bit 2: Compound device */ +#define HUB_CHAR_OCPM_SHIFT (3) /* Bits 3-4: Over-current Protection Mode */ +#define HUB_CHAR_OCPM_MASK (3 << HUB_CHAR_OCPM_SHIFT) +#define HUB_CHAR_OCPM_GLOBAL (0 << HUB_CHAR_OCPM_SHIFT) +#define HUB_CHAR_OCPM_INDIVIDUAL (1 << HUB_CHAR_OCPM_SHIFT) +#define HUB_CHAR_TTTT_SHIFT (5) /* Bits 5-6: TT Think Time */ +#define HUB_CHAR_TTTT_MASK (3 << HUB_CHAR_TTTT_SHIFT) +#define HUB_CHAR_TTTT_8_BITS (0 << HUB_CHAR_TTTT_SHIFT) +#define HUB_CHAR_TTTT_16_BITS (1 << HUB_CHAR_TTTT_SHIFT) +#define HUB_CHAR_TTTT_24_BITS (2 << HUB_CHAR_TTTT_SHIFT) +#define HUB_CHAR_TTTT_32_BITS (3 << HUB_CHAR_TTTT_SHIFT) +#define HUB_CHAR_PORTIND (1 << 7) /* Bit 7: Port Indicators Supported */ + +/* Hub descriptor */ +struct usb_hub_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bNbrPorts; + uint16_t wHubCharacteristics; + uint8_t bPwrOn2PwrGood; + uint8_t bHubContrCurrent; + uint8_t DeviceRemovable; + uint8_t PortPwrCtrlMask; +} __PACKED; + +#define USB_SIZEOF_HUB_DESC 9 + +/* Super speed Hub descriptor */ +struct usb_hub_ss_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bNbrPorts; + uint16_t wHubCharacteristics; + uint8_t bPwrOn2PwrGood; + uint8_t bHubContrCurrent; + uint8_t bHubHdrDecLat; + uint16_t wHubDelay; + uint8_t DeviceRemovable; +} __PACKED; + +#define USB_SIZEOF_HUB_SS_DESC 11 + +/* Hub status */ +struct hub_status { + uint16_t wPortStatus; + uint16_t wPortChange; +}; + +/* Hub port status */ +struct hub_port_status { + uint16_t wPortStatus; + uint16_t wPortChange; +}; + +#endif /* USB_HUB_H */ diff --git a/src/lib/CherryUSB/class/hub/usbh_hub.c b/src/lib/CherryUSB/class/hub/usbh_hub.c new file mode 100644 index 000000000..dd348d854 --- /dev/null +++ b/src/lib/CherryUSB/class/hub/usbh_hub.c @@ -0,0 +1,758 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_hub.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_hub" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/hub%d" + +#define HUB_DEBOUNCE_TIMEOUT 1500 +#define HUB_DEBOUNCE_STEP 25 +#define HUB_DEBOUNCE_STABLE 100 +#define DELAY_TIME_AFTER_RESET 200 + +#define EXTHUB_FIRST_INDEX 2 + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hub_buf[CONFIG_USBHOST_MAX_BUS][USB_ALIGN_UP(32, CONFIG_USB_ALIGN_SIZE)]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hub_intbuf[CONFIG_USBHOST_MAX_BUS][CONFIG_USBHOST_MAX_EXTHUBS + 1][USB_ALIGN_UP(1, CONFIG_USB_ALIGN_SIZE)]; + +extern int usbh_enumerate(struct usbh_hubport *hport); +extern void usbh_hubport_release(struct usbh_hubport *hport); + +static const char *speed_table[] = { "error-speed", "low-speed", "full-speed", "high-speed", "wireless-speed", "super-speed", "superplus-speed" }; + +#if CONFIG_USBHOST_MAX_EXTHUBS > 0 +static struct usbh_hub g_hub_class[CONFIG_USBHOST_MAX_EXTHUBS]; +static uint32_t g_devinuse = 0; + +static struct usbh_hub *usbh_hub_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_EXTHUBS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_hub_class[devno], 0, sizeof(struct usbh_hub)); + g_hub_class[devno].index = EXTHUB_FIRST_INDEX + devno; + return &g_hub_class[devno]; + } + } + return NULL; +} + +static void usbh_hub_class_free(struct usbh_hub *hub_class) +{ + uint8_t devno = hub_class->index - EXTHUB_FIRST_INDEX; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(hub_class, 0, sizeof(struct usbh_hub)); +} + +static int _usbh_hub_get_hub_descriptor(struct usbh_hub *hub, uint8_t *buffer) +{ + struct usb_setup_packet *setup; + int ret; + + setup = hub->parent->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; + setup->wValue = HUB_DESCRIPTOR_TYPE_HUB << 8; + + setup->wIndex = 0; + setup->wLength = USB_SIZEOF_HUB_DESC; + + ret = usbh_control_transfer(hub->parent, setup, g_hub_buf[hub->bus->busid]); + if (ret < 0) { + return ret; + } + memcpy(buffer, g_hub_buf[hub->bus->busid], USB_SIZEOF_HUB_DESC); + return ret; +} + +static int _usbh_hub_get_hub_ss_descriptor(struct usbh_hub *hub, uint8_t *buffer) +{ + struct usb_setup_packet *setup; + int ret; + + setup = hub->parent->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; + setup->wValue = HUB_DESCRIPTOR_TYPE_HUB3 << 8; + + setup->wIndex = 0; + setup->wLength = USB_SIZEOF_HUB_SS_DESC; + + ret = usbh_control_transfer(hub->parent, setup, g_hub_buf[hub->bus->busid]); + if (ret < 0) { + return ret; + } + memcpy(buffer, g_hub_buf[hub->bus->busid], USB_SIZEOF_HUB_SS_DESC); + return ret; +} +#endif + +static int _usbh_hub_get_portstatus(struct usbh_hub *hub, uint8_t port, struct hub_port_status *port_status) +{ + struct usb_setup_packet *setup; + int ret; + + setup = hub->parent->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_OTHER; + setup->bRequest = HUB_REQUEST_GET_STATUS; + setup->wValue = 0; + setup->wIndex = port; + setup->wLength = 4; + + ret = usbh_control_transfer(hub->parent, setup, g_hub_buf[hub->bus->busid]); + if (ret < 0) { + return ret; + } + memcpy(port_status, g_hub_buf[hub->bus->busid], 4); + return ret; +} + +static int _usbh_hub_set_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature) +{ + struct usb_setup_packet *setup; + + setup = hub->parent->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_OTHER; + setup->bRequest = HUB_REQUEST_SET_FEATURE; + setup->wValue = feature; + setup->wIndex = port; + setup->wLength = 0; + + return usbh_control_transfer(hub->parent, setup, NULL); +} + +static int _usbh_hub_clear_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature) +{ + struct usb_setup_packet *setup; + + setup = hub->parent->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_OTHER; + setup->bRequest = HUB_REQUEST_CLEAR_FEATURE; + setup->wValue = feature; + setup->wIndex = port; + setup->wLength = 0; + + return usbh_control_transfer(hub->parent, setup, NULL); +} + +#if CONFIG_USBHOST_MAX_EXTHUBS > 0 +static int _usbh_hub_set_depth(struct usbh_hub *hub, uint16_t depth) +{ + struct usb_setup_packet *setup; + + setup = hub->parent->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = HUB_REQUEST_SET_HUB_DEPTH; + setup->wValue = depth; + setup->wIndex = 0; + setup->wLength = 0; + + return usbh_control_transfer(hub->parent, setup, NULL); +} + +static int parse_hub_descriptor(struct usb_hub_descriptor *desc, uint16_t length) +{ + (void)length; + + if (desc->bLength != USB_SIZEOF_HUB_DESC) { + USB_LOG_ERR("invalid device bLength 0x%02x\r\n", desc->bLength); + return -1; + } else if (desc->bDescriptorType != HUB_DESCRIPTOR_TYPE_HUB) { + USB_LOG_ERR("unexpected descriptor 0x%02x\r\n", desc->bDescriptorType); + return -2; + } else { + USB_LOG_DBG("Hub Descriptor:\r\n"); + USB_LOG_DBG("bLength: 0x%02x \r\n", desc->bLength); + USB_LOG_DBG("bDescriptorType: 0x%02x \r\n", desc->bDescriptorType); + USB_LOG_DBG("bNbrPorts: 0x%02x \r\n", desc->bNbrPorts); + USB_LOG_DBG("wHubCharacteristics: 0x%04x \r\n", desc->wHubCharacteristics); + USB_LOG_DBG("bPwrOn2PwrGood: 0x%02x \r\n", desc->bPwrOn2PwrGood); + USB_LOG_DBG("bHubContrCurrent: 0x%02x \r\n", desc->bHubContrCurrent); + USB_LOG_DBG("DeviceRemovable: 0x%02x \r\n", desc->DeviceRemovable); + USB_LOG_DBG("PortPwrCtrlMask: 0x%02x \r\n", desc->PortPwrCtrlMask); + } + return 0; +} + +static int parse_hub_ss_descriptor(struct usb_hub_ss_descriptor *desc, uint16_t length) +{ + (void)length; + + if (desc->bLength < USB_SIZEOF_HUB_SS_DESC) { + USB_LOG_ERR("invalid device bLength 0x%02x\r\n", desc->bLength); + return -1; + } else if (desc->bDescriptorType != HUB_DESCRIPTOR_TYPE_HUB3) { + USB_LOG_ERR("unexpected descriptor 0x%02x\r\n", desc->bDescriptorType); + return -2; + } else { + USB_LOG_DBG("SuperSpeed Hub Descriptor:\r\n"); + USB_LOG_DBG("bLength: 0x%02x \r\n", desc->bLength); + USB_LOG_DBG("bDescriptorType: 0x%02x \r\n", desc->bDescriptorType); + USB_LOG_DBG("bNbrPorts: 0x%02x \r\n", desc->bNbrPorts); + USB_LOG_DBG("wHubCharacteristics: 0x%04x \r\n", desc->wHubCharacteristics); + USB_LOG_DBG("bPwrOn2PwrGood: 0x%02x \r\n", desc->bPwrOn2PwrGood); + USB_LOG_DBG("bHubContrCurrent: 0x%02x \r\n", desc->bHubContrCurrent); + USB_LOG_DBG("DeviceRemovable: 0x%02x \r\n", desc->DeviceRemovable); + } + return 0; +} +#endif + +static int usbh_hub_get_portstatus(struct usbh_hub *hub, uint8_t port, struct hub_port_status *port_status) +{ + struct usb_setup_packet roothub_setup; + struct usb_setup_packet *setup; + + if (hub->is_roothub) { + setup = &roothub_setup; + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_OTHER; + setup->bRequest = HUB_REQUEST_GET_STATUS; + setup->wValue = 0; + setup->wIndex = port; + setup->wLength = 4; + return usbh_roothub_control(hub->bus, &roothub_setup, (uint8_t *)port_status); + } else { + return _usbh_hub_get_portstatus(hub, port, port_status); + } +} + +int usbh_hub_set_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature) +{ + struct usb_setup_packet roothub_setup; + struct usb_setup_packet *setup; + + if (hub->is_roothub) { + setup = &roothub_setup; + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_OTHER; + setup->bRequest = HUB_REQUEST_SET_FEATURE; + setup->wValue = feature; + setup->wIndex = port; + setup->wLength = 0; + return usbh_roothub_control(hub->bus, setup, NULL); + } else { + return _usbh_hub_set_feature(hub, port, feature); + } +} + +int usbh_hub_clear_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature) +{ + struct usb_setup_packet roothub_setup; + struct usb_setup_packet *setup; + + if (hub->is_roothub) { + setup = &roothub_setup; + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_OTHER; + setup->bRequest = HUB_REQUEST_CLEAR_FEATURE; + setup->wValue = feature; + setup->wIndex = port; + setup->wLength = 0; + return usbh_roothub_control(hub->bus, setup, NULL); + } else { + return _usbh_hub_clear_feature(hub, port, feature); + } +} + +#if CONFIG_USBHOST_MAX_EXTHUBS > 0 +static int usbh_hub_set_depth(struct usbh_hub *hub, uint16_t depth) +{ + struct usb_setup_packet roothub_setup; + struct usb_setup_packet *setup; + + if (hub->is_roothub) { + setup = &roothub_setup; + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = HUB_REQUEST_SET_HUB_DEPTH; + setup->wValue = depth; + setup->wIndex = 0; + setup->wLength = 0; + return usbh_roothub_control(hub->bus, setup, NULL); + } else { + return _usbh_hub_set_depth(hub, depth); + } +} + +static void hub_int_complete_callback(void *arg, int nbytes) +{ + struct usbh_hub *hub = (struct usbh_hub *)arg; + + if (nbytes > 0) { + usbh_hub_thread_wakeup(hub); + } else if (nbytes == -USB_ERR_NAK) { + /* Restart timer to submit urb again */ + USB_LOG_DBG("Restart timer\r\n"); + usb_osal_timer_start(hub->int_timer); + } else { + } +} + +static void hub_int_timeout(void *arg) +{ + struct usbh_hub *hub = (struct usbh_hub *)arg; + + usbh_int_urb_fill(&hub->intin_urb, hub->parent, hub->intin, hub->int_buffer, 1, 0, hub_int_complete_callback, hub); + usbh_submit_urb(&hub->intin_urb); +} + +static int usbh_hub_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + struct hub_port_status port_status; + int ret; + + struct usbh_hub *hub = usbh_hub_class_alloc(); + if (hub == NULL) { + USB_LOG_ERR("Fail to alloc hub_class\r\n"); + return -USB_ERR_NOMEM; + } + + hub->hub_addr = hport->dev_addr; + hub->parent = hport; + hub->bus = hport->bus; + hub->speed = hport->speed; + + hport->self = hub; + hport->config.intf[intf].priv = hub; + + if (hport->depth > HUB_MAX_DEPTH) { + USB_LOG_ERR("Hub depth(%d) is overflow\r\n", hport->depth); + return -USB_ERR_INVAL; + } + + /* + * Super-Speed hubs need to know their depth to be able to + * parse the bits of the route-string that correspond to + * their downstream port number. + * + */ + if ((hport->depth != 0) && (hport->speed == USB_SPEED_SUPER)) { + ret = usbh_hub_set_depth(hub, hport->depth - 1); + if (ret < 0) { + USB_LOG_ERR("Unable to set hub depth \r\n"); + return ret; + } + } + + /* Get hub descriptor. */ + if (hport->speed == USB_SPEED_SUPER) { + ret = _usbh_hub_get_hub_ss_descriptor(hub, (uint8_t *)&hub->hub_ss_desc); + if (ret < 0) { + return ret; + } + + parse_hub_ss_descriptor(&hub->hub_ss_desc, USB_SIZEOF_HUB_SS_DESC); + hub->nports = hub->hub_ss_desc.bNbrPorts; + hub->powerdelay = hub->hub_ss_desc.bPwrOn2PwrGood * 2; + hub->tt_think = 0U; + } else { + ret = _usbh_hub_get_hub_descriptor(hub, (uint8_t *)&hub->hub_desc); + if (ret < 0) { + return ret; + } + + parse_hub_descriptor(&hub->hub_desc, USB_SIZEOF_HUB_DESC); + hub->nports = hub->hub_desc.bNbrPorts; + hub->powerdelay = hub->hub_desc.bPwrOn2PwrGood * 2; + hub->tt_think = ((hub->hub_desc.wHubCharacteristics & HUB_CHAR_TTTT_MASK) >> 5); + } + + if (hub->nports > CONFIG_USBHOST_MAX_EHPORTS) { + USB_LOG_ERR("Hub nports %u overflow\r\n", hub->nports); + return -USB_ERR_NOMEM; + } + + for (uint8_t port = 0; port < hub->nports; port++) { + hub->child[port].port = port + 1; + hub->child[port].parent = hub; + hub->child[port].bus = hport->bus; + } + + if (hport->device_desc.bDeviceProtocol == HUB_PROTOCOL_MTT) { + hub->ismtt = 1; + } else { + hub->ismtt = 0; + } + + ep_desc = &hport->config.intf[intf].altsetting[0].ep[0].ep_desc; + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(hub->intin, ep_desc); + } else { + return -1; + } + + for (uint8_t port = 0; port < hub->nports; port++) { + ret = usbh_hub_set_feature(hub, port + 1, HUB_PORT_FEATURE_POWER); + if (ret < 0) { + return ret; + } + } + + usb_osal_msleep(hub->powerdelay); + + for (uint8_t port = 0; port < hub->nports; port++) { + ret = usbh_hub_get_portstatus(hub, port + 1, &port_status); + USB_LOG_DBG("port %u, status:0x%03x, change:0x%02x\r\n", port + 1, port_status.wPortStatus, port_status.wPortChange); + if (ret < 0) { + return ret; + } + } + + hub->connected = true; + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, hub->index); + + USB_LOG_INFO("Register HUB Class:%s\r\n", hport->config.intf[intf].devname); + + hub->int_buffer = g_hub_intbuf[hub->bus->busid][hub->index - 1]; + + hub->int_timer = usb_osal_timer_create("hubint_tim", USBH_GET_URB_INTERVAL(hub->intin->bInterval, hport->speed) / 1000, hub_int_timeout, hub, 0); + if (hub->int_timer == NULL) { + USB_LOG_ERR("No memory to alloc int_timer\r\n"); + return -USB_ERR_NOMEM; + } + usb_osal_timer_start(hub->int_timer); + return 0; +} + +static int usbh_hub_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usbh_hubport *child; + int ret = 0; + + struct usbh_hub *hub = (struct usbh_hub *)hport->config.intf[intf].priv; + + if (hub) { + if (hub->intin) { + usbh_kill_urb(&hub->intin_urb); + } + + if (hub->int_timer) { + usb_osal_timer_delete(hub->int_timer); + } + + for (uint8_t port = 0; port < hub->nports; port++) { + child = &hub->child[port]; + usbh_hubport_release(child); + child->parent = NULL; + } + + if (hport->config.intf[intf].devname[0] != '\0') { + USB_LOG_INFO("Unregister HUB Class:%s\r\n", hport->config.intf[intf].devname); + } + + usbh_hub_class_free(hub); + } + return ret; +} +#endif + +static void usbh_hub_events(struct usbh_hub *hub) +{ + struct usbh_hubport *child; + struct hub_port_status port_status; + uint16_t portchange_index; + uint16_t portstatus; + uint16_t portchange; + uint16_t mask; + uint16_t feat; + uint8_t speed; + int ret; + size_t flags; + + if (!hub->connected) { + return; + } + + flags = usb_osal_enter_critical_section(); + memcpy(&portchange_index, hub->int_buffer, 2); + usb_osal_leave_critical_section(flags); + + for (uint8_t port = 0; port < hub->nports; port++) { + USB_LOG_DBG("Port change:0x%02x\r\n", portchange_index); + + if (!(portchange_index & (1 << (port + 1)))) { + continue; + } + portchange_index &= ~(1 << (port + 1)); + USB_LOG_DBG("Port %d change\r\n", port + 1); + + /* Read hub port status */ + ret = usbh_hub_get_portstatus(hub, port + 1, &port_status); + if (ret < 0) { + USB_LOG_ERR("Failed to read port %u status, errorcode: %d\r\n", port + 1, ret); + continue; + } + + portstatus = port_status.wPortStatus; + portchange = port_status.wPortChange; + + USB_LOG_DBG("port %u, status:0x%03x, change:0x%02x\r\n", port + 1, portstatus, portchange); + + /* First, clear all change bits */ + mask = 1; + feat = HUB_PORT_FEATURE_C_CONNECTION; + while (portchange) { + if (portchange & mask) { + ret = usbh_hub_clear_feature(hub, port + 1, feat); + if (ret < 0) { + USB_LOG_ERR("Failed to clear port %u, change mask:%04x, errorcode:%d\r\n", port + 1, mask, ret); + continue; + } + portchange &= (~mask); + } + mask <<= 1; + feat++; + } + + portchange = port_status.wPortChange; + + /* Second, if port changes, debounces first */ + if (portchange & HUB_PORT_STATUS_C_CONNECTION) { + uint16_t connection = 0; + uint16_t debouncestable = 0; + for (uint32_t debouncetime = 0; debouncetime < HUB_DEBOUNCE_TIMEOUT; debouncetime += HUB_DEBOUNCE_STEP) { + /* Read hub port status */ + ret = usbh_hub_get_portstatus(hub, port + 1, &port_status); + if (ret < 0) { + USB_LOG_ERR("Failed to read port %u status, errorcode: %d\r\n", port + 1, ret); + continue; + } + + portstatus = port_status.wPortStatus; + portchange = port_status.wPortChange; + + USB_LOG_DBG("Port %u, status:0x%03x, change:0x%02x\r\n", port + 1, portstatus, portchange); + + if (!(portchange & HUB_PORT_STATUS_C_CONNECTION) && + ((portstatus & HUB_PORT_STATUS_CONNECTION) == connection)) { + debouncestable += HUB_DEBOUNCE_STEP; + if (debouncestable >= HUB_DEBOUNCE_STABLE) { + break; + } + } else { + debouncestable = 0; + connection = portstatus & HUB_PORT_STATUS_CONNECTION; + } + + if (portchange & HUB_PORT_STATUS_C_CONNECTION) { + usbh_hub_clear_feature(hub, port + 1, HUB_PORT_FEATURE_C_CONNECTION); + } + + usb_osal_msleep(HUB_DEBOUNCE_STEP); + } + + /** check if debounce ok */ + if (debouncestable < HUB_DEBOUNCE_STABLE) { + USB_LOG_ERR("Failed to debounce port %u\r\n", port + 1); + break; + } + + /* Last, check connect status */ + if (portstatus & HUB_PORT_STATUS_CONNECTION) { + ret = usbh_hub_set_feature(hub, port + 1, HUB_PORT_FEATURE_RESET); + if (ret < 0) { + USB_LOG_ERR("Failed to reset port %u, errorcode: %d\r\n", port + 1, ret); + continue; + } + + usb_osal_msleep(DELAY_TIME_AFTER_RESET); + /* Read hub port status */ + ret = usbh_hub_get_portstatus(hub, port + 1, &port_status); + if (ret < 0) { + USB_LOG_ERR("Failed to read port %u status, errorcode: %d\r\n", port + 1, ret); + continue; + } + + portstatus = port_status.wPortStatus; + portchange = port_status.wPortChange; + + USB_LOG_DBG("Port %u, status:0x%03x, change:0x%02x\r\n", port + 1, portstatus, portchange); + + if (!(portstatus & HUB_PORT_STATUS_RESET) && (portstatus & HUB_PORT_STATUS_ENABLE)) { + if (portchange & HUB_PORT_STATUS_C_RESET) { + ret = usbh_hub_clear_feature(hub, port + 1, HUB_PORT_FEATURE_C_RESET); + if (ret < 0) { + USB_LOG_ERR("Failed to clear port %u reset change, errorcode: %d\r\n", port + 1, ret); + continue; + } + } + + /* + * Figure out device speed. This is a bit tricky because + * HUB_PORT_STATUS_POWER_SS and HUB_PORT_STATUS_LOW_SPEED share the same bit. + */ + if (portstatus & HUB_PORT_STATUS_POWER) { + if (portstatus & HUB_PORT_STATUS_HIGH_SPEED) { + speed = USB_SPEED_HIGH; + } else if (portstatus & HUB_PORT_STATUS_LOW_SPEED) { + speed = USB_SPEED_LOW; + } else { + speed = USB_SPEED_FULL; + } + } else if (portstatus & HUB_PORT_STATUS_POWER_SS) { + speed = USB_SPEED_SUPER; + } else { + USB_LOG_WRN("Port %u does not enable power\r\n", port + 1); + continue; + } + + child = &hub->child[port]; + /** release child sources first */ + usbh_hubport_release(child); + + memset(child, 0, sizeof(struct usbh_hubport)); + child->parent = hub; + child->depth = (hub->parent ? hub->parent->depth : 0) + 1; + child->connected = true; + child->port = port + 1; + child->speed = speed; + child->bus = hub->bus; + child->mutex = usb_osal_mutex_create(); + + USB_LOG_INFO("New %s device on Bus %u, Hub %u, Port %u connected\r\n", speed_table[speed], hub->bus->busid, hub->index, port + 1); + + if (usbh_enumerate(child) < 0) { + /** release child sources */ + usbh_hubport_release(child); + USB_LOG_ERR("Port %u enumerate fail\r\n", child->port); + } + } else { + child = &hub->child[port]; + /** release child sources */ + usbh_hubport_release(child); + + /** some USB 3.0 ip may failed to enable USB 2.0 port for USB 3.0 device */ + USB_LOG_WRN("Failed to enable port %u\r\n", port + 1); + + continue; + } + } else { + child = &hub->child[port]; + /** release child sources */ + usbh_hubport_release(child); + USB_LOG_INFO("Device on Bus %u, Hub %u, Port %u disconnected\r\n", hub->bus->busid, hub->index, port + 1); + } + } + } + + /* Start next hub int transfer */ + if (!hub->is_roothub && hub->connected) { + usb_osal_timer_start(hub->int_timer); + } +} + +static void usbh_hub_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + struct usbh_hub *hub; + int ret = 0; + + struct usbh_bus *bus = (struct usbh_bus *)CONFIG_USB_OSAL_THREAD_GET_ARGV; + + usb_hc_init(bus); + while (1) { + ret = usb_osal_mq_recv(bus->hub_mq, (uintptr_t *)&hub, USB_OSAL_WAITING_FOREVER); + if (ret < 0) { + continue; + } + usb_osal_mutex_take(bus->mutex); + usbh_hub_events(hub); + usb_osal_mutex_give(bus->mutex); + } +} + +void usbh_hub_thread_wakeup(struct usbh_hub *hub) +{ + usb_osal_mq_send(hub->bus->hub_mq, (uintptr_t)hub); +} + +int usbh_hub_initialize(struct usbh_bus *bus) +{ + char thread_name[32] = { 0 }; + struct usbh_hub *hub; + + hub = &bus->hcd.roothub; + hub->connected = true; + hub->index = 1; + hub->is_roothub = true; + hub->parent = NULL; + hub->hub_addr = 1; + hub->nports = CONFIG_USBHOST_MAX_RHPORTS; + hub->int_buffer = bus->hcd.roothub_intbuf; + hub->bus = bus; + + bus->hub_mq = usb_osal_mq_create(7); + if (bus->hub_mq == NULL) { + USB_LOG_ERR("Failed to create hub mq\r\n"); + return -1; + } + + bus->mutex = usb_osal_mutex_create(); + if (bus->mutex == NULL) { + USB_LOG_ERR("Failed to create bus mutex\r\n"); + return -1; + } + + snprintf(thread_name, 32, "usbh_hub%u", bus->busid); + bus->hub_thread = usb_osal_thread_create(thread_name, CONFIG_USBHOST_PSC_STACKSIZE, CONFIG_USBHOST_PSC_PRIO, usbh_hub_thread, bus); + if (bus->hub_thread == NULL) { + USB_LOG_ERR("Failed to create hub thread\r\n"); + return -1; + } + return 0; +} + +int usbh_hub_deinitialize(struct usbh_bus *bus) +{ + struct usbh_hubport *hport; + struct usbh_hub *hub; + + usb_osal_mutex_take(bus->mutex); + hub = &bus->hcd.roothub; + for (uint8_t port = 0; port < hub->nports; port++) { + hport = &hub->child[port]; + + usbh_hubport_release(hport); + } + + usb_hc_deinit(bus); + + usb_osal_thread_delete(bus->hub_thread); + usb_osal_mq_delete(bus->hub_mq); + + usb_osal_mutex_give(bus->mutex); + usb_osal_mutex_delete(bus->mutex); + return 0; +} + +#if CONFIG_USBHOST_MAX_EXTHUBS > 0 +const struct usbh_class_driver hub_class_driver = { + .driver_name = "hub", + .connect = usbh_hub_connect, + .disconnect = usbh_hub_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info hub_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = USB_DEVICE_CLASS_HUB, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .id_table = NULL, + .class_driver = &hub_class_driver +}; +#endif diff --git a/src/lib/CherryUSB/class/hub/usbh_hub.h b/src/lib/CherryUSB/class/hub/usbh_hub.h new file mode 100644 index 000000000..dcce66068 --- /dev/null +++ b/src/lib/CherryUSB/class/hub/usbh_hub.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_HUB_H +#define USBH_HUB_H + +#include "usb_hub.h" + +struct usbh_hub; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_hub_set_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature); +int usbh_hub_clear_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature); + +void usbh_hub_thread_wakeup(struct usbh_hub *hub); + +int usbh_hub_initialize(struct usbh_bus *bus); +int usbh_hub_deinitialize(struct usbh_bus *bus); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_HUB_H */ diff --git a/src/lib/CherryUSB/class/midi/usb_midi.h b/src/lib/CherryUSB/class/midi/usb_midi.h new file mode 100644 index 000000000..e68675a77 --- /dev/null +++ b/src/lib/CherryUSB/class/midi/usb_midi.h @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_MIDI_H +#define USB_MIDI_H + +#include "usb_audio.h" + +/* bDescriptorSubType */ +#define MIDI_VC_HEADER_DESCRIPTOR_SUBTYPE 0x01U +#define MIDI_MS_HEADER_DESCRIPTOR_SUBTYPE 0x01U +#define MIDI_MS_GENERAL_DESCRIPTOR_SUBTYPE 0x01U +#define MIDI_MIDI_IN_JACK_DESCRIPTOR_SUBTYPE 0x02U +#define MIDI_MIDI_OUT_JACK_DESCRIPTOR_SUBTYPE 0x03U + +/* bJackType */ +#define MIDI_JACK_TYPE_EMBEDDED 0x01 +#define MIDI_JACK_TYPE_EXTERNAL 0x02 + +#define MIDI_CHANNEL_OMNI 0 +#define MIDI_CHANNEL_OFF 17 + +#define MIDI_PITCHBEND_MIN -8192 +#define MIDI_PITCHBEND_MAX 8191 + +/*! Enumeration of MIDI code index number */ +enum MidiCodeIndexNumber { + MIDI_CIN_MISC = 0, + MIDI_CIN_CABLE_EVENT = 1, + MIDI_CIN_SYSCOM_2BYTE = 2, ///< 2 byte system common message e.g MTC, SongSelect + MIDI_CIN_SYSCOM_3BYTE = 3, ///< 3 byte system common message e.g SPP + MIDI_CIN_SYSEX_START = 4, ///< SysEx starts or continue + MIDI_CIN_SYSEX_END_1BYTE = 5, ///< SysEx ends with 1 data, or 1 byte system common message + MIDI_CIN_SYSEX_END_2BYTE = 6, ///< SysEx ends with 2 data + MIDI_CIN_SYSEX_END_3BYTE = 7, ///< SysEx ends with 3 data + MIDI_CIN_NOTE_OFF = 8, + MIDI_CIN_NOTE_ON = 9, + MIDI_CIN_POLY_KEYPRESS = 10, + MIDI_CIN_CONTROL_CHANGE = 11, + MIDI_CIN_PROGRAM_CHANGE = 12, + MIDI_CIN_CHANNEL_PRESSURE = 13, + MIDI_CIN_PITCH_BEND_CHANGE = 14, + MIDI_CIN_1BYTE_DATA = 15 +}; + +/*! Enumeration of MIDI types */ +enum MidiType { + InvalidType = 0x00, ///< For notifying errors + NoteOff = 0x80, ///< Note Off + NoteOn = 0x90, ///< Note On + AfterTouchPoly = 0xA0, ///< Polyphonic AfterTouch + ControlChange = 0xB0, ///< Control Change / Channel Mode + ProgramChange = 0xC0, ///< Program Change + AfterTouchChannel = 0xD0, ///< Channel (monophonic) AfterTouch + PitchBend = 0xE0, ///< Pitch Bend + SystemExclusive = 0xF0, ///< System Exclusive + TimeCodeQuarterFrame = 0xF1, ///< System Common - MIDI Time Code Quarter Frame + SongPosition = 0xF2, ///< System Common - Song Position Pointer + SongSelect = 0xF3, ///< System Common - Song Select + TuneRequest = 0xF6, ///< System Common - Tune Request + Clock = 0xF8, ///< System Real Time - Timing Clock + Start = 0xFA, ///< System Real Time - Start + Continue = 0xFB, ///< System Real Time - Continue + Stop = 0xFC, ///< System Real Time - Stop + ActiveSensing = 0xFE, ///< System Real Time - Active Sensing + SystemReset = 0xFF, ///< System Real Time - System Reset +}; + +/*! Enumeration of Thru filter modes */ +enum MidiFilterMode { + Off = 0, ///< Thru disabled (nothing passes through). + Full = 1, ///< Fully enabled Thru (every incoming message is sent back). + SameChannel = 2, ///< Only the messages on the Input Channel will be sent back. + DifferentChannel = 3, ///< All the messages but the ones on the Input Channel will be sent back. +}; + +/*! \brief Enumeration of Control Change command numbers. + See the detailed controllers numbers & description here: + http://www.somascape.org/midi/tech/spec.html#ctrlnums + */ +enum MidiControlChangeNumber { + // High resolution Continuous Controllers MSB (+32 for LSB) ---------------- + BankSelect = 0, + ModulationWheel = 1, + BreathController = 2, + // CC3 undefined + FootController = 4, + PortamentoTime = 5, + DataEntry = 6, + ChannelVolume = 7, + Balance = 8, + // CC9 undefined + Pan = 10, + ExpressionController = 11, + EffectControl1 = 12, + EffectControl2 = 13, + // CC14 undefined + // CC15 undefined + GeneralPurposeController1 = 16, + GeneralPurposeController2 = 17, + GeneralPurposeController3 = 18, + GeneralPurposeController4 = 19, + + // Switches ---------------------------------------------------------------- + Sustain = 64, + Portamento = 65, + Sostenuto = 66, + SoftPedal = 67, + Legato = 68, + Hold = 69, + + // Low resolution continuous controllers ----------------------------------- + SoundController1 = 70, ///< Synth: Sound Variation FX: Exciter On/Off + SoundController2 = 71, ///< Synth: Harmonic Content FX: Compressor On/Off + SoundController3 = 72, ///< Synth: Release Time FX: Distortion On/Off + SoundController4 = 73, ///< Synth: Attack Time FX: EQ On/Off + SoundController5 = 74, ///< Synth: Brightness FX: Expander On/Off + SoundController6 = 75, ///< Synth: Decay Time FX: Reverb On/Off + SoundController7 = 76, ///< Synth: Vibrato Rate FX: Delay On/Off + SoundController8 = 77, ///< Synth: Vibrato Depth FX: Pitch Transpose On/Off + SoundController9 = 78, ///< Synth: Vibrato Delay FX: Flange/Chorus On/Off + SoundController10 = 79, ///< Synth: Undefined FX: Special Effects On/Off + GeneralPurposeController5 = 80, + GeneralPurposeController6 = 81, + GeneralPurposeController7 = 82, + GeneralPurposeController8 = 83, + PortamentoControl = 84, + // CC85 to CC90 undefined + Effects1 = 91, ///< Reverb send level + Effects2 = 92, ///< Tremolo depth + Effects3 = 93, ///< Chorus send level + Effects4 = 94, ///< Celeste depth + Effects5 = 95, ///< Phaser depth + + // Channel Mode messages --------------------------------------------------- + AllSoundOff = 120, + ResetAllControllers = 121, + LocalControl = 122, + AllNotesOff = 123, + OmniModeOff = 124, + OmniModeOn = 125, + MonoModeOn = 126, + PolyModeOn = 127 +}; + +struct midi_cs_if_ac_header_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint16_t bcdADC; + uint16_t wTotalLength; + uint8_t bInCollection; + uint8_t baInterfaceNr[]; +} __PACKED; + +#define MIDI_SIZEOF_AC_HEADER_DESC(n) (8 + n) + +struct midi_cs_if_ms_header_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint16_t bcdMSC; + uint16_t wTotalLength; +} __PACKED; + +#define MIDI_SIZEOF_MS_HEADER_DESC (7) + +struct midi_cs_if_in_jack_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bJackType; + uint8_t bJackId; + uint8_t iJack; +} __PACKED; + +#define MIDI_SIZEOF_IN_JACK_DESC (6) + +struct midi_cs_if_out_jack_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bJackType; + uint8_t bJackId; + uint8_t bNrInputPins; + uint8_t baSourceId; + uint8_t baSourcePin; + uint8_t iJack; +} __PACKED; + +#define MIDI_SIZEOF_OUT_JACK_DESC (9) + +struct midi_cs_ep_ms_general_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bNumEmbMIDIJack; + uint8_t baAssocJackID[]; +} __PACKED; + +#define MIDI_SIZEOF_MS_GENERAL_DESC(n) (4 + n) + +// clang-format off +#define MIDI_STANDARD_DESCRIPTOR_INIT(bInterfaceNumber, bNumEndpoints) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + bNumEndpoints, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_MIDISTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + 0x00 /* iInterface */ + +#define MIDI_STANDARD_DESCRIPTOR_LEN 0x09 + +#define MIDI_CS_HEADER_DESCRIPTOR_INIT(wTotalLength) \ + 0x07, /* bLength */ \ + USB_CS_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + MIDI_MS_HEADER_DESCRIPTOR_SUBTYPE, /* bDescriptorSubtype */ \ + WBVAL(0x0100), /* bcdMSC */ \ + WBVAL(wTotalLength) /* wTotalLength */ + +#define MIDI_IN_JACK_DESCRIPTOR_INIT(bJackType, bJackID) \ + 0x06, \ + 0x24, \ + MIDI_MIDI_IN_JACK_DESCRIPTOR_SUBTYPE, \ + bJackType, \ + bJackID, \ + 0x00 + +#define MIDI_OUT_JACK_DESCRIPTOR_INIT(bJackType, bJackID, baSourceID) \ + 0x09, \ + 0x24, \ + MIDI_MIDI_OUT_JACK_DESCRIPTOR_SUBTYPE, \ + bJackType, \ + bJackID, \ + 0x01, \ + baSourceID, \ + 0x01, \ + 0x00 + +#define MIDI_JACK_DESCRIPTOR_INIT(bJackFirstID) \ + MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, bJackFirstID), \ + MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, (bJackFirstID + 1)), \ + MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, (bJackFirstID + 2), (bJackFirstID + 1)), \ + MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, (bJackFirstID + 3), (bJackFirstID)) + +#define MIDI_SIZEOF_JACK_DESC (6 + 6 + 9 + 9) + +// clang-format on + +#endif /* USB_MIDI_H */ diff --git a/src/lib/CherryUSB/class/msc/usb_msc.h b/src/lib/CherryUSB/class/msc/usb_msc.h new file mode 100644 index 000000000..75187f5ee --- /dev/null +++ b/src/lib/CherryUSB/class/msc/usb_msc.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_MSC_H +#define USB_MSC_H + +/* MSC Subclass Codes */ +#define MSC_SUBCLASS_RBC 0x01 /* Reduced block commands (e.g., flash devices) */ +#define MSC_SUBCLASS_SFF8020I_MMC2 0x02 /* SFF-8020i/MMC-2 (ATAPI) (e.g., C/DVD) */ +#define MSC_SUBCLASS_QIC157 0x03 /* QIC-157 (e.g., tape device) */ +#define MSC_SUBCLASS_UFI 0x04 /* e.g. floppy device */ +#define MSC_SUBCLASS_SFF8070I 0x05 /* SFF-8070i (e.g. floppy disk) */ +#define MSC_SUBCLASS_SCSI 0x06 /* SCSI transparent */ + +/* MSC Protocol Codes */ +#define MSC_PROTOCOL_CBI_INT 0x00 /* CBI transport with command completion interrupt */ +#define MSC_PROTOCOL_CBI_NOINT 0x01 /* CBI transport without command completion interrupt */ +#define MSC_PROTOCOL_BULK_ONLY 0x50 /* Bulk only transport */ + +/* MSC Request Codes */ +#define MSC_REQUEST_RESET 0xFF +#define MSC_REQUEST_GET_MAX_LUN 0xFE + +/** MSC Command Block Wrapper (CBW) Signature */ +#define MSC_CBW_Signature 0x43425355 +/** Bulk-only Command Status Wrapper (CSW) Signature */ +#define MSC_CSW_Signature 0x53425355 + +/** MSC Command Block Status Values */ +#define CSW_STATUS_CMD_PASSED 0x00 +#define CSW_STATUS_CMD_FAILED 0x01 +#define CSW_STATUS_PHASE_ERROR 0x02 + +#define MSC_MAX_CDB_LEN (16) /* Max length of SCSI Command Data Block */ + +/** MSC Bulk-Only Command Block Wrapper (CBW) */ +struct CBW { + uint32_t dSignature; /* 'USBC' = 0x43425355 */ + uint32_t dTag; /* Depends on command id */ + uint32_t dDataLength; /* Number of bytes that host expects to transfer */ + uint8_t bmFlags; /* Bit 7: Direction=IN (other obsolete or reserved) */ + uint8_t bLUN; /* LUN (normally 0) */ + uint8_t bCBLength; /* len of cdb[] */ + uint8_t CB[MSC_MAX_CDB_LEN]; /* Command Data Block */ +} __PACKED; + +#define USB_SIZEOF_MSC_CBW 31 + +/** MSC Bulk-Only Command Status Wrapper (CSW) */ +struct CSW { + uint32_t dSignature; /* 'USBS' = 0x53425355 */ + uint32_t dTag; /* Same tag as original command */ + uint32_t dDataResidue; /* Amount not transferred */ + uint8_t bStatus; /* Status of transfer */ +} __PACKED; + +#define USB_SIZEOF_MSC_CSW 13 + +/*Length of template descriptor: 23 bytes*/ +#define MSC_DESCRIPTOR_LEN (9 + 7 + 7) +// clang-format off +#define MSC_DESCRIPTOR_INIT(bFirstInterface, out_ep, in_ep, wMaxPacketSize, str_idx) \ + /* Interface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x02, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_MASS_STORAGE, /* bInterfaceClass */ \ + MSC_SUBCLASS_SCSI, /* bInterfaceSubClass */ \ + MSC_PROTOCOL_BULK_ONLY, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00 /* bInterval */ +// clang-format on + +#endif /* USB_MSC_H */ diff --git a/src/lib/CherryUSB/class/msc/usb_scsi.h b/src/lib/CherryUSB/class/msc/usb_scsi.h new file mode 100644 index 000000000..7eeb50a72 --- /dev/null +++ b/src/lib/CherryUSB/class/msc/usb_scsi.h @@ -0,0 +1,972 @@ +/* + * Apache NuttX + * Copyright 2020 The Apache Software Foundation + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef __INCLUDE_NUTTX_SCSI_H +#define __INCLUDE_NUTTX_SCSI_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* SCSI commands ************************************************************/ + +#define SCSI_CMD_TESTUNITREADY 0x00 +#define SCSI_CMD_REZEROUNIT 0x01 +#define SCSI_CMD_REQUESTSENSE 0x03 +#define SCSI_CMD_FORMAT_UNIT 0x04 +#define SCSI_CMD_REASSIGNBLOCKS 0x07 +#define SCSI_CMD_READ6 0x08 +#define SCSI_CMD_WRITE6 0x0a +#define SCSI_CMD_SEEK6 0x0b +#define SCSI_CMD_SPACE6 0x11 +#define SCSI_CMD_INQUIRY 0x12 +#define SCSI_CMD_MODESELECT6 0x15 +#define SCSI_CMD_RESERVE6 0x16 +#define SCSI_CMD_RELEASE6 0x17 +#define SCSI_CMD_COPY 0x18 +#define SCSI_CMD_MODESENSE6 0x1a +#define SCSI_CMD_STARTSTOPUNIT 0x1b +#define SCSI_CMD_RECEIVEDIAGNOSTICRESULTS 0x1c +#define SCSI_CMD_SENDDIAGNOSTIC 0x1d +#define SCSI_CMD_PREVENTMEDIAREMOVAL 0x1e +#define SCSI_CMD_READFORMATCAPACITIES 0x23 +#define SCSI_CMD_READCAPACITY10 0x25 +#define SCSI_CMD_READ10 0x28 +#define SCSI_CMD_WRITE10 0x2a +#define SCSI_CMD_SEEK10 0x2b +#define SCSI_CMD_WRITEANDVERIFY 0x2e +#define SCSI_CMD_VERIFY10 0x2f +#define SCSI_CMD_SEARCHDATAHIGH 0x30 +#define SCSI_CMD_SEARCHDATAEQUAL 0x31 +#define SCSI_CMD_SEARCHDATALOW 0x32 +#define SCSI_CMD_SETLIMITS10 0x33 +#define SCSI_CMD_PREFETCH10 0x34 +#define SCSI_CMD_SYNCHCACHE10 0x35 +#define SCSI_CMD_LOCKCACHE 0x36 +#define SCSI_CMD_READDEFECTDATA10 0x37 +#define SCSI_CMD_COMPARE 0x39 +#define SCSI_CMD_COPYANDVERIFY 0x3a +#define SCSI_CMD_WRITEBUFFER 0x3b +#define SCSI_CMD_READBUFFER 0x3c +#define SCSI_CMD_READLONG10 0x3e +#define SCSI_CMD_WRITELONG10 0x3f +#define SCSI_CMD_CHANGEDEFINITION 0x40 +#define SCSI_CMD_WRITESAME10 0x41 +#define SCSI_CMD_LOGSELECT 0x4c +#define SCSI_CMD_LOGSENSE 0x4d +#define SCSI_CMD_XDWRITE10 0x50 +#define SCSI_CMD_XPWRITE10 0x51 +#define SCSI_CMD_XDREAD10 0x52 +#define SCSI_CMD_MODESELECT10 0x55 +#define SCSI_CMD_RESERVE10 0x56 +#define SCSI_CMD_RELEASE10 0x57 +#define SCSI_CMD_MODESENSE10 0x5a +#define SCSI_CMD_PERSISTENTRESERVEIN 0x5e +#define SCSI_CMD_PERSISTENTRESERVEOUT 0x5f +#define SCSI_CMD_32 0x7f +#define SCSI_CMD_XDWRITEEXTENDED 0x80 +#define SCSI_CMD_REBUILD 0x82 +#define SCSI_CMD_REGENERATE 0x82 +#define SCSI_CMD_EXTENDEDCOPY 0x83 +#define SCSI_CMD_COPYRESULTS 0x84 +#define SCSI_CMD_ACCESSCONTROLIN 0x86 +#define SCSI_CMD_ACCESSCONTROLOUT 0x87 +#define SCSI_CMD_READ16 0x88 +#define SCSI_CMD_WRITE16 0x8a +#define SCSI_CMD_READATTRIBUTE 0x8c +#define SCSI_CMD_WRITEATTRIBUTE 0x8d +#define SCSI_CMD_WRITEANDVERIFY16 0x8e +#define SCSI_CMD_PREFETCH16 0x90 +#define SCSI_CMD_SYNCHCACHE16 0x91 +#define SCSI_CMD_LOCKUNLOCKACACHE 0x92 +#define SCSI_CMD_WRITESAME16 0x93 +#define SCSI_CMD_READCAPACITY16 0x9e +#define SCSI_CMD_READLONG16 0x9e +#define SCSI_CMD_WRITELONG106 0x9f +#define SCSI_CMD_REPORTLUNS 0xa0 +#define SCSI_CMD_MAINTENANCEIN 0xa3 +#define SCSI_CMD_MAINTENANCEOUT 0xa4 +#define SCSI_CMD_MOVEMEDIUM 0xa5 +#define SCSI_CMD_MOVEMEDIUMATTACHED 0xa7 +#define SCSI_CMD_READ12 0xa8 +#define SCSI_CMD_WRITE12 0xaa +#define SCSI_CMD_READMEDIASERIALNUMBER 0xab +#define SCSI_CMD_WRITEANDVERIFY12 0xae +#define SCSI_CMD_VERIFY12 0xaf +#define SCSI_CMD_SETLIMITS12 0xb3 +#define SCSI_CMD_READELEMENTSTATUS 0xb4 +#define SCSI_CMD_READDEFECTDATA12 0xb7 +#define SCSI_CMD_REDUNDANCYGROUPIN 0xba +#define SCSI_CMD_REDUNDANCYGROUPOUT 0xbb +#define SCSI_CMD_SPAREIN 0xbc +#define SCSI_CMD_SPAREOUT 0xbd +#define SCSI_CMD_VOLUMESETIN 0xbe +#define SCSI_CMD_VOLUMESETOUT 0xbf + +/* Common SCSI KCQ values (sense Key/additional sense Code/ASC Qualifier) *** + * + * 0xnn0386 Write Fault Data Corruption + * 0xnn0500 Illegal request + * 0xnn0600 Unit attention + * 0xnn0700 Data protect + * 0xnn0800 LUN communication failure + * 0xnn0801 LUN communication timeout + * 0xnn0802 LUN communication parity error + * 0xnn0803 LUN communication CRC error + * 0xnn0900 vendor specific sense key + * 0xnn0901 servo fault + * 0xnn0904 head select fault + * 0xnn0a00 error log overflow + * 0xnn0b00 aborted command + * 0xnn0c00 write error + * 0xnn0c02 write error - auto-realloc failed + * 0xnn0e00 data miscompare + * 0xnn1200 address mark not founf for ID field + * 0xnn1400 logical block not found + * 0xnn1500 random positioning error + * 0xnn1501 mechanical positioning error + * 0xnn1502 positioning error detected by read of medium + * 0xnn2700 write protected + * 0xnn2900 POR or bus reset occurred + * 0xnn3101 format failed + * 0xnn3191 format corrupted + * 0xnn3201 defect list update error + * 0xnn3202 no spares available + * 0xnn3501 unspecified enclosure services failure + * 0xnn3700 parameter rounded + * 0xnn3d00 invalid bits in identify message + * 0xnn3e00 LUN not self-configured yet + * 0xnn4001 DRAM parity error + * 0xnn4002 DRAM parity error + * 0xnn4200 power-on or self-test failure + * 0xnn4c00 LUN failed self-configuration + * 0xnn5c00 RPL status change + * 0xnn5c01 spindles synchronized + * 0xnn5c02 spindles not synchronized + * 0xnn6500 voltage fault + * 0xnn8000 general firmware error + */ + +/* No sense KCQ values */ + +#define SCSI_KCQ_NOSENSE 0x000000 /* No error */ +#define SCSI_KCQ_PFATHRESHOLDREACHED 0x005c00 /* No sense - PFA threshold reached */ + +/* Soft error KCQ values */ + +#define SCSI_KCQSE_RWENOINDEX 0x010100 /* Recovered Write error - no index */ +#define SCSI_KCQSE_RECOVEREDNOSEEKCOMPLETION 0x010200 /* Recovered no seek completion */ +#define SCSI_KCQSE_RWEWRITEFAULT 0x010300 /* Recovered Write error - write fault */ +#define SCSI_KCQSE_TRACKFOLLOWINGERROR 0x010900 /* Track following error */ +#define SCSI_KCQSE_TEMPERATUREWARNING 0x010b01 /* Temperature warning */ +#define SCSI_KCQSE_RWEWARREALLOCATED 0x010c01 /* Recovered Write error with auto-realloc - reallocated */ +#define SCSI_KCQSE_RWERECOMMENDREASSIGN 0x010c03 /* Recovered Write error - recommend reassign */ +#define SCSI_KCQSE_RDWOEUSINGPREVLBI 0x011201 /* Recovered data without ECC using prev logical block ID */ +#define SCSI_KCQSE_RDWEUSINGPREVLBI 0x011202 /* Recovered data with ECC using prev logical block ID */ +#define SCSI_KCQSE_RECOVEREDRECORDNOTFOUND 0x011401 /* Recovered Record Not Found */ +#define SCSI_KCQSE_RWEDSME 0x011600 /* Recovered Write error - Data Sync Mark Error */ +#define SCSI_KCQSE_RWEDSEDATAREWRITTEN 0x011601 /* Recovered Write error - Data Sync Error - data rewritten */ +#define SCSI_KCQSE_RWEDSERECOMMENDREWRITE 0x011602 /* Recovered Write error - Data Sync Error - recommend rewrite */ +#define SCSI_KCQSE_RWEDSEDATAAUTOREALLOCATED 0x011603 /* Recovered Write error - Data Sync Error - data auto-reallocated */ +#define SCSI_KCQSE_RWEDSERECOMMENDREASSIGNMENT 0x011604 /* Recovered Write error - Data Sync Error - recommend reassignment */ +#define SCSI_KCQSE_RDWNECORRECTIONAPPLIED 0x011700 /* Recovered data with no error correction applied */ +#define SCSI_KCQSE_RREWITHRETRIES 0x011701 /* Recovered Read error - with retries */ +#define SCSI_KCQSE_RDUSINGPOSITIVEOFFSET 0x011702 /* Recovered data using positive offset */ +#define SCSI_KCQSE_RDUSINGNEGATIVEOFFSET 0x011703 /* Recovered data using negative offset */ +#define SCSI_KCQSE_RDUSINGPREVIOUSLBI 0x011705 /* Recovered data using previous logical block ID */ +#define SCSI_KCQSE_RREWOEAUTOREALLOCATED 0x011706 /* Recovered Read error - without ECC, auto reallocated */ +#define SCSI_KCQSE_RREWOERECOMMENDREASSIGN 0x011707 /* Recovered Read error - without ECC, recommend reassign */ +#define SCSI_KCQSE_RREWOERECOMMENDREWRITE 0x011708 /* Recovered Read error - without ECC, recommend rewrite */ +#define SCSI_KCQSE_RREWOEDATAREWRITTEN 0x011709 /* Recovered Read error - without ECC, data rewritten */ +#define SCSI_KCQSE_RREWE 0x011800 /* Recovered Read error - with ECC */ +#define SCSI_KCQSE_RDWEANDRETRIES 0x011801 /* Recovered data with ECC and retries */ +#define SCSI_KCQSE_RREWEAUTOREALLOCATED 0x011802 /* Recovered Read error - with ECC, auto reallocated */ +#define SCSI_KCQSE_RREWERECOMMENDREASSIGN 0x011805 /* Recovered Read error - with ECC, recommend reassign */ +#define SCSI_KCQSE_RDUSINGECCANDOFFSETS 0x011806 /* Recovered data using ECC and offsets */ +#define SCSI_KCQSE_RREWEDATAREWRITTEN 0x011807 /* Recovered Read error - with ECC, data rewritten */ +#define SCSI_KCQSE_DLNOTFOUND 0x011c00 /* Defect List not found */ +#define SCSI_KCQSE_PRIMARYDLNOTFOUND 0x011c01 /* Primary defect list not found */ +#define SCSI_KCQSE_GROWNDLNOTFOUND 0x011c02 /* Grown defect list not found */ +#define SCSI_KCQSE_PARTIALDLTRANSFERRED 0x011f00 /* Partial defect list transferred */ +#define SCSI_KCQSE_INTERNALTARGETFAILURE 0x014400 /* Internal target failure */ +#define SCSI_KCQSE_PFATHRESHOLDREACHED 0x015d00 /* PFA threshold reached */ +#define SCSI_KCQSE_PFATESTWARNING 0x015dff /* PFA test warning */ +#define SCSI_KCQSE_INTERNALLOGICFAILURE 0x018100 /* Internal logic failure */ + +/* Not Ready / Diagnostic Failure KCQ values */ + +#define SCSI_KCQNR_CAUSENOTREPORTABLE 0x020400 /* Not Ready - Cause not reportable. */ +#define SCSI_KCQNR_BECOMINGREADY 0x020401 /* Not Ready - becoming ready */ +#define SCSI_KCQNR_NEEDINITIALIZECOMMAND 0x020402 /* Not Ready - need initialize command (start unit) */ +#define SCSI_KCQNR_MANUALINTERVENTIONREQUIRED 0x020403 /* Not Ready - manual intervention required */ +#define SCSI_KCQNR_FORMATINPROGRESS 0x020404 /* Not Ready - format in progress */ +#define SCSI_KCQNR_SELFTESTINPROGRESS 0x020409 /* Not Ready - self-test in progress */ +#define SCSI_KCQNR_MEDIUMFORMATCORRUPTED 0x023100 /* Not Ready - medium format corrupted */ +#define SCSI_KCQNR_FORMATCOMMANDFAILED 0x023101 /* Not Ready - format command failed */ +#define SCSI_KCQNR_ESUNAVAILABLE 0x023502 /* Not Ready - enclosure services unavailable */ +#define SCSI_KCQNR_MEDIANOTPRESENT 0x023a00 /* Not Ready - media not present */ +#define SCSI_KCQDF_BRINGUPFAILORDEGRADEDMODE 0x024080 /* Diagnostic Failure - bring-up fail or degraded mode */ +#define SCSI_KCQDF_HARDDISKCONTROLLER 0x024081 /* Diagnostic Failure - Hard Disk Controller */ +#define SCSI_KCQDF_RAMMICROCODENOTLOADED 0x024085 /* Diagnostic Failure - RAM microcode not loaded */ +#define SCSI_KCQDF_RROCALIBRATION 0x024090 /* Diagnostic Failure - RRO Calibration */ +#define SCSI_KCQDF_CHANNELCALIBRATION 0x024091 /* Diagnostic Failure - Channel Calibration */ +#define SCSI_KCQDF_HEADLOAD 0x024092 /* Diagnostic Failure - Head Load */ +#define SCSI_KCQDF_WRITEAE 0x024093 /* Diagnostic Failure - Write AE */ +#define SCSI_KCQDF_12VOVERCURRENT 0x024094 /* Diagnostic Failure - 12V over current */ +#define SCSI_KCQDF_OTHERSPINDLEFAILURE 0x024095 /* Diagnostic Failure - Other spindle failure */ +#define SCSI_KCQDF_SELFRESET 0x0240b0 /* Diagnostic Failure - self-reset */ +#define SCSI_KCQDF_CONFIGNOTLOADED 0x024c00 /* Diagnostic Failure - config not loaded */ + +/* Medium error KCQ values */ + +#define SCSI_KCQME_WRITEFAULT 0x030300 /* Medium Error - write fault */ +#define SCSI_KCQME_WRITEFAULTAUTOREALLOCFAILED 0x030c02 /* Medium Error - write error - auto-realloc failed */ +#define SCSI_KCQME_WRITERTLIMITEXCEEDED 0x030cbb /* Medium Error - write recovery time limit exceeded */ +#define SCSI_KCQME_IDCRCERROR 0x031000 /* Medium Error - ID CRC error */ +#define SCSI_KCQME_UNRRE1 0x031100 /* Medium Error - unrecovered read error */ +#define SCSI_KCQME_READRETRIESEXHAUSTED 0x031101 /* Medium Error - read retries exhausted */ +#define SCSI_KCQME_ERRORTOOLONGTOCORRECT 0x031102 /* Medium Error - error too long to correct */ +#define SCSI_KCQME_UREAUTOREALLOCFAILED 0x031104 /* Medium Error - unrecovered read error - auto re-alloc failed */ +#define SCSI_KCQME_URERECOMMENDREASSIGN 0x03110b /* Medium Error - unrecovered read error - recommend reassign */ +#define SCSI_KCQME_READRTLIMITEXCEEDED 0x0311ff /* Medium Error - read recovery time limit exceeded */ +#define SCSI_KCQME_RECORDNOTFOUND 0x031401 /* Medium Error - record not found */ +#define SCSI_KCQME_DSME 0x031600 /* Medium Error - Data Sync Mark error */ +#define SCSI_KCQME_DSERECOMMENDREASSIGN 0x031604 /* Medium Error - Data Sync Error - recommend reassign */ +#define SCSI_KCQME_DLE 0x031900 /* Medium Error - defect list error */ +#define SCSI_KCQME_DLNOTAVAILABLE 0x031901 /* Medium Error - defect list not available */ +#define SCSI_KCQME_DLEINPRIMARYLIST 0x031902 /* Medium Error - defect list error in primary list */ +#define SCSI_KCQME_DLEINGROWNLIST 0x031903 /* Medium Error - defect list error in grown list */ +#define SCSI_KCQME_FEWERTHAN50PCTDLCOPIES 0x03190e /* Medium Error - fewer than 50% defect list copies */ +#define SCSI_KCQME_MEDIUMFORMATCORRUPTED 0x033100 /* Medium Error - medium format corrupted */ +#define SCSI_KCQME_FORMATCOMMANDFAILED 0x033101 /* Medium Error - format command failed */ +#define SCSI_KCQME_DATAAUTOREALLOCATED 0x038000 /* Medium Error - data auto-reallocated */ + +/* Hardware Error KCQ values */ + +#define SCSI_KCQHE_NOINDEXORSECTOR 0x040100 /* Hardware Error - no index or sector */ +#define SCSI_KCQHE_NOSEEKCOMPLETE 0x040200 /* Hardware Error - no seek complete */ +#define SCSI_KCQHE_WRITEFAULT 0x040300 /* Hardware Error - write fault */ +#define SCSI_KCQHE_COMMUNICATIONFAILURE 0x040800 /* Hardware Error - communication failure */ +#define SCSI_KCQHE_TRACKFOLLOWINGERROR 0x040900 /* Hardware Error - track following error */ +#define SCSI_KCQHE_UREINRESERVEDAREA 0x041100 /* Hardware Error - unrecovered read error in reserved area */ +#define SCSI_KCQHE_DSMEINRESERVEDAREA 0x041600 /* Hardware Error - Data Sync Mark error in reserved area */ +#define SCSI_KCQHE_DLE 0x041900 /* Hardware Error - defect list error */ +#define SCSI_KCQHE_DLEINPRIMARYLIST 0x041902 /* Hardware Error - defect list error in Primary List */ +#define SCSI_KCQHE_DLEINGROWNLIST 0x041903 /* Hardware Error - defect list error in Grown List */ +#define SCSI_KCQHE_REASSIGNFAILED 0x043100 /* Hardware Error - reassign failed */ +#define SCSI_KCQHE_NODEFECTSPAREAVAILABLE 0x043200 /* Hardware Error - no defect spare available */ +#define SCSI_KCQHE_UNSUPPORTEDENCLOSUREFUNCTION 0x043501 /* Hardware Error - unsupported enclosure function */ +#define SCSI_KCQHE_ESUNAVAILABLE 0x043502 /* Hardware Error - enclosure services unavailable */ +#define SCSI_KCQHE_ESTRANSFERFAILURE 0x043503 /* Hardware Error - enclosure services transfer failure */ +#define SCSI_KCQHE_ESREFUSED 0x043504 /* Hardware Error - enclosure services refused */ +#define SCSI_KCQHE_SELFTESTFAILED 0x043e03 /* Hardware Error - self-test failed */ +#define SCSI_KCQHE_UNABLETOUPDATESELFTEST 0x043e04 /* Hardware Error - unable to update self-test */ +#define SCSI_KCQHE_DMDIAGNOSTICFAIL 0x044080 /* Hardware Error - Degrade Mode. Diagnostic Fail */ +#define SCSI_KCQHE_DMHWERROR 0x044081 /* Hardware Error - Degrade Mode. H/W Error */ +#define SCSI_KCQHE_DMRAMMICROCODENOTLOADED 0x044085 /* Hardware Error - Degrade Mode. RAM microcode not loaded */ +#define SCSI_KCQHE_SEEKTESTFAILURE 0x044090 /* Hardware Error - seek test failure */ +#define SCSI_KCQHE_READWRITETESTFAILURE 0x0440a0 /* Hardware Error - read/write test failure */ +#define SCSI_KCQHE_DEVICESELFRESET 0x0440b0 /* Hardware Error - device self-reset */ +#define SCSI_KCQHE_COMPONENTMISMATCH 0x0440d0 /* Hardware Error - component mismatch */ +#define SCSI_KCQHE_INTERNALTARGETFAILURE 0x044400 /* Hardware Error - internal target failure */ +#define SCSI_KCQHE_INTERNALLOGICERROR 0x048100 /* Hardware Error - internal logic error */ +#define SCSI_KCQHE_COMMANDTIMEOUT 0x048200 /* Hardware Error - command timeout */ + +/* Illegal Request KCQ values */ + +#define SCSI_KCQIR_PARMLISTLENGTHERROR 0x051a00 /* Illegal Request - parm list length error */ +#define SCSI_KCQIR_INVALIDCOMMAND 0x052000 /* Illegal Request - invalid/unsupported command code */ +#define SCSI_KCQIR_LBAOUTOFRANGE 0x052100 /* Illegal Request - LBA out of range */ +#define SCSI_KCQIR_INVALIDFIELDINCBA 0x052400 /* Illegal Request - invalid field in CDB (Command Descriptor Block) */ +#define SCSI_KCQIR_INVALIDLUN 0x052500 /* Illegal Request - invalid LUN */ +#define SCSI_KCQIR_INVALIDFIELDSINPARMLIST 0x052600 /* Illegal Request - invalid fields in parm list */ +#define SCSI_KCQIR_PARAMETERNOTSUPPORTED 0x052601 /* Illegal Request - parameter not supported */ +#define SCSI_KCQIR_INVALIDPARMVALUE 0x052602 /* Illegal Request - invalid parm value */ +#define SCSI_KCQIR_IFPTHRESHOLDPARAMETER 0x052603 /* Illegal Request - invalid field parameter - threshold parameter */ +#define SCSI_KCQIR_INVALIDRELEASEOFPR 0x052604 /* Illegal Request - invalid release of persistent reservation */ +#define SCSI_KCQIR_IFPTMSFIRMWARETAG 0x052697 /* Illegal Request - invalid field parameter - TMS firmware tag */ +#define SCSI_KCQIR_IFPCHECKSUM 0x052698 /* Illegal Request - invalid field parameter - check sum */ +#define SCSI_KCQIR_IFPFIRMWARETAG 0x052699 /* Illegal Request - invalid field parameter - firmware tag */ +#define SCSI_KCQIR_COMMANDSEQUENCEERROR 0x052c00 /* Illegal Request - command sequence error */ +#define SCSI_KCQIR_UNSUPPORTEDENCLOSUREFUNCTION 0x053501 /* Illegal Request - unsupported enclosure function */ +#define SCSI_KCQIR_SAVINGPARMSNOTSUPPORTED 0x053900 /* Illegal Request - Saving parameters not supported */ +#define SCSI_KCQIR_INVALIDMESSAGE 0x054900 /* Illegal Request - invalid message */ +#define SCSI_KCQIR_MEDIALOADOREJECTFAILED 0x055300 /* Illegal Request - media load or eject failed */ +#define SCSI_KCQIR_UNLOADTAPEFAILURE 0x055301 /* Illegal Request - unload tape failure */ +#define SCSI_KCQIR_MEDIUMREMOVALPREVENTED 0x055302 /* Illegal Request - medium removal prevented */ +#define SCSI_KCQIR_SYSTEMRESOURCEFAILURE 0x055500 /* Illegal Request - system resource failure */ +#define SCSI_KCQIR_SYSTEMBUFFERFULL 0x055501 /* Illegal Request - system buffer full */ +#define SCSI_KCQIR_INSUFFICIENTRR 0x055504 /* Illegal Request - Insufficient Registration Resources */ + +/* Unit Attention KCQ values */ + +#define SCSI_KCQUA_NOTREADYTOTRANSITION 0x062800 /* Unit Attention - not-ready to ready transition (format complete) */ +#define SCSI_KCQUA_DEVICERESETOCCURRED 0x062900 /* Unit Attention - POR or device reset occurred */ +#define SCSI_KCQUA_POROCCURRED 0x062901 /* Unit Attention - POR occurred */ +#define SCSI_KCQUA_SCSIBUSRESETOCCURRED 0x062902 /* Unit Attention - SCSI bus reset occurred */ +#define SCSI_KCQUA_TARGETRESETOCCURRED 0x062903 /* Unit Attention - TARGET RESET occurred */ +#define SCSI_KCQUA_SELFINITIATEDRESETOCCURRED 0x062904 /* Unit Attention - self-initiated-reset occurred */ +#define SCSI_KCQUA_TRANSCEIVERMODECHANGETOSE 0x062905 /* Unit Attention - transceiver mode change to SE */ +#define SCSI_KCQUA_TRANSCEIVERMODECHANGETOLVD 0x062906 /* Unit Attention - transceiver mode change to LVD */ +#define SCSI_KCQUA_PARAMETERSCHANGED 0x062a00 /* Unit Attention - parameters changed */ +#define SCSI_KCQUA_MODEPARAMETERSCHANGED 0x062a01 /* Unit Attention - mode parameters changed */ +#define SCSI_KCQUA_LOGSELECTPARMSCHANGED 0x062a02 /* Unit Attention - log select parms changed */ +#define SCSI_KCQUA_RESERVATIONSPREEMPTED 0x062a03 /* Unit Attention - Reservations pre-empted */ +#define SCSI_KCQUA_RESERVATIONSRELEASED 0x062a04 /* Unit Attention - Reservations released */ +#define SCSI_KCQUA_REGISTRATIONSPREEMPTED 0x062a05 /* Unit Attention - Registrations pre-empted */ +#define SCSI_KCQUA_COMMANDSCLEARED 0x062f00 /* Unit Attention - commands cleared by another initiator */ +#define SCSI_KCQUA_OPERATINGCONDITIONSCHANGED 0x063f00 /* Unit Attention - target operating conditions have changed */ +#define SCSI_KCQUA_MICROCODECHANGED 0x063f01 /* Unit Attention - microcode changed */ +#define SCSI_KCQUA_CHANGEDOPERATINGDEFINITION 0x063f02 /* Unit Attention - changed operating definition */ +#define SCSI_KCQUA_INQUIRYPARAMETERSCHANGED 0x063f03 /* Unit Attention - inquiry parameters changed */ +#define SCSI_KCQUA_DEVICEIDENTIFIERCHANGED 0x063f05 /* Unit Attention - device identifier changed */ +#define SCSI_KCQUA_INVALIDAPMPARAMETERS 0x063f90 /* Unit Attention - invalid APM parameters */ +#define SCSI_KCQUA_WORLDWIDENAMEMISMATCH 0x063f91 /* Unit Attention - world-wide name mismatch */ +#define SCSI_KCQUA_PFATHRESHOLDREACHED 0x065d00 /* Unit Attention - PFA threshold reached */ +#define SCSI_KCQUA_PFATHRESHOLDEXCEEDED 0x065dff /* Unit Attention - PFA threshold exceeded */ + +/* Write Protect KCQ values */ + +#define SCSI_KCQWP_COMMANDNOTALLOWED 0x072700 /* Write Protect - command not allowed */ + +/* Aborted Command KCQ values */ + +#define SCSI_KCQAC_NOADDITIONALSENSECODE 0x0b0000 /* Aborted Command - no additional sense code */ +#define SCSI_KCQAC_SYNCDATATRANSFERERROR 0x0b1b00 /* Aborted Command - sync data transfer error (extra ACK) */ +#define SCSI_KCQAC_UNSUPPORTEDLUN 0x0b2500 /* Aborted Command - unsupported LUN */ +#define SCSI_KCQAC_ECHOBUFFEROVERWRITTEN 0x0b3f0f /* Aborted Command - echo buffer overwritten */ +#define SCSI_KCQAC_MESSAGEREJECTERROR 0x0b4300 /* Aborted Command - message reject error */ +#define SCSI_KCQAC_INTERNALTARGETFAILURE 0x0b4400 /* Aborted Command - internal target failure */ +#define SCSI_KCQAC_SELECTIONFAILURE 0x0b4500 /* Aborted Command - Selection/Reselection failure */ +#define SCSI_KCQAC_SCSIPARITYERROR 0x0b4700 /* Aborted Command - SCSI parity error */ +#define SCSI_KCQAC_INITIATORDETECTEDERRORECEIVED 0x0b4800 /* Aborted Command - initiator-detected error message received */ +#define SCSI_KCQAC_ILLEGALMESSAGE 0x0b4900 /* Aborted Command - inappropriate/illegal message */ +#define SCSI_KCQAC_DATAPHASEERROR 0x0b4b00 /* Aborted Command - data phase error */ +#define SCSI_KCQAC_OVERLAPPEDCOMMANDSATTEMPTED 0x0b4e00 /* Aborted Command - overlapped commands attempted */ +#define SCSI_KCQAC_LOOPINITIALIZATION 0x0b4f00 /* Aborted Command - due to loop initialization */ + +/* Other KCQ values: */ + +#define SCSO_KCQOTHER_MISCOMPARE 0x0e1d00 /* Miscompare - during verify byte check operation */ + +/* SSCSI Status Codes *******************************************************/ + +#define SCSI_STATUS_OK 0x00 /* OK */ +#define SCSI_STATUS_CHECKCONDITION 0x02 /* Check condition */ +#define SCSI_STATUS_CONDITIONMET 0x04 /* Condition met */ +#define SCSI_STATUS_BUSY 0x08 /* Busy */ +#define SCSI_STATUS_INTERMEDIATE 0x10 /* Intermediate */ +#define SCSI_STATUS_DATAOVERUNDERRUN 0x12 /* Data Under/Over Run? */ +#define SCSI_STATUS_INTERMEDIATECONDITIONMET 0x14 /* Intermediate - Condition met */ +#define SCSI_STATUS_RESERVATIONCONFLICT 0x18 /* Reservation conflict */ +#define SCSI_STATUS_COMMANDTERMINATED 0x22 /* Command terminated */ +#define SCSI_STATUS_QUEUEFULL 0x28 /* Queue (task set) full */ +#define SCSI_STATUS_ACAACTIVE 0x30 /* ACA active */ +#define SCSI_STATUS_TASKABORTED 0x40 /* Task aborted */ + +/* Definitions for selected SCSI commands ***********************************/ + +/* Inquiry */ + +#define SCSICMD_INQUIRYFLAGS_EVPD 0x01 /* Bit 0: EVPD */ + /* Bits 5-7: Peripheral Qualifier */ +#define SCSIRESP_INQUIRYPQ_CONNECTED 0x00 /* 000: Device is connected */ +#define SCSIRESP_INQUIRYPQ_NOTCONNECTED 0x20 /* 001: Device is NOT connected */ +#define SCSIRESP_INQUIRYPQ_NOTCAPABLE 0x60 /* 011: LUN not supported */ + /* Bits 0-4: Peripheral Device */ +#define SCSIRESP_INQUIRYPD_DIRECTACCESS 0x00 /* Direct-access block device */ +#define SCSIRESP_INQUIRYPD_SEQUENTIALACCESS 0x01 /* Sequential-access block device */ +#define SCSIRESP_INQUIRYPD_PRINTER 0x02 /* Printer device */ +#define SCSIRESP_INQUIRYPD_PROCESSOR 0x03 /* Processor device */ +#define SCSIRESP_INQUIRYPD_WRONCE 0x04 /* Write once device */ +#define SCSIRESP_INQUIRYPD_CDDVD 0x05 /* CD/DVD device */ +#define SCSIRESP_INQUIRYPD_SCANNER 0x06 /* Scanner device (obsolete) */ +#define SCSIRESP_INQUIRYPD_OPTICAL 0x07 /* Optical memory device */ +#define SCSIRESP_INQUIRYPD_MEDIUMCHANGER 0x08 /* Medium changer device (Jukebox) */ +#define SCSIRESP_INQUIRYPD_COMMUNICATIONS 0x09 /* Communications device (obsolete) */ +#define SCSIRESP_INQUIRYPD_STORAGEARRAY 0x0c /* Storage array controller device */ +#define SCSIRESP_INQUIRYPD_ENCLOSURESERVICES 0x0d /* Enclosure services device */ +#define SCSIRESP_INQUIRYPD_RBC 0x0e /* Simplified direct-access device */ +#define SCSIRESP_INQUIRYPD_OCRW 0x0f /* Optical reader/writer device */ +#define SCSIRESP_INQUIRYPD_BCC 0x10 /* Bridge controller commands */ +#define SCSIRESP_INQUIRYPD_OSD 0x11 /* Object-based storage device */ +#define SCSIRESP_INQUIRYPD_ADC 0x12 /* Automation/drive interface */ +#define SCSIRESP_INQUIRYPD_WKLU 0x1e /* Well-known logical unit */ +#define SCSIRESP_INQUIRYPD_UNKNOWN 0x1f /* Direct-access block device */ + +#define SCSIRESP_INQUIRYFLAGS1_RMB 0x80 /* Bit 7: RMB */ +#define SCSIRESP_INQUIRYFLAGS2_NORMACA 0x20 /* Bit 5: NormACA */ +#define SCSIRESP_INQUIRYFLAGS2_HISUP 0x10 /* Bit 4: HiSup */ +#define SCSIRESP_INQUIRYFLAGS2_FMTMASK 0x0f /* Bits 0-3: Response data format */ + +#define SCSIRESP_INQUIRYFLAGS3_SCCS 0x80 /* Bit 8: SCCS */ +#define SCSIRESP_INQUIRYFLAGS3_ACC 0x40 /* Bit 7: ACC */ +#define SCSIRESP_INQUIRYFLAGS3_TPGSMASK 0x30 /* Bits 4-5: TPGS */ +#define SCSIRESP_INQUIRYFLAGS3_3PC 0x08 /* Bit 3: 3PC */ +#define SCSIRESP_INQUIRYFLAGS3_PROTECT 0x01 /* Bit 0: Protect */ + +#define SCSIRESP_INQUIRYFLAGS4_BQUE 0x80 /* Bit 7: BQue */ +#define SCSIRESP_INQUIRYFLAGS4_ENCSERV 0x40 /* Bit 6: EncServ */ +#define SCSIRESP_INQUIRYFLAGS4_VS 0x20 /* Bit 5: VS */ +#define SCSIRESP_INQUIRYFLAGS4_MULTIP 0x10 /* Bit 4: MultIP */ +#define SCSIRESP_INQUIRYFLAGS4_MCHNGR 0x08 /* Bit 3: MChngr */ +#define SCSIRESP_INQUIRYFLAGS4_ADDR16 0x01 /* Bit 0: Addr16 */ + +#define SCSIRESP_INQUIRYFLAGS5_WBUS16 0x20 /* Bit 5: WBus16 */ +#define SCSIRESP_INQUIRYFLAGS5_SYNC 0x10 /* Bit 4: SYNC */ +#define SCSIRESP_INQUIRYFLAGS5_LINKED 0x08 /* Bit 3: LINKED */ +#define SCSIRESP_INQUIRYFLAGS5_CMDQUEUE 0x02 /* Bit 1: CmdQue */ +#define SCSIRESP_INQUIRYFLAGS5_VS 0x01 /* Bit 0: VS */ + +#define SCSIRESP_INQUIRYFLAGS6_CLOCKINGMASK 0xc0 /* Bits 2-3: Clocking */ +#define SCSIRESP_INQUIRYFLAGS6_QAS 0x02 /* Bit 1: QAS */ +#define SCSIRESP_INQUIRYFLAGS6_IUS 0x01 /* Bit 0: IUS */ + +/* Sense data */ + +/* Sense data response codes */ + +#define SCSIRESP_SENSEDATA_CURRENTFIXED 0x70 /* Byte 1 is always the response code */ +#define SCSIRESP_SENSEDATA_DEFERREDFIXED 0x71 +#define SCSIRESP_SENSEDATA_CURRENTDESC 0x72 +#define SCSIRESP_SENSEDATA_DEFERREDDESC 0x73 + +#define SCSIRESP_SENSEDATA_RESPVALID 0x80 + +/* Fixed sense data flags */ + +#define SCSIRESP_SENSEDATA_FILEMARK 0x80 /* Bit 7: FileMark */ +#define SCSIRESP_SENSEDATA_EOM 0x40 /* Bit 6: EOM */ +#define SCSIRESP_SENSEDATA_ILI 0x20 /* Bit 5: ILI */ +#define SCSIRESP_SENSEDATA_SENSEKEYMASK 0x0f /* Bits 0-3: Sense key */ +#define SCSIRESP_SENSEDATA_NOSENSE 0x00 /* Nothing to be reported */ +#define SCSIRESP_SENSEDATA_RECOVEREDERROR 0x01 /* Successful after recovery action */ +#define SCSIRESP_SENSEDATA_NOTREADY 0x02 /* Logical unit is not accessible */ +#define SCSIRESP_SENSEDATA_MEDIUMERROR 0x03 /* Error possibly caused by flaw in medium */ +#define SCSIRESP_SENSEDATA_HARDWAREERROR 0x04 /* Non-recoverable hardware error */ +#define SCSIRESP_SENSEDATA_ILLEGALREQUEST 0x05 /* Error in received request */ +#define SCSIRESP_SENSEDATA_UNITATTENTION 0x06 /* Unit attention condition */ +#define SCSIRESP_SENSEDATA_DATAPROTECT 0x07 /* Action failed, medium protected */ +#define SCSIRESP_SENSEDATA_BLANKCHECK 0x08 /* Encountered blank media */ +#define SCSIRESP_SENSEDATA_VENDORSPECIFIC 0x09 /* Vendor specific condition */ +#define SCSIRESP_SENSEDATA_ABORTEDCOMMAND 0x0b /* Command was aborted */ + +#define SCSIRESP_SENSEDATA_KEYVALID 0x80 /* Sense-specific data valid */ + +/* Mode Select 6 */ + +#define SCSICMD_MODESELECT6_PF 0x10 /* Bit 4: PF */ +#define SCSICMD_MODESELECT6_SP 0x01 /* Bit 0: SP */ + +/* Mode Sense 6 */ + +#define SCSICMD_MODESENSE6_DBD 0x08 /* Bit 3: PF */ + +#define SCSICMD_MODESENSE_PCMASK 0xc0 /* Bits 6-7: Page control (PC) */ +#define SCSICMD_MODESENSE_PCCURRENT 0x00 /* Current values */ +#define SCSICMD_MODESENSE_PCCHANGEABLE 0x40 /* Changeable values */ +#define SCSICMD_MODESENSE_PCDEFAULT 0x80 /* Default values */ +#define SCSICMD_MODESENSE_PCSAVED 0xc0 /* Saved values */ +#define SCSICMD_MODESENSE_PGCODEMASK 0x3f /* Bits 0-5: Page code */ + +#define SCSICMD_MODESENSE6_PCDEFAULT 0x80 /* Default values */ + /* Direct-access device page codes */ +#define SCSIRESP_MODESENSE_PGCCODE_VENDOR 0x00 /* Vendor-specific */ +#define SCSIRESP_MODESENSE_PGCCODE_RWERROR 0x01 /* Read/Write error recovery mode page */ +#define SCSIRESP_MODESENSE_PGCCODE_RECONNECT 0x02 /* Disconnect-reconnect mode page */ +#define SCSIRESP_MODESENSE_PGCCODE_FORMATDEV 0x03 /* Format device mode page (obsolete) */ +#define SCSIRESP_MODESENSE_PGCCODE_RIGID 0x04 /* Rigid disk geometry mode page (obsolete) */ +#define SCSIRESP_MODESENSE_PGCCODE_FLEXIBLE 0x05 /* Flexible disk geometry mode page (obsolete) */ +#define SCSIRESP_MODESENSE_PGCCODE_VERIFY 0x07 /* Verify error recovery mode page */ +#define SCSIRESP_MODESENSE_PGCCODE_CACHING 0x08 /* Caching mode page */ +#define SCSIRESP_MODESENSE_PGCCODE_CONTROL 0x0a /* Control mode page (0x0a/0x00) */ +#define SCSIRESP_MODESENSE_PGCCODE_CONTROLEXT 0x0a /* Control extension mode page (0x0a/0x01) */ +#define SCSIRESP_MODESENSE_PGCCODE_MEDIUMTYPES 0x0b /* Medum types supported mode page (obsolete) */ +#define SCSIRESP_MODESENSE_PGCCODE_NP 0x0c /* Notch and partition mode page (obsolete) */ +#define SCSIRESP_MODESENSE_PGCCODE_XOR 0x10 /* XOR control mode page */ +#define SCSIRESP_MODESENSE_PGCCODE_ES 0x14 /* Enclosure services mode page */ +#define SCSIRESP_MODESENSE_PGCCODE_PSLUN 0x18 /* Protocol-specific LUN mode page */ +#define SCSIRESP_MODESENSE_PGCCODE_PSPORT 0x19 /* Protocol-specific port mode page */ +#define SCSIRESP_MODESENSE_PGCCODE_POWER 0x1a /* Power condition mode page */ +#define SCSIRESP_MODESENSE_PGCCODE_IE 0x1c /* Informational exceptions control mode page (0x1c/0x00) */ +#define SCSIRESP_MODESENSE_PGCCODE_BC 0x1c /* Background control mode page (0x1c/0x01) */ +#define SCSIRESP_MODESENSE_PGCCODE_RETURNALL 0x3f /* Return all mode pages */ + /* Direct-access caching mode page */ +#define SCSIRESP_CACHINGMODEPG_PS 0x80 /* Byte 0, Bit 7: PS */ +#define SCSIRESP_CACHINGMODEPG_SPF 0x60 /* Byte 0, Bit 6: SPF */ +#define SCSIRESP_CACHINGMODEPG_IC 0x80 /* Byte 2, Bit 7: IC */ +#define SCSIRESP_CACHINGMODEPG_ABPF 0x40 /* Byte 2, Bit 6: ABPF */ +#define SCSIRESP_CACHINGMODEPG_CAP 0x20 /* Byte 2, Bit 5: CAP */ +#define SCSIRESP_CACHINGMODEPG_DISC 0x10 /* Byte 2, Bit 4: DISC */ +#define SCSIRESP_CACHINGMODEPG_SIZE 0x08 /* Byte 2, Bit 3: SIZE */ +#define SCSIRESP_CACHINGMODEPG_WCE 0x04 /* Byte 2, Bit 2: Write cache enable (WCE) */ +#define SCSIRESP_CACHINGMODEPG_MF 0x02 /* Byte 2, Bit 1: MF */ +#define SCSIRESP_CACHINGMODEPG_RCD 0x01 /* Byte 2, Bit 0: Read cache disable (RCD) */ + +#define SCSIRESP_MODEPARMHDR_DAPARM_WP 0x80 /* Bit 7: WP (Direct-access block devices only) */ +#define SCSIRESP_MODEPARMHDR_DAPARM_DBPFUA 0x10 /* Bit 4: DBOFUA (Direct-access block devices only) */ + +#define SCSIRESP_PAGEFMT_PS 0x80 /* Bit 7: PS */ +#define SCSIRESP_PAGEFMT_SPF 0x40 /* Bit 6: SPF */ +#define SCSIRESP_PAGEFMT_PGCODEMASK 0x3f /* Bits 0-5: Page code */ + +/* Prevent / Allow Medium Removal */ + +#define SCSICMD_PREVENTMEDIUMREMOVAL_TRANSPORT 0x01 /* Removal prohibited from data transport */ +#define SCSICMD_PREVENTMEDIUMREMOVAL_MCHANGER 0x02 /* Removal prohibited from medium changer */ + +/* Read format capacities */ + +#define SCIRESP_RDFMTCAPACITIES_UNFORMATED 0x01 /* Unformatted media */ +#define SCIRESP_RDFMTCAPACITIES_FORMATED 0x02 /* Formatted media */ +#define SCIRESP_RDFMTCAPACITIES_NOMEDIA 0x03 /* No media */ + +/* Read 6 */ + +#define SCSICMD_READ6_MSLBAMASK 0x1f + +/* Write 6 */ + +#define SCSICMD_WRITE6_MSLBAMASK 0x1f + +/* Mode Select 10 */ + +#define SCSICMD_MODESELECT10_PF 0x10 /* Bit 4: PF */ +#define SCSICMD_MODESELECT10_SP 0x01 /* Bit 0: SP */ + +/* Mode Sense 10 */ + +#define SCSICMD_MODESENSE10_LLBAA 0x10 /* Bit 4: LLBAA */ +#define SCSICMD_MODESENSE10_DBD 0x08 /* Bit 3: PF */ + +/* Read 10 */ + +#define SCSICMD_READ10FLAGS_RDPROTECTMASK 0xe0 +#define SCSICMD_READ10FLAGS_DPO 0x10 /* Disable Page Out */ +#define SCSICMD_READ10FLAGS_FUA 0x08 +#define SCSICMD_READ10FLAGS_FUANV 0x02 + +/* Write 10 */ + +#define SCSICMD_WRITE10FLAGS_WRPROTECTMASK 0xe0 +#define SCSICMD_WRITE10FLAGS_DPO 0x10 /* Disable Page Out */ +#define SCSICMD_WRITE10FLAGS_FUA 0x08 +#define SCSICMD_WRITE10FLAGS_FUANV 0x02 + +/* Verify 10 */ + +#define SCSICMD_VERIFY10_VRPROTECTMASK 0xe0 /* Byte 1: Bits 5-7: VRPROTECT */ +#define SCSICMD_VERIFY10_DPO 0x10 /* Byte 1: Bit 4: Disable Page Out (DPO) */ +#define SCSICMD_VERIFY10_BYTCHK 0x02 /* Byte 1: Bit 2: BytChk */ + +/* Read 12 */ + +#define SCSICMD_READ12FLAGS_RDPROTECTMASK 0xe0 +#define SCSICMD_READ12FLAGS_DPO 0x10 /* Disable Page Out */ +#define SCSICMD_READ12FLAGS_FUA 0x08 +#define SCSICMD_READ12FLAGS_FUANV 0x02 + +/* Write 12 */ + +#define SCSICMD_WRITE12FLAGS_WRPROTECTMASK 0xe0 +#define SCSICMD_WRITE12FLAGS_DPO 0x10 /* Disable Page Out */ +#define SCSICMD_WRITE12FLAGS_FUA 0x08 +#define SCSICMD_WRITE12FLAGS_FUANV 0x02 + +/* Verify 12 */ + +#define SCSICMD_VERIFY12_VRPROTECTMASK 0xe0 /* Byte 1: Bits 5-7: VRPROTECT */ +#define SCSICMD_VERIFY12_DPO 0x10 /* Byte 1: Bit 4: Disable Page Out (DPO) */ +#define SCSICMD_VERIFY12_BYTCHK 0x02 /* Byte 1: Bit 2: BytChk */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/* Format structures for selected SCSI primary commands */ + +#define SCSICMD_TESTUNITREADY_SIZEOF 6 + +struct scsicmd_requestsense_s +{ + uint8_t opcode; /* 0: 0x03 */ + uint8_t flags; /* 1: See SCSICMD_REQUESTSENSE_FLAGS_* */ + uint8_t reserved[2]; /* 2-3: Reserved */ + uint8_t alloclen; /* 4: Allocation length */ + uint8_t control; /* 5: Control */ +}; +#define SCSICMD_REQUESTSENSE_SIZEOF 6 +#define SCSICMD_REQUESTSENSE_MSSIZEOF 12 /* MS-Windows REQUEST SENSE with cbw->cdblen == 12 */ + +struct scsiresp_fixedsensedata_s +{ + uint8_t code; /* 0: Response code See SCSIRESP_SENSEDATA_*FIXED defns */ + uint8_t obsolete; /* 1: */ + uint8_t flags; /* 2: See SCSIRESP_SENSEDATA_* definitions */ + uint8_t info[4]; /* 3-6: Information */ + uint8_t len; /* 7: Additional length */ + uint8_t cmdinfo[4]; /* 8-11: Command-specific information */ + uint8_t code2; /* 12: Additional sense code */ + uint8_t qual2; /* 13: Additional sense code qualifier */ + uint8_t fru; /* 14: Field replacement unit code */ + uint8_t key[3]; /* 15-17: Sense key specific */ + /* 18-: Additional bytes may follow */ +}; +#define SCSIRESP_FIXEDSENSEDATA_SIZEOF 18 /* Minimum size */ + +struct scscicmd_inquiry_s +{ + uint8_t opcode; /* 0: 0x12 */ + uint8_t flags; /* 1: See SCSICMD_INQUIRY_FLAGS_* */ + uint8_t pagecode; /* 2: Page code */ + uint8_t alloclen[2]; /* 3-4: Allocation length */ + uint8_t control; /* 5: Control */ +}; +#define SCSICMD_INQUIRY_SIZEOF 6 + +struct scsiresp_inquiry_s +{ + /* Mandatory */ + + uint8_t qualtype; /* 0: Bits 5-7: Peripheral qualifier; Bits 0-4: Peripheral device type */ + uint8_t flags1; /* 1: See SCSIRESP_INQUIRY_FLAGS1_* */ + uint8_t version; /* 2: Version */ + uint8_t flags2; /* 3: See SCSIRESP_INQUIRY_FLAGS2_* */ + uint8_t len; /* 4: Additional length */ + uint8_t flags3; /* 5: See SCSIRESP_INQUIRY_FLAGS3_* */ + uint8_t flags4; /* 6: See SCSIRESP_INQUIRY_FLAGS4_* */ + uint8_t flags5; /* 7: See SCSIRESP_INQUIRY_FLAGS5_* */ + uint8_t vendorid[8]; /* 8-15: T10 Vendor Identification */ + uint8_t productid[16]; /* 16-31: Product Identification */ + uint8_t revision[4]; /* 32-35: Product Revision Level */ + + /* Optional */ + + uint8_t vendor[20]; /* 36-55: Vendor specific */ + uint8_t flags6; /* 56: See SCSIRESP_INQUIRY_FLAGS6_* */ + uint8_t reserved1; /* 57: Reserved */ + uint8_t version1[2]; /* 58-59: Version Descriptor 1 */ + uint8_t version2[2]; /* 60-61: Version Descriptor 2 */ + uint8_t version3[2]; /* 62-63: Version Descriptor 3 */ + uint8_t version4[2]; /* 64-65: Version Descriptor 4 */ + uint8_t version5[2]; /* 66-67: Version Descriptor 5 */ + uint8_t version6[2]; /* 68-69: Version Descriptor 6 */ + uint8_t version7[2]; /* 70-71: Version Descriptor 7 */ + uint8_t version8[2]; /* 72-73: Version Descriptor 8 */ + uint8_t reserved2[22]; /* 74-95: Reserved */ + /* 96-: Vendor-specific parameters may follow */ +}; +#define SCSIRESP_INQUIRY_SIZEOF 36 /* Minimum size */ + +struct scsicmd_modeselect6_s +{ + uint8_t opcode; /* 0x15 */ + uint8_t flags; /* 1: See SCSICMD_MODESELECT6_FLAGS_* */ + uint8_t reserved[2]; /* 2-3: Reserved */ + uint8_t plen; /* 4: Parameter list length */ + uint8_t control; /* 5: Control */ +}; +#define SCSICMD_MODESELECT6_SIZEOF 6 + +struct scsicmd_modesense6_s +{ + uint8_t opcode; /* 0x1a */ + uint8_t flags; /* 1: See SCSICMD_MODESENSE6_FLAGS_* */ + uint8_t pcpgcode; /* 2: Bits 6-7: PC, bits 0-5: page code */ + uint8_t subpgcode; /* 3: subpage code */ + uint8_t alloclen; /* 4: Allocation length */ + uint8_t control; /* 5: Control */ +}; +#define SCSICMD_MODESENSE6_SIZEOF 6 + +struct scsiresp_modeparameterhdr6_s +{ + uint8_t mdlen; /* 0: Mode data length */ + uint8_t type; /* 1: Medium type */ + uint8_t param; /* 2: Device-specific parameter */ + uint8_t bdlen; /* 3: Block descriptor length */ +}; +#define SCSIRESP_MODEPARAMETERHDR6_SIZEOF 4 + +struct scsiresp_blockdesc_s +{ + uint8_t density; /* 0: density code */ + uint8_t nblocks[3]; /* 1-3: Number of blocks */ + uint8_t reserved; /* 4: reserved */ + uint8_t blklen[3]; /* 5-7: Block len */ +}; +#define SCSIRESP_BLOCKDESC_SIZEOF 8 + +struct scsiresp_pageformat_s +{ + uint8_t pgcode; /* 0: See SCSIRESP_PAGEFMT_* definitions */ + uint8_t pglen; /* 1: Page length (n-1) */ + uint8_t parms[1]; /* 2-n: Mode parameters */ +}; + +struct scsiresp_subpageformat_s +{ + uint8_t pgcode; /* 0: See SCSIRESP_PAGEFMT_* definitions */ + uint8_t subpgcode; /* 1: sub-page code */ + uint8_t pglen[2]; /* 2-3: Page length (n-3) */ + uint8_t parms[1]; /* 4-n: Mode parameters */ +}; + +struct scsiresp_cachingmodepage_s +{ + uint8_t pgcode; /* 0: Bit 7: PS; Bit 6: SPF, Bits 0-5: page code == 8 */ + uint8_t len; /* 1: Page length (18) */ + uint8_t flags1; /* 2: See SCSIRESP_CACHINGMODEPG_* definitions */ + uint8_t priority; /* 3: Bits 4-7: Demand read retention priority; Bits 0-3: Write retention priority */ + uint8_t dpflen[2]; /* 4-5: Disable prefetch transfer length */ + uint8_t minpf[2]; /* 6-7: Minimum pre-fetch */ + uint8_t maxpf[2]; /* 8-9: Maximum pre-fetch */ + uint8_t maxpfc[2]; /* 10-11: Maximum pref-fetch ceiling */ + uint8_t flags2; /* 12: See SCSIRESP_CACHINGMODEPG_* definitions */ + uint8_t nsegments; /* 13: Number of cache segments */ + uint8_t segsize[2]; /* 14-15: Cache segment size */ + uint8_t reserved; /* 16: Reserved */ + uint8_t obsolete[3]; /* 17-19: Obsolete */ +}; + +/* Format structures for selected SCSI block commands */ + +struct scsicmd_read6_s +{ + uint8_t opcode; /* 0: 0x08 */ + uint8_t mslba; /* 1: Bits 5-7: reserved; Bits 0-6: MS Logical Block Address (LBA) */ + uint8_t lslba[2]; /* 2-3: LS Logical Block Address (LBA) */ + uint8_t xfrlen; /* 4: Transfer length (in contiguous logical blocks) */ + uint8_t control; /* 5: Control */ +}; +#define SCSICMD_READ6_SIZEOF 6 + +struct scsicmd_write6_s +{ + uint8_t opcode; /* 0: 0x0a */ + uint8_t mslba; /* 1: Bits 5-7: reserved; Bits 0-6: MS Logical Block Address (LBA) */ + uint8_t lslba[2]; /* 2-3: LS Logical Block Address (LBA) */ + uint8_t xfrlen; /* 4: Transfer length (in contiguous logical blocks) */ + uint8_t control; /* 5: Control */ +}; +#define SCSICMD_WRITE6_SIZEOF 6 + +struct scsicmd_startstopunit_s +{ + uint8_t opcode; /* 0: 0x1b */ + uint8_t immed; /* 1: Bits 2-7: Reserved, Bit 0: Immed */ + uint8_t reserved; /* 2: reserved */ + uint8_t pcm; /* 3: Bits 4-7: Reserved, Bits 0-3: Power condition modifier */ + uint8_t pc; /* 4: Bits 4-7: Power condition, Bit 2: NO_FLUSH, Bit 1: LOEJ, Bit 0: START */ + uint8_t control; /* 5: Control */ +}; +#define SCSICMD_STARTSTOPUNIT_SIZEOF 6 + +struct scsicmd_preventmediumremoval_s +{ + uint8_t opcode; /* 0: 0x1e */ + uint8_t reserved[3]; /* 1-3: Reserved */ + uint8_t prevent; /* 4: Bits 2-7: Reserved, Bits 0:1: prevent */ + uint8_t control; /* 5: Control */ +}; +#define SCSICMD_PREVENTMEDIUMREMOVAL_SIZEOF 6 + +struct scsicmd_readformatcapcacities_s +{ + uint8_t opcode; /* 0: 0x23 */ + uint8_t reserved[6]; /* 1-6: Reserved */ + uint8_t alloclen[2]; /* 7-8: Allocation length */ + uint8_t control; /* 9: Control */ +}; +#define SCSICMD_READFORMATCAPACITIES_SIZEOF 10 + +struct scsiresp_readformatcapacities_s +{ + /* Current capacity header */ + + uint8_t reserved[3]; /* 0-2: Reserved */ + uint8_t listlen; /* 3: Capacity list length */ + + /* Current/Maximum Capacity Descriptor (actually a separate structure) */ + + uint8_t nblocks[4]; /* 4-7: Number of blocks */ + uint8_t type; /* 8: Bits 2-7: Reserved, Bits 0-1: Descriptor type */ + uint8_t blocklen[3]; /* 9-11: Block length */ +}; +#define SCSIRESP_READFORMATCAPACITIES_SIZEOF 12 +#define SCSIRESP_CURRCAPACITYDESC_SIZEOF 8 + +struct scsiresp_formattedcapacitydesc_s +{ + uint8_t nblocks[4]; /* 0-3: Number of blocks */ + uint8_t type; /* 4: Bits 2-7: Type, bits 0-1, reserved */ + uint8_t param[3]; /* 5-7: Type dependent parameter */ +}; +#define SCSIRESP_FORMATTEDCAPACITYDESC_SIZEOF 8 + +struct scsicmd_readcapacity10_s +{ + uint8_t opcode; /* 0: 0x25 */ + uint8_t reserved1; /* 1: Bits 1-7: Reserved, Bit 0: Obsolete */ + uint8_t lba[4]; /* 2-5: Logical block address (LBA) */ + uint8_t reserved2[2]; /* 6-7: Reserved */ + uint8_t pmi; /* 8: Bits 1-7 Reserved; Bit 0: PMI */ + uint8_t control; /* 9: Control */ +}; +#define SCSICMD_READCAPACITY10_SIZEOF 10 + +struct scsiresp_readcapacity10_s +{ + uint8_t lba[4]; /* 0-3: Returned logical block address (LBA) */ + uint8_t blklen[4]; /* 4-7: Logical block length (in bytes) */ +}; +#define SCSIRESP_READCAPACITY10_SIZEOF 8 + +struct scsicmd_read10_s +{ + uint8_t opcode; /* 0: 0x28 */ + uint8_t flags; /* 1: See SCSICMD_READ10FLAGS_* */ + uint8_t lba[4]; /* 2-5: Logical Block Address (LBA) */ + uint8_t groupno; /* 6: Bits 5-7: reserved; Bits 0-6: group number */ + uint8_t xfrlen[2]; /* 7-8: Transfer length (in contiguous logical blocks) */ + uint8_t control; /* 9: Control */ +}; +#define SCSICMD_READ10_SIZEOF 10 + +struct scsicmd_write10_s +{ + uint8_t opcode; /* 0: 0x2a */ + uint8_t flags; /* 1: See SCSICMD_WRITE10FLAGS_* */ + uint8_t lba[4]; /* 2-5: Logical Block Address (LBA) */ + uint8_t groupno; /* 6: Bits 5-7: reserved; Bits 0-6: group number */ + uint8_t xfrlen[2]; /* 7-8: Transfer length (in contiguous logical blocks) */ + uint8_t control; /* 9: Control */ +}; +#define SCSICMD_WRITE10_SIZEOF 10 + +struct scsicmd_verify10_s +{ + uint8_t opcode; /* 0: 0x2f */ + uint8_t flags; /* 1: See SCSICMD_VERIFY10_* definitions */ + uint8_t lba[4]; /* 2-5: Logical block address (LBA) */ + uint8_t groupno; /* 6: Bit 7: restricted; Bits 5-6: Reserved, Bits 0-4: Group number */ + uint8_t len[2]; /* 7-8: Verification length (in blocks) */ + uint8_t control; /* 9: Control */ +}; +#define SCSICMD_VERIFY10_SIZEOF 10 + +struct scsicmd_synchronizecache10_s +{ + uint8_t opcode; /* 0: 0x35 */ + uint8_t flags; /* 1: See SCSICMD_SYNCHRONIZECACHE10_* definitions */ + uint8_t lba[4]; /* 2-5: Logical block address (LBA) */ + uint8_t groupno; /* 6: Bit 7: restricted; Bits 5-6: Reserved, Bits 0-4: Group number */ + uint8_t len[2]; /* 7-8: Number of logical blocks */ + uint8_t control; /* 9: Control */ +}; +#define SCSICMD_SYNCHRONIZECACHE10_SIZEOF 10 + +struct scsicmd_modeselect10_s +{ + uint8_t opcode; /* 0: 0x55 */ + uint8_t flags; /* 1: See SCSICMD_MODESELECT10_FLAGS_* */ + uint8_t reserved[5]; /* 2-6: Reserved */ + uint8_t parmlen[2]; /* 7-8: Parameter list length */ + uint8_t control; /* 9: Control */ +}; +#define SCSICMD_MODESELECT10_SIZEOF 10 + +struct scsiresp_modeparameterhdr10_s +{ + uint8_t mdlen[2]; /* 0-1: Mode data length */ + uint8_t type; /* 2: Medium type */ + uint8_t param; /* 3: Device-specific parameter */ + uint8_t reserved[2]; /* 4-5: reserved */ + uint8_t bdlen[2]; /* 6-7: Block descriptor length */ +}; +#define SCSIRESP_MODEPARAMETERHDR10_SIZEOF 8 + +struct scsicmd_modesense10_s +{ + uint8_t opcode; /* O: 0x5a */ + uint8_t flags; /* 1: See SCSICMD_MODESENSE10_FLAGS_* */ + uint8_t pcpgcode; /* 2: Bits 6-7: PC, bits 0-5: page code */ + uint8_t subpgcode; /* 3: subpage code */ + uint8_t reserved[3]; /* 4-6: reserved */ + uint8_t alloclen[2]; /* 7-8: Allocation length */ + uint8_t control; /* 9: Control */ +}; +#define SCSICMD_MODESENSE10_SIZEOF 10 + +struct scsicmd_readcapacity16_s +{ + uint8_t opcode; /* 0: 0x9e */ + uint8_t action; /* 1: Bits 5-7: Reserved, Bits 0-4: Service action */ + uint8_t lba[8]; /* 2-9: Logical block address (LBA) */ + uint8_t len[4]; /* 10-13: Allocation length */ + uint8_t reserved; /* 14: Reserved */ + uint8_t control; /* 15: Control */ +}; +#define SCSICMD_READCAPACITY16_SIZEOF 16 + +struct scsicmd_read12_s +{ + uint8_t opcode; /* 0: 0xa8 */ + uint8_t flags; /* 1: See SCSICMD_READ12FLAGS_* */ + uint8_t lba[4]; /* 2-5: Logical Block Address (LBA) */ + uint8_t xfrlen[4]; /* 6-9: Transfer length (in contiguous logical blocks) */ + uint8_t groupno; /* 10: Bit 7: restricted; Bits 5-6: reserved; Bits 0-6: group number */ + uint8_t control; /* 11: Control */ +}; +#define SCSICMD_READ12_SIZEOF 12 + +struct scsicmd_write12_s +{ + uint8_t opcode; /* 0: 0xaa */ + uint8_t flags; /* 1: See SCSICMD_WRITE12FLAGS_* */ + uint8_t lba[4]; /* 2-5: Logical Block Address (LBA) */ + uint8_t xfrlen[4]; /* 6-9: Transfer length (in contiguous logical blocks) */ + uint8_t groupno; /* 10: Bit 7: restricted; Bits 5-6: reserved; Bits 0-6: group number */ + uint8_t control; /* 11: Control */ +}; +#define SCSICMD_WRITE12_SIZEOF 12 + +struct scsicmd_verify12_s +{ + uint8_t opcode; /* 0: 0xaf */ + uint8_t flags; /* 1: See SCSICMD_VERIFY12_* definitions */ + uint8_t lba[4]; /* 2-5: Logical block address (LBA) */ + uint8_t len[4]; /* 6-9: Verification length */ + uint8_t groupno; /* 10: Bit 7: restricted; Bits 5-6: Reserved, Bits 0-4: Group number */ + uint8_t control; /* 11: Control */ +}; +#define SCSICMD_VERIFY12_SIZEOF 12 + +/**************************************************************************** + * Public Functions Definitions + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __INCLUDE_NUTTX_SCSI_H */ diff --git a/src/lib/CherryUSB/class/msc/usbd_msc.c b/src/lib/CherryUSB/class/msc/usbd_msc.c new file mode 100644 index 000000000..af0a685bc --- /dev/null +++ b/src/lib/CherryUSB/class/msc/usbd_msc.c @@ -0,0 +1,965 @@ +/* + * Copyright (c) 2022, sakumisu + * Copyright (c) 2024, zhihong chen + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_msc.h" +#include "usb_scsi.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbd_msc" +#include "usb_log.h" + +#define MSD_OUT_EP_IDX 0 +#define MSD_IN_EP_IDX 1 + +/* Describe EndPoints configuration */ +static struct usbd_endpoint mass_ep_data[CONFIG_USBDEV_MAX_BUS][2]; + +/* MSC Bulk-only Stage */ +enum Stage { + MSC_READ_CBW = 0, /* Command Block Wrapper */ + MSC_DATA_OUT = 1, /* Data Out Phase */ + MSC_DATA_IN = 2, /* Data In Phase */ + MSC_SEND_CSW = 3, /* Command Status Wrapper */ + MSC_WAIT_CSW = 4, /* Command Status Wrapper */ +}; + +/* Device data structure */ +USB_NOCACHE_RAM_SECTION struct usbd_msc_priv { + /* state of the bulk-only state machine */ + enum Stage stage; + USB_MEM_ALIGNX struct CBW cbw; + USB_MEM_ALIGNX struct CSW csw; + + USB_MEM_ALIGNX bool readonly; + bool popup; + uint8_t sKey; /* Sense key */ + uint8_t ASC; /* Additional Sense Code */ + uint8_t ASQ; /* Additional Sense Qualifier */ + uint8_t max_lun; + uint32_t start_sector; + uint32_t nsectors; + uint32_t scsi_blk_size[CONFIG_USBDEV_MSC_MAX_LUN]; + uint32_t scsi_blk_nbr[CONFIG_USBDEV_MSC_MAX_LUN]; + + USB_MEM_ALIGNX uint8_t block_buffer[CONFIG_USBDEV_MSC_MAX_BUFSIZE]; + +#if defined(CONFIG_USBDEV_MSC_THREAD) + usb_osal_mq_t usbd_msc_mq; + usb_osal_thread_t usbd_msc_thread; + uint32_t nbytes; +#elif defined(CONFIG_USBDEV_MSC_POLLING) + uint32_t event; + uint32_t nbytes; +#endif +} g_usbd_msc[CONFIG_USBDEV_MAX_BUS]; + +#ifdef CONFIG_USBDEV_MSC_THREAD +static void usbdev_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); +#endif + +static void usdb_msc_set_max_lun(uint8_t busid) +{ + g_usbd_msc[busid].max_lun = CONFIG_USBDEV_MSC_MAX_LUN - 1u; +} + +static void usbd_msc_reset(uint8_t busid) +{ + g_usbd_msc[busid].stage = MSC_READ_CBW; + g_usbd_msc[busid].readonly = false; +} + +static int msc_storage_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USB_LOG_DBG("MSC Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + switch (setup->bRequest) { + case MSC_REQUEST_RESET: + usbd_msc_reset(busid); + break; + + case MSC_REQUEST_GET_MAX_LUN: + (*data)[0] = g_usbd_msc[busid].max_lun; + *len = 1; + break; + + default: + USB_LOG_WRN("Unhandled MSC Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + return 0; +} + +void msc_storage_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + (void)arg; + + switch (event) { + case USBD_EVENT_INIT: +#if defined(CONFIG_USBDEV_MSC_THREAD) + g_usbd_msc[busid].usbd_msc_mq = usb_osal_mq_create(1); + if (g_usbd_msc[busid].usbd_msc_mq == NULL) { + USB_LOG_ERR("No memory to alloc for g_usbd_msc[busid].usbd_msc_mq\r\n"); + } + g_usbd_msc[busid].usbd_msc_thread = usb_osal_thread_create("usbd_msc", CONFIG_USBDEV_MSC_STACKSIZE, CONFIG_USBDEV_MSC_PRIO, usbdev_msc_thread, (void *)(uint32_t)busid); + if (g_usbd_msc[busid].usbd_msc_thread == NULL) { + USB_LOG_ERR("No memory to alloc for g_usbd_msc[busid].usbd_msc_thread\r\n"); + } +#elif defined(CONFIG_USBDEV_MSC_POLLING) + g_usbd_msc[busid].event = 0; +#endif + break; + case USBD_EVENT_DEINIT: +#if defined(CONFIG_USBDEV_MSC_THREAD) + if (g_usbd_msc[busid].usbd_msc_mq) { + usb_osal_mq_delete(g_usbd_msc[busid].usbd_msc_mq); + } + if (g_usbd_msc[busid].usbd_msc_thread) { + usb_osal_thread_delete(g_usbd_msc[busid].usbd_msc_thread); + } +#endif + break; + case USBD_EVENT_RESET: + usbd_msc_reset(busid); + break; + case USBD_EVENT_CONFIGURED: + USB_LOG_DBG("Start reading cbw\r\n"); + usbd_ep_start_read(busid, mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr, (uint8_t *)&g_usbd_msc[busid].cbw, USB_SIZEOF_MSC_CBW); + break; + + default: + break; + } +} + +static void usbd_msc_bot_abort(uint8_t busid) +{ + if ((g_usbd_msc[busid].cbw.bmFlags == 0) && (g_usbd_msc[busid].cbw.dDataLength != 0)) { + usbd_ep_set_stall(busid, mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr); + } + usbd_ep_set_stall(busid, mass_ep_data[busid][MSD_IN_EP_IDX].ep_addr); + usbd_ep_start_read(busid, mass_ep_data[busid][0].ep_addr, (uint8_t *)&g_usbd_msc[busid].cbw, USB_SIZEOF_MSC_CBW); +} + +static void usbd_msc_send_csw(uint8_t busid, uint8_t CSW_Status) +{ + g_usbd_msc[busid].csw.dSignature = MSC_CSW_Signature; + g_usbd_msc[busid].csw.bStatus = CSW_Status; + + /* updating the State Machine , so that we wait CSW when this + * transfer is complete, ie when we get a bulk in callback + */ + g_usbd_msc[busid].stage = MSC_WAIT_CSW; + + USB_LOG_DBG("Send csw\r\n"); + usbd_ep_start_write(busid, mass_ep_data[busid][MSD_IN_EP_IDX].ep_addr, (uint8_t *)&g_usbd_msc[busid].csw, sizeof(struct CSW)); +} + +static void usbd_msc_send_info(uint8_t busid, uint8_t *buffer, uint8_t size) +{ + size = MIN(size, g_usbd_msc[busid].cbw.dDataLength); + + /* updating the State Machine , so that we send CSW when this + * transfer is complete, ie when we get a bulk in callback + */ + g_usbd_msc[busid].stage = MSC_SEND_CSW; + + usbd_ep_start_write(busid, mass_ep_data[busid][MSD_IN_EP_IDX].ep_addr, buffer, size); + + g_usbd_msc[busid].csw.dDataResidue -= size; + g_usbd_msc[busid].csw.bStatus = CSW_STATUS_CMD_PASSED; +} + +static bool SCSI_processWrite(uint8_t busid, uint32_t nbytes); +static bool SCSI_processRead(uint8_t busid); + +/** +* @brief SCSI_SetSenseData +* Load the last error code in the error list +* @param sKey: Sense Key +* @param ASC: Additional Sense Code +* @retval none + +*/ +static void SCSI_SetSenseData(uint8_t busid, uint32_t KCQ) +{ + g_usbd_msc[busid].sKey = (uint8_t)(KCQ >> 16); + g_usbd_msc[busid].ASC = (uint8_t)(KCQ >> 8); + g_usbd_msc[busid].ASQ = (uint8_t)(KCQ); +} + +/** + * @brief SCSI Command list + * + */ + +static bool SCSI_testUnitReady(uint8_t busid, uint8_t **data, uint32_t *len) +{ + if (g_usbd_msc[busid].cbw.dDataLength != 0U) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + *data = NULL; + *len = 0; + return true; +} + +static bool SCSI_requestSense(uint8_t busid, uint8_t **data, uint32_t *len) +{ + uint8_t data_len = SCSIRESP_FIXEDSENSEDATA_SIZEOF; + if (g_usbd_msc[busid].cbw.dDataLength == 0U) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + if (g_usbd_msc[busid].cbw.CB[4] < SCSIRESP_FIXEDSENSEDATA_SIZEOF) { + data_len = g_usbd_msc[busid].cbw.CB[4]; + } + + uint8_t request_sense[SCSIRESP_FIXEDSENSEDATA_SIZEOF] = { + 0x70, + 0x00, + 0x00, /* Sense Key */ + 0x00, + 0x00, + 0x00, + 0x00, + SCSIRESP_FIXEDSENSEDATA_SIZEOF - 8, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, /* Additional Sense Code */ + 0x00, /* Additional Sense Request */ + 0x00, + 0x00, + 0x00, + 0x00, + }; + + request_sense[2] = g_usbd_msc[busid].sKey; + request_sense[12] = g_usbd_msc[busid].ASC; + request_sense[13] = g_usbd_msc[busid].ASQ; +#if 0 + request_sense[ 2] = 0x06; /* UNIT ATTENTION */ + request_sense[12] = 0x28; /* Additional Sense Code: Not ready to ready transition */ + request_sense[13] = 0x00; /* Additional Sense Code Qualifier */ +#endif +#if 0 + request_sense[ 2] = 0x02; /* NOT READY */ + request_sense[12] = 0x3A; /* Additional Sense Code: Medium not present */ + request_sense[13] = 0x00; /* Additional Sense Code Qualifier */ +#endif +#if 0 + request_sense[ 2] = 0x05; /* ILLEGAL REQUEST */ + request_sense[12] = 0x20; /* Additional Sense Code: Invalid command */ + request_sense[13] = 0x00; /* Additional Sense Code Qualifier */ +#endif +#if 0 + request_sense[ 2] = 0x00; /* NO SENSE */ + request_sense[12] = 0x00; /* Additional Sense Code: No additional code */ + request_sense[13] = 0x00; /* Additional Sense Code Qualifier */ +#endif + + memcpy(*data, (uint8_t *)request_sense, data_len); + *len = data_len; + return true; +} + +static bool SCSI_inquiry(uint8_t busid, uint8_t **data, uint32_t *len) +{ + uint8_t data_len = SCSIRESP_INQUIRY_SIZEOF; + + uint8_t inquiry00[6] = { + 0x00, + 0x00, + 0x00, + (0x06 - 4U), + 0x00, + 0x80 + }; + + /* USB Mass storage VPD Page 0x80 Inquiry Data for Unit Serial Number */ + uint8_t inquiry80[8] = { + 0x00, + 0x80, + 0x00, + 0x08, + 0x20, /* Put Product Serial number */ + 0x20, + 0x20, + 0x20 + }; + + uint8_t inquiry[SCSIRESP_INQUIRY_SIZEOF] = { + /* 36 */ + + /* LUN 0 */ + 0x00, + 0x80, + 0x02, + 0x02, + (SCSIRESP_INQUIRY_SIZEOF - 5), + 0x00, + 0x00, + 0x00, + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', /* Product : 16 Bytes */ + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ' /* Version : 4 Bytes */ + }; + + memcpy(&inquiry[8], CONFIG_USBDEV_MSC_MANUFACTURER_STRING, strlen(CONFIG_USBDEV_MSC_MANUFACTURER_STRING)); + memcpy(&inquiry[16], CONFIG_USBDEV_MSC_PRODUCT_STRING, strlen(CONFIG_USBDEV_MSC_PRODUCT_STRING)); + memcpy(&inquiry[32], CONFIG_USBDEV_MSC_VERSION_STRING, strlen(CONFIG_USBDEV_MSC_VERSION_STRING)); + + if (g_usbd_msc[busid].cbw.dDataLength == 0U) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + if ((g_usbd_msc[busid].cbw.CB[1] & 0x01U) != 0U) { /* Evpd is set */ + if (g_usbd_msc[busid].cbw.CB[2] == 0U) { /* Request for Supported Vital Product Data Pages*/ + data_len = 0x06; + memcpy(*data, (uint8_t *)inquiry00, data_len); + } else if (g_usbd_msc[busid].cbw.CB[2] == 0x80U) { /* Request for VPD page 0x80 Unit Serial Number */ + data_len = 0x08; + memcpy(*data, (uint8_t *)inquiry80, data_len); + } else { /* Request Not supported */ + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDFIELDINCBA); + return false; + } + } else { + if (g_usbd_msc[busid].cbw.CB[4] < SCSIRESP_INQUIRY_SIZEOF) { + data_len = g_usbd_msc[busid].cbw.CB[4]; + } + memcpy(*data, (uint8_t *)inquiry, data_len); + } + + *len = data_len; + return true; +} + +static bool SCSI_startStopUnit(uint8_t busid, uint8_t **data, uint32_t *len) +{ + if (g_usbd_msc[busid].cbw.dDataLength != 0U) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + if ((g_usbd_msc[busid].cbw.CB[4] & 0x3U) == 0x1U) /* START=1 */ + { + //SCSI_MEDIUM_UNLOCKED; + } else if ((g_usbd_msc[busid].cbw.CB[4] & 0x3U) == 0x2U) /* START=0 and LOEJ Load Eject=1 */ + { + //SCSI_MEDIUM_EJECTED; + g_usbd_msc[busid].popup = true; + } else if ((g_usbd_msc[busid].cbw.CB[4] & 0x3U) == 0x3U) /* START=1 and LOEJ Load Eject=1 */ + { + //SCSI_MEDIUM_UNLOCKED; + } else { + } + + *data = NULL; + *len = 0; + return true; +} + +static bool SCSI_preventAllowMediaRemoval(uint8_t busid, uint8_t **data, uint32_t *len) +{ + if (g_usbd_msc[busid].cbw.dDataLength != 0U) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + if (g_usbd_msc[busid].cbw.CB[4] == 0U) { + //SCSI_MEDIUM_UNLOCKED; + } else { + //SCSI_MEDIUM_LOCKED; + } + *data = NULL; + *len = 0; + return true; +} + +static bool SCSI_modeSense6(uint8_t busid, uint8_t **data, uint32_t *len) +{ + uint8_t data_len = 4; + if (g_usbd_msc[busid].cbw.dDataLength == 0U) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + if (g_usbd_msc[busid].cbw.CB[4] < SCSIRESP_MODEPARAMETERHDR6_SIZEOF) { + data_len = g_usbd_msc[busid].cbw.CB[4]; + } + + uint8_t sense6[SCSIRESP_MODEPARAMETERHDR6_SIZEOF] = { 0x03, 0x00, 0x00, 0x00 }; + + if (g_usbd_msc[busid].readonly) { + sense6[2] = 0x80; + } + memcpy(*data, (uint8_t *)sense6, data_len); + *len = data_len; + return true; +} + +static bool SCSI_modeSense10(uint8_t busid, uint8_t **data, uint32_t *len) +{ + uint8_t data_len = 27; + if (g_usbd_msc[busid].cbw.dDataLength == 0U) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + if (g_usbd_msc[busid].cbw.CB[8] < 27) { + data_len = g_usbd_msc[busid].cbw.CB[8]; + } + + uint8_t sense10[27] = { + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x12, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 + }; + + memcpy(*data, (uint8_t *)sense10, data_len); + *len = data_len; + return true; +} + +static bool SCSI_readFormatCapacity(uint8_t busid, uint8_t **data, uint32_t *len) +{ + if (g_usbd_msc[busid].cbw.dDataLength == 0U) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + uint8_t format_capacity[SCSIRESP_READFORMATCAPACITIES_SIZEOF] = { + 0x00, + 0x00, + 0x00, + 0x08, /* Capacity List Length */ + (uint8_t)((g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN] >> 24) & 0xff), + (uint8_t)((g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN] >> 16) & 0xff), + (uint8_t)((g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN] >> 8) & 0xff), + (uint8_t)((g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN] >> 0) & 0xff), + + 0x02, /* Descriptor Code: Formatted Media */ + 0x00, + (uint8_t)((g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN] >> 8) & 0xff), + (uint8_t)((g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN] >> 0) & 0xff), + }; + + memcpy(*data, (uint8_t *)format_capacity, SCSIRESP_READFORMATCAPACITIES_SIZEOF); + *len = SCSIRESP_READFORMATCAPACITIES_SIZEOF; + return true; +} + +static bool SCSI_readCapacity10(uint8_t busid, uint8_t **data, uint32_t *len) +{ + if (g_usbd_msc[busid].cbw.dDataLength == 0U) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + uint8_t capacity10[SCSIRESP_READCAPACITY10_SIZEOF] = { + (uint8_t)(((g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN] - 1) >> 24) & 0xff), + (uint8_t)(((g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN] - 1) >> 16) & 0xff), + (uint8_t)(((g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN] - 1) >> 8) & 0xff), + (uint8_t)(((g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN] - 1) >> 0) & 0xff), + + (uint8_t)((g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN] >> 24) & 0xff), + (uint8_t)((g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN] >> 16) & 0xff), + (uint8_t)((g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN] >> 8) & 0xff), + (uint8_t)((g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN] >> 0) & 0xff), + }; + + memcpy(*data, (uint8_t *)capacity10, SCSIRESP_READCAPACITY10_SIZEOF); + *len = SCSIRESP_READCAPACITY10_SIZEOF; + return true; +} + +static bool SCSI_read10(uint8_t busid, uint8_t **data, uint32_t *len) +{ + (void)data; + (void)len; + + if (((g_usbd_msc[busid].cbw.bmFlags & 0x80U) != 0x80U) || (g_usbd_msc[busid].cbw.dDataLength == 0U)) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */ + g_usbd_msc[busid].nsectors = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]); /* Number of Blocks to transfer */ + + if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) { + SCSI_SetSenseData(busid, SCSI_KCQIR_LBAOUTOFRANGE); + return false; + } + + if (g_usbd_msc[busid].cbw.dDataLength != (g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN])) { + return false; + } + g_usbd_msc[busid].stage = MSC_DATA_IN; +#if defined(CONFIG_USBDEV_MSC_THREAD) + usb_osal_mq_send(g_usbd_msc[busid].usbd_msc_mq, MSC_DATA_IN); + return true; +#elif defined(CONFIG_USBDEV_MSC_POLLING) + g_usbd_msc[busid].event = MSC_DATA_IN; + return true; +#else + return SCSI_processRead(busid); +#endif +} + +static bool SCSI_read12(uint8_t busid, uint8_t **data, uint32_t *len) +{ + (void)data; + (void)len; + + if (((g_usbd_msc[busid].cbw.bmFlags & 0x80U) != 0x80U) || (g_usbd_msc[busid].cbw.dDataLength == 0U)) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */ + g_usbd_msc[busid].nsectors = GET_BE32(&g_usbd_msc[busid].cbw.CB[6]); /* Number of Blocks to transfer */ + + if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) { + SCSI_SetSenseData(busid, SCSI_KCQIR_LBAOUTOFRANGE); + return false; + } + + if (g_usbd_msc[busid].cbw.dDataLength != (g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN])) { + return false; + } + g_usbd_msc[busid].stage = MSC_DATA_IN; +#if defined(CONFIG_USBDEV_MSC_THREAD) + usb_osal_mq_send(g_usbd_msc[busid].usbd_msc_mq, MSC_DATA_IN); + return true; +#elif defined(CONFIG_USBDEV_MSC_POLLING) + g_usbd_msc[busid].event = MSC_DATA_IN; + return true; +#else + return SCSI_processRead(busid); +#endif +} + +static bool SCSI_write10(uint8_t busid, uint8_t **data, uint32_t *len) +{ + uint32_t data_len = 0; + + (void)data; + (void)len; + + if (((g_usbd_msc[busid].cbw.bmFlags & 0x80U) != 0x00U) || (g_usbd_msc[busid].cbw.dDataLength == 0U)) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */ + g_usbd_msc[busid].nsectors = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]); /* Number of Blocks to transfer */ + + data_len = g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN]; + if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) { + return false; + } + + if (g_usbd_msc[busid].cbw.dDataLength != data_len) { + return false; + } + g_usbd_msc[busid].stage = MSC_DATA_OUT; + data_len = MIN(data_len, CONFIG_USBDEV_MSC_MAX_BUFSIZE); + usbd_ep_start_read(busid, mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr, g_usbd_msc[busid].block_buffer, data_len); + return true; +} + +static bool SCSI_write12(uint8_t busid, uint8_t **data, uint32_t *len) +{ + uint32_t data_len = 0; + + (void)data; + (void)len; + + if (((g_usbd_msc[busid].cbw.bmFlags & 0x80U) != 0x00U) || (g_usbd_msc[busid].cbw.dDataLength == 0U)) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */ + g_usbd_msc[busid].nsectors = GET_BE32(&g_usbd_msc[busid].cbw.CB[6]); /* Number of Blocks to transfer */ + + data_len = g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN]; + if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) { + return false; + } + + if (g_usbd_msc[busid].cbw.dDataLength != data_len) { + return false; + } + g_usbd_msc[busid].stage = MSC_DATA_OUT; + data_len = MIN(data_len, CONFIG_USBDEV_MSC_MAX_BUFSIZE); + usbd_ep_start_read(busid, mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr, g_usbd_msc[busid].block_buffer, data_len); + return true; +} + +static bool SCSI_processRead(uint8_t busid) +{ + uint32_t transfer_len; + + USB_LOG_DBG("read lba:%d\r\n", g_usbd_msc[busid].start_sector); + + transfer_len = MIN(g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN], CONFIG_USBDEV_MSC_MAX_BUFSIZE); + + if (usbd_msc_sector_read(busid, g_usbd_msc[busid].cbw.bLUN, g_usbd_msc[busid].start_sector, g_usbd_msc[busid].block_buffer, transfer_len) != 0) { + SCSI_SetSenseData(busid, SCSI_KCQHE_UREINRESERVEDAREA); + return false; + } + + g_usbd_msc[busid].start_sector += (transfer_len / g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN]); + g_usbd_msc[busid].nsectors -= (transfer_len / g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN]); + g_usbd_msc[busid].csw.dDataResidue -= transfer_len; + + if (g_usbd_msc[busid].nsectors == 0) { + g_usbd_msc[busid].stage = MSC_SEND_CSW; + } + + usbd_ep_start_write(busid, mass_ep_data[busid][MSD_IN_EP_IDX].ep_addr, g_usbd_msc[busid].block_buffer, transfer_len); + + return true; +} + +static bool SCSI_processWrite(uint8_t busid, uint32_t nbytes) +{ + uint32_t data_len = 0; + + USB_LOG_DBG("write lba:%d\r\n", g_usbd_msc[busid].start_sector); + + if (usbd_msc_sector_write(busid, g_usbd_msc[busid].cbw.bLUN, g_usbd_msc[busid].start_sector, g_usbd_msc[busid].block_buffer, nbytes) != 0) { + SCSI_SetSenseData(busid, SCSI_KCQHE_WRITEFAULT); + return false; + } + + g_usbd_msc[busid].start_sector += (nbytes / g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN]); + g_usbd_msc[busid].nsectors -= (nbytes / g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN]); + g_usbd_msc[busid].csw.dDataResidue -= nbytes; + + if (g_usbd_msc[busid].nsectors == 0) { + usbd_msc_send_csw(busid, CSW_STATUS_CMD_PASSED); + } else { + data_len = MIN(g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN], CONFIG_USBDEV_MSC_MAX_BUFSIZE); + usbd_ep_start_read(busid, mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr, g_usbd_msc[busid].block_buffer, data_len); + } + + return true; +} + +static bool SCSI_CBWDecode(uint8_t busid, uint32_t nbytes) +{ + uint8_t *buf2send = g_usbd_msc[busid].block_buffer; + uint32_t len2send = 0; + bool ret = false; + + if (nbytes != sizeof(struct CBW)) { + USB_LOG_ERR("size != sizeof(cbw)\r\n"); + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } + + g_usbd_msc[busid].csw.dTag = g_usbd_msc[busid].cbw.dTag; + g_usbd_msc[busid].csw.dDataResidue = g_usbd_msc[busid].cbw.dDataLength; + + if ((g_usbd_msc[busid].cbw.dSignature != MSC_CBW_Signature) || (g_usbd_msc[busid].cbw.bCBLength < 1) || (g_usbd_msc[busid].cbw.bCBLength > 16)) { + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + return false; + } else { + USB_LOG_DBG("Decode CB:0x%02x\r\n", g_usbd_msc[busid].cbw.CB[0]); + switch (g_usbd_msc[busid].cbw.CB[0]) { + case SCSI_CMD_TESTUNITREADY: + ret = SCSI_testUnitReady(busid, &buf2send, &len2send); + break; + case SCSI_CMD_REQUESTSENSE: + ret = SCSI_requestSense(busid, &buf2send, &len2send); + break; + case SCSI_CMD_INQUIRY: + ret = SCSI_inquiry(busid, &buf2send, &len2send); + break; + case SCSI_CMD_STARTSTOPUNIT: + ret = SCSI_startStopUnit(busid, &buf2send, &len2send); + break; + case SCSI_CMD_PREVENTMEDIAREMOVAL: + ret = SCSI_preventAllowMediaRemoval(busid, &buf2send, &len2send); + break; + case SCSI_CMD_MODESENSE6: + ret = SCSI_modeSense6(busid, &buf2send, &len2send); + break; + case SCSI_CMD_MODESENSE10: + ret = SCSI_modeSense10(busid, &buf2send, &len2send); + break; + case SCSI_CMD_READFORMATCAPACITIES: + ret = SCSI_readFormatCapacity(busid, &buf2send, &len2send); + break; + case SCSI_CMD_READCAPACITY10: + ret = SCSI_readCapacity10(busid, &buf2send, &len2send); + break; + case SCSI_CMD_READ10: + ret = SCSI_read10(busid, NULL, 0); + break; + case SCSI_CMD_READ12: + ret = SCSI_read12(busid, NULL, 0); + break; + case SCSI_CMD_WRITE10: + ret = SCSI_write10(busid, NULL, 0); + break; + case SCSI_CMD_WRITE12: + ret = SCSI_write12(busid, NULL, 0); + break; + case SCSI_CMD_VERIFY10: + ret = false; + break; + case SCSI_CMD_SYNCHCACHE10: + ret = true; + break; + default: + SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND); + ret = false; + break; + } + } + if (ret) { + if (g_usbd_msc[busid].stage == MSC_READ_CBW) { + if (len2send) { + USB_LOG_DBG("Send info len: %d\r\n", len2send); + usbd_msc_send_info(busid, buf2send, len2send); + } else { + usbd_msc_send_csw(busid, CSW_STATUS_CMD_PASSED); + } + } + } + return ret; +} + +void mass_storage_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)ep; + + switch (g_usbd_msc[busid].stage) { + case MSC_READ_CBW: + if (SCSI_CBWDecode(busid, nbytes) == false) { + USB_LOG_ERR("Command: 0x%02x decode err\r\n", g_usbd_msc[busid].cbw.CB[0]); + usbd_msc_bot_abort(busid); + return; + } + break; + case MSC_DATA_OUT: + switch (g_usbd_msc[busid].cbw.CB[0]) { + case SCSI_CMD_WRITE10: + case SCSI_CMD_WRITE12: +#if defined(CONFIG_USBDEV_MSC_THREAD) + g_usbd_msc[busid].nbytes = nbytes; + usb_osal_mq_send(g_usbd_msc[busid].usbd_msc_mq, MSC_DATA_OUT); +#elif defined(CONFIG_USBDEV_MSC_POLLING) + g_usbd_msc[busid].nbytes = nbytes; + g_usbd_msc[busid].event = MSC_DATA_OUT; +#else + if (SCSI_processWrite(busid, nbytes) == false) { + usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/ + } +#endif + break; + default: + break; + } + break; + default: + break; + } +} + +void mass_storage_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)ep; + (void)nbytes; + + switch (g_usbd_msc[busid].stage) { + case MSC_DATA_IN: + switch (g_usbd_msc[busid].cbw.CB[0]) { + case SCSI_CMD_READ10: + case SCSI_CMD_READ12: +#if defined(CONFIG_USBDEV_MSC_THREAD) + usb_osal_mq_send(g_usbd_msc[busid].usbd_msc_mq, MSC_DATA_IN); +#elif defined(CONFIG_USBDEV_MSC_POLLING) + g_usbd_msc[busid].event = MSC_DATA_IN; +#else + if (SCSI_processRead(busid) == false) { + usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/ + return; + } +#endif + break; + default: + break; + } + break; + /*the device has to send a CSW*/ + case MSC_SEND_CSW: + usbd_msc_send_csw(busid, CSW_STATUS_CMD_PASSED); + break; + + /*the host has received the CSW*/ + case MSC_WAIT_CSW: + g_usbd_msc[busid].stage = MSC_READ_CBW; + USB_LOG_DBG("Start reading cbw\r\n"); + usbd_ep_start_read(busid, mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr, (uint8_t *)&g_usbd_msc[busid].cbw, USB_SIZEOF_MSC_CBW); + break; + + default: + break; + } +} + +#if defined(CONFIG_USBDEV_MSC_THREAD) +static void usbdev_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + uintptr_t event; + int ret; + uint8_t busid = (uint8_t)CONFIG_USB_OSAL_THREAD_GET_ARGV; + + while (1) { + ret = usb_osal_mq_recv(g_usbd_msc[busid].usbd_msc_mq, (uintptr_t *)&event, USB_OSAL_WAITING_FOREVER); + if (ret < 0) { + continue; + } + if (event == MSC_DATA_OUT) { + if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) { + usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/ + } + } else if (event == MSC_DATA_IN) { + if (SCSI_processRead(busid) == false) { + usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/ + } + } else { + } + } +} +#elif defined(CONFIG_USBDEV_MSC_POLLING) +void usbd_msc_polling(uint8_t busid) +{ + uint8_t event; + + event = g_usbd_msc[busid].event; + + if (event != 0) { + g_usbd_msc[busid].event = 0; + if (event == MSC_DATA_OUT) { + if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) { + usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/ + } + } else if (event == MSC_DATA_IN) { + if (SCSI_processRead(busid) == false) { + usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/ + } + } else { + } + } +} +#endif + +struct usbd_interface *usbd_msc_init_intf(uint8_t busid, struct usbd_interface *intf, const uint8_t out_ep, const uint8_t in_ep) +{ + intf->class_interface_handler = msc_storage_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = msc_storage_notify_handler; + + mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr = out_ep; + mass_ep_data[busid][MSD_OUT_EP_IDX].ep_cb = mass_storage_bulk_out; + mass_ep_data[busid][MSD_IN_EP_IDX].ep_addr = in_ep; + mass_ep_data[busid][MSD_IN_EP_IDX].ep_cb = mass_storage_bulk_in; + + usbd_add_endpoint(busid, &mass_ep_data[busid][MSD_OUT_EP_IDX]); + usbd_add_endpoint(busid, &mass_ep_data[busid][MSD_IN_EP_IDX]); + + memset((uint8_t *)&g_usbd_msc[busid], 0, sizeof(struct usbd_msc_priv)); + + usdb_msc_set_max_lun(busid); + for (uint8_t i = 0u; i <= g_usbd_msc[busid].max_lun; i++) { + usbd_msc_get_cap(busid, i, &g_usbd_msc[busid].scsi_blk_nbr[i], &g_usbd_msc[busid].scsi_blk_size[i]); + + if (CONFIG_USBDEV_MSC_MAX_BUFSIZE % g_usbd_msc[busid].scsi_blk_size[i]) { + USB_LOG_ERR("CONFIG_USBDEV_MSC_MAX_BUFSIZE must be a multiple of block size\r\n"); + while (1) { + } + } + } + + return intf; +} + +void usbd_msc_set_readonly(uint8_t busid, bool readonly) +{ + g_usbd_msc[busid].readonly = readonly; +} + +bool usbd_msc_get_popup(uint8_t busid) +{ + return g_usbd_msc[busid].popup; +} + +__WEAK void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size) +{ + (void)busid; + (void)lun; + + *block_num = 0; + *block_size = 0; +} + +__WEAK int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + (void)busid; + (void)lun; + (void)sector; + (void)buffer; + (void)length; + + return 0; +} + +__WEAK int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + (void)busid; + (void)lun; + (void)sector; + (void)buffer; + (void)length; + + return 0; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/class/msc/usbd_msc.h b/src/lib/CherryUSB/class/msc/usbd_msc.h new file mode 100644 index 000000000..63a8752d7 --- /dev/null +++ b/src/lib/CherryUSB/class/msc/usbd_msc.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022, sakumisu + * Copyright (c) 2024, zhihong chen + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_MSC_H +#define USBD_MSC_H + +#include "usb_msc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Init msc interface driver */ +struct usbd_interface *usbd_msc_init_intf(uint8_t busid, struct usbd_interface *intf, + const uint8_t out_ep, + const uint8_t in_ep); + +void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size); +int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length); +int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length); + +void usbd_msc_set_readonly(uint8_t busid, bool readonly); +bool usbd_msc_get_popup(uint8_t busid); + +void usbd_msc_polling(uint8_t busid); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_MSC_H */ diff --git a/src/lib/CherryUSB/class/msc/usbh_msc.c b/src/lib/CherryUSB/class/msc/usbh_msc.c new file mode 100644 index 000000000..12a4f6738 --- /dev/null +++ b/src/lib/CherryUSB/class/msc/usbh_msc.c @@ -0,0 +1,468 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_msc.h" +#include "usb_scsi.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_msc" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/sd%c" + +#ifndef CONFIG_USBHOST_MSC_READY_CHECK_TIMES +#define CONFIG_USBHOST_MSC_READY_CHECK_TIMES 10 +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_msc_cbw_csw[CONFIG_USBHOST_MAX_MSC_CLASS][USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_msc_buf[CONFIG_USBHOST_MAX_MSC_CLASS][USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_msc g_msc_class[CONFIG_USBHOST_MAX_MSC_CLASS]; +static uint32_t g_devinuse = 0; +static struct usbh_msc_modeswitch_config *g_msc_modeswitch_config = NULL; + +static struct usbh_msc *usbh_msc_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_MSC_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_msc_class[devno], 0, sizeof(struct usbh_msc)); + g_msc_class[devno].sdchar = 'a' + devno; + return &g_msc_class[devno]; + } + } + return NULL; +} + +static void usbh_msc_class_free(struct usbh_msc *msc_class) +{ + uint8_t devno = msc_class->sdchar - 'a'; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(msc_class, 0, sizeof(struct usbh_msc)); +} + +static int usbh_msc_get_maxlun(struct usbh_msc *msc_class, uint8_t *buffer) +{ + struct usb_setup_packet *setup; + + if (!msc_class || !msc_class->hport) { + return -USB_ERR_INVAL; + } + setup = msc_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = MSC_REQUEST_GET_MAX_LUN; + setup->wValue = 0; + setup->wIndex = msc_class->intf; + setup->wLength = 1; + + return usbh_control_transfer(msc_class->hport, setup, buffer); +} + +static void usbh_msc_cbw_dump(struct CBW *cbw) +{ + int i; + + USB_LOG_DBG("CBW:\r\n"); + USB_LOG_DBG(" signature: 0x%08x\r\n", (unsigned int)cbw->dSignature); + USB_LOG_DBG(" tag: 0x%08x\r\n", (unsigned int)cbw->dTag); + USB_LOG_DBG(" datlen: 0x%08x\r\n", (unsigned int)cbw->dDataLength); + USB_LOG_DBG(" flags: 0x%02x\r\n", cbw->bmFlags); + USB_LOG_DBG(" lun: 0x%02x\r\n", cbw->bLUN); + USB_LOG_DBG(" cblen: 0x%02x\r\n", cbw->bCBLength); + + USB_LOG_DBG("CB:\r\n"); + for (i = 0; i < cbw->bCBLength; i += 8) { + USB_LOG_DBG(" 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\r\n", + cbw->CB[i], cbw->CB[i + 1], cbw->CB[i + 2], + cbw->CB[i + 3], cbw->CB[i + 4], cbw->CB[i + 5], + cbw->CB[i + 6], cbw->CB[i + 7]); + } +} + +static void usbh_msc_csw_dump(struct CSW *csw) +{ + (void)csw; + + USB_LOG_DBG("CSW:\r\n"); + USB_LOG_DBG(" signature: 0x%08x\r\n", (unsigned int)csw->dSignature); + USB_LOG_DBG(" tag: 0x%08x\r\n", (unsigned int)csw->dTag); + USB_LOG_DBG(" residue: 0x%08x\r\n", (unsigned int)csw->dDataResidue); + USB_LOG_DBG(" status: 0x%02x\r\n", csw->bStatus); +} + +static inline int usbh_msc_bulk_in_transfer(struct usbh_msc *msc_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &msc_class->bulkin_urb; + + usbh_bulk_urb_fill(urb, msc_class->hport, msc_class->bulkin, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +static inline int usbh_msc_bulk_out_transfer(struct usbh_msc *msc_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &msc_class->bulkout_urb; + + usbh_bulk_urb_fill(urb, msc_class->hport, msc_class->bulkout, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +static int usbh_bulk_cbw_csw_xfer(struct usbh_msc *msc_class, struct CBW *cbw, struct CSW *csw, uint8_t *buffer, uint32_t timeout) +{ + int nbytes; + + usbh_msc_cbw_dump(cbw); + + /* Send the CBW */ + nbytes = usbh_msc_bulk_out_transfer(msc_class, (uint8_t *)cbw, USB_SIZEOF_MSC_CBW, timeout); + if (nbytes < 0) { + USB_LOG_ERR("cbw transfer error: %d\r\n", nbytes); + goto __err_exit; + } + + if (cbw->dDataLength != 0) { + if (cbw->CB[0] == SCSI_CMD_WRITE10) { + nbytes = usbh_msc_bulk_out_transfer(msc_class, buffer, cbw->dDataLength, timeout); + } else if (cbw->CB[0] == SCSI_CMD_READCAPACITY10) { + nbytes = usbh_msc_bulk_in_transfer(msc_class, buffer, cbw->dDataLength, timeout); + if (nbytes >= 0) { + /* Save the capacity information */ + msc_class->blocknum = GET_BE32(&buffer[0]) + 1; + msc_class->blocksize = GET_BE32(&buffer[4]); + } + } else { + nbytes = usbh_msc_bulk_in_transfer(msc_class, buffer, cbw->dDataLength, timeout); + } + + if (nbytes < 0) { + USB_LOG_ERR("msc data transfer error: %d\r\n", nbytes); + goto __err_exit; + } + } + + /* Receive the CSW */ + memset(csw, 0, USB_SIZEOF_MSC_CSW); + nbytes = usbh_msc_bulk_in_transfer(msc_class, (uint8_t *)csw, USB_SIZEOF_MSC_CSW, timeout); + if (nbytes < 0) { + USB_LOG_ERR("csw transfer error: %d\r\n", nbytes); + goto __err_exit; + } + + usbh_msc_csw_dump(csw); + + /* check csw status */ + if (csw->dSignature != MSC_CSW_Signature) { + USB_LOG_ERR("csw signature error\r\n"); + return -USB_ERR_INVAL; + } + + if (csw->bStatus != 0) { + USB_LOG_ERR("csw bStatus %d\r\n", csw->bStatus); + return -USB_ERR_INVAL; + } +__err_exit: + return nbytes < 0 ? (int)nbytes : 0; +} + +static inline int usbh_msc_scsi_testunitready(struct usbh_msc *msc_class) +{ + struct CBW *cbw; + + /* Construct the CBW */ + cbw = (struct CBW *)g_msc_cbw_csw[msc_class->sdchar - 'a']; + memset(cbw, 0, USB_SIZEOF_MSC_CBW); + cbw->dSignature = MSC_CBW_Signature; + + cbw->bCBLength = SCSICMD_TESTUNITREADY_SIZEOF; + cbw->CB[0] = SCSI_CMD_TESTUNITREADY; + + return usbh_bulk_cbw_csw_xfer(msc_class, cbw, (struct CSW *)g_msc_cbw_csw[msc_class->sdchar - 'a'], NULL, CONFIG_USBHOST_MSC_TIMEOUT); +} + +static inline int usbh_msc_scsi_requestsense(struct usbh_msc *msc_class) +{ + struct CBW *cbw; + + /* Construct the CBW */ + cbw = (struct CBW *)g_msc_cbw_csw[msc_class->sdchar - 'a']; + memset(cbw, 0, USB_SIZEOF_MSC_CBW); + cbw->dSignature = MSC_CBW_Signature; + + cbw->bmFlags = 0x80; + cbw->dDataLength = SCSIRESP_FIXEDSENSEDATA_SIZEOF; + cbw->bCBLength = SCSICMD_REQUESTSENSE_SIZEOF; + cbw->CB[0] = SCSI_CMD_REQUESTSENSE; + cbw->CB[4] = SCSIRESP_FIXEDSENSEDATA_SIZEOF; + + return usbh_bulk_cbw_csw_xfer(msc_class, cbw, (struct CSW *)g_msc_cbw_csw[msc_class->sdchar - 'a'], g_msc_buf[msc_class->sdchar - 'a'], CONFIG_USBHOST_MSC_TIMEOUT); +} + +static inline int usbh_msc_scsi_inquiry(struct usbh_msc *msc_class) +{ + struct CBW *cbw; + + /* Construct the CBW */ + cbw = (struct CBW *)g_msc_cbw_csw[msc_class->sdchar - 'a']; + memset(cbw, 0, USB_SIZEOF_MSC_CBW); + cbw->dSignature = MSC_CBW_Signature; + + cbw->dDataLength = SCSIRESP_INQUIRY_SIZEOF; + cbw->bmFlags = 0x80; + cbw->bCBLength = SCSICMD_INQUIRY_SIZEOF; + cbw->CB[0] = SCSI_CMD_INQUIRY; + cbw->CB[4] = SCSIRESP_INQUIRY_SIZEOF; + + return usbh_bulk_cbw_csw_xfer(msc_class, cbw, (struct CSW *)g_msc_cbw_csw[msc_class->sdchar - 'a'], g_msc_buf[msc_class->sdchar - 'a'], CONFIG_USBHOST_MSC_TIMEOUT); +} + +static inline int usbh_msc_scsi_readcapacity10(struct usbh_msc *msc_class) +{ + struct CBW *cbw; + + /* Construct the CBW */ + cbw = (struct CBW *)g_msc_cbw_csw[msc_class->sdchar - 'a']; + memset(cbw, 0, USB_SIZEOF_MSC_CBW); + cbw->dSignature = MSC_CBW_Signature; + + cbw->dDataLength = SCSIRESP_READCAPACITY10_SIZEOF; + cbw->bmFlags = 0x80; + cbw->bCBLength = SCSICMD_READCAPACITY10_SIZEOF; + cbw->CB[0] = SCSI_CMD_READCAPACITY10; + + return usbh_bulk_cbw_csw_xfer(msc_class, cbw, (struct CSW *)g_msc_cbw_csw[msc_class->sdchar - 'a'], g_msc_buf[msc_class->sdchar - 'a'], CONFIG_USBHOST_MSC_TIMEOUT); +} + +static inline void usbh_msc_modeswitch(struct usbh_msc *msc_class, const uint8_t *message) +{ + struct CBW *cbw; + + /* Construct the CBW */ + cbw = (struct CBW *)g_msc_cbw_csw[msc_class->sdchar - 'a']; + + memcpy(g_msc_cbw_csw[msc_class->sdchar - 'a'], message, 31); + + usbh_bulk_cbw_csw_xfer(msc_class, cbw, (struct CSW *)g_msc_cbw_csw[msc_class->sdchar - 'a'], NULL, CONFIG_USBHOST_MSC_TIMEOUT); +} + +static int usbh_msc_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + struct usbh_msc_modeswitch_config *config; + int ret; + + struct usbh_msc *msc_class = usbh_msc_class_alloc(); + if (msc_class == NULL) { + USB_LOG_ERR("Fail to alloc msc_class\r\n"); + return -USB_ERR_NOMEM; + } + + msc_class->hport = hport; + msc_class->intf = intf; + + hport->config.intf[intf].priv = msc_class; + + ret = usbh_msc_get_maxlun(msc_class, g_msc_buf[msc_class->sdchar - 'a']); + if (ret < 0) { + if (ret == -USB_ERR_STALL) { + USB_LOG_WRN("Device does not support multiple LUNs\r\n"); + g_msc_buf[msc_class->sdchar - 'a'][0] = 0; + ret = 0; + } else { + return ret; + } + } + + USB_LOG_INFO("Get max LUN:%u\r\n", g_msc_buf[msc_class->sdchar - 'a'][0] + 1); + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(msc_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(msc_class->bulkout, ep_desc); + } + } + + if (g_msc_modeswitch_config) { + uint8_t num = 0; + while (1) { + config = &g_msc_modeswitch_config[num]; + if (config && config->name) { + if ((hport->device_desc.idVendor == config->vid) && + (hport->device_desc.idProduct == config->pid)) { + USB_LOG_INFO("%s usb_modeswitch enable\r\n", config->name); + usbh_msc_modeswitch(msc_class, config->message_content); + return 0; + } + num++; + } else { + break; + } + } + } + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, msc_class->sdchar); + + USB_LOG_INFO("Register MSC Class:%s\r\n", hport->config.intf[intf].devname); + + usbh_msc_run(msc_class); + return ret; +} + +static int usbh_msc_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_msc *msc_class = (struct usbh_msc *)hport->config.intf[intf].priv; + + if (msc_class) { + if (msc_class->bulkin) { + usbh_kill_urb(&msc_class->bulkin_urb); + } + + if (msc_class->bulkout) { + usbh_kill_urb(&msc_class->bulkout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister MSC Class:%s\r\n", hport->config.intf[intf].devname); + usbh_msc_stop(msc_class); + } + + usbh_msc_class_free(msc_class); + } + + return ret; +} + +int usbh_msc_scsi_init(struct usbh_msc *msc_class) +{ + int ret; + uint16_t cnt; + + cnt = 0; + while (usbh_msc_scsi_testunitready(msc_class) < 0) { + USB_LOG_WRN("Device not ready, try again...\r\n"); + ret = usbh_msc_scsi_requestsense(msc_class); + if (ret < 0) { + USB_LOG_ERR("Fail to scsi_testunitready\r\n"); + } + cnt++; + if (cnt > CONFIG_USBHOST_MSC_READY_CHECK_TIMES) { + return -USB_ERR_NODEV; + } + } + ret = usbh_msc_scsi_inquiry(msc_class); + if (ret < 0) { + USB_LOG_ERR("Fail to scsi_inquiry\r\n"); + return ret; + } + + ret = usbh_msc_scsi_readcapacity10(msc_class); + if (ret < 0) { + USB_LOG_ERR("Fail to scsi_readcapacity10\r\n"); + return ret; + } + + if (msc_class->blocksize > 0) { + USB_LOG_INFO("Capacity info:\r\n"); + USB_LOG_INFO("Block num:%d,block size:%d\r\n", (unsigned int)msc_class->blocknum, (unsigned int)msc_class->blocksize); + } else { + USB_LOG_ERR("Invalid block size\r\n"); + return -USB_ERR_RANGE; + } + + return 0; +} + +int usbh_msc_scsi_write10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors) +{ + struct CBW *cbw; + + /* Construct the CBW */ + cbw = (struct CBW *)g_msc_cbw_csw[msc_class->sdchar - 'a']; + memset(cbw, 0, USB_SIZEOF_MSC_CBW); + cbw->dSignature = MSC_CBW_Signature; + + cbw->dDataLength = (msc_class->blocksize * nsectors); + cbw->bCBLength = SCSICMD_WRITE10_SIZEOF; + cbw->CB[0] = SCSI_CMD_WRITE10; + + SET_BE32(&cbw->CB[2], start_sector); + SET_BE16(&cbw->CB[7], nsectors); + + return usbh_bulk_cbw_csw_xfer(msc_class, cbw, (struct CSW *)g_msc_cbw_csw[msc_class->sdchar - 'a'], (uint8_t *)buffer, CONFIG_USBHOST_MSC_TIMEOUT); +} + +int usbh_msc_scsi_read10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors) +{ + struct CBW *cbw; + + /* Construct the CBW */ + cbw = (struct CBW *)g_msc_cbw_csw[msc_class->sdchar - 'a']; + memset(cbw, 0, USB_SIZEOF_MSC_CBW); + cbw->dSignature = MSC_CBW_Signature; + + cbw->dDataLength = (msc_class->blocksize * nsectors); + cbw->bmFlags = 0x80; + cbw->bCBLength = SCSICMD_READ10_SIZEOF; + cbw->CB[0] = SCSI_CMD_READ10; + + SET_BE32(&cbw->CB[2], start_sector); + SET_BE16(&cbw->CB[7], nsectors); + + return usbh_bulk_cbw_csw_xfer(msc_class, cbw, (struct CSW *)g_msc_cbw_csw[msc_class->sdchar - 'a'], (uint8_t *)buffer, CONFIG_USBHOST_MSC_TIMEOUT); +} + +void usbh_msc_modeswitch_enable(struct usbh_msc_modeswitch_config *config) +{ + if (config) { + g_msc_modeswitch_config = config; + } else { + g_msc_modeswitch_config = NULL; + } +} + +__WEAK void usbh_msc_run(struct usbh_msc *msc_class) +{ + (void)msc_class; +} + +__WEAK void usbh_msc_stop(struct usbh_msc *msc_class) +{ + (void)msc_class; +} + +const struct usbh_class_driver msc_class_driver = { + .driver_name = "msc", + .connect = usbh_msc_connect, + .disconnect = usbh_msc_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info msc_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_MASS_STORAGE, + .bInterfaceSubClass = MSC_SUBCLASS_SCSI, + .bInterfaceProtocol = MSC_PROTOCOL_BULK_ONLY, + .id_table = NULL, + .class_driver = &msc_class_driver +}; diff --git a/src/lib/CherryUSB/class/msc/usbh_msc.h b/src/lib/CherryUSB/class/msc/usbh_msc.h new file mode 100644 index 000000000..c4aee8a85 --- /dev/null +++ b/src/lib/CherryUSB/class/msc/usbh_msc.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_MSC_H +#define USBH_MSC_H + +#include "usb_msc.h" +#include "usb_scsi.h" + +struct usbh_msc { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usbh_urb bulkin_urb; /* Bulk IN urb */ + struct usbh_urb bulkout_urb; /* Bulk OUT urb */ + + uint8_t intf; /* Data interface number */ + uint8_t sdchar; + uint32_t blocknum; /* Number of blocks on the USB mass storage device */ + uint16_t blocksize; /* Block size of USB mass storage device */ + + void *user_data; +}; + +struct usbh_msc_modeswitch_config { + const char *name; + uint16_t vid; /* Vendor ID (for vendor/product specific devices) */ + uint16_t pid; /* Product ID (for vendor/product specific devices) */ + const uint8_t *message_content; +}; + +void usbh_msc_modeswitch_enable(struct usbh_msc_modeswitch_config *config); +int usbh_msc_scsi_init(struct usbh_msc *msc_class); +int usbh_msc_scsi_write10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors); +int usbh_msc_scsi_read10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors); + +void usbh_msc_run(struct usbh_msc *msc_class); +void usbh_msc_stop(struct usbh_msc *msc_class); + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_MSC_H */ diff --git a/src/lib/CherryUSB/class/mtp/usb_mtp.h b/src/lib/CherryUSB/class/mtp/usb_mtp.h new file mode 100644 index 000000000..6616cf0f5 --- /dev/null +++ b/src/lib/CherryUSB/class/mtp/usb_mtp.h @@ -0,0 +1,682 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * 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. + */ + +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_MTP_H +#define USB_MTP_H + +// clang-format off +#define MTP_STANDARD_VERSION 100 + +// Container Types +#define MTP_CONTAINER_TYPE_UNDEFINED 0 +#define MTP_CONTAINER_TYPE_COMMAND 1 +#define MTP_CONTAINER_TYPE_DATA 2 +#define MTP_CONTAINER_TYPE_RESPONSE 3 +#define MTP_CONTAINER_TYPE_EVENT 4 + +// Container Offsets +#define MTP_CONTAINER_LENGTH_OFFSET 0 +#define MTP_CONTAINER_TYPE_OFFSET 4 +#define MTP_CONTAINER_CODE_OFFSET 6 +#define MTP_CONTAINER_TRANSACTION_ID_OFFSET 8 +#define MTP_CONTAINER_PARAMETER_OFFSET 12 +#define MTP_CONTAINER_HEADER_SIZE 12 + +// Maximum buffer size for a MTP packet. +#define MTP_BUFFER_SIZE 16384 + +// MTP Data Types +#define MTP_TYPE_UNDEFINED 0x0000 // Undefined +#define MTP_TYPE_INT8 0x0001 // Signed 8-bit integer +#define MTP_TYPE_UINT8 0x0002 // Unsigned 8-bit integer +#define MTP_TYPE_INT16 0x0003 // Signed 16-bit integer +#define MTP_TYPE_UINT16 0x0004 // Unsigned 16-bit integer +#define MTP_TYPE_INT32 0x0005 // Signed 32-bit integer +#define MTP_TYPE_UINT32 0x0006 // Unsigned 32-bit integer +#define MTP_TYPE_INT64 0x0007 // Signed 64-bit integer +#define MTP_TYPE_UINT64 0x0008 // Unsigned 64-bit integer +#define MTP_TYPE_INT128 0x0009 // Signed 128-bit integer +#define MTP_TYPE_UINT128 0x000A // Unsigned 128-bit integer +#define MTP_TYPE_AINT8 0x4001 // Array of signed 8-bit integers +#define MTP_TYPE_AUINT8 0x4002 // Array of unsigned 8-bit integers +#define MTP_TYPE_AINT16 0x4003 // Array of signed 16-bit integers +#define MTP_TYPE_AUINT16 0x4004 // Array of unsigned 16-bit integers +#define MTP_TYPE_AINT32 0x4005 // Array of signed 32-bit integers +#define MTP_TYPE_AUINT32 0x4006 // Array of unsigned 32-bit integers +#define MTP_TYPE_AINT64 0x4007 // Array of signed 64-bit integers +#define MTP_TYPE_AUINT64 0x4008 // Array of unsigned 64-bit integers +#define MTP_TYPE_AINT128 0x4009 // Array of signed 128-bit integers +#define MTP_TYPE_AUINT128 0x400A // Array of unsigned 128-bit integers +#define MTP_TYPE_STR 0xFFFF // Variable-length Unicode string + +// MTP Format Codes +#define MTP_FORMAT_UNDEFINED 0x3000 // Undefined object +#define MTP_FORMAT_ASSOCIATION 0x3001 // Association (for example, a folder) +#define MTP_FORMAT_SCRIPT 0x3002 // Device model-specific script +#define MTP_FORMAT_EXECUTABLE 0x3003 // Device model-specific binary executable +#define MTP_FORMAT_TEXT 0x3004 // Text file +#define MTP_FORMAT_HTML 0x3005 // Hypertext Markup Language file (text) +#define MTP_FORMAT_DPOF 0x3006 // Digital Print Order Format file (text) +#define MTP_FORMAT_AIFF 0x3007 // Audio clip +#define MTP_FORMAT_WAV 0x3008 // Audio clip +#define MTP_FORMAT_MP3 0x3009 // Audio clip +#define MTP_FORMAT_AVI 0x300A // Video clip +#define MTP_FORMAT_MPEG 0x300B // Video clip +#define MTP_FORMAT_ASF 0x300C // Microsoft Advanced Streaming Format (video) +#define MTP_FORMAT_DEFINED 0x3800 // Unknown image object +#define MTP_FORMAT_EXIF_JPEG 0x3801 // Exchangeable File Format, JEIDA standard +#define MTP_FORMAT_TIFF_EP 0x3802 // Tag Image File Format for Electronic Photography +#define MTP_FORMAT_FLASHPIX 0x3803 // Structured Storage Image Format +#define MTP_FORMAT_BMP 0x3804 // Microsoft Windows Bitmap file +#define MTP_FORMAT_CIFF 0x3805 // Canon Camera Image File Format +#define MTP_FORMAT_GIF 0x3807 // Graphics Interchange Format +#define MTP_FORMAT_JFIF 0x3808 // JPEG File Interchange Format +#define MTP_FORMAT_CD 0x3809 // PhotoCD Image Pac +#define MTP_FORMAT_PICT 0x380A // Quickdraw Image Format +#define MTP_FORMAT_PNG 0x380B // Portable Network Graphics +#define MTP_FORMAT_TIFF 0x380D // Tag Image File Format +#define MTP_FORMAT_TIFF_IT 0x380E // Tag Image File Format for Information Technology (graphic arts) +#define MTP_FORMAT_JP2 0x380F // JPEG2000 Baseline File Format +#define MTP_FORMAT_JPX 0x3810 // JPEG2000 Extended File Format +#define MTP_FORMAT_DNG 0x3811 // Digital Negative +#define MTP_FORMAT_HEIF 0x3812 // HEIF images +#define MTP_FORMAT_UNDEFINED_FIRMWARE 0xB802 +#define MTP_FORMAT_WINDOWS_IMAGE_FORMAT 0xB881 +#define MTP_FORMAT_UNDEFINED_AUDIO 0xB900 +#define MTP_FORMAT_WMA 0xB901 +#define MTP_FORMAT_OGG 0xB902 +#define MTP_FORMAT_AAC 0xB903 +#define MTP_FORMAT_AUDIBLE 0xB904 +#define MTP_FORMAT_FLAC 0xB906 +#define MTP_FORMAT_UNDEFINED_VIDEO 0xB980 +#define MTP_FORMAT_WMV 0xB981 +#define MTP_FORMAT_MP4_CONTAINER 0xB982 // ISO 14496-1 +#define MTP_FORMAT_MP2 0xB983 +#define MTP_FORMAT_3GP_CONTAINER 0xB984 // 3GPP file format. Details: http://www.3gpp.org/ftp/Specs/html-info/26244.htm (page title - \u201cTransparent end-to-end packet switched streaming service, 3GPP file format\u201d). +#define MTP_FORMAT_UNDEFINED_COLLECTION 0xBA00 +#define MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM 0xBA01 +#define MTP_FORMAT_ABSTRACT_IMAGE_ALBUM 0xBA02 +#define MTP_FORMAT_ABSTRACT_AUDIO_ALBUM 0xBA03 +#define MTP_FORMAT_ABSTRACT_VIDEO_ALBUM 0xBA04 +#define MTP_FORMAT_ABSTRACT_AV_PLAYLIST 0xBA05 +#define MTP_FORMAT_ABSTRACT_CONTACT_GROUP 0xBA06 +#define MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER 0xBA07 +#define MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION 0xBA08 +#define MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST 0xBA09 +#define MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST 0xBA0A +#define MTP_FORMAT_ABSTRACT_MEDIACAST 0xBA0B // For use with mediacasts; references multimedia enclosures of RSS feeds or episodic content +#define MTP_FORMAT_WPL_PLAYLIST 0xBA10 +#define MTP_FORMAT_M3U_PLAYLIST 0xBA11 +#define MTP_FORMAT_MPL_PLAYLIST 0xBA12 +#define MTP_FORMAT_ASX_PLAYLIST 0xBA13 +#define MTP_FORMAT_PLS_PLAYLIST 0xBA14 +#define MTP_FORMAT_UNDEFINED_DOCUMENT 0xBA80 +#define MTP_FORMAT_ABSTRACT_DOCUMENT 0xBA81 +#define MTP_FORMAT_XML_DOCUMENT 0xBA82 +#define MTP_FORMAT_MS_WORD_DOCUMENT 0xBA83 +#define MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT 0xBA84 +#define MTP_FORMAT_MS_EXCEL_SPREADSHEET 0xBA85 +#define MTP_FORMAT_MS_POWERPOINT_PRESENTATION 0xBA86 +#define MTP_FORMAT_UNDEFINED_MESSAGE 0xBB00 +#define MTP_FORMAT_ABSTRACT_MESSSAGE 0xBB01 +#define MTP_FORMAT_UNDEFINED_CONTACT 0xBB80 +#define MTP_FORMAT_ABSTRACT_CONTACT 0xBB81 +#define MTP_FORMAT_VCARD_2 0xBB82 + +// MTP Object Property Codes +#define MTP_PROPERTY_STORAGE_ID 0xDC01 +#define MTP_PROPERTY_OBJECT_FORMAT 0xDC02 +#define MTP_PROPERTY_PROTECTION_STATUS 0xDC03 +#define MTP_PROPERTY_OBJECT_SIZE 0xDC04 +#define MTP_PROPERTY_ASSOCIATION_TYPE 0xDC05 +#define MTP_PROPERTY_ASSOCIATION_DESC 0xDC06 +#define MTP_PROPERTY_OBJECT_FILE_NAME 0xDC07 +#define MTP_PROPERTY_DATE_CREATED 0xDC08 +#define MTP_PROPERTY_DATE_MODIFIED 0xDC09 +#define MTP_PROPERTY_KEYWORDS 0xDC0A +#define MTP_PROPERTY_PARENT_OBJECT 0xDC0B +#define MTP_PROPERTY_ALLOWED_FOLDER_CONTENTS 0xDC0C +#define MTP_PROPERTY_HIDDEN 0xDC0D +#define MTP_PROPERTY_SYSTEM_OBJECT 0xDC0E +#define MTP_PROPERTY_PERSISTENT_UID 0xDC41 +#define MTP_PROPERTY_SYNC_ID 0xDC42 +#define MTP_PROPERTY_PROPERTY_BAG 0xDC43 +#define MTP_PROPERTY_NAME 0xDC44 +#define MTP_PROPERTY_CREATED_BY 0xDC45 +#define MTP_PROPERTY_ARTIST 0xDC46 +#define MTP_PROPERTY_DATE_AUTHORED 0xDC47 +#define MTP_PROPERTY_DESCRIPTION 0xDC48 +#define MTP_PROPERTY_URL_REFERENCE 0xDC49 +#define MTP_PROPERTY_LANGUAGE_LOCALE 0xDC4A +#define MTP_PROPERTY_COPYRIGHT_INFORMATION 0xDC4B +#define MTP_PROPERTY_SOURCE 0xDC4C +#define MTP_PROPERTY_ORIGIN_LOCATION 0xDC4D +#define MTP_PROPERTY_DATE_ADDED 0xDC4E +#define MTP_PROPERTY_NON_CONSUMABLE 0xDC4F +#define MTP_PROPERTY_CORRUPT_UNPLAYABLE 0xDC50 +#define MTP_PROPERTY_PRODUCER_SERIAL_NUMBER 0xDC51 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_FORMAT 0xDC81 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_SIZE 0xDC82 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_HEIGHT 0xDC83 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_WIDTH 0xDC84 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DURATION 0xDC85 +#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DATA 0xDC86 +#define MTP_PROPERTY_WIDTH 0xDC87 +#define MTP_PROPERTY_HEIGHT 0xDC88 +#define MTP_PROPERTY_DURATION 0xDC89 +#define MTP_PROPERTY_RATING 0xDC8A +#define MTP_PROPERTY_TRACK 0xDC8B +#define MTP_PROPERTY_GENRE 0xDC8C +#define MTP_PROPERTY_CREDITS 0xDC8D +#define MTP_PROPERTY_LYRICS 0xDC8E +#define MTP_PROPERTY_SUBSCRIPTION_CONTENT_ID 0xDC8F +#define MTP_PROPERTY_PRODUCED_BY 0xDC90 +#define MTP_PROPERTY_USE_COUNT 0xDC91 +#define MTP_PROPERTY_SKIP_COUNT 0xDC92 +#define MTP_PROPERTY_LAST_ACCESSED 0xDC93 +#define MTP_PROPERTY_PARENTAL_RATING 0xDC94 +#define MTP_PROPERTY_META_GENRE 0xDC95 +#define MTP_PROPERTY_COMPOSER 0xDC96 +#define MTP_PROPERTY_EFFECTIVE_RATING 0xDC97 +#define MTP_PROPERTY_SUBTITLE 0xDC98 +#define MTP_PROPERTY_ORIGINAL_RELEASE_DATE 0xDC99 +#define MTP_PROPERTY_ALBUM_NAME 0xDC9A +#define MTP_PROPERTY_ALBUM_ARTIST 0xDC9B +#define MTP_PROPERTY_MOOD 0xDC9C +#define MTP_PROPERTY_DRM_STATUS 0xDC9D +#define MTP_PROPERTY_SUB_DESCRIPTION 0xDC9E +#define MTP_PROPERTY_IS_CROPPED 0xDCD1 +#define MTP_PROPERTY_IS_COLOUR_CORRECTED 0xDCD2 +#define MTP_PROPERTY_IMAGE_BIT_DEPTH 0xDCD3 +#define MTP_PROPERTY_F_NUMBER 0xDCD4 +#define MTP_PROPERTY_EXPOSURE_TIME 0xDCD5 +#define MTP_PROPERTY_EXPOSURE_INDEX 0xDCD6 +#define MTP_PROPERTY_TOTAL_BITRATE 0xDE91 +#define MTP_PROPERTY_BITRATE_TYPE 0xDE92 +#define MTP_PROPERTY_SAMPLE_RATE 0xDE93 +#define MTP_PROPERTY_NUMBER_OF_CHANNELS 0xDE94 +#define MTP_PROPERTY_AUDIO_BIT_DEPTH 0xDE95 +#define MTP_PROPERTY_SCAN_TYPE 0xDE97 +#define MTP_PROPERTY_AUDIO_WAVE_CODEC 0xDE99 +#define MTP_PROPERTY_AUDIO_BITRATE 0xDE9A +#define MTP_PROPERTY_VIDEO_FOURCC_CODEC 0xDE9B +#define MTP_PROPERTY_VIDEO_BITRATE 0xDE9C +#define MTP_PROPERTY_FRAMES_PER_THOUSAND_SECONDS 0xDE9D +#define MTP_PROPERTY_KEYFRAME_DISTANCE 0xDE9E +#define MTP_PROPERTY_BUFFER_SIZE 0xDE9F +#define MTP_PROPERTY_ENCODING_QUALITY 0xDEA0 +#define MTP_PROPERTY_ENCODING_PROFILE 0xDEA1 +#define MTP_PROPERTY_DISPLAY_NAME 0xDCE0 +#define MTP_PROPERTY_BODY_TEXT 0xDCE1 +#define MTP_PROPERTY_SUBJECT 0xDCE2 +#define MTP_PROPERTY_PRIORITY 0xDCE3 +#define MTP_PROPERTY_GIVEN_NAME 0xDD00 +#define MTP_PROPERTY_MIDDLE_NAMES 0xDD01 +#define MTP_PROPERTY_FAMILY_NAME 0xDD02 +#define MTP_PROPERTY_PREFIX 0xDD03 +#define MTP_PROPERTY_SUFFIX 0xDD04 +#define MTP_PROPERTY_PHONETIC_GIVEN_NAME 0xDD05 +#define MTP_PROPERTY_PHONETIC_FAMILY_NAME 0xDD06 +#define MTP_PROPERTY_EMAIL_PRIMARY 0xDD07 +#define MTP_PROPERTY_EMAIL_PERSONAL_1 0xDD08 +#define MTP_PROPERTY_EMAIL_PERSONAL_2 0xDD09 +#define MTP_PROPERTY_EMAIL_BUSINESS_1 0xDD0A +#define MTP_PROPERTY_EMAIL_BUSINESS_2 0xDD0B +#define MTP_PROPERTY_EMAIL_OTHERS 0xDD0C +#define MTP_PROPERTY_PHONE_NUMBER_PRIMARY 0xDD0D +#define MTP_PROPERTY_PHONE_NUMBER_PERSONAL 0xDD0E +#define MTP_PROPERTY_PHONE_NUMBER_PERSONAL_2 0xDD0F +#define MTP_PROPERTY_PHONE_NUMBER_BUSINESS 0xDD10 +#define MTP_PROPERTY_PHONE_NUMBER_BUSINESS_2 0xDD11 +#define MTP_PROPERTY_PHONE_NUMBER_MOBILE 0xDD12 +#define MTP_PROPERTY_PHONE_NUMBER_MOBILE_2 0xDD13 +#define MTP_PROPERTY_FAX_NUMBER_PRIMARY 0xDD14 +#define MTP_PROPERTY_FAX_NUMBER_PERSONAL 0xDD15 +#define MTP_PROPERTY_FAX_NUMBER_BUSINESS 0xDD16 +#define MTP_PROPERTY_PAGER_NUMBER 0xDD17 +#define MTP_PROPERTY_PHONE_NUMBER_OTHERS 0xDD18 +#define MTP_PROPERTY_PRIMARY_WEB_ADDRESS 0xDD19 +#define MTP_PROPERTY_PERSONAL_WEB_ADDRESS 0xDD1A +#define MTP_PROPERTY_BUSINESS_WEB_ADDRESS 0xDD1B +#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS 0xDD1C +#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_2 0xDD1D +#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_3 0xDD1E +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_FULL 0xDD1F +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_1 0xDD20 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_2 0xDD21 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_CITY 0xDD22 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_REGION 0xDD23 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE 0xDD24 +#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_COUNTRY 0xDD25 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_FULL 0xDD26 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_1 0xDD27 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_2 0xDD28 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_CITY 0xDD29 +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_REGION 0xDD2A +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE 0xDD2B +#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_COUNTRY 0xDD2C +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_FULL 0xDD2D +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_1 0xDD2E +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_2 0xDD2F +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_CITY 0xDD30 +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_REGION 0xDD31 +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_POSTAL_CODE 0xDD32 +#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_COUNTRY 0xDD33 +#define MTP_PROPERTY_ORGANIZATION_NAME 0xDD34 +#define MTP_PROPERTY_PHONETIC_ORGANIZATION_NAME 0xDD35 +#define MTP_PROPERTY_ROLE 0xDD36 +#define MTP_PROPERTY_BIRTHDATE 0xDD37 +#define MTP_PROPERTY_MESSAGE_TO 0xDD40 +#define MTP_PROPERTY_MESSAGE_CC 0xDD41 +#define MTP_PROPERTY_MESSAGE_BCC 0xDD42 +#define MTP_PROPERTY_MESSAGE_READ 0xDD43 +#define MTP_PROPERTY_MESSAGE_RECEIVED_TIME 0xDD44 +#define MTP_PROPERTY_MESSAGE_SENDER 0xDD45 +#define MTP_PROPERTY_ACTIVITY_BEGIN_TIME 0xDD50 +#define MTP_PROPERTY_ACTIVITY_END_TIME 0xDD51 +#define MTP_PROPERTY_ACTIVITY_LOCATION 0xDD52 +#define MTP_PROPERTY_ACTIVITY_REQUIRED_ATTENDEES 0xDD54 +#define MTP_PROPERTY_ACTIVITY_OPTIONAL_ATTENDEES 0xDD55 +#define MTP_PROPERTY_ACTIVITY_RESOURCES 0xDD56 +#define MTP_PROPERTY_ACTIVITY_ACCEPTED 0xDD57 +#define MTP_PROPERTY_ACTIVITY_TENTATIVE 0xDD58 +#define MTP_PROPERTY_ACTIVITY_DECLINED 0xDD59 +#define MTP_PROPERTY_ACTIVITY_REMAINDER_TIME 0xDD5A +#define MTP_PROPERTY_ACTIVITY_OWNER 0xDD5B +#define MTP_PROPERTY_ACTIVITY_STATUS 0xDD5C +#define MTP_PROPERTY_OWNER 0xDD5D +#define MTP_PROPERTY_EDITOR 0xDD5E +#define MTP_PROPERTY_WEBMASTER 0xDD5F +#define MTP_PROPERTY_URL_SOURCE 0xDD60 +#define MTP_PROPERTY_URL_DESTINATION 0xDD61 +#define MTP_PROPERTY_TIME_BOOKMARK 0xDD62 +#define MTP_PROPERTY_OBJECT_BOOKMARK 0xDD63 +#define MTP_PROPERTY_BYTE_BOOKMARK 0xDD64 +#define MTP_PROPERTY_LAST_BUILD_DATE 0xDD70 +#define MTP_PROPERTY_TIME_TO_LIVE 0xDD71 +#define MTP_PROPERTY_MEDIA_GUID 0xDD72 + +// MTP Device Property Codes +#define MTP_DEVICE_PROPERTY_UNDEFINED 0x5000 +#define MTP_DEVICE_PROPERTY_BATTERY_LEVEL 0x5001 +#define MTP_DEVICE_PROPERTY_FUNCTIONAL_MODE 0x5002 +#define MTP_DEVICE_PROPERTY_IMAGE_SIZE 0x5003 +#define MTP_DEVICE_PROPERTY_COMPRESSION_SETTING 0x5004 +#define MTP_DEVICE_PROPERTY_WHITE_BALANCE 0x5005 +#define MTP_DEVICE_PROPERTY_RGB_GAIN 0x5006 +#define MTP_DEVICE_PROPERTY_F_NUMBER 0x5007 +#define MTP_DEVICE_PROPERTY_FOCAL_LENGTH 0x5008 +#define MTP_DEVICE_PROPERTY_FOCUS_DISTANCE 0x5009 +#define MTP_DEVICE_PROPERTY_FOCUS_MODE 0x500A +#define MTP_DEVICE_PROPERTY_EXPOSURE_METERING_MODE 0x500B +#define MTP_DEVICE_PROPERTY_FLASH_MODE 0x500C +#define MTP_DEVICE_PROPERTY_EXPOSURE_TIME 0x500D +#define MTP_DEVICE_PROPERTY_EXPOSURE_PROGRAM_MODE 0x500E +#define MTP_DEVICE_PROPERTY_EXPOSURE_INDEX 0x500F +#define MTP_DEVICE_PROPERTY_EXPOSURE_BIAS_COMPENSATION 0x5010 +#define MTP_DEVICE_PROPERTY_DATETIME 0x5011 +#define MTP_DEVICE_PROPERTY_CAPTURE_DELAY 0x5012 +#define MTP_DEVICE_PROPERTY_STILL_CAPTURE_MODE 0x5013 +#define MTP_DEVICE_PROPERTY_CONTRAST 0x5014 +#define MTP_DEVICE_PROPERTY_SHARPNESS 0x5015 +#define MTP_DEVICE_PROPERTY_DIGITAL_ZOOM 0x5016 +#define MTP_DEVICE_PROPERTY_EFFECT_MODE 0x5017 +#define MTP_DEVICE_PROPERTY_BURST_NUMBER 0x5018 +#define MTP_DEVICE_PROPERTY_BURST_INTERVAL 0x5019 +#define MTP_DEVICE_PROPERTY_TIMELAPSE_NUMBER 0x501A +#define MTP_DEVICE_PROPERTY_TIMELAPSE_INTERVAL 0x501B +#define MTP_DEVICE_PROPERTY_FOCUS_METERING_MODE 0x501C +#define MTP_DEVICE_PROPERTY_UPLOAD_URL 0x501D +#define MTP_DEVICE_PROPERTY_ARTIST 0x501E +#define MTP_DEVICE_PROPERTY_COPYRIGHT_INFO 0x501F +#define MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER 0xD401 +#define MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME 0xD402 +#define MTP_DEVICE_PROPERTY_VOLUME 0xD403 +#define MTP_DEVICE_PROPERTY_SUPPORTED_FORMATS_ORDERED 0xD404 +#define MTP_DEVICE_PROPERTY_DEVICE_ICON 0xD405 +#define MTP_DEVICE_PROPERTY_PLAYBACK_RATE 0xD410 +#define MTP_DEVICE_PROPERTY_PLAYBACK_OBJECT 0xD411 +#define MTP_DEVICE_PROPERTY_PLAYBACK_CONTAINER_INDEX 0xD412 +#define MTP_DEVICE_PROPERTY_SESSION_INITIATOR_VERSION_INFO 0xD406 +#define MTP_DEVICE_PROPERTY_PERCEIVED_DEVICE_TYPE 0xD407 + +// MTP Operation Codes +#define MTP_OPERATION_GET_DEVICE_INFO 0x1001 +#define MTP_OPERATION_OPEN_SESSION 0x1002 +#define MTP_OPERATION_CLOSE_SESSION 0x1003 +#define MTP_OPERATION_GET_STORAGE_IDS 0x1004 +#define MTP_OPERATION_GET_STORAGE_INFO 0x1005 +#define MTP_OPERATION_GET_NUM_OBJECTS 0x1006 +#define MTP_OPERATION_GET_OBJECT_HANDLES 0x1007 +#define MTP_OPERATION_GET_OBJECT_INFO 0x1008 +#define MTP_OPERATION_GET_OBJECT 0x1009 +#define MTP_OPERATION_GET_THUMB 0x100A +#define MTP_OPERATION_DELETE_OBJECT 0x100B +#define MTP_OPERATION_SEND_OBJECT_INFO 0x100C +#define MTP_OPERATION_SEND_OBJECT 0x100D +#define MTP_OPERATION_INITIATE_CAPTURE 0x100E +#define MTP_OPERATION_FORMAT_STORE 0x100F +#define MTP_OPERATION_RESET_DEVICE 0x1010 +#define MTP_OPERATION_SELF_TEST 0x1011 +#define MTP_OPERATION_SET_OBJECT_PROTECTION 0x1012 +#define MTP_OPERATION_POWER_DOWN 0x1013 +#define MTP_OPERATION_GET_DEVICE_PROP_DESC 0x1014 +#define MTP_OPERATION_GET_DEVICE_PROP_VALUE 0x1015 +#define MTP_OPERATION_SET_DEVICE_PROP_VALUE 0x1016 +#define MTP_OPERATION_RESET_DEVICE_PROP_VALUE 0x1017 +#define MTP_OPERATION_TERMINATE_OPEN_CAPTURE 0x1018 +#define MTP_OPERATION_MOVE_OBJECT 0x1019 +#define MTP_OPERATION_COPY_OBJECT 0x101A +#define MTP_OPERATION_GET_PARTIAL_OBJECT 0x101B +#define MTP_OPERATION_INITIATE_OPEN_CAPTURE 0x101C +#define MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED 0x9801 +#define MTP_OPERATION_GET_OBJECT_PROP_DESC 0x9802 +#define MTP_OPERATION_GET_OBJECT_PROP_VALUE 0x9803 +#define MTP_OPERATION_SET_OBJECT_PROP_VALUE 0x9804 +#define MTP_OPERATION_GET_OBJECT_PROP_LIST 0x9805 +#define MTP_OPERATION_SET_OBJECT_PROP_LIST 0x9806 +#define MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC 0x9807 +#define MTP_OPERATION_SEND_OBJECT_PROP_LIST 0x9808 +#define MTP_OPERATION_GET_OBJECT_REFERENCES 0x9810 +#define MTP_OPERATION_SET_OBJECT_REFERENCES 0x9811 +#define MTP_OPERATION_SKIP 0x9820 + +// Android extensions for direct file IO + +// Same as GetPartialObject, but with 64 bit offset +#define MTP_OPERATION_GET_PARTIAL_OBJECT_64 0x95C1 +// Same as GetPartialObject64, but copying host to device +#define MTP_OPERATION_SEND_PARTIAL_OBJECT 0x95C2 +// Truncates file to 64 bit length +#define MTP_OPERATION_TRUNCATE_OBJECT 0x95C3 +// Must be called before using SendPartialObject and TruncateObject +#define MTP_OPERATION_BEGIN_EDIT_OBJECT 0x95C4 +// Called to commit changes made by SendPartialObject and TruncateObject +#define MTP_OPERATION_END_EDIT_OBJECT 0x95C5 + +// MTP Response Codes +#define MTP_RESPONSE_UNDEFINED 0x2000 +#define MTP_RESPONSE_OK 0x2001 +#define MTP_RESPONSE_GENERAL_ERROR 0x2002 +#define MTP_RESPONSE_SESSION_NOT_OPEN 0x2003 +#define MTP_RESPONSE_INVALID_TRANSACTION_ID 0x2004 +#define MTP_RESPONSE_OPERATION_NOT_SUPPORTED 0x2005 +#define MTP_RESPONSE_PARAMETER_NOT_SUPPORTED 0x2006 +#define MTP_RESPONSE_INCOMPLETE_TRANSFER 0x2007 +#define MTP_RESPONSE_INVALID_STORAGE_ID 0x2008 +#define MTP_RESPONSE_INVALID_OBJECT_HANDLE 0x2009 +#define MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED 0x200A +#define MTP_RESPONSE_INVALID_OBJECT_FORMAT_CODE 0x200B +#define MTP_RESPONSE_STORAGE_FULL 0x200C +#define MTP_RESPONSE_OBJECT_WRITE_PROTECTED 0x200D +#define MTP_RESPONSE_STORE_READ_ONLY 0x200E +#define MTP_RESPONSE_ACCESS_DENIED 0x200F +#define MTP_RESPONSE_NO_THUMBNAIL_PRESENT 0x2010 +#define MTP_RESPONSE_SELF_TEST_FAILED 0x2011 +#define MTP_RESPONSE_PARTIAL_DELETION 0x2012 +#define MTP_RESPONSE_STORE_NOT_AVAILABLE 0x2013 +#define MTP_RESPONSE_SPECIFICATION_BY_FORMAT_UNSUPPORTED 0x2014 +#define MTP_RESPONSE_NO_VALID_OBJECT_INFO 0x2015 +#define MTP_RESPONSE_INVALID_CODE_FORMAT 0x2016 +#define MTP_RESPONSE_UNKNOWN_VENDOR_CODE 0x2017 +#define MTP_RESPONSE_CAPTURE_ALREADY_TERMINATED 0x2018 +#define MTP_RESPONSE_DEVICE_BUSY 0x2019 +#define MTP_RESPONSE_INVALID_PARENT_OBJECT 0x201A +#define MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT 0x201B +#define MTP_RESPONSE_INVALID_DEVICE_PROP_VALUE 0x201C +#define MTP_RESPONSE_INVALID_PARAMETER 0x201D +#define MTP_RESPONSE_SESSION_ALREADY_OPEN 0x201E +#define MTP_RESPONSE_TRANSACTION_CANCELLED 0x201F +#define MTP_RESPONSE_SPECIFICATION_OF_DESTINATION_UNSUPPORTED 0x2020 +#define MTP_RESPONSE_INVALID_OBJECT_PROP_CODE 0xA801 +#define MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT 0xA802 +#define MTP_RESPONSE_INVALID_OBJECT_PROP_VALUE 0xA803 +#define MTP_RESPONSE_INVALID_OBJECT_REFERENCE 0xA804 +#define MTP_RESPONSE_GROUP_NOT_SUPPORTED 0xA805 +#define MTP_RESPONSE_INVALID_DATASET 0xA806 +#define MTP_RESPONSE_SPECIFICATION_BY_GROUP_UNSUPPORTED 0xA807 +#define MTP_RESPONSE_SPECIFICATION_BY_DEPTH_UNSUPPORTED 0xA808 +#define MTP_RESPONSE_OBJECT_TOO_LARGE 0xA809 +#define MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED 0xA80A +#define MTP_RESPONSE_NO_RESPONSE 0xFFFF + +// MTP Event Codes +#define MTP_EVENT_UNDEFINED 0x4000 +#define MTP_EVENT_CANCEL_TRANSACTION 0x4001 +#define MTP_EVENT_OBJECT_ADDED 0x4002 +#define MTP_EVENT_OBJECT_REMOVED 0x4003 +#define MTP_EVENT_STORE_ADDED 0x4004 +#define MTP_EVENT_STORE_REMOVED 0x4005 +#define MTP_EVENT_DEVICE_PROP_CHANGED 0x4006 +#define MTP_EVENT_OBJECT_INFO_CHANGED 0x4007 +#define MTP_EVENT_DEVICE_INFO_CHANGED 0x4008 +#define MTP_EVENT_REQUEST_OBJECT_TRANSFER 0x4009 +#define MTP_EVENT_STORE_FULL 0x400A +#define MTP_EVENT_DEVICE_RESET 0x400B +#define MTP_EVENT_STORAGE_INFO_CHANGED 0x400C +#define MTP_EVENT_CAPTURE_COMPLETE 0x400D +#define MTP_EVENT_UNREPORTED_STATUS 0x400E +#define MTP_EVENT_OBJECT_PROP_CHANGED 0xC801 +#define MTP_EVENT_OBJECT_PROP_DESC_CHANGED 0xC802 +#define MTP_EVENT_OBJECT_REFERENCES_CHANGED 0xC803 + +// Storage Type +#define MTP_STORAGE_FIXED_ROM 0x0001 +#define MTP_STORAGE_REMOVABLE_ROM 0x0002 +#define MTP_STORAGE_FIXED_RAM 0x0003 +#define MTP_STORAGE_REMOVABLE_RAM 0x0004 + +// Storage File System +#define MTP_STORAGE_FILESYSTEM_FLAT 0x0001 +#define MTP_STORAGE_FILESYSTEM_HIERARCHICAL 0x0002 +#define MTP_STORAGE_FILESYSTEM_DCF 0x0003 + +// Storage Access Capability +#define MTP_STORAGE_READ_WRITE 0x0000 +#define MTP_STORAGE_READ_ONLY_WITHOUT_DELETE 0x0001 +#define MTP_STORAGE_READ_ONLY_WITH_DELETE 0x0002 + +// Association Type +#define MTP_ASSOCIATION_TYPE_UNDEFINED 0x0000 +#define MTP_ASSOCIATION_TYPE_GENERIC_FOLDER 0x0001 + +// MTP class reqeusts +#define MTP_REQUEST_CANCEL 0x64 +#define MTP_REQUEST_GET_EXT_EVENT_DATA 0x65 +#define MTP_REQUEST_RESET 0x66 +#define MTP_REQUEST_GET_DEVICE_STATUS 0x67 +// clang-format on + +#define USB_MTP_CLASS 0x06 + +#define USB_MTP_SUB_CLASS 0x01U +#define USB_MTP_PROTOCOL 0x01U + +struct mtp_header { + uint32_t conlen; + uint16_t contype; + uint16_t code; + uint32_t trans_id; + uint32_t param[]; +}; + +struct mtp_string { + uint8_t len; + uint16_t string[255]; +}; + +struct mtp_device_info { + uint16_t StandardVersion; + uint32_t VendorExtensionID; + uint16_t VendorExtensionVersion; + uint8_t VendorExtensionDesc_len; + uint16_t VendorExtensionDesc[255]; + uint16_t FunctionalMode; + uint32_t OperationsSupported_len; + uint16_t OperationsSupported[255]; + uint32_t EventsSupported_len; + uint16_t EventsSupported[255]; + uint32_t DevicePropertiesSupported_len; + uint16_t DevicePropertiesSupported[255]; + uint32_t CaptureFormats_len; + uint16_t CaptureFormats[255]; + uint32_t ImageFormats_len; + uint16_t ImageFormats[255]; + uint8_t Manufacturer_len; + uint16_t Manufacturer[255]; + uint8_t Model_len; + uint16_t Model[255]; + uint8_t DeviceVersion_len; + uint16_t DeviceVersion[255]; + uint8_t SerialNumber_len; + uint16_t SerialNumber[255]; +} __PACKED; + +struct mtp_object_props_support { + uint32_t ObjectPropCode_len; + uint16_t ObjectPropCode[255]; +} __PACKED; + +struct mtp_device_prop_desc { + uint16_t DevicePropertyCode; + uint16_t DataType; + uint8_t GetSet; + uint16_t DefaultValue[1]; + uint16_t CurrentValue[1]; + uint8_t FormFlag; +} __PACKED; + +struct mtp_storage_id { + uint32_t StorageIDS_len; + uint32_t StorageIDS[255]; +} __PACKED; + +struct mtp_storage_info { + uint16_t StorageType; + uint16_t FilesystemType; + uint16_t AccessCapability; + uint64_t MaxCapability; + uint64_t FreeSpaceInBytes; + uint32_t FreeSpaceInObjects; + uint8_t StorageDescription_len; + uint8_t StorageDescription[255]; + uint8_t VolumeIdentifier_len; + uint8_t VolumeIdentifier[255]; +} __PACKED; + +struct mtp_object_handles { + uint32_t ObjectHandle_len; + uint32_t ObjectHandle[255]; +} __PACKED; + +struct mtp_object_prop_desc { + uint16_t ObjectPropertyCode; + uint16_t DataType; + uint8_t GetSet; + uint8_t DefValue[16]; + uint32_t GroupCode; + uint8_t FormFlag; +} __PACKED; + +struct mtp_object_prop_element { + uint32_t ObjectHandle; + uint16_t PropertyCode; + uint16_t Datatype; + uint8_t value[8]; +} __PACKED; + +struct mtp_object_prop_list { + uint32_t element_len; + struct mtp_object_prop_element element[1]; +} __PACKED; + +struct mtp_object_info { + uint32_t StorageId; + uint16_t ObjectFormat; + uint16_t ProtectionStatus; + uint32_t ObjectCompressedSize; + uint16_t ThumbFormat; + uint32_t ThumbCompressedSize; + uint32_t ThumbPixWidth; + uint32_t ThumbPixHeight; + uint32_t ImagePixWidth; + uint32_t ImagePixHeight; + uint32_t ImageBitDepth; + uint32_t ParentObject; + uint16_t AssociationType; + uint32_t AssociationDesc; + uint32_t SequenceNumber; + uint8_t Filename_len; + uint16_t Filename[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + uint8_t CaptureDate[6]; + uint8_t ModificationDate[6]; +} __PACKED; + +struct mtp_object { + uint32_t storage_id; + uint32_t handle; + uint32_t parent_handle; + uint16_t format; + bool is_dir; + bool is_readonly; + bool is_hidden; + uint32_t file_size; + uint32_t file_full_name_length; + char file_full_name[CONFIG_USBDEV_MTP_MAX_PATHNAME]; + bool in_use; +}; + +/*Length of template descriptor: 30 bytes*/ +#define MTP_DESCRIPTOR_LEN (9 + 7 + 7 + 7) + +// clang-format off +#define MTP_DESCRIPTOR_INIT(bFirstInterface, out_ep, in_ep, int_ep, wMaxPacketSize, str_idx) \ + /* Interface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bFirstInterface, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x03, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_IMAGE, /* bInterfaceClass */ \ + USB_MTP_SUB_CLASS, /* bInterfaceSubClass */ \ + USB_MTP_PROTOCOL, /* bInterfaceProtocol */ \ + str_idx, /* iInterface */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + out_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + in_ep, /* bEndpointAddress */ \ + 0x02, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + 0x00, /* bInterval */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + int_ep, /* bEndpointAddress */ \ + 0x03, /* bmAttributes */ \ + WBVAL(0x1c), /* wMaxPacketSize */ \ + 0x06 /* bInterval */ +// clang-format on + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/class/mtp/usbd_mtp.h b/src/lib/CherryUSB/class/mtp/usbd_mtp.h new file mode 100644 index 000000000..316bad3c4 --- /dev/null +++ b/src/lib/CherryUSB/class/mtp/usbd_mtp.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_MTP_H +#define USBD_MTP_H + +#include "usb_mtp.h" +#include +#include + +/* gcc toolchain does not implement dirent.h, so we define our own MTP_DIR and mtp_dirent */ + +typedef void MTP_DIR; + +struct mtp_statfs { + size_t f_bsize; /* block size */ + size_t f_blocks; /* total data blocks in file system */ + size_t f_bfree; /* free blocks in file system */ +}; + +struct mtp_dirent { + uint8_t d_type; /* The type of the file */ + uint8_t d_namlen; /* The length of the not including the terminating null file name */ + uint16_t d_reclen; /* length of this record */ + char d_name[CONFIG_USBDEV_MTP_MAX_PATHNAME]; /* The null-terminated file name */ +}; + +#ifdef __cplusplus +extern "C" { +#endif + +struct usbd_interface *usbd_mtp_init_intf(struct usbd_interface *intf, + const uint8_t out_ep, + const uint8_t in_ep, + const uint8_t int_ep); + +int usbd_mtp_notify_object_add(const char *path); +int usbd_mtp_notify_object_remove(const char *path); + +const char *usbd_mtp_fs_root_path(void); +const char *usbd_mtp_fs_description(void); + +int usbd_mtp_mkdir(const char *path); +int usbd_mtp_rmdir(const char *path); +MTP_DIR *usbd_mtp_opendir(const char *name); +int usbd_mtp_closedir(MTP_DIR *d); +struct mtp_dirent *usbd_mtp_readdir(MTP_DIR *d); + +int usbd_mtp_statfs(const char *path, struct mtp_statfs *buf); +int usbd_mtp_stat(const char *file, struct stat *buf); + +int usbd_mtp_open(const char *path, int flags, int mode); +int usbd_mtp_close(int fd); +int usbd_mtp_read(int fd, void *buf, size_t len); +int usbd_mtp_write(int fd, const void *buf, size_t len); + +int usbd_mtp_unlink(const char *path); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_MTP_H */ diff --git a/src/lib/CherryUSB/class/mtp/usbd_mtp_support.h b/src/lib/CherryUSB/class/mtp/usbd_mtp_support.h new file mode 100644 index 000000000..9281ec398 --- /dev/null +++ b/src/lib/CherryUSB/class/mtp/usbd_mtp_support.h @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_MTP_SUPPORT_H +#define USBD_MTP_SUPPORT_H + +#define MTP_VERSION 100 + +typedef struct _profile_property { + uint16_t prop_code; + uint16_t data_type; + uint8_t getset; + uint64_t default_value; + uint32_t group_code; + uint8_t form_flag; + uint16_t format_code; +} profile_property; + +typedef struct _format_property { + uint16_t format_code; + uint16_t *properties; +} formats_property; + +const char mtp_extension_string[] = "microsoft.com: 1.0; android.com: 1.0;"; + +const uint16_t supported_op[] = { + MTP_OPERATION_GET_DEVICE_INFO, //0x1001 + MTP_OPERATION_OPEN_SESSION, //0x1002 + MTP_OPERATION_CLOSE_SESSION, //0x1003 + MTP_OPERATION_GET_STORAGE_IDS, //0x1004 + MTP_OPERATION_GET_STORAGE_INFO, //0x1005 + //MTP_OPERATION_GET_NUM_OBJECTS ,//0x1006 + MTP_OPERATION_GET_OBJECT_HANDLES, //0x1007 + MTP_OPERATION_GET_OBJECT_INFO, //0x1008 + MTP_OPERATION_GET_OBJECT, //0x1009 + //MTP_OPERATION_GET_THUMB ,//0x100A + MTP_OPERATION_DELETE_OBJECT, //0x100B + MTP_OPERATION_SEND_OBJECT_INFO, //0x100C + MTP_OPERATION_SEND_OBJECT, //0x100D + MTP_OPERATION_GET_DEVICE_PROP_DESC, //0x1014 + // MTP_OPERATION_GET_DEVICE_PROP_VALUE ,//0x1015 + // MTP_OPERATION_SET_DEVICE_PROP_VALUE ,//0x1016 + //MTP_OPERATION_RESET_DEVICE_PROP_VALUE ,//0x1017 + // MTP_OPERATION_GET_PARTIAL_OBJECT ,//0x101B + MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED, //0x9801 + // MTP_OPERATION_GET_OBJECT_PROP_DESC, //0x9802 + // MTP_OPERATION_GET_OBJECT_PROP_VALUE ,//0x9803 + // MTP_OPERATION_SET_OBJECT_PROP_VALUE ,//0x9804 + // MTP_OPERATION_GET_OBJECT_PROP_LIST ,//0x9805 + //MTP_OPERATION_GET_OBJECT_REFERENCES ,//0x9810 + //MTP_OPERATION_SET_OBJECT_REFERENCES ,//0x9811 + // MTP_OPERATION_GET_PARTIAL_OBJECT_64 ,//0x95C1 + // MTP_OPERATION_SEND_PARTIAL_OBJECT ,//0x95C2 + // MTP_OPERATION_TRUNCATE_OBJECT ,//0x95C3 + // MTP_OPERATION_BEGIN_EDIT_OBJECT ,//0x95C4 + // MTP_OPERATION_END_EDIT_OBJECT //0x95C5 +}; + +int supported_op_size = sizeof(supported_op); + +const uint16_t supported_event[] = { + MTP_EVENT_OBJECT_ADDED, // 0x4002 + MTP_EVENT_OBJECT_REMOVED, // 0x4003 + MTP_EVENT_STORE_ADDED, // 0x4004 + MTP_EVENT_STORE_REMOVED, // 0x4005 + MTP_EVENT_STORAGE_INFO_CHANGED, // 0x400C + MTP_EVENT_OBJECT_INFO_CHANGED, // 0x4007 + MTP_EVENT_DEVICE_PROP_CHANGED, // 0x4006 + MTP_EVENT_OBJECT_PROP_CHANGED // 0xC801 +}; + +int supported_event_size = sizeof(supported_event); + +const formats_property support_format_properties[] = { + // format code prop code + { MTP_FORMAT_UNDEFINED, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF } }, + { MTP_FORMAT_ASSOCIATION, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF } } +#if 0 + { MTP_FORMAT_TEXT , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_HTML , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_MP4_CONTAINER, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_3GP_CONTAINER, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_WAV , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED,MTP_PROPERTY_ARTIST,MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, + MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, MTP_PROPERTY_NUMBER_OF_CHANNELS,MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_MP3 , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED,MTP_PROPERTY_ARTIST,MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, + MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, MTP_PROPERTY_NUMBER_OF_CHANNELS,MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_MPEG , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_EXIF_JPEG , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, + MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_BMP , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, + MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_GIF , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, + MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_JFIF , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, + MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_WMA , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, + MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, + MTP_PROPERTY_NUMBER_OF_CHANNELS, MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_OGG , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, + MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, + MTP_PROPERTY_NUMBER_OF_CHANNELS, MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_AAC , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_ALBUM_ARTIST, MTP_PROPERTY_TRACK, MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, + MTP_PROPERTY_GENRE, MTP_PROPERTY_COMPOSER, MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_PROPERTY_BITRATE_TYPE, MTP_PROPERTY_AUDIO_BITRATE, + MTP_PROPERTY_NUMBER_OF_CHANNELS, MTP_PROPERTY_SAMPLE_RATE, + 0xFFFF} + }, + { MTP_FORMAT_ABSTRACT_AV_PLAYLIST, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_WPL_PLAYLIST, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_M3U_PLAYLIST, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_PLS_PLAYLIST, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_XML_DOCUMENT, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_FLAC , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_AVI , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_ASF , (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, MTP_PROPERTY_ARTIST, MTP_PROPERTY_ALBUM_NAME, + MTP_PROPERTY_DURATION, MTP_PROPERTY_DESCRIPTION, MTP_PROPERTY_WIDTH, MTP_PROPERTY_HEIGHT, MTP_PROPERTY_DATE_AUTHORED, + 0xFFFF} + }, + { MTP_FORMAT_MS_WORD_DOCUMENT, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_MS_EXCEL_SPREADSHEET, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + }, + { MTP_FORMAT_MS_POWERPOINT_PRESENTATION, (uint16_t[]){ MTP_PROPERTY_STORAGE_ID, MTP_PROPERTY_OBJECT_FORMAT, MTP_PROPERTY_PROTECTION_STATUS, MTP_PROPERTY_OBJECT_SIZE, + MTP_PROPERTY_OBJECT_FILE_NAME, MTP_PROPERTY_DATE_MODIFIED, MTP_PROPERTY_PARENT_OBJECT, MTP_PROPERTY_PERSISTENT_UID, + MTP_PROPERTY_NAME, MTP_PROPERTY_DISPLAY_NAME, MTP_PROPERTY_DATE_CREATED, + 0xFFFF} + } +#endif + , + + { 0xFFFF, (uint16_t[]){ 0xFFFF } } + +}; + +const profile_property support_object_properties[] = { + // prop_code data_type getset default_value group_code form_flag format_code + { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000001, 0x00, 0xFFFF }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_UNDEFINED, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_ASSOCIATION, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_TEXT, 0x000000000, 0x00, MTP_FORMAT_TEXT }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_HTML, 0x000000000, 0x00, MTP_FORMAT_HTML }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_WAV, 0x000000000, 0x00, MTP_FORMAT_WAV }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MP3, 0x000000000, 0x00, MTP_FORMAT_MP3 }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MPEG, 0x000000000, 0x00, MTP_FORMAT_MPEG }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_EXIF_JPEG, 0x000000000, 0x00, MTP_FORMAT_EXIF_JPEG }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_BMP, 0x000000000, 0x00, MTP_FORMAT_BMP }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_AIFF, 0x000000000, 0x00, MTP_FORMAT_AIFF }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MPEG, 0x000000000, 0x00, MTP_FORMAT_MPEG }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_WMA, 0x000000000, 0x00, MTP_FORMAT_WMA }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_OGG, 0x000000000, 0x00, MTP_FORMAT_OGG }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_AAC, 0x000000000, 0x00, MTP_FORMAT_AAC }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MP4_CONTAINER, 0x000000000, 0x00, MTP_FORMAT_MP4_CONTAINER }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_3GP_CONTAINER, 0x000000000, 0x00, MTP_FORMAT_3GP_CONTAINER }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_ABSTRACT_AV_PLAYLIST, 0x000000000, 0x00, MTP_FORMAT_ABSTRACT_AV_PLAYLIST }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_WPL_PLAYLIST, 0x000000000, 0x00, MTP_FORMAT_WPL_PLAYLIST }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_M3U_PLAYLIST, 0x000000000, 0x00, MTP_FORMAT_M3U_PLAYLIST }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_PLS_PLAYLIST, 0x000000000, 0x00, MTP_FORMAT_PLS_PLAYLIST }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_XML_DOCUMENT, 0x000000000, 0x00, MTP_FORMAT_XML_DOCUMENT }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_FLAC, 0x000000000, 0x00, MTP_FORMAT_FLAC }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_AVI, 0x000000000, 0x00, MTP_FORMAT_AVI }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_ASF, 0x000000000, 0x00, MTP_FORMAT_ASF }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MS_WORD_DOCUMENT, 0x000000000, 0x00, MTP_FORMAT_MS_WORD_DOCUMENT }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MS_EXCEL_SPREADSHEET, 0x000000000, 0x00, MTP_FORMAT_MS_EXCEL_SPREADSHEET }, + { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16, 0x00, MTP_FORMAT_MS_POWERPOINT_PRESENTATION, 0x000000000, 0x00, MTP_FORMAT_MS_POWERPOINT_PRESENTATION }, + + { MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64, 0x00, 0x0000000000000000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_PROTECTION_STATUS, MTP_TYPE_UINT16, 0x00, 0x0000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_DISPLAY_NAME, MTP_TYPE_STR, 0x00, 0x0000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR, 0x01, 0x0000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_DATE_CREATED, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_DATE_MODIFIED, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_PERSISTENT_UID, MTP_TYPE_UINT128, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + { MTP_PROPERTY_NAME, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_ASSOCIATION }, + + { MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64, 0x00, 0x0000000000000000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_PROTECTION_STATUS, MTP_TYPE_UINT16, 0x00, 0x0000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_DISPLAY_NAME, MTP_TYPE_STR, 0x00, 0x0000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR, 0x01, 0x0000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_DATE_CREATED, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_DATE_MODIFIED, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_PERSISTENT_UID, MTP_TYPE_UINT128, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + { MTP_PROPERTY_NAME, MTP_TYPE_STR, 0x00, 0x00, 0x000000000, 0x00, MTP_FORMAT_UNDEFINED }, + + //{MTP_PROPERTY_ASSOCIATION_TYPE, MTP_TYPE_UINT16, 0x00, 0x0001 , 0x000000000 , 0x00 , 0xFFFF }, + { MTP_PROPERTY_ASSOCIATION_DESC, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00, 0xFFFF }, + { MTP_PROPERTY_PROTECTION_STATUS, MTP_TYPE_UINT16, 0x00, 0x0000, 0x000000000, 0x00, 0xFFFF }, + { MTP_PROPERTY_HIDDEN, MTP_TYPE_UINT16, 0x00, 0x0000, 0x000000000, 0x00, 0xFFFF }, + + { 0xFFFF, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00 } +}; + +const profile_property support_device_properties[] = { + // prop_code data_type getset default_value group_code form_flag + //{MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER, MTP_TYPE_UINT32, 0x00, 0x00000000 , 0x000000000 , 0x00 }, + //{MTP_DEVICE_PROPERTY_IMAGE_SIZE, MTP_TYPE_UINT32, 0x00, 0x00000000 , 0x000000000 , 0x00 }, + { MTP_DEVICE_PROPERTY_BATTERY_LEVEL, MTP_TYPE_UINT16, 0x00, 0x00000000, 0x000000000, 0x00 }, + { MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME, MTP_TYPE_STR, 0x00, 0x00000000, 0x000000000, 0x00 }, + + { 0xFFFF, MTP_TYPE_UINT32, 0x00, 0x00000000, 0x000000000, 0x00 } +}; + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/class/template/usb_xxx.h b/src/lib/CherryUSB/class/template/usb_xxx.h new file mode 100644 index 000000000..d883c8b2e --- /dev/null +++ b/src/lib/CherryUSB/class/template/usb_xxx.h @@ -0,0 +1,4 @@ +#ifndef _USB_XXX_H +#define _USB_XXX_H + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/class/template/usbd_xxx.c b/src/lib/CherryUSB/class/template/usbd_xxx.c new file mode 100644 index 000000000..aa4bc01bc --- /dev/null +++ b/src/lib/CherryUSB/class/template/usbd_xxx.c @@ -0,0 +1,39 @@ +#include "usbd_core.h" +#include "usbd_xxx.h" + +static int xxx_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USB_LOG_WRN("XXX Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + switch (setup->bRequest) { + default: + USB_LOG_WRN("Unhandled XXX Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + return 0; +} + +static void xxx_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + switch (event) { + case USBD_EVENT_RESET: + + break; + + default: + break; + } +} + +struct usbd_interface *usbd_xxx_init_intf(uint8_t busid, struct usbd_interface *intf) +{ + intf->class_interface_handler = xxx_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = xxx_notify_handler; + + return intf; +} diff --git a/src/lib/CherryUSB/class/template/usbd_xxx.h b/src/lib/CherryUSB/class/template/usbd_xxx.h new file mode 100644 index 000000000..8230c3021 --- /dev/null +++ b/src/lib/CherryUSB/class/template/usbd_xxx.h @@ -0,0 +1,16 @@ +#ifndef _USBD_XXX_H_ +#define _USBD_XXX_H_ + +#include "usb_xxx.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct usbd_interface *usbd_xxx_init_intf(uint8_t busid, struct usbd_interface *intf); + +#ifdef __cplusplus +} +#endif + +#endif /* _USBD_XXX_H_ */ diff --git a/src/lib/CherryUSB/class/template/usbh_xxx.c b/src/lib/CherryUSB/class/template/usbh_xxx.c new file mode 100644 index 000000000..4456b3c4a --- /dev/null +++ b/src/lib/CherryUSB/class/template/usbh_xxx.c @@ -0,0 +1,97 @@ +#include "usbh_core.h" +#include "usbh_xxx.h" + +#define DEV_FORMAT "/dev/xxx" + +#define CONFIG_USBHOST_MAX_CUSTOM_CLASS 1 +static struct usbh_xxx g_xxx_class[CONFIG_USBHOST_MAX_CUSTOM_CLASS]; +static uint32_t g_devinuse = 0; + +static struct usbh_xxx *usbh_xxx_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_CUSTOM_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_xxx_class[devno], 0, sizeof(struct usbh_xxx)); + g_xxx_class[devno].minor = devno; + return &g_xxx_class[devno]; + } + } + return NULL; +} + +static void usbh_xxx_class_free(struct usbh_xxx *xxx_class) +{ + uint8_t devno = xxx_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(xxx_class, 0, sizeof(struct usbh_xxx)); +} + +static int usbh_xxx_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret; + + struct usbh_xxx *xxx_class = usbh_xxx_class_alloc(); + if (xxx_class == NULL) { + USB_LOG_ERR("Fail to alloc xxx_class\r\n"); + return -USB_ERR_NOMEM; + } + + return ret; +} + + +static int usbh_xxx_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_xxx *xxx_class = (struct usbh_xxx *)hport->config.intf[intf].priv; + + if (xxx_class) { + if (xxx_class->xxxin) { + usbh_kill_urb(&xxx_class->xxxin_urb); + } + + if (xxx_class->xxxout) { + usbh_kill_urb(&xxx_class->xxxout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + USB_LOG_INFO("Unregister xxx Class:%s\r\n", hport->config.intf[intf].devname); + usbh_xxx_stop(xxx_class); + } + + usbh_xxx_class_free(xxx_class); + } + + return ret; +} + +__WEAK void usbh_xxx_run(struct usbh_xxx *xxx_class) +{ +} + +__WEAK void usbh_xxx_stop(struct usbh_xxx *xxx_class) +{ +} + +static const struct usbh_class_driver xxx_class_driver = { + .driver_name = "xxx", + .connect = usbh_xxx_connect, + .disconnect = usbh_xxx_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info xxx_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = 0, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .id_table = NULL, + .class_driver = &xxx_class_driver +}; diff --git a/src/lib/CherryUSB/class/template/usbh_xxx.h b/src/lib/CherryUSB/class/template/usbh_xxx.h new file mode 100644 index 000000000..0858f51d7 --- /dev/null +++ b/src/lib/CherryUSB/class/template/usbh_xxx.h @@ -0,0 +1,22 @@ +#ifndef _USBH_XXX_H +#define _USBH_XXX_H + +#include "usb_xxx.h" + +struct usbh_xxx { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *xxxin; + struct usb_endpoint_descriptor *xxxout; + struct usbh_urb xxxin_urb; + struct usbh_urb xxxout_urb; + + uint8_t intf; /* interface number */ + uint8_t minor; + + void *user_data; +}; + +void usbh_xxx_run(struct usbh_xxx *xxx_class); +void usbh_xxx_stop(struct usbh_xxx *xxx_class); + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/class/vendor/net/usbh_asix.c b/src/lib/CherryUSB/class/vendor/net/usbh_asix.c new file mode 100644 index 000000000..981c50679 --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/net/usbh_asix.c @@ -0,0 +1,827 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_asix.h" +#include "usb_cdc.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "asix" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/asix" + +static struct usbh_asix g_asix_class; + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_asix_rx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_asix_tx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_asix_inttx_buffer[USB_ALIGN_UP(16, CONFIG_USB_ALIGN_SIZE)]; + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_asix_buf[USB_ALIGN_UP(32, CONFIG_USB_ALIGN_SIZE)]; + +#define ETH_ALEN 6 + +#define PHY_MODE_MARVELL 0x0000 +#define MII_MARVELL_LED_CTRL 0x0018 +#define MII_MARVELL_STATUS 0x001b +#define MII_MARVELL_CTRL 0x0014 + +#define MARVELL_LED_MANUAL 0x0019 + +#define MARVELL_STATUS_HWCFG 0x0004 + +#define MARVELL_CTRL_TXDELAY 0x0002 +#define MARVELL_CTRL_RXDELAY 0x0080 + +#define PHY_MODE_RTL8211CL 0x000C + +#define AX88772A_PHY14H 0x14 +#define AX88772A_PHY14H_DEFAULT 0x442C + +#define AX88772A_PHY15H 0x15 +#define AX88772A_PHY15H_DEFAULT 0x03C8 + +#define AX88772A_PHY16H 0x16 +#define AX88772A_PHY16H_DEFAULT 0x4044 + +#define SPEED_100 0 +#define SPEED_10 1 + +static int usbh_asix_read_cmd(struct usbh_asix *asix_class, + uint8_t cmd, + uint16_t value, + uint16_t index, + void *data, + uint16_t size) +{ + struct usb_setup_packet *setup; + int ret; + + if (!asix_class || !asix_class->hport) { + return -USB_ERR_INVAL; + } + setup = asix_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = cmd; + setup->wValue = value; + setup->wIndex = index; + setup->wLength = size; + + ret = usbh_control_transfer(asix_class->hport, setup, g_asix_buf); + if (ret < 8) { + return ret; + } + memcpy(data, g_asix_buf, MIN(ret - 8, size)); + + return ret; +} + +static int usbh_asix_write_cmd(struct usbh_asix *asix_class, + uint8_t cmd, + uint16_t value, + uint16_t index, + void *data, + uint16_t size) +{ + struct usb_setup_packet *setup; + + if (!asix_class || !asix_class->hport) { + return -USB_ERR_INVAL; + } + setup = asix_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = cmd; + setup->wValue = value; + setup->wIndex = index; + setup->wLength = size; + + if (data && size) { + memcpy(g_asix_buf, data, size); + return usbh_control_transfer(asix_class->hport, setup, g_asix_buf); + } else { + return usbh_control_transfer(asix_class->hport, setup, NULL); + } +} + +static int usbh_asix_mdio_write(struct usbh_asix *asix_class, int phy_id, int loc, int val) +{ + uint8_t smsr; + uint16_t res = (uint16_t)val; + int ret; + + for (uint8_t i = 0; i < 10; i++) { + ret = usbh_asix_write_cmd(asix_class, AX_CMD_SET_SW_MII, 0, 0, NULL, 0); + if (ret < 0) { + return ret; + } + usb_osal_msleep(1); + ret = usbh_asix_read_cmd(asix_class, AX_CMD_STATMNGSTS_REG, 0, 0, &smsr, 1); + if (ret < 0) { + return ret; + } + + if (smsr & AX_HOST_EN) { + break; + } + } + + ret = usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_MII_REG, phy_id, loc, &res, 2); + if (ret < 0) { + return ret; + } + + ret = usbh_asix_write_cmd(asix_class, AX_CMD_SET_HW_MII, 0, 0, NULL, 0); + if (ret < 0) { + return ret; + } + return 0; +} + +static int usbh_asix_mdio_read(struct usbh_asix *asix_class, int phy_id, int loc) +{ + uint8_t smsr; + uint16_t res; + int ret; + + for (uint8_t i = 0; i < 10; i++) { + ret = usbh_asix_write_cmd(asix_class, AX_CMD_SET_SW_MII, 0, 0, NULL, 0); + if (ret < 0) { + return ret; + } + usb_osal_msleep(1); + ret = usbh_asix_read_cmd(asix_class, AX_CMD_STATMNGSTS_REG, 0, 0, &smsr, 1); + if (ret < 0) { + return ret; + } + + if (smsr & AX_HOST_EN) { + break; + } + } + + ret = usbh_asix_read_cmd(asix_class, AX_CMD_READ_MII_REG, phy_id, loc, &res, 2); + if (ret < 0) { + return ret; + } + + ret = usbh_asix_write_cmd(asix_class, AX_CMD_SET_HW_MII, 0, 0, NULL, 0); + if (ret < 0) { + return ret; + } + return res; +} + +static int usbh_asix_read_phy_addr(struct usbh_asix *asix_class, bool internal) +{ + int ret, offset; + uint8_t buf[2]; + + ret = usbh_asix_read_cmd(asix_class, AX_CMD_READ_PHY_ID, 0, 0, buf, 2); + if (ret < 0) { + return ret; + } + + offset = (internal ? 1 : 0); + ret = buf[offset]; + + USB_LOG_INFO("%s PHY address 0x%x\r\n", internal ? "internal" : "external", ret); + + return ret; +} + +static int usbh_asix_sw_reset(struct usbh_asix *asix_class, uint8_t flags) +{ + int ret; + + ret = usbh_asix_write_cmd(asix_class, AX_CMD_SW_RESET, flags, 0, NULL, 0); + if (ret < 0) + USB_LOG_ERR("Failed to send software reset: %d\r\n", ret); + + return ret; +} + +static uint16_t usbh_asix_read_rx_ctl(struct usbh_asix *asix_class) +{ + uint16_t v; + int ret = usbh_asix_read_cmd(asix_class, AX_CMD_READ_RX_CTL, 0, 0, &v, 2); + if (ret < 0) { + return ret; + } + return v; +} + +static int usbh_asix_write_rx_ctl(struct usbh_asix *asix_class, uint16_t mode) +{ + int ret; + + USB_LOG_DBG("asix_write_rx_ctl() - mode = 0x%04x\r\n", mode); + ret = usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_RX_CTL, mode, 0, NULL, 0); + if (ret < 0) + USB_LOG_ERR("Failed to write RX_CTL mode to 0x%04x: %02x\r\n", + mode, ret); + + return ret; +} + +static uint16_t usbh_asix_read_medium_status(struct usbh_asix *asix_class) +{ + uint16_t v; + int ret = usbh_asix_read_cmd(asix_class, AX_CMD_READ_MEDIUM_STATUS, 0, 0, &v, 2); + + if (ret < 0) { + USB_LOG_ERR("Error reading Medium Status register: %02x\r\n", + ret); + return ret; /* TODO: callers not checking for error ret */ + } + + return v; +} + +static int usbh_asix_write_medium_mode(struct usbh_asix *asix_class, uint16_t mode) +{ + int ret; + + USB_LOG_DBG("asix_write_medium_mode() - mode = 0x%04x\r\n", mode); + ret = usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, NULL, 0); + if (ret < 0) + USB_LOG_ERR("Failed to write Medium Mode mode to 0x%04x: %02x\r\n", + mode, ret); + + return ret; +} + +static int usbh_asix_write_gpio(struct usbh_asix *asix_class, uint16_t value, int sleep) +{ + int ret; + + USB_LOG_DBG("asix_write_gpio() - value = 0x%04x\r\n", value); + ret = usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_GPIOS, value, 0, NULL, 0); + if (ret < 0) + USB_LOG_ERR("Failed to write GPIO value 0x%04x: %d\r\n", + value, ret); + + if (sleep) + usb_osal_msleep(sleep); + + return ret; +} + +/* + * AX88772 & AX88178 have a 16-bit RX_CTL value + */ +static void usbh_asix_set_multicast(struct usbh_asix *asix_class) +{ + uint16_t rx_ctl = AX_DEFAULT_RX_CTL | AX_RX_CTL_AM; +#if CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE == 4096 + rx_ctl |= AX_RX_CTL_MFB_4096; +#elif CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE == 8192 + rx_ctl |= AX_RX_CTL_MFB_8192; +#elif CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE == 16384 + rx_ctl |= AX_RX_CTL_MFB_16384; +#else + rx_ctl |= AX_RX_CTL_MFB_2048; +#endif + const uint8_t multi_filter[] = { 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x40 }; + + usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_MULTI_FILTER, 0, 0, (uint8_t *)multi_filter, AX_MCAST_FILTER_SIZE); + usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, NULL, 0); +} + +static int usbh_ax88772_hw_reset(struct usbh_asix *asix_class) +{ + uint16_t rx_ctl; + int ret; + + ret = usbh_asix_write_gpio(asix_class, AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5); + if (ret < 0) + goto out; + + ret = usbh_asix_write_cmd(asix_class, AX_CMD_SW_PHY_SELECT, asix_class->embd_phy, + 0, NULL, 0); + if (ret < 0) { + USB_LOG_ERR("Select PHY #1 failed: %d\r\n", ret); + goto out; + } + + if (asix_class->embd_phy) { + ret = usbh_asix_sw_reset(asix_class, AX_SWRESET_IPPD); + if (ret < 0) + goto out; + + usb_osal_msleep(10); + + ret = usbh_asix_sw_reset(asix_class, AX_SWRESET_CLEAR); + if (ret < 0) + goto out; + + usb_osal_msleep(60); + + ret = usbh_asix_sw_reset(asix_class, AX_SWRESET_IPRL | AX_SWRESET_PRL); + if (ret < 0) + goto out; + } else { + ret = usbh_asix_sw_reset(asix_class, AX_SWRESET_IPPD | AX_SWRESET_PRL); + if (ret < 0) + goto out; + } + + usb_osal_msleep(150); + + ret = usbh_asix_write_rx_ctl(asix_class, AX_DEFAULT_RX_CTL); + if (ret < 0) + goto out; + + ret = usbh_asix_write_medium_mode(asix_class, AX88772_MEDIUM_DEFAULT); + if (ret < 0) + goto out; + + ret = usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_IPG0, + AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT, + AX88772_IPG2_DEFAULT, NULL, 0); + if (ret < 0) { + USB_LOG_ERR("Write IPG,IPG1,IPG2 failed: %d\r\n", ret); + goto out; + } + + /* Rewrite MAC address */ + ret = usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_NODE_ID, 0, 0, asix_class->mac, ETH_ALEN); + if (ret < 0) + goto out; + + /* Set RX_CTL to default values with 2k buffer, and enable cactus */ + ret = usbh_asix_write_rx_ctl(asix_class, AX_DEFAULT_RX_CTL); + if (ret < 0) + goto out; + + rx_ctl = usbh_asix_read_rx_ctl(asix_class); + USB_LOG_INFO("RX_CTL is 0x%04x after all initializations\r\n", + rx_ctl); + + rx_ctl = usbh_asix_read_medium_status(asix_class); + USB_LOG_INFO("Medium Status is 0x%04x after all initializations\r\n", + rx_ctl); + + return 0; + +out: + return ret; +} + +static int usbh_ax88772a_hw_reset(struct usbh_asix *asix_class) +{ + uint16_t rx_ctl, phy14h, phy15h, phy16h; + int ret; + + ret = usbh_asix_write_gpio(asix_class, AX_GPIO_RSE, 5); + if (ret < 0) + goto out; + + ret = usbh_asix_write_cmd(asix_class, AX_CMD_SW_PHY_SELECT, asix_class->embd_phy | AX_PHYSEL_SSEN, 0, NULL, 0); + if (ret < 0) { + USB_LOG_ERR("Select PHY #1 failed: %d\r\n", ret); + goto out; + } + usb_osal_msleep(10); + + ret = usbh_asix_sw_reset(asix_class, AX_SWRESET_IPPD | AX_SWRESET_IPRL); + if (ret < 0) + goto out; + + usb_osal_msleep(10); + + ret = usbh_asix_sw_reset(asix_class, AX_SWRESET_IPRL); + if (ret < 0) + goto out; + + usb_osal_msleep(160); + + ret = usbh_asix_sw_reset(asix_class, AX_SWRESET_CLEAR); + if (ret < 0) + goto out; + + ret = usbh_asix_sw_reset(asix_class, AX_SWRESET_IPRL); + if (ret < 0) + goto out; + + usb_osal_msleep(200); + + if (asix_class->chipcode == AX_AX88772B_CHIPCODE) { + ret = usbh_asix_write_cmd(asix_class, AX_QCTCTRL, 0x8000, 0x8001, NULL, 0); + if (ret < 0) { + USB_LOG_ERR("Write BQ setting failed: %d\r\n", ret); + goto out; + } + } else if (asix_class->chipcode == AX_AX88772A_CHIPCODE) { + /* Check if the PHY registers have default settings */ + phy14h = usbh_asix_mdio_read(asix_class, asix_class->phy_addr, + AX88772A_PHY14H); + phy15h = usbh_asix_mdio_read(asix_class, asix_class->phy_addr, + AX88772A_PHY15H); + phy16h = usbh_asix_mdio_read(asix_class, asix_class->phy_addr, + AX88772A_PHY16H); + + USB_LOG_DBG("772a_hw_reset: MR20=0x%x MR21=0x%x MR22=0x%x\r\n", + phy14h, phy15h, phy16h); + + /* Restore PHY registers default setting if not */ + if (phy14h != AX88772A_PHY14H_DEFAULT) + usbh_asix_mdio_write(asix_class, asix_class->phy_addr, + AX88772A_PHY14H, + AX88772A_PHY14H_DEFAULT); + if (phy15h != AX88772A_PHY15H_DEFAULT) + usbh_asix_mdio_write(asix_class, asix_class->phy_addr, + AX88772A_PHY15H, + AX88772A_PHY15H_DEFAULT); + if (phy16h != AX88772A_PHY16H_DEFAULT) + usbh_asix_mdio_write(asix_class, asix_class->phy_addr, + AX88772A_PHY16H, + AX88772A_PHY16H_DEFAULT); + } + + ret = usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_IPG0, + AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT, + AX88772_IPG2_DEFAULT, NULL, 0); + if (ret < 0) { + USB_LOG_ERR("Write IPG,IPG1,IPG2 failed: %d\r\n", ret); + goto out; + } + + /* Rewrite MAC address */ + ret = usbh_asix_write_cmd(asix_class, AX_CMD_WRITE_NODE_ID, 0, 0, asix_class->mac, ETH_ALEN); + if (ret < 0) + goto out; + + /* Set RX_CTL to default values with 2k buffer, and enable cactus */ + ret = usbh_asix_write_rx_ctl(asix_class, AX_DEFAULT_RX_CTL); + if (ret < 0) + goto out; + + ret = usbh_asix_write_medium_mode(asix_class, AX88772_MEDIUM_DEFAULT); + if (ret < 0) + return ret; + + /* Set RX_CTL to default values with 2k buffer, and enable cactus */ + ret = usbh_asix_write_rx_ctl(asix_class, AX_DEFAULT_RX_CTL); + if (ret < 0) + goto out; + + rx_ctl = usbh_asix_read_rx_ctl(asix_class); + USB_LOG_INFO("RX_CTL is 0x%04x after all initializations\r\n", rx_ctl); + + rx_ctl = usbh_asix_read_medium_status(asix_class); + USB_LOG_INFO("Medium Status is 0x%04x after all initializations\r\n", rx_ctl); + + return 0; + +out: + return ret; +} + +static void usbh_ax88772_mac_link_down(struct usbh_asix *asix_class) +{ + usbh_asix_write_medium_mode(asix_class, 0); +} + +static void usbh_ax88772_mac_link_up(struct usbh_asix *asix_class, int speed, int duplex, bool tx_pause, bool rx_pause) +{ + uint16_t m = AX_MEDIUM_AC | AX_MEDIUM_RE; + + m |= duplex ? AX_MEDIUM_FD : 0; + + switch (speed) { + case SPEED_100: + m |= AX_MEDIUM_PS; + break; + case SPEED_10: + break; + default: + return; + } + + if (tx_pause) + m |= AX_MEDIUM_TFC; + + if (rx_pause) + m |= AX_MEDIUM_RFC; + + usbh_asix_write_medium_mode(asix_class, m); +} + +static int usbh_asix_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret; + + struct usbh_asix *asix_class = &g_asix_class; + + memset(asix_class, 0, sizeof(struct usbh_asix)); + + asix_class->hport = hport; + asix_class->intf = intf; + + hport->config.intf[intf].priv = asix_class; + + if ((hport->device_desc.idVendor == 0x0b95) && (hport->device_desc.idProduct == 0x772b)) { + asix_class->name = "ASIX AX88772B"; + } else if ((hport->device_desc.idVendor == 0x0b95) && (hport->device_desc.idProduct == 0x7720)) { + asix_class->name = "ASIX AX88772"; + } else if ((hport->device_desc.idVendor == 0x0b95) && (hport->device_desc.idProduct == 0x1780)) { + asix_class->name = "ASIX AX88178"; + } + + for (uint8_t i = 0; i < (ETH_ALEN >> 1); i++) { + ret = usbh_asix_read_cmd(asix_class, AX_CMD_READ_EEPROM, + 0x04 + i, 0, &asix_class->mac[i * 2], 2); + if (ret < 0) { + return ret; + } + } + + USB_LOG_INFO("asix MAC address %02x:%02x:%02x:%02x:%02x:%02x\r\n", + asix_class->mac[0], + asix_class->mac[1], + asix_class->mac[2], + asix_class->mac[3], + asix_class->mac[4], + asix_class->mac[5]); + + ret = usbh_asix_read_phy_addr(asix_class, true); + if (ret < 0) { + USB_LOG_ERR("Failed to read phy addr: %d\r\n", ret); + return ret; + } + asix_class->phy_addr = ret; + asix_class->embd_phy = ((ret & 0x1f) == AX_EMBD_PHY_ADDR); + + ret = usbh_asix_read_cmd(asix_class, AX_CMD_STATMNGSTS_REG, 0, 0, &asix_class->chipcode, 1); + if (ret < 0) { + USB_LOG_ERR("Failed to read STATMNGSTS_REG: %d\r\n", ret); + return ret; + } + + asix_class->chipcode &= AX_CHIPCODE_MASK; + USB_LOG_INFO("asix chipcode 0x%x\r\n", asix_class->chipcode); + + if (asix_class->chipcode == AX_AX88772_CHIPCODE) { + usbh_ax88772_hw_reset(asix_class); + } else { + usbh_ax88772a_hw_reset(asix_class); + } + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(asix_class->intin, ep_desc); + } else { + return -USB_ERR_NOTSUPP; + } + } else { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(asix_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(asix_class->bulkout, ep_desc); + } + } + } + + if (asix_class->chipcode == AX_AX88772B_CHIPCODE) { + usbh_asix_mdio_write(asix_class, asix_class->phy_addr, 0, 0); + usbh_asix_mdio_read(asix_class, asix_class->phy_addr, 0); + + usbh_asix_mdio_write(asix_class, asix_class->phy_addr, 0, 0x8200); + usbh_asix_mdio_read(asix_class, asix_class->phy_addr, 0); + + usbh_asix_mdio_write(asix_class, asix_class->phy_addr, 0, 0x3900); + usbh_asix_mdio_read(asix_class, asix_class->phy_addr, 0); + + usbh_asix_mdio_write(asix_class, asix_class->phy_addr, 0, 0x3100); + usbh_asix_mdio_read(asix_class, asix_class->phy_addr, 4); + + usbh_asix_mdio_write(asix_class, asix_class->phy_addr, 4, 0x01e1); + usbh_asix_mdio_read(asix_class, asix_class->phy_addr, 1); + + usbh_asix_mdio_write(asix_class, asix_class->phy_addr, 0, 0x3300); + usbh_asix_mdio_read(asix_class, asix_class->phy_addr, 0); + } + + USB_LOG_INFO("Init %s done\r\n", asix_class->name); + + strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN); + + USB_LOG_INFO("Register ASIX Class:%s\r\n", hport->config.intf[intf].devname); + usbh_asix_run(asix_class); + return ret; +} + +static int usbh_asix_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_asix *asix_class = (struct usbh_asix *)hport->config.intf[intf].priv; + + if (asix_class) { + if (asix_class->bulkin) { + usbh_kill_urb(&asix_class->bulkin_urb); + } + + if (asix_class->bulkout) { + usbh_kill_urb(&asix_class->bulkout_urb); + } + + if (asix_class->intin) { + usbh_kill_urb(&asix_class->intin_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister ASIX Class:%s\r\n", hport->config.intf[intf].devname); + usbh_asix_stop(asix_class); + } + + memset(asix_class, 0, sizeof(struct usbh_asix)); + } + + return ret; +} + +int usbh_asix_get_connect_status(struct usbh_asix *asix_class) +{ + int ret; + + usbh_int_urb_fill(&asix_class->intin_urb, asix_class->hport, asix_class->intin, g_asix_inttx_buffer, 8, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&asix_class->intin_urb); + if (ret < 0) { + return ret; + } + + if (g_asix_inttx_buffer[1] == 0x00) { + if (g_asix_inttx_buffer[2] & 0x01) { + asix_class->connect_status = true; + usbh_ax88772_mac_link_up(asix_class, SPEED_100, 1, 1, 1); + usbh_asix_set_multicast(asix_class); + } else { + asix_class->connect_status = false; + usbh_ax88772_mac_link_down(asix_class); + } + } + return 0; +} + +void usbh_asix_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + uint32_t g_asix_rx_length; + int ret; + uint16_t len; + uint16_t len_crc; + uint32_t data_offset; +#if CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE <= (16 * 1024) + uint32_t transfer_size = CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE; +#else + uint32_t transfer_size = (16 * 1024); +#endif + + (void)CONFIG_USB_OSAL_THREAD_GET_ARGV; + USB_LOG_INFO("Create asix rx thread\r\n"); + // clang-format off +find_class: + // clang-format on + g_asix_class.connect_status = false; + if (usbh_find_class_instance("/dev/asix") == NULL) { + goto delete; + } + + while (g_asix_class.connect_status == false) { + ret = usbh_asix_get_connect_status(&g_asix_class); + if (ret < 0) { + usb_osal_msleep(100); + goto find_class; + } + usb_osal_msleep(128); + } + + g_asix_rx_length = 0; + while (1) { + usbh_bulk_urb_fill(&g_asix_class.bulkin_urb, g_asix_class.hport, g_asix_class.bulkin, &g_asix_rx_buffer[g_asix_rx_length], transfer_size, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&g_asix_class.bulkin_urb); + if (ret < 0) { + goto find_class; + } + + g_asix_rx_length += g_asix_class.bulkin_urb.actual_length; + + /* A transfer is complete because last packet is a short packet. + * Short packet is not zero, match g_asix_rx_length % USB_GET_MAXPACKETSIZE(g_asix_class.bulkin->wMaxPacketSize). + * Short packet is zero, check if g_asix_class.bulkin_urb.actual_length < transfer_size, for example transfer is complete with size is 1024 < 2048. + */ + if (g_asix_rx_length % USB_GET_MAXPACKETSIZE(g_asix_class.bulkin->wMaxPacketSize) || + (g_asix_class.bulkin_urb.actual_length < transfer_size)) { + USB_LOG_DBG("rxlen:%d\r\n", g_asix_rx_length); + + data_offset = 0; + while (g_asix_rx_length > 0) { + len = ((uint16_t)g_asix_rx_buffer[data_offset + 0] | ((uint16_t)(g_asix_rx_buffer[data_offset + 1]) << 8)) & 0x7ff; + len_crc = g_asix_rx_buffer[data_offset + 2] | ((uint16_t)(g_asix_rx_buffer[data_offset + 3]) << 8); + + if (len != (~len_crc & 0x7ff)) { + USB_LOG_ERR("rx header error\r\n"); + g_asix_rx_length = 0; + continue; + } + + uint8_t *buf = (uint8_t *)&g_asix_rx_buffer[data_offset + 4]; + usbh_asix_eth_input(buf, len); + g_asix_rx_length -= (len + 4); + data_offset += (len + 4); + + if (g_asix_rx_length < 4) { + g_asix_rx_length = 0; + } + } + } else { +#if CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE <= (16 * 1024) + if (g_asix_rx_length == CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE) { +#else + if ((g_asix_rx_length + (16 * 1024)) > CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE) { +#endif + USB_LOG_ERR("Rx packet is overflow, please reduce tcp window size or increase CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE\r\n"); + while (1) { + } + } + } + } + // clang-format off +delete: + USB_LOG_INFO("Delete asix rx thread\r\n"); + usb_osal_thread_delete(NULL); + // clang-format on +} + +uint8_t *usbh_asix_get_eth_txbuf(void) +{ + return &g_asix_tx_buffer[4]; +} + +int usbh_asix_eth_output(uint32_t buflen) +{ + uint16_t actual_len; + + if (g_asix_class.connect_status == false) { + return -USB_ERR_NOTCONN; + } + + g_asix_tx_buffer[0] = buflen & 0xff; + g_asix_tx_buffer[1] = (buflen >> 8) & 0xff; + g_asix_tx_buffer[2] = ~g_asix_tx_buffer[0]; + g_asix_tx_buffer[3] = ~g_asix_tx_buffer[1]; + + if (!(buflen + 4) % USB_GET_MAXPACKETSIZE(g_asix_class.bulkout->wMaxPacketSize)) { + USB_LOG_DBG("txlen:%d\r\n", buflen + 8); + g_asix_tx_buffer[buflen + 4 + 0] = 0x00; + g_asix_tx_buffer[buflen + 4 + 1] = 0x00; + g_asix_tx_buffer[buflen + 4 + 2] = 0xff; + g_asix_tx_buffer[buflen + 4 + 3] = 0xff; + actual_len = buflen + 8; + } else { + USB_LOG_DBG("txlen:%d\r\n", buflen + 4); + actual_len = buflen + 4; + } + + usbh_bulk_urb_fill(&g_asix_class.bulkout_urb, g_asix_class.hport, g_asix_class.bulkout, g_asix_tx_buffer, actual_len, USB_OSAL_WAITING_FOREVER, NULL, NULL); + return usbh_submit_urb(&g_asix_class.bulkout_urb); +} + +__WEAK void usbh_asix_run(struct usbh_asix *asix_class) +{ + (void)asix_class; +} + +__WEAK void usbh_asix_stop(struct usbh_asix *asix_class) +{ + (void)asix_class; +} + +static const uint16_t asix_id_table[][2] = { + { 0x0B95, 0x772B }, + { 0x0B95, 0x7720 }, + { 0, 0 }, +}; + +static const struct usbh_class_driver asix_class_driver = { + .driver_name = "asix", + .connect = usbh_asix_connect, + .disconnect = usbh_asix_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info asix_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = asix_id_table, + .class_driver = &asix_class_driver +}; \ No newline at end of file diff --git a/src/lib/CherryUSB/class/vendor/net/usbh_asix.h b/src/lib/CherryUSB/class/vendor/net/usbh_asix.h new file mode 100644 index 000000000..bdeb0e310 --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/net/usbh_asix.h @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_ASIX_H +#define USBH_ASIX_H + +/* ASIX AX8817X based USB 2.0 Ethernet Devices */ + +#define AX_CMD_SET_SW_MII 0x06 +#define AX_CMD_READ_MII_REG 0x07 +#define AX_CMD_WRITE_MII_REG 0x08 +#define AX_CMD_STATMNGSTS_REG 0x09 +#define AX_CMD_SET_HW_MII 0x0a +#define AX_CMD_READ_EEPROM 0x0b +#define AX_CMD_WRITE_EEPROM 0x0c +#define AX_CMD_WRITE_ENABLE 0x0d +#define AX_CMD_WRITE_DISABLE 0x0e +#define AX_CMD_READ_RX_CTL 0x0f +#define AX_CMD_WRITE_RX_CTL 0x10 +#define AX_CMD_READ_IPG012 0x11 +#define AX_CMD_WRITE_IPG0 0x12 +#define AX_CMD_WRITE_IPG1 0x13 +#define AX_CMD_READ_NODE_ID 0x13 +#define AX_CMD_WRITE_NODE_ID 0x14 +#define AX_CMD_WRITE_IPG2 0x14 +#define AX_CMD_WRITE_MULTI_FILTER 0x16 +#define AX88172_CMD_READ_NODE_ID 0x17 +#define AX_CMD_READ_PHY_ID 0x19 +#define AX_CMD_READ_MEDIUM_STATUS 0x1a +#define AX_CMD_WRITE_MEDIUM_MODE 0x1b +#define AX_CMD_READ_MONITOR_MODE 0x1c +#define AX_CMD_WRITE_MONITOR_MODE 0x1d +#define AX_CMD_READ_GPIOS 0x1e +#define AX_CMD_WRITE_GPIOS 0x1f +#define AX_CMD_SW_RESET 0x20 +#define AX_CMD_SW_PHY_STATUS 0x21 +#define AX_CMD_SW_PHY_SELECT 0x22 +#define AX_QCTCTRL 0x2A + +#define AX_CHIPCODE_MASK 0x70 +#define AX_AX88772_CHIPCODE 0x00 +#define AX_AX88772A_CHIPCODE 0x10 +#define AX_AX88772B_CHIPCODE 0x20 +#define AX_HOST_EN 0x01 + +#define AX_PHYSEL_PSEL 0x01 +#define AX_PHYSEL_SSMII 0 +#define AX_PHYSEL_SSEN 0x10 + +#define AX_PHY_SELECT_MASK (BIT(3) | BIT(2)) +#define AX_PHY_SELECT_INTERNAL 0 +#define AX_PHY_SELECT_EXTERNAL BIT(2) + +#define AX_MONITOR_MODE 0x01 +#define AX_MONITOR_LINK 0x02 +#define AX_MONITOR_MAGIC 0x04 +#define AX_MONITOR_HSFS 0x10 + +/* AX88172 Medium Status Register values */ +#define AX88172_MEDIUM_FD 0x02 +#define AX88172_MEDIUM_TX 0x04 +#define AX88172_MEDIUM_FC 0x10 +#define AX88172_MEDIUM_DEFAULT \ + (AX88172_MEDIUM_FD | AX88172_MEDIUM_TX | AX88172_MEDIUM_FC) + +#define AX_MCAST_FILTER_SIZE 8 +#define AX_MAX_MCAST 64 + +#define AX_SWRESET_CLEAR 0x00 +#define AX_SWRESET_RR 0x01 +#define AX_SWRESET_RT 0x02 +#define AX_SWRESET_PRTE 0x04 +#define AX_SWRESET_PRL 0x08 +#define AX_SWRESET_BZ 0x10 +#define AX_SWRESET_IPRL 0x20 +#define AX_SWRESET_IPPD 0x40 + +#define AX88772_IPG0_DEFAULT 0x15 +#define AX88772_IPG1_DEFAULT 0x0c +#define AX88772_IPG2_DEFAULT 0x12 + +/* AX88772 & AX88178 Medium Mode Register */ +#define AX_MEDIUM_PF 0x0080 +#define AX_MEDIUM_JFE 0x0040 +#define AX_MEDIUM_TFC 0x0020 +#define AX_MEDIUM_RFC 0x0010 +#define AX_MEDIUM_ENCK 0x0008 +#define AX_MEDIUM_AC 0x0004 +#define AX_MEDIUM_FD 0x0002 +#define AX_MEDIUM_GM 0x0001 +#define AX_MEDIUM_SM 0x1000 +#define AX_MEDIUM_SBP 0x0800 +#define AX_MEDIUM_PS 0x0200 +#define AX_MEDIUM_RE 0x0100 + +#define AX88178_MEDIUM_DEFAULT \ + (AX_MEDIUM_PS | AX_MEDIUM_FD | AX_MEDIUM_AC | \ + AX_MEDIUM_RFC | AX_MEDIUM_TFC | AX_MEDIUM_JFE | \ + AX_MEDIUM_RE) + +#define AX88772_MEDIUM_DEFAULT \ + (AX_MEDIUM_FD | AX_MEDIUM_PS | \ + AX_MEDIUM_AC | AX_MEDIUM_RE) + +/* AX88772 & AX88178 RX_CTL values */ +#define AX_RX_CTL_SO 0x0080 +#define AX_RX_CTL_AP 0x0020 +#define AX_RX_CTL_AM 0x0010 +#define AX_RX_CTL_AB 0x0008 +#define AX_RX_CTL_SEP 0x0004 +#define AX_RX_CTL_AMALL 0x0002 +#define AX_RX_CTL_PRO 0x0001 +#define AX_RX_CTL_MFB_2048 0x0000 +#define AX_RX_CTL_MFB_4096 0x0100 +#define AX_RX_CTL_MFB_8192 0x0200 +#define AX_RX_CTL_MFB_16384 0x0300 + +#define AX_DEFAULT_RX_CTL (AX_RX_CTL_SO | AX_RX_CTL_AB) + +/* GPIO 0 .. 2 toggles */ +#define AX_GPIO_GPO0EN 0x01 /* GPIO0 Output enable */ +#define AX_GPIO_GPO_0 0x02 /* GPIO0 Output value */ +#define AX_GPIO_GPO1EN 0x04 /* GPIO1 Output enable */ +#define AX_GPIO_GPO_1 0x08 /* GPIO1 Output value */ +#define AX_GPIO_GPO2EN 0x10 /* GPIO2 Output enable */ +#define AX_GPIO_GPO_2 0x20 /* GPIO2 Output value */ +#define AX_GPIO_RESERVED 0x40 /* Reserved */ +#define AX_GPIO_RSE 0x80 /* Reload serial EEPROM */ + +#define AX_EEPROM_MAGIC 0xdeadbeef +#define AX_EEPROM_LEN 0x200 + +#define AX_EMBD_PHY_ADDR 0x10 + +struct usbh_asix { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usb_endpoint_descriptor *intin; /* INTR IN endpoint */ + struct usbh_urb bulkout_urb; + struct usbh_urb bulkin_urb; + struct usbh_urb intin_urb; + + uint8_t intf; + char *name; + uint8_t phy_addr; + uint8_t embd_phy; + uint8_t chipcode; + uint16_t mac_capabilities; + + bool connect_status; + uint8_t mac[6]; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_asix_get_connect_status(struct usbh_asix *asix_class); + +void usbh_asix_run(struct usbh_asix *asix_class); +void usbh_asix_stop(struct usbh_asix *asix_class); + +uint8_t *usbh_asix_get_eth_txbuf(void); +int usbh_asix_eth_output(uint32_t buflen); +void usbh_asix_eth_input(uint8_t *buf, uint32_t buflen); +void usbh_asix_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_ASIX_H */ \ No newline at end of file diff --git a/src/lib/CherryUSB/class/vendor/net/usbh_rtl8152.c b/src/lib/CherryUSB/class/vendor/net/usbh_rtl8152.c new file mode 100644 index 000000000..75d23dfc1 --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/net/usbh_rtl8152.c @@ -0,0 +1,2282 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_rtl8152.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "rtl8152" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/rtl8152" + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rtl8152_rx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rtl8152_tx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rtl8152_inttx_buffer[USB_ALIGN_UP(2, CONFIG_USB_ALIGN_SIZE)]; + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rtl8152_buf[USB_ALIGN_UP(32, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_rtl8152 g_rtl8152_class; + +#define RTL8152_REQ_GET_REGS 0x05 +#define RTL8152_REQ_SET_REGS 0x05 + +#define BYTE_EN_DWORD 0xff +#define BYTE_EN_WORD 0x33 +#define BYTE_EN_BYTE 0x11 +#define BYTE_EN_SIX_BYTES 0x3f +#define BYTE_EN_START_MASK 0x0f +#define BYTE_EN_END_MASK 0xf0 + +#define MCU_TYPE_PLA 0x0100 +#define MCU_TYPE_USB 0x0000 + +/* Define these values to match your device */ +#define VENDOR_ID_REALTEK 0x0bda +#define VENDOR_ID_MICROSOFT 0x045e +#define VENDOR_ID_SAMSUNG 0x04e8 +#define VENDOR_ID_LENOVO 0x17ef +#define VENDOR_ID_LINKSYS 0x13b1 +#define VENDOR_ID_NVIDIA 0x0955 +#define VENDOR_ID_TPLINK 0x2357 +#define VENDOR_ID_DLINK 0x2001 +#define VENDOR_ID_ASUS 0x0b05 + +#define R8152_PHY_ID 32 + +#define PLA_IDR 0xc000 +#define PLA_RCR 0xc010 +#define PLA_RCR1 0xc012 +#define PLA_RMS 0xc016 +#define PLA_RXFIFO_CTRL0 0xc0a0 +#define PLA_RXFIFO_FULL 0xc0a2 +#define PLA_RXFIFO_CTRL1 0xc0a4 +#define PLA_RX_FIFO_FULL 0xc0a6 +#define PLA_RXFIFO_CTRL2 0xc0a8 +#define PLA_RX_FIFO_EMPTY 0xc0aa +#define PLA_DMY_REG0 0xc0b0 +#define PLA_FMC 0xc0b4 +#define PLA_CFG_WOL 0xc0b6 +#define PLA_TEREDO_CFG 0xc0bc +#define PLA_TEREDO_WAKE_BASE 0xc0c4 +#define PLA_MAR 0xcd00 +#define PLA_BACKUP 0xd000 +#define PLA_BDC_CR 0xd1a0 +#define PLA_TEREDO_TIMER 0xd2cc +#define PLA_REALWOW_TIMER 0xd2e8 +#define PLA_UPHY_TIMER 0xd388 +#define PLA_SUSPEND_FLAG 0xd38a +#define PLA_INDICATE_FALG 0xd38c +#define PLA_MACDBG_PRE 0xd38c /* RTL_VER_04 only */ +#define PLA_MACDBG_POST 0xd38e /* RTL_VER_04 only */ +#define PLA_EXTRA_STATUS 0xd398 +#define PLA_GPHY_CTRL 0xd3ae +#define PLA_POL_GPIO_CTRL 0xdc6a +#define PLA_EFUSE_DATA 0xdd00 +#define PLA_EFUSE_CMD 0xdd02 +#define PLA_LEDSEL 0xdd90 +#define PLA_LED_FEATURE 0xdd92 +#define PLA_PHYAR 0xde00 +#define PLA_BOOT_CTRL 0xe004 +#define PLA_LWAKE_CTRL_REG 0xe007 +#define PLA_GPHY_INTR_IMR 0xe022 +#define PLA_EEE_CR 0xe040 +#define PLA_EEE_TXTWSYS 0xe04c +#define PLA_EEE_TXTWSYS_2P5G 0xe058 +#define PLA_EEEP_CR 0xe080 +#define PLA_MAC_PWR_CTRL 0xe0c0 +#define PLA_MAC_PWR_CTRL2 0xe0ca +#define PLA_MAC_PWR_CTRL3 0xe0cc +#define PLA_MAC_PWR_CTRL4 0xe0ce +#define PLA_WDT6_CTRL 0xe428 +#define PLA_TCR0 0xe610 +#define PLA_TCR1 0xe612 +#define PLA_MTPS 0xe615 +#define PLA_TXFIFO_CTRL 0xe618 +#define PLA_TXFIFO_FULL 0xe61a +#define PLA_RSTTALLY 0xe800 +#define PLA_CR 0xe813 +#define PLA_CRWECR 0xe81c +#define PLA_CONFIG12 0xe81e /* CONFIG1, CONFIG2 */ +#define PLA_CONFIG34 0xe820 /* CONFIG3, CONFIG4 */ +#define PLA_CONFIG5 0xe822 +#define PLA_PHY_PWR 0xe84c +#define PLA_OOB_CTRL 0xe84f +#define PLA_CPCR 0xe854 +#define PLA_MISC_0 0xe858 +#define PLA_MISC_1 0xe85a +#define PLA_OCP_GPHY_BASE 0xe86c +#define PLA_TALLYCNT 0xe890 +#define PLA_SFF_STS_7 0xe8de +#define PLA_PHYSTATUS 0xe908 +#define PLA_CONFIG6 0xe90a /* CONFIG6 */ +#define PLA_USB_CFG 0xe952 +#define PLA_BP_BA 0xfc26 +#define PLA_BP_0 0xfc28 +#define PLA_BP_1 0xfc2a +#define PLA_BP_2 0xfc2c +#define PLA_BP_3 0xfc2e +#define PLA_BP_4 0xfc30 +#define PLA_BP_5 0xfc32 +#define PLA_BP_6 0xfc34 +#define PLA_BP_7 0xfc36 +#define PLA_BP_EN 0xfc38 + +#define USB_USB2PHY 0xb41e +#define USB_SSPHYLINK1 0xb426 +#define USB_SSPHYLINK2 0xb428 +#define USB_L1_CTRL 0xb45e +#define USB_U2P3_CTRL 0xb460 +#define USB_CSR_DUMMY1 0xb464 +#define USB_CSR_DUMMY2 0xb466 +#define USB_DEV_STAT 0xb808 +#define USB_CONNECT_TIMER 0xcbf8 +#define USB_MSC_TIMER 0xcbfc +#define USB_BURST_SIZE 0xcfc0 +#define USB_FW_FIX_EN0 0xcfca +#define USB_FW_FIX_EN1 0xcfcc +#define USB_LPM_CONFIG 0xcfd8 +#define USB_ECM_OPTION 0xcfee +#define USB_CSTMR 0xcfef /* RTL8153A */ +#define USB_MISC_2 0xcfff +#define USB_ECM_OP 0xd26b +#define USB_GPHY_CTRL 0xd284 +#define USB_SPEED_OPTION 0xd32a +#define USB_FW_CTRL 0xd334 /* RTL8153B */ +#define USB_FC_TIMER 0xd340 +#define USB_USB_CTRL 0xd406 +#define USB_PHY_CTRL 0xd408 +#define USB_TX_AGG 0xd40a +#define USB_RX_BUF_TH 0xd40c +#define USB_USB_TIMER 0xd428 +#define USB_RX_EARLY_TIMEOUT 0xd42c +#define USB_RX_EARLY_SIZE 0xd42e +#define USB_PM_CTRL_STATUS 0xd432 /* RTL8153A */ +#define USB_RX_EXTRA_AGGR_TMR 0xd432 /* RTL8153B */ +#define USB_TX_DMA 0xd434 +#define USB_UPT_RXDMA_OWN 0xd437 +#define USB_UPHY3_MDCMDIO 0xd480 +#define USB_TOLERANCE 0xd490 +#define USB_LPM_CTRL 0xd41a +#define USB_BMU_RESET 0xd4b0 +#define USB_BMU_CONFIG 0xd4b4 +#define USB_U1U2_TIMER 0xd4da +#define USB_FW_TASK 0xd4e8 /* RTL8153B */ +#define USB_RX_AGGR_NUM 0xd4ee +#define USB_UPS_CTRL 0xd800 +#define USB_POWER_CUT 0xd80a +#define USB_MISC_0 0xd81a +#define USB_MISC_1 0xd81f +#define USB_AFE_CTRL2 0xd824 +#define USB_UPHY_XTAL 0xd826 +#define USB_UPS_CFG 0xd842 +#define USB_UPS_FLAGS 0xd848 +#define USB_WDT1_CTRL 0xe404 +#define USB_WDT11_CTRL 0xe43c +#define USB_BP_BA PLA_BP_BA +#define USB_BP_0 PLA_BP_0 +#define USB_BP_1 PLA_BP_1 +#define USB_BP_2 PLA_BP_2 +#define USB_BP_3 PLA_BP_3 +#define USB_BP_4 PLA_BP_4 +#define USB_BP_5 PLA_BP_5 +#define USB_BP_6 PLA_BP_6 +#define USB_BP_7 PLA_BP_7 +#define USB_BP_EN PLA_BP_EN /* RTL8153A */ +#define USB_BP_8 0xfc38 /* RTL8153B */ +#define USB_BP_9 0xfc3a +#define USB_BP_10 0xfc3c +#define USB_BP_11 0xfc3e +#define USB_BP_12 0xfc40 +#define USB_BP_13 0xfc42 +#define USB_BP_14 0xfc44 +#define USB_BP_15 0xfc46 +#define USB_BP2_EN 0xfc48 + +/* OCP Registers */ +#define OCP_ALDPS_CONFIG 0x2010 +#define OCP_EEE_CONFIG1 0x2080 +#define OCP_EEE_CONFIG2 0x2092 +#define OCP_EEE_CONFIG3 0x2094 +#define OCP_BASE_MII 0xa400 +#define OCP_EEE_AR 0xa41a +#define OCP_EEE_DATA 0xa41c +#define OCP_PHY_STATUS 0xa420 +#define OCP_INTR_EN 0xa424 +#define OCP_NCTL_CFG 0xa42c +#define OCP_POWER_CFG 0xa430 +#define OCP_EEE_CFG 0xa432 +#define OCP_SRAM_ADDR 0xa436 +#define OCP_SRAM_DATA 0xa438 +#define OCP_DOWN_SPEED 0xa442 +#define OCP_EEE_ABLE 0xa5c4 +#define OCP_EEE_ADV 0xa5d0 +#define OCP_EEE_LPABLE 0xa5d2 +#define OCP_10GBT_CTRL 0xa5d4 +#define OCP_10GBT_STAT 0xa5d6 +#define OCP_EEE_ADV2 0xa6d4 +#define OCP_PHY_STATE 0xa708 /* nway state for 8153 */ +#define OCP_PHY_PATCH_STAT 0xb800 +#define OCP_PHY_PATCH_CMD 0xb820 +#define OCP_PHY_LOCK 0xb82e +#define OCP_ADC_IOFFSET 0xbcfc +#define OCP_ADC_CFG 0xbc06 +#define OCP_SYSCLK_CFG 0xc416 + +/* SRAM Register */ +#define SRAM_GREEN_CFG 0x8011 +#define SRAM_LPF_CFG 0x8012 +#define SRAM_GPHY_FW_VER 0x801e +#define SRAM_10M_AMP1 0x8080 +#define SRAM_10M_AMP2 0x8082 +#define SRAM_IMPEDANCE 0x8084 +#define SRAM_PHY_LOCK 0xb82e + +/* PLA_RCR */ +#define RCR_AAP 0x00000001 +#define RCR_APM 0x00000002 +#define RCR_AM 0x00000004 +#define RCR_AB 0x00000008 +#define RCR_ACPT_ALL (RCR_AAP | RCR_APM | RCR_AM | RCR_AB) +#define SLOT_EN BIT(11) + +/* PLA_RCR1 */ +#define OUTER_VLAN BIT(7) +#define INNER_VLAN BIT(6) + +/* PLA_RXFIFO_CTRL0 */ +#define RXFIFO_THR1_NORMAL 0x00080002 +#define RXFIFO_THR1_OOB 0x01800003 + +/* PLA_RXFIFO_FULL */ +#define RXFIFO_FULL_MASK 0xfff + +/* PLA_RXFIFO_CTRL1 */ +#define RXFIFO_THR2_FULL 0x00000060 +#define RXFIFO_THR2_HIGH 0x00000038 +#define RXFIFO_THR2_OOB 0x0000004a +#define RXFIFO_THR2_NORMAL 0x00a0 + +/* PLA_RXFIFO_CTRL2 */ +#define RXFIFO_THR3_FULL 0x00000078 +#define RXFIFO_THR3_HIGH 0x00000048 +#define RXFIFO_THR3_OOB 0x0000005a +#define RXFIFO_THR3_NORMAL 0x0110 + +/* PLA_TXFIFO_CTRL */ +#define TXFIFO_THR_NORMAL 0x00400008 +#define TXFIFO_THR_NORMAL2 0x01000008 + +/* PLA_DMY_REG0 */ +#define ECM_ALDPS 0x0002 + +/* PLA_FMC */ +#define FMC_FCR_MCU_EN 0x0001 + +/* PLA_EEEP_CR */ +#define EEEP_CR_EEEP_TX 0x0002 + +/* PLA_WDT6_CTRL */ +#define WDT6_SET_MODE 0x0010 + +/* PLA_TCR0 */ +#define TCR0_TX_EMPTY 0x0800 +#define TCR0_AUTO_FIFO 0x0080 + +/* PLA_TCR1 */ +#define VERSION_MASK 0x7cf0 +#define IFG_MASK (BIT(3) | BIT(9) | BIT(8)) +#define IFG_144NS BIT(9) +#define IFG_96NS (BIT(9) | BIT(8)) + +/* PLA_MTPS */ +#define MTPS_JUMBO (12 * 1024 / 64) +#define MTPS_DEFAULT (6 * 1024 / 64) + +/* PLA_RSTTALLY */ +#define TALLY_RESET 0x0001 + +/* PLA_CR */ +#define CR_RST 0x10 +#define CR_RE 0x08 +#define CR_TE 0x04 + +/* PLA_CRWECR */ +#define CRWECR_NORAML 0x00 +#define CRWECR_CONFIG 0xc0 + +/* PLA_OOB_CTRL */ +#define NOW_IS_OOB 0x80 +#define TXFIFO_EMPTY 0x20 +#define RXFIFO_EMPTY 0x10 +#define LINK_LIST_READY 0x02 +#define DIS_MCU_CLROOB 0x01 +#define FIFO_EMPTY (TXFIFO_EMPTY | RXFIFO_EMPTY) + +/* PLA_MISC_1 */ +#define RXDY_GATED_EN 0x0008 + +/* PLA_SFF_STS_7 */ +#define RE_INIT_LL 0x8000 +#define MCU_BORW_EN 0x4000 + +/* PLA_CPCR */ +#define FLOW_CTRL_EN BIT(0) +#define CPCR_RX_VLAN 0x0040 + +/* PLA_CFG_WOL */ +#define MAGIC_EN 0x0001 + +/* PLA_TEREDO_CFG */ +#define TEREDO_SEL 0x8000 +#define TEREDO_WAKE_MASK 0x7f00 +#define TEREDO_RS_EVENT_MASK 0x00fe +#define OOB_TEREDO_EN 0x0001 + +/* PLA_BDC_CR */ +#define ALDPS_PROXY_MODE 0x0001 + +/* PLA_EFUSE_CMD */ +#define EFUSE_READ_CMD BIT(15) +#define EFUSE_DATA_BIT16 BIT(7) + +/* PLA_CONFIG34 */ +#define LINK_ON_WAKE_EN 0x0010 +#define LINK_OFF_WAKE_EN 0x0008 + +/* PLA_CONFIG6 */ +#define LANWAKE_CLR_EN BIT(0) + +/* PLA_USB_CFG */ +#define EN_XG_LIP BIT(1) +#define EN_G_LIP BIT(2) + +/* PLA_CONFIG5 */ +#define BWF_EN 0x0040 +#define MWF_EN 0x0020 +#define UWF_EN 0x0010 +#define LAN_WAKE_EN 0x0002 + +/* PLA_LED_FEATURE */ +#define LED_MODE_MASK 0x0700 + +/* PLA_PHY_PWR */ +#define TX_10M_IDLE_EN 0x0080 +#define PFM_PWM_SWITCH 0x0040 +#define TEST_IO_OFF BIT(4) + +/* PLA_MAC_PWR_CTRL */ +#define D3_CLK_GATED_EN 0x00004000 +#define MCU_CLK_RATIO 0x07010f07 +#define MCU_CLK_RATIO_MASK 0x0f0f0f0f +#define ALDPS_SPDWN_RATIO 0x0f87 + +/* PLA_MAC_PWR_CTRL2 */ +#define EEE_SPDWN_RATIO 0x8007 +#define MAC_CLK_SPDWN_EN BIT(15) +#define EEE_SPDWN_RATIO_MASK 0xff + +/* PLA_MAC_PWR_CTRL3 */ +#define PLA_MCU_SPDWN_EN BIT(14) +#define PKT_AVAIL_SPDWN_EN 0x0100 +#define SUSPEND_SPDWN_EN 0x0004 +#define U1U2_SPDWN_EN 0x0002 +#define L1_SPDWN_EN 0x0001 + +/* PLA_MAC_PWR_CTRL4 */ +#define PWRSAVE_SPDWN_EN 0x1000 +#define RXDV_SPDWN_EN 0x0800 +#define TX10MIDLE_EN 0x0100 +#define IDLE_SPDWN_EN BIT(6) +#define TP100_SPDWN_EN 0x0020 +#define TP500_SPDWN_EN 0x0010 +#define TP1000_SPDWN_EN 0x0008 +#define EEE_SPDWN_EN 0x0001 + +/* PLA_GPHY_INTR_IMR */ +#define GPHY_STS_MSK 0x0001 +#define SPEED_DOWN_MSK 0x0002 +#define SPDWN_RXDV_MSK 0x0004 +#define SPDWN_LINKCHG_MSK 0x0008 + +/* PLA_PHYAR */ +#define PHYAR_FLAG 0x80000000 + +/* PLA_EEE_CR */ +#define EEE_RX_EN 0x0001 +#define EEE_TX_EN 0x0002 + +/* PLA_BOOT_CTRL */ +#define AUTOLOAD_DONE 0x0002 + +/* PLA_LWAKE_CTRL_REG */ +#define LANWAKE_PIN BIT(7) + +/* PLA_SUSPEND_FLAG */ +#define LINK_CHG_EVENT BIT(0) + +/* PLA_INDICATE_FALG */ +#define UPCOMING_RUNTIME_D3 BIT(0) + +/* PLA_MACDBG_PRE and PLA_MACDBG_POST */ +#define DEBUG_OE BIT(0) +#define DEBUG_LTSSM 0x0082 + +/* PLA_EXTRA_STATUS */ +#define CUR_LINK_OK BIT(15) +#define U3P3_CHECK_EN BIT(7) /* RTL_VER_05 only */ +#define LINK_CHANGE_FLAG BIT(8) +#define POLL_LINK_CHG BIT(0) + +/* PLA_GPHY_CTRL */ +#define GPHY_FLASH BIT(1) + +/* PLA_POL_GPIO_CTRL */ +#define DACK_DET_EN BIT(15) +#define POL_GPHY_PATCH BIT(4) + +/* USB_USB2PHY */ +#define USB2PHY_SUSPEND 0x0001 +#define USB2PHY_L1 0x0002 + +/* USB_SSPHYLINK1 */ +#define DELAY_PHY_PWR_CHG BIT(1) + +/* USB_SSPHYLINK2 */ +#define pwd_dn_scale_mask 0x3ffe +#define pwd_dn_scale(x) ((x) << 1) + +/* USB_CSR_DUMMY1 */ +#define DYNAMIC_BURST 0x0001 + +/* USB_CSR_DUMMY2 */ +#define EP4_FULL_FC 0x0001 + +/* USB_DEV_STAT */ +#define STAT_SPEED_MASK 0x0006 +#define STAT_SPEED_HIGH 0x0000 +#define STAT_SPEED_FULL 0x0002 + +/* USB_FW_FIX_EN0 */ +#define FW_FIX_SUSPEND BIT(14) + +/* USB_FW_FIX_EN1 */ +#define FW_IP_RESET_EN BIT(9) + +/* USB_LPM_CONFIG */ +#define LPM_U1U2_EN BIT(0) + +/* USB_TX_AGG */ +#define TX_AGG_MAX_THRESHOLD 0x03 + +/* USB_RX_BUF_TH */ +#define RX_THR_SUPPER 0x0c350180 +#define RX_THR_HIGH 0x7a120180 +#define RX_THR_SLOW 0xffff0180 +#define RX_THR_B 0x00010001 + +/* USB_TX_DMA */ +#define TEST_MODE_DISABLE 0x00000001 +#define TX_SIZE_ADJUST1 0x00000100 + +/* USB_BMU_RESET */ +#define BMU_RESET_EP_IN 0x01 +#define BMU_RESET_EP_OUT 0x02 + +/* USB_BMU_CONFIG */ +#define ACT_ODMA BIT(1) + +/* USB_UPT_RXDMA_OWN */ +#define OWN_UPDATE BIT(0) +#define OWN_CLEAR BIT(1) + +/* USB_FW_TASK */ +#define FC_PATCH_TASK BIT(1) + +/* USB_RX_AGGR_NUM */ +#define RX_AGGR_NUM_MASK 0x1ff + +/* USB_UPS_CTRL */ +#define POWER_CUT 0x0100 + +/* USB_PM_CTRL_STATUS */ +#define RESUME_INDICATE 0x0001 + +/* USB_ECM_OPTION */ +#define BYPASS_MAC_RESET BIT(5) + +/* USB_CSTMR */ +#define FORCE_SUPER BIT(0) + +/* USB_MISC_2 */ +#define UPS_FORCE_PWR_DOWN BIT(0) + +/* USB_ECM_OP */ +#define EN_ALL_SPEED BIT(0) + +/* USB_GPHY_CTRL */ +#define GPHY_PATCH_DONE BIT(2) +#define BYPASS_FLASH BIT(5) +#define BACKUP_RESTRORE BIT(6) + +/* USB_SPEED_OPTION */ +#define RG_PWRDN_EN BIT(8) +#define ALL_SPEED_OFF BIT(9) + +/* USB_FW_CTRL */ +#define FLOW_CTRL_PATCH_OPT BIT(1) +#define AUTO_SPEEDUP BIT(3) +#define FLOW_CTRL_PATCH_2 BIT(8) + +/* USB_FC_TIMER */ +#define CTRL_TIMER_EN BIT(15) + +/* USB_USB_CTRL */ +#define CDC_ECM_EN BIT(3) +#define RX_AGG_DISABLE 0x0010 +#define RX_ZERO_EN 0x0080 + +/* USB_U2P3_CTRL */ +#define U2P3_ENABLE 0x0001 +#define RX_DETECT8 BIT(3) + +/* USB_POWER_CUT */ +#define PWR_EN 0x0001 +#define PHASE2_EN 0x0008 +#define UPS_EN BIT(4) +#define USP_PREWAKE BIT(5) + +/* USB_MISC_0 */ +#define PCUT_STATUS 0x0001 + +/* USB_RX_EARLY_TIMEOUT */ +#define COALESCE_SUPER 85000U +#define COALESCE_HIGH 250000U +#define COALESCE_SLOW 524280U + +/* USB_WDT1_CTRL */ +#define WTD1_EN BIT(0) + +/* USB_WDT11_CTRL */ +#define TIMER11_EN 0x0001 + +/* USB_LPM_CTRL */ +/* bit 4 ~ 5: fifo empty boundary */ +#define FIFO_EMPTY_1FB 0x30 /* 0x1fb * 64 = 32448 bytes */ +/* bit 2 ~ 3: LMP timer */ +#define LPM_TIMER_MASK 0x0c +#define LPM_TIMER_500MS 0x04 /* 500 ms */ +#define LPM_TIMER_500US 0x0c /* 500 us */ +#define ROK_EXIT_LPM 0x02 + +/* USB_AFE_CTRL2 */ +#define SEN_VAL_MASK 0xf800 +#define SEN_VAL_NORMAL 0xa000 +#define SEL_RXIDLE 0x0100 + +/* USB_UPHY_XTAL */ +#define OOBS_POLLING BIT(8) + +/* USB_UPS_CFG */ +#define SAW_CNT_1MS_MASK 0x0fff +#define MID_REVERSE BIT(5) /* RTL8156A */ + +/* USB_UPS_FLAGS */ +#define UPS_FLAGS_R_TUNE BIT(0) +#define UPS_FLAGS_EN_10M_CKDIV BIT(1) +#define UPS_FLAGS_250M_CKDIV BIT(2) +#define UPS_FLAGS_EN_ALDPS BIT(3) +#define UPS_FLAGS_CTAP_SHORT_DIS BIT(4) +#define UPS_FLAGS_SPEED_MASK (0xf << 16) +#define ups_flags_speed(x) ((x) << 16) +#define UPS_FLAGS_EN_EEE BIT(20) +#define UPS_FLAGS_EN_500M_EEE BIT(21) +#define UPS_FLAGS_EN_EEE_CKDIV BIT(22) +#define UPS_FLAGS_EEE_PLLOFF_100 BIT(23) +#define UPS_FLAGS_EEE_PLLOFF_GIGA BIT(24) +#define UPS_FLAGS_EEE_CMOD_LV_EN BIT(25) +#define UPS_FLAGS_EN_GREEN BIT(26) +#define UPS_FLAGS_EN_FLOW_CTR BIT(27) + +enum spd_duplex { + NWAY_10M_HALF, + NWAY_10M_FULL, + NWAY_100M_HALF, + NWAY_100M_FULL, + NWAY_1000M_FULL, + FORCE_10M_HALF, + FORCE_10M_FULL, + FORCE_100M_HALF, + FORCE_100M_FULL, + FORCE_1000M_FULL, + NWAY_2500M_FULL, +}; + +/* OCP_ALDPS_CONFIG */ +#define ENPWRSAVE 0x8000 +#define ENPDNPS 0x0200 +#define LINKENA 0x0100 +#define DIS_SDSAVE 0x0010 + +/* OCP_PHY_STATUS */ +#define PHY_STAT_MASK 0x0007 +#define PHY_STAT_EXT_INIT 2 +#define PHY_STAT_LAN_ON 3 +#define PHY_STAT_PWRDN 5 + +/* OCP_INTR_EN */ +#define INTR_SPEED_FORCE BIT(3) + +/* OCP_NCTL_CFG */ +#define PGA_RETURN_EN BIT(1) + +/* OCP_POWER_CFG */ +#define EEE_CLKDIV_EN 0x8000 +#define EN_ALDPS 0x0004 +#define EN_10M_PLLOFF 0x0001 + +/* OCP_EEE_CONFIG1 */ +#define RG_TXLPI_MSK_HFDUP 0x8000 +#define RG_MATCLR_EN 0x4000 +#define EEE_10_CAP 0x2000 +#define EEE_NWAY_EN 0x1000 +#define TX_QUIET_EN 0x0200 +#define RX_QUIET_EN 0x0100 +#define sd_rise_time_mask 0x0070 +#define sd_rise_time(x) (MIN(x, 7) << 4) /* bit 4 ~ 6 */ +#define RG_RXLPI_MSK_HFDUP 0x0008 +#define SDFALLTIME 0x0007 /* bit 0 ~ 2 */ + +/* OCP_EEE_CONFIG2 */ +#define RG_LPIHYS_NUM 0x7000 /* bit 12 ~ 15 */ +#define RG_DACQUIET_EN 0x0400 +#define RG_LDVQUIET_EN 0x0200 +#define RG_CKRSEL 0x0020 +#define RG_EEEPRG_EN 0x0010 + +/* OCP_EEE_CONFIG3 */ +#define fast_snr_mask 0xff80 +#define fast_snr(x) (MIN(x, 0x1ff) << 7) /* bit 7 ~ 15 */ +#define RG_LFS_SEL 0x0060 /* bit 6 ~ 5 */ +#define MSK_PH 0x0006 /* bit 0 ~ 3 */ + +/* OCP_EEE_AR */ +/* bit[15:14] function */ +#define FUN_ADDR 0x0000 +#define FUN_DATA 0x4000 +/* bit[4:0] device addr */ + +/* OCP_EEE_CFG */ +#define CTAP_SHORT_EN 0x0040 +#define EEE10_EN 0x0010 + +/* OCP_DOWN_SPEED */ +#define EN_EEE_CMODE BIT(14) +#define EN_EEE_1000 BIT(13) +#define EN_EEE_100 BIT(12) +#define EN_10M_CLKDIV BIT(11) +#define EN_10M_BGOFF 0x0080 + +/* OCP_10GBT_CTRL */ +#define RTL_ADV2_5G_F_R BIT(5) /* Advertise 2.5GBASE-T fast-retrain */ + +/* OCP_PHY_STATE */ +#define TXDIS_STATE 0x01 +#define ABD_STATE 0x02 + +/* OCP_PHY_PATCH_STAT */ +#define PATCH_READY BIT(6) + +/* OCP_PHY_PATCH_CMD */ +#define PATCH_REQUEST BIT(4) + +/* OCP_PHY_LOCK */ +#define PATCH_LOCK BIT(0) + +/* OCP_ADC_CFG */ +#define CKADSEL_L 0x0100 +#define ADC_EN 0x0080 +#define EN_EMI_L 0x0040 + +/* OCP_SYSCLK_CFG */ +#define sysclk_div_expo(x) (MIN(x, 5) << 8) +#define clk_div_expo(x) (MIN(x, 5) << 4) + +/* SRAM_GREEN_CFG */ +#define GREEN_ETH_EN BIT(15) +#define R_TUNE_EN BIT(11) + +/* SRAM_LPF_CFG */ +#define LPF_AUTO_TUNE 0x8000 + +/* SRAM_10M_AMP1 */ +#define GDAC_IB_UPALL 0x0008 + +/* SRAM_10M_AMP2 */ +#define AMP_DN 0x0200 + +/* SRAM_IMPEDANCE */ +#define RX_DRIVING_MASK 0x6000 + +/* SRAM_PHY_LOCK */ +#define PHY_PATCH_LOCK 0x0001 + +/* MAC PASSTHRU */ +#define AD_MASK 0xfee0 +#define BND_MASK 0x0004 +#define BD_MASK 0x0001 +#define EFUSE 0xcfdb +#define PASS_THRU_MASK 0x1 + +#define BP4_SUPER_ONLY 0x1578 /* RTL_VER_04 only */ + +enum rtl_register_content { + _2500bps = BIT(10), + _1250bps = BIT(9), + _500bps = BIT(8), + _tx_flow = BIT(6), + _rx_flow = BIT(5), + _1000bps = 0x10, + _100bps = 0x08, + _10bps = 0x04, + LINK_STATUS = 0x02, + FULL_DUP = 0x01, +}; + +#define is_speed_2500(_speed) (((_speed) & (_2500bps | LINK_STATUS)) == (_2500bps | LINK_STATUS)) +#define is_flow_control(_speed) (((_speed) & (_tx_flow | _rx_flow)) == (_tx_flow | _rx_flow)) + +#define RTL8152_MAX_TX 4 +#define RTL8152_MAX_RX 10 +#define INTBUFSIZE 2 +#define TX_ALIGN 4 +#define RX_ALIGN 8 + +#define RTL8152_RX_MAX_PENDING 4096 +#define RTL8152_RXFG_HEADSZ 256 + +#define INTR_LINK 0x0004 + +#define VLAN_ETH_HLEN 18 +#define ETH_FCS_LEN 4 +#define VLAN_ETH_FRAME_LEN 1514 + +#define RTL8152_RMS (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN) +#define RTL8153_RMS RTL8153_MAX_PACKET +#define mtu_to_size(m) ((m) + VLAN_ETH_HLEN + ETH_FCS_LEN) +#define size_to_mtu(s) ((s)-VLAN_ETH_HLEN - ETH_FCS_LEN) +#define rx_reserved_size(x) (mtu_to_size(x) + sizeof(struct rx_desc) + RX_ALIGN) + +struct rx_desc { + uint32_t opts1; +#define RD_CRC BIT(15) +#define RX_LEN_MASK 0x7fff + + uint32_t opts2; +#define RD_UDP_CS BIT(23) +#define RD_TCP_CS BIT(22) +#define RD_IPV6_CS BIT(20) +#define RD_IPV4_CS BIT(19) + + uint32_t opts3; +#define IPF BIT(23) /* IP checksum fail */ +#define UDPF BIT(22) /* UDP checksum fail */ +#define TCPF BIT(21) /* TCP checksum fail */ +#define RX_VLAN_TAG BIT(16) + + uint32_t opts4; + uint32_t opts5; + uint32_t opts6; +}; + +struct tx_desc { + uint32_t opts1; +#define TX_FS BIT(31) /* First segment of a packet */ +#define TX_LS BIT(30) /* Final segment of a packet */ +#define LGSEND BIT(29) +#define GTSENDV4 BIT(28) +#define GTSENDV6 BIT(27) +#define GTTCPHO_SHIFT 18 +#define GTTCPHO_MAX 0x7fU +#define TX_LEN_MAX 0x3ffffU + + uint32_t opts2; +#define UDP_CS BIT(31) /* Calculate UDP/IP checksum */ +#define TCP_CS BIT(30) /* Calculate TCP/IP checksum */ +#define IPV4_CS BIT(29) /* Calculate IPv4 checksum */ +#define IPV6_CS BIT(28) /* Calculate IPv6 checksum */ +#define MSS_SHIFT 17 +#define MSS_MAX 0x7ffU +#define TCPHO_SHIFT 17 +#define TCPHO_MAX 0x7ffU +#define TX_VLAN_TAG BIT(16) +}; + +enum rtl_version { + RTL_VER_UNKNOWN = 0, + RTL_VER_01, + RTL_VER_02, + RTL_VER_03, + RTL_VER_04, + RTL_VER_05, + RTL_VER_06, + RTL_VER_07, + RTL_VER_08, + RTL_VER_09, + + RTL_TEST_01, + RTL_VER_10, + RTL_VER_11, + RTL_VER_12, + RTL_VER_13, + RTL_VER_14, + RTL_VER_15, + + RTL_VER_MAX +}; + +/* mii.h */ +/* Generic MII registers. */ +#define MII_BMCR 0x00 /* Basic mode control register */ +#define MII_BMSR 0x01 /* Basic mode status register */ +#define MII_PHYSID1 0x02 /* PHYS ID 1 */ +#define MII_PHYSID2 0x03 /* PHYS ID 2 */ +#define MII_ADVERTISE 0x04 /* Advertisement control reg */ +#define MII_LPA 0x05 /* Link partner ability reg */ +#define MII_EXPANSION 0x06 /* Expansion register */ +#define MII_CTRL1000 0x09 /* 1000BASE-T control */ +#define MII_STAT1000 0x0a /* 1000BASE-T status */ +#define MII_MMD_CTRL 0x0d /* MMD Access Control Register */ +#define MII_MMD_DATA 0x0e /* MMD Access Data Register */ +#define MII_ESTATUS 0x0f /* Extended Status */ +#define MII_DCOUNTER 0x12 /* Disconnect counter */ +#define MII_FCSCOUNTER 0x13 /* False carrier counter */ +#define MII_NWAYTEST 0x14 /* N-way auto-neg test reg */ +#define MII_RERRCOUNTER 0x15 /* Receive error counter */ +#define MII_SREVISION 0x16 /* Silicon revision */ +#define MII_RESV1 0x17 /* Reserved... */ +#define MII_LBRERROR 0x18 /* Lpback, rx, bypass error */ +#define MII_PHYADDR 0x19 /* PHY address */ +#define MII_RESV2 0x1a /* Reserved... */ +#define MII_TPISTATUS 0x1b /* TPI status for 10mbps */ +#define MII_NCONFIG 0x1c /* Network interface config */ + +/* Basic mode control register. */ +#define BMCR_RESV 0x003f /* Unused... */ +#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ +#define BMCR_CTST 0x0080 /* Collision test */ +#define BMCR_FULLDPLX 0x0100 /* Full duplex */ +#define BMCR_ANRESTART 0x0200 /* Auto negotiation restart */ +#define BMCR_ISOLATE 0x0400 /* Isolate data paths from MII */ +#define BMCR_PDOWN 0x0800 /* Enable low power state */ +#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ +#define BMCR_SPEED100 0x2000 /* Select 100Mbps */ +#define BMCR_LOOPBACK 0x4000 /* TXD loopback bits */ +#define BMCR_RESET 0x8000 /* Reset to default state */ +#define BMCR_SPEED10 0x0000 /* Select 10Mbps */ + +/* Basic mode status register. */ +#define BMSR_ERCAP 0x0001 /* Ext-reg capability */ +#define BMSR_JCD 0x0002 /* Jabber detected */ +#define BMSR_LSTATUS 0x0004 /* Link status */ +#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ +#define BMSR_RFAULT 0x0010 /* Remote fault detected */ +#define BMSR_ANEGCOMPLETE 0x0020 /* Auto-negotiation complete */ +#define BMSR_RESV 0x00c0 /* Unused... */ +#define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ +#define BMSR_100HALF2 0x0200 /* Can do 100BASE-T2 HDX */ +#define BMSR_100FULL2 0x0400 /* Can do 100BASE-T2 FDX */ +#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ +#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ +#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ +#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ +#define BMSR_100BASE4 0x8000 /* Can do 100mbps, 4k packets */ + +/* Advertisement control register. */ +#define ADVERTISE_SLCT 0x001f /* Selector bits */ +#define ADVERTISE_CSMA 0x0001 /* Only selector supported */ +#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ +#define ADVERTISE_1000XFULL 0x0020 /* Try for 1000BASE-X full-duplex */ +#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ +#define ADVERTISE_1000XHALF 0x0040 /* Try for 1000BASE-X half-duplex */ +#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ +#define ADVERTISE_1000XPAUSE 0x0080 /* Try for 1000BASE-X pause */ +#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ +#define ADVERTISE_1000XPSE_ASYM 0x0100 /* Try for 1000BASE-X asym pause */ +#define ADVERTISE_100BASE4 0x0200 /* Try for 100mbps 4k packets */ +#define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ +#define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymetric pause */ +#define ADVERTISE_RESV 0x1000 /* Unused... */ +#define ADVERTISE_RFAULT 0x2000 /* Say we can detect faults */ +#define ADVERTISE_LPACK 0x4000 /* Ack link partners response */ +#define ADVERTISE_NPAGE 0x8000 /* Next page bit */ + +#define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | \ + ADVERTISE_CSMA) +#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ + ADVERTISE_100HALF | ADVERTISE_100FULL) + +/* 1000BASE-T Control register */ +#define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex */ +#define ADVERTISE_1000HALF 0x0100 /* Advertise 1000BASE-T half duplex */ +#define CTL1000_AS_MASTER 0x0800 +#define CTL1000_ENABLE_MASTER 0x1000 + +/* ethtool.h */ +/* The forced speed, 10Mb, 100Mb, gigabit. */ +#define SPEED_10 10 +#define SPEED_100 100 +#define SPEED_1000 1000 + +#define SPEED_UNKNOWN -1 + +/* Duplex, half or full. */ +#define DUPLEX_HALF 0x00 +#define DUPLEX_FULL 0x01 +#define DUPLEX_UNKNOWN 0xff + +/* Enable or disable autonegotiation. */ +#define AUTONEG_DISABLE 0x00 +#define AUTONEG_ENABLE 0x01 + +static int usbh_rtl8152_read_regs(struct usbh_rtl8152 *rtl8152_class, + uint16_t value, + uint16_t index, + uint16_t size, + void *data) +{ + struct usb_setup_packet *setup; + int ret; + + if (!rtl8152_class || !rtl8152_class->hport) { + return -USB_ERR_INVAL; + } + setup = rtl8152_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = RTL8152_REQ_GET_REGS; + setup->wValue = value; + setup->wIndex = index; + setup->wLength = size; + + ret = usbh_control_transfer(rtl8152_class->hport, setup, g_rtl8152_buf); + if (ret < 8) { + return ret; + } + memcpy(data, g_rtl8152_buf, MIN(ret - 8, size)); + + return ret; +} + +static int usbh_rtl8152_write_regs(struct usbh_rtl8152 *rtl8152_class, + uint16_t value, + uint16_t index, + uint16_t size, + void *data) +{ + struct usb_setup_packet *setup; + + if (!rtl8152_class || !rtl8152_class->hport) { + return -USB_ERR_INVAL; + } + setup = rtl8152_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = RTL8152_REQ_SET_REGS; + setup->wValue = value; + setup->wIndex = index; + setup->wLength = size; + + memcpy(g_rtl8152_buf, data, size); + return usbh_control_transfer(rtl8152_class->hport, setup, g_rtl8152_buf); +} + +static int generic_ocp_read(struct usbh_rtl8152 *tp, uint16_t index, uint16_t size, + void *data, uint16_t type) +{ + uint16_t limit = 64; + int ret = 0; + uint8_t *buf = data; + + /* both size and indix must be 4 bytes align */ + if ((size & 3) || !size || (index & 3) || !buf) + return -USB_ERR_INVAL; + + if ((uint32_t)index + (uint32_t)size > 0xffff) + return -USB_ERR_INVAL; + + while (size) { + if (size > limit) { + ret = usbh_rtl8152_read_regs(tp, index, type, limit, buf); + if (ret < 0) + break; + + index += limit; + buf += limit; + size -= limit; + } else { + ret = usbh_rtl8152_read_regs(tp, index, type, size, buf); + if (ret < 0) + break; + + index += size; + buf += size; + size = 0; + break; + } + } + + return ret; +} + +static int generic_ocp_write(struct usbh_rtl8152 *tp, uint16_t index, uint16_t byteen, + uint16_t size, void *data, uint16_t type) +{ + int ret = -USB_ERR_INVAL; + uint16_t byteen_start, byteen_end, byen; + uint16_t limit = 512; + uint8_t *buf = data; + + /* both size and indix must be 4 bytes align */ + if ((size & 3) || !size || (index & 3) || !buf) + return ret; + + if ((uint32_t)index + (uint32_t)size > 0xffff) + return ret; + + byteen_start = byteen & BYTE_EN_START_MASK; + byteen_end = byteen & BYTE_EN_END_MASK; + + byen = byteen_start | (byteen_start << 4); + + /* Split the first DWORD if the byte_en is not 0xff */ + if (byen != BYTE_EN_DWORD) { + ret = usbh_rtl8152_write_regs(tp, index, type | byen, 4, buf); + if (ret < 0) + goto error1; + + index += 4; + buf += 4; + size -= 4; + } + + if (size) { + byen = byteen_end | (byteen_end >> 4); + + /* Split the last DWORD if the byte_en is not 0xff */ + if (byen != BYTE_EN_DWORD) + size -= 4; + + while (size) { + if (size > limit) { + ret = usbh_rtl8152_write_regs(tp, index, + type | BYTE_EN_DWORD, + limit, buf); + if (ret < 0) + goto error1; + + index += limit; + buf += limit; + size -= limit; + } else { + ret = usbh_rtl8152_write_regs(tp, index, + type | BYTE_EN_DWORD, + size, buf); + if (ret < 0) + goto error1; + + index += size; + buf += size; + size = 0; + break; + } + } + + /* Set the last DWORD */ + if (byen != BYTE_EN_DWORD) + ret = usbh_rtl8152_write_regs(tp, index, type | byen, 4, buf); + } + +error1: + + return ret; +} + +static inline int pla_ocp_read(struct usbh_rtl8152 *tp, uint16_t index, uint16_t size, void *data) +{ + return generic_ocp_read(tp, index, size, data, MCU_TYPE_PLA); +} + +static inline int pla_ocp_write(struct usbh_rtl8152 *tp, uint16_t index, uint16_t byteen, uint16_t size, void *data) +{ + return generic_ocp_write(tp, index, byteen, size, data, MCU_TYPE_PLA); +} + +static inline int usb_ocp_write(struct usbh_rtl8152 *tp, uint16_t index, uint16_t byteen, uint16_t size, void *data) +{ + return generic_ocp_write(tp, index, byteen, size, data, MCU_TYPE_USB); +} + +static uint32_t ocp_read_dword(struct usbh_rtl8152 *tp, uint16_t type, uint16_t index) +{ + uint32_t data = 0; + + generic_ocp_read(tp, index, sizeof(data), &data, type); + + return data; +} + +static void ocp_write_dword(struct usbh_rtl8152 *tp, uint16_t type, uint16_t index, uint32_t data) +{ + uint32_t tmp = data; + + generic_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(tmp), &tmp, type); +} + +static uint16_t ocp_read_word(struct usbh_rtl8152 *tp, uint16_t type, uint16_t index) +{ + uint32_t data; + uint32_t tmp = 0; + uint16_t byen = BYTE_EN_WORD; + uint8_t shift = index & 2; + + index &= ~3; + byen <<= shift; + + generic_ocp_read(tp, index, sizeof(tmp), &tmp, type | byen); + + data = tmp; + data >>= (shift * 8); + data &= 0xffff; + + return (uint16_t)data; +} + +static void ocp_write_word(struct usbh_rtl8152 *tp, uint16_t type, uint16_t index, uint32_t data) +{ + uint32_t mask = 0xffff; + uint32_t tmp; + uint16_t byen = BYTE_EN_WORD; + uint8_t shift = index & 2; + + data &= mask; + + if (index & 2) { + byen <<= shift; + mask <<= (shift * 8); + data <<= (shift * 8); + index &= ~3; + } + + tmp = data; + + generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); +} + +static uint8_t ocp_read_byte(struct usbh_rtl8152 *tp, uint16_t type, uint16_t index) +{ + uint32_t data; + uint32_t tmp = 0; + uint8_t shift = index & 3; + + index &= ~3; + + generic_ocp_read(tp, index, sizeof(tmp), &tmp, type); + + data = tmp; + data >>= (shift * 8); + data &= 0xff; + + return (uint8_t)data; +} + +static void ocp_write_byte(struct usbh_rtl8152 *tp, uint16_t type, uint16_t index, uint32_t data) +{ + uint32_t mask = 0xff; + uint32_t tmp; + uint16_t byen = BYTE_EN_BYTE; + uint8_t shift = index & 3; + + data &= mask; + + if (index & 3) { + byen <<= shift; + mask <<= (shift * 8); + data <<= (shift * 8); + index &= ~3; + } + + tmp = data; + + generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); +} + +static uint16_t ocp_reg_read(struct usbh_rtl8152 *tp, uint16_t addr) +{ + uint16_t ocp_base, ocp_index; + + ocp_base = addr & 0xf000; + if (ocp_base != tp->ocp_base) { + ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, ocp_base); + tp->ocp_base = ocp_base; + } + + ocp_index = (addr & 0x0fff) | 0xb000; + return ocp_read_word(tp, MCU_TYPE_PLA, ocp_index); +} + +static void ocp_reg_write(struct usbh_rtl8152 *tp, uint16_t addr, uint16_t data) +{ + uint16_t ocp_base, ocp_index; + + ocp_base = addr & 0xf000; + if (ocp_base != tp->ocp_base) { + ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, ocp_base); + tp->ocp_base = ocp_base; + } + + ocp_index = (addr & 0x0fff) | 0xb000; + ocp_write_word(tp, MCU_TYPE_PLA, ocp_index, data); +} + +static inline void r8152_mdio_write(struct usbh_rtl8152 *tp, uint32_t reg_addr, uint32_t value) +{ + ocp_reg_write(tp, OCP_BASE_MII + reg_addr * 2, value); +} + +static inline int r8152_mdio_read(struct usbh_rtl8152 *tp, uint32_t reg_addr) +{ + return ocp_reg_read(tp, OCP_BASE_MII + reg_addr * 2); +} + +static uint8_t usbh_rtl8152_get_version(struct usbh_rtl8152 *rtl8152_class) +{ + uint8_t version; + uint32_t temp = 0; + uint32_t ocp_data; + + usbh_rtl8152_read_regs(rtl8152_class, PLA_TCR0, MCU_TYPE_PLA, 4, &temp); + + ocp_data = (temp >> 16) & VERSION_MASK; + switch (ocp_data) { + case 0x4c00: + version = RTL_VER_01; + break; + case 0x4c10: + version = RTL_VER_02; + break; + case 0x5c00: + version = RTL_VER_03; + break; + case 0x5c10: + version = RTL_VER_04; + break; + case 0x5c20: + version = RTL_VER_05; + break; + case 0x5c30: + version = RTL_VER_06; + break; + case 0x4800: + version = RTL_VER_07; + break; + case 0x6000: + version = RTL_VER_08; + break; + case 0x6010: + version = RTL_VER_09; + break; + case 0x7010: + version = RTL_TEST_01; + break; + case 0x7020: + version = RTL_VER_10; + break; + case 0x7030: + version = RTL_VER_11; + break; + case 0x7400: + version = RTL_VER_12; + break; + case 0x7410: + version = RTL_VER_13; + break; + case 0x6400: + version = RTL_VER_14; + break; + case 0x7420: + version = RTL_VER_15; + break; + default: + version = RTL_VER_UNKNOWN; + break; + } + + return version; +} + +#define WAKE_PHY (1 << 0) +#define WAKE_UCAST (1 << 1) +#define WAKE_MCAST (1 << 2) +#define WAKE_BCAST (1 << 3) +#define WAKE_ARP (1 << 4) +#define WAKE_MAGIC (1 << 5) +#define WAKE_MAGICSECURE (1 << 6) /* only meaningful if WAKE_MAGIC */ +#define WAKE_FILTER (1 << 7) + +#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST) + +static uint32_t __rtl_get_wol(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + uint32_t wolopts = 0; + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CONFIG34); + if (ocp_data & LINK_ON_WAKE_EN) + wolopts |= WAKE_PHY; + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CONFIG5); + if (ocp_data & UWF_EN) + wolopts |= WAKE_UCAST; + if (ocp_data & BWF_EN) + wolopts |= WAKE_BCAST; + if (ocp_data & MWF_EN) + wolopts |= WAKE_MCAST; + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CFG_WOL); + if (ocp_data & MAGIC_EN) + wolopts |= WAKE_MAGIC; + + return wolopts; +} + +static void r8152_aldps_en(struct usbh_rtl8152 *tp, bool enable) +{ + if (enable) { + ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPWRSAVE | ENPDNPS | LINKENA | DIS_SDSAVE); + } else { + ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPDNPS | LINKENA | DIS_SDSAVE); + usb_osal_msleep(20); + } +} + +static void r8152_power_cut_en(struct usbh_rtl8152 *tp, bool enable) +{ + uint32_t ocp_data; + + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_UPS_CTRL); + if (enable) + ocp_data |= POWER_CUT; + else + ocp_data &= ~POWER_CUT; + ocp_write_word(tp, MCU_TYPE_USB, USB_UPS_CTRL, ocp_data); + + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS); + ocp_data &= ~RESUME_INDICATE; + ocp_write_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS, ocp_data); +} + +static void rtl_tally_reset(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY); + ocp_data |= TALLY_RESET; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data); +} + +static void r8152b_reset_packet_filter(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_FMC); + ocp_data &= ~FMC_FCR_MCU_EN; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_FMC, ocp_data); + ocp_data |= FMC_FCR_MCU_EN; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_FMC, ocp_data); +} + +static inline void r8153b_rx_agg_chg_indicate(struct usbh_rtl8152 *tp) +{ + ocp_write_byte(tp, MCU_TYPE_USB, USB_UPT_RXDMA_OWN, + OWN_UPDATE | OWN_CLEAR); +} + +static void rxdy_gated_en(struct usbh_rtl8152 *tp, bool enable) +{ + uint32_t ocp_data; + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MISC_1); + if (enable) + ocp_data |= RXDY_GATED_EN; + else + ocp_data &= ~RXDY_GATED_EN; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MISC_1, ocp_data); +} + +static inline uint16_t rtl8152_get_speed(struct usbh_rtl8152 *tp) +{ + return ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHYSTATUS); +} + +static void rtl_eee_plus_en(struct usbh_rtl8152 *tp, bool enable) +{ + uint32_t ocp_data; + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EEEP_CR); + if (enable) + ocp_data |= EEEP_CR_EEEP_TX; + else + ocp_data &= ~EEEP_CR_EEEP_TX; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEEP_CR, ocp_data); +} + +static void rtl_set_eee_plus(struct usbh_rtl8152 *tp) +{ + if (rtl8152_get_speed(tp) & _10bps) + rtl_eee_plus_en(tp, true); + else + rtl_eee_plus_en(tp, false); +} + +static void rtl8152_nic_reset(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + int i; + + switch (tp->version) { + case RTL_TEST_01: + case RTL_VER_10: + case RTL_VER_11: + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR); + ocp_data &= ~CR_TE; + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, ocp_data); + + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_BMU_RESET); + ocp_data &= ~BMU_RESET_EP_IN; + ocp_write_word(tp, MCU_TYPE_USB, USB_BMU_RESET, ocp_data); + + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); + ocp_data |= CDC_ECM_EN; + ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); + + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR); + ocp_data &= ~CR_RE; + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, ocp_data); + + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_BMU_RESET); + ocp_data |= BMU_RESET_EP_IN; + ocp_write_word(tp, MCU_TYPE_USB, USB_BMU_RESET, ocp_data); + + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); + ocp_data &= ~CDC_ECM_EN; + ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); + break; + + default: + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, CR_RST); + + for (i = 0; i < 1000; i++) { + if (!(ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR) & CR_RST)) + break; + usb_osal_msleep(400); + } + break; + } +} + +static void rtl_disable(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + int i; + + ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); + ocp_data &= ~RCR_ACPT_ALL; + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); + + rxdy_gated_en(tp, true); + + for (i = 0; i < 1000; i++) { + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); + if ((ocp_data & FIFO_EMPTY) == FIFO_EMPTY) + break; + usb_osal_msleep(1); + } + + for (i = 0; i < 1000; i++) { + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0) & TCR0_TX_EMPTY) + break; + usb_osal_msleep(1); + } + + rtl8152_nic_reset(tp); +} + +static void rtl_rx_vlan_en(struct usbh_rtl8152 *tp, bool enable) +{ + uint32_t ocp_data; + + switch (tp->version) { + case RTL_VER_01: + case RTL_VER_02: + case RTL_VER_03: + case RTL_VER_04: + case RTL_VER_05: + case RTL_VER_06: + case RTL_VER_07: + case RTL_VER_08: + case RTL_VER_09: + case RTL_VER_14: + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CPCR); + if (enable) + ocp_data |= CPCR_RX_VLAN; + else + ocp_data &= ~CPCR_RX_VLAN; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data); + break; + + case RTL_TEST_01: + case RTL_VER_10: + case RTL_VER_11: + case RTL_VER_12: + case RTL_VER_13: + case RTL_VER_15: + default: + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RCR1); + if (enable) + ocp_data |= OUTER_VLAN | INNER_VLAN; + else + ocp_data &= ~(OUTER_VLAN | INNER_VLAN); + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RCR1, ocp_data); + break; + } +} + +static void wait_oob_link_list_ready(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + int i; + + for (i = 0; i < 1000; i++) { + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); + if (ocp_data & LINK_LIST_READY) + break; + usb_osal_msleep(1); + } +} + +static void r8153_teredo_off(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + + switch (tp->version) { + case RTL_VER_01: + case RTL_VER_02: + case RTL_VER_03: + case RTL_VER_04: + case RTL_VER_05: + case RTL_VER_06: + case RTL_VER_07: + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG); + ocp_data &= ~(TEREDO_SEL | TEREDO_RS_EVENT_MASK | + OOB_TEREDO_EN); + ocp_write_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG, ocp_data); + break; + + case RTL_VER_08: + case RTL_VER_09: + case RTL_TEST_01: + case RTL_VER_10: + case RTL_VER_11: + case RTL_VER_12: + case RTL_VER_13: + case RTL_VER_14: + case RTL_VER_15: + default: + /* The bit 0 ~ 7 are relative with teredo settings. They are + * W1C (write 1 to clear), so set all 1 to disable it. + */ + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG, 0xff); + break; + } + + ocp_write_word(tp, MCU_TYPE_PLA, PLA_WDT6_CTRL, WDT6_SET_MODE); + ocp_write_word(tp, MCU_TYPE_PLA, PLA_REALWOW_TIMER, 0); + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TEREDO_TIMER, 0); +} + +static void r8152b_exit_oob(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + + ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); + ocp_data &= ~RCR_ACPT_ALL; + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); + + rxdy_gated_en(tp, true); + r8153_teredo_off(tp); + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML); + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, 0x00); + + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); + ocp_data &= ~NOW_IS_OOB; + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data); + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7); + ocp_data &= ~MCU_BORW_EN; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data); + + wait_oob_link_list_ready(tp); + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7); + ocp_data |= RE_INIT_LL; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data); + + wait_oob_link_list_ready(tp); + + rtl8152_nic_reset(tp); + + /* rx share fifo credit full threshold */ + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_NORMAL); + + if (tp->hport->speed == USB_SPEED_FULL || + tp->hport->speed == USB_SPEED_LOW) { + /* rx share fifo credit near full threshold */ + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, + RXFIFO_THR2_FULL); + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2, + RXFIFO_THR3_FULL); + } else { + /* rx share fifo credit near full threshold */ + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, + RXFIFO_THR2_HIGH); + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2, + RXFIFO_THR3_HIGH); + } + + /* TX share fifo free credit full threshold */ + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, TXFIFO_THR_NORMAL2); + + ocp_write_byte(tp, MCU_TYPE_USB, USB_TX_AGG, TX_AGG_MAX_THRESHOLD); + ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_HIGH); + ocp_write_dword(tp, MCU_TYPE_USB, USB_TX_DMA, + TEST_MODE_DISABLE | TX_SIZE_ADJUST1); + + rtl_rx_vlan_en(tp, true); + + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS); + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0); + ocp_data |= TCR0_AUTO_FIFO; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_TCR0, ocp_data); +} + +static void r8152b_enter_oob(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); + ocp_data &= ~NOW_IS_OOB; + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data); + + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_OOB); + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, RXFIFO_THR2_OOB); + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2, RXFIFO_THR3_OOB); + + rtl_disable(tp); + + wait_oob_link_list_ready(tp); + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7); + ocp_data |= RE_INIT_LL; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data); + + wait_oob_link_list_ready(tp); + + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS); + + rtl_rx_vlan_en(tp, true); + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_BDC_CR); + ocp_data |= ALDPS_PROXY_MODE; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_BDC_CR, ocp_data); + + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); + ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB; + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data); + + rxdy_gated_en(tp, false); + + ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); + ocp_data |= RCR_APM | RCR_AM | RCR_AB; + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); +} + +static void r8152b_init(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + uint16_t data; + + data = r8152_mdio_read(tp, MII_BMCR); + if (data & BMCR_PDOWN) { + data &= ~BMCR_PDOWN; + r8152_mdio_write(tp, MII_BMCR, data); + } + + r8152_aldps_en(tp, false); + + if (tp->version == RTL_VER_01) { + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE); + ocp_data &= ~LED_MODE_MASK; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data); + } + + r8152_power_cut_en(tp, false); + + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); + ocp_data |= TX_10M_IDLE_EN | PFM_PWM_SWITCH; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); + ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL); + ocp_data &= ~MCU_CLK_RATIO_MASK; + ocp_data |= MCU_CLK_RATIO | D3_CLK_GATED_EN; + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, ocp_data); + ocp_data = GPHY_STS_MSK | SPEED_DOWN_MSK | + SPDWN_RXDV_MSK | SPDWN_LINKCHG_MSK; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_GPHY_INTR_IMR, ocp_data); + + rtl_tally_reset(tp); + + /* enable rx aggregation */ + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); + ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); + ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); +} + +static int rtl_enable(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + + r8152b_reset_packet_filter(tp); + + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR); + ocp_data |= CR_RE | CR_TE; + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, ocp_data); + + switch (tp->version) { + case RTL_VER_01: + case RTL_VER_02: + case RTL_VER_03: + case RTL_VER_04: + case RTL_VER_05: + case RTL_VER_06: + case RTL_VER_07: + break; + default: + r8153b_rx_agg_chg_indicate(tp); + break; + } + + rxdy_gated_en(tp, false); + + return 0; +} + +static int rtl8152_enable(struct usbh_rtl8152 *tp) +{ + rtl_set_eee_plus(tp); + + return rtl_enable(tp); +} + +static void rtl8152_disable(struct usbh_rtl8152 *tp) +{ + r8152_aldps_en(tp, false); + rtl_disable(tp); + r8152_aldps_en(tp, true); +} + +static void rtl8152_up(struct usbh_rtl8152 *tp) +{ + r8152_aldps_en(tp, false); + r8152b_exit_oob(tp); + r8152_aldps_en(tp, true); +} + +static void rtl8152_down(struct usbh_rtl8152 *tp) +{ + r8152_power_cut_en(tp, false); + r8152_aldps_en(tp, false); + r8152b_enter_oob(tp); + r8152_aldps_en(tp, true); +} + +static int rtl_ops_init(struct usbh_rtl8152 *tp) +{ + struct rtl_ops *ops = &tp->rtl_ops; + int ret = 0; + + switch (tp->version) { + case RTL_VER_01: + case RTL_VER_02: + case RTL_VER_07: + ops->init = r8152b_init; + ops->enable = rtl8152_enable; + ops->disable = rtl8152_disable; + ops->up = rtl8152_up; + ops->down = rtl8152_down; + // ops->unload = rtl8152_unload; + // ops->eee_get = r8152_get_eee; + // ops->eee_set = r8152_set_eee; + // ops->in_nway = rtl8152_in_nway; + // ops->hw_phy_cfg = r8152b_hw_phy_cfg; + // ops->autosuspend_en = rtl_runtime_suspend_enable; + tp->rx_buf_sz = 16 * 1024; + tp->eee_en = true; + //tp->eee_adv = MDIO_EEE_100TX; + break; + + // case RTL_VER_03: + // case RTL_VER_04: + // case RTL_VER_05: + // case RTL_VER_06: + // break; + + // case RTL_VER_08: + // case RTL_VER_09: + // break; + + // case RTL_VER_11: + // case RTL_VER_10: + // break; + + // case RTL_VER_12: + // case RTL_VER_13: + // case RTL_VER_15: + // break; + + // case RTL_VER_14: + // break; + + default: + ret = -USB_ERR_NODEV; + USB_LOG_ERR("Unsupport rtl version:%d\r\n", tp->version); + break; + } + + return ret; +} + +static void rtl8152_set_rx_mode(struct usbh_rtl8152 *tp) +{ + uint32_t ocp_data; + uint32_t mc_filter[2]; + + ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); + ocp_data &= ~RCR_ACPT_ALL; + ocp_data |= RCR_AB | RCR_APM; + + ocp_data |= RCR_AM; + mc_filter[1] = 0xffffffff; + mc_filter[0] = 0xffffffff; + + pla_ocp_write(tp, PLA_MAR, BYTE_EN_DWORD, sizeof(mc_filter), mc_filter); + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); +} + +static int rtl8152_set_speed(struct usbh_rtl8152 *tp, uint8_t autoneg, uint16_t speed, uint8_t duplex) +{ + uint16_t bmcr, anar, gbcr; + + anar = r8152_mdio_read(tp, MII_ADVERTISE); + anar &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL | + ADVERTISE_100HALF | ADVERTISE_100FULL); + if (tp->supports_gmii) { + gbcr = r8152_mdio_read(tp, MII_CTRL1000); + gbcr &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF); + } else { + gbcr = 0; + } + + if (autoneg == AUTONEG_DISABLE) { + if (speed == SPEED_10) { + bmcr = 0; + anar |= ADVERTISE_10HALF | ADVERTISE_10FULL; + } else if (speed == SPEED_100) { + bmcr = BMCR_SPEED100; + anar |= ADVERTISE_100HALF | ADVERTISE_100FULL; + } else if (speed == SPEED_1000 && tp->supports_gmii) { + bmcr = BMCR_SPEED1000; + gbcr |= ADVERTISE_1000FULL | ADVERTISE_1000HALF; + } else { + return -USB_ERR_INVAL; + } + + if (duplex == DUPLEX_FULL) + bmcr |= BMCR_FULLDPLX; + } else { + if (speed == SPEED_10) { + if (duplex == DUPLEX_FULL) + anar |= ADVERTISE_10HALF | ADVERTISE_10FULL; + else + anar |= ADVERTISE_10HALF; + } else if (speed == SPEED_100) { + if (duplex == DUPLEX_FULL) { + anar |= ADVERTISE_10HALF | ADVERTISE_10FULL; + anar |= ADVERTISE_100HALF | ADVERTISE_100FULL; + } else { + anar |= ADVERTISE_10HALF; + anar |= ADVERTISE_100HALF; + } + } else if (speed == SPEED_1000 && tp->supports_gmii) { + if (duplex == DUPLEX_FULL) { + anar |= ADVERTISE_10HALF | ADVERTISE_10FULL; + anar |= ADVERTISE_100HALF | ADVERTISE_100FULL; + gbcr |= ADVERTISE_1000FULL | ADVERTISE_1000HALF; + } else { + anar |= ADVERTISE_10HALF; + anar |= ADVERTISE_100HALF; + gbcr |= ADVERTISE_1000HALF; + } + } else { + return -USB_ERR_INVAL; + } + + bmcr = BMCR_ANENABLE | BMCR_ANRESTART | BMCR_RESET; + } + + if (tp->supports_gmii) + r8152_mdio_write(tp, MII_CTRL1000, gbcr); + + r8152_mdio_write(tp, MII_ADVERTISE, anar); + r8152_mdio_write(tp, MII_BMCR, bmcr); + + return 0; +} + +int r8152_write_hwaddr(struct usbh_rtl8152 *tp, unsigned char *mac) +{ + unsigned char enetaddr[8] = { 0 }; + memcpy(enetaddr, mac, 6); + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_CONFIG); + pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, enetaddr); + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML); + return 0; +} + +int usbh_rtl8152_get_connect_status(struct usbh_rtl8152 *rtl8152_class) +{ + int ret; + + usbh_int_urb_fill(&rtl8152_class->intin_urb, rtl8152_class->hport, rtl8152_class->intin, g_rtl8152_inttx_buffer, 2, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&rtl8152_class->intin_urb); + if (ret < 0) { + return ret; + } + + if (g_rtl8152_inttx_buffer[0] & INTR_LINK) { + rtl8152_class->connect_status = true; + } else { + rtl8152_class->connect_status = false; + } + return 0; +} + +static int usbh_rtl8152_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + char mac_buffer[12]; + int ret; + + struct usbh_rtl8152 *rtl8152_class = &g_rtl8152_class; + + memset(rtl8152_class, 0, sizeof(struct usbh_rtl8152)); + + rtl8152_class->hport = hport; + rtl8152_class->intf = intf; + + hport->config.intf[intf].priv = rtl8152_class; + + rtl8152_class->version = usbh_rtl8152_get_version(rtl8152_class); + + if (rtl8152_class->version == RTL_VER_UNKNOWN) { + USB_LOG_ERR("Unknown version 0x%04x\r\n", rtl8152_class->version); + return -USB_ERR_NOTSUPP; + } else { + USB_LOG_INFO("rtl8152 version 0x%04x\r\n", rtl8152_class->version); + } + + /* MTU range: 68 - 1500 or 9194 */ + rtl8152_class->min_mtu = 68; + switch (rtl8152_class->version) { + case RTL_VER_03: + case RTL_VER_04: + case RTL_VER_05: + case RTL_VER_06: + case RTL_VER_08: + case RTL_VER_09: + case RTL_VER_14: + rtl8152_class->max_mtu = size_to_mtu(9 * 1024); + break; + case RTL_VER_10: + case RTL_VER_11: + rtl8152_class->max_mtu = size_to_mtu(15 * 1024); + break; + case RTL_VER_12: + case RTL_VER_13: + case RTL_VER_15: + rtl8152_class->max_mtu = size_to_mtu(16 * 1024); + break; + case RTL_VER_01: + case RTL_VER_02: + case RTL_VER_07: + default: + rtl8152_class->max_mtu = 1500; + break; + } + + rtl8152_class->saved_wolopts = __rtl_get_wol(rtl8152_class); + if (rtl_ops_init(rtl8152_class) < 0) { + return -USB_ERR_NODEV; + } + + rtl8152_class->rtl_ops.init(rtl8152_class); + rtl8152_class->rtl_ops.up(rtl8152_class); + + if (rtl8152_class->rx_buf_sz > CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE) { + USB_LOG_ERR("rx_buf_sz is overflow, default is %d\r\n", (unsigned int)CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE); + return -USB_ERR_NOMEM; + } + + memset(mac_buffer, 0, 12); + ret = usbh_get_string_desc(rtl8152_class->hport, 3, (uint8_t *)mac_buffer, 12); + if (ret < 0) { + return ret; + } + + for (int i = 0, j = 0; i < 12; i += 2, j++) { + char byte_str[3]; + byte_str[0] = mac_buffer[i]; + byte_str[1] = mac_buffer[i + 1]; + byte_str[2] = '\0'; + + uint32_t byte = strtoul(byte_str, NULL, 16); + rtl8152_class->mac[j] = (unsigned char)byte; + } + + r8152_write_hwaddr(rtl8152_class, rtl8152_class->mac); + + USB_LOG_INFO("RTL8152 MAC address %02x:%02x:%02x:%02x:%02x:%02x\r\n", + rtl8152_class->mac[0], + rtl8152_class->mac[1], + rtl8152_class->mac[2], + rtl8152_class->mac[3], + rtl8152_class->mac[4], + rtl8152_class->mac[5]); + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(rtl8152_class->intin, ep_desc); + } else { + return -USB_ERR_NOTSUPP; + } + } else { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(rtl8152_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(rtl8152_class->bulkout, ep_desc); + } + } + } + + strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN); + + USB_LOG_INFO("Register RTL8152 Class:%s\r\n", hport->config.intf[intf].devname); + + usbh_rtl8152_run(rtl8152_class); + return 0; +} + +static int usbh_rtl8152_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_rtl8152 *rtl8152_class = (struct usbh_rtl8152 *)hport->config.intf[intf].priv; + + if (rtl8152_class) { + if (rtl8152_class->bulkin) { + usbh_kill_urb(&rtl8152_class->bulkin_urb); + } + + if (rtl8152_class->bulkout) { + usbh_kill_urb(&rtl8152_class->bulkout_urb); + } + + if (rtl8152_class->intin) { + usbh_kill_urb(&rtl8152_class->intin_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister rtl8152 Class:%s\r\n", hport->config.intf[intf].devname); + usbh_rtl8152_stop(rtl8152_class); + } + + memset(rtl8152_class, 0, sizeof(struct usbh_rtl8152)); + } + + return ret; +} + +void usbh_rtl8152_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + uint32_t g_rtl8152_rx_length; + int ret; + uint16_t len; + uint16_t data_offset; +#if CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE <= (16 * 1024) + uint32_t transfer_size = CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE; +#else + uint32_t transfer_size = (16 * 1024); +#endif + + (void)CONFIG_USB_OSAL_THREAD_GET_ARGV; + USB_LOG_INFO("Create rtl8152 rx thread\r\n"); + // clang-format off +find_class: + // clang-format on + g_rtl8152_class.connect_status = false; + if (usbh_find_class_instance("/dev/rtl8152") == NULL) { + goto delete; + } + + while (g_rtl8152_class.connect_status == false) { + ret = usbh_rtl8152_get_connect_status(&g_rtl8152_class); + if (ret < 0) { + usb_osal_msleep(100); + goto find_class; + } + usb_osal_msleep(128); + } + + if (g_rtl8152_class.rtl_ops.enable) { + g_rtl8152_class.rtl_ops.enable(&g_rtl8152_class); + } else { + goto delete; + } + + rtl8152_set_rx_mode(&g_rtl8152_class); + rtl8152_set_speed(&g_rtl8152_class, AUTONEG_ENABLE, g_rtl8152_class.supports_gmii ? SPEED_1000 : SPEED_100, DUPLEX_FULL); + + g_rtl8152_rx_length = 0; + while (1) { + usbh_bulk_urb_fill(&g_rtl8152_class.bulkin_urb, g_rtl8152_class.hport, g_rtl8152_class.bulkin, &g_rtl8152_rx_buffer[g_rtl8152_rx_length], transfer_size, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&g_rtl8152_class.bulkin_urb); + if (ret < 0) { + goto find_class; + } + + g_rtl8152_rx_length += g_rtl8152_class.bulkin_urb.actual_length; + + /* A transfer is complete because last packet is a short packet. + * Short packet is not zero, match g_rtl8152_rx_length % USB_GET_MAXPACKETSIZE(g_rtl8152_class.bulkin->wMaxPacketSize). + * Short packet is zero, check if g_rtl8152_class.bulkin_urb.actual_length < transfer_size, for example transfer is complete with size is 1024 < 2048. + */ + if (g_rtl8152_rx_length % USB_GET_MAXPACKETSIZE(g_rtl8152_class.bulkin->wMaxPacketSize) || + (g_rtl8152_class.bulkin_urb.actual_length < transfer_size)) { + data_offset = 0; + + USB_LOG_DBG("rxlen:%d\r\n", g_rtl8152_rx_length); + while (g_rtl8152_rx_length > 0) { + struct rx_desc *rx_desc = (struct rx_desc *)&g_rtl8152_rx_buffer[data_offset]; + + len = rx_desc->opts1 & RX_LEN_MASK; + + USB_LOG_DBG("data_offset:%d, eth len:%d\r\n", data_offset, len); + + uint8_t *buf = (uint8_t *)&g_rtl8152_rx_buffer[data_offset + sizeof(struct rx_desc)]; + usbh_rtl8152_eth_input(buf, len); + + data_offset += (len + sizeof(struct rx_desc)); + g_rtl8152_rx_length -= (len + sizeof(struct rx_desc)); + + if (len & (RX_ALIGN - 1)) { + data_offset += (RX_ALIGN - (len & (RX_ALIGN - 1))); + g_rtl8152_rx_length -= (RX_ALIGN - (len & (RX_ALIGN - 1))); + } + } + } else { +#if CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE <= (16 * 1024) + if (g_rtl8152_rx_length == CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE) { +#else + if ((g_rtl8152_rx_length + (16 * 1024)) > CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE) { +#endif + USB_LOG_ERR("Rx packet is overflow, please reduce tcp window size or increase CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE\r\n"); + while (1) { + } + } + } + } + // clang-format off +delete: + USB_LOG_INFO("Delete rtl8152 rx thread\r\n"); + usb_osal_thread_delete(NULL); + // clang-format on +} + +uint8_t *usbh_rtl8152_get_eth_txbuf(void) +{ + return (g_rtl8152_tx_buffer + sizeof(struct tx_desc)); +} + +int usbh_rtl8152_eth_output(uint32_t buflen) +{ + struct tx_desc *tx_desc; + + if (g_rtl8152_class.connect_status == false) { + return -USB_ERR_NOTCONN; + } + + tx_desc = (struct tx_desc *)g_rtl8152_tx_buffer; + tx_desc->opts1 = buflen | TX_FS | TX_LS; + tx_desc->opts2 = 0; + + USB_LOG_DBG("txlen:%d\r\n", buflen + sizeof(struct tx_desc)); + + usbh_bulk_urb_fill(&g_rtl8152_class.bulkout_urb, g_rtl8152_class.hport, g_rtl8152_class.bulkout, g_rtl8152_tx_buffer, buflen + sizeof(struct tx_desc), USB_OSAL_WAITING_FOREVER, NULL, NULL); + return usbh_submit_urb(&g_rtl8152_class.bulkout_urb); +} + +__WEAK void usbh_rtl8152_run(struct usbh_rtl8152 *rtl8152_class) +{ + (void)rtl8152_class; +} + +__WEAK void usbh_rtl8152_stop(struct usbh_rtl8152 *rtl8152_class) +{ + (void)rtl8152_class; +} + +static const uint16_t rtl_id_table[][2] = { + { 0x0BDA, 0x8152 }, + { 0, 0 }, +}; + +static const struct usbh_class_driver rtl8152_class_driver = { + .driver_name = "rtl8152", + .connect = usbh_rtl8152_connect, + .disconnect = usbh_rtl8152_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info rtl8152_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = rtl_id_table, + .class_driver = &rtl8152_class_driver +}; diff --git a/src/lib/CherryUSB/class/vendor/net/usbh_rtl8152.h b/src/lib/CherryUSB/class/vendor/net/usbh_rtl8152.h new file mode 100644 index 000000000..171fa0bf6 --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/net/usbh_rtl8152.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_RTL8152_H +#define USBH_RTL8152_H + +struct usbh_rtl8152 { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usb_endpoint_descriptor *intin; /* INTR IN endpoint */ + struct usbh_urb bulkout_urb; + struct usbh_urb bulkin_urb; + struct usbh_urb intin_urb; + + uint8_t intf; + + uint8_t mac[6]; + bool connect_status; + uint32_t speed[2]; + + uint8_t version; + uint8_t eee_adv; + uint8_t eee_en; + uint8_t supports_gmii; + uint16_t min_mtu; + uint16_t max_mtu; + uint16_t ocp_base; + uint32_t saved_wolopts; + uint32_t rx_buf_sz; + + struct rtl_ops { + void (*init)(struct usbh_rtl8152 *tp); + int (*enable)(struct usbh_rtl8152 *tp); + void (*disable)(struct usbh_rtl8152 *tp); + void (*up)(struct usbh_rtl8152 *tp); + void (*down)(struct usbh_rtl8152 *tp); + void (*unload)(struct usbh_rtl8152 *tp); + bool (*in_nway)(struct usbh_rtl8152 *tp); + void (*hw_phy_cfg)(struct usbh_rtl8152 *tp); + void (*autosuspend_en)(struct usbh_rtl8152 *tp, bool enable); + void (*change_mtu)(struct usbh_rtl8152 *tp); + } rtl_ops; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_rtl8152_get_connect_status(struct usbh_rtl8152 *rtl8152_class); + +void usbh_rtl8152_run(struct usbh_rtl8152 *rtl8152_class); +void usbh_rtl8152_stop(struct usbh_rtl8152 *rtl8152_class); + +uint8_t *usbh_rtl8152_get_eth_txbuf(void); +int usbh_rtl8152_eth_output(uint32_t buflen); +void usbh_rtl8152_eth_input(uint8_t *buf, uint32_t buflen); +void usbh_rtl8152_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_RTL8152_H */ \ No newline at end of file diff --git a/src/lib/CherryUSB/class/vendor/serial/usbh_ch34x.c b/src/lib/CherryUSB/class/vendor/serial/usbh_ch34x.c new file mode 100644 index 000000000..3941d47dc --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/serial/usbh_ch34x.c @@ -0,0 +1,379 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_ch34x.h" + +#define DEV_FORMAT "/dev/ttyUSB%d" + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_ch34x_buf[USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; + +#define CONFIG_USBHOST_MAX_CP210X_CLASS 1 + +static struct usbh_ch34x g_ch34x_class[CONFIG_USBHOST_MAX_CP210X_CLASS]; +static uint32_t g_devinuse = 0; + +static struct usbh_ch34x *usbh_ch34x_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_CP210X_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_ch34x_class[devno], 0, sizeof(struct usbh_ch34x)); + g_ch34x_class[devno].minor = devno; + return &g_ch34x_class[devno]; + } + } + return NULL; +} + +static void usbh_ch34x_class_free(struct usbh_ch34x *ch34x_class) +{ + uint8_t devno = ch34x_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(ch34x_class, 0, sizeof(struct usbh_ch34x)); +} + +static int usbh_ch34x_get_baudrate_div(uint32_t baudrate, uint8_t *factor, uint8_t *divisor) +{ + uint8_t a; + uint8_t b; + uint32_t c; + + switch (baudrate) { + case 921600: + a = 0xf3; + b = 7; + break; + + case 307200: + a = 0xd9; + b = 7; + break; + + default: + if (baudrate > 6000000 / 255) { + b = 3; + c = 6000000; + } else if (baudrate > 750000 / 255) { + b = 2; + c = 750000; + } else if (baudrate > 93750 / 255) { + b = 1; + c = 93750; + } else { + b = 0; + c = 11719; + } + a = (uint8_t)(c / baudrate); + if (a == 0 || a == 0xFF) { + return -USB_ERR_INVAL; + } + if ((c / a - baudrate) > (baudrate - c / (a + 1))) { + a++; + } + a = (uint8_t)(256 - a); + break; + } + + *factor = a; + *divisor = b; + + return 0; +} + +static int usbh_ch34x_get_version(struct usbh_ch34x *ch34x_class) +{ + struct usb_setup_packet *setup; + int ret; + + if (!ch34x_class || !ch34x_class->hport) { + return -USB_ERR_INVAL; + } + setup = ch34x_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = CH34X_READ_VERSION; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = 2; + + ret = usbh_control_transfer(ch34x_class->hport, setup, g_ch34x_buf); + if (ret < 0) { + return ret; + } + + USB_LOG_INFO("Ch34x chip version %02x:%02x\r\n", g_ch34x_buf[0], g_ch34x_buf[1]); + return ret; +} + +static int usbh_ch34x_flow_ctrl(struct usbh_ch34x *ch34x_class) +{ + struct usb_setup_packet *setup; + + if (!ch34x_class || !ch34x_class->hport) { + return -USB_ERR_INVAL; + } + setup = ch34x_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = CH34X_WRITE_REG; + setup->wValue = 0x2727; + setup->wIndex = 0; + setup->wLength = 0; + + return usbh_control_transfer(ch34x_class->hport, setup, NULL); +} + +int usbh_ch34x_set_line_coding(struct usbh_ch34x *ch34x_class, struct cdc_line_coding *line_coding) +{ + struct usb_setup_packet *setup; + uint16_t reg_value = 0; + uint16_t value = 0; + uint8_t factor = 0; + uint8_t divisor = 0; + + if (!ch34x_class || !ch34x_class->hport) { + return -USB_ERR_INVAL; + } + setup = ch34x_class->hport->setup; + + memcpy((uint8_t *)&ch34x_class->line_coding, line_coding, sizeof(struct cdc_line_coding)); + + /* refer to https://github.com/WCHSoftGroup/ch341ser_linux/blob/main/driver/ch341.c */ + + switch (line_coding->bParityType) { + case 0: + break; + case 1: + reg_value |= CH341_L_PO; + break; + case 2: + reg_value |= CH341_L_PE; + break; + case 3: + reg_value |= CH341_L_PM; + break; + case 4: + reg_value |= CH341_L_PS; + break; + default: + return -USB_ERR_INVAL; + } + + switch (line_coding->bDataBits) { + case 5: + reg_value |= CH341_L_D5; + break; + case 6: + reg_value |= CH341_L_D6; + break; + case 7: + reg_value |= CH341_L_D7; + break; + case 8: + reg_value |= CH341_L_D8; + break; + default: + return -USB_ERR_INVAL; + } + + if (line_coding->bCharFormat == 2) { + reg_value |= CH341_L_SB; + } + + reg_value |= 0xC0; + + value |= 0x9c; + value |= reg_value << 8; + + usbh_ch34x_get_baudrate_div(line_coding->dwDTERate, &factor, &divisor); + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = CH34X_SERIAL_INIT; + setup->wValue = value; + setup->wIndex = (factor << 8) | 0x80 | divisor; + setup->wLength = 0; + + return usbh_control_transfer(ch34x_class->hport, setup, NULL); +} + +int usbh_ch34x_get_line_coding(struct usbh_ch34x *ch34x_class, struct cdc_line_coding *line_coding) +{ + memcpy(line_coding, (uint8_t *)&ch34x_class->line_coding, sizeof(struct cdc_line_coding)); + return 0; +} + +int usbh_ch34x_set_line_state(struct usbh_ch34x *ch34x_class, bool dtr, bool rts) +{ + struct usb_setup_packet *setup; + + if (!ch34x_class || !ch34x_class->hport) { + return -USB_ERR_INVAL; + } + setup = ch34x_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = CH34X_MODEM_CTRL; + setup->wValue = 0x0f | (dtr << 5) | (rts << 6); + setup->wIndex = 0; + setup->wLength = 0; + + return usbh_control_transfer(ch34x_class->hport, setup, NULL); +} + +static int usbh_ch34x_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret = 0; + + struct usbh_ch34x *ch34x_class = usbh_ch34x_class_alloc(); + if (ch34x_class == NULL) { + USB_LOG_ERR("Fail to alloc ch34x_class\r\n"); + return -USB_ERR_NOMEM; + } + + ch34x_class->hport = hport; + ch34x_class->intf = intf; + + hport->config.intf[intf].priv = ch34x_class; + + usbh_ch34x_get_version(ch34x_class); + usbh_ch34x_flow_ctrl(ch34x_class); + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + continue; + } else { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(ch34x_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(ch34x_class->bulkout, ep_desc); + } + } + } + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, ch34x_class->minor); + + USB_LOG_INFO("Register CH34X Class:%s\r\n", hport->config.intf[intf].devname); + +#if 0 + USB_LOG_INFO("Test ch34x rx and tx and rx for 5 times, baudrate is 115200\r\n"); + + struct cdc_line_coding linecoding; + uint8_t count = 5; + + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_ch34x_set_line_coding(ch34x_class, &linecoding); + usbh_ch34x_set_line_state(ch34x_class, true, false); + + memset(g_ch34x_buf, 'a', sizeof(g_ch34x_buf)); + ret = usbh_ch34x_bulk_out_transfer(ch34x_class, g_ch34x_buf, sizeof(g_ch34x_buf), 0xfffffff); + USB_LOG_RAW("out ret:%d\r\n", ret); + while (count--) { + ret = usbh_ch34x_bulk_in_transfer(ch34x_class, g_ch34x_buf, sizeof(g_ch34x_buf), 0xfffffff); + USB_LOG_RAW("in ret:%d\r\n", ret); + if (ret > 0) { + for (uint32_t i = 0; i < ret; i++) { + USB_LOG_RAW("%02x ", g_ch34x_buf[i]); + } + USB_LOG_RAW("\r\n"); + } + } +#endif + usbh_ch34x_run(ch34x_class); + return ret; +} + +static int usbh_ch34x_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_ch34x *ch34x_class = (struct usbh_ch34x *)hport->config.intf[intf].priv; + + if (ch34x_class) { + if (ch34x_class->bulkin) { + usbh_kill_urb(&ch34x_class->bulkin_urb); + } + + if (ch34x_class->bulkout) { + usbh_kill_urb(&ch34x_class->bulkout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister CH34X Class:%s\r\n", hport->config.intf[intf].devname); + usbh_ch34x_stop(ch34x_class); + } + + usbh_ch34x_class_free(ch34x_class); + } + + return ret; +} + +int usbh_ch34x_bulk_in_transfer(struct usbh_ch34x *ch34x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &ch34x_class->bulkin_urb; + + usbh_bulk_urb_fill(urb, ch34x_class->hport, ch34x_class->bulkin, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +int usbh_ch34x_bulk_out_transfer(struct usbh_ch34x *ch34x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &ch34x_class->bulkout_urb; + + usbh_bulk_urb_fill(urb, ch34x_class->hport, ch34x_class->bulkout, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +__WEAK void usbh_ch34x_run(struct usbh_ch34x *ch34x_class) +{ + (void)ch34x_class; +} + +__WEAK void usbh_ch34x_stop(struct usbh_ch34x *ch34x_class) +{ + (void)ch34x_class; +} + +static const uint16_t ch34x_id_table[][2] = { + { 0x1A86, 0x7523 }, + { 0, 0 }, +}; + +const struct usbh_class_driver ch34x_class_driver = { + .driver_name = "ch34x", + .connect = usbh_ch34x_connect, + .disconnect = usbh_ch34x_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info ch34x_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = ch34x_id_table, + .class_driver = &ch34x_class_driver +}; \ No newline at end of file diff --git a/src/lib/CherryUSB/class/vendor/serial/usbh_ch34x.h b/src/lib/CherryUSB/class/vendor/serial/usbh_ch34x.h new file mode 100644 index 000000000..c90bf9bda --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/serial/usbh_ch34x.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_CH34X_H +#define USBH_CH34X_H + +#include "usb_cdc.h" + +/* Requests */ +#define CH34X_READ_VERSION 0x5F +#define CH34X_WRITE_REG 0x9A +#define CH34X_READ_REG 0x95 +#define CH34X_SERIAL_INIT 0xA1 +#define CH34X_MODEM_CTRL 0xA4 + +// modem control bits +#define CH34X_BIT_RTS (1 << 6) +#define CH34X_BIT_DTR (1 << 5) + +#define CH341_CTO_O 0x10 +#define CH341_CTO_D 0x20 +#define CH341_CTO_R 0x40 +#define CH341_CTI_C 0x01 +#define CH341_CTI_DS 0x02 +#define CH341_CTRL_RI 0x04 +#define CH341_CTI_DC 0x08 +#define CH341_CTI_ST 0x0f + +#define CH341_L_ER 0x80 +#define CH341_L_ET 0x40 +#define CH341_L_PS 0x38 +#define CH341_L_PM 0x28 +#define CH341_L_PE 0x18 +#define CH341_L_PO 0x08 +#define CH341_L_SB 0x04 +#define CH341_L_D8 0x03 +#define CH341_L_D7 0x02 +#define CH341_L_D6 0x01 +#define CH341_L_D5 0x00 + +struct usbh_ch34x { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usbh_urb bulkout_urb; + struct usbh_urb bulkin_urb; + + struct cdc_line_coding line_coding; + + uint8_t intf; + uint8_t minor; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_ch34x_set_line_coding(struct usbh_ch34x *ch34x_class, struct cdc_line_coding *line_coding); +int usbh_ch34x_get_line_coding(struct usbh_ch34x *ch34x_class, struct cdc_line_coding *line_coding); +int usbh_ch34x_set_line_state(struct usbh_ch34x *ch34x_class, bool dtr, bool rts); + +int usbh_ch34x_bulk_in_transfer(struct usbh_ch34x *ch34x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); +int usbh_ch34x_bulk_out_transfer(struct usbh_ch34x *ch34x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); + +void usbh_ch34x_run(struct usbh_ch34x *ch34x_class); +void usbh_ch34x_stop(struct usbh_ch34x *ch34x_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_CH34X_H */ diff --git a/src/lib/CherryUSB/class/vendor/serial/usbh_cp210x.c b/src/lib/CherryUSB/class/vendor/serial/usbh_cp210x.c new file mode 100644 index 000000000..f58350e6f --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/serial/usbh_cp210x.c @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_cp210x.h" + +#define DEV_FORMAT "/dev/ttyUSB%d" + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cp210x_buf[USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; + +#define CONFIG_USBHOST_MAX_CP210X_CLASS 1 + +static struct usbh_cp210x g_cp210x_class[CONFIG_USBHOST_MAX_CP210X_CLASS]; +static uint32_t g_devinuse = 0; + +static struct usbh_cp210x *usbh_cp210x_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_CP210X_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_cp210x_class[devno], 0, sizeof(struct usbh_cp210x)); + g_cp210x_class[devno].minor = devno; + return &g_cp210x_class[devno]; + } + } + return NULL; +} + +static void usbh_cp210x_class_free(struct usbh_cp210x *cp210x_class) +{ + uint8_t devno = cp210x_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(cp210x_class, 0, sizeof(struct usbh_cp210x)); +} + +static int usbh_cp210x_enable(struct usbh_cp210x *cp210x_class) +{ + struct usb_setup_packet *setup; + + if (!cp210x_class || !cp210x_class->hport) { + return -USB_ERR_INVAL; + } + setup = cp210x_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CP210X_IFC_ENABLE; + setup->wValue = 1; + setup->wIndex = cp210x_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(cp210x_class->hport, setup, NULL); +} + +static int usbh_cp210x_set_flow(struct usbh_cp210x *cp210x_class) +{ + struct usb_setup_packet *setup; + + if (!cp210x_class || !cp210x_class->hport) { + return -USB_ERR_INVAL; + } + setup = cp210x_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CP210X_SET_FLOW; + setup->wValue = 0; + setup->wIndex = cp210x_class->intf; + setup->wLength = 16; + + memset(g_cp210x_buf, 0, 16); + g_cp210x_buf[13] = 0x20; + return usbh_control_transfer(cp210x_class->hport, setup, g_cp210x_buf); +} + +static int usbh_cp210x_set_chars(struct usbh_cp210x *cp210x_class) +{ + struct usb_setup_packet *setup; + + if (!cp210x_class || !cp210x_class->hport) { + return -USB_ERR_INVAL; + } + setup = cp210x_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CP210X_SET_CHARS; + setup->wValue = 0; + setup->wIndex = cp210x_class->intf; + setup->wLength = 6; + + memset(g_cp210x_buf, 0, 6); + g_cp210x_buf[0] = 0x80; + g_cp210x_buf[4] = 0x88; + g_cp210x_buf[5] = 0x28; + return usbh_control_transfer(cp210x_class->hport, setup, g_cp210x_buf); +} + +static int usbh_cp210x_set_baudrate(struct usbh_cp210x *cp210x_class, uint32_t baudrate) +{ + struct usb_setup_packet *setup; + + if (!cp210x_class || !cp210x_class->hport) { + return -USB_ERR_INVAL; + } + setup = cp210x_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CP210X_SET_BAUDRATE; + setup->wValue = 0; + setup->wIndex = cp210x_class->intf; + setup->wLength = 4; + + memcpy(g_cp210x_buf, (uint8_t *)&baudrate, 4); + return usbh_control_transfer(cp210x_class->hport, setup, g_cp210x_buf); +} + +static int usbh_cp210x_set_data_format(struct usbh_cp210x *cp210x_class, uint8_t databits, uint8_t parity, uint8_t stopbits) +{ + struct usb_setup_packet *setup; + uint16_t value; + + if (!cp210x_class || !cp210x_class->hport) { + return -USB_ERR_INVAL; + } + setup = cp210x_class->hport->setup; + + value = ((databits & 0x0F) << 8) | ((parity & 0x0f) << 4) | ((stopbits & 0x03) << 0); + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CP210X_SET_LINE_CTL; + setup->wValue = value; + setup->wIndex = cp210x_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(cp210x_class->hport, setup, NULL); +} + +static int usbh_cp210x_set_mhs(struct usbh_cp210x *cp210x_class, uint8_t dtr, uint8_t rts, uint8_t dtr_mask, uint8_t rts_mask) +{ + struct usb_setup_packet *setup; + uint16_t value; + + if (!cp210x_class || !cp210x_class->hport) { + return -USB_ERR_INVAL; + } + setup = cp210x_class->hport->setup; + + value = ((dtr & 0x01) << 0) | ((rts & 0x01) << 1) | ((dtr_mask & 0x01) << 8) | ((rts_mask & 0x01) << 9); + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CP210X_SET_MHS; + setup->wValue = value; + setup->wIndex = cp210x_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(cp210x_class->hport, setup, NULL); +} + +int usbh_cp210x_set_line_coding(struct usbh_cp210x *cp210x_class, struct cdc_line_coding *line_coding) +{ + memcpy((uint8_t *)&cp210x_class->line_coding, line_coding, sizeof(struct cdc_line_coding)); + usbh_cp210x_set_baudrate(cp210x_class, line_coding->dwDTERate); + return usbh_cp210x_set_data_format(cp210x_class, line_coding->bDataBits, line_coding->bParityType, line_coding->bCharFormat); +} + +int usbh_cp210x_get_line_coding(struct usbh_cp210x *cp210x_class, struct cdc_line_coding *line_coding) +{ + memcpy(line_coding, (uint8_t *)&cp210x_class->line_coding, sizeof(struct cdc_line_coding)); + return 0; +} + +int usbh_cp210x_set_line_state(struct usbh_cp210x *cp210x_class, bool dtr, bool rts) +{ + return usbh_cp210x_set_mhs(cp210x_class, dtr, rts, 1, 1); +} + +static int usbh_cp210x_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret = 0; + + struct usbh_cp210x *cp210x_class = usbh_cp210x_class_alloc(); + if (cp210x_class == NULL) { + USB_LOG_ERR("Fail to alloc cp210x_class\r\n"); + return -USB_ERR_NOMEM; + } + + cp210x_class->hport = hport; + cp210x_class->intf = intf; + + hport->config.intf[intf].priv = cp210x_class; + + usbh_cp210x_enable(cp210x_class); + usbh_cp210x_set_flow(cp210x_class); + usbh_cp210x_set_chars(cp210x_class); + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(cp210x_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(cp210x_class->bulkout, ep_desc); + } + } + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, cp210x_class->minor); + + USB_LOG_INFO("Register CP210X Class:%s\r\n", hport->config.intf[intf].devname); + +#if 0 + USB_LOG_INFO("Test cp2102 rx and tx and rx for 5 times, baudrate is 115200\r\n"); + + struct cdc_line_coding linecoding; + uint8_t count = 5; + + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_cp210x_set_line_coding(cp210x_class, &linecoding); + usbh_cp210x_set_line_state(cp210x_class, true, false); + + memset(g_cp210x_buf, 'a', sizeof(g_cp210x_buf)); + ret = usbh_cp210x_bulk_out_transfer(cp210x_class, g_cp210x_buf, sizeof(g_cp210x_buf), 0xfffffff); + USB_LOG_RAW("out ret:%d\r\n", ret); + while (count--) { + ret = usbh_cp210x_bulk_in_transfer(cp210x_class, g_cp210x_buf, sizeof(g_cp210x_buf), 0xfffffff); + USB_LOG_RAW("in ret:%d\r\n", ret); + if (ret > 0) { + for (uint32_t i = 0; i < ret; i++) { + USB_LOG_RAW("%02x ", g_cp210x_buf[i]); + } + USB_LOG_RAW("\r\n"); + } + } +#endif + usbh_cp210x_run(cp210x_class); + return ret; +} + +static int usbh_cp210x_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_cp210x *cp210x_class = (struct usbh_cp210x *)hport->config.intf[intf].priv; + + if (cp210x_class) { + if (cp210x_class->bulkin) { + usbh_kill_urb(&cp210x_class->bulkin_urb); + } + + if (cp210x_class->bulkout) { + usbh_kill_urb(&cp210x_class->bulkout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister CP210X Class:%s\r\n", hport->config.intf[intf].devname); + usbh_cp210x_stop(cp210x_class); + } + + usbh_cp210x_class_free(cp210x_class); + } + + return ret; +} + +int usbh_cp210x_bulk_in_transfer(struct usbh_cp210x *cp210x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &cp210x_class->bulkin_urb; + + usbh_bulk_urb_fill(urb, cp210x_class->hport, cp210x_class->bulkin, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +int usbh_cp210x_bulk_out_transfer(struct usbh_cp210x *cp210x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &cp210x_class->bulkout_urb; + + usbh_bulk_urb_fill(urb, cp210x_class->hport, cp210x_class->bulkout, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +__WEAK void usbh_cp210x_run(struct usbh_cp210x *cp210x_class) +{ + (void)cp210x_class; +} + +__WEAK void usbh_cp210x_stop(struct usbh_cp210x *cp210x_class) +{ + (void)cp210x_class; +} + +static const uint16_t cp210x_id_table[][2] = { + { 0x10C4, 0xEA60 }, + { 0, 0 }, +}; + +const struct usbh_class_driver cp210x_class_driver = { + .driver_name = "cp210x", + .connect = usbh_cp210x_connect, + .disconnect = usbh_cp210x_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cp210x_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = cp210x_id_table, + .class_driver = &cp210x_class_driver +}; \ No newline at end of file diff --git a/src/lib/CherryUSB/class/vendor/serial/usbh_cp210x.h b/src/lib/CherryUSB/class/vendor/serial/usbh_cp210x.h new file mode 100644 index 000000000..d380c36c5 --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/serial/usbh_cp210x.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_CP210X_H +#define USBH_CP210X_H + +#include "usb_cdc.h" + +/* Requests */ +#define CP210X_IFC_ENABLE 0x00 +#define CP210X_SET_BAUDDIV 0x01 +#define CP210X_GET_BAUDDIV 0x02 +#define CP210X_SET_LINE_CTL 0x03 // Set parity, data bits, stop bits +#define CP210X_GET_LINE_CTL 0x04 +#define CP210X_SET_BREAK 0x05 +#define CP210X_IMM_CHAR 0x06 +#define CP210X_SET_MHS 0x07 // Set DTR, RTS +#define CP210X_GET_MDMSTS 0x08 +#define CP210X_SET_XON 0x09 +#define CP210X_SET_XOFF 0x0A +#define CP210X_SET_EVENTMASK 0x0B +#define CP210X_GET_EVENTMASK 0x0C +#define CP210X_SET_CHAR 0x0D +#define CP210X_GET_CHARS 0x0E +#define CP210X_GET_PROPS 0x0F +#define CP210X_GET_COMM_STATUS 0x10 +#define CP210X_RESET 0x11 +#define CP210X_PURGE 0x12 +#define CP210X_SET_FLOW 0x13 +#define CP210X_GET_FLOW 0x14 +#define CP210X_EMBED_EVENTS 0x15 +#define CP210X_GET_EVENTSTATE 0x16 +#define CP210X_SET_CHARS 0x19 +#define CP210X_GET_BAUDRATE 0x1D +#define CP210X_SET_BAUDRATE 0x1E // Set baudrate +#define CP210X_VENDOR_SPECIFIC 0xFF + +struct usbh_cp210x { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usbh_urb bulkout_urb; + struct usbh_urb bulkin_urb; + + struct cdc_line_coding line_coding; + + uint8_t intf; + uint8_t minor; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_cp210x_set_line_coding(struct usbh_cp210x *ftdi_class, struct cdc_line_coding *line_coding); +int usbh_cp210x_get_line_coding(struct usbh_cp210x *ftdi_class, struct cdc_line_coding *line_coding); +int usbh_cp210x_set_line_state(struct usbh_cp210x *ftdi_class, bool dtr, bool rts); + +int usbh_cp210x_bulk_in_transfer(struct usbh_cp210x *cp210x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); +int usbh_cp210x_bulk_out_transfer(struct usbh_cp210x *cp210x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); + +void usbh_cp210x_run(struct usbh_cp210x *cp210x_class); +void usbh_cp210x_stop(struct usbh_cp210x *cp210x_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_CP210X_H */ diff --git a/src/lib/CherryUSB/class/vendor/serial/usbh_ftdi.c b/src/lib/CherryUSB/class/vendor/serial/usbh_ftdi.c new file mode 100644 index 000000000..4bc7f81b0 --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/serial/usbh_ftdi.c @@ -0,0 +1,510 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_ftdi.h" + +#define DEV_FORMAT "/dev/ttyUSB%d" + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_ftdi_buf[USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; + +#define CONFIG_USBHOST_MAX_FTDI_CLASS 1 + +static struct usbh_ftdi g_ftdi_class[CONFIG_USBHOST_MAX_FTDI_CLASS]; +static uint32_t g_devinuse = 0; + +static const char *ftdi_chip_name[] = { + [SIO] = "SIO", /* the serial part of FT8U100AX */ + [FT232A] = "FT232A", + [FT232B] = "FT232B", + [FT2232C] = "FT2232C/D", + [FT232R] = "FT232R", + [FT232H] = "FT232H", + [FT2232H] = "FT2232H", + [FT4232H] = "FT4232H", + [FT4232HA] = "FT4232HA", + [FT232HP] = "FT232HP", + [FT233HP] = "FT233HP", + [FT2232HP] = "FT2232HP", + [FT2233HP] = "FT2233HP", + [FT4232HP] = "FT4232HP", + [FT4233HP] = "FT4233HP", + [FTX] = "FT-X", +}; + +static struct usbh_ftdi *usbh_ftdi_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_FTDI_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_ftdi_class[devno], 0, sizeof(struct usbh_ftdi)); + g_ftdi_class[devno].minor = devno; + return &g_ftdi_class[devno]; + } + } + return NULL; +} + +static void usbh_ftdi_class_free(struct usbh_ftdi *ftdi_class) +{ + uint8_t devno = ftdi_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(ftdi_class, 0, sizeof(struct usbh_ftdi)); +} + +/* + * Divide positive or negative dividend by positive or negative divisor + * and round to closest integer. Result is undefined for negative + * divisors if the dividend variable type is unsigned and for negative + * dividends if the divisor variable type is unsigned. + */ +#define DIV_ROUND_CLOSEST(x, divisor) ( \ + { \ + typeof(x) __x = x; \ + typeof(divisor) __d = divisor; \ + (((typeof(x))-1) > 0 || \ + ((typeof(divisor))-1) > 0 || \ + (((__x) > 0) == ((__d) > 0))) ? \ + (((__x) + ((__d) / 2)) / (__d)) : \ + (((__x) - ((__d) / 2)) / (__d)); \ + }) + +static uint32_t ftdi_232bm_baud_base_to_divisor(uint32_t baud, int base) +{ + static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 }; + uint32_t divisor; + /* divisor shifted 3 bits to the left */ + int divisor3 = DIV_ROUND_CLOSEST(base, 2 * baud); + divisor = divisor3 >> 3; + divisor |= (uint32_t)divfrac[divisor3 & 0x7] << 14; + /* Deal with special cases for highest baud rates. */ + if (divisor == 1) /* 1.0 */ + divisor = 0; + else if (divisor == 0x4001) /* 1.5 */ + divisor = 1; + return divisor; +} + +static uint32_t ftdi_232bm_baud_to_divisor(uint32_t baud) +{ + return ftdi_232bm_baud_base_to_divisor(baud, 48000000); +} + +static uint32_t ftdi_2232h_baud_base_to_divisor(uint32_t baud, int base) +{ + static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 }; + uint32_t divisor; + int divisor3; + + /* hi-speed baud rate is 10-bit sampling instead of 16-bit */ + divisor3 = DIV_ROUND_CLOSEST(8 * base, 10 * baud); + + divisor = divisor3 >> 3; + divisor |= (uint32_t)divfrac[divisor3 & 0x7] << 14; + /* Deal with special cases for highest baud rates. */ + if (divisor == 1) /* 1.0 */ + divisor = 0; + else if (divisor == 0x4001) /* 1.5 */ + divisor = 1; + /* + * Set this bit to turn off a divide by 2.5 on baud rate generator + * This enables baud rates up to 12Mbaud but cannot reach below 1200 + * baud with this bit set + */ + divisor |= 0x00020000; + return divisor; +} + +static uint32_t ftdi_2232h_baud_to_divisor(uint32_t baud) +{ + return ftdi_2232h_baud_base_to_divisor(baud, 120000000); +} + +int usbh_ftdi_reset(struct usbh_ftdi *ftdi_class) +{ + struct usb_setup_packet *setup; + + if (!ftdi_class || !ftdi_class->hport) { + return -USB_ERR_INVAL; + } + setup = ftdi_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = SIO_RESET_REQUEST; + setup->wValue = 0; + setup->wIndex = ftdi_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(ftdi_class->hport, setup, NULL); +} + +static int usbh_ftdi_set_modem(struct usbh_ftdi *ftdi_class, uint16_t value) +{ + struct usb_setup_packet *setup; + + if (!ftdi_class || !ftdi_class->hport) { + return -USB_ERR_INVAL; + } + setup = ftdi_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = SIO_SET_MODEM_CTRL_REQUEST; + setup->wValue = value; + setup->wIndex = ftdi_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(ftdi_class->hport, setup, NULL); +} + +static int usbh_ftdi_set_baudrate(struct usbh_ftdi *ftdi_class, uint32_t baudrate) +{ + struct usb_setup_packet *setup; + uint32_t div_value; + uint16_t value; + uint8_t baudrate_high; + + if (!ftdi_class || !ftdi_class->hport) { + return -USB_ERR_INVAL; + } + setup = ftdi_class->hport->setup; + + switch (ftdi_class->chip_type) { + case FT232B: + case FT2232C: + case FT232R: + if (baudrate > 3000000) { + return -USB_ERR_INVAL; + } + div_value = ftdi_232bm_baud_to_divisor(baudrate); + break; + default: + if ((baudrate <= 12000000) && (baudrate >= 1200)) { + div_value = ftdi_2232h_baud_to_divisor(baudrate); + } else { + return -USB_ERR_INVAL; + } + break; + } + + value = div_value & 0xFFFF; + baudrate_high = (div_value >> 16) & 0xff; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = SIO_SET_BAUDRATE_REQUEST; + setup->wValue = value; + setup->wIndex = (baudrate_high << 8) | ftdi_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(ftdi_class->hport, setup, NULL); +} + +static int usbh_ftdi_set_data_format(struct usbh_ftdi *ftdi_class, uint8_t databits, uint8_t parity, uint8_t stopbits, uint8_t isbreak) +{ + /** + * D0-D7 databits BITS_7=7, BITS_8=8 + * D8-D10 parity NONE=0, ODD=1, EVEN=2, MARK=3, SPACE=4 + * D11-D12 STOP_BIT_1=0, STOP_BIT_15=1, STOP_BIT_2=2 + * D14 BREAK_OFF=0, BREAK_ON=1 + **/ + struct usb_setup_packet *setup; + uint16_t value; + + if (!ftdi_class || !ftdi_class->hport) { + return -USB_ERR_INVAL; + } + setup = ftdi_class->hport->setup; + + value = ((isbreak & 0x01) << 14) | ((stopbits & 0x03) << 11) | ((parity & 0x0f) << 8) | (databits & 0x0f); + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = SIO_SET_DATA_REQUEST; + setup->wValue = value; + setup->wIndex = ftdi_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(ftdi_class->hport, setup, NULL); +} + +static int usbh_ftdi_set_latency_timer(struct usbh_ftdi *ftdi_class, uint16_t value) +{ + struct usb_setup_packet *setup; + + if (!ftdi_class || !ftdi_class->hport) { + return -USB_ERR_INVAL; + } + setup = ftdi_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = SIO_SET_LATENCY_TIMER_REQUEST; + setup->wValue = value; + setup->wIndex = ftdi_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(ftdi_class->hport, setup, NULL); +} + +static int usbh_ftdi_set_flow_ctrl(struct usbh_ftdi *ftdi_class, uint16_t value) +{ + struct usb_setup_packet *setup; + + if (!ftdi_class || !ftdi_class->hport) { + return -USB_ERR_INVAL; + } + setup = ftdi_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = SIO_SET_FLOW_CTRL_REQUEST; + setup->wValue = value; + setup->wIndex = ftdi_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(ftdi_class->hport, setup, NULL); +} + +static int usbh_ftdi_read_modem_status(struct usbh_ftdi *ftdi_class) +{ + struct usb_setup_packet *setup; + int ret; + + if (!ftdi_class || !ftdi_class->hport) { + return -USB_ERR_INVAL; + } + setup = ftdi_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = SIO_POLL_MODEM_STATUS_REQUEST; + setup->wValue = 0x0000; + setup->wIndex = ftdi_class->intf; + setup->wLength = 2; + + ret = usbh_control_transfer(ftdi_class->hport, setup, g_ftdi_buf); + if (ret < 0) { + return ret; + } + memcpy(ftdi_class->modem_status, g_ftdi_buf, 2); + return ret; +} + +int usbh_ftdi_set_line_coding(struct usbh_ftdi *ftdi_class, struct cdc_line_coding *line_coding) +{ + memcpy((uint8_t *)&ftdi_class->line_coding, line_coding, sizeof(struct cdc_line_coding)); + + int ret = usbh_ftdi_set_baudrate(ftdi_class, line_coding->dwDTERate); + if (ret < 0) { + return ret; + } + return usbh_ftdi_set_data_format(ftdi_class, line_coding->bDataBits, line_coding->bParityType, line_coding->bCharFormat, 0); +} + +int usbh_ftdi_get_line_coding(struct usbh_ftdi *ftdi_class, struct cdc_line_coding *line_coding) +{ + memcpy(line_coding, (uint8_t *)&ftdi_class->line_coding, sizeof(struct cdc_line_coding)); + return 0; +} + +int usbh_ftdi_set_line_state(struct usbh_ftdi *ftdi_class, bool dtr, bool rts) +{ + int ret; + + if (dtr) { + usbh_ftdi_set_modem(ftdi_class, SIO_SET_DTR_HIGH); + } else { + usbh_ftdi_set_modem(ftdi_class, SIO_SET_DTR_LOW); + } + + if (rts) { + ret = usbh_ftdi_set_modem(ftdi_class, SIO_SET_RTS_HIGH); + } else { + ret = usbh_ftdi_set_modem(ftdi_class, SIO_SET_RTS_LOW); + } + + return ret; +} + +static int usbh_ftdi_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret = 0; + uint16_t version; + + struct usbh_ftdi *ftdi_class = usbh_ftdi_class_alloc(); + if (ftdi_class == NULL) { + USB_LOG_ERR("Fail to alloc ftdi_class\r\n"); + return -USB_ERR_NOMEM; + } + + ftdi_class->hport = hport; + ftdi_class->intf = intf; + + hport->config.intf[intf].priv = ftdi_class; + + version = hport->device_desc.bcdDevice; + + switch (version) { + case 0x400: + ftdi_class->chip_type = FT232B; + break; + case 0x500: + ftdi_class->chip_type = FT2232C; + break; + case 0x600: + ftdi_class->chip_type = FT232R; + break; + case 0x700: + ftdi_class->chip_type = FT2232H; + break; + case 0x800: + ftdi_class->chip_type = FT4232H; + break; + case 0x900: + ftdi_class->chip_type = FT232H; + break; + + default: + USB_LOG_ERR("Unknown FTDI chip version:%04x\r\n", version); + return -USB_ERR_NOTSUPP; + } + + USB_LOG_INFO("FTDI chip name:%s\r\n", ftdi_chip_name[ftdi_class->chip_type]); + + usbh_ftdi_reset(ftdi_class); + usbh_ftdi_set_flow_ctrl(ftdi_class, SIO_DISABLE_FLOW_CTRL); + usbh_ftdi_set_latency_timer(ftdi_class, 0x10); + usbh_ftdi_read_modem_status(ftdi_class); + USB_LOG_INFO("modem status:%02x:%02x\r\n", ftdi_class->modem_status[0], ftdi_class->modem_status[1]); + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(ftdi_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(ftdi_class->bulkout, ep_desc); + } + } + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, ftdi_class->minor); + + USB_LOG_INFO("Register FTDI Class:%s\r\n", hport->config.intf[intf].devname); + +#if 0 + USB_LOG_INFO("Test ftdi rx and tx and rx for 5 times, baudrate is 115200\r\n"); + + struct cdc_line_coding linecoding; + uint8_t count = 5; + + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_ftdi_set_line_coding(ftdi_class, &linecoding); + usbh_ftdi_set_line_state(ftdi_class, true, false); + + memset(g_ftdi_buf, 'a', sizeof(g_ftdi_buf)); + ret = usbh_ftdi_bulk_out_transfer(ftdi_class, g_ftdi_buf, sizeof(g_ftdi_buf), 0xfffffff); + USB_LOG_RAW("out ret:%d\r\n", ret); + while (count--) { + ret = usbh_ftdi_bulk_in_transfer(ftdi_class, g_ftdi_buf, sizeof(g_ftdi_buf), 0xfffffff); + USB_LOG_RAW("in ret:%d\r\n", ret); + if (ret > 0) { + for (uint32_t i = 0; i < ret; i++) { + USB_LOG_RAW("%02x ", g_ftdi_buf[i]); + } + } + USB_LOG_RAW("\r\n"); + } +#endif + usbh_ftdi_run(ftdi_class); + return ret; +} + +static int usbh_ftdi_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_ftdi *ftdi_class = (struct usbh_ftdi *)hport->config.intf[intf].priv; + + if (ftdi_class) { + if (ftdi_class->bulkin) { + usbh_kill_urb(&ftdi_class->bulkin_urb); + } + + if (ftdi_class->bulkout) { + usbh_kill_urb(&ftdi_class->bulkout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister FTDI Class:%s\r\n", hport->config.intf[intf].devname); + usbh_ftdi_stop(ftdi_class); + } + + usbh_ftdi_class_free(ftdi_class); + } + + return ret; +} + +int usbh_ftdi_bulk_in_transfer(struct usbh_ftdi *ftdi_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &ftdi_class->bulkin_urb; + + usbh_bulk_urb_fill(urb, ftdi_class->hport, ftdi_class->bulkin, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +int usbh_ftdi_bulk_out_transfer(struct usbh_ftdi *ftdi_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &ftdi_class->bulkout_urb; + + usbh_bulk_urb_fill(urb, ftdi_class->hport, ftdi_class->bulkout, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +__WEAK void usbh_ftdi_run(struct usbh_ftdi *ftdi_class) +{ + (void)ftdi_class; +} + +__WEAK void usbh_ftdi_stop(struct usbh_ftdi *ftdi_class) +{ + (void)ftdi_class; +} + +static const uint16_t ftdi_id_table[][2] = { + { 0x0403, 0x6001 }, + { 0x0403, 0x6010 }, + { 0, 0 }, +}; + +const struct usbh_class_driver ftdi_class_driver = { + .driver_name = "ftdi", + .connect = usbh_ftdi_connect, + .disconnect = usbh_ftdi_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info ftdi_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = ftdi_id_table, + .class_driver = &ftdi_class_driver +}; \ No newline at end of file diff --git a/src/lib/CherryUSB/class/vendor/serial/usbh_ftdi.h b/src/lib/CherryUSB/class/vendor/serial/usbh_ftdi.h new file mode 100644 index 000000000..855db8d6c --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/serial/usbh_ftdi.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_FTDI_H +#define USBH_FTDI_H + +#include "usb_cdc.h" + +/* Requests */ +#define SIO_RESET_REQUEST 0x00 /* Reset the port */ +#define SIO_SET_MODEM_CTRL_REQUEST 0x01 /* Set the modem control register */ +#define SIO_SET_FLOW_CTRL_REQUEST 0x02 /* Set flow control register */ +#define SIO_SET_BAUDRATE_REQUEST 0x03 /* Set baud rate */ +#define SIO_SET_DATA_REQUEST 0x04 /* Set the data characteristics of the port */ +#define SIO_POLL_MODEM_STATUS_REQUEST 0x05 +#define SIO_SET_EVENT_CHAR_REQUEST 0x06 +#define SIO_SET_ERROR_CHAR_REQUEST 0x07 +#define SIO_SET_LATENCY_TIMER_REQUEST 0x09 +#define SIO_GET_LATENCY_TIMER_REQUEST 0x0A +#define SIO_SET_BITMODE_REQUEST 0x0B +#define SIO_READ_PINS_REQUEST 0x0C +#define SIO_READ_EEPROM_REQUEST 0x90 +#define SIO_WRITE_EEPROM_REQUEST 0x91 +#define SIO_ERASE_EEPROM_REQUEST 0x92 + +#define SIO_DISABLE_FLOW_CTRL 0x0 +#define SIO_RTS_CTS_HS (0x1 << 8) +#define SIO_DTR_DSR_HS (0x2 << 8) +#define SIO_XON_XOFF_HS (0x4 << 8) + +#define SIO_SET_DTR_MASK 0x1 +#define SIO_SET_DTR_HIGH (1 | (SIO_SET_DTR_MASK << 8)) +#define SIO_SET_DTR_LOW (0 | (SIO_SET_DTR_MASK << 8)) +#define SIO_SET_RTS_MASK 0x2 +#define SIO_SET_RTS_HIGH (2 | (SIO_SET_RTS_MASK << 8)) +#define SIO_SET_RTS_LOW (0 | (SIO_SET_RTS_MASK << 8)) + +#define SIO_RTS_CTS_HS (0x1 << 8) + +enum ftdi_chip_type { + SIO, + FT232A, + FT232B, + FT2232C, + FT232R, + FT232H, + FT2232H, + FT4232H, + FT4232HA, + FT232HP, + FT233HP, + FT2232HP, + FT2233HP, + FT4232HP, + FT4233HP, + FTX, +}; + +struct usbh_ftdi { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usbh_urb bulkout_urb; + struct usbh_urb bulkin_urb; + + struct cdc_line_coding line_coding; + + uint8_t intf; + uint8_t minor; + uint8_t modem_status[2]; + enum ftdi_chip_type chip_type; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_ftdi_set_line_coding(struct usbh_ftdi *ftdi_class, struct cdc_line_coding *line_coding); +int usbh_ftdi_get_line_coding(struct usbh_ftdi *ftdi_class, struct cdc_line_coding *line_coding); +int usbh_ftdi_set_line_state(struct usbh_ftdi *ftdi_class, bool dtr, bool rts); + +int usbh_ftdi_bulk_in_transfer(struct usbh_ftdi *ftdi_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); +int usbh_ftdi_bulk_out_transfer(struct usbh_ftdi *ftdi_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); + +void usbh_ftdi_run(struct usbh_ftdi *ftdi_class); +void usbh_ftdi_stop(struct usbh_ftdi *ftdi_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_FTDI_H */ diff --git a/src/lib/CherryUSB/class/vendor/serial/usbh_pl2303.c b/src/lib/CherryUSB/class/vendor/serial/usbh_pl2303.c new file mode 100644 index 000000000..ece325388 --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/serial/usbh_pl2303.c @@ -0,0 +1,449 @@ +/* + * Copyright (c) 2024, sakumisu + * Copyright (c) 2024, Derek Konigsberg + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_pl2303.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_pl2303" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/ttyUSB%d" + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_pl2303_buf[USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; + +#define CONFIG_USBHOST_MAX_PL2303_CLASS 1 + +#define UT_WRITE_VENDOR_DEVICE (USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE) +#define UT_READ_VENDOR_DEVICE (USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE) + +static struct usbh_pl2303 g_pl2303_class[CONFIG_USBHOST_MAX_PL2303_CLASS]; +static uint32_t g_devinuse = 0; + +static struct usbh_pl2303 *usbh_pl2303_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_PL2303_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_pl2303_class[devno], 0, sizeof(struct usbh_pl2303)); + g_pl2303_class[devno].minor = devno; + return &g_pl2303_class[devno]; + } + } + return NULL; +} + +static void usbh_pl2303_class_free(struct usbh_pl2303 *pl2303_class) +{ + uint8_t devno = pl2303_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(pl2303_class, 0, sizeof(struct usbh_pl2303)); +} + +static int usbh_pl2303_get_chiptype(struct usbh_pl2303 *pl2303_class) +{ + int ret = 0; + + switch (pl2303_class->hport->device_desc.bcdDevice) { + case 0x0300: + pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HX; + /* or TA, that is HX with external crystal */ + break; + case 0x0400: + pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HXD; + /* or EA, that is HXD with ESD protection */ + /* or RA, that has internal voltage level converter that works only up to 1Mbaud (!) */ + break; + case 0x0500: + pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HXD; + /* in fact it's TB, that is HXD with external crystal */ + break; + default: + /* NOTE: I have no info about the bcdDevice for the base PL2303 (up to 1.2Mbaud, + only fixed rates) and for PL2303SA (8-pin chip, up to 115200 baud */ + /* Determine the chip type. This algorithm is taken from Linux. */ + if (pl2303_class->hport->device_desc.bDeviceClass == 0x02) { + pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303; + } else if (pl2303_class->hport->device_desc.bMaxPacketSize0 == 0x40) { + pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HX; + } else { + pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303; + } + break; + } + + /* + * The new chip revision PL2303HXN is only compatible with the new + * PLCOM_SET_REQUEST_PL2303HXN command. Issuing the old command + * PLCOM_SET_REQUEST to the new chip raises an error. Thus, PL2303HX + * and PL2303HXN can be distinguished by issuing an old-style request + * (on a status register) to the new chip and checking the error. + */ + if (pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303HX) { + struct usb_setup_packet *setup = pl2303_class->hport->setup; + + setup->bmRequestType = UT_READ_VENDOR_DEVICE; + setup->bRequest = PL2303_SET_REQUEST; + setup->wValue = PL2303_STATUS_REG_PL2303HX; + setup->wIndex = 0; + setup->wLength = 1; + + ret = usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); + if (ret == -USB_ERR_STALL) { + pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HXN; + ret = 0; + } else if (ret < 0) { + USB_LOG_WRN("Error checking chip type: %d\r\n", ret); + return ret; + } + } + + switch (pl2303_class->chiptype) { + case USBH_PL2303_TYPE_PL2303: + USB_LOG_INFO("chiptype = 2303\r\n"); + break; + case USBH_PL2303_TYPE_PL2303HX: + USB_LOG_INFO("chiptype = 2303HX/TA\r\n"); + break; + case USBH_PL2303_TYPE_PL2303HXN: + USB_LOG_INFO("chiptype = 2303HXN\r\n"); + break; + case USBH_PL2303_TYPE_PL2303HXD: + USB_LOG_INFO("chiptype = 2303HXD/TB/RA/EA\r\n"); + break; + default: + USB_LOG_INFO("chiptype = [%d]\r\n", pl2303_class->chiptype); + break; + } + + return ret; +} + +static int usbh_pl2303_do(struct usbh_pl2303 *pl2303_class, + uint8_t req_type, uint8_t request, uint16_t value, uint16_t index, + uint16_t length) +{ + struct usb_setup_packet *setup; + + if (!pl2303_class || !pl2303_class->hport) { + return -USB_ERR_INVAL; + } + setup = pl2303_class->hport->setup; + + setup->bmRequestType = req_type; + setup->bRequest = request; + setup->wValue = value; + setup->wIndex = index; + setup->wLength = length; + + return usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); +} + +int usbh_pl2303_set_line_coding(struct usbh_pl2303 *pl2303_class, struct cdc_line_coding *line_coding) +{ + struct usb_setup_packet *setup; + + if (!pl2303_class || !pl2303_class->hport) { + return -USB_ERR_INVAL; + } + setup = pl2303_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SET_LINE_CODING; + setup->wValue = 0; + setup->wIndex = pl2303_class->intf; + setup->wLength = 7; + + memcpy(g_pl2303_buf, line_coding, sizeof(struct cdc_line_coding)); + + return usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); +} + +int usbh_pl2303_get_line_coding(struct usbh_pl2303 *pl2303_class, struct cdc_line_coding *line_coding) +{ + struct usb_setup_packet *setup; + int ret; + + if (!pl2303_class || !pl2303_class->hport) { + return -USB_ERR_INVAL; + } + setup = pl2303_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_LINE_CODING; + setup->wValue = 0; + setup->wIndex = pl2303_class->intf; + setup->wLength = 7; + + ret = usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); + if (ret < 0) { + return ret; + } + memcpy(line_coding, g_pl2303_buf, sizeof(struct cdc_line_coding)); + return ret; +} + +int usbh_pl2303_set_line_state(struct usbh_pl2303 *pl2303_class, bool dtr, bool rts) +{ + struct usb_setup_packet *setup; + + if (!pl2303_class || !pl2303_class->hport) { + return -USB_ERR_INVAL; + } + setup = pl2303_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SET_CONTROL_LINE_STATE; + setup->wValue = (dtr << 0) | (rts << 1); + setup->wIndex = pl2303_class->intf; + setup->wLength = 0; + + return usbh_control_transfer(pl2303_class->hport, setup, NULL); +} + +static int usbh_pl2303_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret = 0; + + struct usbh_pl2303 *pl2303_class = usbh_pl2303_class_alloc(); + if (pl2303_class == NULL) { + USB_LOG_ERR("Fail to alloc pl2303_class\r\n"); + return -USB_ERR_NOMEM; + } + + pl2303_class->hport = hport; + pl2303_class->intf = intf; + + hport->config.intf[intf].priv = pl2303_class; + + do { + ret = usbh_pl2303_get_chiptype(pl2303_class); + if (ret < 0) { + break; + } + + /* Startup reset sequence, if necessary for the chip type */ + if (pl2303_class->chiptype != USBH_PL2303_TYPE_PL2303HXN) { + struct usb_setup_packet *setup = pl2303_class->hport->setup; + + setup->bmRequestType = UT_WRITE_VENDOR_DEVICE; + setup->bRequest = PL2303_SET_REQUEST; + setup->wValue = 0; + setup->wIndex = pl2303_class->intf; + setup->wLength = 0; + + ret = usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); + if (ret < 0) { + USB_LOG_WRN("Initialization reset failed: %d\r\n", ret); + break; + } + } + + if (pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303) { + /* HX variants seem to lock up after a clear stall request. */ + /* + * The FreeBSD code sets the stall flags on the in and out pipes + * here. Have no idea exactly how to do this, or if it is necessary. + * May just leave this code unwritten until test hardware is available. + */ + } else if (pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303HX || pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303HXD) { + /* Reset upstream data pipes */ + ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 8, 0, 0); + if (ret < 0) { + USB_LOG_WRN("Could not reset upstream data pipes (8,0): %d\r\n", ret); + break; + } + ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 9, 0, 0); + if (ret < 0) { + USB_LOG_WRN("Could not reset upstream data pipes (9,0): %d\r\n", ret); + break; + } + } else if (pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303HXN) { + /* Reset upstream data pipes */ + ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST_PL2303HXN, 0x07, 0x03, 0); + if (ret < 0) { + USB_LOG_WRN("Could not reset upstream data pipes (7,3): %d\r\n", ret); + break; + } + } + + /* Final device initialization, if necessary for the chip type */ + if (pl2303_class->chiptype != USBH_PL2303_TYPE_PL2303HXN) { + if (usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8484, 0, 1) < 0 || + usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x0404, 0, 0) < 0 || + usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8484, 0, 1) < 0 || + usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8383, 0, 1) < 0 || + usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8484, 0, 1) < 0 || + usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x0404, 1, 0) < 0 || + usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8484, 0, 1) < 0 || + usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8383, 0, 1) < 0 || + usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 0, 1, 0) < 0 || + usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 1, 0, 0) < 0) { + USB_LOG_WRN("Could not complete init sequence\r\n"); + ret = -USB_ERR_INVAL; + break; + } + + if (pl2303_class->chiptype != USBH_PL2303_TYPE_PL2303) { + ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 2, 0x44, 0); + } else { + ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 2, 0x24, 0); + } + if (ret < 0) { + USB_LOG_WRN("Could not complete final init request: %d\r\n", ret); + break; + } + } + } while (0); + + if (ret < 0) { + USB_LOG_ERR("Failed to initialize PL2303 device: %d\r\n", ret); + return ret; + } + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + continue; + } else { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(pl2303_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(pl2303_class->bulkout, ep_desc); + } + } + } + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, pl2303_class->minor); + + USB_LOG_INFO("Register PL2303 Class:%s\r\n", hport->config.intf[intf].devname); + +#if 0 + USB_LOG_INFO("Test pl2303 rx and tx and rx for 5 times, baudrate is 115200\r\n"); + + struct cdc_line_coding linecoding; + uint8_t count = 5; + + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_pl2303_set_line_coding(pl2303_class, &linecoding); + usbh_pl2303_set_line_state(pl2303_class, true, false); + + memset(g_pl2303_buf, 'a', sizeof(g_pl2303_buf)); + ret = usbh_pl2303_bulk_out_transfer(pl2303_class, g_pl2303_buf, sizeof(g_pl2303_buf), 0xfffffff); + USB_LOG_RAW("out ret:%d\r\n", ret); + while (count--) { + ret = usbh_pl2303_bulk_in_transfer(pl2303_class, g_pl2303_buf, sizeof(g_pl2303_buf), 0xfffffff); + USB_LOG_RAW("in ret:%d\r\n", ret); + if (ret > 0) { + for (uint32_t i = 0; i < ret; i++) { + USB_LOG_RAW("%02x ", g_pl2303_buf[i]); + } + } + USB_LOG_RAW("\r\n"); + } +#endif + + usbh_pl2303_run(pl2303_class); + return ret; +} + +static int usbh_pl2303_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_pl2303 *pl2303_class = (struct usbh_pl2303 *)hport->config.intf[intf].priv; + + if (pl2303_class) { + if (pl2303_class->bulkin) { + usbh_kill_urb(&pl2303_class->bulkin_urb); + } + + if (pl2303_class->bulkout) { + usbh_kill_urb(&pl2303_class->bulkout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister PL2303 Class:%s\r\n", hport->config.intf[intf].devname); + usbh_pl2303_stop(pl2303_class); + } + + usbh_pl2303_class_free(pl2303_class); + } + + return ret; +} + +int usbh_pl2303_bulk_in_transfer(struct usbh_pl2303 *pl2303_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &pl2303_class->bulkin_urb; + + usbh_bulk_urb_fill(urb, pl2303_class->hport, pl2303_class->bulkin, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +int usbh_pl2303_bulk_out_transfer(struct usbh_pl2303 *pl2303_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +{ + int ret; + struct usbh_urb *urb = &pl2303_class->bulkout_urb; + + usbh_bulk_urb_fill(urb, pl2303_class->hport, pl2303_class->bulkout, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +__WEAK void usbh_pl2303_run(struct usbh_pl2303 *pl2303_class) +{ + (void)pl2303_class; +} + +__WEAK void usbh_pl2303_stop(struct usbh_pl2303 *pl2303_class) +{ + (void)pl2303_class; +} + +static const uint16_t pl2303_id_table[][2] = { + { 0x067B, 0x2303 }, // PL2303 Serial (ATEN/IOGEAR UC232A) + { 0x067B, 0x23A3 }, // PL2303HXN Serial, type GC + { 0x067B, 0x23B3 }, // PL2303HXN Serial, type GB + { 0x067B, 0x23C3 }, // PL2303HXN Serial, type GT + { 0x067B, 0x23D3 }, // PL2303HXN Serial, type GL + { 0x067B, 0x23E3 }, // PL2303HXN Serial, type GE + { 0x067B, 0x23F3 }, // PL2303HXN Serial, type GS + { 0, 0 }, +}; + +const struct usbh_class_driver pl2303_class_driver = { + .driver_name = "pl2303", + .connect = usbh_pl2303_connect, + .disconnect = usbh_pl2303_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info pl2303_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = pl2303_id_table, + .class_driver = &pl2303_class_driver +}; \ No newline at end of file diff --git a/src/lib/CherryUSB/class/vendor/serial/usbh_pl2303.h b/src/lib/CherryUSB/class/vendor/serial/usbh_pl2303.h new file mode 100644 index 000000000..2b3d05f9e --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/serial/usbh_pl2303.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_PL2303_H +#define USBH_PL2303_H + +#include "usb_cdc.h" + +#define PL2303_SET_REQUEST 0x01 +#define PL2303_SET_REQUEST_PL2303HXN 0x80 +#define PL2303_SET_CRTSCTS 0x41 +#define PL2303_SET_CRTSCTS_PL2303X 0x61 +#define PL2303_SET_CRTSCTS_PL2303HXN 0xFA +#define PL2303_CLEAR_CRTSCTS_PL2303HXN 0xFF +#define PL2303_CRTSCTS_REG_PL2303HXN 0x0A +#define PL2303_STATUS_REG_PL2303HX 0x8080 + +/* Different PL2303 IC types */ +#define USBH_PL2303_TYPE_UNKNOWN 0 +#define USBH_PL2303_TYPE_PL2303 1 +#define USBH_PL2303_TYPE_PL2303HX 2 +#define USBH_PL2303_TYPE_PL2303HXD 3 +#define USBH_PL2303_TYPE_PL2303HXN 4 + +struct usbh_pl2303 { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + + struct usbh_urb bulkout_urb; + struct usbh_urb bulkin_urb; + + struct cdc_line_coding linecoding; + + uint8_t intf; + uint8_t minor; + uint8_t chiptype; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_pl2303_set_line_coding(struct usbh_pl2303 *pl2303_class, struct cdc_line_coding *line_coding); +int usbh_pl2303_get_line_coding(struct usbh_pl2303 *pl2303_class, struct cdc_line_coding *line_coding); +int usbh_pl2303_set_line_state(struct usbh_pl2303 *pl2303_class, bool dtr, bool rts); + +int usbh_pl2303_bulk_in_transfer(struct usbh_pl2303 *pl2303_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); +int usbh_pl2303_bulk_out_transfer(struct usbh_pl2303 *pl2303_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); + +void usbh_pl2303_run(struct usbh_pl2303 *pl2303_class); +void usbh_pl2303_stop(struct usbh_pl2303 *pl2303_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_PL2303_H */ diff --git a/src/lib/CherryUSB/class/vendor/wifi/.gitkeep b/src/lib/CherryUSB/class/vendor/wifi/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/lib/CherryUSB/class/vendor/xbox/usbh_xbox.c b/src/lib/CherryUSB/class/vendor/xbox/usbh_xbox.c new file mode 100644 index 000000000..364ca27cb --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/xbox/usbh_xbox.c @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2024 Till Harbaum + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_xbox.h" + +#define DEV_FORMAT "/dev/xbox%d" + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_xbox_buf[128]; + +static struct usbh_xbox g_xbox_class[CONFIG_USBHOST_MAX_XBOX_CLASS]; +static uint32_t g_devinuse = 0; + +static struct usbh_xbox *usbh_xbox_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_XBOX_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_xbox_class[devno], 0, sizeof(struct usbh_xbox)); + g_xbox_class[devno].minor = devno; + return &g_xbox_class[devno]; + } + } + return NULL; +} + +static void usbh_xbox_class_free(struct usbh_xbox *xbox_class) +{ + uint8_t devno = xbox_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(xbox_class, 0, sizeof(struct usbh_xbox)); +} + +int usbh_xbox_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + + struct usbh_xbox *xbox_class = usbh_xbox_class_alloc(); + if (xbox_class == NULL) { + USB_LOG_ERR("Fail to alloc xbox_class\r\n"); + return -USB_ERR_NOMEM; + } + + xbox_class->hport = hport; + xbox_class->intf = intf; + + hport->config.intf[intf].priv = xbox_class; + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(xbox_class->intin, ep_desc); + } else { + USBH_EP_INIT(xbox_class->intout, ep_desc); + } + } + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, xbox_class->minor); + + USB_LOG_INFO("Register XBOX Class:%s\r\n", hport->config.intf[intf].devname); + + usbh_xbox_run(xbox_class); + return 0; +} + +int usbh_xbox_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_xbox *xbox_class = (struct usbh_xbox *)hport->config.intf[intf].priv; + + if (xbox_class) { + if (xbox_class->intin) { + usbh_kill_urb(&xbox_class->intin_urb); + } + + if (xbox_class->intout) { + usbh_kill_urb(&xbox_class->intout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister XBOX Class:%s\r\n", hport->config.intf[intf].devname); + usbh_xbox_stop(xbox_class); + } + + usbh_xbox_class_free(xbox_class); + } + + return ret; +} + +__WEAK void usbh_xbox_run(struct usbh_xbox *xbox_class) +{ +} + +__WEAK void usbh_xbox_stop(struct usbh_xbox *xbox_class) +{ +} + +const struct usbh_class_driver xbox_class_driver = { + .driver_name = "xbox", + .connect = usbh_xbox_connect, + .disconnect = usbh_xbox_disconnect +}; + +static const uint16_t xbox_id_table[][2] = { + { 0x0079, 0x18d4 }, // GPD Win 2 X-Box Controller + { 0x03eb, 0xff01 }, // Wooting One (Legacy) + { 0x03eb, 0xff02 }, // Wooting Two (Legacy) + { 0x044f, 0xb326 }, // Thrustmaster Gamepad GP XID + { 0x045e, 0x028e }, // Microsoft X-Box 360 pad + { 0x045e, 0x028f }, // Microsoft X-Box 360 pad v2 + { 0x046d, 0xc21d }, // Logitech Gamepad F310 + { 0x046d, 0xc21e }, // Logitech Gamepad F510 + { 0x046d, 0xc21f }, // Logitech Gamepad F710 + { 0x046d, 0xc242 }, // Logitech Chillstream Controller + { 0x046d, 0xcaa3 }, // Logitech DriveFx Racing Wheel + { 0x056e, 0x2004 }, // Elecom JC-U3613M + { 0x06a3, 0xf51a }, // Saitek P3600 + { 0x0738, 0x4716 }, // Mad Catz Wired Xbox 360 Controller + { 0x0738, 0x4718 }, // Mad Catz Street Fighter IV FightStick SE + { 0x0738, 0x4726 }, // Mad Catz Xbox 360 Controller + { 0x0738, 0x4736 }, // Mad Catz MicroCon Gamepad + { 0x0738, 0x4740 }, // Mad Catz Beat Pad + { 0x0738, 0x9871 }, // Mad Catz Portable Drum + { 0x0738, 0xb726 }, // Mad Catz Xbox controller - MW2 + { 0x0738, 0xbeef }, // Mad Catz JOYTECH NEO SE Advanced GamePad + { 0x0738, 0xcb02 }, // Saitek Cyborg Rumble Pad - PC/Xbox 360 + { 0x0738, 0xcb03 }, // Saitek P3200 Rumble Pad - PC/Xbox 360 + { 0x0738, 0xcb29 }, // Saitek Aviator Stick AV8R02 + { 0x0738, 0xf738 }, // Super SFIV FightStick TE S + { 0x07ff, 0xffff }, // Mad Catz GamePad + { 0x0e6f, 0x0113 }, // Afterglow AX.1 Gamepad for Xbox 360 + { 0x0e6f, 0x011f }, // Rock Candy Gamepad Wired Controller + { 0x0e6f, 0x0131 }, // PDP EA Sports Controller + { 0x0e6f, 0x0133 }, // Xbox 360 Wired Controller + { 0x0e6f, 0x0201 }, // Pelican PL-3601 'TSZ' Wired Xbox 360 Controller + { 0x0e6f, 0x0213 }, // Afterglow Gamepad for Xbox 360 + { 0x0e6f, 0x021f }, // Rock Candy Gamepad for Xbox 360 + { 0x0e6f, 0x0301 }, // Logic3 Controller + { 0x0e6f, 0x0401 }, // Logic3 Controller + { 0x0e6f, 0x0413 }, // Afterglow AX.1 Gamepad for Xbox 360 + { 0x0e6f, 0x0501 }, // PDP Xbox 360 Controller + { 0x0e6f, 0xf900 }, // PDP Afterglow AX.1 + { 0x0f0d, 0x000a }, // Hori Co. DOA4 FightStick + { 0x0f0d, 0x000c }, // Hori PadEX Turbo + { 0x1038, 0x1430 }, // SteelSeries Stratus Duo + { 0x1038, 0x1431 }, // SteelSeries Stratus Duo + { 0x11c9, 0x55f0 }, // Nacon GC-100XF + { 0x1209, 0x2882 }, // Ardwiino Controller + { 0x12ab, 0x0301 }, // PDP AFTERGLOW AX.1 + { 0x1430, 0x4748 }, // RedOctane Guitar Hero X-plorer + { 0x1430, 0xf801 }, // RedOctane Controller + { 0x146b, 0x0601 }, // BigBen Interactive XBOX 360 Controller + { 0x1532, 0x0037 }, // Razer Sabertooth + { 0x15e4, 0x3f00 }, // Power A Mini Pro Elite + { 0x15e4, 0x3f0a }, // Xbox Airflo wired controller + { 0x15e4, 0x3f10 }, // Batarang Xbox 360 controller + { 0x162e, 0xbeef }, // Joytech Neo-Se Take2 + { 0x1689, 0xfd00 }, // Razer Onza Tournament Edition + { 0x1689, 0xfd01 }, // Razer Onza Classic Edition + { 0x1689, 0xfe00 }, // Razer Sabertooth + { 0x1949, 0x041a }, // Amazon Game Controller + { 0x1bad, 0x0002 }, // Harmonix Rock Band Guitar + { 0x1bad, 0xf016 }, // Mad Catz Xbox 360 Controller + { 0x1bad, 0xf021 }, // Mad Cats Ghost Recon FS GamePad + { 0x1bad, 0xf023 }, // MLG Pro Circuit Controller (Xbox) + { 0x1bad, 0xf025 }, // Mad Catz Call Of Duty + { 0x1bad, 0xf027 }, // Mad Catz FPS Pro + { 0x1bad, 0xf028 }, // Street Fighter IV FightPad + { 0x1bad, 0xf030 }, // Mad Catz Xbox 360 MC2 MicroCon Racing Wheel + { 0x1bad, 0xf036 }, // Mad Catz MicroCon GamePad Pro + { 0x1bad, 0xf038 }, // Street Fighter IV FightStick TE + { 0x1bad, 0xf501 }, // HoriPad EX2 Turbo + { 0x1bad, 0xf506 }, // Hori Real Arcade Pro.EX Premium VLX + { 0x1bad, 0xf900 }, // Harmonix Xbox 360 Controller + { 0x1bad, 0xf901 }, // Gamestop Xbox 360 Controller + { 0x1bad, 0xf903 }, // Tron Xbox 360 controller + { 0x1bad, 0xf904 }, // PDP Versus Fighting Pad + { 0x1bad, 0xfa01 }, // MadCatz GamePad + { 0x1bad, 0xfd00 }, // Razer Onza TE + { 0x1bad, 0xfd01 }, // Razer Onza + { 0x20d6, 0x2001 }, // BDA Xbox Series X Wired Controller + { 0x20d6, 0x281f }, // PowerA Wired Controller For Xbox 360 + { 0x24c6, 0x5300 }, // PowerA MINI PROEX Controller + { 0x24c6, 0x5303 }, // Xbox Airflo wired controller + { 0x24c6, 0x530a }, // Xbox 360 Pro EX Controller + { 0x24c6, 0x531a }, // PowerA Pro Ex + { 0x24c6, 0x5397 }, // FUS1ON Tournament Controller + { 0x24c6, 0x5500 }, // Hori XBOX 360 EX 2 with Turbo + { 0x24c6, 0x5501 }, // Hori Real Arcade Pro VX-SA + { 0x24c6, 0x5506 }, // Hori SOULCALIBUR V Stick + { 0x24c6, 0x550d }, // Hori GEM Xbox controller + { 0x24c6, 0x5b00 }, // ThrustMaster Ferrari 458 Racing Wheel + { 0x24c6, 0x5b02 }, // Thrustmaster, Inc. GPX Controller + { 0x24c6, 0x5b03 }, // Thrustmaster Ferrari 458 Racing Wheel + { 0x24c6, 0x5d04 }, // Razer Sabertooth + { 0x24c6, 0xfafe }, // Rock Candy Gamepad for Xbox 360 + { 0x2563, 0x058d }, // OneXPlayer Gamepad + { 0x2dc8, 0x3106 }, // 8BitDo Ultimate Wireless / Pro 2 Wired Controller + { 0x2dc8, 0x3109 }, // 8BitDo Ultimate Wireless Bluetooth + { 0x31e3, 0x1100 }, // Wooting One + { 0x31e3, 0x1200 }, // Wooting Two + { 0x31e3, 0x1210 }, // Wooting Lekker + { 0x31e3, 0x1220 }, // Wooting Two HE + { 0x31e3, 0x1230 }, // Wooting Two HE (ARM) + { 0x31e3, 0x1300 }, // Wooting 60HE (AVR) + { 0x31e3, 0x1310 }, // Wooting 60HE (ARM) + { 0x3285, 0x0607 }, // Nacon GC-100 + { 0x413d, 0x2104 }, // Black Shark Green Ghost Gamepad + { 0x0000, 0x0000 } // end of list +}; + +CLASS_INFO_DEFINE const struct usbh_class_info xbox_custom_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_VEND_SPECIFIC, + .bInterfaceSubClass = 0x5d, + .bInterfaceProtocol = 0x01, + .id_table = xbox_id_table, + .class_driver = &xbox_class_driver +}; diff --git a/src/lib/CherryUSB/class/vendor/xbox/usbh_xbox.h b/src/lib/CherryUSB/class/vendor/xbox/usbh_xbox.h new file mode 100644 index 000000000..85d467249 --- /dev/null +++ b/src/lib/CherryUSB/class/vendor/xbox/usbh_xbox.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2024, Till Harbaum + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_XBOX_H +#define USBH_XBOX_H + +struct usbh_xbox { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *intin; /* INTR IN endpoint */ + struct usb_endpoint_descriptor *intout; /* INTR OUT endpoint */ + struct usbh_urb intin_urb; /* INTR IN urb */ + struct usbh_urb intout_urb; /* INTR OUT urb */ + + uint8_t intf; /* interface number */ + uint8_t minor; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +void usbh_xbox_run(struct usbh_xbox *xbox_class); +void usbh_xbox_stop(struct usbh_xbox *xbox_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_XBOX_H */ diff --git a/src/lib/CherryUSB/class/video/usb_video.h b/src/lib/CherryUSB/class/video/usb_video.h new file mode 100644 index 000000000..8f95992b4 --- /dev/null +++ b/src/lib/CherryUSB/class/video/usb_video.h @@ -0,0 +1,1380 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_VIDEO_H +#define USB_VIDEO_H + +#define USB_DEVICE_VIDEO_CLASS_VERSION_1_5 0 + +/*! @brief Video device subclass code */ +#define VIDEO_SC_UNDEFINED 0x00U +#define VIDEO_SC_VIDEOCONTROL 0x01U +#define VIDEO_SC_VIDEOSTREAMING 0x02U +#define VIDEO_SC_VIDEO_INTERFACE_COLLECTION 0x03U + +/*! @brief Video device protocol code */ +#define VIDEO_PC_PROTOCOL_UNDEFINED 0x00U +#define VIDEO_PC_PROTOCOL_15 0x01U + +/*! @brief Video device class-specific descriptor type */ +#define VIDEO_CS_UNDEFINED_DESCRIPTOR_TYPE 0x20U +#define VIDEO_CS_DEVICE_DESCRIPTOR_TYPE 0x21U +#define VIDEO_CS_CONFIGURATION_DESCRIPTOR_TYPE 0x22U +#define VIDEO_CS_STRING_DESCRIPTOR_TYPE 0x23U +#define VIDEO_CS_INTERFACE_DESCRIPTOR_TYPE 0x24U +#define VIDEO_CS_ENDPOINT_DESCRIPTOR_TYPE 0x25U + +/*! @brief Video device class-specific VC interface descriptor subtype */ +#define VIDEO_VC_DESCRIPTOR_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U +#define VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE 0x01U +#define VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE 0x02U +#define VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE 0x03U +#define VIDEO_VC_SELECTOR_UNIT_DESCRIPTOR_SUBTYPE 0x04U +#define VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE 0x05U +#define VIDEO_VC_EXTENSION_UNIT_DESCRIPTOR_SUBTYPE 0x06U +#define VIDEO_VC_ENCODING_UNIT_DESCRIPTOR_SUBTYPE 0x07U + +/*! @brief Video device class-specific VS interface descriptor subtype */ +#define VIDEO_VS_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U +#define VIDEO_VS_INPUT_HEADER_DESCRIPTOR_SUBTYPE 0x01U +#define VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_SUBTYPE 0x02U +#define VIDEO_VS_STILL_IMAGE_FRAME_DESCRIPTOR_SUBTYPE 0x03U +#define VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_SUBTYPE 0x04U +#define VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_SUBTYPE 0x05U +#define VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_SUBTYPE 0x06U +#define VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE 0x07U +#define VIDEO_VS_FORMAT_MPEG2TS_DESCRIPTOR_SUBTYPE 0x0AU +#define VIDEO_VS_FORMAT_DV_DESCRIPTOR_SUBTYPE 0x0CU +#define VIDEO_VS_COLORFORMAT_DESCRIPTOR_SUBTYPE 0x0DU +#define VIDEO_VS_FORMAT_FRAME_BASED_DESCRIPTOR_SUBTYPE 0x10U +#define VIDEO_VS_FRAME_FRAME_BASED_DESCRIPTOR_SUBTYPE 0x11U +#define VIDEO_VS_FORMAT_STREAM_BASED_DESCRIPTOR_SUBTYPE 0x12U +#define VIDEO_VS_FORMAT_H264_DESCRIPTOR_SUBTYPE 0x13U +#define VIDEO_VS_FRAME_H264_DESCRIPTOR_SUBTYPE 0x14U +#define VIDEO_VS_FORMAT_H264_SIMULCAST_DESCRIPTOR_SUBTYPE 0x15U +#define VIDEO_VS_FORMAT_VP8_DESCRIPTOR_SUBTYPE 0x16U +#define VIDEO_VS_FRAME_VP8_DESCRIPTOR_SUBTYPE 0x17U +#define VIDEO_VS_FORMAT_VP8_SIMULCAST_DESCRIPTOR_SUBTYPE 0x18U + +/*! @brief Video device class-specific VC endpoint descriptor subtype */ +#define VIDEO_EP_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U +#define VIDEO_EP_GENERAL_DESCRIPTOR_SUBTYPE 0x01U +#define VIDEO_EP_ENDPOINT_DESCRIPTOR_SUBTYPE 0x02U +#define VIDEO_EP_INTERRUPT_DESCRIPTOR_SUBTYPE 0x03U + +/*! @brief Video device class-specific request code */ +#define VIDEO_REQUEST_UNDEFINED 0x00U +#define VIDEO_REQUEST_SET_CUR 0x01U +#define VIDEO_REQUEST_SET_CUR_ALL 0x11U +#define VIDEO_REQUEST_GET_CUR 0x81U +#define VIDEO_REQUEST_GET_MIN 0x82U +#define VIDEO_REQUEST_GET_MAX 0x83U +#define VIDEO_REQUEST_GET_RES 0x84U +#define VIDEO_REQUEST_GET_LEN 0x85U +#define VIDEO_REQUEST_GET_INFO 0x86U +#define VIDEO_REQUEST_GET_DEF 0x87U +#define VIDEO_REQUEST_GET_CUR_ALL 0x91U +#define VIDEO_REQUEST_GET_MIN_ALL 0x92U +#define VIDEO_REQUEST_GET_MAX_ALL 0x93U +#define VIDEO_REQUEST_GET_RES_ALL 0x94U +#define VIDEO_REQUEST_GET_DEF_ALL 0x97U + +/*! @brief Video device class-specific VideoControl interface control selector */ +#define VIDEO_VC_CONTROL_UNDEFINED 0x00U +#define VIDEO_VC_VIDEO_POWER_MODE_CONTROL 0x01U +#define VIDEO_VC_REQUEST_ERROR_CODE_CONTROL 0x02U + +/*! @brief Video device class-specific Terminal control selector */ +#define VIDEO_TE_CONTROL_UNDEFINED 0x00U + +/*! @brief Video device class-specific Selector Unit control selector */ +#define VIDEO_SU_CONTROL_UNDEFINED 0x00U +#define VIDEO_SU_INPUT_SELECT_CONTROL 0x01U + +/*! @brief Video device class-specific Camera Terminal control selector */ +#define VIDEO_CT_CONTROL_UNDEFINED 0x00U +#define VIDEO_CT_SCANNING_MODE_CONTROL 0x01U +#define VIDEO_CT_AE_MODE_CONTROL 0x02U +#define VIDEO_CT_AE_PRIORITY_CONTROL 0x03U +#define VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04U +#define VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05U +#define VIDEO_CT_FOCUS_ABSOLUTE_CONTROL 0x06U +#define VIDEO_CT_FOCUS_RELATIVE_CONTROL 0x07U +#define VIDEO_CT_FOCUS_AUTO_CONTROL 0x08U +#define VIDEO_CT_IRIS_ABSOLUTE_CONTROL 0x09U +#define VIDEO_CT_IRIS_RELATIVE_CONTROL 0x0AU +#define VIDEO_CT_ZOOM_ABSOLUTE_CONTROL 0x0BU +#define VIDEO_CT_ZOOM_RELATIVE_CONTROL 0x0CU +#define VIDEO_CT_PANTILT_ABSOLUTE_CONTROL 0x0DU +#define VIDEO_CT_PANTILT_RELATIVE_CONTROL 0x0EU +#define VIDEO_CT_ROLL_ABSOLUTE_CONTROL 0x0FU +#define VIDEO_CT_ROLL_RELATIVE_CONTROL 0x10U +#define VIDEO_CT_PRIVACY_CONTROL 0x11U +#define VIDEO_CT_FOCUS_SIMPLE_CONTROL 0x12U +#define VIDEO_CT_WINDOW_CONTROL 0x13U +#define VIDEO_CT_REGION_OF_INTEREST_CONTROL 0x14U + +/*! @brief Video device class-specific Processing Unit control selector */ +#define VIDEO_PU_CONTROL_UNDEFINED 0x00U +#define VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL 0x01U +#define VIDEO_PU_BRIGHTNESS_CONTROL 0x02U +#define VIDEO_PU_CONTRAST_CONTROL 0x03U +#define VIDEO_PU_GAIN_CONTROL 0x04U +#define VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL 0x05U +#define VIDEO_PU_HUE_CONTROL 0x06U +#define VIDEO_PU_SATURATION_CONTROL 0x07U +#define VIDEO_PU_SHARPNESS_CONTROL 0x08U +#define VIDEO_PU_GAMMA_CONTROL 0x09U +#define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0AU +#define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0BU +#define VIDEO_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0CU +#define VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0DU +#define VIDEO_PU_DIGITAL_MULTIPLIER_CONTROL 0x0EU +#define VIDEO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0FU +#define VIDEO_PU_HUE_AUTO_CONTROL 0x10U +#define VIDEO_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11U +#define VIDEO_PU_ANALOG_LOCK_STATUS_CONTROL 0x12U +#define VIDEO_PU_CONTRAST_AUTO_CONTROL 0x13U + +/*! @brief Video device class-specific Encoding Unit control selector */ +#define VIDEO_EU_CONTROL_UNDEFINED 0x00U +#define VIDEO_EU_SELECT_LAYER_CONTROL 0x01U +#define VIDEO_EU_PROFILE_TOOLSET_CONTROL 0x02U +#define VIDEO_EU_VIDEO_RESOLUTION_CONTROL 0x03U +#define VIDEO_EU_MIN_FRAME_INTERVAL_CONTROL 0x04U +#define VIDEO_EU_SLICE_MODE_CONTROL 0x05U +#define VIDEO_EU_RATE_CONTROL_MODE_CONTROL 0x06U +#define VIDEO_EU_AVERAGE_BITRATE_CONTROL 0x07U +#define VIDEO_EU_CPB_SIZE_CONTROL 0x08U +#define VIDEO_EU_PEAK_BIT_RATE_CONTROL 0x09U +#define VIDEO_EU_QUANTIZATION_PARAMS_CONTROL 0x0AU +#define VIDEO_EU_SYNC_REF_FRAME_CONTROL 0x0BU +#define VIDEO_EU_LTR_BUFFER_CONTROL 0x0CU +#define VIDEO_EU_LTR_PICTURE_CONTROL 0x0DU +#define VIDEO_EU_LTR_VALIDATION_CONTROL 0x0EU +#define VIDEO_EU_LEVEL_IDC_LIMIT_CONTROL 0x0FU +#define VIDEO_EU_SEI_PAYLOADTYPE_CONTROL 0x10U +#define VIDEO_EU_QP_RANGE_CONTROL 0x11U +#define VIDEO_EU_PRIORITY_CONTROL 0x12U +#define VIDEO_EU_START_OR_STOP_LAYER_CONTROL 0x13U +#define VIDEO_EU_ERROR_RESILIENCY_CONTROL 0x14U + +/*! @brief Video device class-specific Extension Unit control selector */ +#define VIDEO_XU_CONTROL_UNDEFINED 0x00U + +/*! @brief Video device class-specific VideoStreaming Interface control selector */ +#define VIDEO_VS_CONTROL_UNDEFINED 0x00U +#define VIDEO_VS_PROBE_CONTROL 0x01U +#define VIDEO_VS_COMMIT_CONTROL 0x02U +#define VIDEO_VS_STILL_PROBE_CONTROL 0x03U +#define VIDEO_VS_STILL_COMMIT_CONTROL 0x04U +#define VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL 0x05U +#define VIDEO_VS_STREAM_ERROR_CODE_CONTROL 0x06U +#define VIDEO_VS_GENERATE_KEY_FRAME_CONTROL 0x07U +#define VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08U +#define VIDEO_VS_SYNCH_DELAY_CONTROL 0x09U + +/*! @}*/ + +/*! + * @name USB Video class terminal types + * @{ + */ + +/*! @brief Video device USB terminal type */ +#define VIDEO_TT_VENDOR_SPECIFIC 0x0100U +#define VIDEO_TT_STREAMING 0x0101U + +/*! @brief Video device input terminal type */ +#define VIDEO_ITT_VENDOR_SPECIFIC 0x0200U +#define VIDEO_ITT_CAMERA 0x0201U +#define VIDEO_ITT_MEDIA_TRANSPORT_INPUT 0x0202U + +/*! @brief Video device output terminal type */ +#define VIDEO_OTT_VENDOR_SPECIFIC 0x0300U +#define VIDEO_OTT_DISPLAY 0x0301U +#define VIDEO_OTT_MEDIA_TRANSPORT_OUTPUT 0x0302U + +/*! @brief Video device external terminal type */ +#define VIDEO_ET_VENDOR_SPECIFIC 0x0400U +#define VIDEO_ET_COMPOSITE_CONNECTOR 0x0401U +#define VIDEO_ET_SVIDEO_CONNECTOR 0x0402U +#define VIDEO_ET_COMPONENT_CONNECTOR 0x0403U + +/*! @}*/ + +/*! + * @name USB Video class setup request types + * @{ + */ + +/*! @brief Video device class setup request set type */ +#define VIDEO_SET_REQUEST_INTERFACE 0x21U +#define VIDEO_SET_REQUEST_ENDPOINT 0x22U + +/*! @brief Video device class setup request get type */ +#define VIDEO_GET_REQUEST_INTERFACE 0xA1U +#define VIDEO_GET_REQUEST_ENDPOINT 0xA2U + +/*! @}*/ + +/*! @brief Video device still image trigger control */ +#define VIDEO_STILL_IMAGE_TRIGGER_NORMAL_OPERATION 0x00U +#define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE 0x01U +#define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE_VS_DEDICATED_BULK_PIPE 0x02U +#define VIDEO_STILL_IMAGE_TRIGGER_ABORT_STILL_IMAGE_TRANSMISSION 0x03U + +/*! + * @name USB Video device class-specific request commands + * @{ + */ + +/*! @brief Video device class-specific request GET CUR COMMAND */ +#define VIDEO_GET_CUR_VC_POWER_MODE_CONTROL 0x8101U +#define VIDEO_GET_CUR_VC_ERROR_CODE_CONTROL 0x8102U + +#define VIDEO_GET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8121U +#define VIDEO_GET_CUR_PU_BRIGHTNESS_CONTROL 0x8122U +#define VIDEO_GET_CUR_PU_CONTRACT_CONTROL 0x8123U +#define VIDEO_GET_CUR_PU_GAIN_CONTROL 0x8124U +#define VIDEO_GET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL 0x8125U +#define VIDEO_GET_CUR_PU_HUE_CONTROL 0x8126U +#define VIDEO_GET_CUR_PU_SATURATION_CONTROL 0x8127U +#define VIDEO_GET_CUR_PU_SHARRNESS_CONTROL 0x8128U +#define VIDEO_GET_CUR_PU_GAMMA_CONTROL 0x8129U +#define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x812AU +#define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x812BU +#define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x812CU +#define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x812DU +#define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL 0x812EU +#define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x812FU +#define VIDEO_GET_CUR_PU_HUE_AUTO_CONTROL 0x8130U +#define VIDEO_GET_CUR_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x8131U +#define VIDEO_GET_CUR_PU_ANALOG_LOCK_STATUS_CONTROL 0x8132U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_CUR_PU_CONTRAST_AUTO_CONTROL 0x8133U +#endif + +#define VIDEO_GET_CUR_CT_SCANNING_MODE_CONTROL 0x8141U +#define VIDEO_GET_CUR_CT_AE_MODE_CONTROL 0x8142U +#define VIDEO_GET_CUR_CT_AE_PRIORITY_CONTROL 0x8143U +#define VIDEO_GET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8144U +#define VIDEO_GET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8145U +#define VIDEO_GET_CUR_CT_FOCUS_ABSOLUTE_CONTROL 0x8146U +#define VIDEO_GET_CUR_CT_FOCUS_RELATIVE_CONTROL 0x8147U +#define VIDEO_GET_CUR_CT_FOCUS_AUTO_CONTROL 0x8148U +#define VIDEO_GET_CUR_CT_IRIS_ABSOLUTE_CONTROL 0x8149U +#define VIDEO_GET_CUR_CT_IRIS_RELATIVE_CONTROL 0x814AU +#define VIDEO_GET_CUR_CT_ZOOM_ABSOLUTE_CONTROL 0x814BU +#define VIDEO_GET_CUR_CT_ZOOM_RELATIVE_CONTROL 0x814CU +#define VIDEO_GET_CUR_CT_PANTILT_ABSOLUTE_CONTROL 0x814DU +#define VIDEO_GET_CUR_CT_PANTILT_RELATIVE_CONTROL 0x814EU +#define VIDEO_GET_CUR_CT_ROLL_ABSOLUTE_CONTROL 0x814FU +#define VIDEO_GET_CUR_CT_ROLL_RELATIVE_CONTROL 0x8150U +#define VIDEO_GET_CUR_CT_PRIVACY_CONTROL 0x8151U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_CUR_CT_FOCUS_SIMPLE_CONTROL 0x8152U +#define VIDEO_GET_CUR_CT_DIGITAL_WINDOW_CONTROL 0x8153U +#define VIDEO_GET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x8154U +#endif + +#define VIDEO_GET_CUR_VS_PROBE_CONTROL 0x8161U +#define VIDEO_GET_CUR_VS_COMMIT_CONTROL 0x8162U +#define VIDEO_GET_CUR_VS_STILL_PROBE_CONTROL 0x8163U +#define VIDEO_GET_CUR_VS_STILL_COMMIT_CONTROL 0x8164U +#define VIDEO_GET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL 0x8165U +#define VIDEO_GET_CUR_VS_STREAM_ERROR_CODE_CONTROL 0x8166U +#define VIDEO_GET_CUR_VS_GENERATE_KEY_FRAME_CONTROL 0x8167U +#define VIDEO_GET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8168U +#define VIDEO_GET_CUR_VS_SYNCH_DELAY_CONTROL 0x8169U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_CUR_EU_SELECT_LAYER_CONTROL 0x8181U +#define VIDEO_GET_CUR_EU_PROFILE_TOOLSET_CONTROL 0x8182U +#define VIDEO_GET_CUR_EU_VIDEO_RESOLUTION_CONTROL 0x8183U +#define VIDEO_GET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL 0x8184U +#define VIDEO_GET_CUR_EU_SLICE_MODE_CONTROL 0x8185U +#define VIDEO_GET_CUR_EU_RATE_CONTROL_MODE_CONTROL 0x8186U +#define VIDEO_GET_CUR_EU_AVERAGE_BITRATE_CONTROL 0x8187U +#define VIDEO_GET_CUR_EU_CPB_SIZE_CONTROL 0x8188U +#define VIDEO_GET_CUR_EU_PEAK_BIT_RATE_CONTROL 0x8189U +#define VIDEO_GET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x818AU +#define VIDEO_GET_CUR_EU_SYNC_REF_FRAME_CONTROL 0x818BU +#define VIDEO_GET_CUR_EU_LTR_BUFFER_CONTROL 0x818CU +#define VIDEO_GET_CUR_EU_LTR_PICTURE_CONTROL 0x818DU +#define VIDEO_GET_CUR_EU_LTR_VALIDATION_CONTROL 0x818EU +#define VIDEO_GET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL 0x818FU +#define VIDEO_GET_CUR_EU_SEI_PAYLOADTYPE_CONTROL 0x8190U +#define VIDEO_GET_CUR_EU_QP_RANGE_CONTROL 0x8191U +#define VIDEO_GET_CUR_EU_PRIORITY_CONTROL 0x8192U +#define VIDEO_GET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x8193U +#define VIDEO_GET_CUR_EU_ERROR_RESILIENCY_CONTROL 0x8194U +#endif + +/*! @brief Video device class-specific request GET MIN COMMAND */ +#define VIDEO_GET_MIN_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8221U +#define VIDEO_GET_MIN_PU_BRIGHTNESS_CONTROL 0x8222U +#define VIDEO_GET_MIN_PU_CONTRACT_CONTROL 0x8223U +#define VIDEO_GET_MIN_PU_GAIN_CONTROL 0x8224U +#define VIDEO_GET_MIN_PU_HUE_CONTROL 0x8226U +#define VIDEO_GET_MIN_PU_SATURATION_CONTROL 0x8227U +#define VIDEO_GET_MIN_PU_SHARRNESS_CONTROL 0x8228U +#define VIDEO_GET_MIN_PU_GAMMA_CONTROL 0x8229U +#define VIDEO_GET_MIN_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x822AU +#define VIDEO_GET_MIN_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x822CU +#define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_CONTROL 0x822EU +#define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x822FU + +#define VIDEO_GET_MIN_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8244U +#define VIDEO_GET_MIN_CT_FOCUS_ABSOLUTE_CONTROL 0x8246U +#define VIDEO_GET_MIN_CT_FOCUS_RELATIVE_CONTROL 0x8247U +#define VIDEO_GET_MIN_CT_IRIS_ABSOLUTE_CONTROL 0x8249U +#define VIDEO_GET_MIN_CT_ZOOM_ABSOLUTE_CONTROL 0x824BU +#define VIDEO_GET_MIN_CT_ZOOM_RELATIVE_CONTROL 0x824CU +#define VIDEO_GET_MIN_CT_PANTILT_ABSOLUTE_CONTROL 0x824DU +#define VIDEO_GET_MIN_CT_PANTILT_RELATIVE_CONTROL 0x824EU +#define VIDEO_GET_MIN_CT_ROLL_ABSOLUTE_CONTROL 0x824FU +#define VIDEO_GET_MIN_CT_ROLL_RELATIVE_CONTROL 0x8250U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_MIN_CT_DIGITAL_WINDOW_CONTROL 0x8251U +#define VIDEO_GET_MIN_CT_REGION_OF_INTEREST_CONTROL 0x8252U +#endif + +#define VIDEO_GET_MIN_VS_PROBE_CONTROL 0x8261U +#define VIDEO_GET_MIN_VS_STILL_PROBE_CONTROL 0x8263U +#define VIDEO_GET_MIN_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8268U +#define VIDEO_GET_MIN_VS_SYNCH_DELAY_CONTROL 0x8269U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_MIN_EU_VIDEO_RESOLUTION_CONTROL 0x8283U +#define VIDEO_GET_MIN_EU_MIN_FRAME_INTERVAL_CONTROL 0x8284U +#define VIDEO_GET_MIN_EU_SLICE_MODE_CONTROL 0x8285U +#define VIDEO_GET_MIN_EU_AVERAGE_BITRATE_CONTROL 0x8287U +#define VIDEO_GET_MIN_EU_CPB_SIZE_CONTROL 0x8288U +#define VIDEO_GET_MIN_EU_PEAK_BIT_RATE_CONTROL 0x8289U +#define VIDEO_GET_MIN_EU_QUANTIZATION_PARAMS_CONTROL 0x828AU +#define VIDEO_GET_MIN_EU_SYNC_REF_FRAME_CONTROL 0x828BU +#define VIDEO_GET_MIN_EU_LEVEL_IDC_LIMIT_CONTROL 0x828FU +#define VIDEO_GET_MIN_EU_SEI_PAYLOADTYPE_CONTROL 0x8290U +#define VIDEO_GET_MIN_EU_QP_RANGE_CONTROL 0x8291U +#endif + +/*! @brief Video device class-specific request GET MAX COMMAND */ +#define VIDEO_GET_MAX_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8321U +#define VIDEO_GET_MAX_PU_BRIGHTNESS_CONTROL 0x8322U +#define VIDEO_GET_MAX_PU_CONTRACT_CONTROL 0x8323U +#define VIDEO_GET_MAX_PU_GAIN_CONTROL 0x8324U +#define VIDEO_GET_MAX_PU_HUE_CONTROL 0x8326U +#define VIDEO_GET_MAX_PU_SATURATION_CONTROL 0x8327U +#define VIDEO_GET_MAX_PU_SHARRNESS_CONTROL 0x8328U +#define VIDEO_GET_MAX_PU_GAMMA_CONTROL 0x8329U +#define VIDEO_GET_MAX_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x832AU +#define VIDEO_GET_MAX_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x832CU +#define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_CONTROL 0x832EU +#define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x832FU + +#define VIDEO_GET_MAX_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8344U +#define VIDEO_GET_MAX_CT_FOCUS_ABSOLUTE_CONTROL 0x8346U +#define VIDEO_GET_MAX_CT_FOCUS_RELATIVE_CONTROL 0x8347U +#define VIDEO_GET_MAX_CT_IRIS_ABSOLUTE_CONTROL 0x8349U +#define VIDEO_GET_MAX_CT_ZOOM_ABSOLUTE_CONTROL 0x834BU +#define VIDEO_GET_MAX_CT_ZOOM_RELATIVE_CONTROL 0x834CU +#define VIDEO_GET_MAX_CT_PANTILT_ABSOLUTE_CONTROL 0x834DU +#define VIDEO_GET_MAX_CT_PANTILT_RELATIVE_CONTROL 0x834EU +#define VIDEO_GET_MAX_CT_ROLL_ABSOLUTE_CONTROL 0x834FU +#define VIDEO_GET_MAX_CT_ROLL_RELATIVE_CONTROL 0x8350U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_MAX_CT_DIGITAL_WINDOW_CONTROL 0x8351U +#define VIDEO_GET_MAX_CT_REGION_OF_INTEREST_CONTROL 0x8352U +#endif + +#define VIDEO_GET_MAX_VS_PROBE_CONTROL 0x8361U +#define VIDEO_GET_MAX_VS_STILL_PROBE_CONTROL 0x8363U +#define VIDEO_GET_MAX_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8368U +#define VIDEO_GET_MAX_VS_SYNCH_DELAY_CONTROL 0x8369U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_MAX_EU_VIDEO_RESOLUTION_CONTROL 0x8383U +#define VIDEO_GET_MAX_EU_MIN_FRAME_INTERVAL_CONTROL 0x8384U +#define VIDEO_GET_MAX_EU_SLICE_MODE_CONTROL 0x8385U +#define VIDEO_GET_MAX_EU_AVERAGE_BITRATE_CONTROL 0x8387U +#define VIDEO_GET_MAX_EU_CPB_SIZE_CONTROL 0x8388U +#define VIDEO_GET_MAX_EU_PEAK_BIT_RATE_CONTROL 0x8389U +#define VIDEO_GET_MAX_EU_QUANTIZATION_PARAMS_CONTROL 0x838AU +#define VIDEO_GET_MAX_EU_SYNC_REF_FRAME_CONTROL 0x838BU +#define VIDEO_GET_MAX_EU_LTR_BUFFER_CONTROL 0x838CU +#define VIDEO_GET_MAX_EU_LEVEL_IDC_LIMIT_CONTROL 0x838FU +#define VIDEO_GET_MAX_EU_SEI_PAYLOADTYPE_CONTROL 0x8390U +#define VIDEO_GET_MAX_EU_QP_RANGE_CONTROL 0x8391U +#endif + +/*! @brief Video device class-specific request GET RES COMMAND */ +#define VIDEO_GET_RES_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8421U +#define VIDEO_GET_RES_PU_BRIGHTNESS_CONTROL 0x8422U +#define VIDEO_GET_RES_PU_CONTRACT_CONTROL 0x8423U +#define VIDEO_GET_RES_PU_GAIN_CONTROL 0x8424U +#define VIDEO_GET_RES_PU_HUE_CONTROL 0x8426U +#define VIDEO_GET_RES_PU_SATURATION_CONTROL 0x8427U +#define VIDEO_GET_RES_PU_SHARRNESS_CONTROL 0x8428U +#define VIDEO_GET_RES_PU_GAMMA_CONTROL 0x8429U +#define VIDEO_GET_RES_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x842AU +#define VIDEO_GET_RES_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x842CU +#define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_CONTROL 0x842EU +#define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x842FU + +#define VIDEO_GET_RES_CT_AE_MODE_CONTROL 0x8442U +#define VIDEO_GET_RES_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8444U +#define VIDEO_GET_RES_CT_FOCUS_ABSOLUTE_CONTROL 0x8446U +#define VIDEO_GET_RES_CT_FOCUS_RELATIVE_CONTROL 0x8447U +#define VIDEO_GET_RES_CT_IRIS_ABSOLUTE_CONTROL 0x8449U +#define VIDEO_GET_RES_CT_ZOOM_ABSOLUTE_CONTROL 0x844BU +#define VIDEO_GET_RES_CT_ZOOM_RELATIVE_CONTROL 0x844CU +#define VIDEO_GET_RES_CT_PANTILT_ABSOLUTE_CONTROL 0x844DU +#define VIDEO_GET_RES_CT_PANTILT_RELATIVE_CONTROL 0x844EU +#define VIDEO_GET_RES_CT_ROLL_ABSOLUTE_CONTROL 0x844FU +#define VIDEO_GET_RES_CT_ROLL_RELATIVE_CONTROL 0x8450U + +#define VIDEO_GET_RES_VS_PROBE_CONTROL 0x8461U +#define VIDEO_GET_RES_VS_STILL_PROBE_CONTROL 0x8463U +#define VIDEO_GET_RES_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8468U +#define VIDEO_GET_RES_VS_SYNCH_DELAY_CONTROL 0x8469U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_RES_EU_AVERAGE_BITRATE_CONTROL 0x8487U +#define VIDEO_GET_RES_EU_CPB_SIZE_CONTROL 0x8488U +#define VIDEO_GET_RES_EU_PEAK_BIT_RATE_CONTROL 0x8489U +#define VIDEO_GET_RES_EU_QUANTIZATION_PARAMS_CONTROL 0x848AU +#define VIDEO_GET_RES_EU_ERROR_RESILIENCY_CONTROL 0x8494U +#endif + +/*! @brief Video device class-specific request GET LEN COMMAND */ + +#define VIDEO_GET_LEN_VS_PROBE_CONTROL 0x8561U +#define VIDEO_GET_LEN_VS_COMMIT_CONTROL 0x8562U +#define VIDEO_GET_LEN_VS_STILL_PROBE_CONTROL 0x8563U +#define VIDEO_GET_LEN_VS_STILL_COMMIT_CONTROL 0x8564U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_LEN_EU_SELECT_LAYER_CONTROL 0x8581U +#define VIDEO_GET_LEN_EU_PROFILE_TOOLSET_CONTROL 0x8582U +#define VIDEO_GET_LEN_EU_VIDEO_RESOLUTION_CONTROL 0x8583U +#define VIDEO_GET_LEN_EU_MIN_FRAME_INTERVAL_CONTROL 0x8584U +#define VIDEO_GET_LEN_EU_SLICE_MODE_CONTROL 0x8585U +#define VIDEO_GET_LEN_EU_RATE_CONTROL_MODE_CONTROL 0x8586U +#define VIDEO_GET_LEN_EU_AVERAGE_BITRATE_CONTROL 0x8587U +#define VIDEO_GET_LEN_EU_CPB_SIZE_CONTROL 0x8588U +#define VIDEO_GET_LEN_EU_PEAK_BIT_RATE_CONTROL 0x8589U +#define VIDEO_GET_LEN_EU_QUANTIZATION_PARAMS_CONTROL 0x858AU +#define VIDEO_GET_LEN_EU_SYNC_REF_FRAME_CONTROL 0x858BU +#define VIDEO_GET_LEN_EU_LTR_BUFFER_CONTROL 0x858CU +#define VIDEO_GET_LEN_EU_LTR_PICTURE_CONTROL 0x858DU +#define VIDEO_GET_LEN_EU_LTR_VALIDATION_CONTROL 0x858EU +#define VIDEO_GET_LEN_EU_QP_RANGE_CONTROL 0x8591U +#define VIDEO_GET_LEN_EU_PRIORITY_CONTROL 0x8592U +#define VIDEO_GET_LEN_EU_START_OR_STOP_LAYER_CONTROL 0x8593U +#endif + +/*! @brief Video device class-specific request GET INFO COMMAND */ +#define VIDEO_GET_INFO_VC_POWER_MODE_CONTROL 0x8601U +#define VIDEO_GET_INFO_VC_ERROR_CODE_CONTROL 0x8602U + +#define VIDEO_GET_INFO_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8621U +#define VIDEO_GET_INFO_PU_BRIGHTNESS_CONTROL 0x8622U +#define VIDEO_GET_INFO_PU_CONTRACT_CONTROL 0x8623U +#define VIDEO_GET_INFO_PU_GAIN_CONTROL 0x8624U +#define VIDEO_GET_INFO_PU_POWER_LINE_FREQUENCY_CONTROL 0x8625U +#define VIDEO_GET_INFO_PU_HUE_CONTROL 0x8626U +#define VIDEO_GET_INFO_PU_SATURATION_CONTROL 0x8627U +#define VIDEO_GET_INFO_PU_SHARRNESS_CONTROL 0x8628U +#define VIDEO_GET_INFO_PU_GAMMA_CONTROL 0x8629U +#define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x862AU +#define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x862BU +#define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x862CU +#define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x862DU +#define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_CONTROL 0x862EU +#define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x862FU +#define VIDEO_GET_INFO_PU_HUE_AUTO_CONTROL 0x8630U +#define VIDEO_GET_INFO_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x8631U +#define VIDEO_GET_INFO_PU_ANALOG_LOCK_STATUS_CONTROL 0x8632U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_INFO_PU_CONTRAST_AUTO_CONTROL 0x8633U +#endif + +#define VIDEO_GET_INFO_CT_SCANNING_MODE_CONTROL 0x8641U +#define VIDEO_GET_INFO_CT_AE_MODE_CONTROL 0x8642U +#define VIDEO_GET_INFO_CT_AE_PRIORITY_CONTROL 0x8643U +#define VIDEO_GET_INFO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8644U +#define VIDEO_GET_INFO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8645U +#define VIDEO_GET_INFO_CT_FOCUS_ABSOLUTE_CONTROL 0x8646U +#define VIDEO_GET_INFO_CT_FOCUS_RELATIVE_CONTROL 0x8647U +#define VIDEO_GET_INFO_CT_FOCUS_AUTO_CONTROL 0x8648U +#define VIDEO_GET_INFO_CT_IRIS_ABSOLUTE_CONTROL 0x8649U +#define VIDEO_GET_INFO_CT_IRIS_RELATIVE_CONTROL 0x864AU +#define VIDEO_GET_INFO_CT_ZOOM_ABSOLUTE_CONTROL 0x864BU +#define VIDEO_GET_INFO_CT_ZOOM_RELATIVE_CONTROL 0x864CU +#define VIDEO_GET_INFO_CT_PANTILT_ABSOLUTE_CONTROL 0x864DU +#define VIDEO_GET_INFO_CT_PANTILT_RELATIVE_CONTROL 0x864EU +#define VIDEO_GET_INFO_CT_ROLL_ABSOLUTE_CONTROL 0x864FU +#define VIDEO_GET_INFO_CT_ROLL_RELATIVE_CONTROL 0x8650U +#define VIDEO_GET_INFO_CT_PRIVACY_CONTROL 0x8651U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_INFO_CT_FOCUS_SIMPLE_CONTROL 0x8652U +#endif + +#define VIDEO_GET_INFO_VS_PROBE_CONTROL 0x8661U +#define VIDEO_GET_INFO_VS_COMMIT_CONTROL 0x8662U +#define VIDEO_GET_INFO_VS_STILL_PROBE_CONTROL 0x8663U +#define VIDEO_GET_INFO_VS_STILL_COMMIT_CONTROL 0x8664U +#define VIDEO_GET_INFO_VS_STILL_IMAGE_TRIGGER_CONTROL 0x8665U +#define VIDEO_GET_INFO_VS_STREAM_ERROR_CODE_CONTROL 0x8666U +#define VIDEO_GET_INFO_VS_GENERATE_KEY_FRAME_CONTROL 0x8667U +#define VIDEO_GET_INFO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8668U +#define VIDEO_GET_INFO_VS_SYNCH_DELAY_CONTROL 0x8669U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_INFO_EU_SELECT_LAYER_CONTROL 0x8681U +#define VIDEO_GET_INFO_EU_PROFILE_TOOLSET_CONTROL 0x8682U +#define VIDEO_GET_INFO_EU_VIDEO_RESOLUTION_CONTROL 0x8683U +#define VIDEO_GET_INFO_EU_MIN_FRAME_INTERVAL_CONTROL 0x8684U +#define VIDEO_GET_INFO_EU_SLICE_MODE_CONTROL 0x8685U +#define VIDEO_GET_INFO_EU_RATE_CONTROL_MODE_CONTROL 0x8686U +#define VIDEO_GET_INFO_EU_AVERAGE_BITRATE_CONTROL 0x8687U +#define VIDEO_GET_INFO_EU_CPB_SIZE_CONTROL 0x8688U +#define VIDEO_GET_INFO_EU_PEAK_BIT_RATE_CONTROL 0x8689U +#define VIDEO_GET_INFO_EU_QUANTIZATION_PARAMS_CONTROL 0x868AU +#define VIDEO_GET_INFO_EU_SYNC_REF_FRAME_CONTROL 0x868BU +#define VIDEO_GET_INFO_EU_LTR_BUFFER_CONTROL 0x868CU +#define VIDEO_GET_INFO_EU_LTR_PICTURE_CONTROL 0x868DU +#define VIDEO_GET_INFO_EU_LTR_VALIDATION_CONTROL 0x868EU +#define VIDEO_GET_INFO_EU_SEI_PAYLOADTYPE_CONTROL 0x8690U +#define VIDEO_GET_INFO_EU_QP_RANGE_CONTROL 0x8691U +#define VIDEO_GET_INFO_EU_PRIORITY_CONTROL 0x8692U +#define VIDEO_GET_INFO_EU_START_OR_STOP_LAYER_CONTROL 0x8693U +#endif + +/*! @brief Video device class-specific request GET DEF COMMAND */ +#define VIDEO_GET_DEF_PU_BACKLIGHT_COMPENSATION_CONTROL 0x8721U +#define VIDEO_GET_DEF_PU_BRIGHTNESS_CONTROL 0x8722U +#define VIDEO_GET_DEF_PU_CONTRACT_CONTROL 0x8723U +#define VIDEO_GET_DEF_PU_GAIN_CONTROL 0x8724U +#define VIDEO_GET_DEF_PU_POWER_LINE_FREQUENCY_CONTROL 0x8725U +#define VIDEO_GET_DEF_PU_HUE_CONTROL 0x8726U +#define VIDEO_GET_DEF_PU_SATURATION_CONTROL 0x8727U +#define VIDEO_GET_DEF_PU_SHARRNESS_CONTROL 0x8728U +#define VIDEO_GET_DEF_PU_GAMMA_CONTROL 0x8729U +#define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x872AU +#define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x872BU +#define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x872CU +#define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x872DU +#define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_CONTROL 0x872EU +#define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x872FU +#define VIDEO_GET_DEF_PU_HUE_AUTO_CONTROL 0x8730U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_DEF_PU_CONTRAST_AUTO_CONTROL 0x8731U +#endif + +#define VIDEO_GET_DEF_CT_AE_MODE_CONTROL 0x8742U +#define VIDEO_GET_DEF_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8744U +#define VIDEO_GET_DEF_CT_FOCUS_ABSOLUTE_CONTROL 0x8746U +#define VIDEO_GET_DEF_CT_FOCUS_RELATIVE_CONTROL 0x8747U +#define VIDEO_GET_DEF_CT_FOCUS_AUTO_CONTROL 0x8748U +#define VIDEO_GET_DEF_CT_IRIS_ABSOLUTE_CONTROL 0x8749U +#define VIDEO_GET_DEF_CT_ZOOM_ABSOLUTE_CONTROL 0x874BU +#define VIDEO_GET_DEF_CT_ZOOM_RELATIVE_CONTROL 0x874CU +#define VIDEO_GET_DEF_CT_PANTILT_ABSOLUTE_CONTROL 0x874DU +#define VIDEO_GET_DEF_CT_PANTILT_RELATIVE_CONTROL 0x874EU +#define VIDEO_GET_DEF_CT_ROLL_ABSOLUTE_CONTROL 0x874FU +#define VIDEO_GET_DEF_CT_ROLL_RELATIVE_CONTROL 0x8750U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_DEF_CT_FOCUS_SIMPLE_CONTROL 0x8751U +#define VIDEO_GET_DEF_CT_DIGITAL_WINDOW_CONTROL 0x8752U +#define VIDEO_GET_DEF_CT_REGION_OF_INTEREST_CONTROL 0x8753U +#endif + +#define VIDEO_GET_DEF_VS_PROBE_CONTROL 0x8761U +#define VIDEO_GET_DEF_VS_STILL_PROBE_CONTROL 0x8763U +#define VIDEO_GET_DEF_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8768U +#define VIDEO_GET_DEF_VS_SYNCH_DELAY_CONTROL 0x8769U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_GET_DEF_EU_PROFILE_TOOLSET_CONTROL 0x8782U +#define VIDEO_GET_DEF_EU_VIDEO_RESOLUTION_CONTROL 0x8783U +#define VIDEO_GET_DEF_EU_MIN_FRAME_INTERVAL_CONTROL 0x8784U +#define VIDEO_GET_DEF_EU_SLICE_MODE_CONTROL 0x8785U +#define VIDEO_GET_DEF_EU_RATE_CONTROL_MODE_CONTROL 0x8786U +#define VIDEO_GET_DEF_EU_AVERAGE_BITRATE_CONTROL 0x8787U +#define VIDEO_GET_DEF_EU_CPB_SIZE_CONTROL 0x8788U +#define VIDEO_GET_DEF_EU_PEAK_BIT_RATE_CONTROL 0x8789U +#define VIDEO_GET_DEF_EU_QUANTIZATION_PARAMS_CONTROL 0x878AU +#define VIDEO_GET_DEF_EU_LTR_BUFFER_CONTROL 0x878CU +#define VIDEO_GET_DEF_EU_LTR_PICTURE_CONTROL 0x878DU +#define VIDEO_GET_DEF_EU_LTR_VALIDATION_CONTROL 0x878EU +#define VIDEO_GET_DEF_EU_LEVEL_IDC_LIMIT_CONTROL 0x878FU +#define VIDEO_GET_DEF_EU_SEI_PAYLOADTYPE_CONTROL 0x8790U +#define VIDEO_GET_DEF_EU_QP_RANGE_CONTROL 0x8791U +#define VIDEO_GET_DEF_EU_ERROR_RESILIENCY_CONTROL 0x8794U +#endif + +/*! @brief Video device class-specific request SET CUR COMMAND */ +#define VIDEO_SET_CUR_VC_POWER_MODE_CONTROL 0x0101U + +#define VIDEO_SET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL 0x0121U +#define VIDEO_SET_CUR_PU_BRIGHTNESS_CONTROL 0x0122U +#define VIDEO_SET_CUR_PU_CONTRACT_CONTROL 0x0123U +#define VIDEO_SET_CUR_PU_GAIN_CONTROL 0x0124U +#define VIDEO_SET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL 0x0125U +#define VIDEO_SET_CUR_PU_HUE_CONTROL 0x0126U +#define VIDEO_SET_CUR_PU_SATURATION_CONTROL 0x0127U +#define VIDEO_SET_CUR_PU_SHARRNESS_CONTROL 0x0128U +#define VIDEO_SET_CUR_PU_GAMMA_CONTROL 0x0129U +#define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x012AU +#define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x012BU +#define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x012CU +#define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x012DU +#define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL 0x012EU +#define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x012FU +#define VIDEO_SET_CUR_PU_HUE_AUTO_CONTROL 0x0130U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_SET_CUR_PU_CONTRAST_AUTO_CONTROL 0x0131U +#endif + +#define VIDEO_SET_CUR_CT_SCANNING_MODE_CONTROL 0x0141U +#define VIDEO_SET_CUR_CT_AE_MODE_CONTROL 0x0142U +#define VIDEO_SET_CUR_CT_AE_PRIORITY_CONTROL 0x0143U +#define VIDEO_SET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x0144U +#define VIDEO_SET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x0145U +#define VIDEO_SET_CUR_CT_FOCUS_ABSOLUTE_CONTROL 0x0146U +#define VIDEO_SET_CUR_CT_FOCUS_RELATIVE_CONTROL 0x0147U +#define VIDEO_SET_CUR_CT_FOCUS_AUTO_CONTROL 0x0148U +#define VIDEO_SET_CUR_CT_IRIS_ABSOLUTE_CONTROL 0x0149U +#define VIDEO_SET_CUR_CT_IRIS_RELATIVE_CONTROL 0x014AU +#define VIDEO_SET_CUR_CT_ZOOM_ABSOLUTE_CONTROL 0x014BU +#define VIDEO_SET_CUR_CT_ZOOM_RELATIVE_CONTROL 0x014CU +#define VIDEO_SET_CUR_CT_PANTILT_ABSOLUTE_CONTROL 0x014DU +#define VIDEO_SET_CUR_CT_PANTILT_RELATIVE_CONTROL 0x014EU +#define VIDEO_SET_CUR_CT_ROLL_ABSOLUTE_CONTROL 0x014FU +#define VIDEO_SET_CUR_CT_ROLL_RELATIVE_CONTROL 0x0150U +#define VIDEO_SET_CUR_CT_PRIVACY_CONTROL 0x0151U +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_SET_CUR_CT_FOCUS_SIMPLE_CONTROL 0x0152U +#define VIDEO_SET_CUR_CT_DIGITAL_WINDOW_CONTROL 0x0153U +#define VIDEO_SET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x0154U +#endif + +#define VIDEO_SET_CUR_VS_PROBE_CONTROL 0x0161U +#define VIDEO_SET_CUR_VS_COMMIT_CONTROL 0x0162U +#define VIDEO_SET_CUR_VS_STILL_PROBE_CONTROL 0x0163U +#define VIDEO_SET_CUR_VS_STILL_COMMIT_CONTROL 0x0164U +#define VIDEO_SET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL 0x0165U +#define VIDEO_SET_CUR_VS_STREAM_ERROR_CODE_CONTROL 0x0166U +#define VIDEO_SET_CUR_VS_GENERATE_KEY_FRAME_CONTROL 0x0167U +#define VIDEO_SET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x0168U +#define VIDEO_SET_CUR_VS_SYNCH_DELAY_CONTROL 0x0169U + +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 +#define VIDEO_SET_CUR_EU_SELECT_LAYER_CONTROL 0x0181U +#define VIDEO_SET_CUR_EU_PROFILE_TOOLSET_CONTROL 0x0182U +#define VIDEO_SET_CUR_EU_VIDEO_RESOLUTION_CONTROL 0x0183U +#define VIDEO_SET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL 0x0184U +#define VIDEO_SET_CUR_EU_SLICE_MODE_CONTROL 0x0185U +#define VIDEO_SET_CUR_EU_RATE_CONTROL_MODE_CONTROL 0x0186U +#define VIDEO_SET_CUR_EU_AVERAGE_BITRATE_CONTROL 0x0187U +#define VIDEO_SET_CUR_EU_CPB_SIZE_CONTROL 0x0188U +#define VIDEO_SET_CUR_EU_PEAK_BIT_RATE_CONTROL 0x0189U +#define VIDEO_SET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x018AU +#define VIDEO_SET_CUR_EU_SYNC_REF_FRAME_CONTROL 0x018BU +#define VIDEO_SET_CUR_EU_LTR_BUFFER_CONTROL 0x018CU +#define VIDEO_SET_CUR_EU_LTR_PICTURE_CONTROL 0x018DU +#define VIDEO_SET_CUR_EU_LTR_VALIDATION_CONTROL 0x018EU +#define VIDEO_SET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL 0x018FU +#define VIDEO_SET_CUR_EU_SEI_PAYLOADTYPE_CONTROL 0x0190U +#define VIDEO_SET_CUR_EU_QP_RANGE_CONTROL 0x0191U +#define VIDEO_SET_CUR_EU_PRIORITY_CONTROL 0x0192U +#define VIDEO_SET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x0193U +#define VIDEO_SET_CUR_EU_ERROR_RESILIENCY_CONTROL 0x0194U +#endif + +/*! @brief The payload header structure. */ +struct video_payload_header { + uint8_t bHeaderLength; /*!< The payload header length. */ + union { + uint8_t bmheaderInfo; /*!< The payload header bitmap field. */ + struct + { + uint8_t frameIdentifier : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays + constant for the rest of the frame.*/ + uint8_t endOfFrame : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the + last video sample that belongs to a frame.*/ + uint8_t + presentationTimeStamp : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of + a PTS field.*/ + uint8_t sourceClockReference : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence + of a SCR field.*/ + uint8_t reserved : 1U; /*!< Reserved. Set to 0. */ + uint8_t stillImage : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a + still image.*/ + uint8_t errorBit : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/ + uint8_t endOfHeader : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/ + } headerInfoBits; + struct + { + uint8_t FID : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays constant + for the rest of the frame.*/ + uint8_t EOI : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the last + video sample that belongs to a frame.*/ + uint8_t PTS : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of a PTS field.*/ + uint8_t SCR : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence of a SCR field.*/ + uint8_t RES : 1U; /*!< Reserved. Set to 0. */ + uint8_t STI : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a still + image.*/ + uint8_t ERR : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/ + uint8_t EOH : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/ + } headerInfoBitmap; + } headerInfoUnion; + uint32_t dwPresentationTime; /*!< Presentation time stamp (PTS) field.*/ + uint8_t bSourceClockReference[6]; /*!< Source clock reference (SCR) field.*/ +} __PACKED; + +/*! @brief The Video probe and commit controls structure.*/ +struct video_probe_and_commit_controls { + union { + uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */ + struct + { + uint8_t dwFrameInterval : 1U; /*!< dwFrameInterval field.*/ + uint8_t wKeyFrameRate : 1U; /*!< wKeyFrameRate field.*/ + uint8_t wPFrameRate : 1U; /*!< wPFrameRate field.*/ + uint8_t wCompQuality : 1U; /*!< wCompQuality field.*/ + uint8_t wCompWindowSize : 1U; /*!< wCompWindowSize field.*/ + uint8_t reserved : 3U; /*!< Reserved field.*/ + } hintBitmap; + } hintUnion; + union { + uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */ + struct + { + uint8_t reserved : 8U; /*!< Reserved field.*/ + } hintBitmap; + } hintUnion1; + uint8_t bFormatIndex; /*!< Video format index from a format descriptor.*/ + uint8_t bFrameIndex; /*!< Video frame index from a frame descriptor.*/ + uint32_t dwFrameInterval; /*!< Frame interval in 100ns units.*/ + uint16_t wKeyFrameRate; /*!< Key frame rate in key-frame per video-frame units.*/ + uint16_t wPFrameRate; /*!< PFrame rate in PFrame/key frame units.*/ + uint16_t wCompQuality; /*!< Compression quality control in abstract units 0U (lowest) to 10000U (highest).*/ + uint16_t wCompWindowSize; /*!< Window size for average bit rate control.*/ + uint16_t wDelay; /*!< Internal video streaming interface latency in ms from video data capture to presentation on + the USB.*/ + uint32_t dwMaxVideoFrameSize; /*!< Maximum video frame or codec-specific segment size in bytes.*/ + uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or + receive in a single payload transfer.*/ + uint32_t dwClockFrequency; /*!< The device clock frequency in Hz for the specified format. This specifies the + units used for the time information fields in the Video Payload Headers in the data + stream.*/ + uint8_t bmFramingInfo; /*!< Bit-field control supporting the following values: D0 Frame ID, D1 EOF.*/ + uint8_t bPreferedVersion; /*!< The preferred payload format version supported by the host or device for the + specified bFormatIndex value.*/ + uint8_t bMinVersion; /*!< The minimum payload format version supported by the device for the specified bFormatIndex + value.*/ + uint8_t bMaxVersion; /*!< The maximum payload format version supported by the device for the specified bFormatIndex + value.*/ +#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5 + uint8_t bUsage; /*!< This bitmap enables features reported by the bmUsages field of the Video Frame Descriptor.*/ + uint8_t + bBitDepthLuma; /*!< Represents bit_depth_luma_minus8 + 8U, which must be the same as bit_depth_chroma_minus8 + + 8.*/ + uint8_t bmSettings; /*!< A bitmap of flags that is used to discover and control specific features of a temporally + encoded video stream.*/ + uint8_t bMaxNumberOfRefFramesPlus1; /*!< Host indicates the maximum number of frames stored for use as references.*/ + uint16_t bmRateControlModes; /*!< This field contains 4U sub-fields, each of which is a 4U bit number.*/ + uint64_t bmLayoutPerStream; /*!< This field contains 4U sub-fields, each of which is a 2U byte number.*/ +#endif +} __PACKED; + +/*! @brief The Video still probe and still commit controls structure.*/ +struct video_still_probe_and_commit_controls { + uint8_t bFormatIndex; /*!< Video format index from a format descriptor.*/ + uint8_t bFrameIndex; /*!< Video frame index from a frame descriptor.*/ + uint8_t bCompressionIndex; /*!< Compression index from a frame descriptor.*/ + uint32_t dwMaxVideoFrameSize; /*!< Maximum still image size in bytes.*/ + uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or + receive in a single payload transfer.*/ +} __PACKED; + +struct video_cs_if_vc_header_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint16_t bcdUVC; + uint16_t wTotalLength; + uint32_t dwClockFrequency; + uint8_t bInCollection; + uint8_t baInterfaceNr[]; +} __PACKED; + +#define VIDEO_SIZEOF_VC_HEADER_DESC(n) (12 + n) + +struct video_cs_if_vc_input_terminal_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t iTerminal; + uint16_t wObjectiveFocalLenMin; + uint16_t wObjectiveFocalLenMax; + uint16_t wOcularFocalLength; + uint8_t bControlSize; + uint8_t bmaControls[]; +} __PACKED; + +#define VIDEO_SIZEOF_VC_INPUT_TERMINAL_DESC(n) (15 + n) + +struct video_cs_if_vc_processing_unit_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bUnitID; + uint8_t bSourceID; + uint16_t wMaxMultiplier; + uint8_t bControlSize; + // uint8_t bmaControls[]; + uint8_t iProcessing; + uint8_t bmVideoStandards; +} __PACKED; + +#define VIDEO_SIZEOF_VC_PROCESSING_UNIT_DESC(n) (10 + n) + +struct video_cs_if_vc_output_terminal_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bTerminalID; + uint16_t wTerminalType; + uint8_t bAssocTerminal; + uint8_t bSourceID; + uint8_t iTerminal; +} __PACKED; + +#define VIDEO_SIZEOF_VC_OUTPUT_TERMINAL_DESC 9 + +struct video_cs_if_vc_extension_unit_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bUnitID; + uint8_t guidExtensionCode[16]; + uint8_t bNumControls; + uint8_t bNrInPins; + // uint8_t baSourceID[]; + uint8_t bControlSize; + // uint8_t bmControls[] + uint8_t iExtension; +} __PACKED; + +#define VIDEO_SIZEOF_VC_EXTENSION_UNIT_DESC(p, n) (24 + p + n) + +struct video_cs_ep_vc_ep_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint16_t wMaxTransferSize; +} __PACKED; + +#define VIDEO_SIZEOF_VC_EP_DESC 5 + +struct video_cs_if_vs_input_header_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bNumFormats; + uint16_t wTotalLength; + uint8_t bEndpointAddress; + uint8_t bmInfo; + uint8_t bTerminalLink; + uint8_t bStillCaptureMethod; + uint8_t bTriggerSupport; + uint8_t bTriggerUsage; + uint8_t bControlSize; + uint8_t bmaControls[]; +} __PACKED; + +#define VIDEO_SIZEOF_VS_INPUT_HEADER_DESC(p, n) (13 + p * n) + +struct video_cs_if_vs_output_header_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bNumFormats; + uint16_t wTotalLength; + uint8_t bEndpointAddress; + uint8_t bTerminalLink; + uint8_t bControlSize; + uint8_t bmaControls[]; +} __PACKED; + +#define VIDEO_SIZEOF_VS_OUTPUT_TERMINAL_DESC(p, n) (9 + p * n) + +struct video_cs_if_vs_format_uncompressed_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint8_t bNumFrameDescriptors; + uint8_t guidFormat[16]; + uint8_t bBitsPerPixel; + uint8_t bDefaultFrameIndex; + uint8_t bAspectRatioX; + uint8_t bAspectRatioY; + uint8_t bmInterlaceFlags; + uint8_t bCopyProtect; +} __PACKED; + +#define VIDEO_SIZEOF_VS_FORMAT_UNCOMPRESSED_DESC (27) + +struct video_cs_if_vs_frame_uncompressed_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwMaxVideoFrameBufferSize; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwFrameInterval[]; +} __PACKED; + +#define VIDEO_SIZEOF_VS_FRAME_UNCOMPRESSED_DESC(n) (26 + 4 * (n)) + +struct video_cs_if_vs_format_mjpeg_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint8_t bNumFrameDescriptors; + uint8_t bmFlags; + uint8_t bDefaultFrameIndex; + uint8_t bAspectRatioX; + uint8_t bAspectRatioY; + uint8_t bmInterlaceFlags; + uint8_t bCopyProtect; +} __PACKED; + +#define VIDEO_SIZEOF_VS_FORMAT_MJPEG_DESC 11 + +struct video_cs_if_vs_frame_mjpeg_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwMaxVideoFrameBufferSize; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwFrameInterval[]; +} __PACKED; + +#define VIDEO_SIZEOF_VS_FRAME_MJPEG_DESC(n) (26 + 4 * (n)) + +/* H264 Payload - 3.1.1. H264 Video Format Descriptor */ +struct video_cs_if_vs_format_h26x_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFormatIndex; + uint8_t bNumFrameDescriptors; + uint8_t guidFormat[16]; + uint8_t bBitsPerPixel; + uint8_t bDefaultFrameIndex; + uint8_t bAspectRatioX; + uint8_t bAspectRatioY; + uint8_t bmInterfaceFlags; + uint8_t bCopyProtect; + uint8_t bVariableSize; +} __PACKED; + +#define VIDEO_SIZEOF_VS_FORMAT_H264_DESC 28 + +/* H264 Payload - 3.1.2. H264 Video Frame Descriptor */ +struct video_cs_if_vs_frame_h26x_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bFrameIndex; + uint8_t bmCapabilities; + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwMinBitRate; + uint32_t dwMaxBitRate; + uint32_t dwDefaultFrameInterval; + uint8_t bFrameIntervalType; + uint32_t dwBytesPerLine; + uint32_t dwFrameInterval[]; +} __PACKED; + +#define VIDEO_SIZEOF_VS_FRAME_H264_DESC(n) (26 + 4 * (n)) + +struct video_cs_if_vs_colorformat_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bColorPrimaries; + uint8_t bXferCharacteristics; + uint8_t bMatrixCoefficients; +} __PACKED; + +#define VIDEO_SIZEOF_VS_COLORFORMAT_DESC 6 + +struct video_vc_input_terminal_bmcontrol_bitmap { + uint32_t scanning_mode : 1; + uint32_t auto_exposure_mode : 1; + uint32_t auto_exposure_priority : 1; + uint32_t exposure_time_absolute : 1; + uint32_t exposure_time_relative : 1; + uint32_t focus_absolute : 1; + uint32_t focus_relative : 1; + uint32_t iris_absolute : 1; + uint32_t iris_relative : 1; + uint32_t zoom_absolute : 1; + uint32_t zoom_relative : 1; + uint32_t pantilt_absolute : 1; + uint32_t pantilt_relative : 1; + uint32_t roll_absolute : 1; + uint32_t roll_relative : 1; + uint32_t reserved : 2; + uint32_t focus_auto : 1; + uint32_t pricvcy : 1; +}; + +struct video_vc_processing_unit_bmcontrol_bitmap { + uint16_t brightness : 1; + uint16_t contrast : 1; + uint16_t hue : 1; + uint16_t saturation : 1; + uint16_t sharpness : 1; + uint16_t gamma : 1; + uint16_t white_bal_temp : 1; + uint16_t white_bal_comp : 1; + uint16_t backlight_comp : 1; + uint16_t gain : 1; + uint16_t power_line_freq : 1; + uint16_t hue_auto : 1; + uint16_t white_bal_temp_auto : 1; + uint16_t white_bal_comp_auto : 1; + uint16_t digital_mult : 1; + uint16_t digital_mult_limit : 1; +}; + +struct video_camera_capabilities { + uint8_t support_get_request : 1; + uint8_t support_set_request : 1; + uint8_t disabled_by_automatic_mode : 1; + uint8_t auto_update_control : 1; + uint8_t async_control : 1; + uint8_t reserved : 3; +}; + +struct video_autoexposure_mode { + uint8_t manual_mode : 1; + uint8_t auto_mode : 1; + uint8_t shutter_priority_mode : 1; + uint8_t aperture_priority_mode : 1; + uint8_t reserved : 4; +}; + +#define VIDEO_GUID_YUY2 0x59, 0x55, 0x59, 0x32, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 +#define VIDEO_GUID_NV12 0x4E, 0x56, 0x31, 0x32, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 +#define VIDEO_GUID_NV21 0x4E, 0x56, 0x32, 0x31, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 +#define VIDEO_GUID_M420 0x4D, 0x34, 0x32, 0x30, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 +#define VIDEO_GUID_I420 0x49, 0x34, 0x32, 0x30, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 +#define VIDEO_GUID_H264 0x48, 0x32, 0x36, 0x34, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 + +#define VIDEO_VC_TERMINAL_LEN (13 + 18 + 12 + 9) + +/*Length of template descriptor: 81 bytes*/ +#define VIDEO_VC_DESCRIPTOR_LEN (8 + 9 + VIDEO_VC_TERMINAL_LEN + 7 + 5) +#define VIDEO_VC_NOEP_DESCRIPTOR_LEN (8 + 9 + VIDEO_VC_TERMINAL_LEN) + +// clang-format off +#define VIDEO_VC_DESCRIPTOR_INIT(bFirstInterface, bEndpointAddress, bcdUVC, wTotalLength, dwClockFrequency, stridx) \ + /* Interface Association Descriptor */ \ + 0x08, \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, \ + bFirstInterface, \ + 0x02, \ + USB_DEVICE_CLASS_VIDEO, \ + VIDEO_SC_VIDEO_INTERFACE_COLLECTION, \ + 0x00, \ + 0x00, /* VideoControl Interface Descriptor */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + 0x00, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints:1 endpoint (interrupt endpoint) */ \ + USB_DEVICE_CLASS_VIDEO, /* bInterfaceClass : CC_VIDEO */ \ + VIDEO_SC_VIDEOCONTROL, /* bInterfaceSubClass : SC_VIDEOCONTROL */ \ + VIDEO_PC_PROTOCOL_UNDEFINED, /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */ \ + stridx, /* iInterface:Index to string descriptor that contains the string */ /*Class-specific VideoControl Interface Descriptor */ \ + 0x0d, /* bLength */ \ + 0x24, /* bDescriptorType : CS_INTERFACE */ \ + VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VC_HEADER subtype */ \ + WBVAL(bcdUVC), /* bcdUVC : Revision of class specification that this device is based upon.*/ \ + WBVAL(wTotalLength), /* wTotalLength */ \ + DBVAL(dwClockFrequency), /* dwClockFrequency : 0x005b8d80 -> 6,000,000 == 6MHz*/ \ + 0x01, /* bInCollection : Number of streaming interfaces. */ \ + (uint8_t)(bFirstInterface + 1), /* baInterfaceNr(0) : VideoStreaming interface 1 belongs to this VideoControl interface.*/ /* Input Terminal 1 -> Processing Unit 2 -> Output Terminal 3 */ \ + 0x12, \ + 0x24, \ + VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE, \ + 0x01, /* bTerminalID */ \ + WBVAL(VIDEO_ITT_CAMERA), /* wTerminalType : 0x0201 Camera Sensor*/ \ + 0x00, /* bAssocTerminal */ \ + 0x00, /* iTerminal */ \ + WBVAL(0x0000), /* wObjectiveFocalLengthMin */ \ + WBVAL(0x0000), /* wObjectiveFocalLengthMax */ \ + WBVAL(0x0000), /* wOcularFocalLength */ \ + 0x03, /* bControlSize */ \ + 0x00, 0x00, 0x00, /* bmControls */ \ + 0x0c, \ + 0x24, \ + VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE, \ + 0x02, /* bUnitID */ \ + 0x01, /* bSourceID */ \ + 0x00, 0x00, /* wMaxMultiplier */ \ + 0x02, /* bControlSize */ \ + 0x00, 0x00, /* bmControls */ \ + 0x00, /* iProcessing */ \ + 0x00, /* bmVideoStandards */ \ + 0x09, \ + 0x24, \ + VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE, \ + 0x03, /* bTerminalID */ \ + WBVAL(VIDEO_TT_STREAMING), \ + 0x00, /* bAssocTerminal */ \ + 0x02, /* bSourceID */ \ + 0x00, /* iTerminal */ \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bEndpointAddress, /* bEndpointAddress */ \ + 0x03, /* bmAttributes */ \ + 0x10, 0x00, /* wMaxPacketSize */ \ + 0x08, /* bInterval */ \ + /* Class-specific VC Interrupt Endpoint Descriptor */ \ + 0x05, 0x25, 0x03, 0x10, 0x00 + +#define VIDEO_VC_NOEP_DESCRIPTOR_INIT(bFirstInterface, bEndpointAddress, bcdUVC, wTotalLength, dwClockFrequency, stridx) \ + /* Interface Association Descriptor */ \ + 0x08, \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, \ + bFirstInterface, \ + 0x02, \ + USB_DEVICE_CLASS_VIDEO, \ + VIDEO_SC_VIDEO_INTERFACE_COLLECTION, \ + 0x00, \ + 0x00, /* VideoControl Interface Descriptor */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + 0x00, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints:1 endpoint (interrupt endpoint) */ \ + USB_DEVICE_CLASS_VIDEO, /* bInterfaceClass : CC_VIDEO */ \ + VIDEO_SC_VIDEOCONTROL, /* bInterfaceSubClass : SC_VIDEOCONTROL */ \ + VIDEO_PC_PROTOCOL_UNDEFINED, /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */ \ + stridx, /* iInterface:Index to string descriptor that contains the string */ /*Class-specific VideoControl Interface Descriptor */ \ + 0x0d, /* bLength */ \ + 0x24, /* bDescriptorType : CS_INTERFACE */ \ + VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VC_HEADER subtype */ \ + WBVAL(bcdUVC), /* bcdUVC : Revision of class specification that this device is based upon.*/ \ + WBVAL(wTotalLength), /* wTotalLength */ \ + DBVAL(dwClockFrequency), /* dwClockFrequency : 0x005b8d80 -> 6,000,000 == 6MHz*/ \ + 0x01, /* bInCollection : Number of streaming interfaces. */ \ + (uint8_t)(bFirstInterface + 1), /* baInterfaceNr(0) : VideoStreaming interface 1 belongs to this VideoControl interface.*/ /* Input Terminal 1 -> Processing Unit 2 -> Output Terminal 3 */ \ + 0x12, \ + 0x24, \ + VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE, \ + 0x01, /* bTerminalID */ \ + WBVAL(VIDEO_ITT_CAMERA), /* wTerminalType : 0x0201 Camera Sensor*/ \ + 0x00, /* bAssocTerminal */ \ + 0x00, /* iTerminal */ \ + WBVAL(0x0000), /* wObjectiveFocalLengthMin */ \ + WBVAL(0x0000), /* wObjectiveFocalLengthMax */ \ + WBVAL(0x0000), /* wOcularFocalLength */ \ + 0x03, /* bControlSize */ \ + 0x00, 0x00, 0x00, /* bmControls */ \ + 0x0c, \ + 0x24, \ + VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE, \ + 0x02, /* bUnitID */ \ + 0x01, /* bSourceID */ \ + 0x00, 0x00, /* wMaxMultiplier */ \ + 0x02, /* bControlSize */ \ + 0x00, 0x00, /* bmControls */ \ + 0x00, /* iProcessing */ \ + 0x00, /* bmVideoStandards */ \ + 0x09, \ + 0x24, \ + VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE, \ + 0x03, /* bTerminalID */ \ + WBVAL(VIDEO_TT_STREAMING), \ + 0x00, /* bAssocTerminal */ \ + 0x02, /* bSourceID */ \ + 0x00 /* iTerminal */ \ + +#define VIDEO_VS_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bNumEndpoints) \ + /* Video Streaming (VS) Interface Descriptor */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType : INTERFACE */ \ + bInterfaceNumber, /* bInterfaceNumber: Index of this interface */ \ + bAlternateSetting, /* bAlternateSetting: Index of this alternate setting */ \ + bNumEndpoints, /* bNumEndpoints : 0 endpoints, no bandwidth used*/ \ + 0x0e, /* bInterfaceClass : CC_VIDEO */ \ + 0x02, /* bInterfaceSubClass : SC_VIDEOSTREAMING */ \ + 0x00, /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */ \ + 0x00 /* iInterface : unused */ + +#define VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(bNumFormats, wTotalLength, bEndpointAddress, ...) \ + /*Class-specific VideoStream Header Descriptor (Input) */ \ + 0x0d + PP_NARG(__VA_ARGS__), \ + 0x24, \ + VIDEO_VS_INPUT_HEADER_DESCRIPTOR_SUBTYPE, \ + bNumFormats, /* bNumFormats : One format descriptor follows. */ \ + WBVAL(wTotalLength), \ + bEndpointAddress, \ + 0x00, /* bmInfo : No dynamic format change supported. */ \ + 0x03, /* bTerminalLink : This VideoStreaming interface supplies terminal ID 2 (Output Terminal). */ \ + 0x00, /* bStillCaptureMethod : Device supports still image capture method 0. */ \ + 0x00, /* bTriggerSupport : Hardware trigger supported for still image capture */ \ + 0x00, /* bTriggerUsage : Hardware trigger should initiate a still image capture. */ \ + 0x01, /* bControlSize : Size of the bmaControls field */ \ + __VA_ARGS__ /* bmaControls : No VideoStreaming specific controls are supported.*/ + +#define VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_INIT(bNumFormats, wTotalLength, bEndpointAddress, ...) \ + /*Class-specific VideoStream Header Descriptor (Input) */ \ + 0x0d + PP_NARG(__VA_ARGS__), \ + 0x24, \ + VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_SUBTYPE, \ + bNumFormats, /* bNumFormats : One format descriptor follows. */ \ + WBVAL(wTotalLength), \ + bEndpointAddress, \ + 0x00, /* bmInfo : No dynamic format change supported. */ \ + 0x03, /* bTerminalLink : This VideoStreaming interface supplies terminal ID 2 (Output Terminal). */ \ + 0x00, /* bStillCaptureMethod : Device supports still image capture method 0. */ \ + 0x00, /* bTriggerSupport : Hardware trigger supported for still image capture */ \ + 0x00, /* bTriggerUsage : Hardware trigger should initiate a still image capture. */ \ + PP_NARG(__VA_ARGS__), /* bControlSize : Size of the bmaControls field */ \ + __VA_ARGS__ /* bmaControls : No VideoStreaming specific controls are supported.*/ + +#define VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_INIT(bFormatIndex, bNumFrameDescriptors, GUIDFormat) \ + /*Payload Format(UNCOMPRESSED) Descriptor */ \ + 0x1b, \ + 0x24, \ + VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FORMAT_UNCOMPRESSED subtype */ \ + bFormatIndex, /* bFormatIndex : First (and only) format descriptor */ \ + bNumFrameDescriptors, /* bNumFrameDescriptors : One frame descriptor for this format follows. */ \ + GUIDFormat, /* GUID Format YUY2 {32595559-0000-0010-8000-00AA00389B71} */ \ + 0x10, /* bBitsPerPixel : Number of bits per pixel used to specify color in the decoded video frame - 16 for yuy2*/ \ + 0x01, /* bDefaultFrameIndex : Default frame index is 1. */ \ + 0x00, /* bAspectRatioX : Non-interlaced stream not required. */ \ + 0x00, /* bAspectRatioY : Non-interlaced stream not required. */ \ + 0x00, /* bmInterlaceFlags : Non-interlaced stream */ \ + 0x00 /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */ + +#define VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_INIT(bFrameIndex, wWidth, wHeight, dwMinBitRate, dwMaxBitRate, \ + dwMaxVideoFrameBufferSize, dwDefaultFrameInterval, bFrameIntervalType, ...) \ + 0x1a + PP_NARG(__VA_ARGS__), \ + 0x24, \ + VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_SUBTYPE, \ + bFrameIndex, \ + 0x00, \ + WBVAL(wWidth), \ + WBVAL(wHeight), \ + DBVAL(dwMinBitRate), \ + DBVAL(dwMaxBitRate), \ + DBVAL(dwMaxVideoFrameBufferSize), \ + dwDefaultFrameInterval, /* dwDefaultFrameInterval : 1,000,000 * 100ns -> 10 FPS */ \ + bFrameIntervalType, /* bFrameIntervalType : Indicates how the frame interval can be programmed. 0: Continuous frame interval 1..255: The number of discrete frame */ \ + __VA_ARGS__ + +#define VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_INIT(bFormatIndex, bNumFrameDescriptors) \ + /*Payload Format(MJPEG) Descriptor */ \ + 0x0b, /* bLength */ \ + 0x24, /* bDescriptorType : CS_INTERFACE */ \ + 0x06, /* bDescriptorSubType : VS_FORMAT_MJPEG subtype */ \ + bFormatIndex, /* bFormatIndex : First (and only) format descriptor */ \ + bNumFrameDescriptors, /* bNumFrameDescriptors : One frame descriptor for this format follows. */ \ + 0x00, /* bmFlags : Uses fixed size samples.. */ \ + 0x01, /* bDefaultFrameIndex : Default frame index is 1. */ \ + 0x00, /* bAspectRatioX : Non-interlaced stream, not required. */ \ + 0x00, /* bAspectRatioY : Non-interlaced stream, not required. */ \ + 0x00, /* bmInterlaceFlags : Non-interlaced stream */ \ + 0x00 /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */ + +#define VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_INIT(bFrameIndex, wWidth, wHeight, dwMinBitRate, dwMaxBitRate, \ + dwMaxVideoFrameBufferSize, dwDefaultFrameInterval, bFrameIntervalType, ...) \ + 0x1a + PP_NARG(__VA_ARGS__), /* bLength */ \ + 0x24, /* bDescriptorType : CS_INTERFACE */ \ + VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FRAME_MJPEG */ \ + bFrameIndex, /* bFrameIndex : First (and only) frame descriptor */ \ + 0x00, /* bmCapabilities : Still images using capture method 0 are supported at this frame setting.D1: Fixed frame-rate. */ \ + WBVAL(wWidth), /* wWidth (2bytes): Width of frame is 128 pixels. */ \ + WBVAL(wHeight), /* wHeight (2bytes): Height of frame is 64 pixels. */ \ + DBVAL(dwMinBitRate), /* dwMinBitRate (4bytes): Min bit rate in bits/s */ \ + DBVAL(dwMaxBitRate), /* dwMaxBitRate (4bytes): Max bit rate in bits/s */ \ + DBVAL(dwMaxVideoFrameBufferSize), /* dwMaxVideoFrameBufSize (4bytes): Maximum video or still frame size, in bytes. */ \ + dwDefaultFrameInterval, /* dwDefaultFrameInterval : 1,000,000 * 100ns -> 10 FPS */ \ + bFrameIntervalType, /* bFrameIntervalType : Indicates how the frame interval can be programmed. 0: Continuous frame interval 1..255: The number of discrete frame */ \ + __VA_ARGS__ + +#define VIDEO_VS_FORMAT_H264_DESCRIPTOR_INIT(bFormatIndex, bNumFrameDescriptors) \ + /*Payload Format(H.264) Descriptor */ \ + 0x1c, /* bLength */ \ + 0x24, /* bDescriptorType : CS_INTERFACE */ \ + VIDEO_VS_FORMAT_FRAME_BASED_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FORMAT_FRAME_BASED subtype */\ + bFormatIndex, /* bFormatIndex : First (and only) format descriptor */ \ + bNumFrameDescriptors, /* bNumFrameDescriptors : One frame descriptor for this format follows. */ \ + VIDEO_GUID_H264, \ + 0x00, /* bmFlags : Uses fixed size samples.. */ \ + 0x01, /* bDefaultFrameIndex : Default frame index is 1. */ \ + 0x00, /* bAspectRatioX : Non-interlaced stream, not required. */ \ + 0x00, /* bAspectRatioY : Non-interlaced stream, not required. */ \ + 0x00, /* bmInterlaceFlags : Non-interlaced stream */ \ + 0x00, /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */ \ + 0x00 /* Variable size: False */ + +#define VIDEO_VS_FRAME_H264_DESCRIPTOR_INIT(bFrameIndex, wWidth, wHeight, dwMinBitRate, dwMaxBitRate, \ + dwDefaultFrameInterval, bFrameIntervalType, ...) \ + 0x1a + PP_NARG(__VA_ARGS__), /* bLength */ \ + 0x24, /* bDescriptorType : CS_INTERFACE */ \ + VIDEO_VS_FRAME_FRAME_BASED_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FRAME_BASED */ \ + bFrameIndex, /* bFrameIndex : First (and only) frame descriptor */ \ + 0x00, /* bmCapabilities : Still images using capture method 0 are supported at this frame setting.D1: Fixed frame-rate. */ \ + WBVAL(wWidth), /* wWidth (2bytes): Width of frame is 128 pixels. */ \ + WBVAL(wHeight), /* wHeight (2bytes): Height of frame is 64 pixels. */ \ + DBVAL(dwMinBitRate), /* dwMinBitRate (4bytes): Min bit rate in bits/s */ \ + DBVAL(dwMaxBitRate), /* dwMaxBitRate (4bytes): Max bit rate in bits/s */ \ + dwDefaultFrameInterval, /* dwDefaultFrameInterval : 1,000,000 * 100ns -> 10 FPS */ \ + bFrameIntervalType, /* bFrameIntervalType : Indicates how the frame interval can be programmed. 0: Continuous frame interval 1..255: The number of discrete frame */ \ + DBVAL(0x00), /* dwBytesPerLine (4bytes) */ \ + __VA_ARGS__ + +#define VIDEO_VS_COLOR_MATCHING_DESCRIPTOR_INIT() \ + 0x06, /* bLength */ \ + 0x24, /* bDescriptorType : CS_INTERFACE */ \ + VIDEO_VS_COLORFORMAT_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_COLORFORMAT */ \ + 0x01, /* bColorPrimaries */ \ + 0x01, /* bTransferCharacteristics */ \ + 0x04 /* bMatrixCoefficients */ + +// clang-format on +#endif /*USB_VIDEO_H */ \ No newline at end of file diff --git a/src/lib/CherryUSB/class/video/usbd_video.c b/src/lib/CherryUSB/class/video/usbd_video.c new file mode 100644 index 000000000..a4e53162d --- /dev/null +++ b/src/lib/CherryUSB/class/video/usbd_video.c @@ -0,0 +1,875 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_video.h" + +struct video_entity_info { + uint8_t bDescriptorSubtype; + uint8_t bEntityId; + uint16_t wTerminalType; +}; + +struct usbd_video_priv { + struct video_probe_and_commit_controls probe; + struct video_probe_and_commit_controls commit; + uint8_t power_mode; + uint8_t error_code; + struct video_entity_info info[3]; + uint8_t *ep_buf; + bool stream_finish; + uint8_t *stream_buf; + uint32_t stream_len; + uint32_t stream_offset; + uint8_t stream_frameid; + uint32_t stream_headerlen; + bool do_copy; +} g_usbd_video[CONFIG_USBDEV_MAX_BUS]; + +static int usbd_video_control_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + uint8_t control_selector = (uint8_t)(setup->wValue >> 8); + + (void)busid; + + switch (control_selector) { + case VIDEO_VC_VIDEO_POWER_MODE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_SET_CUR: + break; + case VIDEO_REQUEST_GET_CUR: + break; + case VIDEO_REQUEST_GET_INFO: + break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + break; + case VIDEO_VC_REQUEST_ERROR_CODE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: + (*data)[0] = 0x06; + *len = 1; + break; + case VIDEO_REQUEST_GET_INFO: + break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + break; + default: + break; + } + + return 0; +} + +static int usbd_video_control_unit_terminal_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + uint8_t entity_id = (uint8_t)(setup->wIndex >> 8); + uint8_t control_selector = (uint8_t)(setup->wValue >> 8); + + for (uint8_t i = 0; i < 3; i++) { + struct video_entity_info *entity_info = &g_usbd_video[busid].info[i]; + if (entity_info->bEntityId == entity_id) { + switch (entity_info->bDescriptorSubtype) { + case VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE: + break; + case VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE: + if (entity_info->wTerminalType == VIDEO_ITT_CAMERA) { + switch (control_selector) { + case VIDEO_CT_AE_MODE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: + (*data)[0] = 0x08; + *len = 1; + break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint32_t dwExposureTimeAbsolute = 2500; + memcpy(*data, (uint8_t *)&dwExposureTimeAbsolute, 4); + *len = 4; + } break; + case VIDEO_REQUEST_GET_MIN: { + uint32_t dwExposureTimeAbsolute = 5; //0.0005sec + memcpy(*data, (uint8_t *)&dwExposureTimeAbsolute, 4); + *len = 4; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint32_t dwExposureTimeAbsolute = 2500; //0.2500sec + memcpy(*data, (uint8_t *)&dwExposureTimeAbsolute, 4); + *len = 4; + } break; + case VIDEO_REQUEST_GET_RES: { + uint32_t dwExposureTimeAbsolute = 5; //0.0005sec + memcpy(*data, (uint8_t *)&dwExposureTimeAbsolute, 4); + *len = 4; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint32_t dwExposureTimeAbsolute = 2500; //0.2500sec + memcpy(*data, (uint8_t *)&dwExposureTimeAbsolute, 4); + *len = 4; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_CT_FOCUS_ABSOLUTE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint16_t wFocusAbsolute = 0x0080; + memcpy(*data, (uint8_t *)&wFocusAbsolute, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MIN: { + uint16_t wFocusAbsolute = 0; + memcpy(*data, (uint8_t *)&wFocusAbsolute, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wFocusAbsolute = 0x00ff; + memcpy(*data, (uint8_t *)&wFocusAbsolute, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wFocusAbsolute = 0x0001; + memcpy(*data, (uint8_t *)&wFocusAbsolute, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wFocusAbsolute = 0x0080; + memcpy(*data, (uint8_t *)&wFocusAbsolute, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_CT_ZOOM_ABSOLUTE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint16_t wObjectiveFocalLength = 0x0064; + memcpy(*data, (uint8_t *)&wObjectiveFocalLength, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MIN: { + uint16_t wObjectiveFocalLength = 0x0064; + memcpy(*data, (uint8_t *)&wObjectiveFocalLength, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wObjectiveFocalLength = 0x00c8; + memcpy(*data, (uint8_t *)&wObjectiveFocalLength, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wObjectiveFocalLength = 0x0001; + memcpy(*data, (uint8_t *)&wObjectiveFocalLength, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wObjectiveFocalLength = 0x0064; + memcpy(*data, (uint8_t *)&wObjectiveFocalLength, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_CT_ROLL_ABSOLUTE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint16_t wRollAbsolute = 0x0000; + memcpy(*data, (uint8_t *)&wRollAbsolute, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MIN: { + uint16_t wRollAbsolute = 0x0000; + memcpy(*data, (uint8_t *)&wRollAbsolute, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wRollAbsolute = 0x00ff; + memcpy(*data, (uint8_t *)&wRollAbsolute, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wRollAbsolute = 0x0001; + memcpy(*data, (uint8_t *)&wRollAbsolute, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wRollAbsolute = 0x0000; + memcpy(*data, (uint8_t *)&wRollAbsolute, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_CT_FOCUS_AUTO_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint16_t wFocusAuto = 0x0000; + memcpy(*data, (uint8_t *)&wFocusAuto, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + default: + USB_LOG_WRN("Unhandled Video Class control selector 0x%02x\r\n", control_selector); + return -1; + } + } else { + USB_LOG_WRN("Unhandled Video Class wTerminalType 0x%02x\r\n", entity_info->wTerminalType); + return -2; + } + break; + case VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE: + break; + case VIDEO_VC_SELECTOR_UNIT_DESCRIPTOR_SUBTYPE: + break; + case VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE: + switch (control_selector) { + case VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint16_t wBacklightCompensation = 0x0004; + memcpy(*data, (uint8_t *)&wBacklightCompensation, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MIN: { + uint16_t wBacklightCompensation = 0; + memcpy(*data, (uint8_t *)&wBacklightCompensation, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wBacklightCompensation = 8; + memcpy(*data, (uint8_t *)&wBacklightCompensation, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wBacklightCompensation = 1; + memcpy(*data, (uint8_t *)&wBacklightCompensation, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wBacklightCompensation = 4; + memcpy(*data, (uint8_t *)&wBacklightCompensation, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_PU_BRIGHTNESS_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_SET_CUR: { + //uint16_t wBrightness = (uint16_t)(*data)[1] << 8 | (uint16_t)(*data)[0]; + } break; + case VIDEO_REQUEST_GET_CUR: { + uint16_t wBrightness = 0x0080; + memcpy(*data, (uint8_t *)&wBrightness, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MIN: { + uint16_t wBrightness = 0x0001; + memcpy(*data, (uint8_t *)&wBrightness, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wBrightness = 0x00ff; + memcpy(*data, (uint8_t *)&wBrightness, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wBrightness = 0x0001; + memcpy(*data, (uint8_t *)&wBrightness, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wBrightness = 0x0080; + memcpy(*data, (uint8_t *)&wBrightness, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_PU_CONTRAST_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint16_t wContrast = 0x0080; + memcpy(*data, (uint8_t *)&wContrast, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MIN: { + uint16_t wContrast = 0x0001; + memcpy(*data, (uint8_t *)&wContrast, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wContrast = 0x00ff; + memcpy(*data, (uint8_t *)&wContrast, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wContrast = 0x0001; + memcpy(*data, (uint8_t *)&wContrast, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wContrast = 0x0080; + memcpy(*data, (uint8_t *)&wContrast, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_PU_HUE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint16_t wHue = 0x0080; + memcpy(*data, (uint8_t *)&wHue, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MIN: { + uint16_t wHue = 0x0001; + memcpy(*data, (uint8_t *)&wHue, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wHue = 0x00ff; + memcpy(*data, (uint8_t *)&wHue, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wHue = 0x0001; + memcpy(*data, (uint8_t *)&wHue, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wHue = 0x0080; + memcpy(*data, (uint8_t *)&wHue, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_PU_SATURATION_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_MIN: { + uint16_t wSaturation = 0x0001; + memcpy(*data, (uint8_t *)&wSaturation, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wSaturation = 0x00ff; + memcpy(*data, (uint8_t *)&wSaturation, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wSaturation = 0x0001; + memcpy(*data, (uint8_t *)&wSaturation, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wSaturation = 0x0080; + memcpy(*data, (uint8_t *)&wSaturation, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_PU_SHARPNESS_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_MIN: { + uint16_t wSharpness = 0x0001; + memcpy(*data, (uint8_t *)&wSharpness, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wSharpness = 0x00ff; + memcpy(*data, (uint8_t *)&wSharpness, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wSharpness = 0x0001; + memcpy(*data, (uint8_t *)&wSharpness, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wSharpness = 0x0080; + memcpy(*data, (uint8_t *)&wSharpness, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_PU_GAIN_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_MIN: { + uint16_t wGain = 0; + memcpy(*data, (uint8_t *)&wGain, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wGain = 255; + memcpy(*data, (uint8_t *)&wGain, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wGain = 1; + memcpy(*data, (uint8_t *)&wGain, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wGain = 255; + memcpy(*data, (uint8_t *)&wGain, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint16_t wWhiteBalance_Temprature = 417; + memcpy(*data, (uint8_t *)&wWhiteBalance_Temprature, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MIN: { + uint16_t wWhiteBalance_Temprature = 300; + memcpy(*data, (uint8_t *)&wWhiteBalance_Temprature, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_MAX: { + uint16_t wWhiteBalance_Temprature = 600; + memcpy(*data, (uint8_t *)&wWhiteBalance_Temprature, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_RES: { + uint16_t wWhiteBalance_Temprature = 1; + memcpy(*data, (uint8_t *)&wWhiteBalance_Temprature, 2); + *len = 2; + } break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; //struct video_camera_capabilities + *len = 1; + break; + case VIDEO_REQUEST_GET_DEF: { + uint16_t wWhiteBalance_Temprature = 417; + memcpy(*data, (uint8_t *)&wWhiteBalance_Temprature, 2); + *len = 2; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: { + uint16_t wWhiteBalance_Temprature_Auto = 1; + memcpy(*data, (uint8_t *)&wWhiteBalance_Temprature_Auto, 1); + *len = 1; + } break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + default: + g_usbd_video[busid].error_code = 0x06; + USB_LOG_WRN("Unhandled Video Class control selector 0x%02x\r\n", control_selector); + return -1; + } + break; + case VIDEO_VC_EXTENSION_UNIT_DESCRIPTOR_SUBTYPE: + break; + case VIDEO_VC_ENCODING_UNIT_DESCRIPTOR_SUBTYPE: + break; + + default: + break; + } + } + } + return 0; +} + +static int usbd_video_stream_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + uint8_t control_selector = (uint8_t)(setup->wValue >> 8); + + switch (control_selector) { + case VIDEO_VS_PROBE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_SET_CUR: + //memcpy((uint8_t *)&g_usbd_video[busid].probe, *data, setup->wLength); + break; + case VIDEO_REQUEST_GET_CUR: + memcpy(*data, (uint8_t *)&g_usbd_video[busid].probe, setup->wLength); + *len = sizeof(struct video_probe_and_commit_controls); + break; + + case VIDEO_REQUEST_GET_MIN: + case VIDEO_REQUEST_GET_MAX: + case VIDEO_REQUEST_GET_RES: + case VIDEO_REQUEST_GET_DEF: + memcpy(*data, (uint8_t *)&g_usbd_video[busid].probe, setup->wLength); + *len = sizeof(struct video_probe_and_commit_controls); + break; + case VIDEO_REQUEST_GET_LEN: + (*data)[0] = sizeof(struct video_probe_and_commit_controls); + *len = 1; + break; + + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; + *len = 1; + break; + + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_VS_COMMIT_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_SET_CUR: + //memcpy((uint8_t *)&g_usbd_video[busid].commit, *data, setup->wLength); + break; + case VIDEO_REQUEST_GET_CUR: + memcpy(*data, (uint8_t *)&g_usbd_video[busid].commit, setup->wLength); + *len = sizeof(struct video_probe_and_commit_controls); + break; + case VIDEO_REQUEST_GET_MIN: + case VIDEO_REQUEST_GET_MAX: + case VIDEO_REQUEST_GET_RES: + case VIDEO_REQUEST_GET_DEF: + memcpy(*data, (uint8_t *)&g_usbd_video[busid].commit, setup->wLength); + *len = sizeof(struct video_probe_and_commit_controls); + break; + + case VIDEO_REQUEST_GET_LEN: + (*data)[0] = sizeof(struct video_probe_and_commit_controls); + *len = 1; + break; + + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x03; + *len = 1; + break; + + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + case VIDEO_VS_STREAM_ERROR_CODE_CONTROL: + switch (setup->bRequest) { + case VIDEO_REQUEST_GET_CUR: + (*data)[0] = g_usbd_video[busid].error_code; + *len = 1; + break; + case VIDEO_REQUEST_GET_INFO: + (*data)[0] = 0x01; + *len = 1; + break; + default: + USB_LOG_WRN("Unhandled Video Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + break; + default: + break; + } + + return 0; +} + +static int video_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + USB_LOG_DBG("Video Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + uint8_t intf_num = (uint8_t)setup->wIndex; + uint8_t entity_id = (uint8_t)(setup->wIndex >> 8); + + if (intf_num == 0) { /* Video Control Interface */ + if (entity_id == 0) { + return usbd_video_control_request_handler(busid, setup, data, len); /* Interface Control Requests */ + } else { + return usbd_video_control_unit_terminal_request_handler(busid, setup, data, len); /* Unit and Terminal Requests */ + } + } else if (intf_num == 1) { /* Video Stream Inteface */ + return usbd_video_stream_request_handler(busid, setup, data, len); /* Interface Stream Requests */ + } + return -1; +} + +static void video_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + switch (event) { + case USBD_EVENT_RESET: + g_usbd_video[busid].error_code = 0; + g_usbd_video[busid].power_mode = 0; + break; + + case USBD_EVENT_SET_INTERFACE: { + struct usb_interface_descriptor *intf = (struct usb_interface_descriptor *)arg; + if (intf->bAlternateSetting == 1) { + usbd_video_open(busid, intf->bInterfaceNumber); + } else { + usbd_video_close(busid, intf->bInterfaceNumber); + } + } + + break; + default: + break; + } +} + +static void usbd_video_probe_and_commit_controls_init(uint8_t busid, uint32_t dwFrameInterval, uint32_t dwMaxVideoFrameSize, uint32_t dwMaxPayloadTransferSize) +{ + g_usbd_video[busid].probe.hintUnion.bmHint = 0x01; + g_usbd_video[busid].probe.hintUnion1.bmHint = 0; + g_usbd_video[busid].probe.bFormatIndex = 1; + g_usbd_video[busid].probe.bFrameIndex = 1; + g_usbd_video[busid].probe.dwFrameInterval = dwFrameInterval; + g_usbd_video[busid].probe.wKeyFrameRate = 0; + g_usbd_video[busid].probe.wPFrameRate = 0; + g_usbd_video[busid].probe.wCompQuality = 0; + g_usbd_video[busid].probe.wCompWindowSize = 0; + g_usbd_video[busid].probe.wDelay = 0; + g_usbd_video[busid].probe.dwMaxVideoFrameSize = dwMaxVideoFrameSize; + g_usbd_video[busid].probe.dwMaxPayloadTransferSize = dwMaxPayloadTransferSize; + g_usbd_video[busid].probe.dwClockFrequency = 0; + g_usbd_video[busid].probe.bmFramingInfo = 0; + g_usbd_video[busid].probe.bPreferedVersion = 0; + g_usbd_video[busid].probe.bMinVersion = 0; + g_usbd_video[busid].probe.bMaxVersion = 0; + + g_usbd_video[busid].commit.hintUnion.bmHint = 0x01; + g_usbd_video[busid].commit.hintUnion1.bmHint = 0; + g_usbd_video[busid].commit.bFormatIndex = 1; + g_usbd_video[busid].commit.bFrameIndex = 1; + g_usbd_video[busid].commit.dwFrameInterval = dwFrameInterval; + g_usbd_video[busid].commit.wKeyFrameRate = 0; + g_usbd_video[busid].commit.wPFrameRate = 0; + g_usbd_video[busid].commit.wCompQuality = 0; + g_usbd_video[busid].commit.wCompWindowSize = 0; + g_usbd_video[busid].commit.wDelay = 0; + g_usbd_video[busid].commit.dwMaxVideoFrameSize = dwMaxVideoFrameSize; + g_usbd_video[busid].commit.dwMaxPayloadTransferSize = dwMaxPayloadTransferSize; + g_usbd_video[busid].commit.dwClockFrequency = 0; + g_usbd_video[busid].commit.bmFramingInfo = 0; + g_usbd_video[busid].commit.bPreferedVersion = 0; + g_usbd_video[busid].commit.bMinVersion = 0; + g_usbd_video[busid].commit.bMaxVersion = 0; + + g_usbd_video[busid].stream_frameid = 0; + g_usbd_video[busid].stream_headerlen = 12; +} + +struct usbd_interface *usbd_video_init_intf(uint8_t busid, + struct usbd_interface *intf, + uint32_t dwFrameInterval, + uint32_t dwMaxVideoFrameSize, + uint32_t dwMaxPayloadTransferSize) +{ + intf->class_interface_handler = video_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = video_notify_handler; + + g_usbd_video[busid].info[0].bDescriptorSubtype = VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE; + g_usbd_video[busid].info[0].bEntityId = 0x01; + g_usbd_video[busid].info[0].wTerminalType = VIDEO_ITT_CAMERA; + g_usbd_video[busid].info[1].bDescriptorSubtype = VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE; + g_usbd_video[busid].info[1].bEntityId = 0x03; + g_usbd_video[busid].info[1].wTerminalType = 0x00; + g_usbd_video[busid].info[2].bDescriptorSubtype = VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE; + g_usbd_video[busid].info[2].bEntityId = 0x02; + g_usbd_video[busid].info[2].wTerminalType = 0x00; + + usbd_video_probe_and_commit_controls_init(busid, dwFrameInterval, dwMaxVideoFrameSize, dwMaxPayloadTransferSize); + return intf; +} + +bool usbd_video_stream_split_transfer(uint8_t busid, uint8_t ep) +{ + struct video_payload_header *header; + static uint32_t offset = 0; + static uint32_t len = 0; + + if (g_usbd_video[busid].stream_finish) { + g_usbd_video[busid].stream_finish = false; + return true; + } + + offset = g_usbd_video[busid].stream_offset; + + len = MIN(g_usbd_video[busid].stream_len, + g_usbd_video[busid].probe.dwMaxPayloadTransferSize - + g_usbd_video[busid].stream_headerlen); + + if (g_usbd_video[busid].do_copy) { + header = (struct video_payload_header *)&g_usbd_video[busid].ep_buf[0]; + usb_memcpy(&g_usbd_video[busid].ep_buf[g_usbd_video[busid].stream_headerlen], &g_usbd_video[busid].stream_buf[offset], len); + } else { + header = (struct video_payload_header *)&g_usbd_video[busid].stream_buf[offset - g_usbd_video[busid].stream_headerlen]; + } + + memset(header, 0, g_usbd_video[busid].stream_headerlen); + header->bHeaderLength = g_usbd_video[busid].stream_headerlen; + header->headerInfoUnion.bmheaderInfo = 0; + header->headerInfoUnion.headerInfoBits.endOfHeader = 1; + header->headerInfoUnion.headerInfoBits.endOfFrame = 0; + header->headerInfoUnion.headerInfoBits.frameIdentifier = g_usbd_video[busid].stream_frameid; + + g_usbd_video[busid].stream_offset += len; + g_usbd_video[busid].stream_len -= len; + + if (g_usbd_video[busid].stream_len == 0) { + header->headerInfoUnion.headerInfoBits.endOfFrame = 1; + g_usbd_video[busid].stream_frameid ^= 1; + g_usbd_video[busid].stream_finish = true; + } + + if (g_usbd_video[busid].do_copy) { + usbd_ep_start_write(busid, ep, + g_usbd_video[busid].ep_buf, + g_usbd_video[busid].stream_headerlen + len); + } else { + usbd_ep_start_write(busid, ep, + &g_usbd_video[busid].stream_buf[offset - g_usbd_video[busid].stream_headerlen], + g_usbd_video[busid].stream_headerlen + len); + } + + return false; +} + +int usbd_video_stream_start_write(uint8_t busid, uint8_t ep, uint8_t *ep_buf, uint8_t *stream_buf, uint32_t stream_len, bool do_copy) +{ + struct video_payload_header *header; + + if ((usb_device_is_configured(busid) == 0) || (stream_len == 0)) { + return -1; + } + + g_usbd_video[busid].ep_buf = ep_buf; + g_usbd_video[busid].stream_buf = stream_buf; + g_usbd_video[busid].stream_len = stream_len; + g_usbd_video[busid].stream_offset = 0; + g_usbd_video[busid].stream_finish = false; + g_usbd_video[busid].do_copy = do_copy; + + uint32_t len = MIN(g_usbd_video[busid].stream_len, + g_usbd_video[busid].probe.dwMaxPayloadTransferSize - + g_usbd_video[busid].stream_headerlen); + + header = (struct video_payload_header *)&ep_buf[0]; + header->bHeaderLength = g_usbd_video[busid].stream_headerlen; + header->headerInfoUnion.bmheaderInfo = 0; + header->headerInfoUnion.headerInfoBits.endOfHeader = 1; + header->headerInfoUnion.headerInfoBits.endOfFrame = 0; + header->headerInfoUnion.headerInfoBits.frameIdentifier = g_usbd_video[busid].stream_frameid; + + usb_memcpy(&ep_buf[g_usbd_video[busid].stream_headerlen], stream_buf, len); + g_usbd_video[busid].stream_offset += len; + g_usbd_video[busid].stream_len -= len; + + usbd_ep_start_write(busid, ep, ep_buf, g_usbd_video[busid].stream_headerlen + len); + return 0; +} + +__WEAK void usbd_video_open(uint8_t busid, uint8_t intf) +{ + (void)busid; + (void)intf; +} + +__WEAK void usbd_video_close(uint8_t busid, uint8_t intf) +{ + (void)busid; + (void)intf; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/class/video/usbd_video.h b/src/lib/CherryUSB/class/video/usbd_video.h new file mode 100644 index 000000000..a2061fdcc --- /dev/null +++ b/src/lib/CherryUSB/class/video/usbd_video.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_VIDEO_H +#define USBD_VIDEO_H + +#include "usb_video.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Init video interface driver */ +struct usbd_interface *usbd_video_init_intf(uint8_t busid, struct usbd_interface *intf, + uint32_t dwFrameInterval, + uint32_t dwMaxVideoFrameSize, + uint32_t dwMaxPayloadTransferSize); + +void usbd_video_open(uint8_t busid, uint8_t intf); +void usbd_video_close(uint8_t busid, uint8_t intf); + +bool usbd_video_stream_split_transfer(uint8_t busid, uint8_t ep); +int usbd_video_stream_start_write(uint8_t busid, uint8_t ep, uint8_t *ep_buf, uint8_t *stream_buf, uint32_t stream_len, bool do_copy); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_VIDEO_H */ diff --git a/src/lib/CherryUSB/class/video/usbh_video.c b/src/lib/CherryUSB/class/video/usbh_video.c new file mode 100644 index 000000000..18acbda37 --- /dev/null +++ b/src/lib/CherryUSB/class/video/usbh_video.c @@ -0,0 +1,559 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_video.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_video" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/video%d" + +/* general descriptor field offsets */ +#define DESC_bLength 0 /** Length offset */ +#define DESC_bDescriptorType 1 /** Descriptor type offset */ +#define DESC_bDescriptorSubType 2 /** Descriptor subtype offset */ +#define DESC_bNumFormats 3 /** Descriptor numformat offset */ +#define DESC_bNumFrameDescriptors 4 /** Descriptor numframe offset */ +#define DESC_bFormatIndex 3 /** Descriptor format index offset */ +#define DESC_bFrameIndex 3 /** Descriptor frame index offset */ + +/* interface descriptor field offsets */ +#define INTF_DESC_bInterfaceNumber 2 /** Interface number offset */ +#define INTF_DESC_bAlternateSetting 3 /** Alternate setting offset */ + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_video_buf[USB_ALIGN_UP(128, CONFIG_USB_ALIGN_SIZE)]; + +static const char *format_type[] = { "uncompressed", "mjpeg" }; + +static struct usbh_video g_video_class[CONFIG_USBHOST_MAX_VIDEO_CLASS]; +static uint32_t g_devinuse = 0; + +static struct usbh_video *usbh_video_class_alloc(void) +{ + uint8_t devno; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_VIDEO_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_video_class[devno], 0, sizeof(struct usbh_video)); + g_video_class[devno].minor = devno; + return &g_video_class[devno]; + } + } + return NULL; +} + +static void usbh_video_class_free(struct usbh_video *video_class) +{ + uint8_t devno = video_class->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(video_class, 0, sizeof(struct usbh_video)); +} + +int usbh_video_get(struct usbh_video *video_class, uint8_t request, uint8_t intf, uint8_t entity_id, uint8_t cs, uint8_t *buf, uint16_t len) +{ + struct usb_setup_packet *setup; + int ret; + uint8_t retry; + + if (!video_class || !video_class->hport) { + return -USB_ERR_INVAL; + } + setup = video_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = request; + setup->wValue = cs << 8; + setup->wIndex = (entity_id << 8) | intf; + setup->wLength = len; + + retry = 0; + while (1) { + ret = usbh_control_transfer(video_class->hport, setup, g_video_buf); + if (ret > 0) { + break; + } + retry++; + + if (retry == 3) { + return ret; + } + } + + if (buf) { + memcpy(buf, g_video_buf, len); + } + + return ret; +} + +int usbh_video_set(struct usbh_video *video_class, uint8_t request, uint8_t intf, uint8_t entity_id, uint8_t cs, uint8_t *buf, uint16_t len) +{ + struct usb_setup_packet *setup; + int ret; + + if (!video_class || !video_class->hport) { + return -USB_ERR_INVAL; + } + setup = video_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = request; + setup->wValue = cs << 8; + setup->wIndex = (entity_id << 8) | intf; + setup->wLength = len; + + memcpy(g_video_buf, buf, len); + + ret = usbh_control_transfer(video_class->hport, setup, g_video_buf); + usb_osal_msleep(50); + return ret; +} + +int usbh_videostreaming_get_cur_probe(struct usbh_video *video_class) +{ + return usbh_video_get(video_class, VIDEO_REQUEST_GET_CUR, video_class->data_intf, 0x00, VIDEO_VS_PROBE_CONTROL, (uint8_t *)&video_class->probe, 26); +} + +int usbh_videostreaming_set_cur_probe(struct usbh_video *video_class, uint8_t formatindex, uint8_t frameindex, uint32_t dwFrameInterval) +{ + video_class->probe.bFormatIndex = formatindex; + video_class->probe.bFrameIndex = frameindex; + video_class->probe.dwMaxPayloadTransferSize = 0; + video_class->probe.dwFrameInterval = dwFrameInterval; + return usbh_video_set(video_class, VIDEO_REQUEST_SET_CUR, video_class->data_intf, 0x00, VIDEO_VS_PROBE_CONTROL, (uint8_t *)&video_class->probe, 26); +} + +int usbh_videostreaming_set_cur_commit(struct usbh_video *video_class, uint8_t formatindex, uint8_t frameindex) +{ + memcpy(&video_class->commit, &video_class->probe, sizeof(struct video_probe_and_commit_controls)); + video_class->commit.bFormatIndex = formatindex; + video_class->commit.bFrameIndex = frameindex; + return usbh_video_set(video_class, VIDEO_REQUEST_SET_CUR, video_class->data_intf, 0x00, VIDEO_VS_COMMIT_CONTROL, (uint8_t *)&video_class->commit, 26); +} + +int usbh_video_open(struct usbh_video *video_class, + uint8_t format_type, + uint16_t wWidth, + uint16_t wHeight, + uint8_t altsetting) +{ + struct usb_setup_packet *setup; + struct usb_endpoint_descriptor *ep_desc; + uint8_t mult; + uint16_t mps; + int ret; + bool found = false; + uint8_t formatidx = 0; + uint8_t frameidx = 0; + uint32_t dwDefaultFrameInterval = 0; + uint8_t step; + + if (!video_class || !video_class->hport) { + return -USB_ERR_INVAL; + } + setup = video_class->hport->setup; + + if (video_class->is_opened) { + return 0; + } + + for (uint8_t i = 0; i < video_class->num_of_formats; i++) { + if (format_type == video_class->format[i].format_type) { + formatidx = i + 1; + for (uint8_t j = 0; j < video_class->format[i].num_of_frames; j++) { + if ((wWidth == video_class->format[i].frame[j].wWidth) && + (wHeight == video_class->format[i].frame[j].wHeight)) { + frameidx = j + 1; + dwDefaultFrameInterval = video_class->format[i].frame[j].dwDefaultFrameInterval; + found = true; + break; + } + } + } + } + + if (found == false) { + return -USB_ERR_NODEV; + } + + if (altsetting > (video_class->num_of_intf_altsettings - 1)) { + return -USB_ERR_INVAL; + } + + /* Open video step: + * Get CUR request (probe) + * Set CUR request (probe) + * Get CUR request (probe) + * Get MAX request (probe) + * Get MIN request (probe) + * Get CUR request (probe) + * Set CUR request (commit) + * + */ + step = 0; + ret = usbh_videostreaming_get_cur_probe(video_class); + if (ret < 0) { + goto errout; + } + + step = 1; + ret = usbh_videostreaming_set_cur_probe(video_class, formatidx, frameidx, dwDefaultFrameInterval); + if (ret < 0) { + goto errout; + } + + step = 2; + ret = usbh_videostreaming_get_cur_probe(video_class); + if (ret < 0) { + goto errout; + } + + step = 3; + ret = usbh_video_get(video_class, VIDEO_REQUEST_GET_MAX, video_class->data_intf, 0x00, VIDEO_VS_PROBE_CONTROL, NULL, 26); + if (ret < 0) { + goto errout; + } + + step = 4; + ret = usbh_video_get(video_class, VIDEO_REQUEST_GET_MIN, video_class->data_intf, 0x00, VIDEO_VS_PROBE_CONTROL, NULL, 26); + if (ret < 0) { + goto errout; + } + + step = 5; + ret = usbh_videostreaming_set_cur_probe(video_class, formatidx, frameidx, dwDefaultFrameInterval); + if (ret < 0) { + goto errout; + } + + step = 6; + ret = usbh_videostreaming_get_cur_probe(video_class); + if (ret < 0) { + goto errout; + } + + step = 7; + ret = usbh_videostreaming_set_cur_commit(video_class, formatidx, frameidx); + if (ret < 0) { + goto errout; + } + + step = 8; + if (!video_class->is_bulk) { + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = USB_REQUEST_SET_INTERFACE; + setup->wValue = altsetting; + setup->wIndex = video_class->data_intf; + setup->wLength = 0; + + ret = usbh_control_transfer(video_class->hport, setup, NULL); + if (ret < 0) { + goto errout; + } + + ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[altsetting].ep[0].ep_desc; + mult = (ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_MASK) >> USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT; + mps = ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_MASK; + if (ep_desc->bEndpointAddress & 0x80) { + video_class->isoin_mps = mps * (mult + 1); + USBH_EP_INIT(video_class->isoin, ep_desc); + } else { + return -USB_ERR_NODEV; + } + } else { + ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[0].ep[0].ep_desc; + USBH_EP_INIT(video_class->bulkin, ep_desc); + } + + USB_LOG_INFO("Open video and select formatidx:%u, frameidx:%u, altsetting:%u\r\n", formatidx, frameidx, altsetting); + video_class->is_opened = true; + video_class->current_format = format_type; + return ret; + +errout: + USB_LOG_ERR("Fail to open video in step %u\r\n", step); + return ret; +} + +int usbh_video_close(struct usbh_video *video_class) +{ + struct usb_setup_packet *setup; + int ret = 0; + + if (!video_class || !video_class->hport) { + return -USB_ERR_INVAL; + } + setup = video_class->hport->setup; + + USB_LOG_INFO("Close video device\r\n"); + + video_class->is_opened = false; + + if (video_class->is_bulk) { + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_ENDPOINT; + setup->bRequest = USB_REQUEST_CLEAR_FEATURE; + setup->wValue = USB_FEATURE_ENDPOINT_HALT; + setup->wIndex = video_class->bulkin->bEndpointAddress; + setup->wLength = 0; + } else { + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = USB_REQUEST_SET_INTERFACE; + setup->wValue = 0; + setup->wIndex = video_class->data_intf; + setup->wLength = 0; + } + + ret = usbh_control_transfer(video_class->hport, setup, NULL); + if (ret < 0) { + return ret; + } + + return ret; +} + +void usbh_video_list_info(struct usbh_video *video_class) +{ + struct usb_endpoint_descriptor *ep_desc; + + USB_LOG_INFO("============= Video device information ===================\r\n"); + USB_LOG_RAW("bcdVDC:%04x\r\n", video_class->bcdVDC); + USB_LOG_RAW("Num of altsettings:%u (%s mode)\r\n", video_class->num_of_intf_altsettings, video_class->num_of_intf_altsettings == 1 ? "bulk" : "iso"); + + video_class->is_bulk = video_class->num_of_intf_altsettings == 1 ? true : false; + + if (video_class->is_bulk) { + ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[0].ep[0].ep_desc; + USB_LOG_RAW("Ep=%02x Attr=%02u Mps=%d Interval=%02u Mult=%02u\r\n", + ep_desc->bEndpointAddress, + ep_desc->bmAttributes, + USB_GET_MAXPACKETSIZE(ep_desc->wMaxPacketSize), + ep_desc->bInterval, + USB_GET_MULT(ep_desc->wMaxPacketSize)); + } else { + for (uint8_t i = 0; i < video_class->num_of_intf_altsettings; i++) { + if (i == 0) { + USB_LOG_RAW("Ingore altsetting 0\r\n"); + continue; + } + ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[i].ep[0].ep_desc; + + USB_LOG_RAW("Altsetting:%u, Ep=%02x Attr=%02u Mps=%d Interval=%02u Mult=%02u\r\n", + i, + ep_desc->bEndpointAddress, + ep_desc->bmAttributes, + USB_GET_MAXPACKETSIZE(ep_desc->wMaxPacketSize), + ep_desc->bInterval, + USB_GET_MULT(ep_desc->wMaxPacketSize)); + } + } + + USB_LOG_RAW("bNumFormats:%u\r\n", video_class->num_of_formats); + for (uint8_t i = 0; i < video_class->num_of_formats; i++) { + USB_LOG_RAW(" FormatIndex:%u\r\n", i + 1); + USB_LOG_RAW(" FormatType:%s\r\n", format_type[video_class->format[i].format_type]); + USB_LOG_RAW(" bNumFrames:%u\r\n", video_class->format[i].num_of_frames); + USB_LOG_RAW(" Resolution:\r\n"); + for (uint8_t j = 0; j < video_class->format[i].num_of_frames; j++) { + USB_LOG_RAW(" FrameIndex:%u\r\n", j + 1); + USB_LOG_RAW(" wWidth: %d, wHeight: %d, fps: %d\r\n", + video_class->format[i].frame[j].wWidth, + video_class->format[i].frame[j].wHeight, + (1000 / (video_class->format[i].frame[j].dwDefaultFrameInterval / 10000))); + } + } + + USB_LOG_INFO("============= Video device information ===================\r\n"); +} + +static int usbh_video_ctrl_connect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret; + uint8_t cur_iface = 0xff; + // uint8_t cur_alt_setting = 0xff; + uint8_t frame_index = 0xff; + uint8_t format_index = 0xff; + uint8_t num_of_frames = 0xff; + uint8_t *p; + + struct usbh_video *video_class = usbh_video_class_alloc(); + if (video_class == NULL) { + USB_LOG_ERR("Fail to alloc video_class\r\n"); + return -USB_ERR_NOMEM; + } + + video_class->hport = hport; + video_class->ctrl_intf = intf; + video_class->data_intf = intf + 1; + video_class->num_of_intf_altsettings = hport->config.intf[intf + 1].altsetting_num; + + hport->config.intf[intf].priv = video_class; + + ret = usbh_video_close(video_class); + if (ret < 0) { + USB_LOG_ERR("Fail to close video device\r\n"); + return ret; + } + + p = hport->raw_config_desc; + while (p[DESC_bLength]) { + switch (p[DESC_bDescriptorType]) { + case USB_DESCRIPTOR_TYPE_INTERFACE: + cur_iface = p[INTF_DESC_bInterfaceNumber]; + //cur_alt_setting = p[INTF_DESC_bAlternateSetting]; + break; + case USB_DESCRIPTOR_TYPE_ENDPOINT: + //ep_desc = (struct usb_endpoint_descriptor *)p; + break; + case VIDEO_CS_INTERFACE_DESCRIPTOR_TYPE: + if (cur_iface == video_class->ctrl_intf) { + switch (p[DESC_bDescriptorSubType]) { + case VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE: + video_class->bcdVDC = ((uint16_t)p[4] << 8) | (uint16_t)p[3]; + break; + case VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE: + break; + case VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE: + break; + case VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE: + break; + + default: + break; + } + } else if (cur_iface == video_class->data_intf) { + switch (p[DESC_bDescriptorSubType]) { + case VIDEO_VS_INPUT_HEADER_DESCRIPTOR_SUBTYPE: + video_class->num_of_formats = p[DESC_bNumFormats]; + break; + case VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_SUBTYPE: + format_index = p[DESC_bFormatIndex]; + num_of_frames = p[DESC_bNumFrameDescriptors]; + + video_class->format[format_index - 1].num_of_frames = num_of_frames; + video_class->format[format_index - 1].format_type = USBH_VIDEO_FORMAT_UNCOMPRESSED; + break; + case VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_SUBTYPE: + format_index = p[DESC_bFormatIndex]; + num_of_frames = p[DESC_bNumFrameDescriptors]; + + video_class->format[format_index - 1].num_of_frames = num_of_frames; + video_class->format[format_index - 1].format_type = USBH_VIDEO_FORMAT_MJPEG; + break; + case VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_SUBTYPE: + frame_index = p[DESC_bFrameIndex]; + + video_class->format[format_index - 1].frame[frame_index - 1].wWidth = ((struct video_cs_if_vs_frame_uncompressed_descriptor *)p)->wWidth; + video_class->format[format_index - 1].frame[frame_index - 1].wHeight = ((struct video_cs_if_vs_frame_uncompressed_descriptor *)p)->wHeight; + video_class->format[format_index - 1].frame[frame_index - 1].dwDefaultFrameInterval = ((struct video_cs_if_vs_frame_uncompressed_descriptor *)p)->dwDefaultFrameInterval; + break; + case VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE: + frame_index = p[DESC_bFrameIndex]; + + video_class->format[format_index - 1].frame[frame_index - 1].wWidth = ((struct video_cs_if_vs_frame_mjpeg_descriptor *)p)->wWidth; + video_class->format[format_index - 1].frame[frame_index - 1].wHeight = ((struct video_cs_if_vs_frame_mjpeg_descriptor *)p)->wHeight; + video_class->format[format_index - 1].frame[frame_index - 1].dwDefaultFrameInterval = ((struct video_cs_if_vs_frame_mjpeg_descriptor *)p)->dwDefaultFrameInterval; + break; + default: + break; + } + } + + break; + + default: + break; + } + /* skip to next descriptor */ + p += p[DESC_bLength]; + } + + usbh_video_list_info(video_class); + + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, video_class->minor); + + USB_LOG_INFO("Register Video Class:%s\r\n", hport->config.intf[intf].devname); + + usbh_video_run(video_class); + return ret; +} + +static int usbh_video_ctrl_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_video *video_class = (struct usbh_video *)hport->config.intf[intf].priv; + + if (video_class) { + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister Video Class:%s\r\n", hport->config.intf[intf].devname); + usbh_video_stop(video_class); + } + + usbh_video_class_free(video_class); + } + + return ret; +} + +static int usbh_video_streaming_connect(struct usbh_hubport *hport, uint8_t intf) +{ + (void)hport; + (void)intf; + return 0; +} + +static int usbh_video_streaming_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + (void)hport; + (void)intf; + return 0; +} + +__WEAK void usbh_video_run(struct usbh_video *video_class) +{ + (void)video_class; +} + +__WEAK void usbh_video_stop(struct usbh_video *video_class) +{ + (void)video_class; +} + +const struct usbh_class_driver video_ctrl_class_driver = { + .driver_name = "video_ctrl", + .connect = usbh_video_ctrl_connect, + .disconnect = usbh_video_ctrl_disconnect +}; + +const struct usbh_class_driver video_streaming_class_driver = { + .driver_name = "video_streaming", + .connect = usbh_video_streaming_connect, + .disconnect = usbh_video_streaming_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info video_ctrl_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_VIDEO, + .bInterfaceSubClass = VIDEO_SC_VIDEOCONTROL, + .bInterfaceProtocol = VIDEO_PC_PROTOCOL_UNDEFINED, + .id_table = NULL, + .class_driver = &video_ctrl_class_driver +}; + +CLASS_INFO_DEFINE const struct usbh_class_info video_streaming_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_VIDEO, + .bInterfaceSubClass = VIDEO_SC_VIDEOSTREAMING, + .bInterfaceProtocol = VIDEO_PC_PROTOCOL_UNDEFINED, + .id_table = NULL, + .class_driver = &video_streaming_class_driver +}; diff --git a/src/lib/CherryUSB/class/video/usbh_video.h b/src/lib/CherryUSB/class/video/usbh_video.h new file mode 100644 index 000000000..9edce49b9 --- /dev/null +++ b/src/lib/CherryUSB/class/video/usbh_video.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_VIDEO_H +#define USBH_VIDEO_H + +#include "usb_video.h" + +#define USBH_VIDEO_FORMAT_UNCOMPRESSED 0 +#define USBH_VIDEO_FORMAT_MJPEG 1 + +struct usbh_video_resolution { + uint16_t wWidth; + uint16_t wHeight; + uint32_t dwDefaultFrameInterval; +}; + +struct usbh_video_format { + struct usbh_video_resolution frame[12]; + uint8_t format_type; + uint8_t num_of_frames; +}; + +struct usbh_videoframe { + uint8_t *frame_buf; + uint32_t frame_bufsize; + uint32_t frame_format; + uint32_t frame_size; +}; + +struct usbh_videostreaming { + struct usbh_videoframe *frame; + uint32_t frame_format; + uint32_t bufoffset; + uint16_t width; + uint16_t height; +}; + +struct usbh_video { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *isoin; /* ISO IN endpoint */ + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + + uint8_t ctrl_intf; /* interface number */ + uint8_t data_intf; /* interface number */ + uint8_t minor; + struct video_probe_and_commit_controls probe; + struct video_probe_and_commit_controls commit; + uint16_t isoin_mps; + bool is_opened; + uint8_t current_format; + bool is_bulk; + uint16_t bcdVDC; + uint8_t num_of_intf_altsettings; + uint8_t num_of_formats; + struct usbh_video_format format[3]; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_video_get(struct usbh_video *video_class, uint8_t request, uint8_t intf, uint8_t entity_id, uint8_t cs, uint8_t *buf, uint16_t len); +int usbh_video_set(struct usbh_video *video_class, uint8_t request, uint8_t intf, uint8_t entity_id, uint8_t cs, uint8_t *buf, uint16_t len); + +int usbh_video_open(struct usbh_video *video_class, + uint8_t format_type, + uint16_t wWidth, + uint16_t wHeight, + uint8_t altsetting); +int usbh_video_close(struct usbh_video *video_class); + +void usbh_video_list_info(struct usbh_video *video_class); + +void usbh_video_run(struct usbh_video *video_class); +void usbh_video_stop(struct usbh_video *video_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_VIDEO_H */ diff --git a/src/lib/CherryUSB/class/wireless/ndis.h b/src/lib/CherryUSB/class/wireless/ndis.h new file mode 100644 index 000000000..80a6e6696 --- /dev/null +++ b/src/lib/CherryUSB/class/wireless/ndis.h @@ -0,0 +1,270 @@ +/* This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ndis.h *************************************************************** + * + * \brief + * This file contains the possible external configuration of the USB. + * + * \addtogroup usbstick + * + * + ******************************************************************************/ + +/** + \ingroup usbstick + \defgroup RNDIS RNDIS Support + @{ + */ + +/* + * ndis.h + * + * Modified by Colin O'Flynn + * ntddndis.h modified by Benedikt Spranger + * + * Thanks to the cygwin development team, + * espacially to Casper S. Hornstrup + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef _LINUX_NDIS_H +#define _LINUX_NDIS_H + +#define NDIS_STATUS_MULTICAST_FULL 0xC0010009 +#define NDIS_STATUS_MULTICAST_EXISTS 0xC001000A +#define NDIS_STATUS_MULTICAST_NOT_FOUND 0xC001000B + +/* from drivers/net/sk98lin/h/skgepnmi.h */ +#define OID_PNP_CAPABILITIES 0xFD010100 +#define OID_PNP_SET_POWER 0xFD010101 +#define OID_PNP_QUERY_POWER 0xFD010102 +#define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103 +#define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104 +#define OID_PNP_ENABLE_WAKE_UP 0xFD010106 + +enum NDIS_DEVICE_POWER_STATE { + NdisDeviceStateUnspecified = 0, + NdisDeviceStateD0, + NdisDeviceStateD1, + NdisDeviceStateD2, + NdisDeviceStateD3, + NdisDeviceStateMaximum +}; + +struct NDIS_PM_WAKE_UP_CAPABILITIES { + enum NDIS_DEVICE_POWER_STATE MinMagicPacketWakeUp; + enum NDIS_DEVICE_POWER_STATE MinPatternWakeUp; + enum NDIS_DEVICE_POWER_STATE MinLinkChangeWakeUp; +}; + +/* NDIS_PNP_CAPABILITIES.Flags constants */ +#define NDIS_DEVICE_WAKE_UP_ENABLE 0x00000001 +#define NDIS_DEVICE_WAKE_ON_PATTERN_MATCH_ENABLE 0x00000002 +#define NDIS_DEVICE_WAKE_ON_MAGIC_PACKET_ENABLE 0x00000004 + +/* +struct NDIS_PNP_CAPABILITIES { + __le32 Flags; + struct NDIS_PM_WAKE_UP_CAPABILITIES WakeUpCapabilities; +}; + +struct NDIS_PM_PACKET_PATTERN { + __le32 Priority; + __le32 Reserved; + __le32 MaskSize; + __le32 PatternOffset; + __le32 PatternSize; + __le32 PatternFlags; +}; +*/ + +/* Required Object IDs (OIDs) */ +#define OID_GEN_SUPPORTED_LIST 0x00010101 +#define OID_GEN_HARDWARE_STATUS 0x00010102 +#define OID_GEN_MEDIA_SUPPORTED 0x00010103 +#define OID_GEN_MEDIA_IN_USE 0x00010104 +#define OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105 +#define OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106 +#define OID_GEN_LINK_SPEED 0x00010107 +#define OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108 +#define OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109 +#define OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A +#define OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B +#define OID_GEN_VENDOR_ID 0x0001010C +#define OID_GEN_VENDOR_DESCRIPTION 0x0001010D +#define OID_GEN_CURRENT_PACKET_FILTER 0x0001010E +#define OID_GEN_CURRENT_LOOKAHEAD 0x0001010F +#define OID_GEN_DRIVER_VERSION 0x00010110 +#define OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111 +#define OID_GEN_PROTOCOL_OPTIONS 0x00010112 +#define OID_GEN_MAC_OPTIONS 0x00010113 +#define OID_GEN_MEDIA_CONNECT_STATUS 0x00010114 +#define OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115 +#define OID_GEN_VENDOR_DRIVER_VERSION 0x00010116 +#define OID_GEN_SUPPORTED_GUIDS 0x00010117 +#define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118 +#define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119 +#define OID_GEN_MACHINE_NAME 0x0001021A +#define OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B +#define OID_GEN_VLAN_ID 0x0001021C + +/* Optional OIDs */ +#define OID_GEN_MEDIA_CAPABILITIES 0x00010201 +#define OID_GEN_PHYSICAL_MEDIUM 0x00010202 + +/* Required statistics OIDs */ +#define OID_GEN_XMIT_OK 0x00020101 +#define OID_GEN_RCV_OK 0x00020102 +#define OID_GEN_XMIT_ERROR 0x00020103 +#define OID_GEN_RCV_ERROR 0x00020104 +#define OID_GEN_RCV_NO_BUFFER 0x00020105 + +/* Optional statistics OIDs */ +#define OID_GEN_DIRECTED_BYTES_XMIT 0x00020201 +#define OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202 +#define OID_GEN_MULTICAST_BYTES_XMIT 0x00020203 +#define OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204 +#define OID_GEN_BROADCAST_BYTES_XMIT 0x00020205 +#define OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206 +#define OID_GEN_DIRECTED_BYTES_RCV 0x00020207 +#define OID_GEN_DIRECTED_FRAMES_RCV 0x00020208 +#define OID_GEN_MULTICAST_BYTES_RCV 0x00020209 +#define OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A +#define OID_GEN_BROADCAST_BYTES_RCV 0x0002020B +#define OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C +#define OID_GEN_RCV_CRC_ERROR 0x0002020D +#define OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E +#define OID_GEN_GET_TIME_CAPS 0x0002020F +#define OID_GEN_GET_NETCARD_TIME 0x00020210 +#define OID_GEN_NETCARD_LOAD 0x00020211 +#define OID_GEN_DEVICE_PROFILE 0x00020212 +#define OID_GEN_INIT_TIME_MS 0x00020213 +#define OID_GEN_RESET_COUNTS 0x00020214 +#define OID_GEN_MEDIA_SENSE_COUNTS 0x00020215 +#define OID_GEN_FRIENDLY_NAME 0x00020216 +#define OID_GEN_MINIPORT_INFO 0x00020217 +#define OID_GEN_RESET_VERIFY_PARAMETERS 0x00020218 + +/* IEEE 802.3 (Ethernet) OIDs */ +#define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001 + +#define OID_802_3_PERMANENT_ADDRESS 0x01010101 +#define OID_802_3_CURRENT_ADDRESS 0x01010102 +#define OID_802_3_MULTICAST_LIST 0x01010103 +#define OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 +#define OID_802_3_MAC_OPTIONS 0x01010105 +#define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101 +#define OID_802_3_XMIT_ONE_COLLISION 0x01020102 +#define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103 +#define OID_802_3_XMIT_DEFERRED 0x01020201 +#define OID_802_3_XMIT_MAX_COLLISIONS 0x01020202 +#define OID_802_3_RCV_OVERRUN 0x01020203 +#define OID_802_3_XMIT_UNDERRUN 0x01020204 +#define OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205 +#define OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206 +#define OID_802_3_XMIT_LATE_COLLISIONS 0x01020207 + +/* Wireless LAN OIDs */ +/* Mandatory */ +#define OID_802_11_BSSID 0x0D010101 /* Q S */ +#define OID_802_11_SSID 0x0D010102 /* Q S */ +#define OID_802_11_NETWORK_TYPE_IN_USE 0x0D010204 /* Q S */ +#define OID_802_11_RSSI 0x0D010206 /* Q I */ +#define OID_802_11_BSSID_LIST 0x0D010217 /* Q */ +#define OID_802_11_BSSID_LIST_SCAN 0x0D01011A /* S */ +#define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108 /* Q S */ +#define OID_802_11_SUPPORTED_RATES 0x0D01020E /* Q */ +#define OID_802_11_CONFIGURATION 0x0D010211 /* Q S */ +#define OID_802_11_ADD_WEP 0x0D010113 /* S */ +#define OID_802_11_WEP_STATUS 0x0D01011B /* Q S */ +#define OID_802_11_REMOVE_WEP 0x0D010114 /* S */ +#define OID_802_11_DISASSOCIATE 0x0D010115 /* S */ +#define OID_802_11_AUTHENTICATION_MODE 0x0D010118 /* Q S */ +#define OID_802_11_RELOAD_DEFAULTS 0x0D01011C /* S */ + +/* OID_GEN_MINIPORT_INFO constants */ +#define NDIS_MINIPORT_BUS_MASTER 0x00000001 +#define NDIS_MINIPORT_WDM_DRIVER 0x00000002 +#define NDIS_MINIPORT_SG_LIST 0x00000004 +#define NDIS_MINIPORT_SUPPORTS_MEDIA_QUERY 0x00000008 +#define NDIS_MINIPORT_INDICATES_PACKETS 0x00000010 +#define NDIS_MINIPORT_IGNORE_PACKET_QUEUE 0x00000020 +#define NDIS_MINIPORT_IGNORE_REQUEST_QUEUE 0x00000040 +#define NDIS_MINIPORT_IGNORE_TOKEN_RING_ERRORS 0x00000080 +#define NDIS_MINIPORT_INTERMEDIATE_DRIVER 0x00000100 +#define NDIS_MINIPORT_IS_NDIS_5 0x00000200 +#define NDIS_MINIPORT_IS_CO 0x00000400 +#define NDIS_MINIPORT_DESERIALIZE 0x00000800 +#define NDIS_MINIPORT_REQUIRES_MEDIA_POLLING 0x00001000 +#define NDIS_MINIPORT_SUPPORTS_MEDIA_SENSE 0x00002000 +#define NDIS_MINIPORT_NETBOOT_CARD 0x00004000 +#define NDIS_MINIPORT_PM_SUPPORTED 0x00008000 +#define NDIS_MINIPORT_SUPPORTS_MAC_ADDRESS_OVERWRITE 0x00010000 +#define NDIS_MINIPORT_USES_SAFE_BUFFER_APIS 0x00020000 +#define NDIS_MINIPORT_HIDDEN 0x00040000 +#define NDIS_MINIPORT_SWENUM 0x00080000 +#define NDIS_MINIPORT_SURPRISE_REMOVE_OK 0x00100000 +#define NDIS_MINIPORT_NO_HALT_ON_SUSPEND 0x00200000 +#define NDIS_MINIPORT_HARDWARE_DEVICE 0x00400000 +#define NDIS_MINIPORT_SUPPORTS_CANCEL_SEND_PACKETS 0x00800000 +#define NDIS_MINIPORT_64BITS_DMA 0x01000000 + +#define NDIS_MEDIUM_802_3 0x00000000 +#define NDIS_MEDIUM_802_5 0x00000001 +#define NDIS_MEDIUM_FDDI 0x00000002 +#define NDIS_MEDIUM_WAN 0x00000003 +#define NDIS_MEDIUM_LOCAL_TALK 0x00000004 +#define NDIS_MEDIUM_DIX 0x00000005 +#define NDIS_MEDIUM_ARCENT_RAW 0x00000006 +#define NDIS_MEDIUM_ARCENT_878_2 0x00000007 +#define NDIS_MEDIUM_ATM 0x00000008 +#define NDIS_MEDIUM_WIRELESS_LAN 0x00000009 +#define NDIS_MEDIUM_IRDA 0x0000000A +#define NDIS_MEDIUM_BPC 0x0000000B +#define NDIS_MEDIUM_CO_WAN 0x0000000C +#define NDIS_MEDIUM_1394 0x0000000D + +#define NDIS_PACKET_TYPE_DIRECTED 0x00000001 +#define NDIS_PACKET_TYPE_MULTICAST 0x00000002 +#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 +#define NDIS_PACKET_TYPE_BROADCAST 0x00000008 +#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 +#define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 +#define NDIS_PACKET_TYPE_SMT 0x00000040 +#define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 +#define NDIS_PACKET_TYPE_GROUP 0x00000100 +#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00000200 +#define NDIS_PACKET_TYPE_FUNCTIONAL 0x00000400 +#define NDIS_PACKET_TYPE_MAC_FRAME 0x00000800 + +#define NDIS_MEDIA_STATE_CONNECTED 0x00000000 +#define NDIS_MEDIA_STATE_DISCONNECTED 0x00000001 + +#define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA 0x00000001 +#define NDIS_MAC_OPTION_RECEIVE_SERIALIZED 0x00000002 +#define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND 0x00000004 +#define NDIS_MAC_OPTION_NO_LOOPBACK 0x00000008 +#define NDIS_MAC_OPTION_FULL_DUPLEX 0x00000010 +#define NDIS_MAC_OPTION_EOTX_INDICATION 0x00000020 +#define NDIS_MAC_OPTION_8021P_PRIORITY 0x00000040 +#define NDIS_MAC_OPTION_RESERVED 0x80000000 + +/** Hardware status of the underlying NIC */ +#define NDIS_HW_STS_READY 0x00000000UL +#define NDIS_HW_STS_INITIALIZING 0x00000001UL +#define NDIS_HW_STS_RESET 0x00000002UL +#define NDIS_HW_STS_CLOSING 0x00000003UL +#define NDIS_HW_STS_NOT_READY 0x00000004UL + +#endif /* _LINUX_NDIS_H */ + +/** @} */ diff --git a/src/lib/CherryUSB/class/wireless/rndis_protocol.h b/src/lib/CherryUSB/class/wireless/rndis_protocol.h new file mode 100644 index 000000000..54b4ebf62 --- /dev/null +++ b/src/lib/CherryUSB/class/wireless/rndis_protocol.h @@ -0,0 +1,302 @@ +/** + * \file rndis_protocol.h + * RNDIS Defines + * + * \author + * Colin O'Flynn + * + * \addtogroup usbstick + */ + +/* Copyright (c) 2008 Colin O'Flynn + + 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 the copyright holders nor the names of + 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 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 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. +*/ + +#ifndef _RNDIS_H +#define _RNDIS_H + +/** + \addtogroup RNDIS + @{ + */ + +#include + +#define RNDIS_MAJOR_VERSION 1 +#define RNDIS_MINOR_VERSION 0 + +#define RNDIS_STATUS_SUCCESS 0X00000000 +#define RNDIS_STATUS_FAILURE 0XC0000001 +#define RNDIS_STATUS_INVALID_DATA 0XC0010015 +#define RNDIS_STATUS_NOT_SUPPORTED 0XC00000BB +#define RNDIS_STATUS_MEDIA_CONNECT 0X4001000B +#define RNDIS_STATUS_MEDIA_DISCONNECT 0X4001000C + +/* Message set for Connectionless (802.3) Devices */ +#define REMOTE_NDIS_PACKET_MSG 0x00000001 +#define REMOTE_NDIS_INITIALIZE_MSG 0X00000002 +#define REMOTE_NDIS_HALT_MSG 0X00000003 +#define REMOTE_NDIS_QUERY_MSG 0X00000004 +#define REMOTE_NDIS_SET_MSG 0X00000005 +#define REMOTE_NDIS_RESET_MSG 0X00000006 +#define REMOTE_NDIS_INDICATE_STATUS_MSG 0X00000007 +#define REMOTE_NDIS_KEEPALIVE_MSG 0X00000008 +#define REMOTE_NDIS_INITIALIZE_CMPLT 0X80000002 +#define REMOTE_NDIS_QUERY_CMPLT 0X80000004 +#define REMOTE_NDIS_SET_CMPLT 0X80000005 +#define REMOTE_NDIS_RESET_CMPLT 0X80000006 +#define REMOTE_NDIS_KEEPALIVE_CMPLT 0X80000008 + +typedef uint32_t rndis_MessageType_t; +typedef uint32_t rndis_MessageLength_t; +typedef uint32_t rndis_RequestId_t; +typedef uint32_t rndis_MajorVersion_t; +typedef uint32_t rndis_MinorVersion_t; +typedef uint32_t rndis_MaxTransferSize_t; +typedef uint32_t rndis_Status_t; + +/* Device Flags */ +#define RNDIS_DF_CONNECTIONLESS 0x00000001 +#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002 +typedef uint32_t rndis_DeviceFlags_t; + +/* Mediums */ +#define RNDIS_MEDIUM_802_3 0x00000000 +typedef uint32_t rndis_Medium_t; + +typedef uint32_t rndis_MaxPacketsPerTransfer_t; +typedef uint32_t rndis_PacketAlignmentFactor_t; +typedef uint32_t rndis_AfListOffset_t; +typedef uint32_t rndis_AfListSize_t; + +/*** Remote NDIS Generic Message type ***/ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; +} rndis_generic_msg_t; + +/*** Remote NDIS Initialize Message ***/ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_RequestId_t RequestId; + rndis_MajorVersion_t MajorVersion; + rndis_MinorVersion_t MinorVersion; + rndis_MaxTransferSize_t MaxTransferSize; +} rndis_initialize_msg_t; + +/* Response: */ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_RequestId_t RequestId; + rndis_Status_t Status; + rndis_MajorVersion_t MajorVersion; + rndis_MinorVersion_t MinorVersion; + rndis_DeviceFlags_t DeviceFlags; + rndis_Medium_t Medium; + rndis_MaxPacketsPerTransfer_t MaxPacketsPerTransfer; + rndis_MaxTransferSize_t MaxTransferSize; + rndis_PacketAlignmentFactor_t PacketAlignmentFactor; + rndis_AfListOffset_t AfListOffset; + rndis_AfListSize_t AfListSize; +} rndis_initialize_cmplt_t; + +/*** Remote NDIS Halt Message ***/ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_RequestId_t RequestId; +} rndis_halt_msg_t; + +typedef uint32_t rndis_Oid_t; +typedef uint32_t rndis_InformationBufferLength_t; +typedef uint32_t rndis_InformationBufferOffset_t; +typedef uint32_t rndis_DeviceVcHandle_t; + +/*** Remote NDIS Query Message ***/ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_RequestId_t RequestId; + rndis_Oid_t Oid; + rndis_InformationBufferLength_t InformationBufferLength; + rndis_InformationBufferOffset_t InformationBufferOffset; + rndis_DeviceVcHandle_t DeviceVcHandle; +} rndis_query_msg_t; + +/* Response: */ + +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_RequestId_t RequestId; + rndis_Status_t Status; + rndis_InformationBufferLength_t InformationBufferLength; + rndis_InformationBufferOffset_t InformationBufferOffset; +} rndis_query_cmplt_t; + +/*** Remote NDIS Set Message ***/ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_RequestId_t RequestId; + rndis_Oid_t Oid; + rndis_InformationBufferLength_t InformationBufferLength; + rndis_InformationBufferOffset_t InformationBufferOffset; + rndis_DeviceVcHandle_t DeviceVcHandle; +} rndis_set_msg_t; + +/* Response */ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_RequestId_t RequestId; + rndis_Status_t Status; +} rndis_set_cmplt_t; + +/* Information buffer layout for OID_GEN_RNDIS_CONFIG_PARAMETER */ +typedef uint32_t rndis_ParameterNameOffset_t; +typedef uint32_t rndis_ParameterNameLength_t; +typedef uint32_t rndis_ParameterType_t; +typedef uint32_t rndis_ParameterValueOffset_t; +typedef uint32_t rndis_ParameterValueLength_t; + +#define PARAMETER_TYPE_STRING 2 +#define PARAMETER_TYPE_NUMERICAL 0 + +typedef struct { + rndis_ParameterNameOffset_t ParameterNameOffset; + rndis_ParameterNameLength_t ParameterNameLength; + rndis_ParameterType_t ParameterType; + rndis_ParameterValueOffset_t ParameterValueOffset; + rndis_ParameterValueLength_t ParameterValueLength; +} rndis_config_parameter_t; + +typedef uint32_t rndis_Reserved_t; + +/*** Remote NDIS Soft Reset Message ***/ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_Reserved_t Reserved; +} rndis_reset_msg_t; + +typedef uint32_t rndis_AddressingReset_t; + +/* Response: */ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_Status_t Status; + rndis_AddressingReset_t AddressingReset; +} rndis_reset_cmplt_t; + +/*** Remote NDIS Indicate Status Message ***/ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_Status_t Status; + rndis_Status_t StatusBufferLength; + rndis_Status_t StatusBufferOffset; +} rndis_indicate_status_t; + +typedef uint32_t rndis_DiagStatus_t; +typedef uint32_t rndis_ErrorOffset_t; + +typedef struct { + rndis_DiagStatus_t DiagStatus; + rndis_ErrorOffset_t ErrorOffset; +} rndis_diagnostic_info_t; + +/*** Remote NDIS Keepalive Message */ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_RequestId_t RequestId; +} rndis_keepalive_msg_t; + +/* Response: */ +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_RequestId_t RequestId; + rndis_Status_t Status; +} rndis_keepalive_cmplt_t; + +/*** Remote NDIS Data Packet ***/ + +typedef uint32_t rndis_DataOffset_t; +typedef uint32_t rndis_DataLength_t; +typedef uint32_t rndis_OOBDataOffset_t; +typedef uint32_t rndis_OOBDataLength_t; +typedef uint32_t rndis_NumOOBDataElements_t; +typedef uint32_t rndis_PerPacketInfoOffset_t; +typedef uint32_t rndis_PerPacketInfoLength_t; + +typedef struct { + rndis_MessageType_t MessageType; + rndis_MessageLength_t MessageLength; + rndis_DataOffset_t DataOffset; + rndis_DataLength_t DataLength; + rndis_OOBDataOffset_t OOBDataOffset; + rndis_OOBDataLength_t OOBDataLength; + rndis_NumOOBDataElements_t NumOOBDataElements; + rndis_PerPacketInfoOffset_t PerPacketInfoOffset; + rndis_PerPacketInfoLength_t PerPacketInfoLength; + rndis_DeviceVcHandle_t DeviceVcHandle; + rndis_Reserved_t Reserved; +} rndis_data_packet_t; + +typedef uint32_t rndis_ClassInformationOffset_t; +typedef uint32_t rndis_Size_t; +typedef uint32_t rndis_Type_t; + +typedef struct { + rndis_Size_t Size; + rndis_Type_t Type; + rndis_ClassInformationOffset_t ClassInformationType; +} rndis_OOB_packet_t; + +#include "ndis.h" + +typedef enum rnids_state_e { + rndis_uninitialized, + rndis_initialized, + rndis_data_initialized +} rndis_state_t; + +typedef struct { + uint32_t txok; + uint32_t rxok; + uint32_t txbad; + uint32_t rxbad; +} usb_eth_stat_t; + +#endif /* _RNDIS_H */ + +/** @} */ diff --git a/src/lib/CherryUSB/class/wireless/usbd_rndis.c b/src/lib/CherryUSB/class/wireless/usbd_rndis.c new file mode 100644 index 000000000..2b93e479e --- /dev/null +++ b/src/lib/CherryUSB/class/wireless/usbd_rndis.c @@ -0,0 +1,667 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_rndis.h" +#include "rndis_protocol.h" + +#define RNDIS_OUT_EP_IDX 0 +#define RNDIS_IN_EP_IDX 1 +#define RNDIS_INT_EP_IDX 2 + +/* Describe EndPoints configuration */ +static struct usbd_endpoint rndis_ep_data[3]; + +#define RNDIS_INQUIRY_PUT(src, len) (memcpy(infomation_buffer, src, len)) +#define RNDIS_INQUIRY_PUT_LE32(value) (*(uint32_t *)infomation_buffer = (value)) + +/* Device data structure */ +struct usbd_rndis_priv { + uint32_t drv_version; + uint32_t link_status; + uint32_t net_filter; + usb_eth_stat_t eth_state; + rndis_state_t init_state; + bool set_rsp_get; + uint8_t mac[6]; +} g_usbd_rndis; + +#if CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE < 140 +#undef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +#if CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE < 1580 +#undef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifdef CONFIG_USBDEV_RNDIS_USING_LWIP +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_rx_buffer[USB_ALIGN_UP(CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_tx_buffer[USB_ALIGN_UP(CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE, CONFIG_USB_ALIGN_SIZE)]; +#endif + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t rndis_encapsulated_resp_buffer[USB_ALIGN_UP(CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t NOTIFY_RESPONSE_AVAILABLE[USB_ALIGN_UP(8, CONFIG_USB_ALIGN_SIZE)]; + +volatile uint8_t *g_rndis_rx_data_buffer; +volatile uint32_t g_rndis_rx_data_length; +volatile uint32_t g_rndis_rx_total_length; +volatile uint32_t g_rndis_tx_data_length; + +/* RNDIS options list */ +const uint32_t oid_supported_list[] = { + /* General OIDs */ + OID_GEN_SUPPORTED_LIST, + OID_GEN_HARDWARE_STATUS, + OID_GEN_MEDIA_SUPPORTED, + OID_GEN_MEDIA_IN_USE, + OID_GEN_MAXIMUM_FRAME_SIZE, + OID_GEN_LINK_SPEED, + OID_GEN_TRANSMIT_BLOCK_SIZE, + OID_GEN_RECEIVE_BLOCK_SIZE, + OID_GEN_VENDOR_ID, + OID_GEN_VENDOR_DESCRIPTION, + OID_GEN_VENDOR_DRIVER_VERSION, + OID_GEN_CURRENT_PACKET_FILTER, + OID_GEN_MAXIMUM_TOTAL_SIZE, + OID_GEN_MEDIA_CONNECT_STATUS, + + OID_GEN_PHYSICAL_MEDIUM, + + /* General Statistic OIDs */ + OID_GEN_XMIT_OK, + OID_GEN_RCV_OK, + OID_GEN_XMIT_ERROR, + OID_GEN_RCV_ERROR, + OID_GEN_RCV_NO_BUFFER, + + /* Please configure us */ + OID_GEN_RNDIS_CONFIG_PARAMETER, + + /* 802.3 OIDs */ + OID_802_3_PERMANENT_ADDRESS, + OID_802_3_CURRENT_ADDRESS, + OID_802_3_MULTICAST_LIST, + OID_802_3_MAXIMUM_LIST_SIZE, + + /* 802.3 Statistic OIDs */ + OID_802_3_RCV_ERROR_ALIGNMENT, + OID_802_3_XMIT_ONE_COLLISION, + OID_802_3_XMIT_MORE_COLLISIONS, + + OID_802_3_MAC_OPTIONS, +}; + +static int rndis_encapsulated_cmd_handler(uint8_t *data, uint32_t len); + +static void rndis_notify_rsp(void) +{ + memset(NOTIFY_RESPONSE_AVAILABLE, 0, 8); + NOTIFY_RESPONSE_AVAILABLE[0] = 0x01; + usbd_ep_start_write(0, rndis_ep_data[RNDIS_INT_EP_IDX].ep_addr, NOTIFY_RESPONSE_AVAILABLE, 8); +} + +static int rndis_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + (void)busid; + + switch (setup->bRequest) { + case CDC_REQUEST_SEND_ENCAPSULATED_COMMAND: + g_usbd_rndis.set_rsp_get = true; + + rndis_encapsulated_cmd_handler(*data, setup->wLength); + break; + case CDC_REQUEST_GET_ENCAPSULATED_RESPONSE: + g_usbd_rndis.set_rsp_get = false; + + *data = rndis_encapsulated_resp_buffer; + *len = ((rndis_generic_msg_t *)rndis_encapsulated_resp_buffer)->MessageLength; + break; + + default: + return -1; + } + + return 0; +} + +static int rndis_init_cmd_handler(uint8_t *data, uint32_t len); +static int rndis_halt_cmd_handler(uint8_t *data, uint32_t len); +static int rndis_query_cmd_handler(uint8_t *data, uint32_t len); +static int rndis_set_cmd_handler(uint8_t *data, uint32_t len); +static int rndis_reset_cmd_handler(uint8_t *data, uint32_t len); +static int rndis_keepalive_cmd_handler(uint8_t *data, uint32_t len); + +static int rndis_encapsulated_cmd_handler(uint8_t *data, uint32_t len) +{ + switch (((rndis_generic_msg_t *)data)->MessageType) { + case REMOTE_NDIS_INITIALIZE_MSG: + return rndis_init_cmd_handler(data, len); + case REMOTE_NDIS_HALT_MSG: + return rndis_halt_cmd_handler(data, len); + case REMOTE_NDIS_QUERY_MSG: + return rndis_query_cmd_handler(data, len); + case REMOTE_NDIS_SET_MSG: + return rndis_set_cmd_handler(data, len); + case REMOTE_NDIS_RESET_MSG: + return rndis_reset_cmd_handler(data, len); + case REMOTE_NDIS_KEEPALIVE_MSG: + return rndis_keepalive_cmd_handler(data, len); + + default: + break; + } + return -1; +} + +static int rndis_init_cmd_handler(uint8_t *data, uint32_t len) +{ + rndis_initialize_msg_t *cmd = (rndis_initialize_msg_t *)data; + rndis_initialize_cmplt_t *resp; + + (void)len; + + resp = ((rndis_initialize_cmplt_t *)rndis_encapsulated_resp_buffer); + resp->RequestId = cmd->RequestId; + resp->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT; + resp->MessageLength = sizeof(rndis_initialize_cmplt_t); + resp->MajorVersion = RNDIS_MAJOR_VERSION; + resp->MinorVersion = RNDIS_MINOR_VERSION; + resp->Status = RNDIS_STATUS_SUCCESS; + resp->DeviceFlags = RNDIS_DF_CONNECTIONLESS; + resp->Medium = RNDIS_MEDIUM_802_3; + resp->MaxPacketsPerTransfer = CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE / 1580; + resp->MaxTransferSize = CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE; + resp->PacketAlignmentFactor = 0; + resp->AfListOffset = 0; + resp->AfListSize = 0; + + g_usbd_rndis.init_state = rndis_initialized; + + rndis_notify_rsp(); + return 0; +} + +static int rndis_halt_cmd_handler(uint8_t *data, uint32_t len) +{ + rndis_halt_msg_t *resp; + + (void)data; + (void)len; + + resp = ((rndis_halt_msg_t *)rndis_encapsulated_resp_buffer); + resp->MessageLength = 0; + + g_usbd_rndis.init_state = rndis_uninitialized; + + return 0; +} + +static int rndis_query_cmd_handler(uint8_t *data, uint32_t len) +{ + rndis_query_msg_t *cmd = (rndis_query_msg_t *)data; + rndis_query_cmplt_t *resp; + uint8_t *infomation_buffer; + uint32_t infomation_len = 0; + + (void)len; + + resp = ((rndis_query_cmplt_t *)rndis_encapsulated_resp_buffer); + resp->MessageType = REMOTE_NDIS_QUERY_CMPLT; + resp->RequestId = cmd->RequestId; + resp->InformationBufferOffset = sizeof(rndis_query_cmplt_t) - sizeof(rndis_generic_msg_t); + resp->Status = RNDIS_STATUS_SUCCESS; + + infomation_buffer = (uint8_t *)resp + sizeof(rndis_query_cmplt_t); + + switch (cmd->Oid) { + case OID_GEN_SUPPORTED_LIST: + RNDIS_INQUIRY_PUT(oid_supported_list, sizeof(oid_supported_list)); + infomation_len = sizeof(oid_supported_list); + break; + case OID_GEN_HARDWARE_STATUS: + RNDIS_INQUIRY_PUT_LE32(NDIS_HW_STS_READY); + infomation_len = 4; + break; + case OID_GEN_MEDIA_SUPPORTED: + case OID_GEN_MEDIA_IN_USE: + RNDIS_INQUIRY_PUT_LE32(NDIS_MEDIUM_802_3); + infomation_len = 4; + break; + case OID_GEN_MAXIMUM_FRAME_SIZE: + case OID_GEN_TRANSMIT_BLOCK_SIZE: + case OID_GEN_RECEIVE_BLOCK_SIZE: + RNDIS_INQUIRY_PUT_LE32(0x05DC); /* mtu 1500 */ + infomation_len = 4; + break; + case OID_GEN_VENDOR_ID: + RNDIS_INQUIRY_PUT_LE32(CONFIG_USBDEV_RNDIS_VENDOR_ID); + infomation_len = 4; + break; + case OID_GEN_VENDOR_DRIVER_VERSION: + RNDIS_INQUIRY_PUT_LE32(0x0001); + infomation_len = 4; + break; + case OID_GEN_VENDOR_DESCRIPTION: + RNDIS_INQUIRY_PUT(CONFIG_USBDEV_RNDIS_VENDOR_DESC, strlen(CONFIG_USBDEV_RNDIS_VENDOR_DESC)); + infomation_len = (strlen(CONFIG_USBDEV_RNDIS_VENDOR_DESC) + 1); + break; + case OID_802_3_CURRENT_ADDRESS: + case OID_802_3_PERMANENT_ADDRESS: + RNDIS_INQUIRY_PUT(g_usbd_rndis.mac, 6); + infomation_len = 6; + break; + case OID_GEN_PHYSICAL_MEDIUM: + RNDIS_INQUIRY_PUT_LE32(NDIS_MEDIUM_802_3); + infomation_len = 4; + break; + case OID_GEN_LINK_SPEED: + if (usbd_get_ep_mps(0, rndis_ep_data[RNDIS_OUT_EP_IDX].ep_addr) > 64) { + RNDIS_INQUIRY_PUT_LE32(480000000 / 100); + } else { + RNDIS_INQUIRY_PUT_LE32(12000000 / 100); + } + + infomation_len = 4; + break; + case OID_GEN_CURRENT_PACKET_FILTER: + RNDIS_INQUIRY_PUT_LE32(g_usbd_rndis.net_filter); + infomation_len = 4; + break; + case OID_GEN_MAXIMUM_TOTAL_SIZE: + RNDIS_INQUIRY_PUT_LE32(0x0616); /* 1514 + 44 */ + infomation_len = 4; + break; + case OID_GEN_MEDIA_CONNECT_STATUS: + RNDIS_INQUIRY_PUT_LE32(NDIS_MEDIA_STATE_CONNECTED); + infomation_len = 4; + break; + case OID_GEN_RNDIS_CONFIG_PARAMETER: + RNDIS_INQUIRY_PUT_LE32(0); + infomation_len = 4; + break; + case OID_802_3_MAXIMUM_LIST_SIZE: + RNDIS_INQUIRY_PUT_LE32(1); /* one address */ + infomation_len = 4; + break; + case OID_802_3_MULTICAST_LIST: + //RNDIS_INQUIRY_PUT_LE32(0xE0000000); /* 224.0.0.0 */ + resp->Status = RNDIS_STATUS_NOT_SUPPORTED; + RNDIS_INQUIRY_PUT_LE32(0); + infomation_len = 4; + break; + case OID_802_3_MAC_OPTIONS: + // infomation_len = 0; + resp->Status = RNDIS_STATUS_NOT_SUPPORTED; + RNDIS_INQUIRY_PUT_LE32(0); + infomation_len = 4; + break; + case OID_GEN_MAC_OPTIONS: + RNDIS_INQUIRY_PUT_LE32(0); + infomation_len = 4; + break; + case OID_802_3_RCV_ERROR_ALIGNMENT: + RNDIS_INQUIRY_PUT_LE32(0); + infomation_len = 4; + break; + case OID_802_3_XMIT_ONE_COLLISION: + RNDIS_INQUIRY_PUT_LE32(0); + infomation_len = 4; + break; + case OID_802_3_XMIT_MORE_COLLISIONS: + RNDIS_INQUIRY_PUT_LE32(0); + infomation_len = 4; + break; + case OID_GEN_XMIT_OK: + RNDIS_INQUIRY_PUT_LE32(g_usbd_rndis.eth_state.txok); + infomation_len = 4; + break; + case OID_GEN_RCV_OK: + RNDIS_INQUIRY_PUT_LE32(g_usbd_rndis.eth_state.rxok); + infomation_len = 4; + break; + case OID_GEN_RCV_ERROR: + RNDIS_INQUIRY_PUT_LE32(g_usbd_rndis.eth_state.rxbad); + infomation_len = 4; + break; + case OID_GEN_XMIT_ERROR: + RNDIS_INQUIRY_PUT_LE32(g_usbd_rndis.eth_state.txbad); + infomation_len = 4; + break; + case OID_GEN_RCV_NO_BUFFER: + RNDIS_INQUIRY_PUT_LE32(0); + infomation_len = 4; + break; + default: + resp->Status = RNDIS_STATUS_FAILURE; + infomation_len = 0; + USB_LOG_WRN("Unhandled query for Object ID 0x%x\r\n", cmd->Oid); + break; + } + + resp->MessageLength = sizeof(rndis_query_cmplt_t) + infomation_len; + resp->InformationBufferLength = infomation_len; + + rndis_notify_rsp(); + return 0; +} + +static int rndis_set_cmd_handler(uint8_t *data, uint32_t len) +{ + rndis_set_msg_t *cmd = (rndis_set_msg_t *)data; + rndis_set_cmplt_t *resp; + rndis_config_parameter_t *param; + + (void)len; + + resp = ((rndis_set_cmplt_t *)rndis_encapsulated_resp_buffer); + resp->RequestId = cmd->RequestId; + resp->MessageType = REMOTE_NDIS_SET_CMPLT; + resp->MessageLength = sizeof(rndis_set_cmplt_t); + resp->Status = RNDIS_STATUS_SUCCESS; + + switch (cmd->Oid) { + case OID_GEN_RNDIS_CONFIG_PARAMETER: + param = (rndis_config_parameter_t *)((uint8_t *)&(cmd->RequestId) + cmd->InformationBufferOffset); + USB_LOG_WRN("RNDIS cfg param: NameOfs=%d, NameLen=%d, ValueOfs=%d, ValueLen=%d\r\n", + param->ParameterNameOffset, param->ParameterNameLength, + param->ParameterValueOffset, param->ParameterValueLength); + break; + case OID_GEN_CURRENT_PACKET_FILTER: + if (cmd->InformationBufferLength < sizeof(g_usbd_rndis.net_filter)) { + USB_LOG_WRN("PACKET_FILTER!\r\n"); + resp->Status = RNDIS_STATUS_INVALID_DATA; + } else { + uint32_t *filter; + /* Parameter starts at offset buf_offset of the req_id field */ + filter = (uint32_t *)((uint8_t *)&(cmd->RequestId) + cmd->InformationBufferOffset); + + //g_usbd_rndis.net_filter = param->ParameterNameOffset; + g_usbd_rndis.net_filter = *(uint32_t *)filter; + if (g_usbd_rndis.net_filter) { + g_usbd_rndis.init_state = rndis_data_initialized; + } else { + g_usbd_rndis.init_state = rndis_initialized; + } + } + break; + case OID_GEN_CURRENT_LOOKAHEAD: + break; + case OID_GEN_PROTOCOL_OPTIONS: + break; + case OID_802_3_MULTICAST_LIST: + break; + case OID_PNP_ADD_WAKE_UP_PATTERN: + case OID_PNP_REMOVE_WAKE_UP_PATTERN: + case OID_PNP_ENABLE_WAKE_UP: + default: + resp->Status = RNDIS_STATUS_FAILURE; + USB_LOG_WRN("Unhandled query for Object ID 0x%x\r\n", cmd->Oid); + break; + } + + rndis_notify_rsp(); + + return 0; +} + +static int rndis_reset_cmd_handler(uint8_t *data, uint32_t len) +{ + // rndis_reset_msg_t *cmd = (rndis_reset_msg_t *)data; + rndis_reset_cmplt_t *resp; + + (void)data; + (void)len; + + resp = ((rndis_reset_cmplt_t *)rndis_encapsulated_resp_buffer); + resp->MessageType = REMOTE_NDIS_RESET_CMPLT; + resp->MessageLength = sizeof(rndis_reset_cmplt_t); + resp->Status = RNDIS_STATUS_SUCCESS; + resp->AddressingReset = 1; + + g_usbd_rndis.init_state = rndis_uninitialized; + + rndis_notify_rsp(); + + return 0; +} + +static int rndis_keepalive_cmd_handler(uint8_t *data, uint32_t len) +{ + rndis_keepalive_msg_t *cmd = (rndis_keepalive_msg_t *)data; + rndis_keepalive_cmplt_t *resp; + + (void)len; + + resp = ((rndis_keepalive_cmplt_t *)rndis_encapsulated_resp_buffer); + resp->RequestId = cmd->RequestId; + resp->MessageType = REMOTE_NDIS_KEEPALIVE_CMPLT; + resp->MessageLength = sizeof(rndis_keepalive_cmplt_t); + resp->Status = RNDIS_STATUS_SUCCESS; + + rndis_notify_rsp(); + + return 0; +} + +static void rndis_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + (void)busid; + (void)arg; + + switch (event) { + case USBD_EVENT_RESET: + g_usbd_rndis.link_status = NDIS_MEDIA_STATE_DISCONNECTED; + g_rndis_rx_data_length = 0; + g_rndis_tx_data_length = 0; + break; + case USBD_EVENT_CONFIGURED: +#ifdef CONFIG_USBDEV_RNDIS_USING_LWIP + g_usbd_rndis.link_status = NDIS_MEDIA_STATE_CONNECTED; + usbd_rndis_start_read(g_rndis_rx_buffer, sizeof(g_rndis_rx_buffer)); +#endif + break; + + default: + break; + } +} + +void rndis_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + rndis_data_packet_t *hdr; + + (void)busid; + (void)ep; + + hdr = (rndis_data_packet_t *)g_rndis_rx_data_buffer; + if ((hdr->MessageType != REMOTE_NDIS_PACKET_MSG) || (nbytes < hdr->MessageLength)) { + usbd_rndis_start_read((uint8_t *)g_rndis_rx_data_buffer, g_rndis_rx_total_length); + return; + } + + /* Point to the payload and update the message length */ + g_rndis_rx_data_buffer += hdr->DataOffset + sizeof(rndis_generic_msg_t); + g_rndis_rx_data_length = hdr->DataLength; + + usbd_rndis_data_recv_done(g_rndis_rx_data_length); +} + +void rndis_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + + if ((nbytes % usbd_get_ep_mps(0, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(0, ep, NULL, 0); + } else { + usbd_rndis_data_send_done(g_rndis_tx_data_length); + g_rndis_tx_data_length = 0; + } +} + +void rndis_int_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + (void)ep; + (void)nbytes; + + //USB_LOG_DBG("len:%d\r\n", nbytes); +} + +int usbd_rndis_start_write(uint8_t *buf, uint32_t len) +{ + if (!usb_device_is_configured(0)) { + return -USB_ERR_NOTCONN; + } + + if (g_rndis_tx_data_length > 0) { + return -USB_ERR_BUSY; + } + + g_rndis_tx_data_length = len; + + USB_LOG_DBG("txlen:%d\r\n", g_rndis_tx_data_length); + return usbd_ep_start_write(0, rndis_ep_data[RNDIS_IN_EP_IDX].ep_addr, buf, len); +} + +int usbd_rndis_start_read(uint8_t *buf, uint32_t len) +{ + if (!usb_device_is_configured(0)) { + return -USB_ERR_NOTCONN; + } + + g_rndis_rx_data_buffer = buf; + g_rndis_rx_total_length = len; + g_rndis_rx_data_length = 0; + return usbd_ep_start_read(0, rndis_ep_data[RNDIS_OUT_EP_IDX].ep_addr, buf, len); +} + +#ifdef CONFIG_USBDEV_RNDIS_USING_LWIP +#include + +struct pbuf *usbd_rndis_eth_rx(void) +{ + struct pbuf *p; + + if (g_rndis_rx_data_length == 0) { + return NULL; + } + p = pbuf_alloc(PBUF_RAW, g_rndis_rx_data_length, PBUF_POOL); + if (p == NULL) { + usbd_rndis_start_read(g_rndis_rx_buffer, sizeof(g_rndis_rx_buffer)); + return NULL; + } + usb_memcpy(p->payload, (uint8_t *)g_rndis_rx_data_buffer, g_rndis_rx_data_length); + p->len = g_rndis_rx_data_length; + + USB_LOG_DBG("rxlen:%d\r\n", g_rndis_rx_data_length); + usbd_rndis_start_read(g_rndis_rx_buffer, sizeof(g_rndis_rx_buffer)); + return p; +} + +int usbd_rndis_eth_tx(struct pbuf *p) +{ + struct pbuf *q; + uint8_t *buffer; + rndis_data_packet_t *hdr; + + if (!usb_device_is_configured(0)) { + return -USB_ERR_NOTCONN; + } + + if (g_rndis_tx_data_length > 0) { + return -USB_ERR_BUSY; + } + + if (p->tot_len > sizeof(g_rndis_tx_buffer)) { + p->tot_len = sizeof(g_rndis_tx_buffer); + } + + buffer = (uint8_t *)(g_rndis_tx_buffer + sizeof(rndis_data_packet_t)); + for (q = p; q != NULL; q = q->next) { + usb_memcpy(buffer, q->payload, q->len); + buffer += q->len; + } + + hdr = (rndis_data_packet_t *)g_rndis_tx_buffer; + + memset(hdr, 0, sizeof(rndis_data_packet_t)); + hdr->MessageType = REMOTE_NDIS_PACKET_MSG; + hdr->MessageLength = sizeof(rndis_data_packet_t) + p->tot_len; + hdr->DataOffset = sizeof(rndis_data_packet_t) - sizeof(rndis_generic_msg_t); + hdr->DataLength = p->tot_len; + + return usbd_rndis_start_write(g_rndis_tx_buffer, sizeof(rndis_data_packet_t) + p->tot_len); +} +#endif +struct usbd_interface *usbd_rndis_init_intf(struct usbd_interface *intf, + const uint8_t out_ep, + const uint8_t in_ep, + const uint8_t int_ep, uint8_t mac[6]) +{ + memcpy(g_usbd_rndis.mac, mac, 6); + + g_usbd_rndis.drv_version = 0x0001; + g_usbd_rndis.link_status = NDIS_MEDIA_STATE_DISCONNECTED; + + rndis_ep_data[RNDIS_OUT_EP_IDX].ep_addr = out_ep; + rndis_ep_data[RNDIS_OUT_EP_IDX].ep_cb = rndis_bulk_out; + rndis_ep_data[RNDIS_IN_EP_IDX].ep_addr = in_ep; + rndis_ep_data[RNDIS_IN_EP_IDX].ep_cb = rndis_bulk_in; + rndis_ep_data[RNDIS_INT_EP_IDX].ep_addr = int_ep; + rndis_ep_data[RNDIS_INT_EP_IDX].ep_cb = rndis_int_in; + + usbd_add_endpoint(0, &rndis_ep_data[RNDIS_OUT_EP_IDX]); + usbd_add_endpoint(0, &rndis_ep_data[RNDIS_IN_EP_IDX]); + usbd_add_endpoint(0, &rndis_ep_data[RNDIS_INT_EP_IDX]); + + intf->class_interface_handler = rndis_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = rndis_notify_handler; + + return intf; +} + +int usbd_rndis_set_connect(bool connect) +{ + if (!usb_device_is_configured(0)) { + return -USB_ERR_NOTCONN; + } + + if(g_usbd_rndis.set_rsp_get) + return -USB_ERR_BUSY; + + rndis_indicate_status_t *resp; + + resp = ((rndis_indicate_status_t *)rndis_encapsulated_resp_buffer); + resp->MessageType = REMOTE_NDIS_INDICATE_STATUS_MSG; + resp->MessageLength = sizeof(rndis_indicate_status_t); + if(connect) { + resp->Status = RNDIS_STATUS_MEDIA_CONNECT; + g_usbd_rndis.link_status = NDIS_MEDIA_STATE_CONNECTED; + } else { + resp->Status = RNDIS_STATUS_MEDIA_DISCONNECT; + g_usbd_rndis.link_status = NDIS_MEDIA_STATE_DISCONNECTED; + } + resp->StatusBufferLength = 0; + resp->StatusBufferOffset = 0; + + rndis_notify_rsp(); + + return 0; +} + +__WEAK void usbd_rndis_data_recv_done(uint32_t len) +{ + (void)len; +} + +__WEAK void usbd_rndis_data_send_done(uint32_t len) +{ + (void)len; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/class/wireless/usbd_rndis.h b/src/lib/CherryUSB/class/wireless/usbd_rndis.h new file mode 100644 index 000000000..8f4847b11 --- /dev/null +++ b/src/lib/CherryUSB/class/wireless/usbd_rndis.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_RNDIS_H +#define USBD_RNDIS_H + +#include "usb_cdc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Init rndis interface driver */ +struct usbd_interface *usbd_rndis_init_intf(struct usbd_interface *intf, + const uint8_t out_ep, + const uint8_t in_ep, + const uint8_t int_ep, uint8_t mac[6]); + +int usbd_rndis_set_connect(bool connect); + +void usbd_rndis_data_recv_done(uint32_t len); +void usbd_rndis_data_send_done(uint32_t len); +int usbd_rndis_start_write(uint8_t *buf, uint32_t len); +int usbd_rndis_start_read(uint8_t *buf, uint32_t len); + +#ifdef CONFIG_USBDEV_RNDIS_USING_LWIP +struct pbuf *usbd_rndis_eth_rx(void); +int usbd_rndis_eth_tx(struct pbuf *p); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_RNDIS_H */ diff --git a/src/lib/CherryUSB/class/wireless/usbh_bluetooth.c b/src/lib/CherryUSB/class/wireless/usbh_bluetooth.c new file mode 100644 index 000000000..af7167c01 --- /dev/null +++ b/src/lib/CherryUSB/class/wireless/usbh_bluetooth.c @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_bluetooth.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_bluetooth" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/bluetooth" + +static struct usbh_bluetooth g_bluetooth_class; + +#ifdef CONFIG_USBHOST_BLUETOOTH_HCI_H4 +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_bluetooth_tx_buf[USB_ALIGN_UP(CONFIG_USBHOST_BLUETOOTH_TX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_bluetooth_rx_buf[USB_ALIGN_UP(CONFIG_USBHOST_BLUETOOTH_RX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +#else +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_bluetooth_cmd_buf[USB_ALIGN_UP(256, CONFIG_USB_ALIGN_SIZE)]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_bluetooth_evt_buf[USB_ALIGN_UP(256, CONFIG_USB_ALIGN_SIZE)]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_bluetooth_tx_buf[USB_ALIGN_UP(CONFIG_USBHOST_BLUETOOTH_TX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_bluetooth_rx_buf[USB_ALIGN_UP(CONFIG_USBHOST_BLUETOOTH_RX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +#endif + +static int usbh_bluetooth_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret = 0; +#ifndef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + uint8_t mult; + uint16_t mps; +#endif + + struct usbh_bluetooth *bluetooth_class = &g_bluetooth_class; + +#ifndef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + if (intf != 0) { + return 0; + } +#endif + + memset(bluetooth_class, 0, sizeof(struct usbh_bluetooth)); + + bluetooth_class->hport = hport; + bluetooth_class->intf = intf; +#ifndef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + bluetooth_class->num_of_intf_altsettings = hport->config.intf[intf + 1].altsetting_num; +#endif + hport->config.intf[intf].priv = bluetooth_class; + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; +#ifndef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(bluetooth_class->intin, ep_desc); + } else { + return -USB_ERR_NOTSUPP; + } + } else { +#endif + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(bluetooth_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(bluetooth_class->bulkout, ep_desc); + } +#ifndef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + } +#endif + } +#ifndef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + USB_LOG_INFO("Num of altsettings:%u\r\n", bluetooth_class->num_of_intf_altsettings); + + for (uint8_t i = 0; i < bluetooth_class->num_of_intf_altsettings; i++) { + USB_LOG_INFO("Altsetting:%u\r\n", i); + for (uint8_t j = 0; j < hport->config.intf[intf + 1].altsetting[i].intf_desc.bNumEndpoints; j++) { + ep_desc = &bluetooth_class->hport->config.intf[intf + 1].altsetting[i].ep[j].ep_desc; + + mult = USB_GET_MULT(ep_desc->wMaxPacketSize); + mps = USB_GET_MAXPACKETSIZE(ep_desc->wMaxPacketSize); + + USB_LOG_INFO("\tEp=%02x Attr=%02u Mps=%d Interval=%02u Mult=%02u\r\n", + ep_desc->bEndpointAddress, + ep_desc->bmAttributes, + mps, + ep_desc->bInterval, + mult); + } + } + + ret = usbh_set_interface(hport, intf, 0); + if (ret < 0) { + return ret; + } + USB_LOG_INFO("Bluetooth select altsetting 0\r\n"); +#endif + strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN); + USB_LOG_INFO("Register Bluetooth Class:%s\r\n", hport->config.intf[intf].devname); + usbh_bluetooth_run(bluetooth_class); + return ret; +} + +static int usbh_bluetooth_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_bluetooth *bluetooth_class = (struct usbh_bluetooth *)hport->config.intf[intf].priv; + + if (hport->config.config_desc.bNumInterfaces == (intf + 1)) { + return 0; + } + + if (bluetooth_class) { + if (bluetooth_class->bulkin) { + usbh_kill_urb(&bluetooth_class->bulkin_urb); + } + + if (bluetooth_class->bulkout) { + usbh_kill_urb(&bluetooth_class->bulkout_urb); + } +#ifndef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + if (bluetooth_class->intin) { + usbh_kill_urb(&bluetooth_class->intin_urb); + } + + // if (bluetooth_class->isoin) { + // usbh_kill_urb(&bluetooth_class->isoin_urb); + // } + + // if (bluetooth_class->isoin) { + // usbh_kill_urb(&bluetooth_class->isoinin_urb); + // } +#endif + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister Bluetooth Class:%s\r\n", hport->config.intf[intf].devname); + usbh_bluetooth_stop(bluetooth_class); + } + + memset(bluetooth_class, 0, sizeof(struct usbh_bluetooth)); + } + + return ret; +} + +#ifdef CONFIG_USBHOST_BLUETOOTH_HCI_LOG +static void usbh_bluetooth_hci_dump(uint8_t *data, uint32_t len) +{ + uint32_t i = 0; + + for (i = 0; i < len; i++) { + if (i % 16 == 0) { + USB_LOG_RAW("\r\n"); + } + + USB_LOG_RAW("%02x ", data[i]); + } + + USB_LOG_RAW("\r\n"); +} +#else +#define usbh_bluetooth_hci_dump(data, len) +#endif + +static int usbh_bluetooth_hci_bulk_out(uint8_t *buffer, uint32_t buflen) +{ + struct usbh_bluetooth *bluetooth_class = &g_bluetooth_class; + struct usbh_urb *urb = &bluetooth_class->bulkout_urb; + int ret; + + usbh_bulk_urb_fill(urb, bluetooth_class->hport, bluetooth_class->bulkout, buffer, buflen, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +#ifdef CONFIG_USBHOST_BLUETOOTH_HCI_H4 +int usbh_bluetooth_hci_write(uint8_t hci_type, uint8_t *buffer, uint32_t buflen) +{ + int ret; + + g_bluetooth_tx_buf[0] = hci_type; + memcpy(&g_bluetooth_tx_buf[1], buffer, buflen); + usbh_bluetooth_hci_dump(g_bluetooth_tx_buf, buflen + 1); + ret = usbh_bluetooth_hci_bulk_out(g_bluetooth_tx_buf, buflen + 1); + return ret; +} + +void usbh_bluetooth_hci_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + int ret; + uint32_t ep_mps; + uint8_t retry = 0; + uint16_t actual_len = 0; + + ep_mps = USB_GET_MAXPACKETSIZE(g_bluetooth_class.bulkin->wMaxPacketSize); + + USB_LOG_INFO("Create hc rx thread\r\n"); + while (1) { + usbh_bulk_urb_fill(&g_bluetooth_class.bulkin_urb, g_bluetooth_class.hport, g_bluetooth_class.bulkin, &g_bluetooth_rx_buf[actual_len], ep_mps, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&g_bluetooth_class.bulkin_urb); + if (ret < 0) { + if (ret == -USB_ERR_SHUTDOWN) { + goto delete; + } else { + retry++; + if (retry == 3) { + retry = 0; + goto delete; + } + continue; + } + } + actual_len += g_bluetooth_class.bulkin_urb.actual_length; + if (g_bluetooth_class.bulkin_urb.actual_length != ep_mps) { + usbh_bluetooth_hci_dump(g_bluetooth_rx_buf, actual_len); + usbh_bluetooth_hci_read_callback(g_bluetooth_rx_buf, actual_len); + actual_len = 0; + } else { + /* read continue util read short packet */ + } + } + // clang-format off +delete : + USB_LOG_INFO("Delete hc acl rx thread\r\n"); + usb_osal_thread_delete(NULL); + // clang-format on +} + +#else +static int usbh_bluetooth_hci_cmd(uint8_t *buffer, uint32_t buflen) +{ + struct usbh_bluetooth *bluetooth_class = &g_bluetooth_class; + struct usb_setup_packet *setup; + + if (!bluetooth_class || !bluetooth_class->hport) { + return -USB_ERR_INVAL; + } + setup = bluetooth_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = 0x00; + setup->wValue = 0; + setup->wIndex = bluetooth_class->intf; + setup->wLength = buflen; + + return usbh_control_transfer(bluetooth_class->hport, setup, buffer); +} + +int usbh_bluetooth_hci_write(uint8_t hci_type, uint8_t *buffer, uint32_t buflen) +{ + int ret; + + if (hci_type == USB_BLUETOOTH_HCI_CMD) { + g_bluetooth_cmd_buf[0] = USB_BLUETOOTH_HCI_CMD; + memcpy(&g_bluetooth_cmd_buf[1], buffer, buflen); + usbh_bluetooth_hci_dump(g_bluetooth_cmd_buf, buflen + 1); + ret = usbh_bluetooth_hci_cmd(&g_bluetooth_cmd_buf[1], buflen); + } else if (hci_type == USB_BLUETOOTH_HCI_ACL) { + g_bluetooth_tx_buf[0] = USB_BLUETOOTH_HCI_ACL; + memcpy(&g_bluetooth_tx_buf[1], buffer, buflen); + usbh_bluetooth_hci_dump(g_bluetooth_tx_buf, buflen + 1); + ret = usbh_bluetooth_hci_bulk_out(&g_bluetooth_tx_buf[1], buflen); + } else { + ret = -1; + } + + return ret; +} + +void usbh_bluetooth_hci_evt_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + int ret; + uint32_t ep_mps; + uint32_t interval; + uint8_t retry = 0; + uint16_t actual_len = 0; + + ep_mps = USB_GET_MAXPACKETSIZE(g_bluetooth_class.intin->wMaxPacketSize); + interval = g_bluetooth_class.intin->bInterval; + + USB_LOG_INFO("Create hc event rx thread\r\n"); + while (1) { + usbh_int_urb_fill(&g_bluetooth_class.intin_urb, g_bluetooth_class.hport, g_bluetooth_class.intin, &g_bluetooth_evt_buf[1 + actual_len], ep_mps, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&g_bluetooth_class.intin_urb); + if (ret < 0) { + if (ret == -USB_ERR_SHUTDOWN) { + goto delete; + } else if (ret == -USB_ERR_NAK) { + usb_osal_msleep(interval); + continue; + } else { + retry++; + if (retry == 3) { + retry = 0; + goto delete; + } + usb_osal_msleep(interval); + continue; + } + } + actual_len += g_bluetooth_class.intin_urb.actual_length; + if (g_bluetooth_class.intin_urb.actual_length != ep_mps) { + g_bluetooth_evt_buf[0] = USB_BLUETOOTH_HCI_EVT; + usbh_bluetooth_hci_dump(g_bluetooth_evt_buf, actual_len + 1); + usbh_bluetooth_hci_read_callback(g_bluetooth_evt_buf, actual_len + 1); + actual_len = 0; + } else { + /* read continue util read short packet */ + } + usb_osal_msleep(interval); + } + // clang-format off +delete : + USB_LOG_INFO("Delete hc event rx thread\r\n"); + usb_osal_thread_delete(NULL); + // clang-format on +} + +void usbh_bluetooth_hci_acl_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + int ret; + uint32_t ep_mps; + uint8_t retry = 0; + uint16_t actual_len = 0; + + ep_mps = USB_GET_MAXPACKETSIZE(g_bluetooth_class.bulkin->wMaxPacketSize); + + USB_LOG_INFO("Create hc acl rx thread\r\n"); + while (1) { + usbh_bulk_urb_fill(&g_bluetooth_class.bulkin_urb, g_bluetooth_class.hport, g_bluetooth_class.bulkin, &g_bluetooth_rx_buf[1 + actual_len], ep_mps, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&g_bluetooth_class.bulkin_urb); + if (ret < 0) { + if (ret == -USB_ERR_SHUTDOWN) { + goto delete; + } else { + retry++; + if (retry == 3) { + retry = 0; + goto delete; + } + continue; + } + } + actual_len += g_bluetooth_class.bulkin_urb.actual_length; + if (g_bluetooth_class.bulkin_urb.actual_length != ep_mps) { + g_bluetooth_rx_buf[0] = USB_BLUETOOTH_HCI_ACL; + usbh_bluetooth_hci_dump(g_bluetooth_rx_buf, actual_len + 1); + usbh_bluetooth_hci_read_callback(g_bluetooth_rx_buf, actual_len + 1); + actual_len = 0; + } else { + /* read continue util read short packet */ + } + } + // clang-format off +delete : + USB_LOG_INFO("Delete hc acl rx thread\r\n"); + usb_osal_thread_delete(NULL); + // clang-format on +} +#endif + +__WEAK void usbh_bluetooth_hci_read_callback(uint8_t *data, uint32_t len) +{ + (void)data; + (void)len; +} + +__WEAK void usbh_bluetooth_run(struct usbh_bluetooth *bluetooth_class) +{ + (void)bluetooth_class; +} + +__WEAK void usbh_bluetooth_stop(struct usbh_bluetooth *bluetooth_class) +{ + (void)bluetooth_class; +} + +static const struct usbh_class_driver bluetooth_class_driver = { + .driver_name = "bluetooth", + .connect = usbh_bluetooth_connect, + .disconnect = usbh_bluetooth_disconnect +}; + +#ifdef CONFIG_USBHOST_BLUETOOTH_HCI_H4 +static const uint16_t bluetooth_id_table[][2] = { + { 0x2fe3, 0x000c }, + { 0, 0 }, +}; + +CLASS_INFO_DEFINE const struct usbh_class_info bluetooth_h4_nrf_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = bluetooth_id_table, + .class_driver = &bluetooth_class_driver +}; +#else +CLASS_INFO_DEFINE const struct usbh_class_info bluetooth_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_WIRELESS, + .bInterfaceSubClass = 0x01, + .bInterfaceProtocol = 0x01, + .id_table = NULL, + .class_driver = &bluetooth_class_driver +}; +#endif diff --git a/src/lib/CherryUSB/class/wireless/usbh_bluetooth.h b/src/lib/CherryUSB/class/wireless/usbh_bluetooth.h new file mode 100644 index 000000000..87eb02acb --- /dev/null +++ b/src/lib/CherryUSB/class/wireless/usbh_bluetooth.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_BLUETOOTH_H +#define USBH_BLUETOOTH_H + +#define USB_BLUETOOTH_HCI_NONE 0x00 +#define USB_BLUETOOTH_HCI_CMD 0x01 +#define USB_BLUETOOTH_HCI_ACL 0x02 +#define USB_BLUETOOTH_HCI_SCO 0x03 +#define USB_BLUETOOTH_HCI_EVT 0x04 +#define USB_BLUETOOTH_HCI_ISO 0x05 + +struct usbh_bluetooth { + struct usbh_hubport *hport; + uint8_t intf; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usbh_urb bulkin_urb; /* Bulk IN urb */ + struct usbh_urb bulkout_urb; /* Bulk OUT urb */ +#ifndef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + struct usb_endpoint_descriptor *intin; /* INTR endpoint */ + struct usb_endpoint_descriptor *isoin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *isoout; /* Bulk OUT endpoint */ + struct usbh_urb intin_urb; /* INTR IN urb */ + struct usbh_urb *isoin_urb; /* Bulk IN urb */ + struct usbh_urb *isoout_urb; /* Bulk OUT urb */ + uint8_t num_of_intf_altsettings; +#endif + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_bluetooth_hci_write(uint8_t hci_type, uint8_t *buffer, uint32_t buflen); +void usbh_bluetooth_hci_read_callback(uint8_t *data, uint32_t len); +#ifdef CONFIG_USBHOST_BLUETOOTH_HCI_H4 +void usbh_bluetooth_hci_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); +#else +void usbh_bluetooth_hci_evt_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); +void usbh_bluetooth_hci_acl_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); +#endif + +void usbh_bluetooth_run(struct usbh_bluetooth *bluetooth_class); +void usbh_bluetooth_stop(struct usbh_bluetooth *bluetooth_class); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_BLUETOOTH_H */ diff --git a/src/lib/CherryUSB/class/wireless/usbh_rndis.c b/src/lib/CherryUSB/class/wireless/usbh_rndis.c new file mode 100644 index 000000000..b39cb4702 --- /dev/null +++ b/src/lib/CherryUSB/class/wireless/usbh_rndis.c @@ -0,0 +1,613 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_rndis.h" +#include "rndis_protocol.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_rndis" +#include "usb_log.h" + +#define DEV_FORMAT "/dev/rndis" + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_buf[512]; + +#define CONFIG_USBHOST_RNDIS_ETH_MAX_FRAME_SIZE 1514 +#define CONFIG_USBHOST_RNDIS_ETH_MSG_SIZE (CONFIG_USBHOST_RNDIS_ETH_MAX_FRAME_SIZE + 44) + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_rx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_tx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +// static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_inttx_buffer[USB_ALIGN_UP(16, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_rndis g_rndis_class; + +static int usbh_rndis_get_notification(struct usbh_rndis *rndis_class) +{ + (void)rndis_class; + // int ret; + // struct usbh_urb *urb = &rndis_class->intin_urb; + + // usbh_int_urb_fill(urb, rndis_class->hport, rndis_class->intin, g_rndis_inttx_buffer, rndis_class->intin->wMaxPacketSize, USB_OSAL_WAITING_FOREVER, NULL, NULL); + // ret = usbh_submit_urb(urb); + // if (ret == 0) { + // ret = urb->actual_length; + // } + // return ret; + return 0; +} + +static int usbh_rndis_init_msg_transfer(struct usbh_rndis *rndis_class) +{ + struct usb_setup_packet *setup; + int ret = 0; + rndis_initialize_msg_t *cmd; + rndis_initialize_cmplt_t *resp; + + if (!rndis_class || !rndis_class->hport) { + return -USB_ERR_INVAL; + } + setup = rndis_class->hport->setup; + + cmd = (rndis_initialize_msg_t *)g_rndis_buf; + + cmd->MessageType = REMOTE_NDIS_INITIALIZE_MSG; + cmd->MessageLength = sizeof(rndis_initialize_msg_t); + cmd->RequestId = rndis_class->request_id++; + cmd->MajorVersion = 1; + cmd->MinorVersion = 0; + cmd->MaxTransferSize = 0x4000; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SEND_ENCAPSULATED_COMMAND; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = sizeof(rndis_initialize_msg_t); + + ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)cmd); + if (ret < 0) { + USB_LOG_ERR("init send error, ret: %d\r\n", ret); + return ret; + } + + usbh_rndis_get_notification(rndis_class); + + resp = (rndis_initialize_cmplt_t *)g_rndis_buf; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = sizeof(g_rndis_buf); + + ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)resp); + if (ret < 0) { + USB_LOG_ERR("init recv error, ret: %d\r\n", ret); + return ret; + } + + rndis_class->max_transfer_pkts = resp->MaxPacketsPerTransfer; + rndis_class->max_transfer_size = resp->MaxTransferSize; + USB_LOG_INFO("MaxPacketsPerTransfer: %u\r\n", (unsigned int)resp->MaxPacketsPerTransfer); + USB_LOG_INFO("MaxTransferSize: %u\r\n", (unsigned int)resp->MaxTransferSize); + + return ret; +} + +int usbh_rndis_query_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid, uint32_t query_len, uint8_t *info, uint32_t *info_len) +{ + struct usb_setup_packet *setup; + int ret = 0; + rndis_query_msg_t *cmd; + rndis_query_cmplt_t *resp; + + if (!rndis_class || !rndis_class->hport) { + return -USB_ERR_INVAL; + } + setup = rndis_class->hport->setup; + + cmd = (rndis_query_msg_t *)g_rndis_buf; + + cmd->MessageType = REMOTE_NDIS_QUERY_MSG; + cmd->MessageLength = query_len + sizeof(rndis_query_msg_t); + cmd->RequestId = rndis_class->request_id++; + cmd->Oid = oid; + cmd->InformationBufferLength = query_len; + cmd->InformationBufferOffset = 20; + cmd->DeviceVcHandle = 0; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SEND_ENCAPSULATED_COMMAND; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = query_len + sizeof(rndis_query_msg_t); + + ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)cmd); + if (ret < 0) { + USB_LOG_ERR("oid:%08x send error, ret: %d\r\n", (unsigned int)oid, ret); + return ret; + } + + usbh_rndis_get_notification(rndis_class); + + resp = (rndis_query_cmplt_t *)g_rndis_buf; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = sizeof(g_rndis_buf); + + ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)resp); + if (ret < 0) { + USB_LOG_ERR("oid:%08x recv error, ret: %d\r\n", (unsigned int)oid, ret); + return ret; + } + + memcpy(info, ((uint8_t *)resp + sizeof(rndis_query_cmplt_t)), resp->InformationBufferLength); + *info_len = resp->InformationBufferLength; + + return ret; +} + +static int usbh_rndis_set_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid, uint8_t *info, uint32_t info_len) +{ + struct usb_setup_packet *setup; + int ret = 0; + rndis_set_msg_t *cmd; + rndis_set_cmplt_t *resp; + + if (!rndis_class || !rndis_class->hport) { + return -USB_ERR_INVAL; + } + setup = rndis_class->hport->setup; + + cmd = (rndis_set_msg_t *)g_rndis_buf; + + cmd->MessageType = REMOTE_NDIS_SET_MSG; + cmd->MessageLength = info_len + sizeof(rndis_set_msg_t); + cmd->RequestId = rndis_class->request_id++; + cmd->Oid = oid; + cmd->InformationBufferLength = info_len; + cmd->InformationBufferOffset = 20; + cmd->DeviceVcHandle = 0; + + memcpy(((uint8_t *)cmd + sizeof(rndis_set_msg_t)), info, info_len); + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SEND_ENCAPSULATED_COMMAND; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = info_len + sizeof(rndis_set_msg_t); + + ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)cmd); + if (ret < 0) { + USB_LOG_ERR("oid:%08x send error, ret: %d\r\n", (unsigned int)oid, ret); + return ret; + } + + usbh_rndis_get_notification(rndis_class); + + resp = (rndis_set_cmplt_t *)g_rndis_buf; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = sizeof(g_rndis_buf); + + ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)resp); + if (ret < 0) { + USB_LOG_ERR("oid:%08x recv error, ret: %d\r\n", (unsigned int)oid, ret); + return ret; + } + + return ret; +} + +int usbh_rndis_get_connect_status(struct usbh_rndis *rndis_class) +{ + int ret; + uint8_t data[32]; + uint32_t data_len; + + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_MEDIA_CONNECT_STATUS, 4, data, &data_len); + if (ret < 0) { + return ret; + } + if (NDIS_MEDIA_STATE_CONNECTED == data[0]) { + rndis_class->connect_status = true; + } else { + rndis_class->connect_status = false; + } + return 0; +} + +int usbh_rndis_keepalive(struct usbh_rndis *rndis_class) +{ + struct usb_setup_packet *setup; + int ret = 0; + rndis_keepalive_msg_t *cmd; + rndis_keepalive_cmplt_t *resp; + + if (!rndis_class || !rndis_class->hport) { + return -USB_ERR_INVAL; + } + setup = rndis_class->hport->setup; + + cmd = (rndis_keepalive_msg_t *)g_rndis_buf; + + cmd->MessageType = REMOTE_NDIS_KEEPALIVE_MSG; + cmd->MessageLength = sizeof(rndis_keepalive_msg_t); + cmd->RequestId = rndis_class->request_id++; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SEND_ENCAPSULATED_COMMAND; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = sizeof(rndis_keepalive_msg_t); + + ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)cmd); + if (ret < 0) { + USB_LOG_ERR("keepalive send error, ret: %d\r\n", ret); + return ret; + } + + usbh_rndis_get_notification(rndis_class); + + resp = (rndis_keepalive_cmplt_t *)g_rndis_buf; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = sizeof(g_rndis_buf); + + ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)resp); + if (ret < 0) { + USB_LOG_ERR("keepalive recv error, ret: %d\r\n", ret); + return ret; + } + + return ret; +} + +static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret; + uint32_t *oid_support_list; + uint32_t oid = 0; + uint32_t oid_num = 0; + uint32_t data_len; + uint8_t tmp_buffer[512]; + uint8_t data[32]; + + struct usbh_rndis *rndis_class = &g_rndis_class; + + memset(rndis_class, 0, sizeof(struct usbh_rndis)); + + rndis_class->hport = hport; + rndis_class->ctrl_intf = intf; + rndis_class->data_intf = intf + 1; + + hport->config.intf[intf].priv = rndis_class; + hport->config.intf[intf + 1].priv = NULL; + + // ep_desc = &hport->config.intf[intf].altsetting[0].ep[0].ep_desc; + // USBH_EP_INIT(rndis_class->intin, ep_desc); + + for (uint8_t i = 0; i < hport->config.intf[intf + 1].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf + 1].altsetting[0].ep[i].ep_desc; + + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(rndis_class->bulkin, ep_desc); + } else { + USBH_EP_INIT(rndis_class->bulkout, ep_desc); + } + } + + ret = usbh_rndis_init_msg_transfer(rndis_class); + if (ret < 0) { + return ret; + } + + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_SUPPORTED_LIST, 0, tmp_buffer, &data_len); + if (ret < 0) { + return ret; + } + oid_num = (data_len / 4); + USB_LOG_INFO("rndis query OID_GEN_SUPPORTED_LIST success,oid num: %u\r\n", (unsigned int)oid_num); + + oid_support_list = (uint32_t *)tmp_buffer; + + for (uint8_t i = 0; i < oid_num; i++) { + oid = oid_support_list[i]; + switch (oid) { + case OID_GEN_PHYSICAL_MEDIUM: + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_PHYSICAL_MEDIUM, 4, data, &data_len); + if (ret < 0) { + goto query_errorout; + } + break; + case OID_GEN_MAXIMUM_FRAME_SIZE: + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_MAXIMUM_FRAME_SIZE, 4, data, &data_len); + if (ret < 0) { + goto query_errorout; + } + break; + case OID_GEN_LINK_SPEED: + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_LINK_SPEED, 4, data, &data_len); + if (ret < 0) { + goto query_errorout; + } + + memcpy(&rndis_class->link_speed, data, 4); + break; + case OID_GEN_MEDIA_CONNECT_STATUS: + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_MEDIA_CONNECT_STATUS, 4, data, &data_len); + if (ret < 0) { + goto query_errorout; + } + if (NDIS_MEDIA_STATE_CONNECTED == data[0]) { + rndis_class->connect_status = true; + } else { + rndis_class->connect_status = false; + } + break; + case OID_802_3_MAXIMUM_LIST_SIZE: + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_802_3_MAXIMUM_LIST_SIZE, 4, data, &data_len); + if (ret < 0) { + goto query_errorout; + } + break; + case OID_802_3_CURRENT_ADDRESS: + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_802_3_CURRENT_ADDRESS, 6, data, &data_len); + if (ret < 0) { + goto query_errorout; + } + + for (uint8_t j = 0; j < 6; j++) { + rndis_class->mac[j] = data[j]; + } + break; + case OID_802_3_PERMANENT_ADDRESS: + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_802_3_PERMANENT_ADDRESS, 6, data, &data_len); + if (ret < 0) { + goto query_errorout; + } + break; + default: + break; + } + } + + uint32_t packet_filter = 0x0f; + ret = usbh_rndis_set_msg_transfer(rndis_class, OID_GEN_CURRENT_PACKET_FILTER, (uint8_t *)&packet_filter, 4); + if (ret < 0) { + return ret; + } + + uint8_t multicast_list[6] = { 0x01, 0x00, 0x5E, 0x00, 0x00, 0x01 }; + ret = usbh_rndis_set_msg_transfer(rndis_class, OID_802_3_MULTICAST_LIST, multicast_list, 6); + if (ret < 0) { + return ret; + } + + USB_LOG_INFO("rndis MAC address %02x:%02x:%02x:%02x:%02x:%02x\r\n", + rndis_class->mac[0], + rndis_class->mac[1], + rndis_class->mac[2], + rndis_class->mac[3], + rndis_class->mac[4], + rndis_class->mac[5]); + + strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN); + + USB_LOG_INFO("Register RNDIS Class:%s\r\n", hport->config.intf[intf].devname); + usbh_rndis_run(rndis_class); + return ret; +query_errorout: + USB_LOG_ERR("rndis query iod:%08x error\r\n", (unsigned int)oid); + return ret; +} + +static int usbh_rndis_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + int ret = 0; + + struct usbh_rndis *rndis_class = (struct usbh_rndis *)hport->config.intf[intf].priv; + + if (rndis_class) { + if (rndis_class->bulkin) { + usbh_kill_urb(&rndis_class->bulkin_urb); + } + + if (rndis_class->bulkout) { + usbh_kill_urb(&rndis_class->bulkout_urb); + } + + // if (rndis_class->intin) { + // usbh_kill_urb(&rndis_class->intin_urb); + // } + + if (hport->config.intf[intf].devname[0] != '\0') { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister RNDIS Class:%s\r\n", hport->config.intf[intf].devname); + usbh_rndis_stop(rndis_class); + } + + memset(rndis_class, 0, sizeof(struct usbh_rndis)); + } + + return ret; +} + +void usbh_rndis_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + uint32_t g_rndis_rx_length; + int ret; + uint32_t pmg_offset; + rndis_data_packet_t *pmsg; + rndis_data_packet_t temp; +#if CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE <= (16 * 1024) + uint32_t transfer_size = CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE; +#else + uint32_t transfer_size = (16 * 1024); +#endif + + (void)CONFIG_USB_OSAL_THREAD_GET_ARGV; + + USB_LOG_INFO("Create rndis rx thread\r\n"); + // clang-format off +find_class: + // clang-format on + g_rndis_class.connect_status = false; + if (usbh_find_class_instance("/dev/rndis") == NULL) { + goto delete; + } + + while (g_rndis_class.connect_status == false) { + ret = usbh_rndis_get_connect_status(&g_rndis_class); + if (ret < 0) { + usb_osal_msleep(100); + goto find_class; + } + usb_osal_msleep(128); + } + + g_rndis_rx_length = 0; + while (1) { + usbh_bulk_urb_fill(&g_rndis_class.bulkin_urb, g_rndis_class.hport, g_rndis_class.bulkin, &g_rndis_rx_buffer[g_rndis_rx_length], transfer_size, USB_OSAL_WAITING_FOREVER, NULL, NULL); + ret = usbh_submit_urb(&g_rndis_class.bulkin_urb); + if (ret < 0) { + break; + } + + g_rndis_rx_length += g_rndis_class.bulkin_urb.actual_length; + + /* A transfer is complete because last packet is a short packet. + * Short packet is not zero, match g_rndis_rx_length % USB_GET_MAXPACKETSIZE(g_rndis_class.bulkin->wMaxPacketSize). + * Short packet cannot be zero. + */ + if (g_rndis_rx_length % USB_GET_MAXPACKETSIZE(g_rndis_class.bulkin->wMaxPacketSize)) { + pmg_offset = 0; + + uint32_t total_len = g_rndis_rx_length; + + while (g_rndis_rx_length > 0) { + USB_LOG_DBG("rxlen:%u\r\n", (unsigned int)g_rndis_rx_length); + + pmsg = (rndis_data_packet_t *)(g_rndis_rx_buffer + pmg_offset); + + /* Not word-aligned case */ + if (pmg_offset & 0x3) { + usb_memcpy(&temp, pmsg, sizeof(rndis_data_packet_t)); + pmsg = &temp; + } + + if (pmsg->MessageType == REMOTE_NDIS_PACKET_MSG) { + uint8_t *buf = (uint8_t *)(g_rndis_rx_buffer + pmg_offset + sizeof(rndis_generic_msg_t) + pmsg->DataOffset); + + usbh_rndis_eth_input(buf, pmsg->DataLength); + pmg_offset += pmsg->MessageLength; + g_rndis_rx_length -= pmsg->MessageLength; + + /* drop the last dummy byte, it is a short packet to tell us we have received a multiple of wMaxPacketSize */ + if (g_rndis_rx_length < 4) { + g_rndis_rx_length = 0; + } + } else { + USB_LOG_ERR("offset:%u,remain:%u,total:%u\r\n", (unsigned int)pmg_offset, (unsigned int)g_rndis_rx_length, (unsigned int)total_len); + g_rndis_rx_length = 0; + USB_LOG_ERR("Error rndis packet message\r\n"); + } + } + } else { +#if CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE <= (16 * 1024) + if (g_rndis_rx_length == CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE) { +#else + if ((g_rndis_rx_length + (16 * 1024)) > CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE) { +#endif + USB_LOG_ERR("Rx packet is overflow, please reduce tcp window size or increase CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE\r\n"); + while (1) { + } + } + } + } + + // clang-format off +delete: + USB_LOG_INFO("Delete rndis rx thread\r\n"); + usb_osal_thread_delete(NULL); + // clang-format on +} + +uint8_t *usbh_rndis_get_eth_txbuf(void) +{ + return (g_rndis_tx_buffer + sizeof(rndis_data_packet_t)); +} + +int usbh_rndis_eth_output(uint32_t buflen) +{ + rndis_data_packet_t *hdr; + uint32_t len; + + if (g_rndis_class.connect_status == false) { + return -USB_ERR_NOTCONN; + } + + hdr = (rndis_data_packet_t *)g_rndis_tx_buffer; + memset(hdr, 0, sizeof(rndis_data_packet_t)); + + hdr->MessageType = REMOTE_NDIS_PACKET_MSG; + hdr->MessageLength = sizeof(rndis_data_packet_t) + buflen; + hdr->DataOffset = sizeof(rndis_data_packet_t) - sizeof(rndis_generic_msg_t); + hdr->DataLength = buflen; + + len = hdr->MessageLength; + /* if message length is the multiple of wMaxPacketSize, we should add a short packet to tell device transfer is over. */ + if (!(len % g_rndis_class.bulkout->wMaxPacketSize)) { + len += 1; + } + + USB_LOG_DBG("txlen:%d\r\n", len); + + usbh_bulk_urb_fill(&g_rndis_class.bulkout_urb, g_rndis_class.hport, g_rndis_class.bulkout, g_rndis_tx_buffer, len, USB_OSAL_WAITING_FOREVER, NULL, NULL); + return usbh_submit_urb(&g_rndis_class.bulkout_urb); +} + +__WEAK void usbh_rndis_run(struct usbh_rndis *rndis_class) +{ + (void)rndis_class; +} + +__WEAK void usbh_rndis_stop(struct usbh_rndis *rndis_class) +{ + (void)rndis_class; +} + +static const struct usbh_class_driver rndis_class_driver = { + .driver_name = "rndis", + .connect = usbh_rndis_connect, + .disconnect = usbh_rndis_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info rndis_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_WIRELESS, + .bInterfaceSubClass = 0x01, + .bInterfaceProtocol = 0x03, + .id_table = NULL, + .class_driver = &rndis_class_driver +}; + +CLASS_INFO_DEFINE const struct usbh_class_info rndis_cdcacm_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_CDC, + .bInterfaceSubClass = CDC_ABSTRACT_CONTROL_MODEL, + .bInterfaceProtocol = 0xff, + .id_table = NULL, + .class_driver = &rndis_class_driver +}; diff --git a/src/lib/CherryUSB/class/wireless/usbh_rndis.h b/src/lib/CherryUSB/class/wireless/usbh_rndis.h new file mode 100644 index 000000000..505a07aeb --- /dev/null +++ b/src/lib/CherryUSB/class/wireless/usbh_rndis.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_RNDIS_H +#define USBH_RNDIS_H + +#include "usb_cdc.h" + +struct usbh_rndis { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usb_endpoint_descriptor *intin; /* INTR endpoint */ + struct usbh_urb bulkin_urb; /* Bulk IN urb */ + struct usbh_urb bulkout_urb; /* Bulk OUT urb */ + struct usbh_urb intin_urb; /* INTR IN urb */ + + uint8_t ctrl_intf; /* Control interface number */ + uint8_t data_intf; /* Data interface number */ + uint8_t minor; + + uint32_t request_id; + uint32_t tx_offset; + uint32_t max_transfer_pkts; /* max packets in one transfer */ + uint32_t max_transfer_size; /* max size in one transfer */ + + uint32_t link_speed; + bool connect_status; + uint8_t mac[6]; + + void *user_data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +int usbh_rndis_get_connect_status(struct usbh_rndis *rndis_class); +int usbh_rndis_keepalive(struct usbh_rndis *rndis_class); + +void usbh_rndis_run(struct usbh_rndis *rndis_class); +void usbh_rndis_stop(struct usbh_rndis *rndis_class); + +uint8_t *usbh_rndis_get_eth_txbuf(void); +int usbh_rndis_eth_output(uint32_t buflen); +void usbh_rndis_eth_input(uint8_t *buf, uint32_t buflen); +void usbh_rndis_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_RNDIS_H */ diff --git a/src/lib/CherryUSB/common/usb_dc.h b/src/lib/CherryUSB/common/usb_dc.h new file mode 100644 index 000000000..42a332e77 --- /dev/null +++ b/src/lib/CherryUSB/common/usb_dc.h @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_DC_H +#define USB_DC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief init device controller registers. + * @return On success will return 0, and others indicate fail. + */ +int usb_dc_init(uint8_t busid); + +/** + * @brief deinit device controller registers. + * @return On success will return 0, and others indicate fail. + */ +int usb_dc_deinit(uint8_t busid); + +/** + * @brief Set USB device address + * + * @param[in] addr Device address + * + * @return On success will return 0, and others indicate fail. + */ +int usbd_set_address(uint8_t busid, const uint8_t addr); + +/** + * @brief Set remote wakeup feature + * + * @return On success will return 0, and others indicate fail. + */ +int usbd_set_remote_wakeup(uint8_t busid); + +/** + * @brief Get USB device speed + * + * @param[in] busid bus index + * + * @return port speed, USB_SPEED_LOW or USB_SPEED_FULL or USB_SPEED_HIGH + */ +uint8_t usbd_get_port_speed(uint8_t busid); + +/** + * @brief configure and enable endpoint. + * + * @param [in] ep_cfg Endpoint config. + * + * @return On success will return 0, and others indicate fail. + */ +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep); + +/** + * @brief Disable the selected endpoint + * + * @param[in] ep Endpoint address + * + * @return On success will return 0, and others indicate fail. + */ +int usbd_ep_close(uint8_t busid, const uint8_t ep); + +/** + * @brief Set stall condition for the selected endpoint + * + * @param[in] ep Endpoint address + * + * + * @return On success will return 0, and others indicate fail. + */ +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep); + +/** + * @brief Clear stall condition for the selected endpoint + * + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * + * @return On success will return 0, and others indicate fail. + */ +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep); + +/** + * @brief Check if the selected endpoint is stalled + * + * @param[in] ep Endpoint address + * + * @param[out] stalled Endpoint stall status + * + * @return On success will return 0, and others indicate fail. + */ +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled); + +/** + * @brief Setup in ep transfer setting and start transfer. + * + * This function is asynchronous. + * This function is similar to uart with tx dma. + * + * This function is called to write data to the specified endpoint. The + * supplied usbd_endpoint_callback function will be called when data is transmitted + * out. + * + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] data Pointer to data to write + * @param[in] data_len Length of the data requested to write. This may + * be zero for a zero length status packet. + * @return 0 on success, negative errno code on fail. + */ +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len); + +/** + * @brief Setup out ep transfer setting and start transfer. + * + * This function is asynchronous. + * This function is similar to uart with rx dma. + * + * This function is called to read data to the specified endpoint. The + * supplied usbd_endpoint_callback function will be called when data is received + * in. + * + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] data Pointer to data to read + * @param[in] data_len Max length of the data requested to read. + * + * @return 0 on success, negative errno code on fail. + */ +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len); + +/* usb dcd irq callback, called by user */ + +/** + * @brief Usb sof irq callback. + */ +void usbd_event_sof_handler(uint8_t busid); + +/** + * @brief Usb connect irq callback. + */ +void usbd_event_connect_handler(uint8_t busid); + +/** + * @brief Usb disconnect irq callback. + */ +void usbd_event_disconnect_handler(uint8_t busid); + +/** + * @brief Usb resume irq callback. + */ +void usbd_event_resume_handler(uint8_t busid); + +/** + * @brief Usb suspend irq callback. + */ +void usbd_event_suspend_handler(uint8_t busid); + +/** + * @brief Usb reset irq callback. + */ +void usbd_event_reset_handler(uint8_t busid); + +/** + * @brief Usb setup packet recv irq callback. + * @param[in] psetup setup packet. + */ +void usbd_event_ep0_setup_complete_handler(uint8_t busid, uint8_t *psetup); + +/** + * @brief In ep transfer complete irq callback. + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] nbytes How many nbytes have transferred. + */ +void usbd_event_ep_in_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbytes); + +/** + * @brief Out ep transfer complete irq callback. + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] nbytes How many nbytes have transferred. + */ +void usbd_event_ep_out_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbytes); + +#ifdef CONFIG_USBDEV_TEST_MODE +/** + * @brief Usb execute test mode + * @param[in] busid device busid + * @param[in] test_mode usb test mode + */ +void usbd_execute_test_mode(uint8_t busid, uint8_t test_mode); +#endif + +/* called by user */ +void USBD_IRQHandler(uint8_t busid); + +#ifdef __cplusplus +} +#endif + +#endif /* USB_DC_H */ diff --git a/src/lib/CherryUSB/common/usb_dcache.h b/src/lib/CherryUSB/common/usb_dcache.h new file mode 100644 index 000000000..f53efd919 --- /dev/null +++ b/src/lib/CherryUSB/common/usb_dcache.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_DCACHE_H +#define USB_DCACHE_H + +#ifdef CONFIG_USB_DCACHE_ENABLE +#if CONFIG_USB_ALIGN_SIZE % 32 +#error "CONFIG_USB_ALIGN_SIZE must be multiple of 32" +#endif +void usb_dcache_clean(uintptr_t addr, size_t size); +void usb_dcache_invalidate(uintptr_t addr, size_t size); +void usb_dcache_flush(uintptr_t addr, size_t size); +#else +#define usb_dcache_clean(addr, size) +#define usb_dcache_invalidate(addr, size) +#define usb_dcache_flush(addr, size) +#endif + +#endif /* USB_DCACHE_H */ diff --git a/src/lib/CherryUSB/common/usb_def.h b/src/lib/CherryUSB/common/usb_def.h new file mode 100644 index 000000000..ef704b917 --- /dev/null +++ b/src/lib/CherryUSB/common/usb_def.h @@ -0,0 +1,843 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_DEF_H +#define USB_DEF_H + +/* Useful define */ +#define USB_1_1 0x0110 +#define USB_2_0 0x0200 +/* Set USB version to 2.1 so that the host will request the BOS descriptor */ +#define USB_2_1 0x0210 +#define USB_3_0 0x0300 +#define USB_3_1 0x0310 +#define USB_3_2 0x0320 + +/* Device speeds */ +#define USB_SPEED_UNKNOWN 0 /* Transfer rate not yet set */ +#define USB_SPEED_LOW 1 /* USB 1.1 */ +#define USB_SPEED_FULL 2 /* USB 1.1 */ +#define USB_SPEED_HIGH 3 /* USB 2.0 */ +#define USB_SPEED_WIRELESS 4 /* Wireless USB 2.5 */ +#define USB_SPEED_SUPER 5 /* USB 3.0 */ +#define USB_SPEED_SUPER_PLUS 6 /* USB 3.1 */ + +/* Maximum number of devices per controller */ +#define USB_MAX_DEVICES (127) + +/* Default USB control EP, always 0 and 0x80 */ +#define USB_CONTROL_OUT_EP0 0 +#define USB_CONTROL_IN_EP0 0x80 + +/**< maximum packet size (MPS) for EP 0 */ +#define USB_CTRL_EP_MPS 64 + +/**< maximum packet size (MPS) for bulk EP */ +#define USB_BULK_EP_MPS_HS 512 +#define USB_BULK_EP_MPS_FS 64 + +/* USB PID Types */ +#define USB_PID_OUT (0x01) /* Tokens */ +#define USB_PID_IN (0x09) +#define USB_PID_SOF (0x05) +#define USB_PID_SETUP (0x0d) + +#define USB_PID_DATA0 (0x03) /* Data */ +#define USB_PID_DATA1 (0x0b) +#define USB_PID_DATA2 (0x07) +#define USB_PID_MDATA (0x0f) + +#define USB_PID_ACK (0x02) /* Handshake */ +#define USB_PID_NAK (0x0a) +#define USB_PID_STALL (0x0e) +#define USB_PID_NYET (0x06) + +#define USB_PID_PRE (0x0c) /* Special */ +#define USB_PID_ERR (0x0c) +#define USB_PID_SPLIT (0x08) +#define USB_PID_PING (0x04) +#define USB_PID_RESERVED (0x00) + +#define USB_REQUEST_DIR_SHIFT 7U /* Bits 7: Request dir */ +#define USB_REQUEST_DIR_OUT (0U << USB_REQUEST_DIR_SHIFT) /* Bit 7=0: Host-to-device */ +#define USB_REQUEST_DIR_IN (1U << USB_REQUEST_DIR_SHIFT) /* Bit 7=1: Device-to-host */ +#define USB_REQUEST_DIR_MASK (1U << USB_REQUEST_DIR_SHIFT) /* Bit 7=1: Direction bit */ + +#define USB_REQUEST_TYPE_SHIFT 5U /* Bits 5:6: Request type */ +#define USB_REQUEST_STANDARD (0U << USB_REQUEST_TYPE_SHIFT) +#define USB_REQUEST_CLASS (1U << USB_REQUEST_TYPE_SHIFT) +#define USB_REQUEST_VENDOR (2U << USB_REQUEST_TYPE_SHIFT) +#define USB_REQUEST_RESERVED (3U << USB_REQUEST_TYPE_SHIFT) +#define USB_REQUEST_TYPE_MASK (3U << USB_REQUEST_TYPE_SHIFT) + +#define USB_REQUEST_RECIPIENT_SHIFT 0U /* Bits 0:4: Recipient */ +#define USB_REQUEST_RECIPIENT_DEVICE (0U << USB_REQUEST_RECIPIENT_SHIFT) +#define USB_REQUEST_RECIPIENT_INTERFACE (1U << USB_REQUEST_RECIPIENT_SHIFT) +#define USB_REQUEST_RECIPIENT_ENDPOINT (2U << USB_REQUEST_RECIPIENT_SHIFT) +#define USB_REQUEST_RECIPIENT_OTHER (3U << USB_REQUEST_RECIPIENT_SHIFT) +#define USB_REQUEST_RECIPIENT_MASK (3U << USB_REQUEST_RECIPIENT_SHIFT) + +/* USB Standard Request Codes */ +#define USB_REQUEST_GET_STATUS 0x00 +#define USB_REQUEST_CLEAR_FEATURE 0x01 +#define USB_REQUEST_SET_FEATURE 0x03 +#define USB_REQUEST_SET_ADDRESS 0x05 +#define USB_REQUEST_GET_DESCRIPTOR 0x06 +#define USB_REQUEST_SET_DESCRIPTOR 0x07 +#define USB_REQUEST_GET_CONFIGURATION 0x08 +#define USB_REQUEST_SET_CONFIGURATION 0x09 +#define USB_REQUEST_GET_INTERFACE 0x0A +#define USB_REQUEST_SET_INTERFACE 0x0B +#define USB_REQUEST_SYNCH_FRAME 0x0C +#define USB_REQUEST_SET_ENCRYPTION 0x0D +#define USB_REQUEST_GET_ENCRYPTION 0x0E +#define USB_REQUEST_RPIPE_ABORT 0x0E +#define USB_REQUEST_SET_HANDSHAKE 0x0F +#define USB_REQUEST_RPIPE_RESET 0x0F +#define USB_REQUEST_GET_HANDSHAKE 0x10 +#define USB_REQUEST_SET_CONNECTION 0x11 +#define USB_REQUEST_SET_SECURITY_DATA 0x12 +#define USB_REQUEST_GET_SECURITY_DATA 0x13 +#define USB_REQUEST_SET_WUSB_DATA 0x14 +#define USB_REQUEST_LOOPBACK_DATA_WRITE 0x15 +#define USB_REQUEST_LOOPBACK_DATA_READ 0x16 +#define USB_REQUEST_SET_INTERFACE_DS 0x17 + +/* USB Standard Feature selectors */ +#define USB_FEATURE_ENDPOINT_HALT 0 +#define USB_FEATURE_SELF_POWERED 0 +#define USB_FEATURE_REMOTE_WAKEUP 1 +#define USB_FEATURE_TEST_MODE 2 +#define USB_FEATURE_BATTERY 2 +#define USB_FEATURE_BHNPENABLE 3 +#define USB_FEATURE_WUSBDEVICE 3 +#define USB_FEATURE_AHNPSUPPORT 4 +#define USB_FEATURE_AALTHNPSUPPORT 5 +#define USB_FEATURE_DEBUGMODE 6 + +/* USB GET_STATUS Bit Values */ +#define USB_GETSTATUS_ENDPOINT_HALT 0x01 +#define USB_GETSTATUS_SELF_POWERED 0x01 +#define USB_GETSTATUS_REMOTE_WAKEUP 0x02 + +/* USB Descriptor Types */ +#define USB_DESCRIPTOR_TYPE_DEVICE 0x01U +#define USB_DESCRIPTOR_TYPE_CONFIGURATION 0x02U +#define USB_DESCRIPTOR_TYPE_STRING 0x03U +#define USB_DESCRIPTOR_TYPE_INTERFACE 0x04U +#define USB_DESCRIPTOR_TYPE_ENDPOINT 0x05U +#define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER 0x06U +#define USB_DESCRIPTOR_TYPE_OTHER_SPEED 0x07U +#define USB_DESCRIPTOR_TYPE_INTERFACE_POWER 0x08U +#define USB_DESCRIPTOR_TYPE_OTG 0x09U +#define USB_DESCRIPTOR_TYPE_DEBUG 0x0AU +#define USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION 0x0BU +#define USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE 0x0FU +#define USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY 0x10U +#define USB_DESCRIPTOR_TYPE_WIRELESS_ENDPOINTCOMP 0x11U + +/* Class Specific Descriptor */ +#define USB_CS_DESCRIPTOR_TYPE_DEVICE 0x21U +#define USB_CS_DESCRIPTOR_TYPE_CONFIGURATION 0x22U +#define USB_CS_DESCRIPTOR_TYPE_STRING 0x23U +#define USB_CS_DESCRIPTOR_TYPE_INTERFACE 0x24U +#define USB_CS_DESCRIPTOR_TYPE_ENDPOINT 0x25U + +#define USB_DESCRIPTOR_TYPE_SUPERSPEED_ENDPOINT_COMPANION 0x30U +#define USB_DESCRIPTOR_TYPE_SUPERSPEED_ISO_ENDPOINT_COMPANION 0x31U + +/* USB Device Classes */ +#define USB_DEVICE_CLASS_RESERVED 0x00 +#define USB_DEVICE_CLASS_AUDIO 0x01 +#define USB_DEVICE_CLASS_CDC 0x02 +#define USB_DEVICE_CLASS_HID 0x03 +#define USB_DEVICE_CLASS_MONITOR 0x04 +#define USB_DEVICE_CLASS_PHYSICAL 0x05 +#define USB_DEVICE_CLASS_IMAGE 0x06 +#define USB_DEVICE_CLASS_PRINTER 0x07 +#define USB_DEVICE_CLASS_MASS_STORAGE 0x08 +#define USB_DEVICE_CLASS_HUB 0x09 +#define USB_DEVICE_CLASS_CDC_DATA 0x0a +#define USB_DEVICE_CLASS_SMART_CARD 0x0b +#define USB_DEVICE_CLASS_SECURITY 0x0d +#define USB_DEVICE_CLASS_VIDEO 0x0e +#define USB_DEVICE_CLASS_HEALTHCARE 0x0f +#define USB_DEVICE_CLASS_DIAG_DEVICE 0xdc +#define USB_DEVICE_CLASS_WIRELESS 0xe0 +#define USB_DEVICE_CLASS_MISC 0xef +#define USB_DEVICE_CLASS_APP_SPECIFIC 0xfe +#define USB_DEVICE_CLASS_VEND_SPECIFIC 0xff + +/* usb string index define */ +#define USB_STRING_LANGID_INDEX 0x00 +#define USB_STRING_MFC_INDEX 0x01 +#define USB_STRING_PRODUCT_INDEX 0x02 +#define USB_STRING_SERIAL_INDEX 0x03 +#define USB_STRING_CONFIG_INDEX 0x04 +#define USB_STRING_INTERFACE_INDEX 0x05 +#define USB_STRING_OS_INDEX 0x06 +#define USB_STRING_MAX USB_STRING_OS_INDEX +/* + * Devices supporting Microsoft OS Descriptors store special string + * descriptor at fixed index (0xEE). It is read when a new device is + * attached to a computer for the first time. + */ +#define USB_OSDESC_STRING_DESC_INDEX 0xEE + +/* bmAttributes in Configuration Descriptor */ +#define USB_CONFIG_REMOTE_WAKEUP 0x20 +#define USB_CONFIG_POWERED_MASK 0x40 +#define USB_CONFIG_BUS_POWERED 0x80 +#define USB_CONFIG_SELF_POWERED 0xC0 + +/* bMaxPower in Configuration Descriptor */ +#define USB_CONFIG_POWER_MA(mA) ((mA) / 2) + +/* bEndpointAddress in Endpoint Descriptor */ +#define USB_ENDPOINT_DIRECTION_MASK 0x80 +#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00) +#define USB_ENDPOINT_IN(addr) ((addr) | 0x80) + +/** + * USB endpoint direction and number. + */ +#define USB_EP_DIR_MASK 0x80U +#define USB_EP_DIR_IN 0x80U +#define USB_EP_DIR_OUT 0x00U + +/** Get endpoint index (number) from endpoint address */ +#define USB_EP_GET_IDX(ep) ((ep) & ~USB_EP_DIR_MASK) +/** Get direction from endpoint address */ +#define USB_EP_GET_DIR(ep) ((ep)&USB_EP_DIR_MASK) +/** Get endpoint address from endpoint index and direction */ +#define USB_EP_GET_ADDR(idx, dir) ((idx) | ((dir)&USB_EP_DIR_MASK)) +/** True if the endpoint is an IN endpoint */ +#define USB_EP_DIR_IS_IN(ep) (USB_EP_GET_DIR(ep) == USB_EP_DIR_IN) +/** True if the endpoint is an OUT endpoint */ +#define USB_EP_DIR_IS_OUT(ep) (USB_EP_GET_DIR(ep) == USB_EP_DIR_OUT) + +/* bmAttributes in Endpoint Descriptor */ +#define USB_ENDPOINT_TYPE_SHIFT 0 +#define USB_ENDPOINT_TYPE_CONTROL (0 << USB_ENDPOINT_TYPE_SHIFT) +#define USB_ENDPOINT_TYPE_ISOCHRONOUS (1 << USB_ENDPOINT_TYPE_SHIFT) +#define USB_ENDPOINT_TYPE_BULK (2 << USB_ENDPOINT_TYPE_SHIFT) +#define USB_ENDPOINT_TYPE_INTERRUPT (3 << USB_ENDPOINT_TYPE_SHIFT) +#define USB_ENDPOINT_TYPE_MASK (3 << USB_ENDPOINT_TYPE_SHIFT) +#define USB_GET_ENDPOINT_TYPE(x) ((x & USB_ENDPOINT_TYPE_MASK) >> USB_ENDPOINT_TYPE_SHIFT) + +#define USB_ENDPOINT_SYNC_SHIFT 2 +#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION (0 << USB_ENDPOINT_SYNC_SHIFT) +#define USB_ENDPOINT_SYNC_ASYNCHRONOUS (1 << USB_ENDPOINT_SYNC_SHIFT) +#define USB_ENDPOINT_SYNC_ADAPTIVE (2 << USB_ENDPOINT_SYNC_SHIFT) +#define USB_ENDPOINT_SYNC_SYNCHRONOUS (3 << USB_ENDPOINT_SYNC_SHIFT) +#define USB_ENDPOINT_SYNC_MASK (3 << USB_ENDPOINT_SYNC_SHIFT) + +#define USB_ENDPOINT_USAGE_SHIFT 4 +#define USB_ENDPOINT_USAGE_DATA (0 << USB_ENDPOINT_USAGE_SHIFT) +#define USB_ENDPOINT_USAGE_FEEDBACK (1 << USB_ENDPOINT_USAGE_SHIFT) +#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK (2 << USB_ENDPOINT_USAGE_SHIFT) +#define USB_ENDPOINT_USAGE_MASK (3 << USB_ENDPOINT_USAGE_SHIFT) + +#define USB_ENDPOINT_MAX_ADJUSTABLE (1 << 7) + +/* wMaxPacketSize in Endpoint Descriptor */ +#define USB_MAXPACKETSIZE_SHIFT 0 +#define USB_MAXPACKETSIZE_MASK (0x7ff << USB_MAXPACKETSIZE_SHIFT) +#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT 11 +#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_NONE (0 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT) +#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_ONE (1 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT) +#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_TWO (2 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT) +#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_MASK (3 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT) +#define USB_GET_MAXPACKETSIZE(x) ((x & USB_MAXPACKETSIZE_MASK) >> USB_MAXPACKETSIZE_SHIFT) +#define USB_GET_MULT(x) ((x & USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_MASK) >> USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT) + +/* bDevCapabilityType in Device Capability Descriptor */ +#define USB_DEVICE_CAPABILITY_WIRELESS_USB 1 +#define USB_DEVICE_CAPABILITY_USB_2_0_EXTENSION 2 +#define USB_DEVICE_CAPABILITY_SUPERSPEED_USB 3 +#define USB_DEVICE_CAPABILITY_CONTAINER_ID 4 +#define USB_DEVICE_CAPABILITY_PLATFORM 5 +#define USB_DEVICE_CAPABILITY_POWER_DELIVERY_CAPABILITY 6 +#define USB_DEVICE_CAPABILITY_BATTERY_INFO_CAPABILITY 7 +#define USB_DEVICE_CAPABILITY_PD_CONSUMER_PORT_CAPABILITY 8 +#define USB_DEVICE_CAPABILITY_PD_PROVIDER_PORT_CAPABILITY 9 +#define USB_DEVICE_CAPABILITY_SUPERSPEED_PLUS 10 +#define USB_DEVICE_CAPABILITY_PRECISION_TIME_MEASUREMENT 11 +#define USB_DEVICE_CAPABILITY_WIRELESS_USB_EXT 12 + +#define USB_BOS_CAPABILITY_EXTENSION 0x02 +#define USB_BOS_CAPABILITY_PLATFORM 0x05 + +/* OTG SET FEATURE Constants */ +#define USB_OTG_FEATURE_B_HNP_ENABLE 3 /* Enable B device to perform HNP */ +#define USB_OTG_FEATURE_A_HNP_SUPPORT 4 /* A device supports HNP */ +#define USB_OTG_FEATURE_A_ALT_HNP_SUPPORT 5 /* Another port on the A device supports HNP */ + +/* WinUSB Microsoft OS 2.0 descriptor request codes */ +#define WINUSB_REQUEST_GET_DESCRIPTOR_SET 0x07 +#define WINUSB_REQUEST_SET_ALT_ENUM 0x08 + +/* WinUSB Microsoft OS 2.0 descriptor sizes */ +#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10 +#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8 +#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20 + +/* WinUSB Microsoft OS 2.0 Descriptor Types */ +#define WINUSB_SET_HEADER_DESCRIPTOR_TYPE 0x00 +#define WINUSB_SUBSET_HEADER_CONFIGURATION_TYPE 0x01 +#define WINUSB_SUBSET_HEADER_FUNCTION_TYPE 0x02 +#define WINUSB_FEATURE_COMPATIBLE_ID_TYPE 0x03 +#define WINUSB_FEATURE_REG_PROPERTY_TYPE 0x04 +#define WINUSB_FEATURE_MIN_RESUME_TIME_TYPE 0x05 +#define WINUSB_FEATURE_MODEL_ID_TYPE 0x06 +#define WINUSB_FEATURE_CCGP_DEVICE_TYPE 0x07 + +#define WINUSB_PROP_DATA_TYPE_REG_SZ 0x01 +#define WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ 0x07 + +/* WebUSB Descriptor Types */ +#define WEBUSB_DESCRIPTOR_SET_HEADER_TYPE 0x00 +#define WEBUSB_CONFIGURATION_SUBSET_HEADER_TYPE 0x01 +#define WEBUSB_FUNCTION_SUBSET_HEADER_TYPE 0x02 +#define WEBUSB_URL_TYPE 0x03 + +/* WebUSB Request Codes */ +#define WEBUSB_REQUEST_GET_URL 0x02 + +/* bScheme in URL descriptor */ +#define WEBUSB_URL_SCHEME_HTTP 0x00 +#define WEBUSB_URL_SCHEME_HTTPS 0x01 + +/* WebUSB Descriptor sizes */ +#define WEBUSB_DESCRIPTOR_SET_HEADER_SIZE 5 +#define WEBUSB_CONFIGURATION_SUBSET_HEADER_SIZE 4 +#define WEBUSB_FUNCTION_SUBSET_HEADER_SIZE 3 + +/* Setup packet definition used to read raw data from USB line */ +struct usb_setup_packet { + /** Request type. Bits 0:4 determine recipient, see + * \ref usb_request_recipient. Bits 5:6 determine type, see + * \ref usb_request_type. Bit 7 determines data transfer direction, see + * \ref usb_endpoint_direction. + */ + uint8_t bmRequestType; + + /** Request. If the type bits of bmRequestType are equal to + * \ref usb_request_type::LIBUSB_REQUEST_TYPE_STANDARD + * "USB_REQUEST_TYPE_STANDARD" then this field refers to + * \ref usb_standard_request. For other cases, use of this field is + * application-specific. */ + uint8_t bRequest; + + /** Value. Varies according to request */ + uint16_t wValue; + + /** Index. Varies according to request, typically used to pass an index + * or offset */ + uint16_t wIndex; + + /** Number of bytes to transfer */ + uint16_t wLength; +} __PACKED; + +#define USB_SIZEOF_SETUP_PACKET 8 + +/** Standard Device Descriptor */ +struct usb_device_descriptor { + uint8_t bLength; /* Descriptor size in bytes = 18 */ + uint8_t bDescriptorType; /* DEVICE descriptor type = 1 */ + uint16_t bcdUSB; /* USB spec in BCD, e.g. 0x0200 */ + uint8_t bDeviceClass; /* Class code, if 0 see interface */ + uint8_t bDeviceSubClass; /* Sub-Class code, 0 if class = 0 */ + uint8_t bDeviceProtocol; /* Protocol, if 0 see interface */ + uint8_t bMaxPacketSize0; /* Endpoint 0 max. size */ + uint16_t idVendor; /* Vendor ID per USB-IF */ + uint16_t idProduct; /* Product ID per manufacturer */ + uint16_t bcdDevice; /* Device release # in BCD */ + uint8_t iManufacturer; /* Index to manufacturer string */ + uint8_t iProduct; /* Index to product string */ + uint8_t iSerialNumber; /* Index to serial number string */ + uint8_t bNumConfigurations; /* Number of possible configurations */ +} __PACKED; + +#define USB_SIZEOF_DEVICE_DESC 18 + +/** Standard Configuration Descriptor */ +struct usb_configuration_descriptor { + uint8_t bLength; /* Descriptor size in bytes = 9 */ + uint8_t bDescriptorType; /* CONFIGURATION type = 2 or 7 */ + uint16_t wTotalLength; /* Length of concatenated descriptors */ + uint8_t bNumInterfaces; /* Number of interfaces, this config. */ + uint8_t bConfigurationValue; /* Value to set this config. */ + uint8_t iConfiguration; /* Index to configuration string */ + uint8_t bmAttributes; /* Config. characteristics */ + uint8_t bMaxPower; /* Max.power from bus, 2mA units */ +} __PACKED; + +#define USB_SIZEOF_CONFIG_DESC 9 + +/** Standard Interface Descriptor */ +struct usb_interface_descriptor { + uint8_t bLength; /* Descriptor size in bytes = 9 */ + uint8_t bDescriptorType; /* INTERFACE descriptor type = 4 */ + uint8_t bInterfaceNumber; /* Interface no.*/ + uint8_t bAlternateSetting; /* Value to select this IF */ + uint8_t bNumEndpoints; /* Number of endpoints excluding 0 */ + uint8_t bInterfaceClass; /* Class code, 0xFF = vendor */ + uint8_t bInterfaceSubClass; /* Sub-Class code, 0 if class = 0 */ + uint8_t bInterfaceProtocol; /* Protocol, 0xFF = vendor */ + uint8_t iInterface; /* Index to interface string */ +} __PACKED; + +#define USB_SIZEOF_INTERFACE_DESC 9 + +/** Standard Endpoint Descriptor */ +struct usb_endpoint_descriptor { + uint8_t bLength; /* Descriptor size in bytes = 7 */ + uint8_t bDescriptorType; /* ENDPOINT descriptor type = 5 */ + uint8_t bEndpointAddress; /* Endpoint # 0 - 15 | IN/OUT */ + uint8_t bmAttributes; /* Transfer type */ + uint16_t wMaxPacketSize; /* Bits 10:0 = max. packet size */ + uint8_t bInterval; /* Polling interval in (micro) frames */ +} __PACKED; + +#define USB_SIZEOF_ENDPOINT_DESC 7 + +/** Unicode (UTF16LE) String Descriptor */ +struct usb_string_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bString; +} __PACKED; + +#define USB_SIZEOF_STRING_LANGID_DESC 4 + +/* USB Interface Association Descriptor */ +struct usb_interface_association_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bFirstInterface; + uint8_t bInterfaceCount; + uint8_t bFunctionClass; + uint8_t bFunctionSubClass; + uint8_t bFunctionProtocol; + uint8_t iFunction; +} __PACKED; + +#define USB_SIZEOF_IAD_DESC 8 + +/** USB device_qualifier descriptor */ +struct usb_device_qualifier_descriptor { + uint8_t bLength; /* Descriptor size in bytes = 10 */ + uint8_t bDescriptorType; /* DEVICE QUALIFIER type = 6 */ + uint16_t bcdUSB; /* USB spec in BCD, e.g. 0x0200 */ + uint8_t bDeviceClass; /* Class code, if 0 see interface */ + uint8_t bDeviceSubClass; /* Sub-Class code, 0 if class = 0 */ + uint8_t bDeviceProtocol; /* Protocol, if 0 see interface */ + uint8_t bMaxPacketSize; /* Endpoint 0 max. size */ + uint8_t bNumConfigurations; /* Number of possible configurations */ + uint8_t bReserved; /* Reserved = 0 */ +} __PACKED; + +#define USB_SIZEOF_DEVICE_QUALIFIER_DESC 10 + +/* Microsoft OS function descriptor. + * This can be used to request a specific driver (such as WINUSB) to be + * loaded on Windows. Unlike other descriptors, it is requested by a special + * request USB_REQ_GETMSFTOSDESCRIPTOR. + * More details: + * https://msdn.microsoft.com/en-us/windows/hardware/gg463179 + * And excellent explanation: + * https://github.com/pbatard/libwdi/wiki/WCID-Devices + * + * The device will have exactly one "Extended Compat ID Feature Descriptor", + * which may contain multiple "Function Descriptors" associated with + * different interfaces. + */ + +/* MS OS 1.0 string descriptor */ +struct usb_msosv1_string_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bString[14]; + uint8_t bMS_VendorCode; /* Vendor Code, used for a control request */ + uint8_t bPad; /* Padding byte for VendorCode look as UTF16 */ +} __PACKED; + +/* MS OS 1.0 Header descriptor */ +struct usb_msosv1_compat_id_header_descriptor { + uint32_t dwLength; + uint16_t bcdVersion; + uint16_t wIndex; + uint8_t bCount; + uint8_t reserved[7]; +} __PACKED; + +/* MS OS 1.0 Function descriptor */ +struct usb_msosv1_comp_id_function_descriptor { + uint8_t bFirstInterfaceNumber; + uint8_t reserved1; + uint8_t compatibleID[8]; + uint8_t subCompatibleID[8]; + uint8_t reserved2[6]; +} __PACKED; + +#define usb_msosv1_comp_id_create(x) \ + struct usb_msosv1_comp_id { \ + struct usb_msosv1_compat_id_header_descriptor compat_id_header; \ + struct usb_msosv1_comp_id_function_descriptor compat_id_function[x]; \ + }; + +struct usb_msosv1_descriptor { + const uint8_t *string; + uint8_t vendor_code; + const uint8_t *compat_id; + const uint8_t **comp_id_property; +}; + +/* MS OS 2.0 Header descriptor */ +struct usb_msosv2_header_descriptor { + uint32_t dwLength; + uint16_t bcdVersion; + uint16_t wIndex; + uint8_t bCount; +} __PACKED; + +/*Microsoft OS 2.0 set header descriptor*/ +struct usb_msosv2_set_header_descriptor { + uint16_t wLength; + uint16_t wDescriptorType; + uint32_t dwWindowsVersion; + uint16_t wDescriptorSetTotalLength; +} __PACKED; + +/* Microsoft OS 2.0 compatibleID descriptor*/ +struct usb_msosv2_comp_id_descriptor { + uint16_t wLength; + uint16_t wDescriptorType; + uint8_t compatibleID[8]; + uint8_t subCompatibleID[8]; +} __PACKED; + +/* MS OS 2.0 property descriptor */ +struct usb_msosv2_property_descriptor { + uint16_t wLength; + uint16_t wDescriptorType; + uint32_t dwPropertyDataType; + uint16_t wPropertyNameLength; + const char *bPropertyName; + uint32_t dwPropertyDataLength; + const char *bPropertyData; +}; + +/* Microsoft OS 2.0 subset function descriptor */ +struct usb_msosv2_subset_function_descriptor { + uint16_t wLength; + uint16_t wDescriptorType; + uint8_t bFirstInterface; + uint8_t bReserved; + uint16_t wSubsetLength; +} __PACKED; + +struct usb_msosv2_descriptor { + const uint8_t *compat_id; + uint16_t compat_id_len; + uint8_t vendor_code; +}; + +/* BOS header Descriptor */ +struct usb_bos_header_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumDeviceCaps; +} __PACKED; + +/* BOS Capability platform Descriptor */ +struct usb_bos_capability_platform_common_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint8_t bReserved; + uint8_t PlatformCapabilityUUID[16]; +} __PACKED; + +/* Microsoft OS 2.0 Platform Capability Descriptor +* See https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/ +* microsoft-defined-usb-descriptors +* Adapted from the source: +* https://github.com/sowbug/weblight/blob/master/firmware/webusb.c +* (BSD-2) Thanks http://janaxelson.com/files/ms_os_20_descriptors.c +*/ +struct usb_bos_capability_platform_winusb_descriptor { + struct usb_bos_capability_platform_common_descriptor common; + uint32_t dwWindowsVersion; + uint16_t wMSOSDescriptorSetTotalLength; + uint8_t bVendorCode; + uint8_t bAltEnumCode; +} __PACKED; + +/* WebUSB Platform Capability Descriptor: +* https://wicg.github.io/webusb/#webusb-platform-capability-descriptor +*/ +struct usb_bos_capability_platform_webusb_descriptor { + struct usb_bos_capability_platform_common_descriptor common; + uint16_t bcdVersion; + uint8_t bVendorCode; + uint8_t iLandingPage; +} __PACKED; + +/* BOS Capability extension Descriptor*/ +struct usb_bos_capability_extension_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + uint32_t bmAttributes; +} __PACKED; + +struct usb_webusb_url_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bScheme; + char URL[]; +} __PACKED; + +struct usb_webusb_descriptor { + uint8_t vendor_code; + const uint8_t *string; + uint32_t string_len; +} __PACKED; + +struct usb_bos_descriptor { + const uint8_t *string; + uint32_t string_len; +}; + +/** USB descriptor header */ +struct usb_desc_header { + uint8_t bLength; /**< descriptor length */ + uint8_t bDescriptorType; /**< descriptor type */ +}; + +// clang-format off +#define USB_DEVICE_DESCRIPTOR_INIT(bcdUSB, bDeviceClass, bDeviceSubClass, bDeviceProtocol, idVendor, idProduct, bcdDevice, bNumConfigurations) \ + 0x12, /* bLength */ \ + USB_DESCRIPTOR_TYPE_DEVICE, /* bDescriptorType */ \ + WBVAL(bcdUSB), /* bcdUSB */ \ + bDeviceClass, /* bDeviceClass */ \ + bDeviceSubClass, /* bDeviceSubClass */ \ + bDeviceProtocol, /* bDeviceProtocol */ \ + 0x40, /* bMaxPacketSize */ \ + WBVAL(idVendor), /* idVendor */ \ + WBVAL(idProduct), /* idProduct */ \ + WBVAL(bcdDevice), /* bcdDevice */ \ + USB_STRING_MFC_INDEX, /* iManufacturer */ \ + USB_STRING_PRODUCT_INDEX, /* iProduct */ \ + USB_STRING_SERIAL_INDEX, /* iSerial */ \ + bNumConfigurations /* bNumConfigurations */ + +#define USB_CONFIG_DESCRIPTOR_INIT(wTotalLength, bNumInterfaces, bConfigurationValue, bmAttributes, bMaxPower) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_CONFIGURATION, /* bDescriptorType */ \ + WBVAL(wTotalLength), /* wTotalLength */ \ + bNumInterfaces, /* bNumInterfaces */ \ + bConfigurationValue, /* bConfigurationValue */ \ + 0x00, /* iConfiguration */ \ + bmAttributes, /* bmAttributes */ \ + USB_CONFIG_POWER_MA(bMaxPower) /* bMaxPower */ + +#define USB_DEVICE_QUALIFIER_DESCRIPTOR_INIT(bcdUSB, bDeviceClass, bDeviceSubClass, bDeviceProtocol, bNumConfigurations) \ + 0x0A, /* bLength */ \ + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, /* bDescriptorType */ \ + WBVAL(bcdUSB), /* bcdUSB */ \ + bDeviceClass, /* bDeviceClass */ \ + bDeviceSubClass, /* bDeviceSubClass */ \ + bDeviceProtocol, /* bDeviceProtocol */ \ + 0x40, /* bMaxPacketSize */ \ + bNumConfigurations, /* bNumConfigurations */ \ + 0x00 /* bReserved */ + +#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_INIT(wTotalLength, bNumInterfaces, bConfigurationValue, bmAttributes, bMaxPower) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_OTHER_SPEED, /* bDescriptorType */ \ + WBVAL(wTotalLength), /* wTotalLength */ \ + bNumInterfaces, /* bNumInterfaces */ \ + bConfigurationValue, /* bConfigurationValue */ \ + 0x00, /* iConfiguration */ \ + bmAttributes, /* bmAttributes */ \ + USB_CONFIG_POWER_MA(bMaxPower) /* bMaxPower */ + +#define USB_INTERFACE_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bNumEndpoints, \ + bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol, iInterface) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + bAlternateSetting, /* bAlternateSetting */ \ + bNumEndpoints, /* bNumEndpoints */ \ + bInterfaceClass, /* bInterfaceClass */ \ + bInterfaceSubClass, /* bInterfaceSubClass */ \ + bInterfaceProtocol, /* bInterfaceProtocol */ \ + iInterface /* iInterface */ + +#define USB_ENDPOINT_DESCRIPTOR_INIT(bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \ + 0x07, /* bLength */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ + bEndpointAddress, /* bEndpointAddress */ \ + bmAttributes, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ + bInterval /* bInterval */ + +#define USB_IAD_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, bFunctionClass, bFunctionSubClass, bFunctionProtocol) \ + 0x08, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ + bFirstInterface, /* bFirstInterface */ \ + bInterfaceCount, /* bInterfaceCount */ \ + bFunctionClass, /* bFunctionClass */ \ + bFunctionSubClass, /* bFunctionSubClass */ \ + bFunctionProtocol, /* bFunctionProtocol */ \ + 0x00 /* iFunction */ + +#define USB_LANGID_INIT(id) \ + 0x04, /* bLength */ \ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ \ + WBVAL(id) /* wLangID0 */ + +#define USB_BOS_HEADER_DESCRIPTOR_INIT(wTotalLength, bNumDeviceCaps) \ + 0x05, /* bLength */ \ + USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE, /* bDescriptorType */\ + WBVAL(wTotalLength), /* wTotalLength */ \ + bNumDeviceCaps /* bNumDeviceCaps */ + +#define USB_BOS_CAP_PLATFORM_WEBUSB_DESCRIPTOR_INIT(bVendorCode, iLandingPage) \ + 0x18, /* bLength */ \ + USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY, /* bDescriptorType */ \ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ \ + 0x00, /* bReserved */ \ + 0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, /* PlatformCapabilityUUID */ \ + 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65, \ + WBVAL(0x0100), /* bcdVersion */ \ + bVendorCode, /* bVendorCode */ \ + iLandingPage /* iLandingPage */ + +#define USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_INIT(bVendorCode, wMSOSDescriptorSetTotalLength) \ + 0x1C, /* bLength */ \ + USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY, /* bDescriptorType */ \ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ \ + 0x00, /* bReserved */ \ + 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, /* PlatformCapabilityUUID */ \ + 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F, \ + DBVAL(0x06030000), /* dwWindowsVersion */ \ + WBVAL(wMSOSDescriptorSetTotalLength), /* wMSOSDescriptorSetTotalLength */ \ + bVendorCode, /* bVendorCode */ \ + 0x00 /* bAltEnumCode */ + +#define USB_BOS_CAP_PLATFORM_WEBUSB_DESCRIPTOR_LEN 24 +#define USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_LEN 28 + +#define USB_MSOSV1_STRING_DESCRIPTOR_INIT(vendor_code) \ + 0x12, /* bLength */ \ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ \ + 'M', 0, /* bString[0] */ \ + 'S', 0, /* bString[1] */ \ + 'F', 0, /* bString[2] */ \ + 'T', 0, /* bString[3] */ \ + '1', 0, /* bString[4] */ \ + '0', 0, /* bString[5] */ \ + vendor_code, /* bMS_VendorCode */ \ + 0x00 /* bPad */ + +#define USB_MSOSV1_COMP_ID_HEADER_DESCRIPTOR_INIT(bCount) \ + DBVAL((sizeof(struct usb_msosv1_compat_id_header_descriptor) + sizeof(struct usb_msosv1_comp_id_function_descriptor) * bCount)), /* dwLength */ \ + WBVAL(0x0100), /* bcdVersion */ \ + WBVAL(0x0004), /* wIndex */ \ + bCount, /* bCount */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* reserved[7] */ + +#define USB_MSOSV1_COMP_ID_FUNCTION_WINUSB_DESCRIPTOR_INIT(bFirstInterfaceNumber) \ + bFirstInterfaceNumber, /* bFirstInterfaceNumber */\ + 0x01, /* reserved1 */ \ + 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, /* compatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* subCompatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* reserved2[6] */ + +#define USB_MSOSV1_COMP_ID_FUNCTION_MTP_DESCRIPTOR_INIT(bFirstInterfaceNumber)\ + bFirstInterfaceNumber, /* bFirstInterfaceNumber */\ + 0x01, /* reserved1 */ \ + 'M', 'T', 'P', 'U', 'S', 'B', 0x00, 0x00, /* compatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* subCompatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* reserved2[6] */ + +#define USB_MSOSV1_COMP_ID_FUNCTION_ADB_DESCRIPTOR_INIT(bFirstInterfaceNumber)\ + bFirstInterfaceNumber, * bFirstInterfaceNumber */\ + 0x01, /* reserved1 */ \ + 'A', 'D', 'B', 0x00, 0x00, 0x00, 0x00, 0x00, /* compatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* subCompatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* reserved2[6] */ + +#define USB_MSOSV1_COMP_ID_DESCRIPTOR_LEN(bCount) \ + (sizeof(struct usb_msosv1_compat_id_header_descriptor) + sizeof(struct usb_msosv1_comp_id_function_descriptor) * (bCount)) + +#define USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(wDescriptorSetTotalLength) \ + WBVAL(WINUSB_DESCRIPTOR_SET_HEADER_SIZE), /* wLength */ \ + WBVAL(WINUSB_SET_HEADER_DESCRIPTOR_TYPE), /* wDescriptorType */ \ + DBVAL(0x06030000), /* dwWindowsVersion */ \ + WBVAL(wDescriptorSetTotalLength) /* wDescriptorSetTotalLength */ + +#define USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT() \ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ \ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ \ + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ \ + 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ \ + WBVAL(132), /* wLength */ \ + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ \ + WBVAL(WINUSB_PROP_DATA_TYPE_REG_SZ), /* wPropertyDataType */ \ + WBVAL(42), /* wPropertyNameLength bPropertyName: "DeviceInterfaceGUID" */ \ + 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, \ + 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, \ + 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, \ + WBVAL(80), /* wPropertyDataLength */ \ + '{', 0, \ + 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0, \ + '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, \ + '4', 0, '6', 0, '6', 0, '3', 0, '-', 0, \ + 'A', 0, 'A', 0, '3', 0, '6', 0, '-', \ + 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, \ + '}', 0, 0, 0, 0, 0 + +#define USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_LEN \ + (WINUSB_FEATURE_COMPATIBLE_ID_SIZE + 132) + +#define USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(bFirstInterfaceNumber) \ + WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), /* wLength */ \ + WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), /* wDescriptorType */ \ + bFirstInterfaceNumber, /* bFirstInterface*/ \ + 0, /* bReserved */ \ + WBVAL((WINUSB_FUNCTION_SUBSET_HEADER_SIZE + WINUSB_FEATURE_COMPATIBLE_ID_SIZE + 132)), /* wSubsetLength */\ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ \ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ \ + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ \ + 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ \ + WBVAL(132), /* wLength */ \ + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ \ + WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), /* wPropertyDataType */ \ + WBVAL(42), /* wPropertyNameLength bPropertyName: "DeviceInterfaceGUID" */ \ + 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, \ + 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, \ + 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, \ + WBVAL(80), /* wPropertyDataLength */ \ + '{', 0, \ + 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0, \ + '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, \ + '4', 0, '6', 0, '6', 0, '3', 0, '-', 0, \ + 'A', 0, 'A', 0, '3', 0, '6', 0, '-', \ + 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, \ + '}', 0, 0, 0, 0, 0 + +#define USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN \ + (WINUSB_FUNCTION_SUBSET_HEADER_SIZE + WINUSB_FEATURE_COMPATIBLE_ID_SIZE + 132) + +// clang-format on + +#endif /* USB_DEF_H */ diff --git a/src/lib/CherryUSB/common/usb_errno.h b/src/lib/CherryUSB/common/usb_errno.h new file mode 100644 index 000000000..284020a20 --- /dev/null +++ b/src/lib/CherryUSB/common/usb_errno.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_ERRNO_H +#define USB_ERRNO_H + +#define USB_ERR_NOMEM 1 +#define USB_ERR_INVAL 2 +#define USB_ERR_NODEV 3 +#define USB_ERR_NOTCONN 4 +#define USB_ERR_NOTSUPP 5 +#define USB_ERR_BUSY 6 +#define USB_ERR_RANGE 7 +#define USB_ERR_STALL 8 +#define USB_ERR_BABBLE 9 +#define USB_ERR_NAK 10 /* only for dwc2 buffer dma mode */ +#define USB_ERR_DT 11 +#define USB_ERR_IO 12 +#define USB_ERR_SHUTDOWN 13 +#define USB_ERR_TIMEOUT 14 + +#endif /* USB_ERRNO_H */ diff --git a/src/lib/CherryUSB/common/usb_hc.h b/src/lib/CherryUSB/common/usb_hc.h new file mode 100644 index 000000000..aa411eef7 --- /dev/null +++ b/src/lib/CherryUSB/common/usb_hc.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_HC_H +#define USB_HC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void (*usbh_complete_callback_t)(void *arg, int nbytes); + +struct usbh_bus; + +/** + * @brief USB Iso Configuration. + * + * Structure containing the USB Iso configuration. + */ +struct usbh_iso_frame_packet { + uint8_t *transfer_buffer; + uint32_t transfer_buffer_length; + uint32_t actual_length; + int errorcode; +}; + +/** + * @brief USB Urb Configuration. + * + * Structure containing the USB Urb configuration. + */ +struct usbh_urb { + usb_slist_t list; + void *hcpriv; + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *ep; + uint8_t data_toggle; + uint32_t interval; + struct usb_setup_packet *setup; + uint8_t *transfer_buffer; + uint32_t transfer_buffer_length; + int transfer_flags; + uint32_t actual_length; + uint32_t timeout; + int errorcode; + uint32_t num_of_iso_packets; + uint32_t start_frame; + usbh_complete_callback_t complete; + void *arg; +#if defined(__ICCARM__) || defined(__ICCRISCV__) || defined(__ICCRX__) + struct usbh_iso_frame_packet *iso_packet; +#else + struct usbh_iso_frame_packet iso_packet[0]; +#endif +}; + +/** + * @brief usb host controller hardware init. + * + * @return On success will return 0, and others indicate fail. + */ +int usb_hc_init(struct usbh_bus *bus); + +/** + * @brief usb host controller hardware deinit. + * + * @return On success will return 0, and others indicate fail. + */ +int usb_hc_deinit(struct usbh_bus *bus); + +/** + * @brief Get frame number. + * + * @return frame number. + */ +uint16_t usbh_get_frame_number(struct usbh_bus *bus); +/** + * @brief control roothub. + * + * @param setup setup request buffer. + * @param buf buf for reading response or write data. + * @return On success will return 0, and others indicate fail. + */ +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf); + +/** + * @brief Submit a usb transfer request to an endpoint. + * + * If timeout is not zero, this function will be in poll transfer mode, + * otherwise will be in async transfer mode. + * + * @param urb Usb request block. + * @return On success will return 0, and others indicate fail. + */ +int usbh_submit_urb(struct usbh_urb *urb); + +/** + * @brief Cancel a transfer request. + * + * This function will call When calls usbh_submit_urb and return -USB_ERR_TIMEOUT or -USB_ERR_SHUTDOWN. + * + * @param urb Usb request block. + * @return On success will return 0, and others indicate fail. + */ +int usbh_kill_urb(struct usbh_urb *urb); + +/* called by user */ +void USBH_IRQHandler(uint8_t busid); + +#ifdef __cplusplus +} +#endif + +#endif /* USB_HC_H */ diff --git a/src/lib/CherryUSB/common/usb_list.h b/src/lib/CherryUSB/common/usb_list.h new file mode 100644 index 000000000..3078a1f24 --- /dev/null +++ b/src/lib/CherryUSB/common/usb_list.h @@ -0,0 +1,459 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_LIST_H +#define USB_LIST_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * usb_container_of - return the member address of ptr, if the type of ptr is the + * struct type. + */ +#define usb_container_of(ptr, type, member) \ + ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) + +/** + * Single List structure + */ +struct usb_slist_node { + struct usb_slist_node *next; /**< point to next node. */ +}; +typedef struct usb_slist_node usb_slist_t; /**< Type for single list. */ + +/** + * @brief initialize a single list + * + * @param l the single list to be initialized + */ +static inline void usb_slist_init(usb_slist_t *l) +{ + l->next = NULL; +} + +static inline void usb_slist_add_head(usb_slist_t *l, usb_slist_t *n) +{ + n->next = l->next; + l->next = n; +} + +static inline void usb_slist_add_tail(usb_slist_t *l, usb_slist_t *n) +{ + usb_slist_t *tmp = l; + + while (tmp->next) { + tmp = tmp->next; + } + + /* append the node to the tail */ + tmp->next = n; + n->next = NULL; +} + +static inline void usb_slist_insert(usb_slist_t *l, usb_slist_t *next, usb_slist_t *n) +{ + if (!next) { + usb_slist_add_tail(next, l); + return; + } + + while (l->next) { + if (l->next == next) { + l->next = n; + n->next = next; + } + + l = l->next; + } +} + +static inline usb_slist_t *usb_slist_remove(usb_slist_t *l, usb_slist_t *n) +{ + usb_slist_t *tmp = l; + /* remove slist head */ + while (tmp->next && tmp->next != n) { + tmp = tmp->next; + } + + /* remove node */ + if (tmp->next != (usb_slist_t *)0) { + tmp->next = tmp->next->next; + } + + return l; +} + +static inline unsigned int usb_slist_len(const usb_slist_t *l) +{ + unsigned int len = 0; + const usb_slist_t *list = l->next; + + while (list != NULL) { + list = list->next; + len++; + } + + return len; +} + +static inline unsigned int usb_slist_contains(usb_slist_t *l, usb_slist_t *n) +{ + while (l->next) { + if (l->next == n) { + return 0; + } + + l = l->next; + } + + return 1; +} + +static inline usb_slist_t *usb_slist_head(usb_slist_t *l) +{ + return l->next; +} + +static inline usb_slist_t *usb_slist_tail(usb_slist_t *l) +{ + while (l->next) { + l = l->next; + } + + return l; +} + +static inline usb_slist_t *usb_slist_next(usb_slist_t *n) +{ + return n->next; +} + +static inline int usb_slist_isempty(usb_slist_t *l) +{ + return l->next == NULL; +} + +/** + * @brief initialize a slist object + */ +#define USB_SLIST_OBJECT_INIT(object) \ + { \ + NULL \ + } + +/** + * @brief initialize a slist object + */ +#define USB_SLIST_DEFINE(slist) \ + usb_slist_t slist = { NULL } + +/** + * @brief get the struct for this single list node + * @param node the entry point + * @param type the type of structure + * @param member the name of list in structure + */ +#define usb_slist_entry(node, type, member) \ + usb_container_of(node, type, member) + +/** + * usb_slist_first_entry - get the first element from a slist + * @ptr: the slist head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the slist_struct within the struct. + * + * Note, that slist is expected to be not empty. + */ +#define usb_slist_first_entry(ptr, type, member) \ + usb_slist_entry((ptr)->next, type, member) + +/** + * usb_slist_tail_entry - get the tail element from a slist + * @ptr: the slist head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the slist_struct within the struct. + * + * Note, that slist is expected to be not empty. + */ +#define usb_slist_tail_entry(ptr, type, member) \ + usb_slist_entry(usb_slist_tail(ptr), type, member) + +/** + * usb_slist_first_entry_or_null - get the first element from a slist + * @ptr: the slist head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the slist_struct within the struct. + * + * Note, that slist is expected to be not empty. + */ +#define usb_slist_first_entry_or_null(ptr, type, member) \ + (usb_slist_isempty(ptr) ? NULL : usb_slist_first_entry(ptr, type, member)) + +/** + * usb_slist_for_each - iterate over a single list + * @pos: the usb_slist_t * to use as a loop cursor. + * @head: the head for your single list. + */ +#define usb_slist_for_each(pos, head) \ + for (pos = (head)->next; pos != NULL; pos = pos->next) + +#define usb_slist_for_each_safe(pos, next, head) \ + for (pos = (head)->next, next = pos->next; pos; \ + pos = next, next = pos->next) + +/** + * usb_slist_for_each_entry - iterate over single list of given type + * @pos: the type * to use as a loop cursor. + * @head: the head for your single list. + * @member: the name of the list_struct within the struct. + */ +#define usb_slist_for_each_entry(pos, head, member) \ + for (pos = usb_slist_entry((head)->next, typeof(*pos), member); \ + &pos->member != (NULL); \ + pos = usb_slist_entry(pos->member.next, typeof(*pos), member)) + +#define usb_slist_for_each_entry_safe(pos, n, head, member) \ + for (pos = usb_slist_entry((head)->next, typeof(*pos), member), \ + n = usb_slist_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (NULL); \ + pos = n, n = usb_slist_entry(pos->member.next, typeof(*pos), member)) + +/** + * Double List structure + */ +struct usb_dlist_node { + struct usb_dlist_node *next; /**< point to next node. */ + struct usb_dlist_node *prev; /**< point to prev node. */ +}; +typedef struct usb_dlist_node usb_dlist_t; /**< Type for lists. */ + +/** + * @brief initialize a list + * + * @param l list to be initialized + */ +static inline void usb_dlist_init(usb_dlist_t *l) +{ + l->next = l->prev = l; +} + +/** + * @brief insert a node after a list + * + * @param l list to insert it + * @param n new node to be inserted + */ +static inline void usb_dlist_insert_after(usb_dlist_t *l, usb_dlist_t *n) +{ + l->next->prev = n; + n->next = l->next; + + l->next = n; + n->prev = l; +} + +/** + * @brief insert a node before a list + * + * @param n new node to be inserted + * @param l list to insert it + */ +static inline void usb_dlist_insert_before(usb_dlist_t *l, usb_dlist_t *n) +{ + l->prev->next = n; + n->prev = l->prev; + + l->prev = n; + n->next = l; +} + +/** + * @brief remove node from list. + * @param n the node to remove from the list. + */ +static inline void usb_dlist_remove(usb_dlist_t *n) +{ + n->next->prev = n->prev; + n->prev->next = n->next; + + n->next = n->prev = n; +} + +/** + * @brief move node from list. + * @param n the node to remove from the list. + */ +static inline void usb_dlist_move_head(usb_dlist_t *l, usb_dlist_t *n) +{ + usb_dlist_remove(n); + usb_dlist_insert_after(l, n); +} + +/** + * @brief move node from list. + * @param n the node to remove from the list. + */ +static inline void usb_dlist_move_tail(usb_dlist_t *l, usb_dlist_t *n) +{ + usb_dlist_remove(n); + usb_dlist_insert_before(l, n); +} + +/** + * @brief tests whether a list is empty + * @param l the list to test. + */ +static inline int usb_dlist_isempty(const usb_dlist_t *l) +{ + return l->next == l; +} + +/** + * @brief get the list length + * @param l the list to get. + */ +static inline unsigned int usb_dlist_len(const usb_dlist_t *l) +{ + unsigned int len = 0; + const usb_dlist_t *p = l; + + while (p->next != l) { + p = p->next; + len++; + } + + return len; +} + +/** + * @brief initialize a dlist object + */ +#define USB_DLIST_OBJECT_INIT(object) \ + { \ + &(object), &(object) \ + } +/** + * @brief initialize a dlist object + */ +#define USB_DLIST_DEFINE(list) \ + usb_dlist_t list = { &(list), &(list) } + +/** + * @brief get the struct for this entry + * @param node the entry point + * @param type the type of structure + * @param member the name of list in structure + */ +#define usb_dlist_entry(node, type, member) \ + usb_container_of(node, type, member) + +/** + * dlist_first_entry - get the first element from a list + * @ptr: the list head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + * + * Note, that list is expected to be not empty. + */ +#define usb_dlist_first_entry(ptr, type, member) \ + usb_dlist_entry((ptr)->next, type, member) +/** + * dlist_first_entry_or_null - get the first element from a list + * @ptr: the list head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + * + * Note, that list is expected to be not empty. + */ +#define usb_dlist_first_entry_or_null(ptr, type, member) \ + (usb_dlist_isempty(ptr) ? NULL : usb_dlist_first_entry(ptr, type, member)) + +/** + * usb_dlist_for_each - iterate over a list + * @pos: the usb_dlist_t * to use as a loop cursor. + * @head: the head for your list. + */ +#define usb_dlist_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +/** + * usb_dlist_for_each_prev - iterate over a list + * @pos: the dlist_t * to use as a loop cursor. + * @head: the head for your list. + */ +#define usb_dlist_for_each_prev(pos, head) \ + for (pos = (head)->prev; pos != (head); pos = pos->prev) + +/** + * usb_dlist_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the dlist_t * to use as a loop cursor. + * @n: another dlist_t * to use as temporary storage + * @head: the head for your list. + */ +#define usb_dlist_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +#define usb_dlist_for_each_prev_safe(pos, n, head) \ + for (pos = (head)->prev, n = pos->prev; pos != (head); \ + pos = n, n = pos->prev) +/** + * usb_dlist_for_each_entry - iterate over list of given type + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define usb_dlist_for_each_entry(pos, head, member) \ + for (pos = usb_dlist_entry((head)->next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = usb_dlist_entry(pos->member.next, typeof(*pos), member)) + +/** + * usb_usb_dlist_for_each_entry_reverse - iterate over list of given type + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define usb_dlist_for_each_entry_reverse(pos, head, member) \ + for (pos = usb_dlist_entry((head)->prev, typeof(*pos), member); \ + &pos->member != (head); \ + pos = usb_dlist_entry(pos->member.prev, typeof(*pos), member)) + +/** + * usb_usb_dlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define usb_dlist_for_each_entry_safe(pos, n, head, member) \ + for (pos = usb_dlist_entry((head)->next, typeof(*pos), member), \ + n = usb_dlist_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = usb_dlist_entry(n->member.next, typeof(*n), member)) + +/** + * usb_usb_dlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define usb_dlist_for_each_entry_safe_reverse(pos, n, head, member) \ + for (pos = usb_dlist_entry((head)->prev, typeof(*pos), field), \ + n = usb_dlist_entry(pos->member.prev, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = usb_dlist_entry(pos->member.prev, typeof(*pos), member)) + +#ifdef __cplusplus +} +#endif + +#endif /* USB_LIST_H */ diff --git a/src/lib/CherryUSB/common/usb_log.h b/src/lib/CherryUSB/common/usb_log.h new file mode 100644 index 000000000..ca03af5b3 --- /dev/null +++ b/src/lib/CherryUSB/common/usb_log.h @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_LOG_H +#define USB_LOG_H + +#include + +/* DEBUG level */ +#define USB_DBG_ERROR 0 +#define USB_DBG_WARNING 1 +#define USB_DBG_INFO 2 +#define USB_DBG_LOG 3 + +#ifndef USB_DBG_TAG +#define USB_DBG_TAG "USB" +#endif +/* + * The color for terminal (foreground) + * BLACK 30 + * RED 31 + * GREEN 32 + * YELLOW 33 + * BLUE 34 + * PURPLE 35 + * CYAN 36 + * WHITE 37 + */ + +#ifdef CONFIG_USB_PRINTF_COLOR_ENABLE +#define _USB_DBG_COLOR(n) CONFIG_USB_PRINTF("\033[" #n "m") +#define _USB_DBG_LOG_HDR(lvl_name, color_n) \ + CONFIG_USB_PRINTF("\033[" #color_n "m[" lvl_name "/" USB_DBG_TAG "] ") +#define _USB_DBG_LOG_X_END \ + CONFIG_USB_PRINTF("\033[0m") +#else +#define _USB_DBG_COLOR(n) +#define _USB_DBG_LOG_HDR(lvl_name, color_n) \ + CONFIG_USB_PRINTF("[" lvl_name "/" USB_DBG_TAG "] ") +#define _USB_DBG_LOG_X_END +#endif + +#define usb_dbg_log_line(lvl, color_n, fmt, ...) \ + do { \ + _USB_DBG_LOG_HDR(lvl, color_n); \ + CONFIG_USB_PRINTF(fmt, ##__VA_ARGS__); \ + _USB_DBG_LOG_X_END; \ + } while (0) + +#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_LOG) +#define USB_LOG_DBG(fmt, ...) usb_dbg_log_line("D", 0, fmt, ##__VA_ARGS__) +#else +#define USB_LOG_DBG(...) {} +#endif + +#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_INFO) +#define USB_LOG_INFO(fmt, ...) usb_dbg_log_line("I", 32, fmt, ##__VA_ARGS__) +#else +#define USB_LOG_INFO(...) {} +#endif + +#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_WARNING) +#define USB_LOG_WRN(fmt, ...) usb_dbg_log_line("W", 33, fmt, ##__VA_ARGS__) +#else +#define USB_LOG_WRN(...) {} +#endif + +#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_ERROR) +#define USB_LOG_ERR(fmt, ...) usb_dbg_log_line("E", 31, fmt, ##__VA_ARGS__) +#else +#define USB_LOG_ERR(...) {} +#endif + +#define USB_LOG_RAW(...) CONFIG_USB_PRINTF(__VA_ARGS__) + +#ifndef CONFIG_USB_ASSERT_DISABLE +#define USB_ASSERT(f) \ + do { \ + if (!(f)) { \ + USB_LOG_ERR("ASSERT FAIL [%s] @ %s:%d\r\n", #f, __FILE__, __LINE__); \ + while (1) { \ + } \ + } \ + } while (false) + +#define USB_ASSERT_MSG(f, fmt, ...) \ + do { \ + if (!(f)) { \ + USB_LOG_ERR("ASSERT FAIL [%s] @ %s:%d\r\n", #f, __FILE__, __LINE__); \ + USB_LOG_ERR(fmt "\r\n", ##__VA_ARGS__); \ + while (1) { \ + } \ + } \ + } while (false) +#else +#define USB_ASSERT(f) {} +#define USB_ASSERT_MSG(f, fmt, ...) {} +#endif + +#define ___is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') +static inline void usb_hexdump(const void *ptr, uint32_t buflen) +{ + unsigned char *buf = (unsigned char *)ptr; + unsigned int i, j; + + (void)buf; + + for (i = 0; i < buflen; i += 16) { + CONFIG_USB_PRINTF("%08x:", i); + + for (j = 0; j < 16; j++) + if (i + j < buflen) { + if ((j % 8) == 0) { + CONFIG_USB_PRINTF(" "); + } + + CONFIG_USB_PRINTF("%02X ", buf[i + j]); + } else + CONFIG_USB_PRINTF(" "); + CONFIG_USB_PRINTF(" "); + + for (j = 0; j < 16; j++) + if (i + j < buflen) + CONFIG_USB_PRINTF("%c", ___is_print(buf[i + j]) ? buf[i + j] : '.'); + CONFIG_USB_PRINTF("\n"); + } +} + +#endif /* USB_LOG_H */ diff --git a/src/lib/CherryUSB/common/usb_memcpy.h b/src/lib/CherryUSB/common/usb_memcpy.h new file mode 100644 index 000000000..ed028e649 --- /dev/null +++ b/src/lib/CherryUSB/common/usb_memcpy.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_MEMCPY_H +#define USB_MEMCPY_H + +#include +#include + +#define ALIGN_UP_DWORD(x) ((uint32_t)(uintptr_t)(x) & (sizeof(uint32_t) - 1)) + +static inline void dword2array(char *addr, uint32_t w) +{ + addr[0] = w; + addr[1] = w >> 8; + addr[2] = w >> 16; + addr[3] = w >> 24; +} + +static inline void *usb_memcpy(void *s1, const void *s2, size_t n) +{ + char *b1 = (char *)s1; + const char *b2 = (const char *)s2; + uint32_t *w1; + const uint32_t *w2; + + if (ALIGN_UP_DWORD(b1) == ALIGN_UP_DWORD(b2)) { + while (ALIGN_UP_DWORD(b1) != 0 && n > 0) { + *b1++ = *b2++; + --n; + } + + w1 = (uint32_t *)b1; + w2 = (const uint32_t *)b2; + + while (n >= 4 * sizeof(uint32_t)) { + *w1++ = *w2++; + *w1++ = *w2++; + *w1++ = *w2++; + *w1++ = *w2++; + n -= 4 * sizeof(uint32_t); + } + + while (n >= sizeof(uint32_t)) { + *w1++ = *w2++; + n -= sizeof(uint32_t); + } + + b1 = (char *)w1; + b2 = (const char *)w2; + + while (n--) { + *b1++ = *b2++; + } + } else { + while (n > 0 && ALIGN_UP_DWORD(b2) != 0) { + *b1++ = *b2++; + --n; + } + + w2 = (const uint32_t *)b2; + + while (n >= 4 * sizeof(uint32_t)) { + dword2array(b1, *w2++); + b1 += sizeof(uint32_t); + dword2array(b1, *w2++); + b1 += sizeof(uint32_t); + dword2array(b1, *w2++); + b1 += sizeof(uint32_t); + dword2array(b1, *w2++); + b1 += sizeof(uint32_t); + n -= 4 * sizeof(uint32_t); + } + + while (n >= sizeof(uint32_t)) { + dword2array(b1, *w2++); + b1 += sizeof(uint32_t); + n -= sizeof(uint32_t); + } + + b2 = (const char *)w2; + + while (n--) { + *b1++ = *b2++; + } + } + return s1; +} + +#ifndef CONFIG_USB_MEMCPY_DISABLE +#define memcpy usb_memcpy +#endif + +#endif diff --git a/src/lib/CherryUSB/common/usb_osal.h b/src/lib/CherryUSB/common/usb_osal.h new file mode 100644 index 000000000..1975f208b --- /dev/null +++ b/src/lib/CherryUSB/common/usb_osal.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_OSAL_H +#define USB_OSAL_H + +#include +#include +#include + +#ifdef __INCLUDE_NUTTX_CONFIG_H +#define CONFIG_USB_OSAL_THREAD_SET_ARGV int argc, char **argv +#define CONFIG_USB_OSAL_THREAD_GET_ARGV ((uintptr_t)strtoul(argv[1], NULL, 16)) +#elif defined(__ZEPHYR__) +#define CONFIG_USB_OSAL_THREAD_SET_ARGV void *p1, void *p2, void *p3 +#define CONFIG_USB_OSAL_THREAD_GET_ARGV ((uintptr_t)p1) +#else +#define CONFIG_USB_OSAL_THREAD_SET_ARGV void *argument +#define CONFIG_USB_OSAL_THREAD_GET_ARGV ((uintptr_t)argument) +#endif + +#define USB_OSAL_WAITING_FOREVER (0xFFFFFFFFU) + +typedef void *usb_osal_thread_t; +typedef void *usb_osal_sem_t; +typedef void *usb_osal_mutex_t; +typedef void *usb_osal_mq_t; +typedef void (*usb_thread_entry_t)(CONFIG_USB_OSAL_THREAD_SET_ARGV); +typedef void (*usb_timer_handler_t)(void *argument); +struct usb_osal_timer { + usb_timer_handler_t handler; + void *argument; + bool is_period; + uint32_t timeout_ms; + void *timer; +}; + +/* + * Task with smaller priority value indicates higher task priority +*/ +usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args); +void usb_osal_thread_delete(usb_osal_thread_t thread); +void usb_osal_thread_schedule_other(void); + +usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count); +void usb_osal_sem_delete(usb_osal_sem_t sem); +int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout); +int usb_osal_sem_give(usb_osal_sem_t sem); +void usb_osal_sem_reset(usb_osal_sem_t sem); + +usb_osal_mutex_t usb_osal_mutex_create(void); +void usb_osal_mutex_delete(usb_osal_mutex_t mutex); +int usb_osal_mutex_take(usb_osal_mutex_t mutex); +int usb_osal_mutex_give(usb_osal_mutex_t mutex); + +usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs); +void usb_osal_mq_delete(usb_osal_mq_t mq); +int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr); +int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout); + +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period); +void usb_osal_timer_delete(struct usb_osal_timer *timer); +void usb_osal_timer_start(struct usb_osal_timer *timer); +void usb_osal_timer_stop(struct usb_osal_timer *timer); + +size_t usb_osal_enter_critical_section(void); +void usb_osal_leave_critical_section(size_t flag); + +void usb_osal_msleep(uint32_t delay); + +void *usb_osal_malloc(size_t size); +void usb_osal_free(void *ptr); + +#endif /* USB_OSAL_H */ diff --git a/src/lib/CherryUSB/common/usb_otg.h b/src/lib/CherryUSB/common/usb_otg.h new file mode 100644 index 000000000..032d2e9f7 --- /dev/null +++ b/src/lib/CherryUSB/common/usb_otg.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_OTG_H +#define USB_OTG_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define USBOTG_MODE_HOST 0 +#define USBOTG_MODE_DEVICE 1 +#define USBOTG_MODE_OTG 2 + +/** + * @brief usb otg controller hardware or gpio id simulator init. + * + * @return On success will return 0, and others indicate fail. + */ +int usb_otg_init(uint8_t busid); +/** + * @brief usb otg controller hardware or gpio id simulator deinit. + * + * @return On success will return 0, and others indicate fail. + */ +int usb_otg_deinit(uint8_t busid); + +/* called by user */ +void USBOTG_IRQHandler(uint8_t busid); + +#ifdef __cplusplus +} +#endif + +#endif /* USB_OTG_H */ \ No newline at end of file diff --git a/src/lib/CherryUSB/common/usb_util.h b/src/lib/CherryUSB/common/usb_util.h new file mode 100644 index 000000000..90058193f --- /dev/null +++ b/src/lib/CherryUSB/common/usb_util.h @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2022-2023, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_UTIL_H +#define USB_UTIL_H + +#if defined(__CC_ARM) +#ifndef __USED +#define __USED __attribute__((used)) +#endif +#ifndef __WEAK +#define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED +#define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT +#define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION +#define __PACKED_UNION __packed union +#endif +#ifndef __ALIGNED +#define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#elif defined(__GNUC__) +#ifndef __USED +#define __USED __attribute__((used)) +#endif +#ifndef __WEAK +#define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED +#define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT +#define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION +#define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __ALIGNED +#define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#elif defined(__ICCARM__) || defined(__ICCRX__) || defined(__ICCRISCV__) +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __USED +#if defined(__ICCARM_V8) || defined(__ICCRISCV__) +#define __USED __attribute__((used)) +#else +#define __USED __root +#endif +#endif + +#ifndef __WEAK +#if defined(__ICCARM_V8) || defined(__ICCRISCV__) +#define __WEAK __attribute__((weak)) +#else +#define __WEAK _Pragma("__weak") +#endif +#endif + +#ifndef __PACKED +#if defined(__ICCARM_V8) || defined(__ICCRISCV__) +#define __PACKED __attribute__((packed, aligned(1))) +#else +/* Needs IAR language extensions */ +#define __PACKED __packed +#endif +#endif + +#ifndef __PACKED_STRUCT +#if defined(__ICCARM_V8) || defined(__ICCRISCV__) +#define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#else +/* Needs IAR language extensions */ +#define __PACKED_STRUCT __packed struct +#endif +#endif + +#ifndef __PACKED_UNION +#if defined(__ICCARM_V8) || defined(__ICCRISCV__) +#define __PACKED_UNION union __attribute__((packed, aligned(1))) +#else +/* Needs IAR language extensions */ +#define __PACKED_UNION __packed union +#endif +#endif + +#ifndef __ALIGNED +#if defined(__ICCARM_V8) || defined(__ICCRISCV__) +#define __ALIGNED(x) __attribute__((aligned(x))) +#elif (__VER__ >= 7080000) +/* Needs IAR language extensions */ +#define __ALIGNED(x) __attribute__((aligned(x))) +#else +#warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. +#define __ALIGNED(x) +#endif +#endif + +#endif + +#ifndef __ALIGN_BEGIN +#define __ALIGN_BEGIN +#endif +#ifndef __ALIGN_END +#define __ALIGN_END __attribute__((aligned(4))) +#endif + +#ifndef ARG_UNUSED +#define ARG_UNUSED(x) (void)(x) +#endif + +#ifndef LO_BYTE +#define LO_BYTE(x) ((uint8_t)(x & 0x00FF)) +#endif + +#ifndef HI_BYTE +#define HI_BYTE(x) ((uint8_t)((x & 0xFF00) >> 8)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef BCD +#define BCD(x) ((((x) / 10) << 4) | ((x) % 10)) +#endif + +#ifdef BIT +#undef BIT +#define BIT(n) (1UL << (n)) +#else +#define BIT(n) (1UL << (n)) +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(array) \ + ((int)((sizeof(array) / sizeof((array)[0])))) +#endif + +#ifndef BSWAP16 +#define BSWAP16(u16) (__builtin_bswap16(u16)) +#endif +#ifndef BSWAP32 +#define BSWAP32(u32) (__builtin_bswap32(u32)) +#endif + +#define GET_BE16(field) \ + (((uint16_t)(field)[0] << 8) | ((uint16_t)(field)[1])) + +#define GET_BE32(field) \ + (((uint32_t)(field)[0] << 24) | ((uint32_t)(field)[1] << 16) | ((uint32_t)(field)[2] << 8) | ((uint32_t)(field)[3] << 0)) + +#define SET_BE16(field, value) \ + do { \ + (field)[0] = (uint8_t)((value) >> 8); \ + (field)[1] = (uint8_t)((value) >> 0); \ + } while (0) + +#define SET_BE24(field, value) \ + do { \ + (field)[0] = (uint8_t)((value) >> 16); \ + (field)[1] = (uint8_t)((value) >> 8); \ + (field)[2] = (uint8_t)((value) >> 0); \ + } while (0) + +#define SET_BE32(field, value) \ + do { \ + (field)[0] = (uint8_t)((value) >> 24); \ + (field)[1] = (uint8_t)((value) >> 16); \ + (field)[2] = (uint8_t)((value) >> 8); \ + (field)[3] = (uint8_t)((value) >> 0); \ + } while (0) + +#define WBVAL(x) ((x) & 0xFF), (((x) >> 8) & 0xFF) +#define DBVAL(x) ((x) & 0xFF), (((x) >> 8) & 0xFF), (((x) >> 16) & 0xFF), (((x) >> 24) & 0xFF) + +#define PP_NARG(...) \ + PP_NARG_(__VA_ARGS__, PP_RSEQ_N()) +#define PP_NARG_(...) \ + PP_ARG_N(__VA_ARGS__) +#define PP_ARG_N( \ + _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \ + _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \ + _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \ + _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \ + _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \ + _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \ + _61, _62, _63, N, ...) N +#define PP_RSEQ_N() \ + 63, 62, 61, 60, \ + 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \ + 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \ + 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \ + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \ + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \ + 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 + +#define USB_MEM_ALIGNX __attribute__((aligned(CONFIG_USB_ALIGN_SIZE))) + +#define USB_ALIGN_UP(size, align) (((size) + (align)-1) & ~((align)-1)) +#define USB_ALIGN_DOWN(size, align) ((size) & ~((align)-1)) + +#ifndef usb_phyaddr2ramaddr +#define usb_phyaddr2ramaddr(addr) (addr) +#endif + +#ifndef usb_ramaddr2phyaddr +#define usb_ramaddr2phyaddr(addr) (addr) +#endif + +#endif /* USB_UTIL_H */ diff --git a/src/lib/CherryUSB/common/usb_version.h b/src/lib/CherryUSB/common/usb_version.h new file mode 100644 index 000000000..bbf39569e --- /dev/null +++ b/src/lib/CherryUSB/common/usb_version.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_VERSION_H +#define USB_VERSION_H + +#ifdef CHERRYUSB_VERSION +#warning "Please do not define CHERRYUSB_VERSION in usb_config.h" +#undef CHERRYUSB_VERSION +#endif +#ifdef CHERRYUSB_VERSION_STR +#warning "Please do not define CHERRYUSB_VERSION_STR in usb_config.h" +#undef CHERRYUSB_VERSION_STR +#endif + +#define CHERRYUSB_VERSION 0x010503 +#define CHERRYUSB_VERSION_STR "v1.5.3" + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/core/usbd_core.c b/src/lib/CherryUSB/core/usbd_core.c new file mode 100644 index 000000000..55ce46ea0 --- /dev/null +++ b/src/lib/CherryUSB/core/usbd_core.c @@ -0,0 +1,1591 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#ifdef CONFIG_USBDEV_EP0_THREAD +#include "usb_osal.h" + +#define USB_EP0_STATE_SETUP 0 +#define USB_EP0_STATE_IN 1 +#define USB_EP0_STATE_OUT 2 +#endif + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbd_core" +#include "usb_log.h" + +/* general descriptor field offsets */ +#define DESC_bLength 0 /** Length offset */ +#define DESC_bDescriptorType 1 /** Descriptor type offset */ + +/* config descriptor field offsets */ +#define CONF_DESC_wTotalLength 2 /** Total length offset */ +#define CONF_DESC_bConfigurationValue 5 /** Configuration value offset */ +#define CONF_DESC_bmAttributes 7 /** configuration characteristics */ + +/* interface descriptor field offsets */ +#define INTF_DESC_bInterfaceNumber 2 /** Interface number offset */ +#define INTF_DESC_bAlternateSetting 3 /** Alternate setting offset */ + +struct usbd_tx_rx_msg { + uint8_t ep; + uint8_t ep_mult; + uint16_t ep_mps; + uint32_t nbytes; + usbd_endpoint_callback cb; +}; + +USB_NOCACHE_RAM_SECTION struct usbd_core_priv { + /** Setup packet */ + USB_MEM_ALIGNX struct usb_setup_packet setup; + /** Pointer to data buffer */ + USB_MEM_ALIGNX uint8_t *ep0_data_buf; + /** Remaining bytes in buffer */ + uint32_t ep0_data_buf_residue; + /** Total length of control transfer */ + uint32_t ep0_data_buf_len; + /** Zero length packet flag of control transfer */ + bool zlp_flag; + /** Pointer to registered descriptors */ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + const struct usb_descriptor *descriptors; +#else + const uint8_t *descriptors; + struct usb_msosv1_descriptor *msosv1_desc; + struct usb_msosv2_descriptor *msosv2_desc; + struct usb_bos_descriptor *bos_desc; + struct usb_webusb_descriptor *webusb_url_desc; +#endif + /* Buffer used for storing standard, class and vendor request data */ + USB_MEM_ALIGNX uint8_t req_data[USB_ALIGN_UP(CONFIG_USBDEV_REQUEST_BUFFER_LEN, CONFIG_USB_ALIGN_SIZE)]; + + /** Currently selected configuration */ + uint8_t configuration; + uint8_t device_address; + uint8_t ep0_next_state; + bool self_powered; + bool remote_wakeup_support; + bool remote_wakeup_enabled; + bool is_suspend; +#ifdef CONFIG_USBDEV_ADVANCE_DESC + uint8_t speed; +#endif +#ifdef CONFIG_USBDEV_TEST_MODE + bool test_req; +#endif +#ifdef CONFIG_USBDEV_EP0_THREAD + usb_osal_mq_t usbd_ep0_mq; + usb_osal_thread_t usbd_ep0_thread; +#endif + struct usbd_interface *intf[16]; + uint8_t intf_altsetting[16]; + uint8_t intf_offset; + + struct usbd_tx_rx_msg tx_msg[16]; + struct usbd_tx_rx_msg rx_msg[16]; + + void (*event_handler)(uint8_t busid, uint8_t event); +} g_usbd_core[CONFIG_USBDEV_MAX_BUS]; + +struct usbd_bus g_usbdev_bus[CONFIG_USBDEV_MAX_BUS]; + +static void usbd_class_event_notify_handler(uint8_t busid, uint8_t event, void *arg); + +static void usbd_print_setup(struct usb_setup_packet *setup) +{ + USB_LOG_ERR("Setup: " + "bmRequestType 0x%02x, bRequest 0x%02x, wValue 0x%04x, wIndex 0x%04x, wLength 0x%04x\r\n", + setup->bmRequestType, + setup->bRequest, + setup->wValue, + setup->wIndex, + setup->wLength); +} + +#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_LOG) +static const char *usb_ep0_state_string[] = { + "setup", + "indata", + "outdata", + "instatus", + "outstatus" +}; +#endif + +static bool is_device_configured(uint8_t busid) +{ + return (g_usbd_core[busid].configuration != 0); +} + +/** + * @brief configure and enable endpoint + * + * This function sets endpoint configuration according to one specified in USB + * endpoint descriptor and then enables it for data transfers. + * + * @param [in] busid busid + * @param [in] ep Endpoint descriptor byte array + * + * @return true if successfully configured and enabled + */ +static bool usbd_set_endpoint(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + USB_LOG_DBG("Open ep:0x%02x type:%u mps:%u\r\n", + ep->bEndpointAddress, + USB_GET_ENDPOINT_TYPE(ep->bmAttributes), + USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize)); + + if (ep->bEndpointAddress & 0x80) { + g_usbd_core[busid].tx_msg[ep->bEndpointAddress & 0x7f].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_usbd_core[busid].tx_msg[ep->bEndpointAddress & 0x7f].ep_mult = USB_GET_MULT(ep->wMaxPacketSize); + } else { + g_usbd_core[busid].rx_msg[ep->bEndpointAddress & 0x7f].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_usbd_core[busid].rx_msg[ep->bEndpointAddress & 0x7f].ep_mult = USB_GET_MULT(ep->wMaxPacketSize); + } + + return usbd_ep_open(busid, ep) == 0 ? true : false; +} +/** + * @brief Disable endpoint for transferring data + * + * This function cancels transfers that are associated with endpoint and + * disabled endpoint itself. + * + * @param [in] busid busid + * @param [in] ep Endpoint descriptor byte array + * + * @return true if successfully deconfigured and disabled + */ +static bool usbd_reset_endpoint(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + USB_LOG_DBG("Close ep:0x%02x type:%u\r\n", + ep->bEndpointAddress, + USB_GET_ENDPOINT_TYPE(ep->bmAttributes)); + + return usbd_ep_close(busid, ep->bEndpointAddress) == 0 ? true : false; +} + +/** + * @brief get specified USB descriptor + * + * This function parses the list of installed USB descriptors and attempts + * to find the specified USB descriptor. + * + * @param [in] busid busid + * @param [in] type_index Type and index of the descriptor + * @param [out] data Descriptor data + * @param [out] len Descriptor length + * + * @return true if the descriptor was found, false otherwise + */ +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static bool usbd_get_descriptor(uint8_t busid, uint16_t type_index, uint8_t **data, uint32_t *len) +{ + uint8_t type = 0U; + uint8_t index = 0U; + bool found = true; + uint32_t desc_len = 0; + const char *string = NULL; + const uint8_t *desc = NULL; + + type = HI_BYTE(type_index); + index = LO_BYTE(type_index); + + switch (type) { + case USB_DESCRIPTOR_TYPE_DEVICE: + g_usbd_core[busid].speed = usbd_get_port_speed(busid); /* before we get device descriptor, we have known steady port speed */ + + if (g_usbd_core[busid].descriptors->device_descriptor_callback == NULL) { + found = false; + break; + } + desc = g_usbd_core[busid].descriptors->device_descriptor_callback(g_usbd_core[busid].speed); + if (desc == NULL) { + found = false; + break; + } + desc_len = desc[0]; + break; + case USB_DESCRIPTOR_TYPE_CONFIGURATION: + if (g_usbd_core[busid].descriptors->config_descriptor_callback == NULL) { + found = false; + break; + } + desc = g_usbd_core[busid].descriptors->config_descriptor_callback(g_usbd_core[busid].speed); + if (desc == NULL) { + found = false; + break; + } + desc_len = ((desc[CONF_DESC_wTotalLength]) | (desc[CONF_DESC_wTotalLength + 1] << 8)); + + g_usbd_core[busid].self_powered = (desc[7] & USB_CONFIG_POWERED_MASK) ? true : false; + g_usbd_core[busid].remote_wakeup_support = (desc[7] & USB_CONFIG_REMOTE_WAKEUP) ? true : false; + break; + case USB_DESCRIPTOR_TYPE_STRING: + if (index == USB_OSDESC_STRING_DESC_INDEX) { + if (!g_usbd_core[busid].descriptors->msosv1_descriptor) { + found = false; + break; + } + + desc = (uint8_t *)g_usbd_core[busid].descriptors->msosv1_descriptor->string; + desc_len = g_usbd_core[busid].descriptors->msosv1_descriptor->string[0]; + } else { + if (g_usbd_core[busid].descriptors->string_descriptor_callback == NULL) { + found = false; + break; + } + string = g_usbd_core[busid].descriptors->string_descriptor_callback(g_usbd_core[busid].speed, index); + if (string == NULL) { + found = false; + break; + } + + if (index == USB_STRING_LANGID_INDEX) { + (*data)[0] = 4; + (*data)[1] = USB_DESCRIPTOR_TYPE_STRING; + (*data)[2] = string[0]; + (*data)[3] = string[1]; + + *len = 4; + return true; + } + + uint16_t str_size = strlen(string); + uint16_t total_size = 2 * str_size + 2; + if (total_size > CONFIG_USBDEV_REQUEST_BUFFER_LEN) { + USB_LOG_ERR("string size overflow\r\n"); + return false; + } + + (*data)[0] = total_size; + (*data)[1] = USB_DESCRIPTOR_TYPE_STRING; + + for (uint16_t i = 0; i < str_size; i++) { + (*data)[2 * i + 2] = string[i]; + (*data)[2 * i + 3] = 0x00; + } + + *len = total_size; + return true; + } + break; + case USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER: +#ifndef CONFIG_USB_HS + return false; +#else + if (g_usbd_core[busid].descriptors->device_quality_descriptor_callback == NULL) { + found = false; + break; + } + desc = g_usbd_core[busid].descriptors->device_quality_descriptor_callback(g_usbd_core[busid].speed); + if (desc == NULL) { + found = false; + break; + } + desc_len = desc[0]; + break; +#endif + case USB_DESCRIPTOR_TYPE_OTHER_SPEED: + if (g_usbd_core[busid].descriptors->other_speed_descriptor_callback == NULL) { + found = false; + break; + } + desc = g_usbd_core[busid].descriptors->other_speed_descriptor_callback(g_usbd_core[busid].speed); + if (desc == NULL) { + found = false; + break; + } + desc_len = ((desc[CONF_DESC_wTotalLength]) | (desc[CONF_DESC_wTotalLength + 1] << 8)); + break; + + case USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE: + if (!g_usbd_core[busid].descriptors->bos_descriptor) { + found = false; + break; + } + + desc = (uint8_t *)g_usbd_core[busid].descriptors->bos_descriptor->string; + desc_len = g_usbd_core[busid].descriptors->bos_descriptor->string_len; + break; + + default: + found = false; + break; + } + + if (found == false) { + /* nothing found */ + USB_LOG_ERR("descriptor not found!\r\n", type, index); + } else { + *data = (uint8_t *)desc; + //memcpy(*data, desc, desc_len); + *len = desc_len; + } + return found; +} +#else +static bool usbd_get_descriptor(uint8_t busid, uint16_t type_index, uint8_t **data, uint32_t *len) +{ + uint8_t type = 0U; + uint8_t index = 0U; + uint8_t *p = NULL; + uint32_t cur_index = 0U; + bool found = false; + + type = HI_BYTE(type_index); + index = LO_BYTE(type_index); + + if ((type == USB_DESCRIPTOR_TYPE_STRING) && (index == USB_OSDESC_STRING_DESC_INDEX)) { + if (!g_usbd_core[busid].msosv1_desc) { + return false; + } + + *data = (uint8_t *)g_usbd_core[busid].msosv1_desc->string; + //memcpy(*data, (uint8_t *)g_usbd_core[busid].msosv1_desc->string, g_usbd_core[busid].msosv1_desc->string[0]); + *len = g_usbd_core[busid].msosv1_desc->string[0]; + + return true; + } else if (type == USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE) { + if (!g_usbd_core[busid].bos_desc) { + return false; + } + + *data = (uint8_t *)g_usbd_core[busid].bos_desc->string; + //memcpy(*data, (uint8_t *)g_usbd_core[busid].bos_desc->string, g_usbd_core[busid].bos_desc->string_len); + *len = g_usbd_core[busid].bos_desc->string_len; + return true; + } + /* + * Invalid types of descriptors, + * see USB Spec. Revision 2.0, 9.4.3 Get Descriptor + */ + else if ((type == USB_DESCRIPTOR_TYPE_INTERFACE) || (type == USB_DESCRIPTOR_TYPE_ENDPOINT) || +#ifndef CONFIG_USB_HS + (type > USB_DESCRIPTOR_TYPE_ENDPOINT)) { +#else + (type > USB_DESCRIPTOR_TYPE_OTHER_SPEED)) { +#endif + return false; + } + + p = (uint8_t *)g_usbd_core[busid].descriptors; + + cur_index = 0U; + + while (p[DESC_bLength] != 0U) { + if (p[DESC_bDescriptorType] == type) { + if (cur_index == index) { + found = true; + break; + } + + cur_index++; + } + + /* skip to next descriptor */ + p += p[DESC_bLength]; + } + + if (found) { + if ((type == USB_DESCRIPTOR_TYPE_CONFIGURATION) || ((type == USB_DESCRIPTOR_TYPE_OTHER_SPEED))) { + /* configuration or other speed descriptor is an + * exception, length is at offset 2 and 3 + */ + *len = (p[CONF_DESC_wTotalLength]) | + (p[CONF_DESC_wTotalLength + 1] << 8); + + g_usbd_core[busid].self_powered = (p[7] & USB_CONFIG_POWERED_MASK) ? true : false; + g_usbd_core[busid].remote_wakeup_support = (p[7] & USB_CONFIG_REMOTE_WAKEUP) ? true : false; + } else { + /* normally length is at offset 0 */ + *len = p[DESC_bLength]; + } + *data = p; + //memcpy(*data, p, *len); + } else { + /* nothing found */ + USB_LOG_ERR("descriptor not found!\r\n", type, index); + } + + return found; +} +#endif + +/** + * @brief set USB configuration + * + * This function configures the device according to the specified configuration + * index and alternate setting by parsing the installed USB descriptor list. + * A configuration index of 0 unconfigures the device. + * + * @param [in] busid busid + * @param [in] config_index Configuration index + * @param [in] alt_setting Alternate setting number + * + * @return true if successfully configured false if error or unconfigured + */ +static bool usbd_set_configuration(uint8_t busid, uint8_t config_index, uint8_t alt_setting) +{ + uint8_t cur_alt_setting = 0xFF; + uint8_t cur_config = 0xFF; + bool found = false; + const uint8_t *p; + uint32_t desc_len = 0; + uint32_t current_desc_len = 0; + +#ifdef CONFIG_USBDEV_ADVANCE_DESC + p = g_usbd_core[busid].descriptors->config_descriptor_callback(g_usbd_core[busid].speed); +#else + p = (uint8_t *)g_usbd_core[busid].descriptors; +#endif + /* configure endpoints for this configuration/altsetting */ + while (p[DESC_bLength] != 0U) { + switch (p[DESC_bDescriptorType]) { + case USB_DESCRIPTOR_TYPE_CONFIGURATION: + /* remember current configuration index */ + cur_config = p[CONF_DESC_bConfigurationValue]; + + if (cur_config == config_index) { + found = true; + + current_desc_len = 0; + desc_len = (p[CONF_DESC_wTotalLength]) | + (p[CONF_DESC_wTotalLength + 1] << 8); + } + + break; + + case USB_DESCRIPTOR_TYPE_INTERFACE: + /* remember current alternate setting */ + cur_alt_setting = + p[INTF_DESC_bAlternateSetting]; + break; + + case USB_DESCRIPTOR_TYPE_ENDPOINT: + if ((cur_config != config_index) || + (cur_alt_setting != alt_setting)) { + break; + } + + found = usbd_set_endpoint(busid, (struct usb_endpoint_descriptor *)p); + break; + + default: + break; + } + + /* skip to next descriptor */ + current_desc_len += p[DESC_bLength]; + p += p[DESC_bLength]; + if (current_desc_len >= desc_len && desc_len) { + break; + } + } + + return found; +} + +/** + * @brief set USB interface + * + * @param [in] busid busid + * @param [in] iface Interface index + * @param [in] alt_setting Alternate setting number + * + * @return true if successfully configured false if error or unconfigured + */ +static bool usbd_set_interface(uint8_t busid, uint8_t iface, uint8_t alt_setting) +{ + const uint8_t *if_desc = NULL; + struct usb_endpoint_descriptor *ep_desc; + uint8_t cur_alt_setting = 0xFF; + uint8_t cur_iface = 0xFF; + bool ret = false; + const uint8_t *p; + uint32_t desc_len = 0; + uint32_t current_desc_len = 0; + +#ifdef CONFIG_USBDEV_ADVANCE_DESC + p = g_usbd_core[busid].descriptors->config_descriptor_callback(g_usbd_core[busid].speed); +#else + p = (uint8_t *)g_usbd_core[busid].descriptors; +#endif + USB_LOG_DBG("iface %u alt_setting %u\r\n", iface, alt_setting); + + while (p[DESC_bLength] != 0U) { + switch (p[DESC_bDescriptorType]) { + case USB_DESCRIPTOR_TYPE_CONFIGURATION: + current_desc_len = 0; + desc_len = (p[CONF_DESC_wTotalLength]) | + (p[CONF_DESC_wTotalLength + 1] << 8); + + break; + + case USB_DESCRIPTOR_TYPE_INTERFACE: + /* remember current alternate setting */ + cur_alt_setting = p[INTF_DESC_bAlternateSetting]; + cur_iface = p[INTF_DESC_bInterfaceNumber]; + + if (cur_iface == iface && + cur_alt_setting == alt_setting) { + if_desc = (void *)p; + } + + break; + + case USB_DESCRIPTOR_TYPE_ENDPOINT: + if (cur_iface == iface) { + ep_desc = (struct usb_endpoint_descriptor *)p; + + if (alt_setting == 0) { + ret = usbd_reset_endpoint(busid, ep_desc); + } else if (cur_alt_setting == alt_setting) { + ret = usbd_set_endpoint(busid, ep_desc); + } else { + } + } + + break; + + default: + break; + } + + /* skip to next descriptor */ + current_desc_len += p[DESC_bLength]; + p += p[DESC_bLength]; + if (current_desc_len >= desc_len && desc_len) { + break; + } + } + + usbd_class_event_notify_handler(busid, USBD_EVENT_SET_INTERFACE, (void *)if_desc); + + return ret; +} + +/** + * @brief handle a standard device request + * + * @param [in] busid busid + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handled successfully + */ +static bool usbd_std_device_req_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + uint16_t value = setup->wValue; + bool ret = true; + + switch (setup->bRequest) { + case USB_REQUEST_GET_STATUS: + /* bit 0: self-powered */ + /* bit 1: remote wakeup */ + (*data)[0] = 0x00; + if (g_usbd_core[busid].self_powered) { + (*data)[0] |= USB_GETSTATUS_SELF_POWERED; + } + if (g_usbd_core[busid].remote_wakeup_enabled) { + (*data)[0] |= USB_GETSTATUS_REMOTE_WAKEUP; + } + (*data)[1] = 0x00; + *len = 2; + break; + + case USB_REQUEST_CLEAR_FEATURE: + case USB_REQUEST_SET_FEATURE: + if (value == USB_FEATURE_REMOTE_WAKEUP) { + if (setup->bRequest == USB_REQUEST_SET_FEATURE) { + g_usbd_core[busid].remote_wakeup_enabled = true; + g_usbd_core[busid].event_handler(busid, USBD_EVENT_SET_REMOTE_WAKEUP); + } else { + g_usbd_core[busid].remote_wakeup_enabled = false; + g_usbd_core[busid].event_handler(busid, USBD_EVENT_CLR_REMOTE_WAKEUP); + } + } else if (value == USB_FEATURE_TEST_MODE) { +#ifdef CONFIG_USBDEV_TEST_MODE + g_usbd_core[busid].test_req = true; +#endif + } + *len = 0; + break; + + case USB_REQUEST_SET_ADDRESS: + g_usbd_core[busid].device_address = value; + usbd_set_address(busid, value); + *len = 0; + break; + + case USB_REQUEST_GET_DESCRIPTOR: + ret = usbd_get_descriptor(busid, value, data, len); + break; + + case USB_REQUEST_SET_DESCRIPTOR: + ret = false; + break; + + case USB_REQUEST_GET_CONFIGURATION: + (*data)[0] = g_usbd_core[busid].configuration; + *len = 1; + break; + + case USB_REQUEST_SET_CONFIGURATION: + value &= 0xFF; + + if (value == 0) { + g_usbd_core[busid].configuration = 0; + } else if (!usbd_set_configuration(busid, value, 0)) { + ret = false; + } else { + g_usbd_core[busid].configuration = value; + g_usbd_core[busid].is_suspend = false; + usbd_class_event_notify_handler(busid, USBD_EVENT_CONFIGURED, NULL); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_CONFIGURED); + } + *len = 0; + break; + + case USB_REQUEST_GET_INTERFACE: + case USB_REQUEST_SET_INTERFACE: + ret = false; + break; + + default: + ret = false; + break; + } + + return ret; +} + +/** + * @brief handle a standard interface request + * + * @param [in] busid busid + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handled successfully + */ +static bool usbd_std_interface_req_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + uint8_t type = HI_BYTE(setup->wValue); + uint8_t intf_num = LO_BYTE(setup->wIndex); + bool ret = true; + const uint8_t *p; + uint32_t desc_len = 0; + uint32_t current_desc_len = 0; + uint8_t cur_iface = 0xFF; + +#ifdef CONFIG_USBDEV_ADVANCE_DESC + p = g_usbd_core[busid].descriptors->config_descriptor_callback(g_usbd_core[busid].speed); +#else + p = (uint8_t *)g_usbd_core[busid].descriptors; +#endif + + /* Only when device is configured, then interface requests can be valid. */ + if (!is_device_configured(busid)) { + return false; + } + + switch (setup->bRequest) { + case USB_REQUEST_GET_STATUS: + (*data)[0] = 0x00; + (*data)[1] = 0x00; + *len = 2; + break; + + case USB_REQUEST_GET_DESCRIPTOR: + if (type == 0x21) { /* HID_DESCRIPTOR_TYPE_HID */ + while (p[DESC_bLength] != 0U) { + switch (p[DESC_bDescriptorType]) { + case USB_DESCRIPTOR_TYPE_CONFIGURATION: + current_desc_len = 0; + desc_len = (p[CONF_DESC_wTotalLength]) | + (p[CONF_DESC_wTotalLength + 1] << 8); + + break; + + case USB_DESCRIPTOR_TYPE_INTERFACE: + cur_iface = p[INTF_DESC_bInterfaceNumber]; + break; + case 0x21: + if (cur_iface == intf_num) { + *data = (uint8_t *)p; + //memcpy(*data, p, p[DESC_bLength]); + *len = p[DESC_bLength]; + return true; + } + break; + default: + break; + } + + /* skip to next descriptor */ + current_desc_len += p[DESC_bLength]; + p += p[DESC_bLength]; + if (current_desc_len >= desc_len && desc_len) { + break; + } + } + } else if (type == 0x22) { /* HID_DESCRIPTOR_TYPE_HID_REPORT */ + for (uint8_t i = 0; i < g_usbd_core[busid].intf_offset; i++) { + struct usbd_interface *intf = g_usbd_core[busid].intf[i]; + + if (intf && (intf->intf_num == intf_num)) { + *data = (uint8_t *)intf->hid_report_descriptor; + //memcpy(*data, intf->hid_report_descriptor, intf->hid_report_descriptor_len); + *len = intf->hid_report_descriptor_len; + return true; + } + } + } + ret = false; + break; + case USB_REQUEST_CLEAR_FEATURE: + case USB_REQUEST_SET_FEATURE: + ret = false; + break; + case USB_REQUEST_GET_INTERFACE: + (*data)[0] = g_usbd_core[busid].intf_altsetting[intf_num]; + *len = 1; + break; + + case USB_REQUEST_SET_INTERFACE: + g_usbd_core[busid].intf_altsetting[intf_num] = LO_BYTE(setup->wValue); + usbd_set_interface(busid, setup->wIndex, setup->wValue); + *len = 0; + break; + + default: + ret = false; + break; + } + + return ret; +} + +/** + * @brief handle a standard endpoint request + * + * @param [in] busid busid + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handled successfully + */ +static bool usbd_std_endpoint_req_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + uint8_t ep = (uint8_t)setup->wIndex; + bool ret = true; + uint8_t stalled; + + /* Only when device is configured, then endpoint requests can be valid. */ + if (!is_device_configured(busid)) { + return false; + } + + switch (setup->bRequest) { + case USB_REQUEST_GET_STATUS: + usbd_ep_is_stalled(busid, ep, &stalled); + if (stalled) { + (*data)[0] = 0x01; + } else { + (*data)[0] = 0x00; + } + (*data)[1] = 0x00; + *len = 2; + break; + case USB_REQUEST_CLEAR_FEATURE: + if (setup->wValue == USB_FEATURE_ENDPOINT_HALT) { + USB_LOG_ERR("ep:%02x clear halt\r\n", ep); + + usbd_ep_clear_stall(busid, ep); + break; + } else { + ret = false; + } + *len = 0; + break; + case USB_REQUEST_SET_FEATURE: + if (setup->wValue == USB_FEATURE_ENDPOINT_HALT) { + USB_LOG_ERR("ep:%02x set halt\r\n", ep); + + usbd_ep_set_stall(busid, ep); + } else { + ret = false; + } + *len = 0; + break; + + case USB_REQUEST_SYNCH_FRAME: + ret = false; + break; + default: + ret = false; + break; + } + + return ret; +} + +/** + * @brief handle standard requests (list in chapter 9) + * + * @param [in] busid busid + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handled successfully + */ +static int usbd_standard_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + int rc = 0; + + switch (setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) { + case USB_REQUEST_RECIPIENT_DEVICE: + if (usbd_std_device_req_handler(busid, setup, data, len) == false) { + rc = -1; + } + + break; + + case USB_REQUEST_RECIPIENT_INTERFACE: + if (usbd_std_interface_req_handler(busid, setup, data, len) == false) { + rc = -1; + } + + break; + + case USB_REQUEST_RECIPIENT_ENDPOINT: + if (usbd_std_endpoint_req_handler(busid, setup, data, len) == false) { + rc = -1; + } + + break; + + default: + rc = -1; + break; + } + + return rc; +} + +/** + * @brief handler for class requests + * + * @param [in] busid busid + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handled successfully + */ +static int usbd_class_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + if ((setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) == USB_REQUEST_RECIPIENT_INTERFACE) { + for (uint8_t i = 0; i < g_usbd_core[busid].intf_offset; i++) { + struct usbd_interface *intf = g_usbd_core[busid].intf[i]; + + if (intf && intf->class_interface_handler && (intf->intf_num == (setup->wIndex & 0xFF))) { + return intf->class_interface_handler(busid, setup, data, len); + } + } + } else if ((setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) == USB_REQUEST_RECIPIENT_ENDPOINT) { + for (uint8_t i = 0; i < g_usbd_core[busid].intf_offset; i++) { + struct usbd_interface *intf = g_usbd_core[busid].intf[i]; + + if (intf && intf->class_endpoint_handler) { + return intf->class_endpoint_handler(busid, setup, data, len); + } + } + } + return -1; +} + +/** + * @brief handler for vendor requests + * + * @param [in] busid busid + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handled successfully + */ +static int usbd_vendor_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + uint32_t desclen; +#ifdef CONFIG_USBDEV_ADVANCE_DESC + if (g_usbd_core[busid].descriptors->msosv1_descriptor) { + if (setup->bRequest == g_usbd_core[busid].descriptors->msosv1_descriptor->vendor_code) { + switch (setup->wIndex) { + case 0x04: + desclen = g_usbd_core[busid].descriptors->msosv1_descriptor->compat_id[0] + + (g_usbd_core[busid].descriptors->msosv1_descriptor->compat_id[1] << 8) + + (g_usbd_core[busid].descriptors->msosv1_descriptor->compat_id[2] << 16) + + (g_usbd_core[busid].descriptors->msosv1_descriptor->compat_id[3] << 24); + + *data = (uint8_t *)g_usbd_core[busid].descriptors->msosv1_descriptor->compat_id; + //memcpy(*data, g_usbd_core[busid].descriptors->msosv1_descriptor->compat_id, desclen); + *len = desclen; + return 0; + case 0x05: + desclen = g_usbd_core[busid].descriptors->msosv1_descriptor->comp_id_property[setup->wValue][0] + + (g_usbd_core[busid].descriptors->msosv1_descriptor->comp_id_property[setup->wValue][1] << 8) + + (g_usbd_core[busid].descriptors->msosv1_descriptor->comp_id_property[setup->wValue][2] << 16) + + (g_usbd_core[busid].descriptors->msosv1_descriptor->comp_id_property[setup->wValue][3] << 24); + + *data = (uint8_t *)g_usbd_core[busid].descriptors->msosv1_descriptor->comp_id_property[setup->wValue]; + //memcpy(*data, g_usbd_core[busid].descriptors->msosv1_descriptor->comp_id_property[setup->wValue], desclen); + *len = desclen; + return 0; + default: + return -1; + } + } + } else if (g_usbd_core[busid].descriptors->msosv2_descriptor) { + if (setup->bRequest == g_usbd_core[busid].descriptors->msosv2_descriptor->vendor_code) { + switch (setup->wIndex) { + case WINUSB_REQUEST_GET_DESCRIPTOR_SET: + desclen = g_usbd_core[busid].descriptors->msosv2_descriptor->compat_id_len; + *data = (uint8_t *)g_usbd_core[busid].descriptors->msosv2_descriptor->compat_id; + //memcpy(*data, g_usbd_core[busid].descriptors->msosv2_descriptor->compat_id, desclen); + *len = g_usbd_core[busid].descriptors->msosv2_descriptor->compat_id_len; + return 0; + default: + return -1; + } + } + } + + if (g_usbd_core[busid].descriptors->webusb_url_descriptor) { + if (setup->bRequest == g_usbd_core[busid].descriptors->webusb_url_descriptor->vendor_code) { + switch (setup->wIndex) { + case WEBUSB_REQUEST_GET_URL: + desclen = g_usbd_core[busid].descriptors->webusb_url_descriptor->string_len; + *data = (uint8_t *)g_usbd_core[busid].descriptors->webusb_url_descriptor->string; + //memcpy(*data, g_usbd_core[busid].descriptors->webusb_url_descriptor->string, desclen); + *len = desclen; + return 0; + default: + return -1; + } + } + } +#else + if (g_usbd_core[busid].msosv1_desc) { + if (setup->bRequest == g_usbd_core[busid].msosv1_desc->vendor_code) { + switch (setup->wIndex) { + case 0x04: + *data = (uint8_t *)g_usbd_core[busid].msosv1_desc->compat_id; + desclen = g_usbd_core[busid].msosv1_desc->compat_id[0] + + (g_usbd_core[busid].msosv1_desc->compat_id[1] << 8) + + (g_usbd_core[busid].msosv1_desc->compat_id[2] << 16) + + (g_usbd_core[busid].msosv1_desc->compat_id[3] << 24); + //memcpy(*data, g_usbd_core[busid].msosv1_desc->compat_id, desclen); + *len = desclen; + return 0; + case 0x05: + *data = (uint8_t *)g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue]; + desclen = g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue][0] + + (g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue][1] << 8) + + (g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue][2] << 16) + + (g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue][3] << 24); + //memcpy(*data, g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue], desclen); + *len = desclen; + return 0; + default: + return -1; + } + } + } else if (g_usbd_core[busid].msosv2_desc) { + if (setup->bRequest == g_usbd_core[busid].msosv2_desc->vendor_code) { + switch (setup->wIndex) { + case WINUSB_REQUEST_GET_DESCRIPTOR_SET: + *data = (uint8_t *)g_usbd_core[busid].msosv2_desc->compat_id; + //memcpy(*data, g_usbd_core[busid].msosv2_desc->compat_id, g_usbd_core[busid].msosv2_desc->compat_id_len); + *len = g_usbd_core[busid].msosv2_desc->compat_id_len; + return 0; + default: + return -1; + } + } + } + + if (g_usbd_core[busid].webusb_url_desc) { + if (setup->bRequest == g_usbd_core[busid].webusb_url_desc->vendor_code) { + switch (setup->wIndex) { + case WEBUSB_REQUEST_GET_URL: + desclen = g_usbd_core[busid].webusb_url_desc->string_len; + *data = (uint8_t *)g_usbd_core[busid].webusb_url_desc->string; + //memcpy(*data, g_usbd_core[busid].webusb_url_desc->string, desclen); + *len = desclen; + return 0; + default: + return -1; + } + } + } +#endif + for (uint8_t i = 0; i < g_usbd_core[busid].intf_offset; i++) { + struct usbd_interface *intf = g_usbd_core[busid].intf[i]; + + if (intf && intf->vendor_handler && (intf->vendor_handler(busid, setup, data, len) == 0)) { + return 0; + } + } + + return -1; +} + +/** + * @brief handle setup request( standard/class/vendor/other) + * + * @param [in] busid busid + * @param [in] setup The setup packet + * @param [in,out] data Data buffer + * @param [in,out] len Pointer to data length + * + * @return true if the request was handles successfully + */ +static bool usbd_setup_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + switch (setup->bmRequestType & USB_REQUEST_TYPE_MASK) { + case USB_REQUEST_STANDARD: + if (usbd_standard_request_handler(busid, setup, data, len) < 0) { + /* Ignore error log for getting Device Qualifier Descriptor request */ + if ((setup->bRequest == 0x06) && (setup->wValue == 0x0600)) { + //USB_LOG_DBG("Ignore DQD in fs\r\n"); + return false; + } + USB_LOG_ERR("standard request error\r\n"); + usbd_print_setup(setup); + return false; + } + break; + case USB_REQUEST_CLASS: + if (usbd_class_request_handler(busid, setup, data, len) < 0) { + USB_LOG_ERR("class request error\r\n"); + usbd_print_setup(setup); + return false; + } + break; + case USB_REQUEST_VENDOR: + if (usbd_vendor_request_handler(busid, setup, data, len) < 0) { + USB_LOG_ERR("vendor request error\r\n"); + usbd_print_setup(setup); + return false; + } + break; + + default: + return false; + } + + return true; +} + +static void usbd_class_event_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + for (uint8_t i = 0; i < g_usbd_core[busid].intf_offset; i++) { + struct usbd_interface *intf = g_usbd_core[busid].intf[i]; + + if (arg) { + struct usb_interface_descriptor *desc = (struct usb_interface_descriptor *)arg; + if (intf && intf->notify_handler && (desc->bInterfaceNumber == (intf->intf_num))) { + intf->notify_handler(busid, event, arg); + } + } else { + if (intf && intf->notify_handler) { + intf->notify_handler(busid, event, arg); + } + } + } +} + +void usbd_event_sof_handler(uint8_t busid) +{ + g_usbd_core[busid].event_handler(busid, USBD_EVENT_SOF); +} + +void usbd_event_connect_handler(uint8_t busid) +{ + g_usbd_core[busid].event_handler(busid, USBD_EVENT_CONNECTED); +} + +void usbd_event_disconnect_handler(uint8_t busid) +{ + g_usbd_core[busid].configuration = 0; + g_usbd_core[busid].event_handler(busid, USBD_EVENT_DISCONNECTED); +} + +void usbd_event_resume_handler(uint8_t busid) +{ + g_usbd_core[busid].is_suspend = false; + g_usbd_core[busid].event_handler(busid, USBD_EVENT_RESUME); +} + +void usbd_event_suspend_handler(uint8_t busid) +{ + if (g_usbd_core[busid].device_address > 0) { + g_usbd_core[busid].is_suspend = true; + g_usbd_core[busid].event_handler(busid, USBD_EVENT_SUSPEND); + } +} + +void usbd_event_reset_handler(uint8_t busid) +{ + struct usb_endpoint_descriptor ep0; + + usbd_set_address(busid, 0); + g_usbd_core[busid].device_address = 0; + g_usbd_core[busid].configuration = 0; + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_SETUP; +#ifdef CONFIG_USBDEV_ADVANCE_DESC + g_usbd_core[busid].speed = USB_SPEED_UNKNOWN; + + USB_ASSERT_MSG(g_usbd_core[busid].descriptors->device_descriptor_callback != NULL, + "device_descriptor_callback is NULL\r\n"); + + struct usb_device_descriptor *device_desc = (struct usb_device_descriptor *)g_usbd_core[busid].descriptors->device_descriptor_callback(g_usbd_core[busid].speed); + ep0.wMaxPacketSize = device_desc->bMaxPacketSize0; +#else + ep0.wMaxPacketSize = USB_CTRL_EP_MPS; +#endif + + ep0.bLength = 7; + ep0.bDescriptorType = USB_DESCRIPTOR_TYPE_ENDPOINT; + ep0.bmAttributes = USB_ENDPOINT_TYPE_CONTROL; + ep0.bEndpointAddress = USB_CONTROL_IN_EP0; + ep0.bInterval = 0; + usbd_ep_open(busid, &ep0); + + ep0.bEndpointAddress = USB_CONTROL_OUT_EP0; + usbd_ep_open(busid, &ep0); + + usbd_class_event_notify_handler(busid, USBD_EVENT_RESET, NULL); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_RESET); +} + +static void __usbd_event_ep0_setup_complete_handler(uint8_t busid, struct usb_setup_packet *setup) +{ + uint8_t *buf; + + USB_LOG_DBG("[%s] 0x%02x 0x%02x 0x%04x 0x%04x 0x%04x\r\n", + usb_ep0_state_string[usbd_get_ep0_next_state(busid)], + setup->bmRequestType, + setup->bRequest, + setup->wValue, + setup->wIndex, + setup->wLength); + + if (setup->wLength > CONFIG_USBDEV_REQUEST_BUFFER_LEN) { + if ((setup->bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_OUT) { + USB_LOG_ERR("Request buffer too small\r\n"); + usbd_ep_set_stall(busid, USB_CONTROL_IN_EP0); + return; + } + } + + g_usbd_core[busid].ep0_data_buf = g_usbd_core[busid].req_data; + g_usbd_core[busid].ep0_data_buf_residue = setup->wLength; + g_usbd_core[busid].ep0_data_buf_len = setup->wLength; + g_usbd_core[busid].zlp_flag = false; + buf = g_usbd_core[busid].ep0_data_buf; + + /* handle class request when all the data is received */ + if (setup->wLength && ((setup->bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_OUT)) { + USB_LOG_DBG("Start reading %d bytes from ep0\r\n", setup->wLength); + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_OUT_DATA; + usbd_ep_start_read(busid, USB_CONTROL_OUT_EP0, g_usbd_core[busid].ep0_data_buf, setup->wLength); + return; + } + + /* Ask installed handler to process request */ + if (!usbd_setup_request_handler(busid, setup, &buf, &g_usbd_core[busid].ep0_data_buf_len)) { + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_SETUP; + usbd_ep_set_stall(busid, USB_CONTROL_IN_EP0); + return; + } + + /* Send smallest of requested and offered length */ + g_usbd_core[busid].ep0_data_buf_residue = MIN(g_usbd_core[busid].ep0_data_buf_len, setup->wLength); + if (g_usbd_core[busid].ep0_data_buf_residue > CONFIG_USBDEV_REQUEST_BUFFER_LEN) { + USB_LOG_ERR("Request buffer too small\r\n"); + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_SETUP; + usbd_ep_set_stall(busid, USB_CONTROL_IN_EP0); + return; + } + + /* use *data = xxx; g_usbd_core[busid].ep0_data_buf records real data address, we should copy data into ep0 buffer. + * Why we should copy once? because some chips are not access to flash with dma if real data address is in flash address(such as ch32). + */ + if (buf != g_usbd_core[busid].ep0_data_buf) { +#ifdef CONFIG_USBDEV_EP0_INDATA_NO_COPY + g_usbd_core[busid].ep0_data_buf = buf; +#else + usb_memcpy(g_usbd_core[busid].ep0_data_buf, buf, g_usbd_core[busid].ep0_data_buf_residue); +#endif + } else { + /* use memcpy(*data, xxx, len); has copied into ep0 buffer, we do nothing */ + } + + if (g_usbd_core[busid].ep0_data_buf_residue > 0) { + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_IN_DATA; + } else { + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_IN_STATUS; + } + + /* Send data or status to host */ + usbd_ep_start_write(busid, USB_CONTROL_IN_EP0, g_usbd_core[busid].ep0_data_buf, g_usbd_core[busid].ep0_data_buf_residue); + /* + * Set ZLP flag when host asks for a bigger length and the data size is + * multiplier of USB_CTRL_EP_MPS, to indicate the transfer done after zlp + * sent. + */ + if ((setup->wLength > g_usbd_core[busid].ep0_data_buf_len) && (!(g_usbd_core[busid].ep0_data_buf_len % USB_CTRL_EP_MPS))) { + g_usbd_core[busid].zlp_flag = true; + } +} + +void usbd_event_ep0_setup_complete_handler(uint8_t busid, uint8_t *psetup) +{ + struct usb_setup_packet *setup = &g_usbd_core[busid].setup; + + memcpy(setup, psetup, 8); + +#ifdef CONFIG_USBDEV_EP0_THREAD + usb_osal_mq_send(g_usbd_core[busid].usbd_ep0_mq, USB_EP0_STATE_SETUP); +#else + __usbd_event_ep0_setup_complete_handler(busid, setup); +#endif +} + +static void usbd_event_ep0_in_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + struct usb_setup_packet *setup = &g_usbd_core[busid].setup; + + (void)ep; + + g_usbd_core[busid].ep0_data_buf += nbytes; + g_usbd_core[busid].ep0_data_buf_residue -= nbytes; + + USB_LOG_DBG("[%s] in %d bytes, %d remained\r\n", + usb_ep0_state_string[usbd_get_ep0_next_state(busid)], + (unsigned int)nbytes, + (unsigned int)g_usbd_core[busid].ep0_data_buf_residue); + + if (g_usbd_core[busid].ep0_data_buf_residue != 0) { + /* Start sending the remain data */ + usbd_ep_start_write(busid, USB_CONTROL_IN_EP0, g_usbd_core[busid].ep0_data_buf, g_usbd_core[busid].ep0_data_buf_residue); + } else { + if (g_usbd_core[busid].zlp_flag == true) { + g_usbd_core[busid].zlp_flag = false; + /* Send zlp to host */ + USB_LOG_DBG("EP0 Send zlp\r\n"); + usbd_ep_start_write(busid, USB_CONTROL_IN_EP0, NULL, 0); + } else { + /* Satisfying three conditions will jump here. + * 1. send status completely + * 2. send zlp completely + * 3. send last data completely. + */ + if (setup->wLength && ((setup->bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_IN)) { + /* if all data has sent completely, start reading out status */ + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_OUT_STATUS; + usbd_ep_start_read(busid, USB_CONTROL_OUT_EP0, NULL, 0); + return; + } + + if (g_usbd_core[busid].ep0_next_state == USBD_EP0_STATE_IN_STATUS) { + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_SETUP; + } + +#ifdef CONFIG_USBDEV_TEST_MODE + if (g_usbd_core[busid].test_req) { + usbd_execute_test_mode(busid, HI_BYTE(setup->wIndex)); + g_usbd_core[busid].test_req = false; + } +#endif + } + } +} + +static void usbd_event_ep0_out_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + struct usb_setup_packet *setup = &g_usbd_core[busid].setup; + + (void)ep; + (void)setup; + + USB_LOG_DBG("[%s] out %d bytes, %d remained\r\n", + usb_ep0_state_string[usbd_get_ep0_next_state(busid)], + (unsigned int)nbytes, + (unsigned int)g_usbd_core[busid].ep0_data_buf_residue); + + if (nbytes > 0) { + g_usbd_core[busid].ep0_data_buf += nbytes; + g_usbd_core[busid].ep0_data_buf_residue -= nbytes; + + if (g_usbd_core[busid].ep0_data_buf_residue == 0) { +#ifdef CONFIG_USBDEV_EP0_THREAD + usb_osal_mq_send(g_usbd_core[busid].usbd_ep0_mq, USB_EP0_STATE_OUT); +#else + /* Received all, send data to handler */ + g_usbd_core[busid].ep0_data_buf = g_usbd_core[busid].req_data; + if (!usbd_setup_request_handler(busid, setup, &g_usbd_core[busid].ep0_data_buf, &g_usbd_core[busid].ep0_data_buf_len)) { + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_SETUP; + usbd_ep_set_stall(busid, USB_CONTROL_IN_EP0); + return; + } + + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_IN_STATUS; + /*Send status to host*/ + usbd_ep_start_write(busid, USB_CONTROL_IN_EP0, NULL, 0); +#endif + } else { + /* Start reading the remain data */ + usbd_ep_start_read(busid, USB_CONTROL_OUT_EP0, g_usbd_core[busid].ep0_data_buf, g_usbd_core[busid].ep0_data_buf_residue); + } + } else { + /* Read out status completely, do nothing */ + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_SETUP; + } +} + +void usbd_event_ep_in_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + if (g_usbd_core[busid].tx_msg[ep & 0x7f].cb) { + g_usbd_core[busid].tx_msg[ep & 0x7f].cb(busid, ep, nbytes); + } +} + +void usbd_event_ep_out_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + if (g_usbd_core[busid].rx_msg[ep & 0x7f].cb) { + g_usbd_core[busid].rx_msg[ep & 0x7f].cb(busid, ep, nbytes); + } +} + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +void usbd_desc_register(uint8_t busid, const struct usb_descriptor *desc) +{ + memset(&g_usbd_core[busid], 0, sizeof(struct usbd_core_priv)); + + g_usbd_core[busid].descriptors = desc; + g_usbd_core[busid].intf_offset = 0; + + g_usbd_core[busid].tx_msg[0].ep = 0x80; + g_usbd_core[busid].tx_msg[0].cb = usbd_event_ep0_in_complete_handler; + g_usbd_core[busid].rx_msg[0].ep = 0x00; + g_usbd_core[busid].rx_msg[0].cb = usbd_event_ep0_out_complete_handler; +} +#else +void usbd_desc_register(uint8_t busid, const uint8_t *desc) +{ + memset(&g_usbd_core[busid], 0, sizeof(struct usbd_core_priv)); + + g_usbd_core[busid].descriptors = desc; + g_usbd_core[busid].intf_offset = 0; + + g_usbd_core[busid].tx_msg[0].ep = 0x80; + g_usbd_core[busid].tx_msg[0].cb = usbd_event_ep0_in_complete_handler; + g_usbd_core[busid].rx_msg[0].ep = 0x00; + g_usbd_core[busid].rx_msg[0].cb = usbd_event_ep0_out_complete_handler; +} + +/* Register MS OS Descriptors version 1 */ +void usbd_msosv1_desc_register(uint8_t busid, struct usb_msosv1_descriptor *desc) +{ + g_usbd_core[busid].msosv1_desc = desc; +} + +/* Register MS OS Descriptors version 2 */ +void usbd_msosv2_desc_register(uint8_t busid, struct usb_msosv2_descriptor *desc) +{ + g_usbd_core[busid].msosv2_desc = desc; +} + +void usbd_bos_desc_register(uint8_t busid, struct usb_bos_descriptor *desc) +{ + g_usbd_core[busid].bos_desc = desc; +} + +void usbd_webusb_desc_register(uint8_t busid, struct usb_webusb_descriptor *desc) +{ + g_usbd_core[busid].webusb_url_desc = desc; +} +#endif + +void usbd_add_interface(uint8_t busid, struct usbd_interface *intf) +{ + intf->intf_num = g_usbd_core[busid].intf_offset; + g_usbd_core[busid].intf[g_usbd_core[busid].intf_offset] = intf; + g_usbd_core[busid].intf_offset++; +} + +void usbd_add_endpoint(uint8_t busid, struct usbd_endpoint *ep) +{ + if (ep->ep_addr & 0x80) { + g_usbd_core[busid].tx_msg[ep->ep_addr & 0x7f].ep = ep->ep_addr; + g_usbd_core[busid].tx_msg[ep->ep_addr & 0x7f].cb = ep->ep_cb; + } else { + g_usbd_core[busid].rx_msg[ep->ep_addr & 0x7f].ep = ep->ep_addr; + g_usbd_core[busid].rx_msg[ep->ep_addr & 0x7f].cb = ep->ep_cb; + } +} + +uint16_t usbd_get_ep_mps(uint8_t busid, uint8_t ep) +{ + if (ep & 0x80) { + return g_usbd_core[busid].tx_msg[ep & 0x7f].ep_mps; + } else { + return g_usbd_core[busid].rx_msg[ep & 0x7f].ep_mps; + } +} + +uint8_t usbd_get_ep_mult(uint8_t busid, uint8_t ep) +{ + if (ep & 0x80) { + return g_usbd_core[busid].tx_msg[ep & 0x7f].ep_mult; + } else { + return g_usbd_core[busid].rx_msg[ep & 0x7f].ep_mult; + } +} + +bool usb_device_is_configured(uint8_t busid) +{ + return g_usbd_core[busid].configuration; +} + +bool usb_device_is_suspend(uint8_t busid) +{ + return g_usbd_core[busid].is_suspend; +} + +int usbd_send_remote_wakeup(uint8_t busid) +{ + if (g_usbd_core[busid].remote_wakeup_support && g_usbd_core[busid].remote_wakeup_enabled && g_usbd_core[busid].is_suspend) { + return usbd_set_remote_wakeup(busid); + } else { + if (!g_usbd_core[busid].remote_wakeup_support) { + USB_LOG_ERR("device does not support remote wakeup\r\n"); + } + if (!g_usbd_core[busid].remote_wakeup_enabled) { + USB_LOG_ERR("device remote wakeup is not enabled\r\n"); + } + if (!g_usbd_core[busid].is_suspend) { + USB_LOG_ERR("device is not in suspend state\r\n"); + } + return -1; + } +} + +uint8_t usbd_get_ep0_next_state(uint8_t busid) +{ + return g_usbd_core[busid].ep0_next_state; +} + +#ifdef CONFIG_USBDEV_EP0_THREAD +static void usbdev_ep0_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + uintptr_t event; + int ret; + uint8_t busid = (uint8_t)CONFIG_USB_OSAL_THREAD_GET_ARGV; + struct usb_setup_packet *setup = &g_usbd_core[busid].setup; + + while (1) { + ret = usb_osal_mq_recv(g_usbd_core[busid].usbd_ep0_mq, (uintptr_t *)&event, USB_OSAL_WAITING_FOREVER); + if (ret < 0) { + continue; + } + USB_LOG_DBG("event:%d\r\n", (unsigned int)event); + + switch (event) { + case USB_EP0_STATE_SETUP: + __usbd_event_ep0_setup_complete_handler(busid, setup); + break; + case USB_EP0_STATE_IN: + // do nothing + break; + case USB_EP0_STATE_OUT: + /* Received all, send data to handler */ + g_usbd_core[busid].ep0_data_buf = g_usbd_core[busid].req_data; + if (!usbd_setup_request_handler(busid, setup, &g_usbd_core[busid].ep0_data_buf, &g_usbd_core[busid].ep0_data_buf_len)) { + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_SETUP; + usbd_ep_set_stall(busid, USB_CONTROL_IN_EP0); + continue; + } + + g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_IN_STATUS; + /*Send status to host*/ + usbd_ep_start_write(busid, USB_CONTROL_IN_EP0, NULL, 0); + break; + + default: + break; + } + } +} +#endif + +int usbd_initialize(uint8_t busid, uintptr_t reg_base, void (*event_handler)(uint8_t busid, uint8_t event)) +{ + int ret; + struct usbd_bus *bus; + + USB_ASSERT_MSG(busid < CONFIG_USBDEV_MAX_BUS, "bus overflow\r\n"); + + bus = &g_usbdev_bus[busid]; + bus->reg_base = reg_base; + +#ifdef CONFIG_USBDEV_EP0_THREAD + g_usbd_core[busid].usbd_ep0_mq = usb_osal_mq_create(1); + if (g_usbd_core[busid].usbd_ep0_mq == NULL) { + USB_LOG_ERR("No memory to alloc for g_usbd_core[busid].usbd_ep0_mq\r\n"); + while (1) { + } + } + g_usbd_core[busid].usbd_ep0_thread = usb_osal_thread_create("usbd_ep0", CONFIG_USBDEV_EP0_STACKSIZE, CONFIG_USBDEV_EP0_PRIO, usbdev_ep0_thread, (void *)(uint32_t)busid); + if (g_usbd_core[busid].usbd_ep0_thread == NULL) { + USB_LOG_ERR("No memory to alloc for g_usbd_core[busid].usbd_ep0_thread\r\n"); + while (1) { + } + } +#endif + + g_usbd_core[busid].event_handler = event_handler; + ret = usb_dc_init(busid); + usbd_class_event_notify_handler(busid, USBD_EVENT_INIT, NULL); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_INIT); + return ret; +} + +int usbd_deinitialize(uint8_t busid) +{ + USB_ASSERT_MSG(busid < CONFIG_USBDEV_MAX_BUS, "bus overflow\r\n"); + + g_usbd_core[busid].event_handler(busid, USBD_EVENT_DEINIT); + usbd_class_event_notify_handler(busid, USBD_EVENT_DEINIT, NULL); + usb_dc_deinit(busid); +#ifdef CONFIG_USBDEV_EP0_THREAD + if (g_usbd_core[busid].usbd_ep0_thread) { + usb_osal_thread_delete(g_usbd_core[busid].usbd_ep0_thread); + } + if (g_usbd_core[busid].usbd_ep0_mq) { + usb_osal_mq_delete(g_usbd_core[busid].usbd_ep0_mq); + } +#endif + + return 0; +} diff --git a/src/lib/CherryUSB/core/usbd_core.h b/src/lib/CherryUSB/core/usbd_core.h new file mode 100644 index 000000000..f03608bca --- /dev/null +++ b/src/lib/CherryUSB/core/usbd_core.h @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_CORE_H +#define USBD_CORE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +#include "usb_config.h" +#include "usb_util.h" +#include "usb_errno.h" +#include "usb_def.h" +#include "usb_list.h" +#include "usb_log.h" +#include "usb_dc.h" +#include "usb_osal.h" +#include "usb_memcpy.h" +#include "usb_dcache.h" +#include "usb_version.h" + +enum usbd_event_type { + /* USB DCD IRQ */ + USBD_EVENT_ERROR, /** USB error reported by the controller */ + USBD_EVENT_RESET, /** USB reset */ + USBD_EVENT_SOF, /** Start of Frame received */ + USBD_EVENT_CONNECTED, /** USB connected*/ + USBD_EVENT_DISCONNECTED, /** USB disconnected */ + USBD_EVENT_SUSPEND, /** USB connection suspended by the HOST */ + USBD_EVENT_RESUME, /** USB connection resumed by the HOST */ + + /* USB DEVICE STATUS */ + USBD_EVENT_CONFIGURED, /** USB configuration done */ + USBD_EVENT_SET_INTERFACE, /** USB interface selected */ + USBD_EVENT_SET_REMOTE_WAKEUP, /** USB set remote wakeup */ + USBD_EVENT_CLR_REMOTE_WAKEUP, /** USB clear remote wakeup */ + USBD_EVENT_INIT, /** USB init done when call usbd_initialize */ + USBD_EVENT_DEINIT, /** USB deinit done when call usbd_deinitialize */ + USBD_EVENT_UNKNOWN +}; + +#define USBD_EP0_STATE_SETUP 0 +#define USBD_EP0_STATE_IN_DATA 1 +#define USBD_EP0_STATE_OUT_DATA 2 +#define USBD_EP0_STATE_IN_STATUS 3 +#define USBD_EP0_STATE_OUT_STATUS 4 + +typedef int (*usbd_request_handler)(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len); +typedef void (*usbd_endpoint_callback)(uint8_t busid, uint8_t ep, uint32_t nbytes); +typedef void (*usbd_notify_handler)(uint8_t busid, uint8_t event, void *arg); +typedef void (*usbd_event_handler_t)(uint8_t busid, uint8_t event); + +struct usbd_endpoint { + uint8_t ep_addr; + usbd_endpoint_callback ep_cb; +}; + +struct usbd_interface { + usbd_request_handler class_interface_handler; + usbd_request_handler class_endpoint_handler; + usbd_request_handler vendor_handler; + usbd_notify_handler notify_handler; + const uint8_t *hid_report_descriptor; + uint32_t hid_report_descriptor_len; + uint8_t intf_num; +}; + +struct usb_descriptor { + const uint8_t *(*device_descriptor_callback)(uint8_t speed); + const uint8_t *(*config_descriptor_callback)(uint8_t speed); + const uint8_t *(*device_quality_descriptor_callback)(uint8_t speed); + const uint8_t *(*other_speed_descriptor_callback)(uint8_t speed); + const char *(*string_descriptor_callback)(uint8_t speed, uint8_t index); + const struct usb_msosv1_descriptor *msosv1_descriptor; + const struct usb_msosv2_descriptor *msosv2_descriptor; + const struct usb_webusb_descriptor *webusb_url_descriptor; + const struct usb_bos_descriptor *bos_descriptor; +}; + +struct usbd_bus { + uint8_t busid; + uintptr_t reg_base; +}; + +extern struct usbd_bus g_usbdev_bus[]; + +#ifdef USBD_IRQHandler +#error USBD_IRQHandler is obsolete, please call USBD_IRQHandler(xxx) in your irq +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +void usbd_desc_register(uint8_t busid, const struct usb_descriptor *desc); +#else +void usbd_desc_register(uint8_t busid, const uint8_t *desc); +void usbd_msosv1_desc_register(uint8_t busid, struct usb_msosv1_descriptor *desc); +void usbd_msosv2_desc_register(uint8_t busid, struct usb_msosv2_descriptor *desc); +void usbd_bos_desc_register(uint8_t busid, struct usb_bos_descriptor *desc); +void usbd_webusb_desc_register(uint8_t busid, struct usb_webusb_descriptor *desc); +#endif + +void usbd_add_interface(uint8_t busid, struct usbd_interface *intf); +void usbd_add_endpoint(uint8_t busid, struct usbd_endpoint *ep); + +uint16_t usbd_get_ep_mps(uint8_t busid, uint8_t ep); +uint8_t usbd_get_ep_mult(uint8_t busid, uint8_t ep); +bool usb_device_is_configured(uint8_t busid); +bool usb_device_is_suspend(uint8_t busid); +int usbd_send_remote_wakeup(uint8_t busid); +uint8_t usbd_get_ep0_next_state(uint8_t busid); + +int usbd_initialize(uint8_t busid, uintptr_t reg_base, usbd_event_handler_t event_handler); +int usbd_deinitialize(uint8_t busid); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_CORE_H */ diff --git a/src/lib/CherryUSB/core/usbh_core.c b/src/lib/CherryUSB/core/usbh_core.c new file mode 100644 index 000000000..84e8dee52 --- /dev/null +++ b/src/lib/CherryUSB/core/usbh_core.c @@ -0,0 +1,1192 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_core" +#include "usb_log.h" + +struct usbh_class_info *usbh_class_info_table_begin = NULL; +struct usbh_class_info *usbh_class_info_table_end = NULL; + +usb_slist_t g_bus_head = USB_SLIST_OBJECT_INIT(g_bus_head); + +struct setup_align_buffer { + uint8_t buffer[USB_ALIGN_UP(8, CONFIG_USB_ALIGN_SIZE)]; +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t ep0_request_buffer[CONFIG_USBHOST_MAX_BUS][USB_ALIGN_UP(CONFIG_USBHOST_REQUEST_BUFFER_LEN, CONFIG_USB_ALIGN_SIZE)]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX struct setup_align_buffer g_setup_buffer[CONFIG_USBHOST_MAX_BUS][CONFIG_USBHOST_MAX_EXTHUBS + 1][CONFIG_USBHOST_MAX_EHPORTS]; + +struct usbh_bus g_usbhost_bus[CONFIG_USBHOST_MAX_BUS]; + +/* general descriptor field offsets */ +#define DESC_bLength 0 /** Length offset */ +#define DESC_bDescriptorType 1 /** Descriptor type offset */ + +#define USB_DEV_ADDR_MAX 0x7f +#define USB_DEV_ADDR_MARK_OFFSET 5 +#define USB_DEV_ADDR_MARK_MASK 0x1f + +static int usbh_allocate_devaddr(struct usbh_devaddr_map *devgen) +{ + uint8_t lastaddr = devgen->last; + uint8_t devaddr = lastaddr; + int index; + int bitno; + + for (;;) { + devaddr++; + if (devaddr > 0x7f) { + devaddr = 2; + } + if (devaddr == lastaddr) { + return -USB_ERR_NOMEM; + } + + index = devaddr >> 5; + bitno = devaddr & 0x1f; + if ((devgen->alloctab[index] & (1ul << bitno)) == 0) { + devgen->alloctab[index] |= (1ul << bitno); + devgen->last = devaddr; + return (int)devaddr; + } + } +} + +static int __usbh_free_devaddr(struct usbh_devaddr_map *devgen, uint8_t devaddr) +{ + int index; + int bitno; + + if ((devaddr > 0) && (devaddr < USB_DEV_ADDR_MAX)) { + index = devaddr >> USB_DEV_ADDR_MARK_OFFSET; + bitno = devaddr & USB_DEV_ADDR_MARK_MASK; + + /* Free the address */ + if ((devgen->alloctab[index] & (1ul << bitno)) != 0) { + devgen->alloctab[index] &= ~(1ul << bitno); + } else { + return -1; + } + } + + return 0; +} + +static int usbh_free_devaddr(struct usbh_hubport *hport) +{ + if (hport->dev_addr > 0) { + __usbh_free_devaddr(&hport->bus->devgen, hport->dev_addr); + } + return 0; +} + +static const struct usbh_class_driver *usbh_find_class_driver(uint8_t class, uint8_t subclass, uint8_t protocol, uint8_t intf, + uint16_t vid, uint16_t pid) +{ + struct usbh_class_info *index = NULL; + + for (index = usbh_class_info_table_begin; index < usbh_class_info_table_end; index++) { + if ((index->match_flags & USB_CLASS_MATCH_INTF_CLASS) && !(index->bInterfaceClass == class)) { + continue; + } + if ((index->match_flags & USB_CLASS_MATCH_INTF_SUBCLASS) && !(index->bInterfaceSubClass == subclass)) { + continue; + } + if ((index->match_flags & USB_CLASS_MATCH_INTF_PROTOCOL) && !(index->bInterfaceProtocol == protocol)) { + continue; + } + if ((index->match_flags & USB_CLASS_MATCH_INTF_NUM) && !(index->bInterfaceNumber == intf)) { + continue; + } + if (index->match_flags & USB_CLASS_MATCH_VID_PID && index->id_table) { + /* scan id table */ + uint32_t i; + for (i = 0; index->id_table[i][0]; i++) { + if (index->id_table[i][0] == vid && index->id_table[i][1] == pid) { + break; + } + } + /* do not match, continue next */ + if (!index->id_table[i][0]) { + continue; + } + } + return index->class_driver; + } + return NULL; +} + +static int parse_device_descriptor(struct usbh_hubport *hport, struct usb_device_descriptor *desc, uint16_t length) +{ + if (desc->bLength != USB_SIZEOF_DEVICE_DESC) { + USB_LOG_ERR("invalid device bLength 0x%02x\r\n", desc->bLength); + return -USB_ERR_INVAL; + } else if (desc->bDescriptorType != USB_DESCRIPTOR_TYPE_DEVICE) { + USB_LOG_ERR("unexpected device descriptor 0x%02x\r\n", desc->bDescriptorType); + return -USB_ERR_INVAL; + } else { + if (length <= 8) { + return 0; + } +#if 0 + USB_LOG_DBG("Device Descriptor:\r\n"); + USB_LOG_DBG("bLength: 0x%02x \r\n", desc->bLength); + USB_LOG_DBG("bDescriptorType: 0x%02x \r\n", desc->bDescriptorType); + USB_LOG_DBG("bcdUSB: 0x%04x \r\n", desc->bcdUSB); + USB_LOG_DBG("bDeviceClass: 0x%02x \r\n", desc->bDeviceClass); + USB_LOG_DBG("bDeviceSubClass: 0x%02x \r\n", desc->bDeviceSubClass); + USB_LOG_DBG("bDeviceProtocol: 0x%02x \r\n", desc->bDeviceProtocol); + USB_LOG_DBG("bMaxPacketSize0: 0x%02x \r\n", desc->bMaxPacketSize0); + USB_LOG_DBG("idVendor: 0x%04x \r\n", desc->idVendor); + USB_LOG_DBG("idProduct: 0x%04x \r\n", desc->idProduct); + USB_LOG_DBG("bcdDevice: 0x%04x \r\n", desc->bcdDevice); + USB_LOG_DBG("iManufacturer: 0x%02x \r\n", desc->iManufacturer); + USB_LOG_DBG("iProduct: 0x%02x \r\n", desc->iProduct); + USB_LOG_DBG("iSerialNumber: 0x%02x \r\n", desc->iSerialNumber); + USB_LOG_DBG("bNumConfigurations: 0x%02x\r\n", desc->bNumConfigurations); +#endif + hport->device_desc.bLength = desc->bLength; + hport->device_desc.bDescriptorType = desc->bDescriptorType; + hport->device_desc.bcdUSB = desc->bcdUSB; + hport->device_desc.bDeviceClass = desc->bDeviceClass; + hport->device_desc.bDeviceSubClass = desc->bDeviceSubClass; + hport->device_desc.bDeviceProtocol = desc->bDeviceProtocol; + hport->device_desc.bMaxPacketSize0 = desc->bMaxPacketSize0; + hport->device_desc.idVendor = desc->idVendor; + hport->device_desc.idProduct = desc->idProduct; + hport->device_desc.bcdDevice = desc->bcdDevice; + hport->device_desc.iManufacturer = desc->iManufacturer; + hport->device_desc.iProduct = desc->iProduct; + hport->device_desc.iSerialNumber = desc->iSerialNumber; + hport->device_desc.bNumConfigurations = desc->bNumConfigurations; + } + return 0; +} + +static int parse_config_descriptor(struct usbh_hubport *hport, struct usb_configuration_descriptor *desc, uint16_t length) +{ + struct usb_interface_descriptor *intf_desc; + struct usb_endpoint_descriptor *ep_desc; + uint8_t cur_alt_setting = 0xff; + uint8_t cur_iface = 0xff; + uint8_t cur_ep = 0xff; + uint8_t cur_ep_num = 0xff; + uint32_t desc_len = 0; + uint8_t *p; + + if (desc->bLength != USB_SIZEOF_CONFIG_DESC) { + USB_LOG_ERR("invalid config bLength 0x%02x\r\n", desc->bLength); + return -USB_ERR_INVAL; + } else if (desc->bDescriptorType != USB_DESCRIPTOR_TYPE_CONFIGURATION) { + USB_LOG_ERR("unexpected config descriptor 0x%02x\r\n", desc->bDescriptorType); + return -USB_ERR_INVAL; + } else { + if (length <= USB_SIZEOF_CONFIG_DESC) { + return 0; + } +#if 0 + USB_LOG_DBG("Config Descriptor:\r\n"); + USB_LOG_DBG("bLength: 0x%02x \r\n", desc->bLength); + USB_LOG_DBG("bDescriptorType: 0x%02x \r\n", desc->bDescriptorType); + USB_LOG_DBG("wTotalLength: 0x%04x \r\n", desc->wTotalLength); + USB_LOG_DBG("bNumInterfaces: 0x%02x \r\n", desc->bNumInterfaces); + USB_LOG_DBG("bConfigurationValue: 0x%02x \r\n", desc->bConfigurationValue); + USB_LOG_DBG("iConfiguration: 0x%02x \r\n", desc->iConfiguration); + USB_LOG_DBG("bmAttributes: 0x%02x \r\n", desc->bmAttributes); + USB_LOG_DBG("bMaxPower: 0x%02x \r\n", desc->bMaxPower); +#endif + hport->config.config_desc.bLength = desc->bLength; + hport->config.config_desc.bDescriptorType = desc->bDescriptorType; + hport->config.config_desc.wTotalLength = desc->wTotalLength; + hport->config.config_desc.bNumInterfaces = desc->bNumInterfaces; + hport->config.config_desc.bConfigurationValue = desc->bConfigurationValue; + hport->config.config_desc.iConfiguration = desc->iConfiguration; + hport->config.config_desc.iConfiguration = desc->iConfiguration; + hport->config.config_desc.bmAttributes = desc->bmAttributes; + hport->config.config_desc.bMaxPower = desc->bMaxPower; + + p = (uint8_t *)desc; + p += USB_SIZEOF_CONFIG_DESC; + desc_len = USB_SIZEOF_CONFIG_DESC; + + memset(hport->config.intf, 0, sizeof(struct usbh_interface) * CONFIG_USBHOST_MAX_INTERFACES); + + while (p[DESC_bLength] && (desc_len <= length)) { + switch (p[DESC_bDescriptorType]) { + case USB_DESCRIPTOR_TYPE_INTERFACE: + intf_desc = (struct usb_interface_descriptor *)p; + cur_iface = intf_desc->bInterfaceNumber; + cur_alt_setting = intf_desc->bAlternateSetting; + cur_ep_num = intf_desc->bNumEndpoints; + cur_ep = 0; + + if (cur_iface >= CONFIG_USBHOST_MAX_INTERFACES) { + USB_LOG_ERR("Interface num %d overflow\r\n", cur_iface); + return -USB_ERR_NOMEM; + } + + if (cur_ep_num >= CONFIG_USBHOST_MAX_ENDPOINTS) { + USB_LOG_ERR("Endpoint num %d overflow\r\n", cur_ep_num); + return -USB_ERR_NOMEM; + } + + if (cur_alt_setting >= CONFIG_USBHOST_MAX_INTF_ALTSETTINGS) { + USB_LOG_ERR("Interface altsetting num %d overflow\r\n", cur_alt_setting); + return -USB_ERR_NOMEM; + } + +#if 0 + USB_LOG_DBG("Interface Descriptor:\r\n"); + USB_LOG_DBG("bLength: 0x%02x \r\n", intf_desc->bLength); + USB_LOG_DBG("bDescriptorType: 0x%02x \r\n", intf_desc->bDescriptorType); + USB_LOG_DBG("bInterfaceNumber: 0x%02x \r\n", intf_desc->bInterfaceNumber); + USB_LOG_DBG("bAlternateSetting: 0x%02x \r\n", intf_desc->bAlternateSetting); + USB_LOG_DBG("bNumEndpoints: 0x%02x \r\n", intf_desc->bNumEndpoints); + USB_LOG_DBG("bInterfaceClass: 0x%02x \r\n", intf_desc->bInterfaceClass); + USB_LOG_DBG("bInterfaceSubClass: 0x%02x \r\n", intf_desc->bInterfaceSubClass); + USB_LOG_DBG("bInterfaceProtocol: 0x%02x \r\n", intf_desc->bInterfaceProtocol); + USB_LOG_DBG("iInterface: 0x%02x \r\n", intf_desc->iInterface); +#endif + memcpy(&hport->config.intf[cur_iface].altsetting[cur_alt_setting].intf_desc, intf_desc, 9); + hport->config.intf[cur_iface].altsetting_num = cur_alt_setting + 1; + break; + case USB_DESCRIPTOR_TYPE_ENDPOINT: + ep_desc = (struct usb_endpoint_descriptor *)p; + memcpy(&hport->config.intf[cur_iface].altsetting[cur_alt_setting].ep[cur_ep].ep_desc, ep_desc, 7); + cur_ep++; + break; + + default: + break; + } + /* skip to next descriptor */ + p += p[DESC_bLength]; + desc_len += p[DESC_bLength]; + } + } + return 0; +} + +static void usbh_print_setup(struct usb_setup_packet *setup) +{ + (void)setup; + + USB_LOG_DBG("Setup: " + "bmRequestType 0x%02x, bRequest 0x%02x, wValue 0x%04x, wIndex 0x%04x, wLength 0x%04x\r\n", + setup->bmRequestType, + setup->bRequest, + setup->wValue, + setup->wIndex, + setup->wLength); +} + +static int usbh_get_default_mps(int speed) +{ + switch (speed) { + case USB_SPEED_LOW: /* For low speed, we use 8 bytes */ + return 8; + case USB_SPEED_FULL: /* For full or high speed, we use 64 bytes */ + case USB_SPEED_HIGH: + return 64; + case USB_SPEED_SUPER: /* For super speed , we must use 512 bytes */ + case USB_SPEED_SUPER_PLUS: + return 512; + default: + return 64; + } +} + +int usbh_enumerate(struct usbh_hubport *hport) +{ + struct usb_interface_descriptor *intf_desc; + struct usb_setup_packet *setup; + struct usb_device_descriptor *dev_desc; + struct usb_endpoint_descriptor *ep; + int dev_addr; + uint16_t ep_mps; + uint8_t config_value; + uint8_t config_index; + int ret; + + hport->setup = (struct usb_setup_packet *)&g_setup_buffer[hport->bus->busid][hport->parent->index - 1][hport->port - 1]; + setup = hport->setup; + ep = &hport->ep0; + + /* Config EP0 mps from speed */ + ep->bEndpointAddress = 0x00; + ep->bDescriptorType = USB_DESCRIPTOR_TYPE_ENDPOINT; + ep->bmAttributes = USB_ENDPOINT_TYPE_CONTROL; + ep->wMaxPacketSize = usbh_get_default_mps(hport->speed); + ep->bInterval = 0; + ep->bLength = 7; + + /* Configure EP0 with zero address */ + hport->dev_addr = 0; + + /* Read the first 8 bytes of the device descriptor */ + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; + setup->wValue = (uint16_t)((USB_DESCRIPTOR_TYPE_DEVICE << 8) | 0); + setup->wIndex = 0; + setup->wLength = 8; + + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); + if (ret < 0) { + USB_LOG_ERR("Failed to get device descriptor,errorcode:%d\r\n", ret); + goto errout; + } + + ret = parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid], 8); + if (ret < 0) { + USB_LOG_ERR("Parse device descriptor fail\r\n"); + goto errout; + } + + /* Extract the correct max packetsize from the device descriptor */ + dev_desc = (struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid]; + if (dev_desc->bcdUSB >= USB_3_0) { + ep_mps = 1 << dev_desc->bMaxPacketSize0; + } else { + ep_mps = dev_desc->bMaxPacketSize0; + } + + USB_LOG_DBG("Device rev=%04x cls=%02x sub=%02x proto=%02x size=%d\r\n", + dev_desc->bcdUSB, dev_desc->bDeviceClass, dev_desc->bDeviceSubClass, + dev_desc->bDeviceProtocol, ep_mps); + + /* Reconfigure EP0 with the correct maximum packet size */ + ep->wMaxPacketSize = ep_mps; + + /* Assign a function address to the device connected to this port */ + dev_addr = usbh_allocate_devaddr(&hport->bus->devgen); + if (dev_addr < 0) { + USB_LOG_ERR("Failed to allocate devaddr,errorcode:%d\r\n", ret); + goto errout; + } + + /* Set the USB device address */ + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = USB_REQUEST_SET_ADDRESS; + setup->wValue = dev_addr; + setup->wIndex = 0; + setup->wLength = 0; + + ret = usbh_control_transfer(hport, setup, NULL); + if (ret < 0) { + USB_LOG_ERR("Failed to set devaddr,errorcode:%d\r\n", ret); + goto errout; + } + + /* Wait device set address completely */ + usb_osal_msleep(10); + + /*Reconfigure EP0 with the correct address */ + hport->dev_addr = dev_addr; + + /* Read the full device descriptor */ + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; + setup->wValue = (uint16_t)((USB_DESCRIPTOR_TYPE_DEVICE << 8) | 0); + setup->wIndex = 0; + setup->wLength = USB_SIZEOF_DEVICE_DESC; + + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); + if (ret < 0) { + USB_LOG_ERR("Failed to get full device descriptor,errorcode:%d\r\n", ret); + goto errout; + } + + parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid], USB_SIZEOF_DEVICE_DESC); + USB_LOG_INFO("New device found,idVendor:%04x,idProduct:%04x,bcdDevice:%04x\r\n", + ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->idVendor, + ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->idProduct, + ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->bcdDevice); + + USB_LOG_INFO("The device has %d bNumConfigurations\r\n", ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->bNumConfigurations); + + config_index = usbh_get_hport_active_config_index(hport); + USB_LOG_DBG("The device selects config %d\r\n", config_index); + + /* Read the first 9 bytes of the config descriptor */ + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; + setup->wValue = (uint16_t)((USB_DESCRIPTOR_TYPE_CONFIGURATION << 8) | config_index); + setup->wIndex = 0; + setup->wLength = USB_SIZEOF_CONFIG_DESC; + + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); + if (ret < 0) { + USB_LOG_ERR("Failed to get config descriptor,errorcode:%d\r\n", ret); + goto errout; + } + + ret = parse_config_descriptor(hport, (struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid], USB_SIZEOF_CONFIG_DESC); + if (ret < 0) { + USB_LOG_ERR("Parse config descriptor fail\r\n"); + goto errout; + } + + /* Read the full size of the configuration data */ + uint16_t wTotalLength = ((struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid])->wTotalLength; + + if (wTotalLength > CONFIG_USBHOST_REQUEST_BUFFER_LEN) { + ret = -USB_ERR_NOMEM; + USB_LOG_ERR("wTotalLength %d is overflow, default is %d\r\n", wTotalLength, (unsigned int)CONFIG_USBHOST_REQUEST_BUFFER_LEN); + goto errout; + } + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; + setup->wValue = (uint16_t)((USB_DESCRIPTOR_TYPE_CONFIGURATION << 8) | config_index); + setup->wIndex = 0; + setup->wLength = wTotalLength; + + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); + if (ret < 0) { + USB_LOG_ERR("Failed to get full config descriptor,errorcode:%d\r\n", ret); + goto errout; + } + + ret = parse_config_descriptor(hport, (struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid], wTotalLength); + if (ret < 0) { + USB_LOG_ERR("Parse config descriptor fail\r\n"); + goto errout; + } + + USB_LOG_INFO("The device has %d interfaces\r\n", ((struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid])->bNumInterfaces); + hport->raw_config_desc = usb_osal_malloc(wTotalLength + 1); + if (hport->raw_config_desc == NULL) { + ret = -USB_ERR_NOMEM; + USB_LOG_ERR("No memory to alloc for raw_config_desc\r\n"); + goto errout; + } + + config_value = ((struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid])->bConfigurationValue; + memcpy(hport->raw_config_desc, ep0_request_buffer[hport->bus->busid], wTotalLength); + hport->raw_config_desc[wTotalLength] = '\0'; + +#ifdef CONFIG_USBHOST_GET_STRING_DESC + uint8_t string_buffer[128]; + + if (hport->device_desc.iManufacturer > 0) { + /* Get Manufacturer string */ + memset(string_buffer, 0, 128); + ret = usbh_get_string_desc(hport, USB_STRING_MFC_INDEX, string_buffer, 128); + if (ret < 0) { + USB_LOG_ERR("Failed to get Manufacturer string,errorcode:%d\r\n", ret); + goto errout; + } + + USB_LOG_INFO("Manufacturer: %s\r\n", string_buffer); + } else { + USB_LOG_WRN("Do not support Manufacturer string\r\n"); + } + + if (hport->device_desc.iProduct > 0) { + /* Get Product string */ + memset(string_buffer, 0, 128); + ret = usbh_get_string_desc(hport, USB_STRING_PRODUCT_INDEX, string_buffer, 128); + if (ret < 0) { + USB_LOG_ERR("Failed to get Product string,errorcode:%d\r\n", ret); + goto errout; + } + + USB_LOG_INFO("Product: %s\r\n", string_buffer); + } else { + USB_LOG_WRN("Do not support Product string\r\n"); + } + + if (hport->device_desc.iSerialNumber > 0) { + /* Get SerialNumber string */ + memset(string_buffer, 0, 128); + ret = usbh_get_string_desc(hport, USB_STRING_SERIAL_INDEX, string_buffer, 128); + if (ret < 0) { + USB_LOG_ERR("Failed to get SerialNumber string,errorcode:%d\r\n", ret); + goto errout; + } + + USB_LOG_INFO("SerialNumber: %s\r\n", string_buffer); + } else { + USB_LOG_WRN("Do not support SerialNumber string\r\n"); + } +#endif + /* Select device configuration 1 */ + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = USB_REQUEST_SET_CONFIGURATION; + setup->wValue = config_value; + setup->wIndex = 0; + setup->wLength = 0; + + ret = usbh_control_transfer(hport, setup, NULL); + if (ret < 0) { + USB_LOG_ERR("Failed to set configuration,errorcode:%d\r\n", ret); + goto errout; + } + +#ifdef CONFIG_USBHOST_MSOS_ENABLE + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = CONFIG_USBHOST_MSOS_VENDOR_CODE; + setup->wValue = 0; + setup->wIndex = 0x0004; + setup->wLength = 16; + + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); + if (ret < 0 && (ret != -USB_ERR_STALL)) { + USB_LOG_ERR("Failed to get msosv1 compat id,errorcode:%d\r\n", ret); + goto errout; + } +#endif + USB_LOG_INFO("Enumeration success, start loading class driver\r\n"); + /*search supported class driver*/ + for (uint8_t i = 0; i < hport->config.config_desc.bNumInterfaces; i++) { + intf_desc = &hport->config.intf[i].altsetting[0].intf_desc; + + USB_ASSERT_MSG(intf_desc->bInterfaceNumber == i, "Interface number mismatch, do not support non-standard device\r\n"); + + struct usbh_class_driver *class_driver = (struct usbh_class_driver *)usbh_find_class_driver(intf_desc->bInterfaceClass, + intf_desc->bInterfaceSubClass, + intf_desc->bInterfaceProtocol, + intf_desc->bInterfaceNumber, + hport->device_desc.idVendor, + hport->device_desc.idProduct); + + if (class_driver == NULL) { + USB_LOG_ERR("Do not support Class:0x%02x, Subclass:0x%02x, Protocl:0x%02x on interface %u\r\n", + intf_desc->bInterfaceClass, + intf_desc->bInterfaceSubClass, + intf_desc->bInterfaceProtocol, + i); + continue; + } + hport->config.intf[i].class_driver = class_driver; + USB_LOG_INFO("Loading %s class driver on interface %u\r\n", class_driver->driver_name, i); + ret = CLASS_CONNECT(hport, i); + } + +errout: + if (hport->raw_config_desc) { + usb_osal_free(hport->raw_config_desc); + hport->raw_config_desc = NULL; + } + return ret; +} + +void usbh_hubport_release(struct usbh_hubport *hport) +{ + if (hport->connected) { + hport->connected = false; + usbh_kill_urb(&hport->ep0_urb); + usbh_free_devaddr(hport); + for (uint8_t i = 0; i < hport->config.config_desc.bNumInterfaces; i++) { + if (hport->config.intf[i].class_driver && hport->config.intf[i].class_driver->disconnect) { + CLASS_DISCONNECT(hport, i); + } + } + hport->config.config_desc.bNumInterfaces = 0; + if (hport->mutex) { + usb_osal_mutex_delete(hport->mutex); + } + } +} + +static void usbh_bus_init(struct usbh_bus *bus, uint8_t busid, uintptr_t reg_base) +{ + memset(bus, 0, sizeof(struct usbh_bus)); + bus->busid = busid; + bus->hcd.hcd_id = busid; + bus->hcd.reg_base = reg_base; + + /* devaddr 1 is for roothub */ + bus->devgen.last = 0x7f; + + usb_slist_add_tail(&g_bus_head, &bus->list); +} + +int usbh_initialize(uint8_t busid, uintptr_t reg_base) +{ + struct usbh_bus *bus; + + USB_ASSERT_MSG(busid < CONFIG_USBHOST_MAX_BUS, "bus overflow\r\n"); + + bus = &g_usbhost_bus[busid]; + + usbh_bus_init(bus, busid, reg_base); + +#ifdef __ARMCC_VERSION /* ARM C Compiler */ + extern const int usbh_class_info$$Base; + extern const int usbh_class_info$$Limit; + usbh_class_info_table_begin = (struct usbh_class_info *)&usbh_class_info$$Base; + usbh_class_info_table_end = (struct usbh_class_info *)&usbh_class_info$$Limit; +#elif defined(__GNUC__) + extern uint32_t __usbh_class_info_start__; + extern uint32_t __usbh_class_info_end__; + usbh_class_info_table_begin = (struct usbh_class_info *)&__usbh_class_info_start__; + usbh_class_info_table_end = (struct usbh_class_info *)&__usbh_class_info_end__; +#elif defined(__ICCARM__) || defined(__ICCRX__) || defined(__ICCRISCV__) + usbh_class_info_table_begin = (struct usbh_class_info *)__section_begin(".usbh_class_info"); + usbh_class_info_table_end = (struct usbh_class_info *)__section_end(".usbh_class_info"); +#endif + usbh_hub_initialize(bus); + return 0; +} + +int usbh_deinitialize(uint8_t busid) +{ + struct usbh_bus *bus; + + USB_ASSERT_MSG(busid < CONFIG_USBHOST_MAX_BUS, "bus overflow\r\n"); + + bus = &g_usbhost_bus[busid]; + + usbh_hub_deinitialize(bus); + + usb_slist_remove(&g_bus_head, &bus->list); + + return 0; +} + +int usbh_control_transfer(struct usbh_hubport *hport, struct usb_setup_packet *setup, uint8_t *buffer) +{ + struct usbh_urb *urb; + volatile uint8_t retry = 3; + int ret; + + if (!hport || !setup) { + return -USB_ERR_INVAL; + } + + urb = &hport->ep0_urb; + + usb_osal_mutex_take(hport->mutex); + + usbh_print_setup(setup); + +resubmit: + usbh_control_urb_fill(urb, hport, setup, buffer, setup->wLength, CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + + if (ret < 0 && (ret != -USB_ERR_TIMEOUT)) { + retry--; + if (retry > 0) { + USB_LOG_WRN("Control transfer failed, errorcode %d, retrying...\r\n", ret); + goto resubmit; + } + } + + usb_osal_mutex_give(hport->mutex); + return ret; +} + +int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *output, uint16_t output_len) +{ + struct usb_setup_packet *setup = hport->setup; + int ret; + uint8_t *src; + uint8_t *dst; + uint16_t len; + uint16_t i = 2; + uint16_t j = 0; + + /* Get Manufacturer string */ + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; + setup->wValue = (uint16_t)((USB_DESCRIPTOR_TYPE_STRING << 8) | index); + setup->wIndex = 0x0409; + setup->wLength = 255; + + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); + if (ret < 0) { + return ret; + } + + src = ep0_request_buffer[hport->bus->busid]; + dst = output; + len = src[0]; + + if (((len - 2) / 2) > output_len) { + return -USB_ERR_NOMEM; + } + + while (i < len) { + dst[j] = src[i]; + i += 2; + j++; + } + + return 0; +} + +int usbh_set_interface(struct usbh_hubport *hport, uint8_t intf, uint8_t altsetting) +{ + struct usb_setup_packet *setup = hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = USB_REQUEST_SET_INTERFACE; + setup->wValue = altsetting; + setup->wIndex = intf; + setup->wLength = 0; + + return usbh_control_transfer(hport, setup, NULL); +} + +static void *usbh_list_all_interface_name(struct usbh_hub *hub, const char *devname) +{ + struct usbh_hubport *hport; + struct usbh_hub *hub_next; + void *priv; + + for (uint8_t port = 0; port < hub->nports; port++) { + hport = &hub->child[port]; + if (hport->connected) { + for (uint8_t itf = 0; itf < hport->config.config_desc.bNumInterfaces; itf++) { + if (hport->config.intf[itf].class_driver && hport->config.intf[itf].class_driver->driver_name) { + if ((strncmp(hport->config.intf[itf].devname, devname, CONFIG_USBHOST_DEV_NAMELEN) == 0) && hport->config.intf[itf].priv) + return hport->config.intf[itf].priv; + + if (strcmp(hport->config.intf[itf].class_driver->driver_name, "hub") == 0) { + hub_next = hport->config.intf[itf].priv; + + if (hub_next && hub_next->connected) { + priv = usbh_list_all_interface_name(hub_next, devname); + if (priv) { + return priv; + } + } + } + } + } + } + } + return NULL; +} + +static struct usbh_hubport *usbh_list_all_hubport(struct usbh_hub *hub, uint8_t hub_index, uint8_t hub_port) +{ + struct usbh_hubport *hport; + struct usbh_hub *hub_next; + + if (hub->index == hub_index) { + hport = &hub->child[hub_port - 1]; + if (hport->connected) { + return hport; + } else { + return NULL; + } + } else { + for (uint8_t port = 0; port < hub->nports; port++) { + hport = &hub->child[port]; + if (hport->connected) { + for (uint8_t itf = 0; itf < hport->config.config_desc.bNumInterfaces; itf++) { + if (hport->config.intf[itf].class_driver && hport->config.intf[itf].class_driver->driver_name) { + if (strcmp(hport->config.intf[itf].class_driver->driver_name, "hub") == 0) { + hub_next = hport->config.intf[itf].priv; + + if (hub_next && hub_next->connected) { + hport = usbh_list_all_hubport(hub_next, hub_index, hub_port); + if (hport) { + return hport; + } + } + } + } + } + } + } + } + return NULL; +} + +void *usbh_find_class_instance(const char *devname) +{ + usb_slist_t *bus_list; + struct usbh_hub *hub; + struct usbh_bus *bus; + void *priv; + size_t flags; + + flags = usb_osal_enter_critical_section(); + usb_slist_for_each(bus_list, &g_bus_head) + { + bus = usb_slist_entry(bus_list, struct usbh_bus, list); + hub = &bus->hcd.roothub; + + priv = usbh_list_all_interface_name(hub, devname); + if (priv) { + usb_osal_leave_critical_section(flags); + return priv; + } + } + usb_osal_leave_critical_section(flags); + return NULL; +} + +struct usbh_hubport *usbh_find_hubport(uint8_t busid, uint8_t hub_index, uint8_t hub_port) +{ + struct usbh_hub *hub; + struct usbh_bus *bus; + struct usbh_hubport *hport; + size_t flags; + + flags = usb_osal_enter_critical_section(); + + bus = &g_usbhost_bus[busid]; + hub = &bus->hcd.roothub; + + hport = usbh_list_all_hubport(hub, hub_index, hub_port); + usb_osal_leave_critical_section(flags); + return hport; +} + +static void usbh_print_hubport_info(struct usbh_hubport *hport) +{ + USB_LOG_RAW("Device Descriptor:\r\n"); + USB_LOG_RAW("bLength: 0x%02x \r\n", hport->device_desc.bLength); + USB_LOG_RAW("bDescriptorType: 0x%02x \r\n", hport->device_desc.bDescriptorType); + USB_LOG_RAW("bcdUSB: 0x%04x \r\n", hport->device_desc.bcdUSB); + USB_LOG_RAW("bDeviceClass: 0x%02x \r\n", hport->device_desc.bDeviceClass); + USB_LOG_RAW("bDeviceSubClass: 0x%02x \r\n", hport->device_desc.bDeviceSubClass); + USB_LOG_RAW("bDeviceProtocol: 0x%02x \r\n", hport->device_desc.bDeviceProtocol); + USB_LOG_RAW("bMaxPacketSize0: 0x%02x \r\n", hport->device_desc.bMaxPacketSize0); + USB_LOG_RAW("idVendor: 0x%04x \r\n", hport->device_desc.idVendor); + USB_LOG_RAW("idProduct: 0x%04x \r\n", hport->device_desc.idProduct); + USB_LOG_RAW("bcdDevice: 0x%04x \r\n", hport->device_desc.bcdDevice); + USB_LOG_RAW("iManufacturer: 0x%02x \r\n", hport->device_desc.iManufacturer); + USB_LOG_RAW("iProduct: 0x%02x \r\n", hport->device_desc.iProduct); + USB_LOG_RAW("iSerialNumber: 0x%02x \r\n", hport->device_desc.iSerialNumber); + USB_LOG_RAW("bNumConfigurations: 0x%02x\r\n", hport->device_desc.bNumConfigurations); + + USB_LOG_RAW("Config Descriptor:\r\n"); + USB_LOG_RAW("bLength: 0x%02x \r\n", hport->config.config_desc.bLength); + USB_LOG_RAW("bDescriptorType: 0x%02x \r\n", hport->config.config_desc.bDescriptorType); + USB_LOG_RAW("wTotalLength: 0x%04x \r\n", hport->config.config_desc.wTotalLength); + USB_LOG_RAW("bNumInterfaces: 0x%02x \r\n", hport->config.config_desc.bNumInterfaces); + USB_LOG_RAW("bConfigurationValue: 0x%02x \r\n", hport->config.config_desc.bConfigurationValue); + USB_LOG_RAW("iConfiguration: 0x%02x \r\n", hport->config.config_desc.iConfiguration); + USB_LOG_RAW("bmAttributes: 0x%02x \r\n", hport->config.config_desc.bmAttributes); + USB_LOG_RAW("bMaxPower: 0x%02x \r\n", hport->config.config_desc.bMaxPower); + + for (uint8_t i = 0; i < hport->config.config_desc.bNumInterfaces; i++) { + for (uint8_t j = 0; j < hport->config.intf[i].altsetting_num; j++) { + USB_LOG_RAW("\tInterface Descriptor:\r\n"); + USB_LOG_RAW("\tbLength: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bLength); + USB_LOG_RAW("\tbDescriptorType: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bDescriptorType); + USB_LOG_RAW("\tbInterfaceNumber: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceNumber); + USB_LOG_RAW("\tbAlternateSetting: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bAlternateSetting); + USB_LOG_RAW("\tbNumEndpoints: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bNumEndpoints); + USB_LOG_RAW("\tbInterfaceClass: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceClass); + USB_LOG_RAW("\tbInterfaceSubClass: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceSubClass); + USB_LOG_RAW("\tbInterfaceProtocol: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceProtocol); + USB_LOG_RAW("\tiInterface: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.iInterface); + + for (uint8_t k = 0; k < hport->config.intf[i].altsetting[j].intf_desc.bNumEndpoints; k++) { + USB_LOG_RAW("\t\tEndpoint Descriptor:\r\n"); + USB_LOG_RAW("\t\tbLength: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bLength); + USB_LOG_RAW("\t\tbDescriptorType: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bDescriptorType); + USB_LOG_RAW("\t\tbEndpointAddress: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bEndpointAddress); + USB_LOG_RAW("\t\tbmAttributes: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bmAttributes); + USB_LOG_RAW("\t\twMaxPacketSize: 0x%04x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.wMaxPacketSize); + USB_LOG_RAW("\t\tbInterval: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bInterval); + } + } + } +} + +static void usbh_list_device(struct usbh_hub *hub, bool astree, bool verbose, int dev_addr, int vid, int pid) +{ + static const char *speed_table[] = { + "UNKNOWN", + "low-speed", + "full-speed", + "high-speed", + "wireless", + "super-speed", + "super-speed-plus", + }; + + static const char *root_speed_table[] = { + "UNKNOWN", + "1.1", + "1.1", + "2.0", + "2.5", + "3.0", + "3.0", + }; + + static const uint16_t speed_baud[] = { + 0, + 12, + 12, + 480, + 480, + 5000, + 10000, + }; + + struct usbh_bus *bus; + struct usbh_hubport *hport; + struct usbh_hub *hub_next; + + uint8_t imbuf[64]; + uint8_t ipbuf[64]; + + const char *pimstr; + const char *pipstr; + + bool imvalid = false; + bool ipvalid = false; + + int ret; + + bus = hub->bus; + + (void)speed_table; + + if (hub->is_roothub) { + if (astree) { + USB_LOG_RAW("/: Bus %02u.Port 1: Dev %u, Class=root_hub, Driver=hcd, %uM\r\n", + bus->busid, hub->hub_addr, speed_baud[hub->speed]); + + } else { + if ((dev_addr < 0) || (hub->hub_addr == dev_addr)) { + if (((vid < 0) || (vid == 0xffff)) && ((pid < 0) || (pid == 0xffff))) { + USB_LOG_RAW("Bus %03u Device %03u: ID %04x:%04x %s %s root hub\r\n", + bus->busid, hub->hub_addr, 0xffff, 0xffff, + "Cherry-Embedded", root_speed_table[hub->speed]); + } + } + } + } + + for (uint8_t port = 0; port < hub->nports; port++) { + hport = &hub->child[port]; + if (hport->connected) { + ret = 0; + if (hport->device_desc.iManufacturer) { + memset(imbuf, 0, sizeof(imbuf)); + ret = usbh_get_string_desc(hport, hport->device_desc.iManufacturer, imbuf, sizeof(imbuf)); + if (ret == 0) { + imvalid = true; + } + } + + if (hport->device_desc.iProduct) { + memset(ipbuf, 0, sizeof(ipbuf)); + ret = usbh_get_string_desc(hport, hport->device_desc.iProduct, ipbuf, sizeof(ipbuf)); + if (ret == 0) { + ipvalid = true; + } + } + + if (imvalid) { + pimstr = (const char *)imbuf; + } else { + pimstr = "Not specified Manufacturer"; + } + + if (ipvalid) { + pipstr = (const char *)ipbuf; + } else { + pipstr = "Not specified Product"; + } + + if (!astree) { + if ((dev_addr < 0) || (hport->dev_addr == dev_addr)) { + if (((vid < 0) || (vid == hport->device_desc.idVendor)) && ((pid < 0) || (pid == hport->device_desc.idProduct))) { + USB_LOG_RAW("Bus %03u Device %03u: ID %04x:%04x %s %s\r\n", + bus->busid, hport->dev_addr, hport->device_desc.idVendor, hport->device_desc.idProduct, + pimstr, pipstr); + + if (verbose) { + usbh_print_hubport_info(hport); + } + } + } + } + + for (uint8_t intf = 0; intf < hport->config.config_desc.bNumInterfaces; intf++) { + if (hport->config.intf[intf].class_driver && hport->config.intf[intf].class_driver->driver_name) { + if (astree) { + for (uint8_t j = 0; j < hub->index; j++) { + USB_LOG_RAW(" "); + } + + USB_LOG_RAW("|__ Port %u: Dev %u, If %u, ClassDriver=%s, %uM\r\n", + hport->port, hport->dev_addr, intf, hport->config.intf[intf].class_driver->driver_name, speed_baud[hport->speed]); + } + + if (!strcmp(hport->config.intf[intf].class_driver->driver_name, "hub")) { + hub_next = hport->config.intf[intf].priv; + + if (hub_next && hub_next->connected) { + usbh_list_device(hub_next, astree, verbose, dev_addr, vid, pid); + } + } + } else if (astree) { + for (uint8_t j = 0; j < hub->index; j++) { + USB_LOG_RAW(" "); + } + + USB_LOG_RAW("|__ Port %u: Dev %u, If 0 ClassDriver=none, %uM\r\n", + hport->port, hport->dev_addr, speed_baud[hport->speed]); + } + } + } + } +} + +void lsusb_help(void) +{ + USB_LOG_RAW("List USB Devices\r\n" + "Usage: lsusb [options]...\r\n" + "\r\n" + "-v, --verbose\r\n" + " - increase verbosity (show descriptors)\r\n" + "-s [[bus]:][dev_addr]\r\n" + " - show only devices with specified device and/or\r\n" + " bus numbers (in decimal)\r\n" + "-d vendor:[product]\r\n" + " - show only devices with the specified vendor and\r\n" + " product ID numbers (in hexadecimal)\r\n" + "-t, --tree\r\n" + " - dump the physical USB device hierarchy as a tree\r\n" + "-V, --version\r\n" + " - show version of the cherryusb\r\n" + "-h, --help\r\n" + " - show usage and help information\r\n"); +} + +int lsusb(int argc, char **argv) +{ + usb_slist_t *bus_list; + struct usbh_bus *bus; + + int busid = -1; + int dev_addr = -1; + int vid = -1; + int pid = -1; + bool astree = false; + bool verbose = false; + + if (argc < 2) { + lsusb_help(); + return 0; + } + + while (argc > 1) { + argc--; + argv++; + + if (!strcmp(*argv, "-V") || !strcmp(*argv, "--version")) { + USB_LOG_RAW("CherryUSB version %s\r\n", CHERRYUSB_VERSION_STR); + return 0; + } else if (!strcmp(*argv, "-h") || !strcmp(*argv, "--help")) { + lsusb_help(); + return 0; + } else if (!strcmp(*argv, "-v") || !strcmp(*argv, "--verbose")) { + verbose = true; + } else if (!strcmp(*argv, "-t") || !strcmp(*argv, "--tree")) { + astree = true; + } else if (!strcmp(*argv, "-s")) { + if (argc > 1) { + argc--; + argv++; + + if (*argv[0] == '-') { + continue; + } + + char *endptr; + const char *colon = strchr(*argv, ':'); + (void)endptr; + + if (colon != NULL) { + const char *str; + if (colon > *argv) { + busid = strtol(*argv, &endptr, 10); + } + str = colon + 1; + if (*str != '\0') { + dev_addr = strtol(str, &endptr, 10); + if (dev_addr <= 0 || dev_addr >= 128) { + dev_addr = -1; + } + } + } else { + dev_addr = strtol(*argv, &endptr, 10); + if (dev_addr <= 0 || dev_addr >= 128) { + dev_addr = -1; + } + } + } + } else if (!strcmp(*argv, "-d")) { + if (argc > 1) { + argc--; + argv++; + + if (*argv[0] == '-') { + continue; + } + + char *endptr; + const char *colon = strchr(*argv, ':'); + (void)endptr; + + if (colon == NULL) { + continue; + } + const char *str; + + vid = strtol(*argv, &endptr, 16); + if (vid < 0 || vid > 0xffff) { + vid = -1; + continue; + } + str = colon + 1; + if (*str != '\0') { + pid = strtol(str, &endptr, 16); + if (pid < 0 || pid > 0xffff) { + pid = -1; + } + } + } + } + } + + if (astree) { + busid = -1; + dev_addr = -1; + vid = -1; + pid = -1; + verbose = false; + } + + usb_slist_for_each(bus_list, &g_bus_head) + { + bus = usb_slist_entry(bus_list, struct usbh_bus, list); + if (busid >= 0) { + if (bus->busid != busid) { + continue; + } + } + + usbh_list_device(&bus->hcd.roothub, astree, verbose, dev_addr, vid, pid); + } + + return 0; +} + +__WEAK uint8_t usbh_get_hport_active_config_index(struct usbh_hubport *hport) +{ + ARG_UNUSED(hport); + + return 0; // Default to configuration index 0 +} \ No newline at end of file diff --git a/src/lib/CherryUSB/core/usbh_core.h b/src/lib/CherryUSB/core/usbh_core.h new file mode 100644 index 000000000..4ec86ab01 --- /dev/null +++ b/src/lib/CherryUSB/core/usbh_core.h @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_CORE_H +#define USBH_CORE_H + +#include +#include +#include +#include + +#include "usb_config.h" +#include "usb_util.h" +#include "usb_errno.h" +#include "usb_def.h" +#include "usb_list.h" +#include "usb_log.h" +#include "usb_hc.h" +#include "usb_osal.h" +#include "usbh_hub.h" +#include "usb_memcpy.h" +#include "usb_dcache.h" +#include "usb_version.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define USB_CLASS_MATCH_VENDOR 0x0001 +#define USB_CLASS_MATCH_PRODUCT 0x0002 +#define USB_CLASS_MATCH_INTF_CLASS 0x0004 +#define USB_CLASS_MATCH_INTF_SUBCLASS 0x0008 +#define USB_CLASS_MATCH_INTF_PROTOCOL 0x0010 +#define USB_CLASS_MATCH_INTF_NUM 0x0020 +#define USB_CLASS_MATCH_VID_PID (USB_CLASS_MATCH_VENDOR | USB_CLASS_MATCH_PRODUCT) + +#define CLASS_CONNECT(hport, i) ((hport)->config.intf[i].class_driver->connect(hport, i)) +#define CLASS_DISCONNECT(hport, i) ((hport)->config.intf[i].class_driver->disconnect(hport, i)) + +#ifdef __ARMCC_VERSION /* ARM C Compiler */ +#define CLASS_INFO_DEFINE __attribute__((section("usbh_class_info"))) __USED __ALIGNED(1) +#elif defined(__GNUC__) +#define CLASS_INFO_DEFINE __attribute__((section(".usbh_class_info"))) __USED __ALIGNED(1) +#elif defined(__ICCARM__) || defined(__ICCRX__) || defined(__ICCRISCV__) +#pragma section = ".usbh_class_info" +#define CLASS_INFO_DEFINE __attribute__((section(".usbh_class_info"))) __USED __ALIGNED(1) +#endif + +#define USBH_GET_URB_INTERVAL(interval, speed) (speed < USB_SPEED_HIGH ? (interval * 1000) : ((1 << (interval - 1)) * 125)) + +#define USBH_EP_INIT(ep, ep_desc) \ + do { \ + ep = ep_desc; \ + USB_LOG_INFO("Ep=%02x Attr=%02u Mps=%d Interval=%02u Mult=%02u\r\n", \ + ep_desc->bEndpointAddress, \ + ep_desc->bmAttributes, \ + USB_GET_MAXPACKETSIZE(ep_desc->wMaxPacketSize), \ + ep_desc->bInterval, \ + USB_GET_MULT(ep_desc->wMaxPacketSize)); \ + } while (0) + +typedef void (*usbh_event_handler_t)(uint8_t busid, uint8_t hub_index, uint8_t hub_port, uint8_t intf, uint8_t event); + +struct usbh_class_info { + uint8_t match_flags; /* Used for product specific matches; range is inclusive */ + uint8_t bInterfaceClass; /* Base device class code */ + uint8_t bInterfaceSubClass; /* Sub-class, depends on base class. Eg. */ + uint8_t bInterfaceProtocol; /* Protocol, depends on base class. Eg. */ + uint8_t bInterfaceNumber; /* Interface number */ + const uint16_t (*id_table)[2]; /* List of Vendor/Product ID pairs */ + const struct usbh_class_driver *class_driver; +}; + +struct usbh_hubport; +struct usbh_class_driver { + const char *driver_name; + int (*connect)(struct usbh_hubport *hport, uint8_t intf); + int (*disconnect)(struct usbh_hubport *hport, uint8_t intf); +}; + +struct usbh_endpoint { + struct usb_endpoint_descriptor ep_desc; +}; + +struct usbh_interface_altsetting { + struct usb_interface_descriptor intf_desc; + struct usbh_endpoint ep[CONFIG_USBHOST_MAX_ENDPOINTS]; +}; + +struct usbh_interface { + char devname[CONFIG_USBHOST_DEV_NAMELEN]; + struct usbh_class_driver *class_driver; + void *priv; + struct usbh_interface_altsetting altsetting[CONFIG_USBHOST_MAX_INTF_ALTSETTINGS]; + uint8_t altsetting_num; +}; + +struct usbh_configuration { + struct usb_configuration_descriptor config_desc; + struct usbh_interface intf[CONFIG_USBHOST_MAX_INTERFACES]; +}; + +struct usbh_hubport { + bool connected; /* True: device connected; false: disconnected */ + uint8_t port; /* Hub port index */ + uint8_t dev_addr; /* device address */ + uint8_t speed; /* device speed */ + uint8_t depth; /* distance from root hub */ + uint8_t route; /* route string */ + uint8_t slot_id; /* slot id */ + struct usb_device_descriptor device_desc; + struct usbh_configuration config; + const char *iManufacturer; + const char *iProduct; + const char *iSerialNumber; + uint8_t *raw_config_desc; + struct usb_setup_packet *setup; + struct usbh_hub *parent; + struct usbh_hub *self; /* if this hubport is a hub */ + struct usbh_bus *bus; + struct usb_endpoint_descriptor ep0; + struct usbh_urb ep0_urb; + usb_osal_mutex_t mutex; +}; + +struct usbh_hub { + bool connected; + bool is_roothub; + uint8_t index; + uint8_t hub_addr; + uint8_t speed; + uint8_t nports; + uint8_t powerdelay; + uint8_t tt_think; + bool ismtt; + struct usb_hub_descriptor hub_desc; /* USB 2.0 only */ + struct usb_hub_ss_descriptor hub_ss_desc; /* USB 3.0 only */ + struct usbh_hubport child[CONFIG_USBHOST_MAX_EHPORTS]; + struct usbh_hubport *parent; + struct usbh_bus *bus; + struct usb_endpoint_descriptor *intin; + struct usbh_urb intin_urb; + uint8_t *int_buffer; + struct usb_osal_timer *int_timer; +}; + +struct usbh_devaddr_map { + /** + * alloctab[0]:addr from 0~31 + * alloctab[1]:addr from 32~63 + * alloctab[2]:addr from 64~95 + * alloctab[3]:addr from 96~127 + * + */ + uint8_t last; /* Last device address */ + uint32_t alloctab[4]; /* Bit allocation table */ +}; + +struct usbh_hcd { + uintptr_t reg_base; + uint8_t hcd_id; + uint8_t roothub_intbuf[2]; /* at most 15 roothub ports */ + struct usbh_hub roothub; +}; + +struct usbh_bus { + usb_slist_t list; + uint8_t busid; + struct usbh_hcd hcd; + struct usbh_devaddr_map devgen; + usb_osal_thread_t hub_thread; + usb_osal_mq_t hub_mq; + usb_osal_mutex_t mutex; + usbh_event_handler_t event_handler; +}; + +static inline void usbh_control_urb_fill(struct usbh_urb *urb, + struct usbh_hubport *hport, + struct usb_setup_packet *setup, + uint8_t *transfer_buffer, + uint32_t transfer_buffer_length, + uint32_t timeout, + usbh_complete_callback_t complete, + void *arg) +{ + urb->hport = hport; + urb->ep = &hport->ep0; + urb->setup = setup; + urb->transfer_buffer = transfer_buffer; + urb->transfer_buffer_length = transfer_buffer_length; + urb->timeout = timeout; + urb->complete = complete; + urb->arg = arg; +} + +static inline void usbh_bulk_urb_fill(struct usbh_urb *urb, + struct usbh_hubport *hport, + struct usb_endpoint_descriptor *ep, + uint8_t *transfer_buffer, + uint32_t transfer_buffer_length, + uint32_t timeout, + usbh_complete_callback_t complete, + void *arg) +{ + urb->hport = hport; + urb->ep = ep; + urb->setup = NULL; + urb->transfer_buffer = transfer_buffer; + urb->transfer_buffer_length = transfer_buffer_length; + urb->timeout = timeout; + urb->complete = complete; + urb->arg = arg; +} + +static inline void usbh_int_urb_fill(struct usbh_urb *urb, + struct usbh_hubport *hport, + struct usb_endpoint_descriptor *ep, + uint8_t *transfer_buffer, + uint32_t transfer_buffer_length, + uint32_t timeout, + usbh_complete_callback_t complete, + void *arg) +{ + urb->hport = hport; + urb->ep = ep; + urb->setup = NULL; + urb->transfer_buffer = transfer_buffer; + urb->transfer_buffer_length = transfer_buffer_length; + urb->timeout = timeout; + urb->complete = complete; + urb->arg = arg; + urb->interval = USBH_GET_URB_INTERVAL(ep->bInterval, hport->speed); +} + +extern struct usbh_bus g_usbhost_bus[]; +#ifdef USBH_IRQHandler +#error USBH_IRQHandler is obsolete, please call USBH_IRQHandler(xxx) in your irq +#endif + +/** + * @brief Submit an control transfer to an endpoint. + * This is a blocking method; this method will not return until the transfer has completed. + * Default timeout is 500ms. + * + * @param pipe The control endpoint to send/receive the control request. + * @param setup Setup packet to be sent. + * @param buffer buffer used for sending the request and for returning any responses. + * @return On success will return 0, and others indicate fail. + */ +int usbh_control_transfer(struct usbh_hubport *hport, struct usb_setup_packet *setup, uint8_t *buffer); + +/** + * @brief Retrieves a USB string descriptor from a specific hub port. + * + * This function is responsible for retrieving the USB string descriptor + * with the specified index from the USB device connected to the given hub port. + * The retrieved descriptor is stored in the output buffer provided. + * + * @param hport Pointer to the USB hub port structure. + * @param index Index of the string descriptor to retrieve. + * @param output Pointer to the buffer where the retrieved descriptor will be stored. + * @param output_len Length of the output buffer. + * @return On success will return 0, and others indicate fail. + */ +int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *output, uint16_t output_len); + +/** + * @brief Sets the alternate setting for a USB interface on a specific hub port. + * + * This function is responsible for setting the alternate setting of the + * specified USB interface on the USB device connected to the given hub port. + * The interface and alternate setting are identified by the respective parameters. + * + * @param hport Pointer to the USB hub port structure. + * @param intf Interface number to set the alternate setting for. + * @param altsetting Alternate setting value to set for the interface. + * @return On success will return 0, and others indicate fail. + */ +int usbh_set_interface(struct usbh_hubport *hport, uint8_t intf, uint8_t altsetting); + +int usbh_initialize(uint8_t busid, uintptr_t reg_base); +int usbh_deinitialize(uint8_t busid); +void *usbh_find_class_instance(const char *devname); +struct usbh_hubport *usbh_find_hubport(uint8_t busid, uint8_t hub_index, uint8_t hub_port); +uint8_t usbh_get_hport_active_config_index(struct usbh_hubport *hport); + +int lsusb(int argc, char **argv); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_CORE_H */ diff --git a/src/lib/CherryUSB/core/usbotg_core.c b/src/lib/CherryUSB/core/usbotg_core.c new file mode 100644 index 000000000..80cf97088 --- /dev/null +++ b/src/lib/CherryUSB/core/usbotg_core.c @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbotg_core.h" + +#ifdef CONFIG_USB_OTG_ENABLE +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbotg_core" +#include "usb_log.h" + +#define CONFIG_USB_OTG_MAX_BUS CONFIG_USBHOST_MAX_BUS + +struct usbotg_core_priv { + uint8_t busid; + uint32_t reg_base; + bool usbh_initialized; + bool usbd_initialized; + usbd_event_handler_t device_event_callback; + usbh_event_handler_t host_event_callback; + uint8_t current_mode; + usb_osal_sem_t change_sem; + usb_osal_thread_t change_thread; +} g_usbotg_core[CONFIG_USB_OTG_MAX_BUS]; + +static void usbotg_host_initialize(uint8_t busid) +{ + if (g_usbotg_core[busid].usbh_initialized) { + return; + } + + if (g_usbotg_core[busid].usbd_initialized) { + usbd_deinitialize(busid); + g_usbotg_core[busid].usbd_initialized = false; + } + + USB_LOG_INFO("Switch to HOST mode\r\n"); + + g_usbotg_core[busid].usbh_initialized = true; + usbh_initialize(busid, g_usbotg_core[busid].reg_base); +} + +static void usbotg_device_initialize(uint8_t busid) +{ + if (g_usbotg_core[busid].usbd_initialized) { + return; + } + + if (g_usbotg_core[busid].usbh_initialized) { + usbh_deinitialize(busid); + g_usbotg_core[busid].usbh_initialized = false; + } + + USB_LOG_INFO("Switch to DEVICE mode\r\n"); + + g_usbotg_core[busid].usbd_initialized = true; + usbd_initialize(g_usbotg_core[busid].busid, g_usbotg_core[busid].reg_base, g_usbotg_core[busid].device_event_callback); +} + +static void usbotg_rolechange_thread(void *argument) +{ + uint8_t busid = (uint8_t)(uintptr_t)argument; + + usb_otg_init(busid); + + while (1) { + if (usb_osal_sem_take(g_usbotg_core[busid].change_sem, USB_OSAL_WAITING_FOREVER) == 0) { + if (g_usbotg_core[busid].current_mode == USBOTG_MODE_HOST) { + usbotg_host_initialize(busid); + } else if (g_usbotg_core[busid].current_mode == USBOTG_MODE_DEVICE) { + usbotg_device_initialize(busid); + } + } + } +} + +int usbotg_initialize(uint8_t busid, uint32_t reg_base, usbd_event_handler_t device_event_callback, usbh_event_handler_t host_event_callback, uint8_t default_role) +{ + char thread_name[32] = { 0 }; + + USB_ASSERT_MSG(busid < CONFIG_USB_OTG_MAX_BUS, "bus overflow\r\n"); + + g_usbotg_core[busid].busid = busid; + g_usbotg_core[busid].reg_base = reg_base; + g_usbotg_core[busid].device_event_callback = device_event_callback; + g_usbotg_core[busid].host_event_callback = host_event_callback; + + g_usbotg_core[busid].change_sem = usb_osal_sem_create(0); + if (g_usbotg_core[busid].change_sem == NULL) { + USB_LOG_ERR("Failed to create change_sem\r\n"); + while (1) { + } + } + + snprintf(thread_name, 32, "usbotg%u", busid); + g_usbotg_core[busid].change_thread = usb_osal_thread_create(thread_name, 2048, 10, usbotg_rolechange_thread, (void *)(uintptr_t)busid); + if (g_usbotg_core[busid].change_thread == NULL) { + USB_LOG_ERR("Failed to create usbotg thread\r\n"); + while (1) { + } + } + + usbotg_trigger_role_change(busid, default_role); + return 0; +} + +int usbotg_deinitialize(uint8_t busid) +{ + USB_ASSERT_MSG(busid < CONFIG_USB_OTG_MAX_BUS, "bus overflow\r\n"); + + if (g_usbotg_core[busid].usbd_initialized) { + g_usbotg_core[busid].usbd_initialized = false; + usbd_deinitialize(busid); + } + + if (g_usbotg_core[busid].usbh_initialized) { + g_usbotg_core[busid].usbh_initialized = false; + usbh_deinitialize(busid); + } + + if (g_usbotg_core[busid].change_thread) { + usb_osal_thread_delete(g_usbotg_core[busid].change_thread); + } + + if (g_usbotg_core[busid].change_sem) { + usb_otg_deinit(busid); + usb_osal_sem_delete(g_usbotg_core[busid].change_sem); + } + + return 0; +} + +void usbotg_trigger_role_change(uint8_t busid, uint8_t mode) +{ + USB_ASSERT_MSG(busid < CONFIG_USB_OTG_MAX_BUS, "bus overflow\r\n"); + + g_usbotg_core[busid].current_mode = mode; + + if (g_usbotg_core[busid].change_sem) { + usb_osal_sem_give(g_usbotg_core[busid].change_sem); + } +} + +void USBOTG_IRQHandler(uint8_t busid) +{ + USB_ASSERT_MSG(busid < CONFIG_USB_OTG_MAX_BUS, "bus overflow\r\n"); + + if (g_usbotg_core[busid].current_mode == USBOTG_MODE_HOST && g_usbotg_core[busid].usbh_initialized) { + USBH_IRQHandler(busid); + } else if (g_usbotg_core[busid].current_mode == USBOTG_MODE_DEVICE && g_usbotg_core[busid].usbd_initialized) { + USBD_IRQHandler(busid); + } +} +#endif /* CONFIG_USB_OTG_ENABLE */ \ No newline at end of file diff --git a/src/lib/CherryUSB/core/usbotg_core.h b/src/lib/CherryUSB/core/usbotg_core.h new file mode 100644 index 000000000..7eadb878c --- /dev/null +++ b/src/lib/CherryUSB/core/usbotg_core.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBOTG_CORE_H +#define USBOTG_CORE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_otg.h" + +int usbotg_initialize(uint8_t busid, uint32_t reg_base, usbd_event_handler_t device_event_callback, usbh_event_handler_t host_event_callback, uint8_t default_role); +int usbotg_deinitialize(uint8_t busid); + +/* called by user */ +void usbotg_trigger_role_change(uint8_t busid, uint8_t mode); + +#ifdef __cplusplus +} +#endif + +#endif /* USBOTG_CORE_H */ \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/CherryUSB.h264 b/src/lib/CherryUSB/demo/CherryUSB.h264 new file mode 100644 index 000000000..93d8ccf1c Binary files /dev/null and b/src/lib/CherryUSB/demo/CherryUSB.h264 differ diff --git a/src/lib/CherryUSB/demo/CherryUSB.jpg b/src/lib/CherryUSB/demo/CherryUSB.jpg new file mode 100644 index 000000000..e0943f555 Binary files /dev/null and b/src/lib/CherryUSB/demo/CherryUSB.jpg differ diff --git a/src/lib/CherryUSB/demo/CherryUSB_64x48.YUYV b/src/lib/CherryUSB/demo/CherryUSB_64x48.YUYV new file mode 100644 index 000000000..d233e0b0c --- /dev/null +++ b/src/lib/CherryUSB/demo/CherryUSB_64x48.YUYV @@ -0,0 +1 @@ +hhcchcchcchcchcchcchcchcchcchcchcchcchcchcciccicciccjddicchcchcchcchcchcchcchcchcchcchcchcchcchhhhgghgghgghgghgghgghgghgghgghgghgghgghgglap~rٟdpjrjogghgghgghgghgghgghgghgghgghgghgghgghgghhhhggkggkggkggkggkggkggkggkggkggkggkggkgglggmghkgimggmgglggkggkggkggkggkggkggkggkggkggkggkggkgghgxpvvpvvpvvpvvpvvpvvpvvpvvpvvpvvpvvpvvpvvpvvpvvmvvovvovvovvovvovvovvovvovvovvovvovvovvovvovvovvkxm~`z`z`z`z`z`z`z`z`z`z`z`z`z`zh{zzzzzzzzzzzzzzzqwakakakakakdmknlnfmakakakakakhmmhhhhhkΔnЏoihhhhhw}{y|y|y|y|y|y||{}{z|y|y|y|y|y|z{߅{{{{{{{{{z{{{{{{|00}00}00}00}00}00}00}0~00}00}00}00}00}00}0}}-}00}00}00}00}00}00}0~30}00}00}00}00}00}00}|~|0000b9m00000}0}0000)1000000~},~0000@"00000~30~0000?600000|~|01111111111100}0}111111111111/~~,~0000000000000~30~000000000000|~|~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~|~|0000+[7I000000}0}0000)H]000000~},~0000+bd`00000~30~0000/U300000|~|00001/07000000}0}00005.(000000~},~00000.*200000~30~00009'*00000||}}|}|}|}|}|}}}~~|}|}|}|}|}|}}}~˃~˃~˃~˃~˃~˃~̂}̄~˃~˃~˃~˃~˃~˃~|~|0111154/111100}0}111103111111/~~,~0000031300000~30~0000.-/00000|~|0000035000000}0}0000mO1100000~},~000003w400000~30~0000c400000||00}00}00}00}00}00}00}0~00}00}00}00}00}00}/~~-}00}00}00}00}00}00}0~30}00}00}00}00}00}00}||~~}~}~|}}~}~~}}~}~|}|~}~}~~~~~~}}~~~}~~~}}~~||00}00}00}7600}00}00}0~00}00}1.~+0}00}00}/~~-}00}00}-3~2,~00}00}0~30}00}00}1;~7000}00}|~|00}00}05}/1}00}00}00}0~00}00}64}30}00}00}/~~-}00}00}0/}60}00}00}0~30}00}00},2}00}00}00}|~|}}}}}}}}}}}}}}}}}}}}}}}}}}}~~炸~}}}}}}}}}}}}}}|}~~}~~}~~~|~~}~}~}~}~}~}~}~}~}~}~}~}~}~~~}}}}}}}}}}}}}}||00}00~00~00~00~00~00~00~00~00~00~00~00~00~/~~-}00~00~00~00~00~00~00~00~00~00~00~00~00~00}|~|000000000|1FGr^D_84000000000~},~000000000X>_Aa>0000000000|~|00000000000000000000000000000~},~0000000000000000000000000000|~|00000000000000000000000000000~},~0000000000000000000000000000||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~.|000000000Y00}-167}00}00}00000000001111111110-0}00}/5};/}00}R111111111.}.|000000000~Z//}*~5|/~7}//}/1}002*2000104000541)01,2}22}17}9.}22}R000000000.}.|0000000002000000000000RVgsDq/Tlu^/,00000000000.000000000.}.}0000000000000000000000000000000000-00+0000000000000000000000.}UXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXS~rwakakakakakakakakakakakakakakhpmhhhhhhhhhhhhhhwrwakakakakakakakakakakakakakakhpmhhhhhhhhhhhhhhwqwakakbkksipinkshkiphpgnckakakhmmhhkƓqlpsm“pmkhhhwtzdidididhdhdidhcidhdhdidididignniiihihhhhiiiiizx|pupupupupupupupupupupupupupuqvvuuuuuuuuuuuuuu{~~000003000004000000000000000000-00000ā/00000^/000000}~01.5030/0-1400./.00++.1004-400-02010Ā/0+240^/00+000~0-50309h314001.00dрU100,exec; + volatile TaskHandle_t *p_task_hdl_exec = (void *)&task_hdl_exec; + + switch (sig) { + case CSH_SIGINT: + case CSH_SIGQUIT: + case CSH_SIGKILL: + case CSH_SIGTERM: + break; + default: + return; + } + + /*!< force delete task */ + if (*p_task_hdl_exec != NULL) { + vTaskDelete(task_hdl_exec); + *p_task_hdl_exec = NULL; + } + + switch (sig) { + case CSH_SIGINT: + csh->rl.sput(&csh->rl, "^SIGINT" CONFIG_CSH_NEWLINE, sizeof("^SIGINT" CONFIG_CSH_NEWLINE) - 1); + break; + case CSH_SIGQUIT: + csh->rl.sput(&csh->rl, "^SIGQUIT" CONFIG_CSH_NEWLINE, sizeof("^SIGQUIT" CONFIG_CSH_NEWLINE) - 1); + break; + case CSH_SIGKILL: + csh->rl.sput(&csh->rl, "^SIGKILL" CONFIG_CSH_NEWLINE, sizeof("^SIGKILL" CONFIG_CSH_NEWLINE) - 1); + break; + case CSH_SIGTERM: + csh->rl.sput(&csh->rl, "^SIGTERM" CONFIG_CSH_NEWLINE, sizeof("^SIGTERM" CONFIG_CSH_NEWLINE) - 1); + break; + default: + return; + } + + *pexec = CSH_STATUS_EXEC_IDLE; + chry_readline_auto_refresh(&csh->rl, true); + chry_readline_ignore(&csh->rl, false); + chry_readline_edit_refresh(&csh->rl); +} + +int shell_init(bool need_login) +{ + chry_shell_init_t csh_init; + + if (chry_ringbuffer_init(&shell_rb, mempool, sizeof(mempool))) { + return -1; + } + + if (need_login) { + login = false; + } else { + login = true; + } + + /*!< I/O callback */ + csh_init.sput = csh_sput_cb; + csh_init.sget = csh_sget_cb; + +#if defined(CONFIG_CSH_SYMTAB) && CONFIG_CSH_SYMTAB + extern const int __fsymtab_start; + extern const int __fsymtab_end; + extern const int __vsymtab_start; + extern const int __vsymtab_end; + + /*!< get table from ld symbol */ + csh_init.command_table_beg = &__fsymtab_start; + csh_init.command_table_end = &__fsymtab_end; + csh_init.variable_table_beg = &__vsymtab_start; + csh_init.variable_table_end = &__vsymtab_end; +#endif + +#if defined(CONFIG_CSH_PROMPTEDIT) && CONFIG_CSH_PROMPTEDIT + static char csh_prompt_buffer[128]; + + /*!< set prompt buffer */ + csh_init.prompt_buffer = csh_prompt_buffer; + csh_init.prompt_buffer_size = sizeof(csh_prompt_buffer); +#endif + +#if defined(CONFIG_CSH_HISTORY) && CONFIG_CSH_HISTORY + static char csh_history_buffer[128]; + + /*!< set history buffer */ + csh_init.history_buffer = csh_history_buffer; + csh_init.history_buffer_size = sizeof(csh_history_buffer); +#endif + +#if defined(CONFIG_CSH_LNBUFF_STATIC) && CONFIG_CSH_LNBUFF_STATIC + static char csh_line_buffer[128]; + + /*!< set linebuffer */ + csh_init.line_buffer = csh_line_buffer; + csh_init.line_buffer_size = sizeof(csh_line_buffer); +#endif + + csh_init.uid = 0; + csh_init.user[0] = "cherry"; + + /*!< The port hash function is required, + and the strcmp attribute is used weakly by default, + int chry_shell_port_hash_strcmp(const char *hash, const char *str); */ + csh_init.hash[0] = "12345678"; /*!< If there is no password, set to NULL */ + csh_init.host = "cherryadb"; + csh_init.user_data = NULL; + + int ret = chry_shell_init(&csh, &csh_init); + if (ret) { + return -1; + } + + task_hdl_exec = NULL; + event_hdl = xEventGroupCreateStatic(&event_grp); + task_hdl_repl = xTaskCreateStatic(task_repl, "task_repl", 1024U, NULL, task_repl_PRIORITY, task_stack_repl, &task_buffer_repl); + + return 0; +} + +void shell_lock(void) +{ + xEventGroupSetBits(event_hdl, 0x01); + xEventGroupWaitBits(event_hdl, 0x02, pdTRUE, pdTRUE, portMAX_DELAY); +} + +void shell_unlock(void) +{ + xEventGroupSetBits(event_hdl, 0x04); + xEventGroupWaitBits(event_hdl, 0x08, pdTRUE, pdTRUE, portMAX_DELAY); +} + +static int csh_exit(int argc, char **argv) +{ + (void)argc; + (void)argv; + + usbd_adb_close(ADB_SHELL_LOALID); + + return 0; +} +CSH_SCMD_EXPORT_ALIAS(csh_exit, exit, ); + +#define __ENV_PATH "/sbin:/bin" +const char ENV_PATH[] = __ENV_PATH; +CSH_RVAR_EXPORT(ENV_PATH, PATH, sizeof(__ENV_PATH)); + +#define __ENV_ZERO "" +const char ENV_ZERO[] = __ENV_ZERO; +CSH_RVAR_EXPORT(ENV_ZERO, ZERO, sizeof(__ENV_ZERO)); diff --git a/src/lib/CherryUSB/demo/adb/usbd_adb_template.c b/src/lib/CherryUSB/demo/adb/usbd_adb_template.c new file mode 100644 index 000000000..a97de8ff5 --- /dev/null +++ b/src/lib/CherryUSB/demo/adb/usbd_adb_template.c @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_adb.h" + +/*!< endpoint address */ +#define WINUSB_IN_EP 0x81 +#define WINUSB_OUT_EP 0x02 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + 9 + 7 + 7) + +#ifdef CONFIG_USB_HS +#define WINUSB_MAX_MPS 512 +#else +#define WINUSB_MAX_MPS 64 +#endif + +#define WCID_VENDOR_CODE 0x17 +#define ADB_INTF_NUM 0 + +__ALIGN_BEGIN const uint8_t WCID_StringDescriptor_MSOS[18] __ALIGN_END = { + /////////////////////////////////////// + /// MS OS string descriptor + /////////////////////////////////////// + 0x12, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + /* MSFT100 */ + 'M', 0x00, 'S', 0x00, 'F', 0x00, 'T', 0x00, /* wcChar_7 */ + '1', 0x00, '0', 0x00, '0', 0x00, /* wcChar_7 */ + WCID_VENDOR_CODE, /* bVendorCode */ + 0x00, /* bReserved */ +}; + +__ALIGN_BEGIN const uint8_t WINUSB_WCIDDescriptor[40] __ALIGN_END = { + /////////////////////////////////////// + /// WCID descriptor + /////////////////////////////////////// + 0x28, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x04, 0x00, /* wIndex */ + 0x01, /* bCount */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_7 */ + + /////////////////////////////////////// + /// WCID function descriptor + /////////////////////////////////////// + ADB_INTF_NUM, /* bFirstInterfaceNumber */ + 0x01, /* bReserved */ + /* Compatible ID */ + 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, /* cCID_8: WINUSB */ + /* */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* cSubCID_8 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_6 */ +}; + +__ALIGN_BEGIN const uint8_t WINUSB_IF0_WCIDProperties[142] __ALIGN_END = { + /////////////////////////////////////// + /// WCID property descriptor + /////////////////////////////////////// + 0x8e, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x05, 0x00, /* wIndex */ + 0x01, 0x00, /* wCount */ + + /////////////////////////////////////// + /// registry propter descriptor + /////////////////////////////////////// + 0x84, 0x00, 0x00, 0x00, /* dwSize */ + 0x01, 0x00, 0x00, 0x00, /* dwPropertyDataType */ + 0x28, 0x00, /* wPropertyNameLength */ + /* DeviceInterfaceGUID */ + 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, /* wcName_20 */ + 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, /* wcName_20 */ + 't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00, /* wcName_20 */ + 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, /* wcName_20 */ + 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00, /* wcName_20 */ + 0x4e, 0x00, 0x00, 0x00, /* dwPropertyDataLength */ + /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */ + '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00, /* wcData_39 */ + 'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00, /* wcData_39 */ + '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00, /* wcData_39 */ + '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00, /* wcData_39 */ + '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00, /* wcData_39 */ + 'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00, /* wcData_39 */ + '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00, /* wcData_39 */ + 'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00, /* wcData_39 */ + 'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00, /* wcData_39 */ + '6', 0x00, '}', 0x00, 0x00, 0x00, /* wcData_39 */ +}; + +const uint8_t *WINUSB_IFx_WCIDProperties[] = { + WINUSB_IF0_WCIDProperties, +}; + +struct usb_msosv1_descriptor msosv1_desc = { + .string = WCID_StringDescriptor_MSOS, + .vendor_code = WCID_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .comp_id_property = WINUSB_IFx_WCIDProperties, +}; + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + ADB_DESCRIPTOR_INIT(ADB_INTF_NUM, WINUSB_IN_EP, WINUSB_OUT_EP, WINUSB_MAX_MPS) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryADB", /* Product */ + "CherryADB2024", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor adb_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .msosv1_descriptor = &msosv1_desc +}; +#else +/*!< global descriptor */ +static const uint8_t adb_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + ADB_DESCRIPTOR_INIT(ADB_INTF_NUM, WINUSB_IN_EP, WINUSB_OUT_EP, WINUSB_MAX_MPS), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'A', 0x00, /* wcChar6 */ + 'D', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x1C, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'A', 0x00, /* wcChar6 */ + 'D', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + '2', 0x00, /* wcChar9 */ + '0', 0x00, /* wcChar10 */ + '2', 0x00, /* wcChar11 */ + '4', 0x00, /* wcChar12 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +static struct usbd_interface intf0; + +#ifdef RT_USING_MSH +extern void usbd_adb_shell_init(uint8_t in_ep, uint8_t out_ep); +#else +extern int shell_init(bool need_login); +#endif +void cherryadb_init(uint8_t busid, uint32_t reg_base) +{ +#ifdef RT_USING_MSH + usbd_adb_shell_init(WINUSB_IN_EP, WINUSB_OUT_EP); +#else + /* default password is : 12345678 */ + /* shell_init() must be called in-task */ + if (0 != shell_init(false)) { + /* shell failed to be initialized */ + USB_LOG_RAW("Failed to initialize shell\r\n"); + for (;;) { + ; + } + } +#endif +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &adb_descriptor); +#else + usbd_desc_register(busid, adb_descriptor); +#endif +#ifndef CONFIG_USBDEV_ADVANCE_DESC + usbd_msosv1_desc_register(busid, &msosv1_desc); +#endif + usbd_add_interface(busid, usbd_adb_init_intf(busid, &intf0, WINUSB_IN_EP, WINUSB_OUT_EP)); + usbd_initialize(busid, reg_base, usbd_event_handler); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/audio_v1_mic_multichan_template.c b/src/lib/CherryUSB/demo/audio_v1_mic_multichan_template.c new file mode 100644 index 000000000..cd6f1cfe7 --- /dev/null +++ b/src/lib/CherryUSB/demo/audio_v1_mic_multichan_template.c @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_audio.h" + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USB_HS +#define EP_INTERVAL 0x04 +#else +#define EP_INTERVAL 0x01 +#endif + +#define AUDIO_IN_EP 0x81 + +#define AUDIO_IN_FU_ID 0x02 + +/* AUDIO Class Config */ +#define AUDIO_FREQ 16000U + +#define IN_CHANNEL_NUM 2 + +#if IN_CHANNEL_NUM == 1 +#define INPUT_CTRL 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0001 +#elif IN_CHANNEL_NUM == 2 +#define INPUT_CTRL 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0003 +#elif IN_CHANNEL_NUM == 3 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0007 +#elif IN_CHANNEL_NUM == 4 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x000f +#elif IN_CHANNEL_NUM == 5 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x001f +#elif IN_CHANNEL_NUM == 6 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x003F +#elif IN_CHANNEL_NUM == 7 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x007f +#elif IN_CHANNEL_NUM == 8 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x00ff +#endif + +/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 1) */ +/* 16bit(2 Bytes) 单声道(Mono:1) */ +#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_FREQ * 2 * IN_CHANNEL_NUM) / 1000)) + +#define USB_CONFIG_SIZE (unsigned long)(9 + \ + AUDIO_AC_DESCRIPTOR_LEN(1) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_AS_DESCRIPTOR_LEN(1)) + +#define AUDIO_AC_SIZ (AUDIO_SIZEOF_AC_HEADER_DESC(1) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC) + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, 0x00, 0x01), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, IN_CHANNEL_NUM, INPUT_CH_ENABLE), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x01, 0x01, INPUT_CTRL), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID), + AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, 2, 16, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_FREQ)) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UAC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor audio_v1_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t audio_v1_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, 0x00, 0x01), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, IN_CHANNEL_NUM, INPUT_CH_ENABLE), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x01, 0x01, INPUT_CTRL), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID), + AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, 2, 16, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_FREQ)), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'A', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '0' + IN_CHANNEL_NUM, 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +volatile bool tx_flag = 0; +volatile bool ep_tx_busy_flag = false; +volatile uint32_t s_mic_sample_rate; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_audio_open(uint8_t busid, uint8_t intf) +{ + tx_flag = 1; + ep_tx_busy_flag = false; + USB_LOG_RAW("OPEN\r\n"); +} + +void usbd_audio_close(uint8_t busid, uint8_t intf) +{ + USB_LOG_RAW("CLOSE\r\n"); + ep_tx_busy_flag = false; + tx_flag = 0; +} + +void usbd_audio_set_sampling_freq(uint8_t busid, uint8_t ep, uint32_t sampling_freq) +{ + if (ep == AUDIO_IN_EP) { + s_mic_sample_rate = sampling_freq; + } +} + +uint32_t usbd_audio_get_sampling_freq(uint8_t busid, uint8_t ep) +{ + (void)busid; + + uint32_t freq = 0; + + if (ep == AUDIO_IN_EP) { + freq = s_mic_sample_rate; + } + + return freq; +} + +void usbd_audio_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + ep_tx_busy_flag = false; +} + +static struct usbd_endpoint audio_in_ep = { + .ep_cb = usbd_audio_iso_callback, + .ep_addr = AUDIO_IN_EP +}; + +struct usbd_interface intf0; +struct usbd_interface intf1; + +struct audio_entity_info audio_entity_table[] = { + { .bEntityId = AUDIO_IN_FU_ID, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .ep = AUDIO_IN_EP }, +}; + +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + +void audio_v1_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &audio_v1_descriptor); +#else + usbd_desc_register(busid, audio_v1_descriptor); +#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0100, audio_entity_table, 1)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0100, audio_entity_table, 1)); + usbd_add_endpoint(busid, &audio_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[AUDIO_IN_PACKET]; + +void audio_test(uint8_t busid) +{ + while (1) { + if (tx_flag) { + memset(write_buffer, 'a', AUDIO_IN_PACKET); + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, AUDIO_IN_EP, write_buffer, AUDIO_IN_PACKET); + while (ep_tx_busy_flag) { + if (tx_flag == false) { + break; + } + } + } + } +} diff --git a/src/lib/CherryUSB/demo/audio_v1_mic_speaker_multichan_template.c b/src/lib/CherryUSB/demo/audio_v1_mic_speaker_multichan_template.c new file mode 100644 index 000000000..30fee1e2d --- /dev/null +++ b/src/lib/CherryUSB/demo/audio_v1_mic_speaker_multichan_template.c @@ -0,0 +1,484 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_audio.h" + +#define USING_FEEDBACK 0 + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USB_HS +#define EP_INTERVAL 0x04 +#define FEEDBACK_ENDP_PACKET_SIZE 0x04 +#else +#define EP_INTERVAL 0x01 +#define FEEDBACK_ENDP_PACKET_SIZE 0x03 +#endif + +#define AUDIO_IN_EP 0x81 +#define AUDIO_OUT_EP 0x02 +#define AUDIO_OUT_FEEDBACK_EP 0x83 + +#define AUDIO_IN_FU_ID 0x02 +#define AUDIO_OUT_FU_ID 0x05 + +#define IN_CHANNEL_NUM 2 + +#if IN_CHANNEL_NUM == 1 +#define INPUT_CTRL 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0001 +#elif IN_CHANNEL_NUM == 2 +#define INPUT_CTRL 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0003 +#elif IN_CHANNEL_NUM == 3 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0007 +#elif IN_CHANNEL_NUM == 4 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x000f +#elif IN_CHANNEL_NUM == 5 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x001f +#elif IN_CHANNEL_NUM == 6 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x003F +#elif IN_CHANNEL_NUM == 7 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x007f +#elif IN_CHANNEL_NUM == 8 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x00ff +#endif + +#define OUT_CHANNEL_NUM 2 + +#if OUT_CHANNEL_NUM == 1 +#define OUTPUT_CTRL 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x0001 +#elif OUT_CHANNEL_NUM == 2 +#define OUTPUT_CTRL 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x0003 +#elif OUT_CHANNEL_NUM == 3 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x0007 +#elif OUT_CHANNEL_NUM == 4 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x000f +#elif OUT_CHANNEL_NUM == 5 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x001f +#elif OUT_CHANNEL_NUM == 6 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x003F +#elif OUT_CHANNEL_NUM == 7 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x007f +#elif OUT_CHANNEL_NUM == 8 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x00ff +#endif + +/* AUDIO Class Config */ +#define AUDIO_SPEAKER_FREQ 16000U +#define AUDIO_SPEAKER_FRAME_SIZE_BYTE 2u +#define AUDIO_SPEAKER_RESOLUTION_BIT 16u +#define AUDIO_MIC_FREQ 16000U +#define AUDIO_MIC_FRAME_SIZE_BYTE 2u +#define AUDIO_MIC_RESOLUTION_BIT 16u + +#define AUDIO_SAMPLE_FREQ(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16)) + +/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */ +#define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_SPEAKER_FREQ * AUDIO_SPEAKER_FRAME_SIZE_BYTE * 2) / 1000)) +/* 16bit(2 Bytes) 双声道(Mono:2) */ +#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_MIC_FREQ * AUDIO_MIC_FRAME_SIZE_BYTE * 2) / 1000)) + +#if USING_FEEDBACK == 0 +#define USB_CONFIG_SIZE (unsigned long)(9 + \ + AUDIO_AC_DESCRIPTOR_LEN(2) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_AS_DESCRIPTOR_LEN(1) + \ + AUDIO_AS_DESCRIPTOR_LEN(1)) +#else +#define USB_CONFIG_SIZE (unsigned long)(9 + \ + AUDIO_AC_DESCRIPTOR_LEN(2) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_AS_DESCRIPTOR_LEN(1) + \ + AUDIO_AS_FEEDBACK_DESCRIPTOR_LEN(1)) +#endif + +#define AUDIO_AC_SIZ (AUDIO_SIZEOF_AC_HEADER_DESC(2) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC) + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x03, AUDIO_AC_SIZ, 0x00, 0x01, 0x02), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, IN_CHANNEL_NUM, INPUT_CH_ENABLE), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x01, 0x01, INPUT_CTRL), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x04, 0x01, OUTPUT_CTRL), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_OUTTERM_SPEAKER, AUDIO_OUT_FU_ID), + AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)), +#if USING_FEEDBACK == 0 + AUDIO_AS_DESCRIPTOR_INIT(0x02, 0x04, OUT_CHANNEL_NUM, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), +#else + AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT(0x02, 0x04, OUT_CHANNEL_NUM, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, AUDIO_OUT_PACKET, + EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), +#endif +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UAC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor audio_v1_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t audio_v1_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x03, AUDIO_AC_SIZ, 0x00, 0x01, 0x02), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, IN_CHANNEL_NUM, INPUT_CH_ENABLE), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x01, 0x01, INPUT_CTRL), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x04, 0x01, OUTPUT_CTRL), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_OUTTERM_SPEAKER, AUDIO_OUT_FU_ID), + AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)), +#if USING_FEEDBACK == 0 + AUDIO_AS_DESCRIPTOR_INIT(0x02, 0x04, OUT_CHANNEL_NUM, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), +#else + AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT(0x02, 0x04, OUT_CHANNEL_NUM, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, AUDIO_OUT_PACKET, + EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), +#endif + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'A', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ +#if USING_FEEDBACK == 0 + '1', 0x00, /* wcChar9 */ +#else + '2', 0x00, /* wcChar9 */ +#endif +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[AUDIO_OUT_PACKET]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[AUDIO_IN_PACKET]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t s_speaker_feedback_buffer[4]; + +volatile bool tx_flag = 0; +volatile bool rx_flag = 0; +volatile bool ep_tx_busy_flag = false; +volatile uint32_t s_mic_sample_rate; +volatile uint32_t s_speaker_sample_rate; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_audio_open(uint8_t busid, uint8_t intf) +{ + if (intf == 1) { + rx_flag = 1; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); +#if USING_FEEDBACK == 1 + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(s_speaker_sample_rate); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); /* uac1 can only use 10.14 */ + usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); +#endif + USB_LOG_INFO("OPEN1\r\n"); + } else { + tx_flag = 1; + ep_tx_busy_flag = false; + USB_LOG_INFO("OPEN2\r\n"); + } +} + +void usbd_audio_close(uint8_t busid, uint8_t intf) +{ + if (intf == 1) { + rx_flag = 0; + USB_LOG_INFO("CLOSE1\r\n"); + } else { + tx_flag = 0; + ep_tx_busy_flag = false; + USB_LOG_INFO("CLOSE2\r\n"); + } +} + +void usbd_audio_set_sampling_freq(uint8_t busid, uint8_t ep, uint32_t sampling_freq) +{ + if (ep == AUDIO_OUT_EP) { + s_speaker_sample_rate = sampling_freq; + } else if (ep == AUDIO_IN_EP) { + s_mic_sample_rate = sampling_freq; + } +} + +uint32_t usbd_audio_get_sampling_freq(uint8_t busid, uint8_t ep) +{ + (void)busid; + + uint32_t freq = 0; + + if (ep == AUDIO_OUT_EP) { + freq = s_speaker_sample_rate; + } else if (ep == AUDIO_IN_EP) { + freq = s_mic_sample_rate; + } + + return freq; +} + +void usbd_audio_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); +} + +void usbd_audio_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + ep_tx_busy_flag = false; +} + +#if USING_FEEDBACK == 1 +void usbd_audio_iso_out_feedback_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual feedback len:%d\r\n", (unsigned int)nbytes); + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(s_speaker_sample_rate); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); + usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); +} +#endif + +static struct usbd_endpoint audio_in_ep = { + .ep_cb = usbd_audio_in_callback, + .ep_addr = AUDIO_IN_EP +}; + +static struct usbd_endpoint audio_out_ep = { + .ep_cb = usbd_audio_out_callback, + .ep_addr = AUDIO_OUT_EP +}; + +#if USING_FEEDBACK == 1 +static struct usbd_endpoint audio_out_feedback_ep = { + .ep_cb = usbd_audio_iso_out_feedback_callback, + .ep_addr = AUDIO_OUT_FEEDBACK_EP +}; +#endif + +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; + +struct audio_entity_info audio_entity_table[] = { + { .bEntityId = AUDIO_IN_FU_ID, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .ep = AUDIO_IN_EP }, + { .bEntityId = AUDIO_OUT_FU_ID, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .ep = AUDIO_OUT_EP }, +}; + +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + +void audio_v1_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &audio_v1_descriptor); +#else + usbd_desc_register(busid, audio_v1_descriptor); +#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0100, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0100, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf2, 0x0100, audio_entity_table, 2)); + usbd_add_endpoint(busid, &audio_in_ep); + usbd_add_endpoint(busid, &audio_out_ep); +#if USING_FEEDBACK == 1 + usbd_add_endpoint(busid, &audio_out_feedback_ep); +#endif + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +void audio_v1_test(uint8_t busid) +{ + if (tx_flag) { + memset(write_buffer, 'a', AUDIO_IN_PACKET); + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, AUDIO_IN_EP, write_buffer, AUDIO_IN_PACKET); + while (ep_tx_busy_flag) { + if (tx_flag == false) { + break; + } + } + } +} diff --git a/src/lib/CherryUSB/demo/audio_v2_mic_multichan_template.c b/src/lib/CherryUSB/demo/audio_v2_mic_multichan_template.c new file mode 100644 index 000000000..fc4788ad4 --- /dev/null +++ b/src/lib/CherryUSB/demo/audio_v2_mic_multichan_template.c @@ -0,0 +1,366 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_audio.h" + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USB_HS +#define EP_INTERVAL 0x04 +#else +#define EP_INTERVAL 0x01 +#endif + +#define AUDIO_IN_EP 0x81 + +#define AUDIO_IN_CLOCK_ID 0x01 +#define AUDIO_IN_FU_ID 0x03 + +#define AUDIO_IN_MAX_FREQ 96000 +#define AUDIO_MIC_FRAME_SIZE_BYTE 2u +#define AUDIO_MIC_RESOLUTION_BIT 16u + +#define BMCONTROL (AUDIO_V2_CONTROL_MUTE | AUDIO_V2_CONTROL_VOLUME) + +#define IN_CHANNEL_NUM 2 + +#if IN_CHANNEL_NUM == 1 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x00000001 +#elif IN_CHANNEL_NUM == 2 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x00000003 +#elif IN_CHANNEL_NUM == 3 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x00000007 +#elif IN_CHANNEL_NUM == 4 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x0000000f +#elif IN_CHANNEL_NUM == 5 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x0000001f +#elif IN_CHANNEL_NUM == 6 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x0000003F +#elif IN_CHANNEL_NUM == 7 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x0000007f +#elif IN_CHANNEL_NUM == 8 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x000000ff +#endif + +#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_IN_MAX_FREQ * AUDIO_MIC_FRAME_SIZE_BYTE * IN_CHANNEL_NUM) / 1000)) + +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_DESCRIPTOR_LEN) + +#define AUDIO_AC_SIZ (AUDIO_V2_SIZEOF_AC_HEADER_DESC + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC) + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, AUDIO_CATEGORY_MICROPHONE, 0x00, 0x00), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_IN_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_INTERM_MIC, AUDIO_IN_CLOCK_ID, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x02, INPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID, AUDIO_IN_CLOCK_ID, 0x0000), + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x04, IN_CHANNEL_NUM, INPUT_CH_ENABLE, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UAC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor audio_v2_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t audio_v2_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, AUDIO_CATEGORY_MICROPHONE, 0x00, 0x00), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_IN_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_INTERM_MIC, AUDIO_IN_CLOCK_ID, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x02, INPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID, AUDIO_IN_CLOCK_ID, 0x0000), + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x04, IN_CHANNEL_NUM, INPUT_CH_ENABLE, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'A', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '0', 0x00, /* wcChar4 */ + '3', 0x00, /* wcChar5 */ + '1', 0x00, /* wcChar6 */ + '0', 0x00, /* wcChar7 */ + '0', 0x00, /* wcChar8 */ + '4', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +static const uint8_t mic_default_sampling_freq_table[] = { + AUDIO_SAMPLE_FREQ_NUM(5), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(0x00), +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[AUDIO_IN_PACKET]; + +volatile bool tx_flag = 0; +volatile bool ep_tx_busy_flag = false; +volatile uint32_t s_mic_sample_rate; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_audio_open(uint8_t busid, uint8_t intf) +{ + tx_flag = 1; + USB_LOG_RAW("OPEN\r\n"); +} + +void usbd_audio_close(uint8_t busid, uint8_t intf) +{ + USB_LOG_RAW("CLOSE\r\n"); + tx_flag = 0; +} + +void usbd_audio_set_sampling_freq(uint8_t busid, uint8_t ep, uint32_t sampling_freq) +{ + if (ep == AUDIO_IN_EP) { + s_mic_sample_rate = sampling_freq; + } +} + +uint32_t usbd_audio_get_sampling_freq(uint8_t busid, uint8_t ep) +{ + (void)busid; + + uint32_t freq = 0; + + if (ep == AUDIO_IN_EP) { + freq = s_mic_sample_rate; + } + + return freq; +} + +void usbd_audio_get_sampling_freq_table(uint8_t busid, uint8_t ep, uint8_t **sampling_freq_table) +{ + if (ep == AUDIO_IN_EP) { + *sampling_freq_table = (uint8_t *)mic_default_sampling_freq_table; + } +} + +void usbd_audio_iso_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + ep_tx_busy_flag = false; +} + +static struct usbd_endpoint audio_in_ep = { + .ep_cb = usbd_audio_iso_in_callback, + .ep_addr = AUDIO_IN_EP +}; + +struct usbd_interface intf0; +struct usbd_interface intf1; + +struct audio_entity_info audio_entity_table[] = { + { .bEntityId = AUDIO_IN_CLOCK_ID, + .bDescriptorSubtype = AUDIO_CONTROL_CLOCK_SOURCE, + .ep = AUDIO_IN_EP }, + { .bEntityId = AUDIO_IN_FU_ID, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .ep = AUDIO_IN_EP }, +}; + +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + +void audio_v2_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &audio_v2_descriptor); +#else + usbd_desc_register(busid, audio_v2_descriptor); +#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0200, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0200, audio_entity_table, 2)); + usbd_add_endpoint(busid, &audio_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +void audio_v2_test(uint8_t busid) +{ + if (tx_flag) { + memset(write_buffer, 'a', AUDIO_IN_PACKET); + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, AUDIO_IN_EP, write_buffer, AUDIO_IN_PACKET); + while (ep_tx_busy_flag) { + if (tx_flag == false) { + break; + } + } + } +} diff --git a/src/lib/CherryUSB/demo/audio_v2_mic_speaker_multichan_template.c b/src/lib/CherryUSB/demo/audio_v2_mic_speaker_multichan_template.c new file mode 100644 index 000000000..e1d6141a4 --- /dev/null +++ b/src/lib/CherryUSB/demo/audio_v2_mic_speaker_multichan_template.c @@ -0,0 +1,553 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_audio.h" + +#define USING_FEEDBACK 0 + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USB_HS +#define EP_INTERVAL 0x04 +#define FEEDBACK_ENDP_PACKET_SIZE 0x04 +#else +#define EP_INTERVAL 0x01 +#define FEEDBACK_ENDP_PACKET_SIZE 0x03 +#endif + +#define AUDIO_OUT_EP 0x02 +#define AUDIO_IN_EP 0x81 +#define AUDIO_OUT_FEEDBACK_EP 0x83 + +#define AUDIO_OUT_CLOCK_ID 0x01 +#define AUDIO_OUT_FU_ID 0x03 +#define AUDIO_IN_CLOCK_ID 0x05 +#define AUDIO_IN_FU_ID 0x07 + +#define AUDIO_OUT_MAX_FREQ 96000 +#define AUDIO_SPEAKER_FRAME_SIZE_BYTE 2u +#define AUDIO_SPEAKER_RESOLUTION_BIT 16u + +#define AUDIO_IN_MAX_FREQ 96000 +#define AUDIO_MIC_FRAME_SIZE_BYTE 2u +#define AUDIO_MIC_RESOLUTION_BIT 16u + +#define BMCONTROL (AUDIO_V2_CONTROL_MUTE | AUDIO_V2_CONTROL_VOLUME) + +#define IN_CHANNEL_NUM 2 + +#if IN_CHANNEL_NUM == 1 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x00000001 +#elif IN_CHANNEL_NUM == 2 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x00000003 +#elif IN_CHANNEL_NUM == 3 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x00000007 +#elif IN_CHANNEL_NUM == 4 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x0000000f +#elif IN_CHANNEL_NUM == 5 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x0000001f +#elif IN_CHANNEL_NUM == 6 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x0000003F +#elif IN_CHANNEL_NUM == 7 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x0000007f +#elif IN_CHANNEL_NUM == 8 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x000000ff +#endif + +#define OUT_CHANNEL_NUM 2 + +#if OUT_CHANNEL_NUM == 1 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x00000001 +#elif OUT_CHANNEL_NUM == 2 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x00000003 +#elif OUT_CHANNEL_NUM == 3 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x00000007 +#elif OUT_CHANNEL_NUM == 4 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x0000000f +#elif OUT_CHANNEL_NUM == 5 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x0000001f +#elif OUT_CHANNEL_NUM == 6 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x0000003F +#elif OUT_CHANNEL_NUM == 7 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x0000007f +#elif OUT_CHANNEL_NUM == 8 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x000000ff +#endif + +/* AudioFreq * DataSize (2 bytes) * NumChannels */ +#define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_OUT_MAX_FREQ * AUDIO_SPEAKER_FRAME_SIZE_BYTE * OUT_CHANNEL_NUM) / 1000)) +#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_IN_MAX_FREQ * AUDIO_MIC_FRAME_SIZE_BYTE * IN_CHANNEL_NUM) / 1000)) + +#if USING_FEEDBACK == 0 +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_DESCRIPTOR_LEN + \ + AUDIO_V2_AS_DESCRIPTOR_LEN) +#else +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_LEN + \ + AUDIO_V2_AS_DESCRIPTOR_LEN) +#endif + +#define AUDIO_AC_SIZ (AUDIO_V2_SIZEOF_AC_HEADER_DESC + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC) + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x03, AUDIO_AC_SIZ, AUDIO_CATEGORY_UNDEF, 0x00, 0x00), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_OUT_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, AUDIO_OUT_CLOCK_ID, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x02, OUTPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, AUDIO_OUT_FU_ID, AUDIO_OUT_CLOCK_ID, 0x0000), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_IN_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_INTERM_MIC, AUDIO_IN_CLOCK_ID, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x06, INPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x08, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID, AUDIO_IN_CLOCK_ID, 0x0000), +#if USING_FEEDBACK == 0 + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL), +#else + AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP), +#endif + AUDIO_V2_AS_DESCRIPTOR_INIT(0x02, 0x08, IN_CHANNEL_NUM, INPUT_CH_ENABLE, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UAC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor audio_v2_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +uint8_t audio_v2_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x03, AUDIO_AC_SIZ, AUDIO_CATEGORY_UNDEF, 0x00, 0x00), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_OUT_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, AUDIO_OUT_CLOCK_ID, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x02, OUTPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, AUDIO_OUT_FU_ID, AUDIO_OUT_CLOCK_ID, 0x0000), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_IN_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_INTERM_MIC, AUDIO_IN_CLOCK_ID, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x06, INPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x08, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID, AUDIO_IN_CLOCK_ID, 0x0000), +#if USING_FEEDBACK == 0 + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL), +#else + AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP), +#endif + AUDIO_V2_AS_DESCRIPTOR_INIT(0x02, 0x08, IN_CHANNEL_NUM, INPUT_CH_ENABLE, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'A', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '0', 0x00, /* wcChar4 */ + '3', 0x00, /* wcChar5 */ + '1', 0x00, /* wcChar6 */ + '0', 0x00, /* wcChar7 */ + '0', 0x00, /* wcChar8 */ +#if USING_FEEDBACK == 0 + '3', 0x00, /* wcChar9 */ +#else + '4', 0x00, /* wcChar9 */ +#endif +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +static const uint8_t speaker_default_sampling_freq_table[] = { + AUDIO_SAMPLE_FREQ_NUM(5), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(0x00) +}; + +static const uint8_t mic_default_sampling_freq_table[] = { + AUDIO_SAMPLE_FREQ_NUM(5), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(0x00) +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[AUDIO_OUT_PACKET]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[AUDIO_IN_PACKET]; + +volatile bool tx_flag = 0; +volatile bool rx_flag = 0; +volatile bool ep_tx_busy_flag = false; +volatile uint32_t s_mic_sample_rate; +volatile uint32_t s_speaker_sample_rate; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_audio_open(uint8_t busid, uint8_t intf) +{ + if (intf == 1) { + rx_flag = 1; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); +#if USING_FEEDBACK == 1 +#ifdef CONFIG_USB_HS + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_HS(AUDIO_FREQ); + AUDIO_FEEDBACK_TO_BUF_HS(s_speaker_feedback_buffer, feedback_value); +#else + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(AUDIO_FREQ); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); +#endif + usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); +#endif + USB_LOG_RAW("OPEN1\r\n"); + } else { + tx_flag = 1; + USB_LOG_RAW("OPEN2\r\n"); + } +} + +void usbd_audio_close(uint8_t busid, uint8_t intf) +{ + if (intf == 1) { + rx_flag = 0; + USB_LOG_RAW("CLOSE1\r\n"); + } else { + tx_flag = 0; + USB_LOG_RAW("CLOSE2\r\n"); + } +} + +void usbd_audio_set_sampling_freq(uint8_t busid, uint8_t ep, uint32_t sampling_freq) +{ + if (ep == AUDIO_OUT_EP) { + s_speaker_sample_rate = sampling_freq; + } else if (ep == AUDIO_IN_EP) { + s_mic_sample_rate = sampling_freq; + } +} + +uint32_t usbd_audio_get_sampling_freq(uint8_t busid, uint8_t ep) +{ + (void)busid; + + uint32_t freq = 0; + + if (ep == AUDIO_OUT_EP) { + freq = s_speaker_sample_rate; + } else if (ep == AUDIO_IN_EP) { + freq = s_mic_sample_rate; + } + + return freq; +} + +void usbd_audio_get_sampling_freq_table(uint8_t busid, uint8_t ep, uint8_t **sampling_freq_table) +{ + if (ep == AUDIO_OUT_EP) { + *sampling_freq_table = (uint8_t *)speaker_default_sampling_freq_table; + } else if (ep == AUDIO_IN_EP) { + *sampling_freq_table = (uint8_t *)mic_default_sampling_freq_table; + } else { + } +} + +void usbd_audio_iso_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); +} + +void usbd_audio_iso_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + ep_tx_busy_flag = false; +} + +#if USING_FEEDBACK == 1 +void usbd_audio_iso_out_feedback_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual feedback len:%d\r\n", nbytes); +#ifdef CONFIG_USB_HS + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_HS(s_speaker_sample_rate); + AUDIO_FEEDBACK_TO_BUF_HS(s_speaker_feedback_buffer, feedback_value); +#else + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(s_speaker_sample_rate); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); +#endif + usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); +} +#endif + +static struct usbd_endpoint audio_out_ep = { + .ep_cb = usbd_audio_iso_out_callback, + .ep_addr = AUDIO_OUT_EP +}; + +static struct usbd_endpoint audio_in_ep = { + .ep_cb = usbd_audio_iso_in_callback, + .ep_addr = AUDIO_IN_EP +}; + +#if USING_FEEDBACK == 1 +static struct usbd_endpoint audio_out_feedback_ep = { + .ep_cb = usbd_audio_iso_out_feedback_callback, + .ep_addr = AUDIO_OUT_FEEDBACK_EP +}; +#endif + +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; + +struct audio_entity_info audio_entity_table[] = { + { .bEntityId = AUDIO_OUT_CLOCK_ID, + .bDescriptorSubtype = AUDIO_CONTROL_CLOCK_SOURCE, + .ep = AUDIO_OUT_EP }, + { .bEntityId = AUDIO_OUT_FU_ID, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .ep = AUDIO_OUT_EP }, + { .bEntityId = AUDIO_IN_CLOCK_ID, + .bDescriptorSubtype = AUDIO_CONTROL_CLOCK_SOURCE, + .ep = AUDIO_IN_EP }, + { .bEntityId = AUDIO_IN_FU_ID, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .ep = AUDIO_IN_EP }, +}; + +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + +void audio_v2_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &audio_v2_descriptor); +#else + usbd_desc_register(busid, audio_v2_descriptor); +#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0200, audio_entity_table, 4)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0200, audio_entity_table, 4)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf2, 0x0200, audio_entity_table, 4)); + usbd_add_endpoint(busid, &audio_in_ep); + usbd_add_endpoint(busid, &audio_out_ep); +#if USING_FEEDBACK == 1 + usbd_add_endpoint(busid, &audio_out_feedback_ep); +#endif + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +void audio_v2_test(uint8_t busid) +{ + if (tx_flag) { + memset(write_buffer, 'a', AUDIO_IN_PACKET); + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, AUDIO_IN_EP, write_buffer, AUDIO_IN_PACKET); + while (ep_tx_busy_flag) { + if (tx_flag == false) { + break; + } + } + } + if (rx_flag) { + } +} diff --git a/src/lib/CherryUSB/demo/audio_v2_speaker_multichan_template.c b/src/lib/CherryUSB/demo/audio_v2_speaker_multichan_template.c new file mode 100644 index 000000000..2bcc1aa60 --- /dev/null +++ b/src/lib/CherryUSB/demo/audio_v2_speaker_multichan_template.c @@ -0,0 +1,422 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_audio.h" + +#define USING_FEEDBACK 0 + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USB_HS +#define EP_INTERVAL 0x04 +#define FEEDBACK_ENDP_PACKET_SIZE 0x04 +#else +#define EP_INTERVAL 0x01 +#define FEEDBACK_ENDP_PACKET_SIZE 0x03 +#endif + +#define AUDIO_OUT_EP 0x01 +#define AUDIO_OUT_FEEDBACK_EP 0x82 + +#define AUDIO_OUT_CLOCK_ID 0x01 +#define AUDIO_OUT_FU_ID 0x03 + +#define AUDIO_OUT_MAX_FREQ 96000 +#define HALF_WORD_BYTES 2 //2 half word (one channel) +#define SAMPLE_BITS 16 //16 bit per channel + +#define BMCONTROL (AUDIO_V2_CONTROL_MUTE | AUDIO_V2_CONTROL_VOLUME) + +#define OUT_CHANNEL_NUM 2 + +#if OUT_CHANNEL_NUM == 1 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x00000001 +#elif OUT_CHANNEL_NUM == 2 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x00000003 +#elif OUT_CHANNEL_NUM == 3 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x00000007 +#elif OUT_CHANNEL_NUM == 4 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x0000000f +#elif OUT_CHANNEL_NUM == 5 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x0000001f +#elif OUT_CHANNEL_NUM == 6 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x0000003F +#elif OUT_CHANNEL_NUM == 7 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x0000007f +#elif OUT_CHANNEL_NUM == 8 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x000000ff +#endif + +#define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_OUT_MAX_FREQ * HALF_WORD_BYTES * OUT_CHANNEL_NUM) / 1000)) + +#if USING_FEEDBACK == 0 +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_DESCRIPTOR_LEN) +#else +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_LEN) +#endif + +#define AUDIO_AC_SIZ (AUDIO_V2_SIZEOF_AC_HEADER_DESC + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC) + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, AUDIO_CATEGORY_SPEAKER, 0x00, 0x00), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_OUT_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, AUDIO_OUT_CLOCK_ID, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x02, OUTPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, AUDIO_OUT_FU_ID, AUDIO_OUT_CLOCK_ID, 0x0000), +#if USING_FEEDBACK == 0 + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL), +#else + AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP), +#endif +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UAC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor audio_v2_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t audio_v2_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, AUDIO_CATEGORY_SPEAKER, 0x00, 0x00), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_OUT_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, AUDIO_OUT_CLOCK_ID, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x02, OUTPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, AUDIO_OUT_FU_ID, AUDIO_OUT_CLOCK_ID, 0x0000), +#if USING_FEEDBACK == 0 + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL), +#else + AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP), +#endif + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'A', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '0', 0x00, /* wcChar4 */ + '3', 0x00, /* wcChar5 */ + '1', 0x00, /* wcChar6 */ + '0', 0x00, /* wcChar7 */ + '0', 0x00, /* wcChar8 */ +#if USING_FEEDBACK == 0 + '3', 0x00, /* wcChar9 */ +#else + '4', 0x00, /* wcChar9 */ +#endif +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +static const uint8_t default_sampling_freq_table[] = { + AUDIO_SAMPLE_FREQ_NUM(5), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(0x00), +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[AUDIO_OUT_PACKET]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t s_speaker_feedback_buffer[4]; + +volatile bool rx_flag = 0; +volatile uint32_t s_speaker_sample_rate; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_audio_open(uint8_t busid, uint8_t intf) +{ + rx_flag = 1; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); +#if USING_FEEDBACK == 1 +#ifdef CONFIG_USB_HS + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_HS(s_speaker_sample_rate); + AUDIO_FEEDBACK_TO_BUF_HS(s_speaker_feedback_buffer, feedback_value); +#else + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(s_speaker_sample_rate); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); +#endif + usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); +#endif + USB_LOG_RAW("OPEN\r\n"); +} + +void usbd_audio_close(uint8_t busid, uint8_t intf) +{ + USB_LOG_RAW("CLOSE\r\n"); + rx_flag = 0; +} + +void usbd_audio_set_sampling_freq(uint8_t busid, uint8_t ep, uint32_t sampling_freq) +{ + if (ep == AUDIO_OUT_EP) { + s_speaker_sample_rate = sampling_freq; + } +} + +uint32_t usbd_audio_get_sampling_freq(uint8_t busid, uint8_t ep) +{ + (void)busid; + + uint32_t freq = 0; + + if (ep == AUDIO_OUT_EP) { + freq = s_speaker_sample_rate; + } + + return freq; +} + +void usbd_audio_get_sampling_freq_table(uint8_t busid, uint8_t ep, uint8_t **sampling_freq_table) +{ + if (ep == AUDIO_OUT_EP) { + *sampling_freq_table = (uint8_t *)default_sampling_freq_table; + } +} + +void usbd_audio_iso_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); +} + +#if USING_FEEDBACK == 1 +void usbd_audio_iso_out_feedback_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual feedback len:%d\r\n", (unsigned int)nbytes); +#ifdef CONFIG_USB_HS + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_HS(s_speaker_sample_rate); + AUDIO_FEEDBACK_TO_BUF_HS(s_speaker_feedback_buffer, feedback_value); +#else + uint32_t feedback_value = AUDIO_FREQ_TO_FEEDBACK_FS(s_speaker_sample_rate); + AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); +#endif + usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); +} +#endif + +static struct usbd_endpoint audio_out_ep = { + .ep_cb = usbd_audio_iso_out_callback, + .ep_addr = AUDIO_OUT_EP +}; + +#if USING_FEEDBACK == 1 +static struct usbd_endpoint audio_out_feedback_ep = { + .ep_cb = usbd_audio_iso_out_feedback_callback, + .ep_addr = AUDIO_OUT_FEEDBACK_EP +}; +#endif + +struct usbd_interface intf0; +struct usbd_interface intf1; + +struct audio_entity_info audio_entity_table[] = { + { .bEntityId = AUDIO_OUT_CLOCK_ID, + .bDescriptorSubtype = AUDIO_CONTROL_CLOCK_SOURCE, + .ep = AUDIO_OUT_EP }, + { .bEntityId = AUDIO_OUT_FU_ID, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .ep = AUDIO_OUT_EP }, +}; + +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + +void audio_v2_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &audio_v2_descriptor); +#else + usbd_desc_register(busid, audio_v2_descriptor); +#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0200, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0200, audio_entity_table, 2)); + usbd_add_endpoint(busid, &audio_out_ep); +#if USING_FEEDBACK == 1 + usbd_add_endpoint(busid, &audio_out_feedback_ep); +#endif + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +void audio_v2_test(uint8_t busid) +{ + if (rx_flag) { + } +} diff --git a/src/lib/CherryUSB/demo/bootuf2/bootuf2_config.h b/src/lib/CherryUSB/demo/bootuf2/bootuf2_config.h new file mode 100644 index 000000000..307d09d2d --- /dev/null +++ b/src/lib/CherryUSB/demo/bootuf2/bootuf2_config.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef BOOTUF2_CONFIG_H +#define BOOTUF2_CONFIG_H + +#define CONFIG_PRODUCT "CherryUSB" +#define CONFIG_BOARD "CherryUSB BOARD" +#define CONFIG_BOOTUF2_INDEX_URL "https://github.com/cherry-embedded" +#define CONFIG_BOOTUF2_JOIN_URL "http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=GyH2M5XfWTHQzmZis4ClpgvfdObPrvtk&authKey=LmcLhfno%2BiW51wmgVC%2F8WoYwUXqiclzWDHMU1Jy1d6S8cECJ4Q7bfJ%2FTe67RLakI&noverify=0&group_code=642693751" + +#define CONFIG_BOOTUF2_CACHE_SIZE 4096 +#define CONFIG_BOOTUF2_SECTOR_SIZE 512 +#define CONFIG_BOOTUF2_SECTOR_PER_CLUSTER 2 +#define CONFIG_BOOTUF2_SECTOR_RESERVED 1 +#define CONFIG_BOOTUF2_NUM_OF_FAT 2 +#define CONFIG_BOOTUF2_ROOT_ENTRIES 64 + +#define CONFIG_BOOTUF2_FAMILYID 0xFFFFFFFF +#define CONFIG_BOOTUF2_FLASHMAX 0x800000 +#define CONFIG_BOOTUF2_PAGE_COUNTMAX 1024 + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/bootuf2/cherryuf2.png b/src/lib/CherryUSB/demo/bootuf2/cherryuf2.png new file mode 100644 index 000000000..aff7ee4df Binary files /dev/null and b/src/lib/CherryUSB/demo/bootuf2/cherryuf2.png differ diff --git a/src/lib/CherryUSB/demo/bootuf2/msc_bootuf2_template.c b/src/lib/CherryUSB/demo/bootuf2/msc_bootuf2_template.c new file mode 100644 index 000000000..158866057 --- /dev/null +++ b/src/lib/CherryUSB/demo/bootuf2/msc_bootuf2_template.c @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_msc.h" +#include "bootuf2.h" + +#define MSC_IN_EP 0x81 +#define MSC_OUT_EP 0x02 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#define USB_CONFIG_SIZE (9 + MSC_DESCRIPTOR_LEN) + +#ifdef CONFIG_USB_HS +#define MSC_MAX_MPS 512 +#else +#define MSC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MSC_DESCRIPTOR_INIT(0x00, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UF2 DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor msc_bootuf2_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t msc_bootuf2_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MSC_DESCRIPTOR_INIT(0x00, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'F', 0x00, /* wcChar11 */ + '2', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + bootuf2_init(); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size) +{ + *block_num = bootuf2_get_sector_count(); + *block_size = bootuf2_get_sector_size(); + + USB_LOG_INFO("sector count:%d, sector size:%d\n", (unsigned int)*block_num, (unsigned int)*block_size); +} +int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + boot2uf2_read_sector(sector, buffer, length / bootuf2_get_sector_size()); + return 0; +} + +int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + bootuf2_write_sector(sector, buffer, length / bootuf2_get_sector_size()); + return 0; +} + +static struct usbd_interface intf0; + +void msc_bootuf2_init(uint8_t busid, uintptr_t reg_base) +{ + boot2uf2_flash_init(); +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &msc_bootuf2_descriptor); +#else + usbd_desc_register(busid, msc_bootuf2_descriptor); +#endif + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf0, MSC_OUT_EP, MSC_IN_EP)); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +void boot2uf2_flash_init(void) +{ +} + +int bootuf2_flash_write(uint32_t address, const uint8_t *data, size_t size) +{ + USB_LOG_INFO("address:%08x, size:%d\n", (unsigned int)address, (unsigned int)size); + return 0; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/cdc_acm_hid_msc_template.c b/src/lib/CherryUSB/demo/cdc_acm_hid_msc_template.c new file mode 100644 index 000000000..14e08f6e2 --- /dev/null +++ b/src/lib/CherryUSB/demo/cdc_acm_hid_msc_template.c @@ -0,0 +1,436 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_msc.h" +#include "usbd_cdc_acm.h" +#include "usbd_hid.h" + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 + +#define MSC_IN_EP 0x84 +#define MSC_OUT_EP 0x05 + +/*!< endpoint address */ +#define HID_INT_EP 0x86 +#define HID_INT_EP_SIZE 4 +#define HID_INT_EP_INTERVAL 10 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< report descriptor size */ +#define HID_MOUSE_REPORT_DESC_SIZE 74 + +#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN + MSC_DESCRIPTOR_LEN + 25) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#else +#define CDC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USB_HS +#define MSC_MAX_MPS 512 +#else +#define MSC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x04, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + MSC_DESCRIPTOR_INIT(0x02, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02), + HID_MOUSE_DESCRIPTOR_INIT(0x03, 0x01, HID_MOUSE_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CDC MSC HID DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_acm_hid_msc_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t cdc_acm_hid_msc_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x04, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + MSC_DESCRIPTOR_INIT(0x02, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02), + HID_MOUSE_DESCRIPTOR_INIT(0x03, 0x01, HID_MOUSE_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'C', 0x00, /* wcChar10 */ + 'M', 0x00, /* wcChar11 */ + 'H', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +/*!< hid mouse report descriptor */ +static const uint8_t hid_mouse_report_desc[HID_MOUSE_REPORT_DESC_SIZE] = { + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x02, // USAGE (Mouse) + 0xA1, 0x01, // COLLECTION (Application) + 0x09, 0x01, // USAGE (Pointer) + + 0xA1, 0x00, // COLLECTION (Physical) + 0x05, 0x09, // USAGE_PAGE (Button) + 0x19, 0x01, // USAGE_MINIMUM (Button 1) + 0x29, 0x03, // USAGE_MAXIMUM (Button 3) + + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x95, 0x03, // REPORT_COUNT (3) + 0x75, 0x01, // REPORT_SIZE (1) + + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x05, // REPORT_SIZE (5) + 0x81, 0x01, // INPUT (Cnst,Var,Abs) + + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x30, // USAGE (X) + 0x09, 0x31, // USAGE (Y) + 0x09, 0x38, + + 0x15, 0x81, // LOGICAL_MINIMUM (-127) + 0x25, 0x7F, // LOGICAL_MAXIMUM (127) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x03, // REPORT_COUNT (2) + + 0x81, 0x06, // INPUT (Data,Var,Rel) + 0xC0, 0x09, + 0x3c, 0x05, + 0xff, 0x09, + + 0x01, 0x15, + 0x00, 0x25, + 0x01, 0x75, + 0x01, 0x95, + + 0x02, 0xb1, + 0x22, 0x75, + 0x06, 0x95, + 0x01, 0xb1, + + 0x01, 0xc0 // END_COLLECTION +}; + +/*!< mouse report struct */ +struct hid_mouse { + uint8_t buttons; + int8_t x; + int8_t y; + int8_t wheel; +}; + +/*!< mouse report */ +static struct hid_mouse mouse_cfg; + +#define HID_STATE_IDLE 0 +#define HID_STATE_BUSY 1 + +/*!< hid state ! Data can be sent only when state is idle */ +static volatile uint8_t hid_state = HID_STATE_IDLE; + +/* function ------------------------------------------------------------------*/ +static void usbd_hid_int_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + hid_state = HID_STATE_IDLE; +} + +/*!< endpoint call back */ +static struct usbd_endpoint hid_in_ep = { + .ep_cb = usbd_hid_int_callback, + .ep_addr = HID_INT_EP +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + hid_state = HID_STATE_IDLE; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +/*!< endpoint call back */ +struct usbd_endpoint cdc_out_ep = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; +struct usbd_interface intf3; + +void cdc_acm_hid_msc_descriptor_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_acm_hid_msc_descriptor); +#else + usbd_desc_register(busid, cdc_acm_hid_msc_descriptor); +#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf2, MSC_OUT_EP, MSC_IN_EP)); + + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf3, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &hid_in_ep); + + /*!< init mouse report data */ + mouse_cfg.buttons = 0; + mouse_cfg.wheel = 0; + mouse_cfg.x = 0; + mouse_cfg.y = 0; + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +/** + * @brief hid mouse test + * @pre none + * @param[in] none + * @retval none + */ +void hid_mouse_test(uint8_t busid) +{ + if(usb_device_is_configured(busid) == false) { + return; + } + /*!< move mouse pointer */ + mouse_cfg.x += 10; + mouse_cfg.y = 0; + + hid_state = HID_STATE_BUSY; + usbd_ep_start_write(busid, HID_INT_EP, (uint8_t *)&mouse_cfg, 4); + while (hid_state == HID_STATE_BUSY) { + } +} + +volatile uint8_t dtr_enable = 0; + +void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) +{ + if (dtr) { + dtr_enable = 1; + } else { + dtr_enable = 0; + } +} + +void cdc_acm_data_send_with_dtr_test(uint8_t busid) +{ + if (dtr_enable) { + memset(&write_buffer[10], 'a', 2038); + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048); + while (ep_tx_busy_flag) { + } + } +} + +#define BLOCK_SIZE 512 +#define BLOCK_COUNT 10 + +typedef struct +{ + uint8_t BlockSpace[BLOCK_SIZE]; +} BLOCK_TYPE; + +BLOCK_TYPE mass_block[BLOCK_COUNT]; + +void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size) +{ + *block_num = 1000; //Pretend having so many buffer,not has actually. + *block_size = BLOCK_SIZE; +} +int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (sector < 10) + memcpy(buffer, mass_block[sector].BlockSpace, length); + return 0; +} + +int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (sector < 10) + memcpy(mass_block[sector].BlockSpace, buffer, length); + return 0; +} diff --git a/src/lib/CherryUSB/demo/cdc_acm_mavlink_template.c b/src/lib/CherryUSB/demo/cdc_acm_mavlink_template.c new file mode 100644 index 000000000..0a8bc3b66 --- /dev/null +++ b/src/lib/CherryUSB/demo/cdc_acm_mavlink_template.c @@ -0,0 +1,337 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_cdc_acm.h" +#include "chry_ringbuffer.h" +#include + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#else +#define CDC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CDC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +static const uint8_t cdc_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'C', 0x00, /* wcChar10 */ + 'D', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +chry_ringbuffer_t usb_rx_rb; +uint8_t usb_rx_buffer[2048]; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t temp_rx_buffer[512]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t usb_tx_buffer[MAVLINK_MAX_PACKET_LEN]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, temp_rx_buffer, usbd_get_ep_mps(busid, CDC_OUT_EP)); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + + chry_ringbuffer_write(&usb_rx_rb, temp_rx_buffer, nbytes); + usbd_ep_start_read(busid, CDC_OUT_EP, temp_rx_buffer, usbd_get_ep_mps(busid, CDC_OUT_EP)); +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +/*!< endpoint call back */ +struct usbd_endpoint cdc_out_ep = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +static struct usbd_interface intf0; +static struct usbd_interface intf1; + +void cdc_acm_mavlink_init(uint8_t busid, uintptr_t reg_base) +{ + chry_ringbuffer_init(&usb_rx_rb, usb_rx_buffer, sizeof(usb_rx_buffer)); +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_descriptor); +#else + usbd_desc_register(busid, cdc_descriptor); +#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +void cdc_acm_mavlink_write(uint8_t *data, uint32_t len) +{ + if (!usb_device_is_configured(0)) { + return; + } + ep_tx_busy_flag = true; + usbd_ep_start_write(0, CDC_IN_EP, data, len); + while (ep_tx_busy_flag) { + } +} + +void send_heartbeat(void) +{ + mavlink_message_t message; + + const uint8_t system_id = 42; + const uint8_t base_mode = 0; + const uint8_t custom_mode = 0; + mavlink_msg_heartbeat_pack_chan( + system_id, + MAV_COMP_ID_PERIPHERAL, + MAVLINK_COMM_0, + &message, + MAV_TYPE_GENERIC, + MAV_AUTOPILOT_GENERIC, + base_mode, + custom_mode, + MAV_STATE_STANDBY); + + const int len = mavlink_msg_to_send_buffer(usb_tx_buffer, &message); + cdc_acm_mavlink_write(usb_tx_buffer, len); +} + +void handle_heartbeat(const mavlink_message_t *message) +{ + mavlink_heartbeat_t heartbeat; + mavlink_msg_heartbeat_decode(message, &heartbeat); + + USB_LOG_RAW("Got heartbeat from "); + switch (heartbeat.autopilot) { + case MAV_AUTOPILOT_GENERIC: + USB_LOG_RAW("generic"); + break; + case MAV_AUTOPILOT_ARDUPILOTMEGA: + USB_LOG_RAW("ArduPilot"); + break; + case MAV_AUTOPILOT_PX4: + USB_LOG_RAW("PX4"); + break; + default: + USB_LOG_RAW("other"); + break; + } + USB_LOG_RAW(" autopilot\n"); + + send_heartbeat(); +} + +void mavlink_polling(void) +{ + uint8_t ch; + bool ret; + mavlink_message_t message; + mavlink_status_t status; + + ret = chry_ringbuffer_read_byte(&usb_rx_rb, &ch); + if (ret) { + if (mavlink_parse_char(MAVLINK_COMM_0, ch, &message, &status) == 1) { + USB_LOG_INFO( + "Received message %d from %d/%d\n", + message.msgid, message.sysid, message.compid); + + switch (message.msgid) { + case MAVLINK_MSG_ID_HEARTBEAT: + handle_heartbeat(&message); + break; + } + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/cdc_acm_msc_template.c b/src/lib/CherryUSB/demo/cdc_acm_msc_template.c new file mode 100644 index 000000000..e889cbc8c --- /dev/null +++ b/src/lib/CherryUSB/demo/cdc_acm_msc_template.c @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_cdc_acm.h" +#include "usbd_msc.h" + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 + +#define MSC_IN_EP 0x84 +#define MSC_OUT_EP 0x05 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN + MSC_DESCRIPTOR_LEN) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#else +#define CDC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USB_HS +#define MSC_MAX_MPS 512 +#else +#define MSC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + MSC_DESCRIPTOR_INIT(0x02, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x00) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CDC MSC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_msc_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +static const uint8_t cdc_msc_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + MSC_DESCRIPTOR_INIT(0x02, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x00), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'C', 0x00, /* wcChar10 */ + '-', 0x00, /* wcChar11 */ + 'M', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; /* 2048 is only for test speed , please use CDC_MAX_MPS for common*/ +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +/*!< endpoint call back */ +struct usbd_endpoint cdc_out_ep = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; + +void cdc_acm_msc_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_msc_descriptor); +#else + usbd_desc_register(busid, cdc_msc_descriptor); +#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf2, MSC_OUT_EP, MSC_IN_EP)); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +volatile uint8_t dtr_enable = 0; + +void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) +{ + if (dtr) { + dtr_enable = 1; + } else { + dtr_enable = 0; + } +} + +void cdc_acm_data_send_with_dtr_test(uint8_t busid) +{ + if (dtr_enable) { + memset(&write_buffer[10], 'a', 2038); + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048); + while (ep_tx_busy_flag) { + } + } +} + +#define BLOCK_SIZE 512 +#define BLOCK_COUNT 10 + +typedef struct +{ + uint8_t BlockSpace[BLOCK_SIZE]; +} BLOCK_TYPE; + +BLOCK_TYPE mass_block[BLOCK_COUNT]; + +void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size) +{ + *block_num = 1000; //Pretend having so many buffer,not has actually. + *block_size = BLOCK_SIZE; +} +int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (sector < 10) + memcpy(buffer, mass_block[sector].BlockSpace, length); + return 0; +} + +int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (sector < 10) + memcpy(mass_block[sector].BlockSpace, buffer, length); + return 0; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/cdc_acm_multi_template.c b/src/lib/CherryUSB/demo/cdc_acm_multi_template.c new file mode 100644 index 000000000..80b40b020 --- /dev/null +++ b/src/lib/CherryUSB/demo/cdc_acm_multi_template.c @@ -0,0 +1,321 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_cdc_acm.h" + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x01 +#define CDC_INT_EP 0x85 + +#define CDC_IN_EP2 0x82 +#define CDC_OUT_EP2 0x02 +#define CDC_INT_EP2 0x86 + +#define CDC_IN_EP3 0x83 +#define CDC_OUT_EP3 0x03 +#define CDC_INT_EP3 0x87 + +#define CDC_IN_EP4 0x84 +#define CDC_OUT_EP4 0x04 +#define CDC_INT_EP4 0x88 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN * 4) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#else +#define CDC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x08, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x02, CDC_INT_EP2, CDC_OUT_EP2, CDC_IN_EP2, CDC_MAX_MPS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x04, CDC_INT_EP3, CDC_OUT_EP3, CDC_IN_EP3, CDC_MAX_MPS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x06, CDC_INT_EP4, CDC_OUT_EP4, CDC_IN_EP4, CDC_MAX_MPS, 0x02) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CDC MULTI DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_multi_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +static const uint8_t cdc_multi_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x08, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x02, CDC_INT_EP2, CDC_OUT_EP2, CDC_IN_EP2, CDC_MAX_MPS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x04, CDC_INT_EP3, CDC_OUT_EP3, CDC_IN_EP3, CDC_MAX_MPS, 0x02), + CDC_ACM_DESCRIPTOR_INIT(0x06, CDC_INT_EP4, CDC_OUT_EP4, CDC_IN_EP4, CDC_MAX_MPS, 0x02), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'C', 0x00, /* wcChar10 */ + 'D', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[4][2048]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[4][2048]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP2, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP3, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP4, read_buffer, 2048); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % CDC_MAX_MPS) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(CDC_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +struct usbd_endpoint cdc_out_ep1 = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep1 = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +struct usbd_endpoint cdc_out_ep2 = { + .ep_addr = CDC_OUT_EP2, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep2 = { + .ep_addr = CDC_IN_EP2, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +struct usbd_endpoint cdc_out_ep3 = { + .ep_addr = CDC_OUT_EP3, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep3 = { + .ep_addr = CDC_IN_EP3, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +struct usbd_endpoint cdc_out_ep4 = { + .ep_addr = CDC_OUT_EP4, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep4 = { + .ep_addr = CDC_IN_EP4, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; +struct usbd_interface intf3; +struct usbd_interface intf4; +struct usbd_interface intf5; +struct usbd_interface intf6; +struct usbd_interface intf7; + +void cdc_acm_multi_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_multi_descriptor); +#else + usbd_desc_register(busid, cdc_multi_descriptor); +#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep1); + usbd_add_endpoint(busid, &cdc_in_ep1); + + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf2)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf3)); + usbd_add_endpoint(busid, &cdc_out_ep2); + usbd_add_endpoint(busid, &cdc_in_ep2); + + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf4)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf5)); + usbd_add_endpoint(busid, &cdc_out_ep3); + usbd_add_endpoint(busid, &cdc_in_ep3); + + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf6)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf7)); + usbd_add_endpoint(busid, &cdc_out_ep4); + usbd_add_endpoint(busid, &cdc_in_ep4); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/cdc_acm_rttchardev_template.c b/src/lib/CherryUSB/demo/cdc_acm_rttchardev_template.c new file mode 100644 index 000000000..b16ccc9c4 --- /dev/null +++ b/src/lib/CherryUSB/demo/cdc_acm_rttchardev_template.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_cdc_acm.h" + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#else +#define CDC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CDC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +static const uint8_t cdc_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'C', 0x00, /* wcChar10 */ + 'D', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +extern void usbd_cdc_acm_serial_init(uint8_t busid, uint8_t in_ep, uint8_t out_ep); + +void cdc_acm_chardev_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_descriptor); +#else + usbd_desc_register(busid, cdc_descriptor); +#endif + usbd_cdc_acm_serial_init(busid, CDC_IN_EP, CDC_OUT_EP); + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +static int cdc_acm_enter(int argc, char **argv) +{ + (void)argc; + (void)argv; + + finsh_set_device("usb-acm0"); + rt_console_set_device("usb-acm0"); + + return 0; +} +MSH_CMD_EXPORT(cdc_acm_enter, cdc_acm_enter); + +static int cdc_acm_exit(int argc, char **argv) +{ + (void)argc; + (void)argv; + + finsh_set_device(RT_CONSOLE_DEVICE_NAME); + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); + + return 0; +} +MSH_CMD_EXPORT(cdc_acm_exit, cdc_acm_exit); \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/cdc_acm_template.c b/src/lib/CherryUSB/demo/cdc_acm_template.c new file mode 100644 index 000000000..3ff8ae2ab --- /dev/null +++ b/src/lib/CherryUSB/demo/cdc_acm_template.c @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_cdc_acm.h" + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#else +#define CDC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CDC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +static const uint8_t cdc_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'C', 0x00, /* wcChar10 */ + 'D', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; /* 2048 is only for test speed , please use CDC_MAX_MPS for common*/ +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +/*!< endpoint call back */ +struct usbd_endpoint cdc_out_ep = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +static struct usbd_interface intf0; +static struct usbd_interface intf1; + +void cdc_acm_init(uint8_t busid, uintptr_t reg_base) +{ + const uint8_t data[10] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 }; + + memcpy(&write_buffer[0], data, 10); + memset(&write_buffer[10], 'a', 2038); + +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_descriptor); +#else + usbd_desc_register(busid, cdc_descriptor); +#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +volatile uint8_t dtr_enable = 0; + +void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) +{ + if (dtr) { + dtr_enable = 1; + } else { + dtr_enable = 0; + } +} + +void cdc_acm_data_send_with_dtr_test(uint8_t busid) +{ + if (dtr_enable) { + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048); + while (ep_tx_busy_flag) { + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/cdc_ecm_template.c b/src/lib/CherryUSB/demo/cdc_ecm_template.c new file mode 100644 index 000000000..7c6e98aa2 --- /dev/null +++ b/src/lib/CherryUSB/demo/cdc_ecm_template.c @@ -0,0 +1,470 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_cdc_ecm.h" + +#ifndef CONFIG_USBDEV_CDC_ECM_USING_LWIP +#error "Please enable CONFIG_USBDEV_CDC_ECM_USING_LWIP for this demo" +#endif + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_ECM_DESCRIPTOR_LEN) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#else +#define CDC_MAX_MPS 64 +#endif + +/* str idx = 4 is for mac address: aa:bb:cc:dd:ee:ff*/ +#define CDC_ECM_MAC_STRING_INDEX 4 + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ECM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, CDC_ECM_MAC_STRING_INDEX) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CDC ECM DEMO", /* Product */ + "2022123456", /* Serial Number */ + "aabbccddeeff", /* ecm mac address */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_ecm_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +static const uint8_t cdc_ecm_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ECM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, CDC_ECM_MAC_STRING_INDEX), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x2E, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'C', 0x00, /* wcChar10 */ + 'D', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'E', 0x00, /* wcChar14 */ + 'C', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + ' ', 0x00, /* wcChar17 */ + 'D', 0x00, /* wcChar18 */ + 'E', 0x00, /* wcChar19 */ + 'M', 0x00, /* wcChar20 */ + 'O', 0x00, /* wcChar21 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ + /////////////////////////////////////// + /// string4 descriptor + /////////////////////////////////////// + 0x1A, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'a', 0x00, /* wcChar0 */ + 'a', 0x00, /* wcChar1 */ + 'b', 0x00, /* wcChar2 */ + 'b', 0x00, /* wcChar3 */ + 'c', 0x00, /* wcChar4 */ + 'c', 0x00, /* wcChar5 */ + 'd', 0x00, /* wcChar6 */ + 'd', 0x00, /* wcChar7 */ + 'e', 0x00, /* wcChar8 */ + 'e', 0x00, /* wcChar9 */ + 'f', 0x00, /* wcChar10 */ + 'f', 0x00, /* wcChar11 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +const uint8_t mac[6] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; + +volatile bool cdc_ecm_tx_done = false; + +void usbd_cdc_ecm_data_send_done(uint32_t len) +{ + cdc_ecm_tx_done = true; // suggest you to use semaphore in os +} + +#ifdef RT_USING_LWIP + +#ifndef RT_LWIP_DHCP +#error cdc_ecm must enable RT_LWIP_DHCP +#endif + +#ifndef LWIP_USING_DHCPD +#error cdc_ecm must enable LWIP_USING_DHCPD +#endif + +#include +#include +#include +#include + +struct eth_device cdc_ecm_dev; + +static rt_err_t rt_usbd_cdc_ecm_control(rt_device_t dev, int cmd, void *args) +{ + switch (cmd) { + case NIOCTL_GADDR: + + /* get mac address */ + if (args) { + uint8_t *mac_dev = (uint8_t *)args; + rt_memcpy(mac_dev, mac, 6); + mac_dev[5] = ~mac_dev[5]; /* device mac can't same as host. */ + } else + return -RT_ERROR; + + break; + + default: + break; + } + + return RT_EOK; +} + +struct pbuf *rt_usbd_cdc_ecm_eth_rx(rt_device_t dev) +{ + return usbd_cdc_ecm_eth_rx(); +} + +rt_err_t rt_usbd_cdc_ecm_eth_tx(rt_device_t dev, struct pbuf *p) +{ + int ret; + + cdc_ecm_tx_done = false; + ret = usbd_cdc_ecm_eth_tx(p); + if (ret == 0) { + while (!cdc_ecm_tx_done) { + } + return RT_EOK; + } else + return -RT_ERROR; +} + +void cdc_ecm_lwip_init(void) +{ + cdc_ecm_dev.parent.control = rt_usbd_cdc_ecm_control; + cdc_ecm_dev.eth_rx = rt_usbd_cdc_ecm_eth_rx; + cdc_ecm_dev.eth_tx = rt_usbd_cdc_ecm_eth_tx; + + eth_device_init(&cdc_ecm_dev, "u0"); + + eth_device_linkchange(&cdc_ecm_dev, RT_TRUE); + dhcpd_start("u0"); +} + +void usbd_cdc_ecm_data_recv_done(uint32_t len) +{ + eth_device_ready(&cdc_ecm_dev); +} + +#else +#include "netif/etharp.h" +#include "lwip/init.h" +#include "lwip/netif.h" +#include "lwip/pbuf.h" + +#include "dhserver.h" +#include "dnserver.h" + +/*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */ +#define IP_ADDR0 (uint8_t)192 +#define IP_ADDR1 (uint8_t)168 +#define IP_ADDR2 (uint8_t)7 +#define IP_ADDR3 (uint8_t)1 + +/*NETMASK*/ +#define NETMASK_ADDR0 (uint8_t)255 +#define NETMASK_ADDR1 (uint8_t)255 +#define NETMASK_ADDR2 (uint8_t)255 +#define NETMASK_ADDR3 (uint8_t)0 + +/*Gateway Address*/ +#define GW_ADDR0 (uint8_t)0 +#define GW_ADDR1 (uint8_t)0 +#define GW_ADDR2 (uint8_t)0 +#define GW_ADDR3 (uint8_t)0 + +const ip_addr_t ipaddr = IPADDR4_INIT_BYTES(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); +const ip_addr_t netmask = IPADDR4_INIT_BYTES(NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3); +const ip_addr_t gateway = IPADDR4_INIT_BYTES(GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); + +#define NUM_DHCP_ENTRY 3 + +static dhcp_entry_t entries[NUM_DHCP_ENTRY] = { + /* mac ip address subnet mask lease time */ + { { 0 }, { 192, 168, 7, 2 }, { 255, 255, 255, 0 }, 24 * 60 * 60 }, + { { 0 }, { 192, 168, 7, 3 }, { 255, 255, 255, 0 }, 24 * 60 * 60 }, + { { 0 }, { 192, 168, 7, 4 }, { 255, 255, 255, 0 }, 24 * 60 * 60 } +}; + +static dhcp_config_t dhcp_config = { + { 192, 168, 7, 1 }, /* server address */ + 67, /* port */ + { 192, 168, 7, 1 }, /* dns server */ + "cherry", /* dns suffix */ + NUM_DHCP_ENTRY, /* num entry */ + entries /* entries */ +}; + +static bool dns_query_proc(const char *name, ip_addr_t *addr) +{ + if (strcmp(name, "cdc_ecm.cherry") == 0 || strcmp(name, "www.cdc_ecm.cherry") == 0) { + addr->addr = ipaddr.addr; + return true; + } + return false; +} + +static struct netif cdc_ecm_netif; //network interface + +/* Network interface name */ +#define IFNAME0 'E' +#define IFNAME1 'X' + +err_t linkoutput_fn(struct netif *netif, struct pbuf *p) +{ + int ret; + + cdc_ecm_tx_done = false; + ret = usbd_cdc_ecm_eth_tx(p); + if (ret == 0) { + while (!cdc_ecm_tx_done) { + } + return ERR_OK; + } else + return ERR_BUF; +} + +err_t cdc_ecm_if_init(struct netif *netif) +{ + LWIP_ASSERT("netif != NULL", (netif != NULL)); + + netif->mtu = 1500; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP; + netif->state = NULL; + netif->name[0] = IFNAME0; + netif->name[1] = IFNAME1; + netif->output = etharp_output; + netif->linkoutput = linkoutput_fn; + return ERR_OK; +} + +err_t cdc_ecm_if_input(struct netif *netif) +{ + err_t err; + struct pbuf *p; + + p = usbd_cdc_ecm_eth_rx(); + if (p != NULL) { + err = netif->input(p, netif); + if (err != ERR_OK) { + pbuf_free(p); + } + } else { + return ERR_BUF; + } + return err; +} + +void cdc_ecm_lwip_init(void) +{ + struct netif *netif = &cdc_ecm_netif; + + lwip_init(); + + netif->hwaddr_len = 6; + memcpy(netif->hwaddr, mac, 6); + netif->hwaddr[5] = ~netif->hwaddr[5]; /* device mac can't same as host. */ + + netif = netif_add(netif, &ipaddr, &netmask, &gateway, NULL, cdc_ecm_if_init, netif_input); + netif_set_default(netif); + while (!netif_is_up(netif)) { + } + + while (dhserv_init(&dhcp_config)) { + } + + while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) { + } +} + +void usbd_cdc_ecm_data_recv_done(uint32_t len) +{ +} + +void cdc_ecm_input_poll(void) +{ + cdc_ecm_if_input(&cdc_ecm_netif); +} +#endif + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +struct usbd_interface intf0; +struct usbd_interface intf1; + +/* ecm only supports in linux, and you should input the following command + * + * sudo ifconfig enxaabbccddeeff up + * sudo dhcpclient enxaabbccddeeff +*/ +void cdc_ecm_init(uint8_t busid, uintptr_t reg_base) +{ + cdc_ecm_lwip_init(); + +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_ecm_descriptor); +#else + usbd_desc_register(busid, cdc_ecm_descriptor); +#endif + usbd_add_interface(busid, usbd_cdc_ecm_init_intf(&intf0, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP)); + usbd_add_interface(busid, usbd_cdc_ecm_init_intf(&intf1, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP)); + usbd_initialize(busid, reg_base, usbd_event_handler); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/cdc_rndis_template.c b/src/lib/CherryUSB/demo/cdc_rndis_template.c new file mode 100644 index 000000000..c7bda9316 --- /dev/null +++ b/src/lib/CherryUSB/demo/cdc_rndis_template.c @@ -0,0 +1,449 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_rndis.h" + +#ifndef CONFIG_USBDEV_RNDIS_USING_LWIP +#error "Please enable CONFIG_USBDEV_RNDIS_USING_LWIP for this demo" +#endif + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 + +#define USBD_VID 0xEFFF +#define USBD_PID 0xEFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_RNDIS_DESCRIPTOR_LEN) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#else +#define CDC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_RNDIS_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB RNDIS DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_rndis_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +static const uint8_t cdc_rndis_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_RNDIS_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x2A, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'R', 0x00, /* wcChar10 */ + 'N', 0x00, /* wcChar11 */ + 'D', 0x00, /* wcChar12 */ + 'I', 0x00, /* wcChar13 */ + 'S', 0x00, /* wcChar14 */ + ' ', 0x00, /* wcChar15 */ + 'D', 0x00, /* wcChar16 */ + 'E', 0x00, /* wcChar17 */ + 'M', 0x00, /* wcChar18 */ + 'O', 0x00, /* wcChar19 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +const uint8_t mac[6] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; + +volatile bool rndis_tx_done = false; + +void usbd_rndis_data_send_done(uint32_t len) +{ + rndis_tx_done = true; // suggest you to use semaphore in os +} + +#ifdef RT_USING_LWIP + +#ifndef RT_LWIP_DHCP +#error rndis must enable RT_LWIP_DHCP +#endif + +#ifdef LWIP_USING_DHCPD +#include +#endif + +#include +#include +#include +#include + +struct eth_device rndis_dev; + +static rt_err_t rt_usbd_rndis_control(rt_device_t dev, int cmd, void *args) +{ + switch (cmd) { + case NIOCTL_GADDR: + + /* get mac address */ + if (args) { + uint8_t *mac_dev = (uint8_t *)args; + rt_memcpy(mac_dev, mac, 6); + mac_dev[5] = ~mac_dev[5]; /* device mac can't same as host. */ + } else + return -RT_ERROR; + + break; + + default: + break; + } + + return RT_EOK; +} + +struct pbuf *rt_usbd_rndis_eth_rx(rt_device_t dev) +{ + return usbd_rndis_eth_rx(); +} + +rt_err_t rt_usbd_rndis_eth_tx(rt_device_t dev, struct pbuf *p) +{ + int ret; + + rndis_tx_done = false; + ret = usbd_rndis_eth_tx(p); + if (ret == 0) { + while (!rndis_tx_done) { + } + return RT_EOK; + } else + return -RT_ERROR; +} + +void rndis_lwip_init(void) +{ + rndis_dev.parent.control = rt_usbd_rndis_control; + rndis_dev.eth_rx = rt_usbd_rndis_eth_rx; + rndis_dev.eth_tx = rt_usbd_rndis_eth_tx; + + eth_device_init(&rndis_dev, "u0"); + + eth_device_linkchange(&rndis_dev, RT_TRUE); +#ifdef LWIP_USING_DHCPD + dhcpd_start("u0"); +#else + struct netdev *netdev = netdev_get_by_name("u0"); + if (netdev) { + netdev_dhcp_enabled(netdev, RT_TRUE); + } +#endif +} + +void usbd_rndis_data_recv_done(uint32_t len) +{ + eth_device_ready(&rndis_dev); +} + +#else +#include "netif/etharp.h" +#include "lwip/init.h" +#include "lwip/netif.h" +#include "lwip/pbuf.h" + +#include "dhserver.h" +#include "dnserver.h" + +/*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */ +#define IP_ADDR0 (uint8_t)192 +#define IP_ADDR1 (uint8_t)168 +#define IP_ADDR2 (uint8_t)7 +#define IP_ADDR3 (uint8_t)1 + +/*NETMASK*/ +#define NETMASK_ADDR0 (uint8_t)255 +#define NETMASK_ADDR1 (uint8_t)255 +#define NETMASK_ADDR2 (uint8_t)255 +#define NETMASK_ADDR3 (uint8_t)0 + +/*Gateway Address*/ +#define GW_ADDR0 (uint8_t)0 +#define GW_ADDR1 (uint8_t)0 +#define GW_ADDR2 (uint8_t)0 +#define GW_ADDR3 (uint8_t)0 + +const ip_addr_t ipaddr = IPADDR4_INIT_BYTES(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); +const ip_addr_t netmask = IPADDR4_INIT_BYTES(NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3); +const ip_addr_t gateway = IPADDR4_INIT_BYTES(GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); + +#define NUM_DHCP_ENTRY 3 + +static dhcp_entry_t entries[NUM_DHCP_ENTRY] = { + /* mac ip address subnet mask lease time */ + { { 0 }, { 192, 168, 7, 2 }, { 255, 255, 255, 0 }, 24 * 60 * 60 }, + { { 0 }, { 192, 168, 7, 3 }, { 255, 255, 255, 0 }, 24 * 60 * 60 }, + { { 0 }, { 192, 168, 7, 4 }, { 255, 255, 255, 0 }, 24 * 60 * 60 } +}; + +static dhcp_config_t dhcp_config = { + { 192, 168, 7, 1 }, /* server address */ + 67, /* port */ + { 192, 168, 7, 1 }, /* dns server */ + "cherry", /* dns suffix */ + NUM_DHCP_ENTRY, /* num entry */ + entries /* entries */ +}; + +static bool dns_query_proc(const char *name, ip_addr_t *addr) +{ + if (strcmp(name, "rndis.cherry") == 0 || strcmp(name, "www.rndis.cherry") == 0) { + addr->addr = ipaddr.addr; + return true; + } + return false; +} + +static struct netif rndis_netif; //network interface + +/* Network interface name */ +#define IFNAME0 'E' +#define IFNAME1 'X' + +err_t linkoutput_fn(struct netif *netif, struct pbuf *p) +{ + int ret; + + rndis_tx_done = false; + ret = usbd_rndis_eth_tx(p); + if (ret == 0) { + while (!rndis_tx_done) { + } + return ERR_OK; + } else + return ERR_BUF; +} + +err_t rndisif_init(struct netif *netif) +{ + LWIP_ASSERT("netif != NULL", (netif != NULL)); + + netif->mtu = 1500; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP; + netif->state = NULL; + netif->name[0] = IFNAME0; + netif->name[1] = IFNAME1; + netif->output = etharp_output; + netif->linkoutput = linkoutput_fn; + return ERR_OK; +} + +err_t rndisif_input(struct netif *netif) +{ + err_t err; + struct pbuf *p; + + p = usbd_rndis_eth_rx(); + if (p != NULL) { + err = netif->input(p, netif); + if (err != ERR_OK) { + pbuf_free(p); + } + } else { + return ERR_BUF; + } + return err; +} + +void rndis_lwip_init(void) +{ + struct netif *netif = &rndis_netif; + + lwip_init(); + + netif->hwaddr_len = 6; + memcpy(netif->hwaddr, mac, 6); + netif->hwaddr[5] = ~netif->hwaddr[5]; /* device mac can't same as host. */ + + netif = netif_add(netif, &ipaddr, &netmask, &gateway, NULL, rndisif_init, netif_input); + netif_set_default(netif); + while (!netif_is_up(netif)) { + } + + while (dhserv_init(&dhcp_config)) { + } + + while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) { + } +} + +void usbd_rndis_data_recv_done(uint32_t len) +{ +} + +void rndis_input_poll(void) +{ + rndisif_input(&rndis_netif); +} +#endif /* RT_USING_LWIP */ + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +struct usbd_interface intf0; +struct usbd_interface intf1; + +void cdc_rndis_init(uint8_t busid, uintptr_t reg_base) +{ + rndis_lwip_init(); + +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_rndis_descriptor); +#else + usbd_desc_register(busid, cdc_rndis_descriptor); +#endif + usbd_add_interface(busid, usbd_rndis_init_intf(&intf0, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, (uint8_t *)mac)); + usbd_add_interface(busid, usbd_rndis_init_intf(&intf1, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, (uint8_t *)mac)); + usbd_initialize(busid, reg_base, usbd_event_handler); +} diff --git a/src/lib/CherryUSB/demo/cherryusb_h264.h b/src/lib/CherryUSB/demo/cherryusb_h264.h new file mode 100644 index 000000000..bb774d2db --- /dev/null +++ b/src/lib/CherryUSB/demo/cherryusb_h264.h @@ -0,0 +1,1734 @@ +//ffmpeg -loop 1 -i CherryUSB.jpg -c:v libx264 -t 10 -pix_fmt yuv420p -vf "scale=640:480" CherryUSB.h264 + +const unsigned char cherryusb_h264[20750] = { + 0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x1E, 0xAC, 0xD9, 0x40, 0xA0, + 0x3D, 0xBF, 0xF0, 0x01, 0xD0, 0x01, 0xA2, 0x94, 0x00, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x00, 0xC8, 0x3C, 0x58, 0xB6, 0x58, 0x00, 0x00, + 0x00, 0x01, 0x68, 0xEB, 0xE3, 0xCB, 0x22, 0xC0, 0x00, 0x00, 0x01, 0x06, + 0x05, 0xFF, 0xFF, 0x9D, 0xDC, 0x45, 0xE9, 0xBD, 0xE6, 0xD9, 0x48, 0xB7, + 0x96, 0x2C, 0xD8, 0x20, 0xD9, 0x23, 0xEE, 0xEF, 0x78, 0x32, 0x36, 0x34, + 0x20, 0x2D, 0x20, 0x63, 0x6F, 0x72, 0x65, 0x20, 0x31, 0x36, 0x34, 0x20, + 0x2D, 0x20, 0x48, 0x2E, 0x32, 0x36, 0x34, 0x2F, 0x4D, 0x50, 0x45, 0x47, + 0x2D, 0x34, 0x20, 0x41, 0x56, 0x43, 0x20, 0x63, 0x6F, 0x64, 0x65, 0x63, + 0x20, 0x2D, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x6C, 0x65, 0x66, 0x74, 0x20, + 0x32, 0x30, 0x30, 0x33, 0x2D, 0x32, 0x30, 0x32, 0x34, 0x20, 0x2D, 0x20, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x76, + 0x69, 0x64, 0x65, 0x6F, 0x6C, 0x61, 0x6E, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x78, 0x32, 0x36, 0x34, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x20, 0x2D, 0x20, + 0x6F, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3A, 0x20, 0x63, 0x61, 0x62, + 0x61, 0x63, 0x3D, 0x31, 0x20, 0x72, 0x65, 0x66, 0x3D, 0x33, 0x20, 0x64, + 0x65, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x3D, 0x31, 0x3A, 0x30, 0x3A, 0x30, + 0x20, 0x61, 0x6E, 0x61, 0x6C, 0x79, 0x73, 0x65, 0x3D, 0x30, 0x78, 0x33, + 0x3A, 0x30, 0x78, 0x31, 0x31, 0x33, 0x20, 0x6D, 0x65, 0x3D, 0x68, 0x65, + 0x78, 0x20, 0x73, 0x75, 0x62, 0x6D, 0x65, 0x3D, 0x37, 0x20, 0x70, 0x73, + 0x79, 0x3D, 0x31, 0x20, 0x70, 0x73, 0x79, 0x5F, 0x72, 0x64, 0x3D, 0x31, + 0x2E, 0x30, 0x30, 0x3A, 0x30, 0x2E, 0x30, 0x30, 0x20, 0x6D, 0x69, 0x78, + 0x65, 0x64, 0x5F, 0x72, 0x65, 0x66, 0x3D, 0x31, 0x20, 0x6D, 0x65, 0x5F, + 0x72, 0x61, 0x6E, 0x67, 0x65, 0x3D, 0x31, 0x36, 0x20, 0x63, 0x68, 0x72, + 0x6F, 0x6D, 0x61, 0x5F, 0x6D, 0x65, 0x3D, 0x31, 0x20, 0x74, 0x72, 0x65, + 0x6C, 0x6C, 0x69, 0x73, 0x3D, 0x31, 0x20, 0x38, 0x78, 0x38, 0x64, 0x63, + 0x74, 0x3D, 0x31, 0x20, 0x63, 0x71, 0x6D, 0x3D, 0x30, 0x20, 0x64, 0x65, + 0x61, 0x64, 0x7A, 0x6F, 0x6E, 0x65, 0x3D, 0x32, 0x31, 0x2C, 0x31, 0x31, + 0x20, 0x66, 0x61, 0x73, 0x74, 0x5F, 0x70, 0x73, 0x6B, 0x69, 0x70, 0x3D, + 0x31, 0x20, 0x63, 0x68, 0x72, 0x6F, 0x6D, 0x61, 0x5F, 0x71, 0x70, 0x5F, + 0x6F, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3D, 0x2D, 0x32, 0x20, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x3D, 0x31, 0x32, 0x20, 0x6C, 0x6F, 0x6F, + 0x6B, 0x61, 0x68, 0x65, 0x61, 0x64, 0x5F, 0x74, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x3D, 0x32, 0x20, 0x73, 0x6C, 0x69, 0x63, 0x65, 0x64, 0x5F, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3D, 0x30, 0x20, 0x6E, 0x72, + 0x3D, 0x30, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6D, 0x61, 0x74, 0x65, 0x3D, + 0x31, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x6C, 0x61, 0x63, 0x65, 0x64, + 0x3D, 0x30, 0x20, 0x62, 0x6C, 0x75, 0x72, 0x61, 0x79, 0x5F, 0x63, 0x6F, + 0x6D, 0x70, 0x61, 0x74, 0x3D, 0x30, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, + 0x72, 0x61, 0x69, 0x6E, 0x65, 0x64, 0x5F, 0x69, 0x6E, 0x74, 0x72, 0x61, + 0x3D, 0x30, 0x20, 0x62, 0x66, 0x72, 0x61, 0x6D, 0x65, 0x73, 0x3D, 0x33, + 0x20, 0x62, 0x5F, 0x70, 0x79, 0x72, 0x61, 0x6D, 0x69, 0x64, 0x3D, 0x32, + 0x20, 0x62, 0x5F, 0x61, 0x64, 0x61, 0x70, 0x74, 0x3D, 0x31, 0x20, 0x62, + 0x5F, 0x62, 0x69, 0x61, 0x73, 0x3D, 0x30, 0x20, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x3D, 0x31, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x62, + 0x3D, 0x31, 0x20, 0x6F, 0x70, 0x65, 0x6E, 0x5F, 0x67, 0x6F, 0x70, 0x3D, + 0x30, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x70, 0x3D, 0x32, 0x20, + 0x6B, 0x65, 0x79, 0x69, 0x6E, 0x74, 0x3D, 0x32, 0x35, 0x30, 0x20, 0x6B, + 0x65, 0x79, 0x69, 0x6E, 0x74, 0x5F, 0x6D, 0x69, 0x6E, 0x3D, 0x32, 0x35, + 0x20, 0x73, 0x63, 0x65, 0x6E, 0x65, 0x63, 0x75, 0x74, 0x3D, 0x34, 0x30, + 0x20, 0x69, 0x6E, 0x74, 0x72, 0x61, 0x5F, 0x72, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x3D, 0x30, 0x20, 0x72, 0x63, 0x5F, 0x6C, 0x6F, 0x6F, 0x6B, + 0x61, 0x68, 0x65, 0x61, 0x64, 0x3D, 0x34, 0x30, 0x20, 0x72, 0x63, 0x3D, + 0x63, 0x72, 0x66, 0x20, 0x6D, 0x62, 0x74, 0x72, 0x65, 0x65, 0x3D, 0x31, + 0x20, 0x63, 0x72, 0x66, 0x3D, 0x32, 0x33, 0x2E, 0x30, 0x20, 0x71, 0x63, + 0x6F, 0x6D, 0x70, 0x3D, 0x30, 0x2E, 0x36, 0x30, 0x20, 0x71, 0x70, 0x6D, + 0x69, 0x6E, 0x3D, 0x30, 0x20, 0x71, 0x70, 0x6D, 0x61, 0x78, 0x3D, 0x36, + 0x39, 0x20, 0x71, 0x70, 0x73, 0x74, 0x65, 0x70, 0x3D, 0x34, 0x20, 0x69, + 0x70, 0x5F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x3D, 0x31, 0x2E, 0x34, 0x30, + 0x20, 0x61, 0x71, 0x3D, 0x31, 0x3A, 0x31, 0x2E, 0x30, 0x30, 0x00, 0x80, + 0x00, 0x00, 0x01, 0x65, 0x88, 0x84, 0x00, 0x6F, 0xE9, 0x47, 0x26, 0x6E, + 0x0B, 0xFB, 0xDE, 0x71, 0x6A, 0xCF, 0x9E, 0xDD, 0xF0, 0x2F, 0x88, 0x1F, + 0xC2, 0x88, 0xBF, 0x0D, 0xED, 0xB1, 0x68, 0x49, 0x48, 0xD1, 0x34, 0x8E, + 0xF2, 0x6E, 0x97, 0x53, 0x24, 0x04, 0x5E, 0xE5, 0x57, 0x2D, 0xFE, 0xCB, + 0x97, 0x4D, 0xC6, 0x70, 0x23, 0x03, 0x20, 0xEF, 0x3B, 0xB9, 0xA6, 0x1E, + 0x63, 0x80, 0x67, 0xBB, 0x88, 0x7F, 0xAF, 0xA6, 0x07, 0x81, 0xA4, 0x3C, + 0x2E, 0xB7, 0x77, 0x12, 0x5F, 0x4F, 0xB8, 0x29, 0x1D, 0x98, 0x2E, 0x78, + 0x08, 0x6A, 0x93, 0x7E, 0x40, 0xF0, 0x7B, 0xD3, 0xF5, 0x5A, 0x38, 0x35, + 0xE3, 0x8D, 0xB5, 0x90, 0x48, 0xE4, 0x4A, 0x9E, 0x6E, 0x9A, 0x77, 0xDA, + 0x42, 0x8D, 0xE0, 0xB6, 0x1B, 0xCC, 0x95, 0x37, 0x49, 0x99, 0xED, 0xBF, + 0xBE, 0x28, 0x52, 0xDD, 0xBC, 0x59, 0xBF, 0x6C, 0xF8, 0x3C, 0xCC, 0xD1, + 0xC4, 0x7F, 0x31, 0x51, 0xFC, 0xAA, 0x23, 0x91, 0x9B, 0xDF, 0xB4, 0x7F, + 0x72, 0xC7, 0xF2, 0xCF, 0xEE, 0xBA, 0x67, 0xC7, 0xBA, 0x26, 0xA6, 0x9C, + 0x0E, 0xD1, 0xC7, 0xB8, 0xE8, 0xC6, 0x5F, 0xD2, 0x5B, 0xC8, 0xF9, 0x2E, + 0x6D, 0x2F, 0x5D, 0x8B, 0x11, 0x9E, 0xDB, 0x3F, 0xAC, 0xF6, 0x61, 0x6D, + 0x23, 0xCC, 0xFA, 0x5C, 0x51, 0x83, 0x9C, 0xD7, 0x03, 0xF9, 0x3D, 0xE3, + 0x4B, 0xE2, 0xCE, 0xA6, 0x7F, 0xED, 0x11, 0x2A, 0x73, 0x26, 0x90, 0xEC, + 0x30, 0xC2, 0x6E, 0x4E, 0xC2, 0x20, 0x30, 0xBF, 0xFF, 0x5A, 0x87, 0xC5, + 0x58, 0x55, 0x2E, 0x74, 0xD2, 0x7E, 0x9F, 0x74, 0xAC, 0xB3, 0xFB, 0x01, + 0xB5, 0x41, 0x40, 0x22, 0xD8, 0x66, 0xC1, 0x30, 0x54, 0xB6, 0x10, 0xD3, + 0x71, 0x2F, 0x7A, 0xE4, 0x2F, 0x4B, 0x77, 0x84, 0x80, 0x26, 0x04, 0x0E, + 0xEE, 0xD9, 0x92, 0x44, 0xDA, 0xCD, 0x88, 0xB6, 0x7A, 0x93, 0xE6, 0x3B, + 0x72, 0xF6, 0x61, 0xA0, 0x04, 0x86, 0x76, 0xA6, 0x58, 0x43, 0xC3, 0x0F, + 0x54, 0x1F, 0x44, 0x34, 0x12, 0xF1, 0x25, 0xEC, 0xD1, 0x79, 0x2C, 0xB4, + 0x21, 0x27, 0x47, 0x45, 0x35, 0xB7, 0x32, 0xED, 0xC5, 0xA4, 0xA1, 0x70, + 0x02, 0x84, 0xC4, 0x97, 0x35, 0x09, 0x36, 0x15, 0x6E, 0xAC, 0x21, 0x1E, + 0xA9, 0x87, 0x3F, 0xE7, 0x48, 0x13, 0xBD, 0xB9, 0xB6, 0x6D, 0xA1, 0xF6, + 0x48, 0xF1, 0xE6, 0xD6, 0x9D, 0x51, 0xEC, 0x61, 0xD2, 0xA5, 0xE9, 0xAD, + 0x16, 0x1D, 0x0E, 0xAA, 0x68, 0xB2, 0x93, 0x93, 0x7D, 0x6C, 0x7A, 0x9E, + 0xB1, 0x51, 0x78, 0xAD, 0xCA, 0x4A, 0xB8, 0xF5, 0x98, 0xC6, 0x32, 0x5B, + 0x64, 0x21, 0x8D, 0x72, 0x6E, 0xB3, 0x2E, 0x54, 0xC2, 0xE0, 0x06, 0xA8, + 0xF8, 0xCC, 0x0E, 0x95, 0x80, 0xED, 0xFE, 0x31, 0x74, 0xD8, 0x7D, 0x02, + 0xA2, 0x7B, 0xD7, 0x98, 0xE2, 0x38, 0x27, 0x10, 0x3F, 0x1D, 0x0B, 0xA9, + 0x89, 0x21, 0xA6, 0x8F, 0x3D, 0x48, 0x90, 0x75, 0x4C, 0xEF, 0x9C, 0x2E, + 0x46, 0x3F, 0x04, 0x57, 0xAB, 0x68, 0xBF, 0x38, 0x97, 0xF8, 0x6E, 0xA8, + 0xBB, 0x82, 0x2E, 0xEB, 0xA6, 0x24, 0xF9, 0xA1, 0x73, 0xEF, 0xD8, 0x2A, + 0xB1, 0x6B, 0xFF, 0x42, 0x4A, 0xFF, 0xBE, 0x94, 0xD9, 0xDA, 0xF7, 0xFD, + 0x0E, 0xC6, 0xE2, 0x1A, 0xAC, 0x07, 0x39, 0xE6, 0x5E, 0x73, 0x29, 0xAB, + 0xAD, 0x7B, 0x76, 0xA9, 0x96, 0x21, 0x0A, 0x71, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x01, 0x07, 0xB5, 0x13, 0x49, 0x88, 0xF9, 0x01, 0x87, 0x35, + 0xC4, 0xD7, 0x3D, 0x17, 0x75, 0xA0, 0x03, 0xC7, 0x5E, 0x4F, 0x76, 0x50, + 0xF1, 0x16, 0xA3, 0xE8, 0xD2, 0xE6, 0x7A, 0x7B, 0x1D, 0x96, 0x1E, 0xAA, + 0x31, 0x10, 0x1C, 0x8A, 0x70, 0x98, 0x39, 0x59, 0xDD, 0x90, 0x35, 0x65, + 0xAA, 0xE3, 0xFD, 0xF0, 0xBB, 0xF3, 0x86, 0x74, 0xDC, 0x56, 0xDB, 0x2F, + 0x4F, 0x5A, 0x93, 0x8A, 0xC9, 0x33, 0xC2, 0xB4, 0xD7, 0x67, 0x10, 0xDF, + 0x74, 0xE5, 0x16, 0xB1, 0x61, 0x02, 0xF0, 0xF8, 0x00, 0xFC, 0xBD, 0x36, + 0x84, 0xE1, 0x99, 0xBD, 0x24, 0xE3, 0xEA, 0x27, 0x84, 0x6D, 0xB8, 0x88, + 0xDC, 0xBA, 0x95, 0x1D, 0x6C, 0x00, 0x96, 0xF0, 0x25, 0x3E, 0xF8, 0xCE, + 0xC3, 0xCB, 0x9C, 0x1E, 0x67, 0x2A, 0x20, 0x38, 0x97, 0x8C, 0x37, 0xF9, + 0xC7, 0x8B, 0x90, 0x24, 0x10, 0xBD, 0x0B, 0xEC, 0xAD, 0x01, 0x96, 0x64, + 0x21, 0x74, 0x03, 0xCF, 0x96, 0xEA, 0x0A, 0x40, 0x09, 0xB3, 0xD8, 0x40, + 0xC9, 0xB2, 0xA4, 0x81, 0x44, 0x52, 0x06, 0x1E, 0x13, 0xFF, 0x51, 0xD1, + 0x80, 0x5B, 0xF0, 0x98, 0xAF, 0x0B, 0x09, 0x30, 0x33, 0x46, 0x8E, 0xC6, + 0x69, 0xD6, 0xCA, 0xCF, 0x14, 0xB1, 0x76, 0x67, 0xB7, 0xA4, 0x93, 0x75, + 0x02, 0xC0, 0x0B, 0x33, 0x32, 0x09, 0xB0, 0x4B, 0x71, 0x62, 0xA7, 0xC7, + 0xD7, 0x43, 0xEE, 0x08, 0x80, 0xF3, 0x36, 0x74, 0xC2, 0x7B, 0x6C, 0x97, + 0x6A, 0x9D, 0x0D, 0xE5, 0x73, 0xE8, 0xFB, 0xBF, 0xD7, 0x79, 0x71, 0xAF, + 0xDC, 0x2E, 0x33, 0x5B, 0xE9, 0x0F, 0x26, 0xEE, 0x45, 0xFB, 0x7E, 0x8D, + 0x6E, 0x91, 0x7E, 0x41, 0xB6, 0x10, 0x9A, 0x29, 0x66, 0x2E, 0xD0, 0x20, + 0xB2, 0x9C, 0x33, 0xD4, 0xAD, 0xED, 0x27, 0xEC, 0x1F, 0xF5, 0xC9, 0x47, + 0x4E, 0x71, 0xAB, 0xD6, 0x8E, 0x8F, 0xFE, 0x4A, 0x39, 0x5B, 0x73, 0xFA, + 0x1E, 0x81, 0x89, 0x77, 0x92, 0xB4, 0x99, 0x06, 0x80, 0x65, 0x21, 0x3A, + 0xED, 0x51, 0x5D, 0xFA, 0x23, 0xFA, 0x70, 0x1B, 0x0E, 0xF1, 0x69, 0x38, + 0xE1, 0x36, 0x79, 0xEE, 0xB1, 0x9E, 0xC9, 0xB5, 0xE1, 0x25, 0x0F, 0x76, + 0x22, 0x12, 0x7D, 0x1E, 0xE5, 0x05, 0x38, 0x68, 0x66, 0xD6, 0x73, 0xBF, + 0x7B, 0x8C, 0x9E, 0x97, 0x1D, 0x40, 0x18, 0x09, 0x84, 0x61, 0x6C, 0x2C, + 0xC9, 0xDC, 0xE0, 0x15, 0x05, 0x95, 0xFB, 0xFD, 0xFA, 0xBE, 0xA0, 0xC5, + 0x4B, 0xB3, 0xC0, 0x0F, 0x70, 0x0D, 0x66, 0x99, 0x92, 0xA5, 0xBD, 0x88, + 0x1A, 0xC3, 0xF6, 0xBB, 0xC2, 0x2D, 0x3A, 0x08, 0x9A, 0xA7, 0xF1, 0xB3, + 0xDD, 0x30, 0x82, 0x17, 0xCA, 0x95, 0x33, 0x8E, 0xC3, 0x0A, 0xCE, 0xF7, + 0x2F, 0x70, 0xAC, 0x7E, 0xB2, 0x50, 0xDF, 0x3E, 0x1C, 0xDD, 0x1C, 0x85, + 0x0A, 0xED, 0xB2, 0x1A, 0xC1, 0x05, 0x5B, 0x51, 0xF4, 0x47, 0x12, 0x3E, + 0x2B, 0xCD, 0x34, 0x8E, 0x5E, 0x59, 0xB2, 0x02, 0x4E, 0xD3, 0xF2, 0x36, + 0xAC, 0xB0, 0xBE, 0x23, 0xE0, 0xA3, 0x6D, 0xD2, 0x6E, 0x19, 0x91, 0x00, + 0x00, 0x03, 0x01, 0xCA, 0xB1, 0x9B, 0xFE, 0x59, 0x82, 0x0F, 0x54, 0x64, + 0xC2, 0xD8, 0xB8, 0x15, 0xD1, 0x6E, 0xBC, 0x42, 0xD2, 0x16, 0x26, 0x20, + 0xF8, 0x3C, 0xD0, 0x36, 0xA4, 0xD9, 0x10, 0x31, 0x43, 0xDE, 0x7A, 0xC5, + 0x2C, 0x33, 0x9B, 0xF2, 0xC4, 0xDB, 0xCE, 0xAB, 0xE7, 0x98, 0xFE, 0x44, + 0x17, 0x5C, 0x57, 0xE0, 0x6B, 0xA4, 0x8B, 0x09, 0x0B, 0xBF, 0x63, 0xC6, + 0x20, 0xC5, 0xCC, 0x8C, 0x3E, 0xB6, 0x08, 0xDA, 0xC2, 0x54, 0xF1, 0x1E, + 0x66, 0x3A, 0x64, 0x1F, 0xE5, 0xAC, 0x02, 0xD1, 0x26, 0xD2, 0xA0, 0x34, + 0x29, 0x64, 0x7E, 0x53, 0x27, 0x58, 0xDE, 0x59, 0xA8, 0xD7, 0x13, 0xCA, + 0xE9, 0xF3, 0x89, 0x72, 0x7B, 0x94, 0xEA, 0xB5, 0xB9, 0xFA, 0x41, 0x43, + 0xEC, 0xD7, 0x88, 0x46, 0xDC, 0x2A, 0xFA, 0xED, 0x32, 0x16, 0x3F, 0x51, + 0x66, 0xE9, 0x47, 0xE4, 0xA7, 0xB7, 0x14, 0x69, 0x9C, 0xED, 0x1C, 0x71, + 0x51, 0xFB, 0xF9, 0xE0, 0x40, 0xEC, 0x2F, 0x38, 0x53, 0x9D, 0x01, 0x05, + 0xFC, 0xE3, 0x77, 0xE4, 0x88, 0xD1, 0x89, 0xFC, 0x40, 0x58, 0x06, 0x97, + 0x0E, 0x5A, 0xEB, 0x98, 0xF5, 0x97, 0x8D, 0x8C, 0x9C, 0x40, 0x8E, 0xDA, + 0xFD, 0x98, 0x04, 0xB6, 0xED, 0x2F, 0xE4, 0x7D, 0x64, 0x80, 0x3D, 0x39, + 0xDD, 0xD0, 0x05, 0x42, 0x9C, 0x75, 0xFA, 0x20, 0xF1, 0x25, 0x66, 0x2B, + 0xE1, 0x94, 0x51, 0x82, 0x9F, 0x3E, 0x98, 0xFE, 0x32, 0x05, 0x9E, 0xBE, + 0x1D, 0xBF, 0xD4, 0xEB, 0x83, 0x88, 0x54, 0xA0, 0x79, 0x27, 0xA9, 0x68, + 0x91, 0xF1, 0x3A, 0x9F, 0x51, 0xB6, 0x55, 0x40, 0xD5, 0x13, 0x04, 0x7D, + 0x1E, 0xE6, 0xFB, 0x70, 0xB4, 0x5E, 0x9B, 0x1E, 0xA0, 0x59, 0xFF, 0xE3, + 0x9B, 0xB5, 0xF9, 0x3F, 0xFE, 0x2D, 0x6D, 0xAA, 0x58, 0xB7, 0xE1, 0x11, + 0x1B, 0x31, 0xC6, 0x65, 0xF7, 0x12, 0xDF, 0xED, 0x49, 0x22, 0x7E, 0x64, + 0xB2, 0x5E, 0x9E, 0x4A, 0xDD, 0xF0, 0x59, 0xDF, 0xE1, 0x64, 0x37, 0xE6, + 0x02, 0x95, 0x95, 0xC8, 0x79, 0x17, 0xBC, 0xED, 0x87, 0xF4, 0x60, 0xAF, + 0x35, 0x35, 0x1C, 0x73, 0x36, 0xB9, 0xA5, 0xE4, 0x12, 0x8B, 0xCA, 0x92, + 0xD1, 0x21, 0xCA, 0xEF, 0xC0, 0xFD, 0x31, 0xFF, 0xE3, 0x34, 0xD9, 0xDD, + 0xE8, 0x91, 0xC0, 0x65, 0xCD, 0x1B, 0x38, 0x0F, 0xC3, 0xC1, 0xFA, 0xC5, + 0x0D, 0x5F, 0xB8, 0xB4, 0x3A, 0x59, 0x15, 0xBA, 0x14, 0x00, 0xCA, 0xFE, + 0x5A, 0x18, 0x8C, 0x05, 0x84, 0x35, 0xB3, 0x28, 0x40, 0xB0, 0x79, 0x6D, + 0x1A, 0x49, 0x9E, 0x76, 0x98, 0xC1, 0x6D, 0xDF, 0x69, 0x7D, 0xE3, 0x5F, + 0xE8, 0xD8, 0x26, 0x99, 0x4D, 0x52, 0x3E, 0x94, 0x70, 0x7E, 0xDE, 0x93, + 0xD8, 0xE5, 0x4C, 0x0C, 0xBB, 0x76, 0xEE, 0x44, 0x07, 0x4B, 0xD2, 0x4A, + 0x9A, 0x45, 0xE7, 0x31, 0x6D, 0x32, 0xD5, 0x55, 0xD9, 0xF2, 0xCF, 0xC7, + 0x25, 0xEA, 0x2D, 0xD7, 0xF2, 0x0B, 0x3F, 0x66, 0x57, 0xCD, 0xC6, 0xF6, + 0x59, 0x8E, 0xB3, 0x30, 0x7C, 0x86, 0x9F, 0x90, 0xD7, 0x84, 0x8D, 0xAF, + 0x85, 0x50, 0x89, 0x4B, 0x5C, 0x6B, 0xE8, 0x8E, 0x66, 0x7B, 0x86, 0x26, + 0xCE, 0xB3, 0x0E, 0xD0, 0x45, 0x7B, 0x46, 0x56, 0x63, 0xB9, 0x7B, 0xF3, + 0x33, 0x4C, 0x38, 0x25, 0xFD, 0x21, 0xAB, 0x54, 0xF9, 0xC8, 0xBD, 0x98, + 0x60, 0xFB, 0xBE, 0x00, 0x37, 0x3C, 0x8A, 0x52, 0xF6, 0xD7, 0xF3, 0xCE, + 0x05, 0xC2, 0x14, 0xB8, 0x6D, 0xFF, 0x88, 0x04, 0x73, 0x11, 0x4B, 0xE1, + 0x5B, 0xFE, 0x2D, 0x13, 0x44, 0x22, 0x05, 0xA4, 0x5D, 0x49, 0x9F, 0x21, + 0x65, 0x8D, 0xEE, 0x1E, 0xF8, 0x48, 0xBF, 0xBB, 0xEF, 0x09, 0x01, 0xCB, + 0x3B, 0x94, 0xF5, 0xC6, 0x1D, 0x5D, 0x3B, 0x13, 0x26, 0x3B, 0x58, 0xF4, + 0x3D, 0xD5, 0x2D, 0x66, 0xD0, 0xD9, 0xDB, 0x8C, 0x91, 0x66, 0x98, 0x27, + 0x52, 0xA1, 0xAE, 0xBD, 0x04, 0x7B, 0x66, 0xFD, 0xBC, 0xE2, 0x16, 0x12, + 0xE3, 0x10, 0x2E, 0x32, 0x16, 0xF3, 0x47, 0x02, 0xF6, 0x76, 0x89, 0xFF, + 0xB1, 0xB7, 0xCC, 0x44, 0xAB, 0x93, 0xD5, 0xD4, 0x72, 0x4F, 0x0D, 0x5B, + 0xBD, 0x6A, 0xD9, 0xDA, 0x88, 0xAA, 0x20, 0x43, 0xC3, 0xF3, 0x9E, 0xAE, + 0xE6, 0xA1, 0xFD, 0xC4, 0xC8, 0xD8, 0x54, 0x59, 0x07, 0x5C, 0x74, 0xFD, + 0x18, 0x75, 0xED, 0x0F, 0x43, 0x53, 0xB1, 0x88, 0xDA, 0x1B, 0xE6, 0x53, + 0xCB, 0xC7, 0xDB, 0x47, 0x74, 0x6B, 0x9E, 0x62, 0xD4, 0x27, 0x1C, 0xB8, + 0x27, 0xCA, 0xE2, 0x64, 0x24, 0x91, 0x6F, 0x6E, 0xA7, 0x0A, 0x47, 0xB1, + 0x9E, 0x0B, 0x11, 0x17, 0xB4, 0x54, 0x8A, 0x18, 0xCD, 0x41, 0x4E, 0xC5, + 0x4C, 0xA6, 0xAE, 0xF5, 0x42, 0xD1, 0x98, 0x22, 0xF3, 0xB5, 0xAC, 0x86, + 0x4C, 0xCC, 0x0B, 0x09, 0x24, 0x9E, 0xD6, 0x1E, 0x2F, 0x48, 0xFA, 0xA6, + 0xBA, 0x40, 0x78, 0xA1, 0xE8, 0x5B, 0x93, 0xE3, 0xE8, 0xAF, 0x0B, 0x30, + 0xB1, 0x50, 0x17, 0x7A, 0xF9, 0x6D, 0x29, 0xB8, 0x05, 0x43, 0xBF, 0xEE, + 0x8A, 0x59, 0x9F, 0xCC, 0x22, 0x7A, 0x02, 0xD1, 0xA1, 0x58, 0x77, 0x7F, + 0x1B, 0xF4, 0xE0, 0x13, 0xE1, 0xE7, 0xE2, 0x39, 0xAE, 0xEB, 0xC5, 0xC7, + 0x90, 0x9F, 0xA5, 0x73, 0xD3, 0x42, 0x25, 0x75, 0x0B, 0x42, 0x6F, 0x11, + 0x5B, 0x05, 0xC1, 0xEB, 0x39, 0xC3, 0x8E, 0x50, 0x98, 0x2A, 0x85, 0x53, + 0x0A, 0x06, 0xE7, 0x8A, 0xB0, 0xB1, 0x93, 0xD1, 0x46, 0xB9, 0x6A, 0x14, + 0xBC, 0x7A, 0xC9, 0xF3, 0x71, 0x32, 0x73, 0x1F, 0x28, 0x3D, 0xEA, 0x35, + 0xF1, 0xE6, 0xE9, 0x1B, 0x6E, 0xDF, 0xC5, 0x5E, 0xB0, 0x23, 0x26, 0x3C, + 0x3D, 0x6C, 0x02, 0xED, 0xB9, 0x79, 0x03, 0xF5, 0xD8, 0x01, 0xFD, 0x26, + 0x41, 0x73, 0xBC, 0x58, 0xF6, 0xB4, 0x2A, 0xB8, 0xAE, 0x07, 0xDE, 0xDD, + 0x9C, 0x52, 0xF2, 0x2E, 0x23, 0x39, 0x50, 0xEE, 0x87, 0xDB, 0x97, 0x93, + 0xF5, 0xEE, 0xD1, 0xA8, 0x43, 0x17, 0x67, 0xCD, 0xEF, 0xC1, 0x68, 0x6A, + 0x2C, 0x7A, 0x49, 0xFB, 0xEE, 0x52, 0x17, 0xC4, 0x01, 0x19, 0xC3, 0xA4, + 0x51, 0x00, 0x8E, 0xF9, 0x50, 0x35, 0x3E, 0xB0, 0x10, 0x88, 0xCB, 0x62, + 0x85, 0xA0, 0x95, 0x27, 0xAC, 0x31, 0x05, 0x8B, 0x47, 0x41, 0xD5, 0x57, + 0x41, 0xDB, 0xA8, 0x5B, 0x0A, 0x77, 0x73, 0xAF, 0xFE, 0x29, 0xF6, 0x1E, + 0xF8, 0xB1, 0xC5, 0x34, 0xEF, 0xD0, 0xFA, 0xB7, 0xB3, 0xCD, 0xB2, 0x32, + 0x5F, 0xA1, 0x58, 0x8B, 0x7A, 0x6E, 0x16, 0xBE, 0x0C, 0xA9, 0xDB, 0x8E, + 0x42, 0x25, 0xE2, 0xAF, 0x69, 0xD4, 0x52, 0xC6, 0xD2, 0x7A, 0xAC, 0x80, + 0x90, 0xBE, 0xC4, 0x79, 0x1D, 0x0F, 0xAA, 0xAA, 0x29, 0x60, 0xC9, 0x3E, + 0xE2, 0x38, 0x9F, 0x17, 0xD9, 0xDE, 0x9D, 0x30, 0x78, 0x8C, 0xD8, 0xDB, + 0x0B, 0x85, 0xEA, 0x3A, 0x8C, 0xF9, 0x44, 0x56, 0x59, 0xA3, 0xB0, 0xD6, + 0x5A, 0x03, 0xEB, 0x8A, 0x93, 0xA0, 0x3C, 0xF1, 0x74, 0xB7, 0x99, 0x17, + 0x38, 0x6E, 0x7D, 0xC7, 0x98, 0x2F, 0xBB, 0xEC, 0x7D, 0xA7, 0x66, 0xBF, + 0x7C, 0x0A, 0x52, 0x46, 0x77, 0x39, 0x6E, 0xEE, 0x1D, 0x57, 0xEE, 0x53, + 0x7D, 0x3C, 0xFE, 0xB0, 0x02, 0x61, 0x67, 0xB3, 0x1A, 0x23, 0xA7, 0xCB, + 0xB6, 0xFE, 0x80, 0x45, 0x2E, 0xAF, 0xFB, 0x7D, 0xB3, 0x7B, 0x1A, 0xAE, + 0x03, 0x9E, 0xE5, 0x55, 0x1F, 0x24, 0xEE, 0x0C, 0xA9, 0xC9, 0x9B, 0xC5, + 0x39, 0xE1, 0xD9, 0xD8, 0xA1, 0x5A, 0x65, 0x56, 0x8B, 0x1F, 0xA4, 0x92, + 0xD1, 0x5B, 0x21, 0x7E, 0xCF, 0x4E, 0x5C, 0xF6, 0xD2, 0x0B, 0xCA, 0x18, + 0xB5, 0x02, 0x24, 0x1D, 0x39, 0x22, 0xFF, 0x0E, 0x3B, 0x4A, 0xF8, 0x4C, + 0x39, 0x1A, 0x4F, 0x4E, 0xE7, 0x05, 0x36, 0xEF, 0xED, 0xE6, 0x53, 0x0B, + 0x32, 0x52, 0x0E, 0xFD, 0x1B, 0x35, 0x23, 0x67, 0x18, 0xAB, 0xAB, 0x63, + 0xB5, 0x6F, 0x96, 0xBC, 0x35, 0xCD, 0x30, 0x57, 0xEE, 0x27, 0xAD, 0xA5, + 0x8B, 0x52, 0x9A, 0x80, 0x46, 0xA4, 0x43, 0xBC, 0xD3, 0x35, 0x06, 0xBE, + 0x54, 0xF5, 0xBA, 0x79, 0xF6, 0x58, 0x2B, 0x19, 0x1B, 0x8F, 0x84, 0xAD, + 0x59, 0xAB, 0x04, 0x3F, 0xF8, 0xEC, 0xF6, 0xC4, 0x2A, 0x25, 0xF3, 0xE2, + 0x63, 0x21, 0xD5, 0xB6, 0x7E, 0x34, 0xDC, 0x62, 0x77, 0x58, 0xAB, 0xCA, + 0x7E, 0xC6, 0xCD, 0x8C, 0xBA, 0x7D, 0xEC, 0x97, 0x5D, 0x5D, 0x2B, 0x54, + 0x58, 0x71, 0x23, 0x89, 0x79, 0x24, 0x97, 0xE5, 0x02, 0x71, 0xBA, 0x49, + 0xA6, 0x0A, 0x1C, 0x39, 0x20, 0x75, 0xAF, 0x35, 0xB2, 0xE3, 0xA9, 0x93, + 0xB5, 0xA7, 0xF6, 0x1C, 0xA5, 0x29, 0x67, 0x31, 0x59, 0x5F, 0xF2, 0xE6, + 0x50, 0xE1, 0xDF, 0x1C, 0xC7, 0x6F, 0xE3, 0xEE, 0x33, 0xFF, 0xBA, 0xF1, + 0xD9, 0xDC, 0x12, 0xC6, 0xF7, 0xEF, 0x74, 0x49, 0x09, 0xBA, 0xD1, 0x6C, + 0x04, 0xF8, 0x76, 0x3C, 0xBA, 0x51, 0xB8, 0x31, 0xC8, 0x3E, 0xBE, 0x24, + 0xCE, 0x03, 0x71, 0x2D, 0xEC, 0x91, 0xA8, 0x83, 0x15, 0xF5, 0xA4, 0x86, + 0x6F, 0x11, 0x8D, 0xD7, 0x6D, 0x57, 0x17, 0x0E, 0x11, 0x46, 0x44, 0xA0, + 0x65, 0xCC, 0x9E, 0xAA, 0x4B, 0x4A, 0xAA, 0x13, 0x3F, 0xE2, 0x98, 0x20, + 0x0B, 0xFF, 0xBB, 0x2A, 0x78, 0xEE, 0x62, 0x6F, 0x9E, 0xB0, 0xFD, 0x06, + 0x83, 0x1A, 0x32, 0x52, 0x48, 0x1B, 0xFC, 0xCE, 0x13, 0xA4, 0xA8, 0xA7, + 0x9A, 0xFF, 0xC4, 0x1E, 0xE3, 0xA6, 0xCA, 0x32, 0xBD, 0xCE, 0xE7, 0x72, + 0x47, 0xC1, 0x72, 0x67, 0x25, 0x45, 0xCA, 0x3C, 0x14, 0xE6, 0x45, 0x0E, + 0x92, 0x73, 0xCA, 0xA1, 0x39, 0x18, 0xEE, 0x40, 0xD2, 0xD3, 0x0F, 0x12, + 0xEC, 0xF7, 0xEF, 0xB7, 0x62, 0x73, 0xBC, 0xEB, 0xF0, 0xF8, 0xD5, 0x3C, + 0x54, 0xFA, 0x9A, 0x3B, 0xBC, 0x7A, 0x7A, 0xA0, 0x95, 0x42, 0x6F, 0xEE, + 0x7A, 0xD6, 0x15, 0x29, 0x29, 0xAF, 0x54, 0xA9, 0x14, 0x85, 0xFB, 0x9A, + 0x06, 0xEA, 0xBC, 0x09, 0x9A, 0x2B, 0x94, 0x73, 0x25, 0x08, 0x3C, 0xAB, + 0xB3, 0x20, 0xB3, 0x45, 0xC2, 0xA0, 0x81, 0xA6, 0xFA, 0x04, 0xBA, 0x7E, + 0x49, 0x41, 0xC3, 0x4E, 0x1C, 0xE9, 0xE9, 0x48, 0xA9, 0x1D, 0xDC, 0xAB, + 0x3F, 0xE5, 0xB8, 0xC1, 0x92, 0xE4, 0xDB, 0xEB, 0x40, 0x09, 0x16, 0x48, + 0x21, 0xC3, 0xF1, 0x8D, 0x18, 0xE7, 0x07, 0xBD, 0x9D, 0x9F, 0x68, 0x9D, + 0x29, 0xF2, 0x2D, 0xC0, 0x6F, 0x23, 0x3B, 0x84, 0x93, 0xB1, 0x9C, 0xCE, + 0x40, 0xFF, 0xF4, 0x5B, 0xF6, 0xCF, 0x27, 0x97, 0x1B, 0x2E, 0x0B, 0x1E, + 0xFB, 0xE7, 0x86, 0xE9, 0x6C, 0xB8, 0xBB, 0x33, 0x0F, 0x85, 0x4F, 0xF4, + 0xA5, 0x16, 0x75, 0x07, 0x0A, 0xD1, 0x8A, 0x92, 0xDF, 0x47, 0xA7, 0x74, + 0xCB, 0x76, 0xED, 0xCB, 0x6C, 0x4C, 0xDF, 0xF0, 0xD8, 0x83, 0xDE, 0x36, + 0x2E, 0x8B, 0x42, 0xAD, 0x32, 0x25, 0x89, 0xCE, 0x2B, 0x2F, 0x73, 0xE1, + 0x18, 0x8F, 0x42, 0xA6, 0x8E, 0x60, 0xB9, 0xBD, 0x8F, 0xA5, 0x09, 0x72, + 0x48, 0x70, 0x73, 0x93, 0xE5, 0x61, 0x77, 0x44, 0xC3, 0x79, 0x9C, 0x01, + 0xD7, 0x8B, 0xA6, 0x4D, 0x3E, 0xD1, 0xD1, 0x81, 0x19, 0x24, 0xE4, 0xAC, + 0xC9, 0xD5, 0x37, 0x8B, 0x3F, 0x79, 0x82, 0x02, 0xE3, 0xA5, 0x70, 0x71, + 0x3D, 0x7A, 0x66, 0xF4, 0xAB, 0xC0, 0x7C, 0x39, 0x95, 0xBD, 0x31, 0xCA, + 0x97, 0xD1, 0x30, 0x1F, 0xE1, 0x34, 0xA1, 0x1F, 0x53, 0x65, 0xD8, 0x11, + 0xA4, 0x00, 0x0A, 0x9D, 0x8F, 0x7D, 0x25, 0x92, 0xE0, 0xE3, 0x41, 0xB4, + 0xAC, 0xC9, 0x05, 0x71, 0xF8, 0x1E, 0x0F, 0xF3, 0x87, 0x02, 0x67, 0x8B, + 0xF8, 0x93, 0xFA, 0x9C, 0x37, 0xED, 0x86, 0xE2, 0xAD, 0x4A, 0x61, 0x6E, + 0xD3, 0x18, 0x5E, 0x88, 0x70, 0xF4, 0xCD, 0xD5, 0x17, 0xE3, 0xEC, 0xCF, + 0x44, 0x7B, 0x58, 0x88, 0x68, 0x42, 0x25, 0x73, 0xE6, 0x16, 0x54, 0xA9, + 0x53, 0xC8, 0x2F, 0xB0, 0xA4, 0x68, 0x11, 0x7C, 0x13, 0xA9, 0x78, 0x69, + 0xCA, 0xAF, 0x3A, 0x77, 0xF2, 0xB0, 0xEE, 0x77, 0xF8, 0x8E, 0x4D, 0x9F, + 0xF9, 0x9F, 0x11, 0xFD, 0xFE, 0xCD, 0xFF, 0x70, 0x32, 0x0F, 0x12, 0xFE, + 0xEC, 0x52, 0xA9, 0x81, 0xBA, 0xF0, 0xBE, 0xE7, 0x39, 0x90, 0x4A, 0xA8, + 0xF9, 0xEE, 0xB8, 0x61, 0x92, 0x4B, 0x0B, 0x79, 0xB9, 0x63, 0x3B, 0x56, + 0x4E, 0x09, 0xB2, 0xB8, 0xBB, 0x3B, 0x24, 0x58, 0x53, 0x43, 0xD5, 0xDE, + 0x7A, 0x8D, 0xF8, 0x0A, 0x86, 0xC1, 0x00, 0x67, 0x4B, 0xE7, 0xC6, 0x87, + 0xA3, 0x4B, 0x7F, 0xFC, 0xC9, 0x27, 0x98, 0x45, 0x22, 0x1E, 0x43, 0x81, + 0x69, 0xEB, 0x10, 0xF1, 0xD3, 0xA6, 0x1D, 0x83, 0x29, 0x1D, 0x8B, 0x77, + 0xB3, 0x4E, 0x7E, 0xD0, 0xDB, 0xE5, 0x61, 0x71, 0xFE, 0x38, 0xA7, 0x9E, + 0x47, 0x8C, 0x2E, 0x80, 0xB4, 0x07, 0x1C, 0x77, 0x8A, 0xD6, 0x50, 0xB5, + 0x32, 0xCF, 0xCF, 0xBE, 0xB0, 0x6F, 0x6E, 0x77, 0xEA, 0x5D, 0x14, 0x10, + 0x7B, 0x1B, 0x51, 0xD2, 0xD6, 0xDC, 0x7C, 0x94, 0xDB, 0xFD, 0x5A, 0x37, + 0xAD, 0x28, 0x0C, 0xAC, 0x1B, 0x85, 0x54, 0x2F, 0xF1, 0x9A, 0x1C, 0x7B, + 0xA8, 0x81, 0x9C, 0x75, 0xFD, 0x38, 0x1E, 0xE4, 0x1A, 0xA5, 0x41, 0x9A, + 0x02, 0x2F, 0x3F, 0x1E, 0x8F, 0x8F, 0x9B, 0xDF, 0x85, 0x36, 0x25, 0xAB, + 0x1D, 0x60, 0x2B, 0xC7, 0x71, 0xBB, 0x33, 0x81, 0xDF, 0xAE, 0x60, 0xD9, + 0x94, 0xF6, 0x55, 0xBA, 0xB1, 0x86, 0x63, 0x03, 0xF5, 0xF2, 0x2E, 0x56, + 0x09, 0xD5, 0xAF, 0xD5, 0x97, 0x91, 0xDA, 0xD6, 0x78, 0x8C, 0x05, 0xF0, + 0xC6, 0x7F, 0x8D, 0x68, 0xA2, 0xB8, 0x47, 0x70, 0x58, 0xB4, 0xD2, 0x7E, + 0xED, 0x9C, 0x77, 0x41, 0x24, 0x7C, 0x48, 0x40, 0x52, 0x64, 0x03, 0x40, + 0x33, 0xD3, 0x03, 0x48, 0xFA, 0xE7, 0x94, 0x75, 0xD2, 0x8A, 0x07, 0xFA, + 0x40, 0x28, 0x4C, 0x7B, 0x23, 0x71, 0xC1, 0xA0, 0x60, 0x18, 0xBC, 0xBB, + 0xFF, 0x98, 0x0E, 0x5B, 0xC4, 0xEC, 0x77, 0xF8, 0xE9, 0xAD, 0x60, 0x8C, + 0x6D, 0x21, 0x7A, 0xEF, 0x84, 0x80, 0x02, 0x10, 0xD3, 0xC3, 0x98, 0xD5, + 0xFE, 0x4C, 0xD7, 0x62, 0xE3, 0x5A, 0x4C, 0x01, 0xEA, 0xEF, 0x43, 0xFB, + 0x04, 0x8B, 0x33, 0x86, 0x6B, 0xAA, 0xD4, 0x69, 0xF7, 0x9E, 0x3F, 0x3C, + 0x3E, 0xC0, 0xEC, 0xE5, 0x89, 0xA5, 0x00, 0xB7, 0xB0, 0xAA, 0x24, 0xAF, + 0x0B, 0xBD, 0x0F, 0x35, 0x69, 0x72, 0x6B, 0xC2, 0x38, 0x8E, 0x23, 0xEE, + 0xF9, 0x2D, 0xB6, 0x42, 0xF8, 0x39, 0x1A, 0x3B, 0xA9, 0x59, 0x4A, 0x95, + 0xD7, 0xE3, 0x5D, 0x08, 0x7B, 0xFD, 0xD0, 0x60, 0xEC, 0xE9, 0x5A, 0x17, + 0x61, 0xA9, 0x84, 0x47, 0x16, 0x68, 0x64, 0x21, 0x61, 0xFE, 0x48, 0x03, + 0x3A, 0x45, 0x4A, 0x1F, 0xB6, 0xA1, 0xD0, 0x0D, 0xAF, 0x25, 0x14, 0x2F, + 0xAE, 0xA7, 0x7E, 0x3D, 0x7B, 0x99, 0xB3, 0x1F, 0xD4, 0x9B, 0x26, 0xA4, + 0xCE, 0xFE, 0x61, 0xAD, 0x0E, 0xF4, 0x73, 0xE1, 0xDC, 0x03, 0xF4, 0x98, + 0x80, 0x97, 0xFF, 0xE8, 0x0E, 0xC3, 0x0D, 0x92, 0x7B, 0x0C, 0xB8, 0xBB, + 0x2F, 0x0F, 0xC4, 0x85, 0xEC, 0xC4, 0xCD, 0x60, 0xF3, 0xF5, 0x8A, 0x04, + 0x71, 0x55, 0xF9, 0x76, 0xAD, 0x37, 0xC2, 0xA7, 0x4E, 0xDF, 0x51, 0x64, + 0x90, 0x7F, 0x59, 0xB7, 0xFC, 0x3C, 0xB8, 0x75, 0xBB, 0x95, 0x4A, 0x85, + 0x10, 0x3C, 0xD4, 0xC2, 0x42, 0x37, 0xE1, 0x73, 0x92, 0xDD, 0xFA, 0x8C, + 0xB1, 0xCC, 0x53, 0xF4, 0xC7, 0xED, 0x06, 0x19, 0x9F, 0x8B, 0xEE, 0xF2, + 0x70, 0xB8, 0x26, 0xF4, 0xF3, 0x20, 0x73, 0x5B, 0xDC, 0xE9, 0x64, 0xDD, + 0x07, 0x2F, 0x7B, 0xE8, 0x30, 0x8E, 0x4C, 0xC4, 0x6C, 0x33, 0x7C, 0x90, + 0x24, 0x03, 0xD6, 0xA1, 0x12, 0xEB, 0x14, 0xFF, 0x78, 0x92, 0x8D, 0x99, + 0xD6, 0x46, 0x2E, 0xA6, 0x09, 0x4C, 0xAE, 0xDB, 0x42, 0xC2, 0x60, 0x89, + 0x9F, 0x15, 0x1C, 0x01, 0x08, 0x1C, 0x9F, 0xE0, 0xA8, 0x18, 0x85, 0xF8, + 0x1A, 0x61, 0x42, 0x2B, 0x80, 0xDB, 0xD8, 0x9C, 0xBB, 0xB9, 0xF4, 0x97, + 0x3B, 0x37, 0x21, 0xC5, 0x25, 0x68, 0x9A, 0xD3, 0xA1, 0xCB, 0xED, 0x1B, + 0x43, 0x4C, 0x17, 0x77, 0xB8, 0xAD, 0x8A, 0xF8, 0x3F, 0xBA, 0x78, 0xDD, + 0x98, 0x58, 0x62, 0x0F, 0x90, 0xB9, 0x5F, 0xB0, 0xC7, 0x63, 0xF1, 0x85, + 0x0E, 0x79, 0x55, 0x85, 0x2D, 0x80, 0xAC, 0x0B, 0x4D, 0xD9, 0x68, 0x06, + 0x74, 0x05, 0xDA, 0xF6, 0x16, 0x30, 0x0D, 0x83, 0x2C, 0x92, 0xA2, 0xD6, + 0x4B, 0x0B, 0xDC, 0x01, 0x6B, 0x5B, 0xCC, 0xEB, 0x2E, 0x9E, 0x0E, 0xBB, + 0xE1, 0xA7, 0x70, 0x8C, 0x98, 0xF6, 0x32, 0xF1, 0x1C, 0xE0, 0x4D, 0x70, + 0x09, 0x84, 0xB7, 0xD8, 0xD1, 0x96, 0x1C, 0xDD, 0x07, 0xE7, 0xFA, 0xB6, + 0x57, 0xE7, 0x70, 0x29, 0xB6, 0xE3, 0x29, 0x6A, 0xCB, 0xC4, 0xD3, 0xAE, + 0x80, 0x9A, 0xDF, 0xAE, 0x59, 0x8D, 0x0E, 0xAD, 0xF5, 0xE5, 0x5E, 0x1F, + 0x08, 0x46, 0xC2, 0xBC, 0x3D, 0x6F, 0xD1, 0x40, 0xB3, 0x8F, 0x67, 0xBC, + 0xDE, 0x7F, 0x68, 0xD9, 0xB3, 0x11, 0xB0, 0x78, 0x13, 0xE6, 0x54, 0x0E, + 0x11, 0x52, 0x50, 0xFE, 0x4A, 0xB7, 0x94, 0x4A, 0xCF, 0x8E, 0x1C, 0xF5, + 0xAE, 0xC9, 0xF2, 0xB5, 0x68, 0x32, 0xE6, 0x5D, 0xE3, 0xED, 0xBF, 0x74, + 0x9C, 0xB8, 0xD0, 0x02, 0x73, 0x7D, 0x99, 0x76, 0xEE, 0x08, 0x21, 0x51, + 0x62, 0xED, 0xD7, 0xAE, 0xF1, 0xDE, 0x2C, 0x61, 0xA1, 0x9E, 0xDC, 0xDE, + 0x98, 0x47, 0xDF, 0x55, 0x4F, 0x57, 0x83, 0x17, 0x9C, 0x7B, 0x95, 0xB7, + 0xAF, 0xD2, 0xD3, 0xB8, 0x17, 0x7C, 0x87, 0x01, 0x12, 0x89, 0x73, 0x6A, + 0xBB, 0xB1, 0x3E, 0x11, 0x81, 0xE3, 0x9A, 0x99, 0xC6, 0xE1, 0xA1, 0x09, + 0x9F, 0xE8, 0xA3, 0x8B, 0x5A, 0x98, 0x32, 0xE7, 0x78, 0x98, 0x78, 0xA9, + 0x10, 0x6E, 0xA1, 0xA9, 0xA2, 0xFF, 0xD3, 0x16, 0xBB, 0x78, 0x80, 0xE4, + 0x74, 0xE5, 0xBB, 0x46, 0x09, 0xEB, 0x5E, 0xFE, 0x8D, 0x7B, 0xF0, 0xB2, + 0xA6, 0x4B, 0x49, 0x04, 0xCE, 0x1C, 0x9D, 0x5D, 0x7A, 0xD8, 0x52, 0xB9, + 0xA7, 0x59, 0xB5, 0x0B, 0xEA, 0xDA, 0x0C, 0x26, 0xB9, 0x0D, 0x2A, 0x63, + 0x39, 0xBC, 0xF5, 0x44, 0x04, 0x83, 0xA2, 0x34, 0x4F, 0x83, 0x48, 0x62, + 0xAC, 0x77, 0xA9, 0xF2, 0xC1, 0xE0, 0xA2, 0xFC, 0xAB, 0xAD, 0x98, 0x33, + 0x4A, 0x67, 0xED, 0x31, 0x57, 0xB7, 0x9F, 0x53, 0xA2, 0x2A, 0x95, 0x7E, + 0x67, 0xF7, 0x2F, 0x1B, 0xA3, 0xE7, 0x22, 0xC5, 0xDC, 0x01, 0x02, 0xFC, + 0x2D, 0x6E, 0xBA, 0x65, 0xF2, 0x15, 0x8A, 0xA6, 0x2C, 0xBF, 0xEE, 0x52, + 0xE5, 0x9D, 0xC3, 0xE3, 0x7A, 0xCC, 0x6D, 0x75, 0x99, 0xF5, 0xCC, 0xE9, + 0x58, 0x98, 0xB8, 0xEF, 0x01, 0xA6, 0x2C, 0xE8, 0x48, 0xBE, 0x6E, 0x85, + 0xBA, 0x98, 0x2D, 0x50, 0x8E, 0xCF, 0xB0, 0xB0, 0x98, 0x2F, 0x98, 0x62, + 0xF9, 0xB6, 0x46, 0xE3, 0xA5, 0xBC, 0xD3, 0x76, 0x4B, 0xB8, 0x53, 0xB1, + 0x1C, 0x9D, 0x08, 0x64, 0x53, 0xB4, 0x6B, 0xF5, 0x4B, 0xAD, 0x78, 0x10, + 0x93, 0x62, 0xE2, 0xD4, 0x46, 0xB8, 0xB6, 0xD3, 0xD6, 0x6E, 0x53, 0x7F, + 0x12, 0x19, 0x65, 0x5A, 0xA0, 0x7B, 0xF4, 0x9F, 0x24, 0x1B, 0xD5, 0x79, + 0x14, 0xA8, 0x16, 0xDB, 0x99, 0xE8, 0x37, 0x7A, 0x75, 0x91, 0xAC, 0xD8, + 0xA7, 0x58, 0x38, 0xB0, 0x7B, 0x8E, 0x1E, 0x4B, 0x69, 0x19, 0x9E, 0xAB, + 0x99, 0xD8, 0xB5, 0xE5, 0x1B, 0xC2, 0x1C, 0xFA, 0xF1, 0xB8, 0xD3, 0x68, + 0x87, 0x6B, 0xBA, 0xD7, 0x15, 0xA6, 0x2B, 0xA2, 0x40, 0xA1, 0x75, 0xFB, + 0xE1, 0x2F, 0x56, 0x8A, 0xE0, 0x27, 0x7F, 0x82, 0x0B, 0x40, 0x15, 0x30, + 0xFC, 0xFE, 0xE9, 0x7C, 0xCA, 0x46, 0x88, 0xA2, 0x64, 0x48, 0x6B, 0xD2, + 0x82, 0x20, 0xE5, 0x7A, 0x35, 0xCD, 0xD6, 0xCE, 0x4D, 0x03, 0xA2, 0x12, + 0xA5, 0x8E, 0xBF, 0x56, 0x64, 0x95, 0x4F, 0x47, 0xCB, 0x5B, 0x53, 0x5E, + 0x57, 0x51, 0xF1, 0x4A, 0x57, 0xCA, 0xBC, 0xE0, 0x82, 0x8E, 0xDE, 0x6E, + 0x48, 0xD9, 0xBF, 0xC0, 0x8C, 0xF5, 0x68, 0xEA, 0x76, 0xFB, 0x29, 0x7A, + 0xEC, 0x5C, 0xCF, 0x7D, 0x49, 0xD4, 0xCD, 0x83, 0x7C, 0xD6, 0xC5, 0x52, + 0x2B, 0x80, 0x1D, 0x03, 0x5F, 0xA9, 0x78, 0x6B, 0x73, 0xEF, 0xE0, 0x93, + 0xE7, 0x6D, 0x14, 0xDC, 0x07, 0x44, 0x46, 0xCD, 0x34, 0x6C, 0x2F, 0xA7, + 0x1D, 0xC1, 0x93, 0x01, 0xF1, 0x03, 0x1D, 0x68, 0x84, 0x95, 0x72, 0xC5, + 0x2A, 0x51, 0x1A, 0x43, 0x73, 0xC6, 0x78, 0x7F, 0x25, 0x0C, 0x34, 0xAE, + 0x35, 0x48, 0xC8, 0xBE, 0xB1, 0xB7, 0x67, 0xF5, 0x82, 0xF7, 0xBB, 0x7E, + 0x00, 0x3E, 0x14, 0xD9, 0xF7, 0x81, 0xC1, 0x5A, 0xEF, 0xB4, 0x40, 0x11, + 0x4B, 0x1C, 0xC4, 0xBB, 0x80, 0x21, 0x52, 0xE3, 0x43, 0xF4, 0x9F, 0x33, + 0x3F, 0x79, 0x63, 0xDE, 0xB8, 0x81, 0x21, 0xCC, 0xA3, 0x1A, 0x1E, 0x8A, + 0x35, 0xC0, 0x8F, 0x14, 0x50, 0x0C, 0xA7, 0xCA, 0x0D, 0x36, 0x1F, 0xC3, + 0xB3, 0xEA, 0xA1, 0x0B, 0x06, 0xE0, 0xC9, 0xD1, 0x9C, 0xB9, 0x45, 0x0A, + 0xE5, 0xFE, 0xB4, 0x41, 0x31, 0x14, 0x01, 0xB9, 0x44, 0x10, 0xAF, 0x87, + 0x38, 0x05, 0x14, 0xD6, 0x2B, 0x48, 0x8D, 0x71, 0x5A, 0xE3, 0xC9, 0x0E, + 0xF5, 0x9C, 0x1B, 0xF7, 0x08, 0x30, 0x42, 0x33, 0xF4, 0x40, 0x38, 0xB3, + 0xF5, 0xEB, 0xA8, 0x61, 0xBE, 0xC1, 0x8B, 0xDC, 0xE4, 0x89, 0xA9, 0xF1, + 0x22, 0x86, 0x6A, 0x70, 0xC4, 0xD1, 0x75, 0x63, 0x17, 0x01, 0x2E, 0x42, + 0xE4, 0x30, 0x43, 0x36, 0x72, 0xFC, 0xF7, 0xA8, 0xCB, 0x97, 0x27, 0xD4, + 0x1C, 0xFC, 0xEF, 0xA5, 0x55, 0xFA, 0xD3, 0x58, 0xFB, 0x52, 0xA4, 0x5D, + 0x48, 0x16, 0x57, 0x3F, 0x10, 0x60, 0x9A, 0x0E, 0x75, 0x70, 0x94, 0xA9, + 0xC4, 0x21, 0xC2, 0xFE, 0xF0, 0x96, 0x0F, 0x5B, 0xD0, 0xB8, 0x65, 0xA9, + 0xE3, 0xDE, 0xE1, 0x65, 0x88, 0x77, 0x33, 0xEE, 0xE9, 0xA5, 0x82, 0xCF, + 0x7D, 0x0C, 0x7E, 0x81, 0x3C, 0x20, 0xAF, 0x2D, 0xF6, 0x85, 0xF9, 0xB8, + 0xA8, 0x67, 0xF3, 0x49, 0xC8, 0xA2, 0x51, 0x14, 0xB4, 0x0B, 0x09, 0xCC, + 0xE7, 0x61, 0x81, 0xF3, 0xD1, 0xDE, 0x6E, 0xAD, 0x82, 0x66, 0x33, 0xB9, + 0xBE, 0x52, 0x1F, 0x3E, 0x37, 0x88, 0xDE, 0x01, 0x06, 0x33, 0x67, 0x2B, + 0x8E, 0xD1, 0x65, 0x09, 0xA4, 0xC7, 0x18, 0x72, 0x27, 0xDF, 0xA1, 0xE6, + 0x3E, 0xAE, 0x7C, 0xCF, 0x23, 0x8F, 0xAB, 0x08, 0xA2, 0x2B, 0xF9, 0x99, + 0xDF, 0xDE, 0x92, 0x60, 0x2A, 0x1A, 0xFD, 0xB7, 0x70, 0xF3, 0xCA, 0xFC, + 0x97, 0x80, 0xB9, 0xE5, 0xB0, 0xE0, 0xF7, 0xDD, 0x8C, 0xAE, 0xFB, 0x8E, + 0xE3, 0x9A, 0x2D, 0xEE, 0x45, 0x6E, 0x57, 0xB4, 0xFE, 0x4F, 0x68, 0x1B, + 0x88, 0x2C, 0x03, 0x14, 0x54, 0xFB, 0xCC, 0xAE, 0x4E, 0x4A, 0x64, 0x3E, + 0x7F, 0xAB, 0xE6, 0xB4, 0xAD, 0xAE, 0x0D, 0xC7, 0xF5, 0xC3, 0x4C, 0x78, + 0xC6, 0x2D, 0xEA, 0xDD, 0xA6, 0xCD, 0x8E, 0xB6, 0x1C, 0x6F, 0xB5, 0x35, + 0x08, 0x71, 0xA8, 0x0A, 0xE3, 0xB7, 0x5A, 0x16, 0x1E, 0x32, 0xC5, 0x10, + 0x08, 0x1D, 0xE8, 0x16, 0x3A, 0xF2, 0xA4, 0xBA, 0x5A, 0xAF, 0x6B, 0x26, + 0x00, 0x3B, 0x72, 0xEF, 0x30, 0x77, 0x0B, 0x01, 0xE3, 0x94, 0xD9, 0x15, + 0x0F, 0x72, 0x43, 0x61, 0x5A, 0x13, 0x75, 0x68, 0xED, 0xAE, 0xE4, 0x5C, + 0xD9, 0xB9, 0xB2, 0x76, 0xAF, 0x3B, 0xDF, 0xEF, 0x1F, 0xFC, 0x82, 0x96, + 0x28, 0xDF, 0xC5, 0xDC, 0xE6, 0xD3, 0x30, 0xFE, 0xDD, 0x91, 0xA7, 0x9A, + 0x9E, 0x31, 0xB8, 0xFA, 0xEA, 0x75, 0x66, 0xB9, 0xA6, 0xD4, 0xFF, 0x5E, + 0x17, 0xB0, 0xA4, 0x24, 0x72, 0x3C, 0x87, 0x39, 0xA9, 0x22, 0xF1, 0x75, + 0x93, 0xE3, 0x62, 0xD0, 0x01, 0xD1, 0x86, 0x5D, 0xB9, 0x69, 0x26, 0x1F, + 0x17, 0x41, 0xB8, 0x05, 0xCF, 0x45, 0x94, 0x02, 0x8A, 0xAD, 0x3D, 0x38, + 0x81, 0xCA, 0xDF, 0x6F, 0x43, 0x35, 0xFB, 0x69, 0xAF, 0x92, 0x1F, 0x2B, + 0x3D, 0x88, 0x3B, 0x40, 0x55, 0x07, 0x2F, 0xF4, 0x30, 0x6B, 0x81, 0x1D, + 0xE2, 0xEF, 0x1E, 0x02, 0xCA, 0xD5, 0x92, 0xE2, 0xF9, 0x37, 0xBC, 0x5A, + 0x2D, 0x85, 0xF3, 0xC6, 0x97, 0xC8, 0x03, 0xB6, 0x88, 0xF2, 0x51, 0x77, + 0x61, 0xDB, 0x23, 0xB3, 0x75, 0xF2, 0xA2, 0x3C, 0x55, 0xAC, 0x14, 0x4C, + 0xC4, 0x5D, 0x49, 0x68, 0x39, 0xD3, 0x60, 0x00, 0x2A, 0xE5, 0x5C, 0x01, + 0x56, 0x60, 0x99, 0x6B, 0x02, 0xB2, 0x9F, 0x19, 0xB3, 0x80, 0x3B, 0xE7, + 0xBE, 0xAC, 0xED, 0xDD, 0x30, 0x6E, 0x78, 0x43, 0xBF, 0xF5, 0xF3, 0x80, + 0x4C, 0x59, 0xDB, 0xE4, 0x59, 0x8E, 0xE0, 0xFE, 0xAB, 0x19, 0xF0, 0xEE, + 0xB6, 0xFB, 0x60, 0x71, 0xFF, 0x54, 0x5B, 0xB6, 0x0E, 0x32, 0x2F, 0xF6, + 0xBD, 0xFC, 0x7E, 0xE5, 0x2F, 0xAB, 0x64, 0x91, 0xA1, 0x28, 0xA4, 0x0A, + 0x3E, 0x0E, 0x78, 0x1F, 0xB7, 0x30, 0x93, 0x4C, 0x7A, 0xEB, 0xD3, 0xA3, + 0x28, 0x47, 0xD0, 0x6B, 0x35, 0x7A, 0x87, 0x58, 0x66, 0x73, 0x58, 0x75, + 0x58, 0x27, 0x02, 0x4B, 0xE1, 0xE0, 0xB6, 0xED, 0x2D, 0x80, 0x0D, 0x75, + 0xCE, 0x8E, 0x13, 0x10, 0xA1, 0xFE, 0x33, 0xC7, 0xBF, 0xFC, 0xA7, 0xC0, + 0x0D, 0x7E, 0xC0, 0x53, 0x26, 0x71, 0xB4, 0xEB, 0x59, 0xA0, 0x1E, 0x04, + 0xA4, 0xDB, 0xE4, 0x2B, 0xDA, 0x7E, 0xFB, 0x11, 0x46, 0xF3, 0x76, 0x1E, + 0xC6, 0x17, 0x7D, 0xCD, 0xDC, 0x86, 0xAA, 0x4A, 0x69, 0x72, 0xC4, 0x0C, + 0xE9, 0xB1, 0x24, 0xD0, 0x84, 0x29, 0x1D, 0xB9, 0x71, 0xEC, 0x14, 0x2C, + 0x13, 0x90, 0xAE, 0x00, 0x07, 0x31, 0xBC, 0x88, 0x82, 0x03, 0xEA, 0xD0, + 0x0E, 0x9E, 0x54, 0x60, 0xC6, 0x9B, 0x11, 0x16, 0x7B, 0xDB, 0xFE, 0x77, + 0xD8, 0x66, 0x75, 0xB5, 0x75, 0xDB, 0xDE, 0x35, 0xB1, 0xE3, 0x91, 0xBB, + 0xA2, 0x00, 0x8C, 0x0F, 0xE3, 0xFA, 0x95, 0x8D, 0x24, 0xD9, 0x39, 0xE4, + 0xDA, 0x03, 0x72, 0xDE, 0x77, 0x8A, 0xD9, 0xDB, 0x5D, 0xD2, 0x82, 0x66, + 0x54, 0x83, 0x21, 0x82, 0xE6, 0x1F, 0xBB, 0x4B, 0x2F, 0xF9, 0x1C, 0xD8, + 0x32, 0xC2, 0xEF, 0x9E, 0xEC, 0x1C, 0x8E, 0xE1, 0x64, 0x15, 0xE3, 0x49, + 0xA5, 0xE6, 0x87, 0x60, 0xF1, 0x13, 0x50, 0xBC, 0x29, 0x78, 0xA3, 0x3F, + 0x66, 0x7B, 0x0C, 0x7A, 0x31, 0x82, 0xE9, 0xEB, 0xFF, 0x29, 0x81, 0xFB, + 0x9C, 0x92, 0xA4, 0x1D, 0xB3, 0x5C, 0xE3, 0x07, 0x15, 0xCD, 0x02, 0x71, + 0xCC, 0xFB, 0x8D, 0x92, 0x1B, 0x02, 0x0A, 0xC2, 0xBB, 0x79, 0x44, 0xA0, + 0x36, 0x21, 0xEE, 0x29, 0x9F, 0x76, 0x41, 0x16, 0xE9, 0x78, 0xD9, 0xE7, + 0x1B, 0x1E, 0x1B, 0x25, 0xF2, 0xB5, 0x40, 0xD6, 0x41, 0x25, 0xE5, 0x93, + 0xDB, 0x4D, 0x87, 0xA3, 0x89, 0x38, 0xDD, 0x6F, 0xD8, 0x55, 0x07, 0x87, + 0x3C, 0xC0, 0xA1, 0xB1, 0xCB, 0x78, 0xC5, 0x65, 0x8C, 0x4C, 0x50, 0x77, + 0x72, 0x1E, 0xDF, 0xD6, 0x83, 0xEE, 0x90, 0x4A, 0xC5, 0xC0, 0x64, 0x81, + 0x30, 0x2F, 0xB8, 0x41, 0x21, 0x29, 0x0E, 0x95, 0x97, 0x89, 0xCD, 0x9F, + 0x20, 0x58, 0x38, 0x44, 0x60, 0x4B, 0x61, 0xCC, 0x82, 0xDA, 0xDF, 0x64, + 0x7B, 0x7E, 0xAF, 0xA8, 0x38, 0x8F, 0x74, 0x92, 0x08, 0x69, 0xE3, 0x6F, + 0x24, 0x39, 0x3D, 0x18, 0x18, 0x30, 0xF9, 0x32, 0xD8, 0x44, 0x0B, 0xF6, + 0x95, 0x0C, 0x5D, 0x25, 0x6D, 0x76, 0x48, 0x5E, 0xB4, 0x15, 0x59, 0x3F, + 0x04, 0x1D, 0x04, 0xE7, 0x9B, 0xED, 0x84, 0x4E, 0x1A, 0x15, 0x07, 0x62, + 0x78, 0x49, 0x74, 0x74, 0xC2, 0x25, 0xBA, 0xFF, 0x90, 0x8B, 0xD2, 0xFA, + 0x46, 0xE5, 0xE3, 0x2D, 0x47, 0x77, 0xB7, 0x50, 0x05, 0x48, 0x7B, 0xEE, + 0xDE, 0x55, 0x14, 0x0A, 0xFF, 0x1A, 0x3E, 0x76, 0x14, 0x3B, 0xBE, 0xE3, + 0xAA, 0x59, 0x68, 0xC5, 0x63, 0xFB, 0x7D, 0x36, 0x1B, 0x33, 0xAC, 0x1B, + 0xE0, 0xA5, 0x11, 0x2E, 0x08, 0xAD, 0x8C, 0x13, 0x17, 0x26, 0xFD, 0x0F, + 0xB3, 0xCF, 0xAA, 0x9E, 0x41, 0xDE, 0x53, 0xA4, 0xAC, 0x53, 0x49, 0x63, + 0x59, 0x8F, 0x4A, 0x74, 0x10, 0xC3, 0x19, 0xDE, 0x07, 0x60, 0x6D, 0x6C, + 0xFC, 0x3B, 0xE0, 0xCF, 0x0C, 0x04, 0x77, 0x4A, 0x4B, 0x06, 0x80, 0xC8, + 0x80, 0xC9, 0xBE, 0x86, 0x91, 0xCA, 0x4D, 0xF9, 0x48, 0xF7, 0xBC, 0x98, + 0xF2, 0xE4, 0x97, 0xFE, 0xCD, 0x78, 0x31, 0x80, 0x95, 0xE2, 0x31, 0x7A, + 0x65, 0x0D, 0x5C, 0x22, 0x1D, 0x3E, 0x17, 0x44, 0xEE, 0x0F, 0x7A, 0x9C, + 0x3A, 0xE6, 0x25, 0x75, 0x49, 0x9A, 0x40, 0x16, 0x7A, 0x7F, 0x23, 0x6A, + 0x3D, 0x42, 0xE2, 0xD6, 0x9D, 0x5D, 0xFE, 0xC4, 0xFF, 0x70, 0x0C, 0x25, + 0xF3, 0xC9, 0x16, 0x1C, 0xCB, 0xD5, 0x59, 0x6C, 0x0B, 0x05, 0x34, 0x20, + 0x1D, 0xFB, 0x9E, 0x00, 0x97, 0x9A, 0x7C, 0xB0, 0x32, 0xA8, 0xC0, 0xDB, + 0xEF, 0x3E, 0xDD, 0x50, 0x48, 0x77, 0xC1, 0x45, 0x44, 0x2F, 0x3C, 0xFC, + 0x8C, 0xF9, 0xF7, 0xDA, 0x5A, 0x73, 0xDB, 0x7C, 0x5D, 0x9E, 0x02, 0xB8, + 0x58, 0x15, 0x46, 0xD1, 0x4E, 0x13, 0x98, 0x0F, 0xDF, 0xC9, 0x33, 0xDF, + 0xC8, 0x44, 0x02, 0x50, 0xDB, 0x21, 0x60, 0x8D, 0xC8, 0x27, 0xEB, 0xE0, + 0x7A, 0x27, 0x04, 0xD3, 0x6C, 0x12, 0xC8, 0x61, 0x6B, 0x52, 0x13, 0x6A, + 0x34, 0xDE, 0x10, 0x32, 0xAD, 0x85, 0xAB, 0x01, 0x26, 0x50, 0x1F, 0xA9, + 0x75, 0x0E, 0x02, 0xC0, 0x1A, 0xFB, 0x41, 0x20, 0x25, 0x0F, 0x8E, 0xC3, + 0xD4, 0x89, 0xA3, 0xF5, 0x44, 0xD4, 0x9D, 0x84, 0x1C, 0xA7, 0x9C, 0x5B, + 0xE7, 0x44, 0xC4, 0xEA, 0x7E, 0x7F, 0x74, 0xE3, 0x56, 0x9D, 0xB8, 0xE6, + 0x95, 0x12, 0x5D, 0x5E, 0x49, 0x62, 0x37, 0x07, 0x42, 0x0D, 0xC6, 0xCE, + 0x63, 0xE8, 0x0A, 0x2A, 0x78, 0xAE, 0x99, 0xA7, 0x5B, 0x8D, 0x26, 0xA2, + 0x28, 0x0C, 0x99, 0x28, 0x68, 0x48, 0x82, 0xF6, 0x1D, 0x53, 0x5E, 0xCA, + 0x7D, 0xBA, 0xD1, 0x20, 0x0E, 0x14, 0xF6, 0x2D, 0x57, 0x8C, 0x9B, 0xAA, + 0x00, 0xC3, 0x4B, 0x22, 0x1F, 0xA7, 0xB3, 0x4A, 0x6A, 0xCD, 0x72, 0x31, + 0x63, 0x1A, 0x07, 0x12, 0xE6, 0xE7, 0x0D, 0x80, 0xA6, 0x92, 0x80, 0x04, + 0xA1, 0x75, 0x48, 0xA7, 0x6E, 0xD5, 0xFF, 0xC0, 0xB5, 0x74, 0x5F, 0xBE, + 0xEC, 0xF4, 0xC8, 0x4B, 0x85, 0x2F, 0xF9, 0xA0, 0x54, 0x78, 0x87, 0x28, + 0x56, 0x02, 0x00, 0xF0, 0x01, 0xAA, 0x91, 0xB8, 0x84, 0x5D, 0xBA, 0x29, + 0xC0, 0x4E, 0x17, 0x06, 0x83, 0x6F, 0x75, 0xD7, 0x26, 0xE9, 0x2F, 0x46, + 0xF2, 0x60, 0x4A, 0xDE, 0xDF, 0x9D, 0x03, 0xDC, 0x9D, 0x68, 0xD3, 0xA0, + 0x75, 0xA9, 0xD7, 0x4F, 0x9A, 0xE8, 0x0C, 0xC5, 0x82, 0x85, 0x2C, 0x27, + 0xE2, 0x2E, 0x3E, 0x4C, 0xC1, 0xDC, 0xD4, 0x14, 0xDA, 0x3B, 0xBE, 0x6F, + 0x01, 0xF6, 0xE3, 0x36, 0x78, 0xE9, 0xCC, 0xF1, 0xB6, 0xB4, 0x01, 0x0A, + 0xE2, 0xD2, 0xDB, 0xA1, 0xA5, 0x1D, 0x79, 0x0A, 0x97, 0x3C, 0xA2, 0x31, + 0xD1, 0x2A, 0x2D, 0x7B, 0xEF, 0xCC, 0x50, 0x20, 0x93, 0xFD, 0xE4, 0x51, + 0xC6, 0xE1, 0xD7, 0xD0, 0x4D, 0x50, 0xBB, 0x06, 0x80, 0x15, 0x35, 0x89, + 0x71, 0x9C, 0xFE, 0x93, 0xE9, 0x59, 0x34, 0x50, 0x33, 0x17, 0xFC, 0x0A, + 0x5D, 0x03, 0xD7, 0x13, 0xB4, 0xE0, 0x26, 0x58, 0x06, 0x08, 0x09, 0xCA, + 0xA4, 0x7E, 0xCB, 0xA5, 0xE6, 0x5A, 0x95, 0x59, 0x3D, 0x4B, 0x8E, 0xCE, + 0xC9, 0xF5, 0x09, 0x19, 0x86, 0x64, 0xF4, 0x3F, 0xF4, 0xB6, 0x9F, 0xF6, + 0x69, 0xE5, 0x3C, 0x38, 0xDB, 0xEF, 0xF1, 0xB2, 0xF4, 0xDF, 0xAF, 0xEC, + 0x21, 0xD1, 0xCA, 0xD2, 0xD2, 0x14, 0x72, 0x2F, 0xC9, 0x70, 0x68, 0x89, + 0x2B, 0x06, 0xB7, 0x5C, 0x74, 0xF5, 0x39, 0xDB, 0x52, 0x03, 0x46, 0x74, + 0x65, 0xF8, 0x18, 0xB1, 0x62, 0x96, 0xCA, 0xDF, 0x3D, 0xCA, 0xF7, 0x49, + 0x3C, 0x53, 0xDB, 0x4B, 0xD0, 0xA1, 0xCC, 0xA1, 0xA4, 0x38, 0x72, 0x9B, + 0x68, 0x0C, 0x2F, 0xDB, 0x0D, 0x0B, 0x57, 0x99, 0xB5, 0xCE, 0x70, 0x77, + 0x3C, 0x61, 0xC3, 0x3A, 0x74, 0x91, 0x36, 0x69, 0xDF, 0x20, 0x6A, 0x31, + 0xF4, 0xE3, 0x14, 0xEB, 0xCB, 0xE6, 0x82, 0x7A, 0x5A, 0x3A, 0xCA, 0xAC, + 0xB7, 0x6D, 0x75, 0x75, 0xF6, 0xF5, 0xF0, 0xF7, 0x06, 0xA4, 0x7F, 0xB0, + 0xEF, 0xA0, 0x87, 0x89, 0x9B, 0x6E, 0x92, 0x6E, 0xE2, 0x93, 0x34, 0x0B, + 0x2E, 0x55, 0x43, 0x8C, 0xED, 0xB5, 0x15, 0xD7, 0x65, 0xD7, 0x24, 0x98, + 0xA8, 0x68, 0x52, 0x2A, 0x3F, 0x35, 0x24, 0xBD, 0x27, 0xBF, 0x91, 0x26, + 0x1E, 0x30, 0xC4, 0xF9, 0x64, 0x2D, 0xE2, 0x67, 0x86, 0xD1, 0x4B, 0x05, + 0x27, 0x2F, 0x62, 0xFE, 0x30, 0x98, 0x50, 0xF9, 0x00, 0xC6, 0xF5, 0x64, + 0xCF, 0x98, 0xEC, 0x46, 0xF4, 0xC2, 0xA2, 0xF1, 0x0B, 0x7F, 0x9E, 0x8A, + 0xAF, 0x97, 0xC7, 0x4F, 0x07, 0x1F, 0x3B, 0xE7, 0x6C, 0x1D, 0x38, 0x63, + 0x2F, 0x10, 0x25, 0x5C, 0x80, 0x00, 0xA0, 0x25, 0xA1, 0x2F, 0x77, 0xBF, + 0xD5, 0x8F, 0x05, 0xF1, 0x3E, 0x91, 0x87, 0x84, 0xBE, 0x80, 0xB3, 0x13, + 0xF6, 0x1F, 0xFC, 0x9A, 0x0B, 0x8B, 0x82, 0xE7, 0xEE, 0x36, 0x86, 0xC5, + 0xBC, 0x01, 0x3C, 0xA9, 0xF4, 0x9C, 0x0F, 0xFB, 0x67, 0x6A, 0x75, 0x97, + 0xC1, 0x9E, 0xC2, 0x43, 0x99, 0x2A, 0xD9, 0xB8, 0xDF, 0xF8, 0xF8, 0xA5, + 0xE3, 0x30, 0x4B, 0x1F, 0x03, 0x9A, 0x3F, 0x3E, 0x4D, 0x37, 0xF8, 0x9B, + 0xB6, 0x7F, 0xFF, 0x2A, 0xE8, 0x91, 0xA6, 0x23, 0x51, 0xA3, 0xCA, 0xCE, + 0x16, 0x75, 0x27, 0xE1, 0x6F, 0xA8, 0xF9, 0xBD, 0xA7, 0x14, 0x11, 0x06, + 0x7C, 0xD4, 0x1C, 0xF9, 0x3A, 0x47, 0x7A, 0xD0, 0xFA, 0x52, 0xF1, 0xE2, + 0xB8, 0x47, 0xBA, 0xAA, 0x52, 0xF4, 0x15, 0x7E, 0x81, 0xD5, 0x9D, 0x38, + 0xB8, 0x71, 0xED, 0x63, 0x3B, 0x74, 0x81, 0x4E, 0x91, 0x51, 0xE8, 0xC0, + 0x72, 0x1E, 0x76, 0x93, 0xF5, 0xC1, 0xC1, 0x31, 0xD7, 0x52, 0x3F, 0x07, + 0x24, 0x5C, 0xF2, 0xC8, 0x46, 0x27, 0x91, 0xB3, 0xA4, 0xEC, 0x2A, 0x09, + 0x1E, 0x21, 0x47, 0x7F, 0xC1, 0xD8, 0x46, 0x87, 0xE6, 0x3A, 0x5C, 0x58, + 0x5A, 0xBF, 0x31, 0x1A, 0x3E, 0x07, 0x9B, 0xE4, 0x21, 0x17, 0xB6, 0xAE, + 0xA2, 0x25, 0x32, 0x98, 0xFF, 0x18, 0xFA, 0xD1, 0xD3, 0xC1, 0xAC, 0x36, + 0x83, 0xCA, 0xF8, 0xAF, 0xD6, 0x35, 0xD8, 0x09, 0x20, 0x25, 0x0C, 0x87, + 0xB4, 0x47, 0xA6, 0xD9, 0xD0, 0xEF, 0x98, 0xF3, 0x8D, 0x36, 0xA8, 0xFF, + 0xEB, 0x52, 0x72, 0x8B, 0x78, 0xAE, 0xFF, 0x25, 0xC1, 0xB1, 0xDE, 0x55, + 0xF0, 0x0D, 0xA5, 0x0F, 0x9C, 0x73, 0x38, 0xE1, 0x2D, 0x24, 0x5F, 0x88, + 0xB3, 0x85, 0x9F, 0x2C, 0xF7, 0xDC, 0x72, 0x58, 0x13, 0x53, 0x5A, 0x76, + 0xF4, 0x29, 0xE5, 0xD2, 0x76, 0xC8, 0x10, 0x5D, 0xBE, 0x65, 0x7F, 0x80, + 0xBC, 0x40, 0x49, 0x68, 0x5A, 0x4D, 0x04, 0xB7, 0xBA, 0xB6, 0x76, 0x80, + 0x3D, 0xBC, 0xBC, 0xC6, 0x35, 0xFF, 0xB7, 0xFD, 0x97, 0xFC, 0x29, 0x89, + 0x05, 0xF2, 0x50, 0xF9, 0x47, 0xAD, 0x8F, 0xA4, 0x33, 0xD9, 0xD0, 0xBA, + 0x5E, 0xE7, 0xC7, 0x1F, 0xC2, 0xFB, 0xB7, 0x27, 0x62, 0xF9, 0x84, 0xC6, + 0x7E, 0x5C, 0x00, 0x00, 0x4A, 0x36, 0xC1, 0x2C, 0xD1, 0xAA, 0xD6, 0x44, + 0xBF, 0x6A, 0x11, 0x86, 0x01, 0x23, 0x9F, 0x6F, 0x69, 0xB9, 0x1E, 0xFC, + 0xD8, 0x04, 0x38, 0x76, 0x37, 0xCA, 0x26, 0x0E, 0x41, 0x11, 0x5D, 0xCD, + 0xAF, 0x2A, 0xEF, 0x9E, 0x53, 0x46, 0x81, 0x87, 0xA5, 0x38, 0x86, 0x1B, + 0xBB, 0x48, 0xB3, 0x6F, 0x84, 0xB4, 0xBE, 0x4C, 0x7E, 0x0D, 0x00, 0xDA, + 0x64, 0xC5, 0x2D, 0xB1, 0x92, 0x62, 0x47, 0x12, 0xB5, 0x8B, 0x52, 0x97, + 0x1A, 0x7F, 0x7B, 0x38, 0xAB, 0x28, 0x2C, 0xC0, 0xEB, 0x72, 0xFE, 0x86, + 0xC0, 0x88, 0x23, 0xAD, 0x71, 0x5C, 0x2C, 0x9B, 0x59, 0x58, 0xD4, 0x39, + 0x51, 0x9D, 0xD9, 0x23, 0x35, 0x0F, 0x4B, 0x11, 0x76, 0xC7, 0x7B, 0x4A, + 0x55, 0x57, 0x29, 0xB0, 0x45, 0xF9, 0x12, 0xA3, 0x1E, 0x2B, 0x7C, 0x86, + 0x6F, 0xD9, 0xA4, 0xA8, 0x4C, 0x43, 0xFB, 0x8C, 0x45, 0xEA, 0x19, 0xDF, + 0x81, 0x65, 0x98, 0x8F, 0xB8, 0xC6, 0x7B, 0xAA, 0x42, 0xAC, 0xC4, 0x84, + 0xA5, 0xDA, 0xDA, 0xA0, 0x36, 0x1E, 0xFE, 0x44, 0xF4, 0x02, 0x78, 0xD2, + 0xAF, 0x58, 0x60, 0x41, 0x6A, 0x8B, 0xA3, 0xB1, 0xD3, 0xBA, 0x2C, 0x08, + 0x9B, 0xA4, 0x19, 0x7B, 0xCC, 0x2A, 0x25, 0xF0, 0xFF, 0x8B, 0xA3, 0x88, + 0xC9, 0x50, 0xBF, 0xF6, 0xCE, 0x83, 0x30, 0x46, 0x66, 0xE2, 0x47, 0x1B, + 0xF1, 0x7F, 0xAD, 0xAA, 0x66, 0x5F, 0x94, 0x04, 0xA0, 0x5F, 0xCC, 0x5B, + 0xB0, 0x6B, 0xB5, 0x26, 0x6F, 0x56, 0x5E, 0x18, 0xE9, 0xB1, 0x68, 0xE3, + 0xEF, 0x7A, 0xBC, 0x44, 0xF0, 0x5C, 0xAB, 0x88, 0xA6, 0x07, 0xAF, 0xA3, + 0x86, 0xAF, 0x3B, 0xE9, 0x78, 0x96, 0x3B, 0xFB, 0xCD, 0x5A, 0xC9, 0xA9, + 0x20, 0xE4, 0x6D, 0x8E, 0x3E, 0xB6, 0x4D, 0x40, 0xD3, 0xDC, 0x4B, 0x8A, + 0xD4, 0xB7, 0x22, 0xC6, 0x2C, 0xE2, 0xB7, 0x9F, 0x43, 0x15, 0x8D, 0x07, + 0xA5, 0x27, 0x9E, 0xA3, 0xA2, 0xF7, 0x59, 0x00, 0xDD, 0xD8, 0xC1, 0x18, + 0xE9, 0x1E, 0x4F, 0x8C, 0x7B, 0xE0, 0xA6, 0x71, 0xA0, 0x6A, 0x25, 0x67, + 0x1B, 0x4F, 0x02, 0xE2, 0xA2, 0xED, 0xBE, 0x01, 0x48, 0x56, 0x2C, 0x4C, + 0xDA, 0x43, 0x9F, 0x54, 0x38, 0xB3, 0x93, 0xCF, 0x08, 0x42, 0xF3, 0x13, + 0x01, 0x41, 0x6E, 0xEE, 0xA0, 0x70, 0x0F, 0x1D, 0x64, 0x44, 0xA8, 0xD4, + 0x0B, 0x9C, 0x95, 0x08, 0xA1, 0xE9, 0x04, 0x94, 0x2B, 0x25, 0x23, 0x6B, + 0x59, 0xF0, 0x7D, 0x45, 0x28, 0x00, 0x15, 0x6F, 0x93, 0xA7, 0xAC, 0x30, + 0xC5, 0x8F, 0xEF, 0x2D, 0xFA, 0xBA, 0x86, 0x06, 0xA1, 0x51, 0x4D, 0x1B, + 0xDE, 0x8E, 0x75, 0xD4, 0x9E, 0x03, 0x8E, 0xB2, 0x10, 0x77, 0x84, 0x9F, + 0x7A, 0x52, 0xCA, 0x72, 0x7A, 0x33, 0x16, 0xCA, 0x57, 0x6C, 0xB3, 0xA2, + 0x7A, 0xE1, 0x44, 0x95, 0x4C, 0xC6, 0x64, 0x3F, 0xAB, 0x67, 0x06, 0xBE, + 0xBF, 0xF9, 0x16, 0xF6, 0x0F, 0xF6, 0xC4, 0xA0, 0x38, 0xAE, 0xAD, 0x7B, + 0xBC, 0xA9, 0x0F, 0xE7, 0xD5, 0xB1, 0xC6, 0x22, 0x6F, 0x9E, 0x2C, 0xE4, + 0x7B, 0x14, 0x7F, 0x70, 0xAF, 0x24, 0x55, 0x57, 0x9F, 0x9D, 0xE7, 0x6E, + 0x4B, 0x63, 0xCD, 0xAB, 0x06, 0x5F, 0x48, 0x92, 0x18, 0x2A, 0x2E, 0xAB, + 0xDB, 0x3E, 0x6A, 0xC4, 0xA3, 0x72, 0x7C, 0x5F, 0xA8, 0x40, 0xCA, 0x2B, + 0xF8, 0xB9, 0xD5, 0x44, 0x7E, 0xEC, 0x64, 0x7C, 0x2D, 0x6C, 0x23, 0x64, + 0x32, 0x49, 0x8F, 0xDF, 0xAE, 0x5C, 0xCD, 0x53, 0x1E, 0x6D, 0xB9, 0xCA, + 0x95, 0xA4, 0xB5, 0x21, 0x84, 0x02, 0xDE, 0x85, 0xC0, 0x7B, 0xA1, 0x8B, + 0x48, 0xC4, 0xCD, 0xD1, 0xCF, 0xA8, 0xAD, 0x9A, 0xD4, 0x74, 0x54, 0xEB, + 0xFF, 0x61, 0xE3, 0x78, 0xD4, 0xEA, 0x6A, 0xF2, 0xBC, 0xFF, 0x15, 0x86, + 0x46, 0x43, 0x4F, 0x8B, 0x02, 0x1F, 0x0B, 0x38, 0x4A, 0x69, 0x8F, 0xF3, + 0xAA, 0xFB, 0xDD, 0x65, 0xED, 0xBF, 0xC4, 0x2B, 0xD2, 0x48, 0xC7, 0x4F, + 0x81, 0x15, 0x9E, 0x89, 0x46, 0x89, 0xF3, 0xB7, 0xDF, 0x00, 0xB5, 0xFA, + 0x8A, 0xFA, 0xEB, 0x62, 0xC2, 0xED, 0x9E, 0x30, 0xE0, 0xE2, 0xFC, 0x42, + 0x43, 0xA4, 0x23, 0x4A, 0xE7, 0x1E, 0x71, 0x58, 0xD4, 0xED, 0x07, 0xA1, + 0xF5, 0x65, 0x61, 0x69, 0x8E, 0x2A, 0x9C, 0x07, 0x46, 0x87, 0x22, 0x65, + 0x59, 0xF7, 0xA7, 0x9E, 0x30, 0x67, 0xD6, 0x89, 0x62, 0x43, 0xEE, 0xDC, + 0x91, 0xE3, 0x54, 0xEC, 0x81, 0x15, 0xD3, 0x6A, 0x74, 0x5D, 0x86, 0xFD, + 0x1B, 0x18, 0xBD, 0xD2, 0xF9, 0x92, 0x75, 0xDE, 0xAC, 0xA4, 0x5E, 0x30, + 0x5F, 0xBF, 0x16, 0x0A, 0xB7, 0xC8, 0x13, 0x32, 0xB6, 0xB2, 0x1F, 0x69, + 0x68, 0x10, 0x0B, 0xB7, 0xCD, 0xBD, 0x20, 0x2D, 0xAC, 0x62, 0x0F, 0x1E, + 0xF0, 0xB5, 0x22, 0x45, 0x34, 0x27, 0x27, 0x67, 0x2B, 0x50, 0x00, 0x0F, + 0xA0, 0xCF, 0x5C, 0x3B, 0xA2, 0x08, 0xB4, 0x7F, 0xD1, 0x21, 0xF9, 0xE8, + 0xAE, 0xDF, 0x7A, 0x87, 0x0A, 0xFD, 0xD1, 0x71, 0xBE, 0xD0, 0x61, 0x66, + 0xFD, 0xB1, 0xCA, 0x0F, 0x6E, 0x2A, 0x36, 0xF5, 0xBF, 0x3B, 0x72, 0xC6, + 0xB5, 0x59, 0xA8, 0x88, 0x63, 0x3A, 0x06, 0x9C, 0xF2, 0x84, 0x8A, 0xAE, + 0xD6, 0xA4, 0xBF, 0xFD, 0xDD, 0x78, 0xF7, 0x29, 0x13, 0x61, 0x6B, 0x15, + 0xAF, 0x90, 0x39, 0x14, 0x6B, 0xBC, 0xBE, 0xE5, 0x1B, 0xD5, 0x59, 0xDC, + 0x08, 0xCA, 0xEC, 0x8D, 0x8E, 0x32, 0x8D, 0x74, 0x98, 0xF8, 0x93, 0x3A, + 0x7F, 0xAE, 0xA4, 0x30, 0x16, 0x76, 0xD5, 0x8E, 0x0D, 0xA1, 0x0B, 0xB4, + 0xF2, 0x8C, 0xF8, 0x16, 0x26, 0xF9, 0x96, 0x14, 0x8B, 0x89, 0x2F, 0x9E, + 0x9F, 0x55, 0xFD, 0xFF, 0xC5, 0x40, 0xCE, 0x72, 0x8A, 0x4C, 0x2A, 0x72, + 0xA8, 0xA3, 0xBA, 0xB7, 0x93, 0xDD, 0x04, 0x31, 0x72, 0x04, 0x56, 0x79, + 0x1A, 0xE1, 0x6E, 0xB6, 0x14, 0xAF, 0xE4, 0xB0, 0x97, 0x44, 0x6B, 0x9E, + 0xD6, 0x7C, 0xD9, 0x46, 0x70, 0xB7, 0x7A, 0x00, 0x00, 0x60, 0xD2, 0x51, + 0x92, 0x49, 0xD3, 0xFB, 0xB5, 0x40, 0x36, 0xE8, 0xE3, 0xA0, 0xA3, 0x2C, + 0xB3, 0xB7, 0x98, 0x3F, 0xD9, 0x38, 0x32, 0x00, 0x09, 0x5A, 0x5F, 0x69, + 0x7B, 0xD5, 0x38, 0x21, 0xB9, 0x99, 0xEB, 0xB6, 0x1E, 0xBC, 0x54, 0x51, + 0x0C, 0x6A, 0x03, 0x15, 0xC8, 0x09, 0xAE, 0xF2, 0x30, 0xB8, 0x9F, 0x23, + 0x11, 0xEF, 0x38, 0xEC, 0x3C, 0x1F, 0x3F, 0xC5, 0xAF, 0x09, 0x4B, 0xBD, + 0x60, 0xE4, 0xCD, 0x8F, 0x7F, 0x5C, 0x93, 0xF4, 0x39, 0x7D, 0x63, 0xB1, + 0x44, 0x16, 0x3F, 0x48, 0xB5, 0xE7, 0x3E, 0x23, 0xD1, 0x09, 0x08, 0x95, + 0x5B, 0x26, 0x1D, 0xD8, 0x02, 0x03, 0x7A, 0x66, 0xA9, 0x6C, 0x8F, 0xA0, + 0xC7, 0x08, 0xF7, 0xD5, 0x4C, 0x98, 0xA3, 0xA5, 0x77, 0x4F, 0x8C, 0xB5, + 0x95, 0x2E, 0x38, 0x01, 0x60, 0x13, 0x39, 0xFE, 0x14, 0x98, 0x50, 0x8F, + 0xB0, 0xA6, 0x69, 0xA6, 0xF6, 0xDA, 0x45, 0x36, 0x89, 0xA9, 0x1A, 0xF9, + 0x75, 0xD4, 0x95, 0x2F, 0xD2, 0x2C, 0x21, 0x52, 0xC3, 0xEB, 0x4D, 0xFC, + 0x51, 0xA6, 0x6A, 0xD9, 0x5C, 0xC5, 0x8A, 0x45, 0x8E, 0x9D, 0x84, 0xB9, + 0xD3, 0xC0, 0xC2, 0x84, 0xA8, 0x27, 0x76, 0x15, 0x59, 0x03, 0x69, 0x40, + 0x2F, 0xDF, 0x67, 0x32, 0x46, 0xD6, 0x36, 0x8C, 0x00, 0x34, 0x08, 0xE0, + 0x3F, 0x2A, 0x3F, 0xE7, 0x50, 0xF0, 0xDB, 0xFC, 0x4D, 0x44, 0xF2, 0x37, + 0x44, 0xB4, 0x45, 0xEF, 0x95, 0x1E, 0x71, 0xFF, 0xA3, 0x6D, 0x4A, 0x2D, + 0x2D, 0xD3, 0x87, 0xFE, 0x30, 0xF1, 0xC5, 0xBB, 0xDC, 0x76, 0x16, 0x5D, + 0xA0, 0xF2, 0x33, 0x41, 0x57, 0x3A, 0x1D, 0xE6, 0x73, 0x00, 0x00, 0xF4, + 0xF8, 0x24, 0x30, 0x9E, 0x0E, 0xF9, 0x90, 0x0D, 0x4E, 0x10, 0x63, 0x55, + 0x89, 0x05, 0x65, 0x3D, 0x3E, 0x66, 0x23, 0x22, 0xC7, 0x88, 0xF6, 0xDE, + 0x77, 0xA7, 0x2B, 0x48, 0x74, 0x40, 0x7A, 0xA1, 0x98, 0x8C, 0xA2, 0x80, + 0x64, 0x8C, 0x57, 0x28, 0x79, 0x31, 0x8A, 0x0A, 0x12, 0xC9, 0x1B, 0xA9, + 0x2C, 0xE4, 0x46, 0xA7, 0x4A, 0xB0, 0xEE, 0xD7, 0x05, 0xB5, 0x70, 0x41, + 0xF0, 0x90, 0xB7, 0xB1, 0x1F, 0xD7, 0x74, 0x13, 0x02, 0x27, 0x58, 0xE3, + 0x7F, 0xDD, 0xB2, 0x13, 0xFB, 0xB9, 0xBD, 0x7F, 0xA4, 0x2A, 0x33, 0x26, + 0xB8, 0xAB, 0xCF, 0x33, 0xBB, 0x69, 0x2F, 0x18, 0xBC, 0x3F, 0x4D, 0x62, + 0x96, 0xAB, 0x9F, 0xF9, 0x8F, 0xBC, 0x53, 0xF9, 0x3A, 0xA5, 0xE0, 0xBD, + 0xD2, 0x5B, 0x25, 0x47, 0x6D, 0x70, 0x42, 0x02, 0x06, 0xC4, 0x3A, 0xA8, + 0xF1, 0xCF, 0xD2, 0x24, 0xD9, 0xA6, 0x1F, 0x7A, 0xFB, 0x36, 0xB9, 0xA7, + 0x90, 0x2A, 0xAC, 0x64, 0xC5, 0x45, 0xBE, 0xAC, 0xCF, 0x05, 0xDA, 0x22, + 0x00, 0xAA, 0xA4, 0xCE, 0x06, 0x3B, 0x06, 0x5A, 0x4F, 0xEC, 0x8A, 0xE5, + 0x6D, 0x70, 0x0F, 0x8F, 0x3D, 0xC6, 0xEE, 0x7E, 0x7F, 0x9B, 0xC7, 0xD5, + 0xB3, 0x65, 0x9A, 0x4C, 0x3E, 0x69, 0xBE, 0x81, 0x94, 0x07, 0xA1, 0x52, + 0x68, 0x03, 0x07, 0x78, 0x5C, 0x52, 0xED, 0xC9, 0xEB, 0x9F, 0x68, 0x2D, + 0x88, 0xB2, 0xBD, 0x79, 0xA8, 0xE5, 0x19, 0xAF, 0x06, 0x63, 0x42, 0xDF, + 0xAD, 0xA0, 0x36, 0xDF, 0x0F, 0xAE, 0x2C, 0x0C, 0x9A, 0x87, 0xA3, 0xAD, + 0x92, 0x98, 0xC2, 0xE0, 0x16, 0x7D, 0x80, 0xCF, 0xDE, 0xE2, 0x57, 0xEC, + 0x86, 0x3C, 0x2C, 0x3A, 0x7D, 0x27, 0xFA, 0x3F, 0xBB, 0x2E, 0x74, 0xD9, + 0x00, 0x41, 0x6D, 0xDC, 0xE5, 0x64, 0x6C, 0xEE, 0x53, 0xEB, 0x6E, 0xDD, + 0xF2, 0xCE, 0xFD, 0x53, 0x11, 0xBA, 0x3F, 0x22, 0x71, 0x32, 0x2B, 0x10, + 0x28, 0xFA, 0xD5, 0x2D, 0xF7, 0x77, 0xC9, 0x68, 0x6D, 0xC8, 0x83, 0x98, + 0xFB, 0x13, 0x99, 0x2B, 0x20, 0x04, 0xC4, 0xE5, 0x98, 0x1D, 0x72, 0x35, + 0xF9, 0x7B, 0xF0, 0x40, 0xC8, 0xCC, 0x77, 0x68, 0x9F, 0x9E, 0x92, 0xFC, + 0xF1, 0xF9, 0x24, 0xD2, 0x73, 0x42, 0xAF, 0x30, 0x30, 0x0F, 0x07, 0x5A, + 0x56, 0xE0, 0xD7, 0x22, 0x3E, 0xD8, 0x50, 0xDB, 0xD8, 0x1D, 0x03, 0xAD, + 0x7D, 0x6A, 0x6E, 0x40, 0xE1, 0xA2, 0x1A, 0x4C, 0x6B, 0x3E, 0xF2, 0x0C, + 0xA7, 0x9A, 0x86, 0x4D, 0x75, 0x5B, 0x2F, 0x2B, 0xA1, 0x40, 0x9D, 0x20, + 0xD4, 0xD9, 0x77, 0xD9, 0xAF, 0xDA, 0x63, 0xF7, 0x88, 0xAF, 0x7B, 0xBE, + 0x3E, 0x01, 0x5B, 0x42, 0xA9, 0x97, 0xC3, 0x99, 0x36, 0x7A, 0xE0, 0x5F, + 0x3C, 0x2C, 0x07, 0x73, 0x59, 0x15, 0xA9, 0xF6, 0x1C, 0x04, 0x50, 0xF3, + 0x30, 0x30, 0x27, 0x36, 0xA6, 0xFE, 0x6C, 0x32, 0x43, 0x2E, 0x4D, 0x03, + 0xA1, 0x9D, 0x15, 0x2F, 0xC5, 0xD9, 0x9C, 0x4A, 0x38, 0x1F, 0x22, 0x6E, + 0xB1, 0x2A, 0x3C, 0x83, 0xBD, 0x9A, 0x2B, 0xC2, 0x25, 0x9A, 0x72, 0x70, + 0x89, 0x89, 0x6A, 0xF8, 0x97, 0xA7, 0x42, 0x5E, 0x01, 0x1B, 0x52, 0x0F, + 0x8A, 0x25, 0xEB, 0x99, 0xF6, 0xF9, 0xF2, 0xB6, 0x26, 0xCF, 0xA6, 0x61, + 0xA0, 0x1C, 0x37, 0x04, 0x1A, 0x0C, 0x06, 0xB8, 0x47, 0x36, 0x9E, 0xEF, + 0x72, 0xBA, 0x92, 0x9C, 0x06, 0xD6, 0x75, 0x6F, 0xC6, 0x86, 0xDA, 0xA7, + 0xBF, 0x7E, 0xFD, 0xEE, 0x5E, 0x1C, 0x7D, 0x72, 0x11, 0xFD, 0x05, 0x9A, + 0x76, 0x77, 0x77, 0x93, 0xF0, 0x00, 0x01, 0xB2, 0x44, 0x02, 0x50, 0x5A, + 0x3F, 0x23, 0x0E, 0x97, 0x4D, 0x9C, 0x96, 0x74, 0x52, 0xA4, 0x98, 0x83, + 0x1C, 0x1A, 0x80, 0x69, 0xDE, 0x9B, 0xF0, 0x4F, 0xEF, 0x23, 0x3D, 0x56, + 0xA9, 0x88, 0xBC, 0xB1, 0x64, 0x20, 0x78, 0x89, 0xC1, 0xB2, 0x3F, 0x8A, + 0x4D, 0x32, 0x8E, 0x5C, 0xE0, 0x29, 0xF0, 0xCF, 0xEC, 0x39, 0x3A, 0xE2, + 0x82, 0x96, 0xEA, 0x38, 0x40, 0x19, 0x88, 0x78, 0xE5, 0xB9, 0x18, 0x7A, + 0x98, 0x63, 0x18, 0x29, 0xCF, 0x17, 0xA7, 0x57, 0xD0, 0x50, 0xFA, 0xB3, + 0x59, 0x80, 0x60, 0x9D, 0x14, 0x43, 0x67, 0x2F, 0x1E, 0xDD, 0x3B, 0x83, + 0xC1, 0x53, 0xE7, 0x27, 0xDE, 0xFB, 0xF1, 0xE2, 0x35, 0xE8, 0x04, 0x53, + 0xC6, 0x2B, 0xCC, 0x8C, 0x2A, 0xFE, 0x6F, 0x59, 0x3D, 0xD2, 0x8A, 0x07, + 0xCA, 0x76, 0x84, 0x08, 0xE1, 0xEC, 0xBD, 0x8B, 0xFD, 0x96, 0xA8, 0x24, + 0xFB, 0x96, 0xB0, 0xB4, 0x0C, 0x74, 0x60, 0x12, 0x56, 0x83, 0x0C, 0xC2, + 0xB9, 0x4F, 0x6D, 0xB7, 0x2D, 0x68, 0x6B, 0x21, 0xF1, 0x9D, 0xEF, 0x69, + 0x4B, 0xA1, 0x81, 0x89, 0x41, 0x51, 0xE4, 0x68, 0x29, 0xBC, 0x1A, 0x06, + 0xA0, 0xF6, 0xCB, 0xD8, 0x82, 0xFE, 0x6C, 0xE0, 0xF4, 0x69, 0x15, 0xF8, + 0xD8, 0x54, 0x00, 0xA9, 0xAD, 0x2D, 0xDC, 0xF4, 0x97, 0xF1, 0x36, 0xEA, + 0xD1, 0x22, 0x88, 0x8D, 0x04, 0x16, 0x8C, 0x48, 0xBD, 0x5F, 0xEE, 0x60, + 0x3C, 0x37, 0x6E, 0x42, 0x92, 0x05, 0x09, 0x71, 0x00, 0x14, 0xDB, 0x2F, + 0x73, 0xBE, 0x12, 0xDA, 0x89, 0x12, 0x0F, 0x2F, 0x6C, 0xB7, 0xE2, 0x64, + 0xCF, 0x3E, 0x69, 0x95, 0x9E, 0x87, 0xC9, 0xA9, 0x67, 0x0D, 0x4F, 0x04, + 0x5B, 0x16, 0x3A, 0xB4, 0x75, 0x7A, 0x3F, 0x17, 0x5C, 0x17, 0xF5, 0xF1, + 0x5A, 0x17, 0xFE, 0x85, 0x5F, 0x0C, 0x7C, 0x79, 0x3E, 0x6E, 0x24, 0x89, + 0xB6, 0x56, 0x74, 0x51, 0x45, 0xFE, 0x54, 0x39, 0x62, 0x91, 0xE6, 0x98, + 0x88, 0xB2, 0x55, 0x20, 0x7B, 0x14, 0x4B, 0x11, 0xB9, 0xD4, 0xF0, 0xC0, + 0x69, 0x4F, 0x88, 0xCF, 0x43, 0x4F, 0xBB, 0xCC, 0x60, 0x3C, 0x8D, 0xF0, + 0x7B, 0x37, 0x7F, 0x39, 0xE7, 0x15, 0x72, 0x65, 0x2F, 0x24, 0xF5, 0x06, + 0x40, 0xF9, 0x1A, 0x92, 0xA2, 0x29, 0x17, 0xEF, 0xF8, 0xAC, 0xD9, 0x16, + 0x5A, 0x35, 0xB6, 0x15, 0xED, 0xB0, 0xAD, 0x35, 0x58, 0x12, 0xA8, 0x46, + 0x64, 0x22, 0xE9, 0xDC, 0x1C, 0xA7, 0x0D, 0xF2, 0x7D, 0x37, 0xCB, 0xEE, + 0x43, 0x6C, 0xAC, 0x2A, 0xE0, 0xF3, 0xE4, 0x88, 0x3F, 0x68, 0x0D, 0x1D, + 0x99, 0x60, 0xF5, 0x8A, 0xE3, 0x4F, 0x3E, 0x35, 0x74, 0xB7, 0x18, 0x3B, + 0x88, 0x31, 0x9C, 0x52, 0xC5, 0xE6, 0xD2, 0x9C, 0x5E, 0x32, 0x91, 0xA7, + 0x37, 0x24, 0xC1, 0x50, 0xE6, 0x00, 0xE6, 0xFC, 0xE8, 0xDF, 0x4B, 0x85, + 0xB8, 0xCC, 0x6F, 0xE7, 0x68, 0x2C, 0xDA, 0x62, 0x1B, 0xBE, 0xB6, 0x9A, + 0x9B, 0xE2, 0x5D, 0x71, 0xC0, 0x94, 0xAB, 0x94, 0xD7, 0x06, 0x78, 0xCF, + 0x0F, 0xB6, 0x5D, 0x15, 0xCE, 0xC8, 0xB7, 0x2D, 0xA9, 0x66, 0xF3, 0x9F, + 0x70, 0xCE, 0xA3, 0x13, 0x38, 0x40, 0x03, 0x85, 0x00, 0xA4, 0x25, 0x3E, + 0xA0, 0x10, 0x49, 0x9B, 0xAC, 0x23, 0x4A, 0x15, 0xF0, 0xFB, 0x82, 0x58, + 0x55, 0x00, 0x01, 0x0E, 0xB3, 0x93, 0x18, 0xC1, 0x65, 0x7E, 0x8C, 0xEA, + 0xCA, 0xB1, 0x64, 0x97, 0x58, 0x81, 0x1C, 0x2F, 0x4B, 0x38, 0x62, 0x1F, + 0xD2, 0x7C, 0x3B, 0x04, 0xCA, 0xDB, 0xC0, 0x45, 0xAB, 0xD6, 0x35, 0x11, + 0x61, 0xF1, 0x3F, 0x3F, 0x66, 0x89, 0x68, 0xDB, 0x7C, 0xA2, 0xA9, 0x45, + 0xBF, 0x25, 0xF5, 0x64, 0xBE, 0x44, 0x12, 0x45, 0x26, 0x5F, 0x3A, 0x0F, + 0x02, 0x20, 0xBD, 0x5E, 0xA8, 0x71, 0xD3, 0x49, 0xE7, 0xF7, 0x6D, 0x99, + 0xAD, 0x9A, 0xDB, 0x0C, 0x4A, 0x45, 0x2D, 0xAA, 0x09, 0x6F, 0xC4, 0x20, + 0x0A, 0xE8, 0xCA, 0xC4, 0x95, 0x6E, 0xF5, 0xED, 0x7F, 0xD8, 0x4A, 0x7B, + 0xC8, 0x00, 0x5E, 0xA6, 0x29, 0x11, 0xB8, 0xB1, 0xF5, 0xDA, 0xE9, 0xC3, + 0x8E, 0xA4, 0x42, 0xD6, 0xCC, 0x2D, 0x1F, 0x49, 0x44, 0x96, 0x4E, 0xAA, + 0xB8, 0x0E, 0x16, 0x1A, 0x94, 0x5B, 0xE2, 0x07, 0x34, 0x78, 0x1D, 0x0A, + 0xB0, 0xDB, 0x4A, 0x7F, 0x38, 0xA8, 0x85, 0xD7, 0x00, 0xF4, 0x4A, 0x89, + 0x8E, 0x19, 0xD0, 0x3D, 0x49, 0x0F, 0x07, 0x04, 0x71, 0x85, 0x34, 0xE0, + 0x55, 0xDD, 0xB5, 0xF1, 0x0F, 0xDB, 0xF3, 0x73, 0x23, 0xD1, 0x5D, 0xC3, + 0x75, 0x6C, 0x8A, 0x30, 0xCB, 0x38, 0x13, 0xA8, 0x2B, 0x44, 0x60, 0xB4, + 0x84, 0x80, 0xCB, 0x1D, 0x77, 0x3C, 0x58, 0xB1, 0x42, 0x5B, 0x23, 0x63, + 0x5A, 0x4D, 0xE7, 0xDE, 0x2D, 0x2C, 0x1A, 0x3C, 0x9A, 0x7F, 0x84, 0x8C, + 0x6D, 0x69, 0x3F, 0x22, 0xAE, 0x85, 0x81, 0xC6, 0x43, 0xC9, 0x4E, 0x20, + 0x8B, 0x47, 0xD4, 0x1D, 0x78, 0x82, 0x89, 0x47, 0x6B, 0x62, 0x9C, 0x80, + 0x4F, 0x62, 0x97, 0x21, 0x98, 0x0C, 0x82, 0x8D, 0xD1, 0x54, 0x6F, 0xD4, + 0x7C, 0xB0, 0x35, 0x96, 0x77, 0xA6, 0x81, 0xD6, 0xC6, 0x16, 0x83, 0xE4, + 0x13, 0x8D, 0xC8, 0xCD, 0x0A, 0x25, 0xEB, 0x9D, 0x2F, 0xB2, 0x02, 0x40, + 0x28, 0x73, 0x40, 0xBB, 0x43, 0x1D, 0xBF, 0xE1, 0x7F, 0xFE, 0xB8, 0x69, + 0xF2, 0xC6, 0xDE, 0x2E, 0xA6, 0xC0, 0xA5, 0xF2, 0x0C, 0x2F, 0x4B, 0xD3, + 0xE1, 0x2F, 0x3D, 0x8A, 0x0C, 0xF9, 0x65, 0xE6, 0xFF, 0x85, 0xFF, 0x37, + 0x64, 0x75, 0xE0, 0x2C, 0x42, 0x6D, 0xDA, 0xC9, 0x9D, 0x79, 0xD1, 0x18, + 0x62, 0xAE, 0x75, 0x1A, 0x91, 0x63, 0x51, 0xAB, 0x2C, 0x37, 0x42, 0x38, + 0x33, 0xD1, 0xC8, 0x0B, 0x9A, 0x5D, 0x52, 0xF0, 0x44, 0x82, 0x04, 0x32, + 0x8E, 0x40, 0xE9, 0x00, 0xEF, 0xA3, 0x2A, 0x0E, 0x1D, 0x7B, 0xEB, 0x73, + 0x13, 0xC0, 0x55, 0x0C, 0x14, 0x1C, 0xC2, 0x91, 0x91, 0x31, 0xF6, 0x64, + 0x77, 0x1E, 0x1A, 0xF9, 0x37, 0xCA, 0x0A, 0xEF, 0x0A, 0x5D, 0x58, 0xCD, + 0x4E, 0x60, 0x88, 0x7F, 0x0C, 0xF9, 0x8E, 0x35, 0x12, 0x9C, 0x5B, 0xE3, + 0xFC, 0xD3, 0x00, 0x52, 0x76, 0x97, 0xF8, 0x8A, 0x58, 0x5E, 0xAE, 0xDB, + 0x1D, 0x8F, 0xD7, 0x31, 0xFB, 0x7E, 0x6A, 0x40, 0x3B, 0x8B, 0x4F, 0xD4, + 0xC7, 0x41, 0xB1, 0xB5, 0xCC, 0x06, 0x7D, 0xC6, 0x64, 0x29, 0xBD, 0x85, + 0x10, 0x48, 0x7D, 0x6F, 0x1A, 0x61, 0x25, 0xAF, 0x7B, 0x7F, 0x95, 0x24, + 0xD3, 0x5F, 0x0F, 0x61, 0x30, 0x43, 0xA2, 0xD5, 0x46, 0xFE, 0xD5, 0x5C, + 0xA8, 0xD7, 0x30, 0xE5, 0x5B, 0x41, 0x8B, 0xB7, 0x32, 0xF4, 0x05, 0xF0, + 0xCD, 0xB1, 0x5B, 0x5D, 0x2F, 0x77, 0x10, 0xE6, 0xA6, 0xF3, 0xE5, 0x80, + 0x91, 0xB2, 0x3C, 0x50, 0xC9, 0x42, 0x27, 0x2B, 0x38, 0x67, 0x13, 0x71, + 0x6D, 0x8B, 0x5F, 0x47, 0x36, 0xE9, 0xCF, 0xC0, 0x8D, 0x92, 0x6C, 0x13, + 0xFC, 0x08, 0x00, 0xF5, 0xF5, 0x0B, 0x0F, 0x47, 0xB9, 0xE4, 0xF3, 0xED, + 0x2D, 0x1E, 0x6A, 0x14, 0x78, 0x51, 0xA2, 0x68, 0x3E, 0x39, 0x08, 0xC7, + 0x78, 0xFA, 0xBB, 0x3E, 0xAD, 0xBC, 0x7E, 0x7F, 0x8D, 0xBE, 0xA2, 0x26, + 0x86, 0xD4, 0x0D, 0x31, 0x85, 0xA5, 0x2B, 0xE6, 0xA6, 0x24, 0x5A, 0xF1, + 0x14, 0xB3, 0x45, 0x58, 0x3C, 0x21, 0xDF, 0x0B, 0x56, 0x9E, 0xB1, 0xEC, + 0xA9, 0xD9, 0x94, 0xDA, 0x75, 0xD6, 0xF2, 0x74, 0x0D, 0x58, 0xCC, 0xAC, + 0x38, 0x88, 0x3E, 0xB5, 0xEB, 0x82, 0x57, 0xAF, 0xA3, 0x5B, 0x54, 0x9A, + 0xA4, 0xC2, 0x2B, 0xCE, 0xFC, 0x5D, 0x78, 0x59, 0x3B, 0x9E, 0x05, 0xE8, + 0xCB, 0x2C, 0x8E, 0xEF, 0x11, 0x12, 0xF4, 0x87, 0x06, 0x64, 0x1E, 0x9A, + 0x4C, 0x51, 0xFA, 0xE5, 0xEE, 0x72, 0xEF, 0x31, 0x9C, 0x44, 0x28, 0x92, + 0xB5, 0x38, 0xC6, 0xA9, 0x40, 0x75, 0x51, 0x0E, 0x2D, 0xD6, 0x96, 0x1C, + 0x3C, 0x78, 0xC1, 0x9B, 0x79, 0xFB, 0xD2, 0x3D, 0x41, 0xB8, 0x59, 0x6B, + 0xA0, 0xC8, 0x27, 0xE6, 0x3F, 0xC7, 0xE4, 0x84, 0xD7, 0xF8, 0x3C, 0x36, + 0x0B, 0x3C, 0x85, 0x59, 0x75, 0xD2, 0xF3, 0x7C, 0x43, 0xDE, 0x74, 0xF5, + 0x65, 0xDE, 0x5E, 0x0B, 0xB1, 0x80, 0xEC, 0x86, 0xC0, 0xDA, 0x1E, 0x4F, + 0xF6, 0xD3, 0x55, 0x2D, 0xA9, 0x61, 0x9E, 0x0F, 0xBA, 0xCB, 0xC6, 0x03, + 0x15, 0x92, 0x9A, 0x40, 0x78, 0x3B, 0xDC, 0x14, 0x93, 0x08, 0x8D, 0xC0, + 0xBE, 0x54, 0x96, 0xEF, 0x45, 0x22, 0xD7, 0x31, 0xF0, 0x4B, 0x55, 0x82, + 0x06, 0x3B, 0x1F, 0x35, 0x1C, 0xD4, 0xC6, 0x55, 0x65, 0xB1, 0xC8, 0xAC, + 0x9E, 0x5E, 0xDA, 0x6B, 0x1F, 0x13, 0x58, 0x52, 0x64, 0xE0, 0x4B, 0xD0, + 0x4E, 0xFB, 0x90, 0xD2, 0xDF, 0x90, 0xF3, 0x0C, 0x89, 0x8D, 0xC1, 0xD6, + 0x4C, 0x26, 0xF9, 0xFF, 0x3F, 0xE5, 0xFF, 0x4F, 0x7B, 0x23, 0xC7, 0x9E, + 0x5E, 0x32, 0xD5, 0xCC, 0xCC, 0x30, 0xE4, 0x12, 0x86, 0xD5, 0x5A, 0x69, + 0x2C, 0x14, 0x4A, 0x9A, 0x79, 0x90, 0x24, 0x2A, 0x0D, 0x7B, 0xE1, 0x5C, + 0x7F, 0xD5, 0xD0, 0x9B, 0x59, 0xA0, 0xC1, 0xB5, 0x35, 0xDF, 0xE4, 0x3B, + 0x96, 0x45, 0xEA, 0x85, 0x56, 0xE3, 0xA0, 0x78, 0x66, 0xA2, 0xB4, 0x95, + 0xE8, 0x83, 0x4E, 0xA5, 0x34, 0xB0, 0xCA, 0x68, 0x1B, 0x8E, 0xEF, 0x99, + 0xD5, 0xD7, 0xDA, 0x02, 0x68, 0xEC, 0xB8, 0x8A, 0x78, 0x1A, 0x9F, 0x31, + 0xDD, 0x3E, 0xB0, 0xA7, 0x47, 0x4C, 0x61, 0x8B, 0x38, 0xFD, 0xFE, 0x8C, + 0x11, 0xE6, 0x4F, 0xDC, 0xD7, 0x26, 0xF0, 0x49, 0x64, 0x39, 0xE0, 0xA8, + 0xEF, 0x57, 0x5A, 0x6E, 0xA0, 0xEE, 0xAF, 0x3E, 0x51, 0x2B, 0x59, 0x08, + 0x8D, 0x62, 0x48, 0x9D, 0xCC, 0x0B, 0x70, 0x35, 0x85, 0xC0, 0xDB, 0x14, + 0xAD, 0x31, 0x8B, 0xCD, 0x15, 0xF5, 0x1B, 0x2F, 0xDA, 0x0D, 0xE8, 0xA8, + 0x8C, 0xCC, 0xD3, 0xF0, 0xEC, 0x21, 0xC7, 0xF7, 0x4B, 0xF3, 0xDF, 0x98, + 0x49, 0xBD, 0xE7, 0xCB, 0x43, 0x18, 0xF0, 0x39, 0xDE, 0xAE, 0xD6, 0x19, + 0x2A, 0x1A, 0x2E, 0x04, 0xA3, 0x94, 0x0C, 0x5B, 0xC4, 0x29, 0x06, 0x82, + 0xEA, 0xBE, 0xDB, 0x8B, 0x7F, 0xA5, 0xC9, 0x42, 0x14, 0x11, 0x06, 0x16, + 0x6B, 0xE8, 0xF3, 0xB8, 0x15, 0x5A, 0xAA, 0x3E, 0xF9, 0xF0, 0x5D, 0x68, + 0x19, 0xFF, 0xA9, 0xAF, 0xCB, 0x67, 0x83, 0x64, 0xB4, 0x93, 0x0A, 0xAE, + 0xFA, 0xCC, 0x2B, 0x19, 0xF7, 0x4B, 0xBE, 0x0A, 0x29, 0x14, 0xE2, 0xAA, + 0x82, 0x16, 0x15, 0x33, 0xDD, 0xB9, 0x1E, 0x10, 0x11, 0x5A, 0xCE, 0x29, + 0xCD, 0x2F, 0x2D, 0x9D, 0xAD, 0xF4, 0x24, 0xD4, 0xA0, 0x66, 0xBB, 0xB9, + 0x20, 0x87, 0x25, 0x7B, 0x90, 0x16, 0x47, 0xDF, 0x07, 0x1A, 0x43, 0xF9, + 0xC1, 0xC0, 0x73, 0xB8, 0x1F, 0x19, 0x69, 0x83, 0xF9, 0x03, 0x06, 0x88, + 0x87, 0x7F, 0x66, 0x67, 0x64, 0x14, 0x46, 0x65, 0xB7, 0x6E, 0x4F, 0x88, + 0x0E, 0xAB, 0x0A, 0x4F, 0xDB, 0x22, 0x4E, 0x9D, 0x03, 0x3D, 0x7E, 0xA1, + 0x5C, 0xE2, 0xBC, 0x6C, 0xC6, 0x46, 0x02, 0xB5, 0x65, 0xAA, 0x8C, 0x24, + 0x86, 0x9A, 0x88, 0x2C, 0x90, 0xAC, 0xB4, 0x72, 0xED, 0x98, 0xB1, 0xCD, + 0x99, 0x61, 0xE6, 0x0A, 0x55, 0x27, 0xF1, 0xF6, 0x80, 0xC3, 0xCD, 0xCF, + 0x44, 0xF8, 0x04, 0x69, 0x51, 0x42, 0xA8, 0x26, 0x98, 0x58, 0xD7, 0xB7, + 0x88, 0xB4, 0x41, 0x1A, 0x07, 0x8C, 0x7C, 0x96, 0x93, 0x08, 0xD1, 0x2B, + 0xA3, 0x9B, 0x09, 0x14, 0x2C, 0x2C, 0xB6, 0xD9, 0x40, 0x4F, 0x65, 0x45, + 0xF7, 0x6C, 0x94, 0x93, 0x3F, 0x34, 0xDC, 0x1E, 0xFD, 0xFC, 0xA2, 0x3E, + 0x1C, 0xEA, 0x41, 0x66, 0xB0, 0xF7, 0x77, 0x4B, 0xDF, 0x74, 0xD1, 0x54, + 0xA1, 0x7F, 0x2F, 0xF5, 0x44, 0x2F, 0xD2, 0xA9, 0x23, 0x9E, 0xF4, 0x70, + 0xE9, 0xC1, 0x27, 0xFE, 0x98, 0xDD, 0xF0, 0x08, 0x5A, 0x52, 0xCE, 0x10, + 0xC4, 0xE9, 0x4E, 0x47, 0x0A, 0xDB, 0x54, 0x36, 0xBD, 0x57, 0x71, 0x2D, + 0xF0, 0xA3, 0xD8, 0x84, 0xFE, 0x67, 0x3E, 0xE2, 0x4B, 0x20, 0xD0, 0xE3, + 0xF3, 0x8F, 0x58, 0xC7, 0x38, 0x8E, 0x8B, 0x8A, 0xD8, 0x96, 0x80, 0x26, + 0x80, 0x81, 0x64, 0x11, 0x11, 0x27, 0x17, 0xD3, 0xAD, 0x5B, 0xC2, 0xB3, + 0x32, 0xA4, 0xD3, 0xF4, 0x88, 0xFC, 0xF0, 0xE1, 0xB9, 0xBA, 0x86, 0x0B, + 0x0A, 0xB0, 0x9C, 0xD4, 0xCA, 0x29, 0x7D, 0x16, 0x91, 0xE2, 0x45, 0xCC, + 0xEE, 0x40, 0x02, 0xA6, 0xA7, 0x9F, 0xA8, 0x10, 0x79, 0xEF, 0xF7, 0xC2, + 0x3B, 0x2C, 0xFF, 0x92, 0xD8, 0x5D, 0x50, 0xE4, 0x1D, 0x61, 0x4B, 0x0D, + 0x5E, 0x1B, 0xD2, 0x39, 0x15, 0x7C, 0x91, 0x1C, 0xD3, 0x8C, 0x28, 0x95, + 0x3E, 0xBB, 0x79, 0x30, 0x3B, 0xD6, 0x1E, 0x39, 0x19, 0x8B, 0xB5, 0xD4, + 0x11, 0x39, 0xD1, 0x6D, 0xC9, 0x96, 0xD9, 0x8E, 0x09, 0xD7, 0x00, 0x17, + 0x45, 0x54, 0x93, 0xAC, 0xF8, 0x27, 0x0B, 0x1E, 0x6A, 0xBD, 0xEA, 0x25, + 0x1F, 0xD0, 0x77, 0x9C, 0xD4, 0x01, 0xC9, 0xB9, 0x66, 0x64, 0x25, 0x00, + 0xE9, 0xB2, 0x44, 0x3A, 0x09, 0x84, 0x09, 0x37, 0x0C, 0x65, 0x40, 0xA9, + 0x3F, 0x5D, 0xB2, 0xFF, 0xC2, 0xBB, 0x0F, 0x67, 0x62, 0x6C, 0x67, 0x60, + 0x14, 0x32, 0xD1, 0x96, 0x8D, 0x14, 0x8E, 0xC4, 0x49, 0xA4, 0x74, 0x30, + 0x01, 0xD8, 0xB9, 0x9B, 0xD4, 0x4E, 0x79, 0x34, 0x42, 0x2A, 0x46, 0xCB, + 0x25, 0xBE, 0x83, 0x24, 0x9E, 0x72, 0xCF, 0x32, 0xF1, 0x98, 0xEE, 0x97, + 0xCF, 0xD6, 0x5F, 0x7E, 0xA8, 0x4B, 0x02, 0x37, 0x65, 0x2D, 0xA0, 0xBF, + 0x07, 0x7A, 0x84, 0x61, 0xE3, 0xED, 0xB5, 0x3F, 0x49, 0x3C, 0x86, 0x2C, + 0xBB, 0x72, 0xAF, 0xDA, 0xD4, 0xE1, 0xA5, 0x3B, 0xC4, 0xE6, 0x24, 0x9E, + 0xD2, 0x48, 0x31, 0x22, 0x99, 0x18, 0x9B, 0x38, 0x23, 0x84, 0x49, 0x40, + 0x53, 0xAC, 0xAD, 0x66, 0x91, 0xBB, 0x47, 0xAE, 0x37, 0x3D, 0x9C, 0xB9, + 0x2C, 0xC7, 0x7E, 0x21, 0xCF, 0xD7, 0x1A, 0xA4, 0x02, 0x35, 0x20, 0xEB, + 0x47, 0x59, 0x1D, 0xB1, 0xB9, 0x50, 0xA8, 0x04, 0xEC, 0xEE, 0xCA, 0xAC, + 0xEC, 0x03, 0x11, 0x18, 0xF1, 0xA0, 0x25, 0x7B, 0x81, 0x2A, 0xA2, 0x90, + 0x6A, 0x84, 0x51, 0x67, 0x26, 0xDB, 0xD9, 0xD4, 0xD8, 0x5C, 0x8B, 0xBE, + 0x17, 0x11, 0x58, 0xF5, 0x6B, 0x0C, 0x55, 0x69, 0x49, 0x52, 0x5C, 0xC1, + 0x38, 0xD7, 0x86, 0x28, 0x5E, 0xCB, 0xFD, 0x47, 0x39, 0x4C, 0xE6, 0x72, + 0x47, 0x29, 0x99, 0x0B, 0x2A, 0xF0, 0x71, 0x20, 0x3F, 0xED, 0x8A, 0xA3, + 0xB1, 0x09, 0x82, 0x4B, 0xDA, 0xE4, 0x2B, 0xF8, 0x03, 0xFD, 0x4B, 0x2E, + 0x5A, 0xCB, 0x99, 0x17, 0x2F, 0xD0, 0x49, 0x71, 0xDE, 0x82, 0x69, 0xC8, + 0x14, 0x14, 0x4B, 0x7C, 0x61, 0x69, 0x09, 0x9D, 0xFA, 0xB8, 0x11, 0xFD, + 0xE0, 0xD6, 0xC8, 0x5D, 0xD0, 0xA7, 0x79, 0x9E, 0x42, 0x75, 0xFC, 0x42, + 0x65, 0xAA, 0x5D, 0x04, 0x5E, 0x8C, 0x8F, 0x2E, 0x8B, 0x83, 0x39, 0xD7, + 0x07, 0xB9, 0xC3, 0x52, 0x15, 0x2C, 0x50, 0xA2, 0xDF, 0xAE, 0x57, 0x35, + 0x95, 0x46, 0xB9, 0x6B, 0x62, 0x66, 0x78, 0xAF, 0x73, 0x92, 0x08, 0xB3, + 0xB7, 0x8C, 0x8F, 0x11, 0x7A, 0xA6, 0xF4, 0xCC, 0x90, 0x3A, 0x24, 0xB1, + 0x95, 0x50, 0xD3, 0x93, 0x2A, 0xAB, 0xE6, 0x9C, 0xC7, 0xC8, 0xEA, 0xCD, + 0x11, 0x86, 0x4B, 0x92, 0x5B, 0x67, 0xB9, 0x64, 0xD5, 0x75, 0x02, 0x98, + 0x24, 0x2B, 0xAF, 0x5C, 0x89, 0xF2, 0x27, 0x04, 0x8B, 0x38, 0x81, 0x0A, + 0x9E, 0xF4, 0xAE, 0x4A, 0xC9, 0x36, 0x64, 0x15, 0xBA, 0xDB, 0xFC, 0xDD, + 0xA6, 0xF1, 0xDF, 0x96, 0xA0, 0x96, 0xD4, 0x11, 0x0B, 0x86, 0x7A, 0xD1, + 0x0E, 0x46, 0x5F, 0x59, 0x3C, 0x4B, 0x2C, 0x29, 0xB3, 0x01, 0xE3, 0x41, + 0xA2, 0xF9, 0x45, 0xED, 0xF4, 0x19, 0xA8, 0x8D, 0x4D, 0x10, 0x4A, 0xF1, + 0xF5, 0x68, 0x65, 0x7D, 0x1E, 0x69, 0x60, 0x67, 0x23, 0x44, 0xF5, 0x84, + 0x4E, 0xD4, 0x60, 0x70, 0xB2, 0x0F, 0x33, 0xC2, 0x33, 0xA9, 0xE7, 0x91, + 0x2B, 0xE2, 0x47, 0x8E, 0xFE, 0xCB, 0x32, 0x18, 0x84, 0x03, 0x9F, 0xA2, + 0x9E, 0xB2, 0x44, 0xCB, 0xB5, 0x96, 0xE1, 0x0A, 0x34, 0xF4, 0x61, 0xAC, + 0x8A, 0x47, 0x30, 0x5D, 0x70, 0xBA, 0x1E, 0xE5, 0x2B, 0xAC, 0x3E, 0x9D, + 0xF8, 0x6A, 0x10, 0x76, 0x73, 0x07, 0xEC, 0xC1, 0x7F, 0xBA, 0x6A, 0x8C, + 0xB5, 0x33, 0xD3, 0x49, 0x4B, 0x3B, 0x4F, 0xDD, 0x7F, 0x4C, 0x1B, 0x96, + 0x4A, 0x56, 0x7C, 0xDB, 0x64, 0x62, 0xD6, 0xA0, 0x94, 0xA2, 0x8E, 0xCE, + 0xED, 0x9F, 0xEA, 0xF7, 0xD7, 0xDB, 0x2B, 0x7C, 0x9B, 0x17, 0x80, 0x56, + 0xD2, 0x8A, 0x16, 0x66, 0x40, 0x30, 0xF0, 0xA0, 0xB5, 0xDF, 0xB8, 0x2C, + 0xE9, 0xF1, 0x95, 0xF1, 0x76, 0x40, 0x42, 0x73, 0x17, 0x78, 0xF6, 0x94, + 0xC5, 0x7C, 0xB8, 0x47, 0xBA, 0xEC, 0x00, 0xBD, 0x1D, 0x4C, 0x10, 0xDD, + 0x30, 0xDF, 0xFA, 0x83, 0x49, 0xC8, 0x26, 0xA8, 0xEA, 0x2D, 0x86, 0x17, + 0x2F, 0xD9, 0x19, 0xE1, 0x5C, 0x33, 0x53, 0xB1, 0xA4, 0x15, 0x50, 0xF3, + 0xC4, 0x30, 0xC1, 0x33, 0x3E, 0x10, 0x09, 0x5A, 0xE6, 0x3D, 0xE5, 0x48, + 0xA6, 0x4D, 0xBC, 0xF3, 0x69, 0xA6, 0x88, 0xED, 0x95, 0x81, 0x3F, 0x38, + 0xFD, 0x12, 0xDC, 0xFB, 0xDE, 0x6B, 0x46, 0xA6, 0xC0, 0x38, 0xDE, 0xFC, + 0x50, 0xAA, 0x0A, 0xC1, 0x24, 0x39, 0x0D, 0xA5, 0x56, 0x8B, 0xC6, 0x8D, + 0x9E, 0xD2, 0xF4, 0x6B, 0x42, 0xCE, 0x02, 0x40, 0xF1, 0xC1, 0xBF, 0x48, + 0x6B, 0x25, 0x71, 0x5A, 0x7E, 0xBB, 0xC8, 0xAC, 0x51, 0x6F, 0xE9, 0x8F, + 0x4C, 0x41, 0x09, 0x4B, 0x8F, 0x37, 0xC2, 0xC2, 0x93, 0x7F, 0x67, 0x2E, + 0xE4, 0x24, 0x18, 0x2A, 0xF5, 0x73, 0xFD, 0xBB, 0xC9, 0xEC, 0x15, 0xA8, + 0x8A, 0xA5, 0xD1, 0x31, 0x7D, 0xB7, 0x22, 0xB9, 0xC8, 0x07, 0xC0, 0xE0, + 0xFE, 0x83, 0x20, 0x01, 0x53, 0x6B, 0x7D, 0x0B, 0x80, 0xA9, 0xD3, 0x8A, + 0x72, 0x91, 0xA8, 0x00, 0x82, 0x2E, 0xDF, 0xBC, 0x57, 0x63, 0x98, 0x45, + 0xF6, 0x2A, 0x5D, 0x97, 0x0F, 0xC0, 0x03, 0x51, 0xCE, 0xA3, 0x12, 0x2E, + 0xE3, 0x4B, 0x63, 0x35, 0x78, 0xE7, 0xEA, 0x87, 0xEB, 0x70, 0x82, 0x3B, + 0xE1, 0xC5, 0x23, 0x2D, 0x7C, 0x00, 0x00, 0x03, 0x01, 0x95, 0x29, 0xBE, + 0xB6, 0xDC, 0xF6, 0x58, 0x50, 0xFE, 0xCE, 0xF7, 0xF7, 0x52, 0x3D, 0xB7, + 0xED, 0x89, 0xC1, 0x6B, 0x00, 0x2B, 0x45, 0x0E, 0x10, 0x47, 0x0B, 0xC0, + 0xB7, 0xBF, 0x75, 0xAA, 0x4E, 0x32, 0xD5, 0xD9, 0x1A, 0x9C, 0x51, 0xC5, + 0x17, 0x26, 0x6F, 0x2B, 0xFB, 0xF0, 0xBD, 0x7B, 0xEA, 0x99, 0xC9, 0xF2, + 0x32, 0x25, 0x4E, 0x63, 0x87, 0x86, 0xA9, 0xE0, 0xE9, 0x1E, 0x78, 0xE7, + 0xBA, 0x95, 0xB0, 0xE5, 0x67, 0x3D, 0x9A, 0xDC, 0xA9, 0x17, 0xD8, 0xDA, + 0x28, 0x8D, 0x20, 0x4E, 0xDC, 0x65, 0x3B, 0xFA, 0x95, 0x05, 0x5B, 0x3F, + 0xF9, 0xFE, 0x9F, 0x74, 0x5A, 0xCB, 0x93, 0x82, 0x0A, 0x96, 0xFB, 0xA3, + 0x64, 0x76, 0x59, 0x7D, 0x28, 0xBA, 0x9D, 0xE4, 0x40, 0x9B, 0xB1, 0x92, + 0x52, 0xD9, 0x29, 0x2E, 0x75, 0x93, 0xE2, 0x84, 0x0B, 0x18, 0x00, 0x7C, + 0xAF, 0x5D, 0xDA, 0xE9, 0x78, 0x00, 0xBD, 0xC5, 0x2D, 0xB2, 0xCA, 0x6B, + 0xDD, 0xFB, 0x1F, 0xD4, 0xD7, 0x6A, 0xBE, 0x22, 0x9D, 0x8C, 0x13, 0x50, + 0x8E, 0x8C, 0x07, 0xFB, 0x5B, 0x70, 0x16, 0xF3, 0xFE, 0x48, 0x4F, 0xF5, + 0x08, 0xF5, 0x96, 0xDE, 0x20, 0xDA, 0x4F, 0xEC, 0xFD, 0xD4, 0x83, 0x48, + 0x5A, 0xA4, 0x32, 0xE0, 0xBC, 0xA9, 0xC5, 0xCB, 0x33, 0x61, 0xA0, 0xBE, + 0x66, 0x8C, 0xF7, 0x10, 0x60, 0xD8, 0xC4, 0xB4, 0xBA, 0xD3, 0x8A, 0x0C, + 0x8F, 0x86, 0x09, 0x7A, 0x95, 0x5C, 0x07, 0x06, 0xCD, 0xDF, 0xC7, 0xD0, + 0x58, 0x9C, 0xFB, 0xC9, 0x42, 0x39, 0x84, 0x32, 0xD6, 0x07, 0x0F, 0x83, + 0x89, 0x91, 0x35, 0x40, 0x03, 0x9A, 0x1D, 0x53, 0x5F, 0x53, 0xF0, 0xD7, + 0xDB, 0xDE, 0xAB, 0x5E, 0x97, 0xAF, 0x6D, 0x43, 0x01, 0xB0, 0x74, 0x49, + 0x8E, 0x81, 0xE5, 0xA6, 0x08, 0xAC, 0xEC, 0x92, 0xE9, 0x99, 0xC7, 0xBD, + 0xB4, 0x0E, 0x95, 0x6E, 0xDA, 0x68, 0x6D, 0x24, 0x35, 0xE5, 0x11, 0x42, + 0x11, 0xCA, 0x1B, 0x49, 0x5C, 0x5C, 0x8D, 0x29, 0x1D, 0xBB, 0xD3, 0x81, + 0x65, 0x78, 0xA3, 0x85, 0x80, 0x2E, 0x73, 0xEE, 0x61, 0x88, 0x51, 0xBB, + 0x6B, 0x73, 0x14, 0xBA, 0x64, 0x5A, 0x67, 0xE6, 0x9C, 0xD8, 0x99, 0x57, + 0x4D, 0xC2, 0xA3, 0xF6, 0x30, 0x39, 0xA8, 0x47, 0xBE, 0x7C, 0xB1, 0xF9, + 0x46, 0xD7, 0x73, 0x64, 0x21, 0x94, 0xC5, 0xCC, 0x6E, 0xAC, 0xCC, 0xE6, + 0x57, 0x25, 0x4D, 0x94, 0xDE, 0x87, 0x4F, 0xEB, 0x05, 0x93, 0x85, 0x83, + 0xC2, 0xA0, 0xDD, 0x5D, 0x21, 0xB7, 0x7A, 0xDD, 0x63, 0x27, 0x46, 0xE0, + 0x05, 0xE7, 0xA4, 0x20, 0xAE, 0x37, 0x6E, 0xD8, 0x41, 0x17, 0x73, 0x8F, + 0x25, 0x8A, 0x96, 0xD5, 0x4A, 0x8E, 0x3D, 0x2D, 0x9F, 0x59, 0x24, 0x3E, + 0xE0, 0x01, 0x47, 0x93, 0x5F, 0xE6, 0x43, 0xFE, 0x4C, 0xE4, 0x2A, 0xB6, + 0xAE, 0xC5, 0x18, 0x98, 0xB5, 0x95, 0x43, 0xF9, 0x7C, 0x2E, 0x80, 0xBF, + 0x7A, 0x7F, 0x94, 0xC9, 0xC8, 0x13, 0xA3, 0x14, 0x76, 0x49, 0xDC, 0xC6, + 0x22, 0x10, 0xBD, 0xB5, 0x8B, 0x7E, 0xB9, 0x8A, 0x41, 0xB7, 0xBB, 0x0F, + 0xA0, 0x80, 0x9F, 0xFE, 0x68, 0x02, 0x76, 0xA3, 0xCA, 0x9A, 0x7A, 0x39, + 0xB5, 0x3A, 0x45, 0x45, 0x38, 0x73, 0x50, 0xB6, 0xF9, 0xFC, 0xCB, 0xDB, + 0x9B, 0x07, 0xA0, 0x61, 0x99, 0xFE, 0xA6, 0xBE, 0x52, 0xB8, 0xF7, 0x6F, + 0x93, 0x81, 0xEB, 0x2F, 0x02, 0xC2, 0x13, 0x7C, 0x29, 0x43, 0xA5, 0x65, + 0x9C, 0xB8, 0xF2, 0x64, 0xAB, 0x2D, 0xFD, 0x00, 0x38, 0x53, 0xE9, 0x4C, + 0xCC, 0xB6, 0x17, 0x0C, 0x0B, 0xE8, 0x1A, 0xCF, 0x4C, 0xBB, 0x5A, 0xA5, + 0x8E, 0x92, 0xAD, 0x1F, 0x87, 0xF8, 0xCD, 0xFE, 0x9C, 0x81, 0x68, 0xC6, + 0xF1, 0x7B, 0xED, 0x82, 0x9F, 0xA7, 0xD5, 0x5C, 0xC8, 0x52, 0x3A, 0xD9, + 0xFF, 0x09, 0xB4, 0xDE, 0x05, 0x6E, 0x5D, 0x62, 0x8F, 0x15, 0x2C, 0xD5, + 0x4E, 0x09, 0x00, 0x33, 0xBF, 0xD9, 0x21, 0x61, 0x99, 0x66, 0xC2, 0xB5, + 0x50, 0x2A, 0x0D, 0xD5, 0xF3, 0x02, 0x59, 0x6F, 0xEA, 0x4C, 0x83, 0x68, + 0xDC, 0x58, 0xF9, 0xA9, 0xA2, 0x24, 0x0C, 0xAE, 0x7D, 0x36, 0x00, 0x1E, + 0x1E, 0x32, 0x2F, 0x1B, 0xF0, 0xB2, 0x62, 0xE9, 0x71, 0x67, 0x32, 0x46, + 0xCD, 0x02, 0x8A, 0xFB, 0x69, 0xA0, 0x07, 0x22, 0xBE, 0xC1, 0x0C, 0x5F, + 0xFF, 0x95, 0x3A, 0x2F, 0x61, 0x1B, 0x05, 0xEF, 0xFA, 0xC0, 0x65, 0x11, + 0x87, 0x72, 0x6B, 0xAD, 0xC6, 0x50, 0x72, 0xEE, 0x4A, 0x4B, 0xFE, 0x01, + 0x7B, 0xD6, 0xBC, 0xDE, 0xF0, 0x8E, 0x24, 0x89, 0x20, 0xD0, 0x53, 0xAE, + 0x1E, 0xFB, 0x61, 0xC3, 0x17, 0x34, 0x98, 0x15, 0xAD, 0x88, 0x03, 0x9C, + 0x48, 0xCD, 0xE5, 0xF2, 0xB0, 0x4D, 0x39, 0x27, 0x2B, 0x90, 0x0A, 0x55, + 0x12, 0x06, 0x88, 0x13, 0x09, 0x1F, 0x55, 0x9A, 0xA0, 0xBC, 0x88, 0x8E, + 0xC6, 0x18, 0x43, 0x73, 0x0D, 0x73, 0x26, 0x83, 0x4C, 0x1A, 0x87, 0x80, + 0x43, 0xCC, 0x65, 0xEB, 0xBE, 0x72, 0xD4, 0xAA, 0x44, 0xC7, 0xEE, 0x5B, + 0x1A, 0xA5, 0x3D, 0x59, 0xBE, 0x5A, 0x0D, 0x7B, 0xFC, 0xB4, 0x75, 0xD0, + 0xAF, 0xD8, 0x1C, 0x30, 0xDA, 0x38, 0xAD, 0x9E, 0x25, 0x32, 0xDB, 0xFF, + 0xF9, 0xAD, 0x73, 0x6B, 0x17, 0x96, 0xBD, 0x5C, 0x84, 0xCF, 0xAF, 0x75, + 0x9D, 0xD0, 0x12, 0x9E, 0xC8, 0x27, 0x51, 0x67, 0x47, 0x87, 0xE1, 0xDE, + 0xAE, 0xAB, 0x50, 0x4E, 0x39, 0xAD, 0xD2, 0x96, 0x71, 0xD4, 0x7C, 0x07, + 0x57, 0xEA, 0x9D, 0x51, 0x1F, 0x16, 0xBE, 0xFF, 0x87, 0x56, 0x7B, 0x3D, + 0x5F, 0xCD, 0x6A, 0xAE, 0x36, 0x6C, 0x8E, 0x88, 0xE8, 0x0A, 0x5E, 0x58, + 0xB8, 0x66, 0x92, 0xCC, 0xF3, 0x66, 0x2C, 0x54, 0xFA, 0x95, 0xAC, 0xE0, + 0xDC, 0xEA, 0x62, 0x42, 0x60, 0xC8, 0xAB, 0x1E, 0xEF, 0x24, 0x8B, 0x25, + 0xF9, 0x99, 0x85, 0xE6, 0xB4, 0x70, 0xF0, 0x1A, 0x00, 0xCC, 0x54, 0x3C, + 0xE0, 0xF2, 0x6D, 0xEB, 0x8B, 0x65, 0x03, 0xB8, 0x85, 0x03, 0x2F, 0x91, + 0x66, 0x63, 0x11, 0xE1, 0x06, 0x90, 0x82, 0xCB, 0xA2, 0x80, 0xB2, 0x73, + 0xF0, 0x00, 0x21, 0x31, 0x21, 0xF7, 0x41, 0xD6, 0xE2, 0x25, 0x9A, 0xDC, + 0x96, 0x77, 0x9A, 0xBB, 0x19, 0x8B, 0xD8, 0x55, 0x6F, 0x57, 0x32, 0xEF, + 0xC7, 0x8E, 0x37, 0x36, 0x3B, 0x00, 0x20, 0xEF, 0x81, 0x0C, 0xB1, 0xD9, + 0xF7, 0x5D, 0x3C, 0x5F, 0x97, 0x92, 0x75, 0x6B, 0xF6, 0xFB, 0x0A, 0x76, + 0x5F, 0x9C, 0x50, 0x9F, 0xAF, 0xEE, 0xE0, 0xF7, 0xB6, 0x84, 0xD0, 0x57, + 0x77, 0x11, 0x3B, 0xE6, 0x55, 0x15, 0x33, 0xE5, 0x48, 0x05, 0xBE, 0xD6, + 0xDC, 0x03, 0xDF, 0x81, 0x42, 0xDD, 0xF0, 0x40, 0x36, 0x55, 0xDF, 0xD2, + 0xB2, 0xA5, 0xA9, 0x33, 0x1F, 0x3B, 0x4F, 0xDA, 0x15, 0xC3, 0xAC, 0xE9, + 0xF6, 0xD8, 0xCC, 0xB1, 0xCC, 0xB8, 0x4C, 0xE6, 0x05, 0xCB, 0x95, 0x1D, + 0xFD, 0xD3, 0xC8, 0xEB, 0xF4, 0x89, 0x2A, 0xC0, 0xCD, 0xBA, 0x60, 0xB8, + 0xA0, 0x10, 0xB1, 0x86, 0x45, 0xF5, 0x91, 0xBF, 0x6E, 0x81, 0xF9, 0x04, + 0xBD, 0xD1, 0x7E, 0xCE, 0x42, 0x72, 0xC7, 0xF7, 0x57, 0xD6, 0x44, 0x19, + 0xC2, 0x21, 0xC1, 0x47, 0xD9, 0x1E, 0xFE, 0x20, 0x0D, 0x41, 0xFC, 0x9E, + 0xAE, 0xDF, 0xCD, 0x89, 0x08, 0x30, 0xF2, 0x51, 0x65, 0xF7, 0x25, 0x6E, + 0xA9, 0xFD, 0x2B, 0xE0, 0xAB, 0x07, 0x84, 0x86, 0xA9, 0xE5, 0x3C, 0x9F, + 0xED, 0x36, 0xCA, 0xDC, 0x8A, 0xA8, 0xCC, 0x73, 0xFF, 0x57, 0xCD, 0xC1, + 0xA5, 0x5A, 0x64, 0x0C, 0xB2, 0xCE, 0x47, 0xC5, 0x8D, 0x1D, 0xD4, 0xC0, + 0x82, 0xC7, 0x7E, 0x9C, 0xD5, 0x49, 0xBC, 0x73, 0xC4, 0x27, 0xC2, 0xDA, + 0xC7, 0xF9, 0xDA, 0xCA, 0xAB, 0xBB, 0xA2, 0x7F, 0xBF, 0xA8, 0x71, 0xE1, + 0x79, 0x7F, 0xFC, 0x15, 0xBA, 0x2A, 0x38, 0x9D, 0xF1, 0xA8, 0x16, 0xB5, + 0xF1, 0x66, 0xA7, 0x4F, 0xC2, 0xCC, 0xBF, 0x2B, 0x2E, 0x94, 0x91, 0xBD, + 0x31, 0xFD, 0xD5, 0xA7, 0xDB, 0x3B, 0x76, 0x29, 0x38, 0x63, 0xD2, 0x51, + 0x24, 0x72, 0x2D, 0x14, 0x86, 0xBC, 0x03, 0x1E, 0xA0, 0xF4, 0x02, 0x57, + 0xE4, 0xAA, 0x89, 0xC5, 0x60, 0x5D, 0x6D, 0x8D, 0x42, 0x76, 0x86, 0xB9, + 0xA1, 0xBE, 0xA4, 0x4D, 0xD2, 0xAD, 0x97, 0x24, 0xE7, 0xE1, 0xF3, 0xF0, + 0x47, 0xF1, 0xCB, 0x61, 0xF6, 0x49, 0x88, 0xC1, 0x62, 0x78, 0x8A, 0xD4, + 0xC9, 0x59, 0x01, 0xC1, 0x2A, 0x1A, 0x8F, 0x6F, 0x96, 0xD0, 0x40, 0x68, + 0x2F, 0x80, 0x20, 0xB0, 0xC2, 0xF1, 0x4A, 0xBD, 0x51, 0xE2, 0x38, 0x07, + 0xC1, 0x63, 0x00, 0xEC, 0x7B, 0x44, 0xE0, 0x4A, 0x3E, 0x49, 0xE8, 0xD4, + 0x2F, 0x84, 0xBD, 0xB2, 0xF2, 0x7E, 0xFD, 0xF0, 0xB3, 0x2E, 0x40, 0xC4, + 0x57, 0x0E, 0x9C, 0xF5, 0xA4, 0x90, 0xA2, 0x7F, 0xCE, 0x6F, 0xFD, 0xE1, + 0x0E, 0xE4, 0xF1, 0x4C, 0x99, 0x43, 0xEB, 0xE4, 0x96, 0xF8, 0x5E, 0xC3, + 0x90, 0x38, 0x7C, 0xD0, 0x5C, 0x6C, 0x15, 0xEE, 0x5B, 0xD5, 0x7E, 0xD2, + 0x74, 0x83, 0xF6, 0x21, 0x02, 0xF9, 0x5C, 0x4C, 0xA4, 0xA6, 0x77, 0xC4, + 0xFD, 0x90, 0xB1, 0x43, 0x82, 0x25, 0x1D, 0xCE, 0x51, 0x3E, 0xB1, 0xC7, + 0x14, 0x57, 0x44, 0x94, 0x10, 0x0E, 0xD7, 0x12, 0xFC, 0x7C, 0xD8, 0x8E, + 0xFB, 0xD0, 0xC3, 0x96, 0x78, 0x55, 0x63, 0xE6, 0x41, 0x24, 0x5E, 0xAA, + 0x75, 0xEA, 0xB9, 0xB6, 0x67, 0x28, 0x74, 0x0D, 0xD7, 0x91, 0x2B, 0xAF, + 0xF1, 0x27, 0x57, 0xA3, 0xFB, 0x76, 0xCB, 0x56, 0x02, 0x4A, 0xE7, 0x3A, + 0xFF, 0xB2, 0x12, 0x36, 0xF7, 0xE5, 0x41, 0x88, 0x28, 0x6C, 0xBA, 0x7D, + 0x43, 0x40, 0xCB, 0xFF, 0x19, 0xFA, 0x0B, 0x32, 0x0B, 0xE0, 0x6B, 0x14, + 0xE0, 0xF6, 0x54, 0xA7, 0x24, 0x13, 0xEC, 0x41, 0x08, 0xCC, 0x5B, 0x5A, + 0xE0, 0x38, 0xFA, 0xD9, 0x8F, 0xC8, 0x83, 0x25, 0x10, 0xD2, 0x16, 0x2B, + 0x05, 0x10, 0xAC, 0x5D, 0xB8, 0xBE, 0x22, 0x59, 0xB8, 0x04, 0xE9, 0x78, + 0x3C, 0xE2, 0x6B, 0xD8, 0x9C, 0xDB, 0x02, 0x1B, 0xA1, 0xB8, 0x0D, 0x20, + 0x87, 0x7F, 0xD2, 0x8A, 0x0F, 0xD7, 0x02, 0xE4, 0xE4, 0xC4, 0xF6, 0x95, + 0xF2, 0xB2, 0x1B, 0xDC, 0x03, 0x22, 0xCB, 0xDD, 0x00, 0x32, 0x57, 0x5A, + 0xB6, 0xBA, 0xD7, 0x80, 0x40, 0xFA, 0xC6, 0xA7, 0x29, 0x20, 0x8C, 0x97, + 0x3D, 0x46, 0x53, 0xD5, 0xDE, 0xDE, 0x77, 0x40, 0x0D, 0x20, 0x99, 0x88, + 0x34, 0xB0, 0x6F, 0xCB, 0x95, 0xD4, 0x34, 0xF6, 0x48, 0x1B, 0x4A, 0xDE, + 0x67, 0x4A, 0x82, 0xD9, 0x8F, 0xCB, 0xB5, 0xD0, 0x93, 0xA1, 0xC0, 0xE7, + 0x46, 0x57, 0xF3, 0x24, 0x3E, 0x17, 0x0D, 0xF3, 0x36, 0xE1, 0xF8, 0xD3, + 0xD0, 0xA2, 0x25, 0xF6, 0xDF, 0x2F, 0xE0, 0xB7, 0x30, 0x78, 0xD5, 0x27, + 0x70, 0xEE, 0xBC, 0x67, 0x4B, 0xD8, 0x4A, 0x26, 0x5D, 0xB1, 0x29, 0x67, + 0xAA, 0x00, 0xEA, 0x4F, 0xB9, 0x82, 0x0D, 0xCC, 0x1D, 0x27, 0xF0, 0x30, + 0x4D, 0x88, 0xB5, 0x52, 0xF6, 0x37, 0xAE, 0xA7, 0xB2, 0xEF, 0xAD, 0x41, + 0x01, 0xF3, 0x25, 0x69, 0xAD, 0x40, 0xA7, 0x82, 0x16, 0x87, 0x87, 0xCC, + 0x36, 0x1E, 0x16, 0x76, 0x78, 0x0D, 0xC9, 0x76, 0x5D, 0xB1, 0xC3, 0x9B, + 0xC4, 0x56, 0x07, 0xD2, 0x5C, 0xB3, 0x9C, 0x9E, 0xD5, 0x6D, 0x1B, 0x46, + 0x39, 0x5B, 0x7E, 0xA2, 0x52, 0x54, 0x53, 0xC2, 0x3D, 0x40, 0x26, 0x0A, + 0xFD, 0x4A, 0xA1, 0x7E, 0xE2, 0x9B, 0x1D, 0x54, 0x47, 0x94, 0x00, 0x9A, + 0xE4, 0x77, 0x69, 0x7D, 0x0C, 0x5F, 0x9D, 0x76, 0xE1, 0x1D, 0x41, 0x56, + 0xC1, 0x3C, 0x73, 0x23, 0xCB, 0x93, 0xF0, 0xC3, 0x16, 0x41, 0x24, 0x64, + 0xC6, 0x7A, 0x9D, 0x5D, 0x1B, 0xC6, 0x8A, 0x9B, 0x40, 0x18, 0xF2, 0xDC, + 0x70, 0x93, 0x93, 0x1C, 0xE6, 0xD4, 0x6A, 0xB3, 0x8F, 0x9B, 0xB6, 0x83, + 0xE9, 0x34, 0x24, 0xD0, 0x88, 0xB5, 0x54, 0x37, 0xAD, 0x5A, 0xB3, 0x23, + 0xFF, 0xB0, 0x09, 0xA5, 0x89, 0xBF, 0xE4, 0xF0, 0xFA, 0x27, 0x93, 0xCC, + 0x33, 0xC6, 0x7F, 0xA6, 0xEE, 0x96, 0x28, 0xFA, 0x4C, 0x37, 0xB6, 0xA7, + 0x8A, 0x52, 0xDF, 0x7E, 0x51, 0xCD, 0xEE, 0x40, 0x9C, 0x6F, 0x21, 0x8F, + 0x0C, 0x9D, 0xD1, 0x70, 0x1F, 0x0F, 0xA7, 0x22, 0xA4, 0x24, 0xD3, 0xCA, + 0x8E, 0x21, 0xD3, 0x03, 0x91, 0xD0, 0x36, 0x71, 0x4B, 0x4B, 0xC0, 0xFC, + 0x7C, 0x92, 0x0A, 0x15, 0x91, 0xEB, 0x10, 0x7B, 0xCD, 0xFA, 0xD6, 0xB6, + 0x04, 0x1F, 0x89, 0xC3, 0x8B, 0x43, 0x9D, 0x26, 0x65, 0x34, 0x00, 0x34, + 0x5C, 0xA8, 0x0A, 0x7F, 0xCA, 0x6A, 0x4C, 0x1C, 0x7C, 0xFA, 0xA2, 0x6D, + 0x42, 0x67, 0x33, 0xC6, 0xDE, 0x5F, 0x4D, 0xB8, 0xD4, 0xD4, 0xDF, 0xCC, + 0x10, 0x2B, 0x58, 0xF6, 0xE1, 0x8E, 0x8F, 0xF2, 0xC1, 0x8C, 0x18, 0xA8, + 0x41, 0xB4, 0xA7, 0x9F, 0xE7, 0x8A, 0x16, 0x8D, 0x7B, 0x54, 0x81, 0x54, + 0x87, 0x98, 0x4C, 0x20, 0x45, 0xC5, 0xE4, 0xFB, 0xCE, 0xF9, 0xD0, 0x0B, + 0xC9, 0xC0, 0x15, 0x77, 0xDD, 0x0F, 0x23, 0x19, 0x40, 0x00, 0x07, 0x6E, + 0xB0, 0x5C, 0xC4, 0x85, 0xB9, 0x35, 0xA2, 0x77, 0x35, 0x28, 0x2B, 0xC0, + 0x61, 0x91, 0x6C, 0x5E, 0xF6, 0xBD, 0x74, 0x70, 0x77, 0x33, 0xF9, 0x38, + 0xD2, 0x6D, 0x2F, 0xE9, 0x01, 0x9A, 0x10, 0x5A, 0x20, 0x6B, 0x7F, 0xE5, + 0xD9, 0x8C, 0x25, 0x17, 0x5F, 0x0E, 0xED, 0x99, 0x8A, 0x2B, 0xA3, 0x0E, + 0xA3, 0x7E, 0xE0, 0x7A, 0x4A, 0x79, 0xF3, 0xED, 0x71, 0x31, 0x2B, 0x53, + 0x8A, 0xE6, 0xFC, 0x01, 0x85, 0xD0, 0x7F, 0xFE, 0x22, 0x96, 0x47, 0x6C, + 0x48, 0x41, 0x1A, 0xF2, 0x39, 0x4F, 0x16, 0x67, 0x4C, 0x2E, 0x00, 0xE1, + 0x86, 0x0D, 0xA1, 0x2E, 0x99, 0x2C, 0xA3, 0xEE, 0xB8, 0x21, 0x85, 0x84, + 0x20, 0x0A, 0xA9, 0x64, 0xD1, 0xBC, 0x79, 0xCC, 0x81, 0xDE, 0x83, 0x55, + 0x71, 0x5C, 0x26, 0x01, 0x99, 0x01, 0xFD, 0x40, 0x39, 0xFF, 0x66, 0xE9, + 0x2D, 0x80, 0xFE, 0x44, 0x97, 0x1D, 0x73, 0xEB, 0x18, 0x47, 0x6B, 0x9D, + 0xEA, 0x73, 0x0A, 0xD3, 0xB8, 0xEC, 0x8F, 0xC2, 0x2D, 0x2B, 0x99, 0x73, + 0x4C, 0xA9, 0x08, 0x06, 0x33, 0xAC, 0x05, 0x6F, 0x37, 0x79, 0xEE, 0xA9, + 0x28, 0x2F, 0x9C, 0x24, 0x55, 0x12, 0x59, 0xBA, 0x73, 0xFC, 0x05, 0xD7, + 0xA1, 0x01, 0x30, 0xE3, 0x23, 0x4B, 0x3E, 0xB4, 0x6C, 0xCE, 0xDB, 0x8A, + 0x28, 0xC1, 0xF0, 0x76, 0xA2, 0x56, 0x60, 0x22, 0x0F, 0x86, 0x77, 0x5C, + 0xA7, 0xA2, 0xC7, 0x1C, 0xAF, 0x08, 0x65, 0x77, 0xBC, 0x0A, 0x03, 0xF2, + 0x49, 0x93, 0xA6, 0x4D, 0x4C, 0x91, 0x6C, 0xB7, 0x6B, 0x6B, 0x28, 0xF1, + 0x54, 0xC7, 0x70, 0xBF, 0x26, 0xC6, 0x71, 0x07, 0x7D, 0x13, 0x62, 0x03, + 0xE3, 0x99, 0xF6, 0xC2, 0x20, 0x7B, 0x5E, 0xD1, 0x85, 0x49, 0xB7, 0xB8, + 0x6B, 0x79, 0xE3, 0xDF, 0x5C, 0x45, 0xE0, 0xF1, 0xF3, 0x78, 0x0D, 0x9C, + 0x85, 0xD5, 0x74, 0x34, 0x2B, 0xEC, 0x3C, 0xD3, 0xEA, 0xDB, 0x67, 0x0D, + 0x86, 0x80, 0x00, 0x64, 0x0A, 0xB0, 0x6B, 0x84, 0x7A, 0x44, 0x3A, 0x4B, + 0x68, 0xBE, 0xA9, 0x48, 0x9A, 0x2B, 0x58, 0x9E, 0xF3, 0xC2, 0x50, 0xBF, + 0xBD, 0xAA, 0x5F, 0x39, 0x1C, 0xE8, 0x7C, 0x90, 0x2D, 0x50, 0x5E, 0x5D, + 0xCE, 0x4A, 0xCF, 0xCD, 0xBE, 0x45, 0xA7, 0x17, 0xBA, 0x3C, 0xEC, 0xB4, + 0x72, 0x1C, 0x82, 0xC2, 0xB0, 0xEB, 0x67, 0x44, 0x44, 0x87, 0x4C, 0xD3, + 0x98, 0xD0, 0x3E, 0x49, 0x87, 0xF5, 0xDA, 0x95, 0x95, 0xC2, 0x7D, 0xF3, + 0x91, 0xE7, 0x09, 0xD5, 0x7A, 0x1A, 0xCA, 0x91, 0xE3, 0x5B, 0x37, 0x9E, + 0xBE, 0x1F, 0x9D, 0x0E, 0x62, 0x75, 0xD9, 0x6F, 0x9E, 0xA7, 0x53, 0x5E, + 0x6F, 0x75, 0x1C, 0x3C, 0x51, 0xF7, 0xBF, 0x74, 0x40, 0xBB, 0xEA, 0x3A, + 0x70, 0xF3, 0xB4, 0x89, 0xC2, 0x45, 0xF7, 0x12, 0x53, 0x24, 0x40, 0xCF, + 0xE4, 0x41, 0x5A, 0x01, 0x53, 0x3B, 0x38, 0xB0, 0x66, 0x5F, 0x93, 0xFB, + 0xC8, 0xCA, 0xDE, 0x1E, 0x41, 0x91, 0x58, 0x6C, 0x23, 0x7D, 0x83, 0x29, + 0x4C, 0xD1, 0xB7, 0xAF, 0xBA, 0xF7, 0xC6, 0xF2, 0xD2, 0xE0, 0xDF, 0xC4, + 0x22, 0x2F, 0xE4, 0xB1, 0xA9, 0x11, 0x96, 0x60, 0xEC, 0xC2, 0x72, 0xC8, + 0x63, 0x20, 0x25, 0x35, 0x64, 0xCB, 0x45, 0xA5, 0x68, 0xD7, 0xA1, 0x83, + 0xF3, 0xFD, 0x3F, 0xFB, 0x10, 0xD0, 0x9F, 0x26, 0x74, 0x85, 0x80, 0xC2, + 0x39, 0xC6, 0x22, 0x08, 0xE9, 0x37, 0xE6, 0x05, 0x34, 0xF7, 0x21, 0x92, + 0x7C, 0x0B, 0x2B, 0x21, 0x97, 0x39, 0x6A, 0x5B, 0x63, 0x27, 0x47, 0x25, + 0x37, 0x9D, 0xBE, 0x47, 0x13, 0xAC, 0xEA, 0x77, 0xD2, 0xB3, 0x8C, 0x4E, + 0x0C, 0x59, 0x77, 0x0D, 0x68, 0x92, 0x18, 0xE8, 0xBC, 0x10, 0x58, 0x70, + 0xFC, 0x99, 0xF5, 0xCB, 0x25, 0x9D, 0xA9, 0xA4, 0xB8, 0xFC, 0x60, 0x25, + 0x28, 0xE9, 0x23, 0xBD, 0xF3, 0x54, 0x42, 0x0A, 0x9B, 0xF7, 0x7F, 0xB2, + 0x92, 0x59, 0xB0, 0xD2, 0x4A, 0xCB, 0x26, 0xCE, 0xD0, 0x1C, 0x37, 0x71, + 0xB7, 0x12, 0x0D, 0xBB, 0xD8, 0x87, 0x24, 0xFF, 0x4C, 0x6E, 0x85, 0xED, + 0x88, 0x0F, 0xBE, 0xF4, 0x42, 0x1A, 0x9A, 0x03, 0xFA, 0xCF, 0xD5, 0x2A, + 0xF3, 0x3E, 0x61, 0x47, 0x32, 0xB9, 0x43, 0xF5, 0x0A, 0xB0, 0x84, 0x11, + 0x69, 0xD8, 0x9F, 0x8D, 0xEF, 0xE7, 0x39, 0xE1, 0xE7, 0x77, 0xCD, 0x7E, + 0x05, 0xE3, 0x15, 0x7A, 0x48, 0x38, 0x47, 0xA4, 0xAB, 0x48, 0xE2, 0x70, + 0xB6, 0xC1, 0xB4, 0x49, 0xE1, 0x04, 0x20, 0xE0, 0xDE, 0xB2, 0x9D, 0x63, + 0xE2, 0x9C, 0x39, 0x7C, 0x65, 0x10, 0xBA, 0x7B, 0x6F, 0xAA, 0xCF, 0x7A, + 0xE4, 0xC6, 0x32, 0x7A, 0x0A, 0x01, 0x27, 0xAA, 0x4C, 0xB4, 0x4A, 0x76, + 0xD2, 0xB7, 0x0E, 0x28, 0xDE, 0xDB, 0x96, 0x4A, 0xC4, 0x59, 0x53, 0xDA, + 0x15, 0x75, 0x12, 0x46, 0x13, 0x45, 0xAC, 0x01, 0xE5, 0x3E, 0x5C, 0x2E, + 0x4D, 0xE3, 0x86, 0x9F, 0xFD, 0xEA, 0x15, 0xFE, 0x27, 0x96, 0x87, 0xFB, + 0x73, 0x57, 0xF4, 0x1D, 0x37, 0x8A, 0xA9, 0x20, 0x12, 0xA5, 0x37, 0x6A, + 0x81, 0x77, 0xF9, 0x19, 0x7E, 0xED, 0x2D, 0x04, 0xBE, 0x37, 0x6E, 0xC7, + 0xAA, 0x22, 0x90, 0x61, 0x3D, 0x3B, 0x90, 0xA9, 0x24, 0xBB, 0xF7, 0xE6, + 0x9F, 0x84, 0x7C, 0x61, 0x05, 0xEE, 0x19, 0xB1, 0xF6, 0x9B, 0x5A, 0xA7, + 0x73, 0x6B, 0x1D, 0x39, 0x94, 0xFA, 0x79, 0x92, 0xB8, 0x58, 0x9F, 0x42, + 0x20, 0xAA, 0x38, 0xF1, 0xF7, 0xE1, 0x0A, 0x34, 0x16, 0x80, 0x3E, 0x8D, + 0x7A, 0x37, 0x98, 0x5D, 0x45, 0x76, 0x10, 0x0F, 0x9B, 0xAD, 0x19, 0x93, + 0xD8, 0xE0, 0xD1, 0xA6, 0xA6, 0x9F, 0x69, 0xB5, 0x47, 0x3D, 0x06, 0x54, + 0x15, 0x18, 0xA1, 0x00, 0xAB, 0xA4, 0xC2, 0xB1, 0x38, 0xCE, 0xD0, 0x6F, + 0xDE, 0xBA, 0xDD, 0x08, 0x65, 0xFA, 0xA2, 0x92, 0x61, 0x4E, 0x33, 0x20, + 0x59, 0x54, 0x7A, 0x9F, 0xB1, 0x77, 0x0D, 0x71, 0xF6, 0x80, 0xED, 0xF1, + 0x79, 0x5E, 0x81, 0xFD, 0x50, 0x57, 0xAB, 0x8B, 0x3E, 0x84, 0xBB, 0xCB, + 0x25, 0x89, 0xA5, 0xC4, 0x66, 0x64, 0xD6, 0xDB, 0x85, 0x68, 0xD7, 0x02, + 0xD1, 0x43, 0xA8, 0xE9, 0xE4, 0x27, 0x99, 0x27, 0x8F, 0x69, 0x2F, 0x74, + 0x2A, 0xA4, 0xF7, 0x2E, 0x98, 0xE6, 0x63, 0x80, 0x24, 0x7D, 0xF6, 0x18, + 0x57, 0xE0, 0xEC, 0xF8, 0xEE, 0x25, 0xFE, 0xA0, 0x85, 0x7E, 0x3F, 0x0A, + 0xBE, 0xB9, 0x21, 0xCB, 0xBE, 0xEC, 0x7E, 0x46, 0x3A, 0x57, 0xB3, 0xDF, + 0xFC, 0x95, 0xC8, 0x92, 0x4D, 0x6B, 0x8C, 0x71, 0x55, 0xE3, 0x5E, 0x0D, + 0x0A, 0x47, 0xD1, 0xF7, 0xD0, 0x54, 0xC3, 0x64, 0xFA, 0xD2, 0xA2, 0x7B, + 0x78, 0xEF, 0x25, 0x7C, 0x1C, 0x5B, 0xE4, 0xA8, 0xD5, 0x12, 0xD1, 0x1A, + 0x26, 0xEF, 0xC1, 0xCA, 0xB7, 0x55, 0x2C, 0x44, 0xB7, 0x9B, 0x97, 0xD0, + 0x14, 0x88, 0x58, 0x77, 0x06, 0xBD, 0xDD, 0x6C, 0x20, 0x1A, 0x9D, 0xAB, + 0x23, 0xBB, 0x13, 0xEB, 0xEA, 0x76, 0x13, 0x4F, 0x91, 0xD2, 0xE6, 0xE6, + 0x0E, 0x73, 0x1D, 0xD5, 0xD3, 0xA0, 0xB9, 0x75, 0xD3, 0xB3, 0x27, 0x20, + 0xE6, 0xE7, 0xCF, 0x38, 0x3D, 0x7D, 0xB5, 0x41, 0x48, 0x2B, 0x90, 0x60, + 0xBE, 0x2F, 0xBE, 0x1D, 0x10, 0xD1, 0x62, 0x15, 0x60, 0x89, 0xFA, 0xF7, + 0x2F, 0x3A, 0xDC, 0xDA, 0x2E, 0x11, 0x10, 0x6D, 0xC0, 0x7C, 0xF5, 0x9D, + 0xE2, 0x40, 0x7C, 0x37, 0x3B, 0x32, 0xF6, 0xBB, 0xDC, 0x0B, 0xA3, 0x6D, + 0x77, 0xF1, 0x3B, 0x9F, 0xB0, 0x68, 0x94, 0xE4, 0x45, 0xB3, 0x32, 0xB2, + 0xA3, 0x08, 0x55, 0xA2, 0x06, 0xEF, 0xA9, 0x2A, 0x21, 0xEE, 0xD8, 0xA3, + 0x67, 0xDA, 0x2A, 0xAF, 0xE9, 0x48, 0x92, 0x1B, 0xC3, 0xAF, 0x1D, 0x20, + 0xCC, 0xC5, 0xD1, 0x3E, 0x01, 0xC7, 0xC1, 0x2F, 0x5E, 0xC6, 0x02, 0x33, + 0xB1, 0x2E, 0xBF, 0x22, 0x9B, 0xF1, 0x92, 0x60, 0xB9, 0xEC, 0xBF, 0xA7, + 0x24, 0xB9, 0xFF, 0xB8, 0xFB, 0xFA, 0x2A, 0x2A, 0xD7, 0x2D, 0x2F, 0x00, + 0x0A, 0x27, 0x86, 0xD9, 0x98, 0x9C, 0xC1, 0x50, 0x5C, 0x58, 0xA0, 0xBD, + 0x0D, 0x74, 0xC1, 0x58, 0x9A, 0x3A, 0x06, 0x4A, 0x5C, 0x47, 0x60, 0x2D, + 0xC3, 0x91, 0x17, 0xBF, 0xAA, 0x41, 0x44, 0xC0, 0x81, 0xE4, 0x69, 0x4B, + 0xF7, 0xA6, 0x4B, 0x25, 0x4B, 0x32, 0xE2, 0xF6, 0x9C, 0x16, 0x56, 0x01, + 0xD5, 0x13, 0xC8, 0x8F, 0xD0, 0x26, 0x2C, 0x78, 0xC5, 0xDB, 0x4A, 0x09, + 0xDC, 0x1E, 0x96, 0xE3, 0x9A, 0x6B, 0x78, 0x5D, 0x8E, 0x28, 0x93, 0xD9, + 0xA3, 0x8C, 0x07, 0x49, 0xF3, 0x05, 0x1B, 0xFE, 0x10, 0x3D, 0xA7, 0xDD, + 0xD9, 0x46, 0xBF, 0x1C, 0xFF, 0x73, 0x69, 0xB9, 0xA8, 0xC4, 0x5C, 0xBB, + 0x38, 0xCA, 0x14, 0x18, 0x85, 0x7F, 0x89, 0xAB, 0x3F, 0x76, 0x29, 0xAB, + 0x09, 0xCE, 0xB2, 0xCC, 0x7D, 0xF3, 0x5C, 0xDD, 0x0A, 0x4D, 0x1A, 0x56, + 0x17, 0x98, 0xB9, 0x91, 0x01, 0xAD, 0x84, 0x7D, 0x88, 0x48, 0x3C, 0x40, + 0x7D, 0xAA, 0x7B, 0x80, 0x2F, 0x7E, 0x65, 0x6F, 0x73, 0x7A, 0x06, 0xD4, + 0xEC, 0x44, 0x60, 0xD9, 0xF8, 0x40, 0x99, 0xAE, 0x3A, 0x11, 0x60, 0x52, + 0x98, 0x99, 0x9B, 0xD5, 0x52, 0xFD, 0x4E, 0x53, 0x48, 0x36, 0x5A, 0x4D, + 0xE4, 0xCC, 0x54, 0x61, 0xB3, 0x7B, 0x1A, 0xA6, 0x7C, 0x1D, 0x81, 0x3A, + 0x0D, 0xE7, 0xF6, 0x31, 0xFD, 0xFC, 0x7A, 0x65, 0x3F, 0xF7, 0xB7, 0xE0, + 0x28, 0xFB, 0x4C, 0x9D, 0xBD, 0x87, 0xE2, 0x35, 0x5A, 0xB7, 0x7F, 0x23, + 0xAF, 0xDA, 0xF6, 0x7A, 0xED, 0xA9, 0xDE, 0x56, 0x0E, 0xBB, 0xDC, 0xA2, + 0xE6, 0xA0, 0x97, 0x22, 0x1C, 0x02, 0x52, 0x65, 0xAC, 0xE2, 0x77, 0x6E, + 0x3E, 0x3B, 0xBC, 0x14, 0xE3, 0xC9, 0x22, 0x30, 0x2A, 0x17, 0xFF, 0x28, + 0xC2, 0x23, 0xB5, 0xE3, 0x3E, 0x3F, 0x92, 0xAC, 0xC8, 0x9D, 0x9F, 0xBD, + 0x8B, 0x3D, 0x83, 0xB7, 0x1F, 0x41, 0xCD, 0x93, 0x19, 0x0E, 0xA5, 0x0B, + 0xE3, 0x4A, 0x2F, 0xD6, 0x17, 0x10, 0x38, 0x58, 0x4F, 0xA2, 0x4F, 0x05, + 0x94, 0x1F, 0xF2, 0x27, 0x2C, 0x2A, 0xD4, 0x76, 0x17, 0xB2, 0xB1, 0x86, + 0xF2, 0xE8, 0x20, 0x47, 0xBA, 0x15, 0x85, 0x0B, 0x96, 0x7B, 0xA7, 0x00, + 0x76, 0x96, 0x25, 0x3B, 0x1A, 0x0A, 0x15, 0xEE, 0x06, 0x02, 0x0F, 0x8D, + 0x4A, 0x09, 0x2D, 0x42, 0x9B, 0xF2, 0xD4, 0x4D, 0x6D, 0xFB, 0xAD, 0xEA, + 0x67, 0xDF, 0x4C, 0x7B, 0x5A, 0xF6, 0x06, 0x3B, 0x89, 0x58, 0x12, 0xC5, + 0x55, 0xB3, 0xBD, 0x14, 0x3C, 0x0C, 0xB3, 0x92, 0x9B, 0x54, 0xEC, 0x58, + 0x55, 0x60, 0x2D, 0xC2, 0x8B, 0x29, 0x2C, 0x73, 0x22, 0x3A, 0xAA, 0x61, + 0xD3, 0x7A, 0x1B, 0x9D, 0x75, 0x15, 0x16, 0x1E, 0xDE, 0x03, 0x03, 0x05, + 0xC1, 0xED, 0x95, 0x29, 0x2F, 0xB8, 0x94, 0x97, 0x34, 0x66, 0xC4, 0xD7, + 0x64, 0x7D, 0x02, 0xA4, 0x90, 0x39, 0xAB, 0x08, 0xF1, 0x64, 0x34, 0x88, + 0x81, 0x5B, 0x30, 0x77, 0xBB, 0x76, 0x98, 0x45, 0x1B, 0xEB, 0x8A, 0xDD, + 0x2F, 0x50, 0x45, 0xFE, 0xBE, 0x4B, 0x36, 0xD3, 0xC4, 0x12, 0x13, 0x7A, + 0x7A, 0xDE, 0x26, 0xEE, 0xF6, 0x46, 0x6C, 0x05, 0x64, 0x0C, 0x3E, 0xD6, + 0x70, 0x8A, 0x70, 0xF8, 0x57, 0x8E, 0xF9, 0x59, 0x84, 0xE9, 0xE2, 0x76, + 0x36, 0x04, 0x6F, 0x1F, 0xB3, 0x5A, 0xE3, 0x06, 0xDA, 0x94, 0xB7, 0x4B, + 0x62, 0x94, 0xFB, 0x3D, 0x76, 0x6D, 0xDC, 0xC6, 0x31, 0xB3, 0x49, 0x2A, + 0x24, 0xD7, 0xCA, 0xD2, 0x1E, 0x5D, 0x88, 0xC7, 0x93, 0xB7, 0x4D, 0x57, + 0x0E, 0x23, 0x8B, 0xD3, 0x29, 0xA6, 0x55, 0x12, 0x8F, 0x09, 0x5F, 0x5A, + 0x18, 0xBD, 0x88, 0xB7, 0xD6, 0xC6, 0x51, 0xAE, 0xA5, 0x50, 0x0D, 0xB1, + 0x84, 0xE2, 0x8A, 0x28, 0xC5, 0x06, 0xF1, 0xB3, 0x2A, 0x3F, 0xF5, 0x4B, + 0xDC, 0x40, 0x6A, 0x5B, 0x9C, 0xF8, 0x24, 0xF8, 0x39, 0x68, 0x9E, 0x51, + 0x6D, 0xAF, 0xC0, 0x7B, 0x6B, 0xC1, 0x1D, 0x04, 0xB5, 0x92, 0x9D, 0x15, + 0xB7, 0x30, 0xBF, 0x95, 0xD2, 0xD2, 0x0A, 0x4D, 0x31, 0x37, 0x03, 0x4A, + 0x15, 0xF8, 0x09, 0x09, 0x5A, 0xD2, 0x8E, 0x27, 0xAF, 0xFA, 0x29, 0x01, + 0xAC, 0x32, 0xEF, 0xAB, 0x55, 0x2B, 0x1F, 0x2D, 0x51, 0x08, 0x8D, 0x23, + 0xA2, 0xF1, 0xC8, 0x50, 0xB0, 0xC2, 0x2F, 0xAE, 0x67, 0xAC, 0xB7, 0x3F, + 0x64, 0x48, 0x1E, 0xBD, 0x65, 0xF1, 0x0A, 0x93, 0xFE, 0xB3, 0x09, 0x07, + 0x75, 0x50, 0x46, 0xCC, 0xF2, 0xC0, 0xA4, 0x12, 0x3E, 0x2D, 0xF0, 0xC5, + 0x5B, 0x84, 0x1C, 0xFB, 0xA0, 0xAC, 0xC5, 0x98, 0x20, 0x10, 0xF7, 0x11, + 0x3F, 0x5F, 0x5E, 0x7B, 0x28, 0x02, 0x70, 0x46, 0x98, 0xD2, 0x96, 0xE8, + 0xC1, 0xF0, 0x82, 0xE3, 0x17, 0x89, 0x5E, 0x34, 0x2C, 0xA0, 0x4B, 0xEA, + 0x17, 0x89, 0xC1, 0x2E, 0xF4, 0xD9, 0x57, 0x31, 0x6B, 0x56, 0xCF, 0x05, + 0xF6, 0x32, 0x3E, 0xC6, 0x6C, 0xA2, 0x30, 0xFA, 0x28, 0x0E, 0x1D, 0x0D, + 0x8B, 0x64, 0x3A, 0x22, 0x73, 0xCD, 0x65, 0xB9, 0x5F, 0x4B, 0x20, 0xEE, + 0x21, 0x94, 0xC2, 0x8D, 0x4E, 0x5D, 0xF3, 0x8B, 0xA0, 0x3F, 0xF8, 0xC8, + 0x3C, 0xC3, 0xAD, 0x6D, 0x81, 0xA1, 0xE6, 0xF6, 0xE2, 0x74, 0x6D, 0x63, + 0x40, 0x1C, 0x17, 0x92, 0xC4, 0x47, 0xCE, 0x8D, 0x49, 0xC7, 0x09, 0x3C, + 0xC7, 0x05, 0x8B, 0x79, 0xCF, 0x3A, 0x14, 0x72, 0xD6, 0x4A, 0xC6, 0x5E, + 0xB6, 0x1B, 0x3C, 0x52, 0xA7, 0x84, 0x12, 0x02, 0x05, 0xE9, 0x54, 0x1C, + 0x61, 0x5F, 0x75, 0xB9, 0x3D, 0x67, 0xBF, 0x2B, 0x84, 0xAF, 0x1D, 0x73, + 0x13, 0x17, 0xE8, 0x77, 0x08, 0xCC, 0x86, 0xBB, 0x1C, 0xAB, 0x16, 0x5F, + 0x8A, 0xC2, 0xA9, 0xDC, 0x02, 0xE4, 0xC5, 0x0A, 0x49, 0x04, 0x05, 0xDB, + 0xD5, 0x3B, 0xF2, 0xE6, 0x9B, 0xA6, 0x9D, 0xC6, 0xE4, 0x60, 0xA7, 0x9A, + 0x4B, 0x65, 0xE0, 0x72, 0x95, 0xCD, 0x89, 0x0A, 0xEF, 0xE9, 0x33, 0x54, + 0x27, 0x8F, 0xC6, 0x32, 0xBF, 0x29, 0xC4, 0x5C, 0xBA, 0x37, 0xDE, 0xD7, + 0x43, 0x99, 0x27, 0xC3, 0x90, 0xEA, 0x1C, 0x5E, 0xE0, 0x4E, 0xBC, 0x68, + 0x82, 0x83, 0x82, 0x3D, 0xE8, 0x3B, 0xF5, 0x8A, 0xD1, 0x2B, 0xC8, 0xFB, + 0xC6, 0xF8, 0xAE, 0x1F, 0x8A, 0x39, 0x78, 0x94, 0x22, 0xE0, 0xCF, 0x7F, + 0xF2, 0xE2, 0x3D, 0x4C, 0x3F, 0x17, 0x7E, 0xA2, 0xFC, 0x51, 0x06, 0x28, + 0xC8, 0x4A, 0xD2, 0x93, 0x3C, 0xA5, 0x5F, 0x98, 0x37, 0x23, 0x81, 0x9B, + 0x4F, 0x66, 0x96, 0xED, 0x5D, 0x19, 0xFA, 0x74, 0xBC, 0x0E, 0xEA, 0x7E, + 0x7B, 0x75, 0x9C, 0x23, 0x49, 0x38, 0x06, 0x76, 0xDD, 0x48, 0x62, 0xCD, + 0xE4, 0xF1, 0x59, 0x21, 0x98, 0xCC, 0xFC, 0x72, 0x3E, 0xC4, 0xF2, 0xE1, + 0x3F, 0x57, 0x8B, 0x0F, 0x6A, 0xF7, 0xA2, 0xA5, 0xEC, 0x6E, 0x7C, 0x0C, + 0xC2, 0x1B, 0x4F, 0xD7, 0x16, 0xE8, 0x74, 0x60, 0x02, 0x61, 0x31, 0x56, + 0x28, 0x67, 0x18, 0x57, 0x15, 0x95, 0xE8, 0xBB, 0xF4, 0x97, 0xDC, 0xFC, + 0x92, 0xA1, 0x2E, 0x60, 0xFB, 0x8F, 0x3A, 0x7A, 0x54, 0xF1, 0x3C, 0x6B, + 0x43, 0xF9, 0x50, 0xF7, 0xF2, 0xC6, 0x11, 0xEA, 0x19, 0xE5, 0xF4, 0xD4, + 0x44, 0x27, 0xA9, 0xF1, 0x39, 0xCB, 0xCC, 0xFB, 0xFE, 0xDA, 0x98, 0xF5, + 0x1B, 0xFC, 0x94, 0xF8, 0xB1, 0x77, 0x1F, 0x70, 0x65, 0xAE, 0xB4, 0x13, + 0xA5, 0x83, 0xFD, 0x5A, 0xFC, 0xEC, 0xDA, 0x05, 0xE3, 0xA0, 0x6B, 0x3E, + 0xC1, 0xBA, 0x66, 0x2A, 0xD5, 0xD0, 0x69, 0x74, 0x2E, 0x13, 0x23, 0x75, + 0x3B, 0x29, 0xC7, 0x7D, 0xA3, 0xB5, 0x05, 0xAA, 0x61, 0xC9, 0xAD, 0xDA, + 0x83, 0x35, 0x40, 0xFA, 0x5F, 0x35, 0x13, 0x64, 0xBF, 0x31, 0xB8, 0xAB, + 0xF5, 0xAD, 0x23, 0xDA, 0xA9, 0x98, 0x01, 0x35, 0x1C, 0x83, 0x1D, 0xA4, + 0x4D, 0xD0, 0x73, 0x6B, 0x37, 0xF6, 0x7F, 0xBF, 0xDA, 0x92, 0x39, 0xC6, + 0x63, 0x7D, 0xF0, 0xA6, 0x27, 0xB9, 0x88, 0x6D, 0x6A, 0x30, 0xDA, 0xE0, + 0xEC, 0xA5, 0x73, 0x39, 0xE9, 0x12, 0x27, 0x90, 0xE3, 0x05, 0x6D, 0xEE, + 0x94, 0x25, 0x37, 0xFD, 0xD1, 0x6D, 0xC2, 0xD6, 0x58, 0x36, 0x57, 0xA0, + 0x5D, 0x2A, 0xA8, 0xE1, 0x20, 0x00, 0xB3, 0x78, 0x98, 0x97, 0x0A, 0x57, + 0x84, 0x74, 0x2E, 0x7B, 0x3B, 0x58, 0x67, 0x01, 0xED, 0xAF, 0x1B, 0x74, + 0xDF, 0x1A, 0xFE, 0x55, 0xC5, 0x20, 0x76, 0x6C, 0x94, 0x0C, 0x38, 0x65, + 0xF0, 0xA7, 0xC3, 0xBA, 0x08, 0xAD, 0xA4, 0x9C, 0xEB, 0xDF, 0x7C, 0x0D, + 0x44, 0xD4, 0x39, 0x43, 0xB0, 0xBF, 0x6A, 0x09, 0xEF, 0x85, 0xED, 0x36, + 0x67, 0x41, 0x53, 0x90, 0x9A, 0xB9, 0x5A, 0x35, 0x45, 0xB4, 0xCA, 0x4B, + 0x59, 0x13, 0xC7, 0x8F, 0xD4, 0x46, 0x6F, 0x86, 0x80, 0x0D, 0x0D, 0x95, + 0xAD, 0x87, 0x5A, 0xE0, 0xF0, 0x91, 0x42, 0x96, 0x12, 0x57, 0xBF, 0x33, + 0x18, 0xC1, 0x55, 0x12, 0xB6, 0x1D, 0xF3, 0x0F, 0xDA, 0x1B, 0x76, 0x2C, + 0x3B, 0x05, 0x34, 0x27, 0x26, 0xA5, 0xE7, 0xDD, 0xCF, 0x7F, 0x6A, 0x2C, + 0x8B, 0xA9, 0x05, 0x79, 0x0B, 0xC9, 0x1F, 0x7B, 0x6C, 0xFA, 0x48, 0x55, + 0xD1, 0x9A, 0xA4, 0x92, 0x55, 0xE9, 0xF6, 0x8F, 0x07, 0x55, 0x6B, 0x84, + 0xC5, 0xC5, 0xED, 0x1B, 0xC4, 0x9E, 0xD1, 0x24, 0x63, 0xCB, 0xF8, 0x9D, + 0x85, 0x2A, 0xCE, 0x17, 0xC3, 0x62, 0x71, 0xA7, 0xAB, 0x6F, 0xB2, 0xDA, + 0xDD, 0x5C, 0x71, 0xBC, 0x9D, 0x1C, 0x20, 0x0C, 0xB2, 0x6E, 0x0E, 0x11, + 0x8B, 0xB4, 0x8A, 0x7A, 0x8D, 0x11, 0x25, 0xB2, 0x41, 0xE3, 0x5D, 0x91, + 0x86, 0xF7, 0xC6, 0x34, 0x5C, 0xC3, 0x4E, 0x35, 0x67, 0x43, 0x29, 0x98, + 0xD6, 0x0C, 0xEF, 0xA5, 0x9E, 0x64, 0xAD, 0xB3, 0xB2, 0x23, 0x38, 0xD3, + 0x42, 0x76, 0xF2, 0x06, 0x0D, 0x0F, 0x0D, 0xA9, 0x74, 0x29, 0x0B, 0xB6, + 0x83, 0xA2, 0xF2, 0xFB, 0x4B, 0x86, 0xF9, 0xC5, 0x27, 0xCB, 0xE4, 0x85, + 0xC3, 0x67, 0xC1, 0x25, 0x75, 0xC5, 0x5F, 0x38, 0x87, 0xCB, 0x7C, 0xF1, + 0x15, 0xDC, 0x56, 0xF1, 0x9E, 0x05, 0x3E, 0x81, 0xF9, 0x39, 0x78, 0x8F, + 0x01, 0x81, 0xD8, 0xF8, 0x53, 0x69, 0x85, 0x8F, 0x67, 0xFC, 0x1A, 0xAB, + 0xBD, 0x68, 0xDE, 0x89, 0x3A, 0xF5, 0x0E, 0xD4, 0x3E, 0x15, 0x85, 0xD0, + 0x1A, 0x30, 0x64, 0x51, 0x9B, 0xEA, 0xE2, 0xCB, 0x83, 0xC7, 0xFD, 0xFD, + 0x44, 0xF6, 0x14, 0x67, 0x1C, 0x78, 0xBC, 0x00, 0x42, 0x18, 0xB7, 0x2F, + 0xB3, 0x9B, 0x78, 0x8D, 0x0C, 0x95, 0x70, 0x3A, 0x87, 0xAF, 0xD4, 0x33, + 0xAF, 0x57, 0xC1, 0x72, 0x4C, 0x5B, 0x1E, 0x4F, 0x16, 0x14, 0xA0, 0x24, + 0x86, 0x6E, 0xE6, 0x5F, 0x01, 0xCA, 0x2E, 0x57, 0x11, 0x4F, 0x2F, 0xF8, + 0xEB, 0x89, 0xAB, 0x74, 0x9E, 0x3B, 0x0E, 0x99, 0x60, 0x8D, 0x49, 0x21, + 0x00, 0xCC, 0x09, 0x97, 0x31, 0xF9, 0x09, 0xF3, 0xB6, 0x7D, 0x98, 0xC9, + 0x88, 0x55, 0x8E, 0x90, 0x1A, 0x0A, 0x5D, 0xD7, 0x6D, 0x0C, 0x3E, 0x86, + 0x7A, 0x15, 0xDD, 0x05, 0x60, 0xBB, 0xBB, 0xF6, 0xB7, 0x7C, 0xFA, 0x69, + 0x00, 0x76, 0xB5, 0x53, 0x1D, 0xC1, 0xB1, 0x3F, 0x6F, 0x92, 0xAD, 0x1A, + 0x2F, 0x93, 0xE3, 0xA4, 0x4A, 0x82, 0x54, 0x76, 0x91, 0x0A, 0xBF, 0x0A, + 0x78, 0xBC, 0xC1, 0x08, 0x3F, 0x21, 0x6F, 0xF5, 0x49, 0x6A, 0x4E, 0x53, + 0xA7, 0xDA, 0x2B, 0xDD, 0xFE, 0xC4, 0x74, 0x75, 0x89, 0xCB, 0xBC, 0xFF, + 0x63, 0x3D, 0x9F, 0xE6, 0x20, 0x9D, 0xD9, 0x8B, 0x56, 0x5A, 0xAB, 0xE6, + 0x10, 0x78, 0x7D, 0xE1, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0x24, 0x6C, + 0x46, 0xFF, 0xFA, 0x59, 0xBE, 0xA9, 0x0F, 0x76, 0x3B, 0xB7, 0x2D, 0x8A, + 0xE8, 0x8A, 0x65, 0x12, 0xEB, 0xA0, 0x9D, 0x67, 0xF9, 0x30, 0x00, 0x2E, + 0x67, 0x35, 0x1A, 0xD4, 0x0B, 0x03, 0x07, 0x82, 0xEF, 0x26, 0x65, 0x10, + 0x64, 0xD9, 0x53, 0x41, 0x4F, 0x0F, 0x5D, 0x2B, 0xD2, 0xAD, 0x82, 0x57, + 0xB0, 0x56, 0x7F, 0xD1, 0x18, 0xAF, 0x3C, 0xDF, 0xE3, 0x8F, 0x95, 0x88, + 0x2D, 0xC8, 0x34, 0xE8, 0x67, 0xCF, 0x9B, 0x33, 0x73, 0xCA, 0x6A, 0xD8, + 0x24, 0xAC, 0x53, 0xBC, 0x06, 0x9E, 0xA7, 0xED, 0x65, 0x8B, 0x5E, 0x6E, + 0x3D, 0xDD, 0x69, 0x81, 0xB2, 0x2F, 0xE7, 0x2D, 0x78, 0x31, 0xCA, 0x31, + 0x68, 0xF2, 0xAE, 0xB9, 0x4A, 0x3D, 0x44, 0x19, 0xFC, 0x07, 0x47, 0xCC, + 0xCE, 0xF0, 0x16, 0xC7, 0x90, 0xE6, 0xBC, 0x85, 0x0A, 0x87, 0x47, 0x0A, + 0x80, 0x9E, 0x48, 0xA8, 0x44, 0x18, 0x0A, 0x0F, 0x72, 0x09, 0x46, 0x9B, + 0x61, 0x42, 0xD2, 0x13, 0xE8, 0xD7, 0xBE, 0x02, 0xF1, 0x76, 0x54, 0x02, + 0xBF, 0xEB, 0x6A, 0x9C, 0x6A, 0x9D, 0xA1, 0xB1, 0x5E, 0x50, 0x1A, 0xC9, + 0x5C, 0x66, 0xCA, 0x16, 0x7A, 0x5E, 0xE4, 0x81, 0x75, 0x77, 0xB6, 0x41, + 0xDB, 0x6B, 0x79, 0x17, 0x4D, 0xFF, 0xDD, 0xE0, 0x07, 0x4A, 0x4D, 0xE6, + 0x38, 0xCF, 0xE1, 0xC8, 0x15, 0xCA, 0x8C, 0xE7, 0x37, 0x1F, 0x37, 0x60, + 0x7C, 0xB3, 0xF5, 0x9F, 0x45, 0x65, 0x37, 0xBB, 0x2B, 0x2D, 0x3E, 0xEC, + 0x89, 0x22, 0x32, 0xD9, 0x0E, 0x6B, 0x49, 0x0D, 0x2E, 0xC2, 0x4C, 0xE1, + 0xA4, 0xFB, 0x6C, 0xDA, 0xBE, 0x08, 0x87, 0x01, 0xB1, 0x7A, 0x0F, 0x76, + 0x5B, 0x52, 0x01, 0x01, 0x59, 0x5A, 0x0D, 0xD9, 0x3B, 0x80, 0x87, 0x70, + 0xA0, 0x81, 0xC3, 0x84, 0x6F, 0x3F, 0x1F, 0x22, 0xA1, 0xE6, 0x45, 0xA7, + 0x72, 0x71, 0xF4, 0xAF, 0x8C, 0x8A, 0x48, 0xE6, 0xE7, 0xF5, 0x3F, 0x7D, + 0xE4, 0xC8, 0xFB, 0x5E, 0xEF, 0x37, 0xD9, 0xAD, 0x3E, 0x34, 0x9E, 0xD9, + 0xE3, 0x8A, 0xC1, 0x16, 0xB4, 0xF2, 0x7B, 0x3A, 0x03, 0x13, 0xA6, 0xC1, + 0x65, 0x3B, 0xFE, 0x28, 0x56, 0x54, 0x61, 0xE4, 0x25, 0x59, 0x48, 0x28, + 0xE2, 0x62, 0x5B, 0xB4, 0x5C, 0xC0, 0x45, 0x39, 0x9F, 0x4E, 0xB1, 0xB6, + 0xA4, 0xF2, 0x4C, 0x10, 0x73, 0x8C, 0xB8, 0x2D, 0xEF, 0x91, 0xE7, 0x9C, + 0x93, 0x9E, 0xDD, 0xF8, 0xAB, 0x4B, 0xF9, 0x92, 0xFB, 0x0B, 0xAE, 0x98, + 0x0F, 0xC0, 0xDF, 0x66, 0xF6, 0x54, 0xB1, 0x33, 0xD3, 0x21, 0x8E, 0x53, + 0xB9, 0x37, 0x7D, 0xD1, 0x86, 0x8A, 0x6F, 0x71, 0x60, 0x83, 0x29, 0x03, + 0x57, 0x51, 0x11, 0x1B, 0xB9, 0x44, 0x6F, 0x72, 0x56, 0x83, 0x97, 0xA0, + 0x25, 0x63, 0xB9, 0xA1, 0x73, 0xE7, 0x24, 0x5E, 0x38, 0x88, 0x17, 0x1E, + 0x2F, 0xFC, 0x1F, 0xDF, 0xFC, 0x66, 0xFA, 0xF6, 0x14, 0xE1, 0xDE, 0xDA, + 0x39, 0x3E, 0x75, 0x8A, 0x82, 0xFB, 0xB7, 0xDA, 0x31, 0xC9, 0x56, 0xA7, + 0x3D, 0x25, 0xE8, 0x22, 0xB8, 0x49, 0x26, 0x32, 0x8C, 0xC6, 0x6A, 0x13, + 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0x42, 0x78, 0x93, 0xFF, 0x00, + 0xB0, 0xA6, 0x2C, 0x53, 0x60, 0x86, 0x69, 0x00, 0x03, 0xBD, 0xBC, 0x12, + 0xEA, 0xFE, 0x8F, 0xFE, 0x01, 0xEA, 0x9E, 0x19, 0x51, 0x56, 0x3B, 0xA3, + 0xC4, 0xFB, 0xF1, 0xDC, 0x98, 0x55, 0x31, 0x29, 0x23, 0xDE, 0x20, 0x0F, + 0x2C, 0x01, 0xBD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x61, 0x74, 0x44, + 0x7F, 0x00, 0x40, 0xAE, 0x4A, 0xAA, 0xA1, 0x12, 0xE0, 0x82, 0xFC, 0x2D, + 0x18, 0x08, 0x1F, 0x0A, 0x2F, 0xE7, 0xA2, 0xD6, 0x13, 0x07, 0x34, 0xD0, + 0x35, 0x31, 0x43, 0xBB, 0x59, 0x8B, 0xC2, 0x56, 0x27, 0x30, 0xE6, 0x00, + 0x3E, 0x60, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x63, 0x6A, 0x44, 0x7F, + 0x00, 0x40, 0x55, 0x93, 0xE1, 0xE5, 0x2E, 0x97, 0x07, 0x00, 0x00, 0x94, + 0x82, 0x28, 0xE2, 0xE9, 0x67, 0x5A, 0xF4, 0x50, 0x04, 0xDD, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9A, 0x68, 0x49, 0xA8, 0x41, 0x68, 0x99, 0x4C, 0x08, + 0xDF, 0xFA, 0x58, 0x00, 0x01, 0x94, 0x21, 0xB2, 0x10, 0x44, 0xD4, 0x4F, + 0xA1, 0xD0, 0xBC, 0xE7, 0x5C, 0xBA, 0xE1, 0x84, 0x0E, 0x48, 0x96, 0xB6, + 0x79, 0xE7, 0x9E, 0x4F, 0x0A, 0x8A, 0xE2, 0x19, 0x0B, 0xD1, 0x7C, 0x2B, + 0x7B, 0xC2, 0xA6, 0x2B, 0xC0, 0x2A, 0x76, 0xAB, 0xB0, 0x49, 0x03, 0x04, + 0x77, 0xCB, 0x50, 0xBA, 0xEB, 0x8B, 0x66, 0x01, 0x58, 0xA8, 0xA1, 0xE6, + 0xD5, 0x08, 0xF0, 0xF9, 0x55, 0x50, 0xCE, 0x29, 0x58, 0xE7, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9E, 0x86, 0x45, 0x11, 0x2C, 0x9F, 0x00, 0x05, 0xF1, + 0xF6, 0x98, 0xA0, 0xA9, 0xC6, 0xB9, 0x00, 0x00, 0x04, 0x5D, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9E, 0xA5, 0x74, 0x44, 0x7F, 0x00, 0x07, 0x5A, 0xC5, + 0x3B, 0x30, 0xFD, 0x00, 0x00, 0x03, 0x00, 0x71, 0xC1, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x9E, 0xA7, 0x6A, 0x44, 0x7F, 0x00, 0x07, 0x52, 0xD5, 0x12, + 0x05, 0x20, 0x00, 0x00, 0x32, 0xA0, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, + 0xAC, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, + 0x01, 0x8C, 0xC9, 0x7F, 0x00, 0xBA, 0x6C, 0x10, 0xB1, 0x70, 0x7E, 0xBC, + 0x18, 0x70, 0x13, 0x44, 0x3C, 0x54, 0x00, 0x00, 0x12, 0x70, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9E, 0xCA, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x07, 0xBC, + 0x87, 0x72, 0xCC, 0x4A, 0x70, 0x00, 0x2B, 0x61, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9E, 0xE9, 0x74, 0x44, 0x7F, 0x00, 0x0A, 0x20, 0x3E, 0x30, 0x00, + 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xEB, 0x6A, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9A, 0xF0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, + 0xDF, 0xFA, 0x58, 0x00, 0x01, 0x94, 0x94, 0xE5, 0x47, 0xB3, 0x3E, 0xC0, + 0x06, 0xEC, 0x22, 0x1B, 0x59, 0xC0, 0x97, 0x81, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9F, 0x0E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x07, 0xEC, 0x5C, 0xF9, + 0x10, 0x7F, 0x8B, 0x32, 0xD0, 0x02, 0xA7, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9F, 0x2D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0xEA, 0x29, + 0xAC, 0x1B, 0x51, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x2F, 0x6A, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9B, 0x34, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, + 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x65, 0x1F, 0x0C, 0xB0, + 0x06, 0xF9, 0x55, 0x6B, 0x34, 0xE0, 0x0B, 0xD8, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9F, 0x52, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x50, 0xE6, 0xC4, 0x70, 0x3E, 0x61, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9F, 0x71, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x02, 0x9A, 0x0F, + 0x8C, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x73, 0x6A, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x02, 0x96, 0xBD, 0x90, 0x2E, 0xE0, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9B, 0x78, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, + 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x96, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9F, 0xB5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, + 0xB7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0xBC, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0xDA, 0x45, + 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, + 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xF9, 0x74, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9F, 0xFB, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0xE0, 0x49, 0xA8, + 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, + 0x1E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, + 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x3D, 0x74, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9E, 0x3F, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0x24, + 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9E, 0x42, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x61, + 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x63, 0x6A, 0x44, 0x7F, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, + 0x9A, 0x68, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9E, 0x86, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, + 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9E, 0xA5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xA7, 0x6A, 0x44, 0x7F, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9A, 0xAC, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, + 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0xCA, 0x45, 0x15, 0x2C, 0x9F, 0x00, + 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x9E, 0xE9, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xEB, 0x6A, + 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9A, 0xF0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, + 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x0E, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9F, 0x2D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, + 0x2F, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0x34, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x52, 0x45, + 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, + 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x71, 0x74, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9F, 0x73, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0x78, 0x49, 0xA8, + 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, + 0x96, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, + 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xB5, 0x74, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9F, 0xB7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0xBC, + 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9F, 0xDA, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xF9, + 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xFB, 0x6A, 0x44, 0x7F, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, + 0x9B, 0xE0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9E, 0x1E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, + 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9E, 0x3D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x3F, 0x6A, 0x44, 0x7F, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9A, 0x24, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, + 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0x42, 0x45, 0x15, 0x2C, 0x9F, 0x00, + 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x9E, 0x61, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x63, 0x6A, + 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9A, 0x68, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, + 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0x86, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9E, 0xA5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, + 0xA7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0xAC, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0xCA, 0x45, + 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, + 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xE9, 0x74, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9E, 0xEB, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0xF0, 0x49, 0xA8, + 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, + 0x0E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, + 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x2D, 0x74, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9F, 0x2F, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0x34, + 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9F, 0x52, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x71, + 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x73, 0x6A, 0x44, 0x7F, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, + 0x9B, 0x78, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9F, 0x96, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, + 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9F, 0xB5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xB7, 0x6A, 0x44, 0x7F, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9B, 0xBC, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, + 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0xDA, 0x45, 0x15, 0x2C, 0x9F, 0x00, + 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x9F, 0xF9, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xFB, 0x6A, + 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9B, 0xE0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, + 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0x1E, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9E, 0x3D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, + 0x3F, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0x24, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0x42, 0x45, + 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, + 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x61, 0x74, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9E, 0x63, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0x68, 0x49, 0xA8, + 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, + 0x86, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, + 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xA5, 0x74, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9E, 0xA7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0xAC, + 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9E, 0xCA, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xE9, + 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xEB, 0x6A, 0x44, 0x7F, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, + 0x9A, 0xF0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9F, 0x0E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, + 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9F, 0x2D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x2F, 0x6A, 0x44, 0x7F, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9B, 0x34, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, + 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x52, 0x45, 0x15, 0x2C, 0x9F, 0x00, + 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x9F, 0x71, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x73, 0x6A, + 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9B, 0x78, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, + 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x96, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9F, 0xB5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, + 0xB7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0xBC, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0xDA, 0x45, + 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, + 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xF9, 0x74, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9F, 0xFB, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0xE0, 0x49, 0xA8, + 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, + 0x1E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, + 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x3D, 0x74, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9E, 0x3F, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0x24, + 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9E, 0x42, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x61, + 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x63, 0x6A, 0x44, 0x7F, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, + 0x9A, 0x68, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9E, 0x86, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, + 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9E, 0xA5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xA7, 0x6A, 0x44, 0x7F, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9A, 0xAC, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, + 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0xCA, 0x45, 0x15, 0x2C, 0x9F, 0x00, + 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x9E, 0xE9, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xEB, 0x6A, + 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9A, 0xF0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, + 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x0E, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9F, 0x2D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, + 0x2F, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0x34, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x52, 0x45, + 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, + 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x71, 0x74, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9F, 0x73, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0x78, 0x49, 0xA8, + 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, + 0x96, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, + 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xB5, 0x74, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9F, 0xB7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0xBC, + 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9F, 0xDA, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xF9, + 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xFB, 0x6A, 0x44, 0x7F, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, + 0x9B, 0xE0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9E, 0x1E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, + 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9E, 0x3D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x3F, 0x6A, 0x44, 0x7F, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9A, 0x24, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, + 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0x42, 0x45, 0x15, 0x2C, 0x9F, 0x00, + 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x9E, 0x61, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x63, 0x6A, + 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9A, 0x68, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, + 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0x86, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9E, 0xA5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, + 0xA7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0xAC, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0xCA, 0x45, + 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, + 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xE9, 0x74, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9E, 0xEB, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0xF0, 0x49, 0xA8, + 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, + 0x0E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, + 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x2D, 0x74, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9F, 0x2F, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0x34, + 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9F, 0x52, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x71, + 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x73, 0x6A, 0x44, 0x7F, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, + 0x9B, 0x78, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9F, 0x96, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, + 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9F, 0xB5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xB7, 0x6A, 0x44, 0x7F, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9B, 0xBC, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, + 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0xDA, 0x45, 0x15, 0x2C, 0x9F, 0x00, + 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x9F, 0xF9, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xFB, 0x6A, + 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9B, 0xE0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, + 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0x1E, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9E, 0x3D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, + 0x3F, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0x24, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, 0x42, 0x45, + 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, + 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x61, 0x74, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9E, 0x63, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0x68, 0x49, 0xA8, + 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, + 0x86, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, + 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xA5, 0x74, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9E, 0xA7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0xAC, + 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9E, 0xCA, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xE9, + 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xEB, 0x6A, 0x44, 0x7F, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x41, + 0x9A, 0xF0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, 0xFA, 0x58, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9F, 0x0E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, + 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9F, 0x2D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x2F, 0x6A, 0x44, 0x7F, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9B, 0x34, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xDF, + 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x52, 0x45, 0x15, 0x2C, 0x9F, 0x00, + 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x9F, 0x71, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x73, 0x6A, + 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9B, 0x78, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, + 0x08, 0xDF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x96, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9F, 0xB5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, + 0xB7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0xBC, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0xBF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0xDA, 0x45, + 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, + 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0xF9, 0x74, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9F, 0xFB, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0xE0, 0x49, 0xA8, + 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xBF, 0xFA, 0x58, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x9D, 0x81, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9E, + 0x1E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, + 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x3D, 0x74, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9E, 0x3F, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9A, 0x24, + 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0xBF, 0xFA, 0x58, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9E, 0x42, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, + 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x61, + 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0x63, 0x6A, 0x44, 0x7F, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, + 0x9A, 0x68, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x08, 0x9F, 0xF3, 0x20, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9E, 0x86, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, 0x02, + 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, + 0xA5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xA7, 0x6A, 0x44, 0x7F, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, + 0x41, 0x9A, 0xAC, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x09, 0xFF, 0xE4, + 0x40, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x04, 0x9C, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9E, 0xCA, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, 0x03, + 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x9E, 0xE9, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9E, 0xEB, 0x6A, 0x44, 0x7F, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, + 0x01, 0x41, 0x9A, 0xF0, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x09, 0x7F, + 0x87, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x11, 0xB1, 0x00, + 0x00, 0x00, 0x01, 0x41, 0x9F, 0x0E, 0x45, 0x15, 0x2C, 0x9F, 0x00, 0x00, + 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x9F, 0x2D, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x2F, 0x6A, 0x44, + 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x9B, 0x34, 0x49, 0xA8, 0x41, 0x6C, 0x99, 0x4C, 0x0B, + 0xFF, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x20, + 0xE0, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x52, 0x45, 0x15, 0x2C, 0x9F, + 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8D, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x9F, 0x71, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, 0x73, + 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0x78, 0x49, 0xA8, 0x41, 0x6C, 0x99, + 0x4C, 0x09, 0x3F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x01, 0xE1, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9F, 0x96, 0x45, 0x15, 0x2C, + 0x9F, 0x00, 0x00, 0x03, 0x02, 0xFA, 0xBD, 0x4E, 0x00, 0x04, 0x8C, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x9F, 0xB5, 0x74, 0x44, 0x7F, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9F, + 0xB7, 0x6A, 0x44, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, + 0xFD, 0x00, 0x00, 0x00, 0x01, 0x41, 0x9B, 0xB9, 0x49, 0xA8, 0x41, 0x6C, + 0x99, 0x4C, 0x08, 0x8F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x07, 0x1C +}; diff --git a/src/lib/CherryUSB/demo/cherryusb_mjpeg.h b/src/lib/CherryUSB/demo/cherryusb_mjpeg.h new file mode 100644 index 000000000..ce92b4adc --- /dev/null +++ b/src/lib/CherryUSB/demo/cherryusb_mjpeg.h @@ -0,0 +1,2067 @@ +const unsigned char cherryusb_mjpeg[24775] = { + 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, + 0x01, 0x02, 0x00, 0x1D, 0x00, 0x1A, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, + 0x00, 0x14, 0x0E, 0x0F, 0x12, 0x0F, 0x0D, 0x14, 0x12, 0x10, 0x12, 0x17, + 0x15, 0x14, 0x18, 0x1E, 0x32, 0x21, 0x1E, 0x1C, 0x1C, 0x1E, 0x3D, 0x2C, + 0x2E, 0x24, 0x32, 0x49, 0x40, 0x4C, 0x4B, 0x47, 0x40, 0x46, 0x45, 0x50, + 0x5A, 0x73, 0x62, 0x50, 0x55, 0x6D, 0x56, 0x45, 0x46, 0x64, 0x88, 0x65, + 0x6D, 0x77, 0x7B, 0x81, 0x82, 0x81, 0x4E, 0x60, 0x8D, 0x97, 0x8C, 0x7D, + 0x96, 0x73, 0x7E, 0x81, 0x7C, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x15, 0x17, + 0x17, 0x1E, 0x1A, 0x1E, 0x3B, 0x21, 0x21, 0x3B, 0x7C, 0x53, 0x46, 0x53, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7C, 0x7C, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x01, 0xE0, 0x02, 0x80, 0x03, + 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, + 0x1B, 0x00, 0x01, 0x00, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x02, 0x04, 0x05, + 0x06, 0x07, 0xFF, 0xC4, 0x00, 0x46, 0x10, 0x00, 0x01, 0x02, 0x02, 0x05, + 0x07, 0x08, 0x08, 0x06, 0x02, 0x01, 0x05, 0x01, 0x00, 0x03, 0x00, 0x01, + 0x00, 0x02, 0x03, 0x04, 0x05, 0x11, 0x12, 0x15, 0x91, 0x16, 0x21, 0x51, + 0x53, 0x54, 0x92, 0xB1, 0x13, 0x14, 0x31, 0x34, 0x52, 0x72, 0x73, 0xA1, + 0x06, 0x33, 0x35, 0x41, 0x93, 0xA2, 0xC1, 0xE1, 0x22, 0x32, 0x44, 0x61, + 0x71, 0x81, 0x63, 0x82, 0x23, 0x24, 0x42, 0x62, 0x83, 0xD1, 0xF0, 0x43, + 0xB2, 0xF1, 0xFF, 0xC4, 0x00, 0x19, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x03, 0x04, 0x05, 0xFF, 0xC4, 0x00, 0x23, 0x11, 0x01, 0x00, + 0x02, 0x02, 0x01, 0x04, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x11, 0x02, 0x12, 0x51, 0x21, 0x31, 0x32, 0xB1, + 0x13, 0x14, 0x61, 0x03, 0x04, 0x41, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, + 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xC7, 0x73, 0x8D, 0xA3, + 0x9C, 0xF4, 0xAA, 0x5A, 0x76, 0x93, 0x8A, 0x3B, 0xF3, 0x1F, 0xE5, 0x51, + 0x79, 0x9F, 0x6A, 0x65, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, + 0x54, 0x44, 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, + 0x44, 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, 0x44, + 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, 0x44, 0x2D, + 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, 0x44, 0x2D, 0x5B, + 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, 0x44, 0x2D, 0x5B, 0x4E, + 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, 0x44, 0x2D, 0x5B, 0x4E, 0xD2, + 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, 0x44, 0x2D, 0x5B, 0x4E, 0xD2, 0x71, + 0x4B, 0x4E, 0xD2, 0x71, 0x54, 0x44, 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, + 0x4E, 0xD2, 0x71, 0x54, 0x44, 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, + 0xD2, 0x71, 0x54, 0x44, 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, + 0x71, 0x54, 0x44, 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, + 0x54, 0x44, 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, + 0x44, 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, 0x44, + 0x2D, 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x54, 0x44, 0x2D, + 0x5B, 0x4E, 0xD2, 0x71, 0x4B, 0x4E, 0xD2, 0x71, 0x59, 0x8F, 0x64, 0x09, + 0x46, 0x43, 0x6C, 0x58, 0x5C, 0xB4, 0x57, 0xB4, 0x39, 0xD5, 0xB8, 0x80, + 0xD0, 0x7A, 0x06, 0x6F, 0x7A, 0xAC, 0x28, 0x52, 0xB1, 0xE6, 0xE5, 0x84, + 0x30, 0x43, 0x62, 0x1A, 0x9F, 0x0C, 0x93, 0xF8, 0x7F, 0xB5, 0x69, 0x8D, + 0xFF, 0x00, 0xEB, 0x0A, 0xD3, 0xB4, 0x9C, 0x52, 0xD3, 0xB4, 0x9C, 0x56, + 0x44, 0x49, 0x28, 0xAC, 0x63, 0xDF, 0xF8, 0x08, 0x67, 0xE6, 0x68, 0x70, + 0x25, 0xBF, 0xC8, 0x48, 0x72, 0x31, 0x9E, 0xD6, 0x9F, 0xC0, 0xD2, 0xFC, + 0xEC, 0x6B, 0x9E, 0x01, 0x77, 0xF0, 0x12, 0x97, 0x78, 0xE5, 0x8F, 0x69, + 0xDA, 0x4E, 0x29, 0x69, 0xDA, 0x4E, 0x2A, 0x68, 0x52, 0x71, 0xA2, 0x87, + 0x90, 0x03, 0x43, 0x1D, 0x65, 0xC5, 0xC6, 0xAB, 0x27, 0xF7, 0x55, 0xE6, + 0x71, 0x44, 0x1E, 0x58, 0xD8, 0x10, 0xC8, 0x24, 0x12, 0xE1, 0x9E, 0xA3, + 0x56, 0x6D, 0x3D, 0x09, 0x46, 0xF1, 0xCA, 0x0B, 0x4E, 0xD2, 0x71, 0x4B, + 0x4E, 0xD2, 0x71, 0x52, 0xF3, 0x48, 0xBC, 0xE7, 0x9B, 0xD9, 0x1C, 0xA7, + 0xF3, 0x9B, 0xA2, 0xBE, 0x9F, 0xE1, 0x5F, 0x16, 0x0B, 0x1B, 0x23, 0x06, + 0x28, 0x1F, 0x8D, 0xCE, 0x70, 0x26, 0xBE, 0x9A, 0xAA, 0x4A, 0x37, 0x86, + 0x3D, 0xA7, 0x69, 0x38, 0xA5, 0xA7, 0x69, 0x38, 0xAC, 0x86, 0xC1, 0x61, + 0xA3, 0xCC, 0x53, 0x99, 0xFC, 0xB0, 0x65, 0x75, 0xFB, 0xAA, 0x59, 0x13, + 0x30, 0x60, 0xCA, 0xC5, 0xB0, 0xE9, 0x47, 0xBE, 0x18, 0xAB, 0xFE, 0x52, + 0xE3, 0xF8, 0xBF, 0x71, 0xEE, 0x4A, 0x4F, 0x93, 0xAD, 0x35, 0xF6, 0x9D, + 0xA4, 0xE2, 0x96, 0x9D, 0xA4, 0xE2, 0xB3, 0xA5, 0xE0, 0x40, 0x26, 0x69, + 0xC1, 0xA6, 0x3B, 0x21, 0x80, 0x59, 0xD2, 0x2B, 0xCE, 0xA8, 0xF8, 0x30, + 0x9F, 0x29, 0x16, 0x2F, 0x20, 0xE9, 0x77, 0x30, 0x8A, 0xAB, 0x71, 0x21, + 0xF5, 0xFB, 0xB3, 0xAB, 0x49, 0xF2, 0x75, 0xA6, 0x15, 0xA7, 0x69, 0x38, + 0xA5, 0xA7, 0x69, 0x38, 0xAA, 0x22, 0xCB, 0xA5, 0xAB, 0x69, 0xDA, 0x4E, + 0x29, 0x69, 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x29, + 0x69, 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x29, 0x69, + 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x29, 0x69, 0xDA, + 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x29, 0x69, 0xDA, 0x4E, + 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x29, 0x69, 0xDA, 0x4E, 0x2A, + 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x29, 0x69, 0xDA, 0x4E, 0x2A, 0x88, + 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x29, 0x69, 0xDA, 0x4E, 0x2A, 0x88, 0x85, + 0xAB, 0x69, 0xDA, 0x4E, 0x29, 0x69, 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, + 0x69, 0xDA, 0x4E, 0x29, 0x69, 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, + 0xDA, 0x4E, 0x29, 0x69, 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, + 0x4E, 0x29, 0x69, 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, + 0x29, 0x69, 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x29, + 0x69, 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x29, 0x69, + 0xDA, 0x4E, 0x2A, 0x88, 0x85, 0xAB, 0x69, 0xDA, 0x4E, 0x2A, 0xAD, 0x71, + 0xB4, 0x33, 0x9E, 0x95, 0x6A, 0xAB, 0x7F, 0x30, 0xFE, 0x50, 0x89, 0x1D, + 0xF9, 0x8F, 0xF2, 0xA8, 0xAA, 0xEF, 0xCC, 0x7F, 0x95, 0x44, 0x24, 0x44, + 0x45, 0x50, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x19, 0xD1, 0x9A, 0xC9, 0xD6, 0xC3, 0x88, 0xD8, 0xD0, + 0xD9, 0x10, 0x30, 0x35, 0xED, 0x88, 0xEB, 0x39, 0xC7, 0xBC, 0x15, 0x74, + 0x13, 0x2D, 0x2D, 0x35, 0x2A, 0x03, 0xDA, 0xE7, 0x35, 0xD5, 0xC5, 0x88, + 0x09, 0xB3, 0xFC, 0x05, 0xAF, 0x45, 0x6D, 0x8D, 0x3A, 0x55, 0xF4, 0x65, + 0x4B, 0x44, 0x6B, 0x44, 0xD5, 0xA7, 0x00, 0x5F, 0x0C, 0x81, 0x5F, 0xBC, + 0xD6, 0x16, 0x5B, 0xA2, 0xB2, 0x3F, 0x25, 0x11, 0xAE, 0x96, 0x68, 0x0C, + 0x68, 0x77, 0x29, 0xF9, 0x9A, 0x47, 0xED, 0xEF, 0x5A, 0xA4, 0x4B, 0x27, + 0x08, 0x99, 0xB6, 0x74, 0x69, 0x86, 0xC4, 0x96, 0x99, 0xFC, 0x60, 0xB9, + 0xF1, 0x83, 0x86, 0x6A, 0xAB, 0x19, 0xF3, 0xD4, 0xA2, 0x98, 0x88, 0xD7, + 0x4A, 0x4A, 0xB1, 0xAE, 0xAC, 0xB1, 0xAE, 0xAC, 0x68, 0xAD, 0xC5, 0x63, + 0x22, 0x96, 0x46, 0x11, 0x0D, 0x9F, 0x2A, 0xD1, 0x47, 0x09, 0x8F, 0xFF, + 0x00, 0x98, 0xB7, 0x90, 0x1F, 0xC6, 0x9C, 0x33, 0x28, 0x59, 0x62, 0x62, + 0x45, 0x90, 0x79, 0x56, 0x43, 0x89, 0x0D, 0xE4, 0xD4, 0xF3, 0x50, 0x70, + 0x3F, 0xBA, 0xC7, 0x8B, 0x1E, 0x24, 0x60, 0xC0, 0xF2, 0x2A, 0x60, 0xA9, + 0xA0, 0x00, 0x00, 0xC1, 0x44, 0xAD, 0xA4, 0x60, 0xCD, 0x88, 0x61, 0x40, + 0x93, 0x6C, 0xB9, 0x88, 0xD8, 0xAE, 0x31, 0x43, 0xDD, 0x60, 0xD6, 0x00, + 0xAA, 0xAA, 0xAB, 0xD2, 0xA5, 0x60, 0x7C, 0x27, 0xD7, 0x29, 0x3C, 0xC6, + 0xC1, 0x26, 0xB0, 0x1C, 0xFA, 0xAA, 0x1F, 0xBB, 0x56, 0xB5, 0x12, 0xD7, + 0x46, 0xD1, 0x91, 0xE1, 0x18, 0xF3, 0xA6, 0x04, 0x56, 0xC1, 0x11, 0x00, + 0x0C, 0x75, 0x76, 0x73, 0xD7, 0x9F, 0xF8, 0xF7, 0xAB, 0x0C, 0x5B, 0x12, + 0xD1, 0x9B, 0x31, 0x34, 0xD9, 0x8B, 0x4D, 0xA9, 0x8C, 0x0E, 0x2E, 0xA8, + 0xE9, 0xAC, 0xF4, 0x2D, 0x72, 0x25, 0xA7, 0xC7, 0x02, 0x22, 0x28, 0xE8, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0xAB, 0x7F, 0x30, 0xFE, 0x55, 0x15, 0x5B, 0xF9, 0x87, 0xF2, + 0xA2, 0xC7, 0x76, 0xF2, 0x17, 0xA3, 0xED, 0x8D, 0x09, 0x91, 0x39, 0xC9, + 0x16, 0xDA, 0x1D, 0x55, 0x8E, 0x8A, 0xFF, 0x00, 0xB5, 0x7E, 0x4D, 0xB7, + 0x6A, 0x3B, 0x9F, 0x75, 0xB7, 0x94, 0xEA, 0x70, 0x7C, 0x36, 0xF0, 0x5A, + 0x53, 0x49, 0xCD, 0x57, 0xEB, 0x06, 0xE8, 0x5D, 0x27, 0x5C, 0x7B, 0xBE, + 0x66, 0x7F, 0xE9, 0xCF, 0x19, 0xEF, 0xE9, 0x7E, 0x4D, 0xB7, 0x6A, 0x3B, + 0x9F, 0x74, 0xC9, 0xB6, 0xED, 0x47, 0x73, 0xEE, 0xAC, 0xBD, 0x26, 0xF5, + 0x83, 0x74, 0x25, 0xE9, 0x37, 0xAC, 0x1B, 0xA1, 0x67, 0x6C, 0x38, 0x63, + 0xED, 0xE7, 0xCF, 0xA5, 0xF9, 0x36, 0xDD, 0xA8, 0xEE, 0x7D, 0xD3, 0x26, + 0xDB, 0xB5, 0x1D, 0xCF, 0xBA, 0xB2, 0xF4, 0x9B, 0xD6, 0x0D, 0xD0, 0x97, + 0xA4, 0xDE, 0xB0, 0x6E, 0x84, 0xDB, 0x0E, 0x0F, 0xB7, 0x9F, 0x3E, 0x97, + 0xE4, 0xDB, 0x76, 0xA3, 0xB9, 0xF7, 0x4C, 0x9B, 0x6E, 0xD4, 0x77, 0x3E, + 0xEA, 0xCB, 0xD2, 0x6F, 0x58, 0x37, 0x42, 0x5E, 0x93, 0x7A, 0xC1, 0xBA, + 0x13, 0x6C, 0x38, 0x3E, 0xDE, 0x7C, 0xFA, 0x5F, 0x93, 0x6D, 0xDA, 0x8E, + 0xE7, 0xDD, 0x32, 0x6D, 0xBB, 0x51, 0xDC, 0xFB, 0xAB, 0x2F, 0x49, 0xBD, + 0x60, 0xDD, 0x09, 0x7A, 0x4D, 0xEB, 0x06, 0xE8, 0x4D, 0xB0, 0xE0, 0xFB, + 0x79, 0xF3, 0xE9, 0x7E, 0x4D, 0xB7, 0x6A, 0x3B, 0x9F, 0x74, 0xC9, 0xB6, + 0xED, 0x47, 0x73, 0xEE, 0xAC, 0xBD, 0x26, 0xF5, 0x83, 0x74, 0x25, 0xE9, + 0x37, 0xAC, 0x1B, 0xA1, 0x36, 0xC3, 0x83, 0xED, 0xE7, 0xCF, 0xA5, 0xF9, + 0x36, 0xDD, 0xA8, 0xEE, 0x7D, 0xD3, 0x26, 0xDB, 0xB5, 0x1D, 0xCF, 0xBA, + 0xB2, 0xF4, 0x9B, 0xD6, 0x0D, 0xD0, 0x97, 0xA4, 0xDE, 0xB0, 0x6E, 0x84, + 0xDB, 0x0E, 0x0F, 0xB7, 0x9F, 0x3E, 0x97, 0xE4, 0xDB, 0x76, 0xA3, 0xB9, + 0xF7, 0x4C, 0x9B, 0x6E, 0xD4, 0x77, 0x3E, 0xEA, 0xCB, 0xD2, 0x6F, 0x58, + 0x37, 0x42, 0x5E, 0x93, 0x7A, 0xC1, 0xBA, 0x13, 0x6C, 0x38, 0x3E, 0xDE, + 0x7C, 0xFA, 0x5F, 0x93, 0x6D, 0xDA, 0x8E, 0xE7, 0xDD, 0x32, 0x6D, 0xBB, + 0x51, 0xDC, 0xFB, 0xAB, 0x2F, 0x49, 0xBD, 0x60, 0xDD, 0x09, 0x7A, 0x4D, + 0xEB, 0x06, 0xE8, 0x4D, 0xB0, 0xE0, 0xFB, 0x79, 0xF3, 0xE9, 0x7E, 0x4D, + 0xB7, 0x6A, 0x3B, 0x9F, 0x74, 0xC9, 0xB6, 0xED, 0x47, 0x73, 0xEE, 0xAC, + 0xBD, 0x26, 0xF5, 0x83, 0x74, 0x25, 0xE9, 0x37, 0xAC, 0x1B, 0xA1, 0x36, + 0xC3, 0x83, 0xED, 0xE7, 0xCF, 0xA5, 0xF9, 0x36, 0xDD, 0xA8, 0xEE, 0x7D, + 0xD3, 0x26, 0xDB, 0xB5, 0x1D, 0xCF, 0xBA, 0xB2, 0xF4, 0x9B, 0xD6, 0x0D, + 0xD0, 0x97, 0xA4, 0xDE, 0xB0, 0x6E, 0x84, 0xDB, 0x0E, 0x0F, 0xB7, 0x9F, + 0x3E, 0x97, 0xE4, 0xDB, 0x76, 0xA3, 0xB9, 0xF7, 0x4C, 0x9B, 0x6E, 0xD4, + 0x77, 0x3E, 0xEA, 0xCB, 0xD2, 0x6F, 0x58, 0x37, 0x42, 0x5E, 0x93, 0x7A, + 0xC1, 0xBA, 0x13, 0x6C, 0x38, 0x3E, 0xDE, 0x7C, 0xFA, 0x5F, 0x93, 0x6D, + 0xDA, 0x8E, 0xE7, 0xDD, 0x32, 0x6D, 0xBB, 0x51, 0xDC, 0xFB, 0xAB, 0x2F, + 0x49, 0xBD, 0x60, 0xDD, 0x09, 0x7A, 0x4D, 0xEB, 0x06, 0xE8, 0x4D, 0xB0, + 0xE0, 0xFB, 0x79, 0xF3, 0xE9, 0x7E, 0x4D, 0xB7, 0x6A, 0x3B, 0x9F, 0x74, + 0xC9, 0xB6, 0xED, 0x47, 0x73, 0xEE, 0xAC, 0xBD, 0x26, 0xF5, 0x83, 0x74, + 0x25, 0xE9, 0x37, 0xAC, 0x1B, 0xA1, 0x36, 0xC3, 0x83, 0xED, 0xE7, 0xCF, + 0xA5, 0xF9, 0x36, 0xDD, 0xA8, 0xEE, 0x7D, 0xD3, 0x26, 0xDB, 0xB5, 0x1D, + 0xCF, 0xBA, 0xB2, 0xF4, 0x9B, 0xD6, 0x0D, 0xD0, 0x97, 0xA4, 0xDE, 0xB0, + 0x6E, 0x84, 0xDB, 0x0E, 0x0F, 0xB7, 0x9F, 0x3E, 0x97, 0xE4, 0xDB, 0x76, + 0xA3, 0xB9, 0xF7, 0x4C, 0x9B, 0x6E, 0xD4, 0x77, 0x3E, 0xEA, 0xCB, 0xD2, + 0x6F, 0x58, 0x37, 0x42, 0x5E, 0x93, 0x7A, 0xC1, 0xBA, 0x13, 0x6C, 0x38, + 0x3E, 0xDE, 0x7C, 0xFA, 0x5F, 0x93, 0x6D, 0xDA, 0x8E, 0xE7, 0xDD, 0x32, + 0x6D, 0xBB, 0x51, 0xDC, 0xFB, 0xAB, 0x2F, 0x49, 0xBD, 0x60, 0xDD, 0x09, + 0x7A, 0x4D, 0xEB, 0x06, 0xE8, 0x4D, 0xB0, 0xE0, 0xFB, 0x79, 0xF3, 0xE9, + 0x7E, 0x4D, 0xB7, 0x6A, 0x3B, 0x9F, 0x74, 0xC9, 0xB6, 0xED, 0x47, 0x73, + 0xEE, 0xAC, 0xBD, 0x26, 0xF5, 0x83, 0x74, 0x25, 0xE9, 0x37, 0xAC, 0x1B, + 0xA1, 0x36, 0xC3, 0x83, 0xED, 0xE7, 0xCF, 0xA5, 0xF9, 0x36, 0xDD, 0xA8, + 0xEE, 0x7D, 0xD3, 0x26, 0xDB, 0xB5, 0x1D, 0xCF, 0xBA, 0xB2, 0xF4, 0x9B, + 0xD6, 0x0D, 0xD0, 0x97, 0xA4, 0xDE, 0xB0, 0x6E, 0x84, 0xDB, 0x0E, 0x0F, + 0xB7, 0x9F, 0x3E, 0x97, 0xE4, 0xDB, 0x76, 0xA3, 0xB9, 0xF7, 0x4C, 0x9B, + 0x6E, 0xD4, 0x77, 0x3E, 0xEA, 0xCB, 0xD2, 0x6F, 0x58, 0x37, 0x42, 0xCE, + 0xA2, 0xE6, 0xE3, 0x4C, 0xC4, 0x88, 0x22, 0xB8, 0x10, 0x05, 0x63, 0x30, + 0x0A, 0xC4, 0xE1, 0x33, 0x44, 0x7F, 0xAB, 0x39, 0xFF, 0x00, 0xBE, 0x98, + 0x99, 0x36, 0xDD, 0xA8, 0xEE, 0x7D, 0xD3, 0x26, 0xDB, 0xB5, 0x1D, 0xCF, + 0xBA, 0xC9, 0xA5, 0xA7, 0x23, 0xCA, 0xC4, 0x86, 0x20, 0xB8, 0x34, 0x10, + 0x49, 0xCC, 0x0A, 0xD7, 0xDE, 0xD3, 0x9A, 0xC1, 0xBA, 0x17, 0x78, 0xFE, + 0x37, 0x16, 0x4F, 0xFA, 0xB3, 0x8F, 0xFB, 0xE9, 0x3E, 0x4D, 0xB7, 0x6A, + 0x3B, 0x9F, 0x74, 0xC9, 0xB6, 0xED, 0x47, 0x73, 0xEE, 0xA0, 0xBD, 0xA7, + 0x35, 0x83, 0x74, 0x25, 0xED, 0x39, 0xAC, 0x1B, 0xA1, 0x5F, 0x80, 0xFB, + 0x79, 0xF3, 0xE9, 0x3E, 0x4D, 0xB7, 0x6A, 0x3B, 0x9F, 0x74, 0xC9, 0xB6, + 0xED, 0x47, 0x73, 0xEE, 0xA0, 0xBD, 0xA7, 0x35, 0x83, 0x74, 0x25, 0xED, + 0x39, 0xAC, 0x1B, 0xA1, 0x3E, 0x03, 0xED, 0xE7, 0xCF, 0xA4, 0xF9, 0x36, + 0xDD, 0xA8, 0xEE, 0x7D, 0xD3, 0x26, 0xDB, 0xB5, 0x1D, 0xCF, 0xBA, 0x82, + 0xF6, 0x9C, 0xD6, 0x0D, 0xD0, 0x97, 0xB4, 0xE6, 0xB0, 0x6E, 0x84, 0xF8, + 0x0F, 0xB7, 0x9F, 0x3E, 0x93, 0xE4, 0xDB, 0x76, 0xA3, 0xB9, 0xF7, 0x4C, + 0x9B, 0x6E, 0xD4, 0x77, 0x3E, 0xEA, 0x0B, 0xDA, 0x73, 0x58, 0x37, 0x42, + 0x5E, 0xD3, 0x9A, 0xC1, 0xBA, 0x13, 0xE0, 0x3E, 0xDE, 0x7C, 0xFA, 0x4F, + 0x93, 0x6D, 0xDA, 0x8E, 0xE7, 0xDD, 0x32, 0x6D, 0xBB, 0x51, 0xDC, 0xFB, + 0xA8, 0x2F, 0x69, 0xCD, 0x60, 0xDD, 0x09, 0x7B, 0x4E, 0x6B, 0x06, 0xE8, + 0x4F, 0x80, 0xFB, 0x79, 0xF3, 0xE9, 0x3E, 0x4D, 0xB7, 0x6A, 0x3B, 0x9F, + 0x74, 0xC9, 0xB6, 0xED, 0x47, 0x73, 0xEE, 0xA0, 0xBD, 0xA7, 0x35, 0x83, + 0x74, 0x25, 0xED, 0x39, 0xAC, 0x1B, 0xA1, 0x3E, 0x03, 0xED, 0xE7, 0xCF, + 0xA4, 0xF9, 0x36, 0xDD, 0xA8, 0xEE, 0x7D, 0xD3, 0x26, 0xDB, 0xB5, 0x1D, + 0xCF, 0xBA, 0x82, 0xF6, 0x9C, 0xD6, 0x0D, 0xD0, 0x97, 0xB4, 0xE6, 0xB0, + 0x6E, 0x84, 0xF8, 0x0F, 0xB7, 0x9F, 0x3E, 0x93, 0xE4, 0xDB, 0x76, 0xA3, + 0xB9, 0xF7, 0x4C, 0x9B, 0x6E, 0xD4, 0x77, 0x3E, 0xEA, 0x0B, 0xDA, 0x73, + 0x58, 0x37, 0x42, 0x5E, 0xD3, 0x9A, 0xC1, 0xBA, 0x13, 0xE0, 0x3E, 0xDE, + 0x7C, 0xFA, 0x4F, 0x93, 0x6D, 0xDA, 0x8E, 0xE7, 0xDD, 0x32, 0x6D, 0xBB, + 0x51, 0xDC, 0xFB, 0xA8, 0x2F, 0x69, 0xCD, 0x60, 0xDD, 0x09, 0x7B, 0x4E, + 0x6B, 0x06, 0xE8, 0x4F, 0x80, 0xFB, 0x79, 0xF3, 0xE9, 0x3E, 0x4D, 0xB7, + 0x6A, 0x3B, 0x9F, 0x74, 0xC9, 0xB6, 0xED, 0x47, 0x73, 0xEE, 0xA0, 0xBD, + 0xA7, 0x35, 0x83, 0x74, 0x25, 0xED, 0x39, 0xAC, 0x1B, 0xA1, 0x3E, 0x03, + 0xED, 0xE7, 0xCF, 0xA4, 0xF9, 0x36, 0xDD, 0xA8, 0xEE, 0x7D, 0xD3, 0x26, + 0xDB, 0xB5, 0x1D, 0xCF, 0xBA, 0x82, 0xF6, 0x9C, 0xD6, 0x0D, 0xD0, 0x97, + 0xB4, 0xE6, 0xB0, 0x6E, 0x84, 0xF8, 0x0F, 0xB7, 0x9F, 0x3E, 0x93, 0xE4, + 0xDB, 0x76, 0xA3, 0xB9, 0xF7, 0x4C, 0x9B, 0x6E, 0xD4, 0x77, 0x3E, 0xEA, + 0x0B, 0xDA, 0x73, 0x58, 0x37, 0x42, 0x5E, 0xD3, 0x9A, 0xC1, 0xBA, 0x13, + 0xE0, 0x3E, 0xDE, 0x7C, 0xFA, 0x4F, 0x93, 0x6D, 0xDA, 0x8E, 0xE7, 0xDD, + 0x32, 0x6D, 0xBB, 0x51, 0xDC, 0xFB, 0xA8, 0x2F, 0x69, 0xCD, 0x60, 0xDD, + 0x09, 0x7B, 0x4E, 0x6B, 0x06, 0xE8, 0x4F, 0x80, 0xFB, 0x79, 0xF3, 0xE9, + 0x3E, 0x4D, 0xB7, 0x6A, 0x3B, 0x9F, 0x74, 0xC9, 0xB6, 0xED, 0x47, 0x73, + 0xEE, 0xA0, 0xBD, 0xA7, 0x35, 0x83, 0x74, 0x25, 0xED, 0x39, 0xAC, 0x1B, + 0xA1, 0x3E, 0x03, 0xED, 0xE7, 0xCF, 0xA4, 0xF9, 0x36, 0xDD, 0xA8, 0xEE, + 0x7D, 0xD3, 0x26, 0xDB, 0xB5, 0x1D, 0xCF, 0xBA, 0x82, 0xF6, 0x9C, 0xD6, + 0x0D, 0xD0, 0x97, 0xB4, 0xE6, 0xB0, 0x6E, 0x84, 0xF8, 0x0F, 0xB7, 0x9F, + 0x3E, 0x93, 0xE4, 0xDB, 0x76, 0xA3, 0xB9, 0xF7, 0x4C, 0x9B, 0x6E, 0xD4, + 0x77, 0x3E, 0xEA, 0x0B, 0xDA, 0x73, 0x58, 0x37, 0x42, 0x5E, 0xD3, 0x9A, + 0xC1, 0xBA, 0x13, 0xE0, 0x3E, 0xDE, 0x7C, 0xFA, 0x4F, 0x93, 0x6D, 0xDA, + 0x8E, 0xE7, 0xDD, 0x32, 0x6D, 0xBB, 0x51, 0xDC, 0xFB, 0xA8, 0x2F, 0x69, + 0xCD, 0x60, 0xDD, 0x09, 0x7B, 0x4E, 0x6B, 0x06, 0xE8, 0x4F, 0x80, 0xFB, + 0x79, 0xF3, 0xE9, 0x3E, 0x4D, 0xB7, 0x6A, 0x3B, 0x9F, 0x74, 0xC9, 0xB6, + 0xED, 0x47, 0x73, 0xEE, 0xA0, 0xBD, 0xA7, 0x35, 0x83, 0x74, 0x25, 0xED, + 0x39, 0xAC, 0x1B, 0xA1, 0x3E, 0x03, 0xED, 0xE7, 0xCF, 0xA4, 0xF9, 0x36, + 0xDD, 0xA8, 0xEE, 0x7D, 0xD5, 0x91, 0x7D, 0x1F, 0x6C, 0x18, 0x4F, 0x89, + 0xCE, 0x49, 0xB0, 0xD2, 0xEA, 0xAC, 0x74, 0xD5, 0xFD, 0xAB, 0x05, 0x2D, + 0x39, 0x5F, 0xAC, 0x1B, 0xA1, 0x6F, 0x66, 0xBA, 0x9C, 0x6F, 0x0D, 0xDC, + 0x16, 0x32, 0xFE, 0x51, 0x8B, 0x78, 0x7F, 0xA7, 0x3C, 0xA7, 0xBF, 0xA2, + 0x57, 0xA9, 0x41, 0xF0, 0xDB, 0xC1, 0x73, 0x47, 0xA4, 0xAE, 0x96, 0x57, + 0xA9, 0x41, 0xF0, 0xDB, 0xC1, 0x73, 0x44, 0x1A, 0xCE, 0x65, 0xC7, 0xFA, + 0x76, 0x87, 0x9B, 0xFB, 0x79, 0x28, 0x8A, 0xB5, 0x1D, 0x09, 0x51, 0xD0, + 0xB9, 0x38, 0xA8, 0x8A, 0xB5, 0x1D, 0x09, 0x51, 0xD0, 0x82, 0x88, 0xAB, + 0x51, 0xD0, 0x95, 0x1D, 0x08, 0x28, 0x8A, 0xB5, 0x1D, 0x09, 0x51, 0xD0, + 0x82, 0x88, 0xAB, 0x51, 0xD0, 0x95, 0x1D, 0x08, 0x28, 0x8A, 0xB5, 0x1D, + 0x09, 0x51, 0xD0, 0x82, 0x88, 0xAB, 0x51, 0xD0, 0x95, 0x1D, 0x08, 0x32, + 0x20, 0xB0, 0xC4, 0x95, 0x88, 0xD6, 0x00, 0x5F, 0x68, 0x1A, 0xBD, 0xF5, + 0x2C, 0x9A, 0xC7, 0x2B, 0x14, 0x43, 0x6D, 0x79, 0xDA, 0x2B, 0x65, 0x44, + 0x8C, 0xDA, 0x0F, 0xB9, 0x6B, 0xAA, 0x3A, 0x12, 0xA3, 0xA1, 0x6A, 0x32, + 0xA5, 0xB6, 0xCE, 0x18, 0x0D, 0x6B, 0xC3, 0x6A, 0x77, 0xFC, 0xA7, 0xF2, + 0x01, 0xD1, 0x50, 0xD2, 0xB1, 0xE0, 0x86, 0x8A, 0x44, 0x81, 0x64, 0xB6, + 0xB7, 0x55, 0x57, 0x47, 0x41, 0x58, 0x95, 0x1D, 0x09, 0x51, 0xD0, 0xAE, + 0xC5, 0xB3, 0x84, 0x31, 0x10, 0x43, 0x6C, 0xC5, 0x91, 0x12, 0xB7, 0x66, + 0x15, 0x02, 0x45, 0x59, 0xAB, 0xAB, 0xF7, 0x54, 0xE6, 0xF0, 0x5D, 0x10, + 0xB3, 0x3B, 0x48, 0x01, 0xC6, 0xB3, 0xD0, 0x3D, 0xE1, 0x61, 0x54, 0x74, + 0x25, 0x47, 0x42, 0x9B, 0x7E, 0x16, 0xCC, 0x6C, 0x38, 0x71, 0x21, 0xB0, + 0x81, 0x5F, 0xE1, 0x71, 0x6B, 0x2B, 0xE9, 0xCF, 0xD0, 0xAB, 0x0E, 0x5A, + 0x09, 0xB5, 0x69, 0xA6, 0xB0, 0xEA, 0x8B, 0x43, 0xAB, 0xB2, 0x2A, 0x58, + 0x55, 0x1D, 0x09, 0x51, 0xD0, 0x97, 0xF8, 0x58, 0x7A, 0x73, 0x2A, 0x2A, + 0xD4, 0x74, 0x25, 0x47, 0x42, 0xCA, 0x28, 0x8A, 0xB5, 0x1D, 0x09, 0x51, + 0xD0, 0x82, 0x88, 0xAB, 0x51, 0xD0, 0x95, 0x1D, 0x08, 0x28, 0x8A, 0xB5, + 0x1D, 0x09, 0x51, 0xD0, 0x82, 0x88, 0xAB, 0x51, 0xD0, 0x95, 0x1D, 0x08, + 0x28, 0x8A, 0xB5, 0x1D, 0x09, 0x51, 0xD0, 0x82, 0x88, 0xAB, 0x51, 0xD0, + 0x95, 0x1D, 0x08, 0x28, 0xB6, 0x74, 0x27, 0xAD, 0x8B, 0xDD, 0x0B, 0x5B, + 0x51, 0xD0, 0xB6, 0x74, 0x27, 0xAD, 0x8B, 0xDD, 0x0B, 0x78, 0x79, 0x2E, + 0x3D, 0xD1, 0xD3, 0xDE, 0xBA, 0x17, 0x74, 0xF1, 0x5A, 0xA5, 0xB6, 0xA7, + 0x87, 0xFC, 0xD0, 0xBB, 0xA7, 0x8A, 0xD5, 0x54, 0x74, 0x2F, 0xA5, 0x87, + 0x89, 0x97, 0x75, 0x11, 0x56, 0xA3, 0xA1, 0x2A, 0x3A, 0x16, 0x99, 0x51, + 0x15, 0x6A, 0x3A, 0x12, 0xA3, 0xA1, 0x05, 0x11, 0x56, 0xA3, 0xA1, 0x2A, + 0x3A, 0x10, 0x51, 0x15, 0x6A, 0x3A, 0x12, 0xA3, 0xA1, 0x05, 0x11, 0x56, + 0xA3, 0xA1, 0x2A, 0x3A, 0x10, 0x51, 0x15, 0x6A, 0x3A, 0x12, 0xA3, 0xA1, + 0x05, 0x11, 0x56, 0xA3, 0xA1, 0x2A, 0x3A, 0x10, 0x64, 0x49, 0x80, 0xF1, + 0x1D, 0x99, 0x8B, 0x9D, 0x0F, 0xF0, 0x8D, 0x26, 0xB0, 0xB2, 0x5A, 0x2C, + 0x16, 0x30, 0x30, 0x18, 0x82, 0x08, 0x06, 0xC9, 0x16, 0x81, 0xAF, 0xDD, + 0x5F, 0xBD, 0x6B, 0xAA, 0x3A, 0x12, 0xA3, 0xA1, 0x66, 0x62, 0xDA, 0x89, + 0xA6, 0xD1, 0x8D, 0x0D, 0x7C, 0x7A, 0xB3, 0xB8, 0xB5, 0x87, 0xF0, 0xB4, + 0x07, 0x0F, 0xEB, 0xA2, 0xB5, 0x8F, 0x18, 0x36, 0xF1, 0x87, 0x55, 0x9A, + 0x89, 0x6D, 0x63, 0x37, 0xED, 0x5D, 0x7E, 0xEA, 0xD6, 0x1D, 0x47, 0x42, + 0x54, 0x74, 0x24, 0x62, 0x5B, 0x60, 0x1B, 0x2E, 0xF1, 0x30, 0xD1, 0x5B, + 0x41, 0x8A, 0xD0, 0x49, 0x23, 0x36, 0x73, 0xD0, 0xA9, 0xCD, 0xA1, 0x5B, + 0x65, 0xA8, 0x6E, 0x61, 0x2E, 0x70, 0xB0, 0x1D, 0x59, 0x20, 0x0C, 0xC5, + 0x60, 0x54, 0x74, 0x25, 0x47, 0x42, 0x6B, 0xFA, 0x5B, 0x3A, 0x2C, 0x18, + 0x70, 0xE1, 0x4C, 0x06, 0xB0, 0x12, 0x03, 0x48, 0xCF, 0x59, 0x1A, 0x7F, + 0x85, 0x80, 0xAB, 0x51, 0xD0, 0x95, 0x1D, 0x0A, 0xC4, 0x52, 0x4C, 0xA8, + 0x8A, 0xB5, 0x1D, 0x09, 0x51, 0xD0, 0xAA, 0x28, 0x8A, 0xB5, 0x1D, 0x09, + 0x51, 0xD0, 0x82, 0x88, 0xAB, 0x51, 0xD0, 0x95, 0x1D, 0x08, 0x28, 0x8A, + 0xB5, 0x1D, 0x09, 0x51, 0xD0, 0x82, 0x88, 0xAB, 0x51, 0xD0, 0x95, 0x1D, + 0x08, 0x28, 0x8A, 0xB5, 0x1D, 0x09, 0x51, 0xD0, 0x82, 0x88, 0xAB, 0x51, + 0xD0, 0x95, 0x1D, 0x08, 0x03, 0xA4, 0x2E, 0xA6, 0x6B, 0xA9, 0x46, 0xF0, + 0xDD, 0xC1, 0x72, 0xC0, 0x1A, 0xC6, 0x65, 0xD4, 0xCD, 0x75, 0x28, 0xDE, + 0x1B, 0xB8, 0x2E, 0x3F, 0xD7, 0xB3, 0xBF, 0xF1, 0xF2, 0x56, 0x57, 0xA9, + 0x41, 0xF0, 0xDB, 0xC1, 0x56, 0x00, 0x1C, 0xDE, 0x19, 0x20, 0x7E, 0x41, + 0xC1, 0x52, 0x57, 0xA9, 0x41, 0xF0, 0xDB, 0xC1, 0x56, 0x17, 0x55, 0x67, + 0x70, 0x70, 0x5C, 0x61, 0xBC, 0xFC, 0xA5, 0x8C, 0x69, 0x5A, 0x3C, 0x1A, + 0x8C, 0xD4, 0x20, 0x47, 0xEE, 0x97, 0xB5, 0x1D, 0xB5, 0x41, 0xC5, 0x79, + 0xF4, 0x7F, 0x5F, 0x13, 0xBC, 0x78, 0xA8, 0xD5, 0xA6, 0x5E, 0x8B, 0x7B, + 0x51, 0xDB, 0x54, 0x1C, 0x52, 0xF6, 0xA3, 0xB6, 0xA8, 0x38, 0xAF, 0x3A, + 0x44, 0xA1, 0xE8, 0xB7, 0xB5, 0x1D, 0xB5, 0x41, 0xC5, 0x2F, 0x6A, 0x3B, + 0x6A, 0x83, 0x8A, 0xF3, 0xA4, 0x4A, 0x1E, 0x8B, 0x7B, 0x51, 0xDB, 0x54, + 0x1C, 0x52, 0xF6, 0xA3, 0xB6, 0xA8, 0x38, 0xAF, 0x3A, 0x44, 0xA1, 0xE8, + 0xB7, 0xB5, 0x1D, 0xB5, 0x41, 0xC5, 0x2F, 0x6A, 0x3B, 0x6A, 0x83, 0x8A, + 0xF3, 0xA4, 0x4A, 0x1E, 0x8B, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x52, 0xF6, + 0xA3, 0xB6, 0xA8, 0x38, 0xAF, 0x3A, 0x44, 0xA1, 0xE8, 0xB7, 0xB5, 0x1D, + 0xB5, 0x41, 0xC5, 0x2F, 0x6A, 0x3B, 0x6A, 0x83, 0x8A, 0xF3, 0xA4, 0x4A, + 0x1E, 0x8B, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x52, 0xF6, 0xA3, 0xB6, 0xA8, + 0x38, 0xAF, 0x3A, 0x44, 0xA1, 0xE8, 0xB7, 0xB5, 0x1D, 0xB5, 0x41, 0xC5, + 0x5F, 0x0A, 0x91, 0x91, 0x8D, 0x11, 0xB0, 0xE1, 0x4C, 0x42, 0x7B, 0xDD, + 0x98, 0x00, 0x7A, 0x57, 0x9B, 0xAC, 0xEA, 0x1B, 0x35, 0x27, 0x06, 0xAD, + 0x28, 0x3D, 0x06, 0x34, 0x48, 0x50, 0x21, 0x98, 0x91, 0x5C, 0xD6, 0x30, + 0x74, 0x93, 0xEE, 0x58, 0xB7, 0xB5, 0x1D, 0xB5, 0x41, 0xC5, 0x43, 0xE9, + 0x0F, 0xB1, 0x23, 0xFF, 0x00, 0x03, 0x8A, 0xE0, 0x10, 0x7A, 0x2D, 0xED, + 0x47, 0x6D, 0x50, 0x71, 0x4B, 0xDA, 0x8E, 0xDA, 0xA0, 0xE2, 0xBC, 0xE9, + 0x12, 0x87, 0xA2, 0xDE, 0xD4, 0x76, 0xD5, 0x07, 0x14, 0xBD, 0xA8, 0xED, + 0xAA, 0x0E, 0x2B, 0xCE, 0x91, 0x28, 0x7A, 0x2D, 0xED, 0x47, 0x6D, 0x50, + 0x71, 0x4B, 0xDA, 0x8E, 0xDA, 0xA0, 0xE2, 0xBC, 0xE9, 0x12, 0x87, 0xA2, + 0xDE, 0xD4, 0x76, 0xD5, 0x07, 0x14, 0xBD, 0xA8, 0xED, 0xAA, 0x0E, 0x2B, + 0xCE, 0x91, 0x28, 0x7A, 0x2D, 0xED, 0x47, 0x6D, 0x50, 0x71, 0x4B, 0xDA, + 0x8E, 0xDA, 0xA0, 0xE2, 0xBC, 0xE9, 0x12, 0x87, 0xA2, 0xDE, 0xD4, 0x76, + 0xD5, 0x07, 0x14, 0xBD, 0xA8, 0xED, 0xAA, 0x0E, 0x2B, 0xCE, 0x91, 0x28, + 0x7A, 0x2D, 0xED, 0x47, 0x6D, 0x50, 0x71, 0x4B, 0xDA, 0x8E, 0xDA, 0xA0, + 0xE2, 0xBC, 0xE9, 0x12, 0x87, 0xA2, 0xDE, 0xD4, 0x76, 0xD5, 0x07, 0x14, + 0xBD, 0xA8, 0xED, 0xAA, 0x0E, 0x2B, 0xCE, 0x91, 0x28, 0x7A, 0x5C, 0xBC, + 0xDC, 0xAC, 0xD1, 0x22, 0x5E, 0x2B, 0x22, 0x16, 0xF4, 0xD9, 0xF7, 0x2B, + 0xEA, 0x02, 0x67, 0x37, 0x63, 0xEA, 0xB9, 0x4F, 0x43, 0xCF, 0xFD, 0x4C, + 0x5F, 0xEB, 0xEA, 0xBA, 0xCF, 0xD4, 0xFF, 0x00, 0xA7, 0xD5, 0x41, 0x4A, + 0x81, 0x9A, 0xCE, 0x3F, 0xEC, 0xFA, 0xAB, 0x26, 0x27, 0x25, 0x65, 0x48, + 0x13, 0x11, 0x59, 0x0C, 0xBB, 0x38, 0xB5, 0xEF, 0x57, 0xFE, 0xA8, 0xF7, + 0x3E, 0xAB, 0x97, 0xF4, 0xD3, 0xD7, 0x4B, 0x77, 0x4F, 0x15, 0xA1, 0xBE, + 0xBD, 0xA8, 0xED, 0xAA, 0x0E, 0x29, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x57, + 0x9D, 0xA2, 0x0F, 0x44, 0xBD, 0xA8, 0xED, 0xAA, 0x0E, 0x29, 0x7B, 0x51, + 0xDB, 0x54, 0x1C, 0x57, 0x9D, 0xA2, 0x0F, 0x44, 0xBD, 0xA8, 0xED, 0xAA, + 0x0E, 0x29, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x57, 0x9D, 0xA2, 0x0F, 0x44, + 0xBD, 0xA8, 0xED, 0xAA, 0x0E, 0x29, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x57, + 0x9D, 0xA2, 0x0F, 0x44, 0xBD, 0xA8, 0xED, 0xAA, 0x0E, 0x29, 0x7B, 0x51, + 0xDB, 0x54, 0x1C, 0x57, 0x9D, 0xA2, 0x0F, 0x44, 0xBD, 0xA8, 0xED, 0xAA, + 0x0E, 0x29, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x57, 0x9D, 0xA2, 0x0F, 0x44, + 0xBD, 0xA8, 0xED, 0xAA, 0x0E, 0x29, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x57, + 0x9D, 0xA2, 0x0F, 0x44, 0xBD, 0xA8, 0xED, 0xAA, 0x0E, 0x29, 0x7B, 0x51, + 0xDB, 0x54, 0x1C, 0x57, 0x9D, 0xA2, 0x0F, 0x44, 0xBD, 0xA8, 0xED, 0xAA, + 0x0E, 0x2B, 0x2E, 0x0C, 0x48, 0x51, 0xE1, 0x88, 0x90, 0x5C, 0xD7, 0xB0, + 0xF4, 0x11, 0xEF, 0x5E, 0x60, 0xBB, 0xFF, 0x00, 0x47, 0x3D, 0x8B, 0x2F, + 0xFC, 0x1E, 0x28, 0x32, 0x22, 0xD2, 0x52, 0x30, 0x62, 0x3A, 0x1C, 0x59, + 0x88, 0x4D, 0x7B, 0x4D, 0x44, 0x13, 0xD0, 0xAC, 0xBD, 0xA8, 0xED, 0xAA, + 0x0E, 0x2B, 0x8C, 0xA7, 0xFD, 0xB3, 0x35, 0xDF, 0x5A, 0xE4, 0x1E, 0x89, + 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x52, 0xF6, 0xA3, 0xB6, 0xA8, 0x38, 0xAF, + 0x3B, 0x44, 0x1E, 0x89, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x52, 0xF6, 0xA3, + 0xB6, 0xA8, 0x38, 0xAF, 0x3B, 0x44, 0x1E, 0x89, 0x7B, 0x51, 0xDB, 0x54, + 0x1C, 0x52, 0xF6, 0xA3, 0xB6, 0xA8, 0x38, 0xAF, 0x3B, 0x44, 0x1E, 0x89, + 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x52, 0xF6, 0xA3, 0xB6, 0xA8, 0x38, 0xAF, + 0x3B, 0x44, 0x1E, 0x89, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x52, 0xF6, 0xA3, + 0xB6, 0xA8, 0x38, 0xAF, 0x3B, 0x44, 0x1E, 0x89, 0x7B, 0x51, 0xDB, 0x54, + 0x1C, 0x52, 0xF6, 0xA3, 0xB6, 0xA8, 0x38, 0xAF, 0x3B, 0x44, 0x1E, 0x89, + 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x52, 0xF6, 0xA3, 0xB6, 0xA8, 0x38, 0xAF, + 0x3B, 0x44, 0x1E, 0x89, 0x7B, 0x51, 0xDB, 0x54, 0x1C, 0x55, 0x45, 0x2D, + 0x47, 0x13, 0x50, 0x9A, 0x84, 0x4F, 0xF2, 0xBC, 0xE9, 0x5F, 0x03, 0xD7, + 0x43, 0xEF, 0x0E, 0x28, 0x3D, 0x2E, 0x60, 0x0E, 0x6D, 0x10, 0x80, 0x3F, + 0x21, 0xE0, 0xAD, 0x9A, 0xEA, 0x51, 0xBC, 0x37, 0x70, 0x55, 0x8D, 0xD5, + 0x1F, 0xE1, 0x9E, 0x0A, 0x93, 0x5D, 0x4A, 0x37, 0x86, 0xEE, 0x0A, 0x4F, + 0x66, 0xB0, 0xF2, 0x85, 0x65, 0x7A, 0x94, 0x1F, 0x0D, 0xBC, 0x15, 0x61, + 0x75, 0x56, 0x77, 0x07, 0x05, 0x49, 0x5E, 0xA5, 0x07, 0xC3, 0x6F, 0x05, + 0x58, 0x5D, 0x55, 0x9D, 0xC1, 0xC1, 0x48, 0x33, 0xF2, 0x97, 0x9A, 0xC7, + 0xF5, 0xF1, 0x3B, 0xC7, 0x8A, 0x8D, 0x49, 0x1F, 0xD7, 0xC4, 0xEF, 0x1E, + 0x2A, 0x35, 0xA8, 0x64, 0x44, 0x44, 0x51, 0x3A, 0x3A, 0x11, 0x10, 0x6D, + 0xB9, 0x48, 0x6D, 0x73, 0x26, 0x1A, 0xE6, 0xDA, 0x9A, 0x7B, 0x2D, 0x0E, + 0xCD, 0x46, 0xB7, 0xD7, 0xA2, 0xB2, 0x07, 0xF4, 0xA4, 0x74, 0x48, 0x82, + 0x7A, 0x1B, 0x9E, 0xE8, 0xD6, 0x04, 0x5A, 0xC1, 0x89, 0x18, 0x39, 0xBE, + 0xFA, 0xAA, 0x0B, 0x4A, 0x88, 0x37, 0x32, 0x86, 0x09, 0x10, 0xE3, 0x30, + 0xB1, 0x9C, 0xA4, 0xCC, 0x32, 0xE6, 0x57, 0x55, 0x82, 0x03, 0xAB, 0xFE, + 0xB3, 0x8E, 0x1E, 0xE5, 0x64, 0x17, 0x1A, 0x99, 0x78, 0x3D, 0xAE, 0x89, + 0xCA, 0x8E, 0x4C, 0xC4, 0x70, 0x71, 0x02, 0xA3, 0xD3, 0xFB, 0x57, 0x67, + 0xA7, 0xF7, 0x5A, 0x94, 0x41, 0xB6, 0x82, 0x63, 0x0E, 0xBE, 0xFA, 0xFF, + 0x00, 0xE4, 0x67, 0x27, 0x6D, 0xC0, 0x90, 0x6D, 0x0A, 0xEA, 0xFD, 0xAA, + 0xAF, 0xF6, 0xE8, 0x56, 0x4D, 0x47, 0x6C, 0x69, 0x69, 0x90, 0x22, 0x44, + 0x79, 0x6C, 0x40, 0x47, 0x2A, 0xEB, 0x55, 0x0A, 0xCF, 0xE5, 0xD1, 0xEE, + 0x5A, 0xC4, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x59, 0xB4, 0x3F, 0xB4, + 0xA0, 0xFF, 0x00, 0x2B, 0x09, 0x66, 0xD0, 0xFE, 0xD2, 0x83, 0xFC, 0xA9, + 0x3D, 0x91, 0xD9, 0x7A, 0x43, 0xEC, 0x48, 0xFD, 0xD0, 0xB8, 0x05, 0xDF, + 0xFA, 0x43, 0xEC, 0x48, 0xFD, 0xD0, 0xB8, 0x04, 0x80, 0x44, 0x45, 0x54, + 0x44, 0x44, 0x04, 0x44, 0x41, 0xB4, 0x97, 0x74, 0x6E, 0x6D, 0x29, 0xC9, + 0x44, 0x0D, 0x86, 0x0B, 0xB9, 0x40, 0xE7, 0x80, 0xDF, 0xCD, 0xEF, 0x07, + 0xA7, 0x32, 0x46, 0x9A, 0x87, 0x0A, 0x56, 0x1B, 0x60, 0x44, 0x8C, 0xD6, + 0x92, 0xFB, 0x22, 0x1C, 0x4B, 0x22, 0xAB, 0x46, 0xAA, 0xC2, 0xD5, 0xA2, + 0x0D, 0xA0, 0x6F, 0xFD, 0x43, 0x26, 0x3F, 0x0F, 0x22, 0x25, 0x80, 0x2E, + 0xAC, 0x55, 0x58, 0x87, 0x55, 0x5F, 0xCD, 0x6B, 0x56, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x3A, 0x2F, 0x44, 0x3A, 0xD4, 0x4F, + 0xEB, 0xEA, 0xBA, 0xDF, 0xD4, 0xFF, 0x00, 0xA7, 0xD5, 0x72, 0x5E, 0x88, + 0x75, 0xA8, 0x9F, 0xD7, 0xD5, 0x75, 0xBF, 0xA9, 0xFF, 0x00, 0x4F, 0xAA, + 0xCA, 0x29, 0xFA, 0xA3, 0xDC, 0xFA, 0xAE, 0x5F, 0xD3, 0x4F, 0x5D, 0x2D, + 0xDD, 0x3C, 0x57, 0x51, 0xFA, 0xA3, 0xDC, 0xFA, 0xAE, 0x5F, 0xD3, 0x4F, + 0x5D, 0x2D, 0xDD, 0x3C, 0x56, 0x87, 0x32, 0x88, 0x88, 0xA2, 0x22, 0x20, + 0x2C, 0xC9, 0x16, 0xB2, 0x61, 0x8F, 0x95, 0x88, 0xF6, 0xB0, 0x38, 0x87, + 0xB5, 0xCE, 0xF7, 0x11, 0xD3, 0xE4, 0x4E, 0x01, 0x61, 0xA2, 0x0D, 0xCB, + 0x26, 0x1D, 0x1A, 0x58, 0xBE, 0x0F, 0x2C, 0xDA, 0xE3, 0xBA, 0xA6, 0xC2, + 0x8A, 0x18, 0x43, 0x6C, 0xB4, 0x00, 0x74, 0xF4, 0x2B, 0x18, 0xE8, 0x71, + 0x21, 0xCB, 0x40, 0x8A, 0x5A, 0xD7, 0xD6, 0xE7, 0x35, 0xEE, 0x39, 0xC3, + 0xAD, 0x9C, 0xCE, 0x3F, 0xBF, 0xFF, 0x00, 0x16, 0xA5, 0x10, 0x6E, 0x5E, + 0xE8, 0xD5, 0xC2, 0xE4, 0x22, 0x34, 0x42, 0xE5, 0x5F, 0x6C, 0x17, 0x80, + 0xDA, 0xAD, 0x7B, 0xC7, 0xBF, 0x32, 0x89, 0xC6, 0x21, 0x64, 0x3B, 0xB5, + 0xD6, 0x61, 0xD6, 0xEB, 0x60, 0x38, 0x03, 0x5D, 0xA3, 0x55, 0xAF, 0xDA, + 0xCD, 0x9E, 0x9C, 0xDD, 0x2B, 0x56, 0x88, 0x37, 0x11, 0x26, 0x60, 0x41, + 0x84, 0x79, 0x28, 0xB1, 0x18, 0xD3, 0x30, 0xF3, 0x54, 0x07, 0x59, 0xAC, + 0x54, 0xCF, 0x2A, 0xEB, 0xA9, 0x6B, 0xA7, 0x80, 0x13, 0xD3, 0x15, 0x59, + 0xAB, 0x94, 0x75, 0x56, 0x7A, 0x2A, 0xAF, 0xDC, 0xA0, 0x44, 0x04, 0x44, + 0x40, 0x44, 0x44, 0x05, 0xDF, 0xFA, 0x39, 0xEC, 0x59, 0x7F, 0xE0, 0xF1, + 0x5C, 0x02, 0xEF, 0xFD, 0x1C, 0xF6, 0x2C, 0xBF, 0xF0, 0x78, 0xA2, 0x39, + 0x1A, 0x7F, 0xDB, 0x33, 0x5D, 0xF5, 0xAE, 0x5B, 0x1A, 0x7F, 0xDB, 0x33, + 0x5D, 0xF5, 0xAE, 0x54, 0x81, 0x11, 0x14, 0x51, 0x11, 0x10, 0x16, 0x55, + 0x1E, 0x58, 0x22, 0xC5, 0xE5, 0x3F, 0x2F, 0x24, 0xFF, 0x00, 0x7D, 0x44, + 0xE6, 0x58, 0xA8, 0x83, 0x6B, 0x05, 0xD0, 0x5D, 0x2D, 0x0D, 0x90, 0xBF, + 0x09, 0x70, 0x8C, 0xD0, 0x1E, 0xE0, 0x4D, 0x65, 0xAD, 0xAB, 0x42, 0xBE, + 0x4C, 0x18, 0x30, 0xE1, 0xC3, 0x7D, 0x6D, 0x8A, 0x1B, 0x14, 0xD4, 0xD7, + 0x00, 0xE1, 0x58, 0x6D, 0x59, 0xFD, 0xC7, 0x31, 0x5A, 0x74, 0x41, 0x9D, + 0x49, 0x90, 0xE3, 0x00, 0x92, 0x6D, 0xD8, 0xA9, 0xC1, 0xCE, 0x0E, 0x77, + 0x49, 0xE9, 0x23, 0xA5, 0x60, 0xA2, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x2B, 0xE0, 0x7A, 0xE8, 0x7D, 0xE1, 0xC5, 0x58, 0xAF, 0x81, 0xEB, 0xA1, + 0xF7, 0x87, 0x14, 0x47, 0xA5, 0x46, 0xEA, 0x8F, 0xF0, 0xCF, 0x05, 0x49, + 0xAE, 0xA5, 0x1B, 0xC3, 0x77, 0x05, 0x58, 0xDD, 0x51, 0xFE, 0x19, 0xE0, + 0xA9, 0x35, 0xD4, 0xA3, 0x78, 0x6E, 0xE0, 0xA4, 0xF6, 0x6B, 0x0F, 0x28, + 0x56, 0x57, 0xA9, 0x41, 0xF0, 0xDB, 0xC1, 0x5D, 0x04, 0x57, 0x2F, 0x0C, + 0x69, 0x60, 0xE0, 0xAD, 0x95, 0xEA, 0x50, 0x7C, 0x36, 0xF0, 0x55, 0x83, + 0x9A, 0x59, 0x9D, 0xC1, 0xC1, 0x48, 0x33, 0xF2, 0x97, 0x3F, 0x17, 0xD1, + 0x58, 0x4E, 0x88, 0xE7, 0x07, 0x3C, 0x82, 0x49, 0xFC, 0xC1, 0x5B, 0x92, + 0x90, 0xF4, 0xBF, 0x78, 0x2D, 0x5C, 0x5F, 0x48, 0xA9, 0x26, 0xC5, 0x7B, + 0x44, 0x71, 0x50, 0x71, 0x03, 0xF0, 0x85, 0x6E, 0x52, 0x52, 0x7A, 0xF1, + 0xBA, 0x11, 0x96, 0xDB, 0x25, 0x21, 0xE9, 0x7E, 0xF0, 0x4C, 0x94, 0x87, + 0xA5, 0xFB, 0xC1, 0x6A, 0x72, 0x92, 0x93, 0xD7, 0x8D, 0xD0, 0x99, 0x49, + 0x49, 0xEB, 0xC6, 0xE8, 0x54, 0x6D, 0xB2, 0x52, 0x1E, 0x97, 0xEF, 0x04, + 0xC9, 0x48, 0x7A, 0x5F, 0xBC, 0x16, 0xA7, 0x29, 0x29, 0x3D, 0x78, 0xDD, + 0x09, 0x94, 0x94, 0x9E, 0xBC, 0x6E, 0x84, 0x1B, 0x6C, 0x94, 0x87, 0xA5, + 0xFB, 0xC1, 0x32, 0x52, 0x1E, 0x97, 0xEF, 0x05, 0xA9, 0xCA, 0x4A, 0x4F, + 0x5E, 0x37, 0x42, 0x65, 0x25, 0x27, 0xAF, 0x1B, 0xA1, 0x06, 0xDB, 0x25, + 0x21, 0xE9, 0x7E, 0xF0, 0x4C, 0x94, 0x87, 0xA5, 0xFB, 0xC1, 0x6A, 0x72, + 0x92, 0x93, 0xD7, 0x8D, 0xD0, 0x99, 0x49, 0x49, 0xEB, 0xC6, 0xE8, 0x41, + 0xB6, 0xC9, 0x48, 0x7A, 0x5F, 0xBC, 0x13, 0x25, 0x21, 0xE9, 0x7E, 0xF0, + 0x5A, 0x9C, 0xA4, 0xA4, 0xF5, 0xE3, 0x74, 0x26, 0x52, 0x52, 0x7A, 0xF1, + 0xBA, 0x10, 0x6D, 0xB2, 0x52, 0x1E, 0x97, 0xEF, 0x04, 0xC9, 0x48, 0x7A, + 0x5F, 0xBC, 0x16, 0xA7, 0x29, 0x29, 0x3D, 0x78, 0xDD, 0x09, 0x94, 0x94, + 0x9E, 0xBC, 0x6E, 0x84, 0x1B, 0x6C, 0x94, 0x87, 0xA5, 0xFB, 0xC1, 0x32, + 0x52, 0x1E, 0x97, 0xEF, 0x05, 0xA9, 0xCA, 0x4A, 0x4F, 0x5E, 0x37, 0x42, + 0x65, 0x25, 0x27, 0xAF, 0x1B, 0xA1, 0x06, 0xDB, 0x25, 0x21, 0xE9, 0x7E, + 0xF0, 0x52, 0xCB, 0x7A, 0x36, 0xD9, 0x68, 0xED, 0x8A, 0xC2, 0xEB, 0x4D, + 0xE8, 0xAD, 0xC1, 0x69, 0x32, 0x92, 0x93, 0xD7, 0x8D, 0xD0, 0xB2, 0xA8, + 0xCA, 0x7A, 0x7E, 0x3C, 0xFC, 0x28, 0x71, 0x62, 0x87, 0x30, 0x9C, 0xE2, + 0xC8, 0x15, 0xA8, 0x3A, 0xA9, 0xE9, 0x46, 0xCE, 0xC9, 0xBE, 0x5D, 0xE4, + 0x80, 0xE1, 0xEE, 0x5A, 0x1C, 0x94, 0x87, 0xA5, 0xFB, 0xC1, 0x6E, 0x29, + 0x99, 0x88, 0x92, 0xB4, 0x5C, 0x58, 0xD0, 0x5D, 0x65, 0xED, 0x00, 0x82, + 0xB9, 0x1C, 0xA4, 0xA4, 0xF5, 0xE3, 0x74, 0x20, 0xDB, 0x64, 0xA4, 0x3D, + 0x2F, 0xDE, 0x09, 0x92, 0x90, 0xF4, 0xBF, 0x78, 0x2D, 0x4E, 0x52, 0x52, + 0x7A, 0xF1, 0xBA, 0x13, 0x29, 0x29, 0x3D, 0x78, 0xDD, 0x0A, 0x8D, 0xB6, + 0x4A, 0x43, 0xD2, 0xFD, 0xE0, 0x99, 0x29, 0x0F, 0x4B, 0xF7, 0x82, 0xD4, + 0xE5, 0x25, 0x27, 0xAF, 0x1B, 0xA1, 0x32, 0x92, 0x93, 0xD7, 0x8D, 0xD0, + 0x83, 0x6D, 0x92, 0x90, 0xF4, 0xBF, 0x78, 0x26, 0x4A, 0x43, 0xD2, 0xFD, + 0xE0, 0xB5, 0x39, 0x49, 0x49, 0xEB, 0xC6, 0xE8, 0x4C, 0xA4, 0xA4, 0xF5, + 0xE3, 0x74, 0x20, 0xDB, 0x64, 0xA4, 0x3D, 0x2F, 0xDE, 0x09, 0x92, 0x90, + 0xF4, 0xBF, 0x78, 0x2D, 0x4E, 0x52, 0x52, 0x7A, 0xF1, 0xBA, 0x13, 0x29, + 0x29, 0x3D, 0x78, 0xDD, 0x08, 0x36, 0xD9, 0x29, 0x0F, 0x4B, 0xF7, 0x82, + 0x64, 0xA4, 0x3D, 0x2F, 0xDE, 0x0B, 0x53, 0x94, 0x94, 0x9E, 0xBC, 0x6E, + 0x84, 0xCA, 0x4A, 0x4F, 0x5E, 0x37, 0x42, 0x0D, 0xB6, 0x4A, 0x43, 0xD2, + 0xFD, 0xE0, 0x99, 0x29, 0x0F, 0x4B, 0xF7, 0x82, 0xD4, 0xE5, 0x25, 0x27, + 0xAF, 0x1B, 0xA1, 0x32, 0x92, 0x93, 0xD7, 0x8D, 0xD0, 0x83, 0x6D, 0x92, + 0x90, 0xF4, 0xBF, 0x78, 0x26, 0x4A, 0x43, 0xD2, 0xFD, 0xE0, 0xB5, 0x39, + 0x49, 0x49, 0xEB, 0xC6, 0xE8, 0x4C, 0xA4, 0xA4, 0xF5, 0xE3, 0x74, 0x20, + 0xDB, 0x64, 0xA4, 0x3D, 0x2F, 0xDE, 0x09, 0x92, 0x90, 0xF4, 0xBF, 0x78, + 0x2D, 0x4E, 0x52, 0x52, 0x7A, 0xF1, 0xBA, 0x13, 0x29, 0x29, 0x3D, 0x78, + 0xDD, 0x08, 0x3A, 0x5A, 0x2A, 0x86, 0x14, 0x74, 0x72, 0xF6, 0x56, 0x43, + 0xBA, 0x6B, 0x35, 0xAD, 0xA7, 0xEA, 0x7F, 0xD3, 0xEA, 0xB4, 0x1E, 0x8D, + 0xD2, 0xB3, 0x53, 0xD1, 0xE2, 0x36, 0x65, 0xF6, 0xC0, 0x02, 0xAC, 0xD5, + 0x54, 0xB7, 0xFF, 0x00, 0xA9, 0xFF, 0x00, 0x4F, 0xAA, 0x82, 0x9F, 0xAA, + 0x3D, 0xCF, 0xAA, 0xC2, 0xA5, 0x28, 0x68, 0x34, 0xA3, 0xE1, 0xBA, 0x33, + 0xDE, 0xDB, 0x02, 0xA1, 0x65, 0x66, 0xFE, 0xA8, 0xF7, 0x3E, 0xAB, 0x45, + 0xE9, 0x35, 0x27, 0x35, 0x21, 0x16, 0x00, 0x96, 0x89, 0x60, 0x39, 0xA6, + 0xBC, 0xC0, 0xAD, 0x0B, 0xB2, 0x46, 0x4F, 0x5D, 0x1B, 0xC9, 0x32, 0x46, + 0x4F, 0x5D, 0x1B, 0xC9, 0x68, 0x72, 0x8E, 0x93, 0xD7, 0xFC, 0xA1, 0x32, + 0x8E, 0x93, 0xD7, 0xFC, 0xA1, 0x51, 0xBE, 0xC9, 0x19, 0x3D, 0x74, 0x6F, + 0x24, 0xC9, 0x19, 0x3D, 0x74, 0x6F, 0x25, 0xA1, 0xCA, 0x3A, 0x4F, 0x5F, + 0xF2, 0x84, 0xCA, 0x3A, 0x4F, 0x5F, 0xF2, 0x84, 0x1B, 0xEC, 0x91, 0x93, + 0xD7, 0x46, 0xF2, 0x4C, 0x91, 0x93, 0xD7, 0x46, 0xF2, 0x5A, 0x1C, 0xA3, + 0xA4, 0xF5, 0xFF, 0x00, 0x28, 0x4C, 0xA3, 0xA4, 0xF5, 0xFF, 0x00, 0x28, + 0x41, 0xBE, 0xC9, 0x19, 0x3D, 0x74, 0x6F, 0x24, 0xC9, 0x19, 0x3D, 0x74, + 0x6F, 0x25, 0xA1, 0xCA, 0x3A, 0x4F, 0x5F, 0xF2, 0x84, 0xCA, 0x3A, 0x4F, + 0x5F, 0xF2, 0x84, 0x1B, 0xEC, 0x91, 0x93, 0xD7, 0x46, 0xF2, 0x4C, 0x91, + 0x93, 0xD7, 0x46, 0xF2, 0x5A, 0x1C, 0xA3, 0xA4, 0xF5, 0xFF, 0x00, 0x28, + 0x4C, 0xA3, 0xA4, 0xF5, 0xFF, 0x00, 0x28, 0x41, 0xBE, 0xC9, 0x19, 0x3D, + 0x74, 0x6F, 0x24, 0xC9, 0x19, 0x3D, 0x74, 0x6F, 0x25, 0xA1, 0xCA, 0x3A, + 0x4F, 0x5F, 0xF2, 0x84, 0xCA, 0x3A, 0x4F, 0x5F, 0xF2, 0x84, 0x1B, 0xEC, + 0x91, 0x93, 0xD7, 0x46, 0xF2, 0x4C, 0x91, 0x93, 0xD7, 0x46, 0xF2, 0x5A, + 0x1C, 0xA3, 0xA4, 0xF5, 0xFF, 0x00, 0x28, 0x4C, 0xA3, 0xA4, 0xF5, 0xFF, + 0x00, 0x28, 0x41, 0xBE, 0xC9, 0x19, 0x3D, 0x74, 0x6F, 0x24, 0xC9, 0x19, + 0x3D, 0x74, 0x6F, 0x25, 0xA1, 0xCA, 0x3A, 0x4F, 0x5F, 0xF2, 0x84, 0xCA, + 0x3A, 0x4F, 0x5F, 0xF2, 0x84, 0x1B, 0xEC, 0x91, 0x93, 0xD7, 0x46, 0xF2, + 0x5B, 0x89, 0x19, 0x46, 0x48, 0xCA, 0xB2, 0x5E, 0x1B, 0x8B, 0x9A, 0xCE, + 0x82, 0x7A, 0x57, 0x13, 0x94, 0x74, 0x9E, 0xBF, 0xE5, 0x0B, 0xAF, 0xA1, + 0x26, 0x22, 0xCD, 0x51, 0x90, 0x63, 0x46, 0x75, 0xA7, 0xBA, 0xBA, 0xCF, + 0xF6, 0xA0, 0xC4, 0x9C, 0xF4, 0x6A, 0x56, 0x72, 0x6A, 0x24, 0x78, 0x91, + 0x62, 0x07, 0x3C, 0xD6, 0x40, 0xAA, 0xA5, 0x0E, 0x48, 0xC9, 0xEB, 0xA3, + 0x79, 0x2D, 0x75, 0x2F, 0x4E, 0x4F, 0xCB, 0x52, 0x51, 0xE0, 0xC2, 0x8D, + 0x53, 0x1A, 0xEA, 0x80, 0xB2, 0x16, 0x16, 0x51, 0xD2, 0x7A, 0xFF, 0x00, + 0x94, 0x2A, 0x37, 0xD9, 0x23, 0x27, 0xAE, 0x8D, 0xE4, 0x99, 0x23, 0x27, + 0xAE, 0x8D, 0xE4, 0xB4, 0x39, 0x47, 0x49, 0xEB, 0xFE, 0x50, 0x99, 0x47, + 0x49, 0xEB, 0xFE, 0x50, 0x83, 0x7D, 0x92, 0x32, 0x7A, 0xE8, 0xDE, 0x49, + 0x92, 0x32, 0x7A, 0xE8, 0xDE, 0x4B, 0x43, 0x94, 0x74, 0x9E, 0xBF, 0xE5, + 0x09, 0x94, 0x74, 0x9E, 0xBF, 0xE5, 0x08, 0x37, 0xD9, 0x23, 0x27, 0xAE, + 0x8D, 0xE4, 0x99, 0x23, 0x27, 0xAE, 0x8D, 0xE4, 0xB4, 0x39, 0x47, 0x49, + 0xEB, 0xFE, 0x50, 0x99, 0x47, 0x49, 0xEB, 0xFE, 0x50, 0x83, 0x7D, 0x92, + 0x32, 0x7A, 0xE8, 0xDE, 0x49, 0x92, 0x32, 0x7A, 0xE8, 0xDE, 0x4B, 0x43, + 0x94, 0x74, 0x9E, 0xBF, 0xE5, 0x09, 0x94, 0x74, 0x9E, 0xBF, 0xE5, 0x08, + 0x37, 0xD9, 0x23, 0x27, 0xAE, 0x8D, 0xE4, 0x99, 0x23, 0x27, 0xAE, 0x8D, + 0xE4, 0xB4, 0x39, 0x47, 0x49, 0xEB, 0xFE, 0x50, 0x99, 0x47, 0x49, 0xEB, + 0xFE, 0x50, 0x83, 0x7D, 0x92, 0x32, 0x7A, 0xE8, 0xDE, 0x49, 0x92, 0x32, + 0x7A, 0xE8, 0xDE, 0x4B, 0x43, 0x94, 0x74, 0x9E, 0xBF, 0xE5, 0x09, 0x94, + 0x74, 0x9E, 0xBF, 0xE5, 0x08, 0x37, 0xD9, 0x23, 0x27, 0xAE, 0x8D, 0xE4, + 0x99, 0x23, 0x27, 0xAE, 0x8D, 0xE4, 0xB4, 0x39, 0x47, 0x49, 0xEB, 0xFE, + 0x50, 0x99, 0x47, 0x49, 0xEB, 0xFE, 0x50, 0x83, 0x7D, 0x92, 0x32, 0x7A, + 0xE8, 0xDE, 0x4A, 0xAD, 0xF4, 0x4E, 0x51, 0xAE, 0x0E, 0x11, 0xA2, 0xD6, + 0x0D, 0x7E, 0xE5, 0xA0, 0xCA, 0x3A, 0x4F, 0x5F, 0xF2, 0x85, 0x74, 0x3F, + 0x48, 0xA9, 0x27, 0x44, 0x63, 0x4C, 0x7C, 0xC4, 0x81, 0xF9, 0x42, 0x0E, + 0xDE, 0x38, 0xAA, 0x5A, 0x20, 0xD0, 0xC3, 0xC1, 0x5B, 0x35, 0xD4, 0xA3, + 0x78, 0x6E, 0xE0, 0xAE, 0x8C, 0x6B, 0x95, 0x88, 0x7F, 0xF0, 0x3C, 0x15, + 0xB3, 0x5D, 0x4A, 0x37, 0x86, 0xEE, 0x0B, 0x33, 0xD9, 0xAC, 0x3C, 0xA1, + 0x59, 0x5E, 0xA5, 0x07, 0xC3, 0x6F, 0x05, 0x58, 0x5D, 0x55, 0x9D, 0xC1, + 0xC1, 0x52, 0x57, 0xA9, 0x41, 0xF0, 0xDB, 0xC1, 0x56, 0x17, 0x55, 0x67, + 0x70, 0x70, 0x52, 0x0C, 0xFC, 0xA5, 0xE6, 0xB1, 0xFD, 0x7C, 0x4E, 0xF1, + 0xE2, 0xA3, 0x52, 0x47, 0xF5, 0xF1, 0x3B, 0xC7, 0x8A, 0x8D, 0x6A, 0x19, + 0x11, 0x11, 0x14, 0x44, 0x44, 0x13, 0x49, 0xC1, 0x13, 0x13, 0x50, 0xA0, + 0xB8, 0x90, 0x1E, 0xEA, 0xAB, 0x1D, 0x2B, 0x31, 0xB4, 0x74, 0x37, 0x18, + 0x45, 0xFC, 0xAC, 0x20, 0xE7, 0x96, 0x90, 0xE0, 0x09, 0xA8, 0x0A, 0xEB, + 0x1F, 0xFE, 0xF7, 0xAC, 0x08, 0x31, 0x5D, 0x02, 0x2B, 0x62, 0x32, 0xAB, + 0x4D, 0x35, 0x8A, 0xD5, 0xF0, 0x66, 0xA2, 0x40, 0x65, 0x96, 0x59, 0xAA, + 0xD5, 0xAC, 0xE3, 0xDF, 0x51, 0x1F, 0x54, 0x19, 0x30, 0xA8, 0xE0, 0x5F, + 0x66, 0x23, 0xCD, 0x5C, 0xA0, 0x68, 0x2D, 0xE8, 0x73, 0x4B, 0x49, 0x04, + 0x60, 0xA9, 0x06, 0x4E, 0x14, 0xC9, 0x86, 0xE8, 0x4F, 0x7B, 0x5A, 0x62, + 0x06, 0x38, 0x3A, 0xAA, 0xC5, 0x60, 0x90, 0x46, 0x05, 0x47, 0x0A, 0x7E, + 0x34, 0x28, 0x70, 0xE1, 0x8B, 0x2E, 0x6C, 0x37, 0x5A, 0x6D, 0xA1, 0xFC, + 0xE6, 0xFE, 0x33, 0x9C, 0x55, 0x04, 0xEC, 0x46, 0x39, 0x86, 0x1B, 0x19, + 0x0D, 0xAC, 0x75, 0xA0, 0xD6, 0x8C, 0xD5, 0xE9, 0x3E, 0xF2, 0x82, 0x56, + 0xC9, 0xB1, 0xD2, 0xC2, 0x23, 0x4B, 0xDE, 0x6C, 0x17, 0x17, 0x32, 0xA2, + 0x18, 0x74, 0x11, 0xD2, 0x3F, 0x95, 0x82, 0xB2, 0x5B, 0x38, 0xF6, 0xB4, + 0x55, 0x0E, 0x1F, 0x28, 0x1B, 0x60, 0x44, 0xA8, 0xDA, 0x02, 0xAA, 0xB4, + 0xD5, 0xD1, 0xFB, 0x2C, 0x64, 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0x9B, + 0x43, 0xFB, 0x4A, 0x0F, 0xF2, 0xB0, 0x96, 0x6D, 0x0F, 0xED, 0x28, 0x3F, + 0xCA, 0x93, 0xD9, 0x1D, 0x97, 0xA4, 0x3E, 0xC4, 0x8F, 0xDD, 0x0B, 0x80, + 0x5D, 0xFF, 0x00, 0xA4, 0x3E, 0xC4, 0x8F, 0xDD, 0x0B, 0x80, 0x48, 0x04, + 0x44, 0x55, 0x44, 0x44, 0x40, 0x44, 0x44, 0x19, 0x02, 0x5C, 0x59, 0x95, + 0x36, 0x8F, 0xFC, 0xC4, 0x83, 0xFB, 0x7E, 0x2A, 0x94, 0xDC, 0xC1, 0x86, + 0x2C, 0x3A, 0x9E, 0x79, 0x2A, 0xDE, 0x22, 0x3A, 0xAC, 0xED, 0xB3, 0x9C, + 0xF9, 0x54, 0x7F, 0xB5, 0x0C, 0x29, 0xB7, 0x43, 0x63, 0x1A, 0x61, 0xC3, + 0x7F, 0x26, 0x6B, 0x61, 0x70, 0x35, 0xB4, 0xE3, 0x9F, 0xFB, 0x54, 0x6C, + 0xDC, 0x56, 0xC1, 0x8D, 0x08, 0x38, 0x16, 0xC6, 0x20, 0xB8, 0x91, 0x9F, + 0xFA, 0x41, 0x24, 0x58, 0x12, 0xF0, 0x4F, 0x27, 0x11, 0xF1, 0x04, 0x5B, + 0x01, 0xD5, 0x81, 0xF8, 0x41, 0x22, 0xB0, 0x3E, 0xEB, 0x11, 0x64, 0x89, + 0xE8, 0x80, 0x03, 0x62, 0x19, 0x88, 0x1B, 0x60, 0x45, 0xA8, 0xDA, 0x02, + 0xAA, 0xBF, 0x8E, 0x8C, 0xD5, 0xD5, 0x5A, 0xC6, 0x40, 0x44, 0x44, 0x04, + 0x44, 0x40, 0x44, 0x44, 0x1D, 0x17, 0xA2, 0x1D, 0x6A, 0x27, 0xF5, 0xF5, + 0x5D, 0x6F, 0xEA, 0x7F, 0xD3, 0xEA, 0xB9, 0x2F, 0x44, 0x3A, 0xD4, 0x4F, + 0xEB, 0xEA, 0xBA, 0xDF, 0xD4, 0xFF, 0x00, 0xA7, 0xD5, 0x65, 0x14, 0xFD, + 0x51, 0xEE, 0x7D, 0x57, 0x2F, 0xE9, 0xA7, 0xAE, 0x96, 0xEE, 0x9E, 0x2B, + 0xA8, 0xFD, 0x51, 0xEE, 0x7D, 0x57, 0x2F, 0xE9, 0xA7, 0xAE, 0x96, 0xEE, + 0x9E, 0x2B, 0x43, 0x99, 0x44, 0x44, 0x51, 0x11, 0x10, 0x11, 0x11, 0x06, + 0xC6, 0x5A, 0x8F, 0x6C, 0x68, 0x50, 0x1C, 0x5B, 0x14, 0x98, 0xA4, 0x82, + 0xE6, 0xD5, 0x53, 0x73, 0xD4, 0xAD, 0x14, 0x7B, 0x5D, 0x0E, 0x5D, 0xCC, + 0x88, 0x5C, 0x5E, 0x7F, 0x18, 0xAB, 0xA1, 0xB6, 0xCB, 0x41, 0x1F, 0xB6, + 0x6F, 0x30, 0xB1, 0x44, 0xC4, 0x41, 0xC8, 0xD5, 0x57, 0xFC, 0x26, 0xB6, + 0xE6, 0xFD, 0xEB, 0x52, 0x32, 0x7A, 0x33, 0x23, 0x42, 0x8A, 0xCB, 0x21, + 0xD0, 0xC1, 0x00, 0x55, 0x98, 0x82, 0x49, 0x20, 0xE2, 0x50, 0x4B, 0xCD, + 0x20, 0x34, 0xC1, 0x63, 0xDF, 0x10, 0x3A, 0x31, 0x20, 0x38, 0x00, 0x43, + 0x7F, 0x11, 0x6F, 0x47, 0xF4, 0x8C, 0x91, 0x67, 0xE0, 0x11, 0x22, 0x54, + 0xE2, 0xD7, 0x1B, 0x35, 0x81, 0x68, 0x87, 0x55, 0x50, 0x27, 0x15, 0x18, + 0x9F, 0x88, 0x03, 0x3F, 0xE3, 0x86, 0x5E, 0xCA, 0xCB, 0x1E, 0x5B, 0x59, + 0x6D, 0x66, 0xBF, 0xE3, 0xA4, 0xAB, 0x5B, 0x39, 0x10, 0x35, 0xAC, 0x73, + 0x58, 0xF6, 0x06, 0x96, 0x90, 0xE1, 0xD2, 0x09, 0xAF, 0x8A, 0x0B, 0x66, + 0xA0, 0x88, 0x11, 0x43, 0x43, 0x62, 0x36, 0xB6, 0x83, 0x65, 0xE2, 0xA2, + 0x3F, 0xFB, 0xFC, 0xA8, 0x54, 0xB1, 0xE3, 0xBA, 0x31, 0x6D, 0x6D, 0x6B, + 0x5A, 0xC6, 0xD9, 0x6B, 0x5B, 0xD0, 0x05, 0x64, 0xF1, 0x25, 0x44, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0xBB, 0xFF, 0x00, 0x47, 0x3D, 0x8B, 0x2F, + 0xFC, 0x1E, 0x2B, 0x80, 0x5D, 0xFF, 0x00, 0xA3, 0x9E, 0xC5, 0x97, 0xFE, + 0x0F, 0x14, 0x47, 0x23, 0x4F, 0xFB, 0x66, 0x6B, 0xBE, 0xB5, 0xCB, 0x63, + 0x4F, 0xFB, 0x66, 0x6B, 0xBE, 0xB5, 0xCA, 0x90, 0x22, 0x22, 0x8A, 0x22, + 0x22, 0x02, 0x9A, 0x56, 0x08, 0x8F, 0x14, 0xB0, 0x92, 0x2A, 0x63, 0xDD, + 0x9B, 0xFF, 0x00, 0x16, 0x93, 0xF4, 0x50, 0xAB, 0xE0, 0xC5, 0x74, 0x08, + 0x82, 0x23, 0x2A, 0xAC, 0x56, 0x2A, 0x22, 0xB0, 0x41, 0x15, 0x11, 0x82, + 0x0C, 0x89, 0x79, 0x36, 0xC7, 0x82, 0xD7, 0x5A, 0x21, 0xEF, 0x73, 0xD8, + 0xD1, 0xA4, 0x86, 0x82, 0x07, 0xF7, 0x5D, 0x4A, 0xE6, 0xC9, 0xC3, 0x6C, + 0xB8, 0x8D, 0x15, 0xEE, 0xCC, 0xDB, 0x4E, 0x6B, 0x7A, 0x73, 0x9A, 0x9A, + 0x3C, 0x89, 0xC1, 0x42, 0xF9, 0xA7, 0x9E, 0x4C, 0x43, 0x6B, 0x61, 0x36, + 0x1B, 0xAD, 0x34, 0x32, 0xBC, 0xC7, 0x36, 0x7C, 0xE4, 0x9F, 0x70, 0x57, + 0x19, 0xE8, 0x8E, 0x8D, 0x12, 0x23, 0xDA, 0xC7, 0x08, 0x80, 0x07, 0x30, + 0x8F, 0xC3, 0x50, 0xE8, 0x1F, 0xB5, 0x55, 0x20, 0x8A, 0x30, 0x84, 0x1C, + 0x0C, 0x17, 0x38, 0xB4, 0x8A, 0xEA, 0x70, 0xCE, 0x0E, 0x8F, 0xDD, 0x46, + 0xA5, 0x8F, 0x1D, 0xD1, 0x8B, 0x6B, 0x0D, 0x6B, 0x58, 0xDB, 0x2D, 0x6B, + 0x7A, 0x1A, 0x3A, 0x7E, 0xA5, 0x44, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0xAF, 0x81, 0xEB, 0xA1, 0xF7, 0x87, 0x15, 0x62, 0xBE, 0x07, 0xAE, 0x87, + 0xDE, 0x1C, 0x51, 0x1E, 0x95, 0x1B, 0xAA, 0x3F, 0xC3, 0x3C, 0x15, 0x26, + 0xBA, 0x94, 0x6F, 0x0D, 0xDC, 0x15, 0x63, 0x75, 0x47, 0xF8, 0x67, 0x82, + 0xA4, 0xD7, 0x52, 0x8D, 0xE1, 0xBB, 0x82, 0x93, 0xD9, 0xAC, 0x3C, 0xA1, + 0x59, 0x5E, 0xA5, 0x07, 0xC3, 0x6F, 0x05, 0x58, 0x5D, 0x59, 0x9D, 0xC1, + 0xC1, 0x52, 0x57, 0xA9, 0x41, 0xF0, 0xDB, 0xC1, 0x5D, 0x04, 0xD5, 0x2F, + 0x0C, 0xFF, 0x00, 0xE0, 0x38, 0x29, 0x06, 0x7E, 0x52, 0xE0, 0x23, 0x51, + 0x53, 0xA6, 0x34, 0x43, 0xC8, 0x3B, 0xF3, 0x1F, 0x78, 0xD2, 0xAC, 0xBA, + 0x67, 0x75, 0x07, 0x10, 0xBA, 0xA7, 0xFA, 0x49, 0x45, 0x87, 0xB8, 0x39, + 0xAF, 0xB4, 0x0D, 0x47, 0xFE, 0x35, 0x6E, 0x52, 0xD1, 0x5D, 0x97, 0xFC, + 0x34, 0xB6, 0x5C, 0xBD, 0xD3, 0x3B, 0xA8, 0x38, 0x84, 0xBA, 0x67, 0x75, + 0x07, 0x10, 0xBA, 0x8C, 0xA5, 0xA2, 0xBB, 0x2F, 0xF8, 0x69, 0x94, 0xB4, + 0x57, 0x65, 0xFF, 0x00, 0x0D, 0x5B, 0x91, 0xCB, 0xDD, 0x33, 0xBA, 0x83, + 0x88, 0x4B, 0xA6, 0x77, 0x50, 0x71, 0x0B, 0xA8, 0xCA, 0x5A, 0x2B, 0xB2, + 0xFF, 0x00, 0x86, 0x99, 0x4B, 0x45, 0x76, 0x5F, 0xF0, 0xD2, 0xE4, 0x72, + 0xF7, 0x4C, 0xEE, 0xA0, 0xE2, 0x12, 0xE9, 0x9D, 0xD4, 0x1C, 0x42, 0xEA, + 0x32, 0x96, 0x8A, 0xEC, 0xBF, 0xE1, 0xA6, 0x52, 0xD1, 0x5D, 0x97, 0xFC, + 0x34, 0xB9, 0x1C, 0xBD, 0xD3, 0x3B, 0xA8, 0x38, 0x84, 0xBA, 0x67, 0x75, + 0x07, 0x10, 0xBA, 0x8C, 0xA5, 0xA2, 0xBB, 0x2F, 0xF8, 0x69, 0x94, 0xB4, + 0x57, 0x65, 0xFF, 0x00, 0x0D, 0x2E, 0x47, 0x2F, 0x74, 0xCE, 0xEA, 0x0E, + 0x21, 0x2E, 0x99, 0xDD, 0x41, 0xC4, 0x2E, 0xA3, 0x29, 0x68, 0xAE, 0xCB, + 0xFE, 0x1A, 0x65, 0x2D, 0x15, 0xD9, 0x7F, 0xC3, 0x4B, 0x91, 0xCB, 0xDD, + 0x33, 0xBA, 0x83, 0x88, 0x4B, 0xA6, 0x77, 0x50, 0x71, 0x0B, 0xA8, 0xCA, + 0x5A, 0x2B, 0xB2, 0xFF, 0x00, 0x86, 0x99, 0x4B, 0x45, 0x76, 0x5F, 0xF0, + 0xD2, 0xE4, 0x72, 0xF7, 0x4C, 0xEE, 0xA0, 0xE2, 0x12, 0xE9, 0x9D, 0xD4, + 0x1C, 0x42, 0xEA, 0x32, 0x96, 0x8A, 0xEC, 0xBF, 0xE1, 0xA6, 0x52, 0xD1, + 0x5D, 0x97, 0xFC, 0x34, 0xB9, 0x1C, 0xBD, 0xD3, 0x3B, 0xA8, 0x38, 0x85, + 0x95, 0x46, 0x51, 0xF3, 0x50, 0x67, 0xA1, 0x44, 0x89, 0x04, 0xB5, 0xA0, + 0xE7, 0x35, 0x85, 0xBE, 0xCA, 0x5A, 0x2B, 0xB2, 0xFF, 0x00, 0x86, 0xA5, + 0x96, 0xA7, 0x68, 0xD9, 0xA8, 0xEC, 0x83, 0x0D, 0xAE, 0xB4, 0xF3, 0x50, + 0xAD, 0x80, 0x05, 0x06, 0x45, 0x37, 0x06, 0x24, 0x7A, 0x22, 0x34, 0x38, + 0x4D, 0x2E, 0x79, 0x02, 0xA0, 0x17, 0x15, 0x74, 0xCE, 0xEA, 0x0E, 0x21, + 0x77, 0xF3, 0x93, 0x50, 0xE4, 0xE5, 0x9F, 0x1E, 0x35, 0x66, 0x1B, 0x7A, + 0x6A, 0x15, 0xAD, 0x46, 0x52, 0xD1, 0x5D, 0x97, 0xFC, 0x34, 0x1C, 0xBD, + 0xD3, 0x3B, 0xA8, 0x38, 0x84, 0xBA, 0x67, 0x75, 0x07, 0x10, 0xBA, 0x8C, + 0xA5, 0xA2, 0xBB, 0x2F, 0xF8, 0x69, 0x94, 0xB4, 0x57, 0x65, 0xFF, 0x00, + 0x0D, 0x5B, 0x91, 0xCB, 0xDD, 0x33, 0xBA, 0x83, 0x88, 0x4B, 0xA6, 0x77, + 0x50, 0x71, 0x0B, 0xA8, 0xCA, 0x5A, 0x2B, 0xB2, 0xFF, 0x00, 0x86, 0x99, + 0x4B, 0x45, 0x76, 0x5F, 0xF0, 0xD2, 0xE4, 0x72, 0xF7, 0x4C, 0xEE, 0xA0, + 0xE2, 0x12, 0xE9, 0x9D, 0xD4, 0x1C, 0x42, 0xEA, 0x32, 0x96, 0x8A, 0xEC, + 0xBF, 0xE1, 0xA6, 0x52, 0xD1, 0x5D, 0x97, 0xFC, 0x34, 0xB9, 0x1C, 0xBD, + 0xD3, 0x3B, 0xA8, 0x38, 0x84, 0xBA, 0x67, 0x75, 0x07, 0x10, 0xBA, 0x8C, + 0xA5, 0xA2, 0xBB, 0x2F, 0xF8, 0x69, 0x94, 0xB4, 0x57, 0x65, 0xFF, 0x00, + 0x0D, 0x2E, 0x47, 0x2F, 0x74, 0xCE, 0xEA, 0x0E, 0x21, 0x2E, 0x99, 0xDD, + 0x41, 0xC4, 0x2E, 0xA3, 0x29, 0x68, 0xAE, 0xCB, 0xFE, 0x1A, 0x65, 0x2D, + 0x15, 0xD9, 0x7F, 0xC3, 0x4B, 0x91, 0xCB, 0xDD, 0x33, 0xBA, 0x83, 0x88, + 0x4B, 0xA6, 0x77, 0x50, 0x71, 0x0B, 0xA8, 0xCA, 0x5A, 0x2B, 0xB2, 0xFF, + 0x00, 0x86, 0x99, 0x4B, 0x45, 0x76, 0x5F, 0xF0, 0xD2, 0xE4, 0x72, 0xF7, + 0x4C, 0xEE, 0xA0, 0xE2, 0x12, 0xE9, 0x9D, 0xD4, 0x1C, 0x42, 0xEA, 0x32, + 0x96, 0x8A, 0xEC, 0xBF, 0xE1, 0xA6, 0x52, 0xD1, 0x5D, 0x97, 0xFC, 0x34, + 0xB9, 0x1C, 0xBD, 0xD3, 0x3B, 0xA8, 0x38, 0x84, 0xBA, 0x67, 0x75, 0x07, + 0x10, 0xBA, 0x8C, 0xA5, 0xA2, 0xBB, 0x2F, 0xF8, 0x69, 0x94, 0xB4, 0x57, + 0x65, 0xFF, 0x00, 0x0D, 0x2E, 0x46, 0x1F, 0xA3, 0x12, 0x91, 0xE5, 0xA6, + 0x9F, 0xCB, 0xC3, 0x2C, 0xB5, 0xD1, 0x5A, 0xE9, 0xBF, 0x53, 0xFE, 0x9F, + 0x55, 0x85, 0x47, 0x52, 0x92, 0x54, 0x84, 0x47, 0x09, 0x66, 0x90, 0xE6, + 0x0F, 0x7B, 0x40, 0x59, 0xBF, 0xA9, 0xFF, 0x00, 0x4F, 0xAA, 0x82, 0x9F, + 0xAA, 0x3D, 0xCF, 0xAA, 0xD0, 0x7A, 0x55, 0x21, 0x35, 0x39, 0x16, 0x01, + 0x96, 0x82, 0xE8, 0x81, 0xAD, 0x35, 0xD5, 0xEE, 0x5B, 0xFF, 0x00, 0xD5, + 0x1E, 0xE7, 0xD5, 0x62, 0xD2, 0x34, 0xBC, 0xB5, 0x1A, 0xF6, 0x36, 0x62, + 0xDD, 0x6F, 0x15, 0x8B, 0x22, 0xB5, 0xA1, 0xC5, 0xDC, 0x74, 0x96, 0xC9, + 0x11, 0x2E, 0x3A, 0x4B, 0x64, 0x88, 0xBA, 0x7C, 0xAA, 0xA3, 0xBF, 0xCB, + 0xB8, 0x99, 0x55, 0x47, 0x7F, 0x97, 0x71, 0x51, 0xCC, 0x5C, 0x74, 0x96, + 0xC9, 0x11, 0x2E, 0x3A, 0x4B, 0x64, 0x88, 0xBA, 0x7C, 0xAA, 0xA3, 0xBF, + 0xCB, 0xB8, 0x99, 0x55, 0x47, 0x7F, 0x97, 0x71, 0x07, 0x31, 0x71, 0xD2, + 0x5B, 0x24, 0x44, 0xB8, 0xE9, 0x2D, 0x92, 0x22, 0xE9, 0xF2, 0xAA, 0x8E, + 0xFF, 0x00, 0x2E, 0xE2, 0x65, 0x55, 0x1D, 0xFE, 0x5D, 0xC4, 0x1C, 0xC5, + 0xC7, 0x49, 0x6C, 0x91, 0x12, 0xE3, 0xA4, 0xB6, 0x48, 0x8B, 0xA7, 0xCA, + 0xAA, 0x3B, 0xFC, 0xBB, 0x89, 0x95, 0x54, 0x77, 0xF9, 0x77, 0x10, 0x73, + 0x17, 0x1D, 0x25, 0xB2, 0x44, 0x4B, 0x8E, 0x92, 0xD9, 0x22, 0x2E, 0x9F, + 0x2A, 0xA8, 0xEF, 0xF2, 0xEE, 0x26, 0x55, 0x51, 0xDF, 0xE5, 0xDC, 0x41, + 0xCC, 0x5C, 0x74, 0x96, 0xC9, 0x11, 0x2E, 0x3A, 0x4B, 0x64, 0x88, 0xBA, + 0x7C, 0xAA, 0xA3, 0xBF, 0xCB, 0xB8, 0x99, 0x55, 0x47, 0x7F, 0x97, 0x71, + 0x07, 0x31, 0x71, 0xD2, 0x5B, 0x24, 0x44, 0xB8, 0xE9, 0x2D, 0x92, 0x22, + 0xE9, 0xF2, 0xAA, 0x8E, 0xFF, 0x00, 0x2E, 0xE2, 0x65, 0x55, 0x1D, 0xFE, + 0x5D, 0xC4, 0x1C, 0xC5, 0xC7, 0x49, 0x6C, 0x91, 0x12, 0xE3, 0xA4, 0xB6, + 0x48, 0x8B, 0xA7, 0xCA, 0xAA, 0x3B, 0xFC, 0xBB, 0x89, 0x95, 0x54, 0x77, + 0xF9, 0x77, 0x10, 0x73, 0x17, 0x1D, 0x25, 0xB2, 0x44, 0x5D, 0x9D, 0x05, + 0x06, 0x24, 0xBD, 0x15, 0x06, 0x14, 0x66, 0x16, 0x3D, 0xB5, 0xD6, 0x0F, + 0xF2, 0xB0, 0xF2, 0xAA, 0x8E, 0xFF, 0x00, 0x2E, 0xE2, 0xDA, 0xC9, 0xCD, + 0x43, 0x9D, 0x96, 0x6C, 0x78, 0x36, 0xAC, 0x3B, 0xA2, 0xD0, 0xA8, 0xA8, + 0x39, 0x1A, 0x66, 0x89, 0x9E, 0x8F, 0x4A, 0x4C, 0x45, 0x85, 0x2C, 0xF7, + 0x31, 0xCE, 0xAC, 0x11, 0xEF, 0x58, 0x37, 0x1D, 0x25, 0xB2, 0x44, 0x5D, + 0x6C, 0xD7, 0xA4, 0x52, 0x52, 0x93, 0x0F, 0x81, 0x17, 0x95, 0xB6, 0xC3, + 0x51, 0xA9, 0xB5, 0x85, 0x0E, 0x55, 0x51, 0xDF, 0xE5, 0xDC, 0x54, 0x73, + 0x17, 0x1D, 0x25, 0xB2, 0x44, 0x4B, 0x8E, 0x92, 0xD9, 0x22, 0x2E, 0x9F, + 0x2A, 0xA8, 0xEF, 0xF2, 0xEE, 0x26, 0x55, 0x51, 0xDF, 0xE5, 0xDC, 0x41, + 0xCC, 0x5C, 0x74, 0x96, 0xC9, 0x11, 0x2E, 0x3A, 0x4B, 0x64, 0x88, 0xBA, + 0x7C, 0xAA, 0xA3, 0xBF, 0xCB, 0xB8, 0x99, 0x55, 0x47, 0x7F, 0x97, 0x71, + 0x07, 0x31, 0x71, 0xD2, 0x5B, 0x24, 0x44, 0xB8, 0xE9, 0x2D, 0x92, 0x22, + 0xE9, 0xF2, 0xAA, 0x8E, 0xFF, 0x00, 0x2E, 0xE2, 0x65, 0x55, 0x1D, 0xFE, + 0x5D, 0xC4, 0x1C, 0xC5, 0xC7, 0x49, 0x6C, 0x91, 0x12, 0xE3, 0xA4, 0xB6, + 0x48, 0x8B, 0xA7, 0xCA, 0xAA, 0x3B, 0xFC, 0xBB, 0x89, 0x95, 0x54, 0x77, + 0xF9, 0x77, 0x10, 0x73, 0x17, 0x1D, 0x25, 0xB2, 0x44, 0x4B, 0x8E, 0x92, + 0xD9, 0x22, 0x2E, 0x9F, 0x2A, 0xA8, 0xEF, 0xF2, 0xEE, 0x26, 0x55, 0x51, + 0xDF, 0xE5, 0xDC, 0x41, 0xCC, 0x5C, 0x74, 0x96, 0xC9, 0x11, 0x2E, 0x3A, + 0x4B, 0x64, 0x88, 0xBA, 0x7C, 0xAA, 0xA3, 0xBF, 0xCB, 0xB8, 0x99, 0x55, + 0x47, 0x7F, 0x97, 0x71, 0x07, 0x31, 0x71, 0xD2, 0x5B, 0x24, 0x44, 0xB8, + 0xE9, 0x2D, 0x92, 0x22, 0xE9, 0xF2, 0xAA, 0x8E, 0xFF, 0x00, 0x2E, 0xE2, + 0x65, 0x55, 0x1D, 0xFE, 0x5D, 0xC4, 0x1C, 0xC5, 0xC7, 0x49, 0x6C, 0x91, + 0x15, 0xF0, 0xA8, 0x4A, 0x45, 0xB1, 0x58, 0x4C, 0xA4, 0x4A, 0x83, 0x81, + 0x39, 0x97, 0x49, 0x95, 0x54, 0x77, 0xF9, 0x77, 0x15, 0x5B, 0xE9, 0x4D, + 0x1E, 0xE7, 0x06, 0x8E, 0x56, 0xB2, 0x6A, 0x1F, 0x83, 0xEE, 0x83, 0x6D, + 0x1B, 0x34, 0xA4, 0x4F, 0x0C, 0xF0, 0x56, 0xCD, 0x75, 0x28, 0xDE, 0x1B, + 0xB8, 0x2B, 0xA3, 0x9A, 0xE5, 0xA2, 0x1D, 0x2C, 0x3C, 0x15, 0xB3, 0x5D, + 0x4A, 0x37, 0x86, 0xEE, 0x0B, 0x33, 0xD9, 0xAC, 0x3C, 0xA1, 0x59, 0x5E, + 0xA5, 0x07, 0xC3, 0x6F, 0x05, 0x58, 0x5D, 0x55, 0x9D, 0xC1, 0xC1, 0x52, + 0x57, 0xA9, 0x41, 0xF0, 0xDB, 0xC1, 0x56, 0x17, 0x55, 0x67, 0x70, 0x70, + 0x52, 0x0C, 0xFC, 0xA5, 0xE6, 0xB1, 0xFD, 0x7C, 0x4E, 0xF1, 0xE2, 0xA3, + 0x52, 0x47, 0xF5, 0xF1, 0x3B, 0xC7, 0x8A, 0x8D, 0x6A, 0x19, 0x11, 0x11, + 0x14, 0x44, 0x44, 0x05, 0x70, 0x63, 0x9C, 0xD7, 0x38, 0x02, 0x5A, 0xDE, + 0x93, 0xA1, 0x5A, 0xB2, 0x65, 0x9E, 0xCE, 0x46, 0x3C, 0x17, 0xBC, 0x43, + 0x31, 0x03, 0x6A, 0x73, 0x81, 0xAB, 0x31, 0xFD, 0x90, 0x46, 0xC9, 0x78, + 0xD1, 0x1E, 0xD6, 0x32, 0x1B, 0x9C, 0xE7, 0x8B, 0x4D, 0x00, 0x67, 0x23, + 0x4F, 0x92, 0xA4, 0x29, 0x78, 0xD1, 0xC1, 0x30, 0xA1, 0xB9, 0xC0, 0x66, + 0x24, 0x05, 0xB0, 0x13, 0x90, 0x20, 0x34, 0x16, 0x39, 0xD1, 0x22, 0x35, + 0x8D, 0x86, 0xD2, 0xC3, 0x67, 0xA0, 0xDA, 0x24, 0x12, 0x34, 0xD4, 0x31, + 0x56, 0x4C, 0xBE, 0x5A, 0x65, 0xB6, 0x21, 0x46, 0x6C, 0x16, 0x88, 0x8E, + 0x89, 0x53, 0x83, 0xAA, 0xFC, 0x40, 0x66, 0xCC, 0x3A, 0x41, 0x15, 0x20, + 0xD7, 0xB9, 0xA5, 0xAE, 0x2D, 0x70, 0x20, 0x83, 0x51, 0x07, 0xDC, 0xA8, + 0xA4, 0x8E, 0xE6, 0xBA, 0x3B, 0xCB, 0x1E, 0xF7, 0xB4, 0x9C, 0xCE, 0x7F, + 0x49, 0xFD, 0xCA, 0x8D, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x66, 0xD0, + 0xFE, 0xD2, 0x83, 0xFC, 0xAC, 0x25, 0x9B, 0x43, 0xFB, 0x4A, 0x0F, 0xF2, + 0xA4, 0xF6, 0x47, 0x65, 0xE9, 0x0F, 0xB1, 0x23, 0xF7, 0x42, 0xE0, 0x17, + 0x7F, 0xE9, 0x0F, 0xB1, 0x23, 0xF7, 0x42, 0xE0, 0x12, 0x01, 0x11, 0x15, + 0x51, 0x11, 0x10, 0x11, 0x11, 0x04, 0x86, 0x04, 0x50, 0xE8, 0x6D, 0x30, + 0xDC, 0x0C, 0x40, 0x0B, 0x05, 0x5F, 0x98, 0x1E, 0x8A, 0x95, 0xED, 0x93, + 0x98, 0x71, 0x70, 0x10, 0x5E, 0x4B, 0x5C, 0x5A, 0x45, 0x5E, 0xF1, 0xD2, + 0x3F, 0x95, 0x98, 0x67, 0x20, 0x98, 0x2C, 0x25, 0xC7, 0x94, 0x81, 0x0C, + 0x72, 0x79, 0xBD, 0xE5, 0xB5, 0x1C, 0x0D, 0x45, 0x5E, 0xE9, 0xA9, 0x78, + 0xB3, 0x0F, 0x73, 0xA2, 0xC3, 0x30, 0xF9, 0x77, 0xBC, 0x07, 0xB5, 0xC1, + 0xC0, 0x17, 0x57, 0x5B, 0x4B, 0x73, 0xE3, 0xEF, 0x41, 0xAE, 0x87, 0x2B, + 0x1E, 0x2B, 0x2D, 0xC3, 0x84, 0xF7, 0x37, 0x48, 0x1D, 0x2A, 0x25, 0xB0, + 0x73, 0xE0, 0x46, 0x74, 0x07, 0xF3, 0x93, 0x04, 0x42, 0x16, 0x48, 0x20, + 0xDA, 0xCC, 0xE2, 0x6B, 0x15, 0x0A, 0xAB, 0xCF, 0xFB, 0x67, 0x58, 0x07, + 0xA4, 0xD5, 0xD1, 0xFB, 0xA0, 0xA2, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0xE8, 0xBD, 0x10, 0xEB, 0x51, 0x3F, 0xAF, 0xAA, 0xEB, 0x7F, 0x53, + 0xFE, 0x9F, 0x55, 0xC9, 0x7A, 0x21, 0xD6, 0xA2, 0x7F, 0x5F, 0x55, 0xD6, + 0xFE, 0xA7, 0xFD, 0x3E, 0xAB, 0x28, 0xA7, 0xEA, 0x8F, 0x73, 0xEA, 0xB9, + 0x7F, 0x4D, 0x3D, 0x74, 0xB7, 0x74, 0xF1, 0x5D, 0x47, 0xEA, 0x8F, 0x73, + 0xEA, 0xB9, 0x7F, 0x4D, 0x3D, 0x74, 0xB7, 0x74, 0xF1, 0x5A, 0x1C, 0xCA, + 0x22, 0x22, 0x88, 0x88, 0x80, 0x88, 0x88, 0x0A, 0xF3, 0x06, 0x20, 0x73, + 0xDA, 0x58, 0x43, 0xA1, 0xFE, 0x61, 0x57, 0x42, 0xB1, 0x6C, 0xDF, 0x16, + 0x5D, 0xD3, 0x13, 0x51, 0xB9, 0x76, 0xD5, 0x30, 0x2A, 0x0D, 0x0D, 0x75, + 0x6D, 0xAD, 0xC0, 0x9A, 0xF3, 0x55, 0x9B, 0x3F, 0x42, 0x0C, 0x07, 0x41, + 0x8A, 0xD1, 0x0C, 0xBA, 0x1B, 0x87, 0x28, 0x2B, 0x66, 0x6F, 0xCD, 0xFC, + 0x2A, 0xC5, 0x97, 0x8D, 0x04, 0x03, 0x16, 0x1B, 0x98, 0x09, 0xAA, 0xB2, + 0x3D, 0xFA, 0x16, 0xC8, 0x52, 0x32, 0xAE, 0x78, 0x25, 0xAF, 0x60, 0x85, + 0x10, 0x18, 0x75, 0x9B, 0x5F, 0x86, 0xAB, 0x39, 0xB3, 0x0A, 0xAA, 0x01, + 0xA7, 0xFA, 0x58, 0x11, 0x1B, 0x0E, 0x1C, 0x02, 0xD6, 0xCC, 0x72, 0xAE, + 0x73, 0x81, 0xB2, 0xC0, 0x43, 0x6A, 0x15, 0xE7, 0x35, 0x81, 0x9F, 0x3F, + 0x14, 0x18, 0xE8, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0xBB, 0xFF, + 0x00, 0x47, 0x3D, 0x8B, 0x2F, 0xFC, 0x1E, 0x2B, 0x80, 0x5D, 0xFF, 0x00, + 0xA3, 0x9E, 0xC5, 0x97, 0xFE, 0x0F, 0x14, 0x47, 0x23, 0x4F, 0xFB, 0x66, + 0x6B, 0xBE, 0xB5, 0xCB, 0x63, 0x4F, 0xFB, 0x66, 0x6B, 0xBE, 0xB5, 0xCA, + 0x90, 0x22, 0x22, 0x8A, 0x22, 0x22, 0x02, 0xBE, 0x1C, 0x27, 0xC5, 0xB5, + 0xC9, 0xB0, 0xBA, 0xC3, 0x6D, 0x3A, 0xA1, 0xD0, 0x34, 0xAB, 0x16, 0x5D, + 0x1F, 0x32, 0xD9, 0x53, 0x1D, 0xCE, 0xCF, 0x6A, 0x18, 0x68, 0x6F, 0x6B, + 0xF1, 0xB4, 0x91, 0x80, 0x28, 0x20, 0x64, 0xBC, 0x67, 0xB1, 0xAE, 0x64, + 0x37, 0x39, 0xAE, 0x75, 0x90, 0x40, 0xE9, 0x3A, 0x15, 0x4C, 0xAC, 0x76, + 0xBD, 0xAC, 0x30, 0x9D, 0x69, 0xFF, 0x00, 0x94, 0x01, 0x5D, 0x7F, 0xC2, + 0xD8, 0x73, 0xB8, 0x10, 0xDA, 0xC8, 0x30, 0x63, 0x10, 0xC8, 0x6E, 0xFC, + 0x2F, 0x2C, 0xAE, 0xBA, 0xDA, 0x6B, 0x24, 0x68, 0xAC, 0xD5, 0xFC, 0x2B, + 0x79, 0x79, 0x66, 0xB2, 0xC5, 0xB6, 0x35, 0xCF, 0x6B, 0xDA, 0x5D, 0x08, + 0x3A, 0xC3, 0x6B, 0xAA, 0xA3, 0x51, 0xCF, 0x59, 0xAA, 0xA3, 0x57, 0xB9, + 0x06, 0xBE, 0x2C, 0x18, 0x90, 0x48, 0x11, 0x58, 0x5B, 0x58, 0xAC, 0x57, + 0xEF, 0x56, 0x29, 0xE3, 0x86, 0x32, 0x1C, 0x36, 0x32, 0x37, 0x2A, 0x41, + 0x24, 0xD5, 0x5D, 0x91, 0xD1, 0xD1, 0x58, 0x19, 0xF4, 0xFF, 0x00, 0x4A, + 0x04, 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0x7C, 0x0F, 0x5D, 0x0F, 0xBC, + 0x38, 0xAB, 0x15, 0xF0, 0x3D, 0x74, 0x3E, 0xF0, 0xE2, 0x88, 0xF4, 0xA8, + 0xDD, 0x51, 0xFE, 0x19, 0xE0, 0xA9, 0x35, 0xD4, 0xA3, 0x78, 0x6E, 0xE0, + 0xAB, 0x1B, 0xAA, 0x3F, 0xC3, 0x3C, 0x15, 0x26, 0xBA, 0x94, 0x6F, 0x0D, + 0xDC, 0x14, 0x9E, 0xCD, 0x61, 0xE5, 0x0A, 0xCA, 0xF5, 0x28, 0x3E, 0x1B, + 0x78, 0x2A, 0xC2, 0xEA, 0xAC, 0xEE, 0x0E, 0x0A, 0x92, 0xBD, 0x4A, 0x0F, + 0x86, 0xDE, 0x0A, 0xE8, 0x19, 0xE5, 0xE1, 0x8F, 0xFC, 0x07, 0x05, 0x20, + 0xCF, 0xCA, 0x5E, 0x69, 0x1F, 0xD7, 0xC4, 0xEF, 0x1E, 0x2A, 0x35, 0xDF, + 0x3E, 0x80, 0x92, 0x73, 0xDC, 0xEE, 0x49, 0x82, 0xB3, 0x5F, 0xE5, 0xAD, + 0x53, 0x27, 0xA4, 0xB5, 0x70, 0xF7, 0x15, 0x65, 0xC1, 0x22, 0xEF, 0x72, + 0x7A, 0x4B, 0x57, 0x0F, 0x71, 0x32, 0x7A, 0x4B, 0x57, 0x0F, 0x71, 0x2C, + 0x70, 0x48, 0xBB, 0xDC, 0x9E, 0x92, 0xD5, 0xC3, 0xDC, 0x4C, 0x9E, 0x92, + 0xD5, 0xC3, 0xDC, 0x4B, 0x1C, 0x12, 0x2E, 0xF7, 0x27, 0xA4, 0xB5, 0x70, + 0xF7, 0x13, 0x27, 0xA4, 0xB5, 0x70, 0xF7, 0x12, 0xC7, 0x04, 0x8B, 0xBD, + 0xC9, 0xE9, 0x2D, 0x5C, 0x3D, 0xC4, 0xC9, 0xE9, 0x2D, 0x5C, 0x3D, 0xC4, + 0xB1, 0xC1, 0x22, 0xEF, 0x72, 0x7A, 0x4B, 0x57, 0x0F, 0x71, 0x32, 0x7A, + 0x4B, 0x57, 0x0F, 0x71, 0x2C, 0x70, 0x48, 0xBB, 0xDC, 0x9E, 0x92, 0xD5, + 0xC3, 0xDC, 0x4C, 0x9E, 0x92, 0xD5, 0xC3, 0xDC, 0x4B, 0x1C, 0x12, 0x2E, + 0xF7, 0x27, 0xA4, 0xB5, 0x70, 0xF7, 0x13, 0x27, 0xA4, 0xB5, 0x70, 0xF7, + 0x12, 0xC7, 0x04, 0xB3, 0x68, 0x7F, 0x69, 0x41, 0xFE, 0x57, 0x61, 0x93, + 0xD2, 0x5A, 0xB8, 0x7B, 0x8A, 0xE8, 0x74, 0x14, 0xAC, 0x27, 0x87, 0xC3, + 0x6B, 0x1A, 0xE1, 0xD0, 0x43, 0x50, 0x3D, 0x21, 0xF6, 0x24, 0x7E, 0xE8, + 0x5C, 0x02, 0xF4, 0xE9, 0x89, 0x78, 0x73, 0x30, 0x1D, 0x06, 0x2B, 0x43, + 0x98, 0xE1, 0x9C, 0x15, 0xAD, 0xC9, 0xE9, 0x2D, 0x5C, 0x3D, 0xC4, 0x1C, + 0x1A, 0x2E, 0xF7, 0x27, 0xA4, 0xB5, 0x70, 0xF7, 0x13, 0x27, 0xA4, 0xB5, + 0x70, 0xF7, 0x12, 0xC7, 0x04, 0x8B, 0xBD, 0xC9, 0xE9, 0x2D, 0x5C, 0x3D, + 0xC4, 0xC9, 0xE9, 0x2D, 0x5C, 0x3D, 0xC4, 0xB1, 0xC1, 0x22, 0xEF, 0x72, + 0x7A, 0x4B, 0x57, 0x0F, 0x71, 0x32, 0x7A, 0x4B, 0x57, 0x0F, 0x71, 0x2C, + 0x70, 0x48, 0xBB, 0xDC, 0x9E, 0x92, 0xD5, 0xC3, 0xDC, 0x4C, 0x9E, 0x92, + 0xD5, 0xC3, 0xDC, 0x4B, 0x1C, 0x12, 0x2E, 0xF7, 0x27, 0xA4, 0xB5, 0x70, + 0xF7, 0x13, 0x27, 0xA4, 0xB5, 0x70, 0xF7, 0x12, 0xC7, 0x04, 0x8B, 0xBD, + 0xC9, 0xE9, 0x2D, 0x5C, 0x3D, 0xC4, 0xC9, 0xE9, 0x2D, 0x5C, 0x3D, 0xC4, + 0xB1, 0xC1, 0x22, 0xEF, 0x72, 0x7A, 0x4B, 0x57, 0x0F, 0x71, 0x32, 0x7A, + 0x4B, 0x57, 0x0F, 0x71, 0x2C, 0x70, 0x48, 0xBB, 0xDC, 0x9E, 0x92, 0xD5, + 0xC3, 0xDC, 0x4C, 0x9E, 0x92, 0xD5, 0xC3, 0xDC, 0x4B, 0x1A, 0x4F, 0x44, + 0x3A, 0xD4, 0x4F, 0xEB, 0xEA, 0xBA, 0xDF, 0xD4, 0xFF, 0x00, 0xA7, 0xD5, + 0x62, 0x49, 0xD1, 0x50, 0x24, 0xE2, 0xDB, 0x82, 0x1A, 0xDD, 0x20, 0x36, + 0xAA, 0xD6, 0x5F, 0xEA, 0x7F, 0xD3, 0xEA, 0xA0, 0xA7, 0xEA, 0x8F, 0x73, + 0xEA, 0xB9, 0x7F, 0x4D, 0x3D, 0x74, 0xB7, 0x74, 0xF1, 0x5D, 0x47, 0xEA, + 0x8F, 0x73, 0xEA, 0xA3, 0x9A, 0xA3, 0xE5, 0x67, 0x1C, 0xD7, 0x4C, 0xC1, + 0x6C, 0x42, 0xD1, 0x50, 0xAF, 0xDC, 0xB4, 0x3C, 0xD5, 0x17, 0xA1, 0xDC, + 0x74, 0x66, 0xC7, 0x0F, 0xCD, 0x2E, 0x3A, 0x33, 0x63, 0x87, 0xE6, 0x9D, + 0x07, 0x9E, 0x22, 0xF4, 0x3B, 0x8E, 0x8C, 0xD8, 0xE1, 0xF9, 0xA5, 0xC7, + 0x46, 0x6C, 0x70, 0xFC, 0xD3, 0xA0, 0xF3, 0xC4, 0x5E, 0x87, 0x71, 0xD1, + 0x9B, 0x1C, 0x3F, 0x34, 0xB8, 0xE8, 0xCD, 0x8E, 0x1F, 0x9A, 0x74, 0x1E, + 0x78, 0x8B, 0xD0, 0xEE, 0x3A, 0x33, 0x63, 0x87, 0xE6, 0x97, 0x1D, 0x19, + 0xB1, 0xC3, 0xF3, 0x4E, 0x83, 0xCF, 0x11, 0x7A, 0x1D, 0xC7, 0x46, 0x6C, + 0x70, 0xFC, 0xD2, 0xE3, 0xA3, 0x36, 0x38, 0x7E, 0x69, 0xD0, 0x79, 0xE2, + 0x2F, 0x43, 0xB8, 0xE8, 0xCD, 0x8E, 0x1F, 0x9A, 0x5C, 0x74, 0x66, 0xC7, + 0x0F, 0xCD, 0x3A, 0x0F, 0x3C, 0x45, 0xE8, 0x77, 0x1D, 0x19, 0xB1, 0xC3, + 0xF3, 0x4B, 0x8E, 0x8C, 0xD8, 0xE1, 0xF9, 0xA7, 0x41, 0xE7, 0x88, 0xBD, + 0x0E, 0xE3, 0xA3, 0x36, 0x38, 0x7E, 0x69, 0x71, 0xD1, 0x9B, 0x1C, 0x3F, + 0x34, 0xE8, 0x3C, 0xF1, 0x77, 0xFE, 0x8E, 0x7B, 0x16, 0x5F, 0xF8, 0x3C, + 0x54, 0x97, 0x1D, 0x19, 0xB1, 0xC3, 0xF3, 0x59, 0x90, 0x20, 0x42, 0x96, + 0x84, 0x21, 0x41, 0x60, 0x63, 0x1B, 0xD0, 0xD1, 0xEE, 0x41, 0xC0, 0xD3, + 0xFE, 0xD9, 0x9A, 0xEF, 0xAD, 0x72, 0xF4, 0x68, 0xD4, 0x44, 0x84, 0x78, + 0xAE, 0x8B, 0x16, 0x59, 0x8F, 0x7B, 0x8D, 0x64, 0x9A, 0xF3, 0xAB, 0x2E, + 0x3A, 0x33, 0x63, 0x87, 0xE6, 0x97, 0x03, 0xCF, 0x11, 0x7A, 0x1D, 0xC7, + 0x46, 0x6C, 0x70, 0xFC, 0xD2, 0xE3, 0xA3, 0x36, 0x38, 0x7E, 0x69, 0xD0, + 0x79, 0xE2, 0x2F, 0x43, 0xB8, 0xE8, 0xCD, 0x8E, 0x1F, 0x9A, 0x5C, 0x74, + 0x66, 0xC7, 0x0F, 0xCD, 0x3A, 0x0F, 0x3C, 0x45, 0xE8, 0x77, 0x1D, 0x19, + 0xB1, 0xC3, 0xF3, 0x4B, 0x8E, 0x8C, 0xD8, 0xE1, 0xF9, 0xA7, 0x41, 0xE7, + 0x88, 0xBD, 0x0E, 0xE3, 0xA3, 0x36, 0x38, 0x7E, 0x69, 0x71, 0xD1, 0x9B, + 0x1C, 0x3F, 0x34, 0xE8, 0x3C, 0xF1, 0x17, 0xA1, 0xDC, 0x74, 0x66, 0xC7, + 0x0F, 0xCD, 0x2E, 0x3A, 0x33, 0x63, 0x87, 0xE6, 0x9D, 0x07, 0x9E, 0x22, + 0xF4, 0x3B, 0x8E, 0x8C, 0xD8, 0xE1, 0xF9, 0xA5, 0xC7, 0x46, 0x6C, 0x70, + 0xFC, 0xD3, 0xA0, 0xF3, 0xC4, 0x5E, 0x87, 0x71, 0xD1, 0x9B, 0x1C, 0x3F, + 0x34, 0xB8, 0xE8, 0xCD, 0x8E, 0x1F, 0x9A, 0x74, 0x1E, 0x78, 0xAF, 0x81, + 0xEB, 0xA1, 0xF7, 0x87, 0x15, 0xE8, 0x17, 0x1D, 0x19, 0xB1, 0xC3, 0xF3, + 0x41, 0x41, 0xD1, 0xA0, 0xD6, 0x25, 0x21, 0x82, 0x3F, 0x94, 0xE8, 0x32, + 0xA3, 0x75, 0x47, 0xF8, 0x67, 0x82, 0xA4, 0xD7, 0x52, 0x8D, 0xE1, 0xBB, + 0x82, 0xBA, 0x60, 0x55, 0x2D, 0x14, 0x0E, 0xC1, 0xE0, 0xAD, 0x9A, 0xEA, + 0x51, 0xBC, 0x37, 0x70, 0x52, 0x7B, 0x35, 0x87, 0x94, 0x2B, 0x2B, 0xD4, + 0xA0, 0xF8, 0x6D, 0xE0, 0xAB, 0x0B, 0xAA, 0xB3, 0xB8, 0x38, 0x2A, 0x4A, + 0xF5, 0x28, 0x3E, 0x1B, 0x78, 0x2A, 0xC2, 0xEA, 0xAC, 0xEE, 0x0E, 0x0A, + 0x41, 0x9F, 0x94, 0xBC, 0xE6, 0x34, 0xCC, 0x71, 0x1A, 0x20, 0x11, 0xA2, + 0x00, 0x1C, 0x7F, 0xEE, 0x3A, 0x55, 0x9C, 0xEA, 0x3E, 0xBE, 0x26, 0xF9, + 0x54, 0x8F, 0xEB, 0xE2, 0x77, 0x8F, 0x15, 0x1A, 0xB1, 0x10, 0xCA, 0x5E, + 0x75, 0x1F, 0x5F, 0x13, 0x7C, 0xA7, 0x3A, 0x8F, 0xAF, 0x89, 0xBE, 0x54, + 0x48, 0xAD, 0x40, 0x97, 0x9D, 0x47, 0xD7, 0xC4, 0xDF, 0x29, 0xCE, 0xA3, + 0xEB, 0xE2, 0x6F, 0x95, 0x12, 0x25, 0x40, 0x97, 0x9D, 0x47, 0xD7, 0xC4, + 0xDF, 0x29, 0xCE, 0xA3, 0xEB, 0xE2, 0x6F, 0x95, 0x12, 0xCA, 0x82, 0xD6, + 0x32, 0x51, 0xF1, 0xDD, 0x0C, 0x45, 0x70, 0x78, 0x60, 0x0E, 0x26, 0xA6, + 0xE6, 0x26, 0xBC, 0xDF, 0xC7, 0x14, 0xA8, 0x11, 0x73, 0xA8, 0xFA, 0xF8, + 0x9B, 0xE5, 0x39, 0xD4, 0x7D, 0x7C, 0x4D, 0xF2, 0xB2, 0xDC, 0xD8, 0x50, + 0xE5, 0x9F, 0x18, 0xCA, 0x34, 0x12, 0xF6, 0x00, 0xD7, 0xB9, 0xD9, 0x81, + 0x69, 0x39, 0xAA, 0x23, 0xA5, 0x56, 0x62, 0x04, 0x19, 0x56, 0x3E, 0x28, + 0x84, 0x22, 0x56, 0xE6, 0x80, 0xC7, 0x93, 0x54, 0x3A, 0xDA, 0x1D, 0x51, + 0xAA, 0xAC, 0xF9, 0xEA, 0xFE, 0x8A, 0x95, 0x05, 0x30, 0xF9, 0xD4, 0x7D, + 0x7C, 0x4D, 0xF2, 0x9C, 0xEA, 0x3E, 0xBE, 0x26, 0xF9, 0x49, 0x86, 0x86, + 0xC6, 0x35, 0x43, 0x30, 0x81, 0x00, 0x86, 0x13, 0x5D, 0x55, 0x8A, 0xD4, + 0x4A, 0xD4, 0x09, 0x79, 0xD4, 0x7D, 0x7C, 0x4D, 0xF2, 0x9C, 0xEA, 0x3E, + 0xBE, 0x26, 0xF9, 0x51, 0x22, 0x54, 0x09, 0x79, 0xD4, 0x7D, 0x7C, 0x4D, + 0xF2, 0x9C, 0xEA, 0x3E, 0xBE, 0x26, 0xF9, 0x51, 0x22, 0x54, 0x09, 0x79, + 0xD4, 0x7D, 0x7C, 0x4D, 0xF2, 0xB3, 0x68, 0x79, 0x98, 0xE6, 0x93, 0x83, + 0x5C, 0x57, 0x9C, 0xFD, 0x05, 0xC4, 0x85, 0xAD, 0x59, 0xB4, 0x3F, 0xB4, + 0xA0, 0xFF, 0x00, 0x2A, 0x4C, 0x74, 0x1D, 0x9F, 0xA4, 0x0E, 0x73, 0x68, + 0x68, 0xEE, 0x69, 0x20, 0x80, 0x33, 0x8F, 0xE5, 0x70, 0x9C, 0xEA, 0x3E, + 0xBE, 0x26, 0xF9, 0x5D, 0xD7, 0xA4, 0x3E, 0xC4, 0x8F, 0xDD, 0x0B, 0x80, + 0x41, 0x2F, 0x3A, 0x8F, 0xAF, 0x89, 0xBE, 0x53, 0x9D, 0x47, 0xD7, 0xC4, + 0xDF, 0x2A, 0x24, 0x56, 0xA0, 0x4B, 0xCE, 0xA3, 0xEB, 0xE2, 0x6F, 0x94, + 0xE7, 0x51, 0xF5, 0xF1, 0x37, 0xCA, 0x89, 0x12, 0xA0, 0x4B, 0xCE, 0xA3, + 0xEB, 0xE2, 0x6F, 0x94, 0xE7, 0x51, 0xF5, 0xF1, 0x37, 0xCA, 0x89, 0x12, + 0xA0, 0x4B, 0xCE, 0xA3, 0xEB, 0xE2, 0x6F, 0x94, 0xE7, 0x51, 0xF5, 0xF1, + 0x37, 0xCA, 0x96, 0x5A, 0x04, 0x38, 0xB2, 0x91, 0xDE, 0xF7, 0xB6, 0x1B, + 0x9A, 0xE6, 0x00, 0xE7, 0x57, 0x56, 0x7A, 0xEB, 0xE8, 0x07, 0x42, 0xCC, + 0x64, 0x94, 0xBD, 0xA8, 0x62, 0xA0, 0xF0, 0x5D, 0x00, 0x12, 0x09, 0xA8, + 0xDA, 0xAE, 0xBC, 0x54, 0xA8, 0x29, 0xAE, 0xE7, 0x51, 0xF5, 0xF1, 0x37, + 0xCA, 0x73, 0xA8, 0xFA, 0xF8, 0x9B, 0xE5, 0x4F, 0x11, 0xB0, 0xA2, 0xCB, + 0x46, 0x7B, 0x60, 0xB6, 0x11, 0x84, 0xF0, 0x01, 0x69, 0x35, 0x3A, 0xBA, + 0xF3, 0x67, 0x27, 0x3E, 0x6E, 0x2B, 0x0D, 0x2A, 0x04, 0xBC, 0xEA, 0x3E, + 0xBE, 0x26, 0xF9, 0x4E, 0x75, 0x1F, 0x5F, 0x13, 0x7C, 0xA8, 0x91, 0x5A, + 0x81, 0x2F, 0x3A, 0x8F, 0xAF, 0x89, 0xBE, 0x53, 0x9D, 0x47, 0xD7, 0xC4, + 0xDF, 0x2A, 0x24, 0x4A, 0x81, 0x2F, 0x3A, 0x8F, 0xAF, 0x89, 0xBE, 0x53, + 0x9D, 0x47, 0xD7, 0xC4, 0xDF, 0x2A, 0x24, 0x4A, 0x81, 0xD3, 0x7A, 0x25, + 0x1E, 0x2B, 0xE6, 0x22, 0x87, 0xC4, 0x73, 0x81, 0x03, 0xF3, 0x1A, 0xD7, + 0x53, 0xFA, 0x9F, 0xF4, 0xFA, 0xAE, 0x4B, 0xD1, 0x0E, 0xB5, 0x13, 0xFA, + 0xFA, 0xAE, 0xB7, 0xF5, 0x3F, 0xE9, 0xF5, 0x59, 0x14, 0xFD, 0x51, 0xEE, + 0x7D, 0x57, 0x35, 0xE9, 0x8C, 0x47, 0xC3, 0x8D, 0x2D, 0x61, 0xEE, 0x6D, + 0x6D, 0x3D, 0x06, 0xAF, 0x7A, 0xE9, 0x7F, 0x54, 0x7B, 0x9F, 0x55, 0xCB, + 0xFA, 0x69, 0xEB, 0xA5, 0xBB, 0xA7, 0x8A, 0xD0, 0xE7, 0xB9, 0xCC, 0x7D, + 0x74, 0x4D, 0xE2, 0x9C, 0xE6, 0x3E, 0xBA, 0x26, 0xF1, 0x51, 0x22, 0xB6, + 0x25, 0xE7, 0x31, 0xF5, 0xD1, 0x37, 0x8A, 0x73, 0x98, 0xFA, 0xE8, 0x9B, + 0xC5, 0x44, 0x89, 0x62, 0x5E, 0x73, 0x1F, 0x5D, 0x13, 0x78, 0xA7, 0x39, + 0x8F, 0xAE, 0x89, 0xBC, 0x54, 0x48, 0x96, 0x25, 0xE7, 0x31, 0xF5, 0xD1, + 0x37, 0x8A, 0x73, 0x98, 0xFA, 0xE8, 0x9B, 0xC5, 0x52, 0x5E, 0x18, 0x8B, + 0x31, 0x0E, 0x1B, 0x9D, 0x64, 0x3D, 0xE1, 0xA4, 0xE8, 0xAC, 0xAC, 0xB6, + 0x32, 0x1C, 0x59, 0x83, 0x0B, 0x9A, 0x06, 0x35, 0x91, 0x1A, 0x09, 0x0E, + 0x35, 0x81, 0x6A, 0xAA, 0x9D, 0x59, 0xFF, 0x00, 0xE2, 0x96, 0x53, 0x17, + 0x9C, 0xC7, 0xD7, 0x44, 0xDE, 0x29, 0xCE, 0x63, 0xEB, 0xA2, 0x6F, 0x15, + 0x9B, 0x0A, 0x5E, 0x0C, 0xD4, 0x57, 0xB3, 0x93, 0x6C, 0x00, 0xC8, 0xCD, + 0x65, 0xB6, 0x93, 0x9C, 0x17, 0x55, 0x51, 0xAC, 0x9C, 0xFE, 0xFF, 0x00, + 0xE9, 0x63, 0xC5, 0x2C, 0x89, 0x0E, 0x2D, 0x99, 0x41, 0x0F, 0x93, 0x23, + 0xF1, 0x07, 0x1F, 0xC3, 0xEE, 0xA8, 0xD6, 0x7F, 0xF8, 0x96, 0x52, 0x2E, + 0x73, 0x1F, 0x5D, 0x13, 0x78, 0xA7, 0x39, 0x8F, 0xAE, 0x89, 0xBC, 0x54, + 0x48, 0xAD, 0x89, 0x79, 0xCC, 0x7D, 0x74, 0x4D, 0xE2, 0x9C, 0xE6, 0x3E, + 0xBA, 0x26, 0xF1, 0x51, 0x22, 0x58, 0x97, 0x9C, 0xC7, 0xD7, 0x44, 0xDE, + 0x29, 0xCE, 0x63, 0xEB, 0xA2, 0x6F, 0x15, 0x12, 0x25, 0x89, 0x79, 0xCC, + 0x7D, 0x74, 0x4D, 0xE2, 0xBB, 0xBF, 0x47, 0x5C, 0x5D, 0x43, 0xC0, 0x2E, + 0x24, 0x92, 0x0E, 0x73, 0xFC, 0xAF, 0x3F, 0x5D, 0xFF, 0x00, 0xA3, 0x9E, + 0xC5, 0x97, 0xFE, 0x0F, 0x15, 0x3F, 0xE0, 0xE5, 0x29, 0xD8, 0xF1, 0x59, + 0x4B, 0xCC, 0x86, 0xC5, 0x7B, 0x45, 0xBE, 0x80, 0xE2, 0x16, 0x07, 0x39, + 0x8F, 0xAE, 0x89, 0xBC, 0x56, 0x65, 0x3F, 0xED, 0x99, 0xAE, 0xFA, 0xD7, + 0x2A, 0x25, 0xE7, 0x31, 0xF5, 0xD1, 0x37, 0x8A, 0x73, 0x98, 0xFA, 0xE8, + 0x9B, 0xC5, 0x44, 0x89, 0x62, 0x5E, 0x73, 0x1F, 0x5D, 0x13, 0x78, 0xA7, + 0x39, 0x8F, 0xAE, 0x89, 0xBC, 0x54, 0x48, 0x96, 0x25, 0xE7, 0x31, 0xF5, + 0xD1, 0x37, 0x8A, 0x73, 0x98, 0xFA, 0xE8, 0x9B, 0xC5, 0x44, 0xAA, 0xDC, + 0xEE, 0x1F, 0xCA, 0x58, 0x93, 0x9C, 0xC7, 0xD7, 0x44, 0xDE, 0x29, 0xCE, + 0x63, 0xEB, 0xA2, 0x6F, 0x15, 0x9D, 0x1A, 0x4E, 0x03, 0x23, 0x4F, 0x86, + 0xC4, 0x86, 0xE1, 0x0A, 0xBB, 0x0C, 0x16, 0xAB, 0x6F, 0xFC, 0x80, 0x7B, + 0xC5, 0x5D, 0x06, 0xAE, 0x94, 0x9A, 0x87, 0x02, 0x59, 0xCE, 0x0D, 0x96, + 0x64, 0x4A, 0xE6, 0x62, 0xB0, 0x02, 0x5D, 0x5D, 0x40, 0x8A, 0x80, 0xA8, + 0xFE, 0xEA, 0x59, 0x4C, 0x1E, 0x73, 0x1F, 0x5D, 0x13, 0x78, 0xA7, 0x39, + 0x8F, 0xAE, 0x89, 0xBC, 0x55, 0x66, 0xE1, 0x36, 0x04, 0xDC, 0x68, 0x4C, + 0x35, 0xB5, 0x8F, 0x2D, 0x07, 0xF8, 0x2A, 0x15, 0x6C, 0xA4, 0xBC, 0xE6, + 0x3E, 0xBA, 0x26, 0xF1, 0x4E, 0x73, 0x1F, 0x5D, 0x13, 0x78, 0xA8, 0x91, + 0x2C, 0x4B, 0xCE, 0x63, 0xEB, 0xA2, 0x6F, 0x14, 0xE7, 0x31, 0xF5, 0xD1, + 0x37, 0x8A, 0x89, 0x12, 0xC4, 0xBC, 0xE6, 0x3E, 0xBA, 0x26, 0xF1, 0x57, + 0xC1, 0x98, 0x8C, 0x63, 0x30, 0x18, 0xD1, 0x08, 0x2E, 0x1F, 0xF7, 0x1D, + 0x2B, 0x1D, 0x5F, 0x03, 0xD7, 0x43, 0xEF, 0x0E, 0x29, 0x63, 0xD2, 0xA3, + 0x75, 0x47, 0xF8, 0x67, 0x82, 0xA4, 0xD7, 0x52, 0x8D, 0xE1, 0xBB, 0x82, + 0xAC, 0x6E, 0xA8, 0xFF, 0x00, 0x0C, 0xF0, 0x54, 0x9A, 0xEA, 0x51, 0xBC, + 0x37, 0x70, 0x59, 0x9E, 0xCD, 0x61, 0xE5, 0x0A, 0xCA, 0xF5, 0x28, 0x3E, + 0x1B, 0x78, 0x2A, 0xC2, 0xEA, 0xAC, 0xEE, 0x0E, 0x0A, 0x92, 0xBD, 0x4A, + 0x0F, 0x86, 0xDE, 0x0A, 0xB0, 0x45, 0x72, 0xCC, 0x1F, 0xF8, 0x0E, 0x0A, + 0x41, 0x9F, 0x94, 0xBC, 0xD6, 0x3F, 0xAF, 0x89, 0xDE, 0x3C, 0x54, 0x6B, + 0x7F, 0x1B, 0xD1, 0xA9, 0x93, 0x19, 0xE7, 0x94, 0x19, 0xDC, 0x4E, 0x66, + 0x95, 0x66, 0x4C, 0xCC, 0xF6, 0xC6, 0xE9, 0x56, 0x25, 0x96, 0x8D, 0x16, + 0xF3, 0x26, 0x66, 0x7B, 0x63, 0x74, 0xA6, 0x4C, 0xCC, 0xF6, 0xC6, 0xE9, + 0x4B, 0x1A, 0x34, 0x5B, 0xCC, 0x99, 0x99, 0xED, 0x8D, 0xD2, 0x99, 0x33, + 0x33, 0xDB, 0x1B, 0xA5, 0x2C, 0x68, 0xD4, 0x90, 0xA3, 0x45, 0x82, 0x49, + 0x84, 0xF7, 0x32, 0xBC, 0xC6, 0xA3, 0xD2, 0xB7, 0x19, 0x33, 0x33, 0xDB, + 0x1B, 0xA5, 0x32, 0x66, 0x67, 0xB6, 0x37, 0x4A, 0x58, 0xD4, 0xB6, 0x6E, + 0x65, 0x85, 0xC5, 0xB1, 0xE2, 0x02, 0xF3, 0x5B, 0x88, 0x71, 0xCE, 0x55, + 0x21, 0xCC, 0x46, 0x86, 0xE7, 0x39, 0x91, 0x5E, 0x1C, 0xEF, 0xCC, 0x6B, + 0xE9, 0xFE, 0x56, 0xDF, 0x26, 0x66, 0x7B, 0x63, 0x74, 0xA6, 0x4C, 0xCC, + 0xF6, 0xC6, 0xE9, 0x4B, 0x1A, 0x47, 0xBD, 0xCF, 0x71, 0x73, 0xDC, 0x5C, + 0xE2, 0x6B, 0x24, 0x9A, 0xC9, 0x54, 0x5B, 0xCC, 0x99, 0x99, 0xED, 0x8D, + 0xD2, 0x99, 0x33, 0x33, 0xDB, 0x1B, 0xA5, 0x2C, 0x68, 0xD1, 0x6F, 0x32, + 0x66, 0x67, 0xB6, 0x37, 0x4A, 0x64, 0xCC, 0xCF, 0x6C, 0x6E, 0x94, 0xB1, + 0xA3, 0x45, 0xBC, 0xC9, 0x99, 0x9E, 0xD8, 0xDD, 0x29, 0x93, 0x33, 0x3D, + 0xB1, 0xBA, 0x52, 0xC6, 0x8D, 0x66, 0xD0, 0xFE, 0xD2, 0x83, 0xFC, 0xAC, + 0xFC, 0x99, 0x99, 0xED, 0x8D, 0xD2, 0xA7, 0x91, 0xA0, 0x66, 0x25, 0x66, + 0xA1, 0xC6, 0x73, 0xAD, 0x06, 0x9E, 0x80, 0xD2, 0x93, 0x23, 0x79, 0xE9, + 0x0F, 0xB1, 0x23, 0xF7, 0x42, 0xE0, 0x17, 0xA3, 0x52, 0xB2, 0xAF, 0x9C, + 0xA3, 0x62, 0xC0, 0x61, 0x01, 0xCE, 0x1D, 0x25, 0x72, 0xB9, 0x33, 0x33, + 0xDB, 0x1B, 0xA5, 0x06, 0x8D, 0x16, 0xF3, 0x26, 0x66, 0x7B, 0x63, 0x74, + 0xA6, 0x4C, 0xCC, 0xF6, 0xC6, 0xE9, 0x4B, 0x1A, 0x34, 0x5B, 0xCC, 0x99, + 0x99, 0xED, 0x8D, 0xD2, 0x99, 0x33, 0x33, 0xDB, 0x1B, 0xA5, 0x2C, 0x68, + 0xD1, 0x6F, 0x32, 0x66, 0x67, 0xB6, 0x37, 0x4A, 0x64, 0xCC, 0xCF, 0x6C, + 0x6E, 0x94, 0xB1, 0xA4, 0x0F, 0x70, 0x69, 0x68, 0x71, 0x0D, 0x35, 0x12, + 0x2B, 0xCC, 0x6A, 0x57, 0x88, 0xF1, 0x45, 0x55, 0x44, 0x78, 0xAA, 0xAA, + 0xB3, 0xF4, 0x55, 0xD1, 0x82, 0xDC, 0x64, 0xCC, 0xCF, 0x6C, 0x6E, 0x94, + 0xC9, 0x99, 0x9E, 0xD8, 0xDD, 0x29, 0x63, 0x4F, 0x16, 0x62, 0x34, 0x60, + 0x04, 0x58, 0xAF, 0x78, 0x1D, 0x01, 0xCE, 0x26, 0xA5, 0x1A, 0xDE, 0x64, + 0xCC, 0xCF, 0x6C, 0x6E, 0x94, 0xC9, 0x99, 0x9E, 0xD8, 0xDD, 0x29, 0x63, + 0x46, 0x8B, 0x79, 0x93, 0x33, 0x3D, 0xB1, 0xBA, 0x53, 0x26, 0x66, 0x7B, + 0x63, 0x74, 0xA5, 0x8D, 0x1A, 0x2D, 0xE6, 0x4C, 0xCC, 0xF6, 0xC6, 0xE9, + 0x4C, 0x99, 0x99, 0xED, 0x8D, 0xD2, 0x96, 0x34, 0x68, 0xB7, 0x99, 0x33, + 0x33, 0xDB, 0x1B, 0xA5, 0x32, 0x66, 0x67, 0xB6, 0x37, 0x4A, 0x58, 0x9B, + 0xD1, 0x0E, 0xB5, 0x13, 0xFA, 0xFA, 0xAE, 0xB7, 0xF5, 0x3F, 0xE9, 0xF5, + 0x5A, 0x1A, 0x06, 0x8B, 0x8D, 0x47, 0xCC, 0xB8, 0xC4, 0x36, 0x83, 0xB4, + 0x02, 0x2A, 0x5B, 0xEF, 0xD4, 0xFF, 0x00, 0xA7, 0xD5, 0x41, 0x4F, 0xD5, + 0x1E, 0xE7, 0xD5, 0x72, 0xFE, 0x9A, 0x7A, 0xE9, 0x6E, 0xE9, 0xE2, 0xBA, + 0x8F, 0xD5, 0x1E, 0xE7, 0xD5, 0x6A, 0x69, 0xEA, 0x1A, 0x35, 0x29, 0x12, + 0x13, 0xA1, 0x44, 0x63, 0x03, 0x01, 0x06, 0xD5, 0x6B, 0x43, 0x87, 0x45, + 0xD1, 0x64, 0x84, 0xD6, 0xD1, 0x0B, 0xCD, 0x32, 0x42, 0x6B, 0x68, 0x85, + 0xE6, 0x83, 0x9D, 0x45, 0xD1, 0x64, 0x84, 0xD6, 0xD1, 0x0B, 0xCD, 0x32, + 0x42, 0x6B, 0x68, 0x85, 0xE6, 0x83, 0x9D, 0x45, 0xD1, 0x64, 0x84, 0xD6, + 0xD1, 0x0B, 0xCD, 0x32, 0x42, 0x6B, 0x68, 0x85, 0xE6, 0x83, 0x9D, 0x53, + 0x3E, 0x6E, 0x61, 0xE0, 0x07, 0xC6, 0x88, 0x40, 0x20, 0x8A, 0xDD, 0xEF, + 0x1D, 0x05, 0x6F, 0x32, 0x42, 0x6B, 0x68, 0x85, 0xE6, 0x99, 0x21, 0x35, + 0xB4, 0x42, 0xF3, 0x41, 0xA2, 0x8B, 0x33, 0x1A, 0x30, 0x02, 0x2C, 0x57, + 0xBC, 0x03, 0x58, 0x0E, 0x71, 0x35, 0x24, 0x59, 0x98, 0xF1, 0x9A, 0x1B, + 0x16, 0x2B, 0xDE, 0xDA, 0xEB, 0xA8, 0x9A, 0xF3, 0xAD, 0xEE, 0x48, 0x4D, + 0x6D, 0x10, 0xBC, 0xD3, 0x24, 0x26, 0xB6, 0x88, 0x5E, 0x68, 0x39, 0xD4, + 0x5D, 0x16, 0x48, 0x4D, 0x6D, 0x10, 0xBC, 0xD3, 0x24, 0x26, 0xB6, 0x88, + 0x5E, 0x68, 0x39, 0xD4, 0x5D, 0x16, 0x48, 0x4D, 0x6D, 0x10, 0xBC, 0xD3, + 0x24, 0x26, 0xB6, 0x88, 0x5E, 0x68, 0x39, 0xD4, 0x5D, 0x16, 0x48, 0x4D, + 0x6D, 0x10, 0xBC, 0xD3, 0x24, 0x26, 0xB6, 0x88, 0x5E, 0x68, 0x39, 0xD5, + 0xDF, 0xFA, 0x39, 0xEC, 0x59, 0x7F, 0xE0, 0xF1, 0x5A, 0x2C, 0x90, 0x9A, + 0xDA, 0x21, 0x79, 0xAE, 0x96, 0x8A, 0x94, 0x7C, 0x8C, 0x84, 0x39, 0x78, + 0x8E, 0x0E, 0x73, 0x2B, 0xCE, 0x3A, 0x10, 0x71, 0x34, 0xFF, 0x00, 0xB6, + 0x66, 0xBB, 0xEB, 0x5C, 0xBA, 0xCA, 0x4B, 0xD1, 0xA9, 0x99, 0xC9, 0xF8, + 0xD3, 0x0C, 0x8D, 0x0D, 0xAD, 0x7B, 0xAB, 0x00, 0xD6, 0xB1, 0x72, 0x42, + 0x6B, 0x68, 0x85, 0xE6, 0xA8, 0xE7, 0x51, 0x74, 0x59, 0x21, 0x35, 0xB4, + 0x42, 0xF3, 0x4C, 0x90, 0x9A, 0xDA, 0x21, 0x79, 0xA8, 0x39, 0xD4, 0x5D, + 0x16, 0x48, 0x4D, 0x6D, 0x10, 0xBC, 0xD3, 0x24, 0x26, 0xB6, 0x88, 0x5E, + 0x68, 0x39, 0xD4, 0x5D, 0x16, 0x48, 0x4D, 0x6D, 0x10, 0xBC, 0xD3, 0x24, + 0x26, 0xB6, 0x88, 0x5E, 0x68, 0x34, 0x06, 0x2C, 0x42, 0xE7, 0xB8, 0xBD, + 0xD5, 0xC4, 0xFC, 0xE6, 0xBF, 0xCD, 0x9E, 0xBC, 0xFF, 0x00, 0xDA, 0x91, + 0xB3, 0x93, 0x2D, 0xB5, 0x66, 0x62, 0x28, 0xB4, 0xE2, 0xE3, 0x53, 0x8E, + 0x72, 0x7A, 0x4A, 0xDD, 0xE4, 0x84, 0xD6, 0xD1, 0x0B, 0xCD, 0x32, 0x42, + 0x6B, 0x68, 0x85, 0xE6, 0x83, 0x9D, 0x45, 0xD1, 0x64, 0x84, 0xD6, 0xD1, + 0x0B, 0xCD, 0x32, 0x42, 0x6B, 0x68, 0x85, 0xE6, 0x83, 0x9D, 0x45, 0xD1, + 0x64, 0x84, 0xD6, 0xD1, 0x0B, 0xCD, 0x32, 0x42, 0x6B, 0x68, 0x85, 0xE6, + 0x83, 0x9D, 0x45, 0xD1, 0x64, 0x84, 0xD6, 0xD1, 0x0B, 0xCD, 0x32, 0x42, + 0x6B, 0x68, 0x85, 0xE6, 0x83, 0x9D, 0x57, 0xC0, 0xF5, 0xD0, 0xFB, 0xC3, + 0x8A, 0xDF, 0xE4, 0x84, 0xD6, 0xD1, 0x0B, 0xCD, 0x5C, 0xCF, 0x44, 0xA6, + 0x98, 0xF6, 0xBB, 0x97, 0x84, 0x6A, 0x20, 0xFB, 0xD5, 0x1D, 0x4C, 0x6E, + 0xA8, 0xFF, 0x00, 0x0C, 0xF0, 0x54, 0x9A, 0xEA, 0x51, 0xBC, 0x37, 0x70, + 0x57, 0x46, 0x15, 0x4A, 0xC4, 0x1A, 0x18, 0x78, 0x2B, 0x66, 0xBA, 0x94, + 0x6F, 0x0D, 0xDC, 0x16, 0x67, 0xB3, 0x58, 0x79, 0x42, 0xB2, 0xBD, 0x4A, + 0x0F, 0x86, 0xDE, 0x0A, 0xE8, 0x1E, 0xA2, 0x1F, 0x74, 0x70, 0x56, 0xCA, + 0xF5, 0x28, 0x3E, 0x1B, 0x78, 0x2B, 0xA0, 0x7A, 0x88, 0x7D, 0xD1, 0xC1, + 0x48, 0x32, 0xF2, 0x94, 0x88, 0x88, 0xAA, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, + 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, + 0x88, 0x80, 0xA3, 0xFD, 0x4F, 0xFA, 0x7D, 0x54, 0x8A, 0x3F, 0xD4, 0xFF, + 0x00, 0xA7, 0xD5, 0x49, 0x14, 0xFD, 0x51, 0xEE, 0x7D, 0x54, 0xAA, 0x2F, + 0xD5, 0x1E, 0xE7, 0xD5, 0x4A, 0xB5, 0x20, 0x88, 0x8A, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x8E, 0x63, 0xAB, 0xC5, 0xEE, 0x1E, 0x0A, 0xC9, + 0xAE, 0xA5, 0x1B, 0xC3, 0x77, 0x05, 0x7C, 0xC7, 0x57, 0x8B, 0xDC, 0x3C, + 0x15, 0x93, 0x5D, 0x4A, 0x37, 0x86, 0xEE, 0x09, 0x3D, 0x9A, 0xC3, 0xCA, + 0x15, 0x95, 0xEA, 0x50, 0x7C, 0x36, 0xF0, 0x57, 0x40, 0xF5, 0x10, 0xFB, + 0xA3, 0x82, 0xB6, 0x57, 0xA9, 0x41, 0xF0, 0xDB, 0xC1, 0x5D, 0x03, 0xD4, + 0x43, 0xEE, 0x8E, 0x0A, 0x42, 0x65, 0xE5, 0x29, 0x11, 0x11, 0x54, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x11, 0x11, 0x01, 0x51, 0x55, 0x10, 0x11, 0x11, 0x01, 0x11, + 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, + 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x47, 0xFA, 0x9F, 0xF4, 0xFA, + 0xA9, 0x14, 0x7F, 0xA9, 0xFF, 0x00, 0x4F, 0xAA, 0x92, 0x29, 0xFA, 0xA3, + 0xDC, 0xFA, 0xA9, 0x54, 0x5F, 0xAA, 0x3D, 0xCF, 0xAA, 0x95, 0x6A, 0x41, + 0x11, 0x14, 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x05, 0x4A, 0xB3, 0x2A, 0xA2, 0x02, 0x22, + 0x20, 0x2A, 0x2A, 0xA2, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x08, 0xE6, 0x3A, 0xBC, 0x5E, 0xE1, 0xE0, 0xAC, 0x9A, 0xEA, 0x51, 0xBC, + 0x37, 0x70, 0x57, 0xCC, 0x75, 0x78, 0xBD, 0xC3, 0xC1, 0x59, 0x35, 0xD4, + 0xA3, 0x78, 0x6E, 0xE0, 0x93, 0xD9, 0xAC, 0x3C, 0xA1, 0x59, 0x5E, 0xA5, + 0x07, 0xC3, 0x6F, 0x05, 0x74, 0x0E, 0xAF, 0x0F, 0xB8, 0x38, 0x2B, 0x65, + 0x7A, 0x94, 0x1F, 0x0D, 0xBC, 0x15, 0x61, 0x75, 0x56, 0x77, 0x07, 0x05, + 0x21, 0x33, 0xF2, 0x94, 0x57, 0x8C, 0x98, 0xE9, 0x9A, 0x85, 0xBE, 0x12, + 0xF2, 0x92, 0xDA, 0xA0, 0xEF, 0x85, 0xE7, 0x51, 0xFD, 0x7C, 0x4E, 0xF1, + 0xE2, 0xA3, 0x55, 0x97, 0xA4, 0xDE, 0x52, 0x5B, 0x54, 0x1D, 0xF0, 0x97, + 0x94, 0x96, 0xD5, 0x07, 0x7C, 0x2F, 0x36, 0x44, 0xA1, 0xE9, 0x37, 0x94, + 0x96, 0xD5, 0x07, 0x7C, 0x25, 0xE5, 0x25, 0xB5, 0x41, 0xDF, 0x0B, 0xCD, + 0x91, 0x28, 0x7A, 0x4D, 0xE5, 0x25, 0xB5, 0x41, 0xDF, 0x09, 0x79, 0x49, + 0x6D, 0x50, 0x77, 0xC2, 0xF3, 0x64, 0x4A, 0x1E, 0x93, 0x79, 0x49, 0x6D, + 0x50, 0x77, 0xC2, 0x5E, 0x52, 0x5B, 0x54, 0x1D, 0xF0, 0xBC, 0xD9, 0x12, + 0x87, 0xA4, 0xDE, 0x52, 0x5B, 0x54, 0x1D, 0xF0, 0x97, 0x94, 0x96, 0xD5, + 0x07, 0x7C, 0x2F, 0x36, 0x44, 0xA1, 0xE9, 0x37, 0x94, 0x96, 0xD5, 0x07, + 0x7C, 0x25, 0xE5, 0x25, 0xB5, 0x41, 0xDF, 0x0B, 0xCD, 0x91, 0x28, 0x7A, + 0x4D, 0xE5, 0x25, 0xB5, 0x41, 0xDF, 0x09, 0x79, 0x49, 0x6D, 0x50, 0x77, + 0xC2, 0xF3, 0x64, 0x4A, 0x1E, 0x93, 0x79, 0x49, 0x6D, 0x50, 0x77, 0xC2, + 0x5E, 0x52, 0x5B, 0x54, 0x1D, 0xF0, 0xBC, 0xD9, 0x12, 0x87, 0xA4, 0xDE, + 0x52, 0x5B, 0x54, 0x1D, 0xF0, 0x97, 0x94, 0x96, 0xD5, 0x07, 0x7C, 0x2F, + 0x36, 0x44, 0xA1, 0xE9, 0x37, 0x94, 0x96, 0xD5, 0x07, 0x7C, 0x25, 0xE5, + 0x25, 0xB5, 0x41, 0xDF, 0x0B, 0xCD, 0x91, 0x28, 0x7A, 0x4D, 0xE5, 0x25, + 0xB5, 0x41, 0xDF, 0x09, 0x79, 0x49, 0x6D, 0x50, 0x77, 0xC2, 0xF3, 0x64, + 0x4A, 0x1E, 0x93, 0x79, 0x49, 0x6D, 0x50, 0x77, 0xC2, 0x5E, 0x52, 0x5B, + 0x54, 0x1D, 0xF0, 0xBC, 0xD9, 0x12, 0x87, 0xA4, 0xDE, 0x52, 0x5B, 0x54, + 0x1D, 0xF0, 0x97, 0x94, 0x96, 0xD5, 0x07, 0x7C, 0x2F, 0x36, 0x44, 0xA1, + 0xE9, 0x37, 0x94, 0x96, 0xD5, 0x07, 0x7C, 0x25, 0xE5, 0x25, 0xB5, 0x41, + 0xDF, 0x0B, 0xCD, 0x91, 0x28, 0x7A, 0x4D, 0xE5, 0x25, 0xB5, 0x41, 0xDF, + 0x09, 0x79, 0x49, 0x6D, 0x50, 0x77, 0xC2, 0xF3, 0x64, 0x4A, 0x1E, 0x93, + 0x79, 0x49, 0x6D, 0x50, 0x77, 0xC2, 0x5E, 0x52, 0x5B, 0x54, 0x1D, 0xF0, + 0xBC, 0xD9, 0x12, 0x87, 0xA4, 0xDE, 0x52, 0x5B, 0x54, 0x1D, 0xF0, 0x97, + 0x94, 0x96, 0xD5, 0x07, 0x7C, 0x2F, 0x36, 0x44, 0xA1, 0xE9, 0xB0, 0x66, + 0xA0, 0x4C, 0x12, 0x20, 0xC6, 0x64, 0x42, 0x3A, 0x6C, 0x9A, 0xEA, 0x57, + 0x7E, 0xA7, 0xFD, 0x3E, 0xAB, 0x93, 0xF4, 0x3C, 0x91, 0x33, 0x17, 0x3F, + 0x4D, 0x5F, 0x55, 0xD6, 0x7E, 0xA7, 0xFD, 0x3E, 0xAA, 0x0A, 0x7E, 0xA8, + 0xF7, 0x3E, 0xAA, 0x91, 0xA6, 0xA0, 0x4B, 0x90, 0x23, 0x46, 0x64, 0x32, + 0x7A, 0x2D, 0x1A, 0xAB, 0x55, 0xFD, 0x51, 0xEE, 0x7D, 0x57, 0x2F, 0xE9, + 0xA7, 0xAE, 0x96, 0xEE, 0x9E, 0x2B, 0x43, 0xA3, 0xBC, 0xA4, 0xB6, 0xA8, + 0x3B, 0xE1, 0x2F, 0x29, 0x2D, 0xAA, 0x0E, 0xF8, 0x5E, 0x6C, 0x89, 0xD0, + 0x7A, 0x4D, 0xE5, 0x25, 0xB5, 0x41, 0xDF, 0x09, 0x79, 0x49, 0x6D, 0x50, + 0x77, 0xC2, 0xF3, 0x64, 0x4E, 0x83, 0xD2, 0x6F, 0x29, 0x2D, 0xAA, 0x0E, + 0xF8, 0x4B, 0xCA, 0x4B, 0x6A, 0x83, 0xBE, 0x17, 0x9B, 0x22, 0x74, 0x1E, + 0x93, 0x79, 0x49, 0x6D, 0x50, 0x77, 0xC2, 0x5E, 0x52, 0x5B, 0x54, 0x1D, + 0xF0, 0xBC, 0xD9, 0x13, 0xA0, 0xF4, 0x9B, 0xCA, 0x4B, 0x6A, 0x83, 0xBE, + 0x12, 0xF2, 0x92, 0xDA, 0xA0, 0xEF, 0x85, 0xE6, 0xC8, 0x9D, 0x07, 0xA4, + 0xDE, 0x52, 0x5B, 0x54, 0x1D, 0xF0, 0x97, 0x94, 0x96, 0xD5, 0x07, 0x7C, + 0x2F, 0x36, 0x44, 0xE8, 0x3D, 0x26, 0xF2, 0x92, 0xDA, 0xA0, 0xEF, 0x84, + 0xBC, 0xA4, 0xB6, 0xA8, 0x3B, 0xE1, 0x79, 0xB2, 0x27, 0x41, 0xE9, 0x37, + 0x94, 0x96, 0xD5, 0x07, 0x7C, 0x25, 0xE5, 0x25, 0xB5, 0x41, 0xDF, 0x0B, + 0xCD, 0x91, 0x3A, 0x0F, 0x49, 0xBC, 0xA4, 0xB6, 0xA8, 0x3B, 0xE1, 0x2F, + 0x29, 0x2D, 0xAA, 0x0E, 0xF8, 0x5E, 0x6C, 0x89, 0xD0, 0x7A, 0x4D, 0xE5, + 0x25, 0xB5, 0x41, 0xDF, 0x09, 0x79, 0x49, 0x6D, 0x50, 0x77, 0xC2, 0xF3, + 0x64, 0x4E, 0x83, 0xD2, 0x6F, 0x29, 0x2D, 0xAA, 0x0E, 0xF8, 0x4B, 0xCA, + 0x4B, 0x6A, 0x83, 0xBE, 0x17, 0x9B, 0x22, 0x74, 0x1E, 0x93, 0x79, 0x49, + 0x6D, 0x50, 0x77, 0xC2, 0x5E, 0x52, 0x5B, 0x54, 0x1D, 0xF0, 0xBC, 0xD9, + 0x13, 0xA0, 0xF4, 0x9B, 0xCA, 0x4B, 0x6A, 0x83, 0xBE, 0x12, 0xF2, 0x92, + 0xDA, 0xA0, 0xEF, 0x85, 0xE6, 0xC8, 0x9D, 0x07, 0xA4, 0xDE, 0x52, 0x5B, + 0x54, 0x1D, 0xF0, 0x97, 0x94, 0x96, 0xD5, 0x07, 0x7C, 0x2F, 0x36, 0x44, + 0xE8, 0x3D, 0x26, 0xF2, 0x92, 0xDA, 0xA0, 0xEF, 0x84, 0xBC, 0xA4, 0xB6, + 0xA8, 0x3B, 0xE1, 0x79, 0xB2, 0x27, 0x41, 0xE9, 0x37, 0x94, 0x96, 0xD5, + 0x07, 0x7C, 0x25, 0xE5, 0x25, 0xB5, 0x41, 0xDF, 0x0B, 0xCD, 0x91, 0x3A, + 0x0F, 0x49, 0xBC, 0xA4, 0xB6, 0xA8, 0x3B, 0xE1, 0x2F, 0x29, 0x2D, 0xAA, + 0x0E, 0xF8, 0x5E, 0x6C, 0x89, 0xD0, 0x7A, 0x4D, 0xE5, 0x25, 0xB5, 0x41, + 0xDF, 0x09, 0x79, 0x49, 0x1E, 0x89, 0xA8, 0x5B, 0xE1, 0x79, 0xB2, 0xBE, + 0x07, 0xAE, 0x87, 0xDE, 0x1C, 0x53, 0xA0, 0xF4, 0xB9, 0x8C, 0xF2, 0xD1, + 0x7B, 0x87, 0x82, 0xB6, 0x6B, 0xA9, 0x46, 0xF0, 0xDD, 0xC1, 0x56, 0x37, + 0x54, 0x7F, 0x86, 0x78, 0x2A, 0x4D, 0x75, 0x28, 0xDE, 0x1B, 0xB8, 0x29, + 0x3D, 0x9A, 0xC3, 0xCA, 0x15, 0x95, 0xEA, 0x50, 0x7C, 0x36, 0xF0, 0x55, + 0x85, 0xD5, 0x59, 0xDC, 0x1C, 0x15, 0x25, 0x7A, 0x94, 0x1F, 0x0D, 0xBC, + 0x15, 0x61, 0x75, 0x56, 0x77, 0x07, 0x05, 0x20, 0xCF, 0xCA, 0x5E, 0x6B, + 0x1F, 0xD7, 0xC4, 0xEF, 0x1E, 0x2A, 0x35, 0x24, 0x7F, 0x5F, 0x13, 0xBC, + 0x78, 0xA8, 0xD6, 0xA1, 0x91, 0x11, 0x11, 0x44, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x17, 0x16, 0x3C, 0x16, 0x82, 0xD7, 0x56, + 0xEC, 0xED, 0xCD, 0xD3, 0xFC, 0x2B, 0xD9, 0x2D, 0x1E, 0x25, 0xAE, 0x4E, + 0x04, 0x47, 0xD9, 0x35, 0x3A, 0xCB, 0x09, 0xAB, 0xF9, 0x59, 0xC2, 0x13, + 0xA3, 0xBA, 0x46, 0x24, 0x32, 0xD2, 0xC8, 0x6C, 0x6B, 0x5E, 0x4B, 0x80, + 0xB2, 0x43, 0x8D, 0x75, 0xE8, 0x52, 0xDA, 0xE7, 0x02, 0xB1, 0x0C, 0x46, + 0x86, 0x23, 0x3D, 0xCD, 0x74, 0x38, 0x96, 0x1F, 0x0E, 0xB3, 0xEF, 0xAF, + 0x36, 0x83, 0x5D, 0x5F, 0xDA, 0x0D, 0x64, 0x39, 0x59, 0x88, 0xCD, 0x2E, + 0x85, 0x02, 0x2B, 0xDA, 0x0D, 0x44, 0xB5, 0x84, 0x8A, 0xD4, 0x61, 0x8E, + 0x73, 0xC3, 0x03, 0x49, 0x71, 0x35, 0x06, 0x81, 0x9E, 0xBD, 0x0B, 0x72, + 0xE6, 0xB1, 0xD0, 0x08, 0x68, 0xE7, 0x56, 0x66, 0xA2, 0x1B, 0x42, 0x28, + 0x65, 0x79, 0x9B, 0x9F, 0xFB, 0x58, 0xF6, 0xDA, 0x7D, 0x21, 0x87, 0x13, + 0x94, 0x6B, 0x9A, 0x66, 0x1A, 0xE2, 0xEA, 0xF3, 0x74, 0x8A, 0xF3, 0xFE, + 0xDA, 0x50, 0x60, 0xC5, 0x97, 0x8D, 0x00, 0x03, 0x1A, 0x0C, 0x48, 0x75, + 0xF4, 0x5B, 0x69, 0x15, 0xA8, 0xD6, 0xCA, 0x1B, 0x0C, 0x08, 0x33, 0x2D, + 0x9A, 0x78, 0x6C, 0x38, 0x95, 0x06, 0xB4, 0x3C, 0x12, 0x4D, 0xA0, 0x6B, + 0x00, 0x68, 0x15, 0xE7, 0xFD, 0xD6, 0x44, 0x76, 0xC9, 0xC2, 0x70, 0x2F, + 0x84, 0xDE, 0x4F, 0x95, 0x0D, 0x69, 0x00, 0x0F, 0xC0, 0x6B, 0xAE, 0xAA, + 0x89, 0xB5, 0xEE, 0x35, 0xE9, 0x41, 0xA6, 0x0D, 0x73, 0x81, 0x20, 0x12, + 0x1A, 0x2B, 0x24, 0x0E, 0x85, 0x45, 0xB4, 0xE4, 0x65, 0xA1, 0x72, 0xB0, + 0x1E, 0xE6, 0x1E, 0x4E, 0x1B, 0x6D, 0xC4, 0x69, 0xE9, 0x26, 0x23, 0x6B, + 0xAB, 0xF8, 0x6F, 0xD5, 0x5E, 0x20, 0xC2, 0x33, 0x20, 0x4C, 0x42, 0x81, + 0x0E, 0x1D, 0xB7, 0x72, 0x76, 0x48, 0xFC, 0x59, 0x8D, 0x9F, 0x7E, 0x71, + 0x5D, 0x59, 0xC9, 0xFE, 0xD0, 0x6A, 0x14, 0xAD, 0x97, 0x8E, 0xE8, 0x46, + 0x2B, 0x60, 0xC4, 0x30, 0xC7, 0x4B, 0xC3, 0x4D, 0x43, 0xFB, 0x59, 0x14, + 0x8B, 0x61, 0xB4, 0xC2, 0xB2, 0xCB, 0x31, 0x2C, 0x9B, 0x7F, 0x84, 0x37, + 0xDF, 0x9B, 0x30, 0x26, 0xA5, 0x91, 0x11, 0x91, 0x62, 0xCD, 0xC2, 0x8F, + 0x2F, 0x19, 0xB0, 0xE0, 0x06, 0x34, 0x36, 0x25, 0xA1, 0x54, 0x30, 0x06, + 0x70, 0x46, 0x39, 0xBD, 0xFF, 0x00, 0xDA, 0x0D, 0x52, 0x2D, 0xA4, 0x38, + 0x50, 0x8C, 0x06, 0x7E, 0x08, 0x46, 0x01, 0x82, 0xE2, 0xF8, 0x86, 0xAB, + 0x41, 0xF9, 0xEA, 0xFE, 0xEB, 0xAB, 0x32, 0xBD, 0x8D, 0x96, 0x74, 0x77, + 0xB1, 0xB0, 0xE1, 0xD6, 0xC8, 0x2C, 0x2C, 0x01, 0xA1, 0xC5, 0xCE, 0x21, + 0xB6, 0xBA, 0x48, 0xAC, 0xF4, 0xE6, 0x41, 0xA8, 0x45, 0x93, 0x3E, 0xD8, + 0x6D, 0x9A, 0x22, 0x13, 0x6C, 0x8B, 0x22, 0xB0, 0x2A, 0xAA, 0xBA, 0xB3, + 0xF4, 0x13, 0x82, 0xC6, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x1D, 0x17, 0xA2, 0x1D, 0x6A, 0x27, 0xF5, + 0xF5, 0x5D, 0x6F, 0xEA, 0x7F, 0xD3, 0xEA, 0xB9, 0x2F, 0x44, 0x3A, 0xD4, + 0x4F, 0xEB, 0xEA, 0xBA, 0xDF, 0xD4, 0xFF, 0x00, 0xA7, 0xD5, 0x65, 0x14, + 0xFD, 0x51, 0xEE, 0x7D, 0x57, 0x2F, 0xE9, 0xA7, 0xAE, 0x96, 0xEE, 0x9E, + 0x2B, 0xA8, 0xFD, 0x51, 0xEE, 0x7D, 0x57, 0x2F, 0xE9, 0xA7, 0xAE, 0x96, + 0xEE, 0x9E, 0x2B, 0x43, 0x99, 0x44, 0x44, 0x51, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x11, 0x10, 0x56, 0xCB, 0xAC, 0xDA, + 0xB2, 0x6C, 0xD7, 0x55, 0x75, 0x66, 0xAD, 0x5E, 0xC8, 0x11, 0xA2, 0x38, + 0x35, 0x90, 0x9E, 0xE7, 0x11, 0x58, 0x01, 0xA4, 0x92, 0x34, 0xAC, 0x98, + 0x0C, 0x31, 0xE8, 0xE7, 0xC2, 0x85, 0x53, 0xA2, 0x08, 0xC1, 0xD6, 0x6B, + 0xA8, 0x91, 0x51, 0x15, 0xAC, 0xBA, 0xC9, 0xAE, 0x0B, 0x44, 0x38, 0xD5, + 0x40, 0x86, 0xC8, 0x90, 0xED, 0xD4, 0x49, 0x19, 0xF3, 0x11, 0xA3, 0x32, + 0x0D, 0x63, 0x65, 0x63, 0xBA, 0x23, 0xA1, 0xB6, 0x04, 0x43, 0x11, 0xB9, + 0xCB, 0x43, 0x0D, 0x63, 0xFA, 0x56, 0x44, 0x86, 0xF8, 0x4E, 0xB3, 0x11, + 0x8E, 0x63, 0x87, 0xB9, 0xC2, 0xA2, 0xB7, 0x2D, 0x63, 0x07, 0x2C, 0xCA, + 0xDC, 0xF2, 0x65, 0x9A, 0x39, 0x27, 0x45, 0x16, 0x9B, 0xFF, 0x00, 0x20, + 0xFC, 0x36, 0xBF, 0x8C, 0xEB, 0x0A, 0x92, 0x2D, 0xB1, 0x2C, 0xD1, 0x53, + 0x4B, 0x58, 0x5A, 0x61, 0xDB, 0x0F, 0x2D, 0xCE, 0x4F, 0x4F, 0xEF, 0x5F, + 0x42, 0x0C, 0x3E, 0x4A, 0x25, 0xB0, 0xCB, 0x0E, 0xB6, 0x6A, 0xA9, 0xB5, + 0x67, 0x35, 0xF4, 0x2B, 0x56, 0xEA, 0x1C, 0x69, 0x61, 0x4B, 0xCB, 0x57, + 0x0E, 0xB7, 0x06, 0xC2, 0xAE, 0x27, 0x29, 0x98, 0x7E, 0x06, 0xFB, 0x94, + 0x30, 0xE1, 0x42, 0x30, 0x19, 0xF8, 0x21, 0x18, 0x06, 0x0B, 0x8B, 0xE2, + 0x12, 0x2D, 0x07, 0xD4, 0x6A, 0xFD, 0xEB, 0xAE, 0xAC, 0xC8, 0x35, 0x69, + 0x51, 0x26, 0xA0, 0x33, 0xAD, 0xD3, 0x59, 0x0A, 0x19, 0x97, 0x88, 0xD6, + 0x42, 0x86, 0x1B, 0x12, 0x1D, 0x55, 0x80, 0x6B, 0xD2, 0x43, 0x81, 0xCF, + 0xA4, 0xD6, 0x33, 0x2C, 0x49, 0x77, 0x88, 0x74, 0xAB, 0x8C, 0x42, 0xD8, + 0x6E, 0xAD, 0xE1, 0xA4, 0xE6, 0x0D, 0x71, 0x06, 0xC9, 0xC6, 0xA4, 0x18, + 0x91, 0x65, 0xE3, 0x41, 0x00, 0xC6, 0x83, 0x12, 0x18, 0x3D, 0x16, 0xDA, + 0x45, 0x6A, 0x35, 0xB1, 0x81, 0x2E, 0xE8, 0x65, 0xAD, 0x9D, 0x8A, 0x21, + 0xC1, 0x7C, 0x56, 0x5A, 0x61, 0x70, 0x36, 0xB3, 0xE7, 0x3F, 0xD0, 0xF7, + 0xFE, 0xEA, 0x66, 0x43, 0x85, 0x5B, 0x0C, 0xD4, 0x18, 0x2C, 0x7D, 0xA7, + 0xD4, 0xC6, 0x9A, 0x83, 0x9A, 0x1A, 0x48, 0xAE, 0xA3, 0xA6, 0xAA, 0x8F, + 0xBD, 0x06, 0xA1, 0x16, 0xE2, 0x5D, 0x92, 0xD1, 0x25, 0x99, 0x11, 0xD0, + 0xDA, 0x43, 0x83, 0x8C, 0x6A, 0x9A, 0xDF, 0xC2, 0x6B, 0x35, 0x67, 0x24, + 0x59, 0xCD, 0x55, 0x59, 0xB1, 0x5A, 0x74, 0x04, 0x44, 0x40, 0x44, 0x44, + 0x04, 0x44, 0x40, 0x44, 0x44, 0x04, 0x44, 0x40, 0x57, 0xC0, 0xF5, 0xD0, + 0xFB, 0xC3, 0x8A, 0xB1, 0x5F, 0x03, 0xD7, 0x43, 0xEF, 0x0E, 0x28, 0x8F, + 0x4A, 0x8D, 0xD5, 0x1F, 0xE1, 0x9E, 0x0A, 0x93, 0x5D, 0x4A, 0x37, 0x86, + 0xEE, 0x0A, 0xB1, 0xBA, 0xA3, 0xFC, 0x33, 0xC1, 0x52, 0x6B, 0xA9, 0x46, + 0xF0, 0xDD, 0xC1, 0x49, 0xEC, 0xD6, 0x1E, 0x50, 0xAC, 0xAF, 0x52, 0x83, + 0xE1, 0xB7, 0x82, 0xAC, 0x2E, 0xAA, 0xCE, 0xE0, 0xE0, 0xA9, 0x2B, 0xD4, + 0xA0, 0xF8, 0x6D, 0xE0, 0xAB, 0x0B, 0xAA, 0xB3, 0xB8, 0x38, 0x29, 0x06, + 0x7E, 0x52, 0xF3, 0x58, 0xFE, 0xBE, 0x27, 0x78, 0xF1, 0x51, 0xA9, 0x23, + 0xFA, 0xF8, 0x9D, 0xE3, 0xC5, 0x46, 0xB5, 0x0C, 0x88, 0x88, 0x8A, 0x22, + 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, + 0x02, 0x22, 0x20, 0xE8, 0xBD, 0x10, 0xEB, 0x51, 0x3F, 0xAF, 0xAA, 0xEB, + 0x7F, 0x53, 0xFE, 0x9F, 0x55, 0xC9, 0x7A, 0x21, 0xD6, 0xA2, 0x7F, 0x5F, + 0x55, 0xD6, 0xFE, 0xA7, 0xFD, 0x3E, 0xAB, 0x28, 0xA7, 0xEA, 0x8F, 0x73, + 0xEA, 0xB9, 0x7F, 0x4D, 0x3D, 0x74, 0xB7, 0x74, 0xF1, 0x5D, 0x47, 0xEA, + 0x8F, 0x73, 0xEA, 0xB9, 0x7F, 0x4D, 0x3D, 0x74, 0xB7, 0x74, 0xF1, 0x5A, + 0x1C, 0xCA, 0x22, 0x22, 0x88, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x0A, 0xF8, 0x1E, 0xBA, + 0x1F, 0x78, 0x71, 0x56, 0x2B, 0xE0, 0x7A, 0xE8, 0x7D, 0xE1, 0xC5, 0x11, + 0xE9, 0x51, 0xBA, 0xA3, 0xFC, 0x33, 0xC1, 0x52, 0x6B, 0xA9, 0x46, 0xF0, + 0xDD, 0xC1, 0x56, 0x37, 0x54, 0x7F, 0x86, 0x78, 0x2A, 0x4D, 0x75, 0x28, + 0xDE, 0x1B, 0xB8, 0x29, 0x3D, 0x9A, 0xC3, 0xCA, 0x15, 0x95, 0xEA, 0x50, + 0x7C, 0x36, 0xF0, 0x57, 0x40, 0xCF, 0x2F, 0x0F, 0xB8, 0x38, 0x2B, 0x65, + 0x3A, 0x9C, 0x0F, 0x0D, 0xBC, 0x14, 0x76, 0xE4, 0x7B, 0x52, 0xF8, 0xB5, + 0x48, 0x33, 0xF2, 0x96, 0x2B, 0xE8, 0x19, 0x27, 0x3C, 0xBB, 0x92, 0x86, + 0x2B, 0x35, 0xFE, 0x4A, 0xD5, 0xB9, 0x3F, 0x27, 0xAA, 0x87, 0xB8, 0xB3, + 0x39, 0x49, 0x1E, 0xD4, 0xBE, 0x2D, 0x4E, 0x52, 0x47, 0xB5, 0x2F, 0x8B, + 0x51, 0x96, 0x1E, 0x4F, 0xC9, 0xEA, 0xA1, 0xEE, 0x26, 0x4F, 0xC9, 0xEA, + 0xA1, 0xEE, 0x2C, 0xCE, 0x52, 0x47, 0xB5, 0x2F, 0x8B, 0x53, 0x94, 0x91, + 0xED, 0x4B, 0xE2, 0xD4, 0x18, 0x79, 0x3F, 0x27, 0xAA, 0x87, 0xB8, 0x99, + 0x3F, 0x27, 0xAA, 0x87, 0xB8, 0xB3, 0x39, 0x49, 0x1E, 0xD4, 0xBE, 0x2D, + 0x4E, 0x52, 0x47, 0xB5, 0x2F, 0x8B, 0x50, 0x61, 0xE4, 0xFC, 0x9E, 0xAA, + 0x1E, 0xE2, 0x64, 0xFC, 0x9E, 0xAA, 0x1E, 0xE2, 0xCC, 0xE5, 0x24, 0x7B, + 0x52, 0xF8, 0xB5, 0x39, 0x49, 0x1E, 0xD4, 0xBE, 0x2D, 0x41, 0x87, 0x93, + 0xF2, 0x7A, 0xA8, 0x7B, 0x89, 0x93, 0xF2, 0x7A, 0xA8, 0x7B, 0x8B, 0x33, + 0x94, 0x91, 0xED, 0x4B, 0xE2, 0xD4, 0xE5, 0x24, 0x7B, 0x52, 0xF8, 0xB5, + 0x06, 0x1E, 0x4F, 0xC9, 0xEA, 0xA1, 0xEE, 0x26, 0x4F, 0xC9, 0xEA, 0xA1, + 0xEE, 0x2C, 0xCE, 0x52, 0x47, 0xB5, 0x2F, 0x8B, 0x53, 0x94, 0x91, 0xED, + 0x4B, 0xE2, 0xD4, 0x18, 0x79, 0x3F, 0x27, 0xAA, 0x87, 0xB8, 0x99, 0x3F, + 0x27, 0xAA, 0x87, 0xB8, 0xB3, 0x39, 0x49, 0x1E, 0xDC, 0xBE, 0x2D, 0x4E, + 0x52, 0x47, 0xB7, 0x2F, 0x8B, 0x50, 0x61, 0xE4, 0xFC, 0x9E, 0xAA, 0x1E, + 0xE2, 0x64, 0xFC, 0x9E, 0xAA, 0x1E, 0xE2, 0xCC, 0xE5, 0x24, 0x7B, 0x72, + 0xF8, 0xB5, 0x39, 0x49, 0x1E, 0xDC, 0xBE, 0x2D, 0x41, 0x87, 0x93, 0xF2, + 0x7A, 0xA8, 0x7B, 0x89, 0x93, 0xF2, 0x7A, 0xA8, 0x7B, 0x8B, 0x33, 0x94, + 0x91, 0xED, 0xCB, 0xE2, 0xD4, 0xE5, 0x24, 0x7B, 0x72, 0xF8, 0xB5, 0x06, + 0x1E, 0x4F, 0xC9, 0xEA, 0xA1, 0xEE, 0x26, 0x4F, 0xC9, 0xEA, 0xA1, 0xEE, + 0x2C, 0xCE, 0x52, 0x47, 0xB7, 0x2F, 0x8B, 0x53, 0x94, 0x91, 0xED, 0xCB, + 0xE2, 0xD4, 0x18, 0x79, 0x3F, 0x27, 0xAA, 0x87, 0xB8, 0x99, 0x3F, 0x27, + 0xAA, 0x87, 0xB8, 0xB3, 0x39, 0x49, 0x1E, 0xDC, 0xBE, 0x2D, 0x4E, 0x52, + 0x47, 0xB7, 0x2F, 0x8B, 0x50, 0x61, 0xE4, 0xFC, 0x9E, 0xAA, 0x1E, 0xE2, + 0x64, 0xFC, 0x9E, 0xAA, 0x1E, 0xE2, 0xCC, 0xE5, 0x24, 0x7B, 0x72, 0xF8, + 0xB5, 0x39, 0x49, 0x1E, 0xDC, 0xBE, 0x2D, 0x41, 0x87, 0x93, 0xF2, 0x7A, + 0xA8, 0x7B, 0x89, 0x93, 0xF2, 0x7A, 0xA8, 0x7B, 0x8B, 0x33, 0x94, 0x91, + 0xED, 0xCB, 0xE2, 0xD4, 0xE5, 0x24, 0x7B, 0x52, 0xF8, 0xB5, 0x06, 0x1E, + 0x4F, 0xC9, 0xEA, 0xA1, 0xEE, 0x26, 0x4F, 0xC9, 0xEA, 0xA1, 0xEE, 0x2C, + 0xCE, 0x52, 0x47, 0xB5, 0x2F, 0x8B, 0x53, 0x94, 0x91, 0xED, 0x4B, 0xE2, + 0xD4, 0x18, 0x79, 0x3F, 0x27, 0xAA, 0x87, 0xB8, 0x99, 0x3F, 0x27, 0xAA, + 0x87, 0xB8, 0xB3, 0x39, 0x49, 0x1E, 0xD4, 0xBE, 0x2D, 0x4E, 0x52, 0x47, + 0xB5, 0x2F, 0x8B, 0x50, 0x61, 0xE4, 0xFC, 0x9E, 0xAA, 0x1E, 0xE2, 0x64, + 0xFC, 0x9E, 0xAA, 0x1E, 0xE2, 0xCC, 0xE5, 0x24, 0x7B, 0x52, 0xF8, 0xB5, + 0x39, 0x49, 0x1E, 0xD4, 0xBE, 0x2D, 0x41, 0x87, 0x93, 0xF2, 0x7A, 0xA8, + 0x7B, 0x89, 0x93, 0xF2, 0x7A, 0xA8, 0x7B, 0x8B, 0x33, 0x94, 0x91, 0xED, + 0x4B, 0xE2, 0xD4, 0xE5, 0x24, 0x7B, 0x52, 0xF8, 0xB5, 0x06, 0x1E, 0x4F, + 0xC9, 0xEA, 0xA1, 0xEE, 0x26, 0x4F, 0xC9, 0xEA, 0xA1, 0xEE, 0x2C, 0xCE, + 0x52, 0x47, 0xB5, 0x2F, 0x8B, 0x53, 0x94, 0x91, 0xED, 0x4B, 0xE2, 0xD4, + 0x11, 0xCA, 0x51, 0x70, 0x24, 0xE2, 0x5B, 0x82, 0x1A, 0xDD, 0x20, 0x36, + 0xAA, 0xD6, 0x57, 0xEA, 0x7F, 0xD3, 0xEA, 0xA1, 0xE5, 0x24, 0x7B, 0x52, + 0xF8, 0xB5, 0x5C, 0xD8, 0xF2, 0x8C, 0xFC, 0x91, 0x60, 0x36, 0xBD, 0x0E, + 0x01, 0x05, 0xFF, 0x00, 0xAA, 0x3D, 0xCF, 0xAA, 0x8E, 0x6A, 0x42, 0x56, + 0x70, 0xB4, 0xCC, 0xC1, 0x6C, 0x42, 0xDC, 0xC2, 0xD7, 0xB9, 0x55, 0xF1, + 0xA4, 0xDE, 0x6B, 0x7C, 0x48, 0x0E, 0xAB, 0x4B, 0x81, 0x56, 0xDB, 0x90, + 0xED, 0x4B, 0x62, 0xD5, 0xA1, 0x0D, 0xC7, 0x46, 0xEC, 0x70, 0xF0, 0x4B, + 0x8E, 0x8D, 0xD8, 0xE1, 0xE0, 0xA6, 0xB7, 0x21, 0xDA, 0x96, 0xC5, 0xA9, + 0x6E, 0x43, 0xB5, 0x2D, 0x8B, 0x52, 0xC4, 0x37, 0x1D, 0x1B, 0xB1, 0xC3, + 0xC1, 0x2E, 0x3A, 0x37, 0x63, 0x87, 0x82, 0x9A, 0xDC, 0x87, 0x6A, 0x5B, + 0x16, 0xA5, 0xB9, 0x0E, 0xD4, 0xB6, 0x2D, 0x4B, 0x10, 0xDC, 0x74, 0x6E, + 0xC7, 0x0F, 0x04, 0xB8, 0xE8, 0xDD, 0x8E, 0x1E, 0x0A, 0x6B, 0x72, 0x1D, + 0xA9, 0x6C, 0x5A, 0x96, 0xE4, 0x3B, 0x52, 0xD8, 0xB5, 0x2C, 0x43, 0x71, + 0xD1, 0xBB, 0x1C, 0x3C, 0x12, 0xE3, 0xA3, 0x76, 0x38, 0x78, 0x29, 0xAD, + 0xC8, 0x76, 0xA5, 0xB1, 0x6A, 0x5B, 0x90, 0xED, 0x4B, 0x62, 0xD4, 0xB1, + 0x0D, 0xC7, 0x46, 0xEC, 0x70, 0xF0, 0x4B, 0x8E, 0x8D, 0xD8, 0xE1, 0xE0, + 0xA6, 0xB7, 0x21, 0xDA, 0x96, 0xC5, 0xA9, 0x6E, 0x43, 0xB5, 0x2D, 0x8B, + 0x52, 0xC4, 0x37, 0x1D, 0x1B, 0xB1, 0xC3, 0xC1, 0x2E, 0x3A, 0x37, 0x63, + 0x87, 0x82, 0x9A, 0xDC, 0x87, 0x6A, 0x5B, 0x16, 0xA5, 0xB9, 0x0E, 0xD4, + 0xB6, 0x2D, 0x4B, 0x10, 0xDC, 0x74, 0x6E, 0xC7, 0x0F, 0x04, 0xB8, 0xE8, + 0xDD, 0x8E, 0x1E, 0x0A, 0x5B, 0x72, 0x1D, 0xA9, 0x6C, 0x5A, 0x96, 0xE4, + 0x3B, 0x52, 0xD8, 0xB5, 0x04, 0x57, 0x1D, 0x1B, 0xB1, 0xC3, 0xC1, 0x2E, + 0x3A, 0x37, 0x63, 0x87, 0x82, 0x96, 0xDC, 0x87, 0x6A, 0x5B, 0x16, 0xA5, + 0xB9, 0x0E, 0xD4, 0xB6, 0x2D, 0x41, 0x15, 0xC7, 0x46, 0xEC, 0x70, 0xF0, + 0x4B, 0x8E, 0x8D, 0xD8, 0xE1, 0xE0, 0xA5, 0xB7, 0x21, 0xDA, 0x96, 0xC5, + 0xA9, 0x6E, 0x43, 0xB5, 0x2D, 0x8B, 0x50, 0x45, 0x71, 0xD1, 0xBB, 0x1C, + 0x3C, 0x12, 0xE3, 0xA3, 0x76, 0x38, 0x78, 0x29, 0x6D, 0xC8, 0x76, 0xA5, + 0xB1, 0x6A, 0x5B, 0x90, 0xED, 0x4B, 0x62, 0xD4, 0x11, 0x5C, 0x74, 0x6E, + 0xC7, 0x0F, 0x04, 0xB8, 0xE8, 0xDD, 0x8E, 0x1E, 0x0A, 0x5B, 0x72, 0x1D, + 0xA9, 0x6C, 0x5A, 0x96, 0xE4, 0x3B, 0x52, 0xD8, 0xB5, 0x04, 0x57, 0x1D, + 0x1B, 0xB1, 0xC3, 0xC1, 0x2E, 0x3A, 0x37, 0x63, 0x87, 0x82, 0x96, 0xDC, + 0x87, 0x6A, 0x5B, 0x16, 0xAA, 0xDB, 0x90, 0xED, 0x4B, 0x62, 0xD4, 0x10, + 0xDC, 0x74, 0x6E, 0xC7, 0x0F, 0x04, 0xB8, 0xE8, 0xDD, 0x8E, 0x1E, 0x0A, + 0x6B, 0x72, 0x1D, 0xA9, 0x6C, 0x5A, 0x96, 0xE4, 0x3B, 0x52, 0xD8, 0xB5, + 0x2C, 0x43, 0x71, 0xD1, 0xBB, 0x1C, 0x3C, 0x12, 0xE3, 0xA3, 0x76, 0x38, + 0x78, 0x29, 0xAD, 0xC8, 0x76, 0xA5, 0xB1, 0x6A, 0x5B, 0x90, 0xED, 0x4B, + 0x62, 0xD4, 0xB1, 0x0D, 0xC7, 0x46, 0xEC, 0x70, 0xF0, 0x4B, 0x8E, 0x8D, + 0xD8, 0xE1, 0xE0, 0xA6, 0xB7, 0x21, 0xDA, 0x96, 0xC5, 0xA9, 0x6E, 0x43, + 0xB5, 0x2D, 0x8B, 0x52, 0xC4, 0x37, 0x1D, 0x1B, 0xB1, 0xC3, 0xC1, 0x2E, + 0x3A, 0x37, 0x63, 0x87, 0x82, 0x9A, 0xDC, 0x87, 0x6A, 0x5B, 0x16, 0xA5, + 0xB9, 0x0E, 0xD4, 0xB6, 0x2D, 0x4B, 0x10, 0xDC, 0x74, 0x6E, 0xC7, 0x0F, + 0x04, 0xB8, 0xE8, 0xDD, 0x8E, 0x1E, 0x0A, 0x6B, 0x72, 0x1D, 0xA9, 0x6C, + 0x5A, 0x96, 0xE4, 0x3B, 0x52, 0xD8, 0xB5, 0x2C, 0x43, 0x71, 0xD1, 0xBB, + 0x1C, 0x3C, 0x15, 0x45, 0x09, 0x46, 0x82, 0x08, 0x94, 0x86, 0x08, 0x52, + 0xDB, 0x90, 0xED, 0x4B, 0x62, 0xD4, 0xB7, 0x21, 0xDA, 0x96, 0xC5, 0xA9, + 0x62, 0x59, 0x8C, 0xD2, 0xD1, 0x47, 0xFE, 0x07, 0x82, 0xB6, 0x6B, 0xA9, + 0x46, 0xF0, 0xDD, 0xC1, 0x59, 0x6E, 0x43, 0xB5, 0x2D, 0x8B, 0x54, 0x93, + 0x7D, 0x4E, 0x3F, 0x86, 0xEE, 0x0A, 0x4F, 0x66, 0xF0, 0xF2, 0x85, 0x25, + 0x7A, 0x94, 0x1F, 0x0D, 0xBC, 0x17, 0x9B, 0xCC, 0x75, 0x88, 0xBD, 0xF3, + 0xC5, 0x7A, 0x44, 0xAF, 0x52, 0x83, 0xE1, 0xB7, 0x82, 0xF3, 0x79, 0x8E, + 0xB1, 0x17, 0xBE, 0x78, 0xA4, 0x76, 0x33, 0xF2, 0x94, 0x68, 0x88, 0xAB, + 0x22, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x92, 0x27, 0xAA, 0x85, 0xFC, 0x1E, 0x25, 0x46, 0xA5, 0x2D, 0x2F, + 0x85, 0x0E, 0xCD, 0x46, 0xA0, 0x7D, 0xFF, 0x00, 0xBA, 0xB7, 0x92, 0x7E, + 0x81, 0x88, 0x52, 0x25, 0x16, 0x29, 0x25, 0xE1, 0x18, 0xF3, 0x10, 0xE0, + 0x82, 0x01, 0x88, 0xE0, 0xDA, 0xCF, 0xBA, 0xB2, 0xA9, 0xC9, 0x3F, 0x40, + 0xC4, 0x20, 0x86, 0xF0, 0x6B, 0x19, 0x88, 0xFD, 0xC2, 0xB7, 0x03, 0x2D, + 0x92, 0x50, 0x5F, 0x09, 0xD1, 0x9B, 0x12, 0x27, 0x26, 0xD0, 0xE2, 0x41, + 0x60, 0xB5, 0x5B, 0x4B, 0x7F, 0x7F, 0xFC, 0x82, 0x95, 0xB2, 0x30, 0x43, + 0x07, 0xE2, 0x2E, 0x73, 0x9C, 0x0B, 0x4B, 0x87, 0xFD, 0xA5, 0x85, 0xD9, + 0xC5, 0x7D, 0x2B, 0x1D, 0xB3, 0x33, 0x6D, 0x73, 0xDC, 0x62, 0x39, 0xCE, + 0x73, 0x2C, 0x5A, 0x2F, 0xCE, 0x05, 0x60, 0xE6, 0xCF, 0xFB, 0x2B, 0x0C, + 0x49, 0x92, 0x5C, 0x4C, 0x57, 0xD6, 0xE3, 0x5B, 0xBF, 0x1F, 0x49, 0x52, + 0xCB, 0x64, 0x32, 0x8E, 0x64, 0x48, 0x8D, 0x84, 0x22, 0xB8, 0x3C, 0x18, + 0x76, 0x89, 0x6E, 0x6A, 0x9C, 0x47, 0x46, 0x7F, 0x75, 0x63, 0xF9, 0x56, + 0x32, 0x4E, 0x1B, 0xDA, 0xD8, 0x8D, 0x88, 0xF3, 0x0E, 0xA7, 0x5A, 0xAC, + 0x01, 0x55, 0x44, 0x0F, 0x79, 0xA8, 0x0C, 0xE1, 0x45, 0xCA, 0x4C, 0xD9, + 0x63, 0x79, 0x57, 0xD9, 0x61, 0x05, 0xA2, 0xDF, 0x41, 0x1D, 0x15, 0x67, + 0x54, 0x86, 0xE9, 0x88, 0x5E, 0xAE, 0x23, 0x9B, 0xD3, 0xD0, 0xFA, 0xBA, + 0x7A, 0x78, 0x04, 0xB1, 0x34, 0xDC, 0xAB, 0x25, 0xE0, 0xD4, 0x0D, 0xA2, + 0x22, 0x55, 0x6B, 0x48, 0xB2, 0x08, 0xE2, 0xB0, 0x94, 0xD1, 0x0C, 0x78, + 0xBE, 0xB1, 0xEE, 0x7F, 0x79, 0xF5, 0xAB, 0x39, 0x27, 0xE8, 0x18, 0x84, + 0xB8, 0x16, 0x22, 0xBF, 0x92, 0x7E, 0x81, 0x88, 0x4E, 0x49, 0xFA, 0x06, + 0x21, 0x5B, 0x80, 0x8D, 0xEB, 0x3F, 0xD5, 0xBF, 0xFF, 0x00, 0x50, 0xAC, + 0x57, 0xC6, 0xF5, 0xA7, 0xF6, 0x6B, 0x47, 0xCA, 0x15, 0x8A, 0x47, 0x62, + 0x04, 0x44, 0x55, 0x44, 0x57, 0x3A, 0x1B, 0xD8, 0xD0, 0x5E, 0xC7, 0x34, + 0x1E, 0x82, 0x45, 0x55, 0xA1, 0x86, 0xF0, 0xC0, 0xF2, 0xC7, 0x06, 0x1E, + 0x87, 0x55, 0x99, 0x05, 0xA8, 0xAA, 0x01, 0x71, 0x01, 0xA0, 0x92, 0x7A, + 0x00, 0x4B, 0x27, 0x3E, 0x63, 0x9B, 0xA7, 0xF6, 0x41, 0x44, 0x44, 0x40, + 0x44, 0x44, 0x04, 0x55, 0xA8, 0x80, 0x09, 0x06, 0xA3, 0xD0, 0xA8, 0x80, + 0x8A, 0xA0, 0x17, 0x10, 0x00, 0x24, 0x9E, 0x80, 0x15, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x56, 0xA3, 0x9B, 0x31, 0xCF, 0x98, 0x20, 0xA2, 0x2B, 0x9F, + 0x0D, 0xF0, 0xC8, 0x11, 0x18, 0xE6, 0x93, 0xDA, 0x15, 0x23, 0xA1, 0xBD, + 0x80, 0x17, 0xB1, 0xCD, 0x07, 0xA0, 0x91, 0x55, 0x68, 0x2D, 0x45, 0x52, + 0xD2, 0x00, 0x24, 0x10, 0x0F, 0x46, 0x6E, 0x94, 0xB2, 0x41, 0x20, 0x83, + 0x58, 0xE9, 0x15, 0x74, 0x20, 0xA2, 0x22, 0x20, 0x2B, 0xE0, 0xFE, 0x73, + 0xDD, 0x77, 0x02, 0xAC, 0x57, 0xC1, 0xFC, 0xFF, 0x00, 0xCB, 0x5C, 0x3C, + 0x8A, 0xB0, 0x8B, 0x11, 0x5F, 0xC9, 0xBB, 0x40, 0xC4, 0x27, 0x26, 0xED, + 0x03, 0x10, 0x94, 0x2C, 0x59, 0xB0, 0x64, 0x59, 0x12, 0x1C, 0x22, 0x62, + 0x90, 0xE7, 0x43, 0x74, 0x42, 0x2A, 0x00, 0x00, 0x1C, 0x47, 0x49, 0x3D, + 0x39, 0x96, 0x2F, 0x26, 0xED, 0x03, 0x10, 0xAF, 0x69, 0x8E, 0xC7, 0x35, + 0xCC, 0x7B, 0x9A, 0x58, 0x2A, 0x69, 0x0F, 0xE8, 0x1F, 0xB6, 0x25, 0x28, + 0x65, 0x1A, 0x3E, 0x13, 0x5C, 0xDB, 0x51, 0x9C, 0x5B, 0x11, 0xED, 0x63, + 0x6C, 0xB4, 0x38, 0x82, 0x45, 0x79, 0xF3, 0xF0, 0xE9, 0x51, 0xC4, 0x91, + 0xB0, 0xE2, 0x2D, 0x93, 0x54, 0x27, 0x44, 0xE8, 0xD0, 0xE2, 0x3E, 0x8A, + 0xC8, 0x73, 0x13, 0x50, 0xE2, 0x98, 0x8D, 0x8A, 0xFB, 0x44, 0x82, 0xEF, + 0xC7, 0xF9, 0xAA, 0xD3, 0x9D, 0x51, 0xF1, 0xA6, 0x5E, 0x1C, 0xDE, 0x51, + 0xC1, 0x8E, 0x24, 0xD8, 0x0F, 0xCD, 0x9C, 0xD7, 0xD1, 0x5A, 0x94, 0x32, + 0xA2, 0x51, 0xD0, 0xF9, 0xC3, 0x99, 0xCA, 0x59, 0x25, 0xF1, 0x33, 0x06, + 0x80, 0x00, 0x65, 0x7A, 0x4F, 0xEC, 0xAC, 0x7C, 0x8C, 0x28, 0x6C, 0xE5, + 0x1D, 0x15, 0xC5, 0x86, 0xC8, 0x01, 0x80, 0x38, 0x82, 0x6B, 0xE9, 0xA8, + 0xD5, 0xFF, 0x00, 0x6A, 0xC6, 0xB5, 0x1E, 0xD8, 0x7F, 0x28, 0xEB, 0x60, + 0x92, 0x1D, 0x6F, 0x38, 0x27, 0xA4, 0xAB, 0x84, 0x69, 0xA0, 0xF7, 0x3C, + 0x46, 0x78, 0x73, 0x85, 0x44, 0xF2, 0x99, 0xC8, 0xC5, 0x28, 0x52, 0x79, + 0x8D, 0x85, 0x3D, 0x31, 0x0D, 0x82, 0xA6, 0xB6, 0x2B, 0x80, 0x1A, 0x00, + 0x25, 0x40, 0xA4, 0x73, 0x22, 0x39, 0xC5, 0xCE, 0x35, 0xB8, 0x9A, 0xC9, + 0x2E, 0xCE, 0x55, 0x39, 0x37, 0x68, 0x18, 0x85, 0x68, 0x58, 0xAF, 0x6F, + 0xAB, 0x89, 0xFC, 0x0E, 0x29, 0xC9, 0xBB, 0x40, 0xC4, 0x2A, 0xD9, 0x2D, + 0x86, 0xFA, 0xEA, 0xCF, 0x57, 0xBF, 0xF7, 0x41, 0x1A, 0x22, 0x28, 0xA2, + 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, 0x20, + 0x92, 0x5F, 0xAC, 0x42, 0xEF, 0x8E, 0x2B, 0xD2, 0x26, 0xBA, 0x94, 0x6F, + 0x0D, 0xDC, 0x17, 0x9B, 0xCB, 0xF5, 0x88, 0x5D, 0xF1, 0xC5, 0x7A, 0x44, + 0xD7, 0x52, 0x8D, 0xE1, 0xBB, 0x82, 0x93, 0xD9, 0xAC, 0x3C, 0xA0, 0x95, + 0xEA, 0x50, 0x7C, 0x36, 0xF0, 0x5E, 0x6F, 0x31, 0xD6, 0x22, 0xF7, 0xCF, + 0x15, 0xE9, 0x12, 0xBD, 0x4A, 0x0F, 0x86, 0xDE, 0x0B, 0xCD, 0xE6, 0x3A, + 0xC4, 0x5E, 0xF9, 0xE2, 0x91, 0xD8, 0xCF, 0xCA, 0x51, 0xA2, 0x22, 0xAC, + 0x88, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0x40, 0x3D, 0x2A, 0x96, 0x46, 0x85, 0x54, 0x41, 0x4B, 0x23, 0x42, + 0x59, 0x1A, 0x15, 0x51, 0x05, 0x2C, 0x8D, 0x09, 0x64, 0x68, 0x55, 0x44, + 0x14, 0xB2, 0x34, 0x25, 0x91, 0xA1, 0x55, 0x10, 0x52, 0xC8, 0xD0, 0x96, + 0x46, 0x85, 0x54, 0x41, 0x4B, 0x23, 0x42, 0x59, 0x1A, 0x15, 0x51, 0x00, + 0x0A, 0xBA, 0x11, 0x11, 0x01, 0x64, 0xD1, 0xCE, 0x86, 0xD9, 0xE8, 0x46, + 0x29, 0x68, 0x6D, 0x7D, 0x2E, 0xE8, 0x06, 0xAC, 0xD5, 0xFE, 0xD5, 0xD4, + 0xB1, 0x91, 0x06, 0xD2, 0x1B, 0x66, 0xE1, 0xB6, 0x65, 0xD3, 0xFC, 0xA0, + 0x84, 0xE8, 0x6E, 0xAF, 0x94, 0x39, 0x9E, 0xEF, 0xFB, 0x6A, 0xD2, 0x6B, + 0xAB, 0x38, 0x53, 0xC5, 0x6C, 0x57, 0xB6, 0x33, 0x9E, 0x22, 0xC1, 0x1C, + 0x91, 0x1C, 0xAB, 0x5D, 0x6A, 0x0B, 0xC0, 0x19, 0x80, 0xAC, 0x66, 0xAE, + 0xAC, 0xD9, 0xFA, 0x56, 0x91, 0x10, 0x67, 0x51, 0xB6, 0x60, 0x88, 0xB3, + 0x2F, 0x79, 0x87, 0xC9, 0xB6, 0xCB, 0x1C, 0x05, 0x66, 0xD3, 0xBD, 0xF5, + 0x7E, 0xC2, 0xBF, 0x25, 0x9C, 0xE6, 0x35, 0xFC, 0xEA, 0x2C, 0xBC, 0x31, + 0x1C, 0x47, 0x6B, 0x22, 0x35, 0x95, 0x1C, 0xE6, 0xB3, 0x6B, 0x30, 0xFD, + 0xEB, 0xCC, 0xB4, 0x68, 0x83, 0x77, 0x0E, 0x4E, 0x0B, 0xA2, 0xBD, 0xAD, + 0x96, 0xAD, 0xD5, 0xB2, 0xD0, 0xCE, 0xE6, 0xC3, 0x25, 0xB9, 0xC1, 0xA8, + 0xD6, 0x33, 0xFB, 0xF3, 0xA8, 0xEC, 0x43, 0xE6, 0xD0, 0x5D, 0x12, 0x0B, + 0x1E, 0xD8, 0x70, 0x22, 0x54, 0x6B, 0x35, 0x39, 0xC1, 0xE7, 0xDF, 0x5E, + 0x7F, 0xBA, 0xD4, 0x22, 0x0D, 0xBB, 0x24, 0xD8, 0xF9, 0x42, 0x4C, 0x01, + 0x5B, 0xA0, 0x98, 0x8D, 0x73, 0x1A, 0xE3, 0x9F, 0xA7, 0xA6, 0xBA, 0xBF, + 0xA0, 0x0A, 0xB9, 0xB0, 0x1B, 0x06, 0x72, 0x11, 0x6C, 0xAB, 0x04, 0x06, + 0xC6, 0x86, 0x19, 0x18, 0xB8, 0xFE, 0x30, 0x4F, 0x4F, 0x4D, 0x47, 0x4E, + 0x6E, 0x85, 0xA6, 0x44, 0x1B, 0x7E, 0x41, 0xAE, 0x19, 0xE0, 0xDA, 0x8C, + 0x1A, 0xF2, 0xD8, 0x24, 0x9C, 0xEE, 0xB6, 0x05, 0x55, 0x57, 0x5F, 0x45, + 0x66, 0xAF, 0xD9, 0x59, 0x1A, 0x14, 0x08, 0x10, 0xE2, 0xC4, 0x30, 0x19, + 0xCA, 0x86, 0xC3, 0x26, 0x19, 0x26, 0xA6, 0x38, 0xD7, 0x58, 0xAA, 0xBF, + 0xD8, 0x66, 0xFD, 0xD6, 0xAD, 0x10, 0x6C, 0xA0, 0xB2, 0x1C, 0x2A, 0x7A, + 0x00, 0x86, 0x03, 0x58, 0x23, 0x30, 0x81, 0x5E, 0x61, 0x9C, 0x15, 0x64, + 0xBC, 0x84, 0x6E, 0x72, 0x39, 0x68, 0x06, 0xCD, 0x4E, 0x20, 0x3C, 0x1F, + 0xC4, 0x40, 0x3D, 0x15, 0x67, 0x3F, 0xC2, 0xC0, 0x44, 0x1B, 0x97, 0xC8, + 0x41, 0x8B, 0x11, 0x90, 0x9A, 0xCE, 0x45, 0xF1, 0x61, 0x07, 0x87, 0x38, + 0x16, 0x80, 0x43, 0x88, 0x70, 0xAA, 0xB3, 0x57, 0xE1, 0xCF, 0xFD, 0x24, + 0x09, 0x79, 0x38, 0xAC, 0x11, 0x19, 0x01, 0xCE, 0x84, 0xF7, 0xBA, 0xDD, + 0x40, 0x9B, 0x0D, 0xAF, 0x36, 0x7B, 0x40, 0x0C, 0xD9, 0xEB, 0x2B, 0x55, + 0x0A, 0x33, 0xE1, 0x07, 0x86, 0x10, 0x2D, 0xB6, 0xC9, 0x35, 0x0A, 0xEA, + 0xFD, 0x8F, 0xB9, 0x46, 0x83, 0x2A, 0x6C, 0x42, 0x64, 0x28, 0x0D, 0x87, + 0x0D, 0xA0, 0xBA, 0x18, 0x73, 0x9D, 0x59, 0xAC, 0x9C, 0xEB, 0x2E, 0x01, + 0x0C, 0x7C, 0x36, 0xC3, 0x21, 0xAF, 0x32, 0xA7, 0x91, 0x35, 0xD5, 0xF8, + 0xC9, 0xCF, 0x9F, 0x4F, 0x48, 0xC1, 0x6A, 0x95, 0xCE, 0x7B, 0x9C, 0xC6, + 0xB0, 0x9A, 0xC3, 0x6B, 0xAB, 0xF6, 0x41, 0xB3, 0x82, 0xD9, 0x88, 0x50, + 0x1C, 0xD9, 0xCF, 0xC0, 0x4C, 0x46, 0x18, 0x4D, 0x8F, 0x5F, 0xE6, 0xB5, + 0x9C, 0xD4, 0x73, 0xD5, 0x55, 0x75, 0x95, 0x24, 0x68, 0x11, 0xA3, 0xC3, + 0x8C, 0x1C, 0xD8, 0xF2, 0xEE, 0x88, 0xF6, 0xFE, 0x18, 0xAE, 0xB4, 0xC8, + 0x84, 0xBA, 0xAF, 0xC2, 0x48, 0xFD, 0xEB, 0xF7, 0xE6, 0xAD, 0x69, 0x91, + 0x06, 0xE6, 0x69, 0xF0, 0x26, 0x65, 0xDF, 0x0E, 0x04, 0x5B, 0x5C, 0xD5, + 0xC0, 0xC3, 0x05, 0xB5, 0x7E, 0x0C, 0xCD, 0x3F, 0xCE, 0x7A, 0x8E, 0x2A, + 0x39, 0x89, 0x78, 0xEC, 0xA6, 0x9F, 0x17, 0x92, 0x77, 0x26, 0xE9, 0x93, + 0x51, 0x23, 0x33, 0x81, 0x77, 0xD5, 0x6A, 0x95, 0xD0, 0xDE, 0xE8, 0x6F, + 0xB4, 0xC3, 0x53, 0x87, 0x41, 0xD0, 0x81, 0x10, 0x35, 0xB1, 0x5E, 0x18, + 0x6B, 0x68, 0x71, 0x00, 0xFE, 0xCA, 0xD4, 0x44, 0x04, 0x44, 0x41, 0x4B, + 0x23, 0x42, 0x59, 0x1A, 0x15, 0x51, 0x05, 0x2C, 0x8D, 0x09, 0x64, 0x68, + 0x55, 0x44, 0x14, 0xB2, 0x34, 0x25, 0x91, 0xA1, 0x55, 0x10, 0x52, 0xC8, + 0xD0, 0x96, 0x46, 0x85, 0x54, 0x41, 0x4B, 0x23, 0x42, 0x59, 0x1A, 0x15, + 0x51, 0x05, 0x2C, 0x8D, 0x09, 0x50, 0xD0, 0xAA, 0x88, 0x08, 0x88, 0x80, + 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, + 0x24, 0x97, 0xEB, 0x10, 0xBB, 0xE3, 0x8A, 0xF4, 0x89, 0xAE, 0xA5, 0x1B, + 0xC3, 0x77, 0x05, 0xE6, 0xF2, 0xFD, 0x62, 0x17, 0x7C, 0x71, 0x5E, 0x91, + 0x35, 0xD4, 0xA3, 0x78, 0x6E, 0xE0, 0xA4, 0xF6, 0x6B, 0x0F, 0x28, 0x25, + 0x7A, 0x94, 0x1F, 0x0D, 0xBC, 0x17, 0x9B, 0xCC, 0x75, 0x88, 0xBD, 0xF3, + 0xC5, 0x7A, 0x4C, 0xA7, 0x53, 0x83, 0xE1, 0xB7, 0x82, 0xC4, 0x34, 0x15, + 0x1A, 0x49, 0x26, 0x55, 0x84, 0x9E, 0x93, 0x59, 0x48, 0xEC, 0x65, 0xE5, + 0x2F, 0x3D, 0x45, 0xE8, 0x57, 0x0D, 0x19, 0xB2, 0x33, 0xCD, 0x2E, 0x1A, + 0x33, 0x64, 0x67, 0x9A, 0xAC, 0xBC, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, + 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, + 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, 0xC8, 0xCF, 0x34, 0xB8, + 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x3C, 0xF5, 0x17, 0xA1, 0x5C, 0x34, 0x66, + 0xC8, 0xCF, 0x34, 0xB8, 0x68, 0xCD, 0x91, 0x9E, 0x68, 0x38, 0x19, 0x7E, + 0xB1, 0x0B, 0xBE, 0x38, 0xAF, 0x48, 0x9A, 0xEA, 0x51, 0xBC, 0x37, 0x70, + 0x58, 0xA2, 0x82, 0xA3, 0x5A, 0x41, 0x12, 0xAC, 0x04, 0x74, 0x1A, 0xCA, + 0xCB, 0x9B, 0xEA, 0x71, 0xFC, 0x37, 0x70, 0x52, 0x7B, 0x35, 0x87, 0x94, + 0x12, 0xBD, 0x4A, 0x0F, 0x86, 0xDE, 0x0B, 0x9B, 0x2F, 0x75, 0x67, 0xF1, + 0x1C, 0x57, 0x49, 0x2B, 0xD4, 0xA0, 0xF8, 0x6D, 0xE0, 0xB9, 0xA3, 0xD2, + 0x57, 0x1F, 0xE9, 0xDA, 0x1C, 0xFF, 0x00, 0xB7, 0x92, 0xB6, 0xDF, 0xDA, + 0x76, 0x29, 0x6D, 0xFD, 0xA7, 0x62, 0xAD, 0x45, 0xC5, 0xC5, 0x75, 0xB7, + 0xF6, 0x9D, 0x8A, 0x5B, 0x7F, 0x69, 0xD8, 0xAB, 0x51, 0x05, 0xD6, 0xDF, + 0xDA, 0x76, 0x29, 0x6D, 0xFD, 0xA7, 0x62, 0xAD, 0x44, 0x17, 0x5B, 0x7F, + 0x69, 0xD8, 0xA5, 0xB7, 0xF6, 0x9D, 0x8A, 0xB5, 0x10, 0x5D, 0x6D, 0xFD, + 0xA7, 0x62, 0x96, 0xDF, 0xDA, 0x76, 0x2A, 0xD4, 0x41, 0x75, 0xB7, 0xF6, + 0x9D, 0x8A, 0x5B, 0x7F, 0x69, 0xD8, 0xAB, 0x51, 0x05, 0xD6, 0xDF, 0xDA, + 0x76, 0x29, 0x6D, 0xFD, 0xA7, 0x62, 0xAD, 0x44, 0x17, 0x5B, 0x7F, 0x69, + 0xD8, 0xA5, 0xB7, 0xF6, 0x9D, 0x8A, 0xB5, 0x10, 0x5D, 0x6D, 0xFD, 0xA7, + 0x62, 0x96, 0xDF, 0xDA, 0x76, 0x2A, 0xD4, 0x41, 0x75, 0xB7, 0xF6, 0x9D, + 0x8A, 0x5B, 0x7F, 0x69, 0xD8, 0xAB, 0x51, 0x05, 0xD6, 0xDF, 0xDA, 0x76, + 0x29, 0x6D, 0xFD, 0xA7, 0x62, 0xAD, 0x44, 0x17, 0x5B, 0x7F, 0x69, 0xD8, + 0xA5, 0xB7, 0xF6, 0x9D, 0x8A, 0xB5, 0x10, 0x5D, 0x6D, 0xFD, 0xA7, 0x62, + 0x96, 0xDF, 0xDA, 0x76, 0x2A, 0xD4, 0x41, 0x75, 0xB7, 0xF6, 0x9D, 0x8A, + 0x5B, 0x7F, 0x69, 0xD8, 0xAB, 0x51, 0x05, 0xD6, 0xDF, 0xDA, 0x76, 0x29, + 0x6D, 0xFD, 0xA7, 0x62, 0xAD, 0x44, 0x17, 0x5B, 0x7F, 0x69, 0xD8, 0xA5, + 0xB7, 0xF6, 0x9D, 0x8A, 0xB5, 0x10, 0x5D, 0x6D, 0xFD, 0xA7, 0x62, 0x96, + 0xDF, 0xDA, 0x76, 0x2A, 0xD4, 0x41, 0x75, 0xB7, 0xF6, 0x9D, 0x8A, 0x5B, + 0x7F, 0x69, 0xD8, 0xAB, 0x51, 0x05, 0xD6, 0xDF, 0xDA, 0x76, 0x2B, 0x65, + 0x42, 0xB8, 0x98, 0xB1, 0x6B, 0x24, 0xFE, 0x11, 0xD2, 0x56, 0xAD, 0x6C, + 0xE8, 0x4F, 0x5B, 0x17, 0xBA, 0x16, 0xF0, 0xF2, 0x6B, 0x1E, 0xEA, 0x53, + 0xAE, 0x73, 0x63, 0x42, 0xA9, 0xC4, 0x7E, 0x13, 0xD0, 0x56, 0xAB, 0x94, + 0x7F, 0x6D, 0xD8, 0xAD, 0x9D, 0x3D, 0xEB, 0xA1, 0x77, 0x4F, 0x15, 0xAA, + 0x5F, 0x47, 0x0F, 0x14, 0xCB, 0xBA, 0xEE, 0x51, 0xFD, 0xB7, 0x62, 0x9C, + 0xA3, 0xFB, 0x6E, 0xC5, 0x5A, 0x8B, 0x6C, 0xAE, 0xE5, 0x1F, 0xDB, 0x76, + 0x29, 0xCA, 0x3F, 0xB6, 0xEC, 0x55, 0xA8, 0x82, 0xEE, 0x51, 0xFD, 0xB7, + 0x62, 0x9C, 0xA3, 0xFB, 0x6E, 0xC5, 0x5A, 0x88, 0x2E, 0xE5, 0x1F, 0xDB, + 0x76, 0x29, 0xCA, 0x3F, 0xB6, 0xEC, 0x55, 0xA8, 0x82, 0xEE, 0x51, 0xFD, + 0xB7, 0x62, 0x9C, 0xA3, 0xFB, 0x6E, 0xC5, 0x5A, 0x88, 0x2E, 0xE5, 0x1F, + 0xDB, 0x76, 0x29, 0xCA, 0x3F, 0xB6, 0xEC, 0x55, 0xA8, 0x82, 0xEE, 0x51, + 0xFD, 0xB7, 0x62, 0x9C, 0xA3, 0xFB, 0x6E, 0xC5, 0x5A, 0x88, 0x2E, 0xE5, + 0x1F, 0xDB, 0x76, 0x29, 0xCA, 0x3F, 0xB6, 0xEC, 0x55, 0xA8, 0x82, 0xEE, + 0x51, 0xFD, 0xB7, 0x62, 0x9C, 0xA3, 0xFB, 0x6E, 0xC5, 0x5A, 0x88, 0x2E, + 0xE5, 0x1F, 0xDB, 0x76, 0x29, 0xCA, 0x3F, 0xB6, 0xEC, 0x55, 0xA8, 0x82, + 0xEE, 0x51, 0xFD, 0xB7, 0x62, 0x9C, 0xA3, 0xFB, 0x6E, 0xC5, 0x5A, 0x88, + 0x2E, 0xE5, 0x1F, 0xDB, 0x76, 0x29, 0xCA, 0x3F, 0xB6, 0xEC, 0x55, 0xA8, + 0x82, 0xEE, 0x51, 0xFD, 0xB7, 0x62, 0x9C, 0xA3, 0xFB, 0x6E, 0xC5, 0x5A, + 0x88, 0x2E, 0xE5, 0x1F, 0xDB, 0x76, 0x29, 0xCA, 0x3F, 0xB6, 0xEC, 0x55, + 0xA8, 0x82, 0xEE, 0x51, 0xFD, 0xB7, 0x62, 0x9C, 0xA3, 0xFB, 0x6E, 0xC5, + 0x5A, 0x88, 0x2E, 0xE5, 0x1F, 0xDB, 0x76, 0x29, 0xCA, 0x3F, 0xB6, 0xEC, + 0x55, 0xA8, 0x82, 0xEE, 0x51, 0xFD, 0xB7, 0x62, 0x9C, 0xA3, 0xFB, 0x6E, + 0xC5, 0x5A, 0x88, 0x2E, 0xE5, 0x1F, 0xDB, 0x76, 0x29, 0xCA, 0x3F, 0xB6, + 0xEC, 0x55, 0xA8, 0x82, 0xF1, 0x11, 0xF5, 0x8F, 0xC6, 0xEC, 0x57, 0x4F, + 0x35, 0xD4, 0xA3, 0x78, 0x6E, 0xE0, 0xB9, 0x61, 0xD2, 0x17, 0x53, 0x35, + 0xD4, 0xA3, 0x78, 0x6E, 0xE0, 0xB8, 0xFF, 0x00, 0x5E, 0xCE, 0xFF, 0x00, + 0xC7, 0xC9, 0x59, 0x5E, 0xA5, 0x07, 0xC3, 0x6F, 0x05, 0xCD, 0x1E, 0x92, + 0xBA, 0x59, 0x5E, 0xA5, 0x07, 0xC3, 0x6F, 0x05, 0xCD, 0x1E, 0x92, 0xBC, + 0x7F, 0xD3, 0xB4, 0x1F, 0xDB, 0xC9, 0x44, 0x44, 0x5C, 0x9C, 0x44, 0x44, + 0x40, 0x44, 0x44, 0x05, 0x34, 0x03, 0x66, 0x14, 0x67, 0x00, 0x09, 0x00, + 0x55, 0x58, 0x07, 0xDE, 0x14, 0x2A, 0xE6, 0x3D, 0xEC, 0xAE, 0xC3, 0x8B, + 0x6B, 0xD0, 0x6A, 0x56, 0x06, 0x40, 0x86, 0xD8, 0xAD, 0x63, 0xDE, 0x03, + 0x4D, 0x92, 0x4D, 0x59, 0xAB, 0x03, 0xA3, 0xFF, 0x00, 0xDF, 0xB2, 0xA1, + 0x97, 0x6B, 0xB3, 0x43, 0x71, 0x2E, 0x20, 0x10, 0x2B, 0xAF, 0x35, 0x75, + 0x1F, 0xA2, 0x87, 0x94, 0x7D, 0xBB, 0x76, 0xDD, 0x6B, 0x4D, 0x79, 0xD5, + 0x0C, 0x47, 0x97, 0x5A, 0xB6, 0xEB, 0x44, 0x55, 0x5D, 0x6A, 0xDC, 0x2D, + 0xC2, 0x7E, 0x49, 0x85, 0x96, 0x81, 0x25, 0x8D, 0xB4, 0x7D, 0xD5, 0x9C, + 0xE0, 0x7D, 0x51, 0xB0, 0x61, 0x96, 0x97, 0x9B, 0x41, 0xB9, 0x80, 0x04, + 0x80, 0x71, 0x50, 0x35, 0xEF, 0x6D, 0x56, 0x5C, 0x45, 0x5D, 0x19, 0xD5, + 0x44, 0x68, 0x81, 0xC5, 0xC1, 0xEE, 0xAC, 0xF4, 0x9A, 0xD2, 0xE0, 0xB8, + 0x49, 0x0E, 0x13, 0x79, 0xDF, 0x26, 0x7F, 0x10, 0x04, 0xD5, 0xFB, 0xE8, + 0x46, 0x5B, 0x8F, 0xF8, 0x4B, 0x5B, 0x55, 0xA0, 0x2D, 0x06, 0x81, 0x66, + 0xB3, 0x52, 0x86, 0xB3, 0x5D, 0x75, 0x9A, 0xF4, 0xAB, 0x9D, 0x16, 0x23, + 0xC5, 0x4E, 0x7B, 0x88, 0xE9, 0xCE, 0x52, 0xCB, 0x4C, 0xD8, 0x30, 0xDE, + 0x73, 0x5B, 0x68, 0x0E, 0xB2, 0x6B, 0xCF, 0xEE, 0x3F, 0xFC, 0x46, 0x43, + 0x84, 0x5B, 0x6E, 0xCB, 0x88, 0x2D, 0x76, 0x62, 0x7A, 0x08, 0xFE, 0x94, + 0x2E, 0x8B, 0x11, 0xC4, 0x12, 0xF7, 0x12, 0x3A, 0x33, 0xAA, 0x35, 0xEE, + 0x6D, 0x56, 0x5C, 0x45, 0x49, 0x70, 0x5A, 0x63, 0x06, 0x1B, 0x6B, 0xFC, + 0xE6, 0xCB, 0x03, 0x8E, 0x7E, 0x9A, 0xEA, 0xFF, 0x00, 0xEA, 0x96, 0x14, + 0x26, 0x07, 0x37, 0x35, 0x61, 0xCF, 0x86, 0x45, 0xAE, 0x9A, 0x8D, 0x79, + 0x96, 0x20, 0x88, 0xF0, 0xEB, 0x41, 0xC4, 0x1A, 0xAA, 0xAE, 0xB5, 0x5E, + 0x51, 0xF5, 0xD7, 0x6D, 0xD5, 0x93, 0x5D, 0x75, 0xFB, 0xD2, 0xE0, 0xB8, + 0x4C, 0x20, 0x33, 0x93, 0x15, 0xBB, 0xF1, 0x16, 0x5A, 0xE9, 0xFA, 0x28, + 0xA3, 0x31, 0xB0, 0xDC, 0x1A, 0xDA, 0xC9, 0xA8, 0x12, 0x4F, 0xEE, 0x15, + 0x04, 0x47, 0x86, 0x58, 0x0F, 0x36, 0x74, 0x56, 0xAD, 0x24, 0x93, 0x59, + 0x24, 0x9F, 0xDD, 0x49, 0x98, 0x46, 0x5F, 0xE6, 0x99, 0x10, 0x8B, 0x5B, + 0x60, 0xB4, 0x57, 0xF8, 0x46, 0x6C, 0xDD, 0x35, 0xA8, 0xC4, 0x36, 0x00, + 0x2A, 0xAE, 0xD1, 0x86, 0x5C, 0x7A, 0x2A, 0xE8, 0x2A, 0x23, 0x1A, 0x21, + 0x6D, 0x93, 0x11, 0xC5, 0xBA, 0x2B, 0x54, 0xB4, 0xEE, 0xD1, 0xE8, 0xAB, + 0xA7, 0xDC, 0xAD, 0xAD, 0xB2, 0x04, 0xB3, 0x4B, 0x87, 0xE2, 0x21, 0xAE, + 0x22, 0xC1, 0xD2, 0x2A, 0xAC, 0xAA, 0x72, 0x10, 0x8D, 0x4E, 0x0E, 0x35, + 0x54, 0xE2, 0x40, 0x35, 0xF4, 0x7E, 0xEA, 0x0B, 0x6E, 0xFC, 0x3F, 0x88, + 0xFE, 0x1E, 0x8C, 0xFD, 0x0A, 0xAE, 0x8A, 0xF7, 0x1A, 0xDC, 0xF2, 0x73, + 0x55, 0xD2, 0x97, 0x05, 0xC2, 0xE8, 0x40, 0x17, 0xB8, 0xD5, 0x99, 0xAD, + 0x24, 0x03, 0x9F, 0xF8, 0x52, 0xDA, 0x2D, 0x10, 0x1A, 0xD6, 0x35, 0xD6, + 0x9B, 0x9C, 0x16, 0x83, 0x5E, 0x72, 0xB1, 0xD8, 0xE2, 0xC7, 0x56, 0x33, + 0xFB, 0x88, 0xD2, 0x15, 0x44, 0x68, 0x81, 0xB6, 0x44, 0x47, 0x06, 0xE8, + 0x05, 0x22, 0x48, 0x94, 0xF1, 0x40, 0x82, 0xDA, 0xE1, 0x00, 0x41, 0x7B, + 0x85, 0xA2, 0x01, 0xE8, 0xE8, 0x08, 0x49, 0x64, 0x28, 0x8E, 0xB0, 0xD6, + 0xB8, 0xB9, 0xB9, 0xAA, 0x06, 0xAA, 0xC1, 0x50, 0x32, 0x23, 0xE1, 0xD7, + 0x61, 0xC5, 0xB5, 0xE8, 0x28, 0x22, 0xC4, 0x69, 0x25, 0xB1, 0x1C, 0x09, + 0xCE, 0x6A, 0x3D, 0x29, 0x65, 0xA7, 0x73, 0x43, 0x88, 0xAD, 0xA1, 0xA5, + 0xF0, 0x8B, 0x88, 0x02, 0xAA, 0x88, 0xAC, 0xFD, 0x3C, 0xD6, 0x2A, 0xBC, + 0x44, 0x77, 0xE2, 0x24, 0x92, 0xE7, 0x0A, 0x89, 0x3D, 0x2A, 0xC5, 0x25, + 0x24, 0x44, 0x45, 0x01, 0x11, 0x10, 0x11, 0x11, 0x01, 0x6C, 0xE8, 0x4F, + 0x5B, 0x17, 0xBA, 0x16, 0xB1, 0x6C, 0xE8, 0x4F, 0x5B, 0x17, 0xBA, 0x16, + 0xF0, 0xF2, 0x5C, 0x7B, 0xAC, 0xA7, 0xBD, 0x74, 0x2E, 0xE9, 0xE2, 0xB5, + 0x4B, 0x6B, 0x4F, 0x7A, 0xE8, 0x5D, 0xD3, 0xC5, 0x6A, 0x97, 0xD2, 0xC3, + 0xC4, 0xCB, 0xB8, 0x88, 0x8B, 0x4C, 0x88, 0x88, 0x80, 0x88, 0x88, 0x0A, + 0x69, 0x40, 0x1D, 0x32, 0xC0, 0xE0, 0x08, 0x27, 0xDE, 0xA1, 0x55, 0x6B, + 0x8B, 0x4D, 0x6D, 0x24, 0x11, 0xEF, 0x09, 0x2A, 0xC9, 0x85, 0x06, 0x1B, + 0xE1, 0xBD, 0xAD, 0x7D, 0xA2, 0x5C, 0xD1, 0x59, 0x6D, 0x55, 0x56, 0x55, + 0x1B, 0x06, 0x13, 0xF3, 0x82, 0xF6, 0xB4, 0x3E, 0xC9, 0xAF, 0x3F, 0xB8, + 0x9D, 0x1F, 0xB2, 0xC7, 0x0E, 0x20, 0x10, 0x09, 0x00, 0xF4, 0xAB, 0xCC, + 0x78, 0xA4, 0x82, 0x62, 0x38, 0x96, 0xF4, 0x1A, 0xFA, 0x16, 0x6A, 0x4B, + 0x84, 0xC6, 0x14, 0x36, 0xB2, 0x29, 0xB2, 0x48, 0xE4, 0xC1, 0x69, 0xB4, + 0x0F, 0xFD, 0xC0, 0x74, 0x85, 0x64, 0x2F, 0xC1, 0x2E, 0xF8, 0x8D, 0x00, + 0xBC, 0x38, 0x0A, 0xC8, 0xAE, 0xA1, 0x9D, 0x46, 0x63, 0x44, 0x24, 0x92, + 0xF7, 0x1A, 0xC5, 0x47, 0x3F, 0xBB, 0x42, 0xA3, 0x22, 0x3E, 0x19, 0xAD, + 0x8E, 0x2D, 0x3F, 0xB1, 0x56, 0x8B, 0x4E, 0x59, 0x6D, 0xA6, 0x2C, 0x56, + 0x59, 0x01, 0xA0, 0xD4, 0xCA, 0x85, 0xAC, 0xF5, 0x57, 0xFB, 0x23, 0xA0, + 0xC2, 0x86, 0xD7, 0x3D, 0xD6, 0xC8, 0xFC, 0x35, 0x00, 0x40, 0x39, 0xC1, + 0x2A, 0x1E, 0x5A, 0x25, 0xB2, 0xFB, 0x6E, 0xB4, 0x73, 0x57, 0x5A, 0xA3, + 0x9E, 0xE7, 0x57, 0x69, 0xC4, 0xD6, 0x6B, 0x35, 0x9E, 0x92, 0x95, 0x25, + 0xB2, 0x8C, 0xBC, 0x20, 0x44, 0x33, 0x6A, 0xB1, 0x11, 0xED, 0x2E, 0xFD, + 0x80, 0x0A, 0xC6, 0x41, 0x84, 0xF3, 0x0C, 0x7E, 0x30, 0x62, 0xD7, 0x64, + 0xD6, 0x3F, 0x0E, 0x7A, 0xB3, 0xE6, 0xCE, 0xA1, 0xE5, 0x62, 0x67, 0xFC, + 0x6E, 0xCE, 0x6B, 0xE9, 0xF7, 0xA3, 0x62, 0xC4, 0x6B, 0x4B, 0x5A, 0xF7, + 0x06, 0x9F, 0x70, 0x2A, 0x54, 0xAD, 0xC3, 0x29, 0xB0, 0x5B, 0x11, 0x8D, + 0x68, 0x00, 0x17, 0x08, 0x62, 0xBA, 0xB4, 0xD6, 0xAD, 0x12, 0xF0, 0x9C, + 0x5B, 0x53, 0x88, 0x1F, 0x8A, 0xB1, 0x58, 0x3D, 0x02, 0xB5, 0x8D, 0x6D, + 0xF5, 0x55, 0x68, 0xD5, 0x9B, 0xDF, 0xA1, 0x55, 0xD1, 0xA2, 0x38, 0x82, + 0xE7, 0xB8, 0x91, 0x5F, 0xBD, 0x2A, 0x4B, 0x84, 0x92, 0xD6, 0x4C, 0xC6, + 0x66, 0xFE, 0x1B, 0x2E, 0x20, 0x3B, 0x3F, 0xB8, 0xA9, 0x21, 0x34, 0x4C, + 0xB1, 0xBC, 0xA0, 0x0D, 0x26, 0x23, 0x5A, 0x1C, 0xD6, 0x81, 0x5D, 0x75, + 0xD6, 0xB1, 0x5A, 0xE7, 0x31, 0xC1, 0xCC, 0x71, 0x69, 0x1E, 0xF0, 0x55, + 0xCE, 0x8D, 0x11, 0xCE, 0x6B, 0x9D, 0x11, 0xC4, 0xB7, 0xA0, 0x93, 0xD0, + 0xAC, 0xC2, 0x44, 0xA6, 0x6C, 0x26, 0x44, 0x63, 0x43, 0x4B, 0x85, 0xA7, + 0x38, 0x36, 0xBA, 0xBA, 0x6A, 0x15, 0x62, 0xAA, 0x25, 0xA1, 0x86, 0x92, + 0xF7, 0x1A, 0xDB, 0x50, 0x22, 0xD0, 0x19, 0xCE, 0x75, 0x8C, 0x1C, 0xE0, + 0x00, 0x0E, 0x22, 0xA3, 0x58, 0xCF, 0xD0, 0x55, 0xCD, 0x8B, 0x11, 0xAE, + 0x2E, 0x6B, 0xDC, 0x0B, 0xBA, 0x4D, 0x7D, 0x29, 0x52, 0x5C, 0x25, 0x8B, + 0x06, 0x1C, 0x28, 0x64, 0xD6, 0xE7, 0x1B, 0x65, 0xA3, 0xDC, 0x33, 0x55, + 0xFF, 0x00, 0xD5, 0x59, 0x76, 0xB7, 0xFE, 0x0A, 0xC0, 0x36, 0xE2, 0xD4, + 0x6B, 0xD0, 0x2A, 0xFF, 0x00, 0xEA, 0xC7, 0x2E, 0x73, 0x85, 0x45, 0xC4, + 0xE7, 0xAF, 0x39, 0xF7, 0xAB, 0x9B, 0x11, 0xCD, 0x65, 0x91, 0xEE, 0x75, + 0xA0, 0x7D, 0xE0, 0xA5, 0x74, 0x2D, 0x3B, 0x61, 0xC2, 0xAA, 0x62, 0xA7, + 0x5A, 0x21, 0xBD, 0x05, 0xB5, 0x55, 0xF8, 0x82, 0xAC, 0x42, 0xE1, 0x30, + 0xF8, 0x2C, 0x86, 0xC2, 0xC1, 0x58, 0x02, 0xA1, 0xD1, 0xA6, 0xBF, 0x35, + 0x8A, 0x1C, 0x45, 0x75, 0x13, 0x9F, 0x31, 0xFD, 0xD5, 0xDC, 0xB4, 0x4B, + 0x16, 0x39, 0x47, 0x59, 0xAA, 0xAA, 0xAB, 0xF7, 0x29, 0x4B, 0x6C, 0xA0, + 0x7F, 0xE6, 0x81, 0x08, 0x31, 0x8E, 0x6B, 0x9A, 0xDA, 0xC5, 0x91, 0x9E, + 0xBE, 0x9C, 0xFD, 0x2A, 0x08, 0x8D, 0x6F, 0x22, 0x1C, 0x3D, 0xCF, 0x2D, + 0xAF, 0x48, 0xF7, 0x2B, 0x79, 0x78, 0xB6, 0x2C, 0xF2, 0x8F, 0xB3, 0x55, + 0x55, 0x5A, 0x35, 0x54, 0xAD, 0x2F, 0x25, 0x8D, 0x6F, 0x40, 0x6D, 0x78, + 0xAB, 0x10, 0x96, 0xB5, 0x11, 0x15, 0x41, 0x11, 0x10, 0x11, 0x11, 0x01, + 0x11, 0x10, 0x54, 0x74, 0x85, 0xD4, 0xCD, 0x75, 0x28, 0xDE, 0x1B, 0xB8, + 0x2E, 0x58, 0x74, 0x85, 0xD4, 0xCD, 0x75, 0x28, 0xDE, 0x1B, 0xB8, 0x2E, + 0x3F, 0xD7, 0xB3, 0xBF, 0xF1, 0xF2, 0x56, 0x57, 0xA9, 0x41, 0xF0, 0xDB, + 0xC1, 0x73, 0x47, 0xA4, 0xAE, 0x96, 0x53, 0xA9, 0xC1, 0xF0, 0xDB, 0xC1, + 0x61, 0x5C, 0xD0, 0xF5, 0xAF, 0xC0, 0x2F, 0x2E, 0x78, 0xCC, 0xC4, 0x52, + 0xFF, 0x00, 0x58, 0x99, 0xCB, 0xA3, 0x4C, 0x8B, 0x73, 0x73, 0x43, 0xD6, + 0xBF, 0x00, 0x97, 0x34, 0x3D, 0x6B, 0xF0, 0x0B, 0x1F, 0x1E, 0x4E, 0x5A, + 0x4B, 0x4C, 0x8B, 0x73, 0x73, 0x43, 0xD6, 0xBF, 0x00, 0x97, 0x34, 0x3D, + 0x6B, 0xF0, 0x09, 0xF1, 0xE4, 0x69, 0x2D, 0x32, 0x2D, 0xCD, 0xCD, 0x0F, + 0x5A, 0xFC, 0x02, 0x5C, 0xD0, 0xF5, 0xAF, 0xC0, 0x27, 0xC7, 0x91, 0xA4, + 0xB4, 0xC8, 0xB7, 0x37, 0x34, 0x3D, 0x6B, 0xF0, 0x09, 0x73, 0x43, 0xD6, + 0xBF, 0x00, 0x9F, 0x1E, 0x46, 0x92, 0xD3, 0x22, 0xDC, 0xDC, 0xD0, 0xF5, + 0xAF, 0xC0, 0x25, 0xCD, 0x0F, 0x5A, 0xFC, 0x02, 0x7C, 0x79, 0x1A, 0x4B, + 0x4C, 0x8B, 0x73, 0x73, 0x43, 0xD6, 0xBF, 0x00, 0x97, 0x34, 0x3D, 0x6B, + 0xF0, 0x09, 0xF1, 0xE4, 0x69, 0x2D, 0x32, 0x2D, 0xCD, 0xCD, 0x0F, 0x5A, + 0xFC, 0x02, 0x5C, 0xD0, 0xF5, 0xAF, 0xC0, 0x27, 0xC7, 0x91, 0xA4, 0xB4, + 0xC8, 0xB7, 0x37, 0x34, 0x3D, 0x6B, 0xF0, 0x09, 0x73, 0x43, 0xD6, 0xBF, + 0x00, 0x9F, 0x1E, 0x46, 0x92, 0xD3, 0x22, 0xDC, 0xDC, 0xD0, 0xF5, 0xAF, + 0xC0, 0x25, 0xCD, 0x0F, 0x5A, 0xFC, 0x02, 0x7C, 0x79, 0x1A, 0x4B, 0x4C, + 0x8B, 0x73, 0x73, 0x43, 0xD6, 0xBF, 0x00, 0x97, 0x34, 0x3D, 0x6B, 0xF0, + 0x09, 0xF1, 0xE4, 0x69, 0x2D, 0x32, 0x2D, 0xCD, 0xCD, 0x0F, 0x5A, 0xFC, + 0x02, 0x5C, 0xD0, 0xF5, 0xAF, 0xC0, 0x27, 0xC7, 0x91, 0xA4, 0xB4, 0xC8, + 0xB7, 0x37, 0x34, 0x3D, 0x6B, 0xF0, 0x09, 0x73, 0x43, 0xD6, 0xBF, 0x00, + 0x9F, 0x1E, 0x46, 0x92, 0xD3, 0x22, 0xDC, 0xDC, 0xD0, 0xF5, 0xAF, 0xC0, + 0x25, 0xCD, 0x0F, 0x5A, 0xFC, 0x02, 0x7C, 0x79, 0x1A, 0x4B, 0x4C, 0x8B, + 0x73, 0x73, 0x43, 0xD6, 0xBF, 0x00, 0x97, 0x34, 0x3D, 0x6B, 0xF0, 0x09, + 0xF1, 0xE4, 0x69, 0x2D, 0x32, 0x2D, 0xCD, 0xCD, 0x0F, 0x5A, 0xFC, 0x02, + 0x5C, 0xD0, 0xF5, 0xAF, 0xC0, 0x27, 0xC7, 0x91, 0xA4, 0xB4, 0xC8, 0xB7, + 0x37, 0x34, 0x3D, 0x6B, 0xF0, 0x09, 0x73, 0x43, 0xD6, 0xBF, 0x00, 0x9F, + 0x1E, 0x46, 0x92, 0xD3, 0x22, 0xDC, 0xDC, 0xD0, 0xF5, 0xAF, 0xC0, 0x25, + 0xCD, 0x0F, 0x5A, 0xFC, 0x02, 0x7C, 0x79, 0x1A, 0x4B, 0x4C, 0x8B, 0x73, + 0x73, 0x43, 0xD6, 0xBF, 0x00, 0x97, 0x34, 0x3D, 0x6B, 0xF0, 0x09, 0xF1, + 0xE4, 0x69, 0x2D, 0x32, 0xD9, 0xD0, 0x9E, 0xB6, 0x2F, 0x74, 0x29, 0xAE, + 0x68, 0x7A, 0xD7, 0xE0, 0x16, 0x44, 0x9C, 0x8B, 0x65, 0x1C, 0xE7, 0x35, + 0xE5, 0xD6, 0x85, 0x59, 0xD5, 0xC7, 0x09, 0x89, 0xB5, 0xC7, 0x19, 0x89, + 0x6B, 0xA9, 0xEF, 0x5D, 0x0B, 0xBA, 0x78, 0xAD, 0x52, 0xE9, 0x67, 0x68, + 0xF6, 0x4E, 0x39, 0xAE, 0x73, 0xDC, 0xDB, 0x22, 0xAC, 0xCB, 0x1A, 0xE3, + 0x85, 0xAE, 0x7E, 0x01, 0x7B, 0x71, 0xCE, 0x22, 0x28, 0xCB, 0x19, 0x99, + 0x68, 0xD1, 0x6F, 0x2E, 0x38, 0x5A, 0xE7, 0xE0, 0x12, 0xE3, 0x85, 0xAE, + 0x7E, 0x01, 0x6B, 0x7C, 0x53, 0x49, 0x68, 0xD1, 0x6F, 0x2E, 0x38, 0x5A, + 0xE7, 0xE0, 0x12, 0xE3, 0x85, 0xAE, 0x7E, 0x01, 0x37, 0xC4, 0xD2, 0x5A, + 0x34, 0x5B, 0xCB, 0x8E, 0x16, 0xB9, 0xF8, 0x04, 0xB8, 0xE1, 0x6B, 0x9F, + 0x80, 0x4D, 0xF1, 0x34, 0x96, 0x8D, 0x16, 0xF2, 0xE3, 0x85, 0xAE, 0x7E, + 0x01, 0x2E, 0x38, 0x5A, 0xE7, 0xE0, 0x13, 0x7C, 0x4D, 0x25, 0xA3, 0x45, + 0xBC, 0xB8, 0xE1, 0x6B, 0x9F, 0x80, 0x4B, 0x8E, 0x16, 0xB9, 0xF8, 0x04, + 0xDF, 0x13, 0x49, 0x68, 0xD1, 0x6F, 0x2E, 0x38, 0x5A, 0xE7, 0xE0, 0x12, + 0xE3, 0x85, 0xAE, 0x7E, 0x01, 0x37, 0xC4, 0xD2, 0x5A, 0x34, 0x5B, 0xCB, + 0x8E, 0x16, 0xB9, 0xF8, 0x04, 0xB8, 0xE1, 0x6B, 0x9F, 0x80, 0x4D, 0xF1, + 0x34, 0x96, 0x8D, 0x16, 0xF2, 0xE3, 0x85, 0xAE, 0x7E, 0x01, 0x2E, 0x38, + 0x5A, 0xE7, 0xE0, 0x13, 0x7C, 0x4D, 0x25, 0xA3, 0x45, 0xBC, 0xB8, 0xE1, + 0x6B, 0x9F, 0x80, 0x4B, 0x8E, 0x16, 0xB9, 0xF8, 0x04, 0xDF, 0x13, 0x49, + 0x68, 0xD1, 0x6F, 0x2E, 0x38, 0x5A, 0xE7, 0xE0, 0x12, 0xE3, 0x85, 0xAE, + 0x7E, 0x01, 0x37, 0xC4, 0xD2, 0x5A, 0x34, 0x5B, 0xCB, 0x8E, 0x16, 0xB9, + 0xF8, 0x04, 0xB8, 0xE1, 0x6B, 0x9F, 0x80, 0x4D, 0xF1, 0x34, 0x96, 0x8D, + 0x16, 0xF2, 0xE3, 0x85, 0xAE, 0x7E, 0x01, 0x2E, 0x38, 0x5A, 0xE7, 0xE0, + 0x13, 0x7C, 0x4D, 0x25, 0xA3, 0x45, 0xBC, 0xB8, 0xE1, 0x6B, 0x9F, 0x80, + 0x4B, 0x8E, 0x16, 0xB9, 0xF8, 0x04, 0xDF, 0x13, 0x49, 0x68, 0xD1, 0x6F, + 0x2E, 0x38, 0x5A, 0xE7, 0xE0, 0x12, 0xE3, 0x85, 0xAE, 0x7E, 0x01, 0x37, + 0xC4, 0xD2, 0x5A, 0x34, 0x5B, 0xCB, 0x8E, 0x16, 0xB9, 0xF8, 0x04, 0xB8, + 0xE1, 0x6B, 0x9F, 0x80, 0x4D, 0xF1, 0x34, 0x96, 0x8D, 0x16, 0xF2, 0xE3, + 0x85, 0xAE, 0x7E, 0x01, 0x2E, 0x38, 0x5A, 0xE7, 0xE0, 0x13, 0x7C, 0x4D, + 0x25, 0xA3, 0x45, 0xBC, 0xB8, 0xE1, 0x6B, 0x9F, 0x80, 0x4B, 0x8E, 0x16, + 0xB9, 0xF8, 0x04, 0xDF, 0x13, 0x49, 0x68, 0xD1, 0x6F, 0x2E, 0x38, 0x5A, + 0xE7, 0xE0, 0x12, 0xE3, 0x85, 0xAE, 0x7E, 0x01, 0x37, 0xC4, 0xD2, 0x5A, + 0x41, 0xD2, 0x17, 0x53, 0x35, 0xD4, 0xA3, 0x78, 0x6E, 0xE0, 0xB0, 0x6E, + 0x38, 0x5A, 0xE7, 0xE0, 0x16, 0x7C, 0xDE, 0x69, 0x38, 0xDE, 0x1B, 0xB8, + 0x2E, 0x5F, 0xD3, 0x28, 0x98, 0xE8, 0xEB, 0xFC, 0xA2, 0x63, 0x2E, 0xA4, + 0xAF, 0x53, 0x83, 0xE1, 0xB7, 0x82, 0xD0, 0x1A, 0x4A, 0x6E, 0xBF, 0x5C, + 0x70, 0x0B, 0x7D, 0x2B, 0xD4, 0xA0, 0xF8, 0x6D, 0xE0, 0xB9, 0x73, 0xD2, + 0x53, 0xF9, 0xC7, 0x47, 0x49, 0xF2, 0x96, 0x55, 0xE5, 0x37, 0xAE, 0x38, + 0x04, 0xBC, 0xA6, 0xF5, 0xC7, 0x00, 0xB1, 0x11, 0x75, 0xA8, 0x19, 0x77, + 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, + 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, + 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, + 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, + 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, + 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, + 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, + 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, + 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, + 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, + 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, + 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, + 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, + 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, + 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, + 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, + 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, + 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, 0xE0, 0x12, 0xF2, + 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, 0x94, 0xDE, 0xB8, + 0xE0, 0x12, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0xC4, 0x44, 0xA8, 0x19, 0x77, + 0x94, 0xDE, 0xB8, 0xE0, 0x15, 0xED, 0x9D, 0x9E, 0x75, 0x8B, 0x31, 0x09, + 0xB6, 0x6A, 0x6E, 0x61, 0x9C, 0xAC, 0x15, 0x93, 0x06, 0x6C, 0xC1, 0x6C, + 0x26, 0x81, 0x99, 0x8E, 0x2E, 0x3F, 0xBF, 0x42, 0x93, 0x1F, 0x88, 0xBE, + 0xF1, 0x9C, 0xD6, 0xBB, 0x00, 0xAA, 0xD9, 0xF9, 0xD7, 0x93, 0x66, 0x23, + 0x8D, 0x42, 0xB3, 0x98, 0x23, 0x27, 0x9A, 0xD6, 0x30, 0x58, 0x71, 0xB2, + 0x41, 0xE9, 0xD0, 0x55, 0xAC, 0x9C, 0xAA, 0x11, 0x6B, 0xAD, 0x97, 0x10, + 0xE1, 0xF9, 0xB3, 0x1A, 0xFD, 0xE5, 0x2B, 0xF0, 0x56, 0xF1, 0x9C, 0xD6, + 0xBB, 0x00, 0x97, 0x8C, 0xE6, 0xB5, 0xD8, 0x05, 0x57, 0x4F, 0x07, 0x34, + 0x83, 0x0F, 0x39, 0x03, 0x3D, 0x7F, 0xBF, 0xE2, 0xC5, 0x22, 0xCF, 0x5A, + 0x0E, 0xB0, 0x1C, 0x09, 0x69, 0x68, 0x35, 0xE7, 0xE9, 0xAD, 0x2B, 0xF0, + 0x5B, 0x79, 0x4E, 0x6B, 0x4E, 0x01, 0x2F, 0x29, 0xBD, 0x71, 0xC0, 0x2B, + 0x66, 0x66, 0x44, 0x76, 0x35, 0xA1, 0xA4, 0x54, 0x6B, 0xAB, 0xDC, 0x33, + 0x55, 0x99, 0x63, 0x2B, 0x11, 0x1C, 0x2B, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, + 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, + 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, + 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, + 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, + 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, + 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, + 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, + 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, + 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, + 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, + 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, + 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, + 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, + 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, + 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, + 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, + 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, + 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, + 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, 0x02, 0x5E, 0x53, + 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, 0x03, 0x2E, 0xF2, 0x9B, 0xD7, 0x1C, + 0x02, 0x5E, 0x53, 0x7A, 0xE3, 0x80, 0x58, 0x88, 0x95, 0x03, 0x2C, 0x52, + 0x53, 0x75, 0xFA, 0xE3, 0x80, 0x5B, 0xF9, 0xAE, 0xA7, 0x1B, 0xC3, 0x77, + 0x05, 0xCB, 0x0E, 0x90, 0xBA, 0x89, 0xAE, 0xA5, 0x1B, 0xC3, 0x77, 0x05, + 0xCB, 0xFA, 0x45, 0x41, 0x1E, 0x50, 0x4A, 0xF5, 0x28, 0x3E, 0x1B, 0x78, + 0x2C, 0x38, 0x54, 0x4C, 0xB3, 0xE1, 0x31, 0xEE, 0x31, 0x2B, 0x73, 0x41, + 0x39, 0xD6, 0x64, 0xAF, 0x52, 0x83, 0xE1, 0xB7, 0x82, 0xAC, 0x2E, 0xA8, + 0xCF, 0x0C, 0x70, 0x59, 0xC6, 0x66, 0x21, 0x32, 0xF2, 0x96, 0xB7, 0x99, + 0xD1, 0x9B, 0x50, 0xF8, 0x81, 0x39, 0x9D, 0x19, 0xB5, 0x0F, 0x88, 0x17, + 0x0F, 0x1F, 0xD7, 0xC4, 0xEF, 0x1E, 0x2A, 0xC5, 0xAB, 0x94, 0xB7, 0x77, + 0xCC, 0xE8, 0xCD, 0xA8, 0x7C, 0x40, 0x9C, 0xCE, 0x8C, 0xDA, 0x87, 0xC4, + 0x0B, 0x84, 0x44, 0xDA, 0x52, 0xDD, 0xDF, 0x33, 0xA3, 0x36, 0xA1, 0xF1, + 0x02, 0x73, 0x3A, 0x33, 0x6A, 0x1F, 0x10, 0x2E, 0x11, 0x13, 0x69, 0x2D, + 0xDD, 0xF3, 0x3A, 0x33, 0x6A, 0x1F, 0x10, 0x20, 0x92, 0xA3, 0x0F, 0x44, + 0xC8, 0xF8, 0x81, 0x70, 0x8A, 0x69, 0x4E, 0xB7, 0x07, 0xBE, 0x38, 0xA5, + 0xCA, 0xDB, 0xBB, 0x75, 0x11, 0x28, 0xD6, 0x97, 0x39, 0xCF, 0x00, 0x67, + 0x24, 0xB8, 0x66, 0xF2, 0x50, 0xF3, 0x3A, 0x33, 0x6A, 0x1F, 0x10, 0x2D, + 0x85, 0x21, 0xD4, 0x26, 0x3C, 0x37, 0x70, 0x5E, 0x68, 0xA6, 0xD2, 0x5B, + 0xBB, 0xE6, 0x74, 0x66, 0xD4, 0x3E, 0x20, 0x4E, 0x67, 0x46, 0x6D, 0x43, + 0xE2, 0x05, 0xC2, 0x22, 0xBB, 0x4A, 0x5B, 0xBB, 0xE6, 0x74, 0x66, 0xD4, + 0x3E, 0x20, 0x4E, 0x67, 0x46, 0x6D, 0x43, 0xE2, 0x05, 0xC2, 0x22, 0x6D, + 0x25, 0xBB, 0xBE, 0x67, 0x46, 0x6D, 0x43, 0xE2, 0x04, 0xE6, 0x74, 0x66, + 0xD4, 0x3E, 0x20, 0x5C, 0x22, 0x26, 0xD2, 0x5B, 0xBC, 0x6C, 0x8D, 0x1A, + 0xF7, 0x06, 0xB6, 0x62, 0xD3, 0x8E, 0x60, 0x04, 0x41, 0x9D, 0x48, 0xFA, + 0x26, 0x4E, 0x1B, 0x4B, 0xA2, 0x3D, 0xED, 0x68, 0xE9, 0x25, 0xC0, 0x05, + 0xC7, 0xD0, 0x5E, 0xD9, 0x95, 0xEF, 0x85, 0xD8, 0xFA, 0x43, 0xEC, 0x59, + 0x9E, 0xEF, 0xD5, 0x2E, 0x56, 0xD0, 0xF3, 0x3A, 0x33, 0x6A, 0x1F, 0x10, + 0x27, 0x33, 0xA3, 0x36, 0xA1, 0xF1, 0x02, 0xE1, 0x11, 0x36, 0x94, 0xB7, + 0x77, 0xCC, 0xE8, 0xCD, 0xA8, 0x7C, 0x40, 0x9C, 0xCE, 0x8C, 0xDA, 0x87, + 0xC4, 0x0B, 0x84, 0x44, 0xDA, 0x4B, 0x77, 0x7C, 0xCE, 0x8C, 0xDA, 0x87, + 0xC4, 0x09, 0xCC, 0xE8, 0xCD, 0xA8, 0x7C, 0x40, 0xB8, 0x44, 0x4D, 0xA4, + 0xB7, 0x77, 0xCC, 0xE8, 0xCD, 0xA8, 0x7C, 0x40, 0xAE, 0x87, 0x47, 0xD1, + 0xD1, 0x5C, 0x1B, 0x0E, 0x3D, 0xB7, 0x1F, 0x70, 0x88, 0x09, 0x5C, 0x12, + 0xDD, 0x7A, 0x27, 0xED, 0x96, 0xF7, 0x1C, 0x97, 0x2B, 0x6E, 0x9A, 0x25, + 0x17, 0x25, 0x09, 0xB6, 0xA2, 0xC4, 0x73, 0x07, 0x45, 0x6E, 0x78, 0x0A, + 0x2E, 0x67, 0x46, 0x6D, 0x43, 0xE2, 0x05, 0x1F, 0xA5, 0xDE, 0xC9, 0xFF, + 0x00, 0xD8, 0x17, 0x10, 0x9B, 0x49, 0x6E, 0xEF, 0x99, 0xD1, 0x9B, 0x50, + 0xF8, 0x81, 0x39, 0x9D, 0x19, 0xB5, 0x0F, 0x88, 0x17, 0x08, 0x89, 0xB4, + 0xA5, 0xBB, 0xBE, 0x67, 0x46, 0x6D, 0x43, 0xE2, 0x04, 0xE6, 0x74, 0x66, + 0xD4, 0x3E, 0x20, 0x5C, 0x22, 0x26, 0xD2, 0x5B, 0xBB, 0xE6, 0x74, 0x66, + 0xD4, 0x3E, 0x20, 0x4E, 0x67, 0x46, 0x6D, 0x43, 0xE2, 0x05, 0xC2, 0x22, + 0x6D, 0x25, 0xBB, 0xE8, 0x74, 0x74, 0x84, 0x62, 0x44, 0x28, 0xC5, 0xE4, + 0x67, 0xA9, 0xAF, 0x05, 0x56, 0x2D, 0x19, 0x23, 0x06, 0xAE, 0x56, 0x31, + 0x65, 0x7D, 0x16, 0x9E, 0x05, 0x6B, 0x49, 0xE8, 0x5F, 0x5B, 0x99, 0xF0, + 0xC7, 0x15, 0x93, 0xE9, 0xA7, 0xA9, 0x96, 0xEF, 0x1E, 0x09, 0x72, 0xB6, + 0xCE, 0xE6, 0x74, 0x66, 0xD4, 0x3E, 0x20, 0x4E, 0x67, 0x46, 0x6D, 0x43, + 0xE2, 0x05, 0xC2, 0x22, 0x6D, 0x29, 0x6E, 0xEF, 0x99, 0xD1, 0x9B, 0x50, + 0xF8, 0x81, 0x39, 0x9D, 0x19, 0xB5, 0x0F, 0x88, 0x17, 0x08, 0x89, 0xB4, + 0x96, 0xEE, 0xF9, 0x9D, 0x19, 0xB5, 0x0F, 0x88, 0x13, 0x99, 0xD1, 0x9B, + 0x50, 0xF8, 0x81, 0x70, 0x88, 0x9B, 0x49, 0x6E, 0xEF, 0x99, 0xD1, 0x9B, + 0x50, 0xF8, 0x81, 0x49, 0x0A, 0x8C, 0x91, 0x8D, 0x5F, 0x25, 0x15, 0xCF, + 0xAB, 0xA6, 0xCB, 0xC1, 0xA9, 0x70, 0x0B, 0xAE, 0xF4, 0x2F, 0xAA, 0xCC, + 0xF7, 0xC7, 0x04, 0xB9, 0x5B, 0x6C, 0x22, 0x51, 0xD4, 0x7C, 0x27, 0x59, + 0x8B, 0x1C, 0xB0, 0xF4, 0xD4, 0xE7, 0x80, 0xAC, 0xE6, 0x74, 0x66, 0xD4, + 0x3E, 0x20, 0x5A, 0x6F, 0x4C, 0xBA, 0xEC, 0x0F, 0x0F, 0xEA, 0xB9, 0xD4, + 0xB9, 0x2D, 0xDD, 0xF3, 0x3A, 0x33, 0x6A, 0x1F, 0x10, 0x27, 0x33, 0xA3, + 0x36, 0xA1, 0xF1, 0x02, 0xE1, 0x11, 0x36, 0x94, 0xB7, 0x77, 0xCC, 0xE8, + 0xCD, 0xA8, 0x7C, 0x40, 0x9C, 0xCE, 0x8C, 0xDA, 0x87, 0xC4, 0x0B, 0x84, + 0x44, 0xDA, 0x4B, 0x77, 0x7C, 0xCE, 0x8C, 0xDA, 0x87, 0xC4, 0x09, 0xCC, + 0xE8, 0xCD, 0xA8, 0x7C, 0x40, 0xB8, 0x44, 0x4D, 0xA4, 0xB7, 0xA0, 0x43, + 0xA2, 0xA4, 0xA2, 0xB6, 0xD4, 0x28, 0x8E, 0x7B, 0x7A, 0x2B, 0x6B, 0xC1, + 0x56, 0x3E, 0x42, 0x8E, 0x86, 0xE2, 0xD8, 0x93, 0x16, 0x5C, 0x3A, 0x41, + 0x88, 0x01, 0x51, 0x7A, 0x27, 0xEC, 0x61, 0xE2, 0x39, 0x73, 0xFE, 0x95, + 0x7B, 0x6A, 0x27, 0x75, 0xBC, 0x12, 0xE5, 0x6D, 0xD1, 0xF3, 0x3A, 0x33, + 0x6A, 0x1F, 0x10, 0x27, 0x33, 0xA3, 0x36, 0xA1, 0xF1, 0x02, 0xE1, 0x11, + 0x36, 0x94, 0xB7, 0x77, 0xCC, 0xE8, 0xCD, 0xA8, 0x7C, 0x40, 0x9C, 0xCE, + 0x8C, 0xDA, 0x87, 0xC4, 0x0B, 0x84, 0x44, 0xDA, 0x4B, 0x77, 0x7C, 0xCE, + 0x8C, 0xDA, 0x87, 0xC4, 0x09, 0xCC, 0xE8, 0xCD, 0xA8, 0x7C, 0x40, 0xB8, + 0x44, 0x4D, 0xA4, 0xB7, 0x77, 0xCC, 0xE8, 0xCD, 0xA8, 0x7C, 0x40, 0xA6, + 0x65, 0x13, 0x27, 0x11, 0xA1, 0xCC, 0x7B, 0xDC, 0xD3, 0xD0, 0x43, 0x81, + 0x05, 0x79, 0xF2, 0xF4, 0x3A, 0x07, 0xD8, 0xB2, 0x9D, 0xCF, 0xAA, 0x9B, + 0x4A, 0xDA, 0x07, 0x48, 0xD1, 0xAD, 0x71, 0x6B, 0xA6, 0x40, 0x20, 0xD4, + 0x41, 0x88, 0x33, 0x2A, 0x73, 0x3A, 0x33, 0x6A, 0x1F, 0x10, 0x2E, 0x4A, + 0x9B, 0xF6, 0xC4, 0xDF, 0x88, 0x56, 0x0A, 0xB7, 0x25, 0xBB, 0xBE, 0x67, + 0x46, 0x6D, 0x43, 0xE2, 0x04, 0xE6, 0x74, 0x66, 0xD4, 0x3E, 0x20, 0x5C, + 0x22, 0x26, 0xD2, 0x96, 0xEE, 0xF9, 0x9D, 0x19, 0xB5, 0x0F, 0x88, 0x13, + 0x99, 0xD1, 0x9B, 0x50, 0xF8, 0x81, 0x70, 0x88, 0x9B, 0x49, 0x6E, 0xEF, + 0x99, 0xD1, 0x9B, 0x50, 0xF8, 0x81, 0x39, 0x9D, 0x19, 0xB5, 0x0F, 0x88, + 0x17, 0x08, 0x89, 0xB4, 0x96, 0xF4, 0x21, 0x43, 0xCA, 0xB9, 0xA0, 0xB5, + 0xCF, 0x20, 0x8A, 0xC1, 0x0E, 0x19, 0xFC, 0x92, 0xE6, 0x96, 0xD3, 0x13, + 0x7B, 0xEC, 0xB2, 0xE5, 0x3A, 0xA4, 0x0F, 0x0D, 0xBC, 0x14, 0xCA, 0x6D, + 0x2B, 0x6D, 0x75, 0xCD, 0x2D, 0xA6, 0x26, 0xF7, 0xD9, 0x2E, 0x69, 0x6D, + 0x31, 0x37, 0xBE, 0xCB, 0x62, 0x89, 0xB4, 0x96, 0xD7, 0x5C, 0xD2, 0xDA, + 0x62, 0x6F, 0x7D, 0x92, 0xE6, 0x96, 0xD3, 0x13, 0x7B, 0xEC, 0xB6, 0x28, + 0x9B, 0x49, 0x6D, 0x64, 0x5A, 0x22, 0x59, 0x90, 0x9E, 0xF0, 0x62, 0x56, + 0xD6, 0x92, 0x33, 0xAC, 0xC9, 0xAE, 0xA5, 0x1B, 0xC3, 0x77, 0x05, 0x7C, + 0xC7, 0x57, 0x8B, 0xDC, 0x3C, 0x15, 0x93, 0x5D, 0x4A, 0x37, 0x86, 0xEE, + 0x0A, 0x4C, 0xCC, 0xC2, 0xE3, 0xE5, 0x04, 0xAF, 0x52, 0x83, 0xE1, 0xB7, + 0x82, 0xAC, 0x2E, 0xA8, 0xCF, 0x0C, 0x70, 0x54, 0x95, 0xEA, 0x50, 0x7C, + 0x36, 0xF0, 0x55, 0x85, 0xD5, 0x19, 0xE1, 0x8E, 0x0A, 0x47, 0x63, 0x2F, + 0x29, 0x79, 0xAC, 0x7F, 0x5F, 0x13, 0xBC, 0x78, 0xAB, 0x15, 0xF1, 0xFD, + 0x7C, 0x4E, 0xF1, 0xE2, 0xAC, 0x55, 0x95, 0x5A, 0xD7, 0x3A, 0xBB, 0x2D, + 0x26, 0xAE, 0x9A, 0x82, 0xA5, 0x46, 0xAA, 0xEA, 0xCC, 0xB3, 0xD8, 0xE8, + 0x8F, 0x95, 0x97, 0x6C, 0xAC, 0x76, 0xC2, 0x2C, 0xAE, 0xD8, 0x31, 0x03, + 0x0D, 0xAA, 0xCF, 0xE2, 0xCE, 0x45, 0x79, 0xAA, 0x1F, 0xD2, 0x96, 0x6E, + 0x3C, 0xAB, 0xA1, 0x7E, 0x5E, 0x53, 0xFE, 0x77, 0x9F, 0xC2, 0xEB, 0x3F, + 0xF6, 0xB3, 0x3D, 0x55, 0x74, 0x12, 0x0A, 0x0D, 0x68, 0x63, 0x89, 0x20, + 0x34, 0x92, 0x3A, 0x40, 0x0A, 0xDA, 0x8D, 0x55, 0xD5, 0x99, 0x6D, 0xE6, + 0xA2, 0x72, 0xCE, 0x88, 0x25, 0x23, 0xB1, 0x87, 0x97, 0x73, 0x9D, 0xFF, + 0x00, 0x28, 0x65, 0xA1, 0x9A, 0xC9, 0xAC, 0x91, 0x5F, 0xBD, 0x62, 0xCD, + 0xC4, 0x6B, 0xA5, 0xAC, 0xF2, 0xAD, 0x88, 0xFE, 0x70, 0xF7, 0x12, 0x05, + 0x55, 0xE6, 0x6E, 0x7A, 0xB1, 0x41, 0x84, 0xA6, 0x94, 0xEB, 0x70, 0x7B, + 0xE3, 0x8A, 0x85, 0x4D, 0x29, 0xD6, 0xE0, 0xF7, 0xC7, 0x15, 0x60, 0x7A, + 0x2D, 0x21, 0xD4, 0x26, 0x3C, 0x37, 0x70, 0x5E, 0x68, 0xBD, 0x2E, 0x90, + 0xEA, 0x13, 0x1E, 0x1B, 0xB8, 0x2F, 0x34, 0x50, 0x15, 0xC2, 0x1B, 0xDC, + 0x2B, 0x6B, 0x1C, 0x46, 0x90, 0x15, 0xAB, 0x68, 0xC7, 0x07, 0x48, 0xCB, + 0xB5, 0x8E, 0x04, 0xB5, 0x8E, 0x04, 0x73, 0x96, 0xC3, 0xA8, 0xDA, 0x3E, + 0xE2, 0x83, 0x59, 0x64, 0xD6, 0x05, 0x46, 0xB3, 0xD0, 0x81, 0xAE, 0x2D, + 0x2E, 0x0D, 0x25, 0xA3, 0xA4, 0xD5, 0x99, 0x6D, 0x21, 0x47, 0x96, 0x13, + 0x32, 0x85, 0xC2, 0xB7, 0x36, 0x1B, 0x41, 0x7D, 0xBA, 0x83, 0x4E, 0x7E, + 0x91, 0x52, 0xB4, 0x3D, 0xEE, 0xE4, 0x5D, 0x06, 0x65, 0x90, 0xA0, 0xB6, + 0x10, 0x6B, 0x81, 0x78, 0xFC, 0x26, 0xAF, 0xC5, 0xF8, 0x7D, 0xF5, 0x9A, + 0xFF, 0x00, 0x9A, 0xD0, 0x6B, 0x08, 0x23, 0xA4, 0x22, 0xC9, 0x9B, 0x7B, + 0x5C, 0xD9, 0x7B, 0x2E, 0x06, 0xCC, 0x10, 0x0D, 0x47, 0xA0, 0xD6, 0x56, + 0x32, 0x0D, 0x85, 0x05, 0xED, 0x99, 0x5E, 0xF8, 0x5D, 0x8F, 0xA4, 0x3E, + 0xC5, 0x99, 0xEE, 0xFD, 0x57, 0x1D, 0x41, 0x7B, 0x66, 0x57, 0xBE, 0x17, + 0x63, 0xE9, 0x0F, 0xB1, 0x66, 0x7B, 0xBF, 0x54, 0x1E, 0x7C, 0x88, 0x88, + 0x2B, 0x64, 0xD7, 0x55, 0x46, 0xBE, 0x9A, 0xAA, 0x4B, 0x26, 0xBA, 0xAA, + 0x35, 0x85, 0xB2, 0x31, 0x59, 0xCC, 0x79, 0x1E, 0x55, 0x9C, 0xE4, 0x43, + 0xCE, 0xFA, 0xFA, 0x59, 0xD3, 0xC9, 0xD7, 0xA7, 0xFF, 0x00, 0xF1, 0x5D, + 0x12, 0x3C, 0xB1, 0x99, 0x99, 0x2D, 0x1F, 0x89, 0xD0, 0x5C, 0x03, 0xF9, + 0x4C, 0xC4, 0xD9, 0xD1, 0x52, 0x0D, 0x5D, 0x97, 0x59, 0xB5, 0x64, 0xD9, + 0xD3, 0x56, 0x65, 0x42, 0x08, 0x35, 0x11, 0x52, 0xD9, 0xCC, 0xBD, 0xEE, + 0x7C, 0x68, 0x90, 0xE6, 0x58, 0xD9, 0x67, 0x32, 0xA6, 0x32, 0xD8, 0x39, + 0xBD, 0xCD, 0xB3, 0xD2, 0x30, 0xFD, 0xD6, 0x2C, 0xFB, 0xDA, 0xF9, 0xB7, + 0x39, 0x8E, 0x0E, 0x16, 0x5B, 0x9C, 0x77, 0x42, 0x0C, 0x65, 0xBA, 0xF4, + 0x4F, 0xDB, 0x2D, 0xEE, 0x39, 0x69, 0x56, 0xEB, 0xD1, 0x3F, 0x6C, 0xB7, + 0xB8, 0xE4, 0x1B, 0xDF, 0x4B, 0xBD, 0x93, 0xFF, 0x00, 0xB0, 0x2E, 0x21, + 0x76, 0xFE, 0x97, 0x7B, 0x27, 0xFF, 0x00, 0x60, 0x5C, 0x42, 0x0A, 0xB5, + 0xAE, 0x71, 0xA9, 0xA0, 0x93, 0xA0, 0x04, 0x2D, 0x22, 0xBA, 0xC1, 0x15, + 0x74, 0xE6, 0xE8, 0x59, 0x54, 0x7B, 0xAA, 0x7C, 0x60, 0x1E, 0x18, 0xE7, + 0x42, 0x21, 0xA4, 0xB8, 0x37, 0x3E, 0x6F, 0x79, 0x59, 0x70, 0xA2, 0x43, + 0x7D, 0x89, 0x69, 0xA8, 0xED, 0x25, 0xF0, 0xDC, 0xD8, 0x91, 0x2D, 0x5A, + 0x0D, 0xCE, 0x1C, 0xD1, 0x5F, 0xBF, 0xA0, 0xE2, 0x83, 0x55, 0x64, 0xE7, + 0xCC, 0x73, 0x67, 0x42, 0xD7, 0x34, 0x02, 0xE6, 0x90, 0x0F, 0x45, 0x63, + 0xA5, 0x6E, 0x04, 0xEC, 0xBB, 0xEC, 0xCC, 0xC5, 0x2D, 0xB5, 0x12, 0x23, + 0x61, 0xC4, 0x87, 0xEF, 0xB0, 0x1D, 0x6B, 0xA3, 0x45, 0x56, 0x47, 0xF4, + 0xA0, 0x6F, 0x38, 0x0F, 0xFF, 0x00, 0x96, 0x76, 0x11, 0xB5, 0x15, 0xA5, + 0xB6, 0x9E, 0x1E, 0x09, 0xAF, 0xF3, 0x7E, 0xC0, 0x7E, 0xFF, 0x00, 0xC2, + 0x0D, 0x69, 0x04, 0x74, 0x8A, 0x91, 0x66, 0xD2, 0x0F, 0x71, 0x10, 0x98, + 0x5F, 0xCA, 0x06, 0xD7, 0x53, 0xCC, 0x56, 0xBD, 0xCE, 0xAF, 0x4D, 0x44, + 0xD4, 0x3F, 0x6F, 0xE5, 0x61, 0x20, 0xE9, 0x3D, 0x0B, 0xEB, 0x73, 0x3E, + 0x18, 0xE2, 0xB2, 0x7D, 0x34, 0xF5, 0x32, 0xDD, 0xE3, 0xC1, 0x63, 0x7A, + 0x17, 0xD6, 0xE6, 0x7C, 0x31, 0xC5, 0x64, 0xFA, 0x69, 0xEA, 0x65, 0xBB, + 0xC7, 0x82, 0x0E, 0x49, 0x56, 0xA2, 0x41, 0x20, 0x1A, 0x87, 0x4A, 0xA2, + 0xCF, 0xA3, 0xA2, 0xC3, 0x64, 0x19, 0x88, 0x71, 0x5C, 0x1A, 0xD8, 0xA5, + 0xAC, 0x35, 0xE8, 0xCF, 0x9F, 0xFA, 0x35, 0x1F, 0xE9, 0x06, 0x0D, 0x93, + 0x55, 0x75, 0x1A, 0xBF, 0x84, 0x0D, 0x26, 0xAA, 0x81, 0x35, 0xE6, 0x1F, + 0xBA, 0xDB, 0x98, 0xD0, 0xB9, 0x18, 0x52, 0xED, 0x8A, 0xCF, 0xC0, 0x23, + 0x43, 0x06, 0xD0, 0xAA, 0xB2, 0xD6, 0xE7, 0xAF, 0x41, 0x75, 0x79, 0xD4, + 0x70, 0x1F, 0xC8, 0x42, 0x85, 0x0A, 0xDC, 0x13, 0x10, 0x72, 0x84, 0x8E, + 0x50, 0x55, 0x53, 0x83, 0x45, 0x56, 0x81, 0xA8, 0x1C, 0xC7, 0xDE, 0x83, + 0x5B, 0xC9, 0xBC, 0xB8, 0xB4, 0x31, 0xD6, 0x87, 0x48, 0xAB, 0x3A, 0xB4, + 0x82, 0x0D, 0x44, 0x54, 0x56, 0xE5, 0xAF, 0x60, 0xE5, 0x07, 0x2B, 0x5B, + 0xCC, 0x00, 0xD0, 0xD3, 0x1D, 0xB5, 0x8F, 0xC6, 0x0D, 0x56, 0xFA, 0x3A, + 0x33, 0xAC, 0x1A, 0x49, 0xED, 0x89, 0x1D, 0x84, 0x38, 0x13, 0xC9, 0xB4, + 0x3A, 0xA7, 0x5A, 0xA8, 0x8C, 0xD5, 0x5A, 0xF7, 0xA0, 0xC4, 0x5D, 0x77, + 0xA1, 0x7D, 0x56, 0x67, 0xBE, 0x38, 0x2E, 0x45, 0x75, 0xDE, 0x85, 0xF5, + 0x59, 0x9E, 0xF8, 0xE0, 0x83, 0x0F, 0xD3, 0x2E, 0xBB, 0x03, 0xC3, 0xFA, + 0xAE, 0x75, 0x74, 0x5E, 0x99, 0x75, 0xD8, 0x1E, 0x1F, 0xD5, 0x73, 0xA8, + 0x2E, 0xE4, 0xDF, 0x66, 0xD5, 0x87, 0x59, 0xD3, 0x56, 0x64, 0x2C, 0x70, + 0xAA, 0xB6, 0x91, 0x6B, 0xA3, 0x37, 0x4A, 0xCE, 0x8F, 0x32, 0xCB, 0x30, + 0x18, 0xD7, 0x3A, 0xB1, 0x0D, 0x80, 0xB8, 0x3F, 0xF0, 0x8D, 0x35, 0xB5, + 0x65, 0x72, 0xAD, 0x33, 0x0C, 0x89, 0x16, 0x2B, 0x59, 0xFF, 0x00, 0x50, + 0xC7, 0x10, 0x23, 0x07, 0xB5, 0xD9, 0xF3, 0x90, 0x3A, 0x5B, 0xFD, 0x94, + 0x1A, 0x72, 0xC7, 0x02, 0x01, 0x69, 0x04, 0xF4, 0x02, 0x10, 0xC3, 0x7B, + 0x7F, 0x33, 0x1C, 0x3F, 0x90, 0xB6, 0xB2, 0xB1, 0x79, 0x28, 0xD0, 0xB9, + 0xD4, 0x76, 0x3B, 0xFE, 0xA6, 0x1B, 0x99, 0xFF, 0x00, 0x20, 0x75, 0x90, + 0x0E, 0x73, 0x58, 0x39, 0x87, 0xFF, 0x00, 0xBD, 0xCA, 0x17, 0x46, 0xE4, + 0x23, 0x42, 0x88, 0xEC, 0xEC, 0xAC, 0x87, 0x8E, 0x70, 0xD8, 0x95, 0xB4, + 0x8A, 0x88, 0xA8, 0x74, 0x66, 0xAD, 0x06, 0xBA, 0xA3, 0x55, 0x75, 0x66, + 0x45, 0x97, 0x3C, 0x59, 0x0F, 0x93, 0x96, 0x85, 0x11, 0xB1, 0x19, 0x08, + 0x13, 0x6D, 0xBD, 0x0E, 0x71, 0xCE, 0x4E, 0x15, 0x0F, 0xE9, 0x62, 0x20, + 0xEE, 0x3D, 0x13, 0xF6, 0x30, 0xF1, 0x1C, 0xB9, 0xFF, 0x00, 0x4A, 0xBD, + 0xB5, 0x13, 0xBA, 0xDE, 0x0B, 0xA0, 0xF4, 0x4F, 0xD8, 0xC3, 0xC4, 0x72, + 0xE7, 0xFD, 0x2A, 0xF6, 0xD4, 0x4E, 0xEB, 0x78, 0x20, 0xD3, 0xA0, 0x04, + 0xF4, 0x0A, 0xD1, 0x64, 0xD1, 0xEF, 0x64, 0x39, 0xB6, 0xBA, 0x21, 0x01, + 0xA1, 0xAE, 0xAE, 0xB3, 0x57, 0xFD, 0xA5, 0x06, 0x38, 0x6B, 0x9D, 0xD0, + 0x09, 0xFE, 0x02, 0xA9, 0x63, 0x81, 0x20, 0xB4, 0x82, 0x05, 0x7D, 0x0B, + 0x67, 0x27, 0x31, 0x2E, 0xC6, 0x43, 0xAB, 0xFE, 0x2A, 0xA2, 0x38, 0x90, + 0x62, 0x67, 0xFC, 0x87, 0xF6, 0xCC, 0x92, 0xD4, 0x8B, 0x00, 0x73, 0x5C, + 0x1D, 0x61, 0x90, 0xDC, 0x3F, 0xE4, 0x7D, 0xA7, 0x3A, 0xD3, 0x9B, 0x58, + 0xAE, 0xA1, 0xEE, 0x07, 0x37, 0xF2, 0x83, 0x57, 0x51, 0xAA, 0xBA, 0x8D, + 0x5D, 0x15, 0xAA, 0x2D, 0x8C, 0xD3, 0xA1, 0x43, 0x90, 0x32, 0xB0, 0xA2, + 0xB5, 0xF6, 0x22, 0xB5, 0xD5, 0xB4, 0xFE, 0x62, 0x43, 0xAB, 0x38, 0x59, + 0x0B, 0x5C, 0x80, 0xBD, 0x0E, 0x81, 0xF6, 0x2C, 0xA7, 0x73, 0xEA, 0xBC, + 0xF1, 0x7A, 0x1D, 0x03, 0xEC, 0x59, 0x4E, 0xE7, 0xD5, 0x07, 0x15, 0x4D, + 0xFB, 0x62, 0x6F, 0xC4, 0x2B, 0x05, 0x67, 0x53, 0x7E, 0xD8, 0x9B, 0xF1, + 0x0A, 0xC1, 0x40, 0x57, 0x06, 0x38, 0xB6, 0xD0, 0x69, 0x2D, 0xD3, 0x56, + 0x65, 0x6A, 0xDB, 0xC8, 0xC6, 0x6B, 0x25, 0xE5, 0x4D, 0xA1, 0x5B, 0x22, + 0x38, 0xBB, 0xFE, 0x70, 0xCA, 0x85, 0x63, 0xA4, 0x7B, 0xD0, 0x6A, 0x2A, + 0x22, 0xAA, 0xC7, 0x4A, 0x2C, 0xE9, 0xA8, 0x62, 0x2C, 0xBC, 0xBB, 0xA1, + 0x44, 0x86, 0xE6, 0xC3, 0x86, 0xE0, 0x6B, 0x7B, 0x5A, 0x7F, 0x3B, 0x8F, + 0xE5, 0x26, 0xBE, 0x82, 0x16, 0x0A, 0x02, 0x22, 0x20, 0xF4, 0xD9, 0x4E, + 0xA9, 0x03, 0xC3, 0x6F, 0x05, 0x32, 0x86, 0x53, 0xAA, 0x40, 0xF0, 0xDB, + 0xC1, 0x4C, 0xA4, 0x82, 0x2A, 0x67, 0xA9, 0x55, 0x01, 0x11, 0x10, 0x47, + 0x31, 0xD5, 0xE2, 0xF7, 0x0F, 0x05, 0x64, 0xD7, 0x52, 0x8D, 0xE1, 0xBB, + 0x82, 0xBE, 0x63, 0xAB, 0xC5, 0xEE, 0x1E, 0x0A, 0xC9, 0xAE, 0xA5, 0x1B, + 0xC3, 0x77, 0x04, 0x9E, 0xCD, 0x63, 0xE5, 0x04, 0xAF, 0x52, 0x83, 0xE1, + 0xB7, 0x82, 0xAC, 0x2E, 0xA8, 0xCF, 0x0C, 0x70, 0x54, 0x95, 0xEA, 0x50, + 0x7C, 0x36, 0xF0, 0x55, 0x85, 0xD5, 0x19, 0xE1, 0x8E, 0x09, 0x1D, 0x8C, + 0xBC, 0xA5, 0xE6, 0xB1, 0xFD, 0x7C, 0x4E, 0xF1, 0xE2, 0xAC, 0x57, 0xC7, + 0xF5, 0xF1, 0x3B, 0xC7, 0x8A, 0xB1, 0x56, 0x44, 0x44, 0x40, 0x44, 0x44, + 0x05, 0x34, 0xA7, 0x5B, 0x83, 0xDF, 0x1C, 0x54, 0x2A, 0x69, 0x4E, 0xB7, + 0x07, 0xBE, 0x38, 0xAB, 0x03, 0xD1, 0x69, 0x0E, 0xA1, 0x31, 0xE1, 0xBB, + 0x82, 0xF3, 0x45, 0xE9, 0x74, 0x87, 0x50, 0x98, 0xF0, 0xDD, 0xC1, 0x79, + 0xA2, 0x80, 0x88, 0x88, 0x08, 0x88, 0x80, 0x88, 0x88, 0x36, 0x14, 0x17, + 0xB6, 0x65, 0x7B, 0xE1, 0x76, 0x3E, 0x90, 0xFB, 0x16, 0x67, 0xBB, 0xF5, + 0x5C, 0x75, 0x05, 0xED, 0x99, 0x5E, 0xF8, 0x5D, 0x8F, 0xA4, 0x3E, 0xC5, + 0x99, 0xEE, 0xFD, 0x50, 0x79, 0xF2, 0x22, 0x20, 0x22, 0x22, 0x02, 0x22, + 0x20, 0x2D, 0xD7, 0xA2, 0x7E, 0xD9, 0x6F, 0x71, 0xCB, 0x4A, 0xB7, 0x5E, + 0x89, 0xFB, 0x65, 0xBD, 0xC7, 0x20, 0xDE, 0xFA, 0x5D, 0xEC, 0x9F, 0xFD, + 0x81, 0x71, 0x0B, 0xB7, 0xF4, 0xBB, 0xD9, 0x3F, 0xFB, 0x02, 0xE2, 0x10, + 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x07, 0x49, 0xE8, 0x5F, 0x5B, + 0x99, 0xF0, 0xC7, 0x15, 0x93, 0xE9, 0xA7, 0xA9, 0x96, 0xEF, 0x1E, 0x0B, + 0x1B, 0xD0, 0xBE, 0xB7, 0x33, 0xE1, 0x8E, 0x2B, 0x27, 0xD3, 0x4F, 0x53, + 0x2D, 0xDE, 0x3C, 0x10, 0x72, 0x48, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, + 0x80, 0xBA, 0xEF, 0x42, 0xFA, 0xAC, 0xCF, 0x7C, 0x70, 0x5C, 0x8A, 0xEB, + 0xBD, 0x0B, 0xEA, 0xB3, 0x3D, 0xF1, 0xC1, 0x06, 0x1F, 0xA6, 0x5D, 0x76, + 0x07, 0x87, 0xF5, 0x5C, 0xEA, 0xE8, 0xBD, 0x32, 0xEB, 0xB0, 0x3C, 0x3F, + 0xAA, 0xE7, 0x50, 0x11, 0x11, 0x01, 0x11, 0x10, 0x11, 0x11, 0x07, 0x71, + 0xE8, 0x9F, 0xB1, 0x87, 0x88, 0xE5, 0xCF, 0xFA, 0x55, 0xED, 0xA8, 0x9D, + 0xD6, 0xF0, 0x5D, 0x07, 0xA2, 0x7E, 0xC6, 0x1E, 0x23, 0x97, 0x3F, 0xE9, + 0x57, 0xB6, 0xA2, 0x77, 0x5B, 0xC1, 0x06, 0x9D, 0x11, 0x10, 0x11, 0x11, + 0x01, 0x11, 0x10, 0x17, 0xA1, 0xD0, 0x3E, 0xC5, 0x94, 0xEE, 0x7D, 0x57, + 0x9E, 0x2F, 0x43, 0xA0, 0x7D, 0x8B, 0x29, 0xDC, 0xFA, 0xA0, 0xE2, 0xA9, + 0xBF, 0x6C, 0x4D, 0xF8, 0x85, 0x60, 0xAC, 0xEA, 0x6F, 0xDB, 0x13, 0x7E, + 0x21, 0x58, 0x28, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x83, 0xD3, + 0x65, 0x3A, 0xA4, 0x0F, 0x0D, 0xBC, 0x14, 0xCA, 0x19, 0x4E, 0xA9, 0x03, + 0xC3, 0x6F, 0x05, 0x32, 0x92, 0x08, 0x88, 0x80, 0x88, 0x88, 0x23, 0x98, + 0xEA, 0xF1, 0x7B, 0x87, 0x82, 0xB2, 0x6B, 0xA9, 0x46, 0xF0, 0xDD, 0xC1, + 0x5F, 0x31, 0xD5, 0xE2, 0xF7, 0x0F, 0x05, 0x64, 0xD7, 0x52, 0x8D, 0xE1, + 0xBB, 0x82, 0x4F, 0x66, 0xB1, 0xF2, 0x82, 0x57, 0xA9, 0x41, 0xF0, 0xDB, + 0xC1, 0x5D, 0x00, 0x57, 0x2D, 0x0C, 0x1E, 0xC0, 0xE0, 0xA1, 0x95, 0x98, + 0x80, 0x25, 0x20, 0x83, 0x1A, 0x18, 0x22, 0x1B, 0x6B, 0x05, 0xC3, 0x42, + 0xAD, 0x72, 0x3A, 0x65, 0xFE, 0x55, 0x22, 0x62, 0x9A, 0xCB, 0x19, 0xDA, + 0x7A, 0x21, 0x34, 0x1D, 0x1A, 0x49, 0x26, 0x52, 0x19, 0x27, 0xF9, 0x4B, + 0x8E, 0x8C, 0xD8, 0xE1, 0xF9, 0xA9, 0xED, 0x49, 0x69, 0x97, 0xF9, 0x52, + 0xD4, 0x96, 0x99, 0x7F, 0x95, 0x5B, 0xFD, 0x67, 0x5C, 0xB8, 0x41, 0x71, + 0xD1, 0x9B, 0x1C, 0x3F, 0x34, 0xB8, 0xE8, 0xCD, 0x8E, 0x1F, 0x9A, 0x9E, + 0xD4, 0x96, 0x99, 0x7F, 0x95, 0x2D, 0x49, 0x69, 0x97, 0xF9, 0x52, 0xFF, + 0x00, 0x4D, 0x72, 0xE1, 0x05, 0xC7, 0x46, 0x6C, 0x70, 0xFC, 0xD2, 0xE3, + 0xA3, 0x36, 0x38, 0x7E, 0x6A, 0x7B, 0x52, 0x5A, 0x65, 0xFE, 0x54, 0xB5, + 0x25, 0xA6, 0x5F, 0xE5, 0x4B, 0xFD, 0x35, 0xCB, 0x84, 0x17, 0x1D, 0x19, + 0xB1, 0xC3, 0xF3, 0x46, 0xD0, 0x94, 0x73, 0x5C, 0x1C, 0xD9, 0x46, 0x02, + 0x0D, 0x60, 0x8A, 0xD4, 0xF6, 0xA4, 0xB4, 0xCB, 0xFC, 0xA9, 0x6A, 0x4B, + 0x4C, 0xBF, 0xCA, 0x97, 0xFA, 0x6B, 0x97, 0x09, 0xE2, 0x31, 0xB1, 0x18, + 0xE6, 0x3C, 0x56, 0xD7, 0x0A, 0x88, 0xD2, 0x16, 0x0D, 0xC7, 0x46, 0x6C, + 0x70, 0xFC, 0xD4, 0xF6, 0xA4, 0xB4, 0xCB, 0xFC, 0xA9, 0x6A, 0x4B, 0x4C, + 0xBF, 0xCA, 0x97, 0x06, 0xB9, 0x70, 0x82, 0xE3, 0xA3, 0x36, 0x38, 0x7E, + 0x69, 0x71, 0xD1, 0x9B, 0x1C, 0x3F, 0x35, 0x3D, 0xA9, 0x2D, 0x32, 0xFF, + 0x00, 0x2A, 0x5A, 0x92, 0xD3, 0x2F, 0xF2, 0xA5, 0xFE, 0x9A, 0xE5, 0xC2, + 0x0B, 0x8E, 0x8C, 0xD8, 0xE1, 0xF9, 0xA5, 0xC7, 0x46, 0x6C, 0x70, 0xFC, + 0xD4, 0xF6, 0xA4, 0xB4, 0xCB, 0xFC, 0xA9, 0x6A, 0x4B, 0x4C, 0xBF, 0xCA, + 0x97, 0xFA, 0x6B, 0x97, 0x08, 0x2E, 0x3A, 0x33, 0x63, 0x87, 0xE6, 0x97, + 0x1D, 0x19, 0xB1, 0xC3, 0xF3, 0x53, 0xDA, 0x92, 0xD3, 0x2F, 0xF2, 0xA5, + 0xA9, 0x2D, 0x32, 0xFF, 0x00, 0x2A, 0x5F, 0xE9, 0xAE, 0x5C, 0x22, 0x85, + 0x44, 0x48, 0x40, 0x8A, 0xD8, 0x90, 0xA5, 0x98, 0xC7, 0xB4, 0xD6, 0x08, + 0xAF, 0x32, 0xCA, 0x8F, 0x02, 0x1C, 0xC4, 0x27, 0x42, 0x8C, 0xD0, 0xF6, + 0x3B, 0xA4, 0x1F, 0x7A, 0x8A, 0xD4, 0x96, 0x99, 0x7F, 0x95, 0x2D, 0x49, + 0x69, 0x97, 0xF9, 0x52, 0xE0, 0xD7, 0x2E, 0x10, 0x5C, 0x74, 0x66, 0xC7, + 0x0F, 0xCD, 0x2E, 0x3A, 0x33, 0x63, 0x87, 0xE6, 0xA7, 0xB5, 0x25, 0xA6, + 0x5F, 0xE5, 0x4B, 0x52, 0x5A, 0x65, 0xFE, 0x54, 0xBF, 0xD3, 0x5C, 0xB8, + 0x41, 0x71, 0xD1, 0x9B, 0x1C, 0x3F, 0x34, 0xB8, 0xE8, 0xCD, 0x8E, 0x1F, + 0x9A, 0x9E, 0xD4, 0x96, 0x99, 0x7F, 0x95, 0x2D, 0x49, 0x69, 0x97, 0xF9, + 0x52, 0xFF, 0x00, 0x4D, 0x72, 0xE1, 0x05, 0xC7, 0x46, 0x6C, 0x70, 0xFC, + 0xD2, 0xE3, 0xA3, 0x36, 0x38, 0x7E, 0x6A, 0x7B, 0x52, 0x5A, 0x65, 0xFE, + 0x54, 0xB5, 0x25, 0xA6, 0x5F, 0xE5, 0x4B, 0xFD, 0x35, 0xCB, 0x84, 0x17, + 0x1D, 0x19, 0xB1, 0xC3, 0xF3, 0x52, 0x4B, 0xD1, 0x72, 0x52, 0xB1, 0x44, + 0x59, 0x79, 0x76, 0x43, 0x78, 0x15, 0x56, 0x2B, 0x57, 0xDA, 0x92, 0xD3, + 0x2F, 0xF2, 0xA5, 0xA9, 0x2D, 0x32, 0xFF, 0x00, 0x2A, 0x5F, 0xE9, 0xAE, + 0x5C, 0x2F, 0x99, 0x95, 0x83, 0x37, 0x0F, 0x93, 0x98, 0x86, 0x22, 0x32, + 0xBA, 0xEA, 0x3A, 0x56, 0x2D, 0xC7, 0x46, 0x6C, 0x70, 0xFC, 0xD4, 0xF6, + 0xA4, 0xB4, 0xCB, 0xFC, 0xA9, 0x6A, 0x4B, 0x4C, 0xBF, 0xCA, 0x97, 0x1C, + 0x9A, 0xE5, 0xC2, 0x0B, 0x8E, 0x8C, 0xD8, 0xE1, 0xF9, 0xA5, 0xC7, 0x46, + 0x6C, 0x70, 0xFC, 0xD4, 0xF6, 0xA4, 0xB4, 0xCB, 0xFC, 0xA9, 0x6A, 0x4B, + 0x4C, 0xBF, 0xCA, 0x97, 0xFA, 0x6B, 0x97, 0x08, 0x2E, 0x3A, 0x33, 0x63, + 0x87, 0xE6, 0x97, 0x1D, 0x19, 0xB1, 0xC3, 0xF3, 0x53, 0xDA, 0x92, 0xD3, + 0x2F, 0xF2, 0xA5, 0xA9, 0x2D, 0x32, 0xFF, 0x00, 0x2A, 0x5F, 0xE9, 0xAE, + 0x5C, 0x20, 0xB8, 0xE8, 0xCD, 0x8E, 0x1F, 0x9A, 0x5C, 0x74, 0x66, 0xC7, + 0x0F, 0xCD, 0x4F, 0x6A, 0x4B, 0x4C, 0xBF, 0xCA, 0x96, 0xA4, 0xB4, 0xCB, + 0xFC, 0xA9, 0x7F, 0xA6, 0xB9, 0x70, 0xA4, 0xAD, 0x1F, 0x29, 0x26, 0xF7, + 0x3A, 0x5A, 0x03, 0x61, 0xB9, 0xC2, 0xA2, 0x47, 0xBD, 0x5D, 0x35, 0x23, + 0x2D, 0x38, 0x1A, 0x26, 0x61, 0x36, 0x20, 0x6F, 0x45, 0x7E, 0xE5, 0x4B, + 0x52, 0x5A, 0x65, 0xFE, 0x54, 0xB5, 0x25, 0xA6, 0x5F, 0xE5, 0x4B, 0x83, + 0x5C, 0xB8, 0x41, 0x71, 0xD1, 0x9B, 0x1C, 0x3F, 0x34, 0xB8, 0xE8, 0xCD, + 0x8E, 0x1F, 0x9A, 0x9E, 0xD4, 0x96, 0x99, 0x7F, 0x95, 0x2D, 0x49, 0x69, + 0x97, 0xF9, 0x52, 0xFF, 0x00, 0x4D, 0x72, 0xE1, 0x05, 0xC7, 0x46, 0x6C, + 0x70, 0xFC, 0xD2, 0xE3, 0xA3, 0x36, 0x38, 0x7E, 0x6A, 0x7B, 0x52, 0x5A, + 0x65, 0xFE, 0x54, 0xB5, 0x25, 0xA6, 0x5F, 0xE5, 0x4B, 0xFD, 0x35, 0xCB, + 0x84, 0x17, 0x1D, 0x19, 0xB1, 0xC3, 0xF3, 0x4B, 0x8E, 0x8C, 0xD8, 0xE1, + 0xF9, 0xA9, 0xED, 0x49, 0x69, 0x97, 0xF9, 0x52, 0xD4, 0x96, 0x99, 0x7F, + 0x95, 0x2F, 0xF4, 0xD7, 0x2E, 0x10, 0x5C, 0x74, 0x66, 0xC7, 0x0F, 0xCD, + 0x64, 0x4A, 0xC9, 0x4B, 0xC9, 0x87, 0x09, 0x68, 0x4D, 0x86, 0x1D, 0x9C, + 0x81, 0xEF, 0x54, 0xB5, 0x25, 0xA6, 0x5F, 0xE5, 0x4B, 0x52, 0x5A, 0x65, + 0xFE, 0x54, 0xB8, 0xE4, 0xD7, 0x2E, 0x14, 0x9A, 0xA3, 0xA5, 0x27, 0x1E, + 0x1F, 0x33, 0x01, 0xB1, 0x1C, 0x05, 0x40, 0x9A, 0xF3, 0x05, 0x0D, 0xC7, + 0x46, 0x6C, 0x70, 0xFC, 0xD4, 0xF6, 0xA4, 0xB4, 0xCB, 0xFC, 0xA9, 0x6A, + 0x4B, 0x4C, 0xBF, 0xCA, 0x97, 0x1C, 0x9A, 0xE5, 0xC2, 0x0B, 0x8E, 0x8C, + 0xD8, 0xE1, 0xF9, 0xA5, 0xC7, 0x46, 0x6C, 0x70, 0xFC, 0xD4, 0xF6, 0xA4, + 0xB4, 0xCB, 0xFC, 0xA9, 0x6A, 0x4B, 0x4C, 0xBF, 0xCA, 0x97, 0xFA, 0x6B, + 0x97, 0x08, 0x2E, 0x3A, 0x33, 0x63, 0x87, 0xE6, 0x97, 0x1D, 0x19, 0xB1, + 0xC3, 0xF3, 0x53, 0xDA, 0x92, 0xD3, 0x2F, 0xF2, 0xA5, 0xA9, 0x2D, 0x32, + 0xFF, 0x00, 0x2A, 0x5F, 0xE9, 0xAE, 0x5C, 0x20, 0xB8, 0xE8, 0xCD, 0x8E, + 0x1F, 0x9A, 0x5C, 0x74, 0x66, 0xC7, 0x0F, 0xCD, 0x4F, 0x6A, 0x4B, 0x4C, + 0xBF, 0xCA, 0x96, 0xA4, 0xB4, 0xCB, 0xFC, 0xA9, 0x7F, 0xA6, 0xB9, 0x70, + 0xBE, 0x5A, 0x5A, 0x0C, 0xA4, 0x2E, 0x4E, 0x5E, 0x18, 0x86, 0xCA, 0xEB, + 0xA8, 0x69, 0x50, 0xCC, 0x51, 0x72, 0x53, 0x51, 0x4C, 0x58, 0xF2, 0xEC, + 0x88, 0xF3, 0xD2, 0x4D, 0x6A, 0xFB, 0x52, 0x5A, 0x65, 0xFE, 0x54, 0xB5, + 0x25, 0xA6, 0x5F, 0xE5, 0x4B, 0x83, 0x5C, 0xB8, 0x41, 0x71, 0xD1, 0x9B, + 0x1C, 0x3F, 0x34, 0xB8, 0xE8, 0xCD, 0x8E, 0x1F, 0x9A, 0x9E, 0xD4, 0x96, + 0x99, 0x7F, 0x95, 0x2D, 0x49, 0x69, 0x97, 0xF9, 0x52, 0xFF, 0x00, 0x4D, + 0x72, 0xE1, 0x05, 0xC7, 0x46, 0x6C, 0x70, 0xFC, 0xD2, 0xE3, 0xA3, 0x36, + 0x38, 0x7E, 0x6A, 0x7B, 0x52, 0x5A, 0x65, 0xFE, 0x54, 0xB5, 0x25, 0xA6, + 0x5F, 0xE5, 0x4B, 0xFD, 0x35, 0xCB, 0x84, 0x17, 0x1D, 0x19, 0xB1, 0xC3, + 0xF3, 0x4B, 0x8E, 0x8C, 0xD8, 0xE1, 0xF9, 0xA9, 0xED, 0x49, 0x69, 0x97, + 0xF9, 0x52, 0xD4, 0x96, 0x99, 0x7F, 0x95, 0x2F, 0xF4, 0xD7, 0x2E, 0x10, + 0x5C, 0x74, 0x66, 0xC7, 0x0F, 0xCD, 0x66, 0x41, 0x83, 0x0E, 0x5E, 0x13, + 0x61, 0x41, 0x68, 0x6B, 0x1B, 0x98, 0x01, 0xEE, 0x51, 0x5A, 0x92, 0xD3, + 0x2F, 0xF2, 0xA5, 0xA9, 0x2D, 0x32, 0xFF, 0x00, 0x2A, 0x5C, 0x1A, 0xE5, + 0xC2, 0x28, 0xB4, 0x3D, 0x1F, 0x1A, 0x23, 0xA2, 0x45, 0x95, 0x63, 0x9E, + 0xE3, 0x59, 0x26, 0xBC, 0xE5, 0x5B, 0x71, 0xD1, 0x9B, 0x1C, 0x3F, 0x35, + 0x3D, 0xA9, 0x2D, 0x32, 0xFF, 0x00, 0x2A, 0x5A, 0x92, 0xD3, 0x2F, 0xF2, + 0xA5, 0xFE, 0x9A, 0xE5, 0xC2, 0x0B, 0x8E, 0x8C, 0xD8, 0xE1, 0xF9, 0xA5, + 0xC7, 0x46, 0x6C, 0x70, 0xFC, 0xD4, 0xF6, 0xA4, 0xB4, 0xCB, 0xFC, 0xA9, + 0x6A, 0x4B, 0x4C, 0xBF, 0xCA, 0x97, 0xFA, 0x6B, 0x97, 0x08, 0x2E, 0x3A, + 0x33, 0x63, 0x87, 0xE6, 0x97, 0x1D, 0x19, 0xB1, 0xC3, 0xF3, 0x53, 0xDA, + 0x92, 0xD3, 0x2F, 0xF2, 0xA5, 0xA9, 0x2D, 0x32, 0xFF, 0x00, 0x2A, 0x5F, + 0xE9, 0xAE, 0x5C, 0x20, 0xB8, 0xE8, 0xCD, 0x8E, 0x1F, 0x9A, 0x5C, 0x74, + 0x66, 0xC7, 0x0F, 0xCD, 0x4F, 0x6A, 0x4B, 0x4C, 0xBF, 0xCA, 0x96, 0xA4, + 0xB4, 0xCB, 0xFC, 0xA9, 0x7F, 0xA6, 0xB9, 0x70, 0x9D, 0x8D, 0x0C, 0x63, + 0x58, 0xD1, 0x53, 0x5A, 0x2A, 0x03, 0xF6, 0x57, 0x2C, 0x6B, 0x52, 0x5A, + 0x65, 0xFE, 0x54, 0xB5, 0x25, 0xA6, 0x5F, 0xE5, 0x4B, 0x83, 0x59, 0xE1, + 0x92, 0x8B, 0x1A, 0xD4, 0x96, 0x99, 0x7F, 0x95, 0x2D, 0x49, 0x69, 0x97, + 0xF9, 0x52, 0xE0, 0xD6, 0x78, 0x64, 0xA2, 0xC6, 0xB5, 0x25, 0xA6, 0x5F, + 0xE5, 0x4B, 0x52, 0x5A, 0x65, 0xFE, 0x54, 0xB8, 0x35, 0x9E, 0x12, 0xCC, + 0x75, 0x78, 0xBD, 0xC3, 0xC1, 0x59, 0x35, 0xD4, 0xA3, 0x78, 0x6E, 0xE0, + 0xAC, 0xAE, 0x47, 0x4C, 0xBF, 0xCA, 0xA9, 0x35, 0x31, 0x00, 0xCA, 0x46, + 0x02, 0x34, 0x32, 0x4C, 0x37, 0x54, 0x03, 0x86, 0x85, 0x26, 0x62, 0x9A, + 0xC7, 0x19, 0xDA, 0x3A, 0x3F, 0xFF, 0xD9 +}; diff --git a/src/lib/CherryUSB/demo/cherryusb_yuyv.h b/src/lib/CherryUSB/demo/cherryusb_yuyv.h new file mode 100644 index 000000000..096b83516 --- /dev/null +++ b/src/lib/CherryUSB/demo/cherryusb_yuyv.h @@ -0,0 +1,514 @@ +const unsigned char cherryusb_yuyv[6144] = { + 0x68, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, + 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, + 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, + 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, + 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC6, 0x63, 0x69, 0x63, 0xC2, + 0x63, 0x69, 0x63, 0xBF, 0x63, 0x69, 0x63, 0xC8, 0x63, 0x6A, 0x64, 0xC4, + 0x64, 0x69, 0x63, 0xC5, 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, + 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, + 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, + 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x63, 0xC7, + 0x63, 0x68, 0x63, 0xC7, 0x63, 0x68, 0x68, 0xC7, 0x68, 0x68, 0x67, 0xC0, + 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, + 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, + 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, + 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, + 0x67, 0x6C, 0x83, 0xB5, 0x61, 0x70, 0x7E, 0xAA, 0x8C, 0x72, 0xD9, 0x9F, + 0x64, 0x70, 0x6A, 0xAF, 0xD2, 0x72, 0x6A, 0xA3, 0xC3, 0x6F, 0x67, 0xB2, + 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, + 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, + 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, + 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, 0x67, 0x68, 0x67, 0xC0, + 0x67, 0x68, 0x68, 0xC0, 0x68, 0x68, 0x67, 0xC4, 0x67, 0x6B, 0x67, 0xC2, + 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, + 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, + 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, + 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6C, 0x67, 0xC4, + 0x67, 0x6D, 0x67, 0xC2, 0x68, 0x6B, 0x67, 0xC0, 0x69, 0x6D, 0x67, 0xBA, + 0x67, 0x6D, 0x67, 0xBD, 0x67, 0x6C, 0x67, 0xC0, 0x67, 0x6B, 0x67, 0xC2, + 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, + 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, + 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, + 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x6B, 0x67, 0xC2, 0x67, 0x68, 0x67, 0xC4, + 0x78, 0x70, 0x76, 0xC0, 0x76, 0x70, 0x76, 0xBF, 0x76, 0x70, 0x76, 0xBF, + 0x76, 0x70, 0x76, 0xBF, 0x76, 0x70, 0x76, 0xBF, 0x76, 0x70, 0x76, 0xBF, + 0x76, 0x70, 0x76, 0xBF, 0x76, 0x70, 0x76, 0xBF, 0x76, 0x70, 0x76, 0xBF, + 0x76, 0x70, 0x76, 0xBF, 0x76, 0x70, 0x76, 0xBF, 0x76, 0x70, 0x76, 0xBF, + 0x76, 0x70, 0x76, 0xBF, 0x76, 0x70, 0x76, 0xBF, 0x76, 0x70, 0x76, 0xBF, + 0x76, 0x6D, 0x76, 0xBB, 0x76, 0x6F, 0x76, 0xBB, 0x76, 0x6F, 0x76, 0xBF, + 0x76, 0x6F, 0x76, 0xBF, 0x76, 0x6F, 0x76, 0xBF, 0x76, 0x6F, 0x76, 0xBF, + 0x76, 0x6F, 0x76, 0xBF, 0x76, 0x6F, 0x76, 0xBF, 0x76, 0x6F, 0x76, 0xBF, + 0x76, 0x6F, 0x76, 0xBF, 0x76, 0x6F, 0x76, 0xBF, 0x76, 0x6F, 0x76, 0xBF, + 0x76, 0x6F, 0x76, 0xBF, 0x76, 0x6F, 0x76, 0xBF, 0x76, 0x6F, 0x76, 0xBF, + 0x76, 0x6F, 0x76, 0xBF, 0x76, 0x6B, 0x78, 0xC0, 0xF7, 0x6D, 0x93, 0x7E, + 0x91, 0x60, 0x91, 0x7A, 0x91, 0x60, 0x91, 0x7A, 0x91, 0x60, 0x91, 0x7A, + 0x91, 0x60, 0x91, 0x7A, 0x91, 0x60, 0x91, 0x7A, 0x91, 0x60, 0x91, 0x7A, + 0x91, 0x60, 0x91, 0x7A, 0x91, 0x60, 0x91, 0x7A, 0x91, 0x60, 0x91, 0x7A, + 0x91, 0x60, 0x91, 0x7A, 0x91, 0x60, 0x91, 0x7A, 0x91, 0x60, 0x91, 0x7A, + 0x91, 0x60, 0x91, 0x7A, 0x91, 0x60, 0x91, 0x7A, 0x91, 0x68, 0x8D, 0x7B, + 0x7F, 0x96, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, + 0x83, 0x9D, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, + 0x83, 0x9D, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, + 0x83, 0x9D, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, + 0x83, 0x9D, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, 0x83, 0x9D, 0x83, 0x7A, + 0x85, 0x91, 0xF6, 0x7F, 0xFC, 0x71, 0x93, 0x77, 0x92, 0x61, 0x92, 0x6B, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x64, 0xCD, 0x6D, 0xBD, 0x6B, 0x96, 0x6E, + 0xA1, 0x6C, 0xCB, 0x6E, 0xCC, 0x66, 0x93, 0x6D, 0x92, 0x61, 0x92, 0x6B, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x68, 0x8E, 0x6D, 0x86, 0x98, 0x85, 0x6D, + 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, + 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, 0x85, 0x99, 0xC7, 0x6B, + 0xCE, 0x94, 0x98, 0x6E, 0xD0, 0x8F, 0xCC, 0x6F, 0x85, 0x9C, 0x85, 0x69, + 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, + 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, 0x86, 0x8F, 0xFA, 0x77, + 0xFD, 0x7D, 0xF5, 0x7B, 0xF6, 0x79, 0xF6, 0x7C, 0xF6, 0x79, 0xF6, 0x7C, + 0xF6, 0x79, 0xF6, 0x7C, 0xF6, 0x79, 0xF6, 0x7C, 0xF6, 0x79, 0xF6, 0x7C, + 0xF6, 0x79, 0xF6, 0x7C, 0xF7, 0x7C, 0xF4, 0x7B, 0xF6, 0x7D, 0xF7, 0x7B, + 0xF7, 0x7A, 0xF6, 0x7C, 0xF6, 0x79, 0xF6, 0x7C, 0xF6, 0x79, 0xF6, 0x7C, + 0xF6, 0x79, 0xF6, 0x7C, 0xF6, 0x79, 0xF6, 0x7C, 0xF6, 0x79, 0xF6, 0x7C, + 0xF4, 0x7A, 0xE2, 0x7B, 0xDF, 0x85, 0xF5, 0x7B, 0xF4, 0x86, 0xF4, 0x7B, + 0xF4, 0x86, 0xF4, 0x7B, 0xF4, 0x86, 0xF4, 0x7B, 0xF4, 0x86, 0xF4, 0x7B, + 0xF4, 0x86, 0xF4, 0x7B, 0xF4, 0x86, 0xF5, 0x7B, 0xF5, 0x85, 0xF6, 0x7B, + 0xF4, 0x85, 0xF5, 0x7B, 0xF5, 0x86, 0xF4, 0x7A, 0xF4, 0x86, 0xF4, 0x7B, + 0xF4, 0x86, 0xF4, 0x7B, 0xF4, 0x86, 0xF4, 0x7B, 0xF4, 0x86, 0xF4, 0x7B, + 0xF4, 0x86, 0xF4, 0x7B, 0xF6, 0x81, 0xFC, 0x7B, 0xFC, 0x7F, 0xF3, 0x7C, + 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, + 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, + 0x30, 0x80, 0x30, 0x7D, 0xEF, 0x81, 0x30, 0x7E, 0x30, 0x82, 0x30, 0x7D, + 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, + 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x30, 0x7D, 0xE8, 0x7D, + 0xE7, 0x82, 0x2D, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x7D, 0x30, 0x82, 0xEF, 0x7E, 0x33, 0x83, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, + 0xEF, 0x80, 0xFD, 0x7C, 0xFC, 0x7E, 0xF2, 0x7C, 0x30, 0x83, 0x30, 0x7F, + 0x30, 0x83, 0x30, 0x80, 0x62, 0x83, 0x39, 0x80, 0x87, 0x83, 0x9A, 0x80, + 0x6D, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x7F, 0x30, 0x7D, + 0xEC, 0x81, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x29, 0x83, 0x94, 0x80, 0x31, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x7E, 0xE8, 0x7D, 0xE7, 0x83, 0x2C, 0x7E, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x40, 0x83, 0x92, 0x80, + 0x22, 0x83, 0x30, 0x80, 0x83, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x82, 0xEF, 0x7E, 0x33, 0x85, 0x30, 0x7E, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x3F, 0x83, 0x8B, 0x80, 0x36, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x7F, 0xEF, 0x80, 0xFD, 0x7C, + 0xFC, 0x7E, 0xF2, 0x7C, 0x30, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, + 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, + 0x31, 0x82, 0x31, 0x7F, 0x30, 0x7F, 0x30, 0x7D, 0xEC, 0x81, 0x30, 0x7D, + 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, + 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, + 0x2F, 0x7E, 0xE8, 0x7E, 0xE7, 0x83, 0x2C, 0x7E, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x82, 0xEF, 0x7E, + 0x33, 0x85, 0x30, 0x7E, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x7F, 0xEF, 0x80, 0xFD, 0x7C, 0xFC, 0x7E, 0xF6, 0x7C, + 0xEF, 0x7F, 0xEF, 0x7E, 0xEF, 0x81, 0xEF, 0x7E, 0xEF, 0x81, 0xEF, 0x7E, + 0xEF, 0x81, 0xEF, 0x7E, 0xEF, 0x81, 0xEF, 0x7E, 0xEF, 0x81, 0xEF, 0x7E, + 0xEF, 0x7E, 0xEE, 0x7E, 0xFA, 0x7E, 0xEF, 0x7E, 0xEF, 0x81, 0xEF, 0x7E, + 0xEF, 0x81, 0xEF, 0x7E, 0xEF, 0x81, 0xEF, 0x7E, 0xEF, 0x81, 0xEF, 0x7E, + 0xEF, 0x81, 0xEF, 0x7E, 0xEF, 0x81, 0xEF, 0x7E, 0xEA, 0x7E, 0xE8, 0x7D, + 0xE7, 0x82, 0xEE, 0x7E, 0xEB, 0x83, 0xEB, 0x7E, 0xEB, 0x83, 0xEB, 0x7E, + 0xEB, 0x83, 0xEB, 0x7E, 0xEB, 0x83, 0xEB, 0x7E, 0xEB, 0x83, 0xEB, 0x7E, + 0xEB, 0x83, 0xEB, 0x7E, 0xEC, 0x82, 0xFD, 0x7E, 0xED, 0x83, 0xEB, 0x7E, + 0xEB, 0x83, 0xEB, 0x7E, 0xEB, 0x83, 0xEB, 0x7E, 0xEB, 0x83, 0xEB, 0x7E, + 0xEB, 0x83, 0xEB, 0x7E, 0xEB, 0x83, 0xEB, 0x7E, 0xEB, 0x83, 0xEB, 0x7E, + 0xFA, 0x81, 0xFD, 0x7C, 0xFC, 0x7E, 0xF2, 0x7C, 0x30, 0x83, 0x30, 0x7F, + 0x30, 0x83, 0x30, 0x80, 0x2B, 0x83, 0x5B, 0x80, 0x37, 0x83, 0x49, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x7F, 0x30, 0x7D, + 0xEC, 0x81, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x29, 0x83, 0x48, 0x80, 0x5D, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x7E, 0xE8, 0x7D, 0xE7, 0x83, 0x2C, 0x7E, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x2B, 0x83, 0x62, 0x80, + 0x64, 0x83, 0x60, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x82, 0xEF, 0x7E, 0x33, 0x85, 0x30, 0x7E, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x2F, 0x83, 0x55, 0x80, 0x33, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x7F, 0xEF, 0x80, 0xFD, 0x7C, + 0xFC, 0x7E, 0xF2, 0x7C, 0x30, 0x83, 0x30, 0x7F, 0x30, 0x83, 0x30, 0x80, + 0x31, 0x83, 0x2F, 0x80, 0x30, 0x83, 0x37, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x7F, 0x30, 0x7D, 0xEC, 0x81, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x35, 0x83, 0x2E, 0x80, + 0x28, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x7E, 0xE8, 0x7D, 0xE7, 0x83, 0x2C, 0x7E, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x2E, 0x80, 0x2A, 0x83, 0x32, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x82, 0xEF, 0x7E, + 0x33, 0x85, 0x30, 0x7E, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x39, 0x83, 0x27, 0x80, 0x2A, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x7F, 0xEF, 0x80, 0xFD, 0x7C, 0xFC, 0x7F, 0xF3, 0x7C, + 0xAC, 0x7D, 0xAC, 0x7D, 0xAC, 0x7C, 0xAC, 0x7D, 0xAC, 0x7C, 0xAC, 0x7D, + 0xAC, 0x7C, 0xAC, 0x7D, 0xAC, 0x7C, 0xAC, 0x7D, 0xAC, 0x7C, 0xAC, 0x7D, + 0xAC, 0x7D, 0xAB, 0x7D, 0xF9, 0x7E, 0xAC, 0x7E, 0xAC, 0x7C, 0xAC, 0x7D, + 0xAC, 0x7C, 0xAC, 0x7D, 0xAC, 0x7C, 0xAC, 0x7D, 0xAC, 0x7C, 0xAC, 0x7D, + 0xAC, 0x7C, 0xAC, 0x7D, 0xAC, 0x7C, 0xAC, 0x7D, 0xAA, 0x7D, 0xE8, 0x7D, + 0xE7, 0x82, 0xC9, 0x7E, 0xCB, 0x83, 0xCB, 0x7E, 0xCB, 0x83, 0xCB, 0x7E, + 0xCB, 0x83, 0xCB, 0x7E, 0xCB, 0x83, 0xCB, 0x7E, 0xCB, 0x83, 0xCB, 0x7E, + 0xCB, 0x83, 0xCB, 0x7E, 0xCC, 0x82, 0xF8, 0x7D, 0xCC, 0x84, 0xCB, 0x7E, + 0xCB, 0x83, 0xCB, 0x7E, 0xCB, 0x83, 0xCB, 0x7E, 0xCB, 0x83, 0xCB, 0x7E, + 0xCB, 0x83, 0xCB, 0x7E, 0xCB, 0x83, 0xCB, 0x7E, 0xCB, 0x83, 0xCB, 0x7E, + 0xF4, 0x81, 0xFD, 0x7C, 0xFC, 0x7E, 0xF2, 0x7C, 0x30, 0x82, 0x31, 0x7F, + 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x35, 0x7F, 0x34, 0x82, 0x2F, 0x7F, + 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, 0x30, 0x7F, 0x30, 0x7D, + 0xEC, 0x81, 0x30, 0x7D, 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, + 0x30, 0x82, 0x33, 0x7F, 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, + 0x31, 0x82, 0x31, 0x7F, 0x2F, 0x7E, 0xE8, 0x7E, 0xE7, 0x83, 0x2C, 0x7E, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x33, 0x80, + 0x31, 0x83, 0x33, 0x7F, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x82, 0xEF, 0x7E, 0x33, 0x85, 0x30, 0x7E, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x2E, 0x83, 0x2D, 0x7F, 0x2F, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x7F, 0xEF, 0x80, 0xFD, 0x7C, + 0xFC, 0x7E, 0xF2, 0x7C, 0x30, 0x83, 0x30, 0x7F, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x33, 0x80, 0xAB, 0x83, 0x35, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x7F, 0x30, 0x7D, 0xEC, 0x81, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x6D, 0x83, 0x4F, 0x80, + 0x31, 0x83, 0x31, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x7E, 0xE8, 0x7D, 0xE7, 0x83, 0x2C, 0x7E, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x33, 0x80, 0x77, 0x83, 0x34, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x82, 0xEF, 0x7E, + 0x33, 0x85, 0x30, 0x7E, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x63, 0x83, 0x9A, 0x80, 0x34, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x7F, 0xEF, 0x80, 0xFD, 0x7C, 0xFC, 0x7F, 0xF3, 0x7C, + 0x30, 0x81, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, + 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, + 0x30, 0x80, 0x30, 0x7D, 0xEB, 0x81, 0x30, 0x7E, 0x30, 0x82, 0x30, 0x7D, + 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, + 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x2F, 0x7E, 0xE8, 0x7E, + 0xE7, 0x82, 0x2D, 0x7D, 0x30, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, + 0x30, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, + 0x30, 0x85, 0x30, 0x7D, 0x30, 0x83, 0xEF, 0x7E, 0x33, 0x87, 0x30, 0x7D, + 0x30, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, + 0x30, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, + 0xEF, 0x80, 0xFD, 0x7C, 0xFC, 0x7F, 0xFC, 0x7C, 0xFC, 0x7E, 0xFC, 0x7E, + 0xFC, 0x7D, 0xFC, 0x7E, 0xFC, 0x7D, 0xFC, 0x7E, 0xFC, 0x7C, 0xFC, 0x7D, + 0xFC, 0x7D, 0xFC, 0x7E, 0xFC, 0x7D, 0xFC, 0x7E, 0xFC, 0x7F, 0xFE, 0x7E, + 0xFD, 0x80, 0xFB, 0x7D, 0xFC, 0x7D, 0xFC, 0x7E, 0xFC, 0x7D, 0xFC, 0x7E, + 0xFC, 0x7C, 0xFC, 0x7D, 0xFC, 0x7C, 0xFC, 0x7E, 0xFC, 0x7D, 0xFC, 0x7E, + 0xFC, 0x7D, 0xFC, 0x7E, 0xF8, 0x7E, 0xE8, 0x7E, 0xE7, 0x81, 0xFD, 0x7E, + 0xFB, 0x80, 0xFB, 0x7E, 0xFB, 0x80, 0xFB, 0x7E, 0xFB, 0x80, 0xFB, 0x7D, + 0xFB, 0x80, 0xFB, 0x7D, 0xFB, 0x80, 0xFB, 0x7E, 0xFB, 0x80, 0xFB, 0x7E, + 0xFB, 0x82, 0xF8, 0x7E, 0xFC, 0x7D, 0xFB, 0x7E, 0xFB, 0x80, 0xFB, 0x7E, + 0xFB, 0x80, 0xFB, 0x7E, 0xFB, 0x80, 0xFB, 0x7D, 0xFB, 0x80, 0xFB, 0x7D, + 0xFB, 0x80, 0xFB, 0x7E, 0xFB, 0x80, 0xFB, 0x7E, 0xFC, 0x81, 0xFD, 0x7C, + 0xFC, 0x7F, 0xF3, 0x7C, 0x30, 0x87, 0x30, 0x7D, 0x30, 0x88, 0x30, 0x7D, + 0x30, 0x88, 0x30, 0x7D, 0x37, 0x86, 0x36, 0x7F, 0x30, 0x88, 0x30, 0x7D, + 0x30, 0x88, 0x30, 0x7D, 0x30, 0x81, 0x30, 0x7D, 0xEB, 0x81, 0x30, 0x7E, + 0x30, 0x88, 0x30, 0x7D, 0x30, 0x88, 0x30, 0x7D, 0x31, 0x86, 0x2E, 0x7E, + 0x2B, 0x86, 0x30, 0x7D, 0x30, 0x88, 0x30, 0x7D, 0x30, 0x88, 0x30, 0x7D, + 0x2F, 0x7E, 0xE8, 0x7E, 0xE7, 0x82, 0x2D, 0x7D, 0x30, 0x85, 0x30, 0x7D, + 0x30, 0x85, 0x30, 0x7D, 0x2D, 0x82, 0x33, 0x7E, 0x32, 0x82, 0x2C, 0x7E, + 0x30, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, 0x30, 0x82, 0xEF, 0x7E, + 0x33, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, 0x30, 0x85, 0x30, 0x7D, + 0x31, 0x82, 0x3B, 0x7E, 0x37, 0x85, 0x30, 0x7F, 0x30, 0x85, 0x30, 0x7D, + 0x30, 0x85, 0x30, 0x7D, 0xEF, 0x80, 0xFD, 0x7C, 0xFC, 0x7E, 0xF2, 0x7C, + 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x35, 0x7D, + 0x2F, 0x83, 0x31, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, + 0x30, 0x84, 0x30, 0x7D, 0xEB, 0x81, 0x30, 0x7E, 0x30, 0x83, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x7D, 0x36, 0x83, 0x34, 0x7D, 0x33, 0x83, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x2F, 0x7E, 0xE8, 0x7E, + 0xE7, 0x82, 0x2D, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, + 0x30, 0x83, 0x2F, 0x7D, 0x36, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x7D, 0x30, 0x82, 0xEF, 0x7E, 0x33, 0x85, 0x30, 0x7D, + 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x2C, 0x83, 0x32, 0x7D, + 0x30, 0x83, 0x30, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x30, 0x84, 0x30, 0x7D, + 0xEF, 0x81, 0xFD, 0x7C, 0xFC, 0x7E, 0xF6, 0x7C, 0x99, 0x7D, 0x99, 0x7D, + 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, + 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x9C, 0x7D, + 0xF4, 0x80, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, + 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, 0x99, 0x7D, + 0x99, 0x7D, 0x99, 0x7D, 0x9B, 0x7E, 0xE8, 0x7E, 0xE7, 0x82, 0xB8, 0x7E, + 0xB6, 0x83, 0xB6, 0x7D, 0xB6, 0x83, 0xB6, 0x7D, 0xB6, 0x83, 0xB6, 0x7D, + 0xB6, 0x83, 0xB6, 0x7D, 0xB6, 0x83, 0xB6, 0x7D, 0xB6, 0x83, 0xB6, 0x7D, + 0xB6, 0x82, 0xF4, 0x7D, 0xB8, 0x85, 0xB6, 0x7D, 0xB6, 0x83, 0xB6, 0x7D, + 0xB6, 0x83, 0xB6, 0x7D, 0xB6, 0x83, 0xB6, 0x7D, 0xB6, 0x83, 0xB6, 0x7D, + 0xB6, 0x83, 0xB6, 0x7D, 0xB6, 0x84, 0xB6, 0x7D, 0xF8, 0x81, 0xFD, 0x7C, + 0xFB, 0x7F, 0xFE, 0x7D, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x7E, 0xE9, 0x80, 0xE7, 0x81, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFD, 0x80, 0xFC, 0x7E, 0xFB, 0x7F, 0xFE, 0x7D, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFD, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x7E, 0xE9, 0x80, + 0xE7, 0x81, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFD, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFD, 0x80, 0xFC, 0x7E, 0xFB, 0x7F, 0xFE, 0x7D, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x7E, 0xE9, 0x80, 0xE7, 0x81, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFD, 0x80, 0xFC, 0x7E, + 0xFC, 0x7E, 0xFA, 0x7C, 0xFC, 0x7F, 0xFD, 0x7E, 0xFD, 0x7E, 0xFD, 0x7D, + 0xFD, 0x7E, 0xFD, 0x7D, 0xFD, 0x7E, 0xFD, 0x7D, 0xFD, 0x7E, 0xFD, 0x7D, + 0xFD, 0x7E, 0xFD, 0x7D, 0xFD, 0x7E, 0xFD, 0x7D, 0xFD, 0x7E, 0xFD, 0x7D, + 0xFD, 0x7E, 0xFD, 0x7D, 0xFD, 0x7E, 0xFD, 0x7D, 0xFD, 0x7E, 0xFD, 0x7D, + 0xFD, 0x7E, 0xFD, 0x7D, 0xFD, 0x7E, 0xFD, 0x7D, 0xFD, 0x7E, 0xFD, 0x7D, + 0xF9, 0x7E, 0xE8, 0x7E, 0xE7, 0x82, 0xF9, 0x7E, 0xFD, 0x81, 0xFD, 0x7D, + 0xFD, 0x81, 0xFD, 0x7D, 0xFD, 0x81, 0xFD, 0x7D, 0xFD, 0x81, 0xFD, 0x7D, + 0xFD, 0x81, 0xFD, 0x7D, 0xFD, 0x81, 0xFD, 0x7D, 0xFD, 0x81, 0xFD, 0x7D, + 0xFD, 0x81, 0xFD, 0x7D, 0xFD, 0x81, 0xFD, 0x7D, 0xFD, 0x81, 0xFD, 0x7D, + 0xFD, 0x81, 0xFD, 0x7D, 0xFD, 0x81, 0xFD, 0x7D, 0xFD, 0x81, 0xFD, 0x7D, + 0xFD, 0x81, 0xFD, 0x7D, 0xF9, 0x80, 0xFD, 0x7C, 0xFC, 0x7F, 0xF3, 0x7C, + 0x30, 0x82, 0x30, 0x7D, 0x30, 0x84, 0x30, 0x7E, 0x30, 0x84, 0x30, 0x7E, + 0x30, 0x84, 0x30, 0x7E, 0x30, 0x84, 0x30, 0x7E, 0x30, 0x84, 0x30, 0x7E, + 0x30, 0x84, 0x30, 0x7E, 0x30, 0x84, 0x30, 0x7E, 0x30, 0x84, 0x30, 0x7E, + 0x30, 0x84, 0x30, 0x7E, 0x30, 0x84, 0x30, 0x7E, 0x30, 0x84, 0x30, 0x7E, + 0x30, 0x84, 0x30, 0x7E, 0x30, 0x84, 0x30, 0x7E, 0x2F, 0x7E, 0xE8, 0x7E, + 0xE7, 0x82, 0x2D, 0x7D, 0x30, 0x7F, 0x30, 0x7E, 0x30, 0x7F, 0x30, 0x7E, + 0x30, 0x7F, 0x30, 0x7E, 0x30, 0x7F, 0x30, 0x7E, 0x30, 0x7F, 0x30, 0x7E, + 0x30, 0x7F, 0x30, 0x7E, 0x30, 0x7F, 0x30, 0x7E, 0x30, 0x7F, 0x30, 0x7E, + 0x30, 0x7F, 0x30, 0x7E, 0x30, 0x7F, 0x30, 0x7E, 0x30, 0x7F, 0x30, 0x7E, + 0x30, 0x7F, 0x30, 0x7E, 0x30, 0x7F, 0x30, 0x7E, 0x30, 0x7F, 0x30, 0x7D, + 0xEF, 0x80, 0xFD, 0x7C, 0xFC, 0x7E, 0xF2, 0x7C, 0x30, 0x83, 0x30, 0x7F, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x7C, 0x80, 0x31, 0x83, 0x46, 0x80, 0x47, 0x83, 0x72, 0x80, + 0x5E, 0x83, 0x44, 0x80, 0x85, 0x83, 0x5F, 0x80, 0x38, 0x83, 0x34, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x7E, 0xE8, 0x7D, 0xE7, 0x83, 0x2C, 0x7E, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x58, 0x80, 0xB1, 0x83, 0x3E, 0x80, + 0x97, 0x83, 0x5F, 0x80, 0x41, 0x83, 0xA3, 0x80, 0x61, 0x83, 0x3E, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x7F, 0xEF, 0x80, 0xFD, 0x7C, + 0xFC, 0x7E, 0xF2, 0x7C, 0x30, 0x83, 0x30, 0x7F, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x7E, 0xE8, 0x7D, 0xE7, 0x83, 0x2C, 0x7E, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x7F, 0xEF, 0x80, 0xFD, 0x7C, 0xFC, 0x7E, 0xF2, 0x7C, + 0x30, 0x83, 0x30, 0x7F, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x7E, 0xE8, 0x7D, + 0xE7, 0x83, 0x2C, 0x7E, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x7F, + 0xEF, 0x80, 0xFD, 0x7C, 0xFC, 0x7F, 0xFB, 0x7C, 0xFB, 0x7E, 0xFB, 0x7E, + 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, + 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, + 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, + 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, 0xFB, 0x7E, + 0xFB, 0x7E, 0xFB, 0x7E, 0xF9, 0x7E, 0xE8, 0x7E, 0xE7, 0x82, 0xFB, 0x7D, + 0xFE, 0x81, 0xFE, 0x7E, 0xFE, 0x81, 0xFE, 0x7E, 0xFE, 0x81, 0xFE, 0x7E, + 0xFE, 0x81, 0xFE, 0x7E, 0xFE, 0x81, 0xFE, 0x7E, 0xFE, 0x81, 0xFE, 0x7E, + 0xFE, 0x81, 0xFE, 0x7E, 0xFE, 0x81, 0xFE, 0x7E, 0xFE, 0x81, 0xFE, 0x7E, + 0xFE, 0x81, 0xFE, 0x7E, 0xFE, 0x81, 0xFE, 0x7E, 0xFE, 0x81, 0xFE, 0x7E, + 0xFE, 0x81, 0xFE, 0x7E, 0xFE, 0x81, 0xFE, 0x7E, 0xFD, 0x81, 0xFC, 0x7E, + 0xFC, 0x80, 0x2E, 0x7C, 0x30, 0x82, 0x30, 0x80, 0x30, 0x82, 0x30, 0x80, + 0x30, 0x82, 0x30, 0x80, 0x30, 0x82, 0x30, 0x80, 0x30, 0x82, 0x59, 0x7F, + 0x30, 0x83, 0x30, 0x7D, 0x2D, 0x83, 0x31, 0x80, 0x36, 0x83, 0x37, 0x7D, + 0x30, 0x80, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x80, + 0x30, 0x82, 0x30, 0x80, 0x30, 0x82, 0x30, 0x80, 0x30, 0x82, 0x30, 0x80, + 0x30, 0x82, 0x30, 0x80, 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, + 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x30, 0x7F, + 0x2D, 0x83, 0x30, 0x7D, 0x30, 0x82, 0x30, 0x7D, 0x2F, 0x7F, 0x35, 0x7D, + 0x3B, 0x7F, 0x2F, 0x7D, 0x30, 0x83, 0x30, 0x7D, 0x52, 0x84, 0x31, 0x7F, + 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, 0x31, 0x82, 0x31, 0x7F, + 0x31, 0x82, 0x31, 0x7F, 0x2E, 0x80, 0xFC, 0x7D, 0xFC, 0x80, 0x2E, 0x7C, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x7E, 0x5A, 0x7F, 0x2F, 0x82, 0x2F, 0x7D, + 0x2A, 0x7E, 0x35, 0x7C, 0x2F, 0x7E, 0x37, 0x7D, 0x2F, 0x81, 0x2F, 0x7D, + 0x2F, 0x83, 0x31, 0x7D, 0x30, 0x83, 0x30, 0x80, 0x32, 0x83, 0x2A, 0x80, + 0x32, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x31, 0x83, 0x30, 0x80, + 0x34, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x35, 0x83, 0x34, 0x80, + 0x31, 0x83, 0x29, 0x80, 0x30, 0x83, 0x31, 0x80, 0x2C, 0x87, 0x32, 0x7D, + 0x32, 0x87, 0x32, 0x7D, 0x31, 0x85, 0x37, 0x7D, 0x39, 0x85, 0x2E, 0x7D, + 0x32, 0x86, 0x32, 0x7D, 0x52, 0x84, 0x30, 0x7F, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x2E, 0x80, 0xFC, 0x7D, 0xFC, 0x80, 0x2E, 0x7C, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x32, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x52, 0x83, 0x85, 0x80, 0xB0, 0x83, 0x56, 0x80, + 0x67, 0x83, 0x73, 0x80, 0x44, 0x83, 0x71, 0x80, 0x2F, 0x83, 0x8D, 0x80, + 0x54, 0x83, 0x6C, 0x80, 0x75, 0x83, 0x5E, 0x80, 0xB6, 0x83, 0x2F, 0x80, + 0x2C, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x2E, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x2E, 0x80, 0xFC, 0x7D, + 0xFC, 0x80, 0x2E, 0x7D, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x2D, 0x83, 0x30, 0x80, 0x30, 0x83, 0x2B, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x2E, 0x80, 0xFC, 0x7D, 0xFD, 0x81, 0x55, 0x7F, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, 0x58, 0x83, 0x58, 0x80, + 0x53, 0x80, 0xFC, 0x7E, 0xFC, 0x72, 0x91, 0x77, 0x91, 0x61, 0x91, 0x6B, + 0x91, 0x61, 0x91, 0x6B, 0x91, 0x61, 0x91, 0x6B, 0x91, 0x61, 0x91, 0x6B, + 0x91, 0x61, 0x91, 0x6B, 0x91, 0x61, 0x91, 0x6B, 0x91, 0x61, 0x91, 0x6B, + 0x91, 0x61, 0x91, 0x6B, 0x91, 0x61, 0x91, 0x6B, 0x91, 0x61, 0x91, 0x6B, + 0x91, 0x61, 0x91, 0x6B, 0x91, 0x61, 0x91, 0x6B, 0x91, 0x61, 0x91, 0x6B, + 0x91, 0x61, 0x91, 0x6B, 0x91, 0x68, 0x90, 0x70, 0x83, 0x95, 0x83, 0x6D, + 0x83, 0x9D, 0x83, 0x68, 0x83, 0x9D, 0x83, 0x68, 0x83, 0x9D, 0x83, 0x68, + 0x83, 0x9D, 0x83, 0x68, 0x83, 0x9D, 0x83, 0x68, 0x83, 0x9D, 0x83, 0x68, + 0x83, 0x9D, 0x83, 0x68, 0x83, 0x9D, 0x83, 0x68, 0x83, 0x9D, 0x83, 0x68, + 0x83, 0x9D, 0x83, 0x68, 0x83, 0x9D, 0x83, 0x68, 0x83, 0x9D, 0x83, 0x68, + 0x83, 0x9D, 0x83, 0x68, 0x83, 0x9D, 0x83, 0x68, 0x84, 0x8F, 0xFA, 0x77, + 0xFC, 0x72, 0x93, 0x77, 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, + 0x92, 0x68, 0x8E, 0x70, 0x86, 0x95, 0x85, 0x6D, 0x85, 0x9D, 0x85, 0x68, + 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, + 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, + 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, + 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, + 0x85, 0x9D, 0x85, 0x68, 0x86, 0x8F, 0xFA, 0x77, 0xFC, 0x71, 0x93, 0x77, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, 0x92, 0x62, 0x96, 0x6B, + 0xB1, 0x6B, 0xC5, 0x73, 0xA2, 0x69, 0x8E, 0x70, 0xD1, 0x69, 0xBD, 0x6E, + 0xC2, 0x6B, 0xAA, 0x73, 0xAF, 0x68, 0x91, 0x6B, 0xAB, 0x69, 0xCD, 0x70, + 0xA2, 0x68, 0xA8, 0x70, 0xAF, 0x67, 0x9F, 0x6E, 0x8F, 0x63, 0x92, 0x6B, + 0x92, 0x61, 0x92, 0x6B, 0x92, 0x61, 0x92, 0x6B, 0x92, 0x68, 0x8E, 0x6D, + 0x86, 0x98, 0x85, 0x6D, 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, + 0x86, 0x9D, 0x88, 0x6B, 0xC6, 0x93, 0xA9, 0x71, 0x84, 0x96, 0xC0, 0x6C, + 0xB3, 0x92, 0xB7, 0x70, 0xA3, 0x92, 0xB3, 0x73, 0x86, 0x96, 0xBF, 0x6D, + 0xC2, 0x93, 0xBB, 0x70, 0x7F, 0x97, 0x93, 0x6D, 0xAB, 0x98, 0xA7, 0x6B, + 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, 0x85, 0x9D, 0x85, 0x68, + 0x86, 0x8F, 0xFA, 0x77, 0xFC, 0x74, 0x93, 0x7A, 0x92, 0x64, 0x92, 0x69, + 0x92, 0x64, 0x92, 0x69, 0x92, 0x64, 0x92, 0x69, 0x92, 0x64, 0x92, 0x68, + 0x92, 0x64, 0x92, 0x68, 0x92, 0x64, 0x92, 0x69, 0x92, 0x64, 0x92, 0x68, + 0x92, 0x63, 0x92, 0x69, 0x92, 0x64, 0x92, 0x68, 0x92, 0x64, 0x92, 0x68, + 0x92, 0x64, 0x92, 0x69, 0x92, 0x64, 0x92, 0x69, 0x92, 0x64, 0x92, 0x69, + 0x92, 0x64, 0x92, 0x69, 0x92, 0x67, 0x8E, 0x6E, 0x86, 0x97, 0x85, 0x6E, + 0x85, 0x98, 0x85, 0x69, 0x85, 0x98, 0x85, 0x69, 0x85, 0x98, 0x85, 0x69, + 0x85, 0x99, 0x85, 0x68, 0x85, 0x99, 0x85, 0x69, 0x85, 0x99, 0x85, 0x68, + 0x85, 0x99, 0x85, 0x68, 0x85, 0x98, 0x85, 0x68, 0x86, 0x99, 0x85, 0x68, + 0x85, 0x98, 0x85, 0x69, 0x85, 0x98, 0x85, 0x69, 0x85, 0x98, 0x85, 0x69, + 0x85, 0x98, 0x85, 0x69, 0x85, 0x98, 0x85, 0x69, 0x85, 0x8C, 0xFB, 0x7A, + 0xFB, 0x78, 0xAE, 0x7C, 0xAE, 0x70, 0xAE, 0x75, 0xAE, 0x70, 0xAE, 0x75, + 0xAE, 0x70, 0xAE, 0x75, 0xAE, 0x70, 0xAE, 0x75, 0xAE, 0x70, 0xAE, 0x75, + 0xAE, 0x70, 0xAE, 0x75, 0xAE, 0x70, 0xAE, 0x75, 0xAE, 0x70, 0xAE, 0x75, + 0xAE, 0x70, 0xAE, 0x75, 0xAE, 0x70, 0xAE, 0x75, 0xAE, 0x70, 0xAE, 0x75, + 0xAE, 0x70, 0xAE, 0x75, 0xAE, 0x70, 0xAE, 0x75, 0xAE, 0x70, 0xAE, 0x75, + 0xAE, 0x71, 0xB3, 0x76, 0xAF, 0x8C, 0xA6, 0x76, 0xA5, 0x92, 0xA5, 0x75, + 0xA5, 0x92, 0xA5, 0x75, 0xA5, 0x92, 0xA5, 0x75, 0xA5, 0x92, 0xA5, 0x75, + 0xA5, 0x92, 0xA5, 0x75, 0xA5, 0x92, 0xA5, 0x75, 0xA5, 0x92, 0xA5, 0x75, + 0xA5, 0x92, 0xA5, 0x75, 0xA5, 0x92, 0xA5, 0x75, 0xA5, 0x92, 0xA5, 0x75, + 0xA5, 0x92, 0xA5, 0x75, 0xA5, 0x92, 0xA5, 0x75, 0xA5, 0x92, 0xA5, 0x75, + 0xA5, 0x92, 0xA5, 0x75, 0xA6, 0x88, 0xFC, 0x7B, 0xFD, 0x88, 0x88, 0x82, + 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, + 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, + 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, + 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, + 0x89, 0x95, 0x89, 0x88, 0x89, 0x97, 0x89, 0x86, 0x88, 0x99, 0x85, 0x85, + 0x88, 0x99, 0x88, 0x85, 0x88, 0x9A, 0x89, 0x89, 0x89, 0x95, 0x89, 0x88, + 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, + 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, + 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, + 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, 0x89, 0x95, 0x89, 0x88, + 0x88, 0x87, 0xFD, 0x82, 0xFC, 0x8C, 0x89, 0x81, 0x88, 0x94, 0x88, 0x88, + 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, + 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, + 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, + 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, + 0x88, 0x98, 0x88, 0x86, 0x7E, 0x9C, 0x8B, 0x85, 0x88, 0x9C, 0x8C, 0x85, + 0x88, 0x98, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, + 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, + 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, + 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, + 0x88, 0x94, 0x88, 0x88, 0x88, 0x94, 0x88, 0x88, 0x89, 0x8E, 0xFD, 0x81, + 0xFC, 0x7E, 0xF0, 0x7F, 0x30, 0x82, 0x30, 0x81, 0x30, 0x82, 0x30, 0x7F, + 0x30, 0x83, 0x33, 0x82, 0xFD, 0x7F, 0x30, 0x81, 0x30, 0x82, 0x30, 0x7F, + 0x30, 0x82, 0x30, 0x7F, 0x34, 0x82, 0xFD, 0x81, 0x30, 0x82, 0x30, 0x7F, + 0x30, 0x82, 0x30, 0x7F, 0x30, 0x82, 0x30, 0x81, 0xFE, 0x81, 0x30, 0x81, + 0x30, 0x82, 0x30, 0x7F, 0x30, 0x82, 0x30, 0x7F, 0x30, 0x81, 0xFE, 0x80, + 0x30, 0x82, 0x30, 0x7F, 0x30, 0x82, 0x30, 0x7F, 0x30, 0x82, 0x30, 0x81, + 0xFC, 0x82, 0x2D, 0x82, 0x30, 0x82, 0x30, 0x7F, 0x30, 0x82, 0x30, 0x7F, + 0x30, 0x82, 0xC4, 0x81, 0x2F, 0x82, 0x30, 0x81, 0x30, 0x82, 0x30, 0x7F, + 0x30, 0x81, 0x30, 0x7F, 0x5E, 0x81, 0x2F, 0x82, 0x30, 0x82, 0x30, 0x81, + 0x30, 0x82, 0x30, 0x7F, 0x30, 0x81, 0x30, 0x7F, 0xFE, 0x80, 0xFE, 0x81, + 0xFE, 0x80, 0xFE, 0x81, 0xFD, 0x7D, 0xFC, 0x7F, 0xFD, 0x80, 0xEF, 0x7E, + 0x30, 0x83, 0x31, 0x80, 0x2E, 0x83, 0x35, 0x80, 0x30, 0x85, 0x33, 0x80, + 0xFD, 0x82, 0x30, 0x80, 0x2F, 0x83, 0x30, 0x80, 0x2D, 0x83, 0x31, 0x80, + 0x34, 0x82, 0xFE, 0x80, 0x30, 0x83, 0x30, 0x80, 0x2E, 0x83, 0x2F, 0x80, + 0x2E, 0x83, 0x30, 0x80, 0xFE, 0x82, 0x30, 0x80, 0x2B, 0x83, 0x2B, 0x80, + 0x2E, 0x83, 0x31, 0x80, 0x30, 0x82, 0xFE, 0x80, 0x30, 0x83, 0x34, 0x80, + 0x2D, 0x83, 0x34, 0x80, 0x30, 0x83, 0x30, 0x80, 0xFD, 0x82, 0x2D, 0x80, + 0x30, 0x83, 0x32, 0x80, 0x30, 0x83, 0x31, 0x80, 0x30, 0x83, 0xC4, 0x80, + 0x2F, 0x83, 0x30, 0x80, 0x2B, 0x83, 0x32, 0x80, 0x34, 0x83, 0x30, 0x80, + 0x5E, 0x83, 0x2F, 0x80, 0x30, 0x83, 0x30, 0x80, 0x2B, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0xFF, 0x7F, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0xFD, 0x7F, 0xFD, 0x7F, 0xFD, 0x80, 0xEF, 0x7E, 0x30, 0x83, 0x91, 0x80, + 0x2D, 0x83, 0x35, 0x80, 0x30, 0x85, 0x33, 0x80, 0xFD, 0x82, 0x30, 0x80, + 0x39, 0x83, 0x68, 0x80, 0x33, 0x83, 0x31, 0x80, 0x34, 0x82, 0xFE, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x96, 0x83, 0x31, 0x80, 0x2E, 0x83, 0x30, 0x80, + 0xFE, 0x82, 0x30, 0x80, 0x64, 0x83, 0xD1, 0x80, 0x55, 0x83, 0x31, 0x80, + 0x30, 0x82, 0xFE, 0x80, 0x30, 0x83, 0x2C, 0x80, 0x3C, 0x83, 0x49, 0x80, + 0x5B, 0x83, 0x30, 0x80, 0xFD, 0x82, 0x2D, 0x80, 0x74, 0x83, 0x25, 0x80, + 0x8D, 0x83, 0x52, 0x80, 0x30, 0x83, 0xC4, 0x80, 0x2F, 0x83, 0x30, 0x80, + 0x33, 0x83, 0x31, 0x80, 0x84, 0x83, 0x30, 0x80, 0x5E, 0x83, 0x2F, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x72, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0xFF, 0x7F, 0xFD, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFD, 0x7F, 0xFD, 0x7F, + 0xFD, 0x80, 0xEF, 0x7E, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x85, 0x33, 0x80, 0xFD, 0x82, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x34, 0x82, 0xFE, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0xFE, 0x82, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x82, 0xFE, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0xFD, 0x82, 0x2D, 0x80, 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0xC4, 0x80, 0x2F, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x5E, 0x83, 0x2F, 0x80, 0x30, 0x83, 0x30, 0x80, + 0x30, 0x83, 0x30, 0x80, 0x30, 0x83, 0x30, 0x80, 0xFF, 0x7F, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0xFD, 0x7F, 0xFD, 0x7F, 0xFA, 0x7E, 0xF0, 0x7B, + 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x8B, 0x5D, 0x7F, + 0xFF, 0x81, 0x5E, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, + 0x5B, 0x80, 0xFB, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, + 0x5E, 0x8A, 0x5E, 0x7F, 0xF8, 0x85, 0x5E, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, + 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x85, 0xFB, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, + 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x88, 0x5E, 0x7F, 0xF3, 0x85, 0x5E, 0x80, + 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x85, 0xC4, 0x7F, + 0x5C, 0x85, 0x5E, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, + 0x81, 0x85, 0x5B, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, 0x5E, 0x8A, 0x5E, 0x7F, + 0x5E, 0x8A, 0x5E, 0x7F, 0xFD, 0x81, 0xFD, 0x7D, 0xFD, 0x81, 0xFD, 0x7D, + 0xFC, 0x7E, 0xFA, 0x7B, 0xF7, 0x7E, 0xFC, 0x7D, 0xFD, 0x81, 0xFD, 0x7E, + 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, + 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, + 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, + 0xFC, 0x82, 0xFC, 0x7F, 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, + 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, + 0xFD, 0x82, 0xFC, 0x7F, 0xFC, 0x82, 0xFC, 0x7F, 0xFD, 0x81, 0xFD, 0x7E, + 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, + 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, + 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, 0xFD, 0x81, 0xFD, 0x7E, + 0xFD, 0x81, 0xFD, 0x7F, 0xFD, 0x81, 0xFD, 0x7F, 0xFC, 0x7D, 0xF7, 0x7E +}; diff --git a/src/lib/CherryUSB/demo/dfu_st_cubemx_main.c b/src/lib/CherryUSB/demo/dfu_st_cubemx_main.c new file mode 100644 index 000000000..b845af3ed --- /dev/null +++ b/src/lib/CherryUSB/demo/dfu_st_cubemx_main.c @@ -0,0 +1,372 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include "usbd_core.h" +#include "usb_dfu.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart1; + +PCD_HandleTypeDef hpcd_USB_FS; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART1_UART_Init(void); +static void MX_USB_PCD_Init(void); +/* USER CODE BEGIN PFP */ +typedef void (*pFunction)(void); +static void jump_app(void) +{ + pFunction JumpToApplication; + uint32_t JumpAddress; + + if (((*(__IO uint32_t *)USBD_DFU_APP_DEFAULT_ADD) & 0x2FFFB000) == 0x20000000) + { + /* Jump to user application */ + /*!< Jump to app reset_handler */ + JumpAddress = *(__IO uint32_t *)(USBD_DFU_APP_DEFAULT_ADD + 4); + JumpToApplication = (pFunction)JumpAddress; + + /* Initialize user application's Stack Pointer */ + __set_MSP(*(__IO uint32_t *)USBD_DFU_APP_DEFAULT_ADD); + JumpToApplication(); + } +} +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ +int fputc(int ch, FILE *f) +{ + while ((USART1->SR & USART_SR_TXE) == 0) + ; + USART1->DR = ch; + return ch; +} + +void usb_dc_low_level_init(void) +{ + /* Peripheral clock enable */ + __HAL_RCC_USB_CLK_ENABLE(); + /* USB interrupt Init */ + HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); + +} + +uint8_t *dfu_read_flash(uint8_t *src, uint8_t *dest, uint32_t len) +{ + uint32_t i = 0; + uint8_t *psrc = src; + + for (i = 0; i < len; i++) + { + dest[i] = *psrc++; + } + /* Return a valid address to avoid HardFault */ + return (uint8_t *)(dest); +} + +uint16_t dfu_write_flash(uint8_t *src, uint8_t *dest, uint32_t len) +{ + HAL_FLASH_Unlock(); + uint32_t i = 0; + + for (i = 0; i < len; i += 4) + { + /* Device voltage range supposed to be [2.7V to 3.6V], the operation will + * be done by byte */ + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest + i), + *(uint32_t *)(src + i)) == HAL_OK) + { + /* Check the written value */ + if (*(uint32_t *)(src + i) != *(uint32_t *)(dest + i)) + { + /* Flash content doesn't match SRAM content */ + return (1); + } + } + else + { + /* Error occurred while writing data in Flash memory */ + return (2); + } + } + return 0; +} + +uint16_t dfu_erase_flash(uint32_t add) +{ + HAL_FLASH_Unlock(); + uint32_t PageError; + /* Variable contains Flash operation status */ + HAL_StatusTypeDef status; + FLASH_EraseInitTypeDef eraseinitstruct; + + eraseinitstruct.TypeErase = FLASH_TYPEERASE_PAGES; + eraseinitstruct.PageAddress = add; + eraseinitstruct.NbPages = 1U; + status = HAL_FLASHEx_Erase(&eraseinitstruct, &PageError); + return 0; +} + +void dfu_leave(void) +{ + NVIC_SystemReset(); +} + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + jump_app(); + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART1_UART_Init(); + //MX_USB_PCD_Init(); + /* USER CODE BEGIN 2 */ + + +// extern void cdc_acm_msc_init(void); +// cdc_acm_msc_init(); + extern void dfu_flash_init(void); + dfu_flash_init(); + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ +// extern void cdc_acm_data_send_with_dtr_test(void); +// cdc_acm_data_send_with_dtr_test(); +// HAL_Delay(100); + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/** + * @brief USB Initialization Function + * @param None + * @retval None + */ +static void MX_USB_PCD_Init(void) +{ + + /* USER CODE BEGIN USB_Init 0 */ + + /* USER CODE END USB_Init 0 */ + + /* USER CODE BEGIN USB_Init 1 */ + + /* USER CODE END USB_Init 1 */ + hpcd_USB_FS.Instance = USB; + hpcd_USB_FS.Init.dev_endpoints = 8; + hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; + hpcd_USB_FS.Init.low_power_enable = DISABLE; + hpcd_USB_FS.Init.lpm_enable = DISABLE; + hpcd_USB_FS.Init.battery_charging_enable = DISABLE; + if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USB_Init 2 */ + + /* USER CODE END USB_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/src/lib/CherryUSB/demo/dfu_with_st_tool_template.c b/src/lib/CherryUSB/demo/dfu_with_st_tool_template.c new file mode 100644 index 000000000..9c36433a0 --- /dev/null +++ b/src/lib/CherryUSB/demo/dfu_with_st_tool_template.c @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_dfu.h" + +#define USBD_VID 0x0483 +#define USBD_PID 0xDF11 +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#define FLASH_DESC_STR "@Internal Flash /0x08000000/16*001Ka,112*01Kg" + +#define USB_CONFIG_SIZE (9 + 9 + 9) + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + DFU_DESCRIPTOR_INIT() +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB DFU DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor dfu_flash_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t dfu_flash_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + DFU_DESCRIPTOR_INIT(), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x1e, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'D', 0x00, /* wcChar0 */ + 'F', 0x00, /* wcChar1 */ + 'U', 0x00, /* wcChar2 */ + 'W', 0x00, /* wcChar3 */ + 'i', 0x00, /* wcChar4 */ + 't', 0x00, /* wcChar5 */ + 'h', 0x00, /* wcChar6 */ + 's', 0x00, /* wcChar7 */ + 't', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 't', 0x00, /* wcChar10 */ + 'o', 0x00, /* wcChar11 */ + 'o', 0x00, /* wcChar12 */ + 'l', 0x00, /* wcChar13 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ + /////////////////////////////////////// + /// string4 descriptor + /////////////////////////////////////// + 0x60, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '@', 0x00, /* wcChar0 */ + 'I', 0x00, /* wcChar1 */ + 'n', 0x00, /* wcChar2 */ + 't', 0x00, /* wcChar3 */ + 'e', 0x00, /* wcChar4 */ + 'r', 0x00, /* wcChar5 */ + 'n', 0x00, /* wcChar6 */ + 'a', 0x00, /* wcChar7 */ + 'l', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'F', 0x00, /* wcChar10 */ + 'l', 0x00, /* wcChar11*/ + 'a', 0x00, /* wcChar12 */ + 's', 0x00, /* wcChar13 */ + 'h', 0x00, /* wcChar14 */ + ' ', 0x00, /* wcChar15 */ + ' ', 0x00, /* wcChar16 */ + ' ', 0x00, /* wcChar17 */ + '/', 0x00, /* wcChar18 */ + '0', 0x00, /* wcChar19 */ + 'x', 0x00, /* wcChar20 */ + '0', 0x00, /* wcChar21*/ + '8', 0x00, /* wcChar22 */ + '0', 0x00, /* wcChar23 */ + '0', 0x00, /* wcChar24 */ + '0', 0x00, /* wcChar25 */ + '0', 0x00, /* wcChar26 */ + '0', 0x00, /* wcChar27 */ + '0', 0x00, /* wcChar28 */ + '/', 0x00, /* wcChar29 */ + '1', 0x00, /* wcChar30 */ + '6', 0x00, /* wcChar31*/ + '*', 0x00, /* wcChar32 */ + '0', 0x00, /* wcChar33 */ + '0', 0x00, /* wcChar34 */ + '1', 0x00, /* wcChar35 */ + 'K', 0x00, /* wcChar36 */ + 'a', 0x00, /* wcChar37 */ + ',', 0x00, /* wcChar38 */ + '1', 0x00, /* wcChar39 */ + '1', 0x00, /* wcChar40 */ + '2', 0x00, /* wcChar41*/ + '*', 0x00, /* wcChar42 */ + '0', 0x00, /* wcChar43 */ + '1', 0x00, /* wcChar44 */ + 'K', 0x00, /* wcChar45 */ + 'g', 0x00, /* wcChar46 */ + +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +struct usbd_interface intf0; + +void dfu_flash_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &dfu_flash_descriptor); +#else + usbd_desc_register(busid, dfu_flash_descriptor); +#endif + usbd_add_interface(busid, usbd_dfu_init_intf(&intf0)); + usbd_initialize(busid, reg_base, usbd_event_handler); +} diff --git a/src/lib/CherryUSB/demo/hid_custom_inout_template.c b/src/lib/CherryUSB/demo/hid_custom_inout_template.c new file mode 100644 index 000000000..f60c85872 --- /dev/null +++ b/src/lib/CherryUSB/demo/hid_custom_inout_template.c @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2022 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include "usbd_core.h" +#include "usbd_hid.h" + +#define HIDRAW_IN_EP 0x81 +#define HIDRAW_OUT_EP 0x02 + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + 9 + 9 + 7 + 7) + +/*!< custom hid report descriptor size */ +#define HID_CUSTOM_REPORT_DESC_SIZE 38 + +#ifdef CONFIG_USB_HS +#define HID_MAX_MPS 1024 +#define HIDRAW_IN_INTERVAL 1 +#else +#define HID_MAX_MPS 64 +#define HIDRAW_IN_INTERVAL 1 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_CUSTOM_INOUT_DESCRIPTOR_INIT(0x00, 0x01, HID_CUSTOM_REPORT_DESC_SIZE, HIDRAW_OUT_EP, HIDRAW_IN_EP, HID_MAX_MPS, HIDRAW_IN_INTERVAL), +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB HID DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor hid_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +static const uint8_t hid_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_CUSTOM_INOUT_DESCRIPTOR_INIT(0x00, 0x01, HID_CUSTOM_REPORT_DESC_SIZE, HIDRAW_OUT_EP, HIDRAW_IN_EP, HID_MAX_MPS, HIDRAW_IN_INTERVAL), + /* + * string0 descriptor + */ + USB_LANGID_INIT(USBD_LANGID_STRING), + /* + * string1 descriptor + */ + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /* + * string2 descriptor + */ + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'H', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'D', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /* + * string3 descriptor + */ + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /* + * device qualifier descriptor + */ + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +/*!< custom hid report descriptor */ +static const uint8_t hid_custom_report_desc[HID_CUSTOM_REPORT_DESC_SIZE] = { +#ifdef CONFIG_USB_HS + /* USER CODE BEGIN 0 */ + 0x06, 0x00, 0xff, /* USAGE_PAGE (Vendor Defined Page 1) */ + 0x09, 0x01, /* USAGE (Vendor Usage 1) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + 0x85, 0x02, /* REPORT ID (0x02) */ + 0x09, 0x02, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /*LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0xff, 0x03, /* REPORT_COUNT (63) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + /* <___________________________________________________> */ + 0x85, 0x01, /* REPORT ID (0x01) */ + 0x09, 0x03, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0xff, 0x03, /* REPORT_COUNT (63) */ + 0x91, 0x02, /* OUTPUT (Data,Var,Abs) */ + /* USER CODE END 0 */ + 0xC0 /* END_COLLECTION */ +#else + /* USER CODE BEGIN 0 */ + 0x06, 0x00, 0xff, /* USAGE_PAGE (Vendor Defined Page 1) */ + 0x09, 0x01, /* USAGE (Vendor Usage 1) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + 0x85, 0x02, /* REPORT ID (0x02) */ + 0x09, 0x01, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM (255) */ + 0x95, 0x40 - 1, /* REPORT_COUNT (63) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + /* <___________________________________________________> */ + 0x85, 0x01, /* REPORT ID (0x01) */ + 0x09, 0x01, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM (255) */ + 0x95, 0x40 - 1, /* REPORT_COUNT (63) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x91, 0x02, /* OUTPUT (Data,Var,Abs) */ + /* USER CODE END 0 */ + 0xC0 /* END_COLLECTION */ +#endif +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[HID_MAX_MPS]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t send_buffer[HID_MAX_MPS]; + +#define HID_STATE_IDLE 0 +#define HID_STATE_BUSY 1 + +/*!< hid state ! Data can be sent only when state is idle */ +static volatile uint8_t custom_state; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, HIDRAW_OUT_EP, read_buffer, HID_MAX_MPS); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +static void usbd_hid_custom_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + (void)ep; + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + custom_state = HID_STATE_IDLE; +} + +static void usbd_hid_custom_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + usbd_ep_start_read(busid, ep, read_buffer, HID_MAX_MPS); + read_buffer[0] = 0x02; /* IN: report id */ + usbd_ep_start_write(busid, HIDRAW_IN_EP, read_buffer, nbytes); +} + +static struct usbd_endpoint custom_in_ep = { + .ep_cb = usbd_hid_custom_in_callback, + .ep_addr = HIDRAW_IN_EP +}; + +static struct usbd_endpoint custom_out_ep = { + .ep_cb = usbd_hid_custom_out_callback, + .ep_addr = HIDRAW_OUT_EP +}; + +/* function ------------------------------------------------------------------*/ +/** + * @brief hid custom init + * @pre none + * @param[in] none + * @retval none + */ +struct usbd_interface intf0; + +void hid_custom_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &hid_descriptor); +#else + usbd_desc_register(busid, hid_descriptor); +#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &custom_in_ep); + usbd_add_endpoint(busid, &custom_out_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} diff --git a/src/lib/CherryUSB/demo/hid_keyboard_template.c b/src/lib/CherryUSB/demo/hid_keyboard_template.c new file mode 100644 index 000000000..9ae3c9d39 --- /dev/null +++ b/src/lib/CherryUSB/demo/hid_keyboard_template.c @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_hid.h" + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#define HID_INT_EP 0x81 +#define HID_INT_EP_SIZE 8 +#define HID_INT_EP_INTERVAL 10 + +#define USB_CONFIG_SIZE 34 +#define HID_KEYBOARD_REPORT_DESC_SIZE 63 + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_KEYBOARD_DESCRIPTOR_INIT(0x00, 0x01, HID_KEYBOARD_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB HID DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor hid_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +static const uint8_t hid_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_KEYBOARD_DESCRIPTOR_INIT(0x00, 0x01, HID_KEYBOARD_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'H', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'D', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +/* USB HID device Configuration Descriptor */ +static uint8_t hid_desc[9] __ALIGN_END = { + /* 18 */ + 0x09, /* bLength: HID Descriptor size */ + HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ + 0x11, /* bcdHID: HID Class Spec release number */ + 0x01, + 0x00, /* bCountryCode: Hardware target country */ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ + 0x22, /* bDescriptorType */ + HID_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ + 0x00, +}; + +static const uint8_t hid_keyboard_report_desc[HID_KEYBOARD_REPORT_DESC_SIZE] = { + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x06, // USAGE (Keyboard) + 0xa1, 0x01, // COLLECTION (Application) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) + 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x75, 0x01, // REPORT_SIZE (1) + 0x95, 0x08, // REPORT_COUNT (8) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) + 0x95, 0x05, // REPORT_COUNT (5) + 0x75, 0x01, // REPORT_SIZE (1) + 0x05, 0x08, // USAGE_PAGE (LEDs) + 0x19, 0x01, // USAGE_MINIMUM (Num Lock) + 0x29, 0x05, // USAGE_MAXIMUM (Kana) + 0x91, 0x02, // OUTPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x03, // REPORT_SIZE (3) + 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) + 0x95, 0x06, // REPORT_COUNT (6) + 0x75, 0x08, // REPORT_SIZE (8) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0xFF, // LOGICAL_MAXIMUM (255) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) + 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) + 0x81, 0x00, // INPUT (Data,Ary,Abs) + 0xc0 // END_COLLECTION +}; + +#define HID_STATE_IDLE 0 +#define HID_STATE_BUSY 1 + +/*!< hid state ! Data can be sent only when state is idle */ +static volatile uint8_t hid_state = HID_STATE_IDLE; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + hid_state = HID_STATE_IDLE; + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_hid_int_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + hid_state = HID_STATE_IDLE; +} + +static struct usbd_endpoint hid_in_ep = { + .ep_cb = usbd_hid_int_callback, + .ep_addr = HID_INT_EP +}; + +struct usbd_interface intf0; + +void hid_keyboard_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &hid_descriptor); +#else + usbd_desc_register(busid, hid_descriptor); +#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &hid_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[64]; + +void hid_keyboard_test(uint8_t busid) +{ + const uint8_t sendbuffer[8] = { 0x00, 0x00, HID_KBD_USAGE_A, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + if(usb_device_is_configured(busid) == false) { + return; + } + + memcpy(write_buffer, sendbuffer, 8); + hid_state = HID_STATE_BUSY; + usbd_ep_start_write(busid, HID_INT_EP, write_buffer, 8); + while (hid_state == HID_STATE_BUSY) { + } +} diff --git a/src/lib/CherryUSB/demo/hid_mouse_template.c b/src/lib/CherryUSB/demo/hid_mouse_template.c new file mode 100644 index 000000000..1c24841b4 --- /dev/null +++ b/src/lib/CherryUSB/demo/hid_mouse_template.c @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_hid.h" + +/*!< endpoint address */ +#define HID_INT_EP 0x81 +#define HID_INT_EP_SIZE 4 +#define HID_INT_EP_INTERVAL 1 + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE 34 +/*!< report descriptor size */ +#define HID_MOUSE_REPORT_DESC_SIZE 74 + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_MOUSE_DESCRIPTOR_INIT(0x00, 0x01, HID_MOUSE_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB HID DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor hid_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +const uint8_t hid_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_MOUSE_DESCRIPTOR_INIT(0x00, 0x01, HID_MOUSE_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'H', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'D', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +/*!< hid mouse report descriptor */ +static const uint8_t hid_mouse_report_desc[HID_MOUSE_REPORT_DESC_SIZE] = { + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x02, // USAGE (Mouse) + 0xA1, 0x01, // COLLECTION (Application) + 0x09, 0x01, // USAGE (Pointer) + + 0xA1, 0x00, // COLLECTION (Physical) + 0x05, 0x09, // USAGE_PAGE (Button) + 0x19, 0x01, // USAGE_MINIMUM (Button 1) + 0x29, 0x03, // USAGE_MAXIMUM (Button 3) + + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x95, 0x03, // REPORT_COUNT (3) + 0x75, 0x01, // REPORT_SIZE (1) + + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x05, // REPORT_SIZE (5) + 0x81, 0x01, // INPUT (Cnst,Var,Abs) + + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x30, // USAGE (X) + 0x09, 0x31, // USAGE (Y) + 0x09, 0x38, + + 0x15, 0x81, // LOGICAL_MINIMUM (-127) + 0x25, 0x7F, // LOGICAL_MAXIMUM (127) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x03, // REPORT_COUNT (2) + + 0x81, 0x06, // INPUT (Data,Var,Rel) + 0xC0, 0x09, + 0x3c, 0x05, + 0xff, 0x09, + + 0x01, 0x15, + 0x00, 0x25, + 0x01, 0x75, + 0x01, 0x95, + + 0x02, 0xb1, + 0x22, 0x75, + 0x06, 0x95, + 0x01, 0xb1, + + 0x01, 0xc0 // END_COLLECTION +}; + +/*!< mouse report struct */ +struct hid_mouse { + uint8_t buttons; + int8_t x; + int8_t y; + int8_t wheel; +}; + +/*!< mouse report */ +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX struct hid_mouse mouse_cfg; + +#define HID_STATE_IDLE 0 +#define HID_STATE_BUSY 1 + +/*!< hid state ! Data can be sent only when state is idle */ +static volatile uint8_t hid_state = HID_STATE_IDLE; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + hid_state = HID_STATE_IDLE; + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +/* function ------------------------------------------------------------------*/ +static void usbd_hid_int_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + hid_state = HID_STATE_IDLE; +} + +/*!< endpoint call back */ +static struct usbd_endpoint hid_in_ep = { + .ep_cb = usbd_hid_int_callback, + .ep_addr = HID_INT_EP +}; + +struct usbd_interface intf0; + +void hid_mouse_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &hid_descriptor); +#else + usbd_desc_register(busid, hid_descriptor); +#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &hid_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); + + /*!< init mouse report data */ + mouse_cfg.buttons = 0; + mouse_cfg.wheel = 0; + mouse_cfg.x = 0; + mouse_cfg.y = 0; +} + +#define CURSOR_STEP 2U +#define CURSOR_WIDTH 20U + +void draw_circle(uint8_t *buf) +{ + static int32_t move_cnt = 0; + static uint8_t step_x_y = 0; + static int8_t x = 0, y = 0; + + move_cnt++; + if (move_cnt > CURSOR_WIDTH) { + step_x_y++; + step_x_y = step_x_y % 4; + move_cnt = 0; + } + switch (step_x_y) { + case 0: { + y = 0; + x = CURSOR_STEP; + + } break; + + case 1: { + x = 0; + y = CURSOR_STEP; + + } break; + + case 2: { + y = 0; + x = (int8_t)(-CURSOR_STEP); + + } break; + + case 3: { + x = 0; + y = (int8_t)(-CURSOR_STEP); + + } break; + } + + buf[0] = 0; + buf[1] = x; + buf[2] = y; + buf[3] = 0; +} + +/* https://cps-check.com/cn/polling-rate-check */ +void hid_mouse_test(uint8_t busid) +{ + if(usb_device_is_configured(busid) == false) { + return; + } + + int counter = 0; + while (counter < 1000) { + draw_circle((uint8_t *)&mouse_cfg); + hid_state = HID_STATE_BUSY; + usbd_ep_start_write(busid, HID_INT_EP, (uint8_t *)&mouse_cfg, 4); + while (hid_state == HID_STATE_BUSY) { + } + + counter++; + } +} diff --git a/src/lib/CherryUSB/demo/hid_remote_wakeup_template.c b/src/lib/CherryUSB/demo/hid_remote_wakeup_template.c new file mode 100644 index 000000000..e000f9c44 --- /dev/null +++ b/src/lib/CherryUSB/demo/hid_remote_wakeup_template.c @@ -0,0 +1,367 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_hid.h" + +/*!< endpoint address */ +#define HID_INT_EP 0x81 +#define HID_INT_EP_SIZE 4 +#define HID_INT_EP_INTERVAL 1 + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE 34 +/*!< report descriptor size */ +#define HID_MOUSE_REPORT_DESC_SIZE 74 + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_REMOTE_WAKEUP | USB_CONFIG_SELF_POWERED, USBD_MAX_POWER), + HID_MOUSE_DESCRIPTOR_INIT(0x00, 0x01, HID_MOUSE_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB HID DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor hid_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +const uint8_t hid_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_REMOTE_WAKEUP | USB_CONFIG_SELF_POWERED, USBD_MAX_POWER), + HID_MOUSE_DESCRIPTOR_INIT(0x00, 0x01, HID_MOUSE_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'H', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'D', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +/*!< hid mouse report descriptor */ +static const uint8_t hid_mouse_report_desc[HID_MOUSE_REPORT_DESC_SIZE] = { + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x02, // USAGE (Mouse) + 0xA1, 0x01, // COLLECTION (Application) + 0x09, 0x01, // USAGE (Pointer) + + 0xA1, 0x00, // COLLECTION (Physical) + 0x05, 0x09, // USAGE_PAGE (Button) + 0x19, 0x01, // USAGE_MINIMUM (Button 1) + 0x29, 0x03, // USAGE_MAXIMUM (Button 3) + + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x95, 0x03, // REPORT_COUNT (3) + 0x75, 0x01, // REPORT_SIZE (1) + + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x05, // REPORT_SIZE (5) + 0x81, 0x01, // INPUT (Cnst,Var,Abs) + + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x30, // USAGE (X) + 0x09, 0x31, // USAGE (Y) + 0x09, 0x38, + + 0x15, 0x81, // LOGICAL_MINIMUM (-127) + 0x25, 0x7F, // LOGICAL_MAXIMUM (127) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x03, // REPORT_COUNT (2) + + 0x81, 0x06, // INPUT (Data,Var,Rel) + 0xC0, 0x09, + 0x3c, 0x05, + 0xff, 0x09, + + 0x01, 0x15, + 0x00, 0x25, + 0x01, 0x75, + 0x01, 0x95, + + 0x02, 0xb1, + 0x22, 0x75, + 0x06, 0x95, + 0x01, 0xb1, + + 0x01, 0xc0 // END_COLLECTION +}; + +/*!< mouse report struct */ +struct hid_mouse { + uint8_t buttons; + int8_t x; + int8_t y; + int8_t wheel; +}; + +/*!< mouse report */ +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX struct hid_mouse mouse_cfg; + +#define HID_STATE_IDLE 0 +#define HID_STATE_BUSY 1 + +/*!< hid state ! Data can be sent only when state is idle */ +static volatile uint8_t hid_state = HID_STATE_IDLE; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + hid_state = HID_STATE_IDLE; + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +/* function ------------------------------------------------------------------*/ +static void usbd_hid_int_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + hid_state = HID_STATE_IDLE; +} + +/*!< endpoint call back */ +static struct usbd_endpoint hid_in_ep = { + .ep_cb = usbd_hid_int_callback, + .ep_addr = HID_INT_EP +}; + +static struct usbd_interface intf0; + +void hid_mouse_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &hid_descriptor); +#else + usbd_desc_register(busid, hid_descriptor); +#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &hid_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); + + /*!< init mouse report data */ + mouse_cfg.buttons = 0; + mouse_cfg.wheel = 0; + mouse_cfg.x = 0; + mouse_cfg.y = 0; +} + +#define CURSOR_STEP 2U +#define CURSOR_WIDTH 20U + +void draw_circle(uint8_t *buf) +{ + static int32_t move_cnt = 0; + static uint8_t step_x_y = 0; + static int8_t x = 0, y = 0; + + move_cnt++; + if (move_cnt > CURSOR_WIDTH) { + step_x_y++; + step_x_y = step_x_y % 4; + move_cnt = 0; + } + switch (step_x_y) { + case 0: { + y = 0; + x = CURSOR_STEP; + + } break; + + case 1: { + x = 0; + y = CURSOR_STEP; + + } break; + + case 2: { + y = 0; + x = (int8_t)(-CURSOR_STEP); + + } break; + + case 3: { + x = 0; + y = (int8_t)(-CURSOR_STEP); + + } break; + } + + buf[0] = 0; + buf[1] = x; + buf[2] = y; + buf[3] = 0; +} + +/* https://cps-check.com/cn/polling-rate-check */ +void hid_mouse_test(uint8_t busid) +{ + static uint32_t count = 1000; + int ret; + + if(usb_device_is_configured(busid) == false) { + return; + } + + // if (gpio_read_pin(GPIO_PIN) == 1) { + // ret = usbd_send_remote_wakeup(busid); + // if (ret < 0) { + // return; + // } + // count = 5000; + // } + + while (count) { + draw_circle((uint8_t *)&mouse_cfg); + hid_state = HID_STATE_BUSY; + usbd_ep_start_write(busid, HID_INT_EP, (uint8_t *)&mouse_cfg, 4); + while (hid_state == HID_STATE_BUSY) { + } + + count--; + } +} diff --git a/src/lib/CherryUSB/demo/midi_template.c b/src/lib/CherryUSB/demo/midi_template.c new file mode 100644 index 000000000..528254b82 --- /dev/null +++ b/src/lib/CherryUSB/demo/midi_template.c @@ -0,0 +1,258 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usb_midi.h" + +#define MIDI_OUT_EP 0x02 +#define MIDI_IN_EP 0x81 + +#define USBD_VID 0x0d28 +#define USBD_PID 0x0404 +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#define AUDIO_AC_SIZ AUDIO_SIZEOF_AC_HEADER_DESC(1) +#define AUDIO_MS_SIZ (7 + MIDI_SIZEOF_JACK_DESC + 9 + 5 + 9 + 5) + +#define USB_CONFIG_SIZE (unsigned long)(9 + \ + AUDIO_AC_DESCRIPTOR_LEN(1) + \ + MIDI_STANDARD_DESCRIPTOR_LEN + \ + AUDIO_MS_SIZ) + +#ifdef CONFIG_USB_HS +#define MIDI_EP_MPS 512 +#else +#define MIDI_EP_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, 0x00, 0x01), + MIDI_STANDARD_DESCRIPTOR_INIT(0x01, 0x02), + MIDI_CS_HEADER_DESCRIPTOR_INIT(AUDIO_MS_SIZ), + MIDI_JACK_DESCRIPTOR_INIT(0x01), + // OUT endpoint descriptor + 0x09, 0x05, MIDI_OUT_EP, 0x02, WBVAL(MIDI_EP_MPS), 0x00, 0x00, 0x00, + 0x05, 0x25, 0x01, 0x01, 0x01, + + // IN endpoint descriptor + 0x09, 0x05, MIDI_IN_EP, 0x02, WBVAL(MIDI_EP_MPS), 0x00, 0x00, 0x00, + 0x05, 0x25, 0x01, 0x01, 0x03 +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB MIDI DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor midi_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t midi_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, 0x00, 0x01), + MIDI_STANDARD_DESCRIPTOR_INIT(0x01, 0x02), + MIDI_CS_HEADER_DESCRIPTOR_INIT(AUDIO_MS_SIZ), + MIDI_JACK_DESCRIPTOR_INIT(0x01), + // OUT endpoint descriptor + 0x09, 0x05, MIDI_OUT_EP, 0x02, WBVAL(MIDI_EP_MPS), 0x00, 0x00, 0x00, + 0x05, 0x25, 0x01, 0x01, 0x01, + + // IN endpoint descriptor + 0x09, 0x05, MIDI_IN_EP, 0x02, WBVAL(MIDI_EP_MPS), 0x00, 0x00, 0x00, + 0x05, 0x25, 0x01, 0x01, 0x03 + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x28, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'M', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'D', 0x00, /* wcChar12 */ + 'I', 0x00, /* wcChar13 */ + ' ', 0x00, /* wcChar14 */ + 'D', 0x00, /* wcChar15 */ + 'E', 0x00, /* wcChar16 */ + 'M', 0x00, /* wcChar17 */ + 'O', 0x00, /* wcChar18 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '0', 0x00, /* wcChar4 */ + '3', 0x00, /* wcChar5 */ + '1', 0x00, /* wcChar6 */ + '0', 0x00, /* wcChar7 */ + '0', 0x00, /* wcChar8 */ + '0', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[MIDI_EP_MPS]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[MIDI_EP_MPS]; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + usbd_ep_start_read(busid, MIDI_OUT_EP, read_buffer, MIDI_EP_MPS); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_midi_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + usbd_ep_start_read(busid, MIDI_OUT_EP, read_buffer, MIDI_EP_MPS); +} + +void usbd_midi_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ +} + +struct usbd_interface intf0; +struct usbd_interface intf1; + +struct usbd_endpoint midi_out_ep = { + .ep_addr = MIDI_OUT_EP, + .ep_cb = usbd_midi_bulk_out +}; + +struct usbd_endpoint midi_in_ep = { + .ep_addr = MIDI_IN_EP, + .ep_cb = usbd_midi_bulk_in +}; + +void midi_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &midi_descriptor); +#else + usbd_desc_register(busid, midi_descriptor); +#endif + usbd_add_interface(busid, &intf0); + usbd_add_interface(busid, &intf1); + usbd_add_endpoint(busid, &midi_out_ep); + usbd_add_endpoint(busid, &midi_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/mongoose/cdc_rndis_mongoose.c b/src/lib/CherryUSB/demo/mongoose/cdc_rndis_mongoose.c new file mode 100644 index 000000000..0f571b571 --- /dev/null +++ b/src/lib/CherryUSB/demo/mongoose/cdc_rndis_mongoose.c @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_rndis.h" +#include "rndis_protocol.h" +#include "mongoose.h" + +#ifdef CONFIG_USBDEV_RNDIS_USING_LWIP +#error Do not define CONFIG_USBDEV_RNDIS_USING_LWIP in this demo +#endif + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_RNDIS_DESCRIPTOR_LEN) + +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor_hs[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_RNDIS_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, USB_BULK_EP_MPS_HS, 0x02), +}; + +static const uint8_t config_descriptor_fs[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_RNDIS_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, USB_BULK_EP_MPS_FS, 0x02), +}; + +static const uint8_t device_quality_descriptor[] = { + USB_DEVICE_QUALIFIER_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, 0x01), +}; + +static const uint8_t other_speed_config_descriptor_hs[] = { + USB_OTHER_SPEED_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_RNDIS_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, USB_BULK_EP_MPS_FS, 0x02), +}; + +static const uint8_t other_speed_config_descriptor_fs[] = { + USB_OTHER_SPEED_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_RNDIS_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, USB_BULK_EP_MPS_HS, 0x02), +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB RNDIS MONGOOSE DEMO", /* Product */ + "2025123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + (void)speed; + + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + if (speed == USB_SPEED_HIGH) { + return config_descriptor_hs; + } else if (speed == USB_SPEED_FULL) { + return config_descriptor_fs; + } else { + return NULL; + } +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + (void)speed; + + return device_quality_descriptor; +} + +static const uint8_t *other_speed_config_descriptor_callback(uint8_t speed) +{ + if (speed == USB_SPEED_HIGH) { + return other_speed_config_descriptor_hs; + } else if (speed == USB_SPEED_FULL) { + return other_speed_config_descriptor_fs; + } else { + return NULL; + } +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + (void)speed; + + if (index >= (sizeof(string_descriptors) / sizeof(char *))) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .other_speed_descriptor_callback = other_speed_config_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, +}; + +static uint8_t rndis_mac[6] = { 0x20, 0x89, 0x84, 0x6A, 0x96, 0xAA }; + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_rx_buffer[USB_ALIGN_UP(CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_tx_buffer[USB_ALIGN_UP(CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE, CONFIG_USB_ALIGN_SIZE)]; + +volatile bool g_rndis_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + (void)busid; + + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + g_rndis_tx_busy_flag = false; + usbd_rndis_start_read(g_rndis_rx_buffer, sizeof(g_rndis_rx_buffer)); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +static struct mg_tcpip_if *s_ifp; + +void usbd_rndis_data_recv_done(uint32_t len) +{ + (void)len; + + rndis_data_packet_t *hdr; + uint8_t *buf; + + hdr = (rndis_data_packet_t *)g_rndis_rx_buffer; + buf = (uint8_t *)hdr + hdr->DataOffset + sizeof(rndis_generic_msg_t); + + mg_tcpip_qwrite((void *)buf, hdr->DataLength, s_ifp); + + usbd_rndis_start_read(g_rndis_rx_buffer, sizeof(g_rndis_rx_buffer)); +} + +void usbd_rndis_data_send_done(uint32_t len) +{ + (void)len; + + g_rndis_tx_busy_flag = false; +} + +static size_t usb_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) +{ + (void)ifp; + rndis_data_packet_t *hdr; + + if (!usb_device_is_configured(0)) + return 0; + + hdr = (rndis_data_packet_t *)g_rndis_tx_buffer; + + memset(hdr, 0, sizeof(rndis_data_packet_t)); + hdr->MessageType = REMOTE_NDIS_PACKET_MSG; + hdr->MessageLength = sizeof(rndis_data_packet_t) + len; + hdr->DataOffset = sizeof(rndis_data_packet_t) - sizeof(rndis_generic_msg_t); + hdr->DataLength = len; + + memcpy(g_rndis_tx_buffer + sizeof(rndis_data_packet_t), buf, len); + + g_rndis_tx_busy_flag = true; + usbd_rndis_start_write(g_rndis_tx_buffer, sizeof(rndis_data_packet_t) + len); + while (g_rndis_tx_busy_flag) { + } + return len; +} + +static bool usb_poll(struct mg_tcpip_if *ifp, bool s1) +{ + (void)ifp; + + return s1 ? usb_device_is_configured(0) : false; +} + +struct mg_tcpip_driver driver = { .tx = usb_tx, .poll = usb_poll }; + +struct usbd_interface intf0; +struct usbd_interface intf1; + +struct mg_mgr mgr; // Initialise Mongoose event manager + +void cdc_rndis_mongoose_init(uint8_t busid, uint32_t reg_base) +{ + mg_mgr_init(&mgr); // and attach it to the interface + + static struct mg_tcpip_if mif = { .mac = { 2, 0, 1, 2, 3, 0x77 }, + .enable_dhcp_server = true, + .driver = &driver, + .recv_queue.size = 4096 }; + s_ifp = &mif; + + mif.ip = mg_htonl(MG_U32(192, 168, 7, 1)); + mif.mask = mg_htonl(MG_U32(255, 255, 255, 0)); + mg_tcpip_init(&mgr, &mif); + + web_init(&mgr); + + usbd_desc_register(busid, &cdc_descriptor); + usbd_add_interface(busid, usbd_rndis_init_intf(&intf0, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, rndis_mac)); + usbd_add_interface(busid, usbd_rndis_init_intf(&intf1, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, rndis_mac)); + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +// call mg_mgr_poll(&mgr, 0); in main loop \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/mongoose/mongoose.png b/src/lib/CherryUSB/demo/mongoose/mongoose.png new file mode 100644 index 000000000..974ff58e6 Binary files /dev/null and b/src/lib/CherryUSB/demo/mongoose/mongoose.png differ diff --git a/src/lib/CherryUSB/demo/mongoose/mongoose_config.h b/src/lib/CherryUSB/demo/mongoose/mongoose_config.h new file mode 100644 index 000000000..22e957d7d --- /dev/null +++ b/src/lib/CherryUSB/demo/mongoose/mongoose_config.h @@ -0,0 +1,22 @@ +#pragma once + +// See https://mongoose.ws/documentation/#build-options +#define MG_ARCH MG_ARCH_CUSTOM + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MG_ENABLE_TCPIP 1 +#define MG_ENABLE_CUSTOM_MILLIS 1 +#define MG_ENABLE_CUSTOM_RANDOM 1 +#define MG_ENABLE_PACKED_FS 1 +#define MG_IO_SIZE 1460 diff --git a/src/lib/CherryUSB/demo/msc_ram_template.c b/src/lib/CherryUSB/demo/msc_ram_template.c new file mode 100644 index 000000000..ac7d9dbd0 --- /dev/null +++ b/src/lib/CherryUSB/demo/msc_ram_template.c @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_msc.h" + +#define MSC_IN_EP 0x81 +#define MSC_OUT_EP 0x02 + +#define USBD_VID 0xFFFF +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#define USB_CONFIG_SIZE (9 + MSC_DESCRIPTOR_LEN) + +#ifdef CONFIG_USB_HS +#define MSC_MAX_MPS 512 +#else +#define MSC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MSC_DESCRIPTOR_INIT(0x00, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB MSC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor msc_ram_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t msc_ram_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MSC_DESCRIPTOR_INIT(0x00, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'M', 0x00, /* wcChar10 */ + 'S', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +#if !defined(RT_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV) && !defined(PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV) +#define BLOCK_SIZE 512 +#define BLOCK_COUNT 10 + +typedef struct +{ + uint8_t BlockSpace[BLOCK_SIZE]; +} BLOCK_TYPE; + +BLOCK_TYPE mass_block[BLOCK_COUNT]; + +void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size) +{ + *block_num = 1000; //Pretend having so many buffer,not has actually. + *block_size = BLOCK_SIZE; +} +int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (sector < BLOCK_COUNT) + memcpy(buffer, mass_block[sector].BlockSpace, length); + return 0; +} + +int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (sector < BLOCK_COUNT) + memcpy(mass_block[sector].BlockSpace, buffer, length); + return 0; +} +#else +#include +#include + +#ifndef CONFIG_USBDEV_MSC_THREAD +#error "Please enable CONFIG_USBDEV_MSC_THREAD, move msc read & write from isr to thread" +#endif + +#ifndef CONFIG_USBDEV_MSC_BLOCK_DEV_NAME +#define CONFIG_USBDEV_MSC_BLOCK_DEV_NAME "sd0" +#endif + +static rt_device_t blk_dev = RT_NULL; +struct rt_device_blk_geometry geometry = { 0 }; + +void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size) +{ + rt_device_control(blk_dev, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry); + + *block_num = geometry.sector_count; + *block_size = geometry.bytes_per_sector; +} + +int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + rt_device_read(blk_dev, sector, buffer, length / geometry.bytes_per_sector); + return 0; +} + +int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + rt_device_write(blk_dev, sector, buffer, length / geometry.bytes_per_sector); + return 0; +} +#endif + +static struct usbd_interface intf0; + +void msc_ram_init(uint8_t busid, uintptr_t reg_base) +{ +#if defined(RT_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV) || defined(PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV) + rt_err_t res; + + blk_dev = rt_device_find(CONFIG_USBDEV_MSC_BLOCK_DEV_NAME); + RT_ASSERT(blk_dev); + + res = rt_device_open(blk_dev, RT_DEVICE_OFLAG_RDWR); + RT_ASSERT(res == RT_EOK); +#endif +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &msc_ram_descriptor); +#else + usbd_desc_register(busid, msc_ram_descriptor); +#endif + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf0, MSC_OUT_EP, MSC_IN_EP)); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +#if defined(CONFIG_USBDEV_MSC_POLLING) +void msc_ram_polling(uint8_t busid) +{ + usbd_msc_polling(busid); +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/mtp_template.c b/src/lib/CherryUSB/demo/mtp_template.c new file mode 100644 index 000000000..11950d265 --- /dev/null +++ b/src/lib/CherryUSB/demo/mtp_template.c @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2025 sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +#include "usbd_core.h" +#include "usbd_mtp.h" + +#if 1 +#error "commercial charge" +#endif + +#ifndef CONFIG_USBDEV_MTP_THREAD +#warning mtp depends on filesystem, suggest to enable CONFIG_USBDEV_MTP_THREAD +#endif + +#define WCID_VENDOR_CODE 0x01 + +__ALIGN_BEGIN const uint8_t WCID_StringDescriptor_MSOS[18] __ALIGN_END = { + /////////////////////////////////////// + /// MS OS string descriptor + /////////////////////////////////////// + 0x12, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + /* MSFT100 */ + 'M', 0x00, 'S', 0x00, 'F', 0x00, 'T', 0x00, /* wcChar_7 */ + '1', 0x00, '0', 0x00, '0', 0x00, /* wcChar_7 */ + WCID_VENDOR_CODE, /* bVendorCode */ + 0x00, /* bReserved */ +}; + +__ALIGN_BEGIN const uint8_t WINUSB_WCIDDescriptor[40] __ALIGN_END = { + /////////////////////////////////////// + /// WCID descriptor + /////////////////////////////////////// + 0x28, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x04, 0x00, /* wIndex */ + 0x01, /* bCount */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_7 */ + + /////////////////////////////////////// + /// WCID function descriptor + /////////////////////////////////////// + 0x00, /* bFirstInterfaceNumber */ + 0x01, /* bReserved */ + /* MTP */ + 'M', 'T', 'P', 0x00, 0x00, 0x00, 0x00, 0x00, /* cCID_8 */ + /* */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* cSubCID_8 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_6 */ +}; + +__ALIGN_BEGIN const uint8_t WINUSB_IF0_WCIDProperties[142] __ALIGN_END = { + /////////////////////////////////////// + /// WCID property descriptor + /////////////////////////////////////// + 0x8e, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x05, 0x00, /* wIndex */ + 0x01, 0x00, /* wCount */ + + /////////////////////////////////////// + /// registry propter descriptor + /////////////////////////////////////// + 0x84, 0x00, 0x00, 0x00, /* dwSize */ + 0x01, 0x00, 0x00, 0x00, /* dwPropertyDataType */ + 0x28, 0x00, /* wPropertyNameLength */ + /* DeviceInterfaceGUID */ + 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, /* wcName_20 */ + 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, /* wcName_20 */ + 't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00, /* wcName_20 */ + 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, /* wcName_20 */ + 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00, /* wcName_20 */ + 0x4e, 0x00, 0x00, 0x00, /* dwPropertyDataLength */ + + /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */ + '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00, /* wcData_39 */ + 'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00, /* wcData_39 */ + '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00, /* wcData_39 */ + '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00, /* wcData_39 */ + '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00, /* wcData_39 */ + 'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00, /* wcData_39 */ + '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00, /* wcData_39 */ + 'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00, /* wcData_39 */ + 'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00, /* wcData_39 */ + '6', 0x00, '}', 0x00, 0x00, 0x00, /* wcData_39 */ + +}; + +const uint8_t bos_descriptor[] = { + 0x05, 0x0f, 0x16, 0x00, 0x02, + 0x07, 0x10, 0x02, 0x06, 0x00, 0x00, 0x00, + 0x0a, 0x10, 0x03, 0x00, 0x0f, 0x00, 0x01, 0x01, 0xf4, 0x01 +}; + +/*!< endpoint address */ +#define MTP_IN_EP 0x81 +#define MTP_OUT_EP 0x02 +#define MTP_INT_EP 0x83 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + MTP_DESCRIPTOR_LEN) + +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0201, 0x01) +}; + +static const uint8_t config_descriptor_hs[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MTP_DESCRIPTOR_INIT(0x00, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP, USB_BULK_EP_MPS_HS, 0x02), +}; + +static const uint8_t config_descriptor_fs[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MTP_DESCRIPTOR_INIT(0x00, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP, USB_BULK_EP_MPS_FS, 0x02), +}; + +static const uint8_t device_quality_descriptor[] = { + USB_DEVICE_QUALIFIER_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, 0x01), +}; + +static const uint8_t other_speed_config_descriptor_hs[] = { + USB_OTHER_SPEED_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MTP_DESCRIPTOR_INIT(0x00, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP, USB_BULK_EP_MPS_FS, 0x02), +}; + +static const uint8_t other_speed_config_descriptor_fs[] = { + USB_OTHER_SPEED_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + MTP_DESCRIPTOR_INIT(0x00, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP, USB_BULK_EP_MPS_HS, 0x02), +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB MTP DEMO", /* Product */ + "2025053000", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + (void)speed; + + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + if (speed == USB_SPEED_HIGH) { + return config_descriptor_hs; + } else if (speed == USB_SPEED_FULL) { + return config_descriptor_fs; + } else { + return NULL; + } +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + (void)speed; + + return device_quality_descriptor; +} + +static const uint8_t *other_speed_config_descriptor_callback(uint8_t speed) +{ + if (speed == USB_SPEED_HIGH) { + return other_speed_config_descriptor_hs; + } else if (speed == USB_SPEED_FULL) { + return other_speed_config_descriptor_fs; + } else { + return NULL; + } +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + (void)speed; + + if (index >= (sizeof(string_descriptors) / sizeof(char *))) { + return NULL; + } + return string_descriptors[index]; +} + +const uint8_t *WINUSB_IFx_WCIDProperties[] = { + WINUSB_IF0_WCIDProperties, +}; + +struct usb_msosv1_descriptor msosv1_desc = { + .string = WCID_StringDescriptor_MSOS, + .vendor_code = WCID_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .comp_id_property = WINUSB_IFx_WCIDProperties, +}; + +const struct usb_bos_descriptor bos_desc = { + .string = bos_descriptor, + .string_len = 22 +}; + +const struct usb_descriptor mtp_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .other_speed_descriptor_callback = other_speed_config_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .bos_descriptor = &bos_desc, + .msosv1_descriptor = &msosv1_desc, +}; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +static struct usbd_interface intf0; + +extern void usbd_mtp_mount(); + +void mtp_init(uint8_t busid, uint32_t reg_base) +{ + usbd_mtp_mount(); + + usbd_desc_register(busid, &mtp_descriptor); + usbd_add_interface(busid, usbd_mtp_init_intf(&intf0, MTP_OUT_EP, MTP_IN_EP, MTP_INT_EP)); + usbd_initialize(busid, reg_base, usbd_event_handler); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/music_16k_ac2.h b/src/lib/CherryUSB/demo/music_16k_ac2.h new file mode 100644 index 000000000..cb8388d7f --- /dev/null +++ b/src/lib/CherryUSB/demo/music_16k_ac2.h @@ -0,0 +1,78605 @@ +const unsigned char music[943233] = { + 0x43, 0xEC, 0xC0, 0xF9, 0xC7, 0xFD, 0x22, 0x06, 0x04, 0x13, 0x76, 0xFA, + 0x90, 0x17, 0x87, 0xF6, 0x3A, 0x12, 0x3E, 0xFA, 0xCA, 0x10, 0x28, 0x02, + 0xF7, 0x0D, 0xFA, 0x0F, 0xFA, 0x0D, 0x8A, 0x16, 0x71, 0x12, 0xAC, 0x1A, + 0x82, 0x08, 0x5F, 0x17, 0x89, 0xFD, 0x5E, 0x22, 0xB3, 0x01, 0x10, 0x2F, + 0x43, 0x07, 0xC4, 0x1F, 0x4E, 0x08, 0x45, 0x15, 0x5A, 0xFC, 0x81, 0x1F, + 0xCA, 0xF8, 0x14, 0x21, 0x16, 0x0E, 0x3C, 0x11, 0xCF, 0x20, 0x05, 0x0F, + 0x32, 0x1C, 0x78, 0x20, 0x55, 0x0E, 0x34, 0x2E, 0xFF, 0x0C, 0xE2, 0x2E, + 0x22, 0x11, 0xD7, 0x28, 0x09, 0x0E, 0xDA, 0x22, 0x1B, 0x03, 0xB3, 0x1F, + 0x2E, 0xF9, 0x95, 0x21, 0x27, 0x02, 0x55, 0x1F, 0x7E, 0x21, 0x3E, 0x12, + 0x27, 0x34, 0x12, 0x0E, 0x03, 0x2D, 0xFB, 0x16, 0x68, 0x1F, 0x28, 0x17, + 0xDE, 0x18, 0xC2, 0x04, 0xB3, 0x18, 0xA9, 0xF7, 0xB5, 0x16, 0x53, 0xFB, + 0x1C, 0x19, 0x29, 0xFE, 0xCD, 0x1B, 0x87, 0xF4, 0xA7, 0x14, 0x54, 0xEB, + 0x9B, 0x0E, 0xBB, 0xF0, 0x61, 0x08, 0x8F, 0x04, 0xF8, 0xFD, 0x31, 0x0D, + 0x2C, 0xF9, 0xCD, 0x08, 0x44, 0xF7, 0x41, 0x09, 0xB9, 0xFE, 0xA7, 0x04, + 0x42, 0x01, 0x0D, 0x0F, 0x29, 0xF5, 0x54, 0x13, 0x93, 0xE6, 0x90, 0x08, + 0xEB, 0xD8, 0x04, 0x07, 0x65, 0xDC, 0x5A, 0x07, 0xB9, 0xEA, 0xEA, 0x05, + 0x1B, 0xF7, 0x1B, 0xF7, 0x31, 0xFD, 0xF1, 0xE8, 0x25, 0x00, 0xE9, 0xEB, + 0x6C, 0xFF, 0xA0, 0xFB, 0xEC, 0xFA, 0x12, 0x06, 0x09, 0xFC, 0x82, 0xFD, + 0xCB, 0xFE, 0x02, 0xF0, 0xFD, 0xFD, 0xC7, 0xEA, 0x50, 0xF4, 0x65, 0xF0, + 0x88, 0xE3, 0x13, 0xFE, 0x8D, 0xD3, 0x6C, 0x07, 0xB9, 0xC9, 0x74, 0x0C, + 0x45, 0xD5, 0xBD, 0x08, 0xA4, 0xE9, 0xC2, 0x08, 0x3D, 0xF1, 0x27, 0x0D, + 0x9C, 0xF2, 0x77, 0x0C, 0x3E, 0xEA, 0x38, 0x0D, 0x70, 0xE9, 0x92, 0x00, + 0x78, 0xF1, 0x0A, 0xE9, 0x9F, 0xF4, 0x89, 0xD8, 0x7D, 0xF8, 0xFA, 0xCF, + 0x8E, 0xF1, 0xC3, 0xCB, 0x8C, 0xE8, 0x34, 0xCF, 0x23, 0xF3, 0xF0, 0xDD, + 0xE8, 0x01, 0x26, 0xED, 0x86, 0xFC, 0xE6, 0xF8, 0x9A, 0xEF, 0x30, 0xFF, + 0x50, 0xEC, 0xAE, 0xF7, 0xD5, 0xE5, 0x72, 0xF0, 0x21, 0xE5, 0xE0, 0xF4, + 0x1A, 0xF7, 0x80, 0x00, 0x26, 0x05, 0x4E, 0xFC, 0x32, 0x06, 0x26, 0xF1, + 0xEF, 0x03, 0x7A, 0xFB, 0xB3, 0x01, 0xF2, 0x07, 0x1F, 0x01, 0xFD, 0x02, + 0x99, 0x04, 0xEA, 0xFB, 0x5A, 0x0B, 0xD7, 0xF9, 0x80, 0x14, 0xB2, 0xED, + 0x43, 0x18, 0x57, 0xE1, 0xFB, 0x06, 0x59, 0xF0, 0xC0, 0xEC, 0xC3, 0xFA, + 0x9D, 0xE7, 0xDD, 0xF6, 0x28, 0xF2, 0xA0, 0xFF, 0x51, 0xFD, 0xC2, 0xFE, + 0x7E, 0x07, 0x21, 0xF6, 0x4F, 0xFF, 0x53, 0xF6, 0x3A, 0xF1, 0x2A, 0xF0, + 0xF6, 0xEA, 0x66, 0xEA, 0xB0, 0xD9, 0xF7, 0xEB, 0x1E, 0xCB, 0xFD, 0xEF, + 0xCB, 0xC7, 0xFD, 0xF3, 0xEE, 0xC7, 0x8E, 0xF5, 0x1D, 0xD4, 0x93, 0xE5, + 0x5B, 0xE8, 0xBC, 0xCD, 0x24, 0xFA, 0xDB, 0xD7, 0x7F, 0x06, 0x0D, 0xE7, + 0x33, 0x0B, 0xD5, 0xD7, 0xCD, 0x03, 0x85, 0xCE, 0x63, 0xF1, 0x45, 0xDC, + 0x7A, 0xE2, 0xC5, 0xDF, 0x91, 0xD6, 0xF4, 0xDE, 0xF7, 0xCC, 0xAC, 0xE1, + 0x09, 0xCF, 0xAE, 0xDE, 0xC5, 0xC7, 0x69, 0xE6, 0xE8, 0xB4, 0x15, 0xFB, + 0x38, 0xB0, 0x09, 0x04, 0x04, 0xC0, 0x21, 0xED, 0x93, 0xDF, 0xB9, 0xCF, + 0x54, 0xF6, 0x4D, 0xD0, 0x28, 0xFB, 0x12, 0xD5, 0x5D, 0xF8, 0x8A, 0xD3, + 0x3F, 0xF7, 0xFF, 0xD8, 0xF1, 0xFF, 0x22, 0xDB, 0xCF, 0xFE, 0xAA, 0xE9, + 0x9F, 0xF6, 0xEE, 0xF9, 0xFC, 0xFA, 0x32, 0xF6, 0xAE, 0x03, 0x93, 0xF5, + 0xA2, 0x04, 0x36, 0xFD, 0x53, 0xFA, 0xD8, 0x0B, 0x5D, 0xEB, 0xDA, 0x12, + 0xDA, 0xE7, 0x38, 0x02, 0xF5, 0xEE, 0x3B, 0xF4, 0x6B, 0xF2, 0x47, 0xED, + 0x80, 0xF7, 0xFA, 0xF2, 0x8C, 0x00, 0x40, 0xFD, 0xD6, 0x06, 0x3B, 0xFC, + 0x0A, 0x11, 0x6A, 0xF9, 0x60, 0x1A, 0x7C, 0xFC, 0xF3, 0x17, 0xF0, 0x01, + 0x0B, 0x17, 0xD3, 0x05, 0xC9, 0x18, 0xD0, 0x0A, 0xDF, 0x18, 0x25, 0x0D, + 0xED, 0x1E, 0xF4, 0x05, 0x3B, 0x1C, 0xA4, 0xFE, 0x90, 0x09, 0xC0, 0xFC, + 0xEC, 0xF7, 0x0F, 0x00, 0x87, 0xF1, 0xAA, 0x0E, 0xEF, 0xF6, 0xE1, 0x11, + 0xD4, 0xF5, 0x77, 0x07, 0xCE, 0xEF, 0x3B, 0x01, 0x82, 0xED, 0x5C, 0xF6, + 0x8B, 0xE6, 0x83, 0xE3, 0xB7, 0xE4, 0x76, 0xD3, 0x29, 0xE0, 0x7C, 0xCA, + 0x7F, 0xDE, 0x6D, 0xC8, 0x1B, 0xEA, 0x3B, 0xD2, 0xCC, 0xFA, 0x87, 0xDD, + 0x49, 0x0E, 0x09, 0xDB, 0x48, 0x11, 0x32, 0xCE, 0x85, 0xFE, 0x57, 0xC9, + 0x43, 0xEC, 0x03, 0xC8, 0xAA, 0xDF, 0xC7, 0xBD, 0xC1, 0xD9, 0xC3, 0xC2, + 0x4D, 0xE2, 0xE3, 0xCC, 0xD5, 0xE9, 0x2B, 0xDA, 0xDE, 0xE0, 0xEB, 0xEE, + 0xCE, 0xD6, 0xB8, 0xFC, 0x84, 0xD7, 0x51, 0xFC, 0x98, 0xD7, 0x61, 0xEE, + 0xD7, 0xDA, 0x15, 0xE5, 0xFF, 0xDF, 0xF3, 0xD9, 0xC1, 0xDF, 0x81, 0xC9, + 0x9B, 0xDE, 0x1C, 0xCC, 0x31, 0xD4, 0x60, 0xD9, 0xAE, 0xCE, 0xA3, 0xE8, + 0xCA, 0xDC, 0x16, 0xFF, 0x99, 0xEE, 0xAE, 0xFA, 0xCB, 0xFE, 0xA7, 0xEB, + 0xB9, 0x00, 0x61, 0xEE, 0xC1, 0xF3, 0xE4, 0xF9, 0x49, 0xE6, 0x06, 0x00, + 0x99, 0xE9, 0x8A, 0xFA, 0xB8, 0x04, 0xC9, 0xF1, 0xFA, 0x0E, 0xDB, 0xEC, + 0xF4, 0x00, 0xD0, 0xE9, 0xD5, 0xF3, 0xB4, 0xED, 0xAF, 0xF4, 0xE8, 0xE8, + 0xB1, 0x02, 0x7B, 0xDA, 0x2D, 0x0C, 0xED, 0xDA, 0x6B, 0x0C, 0x64, 0xE6, + 0xBD, 0x0B, 0x2E, 0xFB, 0x80, 0x0C, 0x5F, 0x02, 0x52, 0x0B, 0x2D, 0x06, + 0xFB, 0x0A, 0x6A, 0x13, 0x55, 0x0B, 0x08, 0x13, 0x62, 0x10, 0x3F, 0x12, + 0x42, 0x16, 0xE6, 0x1A, 0x0C, 0x0E, 0xBF, 0x14, 0x4D, 0x00, 0x3A, 0x18, + 0x46, 0xF2, 0xA4, 0x22, 0x56, 0xF4, 0x4B, 0x19, 0xB4, 0x08, 0x12, 0x0C, + 0x00, 0x08, 0xA2, 0x00, 0xC4, 0xFC, 0x73, 0xFC, 0xB0, 0xF8, 0xCF, 0xF9, + 0xA4, 0xF1, 0x37, 0xF8, 0x01, 0xF1, 0x5A, 0xF0, 0x5B, 0xFC, 0x3E, 0xDF, + 0x27, 0x09, 0x75, 0xD4, 0xFA, 0x03, 0x3B, 0xD9, 0x52, 0xF6, 0xD8, 0xD2, + 0x79, 0xF7, 0xDE, 0xD3, 0x6F, 0xF4, 0xA7, 0xE3, 0xC4, 0xE9, 0x35, 0xE6, + 0x5B, 0xE3, 0xA3, 0xEB, 0xE3, 0xDE, 0xF8, 0xF4, 0x62, 0xE0, 0x69, 0xFC, + 0x8D, 0xE3, 0x02, 0xFF, 0xB1, 0xF0, 0x40, 0xFE, 0x59, 0x04, 0x92, 0xF5, + 0xE0, 0x07, 0x6E, 0xEA, 0x1E, 0xFE, 0xB2, 0xE3, 0x18, 0xFB, 0x9B, 0xD9, + 0x5C, 0xFB, 0xF5, 0xD0, 0x0F, 0xFA, 0x8A, 0xD8, 0x2E, 0x00, 0x7D, 0xDF, + 0xA3, 0x07, 0x10, 0xE6, 0xAC, 0x02, 0xFA, 0xF6, 0x11, 0xF2, 0xDD, 0x06, + 0x35, 0xE4, 0x23, 0x11, 0x15, 0xE5, 0x49, 0x19, 0x38, 0xED, 0xE3, 0x26, + 0xCF, 0xFD, 0x54, 0x26, 0x37, 0x0E, 0x3E, 0x12, 0x6C, 0x0C, 0x61, 0x12, + 0xB0, 0x11, 0x67, 0x22, 0x10, 0x1C, 0xF1, 0x23, 0x39, 0x21, 0xDD, 0x20, + 0x0A, 0x28, 0xAA, 0x1F, 0x85, 0x2C, 0x4F, 0x1D, 0x52, 0x25, 0x25, 0x1C, + 0x5C, 0x1F, 0x23, 0x1F, 0xE5, 0x1E, 0x49, 0x20, 0x17, 0x17, 0x01, 0x1A, + 0x9C, 0x14, 0x12, 0x16, 0x33, 0x1B, 0xCD, 0x25, 0xA4, 0x1D, 0xB4, 0x34, + 0xB1, 0x16, 0x35, 0x37, 0x03, 0x0D, 0x45, 0x38, 0x9B, 0x0D, 0x6C, 0x41, + 0x2D, 0x17, 0x24, 0x47, 0x5E, 0x19, 0xA6, 0x2F, 0x8C, 0x0F, 0xDF, 0x11, + 0x7C, 0x04, 0x5A, 0x06, 0x8D, 0x04, 0x03, 0x09, 0x9F, 0x13, 0x3F, 0x13, + 0x61, 0x2A, 0x1A, 0x12, 0x76, 0x35, 0x31, 0x0C, 0x72, 0x38, 0x1D, 0x11, + 0x3E, 0x32, 0x6A, 0x12, 0xB5, 0x27, 0x05, 0x0E, 0x0D, 0x20, 0x1E, 0x05, + 0x0A, 0x13, 0xBE, 0xFE, 0xC1, 0x04, 0x8D, 0x01, 0x6D, 0xF7, 0x26, 0x0C, + 0x39, 0xED, 0x4E, 0x08, 0xCD, 0xF4, 0x3D, 0xFA, 0x89, 0x0D, 0xEB, 0xF8, + 0x8A, 0x13, 0x24, 0x05, 0x06, 0x05, 0x0C, 0x0F, 0x15, 0x07, 0x26, 0x0A, + 0xBF, 0x17, 0x59, 0xF9, 0xC0, 0x19, 0xF6, 0xEB, 0x8D, 0x0C, 0x29, 0xF4, + 0xA2, 0x07, 0x1E, 0x00, 0x91, 0x0C, 0x6D, 0xF9, 0x17, 0x0C, 0x4B, 0xF2, + 0xFA, 0x11, 0x83, 0xF8, 0xD3, 0x1C, 0x10, 0x03, 0x76, 0x24, 0x4B, 0x12, + 0x13, 0x31, 0xA9, 0x22, 0x6F, 0x2B, 0x4E, 0x3B, 0x0D, 0x10, 0xCA, 0x40, + 0xD5, 0xFF, 0x18, 0x34, 0x7D, 0xF6, 0xB0, 0x30, 0xEA, 0xF7, 0x2C, 0x31, + 0x7C, 0x0B, 0x5C, 0x31, 0x10, 0x13, 0x57, 0x35, 0xF1, 0x11, 0xCA, 0x39, + 0xE7, 0x15, 0x8F, 0x2E, 0x94, 0x1A, 0x4E, 0x23, 0x0E, 0x28, 0x5B, 0x26, + 0x93, 0x31, 0x78, 0x2C, 0x22, 0x29, 0xAD, 0x27, 0x0C, 0x17, 0xED, 0x25, + 0x30, 0x0D, 0xD9, 0x38, 0xF3, 0x17, 0xC3, 0x3B, 0x05, 0x1D, 0xEE, 0x29, + 0x88, 0x14, 0x4D, 0x26, 0xF5, 0x0E, 0x19, 0x22, 0x34, 0x16, 0xB6, 0x22, + 0x55, 0x1F, 0xA7, 0x2C, 0x5F, 0x17, 0x63, 0x2F, 0x54, 0x0D, 0xB2, 0x29, + 0x93, 0x06, 0xCA, 0x22, 0x40, 0x04, 0xC9, 0x13, 0xB1, 0x0A, 0xEF, 0x03, + 0x2A, 0x13, 0x91, 0x00, 0x4B, 0x2A, 0x74, 0xFE, 0xFF, 0x40, 0x09, 0x04, + 0x27, 0x43, 0xE5, 0x08, 0x1E, 0x3A, 0x44, 0x07, 0x47, 0x28, 0x2E, 0x09, + 0x5B, 0x17, 0xD7, 0x08, 0x1F, 0x01, 0xEF, 0x01, 0x5D, 0xF8, 0x1D, 0xF7, + 0x33, 0x08, 0xF0, 0xF4, 0xC4, 0x07, 0x04, 0xFC, 0x71, 0xF5, 0xBA, 0x01, + 0xDE, 0xE4, 0x17, 0x11, 0x32, 0xE4, 0x8A, 0x1F, 0x67, 0xF3, 0xB0, 0x19, + 0xEA, 0x01, 0xCA, 0x0B, 0x8E, 0x08, 0xBB, 0x07, 0xF2, 0xFE, 0x22, 0x00, + 0xBF, 0xFB, 0x63, 0xF5, 0xAC, 0x06, 0x06, 0xF9, 0xBF, 0x06, 0xB7, 0x00, + 0x1F, 0xFE, 0xFD, 0x06, 0xF1, 0xFA, 0x59, 0x0C, 0x2C, 0x00, 0x74, 0x15, + 0x7C, 0x06, 0x63, 0x24, 0x39, 0x13, 0x32, 0x25, 0xBC, 0x1D, 0xCC, 0x1B, + 0x05, 0x1C, 0x57, 0x17, 0x7B, 0x18, 0xDD, 0x17, 0x64, 0x07, 0x3E, 0x14, + 0x9A, 0xF7, 0x9B, 0x11, 0x94, 0x01, 0x17, 0x14, 0x26, 0x0F, 0xC9, 0x08, + 0x8F, 0x17, 0xE2, 0x01, 0xFB, 0x19, 0x11, 0xFC, 0x66, 0x18, 0x2C, 0xF3, + 0xB1, 0x18, 0x22, 0xFF, 0xA5, 0x12, 0x46, 0x13, 0x49, 0x14, 0xA1, 0x18, + 0x91, 0x1E, 0x79, 0x15, 0xF5, 0x24, 0xA1, 0x13, 0xDA, 0x1A, 0x3E, 0x12, + 0x0A, 0xFD, 0x36, 0x21, 0xAB, 0xEE, 0x60, 0x33, 0x5A, 0xFA, 0x83, 0x34, + 0x97, 0x03, 0x08, 0x2C, 0xD4, 0xFB, 0x8A, 0x24, 0x9E, 0xF2, 0x1A, 0x1F, + 0x39, 0xF3, 0x04, 0x10, 0x9B, 0xF6, 0x88, 0x01, 0xF3, 0xFE, 0xC2, 0x01, + 0x24, 0x04, 0xE9, 0x02, 0xB3, 0xFE, 0x7B, 0xFA, 0x96, 0xFB, 0x14, 0xF1, + 0x0C, 0xF8, 0x97, 0xF8, 0xEC, 0xF5, 0x92, 0x04, 0xF9, 0xF6, 0x51, 0xFB, + 0xA7, 0xFA, 0xB4, 0xEC, 0x22, 0x00, 0x19, 0xE7, 0x31, 0xF5, 0xBC, 0xE3, + 0xE5, 0xE3, 0x9D, 0xE3, 0x51, 0xDC, 0x98, 0xE8, 0x70, 0xE6, 0xE9, 0xEF, + 0x8F, 0xFE, 0xAE, 0xF9, 0xF2, 0x09, 0xD1, 0x02, 0x5C, 0x09, 0x6E, 0x07, + 0x04, 0x04, 0x6D, 0x08, 0x33, 0xF5, 0x09, 0xFE, 0x8C, 0xE8, 0x4D, 0xEF, + 0x78, 0xE7, 0x31, 0xEC, 0xF9, 0xEB, 0xE1, 0xEE, 0x4F, 0xED, 0x88, 0xEE, + 0x6F, 0xFC, 0xC8, 0xF1, 0x45, 0x11, 0x76, 0xF5, 0x71, 0x15, 0x17, 0xF2, + 0xBD, 0x13, 0x80, 0xEB, 0x90, 0x11, 0x86, 0xF0, 0x61, 0x0C, 0x03, 0x02, + 0xE8, 0x06, 0xCE, 0x0F, 0x27, 0x03, 0xE0, 0x13, 0x50, 0xFD, 0x8B, 0x12, + 0xED, 0xF7, 0xF7, 0x0C, 0xF6, 0xF6, 0xD3, 0x02, 0x32, 0xF7, 0x91, 0xFA, + 0xE1, 0xFF, 0x66, 0xF4, 0xA3, 0x0D, 0x6C, 0xF3, 0x3E, 0x0B, 0xD3, 0xF1, + 0xA2, 0x06, 0x01, 0xF2, 0xEC, 0x07, 0xC9, 0xEF, 0x6D, 0x09, 0x6B, 0xED, + 0xAD, 0x04, 0x84, 0xF0, 0x1C, 0xF7, 0x18, 0xFA, 0xED, 0xF8, 0xDE, 0x08, + 0x8F, 0xFC, 0x98, 0x12, 0x03, 0xEA, 0x1D, 0x1C, 0x9E, 0xE1, 0xAB, 0x1E, + 0xD9, 0xE3, 0xD2, 0x22, 0xD1, 0xE5, 0x88, 0x1E, 0x8C, 0xEC, 0x71, 0x09, + 0x65, 0xEE, 0x79, 0xFA, 0x3E, 0xE9, 0x35, 0xF1, 0xEB, 0xE6, 0x80, 0xE3, + 0x1F, 0xF4, 0xC5, 0xD8, 0xDA, 0xFC, 0x88, 0xDA, 0x39, 0xFE, 0xD8, 0xE0, + 0x42, 0x0A, 0x00, 0xE2, 0x53, 0x06, 0x52, 0xE2, 0x27, 0xF1, 0x92, 0xE1, + 0xDE, 0xED, 0xC1, 0xDF, 0x10, 0xF2, 0x06, 0xDC, 0x1B, 0xED, 0x14, 0xD4, + 0x46, 0xDD, 0xA4, 0xD8, 0x9D, 0xD0, 0x61, 0xE7, 0x2C, 0xD2, 0x9C, 0xEC, + 0x3C, 0xE2, 0x0F, 0xE9, 0xE9, 0xF0, 0xEE, 0xE9, 0x07, 0xF3, 0xC5, 0xEC, + 0x6A, 0xFA, 0xF8, 0xE5, 0xFD, 0x05, 0xF7, 0xE0, 0x85, 0x05, 0xB1, 0xE7, + 0xDB, 0xF7, 0x9B, 0xE6, 0x71, 0xE9, 0x5C, 0xDE, 0xB3, 0xE3, 0xFC, 0xDB, + 0x74, 0xF0, 0x88, 0xD9, 0x1E, 0x02, 0x9A, 0xDA, 0x60, 0xFC, 0x64, 0xE7, + 0x99, 0xF6, 0x7E, 0xF5, 0x32, 0x00, 0xC5, 0xF6, 0x0D, 0x06, 0x75, 0xF6, + 0xE5, 0x01, 0xE7, 0xFE, 0x58, 0xEF, 0xB0, 0x06, 0x06, 0xE5, 0xC7, 0x02, + 0x26, 0xEA, 0x06, 0xF9, 0xB7, 0xED, 0x2A, 0xF3, 0x9D, 0xF4, 0x20, 0xEF, + 0xEE, 0xF6, 0xD9, 0xE7, 0x3D, 0xEB, 0xFA, 0xE9, 0xBD, 0xDF, 0x6F, 0xF2, + 0x49, 0xD9, 0xD0, 0xF4, 0x6C, 0xE7, 0x92, 0xF7, 0x23, 0xFE, 0x26, 0xFA, + 0x7E, 0xFB, 0xD2, 0xF7, 0x57, 0xEF, 0x49, 0xEE, 0x44, 0xF3, 0x1A, 0xEA, + 0xD4, 0xF6, 0x23, 0xF0, 0xE1, 0xE7, 0x98, 0xF7, 0xD8, 0xDC, 0x4E, 0xFB, + 0x5E, 0xED, 0x3E, 0x02, 0x82, 0x05, 0xCB, 0x03, 0x96, 0x04, 0xA0, 0x01, + 0x55, 0xF1, 0x5D, 0x03, 0xE2, 0xDF, 0x8C, 0xF4, 0x11, 0xD9, 0xE1, 0xDD, + 0x59, 0xE8, 0xD6, 0xD1, 0xED, 0x01, 0x39, 0xD8, 0xC5, 0x0D, 0x45, 0xE5, + 0xB8, 0x05, 0x7C, 0xDF, 0x92, 0xF5, 0x04, 0xDF, 0x35, 0xED, 0xC3, 0xE7, + 0xEA, 0xE2, 0x81, 0xEA, 0x51, 0xD6, 0xBD, 0xEB, 0xE5, 0xD0, 0x69, 0xE4, + 0x61, 0xD6, 0x20, 0xDF, 0x9B, 0xD7, 0x6A, 0xDD, 0x05, 0xD3, 0x18, 0xE2, + 0x13, 0xDF, 0x1A, 0xE8, 0x90, 0xE5, 0xA1, 0xE1, 0xA2, 0xDB, 0xD3, 0xDE, + 0x17, 0xDE, 0x5B, 0xED, 0xA1, 0xE6, 0x1B, 0x02, 0x83, 0xE9, 0xF1, 0x02, + 0x26, 0xE0, 0x54, 0xF4, 0xE5, 0xDA, 0xFB, 0xE9, 0xB7, 0xEE, 0xA0, 0xD7, + 0x62, 0xF4, 0x95, 0xD1, 0x71, 0xF2, 0xBC, 0xE2, 0xAD, 0xF6, 0x0D, 0xF1, + 0x04, 0xF8, 0x01, 0xF2, 0x41, 0xFF, 0x25, 0xF2, 0xE4, 0x04, 0xD8, 0xF5, + 0xA6, 0x02, 0xC8, 0xF8, 0xD8, 0xF8, 0x81, 0x01, 0xB8, 0xF2, 0xE2, 0x03, + 0xAC, 0xF8, 0xF6, 0x06, 0xD1, 0xFF, 0x7C, 0x0F, 0x23, 0x07, 0xBB, 0x06, + 0x4C, 0x13, 0x8B, 0xF1, 0x1E, 0x1B, 0x14, 0xE0, 0x5E, 0x1E, 0x8E, 0xD7, + 0xCC, 0x20, 0x28, 0xDF, 0xD2, 0x17, 0xDF, 0xE4, 0xAB, 0x08, 0x3D, 0xE9, + 0x02, 0x0B, 0x15, 0xED, 0x68, 0x11, 0x7B, 0xEC, 0x00, 0x04, 0x3D, 0xF8, + 0x18, 0xF5, 0x5F, 0x0A, 0xE3, 0xF0, 0xE3, 0x14, 0xB2, 0xED, 0x57, 0x13, + 0x3D, 0xF5, 0xF4, 0x0A, 0x83, 0x00, 0xD2, 0x10, 0xD8, 0xF9, 0x34, 0x19, + 0xC4, 0xF8, 0x4D, 0x12, 0x5F, 0x04, 0x31, 0x06, 0xC4, 0x09, 0xBD, 0xF9, + 0x4B, 0x0F, 0xC7, 0xEF, 0xF4, 0x0C, 0xD4, 0xE7, 0x4D, 0x01, 0xEA, 0xEC, + 0xC5, 0xFB, 0x94, 0xF7, 0x18, 0xFA, 0xEC, 0xF8, 0x17, 0xF8, 0x56, 0xF8, + 0xD9, 0xF3, 0x3A, 0x05, 0xD9, 0xED, 0xB7, 0x0F, 0x49, 0xE6, 0x47, 0x00, + 0xC1, 0xDA, 0x78, 0xEC, 0x54, 0xDB, 0x4E, 0xEA, 0x3B, 0xDD, 0xA3, 0xEF, + 0x83, 0xD2, 0x92, 0xED, 0x12, 0xDB, 0x63, 0xED, 0x86, 0xE8, 0x6A, 0xEC, + 0x86, 0xE6, 0xE1, 0xEA, 0xAB, 0xE3, 0x4B, 0xF7, 0xFF, 0xDE, 0x08, 0xFC, + 0xE5, 0xE3, 0x0A, 0xF7, 0x7B, 0xF8, 0xC6, 0xF7, 0xCA, 0x02, 0xF5, 0xF2, + 0x20, 0x03, 0xAE, 0xF2, 0xCC, 0x05, 0xED, 0xF1, 0x7F, 0x09, 0x53, 0xEB, + 0x8F, 0x10, 0x31, 0xEA, 0x3A, 0x0F, 0x70, 0xF5, 0x2E, 0x12, 0xDC, 0x09, + 0x1D, 0x23, 0x46, 0x02, 0x45, 0x22, 0x60, 0xF9, 0x5A, 0x0F, 0xE9, 0x01, + 0x1D, 0x05, 0xF4, 0xFD, 0xEB, 0x08, 0xAC, 0xFD, 0x4F, 0x15, 0x8E, 0x00, + 0xE4, 0x17, 0x60, 0xFE, 0x94, 0x1A, 0xC3, 0xFE, 0x06, 0x22, 0x4D, 0x01, + 0xB9, 0x15, 0x06, 0x0F, 0x2D, 0x08, 0x4D, 0x13, 0xA0, 0x0B, 0xD8, 0x13, + 0x44, 0x17, 0x08, 0x10, 0xCB, 0x1C, 0xA9, 0x02, 0x64, 0x18, 0x28, 0x04, + 0x86, 0x1D, 0xD6, 0x08, 0x5A, 0x23, 0xA1, 0x0A, 0xD5, 0x1E, 0x0F, 0x0E, + 0x8D, 0x14, 0x35, 0x1C, 0x1F, 0x04, 0xF0, 0x2A, 0x32, 0xF9, 0x75, 0x29, + 0x2A, 0xFD, 0x49, 0x20, 0x8A, 0x03, 0xE1, 0x18, 0x54, 0x03, 0x6A, 0x02, + 0x3E, 0xFF, 0xD6, 0xF1, 0x5F, 0xFB, 0x32, 0xF7, 0xB5, 0xFD, 0x79, 0xFD, + 0x3E, 0x01, 0xAF, 0x04, 0x3B, 0x00, 0x23, 0x12, 0x4F, 0xFF, 0x21, 0x17, + 0xB5, 0x04, 0x46, 0x06, 0xDC, 0x00, 0xE1, 0xF5, 0xA7, 0xF5, 0xF1, 0xF3, + 0xF0, 0xEB, 0x11, 0xF3, 0xD0, 0xE0, 0xA8, 0xF1, 0x84, 0xDF, 0x68, 0xF7, + 0x5B, 0xE6, 0xEE, 0x05, 0xC0, 0xF3, 0x17, 0x04, 0xC9, 0xFB, 0x95, 0xFC, + 0x6E, 0xF6, 0x1F, 0x04, 0x95, 0xF0, 0x30, 0x0B, 0x86, 0xF4, 0x83, 0x08, + 0x14, 0xFF, 0xC2, 0xEF, 0xB4, 0xF9, 0xFC, 0xE4, 0xF1, 0xE6, 0xC9, 0xF0, + 0x9C, 0xE6, 0x94, 0xF9, 0x71, 0xFA, 0x79, 0xF3, 0xEA, 0x0D, 0x3F, 0xE8, + 0x4D, 0x1D, 0x31, 0xE7, 0x72, 0x21, 0x32, 0xEE, 0x77, 0x19, 0xB6, 0xFF, + 0xCF, 0x0D, 0x2E, 0x0D, 0x9D, 0x04, 0xBE, 0x13, 0x35, 0x0A, 0x2C, 0x1B, + 0xB4, 0x12, 0xE8, 0x1B, 0xE1, 0x0C, 0x9A, 0x1F, 0x0C, 0x0F, 0x44, 0x1C, + 0x03, 0x13, 0x12, 0x12, 0xEC, 0x08, 0x57, 0x13, 0x05, 0x02, 0x35, 0x1A, + 0x32, 0x08, 0x71, 0x22, 0x40, 0x23, 0xF3, 0x21, 0xC3, 0x38, 0xC8, 0x25, + 0x35, 0x38, 0x98, 0x2E, 0x94, 0x2C, 0xA2, 0x2F, 0x42, 0x1E, 0x51, 0x2F, + 0x80, 0x1B, 0x5F, 0x2F, 0x1E, 0x19, 0x47, 0x34, 0x86, 0x14, 0x6D, 0x37, + 0x4F, 0x19, 0xE1, 0x2E, 0x2E, 0x1F, 0x8B, 0x2E, 0x7D, 0x2A, 0xAD, 0x2C, + 0xC7, 0x37, 0xF8, 0x22, 0xF1, 0x2F, 0xEC, 0x19, 0x8A, 0x16, 0x27, 0x07, + 0x19, 0x0E, 0x84, 0xF8, 0x37, 0x11, 0xBC, 0xF2, 0x61, 0x0C, 0x7A, 0xF0, + 0xB8, 0x0D, 0xF0, 0xF6, 0x7D, 0x15, 0xBD, 0x00, 0x9D, 0x10, 0x5C, 0x06, + 0xB3, 0x05, 0x64, 0x03, 0x2F, 0x08, 0xC6, 0x05, 0x32, 0x08, 0x04, 0x07, + 0x57, 0xFF, 0xBB, 0xF8, 0x72, 0xFD, 0x38, 0xF4, 0xB9, 0xF9, 0x88, 0xFA, + 0x94, 0xF4, 0xD2, 0xF4, 0x72, 0xEE, 0x4A, 0xE9, 0x0E, 0xE4, 0xC9, 0xF2, + 0x81, 0xDF, 0xFE, 0x00, 0xC2, 0xE2, 0x7B, 0x05, 0xC6, 0xF0, 0x14, 0x0D, + 0x3E, 0xF0, 0x77, 0x0B, 0xE0, 0xE2, 0xCE, 0x05, 0xD7, 0xE0, 0x2D, 0x01, + 0xAC, 0xE5, 0xA7, 0xFC, 0x7B, 0xEE, 0x02, 0xFA, 0xE8, 0xEF, 0x49, 0xF5, + 0xC3, 0xF0, 0x50, 0xF7, 0xD7, 0x04, 0x8A, 0xF6, 0x68, 0x0F, 0x97, 0xF9, + 0x4D, 0x10, 0xA7, 0xFF, 0x64, 0x13, 0x9D, 0x04, 0xED, 0x11, 0x0F, 0x10, + 0x77, 0x19, 0x51, 0x13, 0x6B, 0x18, 0x3B, 0x14, 0xDE, 0x13, 0xFD, 0x18, + 0x70, 0x17, 0x7F, 0x1E, 0x73, 0x11, 0x3A, 0x28, 0x25, 0x08, 0xE8, 0x2A, + 0x6E, 0x08, 0x5C, 0x23, 0xB9, 0x11, 0xB7, 0x10, 0xD1, 0x1C, 0xC4, 0x08, + 0xB5, 0x21, 0x3B, 0x0E, 0xEB, 0x25, 0x68, 0x07, 0x40, 0x26, 0xB1, 0x08, + 0x8A, 0x29, 0x99, 0x13, 0xED, 0x31, 0x94, 0x1B, 0x0B, 0x27, 0x46, 0x2B, + 0xC4, 0x1B, 0xF8, 0x3F, 0x9A, 0x1C, 0x52, 0x44, 0xE4, 0x16, 0xF6, 0x42, + 0x18, 0x11, 0x9A, 0x47, 0x8B, 0x16, 0x71, 0x4A, 0x97, 0x1E, 0x2F, 0x38, + 0x9D, 0x1F, 0xAF, 0x1E, 0xD4, 0x14, 0x75, 0x15, 0x77, 0x0A, 0xC4, 0x11, + 0xFF, 0x0B, 0x70, 0x0C, 0xCB, 0x15, 0xD1, 0x08, 0x21, 0x26, 0x3F, 0x02, + 0x50, 0x2A, 0x08, 0xFD, 0x95, 0x19, 0x7E, 0x02, 0x62, 0xFE, 0xBB, 0x09, + 0xC2, 0xE6, 0xE3, 0x10, 0xA2, 0xE7, 0x2D, 0x14, 0x82, 0xF4, 0x1D, 0x0E, + 0xD4, 0xF7, 0xB2, 0x00, 0xC0, 0xFA, 0xC9, 0xFA, 0x32, 0xFB, 0xFB, 0xFA, + 0x66, 0xFC, 0x86, 0xF3, 0x02, 0x02, 0x4A, 0xEF, 0x2C, 0x05, 0x43, 0xF5, + 0xA7, 0x0E, 0x03, 0xF6, 0x62, 0x19, 0xF0, 0xF0, 0x0E, 0x1D, 0x09, 0xF2, + 0xEF, 0x11, 0x70, 0xFB, 0x53, 0xFC, 0x19, 0x01, 0x7B, 0xF3, 0xC3, 0x04, + 0x99, 0xFA, 0x46, 0x08, 0xD8, 0xFF, 0xAB, 0x02, 0x20, 0x06, 0xF3, 0xFC, + 0xB0, 0x09, 0xDB, 0x07, 0xFD, 0xFE, 0x26, 0x1F, 0x17, 0xF8, 0xC3, 0x25, + 0x19, 0x03, 0xC5, 0x21, 0x27, 0x07, 0xD1, 0x20, 0xB6, 0x00, 0x3C, 0x1E, + 0xE5, 0x02, 0x7C, 0x23, 0xC9, 0x0E, 0x13, 0x24, 0x18, 0x23, 0x3F, 0x13, + 0xBB, 0x29, 0x41, 0x09, 0xBA, 0x17, 0x52, 0x13, 0x73, 0x01, 0x51, 0x17, + 0xEB, 0xFC, 0x4C, 0x08, 0xC5, 0x06, 0x53, 0x05, 0x0C, 0x18, 0x5C, 0x0A, + 0x02, 0x2D, 0x8B, 0x01, 0xFB, 0x32, 0xB4, 0x07, 0xBA, 0x26, 0xDB, 0x1A, + 0x3E, 0x1B, 0xCC, 0x1F, 0xD0, 0x0C, 0xEC, 0x1B, 0x33, 0xFC, 0x2A, 0x2C, + 0x25, 0x00, 0x60, 0x3E, 0xE9, 0x10, 0xFE, 0x38, 0x52, 0x12, 0x17, 0x2C, + 0xD6, 0x09, 0x6C, 0x1E, 0x94, 0x03, 0x90, 0x10, 0xCC, 0xF6, 0x73, 0xFC, + 0xD9, 0xF5, 0x5F, 0xFC, 0xC7, 0x03, 0x1F, 0x05, 0xB2, 0x09, 0x8F, 0xFD, + 0x7F, 0x06, 0x5D, 0xF6, 0xB0, 0x06, 0xBD, 0xF1, 0x06, 0x08, 0xF4, 0xED, + 0x8E, 0x05, 0xEE, 0xE2, 0x96, 0xFD, 0x5B, 0xCC, 0x1F, 0xF0, 0x40, 0xC7, + 0x9B, 0xDD, 0xE6, 0xCA, 0x07, 0xD3, 0x92, 0xCE, 0x14, 0xDB, 0xC7, 0xD6, + 0x4F, 0xE0, 0xD2, 0xD5, 0xAF, 0xD9, 0x51, 0xD7, 0x0B, 0xDE, 0xA7, 0xD2, + 0x11, 0xEC, 0x68, 0xD1, 0x7B, 0xEF, 0x0A, 0xDB, 0x7F, 0xE9, 0xF6, 0xDB, + 0x2A, 0xEB, 0xE0, 0xD4, 0x85, 0xF4, 0x32, 0xCC, 0x24, 0xF7, 0x34, 0xCD, + 0x0D, 0xF6, 0x22, 0xDB, 0x73, 0xF1, 0xB9, 0xE6, 0xD2, 0xEB, 0x36, 0xF0, + 0x5F, 0xEA, 0xF6, 0xF8, 0x2B, 0xE6, 0xFC, 0xF7, 0xEE, 0xE6, 0x0D, 0xF3, + 0x48, 0xE6, 0xF1, 0xF6, 0x2B, 0xDE, 0x89, 0xFD, 0xF1, 0xD9, 0xE5, 0x03, + 0x3D, 0xDB, 0x03, 0x0E, 0x30, 0xE5, 0x2D, 0x0E, 0x06, 0xEF, 0x80, 0x0A, + 0xD1, 0xF2, 0xC9, 0x0A, 0x65, 0xF0, 0xA1, 0x08, 0xD7, 0xEF, 0xD7, 0x0B, + 0x7C, 0xFC, 0xE7, 0x0C, 0xE6, 0x03, 0x1A, 0x02, 0x6F, 0xF6, 0x7F, 0xFE, + 0x8D, 0xED, 0x21, 0x06, 0x2E, 0xF7, 0x7B, 0x07, 0xFC, 0x08, 0xD4, 0xF7, + 0x9E, 0x18, 0xB4, 0xEF, 0x15, 0x15, 0x2B, 0xF6, 0x35, 0x04, 0x08, 0xFD, + 0x32, 0xFF, 0x3A, 0x00, 0xC3, 0xFB, 0x70, 0x00, 0x52, 0xF6, 0x74, 0xFE, + 0x87, 0xF9, 0xB5, 0xF1, 0xAF, 0xF5, 0xB4, 0xE9, 0x56, 0xEF, 0x82, 0xEA, + 0x1D, 0xF1, 0x2D, 0xE2, 0x12, 0xF5, 0x14, 0xDC, 0x5C, 0xF3, 0x76, 0xD7, + 0xDE, 0xF5, 0x5C, 0xD7, 0xD6, 0xFE, 0x85, 0xD5, 0x11, 0x02, 0x7F, 0xCC, + 0x76, 0xFF, 0xAF, 0xD8, 0xE5, 0xF3, 0x67, 0xE2, 0x6D, 0xE1, 0x90, 0xE0, + 0xE4, 0xD5, 0xDA, 0xE0, 0xF8, 0xD1, 0x8D, 0xD9, 0x39, 0xD4, 0xF8, 0xD7, + 0x3A, 0xD8, 0x0C, 0xE0, 0x58, 0xE0, 0x5B, 0xDF, 0xDF, 0xED, 0xDC, 0xD6, + 0x2D, 0xF9, 0xE5, 0xCD, 0x67, 0xF4, 0x42, 0xD9, 0xB0, 0xD4, 0x20, 0xEE, + 0xB5, 0xC0, 0x67, 0xF5, 0x82, 0xD1, 0xA4, 0xEF, 0x55, 0xE8, 0xE0, 0xE2, + 0x28, 0xF9, 0xEF, 0xDD, 0x0E, 0x00, 0x5B, 0xE2, 0x64, 0xF5, 0xD9, 0xEB, + 0xF6, 0xEC, 0x0B, 0xF8, 0x61, 0xEF, 0x02, 0x09, 0x0B, 0xFA, 0x77, 0x0E, + 0xB9, 0x0C, 0x71, 0x00, 0xCB, 0x13, 0xB8, 0xED, 0xB8, 0x08, 0xEB, 0xE1, + 0x70, 0xF8, 0xE5, 0xE9, 0x6A, 0xE9, 0xF4, 0xFD, 0xAC, 0xE3, 0x43, 0xFA, + 0xAE, 0xE5, 0xFF, 0xEE, 0xF1, 0xF1, 0x3E, 0xEE, 0xFE, 0xF9, 0x74, 0xF0, + 0x4E, 0xF1, 0xE5, 0xF8, 0x75, 0xF0, 0x49, 0xFB, 0xF7, 0xF8, 0x1A, 0xFF, + 0x43, 0x01, 0xB1, 0x06, 0x5D, 0x02, 0x23, 0x11, 0xCD, 0xF5, 0x32, 0x13, + 0x1A, 0xF4, 0xEE, 0x0E, 0x80, 0xFD, 0x66, 0x18, 0x6C, 0x04, 0x45, 0x12, + 0xB6, 0x10, 0x4A, 0x06, 0xE2, 0x1E, 0x0F, 0x05, 0x1D, 0x1D, 0x3B, 0x02, + 0x46, 0x01, 0x14, 0x03, 0xEB, 0xEB, 0xFB, 0x06, 0x62, 0xE9, 0xFB, 0x09, + 0x0B, 0xE6, 0x5B, 0xFE, 0x4A, 0xEA, 0x12, 0xF0, 0x52, 0xFB, 0x56, 0xF0, + 0x58, 0x07, 0x37, 0xE5, 0x97, 0x07, 0x9C, 0xDE, 0xF0, 0xFF, 0x0D, 0xE4, + 0x51, 0xF7, 0xEB, 0xE9, 0x96, 0xF8, 0xB9, 0xE8, 0x4B, 0x02, 0xBE, 0xDF, + 0x6B, 0x06, 0xBF, 0xE2, 0xC8, 0xFB, 0xF2, 0xDF, 0x6A, 0xE9, 0x4C, 0xE4, + 0x53, 0xE5, 0xCA, 0xEC, 0x27, 0xEC, 0x70, 0xEE, 0x6E, 0xE8, 0x7D, 0xFB, + 0xCB, 0xEA, 0x61, 0x04, 0xE0, 0xF7, 0xF2, 0x05, 0x50, 0x04, 0x48, 0x04, + 0x7F, 0x0E, 0xB7, 0x01, 0x3A, 0x0D, 0xD1, 0x03, 0x11, 0x01, 0x9C, 0xF1, + 0x3C, 0xF6, 0xA2, 0xE6, 0xD2, 0xF5, 0xBB, 0xEB, 0x9D, 0xFA, 0x27, 0xE4, + 0x56, 0xFE, 0x9F, 0xE8, 0x13, 0xFF, 0x77, 0xF8, 0xA0, 0xF9, 0x79, 0x03, + 0x12, 0xEF, 0x0F, 0x08, 0xE6, 0xE3, 0xFA, 0x06, 0xB0, 0xE1, 0xD6, 0x09, + 0x69, 0xED, 0x8E, 0x0B, 0x7A, 0xFB, 0x15, 0x04, 0xF9, 0x08, 0xFF, 0xF8, + 0x11, 0x12, 0xAA, 0xF7, 0xEE, 0x13, 0xDE, 0xF8, 0xDE, 0x06, 0x99, 0xF2, + 0x2E, 0xEE, 0x9A, 0xF7, 0x73, 0xEE, 0xDA, 0xF8, 0x2F, 0x04, 0x2F, 0xEF, + 0xEA, 0x13, 0x16, 0xEE, 0x75, 0x14, 0x65, 0xFB, 0x25, 0x03, 0x63, 0x07, + 0x41, 0xFB, 0x59, 0x04, 0xB9, 0x01, 0xF0, 0x04, 0xD7, 0xFE, 0x3E, 0x10, + 0x84, 0xF6, 0x5F, 0x17, 0x0E, 0xEC, 0x73, 0x19, 0xF3, 0xEC, 0xBF, 0x1D, + 0x47, 0xFB, 0x84, 0x25, 0xB2, 0xFF, 0x45, 0x29, 0x90, 0xF7, 0x41, 0x25, + 0xDA, 0xEC, 0xDF, 0x16, 0x50, 0xED, 0x7F, 0x01, 0x8E, 0xF9, 0x40, 0xEC, + 0x50, 0x07, 0xF4, 0xE3, 0x1E, 0x0F, 0xE7, 0xF3, 0x4D, 0x01, 0x95, 0x05, + 0xF8, 0xE9, 0x55, 0x00, 0xB2, 0xE8, 0xCC, 0xEB, 0x92, 0xF5, 0xE0, 0xE1, + 0x91, 0xFB, 0xA3, 0xE3, 0xBB, 0xF8, 0x10, 0xE4, 0xA8, 0xF3, 0x70, 0xE4, + 0x65, 0xF5, 0xDC, 0xE5, 0xC8, 0xFC, 0xDE, 0xE5, 0x42, 0x02, 0xA2, 0xEC, + 0x63, 0x08, 0x2D, 0xF1, 0xB8, 0x11, 0x31, 0xEA, 0x1D, 0x1C, 0x01, 0xE9, + 0x06, 0x1C, 0xFC, 0xF8, 0x03, 0x09, 0xC3, 0x00, 0x93, 0xFD, 0xA4, 0x02, + 0x3D, 0x04, 0x75, 0x04, 0xE9, 0x0A, 0x69, 0x02, 0xED, 0x0A, 0x39, 0x0B, + 0xD8, 0x03, 0x17, 0x11, 0xAD, 0xFE, 0x70, 0x12, 0x76, 0xFA, 0x93, 0x0C, + 0x18, 0xF7, 0x88, 0x06, 0x7B, 0xFB, 0xE5, 0x08, 0x58, 0xFC, 0xD6, 0x0C, + 0xB3, 0xF3, 0xF7, 0x0B, 0x8F, 0xEB, 0x10, 0x0C, 0x5E, 0xF3, 0x5F, 0x15, + 0x34, 0x0A, 0xAD, 0x12, 0xD6, 0x17, 0x0F, 0x09, 0x2A, 0x19, 0x93, 0x0F, + 0xF1, 0x16, 0x8D, 0x12, 0x9C, 0x15, 0x96, 0x0B, 0x9F, 0x1A, 0xB8, 0x06, + 0x1F, 0x22, 0x4D, 0x09, 0x47, 0x26, 0x10, 0x09, 0x66, 0x28, 0x0E, 0x09, + 0x23, 0x24, 0x37, 0x0F, 0xCC, 0x13, 0x01, 0x15, 0x68, 0x07, 0x40, 0x1B, + 0x13, 0x06, 0x70, 0x22, 0xF6, 0x00, 0xC8, 0x23, 0x48, 0x04, 0xD1, 0x11, + 0x66, 0x13, 0x49, 0x10, 0xA9, 0x18, 0x17, 0x26, 0xDF, 0x12, 0x11, 0x21, + 0x4D, 0x09, 0x77, 0x0C, 0xE3, 0x02, 0x21, 0x05, 0x68, 0xFE, 0x50, 0xFD, + 0x0E, 0xFC, 0x67, 0xFA, 0x85, 0x03, 0xD5, 0xFE, 0xBB, 0x15, 0x0B, 0x07, + 0x16, 0x22, 0xC3, 0x09, 0xD1, 0x19, 0x44, 0x08, 0x13, 0x01, 0x49, 0x08, + 0xA0, 0xEB, 0xCA, 0x05, 0xBD, 0xDE, 0xE1, 0xFD, 0x67, 0xDE, 0xB6, 0xF6, + 0x96, 0xE9, 0xE5, 0xFD, 0x17, 0xF4, 0xD9, 0x03, 0x39, 0xF8, 0x56, 0xFE, + 0xFC, 0xF9, 0x01, 0x01, 0x2D, 0xF9, 0x00, 0x0A, 0x6F, 0xEF, 0x40, 0x0D, + 0x08, 0xEA, 0x60, 0x0C, 0xBA, 0xF3, 0x32, 0x0C, 0x8D, 0x04, 0xB2, 0x03, + 0xF8, 0x16, 0x9F, 0xF5, 0x42, 0x22, 0x9F, 0xFE, 0x5E, 0x23, 0x8D, 0x0C, + 0xE2, 0x24, 0x1A, 0x11, 0x16, 0x23, 0x76, 0x14, 0x95, 0x25, 0xB5, 0x0A, + 0xDD, 0x2E, 0x35, 0xFE, 0xE8, 0x26, 0x9D, 0x09, 0x3F, 0x10, 0x0F, 0x17, + 0x3F, 0x0B, 0xE8, 0x16, 0x7F, 0x17, 0x9C, 0x0A, 0xAC, 0x19, 0xDB, 0x01, + 0xBA, 0x16, 0x2A, 0x05, 0x39, 0x17, 0xE8, 0x0B, 0xCC, 0x11, 0xA3, 0x11, + 0x9F, 0x17, 0xDD, 0x08, 0xFB, 0x22, 0x43, 0x06, 0x4C, 0x1B, 0x37, 0x0E, + 0xB6, 0x15, 0x83, 0x09, 0xBF, 0x17, 0xAC, 0x03, 0x84, 0x14, 0x4C, 0x0F, + 0x22, 0x1D, 0xB7, 0x1B, 0xBE, 0x2A, 0x21, 0x23, 0xEB, 0x25, 0xA8, 0x2A, + 0xB7, 0x1F, 0xD5, 0x25, 0xE5, 0x20, 0xDC, 0x12, 0x73, 0x1C, 0xF5, 0x0E, + 0xF4, 0x16, 0x1B, 0x1C, 0xB4, 0x1B, 0x15, 0x25, 0x50, 0x1D, 0xD1, 0x23, + 0xB2, 0x0D, 0x08, 0x20, 0xF7, 0xF4, 0x5F, 0x20, 0xA6, 0xE4, 0x5B, 0x22, + 0x0A, 0xE6, 0xBA, 0x1A, 0xC7, 0xED, 0x8E, 0x0D, 0xB3, 0xF3, 0x4F, 0x03, + 0x51, 0xF7, 0xA1, 0xFC, 0xA2, 0xF4, 0x76, 0xFC, 0x42, 0xE6, 0x65, 0x00, + 0x2C, 0xDF, 0x88, 0x03, 0xB6, 0xE8, 0xFC, 0x01, 0xE4, 0xEF, 0x2A, 0x05, + 0xEB, 0xF2, 0x93, 0xFE, 0x35, 0xF1, 0xAF, 0xF5, 0xD1, 0xF0, 0x1B, 0xF3, + 0x7A, 0xF5, 0x50, 0xEF, 0x7D, 0xEF, 0xB9, 0xF4, 0x42, 0xE9, 0xE0, 0xFE, + 0x49, 0xEE, 0xE6, 0x0A, 0x9B, 0xF1, 0xB4, 0x0E, 0xA9, 0xF2, 0xAF, 0x00, + 0xEB, 0xF1, 0x52, 0xFB, 0xE9, 0xF4, 0x29, 0xF8, 0x81, 0xFE, 0x6C, 0xEC, + 0x6E, 0x04, 0xB1, 0xEF, 0xCA, 0x09, 0x35, 0xFA, 0x91, 0x0E, 0x71, 0xF4, + 0x53, 0x10, 0x2C, 0xF1, 0x9F, 0x15, 0x7E, 0xFF, 0x19, 0x1A, 0x8E, 0x04, + 0xA7, 0x1A, 0xCE, 0x02, 0xF2, 0x19, 0xC0, 0x05, 0x7A, 0x13, 0x96, 0x09, + 0xBB, 0x13, 0x25, 0x09, 0x19, 0x1C, 0x53, 0x05, 0x08, 0x1C, 0x01, 0x0D, + 0x3B, 0x15, 0xB3, 0x0E, 0x8C, 0x0D, 0xD2, 0x0C, 0xB4, 0x11, 0xE0, 0x1A, + 0x3D, 0x21, 0xFE, 0x17, 0x41, 0x23, 0xA0, 0x08, 0x82, 0x10, 0x4F, 0x06, + 0x06, 0xFE, 0x62, 0x15, 0x6D, 0x00, 0x16, 0x22, 0x73, 0x0C, 0x16, 0x1D, + 0x2F, 0x16, 0xDB, 0x1A, 0xCE, 0x19, 0x39, 0x1C, 0x70, 0x10, 0xC8, 0x28, + 0xFB, 0x08, 0xF0, 0x3B, 0xA9, 0x08, 0x7A, 0x3E, 0x84, 0x0F, 0x41, 0x36, + 0xEA, 0x16, 0x6D, 0x28, 0x67, 0x16, 0xC3, 0x18, 0xA1, 0x12, 0xC9, 0x0E, + 0xC4, 0x08, 0x87, 0x07, 0xB1, 0x05, 0xC0, 0x01, 0x88, 0x00, 0xBD, 0xFC, + 0xFA, 0xF2, 0xAB, 0x02, 0x47, 0xEE, 0x81, 0xFE, 0x37, 0xE9, 0x4E, 0xEB, + 0x4A, 0xEB, 0x1E, 0xE9, 0x56, 0xEF, 0x98, 0xE7, 0xA0, 0xE7, 0x82, 0xE3, + 0x4A, 0xE7, 0x99, 0xE0, 0x54, 0xEF, 0xA3, 0xDB, 0x19, 0xF5, 0xA9, 0xDA, + 0x83, 0xED, 0xCF, 0xE0, 0x90, 0xE6, 0x04, 0xF1, 0x1F, 0xF1, 0x01, 0xF3, + 0xB4, 0x04, 0x7B, 0xEF, 0xAC, 0x16, 0x05, 0xF1, 0xDA, 0x19, 0xC4, 0xE9, + 0x85, 0x0B, 0xFE, 0xEE, 0x46, 0xFA, 0x02, 0xF6, 0xE8, 0xF5, 0x71, 0xFB, + 0x57, 0x01, 0x3F, 0x07, 0xF5, 0x04, 0x9B, 0x0B, 0xA3, 0xFE, 0x66, 0x16, + 0x15, 0xFA, 0x39, 0x17, 0xFD, 0xFA, 0x70, 0x10, 0x8B, 0xFC, 0x5F, 0x04, + 0x53, 0xF6, 0xCE, 0xF7, 0xCD, 0xF6, 0x0F, 0x09, 0xDD, 0xFA, 0xEA, 0x14, + 0x6A, 0x05, 0x45, 0x0C, 0xCB, 0x14, 0xC8, 0x09, 0xFB, 0x1A, 0x90, 0x10, + 0xB0, 0x1A, 0x71, 0x0D, 0x75, 0x17, 0x7C, 0x0A, 0xFC, 0x18, 0xCE, 0x17, + 0x1C, 0x1F, 0x26, 0x1D, 0xAD, 0x18, 0x90, 0x1C, 0x48, 0x11, 0x20, 0x34, + 0xBB, 0x17, 0x89, 0x3F, 0x70, 0x22, 0xD6, 0x28, 0x6B, 0x24, 0x48, 0x16, + 0xEE, 0x1C, 0xB1, 0x11, 0xB6, 0x18, 0x3F, 0x0A, 0xE0, 0x12, 0xB4, 0x03, + 0x27, 0x0D, 0xD3, 0x0F, 0xE9, 0x10, 0x0D, 0x15, 0x89, 0x17, 0xEC, 0x13, + 0xBD, 0x18, 0x04, 0x1D, 0xCF, 0x0B, 0xBD, 0x1B, 0xF5, 0xF6, 0xFE, 0x06, + 0xBD, 0xEE, 0x33, 0xF2, 0x1E, 0xEE, 0x3F, 0xEC, 0x97, 0xE8, 0x7D, 0xE7, + 0xBF, 0xE7, 0x9B, 0xE1, 0x6F, 0xE9, 0xD0, 0xDE, 0x98, 0xE7, 0x11, 0xDA, + 0x2D, 0xE1, 0x15, 0xD4, 0x21, 0xCE, 0x5E, 0xCD, 0xE3, 0xC2, 0x8D, 0xC9, + 0xAF, 0xCB, 0x58, 0xC7, 0x15, 0xD3, 0x64, 0xC2, 0x86, 0xD1, 0x19, 0xC8, + 0xA4, 0xDA, 0x3A, 0xDB, 0xFE, 0xE6, 0x17, 0xF0, 0x81, 0xE3, 0xBD, 0xFA, + 0x2A, 0xE4, 0xA7, 0xF4, 0x04, 0xE9, 0xD3, 0xEB, 0xFA, 0xE9, 0xCC, 0xEE, + 0x4A, 0xF7, 0x16, 0xF4, 0x21, 0x01, 0xE6, 0xF7, 0x4F, 0xF3, 0xDF, 0xF8, + 0x19, 0xED, 0xD8, 0xED, 0x2A, 0xFD, 0xD7, 0xE6, 0xBA, 0xFD, 0xF6, 0xEF, + 0x07, 0xF0, 0x43, 0xF1, 0x7C, 0xE9, 0x83, 0xF3, 0x5E, 0xE3, 0xBE, 0xFD, + 0x70, 0xDE, 0xA2, 0xFE, 0xCF, 0xDD, 0x99, 0xF4, 0xEC, 0xE1, 0xB0, 0xE1, + 0x01, 0xEE, 0x2E, 0xD2, 0x77, 0xF0, 0x3F, 0xD4, 0x1F, 0xE9, 0x9D, 0xF6, + 0xA3, 0xEC, 0x76, 0x0A, 0xD7, 0x04, 0x4E, 0x02, 0xB0, 0x17, 0xD5, 0x01, + 0x2C, 0x1C, 0xDB, 0x04, 0x1E, 0x24, 0x34, 0x06, 0xE1, 0x1F, 0x1A, 0x04, + 0x16, 0x16, 0x02, 0x09, 0x20, 0x0F, 0x3A, 0x0E, 0xFF, 0x11, 0x2C, 0x18, + 0xD8, 0x0B, 0xDE, 0x22, 0x91, 0xFB, 0x3B, 0x1E, 0x72, 0x02, 0x75, 0x17, + 0x9A, 0xFF, 0x6A, 0x14, 0xDF, 0xEE, 0xF7, 0x12, 0x15, 0xF0, 0xE3, 0x15, + 0x09, 0x01, 0x3C, 0x0A, 0x8B, 0x0D, 0xEC, 0xF5, 0xD3, 0x09, 0x16, 0xF0, + 0x97, 0xFD, 0xE5, 0xEC, 0x08, 0xEC, 0xBF, 0xD9, 0xFF, 0xE5, 0x46, 0xD6, + 0x50, 0xF4, 0x70, 0xE0, 0xC0, 0xFD, 0xD5, 0xD5, 0xF5, 0xED, 0x52, 0xD4, + 0x32, 0xD9, 0x47, 0xDA, 0xD0, 0xD6, 0x63, 0xDD, 0xFE, 0xD7, 0x57, 0xD9, + 0x62, 0xE6, 0xD5, 0xC7, 0xAC, 0xF2, 0x07, 0xC3, 0xB6, 0xD4, 0x6C, 0xC5, + 0xE6, 0xD2, 0x9B, 0xCB, 0x62, 0xE0, 0x65, 0xD8, 0x38, 0xD1, 0xC8, 0xDB, + 0xF8, 0xD5, 0x71, 0xDA, 0x1E, 0xE2, 0x44, 0xE4, 0x5A, 0xE9, 0xF7, 0xF4, + 0x46, 0xE0, 0xEE, 0xF6, 0xFE, 0xDE, 0x5F, 0xFB, 0xC1, 0xE7, 0x73, 0x01, + 0xB6, 0xE1, 0x84, 0xFE, 0xA9, 0xF7, 0x83, 0xFD, 0x2E, 0xFF, 0xC3, 0xEE, + 0xFB, 0xF0, 0x83, 0xE0, 0x22, 0x00, 0x1B, 0xF6, 0x11, 0x00, 0xC5, 0x0D, + 0x39, 0xF7, 0xD6, 0x0C, 0x6C, 0x0B, 0x1E, 0x06, 0x66, 0x24, 0xFF, 0xFB, + 0xB9, 0x16, 0xA2, 0xEF, 0xCD, 0x01, 0x01, 0xF0, 0x09, 0xFD, 0xCE, 0xFB, + 0x78, 0xF6, 0x33, 0x07, 0x96, 0xFF, 0x56, 0x0C, 0x9F, 0x02, 0x29, 0x12, + 0x94, 0x00, 0xD6, 0x1C, 0x79, 0x09, 0x90, 0x17, 0x68, 0x1A, 0x7B, 0x0C, + 0x94, 0x21, 0x86, 0x09, 0x3C, 0x18, 0x7C, 0x08, 0x8B, 0x14, 0x5A, 0xFE, + 0x94, 0x11, 0xB4, 0xF7, 0x55, 0x0D, 0x96, 0xFC, 0x07, 0x0B, 0xC8, 0x00, + 0x79, 0x08, 0xD8, 0xFE, 0xCA, 0x0B, 0xCE, 0xFC, 0x70, 0x0D, 0x09, 0x0A, + 0xF9, 0x05, 0xBE, 0x1A, 0xC6, 0xFF, 0xBC, 0x25, 0x48, 0xFE, 0x3E, 0x2D, + 0xDF, 0x00, 0x87, 0x22, 0x7B, 0xFC, 0x41, 0x0B, 0xB6, 0xF9, 0xFF, 0xF7, + 0x12, 0xFD, 0xFA, 0xE8, 0x30, 0xED, 0xB2, 0xE1, 0xDA, 0xE1, 0xDA, 0xDE, + 0xD3, 0xF6, 0x3C, 0xE9, 0xCB, 0x01, 0xF3, 0xE6, 0xD2, 0xF9, 0x81, 0xD2, + 0x40, 0xFF, 0xC3, 0xD5, 0x25, 0xF7, 0xD6, 0xD4, 0xBC, 0xE4, 0x33, 0xCA, + 0x42, 0xED, 0x46, 0xD0, 0x11, 0xE9, 0x23, 0xD6, 0x2C, 0xD4, 0xA6, 0xD9, + 0xC4, 0xDC, 0x55, 0xE5, 0x23, 0xF0, 0x74, 0xF2, 0x46, 0x00, 0xD2, 0xF4, + 0xF4, 0x01, 0x1B, 0xEC, 0x22, 0xF3, 0x56, 0xE6, 0x73, 0xF1, 0x83, 0xEE, + 0xDC, 0xED, 0xF5, 0xF8, 0x25, 0xEC, 0xD8, 0xFA, 0x1C, 0xF5, 0x87, 0x07, + 0x8B, 0x00, 0x92, 0x19, 0x09, 0x02, 0x6E, 0x0E, 0x87, 0xFB, 0xD1, 0x17, + 0x34, 0x01, 0xB5, 0x2F, 0xD8, 0xF5, 0x1F, 0x1C, 0xCA, 0xED, 0x55, 0x15, + 0x31, 0xFE, 0x76, 0x24, 0x42, 0x01, 0x6C, 0x1E, 0x6B, 0x08, 0x43, 0x14, + 0xCE, 0x13, 0x23, 0x21, 0x28, 0x09, 0xCE, 0x28, 0x29, 0x02, 0x92, 0x19, + 0x48, 0x0A, 0x6F, 0x0F, 0xDD, 0x15, 0xB7, 0x11, 0x68, 0x15, 0xA5, 0x13, + 0x35, 0x0C, 0x7E, 0x17, 0x32, 0x0B, 0xE2, 0x18, 0x56, 0x10, 0x07, 0x09, + 0xD7, 0x19, 0xE7, 0xF7, 0xD0, 0x24, 0x3B, 0xF9, 0xDA, 0x1A, 0x16, 0xFE, + 0xD9, 0x03, 0x76, 0x01, 0x1A, 0x15, 0x98, 0x12, 0x09, 0x1A, 0x8C, 0x11, + 0xE9, 0x14, 0x20, 0x09, 0x10, 0x1E, 0x4F, 0x0D, 0x65, 0x0D, 0xD1, 0xFB, + 0x5B, 0xF8, 0x2D, 0xE0, 0x2A, 0xF4, 0xDE, 0xE3, 0xF3, 0x01, 0x89, 0xF5, + 0x7C, 0x0C, 0xFA, 0xEB, 0x26, 0x0A, 0x4F, 0xDE, 0x76, 0x08, 0x27, 0xEE, + 0xA7, 0xFE, 0xA6, 0x00, 0x63, 0xEA, 0x86, 0xFD, 0x57, 0xE0, 0xA5, 0xF9, + 0x13, 0xE9, 0x16, 0xEF, 0xFE, 0xFB, 0xAA, 0xDE, 0x1D, 0xFF, 0xD6, 0xDD, + 0x97, 0xFF, 0xE8, 0xE2, 0x15, 0xFF, 0x20, 0xF3, 0x32, 0xF7, 0x32, 0x03, + 0x13, 0xF4, 0x54, 0x09, 0xDE, 0xF1, 0x50, 0x0E, 0xEC, 0xF4, 0x5F, 0x09, + 0xAA, 0xF5, 0x31, 0x0B, 0x27, 0xF8, 0x15, 0x13, 0xE0, 0xFB, 0xF3, 0x14, + 0x91, 0xF7, 0xD8, 0x0C, 0xBA, 0xF6, 0x00, 0xF5, 0xD2, 0xF9, 0xAD, 0xEE, + 0x1C, 0xF9, 0x67, 0xF2, 0xF6, 0xEC, 0xC3, 0xE7, 0xEF, 0xEC, 0x76, 0xDF, + 0x5B, 0xFD, 0x55, 0xE0, 0x86, 0x04, 0x49, 0xF3, 0x38, 0x00, 0xB5, 0xF8, + 0x28, 0xFB, 0xF3, 0xF6, 0x82, 0xFB, 0x1B, 0xFE, 0x4B, 0xFF, 0x6A, 0x01, + 0x1B, 0x0B, 0xF4, 0x11, 0x88, 0x26, 0xC7, 0x24, 0xAE, 0x30, 0xFE, 0x30, + 0x36, 0x1F, 0x2B, 0x2C, 0xB3, 0x07, 0x66, 0x1C, 0xB1, 0x03, 0xC6, 0x24, + 0x3A, 0x1E, 0x40, 0x32, 0x92, 0x2A, 0x7D, 0x26, 0x1A, 0x25, 0x46, 0x0E, + 0x37, 0x21, 0x2D, 0x08, 0x17, 0x11, 0x7F, 0x11, 0x3F, 0xF9, 0x25, 0x12, + 0xBB, 0xF8, 0x12, 0x19, 0xA7, 0x0F, 0x12, 0x2B, 0x8F, 0x17, 0xC3, 0x33, + 0xB9, 0x1C, 0xDF, 0x2E, 0xF7, 0x35, 0xFC, 0x33, 0xDC, 0x28, 0x7E, 0x2F, + 0xF5, 0xFD, 0x8F, 0xFF, 0xB7, 0xEB, 0x5D, 0xD7, 0xAF, 0xDE, 0xEE, 0xDB, + 0xFF, 0xD0, 0x8B, 0xDD, 0x90, 0xD6, 0x1E, 0xD9, 0xCB, 0xE8, 0x1F, 0xE2, + 0x9E, 0xFC, 0xD8, 0xE4, 0xC6, 0xFD, 0x52, 0xD6, 0x5C, 0xEE, 0xF9, 0xCE, + 0xF7, 0xEA, 0x2B, 0xDD, 0xAB, 0xFA, 0x43, 0xFA, 0xEE, 0xFD, 0x19, 0x1C, + 0xE6, 0x03, 0x44, 0x3B, 0x68, 0x2A, 0x7B, 0x4D, 0x8C, 0x3D, 0x60, 0x47, + 0xCB, 0x2C, 0xF4, 0x37, 0xD4, 0x25, 0x27, 0x34, 0x60, 0x29, 0xD2, 0x37, + 0x3F, 0x2C, 0x4A, 0x32, 0xDB, 0x34, 0x4A, 0x24, 0x5C, 0x33, 0x2F, 0x1B, + 0x2F, 0x1B, 0x88, 0x0D, 0x1C, 0xFA, 0x75, 0xF7, 0x5D, 0xDC, 0x03, 0xE8, + 0xD7, 0xCC, 0xB4, 0xE3, 0xB3, 0xDB, 0xB7, 0xEB, 0x80, 0xE3, 0x54, 0xEE, + 0x5C, 0xCB, 0x7B, 0xD8, 0xE0, 0xD2, 0x1D, 0xCA, 0xAF, 0xF6, 0xE4, 0xD5, + 0xB7, 0x00, 0x1D, 0xE0, 0x8D, 0x11, 0x01, 0xEF, 0xE9, 0x19, 0xC1, 0xF6, + 0x5B, 0x08, 0xEC, 0xF1, 0x7F, 0x13, 0x6B, 0x06, 0xED, 0x41, 0x6E, 0x39, + 0xEC, 0x4E, 0x8D, 0x45, 0x9B, 0x21, 0x2A, 0x14, 0x0F, 0x18, 0x0C, 0x08, + 0x07, 0x35, 0x88, 0x32, 0x19, 0x39, 0xEB, 0x49, 0x61, 0x28, 0xEC, 0x40, + 0x05, 0x12, 0xC9, 0x31, 0x80, 0x05, 0xB6, 0x21, 0x49, 0x02, 0x8B, 0x17, + 0x37, 0x00, 0x6E, 0x21, 0xEF, 0xFC, 0x53, 0x24, 0x24, 0xF8, 0xE2, 0x15, + 0x79, 0xF9, 0xC0, 0x1B, 0x78, 0x07, 0xB4, 0x2F, 0x7A, 0x15, 0x16, 0x2B, + 0xB6, 0x04, 0xB8, 0x05, 0xD3, 0xE0, 0x6E, 0xDE, 0x2D, 0xDC, 0xFF, 0xD1, + 0x6C, 0xE4, 0x75, 0xD4, 0x63, 0xDD, 0xCA, 0xDA, 0xEA, 0xD8, 0x35, 0xDF, + 0x88, 0xD1, 0xA3, 0xE0, 0x29, 0xCA, 0xF8, 0xE1, 0xFE, 0xDD, 0xE2, 0xDA, + 0x3B, 0xF8, 0xE9, 0xD3, 0xA2, 0xFE, 0xE4, 0xD6, 0xEA, 0x09, 0xA2, 0xE4, + 0x61, 0x19, 0x40, 0xF5, 0x80, 0x20, 0x4D, 0x01, 0x13, 0x34, 0x1E, 0x13, + 0x3D, 0x37, 0x1A, 0x19, 0xA4, 0x27, 0x89, 0x1B, 0x5E, 0x2D, 0x41, 0x2D, + 0x81, 0x33, 0x54, 0x3C, 0xFD, 0x24, 0x3C, 0x42, 0xE3, 0x11, 0xE9, 0x3A, + 0xCE, 0x00, 0x5E, 0x21, 0x53, 0xFA, 0xF6, 0x0B, 0xEC, 0xFE, 0x09, 0x0A, + 0x0C, 0xFD, 0x42, 0x04, 0xEF, 0xEB, 0x6C, 0xF4, 0xD6, 0xD1, 0x39, 0xE9, + 0x06, 0xC1, 0x4B, 0xD5, 0x86, 0xC2, 0x58, 0xC3, 0xFF, 0xD7, 0xEF, 0xD0, + 0x5D, 0xE4, 0x54, 0xDE, 0xDF, 0xE6, 0x79, 0xE8, 0xA8, 0xEE, 0xC8, 0xF5, + 0x84, 0xE6, 0x0F, 0xF6, 0xBE, 0xEC, 0xED, 0x00, 0xC2, 0x14, 0xAC, 0x1B, + 0x4E, 0x36, 0x1C, 0x2C, 0x85, 0x37, 0x50, 0x18, 0x2F, 0x2F, 0x00, 0x04, + 0x2A, 0x3B, 0xF5, 0x0E, 0x94, 0x52, 0xDB, 0x26, 0x15, 0x4D, 0xE7, 0x31, + 0xA9, 0x2F, 0x0E, 0x28, 0x53, 0x20, 0xD2, 0x1D, 0x20, 0x14, 0xA2, 0x0E, + 0x5C, 0x10, 0xE5, 0x0C, 0x7F, 0x13, 0x7F, 0x13, 0x15, 0xFB, 0x07, 0xFF, + 0x53, 0xE3, 0x92, 0xF9, 0x97, 0xEE, 0x1E, 0x1A, 0x96, 0x00, 0x43, 0x37, + 0x99, 0xF9, 0x70, 0x27, 0xCA, 0xE2, 0x36, 0xFD, 0xC7, 0xDB, 0xA1, 0xDC, + 0x67, 0xE5, 0xE2, 0xC7, 0x53, 0xE0, 0x4C, 0xD4, 0x3C, 0xC2, 0xA6, 0xDE, + 0x94, 0xB5, 0xB4, 0xD2, 0x18, 0xCF, 0x02, 0xD5, 0xA8, 0xE1, 0x23, 0xD7, + 0xF3, 0xDE, 0x76, 0xDB, 0xA1, 0xDB, 0x9C, 0xDE, 0xE3, 0xE8, 0x8B, 0xE4, + 0x65, 0x01, 0x0C, 0xF9, 0x47, 0x1E, 0x2A, 0x19, 0x70, 0x31, 0x7F, 0x2C, + 0x48, 0x2D, 0xA0, 0x1D, 0x85, 0x1B, 0x86, 0x18, 0x99, 0x1B, 0x8F, 0x32, + 0xBA, 0x2E, 0xBD, 0x47, 0x84, 0x31, 0x0C, 0x3F, 0x78, 0x1A, 0x39, 0x1B, + 0x18, 0x01, 0xAC, 0xFC, 0xEC, 0xEC, 0xB7, 0xEE, 0x78, 0xE1, 0x48, 0xFA, + 0xC9, 0xE6, 0xAF, 0x05, 0x2F, 0xEB, 0xA0, 0xEE, 0x45, 0xF3, 0x69, 0xE0, + 0xEE, 0xF8, 0x4C, 0xD5, 0x61, 0xE6, 0xB1, 0xC8, 0xBE, 0xD0, 0x09, 0xC3, + 0x14, 0xD3, 0x82, 0xC6, 0xBF, 0xE9, 0x4C, 0xDE, 0x31, 0x19, 0xEA, 0xEE, + 0xBD, 0x24, 0xA6, 0xE1, 0xFF, 0x07, 0x60, 0xDC, 0xCA, 0x11, 0xCB, 0x09, + 0x0E, 0x28, 0xDF, 0x3A, 0x2C, 0x22, 0x7E, 0x39, 0xF1, 0x07, 0x82, 0x1D, + 0xA7, 0xFC, 0x82, 0x0D, 0x52, 0x19, 0x2E, 0x18, 0x97, 0x35, 0x68, 0x2C, + 0x6E, 0x30, 0x01, 0x25, 0x76, 0x12, 0x8F, 0x09, 0xA9, 0x01, 0x37, 0x04, + 0x57, 0x0A, 0x72, 0x0F, 0x31, 0x0C, 0xDA, 0x0D, 0xA0, 0xFA, 0xE2, 0x04, + 0x00, 0xF1, 0x4E, 0x00, 0x18, 0xFA, 0x3F, 0x07, 0xC9, 0x08, 0x8E, 0x1C, + 0xDE, 0xFD, 0xFF, 0x0D, 0x0C, 0xDF, 0x57, 0xEC, 0x6C, 0xC6, 0xF3, 0xDA, + 0x5C, 0xC1, 0x08, 0xD0, 0xB2, 0xD7, 0x3D, 0xD5, 0x44, 0xD7, 0x42, 0xD5, + 0xC8, 0xC6, 0xB7, 0xDA, 0x6A, 0xCD, 0xAF, 0xDE, 0x5B, 0xD1, 0xC4, 0xDC, + 0x56, 0xD1, 0x52, 0xE8, 0x8E, 0xDB, 0x05, 0xDE, 0x8F, 0xE9, 0x2B, 0xDE, + 0x6D, 0xFE, 0xB7, 0xF9, 0xA5, 0x14, 0x50, 0x11, 0x52, 0x17, 0x79, 0x1D, + 0x7D, 0x0E, 0x58, 0x11, 0x90, 0x16, 0xC7, 0x07, 0x05, 0x25, 0xD3, 0x0D, + 0xC7, 0x30, 0x2C, 0x24, 0xF3, 0x31, 0x82, 0x36, 0xA0, 0x12, 0xB1, 0x1E, + 0xFF, 0xEA, 0x54, 0xFA, 0x4B, 0xE0, 0x48, 0xED, 0xCA, 0xD9, 0x6A, 0xEC, + 0x49, 0xD2, 0x8B, 0xEA, 0x0F, 0xDF, 0x81, 0xD9, 0xFC, 0xEF, 0x31, 0xC0, + 0x89, 0xFB, 0xF5, 0xC0, 0x98, 0xF0, 0x98, 0xC3, 0xFA, 0xDF, 0x72, 0xBC, + 0x10, 0xE9, 0x6A, 0xD1, 0x4B, 0xFA, 0xCB, 0xEF, 0x47, 0x0A, 0xBD, 0x06, + 0x6A, 0x0E, 0x14, 0x0C, 0xC7, 0xFC, 0x11, 0xEF, 0xE5, 0x03, 0xF7, 0xEA, + 0x85, 0x37, 0xDC, 0x14, 0xEF, 0x50, 0x22, 0x2C, 0x4D, 0x2E, 0xF2, 0x15, + 0xF3, 0x10, 0x6B, 0x00, 0x19, 0x1C, 0xA4, 0x0B, 0x06, 0x31, 0xE6, 0x19, + 0xB3, 0x24, 0x14, 0x19, 0x76, 0xF6, 0x94, 0x09, 0xA9, 0xE1, 0x16, 0x06, + 0x27, 0xE3, 0xA0, 0x0F, 0xF8, 0xE0, 0x00, 0x0F, 0x89, 0xE3, 0x80, 0x13, + 0x1B, 0xE0, 0x9C, 0x10, 0xBE, 0xDD, 0x60, 0x07, 0x3D, 0xEF, 0x23, 0x18, + 0xDE, 0x07, 0xB4, 0x1B, 0x39, 0xF9, 0x72, 0xF4, 0xCA, 0xD3, 0x09, 0xDB, + 0x6A, 0xC3, 0xBC, 0xD6, 0x0A, 0xD1, 0x86, 0xD2, 0x1A, 0xDD, 0x94, 0xC7, + 0x11, 0xD1, 0x0D, 0xC1, 0x71, 0xD6, 0x09, 0xD7, 0x55, 0xED, 0xFB, 0xD7, + 0xC4, 0xF2, 0xC1, 0xC6, 0x86, 0xE4, 0x2D, 0xCF, 0x93, 0xDB, 0x4A, 0xDC, + 0xF5, 0xE4, 0x48, 0xEA, 0x3B, 0xFD, 0x77, 0xFE, 0x6A, 0x2A, 0x5F, 0x12, + 0xD3, 0x36, 0x58, 0x13, 0x10, 0x1E, 0xC8, 0x05, 0xC8, 0x18, 0x5E, 0x08, + 0xA1, 0x27, 0x0C, 0x1C, 0x90, 0x34, 0xA7, 0x28, 0x26, 0x23, 0x36, 0x18, + 0xFA, 0x11, 0xB5, 0x02, 0x8F, 0x0C, 0x56, 0xF7, 0xC4, 0xEC, 0xCF, 0xEC, + 0x78, 0xD6, 0x03, 0xF3, 0x3D, 0xCE, 0xDF, 0xF7, 0xA2, 0xCB, 0x71, 0xE8, + 0x19, 0xD2, 0xB4, 0xD9, 0xAE, 0xC7, 0x58, 0xD7, 0xDA, 0xBF, 0x35, 0xD6, + 0x6F, 0xD4, 0x5E, 0xD3, 0x3D, 0xFC, 0x2D, 0xE5, 0x19, 0x16, 0x81, 0x01, + 0xF2, 0x16, 0x69, 0x1F, 0xC0, 0x08, 0xC1, 0x20, 0x61, 0xFB, 0xD1, 0x0C, + 0xFB, 0x13, 0x3F, 0x26, 0x94, 0x46, 0xB2, 0x4E, 0x92, 0x4C, 0x14, 0x48, + 0x4D, 0x27, 0x0F, 0x1D, 0xC4, 0x1A, 0x9A, 0x07, 0x18, 0x20, 0x4B, 0x16, + 0xF0, 0x1F, 0xE0, 0x1A, 0x39, 0x1A, 0xDF, 0x08, 0xB1, 0x17, 0xB5, 0xF9, + 0x46, 0x1B, 0x7F, 0xEA, 0x87, 0x0F, 0x4F, 0xEA, 0x92, 0xFD, 0x01, 0xF6, + 0x3D, 0xE5, 0x5F, 0xF5, 0x43, 0xD3, 0x9D, 0xF7, 0x48, 0xDE, 0x0D, 0xFF, + 0xC6, 0xFB, 0x6F, 0x10, 0xF5, 0xF9, 0x5C, 0x10, 0xC7, 0xDD, 0x2C, 0xF1, + 0xB8, 0xD5, 0x17, 0xD7, 0x2B, 0xE1, 0xF8, 0xD4, 0x26, 0xEB, 0x93, 0xE0, + 0x32, 0xE8, 0x8A, 0xD8, 0xA3, 0xDC, 0x3D, 0xCD, 0xD0, 0xDC, 0x94, 0xCE, + 0xA0, 0xE8, 0x0B, 0xD6, 0x5C, 0xEA, 0x75, 0xE1, 0xF6, 0xE7, 0x6D, 0xE1, + 0xBE, 0xF3, 0x79, 0xEC, 0xDE, 0x09, 0x27, 0x01, 0xF9, 0x1A, 0x20, 0x0D, + 0x2F, 0x21, 0x08, 0x10, 0x32, 0x0A, 0x33, 0x03, 0x52, 0xF2, 0x53, 0x06, + 0xB9, 0x09, 0xD5, 0x19, 0x4B, 0x2B, 0x4D, 0x2D, 0x2A, 0x1E, 0xB0, 0x37, + 0x79, 0x05, 0x4C, 0x27, 0x40, 0xF1, 0xFC, 0x0D, 0x21, 0xE1, 0x79, 0xFF, + 0x16, 0xE7, 0x62, 0xFF, 0x87, 0xEB, 0x46, 0xF8, 0x64, 0xDC, 0xA1, 0xE3, + 0x80, 0xE0, 0x96, 0xE2, 0x40, 0xF8, 0x08, 0xE8, 0x25, 0xE3, 0xE4, 0xD9, + 0xA9, 0xC0, 0x16, 0xD8, 0xE7, 0xCF, 0xCD, 0xF2, 0xF2, 0xF0, 0xBB, 0x05, + 0x69, 0x0E, 0x68, 0x08, 0x77, 0x1E, 0xC6, 0x14, 0x96, 0x08, 0x11, 0x0E, + 0x64, 0x06, 0x74, 0x03, 0x99, 0x38, 0x19, 0x2A, 0x87, 0x5E, 0x9B, 0x49, + 0xF4, 0x45, 0x21, 0x2C, 0x14, 0x1F, 0xD6, 0x09, 0x1F, 0x26, 0x12, 0x11, + 0x66, 0x37, 0x0D, 0x1B, 0x61, 0x30, 0x5E, 0x18, 0x1B, 0x1C, 0x11, 0x19, + 0x58, 0x0E, 0xAD, 0x13, 0x4C, 0x10, 0xD4, 0x09, 0xD6, 0x0F, 0x77, 0x04, + 0x37, 0x0B, 0x5F, 0x02, 0x2A, 0x01, 0x51, 0x02, 0xE3, 0xF3, 0x67, 0x0B, + 0x09, 0x04, 0x84, 0x13, 0x6C, 0x11, 0x81, 0x03, 0x03, 0x05, 0xF6, 0xEC, + 0x84, 0xEB, 0x9F, 0xD4, 0xD3, 0xDB, 0x8E, 0xCE, 0x0E, 0xD3, 0x6D, 0xDC, + 0x7F, 0xC1, 0x7F, 0xE5, 0x00, 0xC8, 0x2C, 0xEC, 0xFF, 0xE1, 0xBC, 0xE4, + 0x85, 0xED, 0xD0, 0xD9, 0xA9, 0xEE, 0x19, 0xCD, 0x00, 0xF9, 0x78, 0xD5, + 0x98, 0x09, 0x92, 0xF2, 0x38, 0x12, 0xE3, 0xFC, 0xD8, 0x16, 0x46, 0x12, + 0xA1, 0x21, 0x6E, 0x29, 0x8E, 0x27, 0xB6, 0x2A, 0x36, 0x20, 0xD6, 0x2F, + 0xE5, 0x1B, 0x38, 0x2F, 0xD4, 0x2A, 0x05, 0x31, 0xF6, 0x2A, 0x27, 0x38, + 0x1A, 0x0B, 0x01, 0x33, 0x08, 0xEA, 0x6D, 0x24, 0x5A, 0xD9, 0xD0, 0x13, + 0x00, 0xDB, 0x44, 0x08, 0x87, 0xE2, 0x18, 0x04, 0xD6, 0xE3, 0x83, 0xF7, + 0x7C, 0xED, 0x05, 0xE4, 0x91, 0xF9, 0xFB, 0xE3, 0xED, 0xEB, 0x72, 0xE4, + 0x8B, 0xDA, 0xCE, 0xDB, 0xC2, 0xE2, 0x5B, 0xE2, 0x9A, 0x07, 0x73, 0xF2, + 0xA8, 0x22, 0x88, 0xFE, 0x2D, 0x2C, 0x05, 0x12, 0x2B, 0x18, 0x27, 0x19, + 0x6A, 0xF5, 0x5C, 0x08, 0x1E, 0x17, 0x37, 0x11, 0x14, 0x4B, 0x3B, 0x31, + 0xF8, 0x33, 0xA1, 0x30, 0xC2, 0x07, 0xEA, 0x1B, 0x31, 0x03, 0xF9, 0x14, + 0x7A, 0x26, 0xE0, 0x24, 0x9F, 0x3C, 0xC4, 0x30, 0x1B, 0x27, 0x0A, 0x21, + 0x98, 0x17, 0xDD, 0x13, 0xBB, 0x12, 0x30, 0x10, 0x5C, 0xFE, 0xF5, 0x0C, + 0x86, 0xF6, 0x99, 0x15, 0x17, 0xFA, 0x81, 0x15, 0x19, 0xF2, 0x98, 0x17, + 0x16, 0xFB, 0x31, 0x2D, 0x0C, 0x10, 0x0D, 0x2B, 0x00, 0x0B, 0xBF, 0x03, + 0xE1, 0xED, 0xE9, 0xE2, 0xC3, 0xE1, 0xF8, 0xD4, 0xAD, 0xF1, 0x68, 0xC4, + 0x3E, 0x01, 0x67, 0xBF, 0x6B, 0x03, 0x5A, 0xCB, 0x8B, 0xFA, 0x57, 0xD5, + 0x15, 0xF3, 0x83, 0xDD, 0x8D, 0xF4, 0xA9, 0xDF, 0x82, 0xEE, 0xF4, 0xDE, + 0x27, 0xF1, 0x0A, 0xE7, 0x37, 0xF8, 0x69, 0xF3, 0xDC, 0x04, 0x2F, 0x05, + 0x83, 0x2A, 0xFD, 0x0C, 0xBA, 0x39, 0x20, 0x08, 0x5B, 0x32, 0xE9, 0x10, + 0xB5, 0x2A, 0x03, 0x1D, 0x56, 0x2E, 0xDB, 0x2D, 0x34, 0x31, 0x20, 0x37, + 0x14, 0x19, 0xCE, 0x2B, 0x6C, 0x03, 0x96, 0x24, 0x43, 0xF8, 0x92, 0x1D, + 0x75, 0xE7, 0xF6, 0x10, 0xE5, 0xD5, 0xAE, 0x04, 0xE5, 0xCE, 0x8E, 0x00, + 0x43, 0xC3, 0x1F, 0xF3, 0x79, 0xC0, 0x18, 0xE7, 0x9E, 0xD0, 0x72, 0xE8, + 0x9E, 0xCE, 0x8B, 0xE4, 0x71, 0xD2, 0xA7, 0xEB, 0xD6, 0xE0, 0x56, 0xFE, + 0x2C, 0xF3, 0x56, 0x14, 0xED, 0x13, 0xA2, 0x25, 0xC7, 0x1C, 0xFD, 0x1A, + 0x02, 0x09, 0x43, 0x0B, 0x13, 0x11, 0xD7, 0x20, 0x0A, 0x3D, 0xBE, 0x46, + 0x98, 0x47, 0xC9, 0x40, 0x6A, 0x2C, 0x94, 0x17, 0xE1, 0x19, 0x22, 0xFE, + 0x70, 0x1F, 0x87, 0xFF, 0x17, 0x30, 0x35, 0x0D, 0xC1, 0x25, 0xA7, 0x17, + 0x54, 0x08, 0xDF, 0x0F, 0xAA, 0xF9, 0x63, 0x05, 0x39, 0xFC, 0xE8, 0x09, + 0x2A, 0xFB, 0x52, 0xFD, 0x75, 0xF1, 0x57, 0xEF, 0xE8, 0xEE, 0x2D, 0xEF, + 0xBD, 0xFA, 0x78, 0xEE, 0x91, 0x15, 0x74, 0x03, 0x42, 0x1C, 0x3A, 0x0C, + 0xB9, 0xFA, 0x12, 0xF6, 0x02, 0xE7, 0xAC, 0xEB, 0x96, 0xF5, 0x90, 0xEE, + 0x2C, 0x02, 0x73, 0xE9, 0x8D, 0xF6, 0x6A, 0xDC, 0x9A, 0xE8, 0xB7, 0xDB, + 0x35, 0xF7, 0xB6, 0xE9, 0xC1, 0x01, 0xDF, 0xEE, 0xAA, 0xF6, 0xF1, 0xEE, + 0xBE, 0xEE, 0x93, 0xF4, 0xFA, 0xF4, 0x08, 0x04, 0xCC, 0x0A, 0x5F, 0x18, + 0xA7, 0x19, 0x60, 0x22, 0xCB, 0x21, 0xDB, 0x1F, 0xB9, 0x21, 0x8E, 0x14, + 0x39, 0x1B, 0x4A, 0x12, 0x84, 0x22, 0x20, 0x18, 0x53, 0x2E, 0xB5, 0x23, + 0xAC, 0x2C, 0x2A, 0x2B, 0x8A, 0x1E, 0xA4, 0x26, 0x2B, 0x06, 0x66, 0x17, + 0x4D, 0xFF, 0x24, 0xFF, 0x68, 0x01, 0x4E, 0xE9, 0x5E, 0xF5, 0x09, 0xE1, + 0xA2, 0xE4, 0xAA, 0xDF, 0x2D, 0xCE, 0x42, 0xE3, 0x04, 0xC7, 0x2D, 0xED, + 0x7F, 0xCA, 0x6A, 0xEE, 0xCD, 0xCA, 0xA0, 0xE5, 0x0A, 0xD6, 0x04, 0xE9, + 0xDF, 0xF0, 0x4C, 0x09, 0x41, 0x04, 0x98, 0x14, 0xD5, 0x0A, 0xAD, 0x0D, + 0x18, 0x03, 0xE9, 0x06, 0xA4, 0xFF, 0x18, 0x0A, 0xB6, 0x19, 0x1E, 0x29, + 0xE1, 0x3F, 0x97, 0x37, 0xFF, 0x3A, 0x17, 0x29, 0xE5, 0x09, 0x3B, 0x0F, + 0x7D, 0xFC, 0xC1, 0xFB, 0xF0, 0x1E, 0x44, 0xFF, 0xDD, 0x2C, 0x12, 0x05, + 0x07, 0x11, 0x5E, 0xF2, 0x0A, 0x01, 0xB9, 0xEF, 0x0F, 0x01, 0xEF, 0x00, + 0x2A, 0xF9, 0x31, 0x06, 0xCC, 0xF1, 0xFE, 0xFA, 0x7E, 0xF5, 0xB3, 0xF8, + 0xBA, 0xF8, 0xFA, 0x09, 0xD9, 0xF2, 0xE8, 0x11, 0xF2, 0xFA, 0x7F, 0x11, + 0x96, 0xFD, 0xC8, 0xFB, 0x33, 0xF9, 0xA9, 0xE0, 0xA6, 0x01, 0x7E, 0xDF, + 0x1C, 0xFA, 0xE7, 0xDB, 0x90, 0xE9, 0xA8, 0xD3, 0x03, 0xDE, 0xDC, 0xDA, + 0xF8, 0xDB, 0x85, 0xEB, 0x6D, 0xF0, 0xDA, 0x01, 0xC9, 0xFC, 0x96, 0x0A, + 0x28, 0xF9, 0x2E, 0x02, 0xAB, 0x01, 0x36, 0xF9, 0x93, 0x06, 0x27, 0x08, + 0x0B, 0x00, 0x79, 0x1D, 0x73, 0x0A, 0x7C, 0x2B, 0x41, 0x1C, 0x9C, 0x2E, + 0x67, 0x22, 0xEC, 0x18, 0x40, 0x26, 0x6E, 0x0D, 0xE2, 0x2D, 0x42, 0x21, + 0xD8, 0x2B, 0x22, 0x21, 0xBD, 0x20, 0xCA, 0x1A, 0x83, 0x0B, 0x42, 0x1B, + 0x48, 0xED, 0xEE, 0x05, 0x82, 0xE0, 0x7C, 0xF5, 0x35, 0xDE, 0xF8, 0xEA, + 0xD4, 0xD3, 0x25, 0xE2, 0x1B, 0xD4, 0xD3, 0xD7, 0x92, 0xE7, 0x97, 0xD1, + 0xDD, 0xEB, 0x80, 0xC8, 0xEC, 0xE1, 0x28, 0xB8, 0x3E, 0xE4, 0xD7, 0xB8, + 0xE7, 0xF0, 0xF5, 0xCE, 0x03, 0x01, 0x10, 0xE2, 0x4E, 0x12, 0xE7, 0xFA, + 0x5E, 0x18, 0xB7, 0x05, 0xCC, 0x08, 0x8B, 0xED, 0x7C, 0x0F, 0xB0, 0xF5, + 0xED, 0x37, 0xD1, 0x2A, 0x35, 0x3B, 0xFF, 0x38, 0x69, 0x09, 0xD1, 0x12, + 0x52, 0xEF, 0xB6, 0x04, 0x53, 0xFF, 0xB5, 0x0F, 0x0D, 0x0F, 0x2B, 0x12, + 0xA9, 0x0F, 0x74, 0x14, 0xD4, 0x04, 0x38, 0x03, 0xDC, 0xF0, 0x3A, 0xEF, + 0x20, 0xED, 0x27, 0xF2, 0x00, 0xEF, 0x94, 0xF7, 0x8F, 0xE4, 0x33, 0x01, + 0xA2, 0xE8, 0x16, 0x0C, 0xFE, 0xF2, 0x2E, 0x13, 0x96, 0x01, 0x42, 0x18, + 0xC7, 0x00, 0xE3, 0x11, 0x1F, 0xE2, 0x5E, 0xF6, 0x0E, 0xC9, 0x5D, 0xDC, + 0x85, 0xC5, 0x5C, 0xDE, 0xAC, 0xCB, 0xB6, 0xD8, 0x12, 0xCE, 0xC0, 0xC4, + 0x69, 0xC9, 0x91, 0xBA, 0xE1, 0xDA, 0xC5, 0xC1, 0xE9, 0xF0, 0xD8, 0xD1, + 0xAE, 0xF2, 0xC6, 0xC8, 0xA5, 0xF6, 0xA5, 0xC5, 0x2B, 0x09, 0x11, 0xDF, + 0x3E, 0x22, 0x9F, 0xF7, 0x7C, 0x32, 0xBE, 0x07, 0xBA, 0x31, 0x46, 0x0B, + 0x67, 0x22, 0xDD, 0x0F, 0xDE, 0x17, 0x5B, 0x1F, 0xF7, 0x19, 0x7A, 0x29, + 0xB8, 0x15, 0xD4, 0x2B, 0x0B, 0x0F, 0x8C, 0x26, 0x6B, 0x0F, 0x02, 0x21, + 0x56, 0xFB, 0x69, 0x12, 0x65, 0xE0, 0xEC, 0xFC, 0xE0, 0xD8, 0x40, 0xF2, + 0x2B, 0xD4, 0xD2, 0xE1, 0xDA, 0xCD, 0x3E, 0xDD, 0x42, 0xC7, 0x79, 0xED, + 0xC0, 0xB6, 0x4A, 0xF2, 0x67, 0xB9, 0xA1, 0xE2, 0x3B, 0xCF, 0x9F, 0xD0, + 0xF0, 0xE6, 0xF2, 0xD8, 0xC6, 0x00, 0xC6, 0xF2, 0x85, 0x10, 0x5B, 0x03, + 0x71, 0x20, 0xC6, 0x06, 0x28, 0x25, 0xE8, 0xF5, 0x0E, 0x24, 0x95, 0xF7, + 0x7A, 0x38, 0x93, 0x19, 0x54, 0x45, 0xD1, 0x30, 0xCA, 0x2E, 0x75, 0x28, + 0x82, 0x19, 0x94, 0x0E, 0x12, 0x14, 0x84, 0x04, 0x2B, 0x18, 0x35, 0x0A, + 0x9A, 0x23, 0x2F, 0x0D, 0x7B, 0x0F, 0xDB, 0x00, 0x05, 0xEA, 0xF3, 0xFD, + 0x36, 0xD4, 0x61, 0x09, 0xE5, 0xD4, 0x04, 0x0A, 0xCB, 0xDF, 0x4D, 0xFF, + 0x80, 0xE3, 0x40, 0xFB, 0x51, 0xE9, 0x99, 0x11, 0xC2, 0xF8, 0x1E, 0x27, + 0x3C, 0x00, 0x44, 0x23, 0x47, 0xF4, 0x90, 0x12, 0xE4, 0xED, 0x48, 0xFD, + 0x2A, 0xF2, 0xF3, 0xEA, 0x2C, 0xE8, 0x7C, 0xD4, 0xC3, 0xD2, 0x9B, 0xC4, + 0x76, 0xC7, 0x1F, 0xCD, 0xED, 0xD8, 0x61, 0xCF, 0x62, 0xF3, 0xC3, 0xCE, + 0xA1, 0xF6, 0x6E, 0xD0, 0xE4, 0xE6, 0x81, 0xD4, 0xF0, 0xE3, 0x6D, 0xED, + 0x9D, 0x00, 0xF1, 0x06, 0xC4, 0x21, 0x75, 0x13, 0x19, 0x3A, 0x01, 0x16, + 0xE4, 0x46, 0x91, 0x0E, 0x2C, 0x46, 0xFA, 0x07, 0x6C, 0x38, 0x9B, 0x04, + 0x5D, 0x29, 0xB4, 0x0C, 0x10, 0x25, 0xC7, 0x28, 0xB0, 0x16, 0x16, 0x37, + 0x6A, 0x0A, 0x66, 0x28, 0xBF, 0x0C, 0x3B, 0x11, 0x29, 0xF5, 0x06, 0xFA, + 0x21, 0xD1, 0x9C, 0xE6, 0x4B, 0xC6, 0x2B, 0xDD, 0x96, 0xC8, 0xE0, 0xDE, + 0x61, 0xD1, 0x09, 0xE9, 0xF1, 0xD6, 0x1F, 0xE9, 0x88, 0xDB, 0xB9, 0xDD, + 0xBC, 0xE6, 0x5D, 0xD7, 0x5E, 0xF9, 0xF6, 0xE2, 0x3A, 0x0F, 0x94, 0xF6, + 0x44, 0x23, 0xC4, 0x02, 0xD7, 0x23, 0x54, 0x00, 0xC8, 0x0B, 0x00, 0xFB, + 0xB1, 0x19, 0xC7, 0x18, 0x3C, 0x4F, 0x68, 0x3F, 0x65, 0x5E, 0x82, 0x3C, + 0x8D, 0x3A, 0x3F, 0x11, 0xEF, 0x14, 0xBE, 0xF4, 0x1F, 0x0A, 0xDB, 0x05, + 0xFD, 0x05, 0x15, 0x11, 0x17, 0xF8, 0xA0, 0x01, 0x88, 0xEE, 0x97, 0xF3, + 0x89, 0xED, 0xAB, 0x02, 0x16, 0xEC, 0xF9, 0x14, 0xC2, 0xE9, 0x18, 0x09, + 0x91, 0xEA, 0xA4, 0xF7, 0x6C, 0xEB, 0x5B, 0xF9, 0x64, 0xF2, 0xF8, 0x11, + 0x33, 0xFC, 0xFF, 0x23, 0x06, 0xF6, 0x7F, 0x11, 0x20, 0xE9, 0xAA, 0xF7, + 0xCB, 0xE0, 0x21, 0xE7, 0xE0, 0xD7, 0xF6, 0xE1, 0x16, 0xD0, 0x9F, 0xE8, + 0xC5, 0xD4, 0xEF, 0xE4, 0xC9, 0xE1, 0xDF, 0xE1, 0x2B, 0xDE, 0x7C, 0xEA, + 0x16, 0xDC, 0xD9, 0xED, 0x20, 0xE6, 0xE3, 0xE6, 0xC7, 0xE9, 0x81, 0xE7, + 0xCE, 0xF2, 0xD6, 0xF4, 0xEB, 0x03, 0xD1, 0x16, 0x68, 0x0B, 0x42, 0x32, + 0x6F, 0x0B, 0xB9, 0x27, 0xA8, 0x1E, 0x2C, 0x1D, 0x30, 0x2E, 0xA8, 0x1D, + 0x60, 0x29, 0xCA, 0x17, 0xE7, 0x26, 0xAB, 0x16, 0x0E, 0x26, 0x12, 0x18, + 0xB8, 0x14, 0x9E, 0x02, 0x2C, 0x05, 0xCB, 0xE8, 0xEA, 0x07, 0xA9, 0xDF, + 0x59, 0x00, 0xB5, 0xE0, 0x03, 0xF9, 0x75, 0xE2, 0x40, 0xF4, 0xC6, 0xD9, + 0x1D, 0xE9, 0x2D, 0xDE, 0x3C, 0xE0, 0x5B, 0xE4, 0x08, 0xD7, 0x53, 0xE3, + 0xB9, 0xD8, 0xA2, 0xE8, 0x42, 0xF2, 0x98, 0xF2, 0xC7, 0x11, 0x3D, 0x04, + 0xBD, 0x1B, 0x04, 0x10, 0x7E, 0x1E, 0x29, 0x11, 0x38, 0x22, 0x72, 0x07, + 0x9C, 0x2A, 0x6F, 0xFF, 0x76, 0x47, 0x35, 0x14, 0x57, 0x56, 0x77, 0x33, + 0xEF, 0x31, 0x53, 0x2F, 0x66, 0x0C, 0x9C, 0x1A, 0x3E, 0x07, 0x8B, 0x17, + 0x1F, 0x06, 0x8A, 0x28, 0x70, 0xFA, 0x9A, 0x2D, 0x40, 0xEC, 0x1A, 0x1F, + 0x84, 0xED, 0x84, 0x18, 0xD2, 0xF2, 0xA5, 0x11, 0xDF, 0xF8, 0x72, 0x0C, + 0xAF, 0xFB, 0xAE, 0x01, 0x20, 0xF7, 0xBF, 0x02, 0x17, 0xF7, 0x48, 0x1D, + 0x0B, 0xFE, 0xCD, 0x2A, 0xB4, 0x02, 0x1B, 0x1D, 0x8A, 0xFB, 0x28, 0x02, + 0xAF, 0xEE, 0x91, 0xF2, 0xBD, 0xE9, 0x71, 0xDC, 0x88, 0xE1, 0x79, 0xC4, + 0xCB, 0xD2, 0x95, 0xBE, 0x92, 0xD4, 0xE9, 0xC5, 0x34, 0xE3, 0x3E, 0xD8, + 0x2C, 0xF4, 0x79, 0xE8, 0x23, 0x00, 0x6F, 0xE9, 0xEA, 0x03, 0x4F, 0xE2, + 0x8B, 0x07, 0x04, 0xE3, 0xA5, 0x11, 0x14, 0xF5, 0xA2, 0x1A, 0x08, 0x03, + 0x6B, 0x23, 0x7D, 0x07, 0x1E, 0x20, 0xDD, 0x10, 0x57, 0x15, 0xFD, 0x11, + 0x94, 0x17, 0x85, 0x19, 0xED, 0x1D, 0xFC, 0x22, 0x47, 0x25, 0xD0, 0x25, + 0xA6, 0x20, 0x87, 0x28, 0xB6, 0x07, 0xEA, 0x1C, 0x63, 0xF0, 0x13, 0x09, + 0x26, 0xDE, 0x48, 0x01, 0xF5, 0xD4, 0xD6, 0x06, 0x2E, 0xE0, 0x77, 0x06, + 0xE2, 0xEB, 0x85, 0xF4, 0x1E, 0xEA, 0xAE, 0xF0, 0x08, 0xE0, 0x2A, 0xEF, + 0x02, 0xDD, 0x66, 0xE0, 0x46, 0xE9, 0xC1, 0xE5, 0x89, 0xFC, 0x09, 0xFD, + 0x75, 0x18, 0x8D, 0x12, 0x9E, 0x34, 0xE8, 0x1F, 0xD7, 0x3E, 0x83, 0x20, + 0xA9, 0x3A, 0x48, 0x1A, 0x11, 0x3E, 0x7B, 0x31, 0xA1, 0x4D, 0xFE, 0x58, + 0xCC, 0x4C, 0x58, 0x50, 0x12, 0x32, 0x2B, 0x24, 0x20, 0x27, 0x7D, 0x09, + 0xCC, 0x2B, 0xCC, 0x0B, 0x49, 0x23, 0xD4, 0x1D, 0xE4, 0x13, 0x7A, 0x1E, + 0xDA, 0xFF, 0x4C, 0x0B, 0x74, 0xF6, 0xB1, 0x07, 0x42, 0xEA, 0xEA, 0x0F, + 0x42, 0xDF, 0x0B, 0x09, 0x8C, 0xF3, 0xD9, 0x02, 0xEB, 0x10, 0x9C, 0x05, + 0xEA, 0x22, 0x1F, 0x04, 0x3B, 0x24, 0xAE, 0x04, 0x75, 0x0F, 0x00, 0x03, + 0x51, 0xF1, 0xF2, 0xFC, 0xD8, 0xE0, 0xCC, 0xF5, 0xC3, 0xD0, 0x34, 0xE1, + 0xD4, 0xBE, 0xAF, 0xCB, 0xFB, 0xC6, 0x03, 0xBB, 0x4F, 0xD7, 0x40, 0xB8, + 0x1F, 0xEA, 0xBC, 0xC7, 0x07, 0xF7, 0xB0, 0xD0, 0x37, 0xEF, 0x0F, 0xDA, + 0xFE, 0xF3, 0x61, 0xE8, 0x3F, 0x0C, 0x12, 0xFA, 0xC2, 0x1E, 0xC7, 0x10, + 0xDC, 0x26, 0x0E, 0x24, 0xFE, 0x22, 0x44, 0x29, 0x39, 0x1B, 0x54, 0x22, + 0x47, 0x10, 0x73, 0x22, 0xCC, 0x06, 0xFB, 0x29, 0x8F, 0x02, 0x6D, 0x27, + 0xA2, 0xFB, 0xEC, 0x29, 0x8E, 0xF8, 0x61, 0x28, 0x6E, 0xEA, 0x08, 0x0E, + 0x21, 0xE6, 0xFC, 0xF1, 0x3A, 0xE9, 0x4A, 0xE1, 0x5E, 0xD9, 0xCF, 0xE5, + 0x23, 0xC6, 0xAC, 0xE9, 0xCE, 0xC7, 0xF5, 0xED, 0xDD, 0xE0, 0xCE, 0xF9, + 0x4A, 0xEC, 0xC8, 0xF1, 0x3E, 0xEA, 0xA7, 0xE6, 0x1D, 0xF2, 0x9D, 0xEF, + 0xE4, 0xF9, 0x9C, 0xFD, 0x1F, 0x0B, 0xDC, 0x02, 0x7A, 0x22, 0x8E, 0x04, + 0xF3, 0x22, 0x07, 0xF4, 0xEB, 0x25, 0xF6, 0xF8, 0xB7, 0x45, 0xEC, 0x2B, + 0x14, 0x54, 0x1B, 0x40, 0x96, 0x2F, 0x9E, 0x33, 0xF5, 0x0F, 0xFE, 0x24, + 0xA6, 0x11, 0xC4, 0x1B, 0xE9, 0x18, 0x63, 0x22, 0xEB, 0x13, 0x38, 0x21, + 0xB6, 0x05, 0x96, 0x0D, 0x13, 0x01, 0xDF, 0xFF, 0x95, 0xFA, 0x99, 0x05, + 0x1E, 0xF5, 0xE5, 0x03, 0x41, 0xFF, 0xFD, 0xF4, 0xB1, 0x0C, 0x51, 0xF9, + 0x2D, 0x0C, 0x74, 0xFE, 0xE9, 0x08, 0x2C, 0xFC, 0xFD, 0x08, 0x49, 0xF9, + 0xF2, 0xFB, 0x6A, 0xE6, 0x4A, 0xEF, 0x30, 0xDA, 0x56, 0xDB, 0x98, 0xDE, + 0x1D, 0xBD, 0x85, 0xE4, 0xF3, 0xB9, 0x0E, 0xD8, 0x1B, 0xCE, 0x93, 0xC4, + 0xAE, 0xE8, 0x60, 0xCC, 0x7C, 0xF8, 0xE3, 0xDE, 0xA5, 0xED, 0xC4, 0xE9, + 0x24, 0xEC, 0x06, 0xFE, 0x40, 0x03, 0x29, 0x0B, 0x24, 0x22, 0xF9, 0x0F, + 0x90, 0x38, 0x72, 0x22, 0xD7, 0x3D, 0x99, 0x37, 0x4F, 0x34, 0x68, 0x2E, + 0xC2, 0x1D, 0xF1, 0x1C, 0x51, 0x10, 0x23, 0x17, 0xA2, 0x07, 0xF0, 0x15, + 0x84, 0xF1, 0xCD, 0x1D, 0x0F, 0xE9, 0x27, 0x1A, 0x12, 0xEB, 0xDF, 0x02, + 0xD7, 0xE7, 0xB0, 0xEA, 0xF1, 0xE2, 0xF6, 0xE1, 0xC4, 0xDC, 0x01, 0xE2, + 0xBE, 0xD2, 0x5A, 0xE0, 0xFB, 0xD4, 0x2A, 0xD9, 0xB9, 0xE9, 0x88, 0xD8, + 0xBE, 0xE8, 0x2D, 0xD9, 0x6E, 0xDF, 0x4B, 0xD6, 0x12, 0xEE, 0x8C, 0xDA, + 0x52, 0xFE, 0xE9, 0xE5, 0xC6, 0x04, 0x0F, 0xFD, 0xC1, 0x04, 0x4B, 0x1E, + 0xA9, 0x01, 0x86, 0x25, 0xB8, 0x07, 0xC0, 0x17, 0xA1, 0x31, 0x8D, 0x20, + 0xA3, 0x5D, 0x13, 0x33, 0x14, 0x4E, 0x74, 0x26, 0xC3, 0x24, 0x6C, 0x07, + 0x3D, 0x07, 0x9B, 0xFC, 0x76, 0xFA, 0x90, 0x0B, 0x28, 0xF9, 0xDA, 0x1C, + 0x94, 0xE8, 0xAF, 0x14, 0x2B, 0xE6, 0x84, 0x01, 0x53, 0xF9, 0x32, 0xFE, + 0x44, 0xF8, 0xFA, 0xFC, 0xA7, 0xF0, 0x64, 0xFA, 0xBC, 0xEF, 0x9E, 0x02, + 0xCE, 0xF7, 0xB6, 0x0A, 0xA4, 0x04, 0xBD, 0x17, 0x1F, 0x16, 0xA3, 0x1C, + 0x11, 0x21, 0xC6, 0x10, 0xD5, 0x1A, 0xFE, 0xFA, 0x24, 0x13, 0x04, 0xE2, + 0x78, 0xFA, 0x22, 0xC9, 0x3B, 0xD7, 0x39, 0xB8, 0xF7, 0xC9, 0x21, 0xB5, + 0x9C, 0xC8, 0x5C, 0xBB, 0x02, 0xD1, 0x75, 0xD4, 0x70, 0xDF, 0xB5, 0xE8, + 0xAE, 0xE7, 0x7F, 0xE7, 0xE0, 0xF0, 0x09, 0xEE, 0xA2, 0x00, 0xA5, 0xF8, + 0x29, 0x13, 0xDF, 0x02, 0x9C, 0x1A, 0x27, 0x14, 0x54, 0x25, 0x79, 0x21, + 0x44, 0x35, 0x77, 0x27, 0x8D, 0x33, 0xCF, 0x2B, 0x79, 0x2B, 0xEC, 0x2E, + 0x86, 0x1F, 0x40, 0x2D, 0x3E, 0x13, 0xB2, 0x29, 0x59, 0x0C, 0x3D, 0x1C, + 0x3A, 0xFC, 0xE3, 0x04, 0x32, 0xEA, 0xE9, 0xF4, 0x89, 0xDB, 0x62, 0xED, + 0xF2, 0xD5, 0xE6, 0xE4, 0xD7, 0xCD, 0x51, 0xE0, 0xEA, 0xC9, 0xC4, 0xEC, + 0xC5, 0xCD, 0xE9, 0xF7, 0xC5, 0xCB, 0x7F, 0xEF, 0x7A, 0xD9, 0xCA, 0xF0, + 0xAE, 0xF0, 0x23, 0xFA, 0x1E, 0xFA, 0xBC, 0xF7, 0xC8, 0x0D, 0xDB, 0xFE, + 0x3F, 0x23, 0x42, 0x10, 0x17, 0x14, 0xE4, 0x0F, 0x07, 0x10, 0xFF, 0x14, + 0xCD, 0x32, 0x55, 0x33, 0x4A, 0x41, 0xE3, 0x3A, 0x2B, 0x2D, 0x36, 0x19, + 0x54, 0x21, 0x16, 0xFB, 0x1D, 0x1F, 0xFC, 0xF6, 0x3A, 0x14, 0xF3, 0x04, + 0x30, 0xFE, 0xD7, 0x0B, 0xF3, 0xE3, 0x97, 0xFC, 0x1B, 0xDE, 0xEB, 0xF1, + 0x62, 0xF0, 0x70, 0xEB, 0x0A, 0xFE, 0x82, 0xDF, 0x13, 0x04, 0x1E, 0xE5, + 0xF2, 0x0E, 0x80, 0xF5, 0x24, 0x1C, 0x29, 0x01, 0xE1, 0x22, 0x83, 0x15, + 0x5C, 0x10, 0xC6, 0x1A, 0x0D, 0xF8, 0x10, 0x0F, 0x5D, 0xF8, 0xDA, 0x02, + 0xB0, 0xF5, 0xAF, 0xED, 0xFB, 0xDD, 0x55, 0xDB, 0x9C, 0xC9, 0xBF, 0xD6, + 0xA7, 0xD4, 0xF6, 0xD2, 0x53, 0xEE, 0xB7, 0xCF, 0xD8, 0xF5, 0xC1, 0xD6, + 0x24, 0xF3, 0x28, 0xE0, 0xD5, 0xF5, 0xFE, 0xE6, 0x0F, 0xFC, 0xB3, 0xF0, + 0x41, 0x0D, 0xC7, 0x03, 0x55, 0x21, 0x55, 0x18, 0x64, 0x1D, 0xA4, 0x1D, + 0xDD, 0x10, 0xCB, 0x1B, 0x5A, 0x14, 0x58, 0x14, 0x0B, 0x1D, 0xE0, 0x0B, + 0xA2, 0x1D, 0x25, 0x0E, 0x50, 0x16, 0xA8, 0x19, 0x0F, 0x04, 0x47, 0x20, + 0xE3, 0xE5, 0x16, 0x11, 0x33, 0xD7, 0x80, 0x01, 0xB1, 0xD9, 0x7B, 0xF7, + 0x02, 0xDD, 0x33, 0xEE, 0x81, 0xDD, 0x5A, 0xE5, 0xA3, 0xD8, 0x37, 0xD5, + 0xDB, 0xD9, 0x73, 0xD2, 0xF9, 0xD0, 0x10, 0xD7, 0x04, 0xC1, 0xEC, 0xD7, + 0x27, 0xCE, 0xD5, 0xED, 0x8A, 0xE9, 0x9D, 0x04, 0x6B, 0x00, 0x6B, 0x06, + 0xF3, 0x19, 0x7A, 0x08, 0xE1, 0x1A, 0x32, 0x08, 0x38, 0x13, 0x57, 0x01, + 0x98, 0x2C, 0x17, 0x0C, 0x4C, 0x42, 0xC1, 0x22, 0x6B, 0x2D, 0x4F, 0x1A, + 0xFC, 0x14, 0x56, 0xFB, 0x14, 0x16, 0x36, 0xF2, 0xD7, 0x1A, 0x6C, 0x04, + 0xCC, 0x16, 0x91, 0x0E, 0xD1, 0x09, 0x2A, 0x00, 0x94, 0xF9, 0x6D, 0xF5, + 0x5F, 0xFA, 0xC9, 0xFB, 0x47, 0xFA, 0x97, 0xFA, 0xE9, 0xF1, 0x94, 0xF7, + 0xF3, 0xFC, 0x48, 0xFE, 0x0F, 0x10, 0x04, 0x04, 0xAE, 0x15, 0x63, 0x08, + 0x38, 0x0B, 0x4F, 0x06, 0xF3, 0xFF, 0x1E, 0xFB, 0x93, 0xF5, 0x44, 0xF6, + 0x60, 0xE7, 0xAE, 0xF1, 0x9C, 0xDD, 0xC6, 0xE4, 0x49, 0xCF, 0x1F, 0xDD, + 0x0C, 0xC5, 0x9B, 0xE0, 0x6F, 0xD4, 0xE9, 0xED, 0x75, 0xE0, 0x63, 0xFB, + 0x0F, 0xE1, 0x6D, 0x0A, 0xB9, 0xE2, 0x5F, 0x08, 0x55, 0xF3, 0x38, 0xFD, + 0xC1, 0x10, 0x35, 0x0D, 0x73, 0x2B, 0x69, 0x25, 0x61, 0x3E, 0xEF, 0x2B, + 0x5D, 0x3E, 0xC1, 0x27, 0x70, 0x31, 0x77, 0x25, 0x3A, 0x1E, 0xBD, 0x23, + 0x1B, 0x0E, 0x82, 0x1E, 0x56, 0x09, 0x6F, 0x1C, 0x49, 0x0A, 0x71, 0x19, + 0x4C, 0x03, 0xA3, 0x00, 0x63, 0xF7, 0x8B, 0xE6, 0xFD, 0xE6, 0xC7, 0xDF, + 0xD4, 0xD0, 0xFD, 0xE1, 0x2B, 0xCA, 0x4B, 0xDC, 0x04, 0xD3, 0xB8, 0xC8, + 0xE9, 0xE6, 0x49, 0xC5, 0xD1, 0xF3, 0xFF, 0xC4, 0xC2, 0xF2, 0xA4, 0xC4, + 0x62, 0xF9, 0xED, 0xD8, 0x2C, 0x09, 0x6E, 0xEF, 0xBF, 0x14, 0x6C, 0xFC, + 0xA3, 0x19, 0xE8, 0x07, 0x21, 0x0F, 0xCF, 0x09, 0x0F, 0x04, 0x3F, 0xFE, + 0x14, 0x1D, 0x0C, 0x0C, 0x61, 0x43, 0x9E, 0x2E, 0x6E, 0x3A, 0xB9, 0x2B, + 0x75, 0x0F, 0xF8, 0x11, 0x4B, 0xFB, 0xFF, 0x0C, 0x50, 0xFB, 0xE6, 0x16, + 0x9B, 0xFE, 0xEB, 0x25, 0x39, 0x00, 0x3C, 0x30, 0x4C, 0xF9, 0xF5, 0x27, + 0xD6, 0xF3, 0x40, 0x14, 0x1C, 0xF2, 0x12, 0x07, 0x4F, 0xE8, 0x47, 0xFC, + 0x96, 0xDE, 0x18, 0xFD, 0x5E, 0xE3, 0xA0, 0x12, 0xF5, 0xF6, 0xB0, 0x1E, + 0xF6, 0x09, 0xEF, 0x17, 0x56, 0x0F, 0x72, 0x0C, 0xBD, 0x00, 0x8F, 0x03, + 0xF3, 0xE3, 0x1A, 0xF7, 0x00, 0xD2, 0x68, 0xDB, 0x89, 0xCF, 0x1B, 0xBB, + 0xF5, 0xD1, 0x66, 0xAC, 0xC1, 0xDA, 0xD3, 0xB9, 0x01, 0xEA, 0x32, 0xCD, + 0x8F, 0xFA, 0x3F, 0xDA, 0x83, 0xF7, 0xC7, 0xE5, 0x05, 0xF1, 0x27, 0xEC, + 0xAB, 0x0A, 0xCF, 0xF4, 0x55, 0x31, 0x33, 0x08, 0x64, 0x44, 0xB4, 0x1B, + 0x1A, 0x40, 0x2F, 0x22, 0x06, 0x3A, 0x9E, 0x27, 0x57, 0x32, 0x20, 0x30, + 0xAE, 0x27, 0x2F, 0x32, 0x4F, 0x28, 0xF3, 0x2F, 0xB8, 0x1F, 0x57, 0x2D, + 0x00, 0x05, 0xA6, 0x24, 0xE0, 0xEA, 0xF0, 0x03, 0x8A, 0xDC, 0x54, 0xE0, + 0xB7, 0xD2, 0x1E, 0xD8, 0x69, 0xC5, 0x44, 0xDC, 0x94, 0xB7, 0x73, 0xD7, + 0xD0, 0xBA, 0xC2, 0xD4, 0x69, 0xCC, 0x24, 0xDD, 0xF5, 0xD7, 0xF9, 0xD9, + 0x99, 0xED, 0x80, 0xD2, 0xBA, 0x05, 0x18, 0xE3, 0x3C, 0x10, 0x10, 0x01, + 0x9B, 0x18, 0x5B, 0x0D, 0x1F, 0x2C, 0xB4, 0x14, 0x99, 0x29, 0x53, 0x0C, + 0xC1, 0x20, 0xC0, 0x03, 0xA0, 0x45, 0xB4, 0x24, 0x28, 0x58, 0x01, 0x3C, + 0x89, 0x30, 0xE2, 0x2A, 0x05, 0x06, 0x82, 0x14, 0xF7, 0xFD, 0x10, 0x11, + 0xFB, 0x03, 0x16, 0x19, 0xF5, 0xF8, 0x29, 0x19, 0xAA, 0xE4, 0x65, 0x10, + 0xA2, 0xDC, 0xDA, 0x0D, 0xE1, 0xE3, 0xA8, 0x15, 0xFA, 0xE8, 0x4E, 0x12, + 0xF1, 0xE1, 0x2E, 0x06, 0x37, 0xED, 0x48, 0x0E, 0xCE, 0x06, 0xCC, 0x21, + 0x72, 0x0B, 0x7E, 0x29, 0x27, 0x07, 0xB7, 0x1F, 0xCD, 0x06, 0x4C, 0x0B, + 0x32, 0x07, 0x6B, 0xFB, 0x35, 0xFC, 0x22, 0xED, 0xFB, 0xDC, 0x16, 0xCB, + 0xC3, 0xBF, 0x1F, 0xB3, 0xA8, 0xB5, 0xD0, 0xC1, 0x05, 0xC2, 0x69, 0xD3, + 0xCD, 0xE5, 0x36, 0xD7, 0x9F, 0xFC, 0x48, 0xD8, 0xD5, 0xF4, 0xAC, 0xDF, + 0x6A, 0xFE, 0xA0, 0xF7, 0x85, 0x1F, 0x00, 0x0D, 0x84, 0x30, 0xC2, 0x11, + 0x4F, 0x39, 0xDC, 0x13, 0x80, 0x3F, 0x57, 0x17, 0x74, 0x3F, 0x69, 0x1F, + 0xA0, 0x41, 0xBB, 0x21, 0x20, 0x3C, 0xD3, 0x28, 0xE6, 0x20, 0x61, 0x33, + 0xC6, 0x02, 0x69, 0x33, 0x3F, 0xEF, 0xD8, 0x25, 0x51, 0xE5, 0xBE, 0x0D, + 0xE2, 0xE6, 0x8D, 0xF4, 0x53, 0xEB, 0x63, 0xE9, 0x42, 0xE6, 0x5E, 0xF1, + 0xDE, 0xE0, 0xDC, 0xE8, 0x0E, 0xE7, 0x84, 0xD7, 0xA6, 0xE1, 0x4F, 0xD5, + 0x22, 0xDC, 0x7C, 0xDC, 0x47, 0xE7, 0xBE, 0xE2, 0xBB, 0x05, 0xA8, 0xF5, + 0x09, 0x24, 0x15, 0x0F, 0xD8, 0x2B, 0x0C, 0x1B, 0x4C, 0x21, 0x1C, 0x15, + 0x4A, 0x0C, 0x45, 0x04, 0x6F, 0x23, 0x20, 0x0F, 0x86, 0x53, 0x40, 0x27, + 0xEA, 0x4D, 0x53, 0x1A, 0x9C, 0x2A, 0xC7, 0xFF, 0xFA, 0x19, 0xAF, 0x0A, + 0xEB, 0x14, 0x9C, 0x21, 0x0A, 0x09, 0x2C, 0x1F, 0x72, 0x00, 0x56, 0x12, + 0x60, 0xFE, 0xEC, 0x0C, 0x84, 0xFF, 0xBD, 0x0D, 0x61, 0xF9, 0xED, 0x08, + 0x8F, 0xE6, 0x22, 0x01, 0x0A, 0xEA, 0x0C, 0x08, 0xAB, 0xF6, 0xE3, 0x1A, + 0x0A, 0xF7, 0x9F, 0x21, 0x74, 0x01, 0xCA, 0x12, 0x88, 0x00, 0xF1, 0x07, + 0xBE, 0xF0, 0x87, 0x02, 0x90, 0xEB, 0x65, 0xF8, 0xA3, 0xDD, 0x54, 0xEF, + 0xE0, 0xC8, 0x81, 0xD8, 0x32, 0xC9, 0x6E, 0xCC, 0xFF, 0xD3, 0xE3, 0xD9, + 0xAF, 0xD6, 0xFC, 0xED, 0x73, 0xD8, 0x6B, 0xF8, 0x2C, 0xE1, 0x09, 0xEF, + 0xA8, 0xEF, 0xA5, 0xEE, 0xE8, 0x11, 0x79, 0x02, 0x16, 0x30, 0xFB, 0x11, + 0xFD, 0x32, 0xAB, 0x1B, 0xB6, 0x32, 0xC9, 0x1C, 0xAC, 0x32, 0x2D, 0x1C, + 0xD0, 0x27, 0x93, 0x19, 0x8F, 0x1A, 0x9C, 0x05, 0xD3, 0x1D, 0x29, 0x02, + 0x99, 0x1B, 0x18, 0x0F, 0x2C, 0x07, 0x12, 0x10, 0xB3, 0xFD, 0x30, 0x06, + 0x6B, 0xFA, 0xA8, 0xF9, 0x03, 0xEE, 0x8F, 0xEF, 0x1E, 0xE4, 0xF4, 0xEB, + 0x2A, 0xD6, 0xEB, 0xE9, 0xB2, 0xDA, 0x63, 0xEB, 0xA7, 0xED, 0x30, 0xE7, + 0x10, 0xF3, 0x87, 0xE2, 0x3F, 0xFA, 0x70, 0xE5, 0x9C, 0x0B, 0xD0, 0xED, + 0xA0, 0x1D, 0x1A, 0x07, 0x3E, 0x22, 0xA9, 0x15, 0x22, 0x24, 0x44, 0x11, + 0x1E, 0x19, 0x96, 0x0B, 0x0D, 0x1B, 0x9C, 0x18, 0x36, 0x41, 0x98, 0x32, + 0x64, 0x41, 0xCD, 0x33, 0x0B, 0x11, 0x06, 0x1F, 0xB6, 0xF8, 0xD8, 0x10, + 0x78, 0x0B, 0xAB, 0x16, 0x45, 0x24, 0x8D, 0x23, 0x77, 0x1C, 0x54, 0x1C, + 0xC1, 0xFE, 0xBB, 0x0A, 0x6D, 0xF0, 0x35, 0x09, 0x54, 0xF3, 0xFE, 0x0C, + 0x7D, 0xF5, 0x5E, 0xFA, 0x69, 0xF8, 0x12, 0xEC, 0x3F, 0xFF, 0x71, 0xFE, + 0x0D, 0x04, 0x38, 0x16, 0x28, 0x08, 0x54, 0x20, 0xC7, 0x02, 0x6D, 0x15, + 0x7A, 0xEA, 0x66, 0xF8, 0x41, 0xD2, 0x57, 0xDC, 0xD2, 0xCF, 0x69, 0xC6, + 0x1E, 0xD5, 0xE1, 0xB4, 0x39, 0xCD, 0x72, 0xAA, 0x32, 0xCC, 0xB0, 0xB5, + 0x41, 0xD9, 0xE8, 0xD8, 0x35, 0xE0, 0xC1, 0xE6, 0x6E, 0xE5, 0x93, 0xD7, + 0x88, 0xEC, 0xD1, 0xD3, 0x01, 0xF9, 0x09, 0xEA, 0x77, 0x16, 0x68, 0x04, + 0xA7, 0x35, 0xA7, 0x08, 0x3E, 0x41, 0xA8, 0x06, 0x1D, 0x38, 0xAA, 0x0D, + 0x68, 0x23, 0xC0, 0x15, 0xCC, 0x13, 0xF0, 0x26, 0x89, 0x0B, 0x8A, 0x33, + 0xAE, 0x09, 0xA1, 0x2F, 0x0D, 0xFE, 0xA9, 0x25, 0x32, 0xE4, 0xE3, 0x14, + 0x76, 0xCF, 0x83, 0x01, 0x5D, 0xBE, 0x0A, 0xEB, 0x5B, 0xBD, 0xBE, 0xE5, + 0xDD, 0xC9, 0x89, 0xE7, 0x33, 0xDC, 0x74, 0xE3, 0x38, 0xF1, 0x6A, 0xE9, + 0x0F, 0xFD, 0x04, 0xEB, 0x5E, 0x07, 0x38, 0xED, 0xD1, 0x11, 0xB3, 0xF3, + 0xF5, 0x1D, 0xE5, 0xFC, 0x9E, 0x2B, 0xD1, 0x0A, 0x75, 0x31, 0x66, 0x14, + 0x6E, 0x23, 0x8F, 0x13, 0x53, 0x17, 0x29, 0x18, 0x32, 0x35, 0x9F, 0x30, + 0x2D, 0x4D, 0x0D, 0x43, 0x11, 0x33, 0xE8, 0x2D, 0x17, 0x13, 0x79, 0x0B, + 0xD1, 0x05, 0x93, 0x0A, 0x2E, 0xFE, 0x93, 0x1B, 0x42, 0xF3, 0x2E, 0x1F, + 0xED, 0xE9, 0xE7, 0x0F, 0xFF, 0xEB, 0x9A, 0x04, 0xA5, 0xE9, 0x91, 0x07, + 0xA5, 0xDE, 0x8F, 0x0B, 0x0A, 0xD6, 0x2A, 0xFD, 0xE7, 0xE2, 0x15, 0xF5, + 0xE7, 0x00, 0xF0, 0xFC, 0x0D, 0x11, 0xD3, 0xFC, 0x80, 0x17, 0x30, 0xFB, + 0x30, 0x17, 0xE6, 0xF7, 0x30, 0x05, 0xA8, 0xEF, 0x1A, 0xF0, 0x82, 0xE0, + 0x09, 0xDC, 0x5D, 0xC2, 0x66, 0xC4, 0xBA, 0xA4, 0x12, 0xBD, 0xEA, 0xA2, + 0xD9, 0xCF, 0xE1, 0xB4, 0xEE, 0xEB, 0xB5, 0xD3, 0x4E, 0xF5, 0x24, 0xE5, + 0xFC, 0xF5, 0xFC, 0xDF, 0x16, 0xFF, 0x2B, 0xDE, 0x73, 0x07, 0xC4, 0xF0, + 0x13, 0x0F, 0x65, 0x0D, 0xA3, 0x18, 0xED, 0x19, 0x3C, 0x25, 0x1A, 0x20, + 0xEC, 0x28, 0x13, 0x21, 0x6A, 0x20, 0xE5, 0x21, 0xBA, 0x15, 0x4D, 0x22, + 0x9D, 0x0D, 0x9D, 0x18, 0x9C, 0x02, 0x1E, 0x16, 0x68, 0xED, 0xD0, 0x1E, + 0xD0, 0xD9, 0xF2, 0x16, 0xC9, 0xD1, 0x90, 0x01, 0xC7, 0xD0, 0xFD, 0xF7, + 0x03, 0xCC, 0xA3, 0xF7, 0x37, 0xBC, 0x28, 0xE8, 0x39, 0xC1, 0x9B, 0xDD, + 0xD9, 0xD5, 0x32, 0xE2, 0x6F, 0xE0, 0xC7, 0xDE, 0x72, 0xEB, 0x89, 0xE2, + 0x5D, 0x02, 0x8F, 0xFB, 0x91, 0x22, 0x8E, 0x0E, 0x2D, 0x3D, 0x65, 0x09, + 0x4A, 0x41, 0xD6, 0xFE, 0x4E, 0x30, 0x12, 0xF7, 0x33, 0x2C, 0x1D, 0x06, + 0x61, 0x42, 0x34, 0x2D, 0xEA, 0x43, 0x49, 0x34, 0xB4, 0x18, 0x99, 0x1A, + 0x67, 0xFA, 0x6E, 0x13, 0x92, 0x03, 0xDE, 0x15, 0x21, 0x15, 0x6B, 0x15, + 0xD9, 0x17, 0x18, 0x0F, 0x4F, 0x08, 0xF6, 0xF9, 0xB1, 0xF9, 0x2E, 0xF3, + 0xEF, 0xF5, 0xF0, 0xF5, 0x64, 0xF1, 0x6D, 0xF3, 0xCE, 0xEB, 0xBD, 0xF4, + 0x27, 0xF0, 0x4E, 0xFF, 0xB3, 0xF7, 0x58, 0x11, 0x08, 0x00, 0x64, 0x18, + 0x9A, 0x07, 0x61, 0x09, 0x48, 0x07, 0xF8, 0xEC, 0x16, 0xFF, 0xEB, 0xDB, + 0x97, 0xE6, 0x1B, 0xDB, 0x23, 0xC6, 0x40, 0xCD, 0xBE, 0xBA, 0xC4, 0xBE, + 0xEE, 0xC7, 0xB1, 0xCD, 0x96, 0xE1, 0x5A, 0xEC, 0xEC, 0xEE, 0x95, 0xFE, + 0x5F, 0xE2, 0xBB, 0xFA, 0x94, 0xDE, 0x82, 0xF5, 0x2C, 0xFB, 0x6B, 0x00, + 0x55, 0x15, 0x3F, 0x14, 0x6D, 0x24, 0x2B, 0x25, 0xD7, 0x34, 0xD9, 0x25, + 0x17, 0x2F, 0xFF, 0x22, 0x33, 0x1F, 0x80, 0x25, 0x22, 0x1D, 0xE4, 0x28, + 0xBC, 0x15, 0x61, 0x2A, 0x47, 0x10, 0xB7, 0x1C, 0xCE, 0x15, 0xAB, 0x0D, + 0xD6, 0x0D, 0xD6, 0x00, 0x5A, 0xF6, 0x7C, 0xF4, 0x61, 0xDA, 0x0A, 0xF2, + 0x7F, 0xD3, 0xCF, 0xF2, 0x9A, 0xDB, 0x02, 0xE8, 0x84, 0xE0, 0x85, 0xD5, + 0x24, 0xEA, 0x13, 0xD1, 0x08, 0xE5, 0xC2, 0xCF, 0x3E, 0xD6, 0x33, 0xCB, + 0xF1, 0xDA, 0x30, 0xDE, 0x75, 0xF2, 0x14, 0xFB, 0xD7, 0x10, 0x11, 0x0C, + 0x09, 0x28, 0xA0, 0x1B, 0x69, 0x1E, 0xE9, 0x14, 0x2E, 0x08, 0xE1, 0x06, + 0xA0, 0x1B, 0x8D, 0x1A, 0x4F, 0x3D, 0xCD, 0x33, 0x33, 0x30, 0x4C, 0x25, + 0x8B, 0x0F, 0xB9, 0x03, 0xDF, 0x06, 0x6F, 0xFF, 0xF1, 0x10, 0x2D, 0x12, + 0xDA, 0x12, 0x6C, 0x1E, 0x16, 0xFB, 0xA2, 0x11, 0xE8, 0xE6, 0xCC, 0x00, + 0x75, 0xEF, 0xB3, 0x0F, 0x9E, 0xF9, 0xEF, 0x17, 0x1B, 0xF9, 0x29, 0xFC, + 0x89, 0x03, 0x87, 0xED, 0x62, 0x0D, 0x1A, 0xFB, 0x1A, 0x0E, 0x85, 0x03, + 0xBD, 0x0E, 0x86, 0xFB, 0x76, 0x01, 0xCB, 0xEF, 0xB3, 0xF1, 0xE6, 0xE8, + 0x4D, 0xED, 0x03, 0xE9, 0x60, 0xE1, 0x3D, 0xE1, 0x11, 0xD4, 0xEE, 0xC5, + 0x22, 0xCF, 0xE8, 0xB8, 0xDA, 0xD3, 0xE6, 0xC3, 0x65, 0xED, 0x34, 0xDF, + 0x68, 0xF8, 0xE8, 0xF6, 0x98, 0xE9, 0x6D, 0xEB, 0xBC, 0xF3, 0xAB, 0xE2, + 0xA1, 0x16, 0x1F, 0xFE, 0x0E, 0x22, 0xB6, 0x1B, 0x94, 0x1D, 0x6F, 0x21, + 0x39, 0x26, 0xD0, 0x19, 0xB4, 0x25, 0x8A, 0x18, 0xFB, 0x12, 0x38, 0x23, + 0x83, 0x04, 0x94, 0x31, 0x0F, 0x01, 0x1E, 0x36, 0x7A, 0x09, 0x3A, 0x2B, + 0x6E, 0x11, 0x0F, 0x1F, 0x0C, 0xF8, 0xB6, 0x0E, 0x1C, 0xD4, 0xC3, 0xF7, + 0x5A, 0xC7, 0xCB, 0xE5, 0x26, 0xCB, 0xA2, 0xE4, 0x55, 0xCE, 0x45, 0xE2, + 0x1E, 0xDD, 0x16, 0xEA, 0x2D, 0xEA, 0x31, 0xF5, 0x1D, 0xF0, 0xEC, 0xDE, + 0x21, 0xFF, 0xFD, 0xCE, 0x54, 0x09, 0x9F, 0xE3, 0x7D, 0x0A, 0xE5, 0xF9, + 0x60, 0x15, 0x0B, 0x07, 0xCF, 0x2A, 0xE8, 0x0A, 0xB0, 0x20, 0x8D, 0x01, + 0x6E, 0x20, 0xF2, 0x17, 0xC4, 0x3E, 0x40, 0x42, 0x7D, 0x38, 0x66, 0x45, + 0x9A, 0x10, 0xCC, 0x1B, 0x80, 0xF9, 0xF8, 0x00, 0x32, 0xF9, 0x10, 0x0D, + 0x62, 0x00, 0xF5, 0x15, 0x3A, 0x04, 0x89, 0x0C, 0xDF, 0x03, 0x29, 0xF8, + 0xEE, 0x15, 0xA7, 0xF5, 0x5D, 0x25, 0x33, 0x03, 0x96, 0x19, 0xBA, 0x07, + 0xF6, 0x07, 0xC7, 0x07, 0xE4, 0x06, 0xC3, 0x10, 0x27, 0x0E, 0x8D, 0x27, + 0xAF, 0x17, 0xD6, 0x2D, 0x4F, 0x18, 0x9E, 0x14, 0xFD, 0x04, 0xBF, 0xF8, + 0x0F, 0xF7, 0x55, 0xEA, 0x34, 0xE7, 0x7D, 0xE3, 0xFA, 0xC7, 0x73, 0xCF, + 0xFF, 0xBC, 0x1B, 0xBA, 0x96, 0xD2, 0x68, 0xBA, 0x8C, 0xF2, 0xEF, 0xC7, + 0xFF, 0x00, 0x6F, 0xD7, 0x47, 0xF0, 0xF3, 0xDF, 0xFC, 0xE4, 0x72, 0xE7, + 0xE1, 0xFC, 0xF3, 0xFB, 0x80, 0x1B, 0x43, 0x12, 0x90, 0x28, 0x70, 0x19, + 0xF9, 0x32, 0x77, 0x16, 0xD5, 0x32, 0xC0, 0x13, 0x16, 0x1F, 0x57, 0x17, + 0xA6, 0x11, 0x46, 0x20, 0x0C, 0x10, 0xBB, 0x28, 0x2D, 0x07, 0x3C, 0x20, + 0x67, 0xFB, 0x83, 0x1B, 0xD6, 0xEB, 0xD6, 0x20, 0x7E, 0xD2, 0x64, 0x19, + 0x38, 0xC2, 0x81, 0x04, 0xBB, 0xC7, 0x4B, 0xF4, 0xAD, 0xCA, 0x4C, 0xE5, + 0x83, 0xCD, 0x5D, 0xD6, 0x90, 0xD9, 0x32, 0xE1, 0xB3, 0xD4, 0xD9, 0xE2, + 0x87, 0xD9, 0x64, 0xD1, 0x7A, 0x03, 0x5D, 0xDB, 0x0A, 0x22, 0x85, 0xF4, + 0x72, 0x1C, 0x9F, 0xFE, 0xE3, 0x20, 0x04, 0x04, 0x81, 0x21, 0xC5, 0xF9, + 0x8B, 0x1E, 0xA8, 0xF8, 0xC2, 0x43, 0xF3, 0x18, 0xFD, 0x57, 0xC0, 0x31, + 0xA7, 0x32, 0x69, 0x1D, 0x09, 0x0B, 0x42, 0xFD, 0x46, 0xFA, 0x10, 0x0F, + 0x0F, 0xF9, 0x32, 0x2D, 0xBD, 0xFC, 0x60, 0x2D, 0xF1, 0xEF, 0x1B, 0x14, + 0x47, 0xEC, 0xAE, 0x02, 0x57, 0xFD, 0x43, 0x0D, 0xB8, 0xFD, 0x05, 0x0C, + 0xED, 0xEE, 0x78, 0xFD, 0xEE, 0xF9, 0x3B, 0x00, 0xFE, 0x18, 0x0F, 0x15, + 0x44, 0x22, 0x64, 0x2D, 0x00, 0x23, 0xD0, 0x2B, 0x07, 0x26, 0xDD, 0x0E, + 0x57, 0x10, 0x60, 0xFA, 0x84, 0xE9, 0xA4, 0xED, 0x0F, 0xC2, 0x94, 0xE4, + 0xAA, 0xA5, 0x1D, 0xE4, 0x30, 0xAD, 0x8F, 0xE5, 0xC4, 0xD1, 0xBF, 0xEF, + 0xF7, 0xF5, 0x4E, 0x00, 0x4D, 0x0B, 0x52, 0xFA, 0x76, 0x13, 0xE1, 0xE5, + 0x1A, 0x1B, 0x52, 0xE8, 0xFA, 0x28, 0x96, 0xFD, 0x69, 0x33, 0x9B, 0x12, + 0x49, 0x3B, 0xEA, 0x1F, 0x34, 0x3C, 0x8F, 0x22, 0xB3, 0x35, 0xA1, 0x1F, + 0xDE, 0x2B, 0x83, 0x1C, 0x98, 0x1A, 0x85, 0x1F, 0x0B, 0x08, 0xE3, 0x1A, + 0x68, 0x01, 0x81, 0x0D, 0xC6, 0xFC, 0x91, 0x01, 0xBE, 0xED, 0xF2, 0xF7, + 0x54, 0xE1, 0x6E, 0xF5, 0x16, 0xDC, 0xFD, 0xE4, 0x79, 0xE0, 0x5F, 0xC9, + 0x8E, 0xE5, 0x5C, 0xBF, 0x85, 0xE9, 0x43, 0xCC, 0xD3, 0xE0, 0x61, 0xD1, + 0x48, 0xD5, 0x8C, 0xC4, 0x7D, 0xE4, 0xC8, 0xCA, 0x43, 0x09, 0x40, 0xE8, + 0xB0, 0x24, 0xE7, 0xFB, 0x41, 0x2D, 0xAA, 0x0A, 0x52, 0x26, 0x2C, 0x0F, + 0x54, 0x11, 0xA1, 0x0D, 0x9F, 0x18, 0xFB, 0x30, 0x61, 0x31, 0xA8, 0x5A, + 0x9D, 0x20, 0x29, 0x4C, 0xE3, 0x05, 0x57, 0x1C, 0xDB, 0x06, 0x82, 0x09, + 0x32, 0x0D, 0xFB, 0x20, 0x99, 0x05, 0x63, 0x2B, 0x81, 0xEA, 0x9F, 0x11, + 0x51, 0xCE, 0x95, 0xFC, 0x5A, 0xD7, 0x7A, 0x0A, 0x01, 0xF2, 0x20, 0x1A, + 0x1E, 0xF0, 0x1E, 0x07, 0x9F, 0xEB, 0x76, 0xFA, 0x32, 0x02, 0x81, 0x06, + 0xD8, 0x13, 0x9E, 0x13, 0x3A, 0x12, 0x14, 0x13, 0xBB, 0x09, 0xB6, 0xFF, + 0xDF, 0xF9, 0xBC, 0xF1, 0xAF, 0xEB, 0xB3, 0xEC, 0xEE, 0xE7, 0x74, 0xDD, + 0xD2, 0xD5, 0xFD, 0xC0, 0x7B, 0xC4, 0x2A, 0xAE, 0xB9, 0xD5, 0xA2, 0xBE, + 0x5F, 0xEC, 0x7C, 0xE0, 0xCE, 0xEE, 0xF6, 0xEE, 0xC6, 0xE9, 0x5C, 0xEC, + 0x7D, 0xF4, 0xB1, 0xF5, 0x51, 0x0D, 0x83, 0x0D, 0x08, 0x25, 0x35, 0x1E, + 0x2B, 0x31, 0x23, 0x26, 0xA8, 0x2A, 0x4A, 0x27, 0x6D, 0x25, 0x40, 0x1E, + 0x5D, 0x2C, 0x1C, 0x18, 0x61, 0x2A, 0xA0, 0x18, 0xBA, 0x1E, 0xC9, 0x12, + 0x4A, 0x0D, 0x2C, 0x0E, 0xAF, 0xF6, 0x72, 0x14, 0xEA, 0xE1, 0xDC, 0x05, + 0x6F, 0xDB, 0x7D, 0xF5, 0x26, 0xE5, 0xBE, 0xF8, 0xA3, 0xF1, 0x28, 0xED, + 0x29, 0xF4, 0x0B, 0xD5, 0xD7, 0xF0, 0xF1, 0xCF, 0xCA, 0xED, 0xB6, 0xD6, + 0x26, 0xE7, 0xC4, 0xCE, 0x37, 0xEF, 0xA7, 0xCC, 0xF4, 0x01, 0x66, 0xE3, + 0x65, 0x12, 0xF8, 0xF8, 0x2B, 0x1D, 0xAA, 0x03, 0xAA, 0x1C, 0xC1, 0x13, + 0x73, 0x15, 0xA3, 0x10, 0x69, 0x1A, 0xEC, 0x0E, 0xF8, 0x30, 0x6E, 0x39, + 0xFB, 0x2E, 0x35, 0x57, 0x47, 0x09, 0x51, 0x40, 0x28, 0xF2, 0x61, 0x1F, + 0xB6, 0xFC, 0xDB, 0x1C, 0x80, 0x09, 0x55, 0x31, 0xEB, 0xFE, 0xDC, 0x2F, + 0x01, 0xE7, 0x8B, 0x16, 0xD5, 0xDF, 0x8D, 0x0C, 0x43, 0xF1, 0x67, 0x19, + 0x45, 0xF7, 0x3E, 0x15, 0x09, 0xEE, 0xA9, 0xFC, 0xB9, 0xF8, 0x84, 0xF3, + 0xA4, 0x16, 0x2E, 0xF8, 0x6D, 0x1E, 0x92, 0xFC, 0x0B, 0x0A, 0xAC, 0x00, + 0xCA, 0xF5, 0x3E, 0x01, 0x5A, 0xEC, 0xBA, 0xF6, 0x69, 0xEB, 0x79, 0xE4, + 0xEF, 0xDC, 0x3C, 0xD4, 0x3C, 0xC3, 0xFD, 0xC4, 0x34, 0xC9, 0xE2, 0xB3, + 0xA4, 0xEC, 0x50, 0xBB, 0x9F, 0xFC, 0xBD, 0xD3, 0x6F, 0xF5, 0x18, 0xD9, + 0x97, 0xF4, 0x32, 0xD7, 0xD6, 0x09, 0x4A, 0xE3, 0x80, 0x29, 0x4D, 0xF4, + 0x95, 0x3E, 0x76, 0xFF, 0x22, 0x40, 0x10, 0x0D, 0x37, 0x27, 0x42, 0x14, + 0xA2, 0x10, 0xDC, 0x18, 0x11, 0x0D, 0x74, 0x1F, 0x9C, 0x0C, 0x73, 0x2D, + 0x7F, 0x0B, 0x54, 0x39, 0x01, 0x0C, 0xFC, 0x30, 0xC2, 0x0A, 0xC1, 0x20, + 0xF2, 0xFC, 0x8C, 0x0A, 0x9F, 0xE3, 0x93, 0xFB, 0x1A, 0xCE, 0xF3, 0xFA, + 0x1E, 0xC8, 0xEF, 0xE8, 0xFE, 0xD6, 0xD8, 0xCE, 0xBD, 0xEB, 0x2E, 0xD3, + 0xE4, 0xEC, 0xD8, 0xDB, 0x54, 0xE6, 0xE3, 0xD5, 0x78, 0xEC, 0x90, 0xD9, + 0xC5, 0xFB, 0x33, 0xF1, 0xF2, 0x0B, 0x05, 0xFD, 0xED, 0x1C, 0x31, 0xFC, + 0x06, 0x23, 0x5A, 0xFA, 0x4F, 0x20, 0xCE, 0xEF, 0x26, 0x33, 0xE8, 0x03, + 0x95, 0x4B, 0x11, 0x35, 0xA1, 0x33, 0x34, 0x3E, 0xD6, 0xFF, 0xBB, 0x1C, + 0x34, 0xF4, 0x7C, 0x0D, 0xA7, 0x08, 0xAF, 0x18, 0xF6, 0x15, 0xC3, 0x23, + 0x2A, 0x11, 0xAE, 0x16, 0x97, 0x07, 0x5F, 0xFB, 0x85, 0x0C, 0x9D, 0xF5, + 0xDA, 0x04, 0x0C, 0x00, 0xFA, 0xE7, 0xD7, 0x01, 0xC5, 0xDE, 0xDF, 0xFF, + 0xF8, 0xEF, 0xDA, 0x0F, 0x06, 0x07, 0x8E, 0x22, 0x44, 0x0E, 0x86, 0x1D, + 0x4E, 0xFB, 0x45, 0x0A, 0xA1, 0xE1, 0xF5, 0xF7, 0xC8, 0xCF, 0x2E, 0xE2, + 0xBC, 0xC2, 0xA1, 0xD1, 0xFF, 0xB3, 0x59, 0xBF, 0xC8, 0xAB, 0x3B, 0xB5, + 0x15, 0xC6, 0x86, 0xCA, 0x55, 0xEB, 0x24, 0xDF, 0xEB, 0xF6, 0xD4, 0xEF, + 0x04, 0xEC, 0x28, 0xF8, 0xBA, 0xF3, 0xB2, 0xF2, 0x4F, 0x17, 0xC1, 0xF9, + 0x38, 0x30, 0x40, 0x0E, 0x63, 0x37, 0xA6, 0x1E, 0x16, 0x34, 0x46, 0x1A, + 0x91, 0x30, 0x54, 0x06, 0xAB, 0x2B, 0x67, 0xFB, 0x4C, 0x20, 0x46, 0x03, + 0x7E, 0x0C, 0x84, 0x12, 0xE0, 0xF4, 0xD2, 0x1A, 0x19, 0xEA, 0xE7, 0x1B, + 0xFD, 0xE9, 0x19, 0x15, 0x4D, 0xE7, 0x93, 0x06, 0x00, 0xE2, 0x1F, 0xF9, + 0x40, 0xE2, 0x2C, 0xF4, 0x81, 0xE5, 0xCE, 0xE9, 0x64, 0xF2, 0x29, 0xDF, + 0xBD, 0x01, 0xCC, 0xE5, 0x11, 0xFF, 0xA8, 0xDC, 0xFD, 0x06, 0x88, 0xCD, + 0xCD, 0x1B, 0x4D, 0xDB, 0x67, 0x1B, 0x0E, 0xF5, 0x2B, 0x0D, 0xA1, 0x0A, + 0x61, 0x05, 0xCD, 0x1C, 0x72, 0x01, 0xAF, 0x14, 0xCE, 0x0D, 0xFC, 0x08, + 0x41, 0x2F, 0x5E, 0x30, 0x54, 0x34, 0x4A, 0x53, 0x28, 0x0B, 0x60, 0x3C, + 0x70, 0xE9, 0x59, 0x1C, 0xEC, 0xF6, 0x2D, 0x21, 0xEF, 0x0E, 0xE9, 0x2B, + 0x5B, 0x08, 0x12, 0x25, 0x05, 0xF1, 0xBD, 0x12, 0x4F, 0xF0, 0xDF, 0xFE, + 0xB9, 0x08, 0xEC, 0xF6, 0x5C, 0x0C, 0xF3, 0xF4, 0x63, 0x00, 0xB5, 0xF0, + 0x09, 0xFE, 0xDC, 0xEE, 0x2A, 0x04, 0x2C, 0xF4, 0xBE, 0x10, 0x18, 0xFD, + 0x96, 0x11, 0xCD, 0x03, 0x1C, 0xFA, 0x75, 0xF5, 0xEA, 0xE3, 0xAB, 0xE5, + 0x51, 0xD8, 0x75, 0xE3, 0xAD, 0xC4, 0x9C, 0xD7, 0xA8, 0xAA, 0xF7, 0xC5, + 0x53, 0xAC, 0x56, 0xBE, 0x0A, 0xD4, 0x11, 0xC1, 0xF5, 0xF9, 0xDB, 0xCB, + 0x8E, 0x0C, 0x6B, 0xD3, 0xA6, 0xFF, 0x24, 0xD4, 0xB4, 0xFA, 0x28, 0xEA, + 0xC1, 0x1A, 0xE2, 0x05, 0x2D, 0x31, 0x35, 0x17, 0x57, 0x38, 0xA7, 0x26, + 0x7F, 0x3A, 0x29, 0x2A, 0x46, 0x2A, 0xEB, 0x25, 0x3E, 0x0F, 0xC2, 0x1F, + 0xDC, 0x0C, 0xA7, 0x2E, 0x6F, 0x0C, 0xC8, 0x31, 0x50, 0xFC, 0xFA, 0x17, + 0x45, 0xF0, 0x0B, 0x0C, 0x68, 0xEB, 0x67, 0xF9, 0x18, 0xF3, 0x52, 0xDE, + 0x43, 0xF7, 0x85, 0xD6, 0x10, 0xF4, 0xEA, 0xD9, 0x4A, 0xE7, 0xE3, 0xD9, + 0x2F, 0xDB, 0x5A, 0xE8, 0xBC, 0xD9, 0x2D, 0xF8, 0x44, 0xDE, 0x14, 0xF7, + 0x72, 0xF5, 0xF5, 0xF9, 0xA4, 0x1A, 0x16, 0x02, 0xAE, 0x2F, 0x54, 0x09, + 0x59, 0x34, 0x9C, 0x0F, 0x51, 0x23, 0xD9, 0x10, 0xAD, 0x09, 0x7B, 0x0F, + 0xB1, 0x19, 0xE6, 0x27, 0xA0, 0x38, 0xF1, 0x51, 0x34, 0x2A, 0x7C, 0x4F, + 0xD2, 0x05, 0x28, 0x27, 0xA5, 0xFD, 0x78, 0x17, 0xF7, 0x04, 0x3A, 0x20, + 0x8D, 0xFB, 0xCC, 0x1D, 0x8A, 0xE8, 0x86, 0x06, 0x14, 0xE0, 0x68, 0xF0, + 0x91, 0xF5, 0xAC, 0xEE, 0xF6, 0x05, 0x90, 0xED, 0x8F, 0xF2, 0x3F, 0xEF, + 0x72, 0xEF, 0xDD, 0xF4, 0xB4, 0x07, 0x70, 0xF1, 0xEE, 0x19, 0xA9, 0xF4, + 0x75, 0x14, 0xAC, 0xF9, 0xAF, 0xFF, 0x62, 0xF5, 0x41, 0xEF, 0x51, 0xEC, + 0x7C, 0xE8, 0xE0, 0xE1, 0xB9, 0xE4, 0x20, 0xD5, 0x60, 0xD4, 0x20, 0xC1, + 0x06, 0xC2, 0x31, 0xB5, 0x8D, 0xCA, 0x6C, 0xBE, 0x6C, 0xDB, 0x32, 0xD0, + 0xEB, 0xE2, 0xA8, 0xDF, 0xD1, 0xE7, 0x6A, 0xE5, 0x4F, 0xF0, 0x5D, 0xEE, + 0xEA, 0x10, 0xA6, 0x0D, 0x7A, 0x2F, 0xC4, 0x22, 0x4C, 0x31, 0x45, 0x23, + 0x8E, 0x23, 0x05, 0x2D, 0xCD, 0x10, 0x69, 0x2E, 0x2A, 0x05, 0x90, 0x20, + 0x6A, 0x01, 0xB4, 0x23, 0xAA, 0x04, 0x10, 0x2F, 0x87, 0x09, 0xFB, 0x36, + 0xAA, 0xFE, 0xA3, 0x34, 0xC9, 0xEA, 0x93, 0x20, 0x25, 0xE7, 0xF9, 0x11, + 0x34, 0xDF, 0x5E, 0xFA, 0x65, 0xD8, 0x83, 0xE0, 0x6C, 0xD5, 0x4C, 0xD5, + 0xBF, 0xDB, 0x52, 0xD0, 0x7D, 0xF4, 0x6A, 0xCD, 0x76, 0xFA, 0xFC, 0xC6, + 0xBF, 0xF8, 0x06, 0xD0, 0x1E, 0x05, 0x38, 0xE6, 0x5C, 0x0F, 0x8C, 0xFA, + 0x27, 0x24, 0xB7, 0x0C, 0x8E, 0x2F, 0x60, 0x0B, 0xF4, 0x1E, 0xE5, 0x04, + 0x59, 0x29, 0x4A, 0x19, 0xCB, 0x44, 0x59, 0x3A, 0xF3, 0x44, 0x7D, 0x3F, + 0xF3, 0x23, 0xC5, 0x21, 0x57, 0x08, 0x44, 0x0A, 0x54, 0x16, 0xE4, 0x13, + 0xBC, 0x1D, 0x2B, 0x24, 0xA5, 0x0A, 0xDE, 0x1A, 0xFF, 0xE8, 0x6B, 0xF9, + 0xB8, 0xD8, 0x2E, 0xF7, 0x31, 0xFA, 0x37, 0x04, 0xF8, 0x04, 0x50, 0xE6, + 0x62, 0xF2, 0xE3, 0xD8, 0x3D, 0xFB, 0xA7, 0xF3, 0xC8, 0x05, 0xE7, 0x09, + 0x01, 0x12, 0xB6, 0x17, 0xC9, 0x14, 0x94, 0x1A, 0x45, 0x00, 0x95, 0x09, + 0x83, 0xE8, 0x9A, 0xEF, 0xDF, 0xD6, 0x19, 0xE4, 0x01, 0xCC, 0x5F, 0xE1, + 0xC7, 0xB5, 0x67, 0xD3, 0x31, 0xB9, 0x77, 0xD7, 0x84, 0xE8, 0x4D, 0xF5, + 0xCF, 0x03, 0x70, 0xFF, 0xFA, 0xF9, 0x51, 0xEF, 0x50, 0xF1, 0xFB, 0xE9, + 0x2C, 0xFF, 0x34, 0xFB, 0x5D, 0x21, 0x78, 0x0C, 0x0D, 0x35, 0x49, 0x10, + 0xC9, 0x2E, 0x02, 0x16, 0xBD, 0x1C, 0x7D, 0x1D, 0xB5, 0x08, 0x69, 0x20, + 0xD0, 0x01, 0x83, 0x26, 0xDB, 0x06, 0xF5, 0x24, 0xBF, 0x03, 0x9D, 0x25, + 0x6A, 0x04, 0x93, 0x25, 0x18, 0x06, 0x5B, 0x0A, 0xBC, 0xFA, 0x2A, 0xF0, + 0x08, 0xEE, 0x9F, 0xE3, 0x6B, 0xE4, 0x02, 0xE3, 0xD3, 0xE5, 0x1A, 0xE7, + 0x8B, 0xDD, 0xCA, 0xDC, 0xF1, 0xDB, 0x0E, 0xE0, 0xB2, 0xEA, 0xA8, 0xE3, + 0x72, 0xDC, 0x85, 0xD8, 0x53, 0xDA, 0x5A, 0xDF, 0x69, 0xFD, 0xAC, 0xEA, + 0x9F, 0x12, 0xA8, 0xF1, 0xD2, 0x20, 0x36, 0xFC, 0x34, 0x23, 0x62, 0x00, + 0x30, 0x16, 0xC2, 0x09, 0x3F, 0x2B, 0x84, 0x23, 0xFA, 0x47, 0xB7, 0x3F, + 0xED, 0x2D, 0x84, 0x37, 0x1B, 0xFC, 0x23, 0x15, 0x9A, 0xFF, 0x60, 0x1B, + 0xF7, 0x24, 0xA2, 0x34, 0x52, 0x2F, 0xB2, 0x36, 0xE8, 0x21, 0x2E, 0x1D, + 0x5F, 0x17, 0x1A, 0xFF, 0x01, 0x1C, 0xC4, 0x03, 0x55, 0x14, 0x35, 0x05, + 0xB7, 0xFB, 0x29, 0xF3, 0x4B, 0xF2, 0x5A, 0xEE, 0x56, 0xFF, 0x6D, 0xF8, + 0x08, 0x18, 0x82, 0x05, 0x66, 0x1A, 0x02, 0x08, 0xA7, 0x01, 0x79, 0x0C, + 0xA5, 0xE4, 0x76, 0x08, 0xCE, 0xCF, 0x60, 0xF0, 0x1E, 0xCA, 0x0C, 0xDB, + 0xFC, 0xBB, 0x6C, 0xC4, 0x81, 0xB7, 0x5C, 0xB5, 0x65, 0xD5, 0x93, 0xC5, + 0x2F, 0xF7, 0xA8, 0xE6, 0x7B, 0xFD, 0xDB, 0xEE, 0x33, 0xF3, 0x4E, 0xEA, + 0x1E, 0x05, 0xF2, 0xF5, 0x02, 0x26, 0x34, 0x06, 0x81, 0x39, 0x90, 0x12, + 0x49, 0x41, 0x0E, 0x18, 0x45, 0x39, 0xE8, 0x1B, 0x7D, 0x31, 0xEC, 0x20, + 0x17, 0x1B, 0x87, 0x29, 0x0D, 0xFC, 0x8F, 0x2D, 0x39, 0xF1, 0xAA, 0x28, + 0x52, 0xEB, 0xFE, 0x30, 0xEC, 0xDD, 0x1C, 0x2A, 0x09, 0xD5, 0x9C, 0x0A, + 0x85, 0xDE, 0x33, 0xF8, 0xFF, 0xE2, 0x16, 0xE8, 0x9E, 0xE0, 0x57, 0xD9, + 0xCB, 0xDD, 0xF9, 0xCE, 0x64, 0xE1, 0xEC, 0xCD, 0x13, 0xEE, 0x0A, 0xD6, + 0xC2, 0xF3, 0xD8, 0xD1, 0xFF, 0xF2, 0x57, 0xD3, 0xBE, 0xF9, 0x2D, 0xEF, + 0x0A, 0x05, 0x0E, 0x03, 0x02, 0x1B, 0x1C, 0x0C, 0xAE, 0x22, 0xC4, 0x0E, + 0x23, 0x12, 0xA2, 0x08, 0x22, 0x1A, 0xFA, 0x24, 0x80, 0x37, 0x6F, 0x59, + 0x94, 0x39, 0xCE, 0x5A, 0x1F, 0x17, 0x80, 0x27, 0x6B, 0x08, 0xD5, 0x11, + 0x4B, 0x11, 0x03, 0x17, 0xBB, 0x13, 0x26, 0x1A, 0x2F, 0xFE, 0x84, 0x16, + 0x8F, 0xEB, 0x5F, 0x07, 0x79, 0xFD, 0x4B, 0x0B, 0x8F, 0x12, 0x98, 0x12, + 0xF1, 0x0D, 0xCB, 0x0D, 0x78, 0x05, 0xF6, 0x05, 0xC6, 0x0B, 0x3C, 0x03, + 0x0A, 0x15, 0xBB, 0x0F, 0x12, 0x1E, 0x36, 0x0E, 0x41, 0x23, 0x41, 0xFB, + 0xDA, 0x15, 0x8C, 0xEB, 0xB4, 0xF5, 0xEA, 0xE3, 0xDD, 0xDC, 0x8A, 0xE0, + 0x49, 0xBF, 0x8A, 0xCD, 0x7A, 0xB3, 0xDF, 0xBD, 0x00, 0xCA, 0x25, 0xBF, + 0x0F, 0xE7, 0xC4, 0xCF, 0x5B, 0xFA, 0xF6, 0xDD, 0xDF, 0xF5, 0xE9, 0xE0, + 0xD0, 0xF4, 0x43, 0xEE, 0x80, 0x0A, 0x10, 0xFA, 0x3B, 0x2A, 0xBF, 0x0B, + 0x98, 0x3D, 0xE7, 0x17, 0x39, 0x32, 0x7D, 0x19, 0x29, 0x1F, 0xD6, 0x28, + 0xD1, 0x17, 0x1A, 0x34, 0x1E, 0x0D, 0x56, 0x30, 0x3A, 0x06, 0xEC, 0x24, + 0x37, 0x06, 0x01, 0x1D, 0x26, 0xFF, 0xBC, 0x12, 0x55, 0xE4, 0x40, 0xFC, + 0x1E, 0xD2, 0x56, 0xEA, 0xDE, 0xCD, 0x6E, 0xD4, 0x5A, 0xC7, 0xAB, 0xCC, + 0xD8, 0xC1, 0xE8, 0xD3, 0x9D, 0xCB, 0xD1, 0xD5, 0x9B, 0xE4, 0xA1, 0xDE, + 0x2C, 0xE9, 0xD5, 0xDD, 0xC8, 0xE7, 0xE3, 0xCD, 0x74, 0xF8, 0x12, 0xD8, + 0x41, 0x0B, 0xAE, 0xF3, 0x45, 0x18, 0xA9, 0xF8, 0xFA, 0x21, 0x7A, 0xF5, + 0x2B, 0x1C, 0x75, 0xEF, 0x5B, 0x12, 0xDE, 0xFC, 0x2B, 0x28, 0xA5, 0x29, + 0x54, 0x3F, 0x27, 0x44, 0xF8, 0x29, 0xEE, 0x2B, 0x4D, 0x15, 0x33, 0x13, + 0x11, 0x0F, 0x8C, 0x22, 0xA1, 0x07, 0x46, 0x32, 0xAA, 0xFE, 0x42, 0x1F, + 0xF9, 0xE8, 0x9E, 0x03, 0xA5, 0xE9, 0xE9, 0xFD, 0xCC, 0xFD, 0x19, 0xFC, + 0x95, 0x00, 0x21, 0xF6, 0x36, 0xF7, 0xD4, 0xEB, 0x2D, 0xF7, 0x92, 0xF2, + 0xA2, 0xFD, 0x13, 0x12, 0x61, 0x04, 0x60, 0x27, 0x37, 0x07, 0x1D, 0x2F, + 0x78, 0xF8, 0x11, 0x22, 0x73, 0xE7, 0x70, 0x09, 0xEA, 0xDC, 0xD3, 0x04, + 0xFB, 0xD3, 0xB7, 0xF5, 0x63, 0xC7, 0x86, 0xD6, 0xD1, 0xBF, 0x8E, 0xD0, + 0xA1, 0xD0, 0x39, 0xE8, 0x4C, 0xE9, 0xAE, 0xF8, 0x06, 0xF5, 0x22, 0xEA, + 0x33, 0x02, 0x0B, 0xE8, 0x91, 0x1C, 0x9D, 0xFA, 0x65, 0x37, 0x18, 0x0C, + 0x89, 0x40, 0xD1, 0x18, 0x29, 0x36, 0xBE, 0x14, 0xBB, 0x2B, 0xA2, 0x0C, + 0xC8, 0x23, 0x6A, 0x0D, 0x47, 0x1E, 0x9A, 0x14, 0x49, 0x21, 0x34, 0x1C, + 0x9E, 0x1A, 0xC9, 0x1D, 0x28, 0x16, 0x86, 0x15, 0x15, 0x10, 0x55, 0x00, + 0xA6, 0xF5, 0x90, 0xED, 0xEB, 0xE1, 0x68, 0xDD, 0x2D, 0xDF, 0xA1, 0xD0, + 0xF6, 0xD5, 0x35, 0xCF, 0xCD, 0xCC, 0x07, 0xD3, 0x0A, 0xE1, 0xB5, 0xD9, + 0xC3, 0xF4, 0x6F, 0xD9, 0xC8, 0xEC, 0x55, 0xD0, 0xB0, 0xE5, 0xD3, 0xCC, + 0x55, 0xF3, 0xFC, 0xE4, 0x32, 0x01, 0x51, 0x02, 0xFA, 0x0E, 0x68, 0x14, + 0xCE, 0x10, 0xE2, 0x16, 0xFA, 0x05, 0x31, 0x0E, 0x0D, 0x1D, 0xE1, 0x2A, + 0x2C, 0x39, 0xBF, 0x4C, 0x6A, 0x28, 0x2F, 0x35, 0x8D, 0x0B, 0xAB, 0x0C, + 0x76, 0x0A, 0xB8, 0x12, 0xF5, 0x10, 0x79, 0x2A, 0x85, 0x0E, 0x96, 0x2C, + 0xDC, 0xFC, 0xB2, 0x1E, 0xAC, 0xEC, 0x9C, 0x10, 0xEF, 0xF2, 0x2A, 0x11, + 0x6B, 0xF8, 0x0A, 0x0C, 0xA8, 0xEB, 0x08, 0xF8, 0x7A, 0xDC, 0x45, 0xEA, + 0x27, 0xE5, 0x37, 0xF1, 0xA4, 0x00, 0x6B, 0xFA, 0x0C, 0x15, 0x64, 0xF8, + 0xFB, 0x0A, 0x2E, 0xF6, 0x8D, 0xEF, 0xC7, 0xEC, 0x37, 0xE1, 0x78, 0xE5, + 0xB4, 0xD8, 0x0C, 0xE8, 0x49, 0xC4, 0xCD, 0xD9, 0x5D, 0xC2, 0x1B, 0xC8, + 0x09, 0xDE, 0x37, 0xD2, 0x0A, 0xF5, 0xE1, 0xED, 0x00, 0xFD, 0x6F, 0xF6, + 0x48, 0x02, 0xAD, 0xED, 0xFF, 0x08, 0xB7, 0xEE, 0xAA, 0x1F, 0x3E, 0xFB, + 0x17, 0x38, 0x84, 0x0B, 0x74, 0x36, 0x5C, 0x0D, 0x45, 0x35, 0xBC, 0x05, + 0xED, 0x2E, 0xD8, 0x0E, 0x55, 0x1D, 0xF5, 0x1E, 0x3D, 0x0B, 0xA4, 0x1E, + 0x02, 0xFF, 0x3F, 0x1C, 0xEC, 0xFE, 0xB5, 0x1C, 0xD1, 0xF8, 0x1F, 0x12, + 0x95, 0xEA, 0x7E, 0xFF, 0xCA, 0xE8, 0x96, 0xF2, 0xFA, 0xE8, 0x52, 0xE5, + 0x78, 0xE1, 0x1C, 0xD2, 0xC0, 0xD2, 0x9C, 0xC4, 0xA3, 0xCB, 0x41, 0xCB, + 0x74, 0xDC, 0x70, 0xD9, 0xBD, 0xE6, 0xAB, 0xD7, 0xC0, 0xF3, 0x6D, 0xDC, + 0xC1, 0x08, 0x65, 0xF3, 0xBC, 0x10, 0x40, 0x03, 0xA2, 0x1B, 0x2E, 0x0A, + 0xB4, 0x22, 0x1D, 0x15, 0x26, 0x0B, 0x34, 0x16, 0x96, 0x06, 0xA3, 0x29, + 0x70, 0x25, 0xF9, 0x57, 0xB6, 0x29, 0x2C, 0x62, 0xD5, 0x07, 0x1B, 0x39, + 0x5A, 0xF5, 0x65, 0x1F, 0x90, 0x02, 0xC0, 0x28, 0xC8, 0x0C, 0x40, 0x26, + 0x7A, 0x15, 0x26, 0x18, 0x29, 0x12, 0x0E, 0x01, 0x6F, 0x12, 0x7F, 0xF2, + 0xAB, 0x14, 0x13, 0xF9, 0xF6, 0x01, 0x4B, 0xFA, 0xC8, 0xF1, 0x47, 0xED, + 0x45, 0xFC, 0x74, 0xEB, 0x45, 0x0F, 0x32, 0xFD, 0x8A, 0x0C, 0xFE, 0x0D, + 0xBD, 0xFB, 0xC7, 0x0D, 0xF1, 0xE5, 0xF5, 0xF2, 0x4B, 0xDB, 0xD5, 0xD7, + 0x58, 0xDA, 0x5A, 0xCF, 0x1B, 0xCA, 0x17, 0xC5, 0xF2, 0xBA, 0xD6, 0xB3, + 0x3D, 0xCF, 0x3C, 0xB7, 0xD8, 0xF1, 0x88, 0xCE, 0xAB, 0x09, 0xD7, 0xE1, + 0x73, 0x0E, 0x7C, 0xE2, 0x0F, 0x0B, 0x9F, 0xDE, 0x76, 0x10, 0xD9, 0xEA, + 0xA4, 0x21, 0x56, 0x07, 0xC4, 0x2F, 0xB8, 0x22, 0x9F, 0x2C, 0x23, 0x27, + 0xD0, 0x2B, 0xC1, 0x28, 0xB9, 0x2C, 0x88, 0x30, 0x34, 0x1C, 0x2D, 0x30, + 0x8C, 0x02, 0xB5, 0x31, 0xE2, 0xF5, 0x67, 0x34, 0x0B, 0xF0, 0x82, 0x27, + 0x03, 0xE9, 0x39, 0x15, 0xE9, 0xE0, 0x8F, 0x07, 0xF0, 0xDA, 0x25, 0xFB, + 0x7D, 0xD7, 0xA5, 0xED, 0x67, 0xD1, 0x7D, 0xDE, 0x1F, 0xD3, 0x00, 0xDB, + 0xBA, 0xDD, 0x37, 0xD2, 0x97, 0xE8, 0x2F, 0xBF, 0xA2, 0xF2, 0xCF, 0xBF, + 0x97, 0xFF, 0xAB, 0xD2, 0xE5, 0x10, 0x48, 0xE2, 0x3C, 0x24, 0xA4, 0xEA, + 0x66, 0x38, 0x32, 0xF9, 0xB5, 0x2D, 0x78, 0x00, 0x6D, 0x13, 0xC2, 0x00, + 0xB2, 0x28, 0x6B, 0x26, 0x9D, 0x3D, 0x99, 0x48, 0x85, 0x2A, 0x82, 0x2E, + 0xFB, 0x0B, 0xA4, 0x0E, 0xAB, 0x01, 0x6B, 0x18, 0x84, 0x03, 0x3E, 0x33, + 0xFD, 0xF2, 0x2A, 0x35, 0xA9, 0xED, 0xD1, 0x21, 0xD4, 0xF1, 0xDB, 0x14, + 0xE1, 0xF5, 0xD6, 0x17, 0x5C, 0xFB, 0x11, 0x11, 0xC7, 0xF8, 0x4F, 0xFB, + 0x4F, 0xFD, 0x35, 0xF3, 0x7D, 0x04, 0x99, 0xF6, 0x49, 0x01, 0x66, 0xFD, + 0x77, 0xF2, 0x3F, 0xFB, 0xCE, 0xD6, 0x42, 0xF2, 0x2B, 0xC9, 0x73, 0xEF, + 0xD3, 0xCF, 0xF4, 0xED, 0x4F, 0xCA, 0xC5, 0xDF, 0xF8, 0xBF, 0x8C, 0xCC, + 0x84, 0xC6, 0xFF, 0xC8, 0x61, 0xDD, 0x9C, 0xD9, 0x6C, 0xF3, 0xA4, 0xF0, + 0x3E, 0xF8, 0x3E, 0x00, 0xCE, 0x04, 0x0A, 0x00, 0x67, 0x1F, 0x9C, 0xEC, + 0x82, 0x38, 0x89, 0xED, 0x23, 0x46, 0xCF, 0x00, 0xF1, 0x34, 0x41, 0x05, + 0xC1, 0x22, 0x11, 0x04, 0x22, 0x29, 0xDA, 0x0C, 0x8A, 0x38, 0x0E, 0x20, + 0x25, 0x33, 0x3D, 0x2E, 0xF7, 0x18, 0xBD, 0x31, 0xA5, 0x0D, 0x9D, 0x2F, + 0x8C, 0x05, 0x09, 0x23, 0x9B, 0xF4, 0x9C, 0x0A, 0x80, 0xE3, 0x3A, 0xF7, + 0xFB, 0xD8, 0x5E, 0xF3, 0x0E, 0xD6, 0x50, 0xEB, 0x65, 0xD6, 0x1C, 0xDD, + 0x0A, 0xE2, 0xF2, 0xE1, 0xB3, 0xE7, 0x51, 0xE5, 0x23, 0xE6, 0xF8, 0xD5, + 0x3D, 0xF4, 0x70, 0xD1, 0xBD, 0x09, 0x22, 0xEA, 0x7B, 0x13, 0x74, 0x03, + 0x8E, 0x13, 0x8F, 0x14, 0x23, 0x11, 0x56, 0x1D, 0x9E, 0x13, 0x38, 0x13, + 0xD7, 0x30, 0x4F, 0x26, 0xF0, 0x4C, 0x50, 0x49, 0x8E, 0x36, 0x3E, 0x38, + 0xDE, 0x09, 0x5C, 0x0F, 0xA8, 0xFC, 0x85, 0x04, 0x68, 0x12, 0x5A, 0x15, + 0x65, 0x1B, 0xE3, 0x22, 0xE2, 0x04, 0x61, 0x14, 0x81, 0xF5, 0xCF, 0xFA, + 0x23, 0xFB, 0x09, 0xF4, 0xFA, 0xFE, 0x55, 0xF8, 0xE1, 0xF2, 0x26, 0xF3, + 0xAE, 0xE8, 0x44, 0xE4, 0x86, 0xF0, 0xD3, 0xE5, 0xE7, 0xFA, 0x8B, 0xF6, + 0x0A, 0xFD, 0x3E, 0x08, 0x05, 0xF0, 0x98, 0x0C, 0x75, 0xDF, 0xD2, 0xF9, + 0x44, 0xDD, 0x85, 0xE6, 0x9C, 0xD7, 0xF8, 0xDC, 0xAB, 0xC3, 0x54, 0xCE, + 0x68, 0xBD, 0xFF, 0xC0, 0xEF, 0xD0, 0xE7, 0xC7, 0xF1, 0xEB, 0x32, 0xD6, + 0x17, 0xF9, 0xA9, 0xE7, 0x65, 0xF7, 0x63, 0xFA, 0x52, 0xFF, 0x0C, 0x03, + 0x68, 0x10, 0x00, 0x10, 0x9D, 0x1E, 0xB5, 0x26, 0x88, 0x26, 0xBB, 0x2C, + 0xE7, 0x25, 0x68, 0x1C, 0x69, 0x28, 0x9F, 0x13, 0xBF, 0x22, 0x85, 0x1B, + 0x91, 0x16, 0x5B, 0x27, 0x3E, 0x1D, 0xC4, 0x2F, 0xC2, 0x25, 0xA6, 0x26, + 0xEA, 0x22, 0x37, 0x12, 0x5F, 0x0F, 0xC8, 0x03, 0x61, 0xF0, 0x5E, 0xF7, + 0xBB, 0xDF, 0xDD, 0xEC, 0x9E, 0xDC, 0x83, 0xE5, 0x00, 0xDC, 0x23, 0xDD, + 0x89, 0xE9, 0xEC, 0xE4, 0x5D, 0xF2, 0xC2, 0xF2, 0x03, 0xED, 0x9A, 0xE6, + 0x97, 0xF2, 0x7F, 0xDB, 0x19, 0xFF, 0x8D, 0xF1, 0x40, 0x0C, 0x8F, 0x0C, + 0xBB, 0x0E, 0x7C, 0x19, 0xB4, 0x0D, 0x82, 0x21, 0x58, 0x0E, 0xC8, 0x1E, + 0x71, 0x1D, 0x4C, 0x2A, 0xB9, 0x3D, 0x3E, 0x4C, 0x5B, 0x32, 0x11, 0x4A, + 0x85, 0x06, 0x6E, 0x20, 0xA0, 0xF7, 0xB9, 0x0D, 0xE0, 0x06, 0x90, 0x1B, + 0x05, 0x15, 0xF0, 0x20, 0xAB, 0x10, 0x22, 0x15, 0xCE, 0x0A, 0xFD, 0xFD, + 0x68, 0x18, 0x53, 0xEE, 0xD9, 0x1B, 0x26, 0xF1, 0xF2, 0x03, 0x4D, 0xF3, + 0xA0, 0xE8, 0x5B, 0xEA, 0x2C, 0xEE, 0xA7, 0xE7, 0x92, 0x0A, 0x1F, 0xF0, + 0x16, 0x16, 0x59, 0xEF, 0xE6, 0x08, 0x2A, 0xEA, 0x68, 0xE7, 0xE6, 0xDB, + 0xC6, 0xCF, 0x43, 0xC9, 0x73, 0xCE, 0x0D, 0xCD, 0x38, 0xC3, 0xDF, 0xCE, + 0x5C, 0xBA, 0x04, 0xCA, 0x7B, 0xD5, 0xEC, 0xE0, 0x86, 0xF3, 0xCA, 0xF6, + 0x75, 0x03, 0xEE, 0xF4, 0x0C, 0x08, 0x39, 0xF1, 0x9D, 0x01, 0x1D, 0xF3, + 0x86, 0x08, 0x02, 0x00, 0x00, 0x1F, 0x87, 0x17, 0x3C, 0x28, 0x4C, 0x2B, + 0xF2, 0x1F, 0x2D, 0x31, 0x19, 0x1E, 0x27, 0x32, 0x4E, 0x1D, 0xCE, 0x31, + 0xFE, 0x14, 0xBA, 0x33, 0x8D, 0x07, 0x59, 0x33, 0x11, 0xF4, 0x1C, 0x2F, + 0x71, 0xE6, 0xD1, 0x2D, 0x74, 0xE5, 0xA8, 0x23, 0x96, 0xDD, 0x10, 0x08, + 0x56, 0xD5, 0x43, 0xEC, 0x74, 0xD5, 0xE7, 0xDC, 0xC5, 0xCD, 0x13, 0xCD, + 0xFE, 0xD9, 0x4C, 0xC8, 0x99, 0xEE, 0xDC, 0xCB, 0xC2, 0xEB, 0xA3, 0xC5, + 0x77, 0xF5, 0x0C, 0xC7, 0x26, 0x0E, 0x2A, 0xD8, 0xC9, 0x1E, 0x4D, 0xEB, + 0x76, 0x28, 0xF2, 0x03, 0x6E, 0x26, 0x8E, 0x13, 0xCA, 0x22, 0x1D, 0x0D, + 0x47, 0x2B, 0xF1, 0x13, 0x79, 0x43, 0x4B, 0x2E, 0x4A, 0x43, 0x1A, 0x2F, + 0x56, 0x23, 0x0E, 0x17, 0x4D, 0x1A, 0x94, 0x0E, 0x24, 0x27, 0x81, 0x1D, + 0xA9, 0x25, 0x57, 0x27, 0xF2, 0x10, 0xEC, 0x1F, 0x1D, 0xFE, 0x6F, 0x15, + 0x2C, 0xFF, 0x30, 0x10, 0x88, 0x0A, 0x47, 0x0D, 0xE9, 0x06, 0x86, 0x02, + 0xB4, 0x01, 0x13, 0xF2, 0xB9, 0x01, 0xFA, 0xEA, 0x15, 0xFE, 0xB9, 0xF5, + 0x76, 0xF9, 0x66, 0x09, 0xF0, 0xEB, 0x59, 0x13, 0xEC, 0xDD, 0x28, 0x04, + 0x18, 0xDC, 0xEA, 0xE4, 0xFE, 0xD8, 0xDF, 0xCE, 0xAD, 0xCF, 0x42, 0xC7, + 0x85, 0xBF, 0x39, 0xC4, 0x79, 0xC6, 0x83, 0xCD, 0x61, 0xE6, 0x17, 0xE2, + 0x9B, 0xF9, 0xBB, 0xF5, 0x00, 0x05, 0x26, 0xFC, 0x60, 0x06, 0xCB, 0xFF, + 0xA2, 0x09, 0xFD, 0x08, 0x3D, 0x19, 0x5D, 0x11, 0x2D, 0x27, 0xEF, 0x17, + 0x6C, 0x2C, 0xBB, 0x14, 0xC5, 0x28, 0xB1, 0x0B, 0xC7, 0x28, 0xA0, 0x0F, + 0x67, 0x25, 0x7E, 0x1F, 0x70, 0x0D, 0x32, 0x28, 0x83, 0xF9, 0x72, 0x2F, + 0xB6, 0xEF, 0xC9, 0x2D, 0x4E, 0xE3, 0x28, 0x1D, 0xA9, 0xD2, 0xCE, 0x0B, + 0xCC, 0xC4, 0xAE, 0x05, 0xDE, 0xC2, 0x68, 0xF8, 0xA1, 0xC2, 0x80, 0xE0, + 0x0C, 0xCC, 0x4D, 0xDA, 0x1B, 0xDA, 0xB6, 0xD6, 0xD3, 0xD6, 0x47, 0xC2, + 0x71, 0xD7, 0xE0, 0xBA, 0xCE, 0xF5, 0x45, 0xCB, 0x13, 0x1C, 0x16, 0xD7, + 0x49, 0x37, 0x04, 0xE2, 0xA0, 0x3A, 0x32, 0xEF, 0x76, 0x26, 0x3A, 0xF2, + 0x2E, 0x27, 0x6E, 0x0C, 0x7B, 0x3A, 0x23, 0x3A, 0x4C, 0x32, 0xC8, 0x39, + 0x27, 0x19, 0x3F, 0x20, 0x93, 0x16, 0x9A, 0x20, 0xD9, 0x1F, 0x30, 0x2E, + 0x2F, 0x17, 0x43, 0x32, 0x49, 0x04, 0x1A, 0x2B, 0xC3, 0xF5, 0xD1, 0x1B, + 0xD8, 0xFB, 0xED, 0x1A, 0xAC, 0x0E, 0x0F, 0x1C, 0xFA, 0x0F, 0x69, 0x05, + 0x55, 0x05, 0x1C, 0xF2, 0xD4, 0xFF, 0x8E, 0xF1, 0x35, 0xFB, 0x2B, 0xFA, + 0xD2, 0x00, 0x03, 0x02, 0xA5, 0xFA, 0x3C, 0x01, 0x2C, 0xDA, 0xBC, 0xF5, + 0x5D, 0xC6, 0x44, 0xF0, 0x40, 0xBB, 0xEB, 0xEA, 0x06, 0xB7, 0xE8, 0xD3, + 0x9D, 0xC4, 0xAC, 0xC3, 0xC1, 0xD8, 0x0B, 0xCE, 0xFA, 0xF1, 0x3A, 0xE0, + 0x04, 0xFD, 0xFE, 0xE9, 0xC0, 0xF7, 0x65, 0xE5, 0x6A, 0xFF, 0x4F, 0xE6, + 0x04, 0x1A, 0xEC, 0xFE, 0x99, 0x34, 0x63, 0x10, 0x07, 0x3C, 0xD5, 0x12, + 0xC3, 0x39, 0xE7, 0x0E, 0x9D, 0x30, 0x74, 0x0C, 0xD5, 0x1D, 0xFE, 0x16, + 0xDF, 0x14, 0xA9, 0x27, 0xEA, 0x13, 0xA0, 0x28, 0x3F, 0x19, 0xD1, 0x26, + 0x77, 0x1D, 0x59, 0x28, 0x0E, 0x0C, 0x4C, 0x19, 0x0E, 0xED, 0x96, 0xFF, + 0x6B, 0xD1, 0xCF, 0xEB, 0xB7, 0xBB, 0x5D, 0xE0, 0x88, 0xB5, 0x1D, 0xD3, + 0x96, 0xC9, 0x7C, 0xD3, 0x14, 0xDA, 0xE1, 0xCF, 0xA9, 0xDA, 0xC8, 0xB7, + 0xBD, 0xE3, 0x77, 0xB9, 0x3B, 0xED, 0xC1, 0xD5, 0xB9, 0xF1, 0xF1, 0xF0, + 0xB6, 0xFC, 0x13, 0x0C, 0xAD, 0x08, 0xB0, 0x13, 0xB4, 0x11, 0x7B, 0x10, + 0xC4, 0x33, 0xB6, 0x27, 0x57, 0x55, 0xB0, 0x41, 0xE9, 0x3B, 0xAE, 0x31, + 0x58, 0x0F, 0x4B, 0x1D, 0x0A, 0x05, 0x1F, 0x28, 0x04, 0x0E, 0xC6, 0x2C, + 0xBD, 0x16, 0xC3, 0x28, 0x52, 0x14, 0x05, 0x25, 0x9A, 0x08, 0x18, 0x15, + 0x44, 0x10, 0xA0, 0x10, 0x55, 0x15, 0x19, 0x10, 0xEE, 0x05, 0x46, 0xFE, + 0x65, 0xFA, 0xE9, 0xF1, 0x2D, 0xFA, 0xEC, 0xF5, 0xCD, 0x08, 0x0D, 0x05, + 0xA8, 0x18, 0x85, 0x0E, 0x24, 0x11, 0x5D, 0x06, 0x8D, 0xF2, 0x94, 0xED, + 0xFD, 0xDB, 0x7B, 0xD9, 0x13, 0xCD, 0xD2, 0xCB, 0x52, 0xBC, 0x93, 0xBB, + 0x01, 0xBF, 0xFD, 0xBC, 0xF3, 0xCD, 0x95, 0xD4, 0xB6, 0xDC, 0x0C, 0xE7, + 0x13, 0xED, 0x75, 0xEB, 0x4F, 0xF8, 0xDC, 0xE7, 0x1C, 0xFE, 0xAB, 0xE9, + 0xE1, 0x05, 0xFF, 0xFB, 0x9F, 0x11, 0x85, 0x0F, 0xD9, 0x18, 0xA0, 0x16, + 0x72, 0x25, 0xC8, 0x17, 0x12, 0x29, 0x26, 0x1A, 0x0B, 0x18, 0xC0, 0x22, + 0xAC, 0x0E, 0x91, 0x36, 0x2C, 0x0D, 0xD9, 0x39, 0x49, 0x15, 0x00, 0x2C, + 0x0C, 0x17, 0xA3, 0x1A, 0xB3, 0x03, 0xAC, 0x0B, 0x9E, 0xEC, 0xB6, 0x04, + 0xD0, 0xDB, 0x14, 0xF7, 0x36, 0xCB, 0xC2, 0xE0, 0x1E, 0xC6, 0x8D, 0xDC, + 0xAC, 0xDD, 0x4D, 0xE7, 0x25, 0xE9, 0x93, 0xD9, 0xC2, 0xDD, 0x7A, 0xB6, + 0x16, 0xE1, 0xF7, 0xAF, 0x98, 0xEC, 0x78, 0xBF, 0x56, 0xFB, 0xB0, 0xCE, + 0x6F, 0x0E, 0xAE, 0xE8, 0xE1, 0x0B, 0x47, 0xEB, 0x70, 0x06, 0xEC, 0xEC, + 0x92, 0x1F, 0xBD, 0x18, 0xE1, 0x38, 0xA6, 0x3B, 0x59, 0x30, 0x1C, 0x2E, + 0xF7, 0x21, 0x3E, 0x18, 0xE5, 0x1F, 0x87, 0x21, 0x40, 0x17, 0x60, 0x38, + 0xA1, 0x04, 0xCF, 0x39, 0x3D, 0xF3, 0xF3, 0x2A, 0x52, 0xF3, 0x53, 0x1E, + 0xC6, 0x0D, 0x5E, 0x1F, 0x8F, 0x1E, 0x24, 0x1D, 0x73, 0x0F, 0x44, 0x00, + 0x6F, 0xFF, 0x9C, 0xEA, 0xA4, 0xFB, 0xB3, 0xF0, 0x06, 0xFD, 0xE7, 0x06, + 0x63, 0xFA, 0xCB, 0x18, 0xC2, 0xF4, 0xFB, 0x12, 0xAE, 0xF1, 0x8E, 0xFE, + 0xC0, 0xE8, 0x96, 0xEC, 0xB6, 0xD5, 0x9A, 0xE6, 0x10, 0xC0, 0xB6, 0xE1, + 0x5E, 0xC2, 0xB0, 0xDF, 0x69, 0xDA, 0x67, 0xE5, 0x07, 0xED, 0xDD, 0xE9, + 0x69, 0x02, 0xC2, 0xF1, 0x32, 0x13, 0x87, 0xF7, 0x2E, 0x15, 0x40, 0xFA, + 0x3F, 0x15, 0xAA, 0x02, 0xC2, 0x19, 0x69, 0x0F, 0x07, 0x1F, 0xAE, 0x13, + 0x3F, 0x20, 0x10, 0x0C, 0x95, 0x1C, 0x0B, 0x06, 0xDB, 0x1B, 0x95, 0x08, + 0x15, 0x29, 0xE6, 0x14, 0x7A, 0x34, 0x0E, 0x1C, 0xE1, 0x28, 0xC7, 0x19, + 0x3A, 0x0F, 0x96, 0x17, 0x08, 0xF6, 0x57, 0x0C, 0x4E, 0xE6, 0x7F, 0x00, + 0xB1, 0xE6, 0xD3, 0xF4, 0xB2, 0xE4, 0x19, 0xE5, 0x76, 0xE0, 0x63, 0xDE, + 0x28, 0xE0, 0x88, 0xDC, 0x4B, 0xD5, 0x9B, 0xCE, 0x60, 0xC8, 0x50, 0xC0, + 0xF0, 0xCA, 0xCB, 0xCA, 0xE3, 0xDB, 0x53, 0xE2, 0x3C, 0xFA, 0xFB, 0xF2, + 0x96, 0x1A, 0x91, 0x00, 0x9C, 0x18, 0xE8, 0xF5, 0x7D, 0x0B, 0x1B, 0xF1, + 0x4F, 0x1E, 0x73, 0x1B, 0xBC, 0x25, 0x31, 0x2F, 0x1E, 0x10, 0x7D, 0x1C, + 0xF4, 0x14, 0x52, 0x17, 0x66, 0x2D, 0x1B, 0x29, 0xA5, 0x2B, 0xB0, 0x35, + 0x28, 0x1A, 0xA3, 0x31, 0x72, 0x0B, 0x41, 0x21, 0xDA, 0x06, 0x0E, 0x11, + 0x4C, 0x0D, 0xE5, 0x1A, 0x61, 0x06, 0xA1, 0x23, 0x8E, 0xF5, 0xDD, 0x0E, + 0x4D, 0xFA, 0x57, 0xFF, 0x8D, 0x08, 0xEB, 0xFB, 0x86, 0x0C, 0x61, 0x00, + 0xF4, 0x0E, 0x33, 0x0B, 0x23, 0x03, 0x4F, 0x01, 0x37, 0xEA, 0xE1, 0xE5, + 0x87, 0xDB, 0x04, 0xD4, 0x85, 0xCF, 0x0B, 0xCF, 0x49, 0xC2, 0x64, 0xCB, + 0xAA, 0xC1, 0xCA, 0xD1, 0xB2, 0xCA, 0xC6, 0xD7, 0x72, 0xD7, 0x28, 0xDD, + 0x20, 0xE9, 0x30, 0xED, 0xB9, 0xEC, 0x36, 0xEC, 0x92, 0xEF, 0x52, 0xE1, + 0x1F, 0x11, 0xC6, 0xE9, 0xF4, 0x35, 0xD9, 0xFD, 0x27, 0x44, 0xA5, 0x10, + 0x35, 0x3E, 0x55, 0x18, 0xB5, 0x33, 0xE5, 0x14, 0x5D, 0x31, 0x3A, 0x11, + 0xFF, 0x30, 0x9F, 0x15, 0xDD, 0x25, 0x89, 0x1D, 0xC4, 0x0C, 0xF3, 0x1B, + 0x77, 0xFC, 0x37, 0x13, 0xF6, 0xF4, 0x37, 0x04, 0xF4, 0xE7, 0xF7, 0xF4, + 0xBB, 0xD8, 0xFF, 0xF6, 0x57, 0xCC, 0xF5, 0xFA, 0x60, 0xD5, 0x09, 0xFA, + 0x9D, 0xE4, 0xEF, 0xEE, 0xCA, 0xDE, 0xEA, 0xDB, 0xB3, 0xD5, 0x7E, 0xDA, + 0xAC, 0xD7, 0x14, 0xE3, 0x30, 0xE9, 0x44, 0xEA, 0x24, 0x06, 0xD3, 0xF8, + 0x6A, 0x0F, 0x33, 0xFB, 0xEE, 0x0B, 0xB0, 0xF5, 0x70, 0x23, 0x6F, 0x14, + 0xEB, 0x33, 0x64, 0x36, 0xDB, 0x1A, 0x15, 0x32, 0xDC, 0x08, 0xC2, 0x24, + 0x6D, 0x17, 0x84, 0x29, 0xF5, 0x1B, 0xAE, 0x2E, 0xB6, 0x10, 0x7A, 0x32, + 0x75, 0x06, 0xB0, 0x37, 0x67, 0x00, 0xFC, 0x32, 0x16, 0x04, 0x5F, 0x29, + 0xA3, 0x06, 0x21, 0x21, 0x5B, 0xFF, 0x40, 0x0F, 0x57, 0xF5, 0x3D, 0xFF, + 0xFD, 0xFC, 0xF3, 0xFC, 0x75, 0x12, 0xAF, 0x01, 0xDA, 0x25, 0x2F, 0x09, + 0x9E, 0x21, 0x0E, 0xFF, 0xD3, 0x08, 0xFF, 0xF0, 0x76, 0xF1, 0x48, 0xE9, + 0xCE, 0xD1, 0xFF, 0xD8, 0x17, 0xB8, 0xE8, 0xC9, 0xCD, 0xBC, 0x2E, 0xC5, + 0x15, 0xD6, 0x6A, 0xC1, 0x7F, 0xF5, 0x99, 0xC2, 0xFC, 0x00, 0xC9, 0xCD, + 0x20, 0xEF, 0x3A, 0xDA, 0xC5, 0xDC, 0xC9, 0xE0, 0xFA, 0xE8, 0x70, 0xEA, + 0x92, 0x14, 0x9A, 0xFB, 0xFD, 0x34, 0x20, 0x06, 0x54, 0x39, 0xD4, 0x0D, + 0x4A, 0x32, 0x1C, 0x18, 0x47, 0x2C, 0xDC, 0x20, 0x39, 0x2C, 0x94, 0x2A, + 0x47, 0x2E, 0x9B, 0x34, 0x22, 0x2C, 0xCC, 0x3C, 0xC8, 0x23, 0x88, 0x38, + 0x69, 0x16, 0xD4, 0x25, 0x51, 0x04, 0x3D, 0x10, 0x4D, 0xE9, 0xA1, 0x01, + 0xCD, 0xCD, 0xB5, 0xFD, 0x7E, 0xCB, 0x6C, 0x02, 0x87, 0xD9, 0xB1, 0xFC, + 0x1A, 0xDD, 0xC9, 0xE4, 0xA0, 0xDC, 0xAE, 0xD8, 0x6A, 0xE0, 0xDD, 0xD5, + 0x11, 0xE8, 0x3C, 0xCE, 0xBF, 0xFD, 0x60, 0xD8, 0x02, 0x0C, 0x82, 0xE2, + 0xC7, 0xF9, 0x69, 0xCE, 0x87, 0xFD, 0x03, 0xD5, 0x0F, 0x25, 0xA1, 0x02, + 0x0D, 0x2E, 0x12, 0x13, 0xEB, 0x1D, 0x8F, 0x06, 0xE9, 0x21, 0x4F, 0x0A, + 0x17, 0x28, 0xA0, 0x17, 0xCA, 0x1F, 0x8B, 0x1E, 0x4A, 0x18, 0xC5, 0x22, + 0x56, 0x0A, 0x06, 0x22, 0x58, 0xFF, 0x1F, 0x29, 0x94, 0xFF, 0xAC, 0x35, + 0x01, 0xFE, 0x2A, 0x2E, 0x36, 0xF4, 0xAF, 0x16, 0x3E, 0xE8, 0x54, 0x02, + 0x99, 0xEB, 0x95, 0xFA, 0xC8, 0xFA, 0xB7, 0x00, 0x3E, 0xFC, 0x4C, 0xFD, + 0xAE, 0xF4, 0x06, 0xF2, 0x7B, 0xFA, 0x65, 0xF1, 0x92, 0xF8, 0x99, 0xEF, + 0xC0, 0xE4, 0xEA, 0xE2, 0xDC, 0xD5, 0xA2, 0xD9, 0xD5, 0xCB, 0x3D, 0xD7, + 0x62, 0xC6, 0x3D, 0xD4, 0x32, 0xCE, 0x3C, 0xE4, 0x18, 0xD6, 0x48, 0xF9, + 0x32, 0xD3, 0xA7, 0xF2, 0xFA, 0xD7, 0x0F, 0xE7, 0x9C, 0xF8, 0x50, 0xF6, + 0xF7, 0x14, 0xE6, 0x07, 0x6E, 0x18, 0xFF, 0x00, 0xD2, 0x14, 0x65, 0xF3, + 0x23, 0x19, 0xC5, 0xFA, 0xFE, 0x27, 0xBB, 0x0F, 0x3B, 0x34, 0xF1, 0x1A, + 0xCD, 0x3A, 0x18, 0x25, 0x16, 0x3A, 0x0F, 0x30, 0xBF, 0x2C, 0x61, 0x33, + 0xAE, 0x17, 0x9D, 0x2E, 0x59, 0x03, 0x26, 0x26, 0x3E, 0xEC, 0xB0, 0x15, + 0xB0, 0xEC, 0x35, 0x0E, 0xD8, 0x05, 0x54, 0x1A, 0x41, 0x00, 0x67, 0x13, + 0x5C, 0xE2, 0x50, 0xF1, 0x15, 0xD9, 0x8B, 0xDB, 0xED, 0xE5, 0x4D, 0xDB, + 0x11, 0xF5, 0x48, 0xE9, 0x20, 0xFB, 0x7A, 0xF9, 0x12, 0xF2, 0xC7, 0xE4, + 0xAD, 0xF3, 0x8E, 0xD3, 0x1B, 0x12, 0x4E, 0xF4, 0x46, 0x27, 0x43, 0x12, + 0xB3, 0x18, 0x5E, 0x08, 0x12, 0x06, 0x77, 0xF6, 0x55, 0x14, 0x98, 0xFD, + 0x60, 0x31, 0x44, 0x12, 0x0F, 0x37, 0xA1, 0x19, 0x93, 0x1C, 0x52, 0x19, + 0xBC, 0x0A, 0xEF, 0x1D, 0x15, 0x0C, 0x52, 0x25, 0xD5, 0x13, 0xC7, 0x28, + 0x01, 0x1D, 0xEE, 0x17, 0x4A, 0x0D, 0x22, 0xF9, 0x53, 0xF9, 0x4B, 0xEA, + 0x91, 0xF7, 0x64, 0xFE, 0xA3, 0xF4, 0x34, 0x16, 0xDA, 0xE7, 0xB0, 0x0A, + 0x71, 0xE0, 0xE8, 0xF1, 0xE5, 0xE6, 0x46, 0xE6, 0x85, 0xE1, 0x08, 0xE0, + 0x8F, 0xCC, 0xC3, 0xD9, 0xE4, 0xC2, 0x4B, 0xD5, 0xBF, 0xCA, 0x78, 0xD9, + 0x14, 0xDF, 0xC1, 0xE6, 0x09, 0xEA, 0xDC, 0xF0, 0x75, 0xE6, 0x51, 0xED, + 0xC4, 0xE1, 0x48, 0xE3, 0x25, 0xED, 0xE2, 0xE5, 0x02, 0x0C, 0x7F, 0xFA, + 0x30, 0x1D, 0x6A, 0x02, 0x8C, 0x1B, 0xEE, 0xF1, 0xEE, 0x14, 0x72, 0xEB, + 0xDD, 0x0E, 0xF8, 0xFA, 0x5C, 0x0D, 0x38, 0x12, 0x06, 0x16, 0xCB, 0x26, + 0x6B, 0x24, 0xFB, 0x2A, 0xF4, 0x28, 0x65, 0x1E, 0x81, 0x20, 0x99, 0x07, + 0x58, 0x10, 0x3B, 0xFD, 0xD7, 0xF2, 0xA5, 0xFB, 0x58, 0xE5, 0xCA, 0xF5, + 0xB8, 0xF5, 0x60, 0x04, 0x77, 0xF8, 0x68, 0x11, 0x02, 0xE4, 0x81, 0x05, + 0x13, 0xD1, 0x25, 0xF9, 0xC5, 0xD8, 0xF7, 0xFA, 0xEC, 0xF3, 0xA8, 0x04, + 0x0A, 0x08, 0x2A, 0x08, 0x6A, 0x05, 0xFF, 0xFB, 0x93, 0xFA, 0x96, 0xED, + 0xC4, 0x0D, 0x8C, 0xF7, 0x58, 0x29, 0xA0, 0x12, 0x9F, 0x22, 0x35, 0x16, + 0x3F, 0x0A, 0xD1, 0x07, 0x18, 0x07, 0x5C, 0x0C, 0x7C, 0x0A, 0x82, 0x12, + 0xB1, 0x03, 0xED, 0x08, 0x08, 0xFC, 0x11, 0x06, 0xAF, 0xF8, 0x2A, 0x14, + 0x95, 0x03, 0x9F, 0x21, 0x54, 0x18, 0xBC, 0x28, 0x92, 0x20, 0x0D, 0x26, + 0x69, 0x13, 0xE3, 0x10, 0xD9, 0x07, 0x19, 0x03, 0x00, 0x14, 0xA9, 0x05, + 0x1C, 0x22, 0x7B, 0x03, 0x33, 0x17, 0x2A, 0xF9, 0x21, 0x0C, 0xC4, 0xF4, + 0x95, 0x10, 0x2E, 0xEC, 0xB5, 0x09, 0x84, 0xD6, 0x84, 0xF4, 0x7A, 0xCB, + 0xB3, 0xE9, 0xC7, 0xCB, 0x84, 0xE8, 0xA7, 0xCD, 0x19, 0xEA, 0xE7, 0xD2, + 0xEC, 0xEB, 0xAC, 0xE1, 0xA2, 0xE5, 0x6F, 0xED, 0x88, 0xD8, 0x55, 0xE8, + 0x83, 0xCF, 0xEE, 0xEC, 0xA2, 0xDC, 0xE4, 0x00, 0xF4, 0xF4, 0xBA, 0x05, + 0xD3, 0xFE, 0x68, 0x01, 0xD9, 0x00, 0x07, 0x00, 0x16, 0x0B, 0x38, 0x04, + 0xD7, 0x19, 0x27, 0x0B, 0x20, 0x26, 0xAF, 0x15, 0x49, 0x2D, 0x52, 0x23, + 0xC6, 0x27, 0x1B, 0x25, 0xA3, 0x0B, 0xEC, 0x1D, 0x1E, 0xE8, 0x44, 0x18, + 0x83, 0xD1, 0x95, 0x14, 0x6C, 0xD4, 0x84, 0x18, 0x4A, 0xE8, 0x97, 0x1C, + 0x12, 0xEA, 0x35, 0x12, 0x05, 0xDA, 0xAC, 0xFE, 0x15, 0xD3, 0x85, 0xED, + 0x5C, 0xDD, 0x30, 0xEB, 0x93, 0xEE, 0x76, 0xF5, 0xC2, 0x02, 0x84, 0xFA, + 0xBA, 0x0B, 0xE4, 0xED, 0x57, 0x04, 0x27, 0xE4, 0x8D, 0x10, 0x30, 0xF4, + 0xEB, 0x20, 0x08, 0xFE, 0x3B, 0x13, 0xAB, 0xE6, 0xBD, 0x07, 0x2E, 0xDA, + 0x5B, 0x1A, 0xBC, 0xF4, 0x72, 0x2D, 0x3D, 0x07, 0x7F, 0x2A, 0xD4, 0xFD, + 0xD0, 0x28, 0x46, 0xF1, 0xFD, 0x27, 0xB3, 0xF6, 0x3D, 0x1D, 0x5B, 0x0A, + 0xD6, 0x18, 0x01, 0x19, 0xCF, 0x0D, 0xCD, 0x1D, 0x9F, 0xF6, 0xF9, 0x19, + 0x00, 0xF1, 0xC0, 0x1D, 0x27, 0xFF, 0x4E, 0x2F, 0xA6, 0x04, 0xB9, 0x32, + 0x65, 0xF6, 0xA0, 0x1D, 0xEA, 0xEB, 0x06, 0x05, 0xB5, 0xEF, 0x28, 0xF5, + 0xC4, 0xED, 0xF2, 0xE8, 0x70, 0xEA, 0x66, 0xDD, 0x57, 0xF2, 0xA6, 0xDB, + 0xA8, 0xF5, 0xA1, 0xEB, 0xDD, 0xF6, 0xEA, 0xFB, 0x0D, 0xFA, 0x18, 0xFF, + 0xC2, 0xF3, 0x2C, 0xF2, 0xD4, 0xEB, 0x94, 0xE0, 0xFC, 0xF0, 0x46, 0xF3, + 0x06, 0xFB, 0xC1, 0x0D, 0x35, 0xF9, 0xEE, 0x0F, 0xDC, 0xF5, 0xC6, 0x05, + 0xE1, 0xFD, 0xFC, 0xF3, 0x0D, 0x07, 0xE2, 0xEE, 0xBB, 0x0C, 0xA6, 0xFA, + 0xE2, 0x08, 0xE3, 0x0D, 0xD7, 0x05, 0x3A, 0x18, 0xA6, 0x13, 0xBF, 0x12, + 0xD2, 0x18, 0x50, 0x09, 0x31, 0x0F, 0xAC, 0xFE, 0x41, 0x03, 0xC4, 0xF2, + 0x47, 0xFF, 0xE3, 0xF6, 0xB2, 0xFE, 0x18, 0x0C, 0xBE, 0xF2, 0x74, 0x15, + 0x03, 0xDD, 0xE9, 0x04, 0x61, 0xD2, 0x3F, 0xFC, 0x64, 0xD8, 0xE5, 0x03, + 0x62, 0xE0, 0x10, 0x06, 0x3F, 0xE2, 0xB1, 0x03, 0x4F, 0xDB, 0x20, 0xEE, + 0xB0, 0xE9, 0xAF, 0xD8, 0xB9, 0x14, 0x63, 0xEE, 0x72, 0x28, 0xBD, 0xFE, + 0xD6, 0x14, 0x6B, 0xE9, 0x79, 0x06, 0xC6, 0xDB, 0xDC, 0x16, 0x8F, 0xE1, + 0x5C, 0x29, 0x32, 0xF1, 0x41, 0x22, 0x4F, 0xF5, 0xC8, 0x0F, 0xA6, 0xE8, + 0xE2, 0x09, 0x67, 0xEF, 0xB5, 0x14, 0xEE, 0x04, 0x84, 0x1B, 0x33, 0x12, + 0xFB, 0x14, 0x99, 0x1A, 0x5C, 0x0B, 0x2C, 0x17, 0x46, 0x0C, 0xEC, 0x15, + 0xD7, 0x1D, 0x22, 0x27, 0x1A, 0x1E, 0x6F, 0x2C, 0xDA, 0xFA, 0x83, 0x13, + 0x65, 0xE2, 0x68, 0xF9, 0x95, 0xE1, 0x19, 0xF2, 0xA9, 0xDE, 0xAD, 0xF0, + 0x3B, 0xD9, 0xDC, 0xF7, 0x65, 0xD6, 0x6C, 0xFD, 0xD5, 0xDC, 0x44, 0xF9, + 0x35, 0xED, 0xD9, 0xFE, 0xD9, 0xF9, 0xD3, 0x03, 0x8E, 0xF6, 0x78, 0xF2, + 0xBB, 0xEC, 0x58, 0xE8, 0x50, 0xEE, 0xB7, 0xF7, 0xC3, 0xF8, 0x1F, 0x08, + 0x47, 0xFE, 0x4B, 0x11, 0xE3, 0xFC, 0x75, 0x0F, 0x18, 0xFE, 0x58, 0x03, + 0x3B, 0x07, 0xB3, 0xF6, 0xA9, 0x0E, 0xDA, 0xF3, 0xF2, 0x12, 0xFE, 0xF0, + 0xC9, 0x13, 0x4A, 0xE6, 0x90, 0x08, 0x5B, 0xE4, 0xF8, 0x04, 0x99, 0xEE, + 0x67, 0x09, 0xDD, 0xFA, 0x34, 0xFF, 0x45, 0x09, 0xED, 0x00, 0x86, 0x12, + 0x54, 0x12, 0x9A, 0x13, 0x86, 0x09, 0xD6, 0x08, 0xC7, 0xEB, 0x32, 0xF1, + 0x46, 0xDE, 0xCA, 0xE8, 0x6E, 0xE2, 0x13, 0xF6, 0x28, 0xEE, 0x19, 0x0D, + 0x21, 0xFB, 0x10, 0x1C, 0x49, 0xFB, 0x04, 0x0C, 0x62, 0xFF, 0xF6, 0xF9, + 0x1B, 0x14, 0x58, 0x00, 0x52, 0x15, 0x48, 0x03, 0x7A, 0xFB, 0x61, 0xF9, + 0x24, 0xF2, 0xAE, 0xF4, 0x88, 0x07, 0x20, 0x06, 0xEB, 0x1F, 0x7D, 0x1A, + 0x28, 0x24, 0x8B, 0x14, 0xB2, 0x10, 0x93, 0x0A, 0xCB, 0xFF, 0x94, 0x0C, + 0x5B, 0x01, 0xCC, 0x0A, 0x0D, 0x09, 0xFF, 0x04, 0x5F, 0x0A, 0xE9, 0x02, + 0x61, 0x06, 0x3C, 0x08, 0x65, 0x0F, 0x68, 0x13, 0x9A, 0x22, 0x08, 0x22, + 0x43, 0x24, 0x4B, 0x28, 0xDE, 0x0C, 0xFF, 0x1D, 0xAA, 0xF5, 0x83, 0x10, + 0xFE, 0xE5, 0x89, 0x03, 0x5E, 0xE0, 0xDB, 0xFA, 0x59, 0xF0, 0xF5, 0xEF, + 0xF6, 0x06, 0x0E, 0xE2, 0xA4, 0x0D, 0xB2, 0xE4, 0xA4, 0x05, 0xAE, 0xE7, + 0x75, 0xFA, 0xB3, 0xDF, 0x01, 0xED, 0xC6, 0xDC, 0x17, 0xE7, 0x0B, 0xE5, + 0x8E, 0xF3, 0xAF, 0xFA, 0xDA, 0x06, 0x42, 0x13, 0xBE, 0x0B, 0x70, 0x11, + 0x6A, 0x00, 0x30, 0x03, 0xC3, 0xFA, 0x7F, 0x06, 0x6A, 0xFC, 0x1E, 0x0C, + 0x35, 0x02, 0x27, 0x03, 0xFD, 0x0E, 0x7B, 0xFA, 0x1A, 0x10, 0x2F, 0xFE, + 0x5F, 0x01, 0x4B, 0xFA, 0x9B, 0xED, 0x90, 0xF1, 0xD6, 0xE2, 0x1C, 0xED, + 0xF9, 0xEE, 0xF6, 0xE7, 0x79, 0x05, 0x1E, 0xEF, 0xEE, 0x0B, 0x45, 0xFE, + 0x5E, 0xFD, 0x2D, 0x01, 0xED, 0xE9, 0x05, 0xF7, 0x3D, 0xE7, 0xC6, 0xF6, + 0x4F, 0xF7, 0xD8, 0x05, 0x19, 0x02, 0x29, 0x13, 0x09, 0xF6, 0x10, 0x0E, + 0xA2, 0xE5, 0x86, 0x01, 0xEB, 0xEA, 0x14, 0x0A, 0xD8, 0xF9, 0xE1, 0x17, + 0x03, 0xFC, 0x88, 0x0C, 0x79, 0xF7, 0xEE, 0xEC, 0x1D, 0x06, 0x11, 0xE3, + 0xF4, 0x1F, 0x44, 0xF2, 0x02, 0x23, 0xF9, 0xEF, 0xF2, 0x11, 0xC1, 0xE6, + 0xD3, 0x0C, 0x7D, 0xF1, 0xC7, 0x14, 0x37, 0xFE, 0x89, 0x14, 0x9C, 0x08, + 0xA1, 0x0B, 0x98, 0x10, 0x97, 0xF9, 0xBF, 0x13, 0xB2, 0xEC, 0x92, 0x15, + 0x33, 0xFB, 0x65, 0x1E, 0xDC, 0x0F, 0xFA, 0x2A, 0x4D, 0x0D, 0x13, 0x18, + 0xB6, 0x01, 0x8A, 0xFB, 0x1B, 0xFE, 0xE7, 0xF5, 0x78, 0xF9, 0x7B, 0xF3, + 0x27, 0xF3, 0x05, 0xF1, 0x15, 0xF7, 0xBC, 0xF6, 0xBC, 0xFF, 0x4F, 0xFF, + 0x67, 0x02, 0xDD, 0x0C, 0x75, 0x08, 0xF1, 0x15, 0x9B, 0x0A, 0x84, 0x0F, + 0x34, 0x01, 0xD2, 0xFD, 0xDB, 0x04, 0xFF, 0xF6, 0x99, 0x16, 0x4E, 0x06, + 0x98, 0x15, 0x8A, 0x0B, 0x87, 0x04, 0x51, 0x09, 0xCA, 0x03, 0x37, 0x0C, + 0xB4, 0x07, 0x44, 0x0A, 0x92, 0xFF, 0x43, 0x05, 0xA2, 0xFE, 0x47, 0x00, + 0xEE, 0x01, 0xDD, 0xF8, 0x2F, 0xFB, 0x3B, 0xF0, 0xB8, 0xF3, 0xC4, 0xF2, + 0x71, 0xF2, 0x08, 0xF9, 0x88, 0xF3, 0x41, 0xF8, 0xC4, 0xFF, 0x4B, 0xF3, + 0x99, 0x18, 0x58, 0xEC, 0x24, 0x1F, 0x6D, 0xED, 0x03, 0x09, 0xC0, 0xED, + 0x05, 0xF3, 0xF3, 0xEC, 0xB4, 0xEE, 0x53, 0xF8, 0x33, 0xFE, 0x18, 0x04, + 0xD4, 0x0F, 0xE8, 0x09, 0x95, 0x0B, 0xFA, 0x0E, 0x90, 0xF6, 0x15, 0x15, + 0xB8, 0xED, 0xDF, 0x13, 0x5B, 0xF4, 0xAA, 0x15, 0x70, 0xF1, 0x7A, 0x16, + 0xB1, 0xE8, 0x77, 0x0A, 0x8D, 0xF1, 0x82, 0x02, 0xBC, 0x09, 0x76, 0x03, + 0x67, 0x18, 0x4A, 0x02, 0x65, 0x17, 0xCF, 0xFE, 0x4F, 0x0D, 0x15, 0xFD, + 0xCE, 0x08, 0xF9, 0xFC, 0x66, 0x13, 0x18, 0xFB, 0xC0, 0x19, 0x15, 0xF7, + 0x49, 0x16, 0xFA, 0xF6, 0x12, 0x17, 0xC4, 0xF0, 0x8D, 0x20, 0xFE, 0xF3, + 0x90, 0x28, 0xD6, 0x04, 0xED, 0x15, 0xF5, 0x0A, 0x60, 0xEB, 0x5F, 0x0D, + 0x33, 0xD1, 0x9F, 0x15, 0xE3, 0xD1, 0x3D, 0x19, 0x93, 0xDD, 0x56, 0x11, + 0x88, 0xEB, 0xE8, 0x0A, 0x9F, 0xEF, 0x4B, 0x0C, 0x10, 0xEB, 0xD5, 0x01, + 0x00, 0xE6, 0x6E, 0xFB, 0xC7, 0xE5, 0xBF, 0xFD, 0x03, 0xEA, 0x54, 0xF4, + 0x47, 0xEE, 0x10, 0xF4, 0x99, 0xF8, 0x99, 0x02, 0x1C, 0xFE, 0x38, 0x05, + 0x07, 0xFD, 0xB8, 0xF4, 0x41, 0xFD, 0x6E, 0xEE, 0xCC, 0xF4, 0xFF, 0xF4, + 0xF4, 0xEE, 0xC1, 0xFE, 0x4C, 0xF5, 0xDA, 0x0F, 0xB3, 0xFD, 0x79, 0x13, + 0xE3, 0x07, 0x9C, 0xFB, 0x8D, 0x13, 0x37, 0xE7, 0x8B, 0x16, 0xB1, 0xDD, + 0x82, 0x0F, 0x3C, 0xD5, 0xB0, 0x05, 0x79, 0xDA, 0x40, 0x08, 0x04, 0xE5, + 0x0D, 0x14, 0x1A, 0xED, 0xA2, 0x14, 0xBD, 0xF4, 0xFE, 0x11, 0xDF, 0xF7, + 0xEA, 0x12, 0xC9, 0xF5, 0x08, 0x18, 0x90, 0xF7, 0x14, 0x16, 0xA1, 0xFD, + 0x8E, 0x08, 0x18, 0x04, 0x24, 0x05, 0xE6, 0x0C, 0x6D, 0x08, 0xD2, 0x1A, + 0x90, 0x00, 0xDF, 0x23, 0x5B, 0xF3, 0x98, 0x22, 0xB7, 0xED, 0xD4, 0x20, + 0x9C, 0xF2, 0xF4, 0x1A, 0xC6, 0xFC, 0x0F, 0x10, 0xB4, 0x03, 0x8E, 0x07, + 0x73, 0x01, 0x20, 0x01, 0x38, 0xFB, 0x53, 0xFC, 0x43, 0x00, 0x93, 0xFE, + 0x49, 0x0B, 0xB9, 0xFD, 0x40, 0x0B, 0xF6, 0xFB, 0xA8, 0x02, 0x8B, 0x05, + 0xE7, 0x02, 0x99, 0x14, 0xFF, 0x03, 0xC1, 0x20, 0xC0, 0x03, 0xAF, 0x1E, + 0x9F, 0x06, 0x32, 0x13, 0xF2, 0x03, 0x6B, 0x08, 0x83, 0xFE, 0xE2, 0xFE, + 0x75, 0xF4, 0x95, 0xFA, 0x41, 0xEF, 0xEA, 0xFD, 0xCF, 0xEF, 0xD3, 0x03, + 0x8A, 0xF4, 0x63, 0x03, 0x39, 0xFC, 0x69, 0x03, 0xE6, 0xF7, 0x6A, 0x01, + 0xAD, 0xF1, 0x7A, 0xF3, 0xBE, 0xF2, 0x46, 0xEF, 0x4F, 0xF3, 0xF4, 0xEF, + 0x76, 0xF2, 0x1E, 0xE9, 0xA2, 0xEF, 0x61, 0xE6, 0x8D, 0xEF, 0x92, 0xE0, + 0xB7, 0xF4, 0xB2, 0xD8, 0x7A, 0xF9, 0xB8, 0xD5, 0x81, 0xF9, 0xF0, 0xDC, + 0x9C, 0xF4, 0x40, 0xE9, 0x2F, 0xF3, 0x94, 0xEA, 0x51, 0xFB, 0x2C, 0xED, + 0x61, 0x03, 0x6E, 0xF4, 0x3B, 0xFC, 0x33, 0xF4, 0xC7, 0xF3, 0xE7, 0xF3, + 0x6C, 0xFF, 0x2C, 0xFA, 0x57, 0x0C, 0xB1, 0x03, 0x00, 0x09, 0x97, 0x0E, + 0xE1, 0x09, 0x99, 0x1A, 0x83, 0x12, 0xF4, 0x23, 0x3E, 0x17, 0xF9, 0x21, + 0xE6, 0x1B, 0x9A, 0x18, 0x4E, 0x1E, 0xC9, 0x19, 0x1C, 0x1A, 0xBD, 0x1C, + 0x1A, 0x13, 0x71, 0x19, 0x3B, 0x09, 0x5C, 0x1C, 0x49, 0xF9, 0x57, 0x20, + 0xBA, 0xEE, 0x98, 0x1F, 0x16, 0xF7, 0xD5, 0x1C, 0x43, 0x09, 0x17, 0x13, + 0x5E, 0x15, 0xA5, 0x00, 0xD3, 0x12, 0xE4, 0xF0, 0xE0, 0xFF, 0x3F, 0xEE, + 0xA4, 0xEF, 0xDE, 0xEA, 0x7A, 0xEF, 0x7E, 0xE9, 0xC5, 0xFA, 0x16, 0xF5, + 0x1C, 0x0F, 0x55, 0xF4, 0x78, 0x20, 0x5E, 0xEA, 0x9C, 0x1E, 0x18, 0xE9, + 0xE1, 0x0D, 0x46, 0xE8, 0xA2, 0x03, 0x49, 0xEB, 0x40, 0xFD, 0x4B, 0xF3, + 0x72, 0xF0, 0x1F, 0xF7, 0x32, 0xEA, 0xE3, 0xFF, 0x63, 0xEB, 0x0B, 0x05, + 0x53, 0xEB, 0x98, 0x07, 0xA1, 0xEC, 0xEF, 0x09, 0xAA, 0xEB, 0xEC, 0x01, + 0x61, 0xE3, 0xFC, 0x01, 0xB6, 0xDD, 0x4A, 0x04, 0xBB, 0xDE, 0x73, 0x01, + 0xE7, 0xE3, 0x3E, 0xFE, 0x56, 0xF5, 0x53, 0xF4, 0x66, 0x0B, 0x17, 0xEA, + 0xA7, 0x0E, 0x69, 0xE2, 0x85, 0x00, 0x44, 0xDB, 0x72, 0xF1, 0x43, 0xE5, + 0xDC, 0xE2, 0x9E, 0xFA, 0x64, 0xDD, 0x6F, 0x08, 0x24, 0xEC, 0x44, 0x0D, + 0xC2, 0xFE, 0x63, 0x0B, 0xF3, 0x07, 0x22, 0x09, 0xE1, 0x09, 0xE1, 0x04, + 0x72, 0x0A, 0x31, 0xFD, 0xE3, 0x0B, 0xF0, 0xF7, 0x93, 0x0B, 0x5F, 0xF1, + 0x47, 0x09, 0x96, 0xEC, 0xCE, 0x05, 0xE5, 0xF1, 0xE0, 0x05, 0x64, 0xF9, + 0x59, 0x07, 0xC7, 0x03, 0xD1, 0x05, 0x77, 0x0C, 0x28, 0x06, 0xA8, 0x10, + 0x1B, 0x07, 0x1B, 0x18, 0xB8, 0x03, 0x3F, 0x21, 0x55, 0x06, 0x2C, 0x26, + 0x79, 0x14, 0x60, 0x23, 0x81, 0x1D, 0x81, 0x21, 0x49, 0x17, 0x23, 0x26, + 0x7F, 0x06, 0x3D, 0x29, 0xB3, 0xFC, 0x99, 0x23, 0xF2, 0xFB, 0x85, 0x17, + 0x47, 0xF9, 0xF3, 0x09, 0xDE, 0xF9, 0x95, 0x02, 0x93, 0xF9, 0xE3, 0xFA, + 0xF1, 0x00, 0x5B, 0xF2, 0xD1, 0x10, 0xCE, 0xF0, 0xE7, 0x15, 0xAC, 0xEF, + 0x20, 0x14, 0x64, 0xF1, 0xF8, 0x11, 0x78, 0xEF, 0x54, 0x10, 0x12, 0xEB, + 0x5A, 0x09, 0xBC, 0xEE, 0x38, 0xFD, 0x92, 0xEC, 0x5D, 0xF8, 0x71, 0xE8, + 0x89, 0xFC, 0xCE, 0xEB, 0xA3, 0xFD, 0x1F, 0xED, 0xA2, 0xF7, 0x1C, 0xEE, + 0x27, 0xF4, 0xE7, 0xEF, 0xA5, 0xEF, 0x39, 0xF2, 0xCB, 0xED, 0x68, 0xF5, + 0x19, 0xF6, 0xCF, 0xFB, 0x32, 0x01, 0xD1, 0xFF, 0x75, 0x04, 0x0B, 0xFE, + 0x19, 0xFA, 0x27, 0x02, 0x24, 0xF2, 0x83, 0x0D, 0x53, 0xF7, 0x4A, 0x14, + 0x05, 0x02, 0x85, 0x0B, 0x78, 0x08, 0x3D, 0x01, 0xC1, 0x06, 0x71, 0x02, + 0x11, 0x02, 0x74, 0x07, 0x9A, 0xFA, 0xEF, 0x02, 0x18, 0xF4, 0x94, 0xF6, + 0x9F, 0xF4, 0x1A, 0xF1, 0xE6, 0xF1, 0xFD, 0xEF, 0x82, 0xEE, 0xFD, 0xEA, + 0x44, 0xF9, 0x96, 0xE9, 0xC4, 0xFE, 0xD4, 0xF0, 0xE5, 0xF7, 0x9A, 0xF6, + 0x24, 0xF4, 0x1F, 0xFD, 0xE3, 0xF4, 0x80, 0x07, 0x17, 0x03, 0x28, 0x00, + 0x58, 0x14, 0xED, 0xF1, 0xBB, 0x1A, 0x81, 0xF2, 0xA3, 0x16, 0x9A, 0xF0, + 0x16, 0x0A, 0xF0, 0xED, 0x3F, 0x04, 0x87, 0xF3, 0x34, 0x08, 0x41, 0xF8, + 0xE4, 0x0D, 0x37, 0xFE, 0xAD, 0x0D, 0x88, 0x08, 0x7F, 0x03, 0x83, 0x12, + 0x6E, 0xFD, 0x59, 0x19, 0x1A, 0xFA, 0xEB, 0x1D, 0x1D, 0xF1, 0xD2, 0x22, + 0xC4, 0xED, 0x05, 0x24, 0xEC, 0xEA, 0x3B, 0x22, 0xA3, 0xE8, 0xFF, 0x1E, + 0x30, 0xF4, 0x01, 0x17, 0xFB, 0x02, 0x7B, 0x0E, 0xE7, 0x09, 0x3C, 0x07, + 0x99, 0x09, 0x25, 0xFF, 0x7A, 0x05, 0x7C, 0xFB, 0xFF, 0x06, 0x2E, 0xFE, + 0xAF, 0x07, 0xDB, 0xFE, 0x93, 0x06, 0xAF, 0xF9, 0x52, 0x0E, 0x9E, 0xF1, + 0xA0, 0x17, 0xB6, 0xED, 0x08, 0x13, 0x51, 0xEF, 0x4D, 0xFE, 0x83, 0xF1, + 0x6A, 0xEA, 0x2B, 0xF7, 0x8E, 0xE6, 0xF3, 0x00, 0x35, 0xEC, 0x66, 0x08, + 0x2B, 0xF4, 0x17, 0x0A, 0x5C, 0xFD, 0xE1, 0x06, 0x7D, 0x00, 0xC1, 0xFE, + 0x96, 0x01, 0x9C, 0xF8, 0x0B, 0x02, 0xD3, 0xF3, 0xB1, 0x04, 0x51, 0xEA, + 0xE1, 0x07, 0x79, 0xE2, 0x63, 0xFF, 0x6F, 0xE8, 0x59, 0xF6, 0x0E, 0xF7, + 0x96, 0xF5, 0x52, 0x00, 0x45, 0xFF, 0xCE, 0x05, 0x3B, 0x0A, 0x06, 0x06, + 0x1F, 0x04, 0xAA, 0x07, 0x2A, 0xF7, 0x3B, 0x09, 0x35, 0xEC, 0x89, 0x06, + 0x1E, 0xEE, 0xE5, 0xFF, 0xBB, 0xFA, 0x57, 0xF4, 0x39, 0xFF, 0x3D, 0xF1, + 0x0F, 0x00, 0x9C, 0xF6, 0x4A, 0x00, 0x00, 0xFF, 0x83, 0xFE, 0x54, 0x07, + 0xA2, 0xF9, 0x45, 0x0A, 0xB3, 0xF6, 0x23, 0x0E, 0x8F, 0xFA, 0x7F, 0x12, + 0xDB, 0x01, 0x87, 0x13, 0x4E, 0x08, 0xC1, 0x11, 0x11, 0x0B, 0x89, 0x13, + 0xE4, 0x10, 0x77, 0x14, 0xE3, 0x12, 0x51, 0x0E, 0x97, 0x0A, 0x94, 0x0C, + 0xD5, 0x02, 0xB3, 0x09, 0xC0, 0xFF, 0xBE, 0x07, 0xB7, 0x04, 0xAD, 0x06, + 0xE8, 0x0C, 0xFE, 0xFE, 0xD4, 0x11, 0xE6, 0xF7, 0x77, 0x0D, 0x29, 0xF8, + 0xB0, 0xFD, 0xF2, 0xFA, 0x4E, 0xF0, 0x74, 0xFB, 0x9D, 0xEF, 0xC7, 0xF9, + 0x37, 0xFE, 0xA9, 0xF0, 0x6D, 0x13, 0x1D, 0xE6, 0x93, 0x20, 0x3A, 0xE5, + 0x0D, 0x21, 0x92, 0xE9, 0x12, 0x1A, 0x41, 0xEA, 0x72, 0x17, 0xA3, 0xEF, + 0x32, 0x19, 0x4B, 0xFA, 0x3F, 0x11, 0x10, 0x04, 0x36, 0x03, 0xC2, 0x0C, + 0x39, 0xFA, 0x3A, 0x12, 0xC5, 0xF3, 0x7F, 0x14, 0xC4, 0xED, 0x3E, 0x0F, + 0x4B, 0xE7, 0x19, 0x06, 0x13, 0xE9, 0xD3, 0xFD, 0x67, 0xF5, 0x40, 0xFA, + 0x61, 0xF9, 0xEA, 0xFA, 0x8E, 0xF5, 0x70, 0xFA, 0x26, 0xF4, 0x6D, 0xFE, + 0x1A, 0xF9, 0xAD, 0xFD, 0x06, 0xFF, 0xBE, 0xF5, 0xEE, 0x02, 0x3E, 0xEE, + 0x12, 0x09, 0x9B, 0xE7, 0x9B, 0x04, 0x81, 0xE9, 0x84, 0xF7, 0xC2, 0xF0, + 0xED, 0xF2, 0xC5, 0xF8, 0x85, 0xF5, 0x9F, 0xFF, 0xA1, 0xF6, 0x58, 0x03, + 0xA9, 0xF1, 0x15, 0x07, 0x3E, 0xEA, 0x5A, 0x0A, 0x69, 0xE7, 0xAD, 0x09, + 0x1C, 0xED, 0xC5, 0x03, 0x4A, 0xF3, 0x54, 0x03, 0xC2, 0xF5, 0xAE, 0x09, + 0x6E, 0xF6, 0xD9, 0x0D, 0x5F, 0xF5, 0xBB, 0x11, 0xD7, 0xF9, 0x3D, 0x0D, + 0x8F, 0x00, 0x76, 0x06, 0x85, 0x03, 0xE2, 0x06, 0x98, 0x03, 0x38, 0x05, + 0x2F, 0x06, 0x91, 0x07, 0x2F, 0x0B, 0xA8, 0x08, 0xF9, 0x06, 0x36, 0x0C, + 0x86, 0xFB, 0xE7, 0x1C, 0x97, 0xF7, 0xE8, 0x23, 0x3A, 0x03, 0x57, 0x1B, + 0x08, 0x13, 0x51, 0x12, 0x8C, 0x13, 0x03, 0x0A, 0x17, 0x0C, 0x4A, 0xFD, + 0x76, 0x05, 0xF1, 0xF2, 0xCF, 0x04, 0xCA, 0xED, 0x33, 0x0F, 0xC4, 0xE7, + 0xEF, 0x14, 0x01, 0xE6, 0xB3, 0x14, 0x58, 0xEA, 0xA1, 0x11, 0xDE, 0xEA, + 0x24, 0x0C, 0xDC, 0xE9, 0xD5, 0x11, 0xDC, 0xEC, 0xF1, 0x18, 0xE5, 0xED, + 0x09, 0x13, 0x9C, 0xF1, 0xF4, 0x09, 0x7A, 0xFA, 0x43, 0x03, 0xA2, 0xFE, + 0x25, 0x02, 0x4A, 0x05, 0xF7, 0x04, 0xDF, 0x0E, 0x37, 0x02, 0xDA, 0x11, + 0x36, 0xF7, 0x54, 0x13, 0x20, 0xEB, 0xD1, 0x15, 0x22, 0xE4, 0x7D, 0x13, + 0x6F, 0xE1, 0x74, 0x0A, 0xEB, 0xE2, 0x0E, 0x03, 0x45, 0xEC, 0x22, 0xFA, + 0x75, 0xF7, 0x0F, 0xF4, 0x3F, 0xFA, 0x4B, 0xF7, 0xC2, 0xF4, 0xCB, 0xF8, + 0x2D, 0xEA, 0x59, 0xF8, 0x72, 0xDE, 0xAC, 0x01, 0x63, 0xDC, 0x5A, 0x02, + 0x25, 0xEA, 0xAE, 0xF8, 0xB0, 0xF8, 0x63, 0xF7, 0xC7, 0xFE, 0xDE, 0xF4, + 0x92, 0x02, 0xE4, 0xF4, 0x71, 0x0B, 0xDA, 0xF2, 0x49, 0x12, 0x0C, 0xEC, + 0x15, 0x14, 0xB2, 0xE7, 0xD0, 0x10, 0xC9, 0xE8, 0x32, 0x02, 0x91, 0xF1, + 0x3A, 0xFE, 0x11, 0xF9, 0xF3, 0x0B, 0xB8, 0xF8, 0xBE, 0x15, 0x97, 0xF5, + 0xA6, 0x11, 0xC5, 0xFB, 0x82, 0x03, 0xD7, 0x06, 0x13, 0xFC, 0xD3, 0x0A, + 0xAA, 0x02, 0xD2, 0x0C, 0x64, 0x0B, 0x77, 0x0C, 0x21, 0x0D, 0xF7, 0x11, + 0x06, 0x11, 0x74, 0x17, 0x03, 0x16, 0xC6, 0x0F, 0x03, 0x0D, 0xCC, 0x0C, + 0x2C, 0x00, 0x3C, 0x10, 0x8C, 0xF7, 0x86, 0x15, 0x89, 0xF2, 0xEA, 0x19, + 0xBA, 0xF6, 0x50, 0x18, 0xFB, 0x00, 0x1E, 0x16, 0x36, 0x09, 0x35, 0x13, + 0xEA, 0x09, 0x6E, 0x0D, 0xB9, 0x01, 0x7E, 0x06, 0xC2, 0xFA, 0xD4, 0xFD, + 0x6F, 0xFF, 0x84, 0xF7, 0x21, 0x04, 0xF8, 0xF8, 0x06, 0xFF, 0x76, 0x00, + 0xE2, 0xF7, 0x72, 0x03, 0x2A, 0xFC, 0xF5, 0x01, 0x17, 0x02, 0x94, 0x02, + 0x4D, 0xFF, 0x06, 0xFF, 0x2C, 0xFD, 0x80, 0xF9, 0x24, 0xFC, 0x1B, 0xF9, + 0x26, 0x01, 0x28, 0xFB, 0x71, 0x0C, 0x52, 0xFF, 0x98, 0x11, 0x77, 0x04, + 0x92, 0x0C, 0x09, 0x0A, 0x58, 0x05, 0x58, 0x0C, 0x71, 0x06, 0x1E, 0x06, + 0x18, 0x10, 0x54, 0xFD, 0x59, 0x16, 0x78, 0xF6, 0xCA, 0x0E, 0xA5, 0xF4, + 0xDB, 0x01, 0x6D, 0xF6, 0xF1, 0xFC, 0x15, 0xFA, 0xBF, 0xFC, 0xD3, 0xFA, + 0x28, 0xF9, 0x09, 0xF6, 0xD9, 0xEF, 0x02, 0xF2, 0xBF, 0xE3, 0x27, 0xE9, + 0x86, 0xDB, 0xF9, 0xDE, 0x72, 0xDC, 0x5C, 0xDC, 0x8C, 0xE2, 0x6E, 0xE5, + 0x8F, 0xE9, 0x97, 0xFA, 0xEC, 0xF5, 0x34, 0x03, 0x5D, 0x05, 0x0A, 0xFE, + 0x53, 0x14, 0x7D, 0xF9, 0x02, 0x1E, 0xC0, 0xF9, 0xEC, 0x18, 0xB6, 0x02, + 0xD1, 0x10, 0x8C, 0x00, 0x92, 0x17, 0xE5, 0xFA, 0x68, 0x1F, 0x0E, 0xFB, + 0xA1, 0x19, 0x3D, 0xFB, 0x8E, 0x07, 0xEB, 0x02, 0x07, 0xF4, 0xAF, 0x0D, + 0xA2, 0xEA, 0x1B, 0x16, 0x85, 0xEB, 0xD1, 0x1B, 0xEF, 0xF6, 0xA1, 0x1A, + 0x45, 0xFF, 0x49, 0x12, 0xD0, 0xF9, 0xF3, 0x08, 0x26, 0xF1, 0x10, 0x03, + 0xC6, 0xED, 0x58, 0xFE, 0x26, 0xF0, 0x66, 0xF7, 0x82, 0xF9, 0x82, 0xF6, + 0xD6, 0xFF, 0x60, 0xFA, 0x4F, 0xFA, 0x9C, 0xF9, 0x02, 0xFC, 0xCC, 0xFE, + 0x54, 0x09, 0xC2, 0x03, 0x39, 0x08, 0x49, 0xF9, 0x5C, 0x00, 0x7C, 0xF1, + 0x2D, 0x05, 0xAF, 0xF4, 0x5C, 0x0F, 0xB9, 0xFB, 0xD9, 0x0C, 0x6D, 0xFE, + 0x04, 0xF8, 0x31, 0x02, 0x8B, 0xEC, 0x0A, 0x09, 0x65, 0xF1, 0x96, 0x08, + 0xD8, 0xF5, 0xAA, 0x05, 0x03, 0xF6, 0x50, 0x02, 0x11, 0xF4, 0x66, 0x02, + 0x92, 0xF7, 0xB5, 0x09, 0xC1, 0xFB, 0x4F, 0x09, 0xAD, 0xFC, 0xA6, 0x02, + 0x27, 0x03, 0x26, 0x04, 0x07, 0x04, 0xF2, 0x0A, 0x98, 0xF9, 0xF4, 0x0D, + 0x63, 0xFA, 0x03, 0x06, 0x00, 0x07, 0xB9, 0xF9, 0xFE, 0x0D, 0x84, 0xF4, + 0x52, 0x13, 0x95, 0xF4, 0x52, 0x0F, 0xF0, 0xFC, 0x61, 0xFC, 0x44, 0x04, + 0xF0, 0xED, 0x2B, 0xFF, 0x10, 0xEB, 0x33, 0x00, 0xA8, 0xF4, 0xEA, 0x0A, + 0x9D, 0xFF, 0x93, 0x09, 0x6B, 0x03, 0xB3, 0xFE, 0x3F, 0x08, 0xDC, 0xFD, + 0xE4, 0x0B, 0x0C, 0x03, 0x24, 0x08, 0x9A, 0x04, 0x1E, 0x06, 0xD5, 0x08, + 0xF8, 0x15, 0x91, 0x0B, 0x32, 0x29, 0x1B, 0x08, 0x6A, 0x25, 0x79, 0x0D, + 0x37, 0x18, 0xDF, 0x17, 0x26, 0x13, 0xBF, 0x12, 0xFC, 0x13, 0xFC, 0x04, + 0xED, 0x13, 0x37, 0xFD, 0xF1, 0x0B, 0xC6, 0xFB, 0xAF, 0x01, 0x5B, 0x02, + 0xFF, 0xFA, 0x20, 0x05, 0xFB, 0xF6, 0x01, 0x03, 0x62, 0xFC, 0xBB, 0x07, + 0x6E, 0x03, 0xBD, 0x09, 0x02, 0xFE, 0xF3, 0xFF, 0x88, 0xF1, 0x15, 0xF2, + 0x48, 0xE6, 0xC1, 0xE7, 0x89, 0xEF, 0x51, 0xE3, 0x33, 0x01, 0x75, 0xE3, + 0x1A, 0x03, 0x24, 0xE5, 0xC0, 0x05, 0x36, 0xE8, 0x0A, 0x0F, 0xD2, 0xE7, + 0xA1, 0x0E, 0x82, 0xE9, 0x82, 0x00, 0xDC, 0xED, 0xFD, 0xF3, 0x41, 0xF4, + 0xCC, 0xF1, 0x1A, 0x03, 0x44, 0xF2, 0x70, 0x12, 0xAB, 0xF2, 0x4C, 0x18, + 0xE0, 0xF2, 0x54, 0x17, 0x66, 0xE8, 0x39, 0x10, 0xAF, 0xDA, 0x29, 0x07, + 0xE8, 0xDA, 0x50, 0xFE, 0x48, 0xE2, 0xAF, 0xFB, 0x7D, 0xE5, 0x31, 0xFA, + 0x81, 0xE3, 0xF7, 0xF5, 0x83, 0xE6, 0x1D, 0xF8, 0x8E, 0xF2, 0x01, 0xF2, + 0x50, 0xF9, 0x54, 0xEC, 0x78, 0xF9, 0x52, 0xF7, 0x7D, 0xF8, 0xAD, 0x02, + 0x70, 0xFB, 0x70, 0x03, 0x27, 0x03, 0xEB, 0x03, 0xF2, 0x0B, 0x5C, 0x05, + 0xF8, 0x17, 0xAF, 0xFC, 0xEB, 0x18, 0xD3, 0xF6, 0x4A, 0x10, 0x92, 0xF9, + 0xB8, 0x0C, 0xF9, 0xF2, 0x81, 0x0A, 0x7D, 0xF0, 0x69, 0x09, 0x1B, 0xF3, + 0x01, 0x0A, 0x7A, 0xF8, 0xAF, 0x0B, 0x63, 0x03, 0x8D, 0x13, 0xDD, 0x04, + 0xD7, 0x17, 0x6F, 0x01, 0xC9, 0x10, 0x6A, 0x02, 0xDE, 0x08, 0x26, 0x01, + 0x3F, 0xFF, 0x60, 0xFE, 0xBF, 0xF9, 0xDD, 0x04, 0xF4, 0xFD, 0xF9, 0x12, + 0x7B, 0x01, 0xDE, 0x1A, 0x60, 0x03, 0x0B, 0x1D, 0x70, 0xFE, 0x4C, 0x1B, + 0x17, 0xF9, 0x33, 0x0E, 0xD2, 0x00, 0x47, 0x08, 0xC1, 0x06, 0x25, 0x0C, + 0x73, 0x02, 0x8C, 0x07, 0xF5, 0xFE, 0x17, 0x04, 0x86, 0x01, 0xF8, 0x07, + 0xDA, 0x09, 0x71, 0x06, 0x27, 0x0B, 0x38, 0x01, 0xFE, 0xFA, 0x4F, 0x01, + 0x8B, 0xEA, 0x47, 0x00, 0x79, 0xED, 0xF1, 0xFB, 0x23, 0xF5, 0x4B, 0xFE, + 0xDF, 0xF0, 0x7C, 0x00, 0xCA, 0xED, 0x08, 0xFF, 0xB9, 0xF3, 0x5D, 0xFB, + 0xE8, 0xF8, 0x1D, 0xF7, 0x8C, 0x00, 0xC3, 0xF8, 0xCA, 0x04, 0x50, 0xF5, + 0x0A, 0x00, 0xEB, 0xF5, 0x8D, 0xFF, 0xED, 0x02, 0xFF, 0xFC, 0x00, 0x09, + 0x61, 0xFA, 0xD1, 0x01, 0x75, 0xF9, 0x50, 0xFB, 0xDE, 0xF4, 0x0E, 0xFC, + 0xD3, 0xF4, 0x94, 0xF8, 0xE9, 0xF4, 0xCC, 0xF1, 0x84, 0xEF, 0x4F, 0xEB, + 0xF3, 0xEA, 0xE7, 0xE3, 0xE6, 0xF2, 0x06, 0xE4, 0x00, 0x02, 0x26, 0xEB, + 0x3E, 0x0A, 0xF3, 0xEF, 0xB8, 0x0B, 0xF0, 0xF1, 0xF0, 0x07, 0x70, 0xF8, + 0x34, 0x03, 0x2F, 0xFF, 0x47, 0x03, 0xBE, 0x02, 0xF9, 0x07, 0xAE, 0x06, + 0x5E, 0x0E, 0xA0, 0x08, 0x36, 0x13, 0x03, 0x0C, 0x7A, 0x09, 0xA3, 0x10, + 0xB7, 0xFE, 0x39, 0x12, 0x3F, 0x0F, 0xA9, 0x15, 0x6F, 0x23, 0xB0, 0x19, + 0x50, 0x25, 0xD7, 0x19, 0x96, 0x1E, 0x56, 0x18, 0x7B, 0x18, 0xC0, 0x0D, + 0x6B, 0x0F, 0xBD, 0x00, 0xD7, 0x00, 0x1C, 0x03, 0x51, 0xFA, 0xF1, 0x08, + 0xD5, 0xFD, 0xF8, 0x06, 0xC7, 0xFE, 0xAA, 0x07, 0x1E, 0xF9, 0xC1, 0x09, + 0xED, 0xEE, 0x05, 0x06, 0x6F, 0xE9, 0x68, 0x01, 0xFD, 0xEB, 0x0D, 0x00, + 0x05, 0xF5, 0x51, 0x03, 0x77, 0x04, 0xBC, 0x04, 0xDF, 0x08, 0x6E, 0x06, + 0x43, 0x07, 0x80, 0x09, 0x72, 0x0E, 0x04, 0x08, 0xFF, 0x0F, 0x3F, 0xFC, + 0x70, 0x0B, 0x44, 0xE6, 0x2F, 0x0A, 0xED, 0xD9, 0x49, 0x05, 0x4A, 0xE6, + 0xD0, 0x05, 0x3C, 0x0B, 0xA1, 0x1C, 0xC4, 0x30, 0x8F, 0x3D, 0xF8, 0x4A, + 0x50, 0x4F, 0x29, 0x5A, 0xD9, 0x50, 0x74, 0x57, 0x1D, 0x5A, 0xAC, 0x61, + 0x88, 0x4A, 0x20, 0x5E, 0x1D, 0x2E, 0x23, 0x44, 0xB6, 0x48, 0xE3, 0x53, + 0x57, 0x4F, 0x6D, 0x4A, 0x28, 0x2C, 0xC7, 0x1D, 0xB1, 0x34, 0x55, 0x2B, + 0x45, 0x53, 0xC8, 0x4C, 0xD4, 0x48, 0xF3, 0x41, 0x7E, 0x31, 0x78, 0x2F, + 0x1C, 0x26, 0x98, 0x2B, 0x0C, 0x15, 0x1F, 0x14, 0x61, 0x04, 0xFC, 0xF0, + 0x78, 0xDF, 0x13, 0xC9, 0x5A, 0xC1, 0x2F, 0xB3, 0x37, 0xBD, 0xC1, 0xB3, + 0x09, 0xB1, 0xAE, 0xAA, 0xD3, 0xB0, 0xD6, 0xAB, 0x4A, 0xB1, 0x61, 0xA8, + 0xB3, 0xA6, 0xA0, 0xA0, 0xEC, 0xA5, 0xE1, 0xB2, 0x39, 0xAB, 0x02, 0xB2, + 0xD5, 0xA6, 0x61, 0x9D, 0xA4, 0xB0, 0xD9, 0xAD, 0x56, 0xDE, 0xA7, 0xD7, + 0x05, 0xDF, 0xF9, 0xD8, 0xF8, 0xC1, 0xC9, 0xC2, 0x2A, 0xC8, 0x34, 0xCB, + 0xE1, 0xD0, 0x90, 0xD5, 0xBF, 0xDA, 0xD7, 0xDF, 0x6E, 0xEF, 0x18, 0xFB, + 0xBD, 0x02, 0xC2, 0x0C, 0x45, 0x1F, 0x17, 0x27, 0xA0, 0x34, 0xA8, 0x3F, + 0x6F, 0x20, 0x07, 0x2D, 0xCF, 0x1C, 0x81, 0x2B, 0x08, 0x22, 0xF5, 0x37, + 0x0B, 0x11, 0xA1, 0x26, 0x8B, 0x22, 0x71, 0x26, 0x73, 0x40, 0xF1, 0x41, + 0xCC, 0x38, 0x85, 0x41, 0x1F, 0x32, 0x79, 0x22, 0xAC, 0x37, 0x0F, 0x19, + 0xF9, 0x29, 0xB4, 0x15, 0x85, 0x16, 0x73, 0xFB, 0xCB, 0x23, 0x40, 0xFB, + 0x04, 0x31, 0xC4, 0x03, 0xCA, 0x0F, 0x04, 0xED, 0xDC, 0xF8, 0x8F, 0xDE, + 0x3E, 0xF9, 0x7C, 0xE6, 0x67, 0xED, 0x07, 0xE7, 0xC7, 0xCC, 0x8F, 0xC4, + 0x51, 0xBE, 0x35, 0xB5, 0x6C, 0xD6, 0xCE, 0xD1, 0x76, 0xC8, 0x5A, 0xC0, + 0xC3, 0xA7, 0x1E, 0xA1, 0xE3, 0xAA, 0x40, 0xB3, 0x0B, 0xA9, 0x64, 0xB9, + 0x40, 0xA9, 0xAD, 0xB5, 0xD5, 0xB3, 0x1F, 0xC5, 0x8A, 0xAD, 0x69, 0xC2, + 0xC7, 0xA8, 0x54, 0xAF, 0x3A, 0xB2, 0x44, 0xAB, 0x04, 0xC3, 0x3B, 0xAF, + 0x1F, 0xC7, 0x31, 0xB9, 0xB9, 0xD1, 0x4A, 0xD7, 0xB8, 0xF3, 0xEB, 0xF7, + 0xA5, 0x0B, 0x6C, 0x0C, 0xE3, 0x19, 0x1E, 0x14, 0x3A, 0x23, 0x4B, 0x15, + 0x32, 0x20, 0xE8, 0x11, 0x0A, 0x10, 0x52, 0x09, 0x5C, 0x0E, 0x78, 0x16, + 0xCE, 0x1B, 0x87, 0x26, 0xD9, 0x14, 0x5E, 0x1D, 0xE3, 0x28, 0xBC, 0x26, + 0x7E, 0x4B, 0x62, 0x34, 0xAB, 0x40, 0x5F, 0x23, 0xB4, 0x2E, 0x8F, 0x1A, + 0x17, 0x28, 0x9C, 0x1F, 0x7D, 0x1B, 0x97, 0x13, 0xE6, 0x08, 0xDD, 0x03, + 0x10, 0xFF, 0xC3, 0xF9, 0xB4, 0xF5, 0x9C, 0xEC, 0xE4, 0xDE, 0xAE, 0xE5, + 0xC7, 0xC0, 0x29, 0xD6, 0x69, 0xA5, 0x3A, 0xBA, 0xB4, 0xA2, 0x41, 0xAC, + 0x76, 0xB3, 0x40, 0xB0, 0xED, 0xBB, 0xB6, 0xB9, 0x96, 0xBB, 0xB4, 0xC0, + 0x92, 0xB6, 0x50, 0xC1, 0xFC, 0xB9, 0xDC, 0xC6, 0x36, 0xCB, 0x51, 0xCC, + 0x92, 0xCE, 0x98, 0xBC, 0x4E, 0xCA, 0xD1, 0xB1, 0x26, 0xD0, 0xE9, 0xC3, + 0x73, 0xD7, 0x08, 0xD9, 0xE9, 0xD3, 0xC7, 0xD0, 0xEA, 0xD4, 0x73, 0xC6, + 0x65, 0xF6, 0x0E, 0xE8, 0xDF, 0x0B, 0x7D, 0x0A, 0x89, 0x03, 0x87, 0x03, + 0x44, 0x11, 0x87, 0x00, 0xE6, 0x1E, 0xDF, 0x0D, 0x4C, 0x15, 0x51, 0x0E, + 0xA5, 0x1A, 0xD6, 0x0D, 0x73, 0x3D, 0xD1, 0x24, 0x6D, 0x4F, 0xC2, 0x41, + 0xFF, 0x3D, 0xD9, 0x49, 0xBC, 0x24, 0x25, 0x39, 0x3E, 0x1E, 0x79, 0x2E, + 0x85, 0x2D, 0xC0, 0x32, 0x54, 0x2F, 0x7B, 0x2C, 0xF8, 0x2A, 0x7B, 0x2A, + 0x32, 0x30, 0xAF, 0x35, 0x38, 0x30, 0x05, 0x41, 0xA6, 0x2F, 0x3C, 0x45, + 0xFB, 0x33, 0x1E, 0x43, 0xD4, 0x2A, 0x5C, 0x33, 0x95, 0x20, 0xDE, 0x20, + 0x83, 0x21, 0xBD, 0x18, 0x16, 0x28, 0xFF, 0x18, 0x90, 0x30, 0x65, 0x28, + 0x38, 0x3A, 0x9B, 0x48, 0x4C, 0x43, 0x56, 0x62, 0x55, 0x4C, 0x73, 0x64, + 0x56, 0x5A, 0x51, 0x5F, 0x0F, 0x5B, 0x42, 0x60, 0xA9, 0x49, 0x8D, 0x5F, + 0x45, 0x39, 0x72, 0x53, 0x1B, 0x49, 0x3E, 0x52, 0xF2, 0x5E, 0x7C, 0x5B, + 0x1B, 0x5D, 0x0B, 0x5D, 0x34, 0x5E, 0x25, 0x5B, 0x19, 0x5C, 0xE0, 0x5A, + 0xDA, 0x59, 0x50, 0x5A, 0xC2, 0x63, 0x7E, 0x55, 0xFD, 0x59, 0xC8, 0x49, + 0x61, 0x3E, 0x5A, 0x43, 0x86, 0x3E, 0xE0, 0x4D, 0x5A, 0x4E, 0x46, 0x58, + 0x7F, 0x51, 0xD9, 0x50, 0x8F, 0x4D, 0x56, 0x35, 0x2F, 0x4B, 0xB1, 0x24, + 0x69, 0x55, 0x8B, 0x2B, 0xF3, 0x4E, 0x5C, 0x26, 0x94, 0x3A, 0xF8, 0x1F, + 0x7E, 0x35, 0x70, 0x2B, 0x95, 0x38, 0x52, 0x31, 0x1B, 0x40, 0x45, 0x33, + 0x4A, 0x41, 0x09, 0x34, 0x77, 0x31, 0x02, 0x25, 0xF5, 0x1E, 0x05, 0x1B, + 0xB9, 0x1C, 0x04, 0x28, 0x66, 0x25, 0xD2, 0x3A, 0x29, 0x2A, 0x62, 0x3A, + 0x18, 0x23, 0xD5, 0x29, 0x0C, 0x16, 0xE3, 0x19, 0xEA, 0x18, 0x76, 0x17, + 0x8F, 0x15, 0xCA, 0x12, 0x6A, 0xF3, 0x46, 0xF7, 0xE8, 0xE3, 0xCA, 0xE7, + 0x3B, 0xE9, 0xD6, 0xEB, 0x38, 0xE5, 0x1D, 0xEB, 0xA3, 0xD5, 0x49, 0xD8, + 0x41, 0xDF, 0x51, 0xD1, 0x4E, 0xFD, 0xA3, 0xE1, 0x7A, 0xF0, 0x5F, 0xDE, + 0xEB, 0xDB, 0x5E, 0xDF, 0x9C, 0xDD, 0x3D, 0xEB, 0x52, 0xDC, 0xC5, 0xEC, + 0x01, 0xE0, 0x5F, 0xF9, 0xD1, 0xE5, 0xA3, 0x05, 0xDC, 0xD1, 0x7C, 0xFA, + 0x69, 0xBF, 0x6C, 0xE8, 0x8F, 0xBD, 0xB5, 0xD2, 0x2B, 0xBE, 0xBD, 0xC3, + 0x7D, 0xB3, 0x99, 0xB3, 0x52, 0xA6, 0x8C, 0xA2, 0xBA, 0xA1, 0x3D, 0x9F, + 0xB2, 0xA5, 0x61, 0x9F, 0x97, 0xB2, 0xE6, 0xA2, 0x76, 0xB3, 0x61, 0xA8, + 0xC3, 0xB2, 0xD7, 0xAC, 0x92, 0xAF, 0x6B, 0xA6, 0x28, 0xA3, 0x7A, 0xA3, + 0x5F, 0xA3, 0x1F, 0xB2, 0x9C, 0xA4, 0x85, 0xB3, 0x8A, 0x9E, 0x29, 0xA3, + 0x69, 0xA5, 0x6B, 0x9F, 0x16, 0xBB, 0x22, 0xAE, 0xCF, 0xD4, 0x61, 0xB8, + 0x88, 0xE7, 0xE1, 0xBB, 0xE9, 0xED, 0xD3, 0xC4, 0x40, 0x08, 0x27, 0xDE, + 0x44, 0x2B, 0xBE, 0xF9, 0x9F, 0x23, 0xD7, 0x00, 0x75, 0x0F, 0xE0, 0x04, + 0xF7, 0x0F, 0xDE, 0x12, 0x64, 0x12, 0xA7, 0x25, 0x0E, 0x21, 0xB0, 0x39, + 0xF3, 0x3C, 0xEB, 0x4A, 0x4E, 0x3E, 0xB5, 0x48, 0x8F, 0x33, 0x40, 0x3D, + 0xB8, 0x3A, 0x72, 0x43, 0x17, 0x38, 0x00, 0x3E, 0x9E, 0x20, 0x63, 0x1E, + 0x2F, 0x1D, 0xA3, 0x19, 0x42, 0x25, 0xA2, 0x35, 0xDC, 0x1C, 0x3A, 0x3B, + 0x71, 0x15, 0x46, 0x26, 0x4C, 0x10, 0xA3, 0x13, 0x00, 0x04, 0x58, 0x06, + 0x64, 0x00, 0x8E, 0x04, 0x5B, 0x06, 0x25, 0x07, 0x15, 0xFF, 0x4A, 0xFD, + 0xF9, 0x01, 0x3A, 0xF8, 0x03, 0x14, 0xF2, 0xFE, 0xE6, 0x15, 0x67, 0x04, + 0x08, 0x17, 0x8A, 0x02, 0xDF, 0x20, 0x72, 0xF7, 0x9C, 0x1F, 0x13, 0xEF, + 0x93, 0x19, 0x12, 0xF9, 0xB1, 0x18, 0x2A, 0x06, 0xDD, 0x15, 0xBA, 0x05, + 0xA2, 0x12, 0xF6, 0xFE, 0x3A, 0x1B, 0x00, 0x05, 0xAE, 0x26, 0xE2, 0x18, + 0x1C, 0x20, 0xA8, 0x21, 0x6E, 0x1B, 0x37, 0x26, 0x08, 0x1A, 0xB6, 0x1F, + 0x8B, 0x07, 0x8E, 0xFA, 0x30, 0x04, 0x42, 0xEB, 0x47, 0x1F, 0x9B, 0x08, + 0x12, 0x25, 0xCF, 0x0E, 0x81, 0x06, 0x92, 0xEE, 0xAF, 0xF3, 0xA4, 0xE9, + 0x09, 0xFB, 0x17, 0x08, 0x82, 0x00, 0xAE, 0x16, 0x45, 0x03, 0xF9, 0x13, + 0xE0, 0xFA, 0x45, 0x0B, 0x9B, 0xEC, 0x39, 0x09, 0x2F, 0xEF, 0xD2, 0x13, + 0xF0, 0xEA, 0xC2, 0x0E, 0xFB, 0xE1, 0x9A, 0xFF, 0x31, 0xE7, 0xCE, 0xFC, + 0x5B, 0xF2, 0x7D, 0xFF, 0x31, 0x05, 0xA2, 0x07, 0x6B, 0x1C, 0xF8, 0x14, + 0xEF, 0x14, 0xB0, 0xFA, 0x3A, 0xF7, 0xB3, 0xC7, 0x02, 0xED, 0xB7, 0xC4, + 0x77, 0xE9, 0x8A, 0xDC, 0x91, 0xD6, 0x65, 0xDD, 0xDD, 0xC4, 0xCF, 0xD5, + 0xEA, 0xC9, 0x74, 0xD8, 0x30, 0xE6, 0xA3, 0xE0, 0x3D, 0xF0, 0x2D, 0xE2, + 0xBE, 0xDF, 0x89, 0xDA, 0x0A, 0xDD, 0x98, 0xDF, 0x2E, 0xEA, 0x3F, 0xFC, + 0xAB, 0x01, 0xC2, 0x1B, 0x84, 0x0F, 0xCA, 0x29, 0x88, 0x05, 0xAC, 0x2A, + 0x4D, 0xFA, 0x91, 0x1D, 0xF7, 0x02, 0x93, 0x11, 0x3A, 0x12, 0x5D, 0x1C, + 0x04, 0x08, 0xE2, 0x17, 0x7F, 0xF6, 0xC9, 0x04, 0x4E, 0xED, 0x00, 0x01, + 0x12, 0xF6, 0x05, 0x08, 0xBF, 0xFD, 0xDB, 0xFC, 0x3E, 0xEA, 0x73, 0xDF, + 0xE6, 0xDA, 0x53, 0xD1, 0x45, 0xDB, 0x02, 0xD1, 0x8C, 0xD6, 0x67, 0xC9, + 0xF7, 0xC6, 0x77, 0xBF, 0x3D, 0xB1, 0x70, 0xB7, 0x23, 0xA2, 0x37, 0xAF, + 0x0E, 0xAE, 0x20, 0xB2, 0x84, 0xCB, 0xEE, 0xBC, 0xCE, 0xCE, 0x4E, 0xB7, + 0xC2, 0xB9, 0xBC, 0xA8, 0xE2, 0xB8, 0x5E, 0xB5, 0x91, 0xD1, 0x80, 0xD5, + 0x8D, 0xDF, 0x98, 0xE7, 0x6F, 0xD7, 0x23, 0xE6, 0x2B, 0xD6, 0x0C, 0xEE, + 0xB2, 0xE3, 0xB1, 0x05, 0x74, 0xE8, 0xDF, 0x07, 0x9E, 0xE4, 0xF9, 0xF8, + 0x08, 0xE1, 0xF5, 0xF6, 0x41, 0xE1, 0x9B, 0x08, 0x59, 0xEE, 0x57, 0x1E, + 0x12, 0x06, 0x94, 0x24, 0x77, 0x18, 0x63, 0x21, 0x4A, 0x16, 0xC8, 0x17, + 0x36, 0x0F, 0xCF, 0x13, 0xDA, 0x07, 0x17, 0x19, 0xF2, 0xF4, 0xA7, 0x14, + 0x84, 0xEB, 0x85, 0x0A, 0xA4, 0xEE, 0xF4, 0x04, 0x35, 0xF7, 0xF7, 0x0A, + 0x5E, 0xFC, 0xD6, 0x07, 0x6B, 0xEB, 0xED, 0xEF, 0xD7, 0xDF, 0x43, 0xE5, + 0x9C, 0xE8, 0x4D, 0xEC, 0xA2, 0xF2, 0x5A, 0xF3, 0x5A, 0x00, 0x30, 0xF6, + 0x8B, 0x01, 0x0A, 0xE7, 0x0A, 0xF8, 0x89, 0xDB, 0x9F, 0xEC, 0x9F, 0xDD, + 0xAB, 0xDF, 0x22, 0xDC, 0x43, 0xD7, 0x16, 0xDB, 0x81, 0xCC, 0x1E, 0xD0, + 0x92, 0xCE, 0x81, 0xC4, 0x49, 0xD8, 0x27, 0xC1, 0x0A, 0xD1, 0x95, 0xB9, + 0xBC, 0xBB, 0x07, 0xB2, 0x54, 0xAD, 0x63, 0xAC, 0xE0, 0xAD, 0x54, 0xA8, + 0x6C, 0xB6, 0x0A, 0xAF, 0x90, 0xC0, 0xE9, 0xB5, 0x8C, 0xCB, 0xF2, 0xB9, + 0xD2, 0xC8, 0x4A, 0xBA, 0xA4, 0xBF, 0x36, 0xB8, 0x74, 0xCE, 0x4A, 0xCA, + 0xCC, 0xD5, 0x1B, 0xDC, 0xD1, 0xC0, 0xDD, 0xD5, 0xB0, 0xC4, 0xBD, 0xDB, + 0xA2, 0xEB, 0x32, 0xFA, 0x7C, 0x11, 0xFD, 0x12, 0xD8, 0x2B, 0x53, 0x27, + 0xBE, 0x33, 0xDD, 0x2E, 0x1C, 0x2D, 0x47, 0x22, 0x1C, 0x3D, 0xFE, 0x30, + 0x38, 0x43, 0xF8, 0x3D, 0xE6, 0x27, 0x7D, 0x28, 0x57, 0x2A, 0x28, 0x25, + 0x96, 0x43, 0x1A, 0x2D, 0x83, 0x55, 0x17, 0x2C, 0xBC, 0x59, 0x07, 0x2C, + 0xEB, 0x40, 0x78, 0x26, 0x5B, 0x1B, 0xFA, 0x1F, 0x47, 0x01, 0xC9, 0x13, + 0x2E, 0xFE, 0xD0, 0xFF, 0x6D, 0xFD, 0xC0, 0xEB, 0xFB, 0xF2, 0x12, 0xDA, + 0xC1, 0xFC, 0x23, 0xDA, 0x19, 0x15, 0x65, 0xEB, 0xA5, 0x10, 0x38, 0xE7, + 0xC9, 0xFE, 0x2F, 0xD8, 0xFB, 0x03, 0x07, 0xE6, 0x3D, 0x0B, 0x26, 0xFE, + 0x87, 0x0D, 0x01, 0x0E, 0x58, 0x1C, 0xC8, 0x20, 0x33, 0x33, 0x1C, 0x3F, + 0x61, 0x36, 0xFD, 0x4E, 0xB8, 0x26, 0x01, 0x4A, 0xA8, 0x28, 0x51, 0x4F, + 0x5B, 0x2B, 0xE5, 0x50, 0x81, 0x2A, 0x84, 0x4A, 0x65, 0x3B, 0x70, 0x4E, + 0xAF, 0x54, 0x6A, 0x51, 0x77, 0x5C, 0xFA, 0x3F, 0xD6, 0x52, 0x95, 0x32, + 0x41, 0x44, 0xF2, 0x37, 0x33, 0x37, 0x9E, 0x46, 0x43, 0x32, 0x1F, 0x53, + 0xFE, 0x2B, 0x8D, 0x41, 0x74, 0x2F, 0x5A, 0x29, 0x70, 0x38, 0xE5, 0x24, + 0xE9, 0x36, 0xBF, 0x25, 0xC6, 0x36, 0xAD, 0x29, 0x7F, 0x3F, 0xF7, 0x2F, + 0x36, 0x3F, 0x16, 0x21, 0x55, 0x3D, 0x88, 0x12, 0x15, 0x48, 0xAE, 0x20, + 0xBE, 0x48, 0xD1, 0x28, 0x00, 0x37, 0x77, 0x24, 0x7D, 0x2D, 0x5D, 0x2A, + 0x65, 0x33, 0x85, 0x32, 0xF4, 0x38, 0x1D, 0x3A, 0x58, 0x35, 0xDB, 0x3A, + 0xCB, 0x2D, 0x58, 0x31, 0xE8, 0x28, 0x67, 0x2C, 0xAB, 0x24, 0x25, 0x2A, + 0xDF, 0x29, 0x75, 0x2A, 0xC9, 0x28, 0x55, 0x31, 0xD9, 0x23, 0xB2, 0x3D, + 0xB6, 0x19, 0xC4, 0x38, 0x31, 0x08, 0xFA, 0x2D, 0x4E, 0x0A, 0x2F, 0x39, + 0xC8, 0x0B, 0x92, 0x32, 0x20, 0x05, 0xBC, 0x1A, 0x6F, 0x10, 0x20, 0x1A, + 0xDC, 0x23, 0xB7, 0x21, 0x97, 0x1C, 0x3C, 0x17, 0x13, 0xFD, 0x45, 0x05, + 0xD1, 0xF8, 0x44, 0x08, 0xBF, 0x0C, 0xAD, 0x14, 0x84, 0x1C, 0xDA, 0x24, + 0x1D, 0x1F, 0x7B, 0x2F, 0x38, 0x10, 0xB3, 0x20, 0x4D, 0x0A, 0xF5, 0x0E, + 0x6A, 0x18, 0x6B, 0x0A, 0x20, 0x26, 0x80, 0x0A, 0x74, 0x23, 0x17, 0x0C, + 0xF3, 0x1B, 0x63, 0x08, 0xC2, 0x0B, 0x34, 0xF0, 0xE0, 0x09, 0x60, 0xEB, + 0x6A, 0x12, 0x20, 0xF4, 0x7D, 0xF5, 0x84, 0xD8, 0x02, 0xED, 0xD5, 0xD6, + 0x9D, 0x12, 0xA0, 0xF8, 0xCB, 0x1D, 0x91, 0xF1, 0x44, 0x1A, 0x74, 0xEF, + 0xDE, 0x0F, 0xD7, 0xFA, 0xE8, 0xF7, 0xAE, 0xEB, 0xEA, 0xFF, 0x51, 0xED, + 0x68, 0x0A, 0x6B, 0xF2, 0x0F, 0xF5, 0x3D, 0xD6, 0x07, 0xD8, 0x88, 0xB1, + 0xDB, 0xD7, 0x02, 0xB2, 0xBA, 0xF8, 0xC0, 0xD8, 0x1B, 0x07, 0xEF, 0xED, + 0x32, 0xE8, 0x93, 0xDF, 0xEF, 0xDF, 0x3F, 0xEA, 0x81, 0xFC, 0x24, 0x09, + 0x68, 0x0E, 0xEB, 0x0D, 0x90, 0x1B, 0xA0, 0x08, 0xB7, 0x28, 0x0E, 0x0D, + 0xB0, 0x32, 0x76, 0x1B, 0xD2, 0x38, 0x1E, 0x26, 0x59, 0x3D, 0xA0, 0x2A, + 0x19, 0x37, 0x00, 0x2B, 0x91, 0x28, 0xA6, 0x22, 0xBE, 0x1C, 0xE5, 0x19, + 0xFF, 0x14, 0xE9, 0x19, 0xFD, 0x10, 0x38, 0x13, 0x0A, 0x12, 0x6F, 0x04, + 0xBE, 0x1B, 0x23, 0x0C, 0x0E, 0x13, 0xD5, 0x14, 0x3A, 0x00, 0xB1, 0x11, + 0x65, 0x02, 0x9C, 0x1B, 0x1B, 0xFD, 0xDE, 0x19, 0x2D, 0xE8, 0xB2, 0x06, + 0xA3, 0xEB, 0x5D, 0x0C, 0xEE, 0xFF, 0x06, 0x21, 0xDD, 0xF8, 0x98, 0x12, + 0x63, 0xEF, 0xA9, 0x02, 0x45, 0xF5, 0x66, 0x09, 0x84, 0xF0, 0x90, 0x03, + 0x67, 0xF0, 0x15, 0xF6, 0x7D, 0x05, 0xB6, 0xFA, 0x71, 0x0F, 0x5C, 0x00, + 0x07, 0x04, 0x2B, 0x04, 0x03, 0xF8, 0x0B, 0x11, 0x1D, 0xEA, 0x50, 0x0D, + 0x7E, 0xDE, 0xF5, 0xFB, 0x35, 0xE4, 0x15, 0xFA, 0xB7, 0xF2, 0xC8, 0x02, + 0x44, 0xFE, 0x70, 0x0A, 0x4F, 0xFA, 0x84, 0x0A, 0xC4, 0xEA, 0x29, 0xFD, + 0xEA, 0xEB, 0x9D, 0xF8, 0x3F, 0xFA, 0x02, 0x01, 0xA7, 0xEA, 0xE1, 0xEE, + 0xBF, 0xBD, 0xE6, 0xC7, 0x8B, 0xB1, 0x45, 0xCD, 0x71, 0xC1, 0x57, 0xE6, + 0x0B, 0xC5, 0x5A, 0xE2, 0x3E, 0xCA, 0x7C, 0xE7, 0x6A, 0xC8, 0x47, 0xF2, + 0x30, 0xB3, 0xA6, 0xE1, 0x41, 0xBC, 0x40, 0xE5, 0x88, 0xCF, 0xD0, 0xF2, + 0xE2, 0xC2, 0x9A, 0xDA, 0x6F, 0xC7, 0xB8, 0xD2, 0x54, 0xDF, 0x09, 0xE7, + 0xA0, 0xDE, 0x51, 0xEE, 0x62, 0xC8, 0x2F, 0xEC, 0x35, 0xBB, 0x90, 0xF7, + 0x48, 0xBA, 0x72, 0xFB, 0x8E, 0xC5, 0x4D, 0xF3, 0xC4, 0xD8, 0x32, 0xF2, + 0x5C, 0xDB, 0xA1, 0xF2, 0x26, 0xDD, 0x65, 0x00, 0x36, 0xEE, 0x31, 0x11, + 0xAA, 0xFD, 0xD0, 0x09, 0x98, 0xFF, 0x82, 0xFA, 0x7A, 0xF6, 0xEC, 0xF7, + 0xB5, 0xFA, 0xE1, 0x00, 0xC6, 0xFC, 0x89, 0xFB, 0xCD, 0xF1, 0xC5, 0xEA, + 0x22, 0xF4, 0xDF, 0xE6, 0x47, 0xF2, 0x43, 0xDA, 0xBA, 0xE2, 0xA0, 0xCA, + 0x51, 0xE8, 0x9E, 0xD6, 0x1E, 0xEC, 0x2D, 0xDB, 0xAD, 0xD6, 0x60, 0xCB, + 0x67, 0xCE, 0xAA, 0xD0, 0x89, 0xC9, 0xB1, 0xCC, 0x57, 0xCA, 0x8F, 0xBD, + 0xA6, 0xCB, 0xDF, 0xB4, 0xE8, 0xB2, 0xBC, 0xA2, 0x2E, 0xA5, 0x21, 0xA0, + 0xA3, 0xB3, 0xFF, 0xAF, 0xA9, 0xBA, 0xB5, 0xB2, 0x7E, 0xC2, 0x04, 0xB6, + 0xA1, 0xBB, 0x79, 0xAF, 0xCB, 0xA7, 0x77, 0xA3, 0x48, 0xB9, 0xF8, 0xBF, + 0xAB, 0xC0, 0xAC, 0xCC, 0x50, 0xA4, 0x8E, 0xAF, 0xD9, 0x9C, 0xDC, 0xAC, + 0x23, 0xAF, 0x51, 0xCC, 0xCE, 0xB4, 0xC4, 0xD4, 0x5E, 0xB6, 0x60, 0xCE, + 0x77, 0xC4, 0xE9, 0xE1, 0xA4, 0xC9, 0x27, 0xEC, 0xB3, 0xD5, 0x81, 0xEB, + 0xBC, 0xF2, 0x71, 0xFD, 0x98, 0xF7, 0xFF, 0xFE, 0x5A, 0xE3, 0x3B, 0xE4, + 0xAA, 0xE3, 0x57, 0xE3, 0xB8, 0xFA, 0xCB, 0x00, 0x88, 0xFA, 0xE6, 0x03, + 0xC6, 0xE8, 0xB8, 0xEF, 0x48, 0xE8, 0x0B, 0xE8, 0x5E, 0xEF, 0x91, 0xE7, + 0xF0, 0xEC, 0xCE, 0xE7, 0xCD, 0xDE, 0x9F, 0xE8, 0x12, 0xCA, 0x42, 0xDE, + 0x78, 0xCE, 0xD3, 0xDC, 0x28, 0xEF, 0x3B, 0xEF, 0x39, 0xED, 0x5F, 0xDF, + 0xF6, 0xD7, 0x0A, 0xC7, 0x74, 0xDD, 0x8F, 0xD6, 0xC8, 0xD9, 0x95, 0xD9, + 0xEF, 0xD8, 0x12, 0xE1, 0xA9, 0xE3, 0x1A, 0xFE, 0x13, 0xD7, 0xED, 0xF8, + 0x4C, 0xD6, 0x5C, 0xEE, 0x35, 0xEB, 0x0F, 0xF5, 0xE1, 0xF9, 0x2B, 0xF6, + 0xB2, 0xF0, 0x52, 0xEE, 0x9F, 0xDD, 0xB0, 0xE5, 0xB0, 0xDD, 0x95, 0xE6, + 0x60, 0xE3, 0xF2, 0xEA, 0x82, 0xE6, 0x89, 0xEE, 0xB4, 0xE0, 0x70, 0xE8, + 0x09, 0xD0, 0x7B, 0xDA, 0xEA, 0xCE, 0xF6, 0xDD, 0x41, 0xCB, 0x24, 0xDE, + 0x7F, 0xC5, 0xC8, 0xD7, 0x0B, 0xCC, 0x1C, 0xD7, 0xB4, 0xB7, 0x03, 0xC3, + 0x29, 0xC0, 0xDE, 0xC7, 0xB1, 0xF4, 0xD5, 0xE9, 0xA0, 0xF0, 0xDB, 0xDA, + 0xB9, 0xD5, 0xFC, 0xBD, 0x10, 0xF5, 0x4D, 0xDC, 0x6F, 0x0E, 0x35, 0xFD, + 0x65, 0x02, 0xEB, 0xF5, 0x63, 0x03, 0xF5, 0xF3, 0x74, 0x0A, 0x70, 0x00, + 0xFB, 0x09, 0x87, 0xFF, 0xC9, 0x17, 0x9F, 0xFD, 0xCA, 0x30, 0x82, 0x08, + 0x93, 0x27, 0xC2, 0xFE, 0x68, 0x12, 0xF4, 0x01, 0x5B, 0x13, 0x63, 0x27, + 0x59, 0x05, 0x78, 0x1D, 0xB3, 0xF8, 0x31, 0xF7, 0xD0, 0xF1, 0x85, 0xE9, + 0x72, 0xD8, 0xE0, 0xDC, 0x05, 0xCB, 0x60, 0xCE, 0xAD, 0xDC, 0x1C, 0xCF, + 0x83, 0xF9, 0x81, 0xDA, 0x00, 0x0D, 0xAF, 0xE9, 0x11, 0x1B, 0xF6, 0x03, + 0xBD, 0x13, 0xB6, 0x08, 0x48, 0x14, 0x4A, 0x06, 0x63, 0x28, 0x48, 0x11, + 0x0D, 0x2B, 0x43, 0x11, 0xB3, 0x32, 0x9E, 0x1C, 0x9E, 0x3C, 0x5B, 0x27, + 0xE8, 0x38, 0x8B, 0x1C, 0xAE, 0x32, 0xA1, 0x16, 0x14, 0x35, 0x94, 0x23, + 0x0A, 0x3C, 0x22, 0x2F, 0x42, 0x42, 0x3C, 0x2C, 0xC0, 0x3F, 0xC3, 0x21, + 0xF4, 0x47, 0xF7, 0x29, 0xFC, 0x48, 0xAB, 0x2D, 0x0E, 0x2B, 0xFF, 0x15, + 0xDE, 0x15, 0x6C, 0x0D, 0x61, 0x12, 0x60, 0x11, 0xB6, 0x20, 0x56, 0x18, + 0xF0, 0x31, 0x1E, 0x28, 0x62, 0x31, 0x91, 0x2F, 0xD6, 0x26, 0xAC, 0x20, + 0x09, 0x21, 0x50, 0x0A, 0x6A, 0x28, 0x3F, 0x09, 0xE2, 0x3B, 0xE1, 0x16, + 0xFC, 0x31, 0x90, 0x0F, 0x94, 0x0B, 0xBD, 0xF9, 0x11, 0x14, 0xD3, 0x03, + 0xD6, 0x36, 0x68, 0x1E, 0xFD, 0x24, 0xF4, 0x11, 0x00, 0x15, 0xE5, 0x03, + 0x84, 0x1F, 0x72, 0x0B, 0x3F, 0x18, 0x78, 0x07, 0x7C, 0x27, 0x2B, 0x0E, + 0x56, 0x41, 0x6F, 0x26, 0xD4, 0x2B, 0x84, 0x1D, 0x0F, 0x17, 0x97, 0x07, + 0xA5, 0x35, 0x99, 0x22, 0x82, 0x50, 0x7F, 0x39, 0x1F, 0x45, 0x30, 0x23, + 0x91, 0x2E, 0xCC, 0x1A, 0x3C, 0x23, 0x93, 0x25, 0xE9, 0x23, 0x93, 0x20, + 0xFD, 0x28, 0x39, 0x18, 0x31, 0x28, 0x11, 0x0D, 0x4D, 0x2E, 0xFC, 0x11, + 0x21, 0x39, 0x20, 0x2D, 0x45, 0x36, 0xBF, 0x33, 0xE5, 0x25, 0xC0, 0x25, + 0x81, 0x0A, 0x55, 0x18, 0xE9, 0xF7, 0xD0, 0x1A, 0x1D, 0xF7, 0x93, 0x2B, + 0xE4, 0x03, 0x0B, 0x31, 0xE6, 0x0C, 0x4F, 0x24, 0x77, 0x10, 0xE4, 0x1D, + 0x02, 0x10, 0x04, 0x15, 0xE3, 0x07, 0xFF, 0xFF, 0xD7, 0x06, 0x23, 0xFA, + 0x4C, 0x16, 0x38, 0x01, 0xBB, 0x1F, 0x7D, 0x05, 0x9D, 0x1E, 0x30, 0x0A, + 0x10, 0x1D, 0x15, 0x0A, 0xFC, 0x07, 0x5C, 0xF5, 0x73, 0xF9, 0x78, 0xEC, + 0x68, 0x06, 0xA1, 0x01, 0x0F, 0x08, 0x61, 0x03, 0x23, 0x0A, 0x4A, 0xFE, + 0x52, 0x16, 0x46, 0xFD, 0x5E, 0x07, 0x25, 0xE0, 0x9A, 0xF7, 0x2F, 0xD0, + 0x0F, 0x11, 0x9F, 0xFD, 0x6B, 0x10, 0xF6, 0x09, 0x90, 0xEA, 0x0A, 0xE3, + 0x5A, 0x0B, 0x81, 0xFD, 0xC1, 0x33, 0x7B, 0x1E, 0xCE, 0x18, 0x56, 0x0D, + 0x39, 0x18, 0x58, 0x10, 0xE3, 0x2D, 0x86, 0x15, 0xC9, 0x25, 0x26, 0x0B, + 0x53, 0x2A, 0x6F, 0x17, 0x69, 0x3D, 0x86, 0x27, 0x7B, 0x2D, 0xB6, 0x1D, + 0xF2, 0x23, 0x0F, 0x16, 0x7D, 0x49, 0x26, 0x37, 0xFB, 0x5F, 0xF8, 0x5D, + 0x9D, 0x4E, 0xCA, 0x5B, 0x07, 0x46, 0x16, 0x51, 0xBE, 0x34, 0x68, 0x3C, + 0xA2, 0x18, 0x29, 0x1C, 0xD3, 0x14, 0x75, 0x18, 0x44, 0x07, 0xDA, 0x15, + 0x81, 0x01, 0x6A, 0x17, 0x58, 0x0E, 0x4C, 0x26, 0x89, 0x11, 0x80, 0x2D, + 0x60, 0x0B, 0x73, 0x28, 0x67, 0x01, 0x4C, 0x1B, 0x09, 0x03, 0x89, 0x17, + 0x3D, 0x0A, 0x92, 0x11, 0xAB, 0x0E, 0xEB, 0x05, 0xB6, 0x09, 0x2E, 0xFB, + 0x95, 0xF9, 0x59, 0xED, 0x52, 0xFD, 0xF8, 0xEB, 0x52, 0x14, 0x97, 0xF7, + 0x5E, 0x18, 0x91, 0xF7, 0x5E, 0x05, 0x95, 0xF4, 0xDC, 0xEF, 0x0B, 0xF1, + 0x86, 0xF0, 0x3B, 0xEE, 0x76, 0x01, 0xEC, 0xF5, 0x02, 0x00, 0xAF, 0xF5, + 0x62, 0xF1, 0x20, 0xF3, 0xA0, 0xF8, 0xEF, 0x0C, 0xCB, 0xF9, 0xCD, 0x16, + 0x7D, 0xFC, 0xDE, 0x0B, 0x69, 0x12, 0xE8, 0x0D, 0x45, 0x05, 0xF6, 0xF8, + 0xBF, 0xF2, 0x1D, 0xFB, 0x3E, 0x06, 0x5C, 0x26, 0x3A, 0x06, 0xD4, 0x23, + 0xB1, 0xE7, 0x01, 0x05, 0xA7, 0xF1, 0x74, 0x19, 0x24, 0x0B, 0xCC, 0x38, + 0xD3, 0xF4, 0x0F, 0x2A, 0x41, 0xE3, 0xD9, 0x19, 0xB2, 0xEC, 0x2A, 0x1B, + 0x3D, 0xE0, 0x15, 0x12, 0xCC, 0xE4, 0x32, 0x14, 0x12, 0x07, 0x94, 0x29, + 0x51, 0xFC, 0xCA, 0x13, 0xD5, 0xDE, 0x69, 0xEA, 0xD3, 0xEC, 0x0C, 0x02, + 0xA0, 0xF1, 0x6E, 0x1A, 0xB8, 0xE6, 0x93, 0x06, 0xCC, 0xE9, 0xE8, 0x00, + 0x7A, 0xD7, 0xEA, 0xFC, 0x07, 0xC4, 0x01, 0xED, 0x23, 0xCC, 0xA1, 0xEE, + 0xA2, 0xDB, 0x8E, 0xF8, 0xA8, 0xE4, 0x2C, 0xFB, 0xF8, 0xE7, 0x88, 0x05, + 0x42, 0xEA, 0x6A, 0x11, 0x2F, 0xE2, 0x9A, 0x08, 0xB2, 0xCF, 0x45, 0xFA, + 0xF5, 0xC9, 0x8F, 0xF9, 0xBE, 0xD9, 0xF1, 0x00, 0x65, 0xDC, 0xCE, 0x02, + 0xF5, 0xCD, 0x2F, 0x00, 0x06, 0xC1, 0x01, 0xF5, 0x02, 0xBB, 0x80, 0xE5, + 0x2D, 0xCD, 0xA5, 0xE9, 0xDB, 0xD3, 0x30, 0xE3, 0x3F, 0xCB, 0xFC, 0xD4, + 0x87, 0xCE, 0x13, 0xD5, 0x8A, 0xCB, 0xE8, 0xC7, 0x78, 0xC7, 0xF5, 0xBD, + 0x2F, 0xC3, 0xFB, 0xC0, 0xD7, 0xAD, 0x95, 0xBD, 0x58, 0xB2, 0xC0, 0xCA, + 0x22, 0xD7, 0x88, 0xD7, 0x70, 0xE9, 0x51, 0xCA, 0x6C, 0xE8, 0xD1, 0xC8, + 0x04, 0xCA, 0x6A, 0xBB, 0xAE, 0xC4, 0x6B, 0xBA, 0xCF, 0xED, 0x88, 0xE8, + 0x97, 0xDD, 0x3A, 0xEB, 0x2E, 0xC1, 0x60, 0xDD, 0xEA, 0xD3, 0x9D, 0xF6, + 0x49, 0xE3, 0x60, 0x0E, 0xB4, 0xE3, 0xBB, 0x04, 0x80, 0xE2, 0x83, 0xE9, + 0xE6, 0xED, 0xE9, 0xF4, 0x82, 0xF0, 0xC8, 0x06, 0xC4, 0xF7, 0x38, 0x0A, + 0x41, 0x10, 0x7E, 0x18, 0x65, 0x09, 0x84, 0x0E, 0xC5, 0xF0, 0x59, 0xFD, + 0x5D, 0x04, 0xDC, 0x1F, 0x6D, 0x11, 0xCA, 0x2B, 0x18, 0xFC, 0x65, 0x01, + 0x97, 0xF8, 0x57, 0xF2, 0xB8, 0xE7, 0x14, 0xE5, 0x12, 0xD8, 0xA3, 0xDB, + 0x03, 0xE6, 0x55, 0xEA, 0xFB, 0xDF, 0xBB, 0xD8, 0x03, 0xD7, 0x77, 0xC7, + 0xCE, 0xE6, 0x3E, 0xE1, 0xA3, 0xE3, 0x26, 0xE4, 0x7E, 0xD4, 0x43, 0xC0, + 0x94, 0xD3, 0x51, 0xAE, 0x70, 0xE1, 0xFE, 0xC2, 0x30, 0xEC, 0xD7, 0xDF, + 0xEB, 0xEA, 0x68, 0xE7, 0x2E, 0xF8, 0x03, 0xE8, 0x8D, 0xFC, 0xAA, 0xE0, + 0x52, 0xFA, 0xFB, 0xE7, 0x63, 0x00, 0x8D, 0xF7, 0x68, 0xE4, 0x01, 0xE3, + 0x63, 0xC2, 0x79, 0xD1, 0x98, 0xC7, 0xD1, 0xD1, 0x99, 0xDC, 0xE0, 0xD6, + 0xCD, 0xE7, 0x26, 0xE4, 0x35, 0xCE, 0x0A, 0xD8, 0x2B, 0xB6, 0x0D, 0xCE, + 0xBD, 0xC8, 0x50, 0xE1, 0xC2, 0xD9, 0xE8, 0xE8, 0x8B, 0xD9, 0x01, 0xEC, + 0x19, 0xD2, 0x5A, 0xE9, 0xD6, 0xCE, 0x6F, 0xE9, 0x55, 0xE3, 0x60, 0x0A, + 0xDF, 0x00, 0x8D, 0x20, 0xB8, 0xF0, 0xA5, 0x04, 0x47, 0xD1, 0x32, 0xEB, + 0x0B, 0xE4, 0x3F, 0xF7, 0x48, 0x00, 0x82, 0xFF, 0x83, 0x07, 0x94, 0xF7, + 0xB1, 0x09, 0xC3, 0xF1, 0x15, 0x16, 0x05, 0x0A, 0x43, 0x1C, 0xC2, 0x1A, + 0x56, 0x1E, 0xF7, 0x13, 0x0C, 0x27, 0x49, 0x18, 0xD1, 0x0F, 0x18, 0x03, + 0x3A, 0x00, 0x61, 0xFB, 0xCD, 0x14, 0x85, 0x1F, 0x52, 0x1C, 0x2F, 0x2B, + 0x82, 0x09, 0xBD, 0x16, 0xD9, 0xFC, 0xC3, 0x0A, 0x7E, 0xFE, 0x0B, 0x05, + 0x0C, 0xF6, 0xF8, 0xF0, 0x1A, 0xF3, 0x9F, 0xD7, 0x15, 0x03, 0x6F, 0xD1, + 0x35, 0x0E, 0x12, 0xE6, 0x63, 0xFE, 0xEB, 0xF5, 0xD1, 0xED, 0xAB, 0xF8, + 0xD5, 0xF5, 0x0D, 0xF9, 0xB5, 0x01, 0xD0, 0xEF, 0x6C, 0xFC, 0xEC, 0xF2, + 0xDC, 0xF9, 0x3A, 0x0C, 0x86, 0xF7, 0xDF, 0x0D, 0x5F, 0xF7, 0x72, 0x0A, + 0xB6, 0xF8, 0x91, 0x0E, 0x91, 0xFB, 0xA8, 0x06, 0xF9, 0x1A, 0x28, 0x17, + 0x1B, 0x28, 0x6F, 0x19, 0x3E, 0x1F, 0xE8, 0xFB, 0x65, 0x23, 0x51, 0xF6, + 0xE7, 0x1E, 0x65, 0xFE, 0xC0, 0x0D, 0x72, 0xF9, 0x58, 0x03, 0x85, 0xF4, + 0x8B, 0x12, 0x7F, 0x04, 0x1B, 0x29, 0xC5, 0x0E, 0x9E, 0x2B, 0x35, 0x04, + 0xE7, 0x29, 0xB5, 0xFF, 0xC0, 0x25, 0xAB, 0xF0, 0x90, 0x18, 0xB9, 0xD7, + 0x5C, 0x25, 0x6F, 0xE7, 0x4D, 0x3A, 0xE3, 0x02, 0x5B, 0x23, 0x64, 0xEF, + 0xDA, 0x0D, 0x3D, 0xE0, 0x62, 0x2C, 0xF0, 0xFF, 0x73, 0x3F, 0x6A, 0x09, + 0xFE, 0x2D, 0x01, 0xEC, 0x46, 0x21, 0x67, 0xE0, 0xCD, 0x19, 0x1A, 0xEA, + 0x72, 0x27, 0x36, 0xFC, 0x9D, 0x45, 0x3E, 0x11, 0x60, 0x4B, 0x71, 0x1D, + 0xC4, 0x34, 0x33, 0x15, 0xE8, 0x3B, 0x10, 0x1D, 0xD1, 0x58, 0x8D, 0x3F, + 0x68, 0x53, 0x3D, 0x45, 0x92, 0x48, 0xAA, 0x37, 0xF1, 0x42, 0xC6, 0x30, + 0x21, 0x2E, 0x30, 0x26, 0x63, 0x29, 0x88, 0x1E, 0xD9, 0x2E, 0xFC, 0x1C, + 0xA6, 0x13, 0x4A, 0x10, 0x40, 0x0C, 0x3B, 0x16, 0xF4, 0x28, 0x1D, 0x30, + 0x7A, 0x2D, 0x2E, 0x35, 0xB7, 0x26, 0xCD, 0x30, 0xB2, 0x1C, 0x02, 0x28, + 0x77, 0x0E, 0x4C, 0x25, 0x10, 0x1A, 0x07, 0x30, 0x6F, 0x25, 0xE9, 0x22, + 0xAC, 0x1D, 0xE4, 0x0F, 0xDE, 0x14, 0x40, 0x13, 0x7A, 0x1B, 0x28, 0x1E, + 0x6A, 0x26, 0xF8, 0x1C, 0x3A, 0x21, 0x11, 0x03, 0xD8, 0x1A, 0x0F, 0xEC, + 0x38, 0x19, 0x6B, 0xEF, 0x0B, 0x1D, 0x77, 0x05, 0x7E, 0x1F, 0x8F, 0x11, + 0x50, 0x04, 0xEA, 0xF8, 0x5B, 0xF4, 0x44, 0xEB, 0xF9, 0x12, 0x16, 0x09, + 0x76, 0x19, 0x97, 0x0D, 0xF0, 0x10, 0x5E, 0x02, 0x03, 0x10, 0xC2, 0x04, + 0xD5, 0xFB, 0x7B, 0x00, 0x33, 0x06, 0x25, 0x1B, 0x37, 0x1F, 0xEC, 0x32, + 0x6F, 0x06, 0xAE, 0x07, 0xE0, 0xF6, 0xAA, 0xEA, 0x85, 0x0E, 0xBD, 0x0A, + 0x6C, 0x1E, 0x42, 0x24, 0xD3, 0x1E, 0xB7, 0x17, 0x33, 0x19, 0xD8, 0x06, + 0x8E, 0x0F, 0x92, 0x03, 0xFC, 0x11, 0x65, 0x0B, 0x13, 0x2A, 0x4C, 0x20, + 0x41, 0x29, 0x2A, 0x1A, 0xC3, 0x1C, 0x6C, 0x04, 0x3B, 0x38, 0x85, 0x20, + 0xB2, 0x44, 0x72, 0x3F, 0x1A, 0x30, 0x97, 0x38, 0x6E, 0x23, 0xA8, 0x2F, + 0x89, 0x11, 0x03, 0x28, 0xBE, 0x0A, 0x7F, 0x23, 0x5E, 0x25, 0xB2, 0x2B, + 0xC9, 0x1C, 0x02, 0x1E, 0x8E, 0xF2, 0x71, 0x06, 0xE4, 0xF9, 0xF1, 0x19, + 0x19, 0x13, 0xCD, 0x2F, 0x9B, 0x05, 0x55, 0x1B, 0xA7, 0xF1, 0x3F, 0x00, + 0xF8, 0xF1, 0xB5, 0x05, 0x59, 0xF9, 0x77, 0x1A, 0x59, 0x05, 0x3C, 0x23, + 0x70, 0x11, 0xBE, 0x1D, 0x15, 0x18, 0x90, 0x1B, 0x0C, 0x19, 0xD7, 0x14, + 0x15, 0x1D, 0xBC, 0x04, 0x74, 0x28, 0x4F, 0xF9, 0xBF, 0x1A, 0x59, 0xE4, + 0x04, 0xFE, 0xA6, 0xDC, 0x50, 0xF6, 0xE4, 0xF2, 0xBD, 0x04, 0x6C, 0x07, + 0x56, 0x00, 0x55, 0xF9, 0x03, 0xEA, 0x16, 0xED, 0x7E, 0xF3, 0x22, 0x08, + 0xF0, 0xFC, 0xB6, 0x06, 0x4E, 0xF8, 0x57, 0xE1, 0x4A, 0x05, 0xCB, 0xD6, + 0xE9, 0x07, 0x59, 0xD6, 0x9B, 0x03, 0x6A, 0xDE, 0x5B, 0x21, 0x45, 0x10, + 0x62, 0x26, 0xF2, 0x1E, 0x6B, 0x04, 0x36, 0xF5, 0x3B, 0x04, 0x5B, 0xF4, + 0xAB, 0x0B, 0xD4, 0x15, 0x38, 0xF1, 0x93, 0x14, 0xD6, 0xE1, 0x00, 0x05, + 0xF7, 0xE9, 0x6E, 0x0A, 0xC0, 0xF8, 0x63, 0x21, 0x34, 0x06, 0x14, 0x2F, + 0x63, 0xFE, 0x01, 0x19, 0x6C, 0xEC, 0x74, 0xFB, 0xAA, 0xF7, 0x5A, 0x0B, + 0xAD, 0x06, 0x65, 0x2B, 0x46, 0xF6, 0x0E, 0x27, 0x54, 0xF0, 0xDE, 0x19, + 0x2C, 0xED, 0x0E, 0x0C, 0x93, 0xDD, 0x7A, 0xFA, 0x2B, 0xDA, 0x30, 0xF6, + 0xAB, 0xDA, 0x0E, 0xFC, 0xCE, 0xD9, 0x28, 0x01, 0xFF, 0xE7, 0xAE, 0x0B, + 0x20, 0x05, 0xA4, 0x25, 0x86, 0x0C, 0xD2, 0x34, 0xC0, 0xFE, 0x90, 0x23, + 0xFA, 0xFF, 0x19, 0x15, 0xB5, 0x16, 0xF3, 0x26, 0x00, 0x25, 0x8F, 0x31, + 0x53, 0x23, 0x49, 0x25, 0x37, 0x21, 0xAF, 0x24, 0xF1, 0x12, 0xBA, 0x24, + 0x5E, 0xFF, 0xF9, 0x18, 0xF9, 0x01, 0x7B, 0x16, 0xBC, 0x0C, 0x42, 0x10, + 0x61, 0x07, 0xF7, 0xFE, 0xF6, 0xEB, 0x22, 0xED, 0xE4, 0xE8, 0x9E, 0xF5, + 0xE0, 0xED, 0x5F, 0xF6, 0xAF, 0xD7, 0xB7, 0xE3, 0x98, 0xC9, 0x27, 0xE2, + 0xD3, 0xDA, 0x98, 0xE7, 0xBF, 0xEE, 0x69, 0xE0, 0x3B, 0xF2, 0xA5, 0xDD, + 0x57, 0xF5, 0x06, 0xE9, 0x93, 0xD2, 0xAB, 0xD0, 0x1E, 0xBA, 0xB0, 0xC5, + 0x3B, 0xD3, 0xFB, 0xE7, 0x5A, 0xD8, 0x5D, 0xE5, 0x1D, 0xCF, 0x84, 0xD8, + 0xE8, 0xCA, 0xCA, 0xE7, 0xCC, 0xCC, 0xE6, 0xF4, 0x44, 0xE0, 0x56, 0xFA, + 0x7E, 0xE6, 0xCD, 0xF4, 0xCA, 0xDA, 0x51, 0xF0, 0x35, 0xD5, 0x6E, 0xEC, + 0x07, 0xDB, 0xDE, 0xEA, 0x42, 0xEB, 0xF5, 0xFD, 0xDE, 0xED, 0x0F, 0xFF, + 0x5E, 0xE3, 0x8A, 0xEA, 0x72, 0xE7, 0xEB, 0xF5, 0xC4, 0xFA, 0xDC, 0x19, + 0x2A, 0xFC, 0xFA, 0x15, 0x56, 0xDF, 0xA9, 0xE9, 0x9F, 0xCB, 0x74, 0xD5, + 0x84, 0xD0, 0x17, 0xE1, 0x76, 0xD6, 0xE9, 0xE5, 0xF3, 0xD5, 0x23, 0xE3, + 0x5D, 0xDA, 0x98, 0xE6, 0x39, 0xEB, 0x86, 0xF7, 0xE2, 0xF8, 0xB8, 0x03, + 0x54, 0xF6, 0x36, 0xFC, 0x7C, 0xE1, 0x93, 0xE7, 0x17, 0xCE, 0x8A, 0xD7, + 0x4E, 0xDA, 0xD8, 0xEA, 0x88, 0xE1, 0xA3, 0xFE, 0xDC, 0xE2, 0xB0, 0x03, + 0xF8, 0xEF, 0xBE, 0xFE, 0xE0, 0xF5, 0x1C, 0xF6, 0xAA, 0xFE, 0x74, 0x0B, + 0xC2, 0xF1, 0x27, 0x11, 0xEF, 0xD2, 0x0A, 0xF4, 0x7D, 0xD1, 0xD4, 0xEF, + 0x74, 0xE2, 0xE5, 0x00, 0x5D, 0xD6, 0x72, 0xF5, 0x44, 0xBE, 0xB8, 0xDB, + 0x63, 0xBB, 0x2E, 0xCE, 0x13, 0xC8, 0xD8, 0xC7, 0xAE, 0xEA, 0x17, 0xD7, + 0x9F, 0xFE, 0xB6, 0xE7, 0xB6, 0xDE, 0xDB, 0xD6, 0xB0, 0xC6, 0x23, 0xCE, + 0x40, 0xE0, 0xA9, 0xE8, 0x95, 0xF9, 0x52, 0xFC, 0x6D, 0xF4, 0x3E, 0xF6, + 0x16, 0xE6, 0x24, 0xE4, 0x26, 0xDE, 0x6F, 0xD7, 0x78, 0xE8, 0x21, 0xE9, + 0x86, 0xF9, 0x86, 0xFF, 0x6B, 0xED, 0x95, 0xEA, 0x0E, 0xF0, 0xBC, 0xE5, + 0x03, 0x0F, 0xCD, 0x04, 0x81, 0x16, 0xA7, 0x07, 0x12, 0x14, 0xF3, 0xF9, + 0x12, 0x07, 0xF1, 0xED, 0xB1, 0x09, 0xDA, 0xFC, 0x74, 0x17, 0xAC, 0x12, + 0x54, 0x11, 0x8F, 0x15, 0x99, 0x02, 0x4A, 0x11, 0x3D, 0xF4, 0xD8, 0x08, + 0xB3, 0x00, 0x67, 0x11, 0x3A, 0x04, 0xA1, 0x0B, 0xF4, 0xF6, 0x16, 0xF2, + 0xE0, 0xF8, 0x45, 0xE8, 0xF7, 0xFC, 0x9B, 0xF7, 0xAB, 0xEE, 0x1D, 0xF9, + 0x38, 0xEE, 0xFA, 0xEF, 0x58, 0x0A, 0xDB, 0xF0, 0xB9, 0x0E, 0x49, 0xE3, + 0xF9, 0xFE, 0x60, 0xD5, 0xF9, 0xFE, 0x15, 0xE2, 0xC6, 0xF2, 0x40, 0xE7, + 0xDD, 0xE2, 0x01, 0xE1, 0x8D, 0xEB, 0x02, 0xEE, 0x3B, 0xE9, 0xD8, 0xEB, + 0x8F, 0xE4, 0x88, 0xD7, 0xB7, 0xFC, 0x12, 0xD5, 0xF0, 0x07, 0x14, 0xD4, + 0xC9, 0xF1, 0xB5, 0xC6, 0xFB, 0xE6, 0x93, 0xCA, 0xFE, 0xDD, 0x32, 0xC9, + 0x8A, 0xCD, 0x3F, 0xB2, 0xA6, 0xD6, 0xF7, 0xB3, 0x1F, 0xED, 0x7B, 0xCF, + 0xF3, 0xE6, 0xFE, 0xD8, 0xA3, 0xE3, 0x4D, 0xE3, 0xD3, 0xEE, 0x4A, 0xF4, + 0x1F, 0xD7, 0xAC, 0xE1, 0x9A, 0xCD, 0x1C, 0xDA, 0x49, 0xE4, 0xFC, 0xEF, + 0xC6, 0xEA, 0x8F, 0xE8, 0x1E, 0xE5, 0xBF, 0xCE, 0xB4, 0xE9, 0x6A, 0xCA, + 0xF2, 0xF3, 0x90, 0xCE, 0xFC, 0xFE, 0xD4, 0xD9, 0xB9, 0x03, 0x21, 0xE4, + 0x42, 0xF7, 0x60, 0xE0, 0x4E, 0xFA, 0xFC, 0xE0, 0xF5, 0x09, 0x59, 0xE3, + 0x74, 0x0F, 0xE9, 0xE0, 0x3E, 0x09, 0x96, 0xD9, 0xAF, 0x00, 0x6F, 0xDA, + 0x7C, 0xFE, 0x3C, 0xDC, 0x1F, 0x03, 0x2F, 0xE1, 0xAD, 0x11, 0x08, 0xF4, + 0x86, 0x09, 0xE0, 0xEE, 0x71, 0xFF, 0x4F, 0xE4, 0xF4, 0x0F, 0x7E, 0xF1, + 0xF4, 0x05, 0xF6, 0xE6, 0x5B, 0xE7, 0x58, 0xCE, 0x26, 0xE7, 0xDD, 0xDD, + 0xEA, 0xF7, 0xE6, 0xF2, 0xFA, 0x08, 0xC2, 0xFC, 0xAF, 0x0E, 0xEE, 0x0C, + 0x87, 0xF4, 0x97, 0x15, 0xBD, 0xDC, 0x9A, 0x15, 0xDD, 0xE2, 0xB3, 0x14, + 0x62, 0x02, 0xF5, 0x1D, 0x50, 0x15, 0x76, 0x1F, 0x45, 0x03, 0xCC, 0x10, + 0x93, 0x02, 0xEE, 0x0F, 0xD2, 0x0A, 0x25, 0x04, 0x44, 0x0B, 0xCB, 0xEF, + 0xC8, 0x09, 0x45, 0xED, 0x18, 0xFB, 0x6E, 0xEF, 0x76, 0xF9, 0x0F, 0x02, + 0x89, 0x03, 0xAB, 0x18, 0xE9, 0xFC, 0x23, 0x0B, 0xC8, 0xEE, 0x62, 0xF2, + 0xC3, 0xF7, 0x74, 0xFB, 0x1C, 0xFF, 0x19, 0xFB, 0xB0, 0xFF, 0x63, 0xEE, + 0x99, 0x01, 0x9F, 0xEA, 0x30, 0xFB, 0xF3, 0xE4, 0x5A, 0x09, 0x78, 0xF7, + 0x17, 0x20, 0x42, 0x11, 0xBA, 0x1C, 0x73, 0x0B, 0xA9, 0x13, 0x47, 0xFB, + 0xE8, 0x1A, 0x26, 0x00, 0xC2, 0x1D, 0x98, 0x05, 0x20, 0x13, 0xA1, 0xFE, + 0xD1, 0x11, 0x91, 0x04, 0xF2, 0x18, 0x65, 0x07, 0x34, 0x1D, 0x78, 0x09, + 0x6D, 0x25, 0xDA, 0x20, 0x15, 0x26, 0xC9, 0x2A, 0x1F, 0x23, 0x45, 0x1D, + 0x97, 0x2D, 0x86, 0x18, 0xBE, 0x3D, 0xF2, 0x26, 0x13, 0x3F, 0x33, 0x32, + 0x9D, 0x32, 0xAB, 0x36, 0x00, 0x28, 0x65, 0x31, 0xB4, 0x28, 0xD4, 0x26, + 0x72, 0x20, 0x50, 0x1E, 0x05, 0xFB, 0x22, 0x09, 0x2B, 0xF0, 0xC3, 0x06, + 0x0E, 0x0A, 0x7A, 0x14, 0xC3, 0x18, 0xA9, 0x0A, 0x7C, 0x1C, 0xD6, 0xFF, + 0x6D, 0x18, 0x4D, 0x09, 0x51, 0x0B, 0xF4, 0x13, 0xAD, 0xFF, 0x6B, 0x15, + 0x60, 0xFF, 0x51, 0x1B, 0x32, 0xFE, 0x04, 0x13, 0xED, 0x03, 0x77, 0xFF, + 0xC2, 0x12, 0x1B, 0xF3, 0xDB, 0x19, 0xED, 0xEA, 0x63, 0x29, 0xDF, 0xED, + 0xA2, 0x35, 0x75, 0xF6, 0x15, 0x2D, 0xB5, 0xFA, 0x44, 0x28, 0x9A, 0xFE, + 0x50, 0x24, 0x59, 0x04, 0x22, 0x0D, 0xE0, 0xF8, 0x04, 0x00, 0x38, 0xF2, + 0x14, 0x14, 0x92, 0x02, 0x6C, 0x10, 0x80, 0xFC, 0x67, 0x02, 0x48, 0xF5, + 0xF8, 0x11, 0x4F, 0x0B, 0xB4, 0x03, 0xB5, 0x07, 0xAB, 0xF1, 0xD8, 0xFB, + 0xB1, 0xFC, 0x9E, 0x10, 0x36, 0xFB, 0x29, 0x18, 0xCE, 0xF3, 0xBF, 0x04, + 0x9A, 0xFD, 0x18, 0x01, 0xC9, 0xFE, 0x3D, 0x0D, 0xCD, 0xEF, 0x6C, 0x14, + 0x31, 0xF5, 0x8D, 0x1E, 0xD8, 0x04, 0x33, 0x2B, 0x54, 0x14, 0x82, 0x30, + 0x6D, 0x28, 0x79, 0x36, 0x49, 0x2D, 0x94, 0x34, 0xA8, 0x2A, 0x68, 0x28, + 0xA9, 0x2F, 0xB7, 0x27, 0xCF, 0x23, 0x64, 0x24, 0x50, 0x16, 0x92, 0x22, + 0x46, 0x22, 0xC8, 0x2D, 0xF0, 0x2D, 0xF4, 0x32, 0x35, 0x2B, 0xF3, 0x25, + 0xF2, 0x1F, 0x92, 0x19, 0x47, 0x0E, 0x62, 0x19, 0x4F, 0x00, 0x66, 0x12, + 0x2E, 0x07, 0x85, 0x07, 0xCB, 0x13, 0x7D, 0x06, 0x5C, 0x14, 0x1F, 0x15, + 0xD7, 0x0E, 0x04, 0x23, 0xAF, 0x13, 0x39, 0x2F, 0xDF, 0x29, 0x45, 0x3E, + 0x8A, 0x30, 0xF6, 0x34, 0x0A, 0x25, 0xD4, 0x24, 0x1E, 0x1D, 0x4B, 0x27, + 0x30, 0x14, 0x86, 0x29, 0x87, 0x11, 0xCF, 0x23, 0xE7, 0x1A, 0x56, 0x26, + 0xA0, 0x21, 0xE1, 0x2C, 0xD9, 0x17, 0x6A, 0x2B, 0xB8, 0x10, 0x55, 0x2F, + 0x43, 0x10, 0xA1, 0x27, 0xB1, 0x00, 0xB6, 0x11, 0xA4, 0xF1, 0x85, 0x09, + 0xAD, 0xF2, 0x91, 0x05, 0xC3, 0xFC, 0x6E, 0x03, 0x7D, 0xFF, 0x89, 0xFC, + 0xAD, 0x01, 0xC9, 0xF1, 0x88, 0x10, 0x8B, 0xF5, 0xEA, 0x0B, 0x9E, 0xF6, + 0xDF, 0x04, 0x18, 0xFA, 0x1F, 0x0D, 0x71, 0xFE, 0x61, 0x09, 0xDB, 0xF9, + 0x9A, 0x00, 0x66, 0xFC, 0x4D, 0xF7, 0x50, 0x05, 0x2D, 0xF2, 0x25, 0x0C, + 0x6C, 0xF7, 0x25, 0x0A, 0xE9, 0xF2, 0xF2, 0xFD, 0x41, 0xED, 0x81, 0xFF, + 0xBD, 0xF0, 0xFB, 0x11, 0x1F, 0xF5, 0xB3, 0x24, 0xED, 0xFD, 0xFD, 0x2C, + 0xFC, 0x0C, 0x95, 0x2A, 0x7F, 0x1B, 0x0D, 0x2F, 0x9D, 0x12, 0xD7, 0x31, + 0x60, 0x03, 0x5C, 0x2E, 0x67, 0x03, 0x39, 0x25, 0x17, 0xFF, 0x5C, 0x1F, + 0x4D, 0x02, 0x54, 0x2B, 0xB2, 0x08, 0x32, 0x30, 0x3F, 0xFB, 0x76, 0x1F, + 0x43, 0xF8, 0x01, 0x11, 0xF1, 0x04, 0x81, 0x0A, 0x75, 0x05, 0x1F, 0xFD, + 0xB9, 0x00, 0x7E, 0xF3, 0x92, 0xFE, 0x1D, 0xF4, 0xD1, 0xF9, 0x00, 0xF3, + 0xBB, 0xFF, 0x0A, 0x01, 0xCD, 0x0B, 0xA7, 0x12, 0x18, 0xFF, 0x63, 0x05, + 0xFE, 0xF7, 0x64, 0xFD, 0x39, 0x05, 0x80, 0x03, 0x3E, 0x07, 0x23, 0xFD, + 0x33, 0x00, 0xC8, 0xEC, 0x46, 0xF6, 0xF9, 0xDE, 0x37, 0xEA, 0xD6, 0xDF, + 0x2B, 0xED, 0x96, 0xEE, 0x06, 0xF8, 0x74, 0xF7, 0x41, 0x02, 0xDF, 0xF6, + 0x01, 0xFA, 0x54, 0xEC, 0xB4, 0xEF, 0x8E, 0xE4, 0xA7, 0x06, 0x36, 0xF1, + 0x26, 0x07, 0x6A, 0xF2, 0x62, 0xE9, 0x18, 0xE5, 0x85, 0xDC, 0x23, 0xEA, + 0xF0, 0xE3, 0x24, 0x00, 0x49, 0xF4, 0x8D, 0x0A, 0xE5, 0xFB, 0x4D, 0x03, + 0xD3, 0xF1, 0x4D, 0xF9, 0x63, 0xE9, 0xF1, 0xF8, 0xFF, 0xF1, 0x91, 0x06, + 0xA4, 0xF7, 0x7D, 0x08, 0x69, 0xF3, 0x11, 0x00, 0x45, 0xF4, 0x2D, 0x06, + 0x99, 0xF0, 0xCA, 0x0A, 0x1F, 0xFD, 0x41, 0x0E, 0x13, 0x1E, 0x56, 0x15, + 0xD8, 0x1E, 0x99, 0x08, 0xEC, 0x13, 0xDB, 0xF9, 0xA0, 0x19, 0xA5, 0x05, + 0xFC, 0x16, 0x11, 0x11, 0x15, 0x05, 0x7B, 0x07, 0x55, 0xEF, 0x4B, 0xFC, + 0xB4, 0xE6, 0x51, 0xFD, 0x37, 0xF2, 0x02, 0x09, 0xAB, 0xFB, 0x9F, 0x11, + 0x70, 0xF3, 0xA7, 0x03, 0x28, 0xED, 0xB3, 0xF6, 0x23, 0xE2, 0xDB, 0xF4, + 0x34, 0xCB, 0x8E, 0xF0, 0x3B, 0xC4, 0xFF, 0xEE, 0x1E, 0xD1, 0xFD, 0xE4, + 0x5E, 0xD5, 0x63, 0xD9, 0xEF, 0xCF, 0x67, 0xE0, 0x13, 0xD8, 0x36, 0xF8, + 0xA4, 0xE1, 0x61, 0x03, 0x16, 0xD6, 0x1A, 0xF4, 0x99, 0xD9, 0xB8, 0xF3, + 0x2C, 0xF1, 0xAA, 0xFD, 0x3C, 0xF0, 0x03, 0xF6, 0x33, 0xE6, 0x97, 0xF0, + 0x2F, 0xE9, 0x25, 0xEF, 0x82, 0xE3, 0xB4, 0xDE, 0x44, 0xD2, 0xDC, 0xCA, + 0x00, 0xC5, 0x11, 0xC3, 0x2C, 0xC2, 0x61, 0xB7, 0x8A, 0xCA, 0x51, 0xA9, + 0x10, 0xD4, 0xD6, 0xB3, 0x4B, 0xD0, 0xE2, 0xC3, 0x82, 0xCB, 0x95, 0xC4, + 0x3E, 0xD7, 0x30, 0xC9, 0x3E, 0xD4, 0x9A, 0xC8, 0x99, 0xCF, 0xE6, 0xCC, + 0x51, 0xDA, 0x22, 0xDB, 0xB5, 0xD6, 0x65, 0xD8, 0x87, 0xD9, 0xF2, 0xD3, + 0x7C, 0xF2, 0x66, 0xD5, 0x1E, 0x00, 0x31, 0xD1, 0x16, 0xF6, 0x3F, 0xD5, + 0xAA, 0xED, 0x6F, 0xE3, 0x52, 0xF0, 0xCA, 0xE8, 0xC2, 0xF5, 0x02, 0xE7, + 0x3B, 0xFB, 0x2C, 0xEC, 0xCB, 0xFB, 0x0D, 0xEF, 0xD5, 0xF9, 0x95, 0xF6, + 0x46, 0xF2, 0xB4, 0xFE, 0x0E, 0xEB, 0x50, 0xF8, 0x96, 0xF2, 0x2B, 0xF7, + 0x17, 0xEF, 0x81, 0xF8, 0x39, 0xDB, 0x21, 0xF5, 0x2A, 0xD4, 0x88, 0xF5, + 0x9E, 0xD5, 0x8F, 0xF7, 0xA7, 0xDD, 0xC2, 0xF3, 0x13, 0xED, 0xE9, 0xE6, + 0x85, 0xF6, 0x88, 0xDF, 0xFE, 0xF8, 0xE1, 0xDC, 0xB8, 0xF8, 0xF2, 0xDA, + 0xA6, 0xF6, 0x6B, 0xEA, 0x17, 0xF6, 0xC3, 0xFC, 0x04, 0xFC, 0xC7, 0xFE, + 0xB0, 0xFF, 0xFE, 0xFD, 0x5A, 0xF4, 0xBA, 0xFC, 0xC1, 0xEF, 0xA8, 0xF5, + 0x86, 0xEB, 0xD9, 0xE6, 0x2A, 0xDB, 0xE9, 0xDA, 0x4B, 0xDC, 0x64, 0xDF, + 0xE9, 0xF1, 0x0F, 0xEC, 0x46, 0xFF, 0xC9, 0xE9, 0xBA, 0xFD, 0xE4, 0xE1, + 0x0F, 0xFF, 0xDB, 0xE8, 0x0B, 0xF4, 0x79, 0xE6, 0x0A, 0xE3, 0x33, 0xDF, + 0x57, 0xE7, 0xE6, 0xE4, 0x7C, 0xEE, 0x10, 0xEC, 0x17, 0xE9, 0x12, 0xF4, + 0xEE, 0xE2, 0xCA, 0xF6, 0x29, 0xE0, 0x83, 0xE7, 0xC6, 0xE8, 0xB1, 0xDB, + 0xEF, 0xF4, 0xF8, 0xE1, 0xED, 0xE5, 0x5A, 0xE3, 0xEC, 0xE3, 0x34, 0xE8, + 0xB1, 0xF6, 0xB2, 0xEA, 0xEA, 0xF3, 0x87, 0xE3, 0xDF, 0xE9, 0x6D, 0xE7, + 0x3B, 0xE7, 0xA5, 0xEB, 0xC3, 0xED, 0x72, 0xEB, 0x9F, 0xFF, 0x23, 0xF2, + 0x28, 0x0E, 0x7B, 0xF6, 0xF3, 0x04, 0xEE, 0xF2, 0x8B, 0xF9, 0x5B, 0xF6, + 0xD4, 0x00, 0xA7, 0xF9, 0xE3, 0x0B, 0x30, 0xFB, 0x33, 0x1C, 0xAC, 0x03, + 0x45, 0x28, 0x42, 0x09, 0x89, 0x27, 0x91, 0x13, 0xB3, 0x29, 0x0C, 0x21, + 0x58, 0x2A, 0x66, 0x24, 0xBE, 0x14, 0x16, 0x18, 0x22, 0xF9, 0x65, 0x0A, + 0xA4, 0xF5, 0xDE, 0x06, 0x2C, 0xF8, 0x62, 0xFD, 0x75, 0xF5, 0x43, 0xFA, + 0xD1, 0xF5, 0xB9, 0x04, 0x6F, 0xF5, 0x61, 0x13, 0x15, 0xF0, 0xFD, 0x1D, + 0xDB, 0xED, 0x3D, 0x23, 0x11, 0xEC, 0x5C, 0x17, 0xAD, 0xEB, 0x9D, 0xFE, + 0x03, 0xF6, 0x6F, 0xFE, 0x2E, 0xFD, 0x46, 0x04, 0x32, 0x00, 0x5E, 0xF9, + 0x58, 0x0F, 0xD1, 0xF7, 0xC6, 0x19, 0x23, 0x00, 0xB0, 0x15, 0x28, 0x06, + 0xD3, 0x0D, 0x7E, 0xFE, 0x5D, 0x09, 0xAB, 0xE9, 0xD9, 0x03, 0xF3, 0xDF, + 0xBB, 0xF0, 0x19, 0xDA, 0xFE, 0xED, 0x49, 0xDB, 0x2B, 0xF8, 0x14, 0xDD, + 0xA5, 0x00, 0xA9, 0xD8, 0x16, 0x0E, 0x71, 0xDE, 0x3F, 0x09, 0x7B, 0xDF, + 0xB4, 0xF6, 0x34, 0xD8, 0xD5, 0xF5, 0x6F, 0xDD, 0x96, 0x0A, 0xB1, 0xED, + 0x22, 0x12, 0xDB, 0xE7, 0x22, 0x11, 0x44, 0xE1, 0x97, 0x0E, 0xF2, 0xEC, + 0xCE, 0xFA, 0x96, 0xF3, 0x16, 0xF0, 0x04, 0xF9, 0xF8, 0xF5, 0x4A, 0x00, + 0x4A, 0xFF, 0x56, 0x02, 0x23, 0x07, 0xE0, 0x02, 0x08, 0x07, 0xF7, 0x0C, + 0xD2, 0xFD, 0x72, 0x0D, 0xFD, 0xF8, 0x99, 0xFE, 0x1C, 0x05, 0x1A, 0xF8, + 0xA5, 0x0B, 0xEB, 0xFB, 0x33, 0x0A, 0x5E, 0x0A, 0x84, 0x0B, 0x9B, 0x21, + 0xAA, 0x05, 0x41, 0x2F, 0x7D, 0x0D, 0xC9, 0x33, 0x20, 0x15, 0x19, 0x2A, + 0x2E, 0x0B, 0xC4, 0x15, 0xF0, 0x0C, 0xCB, 0x0D, 0x73, 0x12, 0x6D, 0x10, + 0x42, 0x11, 0x87, 0x13, 0xD1, 0x17, 0xAE, 0x19, 0xBB, 0x25, 0x56, 0x25, + 0x31, 0x2F, 0x91, 0x2A, 0xF6, 0x2A, 0xBE, 0x23, 0x27, 0x20, 0x8D, 0x10, + 0x5A, 0x12, 0xD3, 0xFD, 0xD3, 0x08, 0x43, 0x02, 0x0F, 0x0A, 0x6F, 0x08, + 0x32, 0x11, 0x5A, 0x03, 0x6F, 0x17, 0x7B, 0x07, 0xAF, 0x14, 0x8D, 0x0D, + 0xC9, 0x0C, 0x24, 0x0F, 0xEF, 0x05, 0x6E, 0x0B, 0x30, 0x06, 0x08, 0xFD, + 0xAC, 0x07, 0x01, 0xF2, 0x2A, 0xFD, 0x1A, 0xF0, 0x67, 0xF7, 0xA1, 0xF4, + 0x19, 0x03, 0x8B, 0xF9, 0x80, 0x06, 0xA9, 0xF4, 0x5D, 0x09, 0xA9, 0xF0, + 0x40, 0x15, 0x46, 0xF6, 0x7A, 0x16, 0xE3, 0xFA, 0xF8, 0x0B, 0x5A, 0xF1, + 0xC6, 0x07, 0x8B, 0xEF, 0xC6, 0x0C, 0x4A, 0xFF, 0xFB, 0x09, 0xCA, 0x10, + 0x24, 0x0D, 0xB7, 0x21, 0xC1, 0x18, 0xA2, 0x22, 0x22, 0x11, 0x44, 0x16, + 0x13, 0xFD, 0x70, 0x0D, 0x04, 0xF6, 0x7F, 0x0C, 0xC6, 0xF9, 0x86, 0x11, + 0x04, 0x06, 0x85, 0x17, 0x8B, 0x17, 0x6D, 0x18, 0x2F, 0x22, 0x66, 0x16, + 0x5E, 0x25, 0xA8, 0x1B, 0x12, 0x30, 0x2D, 0x28, 0x37, 0x3E, 0xE7, 0x32, + 0x08, 0x43, 0x70, 0x3B, 0xE3, 0x40, 0x74, 0x41, 0xBA, 0x32, 0x5B, 0x3F, + 0x06, 0x26, 0x7E, 0x3B, 0x54, 0x20, 0x06, 0x2D, 0x0D, 0x1D, 0x74, 0x1D, + 0x9C, 0x1C, 0xEB, 0x21, 0xA2, 0x1A, 0x2B, 0x24, 0x7C, 0x21, 0x54, 0x26, + 0xD8, 0x1D, 0xD1, 0x22, 0x05, 0x0F, 0xC5, 0x15, 0xE7, 0x0F, 0x3F, 0x1C, + 0x55, 0x14, 0xCE, 0x21, 0x6D, 0x10, 0x57, 0x15, 0xCF, 0x1B, 0xFB, 0x0F, + 0x28, 0x2F, 0xB4, 0x11, 0xA7, 0x27, 0xCE, 0x15, 0x42, 0x1A, 0x72, 0x24, + 0xE4, 0x20, 0xC0, 0x30, 0x2D, 0x30, 0xC7, 0x30, 0x56, 0x36, 0xCE, 0x28, + 0xDE, 0x2D, 0xB5, 0x21, 0x3F, 0x1E, 0x75, 0x1C, 0x27, 0x14, 0x95, 0x12, + 0xE6, 0x18, 0xAA, 0x09, 0xA6, 0x22, 0x41, 0x0A, 0x5C, 0x27, 0x4A, 0x19, + 0xC7, 0x16, 0x39, 0x1E, 0x72, 0x03, 0xEA, 0x17, 0xF0, 0x0D, 0xC3, 0x19, + 0xED, 0x1A, 0x63, 0x1A, 0x49, 0x17, 0xBB, 0x1C, 0xFB, 0x0F, 0x3D, 0x1D, + 0x4E, 0x0D, 0xC3, 0x1E, 0x4C, 0x11, 0xB4, 0x20, 0xCA, 0x0E, 0x41, 0x1C, + 0x40, 0x05, 0x75, 0x21, 0x88, 0x05, 0x9F, 0x24, 0x74, 0x0E, 0xFA, 0x22, + 0x0B, 0x1E, 0x9A, 0x2E, 0x6F, 0x2D, 0x45, 0x34, 0xA6, 0x31, 0xBD, 0x24, + 0x0E, 0x32, 0x58, 0x15, 0xB6, 0x28, 0x3C, 0x17, 0xDD, 0x1A, 0xDA, 0x22, + 0x6D, 0x15, 0x13, 0x2D, 0x48, 0x0B, 0xEC, 0x31, 0x4A, 0xFE, 0xA6, 0x2F, + 0x26, 0xFC, 0x1C, 0x28, 0xAD, 0x0B, 0xB1, 0x25, 0x3B, 0x17, 0x31, 0x23, + 0xC0, 0x0D, 0xF4, 0x1A, 0x37, 0x05, 0x97, 0x1D, 0x4D, 0x07, 0x1F, 0x21, + 0x61, 0x11, 0xB6, 0x1C, 0xBF, 0x20, 0x36, 0x1A, 0x20, 0x1F, 0x80, 0x10, + 0x79, 0x04, 0xF0, 0x07, 0x19, 0xF1, 0x18, 0x08, 0x88, 0xFA, 0xE4, 0x09, + 0xB2, 0x0B, 0x45, 0x07, 0x69, 0x0C, 0xF7, 0x03, 0x1D, 0x03, 0xE8, 0x08, + 0xEE, 0x05, 0x39, 0x10, 0xC1, 0x12, 0xFB, 0x15, 0x01, 0x0F, 0xCB, 0x0C, + 0xD5, 0x02, 0x29, 0xFE, 0x2D, 0xFF, 0x38, 0xFA, 0x15, 0xF9, 0x3F, 0xFE, + 0x5F, 0xEE, 0xF6, 0x02, 0xED, 0xF0, 0x09, 0x00, 0x8C, 0x04, 0x90, 0x0B, + 0x17, 0x0A, 0x2E, 0x17, 0xC8, 0xFD, 0x2B, 0x14, 0x6C, 0xFE, 0x5E, 0x1A, + 0xAD, 0x08, 0x04, 0x1C, 0xAA, 0xFE, 0xF0, 0x10, 0x01, 0xF4, 0xF9, 0x10, + 0xC2, 0x01, 0xDC, 0x13, 0xDE, 0x0E, 0xDD, 0x05, 0x56, 0x0A, 0x84, 0xF8, + 0xDE, 0xFD, 0xF1, 0xF9, 0xD5, 0xF4, 0x3F, 0xF9, 0x49, 0xEE, 0x31, 0xF1, + 0x75, 0xEE, 0x79, 0xEF, 0x96, 0xF7, 0x2B, 0xF1, 0xC0, 0xFD, 0xD8, 0xF5, + 0xFF, 0xF7, 0xAB, 0xFC, 0x48, 0xF9, 0x2E, 0x00, 0x4E, 0x07, 0xB8, 0xFF, + 0x89, 0x0E, 0x42, 0x01, 0x88, 0x0C, 0x75, 0x0D, 0x8E, 0x0A, 0x86, 0x19, + 0x06, 0x06, 0x61, 0x0F, 0x2A, 0x04, 0x40, 0x00, 0xE4, 0x0C, 0xA8, 0xFF, + 0xF4, 0x0E, 0x79, 0xFC, 0xDB, 0xFF, 0xA8, 0xF2, 0xB0, 0xF3, 0x2F, 0xF0, + 0xE8, 0xF1, 0x16, 0xF9, 0xAC, 0xF5, 0x50, 0x00, 0x94, 0xF9, 0x39, 0x04, + 0x4E, 0xF4, 0x44, 0x09, 0x33, 0xF4, 0x43, 0x06, 0x65, 0xFC, 0x23, 0x00, + 0xC3, 0xF3, 0x6D, 0xFC, 0xC4, 0xE1, 0x13, 0x00, 0xDC, 0xDD, 0x39, 0x08, + 0x7B, 0xDE, 0xD7, 0x05, 0xA3, 0xEB, 0x5C, 0x04, 0x46, 0x01, 0xD4, 0x03, + 0x78, 0xFB, 0xFB, 0xFA, 0x71, 0xEB, 0x3E, 0xEE, 0xD1, 0xE5, 0x18, 0xE2, + 0xE0, 0xE3, 0x15, 0xE1, 0x79, 0xF0, 0x6A, 0xEB, 0x90, 0xF5, 0x91, 0xF2, + 0xAE, 0xE6, 0xCC, 0xF4, 0xC9, 0xE0, 0xD4, 0xF8, 0x28, 0xE2, 0x63, 0xF6, + 0xD9, 0xE4, 0x3D, 0xEF, 0x34, 0xE4, 0xF4, 0xE9, 0x25, 0xDF, 0xE1, 0xE2, + 0xFF, 0xDB, 0xB0, 0xE1, 0x5D, 0xDC, 0x11, 0xE6, 0x45, 0xE4, 0x8A, 0xE7, + 0x01, 0xEE, 0xA5, 0xE4, 0x67, 0xF3, 0x13, 0xE5, 0xB6, 0xED, 0x44, 0xEC, + 0x8F, 0xEB, 0x54, 0xF0, 0x43, 0xF2, 0x97, 0xEF, 0x9B, 0xF4, 0x95, 0xF0, + 0x5A, 0xF1, 0x22, 0xF3, 0x08, 0xF3, 0x79, 0xF3, 0xC3, 0x01, 0x0F, 0xF0, + 0x09, 0x09, 0x47, 0xF2, 0x93, 0xFE, 0xDA, 0xF8, 0x2B, 0xFA, 0x1C, 0x02, + 0xBF, 0xFB, 0x44, 0x07, 0x1B, 0xFF, 0x58, 0x02, 0x4D, 0x03, 0xF3, 0xF8, + 0xAB, 0x00, 0xEF, 0xF5, 0xF6, 0xF4, 0x0B, 0xF8, 0xFD, 0xE6, 0x93, 0xF4, + 0xDF, 0xEE, 0xBF, 0xF8, 0xB6, 0xFB, 0xA7, 0xF7, 0xEC, 0x00, 0xE5, 0xF2, + 0x51, 0x00, 0xFF, 0xFC, 0x4C, 0xF6, 0xA0, 0x00, 0x37, 0xEE, 0xFC, 0xF9, + 0x0A, 0xE5, 0x33, 0xF8, 0xAF, 0xDE, 0xB9, 0xF6, 0xED, 0xDB, 0xD6, 0xEB, + 0x16, 0xDC, 0x9B, 0xE6, 0xE2, 0xE1, 0xC2, 0xE4, 0xBF, 0xEC, 0x85, 0xD8, + 0x3A, 0xF4, 0x98, 0xCC, 0x0A, 0xF1, 0xC3, 0xC9, 0x5A, 0xF1, 0xFC, 0xCD, + 0x03, 0xF2, 0xAB, 0xD0, 0x56, 0xE9, 0x8D, 0xD7, 0x62, 0xDE, 0x10, 0xE1, + 0xCA, 0xD4, 0x5C, 0xE0, 0x5C, 0xD7, 0xD8, 0xDA, 0x26, 0xE2, 0x41, 0xD5, + 0x88, 0xDE, 0x42, 0xD0, 0xFA, 0xD6, 0x0B, 0xD1, 0xC1, 0xD6, 0xBA, 0xCF, + 0x08, 0xDC, 0xEA, 0xCA, 0xB3, 0xE0, 0xC7, 0xCE, 0x7C, 0xE6, 0x3A, 0xD1, + 0x02, 0xED, 0xC6, 0xD1, 0x2C, 0xE3, 0x2C, 0xDC, 0xC7, 0xDB, 0xD9, 0xE6, + 0xBA, 0xDD, 0x6B, 0xED, 0xC6, 0xD9, 0x69, 0xF0, 0xA4, 0xD3, 0xC1, 0xEE, + 0x03, 0xD4, 0x95, 0xED, 0xBB, 0xE8, 0xA8, 0xF1, 0x83, 0xFA, 0xF6, 0xEA, + 0x03, 0xFA, 0xA0, 0xDE, 0xC9, 0xF4, 0xFF, 0xE1, 0xCE, 0xEE, 0x8D, 0xE7, + 0xAC, 0xED, 0xBD, 0xE4, 0x81, 0xF2, 0x17, 0xE1, 0xE1, 0xF9, 0x76, 0xDC, + 0xD6, 0xF5, 0xB6, 0xD7, 0x51, 0xE8, 0x56, 0xD6, 0x37, 0xE4, 0x27, 0xD8, + 0xA2, 0xE1, 0x53, 0xDC, 0x14, 0xD8, 0x74, 0xE5, 0xBC, 0xD7, 0x7B, 0xFA, + 0x96, 0xE4, 0x55, 0x03, 0xA7, 0xEC, 0x54, 0xF0, 0x77, 0xF0, 0x38, 0xE5, + 0x1A, 0xF0, 0xBB, 0xE9, 0xDA, 0xE5, 0x80, 0xEE, 0x1D, 0xDE, 0x5D, 0xF2, + 0x2D, 0xE1, 0x00, 0xED, 0xD8, 0xE7, 0xE3, 0xE5, 0x7E, 0xEE, 0x16, 0xE8, + 0x24, 0xF7, 0xE7, 0xED, 0x0F, 0xF7, 0xE9, 0xE9, 0xCB, 0xF5, 0x43, 0xDA, + 0xDF, 0xF4, 0x5B, 0xD0, 0x46, 0xED, 0xE5, 0xD1, 0xDA, 0xE6, 0xFF, 0xD5, + 0x52, 0xE6, 0xC8, 0xD7, 0x7D, 0xF0, 0x52, 0xD8, 0xA9, 0xFA, 0x02, 0xD9, + 0x36, 0xF8, 0xB5, 0xCD, 0x13, 0xF0, 0x61, 0xC0, 0x55, 0xEC, 0x90, 0xBE, + 0xB7, 0xED, 0xF3, 0xBE, 0xA6, 0xF2, 0x2D, 0xCA, 0x8F, 0xF7, 0x30, 0xD6, + 0x86, 0xF5, 0x18, 0xD8, 0xAE, 0xF6, 0x24, 0xE3, 0x93, 0xF2, 0xA9, 0xE6, + 0xEF, 0xE7, 0x64, 0xE6, 0xA1, 0xE6, 0xC2, 0xEF, 0x8B, 0xDF, 0x00, 0xF0, + 0xEA, 0xDF, 0xD5, 0xF1, 0x33, 0xF7, 0xF6, 0xF8, 0xE4, 0x08, 0x54, 0xF5, + 0xA2, 0x0D, 0x5F, 0xF4, 0x32, 0x07, 0x34, 0x00, 0xD2, 0xFA, 0x8E, 0x0D, + 0x4B, 0xF1, 0x71, 0x12, 0x8C, 0xEE, 0x13, 0x0C, 0x4F, 0xF5, 0xB8, 0x06, + 0x0E, 0xF4, 0x18, 0x0C, 0x97, 0xE6, 0xC5, 0x10, 0xC8, 0xE1, 0x9F, 0x09, + 0xA7, 0xEE, 0xEC, 0x00, 0xD5, 0xFA, 0x80, 0xFE, 0x29, 0xFA, 0x18, 0x02, + 0x38, 0xFE, 0xFD, 0x08, 0xAE, 0x0A, 0x85, 0x0B, 0x95, 0x0C, 0xFE, 0x06, + 0x53, 0x08, 0x67, 0xFE, 0x4E, 0x04, 0x38, 0xFA, 0x7F, 0x04, 0xF9, 0x01, + 0x63, 0x07, 0xAC, 0xFE, 0x5C, 0x05, 0xD1, 0xF1, 0xEB, 0x07, 0xCE, 0xF4, + 0x87, 0x0A, 0xEC, 0xF6, 0x4D, 0x0D, 0x3D, 0xF1, 0xE5, 0x19, 0xDB, 0xEF, + 0x39, 0x1F, 0xD0, 0xF1, 0xA9, 0x14, 0x0A, 0xF5, 0x38, 0x0D, 0x94, 0xFD, + 0xE0, 0x0E, 0x3B, 0x07, 0x2D, 0x17, 0xFF, 0x0D, 0x98, 0x20, 0x77, 0x0C, + 0x64, 0x20, 0x32, 0x09, 0x8B, 0x13, 0x7C, 0x0E, 0x03, 0xFF, 0xE3, 0x0F, + 0x4D, 0xF8, 0x63, 0x14, 0x4B, 0xFE, 0x81, 0x10, 0xCA, 0x02, 0x1E, 0x08, + 0xA9, 0x00, 0xBA, 0x10, 0x22, 0xFE, 0x62, 0x1B, 0x9F, 0x0A, 0x52, 0x20, + 0xA1, 0x11, 0xEF, 0x1D, 0xC5, 0x08, 0xFF, 0x17, 0x80, 0x00, 0x08, 0x14, + 0x9D, 0xFA, 0x0E, 0x0E, 0xC1, 0xFA, 0xE1, 0x04, 0xF0, 0x04, 0x60, 0xFA, + 0xE9, 0x12, 0xA5, 0xF5, 0x70, 0x15, 0xC4, 0xF5, 0xC3, 0x13, 0x02, 0xF9, + 0x12, 0x14, 0x4E, 0x00, 0xC0, 0x0C, 0x0A, 0x03, 0xE7, 0x07, 0x91, 0x07, + 0xAB, 0x08, 0x55, 0x0A, 0x74, 0x0B, 0xD5, 0x08, 0xE9, 0x0E, 0x53, 0x08, + 0x39, 0x16, 0x2D, 0x0C, 0x5A, 0x14, 0x06, 0x14, 0x18, 0x04, 0xF2, 0x18, + 0x58, 0x00, 0x98, 0x1E, 0xB5, 0x11, 0x2F, 0x1E, 0x40, 0x24, 0xB6, 0x13, + 0x43, 0x21, 0x53, 0x06, 0xCC, 0x15, 0x50, 0x01, 0x0D, 0x11, 0x38, 0x04, + 0xEE, 0x0A, 0xD4, 0x04, 0x19, 0x0B, 0x79, 0x09, 0x07, 0x0C, 0x4A, 0x14, + 0x44, 0x0C, 0x18, 0x1F, 0xF9, 0x14, 0x61, 0x26, 0xCE, 0x1F, 0x35, 0x22, + 0xED, 0x22, 0x53, 0x14, 0x4E, 0x18, 0x05, 0x0E, 0x64, 0x11, 0x3F, 0x0E, + 0xB2, 0x0E, 0xDE, 0x04, 0x49, 0x0F, 0xB9, 0xFC, 0xE7, 0x1F, 0x9F, 0xFD, + 0x5E, 0x25, 0xE7, 0xF9, 0xD2, 0x18, 0x86, 0xF7, 0x1F, 0x13, 0x53, 0xFF, + 0x0A, 0x0E, 0x8D, 0x04, 0x6A, 0x08, 0xBB, 0x04, 0xA6, 0x08, 0xF5, 0x00, + 0xEA, 0x0C, 0xEA, 0xFE, 0xD3, 0x0D, 0x55, 0x08, 0x6F, 0x0A, 0x29, 0x12, + 0x2F, 0x0B, 0x74, 0x12, 0xC6, 0x0E, 0xDF, 0x17, 0x6C, 0x0D, 0xE2, 0x1C, + 0x48, 0x07, 0xC6, 0x19, 0x99, 0x09, 0xE3, 0x16, 0xBD, 0x0C, 0x8E, 0x0E, + 0x4C, 0x0B, 0x00, 0x04, 0xDA, 0x11, 0x71, 0x02, 0xE2, 0x17, 0x99, 0x0C, + 0xEB, 0x12, 0x4E, 0x10, 0x29, 0x0F, 0x87, 0x12, 0xF0, 0x0D, 0xAA, 0x1E, + 0x23, 0x05, 0x2C, 0x25, 0x24, 0xF9, 0x39, 0x22, 0x08, 0x03, 0xEE, 0x22, + 0xF0, 0x1A, 0xF3, 0x24, 0x79, 0x1F, 0xC5, 0x1F, 0x24, 0x1D, 0x9C, 0x2A, + 0x53, 0x1C, 0x44, 0x39, 0x64, 0x18, 0x11, 0x33, 0x80, 0x23, 0x7D, 0x2E, + 0x7F, 0x2E, 0x64, 0x2E, 0x1C, 0x2C, 0x6C, 0x2B, 0x11, 0x2D, 0xBA, 0x27, + 0x8E, 0x32, 0xB7, 0x2E, 0x6A, 0x2B, 0xB0, 0x35, 0xE0, 0x1A, 0x12, 0x34, + 0xCF, 0x18, 0x7E, 0x36, 0x53, 0x1E, 0x3E, 0x34, 0xDA, 0x23, 0xCA, 0x2A, + 0xA5, 0x2C, 0xBE, 0x1A, 0xAD, 0x2A, 0x9D, 0x10, 0x94, 0x17, 0x08, 0x0D, + 0x6F, 0x07, 0xFF, 0x06, 0x58, 0x04, 0xFC, 0x05, 0xCA, 0x06, 0xD2, 0x10, + 0x6F, 0x0A, 0xC3, 0x22, 0x77, 0x0A, 0xCD, 0x29, 0x79, 0x07, 0x98, 0x23, + 0x35, 0x0C, 0xFC, 0x1F, 0xC6, 0x0E, 0xB3, 0x1A, 0x90, 0x06, 0x09, 0x0D, + 0x28, 0xFB, 0xF1, 0x00, 0x29, 0xF7, 0x17, 0x02, 0x01, 0x07, 0x30, 0x0C, + 0x93, 0x1C, 0x3A, 0x0E, 0x83, 0x20, 0x19, 0x10, 0xEB, 0x13, 0x7C, 0x13, + 0xE7, 0x0B, 0xD5, 0x11, 0x29, 0x0A, 0xF5, 0x09, 0xC5, 0x04, 0xB8, 0x02, + 0xC2, 0x00, 0x2E, 0x06, 0x11, 0x06, 0xB2, 0x05, 0x50, 0x0D, 0x5C, 0x01, + 0x5E, 0x13, 0xAC, 0x08, 0x4C, 0x1A, 0x00, 0x12, 0x10, 0x1A, 0xC4, 0x19, + 0x9A, 0x1B, 0x29, 0x22, 0x59, 0x26, 0x26, 0x1E, 0x3E, 0x37, 0x22, 0x19, + 0xD9, 0x36, 0x98, 0x1B, 0x03, 0x1C, 0xDD, 0x21, 0x99, 0x09, 0x53, 0x26, + 0xE8, 0x0D, 0x8C, 0x24, 0xF1, 0x14, 0xC0, 0x23, 0x9A, 0x07, 0x34, 0x1B, + 0xA2, 0x02, 0x3C, 0x15, 0x02, 0x07, 0x02, 0x12, 0xF6, 0xFA, 0xAD, 0x12, + 0xEA, 0xF6, 0x4B, 0x1E, 0x9F, 0xFD, 0x5F, 0x2A, 0xD6, 0xFF, 0x22, 0x31, + 0x3F, 0xF5, 0x57, 0x30, 0x34, 0xF0, 0x0F, 0x30, 0x1D, 0xFD, 0x87, 0x2B, + 0xD9, 0xFF, 0xC6, 0x18, 0xF3, 0x02, 0x1C, 0x0C, 0x61, 0x0B, 0x98, 0x06, + 0x0D, 0x0D, 0xF5, 0xFD, 0x83, 0x15, 0xD5, 0x00, 0x75, 0x1B, 0x4A, 0x04, + 0xF3, 0x16, 0x71, 0x03, 0x6D, 0x12, 0x47, 0x04, 0x31, 0x0F, 0xB4, 0x05, + 0xFE, 0x15, 0xC7, 0x0D, 0xEE, 0x1C, 0x5E, 0x11, 0x3E, 0x19, 0x6D, 0x0C, + 0x53, 0x15, 0x10, 0x07, 0xB7, 0x19, 0xBA, 0xFD, 0x61, 0x29, 0x0C, 0xFC, + 0x73, 0x26, 0xD5, 0xFE, 0x72, 0x12, 0x59, 0xFC, 0xA1, 0x03, 0x3C, 0x01, + 0xEF, 0xFA, 0x4E, 0x0A, 0xF0, 0xFD, 0xB0, 0x14, 0x64, 0x04, 0xC3, 0x18, + 0x04, 0x06, 0x2C, 0x16, 0x2D, 0x0A, 0x6A, 0x18, 0xFE, 0x0F, 0x87, 0x1A, + 0x50, 0x11, 0x99, 0x1A, 0x12, 0x0A, 0xF8, 0x14, 0xAA, 0xFF, 0x96, 0x11, + 0x8A, 0xF3, 0x1B, 0x14, 0xCF, 0xE9, 0xFF, 0x0D, 0x06, 0xF9, 0x3C, 0x07, + 0x20, 0x08, 0xDD, 0x00, 0xD3, 0x04, 0xB0, 0x02, 0x96, 0xFA, 0x31, 0x08, + 0x54, 0xF8, 0xBD, 0x07, 0xBB, 0xF6, 0xA8, 0x02, 0x8D, 0xEA, 0x0D, 0xFA, + 0x4F, 0xE7, 0x53, 0xFB, 0x1A, 0xF0, 0x8A, 0x03, 0xA8, 0xF8, 0x8C, 0x08, + 0x97, 0xF5, 0x10, 0xFE, 0xD4, 0xF0, 0xB1, 0xF2, 0xBF, 0xE7, 0x8E, 0xEF, + 0xF4, 0xD8, 0xCF, 0xEA, 0x41, 0xD9, 0x45, 0xE6, 0x07, 0xE7, 0x2B, 0xE1, + 0xEE, 0xEE, 0x21, 0xDD, 0xA0, 0xF2, 0xFC, 0xDC, 0xA6, 0xF4, 0x72, 0xD8, + 0xCA, 0xF4, 0x3B, 0xD5, 0x60, 0xF2, 0xFC, 0xDD, 0x1E, 0xE2, 0xAA, 0xDF, + 0x7F, 0xCD, 0x29, 0xD8, 0x62, 0xC9, 0x0D, 0xDF, 0x87, 0xD1, 0x72, 0xEC, + 0xEA, 0xDA, 0x51, 0xEE, 0x72, 0xE7, 0x74, 0xEC, 0x52, 0xED, 0xEF, 0xE7, + 0x71, 0xE8, 0xDE, 0xE2, 0x73, 0xE4, 0x2C, 0xDF, 0xE4, 0xEB, 0x8B, 0xD9, + 0xB9, 0xF5, 0x58, 0xDA, 0x9A, 0xF2, 0x54, 0xE4, 0x2E, 0xF0, 0x3E, 0xF5, + 0x0A, 0xF2, 0xE3, 0xFB, 0x66, 0xEC, 0x4B, 0xF4, 0x74, 0xE6, 0x41, 0xEC, + 0x0E, 0xDD, 0xE2, 0xE3, 0x6B, 0xD9, 0x79, 0xDE, 0xC9, 0xDE, 0x2C, 0xDB, + 0x92, 0xEC, 0x78, 0xE1, 0x3B, 0xF5, 0xA3, 0xE4, 0x32, 0xE4, 0x86, 0xD7, + 0x1F, 0xDA, 0x4B, 0xD4, 0x6A, 0xEB, 0x40, 0xD9, 0x41, 0xFC, 0xC5, 0xDA, + 0xF9, 0xF0, 0xCB, 0xDE, 0x8D, 0xE5, 0x7D, 0xEC, 0x20, 0xE5, 0x1D, 0xFB, + 0xAC, 0xDE, 0xEE, 0xFE, 0xFF, 0xE0, 0x53, 0x06, 0x63, 0xDB, 0xF0, 0xF8, + 0x46, 0xD2, 0x49, 0xEA, 0x80, 0xDA, 0x6F, 0xF9, 0x76, 0xD9, 0x10, 0xF7, + 0x74, 0xDA, 0x5F, 0xE8, 0x42, 0xF1, 0x2A, 0xEC, 0x7C, 0xF6, 0xA3, 0xEB, + 0x76, 0xEA, 0xD4, 0xE6, 0xBF, 0xE7, 0xBF, 0xF1, 0xA2, 0xEF, 0xD0, 0xF9, + 0xE0, 0xF4, 0xE0, 0xF1, 0x68, 0xF3, 0x50, 0xF1, 0x5A, 0xF3, 0xF0, 0xF4, + 0xD9, 0xF3, 0x10, 0xF1, 0x52, 0xF5, 0xE0, 0xF3, 0x38, 0xF7, 0xB2, 0xF7, + 0x2A, 0xF6, 0xDA, 0xF0, 0x5A, 0xFB, 0xAF, 0xEC, 0x38, 0x05, 0x32, 0xEA, + 0x0B, 0x0E, 0x6D, 0xEB, 0xBB, 0x0D, 0x0E, 0xF0, 0xBB, 0x00, 0x8A, 0xF0, + 0x96, 0x00, 0x81, 0xF3, 0x76, 0x0A, 0x05, 0xEF, 0x32, 0x11, 0xB9, 0xE6, + 0x00, 0x0D, 0xEF, 0xE9, 0xC7, 0xF9, 0xBE, 0xED, 0xBE, 0xF7, 0xFC, 0xF1, + 0x7E, 0x00, 0xC9, 0xFB, 0x89, 0xF6, 0xEC, 0xFB, 0x14, 0xF0, 0x58, 0xF3, + 0x49, 0xF2, 0x68, 0xF3, 0xC5, 0xE3, 0x32, 0xF5, 0x1A, 0xE1, 0x46, 0xF7, + 0xD1, 0xF6, 0x3C, 0xF8, 0x5F, 0xFE, 0x34, 0xF0, 0x57, 0xFE, 0xC2, 0xEB, + 0xD7, 0xFD, 0xD9, 0xEB, 0xFC, 0xEC, 0x3E, 0xE8, 0xE6, 0xE5, 0x1B, 0xE8, + 0x3C, 0xEE, 0x89, 0xE8, 0x47, 0xED, 0x1F, 0xE2, 0xC5, 0xF0, 0x76, 0xE8, + 0x4D, 0xF1, 0xC4, 0xEF, 0x74, 0xE6, 0x68, 0xE8, 0x00, 0xE2, 0x20, 0xE5, + 0x61, 0xDE, 0x79, 0xE6, 0xFF, 0xDE, 0xE4, 0xE4, 0x74, 0xEC, 0x16, 0xE5, + 0xA3, 0xFB, 0xD5, 0xE0, 0xCF, 0xFD, 0x38, 0xD9, 0xB4, 0xF1, 0x10, 0xDC, + 0xE7, 0xD8, 0xC5, 0xDB, 0xF6, 0xC4, 0x1A, 0xD1, 0x70, 0xCD, 0xAB, 0xCF, + 0x96, 0xE2, 0xF6, 0xD8, 0xA5, 0xEF, 0x4F, 0xE0, 0x3E, 0xF7, 0x40, 0xE4, + 0xD8, 0x00, 0xDD, 0xE6, 0x2D, 0x07, 0x17, 0xE3, 0x23, 0xFD, 0xF0, 0xDC, + 0x49, 0xF0, 0x35, 0xE2, 0x55, 0xE9, 0x1B, 0xE9, 0x7F, 0xE9, 0x2B, 0xE4, + 0xA6, 0xF0, 0x80, 0xDF, 0x1D, 0xF3, 0xA9, 0xE4, 0xA7, 0xF0, 0x10, 0xEE, + 0xA8, 0xE6, 0x0D, 0xEF, 0x27, 0xDB, 0x73, 0xE6, 0xA0, 0xD7, 0xA9, 0xE1, + 0x95, 0xD5, 0x3A, 0xEB, 0x73, 0xD5, 0x6E, 0xFA, 0x5A, 0xE4, 0xA0, 0x05, + 0xDF, 0xFD, 0xCC, 0x0B, 0x6A, 0x07, 0x0C, 0x07, 0x8A, 0x08, 0x43, 0x0E, + 0x12, 0x0D, 0x0C, 0x17, 0x5A, 0x0C, 0x7D, 0x09, 0xAD, 0x0A, 0x2E, 0xFB, + 0xD8, 0x10, 0x26, 0xFC, 0x40, 0x1A, 0x9D, 0x03, 0xDF, 0x1C, 0x6A, 0x04, + 0x13, 0x17, 0xD4, 0xFF, 0xB0, 0x18, 0x8B, 0xFD, 0x3D, 0x21, 0xE5, 0x02, + 0x79, 0x1A, 0xD5, 0x03, 0x48, 0x10, 0x60, 0x01, 0x2F, 0x0E, 0xC4, 0xFF, + 0x97, 0x12, 0x5D, 0xFE, 0x40, 0x1E, 0x52, 0x06, 0xE7, 0x2A, 0x63, 0x11, + 0x57, 0x24, 0x83, 0x0B, 0x65, 0x08, 0x4F, 0xFC, 0x79, 0xFC, 0x98, 0xF9, + 0x35, 0x02, 0x38, 0xF5, 0xD4, 0x06, 0xF3, 0xEE, 0xFC, 0x0A, 0xDF, 0xF2, + 0x83, 0x0D, 0x71, 0xFC, 0xE8, 0x08, 0x24, 0xFF, 0xFF, 0x04, 0x2F, 0x02, + 0xA1, 0xFA, 0x83, 0x08, 0x27, 0xE8, 0x22, 0x0C, 0xC8, 0xEC, 0x74, 0x19, + 0x35, 0xFD, 0x81, 0x1F, 0x6E, 0xFD, 0xA0, 0x13, 0xEF, 0xF8, 0xEE, 0x02, + 0x33, 0xF5, 0x9E, 0xF1, 0xB4, 0xEB, 0xB9, 0xE2, 0x8C, 0xEE, 0xC8, 0xE3, + 0x79, 0xF9, 0x45, 0xF3, 0x03, 0xF5, 0xBF, 0xFB, 0x49, 0xF1, 0xAD, 0xFE, + 0xFD, 0x00, 0x26, 0x07, 0xE0, 0x0E, 0x2C, 0x06, 0xDF, 0x11, 0xE3, 0xF7, + 0x15, 0x0A, 0x32, 0xF2, 0x00, 0xF3, 0xAE, 0xF2, 0xDA, 0xE5, 0x03, 0xF4, + 0x7E, 0xEB, 0xC4, 0xF4, 0x47, 0xF8, 0x83, 0xF6, 0x6F, 0x03, 0x63, 0xFE, + 0xF2, 0x00, 0xCF, 0x01, 0x73, 0xF8, 0x06, 0x01, 0xFE, 0xF6, 0xD2, 0xFD, + 0xC0, 0xFD, 0x03, 0xF9, 0xD7, 0x08, 0xDA, 0xFC, 0x68, 0x02, 0x65, 0x02, + 0x87, 0xF4, 0x6A, 0x01, 0x53, 0xF7, 0xD5, 0x01, 0x3F, 0xF8, 0xA9, 0x00, + 0xA4, 0xF1, 0xAF, 0xF8, 0xB5, 0xFA, 0xFD, 0xF7, 0x52, 0x0A, 0x67, 0xF9, + 0xFF, 0x1B, 0xE2, 0x01, 0x8B, 0x2A, 0xE7, 0x14, 0x51, 0x20, 0xDC, 0x19, + 0x8B, 0x20, 0x62, 0x23, 0xB7, 0x26, 0x08, 0x26, 0xE9, 0x20, 0x2C, 0x17, + 0x7B, 0x26, 0x9E, 0x12, 0xC1, 0x25, 0x32, 0x18, 0xE5, 0x13, 0x71, 0x1E, + 0x5B, 0x06, 0xBA, 0x1D, 0x5F, 0x0A, 0x5A, 0x1E, 0xB6, 0x10, 0xF9, 0x19, + 0x9C, 0x07, 0xE6, 0x0B, 0x20, 0x03, 0xFE, 0x0F, 0xAA, 0x06, 0x7C, 0x18, + 0x54, 0x0B, 0xAE, 0x12, 0x91, 0x17, 0x9E, 0x0D, 0x26, 0x1E, 0x94, 0x05, + 0x0D, 0x18, 0x36, 0xFC, 0x92, 0x1A, 0x1D, 0x02, 0x39, 0x23, 0xA6, 0x0B, + 0x24, 0x23, 0xE7, 0x07, 0x38, 0x24, 0x92, 0x0B, 0xCC, 0x1E, 0x4C, 0x17, + 0x4D, 0x14, 0x60, 0x15, 0xA7, 0x14, 0x4B, 0x11, 0x28, 0x15, 0xFC, 0x11, + 0x05, 0x0F, 0x83, 0x16, 0x63, 0x0C, 0xED, 0x1A, 0xC8, 0x13, 0x08, 0x16, + 0x96, 0x1D, 0x47, 0x11, 0x01, 0x22, 0x46, 0x0F, 0x1C, 0x21, 0xE2, 0x0E, + 0xCB, 0x15, 0x87, 0x11, 0x7C, 0x0C, 0x10, 0x17, 0x29, 0x0B, 0x83, 0x12, + 0xC5, 0x13, 0x9E, 0x0E, 0xE1, 0x13, 0xA2, 0x14, 0xF5, 0x04, 0x56, 0x17, + 0x6E, 0x03, 0x89, 0x14, 0xC8, 0x0B, 0xD5, 0x0B, 0x3A, 0x0C, 0x02, 0xFF, + 0x52, 0x05, 0xEC, 0xF7, 0x26, 0x06, 0xA9, 0xFF, 0xBB, 0x0F, 0xBF, 0x0A, + 0xFA, 0x18, 0xA0, 0x13, 0xA5, 0x11, 0xC4, 0x10, 0xBF, 0x06, 0x8D, 0x0C, + 0x26, 0x0A, 0xC9, 0x16, 0x90, 0x05, 0xC2, 0x1D, 0xBF, 0xF8, 0x49, 0x1C, + 0x23, 0xF3, 0x7E, 0x18, 0x89, 0xEE, 0x27, 0x15, 0xF3, 0xF0, 0xC3, 0x1C, + 0x2A, 0x07, 0x0D, 0x2B, 0x30, 0x1F, 0x66, 0x31, 0xED, 0x23, 0x35, 0x32, + 0xC3, 0x1E, 0xC5, 0x2F, 0xBE, 0x15, 0x54, 0x2A, 0x76, 0x07, 0x8B, 0x23, + 0x40, 0x05, 0xE9, 0x20, 0x3E, 0x0F, 0xB2, 0x22, 0xEF, 0x15, 0x9E, 0x20, + 0x9C, 0x1B, 0xE8, 0x20, 0xC7, 0x1E, 0x15, 0x1A, 0xFB, 0x19, 0xD7, 0x07, + 0x73, 0x19, 0x00, 0x03, 0x6E, 0x16, 0xE9, 0x0B, 0x48, 0x05, 0x9C, 0x14, + 0x09, 0x04, 0xA1, 0x1E, 0x93, 0x0D, 0x13, 0x19, 0x05, 0x10, 0x18, 0x0A, + 0xA5, 0x14, 0xCE, 0x09, 0x11, 0x18, 0x53, 0x0C, 0x29, 0x18, 0x0D, 0x0C, + 0xEA, 0x14, 0x4B, 0x09, 0xDE, 0x14, 0x6C, 0x04, 0x90, 0x1B, 0xE3, 0x01, + 0xD8, 0x1E, 0x4F, 0x06, 0xDB, 0x1B, 0xD7, 0x0D, 0xA9, 0x15, 0x43, 0x0C, + 0x04, 0x0F, 0x9C, 0x06, 0xAB, 0x14, 0xC3, 0x0E, 0x1C, 0x13, 0xB5, 0x1E, + 0xCA, 0x01, 0x1E, 0x21, 0xEA, 0xFB, 0x8B, 0x1C, 0x9D, 0xFD, 0xB8, 0x17, + 0x2C, 0xFD, 0xB5, 0x12, 0xB9, 0xFE, 0x05, 0x13, 0x1F, 0xFD, 0xF4, 0x0E, + 0x8B, 0xF8, 0xDA, 0x06, 0xD1, 0xFA, 0x0A, 0x0B, 0x00, 0xFD, 0x66, 0x1B, + 0x64, 0xF9, 0xE7, 0x2B, 0xB0, 0x00, 0xB4, 0x33, 0x17, 0x12, 0x0C, 0x32, + 0x5A, 0x1B, 0xDE, 0x2D, 0xC7, 0x16, 0x0D, 0x2B, 0x80, 0x0B, 0x7D, 0x24, + 0x50, 0x03, 0x96, 0x18, 0x5F, 0x09, 0x2C, 0x12, 0xA3, 0x19, 0x03, 0x12, + 0xBF, 0x16, 0xC4, 0x0C, 0x45, 0x08, 0x70, 0x07, 0xC0, 0x07, 0x8D, 0x05, + 0x51, 0x0C, 0x18, 0x01, 0xB9, 0x10, 0xB9, 0xFC, 0x96, 0x17, 0x1D, 0xFF, + 0x27, 0x17, 0x85, 0x02, 0x49, 0x13, 0x84, 0x00, 0x73, 0x1C, 0x08, 0x06, + 0xD2, 0x1D, 0x00, 0x0D, 0xE4, 0x10, 0xC2, 0x09, 0x4D, 0x13, 0xF1, 0x08, + 0xF7, 0x1C, 0x1D, 0x11, 0x2A, 0x1A, 0xD7, 0x12, 0xFC, 0x12, 0x33, 0x0B, + 0x4E, 0x10, 0x55, 0x0A, 0xBF, 0x0B, 0xC2, 0x06, 0x0D, 0x08, 0x0C, 0xFD, + 0x9F, 0x10, 0x33, 0x03, 0xD1, 0x13, 0x1A, 0x12, 0x56, 0x07, 0xAE, 0x16, + 0x5B, 0xFC, 0x99, 0x13, 0x4B, 0xF8, 0xA0, 0x0E, 0xD7, 0xF5, 0xB4, 0x06, + 0xC8, 0xF2, 0x15, 0x02, 0xA0, 0xEE, 0xB3, 0x04, 0x34, 0xE7, 0x0D, 0x01, + 0xFE, 0xE2, 0x4B, 0xF8, 0x23, 0xEA, 0xFD, 0xF8, 0x3B, 0xFE, 0xE0, 0xFF, + 0x1A, 0x09, 0x08, 0xFA, 0x3C, 0x04, 0xCE, 0xEC, 0x83, 0x05, 0x19, 0xEC, + 0x22, 0x09, 0x12, 0xF1, 0xDE, 0x01, 0xDC, 0xED, 0x96, 0xF5, 0x4D, 0xE9, + 0x64, 0xF4, 0xAB, 0xF5, 0x83, 0xF1, 0x6A, 0x06, 0x3A, 0xE1, 0x19, 0x08, + 0xD6, 0xD4, 0x6A, 0x05, 0xAE, 0xC7, 0x3D, 0xFD, 0xEB, 0xC3, 0x11, 0xF1, + 0x44, 0xD8, 0x6D, 0xF2, 0xE3, 0xE6, 0x77, 0xF5, 0x87, 0xE9, 0x2E, 0xF0, + 0xA4, 0xEE, 0x2B, 0xF2, 0x02, 0xEC, 0x0F, 0xF9, 0x4F, 0xE4, 0xD1, 0xFE, + 0x82, 0xE3, 0x0D, 0x00, 0xA6, 0xE5, 0x91, 0xFA, 0xB7, 0xEC, 0xE8, 0xFE, + 0x22, 0xF5, 0xB8, 0x03, 0xFB, 0xF8, 0xAB, 0xFE, 0xFD, 0x00, 0xF5, 0xFA, + 0xE3, 0x00, 0xA6, 0xF2, 0x61, 0xF4, 0x94, 0xEE, 0x0C, 0xF0, 0x08, 0xF5, + 0x45, 0xF1, 0x4F, 0xF2, 0x5B, 0xF6, 0x35, 0xEA, 0xF0, 0x05, 0x50, 0xE6, + 0x11, 0x0D, 0x16, 0xDD, 0x39, 0x0D, 0xC0, 0xD7, 0x29, 0x0F, 0x7C, 0xDD, + 0x12, 0x09, 0x93, 0xE2, 0xB6, 0xFE, 0x00, 0xE9, 0x85, 0xF4, 0xE5, 0xEF, + 0xEF, 0xF2, 0x13, 0xF7, 0x0D, 0x00, 0xD2, 0xFE, 0x66, 0x0C, 0x5E, 0x02, + 0x4E, 0x08, 0xEF, 0x00, 0x1F, 0xFC, 0x6A, 0xFB, 0x4F, 0xF8, 0xD9, 0xF9, + 0x7E, 0xFE, 0x43, 0x00, 0xF8, 0x02, 0x96, 0x08, 0x7D, 0xFD, 0x36, 0x08, + 0x1C, 0xF8, 0x6C, 0x06, 0x57, 0xF9, 0xD1, 0x04, 0x89, 0xF7, 0x77, 0xFE, + 0x7F, 0xEF, 0x4E, 0xF5, 0x76, 0xE3, 0xF5, 0xE6, 0x64, 0xDE, 0x93, 0xE8, + 0x1D, 0xE0, 0x8B, 0xF6, 0x32, 0xE5, 0x9D, 0xFB, 0x83, 0xF7, 0xA9, 0xFB, + 0x4D, 0x08, 0x9A, 0xF7, 0x95, 0x01, 0x8F, 0xF0, 0x4E, 0xEC, 0x6C, 0xE6, + 0x64, 0xE7, 0xFF, 0xDE, 0xBF, 0xED, 0xD6, 0xD9, 0x6A, 0xEC, 0xEB, 0xD7, + 0x6C, 0xE8, 0xEA, 0xDF, 0xBF, 0xE6, 0x8B, 0xE4, 0xAA, 0xE5, 0x3D, 0xDA, + 0xAF, 0xE2, 0x42, 0xD1, 0x93, 0xDA, 0x78, 0xD3, 0xE8, 0xCA, 0x11, 0xDA, + 0x5E, 0xC2, 0x62, 0xE1, 0x24, 0xCB, 0xCD, 0xDD, 0x4A, 0xD8, 0xA5, 0xD6, + 0x9F, 0xDE, 0xE1, 0xD9, 0x59, 0xDC, 0x19, 0xD6, 0x7D, 0xDD, 0x77, 0xCF, + 0xE9, 0xE6, 0xB0, 0xD6, 0x20, 0xE2, 0x76, 0xDA, 0xBC, 0xD6, 0x1B, 0xD7, + 0x87, 0xDA, 0xEC, 0xE0, 0x77, 0xE4, 0xA9, 0xED, 0x36, 0xEE, 0xA1, 0xF0, + 0x6A, 0xF7, 0xC2, 0xF7, 0xE4, 0xF7, 0x9E, 0xFF, 0x1E, 0xEF, 0xB8, 0x03, + 0x0A, 0xEA, 0xE6, 0x06, 0x38, 0xEE, 0x3E, 0x06, 0x7A, 0xF5, 0xFC, 0xFC, + 0x4F, 0xF6, 0xB2, 0xEF, 0xF9, 0xF0, 0x59, 0xEF, 0xEE, 0xEC, 0xDF, 0xEF, + 0xC8, 0xE8, 0xED, 0xE5, 0xDC, 0xEA, 0x74, 0xE1, 0x96, 0xF2, 0x91, 0xE4, + 0x6F, 0xEE, 0xE4, 0xE6, 0x67, 0xEC, 0x3E, 0xE8, 0xB3, 0xF9, 0xBF, 0xE8, + 0xB7, 0xFF, 0xB1, 0xE1, 0xD8, 0xFD, 0xF0, 0xD9, 0xB1, 0x01, 0x93, 0xD9, + 0x0F, 0x06, 0x86, 0xDA, 0x46, 0x07, 0xCE, 0xDF, 0xAC, 0x06, 0x93, 0xEA, + 0x40, 0x03, 0x04, 0xF5, 0x59, 0xFA, 0x36, 0xF5, 0x95, 0xF4, 0xD5, 0xEF, + 0xB2, 0xF4, 0xEF, 0xEC, 0x00, 0xF2, 0xFD, 0xE8, 0xE9, 0xE8, 0x8E, 0xE2, + 0x5D, 0xDE, 0xED, 0xDF, 0xFC, 0xDF, 0x39, 0xE7, 0x0E, 0xEA, 0xA5, 0xED, + 0x3D, 0xEF, 0xFA, 0xEB, 0xDC, 0xEC, 0xF3, 0xEB, 0x51, 0xDE, 0x30, 0xEC, + 0x15, 0xD6, 0x45, 0xEF, 0x0E, 0xDD, 0xD2, 0xF5, 0x9D, 0xE1, 0x29, 0xF1, + 0xBE, 0xE6, 0x80, 0xE9, 0x13, 0xEC, 0xD2, 0xE6, 0xBE, 0xEC, 0x54, 0xE5, + 0xEA, 0xEF, 0x3D, 0xE6, 0xD9, 0xFA, 0x89, 0xEB, 0xBD, 0x00, 0x5A, 0xED, + 0xD2, 0x00, 0xD7, 0xED, 0xFF, 0x03, 0x14, 0xED, 0x93, 0x02, 0xAC, 0xE7, + 0xBF, 0xFA, 0x16, 0xE3, 0x08, 0xF0, 0x46, 0xE0, 0x5D, 0xE4, 0x6B, 0xE0, + 0xBA, 0xE0, 0x84, 0xEA, 0x4C, 0xEB, 0xFB, 0xF5, 0x64, 0xFF, 0x1B, 0xF0, + 0x93, 0x09, 0xC4, 0xE6, 0x19, 0x03, 0xAF, 0xE7, 0x79, 0x00, 0xFA, 0xED, + 0xE6, 0x03, 0xC2, 0xF2, 0x01, 0x06, 0x29, 0xF6, 0xB4, 0x05, 0xBD, 0xFB, + 0xA6, 0xFD, 0xEC, 0x05, 0xE5, 0xF3, 0xB7, 0x0C, 0xEF, 0xF7, 0x02, 0x09, + 0x7B, 0xFF, 0x3A, 0xFB, 0x76, 0xF7, 0xDD, 0xE9, 0xAA, 0xF1, 0x8D, 0xF1, + 0xF7, 0xEF, 0x5F, 0x05, 0xE8, 0xF3, 0x31, 0x09, 0xF1, 0x05, 0xC2, 0x08, + 0xA4, 0x0F, 0xE2, 0x10, 0x71, 0x0F, 0x53, 0x1A, 0xA9, 0x0F, 0x0B, 0x19, + 0xCE, 0x0D, 0x09, 0x17, 0x00, 0x08, 0x88, 0x1C, 0xD7, 0x00, 0x3E, 0x1C, + 0x9E, 0x02, 0xD9, 0x1A, 0xBA, 0x09, 0x60, 0x21, 0xC0, 0x12, 0x49, 0x21, + 0x89, 0x22, 0x71, 0x1A, 0x84, 0x29, 0x95, 0x18, 0xC2, 0x1F, 0x39, 0x15, + 0xDD, 0x10, 0xE2, 0x0B, 0x9C, 0x09, 0x1E, 0x09, 0x37, 0x0C, 0x6E, 0x0B, + 0x4E, 0x0E, 0x25, 0x0A, 0x9D, 0x15, 0xD2, 0x0C, 0xDF, 0x1D, 0xC7, 0x0F, + 0x47, 0x18, 0xE0, 0x08, 0x6C, 0x0E, 0xDA, 0x05, 0xA4, 0x06, 0x97, 0x0A, + 0xBD, 0xF8, 0xA2, 0x0A, 0x07, 0xF3, 0x9B, 0x0E, 0x1F, 0x00, 0xA4, 0x12, + 0x32, 0x08, 0x88, 0x0A, 0xAD, 0x03, 0xB2, 0x09, 0x3D, 0x01, 0xB2, 0x0C, + 0x83, 0x04, 0xB7, 0x02, 0x6B, 0x09, 0x55, 0xF7, 0xE4, 0x10, 0xF0, 0xF1, + 0x1B, 0x18, 0xA3, 0xEE, 0xA1, 0x15, 0xA7, 0xE8, 0x76, 0x12, 0x9D, 0xE5, + 0xB0, 0x0F, 0x21, 0xE6, 0x83, 0x03, 0x32, 0xEA, 0xBF, 0x00, 0x62, 0xF7, + 0x26, 0x02, 0xA8, 0x01, 0xCA, 0xFA, 0x68, 0x07, 0xC7, 0x00, 0xDA, 0x0B, + 0x43, 0x14, 0x46, 0x0A, 0x66, 0x23, 0xC4, 0x0B, 0x0C, 0x28, 0x50, 0x0A, + 0x15, 0x26, 0x00, 0x05, 0x33, 0x23, 0x84, 0x0B, 0xFB, 0x1C, 0xB0, 0x15, + 0x8C, 0x19, 0x8D, 0x1A, 0xD1, 0x1B, 0x94, 0x1E, 0x9D, 0x1C, 0x1C, 0x23, + 0x92, 0x1C, 0xBD, 0x26, 0x0A, 0x13, 0x65, 0x28, 0xCC, 0x02, 0x7E, 0x29, + 0x0E, 0x00, 0x4A, 0x27, 0x86, 0x05, 0x56, 0x22, 0xD6, 0x06, 0x43, 0x1F, + 0xE3, 0x08, 0x93, 0x1C, 0x21, 0x04, 0x16, 0x19, 0xA7, 0x02, 0xC2, 0x1F, + 0x63, 0x07, 0xD2, 0x1D, 0xAA, 0x05, 0x23, 0x0D, 0xEA, 0x0B, 0xC7, 0x07, + 0x7C, 0x18, 0xB6, 0x01, 0xEC, 0x19, 0x14, 0xF5, 0xD8, 0x15, 0xB1, 0xF7, + 0x1D, 0x17, 0x58, 0xFF, 0x79, 0x19, 0x26, 0xFD, 0x09, 0x17, 0x1C, 0x00, + 0xB6, 0x10, 0x1F, 0x07, 0x32, 0x0D, 0x60, 0x07, 0x8B, 0x0D, 0x1C, 0x03, + 0x30, 0x0F, 0x5A, 0xFD, 0x90, 0x0C, 0xEA, 0xF7, 0xC5, 0x03, 0xD7, 0xF4, + 0x54, 0x00, 0x8D, 0xF7, 0xB7, 0x01, 0xF4, 0xFB, 0x58, 0x00, 0x1D, 0xFE, + 0xFA, 0xFB, 0x07, 0xFF, 0xA7, 0xFB, 0xBA, 0xFE, 0x90, 0x06, 0x08, 0x04, + 0x34, 0x16, 0xD4, 0x0A, 0xF0, 0x1B, 0xB2, 0x0D, 0x45, 0x11, 0xEF, 0x15, + 0x3A, 0x00, 0xF9, 0x20, 0xF9, 0xFD, 0x61, 0x27, 0x1A, 0x0B, 0x23, 0x27, + 0xCC, 0x0F, 0xA9, 0x1E, 0x9E, 0x07, 0x9C, 0x1A, 0x82, 0x03, 0x53, 0x1F, + 0x6C, 0x06, 0x54, 0x1E, 0x6E, 0x0B, 0x0C, 0x12, 0x39, 0x11, 0x95, 0x0B, + 0xAC, 0x11, 0x69, 0x12, 0x09, 0x15, 0xAE, 0x18, 0x75, 0x1D, 0x21, 0x1E, + 0xCA, 0x19, 0x78, 0x23, 0x1C, 0x11, 0xE5, 0x25, 0xE1, 0x09, 0x8F, 0x27, + 0xBE, 0x07, 0x8F, 0x28, 0xB2, 0x10, 0x25, 0x21, 0x48, 0x1D, 0x95, 0x16, + 0xD4, 0x20, 0xB3, 0x13, 0x8C, 0x1A, 0x68, 0x17, 0x48, 0x16, 0x95, 0x15, + 0xD6, 0x13, 0x85, 0x0A, 0x41, 0x0F, 0xA2, 0x05, 0x23, 0x07, 0x8F, 0x06, + 0x46, 0x01, 0xB6, 0x07, 0x3C, 0x01, 0x72, 0x03, 0x32, 0x09, 0xBA, 0xFF, + 0xB7, 0x17, 0x38, 0x05, 0xFF, 0x1B, 0x39, 0x07, 0x5E, 0x12, 0xC4, 0x07, + 0xAE, 0x03, 0x4E, 0x0C, 0xA0, 0xFB, 0x93, 0x0F, 0xC1, 0x05, 0xF4, 0x0C, + 0x1A, 0x15, 0x03, 0x04, 0x48, 0x1C, 0x28, 0x03, 0x3B, 0x1C, 0xED, 0x07, + 0x06, 0x14, 0x82, 0x08, 0x08, 0x0D, 0xC9, 0x0D, 0xB8, 0x0B, 0x4C, 0x17, + 0xFD, 0x08, 0x63, 0x1B, 0x22, 0x08, 0x10, 0x1D, 0x51, 0x09, 0xF1, 0x20, + 0x5B, 0x0B, 0x2B, 0x1D, 0x0A, 0x12, 0x75, 0x14, 0x5F, 0x0F, 0xA9, 0x0F, + 0x53, 0xFD, 0x6B, 0x0D, 0x4A, 0xF3, 0xF7, 0x10, 0x10, 0xF9, 0x48, 0x13, + 0xF0, 0x00, 0x9C, 0x12, 0x82, 0x04, 0x7C, 0x0D, 0x3E, 0x09, 0xC2, 0xFD, + 0x32, 0x10, 0xA0, 0xF1, 0x5A, 0x13, 0xAD, 0xF2, 0x01, 0x0D, 0xB6, 0xF9, + 0x25, 0x00, 0x63, 0x00, 0xEE, 0xFF, 0xDD, 0x08, 0x81, 0x08, 0x74, 0x11, + 0xAC, 0x0B, 0x01, 0x17, 0x8E, 0x10, 0x1E, 0x1A, 0x19, 0x0F, 0xF0, 0x16, + 0xA0, 0x02, 0xE7, 0x13, 0xF5, 0xFB, 0x62, 0x11, 0x84, 0xFF, 0xDF, 0x0A, + 0xD7, 0x03, 0x3F, 0x09, 0x08, 0x04, 0xE0, 0x0C, 0x54, 0x06, 0x61, 0x0B, + 0x58, 0x0E, 0xC2, 0x07, 0x01, 0x10, 0x68, 0x0A, 0x48, 0x09, 0x4C, 0x10, + 0xC4, 0x03, 0x40, 0x17, 0x3D, 0xF9, 0xAA, 0x1B, 0x10, 0xF5, 0xF7, 0x1F, + 0x3B, 0x09, 0xE6, 0x24, 0xEF, 0x1B, 0xF7, 0x1D, 0x2B, 0x1B, 0xEE, 0x15, + 0xBD, 0x16, 0xCB, 0x16, 0x48, 0x11, 0xC2, 0x0F, 0x85, 0x0D, 0x9A, 0x05, + 0xD7, 0x11, 0x9B, 0x05, 0xE9, 0x14, 0x37, 0x07, 0x09, 0x13, 0xE8, 0x05, + 0x43, 0x14, 0x90, 0x0C, 0x90, 0x13, 0x5C, 0x11, 0x2F, 0x0B, 0x88, 0x0E, + 0xE1, 0xFF, 0xA5, 0x13, 0x70, 0xF8, 0x5C, 0x18, 0x60, 0xFE, 0x99, 0x16, + 0xF1, 0x0E, 0x99, 0x12, 0xEF, 0x16, 0xC8, 0x0A, 0x9D, 0x0D, 0x80, 0x08, + 0xF7, 0x02, 0x7B, 0x0B, 0xDC, 0x04, 0x9A, 0x05, 0x86, 0x0B, 0x8D, 0xFA, + 0x0D, 0x08, 0xB1, 0xF8, 0x7F, 0xFB, 0xD4, 0xFD, 0xC7, 0xF1, 0xB1, 0xFC, + 0xF9, 0xEC, 0x49, 0xFA, 0xF3, 0xE8, 0x46, 0xFA, 0x6F, 0xE6, 0x7F, 0xF6, + 0x7A, 0xE1, 0xA1, 0xF3, 0xEE, 0xDF, 0xC3, 0xF3, 0x6E, 0xEB, 0x0F, 0xF3, + 0xF4, 0xF3, 0xBC, 0xF1, 0x1E, 0xF8, 0x49, 0xF8, 0x17, 0xFC, 0xBD, 0x00, + 0x61, 0xFC, 0xB8, 0x03, 0xE6, 0xFD, 0x3E, 0x06, 0xF3, 0x02, 0x5A, 0x0B, + 0xD1, 0x01, 0xFC, 0x0B, 0x2B, 0xF2, 0xAB, 0x03, 0x2C, 0xEB, 0x7A, 0xFE, + 0xB8, 0xF7, 0x31, 0xFD, 0xAA, 0x01, 0xB3, 0xFA, 0x2A, 0xFE, 0xEC, 0xF7, + 0x52, 0xF3, 0x80, 0xF6, 0xCE, 0xE9, 0x49, 0xF7, 0x27, 0xE7, 0x69, 0xF7, + 0xBB, 0xEF, 0x54, 0xF4, 0xFE, 0xFC, 0x5A, 0xF1, 0x2A, 0xFB, 0xDF, 0xF0, + 0x8B, 0xF3, 0x3E, 0xF3, 0xDA, 0xF0, 0x06, 0xF1, 0x1A, 0xF1, 0x11, 0xE8, + 0xD4, 0xF9, 0x0A, 0xE7, 0x99, 0xFA, 0x2D, 0xEA, 0x08, 0xF6, 0x46, 0xEE, + 0xA8, 0xF4, 0x88, 0xF9, 0x6A, 0xEC, 0x20, 0x03, 0xF4, 0xE4, 0x72, 0x04, + 0x15, 0xE8, 0x6A, 0x02, 0x89, 0xF1, 0x76, 0xFF, 0x5E, 0xF6, 0xC8, 0xF9, + 0xC0, 0xFA, 0xF9, 0xF1, 0x99, 0x02, 0x02, 0xE9, 0x25, 0x04, 0xA7, 0xDF, + 0xD8, 0x00, 0xDE, 0xDB, 0xCF, 0xFC, 0x43, 0xE1, 0x35, 0xF9, 0x4C, 0xEC, + 0x86, 0xF2, 0xAD, 0xF4, 0x23, 0xEE, 0x89, 0xF8, 0xED, 0xF4, 0xF3, 0xF7, + 0x6E, 0xFD, 0x00, 0xEF, 0xC9, 0xFF, 0x63, 0xE8, 0x5A, 0xF7, 0xE4, 0xE9, + 0x66, 0xEA, 0x91, 0xE8, 0x45, 0xE6, 0xE1, 0xE7, 0xBD, 0xE8, 0x34, 0xED, + 0x4F, 0xED, 0x89, 0xF0, 0xB1, 0xF1, 0x17, 0xF3, 0x22, 0xF1, 0x73, 0xF3, + 0xCF, 0xEB, 0xF4, 0xEE, 0xE1, 0xE6, 0x7E, 0xED, 0x80, 0xE1, 0x17, 0xE8, + 0x97, 0xDD, 0x23, 0xE0, 0x1B, 0xDE, 0x0A, 0xE3, 0xBD, 0xDE, 0x68, 0xEA, + 0x13, 0xE4, 0x26, 0xF3, 0xAB, 0xEC, 0x28, 0xFC, 0x69, 0xEB, 0x52, 0xFE, + 0x24, 0xE7, 0xAB, 0xFD, 0x9F, 0xE6, 0x0E, 0xFD, 0x7F, 0xE2, 0xA9, 0xFB, + 0x5F, 0xE8, 0x25, 0xF8, 0x39, 0xF8, 0xD1, 0xF2, 0x3D, 0xF6, 0x19, 0xF2, + 0x33, 0xEF, 0xF6, 0xF6, 0x6A, 0xF3, 0xB2, 0xF6, 0xC9, 0xF6, 0x19, 0xEC, + 0xE3, 0xF3, 0x2A, 0xE1, 0x2D, 0xEE, 0xA6, 0xDF, 0x20, 0xF6, 0x49, 0xE5, + 0x1F, 0x05, 0xFE, 0xE5, 0x7D, 0x07, 0x3A, 0xE6, 0x0F, 0xF7, 0x10, 0xEC, + 0x2B, 0xE0, 0x51, 0xED, 0xA6, 0xDC, 0xB6, 0xE7, 0x8B, 0xE7, 0x0A, 0xE3, + 0x7F, 0xF1, 0x8A, 0xE0, 0xC6, 0xF9, 0x54, 0xDF, 0x6B, 0x00, 0xAD, 0xE1, + 0x0A, 0x06, 0xDD, 0xE0, 0x07, 0x11, 0x2E, 0xE1, 0xE3, 0x16, 0xD0, 0xE8, + 0x94, 0x0A, 0x0E, 0xF2, 0xAD, 0xFD, 0x8D, 0xF9, 0xCD, 0xFA, 0x73, 0xFF, + 0xD9, 0xFB, 0x97, 0x04, 0x2D, 0xFF, 0xDB, 0x04, 0x2A, 0x01, 0x4F, 0x01, + 0x4A, 0xFE, 0x25, 0xFD, 0xB2, 0xF6, 0x06, 0xF9, 0x33, 0xEF, 0x24, 0xF4, + 0x44, 0xED, 0xBF, 0xED, 0xE9, 0xEC, 0x44, 0xED, 0x2E, 0xEB, 0x26, 0xF4, + 0x52, 0xEB, 0x1B, 0xFD, 0xF0, 0xEC, 0x55, 0x02, 0x8B, 0xE9, 0x65, 0x00, + 0xD2, 0xE0, 0xB3, 0x01, 0xB0, 0xD7, 0x47, 0x04, 0xB8, 0xD7, 0xC3, 0xFF, + 0xBA, 0xE6, 0x68, 0xF9, 0x29, 0xF7, 0xB5, 0xF5, 0x18, 0xF8, 0xD0, 0xF2, + 0xFC, 0xEC, 0x5E, 0xEB, 0xC7, 0xE7, 0xF1, 0xE0, 0xCC, 0xEC, 0x50, 0xD9, + 0x76, 0xF6, 0xC8, 0xD8, 0x74, 0xFA, 0x01, 0xDC, 0xAA, 0xF2, 0x63, 0xDB, + 0xA0, 0xE9, 0xBE, 0xD9, 0x8C, 0xEA, 0xF6, 0xDA, 0xE4, 0xF2, 0x59, 0xDA, + 0x3A, 0xF8, 0xBC, 0xD9, 0xE6, 0xF9, 0xC5, 0xDB, 0xAF, 0xF8, 0xE9, 0xDB, + 0x5E, 0xF9, 0x3A, 0xE3, 0x76, 0x00, 0xE1, 0xF0, 0xA7, 0x03, 0x7E, 0xF4, + 0xEA, 0x06, 0xB5, 0xF1, 0x3E, 0x0D, 0x7A, 0xF3, 0xCF, 0x0C, 0x3A, 0xF7, + 0x4F, 0x09, 0xFE, 0xF1, 0x4F, 0x08, 0x4C, 0xEE, 0x7A, 0x09, 0x21, 0xF3, + 0xE2, 0x0A, 0xFE, 0xF5, 0x39, 0x0B, 0x11, 0xFA, 0xE4, 0x06, 0x4D, 0xFD, + 0x5F, 0xF7, 0x07, 0xFF, 0x09, 0xE8, 0xB7, 0x01, 0x3F, 0xE4, 0xF7, 0xFD, + 0xBF, 0xE6, 0x08, 0xF7, 0x2A, 0xF0, 0xD8, 0xF6, 0xD3, 0xF6, 0x7B, 0xF5, + 0xE7, 0xF3, 0x65, 0xEF, 0x32, 0xF1, 0xB9, 0xEF, 0x41, 0xF3, 0x7D, 0xF3, + 0x3E, 0xFF, 0x6D, 0xF3, 0xCB, 0x0C, 0x92, 0xF0, 0xB9, 0x0C, 0xAD, 0xEF, + 0xB6, 0x03, 0x66, 0xF2, 0xBF, 0xFB, 0x96, 0xF8, 0x4E, 0xF1, 0xCE, 0xFB, + 0x46, 0xE7, 0x0A, 0xF8, 0xA3, 0xE9, 0x04, 0xF9, 0xC6, 0xF1, 0xB3, 0xFD, + 0x11, 0xF6, 0x7E, 0xFD, 0xB1, 0xF6, 0xF9, 0xFC, 0xC5, 0xF6, 0xD6, 0xFC, + 0x05, 0xF6, 0x8B, 0xFA, 0xAD, 0xEB, 0x66, 0xF8, 0x60, 0xE1, 0xCB, 0xF6, + 0xC4, 0xE1, 0xFD, 0xF2, 0x7F, 0xDF, 0xCE, 0xF0, 0x13, 0xDB, 0x2C, 0xF4, + 0xFA, 0xE1, 0x5F, 0xF4, 0x8A, 0xF2, 0xCA, 0xED, 0xEB, 0xFD, 0xC7, 0xEB, + 0xEE, 0xF8, 0x94, 0xF2, 0xEE, 0xEE, 0x07, 0xF6, 0x8F, 0xF2, 0x01, 0xF1, + 0xAF, 0x01, 0xF6, 0xE9, 0x1C, 0x0E, 0xDC, 0xE7, 0xAB, 0x12, 0xCC, 0xED, + 0xD6, 0x0F, 0xCA, 0xF1, 0x56, 0x07, 0x00, 0xEF, 0xAF, 0x00, 0xA6, 0xEE, + 0x38, 0xF8, 0xE6, 0xEB, 0x5D, 0xEC, 0x6A, 0xE7, 0xF1, 0xEB, 0x04, 0xEB, + 0xBC, 0xF5, 0xE7, 0xEC, 0x69, 0x00, 0x06, 0xEF, 0xF0, 0x06, 0xA1, 0xFA, + 0xC3, 0x04, 0xCB, 0x09, 0x6E, 0x00, 0xF5, 0x10, 0x26, 0xFE, 0xE7, 0x10, + 0x66, 0xFE, 0x54, 0x16, 0x48, 0x00, 0xCC, 0x19, 0x76, 0xFE, 0x8A, 0x16, + 0xFC, 0xFA, 0xBB, 0x0F, 0xDA, 0xFE, 0x15, 0x0A, 0x6F, 0x0A, 0xC4, 0x08, + 0x88, 0x10, 0xFB, 0x07, 0x08, 0x0B, 0x52, 0x0E, 0xBC, 0x06, 0x6F, 0x15, + 0x46, 0x06, 0x9C, 0x12, 0x65, 0x0F, 0x05, 0x10, 0x99, 0x1C, 0x39, 0x0F, + 0xC1, 0x15, 0xDE, 0x0C, 0x08, 0x0B, 0xCD, 0x10, 0x91, 0x0C, 0xF0, 0x17, + 0x08, 0x12, 0xC9, 0x1C, 0xF8, 0x17, 0x62, 0x1F, 0xEF, 0x1C, 0x0B, 0x19, + 0x66, 0x25, 0xDF, 0x0C, 0xD8, 0x30, 0xF6, 0x06, 0x2C, 0x32, 0x78, 0x03, + 0xE4, 0x26, 0xC8, 0xFB, 0x06, 0x1A, 0x55, 0xFC, 0x40, 0x0F, 0x62, 0x06, + 0xE7, 0x0E, 0x26, 0x0E, 0x95, 0x1C, 0x86, 0x16, 0x55, 0x27, 0xCA, 0x1C, + 0x87, 0x22, 0x7D, 0x16, 0xE8, 0x0D, 0x26, 0x07, 0x7C, 0xFD, 0x3F, 0x01, + 0xB0, 0xFB, 0x8F, 0x01, 0x5C, 0xFD, 0xE7, 0xFC, 0x8A, 0xFF, 0x7B, 0x01, + 0x6E, 0x01, 0x72, 0x10, 0xA6, 0x02, 0x17, 0x1F, 0x81, 0x04, 0x7A, 0x28, + 0x2B, 0x08, 0x33, 0x2C, 0xF2, 0x06, 0x35, 0x2A, 0xB6, 0x04, 0xF6, 0x24, + 0xEB, 0x04, 0xB2, 0x21, 0xBD, 0x04, 0x60, 0x1E, 0x09, 0x07, 0x50, 0x1B, + 0x9F, 0x04, 0x89, 0x17, 0xFB, 0xFF, 0x75, 0x13, 0x23, 0x01, 0x0A, 0x10, + 0x22, 0x07, 0x6D, 0x07, 0xC6, 0x0A, 0x3B, 0x00, 0xA4, 0x0B, 0x8F, 0xFF, + 0x97, 0x0E, 0x7D, 0xFF, 0x62, 0x14, 0xB6, 0x05, 0xBF, 0x1D, 0xFD, 0x0C, + 0xC1, 0x23, 0x6E, 0x0D, 0x01, 0x26, 0x40, 0x15, 0x95, 0x22, 0x55, 0x21, + 0x6F, 0x16, 0x9A, 0x25, 0xC5, 0x11, 0x50, 0x27, 0xBF, 0x1A, 0xF0, 0x27, + 0xE0, 0x26, 0xB3, 0x23, 0x60, 0x2D, 0x35, 0x1E, 0x51, 0x29, 0xF1, 0x1B, + 0xD1, 0x24, 0x59, 0x1A, 0xF1, 0x23, 0xD3, 0x1C, 0xDC, 0x19, 0x76, 0x21, + 0x01, 0x15, 0x5C, 0x27, 0x6C, 0x1D, 0x8D, 0x2D, 0xD9, 0x20, 0xE1, 0x2B, + 0xFD, 0x19, 0xDA, 0x29, 0x46, 0x0E, 0x35, 0x29, 0x6F, 0x07, 0xA6, 0x22, + 0x6B, 0x08, 0xE0, 0x1B, 0xF5, 0x0B, 0x0E, 0x1D, 0x76, 0x0A, 0xB5, 0x21, + 0xAA, 0xFF, 0xAB, 0x23, 0x87, 0xF9, 0xBE, 0x1D, 0x2A, 0x02, 0x7D, 0x11, + 0x15, 0x0E, 0x8E, 0x05, 0x13, 0x16, 0x59, 0xFD, 0x9B, 0x19, 0xD5, 0xFC, + 0x2B, 0x17, 0x50, 0x02, 0x6D, 0x10, 0x32, 0x06, 0x6E, 0x0A, 0xA9, 0x08, + 0x55, 0x05, 0x9C, 0x07, 0x46, 0x03, 0x09, 0x03, 0x77, 0x01, 0xFE, 0xFF, + 0xAC, 0xFE, 0xB5, 0xFD, 0x0F, 0x05, 0x16, 0xFE, 0x97, 0x0D, 0xC9, 0xF9, + 0x38, 0x11, 0x18, 0xF4, 0xFA, 0x13, 0x47, 0xF5, 0xCA, 0x19, 0xAE, 0xF8, + 0x6A, 0x1F, 0xAE, 0xFD, 0xD4, 0x18, 0xAA, 0x06, 0xDE, 0x0A, 0x46, 0x12, + 0x66, 0x03, 0xC3, 0x19, 0x63, 0x05, 0xE0, 0x19, 0x5C, 0x0C, 0x94, 0x16, + 0x6E, 0x0A, 0x1F, 0x13, 0xBA, 0xFC, 0x3F, 0x11, 0x8F, 0xF5, 0x6D, 0x0F, + 0xEE, 0xFF, 0xEC, 0x0B, 0x33, 0x0F, 0x00, 0x0F, 0x56, 0x13, 0x54, 0x12, + 0x9F, 0x11, 0xA4, 0x12, 0xE6, 0x0D, 0x6D, 0x19, 0x01, 0x05, 0xBD, 0x1B, + 0x26, 0x02, 0x4D, 0x15, 0xEF, 0x03, 0x65, 0x13, 0x77, 0x02, 0xC9, 0x18, + 0x2F, 0x02, 0x48, 0x1A, 0x78, 0x02, 0x13, 0x16, 0x43, 0x03, 0xE5, 0x11, + 0x4F, 0x03, 0x16, 0x0D, 0xF7, 0x01, 0x3C, 0x09, 0x1F, 0x05, 0xD7, 0x08, + 0xCC, 0x0E, 0x4D, 0x0A, 0x60, 0x1B, 0x83, 0x0F, 0x51, 0x22, 0x04, 0x1A, + 0x56, 0x21, 0x6C, 0x20, 0xCA, 0x19, 0x03, 0x1D, 0xF5, 0x10, 0xEB, 0x13, + 0x3C, 0x0E, 0x6C, 0x06, 0xC4, 0x07, 0xCE, 0xFE, 0xA0, 0xFD, 0xC6, 0x01, + 0xA9, 0xFA, 0xE8, 0x02, 0x46, 0xF9, 0x6D, 0x0A, 0x76, 0xF6, 0x20, 0x1B, + 0xE9, 0xF5, 0xF0, 0x22, 0x75, 0xF7, 0x05, 0x1E, 0xB6, 0xF6, 0x61, 0x13, + 0xF6, 0xF1, 0x20, 0x0A, 0xA0, 0xF3, 0x06, 0x02, 0xA1, 0x01, 0xBF, 0xFB, + 0xAD, 0x0C, 0xF2, 0xF6, 0x42, 0x0F, 0x83, 0xF0, 0xDE, 0x13, 0xA9, 0xF3, + 0x50, 0x16, 0xA3, 0xFB, 0x07, 0x0F, 0x2E, 0xFB, 0xE6, 0x03, 0x6B, 0xF8, + 0x1E, 0xFE, 0x05, 0xF9, 0xC2, 0xFF, 0xD0, 0xFF, 0xA3, 0x03, 0xCD, 0x04, + 0xAC, 0x0B, 0x7D, 0xFF, 0xA3, 0x12, 0xAA, 0xF7, 0x43, 0x08, 0x1B, 0xF2, + 0x96, 0xFB, 0x6B, 0xF0, 0xF2, 0xFB, 0x01, 0xEE, 0x94, 0xF6, 0x53, 0xE8, + 0x57, 0xF0, 0x3A, 0xEE, 0xA7, 0xF6, 0xF6, 0xFB, 0x6D, 0xFA, 0xBE, 0x00, + 0xB1, 0xF6, 0x1A, 0xFD, 0x62, 0xF0, 0xB5, 0xF8, 0x4A, 0xEA, 0xF1, 0xF9, + 0x01, 0xEB, 0x7E, 0x02, 0xE4, 0xF1, 0x9A, 0x0D, 0xF9, 0xF2, 0xA5, 0x11, + 0x28, 0xF0, 0xF4, 0x10, 0xDB, 0xEF, 0xEB, 0x0D, 0x97, 0xED, 0x27, 0x04, + 0x57, 0xEE, 0x08, 0xFA, 0x14, 0xF0, 0x6A, 0xF4, 0xEF, 0xE6, 0x81, 0xF5, + 0xA4, 0xDD, 0x09, 0xFC, 0xFD, 0xDF, 0x6B, 0xFF, 0x25, 0xEC, 0xE4, 0xF9, + 0x74, 0xFC, 0x4A, 0xEE, 0xBA, 0x06, 0x06, 0xE8, 0xF6, 0x09, 0x24, 0xEB, + 0x56, 0x07, 0x3E, 0xF0, 0xE2, 0x06, 0x4A, 0xF2, 0xF8, 0x0B, 0xCA, 0xF6, + 0x9F, 0x0C, 0x4A, 0xFE, 0xC5, 0x09, 0x7D, 0xFE, 0x9F, 0x08, 0x97, 0xFA, + 0x62, 0x08, 0xEC, 0xF2, 0xB6, 0x06, 0x90, 0xEB, 0xEF, 0x00, 0x5E, 0xEE, + 0x4F, 0xFE, 0x5E, 0xF1, 0xB3, 0x04, 0x12, 0xF3, 0x66, 0x0B, 0x8F, 0xF9, + 0xE6, 0x08, 0x61, 0xFF, 0xE5, 0xF9, 0xC5, 0x03, 0x69, 0xEB, 0x1F, 0x06, + 0xE2, 0xE6, 0x30, 0xFE, 0x8D, 0xE8, 0x64, 0xF7, 0x85, 0xEA, 0x94, 0xFA, + 0x10, 0xE2, 0x0C, 0xFC, 0x94, 0xD8, 0x66, 0xFA, 0xE0, 0xDD, 0x95, 0xF8, + 0x6A, 0xEB, 0x97, 0xF6, 0xCF, 0xF6, 0xBA, 0xF1, 0xA0, 0xFF, 0x5F, 0xF0, + 0xCA, 0xFF, 0xE2, 0xF3, 0x2E, 0xF9, 0x31, 0xF7, 0x5A, 0xF9, 0x94, 0xFB, + 0xB1, 0xF9, 0x9D, 0xF9, 0xAF, 0xF2, 0x4F, 0xF7, 0x5E, 0xE7, 0xAF, 0xF9, + 0x65, 0xDF, 0x8B, 0xFB, 0x94, 0xE1, 0xBE, 0xF7, 0x6A, 0xE6, 0x55, 0xEC, + 0x57, 0xEB, 0x51, 0xE5, 0x0F, 0xF3, 0x7A, 0xE4, 0x65, 0xF6, 0xCF, 0xE4, + 0x57, 0xF0, 0x61, 0xE6, 0x19, 0xEA, 0xBE, 0xEB, 0xE4, 0xED, 0x0D, 0xF5, + 0x65, 0xF3, 0x47, 0xF9, 0xD8, 0xF7, 0xD5, 0xF4, 0xA5, 0x01, 0xE2, 0xF0, + 0xAA, 0x09, 0xF7, 0xED, 0x8A, 0x06, 0x0B, 0xE8, 0xFA, 0xF7, 0xA8, 0xE6, + 0x0E, 0xEB, 0xC4, 0xE9, 0xBB, 0xEC, 0x2A, 0xEE, 0x1F, 0xF6, 0x14, 0xF2, + 0xC5, 0xFB, 0x5C, 0xF5, 0x76, 0xFB, 0x4B, 0xF9, 0xE9, 0xF6, 0x96, 0xFA, + 0x2E, 0xF4, 0x27, 0xFA, 0x6F, 0xF5, 0xD2, 0xF6, 0xBA, 0xF5, 0xF5, 0xEC, + 0xC1, 0xF1, 0xBF, 0xE4, 0xBD, 0xEE, 0xF9, 0xE7, 0x91, 0xF4, 0x9C, 0xEF, + 0x5E, 0xF6, 0x50, 0xED, 0xAD, 0xEC, 0x9C, 0xE5, 0x16, 0xE6, 0xA9, 0xE5, + 0x31, 0xE7, 0xB3, 0xEB, 0x0B, 0xEF, 0x3D, 0xEE, 0x5F, 0xFA, 0x53, 0xED, + 0xC0, 0x00, 0x23, 0xEE, 0xD9, 0x03, 0x1D, 0xEC, 0x7D, 0x05, 0xBC, 0xE7, + 0x1C, 0x03, 0x37, 0xE5, 0x46, 0xFA, 0x89, 0xE4, 0x3C, 0xEC, 0xA4, 0xE7, + 0x52, 0xE2, 0x2E, 0xED, 0x9B, 0xE2, 0x06, 0xF3, 0x2D, 0xE9, 0xE0, 0xF3, + 0x3A, 0xEE, 0x0A, 0xEF, 0xC8, 0xEA, 0x21, 0xEB, 0x11, 0xE3, 0x6B, 0xEA, + 0xAE, 0xDF, 0x86, 0xEE, 0x1B, 0xDA, 0x63, 0xF3, 0x20, 0xD9, 0x93, 0xF6, + 0x59, 0xE6, 0x89, 0xFA, 0xF2, 0xF3, 0x29, 0xF8, 0x37, 0xFB, 0x2A, 0xEE, + 0xB7, 0xFD, 0x87, 0xE3, 0x4C, 0xF7, 0x5A, 0xDD, 0xC4, 0xE7, 0x71, 0xDA, + 0x7A, 0xE0, 0xCB, 0xDD, 0x51, 0xE4, 0x2E, 0xEA, 0xCD, 0xE9, 0x1C, 0xF5, + 0x56, 0xF5, 0xD9, 0xF9, 0x9B, 0xFD, 0x9D, 0xF6, 0x3B, 0xFA, 0x96, 0xF0, + 0xF9, 0xF3, 0xBF, 0xEC, 0xCC, 0xF2, 0xFF, 0xE8, 0xE4, 0xF4, 0x86, 0xE5, + 0x09, 0xF5, 0x2E, 0xE7, 0x9A, 0xF4, 0x0B, 0xF0, 0x4E, 0xF5, 0xE2, 0xF4, + 0xE1, 0xF6, 0x4A, 0xF3, 0xF2, 0xF8, 0x83, 0xF2, 0x2F, 0xF8, 0x2F, 0xF6, + 0xE6, 0xF4, 0x15, 0xFB, 0xEE, 0xF5, 0xF6, 0xFE, 0x60, 0xFB, 0xE9, 0x07, + 0xB7, 0xFD, 0x79, 0x0F, 0x60, 0xFD, 0xB1, 0x0E, 0x9F, 0x00, 0x6B, 0x0B, + 0xCD, 0x06, 0x40, 0x05, 0xBE, 0x0B, 0x95, 0xFF, 0x2A, 0x07, 0x4B, 0x01, + 0x1E, 0xF5, 0x35, 0x04, 0x33, 0xE8, 0x15, 0x04, 0xD7, 0xEE, 0xBF, 0x02, + 0xDC, 0xFD, 0xA6, 0x01, 0x5A, 0x04, 0x76, 0x02, 0xC6, 0xFF, 0x50, 0x01, + 0xB7, 0xF7, 0x14, 0x00, 0x01, 0xF2, 0x3D, 0x05, 0x14, 0xF5, 0x53, 0x08, + 0xD2, 0xFF, 0xE1, 0x04, 0xC4, 0x0B, 0x86, 0x04, 0x38, 0x12, 0xC5, 0x07, + 0x20, 0x14, 0xAE, 0x07, 0x14, 0x14, 0x0B, 0x01, 0x3C, 0x0E, 0x16, 0xF7, + 0x49, 0x0D, 0xCD, 0xEF, 0x79, 0x10, 0x2C, 0xEC, 0xFA, 0x0B, 0xF9, 0xEA, + 0x9F, 0x08, 0xC0, 0xEC, 0x49, 0x06, 0x8B, 0xEF, 0x8E, 0x02, 0x4A, 0xEE, + 0x06, 0x04, 0x4E, 0xEB, 0x88, 0x06, 0xCB, 0xEB, 0x5F, 0x04, 0x2B, 0xF0, + 0x87, 0xFA, 0xC0, 0xF3, 0x3C, 0xEC, 0x19, 0xF3, 0x09, 0xE7, 0x25, 0xF0, + 0x70, 0xF0, 0x08, 0xE5, 0x4C, 0xFC, 0xB3, 0xDB, 0x35, 0x01, 0x69, 0xE2, + 0x92, 0xFE, 0xD1, 0xEB, 0xE6, 0xF8, 0x48, 0xF1, 0xD2, 0xF3, 0x3F, 0xF9, + 0xCD, 0xF4, 0x05, 0x02, 0x8D, 0xFF, 0xBA, 0x03, 0x06, 0x04, 0xA1, 0x00, + 0x98, 0xFB, 0xB2, 0x08, 0xDE, 0xF1, 0xA4, 0x15, 0xCB, 0xF1, 0x31, 0x14, + 0x9B, 0xFB, 0x3C, 0x08, 0x78, 0x04, 0x94, 0xFB, 0x6B, 0x06, 0x0B, 0xF0, + 0x94, 0x03, 0xAA, 0xEA, 0xBF, 0x05, 0xE0, 0xEE, 0x15, 0x0C, 0x4E, 0xF5, + 0x87, 0x0E, 0x39, 0xF9, 0xBB, 0x14, 0xE3, 0xFF, 0x37, 0x1E, 0x72, 0x08, + 0x43, 0x20, 0x3E, 0x0A, 0x19, 0x17, 0x6C, 0x06, 0xE4, 0x05, 0x3E, 0x04, + 0xEA, 0xF7, 0x00, 0x08, 0x3F, 0xF5, 0xE4, 0x0A, 0x7E, 0xFC, 0x7B, 0x07, + 0x05, 0xFF, 0xB4, 0x06, 0x80, 0xF4, 0xD2, 0x06, 0x13, 0xEC, 0xEF, 0x02, + 0xE7, 0xEB, 0xCD, 0xFB, 0x9A, 0xEC, 0x07, 0xF8, 0x46, 0xEF, 0xA0, 0xFB, + 0x17, 0xF4, 0x57, 0x00, 0x40, 0xF9, 0xE9, 0x04, 0x70, 0xFD, 0x24, 0x0D, + 0x51, 0xFE, 0x9B, 0x14, 0x28, 0xFF, 0x83, 0x0F, 0x43, 0x00, 0x98, 0x07, + 0x37, 0xFE, 0x81, 0x0C, 0x5F, 0xFC, 0xC8, 0x14, 0xCB, 0xFD, 0xC6, 0x18, + 0x93, 0xFE, 0xC3, 0x1B, 0xC2, 0x03, 0xDF, 0x19, 0xD1, 0x0F, 0x3C, 0x0F, + 0xBC, 0x16, 0x1A, 0x02, 0xC6, 0x16, 0x6B, 0xFB, 0xB4, 0x11, 0xB0, 0xF9, + 0x21, 0x0A, 0x16, 0xFB, 0x20, 0x09, 0xB3, 0xFE, 0xB9, 0x10, 0x28, 0xFB, + 0x25, 0x18, 0x0B, 0xF9, 0xA1, 0x15, 0x36, 0xFF, 0x52, 0x0B, 0x7E, 0x05, + 0x3C, 0xFE, 0xFB, 0x08, 0x97, 0xF9, 0xAF, 0x06, 0x90, 0x01, 0x9E, 0x06, + 0xAA, 0x09, 0x8B, 0x09, 0x54, 0x14, 0xB6, 0x06, 0x24, 0x1E, 0xBF, 0x00, + 0x1C, 0x21, 0x5D, 0xFB, 0xD3, 0x22, 0x99, 0xFA, 0x79, 0x17, 0x1A, 0xFD, + 0x7E, 0xFF, 0x4F, 0x00, 0x65, 0xF1, 0x43, 0x07, 0x7D, 0xF0, 0x82, 0x0E, + 0xAE, 0xF6, 0x9E, 0x12, 0x09, 0xFE, 0xA3, 0x15, 0x05, 0x02, 0x93, 0x13, + 0x8D, 0x01, 0x1E, 0x0B, 0x85, 0xFE, 0xFC, 0x05, 0x98, 0x01, 0xE3, 0x03, + 0x3B, 0x08, 0x26, 0x06, 0xBD, 0x0D, 0x39, 0x0D, 0xE1, 0x12, 0xB9, 0x13, + 0x57, 0x16, 0xAC, 0x1B, 0x88, 0x16, 0xC7, 0x1F, 0x55, 0x11, 0xDA, 0x1F, + 0xA8, 0x07, 0x73, 0x21, 0x91, 0xFD, 0xAA, 0x1F, 0x92, 0xFA, 0xCF, 0x1B, + 0xCB, 0xFD, 0xCD, 0x1C, 0xF9, 0x01, 0xD2, 0x1A, 0x2F, 0x07, 0x6D, 0x12, + 0xBF, 0x07, 0x00, 0x0B, 0xE8, 0x02, 0xC0, 0x08, 0xA0, 0x00, 0xE5, 0x09, + 0xBA, 0xFF, 0x87, 0x07, 0xF0, 0xFC, 0x4F, 0x04, 0xF1, 0xFC, 0x48, 0x00, + 0xF9, 0x05, 0x4A, 0xFA, 0x61, 0x11, 0xE7, 0xF5, 0xE3, 0x14, 0x5B, 0xF4, + 0x50, 0x0D, 0x52, 0xF6, 0x81, 0x01, 0xDB, 0xFE, 0x55, 0x04, 0x22, 0x09, + 0x56, 0x15, 0x8A, 0x09, 0x83, 0x21, 0x86, 0x08, 0x2A, 0x20, 0xAD, 0x0B, + 0x3E, 0x16, 0x27, 0x0C, 0x4C, 0x0E, 0x4D, 0x0A, 0x7E, 0x0C, 0x9A, 0x06, + 0xF8, 0x0B, 0x05, 0xFF, 0xF8, 0x05, 0x3F, 0xF7, 0x2D, 0x00, 0xA8, 0xFA, + 0xB3, 0xFE, 0x04, 0x06, 0x51, 0xFB, 0x43, 0x0A, 0xCC, 0xF8, 0x32, 0x08, + 0xED, 0xFC, 0xD3, 0x08, 0x9D, 0x02, 0x37, 0x0A, 0x58, 0x06, 0x40, 0x0A, + 0xEB, 0x09, 0xD4, 0x0D, 0xD0, 0x0A, 0x9D, 0x12, 0x3C, 0x0A, 0x20, 0x13, + 0xC3, 0x0B, 0x22, 0x12, 0x4B, 0x11, 0xF6, 0x0E, 0xA1, 0x15, 0xCF, 0x09, + 0xD7, 0x12, 0xA5, 0x07, 0x73, 0x0E, 0x6A, 0x08, 0xD9, 0x0D, 0x4A, 0x0B, + 0x16, 0x11, 0xFA, 0x0E, 0x6C, 0x14, 0x0F, 0x15, 0xE5, 0x11, 0x51, 0x1E, + 0x5B, 0x06, 0x56, 0x25, 0x6A, 0xFB, 0x0E, 0x29, 0x7B, 0xFC, 0xA3, 0x2A, + 0xA1, 0x07, 0x04, 0x26, 0x88, 0x13, 0xDC, 0x1E, 0xB2, 0x19, 0xFB, 0x18, + 0xAC, 0x1A, 0xAA, 0x14, 0xE1, 0x14, 0xCB, 0x17, 0x41, 0x09, 0x02, 0x1E, + 0xE2, 0x02, 0x03, 0x20, 0x95, 0x06, 0x09, 0x1B, 0xBF, 0x0B, 0x32, 0x11, + 0xA9, 0x10, 0xED, 0x0A, 0x4B, 0x12, 0x14, 0x07, 0x8D, 0x0B, 0xFE, 0x02, + 0x8F, 0x06, 0x5D, 0x01, 0x68, 0x04, 0xB8, 0x02, 0xD1, 0x04, 0x4B, 0x04, + 0xEB, 0x0A, 0xE5, 0x03, 0xE8, 0x0D, 0x54, 0x04, 0xFF, 0x08, 0xC4, 0x04, + 0x7B, 0x02, 0x4B, 0x00, 0xB1, 0x01, 0xC1, 0xFA, 0x83, 0x03, 0x06, 0xF8, + 0x75, 0x02, 0xF0, 0xF4, 0x93, 0x00, 0xE4, 0xF5, 0xDE, 0x02, 0x68, 0xFC, + 0xA9, 0x0B, 0x05, 0xFE, 0x9C, 0x15, 0xDE, 0xFC, 0xE1, 0x14, 0x39, 0x00, + 0xD4, 0x0A, 0xC9, 0x04, 0x50, 0x02, 0x1F, 0x08, 0x6F, 0xFD, 0x03, 0x0E, + 0x9E, 0xFB, 0x6D, 0x17, 0x01, 0x00, 0x06, 0x1D, 0xEA, 0x0B, 0x13, 0x1D, + 0x79, 0x17, 0xD0, 0x1B, 0x3F, 0x19, 0x84, 0x1B, 0x5D, 0x0F, 0x5B, 0x1E, + 0xB1, 0x02, 0x04, 0x1E, 0x9C, 0xFF, 0x7A, 0x18, 0x5A, 0x08, 0x78, 0x15, + 0xDD, 0x14, 0xCC, 0x17, 0x98, 0x18, 0x91, 0x1C, 0x4B, 0x0D, 0x47, 0x1F, + 0x5F, 0xFF, 0x4D, 0x1E, 0x8F, 0xFA, 0x1C, 0x19, 0x4E, 0xFC, 0x6B, 0x13, + 0x29, 0x01, 0x60, 0x0F, 0x60, 0x09, 0x12, 0x0D, 0x30, 0x15, 0xF3, 0x09, + 0x08, 0x1E, 0x8D, 0x04, 0x06, 0x21, 0x80, 0xFF, 0x2E, 0x20, 0x13, 0xF9, + 0x2F, 0x18, 0xFE, 0xF5, 0xB0, 0x0B, 0x65, 0xFB, 0x9C, 0x00, 0x0E, 0x04, + 0xE0, 0xFC, 0xDF, 0x07, 0xAC, 0x01, 0xF1, 0x03, 0x80, 0x04, 0x55, 0xFD, + 0xC0, 0x00, 0xB6, 0xFA, 0xD1, 0xFC, 0x8F, 0xF8, 0xBE, 0xFA, 0x58, 0xFA, + 0x5D, 0xF8, 0x37, 0x01, 0x93, 0xF8, 0x6E, 0x03, 0x65, 0xFB, 0x65, 0x04, + 0xEC, 0xFE, 0x71, 0x08, 0x3D, 0x05, 0x66, 0x08, 0x66, 0x0B, 0x5C, 0x01, + 0x9C, 0x09, 0x14, 0xFD, 0x53, 0xFF, 0x82, 0x02, 0x06, 0xF5, 0x21, 0x09, + 0x21, 0xF1, 0xA7, 0x08, 0x18, 0xF4, 0x64, 0x04, 0xA2, 0xF7, 0x11, 0x02, + 0xCF, 0xF6, 0x73, 0xFD, 0xD7, 0xF9, 0x82, 0xF6, 0x4E, 0x02, 0xFD, 0xF1, + 0xF1, 0x02, 0xD8, 0xEC, 0x29, 0xFC, 0x42, 0xE7, 0x40, 0xFC, 0x2C, 0xE4, + 0xEE, 0x00, 0xF3, 0xE8, 0xB4, 0x04, 0x37, 0xEF, 0xE7, 0x05, 0x7C, 0xEC, + 0xFE, 0xFD, 0x90, 0xEB, 0x14, 0xF0, 0x1B, 0xEF, 0x84, 0xE4, 0x1F, 0xEE, + 0x0C, 0xE4, 0x33, 0xEB, 0xDF, 0xEB, 0xF0, 0xEB, 0x0C, 0xEF, 0xEF, 0xEE, + 0x60, 0xEC, 0xBB, 0xF0, 0x57, 0xEA, 0x44, 0xF5, 0x87, 0xEC, 0xEC, 0xF8, + 0x76, 0xF1, 0x10, 0xF3, 0x93, 0xF2, 0x45, 0xEB, 0xB8, 0xEF, 0x09, 0xE9, + 0x9E, 0xEF, 0x19, 0xEC, 0xC8, 0xF1, 0x83, 0xEC, 0x9E, 0xF3, 0x82, 0xE9, + 0xE8, 0xF2, 0x5B, 0xEB, 0x12, 0xEC, 0x38, 0xF1, 0x71, 0xE5, 0xD5, 0xF5, + 0xAF, 0xE6, 0x2D, 0xF7, 0x5B, 0xE9, 0xE9, 0xF6, 0x2D, 0xEA, 0xF3, 0xF3, + 0xC2, 0xEB, 0xB7, 0xEE, 0xC0, 0xEF, 0xB1, 0xEB, 0x98, 0xF6, 0xC8, 0xEC, + 0xA0, 0xF6, 0x19, 0xEF, 0xEE, 0xEC, 0x54, 0xEF, 0x67, 0xE4, 0x74, 0xE9, + 0x97, 0xE3, 0x16, 0xE1, 0x87, 0xE7, 0xB9, 0xDD, 0xAE, 0xE7, 0xCE, 0xE1, + 0x7C, 0xE3, 0xA1, 0xE7, 0x77, 0xE1, 0xEB, 0xEB, 0xE0, 0xE2, 0x98, 0xF3, + 0xF3, 0xEB, 0x8E, 0xF9, 0xA7, 0xF7, 0x20, 0xFA, 0x0C, 0xFF, 0x96, 0xF7, + 0x58, 0x02, 0xE4, 0xEF, 0xA1, 0xFB, 0x21, 0xE8, 0xFE, 0xF0, 0x0B, 0xE8, + 0x5F, 0xEC, 0x86, 0xE9, 0xBD, 0xED, 0xA5, 0xE8, 0x1A, 0xF1, 0x58, 0xE8, + 0x6E, 0xF7, 0xCC, 0xEA, 0xBE, 0xFA, 0xEF, 0xF0, 0xD9, 0xEE, 0x73, 0xF5, + 0xC1, 0xE3, 0xC3, 0xF1, 0xCB, 0xE3, 0xB5, 0xE8, 0x62, 0xE7, 0xD7, 0xE3, + 0xC9, 0xEF, 0xF7, 0xE6, 0xD9, 0xF7, 0x2E, 0xEE, 0x6D, 0xF6, 0xF8, 0xF4, + 0x54, 0xF0, 0x7C, 0xFA, 0x87, 0xF2, 0x24, 0xFC, 0x01, 0xFA, 0xDC, 0xF7, + 0xBB, 0xFC, 0x7F, 0xF1, 0x28, 0xFE, 0x8C, 0xEA, 0x31, 0xFB, 0xFB, 0xE5, + 0x38, 0xF2, 0x46, 0xE7, 0x0D, 0xF1, 0x19, 0xE7, 0xA1, 0xF5, 0x77, 0xE6, + 0xB4, 0xF4, 0x03, 0xEC, 0x5C, 0xF0, 0xA3, 0xF5, 0xB7, 0xEE, 0x60, 0xFF, + 0x89, 0xF1, 0x5D, 0x04, 0xD1, 0xF6, 0x75, 0x00, 0xD7, 0xFD, 0xD1, 0xF8, + 0xBD, 0x03, 0x7F, 0xF6, 0x6A, 0x03, 0x14, 0xF6, 0x11, 0xFE, 0x6E, 0xF5, + 0xCA, 0xF7, 0x21, 0xF6, 0x82, 0xF5, 0x58, 0xF9, 0xF0, 0xF8, 0x20, 0xFF, + 0x7F, 0xFF, 0x29, 0x02, 0x60, 0x08, 0x10, 0x03, 0xC2, 0x0D, 0xEF, 0x06, + 0x38, 0x08, 0xCF, 0x0E, 0xC1, 0xFB, 0xF0, 0x12, 0x3B, 0xF3, 0xE7, 0x11, + 0x27, 0xF1, 0x0B, 0x12, 0xAE, 0xEF, 0x19, 0x0E, 0x22, 0xEF, 0x4E, 0x04, + 0xE6, 0xF2, 0x2A, 0xFC, 0x9A, 0xF6, 0xC8, 0xF1, 0x1D, 0xF5, 0x80, 0xE3, + 0xE5, 0xF3, 0x47, 0xD7, 0x56, 0xF5, 0x58, 0xD0, 0xEA, 0xF5, 0xF4, 0xD2, + 0xF5, 0xF9, 0x18, 0xDD, 0xA0, 0x03, 0xA3, 0xE6, 0x32, 0x09, 0x3D, 0xEE, + 0x9C, 0x05, 0x27, 0xF6, 0xBB, 0x00, 0x3A, 0xF7, 0x1B, 0xFF, 0xD9, 0xF1, + 0xA7, 0xFD, 0xC6, 0xEE, 0x98, 0xFD, 0x90, 0xEB, 0xF4, 0x01, 0x54, 0xE8, + 0x5D, 0x06, 0xEB, 0xE9, 0xA9, 0x07, 0xAC, 0xEE, 0xDB, 0x05, 0x48, 0xF5, + 0x2F, 0xFD, 0xF2, 0xFB, 0x02, 0xF1, 0xA9, 0x01, 0x4F, 0xE8, 0x51, 0x04, + 0xAE, 0xE5, 0xBE, 0x03, 0xC5, 0xE9, 0x27, 0x05, 0x09, 0xEB, 0xDF, 0x08, + 0x81, 0xE7, 0xD6, 0x0A, 0x9F, 0xE6, 0xF7, 0x0E, 0xEC, 0xE6, 0x0A, 0x12, + 0xB8, 0xE8, 0x9F, 0x0E, 0x3B, 0xED, 0xCE, 0x09, 0x75, 0xF3, 0x2A, 0x04, + 0x40, 0xFB, 0x0B, 0xFE, 0x48, 0x04, 0xBD, 0xF7, 0x5B, 0x0B, 0xEB, 0xEE, + 0xC8, 0x06, 0xED, 0xE6, 0xFD, 0xFA, 0x63, 0xE3, 0xFA, 0xF8, 0xCE, 0xE1, + 0xD5, 0xFF, 0xBE, 0xE1, 0xEE, 0x04, 0x5B, 0xE4, 0x0C, 0x08, 0x0E, 0xEC, + 0x24, 0x07, 0x6A, 0xF6, 0xDA, 0x00, 0xA7, 0xFA, 0x54, 0xFF, 0xB2, 0xF7, + 0x01, 0x05, 0xEF, 0xF1, 0x15, 0x0A, 0xBD, 0xEF, 0xAB, 0x0B, 0xC8, 0xF0, + 0xD2, 0x0B, 0x5C, 0xF1, 0x9D, 0x0D, 0xEB, 0xF3, 0x1A, 0x10, 0x4D, 0xFC, + 0x37, 0x0E, 0xF5, 0x04, 0x9C, 0x08, 0x92, 0x01, 0x32, 0x05, 0xA4, 0xF8, + 0x5E, 0xFF, 0x1E, 0xF9, 0x24, 0xF5, 0x7E, 0x03, 0xA2, 0xEE, 0x61, 0x0B, + 0xBD, 0xEB, 0xE7, 0x07, 0x9F, 0xE7, 0xA5, 0x03, 0xAF, 0xE6, 0x9B, 0x04, + 0xC4, 0xED, 0xDC, 0x02, 0x13, 0xF5, 0x6B, 0xFE, 0xB5, 0xF9, 0xF0, 0xFE, + 0x56, 0xFE, 0xBB, 0x05, 0xC9, 0x04, 0xDD, 0x0D, 0x0F, 0x0C, 0x1D, 0x15, + 0x8B, 0x0B, 0xF1, 0x19, 0x0A, 0x04, 0x68, 0x1A, 0xDC, 0xFA, 0xCE, 0x17, + 0x25, 0xF6, 0x21, 0x14, 0xC7, 0xFA, 0x29, 0x0B, 0x76, 0x03, 0x4D, 0xFD, + 0xE9, 0x0A, 0xDF, 0xF3, 0x17, 0x0C, 0xBA, 0xF3, 0x0C, 0x0A, 0x9B, 0xF7, + 0x91, 0x0A, 0xEE, 0xFA, 0xCB, 0x09, 0x34, 0xFD, 0x38, 0x07, 0x35, 0xFE, + 0xBA, 0x07, 0x6E, 0xFF, 0x96, 0x0A, 0x3F, 0xFE, 0x00, 0x07, 0xB8, 0xFC, + 0xE3, 0xFC, 0x26, 0xFF, 0x6F, 0xF6, 0x4C, 0x00, 0x4A, 0xF9, 0x92, 0x01, + 0x70, 0x00, 0xD5, 0x05, 0x1C, 0x03, 0x1C, 0x09, 0xF6, 0x03, 0xE9, 0x0B, + 0x2B, 0x07, 0xE6, 0x0C, 0x8B, 0x09, 0x73, 0x0E, 0x68, 0x0A, 0xE1, 0x0A, + 0x1A, 0x06, 0x3F, 0xFF, 0x51, 0xFF, 0x02, 0xFA, 0x79, 0xFA, 0x74, 0xFF, + 0xA4, 0xF7, 0x65, 0x03, 0xC5, 0xFE, 0xB5, 0xFE, 0xC6, 0x0B, 0xFC, 0xF7, + 0x62, 0x0F, 0xD0, 0xF5, 0xC4, 0x06, 0x12, 0xFA, 0xA0, 0xF9, 0xC3, 0x00, + 0xF7, 0xF3, 0xD5, 0x05, 0x30, 0xFB, 0xD9, 0x08, 0x9C, 0x08, 0x48, 0x0C, + 0x91, 0x12, 0xE9, 0x0F, 0x46, 0x13, 0x8A, 0x11, 0x39, 0x0C, 0xB7, 0x12, + 0x1B, 0x08, 0x61, 0x12, 0xB4, 0x07, 0x00, 0x13, 0x52, 0x06, 0xD4, 0x13, + 0x2A, 0x09, 0xCD, 0x11, 0xAB, 0x10, 0xAA, 0x13, 0x08, 0x17, 0x3D, 0x1A, + 0x90, 0x14, 0xD5, 0x1C, 0x45, 0x0B, 0x2C, 0x1A, 0x61, 0x03, 0x93, 0x19, + 0xEA, 0x02, 0xD2, 0x17, 0x53, 0x06, 0x63, 0x10, 0x2E, 0x06, 0x5A, 0x09, + 0x71, 0x07, 0x1F, 0x07, 0xCB, 0x0B, 0x83, 0x05, 0x24, 0x10, 0xC0, 0x00, + 0xB5, 0x11, 0xB1, 0xFD, 0xC1, 0x0E, 0x27, 0xFE, 0xCA, 0x08, 0xCF, 0xFD, + 0x35, 0x07, 0x13, 0xFD, 0x6B, 0x0E, 0xF8, 0x00, 0xE5, 0x14, 0x6A, 0x05, + 0x71, 0x15, 0x76, 0x07, 0xD5, 0x13, 0xEE, 0x06, 0xB6, 0x10, 0x0D, 0x03, + 0x2F, 0x0D, 0x7E, 0x01, 0x03, 0x0D, 0x7D, 0x02, 0x27, 0x0E, 0x09, 0x04, + 0xAD, 0x0B, 0x33, 0x03, 0x95, 0x08, 0xF0, 0xFF, 0xE2, 0x08, 0x03, 0x01, + 0x99, 0x09, 0x54, 0x03, 0x8F, 0x07, 0xF7, 0x00, 0x43, 0x01, 0x63, 0xFF, + 0xF5, 0xFC, 0x00, 0x04, 0x25, 0xFF, 0x75, 0x0D, 0x86, 0x02, 0x5D, 0x16, + 0x60, 0x04, 0x56, 0x18, 0x14, 0x05, 0x98, 0x14, 0x54, 0x05, 0xBA, 0x11, + 0xB6, 0x03, 0x3F, 0x12, 0x44, 0xFE, 0xA5, 0x11, 0x6D, 0xFA, 0x5A, 0x10, + 0xFE, 0xFC, 0x28, 0x10, 0x2F, 0x01, 0x72, 0x0D, 0xE3, 0x05, 0x51, 0x0B, + 0xC0, 0x07, 0x0E, 0x0B, 0x90, 0xFF, 0x3C, 0x0A, 0xFE, 0xF6, 0x00, 0x0B, + 0x36, 0xF7, 0x7B, 0x10, 0xB8, 0xFB, 0x33, 0x1A, 0xA0, 0xFF, 0x13, 0x22, + 0x49, 0x03, 0xFE, 0x23, 0x4B, 0x0A, 0xE4, 0x23, 0xBD, 0x0F, 0x33, 0x21, + 0x1C, 0x14, 0x5A, 0x1B, 0x16, 0x19, 0x0B, 0x15, 0x9A, 0x18, 0x16, 0x11, + 0x92, 0x16, 0x1B, 0x10, 0x3E, 0x18, 0x18, 0x0E, 0x72, 0x1E, 0x72, 0x0E, + 0x14, 0x25, 0xD7, 0x0D, 0x19, 0x24, 0xA4, 0x09, 0x4E, 0x1E, 0x5D, 0x0B, + 0xAD, 0x18, 0x01, 0x0E, 0xCF, 0x13, 0x89, 0x09, 0xF2, 0x0E, 0x32, 0x06, + 0xC4, 0x07, 0x46, 0x03, 0xBA, 0x06, 0xA8, 0xFB, 0x9A, 0x08, 0x66, 0xF9, + 0x6C, 0x00, 0x26, 0xFB, 0xDA, 0xFB, 0x49, 0xF8, 0xE1, 0xFF, 0x71, 0xF9, + 0x0C, 0xFF, 0x22, 0x00, 0x54, 0x05, 0xCA, 0x03, 0x60, 0x18, 0x71, 0x06, + 0xC5, 0x20, 0x68, 0x09, 0xFC, 0x16, 0x5B, 0x0A, 0x3E, 0x07, 0xD4, 0x0B, + 0x32, 0xF9, 0x6F, 0x0E, 0xB7, 0xF0, 0xD2, 0x0F, 0x9C, 0xF0, 0x50, 0x0B, + 0xA5, 0xF2, 0x4D, 0x03, 0xC1, 0xEF, 0x0B, 0xFE, 0x08, 0xEE, 0x06, 0xF8, + 0x27, 0xF1, 0x54, 0xF0, 0x6A, 0xF8, 0x3A, 0xE7, 0xF6, 0x01, 0x35, 0xDF, + 0x58, 0x03, 0x4B, 0xE2, 0x84, 0xFF, 0x8F, 0xED, 0xD4, 0xFF, 0xFB, 0xF4, + 0x1C, 0xFF, 0x57, 0xFC, 0xC4, 0xFA, 0x4E, 0x02, 0x77, 0xFA, 0x20, 0x01, + 0x2C, 0x01, 0x86, 0xFF, 0xB8, 0x06, 0xBF, 0x00, 0xAC, 0x09, 0x7A, 0x06, + 0x2A, 0x0C, 0x81, 0x11, 0x2E, 0x08, 0x3A, 0x1A, 0x17, 0x05, 0x0F, 0x1E, + 0x92, 0x0C, 0xEC, 0x1C, 0xC7, 0x0F, 0x56, 0x16, 0x03, 0x07, 0x8B, 0x14, + 0xEA, 0x02, 0xB5, 0x14, 0x37, 0x05, 0x10, 0x12, 0x6A, 0x04, 0x37, 0x13, + 0x0D, 0x00, 0x3D, 0x16, 0x73, 0xF8, 0x98, 0x19, 0x4F, 0xF2, 0xA2, 0x1B, + 0xC1, 0xF5, 0x9A, 0x1C, 0x7F, 0x00, 0x1F, 0x1B, 0xBC, 0x0A, 0x12, 0x16, + 0x61, 0x10, 0x26, 0x15, 0xE6, 0x0F, 0x43, 0x17, 0xC1, 0x0F, 0xBD, 0x15, + 0xEC, 0x12, 0xBD, 0x0F, 0xA0, 0x11, 0xA5, 0x09, 0x46, 0x10, 0x2F, 0x02, + 0x56, 0x11, 0x93, 0xF6, 0xE3, 0x0E, 0x61, 0xEE, 0x5B, 0x0A, 0xB4, 0xF0, + 0x3E, 0x06, 0x2E, 0xF7, 0x6B, 0x03, 0x02, 0xF6, 0x58, 0xFF, 0x5B, 0xF5, + 0xBF, 0xF6, 0x95, 0xFA, 0x4E, 0xF1, 0x99, 0x00, 0xC3, 0xF2, 0x9D, 0x08, + 0xDD, 0xF6, 0xC3, 0x0D, 0x30, 0xF9, 0x57, 0x0A, 0x39, 0xFB, 0x9F, 0x03, + 0x21, 0x01, 0xFA, 0xFD, 0xB2, 0x03, 0xC3, 0xF7, 0x7C, 0x00, 0x67, 0xF1, + 0x6C, 0xFC, 0x02, 0xEF, 0xB9, 0xFD, 0x12, 0xF5, 0x0D, 0x09, 0x5F, 0x01, + 0x17, 0x15, 0xE5, 0x08, 0x35, 0x12, 0x9A, 0x06, 0x4E, 0x06, 0x81, 0x05, + 0x48, 0x04, 0x75, 0x08, 0x9D, 0x0B, 0xE5, 0x07, 0xF9, 0x0F, 0x5D, 0x06, + 0x76, 0x0D, 0x78, 0x07, 0x77, 0x0D, 0x20, 0x09, 0xBD, 0x13, 0x93, 0x0B, + 0xFC, 0x15, 0x0B, 0x0E, 0xE9, 0x0F, 0x5E, 0x0A, 0x91, 0x07, 0x73, 0x05, + 0x0D, 0x01, 0x5E, 0x06, 0xFE, 0xFD, 0x0E, 0x0A, 0x48, 0x00, 0xCC, 0x12, + 0x0B, 0x05, 0xCA, 0x18, 0xBA, 0x0A, 0x0D, 0x12, 0x36, 0x0D, 0xCC, 0x0B, + 0x91, 0x09, 0xF7, 0x0C, 0x88, 0x04, 0x65, 0x0B, 0xAE, 0x02, 0xEF, 0x06, + 0x31, 0x03, 0x45, 0x04, 0xE1, 0x00, 0x97, 0x02, 0xBE, 0xFC, 0xC9, 0x01, + 0x7B, 0xF8, 0xD3, 0xFD, 0x9F, 0xF2, 0xE8, 0xF3, 0x16, 0xEA, 0xF6, 0xE8, + 0x1E, 0xE1, 0x1A, 0xE3, 0x04, 0xE3, 0x0E, 0xE2, 0x83, 0xEC, 0xE6, 0xE1, + 0x1F, 0xF0, 0x90, 0xE4, 0xC5, 0xEF, 0xF4, 0xE9, 0xA8, 0xED, 0x90, 0xEF, + 0x3A, 0xE8, 0x34, 0xED, 0x07, 0xE3, 0x63, 0xE4, 0x74, 0xE4, 0xD3, 0xE1, + 0xE7, 0xE9, 0xF6, 0xE3, 0xBC, 0xEE, 0x0A, 0xE6, 0xFF, 0xF3, 0x2F, 0xE7, + 0x41, 0xF8, 0x4E, 0xE6, 0x33, 0xFC, 0x41, 0xE0, 0x94, 0x00, 0x9B, 0xDD, + 0x40, 0x00, 0x8D, 0xE3, 0x7D, 0xFC, 0xC0, 0xE9, 0x11, 0xFA, 0x72, 0xF1, + 0x09, 0xF4, 0xCE, 0xFD, 0xA9, 0xEA, 0x8F, 0x05, 0xCD, 0xEB, 0x1F, 0x03, + 0x2D, 0xF2, 0xFA, 0xFF, 0xF8, 0xF2, 0x2F, 0xF8, 0xCE, 0xF6, 0xA5, 0xF2, + 0xB7, 0xFC, 0xBD, 0xF9, 0x4F, 0x01, 0xFC, 0xFF, 0xCD, 0x00, 0x3D, 0x00, + 0xF4, 0x02, 0xE6, 0x01, 0x40, 0x01, 0x87, 0x03, 0x86, 0xF9, 0x3D, 0x08, + 0xED, 0xF6, 0x35, 0x0D, 0x7B, 0xF2, 0x74, 0x0A, 0x07, 0xF1, 0x27, 0x06, + 0x0E, 0xF7, 0xEC, 0x06, 0xA0, 0xF3, 0xEF, 0x07, 0x27, 0xE8, 0x85, 0x05, + 0x79, 0xEA, 0xC6, 0x05, 0x74, 0xE9, 0xD6, 0x01, 0x35, 0xE3, 0xCF, 0xF7, + 0x26, 0xE8, 0x2C, 0xEE, 0xCA, 0xEB, 0x34, 0xEA, 0xBD, 0xEB, 0x60, 0xF2, + 0x69, 0xEC, 0x95, 0xFB, 0x6A, 0xED, 0x81, 0xF8, 0x00, 0xF3, 0x01, 0xF2, + 0xB7, 0xF9, 0x3F, 0xF0, 0x3D, 0xF0, 0x46, 0xEC, 0xD6, 0xEA, 0x06, 0xF2, + 0x6D, 0xF4, 0x6E, 0xFA, 0x05, 0xF2, 0xE1, 0xED, 0x88, 0xFC, 0xDF, 0xE6, + 0x58, 0x0E, 0x29, 0xE8, 0x50, 0x06, 0x43, 0xE1, 0x72, 0xF7, 0x79, 0xDE, + 0xA9, 0xED, 0xA2, 0xDC, 0xC5, 0xF1, 0xEA, 0xDB, 0xCD, 0xFB, 0x66, 0xDB, + 0x02, 0x05, 0x11, 0xD9, 0x92, 0x03, 0xBC, 0xD5, 0x16, 0xFC, 0x26, 0xDB, + 0x83, 0xF3, 0x7B, 0xEA, 0x5F, 0xE4, 0xDD, 0xEE, 0x04, 0xE7, 0x56, 0xEA, + 0x1A, 0xF2, 0xAA, 0xF7, 0xEF, 0xF3, 0xCF, 0xFB, 0xBF, 0xF6, 0x91, 0xEE, + 0x26, 0xF3, 0xC9, 0xF3, 0xB6, 0xE5, 0x47, 0xEF, 0xBC, 0xE7, 0x0E, 0xEB, + 0x72, 0xF1, 0xF9, 0xF6, 0x99, 0xF8, 0x99, 0x06, 0x35, 0x03, 0x7B, 0x0F, + 0x81, 0x07, 0x7F, 0x11, 0x36, 0x03, 0xAF, 0x11, 0xDF, 0x01, 0x94, 0x0C, + 0x43, 0xFD, 0xCD, 0x05, 0x3A, 0xF2, 0xFB, 0xF8, 0x12, 0xED, 0x19, 0xF5, + 0x4E, 0xED, 0x49, 0xFB, 0x04, 0xF2, 0xE5, 0xF5, 0x68, 0xFF, 0x51, 0xF1, + 0x1E, 0x11, 0xD1, 0xF5, 0xB3, 0x1A, 0xD0, 0xEE, 0x54, 0x22, 0xE6, 0xED, + 0x84, 0x22, 0x69, 0xFE, 0x15, 0x21, 0x8B, 0x07, 0xA0, 0x28, 0x36, 0x0D, + 0x49, 0x20, 0xBC, 0x0C, 0x87, 0x16, 0xBF, 0x0A, 0x99, 0x0D, 0xA5, 0x0D, + 0xAD, 0xF2, 0x5E, 0x03, 0x25, 0xE6, 0x45, 0xFC, 0x99, 0xE7, 0xE7, 0xF9, + 0x1F, 0xE9, 0x88, 0xF4, 0xA4, 0xED, 0xD3, 0xF0, 0x9A, 0xEB, 0x6E, 0xEB, + 0x92, 0xED, 0xB8, 0xF0, 0xC8, 0xE9, 0xD0, 0xF4, 0xD9, 0xE4, 0x86, 0xF1, + 0x3A, 0xE0, 0x11, 0xF4, 0x63, 0xD8, 0x60, 0xFA, 0x13, 0xDF, 0x72, 0xF9, + 0x69, 0xE9, 0x13, 0xF6, 0x3E, 0xEE, 0xD1, 0xFC, 0xB4, 0xEF, 0x67, 0xFF, + 0x69, 0xF8, 0x4A, 0xFD, 0x11, 0x01, 0x6A, 0xFB, 0x76, 0x03, 0xF8, 0xF5, + 0xA9, 0x01, 0x10, 0xF5, 0x47, 0xFD, 0xDD, 0xFC, 0x13, 0x00, 0x02, 0x00, + 0x40, 0x10, 0x98, 0x01, 0x79, 0x0C, 0x94, 0xF8, 0x16, 0x0B, 0x1A, 0xF5, + 0x16, 0x13, 0xF2, 0xFF, 0x9A, 0x05, 0x5C, 0x02, 0x0A, 0x04, 0xDC, 0x08, + 0x04, 0x03, 0xFE, 0x0C, 0xCC, 0x03, 0x7A, 0x10, 0x3F, 0x13, 0xE2, 0x14, + 0xEE, 0x18, 0x57, 0x11, 0x40, 0x0F, 0xFA, 0x06, 0xE6, 0x0F, 0x29, 0x07, + 0x2B, 0x11, 0x56, 0x0B, 0xF3, 0x08, 0x9B, 0x06, 0x8E, 0x04, 0x26, 0x05, + 0x81, 0x0A, 0xFD, 0x0B, 0x0D, 0x11, 0x28, 0x11, 0xE8, 0x15, 0xC0, 0x0B, + 0x79, 0x14, 0x45, 0x04, 0xAA, 0x05, 0xA7, 0x05, 0xAE, 0xF7, 0x77, 0x08, + 0x63, 0xF0, 0x1A, 0x05, 0xF3, 0xF3, 0x43, 0x07, 0x50, 0xFB, 0x79, 0x09, + 0x25, 0xFC, 0xDD, 0xFC, 0x48, 0xFF, 0x12, 0xF6, 0xD7, 0x00, 0x94, 0xF7, + 0xD4, 0xF0, 0x5C, 0xE5, 0x7B, 0xEC, 0x55, 0xDC, 0xED, 0xF3, 0x5F, 0xE5, + 0x38, 0xFF, 0xEA, 0xE9, 0xA5, 0x0D, 0xB7, 0xEF, 0x6C, 0x0A, 0x74, 0xF6, + 0x14, 0x08, 0x13, 0xFE, 0xFB, 0x03, 0x66, 0x02, 0x15, 0xFF, 0xF5, 0x07, + 0x09, 0xFC, 0xA2, 0x0C, 0xF2, 0xF5, 0x60, 0x0B, 0x61, 0xEA, 0x2B, 0x05, + 0x51, 0xDD, 0x8A, 0xFB, 0x57, 0xE2, 0xA0, 0xF3, 0xC6, 0xEC, 0x8B, 0xEF, + 0x04, 0xF2, 0x41, 0xEB, 0xD4, 0xFA, 0xEF, 0xEA, 0x94, 0x02, 0xE7, 0xF5, + 0x61, 0x04, 0x5B, 0x02, 0x49, 0x03, 0x46, 0x04, 0x0C, 0xFD, 0xA4, 0xFA, + 0x5A, 0x00, 0xD4, 0xFA, 0x74, 0x08, 0x3D, 0x01, 0x26, 0x0E, 0x2B, 0x0B, + 0x0C, 0x13, 0xC5, 0x17, 0xEC, 0x0E, 0x9D, 0x18, 0x6B, 0x08, 0x95, 0x14, + 0x45, 0x0B, 0xB1, 0x11, 0x78, 0x09, 0x18, 0x0B, 0x44, 0x01, 0x6C, 0x04, + 0x3F, 0xF4, 0x23, 0xFA, 0xDE, 0xF2, 0x0F, 0xF8, 0xF8, 0xFD, 0x4E, 0xFF, + 0xBA, 0xFF, 0xE4, 0xFF, 0xC8, 0x04, 0x90, 0x03, 0x61, 0x02, 0x89, 0x04, + 0xA3, 0xF7, 0xFF, 0x00, 0xB8, 0xFA, 0x8E, 0x03, 0x41, 0x0A, 0x57, 0x04, + 0xFB, 0x14, 0x24, 0xFF, 0xF7, 0x13, 0x8A, 0xFC, 0x42, 0x1B, 0xAD, 0x07, + 0x32, 0x16, 0x1F, 0x0B, 0xB9, 0x07, 0xA2, 0x04, 0xE9, 0x0B, 0x9B, 0x0A, + 0xE2, 0x0F, 0x69, 0x0A, 0xE9, 0x11, 0x65, 0x05, 0xBF, 0x18, 0x48, 0x0B, + 0x6D, 0x1F, 0xB4, 0x13, 0xA0, 0x1A, 0xEB, 0x11, 0x08, 0x10, 0x88, 0x0D, + 0x14, 0x07, 0xDA, 0x13, 0x9B, 0xF9, 0x1D, 0x13, 0x42, 0xEB, 0x33, 0x0B, + 0xEF, 0xEC, 0x3F, 0x11, 0xF4, 0xF5, 0x0D, 0x1C, 0xBE, 0xFC, 0x7D, 0x1C, + 0xBB, 0x07, 0x93, 0x0D, 0x10, 0x12, 0xBB, 0xFA, 0xA3, 0x20, 0x5F, 0xF5, + 0x2E, 0x29, 0x0A, 0xFC, 0x91, 0x1D, 0x5C, 0x00, 0xB4, 0x0D, 0x0E, 0xFC, + 0x52, 0x09, 0x79, 0xF8, 0x46, 0x0D, 0xCA, 0xF5, 0x51, 0x0C, 0x8F, 0xF2, + 0x5B, 0xFB, 0x35, 0xEA, 0xF9, 0xEE, 0x4A, 0xE4, 0x5F, 0xEA, 0xDF, 0xE6, + 0x8E, 0xED, 0xA1, 0xF5, 0xCE, 0xFB, 0x0F, 0x0F, 0xD7, 0x05, 0xF9, 0x12, + 0x3D, 0x13, 0x50, 0x0C, 0x98, 0x1F, 0x93, 0x12, 0x06, 0x22, 0x12, 0x1D, + 0xE4, 0x1C, 0x4E, 0x21, 0xBE, 0x0C, 0x65, 0x16, 0x2F, 0xFE, 0x29, 0x13, + 0xCE, 0xF4, 0x96, 0x17, 0x50, 0xE7, 0x92, 0x0C, 0x2B, 0xE0, 0x58, 0x01, + 0x4B, 0xD8, 0x8B, 0xF5, 0x08, 0xD2, 0xA0, 0xEC, 0x44, 0xDB, 0x55, 0xF9, + 0xCA, 0xF5, 0xC2, 0x15, 0x6E, 0x0E, 0x56, 0x2E, 0x44, 0x20, 0x7F, 0x39, + 0x4D, 0x39, 0x0A, 0x44, 0x0F, 0x3E, 0x28, 0x3F, 0xE4, 0x2D, 0x4B, 0x27, + 0x91, 0x16, 0xAA, 0x08, 0x04, 0xF7, 0x18, 0xE6, 0x24, 0xE4, 0x07, 0xD8, + 0xB2, 0xE3, 0xCB, 0xD3, 0x8A, 0xF2, 0x46, 0xD9, 0x1A, 0x04, 0x67, 0xEB, + 0x56, 0x0A, 0x43, 0xF5, 0xE8, 0x14, 0xFD, 0xFE, 0xDC, 0x1B, 0x8B, 0x06, + 0x89, 0x0C, 0x26, 0xFF, 0x58, 0x01, 0x26, 0xFA, 0x53, 0xFF, 0xBA, 0xF8, + 0xBC, 0xF3, 0x18, 0xEB, 0x8E, 0xEB, 0xAE, 0xE1, 0x04, 0xF9, 0xE9, 0xF0, + 0xD6, 0x10, 0x43, 0x08, 0xA9, 0x19, 0x85, 0x12, 0xA2, 0x1B, 0x57, 0x23, + 0x80, 0x1D, 0xB3, 0x34, 0xAB, 0x18, 0x3E, 0x33, 0x84, 0x0F, 0xDD, 0x29, + 0x26, 0xFA, 0x00, 0x1A, 0xB0, 0xE7, 0xAD, 0x0C, 0xAB, 0xE2, 0x74, 0x05, + 0x16, 0xE4, 0x1A, 0x07, 0xD2, 0xF3, 0x9B, 0x16, 0x0C, 0x0B, 0xE3, 0x20, + 0xE7, 0x1F, 0xF6, 0x21, 0xB9, 0x38, 0xAE, 0x2B, 0xA7, 0x42, 0xC8, 0x32, + 0xAF, 0x3D, 0x2E, 0x36, 0x5D, 0x2A, 0x94, 0x2E, 0x22, 0x0B, 0x05, 0x14, + 0xFD, 0xFF, 0x40, 0x00, 0xEA, 0xF0, 0xB6, 0xE9, 0x3A, 0xDD, 0xA1, 0xD5, + 0xA3, 0xCE, 0xBF, 0xCB, 0x65, 0xCF, 0x6D, 0xC9, 0x9F, 0xEC, 0x2B, 0xD6, + 0xE1, 0x09, 0xCC, 0xED, 0xD6, 0x24, 0x10, 0x0E, 0x30, 0x33, 0x46, 0x26, + 0x7D, 0x32, 0xDE, 0x2F, 0xA6, 0x31, 0x2B, 0x36, 0xF8, 0x21, 0xCB, 0x2A, + 0x73, 0x05, 0x1C, 0x0E, 0x04, 0xE9, 0x1B, 0xF6, 0x74, 0xDB, 0xB6, 0xEA, + 0xF9, 0xE1, 0x2F, 0xEB, 0xC0, 0xF8, 0xF1, 0xF7, 0xA2, 0x09, 0x42, 0x04, + 0x5B, 0x09, 0x2E, 0x08, 0x37, 0x11, 0xEC, 0x0E, 0x3F, 0x0C, 0x03, 0x07, + 0xDC, 0xEF, 0x2C, 0xF4, 0x3F, 0xCE, 0xD0, 0xE0, 0x2D, 0xB7, 0xCB, 0xC6, + 0xD4, 0xBA, 0x7A, 0xB3, 0xB6, 0xD7, 0x92, 0xB8, 0x59, 0xEE, 0x49, 0xC7, + 0x31, 0xFF, 0x0A, 0xDD, 0x26, 0x1C, 0x6A, 0x08, 0xA6, 0x2C, 0xAF, 0x28, + 0x5A, 0x2E, 0xA2, 0x32, 0x73, 0x26, 0x1E, 0x28, 0x19, 0x1B, 0xB4, 0x11, + 0xBC, 0x14, 0x13, 0x04, 0xB5, 0x02, 0x62, 0xF2, 0xEB, 0xF0, 0x77, 0xEC, + 0x0B, 0xF2, 0xC4, 0xFD, 0x2D, 0x00, 0xC3, 0x14, 0x8D, 0x1E, 0xFB, 0x33, + 0x90, 0x33, 0xE1, 0x46, 0x3D, 0x36, 0x75, 0x49, 0x4F, 0x30, 0xBA, 0x3C, + 0xFB, 0x25, 0x45, 0x29, 0xFB, 0x0F, 0xEA, 0x18, 0x26, 0xE7, 0x77, 0x00, + 0xF6, 0xCA, 0x7C, 0xF1, 0xAD, 0xBC, 0xE7, 0xE1, 0x88, 0xB2, 0x24, 0xD4, + 0x2A, 0xB8, 0x27, 0xD5, 0x14, 0xC5, 0xBB, 0xD2, 0x3C, 0xDC, 0xCB, 0xD8, + 0xC3, 0xF8, 0x1A, 0xEC, 0x13, 0x08, 0xA6, 0xFD, 0x18, 0x16, 0xD8, 0x08, + 0xFD, 0x24, 0x97, 0x11, 0xC9, 0x2A, 0xEB, 0x16, 0x17, 0x1E, 0x90, 0x0D, + 0xFA, 0x13, 0x5D, 0x06, 0x0C, 0x14, 0x71, 0x0A, 0x6D, 0x00, 0xDC, 0x00, + 0x4C, 0xF2, 0x64, 0xFA, 0xCC, 0x01, 0x41, 0x05, 0x7B, 0x07, 0xCC, 0xFC, + 0x76, 0x0B, 0xD4, 0xF1, 0x3D, 0x18, 0x49, 0xF3, 0x9E, 0x04, 0x70, 0xDD, + 0x15, 0xE3, 0x7F, 0xBF, 0x5F, 0xD3, 0xE9, 0xB6, 0xBE, 0xCF, 0xED, 0xB8, + 0x10, 0xCE, 0x23, 0xC1, 0xF8, 0xDA, 0x83, 0xDC, 0x49, 0xF2, 0xEE, 0xFC, + 0x1C, 0x08, 0x0C, 0x18, 0xF5, 0x1A, 0xEE, 0x2F, 0xE9, 0x1D, 0x81, 0x39, + 0xB7, 0x0E, 0xF0, 0x29, 0xE4, 0xF9, 0x82, 0x10, 0x21, 0xEC, 0x53, 0x05, + 0xF1, 0xEC, 0x6C, 0x07, 0xDB, 0xEB, 0xD0, 0xFD, 0xEB, 0xEC, 0x40, 0xF2, + 0xAD, 0x04, 0x8A, 0x09, 0xC3, 0x1E, 0x48, 0x2E, 0x6B, 0x2C, 0x2F, 0x3E, + 0x3E, 0x30, 0x5A, 0x3F, 0x52, 0x2F, 0xA9, 0x3C, 0xF6, 0x1F, 0x1F, 0x2F, + 0xE7, 0x0F, 0xFD, 0x1B, 0x28, 0x09, 0x54, 0x0D, 0x80, 0xFF, 0xE6, 0xFF, + 0xB1, 0xEE, 0x2B, 0xED, 0x6B, 0xE3, 0x3E, 0xE7, 0xD5, 0xDD, 0xF6, 0xEA, + 0xD2, 0xC4, 0x1A, 0xD6, 0xC4, 0xBB, 0x65, 0xBE, 0x19, 0xE0, 0x1C, 0xC7, + 0x28, 0x03, 0x81, 0xD7, 0x79, 0x0F, 0xE8, 0xE1, 0x23, 0x1E, 0x4E, 0xF8, + 0x06, 0x2B, 0xBD, 0x10, 0x46, 0x2E, 0x56, 0x22, 0x0B, 0x2A, 0x51, 0x2D, + 0x37, 0x20, 0x92, 0x2E, 0x46, 0x0D, 0x15, 0x20, 0x1A, 0xFB, 0x8B, 0x0A, + 0xC5, 0xF9, 0x79, 0xFA, 0xB5, 0xFF, 0x94, 0xF1, 0x07, 0xFB, 0x9B, 0xE6, + 0x11, 0xEF, 0x49, 0xDB, 0x5B, 0xF6, 0x21, 0xE2, 0x1E, 0xF7, 0x18, 0xE4, + 0xD3, 0xDA, 0x8D, 0xD5, 0x48, 0xBD, 0xFA, 0xC7, 0x2C, 0xAF, 0xFB, 0xC0, + 0xEA, 0xAD, 0x93, 0xC0, 0x2B, 0xB7, 0xC0, 0xCE, 0x9D, 0xCA, 0x6E, 0xEA, + 0xDF, 0xD8, 0xC3, 0xF6, 0xD1, 0xEF, 0xC8, 0x04, 0xCC, 0x1A, 0x1B, 0x24, + 0x75, 0x2D, 0x9D, 0x28, 0xAD, 0x25, 0xA0, 0x10, 0xD6, 0x1E, 0x84, 0xFB, + 0x07, 0x1A, 0x90, 0xF3, 0x04, 0x15, 0x2A, 0xF0, 0x2E, 0x0B, 0x2A, 0xEA, + 0x49, 0x0D, 0x41, 0xEF, 0x94, 0x19, 0x3D, 0xFE, 0x80, 0x23, 0xCE, 0x0F, + 0x4A, 0x2A, 0xCE, 0x22, 0x2E, 0x26, 0x7D, 0x28, 0x64, 0x1E, 0x02, 0x1A, + 0x7C, 0x18, 0x83, 0x05, 0x4A, 0x18, 0x85, 0x07, 0x70, 0x0A, 0xF6, 0x10, + 0x77, 0xEC, 0x86, 0x08, 0x6A, 0xDF, 0x9C, 0xFB, 0x52, 0xD4, 0x83, 0xE5, + 0xE7, 0xBD, 0x7E, 0xC8, 0xCE, 0xAB, 0xA2, 0xB1, 0x99, 0xA3, 0x5E, 0xA1, + 0x6B, 0xB1, 0x07, 0xAA, 0x87, 0xCC, 0x55, 0xCA, 0x79, 0xEB, 0x4A, 0xF5, + 0xA0, 0x18, 0x6E, 0x28, 0xD5, 0x39, 0x5C, 0x46, 0xAC, 0x4C, 0x64, 0x4E, + 0x70, 0x51, 0x6E, 0x49, 0x06, 0x36, 0xFF, 0x2D, 0xEF, 0x0B, 0xCF, 0x0A, + 0xA6, 0xEB, 0xC8, 0xF1, 0x6B, 0xD8, 0xEC, 0xDC, 0x23, 0xD4, 0x2D, 0xD3, + 0x87, 0xE6, 0xB2, 0xE0, 0xEE, 0xF2, 0x70, 0xE9, 0xC8, 0xF1, 0xD2, 0xE5, + 0x0E, 0xF8, 0x4B, 0xE6, 0x5F, 0xEE, 0x0E, 0xD7, 0x6D, 0xCE, 0xB7, 0xB6, + 0x97, 0xB9, 0xCA, 0xAF, 0x7F, 0xAD, 0x5E, 0xBB, 0x61, 0xB3, 0x7B, 0xD0, + 0xDC, 0xDA, 0x11, 0xF8, 0x20, 0xFE, 0xAB, 0x12, 0x09, 0x19, 0xC2, 0x27, + 0x8B, 0x3B, 0xE0, 0x45, 0xF5, 0x45, 0x40, 0x4A, 0x39, 0x2E, 0x73, 0x2E, + 0x37, 0x11, 0x1A, 0x0D, 0x51, 0x05, 0xBD, 0xF9, 0x9F, 0x06, 0x5A, 0xF2, + 0x14, 0xFC, 0x7C, 0xE9, 0x2A, 0xEE, 0xE5, 0xE9, 0x73, 0xF9, 0x75, 0x03, + 0xC8, 0x0D, 0x0C, 0x1E, 0x4F, 0x16, 0x41, 0x26, 0x56, 0x20, 0xC2, 0x2C, + 0xC3, 0x20, 0xA7, 0x21, 0x7F, 0x17, 0xA7, 0x04, 0x50, 0x1B, 0x90, 0xF9, + 0xE1, 0x14, 0xCF, 0xF5, 0x6B, 0xFC, 0xD7, 0xEC, 0x32, 0xE7, 0x23, 0xE4, + 0x30, 0xE2, 0xE3, 0xDF, 0xFD, 0xDB, 0x65, 0xD7, 0x38, 0xC7, 0xD2, 0xC4, + 0xF3, 0xBB, 0x1D, 0xBC, 0x6A, 0xC9, 0x0A, 0xC6, 0x7C, 0xE8, 0x0D, 0xDE, + 0xED, 0x0B, 0x07, 0x04, 0x5E, 0x2C, 0xD4, 0x30, 0x77, 0x3D, 0xFB, 0x4F, + 0xCE, 0x43, 0xED, 0x5B, 0xB6, 0x41, 0x13, 0x57, 0x5E, 0x28, 0x05, 0x39, + 0xED, 0x02, 0x1B, 0x11, 0xF6, 0xE5, 0x3D, 0xF5, 0x4C, 0xD1, 0xD3, 0xDE, + 0x4C, 0xCD, 0x81, 0xD1, 0x29, 0xDA, 0xB8, 0xD1, 0x8D, 0xE7, 0x49, 0xD8, + 0xD3, 0xEF, 0xE3, 0xE2, 0xEF, 0xF2, 0x7E, 0xE8, 0x21, 0xE6, 0x30, 0xD9, + 0x67, 0xD0, 0x81, 0xC0, 0xE8, 0xC5, 0x0A, 0xB8, 0x13, 0xC1, 0x5F, 0xB8, + 0xE4, 0xCF, 0xF5, 0xC7, 0x6F, 0xF6, 0x7E, 0xEA, 0x8A, 0x17, 0xE9, 0x06, + 0xBF, 0x34, 0xF0, 0x21, 0x42, 0x54, 0xEC, 0x40, 0xF5, 0x5C, 0x0C, 0x48, + 0x98, 0x3F, 0x87, 0x28, 0x27, 0x1D, 0x02, 0x04, 0x44, 0x0E, 0xF5, 0xF3, + 0xF4, 0xFE, 0x72, 0xE7, 0x93, 0xE6, 0x70, 0xDB, 0x07, 0xDE, 0x9C, 0xE9, + 0x27, 0xEF, 0xC0, 0x0F, 0x17, 0x01, 0x02, 0x25, 0xB1, 0x0F, 0x56, 0x23, + 0x40, 0x1E, 0x10, 0x1A, 0x24, 0x19, 0x1F, 0x03, 0x6E, 0x0B, 0xD3, 0xEE, + 0xA9, 0x04, 0x57, 0xEF, 0xB9, 0xF4, 0x9B, 0xF3, 0x4E, 0xE2, 0x1F, 0xF7, + 0x2F, 0xDC, 0x3C, 0xFC, 0xFA, 0xE1, 0x0A, 0x00, 0x7A, 0xE0, 0xEF, 0xF8, + 0xDB, 0xD1, 0xFF, 0xE5, 0xD0, 0xCB, 0xF5, 0xDB, 0x73, 0xD6, 0xA9, 0xE2, + 0x4F, 0xEF, 0x74, 0xF9, 0x28, 0x12, 0x91, 0x1A, 0xA9, 0x33, 0x2D, 0x38, + 0x99, 0x47, 0x0F, 0x49, 0x58, 0x50, 0x35, 0x54, 0xC1, 0x45, 0x69, 0x4F, + 0x45, 0x21, 0x09, 0x2F, 0x25, 0xF8, 0x73, 0x07, 0xE9, 0xD8, 0xC3, 0xEA, + 0x17, 0xC6, 0xE8, 0xDA, 0x86, 0xC9, 0xD4, 0xDC, 0x1D, 0xDC, 0x30, 0xE5, + 0x54, 0xED, 0x2A, 0xE7, 0xFD, 0x02, 0xA2, 0xF0, 0xE9, 0x0D, 0x87, 0xF8, + 0xEF, 0xF5, 0x90, 0xE3, 0x56, 0xDC, 0xC2, 0xCC, 0xCA, 0xDD, 0x80, 0xCF, + 0x21, 0xDD, 0x50, 0xD2, 0x1B, 0xEF, 0x4C, 0xEA, 0x34, 0x15, 0xBF, 0x14, + 0x7F, 0x23, 0x56, 0x25, 0x07, 0x30, 0xB7, 0x35, 0x63, 0x44, 0x6C, 0x4E, + 0x11, 0x38, 0x67, 0x40, 0x39, 0x11, 0x7C, 0x10, 0xA4, 0xFC, 0xF1, 0xF4, + 0x03, 0xEF, 0x7E, 0xEA, 0x2F, 0xDC, 0x85, 0xE2, 0x6E, 0xD8, 0xFD, 0xE6, + 0xD0, 0xED, 0xCB, 0xFB, 0x9A, 0x12, 0x68, 0x19, 0xD5, 0x28, 0x78, 0x28, + 0x67, 0x31, 0x5A, 0x2D, 0x8C, 0x33, 0x55, 0x2A, 0x31, 0x28, 0xC8, 0x14, + 0xD2, 0x22, 0xC9, 0x06, 0xD8, 0x1E, 0xF1, 0x08, 0xE3, 0x0C, 0xD2, 0x0B, + 0xEB, 0xF9, 0x26, 0x0E, 0xC9, 0xF3, 0x8A, 0x13, 0x8E, 0xEF, 0xFA, 0x13, + 0xF0, 0xDF, 0x86, 0x04, 0x05, 0xD2, 0x72, 0xEA, 0x18, 0xDA, 0xFD, 0xD7, + 0x60, 0xF8, 0xB1, 0xDC, 0xC8, 0x0D, 0xA4, 0xEA, 0x06, 0x1A, 0x56, 0x00, + 0xC7, 0x2F, 0x7D, 0x20, 0x78, 0x3D, 0xAF, 0x31, 0xB4, 0x3B, 0x8A, 0x30, + 0xEF, 0x29, 0x92, 0x23, 0x9B, 0x07, 0xB6, 0x07, 0x59, 0xE8, 0x35, 0xEA, + 0xDD, 0xDC, 0x65, 0xD8, 0x4F, 0xE4, 0x9F, 0xD6, 0x45, 0xF5, 0xE5, 0xE3, + 0x41, 0x03, 0x89, 0xF6, 0x0A, 0x0A, 0x0A, 0x06, 0xC6, 0x13, 0x3B, 0x16, + 0xF9, 0x07, 0x56, 0x0C, 0x87, 0xE2, 0xC4, 0xE4, 0x26, 0xD4, 0x24, 0xD3, + 0x60, 0xCE, 0x36, 0xCF, 0x10, 0xC9, 0x5F, 0xD3, 0x4F, 0xE6, 0x30, 0xFC, + 0x79, 0x04, 0x90, 0x1D, 0xCC, 0x15, 0x7A, 0x2A, 0x7B, 0x3F, 0x80, 0x51, + 0xCB, 0x4A, 0x5C, 0x61, 0xED, 0x1A, 0xF3, 0x35, 0x96, 0xFD, 0xE6, 0x13, + 0x27, 0xFF, 0xF8, 0x08, 0xDC, 0xF0, 0xB4, 0xEE, 0x1B, 0xE5, 0x35, 0xDE, + 0xD0, 0xF3, 0x2F, 0xEC, 0x20, 0x0B, 0xB3, 0xFF, 0xA9, 0x25, 0xEB, 0x10, + 0x49, 0x35, 0x74, 0x19, 0x48, 0x30, 0x53, 0x18, 0x95, 0x1B, 0x77, 0x0E, + 0x8F, 0x09, 0x72, 0x04, 0xFE, 0x05, 0xFC, 0x04, 0x5C, 0xFF, 0x1A, 0x0A, + 0x31, 0xEF, 0x00, 0x10, 0x68, 0xE6, 0xB9, 0x1A, 0xFE, 0xE7, 0xA7, 0x21, + 0xC6, 0xDB, 0x8A, 0x10, 0x3E, 0xC5, 0x6F, 0xF5, 0xE9, 0xBA, 0xAC, 0xE3, + 0xAF, 0xC7, 0x67, 0xDD, 0xA4, 0xEB, 0x6F, 0xE3, 0x51, 0x15, 0x79, 0xF5, + 0x0B, 0x37, 0x3A, 0x14, 0x64, 0x4C, 0x81, 0x37, 0x17, 0x54, 0x4B, 0x4D, + 0x8E, 0x4C, 0xCB, 0x47, 0x26, 0x32, 0x63, 0x29, 0xD7, 0x0D, 0xCD, 0x04, + 0x4B, 0xEA, 0xE7, 0xE4, 0xE4, 0xD7, 0x88, 0xD0, 0xB6, 0xDC, 0x44, 0xCC, + 0xA1, 0xEC, 0x3F, 0xD6, 0x60, 0xFE, 0xCC, 0xE9, 0x1A, 0x0C, 0x5E, 0xFB, + 0xA1, 0x10, 0x2F, 0xFD, 0x5A, 0xFE, 0x2D, 0xE5, 0x75, 0xE4, 0xBD, 0xC7, + 0x57, 0xDB, 0xC4, 0xBE, 0xBF, 0xDB, 0xEF, 0xC3, 0x8A, 0xE7, 0x06, 0xDD, + 0xBE, 0x00, 0x82, 0x0D, 0xEF, 0x13, 0x08, 0x36, 0x97, 0x26, 0x25, 0x50, + 0x1E, 0x45, 0x02, 0x66, 0xC2, 0x41, 0x5C, 0x54, 0x5D, 0x11, 0x11, 0x18, + 0xB7, 0xF6, 0x1B, 0xF2, 0x41, 0xF3, 0x31, 0xE2, 0xD0, 0xE3, 0x4D, 0xC9, + 0x40, 0xDC, 0xD9, 0xC5, 0xD0, 0xED, 0x3D, 0xE6, 0x1C, 0x06, 0xE1, 0x0A, + 0x7D, 0x1B, 0xBF, 0x20, 0xAF, 0x2A, 0xB2, 0x2C, 0xD5, 0x20, 0x29, 0x28, + 0x43, 0x09, 0x56, 0x18, 0xB6, 0x01, 0xAD, 0x0E, 0x57, 0x04, 0x7C, 0x06, + 0x0F, 0x01, 0xB3, 0x03, 0xB4, 0xF8, 0xE0, 0x0D, 0x45, 0xF5, 0x82, 0x1C, + 0x84, 0xF7, 0x07, 0x1B, 0x2C, 0xEE, 0x45, 0xF8, 0x79, 0xDA, 0x4D, 0xCB, + 0xED, 0xD2, 0xBD, 0xB7, 0xF8, 0xD6, 0x03, 0xBC, 0x23, 0xE3, 0x02, 0xCA, + 0x0D, 0x08, 0xB6, 0xEF, 0x22, 0x34, 0xC6, 0x1F, 0x8E, 0x47, 0xC3, 0x3C, + 0x3A, 0x4B, 0xDC, 0x4D, 0xEB, 0x38, 0xF2, 0x45, 0xA5, 0x0B, 0x44, 0x1E, + 0x6D, 0xE4, 0x55, 0xF5, 0xCE, 0xD5, 0x98, 0xDD, 0xCB, 0xDC, 0xF4, 0xD7, + 0x14, 0xF0, 0x12, 0xE4, 0xE7, 0x04, 0x41, 0xFE, 0x56, 0x13, 0xE8, 0x15, + 0xC6, 0x1C, 0x37, 0x22, 0x96, 0x19, 0xD0, 0x18, 0x89, 0xF8, 0xAC, 0xF3, + 0x21, 0xD9, 0x3F, 0xD8, 0x1E, 0xCE, 0xE2, 0xD5, 0x46, 0xC7, 0xF0, 0xD7, + 0x84, 0xDF, 0x07, 0xF7, 0xDD, 0x08, 0x34, 0x25, 0x45, 0x1B, 0x6F, 0x35, + 0xD3, 0x37, 0x9E, 0x4A, 0x0A, 0x54, 0x81, 0x5F, 0xC2, 0x30, 0x51, 0x37, + 0x75, 0xFB, 0x17, 0xFA, 0x2D, 0xF3, 0xE5, 0xE0, 0x33, 0xF8, 0xFC, 0xD4, + 0x7A, 0xF2, 0x23, 0xCB, 0xA9, 0xF8, 0xC1, 0xE0, 0xEB, 0x0D, 0x29, 0x0C, + 0x8F, 0x1E, 0xB4, 0x29, 0xE5, 0x22, 0x8C, 0x2C, 0xE6, 0x1F, 0xDD, 0x20, + 0x23, 0x13, 0xB5, 0x0D, 0xAF, 0x01, 0x12, 0xF7, 0xC1, 0xFC, 0xF0, 0xED, + 0xFC, 0x01, 0xDD, 0xF0, 0xB7, 0x02, 0xF7, 0xF4, 0x72, 0x05, 0xE3, 0xFD, + 0xFF, 0x07, 0xDC, 0x04, 0x08, 0xF6, 0x78, 0xF6, 0x5A, 0xD3, 0x80, 0xD6, + 0x66, 0xBA, 0x12, 0xBE, 0xD2, 0xBD, 0xC5, 0xBA, 0xDB, 0xD1, 0x6A, 0xC6, + 0xC7, 0xED, 0xF1, 0xE0, 0xD0, 0x18, 0x4C, 0x14, 0x00, 0x43, 0x19, 0x4A, + 0xF5, 0x4F, 0x2A, 0x5E, 0x6B, 0x42, 0x77, 0x56, 0xA5, 0x1F, 0x10, 0x3A, + 0xFF, 0xEE, 0xC2, 0x0D, 0xE8, 0xD0, 0x82, 0xE8, 0x38, 0xC7, 0xF1, 0xCC, + 0x91, 0xCC, 0x06, 0xC2, 0xA8, 0xDD, 0xE8, 0xCE, 0x6A, 0xEC, 0x1E, 0xE4, + 0x29, 0xFB, 0x54, 0xF6, 0x9E, 0xFD, 0x49, 0xF5, 0x92, 0xE3, 0x14, 0xD5, + 0x46, 0xC9, 0x7B, 0xB8, 0xB6, 0xC5, 0x13, 0xB4, 0xEE, 0xC7, 0xDC, 0xB3, + 0xF5, 0xD9, 0xAE, 0xC7, 0xC8, 0x04, 0x19, 0xFC, 0x66, 0x1C, 0x7D, 0x21, + 0xB1, 0x2A, 0x06, 0x34, 0xEC, 0x4D, 0x73, 0x4F, 0x89, 0x47, 0x43, 0x3C, + 0xF4, 0x10, 0x01, 0xFB, 0x73, 0xF2, 0x5B, 0xD4, 0xF1, 0xEA, 0xAD, 0xC6, + 0x1C, 0xE1, 0x2B, 0xC3, 0x04, 0xDC, 0xEE, 0xD5, 0xD2, 0xE4, 0x75, 0xFF, + 0x36, 0x01, 0x0A, 0x30, 0xB6, 0x14, 0x09, 0x43, 0xDE, 0x11, 0x66, 0x35, + 0x81, 0x06, 0xFC, 0x20, 0x5B, 0xEF, 0x8D, 0x03, 0x09, 0xEC, 0x0C, 0xF4, + 0xF2, 0xFE, 0x7D, 0xFA, 0xE7, 0x02, 0xF9, 0xFD, 0xA2, 0xFC, 0x13, 0x07, + 0x99, 0xFE, 0x51, 0x18, 0x32, 0xF7, 0x3A, 0x10, 0x81, 0xDC, 0xB7, 0xE8, + 0x31, 0xC4, 0xBC, 0xC2, 0x0F, 0xBE, 0x7D, 0xB5, 0xD5, 0xCD, 0xC4, 0xBD, + 0x33, 0xEA, 0x95, 0xD2, 0xC6, 0x0F, 0xB7, 0xF9, 0xF5, 0x31, 0xA5, 0x2A, + 0x7F, 0x41, 0xF8, 0x4C, 0x25, 0x42, 0xD4, 0x54, 0x20, 0x31, 0xAF, 0x3E, + 0x0C, 0x0C, 0xA3, 0x10, 0x7F, 0xED, 0xA8, 0xEC, 0xC8, 0xDE, 0xAC, 0xD8, + 0x0A, 0xD9, 0x88, 0xCE, 0xB4, 0xE2, 0x00, 0xDB, 0x51, 0xEF, 0x7E, 0xF2, + 0xAC, 0xFD, 0xC6, 0x0B, 0xAC, 0x0C, 0x31, 0x19, 0x76, 0x01, 0xFF, 0x02, + 0xDC, 0xE2, 0xB2, 0xDA, 0xDE, 0xCC, 0x8E, 0xC5, 0x4C, 0xC8, 0x7B, 0xC5, + 0x71, 0xCF, 0x46, 0xCB, 0x09, 0xEA, 0xA8, 0xE5, 0x03, 0x0C, 0xCA, 0x0D, + 0x1E, 0x1E, 0x8A, 0x28, 0x4D, 0x30, 0x77, 0x37, 0xA3, 0x41, 0xBB, 0x37, + 0x68, 0x2C, 0x16, 0x10, 0x67, 0x03, 0x9B, 0xDD, 0x98, 0xEE, 0x43, 0xC9, + 0x76, 0xE8, 0x98, 0xC8, 0x78, 0xDF, 0x39, 0xCB, 0x7F, 0xD8, 0xF4, 0xD3, + 0xC8, 0xEF, 0x84, 0xF6, 0x67, 0x15, 0xD5, 0x18, 0xA3, 0x25, 0xC4, 0x19, + 0x9F, 0x29, 0xB9, 0x0F, 0xE3, 0x21, 0x89, 0x09, 0x30, 0x0D, 0x56, 0x03, + 0x9F, 0x07, 0x43, 0x05, 0x86, 0x0F, 0x7E, 0x0D, 0x8C, 0x0E, 0x6D, 0x0F, + 0xDB, 0x04, 0xB7, 0x12, 0x07, 0xFA, 0x86, 0x1B, 0xF1, 0xDE, 0x65, 0x0D, + 0x93, 0xB8, 0x79, 0xE8, 0x29, 0xA6, 0x98, 0xCE, 0xAA, 0xAA, 0x68, 0xCC, + 0x9C, 0xBF, 0x42, 0xDC, 0x37, 0xE4, 0xB0, 0xF9, 0x0C, 0x0F, 0xA2, 0x1C, + 0x15, 0x35, 0xFC, 0x39, 0x61, 0x4E, 0xDC, 0x48, 0xB2, 0x4F, 0x7E, 0x42, + 0x3B, 0x34, 0x50, 0x25, 0xAF, 0x12, 0xF3, 0x00, 0x11, 0xF9, 0xEF, 0xE0, + 0xC9, 0xE6, 0xCC, 0xC7, 0x62, 0xE7, 0x94, 0xC8, 0x37, 0xEC, 0x71, 0xD6, + 0x03, 0xEA, 0x17, 0xE1, 0xBF, 0xF3, 0xED, 0xF2, 0xB5, 0xFB, 0xBA, 0xF3, + 0xA5, 0xEC, 0x58, 0xD6, 0x87, 0xDC, 0x5C, 0xBA, 0x7B, 0xDA, 0x65, 0xB6, + 0x09, 0xDA, 0x7C, 0xC0, 0xCC, 0xDD, 0xD6, 0xD3, 0x3F, 0xF4, 0x28, 0xFF, + 0x17, 0x0A, 0x14, 0x27, 0x94, 0x18, 0x11, 0x36, 0x9D, 0x37, 0x93, 0x45, + 0xBC, 0x44, 0xC4, 0x41, 0x5A, 0x20, 0x14, 0x17, 0xDA, 0xF6, 0x46, 0xF6, + 0xBA, 0xE6, 0xAE, 0xF3, 0x76, 0xDD, 0xEF, 0xF0, 0x99, 0xDC, 0x32, 0xEE, + 0x3D, 0xF3, 0xCC, 0xFD, 0xA0, 0x10, 0x9D, 0x19, 0xEE, 0x21, 0x93, 0x2D, + 0x21, 0x26, 0x36, 0x32, 0x70, 0x1C, 0x2B, 0x26, 0x44, 0x0C, 0x7B, 0x11, + 0x4F, 0x04, 0x89, 0x05, 0xE8, 0x06, 0x17, 0x04, 0xA5, 0x0A, 0x16, 0x09, + 0xCF, 0x06, 0x6E, 0x0B, 0x95, 0xFF, 0xE2, 0x0B, 0xF6, 0xF6, 0xE2, 0x0A, + 0xC3, 0xE6, 0x9E, 0xFA, 0x51, 0xD0, 0x08, 0xDE, 0x34, 0xCB, 0x0C, 0xD0, + 0x18, 0xDE, 0xEE, 0xD2, 0xD9, 0xFE, 0xF5, 0xE0, 0x3F, 0x2C, 0x7F, 0x03, + 0x1C, 0x50, 0x55, 0x25, 0x91, 0x5E, 0x2C, 0x39, 0x48, 0x5E, 0x39, 0x3F, + 0x97, 0x49, 0x2F, 0x32, 0xF7, 0x1B, 0xA3, 0x13, 0x67, 0xED, 0xB9, 0xF0, + 0xB3, 0xDA, 0x98, 0xE1, 0xB8, 0xD7, 0xAA, 0xD8, 0x65, 0xDC, 0xCD, 0xD3, + 0x44, 0xEA, 0x38, 0xE6, 0xEB, 0xF0, 0x8C, 0xFB, 0x62, 0xF0, 0xDD, 0x01, + 0xFE, 0xE9, 0x85, 0xF2, 0x02, 0xDC, 0xC0, 0xD5, 0x02, 0xD8, 0xE2, 0xCA, + 0x6D, 0xD3, 0xF9, 0xC9, 0x6A, 0xD0, 0x16, 0xCC, 0x59, 0xEF, 0xE4, 0xEA, + 0xAA, 0x0D, 0x71, 0x0C, 0x3B, 0x16, 0x2E, 0x22, 0x32, 0x2F, 0x08, 0x47, + 0x4E, 0x3C, 0x27, 0x53, 0x96, 0x1F, 0x6D, 0x2D, 0x08, 0x04, 0xF4, 0x07, + 0xDC, 0xF3, 0x76, 0xF2, 0xD1, 0xDB, 0x71, 0xD6, 0x92, 0xCE, 0x52, 0xC6, + 0xD7, 0xD9, 0x72, 0xD7, 0x94, 0xF4, 0xE0, 0xF3, 0x95, 0x13, 0xD3, 0x0C, + 0xB1, 0x23, 0x55, 0x16, 0x2C, 0x25, 0x9E, 0x10, 0xE6, 0x1F, 0x76, 0x0B, + 0xE9, 0x14, 0x07, 0x06, 0x30, 0x0A, 0xB2, 0xFD, 0x9A, 0x0B, 0xE3, 0x01, + 0x9C, 0x0E, 0x0D, 0x0F, 0x94, 0x04, 0xC9, 0x16, 0xAA, 0xF3, 0x50, 0x14, + 0xBF, 0xE0, 0x58, 0xFD, 0xAA, 0xCD, 0x8E, 0xDB, 0x46, 0xBB, 0x42, 0xC5, + 0x7D, 0xB7, 0x66, 0xC8, 0xDD, 0xD2, 0x8F, 0xE5, 0xCA, 0x01, 0xA3, 0x0C, + 0x8C, 0x2B, 0x21, 0x32, 0x02, 0x4B, 0xAE, 0x51, 0x5F, 0x56, 0x3D, 0x5D, + 0x83, 0x45, 0xBB, 0x4E, 0x84, 0x23, 0x08, 0x2D, 0x8E, 0xF8, 0x67, 0x05, + 0x1F, 0xDB, 0xAE, 0xEE, 0x35, 0xD2, 0x31, 0xE5, 0xA5, 0xD7, 0x30, 0xE0, + 0xFA, 0xE9, 0x18, 0xE7, 0x78, 0xF6, 0x51, 0xF1, 0xC5, 0xFC, 0x73, 0xF6, + 0x43, 0xFC, 0x4C, 0xEC, 0x9A, 0xF2, 0x99, 0xD4, 0x64, 0xF2, 0xFF, 0xC6, + 0x67, 0xF5, 0x17, 0xCA, 0xEB, 0xF8, 0x25, 0xE2, 0xBC, 0x08, 0xF4, 0x05, + 0xC7, 0x1C, 0xDE, 0x22, 0xA6, 0x31, 0x43, 0x3D, 0x0E, 0x49, 0xBA, 0x55, + 0x3C, 0x47, 0x1C, 0x52, 0x12, 0x23, 0x54, 0x2C, 0xC6, 0xF9, 0x1A, 0x04, + 0xDC, 0xE3, 0xAC, 0xF0, 0x07, 0xDE, 0x57, 0xE8, 0xEA, 0xD7, 0x39, 0xDC, + 0x6D, 0xE6, 0x88, 0xE2, 0xBB, 0x0C, 0x33, 0x01, 0x5A, 0x28, 0xCE, 0x19, + 0x61, 0x30, 0x21, 0x26, 0x96, 0x23, 0x47, 0x26, 0xDD, 0x13, 0xEB, 0x1E, + 0x39, 0x14, 0x8A, 0x1C, 0x66, 0x11, 0x89, 0x17, 0x4E, 0x0E, 0x30, 0x13, + 0xEF, 0x12, 0xA2, 0x13, 0x7F, 0x0C, 0xE8, 0x0A, 0x4F, 0xFC, 0x20, 0xF9, + 0xE6, 0xE5, 0x36, 0xE0, 0x25, 0xC8, 0xB4, 0xC1, 0xFA, 0xBC, 0xEE, 0xB6, + 0x1B, 0xD0, 0x13, 0xC6, 0x85, 0xFA, 0x95, 0xE6, 0x96, 0x30, 0x02, 0x15, + 0x7A, 0x5A, 0xD0, 0x3C, 0x6D, 0x68, 0x96, 0x50, 0x36, 0x5E, 0xA0, 0x54, + 0x8D, 0x40, 0x5B, 0x44, 0x97, 0x11, 0xB5, 0x21, 0xEA, 0xE9, 0x11, 0x04, + 0x94, 0xD8, 0x97, 0xF4, 0x8F, 0xD5, 0x44, 0xEF, 0x17, 0xDD, 0x82, 0xEE, + 0x05, 0xEB, 0xDB, 0xF1, 0x4F, 0xF3, 0x33, 0xF9, 0x1A, 0xED, 0x0A, 0xF8, + 0xE6, 0xD7, 0x48, 0xEB, 0x8D, 0xC1, 0x49, 0xDE, 0x34, 0xBD, 0x23, 0xD6, + 0x77, 0xCB, 0x1A, 0xD4, 0xBE, 0xE8, 0x8F, 0xE6, 0x97, 0x04, 0x75, 0x05, + 0xB7, 0x13, 0x3D, 0x1C, 0x37, 0x24, 0x67, 0x31, 0x30, 0x35, 0x4E, 0x45, + 0x81, 0x31, 0xBF, 0x3D, 0x66, 0x16, 0x8A, 0x16, 0xBB, 0x00, 0xF6, 0xF2, + 0x62, 0xFF, 0xEC, 0xE0, 0xBA, 0xFC, 0xC5, 0xCE, 0xE4, 0xF8, 0xDA, 0xC8, + 0xE7, 0xFF, 0x91, 0xDC, 0x3A, 0x13, 0x63, 0xFF, 0xB8, 0x25, 0x16, 0x1B, + 0x90, 0x27, 0xDC, 0x20, 0xCD, 0x22, 0x72, 0x1C, 0x56, 0x1B, 0x51, 0x18, + 0xE0, 0x0B, 0xFE, 0x0E, 0x3D, 0x07, 0x39, 0x06, 0xF6, 0x10, 0xD6, 0x0B, + 0x55, 0x0B, 0x93, 0x0D, 0xB9, 0xFD, 0x18, 0x05, 0x8A, 0xF4, 0xAE, 0xFB, + 0xAF, 0xDD, 0xC4, 0xDF, 0xF7, 0xC4, 0xAE, 0xBC, 0x3C, 0xC2, 0xAE, 0xBA, + 0xB3, 0xD1, 0x0D, 0xD7, 0x93, 0xEF, 0x91, 0xFF, 0xDF, 0x1B, 0x00, 0x32, + 0xE7, 0x41, 0x5D, 0x56, 0xD0, 0x4F, 0x32, 0x5F, 0xEA, 0x45, 0x14, 0x58, + 0x04, 0x25, 0x4A, 0x3B, 0x6B, 0xFA, 0xE3, 0x0A, 0x81, 0xDD, 0x08, 0xE6, + 0xE0, 0xCE, 0x37, 0xD8, 0x4E, 0xCF, 0xB7, 0xD5, 0x9C, 0xE1, 0xF3, 0xDA, + 0x4D, 0xF3, 0xC6, 0xE6, 0x51, 0xF2, 0x5D, 0xEF, 0x63, 0xE3, 0xCA, 0xED, + 0x27, 0xD4, 0x84, 0xE2, 0x4C, 0xCD, 0x76, 0xD4, 0x55, 0xD8, 0x22, 0xCE, + 0x8C, 0xF3, 0x80, 0xD5, 0xBD, 0x0C, 0x52, 0xEF, 0xE8, 0x19, 0x21, 0x10, + 0xB6, 0x27, 0xDF, 0x2C, 0x4D, 0x39, 0xC2, 0x47, 0x0E, 0x39, 0xCD, 0x4C, + 0xAB, 0x19, 0x49, 0x2A, 0x41, 0xF8, 0x24, 0x01, 0x0C, 0xEB, 0x35, 0xE9, + 0xD1, 0xE1, 0x34, 0xD7, 0xB8, 0xD5, 0xAB, 0xC6, 0x40, 0xE0, 0x03, 0xCE, + 0x0E, 0xFB, 0x16, 0xEE, 0x2A, 0x0A, 0xAB, 0x09, 0x92, 0x17, 0x0E, 0x1A, + 0xAB, 0x20, 0x9B, 0x1B, 0x14, 0x1C, 0xA4, 0x0F, 0x02, 0x16, 0x0C, 0x06, + 0x32, 0x12, 0x75, 0x04, 0xC7, 0x0F, 0x55, 0x08, 0x4C, 0x0D, 0xC8, 0x0C, + 0xD2, 0x01, 0x31, 0x06, 0x2C, 0xF3, 0x6F, 0xFB, 0xAC, 0xE0, 0x51, 0xEE, + 0xAB, 0xC3, 0xE8, 0xD5, 0x2E, 0xB4, 0x7B, 0xC5, 0x2B, 0xC4, 0xCE, 0xD0, + 0xE1, 0xE6, 0xA3, 0xF5, 0xD6, 0x14, 0x73, 0x26, 0x35, 0x3F, 0xCD, 0x4D, + 0x66, 0x52, 0xA9, 0x5E, 0xC5, 0x4F, 0x50, 0x58, 0x2B, 0x37, 0x2C, 0x3D, + 0xF7, 0x08, 0x60, 0x15, 0xCB, 0xDE, 0xA9, 0xEC, 0xE1, 0xD3, 0xB2, 0xD2, + 0x9D, 0xD6, 0x9C, 0xC2, 0x56, 0xDE, 0x9E, 0xBF, 0x82, 0xF3, 0x27, 0xD6, + 0xEC, 0x01, 0x85, 0xE7, 0xCE, 0xFE, 0x70, 0xE1, 0x46, 0xF5, 0x70, 0xD8, + 0xCD, 0xE8, 0xF1, 0xD3, 0x44, 0xD7, 0x93, 0xCD, 0xE2, 0xD7, 0xE2, 0xD3, + 0xDF, 0xF5, 0x1F, 0xEE, 0x08, 0x14, 0xB2, 0x03, 0x00, 0x2B, 0xD8, 0x16, + 0x48, 0x44, 0x49, 0x39, 0x1D, 0x44, 0xDE, 0x49, 0xBF, 0x1E, 0xCE, 0x30, + 0x0B, 0xFA, 0xA8, 0x0C, 0xE8, 0xEB, 0xDF, 0xF5, 0x0E, 0xE5, 0x27, 0xE2, + 0xA7, 0xE6, 0xF2, 0xD1, 0x39, 0xFA, 0x22, 0xD8, 0x03, 0x14, 0x1E, 0xF5, + 0x9E, 0x20, 0xB3, 0x0F, 0xA5, 0x1D, 0x8C, 0x1C, 0xA2, 0x14, 0x7D, 0x21, + 0xD9, 0x0A, 0x46, 0x1D, 0xB6, 0x04, 0xDE, 0x12, 0x54, 0x02, 0x4F, 0x08, + 0xEB, 0x04, 0xE1, 0x02, 0x43, 0x08, 0xE5, 0x01, 0x5D, 0xFC, 0x92, 0xF9, + 0x0C, 0xE3, 0x50, 0xEC, 0x73, 0xCA, 0x9D, 0xE0, 0xE7, 0xB5, 0x14, 0xCC, + 0x4E, 0xB1, 0x46, 0xBC, 0x23, 0xC8, 0x6F, 0xCD, 0xE6, 0xEE, 0x26, 0xFA, + 0x7D, 0x13, 0x28, 0x28, 0xAE, 0x35, 0xF6, 0x4C, 0x28, 0x49, 0x01, 0x62, + 0xA4, 0x3D, 0x97, 0x5E, 0xD2, 0x1F, 0xE2, 0x41, 0xBF, 0x04, 0xAD, 0x19, + 0x1F, 0xEF, 0x3A, 0xF5, 0x5D, 0xDC, 0x30, 0xDE, 0xCE, 0xD9, 0x20, 0xDA, + 0x43, 0xDF, 0xBE, 0xDA, 0xEA, 0xE5, 0x27, 0xE0, 0x62, 0xF4, 0xE1, 0xEC, + 0x52, 0xF3, 0xD6, 0xEB, 0x38, 0xE5, 0xC7, 0xE0, 0x2D, 0xE6, 0x14, 0xDF, + 0x24, 0xE7, 0xFC, 0xD9, 0x96, 0xE8, 0x6C, 0xD8, 0xEA, 0xFD, 0x8D, 0xE7, + 0xA1, 0x16, 0x79, 0xF5, 0x03, 0x2B, 0xF1, 0x06, 0x28, 0x3F, 0x8F, 0x23, + 0xDD, 0x3C, 0x91, 0x30, 0x83, 0x22, 0x1A, 0x20, 0x75, 0x08, 0x67, 0x01, + 0x5D, 0xFA, 0x0C, 0xE9, 0xFA, 0xF1, 0x1E, 0xE3, 0xD0, 0xE6, 0x4E, 0xE2, + 0x91, 0xE5, 0xAD, 0xE6, 0xC4, 0xF6, 0xE1, 0x00, 0xFB, 0x06, 0xF4, 0x1C, + 0x1F, 0x0B, 0xC3, 0x28, 0x31, 0x0B, 0x00, 0x2B, 0x72, 0x07, 0x4E, 0x23, + 0x28, 0x03, 0x42, 0x15, 0xF3, 0x01, 0xA5, 0x0B, 0x71, 0x02, 0x2E, 0x0A, + 0x5F, 0x01, 0xE7, 0x08, 0xC5, 0xF7, 0xAF, 0xFE, 0x9B, 0xE3, 0x40, 0xEA, + 0x42, 0xD1, 0xA6, 0xD5, 0xB9, 0xC6, 0xD3, 0xC6, 0xC1, 0xC3, 0xAB, 0xC4, + 0x18, 0xD6, 0x8D, 0xD8, 0x61, 0xFE, 0x65, 0xFB, 0x20, 0x29, 0x16, 0x24, + 0x96, 0x48, 0xD5, 0x43, 0xF5, 0x5D, 0xA3, 0x52, 0x1D, 0x60, 0x51, 0x4E, + 0x12, 0x40, 0x74, 0x2A, 0xD9, 0x13, 0xFC, 0xF9, 0xE6, 0xF8, 0x64, 0xE0, + 0xD1, 0xE0, 0x6C, 0xCF, 0x38, 0xCB, 0x12, 0xBD, 0xB3, 0xCE, 0x6A, 0xC1, + 0x51, 0xDF, 0xAB, 0xD7, 0x6E, 0xE4, 0xD3, 0xE3, 0xD6, 0xDD, 0x4B, 0xE4, + 0xFA, 0xD5, 0xB1, 0xE0, 0xB2, 0xD6, 0x6D, 0xD6, 0x08, 0xE1, 0x6A, 0xD2, + 0x1E, 0xF1, 0xBC, 0xDC, 0x59, 0x00, 0x97, 0xED, 0x31, 0x0A, 0x0B, 0x03, + 0x02, 0x20, 0xE0, 0x23, 0x4F, 0x3A, 0xF5, 0x43, 0xE0, 0x39, 0xEF, 0x46, + 0xA3, 0x19, 0xD0, 0x29, 0x83, 0xFB, 0x47, 0x0A, 0xCF, 0xF0, 0xA6, 0xF7, + 0xA7, 0xDE, 0x2B, 0xDF, 0x65, 0xD1, 0xAE, 0xCF, 0xC3, 0xE8, 0x48, 0xE3, + 0x32, 0x0E, 0xE1, 0x04, 0x82, 0x24, 0x79, 0x20, 0x04, 0x2A, 0xAE, 0x2E, + 0xD9, 0x20, 0x7B, 0x28, 0xA6, 0x11, 0x14, 0x18, 0xE2, 0x04, 0xC5, 0x08, + 0x22, 0xFE, 0x8D, 0xFE, 0xF1, 0xFF, 0x0E, 0xFD, 0x0D, 0x07, 0xD0, 0xFE, + 0xB1, 0x04, 0xFA, 0xF2, 0x3F, 0xF3, 0xF0, 0xDD, 0x7A, 0xD5, 0x9B, 0xC9, + 0x06, 0xB6, 0xCB, 0xB9, 0xB9, 0xAE, 0xC6, 0xC3, 0xA2, 0xC9, 0xC4, 0xE7, + 0x32, 0xF6, 0x26, 0x11, 0xA1, 0x28, 0xB0, 0x3A, 0x12, 0x56, 0x5C, 0x57, + 0xF5, 0x64, 0x05, 0x57, 0xFD, 0x4D, 0x29, 0x3F, 0x4E, 0x21, 0xD1, 0x1A, + 0x6E, 0xF5, 0xF4, 0xF7, 0xAA, 0xD6, 0x01, 0xDD, 0xF4, 0xC4, 0xF0, 0xC9, + 0x86, 0xC8, 0x0E, 0xCE, 0x8A, 0xDE, 0x3A, 0xE4, 0x38, 0xEB, 0x07, 0xF3, + 0x60, 0xE4, 0x82, 0xF4, 0xB1, 0xDA, 0xFB, 0xF0, 0x5A, 0xDA, 0x60, 0xEE, + 0x2B, 0xDF, 0xAE, 0xEA, 0xC6, 0xE5, 0x09, 0xEA, 0xEE, 0xF1, 0xEE, 0xEF, + 0x34, 0xFE, 0x03, 0xFB, 0x5C, 0x12, 0x4F, 0x13, 0xE6, 0x2F, 0x96, 0x2E, + 0x05, 0x3A, 0x71, 0x35, 0xEE, 0x24, 0x7E, 0x21, 0x20, 0x0A, 0x27, 0x05, + 0x99, 0xF8, 0x95, 0xF0, 0x95, 0xEB, 0xEE, 0xDD, 0xC6, 0xE3, 0x04, 0xD0, + 0xD3, 0xE7, 0x16, 0xD5, 0x7E, 0xFB, 0x74, 0xEC, 0xE9, 0x11, 0x9D, 0x07, + 0xD6, 0x1E, 0x2A, 0x19, 0x95, 0x21, 0xC9, 0x1F, 0xA4, 0x19, 0x46, 0x19, + 0x25, 0x11, 0xCB, 0x0A, 0x9B, 0x0D, 0x44, 0x00, 0xEE, 0x01, 0xF1, 0xEF, + 0xA1, 0xF5, 0x2C, 0xE0, 0x82, 0xEF, 0xCF, 0xDA, 0x54, 0xE1, 0x6B, 0xD1, + 0x1B, 0xD8, 0x48, 0xCA, 0x1E, 0xDB, 0x41, 0xD0, 0x01, 0xD8, 0x41, 0xD8, + 0x0F, 0xE2, 0x0B, 0xEF, 0xBB, 0x06, 0x4A, 0x1D, 0x82, 0x24, 0x1C, 0x43, + 0xC2, 0x35, 0x51, 0x55, 0x57, 0x4A, 0x75, 0x5D, 0xED, 0x44, 0xA4, 0x50, + 0xC2, 0x23, 0xE8, 0x30, 0xCF, 0x0C, 0x52, 0x16, 0x8D, 0xF6, 0xBF, 0xFB, + 0xA7, 0xE0, 0xCF, 0xDC, 0x90, 0xDB, 0x39, 0xD1, 0x73, 0xDE, 0xFB, 0xDC, + 0x10, 0xE7, 0x6E, 0xED, 0x20, 0xEF, 0x42, 0xF4, 0x18, 0xEA, 0x97, 0xF1, + 0x3B, 0xE3, 0x04, 0xF6, 0xE5, 0xD7, 0xF4, 0xF6, 0x29, 0xCC, 0xA4, 0xEC, + 0x01, 0xD7, 0xBA, 0xE8, 0xF4, 0xED, 0x0B, 0xE3, 0x90, 0x09, 0xC2, 0xE4, + 0xFF, 0x37, 0x41, 0x0A, 0xE3, 0x58, 0xE4, 0x2D, 0xEA, 0x40, 0x14, 0x26, + 0x25, 0x13, 0x37, 0x16, 0x41, 0xFC, 0x1B, 0x1A, 0xF8, 0xE8, 0x35, 0x10, + 0x2C, 0xD1, 0x5A, 0xF3, 0x7A, 0xD3, 0x28, 0xEE, 0x1D, 0xEE, 0x8C, 0x00, + 0x7D, 0x08, 0x4E, 0x16, 0xAA, 0x18, 0xE0, 0x29, 0x8E, 0x1A, 0xEE, 0x2C, + 0xA0, 0x11, 0xFD, 0x20, 0xD0, 0x0C, 0x16, 0x16, 0x0D, 0x0B, 0xDE, 0x07, + 0x4A, 0x04, 0x3E, 0xFB, 0x9A, 0xFE, 0x2C, 0xF6, 0x65, 0xF6, 0xD1, 0xE4, + 0x03, 0xE8, 0x75, 0xCE, 0xE0, 0xDB, 0x45, 0xC0, 0x52, 0xCC, 0xC0, 0xAE, + 0x1C, 0xCA, 0xFC, 0xAF, 0x99, 0xEC, 0xE1, 0xD7, 0x85, 0x17, 0xC4, 0x05, + 0xAE, 0x36, 0x9B, 0x28, 0x6B, 0x52, 0xE4, 0x4B, 0x61, 0x59, 0x12, 0x57, + 0x71, 0x42, 0x0C, 0x3D, 0xAE, 0x2B, 0x96, 0x1E, 0x49, 0x16, 0xA1, 0xFD, + 0xCC, 0xF8, 0xA5, 0xD8, 0x8A, 0xE6, 0x17, 0xCB, 0x97, 0xE7, 0xDD, 0xDB, + 0x44, 0xEE, 0xBD, 0xF8, 0xD8, 0xF1, 0x6C, 0x0D, 0x9E, 0xF0, 0x7D, 0x11, + 0x9A, 0xEE, 0xF6, 0x15, 0xEA, 0xE9, 0xB6, 0x17, 0x79, 0xDD, 0x89, 0x05, + 0x71, 0xD2, 0xC5, 0xF1, 0x08, 0xCD, 0x71, 0xE7, 0xE6, 0xDB, 0xA9, 0xF0, + 0x18, 0x06, 0x8B, 0x0D, 0x20, 0x28, 0xC6, 0x1A, 0x60, 0x2C, 0x94, 0x11, + 0xB6, 0x24, 0xC6, 0x0A, 0x77, 0x1B, 0x6D, 0x0B, 0x64, 0x0C, 0xDB, 0x02, + 0x8C, 0xEF, 0x1C, 0xEB, 0x26, 0xDB, 0x7A, 0xDD, 0x5A, 0xEA, 0xDF, 0xEA, + 0x14, 0x01, 0x6C, 0xFD, 0x55, 0x0E, 0xC8, 0x06, 0x88, 0x1C, 0xA2, 0x0E, + 0x78, 0x25, 0x48, 0x15, 0xE5, 0x23, 0x2A, 0x13, 0x61, 0x1F, 0xA4, 0x09, + 0xB3, 0x14, 0x9A, 0xFD, 0x02, 0xFD, 0x1C, 0xEF, 0x00, 0xE2, 0xE4, 0xDF, + 0x0B, 0xD2, 0x00, 0xD0, 0x79, 0xC6, 0x18, 0xBF, 0x8F, 0xBF, 0xC9, 0xBC, + 0xF5, 0xC8, 0xDF, 0xCE, 0xD0, 0xE2, 0xD4, 0xF1, 0xB9, 0x0D, 0xDA, 0x22, + 0x3A, 0x36, 0x7F, 0x4B, 0x66, 0x4A, 0x59, 0x5F, 0xDE, 0x50, 0xEB, 0x61, + 0x05, 0x45, 0xC0, 0x4C, 0xF3, 0x27, 0x2A, 0x2E, 0xEB, 0x04, 0xD8, 0x0E, + 0xFE, 0xDF, 0x2E, 0xE5, 0x4F, 0xC9, 0xF0, 0xCD, 0x79, 0xCE, 0x97, 0xD8, + 0x75, 0xE5, 0xFE, 0xEC, 0xBF, 0xFD, 0xB9, 0xFF, 0x2D, 0x0D, 0xAC, 0x0B, + 0x01, 0x13, 0x96, 0x0C, 0x6A, 0x0C, 0xD8, 0x04, 0xB2, 0xF5, 0xE1, 0xF6, + 0x18, 0xDD, 0xF6, 0xE9, 0x64, 0xD0, 0x14, 0xE6, 0xD1, 0xDC, 0x65, 0xF0, + 0xDE, 0x04, 0x13, 0x0A, 0x91, 0x2C, 0xAC, 0x28, 0xA5, 0x3C, 0x27, 0x36, + 0x93, 0x32, 0x54, 0x2C, 0x04, 0x21, 0xFF, 0x1D, 0x7E, 0x14, 0x21, 0x10, + 0xE9, 0x00, 0xD7, 0xFA, 0xD7, 0xF1, 0xA0, 0xEE, 0x13, 0xFA, 0x50, 0xFA, + 0x7E, 0x0F, 0x70, 0x10, 0xA6, 0x22, 0xBB, 0x20, 0x27, 0x2B, 0xA3, 0x2B, + 0x47, 0x27, 0xAA, 0x30, 0x6A, 0x1C, 0x3E, 0x27, 0xC1, 0x10, 0x13, 0x18, + 0xC4, 0x06, 0x6C, 0x0F, 0x57, 0xF9, 0x3D, 0x01, 0x14, 0xEC, 0x2F, 0xE4, + 0x69, 0xE2, 0xF4, 0xC2, 0x24, 0xDA, 0x3B, 0xB0, 0x40, 0xD1, 0xAC, 0xAB, + 0xF3, 0xCC, 0x61, 0xB1, 0x42, 0xE2, 0xC0, 0xD0, 0x74, 0x10, 0x3F, 0x0A, + 0x07, 0x38, 0x5C, 0x3C, 0x08, 0x50, 0xF9, 0x55, 0x51, 0x59, 0xBC, 0x5A, + 0xC6, 0x49, 0x5E, 0x45, 0xC1, 0x27, 0x9D, 0x20, 0x75, 0xFF, 0xAC, 0xF8, + 0x32, 0xD7, 0x0B, 0xD3, 0xB2, 0xC0, 0xD3, 0xC1, 0x3C, 0xCA, 0xFE, 0xCC, + 0x16, 0xDD, 0x75, 0xDF, 0xAF, 0xEC, 0x0B, 0xEC, 0x2F, 0x01, 0x2C, 0xF9, + 0x99, 0x09, 0x7E, 0xFC, 0x05, 0x01, 0xBD, 0xF7, 0xF1, 0xF1, 0xDE, 0xF2, + 0x33, 0xD8, 0x2C, 0xDE, 0x81, 0xC6, 0x9F, 0xCB, 0x19, 0xDD, 0x59, 0xDF, + 0x19, 0x08, 0x2C, 0x06, 0x6D, 0x24, 0x41, 0x1E, 0xB3, 0x2A, 0x45, 0x26, + 0x03, 0x22, 0x10, 0x2A, 0x50, 0x16, 0xA7, 0x27, 0xF9, 0x01, 0x33, 0x14, + 0xA3, 0xE6, 0x35, 0xFC, 0x0D, 0xDA, 0xDE, 0xF4, 0x91, 0xE4, 0xAD, 0xFC, + 0x88, 0xFE, 0x59, 0x04, 0xC8, 0x17, 0x4D, 0x0B, 0x3F, 0x22, 0xFE, 0x15, + 0x2C, 0x1F, 0x47, 0x1A, 0x83, 0x13, 0xFD, 0x13, 0xF0, 0x05, 0xDC, 0x0B, + 0xEF, 0xF4, 0x22, 0x00, 0x1D, 0xDC, 0xE2, 0xEB, 0x56, 0xC9, 0x20, 0xD6, + 0x13, 0xCA, 0x5E, 0xC6, 0x36, 0xD4, 0x4E, 0xBA, 0x1E, 0xE0, 0x5C, 0xB9, + 0x03, 0xFA, 0x5D, 0xD4, 0x8C, 0x20, 0xF6, 0x09, 0xC6, 0x3F, 0x5C, 0x3B, + 0x18, 0x52, 0xCB, 0x55, 0x4A, 0x56, 0x20, 0x62, 0x3B, 0x42, 0xE8, 0x53, + 0xD8, 0x18, 0x54, 0x29, 0x4F, 0xEA, 0xE5, 0xFF, 0x59, 0xC6, 0x9C, 0xE1, + 0x83, 0xB4, 0xC4, 0xCC, 0x18, 0xBD, 0x65, 0xCE, 0x88, 0xDB, 0x5B, 0xE9, + 0x26, 0xF5, 0xF4, 0x06, 0x66, 0x02, 0x44, 0x17, 0x50, 0x0C, 0x32, 0x19, + 0x1C, 0x0A, 0x2E, 0x0A, 0x1D, 0xF4, 0x6B, 0xF0, 0xAC, 0xD9, 0xE6, 0xD7, + 0xC8, 0xC6, 0x88, 0xC6, 0x4B, 0xD0, 0xE4, 0xCE, 0x7D, 0x05, 0xA3, 0xF7, + 0xFF, 0x39, 0x95, 0x1C, 0xF2, 0x49, 0x78, 0x26, 0x3D, 0x46, 0x58, 0x27, + 0x43, 0x39, 0xE6, 0x21, 0x0C, 0x1E, 0xF8, 0x07, 0x21, 0xFC, 0x55, 0xEB, + 0x09, 0xE9, 0x4F, 0xE4, 0x5D, 0xED, 0xCF, 0xED, 0xE3, 0xFC, 0xE2, 0xF7, + 0xDD, 0x0D, 0xE8, 0x02, 0x3C, 0x1A, 0x99, 0x12, 0x92, 0x17, 0x8B, 0x16, + 0xD4, 0x0C, 0x29, 0x0C, 0x6B, 0x0B, 0x43, 0x03, 0x1B, 0x09, 0x98, 0xFA, + 0x07, 0xF6, 0x05, 0xEC, 0x5B, 0xDA, 0xB6, 0xDD, 0xD0, 0xC6, 0xC7, 0xD6, + 0xC6, 0xBF, 0x67, 0xD1, 0x18, 0xC4, 0xF2, 0xCF, 0x6C, 0xDA, 0xE5, 0xE4, + 0xF9, 0x01, 0xB0, 0x0F, 0x48, 0x2B, 0x95, 0x3A, 0x8B, 0x48, 0x86, 0x57, + 0x51, 0x4D, 0xE6, 0x5E, 0xA0, 0x37, 0xB5, 0x4C, 0x04, 0x14, 0x57, 0x25, + 0x19, 0xE9, 0xDD, 0xF4, 0x57, 0xC2, 0xAC, 0xCA, 0x9D, 0xB6, 0x97, 0xB8, + 0xD1, 0xC4, 0x8D, 0xC1, 0x07, 0xDC, 0x4B, 0xD9, 0xDA, 0xF3, 0x06, 0xF7, + 0x2E, 0x0B, 0xCB, 0x0F, 0x28, 0x15, 0xF8, 0x0E, 0x23, 0x0B, 0x70, 0xF5, + 0xF3, 0xF7, 0x99, 0xD7, 0xAE, 0xDA, 0xA0, 0xB6, 0x0D, 0xC2, 0x48, 0x9E, + 0xA4, 0xD3, 0xDF, 0xB2, 0x11, 0x05, 0x32, 0xE6, 0xE9, 0x27, 0x56, 0x0B, + 0xC1, 0x34, 0x69, 0x20, 0x02, 0x34, 0x46, 0x2C, 0x55, 0x24, 0x55, 0x29, + 0xC6, 0x09, 0x1E, 0x16, 0x25, 0xE7, 0x85, 0xFB, 0x4B, 0xCE, 0x64, 0xEC, + 0x14, 0xD6, 0x63, 0xF4, 0xEA, 0xEE, 0xD8, 0x07, 0xE3, 0x02, 0x70, 0x17, + 0x88, 0x13, 0xBD, 0x21, 0xED, 0x19, 0x17, 0x25, 0x45, 0x11, 0xBE, 0x20, + 0xFA, 0x08, 0x35, 0x1C, 0x34, 0xFA, 0x66, 0x12, 0x07, 0xDE, 0x36, 0xF9, + 0xD6, 0xC6, 0x4E, 0xDE, 0x04, 0xBD, 0x39, 0xCE, 0x28, 0xC2, 0x89, 0xC2, + 0xB5, 0xD8, 0x4F, 0xC0, 0x04, 0xFE, 0xCD, 0xDB, 0x6D, 0x29, 0x21, 0x0F, + 0x65, 0x51, 0xBC, 0x3E, 0x52, 0x5F, 0xBD, 0x55, 0x5E, 0x4D, 0x0F, 0x4D, + 0x2B, 0x2D, 0xC5, 0x2D, 0x2C, 0x0A, 0x85, 0x07, 0xFA, 0xEB, 0x62, 0xE1, + 0x8D, 0xD8, 0x7B, 0xC7, 0xE4, 0xDB, 0x92, 0xCC, 0x58, 0xF2, 0x92, 0xE9, + 0xC1, 0x09, 0x5A, 0x08, 0x46, 0x1A, 0x1C, 0x22, 0x06, 0x1E, 0xA1, 0x2E, + 0x12, 0x0C, 0xA6, 0x1E, 0x70, 0xEE, 0xD4, 0x00, 0xAB, 0xD2, 0x89, 0xE2, + 0xA2, 0xB7, 0x9A, 0xBE, 0x4C, 0xB1, 0xC2, 0xAD, 0x12, 0xD8, 0x54, 0xCC, + 0x60, 0x0F, 0xF5, 0xFA, 0x08, 0x2B, 0x31, 0x0E, 0x55, 0x30, 0x63, 0x13, + 0xCC, 0x2E, 0xFC, 0x16, 0x04, 0x19, 0x02, 0x0A, 0xE1, 0xF3, 0x88, 0xF3, + 0xCA, 0xD9, 0xF4, 0xE5, 0x2E, 0xD5, 0x59, 0xE6, 0x00, 0xE7, 0x48, 0xF7, + 0x10, 0x07, 0x78, 0x12, 0x7F, 0x21, 0x69, 0x24, 0x43, 0x2E, 0xF0, 0x26, + 0xD9, 0x31, 0x32, 0x1E, 0x61, 0x2A, 0x7C, 0x12, 0x7D, 0x17, 0xD6, 0x09, + 0x16, 0xFD, 0xF3, 0xFB, 0x62, 0xDC, 0xF0, 0xE5, 0x4B, 0xC0, 0x5C, 0xD7, + 0xE8, 0xB4, 0x88, 0xD8, 0xE8, 0xB9, 0x6F, 0xDD, 0x85, 0xCB, 0x59, 0xE7, + 0xFE, 0xEE, 0xE2, 0x06, 0xE9, 0x1D, 0x48, 0x32, 0x98, 0x42, 0xD1, 0x4E, + 0x48, 0x53, 0x1C, 0x51, 0x9E, 0x4B, 0x99, 0x3A, 0xF4, 0x2B, 0xD4, 0x14, + 0xF5, 0x02, 0x6D, 0xEB, 0x48, 0xDE, 0xA0, 0xC5, 0xFB, 0xC7, 0x21, 0xB2, + 0x0B, 0xCF, 0x65, 0xC2, 0xE4, 0xEC, 0x81, 0xE7, 0x50, 0x08, 0xBA, 0x06, + 0x69, 0x1F, 0xD0, 0x1E, 0xAA, 0x2C, 0xE2, 0x25, 0x84, 0x16, 0xA3, 0x0D, + 0x3C, 0xF0, 0xC6, 0xEB, 0xE3, 0xCC, 0x62, 0xCA, 0xB6, 0xAA, 0x22, 0xAB, + 0x5A, 0xB4, 0x96, 0xB7, 0xC8, 0xEB, 0xCA, 0xEF, 0x3E, 0x17, 0x0E, 0x1A, + 0xFD, 0x29, 0x78, 0x27, 0x3B, 0x32, 0xD9, 0x26, 0xFB, 0x28, 0xCA, 0x16, + 0x47, 0x12, 0xB6, 0x00, 0xEC, 0xF6, 0x7D, 0xEE, 0x4F, 0xE0, 0x0C, 0xEC, + 0x0B, 0xE3, 0x4C, 0x02, 0x65, 0xF7, 0x7C, 0x1A, 0x9F, 0x0B, 0x60, 0x23, + 0x1F, 0x20, 0xF3, 0x21, 0x2D, 0x29, 0xA0, 0x19, 0x05, 0x21, 0x23, 0x0E, + 0xEB, 0x13, 0x73, 0x09, 0xF3, 0x04, 0x2D, 0x06, 0xA5, 0xEE, 0x5A, 0xF4, + 0xEF, 0xD4, 0xA3, 0xDC, 0xA2, 0xC1, 0x6A, 0xCC, 0xDE, 0xB5, 0x46, 0xC2, + 0x8D, 0xBE, 0xFC, 0xC8, 0x4C, 0xE2, 0x21, 0xEB, 0xEF, 0x0F, 0x2F, 0x1B, + 0x9D, 0x40, 0xDC, 0x4C, 0x7B, 0x5E, 0x0D, 0x69, 0x16, 0x55, 0xBD, 0x5F, + 0x26, 0x31, 0x21, 0x40, 0x91, 0xFE, 0x07, 0x0E, 0xB6, 0xCD, 0x62, 0xD0, + 0x46, 0xBA, 0x2C, 0xAB, 0xED, 0xCC, 0x97, 0xB3, 0x47, 0xF2, 0x06, 0xD7, + 0x44, 0x1B, 0xEF, 0x02, 0xC3, 0x3B, 0x9C, 0x27, 0x57, 0x3D, 0x77, 0x2F, + 0x58, 0x1F, 0x9E, 0x17, 0x2A, 0xF7, 0x62, 0xF2, 0x59, 0xC5, 0x86, 0xC3, + 0x7A, 0x9E, 0x13, 0xA1, 0x74, 0xAE, 0x9D, 0xB3, 0x08, 0xE6, 0x4F, 0xE1, + 0x4D, 0x1F, 0x26, 0x03, 0x96, 0x4D, 0x92, 0x1B, 0xFC, 0x57, 0xD9, 0x20, + 0x27, 0x3A, 0xA3, 0x10, 0xCE, 0x10, 0x7D, 0xF9, 0x47, 0xE7, 0x3B, 0xDC, + 0x58, 0xCF, 0x08, 0xCE, 0xDF, 0xD7, 0x18, 0xE3, 0x1B, 0xED, 0xCA, 0x05, + 0x06, 0x06, 0x55, 0x23, 0x52, 0x20, 0x03, 0x37, 0xB0, 0x2A, 0x7F, 0x36, + 0x33, 0x24, 0xE5, 0x29, 0xF8, 0x11, 0x98, 0x19, 0xD9, 0xF3, 0x03, 0xFF, + 0xCC, 0xD3, 0xDE, 0xE1, 0x9C, 0xBE, 0xA9, 0xD0, 0x7C, 0xB2, 0x9D, 0xCB, + 0x14, 0xB1, 0x02, 0xCF, 0x50, 0xCA, 0xD6, 0xE1, 0xEF, 0xF9, 0x21, 0x03, + 0x41, 0x2B, 0x85, 0x2A, 0xF6, 0x52, 0xD0, 0x51, 0x8D, 0x61, 0x27, 0x63, + 0x20, 0x51, 0x2D, 0x52, 0x05, 0x30, 0xAC, 0x2E, 0x51, 0x00, 0xDF, 0x00, + 0xA3, 0xCE, 0x5E, 0xD3, 0x33, 0xB7, 0x14, 0xBD, 0x06, 0xC5, 0x08, 0xC8, + 0x94, 0xE8, 0x68, 0xE8, 0xBB, 0x09, 0xE6, 0x07, 0x41, 0x22, 0xBB, 0x1D, + 0x21, 0x2A, 0xA1, 0x22, 0x14, 0x13, 0x77, 0x0A, 0x3D, 0xEE, 0x67, 0xE7, + 0x76, 0xCD, 0xB4, 0xC6, 0xE7, 0xB6, 0x51, 0xAC, 0x0A, 0xC2, 0x8E, 0xB8, + 0xC7, 0xEB, 0xE9, 0xEB, 0xE7, 0x11, 0x2C, 0x1C, 0x39, 0x2B, 0xC1, 0x31, + 0xC2, 0x3C, 0x74, 0x30, 0xC5, 0x3E, 0x2A, 0x24, 0x5A, 0x27, 0xF1, 0x0E, + 0x43, 0x00, 0x93, 0xF5, 0xC5, 0xE8, 0x92, 0xE7, 0x84, 0xED, 0x3F, 0xEF, + 0x95, 0x01, 0x50, 0x09, 0x84, 0x12, 0x0B, 0x23, 0x58, 0x1D, 0x05, 0x30, + 0x5F, 0x26, 0x06, 0x2D, 0x6D, 0x22, 0x8E, 0x1D, 0x5B, 0x13, 0x36, 0x0E, + 0xE6, 0xFF, 0xE9, 0x00, 0x07, 0xE5, 0xAD, 0xE9, 0xAD, 0xCB, 0xCC, 0xCE, + 0x41, 0xBA, 0x39, 0xC0, 0x19, 0xB7, 0x49, 0xBF, 0x69, 0xCE, 0x9C, 0xCF, + 0x92, 0xFC, 0x51, 0xF1, 0x26, 0x31, 0xF4, 0x1D, 0x4E, 0x57, 0x87, 0x48, + 0x0A, 0x62, 0x1C, 0x5D, 0xF3, 0x52, 0xF4, 0x56, 0x7B, 0x2E, 0x1F, 0x39, + 0x2F, 0xFC, 0x23, 0x0B, 0x99, 0xCB, 0x8D, 0xDB, 0x83, 0xB7, 0xF5, 0xC3, + 0x2C, 0xCA, 0xE4, 0xD5, 0x3F, 0xE5, 0x29, 0xF4, 0x2F, 0xFD, 0xCF, 0x11, + 0x85, 0x1D, 0x3D, 0x33, 0x83, 0x27, 0xDE, 0x35, 0x7F, 0x10, 0xB2, 0x18, + 0x5A, 0xF0, 0x48, 0xF6, 0xC3, 0xBF, 0x07, 0xC8, 0xE8, 0x9C, 0x7B, 0xA8, + 0x3D, 0xB7, 0xD7, 0xC1, 0xD4, 0xF2, 0xC7, 0xF7, 0x5E, 0x25, 0xED, 0x1F, + 0xC7, 0x43, 0xFF, 0x30, 0x5D, 0x4B, 0x15, 0x2D, 0x87, 0x40, 0x84, 0x1B, + 0x55, 0x1D, 0x50, 0xF9, 0x62, 0xE8, 0x05, 0xD3, 0x11, 0xCD, 0xF0, 0xCD, + 0xA9, 0xD9, 0x72, 0xEC, 0xA1, 0xF2, 0xA5, 0x0D, 0xF0, 0x0A, 0x09, 0x23, + 0x43, 0x24, 0xF7, 0x30, 0x51, 0x32, 0x0B, 0x2D, 0x53, 0x29, 0x7A, 0x14, + 0x13, 0x0D, 0x19, 0xFA, 0x5A, 0xE5, 0xF1, 0xE4, 0x0A, 0xBC, 0xF6, 0xCF, + 0xDF, 0xA2, 0xD2, 0xC1, 0xE7, 0x9F, 0x5D, 0xC0, 0x34, 0xB1, 0x0C, 0xCA, + 0x76, 0xD9, 0x74, 0xE4, 0x6A, 0x13, 0x47, 0x0E, 0xC2, 0x49, 0x41, 0x38, + 0x61, 0x63, 0x1F, 0x50, 0x12, 0x5D, 0x54, 0x4B, 0xD6, 0x42, 0xE4, 0x31, + 0xAF, 0x1C, 0x96, 0x0A, 0xE1, 0xEE, 0xD3, 0xD9, 0x0F, 0xCB, 0x5C, 0xB9, + 0xCC, 0xC9, 0xE8, 0xBF, 0x1F, 0xE8, 0x9C, 0xE4, 0x16, 0x09, 0xEC, 0x0C, + 0x42, 0x22, 0x63, 0x30, 0x72, 0x33, 0xE6, 0x4C, 0xA0, 0x26, 0x02, 0x46, + 0x77, 0x03, 0xD9, 0x1B, 0x3E, 0xE0, 0x38, 0xEA, 0x27, 0xBB, 0xF3, 0xB7, + 0x3B, 0xB3, 0x11, 0xA6, 0x95, 0xDD, 0x79, 0xCD, 0xF2, 0x0F, 0x6B, 0x02, + 0x63, 0x32, 0x15, 0x27, 0x76, 0x42, 0x68, 0x39, 0x02, 0x39, 0xD8, 0x30, + 0xBC, 0x1F, 0xA0, 0x16, 0xD9, 0xFA, 0xD0, 0xF2, 0x65, 0xDA, 0x1F, 0xD6, + 0x2E, 0xDA, 0x9F, 0xDA, 0xEC, 0xF4, 0x9A, 0xF7, 0x48, 0x13, 0x7A, 0x14, + 0xBA, 0x25, 0x4D, 0x28, 0x5C, 0x28, 0x6B, 0x2F, 0xA4, 0x1F, 0x84, 0x21, + 0xA7, 0x0F, 0x1E, 0x07, 0xDC, 0xFD, 0x2D, 0xF4, 0x0A, 0xE6, 0xFC, 0xE5, + 0x0F, 0xC9, 0xAC, 0xD7, 0xC0, 0xB8, 0x00, 0xD1, 0x25, 0xB6, 0x29, 0xD5, + 0x83, 0xBA, 0x2B, 0xE1, 0x0C, 0xD6, 0xA8, 0xF7, 0x51, 0x0B, 0x63, 0x1C, + 0x00, 0x40, 0x54, 0x43, 0x66, 0x5B, 0x92, 0x5A, 0x0C, 0x54, 0xC9, 0x59, + 0x62, 0x35, 0x34, 0x3E, 0xDF, 0x08, 0xCA, 0x0A, 0xD8, 0xDA, 0xEB, 0xD3, + 0x41, 0xC2, 0x9A, 0xB4, 0x6A, 0xC7, 0x7D, 0xB5, 0x96, 0xE1, 0x53, 0xCB, + 0xD9, 0x07, 0x87, 0xEE, 0xFC, 0x2D, 0x9B, 0x14, 0xC8, 0x38, 0x8B, 0x21, + 0x6E, 0x25, 0x12, 0x10, 0x26, 0x03, 0xD2, 0xF4, 0x52, 0xCF, 0xB9, 0xD1, + 0x47, 0xAB, 0xA3, 0xB5, 0x17, 0xBF, 0xDC, 0xC1, 0x93, 0xEF, 0x50, 0xE7, + 0x31, 0x16, 0xFE, 0x07, 0xA8, 0x2C, 0xF0, 0x21, 0x6D, 0x38, 0x1D, 0x2E, + 0x81, 0x2D, 0x9F, 0x22, 0xF5, 0x0A, 0x4F, 0x0A, 0xE0, 0xEC, 0xA0, 0xF8, + 0xE3, 0xDF, 0xEF, 0xF9, 0x7A, 0xE4, 0x06, 0x0F, 0x6E, 0xF3, 0x86, 0x2A, + 0xAF, 0x02, 0xAC, 0x3E, 0x65, 0x12, 0x93, 0x46, 0xA7, 0x1B, 0xFC, 0x3F, + 0x96, 0x14, 0x54, 0x2B, 0xA8, 0x05, 0xAC, 0x12, 0xFE, 0xF3, 0x6D, 0xF7, + 0x27, 0xDB, 0xB1, 0xD2, 0xF6, 0xCB, 0x39, 0xB5, 0x99, 0xC9, 0xDD, 0xAB, + 0x33, 0xC4, 0x99, 0xAE, 0xEC, 0xD5, 0xC9, 0xC9, 0x1B, 0x0B, 0x52, 0x00, + 0xEE, 0x40, 0x44, 0x36, 0xE7, 0x5D, 0x5B, 0x54, 0x65, 0x5C, 0x54, 0x54, + 0x5C, 0x41, 0xAF, 0x34, 0x60, 0x13, 0xDE, 0xFD, 0xA6, 0xDE, 0xFB, 0xC9, + 0x73, 0xB8, 0x67, 0xAA, 0x7A, 0xB7, 0xEC, 0xAE, 0xA4, 0xD8, 0xC1, 0xD3, + 0xCF, 0x00, 0xB5, 0xF6, 0x56, 0x26, 0x97, 0x13, 0x64, 0x39, 0x07, 0x26, + 0x74, 0x24, 0x87, 0x17, 0x1B, 0xFC, 0xA3, 0xF8, 0xD8, 0xCF, 0x12, 0xD2, + 0x7E, 0xAA, 0xEF, 0xAE, 0xF0, 0xB3, 0x0F, 0xBF, 0x13, 0xE4, 0x86, 0xF3, + 0x2D, 0x0C, 0xD7, 0x18, 0x73, 0x26, 0xD1, 0x32, 0xDB, 0x36, 0xD8, 0x45, + 0x70, 0x2B, 0xF3, 0x3C, 0xDD, 0x08, 0x61, 0x18, 0x99, 0xEB, 0x0E, 0xEE, + 0x2A, 0xE2, 0x0A, 0xD7, 0x48, 0xED, 0xE8, 0xDE, 0xBF, 0x03, 0x85, 0xFC, + 0xB2, 0x14, 0x56, 0x1A, 0x9E, 0x1A, 0xC7, 0x28, 0xD4, 0x1A, 0x53, 0x2A, + 0x70, 0x17, 0xF1, 0x24, 0xA3, 0x0F, 0x6A, 0x16, 0xDC, 0x00, 0xFF, 0xFF, + 0x64, 0xE5, 0x4E, 0xE8, 0x4A, 0xC8, 0x9C, 0xD3, 0xF3, 0xBD, 0x24, 0xC8, + 0x03, 0xC4, 0x6F, 0xC6, 0x3A, 0xDA, 0x69, 0xD4, 0x46, 0x04, 0x62, 0xFF, + 0x3E, 0x35, 0xA2, 0x34, 0x0E, 0x59, 0xB3, 0x53, 0xEC, 0x5E, 0xA0, 0x56, + 0x15, 0x47, 0x17, 0x3F, 0xC6, 0x1A, 0x2D, 0x17, 0xEB, 0xE4, 0xB0, 0xEE, + 0x1B, 0xBC, 0x47, 0xD1, 0xBC, 0xB0, 0xF8, 0xCC, 0xA0, 0xC4, 0x44, 0xE2, + 0x58, 0xEC, 0x24, 0x00, 0x21, 0x1A, 0x51, 0x1B, 0x8A, 0x3A, 0xE2, 0x27, + 0x05, 0x32, 0x74, 0x18, 0xC1, 0x0A, 0x58, 0xFC, 0xD8, 0xD7, 0x23, 0xD6, + 0x5B, 0xAA, 0xA6, 0xA8, 0xE0, 0xAB, 0x51, 0xA5, 0xB3, 0xD7, 0x7B, 0xCE, + 0x09, 0x02, 0x93, 0xF6, 0x7E, 0x20, 0xF7, 0x18, 0xE2, 0x31, 0x95, 0x33, + 0x9A, 0x2B, 0xCC, 0x31, 0xFF, 0x11, 0xED, 0x0F, 0x87, 0xF8, 0x8F, 0xE3, + 0xE3, 0xEB, 0x9F, 0xCF, 0x8D, 0xEC, 0xD0, 0xDB, 0x12, 0xF7, 0xB8, 0xF4, + 0x4B, 0x06, 0xD7, 0x10, 0xAA, 0x16, 0xFC, 0x25, 0xA0, 0x21, 0x3B, 0x29, + 0x3A, 0x24, 0xFC, 0x21, 0x9D, 0x1D, 0x6D, 0x13, 0xAD, 0x05, 0xA3, 0xFB, + 0x47, 0xE5, 0x86, 0xE1, 0x1A, 0xCE, 0xE0, 0xCD, 0x87, 0xBC, 0x6D, 0xC5, + 0x96, 0xB2, 0xC5, 0xC7, 0xA6, 0xC3, 0x67, 0xE0, 0xED, 0xED, 0xF9, 0x0E, + 0x8A, 0x21, 0xAC, 0x3D, 0x2B, 0x4C, 0xE7, 0x5B, 0xDE, 0x5B, 0x7C, 0x5E, + 0xD1, 0x4A, 0x58, 0x40, 0xF8, 0x20, 0x0D, 0x0E, 0x99, 0xEB, 0x52, 0xD9, + 0x18, 0xC1, 0x8E, 0xB3, 0x61, 0xBB, 0x18, 0xB1, 0x9B, 0xD0, 0x74, 0xC7, + 0x53, 0xEE, 0x18, 0xE4, 0x01, 0x0F, 0xE9, 0x0C, 0x64, 0x22, 0xC4, 0x2B, + 0x6C, 0x1F, 0xD0, 0x22, 0xB9, 0x08, 0xDE, 0x01, 0xCD, 0xDE, 0x61, 0xD1, + 0x49, 0xBD, 0xB5, 0xAA, 0xAF, 0xC8, 0x15, 0xB9, 0xCE, 0xEC, 0x87, 0xE2, + 0x2B, 0x04, 0x2D, 0x05, 0x69, 0x18, 0x60, 0x26, 0x57, 0x2E, 0x60, 0x3D, + 0x04, 0x2A, 0xEE, 0x32, 0xCD, 0x14, 0xF9, 0x13, 0x3E, 0xFF, 0x0C, 0xF7, + 0x48, 0xEC, 0xA0, 0xE7, 0x50, 0xE9, 0x12, 0xF3, 0x2D, 0xF4, 0xFD, 0x0A, + 0xB6, 0x01, 0x62, 0x1C, 0xB9, 0x10, 0xEB, 0x2A, 0xC4, 0x20, 0x2A, 0x32, + 0xEA, 0x25, 0x59, 0x28, 0xDA, 0x23, 0xD6, 0x17, 0xBB, 0x13, 0xB8, 0x02, + 0x92, 0xEA, 0xBE, 0xE3, 0xCC, 0xCD, 0x25, 0xD0, 0x4C, 0xC0, 0x9C, 0xCD, + 0x96, 0xB2, 0x7A, 0xCF, 0x73, 0xCB, 0x31, 0xEB, 0x99, 0x06, 0x0F, 0x1E, + 0x3B, 0x37, 0xD5, 0x43, 0x87, 0x50, 0x13, 0x57, 0x72, 0x4F, 0x8A, 0x52, + 0x1A, 0x37, 0xF1, 0x2E, 0x05, 0x0E, 0x7F, 0xF7, 0xC5, 0xDA, 0x21, 0xC0, + 0x13, 0xB4, 0x7F, 0xA3, 0x7F, 0xB2, 0x53, 0xAC, 0x2B, 0xCD, 0x39, 0xC7, + 0xCD, 0xF3, 0xF7, 0xE1, 0x0D, 0x23, 0x4C, 0x01, 0x73, 0x38, 0x9E, 0x12, + 0xD5, 0x24, 0xED, 0x02, 0xE6, 0x05, 0xBB, 0xE6, 0x08, 0xDC, 0xA5, 0xBF, + 0x8A, 0xB1, 0xB0, 0x9F, 0xE2, 0xB8, 0x7A, 0xB7, 0x77, 0xE2, 0xCC, 0xEE, + 0xCB, 0xF9, 0x2E, 0x15, 0xD0, 0x0F, 0xFB, 0x30, 0xD6, 0x2C, 0x3A, 0x45, + 0x41, 0x31, 0x13, 0x3F, 0x06, 0x1B, 0x35, 0x1D, 0x31, 0x04, 0x8A, 0xFD, + 0xB5, 0xF6, 0xD1, 0xED, 0xBA, 0xF0, 0x4F, 0xEE, 0xD4, 0xF2, 0x89, 0x01, + 0xF6, 0xF3, 0xEE, 0x14, 0x78, 0x00, 0x34, 0x24, 0x5D, 0x14, 0xC2, 0x29, + 0xA2, 0x1A, 0x01, 0x20, 0xF8, 0x1E, 0x9A, 0x0C, 0x8C, 0x18, 0x36, 0xF0, + 0x62, 0xFA, 0xBB, 0xD0, 0xED, 0xDE, 0xE3, 0xB8, 0x8E, 0xD0, 0x75, 0xB3, + 0xF4, 0xD0, 0x90, 0xBC, 0xD7, 0xE6, 0x68, 0xD2, 0xAC, 0x12, 0x27, 0xFF, + 0x10, 0x4B, 0x96, 0x35, 0xF3, 0x62, 0x52, 0x55, 0xC0, 0x55, 0x97, 0x57, + 0x90, 0x3E, 0x48, 0x47, 0x46, 0x11, 0xF7, 0x20, 0x36, 0xD4, 0x2A, 0xEC, + 0x86, 0xAA, 0x57, 0xCC, 0xDB, 0xA8, 0x7A, 0xCE, 0x34, 0xC7, 0x59, 0xE5, + 0x5D, 0xF2, 0x0E, 0x0A, 0xCA, 0x1F, 0x0D, 0x34, 0x78, 0x31, 0xC2, 0x42, + 0x68, 0x22, 0xFF, 0x2E, 0x0F, 0xFF, 0x65, 0x09, 0x7D, 0xD0, 0x02, 0xDA, + 0xD1, 0xBC, 0x1F, 0xC4, 0x18, 0xCD, 0x1B, 0xD9, 0x84, 0xE7, 0x6D, 0xF9, + 0x14, 0x05, 0x93, 0x1B, 0xA8, 0x23, 0xE0, 0x3D, 0x95, 0x36, 0xF4, 0x4A, + 0x12, 0x33, 0x95, 0x37, 0x3B, 0x1E, 0x86, 0x0E, 0x36, 0x0B, 0x1E, 0xED, + 0x68, 0x02, 0x3B, 0xDE, 0x3D, 0xFF, 0xCC, 0xDF, 0x52, 0x03, 0x78, 0xF2, + 0x42, 0x16, 0xC7, 0x11, 0xCF, 0x25, 0x78, 0x2D, 0x5D, 0x2A, 0x5C, 0x3B, + 0x4F, 0x2B, 0x1C, 0x3A, 0x6D, 0x1D, 0x91, 0x21, 0xC0, 0x02, 0x5D, 0xFB, + 0x18, 0xE7, 0x5F, 0xDC, 0xAE, 0xCC, 0x63, 0xCA, 0xBF, 0xBA, 0x39, 0xCA, + 0x9F, 0xC2, 0x91, 0xE0, 0x87, 0xE2, 0x56, 0x08, 0x61, 0x16, 0xF8, 0x3B, + 0x3B, 0x4D, 0xD3, 0x5C, 0x3F, 0x5D, 0x2B, 0x58, 0x36, 0x47, 0x05, 0x40, + 0x8A, 0x1F, 0x28, 0x12, 0x0F, 0xEA, 0x5B, 0xD4, 0xBE, 0xBF, 0x21, 0xAC, + 0xCA, 0xB0, 0x5F, 0xA9, 0x1E, 0xB3, 0x00, 0xC0, 0xED, 0xCF, 0x63, 0xEA, + 0xEA, 0x00, 0xE1, 0x17, 0x8C, 0x1B, 0x76, 0x29, 0x39, 0x18, 0x32, 0x1D, + 0x58, 0xFC, 0xA6, 0xF6, 0xC7, 0xC4, 0xA0, 0xBC, 0xAA, 0xA7, 0xA7, 0x9D, + 0x3B, 0xB8, 0x25, 0xA2, 0xE7, 0xD1, 0xBE, 0xB7, 0x1B, 0xF5, 0x2E, 0xE5, + 0xAC, 0x1B, 0x1E, 0x18, 0x2E, 0x31, 0xBD, 0x30, 0xD9, 0x38, 0x8E, 0x2E, + 0xB6, 0x25, 0xAE, 0x12, 0x39, 0xFB, 0xBA, 0xE7, 0x3A, 0xE3, 0x76, 0xD3, + 0xB6, 0xE3, 0xE0, 0xDD, 0x11, 0xE6, 0x8F, 0xEF, 0x84, 0xE8, 0x1D, 0x04, + 0x04, 0xF9, 0x6B, 0x22, 0xA4, 0x07, 0xF6, 0x29, 0x6A, 0x13, 0xF9, 0x1C, + 0x97, 0x0F, 0xE4, 0x03, 0x31, 0xF5, 0x43, 0xDD, 0xF0, 0xD8, 0xE1, 0xBE, + 0x7D, 0xBB, 0xB9, 0xA8, 0x9B, 0xAD, 0xBD, 0xA3, 0x27, 0xB9, 0xAA, 0xBA, + 0x57, 0xD8, 0x03, 0xE4, 0xAC, 0x0A, 0xBF, 0x18, 0xCB, 0x3F, 0xB1, 0x4C, + 0xD8, 0x54, 0xBB, 0x5D, 0x0A, 0x51, 0x26, 0x4D, 0xEB, 0x42, 0x02, 0x2D, + 0x5F, 0x10, 0xD4, 0xF3, 0xC5, 0xDA, 0x78, 0xC2, 0x07, 0xCE, 0xD1, 0xBB, + 0xD4, 0xD3, 0x08, 0xCC, 0x1A, 0xF0, 0xDB, 0xEB, 0x40, 0x1F, 0x28, 0x1A, + 0xEF, 0x31, 0x0A, 0x32, 0x3E, 0x31, 0x5E, 0x29, 0x7C, 0x29, 0x00, 0x11, + 0xB8, 0x08, 0xAF, 0xED, 0xA1, 0xD7, 0x7B, 0xC8, 0x88, 0xC6, 0xB0, 0xCE, + 0x5F, 0xDD, 0x27, 0xF9, 0x9F, 0xF7, 0x9F, 0x1B, 0x7E, 0x10, 0xCD, 0x3E, + 0x92, 0x20, 0x2C, 0x53, 0x9D, 0x24, 0xD5, 0x46, 0xBF, 0x25, 0x52, 0x2D, + 0x3A, 0x12, 0x47, 0x07, 0xC7, 0xF7, 0xC5, 0xE9, 0x17, 0xF4, 0x3B, 0xEE, + 0x8F, 0xF8, 0xA9, 0x00, 0xF0, 0x01, 0xA9, 0x17, 0x93, 0x14, 0xD4, 0x35, + 0x60, 0x1F, 0x42, 0x4C, 0x4A, 0x1F, 0xC3, 0x4F, 0x28, 0x1C, 0xDB, 0x43, + 0x11, 0x11, 0xDF, 0x28, 0xDD, 0xFD, 0x32, 0x04, 0x9A, 0xE5, 0x12, 0xE0, + 0x16, 0xD4, 0xF7, 0xC5, 0xA6, 0xD0, 0xA1, 0xBD, 0xF1, 0xDC, 0xB5, 0xCF, + 0xC0, 0x04, 0x01, 0xFC, 0x60, 0x3E, 0xBA, 0x32, 0x1F, 0x62, 0x65, 0x57, + 0x1D, 0x64, 0x2B, 0x5E, 0x71, 0x53, 0x20, 0x50, 0xA7, 0x26, 0x3E, 0x22, + 0x48, 0xE9, 0x22, 0xE4, 0x22, 0xC4, 0xA4, 0xC2, 0x4F, 0xBE, 0xC5, 0xBC, + 0x9F, 0xD1, 0x84, 0xC7, 0x02, 0xF7, 0x03, 0xE6, 0xD8, 0x18, 0xE7, 0x07, + 0x70, 0x24, 0x89, 0x13, 0xAB, 0x1A, 0x27, 0x08, 0xBB, 0xFB, 0xE3, 0xEC, + 0x8E, 0xC8, 0xCC, 0xC0, 0xAC, 0xA3, 0xD2, 0xA0, 0xFD, 0xAA, 0x2C, 0xAC, + 0x5D, 0xC9, 0x53, 0xCB, 0xE3, 0xED, 0x51, 0xEA, 0x6F, 0x19, 0x66, 0x12, + 0x6C, 0x30, 0x53, 0x2F, 0x76, 0x25, 0x37, 0x30, 0x33, 0x09, 0x84, 0x1F, + 0x7B, 0xE9, 0x27, 0xFF, 0xCC, 0xD9, 0x33, 0xE0, 0xED, 0xE1, 0x82, 0xE0, + 0x58, 0xEB, 0x61, 0xF4, 0x0C, 0xF9, 0x55, 0x11, 0x93, 0x09, 0xE2, 0x2C, + 0xEA, 0x0C, 0xE5, 0x30, 0x70, 0x0E, 0x9C, 0x28, 0xC4, 0x0B, 0xAE, 0x1A, + 0xF9, 0x02, 0x8F, 0x00, 0xA1, 0xF7, 0xF0, 0xE2, 0xEE, 0xD9, 0xA8, 0xC7, + 0xD4, 0xB9, 0xD8, 0xB6, 0xC1, 0xB9, 0xFA, 0xBE, 0xB3, 0xD7, 0x5B, 0xE0, + 0x9D, 0x04, 0x3E, 0x10, 0x9D, 0x38, 0x0B, 0x44, 0xA3, 0x58, 0x65, 0x5D, + 0xF4, 0x62, 0x7F, 0x59, 0x1B, 0x59, 0x51, 0x3C, 0x60, 0x25, 0x26, 0xFB, + 0xE1, 0xE7, 0xBA, 0xC2, 0x42, 0xC7, 0x5B, 0xB5, 0x0E, 0xC4, 0x86, 0xCD, + 0x83, 0xD7, 0x9E, 0xF9, 0xE7, 0xF8, 0x3B, 0x1F, 0xDD, 0x1C, 0x30, 0x39, + 0xD1, 0x2F, 0x0E, 0x3E, 0x2D, 0x21, 0xF2, 0x22, 0xA9, 0xF4, 0x0F, 0xF6, + 0x5C, 0xBD, 0xA9, 0xC0, 0x9C, 0xAC, 0x26, 0xAA, 0x2D, 0xCD, 0x19, 0xC7, + 0x65, 0xF5, 0x32, 0xF4, 0xDA, 0x19, 0xAB, 0x1E, 0x46, 0x37, 0x99, 0x39, + 0x14, 0x3E, 0x50, 0x3B, 0x2E, 0x2E, 0x50, 0x25, 0x2A, 0x12, 0x57, 0xFC, + 0x99, 0xF4, 0xE7, 0xD8, 0x91, 0xE7, 0x67, 0xD3, 0x1A, 0xE9, 0xFA, 0xDF, + 0xA9, 0xFC, 0x08, 0xFE, 0xEA, 0x19, 0xE7, 0x20, 0x19, 0x29, 0x00, 0x35, + 0x2E, 0x2E, 0x2E, 0x42, 0x3D, 0x29, 0x02, 0x35, 0x94, 0x10, 0x65, 0x05, + 0x41, 0xEE, 0x04, 0xD9, 0x42, 0xD2, 0xE1, 0xC1, 0x91, 0xBA, 0x6C, 0xB8, + 0x18, 0xB3, 0xDE, 0xC6, 0xD0, 0xCA, 0xBE, 0xEE, 0xFE, 0xF5, 0xAF, 0x1C, + 0x77, 0x27, 0xF5, 0x44, 0x38, 0x55, 0xAA, 0x5D, 0x40, 0x65, 0xC0, 0x57, + 0x06, 0x4D, 0xC6, 0x38, 0x0C, 0x19, 0x16, 0x0A, 0x2F, 0xE7, 0xA0, 0xDB, + 0xE0, 0xC3, 0xFD, 0xBC, 0xCC, 0xB3, 0x8F, 0xB3, 0x67, 0xCA, 0x63, 0xCD, + 0xB3, 0xF1, 0xD6, 0xF3, 0x1F, 0x14, 0x66, 0x07, 0x90, 0x27, 0x8C, 0x08, + 0xC3, 0x19, 0x4A, 0xF7, 0x1F, 0xF4, 0x9F, 0xD6, 0x24, 0xC9, 0x54, 0xB5, + 0xE4, 0xA6, 0xC3, 0xA3, 0xEE, 0xA6, 0x41, 0xB2, 0x00, 0xC8, 0x3F, 0xDB, + 0xD8, 0xEB, 0xA1, 0x02, 0x32, 0x08, 0xE5, 0x1B, 0x05, 0x22, 0xC3, 0x2A, + 0xDB, 0x25, 0x79, 0x20, 0x9D, 0x10, 0x2A, 0xFD, 0xBE, 0xF6, 0xC9, 0xDA, + 0x7B, 0xE3, 0x5A, 0xCB, 0x86, 0xE8, 0x7E, 0xDC, 0x97, 0xF0, 0x09, 0xF8, + 0xFD, 0xF3, 0x3D, 0x12, 0x7D, 0xFE, 0xE3, 0x2F, 0x8A, 0x05, 0xE0, 0x3D, + 0x1F, 0x09, 0x95, 0x32, 0x06, 0x0A, 0xC0, 0x12, 0x85, 0x05, 0xC0, 0xEF, + 0x1D, 0xF6, 0x7F, 0xD7, 0x7A, 0xDF, 0xFC, 0xC5, 0x98, 0xDA, 0x2C, 0xC1, + 0x33, 0xEA, 0x77, 0xD2, 0x44, 0x06, 0xED, 0xFC, 0xDB, 0x2D, 0x2A, 0x34, + 0x52, 0x4F, 0xF1, 0x58, 0xF4, 0x61, 0xF4, 0x60, 0x4A, 0x60, 0xC2, 0x55, + 0x3B, 0x3B, 0x57, 0x32, 0x3E, 0x02, 0xCD, 0xFD, 0x90, 0xDE, 0xAB, 0xDA, + 0xD6, 0xD3, 0x33, 0xD6, 0x24, 0xD4, 0x08, 0xE4, 0x1E, 0xE6, 0x49, 0xFE, + 0x19, 0x09, 0xF6, 0x1D, 0xF0, 0x27, 0x20, 0x2C, 0x83, 0x2D, 0x58, 0x20, + 0x99, 0x1C, 0x70, 0x0B, 0xD4, 0xF2, 0x48, 0xE8, 0x45, 0xBF, 0x37, 0xBF, + 0x7D, 0xB5, 0x5D, 0xBF, 0xE7, 0xD3, 0x8B, 0xE0, 0x71, 0xFB, 0x42, 0x02, + 0x7C, 0x1F, 0xC5, 0x22, 0x38, 0x37, 0xCB, 0x40, 0xF9, 0x34, 0xF0, 0x44, + 0xC0, 0x1B, 0xF8, 0x2B, 0x4C, 0x00, 0x86, 0x08, 0x1F, 0xE9, 0xC1, 0xE6, + 0x01, 0xDF, 0x0F, 0xDC, 0xA1, 0xEB, 0xEA, 0xEA, 0x34, 0x02, 0xF1, 0x05, + 0x8B, 0x16, 0x42, 0x22, 0x22, 0x26, 0xE6, 0x31, 0x66, 0x1F, 0x6D, 0x27, + 0xDB, 0x0B, 0x5E, 0x13, 0x88, 0xFF, 0x1F, 0x05, 0xE7, 0xEF, 0x04, 0xEE, + 0x90, 0xE1, 0x65, 0xD4, 0x68, 0xD6, 0x64, 0xC2, 0xBC, 0xCD, 0x48, 0xBE, + 0x2F, 0xDA, 0xBC, 0xD6, 0x36, 0x00, 0x21, 0x04, 0xDC, 0x2D, 0x48, 0x31, + 0xB7, 0x4E, 0x86, 0x4B, 0x3A, 0x5F, 0xFC, 0x4D, 0xC6, 0x52, 0xAB, 0x34, + 0x3C, 0x22, 0x8D, 0x00, 0xB2, 0xE7, 0x7C, 0xCD, 0x70, 0xB8, 0xA6, 0xB1, + 0x6B, 0xAA, 0x1D, 0xB9, 0x20, 0xBF, 0xBE, 0xD5, 0x9C, 0xE3, 0x73, 0xF0, + 0x27, 0x08, 0x37, 0x06, 0xC9, 0x1E, 0xA4, 0x12, 0xDF, 0x1A, 0x30, 0x0D, + 0x86, 0xF9, 0x4A, 0xF1, 0x80, 0xD0, 0x9C, 0xC9, 0xEC, 0xAA, 0xCC, 0xA3, + 0x36, 0xAC, 0x1C, 0xA6, 0xE6, 0xDA, 0x6C, 0xD4, 0x57, 0x05, 0x7E, 0x00, + 0xB3, 0x24, 0xDB, 0x22, 0x7E, 0x3A, 0xAB, 0x3A, 0xE2, 0x35, 0x48, 0x39, + 0x0E, 0x17, 0xE3, 0x1F, 0xCE, 0xEE, 0x4D, 0xFC, 0xCA, 0xDF, 0x9C, 0xEF, + 0x8C, 0xE1, 0x16, 0xF6, 0x29, 0xE4, 0x75, 0xFE, 0x7B, 0xFB, 0xA7, 0x1B, + 0xFB, 0x0F, 0xC9, 0x34, 0x09, 0x14, 0xF3, 0x30, 0x91, 0x10, 0x74, 0x1F, + 0xA9, 0x04, 0x07, 0x0B, 0x5C, 0xEF, 0x2F, 0xF2, 0xAB, 0xE0, 0x67, 0xDB, + 0x40, 0xD7, 0xCA, 0xC1, 0x93, 0xCE, 0xF6, 0xA9, 0xB7, 0xD8, 0x1D, 0xB2, + 0x7E, 0xF3, 0x78, 0xDA, 0xF7, 0x1C, 0xEE, 0x10, 0x1D, 0x48, 0x54, 0x41, + 0xB4, 0x59, 0xED, 0x58, 0xD2, 0x4F, 0xD4, 0x52, 0x51, 0x2E, 0x04, 0x2C, + 0xF1, 0xFB, 0x34, 0xEE, 0x76, 0xD3, 0x2C, 0xBC, 0x17, 0xC2, 0x51, 0xB1, + 0x30, 0xC7, 0x05, 0xCB, 0x0B, 0xDA, 0xD3, 0xEF, 0x94, 0x01, 0x09, 0x18, + 0xE1, 0x2C, 0x78, 0x37, 0x76, 0x35, 0x21, 0x33, 0xCB, 0x22, 0x66, 0x16, + 0x66, 0x01, 0xFB, 0xF2, 0xCF, 0xD5, 0x35, 0xCA, 0xB6, 0xBF, 0x76, 0xBD, + 0xA1, 0xD5, 0x95, 0xE6, 0xAC, 0xF3, 0xAF, 0x17, 0xAE, 0x0E, 0x5D, 0x38, + 0x8A, 0x31, 0x06, 0x52, 0xB7, 0x3F, 0x3F, 0x4F, 0x56, 0x2C, 0x15, 0x29, + 0x30, 0x0A, 0x11, 0xF2, 0x91, 0xF6, 0x5C, 0xCB, 0x58, 0xFE, 0x1B, 0xCA, + 0x55, 0x07, 0xEC, 0xDF, 0xA5, 0x0A, 0x69, 0x02, 0x28, 0x13, 0x5D, 0x28, + 0x2B, 0x12, 0x9C, 0x39, 0x69, 0x0A, 0xCD, 0x33, 0xC2, 0x06, 0x64, 0x23, + 0x0A, 0xFD, 0x54, 0x03, 0x16, 0xED, 0xDB, 0xDF, 0xF5, 0xE0, 0x32, 0xCE, + 0x3C, 0xD1, 0xB1, 0xC6, 0x73, 0xC6, 0x8E, 0xCB, 0x79, 0xD0, 0x1C, 0xE2, + 0x1F, 0xF9, 0x7F, 0x11, 0x7D, 0x27, 0x6F, 0x42, 0x3C, 0x43, 0xD7, 0x57, + 0xA7, 0x54, 0x86, 0x5A, 0x03, 0x4B, 0xFD, 0x41, 0x4C, 0x1F, 0xAC, 0x0D, + 0xDE, 0xE5, 0x86, 0xD4, 0xB3, 0xBF, 0x0A, 0xB6, 0x3A, 0xBA, 0x35, 0xBC, + 0xD7, 0xCA, 0x6E, 0xD3, 0x76, 0xED, 0x1F, 0xF6, 0x8F, 0x16, 0xB1, 0x19, + 0x73, 0x2D, 0x83, 0x25, 0xC6, 0x27, 0xBD, 0x16, 0x0B, 0x0C, 0x36, 0xF5, + 0xDF, 0xDB, 0x47, 0xC3, 0xC0, 0xB1, 0xC3, 0x9D, 0xFF, 0xB5, 0x5A, 0xA8, + 0x08, 0xDB, 0x97, 0xCE, 0xD4, 0x02, 0x35, 0xF5, 0xD7, 0x21, 0x8E, 0x18, + 0x26, 0x35, 0xE1, 0x30, 0xC8, 0x34, 0x60, 0x30, 0x92, 0x1A, 0xFC, 0x10, + 0x4C, 0xF8, 0x58, 0xE8, 0x2D, 0xDC, 0xBB, 0xD2, 0xA0, 0xD9, 0x52, 0xE5, + 0xDC, 0xEE, 0xFA, 0x0D, 0x88, 0xFC, 0xB8, 0x25, 0xE7, 0x06, 0xBB, 0x30, + 0xBE, 0x12, 0xEE, 0x34, 0x8C, 0x10, 0xFD, 0x26, 0x33, 0x09, 0x24, 0x14, + 0x63, 0xFF, 0xAE, 0xFF, 0x08, 0xEE, 0x01, 0xE9, 0x0E, 0xD6, 0xA8, 0xD8, + 0x40, 0xC7, 0x73, 0xD0, 0x9D, 0xCF, 0x4D, 0xD8, 0xBF, 0xEB, 0xDA, 0xF0, + 0x8D, 0x13, 0x5A, 0x12, 0xAB, 0x3A, 0x3C, 0x37, 0xB6, 0x54, 0xA7, 0x50, + 0x89, 0x5A, 0xB1, 0x50, 0x83, 0x4D, 0x15, 0x3B, 0xC5, 0x20, 0x1A, 0x10, + 0x1B, 0xE5, 0x40, 0xDD, 0x5F, 0xBF, 0xC8, 0xBC, 0x49, 0xC2, 0x5B, 0xC0, + 0x8A, 0xE6, 0x21, 0xDB, 0xC9, 0x0C, 0xCF, 0xF4, 0x41, 0x2C, 0xB0, 0x10, + 0xD1, 0x44, 0x67, 0x29, 0x48, 0x3C, 0xD4, 0x24, 0xEA, 0x18, 0x53, 0x0D, + 0x51, 0xEE, 0x82, 0xF0, 0x5C, 0xC0, 0xC5, 0xC8, 0x93, 0xB7, 0x17, 0xBB, + 0xE6, 0xE4, 0x02, 0xDA, 0xF7, 0x16, 0x30, 0xFE, 0x19, 0x2C, 0x36, 0x19, + 0xE9, 0x31, 0x16, 0x2D, 0x31, 0x2B, 0x8E, 0x2A, 0x2A, 0x14, 0x0A, 0x11, + 0xDA, 0xF0, 0x32, 0xE9, 0x7D, 0xD8, 0xE3, 0xD1, 0xAE, 0xDD, 0x88, 0xDF, + 0xC0, 0xEF, 0x74, 0xF9, 0x57, 0x03, 0xF1, 0x13, 0x01, 0x0D, 0x64, 0x2C, + 0xBA, 0x08, 0x92, 0x38, 0x30, 0x00, 0x58, 0x32, 0x75, 0xF0, 0x09, 0x1A, + 0x37, 0xE7, 0x62, 0x01, 0x3E, 0xE4, 0x1E, 0xEB, 0x11, 0xD3, 0xE0, 0xD0, + 0x58, 0xC5, 0xED, 0xC1, 0x90, 0xC9, 0xA5, 0xC7, 0xBB, 0xD7, 0xE0, 0xD9, + 0x17, 0xF3, 0x41, 0xF6, 0xD2, 0x23, 0xFE, 0x22, 0x16, 0x4D, 0x55, 0x48, + 0xC5, 0x59, 0xED, 0x4F, 0x63, 0x51, 0xB3, 0x3D, 0x5D, 0x2F, 0x32, 0x1A, + 0xDE, 0xF9, 0xBA, 0xF0, 0xD8, 0xC8, 0xC8, 0xCB, 0xF4, 0xBB, 0xD7, 0xC4, + 0x36, 0xD5, 0x50, 0xD9, 0xE5, 0xFA, 0x4C, 0xF1, 0xE5, 0x22, 0xC8, 0x10, + 0x67, 0x3C, 0xE8, 0x25, 0xDD, 0x34, 0x88, 0x1C, 0x75, 0x1C, 0x7F, 0x09, + 0x19, 0xF7, 0xAF, 0xF2, 0x5E, 0xC1, 0xC3, 0xCB, 0x84, 0xAB, 0x47, 0xC0, + 0xF7, 0xC9, 0x32, 0xE4, 0x58, 0xF9, 0x14, 0x0C, 0xC9, 0x20, 0x8A, 0x28, + 0x3B, 0x36, 0x1B, 0x35, 0xF7, 0x34, 0x1F, 0x2D, 0xD3, 0x1D, 0x33, 0x15, + 0xC6, 0xFC, 0x4C, 0xF6, 0xDB, 0xE1, 0x1E, 0xDF, 0xEE, 0xD9, 0xB6, 0xE2, + 0x5F, 0xE4, 0xB3, 0xFF, 0xA5, 0xF4, 0xFD, 0x19, 0x2B, 0x06, 0x5F, 0x24, + 0xBB, 0x15, 0x6A, 0x22, 0x76, 0x20, 0x8C, 0x19, 0xDF, 0x1E, 0xC9, 0x0B, + 0x24, 0x0D, 0x12, 0xF5, 0x51, 0xFE, 0xBD, 0xDC, 0xBF, 0xEF, 0x94, 0xC7, + 0x3B, 0xDF, 0x20, 0xBC, 0x26, 0xD7, 0x0E, 0xC6, 0xAB, 0xD1, 0xC3, 0xD7, + 0x0C, 0xDE, 0xBB, 0xF2, 0xF8, 0x09, 0xF9, 0x1C, 0x17, 0x42, 0xD7, 0x47, + 0xBF, 0x5F, 0x12, 0x5C, 0x14, 0x59, 0x47, 0x50, 0x56, 0x3B, 0x8D, 0x33, + 0xD0, 0x0C, 0x21, 0x0C, 0x20, 0xD9, 0x07, 0xE2, 0xC9, 0xB7, 0x0A, 0xCA, + 0xEF, 0xBD, 0x95, 0xD3, 0x51, 0xE2, 0x8B, 0xF1, 0xDF, 0x08, 0x55, 0x0C, + 0x0F, 0x22, 0x22, 0x20, 0x86, 0x29, 0xF7, 0x28, 0x7D, 0x1B, 0x7E, 0x20, + 0x5B, 0xFD, 0x53, 0x06, 0x15, 0xD4, 0x68, 0xDD, 0xB1, 0xB1, 0x60, 0xB9, + 0xEB, 0xB1, 0x50, 0xB8, 0x77, 0xD6, 0xF0, 0xD8, 0x7F, 0x00, 0xBE, 0xF9, + 0xFB, 0x1C, 0x93, 0x0E, 0x73, 0x26, 0xD3, 0x12, 0xB2, 0x22, 0x30, 0x0A, + 0xE7, 0x1E, 0xAC, 0xFC, 0xC1, 0x0D, 0xAA, 0xDD, 0x41, 0xFC, 0xF1, 0xC5, + 0x43, 0x04, 0x05, 0xDB, 0x53, 0x0F, 0xF8, 0x03, 0x46, 0x0E, 0x5B, 0x23, + 0x27, 0x0B, 0xBF, 0x34, 0x32, 0x0A, 0xA5, 0x37, 0x9D, 0x0F, 0x1D, 0x32, + 0x1C, 0x10, 0xB5, 0x21, 0xCA, 0x09, 0xB5, 0x0B, 0xC6, 0xFF, 0xB7, 0xF7, + 0xE7, 0xE9, 0x95, 0xE4, 0x41, 0xD3, 0x30, 0xD9, 0x6D, 0xC8, 0x38, 0xDD, + 0x03, 0xCC, 0xE5, 0xE8, 0x4F, 0xE3, 0xF9, 0xFE, 0x0C, 0x14, 0x90, 0x28, + 0x1B, 0x42, 0x6E, 0x4D, 0x4E, 0x4F, 0x1F, 0x53, 0x5C, 0x4A, 0x4E, 0x46, + 0x8F, 0x32, 0x0E, 0x2C, 0xEA, 0xFF, 0x0B, 0x00, 0xEC, 0xCC, 0x4E, 0xDB, + 0x2A, 0xB7, 0xE8, 0xD0, 0x08, 0xC3, 0xA1, 0xD9, 0xD3, 0xE7, 0xCE, 0xEB, + 0xEA, 0x0C, 0xAB, 0xF8, 0x68, 0x26, 0xB3, 0x00, 0x30, 0x33, 0xE5, 0x08, + 0xF2, 0x22, 0x8E, 0xFF, 0xD6, 0xFF, 0xEE, 0xEA, 0xEF, 0xD8, 0x86, 0xD6, + 0xD1, 0xB6, 0x89, 0xC4, 0xD9, 0xBA, 0x0D, 0xD2, 0xA4, 0xE4, 0x30, 0xFB, + 0x2A, 0x08, 0x5D, 0x17, 0xC4, 0x16, 0xA2, 0x1E, 0xAF, 0x1D, 0xD1, 0x20, + 0xE2, 0x1D, 0x81, 0x1E, 0xF5, 0x0C, 0x6C, 0x08, 0x71, 0xF1, 0x51, 0xE7, + 0xE5, 0xE4, 0x1F, 0xDB, 0x28, 0xEF, 0x22, 0xEF, 0x4F, 0xFF, 0x5A, 0x0E, + 0x0F, 0x09, 0xA0, 0x1F, 0x3E, 0x0F, 0x1E, 0x21, 0xF3, 0x19, 0x55, 0x1E, + 0xF8, 0x20, 0x84, 0x17, 0xBB, 0x1B, 0x1B, 0x09, 0xBB, 0x0D, 0xF4, 0xF3, + 0x99, 0xF7, 0x3E, 0xD9, 0xDC, 0xDF, 0x6A, 0xC2, 0xE9, 0xCF, 0x6A, 0xBB, + 0xFA, 0xCB, 0xDD, 0xC3, 0xD6, 0xDA, 0xB1, 0xD8, 0x2E, 0xFE, 0x4D, 0xF7, + 0x53, 0x2D, 0x39, 0x1B, 0xCD, 0x51, 0x8C, 0x37, 0xE6, 0x50, 0x32, 0x39, + 0x1A, 0x3D, 0x5E, 0x2E, 0x23, 0x21, 0x64, 0x18, 0xDF, 0xFA, 0xD9, 0xEF, + 0xFD, 0xD9, 0xAB, 0xC9, 0x12, 0xCC, 0xA5, 0xBD, 0xE0, 0xDA, 0x33, 0xD5, + 0xAE, 0xF5, 0x4C, 0xFC, 0x08, 0x08, 0x42, 0x1A, 0xE6, 0x14, 0xE8, 0x31, + 0xED, 0x0F, 0xDD, 0x36, 0xD6, 0xF7, 0x39, 0x21, 0x7C, 0xE0, 0xC4, 0x02, + 0x7C, 0xC3, 0x3F, 0xD6, 0x51, 0xAF, 0xBB, 0xB4, 0xA7, 0xC5, 0xE0, 0xCA, + 0x5A, 0xF0, 0x73, 0x00, 0x5B, 0x08, 0x50, 0x27, 0xE9, 0x0F, 0x76, 0x34, + 0x35, 0x15, 0xF2, 0x32, 0x63, 0x15, 0x7E, 0x22, 0x99, 0x08, 0x56, 0x01, + 0xD7, 0xF3, 0x06, 0xE3, 0x1A, 0xE8, 0x92, 0xDB, 0xA0, 0xE9, 0x14, 0xEF, + 0x92, 0xF5, 0xA2, 0x0B, 0xC8, 0x02, 0xDE, 0x1C, 0x16, 0x15, 0x5F, 0x25, + 0xBE, 0x25, 0x9B, 0x21, 0x98, 0x24, 0x06, 0x11, 0xAA, 0x1D, 0x00, 0x02, + 0x7B, 0x0E, 0x50, 0xF5, 0x76, 0xF5, 0x2A, 0xE1, 0xC2, 0xDB, 0x90, 0xCC, + 0xD9, 0xCE, 0x9F, 0xCA, 0xE4, 0xCD, 0xC6, 0xD7, 0x67, 0xD2, 0x74, 0xEB, + 0xB6, 0xEF, 0x74, 0x0A, 0x19, 0x1C, 0x3D, 0x2C, 0x9B, 0x44, 0xD1, 0x42, + 0xD2, 0x57, 0x6E, 0x45, 0xEB, 0x4A, 0x7B, 0x33, 0x54, 0x29, 0xA8, 0x15, + 0x21, 0xFC, 0x1E, 0xF1, 0x4D, 0xD4, 0xA4, 0xC9, 0xCB, 0xC4, 0x37, 0xB3, + 0xFC, 0xD5, 0xAA, 0xC0, 0xC2, 0xF5, 0xA6, 0xE5, 0x64, 0x0D, 0x24, 0x0C, + 0xCC, 0x1C, 0xA7, 0x28, 0x2D, 0x25, 0x6A, 0x36, 0xAE, 0x1A, 0xE3, 0x25, + 0x1D, 0x00, 0x54, 0x01, 0xA3, 0xDC, 0xAC, 0xDD, 0x80, 0xB9, 0x3F, 0xC4, + 0xD3, 0xBA, 0x3D, 0xD2, 0x2A, 0xEB, 0x82, 0x07, 0x9E, 0x19, 0x82, 0x33, + 0x45, 0x2C, 0x48, 0x3B, 0x69, 0x34, 0x5E, 0x31, 0xA9, 0x35, 0x2C, 0x22, + 0x0D, 0x22, 0xF2, 0x05, 0xFB, 0x00, 0x97, 0xE6, 0x98, 0xEC, 0x42, 0xD9, + 0xF3, 0xED, 0x42, 0xE7, 0x32, 0xFD, 0xC1, 0x00, 0xAB, 0x0F, 0x54, 0x15, + 0x51, 0x1C, 0xDE, 0x1E, 0xED, 0x18, 0x9C, 0x17, 0x01, 0x11, 0x9D, 0x08, + 0xA1, 0x0D, 0xFE, 0xF4, 0xA4, 0x01, 0x03, 0xDE, 0xCB, 0xED, 0x8B, 0xCE, + 0xD7, 0xD7, 0x00, 0xC8, 0x3F, 0xC4, 0x62, 0xC3, 0x3F, 0xB8, 0xB1, 0xC2, + 0x76, 0xBE, 0x44, 0xD2, 0x64, 0xDE, 0xB0, 0xF2, 0x3E, 0x0D, 0x0D, 0x1D, + 0x12, 0x36, 0x1A, 0x43, 0x3F, 0x44, 0xB0, 0x50, 0x97, 0x3A, 0xB6, 0x44, + 0xA4, 0x1D, 0xCC, 0x22, 0x8D, 0xF5, 0x0D, 0xF6, 0xEE, 0xD4, 0xBF, 0xCB, + 0xFF, 0xC6, 0xD5, 0xB2, 0xBB, 0xD3, 0x92, 0xBC, 0x77, 0xEF, 0x6E, 0xDC, + 0xF7, 0x0B, 0xBA, 0xFD, 0x77, 0x22, 0x5C, 0x1B, 0x84, 0x27, 0x0F, 0x30, + 0x31, 0x15, 0x20, 0x29, 0x36, 0xFD, 0x5D, 0x0A, 0x88, 0xE5, 0xCF, 0xE0, + 0x2F, 0xCA, 0x98, 0xB8, 0x4B, 0xC9, 0x8D, 0xB3, 0x68, 0xF0, 0xCB, 0xDC, + 0xDF, 0x16, 0x6D, 0x0E, 0xCE, 0x20, 0x12, 0x29, 0x96, 0x1F, 0x97, 0x33, + 0x9F, 0x1B, 0xAF, 0x31, 0xA6, 0x0A, 0xEC, 0x1B, 0x3E, 0xF3, 0x53, 0xFA, + 0x36, 0xE8, 0x13, 0xE7, 0xBD, 0xEB, 0x56, 0xF2, 0x2E, 0xEF, 0x12, 0x0C, + 0x7C, 0xF6, 0x72, 0x25, 0xF8, 0x03, 0xAA, 0x36, 0x49, 0x08, 0x06, 0x37, + 0x38, 0x0D, 0x93, 0x30, 0x8C, 0x16, 0x2A, 0x20, 0x1E, 0x1A, 0xD9, 0x06, + 0x0D, 0x0F, 0x12, 0xF1, 0x14, 0xED, 0x75, 0xDB, 0x70, 0xC7, 0x2D, 0xCA, + 0xD1, 0xB6, 0x3F, 0xC9, 0x9B, 0xBB, 0xDC, 0xD2, 0x43, 0xD9, 0x61, 0xE6, + 0xB7, 0x12, 0x82, 0x0E, 0xEF, 0x49, 0x58, 0x3A, 0x67, 0x60, 0x66, 0x50, + 0xCC, 0x59, 0xE6, 0x4C, 0xC7, 0x3C, 0x9B, 0x32, 0xB9, 0x0F, 0xD4, 0x07, + 0x56, 0xE7, 0xEA, 0xDB, 0x30, 0xCD, 0x40, 0xB9, 0x92, 0xCA, 0x29, 0xB3, + 0xA4, 0xE0, 0x2E, 0xD0, 0xBE, 0xFB, 0x5C, 0xF5, 0xA7, 0x11, 0xC0, 0x0E, + 0x13, 0x20, 0xE7, 0x1C, 0x07, 0x1F, 0xE0, 0x1A, 0x0C, 0x08, 0x33, 0x03, + 0x75, 0xEC, 0x2C, 0xEB, 0x08, 0xCD, 0xD3, 0xD0, 0xBB, 0xB0, 0x59, 0xB9, + 0xD2, 0xC3, 0xC2, 0xCE, 0x52, 0xF0, 0x79, 0x02, 0xB0, 0x08, 0xF8, 0x25, + 0x25, 0x15, 0x26, 0x31, 0xB3, 0x1E, 0xF5, 0x29, 0x25, 0x21, 0x4B, 0x14, + 0xB5, 0x10, 0xCE, 0xF5, 0x1C, 0xF6, 0x68, 0xDB, 0x16, 0xE6, 0x5C, 0xD4, + 0xCC, 0xE7, 0x43, 0xE6, 0xD5, 0xF8, 0x00, 0x04, 0x7E, 0x07, 0x0B, 0x18, + 0x44, 0x14, 0xA2, 0x20, 0x98, 0x20, 0x6E, 0x20, 0xC6, 0x25, 0xCA, 0x16, + 0x4D, 0x28, 0x5B, 0x07, 0x4D, 0x1C, 0x54, 0xF4, 0xF3, 0xFD, 0x7F, 0xDF, + 0xAB, 0xDA, 0x18, 0xD0, 0xBB, 0xC1, 0x98, 0xCA, 0xF3, 0xBE, 0x93, 0xCF, + 0x70, 0xCE, 0x2D, 0xE3, 0x69, 0xEF, 0x24, 0x01, 0xB4, 0x21, 0x31, 0x27, + 0x26, 0x52, 0x50, 0x49, 0xD4, 0x64, 0xC7, 0x53, 0x2E, 0x52, 0x75, 0x48, + 0xF3, 0x2C, 0xB4, 0x2F, 0x8C, 0x01, 0x47, 0x0F, 0x67, 0xDD, 0xC1, 0xF1, + 0xB9, 0xCB, 0x57, 0xDE, 0xF3, 0xCB, 0xA6, 0xDB, 0x21, 0xE1, 0x19, 0xEC, + 0xCD, 0xFA, 0x76, 0x01, 0xA2, 0x0C, 0xC1, 0x0E, 0x7B, 0x18, 0xF5, 0x13, + 0x0A, 0x17, 0x00, 0x0D, 0xCE, 0x08, 0xA4, 0xF7, 0x4A, 0xEF, 0x7E, 0xE1, + 0xF6, 0xC8, 0x64, 0xCF, 0x0A, 0xB0, 0x82, 0xCB, 0x7A, 0xC9, 0xD9, 0xE7, + 0x60, 0xFF, 0x76, 0x0E, 0x4C, 0x1F, 0xB9, 0x21, 0xDE, 0x2B, 0xCB, 0x26, + 0x6E, 0x31, 0xD4, 0x1F, 0xEE, 0x26, 0xC2, 0x0D, 0xC4, 0x0B, 0x48, 0xFD, + 0xB4, 0xE8, 0x17, 0xF2, 0x3E, 0xD9, 0x2E, 0xF3, 0x92, 0xE8, 0x59, 0x03, + 0xC4, 0xFB, 0xC5, 0x0E, 0xAD, 0x0B, 0x71, 0x0F, 0x8E, 0x1E, 0x37, 0x10, + 0xEF, 0x27, 0x44, 0x0B, 0x64, 0x27, 0x89, 0x01, 0x08, 0x1E, 0x27, 0xF7, + 0xD1, 0x05, 0x89, 0xEC, 0x3E, 0xE2, 0x51, 0xE5, 0xAD, 0xBE, 0x58, 0xDC, + 0xA7, 0xAE, 0x91, 0xD4, 0x2E, 0xB4, 0xF3, 0xD3, 0x48, 0xCF, 0x39, 0xE0, + 0xF5, 0xFE, 0x08, 0xFD, 0x8B, 0x32, 0x69, 0x23, 0xDF, 0x55, 0xE1, 0x43, + 0xEE, 0x5C, 0x36, 0x4E, 0x47, 0x4A, 0x2D, 0x3E, 0xAB, 0x23, 0x51, 0x22, + 0xCE, 0xF5, 0x1A, 0x08, 0xE2, 0xC8, 0xFB, 0xE8, 0xA8, 0xAE, 0x0D, 0xD1, + 0x56, 0xB8, 0xC6, 0xD6, 0x3F, 0xD8, 0xDA, 0xEC, 0xE6, 0x01, 0x3B, 0x03, + 0x14, 0x25, 0xF4, 0x16, 0xA5, 0x28, 0xE7, 0x1C, 0x66, 0x11, 0x2F, 0x0F, + 0xB1, 0xFC, 0x05, 0xFB, 0x30, 0xE6, 0x8A, 0xE3, 0x53, 0xC1, 0x0E, 0xC7, + 0x02, 0xB6, 0x17, 0xC5, 0x60, 0xDB, 0x80, 0xE7, 0x6C, 0x0A, 0xDE, 0x09, + 0xEF, 0x26, 0x15, 0x1A, 0x8F, 0x2F, 0x59, 0x19, 0xB9, 0x29, 0xE1, 0x0E, + 0x5F, 0x1B, 0xC9, 0x01, 0x76, 0x03, 0x17, 0xEF, 0x27, 0xE9, 0xD6, 0xDE, + 0xF4, 0xE2, 0x84, 0xE7, 0x87, 0xF1, 0x7A, 0x02, 0xF1, 0x00, 0x7F, 0x12, + 0x33, 0x0D, 0xC0, 0x14, 0x6C, 0x18, 0xA8, 0x13, 0xEC, 0x24, 0x2C, 0x12, + 0x67, 0x28, 0x72, 0x0A, 0xA1, 0x18, 0xBD, 0xFC, 0x6A, 0xFB, 0x16, 0xEF, + 0x1C, 0xDD, 0x18, 0xE3, 0x6E, 0xC3, 0xC5, 0xD9, 0x9B, 0xAE, 0xFA, 0xD7, + 0xEF, 0xB0, 0xE5, 0xE6, 0x47, 0xD4, 0xE3, 0x00, 0x77, 0x0A, 0x0C, 0x1E, + 0xDC, 0x3D, 0x0B, 0x3E, 0x54, 0x5B, 0x86, 0x54, 0x4C, 0x5B, 0xA3, 0x51, + 0xD1, 0x41, 0x56, 0x38, 0x44, 0x16, 0x8B, 0x15, 0x01, 0xE8, 0x31, 0xF4, + 0x0F, 0xC9, 0x11, 0xDA, 0xA7, 0xBF, 0x06, 0xCA, 0xB8, 0xCF, 0x7A, 0xCB, + 0x6E, 0xF8, 0x5C, 0xE5, 0xDD, 0x1A, 0x03, 0x03, 0x89, 0x20, 0x32, 0x12, + 0xD7, 0x17, 0x0A, 0x1C, 0xC5, 0x02, 0x75, 0x14, 0x96, 0xE9, 0xA5, 0xFD, + 0x56, 0xDE, 0xB3, 0xEA, 0xB4, 0xD4, 0xAC, 0xD5, 0x6F, 0xD4, 0xF7, 0xD0, + 0x8A, 0xF5, 0x5D, 0xF3, 0xFE, 0x1F, 0x71, 0x1B, 0xEC, 0x37, 0x64, 0x28, + 0xB5, 0x3D, 0x40, 0x27, 0x25, 0x31, 0x96, 0x22, 0x09, 0x18, 0xBC, 0x16, + 0x7A, 0xFD, 0xA4, 0x05, 0xCE, 0xE7, 0xF9, 0xF5, 0xA3, 0xE5, 0xF2, 0xF6, + 0xD4, 0xFC, 0x95, 0x08, 0x7F, 0x16, 0x70, 0x14, 0x26, 0x26, 0x67, 0x17, + 0x4C, 0x32, 0x8E, 0x17, 0x9C, 0x37, 0xBE, 0x0F, 0x71, 0x2D, 0x6B, 0x01, + 0x07, 0x11, 0xD0, 0xF2, 0x58, 0xF0, 0x5E, 0xE7, 0x51, 0xD3, 0x0B, 0xD4, + 0x1A, 0xBC, 0x80, 0xBA, 0x09, 0xB6, 0xC9, 0xAE, 0xCB, 0xC6, 0xBF, 0xB9, + 0x66, 0xED, 0x0A, 0xD8, 0x8F, 0x1A, 0x8A, 0xFE, 0x4B, 0x3F, 0xEE, 0x28, + 0x26, 0x51, 0xEF, 0x50, 0x4C, 0x42, 0xA7, 0x5F, 0x6A, 0x1C, 0x50, 0x49, + 0xD9, 0xFB, 0xC4, 0x24, 0xC0, 0xE0, 0xD1, 0x01, 0x66, 0xC4, 0x4E, 0xE5, + 0x62, 0xBE, 0x33, 0xDC, 0x70, 0xD3, 0xAC, 0xE0, 0xBC, 0xEC, 0xA3, 0xEB, + 0xE4, 0x01, 0x7C, 0x01, 0xBE, 0x0D, 0x1F, 0x17, 0xA3, 0x0C, 0xDB, 0x20, + 0xAC, 0x01, 0x38, 0x23, 0x22, 0xEA, 0x5B, 0x17, 0x28, 0xD7, 0xED, 0xFD, + 0xB4, 0xD2, 0xCF, 0xE0, 0x5D, 0xD6, 0x79, 0xC9, 0x05, 0xF4, 0xAE, 0xD5, + 0x90, 0x1D, 0x80, 0xFA, 0x6E, 0x28, 0x43, 0x09, 0x25, 0x1A, 0xE0, 0x00, + 0xF3, 0x0F, 0xB6, 0xF6, 0xD7, 0x07, 0xB8, 0xEB, 0x8A, 0xFA, 0xD5, 0xE0, + 0x76, 0xEA, 0x33, 0xD7, 0xB2, 0xE1, 0xE1, 0xD8, 0x62, 0xEB, 0x9B, 0xF1, + 0xDC, 0xF6, 0x8B, 0x0A, 0xB4, 0xF9, 0xA6, 0x0E, 0x29, 0x00, 0x1B, 0x0C, + 0x45, 0x06, 0x5C, 0x0A, 0x2C, 0x07, 0x3C, 0x03, 0xC9, 0x06, 0x94, 0xF8, + 0xE1, 0x00, 0x9D, 0xED, 0xB3, 0xF3, 0x5A, 0xE4, 0x0E, 0xE1, 0x63, 0xD6, + 0x49, 0xCD, 0x82, 0xC7, 0xDE, 0xC2, 0x3E, 0xCB, 0xF6, 0xCD, 0x13, 0xE5, + 0x46, 0xF3, 0xF0, 0x07, 0x64, 0x25, 0x4B, 0x2A, 0xF3, 0x4A, 0x74, 0x48, + 0x8D, 0x55, 0xED, 0x58, 0xC7, 0x48, 0x23, 0x55, 0xA1, 0x28, 0xB6, 0x3E, + 0x46, 0xFD, 0xAD, 0x1C, 0x35, 0xDE, 0x57, 0xFE, 0x1F, 0xD1, 0x3A, 0xE5, + 0x1B, 0xD2, 0x8A, 0xD7, 0x56, 0xE8, 0x1A, 0xE6, 0x6A, 0x06, 0x76, 0x01, + 0x7F, 0x13, 0x45, 0x0D, 0x30, 0x17, 0xB8, 0x0E, 0x1C, 0x1C, 0x67, 0x11, + 0x10, 0x0E, 0x5B, 0x05, 0xF3, 0xF4, 0x86, 0xF2, 0xC1, 0xE3, 0x42, 0xE5, + 0xF6, 0xDA, 0xE8, 0xD8, 0x6A, 0xE3, 0x19, 0xDE, 0xFE, 0x01, 0x7F, 0xFD, + 0x20, 0x22, 0xBB, 0x19, 0x20, 0x2F, 0xA3, 0x1B, 0xCF, 0x2A, 0x9A, 0x0F, + 0xF7, 0x1E, 0x56, 0x05, 0x34, 0x13, 0xA7, 0xFA, 0x1B, 0x07, 0x8B, 0xEC, + 0xB2, 0xFC, 0xD0, 0xE9, 0xF4, 0xFC, 0xB1, 0xFF, 0x25, 0x04, 0xC7, 0x1A, + 0x1B, 0x0E, 0x37, 0x29, 0x83, 0x12, 0xB5, 0x29, 0x17, 0x0F, 0xFB, 0x23, + 0x62, 0x13, 0x89, 0x21, 0x95, 0x18, 0x2C, 0x14, 0xAE, 0x17, 0x3E, 0x01, + 0x5D, 0x12, 0xF1, 0xFB, 0x99, 0x02, 0x28, 0xF9, 0x1E, 0xED, 0xA3, 0xE9, + 0x42, 0xE1, 0x41, 0xD8, 0x24, 0xE0, 0x4C, 0xD3, 0x3C, 0xE8, 0x72, 0xDF, + 0x51, 0x05, 0xF8, 0x02, 0xDA, 0x2A, 0xFE, 0x2C, 0xA6, 0x43, 0x3B, 0x4A, + 0x97, 0x4A, 0x6A, 0x57, 0x40, 0x39, 0x3A, 0x4C, 0xAA, 0x16, 0xB1, 0x2A, + 0xA0, 0xF9, 0x6B, 0x04, 0x89, 0xEA, 0x1C, 0xE7, 0x44, 0xE2, 0x6C, 0xD7, + 0x3F, 0xE2, 0xA5, 0xD6, 0x5E, 0xF3, 0xA1, 0xE3, 0xA5, 0x0B, 0xE4, 0xF5, + 0xBB, 0x18, 0x30, 0x07, 0x28, 0x1A, 0xEC, 0x16, 0xEF, 0x0F, 0x20, 0x1A, + 0x05, 0xF5, 0x58, 0x09, 0xD1, 0xDB, 0xDF, 0xF7, 0x59, 0xCF, 0x2F, 0xEB, + 0x96, 0xC4, 0x28, 0xDA, 0xDF, 0xC9, 0xE5, 0xDE, 0xEE, 0xEA, 0x73, 0x04, + 0x85, 0x0C, 0xA5, 0x21, 0xEE, 0x16, 0x41, 0x1E, 0xAF, 0x14, 0xAF, 0x10, + 0xF2, 0x0A, 0xA6, 0xFE, 0x05, 0xF6, 0x45, 0xE1, 0xF9, 0xE0, 0x49, 0xCE, + 0x46, 0xCD, 0x25, 0xCD, 0xDC, 0xC5, 0xC0, 0xD8, 0x79, 0xDE, 0x18, 0xF5, + 0xBE, 0x04, 0xF4, 0x13, 0x13, 0x12, 0xEE, 0x15, 0xDC, 0x0D, 0xA2, 0x00, + 0x05, 0x0F, 0xB0, 0xEE, 0xEF, 0x0B, 0x7E, 0xE2, 0xB4, 0xFA, 0xD3, 0xD7, + 0xF8, 0xE4, 0x62, 0xD3, 0x8C, 0xD7, 0x85, 0xD8, 0xE5, 0xCD, 0xAB, 0xD8, + 0xC4, 0xC2, 0x54, 0xC9, 0x36, 0xC2, 0x13, 0xBB, 0x18, 0xDB, 0x0B, 0xC4, + 0xF6, 0x05, 0x5D, 0xE0, 0x01, 0x2D, 0x2C, 0x01, 0x36, 0x42, 0x8D, 0x23, + 0x58, 0x40, 0x46, 0x41, 0xC4, 0x26, 0xEC, 0x47, 0x34, 0xFF, 0xBC, 0x30, + 0xF0, 0xD7, 0x44, 0x07, 0x59, 0xC2, 0x2A, 0xE1, 0x00, 0xC8, 0x34, 0xCF, + 0xC2, 0xDA, 0x3D, 0xD0, 0x3D, 0xEA, 0xB4, 0xDD, 0x4A, 0xF8, 0x0A, 0xF4, + 0x89, 0x0A, 0x45, 0x0C, 0x5B, 0x15, 0x2A, 0x19, 0xA1, 0x05, 0xF3, 0x11, + 0xBE, 0xE5, 0x91, 0x04, 0x96, 0xD3, 0xCE, 0xFF, 0x1A, 0xCD, 0xFE, 0xF0, + 0x62, 0xC9, 0x5C, 0xD6, 0xC1, 0xDA, 0x92, 0xD7, 0x17, 0x0E, 0x23, 0x05, + 0x42, 0x38, 0x6D, 0x27, 0xA9, 0x3B, 0xBA, 0x20, 0xD1, 0x34, 0xD3, 0x17, + 0x1A, 0x2D, 0x2C, 0x13, 0x14, 0x1A, 0x08, 0xFF, 0x10, 0x03, 0x22, 0xE8, + 0xE9, 0xFC, 0x6B, 0xED, 0xBD, 0x10, 0x5C, 0x12, 0x08, 0x28, 0x99, 0x32, + 0x3E, 0x32, 0xA9, 0x38, 0x7F, 0x36, 0xB3, 0x30, 0x45, 0x34, 0x8B, 0x25, + 0x85, 0x2C, 0xB8, 0x23, 0x61, 0x1E, 0xB5, 0x27, 0x52, 0x03, 0xC6, 0x1B, + 0x8D, 0xE3, 0x9D, 0x03, 0x95, 0xCC, 0x94, 0xF2, 0x3A, 0xBE, 0xFF, 0xE1, + 0x01, 0xB8, 0xF5, 0xC8, 0xA1, 0xC2, 0xE0, 0xBF, 0xC6, 0xE2, 0x94, 0xDE, + 0xE4, 0x13, 0x46, 0x17, 0x66, 0x48, 0xFA, 0x4A, 0x04, 0x64, 0xF0, 0x60, + 0xFF, 0x5D, 0xED, 0x58, 0x61, 0x4B, 0x21, 0x43, 0x9C, 0x2B, 0x26, 0x1B, + 0x0B, 0x00, 0x5B, 0xE8, 0x3E, 0xE2, 0x5E, 0xC7, 0xAE, 0xDB, 0x4E, 0xC0, + 0xEF, 0xE6, 0x87, 0xD1, 0xE8, 0xFD, 0x00, 0xF5, 0x79, 0x10, 0xFE, 0x0C, + 0x2E, 0x1A, 0x1C, 0x0D, 0xAC, 0x1E, 0x80, 0x06, 0xFE, 0x10, 0xDB, 0xF7, + 0x29, 0xF0, 0x54, 0xD9, 0xC4, 0xD5, 0xA5, 0xC1, 0x9F, 0xC2, 0x73, 0xBA, + 0x8C, 0xB9, 0xC5, 0xC2, 0x58, 0xDE, 0xE0, 0xF0, 0x77, 0x0D, 0x1B, 0x22, + 0xEB, 0x18, 0x83, 0x2E, 0xF1, 0x16, 0xB4, 0x27, 0xB5, 0x0F, 0x58, 0x16, + 0x68, 0xFB, 0x13, 0xFE, 0x87, 0xE3, 0xFC, 0xEA, 0xCC, 0xD0, 0xE9, 0xDD, + 0x1E, 0xD2, 0xC0, 0xE2, 0xD5, 0xE9, 0x42, 0xFD, 0x41, 0xFB, 0xAD, 0x0F, + 0x11, 0x04, 0xD7, 0x16, 0x09, 0x0C, 0xF1, 0x1B, 0x1E, 0x0A, 0xAA, 0x15, + 0x03, 0x05, 0x3A, 0x08, 0x5C, 0xFF, 0x1B, 0xF9, 0x81, 0xEB, 0x86, 0xE4, + 0x58, 0xCF, 0xF2, 0xD0, 0x69, 0xB9, 0x85, 0xBE, 0x19, 0xB4, 0xB2, 0xB2, + 0xFC, 0xBE, 0xEE, 0xB8, 0x3D, 0xD4, 0xAC, 0xCD, 0x42, 0xFD, 0x36, 0xF2, + 0x0C, 0x30, 0x09, 0x22, 0xBA, 0x54, 0xBC, 0x4D, 0x3E, 0x5B, 0xB0, 0x5C, + 0x1B, 0x44, 0x0F, 0x47, 0xE8, 0x1C, 0x6F, 0x20, 0x5F, 0xF4, 0xC7, 0xFC, + 0x2E, 0xD8, 0xA7, 0xE6, 0xAF, 0xC8, 0xAA, 0xD8, 0x93, 0xCB, 0xAD, 0xD4, + 0xBA, 0xE7, 0x70, 0xE7, 0xE5, 0x0F, 0xD1, 0x0E, 0x0F, 0x24, 0xB5, 0x27, + 0x02, 0x22, 0xCB, 0x22, 0x8D, 0x1B, 0xB8, 0x12, 0x4D, 0x08, 0x9E, 0xFC, + 0x6B, 0xF0, 0xB6, 0xED, 0x2F, 0xDF, 0x7C, 0xE7, 0xEE, 0xCD, 0x46, 0xD7, + 0x90, 0xE0, 0xD3, 0xE1, 0x5F, 0x1D, 0xC9, 0x17, 0xBD, 0x43, 0x0D, 0x3A, + 0x62, 0x40, 0xF7, 0x2E, 0xCA, 0x2F, 0xCA, 0x16, 0x76, 0x16, 0x19, 0x00, + 0x5D, 0xFD, 0x80, 0xF3, 0xC4, 0xF3, 0x96, 0xF8, 0x3B, 0xEB, 0x51, 0xFD, + 0xDD, 0xE8, 0xBE, 0x07, 0xC1, 0xF7, 0xED, 0x20, 0xB1, 0x08, 0xBC, 0x2F, + 0xC1, 0x12, 0x13, 0x26, 0x95, 0x1F, 0xAE, 0x1B, 0x11, 0x20, 0x84, 0x11, + 0x84, 0x0F, 0x87, 0x01, 0xF8, 0x06, 0x83, 0x01, 0xFE, 0xF7, 0xDE, 0x04, + 0x0C, 0xE4, 0xA4, 0x01, 0xB9, 0xDC, 0xAD, 0xF9, 0x3D, 0xD5, 0xAE, 0xE2, + 0xBB, 0xD9, 0x2E, 0xD3, 0x7D, 0xF5, 0xCE, 0xDC, 0x93, 0x11, 0xC9, 0xF0, + 0xE2, 0x25, 0xCF, 0x09, 0xE5, 0x3A, 0x29, 0x2A, 0xA5, 0x44, 0x78, 0x44, + 0xEA, 0x30, 0x4F, 0x44, 0xDE, 0x10, 0x28, 0x2E, 0x11, 0xF2, 0x28, 0x0C, + 0xF6, 0xDA, 0x1E, 0xEF, 0x84, 0xD2, 0xB6, 0xDD, 0xF9, 0xD6, 0xC0, 0xCE, + 0xA3, 0xE8, 0x89, 0xCA, 0xBE, 0xFB, 0x65, 0xD3, 0x56, 0x04, 0x72, 0xDD, + 0xDF, 0x06, 0xFD, 0xE3, 0x84, 0x05, 0x24, 0xE6, 0x65, 0xF4, 0x76, 0xDE, + 0x56, 0xDB, 0x94, 0xD7, 0x67, 0xCB, 0x7B, 0xD6, 0x67, 0xC8, 0xB3, 0xD1, + 0x46, 0xD7, 0xCA, 0xD1, 0x2E, 0xF2, 0x2B, 0xDE, 0x3B, 0x0E, 0xB4, 0xF3, + 0xDD, 0x20, 0xDA, 0x06, 0xE4, 0x16, 0x6A, 0xFF, 0x4C, 0xF4, 0x1E, 0xE3, + 0x46, 0xDE, 0x9C, 0xDE, 0x63, 0xD6, 0xCE, 0xEC, 0x49, 0xCF, 0xFD, 0xEF, + 0x09, 0xDD, 0x43, 0xFD, 0x73, 0xFD, 0xD9, 0x1A, 0xCE, 0x18, 0x88, 0x2A, + 0x00, 0x22, 0xEB, 0x1F, 0xD8, 0x21, 0x09, 0x19, 0x89, 0x1B, 0x2F, 0x20, + 0x93, 0x0D, 0x1C, 0x23, 0x24, 0x03, 0x86, 0x23, 0xCA, 0x01, 0xD7, 0x28, + 0x07, 0x05, 0xA7, 0x29, 0x54, 0xFD, 0x5A, 0x12, 0x65, 0xE8, 0x29, 0xE9, + 0x91, 0xDB, 0xB9, 0xCD, 0x79, 0xE0, 0xDE, 0xCC, 0x57, 0xF6, 0x84, 0xE6, + 0xED, 0x14, 0x22, 0x10, 0x8E, 0x37, 0x35, 0x3C, 0x13, 0x55, 0x3C, 0x5A, + 0xCE, 0x58, 0x9A, 0x57, 0xCE, 0x3E, 0xE3, 0x33, 0x6B, 0x1F, 0x8A, 0x07, + 0xE2, 0x0C, 0x01, 0xEC, 0x16, 0xF6, 0x24, 0xDA, 0x09, 0xDE, 0x08, 0xCE, + 0x4C, 0xDC, 0xC1, 0xD1, 0x72, 0xED, 0xCE, 0xE6, 0x89, 0xFB, 0x70, 0x00, + 0xD9, 0xFB, 0x88, 0x09, 0xAD, 0xF8, 0xF6, 0xFF, 0x2C, 0xFB, 0x3E, 0xF5, + 0xB9, 0xFD, 0x6A, 0xF3, 0x79, 0xF3, 0x97, 0xEF, 0xA9, 0xE7, 0x71, 0xEB, + 0x20, 0xEC, 0x22, 0xF3, 0xDD, 0xF9, 0xCE, 0x03, 0xE8, 0x0F, 0xC0, 0x1F, + 0xDF, 0x17, 0x85, 0x2C, 0xF2, 0x08, 0x91, 0x1E, 0x6A, 0xFA, 0x1F, 0x0E, + 0x37, 0xF1, 0x1E, 0x00, 0x9F, 0xE7, 0x4A, 0xF2, 0xF3, 0xE7, 0x36, 0xF2, + 0xC9, 0xF8, 0x73, 0x00, 0x45, 0x12, 0x8B, 0x13, 0x35, 0x26, 0xE8, 0x26, + 0xCB, 0x1D, 0xD4, 0x21, 0x55, 0x15, 0x2A, 0x13, 0x71, 0x29, 0x8A, 0x18, + 0xFE, 0x36, 0x5D, 0x19, 0x91, 0x2C, 0x04, 0x08, 0x38, 0x1F, 0xB2, 0xFC, + 0x01, 0x12, 0xA5, 0xFA, 0x3B, 0xFA, 0xFC, 0xEE, 0x7B, 0xDA, 0xFC, 0xD9, + 0x57, 0xBB, 0x88, 0xC5, 0x51, 0xB5, 0x0D, 0xC0, 0xBC, 0xD6, 0x61, 0xD4, + 0x11, 0x03, 0xF9, 0xF5, 0x39, 0x27, 0xF9, 0x1A, 0xA6, 0x3B, 0x3C, 0x35, + 0x20, 0x40, 0x9F, 0x3F, 0xFF, 0x39, 0x6B, 0x3C, 0x00, 0x19, 0x21, 0x19, + 0x10, 0xF0, 0x49, 0xEF, 0x88, 0xD5, 0x32, 0xD7, 0x33, 0xCD, 0xA6, 0xCC, + 0xE3, 0xCE, 0x97, 0xCC, 0x19, 0xCB, 0x52, 0xD4, 0x02, 0xD7, 0xCB, 0xEF, + 0x27, 0xE8, 0x70, 0x01, 0x50, 0xEF, 0x7E, 0xFD, 0xB1, 0xF9, 0xD5, 0xFF, + 0xFD, 0xF9, 0x90, 0xFE, 0xC7, 0xE8, 0x1A, 0xEF, 0x5C, 0xDD, 0xD8, 0xE4, + 0xB3, 0xDC, 0x65, 0xE1, 0xBF, 0xDE, 0x69, 0xDC, 0x55, 0xFA, 0x63, 0xEF, + 0x88, 0x27, 0xED, 0x15, 0xC1, 0x32, 0x4A, 0x1E, 0xCE, 0x24, 0x3B, 0x0E, + 0x1E, 0x1F, 0x5B, 0x07, 0xD0, 0x0F, 0x5E, 0x00, 0xC9, 0xF9, 0xE1, 0xFB, + 0x33, 0xE8, 0x80, 0xFB, 0xC9, 0xE0, 0x79, 0xFE, 0x9F, 0x05, 0xB9, 0x1F, + 0x49, 0x38, 0x4B, 0x3F, 0xB0, 0x3C, 0x34, 0x30, 0xD5, 0x2B, 0xDC, 0x18, + 0xB5, 0x1E, 0x78, 0x0E, 0x04, 0x07, 0x32, 0xFF, 0xDB, 0xEF, 0xDA, 0xF7, + 0x3F, 0xE2, 0x17, 0xFA, 0xF4, 0xDD, 0x47, 0xF9, 0x45, 0xE1, 0xCC, 0xF8, + 0x62, 0xD6, 0x4A, 0xF0, 0xD8, 0xBE, 0xA0, 0xDC, 0x7A, 0xB6, 0x64, 0xD0, + 0xC6, 0xCC, 0xE2, 0xDC, 0xC3, 0xFC, 0xA2, 0xFF, 0xB2, 0x28, 0x06, 0x1A, + 0x97, 0x45, 0xC6, 0x29, 0xE4, 0x58, 0xF0, 0x3A, 0x06, 0x51, 0x93, 0x34, + 0x94, 0x2F, 0x44, 0x18, 0x48, 0x0E, 0xC9, 0x00, 0x38, 0xF2, 0x29, 0xEC, + 0xDA, 0xE4, 0xC5, 0xE0, 0x9A, 0xE9, 0xEC, 0xE6, 0xA5, 0xEA, 0xF5, 0xEB, + 0x75, 0xED, 0xBE, 0xED, 0x6B, 0xFB, 0xDD, 0xF6, 0xB1, 0xFD, 0x3D, 0xFD, + 0x6D, 0xF6, 0x44, 0x02, 0x21, 0xF0, 0x9A, 0x06, 0x4E, 0xE9, 0x99, 0x07, + 0x3C, 0xED, 0xDD, 0x0A, 0x0B, 0xFB, 0x90, 0x05, 0xF8, 0x07, 0x4B, 0xF8, + 0x1F, 0x18, 0x24, 0xFA, 0xA8, 0x2B, 0x1F, 0x0A, 0x4A, 0x2F, 0xBA, 0x0B, + 0xF1, 0x22, 0xEA, 0x00, 0x2A, 0x15, 0xE1, 0xFA, 0x7A, 0x08, 0xB6, 0xFA, + 0xA1, 0xFD, 0xE9, 0xFB, 0x99, 0xF3, 0xB0, 0xF7, 0x78, 0xEA, 0xD6, 0xF2, + 0x75, 0xEF, 0x01, 0xFC, 0xCF, 0xFE, 0x3C, 0x0B, 0xB2, 0x06, 0x80, 0x08, + 0xFB, 0x10, 0x99, 0xFE, 0x5C, 0x1B, 0xD3, 0xFF, 0x06, 0x14, 0x10, 0x06, + 0xCB, 0xFE, 0x55, 0x07, 0xA5, 0xED, 0xDC, 0x02, 0xE4, 0xE8, 0x17, 0x00, + 0x04, 0xDF, 0x5E, 0xF8, 0xB5, 0xC9, 0x46, 0xE3, 0xD5, 0xB7, 0xF0, 0xC7, + 0x2F, 0xB4, 0xFA, 0xBA, 0xEC, 0xBF, 0xD2, 0xCA, 0x3A, 0xDE, 0xF1, 0xF0, + 0x5A, 0x07, 0xEF, 0x18, 0x8D, 0x2F, 0xAC, 0x3A, 0xFE, 0x4F, 0xD8, 0x51, + 0x57, 0x4F, 0x55, 0x45, 0xDD, 0x2E, 0xA5, 0x1C, 0xE8, 0x0A, 0xF6, 0xF2, + 0xFB, 0xED, 0x4F, 0xD2, 0x1B, 0xDA, 0x45, 0xC7, 0xBC, 0xCB, 0xB7, 0xCD, + 0x71, 0xCB, 0xFD, 0xE1, 0x80, 0xDC, 0x5A, 0xFD, 0x69, 0xEA, 0x93, 0x08, + 0x35, 0xF4, 0x88, 0x05, 0x78, 0xFF, 0xA7, 0xFE, 0x9F, 0xFD, 0x4B, 0xF1, + 0x1F, 0xF2, 0x91, 0xEB, 0xED, 0xF0, 0x50, 0xF9, 0x89, 0xF6, 0xC5, 0x06, + 0xE4, 0xFE, 0x8F, 0x0E, 0x73, 0x1C, 0xFB, 0x24, 0x2A, 0x45, 0xA7, 0x3C, + 0x0D, 0x4E, 0xA4, 0x2D, 0x1E, 0x38, 0x92, 0x07, 0xE0, 0x20, 0x55, 0xFC, + 0x55, 0x04, 0x6F, 0x03, 0x0C, 0xE4, 0x70, 0x02, 0x9E, 0xD5, 0x37, 0x01, + 0x35, 0xE4, 0x0A, 0x0C, 0xE9, 0x0C, 0x61, 0x20, 0xAE, 0x2F, 0x39, 0x28, + 0x07, 0x39, 0x4B, 0x1E, 0x21, 0x35, 0xC9, 0x11, 0x1E, 0x2B, 0x9F, 0x0B, + 0xD5, 0x1C, 0x4F, 0x0B, 0xD4, 0x13, 0x48, 0x0D, 0x06, 0x0D, 0xE2, 0x05, + 0x25, 0xFC, 0x77, 0xEF, 0xF6, 0xEB, 0x8E, 0xDD, 0xE5, 0xD7, 0xC7, 0xCF, + 0x41, 0xBE, 0xEE, 0xBF, 0xEE, 0xB7, 0x35, 0xBE, 0x59, 0xCE, 0x2D, 0xD6, + 0xD4, 0xF7, 0x6E, 0xFB, 0x5C, 0x21, 0x5F, 0x1E, 0xC7, 0x43, 0x70, 0x41, + 0x8F, 0x52, 0x60, 0x56, 0xF6, 0x42, 0x67, 0x51, 0xC4, 0x21, 0x1E, 0x37, + 0xF3, 0x01, 0x33, 0x17, 0x90, 0xE5, 0xEB, 0xF8, 0x2B, 0xD3, 0xA8, 0xE0, + 0xD2, 0xD2, 0xF9, 0xD7, 0x4E, 0xCF, 0xDB, 0xD2, 0x03, 0xCB, 0x0B, 0xD3, + 0xD0, 0xCF, 0x42, 0xD8, 0xE6, 0xD0, 0xBC, 0xDB, 0x55, 0xCC, 0x87, 0xDE, + 0xBA, 0xCB, 0x39, 0xD8, 0xDD, 0xDC, 0xAD, 0xD1, 0xFF, 0xF7, 0xE8, 0xD7, + 0xAA, 0x08, 0x29, 0xE7, 0xFE, 0x0E, 0x02, 0xF9, 0x9F, 0x17, 0x21, 0x04, + 0x99, 0x26, 0x4B, 0x07, 0xCB, 0x32, 0x65, 0x0F, 0x0A, 0x2B, 0x65, 0x10, + 0xEA, 0x09, 0x88, 0xFC, 0x83, 0xEE, 0x29, 0xEB, 0x84, 0xE4, 0x24, 0xE3, + 0x36, 0xDD, 0x51, 0xE1, 0x2D, 0xE0, 0x8F, 0xEC, 0x4E, 0xED, 0x3F, 0xFA, + 0xCB, 0x09, 0x0C, 0x0A, 0x4A, 0x29, 0x37, 0x1A, 0xA2, 0x26, 0xA6, 0x1B, + 0xB2, 0x11, 0x90, 0x17, 0x5C, 0x0A, 0x98, 0x16, 0x36, 0x0C, 0x7D, 0x15, + 0x4F, 0x08, 0xD6, 0x18, 0x98, 0x03, 0xDD, 0x1C, 0x19, 0x00, 0xF7, 0x13, + 0x1A, 0xF6, 0x89, 0x02, 0x79, 0xE4, 0xF0, 0xEA, 0xA2, 0xCD, 0x0F, 0xCB, + 0x7B, 0xBE, 0x7F, 0xB7, 0xF9, 0xC9, 0xBA, 0xC7, 0x65, 0xF3, 0x98, 0xF9, + 0xB5, 0x21, 0x93, 0x2F, 0xAE, 0x3F, 0xD9, 0x4F, 0x9B, 0x50, 0xA4, 0x5F, + 0xCE, 0x51, 0x7B, 0x61, 0x36, 0x35, 0x96, 0x44, 0xCB, 0x09, 0xA6, 0x17, + 0xAF, 0xEC, 0x3C, 0xF5, 0x91, 0xDA, 0xB3, 0xDC, 0xA5, 0xD3, 0x89, 0xD4, + 0x6F, 0xD8, 0xBD, 0xD8, 0x65, 0xD9, 0xD4, 0xD6, 0xCC, 0xDF, 0x52, 0xDA, + 0x75, 0xEB, 0x34, 0xE7, 0x23, 0xED, 0x85, 0xEF, 0xF5, 0xEC, 0xCC, 0xF4, + 0x36, 0xF4, 0x55, 0xF8, 0x0B, 0x01, 0x42, 0x01, 0xFF, 0x10, 0x9A, 0x12, + 0x65, 0x20, 0x0E, 0x19, 0xD4, 0x28, 0x27, 0x11, 0xE9, 0x33, 0x6E, 0x13, + 0x03, 0x41, 0x78, 0x20, 0x7A, 0x37, 0xF3, 0x1C, 0x6C, 0x18, 0x94, 0x06, + 0x65, 0xFD, 0xCD, 0xF1, 0x53, 0xEF, 0xA7, 0xE7, 0x97, 0xE5, 0x18, 0xE3, + 0x00, 0xDC, 0x4A, 0xDA, 0x36, 0xE0, 0x4B, 0xDC, 0x69, 0xF9, 0xCB, 0xF6, + 0x5F, 0x15, 0x87, 0x13, 0x42, 0x24, 0xE1, 0x20, 0x99, 0x27, 0xE4, 0x1D, + 0xC7, 0x22, 0xC0, 0x13, 0xDC, 0x16, 0x42, 0x0B, 0x11, 0x09, 0x70, 0x03, + 0x4C, 0xFA, 0x1F, 0xFB, 0x16, 0xF0, 0x04, 0xF3, 0x8E, 0xE6, 0x54, 0xE3, + 0x38, 0xD6, 0x1E, 0xCF, 0xC1, 0xC8, 0xE9, 0xC3, 0x79, 0xBA, 0x39, 0xBB, + 0x2C, 0xB7, 0x34, 0xC1, 0x42, 0xD7, 0xC7, 0xE7, 0x8B, 0x0D, 0x05, 0x1D, + 0x89, 0x3B, 0x0F, 0x49, 0x75, 0x55, 0x06, 0x62, 0x57, 0x56, 0x2F, 0x60, + 0x48, 0x3E, 0x7F, 0x49, 0x1F, 0x1C, 0xB1, 0x2D, 0x89, 0xFC, 0x78, 0x0E, + 0xFB, 0xE9, 0x13, 0xF7, 0xD1, 0xE2, 0x74, 0xEB, 0xFC, 0xDF, 0xD2, 0xE2, + 0x52, 0xE1, 0xE7, 0xE3, 0xD8, 0xE0, 0xCB, 0xE5, 0x37, 0xD8, 0xDA, 0xDB, + 0x52, 0xCF, 0x0B, 0xD4, 0x44, 0xCD, 0x73, 0xD8, 0x30, 0xCD, 0xDB, 0xE2, + 0x6C, 0xDF, 0x75, 0xF0, 0xCD, 0x0A, 0x1B, 0x02, 0x5A, 0x30, 0x92, 0x12, + 0x60, 0x3E, 0x3D, 0x1E, 0xF3, 0x37, 0xAA, 0x20, 0xD0, 0x2D, 0x57, 0x1C, + 0xF0, 0x26, 0x3C, 0x18, 0xC1, 0x09, 0x7B, 0x03, 0xA7, 0xDE, 0x60, 0xE7, + 0xA3, 0xCC, 0x2F, 0xE0, 0xDF, 0xCE, 0x49, 0xE1, 0xB2, 0xD3, 0xAB, 0xE1, + 0x9A, 0xDC, 0x99, 0xE4, 0x7F, 0xED, 0xF0, 0xEA, 0x7F, 0x08, 0x66, 0xFA, + 0xA9, 0x1E, 0xFC, 0x05, 0x7B, 0x1F, 0x85, 0x04, 0xCD, 0x15, 0xCC, 0x0B, + 0xAF, 0x13, 0xBD, 0x1F, 0xD2, 0x16, 0x5D, 0x29, 0x11, 0x16, 0x20, 0x25, + 0x98, 0x10, 0x2C, 0x1B, 0x95, 0x05, 0x90, 0x0D, 0x7E, 0xF4, 0x92, 0xF8, + 0x17, 0xDA, 0xA3, 0xD9, 0x20, 0xBD, 0xAC, 0xBD, 0xA3, 0xB4, 0x7C, 0xB7, + 0xFD, 0xCA, 0x62, 0xD1, 0xBB, 0xF6, 0x1D, 0x02, 0xB1, 0x2A, 0xAE, 0x36, + 0x47, 0x53, 0x6F, 0x5A, 0xD8, 0x63, 0x93, 0x66, 0x08, 0x5F, 0x63, 0x5E, + 0xCB, 0x45, 0x7F, 0x42, 0xC1, 0x21, 0x60, 0x20, 0x87, 0x01, 0x74, 0x02, + 0x37, 0xE7, 0x3E, 0xEC, 0xBC, 0xD9, 0x09, 0xE0, 0x4C, 0xDA, 0xAD, 0xD0, + 0xF0, 0xDB, 0x96, 0xBB, 0xE1, 0xE2, 0xF8, 0xB6, 0xDB, 0xED, 0x00, 0xBE, + 0xB6, 0xEC, 0x09, 0xBB, 0xB3, 0xE9, 0x95, 0xBF, 0x34, 0xF3, 0xE7, 0xD9, + 0x7C, 0x01, 0xC8, 0xFB, 0xE6, 0x18, 0xAB, 0x22, 0x78, 0x2E, 0xD3, 0x3B, + 0x5F, 0x2A, 0xEE, 0x34, 0xEA, 0x22, 0xA2, 0x28, 0x52, 0x26, 0x71, 0x28, + 0xA3, 0x1F, 0x0D, 0x26, 0x72, 0x00, 0x89, 0x0D, 0xB4, 0xDB, 0x1F, 0xF1, + 0x57, 0xCA, 0x6D, 0xEB, 0x2A, 0xC8, 0xD6, 0xEC, 0x80, 0xC9, 0x12, 0xE7, + 0xA5, 0xD1, 0xE2, 0xE3, 0xE4, 0xE6, 0x27, 0xF2, 0xC2, 0x00, 0xDF, 0x0C, + 0xBC, 0x11, 0x03, 0x19, 0xA4, 0x17, 0x41, 0x14, 0x05, 0x1B, 0x91, 0x14, + 0x97, 0x1D, 0xA9, 0x13, 0x3C, 0x20, 0xB2, 0x08, 0x4D, 0x1E, 0x80, 0x00, + 0xE7, 0x13, 0x47, 0xFF, 0x36, 0x06, 0x46, 0xF5, 0xF5, 0xEF, 0xE9, 0xD8, + 0x8A, 0xD7, 0x0E, 0xBA, 0x72, 0xCC, 0x4F, 0xAB, 0x08, 0xC9, 0xBE, 0xAE, + 0x03, 0xCD, 0xDD, 0xC2, 0xB2, 0xE9, 0x7F, 0xEF, 0xC5, 0x15, 0xAC, 0x26, + 0xF1, 0x39, 0x0D, 0x4E, 0xDA, 0x4B, 0x5E, 0x5D, 0xAC, 0x48, 0x4A, 0x54, + 0x02, 0x39, 0xF2, 0x3C, 0x45, 0x1C, 0x6C, 0x22, 0x1C, 0xF9, 0xBD, 0x09, + 0xB6, 0xE1, 0x1B, 0xF7, 0x96, 0xD6, 0x0C, 0xE9, 0x30, 0xCE, 0x23, 0xDF, + 0xF2, 0xC6, 0x5B, 0xDD, 0x85, 0xC5, 0xED, 0xDC, 0x33, 0xCA, 0x2C, 0xDC, + 0xEB, 0xCD, 0x8F, 0xDF, 0x8F, 0xCD, 0xBD, 0xE6, 0x4B, 0xD8, 0x52, 0xF8, + 0x96, 0xF6, 0x4A, 0x10, 0x34, 0x19, 0x6D, 0x25, 0xA6, 0x38, 0xBE, 0x3A, + 0x71, 0x4B, 0xD4, 0x48, 0x8E, 0x48, 0xD5, 0x40, 0x4F, 0x3D, 0xE6, 0x29, + 0x62, 0x32, 0xCC, 0x18, 0xE2, 0x18, 0xC8, 0x09, 0x4B, 0xF1, 0xCD, 0xF3, + 0x32, 0xD8, 0x24, 0xE1, 0x82, 0xD7, 0xAE, 0xDB, 0x43, 0xE3, 0xCB, 0xDF, + 0xC2, 0xF0, 0xAC, 0xE5, 0x78, 0xFD, 0xD2, 0xED, 0x76, 0x0C, 0x51, 0xFA, + 0x24, 0x18, 0xC8, 0x07, 0x0A, 0x15, 0x07, 0x0F, 0x78, 0x0C, 0xCD, 0x16, + 0x01, 0x16, 0xA1, 0x26, 0x6E, 0x2B, 0x62, 0x2E, 0x93, 0x37, 0xF8, 0x28, + 0x68, 0x34, 0x7E, 0x21, 0x3E, 0x20, 0x19, 0x13, 0x15, 0xFC, 0x09, 0xF2, + 0x37, 0xCE, 0xC7, 0xC8, 0xD6, 0xA7, 0x5B, 0xA9, 0xE8, 0x9B, 0x4D, 0x9D, + 0x88, 0xAD, 0x95, 0xAA, 0x2A, 0xD0, 0x3A, 0xC9, 0x4E, 0xFF, 0x2E, 0xF3, + 0x29, 0x34, 0xCD, 0x20, 0x46, 0x57, 0xC1, 0x3F, 0xC5, 0x62, 0xBF, 0x4C, + 0x66, 0x5B, 0xAC, 0x4A, 0x3C, 0x46, 0x5C, 0x3B, 0x06, 0x26, 0x54, 0x20, + 0x25, 0x05, 0x6C, 0x00, 0x2B, 0xF3, 0x96, 0xE6, 0xA5, 0xE9, 0x4F, 0xD8, + 0x55, 0xDF, 0x92, 0xD2, 0x16, 0xD4, 0xEC, 0xCC, 0xE5, 0xC5, 0xA5, 0xC4, + 0x1F, 0xBD, 0x4C, 0xC4, 0xE5, 0xC1, 0xFC, 0xD4, 0x8B, 0xCA, 0x2F, 0xE6, + 0xE8, 0xDC, 0x92, 0xF6, 0xDB, 0xFE, 0xBD, 0x15, 0x90, 0x1F, 0x10, 0x36, + 0x94, 0x3B, 0xD5, 0x47, 0x0D, 0x50, 0x3F, 0x4C, 0x4F, 0x48, 0xC6, 0x3B, + 0x41, 0x2C, 0x11, 0x1F, 0x8D, 0x17, 0x47, 0x11, 0x26, 0x02, 0xEA, 0x07, + 0x4E, 0xE4, 0x24, 0xF1, 0x03, 0xCD, 0x5C, 0xDB, 0x2B, 0xC5, 0x15, 0xD0, + 0x03, 0xD1, 0x3D, 0xD0, 0xA1, 0xE1, 0xCE, 0xD9, 0xAF, 0xE8, 0x72, 0xE5, + 0x76, 0xF0, 0x8B, 0xF4, 0x40, 0xFA, 0x0E, 0x08, 0x77, 0x01, 0x4C, 0x14, + 0x03, 0x0B, 0x65, 0x16, 0x74, 0x19, 0x18, 0x1A, 0xA1, 0x25, 0x80, 0x1D, + 0x8E, 0x28, 0x66, 0x19, 0xFA, 0x29, 0xCF, 0x10, 0x7B, 0x29, 0x0A, 0x07, + 0x85, 0x19, 0xDD, 0xF6, 0x08, 0xF7, 0x7E, 0xD9, 0x15, 0xCC, 0x27, 0xB7, + 0xC4, 0xAB, 0x54, 0xA9, 0xD0, 0xA3, 0xBD, 0xBB, 0xA7, 0xB8, 0x61, 0xDE, + 0x96, 0xE4, 0xF5, 0x01, 0x9B, 0x1A, 0x5D, 0x25, 0x43, 0x4A, 0x5B, 0x43, + 0x15, 0x63, 0x3B, 0x52, 0xA7, 0x5E, 0xA5, 0x4D, 0xF0, 0x45, 0x1D, 0x3E, + 0x0B, 0x24, 0x39, 0x29, 0x4A, 0x02, 0x7C, 0x11, 0xC3, 0xE7, 0x93, 0x00, + 0x4A, 0xD3, 0xB1, 0xF4, 0x0A, 0xCE, 0x10, 0xEA, 0x0C, 0xD6, 0x1B, 0xE3, + 0xDB, 0xD7, 0x6A, 0xDE, 0xB1, 0xCE, 0xB4, 0xD9, 0x4F, 0xC6, 0x32, 0xD5, + 0x78, 0xC7, 0xAC, 0xD7, 0xDC, 0xCA, 0xB8, 0xE0, 0x29, 0xDC, 0x25, 0xF0, + 0xB3, 0x05, 0x4B, 0x09, 0xC7, 0x31, 0x93, 0x1F, 0x7F, 0x4E, 0x37, 0x2D, + 0x88, 0x53, 0xFD, 0x33, 0x8D, 0x41, 0x9A, 0x2C, 0x4C, 0x2B, 0xCF, 0x1E, + 0xFB, 0x1A, 0x64, 0x11, 0x8D, 0x06, 0x64, 0xFC, 0xB4, 0xE7, 0xD5, 0xE3, + 0x0A, 0xCB, 0xFA, 0xD5, 0xC2, 0xC0, 0xC5, 0xD5, 0xC0, 0xC8, 0x15, 0xDA, + 0x09, 0xD4, 0x08, 0xE2, 0x15, 0xE2, 0xC9, 0xF0, 0x15, 0xFE, 0x59, 0x01, + 0x0A, 0x22, 0x47, 0x12, 0xCA, 0x3A, 0xAE, 0x1C, 0xB2, 0x41, 0xE2, 0x1C, + 0x42, 0x44, 0x6E, 0x1E, 0x02, 0x48, 0xF5, 0x27, 0xA8, 0x3B, 0x9F, 0x2E, + 0x84, 0x1F, 0x28, 0x2C, 0xF8, 0x06, 0x6B, 0x28, 0x1E, 0xEE, 0x3C, 0x17, + 0xA1, 0xCD, 0x69, 0xF4, 0x09, 0xAE, 0x01, 0xCF, 0x02, 0x9F, 0x79, 0xB3, + 0x87, 0xA9, 0x03, 0xB0, 0x2B, 0xC5, 0x45, 0xC4, 0x4A, 0xEA, 0x0C, 0xE7, + 0xD6, 0x15, 0xA0, 0x0F, 0x93, 0x3E, 0x66, 0x37, 0x0A, 0x56, 0x6D, 0x4E, + 0xE7, 0x59, 0x98, 0x4D, 0xF5, 0x4F, 0xAF, 0x40, 0x26, 0x39, 0x4C, 0x26, + 0x6C, 0x1B, 0x5E, 0x01, 0x4F, 0xFA, 0x3C, 0xE1, 0x8C, 0xDA, 0xA8, 0xCB, + 0xE0, 0xCD, 0x27, 0xC4, 0x67, 0xD0, 0x06, 0xC4, 0x2B, 0xCD, 0xD0, 0xBF, + 0x27, 0xC1, 0x2C, 0xC0, 0xB0, 0xB8, 0x0F, 0xC6, 0x65, 0xC0, 0xBE, 0xCA, + 0x66, 0xD2, 0x37, 0xD4, 0xB1, 0xEA, 0x05, 0xE5, 0xA1, 0x0D, 0x4B, 0xFC, + 0xE1, 0x32, 0x5A, 0x16, 0x45, 0x4E, 0x3A, 0x2F, 0x45, 0x54, 0x4D, 0x41, + 0x1E, 0x42, 0xEC, 0x47, 0x93, 0x23, 0xFD, 0x42, 0xCA, 0x06, 0x0F, 0x30, + 0xFC, 0xF3, 0x34, 0x17, 0x92, 0xE3, 0xA5, 0xFB, 0xB4, 0xD3, 0x31, 0xDC, + 0x3F, 0xD3, 0xBC, 0xCA, 0x91, 0xE1, 0xDA, 0xCD, 0xD7, 0xEA, 0x39, 0xD6, + 0x81, 0xF1, 0x83, 0xE2, 0x0E, 0x04, 0x1D, 0xF5, 0x41, 0x18, 0x18, 0x09, + 0xDF, 0x25, 0x10, 0x18, 0x18, 0x2E, 0xC1, 0x1E, 0x38, 0x35, 0x3E, 0x27, + 0x63, 0x3C, 0xEE, 0x33, 0xAD, 0x36, 0x6E, 0x34, 0x7A, 0x25, 0x73, 0x28, + 0x71, 0x15, 0x02, 0x1C, 0x37, 0x03, 0x2A, 0x08, 0xC8, 0xE3, 0x50, 0xE5, + 0x0A, 0xBE, 0xDA, 0xBD, 0xBA, 0xA4, 0x76, 0xA4, 0x2A, 0x9F, 0xF9, 0xA7, + 0x1E, 0xAD, 0x3D, 0xC2, 0x14, 0xCC, 0xC5, 0xE6, 0x72, 0xF9, 0x9D, 0x14, + 0x41, 0x2E, 0xDB, 0x3F, 0x58, 0x4E, 0xDC, 0x55, 0x38, 0x4E, 0xB6, 0x5B, + 0x24, 0x3F, 0xE1, 0x51, 0xE3, 0x26, 0x4D, 0x35, 0x86, 0x06, 0x44, 0x16, + 0x52, 0xE5, 0x3B, 0xFD, 0x02, 0xCF, 0x9B, 0xE6, 0x97, 0xCB, 0xBA, 0xD3, + 0x8E, 0xCE, 0xB7, 0xC8, 0xF0, 0xCC, 0x82, 0xC0, 0x1D, 0xCC, 0x16, 0xB9, + 0x74, 0xCE, 0x89, 0xB6, 0xFF, 0xD3, 0x79, 0xB9, 0x7C, 0xDC, 0x95, 0xC3, + 0x3B, 0xEA, 0x80, 0xDD, 0x6B, 0x03, 0x4F, 0x05, 0x07, 0x28, 0x1F, 0x28, + 0xB4, 0x4D, 0x4B, 0x3E, 0xDA, 0x62, 0xD6, 0x4C, 0x9A, 0x5B, 0xF3, 0x4D, + 0x9D, 0x3F, 0xF7, 0x3C, 0xFC, 0x1B, 0x55, 0x24, 0x43, 0xFB, 0xCB, 0x0B, + 0xE0, 0xE2, 0x40, 0xF2, 0x70, 0xD0, 0x40, 0xDF, 0x62, 0xC4, 0xD6, 0xD8, + 0xBB, 0xC5, 0x3D, 0xDD, 0x9E, 0xD3, 0x25, 0xEB, 0xE0, 0xE2, 0x51, 0xFA, + 0x3E, 0xF5, 0x41, 0x06, 0x9E, 0x0C, 0xEF, 0x0E, 0x8C, 0x21, 0xC8, 0x12, + 0x9C, 0x2B, 0x64, 0x11, 0x3C, 0x2F, 0x79, 0x12, 0x44, 0x2D, 0xE7, 0x1A, + 0x91, 0x24, 0x55, 0x24, 0xDB, 0x1D, 0xCC, 0x26, 0xFE, 0x19, 0xCF, 0x21, + 0x56, 0x12, 0xD4, 0x14, 0x53, 0xFA, 0x2D, 0xF9, 0x9F, 0xD7, 0xF8, 0xCF, + 0x07, 0xBB, 0x7E, 0xAB, 0xC3, 0xA8, 0xA1, 0x9E, 0x3D, 0xAC, 0x7C, 0xAB, + 0x47, 0xCB, 0x05, 0xCE, 0xE6, 0xF8, 0x1B, 0xFF, 0xAA, 0x29, 0xCD, 0x2F, + 0x42, 0x4D, 0x11, 0x52, 0x41, 0x5B, 0x6B, 0x5C, 0x72, 0x58, 0x53, 0x4F, + 0x99, 0x48, 0xFA, 0x37, 0x9C, 0x31, 0x00, 0x1C, 0x6B, 0x16, 0xEF, 0xFC, + 0xB5, 0xF6, 0xE1, 0xDF, 0xCB, 0xDC, 0xCF, 0xD1, 0xD3, 0xCB, 0x56, 0xD0, + 0x30, 0xBE, 0x1F, 0xD0, 0x7C, 0xB5, 0xE8, 0xD4, 0xF9, 0xB2, 0x8E, 0xDA, + 0x8B, 0xB9, 0xA8, 0xDC, 0x0E, 0xD1, 0xD2, 0xE5, 0xAC, 0xF2, 0xF7, 0xF5, + 0x5F, 0x14, 0x8E, 0x04, 0x24, 0x32, 0x87, 0x1B, 0xD8, 0x41, 0x6E, 0x38, + 0x2B, 0x4E, 0xB5, 0x4A, 0x0A, 0x5B, 0x38, 0x56, 0xF5, 0x51, 0xEF, 0x54, + 0xD4, 0x3D, 0x28, 0x41, 0xA8, 0x38, 0x05, 0x30, 0x39, 0x31, 0x2C, 0x20, + 0x1D, 0x14, 0x41, 0x05, 0x80, 0xEF, 0x80, 0xEE, 0x14, 0xD8, 0x50, 0xEB, + 0x81, 0xD3, 0x88, 0xF4, 0x2B, 0xE0, 0xFC, 0x03, 0xE5, 0xF9, 0x89, 0x1C, + 0x4E, 0x17, 0xF3, 0x35, 0x96, 0x36, 0x6E, 0x45, 0x42, 0x54, 0x67, 0x4A, + 0xF7, 0x61, 0x8E, 0x47, 0xF5, 0x60, 0x3F, 0x47, 0xCD, 0x5E, 0x6A, 0x4F, + 0x4B, 0x60, 0x39, 0x5C, 0x42, 0x59, 0x9B, 0x62, 0xA8, 0x3D, 0xCA, 0x56, + 0x58, 0x22, 0x63, 0x40, 0x4D, 0x0C, 0x21, 0x1B, 0x0C, 0xED, 0xE6, 0xEC, + 0xEA, 0xD4, 0xC1, 0xCE, 0x8D, 0xC8, 0x3F, 0xC2, 0x8F, 0xD9, 0x58, 0xDC, + 0x43, 0x05, 0x83, 0x13, 0xA8, 0x1E, 0x47, 0x34, 0x18, 0x37, 0x57, 0x48, + 0xE1, 0x5C, 0xAF, 0x61, 0xF1, 0x5F, 0x02, 0x60, 0xF5, 0x43, 0x75, 0x45, + 0x4A, 0x2B, 0x50, 0x2D, 0x51, 0x1E, 0x77, 0x26, 0x53, 0x1C, 0x76, 0x2A, + 0x17, 0xF6, 0x8A, 0xFB, 0x17, 0xD6, 0xC6, 0xCF, 0xCD, 0xD4, 0x51, 0xD6, + 0x3B, 0xB9, 0xDE, 0xBF, 0xD8, 0xA4, 0xEE, 0xA2, 0x4E, 0xB2, 0x70, 0xB2, + 0x1C, 0xBB, 0x06, 0xBC, 0x73, 0xBA, 0x54, 0xAE, 0xE5, 0xDB, 0x8B, 0xBD, + 0x38, 0xFD, 0x31, 0xD4, 0x50, 0x00, 0x05, 0xD0, 0x26, 0x0B, 0x70, 0xD1, + 0xF0, 0x1A, 0xD5, 0xEA, 0x40, 0x05, 0xBD, 0xEF, 0x62, 0xE2, 0x22, 0xDE, + 0xE6, 0xD6, 0xCD, 0xE0, 0x5F, 0xCB, 0x69, 0xE5, 0xE5, 0xB4, 0xA6, 0xD1, + 0xC2, 0xAA, 0xEB, 0xBC, 0xDD, 0xBA, 0x55, 0xBF, 0x99, 0xBD, 0xAD, 0xBD, + 0x31, 0xA8, 0x3E, 0xA8, 0x3B, 0xAA, 0x70, 0xA5, 0xCE, 0xBE, 0x57, 0xB5, + 0xE1, 0xBE, 0x32, 0xB8, 0x34, 0xBD, 0x32, 0xBD, 0x98, 0xC7, 0xBA, 0xCC, + 0x90, 0xDA, 0xCB, 0xDE, 0xC3, 0xEC, 0xD8, 0xEA, 0x27, 0xEF, 0xBB, 0xE7, + 0x6C, 0xE7, 0x1A, 0xDE, 0x1B, 0xDA, 0x83, 0xDA, 0x14, 0xCA, 0x65, 0xD5, + 0xCD, 0xBA, 0xFA, 0xCB, 0xE7, 0xB0, 0xBA, 0xC5, 0xC8, 0xA7, 0x8D, 0xB7, + 0x7E, 0xA1, 0xB5, 0xA5, 0x00, 0xA0, 0x60, 0x9D, 0xF5, 0xA1, 0xC0, 0xA0, + 0xC7, 0xAB, 0xDB, 0xAD, 0xAF, 0xC1, 0xF1, 0xC0, 0x65, 0xE9, 0xD5, 0xE1, + 0xAC, 0x1B, 0x45, 0x0D, 0x03, 0x3E, 0x10, 0x26, 0xF3, 0x43, 0x3C, 0x29, + 0x47, 0x3D, 0xA9, 0x2C, 0x2D, 0x25, 0xA4, 0x27, 0xD9, 0xFD, 0x88, 0x0F, + 0x41, 0xDB, 0xEB, 0xEE, 0xA1, 0xC7, 0xD6, 0xD3, 0x83, 0xC3, 0x05, 0xCE, + 0x18, 0xC7, 0x18, 0xD5, 0x72, 0xCA, 0x76, 0xD2, 0x0C, 0xCA, 0xD8, 0xD0, + 0xAB, 0xD9, 0x85, 0xE8, 0x7C, 0xF0, 0xEE, 0x04, 0x4C, 0x05, 0x93, 0x19, + 0x88, 0x24, 0x5E, 0x2D, 0xE8, 0x44, 0x0E, 0x3E, 0x4A, 0x56, 0xEF, 0x4A, + 0x68, 0x5A, 0x38, 0x52, 0xE6, 0x5B, 0x30, 0x56, 0xC5, 0x5A, 0xB6, 0x53, + 0x07, 0x54, 0x96, 0x4D, 0x5D, 0x43, 0x54, 0x44, 0x61, 0x2B, 0x12, 0x33, + 0xEB, 0x23, 0x1E, 0x28, 0xEB, 0x2E, 0x0F, 0x29, 0xC3, 0x2A, 0x26, 0x21, + 0x4D, 0x20, 0xB5, 0x0F, 0xB3, 0x26, 0x38, 0x0E, 0x0B, 0x2B, 0xFB, 0x18, + 0xA4, 0x27, 0xC8, 0x21, 0x27, 0x32, 0x49, 0x37, 0xAB, 0x42, 0x40, 0x53, + 0xFB, 0x48, 0x75, 0x5B, 0x59, 0x53, 0x03, 0x5B, 0x57, 0x5B, 0x10, 0x5B, + 0xFA, 0x55, 0x1F, 0x57, 0xAE, 0x52, 0xF6, 0x58, 0x33, 0x51, 0x55, 0x5D, + 0x96, 0x43, 0xE7, 0x55, 0x26, 0x2C, 0xA3, 0x40, 0x63, 0x15, 0x44, 0x28, + 0x07, 0x09, 0x85, 0x16, 0x17, 0x09, 0xA0, 0x0A, 0x85, 0x10, 0x55, 0x0A, + 0x81, 0x29, 0x63, 0x23, 0xBC, 0x4F, 0xD2, 0x49, 0xEE, 0x5F, 0xFD, 0x5F, + 0xCD, 0x60, 0xA0, 0x67, 0xB6, 0x5E, 0x03, 0x63, 0x34, 0x57, 0x8F, 0x56, + 0x72, 0x52, 0xEB, 0x4C, 0x51, 0x44, 0x39, 0x3C, 0x30, 0x30, 0x0E, 0x2A, + 0xD3, 0x25, 0xEA, 0x22, 0x99, 0x20, 0xDD, 0x24, 0xAF, 0x21, 0x23, 0x29, + 0x0E, 0x22, 0x3C, 0x28, 0xB2, 0x0F, 0x69, 0x1E, 0x2B, 0xF9, 0x04, 0x14, + 0xEC, 0xF1, 0x16, 0x12, 0xBD, 0xFB, 0x34, 0x12, 0xC4, 0x0C, 0xDC, 0x11, + 0x24, 0x22, 0xFC, 0x1A, 0xFA, 0x46, 0x8F, 0x2F, 0xEB, 0x62, 0xB0, 0x44, + 0xDE, 0x5D, 0x5C, 0x52, 0x01, 0x54, 0x12, 0x5C, 0x9C, 0x50, 0xCC, 0x5E, + 0x8C, 0x3D, 0x6B, 0x4E, 0x07, 0x27, 0x8A, 0x37, 0x4F, 0x1B, 0x1B, 0x25, + 0x04, 0x0C, 0xD4, 0x11, 0x07, 0xFC, 0xAF, 0x03, 0xDF, 0xEE, 0xDC, 0xFA, + 0xFE, 0xE8, 0x71, 0xFC, 0x39, 0xEE, 0xA6, 0x09, 0x95, 0xF0, 0x2F, 0x14, + 0x3D, 0xFD, 0x88, 0x1B, 0x1D, 0x19, 0xCC, 0x26, 0xAE, 0x32, 0x05, 0x39, + 0x68, 0x3F, 0x9E, 0x3E, 0xEA, 0x43, 0x19, 0x34, 0xE5, 0x43, 0xDD, 0x2F, + 0x8F, 0x3C, 0x29, 0x33, 0xBC, 0x2E, 0xCF, 0x30, 0x88, 0x10, 0xD5, 0x1E, + 0xD5, 0xF7, 0x3A, 0x10, 0x10, 0xE8, 0x8D, 0x04, 0xA5, 0xC6, 0x90, 0xE1, + 0x0E, 0xAE, 0x33, 0xBB, 0x55, 0xB1, 0x88, 0xB0, 0x7E, 0xBC, 0x0C, 0xBC, + 0x26, 0xCD, 0xA3, 0xCE, 0xE8, 0xED, 0x12, 0xEC, 0x84, 0x0F, 0xDA, 0x07, + 0x71, 0x31, 0x25, 0x1E, 0x1D, 0x4C, 0x97, 0x30, 0x40, 0x3D, 0xC9, 0x27, + 0x7E, 0x21, 0xD3, 0x14, 0x2F, 0x0F, 0x04, 0x09, 0xD6, 0xF4, 0x6D, 0xF8, + 0x17, 0xDF, 0x2E, 0xE7, 0xEF, 0xCF, 0x5B, 0xD4, 0x26, 0xC3, 0x52, 0xC2, + 0x9A, 0xB7, 0x8C, 0xB5, 0x61, 0xAC, 0xFF, 0xAF, 0x5F, 0xA5, 0x52, 0xB0, + 0x75, 0xA1, 0x01, 0xB0, 0x1A, 0xA6, 0x48, 0xB7, 0x10, 0xB7, 0xB1, 0xC8, + 0xEA, 0xCA, 0x88, 0xD6, 0x5F, 0xDA, 0x7A, 0xDA, 0x05, 0xF1, 0xB4, 0xDF, + 0x04, 0x0B, 0xED, 0xE5, 0x2B, 0x11, 0x9F, 0xE4, 0x9D, 0x0A, 0x60, 0xE8, + 0x27, 0xFB, 0x46, 0xE6, 0x6F, 0xE1, 0xCE, 0xD6, 0xEE, 0xCD, 0x97, 0xCA, + 0x8D, 0xC5, 0x0C, 0xBF, 0x9C, 0xC3, 0x1E, 0xB8, 0xDF, 0xC1, 0xBD, 0xB2, + 0x0D, 0xC5, 0x10, 0xAC, 0x63, 0xC9, 0x26, 0xAA, 0xD8, 0xCF, 0xF9, 0xB1, + 0xC7, 0xD7, 0x11, 0xBE, 0xF1, 0xE5, 0x03, 0xCC, 0x6B, 0xF8, 0xE3, 0xDC, + 0x2F, 0x02, 0x29, 0xEB, 0x41, 0x0A, 0xD2, 0xFC, 0x5B, 0x0B, 0xD8, 0x09, + 0xC2, 0x0C, 0xF5, 0x0A, 0x85, 0x20, 0x39, 0x12, 0xD2, 0x26, 0xB8, 0x16, + 0x98, 0x0D, 0x86, 0x0A, 0x5A, 0xF7, 0x4B, 0xFF, 0xE1, 0xE5, 0x2C, 0xF4, + 0xEF, 0xCA, 0xB4, 0xE2, 0xA7, 0xB0, 0xEC, 0xD0, 0x09, 0xA5, 0x18, 0xC5, + 0xE1, 0xAF, 0xAF, 0xCA, 0x32, 0xD2, 0x8E, 0xE8, 0xDA, 0x00, 0x32, 0x0D, + 0xFA, 0x29, 0xB4, 0x28, 0x06, 0x42, 0x49, 0x3C, 0xF2, 0x51, 0x58, 0x46, + 0x41, 0x5A, 0x51, 0x43, 0x53, 0x51, 0xE5, 0x37, 0x4C, 0x3D, 0x80, 0x2A, + 0x64, 0x22, 0x38, 0x1A, 0xC7, 0x06, 0xA2, 0x09, 0x06, 0xF2, 0x4A, 0xFD, + 0x33, 0xED, 0x6E, 0xF9, 0xFA, 0xED, 0xED, 0xF6, 0xBA, 0xEF, 0x90, 0xF7, + 0x57, 0xF4, 0xEE, 0xFC, 0x70, 0xF8, 0x0A, 0xFF, 0x81, 0xFE, 0x54, 0x01, + 0x6D, 0x01, 0x81, 0x09, 0xF5, 0x07, 0x94, 0x1A, 0x2F, 0x18, 0x75, 0x2C, + 0x8C, 0x30, 0x9C, 0x3C, 0x0B, 0x44, 0x86, 0x49, 0x82, 0x49, 0x5D, 0x4F, + 0x9A, 0x4A, 0x98, 0x4E, 0xCA, 0x45, 0x59, 0x45, 0x6D, 0x30, 0xEC, 0x33, + 0x19, 0x17, 0xBE, 0x22, 0x5B, 0x11, 0xC5, 0x1E, 0x67, 0x0D, 0xBF, 0x1C, + 0x42, 0xFC, 0xE5, 0x0E, 0x27, 0xFA, 0xF4, 0x07, 0xC3, 0x02, 0x4C, 0x07, + 0x2A, 0x0A, 0x65, 0xFF, 0xB3, 0x14, 0xF3, 0xF5, 0x62, 0x1C, 0x7D, 0xF1, + 0xA0, 0x21, 0x72, 0xF8, 0x8C, 0x26, 0x6D, 0x08, 0x4E, 0x2D, 0x94, 0x17, + 0x19, 0x2C, 0xA9, 0x1A, 0xFE, 0x20, 0xF7, 0x17, 0x60, 0x1A, 0x1B, 0x1C, + 0xB5, 0x13, 0x0B, 0x1B, 0xA5, 0xFF, 0x61, 0x0B, 0x46, 0xEC, 0x44, 0xF6, + 0x56, 0xE4, 0x2D, 0xE5, 0x40, 0xCF, 0x9F, 0xD4, 0xC7, 0xB0, 0xCD, 0xC2, + 0xE0, 0xA2, 0x45, 0xB6, 0xBD, 0xA1, 0x57, 0xB3, 0x92, 0xB0, 0x52, 0xC4, + 0x21, 0xD2, 0xE7, 0xEB, 0xA6, 0xF4, 0xD4, 0x15, 0x19, 0x0D, 0x48, 0x2A, + 0x65, 0x22, 0x3D, 0x2B, 0x53, 0x2E, 0x56, 0x24, 0x0C, 0x20, 0xF7, 0x0F, + 0x50, 0xFE, 0x3E, 0xEC, 0x0A, 0xD8, 0x95, 0xC1, 0xB8, 0xC4, 0x83, 0xAD, + 0x40, 0xB9, 0xBD, 0xB1, 0x65, 0xA9, 0xD6, 0xB2, 0xE6, 0xA4, 0x8C, 0xAF, + 0x4D, 0xAB, 0xB2, 0xB3, 0x47, 0xAE, 0x87, 0xB7, 0xC7, 0xAB, 0xAA, 0xB3, + 0x84, 0xA9, 0x82, 0xAB, 0xFF, 0xB6, 0xEB, 0xA8, 0x03, 0xD8, 0xD1, 0xB4, + 0x34, 0xF6, 0x30, 0xC9, 0x3F, 0x0E, 0x1D, 0xDF, 0x1C, 0x17, 0xB5, 0xEB, + 0x7E, 0x0A, 0x16, 0xF1, 0xDD, 0xFF, 0x19, 0xFC, 0x78, 0xF1, 0x2B, 0xFB, + 0xC8, 0xD1, 0xA2, 0xDF, 0x95, 0xBC, 0x56, 0xC6, 0x6D, 0xB6, 0x59, 0xBC, + 0xA3, 0xB7, 0x04, 0xC0, 0xF1, 0xB2, 0x12, 0xC5, 0x83, 0xA5, 0xB4, 0xC4, + 0xE2, 0x9F, 0x5F, 0xC6, 0xAC, 0xA6, 0x8F, 0xCA, 0x37, 0xAE, 0xFD, 0xCB, + 0x8E, 0xB9, 0xB2, 0xCA, 0x52, 0xD3, 0xD3, 0xD2, 0x37, 0xE8, 0xCE, 0xE0, + 0xE7, 0xF6, 0x4C, 0xEE, 0x2E, 0xFA, 0x17, 0xF2, 0x30, 0xEA, 0x98, 0xEB, + 0xB3, 0xDD, 0xA4, 0xEA, 0xB0, 0xE1, 0x38, 0xEF, 0x5E, 0xE2, 0x78, 0xED, + 0xD0, 0xD8, 0x3A, 0xE8, 0xC0, 0xC9, 0x12, 0xDF, 0x38, 0xB0, 0xAE, 0xC4, + 0x9A, 0xA2, 0xA0, 0xA8, 0x7D, 0xAC, 0x49, 0xA5, 0xD7, 0xAF, 0xE9, 0xA8, + 0x59, 0xBD, 0x2C, 0xB1, 0xA0, 0xEA, 0xB2, 0xCF, 0x9F, 0x10, 0xFB, 0xF1, + 0xE1, 0x24, 0xB9, 0x10, 0xA5, 0x34, 0x25, 0x2A, 0xB3, 0x37, 0x3C, 0x31, + 0x38, 0x28, 0x08, 0x21, 0xAE, 0x1A, 0x41, 0x09, 0xB2, 0x0B, 0x7A, 0xF0, + 0xD7, 0xEE, 0x28, 0xD5, 0x74, 0xD6, 0x39, 0xC8, 0x15, 0xCC, 0x85, 0xC7, + 0x30, 0xC6, 0xCD, 0xC5, 0x2E, 0xC4, 0x31, 0xC9, 0x3D, 0xD1, 0x40, 0xD5, + 0x2F, 0xE1, 0x5A, 0xDB, 0x4D, 0xEA, 0x86, 0xD9, 0xA8, 0x00, 0x92, 0xE5, + 0xA6, 0x1D, 0xEF, 0xF5, 0x5E, 0x29, 0xF7, 0x00, 0x83, 0x2C, 0x81, 0x16, + 0x0A, 0x34, 0xE2, 0x2D, 0x45, 0x3B, 0x86, 0x42, 0xB9, 0x35, 0xFC, 0x52, + 0x92, 0x29, 0x85, 0x54, 0x00, 0x1B, 0x50, 0x41, 0x53, 0x05, 0x52, 0x21, + 0x77, 0xFC, 0xA3, 0x10, 0x7E, 0x01, 0xF6, 0x0F, 0x52, 0xFD, 0x7D, 0x03, + 0xEB, 0xF9, 0x55, 0xF3, 0x02, 0x07, 0x67, 0xFB, 0x45, 0x14, 0x70, 0x12, + 0xC7, 0x1A, 0x15, 0x1F, 0xF8, 0x28, 0xA7, 0x1F, 0xA9, 0x3B, 0x52, 0x23, + 0x75, 0x50, 0x5A, 0x34, 0xB2, 0x5D, 0xFA, 0x41, 0x1A, 0x59, 0x2D, 0x42, + 0xC3, 0x52, 0x0C, 0x40, 0x1F, 0x4B, 0x21, 0x3D, 0x7E, 0x44, 0x3D, 0x45, + 0x6C, 0x37, 0x38, 0x4D, 0x37, 0x26, 0xFE, 0x43, 0xB1, 0x28, 0x2D, 0x39, + 0xE9, 0x22, 0x3F, 0x28, 0xAE, 0x0D, 0x06, 0x11, 0x21, 0x06, 0x21, 0x03, + 0x3B, 0x05, 0x2B, 0xFD, 0xB6, 0x0A, 0x48, 0x07, 0xFE, 0x27, 0xAF, 0x28, + 0xDB, 0x50, 0x1D, 0x4C, 0x99, 0x64, 0xAB, 0x5B, 0x58, 0x63, 0x25, 0x5B, + 0xD5, 0x5A, 0xB5, 0x58, 0x8C, 0x4D, 0xFE, 0x53, 0x61, 0x3F, 0x0B, 0x4A, + 0xE2, 0x29, 0x65, 0x38, 0xBA, 0x18, 0x10, 0x27, 0xF5, 0x0F, 0xED, 0x16, + 0x19, 0x13, 0x0A, 0x0F, 0x39, 0x1D, 0x0F, 0x15, 0x9B, 0x23, 0x76, 0x1A, + 0x40, 0x2A, 0xE1, 0x20, 0x81, 0x2B, 0x5A, 0x2E, 0xD0, 0x22, 0xFD, 0x34, + 0xFA, 0x24, 0x0E, 0x34, 0xAF, 0x37, 0x11, 0x35, 0x19, 0x41, 0xF8, 0x31, + 0x14, 0x53, 0x22, 0x37, 0xBB, 0x67, 0x69, 0x47, 0xD1, 0x61, 0x0A, 0x54, + 0xFB, 0x5A, 0xE7, 0x5A, 0x20, 0x5F, 0x2B, 0x5F, 0x90, 0x4D, 0x98, 0x57, + 0xE4, 0x2E, 0x38, 0x46, 0x88, 0x1E, 0xEC, 0x35, 0xA2, 0x1B, 0x35, 0x2E, + 0xD9, 0x1A, 0xE6, 0x27, 0x9E, 0x13, 0xDC, 0x18, 0xA3, 0x07, 0x83, 0x0F, + 0x49, 0x04, 0x56, 0x0E, 0x90, 0x0B, 0xE5, 0x0D, 0xE0, 0x14, 0xB9, 0x0C, + 0x58, 0x28, 0xDB, 0x0A, 0xC8, 0x39, 0xE9, 0x0D, 0x8C, 0x45, 0x87, 0x19, + 0x74, 0x51, 0xAC, 0x26, 0x30, 0x51, 0xF1, 0x29, 0x24, 0x46, 0x7E, 0x22, + 0x83, 0x3E, 0xE1, 0x21, 0xC3, 0x35, 0x6A, 0x26, 0x36, 0x2B, 0x47, 0x1F, + 0x3E, 0x26, 0x70, 0x11, 0x56, 0x13, 0xB4, 0xFD, 0x95, 0xEE, 0xCB, 0xDD, + 0x61, 0xD2, 0x27, 0xBE, 0x23, 0xC6, 0x7C, 0xAF, 0x4C, 0xC9, 0xCF, 0xBA, + 0x0C, 0xE2, 0xF3, 0xDE, 0x28, 0x06, 0x52, 0x0A, 0x40, 0x33, 0xE7, 0x31, + 0xA2, 0x56, 0xEC, 0x4B, 0xAA, 0x5D, 0x73, 0x50, 0x02, 0x58, 0x2B, 0x4B, + 0xDD, 0x3E, 0x18, 0x3D, 0x8B, 0x0D, 0x20, 0x21, 0x15, 0xE5, 0x4E, 0x08, + 0x54, 0xCF, 0x60, 0xF8, 0x52, 0xC0, 0xDE, 0xEA, 0x53, 0xC2, 0x0A, 0xE4, + 0x06, 0xD3, 0x46, 0xE3, 0x08, 0xDF, 0x92, 0xE1, 0xD9, 0xE7, 0xF2, 0xE1, + 0xB3, 0xF9, 0x50, 0xE7, 0x1A, 0x0D, 0x46, 0xE9, 0x17, 0x16, 0x38, 0xEA, + 0x2E, 0x19, 0x8E, 0xF8, 0x9E, 0x1E, 0x15, 0x0E, 0x08, 0x21, 0x20, 0x17, + 0x4C, 0x24, 0x09, 0x1F, 0xC8, 0x2C, 0xE5, 0x31, 0xF9, 0x2A, 0x13, 0x41, + 0xFA, 0x22, 0xE8, 0x43, 0x2B, 0x12, 0x91, 0x34, 0x92, 0xF6, 0x47, 0x18, + 0xC8, 0xE6, 0x92, 0x06, 0xBC, 0xEA, 0xDD, 0x06, 0xB0, 0xF1, 0x46, 0x01, + 0x87, 0xED, 0x92, 0xED, 0x80, 0xF3, 0xE1, 0xE7, 0x59, 0x04, 0x31, 0xF3, + 0x08, 0x02, 0x3D, 0xF9, 0x3C, 0xFA, 0x97, 0xFD, 0x67, 0x01, 0x08, 0x0B, + 0xD9, 0x09, 0x9F, 0x1B, 0x48, 0x0E, 0x9E, 0x2C, 0x0B, 0x13, 0x19, 0x34, + 0x07, 0x13, 0x6E, 0x28, 0xD9, 0x13, 0x68, 0x1A, 0x47, 0x14, 0x8B, 0x0F, + 0x3B, 0x0E, 0x30, 0x08, 0x14, 0x07, 0x2D, 0x06, 0x0D, 0xEB, 0x0E, 0xF4, + 0x45, 0xCC, 0x9F, 0xDA, 0x0B, 0xC2, 0x41, 0xC7, 0x98, 0xB4, 0x3A, 0xB5, + 0x3C, 0xAA, 0x58, 0xAB, 0xF1, 0xB0, 0xC1, 0xB8, 0x98, 0xCA, 0x7A, 0xE2, + 0x6F, 0xEF, 0xC5, 0x0F, 0x29, 0x1D, 0x1A, 0x38, 0x64, 0x40, 0x8C, 0x4E, + 0x99, 0x41, 0xF9, 0x41, 0x13, 0x2F, 0x1B, 0x23, 0xBB, 0x0E, 0xE4, 0x01, + 0xA6, 0xE9, 0x4F, 0xE1, 0x59, 0xC7, 0xE7, 0xC3, 0xA7, 0xB2, 0xE8, 0xBB, + 0x96, 0xB0, 0xE7, 0xC0, 0x85, 0xA9, 0x0C, 0xBD, 0xA3, 0xA6, 0x0C, 0xC2, + 0xBF, 0xAF, 0xE5, 0xCA, 0x9D, 0xAF, 0x1E, 0xCA, 0x82, 0xAB, 0x1E, 0xCA, + 0xAB, 0xB0, 0xD6, 0xC3, 0xA6, 0xB8, 0x1E, 0xBB, 0x87, 0xC9, 0x7E, 0xC5, + 0x62, 0xE4, 0xC2, 0xDC, 0x74, 0xF4, 0xAD, 0xF2, 0xB5, 0xFC, 0x44, 0x09, + 0x45, 0x04, 0xFF, 0x15, 0xC9, 0x00, 0x2E, 0x10, 0x69, 0xF0, 0x5F, 0x04, + 0x56, 0xCC, 0x07, 0xEA, 0x39, 0xA8, 0x47, 0xC4, 0xF2, 0xA5, 0xB5, 0xB6, + 0xEE, 0xAF, 0x97, 0xBC, 0xFB, 0xAE, 0xBD, 0xBC, 0x53, 0xAB, 0x2D, 0xB9, + 0xCB, 0xA8, 0x0E, 0xBE, 0x70, 0xAE, 0x82, 0xC9, 0x9D, 0xBF, 0x87, 0xD4, + 0x84, 0xC3, 0x6A, 0xD6, 0x7C, 0xBF, 0x64, 0xD1, 0xA3, 0xCE, 0x46, 0xD6, + 0x35, 0xDD, 0x32, 0xDB, 0x60, 0xDE, 0x89, 0xD5, 0x9B, 0xDC, 0x80, 0xD2, + 0xFB, 0xD5, 0xB6, 0xD2, 0x16, 0xCB, 0xC4, 0xCE, 0xF6, 0xCA, 0xE7, 0xD0, + 0xA0, 0xD0, 0xAC, 0xD5, 0x33, 0xC5, 0xE4, 0xCB, 0x33, 0xAE, 0x22, 0xBB, + 0xE0, 0x9F, 0x38, 0xAE, 0x4F, 0x9E, 0x5A, 0xA5, 0x3D, 0xA0, 0x19, 0xA0, + 0xCA, 0xA6, 0xF9, 0xA3, 0xAE, 0xB9, 0x33, 0xB4, 0x7B, 0xD5, 0x90, 0xCF, + 0x2E, 0xF4, 0xF0, 0xF0, 0x06, 0x08, 0xF4, 0x05, 0x0F, 0x08, 0x34, 0x07, + 0x42, 0xF6, 0x74, 0xF5, 0x38, 0xDA, 0xEA, 0xDE, 0x2D, 0xBD, 0x83, 0xC9, + 0x67, 0xAA, 0xCB, 0xAD, 0xA7, 0xA3, 0x03, 0xA1, 0xC2, 0xA2, 0xA6, 0xA7, + 0x57, 0xA6, 0x7B, 0xAB, 0x50, 0xA8, 0x73, 0xAF, 0x12, 0xAB, 0xE6, 0xBB, + 0xEA, 0xB3, 0xA8, 0xC3, 0x8D, 0xB5, 0x7D, 0xB7, 0xAA, 0xB4, 0xC7, 0xA6, + 0xA1, 0xBE, 0x83, 0xA3, 0xBE, 0xCC, 0xF0, 0xA4, 0xE9, 0xDE, 0xCF, 0xB0, + 0xD5, 0xF4, 0xB4, 0xCC, 0x81, 0x06, 0x9E, 0xEC, 0xB7, 0x06, 0x7D, 0x03, + 0x3C, 0xFE, 0x3A, 0x11, 0x1D, 0xF3, 0x84, 0x10, 0xDC, 0xD4, 0xE0, 0xF4, + 0xFB, 0xAF, 0xC3, 0xCE, 0x1C, 0xAA, 0xE1, 0xBD, 0x63, 0xB8, 0x83, 0xBA, + 0x29, 0xBE, 0x41, 0xB5, 0x85, 0xC5, 0x6F, 0xB8, 0xAE, 0xC9, 0xA8, 0xC2, + 0x0C, 0xC9, 0xDD, 0xD1, 0xDA, 0xCA, 0xCE, 0xDE, 0x58, 0xCF, 0x86, 0xE1, + 0x7C, 0xDD, 0x0F, 0xE1, 0x18, 0xF2, 0x59, 0xE4, 0x17, 0x02, 0x26, 0xEC, + 0x0B, 0x0B, 0x7C, 0xF6, 0x30, 0x06, 0xEA, 0xF9, 0xAB, 0xFB, 0xB9, 0xF6, + 0xCF, 0xFC, 0x6A, 0xF6, 0xEC, 0x01, 0x11, 0xF6, 0xEE, 0xF9, 0x73, 0xEC, + 0xDA, 0xE8, 0xE0, 0xD7, 0x20, 0xD7, 0x6D, 0xBF, 0x22, 0xBA, 0x97, 0xAA, + 0xA5, 0xA4, 0xDB, 0xA0, 0xA8, 0xAA, 0x60, 0xA2, 0xD9, 0xC0, 0xEB, 0xB3, + 0x8D, 0xEA, 0xEA, 0xDF, 0x2B, 0x26, 0x65, 0x1A, 0x53, 0x51, 0x0B, 0x49, + 0xEF, 0x5E, 0xDE, 0x5E, 0x0A, 0x56, 0x25, 0x56, 0x82, 0x3B, 0xA9, 0x35, + 0x58, 0x16, 0x26, 0x0F, 0x3B, 0xF4, 0x5A, 0xEF, 0x51, 0xE6, 0x75, 0xDF, + 0x0F, 0xE3, 0xF7, 0xDF, 0xCF, 0xE6, 0x58, 0xEB, 0x87, 0xF4, 0x5A, 0xFE, + 0xD6, 0x00, 0x14, 0x0E, 0xEA, 0x00, 0xD5, 0x12, 0x93, 0xF9, 0x75, 0x17, + 0x3E, 0xF3, 0x0C, 0x13, 0xA4, 0xF4, 0xA8, 0xFD, 0x90, 0x04, 0xAE, 0xF0, + 0xCC, 0x1D, 0xFA, 0xFA, 0x2B, 0x36, 0x6C, 0x0D, 0x6B, 0x4B, 0xA6, 0x21, + 0xE6, 0x59, 0xA6, 0x35, 0x6D, 0x61, 0x45, 0x46, 0x67, 0x5D, 0x9E, 0x4A, + 0x23, 0x46, 0x5E, 0x3C, 0xB4, 0x2C, 0x6B, 0x29, 0x33, 0x0F, 0x01, 0x0E, + 0x3D, 0xFA, 0x8C, 0xF8, 0x4D, 0x04, 0x60, 0xFD, 0x82, 0x11, 0x6F, 0x01, + 0x2C, 0x0D, 0x61, 0xF6, 0xA0, 0x0D, 0x56, 0xFB, 0x57, 0x1C, 0xF0, 0x10, + 0x60, 0x23, 0x23, 0x17, 0xB5, 0x24, 0xEB, 0x13, 0x9E, 0x28, 0xA9, 0x15, + 0x98, 0x2F, 0x12, 0x1A, 0x2E, 0x3D, 0x56, 0x22, 0xE6, 0x44, 0x5D, 0x27, + 0xF8, 0x44, 0x57, 0x27, 0x8C, 0x45, 0xE7, 0x26, 0x1E, 0x43, 0xD4, 0x25, + 0xFB, 0x3E, 0x80, 0x27, 0xE3, 0x33, 0x2C, 0x28, 0x90, 0x16, 0x98, 0x1A, + 0x60, 0xF3, 0x4A, 0x02, 0x40, 0xDE, 0x2A, 0xF0, 0xDA, 0xD5, 0x29, 0xDF, + 0xFF, 0xD6, 0xB5, 0xD0, 0x87, 0xF5, 0xD3, 0xDE, 0x8E, 0x25, 0x46, 0x08, + 0x3E, 0x49, 0xAF, 0x37, 0x8D, 0x5D, 0xD1, 0x5B, 0xAC, 0x60, 0x34, 0x61, + 0x79, 0x5A, 0x14, 0x53, 0xDB, 0x4F, 0xC0, 0x43, 0x43, 0x39, 0x1C, 0x2D, + 0xBD, 0x17, 0x55, 0x11, 0xD1, 0x04, 0xE4, 0xFD, 0x7B, 0x05, 0xD7, 0xF7, + 0x25, 0x03, 0x17, 0xFA, 0x87, 0x06, 0x8D, 0x04, 0xD3, 0x12, 0x4B, 0x13, + 0x2C, 0x17, 0x44, 0x14, 0xCE, 0x18, 0x05, 0x0C, 0x5F, 0x1A, 0x02, 0x08, + 0x92, 0x1A, 0x2C, 0x02, 0x9F, 0x1C, 0xB3, 0xF8, 0x22, 0x21, 0x7B, 0xF9, + 0x7B, 0x33, 0x8C, 0x0C, 0x2D, 0x4D, 0x42, 0x23, 0x80, 0x5C, 0x4B, 0x3A, + 0x6D, 0x5F, 0x6E, 0x54, 0x55, 0x5A, 0x9C, 0x60, 0x6A, 0x50, 0x31, 0x59, + 0xDE, 0x3B, 0xAA, 0x45, 0x05, 0x19, 0xB9, 0x29, 0x8B, 0xFC, 0x13, 0x16, + 0xD5, 0xFB, 0xE1, 0x15, 0x31, 0x07, 0xCE, 0x17, 0x67, 0x0A, 0xF2, 0x12, + 0x5B, 0x0A, 0x2F, 0x0E, 0x46, 0x12, 0x62, 0x0E, 0x7A, 0x21, 0xE2, 0x10, + 0xD9, 0x29, 0x8E, 0x0F, 0xDB, 0x26, 0xCF, 0x0D, 0xA2, 0x2D, 0x45, 0x1B, + 0x27, 0x3F, 0x02, 0x33, 0x40, 0x46, 0xDE, 0x3B, 0x7A, 0x47, 0xFB, 0x36, + 0xD6, 0x47, 0xE9, 0x33, 0x2F, 0x44, 0xA2, 0x35, 0xE5, 0x3F, 0x0C, 0x30, + 0x77, 0x36, 0x5C, 0x24, 0x9C, 0x18, 0xAA, 0x14, 0x7F, 0xF4, 0xF0, 0xFA, + 0x93, 0xDC, 0xE2, 0xDD, 0xC0, 0xCA, 0x18, 0xC2, 0xB5, 0xBD, 0xA5, 0xB2, + 0xFC, 0xC6, 0xDB, 0xC0, 0xC1, 0xF5, 0x0C, 0xEB, 0xCF, 0x2E, 0x4B, 0x1F, + 0xF3, 0x50, 0x93, 0x49, 0x9E, 0x5B, 0x5B, 0x5E, 0xB4, 0x56, 0xB7, 0x5C, + 0x67, 0x44, 0xB9, 0x4C, 0x17, 0x28, 0x31, 0x34, 0xBF, 0x0A, 0xB4, 0x15, + 0xFD, 0xF4, 0x96, 0xFC, 0xE4, 0xE4, 0xE9, 0xEE, 0x63, 0xE4, 0x93, 0xEC, + 0xC4, 0xF0, 0x76, 0xED, 0x22, 0xF6, 0xF4, 0xEE, 0x6D, 0xF6, 0x72, 0xF5, + 0x6E, 0xF4, 0x76, 0xFE, 0x9C, 0xEC, 0x7E, 0x02, 0xC3, 0xE2, 0x77, 0xFF, + 0x5F, 0xE3, 0x72, 0x00, 0xBB, 0xF0, 0x53, 0x07, 0xA6, 0x00, 0x82, 0x0E, + 0x36, 0x16, 0xD5, 0x1B, 0x9C, 0x2B, 0x74, 0x2B, 0xFC, 0x36, 0x92, 0x39, + 0x09, 0x35, 0x84, 0x42, 0xDA, 0x28, 0xC0, 0x3D, 0x5F, 0x19, 0xAF, 0x2B, + 0x9D, 0xFF, 0xEB, 0x0E, 0x1F, 0xE5, 0xB9, 0xF6, 0x71, 0xDF, 0xC2, 0xF3, + 0x59, 0xEA, 0x65, 0xFC, 0xD1, 0xEA, 0x4E, 0xFF, 0x93, 0xE1, 0xAB, 0x05, + 0x44, 0xE1, 0x85, 0x0E, 0x4F, 0xEB, 0x97, 0x11, 0xE6, 0xF0, 0xE1, 0x0C, + 0xA4, 0xF0, 0x6F, 0x06, 0x2D, 0xF8, 0xD3, 0x0D, 0xA3, 0x02, 0x3A, 0x1C, + 0xD0, 0x0E, 0xE9, 0x22, 0xC1, 0x16, 0xBD, 0x22, 0xB8, 0x12, 0x94, 0x22, + 0x2C, 0x0F, 0x4C, 0x23, 0xA1, 0x09, 0x5A, 0x1D, 0x0E, 0xFC, 0xEA, 0x11, + 0xA1, 0xEA, 0x22, 0x03, 0x4C, 0xD6, 0x1C, 0xEF, 0x78, 0xBC, 0xE1, 0xD6, + 0x5A, 0xA9, 0x29, 0xBB, 0x2C, 0xA3, 0x17, 0xA4, 0xF2, 0xAB, 0x9C, 0xA2, + 0x88, 0xC8, 0xE5, 0xB9, 0x62, 0xF2, 0x86, 0xE3, 0x57, 0x21, 0xC8, 0x14, + 0x3C, 0x42, 0x44, 0x34, 0xB9, 0x51, 0xE1, 0x3D, 0x5B, 0x4B, 0xB4, 0x38, + 0xDE, 0x26, 0xB4, 0x24, 0x26, 0xF5, 0x87, 0x05, 0xB7, 0xCD, 0x31, 0xE9, + 0x7D, 0xB5, 0xC6, 0xD5, 0xAF, 0xAD, 0x2C, 0xCC, 0xF9, 0xB0, 0xB7, 0xD4, + 0xB0, 0xB0, 0xA3, 0xE3, 0x8C, 0xB4, 0x7B, 0xEF, 0x96, 0xBE, 0x1A, 0xFC, + 0x25, 0xC1, 0xE5, 0xFE, 0x47, 0xC2, 0xCD, 0xEF, 0xFF, 0xC9, 0x2E, 0xD7, + 0xEE, 0xD0, 0x48, 0xC0, 0x67, 0xDF, 0x5A, 0xBB, 0x0F, 0xF6, 0x36, 0xCB, + 0xB4, 0x06, 0xF7, 0xDE, 0x5A, 0x11, 0xCC, 0xF6, 0xF8, 0x12, 0x02, 0x12, + 0xA6, 0x08, 0x76, 0x1C, 0x5A, 0xF8, 0xAC, 0x11, 0x19, 0xDF, 0x6A, 0xFA, + 0xDE, 0xB9, 0x95, 0xD9, 0x78, 0xA5, 0x76, 0xC1, 0x4A, 0xB3, 0xF3, 0xC0, + 0xA8, 0xC6, 0xDB, 0xC3, 0x82, 0xCD, 0x83, 0xBC, 0xAD, 0xD7, 0xBA, 0xB8, + 0xFF, 0xE0, 0xEE, 0xBC, 0x54, 0xE1, 0x00, 0xC4, 0x24, 0xDE, 0x0D, 0xC9, + 0x0D, 0xD9, 0x8D, 0xCF, 0x4C, 0xDA, 0xC2, 0xDE, 0x27, 0xDE, 0xE4, 0xEF, + 0xAC, 0xDD, 0x96, 0xF8, 0x24, 0xDD, 0xBE, 0xF9, 0x09, 0xDB, 0x20, 0xF8, + 0x24, 0xD5, 0x31, 0xF7, 0x25, 0xD7, 0x86, 0xFB, 0x02, 0xD3, 0x58, 0xFA, + 0x2F, 0xC4, 0x4C, 0xF0, 0x45, 0xBB, 0x12, 0xDF, 0x73, 0xB1, 0xE2, 0xC2, + 0x2B, 0xA6, 0x0C, 0xA8, 0x73, 0xA3, 0xB1, 0x9D, 0xFA, 0xAA, 0x9A, 0xA1, + 0x39, 0xBF, 0x38, 0xB9, 0x9C, 0xE4, 0x81, 0xE7, 0x1B, 0x0E, 0xC0, 0x1A, + 0xB6, 0x26, 0x04, 0x3A, 0x62, 0x2E, 0xA2, 0x3C, 0x34, 0x24, 0xA2, 0x31, + 0x13, 0x02, 0x0D, 0x15, 0x71, 0xDA, 0x6F, 0xE4, 0x40, 0xC2, 0xA9, 0xBF, + 0xB2, 0xB5, 0x79, 0xB2, 0x80, 0xAE, 0xC7, 0xB1, 0x29, 0xB1, 0x71, 0xB8, + 0xD3, 0xBC, 0x91, 0xC2, 0x8F, 0xC8, 0xD7, 0xD0, 0x63, 0xD0, 0xAA, 0xDA, + 0xA2, 0xD7, 0x92, 0xDA, 0x30, 0xDE, 0x9C, 0xD5, 0x2F, 0xE2, 0xB8, 0xCD, + 0xCC, 0xE3, 0x93, 0xCB, 0xE6, 0xEA, 0xEE, 0xD8, 0xE8, 0xFE, 0x69, 0xF6, + 0x75, 0x12, 0xDD, 0x0F, 0x89, 0x21, 0xAB, 0x1D, 0x7E, 0x30, 0xC7, 0x2B, + 0x2B, 0x2B, 0x2C, 0x2A, 0x17, 0x16, 0xB0, 0x18, 0x86, 0x05, 0xF5, 0x06, + 0xF7, 0xEC, 0xBA, 0xEC, 0x98, 0xD7, 0x83, 0xD9, 0xAA, 0xDE, 0x9B, 0xE2, + 0xC6, 0xE7, 0xA6, 0xF0, 0x20, 0xE4, 0x52, 0xF4, 0x18, 0xEB, 0xB0, 0xFA, + 0x00, 0xF8, 0x15, 0x02, 0x9E, 0xFA, 0xEA, 0x02, 0xDC, 0xF7, 0x7E, 0xFB, + 0xD5, 0xFD, 0xEF, 0xF1, 0x09, 0x16, 0x92, 0xF3, 0xF0, 0x32, 0xB8, 0xFF, + 0x4B, 0x3C, 0x83, 0x0C, 0x89, 0x35, 0xBB, 0x15, 0xD7, 0x2D, 0xFA, 0x17, + 0xDE, 0x25, 0x91, 0x13, 0xFC, 0x19, 0x57, 0x0A, 0x60, 0x11, 0x23, 0x04, + 0x4B, 0x09, 0x8D, 0x00, 0xE5, 0xF5, 0xCD, 0xEF, 0xEB, 0xD9, 0xD1, 0xD3, + 0x46, 0xC0, 0xCB, 0xB9, 0xBD, 0xB4, 0xE5, 0xA9, 0x7B, 0xBE, 0xDB, 0xAD, + 0x20, 0xE4, 0x00, 0xD2, 0x8E, 0x1B, 0x6C, 0x0D, 0x18, 0x49, 0x6B, 0x42, + 0x26, 0x5D, 0x4C, 0x5C, 0x0E, 0x5E, 0xDB, 0x5A, 0xD5, 0x52, 0x0E, 0x46, + 0x58, 0x36, 0xA1, 0x1E, 0xBD, 0x12, 0xA0, 0xF7, 0x57, 0xF7, 0x07, 0xE5, + 0x28, 0xE6, 0x6A, 0xE3, 0x16, 0xE3, 0x11, 0xEC, 0xAC, 0xF1, 0xC8, 0xF6, + 0xA7, 0x08, 0x21, 0xFF, 0xE2, 0x14, 0x11, 0x04, 0x6E, 0x14, 0xB9, 0x04, + 0x35, 0x11, 0x3A, 0xFE, 0x89, 0x0D, 0x80, 0xEE, 0x5A, 0x0E, 0xBB, 0xE1, + 0xED, 0x1B, 0x70, 0xE0, 0xA2, 0x34, 0x1C, 0xEF, 0x92, 0x4F, 0x4D, 0x0F, + 0xB3, 0x5D, 0xC8, 0x2E, 0x25, 0x5D, 0x60, 0x45, 0x01, 0x5B, 0x52, 0x55, + 0xE0, 0x4C, 0x47, 0x54, 0x37, 0x31, 0xC8, 0x48, 0x44, 0x11, 0xC9, 0x33, + 0xD5, 0xF7, 0xF9, 0x12, 0xB6, 0xF6, 0xF2, 0xFF, 0x25, 0x0A, 0x89, 0x04, + 0xE3, 0x18, 0x3C, 0x0E, 0xD8, 0x19, 0xC1, 0x0D, 0x1B, 0x1B, 0x10, 0x0E, + 0x51, 0x25, 0x4F, 0x16, 0x3D, 0x27, 0xBC, 0x16, 0x3C, 0x1F, 0xFC, 0x14, + 0x33, 0x1C, 0x91, 0x17, 0xF8, 0x22, 0xC3, 0x1F, 0x3B, 0x31, 0x25, 0x30, + 0x93, 0x37, 0x3D, 0x3C, 0xDB, 0x39, 0x6A, 0x46, 0xAB, 0x3F, 0xF0, 0x4F, + 0x17, 0x42, 0x3E, 0x4A, 0x69, 0x3E, 0x82, 0x38, 0xDF, 0x35, 0x89, 0x23, + 0x18, 0x25, 0x61, 0x08, 0x0E, 0x0C, 0xA0, 0xE7, 0xB0, 0xEE, 0xD7, 0xC8, + 0x60, 0xDA, 0xAD, 0xB0, 0x3F, 0xDB, 0xDC, 0xA5, 0x7F, 0xF2, 0x21, 0xBA, + 0x01, 0x1A, 0xDD, 0xEC, 0x8C, 0x40, 0xD5, 0x25, 0xB7, 0x59, 0x66, 0x4E, + 0xAB, 0x60, 0xAC, 0x60, 0x2B, 0x59, 0x41, 0x62, 0xFB, 0x47, 0x54, 0x52, + 0xAB, 0x30, 0xA1, 0x31, 0xF3, 0x15, 0x81, 0x0F, 0xCC, 0x01, 0x44, 0xFE, + 0x67, 0xF9, 0xB9, 0xFA, 0x09, 0xFA, 0x52, 0xF9, 0x92, 0xFD, 0xED, 0xFA, + 0xBC, 0x00, 0x45, 0x00, 0x11, 0x06, 0xBA, 0x01, 0xBF, 0x05, 0xEB, 0xFB, + 0x72, 0x03, 0x34, 0xF8, 0x75, 0x03, 0xB3, 0xFC, 0x9C, 0x07, 0x6E, 0x07, + 0x3A, 0x0E, 0x8F, 0x0E, 0xF3, 0x21, 0xDF, 0x1B, 0xA1, 0x40, 0xBC, 0x35, + 0x57, 0x4F, 0xC3, 0x46, 0x78, 0x50, 0xB4, 0x4F, 0x72, 0x4D, 0xD6, 0x53, + 0x7D, 0x3C, 0x9D, 0x47, 0x36, 0x25, 0x38, 0x34, 0x1E, 0x11, 0xF0, 0x23, + 0xCF, 0xFD, 0x0D, 0x0C, 0xEB, 0xF8, 0xE6, 0xF2, 0x91, 0x09, 0x61, 0xF3, + 0xEF, 0x1D, 0xDF, 0x05, 0xB1, 0x1F, 0xA9, 0x0B, 0x69, 0x19, 0x8F, 0x0A, + 0x6F, 0x1B, 0x16, 0x14, 0xC0, 0x1C, 0xEB, 0x1B, 0xD6, 0x15, 0x79, 0x16, + 0xD2, 0x12, 0x92, 0x12, 0xBD, 0x1D, 0xEB, 0x1E, 0x04, 0x30, 0x6E, 0x32, + 0xDD, 0x38, 0x05, 0x3A, 0xDB, 0x34, 0x34, 0x35, 0xF8, 0x29, 0x29, 0x32, + 0xD7, 0x1A, 0x5A, 0x30, 0x33, 0x11, 0x25, 0x29, 0xAC, 0x06, 0x89, 0x1D, + 0x91, 0xFA, 0x88, 0x17, 0x71, 0xED, 0x62, 0x10, 0x41, 0xD7, 0xB9, 0xF8, + 0xDA, 0xC2, 0x3B, 0xDE, 0x51, 0xB4, 0xBE, 0xC8, 0x14, 0xB5, 0xB8, 0xC0, + 0x11, 0xD9, 0x7A, 0xD9, 0xAA, 0x0F, 0x4D, 0x03, 0x67, 0x43, 0xEA, 0x2C, + 0x44, 0x62, 0x9D, 0x4E, 0xF5, 0x63, 0xFB, 0x5C, 0xAF, 0x52, 0xFA, 0x55, + 0x95, 0x2F, 0x93, 0x36, 0xA4, 0x0A, 0xD7, 0x0E, 0xD6, 0xF3, 0xC9, 0xF6, + 0x2E, 0xE5, 0xA3, 0xE9, 0xDD, 0xDD, 0xE0, 0xE1, 0x13, 0xDE, 0x92, 0xE8, + 0x8B, 0xDC, 0x25, 0xFA, 0x7A, 0xD9, 0x0C, 0x07, 0x8A, 0xDF, 0x58, 0x07, + 0x43, 0xEE, 0xCA, 0x01, 0xA5, 0xFB, 0x7D, 0xFB, 0xF1, 0x02, 0xFA, 0xF1, + 0x1B, 0x04, 0x94, 0xEB, 0x88, 0x04, 0x44, 0xF2, 0x71, 0x0C, 0xFE, 0x07, + 0x6C, 0x18, 0x13, 0x22, 0x6D, 0x1F, 0xDB, 0x31, 0x14, 0x20, 0x62, 0x3A, + 0x6C, 0x19, 0x4B, 0x3E, 0x49, 0x0C, 0xF0, 0x34, 0xF5, 0x01, 0xE8, 0x23, + 0xF4, 0xF3, 0x64, 0x0B, 0xA4, 0xDF, 0x6F, 0xEE, 0x01, 0xE3, 0x98, 0xE6, + 0x5E, 0xF7, 0xDC, 0xEF, 0x4E, 0xFE, 0x9D, 0xF2, 0xBD, 0xF9, 0x84, 0xED, + 0x42, 0xF8, 0x2C, 0xED, 0x09, 0xFF, 0x3B, 0xF4, 0xF6, 0xFD, 0xFB, 0xF0, + 0xD8, 0xF0, 0xB2, 0xE9, 0x3A, 0xEB, 0xF8, 0xF4, 0xFA, 0xF4, 0x45, 0x10, + 0xCE, 0xFA, 0xA2, 0x21, 0xB1, 0xF3, 0x6D, 0x22, 0x5A, 0xF0, 0x79, 0x26, + 0x27, 0xF2, 0x84, 0x27, 0x7F, 0xF0, 0xD6, 0x17, 0xF3, 0xF0, 0x5F, 0x02, + 0x19, 0xED, 0xCF, 0xF0, 0x38, 0xDE, 0x32, 0xE2, 0xF2, 0xCE, 0x16, 0xD1, + 0xB5, 0xB9, 0xD1, 0xB4, 0x78, 0xA2, 0xDE, 0x9E, 0xDD, 0x9C, 0x2E, 0xA4, + 0x87, 0xA8, 0xEC, 0xBA, 0xC0, 0xCB, 0x5D, 0xE0, 0x99, 0x03, 0xC3, 0x11, + 0x85, 0x31, 0x7F, 0x38, 0xBE, 0x47, 0xD0, 0x4B, 0x7F, 0x46, 0x50, 0x4C, + 0x27, 0x2B, 0x30, 0x34, 0xAB, 0xFE, 0x22, 0x0B, 0xB8, 0xDC, 0x29, 0xE8, + 0x13, 0xD1, 0xA3, 0xD8, 0x71, 0xC9, 0x4C, 0xD5, 0x31, 0xC4, 0x6D, 0xD8, + 0x32, 0xC6, 0xF9, 0xDD, 0xE2, 0xC8, 0x3F, 0xE1, 0x18, 0xCC, 0x79, 0xE4, + 0x74, 0xCE, 0x0C, 0xE5, 0xC5, 0xD2, 0xA9, 0xE3, 0x27, 0xDB, 0xC3, 0xE4, + 0x94, 0xE2, 0xE8, 0xE9, 0x9E, 0xE5, 0x37, 0xF2, 0x24, 0xEC, 0x11, 0xFF, + 0x9C, 0xFB, 0x9F, 0x0B, 0xE2, 0x08, 0x01, 0x11, 0x39, 0x13, 0xFB, 0x19, + 0x35, 0x15, 0x0C, 0x24, 0xDE, 0x09, 0x40, 0x25, 0x01, 0xFF, 0x3B, 0x1D, + 0xA8, 0xF0, 0x4F, 0x07, 0xA9, 0xD7, 0x6F, 0xEC, 0xC4, 0xC7, 0x34, 0xE4, + 0x19, 0xD0, 0x70, 0xF2, 0x6C, 0xD8, 0xDD, 0xF9, 0xE9, 0xD3, 0xB3, 0xF1, + 0xE3, 0xD3, 0x24, 0xEA, 0x28, 0xD9, 0xA3, 0xE3, 0x49, 0xDB, 0x1D, 0xE0, + 0x31, 0xD5, 0xD7, 0xDD, 0x14, 0xD2, 0x4B, 0xE0, 0x0A, 0xE1, 0x1C, 0xEF, + 0x4A, 0xF8, 0xB1, 0x00, 0x65, 0x06, 0x9E, 0x0B, 0x77, 0x06, 0x7F, 0x08, + 0xC6, 0x01, 0x44, 0xFC, 0xD6, 0xFD, 0x2A, 0xF3, 0x24, 0xF7, 0x54, 0xED, + 0x8F, 0xEE, 0xB8, 0xE7, 0xFA, 0xE1, 0xAE, 0xDF, 0x88, 0xCD, 0x76, 0xD3, + 0x6F, 0xB4, 0xBB, 0xBF, 0x97, 0xA2, 0x59, 0xAB, 0xD7, 0x9C, 0x1C, 0xA2, + 0x7B, 0xA5, 0x83, 0xA5, 0x87, 0xC8, 0x22, 0xBB, 0x1F, 0x00, 0x49, 0xE3, + 0x90, 0x30, 0x26, 0x0E, 0x7C, 0x46, 0x87, 0x2E, 0xD7, 0x43, 0x7D, 0x3F, + 0x0C, 0x2A, 0x88, 0x36, 0xD7, 0xFE, 0xE8, 0x12, 0xF6, 0xDA, 0xE6, 0xEB, + 0x3D, 0xC9, 0x29, 0xD3, 0x47, 0xBF, 0xC7, 0xC6, 0x64, 0xBB, 0x29, 0xC3, + 0x13, 0xC4, 0x9B, 0xC4, 0x61, 0xD4, 0x4E, 0xCA, 0x2F, 0xDC, 0x0A, 0xD6, + 0x6D, 0xD7, 0x81, 0xE1, 0xAD, 0xD0, 0xFC, 0xE4, 0x0A, 0xCF, 0xDE, 0xE3, + 0x97, 0xD2, 0xD1, 0xE2, 0x00, 0xD9, 0x8C, 0xDF, 0xC7, 0xE5, 0xA4, 0xDD, + 0x3D, 0xFD, 0xB6, 0xE6, 0x60, 0x14, 0x53, 0xF4, 0x08, 0x20, 0x72, 0xFC, + 0xAC, 0x24, 0xC2, 0x08, 0xCE, 0x1E, 0x0F, 0x16, 0x27, 0x0A, 0x8A, 0x13, + 0xEA, 0xF7, 0xD2, 0x02, 0xBB, 0xE9, 0x47, 0xE6, 0x86, 0xDA, 0xFB, 0xC8, + 0x0C, 0xDC, 0x15, 0xC3, 0xA0, 0xEA, 0xD9, 0xCC, 0x9B, 0xEC, 0xF6, 0xCD, + 0x01, 0xE1, 0xA1, 0xC5, 0x20, 0xDD, 0x11, 0xC6, 0x1A, 0xE1, 0x34, 0xD0, + 0x99, 0xDB, 0x93, 0xD3, 0x1F, 0xD8, 0xCB, 0xD6, 0xEA, 0xE4, 0x35, 0xE4, + 0x18, 0xFB, 0x7A, 0xF8, 0xBC, 0x0D, 0x11, 0x06, 0xE3, 0x12, 0x48, 0x01, + 0x1B, 0x0F, 0x39, 0xF6, 0x02, 0x09, 0xA7, 0xF1, 0xB7, 0x02, 0x2D, 0xF0, + 0x1F, 0xFB, 0x7E, 0xE8, 0xC7, 0xEF, 0x12, 0xDD, 0xC7, 0xDB, 0xE5, 0xD2, + 0x4F, 0xC4, 0xC8, 0xC7, 0xF3, 0xAF, 0x88, 0xB4, 0x04, 0xA2, 0x3F, 0x9F, + 0x22, 0xA7, 0x75, 0x9F, 0xE4, 0xC4, 0x49, 0xBB, 0xCF, 0xF5, 0x77, 0xE8, + 0xD6, 0x2A, 0x66, 0x1A, 0x62, 0x50, 0xB5, 0x40, 0x6F, 0x5C, 0x1F, 0x50, + 0xB3, 0x4D, 0x0D, 0x45, 0xBE, 0x2D, 0x66, 0x23, 0x77, 0x0A, 0x55, 0xF5, + 0x52, 0xEF, 0xC7, 0xCB, 0x16, 0xDF, 0xAD, 0xB3, 0xDC, 0xD2, 0x82, 0xAA, + 0x72, 0xCD, 0xC2, 0xB0, 0xB4, 0xD0, 0x79, 0xC4, 0x09, 0xD4, 0x2D, 0xD7, + 0x62, 0xD4, 0xA0, 0xDE, 0xCA, 0xD8, 0xCC, 0xE1, 0x9D, 0xE5, 0x0E, 0xEB, + 0x0D, 0xF1, 0xA3, 0xF0, 0xE1, 0xF6, 0x43, 0xEA, 0xDE, 0xFC, 0x4F, 0xE4, + 0xA6, 0x07, 0xCA, 0xEE, 0x20, 0x1C, 0x4A, 0x09, 0x04, 0x2F, 0xB3, 0x1B, + 0xD2, 0x36, 0xF7, 0x1E, 0x93, 0x38, 0x97, 0x23, 0x0B, 0x2E, 0x7D, 0x22, + 0x08, 0x19, 0x05, 0x14, 0x3C, 0x05, 0x0B, 0x02, 0x73, 0xEE, 0xA9, 0xEA, + 0x84, 0xE3, 0x6B, 0xDA, 0x31, 0xF7, 0x5C, 0xE3, 0x8D, 0x0E, 0x41, 0xF1, + 0xA6, 0x0D, 0x12, 0xF0, 0x5A, 0xFF, 0x6E, 0xEB, 0x76, 0xF9, 0x42, 0xF1, + 0xCF, 0x00, 0xDF, 0xFC, 0x48, 0x06, 0xB1, 0xFE, 0x5C, 0x09, 0x92, 0x00, + 0x2A, 0x18, 0x35, 0x16, 0xBD, 0x2A, 0x2A, 0x2F, 0x63, 0x2E, 0xA4, 0x31, + 0x99, 0x22, 0xB9, 0x23, 0xEF, 0x18, 0xD7, 0x1B, 0x04, 0x16, 0xBA, 0x16, + 0x93, 0x13, 0xDE, 0x09, 0x79, 0x0F, 0x9F, 0xFD, 0xD9, 0x04, 0xA9, 0xF4, + 0x07, 0xF4, 0x2B, 0xE7, 0x9C, 0xE0, 0x7D, 0xD1, 0xC4, 0xCD, 0x17, 0xBB, + 0x92, 0xC6, 0x9B, 0xB3, 0xB0, 0xD4, 0xA4, 0xC4, 0x9B, 0xF9, 0x6F, 0xF0, + 0x55, 0x26, 0xD9, 0x26, 0x4E, 0x47, 0xD6, 0x4E, 0x7B, 0x58, 0xD7, 0x5F, + 0x92, 0x5D, 0x85, 0x5E, 0xFA, 0x55, 0x9F, 0x4D, 0x56, 0x41, 0xD5, 0x2F, + 0x86, 0x23, 0x63, 0x0C, 0x2A, 0x0A, 0xE8, 0xEF, 0x31, 0xFF, 0x5D, 0xE3, + 0xC5, 0xF7, 0xF9, 0xE0, 0x4A, 0xF0, 0xA5, 0xE7, 0x43, 0xF0, 0xF6, 0xF7, + 0x6D, 0xFA, 0x62, 0x0B, 0x91, 0x04, 0x39, 0x16, 0x62, 0x0B, 0x91, 0x1A, + 0x5E, 0x14, 0x2D, 0x20, 0xA8, 0x16, 0x0D, 0x1B, 0x62, 0x12, 0x3F, 0x0E, + 0x82, 0x14, 0x31, 0x0C, 0x3B, 0x26, 0x88, 0x17, 0x1E, 0x43, 0x98, 0x26, + 0x02, 0x58, 0xB7, 0x30, 0x1C, 0x5F, 0x4B, 0x39, 0x09, 0x59, 0xBE, 0x3D, + 0x79, 0x45, 0x19, 0x37, 0x2D, 0x2C, 0x45, 0x29, 0xF1, 0x0C, 0x62, 0x15, + 0x69, 0xF1, 0xE5, 0x05, 0xA6, 0xEF, 0xE0, 0x0C, 0x3D, 0x01, 0x13, 0x21, + 0xA2, 0x0F, 0x19, 0x2B, 0x6F, 0x0D, 0x0F, 0x23, 0x30, 0x06, 0x7B, 0x19, + 0xFB, 0x0F, 0x50, 0x1D, 0x49, 0x20, 0x03, 0x20, 0x24, 0x22, 0x13, 0x17, + 0x40, 0x22, 0x31, 0x16, 0x96, 0x31, 0x65, 0x26, 0xFD, 0x41, 0x2F, 0x34, + 0x0A, 0x42, 0x55, 0x33, 0xE4, 0x37, 0x72, 0x2C, 0x14, 0x31, 0x77, 0x2C, + 0xCE, 0x2A, 0x6E, 0x33, 0x68, 0x1B, 0x67, 0x35, 0x16, 0x03, 0xE0, 0x2A, + 0xA1, 0xEB, 0x29, 0x16, 0x89, 0xD9, 0x20, 0xF9, 0xD2, 0xC8, 0x46, 0xD7, + 0x3D, 0xC1, 0x18, 0xBF, 0xDD, 0xCE, 0x64, 0xBE, 0x78, 0xF1, 0x22, 0xDA, + 0x64, 0x1F, 0xD4, 0x0B, 0xD8, 0x47, 0x0F, 0x3C, 0x16, 0x5F, 0xD1, 0x59, + 0x2E, 0x62, 0x5B, 0x61, 0x49, 0x56, 0x09, 0x53, 0xF0, 0x40, 0x3E, 0x37, + 0x16, 0x22, 0x52, 0x19, 0x8E, 0x00, 0x24, 0x05, 0x42, 0xE8, 0x2C, 0x00, + 0x25, 0xDA, 0xF0, 0x02, 0x7C, 0xD4, 0x8A, 0x09, 0x8A, 0xD9, 0xEE, 0x13, + 0xAA, 0xE5, 0x9B, 0x1C, 0x18, 0xEE, 0xC3, 0x1F, 0x70, 0xED, 0x6E, 0x19, + 0xD2, 0xF2, 0x3D, 0x0B, 0x0E, 0x04, 0x58, 0xFD, 0xFE, 0x11, 0x89, 0xF2, + 0x72, 0x1D, 0x5A, 0xF5, 0xF2, 0x2F, 0x71, 0x0D, 0xD2, 0x40, 0x26, 0x29, + 0x28, 0x47, 0x39, 0x3E, 0x08, 0x42, 0x4B, 0x4C, 0x13, 0x34, 0xC3, 0x4E, + 0x1F, 0x25, 0x16, 0x46, 0x7B, 0x17, 0x08, 0x35, 0x1C, 0x05, 0x21, 0x1C, + 0x17, 0xF2, 0x81, 0x02, 0xD8, 0xEB, 0x95, 0xF7, 0x23, 0xF5, 0x83, 0xFC, + 0x5A, 0x00, 0x7F, 0x01, 0x7E, 0x03, 0xC6, 0xFE, 0x50, 0x02, 0x04, 0xFD, + 0x83, 0x07, 0xE0, 0x05, 0xD6, 0x0E, 0x20, 0x0E, 0xC6, 0x0F, 0x18, 0x0F, + 0xFA, 0x10, 0x4D, 0x13, 0x88, 0x18, 0xE1, 0x1F, 0x55, 0x26, 0xBC, 0x33, + 0x6E, 0x29, 0x46, 0x42, 0x40, 0x1F, 0x20, 0x45, 0x74, 0x17, 0x18, 0x42, + 0x97, 0x10, 0x72, 0x3A, 0x80, 0x03, 0x69, 0x2E, 0xFF, 0xF0, 0xBB, 0x1C, + 0xAC, 0xE0, 0x8E, 0x03, 0xBC, 0xD1, 0x06, 0xE4, 0xCE, 0xC0, 0x99, 0xC0, + 0x25, 0xB7, 0x22, 0xA8, 0x73, 0xBB, 0xC8, 0xAA, 0xBC, 0xD3, 0x6F, 0xC8, + 0x7C, 0xFC, 0xC4, 0xF5, 0x00, 0x28, 0xEB, 0x24, 0x98, 0x4C, 0x13, 0x4C, + 0x64, 0x5C, 0x9B, 0x60, 0xF0, 0x50, 0x18, 0x5C, 0x42, 0x35, 0xD6, 0x43, + 0x01, 0x15, 0x46, 0x21, 0x89, 0xF7, 0xF1, 0xFE, 0xA2, 0xE3, 0x6F, 0xE7, + 0xC0, 0xD6, 0x09, 0xDB, 0x04, 0xD0, 0x43, 0xD5, 0x98, 0xD3, 0x32, 0xDB, + 0xAB, 0xDB, 0xD9, 0xE8, 0x1C, 0xDF, 0x91, 0xEF, 0x75, 0xE0, 0xAF, 0xEF, + 0xBF, 0xE9, 0x0E, 0xF1, 0x50, 0xF5, 0x09, 0xF0, 0x46, 0xFA, 0x48, 0xF0, + 0x25, 0xF8, 0xBD, 0xF6, 0xD5, 0xF8, 0x71, 0x01, 0x1C, 0x08, 0x0B, 0x16, + 0x4D, 0x1B, 0xBB, 0x28, 0x94, 0x2B, 0x00, 0x2C, 0x5B, 0x35, 0x9D, 0x27, + 0x9D, 0x2A, 0xE7, 0x1D, 0x0D, 0x13, 0xB7, 0x11, 0xB0, 0xFA, 0x27, 0x05, + 0x3C, 0xDF, 0x0B, 0xF4, 0xA2, 0xCC, 0x9B, 0xEA, 0x3F, 0xCB, 0x15, 0xF0, + 0x9B, 0xD1, 0x7D, 0xF8, 0xD8, 0xD6, 0x40, 0xF7, 0xD6, 0xDA, 0x06, 0xEC, + 0x09, 0xE1, 0x6D, 0xE2, 0xAC, 0xE5, 0xAD, 0xDD, 0xDD, 0xE7, 0x85, 0xD9, + 0xE7, 0xED, 0xC4, 0xDB, 0x6D, 0xFB, 0x70, 0xE9, 0xE7, 0x07, 0x6D, 0xFE, + 0x7A, 0x07, 0xBA, 0x0D, 0x11, 0x01, 0xAE, 0x0F, 0xD4, 0xFE, 0x4C, 0x0D, + 0x67, 0xF8, 0x9B, 0x06, 0x30, 0xEB, 0x19, 0xF7, 0xA9, 0xE3, 0x87, 0xE9, + 0x68, 0xE1, 0xC4, 0xE1, 0xB5, 0xD7, 0x16, 0xD6, 0x30, 0xBE, 0x58, 0xBE, + 0x5E, 0xA6, 0xC9, 0xA3, 0xCD, 0xA5, 0x01, 0x9B, 0xA0, 0xB2, 0x35, 0xA7, + 0xAD, 0xCC, 0xBE, 0xC4, 0x1A, 0xF8, 0xEA, 0xED, 0x02, 0x20, 0xC6, 0x16, + 0xAB, 0x33, 0x8E, 0x32, 0x21, 0x36, 0x90, 0x38, 0x85, 0x27, 0xF6, 0x25, + 0x67, 0x08, 0x02, 0x00, 0x38, 0xEA, 0xDB, 0xD6, 0x7E, 0xD8, 0xCB, 0xBF, + 0xFC, 0xCD, 0x91, 0xBC, 0xC5, 0xC2, 0x8B, 0xBC, 0x03, 0xBD, 0x36, 0xB8, + 0xDF, 0xBF, 0x1D, 0xB1, 0x47, 0xC6, 0xAA, 0xAD, 0x7F, 0xCF, 0x97, 0xAF, + 0x01, 0xD2, 0x6F, 0xB2, 0x23, 0xCD, 0x53, 0xB7, 0x6B, 0xCC, 0x4A, 0xC4, + 0x65, 0xCF, 0x9C, 0xD4, 0xEF, 0xD2, 0xA6, 0xDE, 0x7F, 0xE0, 0x89, 0xEA, + 0xF9, 0xF4, 0x77, 0xFE, 0x2F, 0x05, 0x31, 0x0F, 0x47, 0x11, 0x8B, 0x17, + 0xF7, 0x0E, 0x79, 0x16, 0x02, 0xF8, 0x81, 0x05, 0x37, 0xE4, 0x9A, 0xF0, + 0x2D, 0xD9, 0xFE, 0xDF, 0xC5, 0xC9, 0xFD, 0xD1, 0xCC, 0xC3, 0xB4, 0xD2, + 0x9F, 0xD1, 0xFB, 0xE1, 0x4F, 0xDC, 0x1A, 0xEE, 0x92, 0xD5, 0x94, 0xED, + 0xF7, 0xC6, 0x94, 0xE2, 0x7D, 0xC0, 0x6A, 0xDA, 0xB9, 0xC6, 0xD6, 0xDC, + 0xC7, 0xCB, 0xAC, 0xE0, 0xEC, 0xD6, 0x30, 0xE8, 0x77, 0xF3, 0x57, 0xFB, + 0x3F, 0x0F, 0xF9, 0x0A, 0x86, 0x15, 0x53, 0x06, 0x68, 0x11, 0x77, 0xF9, + 0xCE, 0x0C, 0x10, 0xF2, 0x43, 0x00, 0x5F, 0xEB, 0xDD, 0xF3, 0x31, 0xE4, + 0x13, 0xEB, 0x43, 0xE0, 0x8D, 0xDE, 0x2D, 0xDA, 0x11, 0xCD, 0xA9, 0xC9, + 0xC1, 0xB6, 0x88, 0xB2, 0xCC, 0xA2, 0xAE, 0xA1, 0x81, 0x9E, 0x75, 0x9E, + 0xF0, 0xAF, 0xD6, 0xAC, 0xE4, 0xDC, 0xFC, 0xCD, 0x0D, 0x19, 0xD3, 0xF7, + 0x9C, 0x43, 0x7F, 0x1E, 0xF3, 0x4E, 0xD2, 0x32, 0x7F, 0x48, 0xC5, 0x31, + 0xDC, 0x34, 0x69, 0x27, 0x3D, 0x10, 0xA5, 0x11, 0x64, 0xED, 0x46, 0xF3, + 0xE1, 0xDE, 0x14, 0xDD, 0x59, 0xD8, 0x23, 0xD0, 0x5C, 0xD1, 0x54, 0xC8, + 0x28, 0xCD, 0x5E, 0xC9, 0x3C, 0xC9, 0xC2, 0xD4, 0x64, 0xC6, 0x6F, 0xE2, + 0x26, 0xC4, 0x0E, 0xE8, 0xE7, 0xC5, 0xDE, 0xEA, 0xE2, 0xCF, 0xF8, 0xEE, + 0x8C, 0xDF, 0x63, 0xEE, 0xE6, 0xF1, 0x3E, 0xEB, 0x66, 0x0D, 0x55, 0xF3, + 0x40, 0x31, 0xB2, 0x09, 0xF9, 0x49, 0x77, 0x1C, 0xEC, 0x4E, 0x02, 0x23, + 0xA4, 0x46, 0xB9, 0x21, 0x79, 0x2F, 0x1B, 0x11, 0x96, 0x13, 0xCF, 0xF6, + 0xF6, 0xFE, 0xB5, 0xE5, 0x10, 0xEA, 0x05, 0xDD, 0x2E, 0xDD, 0xB0, 0xDD, + 0xEE, 0xE5, 0xF2, 0xEF, 0x41, 0xFC, 0x58, 0x08, 0x11, 0x09, 0x49, 0x0D, + 0xE6, 0x01, 0xE7, 0xFC, 0x58, 0xF7, 0x33, 0xED, 0x1D, 0xF6, 0x23, 0xEC, + 0xCB, 0xF3, 0x69, 0xF0, 0xC9, 0xF2, 0x68, 0xF2, 0x42, 0x03, 0x26, 0x00, + 0xD1, 0x1A, 0x16, 0x17, 0xCB, 0x28, 0xDB, 0x22, 0xAA, 0x2A, 0xC8, 0x1F, + 0x10, 0x25, 0x64, 0x17, 0xCA, 0x1B, 0xAC, 0x11, 0x3E, 0x0F, 0xD0, 0x0E, + 0x3B, 0xFE, 0x64, 0x05, 0x0D, 0xEC, 0xEF, 0xF0, 0xBD, 0xDD, 0x8C, 0xD7, + 0x12, 0xCA, 0xE6, 0xBD, 0xBB, 0xB0, 0x90, 0xAE, 0xB5, 0xA3, 0xEA, 0xAD, + 0x75, 0xB1, 0x49, 0xB7, 0xB4, 0xDA, 0xCA, 0xD3, 0xCA, 0x0F, 0xD8, 0x03, + 0x14, 0x3D, 0x3B, 0x31, 0x41, 0x52, 0xE6, 0x44, 0xD8, 0x51, 0x8D, 0x3F, + 0x7E, 0x4C, 0x1E, 0x32, 0x0C, 0x3F, 0xEC, 0x1F, 0x72, 0x29, 0xE6, 0x09, + 0x3F, 0x14, 0x1D, 0xF9, 0x4B, 0x02, 0x47, 0xF2, 0xB5, 0xF4, 0x85, 0xEE, + 0x62, 0xEB, 0xE7, 0xE7, 0xB3, 0xE3, 0xF1, 0xE2, 0xAE, 0xDA, 0x69, 0xE2, + 0xA9, 0xD1, 0xD9, 0xE4, 0xCA, 0xCF, 0xDA, 0xEE, 0x7E, 0xD8, 0x22, 0x01, + 0x6C, 0xE3, 0xE9, 0x11, 0x32, 0xED, 0xE6, 0x19, 0x12, 0xFD, 0xEE, 0x1F, + 0x58, 0x1C, 0x40, 0x2B, 0xA1, 0x3B, 0xB5, 0x2F, 0x88, 0x49, 0xF3, 0x2A, + 0x84, 0x49, 0xE0, 0x25, 0xB8, 0x41, 0xCF, 0x1D, 0xF7, 0x36, 0xFD, 0x0E, + 0x0F, 0x29, 0xEA, 0xFF, 0x4B, 0x13, 0x9A, 0xF7, 0x12, 0xFE, 0xC2, 0xF6, + 0xF4, 0xF9, 0x77, 0xFD, 0x86, 0xFF, 0xD8, 0x07, 0x8B, 0xFD, 0x24, 0x0A, + 0x5D, 0xF6, 0x26, 0x02, 0x5D, 0xED, 0x6E, 0xFC, 0x58, 0xE7, 0x1C, 0xFE, + 0xFA, 0xEC, 0xA9, 0xFF, 0xA5, 0xF9, 0xD6, 0xFE, 0x21, 0x0C, 0xC3, 0x05, + 0x58, 0x24, 0x19, 0x17, 0x8B, 0x36, 0x83, 0x23, 0x22, 0x39, 0xC3, 0x1D, + 0xE0, 0x3A, 0x67, 0x12, 0x4E, 0x41, 0x09, 0x12, 0xA6, 0x3D, 0xDB, 0x12, + 0x1D, 0x2E, 0x13, 0x0D, 0xEC, 0x13, 0x99, 0x07, 0x18, 0xF3, 0x46, 0x03, + 0x80, 0xD0, 0x7C, 0xF8, 0xF2, 0xB1, 0xE0, 0xE4, 0x62, 0xA0, 0x5A, 0xD1, + 0x12, 0xA9, 0x5A, 0xCB, 0xFE, 0xCD, 0xA1, 0xD5, 0x54, 0xFE, 0xBC, 0xED, + 0x6C, 0x29, 0xB9, 0x0B, 0xA5, 0x49, 0x38, 0x25, 0x87, 0x5D, 0xB2, 0x3B, + 0x91, 0x62, 0x85, 0x4A, 0xAA, 0x5C, 0x43, 0x48, 0x10, 0x4F, 0x62, 0x38, + 0x14, 0x3B, 0x8E, 0x2A, 0x0B, 0x29, 0x5A, 0x26, 0x63, 0x1C, 0xA9, 0x21, + 0x36, 0x0B, 0x31, 0x15, 0xDF, 0xF6, 0xEF, 0x0A, 0xF6, 0xE9, 0x68, 0x0B, + 0x0D, 0xE5, 0x11, 0x0E, 0x4A, 0xE2, 0xFC, 0x06, 0xB2, 0xE4, 0x3F, 0x00, + 0xD1, 0xF1, 0xBA, 0x08, 0xBE, 0x03, 0x3B, 0x13, 0x2E, 0x1B, 0x81, 0x19, + 0xCC, 0x38, 0x39, 0x27, 0xA4, 0x54, 0x80, 0x3D, 0x8B, 0x63, 0x96, 0x4E, + 0x54, 0x5F, 0xF8, 0x4F, 0xA0, 0x56, 0x5D, 0x4D, 0x70, 0x4A, 0x3B, 0x48, + 0x63, 0x33, 0x47, 0x41, 0xA5, 0x1C, 0x93, 0x43, 0x8A, 0x0E, 0xD8, 0x45, + 0x7C, 0x0A, 0xEF, 0x48, 0x27, 0x0B, 0x5C, 0x4F, 0x31, 0x0A, 0xAF, 0x4C, + 0x41, 0x04, 0x6B, 0x37, 0x2D, 0xFB, 0x69, 0x15, 0x4C, 0xFC, 0xD1, 0x00, + 0x6C, 0x07, 0x7E, 0xFD, 0x3C, 0x11, 0xE5, 0xFE, 0xC7, 0x1E, 0xCC, 0x0A, + 0xB9, 0x31, 0x81, 0x24, 0x15, 0x41, 0x3C, 0x3E, 0xEA, 0x47, 0xF8, 0x4D, + 0x5A, 0x45, 0xA3, 0x52, 0xAE, 0x43, 0xFA, 0x4F, 0xC1, 0x47, 0xF8, 0x4C, + 0xEE, 0x44, 0x8E, 0x47, 0xFD, 0x36, 0xE1, 0x39, 0x7C, 0x26, 0x59, 0x27, + 0x4C, 0x11, 0x59, 0x11, 0x46, 0xF4, 0x2E, 0xF3, 0xC2, 0xDC, 0x42, 0xD6, + 0x60, 0xD0, 0x14, 0xC8, 0x07, 0xD3, 0x55, 0xCE, 0xBB, 0xEB, 0xB8, 0xE6, + 0x93, 0x11, 0xDA, 0x06, 0x82, 0x35, 0xDB, 0x26, 0xBD, 0x4E, 0x57, 0x43, + 0xF6, 0x5E, 0x01, 0x59, 0x18, 0x5E, 0xF4, 0x61, 0x9D, 0x4B, 0xB9, 0x5F, + 0x0B, 0x39, 0xD1, 0x55, 0x68, 0x28, 0xE3, 0x42, 0x8A, 0x16, 0x1B, 0x2C, + 0xCD, 0x08, 0x0A, 0x1A, 0xD2, 0xFB, 0x41, 0x0A, 0xA4, 0xE8, 0x53, 0xFB, + 0xFD, 0xD9, 0xBA, 0xF5, 0xD9, 0xD4, 0x96, 0xF4, 0xFC, 0xD1, 0xE3, 0xEF, + 0x08, 0xD8, 0x28, 0xEE, 0x5B, 0xEB, 0x1F, 0xF2, 0xBE, 0xFE, 0x75, 0xF8, + 0x0C, 0x0C, 0x7E, 0x05, 0x93, 0x1D, 0xE2, 0x1F, 0x4E, 0x33, 0xAE, 0x38, + 0x4D, 0x45, 0x7D, 0x43, 0x89, 0x4C, 0xF8, 0x44, 0xED, 0x46, 0x85, 0x3E, + 0x47, 0x3A, 0xDD, 0x34, 0xBB, 0x27, 0x83, 0x27, 0xAC, 0x0C, 0x62, 0x11, + 0x3D, 0xF8, 0x2B, 0x02, 0x02, 0xF8, 0x89, 0x02, 0xA7, 0xFF, 0x5F, 0x07, + 0xC0, 0xFC, 0x4A, 0x07, 0x9E, 0xEB, 0xBE, 0xFF, 0xD6, 0xD9, 0x26, 0xF8, + 0x1A, 0xD3, 0x49, 0xF2, 0x2F, 0xDA, 0xEA, 0xEF, 0xB0, 0xEB, 0xF0, 0xF4, + 0xE4, 0x00, 0xB2, 0xFF, 0xF4, 0x17, 0xDE, 0x11, 0x68, 0x2D, 0x00, 0x25, + 0x38, 0x32, 0xD5, 0x29, 0xDF, 0x24, 0x26, 0x22, 0xEE, 0x17, 0xCF, 0x1A, + 0x0D, 0x15, 0x8B, 0x19, 0x9C, 0x15, 0x5A, 0x1E, 0x1B, 0x11, 0xD7, 0x20, + 0x9E, 0x05, 0xA5, 0x16, 0x05, 0xF3, 0x10, 0x00, 0x1D, 0xD7, 0x79, 0xE1, + 0xC9, 0xB6, 0x93, 0xBF, 0x69, 0xA0, 0x72, 0xAB, 0x63, 0xA2, 0x87, 0xAE, + 0x88, 0xC3, 0xCB, 0xC5, 0x2E, 0xF4, 0xB1, 0xEC, 0xD8, 0x1E, 0x89, 0x13, + 0x80, 0x3D, 0xD6, 0x30, 0x73, 0x4C, 0x89, 0x43, 0x01, 0x46, 0x31, 0x48, + 0xC1, 0x31, 0x2B, 0x43, 0xC7, 0x18, 0x07, 0x35, 0x71, 0x01, 0xA7, 0x1D, + 0x74, 0xF2, 0x5A, 0x09, 0xCE, 0xE4, 0x27, 0xF7, 0x85, 0xD5, 0x30, 0xE2, + 0x5A, 0xCC, 0x74, 0xD4, 0x28, 0xC8, 0x82, 0xCF, 0x38, 0xC8, 0x1C, 0xD1, + 0x39, 0xCD, 0xF6, 0xD6, 0x4C, 0xD0, 0x1D, 0xDE, 0x42, 0xD2, 0x71, 0xE5, + 0xBF, 0xDD, 0x84, 0xEE, 0xCA, 0xF9, 0x71, 0xFD, 0xBD, 0x1B, 0x52, 0x0F, + 0x96, 0x32, 0xD6, 0x1B, 0x4D, 0x3C, 0x29, 0x1E, 0x8F, 0x3E, 0xDC, 0x1C, + 0xE9, 0x34, 0x17, 0x17, 0x94, 0x1F, 0xBB, 0x08, 0x87, 0x07, 0x4C, 0xF8, + 0x1D, 0xEF, 0x59, 0xED, 0x3D, 0xE3, 0x71, 0xEA, 0x83, 0xEE, 0xE1, 0xEE, + 0x5D, 0xF5, 0xA4, 0xF0, 0xCD, 0xE6, 0x20, 0xEC, 0x79, 0xDD, 0x5E, 0xE8, + 0xC1, 0xE1, 0x59, 0xDD, 0xC9, 0xE1, 0x8A, 0xCC, 0xC9, 0xE2, 0xB6, 0xC8, + 0x1F, 0xED, 0x36, 0xD8, 0x31, 0xF4, 0x19, 0xF3, 0x0A, 0xF6, 0x98, 0x0C, + 0xC1, 0xF8, 0x84, 0x18, 0xE8, 0xFB, 0xC3, 0x12, 0xE8, 0xFA, 0x13, 0x05, + 0xED, 0xF4, 0xB9, 0xFB, 0xD9, 0xF4, 0xCD, 0xF8, 0x68, 0xF8, 0xC7, 0xF9, + 0xDB, 0xEF, 0x62, 0xF7, 0x3C, 0xDC, 0xBB, 0xED, 0x69, 0xC4, 0x92, 0xDC, + 0x24, 0xAB, 0x8E, 0xC3, 0xA5, 0x9C, 0x49, 0xAB, 0xC7, 0xA0, 0x2A, 0x9E, + 0x48, 0xB3, 0xC0, 0xA6, 0x54, 0xCD, 0x79, 0xC1, 0x1F, 0xEB, 0x29, 0xDD, + 0x08, 0x0B, 0x85, 0xF5, 0x8B, 0x25, 0xD5, 0x08, 0x5E, 0x30, 0xC0, 0x15, + 0x1B, 0x2C, 0x12, 0x1E, 0x14, 0x23, 0x4E, 0x1E, 0xFF, 0x12, 0x28, 0x12, + 0xD2, 0xFC, 0x2A, 0xFD, 0x00, 0xEE, 0xC1, 0xEA, 0x10, 0xE0, 0xC5, 0xDA, + 0xDD, 0xC8, 0x1F, 0xC7, 0xDE, 0xB5, 0x48, 0xBC, 0x51, 0xAC, 0xA5, 0xBA, + 0x3F, 0xAA, 0xA2, 0xB8, 0xD1, 0xAD, 0x85, 0xBC, 0x24, 0xB3, 0x1E, 0xC5, + 0x56, 0xC0, 0x31, 0xC8, 0x8B, 0xD8, 0x39, 0xCA, 0xD8, 0xF4, 0x8D, 0xD7, + 0xB9, 0x0A, 0x6F, 0xEA, 0xD6, 0x17, 0xAB, 0xF6, 0x1C, 0x1D, 0xEB, 0xFE, + 0xFD, 0x1A, 0x9A, 0x02, 0xC0, 0x17, 0xB2, 0x01, 0xF6, 0x0C, 0xA4, 0xFE, + 0xEE, 0xF4, 0x0D, 0xF5, 0xA8, 0xE4, 0x23, 0xF0, 0x07, 0xE3, 0xCA, 0xF3, + 0xA0, 0xDC, 0x9D, 0xF3, 0x75, 0xD0, 0xDE, 0xEE, 0x27, 0xCC, 0xD0, 0xE7, + 0xF6, 0xCB, 0xF6, 0xDE, 0xB3, 0xC9, 0x30, 0xD5, 0x10, 0xCC, 0x56, 0xCE, + 0xD9, 0xD3, 0x86, 0xD0, 0x49, 0xDC, 0x65, 0xD9, 0xD0, 0xE7, 0xA5, 0xE5, + 0x43, 0xF7, 0xA4, 0xEF, 0xAD, 0x01, 0xD9, 0xED, 0xB5, 0x07, 0x26, 0xEA, + 0x0A, 0x0A, 0x54, 0xEC, 0xC0, 0x03, 0x5A, 0xEA, 0x12, 0xF8, 0x53, 0xE0, + 0x42, 0xEF, 0x98, 0xD9, 0x94, 0xE4, 0xDD, 0xD1, 0x0E, 0xCF, 0x2E, 0xBE, + 0x63, 0xB7, 0x7E, 0xA9, 0x4B, 0xAB, 0xFE, 0x9E, 0xAC, 0xAB, 0xF8, 0x9B, + 0x2C, 0xB3, 0xAF, 0xA2, 0x18, 0xC3, 0xEC, 0xB6, 0xF8, 0xD6, 0x52, 0xC9, + 0xAF, 0xE4, 0xCC, 0xD4, 0x65, 0xEF, 0x08, 0xE4, 0x2A, 0xFF, 0x29, 0xF9, + 0x6B, 0x0D, 0xCB, 0x09, 0x11, 0x13, 0xE9, 0x10, 0xE1, 0x15, 0x5F, 0x12, + 0x94, 0x13, 0xDC, 0x08, 0x23, 0x05, 0x69, 0xF6, 0x3E, 0xF0, 0x77, 0xE2, + 0x32, 0xDA, 0x29, 0xCF, 0xEA, 0xC9, 0xB7, 0xC6, 0x49, 0xBE, 0xD7, 0xC2, + 0xF9, 0xB3, 0x26, 0xBB, 0xBC, 0xB1, 0x1B, 0xB8, 0x55, 0xB9, 0x4C, 0xB9, + 0xD4, 0xC7, 0x26, 0xBE, 0x3D, 0xD7, 0xA6, 0xCA, 0xA7, 0xE6, 0xA7, 0xDE, + 0xC0, 0xF7, 0x4B, 0xF3, 0x98, 0x04, 0x0A, 0xFC, 0x85, 0x0C, 0x45, 0xFA, + 0x44, 0x11, 0x3E, 0xF4, 0xCB, 0x0C, 0x3F, 0xE9, 0xBD, 0x09, 0x12, 0xE1, + 0xFA, 0x0B, 0x2A, 0xDF, 0x71, 0x04, 0xD1, 0xE0, 0xB0, 0xF8, 0xB9, 0xE8, + 0xDA, 0xF3, 0xA5, 0xF3, 0x56, 0xEE, 0xDA, 0xF6, 0x2D, 0xE3, 0x42, 0xF0, + 0x54, 0xDB, 0x08, 0xEC, 0xED, 0xD9, 0x48, 0xF1, 0x9E, 0xD8, 0x82, 0xF5, + 0x17, 0xD9, 0x54, 0xF6, 0x52, 0xE2, 0x86, 0xFE, 0x46, 0xF0, 0xCF, 0x08, + 0x06, 0xFF, 0xFB, 0x0D, 0xFD, 0x0A, 0x76, 0x10, 0x23, 0x10, 0x41, 0x0E, + 0x33, 0x15, 0xCE, 0x07, 0xAA, 0x19, 0x86, 0x01, 0x44, 0x19, 0x60, 0xFB, + 0x67, 0x12, 0xDD, 0xF7, 0x0B, 0x05, 0x19, 0xF7, 0xB1, 0xF5, 0xBD, 0xF0, + 0x44, 0xE5, 0xEA, 0xE6, 0x20, 0xD8, 0x70, 0xE1, 0xBA, 0xD1, 0xDE, 0xDB, + 0xA6, 0xD3, 0x91, 0xD8, 0x2B, 0xDA, 0x40, 0xDF, 0x80, 0xE3, 0x8A, 0xEF, + 0xF5, 0xF4, 0x6E, 0x03, 0x8A, 0x0C, 0x02, 0x11, 0xBD, 0x25, 0x20, 0x14, + 0xBB, 0x3C, 0x02, 0x12, 0x1F, 0x4C, 0xAD, 0x11, 0xC5, 0x4E, 0x7F, 0x14, + 0x67, 0x44, 0xF0, 0x19, 0xD2, 0x2F, 0x6C, 0x1D, 0x96, 0x11, 0x61, 0x19, + 0xE0, 0xF3, 0x98, 0x14, 0xBA, 0xE5, 0x00, 0x0F, 0x68, 0xE3, 0xF3, 0x04, + 0xA8, 0xE5, 0x0E, 0x01, 0x79, 0xEC, 0x83, 0x00, 0x50, 0xF3, 0xA8, 0xFA, + 0x8E, 0xF7, 0xE6, 0xF7, 0x75, 0xFA, 0x30, 0xF9, 0x55, 0x00, 0xDC, 0xF5, + 0xCB, 0x0B, 0xAC, 0xF1, 0xF2, 0x17, 0xDB, 0xF6, 0xFC, 0x22, 0x75, 0x06, + 0x1A, 0x2E, 0xD1, 0x17, 0x9A, 0x33, 0x4D, 0x20, 0x48, 0x35, 0x86, 0x24, + 0xAC, 0x2E, 0x0C, 0x23, 0x84, 0x1E, 0x6B, 0x1B, 0xE8, 0x12, 0xD3, 0x19, + 0xD1, 0x0D, 0x70, 0x19, 0x10, 0x0B, 0x0A, 0x11, 0x0C, 0x09, 0x05, 0x0B, + 0xA2, 0x0A, 0xBC, 0x0D, 0xFD, 0x0E, 0x03, 0x0C, 0x5F, 0x13, 0x1F, 0x0A, + 0xE4, 0x13, 0x0A, 0x13, 0x3D, 0x10, 0x60, 0x1E, 0xC7, 0x10, 0x10, 0x20, + 0x6B, 0x17, 0xAF, 0x1C, 0x1F, 0x1C, 0x5F, 0x1A, 0xC2, 0x16, 0x44, 0x12, + 0xD9, 0x0A, 0x62, 0x06, 0xC3, 0x06, 0xE7, 0x05, 0x5B, 0x09, 0xB2, 0x0D, + 0x1F, 0x0E, 0x1C, 0x16, 0x82, 0x1C, 0x23, 0x1F, 0xC2, 0x26, 0x59, 0x1E, + 0xE7, 0x19, 0xA8, 0x10, 0x16, 0x04, 0xC8, 0x01, 0xD8, 0xF6, 0x2F, 0xF5, + 0x61, 0xED, 0x9D, 0xE5, 0xED, 0xE5, 0xDA, 0xDB, 0x56, 0xE8, 0x6E, 0xE1, + 0xE9, 0xF3, 0x65, 0xEE, 0xF9, 0x05, 0x07, 0xFB, 0xFA, 0x19, 0x5A, 0x05, + 0xE6, 0x24, 0x07, 0x0E, 0xEB, 0x22, 0x48, 0x14, 0x67, 0x1F, 0x33, 0x1B, + 0x44, 0x20, 0xF7, 0x21, 0x79, 0x20, 0x16, 0x20, 0x88, 0x1F, 0x89, 0x1D, + 0x5F, 0x1B, 0x6D, 0x1D, 0xE2, 0x18, 0x71, 0x17, 0xA0, 0x1B, 0x6B, 0x10, + 0x69, 0x1B, 0x2C, 0x13, 0xC0, 0x17, 0x71, 0x1D, 0xBE, 0x10, 0x94, 0x20, + 0x72, 0x0A, 0x59, 0x19, 0x4E, 0x0A, 0xC5, 0x0D, 0x59, 0x12, 0x33, 0x05, + 0x51, 0x18, 0xA3, 0x04, 0x24, 0x0E, 0xD7, 0x07, 0xDE, 0x02, 0x83, 0x0F, + 0xE6, 0x04, 0x5C, 0x1A, 0x2B, 0x10, 0x7C, 0x1F, 0xC5, 0x1E, 0x27, 0x23, + 0x4C, 0x29, 0x84, 0x2C, 0x92, 0x2A, 0xD3, 0x36, 0x8F, 0x28, 0xD0, 0x3F, + 0xB0, 0x28, 0x4C, 0x46, 0x80, 0x26, 0x44, 0x45, 0xC7, 0x21, 0x7B, 0x3F, + 0x03, 0x21, 0x66, 0x38, 0xA3, 0x23, 0x11, 0x31, 0x3B, 0x25, 0x40, 0x2C, + 0xA4, 0x25, 0x99, 0x2B, 0x0E, 0x27, 0x16, 0x2D, 0x8E, 0x25, 0x9A, 0x29, + 0x38, 0x1D, 0x72, 0x20, 0xEF, 0x1B, 0x6C, 0x19, 0x90, 0x22, 0x97, 0x13, + 0x6E, 0x21, 0x70, 0x0E, 0x27, 0x19, 0xD5, 0x10, 0xA0, 0x16, 0x98, 0x18, + 0x3E, 0x1D, 0x13, 0x1F, 0x66, 0x1F, 0xA4, 0x24, 0x3E, 0x1C, 0x96, 0x2D, + 0x38, 0x18, 0x37, 0x34, 0x6C, 0x11, 0x5C, 0x2E, 0x6E, 0x0C, 0xEA, 0x18, + 0x8D, 0x0A, 0x3E, 0xFC, 0xC0, 0x02, 0x8E, 0xEA, 0xA0, 0xF7, 0x30, 0xE9, + 0x6B, 0xF8, 0xAC, 0xEF, 0xB9, 0xFD, 0xBE, 0xF3, 0xE2, 0x02, 0x2B, 0xF7, + 0x3D, 0x0F, 0x7D, 0x04, 0xE1, 0x17, 0x02, 0x13, 0x15, 0x17, 0x98, 0x18, + 0x7C, 0x18, 0xE2, 0x22, 0x02, 0x17, 0x11, 0x33, 0x5D, 0x0E, 0x90, 0x3A, + 0x5B, 0x0B, 0x0C, 0x3D, 0x8F, 0x0E, 0x53, 0x40, 0xD2, 0x11, 0x48, 0x40, + 0xBC, 0x14, 0x67, 0x3C, 0xCC, 0x15, 0xCE, 0x33, 0x4C, 0x14, 0x70, 0x22, + 0xE6, 0x14, 0x94, 0x10, 0x5B, 0x0F, 0xBA, 0xFD, 0xC8, 0x0B, 0x18, 0xEE, + 0xA0, 0x0F, 0x87, 0xEE, 0x13, 0x0F, 0xF0, 0xF8, 0x6E, 0x14, 0x9B, 0x0B, + 0x7E, 0x1D, 0x0A, 0x21, 0x0D, 0x1B, 0x3E, 0x29, 0xE2, 0x19, 0xA4, 0x2A, + 0xA0, 0x1D, 0x70, 0x2C, 0xA2, 0x19, 0x35, 0x26, 0x08, 0x18, 0xC3, 0x1E, + 0x64, 0x21, 0x41, 0x21, 0x85, 0x24, 0x2E, 0x24, 0xA2, 0x1E, 0x57, 0x22, + 0xC5, 0x1E, 0x40, 0x26, 0x34, 0x1C, 0x4D, 0x28, 0x34, 0x15, 0x8B, 0x26, + 0x60, 0x16, 0x8B, 0x2B, 0xA1, 0x18, 0x93, 0x2F, 0x35, 0x1A, 0xA3, 0x2D, + 0x1B, 0x1E, 0xC7, 0x2A, 0x91, 0x1C, 0x50, 0x27, 0x15, 0x16, 0x59, 0x1F, + 0x8D, 0x0E, 0xBE, 0x14, 0xA4, 0x0C, 0x6C, 0x10, 0x7A, 0x0E, 0x67, 0x12, + 0xD0, 0x10, 0x4A, 0x14, 0x72, 0x17, 0x18, 0x19, 0x13, 0x1F, 0x7D, 0x20, + 0x75, 0x20, 0x65, 0x1E, 0xE8, 0x15, 0xB9, 0x0D, 0xF0, 0x0C, 0x99, 0xFA, + 0x5F, 0x06, 0x8E, 0xEB, 0x94, 0xF8, 0x21, 0xE0, 0x26, 0xED, 0x17, 0xDA, + 0xAA, 0xEE, 0x6B, 0xE1, 0x92, 0xEF, 0xA7, 0xEE, 0x68, 0xE7, 0xE7, 0xF2, + 0x16, 0xEA, 0x07, 0xF8, 0xD2, 0xF4, 0x8A, 0xFF, 0x59, 0x01, 0x31, 0x0B, + 0x8A, 0x12, 0x37, 0x19, 0x69, 0x1F, 0xCC, 0x23, 0x2B, 0x1C, 0xDB, 0x2A, + 0x30, 0x0F, 0xFA, 0x2A, 0x18, 0x05, 0x10, 0x26, 0x40, 0xFF, 0x91, 0x22, + 0xA1, 0xFC, 0xA4, 0x22, 0x19, 0xFC, 0xF8, 0x21, 0x28, 0xFD, 0x37, 0x1D, + 0xF0, 0xFB, 0x13, 0x12, 0xE4, 0xF5, 0x9E, 0xFF, 0x75, 0xF0, 0x4C, 0xED, + 0x72, 0xEE, 0x12, 0xE5, 0xFB, 0xEB, 0x2C, 0xE3, 0x78, 0xF2, 0x0D, 0xEA, + 0xE2, 0xF5, 0xF6, 0xEF, 0xD7, 0xF2, 0x88, 0xF1, 0xD5, 0xF9, 0xA9, 0xF7, + 0x26, 0x04, 0x05, 0xF7, 0x0B, 0x06, 0x92, 0xEE, 0x93, 0x04, 0x32, 0xEA, + 0x0F, 0x01, 0x10, 0xEA, 0x2D, 0xF7, 0xA5, 0xEB, 0x21, 0xF0, 0xA1, 0xEE, + 0xFE, 0xE9, 0xF3, 0xF0, 0xAD, 0xE2, 0x5E, 0xF3, 0x2F, 0xE0, 0xC0, 0xF3, + 0xA4, 0xDF, 0xF6, 0xF0, 0x04, 0xE4, 0x1B, 0xF2, 0x53, 0xE2, 0x4D, 0xED, + 0x32, 0xD9, 0xB8, 0xE1, 0x6F, 0xDB, 0x89, 0xDE, 0x67, 0xD9, 0x6D, 0xDB, + 0xAE, 0xD6, 0x85, 0xDD, 0x5F, 0xDD, 0x31, 0xE9, 0xDC, 0xE2, 0x29, 0xF3, + 0xE3, 0xE5, 0xB2, 0xFD, 0x83, 0xE4, 0xD1, 0x03, 0x9D, 0xDF, 0xC4, 0xFC, + 0x9F, 0xD8, 0x57, 0xEB, 0xBF, 0xD7, 0x0E, 0xD9, 0x76, 0xD4, 0xFF, 0xC6, + 0x9E, 0xCC, 0x34, 0xB7, 0xC3, 0xC8, 0xF7, 0xB1, 0xF6, 0xC2, 0xEB, 0xB6, + 0x2D, 0xC7, 0xE9, 0xC3, 0xE5, 0xD6, 0xC6, 0xCE, 0xD2, 0xE1, 0xF6, 0xCD, + 0x7B, 0xF1, 0xD9, 0xCF, 0x3C, 0x01, 0x86, 0xD8, 0xFE, 0xFE, 0xCC, 0xDF, + 0x6B, 0xF4, 0xA1, 0xE6, 0xF8, 0xEB, 0xF2, 0xE8, 0xD4, 0xEA, 0xDB, 0xEB, + 0x21, 0xF2, 0xFB, 0xF3, 0xCD, 0xF1, 0xDC, 0xF7, 0x68, 0xE8, 0xFA, 0xF4, + 0xA4, 0xE5, 0x3B, 0xF0, 0x90, 0xE4, 0x1C, 0xEA, 0x7A, 0xE5, 0xDE, 0xE4, + 0xB5, 0xE0, 0xBD, 0xD8, 0x7E, 0xD9, 0xEE, 0xCB, 0x55, 0xDE, 0xFA, 0xD0, + 0xE9, 0xDF, 0x7B, 0xDE, 0x29, 0xDA, 0x89, 0xE9, 0x17, 0xE2, 0xAA, 0xFA, + 0xC4, 0xEA, 0x72, 0x04, 0xF0, 0xEE, 0xC2, 0x03, 0xF7, 0xFF, 0x0F, 0x08, + 0x6D, 0x0A, 0x3D, 0x0C, 0xE5, 0x01, 0x25, 0x09, 0xA3, 0xF3, 0x5D, 0xFC, + 0x5F, 0xE9, 0x83, 0xF1, 0x1D, 0xE1, 0xF8, 0xEC, 0x7D, 0xE6, 0x68, 0xEF, + 0x31, 0xEE, 0xFE, 0xF1, 0x16, 0xF5, 0x1A, 0xF4, 0x46, 0x02, 0xF4, 0xF5, + 0x97, 0x09, 0xAB, 0xF3, 0x68, 0x0C, 0x19, 0xF6, 0x6F, 0x01, 0x9C, 0xF3, + 0xBE, 0xF3, 0xF1, 0xED, 0x3E, 0xF7, 0x7F, 0xF2, 0x1D, 0x04, 0xBB, 0xF9, + 0xF6, 0x0B, 0x30, 0xFA, 0xCC, 0x08, 0xA7, 0xF9, 0xEC, 0xFB, 0xEC, 0xFB, + 0x5F, 0xF0, 0x40, 0xFD, 0xB6, 0xEC, 0x4F, 0xF9, 0x39, 0xEC, 0xCD, 0xF1, + 0x3A, 0xE9, 0x35, 0xE7, 0xDE, 0xE5, 0xA3, 0xD9, 0x3C, 0xE3, 0x80, 0xCE, + 0x9C, 0xE3, 0x40, 0xCD, 0xC8, 0xE5, 0xAA, 0xD3, 0xAB, 0xE3, 0x54, 0xD8, + 0x22, 0xE1, 0xC5, 0xDB, 0xEA, 0xDE, 0xD2, 0xDB, 0xE4, 0xDC, 0x72, 0xD3, + 0xFC, 0xDA, 0x72, 0xCA, 0xD8, 0xD6, 0xF9, 0xCB, 0x6B, 0xCF, 0xBC, 0xCF, + 0xB4, 0xCF, 0xA0, 0xD3, 0xB8, 0xD4, 0xC4, 0xD7, 0x79, 0xD7, 0x2D, 0xD8, + 0xF3, 0xDA, 0x63, 0xDD, 0x66, 0xD4, 0xB2, 0xE0, 0x4F, 0xC8, 0x53, 0xDD, + 0xBD, 0xC7, 0xF2, 0xDD, 0x01, 0xCD, 0x3E, 0xDD, 0xAF, 0xCA, 0x57, 0xD4, + 0x5B, 0xCB, 0x57, 0xD0, 0x7B, 0xD5, 0x94, 0xCE, 0x36, 0xE5, 0x78, 0xCA, + 0xD7, 0xF3, 0x81, 0xCC, 0xE1, 0xFA, 0x49, 0xD6, 0xEE, 0xFA, 0xB9, 0xDC, + 0xA7, 0xFA, 0x33, 0xDE, 0x56, 0xF8, 0xB7, 0xDE, 0x01, 0xF2, 0x1A, 0xD9, + 0x8C, 0xED, 0x07, 0xD7, 0xBF, 0xEF, 0x12, 0xE3, 0x67, 0xF4, 0xD6, 0xEE, + 0xA8, 0xF5, 0xD6, 0xF1, 0x51, 0xF7, 0xD1, 0xF4, 0x7C, 0xF7, 0xFD, 0xF7, + 0x3D, 0xFB, 0x43, 0xFD, 0x6F, 0x01, 0x18, 0x05, 0x0D, 0x02, 0x18, 0x03, + 0x5F, 0x02, 0x83, 0xF3, 0x7B, 0x08, 0x4E, 0xED, 0x64, 0x12, 0x89, 0xF3, + 0x67, 0x18, 0x78, 0xF9, 0xB5, 0x18, 0x5C, 0x02, 0x9B, 0x11, 0x0B, 0x02, + 0xF4, 0x0D, 0x65, 0x04, 0xC3, 0x11, 0x5E, 0x10, 0xBE, 0x05, 0x33, 0x0D, + 0xC9, 0xF7, 0x4A, 0x09, 0xA7, 0xF6, 0x95, 0x0F, 0x07, 0xF1, 0xB9, 0x11, + 0x71, 0xEB, 0x65, 0x0D, 0x93, 0xE7, 0x62, 0x02, 0xEE, 0xE7, 0xF4, 0xF4, + 0xEF, 0xF5, 0x45, 0xEB, 0x51, 0x09, 0xEF, 0xE5, 0x47, 0x15, 0x41, 0xE4, + 0x7B, 0x10, 0x72, 0xE0, 0xB3, 0x07, 0xD9, 0xE4, 0xBA, 0x03, 0x5B, 0xF6, + 0x06, 0xFF, 0x89, 0x07, 0x24, 0xF8, 0x72, 0x0C, 0x76, 0xEF, 0xCA, 0x06, + 0xE3, 0xE7, 0x89, 0xFD, 0xBA, 0xE4, 0x45, 0xF4, 0x38, 0xEA, 0x54, 0xF3, + 0x99, 0xF0, 0x28, 0xF5, 0x59, 0xF2, 0xD6, 0xF9, 0xF4, 0xF0, 0x9E, 0xFF, + 0xCD, 0xFA, 0x2F, 0x0D, 0x05, 0x01, 0x0A, 0x19, 0xE8, 0xF7, 0xD3, 0x12, + 0x83, 0x00, 0x1C, 0x0E, 0xF7, 0x0F, 0x16, 0x09, 0x3D, 0x12, 0x60, 0xFC, + 0x93, 0x12, 0xBE, 0xF0, 0x68, 0x15, 0x60, 0xEC, 0x7F, 0x10, 0x54, 0xE9, + 0x99, 0x0B, 0xB8, 0xF1, 0xD1, 0x12, 0x1C, 0x08, 0xAF, 0x13, 0xE5, 0x0F, + 0x4C, 0x0F, 0x6A, 0x0E, 0x3B, 0x17, 0x16, 0x13, 0xAB, 0x1B, 0x1C, 0x0D, + 0x8B, 0x11, 0x5A, 0xFB, 0x9C, 0x0D, 0x94, 0xF9, 0x6B, 0x11, 0xF3, 0x03, + 0xA9, 0x0C, 0x66, 0x07, 0xE1, 0x02, 0x1C, 0x06, 0x29, 0x00, 0x80, 0x05, + 0xBC, 0x06, 0x29, 0x0B, 0xCE, 0x06, 0x15, 0x0B, 0xF2, 0x01, 0xD7, 0x03, + 0xEC, 0x09, 0x96, 0x08, 0x8D, 0x0F, 0xD3, 0x0C, 0x46, 0x0A, 0x2A, 0x09, + 0xB2, 0xFC, 0x8F, 0x01, 0x6C, 0xED, 0xBC, 0xF3, 0xAC, 0xE5, 0xF4, 0xEC, + 0x65, 0xE6, 0x25, 0xF7, 0x4E, 0xE8, 0x59, 0x01, 0x9B, 0xE5, 0xC9, 0x04, + 0xA0, 0xE9, 0x58, 0x07, 0x69, 0xFC, 0x67, 0x05, 0xF8, 0x10, 0x47, 0xFF, + 0xB5, 0x18, 0xD1, 0xF7, 0x8A, 0x1D, 0xC1, 0xF8, 0x90, 0x1A, 0x92, 0xF8, + 0x46, 0x11, 0x68, 0xFB, 0x12, 0x0F, 0x12, 0x08, 0x5A, 0x0E, 0x0C, 0x0C, + 0xB5, 0x0A, 0xE5, 0x0A, 0x48, 0x0A, 0x2C, 0x07, 0x80, 0x11, 0x09, 0x01, + 0x65, 0x1C, 0x83, 0x01, 0xA2, 0x19, 0xC6, 0x02, 0x42, 0x0F, 0x40, 0x07, + 0x4C, 0x0F, 0x49, 0x10, 0xF7, 0x11, 0x6F, 0x18, 0x16, 0x13, 0x9D, 0x1E, + 0x6D, 0x0F, 0xB8, 0x20, 0xA0, 0x0D, 0x4E, 0x23, 0x2D, 0x14, 0xBB, 0x25, + 0xDC, 0x16, 0xDF, 0x23, 0xDD, 0x11, 0xAC, 0x1A, 0x0B, 0x1E, 0x95, 0x12, + 0x2C, 0x2D, 0xC6, 0x0D, 0xF6, 0x25, 0x4D, 0x06, 0xF3, 0x1F, 0xC7, 0x06, + 0x66, 0x1B, 0x7A, 0x0E, 0xA3, 0x13, 0xF6, 0x12, 0x64, 0x15, 0x75, 0x17, + 0xC7, 0x16, 0x1D, 0x19, 0x6D, 0x13, 0x82, 0x1C, 0xA2, 0x16, 0x0E, 0x27, + 0x25, 0x1E, 0x79, 0x32, 0x6A, 0x1D, 0x5C, 0x38, 0x41, 0x17, 0x00, 0x3B, + 0x8E, 0x17, 0xBF, 0x3B, 0xEB, 0x1B, 0xB1, 0x35, 0x5C, 0x1E, 0x64, 0x2E, + 0xA2, 0x1E, 0x8A, 0x28, 0x78, 0x1F, 0xEA, 0x22, 0xE1, 0x25, 0x6A, 0x1C, + 0x24, 0x24, 0x87, 0x0D, 0x19, 0x1B, 0xC1, 0x01, 0x75, 0x1E, 0xA0, 0x0D, + 0x60, 0x1F, 0x35, 0x1B, 0xE6, 0x1E, 0x41, 0x28, 0x4D, 0x17, 0xB9, 0x34, + 0xB0, 0x03, 0x6E, 0x32, 0xEB, 0x09, 0x88, 0x3C, 0x5D, 0x1D, 0x3A, 0x44, + 0xE9, 0x20, 0x36, 0x33, 0xFA, 0x1A, 0x57, 0x21, 0x63, 0x1D, 0x51, 0x1B, + 0x4D, 0x1F, 0x1F, 0x0F, 0xCD, 0x1D, 0x12, 0x03, 0xEB, 0x22, 0x36, 0x03, + 0xC6, 0x1B, 0xF1, 0xFE, 0xEA, 0x16, 0x90, 0xFC, 0x2C, 0x1D, 0x7B, 0x05, + 0xB5, 0x15, 0x90, 0x0A, 0x98, 0x08, 0x21, 0x07, 0xEE, 0x03, 0x0B, 0x06, + 0x6E, 0x02, 0x48, 0x0A, 0x01, 0x07, 0xBF, 0x15, 0x7B, 0x04, 0xDB, 0x15, + 0x5C, 0x00, 0x07, 0x15, 0xEE, 0x05, 0x42, 0x22, 0xE8, 0x0B, 0x06, 0x2A, + 0xDF, 0x15, 0xBF, 0x28, 0xC6, 0x1F, 0x9C, 0x24, 0xF0, 0x1A, 0x2F, 0x13, + 0xD7, 0x17, 0x45, 0x01, 0x6E, 0x17, 0xB8, 0xFD, 0xCD, 0x0C, 0x3B, 0xFD, + 0x62, 0x09, 0x55, 0x02, 0x9F, 0x0B, 0x44, 0x08, 0xAA, 0x0B, 0x0E, 0x0F, + 0xBA, 0x0A, 0x66, 0x15, 0x63, 0x0B, 0x47, 0x19, 0xA9, 0x11, 0x75, 0x19, + 0x17, 0x14, 0xD7, 0x0F, 0xB9, 0x10, 0x23, 0x0F, 0x25, 0x13, 0xBF, 0x19, + 0x7C, 0x18, 0x1F, 0x22, 0x0A, 0x13, 0x0F, 0x26, 0x0F, 0x11, 0xF3, 0x2C, + 0xBF, 0x19, 0x0C, 0x35, 0x00, 0x1C, 0xB4, 0x36, 0xDE, 0x1E, 0xA2, 0x37, + 0x7E, 0x1E, 0x89, 0x2D, 0x27, 0x19, 0x49, 0x1A, 0xB7, 0x15, 0x1E, 0x11, + 0xD7, 0x0E, 0x2A, 0x15, 0x65, 0x0D, 0xCE, 0x17, 0x1D, 0x11, 0xC7, 0x0D, + 0x9A, 0x18, 0x7D, 0x0E, 0xD4, 0x1F, 0xA6, 0x1D, 0x2A, 0x19, 0xA0, 0x26, + 0xE7, 0x0D, 0x55, 0x29, 0xFF, 0x07, 0xC5, 0x25, 0xAC, 0x06, 0x05, 0x1F, + 0x64, 0x0B, 0x36, 0x21, 0x3E, 0x04, 0x4E, 0x1E, 0x54, 0xFD, 0x2F, 0x16, + 0x98, 0x09, 0x08, 0x18, 0x14, 0x15, 0x27, 0x16, 0x8E, 0x1C, 0xCF, 0x0F, + 0x73, 0x1B, 0x0D, 0x0A, 0x97, 0x19, 0x73, 0x0A, 0xFB, 0x0E, 0x39, 0x05, + 0xF3, 0x00, 0xBA, 0xFD, 0x90, 0x04, 0x88, 0x02, 0x7E, 0xFA, 0x0B, 0xF5, + 0x4B, 0xF7, 0x03, 0xF2, 0x56, 0x07, 0xBF, 0x07, 0xB7, 0x07, 0x43, 0x0B, + 0xE8, 0x01, 0xF7, 0x0D, 0x53, 0xFA, 0xB9, 0x19, 0x23, 0xEF, 0x0F, 0x17, + 0x24, 0xEF, 0x99, 0x0D, 0x09, 0xFA, 0x42, 0x0B, 0x10, 0x06, 0x7D, 0x0E, + 0x57, 0x0A, 0xE3, 0x12, 0xA3, 0x14, 0x78, 0x1E, 0xA0, 0x1A, 0xFB, 0x1B, + 0xBC, 0x1C, 0x51, 0x0F, 0xE4, 0x2A, 0x56, 0x11, 0xA9, 0x1C, 0x97, 0x02, + 0x41, 0x11, 0x35, 0xFC, 0x5A, 0x06, 0xFA, 0xF5, 0x27, 0xF2, 0x86, 0xED, + 0x83, 0xF1, 0x08, 0xFB, 0x45, 0xE8, 0x2B, 0xFA, 0x37, 0xE6, 0x56, 0xF9, + 0x54, 0xED, 0x48, 0xFC, 0xDE, 0xFB, 0xB1, 0x04, 0x6B, 0x02, 0x25, 0x04, + 0xA4, 0x02, 0xAB, 0xF7, 0xB5, 0x0F, 0x54, 0xF5, 0xFD, 0x02, 0x89, 0xE3, + 0xEB, 0x06, 0x7D, 0xE8, 0x11, 0x0D, 0xF1, 0xEC, 0xB5, 0x02, 0x7A, 0xE9, + 0xF3, 0x01, 0xC5, 0xFA, 0x5A, 0xF9, 0x0B, 0xFF, 0x4A, 0xF1, 0x4A, 0xFC, + 0x8B, 0xE2, 0xBD, 0xF0, 0x3C, 0xE1, 0x05, 0xEF, 0x1A, 0xE5, 0x4F, 0xF3, + 0x0C, 0xE4, 0xA5, 0xF3, 0x4A, 0xE4, 0xD9, 0xF7, 0xEC, 0xE0, 0x3C, 0xFF, + 0xEF, 0xE2, 0xF3, 0x0C, 0xBD, 0xDA, 0xE5, 0x08, 0xCF, 0xD5, 0x5B, 0xFC, + 0x0E, 0xE5, 0xE8, 0xFA, 0x43, 0xE8, 0x0F, 0xEC, 0x5F, 0xEC, 0x44, 0xDE, + 0x80, 0xFF, 0x6B, 0xDF, 0x47, 0xFF, 0xCA, 0xD3, 0x51, 0xFA, 0x3B, 0xCD, + 0x9E, 0xFF, 0x55, 0xD4, 0x4D, 0x00, 0xB9, 0xDB, 0x04, 0xF9, 0x37, 0xDF, + 0x12, 0xF7, 0x0C, 0xE6, 0x08, 0xF5, 0xD6, 0xEF, 0xAF, 0xEC, 0x9C, 0xF1, + 0x1F, 0xE2, 0xAF, 0xEC, 0xD7, 0xD5, 0xE6, 0xE4, 0x10, 0xDF, 0xAF, 0xE5, + 0x19, 0xEA, 0x35, 0xE7, 0x30, 0xE0, 0xA5, 0xE1, 0xEA, 0xE5, 0x5F, 0xE9, + 0x65, 0xF1, 0xD5, 0xF1, 0xA0, 0xF6, 0x2C, 0xF7, 0xA8, 0xFF, 0xDB, 0xFE, + 0x54, 0xF9, 0x9E, 0xF5, 0x22, 0xEE, 0xE1, 0xEC, 0x1F, 0xEB, 0xA1, 0xEC, + 0xC6, 0xEA, 0x33, 0xE9, 0xC9, 0xE9, 0xB6, 0xE4, 0xB6, 0xEB, 0x5B, 0xE7, + 0x70, 0xEE, 0xA8, 0xEF, 0x6F, 0xF1, 0x66, 0xF9, 0xA0, 0xF6, 0x6A, 0x04, + 0xE5, 0xF4, 0xE4, 0x0C, 0xDD, 0xEB, 0xCD, 0x0E, 0x19, 0xE7, 0x55, 0x0C, + 0x64, 0xD8, 0x89, 0xFA, 0xD1, 0xCE, 0xB6, 0xED, 0x62, 0xD4, 0x0E, 0xEB, + 0xB2, 0xD8, 0x5A, 0xE2, 0xFC, 0xDD, 0x1D, 0xE5, 0xB1, 0xDC, 0x1A, 0xE8, + 0x6C, 0xE2, 0xA9, 0xE3, 0x4C, 0xEF, 0xFD, 0xDD, 0x9C, 0xF2, 0x4F, 0xD0, + 0x64, 0xF3, 0x48, 0xC9, 0xEB, 0xF7, 0x00, 0xD1, 0x62, 0xF3, 0x77, 0xCF, + 0x0F, 0xEB, 0x8D, 0xD3, 0x10, 0xE1, 0xC3, 0xE4, 0x18, 0xCC, 0xCF, 0xE7, + 0x82, 0xC8, 0x9A, 0xEA, 0x83, 0xDB, 0xB3, 0xF4, 0xB5, 0xE1, 0xC0, 0xEA, + 0x26, 0xE1, 0xE0, 0xD8, 0x7A, 0xE0, 0x8D, 0xCF, 0x6F, 0xE5, 0x6E, 0xCE, + 0x35, 0xE1, 0x3C, 0xC6, 0x61, 0xE1, 0x82, 0xC4, 0x8A, 0xEB, 0xA5, 0xCA, + 0xAD, 0xF3, 0x48, 0xD2, 0x4C, 0xFD, 0x2E, 0xDB, 0xBB, 0xF4, 0x54, 0xDB, + 0xED, 0xEC, 0x69, 0xE3, 0x8B, 0xE3, 0xFD, 0xE0, 0x16, 0xE2, 0x8B, 0xE3, + 0xC3, 0xE3, 0xD1, 0xE8, 0xFE, 0xDB, 0xB5, 0xE5, 0xF3, 0xDD, 0xA8, 0xEA, + 0x20, 0xDC, 0xE2, 0xE8, 0xD3, 0xDA, 0xCF, 0xEA, 0xDA, 0xD9, 0x3B, 0xEC, + 0x23, 0xDC, 0xFA, 0xE5, 0x9E, 0xE5, 0x27, 0xDB, 0x2D, 0xE8, 0xAE, 0xD0, + 0xB2, 0xF0, 0x5E, 0xCE, 0x4B, 0xF9, 0x6A, 0xCB, 0x7F, 0xF3, 0xB4, 0xC7, + 0x7B, 0xF6, 0xB0, 0xD1, 0x13, 0xF4, 0xF5, 0xD8, 0x84, 0xE7, 0xF0, 0xD8, + 0xBA, 0xDE, 0x18, 0xDE, 0xAA, 0xD9, 0xF1, 0xE6, 0x4A, 0xD7, 0xA1, 0xF1, + 0xCD, 0xD6, 0x2C, 0xF6, 0xBC, 0xE4, 0x3E, 0xFA, 0xE5, 0xF6, 0xF8, 0xFB, + 0x40, 0xFF, 0x79, 0xF8, 0xB6, 0xFE, 0x87, 0xFA, 0x94, 0xF7, 0x8C, 0xF9, + 0x3B, 0xEB, 0x76, 0xEC, 0xF2, 0xE0, 0x3A, 0xDF, 0x77, 0xDF, 0xDF, 0xD8, + 0x3F, 0xE7, 0x6B, 0xD4, 0x77, 0xED, 0x17, 0xD1, 0x95, 0xED, 0xEA, 0xD6, + 0x72, 0xEE, 0x3F, 0xE3, 0xE3, 0xF2, 0x64, 0xEF, 0x73, 0xF6, 0x76, 0xF9, + 0x72, 0xF2, 0x19, 0xFC, 0x31, 0xF5, 0x08, 0x02, 0xD8, 0xF9, 0x55, 0x08, + 0x9C, 0xF4, 0xA2, 0x05, 0x6B, 0xF2, 0x32, 0x05, 0x41, 0xEF, 0xF6, 0x00, + 0x5D, 0xEF, 0x0C, 0xF6, 0xBC, 0xFC, 0x0E, 0xEC, 0xD8, 0x05, 0x17, 0xDE, + 0x63, 0x05, 0x06, 0xD8, 0xE8, 0xFC, 0xE2, 0xD9, 0x80, 0xF6, 0xBA, 0xDD, + 0x63, 0xFB, 0x61, 0xE5, 0x84, 0x03, 0x98, 0xED, 0x16, 0x04, 0x18, 0xF5, + 0x20, 0x04, 0x26, 0xFF, 0x0A, 0xFE, 0x65, 0x00, 0x07, 0xF5, 0xA2, 0xFB, + 0x52, 0xFA, 0x65, 0x01, 0x26, 0xFE, 0x85, 0x08, 0x21, 0xF8, 0x0B, 0x0B, + 0x53, 0xFA, 0xE2, 0x15, 0x8C, 0x00, 0x83, 0x1B, 0x13, 0x05, 0x24, 0x16, + 0x41, 0x09, 0x86, 0x11, 0x77, 0x01, 0x95, 0x09, 0x93, 0xFB, 0x0D, 0x07, + 0x76, 0xFA, 0x1C, 0x01, 0xBC, 0xFB, 0x4E, 0xF8, 0x29, 0x04, 0xAC, 0xF5, + 0xD8, 0x0A, 0x48, 0xF6, 0xE8, 0x08, 0xFD, 0xF5, 0xC2, 0x0F, 0xDD, 0xFA, + 0x15, 0x13, 0x1E, 0xFF, 0xDE, 0x07, 0x64, 0xFA, 0x2D, 0x09, 0x52, 0x02, + 0x65, 0x0A, 0x5E, 0x06, 0x68, 0x0B, 0x06, 0x02, 0xFE, 0x14, 0x2F, 0x09, + 0x90, 0x17, 0x0F, 0x11, 0x71, 0x13, 0x2B, 0x1C, 0xC8, 0x05, 0x41, 0x1B, + 0x08, 0x00, 0xDF, 0x18, 0xB4, 0x00, 0xA1, 0x10, 0x8E, 0x02, 0x3D, 0xFC, + 0xAD, 0x0F, 0x0C, 0xFB, 0xA2, 0x10, 0xD6, 0xF6, 0xEB, 0x12, 0xFC, 0xFB, + 0x48, 0x1A, 0xEF, 0x06, 0x46, 0x0F, 0x9F, 0xFF, 0x83, 0x0A, 0xA5, 0x0B, + 0x00, 0x05, 0x06, 0x18, 0x6B, 0xF5, 0x02, 0x14, 0xB8, 0xF8, 0x9F, 0x1D, + 0xFC, 0xF9, 0x1A, 0x23, 0x17, 0xF7, 0x9C, 0x24, 0xBC, 0xFC, 0x25, 0x29, + 0x88, 0xFD, 0x6E, 0x1E, 0x7D, 0x0D, 0xA2, 0x17, 0x11, 0x1A, 0x99, 0x10, + 0x5A, 0x1A, 0xD6, 0x06, 0x53, 0x14, 0x7F, 0xFA, 0x96, 0x08, 0x50, 0xE8, + 0x26, 0x07, 0x34, 0xDD, 0xB5, 0x0A, 0x51, 0xDC, 0x17, 0x1C, 0xCA, 0xEE, + 0x76, 0x28, 0x8D, 0x01, 0xF7, 0x24, 0x7D, 0x0D, 0xE9, 0x28, 0x58, 0x1F, + 0x77, 0x26, 0xF5, 0x24, 0xC8, 0x18, 0x4C, 0x1C, 0xD3, 0x0D, 0x2C, 0x15, + 0xF5, 0x02, 0xF3, 0x0E, 0xB8, 0x01, 0x4B, 0x0D, 0xFB, 0x05, 0x53, 0x0C, + 0xE8, 0x0E, 0x7C, 0x14, 0xBA, 0x10, 0xE1, 0x1C, 0x7C, 0x10, 0xF2, 0x21, + 0xF3, 0x14, 0xD6, 0x21, 0x40, 0x17, 0xBE, 0x17, 0xF2, 0x1B, 0x85, 0x10, + 0x90, 0x1E, 0x41, 0x0B, 0x8E, 0x1D, 0x64, 0x04, 0x16, 0x1A, 0x7E, 0x02, + 0x41, 0x1A, 0x09, 0x0E, 0x9F, 0x16, 0x55, 0x19, 0xF6, 0x12, 0xD6, 0x23, + 0x1B, 0x0D, 0x77, 0x28, 0x84, 0x0D, 0x6D, 0x28, 0xDB, 0x0C, 0x8D, 0x1E, + 0x85, 0x0B, 0xB2, 0x12, 0x58, 0x09, 0x19, 0x08, 0x01, 0x09, 0x44, 0xFE, + 0xC0, 0x14, 0x00, 0xFC, 0x2F, 0x17, 0x72, 0xF8, 0xE9, 0x16, 0x87, 0xFB, + 0x43, 0x1B, 0x12, 0x05, 0x68, 0x17, 0xC9, 0x06, 0xC1, 0x16, 0x6C, 0x08, + 0xF7, 0x22, 0xE3, 0x11, 0x63, 0x1A, 0x15, 0x0B, 0x5A, 0x14, 0x25, 0x0B, + 0x45, 0x17, 0x0E, 0x0D, 0x32, 0x13, 0xBD, 0x0A, 0x82, 0x11, 0xB4, 0x14, + 0x47, 0x0A, 0xC1, 0x1A, 0xC5, 0x03, 0x4A, 0x1C, 0x22, 0x00, 0x0C, 0x1C, + 0x8E, 0xF9, 0x28, 0x1A, 0x24, 0xF0, 0xD2, 0x17, 0x14, 0xEC, 0xB0, 0x16, + 0x25, 0xF0, 0xE1, 0x14, 0xD4, 0xF3, 0x7D, 0x0A, 0x43, 0x00, 0xDB, 0x02, + 0xD9, 0x0A, 0xAA, 0xFB, 0x2D, 0x14, 0x18, 0xF7, 0xE1, 0x1A, 0xB7, 0xF6, + 0xB9, 0x1D, 0x07, 0x01, 0xE3, 0x1A, 0x07, 0x0C, 0x49, 0x16, 0xA8, 0x0F, + 0x49, 0x1D, 0x18, 0x1A, 0xE6, 0x12, 0x20, 0x1A, 0xA0, 0x07, 0x6A, 0x1A, + 0x92, 0x06, 0x26, 0x1A, 0xF6, 0xFC, 0xB5, 0x12, 0x24, 0xF3, 0xAD, 0x12, + 0x3F, 0xEE, 0x43, 0x16, 0x48, 0xF1, 0x74, 0x17, 0x80, 0xF9, 0x42, 0x13, + 0x38, 0x09, 0x34, 0x13, 0x4D, 0x0D, 0x27, 0x0E, 0x49, 0x0E, 0x7F, 0x0B, + 0x54, 0x18, 0x2A, 0x0A, 0xC5, 0x1D, 0xC8, 0xFE, 0x1D, 0x29, 0xCE, 0x00, + 0x47, 0x31, 0x35, 0x0A, 0x09, 0x30, 0x9D, 0x10, 0xC6, 0x31, 0xF0, 0x1C, + 0x63, 0x25, 0xA0, 0x20, 0x49, 0x13, 0xF8, 0x22, 0x0B, 0x09, 0xED, 0x27, + 0x0A, 0xFC, 0x9F, 0x26, 0x9D, 0xEF, 0x9E, 0x20, 0xAD, 0xF2, 0xE5, 0x21, + 0xB4, 0xFD, 0xDB, 0x21, 0x30, 0x05, 0x96, 0x19, 0x50, 0x0B, 0x0F, 0x15, + 0x89, 0x0A, 0xEB, 0x0B, 0x9B, 0x0E, 0xDE, 0x05, 0xF7, 0x18, 0xD0, 0x01, + 0x78, 0x25, 0x69, 0x04, 0xAC, 0x25, 0x2E, 0x07, 0x7F, 0x1F, 0x03, 0x0B, + 0x79, 0x16, 0xCD, 0x0E, 0xDF, 0x12, 0x88, 0x13, 0x3C, 0x09, 0xE0, 0x10, + 0x95, 0xFF, 0x28, 0x13, 0x18, 0x05, 0x47, 0x1A, 0x64, 0x05, 0x48, 0x18, + 0xD0, 0x05, 0xD7, 0x1F, 0x51, 0x02, 0x42, 0x1E, 0x67, 0x04, 0xB6, 0x19, + 0x31, 0x0E, 0x3E, 0x18, 0x6D, 0x0C, 0x96, 0x0A, 0x9D, 0x13, 0x45, 0x0D, + 0x46, 0x18, 0x81, 0x11, 0xBA, 0x09, 0x46, 0x06, 0x28, 0x0F, 0xDA, 0x0F, + 0x0E, 0x0D, 0x82, 0x0F, 0x5B, 0x0D, 0xD6, 0x11, 0x8F, 0x19, 0x53, 0x1F, + 0xBD, 0x13, 0x1F, 0x1E, 0x31, 0x0E, 0x73, 0x20, 0xBE, 0x05, 0x5C, 0x22, + 0x30, 0xFC, 0x4F, 0x1E, 0x24, 0xFF, 0x3A, 0x19, 0xB3, 0x01, 0x61, 0x11, + 0x1C, 0x06, 0xDB, 0x11, 0x74, 0x04, 0x45, 0x10, 0x40, 0xFC, 0xE5, 0x0E, + 0x08, 0xF6, 0x2D, 0x0E, 0xB5, 0xFA, 0x6D, 0x0C, 0xEB, 0x0A, 0x55, 0x0B, + 0x0D, 0x15, 0x9B, 0x00, 0xB1, 0x25, 0x1B, 0x02, 0x31, 0x2C, 0xA0, 0x02, + 0x18, 0x22, 0x35, 0xFB, 0xE5, 0x1B, 0x26, 0xFB, 0x2E, 0x15, 0xC7, 0xFC, + 0xD3, 0x0B, 0xE0, 0xFE, 0x45, 0x0A, 0x70, 0x06, 0x2C, 0x0C, 0xDB, 0x0E, + 0x8B, 0x01, 0x1F, 0x0E, 0x26, 0xFB, 0x98, 0x0C, 0xFB, 0xFA, 0x93, 0x07, + 0xEC, 0xF5, 0x0B, 0xFE, 0xFD, 0xFA, 0xCC, 0xFC, 0x4A, 0xFF, 0x92, 0xFC, + 0xBE, 0xFA, 0x52, 0xFC, 0x93, 0xFB, 0x41, 0x07, 0x55, 0xF5, 0x10, 0x0C, + 0x76, 0xF4, 0x00, 0x0E, 0x6D, 0xF3, 0x79, 0x0E, 0x37, 0xF2, 0xF6, 0x0D, + 0x1B, 0xF8, 0x8B, 0x0F, 0xC8, 0xF3, 0x98, 0x0C, 0x0B, 0xF2, 0xA2, 0x09, + 0x1A, 0xF5, 0x1B, 0xFF, 0x67, 0xFB, 0xA2, 0xFD, 0x37, 0xF3, 0x64, 0x00, + 0xC4, 0xE7, 0xDC, 0x04, 0x57, 0xE9, 0x8F, 0x0F, 0x4D, 0xE4, 0xCE, 0x09, + 0x74, 0xE9, 0x65, 0x08, 0xE0, 0xEA, 0x64, 0x05, 0xE3, 0xE9, 0x4B, 0xF3, + 0x93, 0xF9, 0xAD, 0xE3, 0xA7, 0x03, 0xB9, 0xD3, 0x30, 0x16, 0x78, 0xD5, + 0xAA, 0x21, 0x3C, 0xE0, 0x4B, 0x14, 0x05, 0xE4, 0xD1, 0x0D, 0x15, 0xF4, + 0x9F, 0x05, 0x91, 0xFC, 0x8C, 0xF9, 0x6D, 0xFB, 0xC6, 0xF4, 0x52, 0xFF, + 0xB0, 0xE6, 0xDC, 0xF7, 0x8E, 0xE3, 0xE0, 0xF4, 0xF6, 0xE8, 0x3C, 0xF1, + 0x22, 0xE4, 0xD8, 0xE3, 0x35, 0xE8, 0x29, 0xEC, 0xDD, 0xDE, 0xE6, 0xEE, + 0x54, 0xD1, 0xA9, 0xE9, 0xCF, 0xD8, 0xB1, 0xED, 0x4B, 0xE6, 0xAD, 0xE2, + 0x87, 0xF9, 0x5A, 0xDA, 0x67, 0x05, 0xC3, 0xDF, 0x19, 0x03, 0x82, 0xDD, + 0xF4, 0x0C, 0xEE, 0xE2, 0x25, 0x0A, 0xE1, 0xE3, 0x7B, 0xFF, 0x4E, 0xE9, + 0x06, 0xFC, 0x71, 0xFC, 0xA4, 0xE5, 0x46, 0x01, 0xD3, 0xDF, 0xD4, 0x13, + 0x3B, 0xE4, 0x72, 0x1C, 0x82, 0xDF, 0xD3, 0x12, 0xC7, 0xE5, 0x3A, 0x10, + 0x4C, 0xE2, 0x3E, 0xF5, 0xFA, 0xEA, 0x5A, 0xE7, 0x81, 0xF5, 0x7A, 0xE3, + 0x1D, 0xF1, 0x50, 0xD8, 0xC2, 0xF8, 0x35, 0xEA, 0xDE, 0xF5, 0xB8, 0xF2, + 0x88, 0xFD, 0x69, 0xFB, 0xE5, 0x09, 0x9C, 0x01, 0x70, 0x06, 0x0D, 0xF5, + 0xCF, 0xFE, 0xA6, 0xF4, 0x33, 0xF2, 0x1E, 0xF7, 0x46, 0xE4, 0xE8, 0xF0, + 0xA1, 0xE2, 0x2C, 0xEE, 0x74, 0xEA, 0x66, 0xF3, 0x74, 0xE7, 0x84, 0xF9, + 0xD7, 0xE6, 0x1C, 0x04, 0x4C, 0xE8, 0x26, 0x06, 0xDA, 0xE1, 0xD9, 0xFB, + 0xE9, 0xE2, 0x75, 0xF4, 0xA5, 0xE2, 0x19, 0xE2, 0xB1, 0xDF, 0x8F, 0xC8, + 0xCB, 0xF0, 0x1E, 0xC7, 0x60, 0xF2, 0x4F, 0xC3, 0xE9, 0xF4, 0x6E, 0xCD, + 0x99, 0x03, 0xF5, 0xE5, 0x23, 0xFC, 0x84, 0xEA, 0x69, 0x01, 0x69, 0xFA, + 0x1F, 0x00, 0x62, 0xF9, 0xB6, 0x01, 0x0A, 0xF6, 0x06, 0x01, 0x84, 0xF2, + 0x2A, 0xF5, 0xBD, 0xE2, 0xCE, 0xF6, 0x90, 0xE1, 0x43, 0xE9, 0x9B, 0xE0, + 0xEF, 0xDE, 0x73, 0xE6, 0x5C, 0xD9, 0x06, 0xEF, 0xF9, 0xD7, 0xAF, 0xFC, + 0x20, 0xE0, 0x4D, 0x08, 0xDB, 0xDC, 0x40, 0xFC, 0xD7, 0xE5, 0xCD, 0xF3, + 0xB4, 0xF0, 0x67, 0xE7, 0x62, 0xF6, 0x41, 0xD3, 0x45, 0x02, 0xAA, 0xCB, + 0x1D, 0x0D, 0xA9, 0xCF, 0x07, 0x0D, 0x4A, 0xD6, 0x52, 0x0A, 0x1E, 0xEA, + 0xF6, 0xFE, 0x32, 0xFA, 0x03, 0xEE, 0xFC, 0xFA, 0xC8, 0xE6, 0xDA, 0xFF, + 0xD2, 0xDC, 0xF5, 0xF8, 0xAE, 0xE6, 0x0C, 0xF4, 0xBE, 0xF0, 0xE3, 0xEE, + 0xFA, 0xF7, 0x38, 0xF3, 0x2E, 0xFF, 0x59, 0xFB, 0x04, 0xF8, 0x0F, 0xFB, + 0x0E, 0xF4, 0x0F, 0xFF, 0x41, 0xF3, 0xE8, 0xFA, 0x4D, 0xF3, 0xA2, 0xEF, + 0x3A, 0xFD, 0xBA, 0xE7, 0x47, 0x01, 0xC0, 0xDC, 0xAB, 0xFE, 0xBD, 0xDB, + 0x07, 0xFD, 0x2B, 0xE2, 0xB4, 0xF8, 0x95, 0xE1, 0xB7, 0xFE, 0xC0, 0xE9, + 0xF7, 0xFA, 0x3E, 0xE8, 0x52, 0xEE, 0x79, 0xE4, 0xA8, 0xEE, 0xF9, 0xF2, + 0x13, 0xE2, 0x3C, 0xEF, 0xA1, 0xE0, 0x26, 0xF6, 0xB1, 0xDD, 0xD9, 0x03, + 0x72, 0xD3, 0x7F, 0x02, 0x88, 0xDE, 0x3F, 0xFF, 0xFF, 0xE3, 0xFB, 0xED, + 0x6E, 0xEB, 0xFF, 0xE5, 0x82, 0xF3, 0x5A, 0xE4, 0x0E, 0xF4, 0x23, 0xDA, + 0xF8, 0xF9, 0x27, 0xD5, 0x17, 0x04, 0x82, 0xD4, 0x0D, 0x07, 0xD0, 0xD1, + 0x5A, 0x03, 0x88, 0xD7, 0x9A, 0xF8, 0xD5, 0xDF, 0xDA, 0xF5, 0x8A, 0xF1, + 0xEC, 0xED, 0x6B, 0xFC, 0x9B, 0xE6, 0x65, 0x04, 0x62, 0xE8, 0x9C, 0x11, + 0xD9, 0xDE, 0x55, 0x0C, 0x3A, 0xE1, 0x93, 0x08, 0x42, 0xE2, 0x89, 0xFC, + 0x26, 0xE0, 0x92, 0xEB, 0x27, 0xEE, 0xBD, 0xE7, 0x2A, 0xEE, 0x27, 0xDB, + 0xAF, 0xF3, 0xB8, 0xD9, 0x69, 0x01, 0x1F, 0xDC, 0xFE, 0x08, 0x46, 0xD9, + 0x01, 0x12, 0xAF, 0xE1, 0x4D, 0x0F, 0xBD, 0xE9, 0xAD, 0x0A, 0xFA, 0xF0, + 0x94, 0x0D, 0xB7, 0xF9, 0xD1, 0xFF, 0x7B, 0xF3, 0xB4, 0xF8, 0x93, 0xF7, + 0x17, 0xEE, 0xDA, 0xF5, 0x50, 0xE0, 0x89, 0xEB, 0x27, 0xE5, 0x6E, 0xEF, + 0xE7, 0xE4, 0x7E, 0xF0, 0xDF, 0xE7, 0x57, 0xF4, 0x1F, 0xF3, 0x88, 0xFA, + 0x3B, 0xF5, 0x5B, 0xF6, 0x12, 0xFC, 0x55, 0xF6, 0xCF, 0x00, 0xBF, 0xF6, + 0x10, 0xF7, 0xC7, 0xEF, 0xA1, 0xF9, 0x12, 0xF9, 0xB8, 0xF7, 0xD0, 0xFA, + 0xFA, 0xF8, 0x4C, 0xFD, 0x29, 0xF6, 0x23, 0xFF, 0x6E, 0xF7, 0x69, 0x03, + 0x96, 0xF9, 0x04, 0x05, 0xD3, 0xED, 0xAC, 0xFE, 0xC5, 0xEA, 0x27, 0x00, + 0xA1, 0xEA, 0x82, 0xFB, 0xF6, 0xE9, 0x6D, 0xF2, 0x22, 0xF3, 0x49, 0xF1, + 0xDF, 0xF5, 0xFD, 0xEB, 0xD2, 0xFA, 0xB2, 0xEC, 0xF1, 0xFC, 0x49, 0xF1, + 0xD6, 0xF3, 0x28, 0xEE, 0x99, 0xF9, 0x7C, 0xF1, 0x73, 0xFD, 0x9F, 0xEB, + 0x64, 0x03, 0x5C, 0xE2, 0xDE, 0x0B, 0xD1, 0xDE, 0xBD, 0x0F, 0x12, 0xE4, + 0x7D, 0x04, 0x0A, 0xE5, 0x6F, 0xFD, 0x9A, 0xEB, 0xB6, 0x08, 0x2D, 0xFB, + 0x82, 0x03, 0x05, 0xF4, 0x41, 0x03, 0xA7, 0xF6, 0x64, 0x05, 0x04, 0xFF, + 0x9C, 0xFE, 0x10, 0xFC, 0x9E, 0xFD, 0x3F, 0x04, 0xDC, 0xF2, 0x4E, 0x07, + 0x0F, 0xE8, 0xA9, 0x09, 0x2B, 0xE8, 0x3C, 0x12, 0xEA, 0xE9, 0x3E, 0x12, + 0x1C, 0xF2, 0x6B, 0x13, 0xD7, 0x00, 0xFD, 0x17, 0x3D, 0x0B, 0x9F, 0x13, + 0x9C, 0x16, 0x9F, 0x09, 0x8B, 0x25, 0xEC, 0x01, 0x25, 0x2A, 0xB8, 0xFE, + 0x5E, 0x25, 0xED, 0x04, 0xC5, 0x15, 0xE4, 0x0F, 0x75, 0x06, 0xBD, 0x1D, + 0x3A, 0x09, 0x30, 0x2B, 0x1D, 0x0C, 0xEC, 0x2D, 0xF9, 0x0D, 0x02, 0x2D, + 0x00, 0x15, 0xBB, 0x2A, 0x6E, 0x0C, 0xB8, 0x1D, 0xCE, 0x06, 0xDB, 0x14, + 0xAC, 0x13, 0x02, 0x19, 0x7E, 0x14, 0x8C, 0x13, 0x81, 0x15, 0x81, 0x14, + 0xDA, 0x18, 0xCA, 0x1B, 0x9B, 0x14, 0xA0, 0x16, 0xFA, 0x16, 0xB3, 0x19, + 0x57, 0x11, 0x3F, 0x17, 0x98, 0x0B, 0xB6, 0x10, 0xA0, 0x0C, 0x7E, 0x10, + 0xC4, 0x15, 0x9B, 0x11, 0xF7, 0x22, 0xA3, 0x11, 0xA6, 0x25, 0x8A, 0x13, + 0xF9, 0x1E, 0x1E, 0x1F, 0xAD, 0x0B, 0x41, 0x23, 0x18, 0x01, 0xD8, 0x25, + 0xB1, 0x03, 0x95, 0x23, 0x28, 0x03, 0xA3, 0x17, 0x32, 0x0F, 0xB2, 0x1B, + 0x55, 0x15, 0xC7, 0x17, 0x01, 0x1C, 0x14, 0x0E, 0x7A, 0x30, 0xEE, 0x0C, + 0x25, 0x32, 0xA5, 0x02, 0xF3, 0x2E, 0x49, 0x09, 0x3D, 0x1F, 0xCE, 0x0C, + 0x68, 0x1D, 0x04, 0x16, 0x7A, 0x22, 0x44, 0x18, 0xA0, 0x23, 0x29, 0x19, + 0x0B, 0x25, 0xEC, 0x24, 0x31, 0x1C, 0x2D, 0x26, 0x0B, 0x19, 0xC8, 0x2B, + 0x39, 0x1A, 0xA6, 0x2A, 0xA8, 0x1B, 0xF5, 0x25, 0xDB, 0x17, 0x1E, 0x21, + 0x03, 0x14, 0xFA, 0x16, 0x46, 0x16, 0x7F, 0x12, 0x71, 0x11, 0x22, 0x0F, + 0x1D, 0x0E, 0xD4, 0x0E, 0x0D, 0x16, 0xC7, 0x15, 0x5A, 0x17, 0x7F, 0x11, + 0x76, 0x1E, 0x8A, 0x12, 0xBD, 0x22, 0x8A, 0x13, 0x85, 0x1D, 0x8F, 0x11, + 0x01, 0x17, 0x9F, 0x1B, 0x94, 0x0E, 0xEE, 0x20, 0x1B, 0x04, 0xDB, 0x1C, + 0x11, 0x0C, 0x6A, 0x23, 0xA4, 0x0E, 0xE8, 0x19, 0x64, 0x16, 0x94, 0x19, + 0xDF, 0x1F, 0x3C, 0x21, 0x41, 0x11, 0x6A, 0x16, 0x9D, 0x10, 0x84, 0x20, + 0xBD, 0x0A, 0x35, 0x23, 0xB2, 0x04, 0xF9, 0x1B, 0x8B, 0x06, 0xBA, 0x17, + 0x34, 0x0F, 0x7C, 0x15, 0xDC, 0x19, 0x5F, 0x0E, 0x0A, 0x21, 0x82, 0x07, + 0xCF, 0x27, 0xDC, 0x0C, 0xB5, 0x18, 0x0B, 0x07, 0x3A, 0x12, 0xCD, 0x09, + 0x64, 0x0B, 0x6D, 0x0A, 0x8C, 0x07, 0x42, 0x0D, 0x30, 0x0D, 0x48, 0x15, + 0x5A, 0x08, 0xCA, 0x11, 0x48, 0x0E, 0xFC, 0x18, 0x0E, 0x0C, 0xA3, 0x18, + 0xA1, 0x0B, 0x34, 0x15, 0xA8, 0x13, 0xE2, 0x16, 0x8F, 0x0B, 0xB6, 0x0F, + 0x7D, 0x10, 0x67, 0x13, 0xF2, 0x15, 0x4C, 0x12, 0x0F, 0x10, 0x1B, 0x0C, + 0x78, 0x15, 0xC5, 0x14, 0x0C, 0x15, 0x26, 0x15, 0x5F, 0x0F, 0xBC, 0x0F, + 0xFD, 0x14, 0xF1, 0x16, 0xB3, 0x0E, 0x1C, 0x16, 0xE5, 0x05, 0xCB, 0x11, + 0xFC, 0x07, 0x3C, 0x17, 0xEB, 0x06, 0x85, 0x18, 0xC0, 0x04, 0x47, 0x19, + 0x58, 0x00, 0x26, 0x1E, 0xF9, 0xFF, 0x6C, 0x26, 0x49, 0xF7, 0x8C, 0x25, + 0x1A, 0xF7, 0xB7, 0x22, 0x2E, 0x03, 0x8A, 0x1D, 0x4D, 0x04, 0x73, 0x0D, + 0x69, 0x0E, 0xA2, 0x09, 0x6F, 0x12, 0x77, 0x00, 0xA1, 0x14, 0xEA, 0xF8, + 0x67, 0x15, 0x05, 0xF7, 0x48, 0x12, 0x28, 0xF5, 0x9E, 0x0F, 0xC7, 0xF9, + 0xA8, 0x0A, 0xCE, 0xFF, 0x96, 0x09, 0xA3, 0x02, 0xA1, 0x11, 0xAE, 0x04, + 0x12, 0x12, 0x27, 0x05, 0x81, 0x10, 0x56, 0x11, 0x4E, 0x08, 0xB3, 0x16, + 0x6A, 0x05, 0xC9, 0x14, 0xE0, 0x12, 0xA9, 0x1A, 0x14, 0x11, 0xB7, 0x10, + 0xCD, 0x12, 0x73, 0x0B, 0x7A, 0x12, 0x54, 0x02, 0x0D, 0x0F, 0x17, 0xF7, + 0x51, 0x0E, 0x41, 0xF6, 0xB4, 0x06, 0x18, 0xF5, 0x10, 0x06, 0x40, 0x03, + 0x87, 0x04, 0xF6, 0x0B, 0x9C, 0x08, 0x7E, 0x0F, 0xC6, 0x0E, 0x86, 0x13, + 0x94, 0x07, 0x75, 0x10, 0xCB, 0xFF, 0x67, 0x13, 0x99, 0xEB, 0xB6, 0x09, + 0xB1, 0xE6, 0x7E, 0x07, 0x5F, 0xEA, 0xD2, 0x09, 0xD0, 0xE6, 0x21, 0x04, + 0x79, 0xEC, 0xC7, 0x05, 0xE0, 0xF3, 0xCE, 0x03, 0x00, 0xF7, 0xC3, 0xF9, + 0x07, 0xF6, 0x97, 0xEF, 0x42, 0x00, 0x59, 0xF1, 0xD8, 0xFD, 0x63, 0xEC, + 0x6F, 0xFC, 0xE8, 0xEA, 0x39, 0x03, 0x9F, 0xEA, 0x39, 0x04, 0xAA, 0xE3, + 0x0E, 0x04, 0x5E, 0xE3, 0xC4, 0xFE, 0x8E, 0xE8, 0x52, 0xF5, 0x33, 0xED, + 0x07, 0xF3, 0x81, 0xF6, 0xAB, 0xF6, 0x93, 0x02, 0x66, 0xF2, 0xF3, 0x04, + 0x8C, 0xF7, 0x2B, 0x0C, 0x37, 0xF7, 0x25, 0x05, 0xE3, 0xF9, 0xB6, 0xFF, + 0xCD, 0xF9, 0x06, 0xFE, 0x74, 0xEC, 0x5E, 0xF4, 0x69, 0xF3, 0x92, 0x00, + 0xEF, 0xEC, 0xB7, 0xFE, 0x2D, 0xF0, 0x7A, 0x02, 0x88, 0xFB, 0x01, 0x08, + 0x1F, 0xF4, 0x85, 0xFB, 0x13, 0xFA, 0x7B, 0xFE, 0x49, 0xF3, 0xCB, 0xF5, + 0x7D, 0xF9, 0xD3, 0xF6, 0x92, 0x03, 0x0E, 0xF8, 0xEB, 0x09, 0x36, 0xF8, + 0x5A, 0x0E, 0xA7, 0xFD, 0x31, 0x08, 0x12, 0xFF, 0x75, 0x02, 0xA5, 0x02, + 0x66, 0xF4, 0x01, 0xF8, 0xD5, 0xEF, 0x86, 0xF0, 0xC6, 0xEB, 0xE9, 0xEC, + 0xC4, 0xE0, 0x9B, 0xE6, 0x9D, 0xE5, 0xEB, 0xEE, 0x15, 0xEA, 0x49, 0xF3, + 0xF0, 0xEA, 0xEC, 0xF3, 0x51, 0xF4, 0x1A, 0xFA, 0xB2, 0xFC, 0x3B, 0xF9, + 0xB4, 0x09, 0xA5, 0xFD, 0x2A, 0x0C, 0x0F, 0xFE, 0x1F, 0x01, 0x23, 0xFB, + 0x47, 0xFA, 0x77, 0xFF, 0xBD, 0xEF, 0x37, 0xFA, 0xA0, 0xEB, 0x6A, 0xF5, + 0x12, 0xEA, 0x3C, 0xF3, 0x7D, 0xE4, 0x92, 0xF1, 0xB8, 0xE9, 0xFC, 0xFB, + 0xC5, 0xE3, 0x5E, 0xFA, 0x74, 0xE8, 0xE9, 0xFD, 0x65, 0xED, 0xAA, 0xFC, + 0x0D, 0xEA, 0x3A, 0xEB, 0x76, 0xF7, 0xBA, 0xE5, 0x0E, 0xF9, 0x8F, 0xDA, + 0x3C, 0xF5, 0x3A, 0xD5, 0xDE, 0xF5, 0xD7, 0xDD, 0xF7, 0xF4, 0xEB, 0xE6, + 0x45, 0xF0, 0x52, 0xE8, 0x7E, 0xF5, 0xB7, 0xED, 0xA6, 0xFB, 0xC9, 0xF0, + 0xC6, 0xF6, 0xD6, 0xEB, 0xA4, 0xF1, 0x30, 0xED, 0x8A, 0xE9, 0x4D, 0xEE, + 0xC8, 0xDF, 0x2C, 0xE6, 0x0D, 0xE6, 0xD5, 0xE3, 0xA7, 0xEE, 0x7C, 0xE7, + 0x65, 0xEE, 0x89, 0xE9, 0x0C, 0xEF, 0x82, 0xEE, 0x51, 0xEC, 0x54, 0xF2, + 0x0E, 0xEB, 0x81, 0xF3, 0x2E, 0xEB, 0x14, 0xF0, 0xCF, 0xE7, 0xFC, 0xEA, + 0x50, 0xE0, 0x44, 0xE5, 0x52, 0xDE, 0x83, 0xDD, 0x0D, 0xE5, 0x64, 0xD9, + 0xC7, 0xE5, 0x7B, 0xD6, 0x12, 0xE9, 0xB8, 0xDC, 0x4E, 0xE6, 0xE3, 0xE1, + 0xB9, 0xE4, 0x25, 0xE8, 0x65, 0xF1, 0x68, 0xF1, 0x58, 0xF4, 0x21, 0xEE, + 0x47, 0xF8, 0xE1, 0xF6, 0x25, 0xEE, 0x1B, 0xF8, 0x11, 0xE7, 0xDD, 0xF2, + 0x58, 0xEF, 0x1B, 0xF0, 0xDC, 0xEE, 0x24, 0xE1, 0x89, 0xF6, 0x49, 0xE0, + 0x22, 0xF5, 0x05, 0xE1, 0x81, 0xF4, 0xEC, 0xE0, 0x76, 0xF4, 0xAC, 0xDD, + 0xBC, 0xF4, 0x33, 0xE6, 0x46, 0xEB, 0x5D, 0xEE, 0xB8, 0xDE, 0xF2, 0xF3, + 0x06, 0xE4, 0xC9, 0x01, 0xA8, 0xE2, 0x73, 0xFC, 0x76, 0xEE, 0xE7, 0xFC, + 0x82, 0xF3, 0x7D, 0xF8, 0xA9, 0xEE, 0x83, 0xEF, 0xE7, 0xF1, 0x49, 0xEB, + 0x14, 0xF4, 0x11, 0xE8, 0xE9, 0xF1, 0x8C, 0xE7, 0xB5, 0xF6, 0xCF, 0xEE, + 0xE2, 0xFA, 0x03, 0xF4, 0xEF, 0xFA, 0x71, 0xF6, 0x21, 0x02, 0x31, 0xFF, + 0x89, 0xFE, 0xB5, 0xFA, 0x1A, 0xF5, 0x7B, 0xF2, 0xC3, 0xED, 0x52, 0xF5, + 0xA1, 0xDE, 0x94, 0xEE, 0x35, 0xDC, 0x85, 0xE8, 0x33, 0xE7, 0x17, 0xED, + 0x7E, 0xEC, 0xD6, 0xF2, 0xCB, 0xEE, 0x6A, 0xFD, 0xC9, 0xEE, 0x73, 0x04, + 0x19, 0xEB, 0x62, 0xFE, 0x1F, 0xEF, 0x92, 0xF2, 0xD3, 0xF7, 0x3C, 0xE7, + 0xF8, 0xF9, 0xC8, 0xDE, 0x81, 0x02, 0xBF, 0xE3, 0x88, 0x00, 0x4D, 0xE4, + 0x53, 0x01, 0x6C, 0xEC, 0x41, 0x01, 0x0E, 0xF2, 0xF4, 0xF6, 0xF0, 0xEA, + 0x58, 0xFA, 0x2E, 0xF3, 0x16, 0xEF, 0xEB, 0xEB, 0xAB, 0xF1, 0x4E, 0xEC, + 0xC8, 0xF2, 0x75, 0xE9, 0xED, 0xEF, 0x43, 0xDF, 0x1A, 0xFE, 0x5B, 0xDF, + 0x05, 0x01, 0xAA, 0xD7, 0x56, 0x08, 0xFA, 0xDD, 0x28, 0x08, 0x70, 0xE6, + 0xF9, 0xFE, 0xEC, 0xEE, 0x78, 0xFE, 0xE6, 0xFF, 0x7C, 0xF9, 0x4D, 0x05, + 0xD3, 0xFA, 0x9F, 0x0E, 0x06, 0xF1, 0xA5, 0x0D, 0x26, 0xF0, 0x45, 0x10, + 0x0E, 0xF1, 0x1F, 0x0C, 0xF4, 0xEB, 0xB4, 0x00, 0x73, 0xF7, 0x8B, 0x05, + 0xC2, 0xF4, 0xB6, 0xFF, 0x83, 0xF4, 0x87, 0x00, 0x60, 0xF7, 0x70, 0x01, + 0x5D, 0xF3, 0x48, 0xFB, 0x71, 0xF3, 0x4F, 0xFA, 0x5E, 0xF1, 0xDE, 0xF4, + 0x2D, 0xF4, 0x76, 0xF1, 0x46, 0xF8, 0xD4, 0xF0, 0x4E, 0xFC, 0xF0, 0xF3, + 0x4F, 0x02, 0x71, 0xFA, 0x97, 0x01, 0x33, 0xFB, 0xDD, 0x01, 0x68, 0xFD, + 0xE8, 0xF9, 0x3D, 0xF5, 0x16, 0xFA, 0x11, 0xF2, 0xB5, 0x02, 0x7E, 0xF2, + 0x07, 0x04, 0x7A, 0xEE, 0x55, 0x09, 0x7A, 0xF8, 0x97, 0x0C, 0xD0, 0xFD, + 0xF3, 0x11, 0x46, 0xFE, 0xA8, 0x11, 0x20, 0xFD, 0x1A, 0x06, 0xE3, 0xFB, + 0xE1, 0xFA, 0x91, 0xFA, 0xF9, 0xF4, 0x8D, 0xF2, 0x40, 0xF8, 0xD9, 0xEE, + 0xBB, 0xFA, 0xA7, 0xF0, 0x0B, 0xF0, 0x06, 0xEF, 0x7C, 0xEF, 0x8C, 0xF6, + 0x3C, 0xF5, 0xD9, 0xFA, 0x67, 0xF7, 0xE2, 0xF7, 0xA8, 0x00, 0x30, 0x00, + 0x25, 0x00, 0xDA, 0x01, 0x9D, 0x08, 0x35, 0x0A, 0x3E, 0x0A, 0xD6, 0x06, + 0x81, 0x0D, 0x99, 0x07, 0x37, 0x0F, 0xEE, 0x0B, 0x26, 0x04, 0x16, 0x03, + 0xFA, 0x07, 0x61, 0x05, 0x04, 0x06, 0x9B, 0xFF, 0x60, 0x04, 0x6C, 0xFB, + 0x3F, 0x0D, 0x7D, 0xFF, 0x71, 0x0E, 0x97, 0x00, 0x37, 0x11, 0x0D, 0x09, + 0xB7, 0x0B, 0x12, 0x06, 0x85, 0x0E, 0x6F, 0x04, 0xF9, 0x13, 0x6D, 0x03, + 0x22, 0x0F, 0xB8, 0xFE, 0x89, 0x0B, 0x29, 0x06, 0x30, 0xFD, 0xF2, 0x05, + 0x74, 0x07, 0xE6, 0x14, 0x00, 0x01, 0x65, 0x0D, 0x42, 0x02, 0x73, 0x12, + 0x04, 0x10, 0x89, 0x21, 0xD5, 0x07, 0xC9, 0x10, 0xA3, 0x18, 0xE5, 0x19, + 0x48, 0x17, 0x7F, 0x14, 0x2D, 0x10, 0xEE, 0x0B, 0x77, 0x0C, 0x23, 0x0A, + 0x54, 0x03, 0xCA, 0x03, 0x07, 0x00, 0x6C, 0x02, 0xF8, 0xF7, 0x8D, 0xFA, + 0x80, 0xFD, 0x36, 0x01, 0xF1, 0xFE, 0x8A, 0x03, 0xF5, 0xFA, 0x81, 0x01, + 0x73, 0x03, 0x4E, 0x0B, 0xDD, 0xFC, 0xA3, 0x02, 0x1B, 0xFD, 0xD4, 0xFF, + 0x9C, 0x03, 0x22, 0x04, 0x68, 0xFE, 0x1A, 0xFD, 0xA1, 0x07, 0x4C, 0x05, + 0x63, 0x0C, 0xF7, 0x06, 0xC7, 0x12, 0x1B, 0x07, 0x63, 0x17, 0xD3, 0x02, + 0x56, 0x1B, 0x58, 0xFE, 0xE6, 0x1A, 0x2D, 0xFA, 0xF6, 0x0F, 0xF7, 0xF3, + 0xFD, 0x03, 0x47, 0xFA, 0x69, 0xF7, 0xFD, 0x01, 0xFC, 0xF4, 0xDA, 0x06, + 0xFC, 0xF9, 0x21, 0x09, 0x45, 0xFE, 0x23, 0x0C, 0xE1, 0xFA, 0x36, 0x0A, + 0xB1, 0xFD, 0xC3, 0x0A, 0xB3, 0xFF, 0x4E, 0x0C, 0xCD, 0xF8, 0xB7, 0x0C, + 0x59, 0xFC, 0x8C, 0x14, 0x58, 0xFD, 0x27, 0x10, 0xF7, 0x01, 0x5C, 0x0C, + 0xCC, 0x08, 0x7E, 0x0C, 0x96, 0x07, 0x96, 0x04, 0x74, 0x0B, 0x32, 0x07, + 0x5F, 0x04, 0xAB, 0x05, 0xE0, 0x03, 0xF6, 0x03, 0x6E, 0x0C, 0xD8, 0x05, + 0xEC, 0x0A, 0x20, 0x01, 0x21, 0x16, 0x5B, 0x0B, 0x07, 0x12, 0xF0, 0x0D, + 0x8A, 0x09, 0xB9, 0x16, 0xA0, 0x07, 0x85, 0x23, 0xCB, 0x04, 0x4E, 0x24, + 0xE7, 0x04, 0x77, 0x21, 0x5B, 0x06, 0x0F, 0x1C, 0x30, 0x0A, 0x41, 0x12, + 0x8E, 0x13, 0x08, 0x0C, 0xF2, 0x1B, 0xFB, 0x0B, 0x0A, 0x16, 0x61, 0x09, + 0xE9, 0x0F, 0x81, 0x0C, 0x8C, 0x0B, 0xC4, 0x09, 0xF5, 0x10, 0xB9, 0x0C, + 0x3F, 0x11, 0xD1, 0x0E, 0xD4, 0x0D, 0x9D, 0x12, 0x7D, 0x0C, 0x8C, 0x18, + 0x1F, 0x05, 0xC6, 0x0F, 0x92, 0x0D, 0x06, 0x10, 0xE4, 0x10, 0x9A, 0x0F, + 0x7F, 0x05, 0xC5, 0x07, 0xC7, 0x07, 0x7B, 0x0E, 0x7A, 0x06, 0xE6, 0x0D, + 0xEA, 0x02, 0x4A, 0x06, 0x20, 0x07, 0x03, 0x03, 0x50, 0x0A, 0x3B, 0x00, + 0x30, 0x03, 0xD1, 0xFA, 0xB5, 0x00, 0xA1, 0xFB, 0xDB, 0x06, 0x77, 0x02, + 0x3E, 0x08, 0xE3, 0x04, 0x96, 0x08, 0xEF, 0x0B, 0x5D, 0x0B, 0xF7, 0x17, + 0x39, 0x07, 0xFA, 0x17, 0x63, 0x06, 0x35, 0x16, 0xE9, 0x12, 0xC8, 0x1E, + 0xD2, 0x0B, 0x10, 0x18, 0xE9, 0xFF, 0x3F, 0x10, 0x02, 0x0D, 0x50, 0x19, + 0xC6, 0x08, 0x01, 0x09, 0xC0, 0x10, 0x00, 0x09, 0x6E, 0x1B, 0x68, 0x13, + 0x7B, 0x0D, 0x97, 0x0B, 0x9E, 0x09, 0xCC, 0x0E, 0x76, 0x0A, 0x9D, 0x10, + 0x9A, 0x07, 0xEC, 0x08, 0xE0, 0x0B, 0xF6, 0x06, 0x20, 0x11, 0x23, 0x07, + 0x9C, 0x0A, 0xBF, 0xFF, 0x61, 0x10, 0xC2, 0x09, 0x00, 0x11, 0xEA, 0x09, + 0x4F, 0x0C, 0xE0, 0x02, 0x4F, 0x13, 0x62, 0x0C, 0x85, 0x15, 0x3C, 0x12, + 0x73, 0x1D, 0xFD, 0x1B, 0xDD, 0x1B, 0xC7, 0x19, 0x04, 0x1E, 0x97, 0x1B, + 0xE2, 0x15, 0xD7, 0x18, 0x8F, 0x00, 0x49, 0x0D, 0xB7, 0x04, 0xC8, 0x19, + 0xAF, 0xF7, 0x9A, 0x12, 0xB7, 0xF0, 0x49, 0x10, 0x2D, 0xF9, 0x68, 0x1C, + 0x11, 0xF7, 0x1B, 0x17, 0x82, 0x03, 0x77, 0x16, 0x3B, 0x0E, 0x76, 0x12, + 0x03, 0x10, 0x57, 0x0E, 0x99, 0x11, 0x59, 0x0F, 0x47, 0x14, 0x93, 0x12, + 0xBD, 0x09, 0x01, 0x0A, 0xCD, 0x06, 0x3F, 0x06, 0x3B, 0x0D, 0x27, 0x0C, + 0x54, 0x02, 0xA9, 0x03, 0xDF, 0x0B, 0x28, 0x0E, 0xA6, 0x11, 0xF1, 0x11, + 0x49, 0x0E, 0xFD, 0x07, 0xAB, 0x1A, 0x3F, 0x0C, 0x82, 0x15, 0x89, 0x08, + 0x9F, 0x06, 0xDA, 0x03, 0x0E, 0x06, 0x26, 0x0A, 0x60, 0x06, 0x7B, 0x09, + 0xC2, 0x05, 0x65, 0x03, 0x52, 0x14, 0xB4, 0x0B, 0x15, 0x1B, 0x1F, 0x0E, + 0xA7, 0x1B, 0x86, 0x0B, 0xDA, 0x20, 0x49, 0x12, 0xC7, 0x18, 0x59, 0x16, + 0x2E, 0x0C, 0x92, 0x17, 0xD0, 0x01, 0xDD, 0x13, 0x6C, 0x01, 0xC4, 0x13, + 0x68, 0x03, 0xFD, 0x0F, 0x2A, 0x09, 0x32, 0x12, 0xD2, 0x0F, 0x3E, 0x1C, + 0x34, 0x10, 0xCE, 0x1B, 0xED, 0x13, 0x75, 0x18, 0x5E, 0x10, 0xDE, 0x0F, + 0x4C, 0x0E, 0xD7, 0x09, 0x85, 0x10, 0x65, 0x06, 0xFD, 0x0A, 0xB2, 0xFC, + 0xD3, 0x12, 0xB5, 0x02, 0x57, 0x13, 0x3F, 0x06, 0xE7, 0x07, 0x89, 0x06, + 0x46, 0xFF, 0x6C, 0x0C, 0x41, 0xF5, 0x33, 0x0C, 0x3F, 0xF3, 0xF2, 0x0B, + 0x46, 0xF8, 0x7D, 0x0C, 0xED, 0x01, 0x89, 0x12, 0x5C, 0x02, 0x39, 0x13, + 0x6C, 0x00, 0xA6, 0x10, 0xC3, 0x04, 0x97, 0x10, 0x0F, 0x04, 0xFF, 0x0B, + 0x8A, 0xFD, 0x3A, 0x08, 0x02, 0xFA, 0xF5, 0x07, 0xC3, 0xFA, 0x05, 0x03, + 0xCB, 0xFD, 0x1D, 0xFB, 0x7D, 0x06, 0xAB, 0xFA, 0x26, 0x0A, 0xD9, 0xF9, + 0xA3, 0x06, 0x59, 0xF7, 0x8B, 0x08, 0x31, 0xFD, 0x9C, 0x04, 0xD1, 0xFE, + 0x42, 0x00, 0xAB, 0x03, 0x3B, 0x00, 0x4F, 0x0B, 0x85, 0xF9, 0xD5, 0x06, + 0xB3, 0xFA, 0x7E, 0x08, 0x68, 0xF9, 0x2F, 0x02, 0x91, 0xFA, 0x2F, 0xF7, + 0x3E, 0x04, 0xB6, 0xF6, 0x2A, 0xFD, 0xE8, 0xEA, 0xE8, 0xF8, 0xC1, 0xE6, + 0x70, 0x03, 0xDC, 0xF4, 0x8E, 0xFF, 0xDF, 0xF0, 0xDF, 0x01, 0xB4, 0xF1, + 0xE5, 0x0B, 0x5B, 0xFE, 0x1F, 0x00, 0x62, 0xF3, 0x46, 0xF9, 0xC5, 0xEA, + 0xFF, 0xF8, 0xC0, 0xEA, 0xC2, 0xEF, 0x78, 0xE4, 0xC2, 0xE4, 0x71, 0xE4, + 0xBE, 0xDE, 0xD2, 0xEA, 0xA1, 0xDF, 0x21, 0xE8, 0x5F, 0xE4, 0x51, 0xE4, + 0xB2, 0xE0, 0x12, 0xE4, 0x38, 0xE4, 0x8E, 0xEC, 0x4A, 0xE8, 0x3B, 0xF0, + 0x00, 0xE8, 0x30, 0xEF, 0x28, 0xF6, 0xEE, 0xFA, 0x16, 0xF6, 0x46, 0xF8, + 0x0B, 0xEE, 0x98, 0xF0, 0x23, 0xF0, 0xD5, 0xF3, 0x1B, 0xE7, 0x0F, 0xED, + 0xD9, 0xE7, 0x05, 0xED, 0xB8, 0xE9, 0x7D, 0xE6, 0xF2, 0xE7, 0xE5, 0xDC, + 0xDE, 0xF2, 0x08, 0xE4, 0x27, 0xF0, 0xD0, 0xDD, 0xC0, 0xF2, 0xBB, 0xE1, + 0xFC, 0xF5, 0xB7, 0xEA, 0x2C, 0xF1, 0xE0, 0xE8, 0x69, 0xF0, 0x77, 0xEA, + 0xD5, 0xEF, 0xF3, 0xEC, 0xE1, 0xF4, 0x0A, 0xEF, 0x3B, 0xF1, 0xC3, 0xE4, + 0xAB, 0xF7, 0x5C, 0xE9, 0x78, 0x01, 0x2B, 0xF3, 0x73, 0xF5, 0x94, 0xE4, + 0xA8, 0xFA, 0x22, 0xE9, 0xB2, 0xFB, 0x0D, 0xEC, 0x62, 0xF1, 0x8E, 0xDF, + 0xA9, 0xF6, 0xE5, 0xDE, 0x69, 0xF5, 0xE0, 0xD8, 0x65, 0xF6, 0x9C, 0xD8, + 0xE0, 0xE7, 0x38, 0xD3, 0xEF, 0xDE, 0xEB, 0xDC, 0x53, 0xDC, 0x97, 0xE9, + 0xFB, 0xD2, 0xF3, 0xE7, 0xA6, 0xE0, 0xDD, 0xF5, 0x9C, 0xE4, 0xA4, 0xF5, + 0x6A, 0xE5, 0x25, 0xF8, 0x96, 0xE7, 0xD8, 0x00, 0xF0, 0xE3, 0xB5, 0xFD, + 0x6D, 0xE4, 0x74, 0xF9, 0xEB, 0xE3, 0xDF, 0xF1, 0xB5, 0xEA, 0x34, 0xEB, + 0xF3, 0xEE, 0x18, 0xE1, 0xF4, 0xF6, 0x73, 0xDE, 0x3B, 0xFD, 0x19, 0xE3, + 0x9E, 0xF5, 0x1E, 0xED, 0xB3, 0xEB, 0xC2, 0xFB, 0x27, 0xE9, 0x8E, 0x03, + 0xAF, 0xED, 0x3F, 0x07, 0xAD, 0xEA, 0x53, 0x04, 0x42, 0xE6, 0x5E, 0x00, + 0xB8, 0xE2, 0x8C, 0xFB, 0x03, 0xE1, 0x7D, 0xF3, 0x27, 0xEA, 0x46, 0xF0, + 0x90, 0xEF, 0xB9, 0xF0, 0x0F, 0xF6, 0x16, 0xF6, 0xA2, 0xF8, 0x76, 0xF0, + 0xFB, 0xFE, 0x72, 0xEF, 0xD4, 0x06, 0x0F, 0xF2, 0x15, 0x03, 0x39, 0xE5, + 0x9E, 0x03, 0x62, 0xDF, 0x57, 0x02, 0xCD, 0xDC, 0x81, 0xFF, 0x33, 0xDB, + 0x04, 0xFF, 0xE5, 0xE4, 0x47, 0xFA, 0x32, 0xED, 0xEC, 0xFF, 0x80, 0xF9, + 0x78, 0xFA, 0x40, 0xF9, 0xB5, 0xF4, 0xB3, 0xF2, 0x46, 0x07, 0xDF, 0xFE, + 0x9F, 0x01, 0x08, 0xFB, 0x13, 0xF1, 0x9A, 0xF7, 0xCB, 0xF2, 0xF9, 0x08, + 0xFA, 0xF0, 0xA5, 0x0D, 0x37, 0xEF, 0x59, 0x05, 0xA1, 0xF6, 0x8C, 0x02, + 0xA5, 0xFC, 0xB5, 0x05, 0xE9, 0xF1, 0xAA, 0xFF, 0x1D, 0xEF, 0x9F, 0xFC, + 0xD6, 0xF9, 0x5F, 0xFC, 0x9E, 0x02, 0x6D, 0xFB, 0x55, 0xFF, 0x24, 0xF7, + 0x10, 0xFC, 0xA6, 0xF3, 0xA5, 0x02, 0x6B, 0xF7, 0x1F, 0xFE, 0xFD, 0xF3, + 0xEF, 0xF8, 0xA0, 0xF4, 0x24, 0xF6, 0xA0, 0xF9, 0xE7, 0xEF, 0xCB, 0xF4, + 0x8D, 0xF1, 0x60, 0xF0, 0xE4, 0xFA, 0x36, 0xF0, 0xC9, 0x02, 0x22, 0xEC, + 0x27, 0xFD, 0x45, 0xE6, 0xAB, 0xFA, 0x13, 0xF0, 0x17, 0xF8, 0xB4, 0xF4, + 0xE0, 0xF6, 0x30, 0xF0, 0x1D, 0xFE, 0x2E, 0xF1, 0x2D, 0x00, 0x03, 0xF0, + 0xE9, 0x00, 0x14, 0xF0, 0x09, 0x07, 0x01, 0xF9, 0xF5, 0x0A, 0xCD, 0xFD, + 0xFA, 0xFE, 0x54, 0xF5, 0xCC, 0xFB, 0x88, 0xFB, 0xBB, 0xF9, 0x7E, 0x02, + 0xC1, 0xE9, 0x48, 0xFB, 0x3F, 0xEB, 0x21, 0x00, 0x7A, 0xEB, 0x00, 0xFD, + 0x44, 0xEA, 0xBF, 0xF9, 0x34, 0xEC, 0xA4, 0xFF, 0x64, 0xED, 0x5C, 0xFB, + 0xDF, 0xFC, 0xEB, 0xFB, 0xDD, 0xFF, 0x77, 0xF7, 0x2D, 0x04, 0xE9, 0xF1, + 0xCF, 0x0C, 0x55, 0xF3, 0xBC, 0xFA, 0xB9, 0xE7, 0xC9, 0xF3, 0x93, 0xE8, + 0x38, 0xF4, 0xED, 0xEB, 0x27, 0xF3, 0x11, 0xEE, 0x5D, 0xF4, 0xB9, 0xF0, + 0x83, 0xF7, 0x97, 0xED, 0x67, 0x09, 0x57, 0xF6, 0x3C, 0x0A, 0x5B, 0xEE, + 0xAD, 0x0E, 0xFC, 0xF6, 0xAD, 0x0D, 0xAF, 0x08, 0xCD, 0xF7, 0xFD, 0x03, + 0x97, 0xF3, 0x02, 0x0B, 0x25, 0xEF, 0x3F, 0x0B, 0x2D, 0xEC, 0x00, 0x09, + 0x8E, 0xF3, 0x5D, 0x0C, 0x0E, 0xFC, 0x27, 0x0D, 0x8B, 0x06, 0x91, 0x11, + 0xDE, 0x04, 0xD6, 0x0A, 0x32, 0x04, 0x95, 0x0B, 0x8D, 0xF5, 0x26, 0x04, + 0x45, 0xEA, 0xE1, 0xFD, 0x55, 0xEA, 0xE4, 0x01, 0xCD, 0xEA, 0x11, 0x08, + 0xE5, 0xEC, 0xF8, 0x0A, 0x21, 0xF1, 0x06, 0x08, 0xDE, 0xFD, 0xFC, 0x07, + 0x93, 0xFF, 0x9E, 0xF7, 0x18, 0x0B, 0x5B, 0xF3, 0x6A, 0x11, 0xD4, 0xF1, + 0xFD, 0x07, 0x2B, 0xE8, 0x72, 0x07, 0x42, 0xEF, 0x8C, 0x02, 0x9D, 0xF3, + 0x97, 0x01, 0x52, 0xF9, 0x94, 0x00, 0x60, 0xFB, 0xD8, 0x01, 0x84, 0xFA, + 0x15, 0x09, 0x4C, 0x00, 0x56, 0x08, 0xC4, 0xFD, 0x98, 0x0A, 0xA7, 0xFF, + 0x61, 0x07, 0x7F, 0x01, 0x15, 0xFF, 0x5F, 0xFF, 0xBD, 0xFE, 0x38, 0x03, + 0x79, 0xFF, 0x72, 0x04, 0xF1, 0x02, 0xF8, 0x06, 0x32, 0x05, 0x18, 0x08, + 0xBC, 0x00, 0x97, 0xFE, 0x49, 0x08, 0xCF, 0xFD, 0xD5, 0x0D, 0x15, 0xFD, + 0x60, 0x04, 0x1D, 0xF3, 0xD7, 0x05, 0x94, 0xF8, 0x65, 0x08, 0xD4, 0x03, + 0xAE, 0xFF, 0x35, 0x00, 0xE1, 0x02, 0xB5, 0x08, 0x6A, 0x02, 0xFE, 0x10, + 0x4F, 0xFB, 0x27, 0x0F, 0x93, 0xF7, 0xBF, 0x0E, 0x26, 0xFB, 0xA0, 0x0B, + 0x64, 0x01, 0x29, 0x04, 0x75, 0x00, 0xC9, 0xFD, 0x78, 0x06, 0xB0, 0x02, + 0x0C, 0x10, 0x7A, 0x09, 0x2F, 0x10, 0xB9, 0x08, 0x12, 0x12, 0xFF, 0x0A, + 0x98, 0x12, 0x42, 0x09, 0x55, 0x06, 0x4F, 0x00, 0xE4, 0x02, 0xE1, 0x03, + 0xD1, 0xFC, 0x3C, 0x01, 0x1A, 0xFF, 0x3B, 0x04, 0x53, 0x0B, 0xC5, 0x0D, + 0x38, 0x0C, 0xB0, 0x0D, 0xED, 0x12, 0xE8, 0x15, 0x73, 0x12, 0x30, 0x19, + 0xC2, 0x07, 0xF6, 0x12, 0xF5, 0x09, 0x8D, 0x16, 0x15, 0x0B, 0xEE, 0x17, + 0x52, 0x08, 0x99, 0x10, 0xA0, 0x18, 0x61, 0x18, 0x6D, 0x17, 0x28, 0x12, + 0x94, 0x10, 0xB1, 0x0D, 0x8D, 0x15, 0xB1, 0x1C, 0x88, 0x01, 0xFF, 0x14, + 0x13, 0xFE, 0x5E, 0x1A, 0x40, 0x06, 0xCC, 0x20, 0x17, 0xFE, 0x28, 0x12, + 0xFA, 0x02, 0xB3, 0x10, 0xC5, 0x08, 0xA5, 0x0B, 0xC1, 0x0F, 0xA1, 0x05, + 0xBC, 0x11, 0xF2, 0xFC, 0x49, 0x16, 0x58, 0x00, 0xD6, 0x11, 0x71, 0x04, + 0x73, 0x06, 0x66, 0x05, 0x17, 0x09, 0xDE, 0x11, 0x4E, 0x05, 0xA1, 0x11, + 0xA6, 0x07, 0x3B, 0x14, 0xA9, 0x0B, 0x66, 0x13, 0xFB, 0x07, 0xA9, 0x0A, + 0xC4, 0x0E, 0x19, 0x0C, 0xF6, 0x12, 0x46, 0x0A, 0xDD, 0x14, 0xCC, 0x09, + 0xD5, 0x14, 0xA6, 0x0A, 0x9D, 0x12, 0x91, 0x0D, 0x8D, 0x17, 0x76, 0x11, + 0xF2, 0x11, 0x70, 0x08, 0xE2, 0x07, 0x7D, 0x01, 0xFD, 0x06, 0x9D, 0x01, + 0xB7, 0x07, 0x79, 0xFD, 0xAF, 0x09, 0xA0, 0xFB, 0xE8, 0x14, 0xE5, 0x06, + 0x21, 0x15, 0xB2, 0x08, 0xD4, 0x0B, 0x4A, 0x09, 0x16, 0x0E, 0xB5, 0x17, + 0xC6, 0x09, 0x98, 0x19, 0xC1, 0x08, 0xEA, 0x19, 0x56, 0x0B, 0xCD, 0x1B, + 0x43, 0x02, 0x56, 0x16, 0xF7, 0x09, 0x05, 0x1A, 0x4B, 0x0F, 0x16, 0x13, + 0xBD, 0x12, 0xE7, 0x0C, 0x20, 0x1B, 0x8C, 0x0E, 0x5C, 0x16, 0x61, 0x07, + 0x04, 0x18, 0xDC, 0x0B, 0xEE, 0x0C, 0x70, 0x06, 0xC8, 0x03, 0xF6, 0x07, + 0x83, 0x02, 0xA7, 0x12, 0x7E, 0xF0, 0x21, 0x04, 0x2D, 0xF2, 0x8A, 0x04, + 0x2B, 0xFD, 0x27, 0x07, 0xF5, 0xFC, 0x97, 0xFC, 0x49, 0x02, 0xB8, 0x04, + 0xC6, 0xFF, 0xE8, 0x05, 0x4C, 0x05, 0x80, 0x08, 0x73, 0x0F, 0x0C, 0x10, + 0x56, 0x0A, 0xAF, 0x08, 0x24, 0x0A, 0x41, 0x07, 0xB5, 0x07, 0xE0, 0x04, + 0xF5, 0xFE, 0x75, 0xFB, 0xBA, 0x00, 0xFD, 0xFD, 0xDF, 0x0C, 0x5C, 0x07, + 0x3F, 0x05, 0x97, 0xFC, 0xAA, 0x04, 0x14, 0x00, 0xE5, 0x08, 0x2F, 0x03, + 0xFA, 0x00, 0x3E, 0xFB, 0x0A, 0x05, 0x1A, 0x07, 0x25, 0xFD, 0x4B, 0x06, + 0x9D, 0xF3, 0x24, 0x04, 0x85, 0xFA, 0x87, 0x0B, 0x76, 0xFA, 0x25, 0x00, + 0x14, 0xFD, 0xD2, 0xFA, 0x82, 0xFC, 0x57, 0xFE, 0x7B, 0xF6, 0x67, 0xFF, + 0x85, 0xF9, 0x48, 0x06, 0x16, 0x02, 0x69, 0x07, 0xFC, 0x12, 0x7B, 0x0E, + 0xF2, 0x17, 0x5C, 0x14, 0x64, 0x14, 0xF6, 0x11, 0x2B, 0x13, 0xFE, 0x12, + 0x36, 0x11, 0x0A, 0x12, 0xB1, 0x0F, 0x89, 0x0E, 0x61, 0x04, 0x3A, 0x02, + 0xA2, 0x07, 0xD0, 0x01, 0xCC, 0x0F, 0xEF, 0x06, 0x54, 0x08, 0xAE, 0x01, + 0x15, 0x0D, 0x0D, 0x0D, 0x58, 0x09, 0x8E, 0x12, 0x0F, 0xFF, 0xC7, 0x11, + 0x78, 0x03, 0x46, 0x17, 0x0F, 0x04, 0x36, 0x17, 0x90, 0x06, 0xF9, 0x1D, + 0x32, 0x0D, 0x0B, 0x26, 0xF3, 0x05, 0x13, 0x24, 0xB3, 0x02, 0x48, 0x27, + 0xAB, 0x02, 0x45, 0x26, 0x3B, 0xFC, 0x8E, 0x16, 0x1A, 0x03, 0x3C, 0x10, + 0x7F, 0x08, 0x90, 0x0F, 0x6F, 0x03, 0x9A, 0x06, 0xAC, 0x09, 0x83, 0x03, + 0x88, 0x11, 0xB6, 0x00, 0xD9, 0x15, 0x31, 0x01, 0x48, 0x0F, 0x89, 0xFD, + 0x12, 0x06, 0xC6, 0xFD, 0x50, 0x06, 0xDD, 0x04, 0x6A, 0x03, 0xB0, 0xFE, + 0x72, 0x08, 0xAE, 0x01, 0x48, 0x0B, 0xA3, 0x05, 0xDC, 0x06, 0x9D, 0x01, + 0x44, 0x09, 0x77, 0x02, 0x13, 0x0E, 0x78, 0x00, 0xB5, 0x0A, 0xDA, 0xF6, + 0x83, 0x07, 0x72, 0xEF, 0x77, 0x0B, 0x6C, 0xEF, 0xBE, 0x0F, 0x77, 0xF0, + 0x28, 0x15, 0x18, 0xF7, 0x80, 0x13, 0xDE, 0x00, 0xDA, 0x09, 0x5D, 0x06, + 0x4F, 0x04, 0x22, 0x0A, 0xB4, 0xFD, 0x5F, 0x07, 0x92, 0xF7, 0xEC, 0x03, + 0x2D, 0xF6, 0x93, 0x07, 0xCD, 0xF1, 0x80, 0x0E, 0x49, 0xF0, 0x88, 0x13, + 0xD3, 0xF4, 0xEF, 0x13, 0x17, 0xFC, 0x37, 0x15, 0xF5, 0xF7, 0x04, 0x07, + 0x2A, 0xF9, 0x2A, 0x00, 0x42, 0xFE, 0xF1, 0x03, 0x6B, 0xFC, 0xCA, 0xFE, + 0xF9, 0xFF, 0xDA, 0x01, 0x4E, 0xFE, 0x7A, 0x03, 0xE2, 0x00, 0x8A, 0x01, + 0x6F, 0x05, 0xA3, 0xFA, 0x86, 0x0C, 0xED, 0xF9, 0xA0, 0x15, 0x5A, 0x03, + 0x9D, 0x10, 0x17, 0x03, 0xA6, 0x09, 0x1C, 0xFF, 0x9C, 0x0C, 0x15, 0x02, + 0x39, 0x02, 0x9A, 0xFC, 0x26, 0xF9, 0xC9, 0xF8, 0x64, 0xFA, 0x2C, 0xFF, + 0x30, 0xF6, 0x53, 0x01, 0x98, 0xFA, 0x18, 0x05, 0xDF, 0x04, 0x23, 0x08, + 0xAD, 0x04, 0xEB, 0x03, 0xB8, 0x01, 0x57, 0x01, 0x3B, 0xF8, 0x07, 0xF8, + 0x9C, 0xEF, 0xCD, 0xF3, 0x97, 0xE9, 0xE2, 0xF1, 0xE7, 0xE6, 0xFA, 0xED, + 0x81, 0xF3, 0x66, 0xF9, 0x91, 0xF6, 0x04, 0xFB, 0x76, 0xF8, 0xE4, 0xFB, + 0xB4, 0x07, 0xC8, 0x07, 0xCB, 0x08, 0xC4, 0x03, 0xFA, 0xF9, 0xA6, 0xF8, + 0xF6, 0xF4, 0x8C, 0xFC, 0xDA, 0xEE, 0xC3, 0xF9, 0xBB, 0xE7, 0xB0, 0xF1, + 0x6F, 0xF0, 0x3A, 0xFA, 0x79, 0xF0, 0x99, 0xF8, 0xA0, 0xF1, 0xCC, 0xF6, + 0x00, 0xF7, 0x90, 0xF5, 0x5C, 0xF5, 0xA1, 0xED, 0xA9, 0xF2, 0x13, 0xE8, + 0x60, 0xF0, 0x2E, 0xE4, 0xC4, 0xF9, 0xB0, 0xF1, 0xA7, 0xFF, 0x6D, 0xF6, + 0x1A, 0x08, 0x1C, 0xF6, 0x40, 0x12, 0x37, 0xFE, 0xA7, 0x0D, 0x6A, 0xFC, + 0x3F, 0x06, 0xAF, 0xF8, 0x8C, 0xFD, 0xF2, 0xF6, 0x08, 0xF4, 0xB7, 0xF2, + 0xB7, 0xED, 0xB0, 0xEF, 0x14, 0xEC, 0x5D, 0xF6, 0xA1, 0xEA, 0xF3, 0xFC, + 0x75, 0xE9, 0x92, 0xF9, 0x6A, 0xEC, 0x30, 0xEF, 0x43, 0xF1, 0x7F, 0xE3, + 0x5E, 0xF4, 0x8C, 0xE0, 0xE1, 0xEB, 0xDB, 0xD9, 0x8E, 0xE6, 0x8A, 0xD5, + 0x2E, 0xEF, 0xEC, 0xE0, 0x6B, 0xEF, 0x9D, 0xE7, 0xF9, 0xED, 0xCC, 0xEE, + 0x22, 0xF0, 0x6E, 0xF6, 0xD2, 0xF4, 0x1B, 0xFC, 0x1F, 0xEF, 0xAC, 0xF3, + 0x0F, 0xEA, 0xC1, 0xED, 0x19, 0xEA, 0x49, 0xF3, 0x74, 0xE7, 0x00, 0xF6, + 0x06, 0xED, 0x16, 0xFB, 0xA2, 0xF2, 0xDC, 0xFA, 0x81, 0xF3, 0x41, 0xF7, + 0x59, 0xF3, 0xDF, 0xF4, 0x8D, 0xF0, 0xEB, 0xF0, 0x00, 0xEE, 0x3D, 0xF1, + 0x99, 0xED, 0xB8, 0xEE, 0xB7, 0xEE, 0x5C, 0xE5, 0x0F, 0xF1, 0xFB, 0xDE, + 0x11, 0xF6, 0xF9, 0xE2, 0x4A, 0xF4, 0x83, 0xE4, 0xCB, 0xF1, 0xEA, 0xE5, + 0xF9, 0xF4, 0x38, 0xEF, 0x40, 0xEE, 0xD8, 0xF2, 0x89, 0xE7, 0x58, 0xF7, + 0x95, 0xE9, 0xC8, 0xFA, 0x4E, 0xEE, 0x4D, 0xFB, 0x12, 0xED, 0xED, 0xF3, + 0x3F, 0xF3, 0x6D, 0xEE, 0x11, 0x01, 0x66, 0xF1, 0x9B, 0x01, 0xAA, 0xE5, + 0x49, 0x07, 0xD5, 0xE0, 0x77, 0x06, 0x00, 0xE2, 0x21, 0xEE, 0xB8, 0xD9, + 0x6A, 0xE3, 0x64, 0xE2, 0xEE, 0xE0, 0xDA, 0xEC, 0xBC, 0xD5, 0xC0, 0xE8, + 0x7C, 0xDC, 0x2B, 0xF0, 0xB2, 0xEB, 0x4F, 0xFB, 0x71, 0xF3, 0x7B, 0xFD, + 0x32, 0xF9, 0x4C, 0xFE, 0x14, 0xFD, 0x66, 0xFD, 0x3E, 0x00, 0xFE, 0xFD, + 0xC6, 0xFD, 0xE5, 0xFF, 0x6A, 0xF7, 0x3E, 0xFF, 0xC5, 0xF8, 0x99, 0xFE, + 0x82, 0xFF, 0xFA, 0xF8, 0xDA, 0x02, 0xF8, 0xF0, 0xE2, 0x02, 0x38, 0xEE, + 0xA5, 0x05, 0x06, 0xF2, 0x3C, 0xFE, 0xA6, 0xF0, 0x08, 0xFD, 0x56, 0xF7, + 0x8A, 0xFD, 0x4F, 0x02, 0xDA, 0xF4, 0x3C, 0x02, 0x79, 0xF7, 0x7E, 0x06, + 0x8E, 0xF9, 0xF4, 0x03, 0x9B, 0xFB, 0x07, 0xFE, 0x11, 0xFC, 0xBC, 0xFD, + 0x1C, 0xF2, 0x80, 0xF9, 0xC6, 0xF4, 0x99, 0xFA, 0xB6, 0xFE, 0xDC, 0xFA, + 0x48, 0x0B, 0xA0, 0xFE, 0x29, 0x13, 0xD2, 0xFD, 0x8C, 0x19, 0x11, 0x01, + 0xD2, 0x19, 0xD5, 0x09, 0xDE, 0x0F, 0xFF, 0x09, 0xFA, 0x08, 0x82, 0x0A, + 0xD8, 0xF9, 0xEF, 0xFC, 0xF0, 0xF5, 0x13, 0xF6, 0xCD, 0xFB, 0xCE, 0xFB, + 0x6A, 0xF6, 0x51, 0xF4, 0x30, 0xF9, 0x8C, 0xF6, 0xEA, 0xFB, 0xA3, 0xFD, + 0x49, 0xF7, 0xFD, 0xFF, 0x2F, 0xF6, 0xFA, 0x00, 0x5A, 0xFB, 0xD0, 0xFE, + 0x5B, 0x05, 0xFA, 0xFE, 0x2D, 0xFF, 0x8A, 0xF5, 0x4D, 0xFC, 0x3C, 0xF6, + 0xC0, 0xFF, 0xAC, 0xF8, 0xFE, 0x04, 0x6B, 0xF4, 0xD9, 0x0C, 0xD3, 0xF0, + 0x79, 0x0C, 0x43, 0xF4, 0x21, 0x08, 0xD0, 0x03, 0x6D, 0xFE, 0x1C, 0x0C, + 0x16, 0xF2, 0x88, 0x06, 0x43, 0xF7, 0x2E, 0x06, 0x97, 0x00, 0xA8, 0x01, + 0x7F, 0xFE, 0x9F, 0xF3, 0xFE, 0xFE, 0x2F, 0xF1, 0x97, 0xFF, 0xF4, 0xF7, + 0x53, 0xFA, 0x22, 0xFC, 0x61, 0xF2, 0xF5, 0xFE, 0x13, 0xF8, 0xEB, 0x0C, + 0x25, 0xF3, 0x5E, 0x10, 0x93, 0xEA, 0x83, 0x0A, 0x08, 0xF3, 0x7A, 0x09, + 0x69, 0xF2, 0x98, 0x00, 0xDC, 0xF6, 0x8B, 0xFD, 0xD4, 0x01, 0xB8, 0xFD, + 0xED, 0x08, 0xA0, 0xFC, 0x6B, 0x10, 0x79, 0xFE, 0x91, 0x14, 0x24, 0xFF, + 0x89, 0x13, 0x53, 0x08, 0x5F, 0x08, 0x63, 0x0A, 0xBD, 0x01, 0x76, 0x02, + 0x9C, 0x04, 0x37, 0xFE, 0x53, 0xFE, 0x00, 0xF2, 0xFA, 0xFA, 0x62, 0xEF, + 0x75, 0xFA, 0xED, 0xF3, 0x5E, 0xF6, 0xC0, 0xF2, 0xC7, 0xF6, 0x20, 0xF7, + 0xC0, 0x01, 0x1F, 0x04, 0x9E, 0x02, 0xCC, 0x04, 0x6C, 0xF9, 0x80, 0xFD, + 0xF8, 0x01, 0x89, 0x06, 0xB7, 0x02, 0x28, 0x04, 0x9C, 0xFF, 0x80, 0xFC, + 0x3D, 0x03, 0xD6, 0xFE, 0xA3, 0xFE, 0x85, 0xFC, 0x50, 0xFE, 0xEA, 0xFC, + 0x77, 0x03, 0x45, 0xFF, 0x1E, 0x02, 0xF9, 0xFF, 0x93, 0x03, 0x80, 0x06, + 0xE6, 0x04, 0x83, 0x0C, 0x74, 0xFD, 0x04, 0x0A, 0x66, 0xFE, 0xAB, 0x08, + 0x92, 0x05, 0xCC, 0x0F, 0x14, 0xFA, 0xA0, 0x0B, 0x22, 0xF6, 0x32, 0x0A, + 0x9E, 0x07, 0x49, 0x13, 0xA5, 0x0A, 0x2A, 0x0B, 0x17, 0x04, 0xF7, 0x01, + 0x89, 0x00, 0x6F, 0x00, 0xB1, 0xFE, 0x39, 0xFE, 0x0E, 0x00, 0xFE, 0xFD, + 0x12, 0x03, 0x45, 0x02, 0x0B, 0x07, 0x5E, 0x06, 0x4C, 0x0A, 0xF7, 0x08, + 0x1C, 0x08, 0x8A, 0x08, 0x3B, 0x04, 0xA9, 0x04, 0x56, 0x09, 0xC9, 0x0A, + 0x4B, 0x0A, 0x2C, 0x0E, 0x9E, 0x03, 0x91, 0x05, 0x25, 0x0E, 0x6D, 0x08, + 0x28, 0x13, 0x3D, 0x06, 0x5D, 0x0A, 0xE4, 0xFB, 0x28, 0x05, 0x0B, 0xF8, + 0x44, 0x03, 0xE6, 0xFA, 0x62, 0x00, 0x1F, 0xFF, 0x9D, 0xF7, 0x25, 0xFD, + 0x81, 0xF3, 0x21, 0xFC, 0x14, 0xF7, 0xE8, 0xFE, 0x67, 0xF6, 0x74, 0x01, + 0x65, 0xFC, 0x81, 0x08, 0x9A, 0x0B, 0xEE, 0x0D, 0x4D, 0x16, 0x37, 0x0C, + 0xED, 0x18, 0xA2, 0x06, 0x65, 0x20, 0x27, 0x09, 0x3A, 0x21, 0x77, 0x09, + 0x67, 0x15, 0xC9, 0xFF, 0x1B, 0x16, 0x90, 0x04, 0x8D, 0x15, 0xE9, 0x0F, + 0xB3, 0x0D, 0x2C, 0x13, 0x8D, 0x09, 0xF7, 0x16, 0x3F, 0x07, 0x8D, 0x1C, + 0x34, 0x06, 0xE8, 0x1A, 0x4F, 0x05, 0x5F, 0x18, 0x1D, 0x02, 0x42, 0x18, + 0xEB, 0xF7, 0x58, 0x10, 0xDD, 0xF4, 0x43, 0x0B, 0xA1, 0xF9, 0xE1, 0x06, + 0x26, 0x00, 0xA6, 0x01, 0xF9, 0x03, 0x08, 0x04, 0xBF, 0xFE, 0xB5, 0x01, + 0x11, 0xFF, 0x06, 0xFF, 0xE4, 0x08, 0xB7, 0x03, 0x3C, 0x0A, 0x98, 0x00, + 0x59, 0x08, 0xDD, 0x03, 0x6C, 0x02, 0x0D, 0x06, 0x2B, 0x06, 0x60, 0x03, + 0x1A, 0x12, 0xA0, 0x07, 0x89, 0x11, 0x2D, 0x0D, 0x56, 0x0F, 0x9C, 0x14, + 0x32, 0x06, 0xBF, 0x12, 0x43, 0x02, 0x98, 0x0D, 0xD2, 0x01, 0x7C, 0x05, + 0x35, 0xFC, 0x4C, 0xFD, 0x8D, 0xFD, 0xD7, 0x01, 0x9A, 0x00, 0x2D, 0x03, + 0x27, 0x05, 0xEF, 0x00, 0xE2, 0x11, 0x96, 0x05, 0x68, 0x15, 0x71, 0x06, + 0x5B, 0x16, 0x6D, 0x0D, 0x14, 0x17, 0x63, 0x12, 0x0A, 0x12, 0x8C, 0x11, + 0x0C, 0x0D, 0x8B, 0x11, 0x37, 0x0A, 0x2F, 0x0E, 0x0E, 0x13, 0xB4, 0x10, + 0x79, 0x15, 0x6A, 0x0F, 0x22, 0x14, 0xF2, 0x09, 0xE5, 0x14, 0xD2, 0x04, + 0x27, 0x10, 0xDB, 0xFE, 0x4D, 0x03, 0xFD, 0xF8, 0xF3, 0xFB, 0x71, 0xFA, + 0x92, 0xFD, 0xD6, 0xFB, 0xC9, 0x02, 0xC4, 0xFB, 0x7E, 0x01, 0x0B, 0xFB, + 0x29, 0x02, 0xB1, 0xFE, 0x71, 0x06, 0xF9, 0x06, 0xC5, 0x01, 0x4A, 0x0D, + 0x23, 0x03, 0x45, 0x15, 0xA4, 0x06, 0x99, 0x18, 0x25, 0x0A, 0xA9, 0x1B, + 0xC9, 0x0A, 0xDC, 0x1A, 0x7F, 0x0C, 0xA3, 0x19, 0x7F, 0x06, 0x5D, 0x16, + 0x9E, 0xFB, 0xDA, 0x0F, 0x9E, 0xFF, 0x25, 0x16, 0x0B, 0x02, 0x1A, 0x1B, + 0xAD, 0xF8, 0x57, 0x17, 0x35, 0xF3, 0xFB, 0x15, 0xF3, 0xFC, 0xD4, 0x16, + 0x97, 0x00, 0x30, 0x11, 0xCA, 0xFB, 0xE1, 0x0A, 0xF1, 0x01, 0x14, 0x0B, + 0x26, 0x05, 0x3E, 0x07, 0x8C, 0x02, 0x72, 0x08, 0xD9, 0x02, 0xB6, 0x0A, + 0x52, 0x02, 0xC3, 0x03, 0xC9, 0x04, 0x58, 0xFE, 0xA2, 0x0E, 0x2D, 0x01, + 0x34, 0x17, 0x2F, 0x05, 0x9E, 0x18, 0x2D, 0x04, 0x4C, 0x16, 0x8E, 0xFF, + 0x82, 0x14, 0xEE, 0xFB, 0xA8, 0x13, 0xE8, 0xF9, 0x78, 0x0B, 0x89, 0xF7, + 0x6F, 0x03, 0x0D, 0xFD, 0xDE, 0xFC, 0xD2, 0xFC, 0x4F, 0xF7, 0xDE, 0xFA, + 0xDE, 0xF2, 0x60, 0xFE, 0xED, 0xEF, 0x34, 0xFA, 0x48, 0xFD, 0x58, 0xFB, + 0xB4, 0x09, 0x0B, 0x00, 0x12, 0x0B, 0xC7, 0xFF, 0x2E, 0x0E, 0xFE, 0x04, + 0x01, 0x0D, 0x49, 0x09, 0x1C, 0x02, 0x3A, 0x04, 0x14, 0xFE, 0xF3, 0x05, + 0xA8, 0x01, 0x6A, 0x09, 0x13, 0xFE, 0x64, 0x02, 0xA4, 0xF8, 0xDD, 0x00, + 0xDE, 0xFA, 0x41, 0x0C, 0xEC, 0xF2, 0x9E, 0x0A, 0x43, 0xEC, 0xB2, 0x02, + 0x51, 0xFD, 0xBD, 0x09, 0xA6, 0x05, 0xA7, 0x08, 0x22, 0x03, 0x12, 0x00, + 0x56, 0x0B, 0x83, 0xFB, 0x99, 0x0D, 0x7D, 0xEE, 0xAE, 0x0F, 0xF1, 0xE8, + 0x37, 0x15, 0xFC, 0xF1, 0xFF, 0x09, 0x4B, 0xF2, 0x9F, 0x05, 0x29, 0xF3, + 0xE3, 0x0D, 0x58, 0xFA, 0xF3, 0x0E, 0xED, 0x07, 0x3D, 0x05, 0xB8, 0x10, + 0x2F, 0xFE, 0x35, 0x0C, 0x7A, 0x04, 0x5E, 0x0C, 0x01, 0x06, 0x0A, 0x09, + 0x62, 0x03, 0x90, 0x02, 0x1E, 0x06, 0x65, 0x03, 0x8D, 0x07, 0xBD, 0x05, + 0xE7, 0x02, 0x6E, 0x03, 0x18, 0x00, 0x84, 0xFC, 0x23, 0x0C, 0x30, 0xFF, + 0xCD, 0x06, 0xF3, 0xFF, 0x29, 0xF7, 0x32, 0x01, 0x33, 0xFA, 0x48, 0x0D, + 0x97, 0xFC, 0xA6, 0x14, 0x11, 0xFB, 0x23, 0x15, 0x5F, 0xF6, 0xB7, 0x0C, + 0xB4, 0xF4, 0xFF, 0x06, 0x8D, 0xED, 0x3F, 0xFE, 0x19, 0xEA, 0x17, 0xF6, + 0x25, 0xF4, 0x76, 0xFC, 0xD6, 0xFB, 0x3F, 0x08, 0x34, 0xF0, 0xFA, 0x05, + 0xA7, 0xEC, 0xBD, 0x00, 0xE5, 0xFE, 0xDD, 0x01, 0xCD, 0x02, 0x01, 0xFB, + 0x41, 0x00, 0x99, 0xF5, 0x16, 0x05, 0x20, 0xF2, 0x77, 0xFE, 0x85, 0xE8, + 0xF0, 0xFA, 0x5E, 0xE6, 0x54, 0x05, 0x7C, 0xEE, 0x73, 0x02, 0x63, 0xF0, + 0x30, 0xF6, 0x84, 0xED, 0xDD, 0xF9, 0xE4, 0xFC, 0x02, 0x00, 0xFC, 0x0D, + 0xAF, 0xF6, 0xB0, 0x0A, 0x63, 0xF6, 0x56, 0x06, 0x36, 0xFC, 0xA4, 0xFF, + 0x82, 0x04, 0x41, 0xFE, 0x0B, 0x08, 0xA7, 0xFA, 0xDD, 0x09, 0x36, 0xF5, + 0xC6, 0x0A, 0x43, 0xF6, 0x14, 0x01, 0x30, 0xF5, 0xA3, 0xFF, 0x82, 0xF8, + 0xA0, 0x06, 0x17, 0xFC, 0xCD, 0xFE, 0x0B, 0xFA, 0x45, 0xF3, 0x05, 0xFD, + 0x25, 0xFD, 0x44, 0x0A, 0x9D, 0x04, 0x40, 0x13, 0x0B, 0xFD, 0x73, 0x0D, + 0xA1, 0xF3, 0x01, 0x05, 0x75, 0xF4, 0xEC, 0x0A, 0x55, 0xF0, 0x8F, 0x08, + 0xF4, 0xEB, 0xBF, 0x00, 0x6B, 0xF5, 0xDD, 0x03, 0x06, 0xF6, 0x6F, 0xFC, + 0x4B, 0xF4, 0xFC, 0xF6, 0x95, 0xFC, 0x8D, 0xFB, 0x25, 0xFF, 0x18, 0xF9, + 0xD8, 0xFB, 0x8B, 0xF7, 0xFF, 0xFE, 0xEB, 0xFA, 0x03, 0xFF, 0xBD, 0xF8, + 0xDF, 0xFB, 0xDD, 0xF6, 0x78, 0x02, 0x08, 0xFD, 0xAA, 0x06, 0x41, 0x00, + 0xCF, 0x09, 0x6C, 0x04, 0xB7, 0x10, 0xF6, 0x0C, 0xDE, 0x0A, 0x0D, 0x0E, + 0x25, 0x01, 0x64, 0x07, 0x31, 0xFB, 0x2D, 0xFB, 0xF9, 0xF1, 0x34, 0xEF, + 0x50, 0xE9, 0x1A, 0xEB, 0xFF, 0xE5, 0x54, 0xE8, 0x9E, 0xE8, 0x05, 0xE1, + 0xA4, 0xF2, 0x7C, 0xE0, 0x9F, 0xFA, 0x1F, 0xE5, 0x8E, 0xF9, 0x1B, 0xEB, + 0x3B, 0xFA, 0x1E, 0xF5, 0x53, 0xF8, 0x1A, 0xF5, 0x6D, 0xF6, 0xCE, 0xF2, + 0x32, 0xFA, 0xF1, 0xF2, 0x8E, 0xF5, 0x9B, 0xED, 0x37, 0xEE, 0xDE, 0xE7, + 0x19, 0xFB, 0x86, 0xEC, 0xC8, 0x04, 0xC6, 0xF2, 0xB9, 0xFE, 0xA2, 0xF2, + 0x85, 0xFC, 0x32, 0xF5, 0xC4, 0xFA, 0x1E, 0xF4, 0x36, 0xF8, 0xBB, 0xEF, + 0xC6, 0xF5, 0x95, 0xEF, 0x5D, 0xF3, 0x43, 0xF1, 0x46, 0xEE, 0xBD, 0xF5, + 0x8C, 0xE9, 0xD4, 0xFB, 0x41, 0xF2, 0xCD, 0xFD, 0x22, 0x04, 0x5F, 0xFF, + 0x9F, 0x0A, 0x38, 0xFA, 0xD6, 0x03, 0x86, 0xF2, 0x2B, 0x01, 0x7C, 0xF1, + 0x17, 0xFE, 0xCC, 0xF0, 0x78, 0xFF, 0x31, 0xFA, 0x27, 0x04, 0x90, 0x05, + 0x4F, 0xF6, 0x74, 0x08, 0xA5, 0xEC, 0x97, 0x0C, 0x5B, 0xF4, 0x8D, 0x0E, + 0x1E, 0xF7, 0x92, 0x0C, 0xE7, 0xEB, 0x78, 0x00, 0xC3, 0xE7, 0x92, 0xFC, + 0x45, 0xE8, 0x2A, 0x00, 0xFA, 0xEA, 0x82, 0xFE, 0xFB, 0xFA, 0x9C, 0x04, + 0x8C, 0x03, 0x33, 0x00, 0x2F, 0x01, 0xF9, 0xF8, 0x9A, 0xFE, 0xB6, 0xFB, + 0x48, 0xF9, 0xCA, 0xFA, 0x65, 0x00, 0xDD, 0x00, 0x5E, 0x01, 0x9F, 0xFD, + 0x59, 0xFE, 0xD3, 0xFA, 0x1B, 0x0E, 0xF0, 0x04, 0xA6, 0x14, 0x57, 0x00, + 0x44, 0x11, 0x6B, 0xF5, 0x79, 0x0C, 0x1B, 0xEB, 0x6C, 0x05, 0x58, 0xDF, + 0xB5, 0x05, 0xDA, 0xDC, 0xE1, 0x06, 0xB8, 0xE2, 0x4E, 0x00, 0x0E, 0xE8, + 0x79, 0xF9, 0x88, 0xEC, 0x67, 0xEE, 0x57, 0xF3, 0x9C, 0xEA, 0xBC, 0xFC, + 0xC0, 0xEF, 0xF5, 0xFE, 0x40, 0xF1, 0x01, 0xFB, 0xAD, 0xF0, 0x43, 0xF5, + 0xB6, 0xF0, 0xF2, 0xF1, 0x23, 0xF0, 0x3F, 0xF4, 0x8E, 0xEA, 0x94, 0xF5, + 0x31, 0xED, 0xD0, 0xFE, 0xE4, 0xE8, 0x19, 0xFE, 0xEA, 0xEB, 0x21, 0xFC, + 0x12, 0xF8, 0x51, 0x03, 0x80, 0xF9, 0x13, 0x00, 0xCE, 0xFE, 0x6A, 0xFB, + 0x3B, 0x01, 0x85, 0xF3, 0xF2, 0x02, 0xC9, 0xF2, 0x56, 0xFF, 0xE9, 0xF4, + 0x86, 0xF1, 0x7A, 0xE7, 0xE1, 0xEE, 0x2B, 0xE4, 0xE1, 0xF1, 0xDD, 0xED, + 0x18, 0xF5, 0x5A, 0xF6, 0x25, 0xF6, 0xF1, 0xFC, 0x8F, 0xF3, 0xAA, 0xFB, + 0x42, 0xF9, 0x17, 0xFC, 0x43, 0xFE, 0x2D, 0xFE, 0x48, 0x04, 0xDF, 0xFA, + 0x92, 0x03, 0x34, 0xF5, 0x1C, 0x02, 0xF2, 0xEF, 0x93, 0x09, 0x90, 0xF5, + 0xA0, 0x06, 0x5E, 0xFD, 0x23, 0x07, 0xF0, 0x04, 0xDB, 0x01, 0x9C, 0x08, + 0x31, 0xF2, 0xDE, 0x00, 0xF0, 0xF6, 0xDB, 0x03, 0xB9, 0xFD, 0xD2, 0x09, + 0x7F, 0xFC, 0x8A, 0x03, 0xBE, 0xFE, 0x4C, 0x02, 0xF6, 0x05, 0xA8, 0x06, + 0xE8, 0x0B, 0x37, 0x05, 0x58, 0x04, 0xDE, 0x00, 0xA4, 0x03, 0xB8, 0x08, + 0x0E, 0x06, 0x0E, 0x16, 0x71, 0x06, 0xB3, 0x19, 0xFA, 0x0F, 0xE2, 0x1D, + 0x36, 0x19, 0x48, 0x24, 0xAB, 0x10, 0xAD, 0x19, 0xDC, 0x02, 0xC8, 0x07, + 0xCE, 0x08, 0xF0, 0xFC, 0x7C, 0x0B, 0xA5, 0xED, 0xBE, 0xFC, 0x62, 0xE0, + 0xF0, 0xF9, 0x4C, 0xEC, 0x41, 0xF7, 0xFD, 0xF6, 0x5A, 0xEF, 0xD2, 0xEE, + 0xEB, 0xF7, 0xCD, 0xF3, 0x40, 0xF9, 0xD5, 0xF9, 0x70, 0xEA, 0x1E, 0xF1, + 0xCE, 0xE0, 0x10, 0xEC, 0xFC, 0xE6, 0x72, 0xEF, 0x57, 0xEB, 0x39, 0xF4, + 0x0D, 0xEB, 0x85, 0xF6, 0xF2, 0xF1, 0xA9, 0xFD, 0xA0, 0xFD, 0x4F, 0x0A, + 0x05, 0x03, 0x6D, 0x09, 0x1F, 0x03, 0x26, 0x07, 0x09, 0x01, 0x0D, 0x08, + 0x26, 0x05, 0xD4, 0x09, 0x64, 0x03, 0x64, 0x03, 0xD1, 0x01, 0x1E, 0xF6, + 0xE9, 0x0A, 0x52, 0xF7, 0x36, 0xFF, 0x0D, 0xF5, 0x0A, 0xFB, 0xA8, 0xFE, + 0xE9, 0x02, 0x98, 0x0F, 0x2A, 0xFF, 0x7C, 0x08, 0x8C, 0x00, 0x6A, 0xFB, + 0xA7, 0x0A, 0xBF, 0xF8, 0xA3, 0x0B, 0x7A, 0xFA, 0x36, 0x02, 0x2C, 0xFB, + 0xE5, 0xFE, 0x3F, 0xFC, 0x22, 0x05, 0x0C, 0xFF, 0xF2, 0x0B, 0x18, 0x07, + 0x71, 0x15, 0xE3, 0x10, 0xFA, 0x21, 0x7E, 0x15, 0x36, 0x1E, 0x46, 0x0F, + 0x28, 0x13, 0xD2, 0x04, 0x90, 0x13, 0x4A, 0x03, 0x6C, 0x10, 0xF3, 0xFD, + 0xD3, 0x04, 0x73, 0xF2, 0x66, 0x04, 0x8B, 0xF6, 0xE8, 0x06, 0x2C, 0x01, + 0x7A, 0x02, 0x14, 0x0C, 0x0B, 0x03, 0xC0, 0x19, 0x4F, 0x02, 0x94, 0x1C, + 0x53, 0x00, 0xC7, 0x1C, 0x76, 0x16, 0xF7, 0x25, 0x54, 0x24, 0x41, 0x27, + 0x7C, 0x1D, 0xC3, 0x1F, 0x1F, 0x18, 0x81, 0x15, 0xCA, 0x0A, 0x52, 0x07, + 0x82, 0x07, 0x26, 0xFF, 0xA5, 0x01, 0xED, 0xF3, 0xF6, 0xF5, 0xC8, 0xED, + 0xBF, 0xF4, 0x69, 0xF7, 0x45, 0xEB, 0x5D, 0xFC, 0xCD, 0xE8, 0xCB, 0xFF, + 0xC4, 0xF3, 0x95, 0x09, 0xC5, 0xEF, 0x06, 0x04, 0x50, 0xE0, 0x7D, 0xF1, + 0x07, 0xDD, 0x3C, 0xED, 0x17, 0xE7, 0x0D, 0xF2, 0x2D, 0xE3, 0x02, 0xF0, + 0x24, 0xE3, 0x06, 0xEF, 0x3A, 0xF0, 0xB6, 0xEF, 0x4C, 0xF6, 0xAD, 0xEF, + 0x44, 0xFE, 0x79, 0xF0, 0x68, 0x08, 0x24, 0xF3, 0xD3, 0x16, 0xB3, 0xFA, + 0x43, 0x16, 0xFE, 0xFF, 0x93, 0x09, 0x8F, 0x04, 0xF3, 0x16, 0xEE, 0x13, + 0x83, 0x19, 0x20, 0x1C, 0x41, 0x09, 0x02, 0x15, 0x8D, 0x09, 0x1F, 0x10, + 0xC8, 0x09, 0xF3, 0x0E, 0xE0, 0x05, 0x1E, 0x07, 0xA5, 0x02, 0x32, 0xFF, + 0x4A, 0xFE, 0xE7, 0x00, 0xDB, 0xF5, 0x87, 0x03, 0xA6, 0xF0, 0xD7, 0x03, + 0xA4, 0xFD, 0x82, 0x0A, 0x61, 0x0D, 0x58, 0x14, 0x1B, 0x04, 0xF2, 0x08, + 0x40, 0xFB, 0xFF, 0xFE, 0x54, 0x10, 0x2C, 0x0F, 0xE8, 0x1F, 0x3B, 0x1D, + 0xC2, 0x15, 0x2F, 0x20, 0x2E, 0x0B, 0x71, 0x21, 0xFE, 0x10, 0x7F, 0x28, + 0x52, 0x13, 0xBF, 0x26, 0x4D, 0x15, 0xA0, 0x21, 0x2D, 0x16, 0xE1, 0x20, + 0x6C, 0x10, 0x93, 0x1B, 0x06, 0x16, 0x1B, 0x1C, 0x34, 0x23, 0xE7, 0x1A, + 0xB6, 0x2E, 0xD7, 0x15, 0xCB, 0x30, 0xA9, 0x11, 0xA9, 0x32, 0x25, 0x14, + 0x3C, 0x36, 0x79, 0x1A, 0x89, 0x2E, 0x1A, 0x1B, 0x5B, 0x23, 0x3F, 0x20, + 0x57, 0x1D, 0x5A, 0x24, 0x23, 0x09, 0x2E, 0x16, 0x18, 0xFA, 0x81, 0x09, + 0x14, 0xFD, 0xA6, 0x00, 0x20, 0xF3, 0xAC, 0xEF, 0x59, 0xED, 0x23, 0xEB, + 0x15, 0xF0, 0x23, 0xEE, 0x43, 0xEA, 0xC5, 0xEF, 0xA7, 0xE2, 0xCA, 0xE9, + 0xB2, 0xDD, 0x90, 0xE2, 0xB5, 0xD7, 0x6E, 0xE4, 0xBB, 0xD8, 0xEF, 0xE9, + 0x1B, 0xE1, 0xFF, 0xEC, 0x15, 0xE6, 0xA7, 0xE9, 0xC4, 0xED, 0x73, 0xE9, + 0xE9, 0xF2, 0xB7, 0xEB, 0xF0, 0xED, 0xBE, 0xED, 0xC0, 0xF3, 0xF4, 0xF6, + 0x87, 0xFA, 0x2A, 0xFE, 0xEA, 0xF6, 0xD9, 0xFC, 0x17, 0xFF, 0x86, 0x07, + 0x0E, 0x00, 0x9C, 0x12, 0xC0, 0xFF, 0xD1, 0x0F, 0x2E, 0x0B, 0x00, 0x08, + 0xF0, 0x08, 0x25, 0xFA, 0x64, 0x0B, 0x76, 0xF3, 0xB1, 0x06, 0x8C, 0xE8, + 0xA8, 0x04, 0x41, 0xE5, 0xB0, 0x03, 0x10, 0xE5, 0xB0, 0xFE, 0xA3, 0xE4, + 0x4D, 0x0B, 0x9E, 0xF3, 0x9B, 0x0B, 0xB3, 0xFC, 0xCC, 0x05, 0x9A, 0xFE, + 0xD0, 0x04, 0x43, 0x01, 0xCD, 0x06, 0x9F, 0x09, 0x03, 0x10, 0xF8, 0x15, + 0x5A, 0x0E, 0x85, 0x17, 0xF8, 0x05, 0xE9, 0x0F, 0xDE, 0x00, 0xF8, 0x0F, + 0x41, 0xFE, 0x32, 0x15, 0xBF, 0x02, 0x85, 0x14, 0x02, 0x00, 0xA7, 0x12, + 0x0D, 0x00, 0xEF, 0x18, 0x26, 0x0A, 0x68, 0x22, 0x21, 0x12, 0x5F, 0x25, + 0xC6, 0x1C, 0xE8, 0x23, 0xAA, 0x1E, 0xFA, 0x24, 0xF4, 0x1F, 0xEF, 0x29, + 0xA6, 0x25, 0x2B, 0x2E, 0xC8, 0x25, 0xCB, 0x2F, 0x10, 0x2A, 0x50, 0x2D, + 0xCB, 0x23, 0xE9, 0x22, 0x91, 0x10, 0xE2, 0x15, 0x4B, 0x06, 0x9F, 0x0A, + 0xCD, 0xFC, 0x6B, 0xFC, 0x2B, 0xEF, 0x6C, 0xEE, 0x7C, 0xE3, 0x2B, 0xE7, + 0xC9, 0xE3, 0x6D, 0xEB, 0x60, 0xEF, 0x60, 0xF6, 0xBF, 0xF0, 0xF8, 0xF9, + 0x6D, 0xE1, 0x76, 0xF1, 0x25, 0xD7, 0xC2, 0xEA, 0x57, 0xE7, 0x83, 0xF3, + 0x10, 0xF1, 0xC0, 0xF3, 0x09, 0xF3, 0xAC, 0xEE, 0xC1, 0xFB, 0x4C, 0xF1, + 0xD3, 0xF9, 0x46, 0xEF, 0xA3, 0xFB, 0x7C, 0xED, 0x0B, 0x0C, 0x27, 0xF6, + 0x32, 0x0D, 0x40, 0xF7, 0x30, 0x06, 0x5C, 0xF3, 0x36, 0x08, 0xA2, 0xF9, + 0x7C, 0x0F, 0x7D, 0x02, 0x5D, 0x0D, 0x0D, 0xFC, 0xAB, 0x04, 0x8E, 0xF2, + 0x48, 0x03, 0x57, 0xF4, 0x98, 0xFE, 0x89, 0xF4, 0xD8, 0xFF, 0x25, 0xF9, + 0x49, 0x08, 0x8B, 0x00, 0x53, 0x0B, 0xD9, 0x00, 0xE9, 0x08, 0x1F, 0xFE, + 0x88, 0x05, 0x1F, 0xFC, 0x8C, 0x04, 0xF9, 0xFC, 0x23, 0x03, 0xDD, 0xFE, + 0xC9, 0xFD, 0x02, 0xFA, 0x5B, 0xFC, 0xA1, 0xFC, 0x6B, 0x04, 0x76, 0x0D, + 0xCF, 0x0F, 0x4B, 0x14, 0x6B, 0x13, 0x57, 0x15, 0x59, 0x07, 0x20, 0x17, + 0xA3, 0xF9, 0x11, 0x14, 0x83, 0xFD, 0xA0, 0x1A, 0x87, 0x06, 0x1F, 0x1B, + 0xA7, 0x09, 0x97, 0x0E, 0x77, 0x11, 0x9F, 0x0C, 0x07, 0x17, 0x7D, 0x11, + 0xCE, 0x12, 0x9C, 0x16, 0x61, 0x0C, 0x0D, 0x17, 0x33, 0x0D, 0x52, 0x15, + 0x96, 0x14, 0x22, 0x1B, 0xD9, 0x1C, 0xC1, 0x22, 0xA1, 0x24, 0x8F, 0x23, + 0xD4, 0x2C, 0x12, 0x24, 0x0B, 0x23, 0xBB, 0x1D, 0x16, 0x0B, 0x90, 0x08, + 0x7A, 0xF7, 0x18, 0xF2, 0x5D, 0xE0, 0x06, 0xDF, 0xFC, 0xD1, 0xEB, 0xCC, + 0x8D, 0xDA, 0xB0, 0xC7, 0xBC, 0xE6, 0xE9, 0xD2, 0x6B, 0xE3, 0x04, 0xDE, + 0x90, 0xD9, 0x47, 0xE2, 0x0D, 0xD3, 0x9B, 0xE2, 0x4A, 0xD1, 0x00, 0xE2, + 0xAF, 0xD5, 0x8A, 0xDF, 0x39, 0xDE, 0xCA, 0xE0, 0xBA, 0xE5, 0xDF, 0xE9, + 0x17, 0xE0, 0x73, 0xE7, 0x5F, 0xDF, 0x18, 0xE0, 0x10, 0xF1, 0xDF, 0xE2, + 0x95, 0xF2, 0x72, 0xDD, 0x11, 0xF6, 0x0A, 0xDF, 0xA6, 0x05, 0x80, 0xEA, + 0x8C, 0x07, 0xC0, 0xF0, 0xFF, 0x06, 0xD4, 0xF7, 0x2D, 0x0A, 0xCB, 0xFB, + 0x61, 0x02, 0x1A, 0xF4, 0x17, 0xF1, 0xCF, 0xEE, 0x63, 0xEC, 0x14, 0xF4, + 0x15, 0xF6, 0xC9, 0xF7, 0x47, 0xF3, 0xA8, 0xF8, 0xDE, 0xE7, 0xBD, 0xF6, + 0x35, 0xEE, 0xB5, 0xF9, 0x6B, 0xF7, 0x1D, 0xFD, 0x22, 0xFD, 0x05, 0xFD, + 0x90, 0xFE, 0x6B, 0xFC, 0xC7, 0x01, 0x73, 0x02, 0x7E, 0x06, 0x8B, 0x0D, + 0x6F, 0x0D, 0xC0, 0x17, 0x5D, 0x1B, 0xE2, 0x1B, 0xCA, 0x17, 0x00, 0x16, + 0x05, 0x08, 0x34, 0x0E, 0x82, 0x07, 0x43, 0x12, 0x84, 0x07, 0x77, 0x18, + 0x19, 0xFD, 0x34, 0x13, 0x94, 0xFC, 0x12, 0x12, 0x0C, 0x06, 0xCA, 0x14, + 0x43, 0x0F, 0xFA, 0x17, 0x29, 0x11, 0xCC, 0x14, 0xBC, 0x15, 0x36, 0x12, + 0x28, 0x16, 0xEF, 0x10, 0x28, 0x14, 0x37, 0x08, 0xA7, 0x1B, 0x9B, 0x02, + 0xF4, 0x1F, 0x4C, 0x02, 0x91, 0x18, 0x9A, 0xFE, 0xF8, 0x0B, 0xC7, 0xF8, + 0x6A, 0xFE, 0x87, 0xF4, 0x99, 0xE4, 0x8A, 0xE6, 0x9D, 0xD4, 0xA3, 0xD9, + 0x99, 0xD3, 0xFB, 0xD2, 0xEC, 0xD3, 0xED, 0xD1, 0x24, 0xD4, 0x1D, 0xD2, + 0xCB, 0xD8, 0xF6, 0xD6, 0xE7, 0xD9, 0x8C, 0xDA, 0xCA, 0xD7, 0x17, 0xDD, + 0xD7, 0xD3, 0x4F, 0xDF, 0x85, 0xD2, 0x6C, 0xDF, 0xFC, 0xD6, 0x90, 0xE0, + 0x78, 0xD9, 0x67, 0xDE, 0x0D, 0xE0, 0xA2, 0xE3, 0xE8, 0xE4, 0x13, 0xEA, + 0x50, 0xE9, 0xB9, 0xED, 0x95, 0xF0, 0xD8, 0xF4, 0xA7, 0x04, 0xF7, 0x06, + 0x29, 0x12, 0xC2, 0x15, 0xD6, 0x0F, 0x0C, 0x16, 0xEC, 0x13, 0x3C, 0x0E, + 0x3F, 0x16, 0xC6, 0x04, 0x8D, 0x0A, 0xBC, 0xF3, 0x3B, 0x05, 0x41, 0xE9, + 0xE9, 0x04, 0x59, 0xEA, 0x63, 0xF8, 0xE0, 0xE0, 0x65, 0xF4, 0x87, 0xE0, + 0xF7, 0xFA, 0xAA, 0xE8, 0x9E, 0xFA, 0x92, 0xED, 0x54, 0xF1, 0x47, 0xF0, + 0x16, 0xF2, 0xBA, 0xF3, 0x3E, 0xF8, 0x13, 0xFD, 0xAD, 0xF6, 0xC2, 0x00, + 0xEF, 0x02, 0xA1, 0x08, 0x1D, 0x0F, 0xBD, 0x15, 0x79, 0x09, 0x82, 0x1A, + 0xD7, 0x0C, 0x3C, 0x1F, 0x43, 0x18, 0xCB, 0x25, 0xCB, 0x15, 0x3C, 0x2A, + 0x24, 0x0B, 0xDD, 0x23, 0x11, 0x05, 0x64, 0x1A, 0xBF, 0x09, 0xF4, 0x19, + 0x6C, 0x14, 0xE3, 0x14, 0xBA, 0x1C, 0x34, 0x15, 0x52, 0x25, 0xAA, 0x1E, + 0xB9, 0x29, 0x71, 0x20, 0xA4, 0x2A, 0x43, 0x21, 0x24, 0x2B, 0xED, 0x21, + 0x4E, 0x21, 0x4C, 0x21, 0xA2, 0x0C, 0x54, 0x19, 0x4C, 0xFF, 0x8F, 0x0B, + 0x18, 0xFC, 0xF3, 0xFE, 0xFC, 0xF5, 0x86, 0xEE, 0xC7, 0xE6, 0x1C, 0xD7, + 0x76, 0xDC, 0xB5, 0xC7, 0xB3, 0xD3, 0x67, 0xC3, 0x3A, 0xCC, 0xA4, 0xC2, + 0x0C, 0xD3, 0x9F, 0xCE, 0x27, 0xD7, 0x52, 0xDC, 0x8D, 0xD9, 0x55, 0xE2, + 0xE9, 0xE4, 0x20, 0xEC, 0x0A, 0xF3, 0x63, 0xF6, 0xA7, 0xFA, 0x7B, 0xF6, + 0xEB, 0xFE, 0xC3, 0xF4, 0xDA, 0xFE, 0x74, 0xF0, 0xAF, 0xF4, 0x8D, 0xED, + 0x9D, 0xEB, 0xA4, 0xF5, 0x41, 0xEB, 0x24, 0xFB, 0xD2, 0xF5, 0x34, 0x04, + 0xDF, 0xFB, 0xA5, 0x0A, 0x28, 0x05, 0xA8, 0x0F, 0xDB, 0x12, 0x9E, 0x17, + 0x8B, 0x14, 0xBE, 0x12, 0xCF, 0x0B, 0x36, 0x02, 0x7F, 0x06, 0x09, 0xF9, + 0x6A, 0x08, 0xD2, 0xF9, 0x74, 0xFF, 0x95, 0xF2, 0xA8, 0xF9, 0x8C, 0xED, + 0x97, 0xFC, 0xD1, 0xF0, 0x5A, 0xFC, 0xE3, 0xF6, 0x49, 0xFA, 0xB0, 0xFB, + 0xC2, 0x01, 0x31, 0xFD, 0xDB, 0x06, 0x8E, 0xF4, 0xB3, 0x04, 0x50, 0xEF, + 0xE5, 0x06, 0x58, 0xF5, 0xB1, 0x0A, 0xC2, 0x01, 0xAA, 0x06, 0x33, 0x0D, + 0x63, 0x02, 0x5A, 0x19, 0x1A, 0x01, 0x8B, 0x25, 0x3B, 0xFD, 0x29, 0x25, + 0x0D, 0xFD, 0xCB, 0x23, 0x39, 0xFF, 0x56, 0x1C, 0x32, 0x09, 0x76, 0x14, + 0xB6, 0x11, 0x93, 0x11, 0xD7, 0x17, 0x6B, 0x0E, 0x68, 0x20, 0x42, 0x0F, + 0x78, 0x26, 0x57, 0x12, 0xF7, 0x27, 0xBF, 0x19, 0xA2, 0x22, 0x85, 0x1C, + 0x7C, 0x1A, 0xAE, 0x14, 0xB1, 0x13, 0x54, 0x0E, 0x49, 0x0B, 0x5A, 0x05, + 0x39, 0xFA, 0x44, 0xF9, 0xE7, 0xE9, 0x35, 0xEE, 0x40, 0xDB, 0xAD, 0xDD, + 0x09, 0xD0, 0xB8, 0xD7, 0x0F, 0xCF, 0x7A, 0xDB, 0x33, 0xD1, 0xD9, 0xDE, + 0xE8, 0xD1, 0xE0, 0xE0, 0x13, 0xD3, 0x4A, 0xE4, 0x9B, 0xD6, 0xBC, 0xE8, + 0xD9, 0xE4, 0xE8, 0xE8, 0xC3, 0xF6, 0x18, 0xEA, 0xE3, 0xFF, 0xF1, 0xEB, + 0x32, 0x05, 0xBA, 0xEA, 0x61, 0x0A, 0xDF, 0xEE, 0x72, 0x06, 0xED, 0xF4, + 0xA6, 0x03, 0xC5, 0xF9, 0xF1, 0x05, 0x0F, 0x00, 0x57, 0x09, 0x47, 0x07, + 0x3E, 0x1A, 0x59, 0x0F, 0x9F, 0x26, 0x2B, 0x11, 0xB6, 0x28, 0x42, 0x11, + 0x62, 0x20, 0xF3, 0x0E, 0x71, 0x10, 0x7B, 0x0D, 0xE6, 0x06, 0x53, 0x09, + 0x00, 0x00, 0x78, 0x01, 0x6E, 0xF9, 0xC6, 0x01, 0x42, 0xF1, 0x04, 0x01, + 0x84, 0xE9, 0x73, 0xF8, 0x83, 0xEA, 0xCD, 0xF5, 0xBA, 0xEA, 0xD4, 0xF7, + 0xEB, 0xE6, 0x04, 0xF7, 0xD5, 0xEB, 0x7A, 0xFE, 0x7F, 0xF1, 0x01, 0x05, + 0x79, 0xFA, 0xD3, 0x07, 0x1C, 0x07, 0x4F, 0x13, 0x45, 0x09, 0xD3, 0x24, + 0x9B, 0x0C, 0x15, 0x2E, 0x1F, 0x16, 0x36, 0x2E, 0x64, 0x17, 0xD0, 0x2D, + 0x56, 0x18, 0x5B, 0x24, 0x22, 0x20, 0x82, 0x1E, 0xBC, 0x19, 0x0E, 0x1F, + 0x87, 0x09, 0xF7, 0x15, 0x38, 0x04, 0x54, 0x08, 0x2F, 0x0E, 0x89, 0x03, + 0x73, 0x1A, 0xEF, 0x06, 0x7B, 0x25, 0x20, 0x0A, 0x72, 0x2C, 0xA3, 0x0A, + 0x19, 0x2D, 0x2D, 0x0F, 0x20, 0x2D, 0xE6, 0x14, 0x2F, 0x2F, 0xDC, 0x11, + 0xD9, 0x2C, 0xD7, 0x04, 0x23, 0x14, 0x4A, 0xF7, 0xE9, 0xF7, 0x28, 0xF2, + 0x4B, 0xE6, 0x41, 0xEC, 0x8A, 0xD4, 0xBB, 0xE5, 0x27, 0xC7, 0xA4, 0xE0, + 0x40, 0xC0, 0xC2, 0xDE, 0x0F, 0xC2, 0x55, 0xE2, 0x9D, 0xCE, 0x24, 0xEA, + 0xBD, 0xDD, 0xB5, 0xF4, 0xAB, 0xE7, 0x4A, 0xF9, 0x5A, 0xEF, 0x35, 0xFC, + 0xEB, 0xF6, 0xDC, 0x01, 0xE9, 0xFC, 0xB3, 0x03, 0x00, 0x05, 0xD8, 0x02, + 0x80, 0x03, 0x54, 0x02, 0x81, 0xFC, 0xCA, 0x08, 0xD2, 0x00, 0x97, 0x11, + 0x4A, 0x10, 0x9A, 0x14, 0xE0, 0x1C, 0xB3, 0x0F, 0xAE, 0x26, 0x2F, 0x16, + 0x40, 0x2E, 0x64, 0x1C, 0x30, 0x2D, 0xC0, 0x16, 0x12, 0x1E, 0xFC, 0x10, + 0xD2, 0x0A, 0x46, 0x09, 0x66, 0xFB, 0x30, 0xFE, 0x40, 0xF2, 0x3B, 0xED, + 0x5E, 0xF4, 0x25, 0xE1, 0x48, 0xF6, 0x44, 0xDD, 0x31, 0xFB, 0x8F, 0xDE, + 0x85, 0x03, 0x65, 0xEA, 0x99, 0x01, 0xAF, 0xF6, 0xD3, 0xFF, 0x00, 0xFD, + 0xEA, 0x07, 0x91, 0x04, 0x7B, 0x0C, 0x00, 0x11, 0xB1, 0x12, 0x78, 0x1F, + 0x9E, 0x19, 0xAA, 0x24, 0x52, 0x1B, 0x47, 0x27, 0x5F, 0x1F, 0x14, 0x29, + 0xE5, 0x22, 0x8E, 0x24, 0x74, 0x22, 0x09, 0x23, 0x3D, 0x19, 0xA2, 0x20, + 0xFA, 0x14, 0x7D, 0x1C, 0x43, 0x18, 0x8B, 0x18, 0x40, 0x15, 0xE7, 0x15, + 0x57, 0x16, 0xF7, 0x14, 0xE9, 0x19, 0x41, 0x13, 0x85, 0x13, 0xF1, 0x0A, + 0x00, 0x12, 0xF8, 0x08, 0x65, 0x14, 0xD3, 0x0E, 0xA3, 0x0E, 0x11, 0x0E, + 0x13, 0x04, 0x7A, 0x0C, 0xA2, 0xF4, 0x22, 0x01, 0x0C, 0xEC, 0x77, 0xF6, + 0x6D, 0xE3, 0xEE, 0xF1, 0xAE, 0xD7, 0xD9, 0xE7, 0x73, 0xD2, 0x78, 0xDB, + 0x61, 0xD0, 0xC3, 0xD1, 0xC4, 0xD1, 0x08, 0xD4, 0x40, 0xDC, 0x51, 0xE0, + 0x0F, 0xE8, 0x70, 0xEC, 0x7D, 0xEB, 0xCC, 0xF3, 0xE0, 0xEE, 0x37, 0xF8, + 0x99, 0xF5, 0xC0, 0xF8, 0xDE, 0xF8, 0xB4, 0xF8, 0xBF, 0xF1, 0x33, 0xFF, + 0x09, 0xEC, 0xAA, 0x06, 0xBC, 0xF6, 0xDF, 0x10, 0x5B, 0x05, 0x78, 0x1C, + 0x22, 0x0F, 0xE5, 0x1F, 0x3C, 0x16, 0xA3, 0x1E, 0x27, 0x1B, 0x26, 0x1B, + 0x41, 0x1B, 0x04, 0x14, 0x09, 0x21, 0x8C, 0x0F, 0x47, 0x21, 0x75, 0x07, + 0xF6, 0x0F, 0xEC, 0xF8, 0x4B, 0x04, 0xE3, 0xED, 0x82, 0xFF, 0xFD, 0xE3, + 0xA0, 0xFA, 0xC2, 0xDB, 0xDA, 0xF2, 0x49, 0xDA, 0x7A, 0xEB, 0xD1, 0xE0, + 0x5F, 0xE5, 0x54, 0xE6, 0x12, 0xE4, 0x92, 0xEE, 0x7D, 0xEB, 0xD0, 0xF6, + 0xFB, 0xF7, 0xD2, 0xFC, 0xB2, 0x04, 0x46, 0x06, 0xA4, 0x0A, 0x95, 0x12, + 0x2A, 0x0E, 0x4C, 0x20, 0x84, 0x11, 0xE0, 0x23, 0x66, 0x16, 0xDF, 0x21, + 0xC8, 0x13, 0xAB, 0x1C, 0x01, 0x13, 0xCE, 0x1F, 0x44, 0x15, 0x10, 0x20, + 0x26, 0x1A, 0x21, 0x1B, 0x97, 0x1C, 0x47, 0x18, 0x31, 0x18, 0xD9, 0x14, + 0x09, 0x12, 0xAB, 0x13, 0xC7, 0x0D, 0xC4, 0x11, 0x73, 0x12, 0x2F, 0x17, + 0x1B, 0x12, 0xE2, 0x12, 0x05, 0x0E, 0x6C, 0x0D, 0x48, 0x08, 0x1C, 0x12, + 0x59, 0x01, 0x35, 0x0E, 0xB1, 0xF3, 0x10, 0xFB, 0x25, 0xE4, 0x95, 0xE5, + 0x66, 0xD5, 0xBA, 0xD3, 0xBD, 0xC8, 0xCD, 0xC9, 0x8E, 0xC3, 0x00, 0xC8, + 0x3E, 0xBA, 0x9D, 0xC3, 0x77, 0xBA, 0xF6, 0xC2, 0x28, 0xCB, 0x52, 0xCB, + 0xE5, 0xE1, 0x92, 0xDF, 0xF8, 0xF4, 0xB5, 0xF0, 0x04, 0x05, 0xC2, 0xF3, + 0xED, 0x14, 0xDE, 0xF8, 0x05, 0x18, 0x3E, 0xFD, 0x3A, 0x10, 0x78, 0xFB, + 0x5A, 0x08, 0x06, 0xFE, 0x0A, 0x05, 0x0C, 0x01, 0xFA, 0x03, 0x9D, 0x01, + 0xB8, 0x08, 0xD8, 0x08, 0xDE, 0x16, 0xDF, 0x11, 0xBE, 0x1B, 0xAF, 0x14, + 0xB0, 0x1C, 0x0F, 0x15, 0xCF, 0x1B, 0x5B, 0x14, 0x16, 0x10, 0x53, 0x11, + 0x60, 0x01, 0x52, 0x06, 0x1F, 0xFA, 0xE0, 0xF6, 0xA7, 0xF7, 0xE6, 0xED, + 0x55, 0xF1, 0x47, 0xE8, 0xB3, 0xEE, 0xEA, 0xE3, 0xED, 0xE9, 0x81, 0xE2, + 0xAC, 0xE2, 0x5B, 0xE5, 0x25, 0xE5, 0x5C, 0xEF, 0x12, 0xE8, 0x08, 0xFA, + 0x34, 0xE9, 0x49, 0x00, 0xD9, 0xF5, 0x04, 0x0F, 0x64, 0x03, 0xE2, 0x1D, + 0xBC, 0x0F, 0xE8, 0x27, 0x96, 0x17, 0x1E, 0x2B, 0xF7, 0x19, 0xC7, 0x27, + 0x2A, 0x1D, 0xEF, 0x25, 0x3B, 0x1F, 0xCF, 0x23, 0x46, 0x22, 0x03, 0x25, + 0xA0, 0x20, 0x6D, 0x21, 0x3C, 0x19, 0xB9, 0x16, 0xD1, 0x16, 0xFF, 0x10, + 0xF8, 0x19, 0xA2, 0x0D, 0xF6, 0x17, 0x89, 0x07, 0xD7, 0x16, 0x78, 0x03, + 0x70, 0x12, 0x72, 0xFF, 0x39, 0x12, 0xF1, 0xFF, 0xB8, 0x15, 0x81, 0x04, + 0x3E, 0x0F, 0x64, 0x07, 0x32, 0xFF, 0xAF, 0x04, 0x2E, 0xE7, 0xF0, 0xF7, + 0x3C, 0xD8, 0x6B, 0xE8, 0x00, 0xD3, 0x8D, 0xD9, 0x7F, 0xCC, 0x60, 0xD0, + 0x9F, 0xC5, 0xD7, 0xCB, 0x18, 0xC3, 0xB4, 0xC6, 0x71, 0xC7, 0xCF, 0xC8, + 0x70, 0xD5, 0x35, 0xDA, 0x4A, 0xE4, 0xC6, 0xE7, 0x86, 0xEF, 0x3B, 0xF0, + 0xB7, 0xF5, 0x21, 0xFE, 0x2E, 0xFA, 0x1C, 0x09, 0x2C, 0x06, 0x64, 0x11, + 0x2A, 0x14, 0x2C, 0x12, 0x77, 0x1B, 0x67, 0x0A, 0xCE, 0x19, 0xE1, 0x02, + 0x8B, 0x19, 0x70, 0x03, 0x57, 0x25, 0xFA, 0x0C, 0xFE, 0x28, 0x7A, 0x0C, + 0x97, 0x23, 0x91, 0x05, 0xAC, 0x26, 0xB4, 0x05, 0x2D, 0x1F, 0x8E, 0x05, + 0x3C, 0x10, 0xDA, 0xFF, 0x57, 0x02, 0xC3, 0xF2, 0x88, 0xEC, 0x84, 0xE3, + 0x86, 0xDB, 0x6C, 0xD8, 0x26, 0xD7, 0x9D, 0xD3, 0x2D, 0xD7, 0x05, 0xD0, + 0x15, 0xDF, 0xC0, 0xCF, 0x04, 0xE4, 0x9A, 0xD8, 0x39, 0xE0, 0xFB, 0xEC, + 0x39, 0xDF, 0xDD, 0x00, 0xDE, 0xE4, 0x64, 0x0C, 0x69, 0xF3, 0xE0, 0x16, + 0x17, 0x08, 0x10, 0x1D, 0xD7, 0x15, 0xFD, 0x1E, 0xBF, 0x19, 0x11, 0x1E, + 0x81, 0x23, 0xC1, 0x21, 0x10, 0x23, 0xE6, 0x22, 0x38, 0x1E, 0x32, 0x24, + 0x7E, 0x18, 0x7C, 0x26, 0xD2, 0x0E, 0xB3, 0x27, 0xF1, 0x08, 0xBB, 0x23, + 0x34, 0x08, 0x8C, 0x1B, 0xA0, 0x08, 0xF4, 0x13, 0xB2, 0x06, 0xA9, 0x08, + 0xBD, 0x0A, 0x50, 0x00, 0x6D, 0x0D, 0xDD, 0xFA, 0xE1, 0x14, 0x7D, 0xFC, + 0xD1, 0x19, 0x2D, 0x04, 0xDC, 0x10, 0x3F, 0x0A, 0x06, 0x00, 0x35, 0x05, + 0xCA, 0xEC, 0x98, 0xF9, 0x06, 0xD9, 0x1A, 0xE9, 0x67, 0xCB, 0xCC, 0xD6, + 0xCB, 0xC4, 0x8C, 0xCB, 0x1D, 0xB7, 0x86, 0xC0, 0xDE, 0xB3, 0xC6, 0xC4, + 0xEA, 0xC2, 0x84, 0xD5, 0xF1, 0xD5, 0x5F, 0xE0, 0xA2, 0xE8, 0x78, 0xEA, + 0x63, 0xF5, 0xF8, 0xF4, 0xDA, 0x03, 0x21, 0xFE, 0x3D, 0x0F, 0x12, 0x04, + 0xA4, 0x11, 0x2B, 0x08, 0x2D, 0x12, 0x01, 0x08, 0xEC, 0x0D, 0x8C, 0x02, + 0xBF, 0x0D, 0xB7, 0x03, 0x3C, 0x18, 0xDA, 0x0C, 0xE1, 0x1E, 0x33, 0x12, + 0xED, 0x20, 0xAD, 0x14, 0x6E, 0x20, 0xB8, 0x14, 0x1A, 0x1E, 0x9D, 0x0F, + 0x8E, 0x18, 0xEA, 0x05, 0xD6, 0x08, 0xF8, 0xF5, 0xD3, 0xF7, 0xB8, 0xE6, + 0xBB, 0xEE, 0x22, 0xDC, 0x6C, 0xE8, 0x69, 0xD6, 0x1D, 0xE2, 0x33, 0xD9, + 0x61, 0xE0, 0x53, 0xDC, 0x6D, 0xE4, 0x87, 0xE1, 0x6A, 0xF1, 0x8F, 0xF1, + 0xD9, 0xFD, 0x0E, 0x00, 0xE9, 0xFC, 0xDB, 0x02, 0xF4, 0x00, 0xC6, 0x09, + 0xB1, 0x09, 0xFF, 0x11, 0x0A, 0x10, 0x4E, 0x17, 0x86, 0x18, 0x9E, 0x1D, + 0x29, 0x20, 0x93, 0x20, 0x4E, 0x23, 0xD5, 0x24, 0x16, 0x23, 0x7D, 0x28, + 0xA7, 0x24, 0x63, 0x29, 0x8E, 0x1D, 0x07, 0x22, 0xC7, 0x15, 0x9C, 0x18, + 0x74, 0x15, 0x64, 0x14, 0x35, 0x14, 0x94, 0x11, 0xEE, 0x0F, 0x8C, 0x0B, + 0x6B, 0x03, 0x48, 0x02, 0x41, 0xF8, 0xAF, 0xFD, 0xC8, 0xF7, 0x33, 0x02, + 0x58, 0xF4, 0xFB, 0x06, 0x98, 0xEB, 0x63, 0x04, 0xDD, 0xE9, 0x0C, 0xFB, + 0x56, 0xDF, 0x17, 0xE2, 0x69, 0xD4, 0x57, 0xD0, 0xF4, 0xCE, 0x87, 0xC6, + 0x56, 0xC2, 0x5D, 0xBB, 0x10, 0xBC, 0x03, 0xBA, 0xB1, 0xC3, 0x94, 0xC4, + 0x60, 0xCE, 0x3C, 0xD4, 0x0D, 0xDB, 0x21, 0xE3, 0x2A, 0xEC, 0x22, 0xEE, + 0xB5, 0xF8, 0x01, 0xEF, 0x9C, 0x06, 0x2C, 0xF3, 0x93, 0x11, 0xD4, 0xFD, + 0xD8, 0x0E, 0xC3, 0x05, 0x2F, 0x0C, 0xA3, 0x09, 0x91, 0x0C, 0x77, 0x05, + 0x5E, 0x11, 0xDD, 0x03, 0x69, 0x22, 0x72, 0x0F, 0x09, 0x2D, 0xFE, 0x18, + 0x27, 0x26, 0xA0, 0x16, 0xAA, 0x25, 0x2F, 0x14, 0xDA, 0x25, 0x51, 0x14, + 0x27, 0x13, 0xF6, 0x0C, 0x30, 0xFD, 0x76, 0x00, 0xB4, 0xF2, 0xBE, 0xF5, + 0x11, 0xEB, 0x41, 0xEE, 0xCB, 0xE1, 0x43, 0xE7, 0x67, 0xDC, 0x8E, 0xE2, + 0xCC, 0xD2, 0x4E, 0xDE, 0x69, 0xCF, 0xCD, 0xE1, 0x50, 0xDA, 0x54, 0xF2, + 0x30, 0xEC, 0xDB, 0x02, 0x3D, 0xF7, 0x2D, 0x09, 0x45, 0xFB, 0x2E, 0x12, + 0x37, 0x03, 0x05, 0x25, 0x04, 0x0F, 0x80, 0x32, 0x27, 0x14, 0x26, 0x32, + 0x72, 0x15, 0xBE, 0x2D, 0x36, 0x1D, 0x5E, 0x30, 0x07, 0x25, 0xD4, 0x35, + 0x6F, 0x2A, 0x3E, 0x34, 0x29, 0x2C, 0x05, 0x28, 0xA8, 0x27, 0xB9, 0x1C, + 0x8E, 0x20, 0x66, 0x16, 0x76, 0x1F, 0x92, 0x12, 0xB7, 0x1E, 0x6F, 0x0F, + 0xB4, 0x12, 0xF0, 0x02, 0xE6, 0x06, 0xA4, 0xFA, 0x63, 0x03, 0x9F, 0xFD, + 0x35, 0x06, 0x77, 0xFE, 0xBF, 0x09, 0x00, 0xFB, 0x42, 0x02, 0x92, 0xF4, + 0x95, 0xEC, 0x0F, 0xE4, 0xBB, 0xD4, 0x6D, 0xD0, 0xBE, 0xC2, 0x68, 0xC5, + 0x28, 0xB5, 0x2C, 0xBE, 0x2C, 0xAD, 0x77, 0xBB, 0x72, 0xB0, 0x99, 0xBE, + 0xE4, 0xC9, 0xBE, 0xCB, 0xB4, 0xE4, 0x9B, 0xDC, 0x39, 0xF9, 0xA1, 0xEF, + 0x13, 0x0B, 0xC7, 0xFC, 0xE1, 0x15, 0xB9, 0x05, 0xA2, 0x1C, 0x82, 0x0F, + 0x1D, 0x20, 0xF6, 0x14, 0x76, 0x1D, 0x5B, 0x19, 0x86, 0x0E, 0x24, 0x15, + 0xF3, 0x07, 0x1D, 0x11, 0x82, 0x0F, 0x38, 0x15, 0x46, 0x1A, 0x3F, 0x1B, + 0x1D, 0x23, 0xDB, 0x18, 0xAC, 0x23, 0x9E, 0x11, 0x4E, 0x20, 0x47, 0x0F, + 0xF7, 0x14, 0xB5, 0x0B, 0x80, 0x05, 0x19, 0x03, 0x3E, 0xFC, 0x52, 0xF8, + 0x50, 0xF3, 0xA7, 0xEF, 0xD7, 0xE6, 0xDE, 0xE5, 0x0A, 0xDF, 0x92, 0xDB, + 0x49, 0xDA, 0x5F, 0xD2, 0xE1, 0xD8, 0x32, 0xD1, 0xA3, 0xE0, 0x6E, 0xDB, + 0x88, 0xEB, 0x08, 0xEF, 0xAE, 0xF0, 0xC7, 0x01, 0xEE, 0xF7, 0xF2, 0x0C, + 0x4C, 0x08, 0x4B, 0x1D, 0x1E, 0x17, 0xFE, 0x2A, 0x80, 0x21, 0x68, 0x2C, + 0xA8, 0x22, 0x50, 0x26, 0x36, 0x1F, 0xAD, 0x20, 0x7D, 0x21, 0x53, 0x23, + 0x30, 0x25, 0x65, 0x28, 0x43, 0x24, 0xBC, 0x2C, 0x84, 0x1E, 0x92, 0x2D, + 0xA8, 0x1F, 0x8C, 0x31, 0x60, 0x26, 0xB8, 0x33, 0x17, 0x24, 0xDD, 0x29, + 0x98, 0x10, 0x4A, 0x18, 0x9E, 0x00, 0x24, 0x07, 0x9E, 0xFD, 0xA3, 0xF8, + 0x05, 0xFD, 0x37, 0xEC, 0xE7, 0x00, 0xD3, 0xEC, 0x92, 0xFE, 0xB3, 0xF3, + 0x96, 0xEB, 0xB6, 0xED, 0xFE, 0xD4, 0x25, 0xE0, 0xEC, 0xCA, 0x70, 0xD6, + 0x3D, 0xC5, 0x99, 0xCC, 0xB2, 0xB9, 0xD1, 0xBD, 0xA5, 0xB3, 0x53, 0xB6, + 0xF5, 0xBB, 0x66, 0xBE, 0x93, 0xD1, 0xFF, 0xCE, 0x60, 0xE9, 0x7A, 0xE6, + 0x28, 0xFA, 0x6C, 0xFC, 0x0B, 0x07, 0x17, 0x0F, 0x58, 0x18, 0x10, 0x21, + 0xC5, 0x2B, 0xE7, 0x2C, 0x5D, 0x37, 0x19, 0x32, 0x18, 0x32, 0x8C, 0x29, + 0x53, 0x21, 0x4E, 0x17, 0xC0, 0x1B, 0x6F, 0x0F, 0x87, 0x22, 0x8A, 0x10, + 0x54, 0x29, 0x39, 0x0C, 0x5A, 0x2C, 0xCD, 0x0C, 0x3C, 0x26, 0xE2, 0x1C, + 0xFC, 0x18, 0xDB, 0x26, 0xFD, 0x12, 0x03, 0x27, 0xF8, 0x07, 0x35, 0x19, + 0xD0, 0xF4, 0xF2, 0xFD, 0x91, 0xE9, 0x8F, 0xE4, 0x90, 0xE4, 0xD0, 0xD1, + 0x83, 0xE1, 0xA6, 0xCD, 0x44, 0xDA, 0x02, 0xCC, 0x7D, 0xD4, 0xD4, 0xD1, + 0xB1, 0xDE, 0x6A, 0xE9, 0x44, 0xF0, 0x29, 0x02, 0x25, 0xF9, 0xA2, 0x0C, + 0x3A, 0x01, 0xBE, 0x15, 0x23, 0x0E, 0x78, 0x28, 0x80, 0x18, 0xA1, 0x30, + 0x02, 0x24, 0xC2, 0x2F, 0xEB, 0x27, 0xCB, 0x26, 0xAB, 0x27, 0x69, 0x1F, + 0x1A, 0x2C, 0xF5, 0x22, 0xAE, 0x2A, 0xE1, 0x25, 0xA9, 0x21, 0x74, 0x25, + 0x33, 0x1C, 0xB2, 0x24, 0x5D, 0x1B, 0xE5, 0x21, 0x36, 0x1C, 0x2B, 0x1B, + 0xB4, 0x1A, 0xA4, 0x11, 0xD4, 0x0F, 0xDD, 0x07, 0x3E, 0x04, 0xCD, 0x01, + 0x9F, 0xFE, 0xB5, 0x03, 0x43, 0x00, 0xA7, 0x0A, 0x49, 0x01, 0x91, 0x0B, + 0x4B, 0xF8, 0xBE, 0xFF, 0xE6, 0xE7, 0x27, 0xED, 0x37, 0xDA, 0x9D, 0xDE, + 0x53, 0xCB, 0x01, 0xCD, 0x84, 0xBC, 0x1B, 0xB9, 0xBD, 0xB7, 0x25, 0xAB, + 0xFB, 0xBD, 0x41, 0xAD, 0x16, 0xCE, 0xC2, 0xBF, 0xF9, 0xE1, 0xB9, 0xD3, + 0x32, 0xF5, 0xDE, 0xE9, 0xB0, 0x05, 0xA2, 0x00, 0x54, 0x14, 0xB6, 0x10, + 0x73, 0x1F, 0x59, 0x19, 0x7E, 0x23, 0x5C, 0x1C, 0x27, 0x21, 0xEB, 0x15, + 0xF4, 0x1E, 0x30, 0x0E, 0x36, 0x22, 0x2B, 0x14, 0xEE, 0x24, 0x0D, 0x1B, + 0x48, 0x26, 0x1B, 0x1C, 0x4F, 0x2A, 0x96, 0x21, 0x02, 0x2A, 0xF1, 0x26, + 0x19, 0x27, 0x45, 0x26, 0x0B, 0x1C, 0x55, 0x1A, 0x4B, 0x09, 0x1E, 0x0B, + 0xF5, 0xF3, 0x76, 0xF8, 0x03, 0xE6, 0x24, 0xE9, 0x8F, 0xD8, 0xEB, 0xDF, + 0xCD, 0xC6, 0xAB, 0xD9, 0xD9, 0xBD, 0x1A, 0xDE, 0x2D, 0xBE, 0x47, 0xEB, + 0xCC, 0xC9, 0x9A, 0xF9, 0x21, 0xE0, 0x0D, 0x01, 0x95, 0xF5, 0xB1, 0x06, + 0xEC, 0x02, 0x49, 0x0F, 0x74, 0x12, 0xA6, 0x17, 0xFA, 0x25, 0x1F, 0x1C, + 0x7B, 0x33, 0x37, 0x1E, 0x51, 0x34, 0x4A, 0x1F, 0x9E, 0x2D, 0xCC, 0x22, + 0xE4, 0x2C, 0x90, 0x2B, 0xC3, 0x30, 0xAF, 0x2D, 0x29, 0x2F, 0x11, 0x23, + 0xFA, 0x26, 0x70, 0x16, 0x7A, 0x1E, 0x3B, 0x0D, 0xB3, 0x1B, 0x0D, 0x06, + 0x9D, 0x18, 0x48, 0xFC, 0x14, 0x12, 0x58, 0xF2, 0x66, 0x0B, 0x22, 0xF1, + 0x65, 0xFE, 0x85, 0xF2, 0x1C, 0xF4, 0xFA, 0xF6, 0xC9, 0xED, 0x72, 0xF9, + 0x1A, 0xE2, 0xAF, 0xF2, 0xB2, 0xD6, 0x8E, 0xEB, 0x35, 0xCE, 0x02, 0xE1, + 0x3A, 0xC6, 0xC8, 0xD3, 0x7C, 0xC0, 0xC4, 0xCA, 0x1B, 0xB9, 0x4A, 0xC0, + 0xCF, 0xB5, 0xD5, 0xBC, 0x20, 0xBF, 0x2D, 0xCA, 0x31, 0xCB, 0x23, 0xDA, + 0xA4, 0xDD, 0xF5, 0xEA, 0x97, 0xF3, 0x4B, 0xFC, 0xC4, 0x01, 0x53, 0x05, + 0x48, 0x10, 0x3E, 0x0F, 0x52, 0x1B, 0x56, 0x18, 0x26, 0x19, 0x8B, 0x13, + 0x76, 0x17, 0x5F, 0x0E, 0x7D, 0x19, 0xE3, 0x10, 0x00, 0x17, 0x14, 0x14, + 0x7A, 0x15, 0x26, 0x16, 0xB3, 0x1F, 0x38, 0x1D, 0xCE, 0x2A, 0x21, 0x22, + 0x3A, 0x31, 0xF5, 0x22, 0xF0, 0x2A, 0xD6, 0x1C, 0x1A, 0x1A, 0x7F, 0x11, + 0x08, 0x03, 0x59, 0x00, 0x07, 0xEE, 0x36, 0xEA, 0xF2, 0xDC, 0x15, 0xD6, + 0xA5, 0xC7, 0xB4, 0xC0, 0xBB, 0xC3, 0xCD, 0xB6, 0xD0, 0xC7, 0x04, 0xBA, + 0x64, 0xCC, 0x6B, 0xC6, 0x70, 0xD8, 0x92, 0xDC, 0x40, 0xE7, 0x38, 0xF6, + 0xC8, 0xF2, 0x59, 0x0C, 0xE0, 0xFF, 0xAA, 0x20, 0xFD, 0x0D, 0xED, 0x2E, + 0xB0, 0x15, 0x1D, 0x35, 0x29, 0x17, 0xFB, 0x2F, 0xCA, 0x1A, 0xDB, 0x28, + 0x8C, 0x24, 0x43, 0x26, 0x57, 0x33, 0x3B, 0x26, 0xA6, 0x3E, 0x8E, 0x26, + 0x9A, 0x3D, 0xFD, 0x1C, 0x8A, 0x34, 0x4C, 0x15, 0xE3, 0x25, 0x7C, 0x11, + 0xA6, 0x17, 0xAF, 0x0C, 0x3B, 0x05, 0x00, 0x05, 0x23, 0xF7, 0x02, 0xFF, + 0x80, 0xF3, 0x5B, 0xFB, 0x6D, 0xF8, 0x77, 0xFC, 0x97, 0xFF, 0x08, 0x03, + 0x63, 0xF9, 0xE3, 0xFD, 0xFF, 0xE6, 0x82, 0xED, 0xF9, 0xD3, 0x11, 0xDD, + 0x5D, 0xC8, 0x12, 0xCD, 0x9E, 0xC2, 0xCA, 0xBE, 0xDC, 0xB9, 0x70, 0xB3, + 0xA8, 0xB1, 0xF8, 0xB0, 0xE5, 0xB8, 0xE5, 0xBD, 0xE6, 0xD0, 0x88, 0xD5, + 0x7C, 0xE9, 0x93, 0xEA, 0x5D, 0xFD, 0x73, 0xF9, 0xA5, 0x0F, 0x28, 0x08, + 0x03, 0x1E, 0xE0, 0x16, 0x7D, 0x21, 0x5E, 0x22, 0x84, 0x1E, 0xE6, 0x26, + 0xDE, 0x14, 0x9A, 0x23, 0x66, 0x09, 0xAC, 0x1D, 0xAA, 0x0B, 0x2A, 0x1C, + 0x37, 0x12, 0x50, 0x18, 0x7E, 0x18, 0xA5, 0x12, 0x86, 0x1D, 0xEE, 0x10, + 0x10, 0x21, 0x70, 0x11, 0xF9, 0x22, 0x08, 0x10, 0x64, 0x1C, 0x5F, 0x09, + 0xF4, 0x0B, 0x35, 0xFE, 0xCE, 0xF2, 0x70, 0xEE, 0xAE, 0xE0, 0x93, 0xE2, + 0x7D, 0xD0, 0x29, 0xD2, 0x98, 0xC6, 0xB6, 0xC3, 0x01, 0xCB, 0x70, 0xC0, + 0x1F, 0xD0, 0xF8, 0xC5, 0x58, 0xD9, 0x97, 0xD1, 0x08, 0xEB, 0x9A, 0xE3, + 0x0C, 0xFC, 0x19, 0xF3, 0x3D, 0x0C, 0xE4, 0x01, 0x41, 0x1D, 0x78, 0x16, + 0x74, 0x25, 0xBF, 0x23, 0xBA, 0x24, 0x41, 0x2A, 0x49, 0x20, 0x35, 0x2B, + 0x37, 0x1C, 0xAF, 0x2C, 0x34, 0x1B, 0x09, 0x2F, 0x04, 0x1D, 0x2A, 0x31, + 0x41, 0x1A, 0xCA, 0x2C, 0xF4, 0x16, 0xAD, 0x23, 0x3D, 0x18, 0x07, 0x20, + 0x7E, 0x17, 0x3E, 0x1B, 0x4C, 0x0D, 0xDF, 0x0B, 0x90, 0x01, 0x63, 0xFB, + 0x5D, 0xFC, 0x35, 0xF2, 0x6C, 0xFB, 0xB1, 0xF1, 0x43, 0xF6, 0x82, 0xFA, + 0x19, 0xE5, 0x9C, 0x01, 0x37, 0xDA, 0xBC, 0xFB, 0x30, 0xD8, 0xB1, 0xED, + 0x3A, 0xD4, 0x99, 0xDE, 0xD1, 0xCC, 0xE2, 0xCB, 0xE9, 0xBA, 0x1C, 0xBA, + 0x47, 0xA9, 0xFE, 0xAE, 0xEF, 0xAD, 0xD8, 0xAF, 0x59, 0xC5, 0x79, 0xBC, + 0xEA, 0xDA, 0x5E, 0xCE, 0x7B, 0xEF, 0xC3, 0xE2, 0x6C, 0x07, 0x77, 0xFA, + 0x9D, 0x1C, 0xB8, 0x13, 0x09, 0x2E, 0x24, 0x25, 0x82, 0x35, 0x7C, 0x27, + 0x55, 0x37, 0xC3, 0x1C, 0xA9, 0x3A, 0xE5, 0x12, 0x35, 0x39, 0x9B, 0x12, + 0x8F, 0x2D, 0x57, 0x13, 0x4D, 0x25, 0xF5, 0x16, 0xE2, 0x22, 0x35, 0x1D, + 0x71, 0x21, 0x86, 0x20, 0xB3, 0x20, 0x5E, 0x23, 0x32, 0x15, 0x90, 0x1D, + 0x83, 0x08, 0xC2, 0x0D, 0xAB, 0xF4, 0xD5, 0xF9, 0xEC, 0xDA, 0x6C, 0xE9, + 0x6C, 0xC7, 0x0C, 0xD8, 0xD2, 0xB8, 0x60, 0xC5, 0xBF, 0xB4, 0x14, 0xBF, + 0xCA, 0xBA, 0x5E, 0xC3, 0xB2, 0xC9, 0x6C, 0xD3, 0xBF, 0xD9, 0x23, 0xEC, + 0xC8, 0xEB, 0x3F, 0x03, 0xAE, 0xFE, 0x69, 0x0F, 0xB2, 0x11, 0x0E, 0x1A, + 0xC1, 0x29, 0x86, 0x28, 0xA5, 0x3A, 0x21, 0x31, 0xF9, 0x3A, 0xAB, 0x30, + 0x7A, 0x30, 0xE8, 0x2E, 0xEA, 0x23, 0xEC, 0x30, 0x08, 0x26, 0x30, 0x2E, + 0x8A, 0x27, 0x42, 0x23, 0xEF, 0x19, 0xA7, 0x13, 0x78, 0x15, 0xA9, 0x0B, + 0x17, 0x17, 0xAC, 0x09, 0xB9, 0x16, 0xDA, 0x09, 0xED, 0x14, 0x33, 0x0B, + 0x58, 0x0B, 0xA4, 0x07, 0xD8, 0x02, 0x30, 0x05, 0xE1, 0x00, 0x26, 0x0D, + 0xD1, 0x00, 0xA0, 0x16, 0x64, 0xF7, 0xD8, 0x0E, 0x12, 0xE6, 0x18, 0xF8, + 0xFF, 0xDA, 0xB6, 0xE3, 0x98, 0xD0, 0x48, 0xD1, 0xAA, 0xC3, 0x77, 0xBA, + 0xC3, 0xB5, 0x0D, 0xAC, 0xF1, 0xAE, 0x55, 0xAA, 0x1D, 0xB3, 0x63, 0xB4, + 0x05, 0xC3, 0x78, 0xCE, 0x8B, 0xDA, 0xEF, 0xE9, 0x69, 0xF2, 0x17, 0xFE, + 0x12, 0x0C, 0x0A, 0x0E, 0x10, 0x1E, 0xDC, 0x1D, 0xFB, 0x21, 0x06, 0x27, + 0xDD, 0x25, 0x1E, 0x22, 0xC0, 0x2B, 0x3B, 0x16, 0x7C, 0x2B, 0x7A, 0x0F, + 0x1F, 0x29, 0x3C, 0x12, 0xDB, 0x27, 0x02, 0x17, 0xA2, 0x29, 0x22, 0x19, + 0x3F, 0x28, 0x27, 0x16, 0x22, 0x28, 0x28, 0x14, 0xC4, 0x21, 0x89, 0x10, + 0x79, 0x0F, 0xF6, 0x08, 0x4D, 0xFC, 0x0C, 0xF7, 0xB9, 0xEA, 0xB4, 0xE1, + 0x06, 0xDA, 0x87, 0xD8, 0x41, 0xC7, 0x36, 0xD0, 0x9D, 0xB6, 0x79, 0xC9, + 0x99, 0xB2, 0x7E, 0xC9, 0x0F, 0xBF, 0xD7, 0xD1, 0xCD, 0xD3, 0x8E, 0xE2, + 0xAE, 0xE9, 0x9B, 0xF3, 0xE8, 0xFA, 0x2E, 0x00, 0xD3, 0x0C, 0xE6, 0x07, + 0xD1, 0x25, 0xB4, 0x18, 0xF7, 0x39, 0x17, 0x2D, 0xAC, 0x37, 0x28, 0x35, + 0xD9, 0x2A, 0xB9, 0x38, 0x92, 0x28, 0xED, 0x38, 0x15, 0x2F, 0x06, 0x39, + 0x87, 0x32, 0x37, 0x32, 0x39, 0x2A, 0x39, 0x21, 0x5F, 0x24, 0x1D, 0x15, + 0xF5, 0x24, 0xB0, 0x0F, 0xA5, 0x23, 0xB3, 0x0B, 0x2C, 0x1E, 0x22, 0x02, + 0x79, 0x0E, 0x1B, 0xF8, 0x0A, 0xFD, 0x74, 0xF7, 0x76, 0xF5, 0xA4, 0xFE, + 0x02, 0xF0, 0x3B, 0x08, 0x75, 0xE7, 0xE3, 0x08, 0xE2, 0xDB, 0x4B, 0xFC, + 0xFB, 0xCF, 0x97, 0xEE, 0x36, 0xC9, 0x9E, 0xE3, 0xA5, 0xC2, 0x18, 0xD8, + 0x92, 0xB8, 0x96, 0xC8, 0xC5, 0xB2, 0x51, 0xBA, 0x42, 0xB7, 0x16, 0xBA, + 0x78, 0xC7, 0x86, 0xC7, 0x51, 0xDF, 0xCB, 0xD5, 0x6A, 0xF6, 0x13, 0xE5, + 0x04, 0x0E, 0xC3, 0xFB, 0x2F, 0x25, 0x5B, 0x11, 0xCC, 0x34, 0xC9, 0x25, + 0xC7, 0x34, 0xA1, 0x32, 0x0E, 0x2A, 0xE7, 0x2F, 0x70, 0x1C, 0xA7, 0x25, + 0xA9, 0x12, 0x4A, 0x20, 0xE1, 0x12, 0x80, 0x1F, 0x0A, 0x1C, 0x73, 0x1F, + 0xFF, 0x23, 0x5C, 0x1A, 0xD7, 0x28, 0x94, 0x15, 0x3E, 0x2A, 0x67, 0x16, + 0x71, 0x22, 0xFF, 0x12, 0x8E, 0x12, 0x5C, 0x05, 0x4E, 0x00, 0x87, 0xF1, + 0x09, 0xF0, 0xF5, 0xDD, 0xB2, 0xDE, 0xAB, 0xCF, 0x14, 0xCF, 0x7D, 0xC7, + 0x50, 0xC6, 0x4C, 0xC0, 0xE5, 0xC9, 0x77, 0xC1, 0x21, 0xD9, 0x8F, 0xD2, + 0xD8, 0xEC, 0xD1, 0xEF, 0x42, 0xFD, 0x3F, 0x07, 0x9E, 0x08, 0x1C, 0x18, + 0x3A, 0x13, 0x60, 0x2B, 0x4F, 0x1E, 0x13, 0x42, 0x65, 0x21, 0xC8, 0x4B, + 0x86, 0x21, 0xE8, 0x43, 0xF3, 0x23, 0x25, 0x3B, 0x18, 0x28, 0x3C, 0x36, + 0x63, 0x2C, 0xEF, 0x31, 0x9C, 0x28, 0x47, 0x27, 0xB5, 0x21, 0xC3, 0x1A, + 0x69, 0x21, 0xC1, 0x11, 0xFC, 0x21, 0x43, 0x10, 0x84, 0x1A, 0x6A, 0x10, + 0xA5, 0x0E, 0x52, 0x09, 0x28, 0x04, 0x26, 0x06, 0xBA, 0xFF, 0x3A, 0x07, + 0xE6, 0xFB, 0x5C, 0x04, 0x16, 0xF6, 0xA5, 0xFD, 0x76, 0xEC, 0xA6, 0xF0, + 0xCF, 0xD9, 0xDE, 0xE0, 0xE3, 0xCA, 0x07, 0xD3, 0x6A, 0xBF, 0x6F, 0xC5, + 0x6E, 0xB1, 0x2B, 0xB8, 0x70, 0xA9, 0x65, 0xAD, 0x56, 0xB2, 0x51, 0xAE, + 0x17, 0xC6, 0xCD, 0xBA, 0xED, 0xDB, 0x94, 0xCC, 0xB0, 0xF5, 0x6A, 0xDF, + 0xF4, 0x0F, 0x10, 0xF2, 0x82, 0x2D, 0x4D, 0x06, 0x3B, 0x43, 0x3A, 0x18, + 0xAD, 0x45, 0xA0, 0x23, 0xC1, 0x3C, 0xC7, 0x26, 0x5E, 0x2E, 0x48, 0x26, + 0x66, 0x21, 0x7D, 0x21, 0x40, 0x18, 0x5A, 0x1D, 0xCD, 0x0E, 0xFE, 0x1D, + 0x5A, 0x0A, 0x48, 0x1E, 0x7D, 0x08, 0xBA, 0x1A, 0xEC, 0x0A, 0xA0, 0x1A, + 0x86, 0x0A, 0xD5, 0x18, 0x2C, 0x04, 0x64, 0x10, 0xC5, 0xF7, 0x8F, 0xFE, + 0x27, 0xE3, 0xB5, 0xED, 0x1A, 0xD3, 0xDC, 0xE5, 0x69, 0xCB, 0x77, 0xDC, + 0x5A, 0xC7, 0x04, 0xD4, 0x86, 0xCB, 0x97, 0xCE, 0x5A, 0xDA, 0x6B, 0xD2, + 0xE8, 0xEC, 0x61, 0xE1, 0x71, 0xFD, 0xFC, 0xF2, 0x95, 0x05, 0x8D, 0x03, + 0xEC, 0x0C, 0x24, 0x16, 0xD0, 0x18, 0x90, 0x2B, 0x45, 0x27, 0x4D, 0x40, + 0xDA, 0x2C, 0x30, 0x45, 0x96, 0x28, 0xAA, 0x3F, 0x63, 0x24, 0xA5, 0x3C, + 0x77, 0x24, 0x65, 0x3C, 0x2C, 0x23, 0x61, 0x33, 0x8B, 0x1F, 0xFD, 0x1D, + 0xFD, 0x1D, 0x58, 0x0C, 0x3B, 0x20, 0x67, 0xFF, 0x04, 0x23, 0xEA, 0xF6, + 0xDE, 0x1A, 0x2D, 0xF3, 0x69, 0x0E, 0xFB, 0xEE, 0x0F, 0x03, 0x2E, 0xF1, + 0xE8, 0xF8, 0xAF, 0xF8, 0x38, 0xF2, 0xC1, 0x00, 0xEE, 0xE9, 0x2C, 0x06, + 0x22, 0xE0, 0x09, 0x00, 0x68, 0xD4, 0x92, 0xF1, 0x65, 0xC8, 0x62, 0xDE, + 0x1C, 0xBD, 0xB9, 0xC9, 0xE1, 0xB5, 0xDA, 0xB5, 0x7D, 0xBA, 0xB7, 0xA7, + 0x9B, 0xC6, 0xBB, 0xAA, 0x75, 0xD5, 0xEA, 0xBE, 0xDE, 0xE6, 0xF2, 0xDA, + 0x01, 0xFA, 0x32, 0xF3, 0xDF, 0x10, 0x44, 0x0B, 0x75, 0x26, 0xC6, 0x1D, + 0xBC, 0x35, 0xB6, 0x29, 0xBA, 0x3A, 0xB9, 0x33, 0xFA, 0x36, 0x0D, 0x34, + 0xA7, 0x2D, 0x42, 0x30, 0x9C, 0x22, 0xD5, 0x29, 0x70, 0x1B, 0x34, 0x20, + 0x94, 0x18, 0xC7, 0x17, 0x20, 0x1A, 0x44, 0x15, 0x52, 0x17, 0xC5, 0x15, + 0xBF, 0x11, 0x10, 0x12, 0xE8, 0x10, 0x17, 0x0A, 0xCB, 0x09, 0xC1, 0xF7, + 0xDE, 0xF9, 0x8A, 0xE3, 0x25, 0xE9, 0x5E, 0xD8, 0xD0, 0xD3, 0x0E, 0xD0, + 0x88, 0xBC, 0x50, 0xCD, 0xEF, 0xAF, 0xF4, 0xD0, 0x3F, 0xB4, 0x2E, 0xD6, + 0x77, 0xC5, 0x07, 0xE0, 0x68, 0xDB, 0x06, 0xEC, 0x0D, 0xF2, 0x03, 0xF4, + 0x7E, 0x04, 0xE9, 0xFE, 0x6A, 0x19, 0xAA, 0x0F, 0x52, 0x31, 0x1A, 0x22, + 0x4F, 0x3C, 0xA3, 0x30, 0xAF, 0x3B, 0x16, 0x35, 0xD8, 0x36, 0x11, 0x36, + 0x55, 0x34, 0x29, 0x35, 0x1F, 0x33, 0x96, 0x31, 0x15, 0x22, 0xB3, 0x27, + 0x80, 0x0E, 0xCA, 0x13, 0xC8, 0x0A, 0x9D, 0x04, 0x4D, 0x0B, 0x1F, 0x00, + 0x1A, 0x0D, 0x9F, 0xFF, 0x73, 0x06, 0x12, 0xFC, 0xBF, 0xFB, 0x0B, 0xFC, + 0x1A, 0xF7, 0xD4, 0xFE, 0x62, 0xF5, 0x43, 0x00, 0x30, 0xF5, 0x3E, 0x01, + 0x38, 0xF1, 0x1C, 0xFB, 0xFB, 0xEA, 0xE9, 0xEF, 0x15, 0xE1, 0xE1, 0xE1, + 0x82, 0xD5, 0x10, 0xD3, 0xB8, 0xCB, 0x25, 0xC7, 0x53, 0xBD, 0x4D, 0xBB, + 0x51, 0xB6, 0x32, 0xBB, 0x0D, 0xC0, 0x50, 0xC9, 0x9D, 0xD1, 0x0B, 0xD9, + 0x7C, 0xE5, 0x1E, 0xEA, 0x2B, 0xFB, 0x6C, 0xFC, 0xCA, 0x0D, 0xD8, 0x0D, + 0xFB, 0x1B, 0xFF, 0x1B, 0xB4, 0x25, 0x1B, 0x24, 0x26, 0x25, 0x9B, 0x28, + 0xCE, 0x1F, 0x36, 0x2B, 0xAB, 0x19, 0x51, 0x2B, 0x22, 0x18, 0x35, 0x29, + 0xB5, 0x1C, 0x25, 0x26, 0x3A, 0x21, 0x66, 0x23, 0xC0, 0x1F, 0xCA, 0x1A, + 0xEB, 0x1B, 0x96, 0x12, 0x44, 0x14, 0x4B, 0x07, 0x8D, 0x07, 0x25, 0xF9, + 0xEE, 0xF9, 0xA6, 0xEC, 0xAB, 0xEC, 0x05, 0xE3, 0x89, 0xE0, 0x63, 0xDE, + 0x48, 0xD2, 0x78, 0xDB, 0x2F, 0xC8, 0xB8, 0xDA, 0x25, 0xCB, 0x63, 0xD8, + 0x3D, 0xD2, 0x54, 0xD7, 0x1A, 0xDE, 0x79, 0xDC, 0x35, 0xEF, 0x1D, 0xE7, + 0x12, 0xFF, 0x68, 0xF4, 0x96, 0x10, 0x19, 0x01, 0xC8, 0x21, 0x62, 0x12, + 0xF9, 0x2B, 0xC3, 0x23, 0x9E, 0x2B, 0xC0, 0x26, 0xF2, 0x30, 0x6F, 0x24, + 0x57, 0x3A, 0xB7, 0x26, 0x85, 0x3A, 0x6C, 0x25, 0x0A, 0x31, 0xE4, 0x19, + 0xA6, 0x21, 0x13, 0x0E, 0xC6, 0x17, 0x34, 0x0B, 0xF1, 0x10, 0x7F, 0x09, + 0x9B, 0x07, 0x81, 0x05, 0x6E, 0xFE, 0x19, 0x03, 0x10, 0xF8, 0xEB, 0xFE, + 0x6C, 0xF1, 0xDC, 0xFB, 0x2A, 0xEC, 0x10, 0xFF, 0x64, 0xEA, 0x0F, 0xFE, + 0xBD, 0xE5, 0x5F, 0xF8, 0xB3, 0xE2, 0x11, 0xF3, 0xB8, 0xDE, 0x42, 0xED, + 0x78, 0xD5, 0x1C, 0xE6, 0x05, 0xCC, 0xDF, 0xD4, 0x0D, 0xC0, 0xBF, 0xBE, + 0x7E, 0xBA, 0xE8, 0xB3, 0x84, 0xC5, 0x26, 0xB3, 0xB4, 0xD6, 0x12, 0xBA, + 0xA2, 0xE6, 0xD1, 0xCA, 0x3F, 0xFB, 0xDA, 0xE1, 0x54, 0x11, 0x58, 0xFD, + 0x7B, 0x21, 0x0C, 0x17, 0x7B, 0x2B, 0xED, 0x26, 0x88, 0x2A, 0x59, 0x2D, + 0x1E, 0x22, 0xA6, 0x2C, 0x69, 0x19, 0x6F, 0x26, 0xA4, 0x13, 0xC5, 0x20, + 0x96, 0x14, 0x28, 0x1D, 0x0D, 0x18, 0x5F, 0x19, 0x62, 0x17, 0x58, 0x15, + 0xD1, 0x16, 0x0D, 0x13, 0x2C, 0x15, 0x65, 0x12, 0xDE, 0x08, 0xBF, 0x0F, + 0x98, 0xF3, 0xA9, 0x06, 0x02, 0xDF, 0xA2, 0xF9, 0xD7, 0xD2, 0x27, 0xF1, + 0x79, 0xD1, 0xD8, 0xE7, 0x40, 0xD5, 0x3F, 0xDA, 0x9B, 0xD6, 0xBD, 0xD2, + 0xD4, 0xD7, 0xDE, 0xD3, 0xAB, 0xDB, 0x9D, 0xDC, 0x10, 0xE5, 0xF9, 0xE8, + 0x9B, 0xF1, 0xCC, 0xF4, 0xE4, 0xFB, 0xEA, 0x04, 0xC9, 0x0D, 0x0A, 0x18, + 0x4B, 0x28, 0xB7, 0x2A, 0x5D, 0x3A, 0x05, 0x33, 0x4C, 0x3D, 0xA5, 0x32, + 0xAF, 0x34, 0x5C, 0x30, 0xCB, 0x2E, 0x5B, 0x2E, 0x3D, 0x2B, 0x5E, 0x26, + 0xB5, 0x20, 0xB6, 0x11, 0x61, 0x16, 0xEF, 0x03, 0x4A, 0x10, 0x7A, 0x02, + 0xF9, 0x0E, 0xB7, 0xFD, 0x84, 0x0F, 0x14, 0xF3, 0x24, 0x09, 0x09, 0xEE, + 0x42, 0x02, 0x18, 0xF3, 0xBE, 0xFE, 0x77, 0xF9, 0xBF, 0xF9, 0xE6, 0xFE, + 0x2B, 0xF1, 0x20, 0xFF, 0x34, 0xE8, 0x23, 0x00, 0xF9, 0xDE, 0xAD, 0xFF, + 0x6D, 0xD1, 0xEC, 0xF4, 0x79, 0xC7, 0x56, 0xE9, 0xE5, 0xC0, 0xD3, 0xDA, + 0x9F, 0xB8, 0x17, 0xCC, 0x3A, 0xBA, 0xE6, 0xC4, 0x81, 0xC8, 0x2E, 0xC5, + 0x83, 0xDA, 0x11, 0xCF, 0x16, 0xEE, 0xAD, 0xDF, 0x46, 0x06, 0x2B, 0xF4, + 0x92, 0x20, 0xB1, 0x09, 0x98, 0x34, 0xAD, 0x1D, 0x8C, 0x3A, 0x59, 0x28, + 0x8F, 0x35, 0x7A, 0x2C, 0xF6, 0x29, 0x87, 0x29, 0x11, 0x1A, 0xE7, 0x20, + 0x1A, 0x12, 0x21, 0x23, 0x86, 0x0F, 0x5B, 0x24, 0x50, 0x0C, 0xE7, 0x1C, + 0x39, 0x0A, 0xE0, 0x13, 0x2B, 0x08, 0x90, 0x0C, 0xAB, 0x05, 0x20, 0x03, + 0xC4, 0xF9, 0x0D, 0xF2, 0x78, 0xE5, 0x9C, 0xDE, 0x1E, 0xDE, 0x4E, 0xD3, + 0xA5, 0xDA, 0xA1, 0xC8, 0x87, 0xD9, 0x4A, 0xC3, 0x79, 0xDB, 0x68, 0xCB, + 0x05, 0xD8, 0x3E, 0xDA, 0x5C, 0xDD, 0x2A, 0xEB, 0xEC, 0xEB, 0xAA, 0xF8, + 0x9E, 0xF9, 0xE7, 0x00, 0x8D, 0x0A, 0x10, 0x06, 0xF1, 0x1C, 0x3D, 0x0F, + 0x8A, 0x29, 0xAF, 0x1E, 0xD0, 0x31, 0x1E, 0x2C, 0xC2, 0x31, 0xBB, 0x31, + 0xE5, 0x2E, 0x8F, 0x36, 0x1B, 0x32, 0x3E, 0x37, 0x6B, 0x32, 0x5E, 0x2C, + 0x02, 0x26, 0x0E, 0x19, 0x48, 0x15, 0xFA, 0x09, 0xEE, 0x07, 0xCB, 0x00, + 0xEF, 0x01, 0xBB, 0xF6, 0x08, 0xFD, 0x80, 0xED, 0xFB, 0xF6, 0xF5, 0xEA, + 0x1C, 0xF7, 0xAD, 0xF2, 0x67, 0xF7, 0x06, 0xFD, 0xE3, 0xF5, 0x47, 0x06, + 0x56, 0xF5, 0x30, 0x10, 0xDC, 0xF2, 0x52, 0x0F, 0xA4, 0xEC, 0x07, 0x02, + 0x65, 0xE6, 0xAA, 0xF5, 0x53, 0xDF, 0x65, 0xE8, 0x81, 0xD0, 0x43, 0xD5, + 0xC3, 0xBF, 0xC0, 0xC3, 0xA4, 0xB4, 0x51, 0xBB, 0x8B, 0xB7, 0x64, 0xC0, + 0x94, 0xC6, 0x0B, 0xCF, 0xD4, 0xDB, 0xD8, 0xE0, 0xE8, 0xFB, 0xF0, 0xF8, + 0x6B, 0x1C, 0x42, 0x19, 0x08, 0x2F, 0xC0, 0x30, 0x82, 0x39, 0x75, 0x3B, + 0xBE, 0x3D, 0x15, 0x3B, 0xA9, 0x37, 0x49, 0x34, 0x0B, 0x2F, 0xD9, 0x32, + 0x8C, 0x27, 0x57, 0x2E, 0xC4, 0x22, 0xAB, 0x24, 0x70, 0x1A, 0xD5, 0x16, + 0x49, 0x0D, 0x2B, 0x07, 0xFB, 0x07, 0xAE, 0xFC, 0x1E, 0x05, 0x5E, 0xF4, + 0x84, 0x00, 0x39, 0xE7, 0x03, 0xF4, 0xE4, 0xD5, 0x89, 0xE4, 0x6B, 0xD1, + 0x38, 0xDD, 0xF6, 0xD1, 0xF6, 0xD2, 0x0E, 0xC6, 0x9E, 0xCD, 0x7D, 0xBD, + 0xAC, 0xD3, 0x86, 0xC6, 0xA8, 0xD5, 0x99, 0xD6, 0x0D, 0xDC, 0xF0, 0xE8, + 0x35, 0xED, 0x52, 0xFC, 0xC8, 0x01, 0x05, 0x0A, 0xAF, 0x13, 0xAD, 0x14, + 0x43, 0x29, 0xA8, 0x25, 0xA3, 0x43, 0xB0, 0x3D, 0x03, 0x41, 0xAF, 0x44, + 0xCD, 0x2F, 0xC6, 0x3E, 0xCB, 0x32, 0x0F, 0x44, 0x12, 0x2D, 0x96, 0x3E, + 0xBA, 0x14, 0x26, 0x27, 0x2C, 0x01, 0x36, 0x0F, 0xC2, 0xF7, 0xCE, 0x02, + 0x4A, 0xF3, 0xDE, 0xFE, 0xFF, 0xEF, 0x48, 0xFA, 0x38, 0xF1, 0x8C, 0xF8, + 0x75, 0xF3, 0x3C, 0xF9, 0x20, 0xF2, 0x20, 0xFD, 0x86, 0xF6, 0x76, 0x02, + 0xDB, 0xFD, 0x12, 0x09, 0x65, 0xF9, 0x91, 0x03, 0xBB, 0xFA, 0x06, 0x00, + 0xB2, 0xFC, 0x2A, 0xFD, 0x1A, 0xF5, 0x18, 0xEC, 0x46, 0xE9, 0x5C, 0xDB, + 0x75, 0xD5, 0x28, 0xCA, 0x8B, 0xC6, 0x67, 0xBC, 0xDC, 0xC3, 0x2F, 0xB8, + 0xA4, 0xC8, 0x9A, 0xB9, 0x39, 0xD2, 0x13, 0xC0, 0x36, 0xE8, 0xE4, 0xD3, + 0x8B, 0x06, 0xD1, 0xF5, 0xC0, 0x1A, 0x48, 0x10, 0x3D, 0x2F, 0x05, 0x22, + 0xA8, 0x3E, 0x12, 0x33, 0x69, 0x3F, 0xA9, 0x3F, 0xC8, 0x36, 0xA4, 0x40, + 0xD8, 0x30, 0x6E, 0x3D, 0xCB, 0x2A, 0x96, 0x36, 0x40, 0x1B, 0x8F, 0x26, + 0xB9, 0x10, 0x76, 0x16, 0x3F, 0x09, 0x5A, 0x08, 0xDC, 0xFC, 0x0A, 0xFA, + 0xB7, 0xEC, 0x2D, 0xEC, 0x4C, 0xDE, 0x81, 0xE5, 0x1F, 0xD5, 0xA8, 0xE4, + 0xB7, 0xD1, 0x10, 0xE7, 0x88, 0xCC, 0x8A, 0xE5, 0x29, 0xCD, 0x3E, 0xE3, + 0x09, 0xD0, 0xA0, 0xE1, 0x82, 0xD5, 0x6C, 0xE3, 0x3F, 0xE7, 0x5C, 0xF0, + 0x53, 0xFD, 0x2B, 0x00, 0x62, 0x10, 0xD9, 0x0A, 0x2D, 0x1C, 0xC7, 0x0D, + 0x3A, 0x35, 0x32, 0x1B, 0x5B, 0x55, 0xFB, 0x33, 0xF4, 0x52, 0x21, 0x30, + 0x49, 0x49, 0x05, 0x27, 0xCE, 0x4D, 0x97, 0x30, 0xDD, 0x3C, 0xB0, 0x2B, + 0x1F, 0x2D, 0x13, 0x25, 0x2A, 0x26, 0x39, 0x1F, 0xA2, 0x11, 0x9F, 0x0E, + 0xB2, 0x02, 0xC7, 0x04, 0xE5, 0xFB, 0xDC, 0x00, 0x9D, 0xF6, 0x9C, 0xFD, + 0x97, 0xEA, 0xC2, 0xF2, 0x60, 0xE4, 0x51, 0xEA, 0x18, 0xF1, 0xB1, 0xF5, + 0xA8, 0xF9, 0x54, 0x02, 0xC9, 0xF7, 0x93, 0x02, 0x5C, 0xFC, 0x18, 0x08, + 0xC4, 0xF6, 0x03, 0x07, 0x6C, 0xE8, 0xA4, 0xFB, 0x13, 0xDF, 0x05, 0xF0, + 0x32, 0xD1, 0xC2, 0xDC, 0x2F, 0xC9, 0x25, 0xCD, 0xC1, 0xC2, 0x91, 0xBF, + 0xE0, 0xC4, 0xB2, 0xBF, 0x38, 0xCB, 0xC4, 0xCB, 0x57, 0xD4, 0x9A, 0xDA, + 0x3E, 0xEB, 0xC6, 0xEB, 0x19, 0x0C, 0xAA, 0x02, 0xD3, 0x29, 0x64, 0x1D, + 0x3C, 0x33, 0x70, 0x29, 0x13, 0x35, 0x4E, 0x2A, 0xF6, 0x3E, 0xB7, 0x2A, + 0xBA, 0x3C, 0x66, 0x24, 0x98, 0x30, 0xE5, 0x19, 0xE0, 0x25, 0x19, 0x14, + 0xFB, 0x13, 0x16, 0x0E, 0x59, 0x07, 0x2D, 0x0C, 0xEE, 0xFA, 0x41, 0x0E, + 0x0E, 0xE9, 0xE0, 0x05, 0x4A, 0xDD, 0x7E, 0xF8, 0xED, 0xD8, 0x8C, 0xE9, + 0x58, 0xD8, 0x6C, 0xDA, 0x4B, 0xDA, 0xE9, 0xD8, 0x4F, 0xDA, 0x14, 0xD5, + 0x2B, 0xD7, 0x05, 0xD0, 0x7C, 0xDC, 0x82, 0xD9, 0x6D, 0xE4, 0xAE, 0xE7, + 0x59, 0xE8, 0x9B, 0xF4, 0xD1, 0xF2, 0xD6, 0x00, 0x05, 0xFE, 0xDD, 0x09, + 0x49, 0x18, 0xEF, 0x20, 0x47, 0x30, 0xBE, 0x35, 0x43, 0x3C, 0x10, 0x3B, + 0x98, 0x45, 0x8A, 0x3B, 0xE0, 0x36, 0x98, 0x32, 0x88, 0x27, 0xFE, 0x2D, + 0xE0, 0x26, 0xAC, 0x2A, 0xEA, 0x22, 0x93, 0x1E, 0xD9, 0x14, 0xC7, 0x0B, + 0xC5, 0x09, 0xC7, 0xFE, 0xED, 0x0C, 0xF6, 0xFE, 0xCB, 0x09, 0xBA, 0xF8, + 0xC9, 0xFD, 0x72, 0xED, 0xD8, 0xFC, 0x57, 0xEE, 0x85, 0xFA, 0x0F, 0xF5, + 0x60, 0xEF, 0x33, 0xFA, 0x3B, 0xF1, 0x49, 0x05, 0xAC, 0xFB, 0x96, 0x11, + 0x38, 0xF2, 0x85, 0x08, 0xFB, 0xE6, 0xAF, 0xFC, 0xFA, 0xE3, 0xBE, 0xF6, + 0xFD, 0xD8, 0xDC, 0xE6, 0xE7, 0xC2, 0x3C, 0xCE, 0x53, 0xB8, 0x72, 0xBC, + 0xB8, 0xBC, 0xD1, 0xB6, 0x7C, 0xBE, 0x12, 0xB5, 0xBF, 0xD0, 0x62, 0xC5, + 0x20, 0xED, 0x39, 0xDD, 0xC3, 0x0A, 0xAF, 0xF6, 0x5C, 0x1D, 0xA5, 0x13, + 0x52, 0x27, 0xC8, 0x29, 0x89, 0x36, 0xE1, 0x39, 0xE4, 0x3E, 0xB2, 0x3C, + 0x57, 0x36, 0x18, 0x2E, 0x56, 0x2F, 0xD4, 0x24, 0xE0, 0x25, 0x3A, 0x1C, + 0x69, 0x16, 0xD6, 0x14, 0xF8, 0x0A, 0x0F, 0x10, 0xE2, 0x01, 0x42, 0x09, + 0x1B, 0xFE, 0xE2, 0x05, 0xCD, 0xF1, 0xE8, 0xF3, 0x91, 0xED, 0xDC, 0xE6, + 0x2D, 0xE8, 0x35, 0xDF, 0x15, 0xD8, 0x4B, 0xD4, 0xA1, 0xD8, 0xAD, 0xD4, + 0x24, 0xE0, 0xFD, 0xD7, 0x0C, 0xE4, 0x16, 0xDD, 0x6E, 0xF1, 0xBD, 0xE7, + 0xB4, 0xFF, 0x31, 0xF4, 0xBA, 0x05, 0xDA, 0x00, 0x64, 0x0C, 0x4E, 0x0D, + 0x6B, 0x12, 0x1A, 0x18, 0x37, 0x15, 0x44, 0x1F, 0x4B, 0x1C, 0x5B, 0x27, + 0x96, 0x24, 0x12, 0x2A, 0x37, 0x22, 0x98, 0x26, 0xDF, 0x23, 0xF2, 0x2C, + 0xD0, 0x26, 0x69, 0x33, 0xC1, 0x16, 0x36, 0x2C, 0x7F, 0x02, 0x58, 0x1C, + 0xAF, 0xFC, 0x9C, 0x0E, 0xB0, 0xFE, 0x49, 0x02, 0xD7, 0x00, 0xA4, 0xF6, + 0x11, 0xFE, 0x79, 0xF1, 0xB5, 0xF3, 0x1A, 0xEC, 0x52, 0xF2, 0xE1, 0xEC, + 0x04, 0xF6, 0x7A, 0xF3, 0x7F, 0xF7, 0xD4, 0xF4, 0xBA, 0xF8, 0x93, 0xF6, + 0x7F, 0xFB, 0x2D, 0xF9, 0xC3, 0xFE, 0x68, 0xF8, 0xD6, 0xFA, 0x05, 0xF2, + 0xBD, 0xE5, 0xC7, 0xDA, 0xDA, 0xCC, 0x1E, 0xC3, 0x4E, 0xC2, 0x71, 0xB6, + 0x09, 0xBB, 0x77, 0xAD, 0x62, 0xB8, 0x0C, 0xB1, 0x87, 0xC3, 0x7E, 0xC0, + 0x23, 0xDB, 0x80, 0xD5, 0x54, 0xF9, 0xF0, 0xEF, 0xB3, 0x16, 0x06, 0x08, + 0xCA, 0x32, 0xF0, 0x1D, 0x2F, 0x40, 0x33, 0x2E, 0xEF, 0x3C, 0x1C, 0x36, + 0x9B, 0x3A, 0x5E, 0x39, 0x72, 0x2E, 0x55, 0x31, 0x2A, 0x1A, 0x6D, 0x26, + 0x6C, 0x15, 0x67, 0x24, 0x41, 0x10, 0x82, 0x1E, 0x7B, 0x05, 0xB7, 0x14, + 0xFD, 0xFD, 0xE7, 0x0F, 0x6D, 0xF3, 0x40, 0x02, 0xE8, 0xF0, 0xA4, 0xF5, + 0xFD, 0xE3, 0x5B, 0xE4, 0x87, 0xD9, 0x6E, 0xD7, 0xAE, 0xDF, 0x2A, 0xDA, + 0x3F, 0xD8, 0xCC, 0xD8, 0xE7, 0xD0, 0x38, 0xDB, 0xAB, 0xD5, 0x11, 0xE1, + 0x0D, 0xDA, 0x12, 0xE6, 0xD8, 0xE3, 0x24, 0xF5, 0xD4, 0x00, 0x30, 0x0D, + 0xC2, 0x1F, 0x10, 0x1D, 0x6E, 0x26, 0xE4, 0x21, 0xEF, 0x2F, 0xE1, 0x30, + 0xE3, 0x38, 0x7D, 0x3E, 0x2B, 0x2F, 0x1F, 0x39, 0x1E, 0x27, 0x94, 0x31, + 0x91, 0x2A, 0x3A, 0x30, 0xEA, 0x22, 0xE2, 0x24, 0x3D, 0x0E, 0x6A, 0x10, + 0x3D, 0x01, 0xDD, 0xFD, 0x64, 0xFC, 0x68, 0xF0, 0xCE, 0xF7, 0xAF, 0xE9, + 0xF4, 0xF0, 0xC6, 0xE9, 0x78, 0xF0, 0x98, 0xEF, 0x01, 0xF2, 0x54, 0xF4, + 0x86, 0xF0, 0xFE, 0xF9, 0xAB, 0xF7, 0xE4, 0x05, 0x77, 0x00, 0x2F, 0x0C, + 0x7A, 0x01, 0xE2, 0x07, 0x54, 0x09, 0x4E, 0x09, 0x7C, 0x0B, 0x2E, 0x04, + 0xAD, 0xFB, 0xEA, 0xEE, 0x3F, 0xE7, 0x80, 0xDA, 0x96, 0xD7, 0x9C, 0xC8, + 0x46, 0xD2, 0x5D, 0xBD, 0xCD, 0xC5, 0x5D, 0xB4, 0x34, 0xBE, 0x20, 0xB6, + 0x48, 0xCC, 0x2E, 0xC8, 0x39, 0xDA, 0x3F, 0xD9, 0x09, 0xF1, 0x59, 0xF2, + 0xCE, 0x17, 0xD5, 0x14, 0x2F, 0x2E, 0x5F, 0x2B, 0x3A, 0x2B, 0xAF, 0x31, + 0xE7, 0x34, 0x65, 0x3F, 0xB4, 0x3B, 0x79, 0x44, 0x3A, 0x2B, 0xD4, 0x30, + 0x94, 0x1F, 0x86, 0x1F, 0x7A, 0x1D, 0xD4, 0x17, 0xC0, 0x15, 0xBF, 0x0C, + 0x9E, 0x0B, 0x1F, 0x01, 0x8A, 0xFE, 0xC7, 0xFA, 0xD7, 0xE8, 0x8F, 0xF0, + 0x7A, 0xD2, 0xE7, 0xE1, 0xC9, 0xCB, 0xD3, 0xD9, 0x43, 0xD2, 0x6E, 0xDB, + 0x49, 0xCC, 0xC3, 0xD9, 0xF4, 0xC2, 0x47, 0xD4, 0x53, 0xC6, 0x9E, 0xD7, + 0x38, 0xD9, 0x6E, 0xE6, 0x17, 0xF2, 0x2F, 0xF2, 0xF6, 0x08, 0xA4, 0xFD, + 0x65, 0x15, 0x3E, 0x07, 0x29, 0x21, 0xE6, 0x10, 0xF3, 0x2F, 0x97, 0x20, + 0x00, 0x37, 0xFE, 0x2D, 0x24, 0x36, 0x8D, 0x31, 0xC3, 0x33, 0xC0, 0x2B, + 0x05, 0x38, 0x4F, 0x27, 0x17, 0x3A, 0xE4, 0x25, 0xF0, 0x32, 0x15, 0x21, + 0x32, 0x1E, 0xEB, 0x0B, 0xB8, 0x0D, 0xE5, 0xF9, 0x8C, 0x02, 0x6F, 0xF2, + 0xC6, 0xFA, 0xA1, 0xEC, 0xE6, 0xF4, 0xA4, 0xE7, 0x66, 0xE7, 0xF3, 0xE1, + 0x72, 0xDD, 0xD2, 0xE2, 0x9F, 0xE5, 0xF6, 0xEE, 0xB8, 0xF0, 0xE4, 0xFF, + 0x8B, 0xF3, 0x55, 0x0B, 0x86, 0xF8, 0xD6, 0x0D, 0xFF, 0xF4, 0x1A, 0x0B, + 0xDA, 0xE1, 0xEC, 0x01, 0xA6, 0xD3, 0xE7, 0xF0, 0x2C, 0xD1, 0xCA, 0xDF, + 0x42, 0xCA, 0x00, 0xCE, 0x0D, 0xC3, 0x39, 0xBD, 0x44, 0xC4, 0x9A, 0xB9, + 0x6A, 0xCD, 0xB7, 0xC5, 0x10, 0xD5, 0x56, 0xD5, 0xEF, 0xE7, 0x53, 0xEE, + 0x5C, 0x07, 0x3E, 0x10, 0x11, 0x19, 0xCE, 0x26, 0x6D, 0x27, 0xBF, 0x34, + 0x47, 0x3C, 0xF3, 0x3F, 0x2D, 0x3F, 0x79, 0x3B, 0x66, 0x31, 0x6F, 0x2B, + 0x83, 0x25, 0xB7, 0x20, 0x89, 0x1B, 0x07, 0x18, 0xF2, 0x10, 0x52, 0x0D, + 0x64, 0x06, 0xC5, 0x08, 0xE8, 0x00, 0x7B, 0x07, 0x01, 0xF8, 0xFD, 0xFD, + 0xF1, 0xEC, 0x2C, 0xF4, 0xA7, 0xEA, 0x02, 0xE6, 0xFF, 0xEB, 0x01, 0xD7, + 0x05, 0xE1, 0x24, 0xCB, 0xC2, 0xD6, 0x37, 0xC3, 0x61, 0xDE, 0x0F, 0xCF, + 0xDD, 0xDF, 0x9D, 0xDB, 0xDE, 0xE5, 0x2E, 0xE5, 0x81, 0xFC, 0x29, 0xFA, + 0xAB, 0x0F, 0x03, 0x11, 0x91, 0x15, 0xD8, 0x1A, 0xEB, 0x1B, 0x76, 0x21, + 0x43, 0x30, 0xB3, 0x32, 0x91, 0x37, 0x75, 0x38, 0x34, 0x2C, 0x31, 0x2D, + 0x9E, 0x28, 0x18, 0x2E, 0x5E, 0x28, 0x22, 0x31, 0x9D, 0x1F, 0x18, 0x26, + 0x8F, 0x14, 0xEA, 0x1B, 0x9E, 0x06, 0xAC, 0x12, 0x24, 0x03, 0x4C, 0x0C, + 0xEA, 0x02, 0x19, 0x06, 0x14, 0xFF, 0x09, 0xFE, 0xBC, 0xF6, 0xF2, 0xF5, + 0xB5, 0xEB, 0xBC, 0xF0, 0xE7, 0xEE, 0x35, 0xF5, 0x0F, 0xF5, 0x9A, 0xF9, + 0xEA, 0xF9, 0xFD, 0xFC, 0x01, 0xFF, 0x08, 0x02, 0x13, 0xF9, 0x21, 0xFE, + 0x60, 0xF5, 0x69, 0xF9, 0xF8, 0xEC, 0x77, 0xED, 0xA1, 0xD6, 0xCF, 0xD6, + 0xDD, 0xC4, 0x5B, 0xBC, 0x2C, 0xBF, 0xD1, 0xA5, 0x67, 0xC9, 0x07, 0xA8, + 0x5C, 0xD1, 0x60, 0xBA, 0x0B, 0xD3, 0x3E, 0xCF, 0xFE, 0xE7, 0x83, 0xED, + 0x1F, 0x0A, 0x48, 0x12, 0x25, 0x22, 0x66, 0x29, 0x79, 0x37, 0x26, 0x33, + 0x29, 0x46, 0xB9, 0x37, 0xB1, 0x41, 0x8D, 0x31, 0x05, 0x3B, 0xB7, 0x25, + 0xF1, 0x32, 0x04, 0x21, 0xAE, 0x1C, 0x7A, 0x1B, 0x11, 0x0A, 0x4B, 0x12, + 0xF3, 0x03, 0x2E, 0x0B, 0x4A, 0xFA, 0xFF, 0x06, 0xA8, 0xE9, 0xB3, 0x03, + 0xA8, 0xE2, 0x9C, 0x01, 0xD1, 0xD7, 0xA9, 0xF3, 0x7C, 0xC7, 0xAA, 0xE0, + 0x54, 0xCB, 0xDB, 0xD8, 0x53, 0xD7, 0xF0, 0xD2, 0x97, 0xDB, 0x79, 0xCF, + 0x5E, 0xE3, 0x6F, 0xD3, 0x32, 0xF5, 0x1D, 0xE0, 0x8D, 0x06, 0x54, 0xEE, + 0xF2, 0x16, 0x45, 0xF9, 0xD1, 0x27, 0xD4, 0x06, 0x04, 0x2F, 0x89, 0x16, + 0xF6, 0x30, 0x59, 0x2A, 0x15, 0x33, 0xA5, 0x3C, 0x23, 0x30, 0x5F, 0x40, + 0xAE, 0x2A, 0x42, 0x3D, 0xE3, 0x1F, 0x9B, 0x34, 0x65, 0x19, 0xB8, 0x2B, + 0x1A, 0x15, 0xDA, 0x20, 0x8A, 0x07, 0x4A, 0x0D, 0x50, 0xFF, 0x48, 0xFF, + 0x09, 0x01, 0xDC, 0xFE, 0xB2, 0xF7, 0x9F, 0xF8, 0x71, 0xEA, 0x19, 0xED, + 0xAB, 0xF3, 0x30, 0xF4, 0x3C, 0xFA, 0x5C, 0xFF, 0x84, 0xF7, 0x37, 0x06, + 0xF3, 0xFF, 0x9B, 0x12, 0x4C, 0x05, 0x51, 0x16, 0x46, 0x02, 0xA2, 0x0B, + 0x08, 0xFF, 0x35, 0xFD, 0xD3, 0xF4, 0x4E, 0xEE, 0x88, 0xDC, 0xD7, 0xDB, + 0xCC, 0xC1, 0x48, 0xCA, 0xE1, 0xB2, 0x88, 0xC1, 0xB1, 0xAE, 0x3A, 0xBC, + 0x16, 0xB5, 0xA1, 0xBC, 0x18, 0xCF, 0xE2, 0xCD, 0x82, 0xEE, 0xA5, 0xE7, + 0xDB, 0x0E, 0xC4, 0x01, 0x3C, 0x2E, 0x43, 0x19, 0x35, 0x44, 0x1E, 0x30, + 0xFA, 0x4B, 0x91, 0x3C, 0x32, 0x48, 0xEA, 0x38, 0xD2, 0x41, 0x4E, 0x37, + 0x85, 0x35, 0x89, 0x2E, 0x4E, 0x26, 0xB2, 0x1B, 0x06, 0x17, 0xF4, 0x11, + 0x74, 0x05, 0xF4, 0x08, 0xF1, 0xF8, 0x57, 0xF8, 0x66, 0xF3, 0x4B, 0xE8, + 0xBC, 0xEC, 0x7B, 0xDE, 0xE4, 0xDF, 0x12, 0xD9, 0xB2, 0xCE, 0x3D, 0xD2, + 0xA1, 0xC9, 0x16, 0xD1, 0x43, 0xCC, 0x42, 0xD4, 0x7C, 0xCA, 0x11, 0xD3, + 0xAC, 0xD0, 0x47, 0xD7, 0x12, 0xE1, 0x3D, 0xE4, 0xD6, 0xF5, 0x58, 0xF2, + 0xB4, 0x0C, 0x2F, 0xFE, 0xEA, 0x24, 0xD8, 0x0F, 0xAA, 0x33, 0x17, 0x23, + 0x51, 0x40, 0xEC, 0x35, 0x22, 0x4B, 0xD4, 0x47, 0x5C, 0x41, 0x5E, 0x47, + 0xCC, 0x2F, 0xA4, 0x38, 0x7C, 0x24, 0x14, 0x2C, 0x72, 0x17, 0x1F, 0x1D, + 0xCA, 0x0A, 0x11, 0x0A, 0xD6, 0xFE, 0x93, 0xFC, 0x88, 0xF5, 0x2F, 0xF5, + 0x9D, 0xF9, 0x33, 0xF6, 0xC9, 0xF3, 0x66, 0xF6, 0x7C, 0xE6, 0x22, 0xF6, + 0x74, 0xEC, 0xFA, 0x00, 0x26, 0xF7, 0x9B, 0x0A, 0x7B, 0xFB, 0x33, 0x0C, + 0xC7, 0x06, 0x8B, 0x13, 0xFF, 0x0E, 0xA9, 0x18, 0xE8, 0x08, 0x75, 0x0F, + 0xCA, 0xFF, 0xD3, 0x05, 0xD4, 0xF4, 0xE2, 0xFB, 0xEC, 0xE2, 0xED, 0xE9, + 0x81, 0xCE, 0xA5, 0xD5, 0xB5, 0xC3, 0xAF, 0xCA, 0x2E, 0xBF, 0x03, 0xC5, + 0x7E, 0xBD, 0x91, 0xC0, 0xC9, 0xCB, 0x93, 0xCB, 0xBC, 0xE3, 0xB2, 0xE3, + 0x47, 0xFB, 0x1A, 0x02, 0x83, 0x12, 0x46, 0x23, 0x56, 0x2A, 0x8F, 0x3D, + 0xF7, 0x3A, 0x3A, 0x4A, 0xE3, 0x3D, 0xCC, 0x47, 0xA0, 0x41, 0xE1, 0x3C, + 0x82, 0x3D, 0xD0, 0x27, 0xAD, 0x27, 0xC8, 0x0A, 0x8E, 0x19, 0xE9, 0xF7, + 0x3D, 0x10, 0x58, 0xEC, 0x4D, 0x04, 0x15, 0xE5, 0xD8, 0xFB, 0x71, 0xE3, + 0xB9, 0xF0, 0x28, 0xE1, 0x9C, 0xE5, 0x33, 0xE1, 0x04, 0xD5, 0xBC, 0xDC, + 0xED, 0xCA, 0x0E, 0xD9, 0x87, 0xCC, 0x02, 0xD6, 0x62, 0xC7, 0x35, 0xCB, + 0xCC, 0xD1, 0x61, 0xCC, 0x89, 0xF1, 0xDA, 0xD9, 0x8D, 0x06, 0x05, 0xE6, + 0x28, 0x0E, 0xD2, 0xF5, 0x7A, 0x17, 0x32, 0x0D, 0x9D, 0x21, 0x6E, 0x25, + 0x83, 0x2A, 0x23, 0x36, 0x3C, 0x36, 0x9C, 0x47, 0x89, 0x33, 0x1D, 0x4B, + 0x87, 0x2B, 0x56, 0x41, 0x57, 0x2B, 0x58, 0x3A, 0x45, 0x27, 0xB6, 0x31, + 0x4B, 0x20, 0x02, 0x23, 0x94, 0x0F, 0xF6, 0x08, 0xE8, 0x02, 0xD6, 0xFA, + 0xB7, 0xFD, 0x7F, 0xFC, 0x3E, 0xF0, 0xE1, 0xF6, 0x81, 0xE3, 0xDC, 0xEC, + 0x94, 0xE5, 0x75, 0xEB, 0xEB, 0xEB, 0x99, 0xED, 0xBD, 0xF1, 0x6F, 0xF4, + 0x66, 0xFD, 0x6D, 0x02, 0x4D, 0x01, 0xC3, 0x09, 0xCB, 0xF7, 0x57, 0x05, + 0x58, 0xF0, 0xA7, 0xFF, 0x60, 0xEC, 0x57, 0xF7, 0x64, 0xDF, 0x88, 0xDE, + 0xBC, 0xCE, 0xD6, 0xBF, 0xEC, 0xC6, 0xAF, 0xB2, 0x67, 0xC4, 0x30, 0xB1, + 0x20, 0xC4, 0x5D, 0xB4, 0x10, 0xD3, 0x7D, 0xC6, 0x3A, 0xED, 0x84, 0xDF, + 0x5A, 0x02, 0x33, 0xFB, 0x5B, 0x14, 0xD9, 0x1B, 0xCB, 0x2E, 0x7D, 0x3D, + 0x65, 0x40, 0xD6, 0x4C, 0xD5, 0x3B, 0x4C, 0x42, 0x3F, 0x3B, 0x78, 0x38, + 0xA6, 0x38, 0xA4, 0x2C, 0x6D, 0x21, 0x25, 0x14, 0x36, 0x04, 0x61, 0x02, + 0xC6, 0xF8, 0x79, 0xFE, 0xE1, 0xF4, 0x4E, 0xF9, 0x88, 0xEC, 0x8B, 0xF4, + 0x98, 0xEE, 0x69, 0xF9, 0xA8, 0xED, 0x8C, 0xF4, 0xD0, 0xDF, 0x8C, 0xE5, + 0x39, 0xD7, 0xAB, 0xDC, 0x01, 0xD5, 0xD2, 0xD6, 0x4B, 0xCF, 0x11, 0xCC, + 0x9F, 0xCE, 0xEA, 0xC5, 0xE1, 0xDC, 0xBE, 0xD1, 0xAA, 0xF4, 0xBF, 0xE6, + 0x84, 0x09, 0xBF, 0xF8, 0x4F, 0x1D, 0xA4, 0x0A, 0xF3, 0x32, 0x93, 0x1F, + 0xBB, 0x3F, 0xC2, 0x34, 0x04, 0x40, 0x75, 0x40, 0x2F, 0x3F, 0x36, 0x41, + 0x8F, 0x35, 0x0D, 0x3D, 0x81, 0x20, 0xDC, 0x36, 0x88, 0x16, 0xD3, 0x31, + 0x8C, 0x0F, 0x2D, 0x24, 0xD2, 0xFD, 0xF6, 0x0D, 0x11, 0xF3, 0x45, 0xFF, + 0x59, 0xF7, 0xAF, 0x02, 0x4E, 0xF0, 0xA4, 0x06, 0x41, 0xE6, 0x14, 0xFE, + 0x80, 0xF3, 0xF4, 0xFA, 0xB8, 0x03, 0xD2, 0xFE, 0x13, 0x08, 0xD7, 0xFE, + 0x15, 0x0B, 0xA5, 0x00, 0x24, 0x0E, 0xD5, 0x0A, 0x89, 0xFF, 0x07, 0x0C, + 0xB9, 0xEC, 0x76, 0x05, 0xA4, 0xE8, 0xD2, 0xFA, 0x33, 0xD7, 0xD3, 0xDD, + 0x45, 0xBB, 0x0E, 0xC0, 0xF3, 0xB1, 0xA8, 0xB0, 0xFF, 0xB4, 0x9B, 0xA9, + 0xA5, 0xBA, 0x01, 0xAD, 0xC5, 0xD0, 0xAD, 0xBD, 0x0C, 0xF6, 0x13, 0xDD, + 0x2D, 0x17, 0x8B, 0xFF, 0x12, 0x31, 0xC0, 0x17, 0x4E, 0x48, 0x4B, 0x31, + 0x5A, 0x50, 0x95, 0x43, 0xE2, 0x46, 0xA7, 0x3E, 0x11, 0x41, 0x9C, 0x30, + 0x2E, 0x3B, 0x79, 0x21, 0x5A, 0x25, 0x3C, 0x0E, 0x62, 0x0E, 0xF7, 0xFF, + 0x5F, 0xFC, 0x94, 0xF7, 0xDF, 0xE9, 0xE8, 0xF5, 0x58, 0xD7, 0xE8, 0xF0, + 0x6D, 0xCE, 0x03, 0xE9, 0xBE, 0xC9, 0xA0, 0xE5, 0x73, 0xC5, 0x14, 0xE4, + 0x78, 0xC4, 0x2A, 0xDF, 0x35, 0xC2, 0xF4, 0xD7, 0x8A, 0xC6, 0x89, 0xD6, + 0xA3, 0xD2, 0x74, 0xD5, 0x00, 0xE4, 0x07, 0xD7, 0xDD, 0xF8, 0x7D, 0xE0, + 0x85, 0x10, 0xFD, 0xEF, 0x18, 0x28, 0x6A, 0x02, 0x87, 0x37, 0x16, 0x1B, + 0x4A, 0x42, 0x89, 0x37, 0x09, 0x43, 0xAF, 0x47, 0x79, 0x3B, 0x45, 0x44, + 0xAC, 0x35, 0xD1, 0x3B, 0xC4, 0x2B, 0xA0, 0x35, 0x87, 0x1D, 0x42, 0x28, + 0xBA, 0x09, 0xA3, 0x10, 0x49, 0xF3, 0x33, 0xF8, 0xA2, 0xEE, 0xBE, 0xEC, + 0xED, 0xF2, 0x1C, 0xEE, 0xFB, 0xEB, 0x56, 0xEE, 0xD7, 0xE5, 0x04, 0xEF, + 0x11, 0xF1, 0x6C, 0xFF, 0xFF, 0x02, 0xB5, 0x0F, 0x55, 0x0C, 0x86, 0x10, + 0x97, 0x15, 0xC0, 0x12, 0x12, 0x13, 0xE2, 0x13, 0x43, 0x06, 0xF6, 0x0A, + 0x10, 0xFD, 0x29, 0xFE, 0x86, 0xEC, 0x9D, 0xEE, 0x15, 0xCE, 0x6B, 0xD5, + 0x58, 0xB2, 0x29, 0xBD, 0xB2, 0xA8, 0xC0, 0xB2, 0xF5, 0xA7, 0xF9, 0xB3, + 0x08, 0xAE, 0xC8, 0xBD, 0x5F, 0xC4, 0x4B, 0xD6, 0x57, 0xE5, 0x53, 0xF9, + 0x3E, 0x0A, 0xC8, 0x19, 0x82, 0x2C, 0xD5, 0x35, 0x41, 0x47, 0x50, 0x4C, + 0xD8, 0x53, 0x60, 0x51, 0x76, 0x52, 0x7A, 0x46, 0xAE, 0x4E, 0xA8, 0x34, + 0xEF, 0x3D, 0xFF, 0x1D, 0x32, 0x24, 0x52, 0x04, 0xC5, 0x10, 0x68, 0xEC, + 0x8E, 0x05, 0x73, 0xDE, 0xA7, 0x00, 0xC5, 0xDC, 0x98, 0xF6, 0x82, 0xDF, + 0xFF, 0xEC, 0xA3, 0xDF, 0x9A, 0xE3, 0x10, 0xE0, 0x22, 0xD7, 0xCC, 0xE4, + 0x9D, 0xD1, 0x0C, 0xE9, 0x85, 0xD0, 0xF5, 0xE7, 0xEC, 0xD0, 0xDD, 0xE1, + 0xF9, 0xD6, 0x25, 0xDD, 0xFF, 0xE1, 0xCF, 0xE0, 0x1C, 0xF3, 0x3F, 0xEE, + 0x2A, 0x07, 0xF9, 0xFD, 0x32, 0x19, 0xDC, 0x0B, 0xB9, 0x30, 0x97, 0x24, + 0x98, 0x45, 0x53, 0x3F, 0x45, 0x49, 0xA9, 0x46, 0x13, 0x40, 0x1A, 0x42, + 0xCC, 0x31, 0xC2, 0x3B, 0xF8, 0x1D, 0xBB, 0x2D, 0x5A, 0x0E, 0x03, 0x1C, + 0xFA, 0xFB, 0x61, 0x0B, 0xC6, 0xE2, 0xCB, 0xFB, 0x3C, 0xDC, 0xF9, 0xF6, + 0xC9, 0xDF, 0x64, 0xFA, 0xDF, 0xDD, 0x68, 0xF9, 0x35, 0xE4, 0xFD, 0xF7, + 0x8B, 0xF6, 0xC9, 0xFE, 0xDF, 0xFC, 0x49, 0x00, 0xB0, 0xFF, 0x5E, 0xFD, + 0x4D, 0x0F, 0xD5, 0xFD, 0x9A, 0x13, 0xB5, 0xF8, 0xC0, 0x0D, 0x0C, 0xF3, + 0x5C, 0x06, 0x09, 0xEF, 0x56, 0xF0, 0x70, 0xE3, 0x52, 0xD3, 0x29, 0xD4, + 0x31, 0xC0, 0x23, 0xC7, 0x80, 0xB8, 0xFF, 0xBA, 0x99, 0xBB, 0x92, 0xB7, + 0x69, 0xCA, 0x6A, 0xC2, 0xB3, 0xE1, 0xD2, 0xD4, 0xFA, 0x00, 0x6A, 0xF2, + 0x07, 0x1E, 0x7E, 0x16, 0xF4, 0x2F, 0xFF, 0x32, 0xC2, 0x3D, 0x10, 0x48, + 0xCC, 0x47, 0x6F, 0x53, 0x78, 0x45, 0x81, 0x4B, 0xDC, 0x34, 0x95, 0x36, + 0xCF, 0x20, 0xFE, 0x1E, 0x13, 0x09, 0xD7, 0x01, 0xA2, 0xF3, 0xB2, 0xEB, + 0x56, 0xEE, 0xC6, 0xE5, 0x24, 0xEB, 0x82, 0xE3, 0x22, 0xEC, 0x4D, 0xE7, + 0x5D, 0xE7, 0xF6, 0xE9, 0xE1, 0xDD, 0x3B, 0xEE, 0xA2, 0xDA, 0x53, 0xF2, + 0x82, 0xD3, 0x96, 0xE7, 0xAE, 0xD0, 0xD4, 0xDC, 0x42, 0xD3, 0xA6, 0xDB, + 0xE9, 0xDB, 0x5F, 0xDF, 0x37, 0xEA, 0xBC, 0xE5, 0x84, 0x01, 0xEE, 0xF5, + 0x2E, 0x19, 0x19, 0x08, 0x57, 0x26, 0xAA, 0x18, 0x69, 0x36, 0x3E, 0x32, + 0xD0, 0x42, 0xD9, 0x41, 0xD5, 0x40, 0xF8, 0x3F, 0x75, 0x3A, 0xED, 0x3D, + 0x4A, 0x32, 0x02, 0x39, 0xDC, 0x2C, 0x7B, 0x2C, 0x4A, 0x1F, 0x71, 0x15, + 0x47, 0x05, 0x37, 0xFD, 0x47, 0xF5, 0xBE, 0xF3, 0xC7, 0xEC, 0x95, 0xF4, + 0xB6, 0xE2, 0x53, 0xF3, 0xAA, 0xDF, 0x6F, 0xF1, 0xFE, 0xEC, 0x30, 0xF8, + 0x4F, 0xFE, 0x14, 0x03, 0x40, 0x05, 0x0D, 0x08, 0x8E, 0x0C, 0x91, 0x0A, + 0x2A, 0x0E, 0x03, 0x0B, 0x8D, 0x05, 0x97, 0x03, 0xBD, 0xFC, 0x18, 0xF5, + 0x1A, 0xF1, 0x4A, 0xE4, 0xE4, 0xDD, 0x80, 0xD2, 0x48, 0xC9, 0x16, 0xC2, + 0x9C, 0xC0, 0xA0, 0xB8, 0xD6, 0xC3, 0xAA, 0xB9, 0xA3, 0xC9, 0xFE, 0xC2, + 0x32, 0xD6, 0x0B, 0xD4, 0x37, 0xF0, 0x78, 0xF2, 0x02, 0x10, 0xCA, 0x13, + 0x33, 0x2A, 0xEB, 0x2F, 0xD4, 0x39, 0x3A, 0x41, 0x1B, 0x45, 0x9E, 0x49, + 0x4C, 0x48, 0x19, 0x48, 0xF7, 0x40, 0xC5, 0x38, 0x54, 0x32, 0x18, 0x21, + 0xE9, 0x1F, 0x24, 0x05, 0xDD, 0x08, 0xDE, 0xEC, 0x98, 0xF4, 0x89, 0xE1, + 0xEF, 0xE4, 0x9B, 0xE0, 0x2E, 0xD6, 0x1B, 0xE2, 0xC3, 0xCF, 0xA0, 0xE7, + 0x23, 0xCD, 0x6F, 0xEF, 0x90, 0xCD, 0x8A, 0xF8, 0x1F, 0xD0, 0xFF, 0xFA, + 0xC6, 0xD1, 0xC6, 0xED, 0x2F, 0xD7, 0x6B, 0xDE, 0x5D, 0xE2, 0xBD, 0xDA, + 0xD1, 0xEB, 0x4F, 0xDC, 0x25, 0xF8, 0xAA, 0xE4, 0x42, 0x0B, 0x60, 0xF4, + 0x21, 0x1D, 0x22, 0x01, 0x49, 0x2F, 0x85, 0x13, 0x23, 0x42, 0x73, 0x2D, + 0x6B, 0x45, 0x8D, 0x39, 0x1E, 0x3A, 0x1E, 0x36, 0xF0, 0x2F, 0x2C, 0x33, + 0xA4, 0x25, 0xEC, 0x2B, 0xFB, 0x18, 0x06, 0x1A, 0xAD, 0x08, 0x1C, 0x05, + 0xEE, 0xFA, 0xE8, 0xF5, 0x40, 0xF5, 0xCE, 0xF3, 0xC5, 0xEE, 0xD4, 0xF9, + 0x65, 0xE7, 0x7E, 0xFF, 0xF5, 0xEA, 0xB7, 0x05, 0xE7, 0xF9, 0xF5, 0x0A, + 0xFD, 0x05, 0x92, 0x08, 0x5E, 0x15, 0x78, 0x09, 0x41, 0x21, 0x4D, 0x0B, + 0xF5, 0x16, 0x62, 0x04, 0x33, 0x08, 0x4E, 0xFE, 0x22, 0xF7, 0x9C, 0xF6, + 0x1F, 0xDD, 0x08, 0xE6, 0x1B, 0xC6, 0x8A, 0xD6, 0x80, 0xB2, 0x01, 0xCA, + 0x6B, 0xA9, 0x24, 0xC5, 0xE4, 0xAD, 0x4E, 0xCE, 0x6D, 0xBD, 0xE1, 0xDA, + 0x6E, 0xDB, 0x09, 0xEE, 0xB3, 0x01, 0xAE, 0x07, 0x82, 0x25, 0x9B, 0x22, + 0x9D, 0x3D, 0x4B, 0x3A, 0x96, 0x4D, 0x4E, 0x49, 0xAB, 0x51, 0x56, 0x4A, + 0x40, 0x48, 0x1C, 0x3E, 0x0C, 0x39, 0xE2, 0x2B, 0x14, 0x26, 0x7F, 0x14, + 0xD3, 0x13, 0x36, 0xFC, 0x1B, 0x07, 0xC5, 0xEE, 0x0B, 0xFC, 0xB0, 0xE9, + 0xD1, 0xEF, 0x11, 0xE7, 0x3D, 0xE3, 0x9B, 0xE5, 0x50, 0xDA, 0xCA, 0xE4, + 0xDA, 0xD5, 0x93, 0xE6, 0x5F, 0xD4, 0x4E, 0xE8, 0x8E, 0xD1, 0xFE, 0xE5, + 0x7F, 0xCD, 0xD9, 0xE1, 0xF3, 0xD2, 0xDE, 0xDF, 0x6C, 0xE0, 0x82, 0xDD, + 0x55, 0xF2, 0xD6, 0xE0, 0x15, 0x05, 0xAB, 0xED, 0xCC, 0x13, 0x02, 0xFC, + 0x67, 0x25, 0xE8, 0x0D, 0x41, 0x39, 0xC3, 0x25, 0x4B, 0x46, 0x00, 0x35, + 0xB6, 0x45, 0xBF, 0x34, 0xD2, 0x3B, 0x2F, 0x32, 0x51, 0x2E, 0x3A, 0x2D, + 0xF1, 0x20, 0x53, 0x24, 0x9A, 0x0D, 0x57, 0x14, 0xE2, 0xF4, 0x41, 0x00, + 0xDD, 0xED, 0x9A, 0xF7, 0x99, 0xEF, 0x5B, 0xF4, 0xDD, 0xEC, 0x05, 0xF5, + 0x88, 0xEE, 0x68, 0xFD, 0xE5, 0xF6, 0x0C, 0x0A, 0x16, 0xF9, 0x53, 0x12, + 0x66, 0xF8, 0x4A, 0x16, 0x2E, 0x01, 0xE2, 0x1A, 0xD2, 0x07, 0x04, 0x13, + 0x63, 0x09, 0x6B, 0x01, 0x0A, 0x09, 0x0B, 0xF1, 0xD2, 0xFE, 0x76, 0xDE, + 0x01, 0xE7, 0x6B, 0xCA, 0xF5, 0xCD, 0x91, 0xB8, 0xF4, 0xC0, 0x0D, 0xB1, + 0x61, 0xC3, 0xAB, 0xB9, 0xDB, 0xC7, 0xE7, 0xC7, 0x02, 0xD0, 0x38, 0xDE, + 0xB0, 0xEB, 0x8D, 0x02, 0xA4, 0x08, 0x75, 0x21, 0x2B, 0x1E, 0x64, 0x36, + 0xAF, 0x33, 0xED, 0x47, 0x6B, 0x40, 0xB7, 0x4C, 0x80, 0x40, 0xA9, 0x40, + 0x7C, 0x3A, 0x94, 0x2E, 0xD2, 0x2F, 0x5C, 0x17, 0x1F, 0x1C, 0xCC, 0xFA, + 0x9F, 0x07, 0xCC, 0xE8, 0xB6, 0xFC, 0x13, 0xE3, 0xBD, 0xF5, 0xB1, 0xE1, + 0x05, 0xEE, 0xCB, 0xE2, 0x43, 0xE4, 0xBD, 0xE7, 0x8C, 0xDF, 0x5C, 0xF0, + 0xFD, 0xE5, 0xDE, 0xFA, 0x94, 0xE2, 0xC0, 0xF8, 0xA6, 0xD7, 0xEA, 0xEE, + 0xE9, 0xD8, 0x9B, 0xEF, 0x57, 0xDD, 0x07, 0xEC, 0xB3, 0xE1, 0xC4, 0xE2, + 0x6A, 0xF1, 0x22, 0xE6, 0xD7, 0x00, 0xEE, 0xEC, 0xB2, 0x0F, 0xDA, 0xF7, + 0x5B, 0x26, 0xF2, 0x0F, 0xA6, 0x38, 0x64, 0x24, 0x33, 0x3B, 0x8B, 0x29, + 0x60, 0x37, 0x9A, 0x2B, 0xBB, 0x32, 0x5F, 0x2C, 0xEA, 0x2A, 0x31, 0x27, + 0xC4, 0x1E, 0x1E, 0x1E, 0xB5, 0x02, 0x88, 0x0B, 0x39, 0xEE, 0x8A, 0xFD, + 0xF0, 0xE9, 0xFF, 0xF9, 0x61, 0xE1, 0x66, 0xF2, 0xA3, 0xE0, 0xA3, 0xF1, + 0x25, 0xEC, 0x57, 0xFE, 0x70, 0xF5, 0xE3, 0x0A, 0x94, 0xFB, 0x69, 0x16, + 0xA3, 0x02, 0x0B, 0x1E, 0x41, 0x03, 0xC9, 0x17, 0xC1, 0xFD, 0xC8, 0x08, + 0x28, 0xF8, 0xEA, 0xF5, 0x54, 0xF1, 0x5F, 0xE2, 0xB4, 0xE3, 0x73, 0xCC, + 0x41, 0xD2, 0x30, 0xBC, 0x2C, 0xC6, 0x86, 0xBC, 0xC4, 0xC3, 0x17, 0xC7, + 0x58, 0xCF, 0xE7, 0xDA, 0xA0, 0xE3, 0x23, 0xF2, 0xDD, 0xFD, 0xBA, 0x0D, + 0xF0, 0x1B, 0x19, 0x2C, 0xE2, 0x32, 0xA0, 0x40, 0xBD, 0x42, 0x0E, 0x4A, + 0xE4, 0x4C, 0x7E, 0x47, 0x03, 0x4A, 0xF8, 0x3A, 0xBB, 0x39, 0x1A, 0x29, + 0x86, 0x25, 0xCC, 0x12, 0xB4, 0x0E, 0xCF, 0xF8, 0xF9, 0xF6, 0x39, 0xE5, + 0x5A, 0xEB, 0x2D, 0xE2, 0xB8, 0xE7, 0x14, 0xE1, 0xAC, 0xE5, 0xE1, 0xDD, + 0xF7, 0xE5, 0x65, 0xE3, 0x94, 0xE7, 0x8E, 0xED, 0xA4, 0xE6, 0xD5, 0xF3, + 0xE9, 0xDC, 0x27, 0xEF, 0x5E, 0xD2, 0xB9, 0xE3, 0xC2, 0xD2, 0xC5, 0xDC, + 0x22, 0xD9, 0x81, 0xD9, 0xDC, 0xDD, 0xB8, 0xD7, 0x60, 0xEC, 0xCE, 0xE2, + 0x61, 0xFC, 0x66, 0xF1, 0x15, 0x0A, 0x33, 0x01, 0x20, 0x25, 0x85, 0x1E, + 0x31, 0x3F, 0x74, 0x36, 0xB9, 0x43, 0x8E, 0x38, 0x36, 0x3D, 0x80, 0x34, + 0x28, 0x35, 0x5C, 0x31, 0xA6, 0x28, 0x13, 0x23, 0x6E, 0x16, 0x21, 0x0C, + 0x9C, 0x02, 0x6C, 0xF7, 0x99, 0xFB, 0x28, 0xEE, 0x19, 0xFF, 0x5E, 0xF0, + 0x92, 0xFD, 0x75, 0xF3, 0xDB, 0xF8, 0x49, 0xF8, 0x36, 0xFD, 0xDA, 0x02, + 0xFF, 0x00, 0xA3, 0x0B, 0xFF, 0x01, 0xFC, 0x15, 0xC4, 0x08, 0xAB, 0x1F, + 0xE3, 0x09, 0x5F, 0x18, 0xF2, 0x05, 0xB6, 0x05, 0x8E, 0x01, 0xCE, 0xF3, + 0x7E, 0xF4, 0x02, 0xDF, 0x1C, 0xDD, 0xA3, 0xC5, 0x81, 0xC4, 0xB4, 0xB3, + 0x43, 0xB6, 0x60, 0xAE, 0xDD, 0xB5, 0xFA, 0xB5, 0x04, 0xBE, 0xBB, 0xC7, + 0x17, 0xD6, 0x2F, 0xE7, 0x01, 0xFB, 0x41, 0x0D, 0xEB, 0x1F, 0xC3, 0x2C, + 0x76, 0x39, 0x8B, 0x49, 0x05, 0x44, 0x6C, 0x5E, 0x69, 0x43, 0xBC, 0x61, + 0x99, 0x37, 0x8A, 0x52, 0x01, 0x27, 0xEB, 0x3B, 0x7C, 0x15, 0x78, 0x22, + 0x18, 0x05, 0xC5, 0x03, 0xD9, 0xF6, 0xF1, 0xE8, 0x12, 0xF0, 0xAD, 0xD9, + 0xA8, 0xEE, 0x60, 0xD2, 0xC8, 0xEC, 0xEA, 0xCF, 0x8C, 0xEC, 0x6F, 0xD5, + 0x2C, 0xEC, 0xB0, 0xDF, 0xD4, 0xE8, 0x66, 0xEA, 0x2A, 0xDD, 0x17, 0xEF, + 0xD6, 0xD0, 0x27, 0xEC, 0xE2, 0xCB, 0x48, 0xE5, 0xB6, 0xD0, 0x72, 0xDE, + 0x5E, 0xDA, 0x98, 0xD8, 0x50, 0xEB, 0xF3, 0xDC, 0xEA, 0xFF, 0x85, 0xE9, + 0x0D, 0x11, 0xCD, 0xF5, 0x53, 0x2B, 0x85, 0x0D, 0xD9, 0x41, 0x5D, 0x28, + 0x47, 0x45, 0x23, 0x32, 0x14, 0x43, 0xA8, 0x33, 0xF4, 0x3F, 0x74, 0x36, + 0x5F, 0x30, 0xCC, 0x2F, 0x6D, 0x17, 0xAC, 0x1F, 0xF6, 0xFC, 0x53, 0x08, + 0x2F, 0xED, 0x97, 0xF6, 0x9A, 0xEE, 0x3A, 0xF4, 0x98, 0xEC, 0x0D, 0xF4, + 0x53, 0xE4, 0x5F, 0xFA, 0x68, 0xE5, 0x3C, 0x0C, 0xA3, 0xEA, 0x3A, 0x19, + 0xF7, 0xF2, 0xD9, 0x1D, 0x52, 0x03, 0x5E, 0x24, 0x09, 0x08, 0x12, 0x1E, + 0x3E, 0x03, 0x3C, 0x0A, 0x09, 0x03, 0xD7, 0xF9, 0x63, 0xFC, 0x8B, 0xE6, + 0x35, 0xE9, 0x9E, 0xCE, 0x33, 0xD3, 0x66, 0xB9, 0x07, 0xC7, 0x05, 0xAF, + 0x3D, 0xC5, 0xA1, 0xB4, 0x39, 0xC8, 0x61, 0xC3, 0xDC, 0xD3, 0xB1, 0xD8, + 0xBF, 0xF0, 0x6A, 0xF6, 0xDF, 0x14, 0x78, 0x14, 0x69, 0x32, 0x2D, 0x2E, + 0xCF, 0x46, 0x92, 0x43, 0xEF, 0x4A, 0x2B, 0x4C, 0x12, 0x3E, 0x31, 0x44, + 0xF8, 0x2B, 0x77, 0x35, 0x55, 0x15, 0xD2, 0x1D, 0xDB, 0xFC, 0x00, 0xFD, + 0x56, 0xEF, 0xAE, 0xE2, 0x71, 0xED, 0x07, 0xD4, 0xDD, 0xF1, 0x76, 0xD2, + 0x26, 0xF5, 0x96, 0xDB, 0xAB, 0xF5, 0xE7, 0xE7, 0x22, 0xF8, 0xD9, 0xF3, + 0x29, 0xFA, 0xB0, 0xFD, 0xBF, 0xF0, 0xEA, 0xFC, 0xA8, 0xE0, 0x25, 0xF0, + 0xBB, 0xD9, 0xAA, 0xE5, 0xE3, 0xD5, 0xB1, 0xDE, 0x7E, 0xD2, 0xB5, 0xD9, + 0x65, 0xDB, 0xAF, 0xDD, 0x04, 0xEB, 0xDB, 0xE8, 0x7A, 0xFA, 0x89, 0xFB, + 0xA0, 0x14, 0x4C, 0x1C, 0x07, 0x2D, 0xCD, 0x37, 0x9C, 0x35, 0x03, 0x3D, + 0xF5, 0x39, 0x5E, 0x3A, 0x3A, 0x3E, 0x9C, 0x34, 0x50, 0x3B, 0x62, 0x24, + 0xC7, 0x2C, 0xA8, 0x0B, 0x6F, 0x17, 0xA8, 0xF3, 0x6C, 0x06, 0x15, 0xE9, + 0xC7, 0xFE, 0xBC, 0xEB, 0x25, 0xF7, 0xBE, 0xF0, 0xE3, 0xF1, 0xA8, 0xF8, + 0x5C, 0xF2, 0x88, 0x03, 0xD4, 0xF2, 0x9F, 0x11, 0x86, 0xF2, 0x3B, 0x1E, + 0xC3, 0xF5, 0x7D, 0x23, 0x1D, 0xFA, 0xBC, 0x1D, 0xE9, 0xF6, 0x4F, 0x11, + 0x0E, 0xF2, 0xD0, 0x07, 0x4F, 0xEB, 0x9C, 0xF7, 0x17, 0xDD, 0x4A, 0xE0, + 0x56, 0xCB, 0x50, 0xCA, 0x63, 0xC2, 0x58, 0xBC, 0x8B, 0xC9, 0x1C, 0xBA, + 0x70, 0xD7, 0x55, 0xC0, 0x87, 0xE9, 0x78, 0xD0, 0x2E, 0x06, 0x84, 0xED, + 0x51, 0x22, 0x8B, 0x0D, 0x10, 0x37, 0xED, 0x2A, 0xB0, 0x44, 0xFE, 0x42, + 0xF4, 0x42, 0xEB, 0x4B, 0x5F, 0x37, 0xED, 0x48, 0x8C, 0x27, 0xA2, 0x3A, + 0xBC, 0x12, 0x8B, 0x1D, 0x85, 0x01, 0xCB, 0xFD, 0x35, 0xF2, 0xE4, 0xE1, + 0x5D, 0xE6, 0xEC, 0xCD, 0x6E, 0xE6, 0x76, 0xC8, 0xCB, 0xEE, 0xDD, 0xCD, + 0x2C, 0xF7, 0xE5, 0xDA, 0x91, 0xF9, 0xD1, 0xEC, 0x92, 0xF5, 0x00, 0xFC, + 0xD1, 0xE8, 0xA9, 0xFB, 0xD8, 0xDC, 0x7A, 0xF1, 0xAA, 0xDA, 0x86, 0xEA, + 0x3A, 0xDC, 0x73, 0xE6, 0x05, 0xE0, 0x14, 0xE7, 0x5A, 0xE9, 0x1B, 0xF1, + 0x6C, 0xF6, 0xF8, 0x01, 0x44, 0x06, 0xBF, 0x14, 0xD6, 0x1D, 0x74, 0x2E, + 0x1C, 0x2E, 0x33, 0x41, 0x95, 0x2C, 0xB9, 0x3E, 0xE1, 0x2C, 0xE7, 0x36, + 0x2C, 0x2D, 0x03, 0x2B, 0x5E, 0x22, 0xE7, 0x13, 0x0C, 0x15, 0x71, 0xF8, + 0xC9, 0x09, 0x90, 0xE2, 0x32, 0x01, 0x2F, 0xDE, 0x2E, 0xFA, 0xD6, 0xE7, + 0x24, 0xF2, 0x65, 0xEF, 0x29, 0xF1, 0xF2, 0xF6, 0x25, 0xF8, 0xC3, 0x01, + 0x31, 0x01, 0xD6, 0x0A, 0x29, 0x0B, 0xD3, 0x0F, 0x7E, 0x10, 0xA9, 0x11, + 0xFD, 0x09, 0x1E, 0x0E, 0xC8, 0xFE, 0x20, 0x09, 0xD4, 0xF2, 0x53, 0x00, + 0x49, 0xE2, 0x83, 0xEC, 0x92, 0xD1, 0xD1, 0xD6, 0x78, 0xC4, 0xD4, 0xC4, + 0xDA, 0xBA, 0xDE, 0xB8, 0xFF, 0xBB, 0x65, 0xBB, 0xC7, 0xC8, 0xE2, 0xCA, + 0xB7, 0xDF, 0xDC, 0xE4, 0xF7, 0x00, 0xE0, 0x09, 0xFC, 0x20, 0x06, 0x30, + 0x8F, 0x3E, 0x56, 0x50, 0x13, 0x54, 0x9E, 0x63, 0x89, 0x55, 0x0E, 0x62, + 0x5E, 0x49, 0xC8, 0x51, 0x68, 0x35, 0xBB, 0x37, 0x81, 0x1C, 0x7F, 0x18, + 0x66, 0x04, 0xC4, 0xFC, 0x7B, 0xF2, 0x06, 0xE8, 0x43, 0xE6, 0x67, 0xDA, + 0x89, 0xDF, 0x89, 0xD7, 0xDF, 0xDB, 0x52, 0xDB, 0x87, 0xDA, 0x3B, 0xDF, + 0xAF, 0xE2, 0x13, 0xE6, 0x35, 0xEC, 0x0E, 0xEA, 0xD8, 0xEA, 0xC5, 0xE4, + 0x8C, 0xE8, 0xD0, 0xE1, 0x81, 0xEC, 0x5B, 0xE3, 0x34, 0xF0, 0x1E, 0xE1, + 0x43, 0xF9, 0xAF, 0xE6, 0x8E, 0x01, 0x5B, 0xF2, 0xB0, 0x03, 0x7D, 0xFC, + 0xE1, 0x10, 0x5C, 0x11, 0x77, 0x27, 0x27, 0x2C, 0x05, 0x34, 0x99, 0x38, + 0x10, 0x37, 0xB4, 0x3A, 0x9F, 0x37, 0xEA, 0x3C, 0xF5, 0x32, 0x44, 0x3A, + 0x1F, 0x24, 0xEC, 0x29, 0x59, 0x0F, 0xB3, 0x0E, 0x7E, 0xFE, 0x5A, 0xF5, + 0xAC, 0xF6, 0xA7, 0xE8, 0x34, 0xF1, 0x98, 0xE5, 0x91, 0xEB, 0xC5, 0xE6, + 0x91, 0xED, 0xC3, 0xED, 0x5C, 0xF5, 0x9D, 0xFA, 0xCC, 0xFB, 0x44, 0x0A, + 0xFA, 0x01, 0x54, 0x19, 0x2F, 0x07, 0xCB, 0x20, 0x18, 0x04, 0x63, 0x1B, + 0x81, 0xFC, 0xE9, 0x11, 0x47, 0xF3, 0x85, 0x03, 0x09, 0xE5, 0x73, 0xE9, + 0xD6, 0xD4, 0xCF, 0xCA, 0xB9, 0xCB, 0xA7, 0xB3, 0x4F, 0xCC, 0x0B, 0xA8, + 0xB4, 0xD3, 0xF5, 0xA9, 0xEF, 0xE0, 0x88, 0xBC, 0x0F, 0xF3, 0xC1, 0xDA, + 0x5F, 0x09, 0xD7, 0xFD, 0x44, 0x21, 0x92, 0x20, 0x69, 0x39, 0xD7, 0x3C, + 0x5E, 0x4B, 0x85, 0x4B, 0xB1, 0x4E, 0x10, 0x4C, 0x17, 0x44, 0x10, 0x43, + 0xEB, 0x2F, 0xAB, 0x2E, 0x8E, 0x17, 0x41, 0x13, 0x64, 0xFB, 0x7D, 0xFA, + 0x61, 0xE3, 0xC8, 0xEC, 0xE4, 0xD6, 0x12, 0xE7, 0xF6, 0xD4, 0xBB, 0xE4, + 0xA1, 0xD7, 0xC6, 0xE4, 0x57, 0xDD, 0x3C, 0xE6, 0xF7, 0xE5, 0x4F, 0xE6, + 0x64, 0xE6, 0x93, 0xDE, 0x05, 0xE0, 0xDF, 0xD6, 0xE4, 0xDA, 0x31, 0xD7, + 0x6B, 0xD5, 0xF4, 0xD9, 0x5F, 0xD5, 0xC0, 0xE0, 0xA7, 0xE4, 0x13, 0xF1, + 0x4D, 0xF8, 0x2D, 0xFF, 0x06, 0x0B, 0x94, 0x0C, 0xE3, 0x27, 0x8D, 0x2A, + 0x37, 0x3C, 0x81, 0x45, 0xAE, 0x37, 0x2B, 0x48, 0x65, 0x33, 0x2D, 0x45, + 0x48, 0x36, 0x3C, 0x3F, 0x66, 0x31, 0xD5, 0x2C, 0xED, 0x21, 0x0F, 0x15, + 0xFF, 0x0A, 0xC8, 0xFC, 0xF2, 0xFB, 0x67, 0xED, 0x00, 0xF9, 0xA2, 0xE8, + 0xC7, 0xF6, 0x88, 0xE5, 0xE4, 0xFA, 0x0B, 0xEA, 0x67, 0x02, 0xFA, 0xF4, + 0xB1, 0x03, 0x37, 0x00, 0x29, 0x08, 0x1C, 0x13, 0x73, 0x08, 0x44, 0x20, + 0x24, 0xFC, 0x80, 0x1B, 0x28, 0xEF, 0xA4, 0x10, 0xFD, 0xE6, 0x4F, 0x04, + 0x42, 0xDC, 0xD4, 0xEE, 0x04, 0xCF, 0xE7, 0xD5, 0x56, 0xC4, 0x15, 0xC5, + 0x83, 0xBD, 0x3F, 0xBE, 0xC2, 0xC1, 0x82, 0xC4, 0x1F, 0xD0, 0xB8, 0xD0, + 0xC5, 0xE9, 0xAD, 0xE2, 0xE6, 0x0F, 0x33, 0x04, 0x87, 0x2F, 0x83, 0x27, + 0xBF, 0x45, 0x7F, 0x42, 0x44, 0x58, 0xF2, 0x52, 0x3C, 0x5B, 0x4B, 0x4E, + 0x1B, 0x51, 0xDD, 0x3C, 0x29, 0x40, 0x3C, 0x27, 0x3A, 0x27, 0x81, 0x0D, + 0xCE, 0x0A, 0xD7, 0xF6, 0x60, 0xF1, 0x74, 0xE8, 0x46, 0xE1, 0xC5, 0xE2, + 0x23, 0xDA, 0x8E, 0xE2, 0xB6, 0xD7, 0xED, 0xE3, 0xAC, 0xD5, 0x15, 0xE4, + 0x0E, 0xDA, 0x74, 0xE8, 0xEF, 0xDE, 0xD8, 0xE6, 0xDA, 0xDC, 0xEE, 0xDA, + 0xCF, 0xDE, 0x3D, 0xD6, 0xF1, 0xE1, 0xDE, 0xD8, 0x13, 0xE2, 0x93, 0xDA, + 0x74, 0xEE, 0xB3, 0xE3, 0x29, 0xFF, 0x66, 0xF3, 0xBC, 0x04, 0x1B, 0x01, + 0xD8, 0x14, 0xEA, 0x18, 0xE8, 0x2E, 0xA3, 0x32, 0xA7, 0x38, 0x9E, 0x3A, + 0x57, 0x34, 0x41, 0x3E, 0xA0, 0x2B, 0x48, 0x45, 0x16, 0x1D, 0x99, 0x41, + 0xE0, 0x0B, 0x58, 0x31, 0xEB, 0xF7, 0xB0, 0x16, 0x6A, 0xE8, 0xFE, 0xF9, + 0x31, 0xE9, 0xC1, 0xE8, 0x57, 0xEF, 0xF9, 0xDC, 0x5B, 0xF5, 0x8E, 0xD5, + 0xDD, 0xFD, 0x31, 0xD7, 0xBE, 0x05, 0x16, 0xDF, 0x0F, 0x0E, 0x97, 0xEE, + 0xB0, 0x15, 0xBD, 0xFF, 0x84, 0x17, 0x04, 0x08, 0x7F, 0x11, 0xA0, 0x08, + 0x10, 0x05, 0xB4, 0x04, 0x16, 0xF3, 0x5C, 0xF7, 0x00, 0xDC, 0x52, 0xDF, + 0xA3, 0xC4, 0x3B, 0xC5, 0x7A, 0xB7, 0xB9, 0xB4, 0x7A, 0xB7, 0x0C, 0xB3, + 0xF4, 0xBE, 0x23, 0xBE, 0xE2, 0xCC, 0xB9, 0xD7, 0x7B, 0xE7, 0xA2, 0xFD, + 0xCB, 0x0B, 0xEF, 0x22, 0xA5, 0x30, 0xBE, 0x44, 0xCD, 0x4A, 0x7A, 0x5C, + 0x28, 0x55, 0x9B, 0x60, 0x12, 0x55, 0x0B, 0x57, 0x6A, 0x4A, 0x26, 0x45, + 0x4C, 0x30, 0xC4, 0x26, 0x29, 0x12, 0x23, 0x02, 0x4E, 0xF9, 0x89, 0xE6, + 0x7D, 0xE2, 0xB0, 0xDA, 0xB3, 0xD3, 0x41, 0xDC, 0x67, 0xCC, 0x9E, 0xE0, + 0xB9, 0xC9, 0xE5, 0xE4, 0xCD, 0xCE, 0x2E, 0xEE, 0x62, 0xD7, 0x3F, 0xF4, + 0x83, 0xD7, 0x7C, 0xEB, 0xD8, 0xD4, 0x25, 0xE2, 0x4C, 0xD4, 0x08, 0xDF, + 0xA4, 0xD3, 0x5A, 0xD9, 0x31, 0xE1, 0x37, 0xDC, 0x8F, 0xF9, 0x8E, 0xE8, + 0xEA, 0x0B, 0xC4, 0xF2, 0x24, 0x25, 0x12, 0x0A, 0x66, 0x45, 0xE3, 0x2C, + 0x1F, 0x53, 0x16, 0x3C, 0x25, 0x55, 0x40, 0x3C, 0x89, 0x54, 0x0C, 0x3D, + 0xF2, 0x49, 0xC1, 0x39, 0x9F, 0x34, 0xA8, 0x2E, 0x64, 0x15, 0x27, 0x19, + 0xAB, 0xF5, 0xC7, 0x01, 0x38, 0xE2, 0x4A, 0xF4, 0x92, 0xD7, 0xB1, 0xE9, + 0x3A, 0xD1, 0x35, 0xDE, 0x42, 0xD8, 0x32, 0xDF, 0x09, 0xEA, 0x40, 0xEC, + 0x8C, 0xFA, 0xEA, 0xF8, 0xC7, 0x0A, 0xF7, 0x05, 0x3F, 0x14, 0x46, 0x0E, + 0x2E, 0x10, 0x14, 0x0B, 0x9C, 0x09, 0x74, 0x02, 0xEE, 0x00, 0x5C, 0xF2, + 0xC5, 0xEF, 0x7E, 0xD9, 0xBE, 0xD7, 0xF6, 0xC1, 0x43, 0xC4, 0xAA, 0xB3, + 0x3A, 0xBF, 0x19, 0xB4, 0xAC, 0xC2, 0x12, 0xC2, 0x71, 0xC9, 0x0F, 0xD9, + 0x8F, 0xDC, 0x06, 0xFC, 0xA9, 0xFF, 0x7D, 0x25, 0xCA, 0x21, 0x16, 0x46, + 0x08, 0x39, 0xD0, 0x58, 0xD2, 0x48, 0x68, 0x5E, 0xC8, 0x4D, 0xD2, 0x54, + 0x0D, 0x46, 0x4E, 0x3D, 0x3D, 0x36, 0x94, 0x20, 0x80, 0x21, 0xC3, 0x07, + 0x78, 0x09, 0x2F, 0xF1, 0x96, 0xF3, 0x82, 0xDF, 0x33, 0xE7, 0xF7, 0xD7, + 0xF8, 0xE0, 0x70, 0xD8, 0xB3, 0xD6, 0xFC, 0xDA, 0x31, 0xD3, 0x1E, 0xE5, + 0x23, 0xD7, 0xEE, 0xF2, 0x89, 0xCF, 0x4E, 0xF1, 0x93, 0xCA, 0x80, 0xE9, + 0xDE, 0xD1, 0x14, 0xE4, 0xBB, 0xD3, 0xD2, 0xD9, 0x59, 0xD9, 0x95, 0xD7, + 0xA3, 0xE9, 0x3A, 0xE0, 0xE5, 0xF8, 0x13, 0xE6, 0x88, 0x13, 0x2C, 0xFA, + 0xD7, 0x37, 0x87, 0x1F, 0x98, 0x49, 0x87, 0x36, 0x80, 0x4D, 0x82, 0x3F, + 0x8E, 0x51, 0x3C, 0x48, 0x1C, 0x4B, 0x96, 0x45, 0x87, 0x37, 0x1C, 0x37, + 0xD3, 0x16, 0x9C, 0x1D, 0x15, 0xF7, 0xCE, 0x01, 0x5B, 0xEC, 0x76, 0xF8, + 0x42, 0xE9, 0x31, 0xF4, 0x1E, 0xE5, 0xB5, 0xEC, 0x3F, 0xEA, 0x07, 0xEF, + 0xE7, 0xF4, 0x5D, 0xF4, 0x21, 0xFC, 0x89, 0xF8, 0xD5, 0x02, 0xC9, 0xFE, + 0xAD, 0x06, 0xED, 0xFD, 0x3D, 0x00, 0x09, 0xF7, 0xD0, 0xF7, 0xBD, 0xF0, + 0x61, 0xEF, 0x12, 0xE6, 0xE2, 0xDF, 0x44, 0xD3, 0x3F, 0xCD, 0xC8, 0xBF, + 0x44, 0xBE, 0x1B, 0xB7, 0x64, 0xBC, 0xB0, 0xBF, 0xD0, 0xC2, 0x29, 0xD1, + 0x62, 0xCB, 0xC9, 0xE2, 0x7E, 0xE6, 0x7E, 0x00, 0x7C, 0x10, 0xB6, 0x27, + 0x17, 0x34, 0x30, 0x47, 0x0D, 0x4E, 0x60, 0x5B, 0xFB, 0x5A, 0x15, 0x62, + 0x6F, 0x58, 0x50, 0x5A, 0xAD, 0x4B, 0xE1, 0x45, 0xF6, 0x38, 0xE2, 0x28, + 0xE7, 0x21, 0xD8, 0x06, 0x48, 0x08, 0xC7, 0xE7, 0xDF, 0xF4, 0x4F, 0xD7, + 0x25, 0xEC, 0x45, 0xD2, 0x30, 0xE5, 0x86, 0xD3, 0x09, 0xD9, 0x31, 0xD7, + 0x0C, 0xD7, 0xF2, 0xDE, 0xD5, 0xD9, 0x24, 0xE6, 0xA7, 0xCF, 0x1A, 0xE6, + 0x9C, 0xC7, 0xD4, 0xE8, 0x2E, 0xC7, 0x11, 0xEA, 0x42, 0xCA, 0xB0, 0xE2, + 0x53, 0xDA, 0x51, 0xE2, 0x95, 0xEE, 0x33, 0xE7, 0x14, 0x04, 0xA3, 0xED, + 0xA1, 0x21, 0x75, 0x05, 0x1D, 0x3A, 0x27, 0x24, 0xB2, 0x40, 0x4D, 0x33, + 0x6D, 0x40, 0x5D, 0x3A, 0x8B, 0x3F, 0x23, 0x3D, 0x2C, 0x37, 0x4E, 0x38, + 0x11, 0x25, 0xA5, 0x27, 0xDD, 0x0A, 0xA0, 0x0E, 0xAB, 0xF5, 0x98, 0xFF, + 0x45, 0xEE, 0x2A, 0xF8, 0xE8, 0xE8, 0x09, 0xEE, 0x0B, 0xE3, 0x65, 0xEB, + 0x89, 0xE7, 0x98, 0xF5, 0x54, 0xF2, 0x8F, 0xFD, 0xE7, 0xFE, 0x62, 0x06, + 0x44, 0x06, 0xDC, 0x0F, 0xB3, 0x02, 0x74, 0x0B, 0x4C, 0xFF, 0x67, 0xFE, + 0x47, 0xFE, 0x19, 0xEF, 0x0E, 0xF2, 0x41, 0xD9, 0xB7, 0xDF, 0x8C, 0xC0, + 0xAB, 0xD1, 0xC5, 0xAC, 0xA8, 0xC7, 0xDA, 0xA4, 0xBC, 0xC9, 0xCA, 0xAF, + 0xDF, 0xD5, 0xB6, 0xC3, 0x48, 0xE7, 0x3F, 0xDD, 0xA4, 0x00, 0x8C, 0x05, + 0x21, 0x1B, 0x18, 0x31, 0x8F, 0x30, 0x86, 0x51, 0x1D, 0x3C, 0x6B, 0x62, + 0x7D, 0x3F, 0x19, 0x64, 0x33, 0x40, 0x80, 0x58, 0xA6, 0x39, 0x52, 0x45, + 0xEC, 0x27, 0x47, 0x2D, 0x23, 0x12, 0xDA, 0x0D, 0xEE, 0x03, 0x89, 0xF3, + 0x23, 0xFC, 0xB1, 0xE2, 0xC4, 0xF4, 0xD1, 0xD7, 0x29, 0xEB, 0x94, 0xD1, + 0xD4, 0xE5, 0xE7, 0xD3, 0xBE, 0xE2, 0xAA, 0xDF, 0x52, 0xD6, 0xB0, 0xE4, + 0x19, 0xC7, 0x29, 0xE3, 0x2D, 0xC1, 0xE6, 0xE5, 0x3F, 0xBF, 0x02, 0xE8, + 0xDB, 0xC5, 0xB8, 0xEA, 0x5F, 0xDB, 0xF3, 0xF1, 0x11, 0xED, 0x86, 0xF8, + 0x3E, 0x02, 0x41, 0x07, 0x13, 0x26, 0x52, 0x22, 0x01, 0x40, 0x51, 0x32, + 0x22, 0x4A, 0xAA, 0x33, 0xAA, 0x50, 0x2F, 0x36, 0x97, 0x51, 0xBE, 0x39, + 0xC2, 0x45, 0x4C, 0x33, 0x5A, 0x2C, 0xF7, 0x19, 0x2F, 0x12, 0x79, 0xFB, + 0xC5, 0x05, 0xCC, 0xED, 0x4B, 0xFB, 0x8E, 0xE7, 0x10, 0xEA, 0x51, 0xDF, + 0x80, 0xE1, 0x16, 0xE3, 0x5C, 0xDF, 0x9C, 0xEE, 0x06, 0xE3, 0xB7, 0xFE, + 0xE3, 0xED, 0x0A, 0x11, 0xFE, 0xF3, 0x8D, 0x16, 0xC7, 0xF6, 0xE1, 0x12, + 0x7A, 0xF9, 0x63, 0x09, 0x18, 0xF6, 0x06, 0xF4, 0x2C, 0xE7, 0xE5, 0xD7, + 0x7E, 0xD3, 0x63, 0xBC, 0x86, 0xC4, 0x81, 0xA4, 0xAF, 0xC1, 0x35, 0x9C, + 0x0B, 0xCC, 0x46, 0xAC, 0x76, 0xD9, 0xAB, 0xC6, 0xFD, 0xEE, 0x0D, 0xEA, + 0x09, 0x14, 0x3A, 0x17, 0x47, 0x3D, 0xF0, 0x3D, 0x37, 0x58, 0xF0, 0x57, + 0xAA, 0x5F, 0x1C, 0x63, 0x70, 0x59, 0x70, 0x62, 0x88, 0x45, 0xAA, 0x54, + 0x44, 0x27, 0xBA, 0x3A, 0x56, 0x03, 0x62, 0x1B, 0xB5, 0xE5, 0x93, 0xFF, + 0x3F, 0xD5, 0x2F, 0xEC, 0x99, 0xCF, 0x4E, 0xDD, 0x3C, 0xD0, 0xB1, 0xD3, + 0xC1, 0xD4, 0x6A, 0xD2, 0xCB, 0xE1, 0xF2, 0xD3, 0x3C, 0xEC, 0x31, 0xD0, + 0xF3, 0xEC, 0xFE, 0xCD, 0x49, 0xEC, 0x50, 0xD1, 0x68, 0xE7, 0xD6, 0xD0, + 0xDC, 0xE1, 0xA2, 0xD2, 0x3A, 0xE4, 0x97, 0xDD, 0x9C, 0xE4, 0x4D, 0xE4, + 0x31, 0xEE, 0xBB, 0xF1, 0x32, 0x0F, 0x60, 0x13, 0x32, 0x28, 0x1E, 0x2E, + 0x72, 0x33, 0x0E, 0x3A, 0xAD, 0x3E, 0xB9, 0x43, 0x8D, 0x41, 0xBC, 0x47, + 0xA7, 0x3D, 0xF1, 0x43, 0xDF, 0x2B, 0xB8, 0x2D, 0x22, 0x10, 0xCC, 0x0E, + 0xBF, 0x00, 0x9E, 0x02, 0xD4, 0xF8, 0xD4, 0xFC, 0x0A, 0xEE, 0xA3, 0xEF, + 0x66, 0xEE, 0x10, 0xEB, 0x2D, 0xF9, 0x50, 0xEE, 0x34, 0x06, 0x33, 0xF4, + 0x7B, 0x13, 0xA3, 0x06, 0x73, 0x12, 0x35, 0x15, 0x12, 0x09, 0xE8, 0x15, + 0xFB, 0x00, 0x65, 0x14, 0x41, 0xF4, 0x55, 0x08, 0x66, 0xE2, 0x44, 0xEB, + 0x18, 0xCE, 0x4E, 0xC8, 0x0D, 0xBB, 0x41, 0xA9, 0xF4, 0xB1, 0x82, 0x9C, + 0x06, 0xBA, 0x46, 0xA7, 0xC2, 0xCB, 0x87, 0xB9, 0xAE, 0xE6, 0xB9, 0xD3, + 0xB6, 0x0E, 0xE0, 0xFE, 0x89, 0x33, 0xA2, 0x2D, 0xE9, 0x4C, 0xF6, 0x4F, + 0xB2, 0x5A, 0x7C, 0x5F, 0x31, 0x5A, 0x42, 0x5F, 0x41, 0x4E, 0xF5, 0x57, + 0x62, 0x38, 0x91, 0x46, 0x0D, 0x19, 0xF4, 0x28, 0x6F, 0xFB, 0xBF, 0x0E, + 0x60, 0xE2, 0x15, 0xFB, 0x0E, 0xD0, 0xFD, 0xEB, 0x9F, 0xC4, 0x8B, 0xDE, + 0xE8, 0xBE, 0x6D, 0xD5, 0xA9, 0xC6, 0xD0, 0xD5, 0x12, 0xD1, 0x35, 0xD4, + 0xBE, 0xD5, 0x81, 0xD1, 0x23, 0xDD, 0x31, 0xD5, 0xB8, 0xE3, 0x43, 0xD5, + 0x14, 0xE9, 0xAC, 0xD7, 0x36, 0xF3, 0x0B, 0xE6, 0x2C, 0xFA, 0x65, 0xEF, + 0xD1, 0x05, 0x90, 0xFA, 0x57, 0x21, 0xE6, 0x17, 0xA7, 0x36, 0x86, 0x30, + 0x99, 0x3E, 0x07, 0x37, 0xC2, 0x45, 0x60, 0x3A, 0xF6, 0x44, 0x4E, 0x3C, + 0x67, 0x3D, 0x26, 0x36, 0x39, 0x2E, 0x4B, 0x22, 0x52, 0x10, 0xFE, 0x04, + 0x81, 0xFC, 0x6E, 0xF7, 0xFE, 0xF8, 0x52, 0xF6, 0x70, 0xF0, 0x34, 0xEC, + 0xFB, 0xE9, 0x68, 0xEB, 0xE9, 0xED, 0x57, 0xFA, 0x30, 0xF4, 0x32, 0x08, + 0x86, 0xF8, 0x02, 0x13, 0x4F, 0xFB, 0x1E, 0x1A, 0x66, 0xF9, 0xD9, 0x16, + 0xCD, 0xF3, 0x99, 0x0D, 0xB7, 0xE8, 0x93, 0x00, 0xA1, 0xD7, 0x66, 0xEB, + 0xDF, 0xC7, 0xB8, 0xD1, 0x04, 0xBC, 0x8F, 0xB6, 0x63, 0xC0, 0x89, 0xAB, + 0x20, 0xD1, 0xB1, 0xB3, 0x0A, 0xDF, 0xCA, 0xC0, 0xED, 0xF1, 0x8E, 0xD9, + 0xA2, 0x10, 0x0C, 0x02, 0xBA, 0x30, 0x34, 0x29, 0x43, 0x47, 0xAC, 0x42, + 0x0D, 0x51, 0x7A, 0x50, 0x9E, 0x50, 0xA7, 0x52, 0x46, 0x49, 0x74, 0x48, + 0xEE, 0x36, 0x57, 0x34, 0xF7, 0x17, 0x12, 0x18, 0x04, 0xFB, 0x8A, 0xFB, + 0xFE, 0xE5, 0xCD, 0xE1, 0x2E, 0xDA, 0x14, 0xD2, 0x05, 0xD6, 0xBF, 0xCD, + 0x2D, 0xD6, 0x37, 0xCF, 0x91, 0xDF, 0x19, 0xDA, 0xAF, 0xE5, 0x5E, 0xE2, + 0xFE, 0xE1, 0xDA, 0xE4, 0x18, 0xDD, 0x30, 0xE7, 0xFA, 0xD8, 0xE1, 0xE4, + 0xB3, 0xDC, 0x51, 0xE6, 0x49, 0xEA, 0x2C, 0xF0, 0x96, 0xF7, 0xED, 0xF6, + 0xEE, 0x0B, 0x53, 0x00, 0x22, 0x2F, 0xC2, 0x17, 0x7E, 0x46, 0x49, 0x29, + 0x47, 0x46, 0x17, 0x30, 0x20, 0x40, 0xF0, 0x3B, 0x0A, 0x36, 0x35, 0x42, + 0x23, 0x26, 0xB6, 0x3B, 0x56, 0x10, 0x03, 0x2B, 0x69, 0xFB, 0x53, 0x14, + 0x40, 0xF6, 0x9B, 0x05, 0x2A, 0xF6, 0x12, 0xFC, 0xCA, 0xEF, 0x0E, 0xF1, + 0x46, 0xED, 0xD4, 0xEB, 0xB4, 0xF3, 0x49, 0xEF, 0x3B, 0xFD, 0x15, 0xF5, + 0xF5, 0x07, 0x8C, 0xFC, 0x2B, 0x0C, 0x45, 0x03, 0xDC, 0x02, 0xF8, 0x03, + 0xB8, 0xF9, 0xA5, 0x04, 0x9B, 0xEE, 0x6C, 0xFD, 0xB7, 0xD9, 0xB4, 0xE7, + 0x31, 0xC6, 0xFB, 0xCE, 0xC3, 0xBC, 0x88, 0xBB, 0xFC, 0xC0, 0x5E, 0xB4, + 0xCA, 0xCF, 0x5E, 0xBD, 0x9D, 0xDD, 0x6D, 0xCE, 0xE6, 0xEF, 0x28, 0xE7, + 0xE2, 0x12, 0x89, 0x0C, 0xA5, 0x37, 0x83, 0x32, 0xDB, 0x4E, 0xE4, 0x4E, + 0x8D, 0x59, 0x8F, 0x5E, 0x1F, 0x58, 0x23, 0x5E, 0xE1, 0x48, 0xB7, 0x4E, + 0x5C, 0x2F, 0xD7, 0x32, 0xC4, 0x10, 0xCB, 0x0C, 0xC3, 0xF7, 0x9C, 0xEC, + 0xE6, 0xE4, 0x8C, 0xD8, 0xCF, 0xD7, 0x8E, 0xCE, 0xB8, 0xCE, 0xB2, 0xCC, + 0xF5, 0xC5, 0x87, 0xD0, 0xBF, 0xC3, 0x5C, 0xDA, 0x69, 0xC4, 0x98, 0xDF, + 0x84, 0xC7, 0xA2, 0xE1, 0xE7, 0xCC, 0xB8, 0xE5, 0xD5, 0xD2, 0x79, 0xE9, + 0xF9, 0xE0, 0x18, 0xF0, 0x01, 0xF4, 0xC6, 0xF6, 0x3B, 0x03, 0xB1, 0xF9, + 0xAA, 0x19, 0xFF, 0x04, 0x76, 0x3C, 0x95, 0x1D, 0x1D, 0x4F, 0x4E, 0x2B, + 0xDB, 0x4D, 0x05, 0x2C, 0x50, 0x4E, 0xF4, 0x2F, 0x3F, 0x4D, 0xD7, 0x31, + 0x98, 0x3E, 0x8F, 0x29, 0x84, 0x21, 0x57, 0x18, 0x7C, 0x01, 0x51, 0x08, + 0xC5, 0xEB, 0xB9, 0x01, 0x27, 0xE0, 0x8A, 0xFC, 0xC2, 0xD7, 0xDC, 0xF0, + 0xAD, 0xDB, 0x28, 0xEE, 0x4E, 0xEA, 0x18, 0xF7, 0x13, 0xF2, 0xC7, 0xFC, + 0xA3, 0xF6, 0xB7, 0x04, 0x40, 0xFA, 0x98, 0x0C, 0xEB, 0xF4, 0xB7, 0x08, + 0xF3, 0xEE, 0x1B, 0x03, 0x61, 0xEE, 0x45, 0xFD, 0x9C, 0xE9, 0x92, 0xE9, + 0xCB, 0xDC, 0x5F, 0xCF, 0x70, 0xD1, 0x95, 0xBF, 0x82, 0xCF, 0x3B, 0xB9, + 0xCD, 0xD3, 0x25, 0xB9, 0x88, 0xDC, 0x62, 0xC8, 0xF9, 0xF0, 0x40, 0xE9, + 0x76, 0x15, 0x30, 0x14, 0x7F, 0x37, 0x21, 0x3A, 0xCA, 0x49, 0x92, 0x52, + 0x5E, 0x54, 0xE6, 0x5E, 0xB5, 0x52, 0x73, 0x56, 0x38, 0x47, 0xE9, 0x3F, + 0x92, 0x35, 0x9D, 0x24, 0x26, 0x1B, 0xA1, 0x06, 0x02, 0xFD, 0xDB, 0xEC, + 0x1D, 0xE0, 0x74, 0xD9, 0x58, 0xCC, 0x26, 0xCF, 0xEC, 0xC2, 0x79, 0xCA, + 0x10, 0xC3, 0xA3, 0xCB, 0x25, 0xC6, 0xC7, 0xD2, 0x02, 0xC7, 0xB9, 0xDA, + 0xD1, 0xCB, 0x62, 0xE1, 0x56, 0xD3, 0x17, 0xE4, 0xBB, 0xDA, 0x38, 0xE5, + 0xDD, 0xE9, 0x45, 0xEE, 0x59, 0xFA, 0x14, 0xFC, 0x0D, 0x03, 0x36, 0x0B, + 0xFF, 0x11, 0xE3, 0x24, 0x57, 0x24, 0x8D, 0x3A, 0x8C, 0x2F, 0xFF, 0x3E, + 0xBD, 0x3B, 0x07, 0x3F, 0x40, 0x48, 0x5B, 0x3C, 0xED, 0x4A, 0x1B, 0x2F, + 0xE0, 0x3F, 0xE0, 0x18, 0xA2, 0x28, 0xAA, 0xFE, 0x83, 0x14, 0xDC, 0xEC, + 0x50, 0x0C, 0xA2, 0xE8, 0x36, 0x02, 0xAE, 0xE6, 0x58, 0xF5, 0x48, 0xE8, + 0x6D, 0xF1, 0x8A, 0xF3, 0xD8, 0xF1, 0x00, 0x00, 0x1E, 0xF0, 0x5D, 0x0A, + 0xF4, 0xEE, 0xDC, 0x12, 0xA1, 0xED, 0xDD, 0x10, 0xB6, 0xEC, 0xE9, 0x06, + 0xE1, 0xE9, 0x39, 0xFB, 0xFA, 0xDF, 0xCB, 0xEA, 0x81, 0xCF, 0xFD, 0xD4, + 0x58, 0xC0, 0xF8, 0xC1, 0x52, 0xBB, 0xC7, 0xB9, 0x2D, 0xC4, 0x2B, 0xC0, + 0x15, 0xD4, 0xF8, 0xCE, 0x53, 0xEC, 0x92, 0xE5, 0x4A, 0x11, 0x7D, 0x09, + 0xF7, 0x33, 0x63, 0x31, 0xA0, 0x48, 0x28, 0x51, 0x66, 0x50, 0xC7, 0x61, + 0x86, 0x4E, 0xCC, 0x5F, 0x9D, 0x47, 0xA3, 0x4E, 0x23, 0x3A, 0xDF, 0x31, + 0x58, 0x20, 0x21, 0x0C, 0xCE, 0x07, 0x83, 0xEC, 0xC7, 0xF3, 0x59, 0xD2, + 0x61, 0xE1, 0x86, 0xBD, 0x3B, 0xD4, 0x2A, 0xB7, 0x3C, 0xCD, 0x32, 0xBC, + 0xE0, 0xCB, 0xAB, 0xC4, 0x9A, 0xC8, 0x3A, 0xC8, 0xB4, 0xC6, 0x55, 0xCB, + 0x5E, 0xCA, 0x4E, 0xD0, 0x4E, 0xD0, 0xC8, 0xD3, 0x8A, 0xD8, 0x5D, 0xD9, + 0x75, 0xE8, 0x65, 0xE8, 0x31, 0xFA, 0x24, 0xF9, 0x25, 0x0F, 0x4E, 0x0C, + 0xC7, 0x2F, 0x5F, 0x2D, 0xAB, 0x42, 0xAE, 0x44, 0x6B, 0x40, 0x72, 0x48, + 0xDE, 0x3E, 0xC5, 0x4B, 0x4D, 0x3B, 0xCF, 0x4A, 0x62, 0x2D, 0xFA, 0x3C, + 0xD0, 0x16, 0x54, 0x24, 0x6F, 0x02, 0x1B, 0x0B, 0xD0, 0xFB, 0x77, 0xFD, + 0xD6, 0xF8, 0x35, 0xF7, 0xE7, 0xEB, 0x9D, 0xED, 0x87, 0xE4, 0x35, 0xE9, + 0xF6, 0xEB, 0x68, 0xF0, 0x11, 0xF5, 0xAD, 0xFC, 0xF3, 0xFC, 0x24, 0x0A, + 0x5B, 0x04, 0x01, 0x13, 0x95, 0x03, 0xD7, 0x13, 0xE1, 0xFC, 0xD6, 0x11, + 0x3A, 0xF3, 0x07, 0x07, 0x90, 0xDF, 0x6E, 0xEC, 0x35, 0xC7, 0x09, 0xD1, + 0x54, 0xB6, 0x20, 0xBC, 0x19, 0xB9, 0x53, 0xB2, 0x1B, 0xCD, 0x46, 0xBC, + 0x6E, 0xE1, 0x8F, 0xD0, 0x54, 0xFE, 0x58, 0xEE, 0x25, 0x29, 0xC7, 0x19, + 0xFB, 0x48, 0x7B, 0x40, 0x40, 0x5B, 0xC7, 0x59, 0x67, 0x5F, 0xF3, 0x5F, + 0x07, 0x53, 0xD0, 0x57, 0x9D, 0x46, 0xC3, 0x4F, 0x7D, 0x27, 0xFD, 0x29, + 0xFF, 0x22, 0x2F, 0x18, 0x72, 0x35, 0xB9, 0x22, 0x72, 0x1E, 0xD3, 0x09, + 0x5E, 0x1F, 0xD8, 0x0C, 0xC6, 0x46, 0xCC, 0x3B, 0xFA, 0x55, 0x21, 0x55, + 0xBE, 0x37, 0x74, 0x40, 0xAF, 0x11, 0x3F, 0x23, 0x9F, 0x06, 0x3A, 0x1D, + 0xC9, 0xF9, 0xAE, 0x10, 0x3F, 0xDB, 0xBD, 0xF0, 0xDD, 0xD4, 0x50, 0xE3, + 0xDD, 0xE5, 0x14, 0xE5, 0x1F, 0xEE, 0x77, 0xE1, 0xF3, 0x04, 0x6D, 0xF6, + 0x36, 0x27, 0x07, 0x19, 0xB1, 0x2F, 0x2E, 0x23, 0x57, 0x25, 0x67, 0x1F, + 0x55, 0x26, 0xA5, 0x22, 0xE6, 0x1E, 0xCB, 0x14, 0xD5, 0xF8, 0x72, 0xEB, + 0xE0, 0xD2, 0x8F, 0xC8, 0x37, 0xD2, 0xF4, 0xC9, 0x79, 0xE1, 0x1B, 0xDD, + 0x0A, 0xD8, 0xBC, 0xDB, 0xF5, 0xD6, 0xE5, 0xDB, 0x61, 0xE7, 0x93, 0xE3, + 0x6C, 0xEA, 0x6C, 0xE0, 0xDA, 0xEF, 0x1D, 0xE8, 0xF4, 0xFF, 0xEF, 0xFB, + 0xAA, 0x05, 0x34, 0x03, 0xBA, 0x08, 0x22, 0x0B, 0x3B, 0xFF, 0xDE, 0x0B, + 0xA4, 0xED, 0x38, 0x01, 0x46, 0xE6, 0x47, 0xF8, 0xAE, 0xED, 0x3A, 0xFD, + 0x96, 0xFA, 0x9B, 0x0A, 0x31, 0xE9, 0x38, 0xF7, 0x5D, 0xE2, 0x92, 0xED, + 0x30, 0x22, 0x13, 0x2B, 0xD8, 0x52, 0x93, 0x51, 0x8D, 0x3D, 0xB6, 0x31, + 0xD6, 0x3E, 0x7E, 0x3A, 0xAF, 0x58, 0x19, 0x62, 0xDA, 0x4A, 0xD5, 0x52, + 0xD7, 0x33, 0x50, 0x37, 0xC9, 0x2A, 0x99, 0x31, 0xCB, 0xFC, 0xC4, 0xFE, + 0x4A, 0xC4, 0x25, 0xBB, 0x4E, 0xB1, 0xBE, 0xA9, 0xA9, 0xAA, 0xB5, 0xA7, + 0x9F, 0xA5, 0x46, 0x9C, 0x90, 0xAE, 0x1D, 0xA2, 0x93, 0xB3, 0x83, 0xAD, + 0x57, 0xA7, 0x52, 0xA6, 0xDB, 0xA8, 0x43, 0xB0, 0x4E, 0xBE, 0x8F, 0xD4, + 0xA5, 0xBB, 0xFB, 0xD7, 0xDE, 0xB4, 0xE3, 0xCD, 0x65, 0xE0, 0x27, 0xF6, + 0x8A, 0x0F, 0x08, 0x19, 0x7B, 0x10, 0xD9, 0x04, 0x1A, 0x12, 0xF1, 0xFE, + 0x84, 0x37, 0xF4, 0x2B, 0x00, 0x4B, 0x91, 0x43, 0xFD, 0x32, 0x5B, 0x2D, + 0xD7, 0x1C, 0x3B, 0x1E, 0x9B, 0x13, 0x1A, 0x1A, 0x63, 0xFE, 0x59, 0x07, + 0x99, 0xE5, 0x3B, 0xF4, 0xCA, 0xD2, 0x64, 0xE4, 0x97, 0xD3, 0x05, 0xDF, + 0x13, 0xD4, 0x9E, 0xD6, 0x50, 0xC3, 0xE6, 0xC2, 0x06, 0xCF, 0xF6, 0xD0, + 0x0B, 0xD4, 0xF6, 0xD7, 0x7B, 0xBD, 0x6D, 0xC0, 0x0E, 0xB0, 0xE2, 0xB2, + 0xFA, 0xA8, 0x55, 0xAF, 0xB0, 0xA3, 0x7A, 0xA9, 0x74, 0xA7, 0x50, 0xA6, + 0x3B, 0xAB, 0x9A, 0xA7, 0x21, 0xA4, 0x00, 0xA5, 0xB2, 0xA1, 0x69, 0xA2, + 0x6E, 0xA5, 0x37, 0xA1, 0x92, 0xAD, 0x6E, 0xA9, 0x8C, 0xD0, 0x5B, 0xCD, + 0x5C, 0xF8, 0x19, 0xF5, 0xFF, 0x03, 0x39, 0x04, 0xA1, 0x08, 0x2A, 0x0A, + 0x8C, 0x08, 0x8C, 0x07, 0x80, 0x0B, 0xD9, 0x0B, 0x81, 0x12, 0xC2, 0x17, + 0xD8, 0x0E, 0x40, 0x16, 0xAF, 0x0D, 0x72, 0x13, 0xBB, 0x09, 0x34, 0x0B, + 0x0A, 0x01, 0x50, 0xF9, 0x6B, 0xFA, 0x14, 0xE8, 0xFC, 0xEB, 0x75, 0xD2, + 0x67, 0xDF, 0x40, 0xC3, 0x7C, 0xE5, 0x2D, 0xCD, 0x34, 0xED, 0x3C, 0xE4, + 0xC1, 0xE5, 0x24, 0xF6, 0x29, 0xEF, 0xC1, 0x12, 0x94, 0xFD, 0xBC, 0x26, + 0x39, 0xFA, 0x00, 0x1E, 0x71, 0x02, 0xAA, 0x1A, 0x31, 0x15, 0xBB, 0x24, + 0xFD, 0x21, 0xD4, 0x29, 0x80, 0x2E, 0x96, 0x28, 0xBC, 0x3D, 0x95, 0x29, + 0x13, 0x4C, 0x6E, 0x31, 0xF7, 0x4B, 0xC4, 0x32, 0x4A, 0x3A, 0xFE, 0x23, + 0xEF, 0x34, 0x73, 0x1F, 0xF1, 0x2E, 0xD6, 0x19, 0xEE, 0x12, 0x86, 0x02, + 0x55, 0x04, 0xAB, 0xFB, 0xFA, 0x14, 0x15, 0x11, 0x29, 0x1E, 0x21, 0x1C, + 0xDB, 0x1F, 0xCF, 0x1D, 0xAF, 0x28, 0xCE, 0x2C, 0x92, 0x28, 0x82, 0x36, + 0x1B, 0x2D, 0x8C, 0x3D, 0xB9, 0x31, 0x6A, 0x42, 0xA5, 0x31, 0xE6, 0x44, + 0x00, 0x30, 0x0C, 0x45, 0x48, 0x20, 0x91, 0x33, 0x8C, 0x1B, 0x20, 0x29, + 0x1B, 0x1C, 0xD8, 0x23, 0xE7, 0x1B, 0xC6, 0x1D, 0xD0, 0x24, 0x1A, 0x1E, + 0xA2, 0x2A, 0xF0, 0x1B, 0x98, 0x33, 0x6C, 0x24, 0xCB, 0x36, 0x9E, 0x2C, + 0x38, 0x46, 0x1E, 0x40, 0x90, 0x5F, 0xF0, 0x5C, 0x7E, 0x64, 0x03, 0x62, + 0xC3, 0x59, 0x98, 0x58, 0x6B, 0x56, 0x4F, 0x56, 0x6F, 0x58, 0xE1, 0x56, + 0xC1, 0x42, 0x1A, 0x46, 0x7E, 0x23, 0x84, 0x2A, 0x5E, 0x19, 0x84, 0x1C, + 0xC4, 0x16, 0x05, 0x17, 0x5F, 0x10, 0x6F, 0x10, 0xDC, 0x12, 0x7D, 0x10, + 0x09, 0x22, 0xC8, 0x1D, 0x47, 0x2F, 0xE6, 0x2E, 0xB6, 0x2F, 0x83, 0x34, + 0x8B, 0x3D, 0x7E, 0x43, 0x1A, 0x43, 0xCC, 0x47, 0x8F, 0x37, 0x86, 0x3C, + 0xAE, 0x31, 0xF4, 0x39, 0x01, 0x30, 0x20, 0x37, 0x7A, 0x45, 0xF5, 0x47, + 0x22, 0x5A, 0x00, 0x55, 0xF0, 0x5C, 0x6C, 0x53, 0x70, 0x5C, 0xE0, 0x5B, + 0x26, 0x53, 0x65, 0x58, 0xCD, 0x4B, 0xAA, 0x4D, 0x33, 0x4B, 0x9A, 0x4A, + 0xCD, 0x3C, 0x00, 0x3C, 0xCE, 0x1C, 0x3F, 0x1E, 0x2B, 0x0C, 0xE9, 0x12, + 0x4C, 0x09, 0x85, 0x11, 0x82, 0xF6, 0x79, 0xF9, 0x4F, 0xE3, 0x56, 0xE3, + 0xDC, 0xDE, 0x15, 0xE2, 0x13, 0xE9, 0x9B, 0xF2, 0x75, 0xF1, 0xB4, 0x02, + 0xAA, 0xDC, 0x8D, 0xEF, 0x00, 0xC8, 0xF7, 0xD7, 0xA6, 0xCB, 0xC2, 0xD5, + 0x4D, 0xCF, 0xA0, 0xD3, 0x9C, 0xB9, 0x48, 0xBD, 0xC0, 0xA3, 0x87, 0xA1, + 0x6C, 0xA5, 0xD2, 0x9E, 0x9D, 0xA4, 0x00, 0xA0, 0x2B, 0xA4, 0x0E, 0x9F, + 0xE5, 0xA8, 0xC6, 0xA3, 0x5D, 0xB5, 0xDD, 0xB4, 0x33, 0xD5, 0x0F, 0xD9, + 0x63, 0xF7, 0x17, 0xFD, 0x3E, 0x00, 0xBA, 0x05, 0xF6, 0x01, 0x4E, 0x00, + 0xD1, 0xFF, 0x9B, 0xF5, 0xCD, 0xF2, 0x9E, 0xE6, 0xB6, 0xE7, 0x0E, 0xD9, + 0x81, 0xD2, 0xF9, 0xC1, 0x33, 0xC0, 0x3E, 0xB1, 0xA1, 0xB8, 0x36, 0xB0, + 0x42, 0xAF, 0x92, 0xB2, 0xA1, 0xA6, 0x35, 0xAB, 0xD3, 0xA2, 0x60, 0xA4, + 0x1F, 0xA3, 0x63, 0xA6, 0x10, 0xAF, 0xD0, 0xB5, 0x2E, 0xB0, 0x6E, 0xBC, + 0x01, 0xB1, 0x4D, 0xC1, 0xF7, 0xCE, 0x71, 0xE0, 0xA5, 0xDF, 0xB2, 0xEF, + 0x68, 0xEB, 0xEB, 0xF4, 0xD5, 0x0C, 0x10, 0x09, 0xE9, 0x27, 0xF4, 0x1A, + 0x25, 0x2B, 0x09, 0x1C, 0xF3, 0x32, 0xAC, 0x20, 0x6E, 0x41, 0xB6, 0x2F, + 0x5D, 0x36, 0xC1, 0x26, 0xBB, 0x1B, 0xBD, 0x0B, 0x98, 0x05, 0x25, 0xF7, + 0xB8, 0xF5, 0x96, 0xE5, 0x55, 0xE7, 0x03, 0xDB, 0x57, 0xDA, 0x2E, 0xD4, + 0x8B, 0xD7, 0xDD, 0xCD, 0x5D, 0xE3, 0x34, 0xD3, 0x37, 0xF1, 0xF7, 0xDD, + 0x02, 0xFE, 0x22, 0xEF, 0x24, 0x08, 0x71, 0x03, 0x02, 0x05, 0x14, 0x0B, + 0x43, 0xFD, 0xB3, 0x0B, 0xDF, 0xFA, 0x4E, 0x15, 0xD0, 0xF7, 0xFE, 0x1A, + 0x9C, 0xF5, 0x8C, 0x11, 0x83, 0xEC, 0x4D, 0xF9, 0x6E, 0xEE, 0x60, 0xEB, + 0x03, 0x0E, 0x26, 0x02, 0xD8, 0x21, 0x3E, 0x18, 0x8E, 0x29, 0xC5, 0x20, + 0x47, 0x40, 0x1B, 0x3C, 0x21, 0x58, 0xDF, 0x5B, 0x50, 0x5A, 0xEF, 0x61, + 0xF6, 0x58, 0xF7, 0x62, 0x22, 0x5C, 0x4E, 0x60, 0x33, 0x49, 0x9D, 0x41, + 0xB7, 0x28, 0x58, 0x16, 0x53, 0x16, 0x09, 0xFC, 0xF2, 0x0C, 0xFF, 0xEB, + 0x78, 0xF3, 0x03, 0xD2, 0x8F, 0xD6, 0xB0, 0xB7, 0x8F, 0xC4, 0xB5, 0xA8, + 0x9A, 0xBA, 0x8D, 0xAA, 0xF1, 0xB5, 0x20, 0xB1, 0xBC, 0xAE, 0x5C, 0xAF, + 0x7D, 0xB1, 0xB7, 0xB5, 0xE5, 0xB8, 0x08, 0xBC, 0xB1, 0xAF, 0x67, 0xB5, + 0xAD, 0xAA, 0x25, 0xB2, 0x0D, 0xBC, 0x3C, 0xBF, 0x1A, 0xD2, 0x22, 0xD5, + 0xC5, 0xF5, 0x16, 0xFB, 0x28, 0x17, 0x44, 0x22, 0xDA, 0x24, 0xC1, 0x35, + 0x83, 0x34, 0x30, 0x46, 0x3D, 0x48, 0x90, 0x57, 0x50, 0x44, 0x90, 0x53, + 0x84, 0x27, 0xB4, 0x32, 0xCB, 0x15, 0x47, 0x17, 0x34, 0x11, 0x01, 0x10, + 0x96, 0x0D, 0x51, 0x0D, 0xE6, 0x0B, 0x09, 0x10, 0x50, 0x0C, 0x3D, 0x14, + 0x2A, 0x0D, 0xC7, 0x0F, 0xEE, 0x0A, 0xB5, 0x0C, 0xD7, 0x04, 0x58, 0x0A, + 0xD6, 0xFB, 0xC1, 0x01, 0x41, 0xF3, 0x1C, 0xF9, 0x71, 0xEE, 0x30, 0xEE, + 0x00, 0xE8, 0x93, 0xDF, 0xFC, 0xD8, 0x77, 0xC9, 0xAC, 0xCA, 0xFD, 0xB6, + 0xE2, 0xC1, 0xFB, 0xB0, 0x97, 0xB8, 0x0E, 0xB2, 0xB7, 0xB9, 0x2E, 0xBD, + 0x42, 0xC3, 0xAD, 0xCC, 0x59, 0xCF, 0xD9, 0xDE, 0x5C, 0xF0, 0x4D, 0xFD, + 0xA0, 0x13, 0x6B, 0x1C, 0xD1, 0x1C, 0x38, 0x25, 0x60, 0x26, 0x5C, 0x2F, + 0xC9, 0x2C, 0x50, 0x3E, 0x1F, 0x1D, 0x86, 0x32, 0xD8, 0x05, 0x88, 0x13, + 0x12, 0xEC, 0x56, 0xF4, 0x80, 0xD4, 0x2E, 0xDA, 0xD0, 0xC1, 0x52, 0xC7, + 0x0A, 0xB2, 0x91, 0xB7, 0x41, 0xAA, 0xFD, 0xAD, 0x36, 0xB2, 0xF0, 0xB4, + 0xAB, 0xC2, 0xE7, 0xC7, 0x5E, 0xC1, 0xB4, 0xC9, 0x6A, 0xBB, 0x14, 0xC7, + 0x04, 0xC2, 0x37, 0xD8, 0x13, 0xCF, 0xDA, 0xEC, 0x51, 0xDF, 0x2E, 0x00, + 0x4F, 0xE5, 0xE7, 0x02, 0x90, 0xE7, 0xFB, 0xFC, 0xEE, 0xFF, 0x84, 0x15, + 0xCF, 0x13, 0x36, 0x28, 0x0A, 0x0C, 0x34, 0x19, 0xC4, 0xFD, 0xEE, 0x05, + 0x3B, 0xFF, 0xBD, 0x00, 0x28, 0x02, 0xAF, 0xFE, 0x01, 0xEF, 0x09, 0xEB, + 0x53, 0xDF, 0x82, 0xDA, 0xB2, 0xE1, 0x7F, 0xDA, 0xC7, 0xDD, 0x5B, 0xD4, + 0xB0, 0xCC, 0x05, 0xC0, 0xF8, 0xBD, 0x8F, 0xB0, 0xC4, 0xBB, 0x18, 0xB9, + 0x29, 0xC5, 0x31, 0xCF, 0x67, 0xD1, 0x11, 0xE9, 0x7A, 0xDE, 0xBD, 0xFF, + 0x3F, 0xDD, 0x44, 0xFF, 0x00, 0xC7, 0xC0, 0xE9, 0xCA, 0xC2, 0x3F, 0xDC, + 0xF3, 0xCE, 0x21, 0xD6, 0x8B, 0xBC, 0x49, 0xB8, 0xE5, 0xA3, 0xF5, 0x9B, + 0x96, 0xB6, 0x94, 0xAD, 0x5A, 0xD3, 0xAD, 0xC6, 0x65, 0xDD, 0x4B, 0xCC, + 0xC9, 0xF8, 0x9C, 0xE9, 0xD5, 0x22, 0x87, 0x1A, 0xEE, 0x39, 0x10, 0x37, + 0xFB, 0x43, 0x6E, 0x42, 0x02, 0x50, 0x4B, 0x4A, 0xA8, 0x52, 0x5C, 0x3F, + 0x93, 0x35, 0x9F, 0x1B, 0xF7, 0x15, 0xCD, 0xFC, 0x32, 0xFC, 0xF3, 0xE2, + 0xE1, 0xD3, 0xF7, 0xC2, 0xC5, 0xBF, 0x9C, 0xB5, 0x69, 0xB8, 0x30, 0xB0, + 0x22, 0xAA, 0xF0, 0xA4, 0x63, 0xA6, 0x20, 0xA1, 0x6C, 0xAE, 0x72, 0xA7, + 0x68, 0xB0, 0xBF, 0xAA, 0xCB, 0xAD, 0x6D, 0xAD, 0x57, 0xB3, 0x7C, 0xBC, + 0xAD, 0xB9, 0x11, 0xCA, 0x39, 0xCF, 0xF3, 0xDA, 0xFE, 0xE9, 0x82, 0xE9, + 0xA9, 0x00, 0x01, 0xF7, 0xCA, 0x22, 0x1D, 0x11, 0xC5, 0x2B, 0x99, 0x19, + 0x9B, 0x21, 0x04, 0x13, 0x0C, 0x2B, 0x14, 0x1F, 0x55, 0x2C, 0xDC, 0x2A, + 0xF0, 0x1B, 0x7D, 0x21, 0xF4, 0x06, 0x07, 0x0E, 0xF7, 0xF9, 0x62, 0x02, + 0xCC, 0xFE, 0xD0, 0x04, 0xC1, 0xFC, 0x98, 0xFD, 0xB9, 0xFE, 0xF3, 0xF9, + 0x77, 0x17, 0xD6, 0x0E, 0xE3, 0x2C, 0x3D, 0x24, 0xB4, 0x3D, 0xAA, 0x36, + 0x0F, 0x4B, 0x97, 0x46, 0x91, 0x52, 0xE2, 0x53, 0xE0, 0x5B, 0x40, 0x5C, + 0x85, 0x5D, 0x46, 0x51, 0xDF, 0x4E, 0xF6, 0x3E, 0x17, 0x3A, 0x2B, 0x2D, + 0xE7, 0x21, 0x04, 0x14, 0x92, 0x22, 0x08, 0x1C, 0x12, 0x3D, 0x2C, 0x3C, + 0x62, 0x3D, 0x08, 0x3C, 0xFE, 0x34, 0xF3, 0x36, 0x59, 0x41, 0xCC, 0x47, + 0x8B, 0x56, 0xBF, 0x5C, 0xBC, 0x59, 0x81, 0x5D, 0x4E, 0x57, 0x05, 0x5B, + 0xD2, 0x5C, 0x00, 0x5F, 0xA7, 0x5D, 0xD4, 0x5C, 0x5E, 0x54, 0xF9, 0x55, + 0x3F, 0x35, 0x0F, 0x3D, 0xE3, 0x1A, 0x54, 0x1D, 0xEC, 0x1A, 0x7A, 0x0B, + 0xF9, 0x0C, 0x59, 0xF0, 0x85, 0xFC, 0x51, 0xD8, 0xC5, 0xFC, 0xE7, 0xDB, + 0x7B, 0xEE, 0x08, 0xE0, 0x6F, 0xEC, 0x6D, 0xE4, 0x68, 0xFC, 0x99, 0xF3, + 0x40, 0x04, 0xF3, 0x04, 0xEB, 0x08, 0x6F, 0x0F, 0x37, 0x1C, 0xCE, 0x20, + 0xF4, 0x2D, 0xCD, 0x33, 0x35, 0x39, 0x75, 0x41, 0x95, 0x52, 0x77, 0x58, + 0x0F, 0x5D, 0xF0, 0x60, 0xEC, 0x55, 0x39, 0x59, 0x5A, 0x58, 0xDB, 0x5A, + 0x7E, 0x57, 0xD5, 0x55, 0x29, 0x5A, 0x8D, 0x53, 0xC3, 0x5D, 0x07, 0x5B, + 0x7E, 0x49, 0x9A, 0x4B, 0x1A, 0x38, 0xA1, 0x3A, 0x0D, 0x26, 0x8F, 0x29, + 0x14, 0x16, 0xAE, 0x16, 0x2A, 0x1A, 0xCD, 0x1E, 0x8E, 0x15, 0x74, 0x27, + 0x4F, 0x12, 0xA2, 0x29, 0x3B, 0x17, 0xA9, 0x2A, 0x25, 0x17, 0x7D, 0x22, + 0xD3, 0x0D, 0x2B, 0x12, 0x55, 0xFF, 0xEE, 0x01, 0x54, 0xF7, 0x7B, 0xF7, + 0x96, 0xF2, 0xCC, 0xEA, 0x16, 0xEA, 0x37, 0xDF, 0x3C, 0xD6, 0xC5, 0xCA, + 0xE2, 0xCA, 0x40, 0xB9, 0x8D, 0xD3, 0x10, 0xBC, 0x4F, 0xE7, 0x3F, 0xC9, + 0x17, 0x08, 0xD3, 0xE9, 0xD3, 0x2E, 0x25, 0x1C, 0xCE, 0x4B, 0x37, 0x3E, + 0x73, 0x56, 0xDC, 0x48, 0xF8, 0x59, 0x9A, 0x4F, 0xBD, 0x57, 0x05, 0x4A, + 0xB9, 0x4A, 0x77, 0x38, 0xA2, 0x33, 0xDA, 0x27, 0x27, 0x0F, 0x8A, 0x10, + 0xA3, 0xEB, 0xE3, 0xF3, 0xE5, 0xDF, 0x83, 0xE5, 0x7B, 0xDC, 0x44, 0xDB, + 0xF0, 0xD8, 0x40, 0xD1, 0x34, 0xE1, 0x51, 0xD1, 0x47, 0xF0, 0x61, 0xDC, + 0x6B, 0xF9, 0x1F, 0xE8, 0x19, 0x03, 0xD2, 0xEC, 0xE2, 0x09, 0x51, 0xEF, + 0x29, 0x0E, 0x29, 0xF9, 0x25, 0x17, 0xB0, 0x00, 0xAF, 0x25, 0x45, 0x0B, + 0xFB, 0x3C, 0xB7, 0x28, 0xCE, 0x4E, 0xA8, 0x43, 0x49, 0x50, 0x94, 0x4B, + 0x5B, 0x44, 0x47, 0x3D, 0xB3, 0x45, 0xF4, 0x35, 0xF7, 0x46, 0x46, 0x34, + 0xFA, 0x32, 0x68, 0x20, 0x9C, 0x13, 0xDE, 0x01, 0x0F, 0xF5, 0x6F, 0xED, + 0x40, 0xEC, 0x09, 0xED, 0xD1, 0xE8, 0xB7, 0xE9, 0xA2, 0xE2, 0xAA, 0xEA, + 0x64, 0xDE, 0xCD, 0xF0, 0xDA, 0xDB, 0xC1, 0xF4, 0xB9, 0xE9, 0x8F, 0x08, + 0x2C, 0xFC, 0x4E, 0x1A, 0x4A, 0x06, 0xE6, 0x1B, 0x71, 0x07, 0x9D, 0x14, + 0x92, 0xF6, 0xD4, 0x02, 0x7F, 0xDF, 0x7A, 0xF0, 0xD2, 0xD6, 0xF3, 0xE3, + 0x79, 0xD0, 0xAC, 0xD3, 0xD1, 0xBB, 0x6B, 0xBB, 0xC6, 0xBC, 0x43, 0xBA, + 0xED, 0xD0, 0xC7, 0xCF, 0x75, 0xDF, 0xC7, 0xE6, 0xD2, 0x04, 0xF5, 0x0B, + 0x9D, 0x26, 0x2D, 0x29, 0x1A, 0x39, 0x75, 0x40, 0x05, 0x56, 0x27, 0x5D, + 0x95, 0x5D, 0x51, 0x62, 0x6C, 0x49, 0x2B, 0x57, 0x0D, 0x36, 0x85, 0x49, + 0xA9, 0x24, 0x3A, 0x34, 0x74, 0x04, 0x3D, 0x0F, 0xE5, 0xD7, 0x1E, 0xDD, + 0x65, 0xC3, 0x52, 0xC4, 0xB5, 0xCB, 0xD7, 0xCB, 0x93, 0xCB, 0xA6, 0xCE, + 0xD2, 0xC4, 0xFE, 0xCF, 0xFD, 0xCA, 0x6C, 0xDF, 0x24, 0xBD, 0x99, 0xDA, + 0xD3, 0xA8, 0x4F, 0xCB, 0xA4, 0xB7, 0xE7, 0xD4, 0xC1, 0xC1, 0xF8, 0xDA, + 0x91, 0xC6, 0x85, 0xE1, 0x41, 0xE7, 0xEF, 0xFE, 0x8B, 0xFD, 0x68, 0x12, + 0x5C, 0xFE, 0xA6, 0x11, 0x16, 0x07, 0xA1, 0x13, 0x58, 0x13, 0x10, 0x20, + 0xD3, 0x20, 0x49, 0x32, 0x8E, 0x1D, 0x46, 0x2C, 0xB7, 0xFB, 0x43, 0x0A, + 0xD8, 0xE2, 0x8D, 0xF2, 0xCB, 0xDA, 0xD7, 0xE3, 0xAE, 0xCE, 0x8A, 0xD3, + 0x84, 0xC9, 0x50, 0xD3, 0xD9, 0xC6, 0x89, 0xD9, 0xD3, 0xC6, 0x25, 0xDF, + 0x72, 0xCC, 0x26, 0xE4, 0xAC, 0xC5, 0x61, 0xE1, 0x59, 0xB1, 0xC7, 0xD3, + 0x7F, 0xA3, 0x0F, 0xC3, 0x65, 0xAB, 0x5C, 0xC5, 0xEC, 0xAF, 0x64, 0xC2, + 0x71, 0xA7, 0x5C, 0xAC, 0x8F, 0x9F, 0xEF, 0x9E, 0x05, 0x9C, 0x05, 0x9C, + 0x33, 0xA9, 0xC2, 0xA1, 0xC9, 0xB2, 0x7A, 0xA2, 0x47, 0xBB, 0xB2, 0xA6, + 0x76, 0xDD, 0xF6, 0xC7, 0x42, 0xFF, 0xFA, 0xEB, 0x2C, 0x16, 0x06, 0x08, + 0x0C, 0x26, 0xF9, 0x24, 0x58, 0x26, 0xFE, 0x34, 0x45, 0x1D, 0xB5, 0x33, + 0x23, 0x04, 0x5B, 0x21, 0x8A, 0xDF, 0x17, 0xFF, 0xEB, 0xBF, 0x0A, 0xD4, + 0x72, 0xA9, 0x47, 0xB1, 0xD9, 0xA1, 0xB8, 0x9F, 0x23, 0xA7, 0xE4, 0x9B, + 0x9F, 0xA5, 0xA7, 0x9D, 0xDC, 0xA4, 0xC8, 0xA2, 0x31, 0xAA, 0x8A, 0xA3, + 0x4D, 0xA9, 0x16, 0xA2, 0x51, 0xA6, 0xD5, 0xA8, 0xC2, 0xA6, 0xAC, 0xB6, + 0x70, 0xB7, 0x46, 0xD3, 0x02, 0xC6, 0x13, 0xE4, 0x6B, 0xD2, 0x45, 0xE6, + 0x99, 0xFC, 0xB6, 0xFC, 0x62, 0x17, 0x18, 0x03, 0x19, 0x18, 0x73, 0xFA, + 0x5E, 0x2A, 0xE2, 0x0A, 0xB8, 0x36, 0xEF, 0x1A, 0x9F, 0x1F, 0xD2, 0x12, + 0x9A, 0x06, 0x9B, 0x04, 0xD8, 0xF5, 0xF4, 0xF5, 0xBA, 0xE1, 0x91, 0xEA, + 0x19, 0xD5, 0x46, 0xE6, 0x5C, 0xC6, 0x8D, 0xD5, 0xA2, 0xC6, 0xBE, 0xD1, + 0x27, 0xE2, 0xAB, 0xE6, 0x49, 0xF8, 0x30, 0xF4, 0xA9, 0x06, 0x27, 0xFD, + 0x3E, 0x09, 0x46, 0xFE, 0xCC, 0xF3, 0x51, 0xEE, 0xB0, 0xDF, 0xA7, 0xE0, + 0x32, 0xD0, 0x0A, 0xD2, 0x33, 0xB9, 0xC4, 0xBB, 0xDF, 0xA9, 0x67, 0xAB, + 0xAA, 0x9E, 0x77, 0x9E, 0x41, 0x98, 0xE0, 0x9F, 0x35, 0xA4, 0x84, 0xB1, + 0xB6, 0xAF, 0x34, 0xB9, 0xD3, 0xBC, 0xA2, 0xC4, 0xDF, 0xDC, 0x0D, 0xE4, + 0xC5, 0x02, 0xDB, 0x03, 0x74, 0x22, 0x25, 0x1D, 0x64, 0x30, 0x36, 0x2A, + 0x11, 0x2D, 0xAA, 0x2F, 0x27, 0x1A, 0x1B, 0x28, 0x28, 0xFC, 0x65, 0x0D, + 0x3F, 0xDE, 0xE7, 0xEB, 0x0E, 0xCE, 0xE9, 0xD0, 0xEB, 0xC1, 0x7B, 0xBB, + 0xE7, 0xA9, 0x2F, 0xA7, 0xB8, 0xA5, 0xAD, 0xA5, 0x80, 0xB3, 0x17, 0xAB, + 0xFF, 0xB3, 0x57, 0xA6, 0x2B, 0xAE, 0x5F, 0x9E, 0x4F, 0xB9, 0x9B, 0xA8, + 0x60, 0xCC, 0x77, 0xC2, 0xF7, 0xDE, 0xCF, 0xDD, 0x6D, 0xF1, 0x65, 0xF3, + 0x44, 0x03, 0x45, 0x04, 0xFC, 0x17, 0x09, 0x17, 0xE1, 0x23, 0xAC, 0x22, + 0x98, 0x31, 0xF1, 0x2C, 0x6E, 0x3E, 0xA0, 0x31, 0x46, 0x46, 0x6C, 0x36, + 0x58, 0x4D, 0x50, 0x3D, 0xBB, 0x44, 0xDE, 0x34, 0x08, 0x32, 0x03, 0x24, + 0x88, 0x2B, 0x30, 0x1A, 0xA1, 0x25, 0x58, 0x0F, 0x07, 0x11, 0x36, 0x01, + 0x88, 0x10, 0xF8, 0x09, 0x76, 0x17, 0xD2, 0x12, 0x90, 0x19, 0x6F, 0x0F, + 0xCF, 0x28, 0x0C, 0x16, 0x4D, 0x2B, 0xB1, 0x18, 0xAB, 0x1E, 0x8C, 0x16, + 0xFF, 0x1A, 0x41, 0x1B, 0x0C, 0x14, 0xC6, 0x14, 0xAD, 0x06, 0x62, 0xFF, + 0x20, 0xF8, 0x50, 0xE4, 0x2B, 0xED, 0x34, 0xD3, 0x9A, 0xE9, 0x9E, 0xCF, + 0x73, 0xE8, 0xFB, 0xD2, 0xF7, 0xEF, 0x3F, 0xDF, 0x4A, 0xFC, 0x47, 0xE7, + 0x26, 0x23, 0x2D, 0x06, 0x49, 0x4A, 0xCB, 0x2D, 0x76, 0x53, 0x54, 0x3C, + 0x4A, 0x5E, 0xEF, 0x4E, 0xFB, 0x5F, 0x54, 0x55, 0x8B, 0x5C, 0xF2, 0x49, + 0xFA, 0x58, 0x77, 0x3A, 0x36, 0x30, 0x20, 0x0E, 0x48, 0x0E, 0x5E, 0xF1, + 0x43, 0x00, 0x7E, 0xEE, 0x04, 0xEB, 0x0A, 0xE6, 0x6D, 0xE9, 0xA1, 0xEC, + 0xAE, 0xDD, 0xFD, 0xE1, 0xE4, 0xD7, 0x1A, 0xD5, 0xA8, 0xEC, 0x1F, 0xE5, + 0x1E, 0xEE, 0xBD, 0xE9, 0x68, 0xED, 0xEA, 0xEC, 0x13, 0x08, 0xE4, 0x0A, + 0xBB, 0x17, 0x99, 0x1D, 0x98, 0x19, 0x74, 0x1B, 0xEA, 0x3F, 0x2A, 0x3C, + 0x8D, 0x5B, 0x00, 0x5A, 0x25, 0x52, 0x12, 0x57, 0x41, 0x51, 0x98, 0x5A, + 0x0D, 0x57, 0x33, 0x5D, 0x9F, 0x55, 0xBA, 0x51, 0x88, 0x55, 0xFA, 0x44, + 0x9B, 0x47, 0xA2, 0x2E, 0x0D, 0x2D, 0x05, 0x18, 0xB8, 0x18, 0xBA, 0x0F, + 0x1E, 0x0E, 0xF3, 0x06, 0x46, 0x15, 0x70, 0x08, 0xB2, 0x18, 0xA8, 0x09, + 0xB8, 0x18, 0xDD, 0x07, 0x5C, 0x18, 0x69, 0x06, 0x6E, 0x19, 0xA5, 0x0C, + 0xD7, 0x21, 0xAC, 0x1B, 0x7E, 0x21, 0x54, 0x1E, 0xAD, 0x19, 0xF0, 0x16, + 0xE1, 0x00, 0x1C, 0xFB, 0x56, 0xE8, 0xC0, 0xDB, 0xF3, 0xE1, 0x19, 0xCC, + 0x3D, 0xD9, 0x46, 0xBE, 0xAA, 0xDB, 0x44, 0xBE, 0x32, 0xF8, 0x66, 0xD6, + 0x5C, 0x13, 0x3D, 0xF1, 0x7D, 0x23, 0x11, 0x0C, 0x57, 0x41, 0x11, 0x37, + 0x58, 0x5B, 0x16, 0x5B, 0xE3, 0x5C, 0xC7, 0x61, 0x9D, 0x5E, 0xD0, 0x61, + 0xC7, 0x5B, 0xC4, 0x5A, 0xAD, 0x45, 0xA5, 0x41, 0xFD, 0x2A, 0xAA, 0x23, + 0xD7, 0x19, 0x98, 0x0D, 0xA5, 0x0E, 0x09, 0xFC, 0x78, 0x06, 0x6A, 0xED, + 0x71, 0xFE, 0xBB, 0xE3, 0x3B, 0xE9, 0x9A, 0xCE, 0x62, 0xDB, 0x59, 0xC0, + 0x56, 0xDB, 0xCF, 0xC1, 0x70, 0xDE, 0xE9, 0xCB, 0xC4, 0xE2, 0x36, 0xDB, + 0xF4, 0xE0, 0xAD, 0xE4, 0xDB, 0xE7, 0x1C, 0xF2, 0xE6, 0xF0, 0xD1, 0xFB, + 0xA5, 0x04, 0x87, 0x0C, 0x88, 0x16, 0xD5, 0x1C, 0x9E, 0x10, 0x1D, 0x1A, + 0x6E, 0x14, 0x13, 0x21, 0xED, 0x22, 0x86, 0x30, 0x35, 0x20, 0x56, 0x2E, + 0x02, 0x11, 0x42, 0x1E, 0x4A, 0x0D, 0x9B, 0x14, 0x05, 0x0F, 0x9A, 0x0F, + 0x62, 0x15, 0xD8, 0x12, 0xC6, 0x12, 0x49, 0x12, 0x14, 0x0A, 0xD2, 0x0C, + 0x38, 0x14, 0xA0, 0x18, 0xAB, 0x26, 0x7D, 0x29, 0x2C, 0x39, 0x97, 0x38, + 0x1D, 0x45, 0xEF, 0x43, 0x9D, 0x3B, 0xA9, 0x3E, 0xCB, 0x27, 0xBE, 0x2D, + 0xAA, 0x1C, 0x9F, 0x1F, 0x90, 0x0D, 0x2B, 0x0D, 0x95, 0xFD, 0xE5, 0xFC, + 0xD2, 0xF3, 0x00, 0xF5, 0x6A, 0xEE, 0x77, 0xF1, 0x75, 0xFB, 0x0C, 0x01, + 0x1F, 0xFE, 0x9C, 0x03, 0xE9, 0x05, 0xFA, 0x07, 0xA8, 0x2E, 0xCA, 0x2C, + 0x97, 0x43, 0x51, 0x40, 0x50, 0x4D, 0xC2, 0x4A, 0xE2, 0x57, 0x49, 0x5A, + 0x16, 0x51, 0xCF, 0x5B, 0x19, 0x3E, 0x6E, 0x4D, 0x78, 0x2D, 0xE7, 0x38, + 0xD8, 0x18, 0x39, 0x1C, 0x9A, 0xF3, 0x60, 0xF2, 0x3D, 0xDF, 0x00, 0xDD, + 0xE4, 0xC9, 0xAE, 0xC8, 0x04, 0xA8, 0x99, 0xA8, 0xE3, 0xAA, 0x6D, 0xAD, + 0x62, 0xB5, 0xE0, 0xBA, 0x97, 0xAA, 0xE2, 0xB9, 0x78, 0xB1, 0xB8, 0xCE, + 0xB5, 0xB5, 0x6F, 0xDD, 0x4C, 0xBC, 0x87, 0xE6, 0x0D, 0xD1, 0x1F, 0xF8, + 0xD1, 0xE0, 0x18, 0x03, 0x7B, 0xFB, 0xA5, 0x18, 0x57, 0x12, 0xCB, 0x2A, + 0x25, 0x19, 0x41, 0x32, 0x07, 0x1B, 0x5D, 0x3A, 0xA8, 0x17, 0xC9, 0x3B, + 0x96, 0x0D, 0x37, 0x32, 0x30, 0xFF, 0x54, 0x21, 0xC7, 0xE0, 0x4A, 0x03, + 0xE1, 0xC6, 0xEF, 0xEE, 0xEC, 0xBF, 0x22, 0xEF, 0xE1, 0xAF, 0x92, 0xE1, + 0xE2, 0xAC, 0x02, 0xDB, 0x99, 0xC1, 0x61, 0xE7, 0xDC, 0xD3, 0x45, 0xF4, + 0x57, 0xE9, 0xD8, 0x09, 0x6B, 0xF2, 0xC5, 0x13, 0x51, 0xE6, 0xF3, 0x07, + 0x04, 0xE9, 0x87, 0x06, 0xB0, 0xE8, 0x98, 0xFB, 0x2F, 0xCF, 0xBF, 0xD4, + 0x59, 0xBF, 0xC5, 0xB9, 0xD6, 0xB9, 0x36, 0xAD, 0x47, 0xB5, 0xC6, 0xA6, + 0xAE, 0xB9, 0x84, 0xB0, 0x26, 0xC1, 0x02, 0xC6, 0x98, 0xD5, 0x0B, 0xE8, + 0x6B, 0xF6, 0xA6, 0x0B, 0x01, 0x19, 0x56, 0x2E, 0xD6, 0x34, 0x4D, 0x4F, + 0x66, 0x3C, 0x48, 0x5A, 0xC3, 0x34, 0xD0, 0x53, 0xAF, 0x21, 0x83, 0x41, + 0x23, 0x01, 0xA5, 0x21, 0x20, 0xDD, 0x73, 0xFB, 0x11, 0xC6, 0x6B, 0xDD, + 0x1C, 0xBE, 0xE7, 0xCC, 0xB4, 0xB2, 0x11, 0xB9, 0x64, 0xAA, 0xFC, 0xAB, + 0x11, 0xA4, 0xA8, 0xA6, 0x51, 0x9E, 0xEC, 0xA2, 0x2A, 0xAF, 0x9E, 0xB0, + 0x35, 0xBD, 0x90, 0xBF, 0x7D, 0xBC, 0xA9, 0xC1, 0x78, 0xD3, 0x40, 0xD5, + 0x7C, 0xE7, 0x53, 0xE7, 0x93, 0xE0, 0x01, 0xE2, 0x71, 0xFB, 0xFE, 0xFB, + 0x4B, 0x23, 0xBA, 0x1D, 0x02, 0x28, 0x7D, 0x1D, 0xAB, 0x32, 0x96, 0x27, + 0x3C, 0x43, 0xF3, 0x36, 0xF6, 0x3D, 0x5A, 0x2F, 0x9A, 0x22, 0xC4, 0x1A, + 0x30, 0xFE, 0x51, 0x06, 0x90, 0xE2, 0x1F, 0xFA, 0xFF, 0xCF, 0x8A, 0xF2, + 0x10, 0xC2, 0x1F, 0xE5, 0xF0, 0xC3, 0xEB, 0xDE, 0x8C, 0xC5, 0xF8, 0xDA, + 0xC2, 0xC6, 0x65, 0xD5, 0x1C, 0xD9, 0xC2, 0xE0, 0xFF, 0xDE, 0xB7, 0xE5, + 0xEE, 0xCD, 0x63, 0xD5, 0x8B, 0xC6, 0x31, 0xC8, 0x56, 0xC7, 0x83, 0xBD, + 0x14, 0xC3, 0xD3, 0xB2, 0x1E, 0xB6, 0x07, 0xAB, 0x3A, 0xA7, 0x82, 0xA5, + 0x7C, 0xA2, 0x6A, 0xA4, 0x71, 0xA5, 0xB1, 0xA8, 0x43, 0xBB, 0xD2, 0xBC, + 0xC6, 0xDA, 0xBF, 0xDC, 0xF5, 0xFF, 0x52, 0x06, 0xA4, 0x25, 0xD7, 0x2D, + 0x6E, 0x38, 0x91, 0x42, 0xE3, 0x49, 0x26, 0x56, 0x19, 0x52, 0x71, 0x56, + 0xCC, 0x3C, 0x9C, 0x37, 0x39, 0x26, 0x1A, 0x22, 0xE7, 0xFE, 0x6F, 0x01, + 0x12, 0xD5, 0x6E, 0xDB, 0xB9, 0xCC, 0xBB, 0xD3, 0x9A, 0xCD, 0xCC, 0xD7, + 0x79, 0xC1, 0x3C, 0xCF, 0x40, 0xC0, 0x7E, 0xCB, 0x4D, 0xCD, 0x63, 0xD8, + 0xC7, 0xCC, 0x47, 0xE0, 0x68, 0xCE, 0x3D, 0xE6, 0xAF, 0xD5, 0xB7, 0xEA, + 0x12, 0xE7, 0x96, 0xF1, 0x76, 0xFB, 0x4B, 0xF4, 0x86, 0x05, 0x7A, 0xF4, + 0x6A, 0x1D, 0x46, 0x0A, 0x3E, 0x3A, 0x79, 0x20, 0xDF, 0x41, 0x7A, 0x20, + 0xD3, 0x3F, 0xEC, 0x1E, 0x09, 0x48, 0xDF, 0x2D, 0x5A, 0x3C, 0xF9, 0x25, + 0x50, 0x1F, 0x70, 0x0A, 0xCF, 0x0C, 0xE0, 0x02, 0x3B, 0xF3, 0xDF, 0xF7, + 0xAB, 0xDB, 0x25, 0xE4, 0xB4, 0xD3, 0x3E, 0xDD, 0xE6, 0xDA, 0x7A, 0xE6, + 0x84, 0xEA, 0x79, 0xF0, 0x87, 0xF5, 0x15, 0xF8, 0x72, 0xFB, 0xEC, 0xFF, + 0x17, 0xF6, 0xB3, 0xFF, 0xE3, 0xF3, 0x5C, 0x02, 0x8E, 0xF6, 0xFE, 0xFF, + 0xF3, 0xED, 0x47, 0xE8, 0x53, 0xE8, 0x33, 0xD3, 0x07, 0xDF, 0x3B, 0xC2, + 0xC1, 0xD6, 0x48, 0xB5, 0x77, 0xE5, 0xAD, 0xBB, 0xEF, 0xF2, 0x88, 0xC0, + 0x9B, 0xF3, 0x5F, 0xC9, 0x06, 0x0F, 0x86, 0xF1, 0x89, 0x3B, 0x1E, 0x23, + 0xBF, 0x4E, 0xB0, 0x3F, 0x2E, 0x57, 0x1B, 0x53, 0x8A, 0x5E, 0x71, 0x5F, + 0x31, 0x5B, 0x73, 0x5B, 0xD2, 0x4E, 0xF6, 0x49, 0x95, 0x3C, 0x4D, 0x34, + 0x58, 0x20, 0xE0, 0x18, 0x5C, 0x05, 0xD4, 0xFB, 0xD7, 0xF3, 0x10, 0xE3, + 0x08, 0xF2, 0xD9, 0xD9, 0x1A, 0xFC, 0x66, 0xDF, 0x40, 0xFD, 0xB8, 0xDF, + 0x9D, 0x04, 0x54, 0xE3, 0x95, 0x0F, 0x7C, 0xED, 0x41, 0x11, 0x6C, 0xF7, + 0x23, 0x23, 0x64, 0x05, 0x90, 0x39, 0x39, 0x11, 0xD5, 0x36, 0x38, 0x0E, + 0x59, 0x3D, 0xE2, 0x1A, 0x45, 0x54, 0x16, 0x34, 0x69, 0x59, 0xF2, 0x36, + 0xA6, 0x5A, 0xEE, 0x32, 0x79, 0x61, 0xAA, 0x37, 0x7A, 0x59, 0xE3, 0x32, + 0x47, 0x4F, 0x97, 0x2B, 0x19, 0x49, 0x41, 0x2A, 0x9D, 0x31, 0x63, 0x17, + 0x5B, 0x1B, 0x97, 0x09, 0x0D, 0x0C, 0xE4, 0x00, 0xB6, 0x00, 0xE0, 0xF1, + 0x5E, 0xFF, 0xA0, 0xF2, 0xCD, 0x02, 0x69, 0x01, 0x05, 0x10, 0xFA, 0x10, + 0xB9, 0x19, 0xB1, 0x1A, 0x88, 0x12, 0xED, 0x1A, 0x9A, 0x0C, 0xCF, 0x18, + 0x3A, 0x18, 0x35, 0x1E, 0xB1, 0x12, 0xFF, 0x0D, 0x26, 0xFC, 0xD3, 0xF0, + 0x0E, 0xED, 0x17, 0xE2, 0xF6, 0xE2, 0x19, 0xD7, 0x9A, 0xE2, 0x34, 0xD3, + 0xF0, 0xE4, 0xDE, 0xD0, 0xE5, 0xF3, 0xE2, 0xD7, 0x6A, 0x1D, 0x96, 0xFF, + 0xC9, 0x45, 0x97, 0x26, 0x4D, 0x54, 0xCB, 0x2F, 0xCE, 0x58, 0x0E, 0x3A, + 0x5D, 0x5C, 0xE3, 0x48, 0xF5, 0x50, 0xEB, 0x3E, 0x68, 0x3F, 0xCF, 0x2F, + 0xB5, 0x28, 0xA0, 0x24, 0x70, 0x03, 0x4D, 0x0C, 0x29, 0xF0, 0xE2, 0x00, + 0x53, 0xE2, 0x47, 0xF5, 0xD6, 0xCD, 0x2C, 0xE3, 0x4B, 0xC3, 0x20, 0xD8, + 0x64, 0xC4, 0x5F, 0xD4, 0x05, 0xD0, 0x19, 0xE2, 0x61, 0xD1, 0x15, 0xEC, + 0xE9, 0xCF, 0x1C, 0xEF, 0x4B, 0xDC, 0xC6, 0xFD, 0x28, 0xFD, 0x1E, 0x13, + 0x80, 0x1D, 0xD7, 0x22, 0x25, 0x37, 0xD8, 0x39, 0xB2, 0x4B, 0x12, 0x52, + 0xC4, 0x5A, 0xE1, 0x5E, 0x44, 0x5A, 0xC0, 0x5C, 0x82, 0x50, 0x8B, 0x55, + 0x3D, 0x54, 0x5F, 0x58, 0x4C, 0x5C, 0xC2, 0x58, 0xF3, 0x57, 0xCB, 0x49, + 0x72, 0x3E, 0x78, 0x2C, 0x46, 0x26, 0xE1, 0x0E, 0xB6, 0x1B, 0x8C, 0xFE, + 0xD5, 0x17, 0xC5, 0x01, 0x93, 0x12, 0x11, 0x08, 0x7D, 0x0F, 0x13, 0x12, + 0x76, 0x09, 0x82, 0x1B, 0xB3, 0x03, 0x84, 0x1B, 0x51, 0x06, 0x2E, 0x1D, + 0x85, 0x05, 0x5C, 0x1A, 0x1D, 0x0A, 0x96, 0x14, 0xC4, 0x0E, 0x8C, 0x05, + 0xA3, 0x09, 0x37, 0xF3, 0xF3, 0xF7, 0x49, 0xDD, 0xDA, 0xE2, 0x42, 0xCA, + 0x86, 0xE5, 0x23, 0xCD, 0x4F, 0xE0, 0xB3, 0xCD, 0x01, 0xD9, 0x1C, 0xD7, + 0x0B, 0xF3, 0xE1, 0xF7, 0x9F, 0x1B, 0x06, 0x21, 0x50, 0x39, 0xF6, 0x3D, + 0x5A, 0x47, 0xB0, 0x47, 0x5F, 0x4C, 0xB7, 0x48, 0xD2, 0x3C, 0x91, 0x36, + 0xA0, 0x2B, 0xF0, 0x1F, 0x68, 0x11, 0xC5, 0x04, 0x89, 0xE7, 0x3E, 0xE3, + 0xF1, 0xCD, 0xB5, 0xD2, 0xA4, 0xC7, 0xD2, 0xD8, 0xBC, 0xC5, 0xF5, 0xE4, + 0x91, 0xB7, 0xE8, 0xE0, 0xDB, 0xB3, 0x50, 0xDB, 0xC6, 0xC4, 0xF8, 0xDE, + 0x56, 0xD5, 0x1F, 0xE7, 0xE0, 0xE3, 0xB7, 0xEF, 0x09, 0x01, 0x2C, 0xFE, + 0x56, 0x15, 0x2A, 0x06, 0xFB, 0x13, 0x63, 0x01, 0x22, 0x2E, 0x99, 0x1D, + 0x59, 0x47, 0x70, 0x40, 0x10, 0x3D, 0x23, 0x42, 0xA7, 0x41, 0x9A, 0x49, + 0x4D, 0x4E, 0x60, 0x5A, 0x31, 0x4C, 0x49, 0x5E, 0xFC, 0x3D, 0x29, 0x53, + 0x8F, 0x27, 0x8E, 0x3F, 0xB7, 0x14, 0x8D, 0x2F, 0x60, 0xFC, 0x4E, 0x1D, + 0xC2, 0xE7, 0x7B, 0x05, 0xD1, 0xE9, 0xD5, 0xFE, 0xC6, 0xE8, 0x55, 0x01, + 0xED, 0xE7, 0x04, 0x04, 0x73, 0xEC, 0x09, 0x01, 0x41, 0xE7, 0x6E, 0xF9, + 0x65, 0xEA, 0x6D, 0xFD, 0xE7, 0xEA, 0x8C, 0xFA, 0x6E, 0xE3, 0xE3, 0xEB, + 0x3D, 0xDD, 0xEE, 0xDC, 0x61, 0xD5, 0xD2, 0xCA, 0xF9, 0xD4, 0xF3, 0xBD, + 0xAB, 0xD3, 0x64, 0xB3, 0x95, 0xD0, 0x64, 0xAC, 0x7F, 0xD8, 0xD4, 0xB5, + 0x87, 0xEF, 0xDD, 0xD7, 0xFB, 0x0C, 0xF6, 0x0A, 0xDE, 0x23, 0x02, 0x31, + 0x26, 0x35, 0x2C, 0x46, 0x4B, 0x37, 0x63, 0x4E, 0x1B, 0x39, 0x85, 0x50, + 0xB0, 0x3C, 0x24, 0x48, 0xEF, 0x22, 0x61, 0x25, 0xF1, 0xFE, 0x4A, 0xFD, + 0xB2, 0xE6, 0x7A, 0xE4, 0xF0, 0xCB, 0xB8, 0xCA, 0x2C, 0xB0, 0xC4, 0xB1, + 0xD9, 0xA5, 0x06, 0xB0, 0x67, 0xA8, 0x94, 0xBA, 0xE3, 0xA8, 0xAE, 0xC0, + 0x00, 0xA1, 0x80, 0xC5, 0x72, 0xA1, 0x44, 0xD2, 0xAF, 0x9E, 0x23, 0xD7, + 0x30, 0xA7, 0xAB, 0xDC, 0x7D, 0xCC, 0x8B, 0xEC, 0x14, 0xE7, 0xE2, 0xF1, + 0x3E, 0xFD, 0x36, 0xFB, 0xA2, 0x15, 0xD7, 0x0C, 0x6A, 0x2B, 0x79, 0x20, + 0x6E, 0x3B, 0xFF, 0x30, 0xC6, 0x36, 0x34, 0x2D, 0x45, 0x30, 0x28, 0x2A, + 0x72, 0x2A, 0x26, 0x2C, 0xCD, 0x06, 0x22, 0x11, 0xC6, 0xE6, 0x5E, 0xF8, + 0x89, 0xE1, 0x2E, 0xF7, 0x73, 0xD8, 0x05, 0xEE, 0x09, 0xD1, 0x91, 0xE3, + 0xAF, 0xD9, 0xC6, 0xEE, 0x32, 0xD5, 0x94, 0xF3, 0xF3, 0xD1, 0xFD, 0xF8, + 0x30, 0xE8, 0x3F, 0x0B, 0x60, 0xE4, 0x4D, 0x05, 0x37, 0xD6, 0x2A, 0xF8, + 0xE5, 0xDC, 0xE4, 0xF2, 0x3C, 0xD5, 0xBB, 0xE1, 0x34, 0xBF, 0xDA, 0xC7, + 0x96, 0xB5, 0x36, 0xB9, 0x66, 0xB9, 0x78, 0xB5, 0xFD, 0xD1, 0x4C, 0xC3, + 0x8E, 0xF4, 0xBD, 0xE2, 0xF2, 0x1B, 0xB6, 0x08, 0x4F, 0x47, 0x56, 0x35, + 0x74, 0x55, 0xAB, 0x50, 0x69, 0x54, 0xDF, 0x58, 0x4C, 0x54, 0x43, 0x5D, + 0x42, 0x4A, 0x99, 0x57, 0xBA, 0x34, 0x7B, 0x41, 0xC9, 0x1D, 0x5E, 0x20, + 0x99, 0x07, 0x47, 0x03, 0xAD, 0xE5, 0x5C, 0xE4, 0x93, 0xC9, 0xFC, 0xC9, + 0x77, 0xBC, 0xDE, 0xB8, 0xD9, 0xB0, 0x4B, 0xAA, 0x59, 0xB0, 0xFF, 0xAA, + 0x2C, 0xB1, 0x70, 0xA9, 0xD2, 0xAA, 0x85, 0xA5, 0x1D, 0xAB, 0x61, 0xB3, + 0x1C, 0xA7, 0xC0, 0xBD, 0x75, 0xB7, 0x52, 0xCC, 0x4B, 0xD3, 0x87, 0xDA, + 0xA9, 0xEA, 0xB5, 0xE3, 0xDE, 0x0C, 0x3B, 0xF5, 0x9B, 0x1A, 0x8A, 0xFB, + 0x41, 0x26, 0x3F, 0x05, 0xBF, 0x30, 0x91, 0x0E, 0xE4, 0x30, 0x3E, 0x11, + 0x46, 0x29, 0x09, 0x0C, 0x82, 0xFF, 0xB2, 0xEC, 0x52, 0xDC, 0x20, 0xD4, + 0xE8, 0xD8, 0x90, 0xD8, 0x66, 0xD9, 0x70, 0xE5, 0x41, 0xD4, 0xC6, 0xE5, + 0x45, 0xD8, 0xB8, 0xEB, 0x02, 0xE7, 0x1B, 0xFF, 0xB7, 0xE6, 0x92, 0x06, + 0x3F, 0xE4, 0x18, 0x0A, 0x50, 0xF2, 0xFD, 0x12, 0x3B, 0xF9, 0xE9, 0x0D, + 0x50, 0xF1, 0xFE, 0xF8, 0x23, 0xF8, 0x71, 0xEE, 0x7A, 0xF9, 0x8F, 0xDD, + 0xD6, 0xE7, 0xA2, 0xC2, 0x00, 0xE0, 0xC1, 0xBE, 0x3A, 0xE9, 0x8D, 0xCC, + 0xED, 0xF0, 0x76, 0xD3, 0x23, 0xF9, 0x36, 0xDD, 0x64, 0x11, 0xC2, 0xF7, + 0x31, 0x29, 0xA9, 0x12, 0x70, 0x42, 0x6A, 0x2E, 0x66, 0x48, 0xCE, 0x37, + 0xC1, 0x3D, 0xFA, 0x2A, 0x3B, 0x36, 0x76, 0x19, 0x14, 0x2D, 0x32, 0x08, + 0xEE, 0x17, 0x84, 0xF0, 0xA9, 0xF3, 0x18, 0xCC, 0x99, 0xD7, 0xD7, 0xB9, + 0xE8, 0xC5, 0x6A, 0xB6, 0xA2, 0xAE, 0x1E, 0xA3, 0xD9, 0xA6, 0x0C, 0x9C, + 0xD9, 0xAA, 0xF9, 0xA7, 0xDB, 0xA2, 0x85, 0xAC, 0x8F, 0xA9, 0x49, 0xB8, + 0x22, 0xB1, 0x8B, 0xBE, 0xE8, 0xA7, 0xCD, 0xB4, 0xE8, 0xB6, 0xD4, 0xB9, + 0x87, 0xE1, 0x8F, 0xD0, 0xD5, 0xFC, 0x8E, 0xE1, 0x8A, 0x0A, 0x36, 0xEC, + 0x39, 0x23, 0xC6, 0xFF, 0xE5, 0x3B, 0xB0, 0x0C, 0x15, 0x4A, 0x7F, 0x12, + 0xE0, 0x4C, 0x63, 0x14, 0x37, 0x40, 0x66, 0x0A, 0x7A, 0x36, 0x24, 0x0B, + 0x48, 0x2D, 0x94, 0x09, 0xC6, 0x0D, 0x36, 0xED, 0xFB, 0xF7, 0x63, 0xD7, + 0xC6, 0xF0, 0x7F, 0xD6, 0x76, 0xEA, 0xBB, 0xDB, 0xD1, 0xEA, 0x98, 0xE9, + 0x52, 0xE6, 0x3D, 0xF8, 0xE2, 0xDD, 0xF5, 0x01, 0x3F, 0xE6, 0xB0, 0x11, + 0xA5, 0xE4, 0xC8, 0x10, 0xA3, 0xD6, 0x88, 0x05, 0x07, 0xDD, 0x88, 0x09, + 0x50, 0xE2, 0x6E, 0xFC, 0xAF, 0xDB, 0x9F, 0xDC, 0xB7, 0xD6, 0xDA, 0xC8, + 0x02, 0xD8, 0x97, 0xC3, 0x30, 0xE1, 0xC9, 0xC9, 0xA2, 0xEB, 0x36, 0xD9, + 0xFE, 0xF8, 0x3F, 0xF4, 0x3B, 0x18, 0x65, 0x1B, 0x61, 0x37, 0xE8, 0x38, + 0x35, 0x4F, 0xBE, 0x4C, 0x1D, 0x5E, 0x56, 0x56, 0x22, 0x59, 0x8A, 0x46, + 0xE8, 0x50, 0x72, 0x2F, 0x53, 0x56, 0xF7, 0x28, 0x72, 0x3F, 0x6D, 0x0C, + 0xB5, 0x14, 0xAB, 0xE2, 0xB1, 0x07, 0x23, 0xE0, 0x28, 0xEF, 0xE6, 0xD2, + 0x87, 0xD9, 0x2F, 0xC5, 0xE0, 0xE6, 0x50, 0xDE, 0x92, 0xDA, 0x9E, 0xE3, + 0xDE, 0xBB, 0xF4, 0xD3, 0xF8, 0xB5, 0x0C, 0xD2, 0xF2, 0xB3, 0xD9, 0xD3, + 0x68, 0xC2, 0xCF, 0xDF, 0x75, 0xDE, 0x36, 0xE9, 0x6F, 0xFC, 0xFC, 0xF0, + 0x44, 0x26, 0xD1, 0x13, 0xD5, 0x4E, 0x2A, 0x40, 0xAF, 0x5D, 0xEC, 0x50, + 0x56, 0x56, 0x5E, 0x4E, 0x78, 0x55, 0x41, 0x54, 0xEA, 0x5C, 0x42, 0x58, + 0x28, 0x5A, 0xB8, 0x45, 0xE4, 0x32, 0x75, 0x12, 0xA5, 0x0A, 0x05, 0xEA, + 0xCE, 0xFA, 0xC8, 0xE1, 0x48, 0xDC, 0x6D, 0xD2, 0xD5, 0xC8, 0x9A, 0xCE, + 0xAF, 0xD7, 0x22, 0xE6, 0x08, 0xE2, 0xBB, 0xF2, 0x14, 0xEC, 0x7B, 0xFF, + 0xDA, 0xFE, 0x6E, 0x18, 0x1C, 0x02, 0xBF, 0x1A, 0xDD, 0x01, 0xAC, 0x1B, + 0x9A, 0x0A, 0x03, 0x22, 0x48, 0x01, 0xFA, 0x0A, 0xB8, 0xEF, 0x47, 0xEB, + 0xFC, 0xE2, 0xC6, 0xD8, 0x30, 0xDA, 0xAA, 0xD1, 0xFF, 0xDB, 0xBC, 0xCE, + 0x27, 0xDC, 0x6C, 0xCA, 0xB8, 0xEA, 0x1A, 0xDA, 0x6A, 0x0E, 0x88, 0x01, + 0x56, 0x30, 0x9A, 0x2B, 0x09, 0x3D, 0x16, 0x43, 0x92, 0x3E, 0xE1, 0x4D, + 0xB9, 0x41, 0x50, 0x59, 0x81, 0x48, 0x5C, 0x5D, 0xD6, 0x4C, 0xCF, 0x57, + 0xB9, 0x41, 0xBB, 0x42, 0xA8, 0x34, 0xB3, 0x2B, 0xC7, 0x2B, 0x0D, 0x17, + 0xFE, 0x29, 0x71, 0x05, 0x02, 0x31, 0xA5, 0x05, 0x9D, 0x33, 0xF6, 0x0E, + 0x2B, 0x2A, 0xED, 0x16, 0x6D, 0x22, 0xDC, 0x20, 0xD1, 0x16, 0x9D, 0x1D, + 0x48, 0x01, 0x42, 0x0C, 0x04, 0xF2, 0x75, 0x02, 0xF9, 0xF1, 0x26, 0x05, + 0x6F, 0xFC, 0xA2, 0x14, 0x5B, 0x06, 0xDC, 0x25, 0x67, 0x19, 0x4E, 0x3B, + 0x37, 0x26, 0xB9, 0x3E, 0x7D, 0x2F, 0xF4, 0x35, 0xD7, 0x3A, 0xCD, 0x37, + 0xA8, 0x40, 0x61, 0x3B, 0xA6, 0x41, 0xEB, 0x33, 0x81, 0x28, 0xAB, 0x10, + 0x6B, 0x10, 0x24, 0xF6, 0xFB, 0x11, 0xE6, 0xF7, 0x00, 0x0A, 0x40, 0xEE, + 0xC0, 0xFC, 0x5D, 0xE5, 0x77, 0xF9, 0xA9, 0xF2, 0xB7, 0xF0, 0x05, 0xF4, + 0x28, 0xF1, 0x01, 0xFD, 0x2C, 0xFB, 0x2B, 0x10, 0x1C, 0xFA, 0x8B, 0x0D, + 0x4A, 0xFD, 0x88, 0x0F, 0xDE, 0x06, 0x66, 0x18, 0x7A, 0xFE, 0xD9, 0x09, + 0x50, 0xEC, 0xEE, 0xEA, 0xCF, 0xE4, 0x3E, 0xE0, 0x94, 0xE2, 0x6F, 0xE7, + 0xEF, 0xDE, 0xF6, 0xE4, 0x5A, 0xE9, 0x13, 0xEC, 0xE7, 0x0E, 0xF9, 0x12, + 0x09, 0x2E, 0xEC, 0x39, 0x69, 0x32, 0xEA, 0x46, 0xB1, 0x3B, 0xD2, 0x4E, + 0xA1, 0x49, 0x90, 0x5A, 0x25, 0x3F, 0x0D, 0x54, 0xA2, 0x21, 0xC6, 0x35, + 0x68, 0x0E, 0x99, 0x1B, 0x6C, 0x03, 0x53, 0x0D, 0x5B, 0xF4, 0x61, 0xFF, + 0x67, 0xEE, 0xD0, 0xF7, 0xC7, 0xFA, 0x4E, 0xFD, 0x49, 0x02, 0xAE, 0x03, + 0x81, 0xF7, 0x90, 0xFD, 0x52, 0xF4, 0xCC, 0x06, 0x97, 0xF4, 0xE7, 0x17, + 0x71, 0xE3, 0xE8, 0x0C, 0xA3, 0xDF, 0x08, 0x03, 0xE7, 0xF4, 0x64, 0x0B, + 0x80, 0xFB, 0x6F, 0x09, 0xFF, 0xF2, 0x4B, 0xFD, 0x15, 0x05, 0x38, 0x0B, + 0xD3, 0x22, 0x64, 0x27, 0x71, 0x1E, 0x95, 0x26, 0x30, 0x1A, 0xB4, 0x1F, + 0xA3, 0x30, 0xB9, 0x34, 0x39, 0x3C, 0x1F, 0x44, 0x63, 0x29, 0xFA, 0x33, + 0x9A, 0x1C, 0x3D, 0x27, 0x0A, 0x1B, 0xD6, 0x26, 0xC5, 0x0C, 0x36, 0x17, + 0x8A, 0x0E, 0xEE, 0x0A, 0xCD, 0x1F, 0xF1, 0x16, 0xD0, 0x1E, 0x3A, 0x1E, + 0x9C, 0x1C, 0x57, 0x20, 0x21, 0x1B, 0x30, 0x25, 0x75, 0x0B, 0x5B, 0x20, + 0xE0, 0xFF, 0x3E, 0x19, 0x93, 0xF2, 0x4D, 0x0C, 0xA2, 0xE6, 0x3D, 0xFC, + 0x75, 0xEA, 0xE2, 0xF2, 0xF6, 0xE5, 0x84, 0xDA, 0xB5, 0xD9, 0x27, 0xC3, + 0x58, 0xDB, 0xCA, 0xC1, 0x95, 0xE6, 0x34, 0xC9, 0xF9, 0xF1, 0xC9, 0xDC, + 0x59, 0xEF, 0x2A, 0xEB, 0xE0, 0xF0, 0x68, 0x00, 0x04, 0x01, 0xB5, 0x1C, + 0x19, 0x0F, 0x6D, 0x27, 0x92, 0x1D, 0xD3, 0x2D, 0x45, 0x19, 0x26, 0x2A, + 0xE3, 0x08, 0x1B, 0x1A, 0xD4, 0xF6, 0xA8, 0xFF, 0x76, 0xDE, 0xF6, 0xE3, + 0x1C, 0xD2, 0xD5, 0xDB, 0xAF, 0xD6, 0x2A, 0xE0, 0xB1, 0xE4, 0xBE, 0xE9, + 0xEE, 0xE3, 0x4C, 0xF2, 0x06, 0xD2, 0x0D, 0xF0, 0x5E, 0xC8, 0xD7, 0xEB, + 0x93, 0xCA, 0xF4, 0xEC, 0x3C, 0xC5, 0x2C, 0xE7, 0xDD, 0xCA, 0x5A, 0xE5, + 0x04, 0xE4, 0x44, 0xEB, 0x18, 0xEC, 0xD5, 0xE9, 0x85, 0xE8, 0x9E, 0xE9, + 0xD9, 0xFC, 0xA9, 0xF8, 0x96, 0x10, 0xA7, 0x06, 0x40, 0x0E, 0x61, 0x0B, + 0x7D, 0x1A, 0x8D, 0x1A, 0x20, 0x35, 0xDC, 0x32, 0xF0, 0x29, 0xC1, 0x35, + 0x90, 0x0E, 0xAD, 0x27, 0x4D, 0x0B, 0x31, 0x1C, 0x94, 0x02, 0x63, 0x0B, + 0xD1, 0xF4, 0x07, 0x04, 0x36, 0xFA, 0x68, 0x04, 0x17, 0x02, 0xA4, 0xFF, + 0xCF, 0x04, 0x87, 0xFF, 0xFB, 0x09, 0x31, 0x04, 0xA4, 0x17, 0x65, 0x0E, + 0x44, 0x1C, 0x6F, 0x11, 0xC2, 0x07, 0x1E, 0x00, 0x89, 0xF3, 0x82, 0xF1, + 0x6E, 0xE8, 0xC4, 0xF1, 0x16, 0xD9, 0xE4, 0xE8, 0xFB, 0xC5, 0x6B, 0xD3, + 0xA1, 0xBC, 0x94, 0xC4, 0xE4, 0xB2, 0x5D, 0xB5, 0xFE, 0xAB, 0xEE, 0xA6, + 0x68, 0xB0, 0xE3, 0xA5, 0x3D, 0xB2, 0xE9, 0xAA, 0xD6, 0xB8, 0x14, 0xB9, + 0xDC, 0xC9, 0xB7, 0xCA, 0x45, 0xE2, 0x87, 0xDC, 0xEA, 0xFB, 0xF1, 0xF7, + 0xE0, 0xFA, 0x78, 0xFB, 0xF9, 0xF2, 0xFE, 0xEF, 0x73, 0xF5, 0xBE, 0xEE, + 0x15, 0xE8, 0xA0, 0xE3, 0xA3, 0xE3, 0x64, 0xDA, 0xA9, 0xDF, 0xAC, 0xD1, + 0x4F, 0xCC, 0xD1, 0xC6, 0x3E, 0xC5, 0x75, 0xC6, 0x18, 0xC6, 0x68, 0xC8, + 0xC1, 0xBD, 0x1B, 0xC9, 0x08, 0xB5, 0x97, 0xCB, 0x35, 0xC3, 0xEE, 0xD5, + 0x6E, 0xD4, 0xA5, 0xE0, 0x03, 0xDE, 0x59, 0xE7, 0x9E, 0xEA, 0xB8, 0xED, + 0x16, 0xFA, 0xE8, 0xF2, 0xBF, 0x03, 0xE5, 0xF5, 0x63, 0x05, 0xF8, 0xF2, + 0xDC, 0x13, 0x9B, 0xFA, 0x95, 0x2A, 0xD1, 0x08, 0x0A, 0x2F, 0x6E, 0x0A, + 0x9A, 0x25, 0xAD, 0x08, 0xB5, 0x12, 0x4E, 0xFC, 0xC1, 0x00, 0xDC, 0xEC, + 0x99, 0xF4, 0xA0, 0xEA, 0x52, 0xE8, 0x30, 0xEE, 0xAC, 0xDE, 0x83, 0xEE, + 0x69, 0xDD, 0xB3, 0xF1, 0x89, 0xEA, 0x9C, 0x01, 0xF7, 0xEA, 0x49, 0x04, + 0xA2, 0xDB, 0x27, 0xF9, 0x36, 0xDE, 0xA6, 0xFB, 0x16, 0xE4, 0xCC, 0xFB, + 0x7A, 0xDF, 0xDE, 0xF0, 0x67, 0xDF, 0x4A, 0xE8, 0xA4, 0xD2, 0x18, 0xD5, + 0x44, 0xBD, 0x7F, 0xC3, 0xF7, 0xB0, 0xC4, 0xB8, 0x43, 0xB2, 0xCB, 0xAE, + 0x0E, 0xC5, 0x14, 0xBD, 0xC8, 0xD1, 0x4E, 0xCA, 0x07, 0xE7, 0xD8, 0xCF, + 0x43, 0x17, 0x9C, 0xE8, 0x4B, 0x32, 0x1E, 0xFC, 0x13, 0x31, 0x7A, 0xFC, + 0xE0, 0x34, 0x46, 0x06, 0x77, 0x2E, 0x10, 0x0E, 0x11, 0x1F, 0xFB, 0x07, + 0xE7, 0x1D, 0x31, 0x06, 0x97, 0x0E, 0xCE, 0xFB, 0x46, 0xEE, 0xEE, 0xE5, + 0xF9, 0xE3, 0xFF, 0xD9, 0x3A, 0xE1, 0x95, 0xD1, 0xB2, 0xD7, 0x65, 0xCD, + 0x72, 0xCF, 0xD5, 0xD0, 0x00, 0xC6, 0x3E, 0xCE, 0x06, 0xC3, 0xC4, 0xCE, + 0x62, 0xC9, 0xCB, 0xD9, 0xD4, 0xD2, 0x2D, 0xEA, 0x3C, 0xD4, 0x71, 0xF0, + 0x1F, 0xD5, 0x8D, 0xEF, 0x58, 0xDF, 0x76, 0xF7, 0x80, 0xEA, 0xAB, 0xFF, + 0xC6, 0xEC, 0x16, 0xFE, 0xD3, 0xF8, 0xAA, 0x04, 0x05, 0x12, 0xFF, 0x15, + 0x74, 0x18, 0xC8, 0x16, 0xC1, 0x11, 0xEE, 0x0E, 0xEA, 0x13, 0x72, 0x07, + 0x20, 0x0F, 0x0C, 0xF6, 0xE8, 0x07, 0x78, 0xEE, 0x39, 0x04, 0x55, 0xEF, + 0xBF, 0x05, 0xB2, 0xF3, 0xFB, 0x12, 0x92, 0x03, 0xA0, 0x1F, 0xE1, 0x11, + 0x19, 0x24, 0x53, 0x1B, 0xA9, 0x21, 0x0A, 0x24, 0x8A, 0x18, 0x77, 0x1F, + 0x5B, 0x10, 0x0C, 0x13, 0x56, 0x11, 0x27, 0x13, 0x25, 0x08, 0xE2, 0x0E, + 0x7A, 0xF5, 0xC1, 0xFB, 0x46, 0xEE, 0xDD, 0xEF, 0xFF, 0xE9, 0xB7, 0xEA, + 0x22, 0xDD, 0x69, 0xDF, 0x61, 0xDE, 0x9E, 0xE4, 0xF4, 0xE8, 0xA0, 0xF6, + 0xD2, 0xFB, 0x67, 0x09, 0xF7, 0x13, 0x52, 0x16, 0xAC, 0x25, 0xAE, 0x19, + 0xB4, 0x38, 0x70, 0x22, 0xF9, 0x3A, 0x33, 0x21, 0x77, 0x39, 0x61, 0x1F, + 0x6C, 0x42, 0x03, 0x26, 0x2E, 0x3C, 0x14, 0x1D, 0x79, 0x31, 0x9D, 0x0D, + 0xE8, 0x33, 0x9C, 0x06, 0x85, 0x2F, 0x3B, 0xFB, 0xBA, 0x1F, 0xDE, 0xEB, + 0xD0, 0x16, 0x8F, 0xE8, 0x70, 0x08, 0x33, 0xE5, 0xE2, 0xEF, 0x6B, 0xDB, + 0xE4, 0xE2, 0xBA, 0xD2, 0x82, 0xDC, 0x5F, 0xC9, 0xCC, 0xD5, 0xFE, 0xCB, + 0xA8, 0xC9, 0xC9, 0xCF, 0x4C, 0xC4, 0x05, 0xD1, 0x44, 0xD2, 0x3F, 0xE1, + 0xBC, 0xDF, 0xEE, 0xED, 0x2B, 0xEC, 0x14, 0xF2, 0x71, 0xFD, 0xFB, 0xFB, + 0x74, 0x0A, 0x7A, 0x07, 0x6C, 0x09, 0x90, 0x08, 0x17, 0x01, 0xA9, 0xFF, + 0xC4, 0xFC, 0x9A, 0xF9, 0x7A, 0xF7, 0x92, 0xF6, 0xAC, 0xEC, 0xF1, 0xE9, + 0x6E, 0xF4, 0x4D, 0xE9, 0xF8, 0xFF, 0x67, 0xF5, 0x5D, 0xFF, 0x39, 0xFD, + 0xC7, 0x09, 0xF2, 0x0F, 0xCB, 0x10, 0x20, 0x23, 0x96, 0x11, 0x1E, 0x2A, + 0xA8, 0x18, 0x73, 0x28, 0x9D, 0x1E, 0xF2, 0x26, 0x55, 0x1C, 0x0B, 0x2A, + 0xBF, 0x16, 0x2D, 0x23, 0x94, 0x17, 0x6D, 0x17, 0x7D, 0x11, 0xE2, 0x0C, + 0x11, 0x09, 0x83, 0x04, 0x51, 0x0C, 0xB0, 0xFF, 0x50, 0x09, 0x8C, 0xFD, + 0x4B, 0x04, 0x9A, 0xFF, 0x80, 0x18, 0x9F, 0x10, 0x9C, 0x33, 0xEB, 0x28, + 0x5B, 0x35, 0x5E, 0x2A, 0xE9, 0x3A, 0x5E, 0x27, 0xF3, 0x43, 0xE5, 0x2B, + 0x37, 0x35, 0x71, 0x23, 0x18, 0x22, 0x63, 0x15, 0xDB, 0x18, 0x97, 0x0D, + 0xED, 0x0D, 0x0E, 0x06, 0xEF, 0x01, 0xB5, 0xFF, 0x27, 0xFE, 0xD6, 0xFE, + 0x2E, 0xF8, 0x9D, 0xFD, 0x98, 0xF2, 0x36, 0xFF, 0xEE, 0xF8, 0x09, 0x06, + 0x38, 0x01, 0xED, 0x04, 0xDA, 0x01, 0x15, 0xF8, 0xD6, 0x06, 0xBE, 0xF2, + 0xC2, 0x08, 0xAF, 0xF9, 0x26, 0xFB, 0xEF, 0xF9, 0x33, 0xF3, 0x7E, 0xF9, + 0x22, 0xF5, 0x79, 0xFE, 0x3F, 0xFC, 0x47, 0x08, 0x58, 0x10, 0x20, 0x1C, + 0x55, 0x18, 0x2D, 0x20, 0x22, 0x1F, 0xEB, 0x23, 0x0B, 0x2F, 0xA2, 0x33, + 0xD5, 0x2C, 0xC8, 0x2C, 0x93, 0x2E, 0x6B, 0x23, 0x8C, 0x37, 0x06, 0x29, + 0x5E, 0x36, 0x3C, 0x2D, 0x07, 0x31, 0x44, 0x2D, 0x2F, 0x31, 0xBC, 0x35, + 0xAE, 0x30, 0xAA, 0x40, 0x5F, 0x23, 0x68, 0x37, 0x8B, 0x1E, 0xDB, 0x2F, + 0x68, 0x2A, 0xFB, 0x36, 0xBD, 0x2C, 0xA4, 0x27, 0xC4, 0x2C, 0x6F, 0x14, + 0xE9, 0x28, 0x54, 0x17, 0x72, 0x14, 0x5B, 0x0F, 0x9E, 0x0E, 0x37, 0x04, + 0x73, 0x0C, 0xF6, 0x04, 0x65, 0xF7, 0xE9, 0xFE, 0x44, 0xED, 0x4B, 0xFD, + 0xD4, 0xF3, 0x7B, 0x0D, 0x27, 0xFA, 0xB6, 0x1B, 0x82, 0x00, 0xDD, 0x1F, + 0xF9, 0x0D, 0xF7, 0x27, 0xFE, 0x1F, 0x90, 0x31, 0xAA, 0x29, 0xFD, 0x2E, + 0xEF, 0x2E, 0x1C, 0x2D, 0x0B, 0x33, 0x51, 0x34, 0x0D, 0x38, 0xF7, 0x40, + 0x16, 0x3A, 0x68, 0x3B, 0x49, 0x3A, 0xB3, 0x29, 0xDD, 0x39, 0xF0, 0x24, + 0xEF, 0x35, 0x02, 0x28, 0x54, 0x3A, 0xFD, 0x34, 0xDF, 0x35, 0x7F, 0x38, + 0x8A, 0x2A, 0xD0, 0x2E, 0x62, 0x24, 0xBA, 0x2A, 0x58, 0x1D, 0x65, 0x27, + 0xFC, 0x16, 0x3A, 0x20, 0xB0, 0x10, 0x79, 0x1B, 0x03, 0x06, 0xF0, 0x10, + 0x5F, 0x01, 0xC0, 0x05, 0x4E, 0x0E, 0x0D, 0x10, 0x7D, 0x17, 0xA6, 0x18, + 0x33, 0x1B, 0x96, 0x17, 0x85, 0x2D, 0x6B, 0x29, 0x31, 0x31, 0x28, 0x2E, + 0x69, 0x21, 0x44, 0x1E, 0xA0, 0x1D, 0x33, 0x1F, 0x5A, 0x19, 0xDC, 0x21, + 0x36, 0x0F, 0x5B, 0x18, 0x95, 0x0B, 0x9D, 0x14, 0x8C, 0x09, 0xCF, 0x14, + 0xA5, 0xFF, 0x34, 0x0E, 0xD3, 0xFB, 0xF1, 0x0F, 0x4A, 0xF5, 0x1B, 0x0D, + 0xFF, 0xF2, 0x6B, 0x0A, 0x10, 0xFF, 0xA7, 0x17, 0x73, 0x0B, 0x9C, 0x21, + 0xAB, 0x0B, 0xA1, 0x1A, 0x8A, 0x00, 0x20, 0x0D, 0xAD, 0xF7, 0xA0, 0xFE, + 0x82, 0xE9, 0xB5, 0xE8, 0x24, 0xDE, 0x77, 0xDE, 0xAC, 0xE2, 0x27, 0xE6, + 0x67, 0xE7, 0x6D, 0xED, 0xA8, 0xE6, 0x98, 0xF0, 0x16, 0xEE, 0xD0, 0xF5, + 0x70, 0xF6, 0xB6, 0xF9, 0xDE, 0x02, 0x8C, 0x01, 0x65, 0x0E, 0x47, 0x0B, + 0xB1, 0x11, 0x58, 0x18, 0x06, 0x17, 0x1E, 0x27, 0x31, 0x12, 0x3F, 0x27, + 0x8E, 0x07, 0x88, 0x21, 0x2F, 0x0C, 0x34, 0x24, 0x36, 0x0F, 0x00, 0x28, + 0xF4, 0x09, 0x40, 0x2B, 0x5D, 0x0D, 0x5C, 0x2F, 0xFC, 0x0A, 0x2E, 0x2D, + 0x0A, 0x08, 0x80, 0x29, 0x4B, 0x13, 0x19, 0x2A, 0xDF, 0x1C, 0xB2, 0x2C, + 0xEC, 0x19, 0xDB, 0x26, 0xC2, 0x1B, 0xDB, 0x23, 0xC2, 0x14, 0x8B, 0x22, + 0x69, 0x0B, 0xC7, 0x1E, 0xEA, 0x12, 0xE1, 0x1D, 0xD3, 0x14, 0x05, 0x19, + 0x7A, 0x16, 0x85, 0x16, 0x34, 0x1D, 0x4A, 0x11, 0x9E, 0x19, 0x65, 0x00, + 0xF7, 0x12, 0x3A, 0xF3, 0xB4, 0x0D, 0xD4, 0xED, 0x65, 0x04, 0xBA, 0xE7, + 0x35, 0xFC, 0xD4, 0xE2, 0x2D, 0xF3, 0xEE, 0xDF, 0xA1, 0xE5, 0xE1, 0xDA, + 0xB5, 0xDD, 0xC2, 0xDC, 0xF5, 0xE2, 0x03, 0xEA, 0x33, 0xE7, 0xBA, 0xED, + 0x51, 0xF2, 0x48, 0xF4, 0x9F, 0xFC, 0xB9, 0x03, 0xCE, 0xF0, 0x1A, 0x01, + 0xFF, 0xEA, 0x41, 0xF8, 0x35, 0xF1, 0xB2, 0xF6, 0x8A, 0xE8, 0x7F, 0xEC, + 0x59, 0xD7, 0xC9, 0xDB, 0xB5, 0xD6, 0x7A, 0xDC, 0x55, 0xD9, 0x58, 0xDE, + 0x7D, 0xD1, 0x24, 0xD8, 0x3E, 0xD8, 0x67, 0xEB, 0xE2, 0xE9, 0x38, 0x02, + 0x6E, 0xF0, 0xB5, 0x02, 0x8C, 0xF9, 0x59, 0x04, 0x6D, 0x0A, 0x82, 0x04, + 0x1B, 0x0D, 0x8E, 0xFA, 0x4D, 0x0A, 0x06, 0xF9, 0xDF, 0x09, 0x90, 0xF8, + 0xF4, 0x01, 0x62, 0xF0, 0x48, 0x04, 0x4A, 0xF4, 0x29, 0x09, 0xE8, 0xF5, + 0xA0, 0x00, 0x1E, 0xEE, 0xA9, 0xF8, 0xCA, 0xED, 0x27, 0xF5, 0x3A, 0xF4, + 0x1E, 0xF6, 0x7C, 0xFB, 0x2A, 0xF8, 0x7D, 0xFC, 0xCF, 0xED, 0x00, 0xF3, + 0x19, 0xDA, 0xFA, 0xE7, 0x25, 0xDE, 0xCD, 0xEE, 0x5E, 0xDF, 0x2F, 0xEF, + 0xE0, 0xCE, 0x86, 0xE3, 0x02, 0xD1, 0x5D, 0xE8, 0xDC, 0xCF, 0x7C, 0xE8, + 0x84, 0xC6, 0x90, 0xDE, 0x57, 0xCA, 0xA6, 0xDD, 0x07, 0xD4, 0xBB, 0xE6, + 0x4E, 0xDE, 0xB2, 0xF0, 0x6D, 0xF2, 0xDC, 0xFF, 0xCA, 0x01, 0xF3, 0x06, + 0x30, 0x08, 0xC6, 0xFE, 0x07, 0x11, 0xEB, 0x01, 0xBF, 0x18, 0x0F, 0x06, + 0xA7, 0x20, 0x79, 0x02, 0x1F, 0x1B, 0x78, 0xFE, 0xFF, 0x15, 0xA6, 0x06, + 0x04, 0x1A, 0x38, 0x12, 0x7A, 0x10, 0xB9, 0x0C, 0x68, 0x10, 0xEB, 0x0D, + 0x3A, 0x19, 0xB1, 0x16, 0xFF, 0x14, 0x74, 0x15, 0x99, 0xFE, 0x7F, 0x05, + 0x7B, 0xEB, 0xB6, 0xF6, 0x70, 0xEC, 0x23, 0xF6, 0x0B, 0xE3, 0xEE, 0xEB, + 0x42, 0xD6, 0xFE, 0xDB, 0xD3, 0xD6, 0x0D, 0xD9, 0xAF, 0xCB, 0xC6, 0xCE, + 0x05, 0xBE, 0xEC, 0xC3, 0x0A, 0xC5, 0x07, 0xCB, 0xB5, 0xCF, 0xB2, 0xD0, + 0x08, 0xD3, 0x2C, 0xCA, 0x2D, 0xDA, 0x7B, 0xC7, 0x3E, 0xE9, 0xBF, 0xD0, + 0xF1, 0xEC, 0x02, 0xD3, 0x3A, 0xEB, 0x77, 0xC8, 0x38, 0xF1, 0xB6, 0xC9, + 0x1E, 0xEB, 0xDF, 0xCD, 0xB5, 0xDF, 0x00, 0xCA, 0xC8, 0xDC, 0x00, 0xCF, + 0xAE, 0xD4, 0x44, 0xD7, 0xC2, 0xCA, 0x52, 0xD6, 0x30, 0xC8, 0x22, 0xD3, + 0x4D, 0xCB, 0xA4, 0xD8, 0x0A, 0xCD, 0x80, 0xDB, 0x72, 0xD3, 0x20, 0xDA, + 0x1F, 0xDC, 0x2C, 0xDD, 0xA9, 0xD2, 0x06, 0xDA, 0x71, 0xCB, 0xF6, 0xD8, + 0xBA, 0xDA, 0x38, 0xE6, 0x73, 0xE7, 0xA3, 0xEF, 0x7B, 0xE7, 0x11, 0xF2, + 0xED, 0xEE, 0x8B, 0xF6, 0x7B, 0xF3, 0x69, 0xF8, 0x52, 0xE9, 0xB4, 0xF6, + 0x32, 0xEA, 0x21, 0xEF, 0x2E, 0xF6, 0x73, 0xE6, 0x63, 0xF7, 0x3F, 0xE3, + 0x36, 0xF9, 0xBC, 0xE1, 0x6D, 0xFC, 0x8F, 0xE2, 0x82, 0xFE, 0x94, 0xEE, + 0x26, 0xFB, 0x79, 0xF9, 0xBB, 0xF6, 0x78, 0xFF, 0x24, 0x04, 0xD6, 0x08, + 0x2B, 0x08, 0x22, 0x09, 0x79, 0x04, 0x6D, 0x04, 0x3B, 0x08, 0xBC, 0xF6, + 0x7C, 0x0A, 0xF9, 0xEC, 0x76, 0x06, 0x2C, 0xE9, 0xEF, 0x01, 0x47, 0xDD, + 0x86, 0x02, 0x69, 0xDC, 0x1F, 0xFC, 0x18, 0xE3, 0xBF, 0xEB, 0x90, 0xDC, + 0x22, 0xDB, 0xB4, 0xD2, 0xA4, 0xCE, 0xF1, 0xCE, 0xF8, 0xCB, 0xF8, 0xCC, + 0x0A, 0xD0, 0xAD, 0xCB, 0xF7, 0xCB, 0xDA, 0xC5, 0x4D, 0xCA, 0x80, 0xC0, + 0x68, 0xCD, 0x72, 0xC2, 0x17, 0xD4, 0xDF, 0xC6, 0xDD, 0xD8, 0xA5, 0xC6, + 0x8E, 0xDC, 0x5C, 0xCB, 0x52, 0xE4, 0x8F, 0xCE, 0x6E, 0xE5, 0xB3, 0xC7, + 0x0A, 0xE6, 0x1A, 0xC7, 0x35, 0xEB, 0x53, 0xCD, 0x1E, 0xE4, 0xBB, 0xCF, + 0x73, 0xE6, 0xB3, 0xD7, 0xB5, 0xF7, 0x98, 0xE4, 0xB1, 0xEF, 0x1C, 0xE5, + 0x84, 0xE0, 0x78, 0xE4, 0xF5, 0xDF, 0x3B, 0xEC, 0x40, 0xE2, 0xD5, 0xF4, + 0x66, 0xE4, 0x56, 0xFA, 0x56, 0xE9, 0x1E, 0xFC, 0xCE, 0xF6, 0x25, 0x03, + 0x83, 0xFD, 0x08, 0x03, 0x22, 0xFF, 0x19, 0xFE, 0x98, 0x09, 0x94, 0x07, + 0xF2, 0x0F, 0xB3, 0x0F, 0x66, 0x0F, 0xAE, 0x0E, 0x44, 0x0E, 0x83, 0x0C, + 0x23, 0x15, 0x62, 0x0B, 0x00, 0x16, 0x37, 0x0C, 0xF1, 0x0C, 0x2D, 0x10, + 0x54, 0x10, 0x06, 0x16, 0xF0, 0x05, 0x42, 0x0F, 0x8C, 0xF8, 0x4A, 0x07, + 0xA0, 0x07, 0xF5, 0x11, 0x08, 0x0C, 0x87, 0x18, 0x69, 0x04, 0xCA, 0x15, + 0x70, 0xFE, 0x65, 0x12, 0xBC, 0xED, 0x41, 0x02, 0x40, 0xE9, 0x76, 0xF2, + 0x6C, 0xEE, 0x95, 0xEB, 0x77, 0xEC, 0x20, 0xE3, 0xFF, 0xEC, 0x2A, 0xDF, + 0xE5, 0xEC, 0x8C, 0xE0, 0x09, 0xF3, 0xEC, 0xE6, 0x5B, 0xFC, 0x60, 0xEF, + 0xC6, 0x04, 0x3A, 0xFA, 0x7A, 0x10, 0x64, 0x04, 0x85, 0x22, 0xCC, 0x09, + 0x8F, 0x2A, 0x14, 0x0A, 0x1D, 0x27, 0x6B, 0x08, 0xC7, 0x25, 0xBE, 0x07, + 0x5D, 0x22, 0x2A, 0x09, 0xA5, 0x1E, 0x8D, 0x0B, 0x84, 0x1F, 0x9B, 0x0E, + 0xFB, 0x22, 0x61, 0x18, 0xBB, 0x24, 0x0F, 0x1B, 0xAA, 0x1D, 0xBE, 0x14, + 0x66, 0x14, 0x8C, 0x0C, 0x99, 0x10, 0xB0, 0x03, 0xC3, 0xFE, 0x8E, 0xFA, + 0xCD, 0xEE, 0x1C, 0xF5, 0x75, 0xEA, 0x80, 0xF1, 0x16, 0xE3, 0xE7, 0xF1, + 0x4B, 0xE8, 0x3E, 0xFB, 0x1F, 0xF3, 0x98, 0x02, 0x32, 0xF0, 0xDF, 0xFF, + 0xE8, 0xE9, 0x9F, 0xFB, 0x0A, 0xE9, 0xA1, 0xFB, 0x95, 0xEE, 0xE3, 0xF8, + 0xAB, 0xFC, 0x8F, 0xF5, 0x1B, 0x07, 0x59, 0xF1, 0x36, 0x0A, 0x9C, 0xEE, + 0xBA, 0x04, 0x11, 0xEB, 0x05, 0x00, 0xBF, 0xEF, 0x57, 0xFD, 0x3D, 0xFA, + 0xC1, 0xF9, 0xC4, 0xFC, 0x71, 0xFA, 0xFD, 0x04, 0xB4, 0xF9, 0x3C, 0x07, + 0x6D, 0x06, 0x8A, 0x06, 0xB0, 0x1A, 0xC2, 0x13, 0x19, 0x1A, 0xC9, 0x13, + 0x44, 0x19, 0x73, 0x13, 0xA1, 0x20, 0x5E, 0x22, 0xEE, 0x27, 0x1E, 0x29, + 0xB8, 0x2A, 0xA6, 0x29, 0xF0, 0x31, 0x63, 0x34, 0x0E, 0x3A, 0xE9, 0x3A, + 0x15, 0x28, 0x4C, 0x2A, 0x67, 0x26, 0xCE, 0x24, 0x64, 0x2E, 0xE7, 0x25, + 0xA1, 0x24, 0xEE, 0x1F, 0x06, 0x20, 0x19, 0x1C, 0xE8, 0x1D, 0xC9, 0x12, + 0xE1, 0x12, 0xD2, 0x07, 0xF1, 0x13, 0xA9, 0x0C, 0x72, 0x1C, 0x83, 0x15, + 0x7B, 0x15, 0xF1, 0x0E, 0x97, 0x0E, 0x24, 0x08, 0x40, 0x17, 0xB3, 0x0E, + 0x89, 0x21, 0x08, 0x1D, 0xCE, 0x22, 0x5B, 0x24, 0xC5, 0x24, 0xAD, 0x2E, + 0xED, 0x2C, 0x68, 0x3D, 0x57, 0x32, 0xBB, 0x38, 0x0D, 0x21, 0x8D, 0x20, + 0xEC, 0x12, 0xDE, 0x12, 0x9E, 0x0C, 0x4A, 0x08, 0xF1, 0xFB, 0x4E, 0xF8, + 0x2C, 0xFC, 0x66, 0xF6, 0x84, 0x06, 0xB6, 0xF6, 0x55, 0x00, 0x89, 0xEF, + 0xDC, 0xFF, 0x89, 0xF1, 0x5E, 0xF9, 0x54, 0xEF, 0xC5, 0xF7, 0x56, 0xF2, + 0xE7, 0x01, 0x4E, 0xFD, 0xEC, 0xFA, 0xA1, 0xFA, 0x18, 0x03, 0x56, 0x04, + 0x86, 0x06, 0x5D, 0xFD, 0xE8, 0xFA, 0xC3, 0xE8, 0xD3, 0xFD, 0xBE, 0xED, + 0x36, 0x01, 0x41, 0xF5, 0xFA, 0x07, 0xB6, 0x01, 0x1B, 0x10, 0x74, 0x12, + 0xCC, 0x17, 0x48, 0x1D, 0x2B, 0x24, 0xA8, 0x29, 0x0F, 0x1F, 0x2C, 0x27, + 0x7D, 0x1D, 0x12, 0x2A, 0xB8, 0x1F, 0x15, 0x3B, 0x33, 0x1A, 0x13, 0x41, + 0xBF, 0x1B, 0x93, 0x46, 0x24, 0x22, 0x19, 0x4E, 0xB8, 0x27, 0xCD, 0x47, + 0xF5, 0x1E, 0xE5, 0x39, 0xCD, 0x19, 0xE5, 0x3B, 0xC9, 0x1A, 0xCA, 0x3C, + 0xC4, 0x10, 0xCE, 0x2F, 0x12, 0x15, 0xF2, 0x2B, 0x52, 0x29, 0x51, 0x2E, + 0x31, 0x2F, 0xC5, 0x23, 0xA3, 0x31, 0x23, 0x19, 0x4C, 0x2B, 0x52, 0x11, + 0x67, 0x23, 0x8A, 0x0C, 0x08, 0x27, 0xD1, 0x09, 0x29, 0x25, 0x1A, 0x01, + 0x77, 0x1F, 0xB5, 0xFD, 0x40, 0x20, 0x9E, 0xFF, 0xBD, 0x1C, 0x49, 0x03, + 0x5F, 0x0E, 0xB7, 0x0A, 0xBA, 0x07, 0x28, 0x12, 0x24, 0x02, 0x67, 0x0F, + 0x27, 0xFD, 0xFC, 0x0F, 0x98, 0xF7, 0xB1, 0x10, 0xBB, 0xE7, 0xE6, 0x06, + 0xDA, 0xE4, 0x4C, 0x06, 0xEA, 0xEB, 0xFA, 0x07, 0x60, 0xE5, 0xD1, 0x00, + 0x41, 0xE7, 0xAA, 0xFE, 0x38, 0xEE, 0x5C, 0x04, 0x97, 0xF1, 0x55, 0x09, + 0xB5, 0x01, 0xB9, 0x0C, 0x6D, 0x17, 0x4C, 0x14, 0x0C, 0x23, 0x48, 0x1B, + 0xB6, 0x31, 0x1E, 0x22, 0xE3, 0x3E, 0x55, 0x22, 0x22, 0x43, 0x9D, 0x1A, + 0xEF, 0x3E, 0xF1, 0x17, 0xE9, 0x34, 0xD8, 0x14, 0x6C, 0x2B, 0x47, 0x10, + 0xA6, 0x1C, 0x54, 0x09, 0x0B, 0x1D, 0x92, 0x0F, 0xBF, 0x22, 0x89, 0x1C, + 0xF5, 0x1C, 0xD9, 0x1D, 0x4A, 0x1A, 0x17, 0x28, 0xF7, 0x10, 0x4D, 0x2D, + 0x30, 0x05, 0x2F, 0x2A, 0x0E, 0x00, 0x50, 0x2A, 0x09, 0xFC, 0x5E, 0x23, + 0x1B, 0xFC, 0x70, 0x23, 0x90, 0xEF, 0x4E, 0x1E, 0x5F, 0xE9, 0x2D, 0x1A, + 0x4C, 0xED, 0x2C, 0x23, 0xB9, 0xEB, 0x1D, 0x1F, 0x34, 0xEC, 0x8A, 0x12, + 0x6B, 0xED, 0x50, 0x05, 0xB6, 0xFD, 0x5F, 0x01, 0xBC, 0x06, 0x5E, 0xFD, + 0x24, 0xFC, 0xE3, 0xF2, 0x3B, 0xFC, 0xB3, 0xF3, 0x4A, 0x01, 0xD8, 0xF6, + 0x18, 0x04, 0xF1, 0xF9, 0x70, 0x0D, 0x99, 0x02, 0x62, 0x18, 0xDD, 0x10, + 0x3D, 0x1D, 0x17, 0x1C, 0x55, 0x20, 0x09, 0x1C, 0x35, 0x29, 0x86, 0x22, + 0xDA, 0x31, 0xE8, 0x2A, 0x1C, 0x3A, 0xC5, 0x28, 0x55, 0x3C, 0xC2, 0x27, + 0xC7, 0x33, 0xB0, 0x25, 0xFE, 0x2B, 0x68, 0x24, 0x1B, 0x25, 0xA6, 0x29, + 0x59, 0x1E, 0xBB, 0x27, 0x52, 0x1D, 0xDF, 0x23, 0xFF, 0x15, 0xB7, 0x20, + 0x24, 0x12, 0xB4, 0x1D, 0x04, 0x11, 0x72, 0x17, 0x35, 0x04, 0xAE, 0x07, + 0x7B, 0x00, 0x4A, 0x01, 0x17, 0xF9, 0x24, 0xFD, 0x43, 0xF0, 0xA6, 0xF2, + 0x6B, 0xFA, 0x56, 0xF5, 0xB3, 0xFB, 0x50, 0xF9, 0x7D, 0xEF, 0xDB, 0xF0, + 0x55, 0xF1, 0xE5, 0xF0, 0x19, 0xFD, 0x32, 0xF8, 0xC2, 0xFF, 0x58, 0xF7, + 0x6C, 0xFB, 0xE1, 0xEF, 0xB9, 0xF7, 0xCA, 0xEA, 0x54, 0xF0, 0xE3, 0xEA, + 0xA4, 0xE4, 0xB2, 0xE6, 0x58, 0xDE, 0x71, 0xE0, 0xF9, 0xD9, 0x65, 0xDB, + 0x80, 0xD7, 0xCE, 0xD6, 0xFF, 0xD6, 0x13, 0xD5, 0x18, 0xDA, 0xE3, 0xD9, + 0xD2, 0xD5, 0xE5, 0xDF, 0x58, 0xC6, 0x72, 0xD9, 0xAE, 0xC9, 0x42, 0xD7, + 0x8F, 0xD5, 0xFD, 0xDE, 0x57, 0xD6, 0xC1, 0xDC, 0x96, 0xE5, 0xEC, 0xDD, + 0x86, 0xEB, 0x8C, 0xD9, 0x28, 0xDF, 0x59, 0xCC, 0xD3, 0xDC, 0x5A, 0xCA, + 0x1D, 0xD9, 0xD0, 0xC8, 0x38, 0xDE, 0x43, 0xD0, 0x0F, 0xE8, 0x43, 0xE1, + 0xFC, 0xF1, 0xD6, 0xF3, 0x92, 0xFA, 0xC6, 0x02, 0xAA, 0xF2, 0x14, 0x05, + 0x58, 0xE8, 0x56, 0x04, 0xAE, 0xEA, 0x2F, 0x06, 0x2F, 0xEB, 0xE1, 0x03, + 0x1C, 0xE7, 0x45, 0x01, 0x10, 0xF1, 0xDB, 0x08, 0x96, 0xF4, 0xF9, 0x0D, + 0xAB, 0xDC, 0xB7, 0x00, 0xC3, 0xDC, 0xB1, 0xFD, 0xEA, 0xEE, 0xBB, 0x07, + 0x0F, 0xE4, 0xD2, 0xFA, 0x31, 0xE3, 0x0C, 0xF5, 0x35, 0xF3, 0x4E, 0x00, + 0x15, 0xFA, 0xC0, 0xF9, 0x20, 0xFA, 0xDC, 0xEA, 0x30, 0xFE, 0x08, 0xE5, + 0xB9, 0x08, 0xA8, 0xE8, 0x8D, 0x05, 0xC1, 0xE6, 0xA2, 0x04, 0x15, 0xE4, + 0x37, 0x0F, 0x57, 0xED, 0x54, 0x04, 0xE6, 0xE2, 0x93, 0xF9, 0x54, 0xD9, + 0x49, 0xF4, 0x81, 0xDA, 0x33, 0xE7, 0x7A, 0xCA, 0xC3, 0xE2, 0x44, 0xC7, + 0x87, 0xDC, 0x78, 0xCF, 0x7C, 0xD5, 0x80, 0xD6, 0x56, 0xCE, 0x08, 0xDE, + 0x22, 0xD2, 0x23, 0xE6, 0xA5, 0xDF, 0xE3, 0xED, 0x91, 0xE0, 0x99, 0xEE, + 0x56, 0xDB, 0xAA, 0xED, 0x4D, 0xDF, 0xF7, 0xF2, 0xB7, 0xE5, 0x20, 0xF9, + 0x67, 0xE8, 0xEF, 0xF6, 0x32, 0xEF, 0x03, 0xF4, 0x8F, 0xF3, 0x12, 0xF6, + 0x87, 0xF5, 0x9D, 0xF8, 0x35, 0xFD, 0x80, 0xFC, 0x5F, 0xFF, 0x72, 0xFA, + 0x17, 0xFD, 0xF5, 0xF0, 0x7F, 0x03, 0x5F, 0xED, 0x73, 0x04, 0x24, 0xE8, + 0xA6, 0x02, 0xE1, 0xE7, 0x26, 0x0A, 0x83, 0xF0, 0x55, 0x0F, 0xCE, 0xF4, + 0x71, 0x12, 0xD2, 0xFD, 0x75, 0x12, 0x46, 0x09, 0xF4, 0x02, 0x3D, 0x05, + 0x23, 0xF5, 0x9C, 0xFB, 0x40, 0xF2, 0x71, 0xFB, 0xCB, 0xE8, 0x75, 0xF8, + 0x53, 0xE2, 0x77, 0xF3, 0xBB, 0xDF, 0xB1, 0xEE, 0x4F, 0xDA, 0xCD, 0xE8, + 0xBE, 0xD9, 0xF5, 0xE5, 0xEA, 0xDA, 0x23, 0xE4, 0xFE, 0xDA, 0x98, 0xE6, + 0xE4, 0xD7, 0x8E, 0xE2, 0xC3, 0xDC, 0x3A, 0xDF, 0x90, 0xE0, 0x76, 0xE0, + 0x3D, 0xD8, 0xEB, 0xD5, 0x5A, 0xD8, 0x1A, 0xD1, 0xF1, 0xD7, 0xBD, 0xD1, + 0xB3, 0xD8, 0x12, 0xD9, 0x4A, 0xDE, 0xC4, 0xE2, 0x63, 0xEB, 0xF1, 0xE6, + 0xA5, 0xFD, 0x72, 0xEE, 0xA4, 0x04, 0xBE, 0xF0, 0xB2, 0x12, 0x17, 0xF4, + 0x51, 0x1C, 0x7A, 0xF5, 0xAD, 0x12, 0x11, 0xEB, 0xEA, 0x0D, 0x04, 0xE5, + 0xCE, 0x0C, 0x25, 0xE4, 0xEF, 0x0B, 0xD7, 0xE2, 0x74, 0x08, 0xD7, 0xE2, + 0xA1, 0x00, 0x38, 0xE9, 0xB2, 0xFC, 0x87, 0xF6, 0x39, 0xF2, 0x24, 0xFB, + 0xFA, 0xEE, 0x2B, 0xF9, 0xB3, 0xEB, 0xC4, 0xEB, 0x49, 0xDF, 0x83, 0xDC, + 0x91, 0xDA, 0xAC, 0xD9, 0x38, 0xD9, 0xD8, 0xD7, 0xD3, 0xD6, 0xE2, 0xD1, + 0x46, 0xD0, 0x3A, 0xCC, 0xF4, 0xD6, 0xB6, 0xD3, 0x41, 0xE5, 0xB5, 0xDB, + 0x57, 0xE0, 0xF7, 0xD7, 0x54, 0xE4, 0xD7, 0xDE, 0xED, 0xEF, 0xC2, 0xE8, + 0x03, 0xE6, 0x4E, 0xE2, 0xA2, 0xDF, 0x7C, 0xDB, 0x03, 0xE7, 0x65, 0xE1, + 0x06, 0xF0, 0x85, 0xEA, 0x9B, 0xF6, 0x47, 0xF1, 0xDC, 0xFA, 0x5D, 0xFC, + 0x02, 0xF1, 0xDB, 0xFF, 0x0C, 0xE9, 0x78, 0x02, 0xF5, 0xEF, 0x11, 0x0D, + 0x28, 0xF0, 0xB3, 0x0B, 0xAC, 0xF4, 0x54, 0x05, 0x64, 0xFF, 0xB1, 0x0A, + 0x79, 0xFE, 0xF8, 0x0B, 0x8B, 0x03, 0x63, 0x0A, 0x39, 0x08, 0x76, 0x0B, + 0xFD, 0x09, 0x76, 0x0B, 0x94, 0x1D, 0x86, 0x14, 0x6F, 0x2C, 0x4B, 0x1A, + 0x9F, 0x29, 0xAA, 0x0F, 0xE1, 0x25, 0xF3, 0x07, 0xE3, 0x22, 0xF7, 0x05, + 0x33, 0x23, 0xA2, 0x08, 0x6D, 0x29, 0x07, 0x11, 0x69, 0x20, 0x87, 0x0A, + 0xAE, 0x0F, 0x0E, 0xFC, 0xFE, 0x03, 0x9D, 0xF1, 0x84, 0x07, 0x3E, 0xF9, + 0xFD, 0x08, 0xE1, 0xFF, 0x6E, 0x04, 0x4C, 0xFE, 0x27, 0x0C, 0x7F, 0x07, + 0x89, 0x0E, 0x96, 0x0E, 0xB5, 0x12, 0x83, 0x19, 0x6F, 0x0E, 0xA7, 0x1B, + 0x2B, 0x04, 0x75, 0x17, 0xCA, 0x08, 0x64, 0x1A, 0x1C, 0x0B, 0x2B, 0x16, + 0x17, 0x08, 0x69, 0x0A, 0x94, 0x04, 0x1F, 0xFA, 0x6D, 0xF8, 0x46, 0xE7, + 0x92, 0xF8, 0xC0, 0xE1, 0x33, 0x03, 0x62, 0xE4, 0xEA, 0xFE, 0x9A, 0xD8, + 0xB3, 0xFA, 0xE7, 0xCB, 0x20, 0x01, 0x53, 0xD5, 0xD2, 0x02, 0x93, 0xE3, + 0x20, 0xF6, 0x5E, 0xE1, 0xDE, 0xF0, 0xA6, 0xDF, 0x47, 0xF6, 0x77, 0xEA, + 0xEB, 0xF2, 0xA1, 0xF3, 0x9B, 0xEE, 0xDB, 0xF4, 0x8F, 0xF0, 0xE3, 0xF5, + 0x8A, 0xF1, 0xB5, 0xFA, 0x55, 0xEE, 0x91, 0xFC, 0xFA, 0xDD, 0xB8, 0xEF, + 0x7E, 0xDB, 0xA9, 0xED, 0xEF, 0xE4, 0xC1, 0xF2, 0x74, 0xEA, 0xDE, 0xF3, + 0xD8, 0xF7, 0x7A, 0x00, 0x1D, 0xFA, 0x8D, 0x04, 0xF7, 0xFB, 0x30, 0x04, + 0x42, 0x08, 0x42, 0x0E, 0x97, 0x08, 0xEE, 0x10, 0x88, 0x04, 0xC3, 0x0D, + 0xA1, 0x0C, 0x12, 0x14, 0xC3, 0x0F, 0x29, 0x1C, 0xB5, 0x0D, 0x98, 0x22, + 0x2B, 0x0F, 0xD9, 0x22, 0xB7, 0x1A, 0xF9, 0x21, 0xB2, 0x22, 0x5F, 0x1F, + 0xB1, 0x1F, 0x4D, 0x17, 0x7F, 0x26, 0xEF, 0x17, 0xFB, 0x27, 0xEA, 0x14, + 0x39, 0x1D, 0x37, 0x0F, 0xCC, 0x18, 0x8A, 0x15, 0xC2, 0x1E, 0x0E, 0x1D, + 0xE9, 0x21, 0x5B, 0x1E, 0x51, 0x1D, 0x8A, 0x15, 0x84, 0x1B, 0x04, 0x12, + 0xBB, 0x04, 0xD8, 0x08, 0x61, 0xF4, 0xD8, 0xFE, 0x42, 0x04, 0x95, 0x04, + 0xB2, 0x02, 0x6F, 0x01, 0xD8, 0xFC, 0xC0, 0xFE, 0x61, 0x08, 0x4C, 0x0B, + 0x1F, 0x16, 0xFE, 0x17, 0x19, 0x13, 0x00, 0x12, 0xB2, 0x0B, 0x24, 0x0D, + 0x40, 0x14, 0x3D, 0x16, 0xA3, 0x18, 0xBE, 0x14, 0x85, 0x19, 0x47, 0x13, + 0x0E, 0x23, 0xC6, 0x1E, 0x95, 0x28, 0x76, 0x1E, 0x59, 0x2C, 0x65, 0x19, + 0xAD, 0x33, 0x1E, 0x19, 0xE7, 0x36, 0x9A, 0x18, 0xDC, 0x34, 0xE0, 0x1A, + 0x12, 0x35, 0xFD, 0x1D, 0x18, 0x3C, 0xEF, 0x22, 0xE2, 0x2E, 0xC6, 0x20, + 0x1E, 0x18, 0x9E, 0x21, 0xEA, 0x0D, 0xA9, 0x24, 0x27, 0x0B, 0x21, 0x20, + 0xCD, 0x13, 0x08, 0x26, 0x09, 0x10, 0xF4, 0x21, 0xE4, 0xFC, 0x70, 0x0E, + 0xA3, 0xF6, 0x30, 0x05, 0x6F, 0xF1, 0x31, 0xF8, 0x73, 0xF3, 0x26, 0xF6, + 0xAA, 0xFD, 0xC2, 0x01, 0x89, 0xFA, 0x49, 0x03, 0x3F, 0xF6, 0xA6, 0x00, + 0xCD, 0xF0, 0xBE, 0xFB, 0x18, 0xED, 0x31, 0xFA, 0x08, 0xFC, 0x6E, 0x06, + 0x2F, 0x06, 0x4C, 0x0E, 0xB3, 0xFE, 0x1C, 0x0B, 0x4A, 0xFA, 0x0F, 0x0A, + 0xF8, 0xF8, 0xFB, 0x04, 0x53, 0x00, 0x7E, 0x07, 0x76, 0x0C, 0x8A, 0x17, + 0x6C, 0x06, 0x18, 0x1A, 0xBC, 0x02, 0x95, 0x15, 0xB1, 0x14, 0x37, 0x21, + 0xD0, 0x1C, 0x80, 0x26, 0xAD, 0x19, 0x71, 0x24, 0x04, 0x1F, 0x80, 0x2C, + 0x60, 0x21, 0x7D, 0x30, 0xF4, 0x27, 0xC6, 0x2E, 0xED, 0x31, 0x83, 0x32, + 0x3E, 0x28, 0xFC, 0x2C, 0x06, 0x17, 0x1C, 0x18, 0x9F, 0x1E, 0xED, 0x17, + 0x36, 0x2E, 0x6A, 0x28, 0x3D, 0x2A, 0xD2, 0x25, 0x32, 0x26, 0xF3, 0x1C, + 0x68, 0x20, 0xF5, 0x12, 0x7E, 0x18, 0x23, 0x0B, 0x65, 0x1D, 0xBE, 0x13, + 0x01, 0x1D, 0x70, 0x16, 0xD7, 0x11, 0xBA, 0x11, 0xEA, 0x08, 0x3E, 0x0F, + 0xD4, 0x03, 0xEB, 0x0D, 0x5E, 0x05, 0x82, 0x13, 0x71, 0x07, 0xB0, 0x16, + 0x84, 0x05, 0x37, 0x0E, 0xDB, 0x05, 0x0F, 0x08, 0x32, 0x00, 0x45, 0xFF, + 0x41, 0x04, 0xAD, 0xFF, 0x4C, 0x17, 0xB2, 0x11, 0x67, 0x0E, 0x4F, 0x0F, + 0x1B, 0xFE, 0x2F, 0x0A, 0x84, 0x04, 0x58, 0x15, 0xCC, 0x09, 0x1B, 0x1B, + 0x36, 0x0B, 0xA0, 0x1D, 0x3E, 0x0E, 0xB5, 0x1C, 0x05, 0x10, 0xC8, 0x15, + 0x71, 0x0B, 0xBC, 0x13, 0x51, 0x07, 0xD1, 0x14, 0x6F, 0x0A, 0x7E, 0x15, + 0xD6, 0x06, 0x6F, 0x12, 0x93, 0x05, 0x99, 0x14, 0xFE, 0x0C, 0x74, 0x1E, + 0x7C, 0x0B, 0xAC, 0x25, 0x71, 0x02, 0xF8, 0x21, 0x09, 0xF5, 0x5F, 0x0D, + 0xBF, 0xF8, 0x59, 0x08, 0x27, 0x03, 0x3E, 0x0C, 0xDA, 0xFE, 0xAF, 0x03, + 0x34, 0x05, 0x33, 0x09, 0xF6, 0x13, 0xDF, 0x1B, 0x97, 0x11, 0x98, 0x20, + 0x80, 0x10, 0xDC, 0x20, 0xD4, 0x1D, 0xA4, 0x25, 0xE1, 0x1B, 0xB7, 0x1E, + 0x34, 0x12, 0x54, 0x13, 0x35, 0x10, 0x1F, 0x0B, 0xBC, 0x0B, 0x90, 0x04, + 0x5D, 0x0C, 0x73, 0x08, 0x16, 0x1B, 0x38, 0x18, 0xDB, 0x1D, 0xD0, 0x1D, + 0x3A, 0x19, 0xBD, 0x1E, 0x00, 0x17, 0xE4, 0x1C, 0x5F, 0x13, 0xF2, 0x19, + 0x97, 0x11, 0xBB, 0x1A, 0xC4, 0x0D, 0x11, 0x13, 0x0E, 0x14, 0x02, 0x0D, + 0x9E, 0x21, 0x9C, 0x12, 0x81, 0x1C, 0xD7, 0x0D, 0xDA, 0x0C, 0x7E, 0x02, + 0x02, 0x01, 0x6A, 0x02, 0x74, 0xE8, 0xB8, 0xF9, 0x74, 0xDC, 0xDB, 0xF0, + 0xC0, 0xE4, 0x87, 0xEF, 0xA1, 0xE3, 0x44, 0xE6, 0x41, 0xDE, 0xDE, 0xDE, + 0x91, 0xDB, 0xB7, 0xE0, 0x9A, 0xDB, 0x2A, 0xE3, 0x41, 0xE1, 0x5A, 0xE2, + 0x8E, 0xF0, 0x24, 0xE7, 0x04, 0xFE, 0x3B, 0xF1, 0x62, 0x01, 0x4F, 0xF9, + 0x9A, 0xFA, 0xB3, 0xFB, 0x7D, 0xF4, 0x09, 0xFB, 0x04, 0xFD, 0x35, 0x07, + 0xE0, 0xFF, 0x2E, 0x0B, 0x2C, 0x01, 0x10, 0x02, 0x54, 0x11, 0xE0, 0x05, + 0x23, 0x0F, 0xFF, 0x04, 0x92, 0x07, 0x18, 0x00, 0x6B, 0x04, 0x43, 0xF9, + 0xEC, 0xF3, 0x25, 0xE6, 0x05, 0xF2, 0x15, 0xE0, 0x8C, 0xF8, 0xF7, 0xE6, + 0x32, 0xF0, 0xB7, 0xE8, 0x32, 0xE2, 0xA6, 0xE7, 0x2E, 0xDB, 0x3B, 0xEA, + 0xA7, 0xDE, 0x5E, 0xF7, 0x6D, 0xDF, 0x3A, 0x01, 0x78, 0xD9, 0x74, 0x00, + 0xF2, 0xD7, 0x44, 0xFD, 0x2A, 0xDA, 0xB2, 0xFC, 0x07, 0xDC, 0x79, 0xFA, + 0x54, 0xDB, 0x11, 0xED, 0xCD, 0xE4, 0xC4, 0xE3, 0x95, 0xEC, 0x7C, 0xDF, + 0xAC, 0xE9, 0x01, 0xD7, 0x3A, 0xEF, 0x20, 0xDA, 0x36, 0xF2, 0x07, 0xE3, + 0x4B, 0xF1, 0x5E, 0xE8, 0xD6, 0xF9, 0xDE, 0xEE, 0x43, 0x07, 0x9E, 0xF7, + 0xE9, 0x05, 0x07, 0xF6, 0x64, 0xFD, 0xE0, 0xF2, 0x87, 0x02, 0xA8, 0x00, + 0xA8, 0x00, 0xCA, 0x07, 0xFB, 0xFA, 0xCF, 0x09, 0xDF, 0x02, 0x3B, 0x14, + 0x03, 0x09, 0x4D, 0x18, 0x0F, 0x11, 0x76, 0x1A, 0x85, 0x1F, 0xD7, 0x21, + 0x15, 0x1E, 0xB6, 0x1D, 0x2B, 0x16, 0xD8, 0x10, 0xDE, 0x15, 0xE3, 0x07, + 0xBC, 0x19, 0x33, 0x02, 0x64, 0x19, 0x8E, 0xF5, 0xCA, 0x0E, 0xC6, 0xE4, + 0xDC, 0x04, 0xE9, 0xE4, 0x91, 0xFB, 0x6B, 0xEA, 0xB8, 0xEA, 0x0A, 0xE5, + 0xBE, 0xE1, 0x42, 0xE6, 0x1C, 0xEB, 0x11, 0xF5, 0xA2, 0xEC, 0xB2, 0xF9, + 0xFF, 0xDA, 0x15, 0xEF, 0x18, 0xD0, 0x9B, 0xE6, 0x50, 0xCE, 0xB3, 0xDE, + 0x19, 0xCD, 0xC3, 0xD4, 0x67, 0xCD, 0x8D, 0xC7, 0x5C, 0xC8, 0xF3, 0xBC, + 0x79, 0xC7, 0x46, 0xC0, 0xE0, 0xCE, 0x5C, 0xC7, 0x45, 0xD3, 0x06, 0xCC, + 0x2A, 0xC7, 0x59, 0xC9, 0x03, 0xC2, 0x8B, 0xC9, 0x2A, 0xCE, 0x80, 0xD3, + 0x72, 0xD1, 0xB4, 0xD3, 0x6E, 0xCB, 0xF5, 0xCE, 0xE3, 0xD4, 0x78, 0xDA, + 0xE0, 0xD6, 0xB4, 0xDE, 0x44, 0xD5, 0xD0, 0xDF, 0x67, 0xE0, 0xEF, 0xE9, + 0xE4, 0xE0, 0x69, 0xE7, 0xA9, 0xDC, 0xA8, 0xDF, 0x73, 0xDF, 0xD1, 0xDC, + 0xD3, 0xE7, 0x17, 0xE1, 0x6E, 0xE9, 0x26, 0xE3, 0xBD, 0xEF, 0xED, 0xE4, + 0xAE, 0x05, 0x98, 0xF0, 0x00, 0x1A, 0xA0, 0x03, 0x63, 0x13, 0xD7, 0x08, + 0xBA, 0x06, 0x7A, 0x06, 0x9D, 0x03, 0xDC, 0x04, 0x68, 0xFD, 0xED, 0xF9, + 0xF2, 0xF6, 0x23, 0xF6, 0xED, 0xE5, 0x66, 0xEF, 0x30, 0xDC, 0xF6, 0xE8, + 0x90, 0xDA, 0xAE, 0xE8, 0x6E, 0xD3, 0xB3, 0xE4, 0xF0, 0xD7, 0x0D, 0xE9, + 0x9F, 0xDA, 0x5F, 0xEA, 0x4F, 0xDF, 0x94, 0xE7, 0x8A, 0xEA, 0xA3, 0xE2, + 0x7A, 0xF5, 0x9D, 0xE2, 0x62, 0xFD, 0x64, 0xEB, 0x98, 0xF5, 0xA7, 0xE8, + 0xC1, 0xF5, 0xE7, 0xE3, 0xF0, 0xFD, 0x72, 0xE5, 0x7F, 0xFD, 0x4A, 0xE8, + 0xA6, 0xFC, 0x5E, 0xE7, 0xA4, 0x02, 0xE5, 0xE5, 0x5D, 0x05, 0x23, 0xE9, + 0x0A, 0xFE, 0xA9, 0xE4, 0xC7, 0xFF, 0x14, 0xDE, 0xDE, 0xFB, 0xDD, 0xD5, + 0x1B, 0xEE, 0x6E, 0xD0, 0x03, 0xF1, 0x13, 0xDB, 0x16, 0xF2, 0x01, 0xDF, + 0xA4, 0xEB, 0xE5, 0xD9, 0x6D, 0xEE, 0x06, 0xE2, 0x56, 0xEA, 0xB9, 0xEE, + 0x71, 0xD7, 0x87, 0xE8, 0xF9, 0xD1, 0x63, 0xE4, 0xA9, 0xDA, 0xA5, 0xEA, + 0xE6, 0xDE, 0xA9, 0xEB, 0xD3, 0xE7, 0xCF, 0xF3, 0x5A, 0xF5, 0x52, 0x00, + 0x41, 0xF7, 0x6D, 0xFD, 0xDB, 0xFA, 0x71, 0xFC, 0xDD, 0x04, 0x7A, 0x03, + 0xFA, 0x03, 0xF0, 0x00, 0x29, 0x01, 0x0E, 0xFA, 0x90, 0x01, 0x7A, 0xF5, + 0xA4, 0xFD, 0x2E, 0xF4, 0x01, 0x02, 0x4E, 0xFA, 0x04, 0x04, 0x1E, 0xF8, + 0x45, 0x03, 0x25, 0xF4, 0xE1, 0x08, 0x43, 0xF9, 0x34, 0x05, 0xFF, 0xF3, + 0x6A, 0x0F, 0xC2, 0xFB, 0x72, 0x19, 0x95, 0x04, 0x51, 0x08, 0x4C, 0xF7, + 0x5D, 0xFC, 0xFC, 0xF4, 0x66, 0xF7, 0xB7, 0xF4, 0x99, 0xEC, 0x65, 0xE9, + 0x11, 0xE7, 0x20, 0xE8, 0x94, 0xE5, 0x37, 0xE9, 0x55, 0xE3, 0x33, 0xE7, + 0xA2, 0xE0, 0xA0, 0xE9, 0x3E, 0xE9, 0xF9, 0xF1, 0xF3, 0xF4, 0xCF, 0xFC, + 0xF5, 0xEE, 0xD5, 0xFA, 0x76, 0xE7, 0xC3, 0xF2, 0x70, 0xEE, 0xE0, 0xF2, + 0xE7, 0xFB, 0x53, 0xF9, 0x85, 0xFF, 0x96, 0xFC, 0xE4, 0x02, 0xF4, 0x05, + 0x7F, 0x09, 0xCD, 0x13, 0x0F, 0x07, 0xFD, 0x19, 0x94, 0x15, 0xC8, 0x28, + 0x1B, 0x2C, 0x00, 0x33, 0x62, 0x24, 0x60, 0x1F, 0xA2, 0x20, 0x2F, 0x11, + 0xAD, 0x2F, 0x33, 0x12, 0x87, 0x37, 0x9D, 0x0D, 0x2D, 0x33, 0xD7, 0x08, + 0x3C, 0x27, 0x7D, 0x07, 0xB9, 0x20, 0x9D, 0x0D, 0x1A, 0x1E, 0xC0, 0x11, + 0x8C, 0x1C, 0xD0, 0x13, 0xAE, 0x19, 0x56, 0x1A, 0x71, 0x0E, 0x36, 0x16, + 0x96, 0x0C, 0x1C, 0x0F, 0xAD, 0x0D, 0xF6, 0x07, 0x5C, 0x05, 0x7C, 0xFD, + 0x28, 0x00, 0xE0, 0xFD, 0xDC, 0xF8, 0xA3, 0xFD, 0x97, 0xF0, 0xBE, 0xF8, + 0x0D, 0xEF, 0x38, 0xFE, 0x53, 0xF0, 0x00, 0x02, 0x08, 0xF0, 0x9F, 0xFC, + 0xE6, 0xE7, 0x2C, 0xF1, 0x05, 0xE7, 0x1A, 0xED, 0x1B, 0xEA, 0x21, 0xED, + 0xE8, 0xE4, 0xC1, 0xE8, 0x46, 0xF0, 0x8A, 0xF3, 0xF1, 0xFF, 0xDF, 0xFE, + 0xC5, 0x03, 0x25, 0xFE, 0x15, 0x00, 0xFC, 0xFE, 0xFE, 0xFA, 0xBE, 0x03, + 0x38, 0xF8, 0xAE, 0x04, 0x70, 0xF9, 0xCD, 0x05, 0xE3, 0xFF, 0x05, 0x0A, + 0xDA, 0x09, 0x8C, 0x0A, 0xC1, 0x1A, 0x65, 0x0F, 0xEF, 0x1D, 0xAF, 0x11, + 0x63, 0x26, 0x4D, 0x20, 0xE7, 0x2F, 0x46, 0x2B, 0xE6, 0x2D, 0xA9, 0x27, + 0xE4, 0x34, 0xE0, 0x2D, 0x85, 0x3E, 0x7A, 0x39, 0x41, 0x3A, 0xA8, 0x39, + 0x88, 0x35, 0xA0, 0x34, 0xD7, 0x30, 0x8E, 0x31, 0x1A, 0x30, 0x97, 0x34, + 0x34, 0x2C, 0xF3, 0x2F, 0xB7, 0x1F, 0xB8, 0x1C, 0x4C, 0x1B, 0x41, 0x0B, + 0x78, 0x14, 0xFD, 0xFD, 0x41, 0x0F, 0xDC, 0xFE, 0x64, 0x11, 0x4D, 0x04, + 0xBA, 0x0B, 0x7A, 0xFF, 0x61, 0x04, 0x77, 0xFD, 0x96, 0x00, 0xFB, 0x00, + 0xA7, 0xFD, 0x2E, 0x04, 0xD4, 0xFC, 0x20, 0x09, 0x7C, 0xF0, 0x23, 0x03, + 0xAC, 0xEE, 0xB2, 0x01, 0x5F, 0xF9, 0xBD, 0x06, 0xAF, 0xFA, 0x4C, 0x00, + 0x46, 0x06, 0xA7, 0xFF, 0x60, 0x13, 0xB0, 0x00, 0x9C, 0x0D, 0x83, 0xF5, + 0xC6, 0x0D, 0xE5, 0xF3, 0x5D, 0x1B, 0x6F, 0xFF, 0xD3, 0x1C, 0xCF, 0x01, + 0x67, 0x18, 0x3D, 0x01, 0xA6, 0x1C, 0xCF, 0x05, 0x76, 0x1F, 0x59, 0x0B, + 0xFB, 0x19, 0x55, 0x0D, 0xAE, 0x18, 0x80, 0x11, 0x86, 0x1A, 0x40, 0x19, + 0x71, 0x17, 0x73, 0x17, 0xFD, 0x10, 0x4C, 0x11, 0xBE, 0x05, 0xBF, 0x14, + 0x4A, 0xFD, 0x1A, 0x1F, 0xA8, 0xF2, 0x1D, 0x1B, 0x44, 0xF1, 0x3E, 0x14, + 0x58, 0xFC, 0x91, 0x16, 0xF7, 0x02, 0xBE, 0x17, 0xE0, 0xFC, 0x17, 0x0C, + 0x97, 0xF7, 0x8E, 0x02, 0xFE, 0xFD, 0x56, 0x08, 0x3B, 0x01, 0xCA, 0x07, + 0xD5, 0x03, 0x0A, 0x06, 0x4D, 0x0D, 0xC0, 0x0F, 0x64, 0x10, 0x4E, 0x15, + 0xCE, 0x11, 0x52, 0x1A, 0x95, 0x0F, 0xFC, 0x20, 0x12, 0x08, 0x1F, 0x21, + 0x01, 0x05, 0x93, 0x19, 0x5F, 0x09, 0xBD, 0x11, 0xD0, 0x0B, 0xCB, 0x0A, + 0xBC, 0x0F, 0x2C, 0x0C, 0xFE, 0x11, 0xA3, 0x0E, 0x28, 0x11, 0x38, 0x0A, + 0xD7, 0x17, 0x1A, 0x0D, 0x0E, 0x1E, 0x74, 0x0D, 0x0F, 0x1D, 0x9B, 0x05, + 0xB8, 0x14, 0xF3, 0x02, 0x4C, 0x17, 0x0D, 0x0F, 0x81, 0x18, 0xAD, 0x12, + 0x58, 0x0B, 0xF6, 0x09, 0x93, 0x04, 0xC2, 0x08, 0x21, 0xFD, 0x4F, 0x00, + 0xA3, 0xF9, 0xFD, 0xFC, 0x1F, 0xFB, 0x57, 0x05, 0xD3, 0xF9, 0x4C, 0x08, + 0xE4, 0x01, 0x03, 0x0E, 0xC2, 0x06, 0xCB, 0x13, 0xE4, 0x08, 0xD0, 0x17, + 0x69, 0x0E, 0xB3, 0x18, 0xDE, 0x12, 0xB8, 0x18, 0x6F, 0x15, 0x9A, 0x1C, + 0x6F, 0x19, 0x00, 0x25, 0x6E, 0x14, 0x1C, 0x28, 0xED, 0x0A, 0xCA, 0x23, + 0xE6, 0x12, 0x2E, 0x21, 0x9C, 0x24, 0x7B, 0x26, 0xAC, 0x2C, 0xF9, 0x2F, + 0x3C, 0x24, 0x40, 0x2A, 0x07, 0x1F, 0x3D, 0x22, 0x6B, 0x1C, 0x14, 0x1C, + 0xCC, 0x11, 0x8B, 0x10, 0x94, 0x0A, 0x3E, 0x11, 0x3A, 0x0F, 0xDD, 0x1C, + 0x30, 0x0B, 0x70, 0x17, 0x4D, 0xFB, 0x2C, 0x05, 0x31, 0xF8, 0xFF, 0x00, + 0x1A, 0xF6, 0x9C, 0xFE, 0xA6, 0xE8, 0x51, 0xEE, 0xAF, 0xE4, 0xCA, 0xE3, + 0xF7, 0xF6, 0x29, 0xF5, 0x68, 0xFA, 0xCC, 0x00, 0x44, 0xEB, 0xF2, 0xFA, + 0x3E, 0xEB, 0x67, 0xFC, 0xC9, 0xF5, 0xDD, 0x01, 0x28, 0xFB, 0x6F, 0x04, + 0x6C, 0xFD, 0x09, 0x04, 0x9D, 0x04, 0x42, 0x04, 0xBA, 0x0B, 0x39, 0x06, + 0x65, 0x0D, 0x82, 0x09, 0x34, 0x0F, 0x0D, 0x0D, 0x1E, 0x11, 0xBF, 0x11, + 0x81, 0x0E, 0xAD, 0x18, 0x2C, 0x08, 0x8C, 0x1C, 0x44, 0x0A, 0x4E, 0x26, + 0xCB, 0x08, 0xF5, 0x26, 0xFC, 0x0A, 0x43, 0x22, 0xE9, 0x17, 0xC6, 0x2A, + 0xCD, 0x10, 0xAB, 0x20, 0x00, 0x14, 0x9F, 0x1B, 0xCB, 0x20, 0x37, 0x21, + 0x4E, 0x23, 0x7B, 0x1A, 0xD4, 0x24, 0xB2, 0x13, 0x69, 0x28, 0xD3, 0x16, + 0xCC, 0x31, 0x9D, 0x21, 0x31, 0x30, 0x3E, 0x1F, 0x66, 0x28, 0x70, 0x14, + 0x6B, 0x27, 0x61, 0x15, 0x9F, 0x1E, 0xEB, 0x14, 0x67, 0x0B, 0xDA, 0x03, + 0xB3, 0xFB, 0x3A, 0xF7, 0xD0, 0xFA, 0xFC, 0xFE, 0x5B, 0xF6, 0x76, 0xFB, + 0xCE, 0xED, 0xB9, 0xF2, 0x28, 0xEB, 0x11, 0xF5, 0x49, 0xE9, 0xEA, 0xEF, + 0xA6, 0xE5, 0xA4, 0xE3, 0x28, 0xDD, 0xB0, 0xDA, 0xE3, 0xDB, 0x47, 0xDD, + 0xA8, 0xDA, 0x54, 0xE0, 0xC0, 0xD8, 0x74, 0xE3, 0xDF, 0xDD, 0xFC, 0xE9, + 0x09, 0xE7, 0xC3, 0xF3, 0x12, 0xEF, 0xA8, 0xFC, 0x22, 0xF4, 0xB3, 0xFF, + 0x2D, 0xF7, 0xF2, 0x02, 0x1C, 0xF6, 0xA1, 0xFE, 0xD3, 0xFD, 0x05, 0xFF, + 0xEE, 0xFF, 0x00, 0x04, 0x22, 0xFA, 0xE1, 0x04, 0x17, 0xFF, 0x8C, 0x08, + 0x2A, 0xFC, 0x21, 0x03, 0x36, 0xF9, 0xE2, 0x00, 0x52, 0x02, 0xF2, 0x09, + 0xB3, 0x0C, 0x43, 0x10, 0x27, 0x0C, 0x00, 0x09, 0x3A, 0x07, 0x76, 0xFB, + 0x97, 0x0D, 0x34, 0xFB, 0x5E, 0x02, 0x35, 0xF6, 0x90, 0xF4, 0x15, 0xF6, + 0xCD, 0xF5, 0x0A, 0xFF, 0x07, 0xF2, 0x30, 0x01, 0x59, 0xE9, 0xA3, 0x00, + 0x57, 0xE3, 0x71, 0xFF, 0x32, 0xE3, 0xF6, 0xFC, 0x83, 0xE0, 0xAF, 0xF0, + 0x85, 0xDF, 0xC3, 0xE5, 0x30, 0xE0, 0x76, 0xE1, 0xF1, 0xE0, 0xA9, 0xDF, + 0x9B, 0xDD, 0xA9, 0xDC, 0xB7, 0xDD, 0xE2, 0xDE, 0xEE, 0xEC, 0x9F, 0xED, + 0x54, 0xF6, 0xEC, 0xF6, 0xD3, 0xF3, 0xA1, 0xF5, 0xD1, 0xF6, 0xD2, 0xF5, + 0xA5, 0x00, 0x15, 0xFA, 0xB4, 0x02, 0xD0, 0xF6, 0xF9, 0x04, 0x69, 0xF3, + 0xCA, 0x0A, 0x5E, 0xF5, 0xA9, 0x09, 0xEC, 0xF3, 0x84, 0x04, 0x8F, 0xF1, + 0x30, 0x00, 0x8F, 0xF2, 0x69, 0x02, 0xD0, 0xF8, 0xAA, 0x01, 0x35, 0xF8, + 0x30, 0xFA, 0x63, 0xEF, 0x9F, 0x01, 0x11, 0xF4, 0x44, 0x03, 0xBF, 0xF6, + 0x45, 0xF6, 0xA3, 0xF4, 0xAE, 0xF3, 0x9D, 0xFA, 0xF4, 0xF4, 0x8F, 0xF7, + 0x8A, 0xF5, 0xC9, 0xF2, 0x08, 0xF5, 0x63, 0xF5, 0xB1, 0xEE, 0x10, 0xF6, + 0xB0, 0xE3, 0x4F, 0xEF, 0x60, 0xDE, 0x71, 0xE9, 0x4D, 0xE2, 0x53, 0xEA, + 0x31, 0xE5, 0xAD, 0xEA, 0xBA, 0xEA, 0xBE, 0xEE, 0x0A, 0xF6, 0xE5, 0xF7, + 0xF0, 0x00, 0x81, 0x00, 0x4B, 0x00, 0x70, 0x00, 0xF0, 0xF9, 0x41, 0xFB, + 0x69, 0xFB, 0x47, 0xF8, 0xE7, 0xF9, 0x5B, 0xEC, 0x86, 0xF3, 0x96, 0xDF, + 0x12, 0xF5, 0x0B, 0xE7, 0x6E, 0xEF, 0x8E, 0xEB, 0xFF, 0xE4, 0x7C, 0xE7, + 0x01, 0xE4, 0xE3, 0xEC, 0xD4, 0xDB, 0x13, 0xEB, 0x31, 0xD5, 0x6C, 0xE3, + 0x25, 0xE2, 0x11, 0xEA, 0x6F, 0xE4, 0x71, 0xEC, 0x99, 0xD7, 0xDE, 0xE4, + 0x39, 0xD2, 0x75, 0xDF, 0xED, 0xD2, 0xDE, 0xD9, 0xB4, 0xDE, 0xB3, 0xD7, + 0x80, 0xEC, 0x46, 0xD4, 0xEC, 0xEE, 0xED, 0xD0, 0xF4, 0xEB, 0xAF, 0xD0, + 0x35, 0xE8, 0xF3, 0xCF, 0xCE, 0xEA, 0x12, 0xD6, 0x2B, 0xFF, 0x78, 0xEA, + 0x4F, 0x0A, 0xA3, 0xF5, 0x08, 0x05, 0x93, 0xF3, 0xDD, 0x0B, 0x59, 0xFC, + 0x08, 0x0E, 0x6D, 0x05, 0x41, 0x08, 0x20, 0x08, 0xBC, 0x0D, 0x46, 0x0C, + 0xAA, 0x0B, 0xB3, 0x09, 0x50, 0x06, 0xA8, 0x0A, 0x9C, 0x0D, 0x6E, 0x14, + 0xA3, 0x0D, 0x64, 0x11, 0xF9, 0x08, 0xA2, 0x06, 0x18, 0x08, 0x70, 0xFE, + 0x03, 0x04, 0x5F, 0xF8, 0x5A, 0xFF, 0xD9, 0xF6, 0x29, 0xFB, 0xD1, 0xF6, + 0x42, 0xFD, 0xFA, 0xFB, 0xBB, 0x04, 0x0C, 0x02, 0x47, 0x06, 0x97, 0x01, + 0x6C, 0xFD, 0x7B, 0xF9, 0x25, 0xF4, 0x49, 0xEF, 0x7E, 0xEE, 0x91, 0xEB, + 0x2F, 0xE4, 0x4F, 0xE8, 0x8E, 0xD8, 0xD8, 0xE1, 0x56, 0xCD, 0x55, 0xDB, + 0x10, 0xCD, 0x2A, 0xDB, 0xA1, 0xD2, 0x18, 0xD7, 0x07, 0xD7, 0xB2, 0xD0, + 0xA8, 0xDE, 0x3B, 0xD2, 0xAF, 0xDE, 0xFA, 0xD4, 0xC7, 0xD4, 0xE7, 0xD2, + 0xA7, 0xD6, 0xB8, 0xD3, 0x35, 0xE6, 0xC6, 0xDE, 0x8D, 0xEA, 0x21, 0xE0, + 0x9F, 0xEF, 0x7F, 0xDD, 0x0D, 0xF7, 0x85, 0xE3, 0x74, 0xF6, 0xB4, 0xE8, + 0x89, 0xF4, 0xA4, 0xE6, 0x36, 0xF3, 0xEE, 0xE2, 0x7B, 0xFA, 0x3E, 0xE8, + 0xD7, 0x07, 0xF4, 0xF1, 0xE5, 0x11, 0xF0, 0xFB, 0x2E, 0x17, 0x05, 0x04, + 0x86, 0x16, 0x85, 0x0A, 0xB4, 0x0D, 0xBC, 0x0D, 0x63, 0x0A, 0xF6, 0x10, + 0x80, 0x0D, 0xAA, 0x13, 0x8A, 0x0A, 0xA5, 0x0C, 0xAC, 0x13, 0xF0, 0x0C, + 0xCC, 0x12, 0x52, 0x0A, 0x5D, 0x00, 0x08, 0x00, 0x2A, 0xFF, 0x27, 0xFE, + 0xCC, 0xFE, 0x6A, 0xF5, 0x1D, 0xF5, 0xF0, 0xE9, 0xD3, 0xF3, 0x62, 0xED, + 0x13, 0xEB, 0x36, 0xE9, 0x59, 0xE1, 0xCC, 0xDC, 0x3F, 0xE8, 0x0A, 0xDD, + 0xEE, 0xE8, 0x5B, 0xDC, 0x38, 0xE1, 0x44, 0xD3, 0x1F, 0xE1, 0x84, 0xD6, + 0x89, 0xE0, 0x5E, 0xE3, 0xC5, 0xDA, 0xB7, 0xE3, 0x49, 0xD6, 0x70, 0xDC, + 0x82, 0xD5, 0xE3, 0xDA, 0xF6, 0xDB, 0x06, 0xE0, 0x17, 0xE0, 0xE2, 0xE4, + 0xE7, 0xE6, 0xDE, 0xEC, 0xF0, 0xF3, 0x5F, 0xF3, 0x38, 0x02, 0x43, 0xF9, + 0xD4, 0x04, 0x15, 0xF4, 0x71, 0x08, 0x88, 0xF1, 0x07, 0x12, 0xA2, 0xF9, + 0x5C, 0x15, 0x2A, 0xFD, 0x08, 0x11, 0x95, 0x03, 0x3A, 0x04, 0x30, 0x10, + 0x70, 0xFE, 0xCA, 0x19, 0x94, 0xFE, 0x03, 0x17, 0x29, 0xFE, 0xA8, 0x0F, + 0x8D, 0x00, 0x92, 0x0A, 0xDF, 0x04, 0xC2, 0x09, 0x5C, 0x02, 0x2F, 0x06, + 0x1A, 0xFB, 0x6C, 0xFD, 0x5D, 0xF3, 0x69, 0xF5, 0xB0, 0xF5, 0xAA, 0xF6, + 0xA3, 0xF6, 0xF6, 0xF4, 0x17, 0xF6, 0x83, 0xF6, 0xDA, 0xF6, 0x58, 0xF3, + 0x0C, 0xFA, 0x5C, 0xEC, 0xB8, 0xFE, 0xBF, 0xEF, 0x0B, 0x03, 0x79, 0xF5, + 0xF8, 0x02, 0x97, 0xF7, 0xF8, 0xFD, 0x20, 0xFB, 0x6B, 0xFF, 0x19, 0xFE, + 0x59, 0x04, 0x1E, 0x01, 0xC7, 0x05, 0x09, 0x09, 0xA1, 0x02, 0xEC, 0x0C, + 0x9B, 0xFA, 0x6F, 0x08, 0xE8, 0xF9, 0x5A, 0x04, 0xE0, 0xFE, 0x46, 0x04, + 0x88, 0xF7, 0x87, 0x02, 0x02, 0xF4, 0x70, 0x00, 0xC7, 0xFE, 0xBB, 0x00, + 0x31, 0x01, 0x4F, 0xFF, 0x7B, 0xFF, 0x87, 0xFE, 0xA0, 0xFF, 0xB3, 0x00, + 0xAE, 0xFE, 0xD0, 0x05, 0x76, 0xFF, 0x3C, 0x05, 0x1A, 0x03, 0xAC, 0x01, + 0xF0, 0x0D, 0x36, 0x0A, 0x60, 0x0C, 0x92, 0x09, 0x8B, 0x02, 0xF1, 0x04, + 0x81, 0x06, 0x0A, 0x0C, 0xC1, 0x0B, 0xE7, 0x0B, 0x0F, 0x10, 0xD8, 0x0C, + 0xBA, 0x1B, 0x37, 0x12, 0x44, 0x25, 0xAE, 0x10, 0x6B, 0x26, 0x72, 0x11, + 0xF4, 0x28, 0xDD, 0x14, 0x9B, 0x2C, 0x4C, 0x14, 0xFB, 0x29, 0x17, 0x1C, + 0x24, 0x20, 0x24, 0x23, 0xB5, 0x1B, 0x06, 0x26, 0x0C, 0x19, 0x0B, 0x27, + 0xC0, 0x1B, 0xA6, 0x2C, 0xC2, 0x20, 0xBC, 0x34, 0x3D, 0x1A, 0x37, 0x2D, + 0xA5, 0x1B, 0xCA, 0x24, 0x1E, 0x1D, 0xDD, 0x21, 0x15, 0x17, 0x11, 0x1D, + 0xE1, 0x14, 0x6B, 0x11, 0x76, 0x0C, 0x91, 0xFF, 0xB3, 0x07, 0xF9, 0xFC, + 0x45, 0x07, 0x64, 0x03, 0xD3, 0xFD, 0x65, 0x01, 0xFD, 0xF5, 0xE0, 0xFE, + 0x17, 0xFB, 0x86, 0x01, 0xDD, 0xFC, 0x51, 0xFD, 0xDD, 0xF9, 0xB0, 0xF8, + 0x33, 0xFD, 0x69, 0xFF, 0xFB, 0xFD, 0x01, 0x03, 0x9D, 0xF6, 0x79, 0xFF, + 0x96, 0xF4, 0xD9, 0x07, 0xF8, 0xF3, 0x49, 0x0F, 0xFE, 0xF6, 0x2B, 0x0F, + 0x06, 0xFF, 0x1B, 0x11, 0x35, 0x06, 0xBC, 0x15, 0xE5, 0x12, 0x3B, 0x1B, + 0xB4, 0x1E, 0x7F, 0x18, 0xD2, 0x25, 0x08, 0x13, 0x9B, 0x2B, 0x56, 0x18, + 0xDE, 0x26, 0xEB, 0x1B, 0x1B, 0x23, 0x28, 0x20, 0xC8, 0x27, 0xC2, 0x2B, + 0xD4, 0x24, 0x06, 0x30, 0x4B, 0x21, 0xD6, 0x2C, 0x09, 0x1D, 0x76, 0x20, + 0xB7, 0x1B, 0x87, 0x17, 0xCE, 0x25, 0x1E, 0x1D, 0x3C, 0x2C, 0x84, 0x1F, + 0x5B, 0x2B, 0xCA, 0x1E, 0xF2, 0x29, 0x57, 0x24, 0xA9, 0x25, 0xC4, 0x26, + 0xA7, 0x1D, 0x6E, 0x21, 0x5C, 0x1B, 0x0F, 0x1D, 0x3D, 0x1E, 0xB1, 0x1D, + 0xB1, 0x13, 0x2E, 0x1A, 0xEF, 0x0B, 0xA2, 0x1C, 0xAB, 0x0C, 0x11, 0x1B, + 0xBF, 0x03, 0x97, 0x0B, 0x33, 0x0A, 0xDA, 0x12, 0x81, 0x0A, 0x3A, 0x16, + 0x02, 0xFE, 0xDB, 0x0E, 0x18, 0xFE, 0xE4, 0x16, 0x32, 0xF2, 0xDD, 0x0F, + 0xA2, 0xE1, 0xFD, 0x01, 0x68, 0xE1, 0x83, 0x00, 0x2E, 0xE6, 0xED, 0xF8, + 0x41, 0xEB, 0xF8, 0xF0, 0x3D, 0xF4, 0xAC, 0xF5, 0x27, 0xFE, 0x88, 0xFC, + 0xC4, 0x08, 0x10, 0x00, 0x17, 0x16, 0xF3, 0x03, 0x21, 0x21, 0x12, 0x05, + 0x2E, 0x2A, 0x3C, 0x0B, 0x31, 0x2D, 0x53, 0x0F, 0xC1, 0x30, 0x21, 0x0F, + 0x98, 0x35, 0xCA, 0x15, 0x89, 0x2E, 0xED, 0x1C, 0x3D, 0x2A, 0xE8, 0x24, + 0x08, 0x25, 0x2B, 0x27, 0xFC, 0x1B, 0xE6, 0x27, 0xB4, 0x1C, 0x6D, 0x2D, + 0x48, 0x18, 0x5B, 0x2B, 0x16, 0x08, 0x70, 0x24, 0x16, 0x03, 0xA8, 0x26, + 0x64, 0x03, 0x41, 0x25, 0xBD, 0x07, 0x0C, 0x26, 0x97, 0x09, 0xF0, 0x23, + 0xD5, 0x02, 0x97, 0x1A, 0x84, 0xFD, 0x6F, 0x11, 0x13, 0xF5, 0xFE, 0xFF, + 0xFC, 0xF2, 0xA2, 0xF5, 0xED, 0xF2, 0x41, 0xEF, 0x00, 0xF5, 0x6E, 0xEF, + 0x30, 0xF7, 0xCF, 0xF6, 0x59, 0xF6, 0x60, 0xF6, 0x2C, 0xFA, 0xEF, 0xF2, + 0x14, 0x04, 0x90, 0xF8, 0xE8, 0x07, 0x31, 0xFC, 0xD6, 0x01, 0x1F, 0xFA, + 0x69, 0x03, 0x1F, 0x00, 0xC8, 0x02, 0x64, 0x02, 0xCC, 0xF9, 0xC5, 0x01, + 0x22, 0xF6, 0x92, 0x01, 0x0F, 0x03, 0x75, 0x01, 0x21, 0x06, 0x5B, 0xFD, + 0x5C, 0x01, 0xB6, 0xFC, 0x09, 0x09, 0xD8, 0x07, 0xBB, 0x07, 0x2F, 0x12, + 0xD3, 0x03, 0xAE, 0x13, 0x94, 0x0C, 0x78, 0x10, 0x47, 0x17, 0xFF, 0x15, + 0xF9, 0x18, 0xCF, 0x17, 0x5F, 0x0D, 0xF1, 0x0C, 0xCC, 0x07, 0x1A, 0x13, + 0xDD, 0x0B, 0xF2, 0x1C, 0x22, 0xFE, 0x84, 0x0C, 0xB5, 0xFB, 0x95, 0x09, + 0x2A, 0x04, 0xAE, 0x0A, 0xB2, 0x01, 0x76, 0x01, 0x13, 0x00, 0xC8, 0x04, + 0x17, 0xF9, 0x39, 0xFE, 0x8E, 0xF9, 0x65, 0xFB, 0x73, 0xF8, 0x73, 0xFE, + 0x32, 0xF8, 0xB6, 0xFD, 0x60, 0x02, 0xE1, 0x04, 0x04, 0x03, 0xA1, 0x08, + 0x29, 0x02, 0x7D, 0x0A, 0x2C, 0xFD, 0xA0, 0x07, 0xDE, 0xFC, 0xFE, 0x02, + 0x37, 0x07, 0x38, 0x01, 0xF4, 0x0E, 0x99, 0x01, 0x82, 0x14, 0x96, 0x04, + 0x17, 0x07, 0xB6, 0xFE, 0x28, 0xFF, 0x41, 0x00, 0x9D, 0x03, 0xA9, 0x00, + 0x17, 0xF9, 0x5F, 0xF6, 0xA7, 0xEE, 0xD7, 0xF1, 0xB1, 0xEF, 0xB3, 0xF0, + 0xF5, 0xEC, 0xA2, 0xF0, 0x4A, 0xEA, 0x27, 0xF5, 0xEE, 0xE8, 0x34, 0xF0, + 0xCE, 0xEA, 0x7F, 0xEB, 0x52, 0xED, 0x8E, 0xEB, 0xA2, 0xEE, 0xDF, 0xEA, + 0x28, 0xF2, 0x19, 0xF1, 0xB4, 0xEB, 0x37, 0xEF, 0xD2, 0xE8, 0xC4, 0xEC, + 0xB0, 0xE9, 0x0A, 0xF4, 0x7F, 0xEC, 0x6A, 0xFA, 0x46, 0xF5, 0xFB, 0xF9, + 0x27, 0xF7, 0xB2, 0xF5, 0x07, 0x00, 0x3E, 0xFD, 0x24, 0x08, 0xEB, 0x03, + 0x02, 0x05, 0xAF, 0x04, 0xF5, 0x05, 0x93, 0x09, 0xA8, 0x06, 0x7D, 0x04, + 0x1F, 0x10, 0x13, 0x07, 0x83, 0x0F, 0x76, 0x0B, 0x4C, 0x09, 0xE3, 0x0D, + 0x2F, 0x0D, 0x04, 0x15, 0x37, 0x07, 0xAA, 0x0E, 0xD1, 0x05, 0xEB, 0x04, + 0x13, 0x0D, 0xBE, 0x05, 0x7A, 0x04, 0x2B, 0xFD, 0xAF, 0x01, 0xAE, 0xF2, + 0x8E, 0x0F, 0x79, 0xF9, 0xE7, 0x07, 0x26, 0xF4, 0xF9, 0xFE, 0x27, 0xED, + 0xC7, 0xFC, 0xBD, 0xF2, 0x3C, 0xED, 0xFF, 0xF0, 0x6D, 0xE4, 0x64, 0xE8, + 0xD2, 0xE7, 0x62, 0xE9, 0x7A, 0xE1, 0xBC, 0xED, 0x8D, 0xD2, 0xD3, 0xE6, + 0x9B, 0xCE, 0xFB, 0xE3, 0x76, 0xCE, 0x53, 0xE6, 0x70, 0xD0, 0x3F, 0xE7, + 0x3F, 0xD9, 0x90, 0xEE, 0x53, 0xDF, 0xB7, 0xF3, 0x76, 0xE3, 0xE0, 0xF2, + 0xC6, 0xE6, 0x64, 0xEF, 0x41, 0xF1, 0x35, 0xF2, 0x20, 0xFA, 0xCF, 0xF7, + 0x00, 0xF5, 0x75, 0xF4, 0x96, 0xF7, 0x0E, 0xF2, 0x89, 0xFF, 0x9B, 0xEF, + 0x05, 0x04, 0x9C, 0xEC, 0x6E, 0x0B, 0x29, 0xED, 0x33, 0x0C, 0x4F, 0xEC, + 0x2F, 0x0B, 0x5D, 0xEC, 0xBC, 0x14, 0x7F, 0xF4, 0x92, 0x11, 0x4A, 0xF8, + 0x85, 0x05, 0x53, 0xF8, 0x0A, 0x03, 0x36, 0xFC, 0xFF, 0xF9, 0xFB, 0xFA, + 0x6C, 0xF1, 0xA2, 0xF9, 0xDC, 0xED, 0x6F, 0xFA, 0xE1, 0xEC, 0x62, 0x00, + 0xDE, 0xE6, 0x3D, 0xFC, 0x03, 0xE3, 0xB7, 0xF0, 0x6D, 0xEA, 0x98, 0xEE, + 0xA7, 0xED, 0xBA, 0xEC, 0xDF, 0xED, 0xDA, 0xEB, 0x42, 0xEB, 0x58, 0xEC, + 0x58, 0xE8, 0xBF, 0xEC, 0x62, 0xE6, 0x21, 0xED, 0x68, 0xDF, 0xC2, 0xE7, + 0x3F, 0xE0, 0xA9, 0xE2, 0xD5, 0xDF, 0x4B, 0xDC, 0xB6, 0xD9, 0x6C, 0xDA, + 0x84, 0xD8, 0xB3, 0xDB, 0x2A, 0xD1, 0xFB, 0xD3, 0x7C, 0xD5, 0x89, 0xD7, + 0xB6, 0xDC, 0x72, 0xDA, 0x1B, 0xE3, 0x3A, 0xDB, 0xDA, 0xF3, 0xD8, 0xE7, + 0x3A, 0xF6, 0x4C, 0xEE, 0x5B, 0xF7, 0x26, 0xF3, 0xCD, 0x04, 0x03, 0xFE, + 0x36, 0x07, 0xFC, 0x00, 0xD1, 0x05, 0x28, 0xFE, 0x69, 0x0C, 0xE2, 0xFF, + 0x40, 0x10, 0x25, 0x05, 0x72, 0x0D, 0x95, 0x08, 0x48, 0x08, 0x78, 0x09, + 0x4D, 0x04, 0x0D, 0x0D, 0xA2, 0xFA, 0x28, 0x0C, 0xF5, 0xFA, 0xC0, 0x08, + 0x14, 0xFC, 0xB0, 0x00, 0x67, 0xF9, 0xE0, 0xF8, 0xF8, 0x02, 0x5F, 0xF6, + 0x03, 0xFC, 0x38, 0xE9, 0x42, 0xF2, 0xE1, 0xDF, 0xF9, 0xF6, 0xB7, 0xE1, + 0x96, 0xF3, 0x71, 0xE5, 0xDD, 0xE9, 0xEE, 0xE8, 0x48, 0xE4, 0x94, 0xEA, + 0xD7, 0xE2, 0xC1, 0xEC, 0x21, 0xE6, 0x0B, 0xF2, 0xF4, 0xE6, 0x46, 0xF0, + 0xE4, 0xEA, 0xAD, 0xE9, 0x7D, 0xF6, 0xAF, 0xEC, 0xBC, 0xF8, 0xDD, 0xE9, + 0x17, 0xFD, 0xA4, 0xF0, 0xEF, 0xF8, 0xFF, 0xF7, 0xD5, 0xED, 0xDE, 0xF2, + 0xA5, 0xEC, 0x36, 0xF5, 0x64, 0xEA, 0x5E, 0xF2, 0x39, 0xE5, 0xB3, 0xE5, + 0xD7, 0xE5, 0x6C, 0xE2, 0x1C, 0xEF, 0x00, 0xE8, 0x45, 0xF2, 0xEA, 0xE8, + 0x84, 0xF8, 0x4D, 0xED, 0xBE, 0x05, 0x22, 0xF4, 0x3C, 0x0A, 0x6F, 0xF4, + 0x72, 0x06, 0xA1, 0xF1, 0x7F, 0xFB, 0xD4, 0xF0, 0x06, 0xF5, 0x98, 0xF1, + 0xAC, 0xF6, 0x4D, 0xF3, 0xAD, 0xF1, 0xB9, 0xEF, 0xC5, 0xFA, 0x2B, 0xF2, + 0x43, 0x03, 0xE1, 0xF5, 0x98, 0xFA, 0xF0, 0xF3, 0x56, 0xFF, 0xEE, 0xFF, + 0x11, 0x04, 0x99, 0x0A, 0x67, 0xFD, 0x6F, 0x07, 0xAC, 0xF9, 0xCF, 0x06, + 0x55, 0xF8, 0xB2, 0x08, 0x26, 0xF1, 0xE2, 0x03, 0xF9, 0xEF, 0x53, 0x04, + 0xF6, 0xFA, 0x55, 0x0C, 0xBF, 0xFA, 0xA0, 0x0D, 0x2C, 0xFA, 0x7C, 0x10, + 0x78, 0x05, 0xAF, 0x16, 0x50, 0x0C, 0x32, 0x10, 0xFE, 0x16, 0x6D, 0x0C, + 0x5F, 0x19, 0x89, 0x0D, 0x63, 0x0F, 0x20, 0x01, 0xC3, 0x0F, 0x87, 0xF3, + 0x28, 0x0F, 0x98, 0xE7, 0x6B, 0x0E, 0xAC, 0xDC, 0x10, 0x0E, 0xB4, 0xDD, + 0xB6, 0x08, 0x5E, 0xE9, 0x55, 0x05, 0xC7, 0xF1, 0xFF, 0xF7, 0xA9, 0xEE, + 0xF5, 0xEA, 0x68, 0xEF, 0x87, 0xE1, 0x1C, 0xED, 0xA1, 0xDB, 0x82, 0xE6, + 0xF6, 0xDE, 0x3B, 0xEC, 0x2A, 0xE0, 0x6D, 0xF1, 0xAD, 0xE2, 0x75, 0xF2, + 0x66, 0xE5, 0x6F, 0xF3, 0x83, 0xE7, 0x2F, 0xF1, 0x28, 0xF2, 0x71, 0xF6, + 0x3E, 0xFB, 0xD1, 0x01, 0x13, 0xFE, 0xE2, 0x06, 0x2C, 0x03, 0x3E, 0x0C, + 0xAA, 0x09, 0xEF, 0x10, 0x39, 0x0C, 0x66, 0x0C, 0x8A, 0x14, 0x38, 0x0C, + 0x90, 0x20, 0xFB, 0x10, 0x38, 0x1C, 0x03, 0x0E, 0x31, 0x13, 0x99, 0x0B, + 0xCB, 0x16, 0x07, 0x10, 0xB0, 0x1C, 0x64, 0x0F, 0xAE, 0x1C, 0x99, 0x05, + 0x30, 0x1D, 0x26, 0x04, 0xBE, 0x1B, 0x3A, 0x09, 0x59, 0x12, 0xCA, 0x04, + 0x5F, 0x0A, 0x31, 0x04, 0x0F, 0x0B, 0x7A, 0x0B, 0x57, 0x0C, 0xC9, 0x0A, + 0x6D, 0x07, 0x71, 0x04, 0xB9, 0x07, 0x96, 0x06, 0x4E, 0x0C, 0x7B, 0x09, + 0xE7, 0xFA, 0x8D, 0xFC, 0x77, 0xEA, 0xD3, 0xF5, 0x58, 0xED, 0x0C, 0xF8, + 0xBF, 0xF0, 0xDC, 0xF8, 0x20, 0xF6, 0xFA, 0xFE, 0x80, 0xFD, 0x88, 0x01, + 0x13, 0xFF, 0xEE, 0x03, 0x7E, 0xF6, 0xE1, 0x03, 0xBD, 0xEB, 0x68, 0xFA, + 0x15, 0xE8, 0xE0, 0xF2, 0xFD, 0xEE, 0x17, 0xF4, 0xB2, 0xF6, 0x19, 0xF4, + 0x22, 0xF8, 0x95, 0xF7, 0x54, 0xFA, 0x1D, 0x01, 0x81, 0xFA, 0x51, 0xFE, + 0xCF, 0xFF, 0x7A, 0xFA, 0xB5, 0x0D, 0xED, 0xFF, 0xCA, 0x14, 0xFA, 0x01, + 0xB6, 0x1B, 0x20, 0x08, 0x56, 0x25, 0x09, 0x11, 0xF8, 0x26, 0x14, 0x15, + 0xBB, 0x25, 0xF2, 0x19, 0x50, 0x20, 0xFB, 0x18, 0x8E, 0x17, 0x7B, 0x12, + 0x11, 0x15, 0x43, 0x0F, 0x43, 0x14, 0xA6, 0x10, 0x83, 0x0F, 0x3C, 0x14, + 0xB8, 0x0A, 0xB8, 0x19, 0xE8, 0x09, 0xBC, 0x19, 0x84, 0x10, 0xE3, 0x14, + 0x1F, 0x17, 0x83, 0x13, 0xF3, 0x13, 0x46, 0x12, 0x86, 0x0B, 0x5E, 0x0A, + 0x59, 0x08, 0x81, 0x02, 0x26, 0x07, 0x14, 0xFB, 0xB0, 0x01, 0x17, 0xF3, + 0xE6, 0x00, 0x4B, 0xF3, 0x00, 0xF9, 0xAA, 0xF3, 0x3F, 0xF0, 0xCC, 0xF2, + 0x49, 0xF3, 0x8B, 0xF3, 0x20, 0xF1, 0x3A, 0xF1, 0x9B, 0xF3, 0x54, 0xF6, + 0x80, 0xFA, 0x04, 0xFE, 0x0E, 0xF8, 0x57, 0xFC, 0xAC, 0xF7, 0x93, 0xFB, + 0xD6, 0xF2, 0x7A, 0xFB, 0xFB, 0xED, 0x71, 0xFE, 0xBD, 0xF0, 0x4E, 0x07, + 0x04, 0xF1, 0x57, 0x0F, 0x57, 0xF4, 0x28, 0x14, 0xE9, 0xF8, 0xEC, 0x16, + 0x9B, 0xFF, 0x9A, 0x18, 0x11, 0x09, 0xD8, 0x17, 0x5F, 0x12, 0x41, 0x18, + 0x7F, 0x1C, 0x7A, 0x1C, 0xA0, 0x1E, 0xCD, 0x19, 0x32, 0x24, 0xCD, 0x1B, + 0x54, 0x29, 0x2A, 0x21, 0x9E, 0x21, 0x7A, 0x1A, 0x51, 0x1E, 0x59, 0x17, + 0x65, 0x17, 0xCD, 0x15, 0x0E, 0x11, 0x1D, 0x10, 0x60, 0x13, 0xC7, 0x10, + 0x0E, 0x0A, 0x54, 0x0F, 0xFB, 0x03, 0xE1, 0x0E, 0x95, 0x05, 0x40, 0x11, + 0x59, 0x02, 0xEE, 0x0A, 0xA1, 0xFC, 0x1C, 0x04, 0xD0, 0xF9, 0x6D, 0x05, + 0x4B, 0x00, 0xDD, 0x08, 0x19, 0x02, 0x10, 0x05, 0xE8, 0x05, 0x95, 0x0A, + 0x80, 0x11, 0x63, 0x19, 0x63, 0x14, 0x37, 0x1B, 0xA5, 0x17, 0x89, 0x19, + 0xB0, 0x1B, 0xE3, 0x1A, 0xE8, 0x1C, 0x57, 0x18, 0x9C, 0x17, 0xE4, 0x11, + 0x5B, 0x0C, 0x13, 0x0B, 0xB5, 0x0B, 0x76, 0x04, 0x90, 0x0A, 0xC0, 0xF9, + 0x35, 0x06, 0xED, 0xF6, 0xAC, 0x05, 0x55, 0xFC, 0x79, 0x02, 0x33, 0xFA, + 0x65, 0x00, 0xDB, 0xFB, 0xEB, 0xFF, 0xAD, 0x03, 0x12, 0x03, 0x5E, 0x05, + 0x78, 0x03, 0xE8, 0x02, 0x96, 0x00, 0x37, 0x03, 0x11, 0x04, 0x00, 0x04, + 0x7C, 0x07, 0x35, 0x0A, 0x03, 0x06, 0x34, 0x0E, 0xD3, 0x00, 0x42, 0x07, + 0xB2, 0xFD, 0x0F, 0x09, 0x16, 0x00, 0xCC, 0x0D, 0xAB, 0x07, 0xEA, 0x0C, + 0x57, 0x12, 0x92, 0x16, 0x20, 0x14, 0xED, 0x20, 0x2F, 0x0D, 0xEC, 0x1B, + 0x63, 0x0F, 0xDF, 0x18, 0x2B, 0x18, 0x73, 0x1B, 0x50, 0x17, 0x22, 0x11, + 0x9B, 0x19, 0xAF, 0x0B, 0x72, 0x21, 0x44, 0x11, 0x8B, 0x22, 0x48, 0x11, + 0x21, 0x1F, 0x6C, 0x12, 0xFB, 0x1C, 0x77, 0x17, 0x15, 0x1C, 0xB0, 0x1C, + 0x18, 0x17, 0x77, 0x1A, 0x79, 0x15, 0xAB, 0x13, 0x93, 0x16, 0xC3, 0x13, + 0x37, 0x0F, 0x79, 0x13, 0xA1, 0x07, 0x46, 0x0F, 0xA8, 0x05, 0x47, 0x0D, + 0xDE, 0xFF, 0xBD, 0x09, 0x0D, 0xF2, 0x2F, 0x02, 0x0C, 0xEA, 0x91, 0xFE, + 0x2B, 0xF0, 0x26, 0x04, 0x4C, 0xEE, 0xE2, 0x02, 0x06, 0xE9, 0x0B, 0xFB, + 0x3D, 0xF3, 0x1B, 0xF9, 0x33, 0xF8, 0x85, 0xF4, 0xA6, 0xF8, 0x6B, 0xF7, + 0xFD, 0xFF, 0x7F, 0x04, 0xAE, 0x03, 0x2B, 0x0E, 0xDF, 0x04, 0xEC, 0x16, + 0x60, 0x09, 0x25, 0x1B, 0x4C, 0x0D, 0x89, 0x17, 0x8E, 0x11, 0xA8, 0x11, + 0x7C, 0x1C, 0x54, 0x0F, 0xFA, 0x25, 0xDD, 0x11, 0xCA, 0x29, 0x18, 0x15, + 0x1A, 0x2F, 0xE1, 0x18, 0xD4, 0x31, 0x76, 0x1D, 0xD1, 0x2F, 0xB9, 0x20, + 0x2F, 0x2F, 0x1D, 0x25, 0x06, 0x28, 0x7B, 0x28, 0xCA, 0x16, 0x49, 0x23, + 0x98, 0x0D, 0x10, 0x1E, 0x38, 0x09, 0x70, 0x1A, 0x3B, 0x03, 0xB0, 0x1A, + 0x3E, 0x00, 0x58, 0x1B, 0xB5, 0x00, 0xBE, 0x15, 0xBE, 0x04, 0x2A, 0x13, + 0x6E, 0x03, 0xDC, 0x11, 0xDC, 0x01, 0x47, 0x0D, 0x5D, 0x00, 0x85, 0x01, + 0x2C, 0xFE, 0x7B, 0xF5, 0x10, 0x04, 0x55, 0xF1, 0x73, 0x0A, 0x68, 0xEE, + 0xB4, 0x0C, 0x99, 0xF2, 0xE5, 0x07, 0x6C, 0xF8, 0x91, 0x02, 0x44, 0xFA, + 0x2E, 0x02, 0x0D, 0xFE, 0xFC, 0xFD, 0x50, 0xFD, 0xBD, 0xF0, 0xF4, 0xF3, + 0x85, 0xE6, 0x19, 0xF0, 0x1F, 0xE6, 0x2B, 0xF5, 0xCF, 0xDD, 0x2A, 0xF0, + 0x4D, 0xD9, 0x83, 0xEE, 0xC8, 0xE3, 0x11, 0xF5, 0x91, 0xEC, 0x9F, 0xF8, + 0x5B, 0xF1, 0xCB, 0xFF, 0x64, 0xFA, 0x6D, 0x08, 0x21, 0x05, 0xD8, 0x0C, + 0x58, 0x09, 0x1B, 0x0F, 0xEF, 0x0A, 0x39, 0x0F, 0x2B, 0x0C, 0xAF, 0x08, + 0xF3, 0x11, 0xEA, 0x07, 0xC1, 0x18, 0x24, 0x0C, 0xDD, 0x1A, 0x3F, 0x0C, + 0xE2, 0x1B, 0x31, 0x0D, 0xDA, 0x17, 0x93, 0x0B, 0xC9, 0x0D, 0x86, 0x02, + 0xCC, 0x05, 0x1A, 0xFB, 0xC0, 0xFF, 0x98, 0xFA, 0x9B, 0xF4, 0xDF, 0xF9, + 0xC7, 0xEE, 0x57, 0xF7, 0xAB, 0xF3, 0x2D, 0xF5, 0x64, 0xF5, 0xEE, 0xF1, + 0x97, 0xF3, 0x85, 0xEF, 0x59, 0xEE, 0x73, 0xEB, 0x0E, 0xE6, 0x08, 0xEB, + 0x08, 0xE3, 0xE5, 0xEF, 0x66, 0xDF, 0x99, 0xE9, 0x04, 0xDF, 0x36, 0xE2, + 0x9D, 0xE4, 0xDC, 0xDE, 0x18, 0xEC, 0x5B, 0xDB, 0x34, 0xF2, 0x4A, 0xDD, + 0x14, 0xED, 0x3E, 0xDD, 0x64, 0xE6, 0x4F, 0xDC, 0x70, 0xE5, 0xF6, 0xDD, + 0x39, 0xEA, 0x5E, 0xE2, 0x79, 0xF2, 0x34, 0xE7, 0xEB, 0xF9, 0x97, 0xE9, + 0x89, 0xFB, 0xB2, 0xEB, 0x0E, 0xF1, 0x53, 0xEB, 0xDE, 0xEA, 0xF8, 0xEC, + 0x58, 0xEB, 0xC0, 0xEB, 0x36, 0xE9, 0x44, 0xE5, 0xE6, 0xEE, 0x8C, 0xE9, + 0xF5, 0xF4, 0x31, 0xF1, 0x72, 0xEE, 0x5D, 0xEF, 0xDB, 0xEC, 0x61, 0xEF, + 0x7B, 0xF7, 0xEB, 0xF4, 0x8D, 0xFB, 0xD2, 0xF5, 0xCF, 0xF5, 0x1F, 0xF3, + 0x2C, 0xF4, 0xDA, 0xF5, 0x73, 0xF3, 0x93, 0xFA, 0x72, 0xEF, 0xBE, 0xF8, + 0x23, 0xF0, 0x0A, 0xF9, 0x62, 0xF0, 0x4A, 0xFC, 0xA8, 0xEC, 0xB3, 0xF8, + 0x4C, 0xED, 0x32, 0xF5, 0x6E, 0xF0, 0x6E, 0xF5, 0x94, 0xF2, 0x44, 0xF5, + 0x6C, 0xEC, 0x8F, 0xEF, 0x8A, 0xE9, 0x95, 0xF0, 0xDC, 0xF0, 0xA8, 0xF5, + 0x54, 0xF6, 0xAE, 0xF1, 0xAE, 0xFB, 0x89, 0xED, 0xA4, 0xFC, 0xB5, 0xEB, + 0xFE, 0xFA, 0xF6, 0xEC, 0x65, 0xF9, 0x8D, 0xE9, 0x6D, 0xFD, 0xB1, 0xE3, + 0x42, 0x01, 0x28, 0xE4, 0xDA, 0xFB, 0x4D, 0xE5, 0xBF, 0xF9, 0x57, 0xE8, + 0xFF, 0xF4, 0xDD, 0xEB, 0x31, 0xEB, 0xA9, 0xEF, 0x78, 0xE4, 0x73, 0xF3, + 0xEC, 0xDE, 0xA4, 0xF5, 0x2C, 0xD9, 0x47, 0xF3, 0xC6, 0xD9, 0xDB, 0xED, + 0xEB, 0xDE, 0x85, 0xE8, 0x61, 0xDD, 0xD2, 0xE2, 0x52, 0xDD, 0x45, 0xE2, + 0x6D, 0xE7, 0x57, 0xE3, 0x67, 0xF2, 0x1E, 0xE3, 0x62, 0xF7, 0x94, 0xE3, + 0x40, 0xFF, 0xA6, 0xE9, 0xA6, 0x06, 0xCC, 0xF0, 0x60, 0x02, 0xE4, 0xF3, + 0x51, 0x04, 0x88, 0xFB, 0xB9, 0x0F, 0xA2, 0xFD, 0x67, 0x10, 0x38, 0xF6, + 0x43, 0x0F, 0xC8, 0xF4, 0x93, 0x15, 0xA1, 0xF9, 0xC0, 0x13, 0x30, 0xFB, + 0xDC, 0x0B, 0x22, 0xFC, 0xE9, 0x06, 0xD8, 0xFD, 0xDD, 0xFD, 0x03, 0x01, + 0xDF, 0xF1, 0x58, 0x05, 0x26, 0xE9, 0x52, 0x02, 0x47, 0xE7, 0x90, 0xFE, + 0x86, 0xE9, 0xDE, 0xFD, 0x17, 0xE8, 0xD0, 0xF8, 0x5C, 0xE5, 0x24, 0xF5, + 0x34, 0xE9, 0x4B, 0xF5, 0xBB, 0xEA, 0x8B, 0xF1, 0xB6, 0xE4, 0x6D, 0xEF, + 0xDE, 0xE8, 0x2A, 0xF6, 0x0D, 0xEE, 0xD7, 0xF6, 0xB3, 0xE8, 0x1B, 0xF1, + 0x9D, 0xE9, 0x69, 0xF1, 0xAA, 0xF0, 0x12, 0xF2, 0x11, 0xEE, 0xD6, 0xEB, + 0x75, 0xEB, 0x14, 0xEA, 0x31, 0xED, 0x04, 0xE7, 0xE6, 0xEE, 0x1C, 0xE1, + 0xBF, 0xF0, 0x21, 0xE3, 0x32, 0xF2, 0x12, 0xE6, 0xB7, 0xF3, 0x7A, 0xE8, + 0x38, 0xF2, 0xE7, 0xEA, 0x33, 0xF2, 0xFC, 0xEE, 0xCD, 0xF9, 0x5E, 0xF6, + 0xAD, 0x04, 0x4A, 0xFF, 0xCC, 0x09, 0x78, 0x08, 0xAF, 0x0E, 0x05, 0x0F, + 0x99, 0x18, 0x2D, 0x17, 0xA9, 0x19, 0xFE, 0x1A, 0xB9, 0x13, 0x0E, 0x18, + 0xBE, 0x15, 0xDF, 0x15, 0x1C, 0x17, 0x7F, 0x11, 0x48, 0x14, 0x46, 0x0C, + 0x53, 0x12, 0xD8, 0x0C, 0xB5, 0x0B, 0x34, 0x0E, 0x9C, 0x00, 0xF2, 0x06, + 0x1C, 0xFA, 0x1C, 0x01, 0xA4, 0xFB, 0xA1, 0x01, 0xA3, 0xFD, 0x96, 0xFB, + 0xAC, 0xFE, 0x42, 0xF5, 0xCC, 0xFC, 0xBE, 0xF6, 0xEE, 0xF8, 0xC0, 0xF7, + 0xCB, 0xF4, 0x51, 0xF5, 0xF6, 0xF1, 0x73, 0xF5, 0x39, 0xF0, 0xF8, 0xF0, + 0x72, 0xEF, 0x98, 0xEE, 0xFD, 0xF0, 0xDB, 0xF2, 0x96, 0xF0, 0x40, 0xF1, + 0x13, 0xEF, 0x47, 0xEF, 0xDF, 0xEF, 0x05, 0xEF, 0xF2, 0xF1, 0xBE, 0xED, + 0x29, 0xF1, 0x06, 0xE9, 0x5C, 0xF2, 0xE3, 0xE4, 0x47, 0xF6, 0x89, 0xE2, + 0x67, 0xF6, 0xE2, 0xE2, 0x0C, 0xF7, 0x99, 0xEB, 0x28, 0xFA, 0x17, 0xF0, + 0xF9, 0xFB, 0x9F, 0xF0, 0x02, 0x02, 0xFE, 0xFA, 0x17, 0x07, 0x12, 0x02, + 0x60, 0x0A, 0x88, 0x04, 0xC3, 0x0D, 0xCF, 0x0A, 0x75, 0x0E, 0x92, 0x0D, + 0x7C, 0x0F, 0xC0, 0x0C, 0x4F, 0x12, 0x02, 0x0C, 0x2A, 0x19, 0x20, 0x12, + 0xE3, 0x18, 0x6C, 0x15, 0x49, 0x13, 0x0F, 0x17, 0x51, 0x0B, 0x58, 0x1E, + 0xE6, 0xFB, 0xD8, 0x1C, 0x52, 0xF2, 0xB8, 0x12, 0x5A, 0xF0, 0xE0, 0x08, + 0x30, 0xEC, 0x20, 0xFF, 0xE3, 0xEE, 0x41, 0xF9, 0x5B, 0xEF, 0x16, 0xF6, + 0xAB, 0xE6, 0x6C, 0xF3, 0x70, 0xE8, 0xEC, 0xF4, 0xD0, 0xED, 0xD2, 0xF6, + 0x5B, 0xED, 0x87, 0xF4, 0x17, 0xF1, 0x58, 0xF3, 0x4F, 0xFC, 0xDC, 0xF7, + 0x5F, 0x01, 0x1F, 0xF5, 0xE2, 0x03, 0x1B, 0xF2, 0xB3, 0x0A, 0x29, 0xF2, + 0x0A, 0x10, 0x3D, 0xF1, 0x41, 0x14, 0xD6, 0xF2, 0xEA, 0x14, 0x69, 0xF5, + 0x1C, 0x12, 0xBD, 0xF9, 0xA0, 0x10, 0x8D, 0xFC, 0xD7, 0x0A, 0x25, 0xFB, + 0x96, 0x06, 0x29, 0xFB, 0xE7, 0x03, 0xB7, 0xFB, 0x3E, 0xFA, 0x76, 0xFA, + 0x7F, 0xF7, 0x24, 0x02, 0x45, 0xFB, 0xB2, 0x0F, 0xEC, 0xF4, 0xB3, 0x0F, + 0xF8, 0xF4, 0x57, 0x0E, 0x05, 0xFC, 0x97, 0x0E, 0x11, 0xFC, 0x02, 0x07, + 0x72, 0xF8, 0x43, 0x01, 0x35, 0xF8, 0xBD, 0x02, 0xE1, 0xFD, 0xC5, 0x0A, + 0x59, 0x05, 0xED, 0x0F, 0xA2, 0x0D, 0x38, 0x14, 0x6E, 0x15, 0x79, 0x1C, + 0xDA, 0x19, 0x7D, 0x1E, 0x30, 0x1F, 0x04, 0x1D, 0xA4, 0x23, 0x87, 0x1D, + 0xB4, 0x23, 0x65, 0x1B, 0xA8, 0x1A, 0x82, 0x11, 0xE7, 0x18, 0xF9, 0x0A, + 0xFF, 0x1F, 0x18, 0x0E, 0x7E, 0x17, 0x8B, 0x0F, 0x3E, 0x0D, 0x20, 0x11, + 0x1B, 0x0D, 0xCF, 0x1A, 0xA4, 0x0A, 0x4A, 0x1F, 0x21, 0x09, 0xDA, 0x1A, + 0x56, 0x08, 0x79, 0x18, 0x3C, 0x04, 0x6C, 0x18, 0x9A, 0xFC, 0xEE, 0x12, + 0x1A, 0xFD, 0xE5, 0x0C, 0x60, 0x04, 0xA2, 0x07, 0x54, 0x07, 0x79, 0xFF, + 0xB5, 0x06, 0x23, 0xF4, 0x7F, 0x00, 0xBC, 0xEC, 0x21, 0xFF, 0x69, 0xF0, + 0xD6, 0xFB, 0x28, 0xF1, 0xB4, 0xF3, 0xB6, 0xF1, 0x63, 0xF0, 0xAB, 0xF5, + 0x55, 0xEE, 0xB0, 0xF8, 0x1E, 0xF0, 0x57, 0xFF, 0x51, 0xFA, 0x91, 0x06, + 0xCA, 0xFF, 0xC9, 0x09, 0x9A, 0xFD, 0x71, 0x0D, 0x8B, 0xFC, 0xCA, 0x0F, + 0x1A, 0x03, 0xEA, 0x0F, 0xD8, 0x12, 0xB7, 0x0F, 0x17, 0x1F, 0xA0, 0x0D, + 0x7B, 0x27, 0x5B, 0x0F, 0x09, 0x29, 0x0F, 0x16, 0xCD, 0x27, 0xA4, 0x19, + 0xF9, 0x2B, 0xEA, 0x1A, 0x63, 0x2C, 0x74, 0x1C, 0x47, 0x29, 0x45, 0x1B, + 0x0E, 0x26, 0x65, 0x1C, 0x76, 0x1F, 0x13, 0x1B, 0x33, 0x1A, 0xF9, 0x18, + 0xED, 0x17, 0x61, 0x18, 0x2A, 0x18, 0xC9, 0x16, 0xFB, 0x12, 0x80, 0x15, + 0x27, 0x09, 0xA8, 0x0E, 0xBE, 0x03, 0x39, 0x08, 0xE6, 0xFD, 0x40, 0x07, + 0xDE, 0xF9, 0x68, 0x08, 0x4C, 0xF7, 0x86, 0x04, 0xA7, 0xF8, 0x41, 0xFE, + 0x55, 0x01, 0x3B, 0xFD, 0x84, 0x07, 0xF3, 0xFA, 0xF3, 0x05, 0x04, 0xF7, + 0x7E, 0x03, 0xC4, 0xFC, 0xD5, 0x01, 0x16, 0x06, 0x8E, 0x00, 0x78, 0x08, + 0xDC, 0xFC, 0x3E, 0x07, 0x76, 0xF6, 0xE4, 0x08, 0xD5, 0xF3, 0x44, 0x0F, + 0x41, 0xF5, 0x56, 0x13, 0xD3, 0xF6, 0xCF, 0x0E, 0x9C, 0xF1, 0x8F, 0x02, + 0xF2, 0xF5, 0x8D, 0xFB, 0x6C, 0x02, 0xC1, 0xF8, 0xF2, 0x01, 0x6F, 0xF3, + 0x99, 0x05, 0x73, 0xF5, 0x48, 0x0C, 0x2D, 0xF8, 0x3D, 0x0E, 0xB4, 0xFE, + 0xB2, 0x12, 0x51, 0x0A, 0x3D, 0x19, 0x0A, 0x11, 0xA9, 0x17, 0x0A, 0x0F, + 0x05, 0x18, 0x25, 0x11, 0xD0, 0x1D, 0xEF, 0x19, 0xF1, 0x1A, 0xA1, 0x18, + 0x3B, 0x17, 0x4F, 0x15, 0xF1, 0x17, 0xF8, 0x13, 0x4A, 0x16, 0x38, 0x10, + 0x55, 0x11, 0xA8, 0x10, 0x00, 0x09, 0x0F, 0x12, 0xC5, 0x05, 0x39, 0x15, + 0xBF, 0x05, 0x11, 0x15, 0xBB, 0x00, 0x97, 0x11, 0xD6, 0xFA, 0x73, 0x0F, + 0x51, 0xF7, 0x93, 0x0C, 0x56, 0xF1, 0x97, 0x05, 0x09, 0xF0, 0x6D, 0x00, + 0xEC, 0xF1, 0x60, 0xFF, 0xC1, 0xEE, 0xE4, 0xFD, 0x2C, 0xEE, 0xB9, 0xFC, + 0x1D, 0xF5, 0x4C, 0xFD, 0xA2, 0xFF, 0x49, 0xFF, 0x72, 0x02, 0x13, 0xFB, + 0xF7, 0x02, 0x86, 0xF2, 0x24, 0x0C, 0x74, 0xF2, 0xBE, 0x10, 0xAB, 0xF2, + 0x26, 0x10, 0x98, 0xED, 0xB4, 0x14, 0x60, 0xEE, 0x54, 0x16, 0x25, 0xF7, + 0x2D, 0x0E, 0x40, 0xFC, 0xA7, 0x07, 0x94, 0x00, 0x39, 0x06, 0x15, 0x09, + 0xBF, 0x03, 0x47, 0x0F, 0x56, 0x06, 0x34, 0x19, 0x9A, 0x05, 0x28, 0x1D, + 0xC4, 0x02, 0x3A, 0x1B, 0x1D, 0x08, 0xC9, 0x1C, 0x0B, 0x0E, 0x4D, 0x1D, + 0x98, 0x10, 0x5B, 0x1F, 0x70, 0x10, 0xCD, 0x1F, 0xA1, 0x0C, 0x4D, 0x1A, + 0x51, 0x0C, 0xBE, 0x17, 0x2C, 0x0F, 0xAD, 0x17, 0x29, 0x0B, 0x8A, 0x15, + 0xFB, 0x09, 0xB1, 0x12, 0xED, 0x06, 0x70, 0x07, 0x00, 0x01, 0xA0, 0x01, + 0xDA, 0xFE, 0x21, 0x01, 0x0F, 0xF8, 0xC1, 0xFD, 0xDF, 0xF2, 0xC5, 0xFD, + 0x55, 0xF4, 0x12, 0xFF, 0x5C, 0xF8, 0x96, 0xFF, 0x25, 0xFC, 0xE1, 0xFE, + 0x4D, 0x03, 0x42, 0x01, 0x50, 0x06, 0x82, 0x03, 0x16, 0x02, 0x06, 0x06, + 0x6F, 0x07, 0x08, 0x0C, 0xCD, 0x10, 0xC2, 0x0C, 0xB5, 0x10, 0x97, 0x05, + 0x48, 0x0F, 0xBC, 0xFE, 0xE0, 0x0E, 0x0B, 0xFA, 0xA8, 0x06, 0x9F, 0xF3, + 0x3D, 0xFE, 0xFB, 0xF0, 0xD9, 0xF6, 0x2B, 0xED, 0x6D, 0xF3, 0xB7, 0xED, + 0x09, 0xF1, 0xDA, 0xF1, 0xF8, 0xF0, 0xE4, 0xF1, 0xF8, 0xFA, 0x2B, 0xF9, + 0x15, 0xFA, 0x1E, 0xFD, 0x67, 0xF4, 0xC0, 0xFE, 0xC2, 0xF8, 0x56, 0x05, + 0xD2, 0xFA, 0xB8, 0x05, 0xED, 0xFC, 0x8A, 0x03, 0x0F, 0x03, 0x40, 0x02, + 0x20, 0x0D, 0x45, 0x06, 0x02, 0x10, 0x98, 0x0A, 0x9F, 0x0D, 0xC2, 0x0D, + 0xA0, 0x11, 0x4E, 0x13, 0x1D, 0x15, 0x5B, 0x17, 0x2E, 0x19, 0x62, 0x1C, + 0x16, 0x19, 0xDC, 0x1B, 0x6A, 0x19, 0xB4, 0x1D, 0xCC, 0x13, 0xDD, 0x1D, + 0xCD, 0x09, 0xA9, 0x16, 0x21, 0x0B, 0xF5, 0x10, 0x9C, 0x0D, 0xF3, 0x09, + 0x12, 0x0F, 0x6C, 0x04, 0xF9, 0x0F, 0x58, 0x02, 0x5B, 0x0F, 0x34, 0x05, + 0x19, 0x0A, 0x6C, 0x02, 0x5D, 0x04, 0xBC, 0xF8, 0x81, 0x01, 0x41, 0xF1, + 0xCD, 0xF9, 0x17, 0xEB, 0x39, 0xF1, 0xEE, 0xE7, 0x0C, 0xED, 0x6C, 0xE7, + 0x3A, 0xE9, 0xF3, 0xE8, 0xF6, 0xE3, 0x87, 0xED, 0x21, 0xE0, 0x5D, 0xF2, + 0x37, 0xDC, 0xB7, 0xEF, 0xDE, 0xDC, 0xE6, 0xED, 0xF9, 0xDF, 0xA3, 0xEF, + 0xA0, 0xE2, 0xAF, 0xEF, 0x94, 0xE3, 0xC9, 0xEB, 0xB4, 0xE7, 0x4A, 0xEA, + 0x0B, 0xF1, 0x9F, 0xED, 0x6E, 0xF1, 0xB4, 0xED, 0xC4, 0xEE, 0x5B, 0xF1, + 0xFE, 0xE9, 0x4B, 0xF5, 0x38, 0xE5, 0x0A, 0xF9, 0xD0, 0xEA, 0xB1, 0xFE, + 0x9F, 0xF4, 0x8B, 0xFF, 0xD6, 0xFE, 0xEF, 0xFA, 0x7E, 0x07, 0x89, 0xF6, + 0x2D, 0x12, 0x9E, 0xFE, 0x2A, 0x1D, 0x12, 0x0A, 0xBA, 0x1C, 0x56, 0x0A, + 0xD7, 0x17, 0x5F, 0x05, 0x48, 0x18, 0x18, 0x02, 0xEE, 0x12, 0x2D, 0xFF, + 0x82, 0x07, 0xA7, 0xF7, 0x96, 0x01, 0x4B, 0xEF, 0xF3, 0xF8, 0x1E, 0xEB, + 0x4E, 0xEE, 0x8A, 0xEE, 0xAB, 0xEA, 0x0D, 0xF7, 0x88, 0xE6, 0x5C, 0xF6, + 0x47, 0xE5, 0x66, 0xF4, 0x83, 0xE4, 0xB2, 0xF4, 0x58, 0xE1, 0xBD, 0xF3, + 0x8D, 0xE0, 0x1E, 0xF3, 0x2F, 0xDC, 0xC4, 0xED, 0x03, 0xDA, 0x38, 0xE9, + 0xBD, 0xDF, 0xEA, 0xE8, 0x29, 0xE5, 0xEE, 0xE9, 0x6C, 0xE3, 0x4A, 0xEA, + 0x60, 0xEA, 0xDA, 0xEA, 0xDB, 0xF3, 0xF8, 0xE2, 0x63, 0xF4, 0xBF, 0xD9, + 0xF0, 0xF5, 0xC7, 0xD5, 0x93, 0xF2, 0x03, 0xD4, 0x7A, 0xEF, 0x2B, 0xD9, + 0x88, 0xF1, 0x8F, 0xE0, 0x92, 0xF0, 0x37, 0xE5, 0x3F, 0xF0, 0x57, 0xE8, + 0x18, 0xF4, 0x17, 0xF1, 0xD6, 0xF3, 0xAB, 0xF8, 0x14, 0xF2, 0xF9, 0xF9, + 0x5E, 0xF8, 0xB7, 0xFE, 0x2D, 0xF7, 0x2B, 0x03, 0x2A, 0xF8, 0xB9, 0x06, + 0x54, 0x06, 0x74, 0x07, 0x5A, 0x0C, 0x8B, 0x03, 0x1D, 0x0D, 0xFC, 0xFE, + 0x81, 0x0E, 0x01, 0xFD, 0xCD, 0x05, 0x81, 0xFB, 0x35, 0xFD, 0x23, 0xFC, + 0x1C, 0xF6, 0x4D, 0xF7, 0x98, 0xEE, 0x3C, 0xEF, 0xD8, 0xEE, 0xDD, 0xF0, + 0xC2, 0xEE, 0x99, 0xF3, 0x5D, 0xE8, 0xAB, 0xF3, 0x8C, 0xE3, 0x80, 0xF3, + 0x9A, 0xDF, 0x8E, 0xEE, 0xA5, 0xDE, 0x67, 0xEA, 0xEC, 0xE7, 0xC4, 0xEE, + 0xBF, 0xEB, 0xFC, 0xED, 0x12, 0xEE, 0x91, 0xE9, 0x9B, 0xF3, 0xCF, 0xEA, + 0x1F, 0xEF, 0x75, 0xEA, 0xD7, 0xE8, 0xAA, 0xE7, 0xBF, 0xEC, 0x9F, 0xEA, + 0x57, 0xF1, 0x0B, 0xEF, 0x54, 0xF3, 0xCD, 0xF1, 0xBE, 0xF5, 0x66, 0xFA, + 0x82, 0xF3, 0x4D, 0x03, 0x60, 0xF2, 0x6D, 0x03, 0xE0, 0xF6, 0x4D, 0x02, + 0x4B, 0xFE, 0xAE, 0x00, 0x9C, 0x05, 0xC0, 0xFC, 0x5E, 0x07, 0x61, 0xF9, + 0xDD, 0x0A, 0x25, 0xF8, 0xDA, 0x0C, 0x11, 0xF6, 0x38, 0x07, 0x06, 0xEE, + 0xCA, 0x05, 0x3F, 0xEA, 0x35, 0x08, 0x2E, 0xEE, 0x62, 0x01, 0x5B, 0xF1, + 0x67, 0xFF, 0x49, 0xF8, 0x9D, 0x02, 0xF3, 0xFB, 0xF4, 0xFB, 0xBD, 0xFB, + 0xDF, 0xFA, 0x90, 0xFE, 0x13, 0x04, 0xC9, 0x04, 0x40, 0x06, 0x25, 0x09, + 0x24, 0x0B, 0x37, 0x0B, 0xCB, 0x18, 0x69, 0x10, 0xD9, 0x19, 0x09, 0x11, + 0xDA, 0x0F, 0xB6, 0x0B, 0x6B, 0x0C, 0x43, 0x07, 0x05, 0x10, 0x3C, 0x08, + 0xBA, 0x09, 0x62, 0x06, 0x2F, 0xFF, 0x08, 0x02, 0xFD, 0xF9, 0xD9, 0x00, + 0x09, 0xED, 0x6E, 0xFC, 0xA2, 0xDE, 0xE0, 0xF8, 0x5A, 0xE4, 0x03, 0xFF, + 0xF6, 0xF3, 0xCB, 0x04, 0x3D, 0xF7, 0x23, 0x08, 0x53, 0xF6, 0x41, 0x08, + 0x2A, 0xFA, 0x82, 0x01, 0x5E, 0xFC, 0xF7, 0xFB, 0xC5, 0xFB, 0x9E, 0xF1, + 0xA9, 0x00, 0xCA, 0xE7, 0x03, 0x06, 0xBC, 0xE3, 0xE3, 0xFD, 0xB1, 0xDB, + 0x12, 0xF9, 0xC7, 0xD7, 0x2A, 0xF8, 0x14, 0xDD, 0x16, 0xF1, 0x82, 0xE3, + 0xE0, 0xEE, 0x8F, 0xE7, 0xB6, 0xF5, 0x71, 0xF2, 0xCA, 0x00, 0xEB, 0xFF, + 0x92, 0x00, 0x89, 0x04, 0xBF, 0xF6, 0xCA, 0x05, 0xA2, 0xF5, 0x99, 0x08, + 0x73, 0xF7, 0x12, 0x0B, 0xAD, 0xF7, 0x74, 0x0F, 0x4E, 0xFB, 0x24, 0x12, + 0xFA, 0x02, 0x73, 0x12, 0x0E, 0x09, 0x9C, 0x10, 0xEE, 0x0F, 0x95, 0x0B, + 0x6C, 0x1C, 0x66, 0x0B, 0x05, 0x25, 0x3F, 0x0C, 0xB9, 0x26, 0x81, 0x09, + 0x43, 0x26, 0x04, 0x08, 0x78, 0x23, 0xE9, 0x09, 0x49, 0x1C, 0xF3, 0x08, + 0x19, 0x12, 0x8B, 0x03, 0x8E, 0x04, 0x75, 0x04, 0x51, 0xFA, 0x0C, 0x07, + 0x57, 0xF5, 0xFA, 0x03, 0x1F, 0xF1, 0x54, 0x04, 0x2F, 0xF1, 0x1F, 0x07, + 0x42, 0xF4, 0xD7, 0x04, 0xD4, 0xF8, 0xE5, 0xFE, 0x02, 0xF7, 0x1E, 0xF7, + 0x3F, 0xFA, 0x88, 0xF4, 0x75, 0xFE, 0x4C, 0xF6, 0xA5, 0xEF, 0x7F, 0xF5, + 0x8E, 0xEA, 0x91, 0xF9, 0x39, 0xF1, 0x0E, 0x00, 0xD3, 0xF3, 0x62, 0x01, + 0x10, 0xF8, 0x64, 0x03, 0xC1, 0xF9, 0xBA, 0x04, 0xC6, 0xFE, 0x05, 0x08, + 0x57, 0xFD, 0x28, 0x06, 0x0B, 0xF9, 0x8E, 0xFF, 0xDE, 0xFF, 0x3F, 0xFC, + 0xF9, 0x02, 0xE3, 0xF8, 0xAB, 0x02, 0xBA, 0xF7, 0xD3, 0x07, 0x68, 0xF8, + 0x13, 0x0F, 0x8D, 0xFE, 0x6E, 0x0A, 0xCC, 0x01, 0xE2, 0x04, 0x04, 0x01, + 0xAC, 0x0B, 0x1D, 0x08, 0x11, 0x10, 0x62, 0x0C, 0x18, 0x14, 0xA5, 0x0C, + 0x14, 0x1A, 0x22, 0x14, 0x2F, 0x1C, 0x7B, 0x1D, 0xDD, 0x15, 0x42, 0x18, + 0xBF, 0x0E, 0x2C, 0x11, 0x1E, 0x10, 0x53, 0x13, 0x24, 0x09, 0x65, 0x0F, + 0x50, 0xFC, 0x69, 0x08, 0x41, 0xFD, 0xC9, 0x07, 0x78, 0xFD, 0x05, 0x08, + 0x6B, 0xF2, 0xF7, 0x00, 0xD1, 0xF2, 0x77, 0xFB, 0x17, 0xFD, 0xF1, 0xFA, + 0x9F, 0xFB, 0x4F, 0xF8, 0xEF, 0xF8, 0xAB, 0xF5, 0x86, 0xFD, 0x52, 0xF8, + 0xFC, 0xF7, 0x81, 0xF7, 0x5A, 0xF0, 0x4E, 0xF0, 0xA8, 0xF4, 0x5B, 0xF2, + 0x4A, 0xF4, 0xE9, 0xF5, 0xE3, 0xF4, 0x98, 0xF9, 0x66, 0xFE, 0xF7, 0x02, + 0x4C, 0x07, 0x62, 0x0A, 0x43, 0x0C, 0xD0, 0x0F, 0xC9, 0x0F, 0x57, 0x0E, + 0xF0, 0x13, 0x9F, 0x04, 0x32, 0x13, 0xB7, 0xFC, 0x77, 0x0D, 0xCD, 0xF8, + 0x64, 0x07, 0x02, 0xF9, 0xDE, 0x05, 0x6B, 0x01, 0x68, 0x04, 0xAA, 0x07, + 0x82, 0x01, 0xDA, 0x09, 0xA5, 0x08, 0x5A, 0x10, 0x24, 0x13, 0xD5, 0x14, + 0x21, 0x1F, 0x09, 0x1B, 0x49, 0x21, 0xB5, 0x1E, 0xFA, 0x1E, 0x2E, 0x1F, + 0xBA, 0x1D, 0x8C, 0x1B, 0xCB, 0x1C, 0x96, 0x13, 0x45, 0x25, 0x04, 0x17, + 0x28, 0x18, 0x0E, 0x14, 0x3C, 0x0C, 0x52, 0x11, 0x42, 0x0C, 0x0E, 0x11, + 0xD5, 0x03, 0x40, 0x07, 0x05, 0x03, 0x20, 0x03, 0x36, 0x00, 0x5A, 0xFD, + 0xB8, 0x00, 0x2B, 0xFE, 0x4E, 0x02, 0xCE, 0x05, 0xFB, 0xFD, 0x41, 0x0B, + 0x2B, 0xF4, 0x2A, 0x09, 0x37, 0xEC, 0x0F, 0x07, 0x31, 0xED, 0x4B, 0x09, + 0x68, 0xEB, 0x86, 0x00, 0x98, 0xF3, 0xE8, 0xFE, 0x31, 0xF8, 0x85, 0x04, + 0xAF, 0xF9, 0x95, 0x04, 0xC6, 0x0A, 0xE6, 0x08, 0x5C, 0x0E, 0x30, 0x0A, + 0x1C, 0x0E, 0xB8, 0x08, 0x2A, 0x15, 0x26, 0x09, 0x7C, 0x0D, 0x25, 0x04, + 0x99, 0x0A, 0xA6, 0x03, 0xEA, 0x0D, 0xD1, 0x04, 0x91, 0x0A, 0x2A, 0xFE, + 0xD5, 0x05, 0x55, 0xFC, 0xDC, 0xFF, 0x99, 0x04, 0xC4, 0xFB, 0x3C, 0x0B, + 0xCF, 0xF7, 0x79, 0x0D, 0xB1, 0xF6, 0xA5, 0x0D, 0x21, 0xFF, 0xC5, 0x0C, + 0xA4, 0x05, 0xA0, 0x09, 0xC0, 0x05, 0xED, 0x02, 0xA6, 0x0A, 0xC4, 0x01, + 0x23, 0x16, 0x4A, 0x06, 0x35, 0x18, 0x9D, 0x07, 0x23, 0x14, 0x5D, 0x06, + 0xED, 0x16, 0xD2, 0x08, 0x69, 0x17, 0x11, 0x0C, 0x9C, 0x1A, 0x42, 0x11, + 0x3F, 0x1D, 0xFD, 0x18, 0x14, 0x12, 0x0D, 0x18, 0x13, 0x0A, 0xAD, 0x1B, + 0xC0, 0x0F, 0xC8, 0x23, 0x10, 0x1C, 0x4C, 0x21, 0x17, 0x1F, 0xEE, 0x1B, + 0xBD, 0x14, 0x26, 0x17, 0xD8, 0x10, 0xDE, 0x14, 0x8C, 0x0A, 0xEC, 0x13, + 0x12, 0xFA, 0xA1, 0x09, 0xA9, 0xF8, 0xB4, 0x04, 0x8A, 0xFA, 0x16, 0x06, + 0x6F, 0xF5, 0xE1, 0x05, 0x20, 0xF6, 0xFE, 0x05, 0x9C, 0xF3, 0x86, 0x00, + 0x36, 0xF3, 0xB0, 0xFE, 0x94, 0xF3, 0x78, 0xFD, 0xA4, 0xF4, 0x5F, 0xF8, + 0x2F, 0xFB, 0xB4, 0xF7, 0x5B, 0xF3, 0xB8, 0xF2, 0x75, 0xEC, 0x3B, 0xEC, + 0x35, 0xF5, 0x9E, 0xED, 0x15, 0xF4, 0x35, 0xED, 0x9E, 0xF0, 0xE4, 0xEA, + 0xDD, 0xF9, 0xD0, 0xEA, 0x6A, 0x00, 0xCE, 0xEC, 0x1C, 0x01, 0xF6, 0xEF, + 0xEF, 0x03, 0x80, 0xF3, 0xBB, 0x06, 0x1C, 0xFD, 0x5D, 0x06, 0x96, 0x04, + 0x7F, 0x0B, 0x08, 0x07, 0x98, 0x0E, 0xD5, 0x09, 0x18, 0x09, 0xAE, 0x0C, + 0xAA, 0x0B, 0x9E, 0x16, 0x26, 0x13, 0x2D, 0x1B, 0x34, 0x17, 0x37, 0x1B, + 0x7A, 0x10, 0x31, 0x1E, 0x94, 0x0C, 0x6D, 0x1B, 0x71, 0x16, 0xF2, 0x18, + 0xD1, 0x10, 0xE9, 0x11, 0x12, 0x02, 0x0B, 0x04, 0x1E, 0x01, 0x87, 0x01, + 0x38, 0xF9, 0xA5, 0xFD, 0xEC, 0xEA, 0xD8, 0xF1, 0xBA, 0xEC, 0xB5, 0xF1, + 0x78, 0xF2, 0x16, 0xFB, 0x47, 0xEC, 0x60, 0xFD, 0xB5, 0xEB, 0x7A, 0xFE, + 0xC9, 0xF7, 0x40, 0x04, 0x5D, 0xF8, 0xBA, 0x01, 0x79, 0xF8, 0x6C, 0xFD, + 0xEF, 0x07, 0xCC, 0x01, 0x95, 0x0C, 0x58, 0x02, 0xE1, 0xFF, 0x9D, 0xFC, + 0x70, 0x03, 0x4F, 0xFF, 0x2C, 0x14, 0xC6, 0x07, 0x3B, 0x0E, 0x64, 0x03, + 0x76, 0x0D, 0x43, 0x01, 0x8F, 0x17, 0xBE, 0x05, 0x32, 0x09, 0x1D, 0xFB, + 0x23, 0x03, 0x58, 0xF7, 0x0B, 0x08, 0x04, 0xFD, 0x5D, 0xFE, 0xE6, 0xFB, + 0x1C, 0xF9, 0xDC, 0x00, 0x80, 0xFA, 0x84, 0x07, 0x8C, 0x00, 0x73, 0x0D, + 0x01, 0xFE, 0xD3, 0x14, 0x60, 0xF1, 0xE4, 0x11, 0x88, 0xFA, 0x49, 0x0F, + 0x92, 0x13, 0x90, 0x1A, 0x29, 0x19, 0x46, 0x1A, 0xE9, 0x11, 0x2F, 0x08, + 0xD4, 0x15, 0xCA, 0xFE, 0xBC, 0x16, 0xCD, 0xF9, 0xE9, 0x0C, 0x7B, 0xF3, + 0x29, 0x0A, 0x09, 0xF6, 0xE2, 0x06, 0x38, 0xFD, 0x1E, 0xFA, 0xFE, 0xFE, + 0xF1, 0xF3, 0x7C, 0xFE, 0x93, 0xF8, 0x06, 0x02, 0x7C, 0xFB, 0xFC, 0x03, + 0xBA, 0xF5, 0x61, 0x00, 0xC8, 0xF4, 0x48, 0xFD, 0x19, 0xF7, 0x37, 0xFA, + 0xD9, 0xF0, 0x0C, 0xF3, 0xF3, 0xEB, 0x25, 0xEA, 0x32, 0xEA, 0x76, 0xE9, + 0x7A, 0xEA, 0xE9, 0xEC, 0x5B, 0xE6, 0x2B, 0xE7, 0x51, 0xE7, 0x0F, 0xE7, + 0x27, 0xF8, 0x8C, 0xF1, 0xA4, 0xF7, 0x29, 0xEE, 0xCC, 0xF7, 0xCA, 0xF0, + 0xC0, 0x01, 0x4A, 0xF8, 0x74, 0xFF, 0x38, 0xEE, 0xCD, 0x07, 0x5F, 0xEF, + 0x28, 0x11, 0x5D, 0xFB, 0x87, 0x06, 0x65, 0xF9, 0x20, 0xFE, 0x14, 0xF8, + 0xE8, 0x00, 0x06, 0x02, 0x87, 0xFE, 0x7A, 0x05, 0xE2, 0xFB, 0x16, 0x04, + 0x7E, 0x01, 0x88, 0x08, 0x23, 0xFF, 0x0C, 0x0D, 0x7F, 0xF6, 0x2B, 0x0D, + 0x6F, 0xF2, 0xC3, 0x0A, 0xA9, 0xF1, 0xDB, 0x0D, 0x34, 0xE8, 0x1B, 0x09, + 0xA2, 0xEB, 0x8F, 0x05, 0x1E, 0xFC, 0x8B, 0x07, 0x31, 0x00, 0x52, 0x03, + 0x7D, 0x00, 0x7B, 0x01, 0xF4, 0x0B, 0xE3, 0x08, 0xCA, 0x0F, 0x5F, 0x0C, + 0x5B, 0x07, 0x69, 0x06, 0xD1, 0x03, 0x30, 0xFD, 0x5F, 0x0A, 0x14, 0xF9, + 0xCF, 0x11, 0x78, 0xFB, 0xD1, 0x0C, 0x47, 0xF9, 0x02, 0x09, 0xB0, 0xF7, + 0xE2, 0xFF, 0xE3, 0xF2, 0x8A, 0xF0, 0x84, 0xEC, 0x79, 0xF7, 0xF7, 0xF1, + 0x3B, 0x04, 0x26, 0xF9, 0x7D, 0xFA, 0xA7, 0xF7, 0xD9, 0xEF, 0x4C, 0xF8, + 0xA9, 0xFB, 0x5A, 0x04, 0x10, 0x05, 0x4B, 0x0D, 0x2C, 0xFA, 0x88, 0x01, + 0x18, 0xF7, 0x86, 0xF7, 0xAE, 0xFC, 0xD6, 0xFA, 0x8F, 0xEF, 0x75, 0xF2, + 0x51, 0xDD, 0x76, 0xE4, 0xF1, 0xD4, 0x63, 0xDC, 0x32, 0xCC, 0xF6, 0xD6, + 0xDA, 0xCA, 0xC3, 0xD4, 0xF9, 0xD6, 0xFA, 0xDF, 0x00, 0xE2, 0x6C, 0xF0, + 0xD3, 0xE2, 0xF9, 0xF0, 0xCF, 0xEB, 0xB2, 0xF5, 0x05, 0xFD, 0x61, 0xFE, + 0x28, 0x01, 0x9B, 0xFC, 0xDC, 0x04, 0x3B, 0xFC, 0x8C, 0x15, 0x12, 0xFE, + 0xE2, 0x1A, 0x68, 0x00, 0xC8, 0x10, 0xCC, 0xFE, 0x93, 0x07, 0x1E, 0xF9, + 0x1F, 0x0A, 0xFB, 0xFB, 0x99, 0x11, 0xB1, 0x00, 0xD0, 0x11, 0x60, 0x01, + 0xE2, 0x10, 0xFA, 0x02, 0x9A, 0x11, 0x71, 0x0B, 0x3D, 0x14, 0x4F, 0x16, + 0xB7, 0x11, 0x50, 0x14, 0x0E, 0x0C, 0x65, 0x13, 0x7E, 0x01, 0x7B, 0x12, + 0xA6, 0xF5, 0xA3, 0x08, 0xC0, 0xFC, 0x92, 0x0B, 0x50, 0xFC, 0x8D, 0x09, + 0xC6, 0xF4, 0xC7, 0xFE, 0x08, 0x02, 0xAF, 0xFC, 0x9B, 0x04, 0x06, 0xF7, + 0x2E, 0x03, 0xDE, 0xF4, 0x29, 0x0A, 0x29, 0xF6, 0x75, 0x00, 0x1A, 0xF7, + 0xDA, 0xF6, 0xEB, 0xF3, 0x40, 0xEB, 0xCB, 0xE5, 0x00, 0xD9, 0x2A, 0xD7, + 0x9D, 0xD8, 0xC8, 0xCB, 0xE9, 0xDF, 0x86, 0xCC, 0x94, 0xE4, 0x0B, 0xD8, + 0x47, 0xE2, 0xA9, 0xDD, 0x24, 0xD6, 0x25, 0xDE, 0xD8, 0xDE, 0x64, 0xE4, + 0xC7, 0xF2, 0xBB, 0xEC, 0x19, 0xF2, 0x40, 0xF1, 0xE1, 0xF1, 0xBE, 0xF6, + 0x89, 0xF4, 0x82, 0xF5, 0x89, 0xF0, 0x2E, 0xED, 0xEC, 0xFF, 0xD9, 0xF5, + 0xB7, 0x09, 0x69, 0xFE, 0x94, 0x01, 0x47, 0x00, 0x2A, 0x0D, 0x67, 0x12, + 0xC1, 0x1D, 0x61, 0x26, 0xEA, 0x1B, 0xA2, 0x26, 0xFE, 0x13, 0x34, 0x19, + 0x37, 0x10, 0x46, 0x0A, 0x1D, 0x0D, 0x04, 0x01, 0x21, 0x0B, 0xFC, 0xFD, + 0xBE, 0xFE, 0x87, 0xF3, 0xC6, 0xFA, 0x89, 0xF2, 0x03, 0x03, 0x02, 0xFD, + 0x70, 0xFE, 0xED, 0xFF, 0xE8, 0x00, 0xCA, 0xFF, 0xA9, 0xFE, 0xFF, 0xFD, + 0xB9, 0xF0, 0x01, 0xFE, 0x5A, 0xE8, 0xC3, 0xFA, 0x2E, 0xE6, 0xCF, 0xF9, + 0xE1, 0xE5, 0x2C, 0xF9, 0x11, 0xE9, 0x6E, 0xF3, 0x81, 0xF8, 0x8E, 0xFA, + 0xE5, 0x02, 0x4F, 0x03, 0xC2, 0x01, 0xBA, 0x08, 0x46, 0x00, 0x82, 0x08, + 0x0D, 0x09, 0xAB, 0x06, 0x7E, 0x0E, 0x66, 0x08, 0x39, 0x04, 0x9D, 0xFB, + 0xB6, 0xF8, 0x3F, 0xE4, 0x99, 0xF9, 0x3F, 0xE2, 0x02, 0xFF, 0xC5, 0xEB, + 0x92, 0xFA, 0x4F, 0xE6, 0xEF, 0xF1, 0x07, 0xE1, 0xA8, 0xEC, 0xE1, 0xDF, + 0xDE, 0xEF, 0x6A, 0xE2, 0x74, 0xEE, 0xCA, 0xE6, 0xE1, 0xED, 0x2A, 0xF4, + 0x4C, 0xEE, 0xB3, 0x00, 0xE4, 0xE2, 0x7D, 0x01, 0x60, 0xEB, 0xD7, 0x0B, + 0xC3, 0x01, 0x9C, 0x1A, 0x53, 0x02, 0x5A, 0x17, 0xEC, 0x05, 0x72, 0x14, + 0x88, 0x17, 0xC4, 0x21, 0x44, 0x20, 0x7C, 0x22, 0x00, 0x21, 0x9B, 0x16, + 0xC1, 0x1E, 0x0C, 0x13, 0xCC, 0x14, 0xD0, 0x0D, 0xA8, 0x0F, 0x32, 0x09, + 0xCC, 0x07, 0xD0, 0x07, 0x79, 0xF6, 0x30, 0x01, 0x96, 0xEA, 0x73, 0xF5, + 0xEB, 0xE5, 0xEA, 0xEC, 0x5F, 0xF0, 0xDE, 0xF3, 0x5A, 0xF5, 0x3B, 0xF6, + 0x86, 0xF4, 0x3E, 0xF3, 0x06, 0x02, 0xA4, 0xF9, 0xC1, 0x0A, 0x7E, 0xFE, + 0xEB, 0x0F, 0x84, 0xFD, 0x53, 0x18, 0x4E, 0xFB, 0x0A, 0x13, 0x81, 0xF7, + 0xC3, 0x0F, 0xD2, 0xF6, 0x9C, 0x19, 0x51, 0x03, 0xDE, 0x15, 0x81, 0x0E, + 0x52, 0x16, 0xE8, 0x15, 0x3B, 0x1C, 0xF5, 0x19, 0x5A, 0x10, 0x6D, 0x15, + 0x45, 0x02, 0x49, 0x0C, 0xC5, 0xEF, 0xC7, 0xFD, 0x68, 0xE0, 0xAB, 0xF2, + 0xED, 0xD4, 0x9F, 0xED, 0x5D, 0xC5, 0x98, 0xE7, 0xC2, 0xC9, 0xF9, 0xEB, + 0xCF, 0xD5, 0x56, 0xF5, 0x48, 0xDF, 0xE3, 0xF2, 0x14, 0xE5, 0x15, 0xE7, + 0xBB, 0xEC, 0x3A, 0xE6, 0x9E, 0xEA, 0xBF, 0xE0, 0x58, 0xE9, 0x15, 0xDC, + 0x91, 0x01, 0x61, 0xEE, 0x1A, 0x0B, 0x06, 0xF8, 0xED, 0x03, 0x25, 0xF6, + 0xE6, 0x11, 0x12, 0x00, 0xE1, 0x28, 0xAF, 0x14, 0x7A, 0x2F, 0xFC, 0x22, + 0x0C, 0x2E, 0x3F, 0x27, 0x5B, 0x32, 0x12, 0x2F, 0xE0, 0x38, 0xE0, 0x39, + 0xDE, 0x32, 0x91, 0x33, 0xEE, 0x23, 0x49, 0x1D, 0xEE, 0x16, 0x52, 0x0D, + 0x5C, 0x02, 0xE6, 0x00, 0xD9, 0xEF, 0x7B, 0xF7, 0x4F, 0xEA, 0x0B, 0xFF, + 0xFB, 0xE3, 0xA0, 0x03, 0x49, 0xDD, 0x5A, 0xF8, 0x5D, 0xEA, 0x51, 0xFE, + 0xBC, 0xFD, 0x11, 0x0A, 0x31, 0xFB, 0xBF, 0x00, 0x0A, 0x03, 0x7E, 0xFA, + 0x5B, 0x0F, 0x67, 0xFC, 0xCA, 0x0D, 0x7B, 0x02, 0xC2, 0x13, 0x13, 0x06, + 0x57, 0x1C, 0x3E, 0x0E, 0xE9, 0x1C, 0x64, 0x17, 0x0C, 0x21, 0x2F, 0x17, + 0xDF, 0x28, 0xE2, 0x1C, 0xBD, 0x21, 0xC1, 0x1B, 0x73, 0x10, 0x40, 0x0F, + 0xCD, 0xFE, 0xA9, 0x03, 0x11, 0xF5, 0x3A, 0xFA, 0xAC, 0xED, 0xEF, 0xF3, + 0xA4, 0xE3, 0x76, 0xEF, 0x11, 0xEA, 0xC9, 0xF6, 0x42, 0xF4, 0xA4, 0x03, + 0x86, 0xEB, 0x08, 0xFF, 0xA2, 0xE7, 0x47, 0xFA, 0xAE, 0xED, 0x96, 0xF9, + 0x6E, 0xE6, 0x2E, 0xEA, 0x71, 0xE9, 0x45, 0xE4, 0x50, 0xFB, 0xF1, 0xEA, + 0xCA, 0xFE, 0x0A, 0xEE, 0x8B, 0x04, 0x93, 0xF4, 0xD8, 0x0F, 0x4B, 0xFE, + 0x41, 0x12, 0x0C, 0x07, 0xAC, 0x19, 0xA3, 0x0C, 0x43, 0x1D, 0x05, 0x10, + 0x81, 0x1E, 0x51, 0x17, 0xC4, 0x1D, 0xBA, 0x1A, 0x2D, 0x15, 0x60, 0x1C, + 0xE7, 0x06, 0xE2, 0x18, 0x0C, 0xF8, 0x51, 0x0E, 0x29, 0xF4, 0x18, 0x07, + 0xFB, 0xF2, 0x79, 0xFA, 0xAF, 0xF6, 0x55, 0xF6, 0xC5, 0xF8, 0x37, 0xFB, + 0x47, 0xF5, 0x94, 0xF7, 0xEF, 0xFE, 0x30, 0x00, 0xD4, 0x05, 0xF4, 0x0C, + 0x90, 0x01, 0x1F, 0x0A, 0xFA, 0x0B, 0xBE, 0x0F, 0x99, 0x16, 0x3C, 0x1F, + 0xB8, 0x10, 0x05, 0x21, 0xB5, 0x0B, 0xB0, 0x1C, 0xDB, 0x11, 0x4D, 0x22, + 0xA2, 0x1C, 0x76, 0x25, 0x93, 0x28, 0x4D, 0x29, 0x2F, 0x34, 0x25, 0x34, + 0x19, 0x34, 0x8C, 0x32, 0x30, 0x2C, 0x01, 0x28, 0x65, 0x21, 0x8C, 0x18, + 0x8A, 0x0A, 0x29, 0x00, 0x19, 0xF8, 0x8B, 0xEA, 0x2D, 0xF2, 0xB4, 0xDD, + 0x87, 0xEE, 0x96, 0xE0, 0x0F, 0xEE, 0x46, 0xEA, 0x2D, 0xE7, 0x2C, 0xE6, + 0x4D, 0xE6, 0x4B, 0xE5, 0xA2, 0xE8, 0x9D, 0xE6, 0x84, 0xDF, 0x2E, 0xDF, + 0x85, 0xD8, 0x0D, 0xE3, 0xE4, 0xD9, 0x82, 0xEF, 0xA2, 0xD9, 0x14, 0xF2, + 0x2B, 0xE0, 0xD6, 0xF4, 0x01, 0xF1, 0x25, 0xFB, 0xA4, 0xF8, 0xEF, 0xFD, + 0x2D, 0x09, 0x0E, 0x0F, 0x85, 0x1D, 0xA0, 0x1D, 0x51, 0x20, 0x97, 0x1F, + 0x9D, 0x25, 0xA2, 0x27, 0xAF, 0x26, 0x7F, 0x21, 0x3D, 0x18, 0xD1, 0x10, + 0x50, 0x0F, 0x2F, 0x08, 0xBF, 0x06, 0x59, 0xF8, 0x2E, 0xF7, 0x69, 0xE7, + 0xCB, 0xF0, 0x16, 0xE4, 0x95, 0xEC, 0x21, 0xE4, 0x3A, 0xF0, 0x95, 0xE6, + 0xD0, 0x04, 0x02, 0xF5, 0x38, 0x17, 0x9A, 0x07, 0x90, 0x20, 0x0A, 0x14, + 0x55, 0x16, 0x2F, 0x18, 0xBA, 0x04, 0x21, 0x14, 0xBB, 0x0A, 0x7D, 0x12, + 0x79, 0x17, 0x79, 0x16, 0xEA, 0x1E, 0xCA, 0x1B, 0x76, 0x27, 0xE9, 0x25, + 0x60, 0x27, 0x1A, 0x2B, 0xF7, 0x24, 0x9E, 0x32, 0xF0, 0x25, 0x86, 0x3A, + 0xD1, 0x1A, 0x51, 0x2E, 0x04, 0x03, 0xEC, 0x17, 0xE2, 0xF7, 0xD1, 0x0C, + 0xD4, 0xE7, 0xD6, 0xF3, 0x31, 0xD7, 0x80, 0xD7, 0x46, 0xE0, 0x81, 0xD4, + 0x66, 0xDE, 0x32, 0xD1, 0x6C, 0xE0, 0xB9, 0xD4, 0x86, 0xEF, 0x3C, 0xE0, + 0x1D, 0xE8, 0x52, 0xE1, 0xB6, 0xE2, 0x0E, 0xE1, 0xB7, 0xDD, 0xD4, 0xDE, + 0x0D, 0xD3, 0x3A, 0xDD, 0x7B, 0xE1, 0xDB, 0xE3, 0x63, 0xED, 0xD1, 0xEC, + 0x33, 0xF1, 0x4B, 0xFC, 0xA3, 0x03, 0x88, 0x18, 0x08, 0x16, 0xC0, 0x30, + 0x0E, 0x26, 0xD0, 0x37, 0x48, 0x33, 0x30, 0x37, 0xDF, 0x3B, 0xC7, 0x36, + 0x52, 0x3A, 0xFF, 0x2E, 0xEC, 0x29, 0x1B, 0x22, 0xB8, 0x13, 0x04, 0x10, + 0x36, 0x06, 0x2E, 0xFC, 0x66, 0xFD, 0x84, 0xEB, 0xD2, 0xEB, 0xE0, 0xDD, + 0x72, 0xE6, 0xB3, 0xD9, 0x41, 0xEE, 0x12, 0xE0, 0x21, 0xEC, 0x59, 0xE8, + 0xF7, 0xF2, 0xB7, 0xEE, 0x75, 0xFD, 0xDF, 0xF3, 0x90, 0xF7, 0x93, 0xF8, + 0xF7, 0xFE, 0x82, 0x00, 0xE5, 0x11, 0x1B, 0x0E, 0xAA, 0x1A, 0x94, 0x1A, + 0x24, 0x1D, 0xC7, 0x24, 0x09, 0x1B, 0xE5, 0x29, 0x3F, 0x26, 0xD4, 0x28, + 0x72, 0x34, 0x66, 0x2D, 0xED, 0x2E, 0x42, 0x2C, 0x3B, 0x2A, 0x1D, 0x26, + 0x97, 0x20, 0x72, 0x25, 0xEE, 0x06, 0xED, 0x15, 0x9E, 0xEA, 0x81, 0xF3, + 0xE3, 0xDA, 0x1F, 0xDB, 0x18, 0xD9, 0x70, 0xD5, 0x6B, 0xD9, 0x2B, 0xD7, + 0xC7, 0xDD, 0x76, 0xD9, 0xC7, 0xE1, 0xCD, 0xDD, 0xAB, 0xDC, 0x7B, 0xE0, + 0x20, 0xD7, 0x71, 0xDC, 0x7B, 0xDA, 0xF7, 0xDA, 0x63, 0xDE, 0x55, 0xDF, + 0xCF, 0xD9, 0x36, 0xE2, 0x49, 0xE6, 0x1B, 0xEC, 0xB5, 0xFF, 0x25, 0x01, + 0x6E, 0x03, 0x70, 0x0D, 0xBD, 0x0B, 0xF0, 0x0C, 0x60, 0x27, 0xD7, 0x15, + 0x6B, 0x31, 0x64, 0x21, 0x07, 0x30, 0xA2, 0x26, 0x5E, 0x2C, 0xBD, 0x29, + 0xC9, 0x1F, 0x54, 0x22, 0x70, 0x10, 0x3D, 0x13, 0x2D, 0xFF, 0x54, 0x02, + 0xA9, 0xF3, 0x01, 0xF5, 0xEE, 0xE0, 0x3B, 0xE7, 0x11, 0xDB, 0x30, 0xE5, + 0x94, 0xEB, 0x28, 0xF2, 0xF1, 0xF5, 0xE0, 0xFB, 0x87, 0xFF, 0x98, 0x00, + 0xA1, 0x08, 0xD4, 0x01, 0x61, 0x0C, 0x01, 0x02, 0x45, 0x0E, 0x92, 0x05, + 0xA8, 0x14, 0x44, 0x0E, 0xE1, 0x18, 0x6F, 0x12, 0x58, 0x11, 0x55, 0x11, + 0x05, 0x18, 0x43, 0x19, 0x27, 0x29, 0x04, 0x23, 0xDE, 0x2E, 0x04, 0x27, + 0x7E, 0x28, 0xB2, 0x1F, 0x74, 0x0F, 0x20, 0x05, 0x46, 0xFF, 0xC5, 0xF3, + 0x5A, 0xEA, 0x2B, 0xE4, 0x24, 0xC5, 0x88, 0xC7, 0xBA, 0xB4, 0x47, 0xB6, + 0xF8, 0xAD, 0x44, 0xB5, 0xF1, 0xA9, 0xEE, 0xB7, 0x39, 0xB8, 0x96, 0xBF, + 0x78, 0xC3, 0x48, 0xCC, 0x93, 0xBC, 0x66, 0xCD, 0xE9, 0xC0, 0x00, 0xCF, + 0xF3, 0xD7, 0x85, 0xD8, 0x91, 0xE5, 0xC4, 0xE0, 0x46, 0xEC, 0xE7, 0xE9, + 0x3A, 0x07, 0xE2, 0xF9, 0x46, 0x1E, 0x0C, 0x0A, 0xE4, 0x29, 0xDF, 0x18, + 0x26, 0x3F, 0x0F, 0x2A, 0x77, 0x47, 0xE2, 0x35, 0x3B, 0x41, 0x01, 0x37, + 0x0C, 0x3C, 0x3E, 0x31, 0xB2, 0x33, 0x2E, 0x28, 0xF6, 0x19, 0x00, 0x14, + 0x5C, 0xFD, 0x62, 0x01, 0xDC, 0xED, 0x3A, 0xFB, 0xEC, 0xCF, 0xAA, 0xE9, + 0x9B, 0xBB, 0x38, 0xDA, 0x96, 0xC6, 0x9C, 0xDB, 0x70, 0xCE, 0xA5, 0xE1, + 0x98, 0xD4, 0x52, 0xEA, 0x69, 0xE3, 0x12, 0xF5, 0x89, 0xFC, 0xC1, 0x05, + 0xD1, 0x0F, 0x58, 0x12, 0x23, 0x12, 0x67, 0x11, 0xF6, 0x16, 0xF1, 0x0B, + 0x85, 0x18, 0x02, 0x08, 0x10, 0x19, 0xAB, 0x08, 0x96, 0x2D, 0x69, 0x13, + 0x0A, 0x33, 0x38, 0x1B, 0x3C, 0x28, 0xF0, 0x1B, 0x90, 0x1F, 0xE0, 0x14, + 0x1A, 0x15, 0xFE, 0x09, 0x8C, 0x03, 0x62, 0xFC, 0x62, 0xDE, 0x72, 0xE0, + 0xDF, 0xBF, 0x9E, 0xC4, 0x69, 0xB9, 0x65, 0xBB, 0x12, 0xB3, 0xF3, 0xBA, + 0x40, 0xAF, 0x49, 0xB7, 0xD3, 0xB9, 0x0A, 0xB8, 0x5F, 0xC2, 0x24, 0xBB, + 0x36, 0xC9, 0x5C, 0xC2, 0xC8, 0xD8, 0x8F, 0xCC, 0x81, 0xEB, 0x7B, 0xDC, + 0xA3, 0xED, 0x29, 0xEB, 0x21, 0xFB, 0xBB, 0xFC, 0x5B, 0x19, 0x97, 0x15, + 0x45, 0x25, 0xB7, 0x20, 0x97, 0x33, 0x57, 0x27, 0x84, 0x3E, 0x9C, 0x33, + 0xAC, 0x3A, 0xFA, 0x3A, 0x4D, 0x3B, 0x47, 0x3D, 0x6C, 0x32, 0x7C, 0x32, + 0xFB, 0x24, 0x2A, 0x23, 0x7A, 0x12, 0xA4, 0x14, 0x85, 0xFB, 0xE1, 0x01, + 0x88, 0xEB, 0xF0, 0xEE, 0x54, 0xD3, 0x34, 0xD7, 0x97, 0xC9, 0xFB, 0xCB, + 0x38, 0xC9, 0xDA, 0xCC, 0x7C, 0xC8, 0xB4, 0xD2, 0xD4, 0xDA, 0x2B, 0xE5, + 0x0E, 0xEF, 0xEE, 0xF9, 0x7C, 0x02, 0xB3, 0x0F, 0x92, 0x12, 0x91, 0x22, + 0x75, 0x1B, 0x14, 0x2D, 0xF1, 0x26, 0xBA, 0x34, 0xFD, 0x2A, 0x1B, 0x35, + 0x71, 0x30, 0x56, 0x35, 0x4C, 0x2E, 0x9E, 0x32, 0xDA, 0x22, 0x07, 0x2C, + 0xBE, 0x1D, 0xF2, 0x23, 0x52, 0x16, 0xB9, 0x13, 0xAE, 0x11, 0x33, 0x03, + 0xE1, 0x02, 0x64, 0xF0, 0x1A, 0xE7, 0xCF, 0xDB, 0xAB, 0xCF, 0xCF, 0xC8, + 0x8B, 0xBD, 0x98, 0xBA, 0xC7, 0xB7, 0xF5, 0xB5, 0x6D, 0xC0, 0x5B, 0xBB, + 0x9C, 0xCD, 0x66, 0xC4, 0x5E, 0xD8, 0xB0, 0xC4, 0x15, 0xE8, 0x0D, 0xCE, + 0x66, 0xFB, 0xCE, 0xE5, 0xBE, 0x02, 0xE8, 0xF5, 0xE6, 0xFF, 0xD8, 0xF7, + 0x3E, 0x06, 0x27, 0xFC, 0xE5, 0x17, 0x83, 0x10, 0x31, 0x27, 0x3F, 0x27, + 0x76, 0x22, 0x04, 0x2B, 0x0A, 0x1B, 0x01, 0x2B, 0xF4, 0x20, 0xDD, 0x2D, + 0xAE, 0x25, 0x43, 0x2C, 0x52, 0x2B, 0x36, 0x2C, 0xD2, 0x2B, 0xC0, 0x2A, + 0x57, 0x14, 0xAF, 0x1B, 0x2B, 0xFF, 0x4F, 0x0A, 0x9E, 0xFD, 0x48, 0x01, + 0xB7, 0xEB, 0x7D, 0xE8, 0xFB, 0xD3, 0xE9, 0xCE, 0xD7, 0xD4, 0x5C, 0xCC, + 0x25, 0xE2, 0x59, 0xD6, 0x7F, 0xE7, 0x3A, 0xE1, 0xCF, 0xF1, 0xE8, 0xEF, + 0x08, 0xFD, 0xCE, 0x00, 0x03, 0x01, 0x20, 0x10, 0xF8, 0x10, 0xE1, 0x1C, + 0x84, 0x1D, 0x16, 0x1C, 0x25, 0x26, 0xCB, 0x1D, 0x00, 0x26, 0x03, 0x1F, + 0xCC, 0x1D, 0x72, 0x17, 0x21, 0x29, 0xFD, 0x1E, 0x50, 0x1D, 0x7F, 0x1C, + 0x7D, 0x06, 0x55, 0x0D, 0x43, 0x08, 0x94, 0x0B, 0xE7, 0xED, 0x6C, 0xFB, + 0x4B, 0xCD, 0x1E, 0xDB, 0x58, 0xBD, 0x25, 0xB8, 0x0B, 0xB1, 0x38, 0xA3, + 0x18, 0xBC, 0xC8, 0xA8, 0x3C, 0xCF, 0x6A, 0xB9, 0xA6, 0xD9, 0x55, 0xD0, + 0xBB, 0xDE, 0xCA, 0xE0, 0x12, 0xEB, 0x9F, 0xEA, 0x38, 0x03, 0xCC, 0xFC, + 0xFD, 0x10, 0x34, 0x0D, 0x6E, 0x0F, 0x84, 0x0F, 0xC6, 0x1D, 0x1B, 0x1E, + 0xDE, 0x36, 0x76, 0x3C, 0x07, 0x36, 0x80, 0x47, 0x25, 0x31, 0x48, 0x46, + 0xB6, 0x39, 0x42, 0x44, 0x98, 0x36, 0x0E, 0x3F, 0x24, 0x2E, 0x01, 0x3D, + 0x2A, 0x23, 0x20, 0x30, 0x2E, 0x02, 0xD4, 0x12, 0xEB, 0xE3, 0xD3, 0xF6, + 0x30, 0xE0, 0x1B, 0xE7, 0xD9, 0xD6, 0x50, 0xD5, 0x77, 0xC2, 0xF1, 0xC0, + 0xD8, 0xB1, 0x67, 0xB4, 0xBC, 0xB9, 0x1F, 0xBE, 0xED, 0xD1, 0x8F, 0xD0, + 0x8A, 0xE3, 0x44, 0xDC, 0xC2, 0x05, 0x69, 0xF4, 0xA2, 0x24, 0xA6, 0x0A, + 0x96, 0x2D, 0x8D, 0x1A, 0xDA, 0x3B, 0xEA, 0x2F, 0xDC, 0x44, 0x84, 0x38, + 0xD3, 0x33, 0xD4, 0x2E, 0xD8, 0x20, 0x89, 0x23, 0x1B, 0x26, 0xD3, 0x25, + 0xD6, 0x21, 0xA1, 0x1D, 0x2B, 0x0E, 0x5B, 0x08, 0xFC, 0x0E, 0x7E, 0x0B, + 0x6D, 0xFF, 0x51, 0x03, 0x31, 0xE1, 0x6C, 0xE5, 0x42, 0xD7, 0x2D, 0xD6, + 0x6F, 0xC8, 0x9C, 0xC3, 0xBF, 0xB9, 0x88, 0xB6, 0xF4, 0xBE, 0x98, 0xC2, + 0x6D, 0xD8, 0x87, 0xDA, 0xBF, 0xE1, 0xC9, 0xE4, 0x2F, 0xD9, 0x55, 0xE5, + 0x3C, 0xF6, 0x6E, 0xFD, 0x9E, 0x10, 0x32, 0x19, 0x24, 0x05, 0x2C, 0x1E, + 0x3F, 0x0D, 0xD1, 0x25, 0x2B, 0x29, 0xF3, 0x39, 0x9F, 0x34, 0x77, 0x43, + 0x41, 0x33, 0x51, 0x39, 0x2A, 0x38, 0x2A, 0x36, 0x85, 0x36, 0x84, 0x35, + 0xCD, 0x2B, 0x19, 0x2A, 0x46, 0x31, 0x28, 0x29, 0xD4, 0x2F, 0xCB, 0x23, + 0xBC, 0x18, 0xF8, 0x08, 0xA1, 0x06, 0x02, 0xEF, 0x02, 0xF2, 0x72, 0xDA, + 0xC7, 0xCC, 0x5B, 0xC2, 0x50, 0xB0, 0x88, 0xB4, 0xCF, 0xAC, 0xC6, 0xB6, + 0xBE, 0xB9, 0xEB, 0xC3, 0x56, 0xCD, 0x74, 0xD7, 0x92, 0xF0, 0xD4, 0xF6, + 0x10, 0x10, 0xB6, 0x13, 0x89, 0x23, 0x96, 0x27, 0x44, 0x42, 0xFA, 0x40, + 0x8E, 0x4F, 0x92, 0x49, 0xFE, 0x48, 0xF6, 0x42, 0x1B, 0x42, 0x90, 0x3B, + 0x55, 0x35, 0x92, 0x2F, 0x64, 0x26, 0xEE, 0x23, 0x6E, 0x19, 0x95, 0x1B, + 0x1E, 0x10, 0x9E, 0x11, 0xFB, 0x0A, 0x58, 0x09, 0x99, 0xEC, 0xF2, 0xF0, + 0xE2, 0xCF, 0xEE, 0xD3, 0x79, 0xC9, 0x57, 0xC3, 0x52, 0xB3, 0x8B, 0xB0, + 0x7D, 0xAB, 0x8D, 0xB0, 0x6D, 0xBC, 0xE5, 0xBF, 0xD3, 0xCE, 0x45, 0xCF, + 0x32, 0xE6, 0x4E, 0xE2, 0x69, 0xFC, 0x0F, 0xF9, 0x56, 0x10, 0x6F, 0x12, + 0xC8, 0x1B, 0x8F, 0x1D, 0x0C, 0x25, 0xB7, 0x28, 0x85, 0x32, 0xF2, 0x38, + 0x36, 0x39, 0x16, 0x3C, 0xAD, 0x35, 0xC2, 0x37, 0xC1, 0x33, 0x38, 0x34, + 0xA3, 0x3C, 0xD0, 0x38, 0xF6, 0x35, 0x22, 0x32, 0x2C, 0x2B, 0x69, 0x26, + 0xED, 0x2C, 0xA0, 0x27, 0xF8, 0x20, 0x8E, 0x1F, 0x36, 0x08, 0xCE, 0x0B, + 0xF6, 0xE7, 0xF1, 0xF2, 0xDA, 0xCF, 0x67, 0xDF, 0x97, 0xB9, 0x53, 0xC7, + 0x63, 0xAA, 0xCE, 0xB6, 0xCB, 0xB1, 0x70, 0xBC, 0xBB, 0xBD, 0x3F, 0xC6, + 0x5D, 0xD2, 0xF5, 0xDB, 0x2C, 0xEF, 0xCE, 0xF9, 0x3A, 0x0F, 0x6B, 0x18, + 0xD0, 0x28, 0x6F, 0x2B, 0x5C, 0x3C, 0xAC, 0x37, 0x8F, 0x42, 0xA6, 0x3F, + 0x20, 0x3D, 0x3E, 0x3B, 0x51, 0x34, 0xDB, 0x2B, 0xA4, 0x27, 0x73, 0x1E, + 0xFC, 0x1F, 0xC8, 0x1B, 0x03, 0x15, 0x65, 0x10, 0xCA, 0x12, 0x1C, 0x09, + 0x1D, 0x18, 0xB0, 0x06, 0x35, 0x0A, 0x69, 0xF2, 0x09, 0xF3, 0x84, 0xE0, + 0x03, 0xD8, 0x55, 0xCF, 0x82, 0xC2, 0x4F, 0xBD, 0x51, 0xB4, 0xA3, 0xB4, + 0x45, 0xBF, 0x25, 0xC5, 0xEC, 0xDF, 0x0B, 0xE4, 0xB4, 0xEC, 0x08, 0xF0, + 0x25, 0xFB, 0xF3, 0xFE, 0xAC, 0x10, 0x5C, 0x14, 0x70, 0x12, 0x89, 0x18, + 0x0F, 0x12, 0xEA, 0x19, 0xEC, 0x18, 0xB8, 0x22, 0x96, 0x1F, 0x90, 0x29, + 0xB7, 0x23, 0xCB, 0x2B, 0x87, 0x23, 0x2F, 0x2C, 0x21, 0x1D, 0xC3, 0x27, + 0x8A, 0x0C, 0x71, 0x19, 0x40, 0x07, 0x4D, 0x10, 0xE2, 0x0B, 0x94, 0x08, + 0xF2, 0x01, 0xF2, 0xF7, 0x28, 0xF1, 0xBB, 0xE7, 0x33, 0xE5, 0x06, 0xDD, + 0x0D, 0xD3, 0xDA, 0xCB, 0xE7, 0xB9, 0x68, 0xB1, 0x7C, 0xB0, 0x3A, 0xA7, + 0x10, 0xB6, 0x80, 0xB0, 0x7F, 0xC0, 0x91, 0xC0, 0xC8, 0xE1, 0xBE, 0xE1, + 0x4B, 0x0F, 0x0F, 0x0A, 0x62, 0x2A, 0x46, 0x25, 0x97, 0x37, 0xCC, 0x33, + 0xED, 0x4A, 0x54, 0x42, 0x6C, 0x4F, 0x5A, 0x47, 0x89, 0x41, 0x78, 0x3F, + 0x57, 0x34, 0x25, 0x35, 0xC8, 0x1F, 0xA4, 0x25, 0xAA, 0x07, 0x7B, 0x14, + 0xE4, 0xF8, 0xA8, 0x08, 0x00, 0xF2, 0xF7, 0x02, 0x17, 0xEF, 0xD7, 0xFC, + 0x4B, 0xEA, 0xA3, 0xF9, 0xA9, 0xDF, 0x59, 0xFA, 0x5C, 0xD7, 0x1D, 0xEF, + 0x18, 0xCB, 0x0E, 0xD5, 0x57, 0xC1, 0xC7, 0xC4, 0x41, 0xD4, 0x51, 0xD1, + 0x4E, 0xEA, 0xD6, 0xE7, 0xC4, 0xF1, 0x03, 0xF7, 0xDA, 0x01, 0x02, 0x05, + 0xCE, 0x0F, 0xDF, 0x0D, 0x18, 0x16, 0xE0, 0x11, 0x00, 0x18, 0xAB, 0x11, + 0x43, 0x13, 0x0D, 0x0F, 0x4E, 0x10, 0x07, 0x0E, 0x3D, 0x10, 0xCE, 0x0C, + 0x76, 0x11, 0x6A, 0x0D, 0x1C, 0x14, 0xB0, 0x0C, 0x7C, 0x17, 0x6C, 0x0B, + 0x05, 0x1A, 0xB5, 0x11, 0xF8, 0x13, 0xBB, 0x10, 0xEC, 0x07, 0x80, 0x09, + 0xF5, 0xF3, 0x86, 0x00, 0x89, 0xE4, 0x29, 0xF1, 0xBA, 0xDC, 0x0E, 0xDC, + 0x3E, 0xCC, 0xB1, 0xC1, 0xAD, 0xC5, 0xD1, 0xB2, 0xCA, 0xC6, 0xFC, 0xB5, + 0xE0, 0xD3, 0x29, 0xCC, 0x7A, 0xF3, 0xDF, 0xE9, 0xAB, 0x0E, 0xD2, 0x03, + 0x03, 0x2C, 0xA8, 0x27, 0x70, 0x3F, 0x59, 0x42, 0x02, 0x40, 0x46, 0x45, + 0x9C, 0x3C, 0x7C, 0x3C, 0x93, 0x31, 0x8A, 0x2D, 0x0C, 0x28, 0x09, 0x21, + 0x6A, 0x22, 0x15, 0x17, 0xF6, 0x15, 0xA1, 0x0F, 0xC0, 0x07, 0xB0, 0x06, + 0x2E, 0xFF, 0x35, 0x02, 0x94, 0xF0, 0x0A, 0xFF, 0xCD, 0xDE, 0x95, 0xF1, + 0x68, 0xDA, 0x0A, 0xE6, 0x65, 0xCA, 0xF8, 0xD2, 0x67, 0xBB, 0x97, 0xBD, + 0xD7, 0xC2, 0x09, 0xBC, 0xF3, 0xCB, 0xA8, 0xC8, 0xD3, 0xE0, 0xE2, 0xDC, + 0xDD, 0x01, 0x21, 0xF2, 0x9E, 0x16, 0x9C, 0x03, 0x65, 0x1E, 0x42, 0x10, + 0x51, 0x1B, 0xF6, 0x15, 0x19, 0x0F, 0x45, 0x14, 0x76, 0x08, 0x65, 0x13, + 0x79, 0x02, 0x93, 0x10, 0xDD, 0x03, 0x5B, 0x11, 0x7B, 0x0D, 0x4F, 0x1C, + 0x83, 0x12, 0x77, 0x23, 0xB4, 0x19, 0x18, 0x25, 0xEC, 0x15, 0x03, 0x20, + 0x96, 0x0B, 0xD9, 0x16, 0x12, 0x04, 0xDB, 0x06, 0x68, 0xFE, 0x2B, 0xF8, + 0x88, 0xF7, 0xA2, 0xEC, 0x0C, 0xE4, 0x91, 0xD7, 0x42, 0xCF, 0x1D, 0xC8, + 0x04, 0xC2, 0x52, 0xC0, 0x51, 0xC2, 0x4F, 0xBE, 0xF8, 0xCE, 0x9B, 0xC6, + 0x6D, 0xE7, 0xA2, 0xDC, 0x24, 0x0E, 0xD2, 0x00, 0xFB, 0x2A, 0xB9, 0x21, + 0xFE, 0x38, 0xC5, 0x35, 0xB3, 0x42, 0x1C, 0x40, 0x7D, 0x3A, 0xE9, 0x36, + 0xFE, 0x2A, 0x70, 0x26, 0x78, 0x20, 0x62, 0x20, 0x3B, 0x1E, 0x93, 0x1D, + 0x2F, 0x1E, 0xBE, 0x14, 0x8E, 0x16, 0xE8, 0x0D, 0x0A, 0x19, 0xD9, 0x0E, + 0x69, 0x13, 0xB3, 0x03, 0x51, 0xFE, 0x84, 0xF5, 0xE8, 0xF4, 0xA0, 0xEC, + 0xE5, 0xDA, 0x38, 0xD2, 0xDD, 0xB6, 0xCA, 0xB7, 0x5F, 0xB8, 0x1E, 0xBB, + 0xE0, 0xC9, 0x67, 0xC9, 0xDA, 0xD3, 0x03, 0xD3, 0xF7, 0xDE, 0x97, 0xDC, + 0xCE, 0xF1, 0x1A, 0xF4, 0x4F, 0xFD, 0x00, 0x09, 0x63, 0xF9, 0x48, 0x0B, + 0xC7, 0xFA, 0xDA, 0x10, 0xE1, 0xFE, 0x8E, 0x13, 0xFE, 0xFF, 0x2C, 0x10, + 0xDA, 0x00, 0x87, 0x13, 0x7F, 0x06, 0x05, 0x19, 0x4B, 0x0F, 0x3B, 0x1C, + 0xE7, 0x0F, 0x68, 0x1D, 0x5E, 0x1B, 0xA5, 0x23, 0x14, 0x24, 0xC4, 0x25, + 0x59, 0x11, 0xD3, 0x12, 0x8B, 0x06, 0x46, 0xFF, 0xEB, 0x00, 0xEC, 0xF0, + 0x08, 0xEB, 0xC3, 0xDB, 0xA3, 0xD7, 0x6D, 0xC7, 0xE4, 0xCC, 0x15, 0xBA, + 0xC7, 0xD2, 0x07, 0xC0, 0x6C, 0xE1, 0x37, 0xD3, 0xFE, 0xFB, 0x11, 0xF2, + 0x27, 0x19, 0xE3, 0x13, 0xC1, 0x29, 0x16, 0x2C, 0xCD, 0x37, 0x48, 0x39, + 0x22, 0x42, 0x6A, 0x43, 0x22, 0x3F, 0x6B, 0x48, 0x24, 0x29, 0x02, 0x34, + 0xAB, 0x16, 0x50, 0x20, 0xB3, 0x0B, 0x2D, 0x16, 0xF8, 0xFE, 0xEC, 0x02, + 0x12, 0xF9, 0xFB, 0xF7, 0x56, 0xF6, 0x60, 0xF9, 0xBC, 0xEA, 0x60, 0xED, + 0x21, 0xDE, 0x9C, 0xDE, 0x8C, 0xD3, 0xB8, 0xD6, 0x21, 0xBE, 0x8A, 0xBD, + 0xFD, 0xB2, 0x83, 0xAE, 0xE9, 0xBE, 0x2F, 0xB9, 0x0A, 0xDB, 0x10, 0xCE, + 0x83, 0xE9, 0x0E, 0xE0, 0x0F, 0xED, 0x04, 0xE9, 0x47, 0x06, 0x96, 0xFF, + 0x42, 0x10, 0x48, 0x0D, 0x17, 0x0C, 0xE8, 0x07, 0x43, 0x10, 0xC5, 0x08, + 0xF4, 0x09, 0x4A, 0x0C, 0xA7, 0x06, 0x18, 0x0C, 0xB7, 0x0E, 0x2F, 0x0E, + 0x23, 0x18, 0xFF, 0x14, 0x96, 0x1E, 0x06, 0x14, 0x98, 0x2A, 0x42, 0x16, + 0x38, 0x37, 0x9C, 0x22, 0x90, 0x2B, 0xAF, 0x1A, 0xA5, 0x1A, 0x09, 0x0C, + 0xCC, 0x09, 0x7A, 0x05, 0xAE, 0xF0, 0x2F, 0xF7, 0x56, 0xD4, 0xE6, 0xDC, + 0x1B, 0xBD, 0xE1, 0xC5, 0xC7, 0xB6, 0x78, 0xC2, 0xAE, 0xC5, 0xA2, 0xD4, + 0x68, 0xD5, 0xEA, 0xE7, 0x4E, 0xEA, 0xDE, 0xFF, 0x98, 0x10, 0x88, 0x20, + 0x79, 0x2E, 0x7C, 0x2F, 0xEA, 0x41, 0x55, 0x3D, 0xAA, 0x48, 0xF0, 0x45, + 0x9C, 0x37, 0x8C, 0x37, 0x1F, 0x1C, 0x5F, 0x22, 0x7C, 0x12, 0x80, 0x17, + 0x72, 0x0D, 0x7A, 0x0D, 0x73, 0xFF, 0x13, 0xFF, 0x1F, 0xFF, 0xD5, 0xFC, + 0xEE, 0xF9, 0xB5, 0xF6, 0xF8, 0xE9, 0x6F, 0xE6, 0x59, 0xE2, 0x89, 0xDD, + 0x2A, 0xD6, 0xF4, 0xD4, 0x8F, 0xC1, 0x66, 0xC2, 0x07, 0xB6, 0xBF, 0xB3, + 0x69, 0xC6, 0xEF, 0xC1, 0x15, 0xDE, 0x24, 0xDA, 0xAB, 0xE4, 0x1B, 0xE1, + 0x52, 0xF0, 0xB1, 0xED, 0x23, 0x0B, 0xF1, 0x06, 0xE1, 0x1B, 0xFF, 0x0F, + 0xE9, 0x1C, 0xF6, 0x0E, 0x62, 0x11, 0x0D, 0x09, 0xFF, 0x0A, 0x80, 0x07, + 0x6A, 0x0E, 0x66, 0x0C, 0xDB, 0x13, 0xE5, 0x10, 0x9F, 0x1B, 0xE5, 0x16, + 0x9D, 0x1C, 0x7C, 0x1B, 0x82, 0x21, 0x6F, 0x29, 0x27, 0x25, 0x98, 0x30, + 0x62, 0x1D, 0xD6, 0x24, 0xCD, 0x0D, 0x00, 0x15, 0x67, 0xF6, 0x2B, 0xFB, + 0x6B, 0xE1, 0xAF, 0xDE, 0x36, 0xD2, 0xD4, 0xCC, 0x39, 0xCB, 0x97, 0xBF, + 0xEF, 0xC9, 0xEE, 0xBD, 0x8A, 0xC8, 0x94, 0xCB, 0x7F, 0xD5, 0xEB, 0xE3, + 0xE6, 0xF5, 0x59, 0x03, 0xF2, 0x1C, 0x2F, 0x29, 0x1D, 0x3B, 0xDC, 0x44, + 0x90, 0x4A, 0xFC, 0x4F, 0x6E, 0x48, 0xD2, 0x4E, 0x84, 0x37, 0xDD, 0x3C, + 0x83, 0x27, 0x73, 0x22, 0x29, 0x1A, 0x77, 0x10, 0xBF, 0x05, 0x84, 0x03, + 0x45, 0xF4, 0x9B, 0xF9, 0x9D, 0xEE, 0x0F, 0xF9, 0xF5, 0xE3, 0xE3, 0xF3, + 0xA5, 0xD6, 0x3B, 0xEA, 0x67, 0xD2, 0x54, 0xE3, 0x1C, 0xC5, 0x8B, 0xD6, + 0x5A, 0xB6, 0xC4, 0xC6, 0xFE, 0xC0, 0x52, 0xC3, 0x1C, 0xD9, 0x70, 0xD2, + 0x4A, 0xEB, 0x90, 0xE3, 0xFB, 0xFA, 0x19, 0xEE, 0x8C, 0x0F, 0x7C, 0xFF, + 0xFD, 0x1C, 0x7B, 0x0F, 0x6F, 0x16, 0xFC, 0x0F, 0x7D, 0x09, 0x20, 0x0B, + 0x2D, 0x03, 0x21, 0x0A, 0xBC, 0x01, 0x59, 0x08, 0xC6, 0x0D, 0x04, 0x07, + 0xD9, 0x1E, 0x9B, 0x0C, 0xBE, 0x23, 0xC4, 0x14, 0x95, 0x26, 0xE7, 0x1A, + 0x35, 0x2F, 0xC2, 0x24, 0x9C, 0x2F, 0xA1, 0x2A, 0x9A, 0x1F, 0xB3, 0x22, + 0xDA, 0x07, 0x44, 0x12, 0x25, 0xED, 0xA5, 0xFF, 0x0E, 0xD3, 0xDA, 0xE8, + 0x15, 0xC5, 0x68, 0xD3, 0x90, 0xC6, 0x80, 0xCB, 0x3C, 0xCD, 0xC7, 0xCC, + 0xC4, 0xE2, 0x06, 0xDF, 0x00, 0x09, 0x89, 0xFE, 0xAE, 0x2D, 0x07, 0x20, + 0x9C, 0x3C, 0x71, 0x39, 0x2D, 0x40, 0x84, 0x41, 0x53, 0x41, 0x67, 0x3F, + 0x3D, 0x2D, 0x03, 0x2F, 0x2B, 0x1D, 0x1A, 0x17, 0xD3, 0x13, 0xF3, 0x05, + 0xC8, 0xFD, 0xB4, 0xFB, 0x0F, 0xF0, 0x92, 0xF4, 0xB9, 0xEF, 0xD5, 0xF2, + 0x19, 0xE9, 0xBF, 0xED, 0x6F, 0xE0, 0x5A, 0xE6, 0xDC, 0xDC, 0xF2, 0xE0, + 0x50, 0xD4, 0xC2, 0xDB, 0xC0, 0xC6, 0xE9, 0xD2, 0xD6, 0xC2, 0x74, 0xC8, + 0x80, 0xD1, 0xD1, 0xCC, 0xE2, 0xEF, 0xF2, 0xE4, 0x8A, 0x10, 0xC4, 0xFF, + 0x9F, 0x25, 0x96, 0x11, 0x86, 0x2C, 0x10, 0x1C, 0x33, 0x21, 0x7D, 0x1D, + 0xAD, 0x12, 0xA9, 0x1C, 0xB3, 0x0A, 0xD5, 0x19, 0x99, 0x00, 0x87, 0x12, + 0xE6, 0x01, 0x73, 0x0E, 0xA0, 0x0A, 0x01, 0x14, 0x0D, 0x0C, 0x58, 0x1A, + 0x9F, 0x08, 0x0F, 0x18, 0x4A, 0x0F, 0x70, 0x1A, 0xAA, 0x22, 0x9F, 0x23, + 0xD9, 0x25, 0x79, 0x20, 0x0B, 0x1C, 0xA6, 0x17, 0xDF, 0x0D, 0x33, 0x08, + 0x86, 0xEC, 0xB6, 0xE4, 0x0C, 0xD2, 0x6B, 0xC8, 0x4E, 0xC0, 0xB7, 0xB4, + 0xC6, 0xB9, 0x30, 0xAF, 0x99, 0xC7, 0xD3, 0xBF, 0xFB, 0xE3, 0xF9, 0xE2, + 0xE8, 0x0F, 0xE4, 0x0D, 0xCE, 0x2D, 0xE0, 0x2B, 0x35, 0x3D, 0xE6, 0x44, + 0x04, 0x4F, 0x85, 0x53, 0x28, 0x4C, 0x83, 0x4C, 0xED, 0x39, 0xF6, 0x3F, + 0x34, 0x2A, 0xA4, 0x30, 0x65, 0x0E, 0x24, 0x12, 0x69, 0xEE, 0x08, 0xF8, + 0xFE, 0xE5, 0xD4, 0xF1, 0x4D, 0xE7, 0x1F, 0xEC, 0x1F, 0xE4, 0x0A, 0xEB, + 0x17, 0xE7, 0x7E, 0xF4, 0x18, 0xEC, 0x5F, 0xF4, 0x92, 0xE4, 0xF0, 0xE8, + 0x77, 0xD8, 0x89, 0xD7, 0xAE, 0xDC, 0x64, 0xCF, 0x0E, 0xE8, 0x11, 0xD4, + 0x17, 0x01, 0x59, 0xE9, 0xB0, 0x1E, 0x38, 0x08, 0xAD, 0x2A, 0xE0, 0x13, + 0x1D, 0x20, 0xE7, 0x0D, 0x86, 0x0E, 0xEF, 0x0D, 0xE2, 0x05, 0x09, 0x0D, + 0xDF, 0xFE, 0xA7, 0x03, 0xBA, 0xF8, 0xCA, 0xFD, 0xCA, 0x00, 0x69, 0x06, + 0x3C, 0x0F, 0xEB, 0x18, 0x98, 0x11, 0x8A, 0x23, 0xBC, 0x12, 0x57, 0x2A, + 0x03, 0x1D, 0xE9, 0x32, 0x1F, 0x1E, 0x18, 0x31, 0xA1, 0x15, 0x2C, 0x2B, + 0xB8, 0x10, 0x33, 0x20, 0x70, 0x03, 0xE7, 0x04, 0xE1, 0xF0, 0x42, 0xE4, + 0xDD, 0xE0, 0x23, 0xC8, 0x35, 0xD8, 0x81, 0xB7, 0x04, 0xD4, 0x20, 0xAD, + 0xC3, 0xD7, 0x01, 0xBA, 0x41, 0xF4, 0xB5, 0xE2, 0xCB, 0x10, 0x66, 0x04, + 0xBA, 0x23, 0x72, 0x27, 0x8E, 0x34, 0x1C, 0x45, 0xCB, 0x3E, 0x30, 0x4D, + 0xC2, 0x36, 0xD9, 0x49, 0xCF, 0x20, 0xDF, 0x3D, 0x5D, 0x09, 0x27, 0x26, + 0x64, 0xF0, 0xB3, 0x06, 0xB1, 0xE3, 0xD3, 0xF2, 0x97, 0xF1, 0xE7, 0xF1, + 0x6B, 0xF7, 0x23, 0xED, 0x5E, 0xE5, 0xAC, 0xE7, 0x0B, 0xE8, 0x99, 0xF0, + 0x25, 0xEA, 0x37, 0xEB, 0x94, 0xE1, 0x73, 0xDE, 0x87, 0xDE, 0x2F, 0xD8, + 0x81, 0xD7, 0x57, 0xCF, 0x7D, 0xE2, 0x42, 0xD8, 0x60, 0x03, 0xE3, 0xF8, + 0xED, 0x17, 0x13, 0x0D, 0x5C, 0x1D, 0x96, 0x0F, 0x0B, 0x18, 0x5A, 0x0E, + 0xEC, 0x15, 0x18, 0x11, 0xDA, 0x15, 0x0B, 0x11, 0x7A, 0x06, 0xF5, 0x08, + 0x2B, 0xFD, 0x67, 0x06, 0x6B, 0x01, 0x10, 0x0B, 0xBE, 0x09, 0x90, 0x0E, + 0x5F, 0x13, 0x0E, 0x12, 0x09, 0x1D, 0xC9, 0x18, 0x4E, 0x23, 0x14, 0x1D, + 0xBA, 0x27, 0xDC, 0x25, 0xE3, 0x2F, 0x30, 0x31, 0xF6, 0x24, 0x03, 0x23, + 0x78, 0x04, 0x94, 0xF9, 0x74, 0xE5, 0xBE, 0xD4, 0xD2, 0xC4, 0x71, 0xBC, + 0x4D, 0xB0, 0x95, 0xAF, 0xAA, 0xAA, 0x1F, 0xAE, 0x3E, 0xBA, 0x35, 0xC8, + 0x62, 0xE6, 0xD0, 0xF2, 0x91, 0x0E, 0xBB, 0x13, 0x5F, 0x2B, 0x49, 0x31, + 0x16, 0x41, 0x1B, 0x3F, 0x01, 0x46, 0x91, 0x3C, 0x0C, 0x36, 0xEB, 0x31, + 0x5F, 0x1F, 0x70, 0x22, 0x52, 0x0D, 0x7D, 0x0B, 0x03, 0xF5, 0xF1, 0xED, + 0x28, 0xEB, 0xAA, 0xE3, 0x46, 0xF0, 0x89, 0xE5, 0x0A, 0xE8, 0x19, 0xE6, + 0x0B, 0xE5, 0x35, 0xF1, 0x8F, 0xEC, 0x7D, 0xF7, 0xD5, 0xEB, 0x14, 0xEF, + 0x28, 0xE8, 0x16, 0xE8, 0xD0, 0xE1, 0x64, 0xE2, 0xB6, 0xDB, 0x7B, 0xDC, + 0xED, 0xE8, 0x7C, 0xE5, 0xE6, 0x07, 0x5B, 0x06, 0x5A, 0x1D, 0xD5, 0x1D, + 0xA8, 0x0E, 0x96, 0x12, 0x0D, 0xFC, 0x4D, 0x07, 0x88, 0xFE, 0xBE, 0x06, + 0xA6, 0xF9, 0xD4, 0xFF, 0x63, 0xEE, 0x93, 0xF6, 0xD3, 0xF0, 0xE2, 0xF7, + 0x6E, 0x06, 0x02, 0x06, 0xF6, 0x1C, 0xB9, 0x11, 0x37, 0x1E, 0x1E, 0x0E, + 0x47, 0x15, 0x43, 0x06, 0x2E, 0x11, 0x3F, 0x04, 0xD4, 0x15, 0x19, 0x06, + 0xD7, 0x1C, 0xFA, 0x09, 0x40, 0x14, 0xED, 0x04, 0x22, 0x01, 0xCF, 0xF1, + 0x78, 0xE5, 0x0D, 0xDC, 0xCA, 0xC2, 0x32, 0xC5, 0x7D, 0xB0, 0x35, 0xAF, + 0x89, 0xA9, 0x08, 0xA7, 0xF4, 0xB7, 0x29, 0xB9, 0x87, 0xE6, 0x92, 0xE8, + 0x4F, 0x12, 0xFA, 0x1C, 0x3B, 0x2F, 0x79, 0x44, 0xEA, 0x40, 0xAF, 0x56, + 0x7E, 0x47, 0xC0, 0x58, 0xC6, 0x3E, 0x31, 0x51, 0x1B, 0x32, 0xBC, 0x3F, + 0xFF, 0x20, 0xF6, 0x21, 0x5B, 0xFF, 0x2C, 0xFD, 0xF9, 0xE8, 0x72, 0xE9, + 0x91, 0xDB, 0xE2, 0xDD, 0x08, 0xD0, 0xF3, 0xD6, 0xFF, 0xD5, 0xD8, 0xDB, + 0x9D, 0xDF, 0xB0, 0xE4, 0x12, 0xE4, 0x08, 0xEE, 0xDF, 0xE6, 0x0C, 0xF6, + 0xDA, 0xDE, 0xD2, 0xEF, 0x6A, 0xD4, 0xA0, 0xDE, 0x16, 0xE3, 0xD1, 0xE4, + 0xFD, 0x09, 0x10, 0x01, 0xEB, 0x23, 0xCF, 0x13, 0x89, 0x26, 0x2E, 0x18, + 0x33, 0x1E, 0x94, 0x10, 0x4E, 0x12, 0xA3, 0x05, 0x9F, 0xFE, 0x50, 0xF9, + 0xCC, 0xF2, 0x86, 0xF3, 0x6B, 0xF5, 0xA6, 0xF8, 0xB8, 0x01, 0xFA, 0x04, + 0x12, 0x1C, 0x67, 0x1B, 0x92, 0x25, 0xAD, 0x1F, 0x21, 0x16, 0x52, 0x0E, + 0xF3, 0x0E, 0xE9, 0x06, 0x41, 0x12, 0xE3, 0x04, 0xD8, 0x0C, 0xE1, 0x04, + 0x37, 0x02, 0xF6, 0x06, 0xFB, 0xEF, 0x31, 0xFB, 0x24, 0xD4, 0x4F, 0xDF, + 0x1E, 0xBF, 0xF4, 0xBB, 0x7A, 0xB3, 0xDA, 0xA4, 0x17, 0xB1, 0xBB, 0xAA, + 0xBF, 0xC2, 0x66, 0xC8, 0x4D, 0xEE, 0xBE, 0xF7, 0x4E, 0x25, 0x40, 0x31, + 0xAB, 0x4B, 0x19, 0x53, 0xE3, 0x58, 0x78, 0x55, 0x34, 0x57, 0x9B, 0x50, + 0xB0, 0x47, 0x1B, 0x45, 0xFE, 0x28, 0x33, 0x2C, 0x44, 0x09, 0x69, 0x11, + 0x19, 0xF4, 0xBD, 0xFA, 0x1D, 0xE9, 0x16, 0xE4, 0x78, 0xE0, 0x9B, 0xCE, + 0xF6, 0xDA, 0xED, 0xC3, 0xBB, 0xDC, 0x2F, 0xC9, 0xB4, 0xE1, 0x91, 0xD8, + 0xED, 0xE5, 0xF7, 0xE5, 0x42, 0xE8, 0xD9, 0xEA, 0xBC, 0xE2, 0x93, 0xDE, + 0x2B, 0xE1, 0x69, 0xD0, 0x0D, 0xEA, 0x3F, 0xD6, 0xBB, 0x07, 0xC2, 0xF4, + 0xE2, 0x1E, 0x1B, 0x14, 0x2F, 0x1A, 0x33, 0x1E, 0xEE, 0x1B, 0x4C, 0x26, + 0x1E, 0x17, 0x21, 0x29, 0x4E, 0x07, 0xD8, 0x1B, 0xFC, 0xFA, 0x89, 0x0D, + 0xFF, 0xF8, 0x80, 0x0A, 0x86, 0xF9, 0xA5, 0x08, 0x46, 0xFC, 0x1F, 0x0A, + 0x5C, 0x01, 0xFB, 0x0E, 0x00, 0xFE, 0xDA, 0x0D, 0x1F, 0x05, 0x45, 0x0D, + 0x0C, 0x0D, 0x45, 0x0D, 0x61, 0x0B, 0x49, 0x0F, 0x9A, 0x04, 0x5C, 0x07, + 0xDB, 0xE5, 0x52, 0xE4, 0xBB, 0xC2, 0xA3, 0xBD, 0xA2, 0xB3, 0x56, 0xA5, + 0x4B, 0xAE, 0x88, 0x9C, 0xBE, 0xBE, 0x22, 0xB1, 0xB5, 0xE9, 0x9A, 0xE0, + 0xDC, 0x20, 0xEE, 0x19, 0xC1, 0x4D, 0x10, 0x48, 0x03, 0x5F, 0xA9, 0x5F, + 0xB5, 0x56, 0xF6, 0x5C, 0xA8, 0x41, 0xC0, 0x46, 0xC1, 0x2E, 0x2B, 0x2C, + 0x83, 0x15, 0x4D, 0x13, 0xE0, 0xFA, 0x12, 0x03, 0x3A, 0xEB, 0x89, 0xF4, + 0x04, 0xDF, 0xD3, 0xE7, 0x2D, 0xD2, 0x50, 0xDF, 0x6C, 0xCC, 0xDD, 0xDA, + 0xA1, 0xCD, 0xA4, 0xE0, 0x3A, 0xDB, 0x89, 0xF0, 0x5C, 0xEE, 0xF4, 0xFE, + 0x0F, 0xF4, 0x47, 0xFC, 0xA0, 0xF3, 0x31, 0xEE, 0x85, 0xF5, 0x05, 0xE5, + 0xC0, 0x04, 0x2C, 0xE9, 0x1C, 0x1A, 0x6B, 0xF5, 0x38, 0x20, 0x30, 0xFB, + 0x9A, 0x1A, 0xA1, 0xFB, 0x82, 0x12, 0x14, 0xFD, 0x63, 0x07, 0x2C, 0xFC, + 0x10, 0xFB, 0x92, 0xFC, 0xA9, 0xF2, 0x4F, 0xFB, 0x34, 0xEF, 0x21, 0xFC, + 0xF6, 0xF5, 0xCC, 0x08, 0x46, 0x01, 0x28, 0x12, 0xF3, 0x02, 0x61, 0x11, + 0xDD, 0x01, 0x4E, 0x10, 0x72, 0x0B, 0x3E, 0x19, 0xB8, 0x18, 0x13, 0x27, + 0xA5, 0x1D, 0x0B, 0x26, 0x74, 0x15, 0xED, 0x17, 0x03, 0xFA, 0x64, 0xF7, + 0xDE, 0xCE, 0x96, 0xC5, 0x29, 0xB2, 0xDA, 0xA9, 0xB7, 0xB6, 0xEC, 0xAF, + 0x0F, 0xCE, 0x8C, 0xC7, 0x3E, 0xF5, 0xB8, 0xF0, 0x5E, 0x29, 0x2A, 0x2B, + 0x2B, 0x52, 0x6C, 0x58, 0x1C, 0x58, 0x62, 0x5B, 0xB2, 0x4C, 0x3E, 0x4C, + 0xC8, 0x3D, 0xA5, 0x3A, 0xA7, 0x1D, 0x43, 0x1D, 0xB1, 0xFA, 0x0E, 0xFE, + 0xFE, 0xE6, 0x47, 0xEF, 0x54, 0xD8, 0x80, 0xE6, 0xEF, 0xCF, 0x6D, 0xDC, + 0x5B, 0xCF, 0xA1, 0xD6, 0x83, 0xCF, 0xAF, 0xD4, 0x74, 0xD4, 0xA7, 0xD7, + 0x11, 0xE5, 0xD5, 0xE1, 0x0E, 0xF1, 0xBD, 0xEA, 0xBB, 0xEF, 0x3E, 0xEC, + 0x3B, 0xEB, 0xF9, 0xE8, 0x4F, 0xF2, 0x9C, 0xEC, 0x0B, 0x0B, 0xB2, 0xFC, + 0x46, 0x24, 0x43, 0x0C, 0x6E, 0x27, 0x3B, 0x0B, 0xE6, 0x1A, 0x81, 0x02, + 0x2D, 0x12, 0xBE, 0x06, 0xC9, 0xFC, 0x03, 0x01, 0x0E, 0xE9, 0x49, 0xF2, + 0x98, 0xEF, 0x5A, 0xF4, 0x0F, 0x00, 0x8D, 0x02, 0x52, 0x0C, 0x4B, 0x0C, + 0x6E, 0x13, 0x88, 0x0F, 0xA6, 0x0F, 0x1C, 0x0F, 0x23, 0x08, 0x94, 0x0C, + 0x07, 0x0A, 0xDF, 0x10, 0x61, 0x0E, 0xD0, 0x17, 0x98, 0x16, 0xA4, 0x1B, + 0xF3, 0x16, 0x63, 0x12, 0xF0, 0xFC, 0x98, 0xF4, 0xF8, 0xD5, 0xEA, 0xD0, + 0x54, 0xB1, 0xC9, 0xB6, 0x94, 0xAB, 0x28, 0xBA, 0x6D, 0xC7, 0x15, 0xD6, + 0x27, 0xF5, 0x3B, 0x01, 0xF9, 0x2E, 0xA0, 0x36, 0x2A, 0x55, 0x94, 0x57, + 0x53, 0x5B, 0x1E, 0x5A, 0xE8, 0x4D, 0xEA, 0x4A, 0xA6, 0x36, 0xC9, 0x31, + 0x58, 0x14, 0xA0, 0x14, 0x24, 0xF3, 0x21, 0xFA, 0xB9, 0xE7, 0x31, 0xE8, + 0x99, 0xE5, 0xD8, 0xDD, 0x61, 0xE7, 0xD7, 0xD9, 0x2C, 0xE4, 0x71, 0xD3, + 0xFF, 0xDF, 0x74, 0xCF, 0xA1, 0xE8, 0xBE, 0xDA, 0x50, 0xF0, 0xE0, 0xEA, + 0x88, 0xEE, 0xA3, 0xEF, 0xAE, 0xEF, 0x4F, 0xF1, 0xA2, 0xF3, 0x0B, 0xF2, + 0xBD, 0xF7, 0xB1, 0xEF, 0x00, 0x0E, 0x01, 0x00, 0x5E, 0x24, 0xC4, 0x18, + 0xBE, 0x1A, 0x87, 0x1B, 0xBF, 0x03, 0x39, 0x12, 0x08, 0xF9, 0x59, 0x0C, + 0x20, 0xEC, 0x07, 0x00, 0xF5, 0xE1, 0x74, 0xF6, 0x5E, 0xE9, 0x3F, 0xF8, + 0xA2, 0xFC, 0xCF, 0x04, 0x87, 0x0B, 0x04, 0x13, 0x16, 0x10, 0xD4, 0x16, + 0x5A, 0x16, 0xD2, 0x12, 0x5E, 0x18, 0xD6, 0x09, 0xB0, 0x17, 0x78, 0x06, + 0x24, 0x1E, 0xE7, 0x0C, 0x60, 0x1F, 0x6C, 0x13, 0x81, 0x0C, 0xD9, 0x06, + 0xD2, 0xED, 0x4B, 0xE9, 0xF2, 0xCD, 0x63, 0xC6, 0xC2, 0xBA, 0xFA, 0xAC, + 0x42, 0xC7, 0xE0, 0xB9, 0x7C, 0xEB, 0xB8, 0xDF, 0x69, 0x12, 0x32, 0x07, + 0x43, 0x3D, 0x3A, 0x35, 0xDD, 0x56, 0xDE, 0x50, 0x30, 0x4D, 0x48, 0x4C, + 0x41, 0x3A, 0x84, 0x3C, 0x2D, 0x1C, 0xC5, 0x22, 0xC6, 0xF6, 0x83, 0x08, + 0xD1, 0xDD, 0xD3, 0xF8, 0x9E, 0xD7, 0x44, 0xF2, 0x7D, 0xD9, 0x6E, 0xEA, + 0xF3, 0xDB, 0x68, 0xE3, 0x8C, 0xE3, 0xA6, 0xE6, 0x7F, 0xE8, 0xBA, 0xEC, + 0xF9, 0xE9, 0xA6, 0xF3, 0xEC, 0xEC, 0x7B, 0xFC, 0xFD, 0xEF, 0xD6, 0x01, + 0x9C, 0xED, 0xA9, 0xF7, 0x23, 0xF0, 0x39, 0xEA, 0x54, 0x05, 0x8D, 0xF4, + 0x4E, 0x1E, 0x94, 0x0B, 0xA5, 0x1D, 0x18, 0x11, 0x4A, 0x13, 0xA0, 0x0D, + 0x5E, 0x0E, 0x49, 0x0A, 0x96, 0x03, 0x0E, 0x03, 0xA3, 0xF0, 0x82, 0xF6, + 0xB6, 0xE7, 0xA5, 0xF5, 0x7F, 0xF1, 0x59, 0x05, 0x5A, 0xFF, 0xCF, 0x0E, + 0xCF, 0x11, 0x21, 0x13, 0xA0, 0x20, 0xCB, 0x17, 0x9D, 0x23, 0x60, 0x19, + 0x0D, 0x1F, 0xD3, 0x14, 0xEF, 0x1F, 0x3F, 0x13, 0x8C, 0x20, 0x15, 0x14, + 0x29, 0x0C, 0x74, 0x06, 0xBF, 0xF0, 0x9D, 0xEB, 0x74, 0xD3, 0xFF, 0xCD, + 0x4E, 0xB5, 0xCE, 0xB4, 0xCA, 0xAC, 0xF4, 0xAB, 0xA9, 0xC5, 0x6E, 0xC6, + 0x3B, 0xEE, 0x0C, 0xF9, 0xCC, 0x1B, 0xD1, 0x2D, 0xEB, 0x4A, 0xF8, 0x54, + 0x3A, 0x60, 0xE4, 0x5E, 0x12, 0x56, 0xE0, 0x52, 0x4D, 0x38, 0xAE, 0x35, + 0x45, 0x13, 0x32, 0x10, 0x73, 0xF4, 0xA9, 0xF0, 0x23, 0xE1, 0xB4, 0xDE, + 0xD8, 0xD9, 0x86, 0xD8, 0x37, 0xDA, 0xAB, 0xD8, 0x41, 0xE2, 0x99, 0xE0, + 0xDF, 0xE5, 0xDD, 0xE3, 0x50, 0xE6, 0xD3, 0xE5, 0x47, 0xEE, 0x68, 0xED, + 0x1B, 0xF3, 0x2A, 0xF7, 0x3E, 0xF2, 0x64, 0xFA, 0xB1, 0xF2, 0xDF, 0xF0, + 0xBA, 0xFA, 0x00, 0xEE, 0x63, 0x14, 0x9E, 0x02, 0xD7, 0x2B, 0xDE, 0x17, + 0xD0, 0x24, 0xD4, 0x13, 0x6C, 0x16, 0x53, 0x0E, 0x23, 0x10, 0x59, 0x11, + 0x17, 0x02, 0x59, 0x0E, 0x28, 0xF0, 0x02, 0x04, 0xB2, 0xEC, 0x25, 0xFD, + 0x71, 0xFC, 0xBF, 0x03, 0x81, 0x0F, 0x72, 0x0D, 0x18, 0x13, 0x46, 0x10, + 0x0F, 0x09, 0x5E, 0x0E, 0x39, 0xFD, 0xAD, 0x0B, 0xAB, 0xFA, 0x46, 0x09, + 0x06, 0x01, 0x94, 0x09, 0x73, 0x01, 0x6F, 0x09, 0xC2, 0xF6, 0x45, 0x00, + 0xD0, 0xE0, 0x53, 0xEA, 0xC2, 0xCB, 0x1C, 0xD1, 0x20, 0xBB, 0x69, 0xBA, + 0x23, 0xB5, 0x9C, 0xB2, 0xD4, 0xCE, 0xB5, 0xC8, 0xA1, 0xFC, 0xC2, 0xF3, + 0x5A, 0x2C, 0xE8, 0x29, 0x97, 0x50, 0xBB, 0x52, 0xEB, 0x5A, 0x25, 0x59, + 0x54, 0x4F, 0x37, 0x49, 0x1B, 0x33, 0x40, 0x2C, 0xEA, 0x0C, 0x15, 0x05, + 0x5A, 0xEE, 0xFE, 0xE5, 0xC2, 0xDB, 0x33, 0xD7, 0x96, 0xD6, 0x51, 0xD5, + 0x34, 0xDA, 0xFB, 0xD9, 0x06, 0xE3, 0x3C, 0xE4, 0x61, 0xEA, 0x52, 0xEB, + 0x6B, 0xEA, 0x65, 0xED, 0x42, 0xEA, 0xB7, 0xF5, 0x8C, 0xF1, 0x3F, 0x02, + 0x75, 0xF5, 0x5E, 0x05, 0x90, 0xEE, 0xC3, 0xFD, 0x06, 0xF7, 0x71, 0xFF, + 0xBD, 0x10, 0x75, 0x0D, 0x96, 0x23, 0x43, 0x1A, 0xB3, 0x25, 0x61, 0x1B, + 0xA1, 0x1C, 0x25, 0x12, 0x9F, 0x0C, 0xE0, 0x05, 0x30, 0xFB, 0x6D, 0xFD, + 0x63, 0xED, 0x3B, 0xF1, 0x82, 0xEF, 0xA9, 0xEC, 0x80, 0x01, 0x62, 0x00, + 0xAC, 0x10, 0x92, 0x16, 0x85, 0x16, 0xA5, 0x1D, 0xE6, 0x10, 0xEC, 0x19, + 0x4F, 0x0A, 0x9D, 0x16, 0x1A, 0x09, 0x27, 0x0F, 0xB4, 0x05, 0xB6, 0x07, + 0x5A, 0x01, 0x6E, 0x09, 0xCE, 0xFC, 0x1E, 0x05, 0x2E, 0xF5, 0xBB, 0xF2, + 0xDE, 0xE5, 0x34, 0xD6, 0x03, 0xCF, 0xB0, 0xBD, 0x76, 0xC3, 0xF2, 0xB7, + 0xB9, 0xD3, 0x8B, 0xC9, 0xDD, 0xFC, 0x44, 0xF5, 0xA4, 0x2F, 0xC9, 0x2E, + 0x4C, 0x52, 0x31, 0x58, 0xE5, 0x55, 0xF7, 0x5F, 0xE3, 0x42, 0xF2, 0x44, + 0x01, 0x2D, 0xC1, 0x1B, 0x15, 0x07, 0xF0, 0xF2, 0x63, 0xD8, 0x2B, 0xD4, + 0x1C, 0xC5, 0x46, 0xCD, 0x3F, 0xC6, 0x41, 0xD7, 0x42, 0xCD, 0xDB, 0xDF, + 0x63, 0xE1, 0xC3, 0xE8, 0x84, 0xED, 0xB5, 0xEE, 0x3E, 0xEC, 0x62, 0xF0, + 0xA7, 0xF4, 0xD5, 0xFA, 0x3F, 0xFA, 0x8E, 0x04, 0xD7, 0xF7, 0x68, 0x04, + 0x86, 0xEE, 0xC8, 0xF8, 0xEE, 0xF6, 0x45, 0xF9, 0xB3, 0x15, 0xBB, 0x0A, + 0x48, 0x29, 0xDB, 0x18, 0x0D, 0x28, 0x55, 0x1A, 0x18, 0x13, 0xBF, 0x0E, + 0x91, 0xF7, 0x29, 0x04, 0xC4, 0xE8, 0xD7, 0xFC, 0x05, 0xE5, 0x98, 0xF2, + 0x62, 0xE8, 0xA7, 0xEF, 0x9B, 0xFD, 0xF1, 0xFF, 0x8A, 0x15, 0x07, 0x12, + 0x75, 0x1C, 0x86, 0x16, 0xCB, 0x16, 0x3F, 0x0F, 0xF5, 0x0C, 0x9D, 0x04, + 0x7F, 0x02, 0xA4, 0xFA, 0xF9, 0x00, 0x03, 0xF9, 0x6D, 0x09, 0x0B, 0x01, + 0x6E, 0x05, 0x27, 0xFB, 0xA2, 0xFA, 0xBB, 0xEA, 0xE1, 0xE7, 0x3A, 0xD0, + 0x04, 0xC9, 0x6F, 0xB3, 0xF4, 0xBB, 0x2A, 0xB2, 0x4B, 0xCF, 0xBF, 0xD0, + 0xAE, 0xF5, 0x16, 0x00, 0x66, 0x27, 0x70, 0x33, 0x60, 0x50, 0xF2, 0x56, + 0x32, 0x56, 0xF1, 0x55, 0xFC, 0x47, 0x7B, 0x3D, 0xBC, 0x2D, 0x44, 0x1D, + 0xE7, 0xFE, 0xE2, 0xF6, 0x0C, 0xD5, 0x76, 0xD7, 0xFF, 0xBE, 0x48, 0xC8, + 0xF4, 0xC2, 0x38, 0xCF, 0xCD, 0xDA, 0xA3, 0xE1, 0x4E, 0xE8, 0x68, 0xED, + 0x4B, 0xF2, 0xD1, 0xF8, 0x12, 0xFB, 0x04, 0x00, 0x71, 0xF9, 0x61, 0x00, + 0x1D, 0xF9, 0x54, 0x00, 0x32, 0xF9, 0xFD, 0xF9, 0xF5, 0xF8, 0x11, 0xF0, + 0x06, 0x0C, 0xC9, 0xF2, 0xEF, 0x2D, 0xCE, 0x05, 0xA4, 0x3A, 0x79, 0x17, + 0x3C, 0x2A, 0x45, 0x1A, 0x56, 0x08, 0x3C, 0x0C, 0x19, 0xEB, 0xC2, 0xFD, + 0x71, 0xDD, 0x06, 0xF5, 0x94, 0xD4, 0xEE, 0xEB, 0x21, 0xD5, 0x4C, 0xF0, + 0x0D, 0xE8, 0x3F, 0x09, 0xCC, 0x05, 0x4A, 0x20, 0xE7, 0x0E, 0x85, 0x18, + 0x8B, 0x0A, 0xFC, 0x08, 0x73, 0x0B, 0x7B, 0x07, 0xAB, 0x03, 0x44, 0xFD, + 0x78, 0xFC, 0x21, 0xF2, 0xF9, 0x06, 0x0F, 0xFB, 0xC5, 0x0D, 0x33, 0xFB, + 0x82, 0x00, 0xAA, 0xE4, 0x3D, 0xE9, 0x71, 0xCD, 0x47, 0xD4, 0x4C, 0xBE, + 0xCF, 0xCB, 0x6B, 0xBB, 0x66, 0xDA, 0xA2, 0xD5, 0xAC, 0x03, 0x99, 0x09, + 0xA9, 0x34, 0xB2, 0x3A, 0xF9, 0x54, 0x20, 0x57, 0x85, 0x59, 0xE6, 0x54, + 0xBD, 0x47, 0x72, 0x3D, 0x8F, 0x1E, 0x21, 0x1A, 0x67, 0xE9, 0x1B, 0xEF, + 0x2E, 0xCC, 0x16, 0xD3, 0x7D, 0xCE, 0xB2, 0xD3, 0xB6, 0xD9, 0x52, 0xE5, + 0xC8, 0xE4, 0xDD, 0xF5, 0x62, 0xF0, 0xD7, 0xFD, 0xAC, 0xF9, 0x72, 0x01, + 0x4F, 0xF8, 0x82, 0xFD, 0x43, 0xF3, 0x11, 0xF9, 0xDE, 0xF0, 0x41, 0xF9, + 0xA4, 0xE5, 0x0D, 0xF1, 0x48, 0xE7, 0x4F, 0xEF, 0xBA, 0x08, 0xD9, 0x05, + 0x7E, 0x2C, 0x97, 0x20, 0x01, 0x33, 0x20, 0x27, 0xDC, 0x27, 0x0C, 0x1D, + 0x39, 0x15, 0xD7, 0x0E, 0x70, 0xF7, 0x56, 0x00, 0x9A, 0xE0, 0x71, 0xF5, + 0xEC, 0xDB, 0xBE, 0xF3, 0x60, 0xE9, 0xA8, 0xFC, 0x0A, 0x0B, 0x3D, 0x0D, + 0x74, 0x23, 0xDD, 0x11, 0xDE, 0x1E, 0xBB, 0x0A, 0x8E, 0x11, 0x7C, 0x07, + 0x0F, 0xFE, 0x7E, 0xFE, 0xA8, 0xEF, 0x63, 0xF6, 0x08, 0xF2, 0xAE, 0xF4, + 0xDC, 0xEF, 0x5E, 0xEB, 0xD3, 0xE2, 0x23, 0xDF, 0x33, 0xCD, 0x27, 0xCB, + 0x2C, 0xB3, 0xB5, 0xAC, 0xF6, 0xA6, 0xA8, 0x9F, 0x07, 0xB5, 0x33, 0xB1, + 0x16, 0xDE, 0x8E, 0xD9, 0x3A, 0x16, 0x81, 0x10, 0xD2, 0x46, 0x0C, 0x47, + 0x86, 0x5A, 0xE6, 0x5E, 0xC5, 0x51, 0x7F, 0x4E, 0x62, 0x32, 0xC6, 0x28, + 0xAE, 0xFF, 0x87, 0xFE, 0x98, 0xD9, 0x18, 0xE2, 0x2D, 0xC9, 0xE8, 0xD5, + 0x75, 0xC8, 0x78, 0xD6, 0x4C, 0xE2, 0x73, 0xEE, 0xF3, 0xF7, 0xB3, 0x02, + 0xB1, 0xFE, 0xE5, 0x04, 0xBA, 0x0C, 0x4B, 0x0A, 0x51, 0x05, 0x0E, 0x03, + 0x8C, 0xF1, 0x1A, 0xF6, 0x74, 0xEE, 0x1A, 0xF3, 0x72, 0xEE, 0x9A, 0xEE, + 0x5E, 0xFB, 0x31, 0xF1, 0xD6, 0x18, 0x47, 0x07, 0xEA, 0x2C, 0xB0, 0x1F, + 0xE6, 0x2D, 0x8C, 0x2A, 0x68, 0x1B, 0x74, 0x24, 0x54, 0xFB, 0x96, 0x0F, + 0x17, 0xE5, 0xBF, 0xFC, 0x12, 0xE2, 0xC6, 0xF7, 0x76, 0xEA, 0xE1, 0xFA, + 0xD1, 0x02, 0x29, 0x06, 0x10, 0x24, 0x7D, 0x1A, 0x88, 0x2C, 0x0E, 0x1E, + 0x93, 0x23, 0x0F, 0x16, 0xA6, 0x22, 0x42, 0x15, 0x3A, 0x19, 0x17, 0x0B, + 0x2B, 0x05, 0xA4, 0xF5, 0xE9, 0x02, 0x27, 0xF4, 0xF4, 0xFF, 0x34, 0xFA, + 0x44, 0xEC, 0x09, 0xF2, 0x64, 0xD9, 0x16, 0xE4, 0xC1, 0xC9, 0xDD, 0xD4, + 0x41, 0xC6, 0x77, 0xCF, 0x70, 0xD5, 0xC4, 0xE0, 0xA6, 0xFA, 0xEF, 0x07, + 0x37, 0x37, 0xCA, 0x39, 0xE6, 0x5C, 0xDE, 0x57, 0x45, 0x5C, 0x7C, 0x5C, + 0x95, 0x52, 0xFD, 0x51, 0xB9, 0x36, 0x6B, 0x2D, 0xC3, 0x0A, 0xCF, 0xFF, + 0xED, 0xE9, 0x45, 0xE1, 0xDA, 0xDA, 0xEC, 0xD7, 0x57, 0xDF, 0xBF, 0xE4, + 0xA0, 0xF1, 0x8A, 0xFD, 0xF5, 0x01, 0xCF, 0x0D, 0x08, 0x08, 0x1A, 0x0F, + 0x0C, 0x02, 0x10, 0x0B, 0x60, 0xF5, 0xCC, 0x04, 0x7E, 0xEC, 0x95, 0xFE, + 0xDB, 0xE9, 0xFB, 0xF9, 0x2D, 0xEE, 0x05, 0xF5, 0xB6, 0x01, 0xF9, 0xFA, + 0x5A, 0x1F, 0x38, 0x15, 0xF0, 0x35, 0xF1, 0x28, 0x53, 0x38, 0x10, 0x21, + 0xEA, 0x29, 0x74, 0x10, 0x14, 0x0B, 0x0D, 0xFB, 0x67, 0xE9, 0xD5, 0xE3, + 0x03, 0xD7, 0x79, 0xD6, 0x55, 0xD7, 0x1B, 0xD5, 0xBE, 0xEF, 0x6A, 0xEA, + 0x6B, 0x07, 0x6B, 0x02, 0xC0, 0x09, 0x76, 0x09, 0xBC, 0xFF, 0x43, 0x0A, + 0x90, 0xF8, 0xEF, 0x07, 0xFE, 0xEF, 0x63, 0xFE, 0x0E, 0xE3, 0x2F, 0xF9, + 0xF3, 0xDE, 0x3B, 0xFB, 0x85, 0xEA, 0x66, 0xFA, 0x2C, 0xEE, 0x42, 0xED, + 0xEA, 0xDD, 0x3F, 0xCF, 0x54, 0xC8, 0x28, 0xB5, 0x68, 0xB4, 0xB0, 0xAD, + 0x55, 0xB7, 0x46, 0xC1, 0x78, 0xDE, 0x12, 0xEF, 0x7F, 0x1B, 0xE0, 0x28, + 0xA3, 0x4C, 0x3B, 0x51, 0x55, 0x5F, 0x21, 0x5C, 0xFD, 0x53, 0x23, 0x49, + 0x15, 0x29, 0xE9, 0x14, 0x36, 0xF0, 0xC5, 0xDE, 0x79, 0xC1, 0x87, 0xBD, + 0xB0, 0xA8, 0xAB, 0xB3, 0x3E, 0xAE, 0x33, 0xC2, 0x97, 0xCC, 0x6F, 0xDC, + 0x31, 0xE5, 0xE6, 0xEC, 0x19, 0xE9, 0x26, 0xF1, 0x26, 0xED, 0xF7, 0xF6, + 0x11, 0xEC, 0x5D, 0xF7, 0x63, 0xDC, 0xF9, 0xE9, 0x5A, 0xD9, 0x60, 0xDF, + 0xA0, 0xE3, 0x93, 0xDD, 0xD9, 0xF8, 0x8A, 0xEA, 0xA3, 0x16, 0xB3, 0x01, + 0x6A, 0x24, 0x3C, 0x0C, 0xC9, 0x1F, 0x49, 0x10, 0x92, 0x0B, 0x20, 0x0D, + 0xE2, 0xF3, 0x13, 0x03, 0x81, 0xE9, 0xD5, 0xF9, 0x9E, 0xE1, 0xE7, 0xEC, + 0x1A, 0xE9, 0xA8, 0xEE, 0xEA, 0x03, 0x6F, 0x04, 0x60, 0x0F, 0x9C, 0x0F, + 0x6D, 0x14, 0xE8, 0x13, 0xAA, 0x19, 0xC5, 0x13, 0x34, 0x14, 0xA5, 0x0D, + 0x79, 0x0B, 0x86, 0x0C, 0x0A, 0x08, 0xD9, 0x10, 0x88, 0x07, 0xD1, 0x12, + 0xA8, 0x07, 0x79, 0x08, 0xA6, 0x04, 0x31, 0xF6, 0x32, 0xFC, 0xE3, 0xE5, + 0xD0, 0xEB, 0x74, 0xD6, 0x30, 0xE7, 0xEE, 0xD7, 0x42, 0x00, 0x90, 0xF9, + 0x0E, 0x29, 0x0E, 0x27, 0xCE, 0x4D, 0xAF, 0x4C, 0x07, 0x5E, 0x0F, 0x5C, + 0xB5, 0x59, 0x03, 0x57, 0xC0, 0x42, 0x6D, 0x3F, 0x49, 0x1E, 0x05, 0x18, + 0x74, 0xF2, 0x1D, 0xF1, 0x66, 0xD1, 0xED, 0xDA, 0x82, 0xC5, 0xDF, 0xD4, + 0x91, 0xD2, 0xCD, 0xE8, 0x28, 0xF4, 0x58, 0x11, 0xA3, 0x10, 0xD4, 0x28, + 0xF0, 0x11, 0x2E, 0x27, 0xC9, 0x09, 0x46, 0x1C, 0xCE, 0x07, 0x0B, 0x0C, + 0x66, 0x00, 0xF9, 0xFB, 0x28, 0xFC, 0x47, 0xF2, 0xE9, 0x04, 0xDA, 0xEC, + 0x82, 0x0E, 0xEE, 0xF2, 0xD9, 0x23, 0x22, 0x0D, 0x2A, 0x3D, 0x06, 0x24, + 0x5D, 0x2D, 0x0E, 0x1E, 0x04, 0x09, 0x31, 0x0A, 0x85, 0xF4, 0x02, 0xFA, + 0xB4, 0xE4, 0xB4, 0xED, 0x21, 0xD2, 0x3C, 0xE1, 0x0E, 0xD9, 0xB5, 0xE4, + 0x29, 0xF9, 0x8F, 0xFE, 0xFD, 0x0D, 0xB1, 0x0B, 0x1D, 0x10, 0xFA, 0x05, + 0x03, 0x0C, 0xF5, 0x00, 0xDC, 0xFF, 0x57, 0xF6, 0x14, 0xF0, 0xF9, 0xE9, + 0xD3, 0xED, 0x2B, 0xEB, 0x71, 0xF7, 0x3F, 0xEC, 0xE9, 0xFE, 0xD7, 0xE8, + 0xCF, 0xEF, 0xF4, 0xDF, 0xC6, 0xD3, 0xC9, 0xCB, 0x8B, 0xC5, 0xE3, 0xBD, + 0xAB, 0xC2, 0xD9, 0xBE, 0x3E, 0xD0, 0x18, 0xD2, 0x6F, 0xFF, 0x52, 0x03, + 0x92, 0x30, 0x90, 0x3B, 0x85, 0x46, 0x97, 0x59, 0x30, 0x47, 0x01, 0x58, + 0xD7, 0x31, 0x8F, 0x39, 0xC5, 0x00, 0x94, 0x03, 0x2B, 0xCE, 0x9E, 0xD4, + 0xB1, 0xBF, 0x4F, 0xC9, 0xA0, 0xC2, 0x33, 0xCD, 0xC6, 0xCB, 0xB3, 0xDB, + 0xC9, 0xE4, 0xE8, 0xF8, 0xB3, 0xFC, 0x92, 0x0A, 0x67, 0x0A, 0x4D, 0x12, + 0xDA, 0x12, 0x2D, 0x16, 0x6C, 0xFD, 0xC1, 0xFD, 0xA9, 0xDD, 0x17, 0xE5, + 0xDA, 0xD4, 0xC7, 0xE3, 0x5F, 0xDE, 0x7C, 0xE7, 0x45, 0x00, 0xF8, 0xFC, + 0x18, 0x2B, 0xA1, 0x18, 0x85, 0x3A, 0x71, 0x1F, 0x8A, 0x34, 0x64, 0x24, + 0x6F, 0x26, 0xE7, 0x23, 0x03, 0x06, 0x7E, 0x0A, 0xCB, 0xE6, 0x0D, 0xF4, + 0xC1, 0xE2, 0x15, 0xF3, 0x74, 0xF4, 0xE6, 0xFB, 0x72, 0x12, 0x1A, 0x11, + 0xC0, 0x23, 0xAF, 0x1A, 0x17, 0x24, 0x82, 0x17, 0x96, 0x27, 0x9F, 0x1F, + 0x2E, 0x21, 0xD4, 0x1E, 0x27, 0x15, 0x5D, 0x14, 0x90, 0x11, 0x61, 0x0E, + 0x2B, 0x0D, 0x0E, 0x07, 0x8F, 0x05, 0x42, 0x02, 0x2A, 0xF3, 0xFD, 0xF4, + 0x60, 0xD3, 0xD3, 0xD3, 0xAF, 0xBD, 0x48, 0xBA, 0x6C, 0xC0, 0x9D, 0xBD, + 0xC4, 0xE0, 0x0A, 0xE7, 0x71, 0x13, 0x19, 0x21, 0x9A, 0x42, 0x37, 0x4D, + 0x87, 0x5B, 0x24, 0x60, 0x52, 0x51, 0x4E, 0x51, 0x31, 0x31, 0xFC, 0x2A, + 0x7D, 0xFB, 0xFC, 0xF6, 0xC0, 0xCD, 0x88, 0xD0, 0xFF, 0xCB, 0x2E, 0xCC, + 0x20, 0xD7, 0xD4, 0xD1, 0x8E, 0xE9, 0xD6, 0xE5, 0x1A, 0x01, 0x75, 0xFC, + 0x1A, 0x0B, 0x48, 0xFC, 0x1C, 0x11, 0x2A, 0xFC, 0x5E, 0x08, 0xF9, 0xF6, + 0xFF, 0xF6, 0xA5, 0xEC, 0x8B, 0xE7, 0xD9, 0xE4, 0x2D, 0xDE, 0x03, 0xE2, + 0x0A, 0xEE, 0x95, 0xED, 0x6D, 0x12, 0x2E, 0x09, 0x4D, 0x28, 0x3C, 0x1D, + 0x08, 0x22, 0xCC, 0x19, 0x86, 0x14, 0xDF, 0x13, 0x95, 0xFD, 0xA9, 0x06, + 0x5C, 0xDF, 0x9F, 0xED, 0x85, 0xCC, 0x94, 0xE0, 0x0B, 0xD4, 0x08, 0xEA, + 0x9B, 0xEB, 0xC5, 0xF2, 0xFC, 0x02, 0xAA, 0xFB, 0xDC, 0x0D, 0xAB, 0x01, + 0x31, 0x12, 0xD2, 0x01, 0x87, 0x10, 0x78, 0x01, 0x40, 0xF7, 0xEC, 0xEE, + 0xD5, 0xE6, 0x9C, 0xDF, 0xFC, 0xE6, 0x06, 0xE2, 0x58, 0xE2, 0xD5, 0xE1, + 0x51, 0xD0, 0x25, 0xCF, 0xB3, 0xBE, 0x49, 0xBB, 0x9E, 0xC0, 0xD1, 0xB9, + 0xC9, 0xC9, 0x5E, 0xC3, 0x61, 0xDD, 0xFC, 0xE1, 0xD1, 0x0C, 0x2F, 0x1A, + 0xF2, 0x46, 0x28, 0x4F, 0x1D, 0x62, 0x17, 0x63, 0x24, 0x5D, 0xC1, 0x5A, + 0x5C, 0x40, 0x4B, 0x3C, 0xF3, 0x0C, 0x0E, 0x09, 0x1F, 0xDD, 0x6A, 0xD9, + 0x6B, 0xCD, 0x3C, 0xC5, 0x31, 0xD3, 0xF1, 0xC7, 0x4A, 0xDD, 0x40, 0xDA, + 0x7F, 0xF7, 0x73, 0x01, 0xFE, 0x10, 0xDD, 0x20, 0x7D, 0x10, 0x48, 0x21, + 0x3E, 0x05, 0x51, 0x17, 0x89, 0xF6, 0x50, 0x09, 0x26, 0xE4, 0xF8, 0xF7, + 0x02, 0xDC, 0x74, 0xEB, 0xF1, 0xE6, 0xA4, 0xEB, 0x4D, 0xFA, 0xE3, 0xF6, + 0x3F, 0x1C, 0xB7, 0x14, 0x09, 0x46, 0xE8, 0x38, 0x45, 0x45, 0x73, 0x33, + 0x04, 0x26, 0x47, 0x13, 0x22, 0x0B, 0xDF, 0xFD, 0xF8, 0xF4, 0x03, 0xF4, + 0xEC, 0xE6, 0x08, 0xF0, 0xA8, 0xEC, 0x26, 0xF4, 0x88, 0x06, 0x75, 0xFF, + 0xB9, 0x20, 0x01, 0x0B, 0xD6, 0x2D, 0x6E, 0x15, 0x44, 0x24, 0x88, 0x10, + 0x2C, 0x13, 0x06, 0x05, 0xE3, 0x05, 0x79, 0x03, 0xDD, 0xF4, 0x01, 0x01, + 0x51, 0xEB, 0x09, 0x03, 0xA6, 0xEB, 0x99, 0x08, 0x1B, 0xE8, 0x1B, 0xFE, + 0x69, 0xE4, 0xEF, 0xEC, 0x30, 0xD9, 0xE2, 0xDC, 0x47, 0xCA, 0x3F, 0xD5, + 0x16, 0xD5, 0x92, 0xED, 0x5F, 0xFD, 0x9F, 0x1C, 0x30, 0x37, 0x57, 0x4A, + 0xE1, 0x62, 0xE0, 0x62, 0x9F, 0x5B, 0x4D, 0x4F, 0x03, 0x3C, 0x9B, 0x26, + 0xFA, 0x1E, 0xB4, 0x02, 0xB7, 0xF8, 0x1D, 0xDD, 0x1B, 0xD3, 0xAE, 0xBD, + 0xF2, 0xBC, 0x8A, 0xB2, 0x4F, 0xC7, 0x9C, 0xCA, 0xC3, 0xE6, 0x1D, 0xF3, + 0xCD, 0xFC, 0x38, 0x0B, 0x5C, 0x02, 0xD7, 0x0F, 0x71, 0xFB, 0xD3, 0x09, + 0x02, 0xED, 0x54, 0xFD, 0xC2, 0xDB, 0x65, 0xE7, 0xD8, 0xDA, 0x97, 0xDA, + 0x4D, 0xE0, 0x15, 0xD8, 0x2C, 0xE6, 0x82, 0xDD, 0x60, 0x0F, 0x6B, 0x09, + 0x6D, 0x35, 0x00, 0x32, 0xBB, 0x28, 0xA6, 0x26, 0x5D, 0x0A, 0xA0, 0x0A, + 0xC5, 0xF4, 0x2A, 0xFA, 0x20, 0xE9, 0x3C, 0xF1, 0x0C, 0xDE, 0x9E, 0xE2, + 0x9C, 0xE6, 0x4C, 0xE2, 0xE6, 0xFC, 0xC1, 0xED, 0x73, 0x09, 0x62, 0xF7, + 0x2F, 0x17, 0xB2, 0x0D, 0xDF, 0x12, 0x3C, 0x13, 0x7C, 0xFC, 0xC7, 0x02, + 0xF0, 0xEE, 0x5C, 0xFB, 0xAB, 0xE9, 0x2B, 0xFA, 0x88, 0xEB, 0xEE, 0xF8, + 0x8B, 0xFA, 0xE6, 0xFB, 0x17, 0x02, 0xA5, 0xF2, 0x87, 0xF0, 0x18, 0xD6, + 0x85, 0xDF, 0xB0, 0xC5, 0x3B, 0xE3, 0x9F, 0xD3, 0xBD, 0xEA, 0x4B, 0xEA, + 0x17, 0x04, 0x96, 0x0D, 0x81, 0x34, 0x4A, 0x3D, 0x7B, 0x53, 0xBE, 0x59, + 0x88, 0x59, 0x1B, 0x5E, 0x3E, 0x4A, 0xC9, 0x46, 0x94, 0x1D, 0x88, 0x0E, + 0x2B, 0xED, 0xF5, 0xD9, 0xD5, 0xCB, 0x36, 0xBF, 0x45, 0xBF, 0x69, 0xBF, + 0xE2, 0xCF, 0xC5, 0xDC, 0x01, 0xEA, 0x9A, 0xFE, 0xFF, 0x02, 0xE5, 0x16, + 0xBE, 0x0F, 0xCA, 0x1B, 0xCF, 0x0A, 0x38, 0x0F, 0x04, 0xFA, 0x8F, 0xFA, + 0x85, 0xE7, 0x5D, 0xE3, 0x1C, 0xE7, 0xD7, 0xDC, 0x8D, 0xEF, 0x02, 0xE3, + 0xD6, 0xF9, 0x04, 0xED, 0x4A, 0x20, 0xFB, 0x0F, 0x9A, 0x43, 0x40, 0x30, + 0xD8, 0x37, 0x73, 0x29, 0x90, 0x1B, 0x8B, 0x19, 0x65, 0xFF, 0x38, 0x0A, + 0x72, 0xE0, 0xD2, 0xF3, 0xA9, 0xD3, 0x6F, 0xE8, 0x22, 0xE1, 0x37, 0xEF, + 0x9B, 0xF3, 0x79, 0xF8, 0x2B, 0x08, 0x93, 0x08, 0xFE, 0x1F, 0xA6, 0x20, + 0x5F, 0x20, 0x36, 0x20, 0xD1, 0x0C, 0xF7, 0x09, 0x68, 0xFE, 0xBB, 0xFC, + 0x48, 0xFB, 0x1D, 0xFE, 0x18, 0xFB, 0xA4, 0xFF, 0x21, 0xF5, 0x87, 0xF8, + 0xC2, 0xEA, 0x16, 0xEC, 0x25, 0xE1, 0x91, 0xDE, 0xB3, 0xE0, 0x6C, 0xD9, + 0x8A, 0xE8, 0xB2, 0xDF, 0xBD, 0xF8, 0x7B, 0xF3, 0xFF, 0x1A, 0x79, 0x1A, + 0x4A, 0x41, 0xC0, 0x41, 0x77, 0x55, 0x1E, 0x53, 0x53, 0x4C, 0x20, 0x44, + 0x45, 0x2B, 0x06, 0x1B, 0x07, 0x01, 0xC1, 0xED, 0x71, 0xD8, 0x9F, 0xCF, + 0x44, 0xB4, 0x3A, 0xBE, 0x67, 0xA7, 0x8E, 0xBF, 0x33, 0xC7, 0xB0, 0xE4, + 0x02, 0xEF, 0xCF, 0x09, 0x74, 0xFD, 0xA6, 0x0F, 0x9C, 0x04, 0x61, 0x0E, + 0xCF, 0x05, 0x14, 0x0D, 0x78, 0xEC, 0x21, 0xF9, 0x51, 0xD8, 0x39, 0xEA, + 0x6E, 0xD6, 0xB0, 0xE3, 0xC3, 0xD5, 0xBC, 0xD9, 0xEA, 0xF2, 0x39, 0xED, + 0x12, 0x29, 0x28, 0x17, 0xCF, 0x3C, 0xCE, 0x25, 0x41, 0x28, 0x01, 0x19, + 0x5E, 0x11, 0xDD, 0x0C, 0xAF, 0xFD, 0xBB, 0x00, 0x61, 0xE3, 0x8E, 0xEB, + 0xED, 0xD4, 0xAF, 0xE0, 0xD7, 0xE0, 0x4D, 0xEC, 0xD1, 0xFD, 0xDC, 0x02, + 0x34, 0x16, 0xB4, 0x15, 0x76, 0x1C, 0x12, 0x1B, 0x6D, 0x1A, 0x4C, 0x15, + 0x5C, 0x11, 0x44, 0x07, 0xB5, 0x06, 0xC3, 0xFD, 0xCC, 0x07, 0x63, 0x00, + 0x62, 0x07, 0x2A, 0xFE, 0x2A, 0xFC, 0x74, 0xF5, 0xFE, 0xEE, 0x16, 0xED, + 0xCD, 0xDF, 0x40, 0xDC, 0xCE, 0xD8, 0x57, 0xD2, 0x4C, 0xDF, 0x51, 0xDD, + 0xAA, 0xF5, 0xAD, 0xFD, 0x03, 0x18, 0x50, 0x28, 0xB4, 0x37, 0xF3, 0x48, + 0xE6, 0x4F, 0x63, 0x5C, 0x50, 0x54, 0x9E, 0x58, 0xC5, 0x38, 0x4E, 0x32, + 0x2A, 0x08, 0xA3, 0xFC, 0x93, 0xDF, 0xCE, 0xD5, 0x6A, 0xD0, 0xD3, 0xC7, + 0xF0, 0xD8, 0x5C, 0xD4, 0x29, 0xF5, 0xC8, 0xF8, 0x96, 0x0B, 0x98, 0x14, + 0xA9, 0x17, 0xE8, 0x1F, 0x01, 0x29, 0xF5, 0x28, 0x2E, 0x28, 0xC5, 0x1D, + 0xE5, 0x05, 0xF2, 0xF6, 0x1A, 0xE9, 0xCC, 0xD8, 0x88, 0xE2, 0xF6, 0xD0, + 0x41, 0xE2, 0x68, 0xD1, 0x93, 0xFE, 0xCC, 0xEF, 0xC8, 0x2D, 0x51, 0x1F, + 0xCB, 0x3D, 0x2E, 0x30, 0x14, 0x29, 0xC2, 0x21, 0x4D, 0x0D, 0xAE, 0x0C, + 0x3F, 0xF6, 0x6E, 0xFA, 0x2E, 0xD4, 0x7D, 0xE1, 0x0B, 0xC3, 0xC8, 0xD5, + 0x5B, 0xD8, 0x0C, 0xE2, 0xA9, 0xFE, 0xDC, 0xF9, 0x67, 0x19, 0xFC, 0x0D, + 0x7F, 0x1D, 0x76, 0x15, 0xFE, 0x17, 0x48, 0x18, 0xA1, 0x01, 0x6B, 0x0B, + 0xB4, 0xE9, 0xCE, 0xF9, 0x9E, 0xE5, 0xF0, 0xF3, 0x08, 0xE4, 0x09, 0xEE, + 0x25, 0xDE, 0xDC, 0xE6, 0xC2, 0xD7, 0xB3, 0xDC, 0x25, 0xD8, 0x8D, 0xD5, + 0x80, 0xDB, 0xA9, 0xD5, 0x43, 0xD9, 0xD2, 0xD9, 0x33, 0xEC, 0x86, 0xF6, + 0x85, 0x13, 0x19, 0x22, 0xB3, 0x37, 0x0D, 0x46, 0x5F, 0x4D, 0xAF, 0x57, + 0xCA, 0x3D, 0x13, 0x40, 0x54, 0x1B, 0xD1, 0x16, 0x26, 0x01, 0xDB, 0xF5, + 0xD2, 0xE3, 0x32, 0xD1, 0xE2, 0xCF, 0x85, 0xBD, 0x24, 0xDA, 0xE3, 0xD1, + 0x34, 0xF8, 0x5A, 0xFE, 0xB5, 0x0E, 0xFA, 0x1E, 0x7A, 0x1C, 0x25, 0x2B, + 0x39, 0x1E, 0x1F, 0x22, 0x26, 0x06, 0xF1, 0x01, 0x87, 0xEA, 0x7D, 0xE8, + 0xC4, 0xD8, 0x8C, 0xDC, 0x39, 0xD0, 0xAF, 0xD8, 0x4B, 0xD8, 0x6F, 0xE6, + 0xB1, 0xF9, 0x9C, 0x05, 0xED, 0x23, 0x30, 0x24, 0xFD, 0x34, 0x26, 0x2C, + 0x3B, 0x2C, 0x38, 0x1D, 0x49, 0x19, 0xFE, 0x09, 0x80, 0xF9, 0x8B, 0xF5, + 0x2F, 0xE0, 0xAB, 0xE7, 0x73, 0xDF, 0x42, 0xE7, 0x0C, 0xF5, 0xF4, 0xF0, + 0xFD, 0x15, 0xD9, 0x03, 0x85, 0x29, 0xD6, 0x15, 0x53, 0x27, 0x28, 0x1A, + 0xC0, 0x18, 0xDF, 0x12, 0xFE, 0x08, 0xDC, 0x0C, 0x87, 0xF9, 0x40, 0x01, + 0x80, 0xEF, 0x50, 0xF4, 0xD9, 0xEB, 0x0D, 0xF3, 0xB1, 0xE3, 0x02, 0xEE, + 0xE6, 0xD9, 0x40, 0xE0, 0x42, 0xD1, 0x2E, 0xD7, 0x65, 0xCF, 0x2F, 0xDC, + 0x67, 0xE6, 0x12, 0xF7, 0x9A, 0x0B, 0xE0, 0x1B, 0xD2, 0x33, 0x09, 0x40, + 0x2F, 0x58, 0x78, 0x5B, 0x78, 0x57, 0x95, 0x53, 0xC3, 0x3C, 0xF5, 0x32, + 0x29, 0x23, 0xE4, 0x12, 0x87, 0xFC, 0xBE, 0xE8, 0x1A, 0xD6, 0xC2, 0xBE, + 0x75, 0xCA, 0xC8, 0xB8, 0x92, 0xDA, 0x09, 0xDC, 0x80, 0xF2, 0x55, 0xFF, + 0x0A, 0x08, 0x20, 0x17, 0x1D, 0x14, 0x6D, 0x23, 0xEF, 0x0F, 0x45, 0x15, + 0x4A, 0xFF, 0x39, 0xFB, 0x09, 0xEB, 0xC0, 0xE6, 0xAD, 0xD8, 0xE3, 0xD4, + 0xB1, 0xCB, 0x99, 0xCB, 0x2F, 0xDC, 0xC3, 0xE0, 0x61, 0x09, 0xFB, 0x0C, + 0x4E, 0x28, 0xD7, 0x27, 0x4A, 0x27, 0xA3, 0x1F, 0xC4, 0x1B, 0x88, 0x11, + 0x37, 0x07, 0xFD, 0x05, 0x7F, 0xE9, 0xDB, 0xEF, 0x57, 0xDF, 0x0F, 0xE5, + 0xBB, 0xE5, 0xFF, 0xE7, 0x64, 0xFA, 0x27, 0xF5, 0xF9, 0x1C, 0x73, 0x10, + 0x70, 0x26, 0x8C, 0x1B, 0xB6, 0x1C, 0x5A, 0x15, 0x92, 0x10, 0x7B, 0x09, + 0x50, 0xFB, 0x3D, 0xF9, 0x4F, 0xEF, 0x5D, 0xF5, 0x43, 0xEB, 0x6E, 0xF6, + 0x0B, 0xE4, 0x2B, 0xEF, 0x76, 0xE5, 0x85, 0xE7, 0xCC, 0xEA, 0x19, 0xE2, + 0xA5, 0xE6, 0xFF, 0xD7, 0x40, 0xEE, 0x9E, 0xDD, 0xA7, 0x03, 0xF1, 0xFB, + 0x7E, 0x1C, 0xDE, 0x1E, 0x9F, 0x41, 0xF8, 0x44, 0x5D, 0x57, 0x86, 0x60, + 0xF2, 0x46, 0x58, 0x51, 0xE1, 0x2C, 0x5C, 0x29, 0xA8, 0x06, 0x0C, 0xFD, + 0xAF, 0xDF, 0xB2, 0xD8, 0x70, 0xCC, 0x46, 0xC6, 0x25, 0xC4, 0x66, 0xC8, + 0xE1, 0xD8, 0xF6, 0xEB, 0x64, 0xFD, 0x26, 0x15, 0x1B, 0x0A, 0xE9, 0x21, + 0x83, 0x06, 0xA7, 0x1E, 0x29, 0x02, 0x20, 0x15, 0x49, 0xED, 0xB3, 0xF4, + 0x37, 0xD6, 0x10, 0xD3, 0x56, 0xCE, 0xE9, 0xC6, 0xFF, 0xCC, 0x43, 0xC5, + 0xAA, 0xE9, 0x83, 0xDD, 0xF0, 0x20, 0x61, 0x0B, 0x82, 0x3D, 0x4D, 0x22, + 0x8C, 0x38, 0x14, 0x1A, 0xCA, 0x23, 0x48, 0x06, 0xB1, 0x00, 0x8A, 0xF3, + 0x16, 0xE0, 0x71, 0xE3, 0x3C, 0xCE, 0xD5, 0xD4, 0xFD, 0xD3, 0x77, 0xE1, + 0xF6, 0xF1, 0x4E, 0x07, 0xEB, 0x10, 0x28, 0x20, 0xD4, 0x1E, 0x52, 0x25, + 0x5D, 0x18, 0xE9, 0x1B, 0xF6, 0x0E, 0x1F, 0x10, 0xD7, 0x02, 0x12, 0x06, + 0x9F, 0xF2, 0xD4, 0xFD, 0x33, 0xEE, 0xE4, 0xF9, 0xA7, 0xF2, 0x50, 0xF3, + 0x63, 0xF1, 0x04, 0xE7, 0x37, 0xEA, 0x0C, 0xD9, 0xD5, 0xE7, 0x27, 0xD6, + 0xF6, 0xF0, 0x6B, 0xE6, 0x4D, 0x09, 0x39, 0x04, 0xAB, 0x2B, 0xD0, 0x29, + 0x10, 0x4B, 0x39, 0x4A, 0xEE, 0x58, 0x4C, 0x4D, 0xE6, 0x4D, 0x0E, 0x35, + 0x08, 0x2B, 0x48, 0x0F, 0xF3, 0xF8, 0x50, 0xE1, 0xE4, 0xCF, 0x55, 0xC3, + 0x2F, 0xB8, 0xD1, 0xBA, 0xC5, 0xBE, 0xE9, 0xCB, 0x25, 0xE3, 0x72, 0xF4, + 0xCB, 0xFE, 0xAC, 0x13, 0x93, 0x06, 0x21, 0x23, 0xA2, 0x05, 0x0B, 0x25, + 0xAE, 0xF9, 0xD6, 0x10, 0xA7, 0xE4, 0x2C, 0xF2, 0xF8, 0xD5, 0x5A, 0xDC, + 0x34, 0xCE, 0xE1, 0xCE, 0xB7, 0xD6, 0x7B, 0xD4, 0x45, 0x03, 0xDA, 0xFE, + 0x9D, 0x2F, 0x19, 0x2A, 0x04, 0x36, 0xF8, 0x2F, 0xCE, 0x21, 0x81, 0x1C, + 0x84, 0x06, 0x8A, 0x07, 0x30, 0xF2, 0x66, 0xF8, 0xD8, 0xDF, 0xF9, 0xE5, + 0x7F, 0xDA, 0xCD, 0xE3, 0x40, 0xF1, 0xAA, 0xFD, 0x4E, 0x0A, 0xFD, 0x0F, + 0xF5, 0x18, 0x77, 0x16, 0x30, 0x21, 0x8F, 0x1E, 0xB3, 0x19, 0xC4, 0x17, + 0xB5, 0x05, 0x43, 0x04, 0x9F, 0xF9, 0xF7, 0xFB, 0xA5, 0xFF, 0xC6, 0xFE, + 0x6F, 0x02, 0xB8, 0xF9, 0x8C, 0xF3, 0x1A, 0xEA, 0x65, 0xE7, 0xD5, 0xDC, + 0x50, 0xE3, 0xD9, 0xD5, 0xCC, 0xDF, 0x2C, 0xD4, 0xDC, 0xEA, 0xA1, 0xE1, + 0x2B, 0x08, 0xE4, 0x04, 0x39, 0x2F, 0xDC, 0x35, 0x89, 0x4E, 0x6A, 0x57, + 0x08, 0x4D, 0xDC, 0x4F, 0x24, 0x30, 0x74, 0x2B, 0x57, 0x09, 0xFD, 0xFD, + 0x31, 0xDE, 0xC4, 0xCD, 0xF0, 0xC7, 0x66, 0xB7, 0x4B, 0xC5, 0x72, 0xBC, + 0xA0, 0xD3, 0x29, 0xD5, 0x1A, 0xF4, 0x7D, 0x01, 0xE7, 0x09, 0x69, 0x24, + 0x2E, 0x10, 0xC1, 0x2D, 0x1D, 0x0C, 0x57, 0x23, 0x49, 0xF9, 0x34, 0x0B, + 0x6C, 0xE3, 0x1D, 0xF1, 0x79, 0xD6, 0xB5, 0xE1, 0x55, 0xD1, 0x06, 0xD9, + 0xE7, 0xE9, 0x7D, 0xE6, 0x0E, 0x20, 0x43, 0x10, 0x4D, 0x42, 0x18, 0x2C, + 0x97, 0x3C, 0xF4, 0x26, 0x9E, 0x23, 0xC4, 0x16, 0x15, 0x06, 0xF7, 0x05, + 0x97, 0xEA, 0x44, 0xF4, 0xFA, 0xD9, 0x03, 0xE9, 0xB6, 0xE0, 0xA9, 0xEF, + 0xCC, 0xFA, 0xBC, 0x01, 0x38, 0x17, 0x28, 0x12, 0xCE, 0x25, 0x39, 0x17, + 0xB1, 0x20, 0x67, 0x0E, 0xCD, 0x0F, 0x6C, 0x02, 0xDD, 0xFC, 0x88, 0xF5, + 0x18, 0xFB, 0x88, 0xF3, 0x05, 0xFC, 0x00, 0xF7, 0xA9, 0xEC, 0x62, 0xEC, + 0x95, 0xDF, 0xEA, 0xDE, 0xE2, 0xD0, 0x60, 0xD1, 0x4F, 0xC9, 0x56, 0xCA, + 0xA3, 0xD6, 0x80, 0xD3, 0xD8, 0xEF, 0x1B, 0xEE, 0xF8, 0x17, 0x3E, 0x1E, + 0xEC, 0x40, 0x0D, 0x4D, 0x4B, 0x51, 0xCD, 0x5B, 0xCF, 0x3F, 0x64, 0x43, + 0x5B, 0x1D, 0x8E, 0x1B, 0xAC, 0xF9, 0x9C, 0xF1, 0x9F, 0xDB, 0x8A, 0xCD, + 0x11, 0xC7, 0x3E, 0xBD, 0x70, 0xC6, 0x4F, 0xC6, 0x5B, 0xE4, 0x36, 0xEC, + 0xD1, 0x01, 0xEF, 0x10, 0xD9, 0x0D, 0x2B, 0x1C, 0xF4, 0x15, 0xE7, 0x19, + 0xBA, 0x0D, 0x71, 0x0A, 0x78, 0xF2, 0x3B, 0xF0, 0xC1, 0xDD, 0xAD, 0xE0, + 0xCB, 0xC9, 0x70, 0xD0, 0x03, 0xCA, 0x3E, 0xCB, 0x5C, 0xFA, 0xAE, 0xEE, + 0xA1, 0x34, 0xFC, 0x20, 0xEE, 0x41, 0xF0, 0x2C, 0x4E, 0x2D, 0x45, 0x1A, + 0xB7, 0x16, 0xE0, 0x0E, 0x45, 0x00, 0x93, 0x07, 0x52, 0xE9, 0xC6, 0xF6, + 0xD5, 0xDC, 0x51, 0xEA, 0xE9, 0xF0, 0xF6, 0xFA, 0x75, 0x13, 0x37, 0x13, + 0x09, 0x25, 0x81, 0x1B, 0x71, 0x25, 0x19, 0x1D, 0x7F, 0x19, 0x7C, 0x18, + 0xDA, 0x02, 0x68, 0x05, 0x67, 0xF7, 0xCC, 0xFA, 0x51, 0xFE, 0xAF, 0x04, + 0xB5, 0xF3, 0x1B, 0xF9, 0x71, 0xE0, 0x4F, 0xE0, 0x67, 0xDA, 0xDC, 0xD8, + 0x61, 0xD2, 0xC5, 0xD2, 0xE8, 0xCA, 0x70, 0xCD, 0xF6, 0xD8, 0xF3, 0xDF, + 0x6F, 0x00, 0x0F, 0x0E, 0x71, 0x2C, 0x9D, 0x3E, 0x15, 0x49, 0x11, 0x59, + 0x7B, 0x4F, 0x9B, 0x58, 0xC9, 0x39, 0xB9, 0x38, 0x9A, 0x16, 0x2E, 0x05, + 0x91, 0xF3, 0xDE, 0xD3, 0x56, 0xDA, 0x26, 0xB8, 0x97, 0xD1, 0x18, 0xB6, + 0xDB, 0xE0, 0x42, 0xD1, 0x19, 0xFF, 0x35, 0xFC, 0xB4, 0x0C, 0x4E, 0x12, + 0x5A, 0x0F, 0xFC, 0x1A, 0x3C, 0x09, 0xA4, 0x19, 0x64, 0xF4, 0x25, 0x05, + 0x6B, 0xDE, 0x55, 0xED, 0xDA, 0xCE, 0x53, 0xDD, 0x21, 0xC7, 0x90, 0xD2, + 0xC8, 0xDD, 0x02, 0xE4, 0x74, 0x11, 0xEB, 0x15, 0x51, 0x37, 0x06, 0x38, + 0xF5, 0x36, 0x5E, 0x30, 0x5C, 0x1E, 0xAC, 0x19, 0xAB, 0x03, 0x5E, 0x0A, + 0x54, 0xE9, 0x80, 0xF8, 0x89, 0xD3, 0xA0, 0xE5, 0x05, 0xD9, 0xE6, 0xE8, + 0xEB, 0xFE, 0x5E, 0x03, 0x61, 0x1B, 0xD2, 0x10, 0xF9, 0x21, 0x45, 0x12, + 0x23, 0x20, 0x47, 0x15, 0x5C, 0x0F, 0xC5, 0x0A, 0xC5, 0xF9, 0x0D, 0xFD, + 0x78, 0xF0, 0x80, 0xFC, 0x9C, 0xED, 0xCA, 0xFC, 0x79, 0xE4, 0xA6, 0xF0, + 0x57, 0xDC, 0x1C, 0xE0, 0xEC, 0xDC, 0x16, 0xD3, 0x2F, 0xE2, 0x8D, 0xCD, + 0x83, 0xE8, 0x3A, 0xD3, 0x32, 0x02, 0x3D, 0xF5, 0x3C, 0x2B, 0x37, 0x2A, + 0xF7, 0x4E, 0xC3, 0x54, 0xE3, 0x61, 0x7D, 0x62, 0x6D, 0x5A, 0x7D, 0x4E, + 0x8E, 0x39, 0x07, 0x25, 0xDA, 0x0B, 0xC8, 0xF5, 0x85, 0xE2, 0x06, 0xCF, + 0x62, 0xC9, 0xC1, 0xBE, 0xB6, 0xC6, 0x38, 0xC9, 0xF9, 0xE1, 0x4B, 0xEB, + 0xC3, 0x02, 0x58, 0x0D, 0x26, 0x0D, 0x52, 0x1D, 0x37, 0x0B, 0x12, 0x23, + 0x76, 0xFD, 0x65, 0x18, 0xB1, 0xE1, 0xCE, 0xFC, 0x2E, 0xD3, 0x3B, 0xE9, + 0xF3, 0xD2, 0x0C, 0xD9, 0x80, 0xD6, 0x5F, 0xCC, 0x62, 0xF8, 0x32, 0xEA, + 0x69, 0x2F, 0xAF, 0x20, 0x20, 0x47, 0x93, 0x32, 0xFA, 0x33, 0xC2, 0x1A, + 0xE4, 0x1B, 0xF2, 0x03, 0x8D, 0x07, 0xA6, 0xF5, 0x1A, 0xED, 0x61, 0xE6, + 0x4E, 0xD8, 0x6B, 0xDE, 0x48, 0xE4, 0xC1, 0xEF, 0x4C, 0x00, 0xE7, 0x08, + 0x42, 0x0A, 0x15, 0x0E, 0x8B, 0x13, 0x41, 0x12, 0x27, 0x16, 0xDC, 0x11, + 0x96, 0xFF, 0xE1, 0xFD, 0x3D, 0xED, 0xEA, 0xF1, 0xEE, 0xF1, 0xCF, 0xFD, + 0x91, 0xEB, 0xBB, 0xF9, 0xA1, 0xDA, 0xF8, 0xDF, 0xFB, 0xD8, 0x02, 0xCF, + 0xAD, 0xDE, 0x95, 0xCD, 0x58, 0xE0, 0xF4, 0xD4, 0xF1, 0xE8, 0xF8, 0xE7, + 0x4A, 0x0B, 0x93, 0x16, 0x9A, 0x3A, 0x64, 0x4E, 0x40, 0x57, 0x38, 0x64, + 0xCC, 0x5C, 0x12, 0x58, 0x91, 0x4B, 0x83, 0x39, 0x6F, 0x1F, 0x5F, 0x06, + 0x01, 0xEF, 0xD4, 0xD2, 0x36, 0xD3, 0x95, 0xBE, 0x2C, 0xC4, 0x4A, 0xC0, + 0x2E, 0xC9, 0x0F, 0xD1, 0x42, 0xEB, 0x2F, 0xF8, 0x21, 0x04, 0x40, 0x16, + 0xA1, 0x06, 0x9C, 0x1A, 0x03, 0x02, 0xD6, 0x12, 0xB3, 0xF3, 0x4B, 0x03, + 0x66, 0xDF, 0x5F, 0xEE, 0x2E, 0xD8, 0xFA, 0xE0, 0xBB, 0xDA, 0x02, 0xDB, + 0x21, 0xE9, 0xC3, 0xE3, 0xD2, 0x13, 0xAB, 0x09, 0xE5, 0x3C, 0xCD, 0x2D, + 0x15, 0x3B, 0xAE, 0x2A, 0x52, 0x22, 0x6D, 0x14, 0xA0, 0x0E, 0x66, 0x07, + 0x1A, 0xFB, 0xFF, 0xFB, 0x4B, 0xE7, 0x42, 0xEC, 0x4F, 0xE9, 0xB2, 0xEF, + 0x8C, 0x00, 0x6B, 0x0A, 0x4C, 0x0C, 0x12, 0x19, 0x2A, 0x0F, 0x24, 0x1B, + 0x00, 0x0E, 0x28, 0x1A, 0xF3, 0xFE, 0x86, 0x0C, 0xB1, 0xEF, 0xB3, 0xFC, + 0xA6, 0xEF, 0x21, 0xFE, 0x83, 0xF1, 0x46, 0x04, 0x1B, 0xE9, 0xDA, 0xF6, + 0x12, 0xE2, 0x8E, 0xE1, 0x3F, 0xDE, 0x73, 0xD3, 0x1C, 0xE1, 0x8E, 0xD1, + 0xA1, 0xE7, 0x3D, 0xD6, 0x05, 0xFF, 0xEB, 0xF2, 0x44, 0x27, 0x47, 0x26, + 0x95, 0x49, 0x01, 0x4D, 0x05, 0x59, 0xC4, 0x57, 0xC4, 0x46, 0x8D, 0x41, + 0xBA, 0x20, 0x86, 0x14, 0x7E, 0x02, 0x23, 0xEC, 0x2C, 0xEB, 0x4B, 0xD2, + 0x52, 0xD9, 0x9B, 0xC9, 0x14, 0xD5, 0x2A, 0xD6, 0xE7, 0xE6, 0x99, 0xF6, + 0xBE, 0xFD, 0xBA, 0x15, 0x20, 0x08, 0x2F, 0x1E, 0xE7, 0x07, 0x9F, 0x17, + 0x29, 0xFB, 0xD0, 0x07, 0x3D, 0xEC, 0x29, 0xF5, 0xEC, 0xE3, 0xD4, 0xE7, + 0x3C, 0xDB, 0x8F, 0xDA, 0x66, 0xD6, 0xEC, 0xD1, 0x9F, 0xF5, 0x31, 0xED, + 0x0A, 0x2C, 0xF5, 0x1D, 0xD5, 0x45, 0x5B, 0x2E, 0x93, 0x39, 0x7D, 0x1C, + 0x60, 0x1C, 0x36, 0x08, 0x9F, 0x02, 0x0A, 0x00, 0x57, 0xEA, 0x70, 0xF0, + 0x6E, 0xE0, 0x0A, 0xE5, 0x76, 0xEE, 0xC2, 0xF3, 0xCD, 0x00, 0x6C, 0x07, + 0xA9, 0x10, 0x52, 0x16, 0x9D, 0x17, 0x50, 0x1D, 0x7B, 0x0E, 0x2D, 0x10, + 0x54, 0x00, 0x68, 0xFA, 0x3B, 0x00, 0xCB, 0xF3, 0xFE, 0x06, 0x43, 0xFA, + 0xDD, 0x05, 0x29, 0xF8, 0x57, 0xFB, 0x43, 0xEB, 0x86, 0xEB, 0x44, 0xE1, + 0xF2, 0xE0, 0x9D, 0xDA, 0x4F, 0xE0, 0xD9, 0xDA, 0xB1, 0xE9, 0xEA, 0xE6, + 0xBA, 0x04, 0xEA, 0x0B, 0xF5, 0x2D, 0x50, 0x41, 0x39, 0x46, 0x32, 0x5E, + 0xAC, 0x3F, 0xD7, 0x55, 0xB7, 0x28, 0x2C, 0x33, 0xDA, 0x0B, 0x77, 0x08, + 0x70, 0xF0, 0x4B, 0xE3, 0x4C, 0xD9, 0x66, 0xC9, 0x23, 0xCD, 0x43, 0xC8, + 0xD4, 0xD8, 0xAC, 0xE5, 0x38, 0xF0, 0x00, 0x0B, 0x21, 0x03, 0x1A, 0x1D, + 0xC5, 0x0B, 0xA7, 0x1C, 0xE7, 0x0B, 0x3A, 0x15, 0xFB, 0x08, 0xAB, 0x0C, + 0x83, 0xF7, 0xB9, 0xFD, 0x28, 0xE1, 0x4F, 0xE8, 0x58, 0xD3, 0x30, 0xD6, + 0x72, 0xE1, 0x8C, 0xDD, 0xC4, 0x11, 0xD9, 0x07, 0x07, 0x35, 0xA4, 0x24, + 0xB7, 0x31, 0x04, 0x1A, 0xAE, 0x12, 0x4A, 0x03, 0x5B, 0xF9, 0x48, 0xFC, + 0x43, 0xEA, 0x63, 0xF8, 0x85, 0xD8, 0xB2, 0xE5, 0xF3, 0xD9, 0xBF, 0xDE, + 0x03, 0xF4, 0x94, 0xF0, 0xF9, 0x0A, 0xD7, 0x02, 0x01, 0x09, 0xD5, 0x01, + 0xB1, 0xFC, 0xFD, 0xF7, 0x73, 0xF6, 0xAE, 0xF0, 0x2E, 0xED, 0x1D, 0xE7, + 0x37, 0xE9, 0x7C, 0xE2, 0x9F, 0xF5, 0x92, 0xEA, 0xAB, 0xF1, 0x42, 0xE2, + 0xC3, 0xDC, 0x60, 0xCC, 0x8D, 0xD6, 0x79, 0xC5, 0x45, 0xDB, 0xB5, 0xC9, + 0x05, 0xE3, 0xC3, 0xD3, 0x28, 0xF5, 0xC9, 0xF0, 0x8B, 0x19, 0x86, 0x28, + 0x5A, 0x39, 0xE0, 0x59, 0xD8, 0x3A, 0x21, 0x63, 0x3B, 0x2C, 0x7C, 0x4D, + 0x11, 0x14, 0x2E, 0x2C, 0x33, 0xFE, 0xC7, 0x0C, 0xC3, 0xF0, 0x3E, 0xF4, + 0xD4, 0xE5, 0xF2, 0xE3, 0x22, 0xE7, 0x1A, 0xE3, 0xB7, 0xF9, 0x3F, 0xF5, + 0xFF, 0x09, 0x72, 0x02, 0x7B, 0x0D, 0xC3, 0x03, 0xD1, 0x08, 0x3E, 0x00, + 0x34, 0x02, 0xA3, 0xFA, 0x24, 0xF6, 0xAC, 0xF3, 0xF9, 0xE3, 0x61, 0xE4, + 0x10, 0xD9, 0x61, 0xD5, 0x56, 0xD9, 0x3B, 0xD1, 0x25, 0xFF, 0xC3, 0xF3, + 0xEB, 0x32, 0xFB, 0x24, 0x3F, 0x40, 0x75, 0x2F, 0x96, 0x2D, 0xFE, 0x1F, + 0x07, 0x17, 0xF6, 0x12, 0xED, 0x07, 0xA6, 0x0C, 0xF7, 0xF8, 0x05, 0x04, + 0x03, 0xED, 0xDA, 0xFD, 0xEC, 0xF1, 0x6A, 0x06, 0x91, 0x08, 0x77, 0x1C, + 0xC9, 0x1B, 0xDC, 0x27, 0xF4, 0x1B, 0xE5, 0x19, 0xDF, 0x16, 0xA1, 0x0C, + 0x6F, 0x10, 0x08, 0x06, 0xBA, 0x07, 0xB9, 0x02, 0xCC, 0x0A, 0x7E, 0x0A, + 0xBF, 0x02, 0x72, 0x06, 0x58, 0xE6, 0xC0, 0xEF, 0xBF, 0xD8, 0xC5, 0xE2, + 0x48, 0xDF, 0x2E, 0xE3, 0xF6, 0xE7, 0x5E, 0xE1, 0xDF, 0xF7, 0x89, 0xEA, + 0x40, 0x18, 0xFA, 0x11, 0xF2, 0x3A, 0x27, 0x41, 0xDE, 0x53, 0xAF, 0x5E, + 0xE7, 0x57, 0xB7, 0x5D, 0xFF, 0x42, 0x2B, 0x40, 0x79, 0x2D, 0x4A, 0x24, + 0xEC, 0x19, 0x59, 0x09, 0xB1, 0x05, 0x72, 0xEE, 0x29, 0xF9, 0x42, 0xE3, + 0xF4, 0xFB, 0x12, 0xEE, 0x20, 0x03, 0xDC, 0x01, 0xAE, 0x05, 0x5F, 0x0F, + 0xC2, 0x04, 0x81, 0x11, 0x98, 0xFD, 0x17, 0x0F, 0xB2, 0xF6, 0x74, 0x0D, + 0x51, 0xE4, 0xDE, 0xFF, 0x35, 0xCB, 0x60, 0xE5, 0x5F, 0xC8, 0x3F, 0xD7, + 0x84, 0xE7, 0x45, 0xED, 0x97, 0x10, 0xCF, 0x09, 0xC1, 0x1D, 0xBE, 0x0E, + 0x12, 0x1D, 0xF7, 0x0A, 0x0F, 0x1B, 0x06, 0x09, 0x31, 0x0E, 0x36, 0x05, + 0xAE, 0x04, 0x2D, 0x01, 0xFF, 0xF4, 0x15, 0xF6, 0xB0, 0xE7, 0x7F, 0xE9, + 0x27, 0xF6, 0x39, 0xF2, 0x63, 0x05, 0xE6, 0xFB, 0x72, 0x02, 0x9E, 0xEE, + 0xAA, 0xEF, 0x21, 0xDC, 0x01, 0xE6, 0xC7, 0xDE, 0x47, 0xE6, 0xB1, 0xEE, + 0x21, 0xD6, 0x22, 0xEB, 0xED, 0xCB, 0x86, 0xDE, 0x46, 0xC4, 0x82, 0xCF, + 0x4E, 0xB6, 0x42, 0xB7, 0x43, 0xB7, 0x1B, 0xAD, 0x28, 0xCC, 0x24, 0xBB, + 0x3C, 0xE1, 0x0E, 0xCF, 0xAF, 0xF3, 0x52, 0xED, 0xAC, 0x15, 0xE6, 0x22, + 0x3A, 0x33, 0xB2, 0x4C, 0xBC, 0x34, 0xAF, 0x4B, 0x54, 0x27, 0x96, 0x2E, + 0x0C, 0x17, 0x0E, 0x0C, 0x64, 0x02, 0xE1, 0xE8, 0x30, 0xF3, 0x94, 0xCB, + 0x6B, 0xEB, 0x7D, 0xBE, 0xF0, 0xEE, 0xBF, 0xCA, 0x1D, 0xEB, 0xED, 0xD9, + 0xDE, 0xDD, 0x41, 0xE2, 0x7A, 0xE2, 0xD5, 0xF1, 0x35, 0xDF, 0x44, 0xF3, + 0xD8, 0xC8, 0x22, 0xE0, 0xDE, 0xBB, 0xF9, 0xD6, 0x03, 0xB8, 0xE4, 0xD8, + 0x93, 0xB8, 0xB7, 0xD2, 0x22, 0xD7, 0x2F, 0xE3, 0xA3, 0x0F, 0xE3, 0x0D, + 0xFB, 0x2C, 0xE4, 0x22, 0x27, 0x2C, 0x68, 0x22, 0x34, 0x26, 0x6B, 0x1E, + 0x81, 0x14, 0x83, 0x14, 0x5D, 0x0C, 0x4C, 0x12, 0x03, 0x0A, 0xA3, 0x10, + 0xE4, 0x09, 0x75, 0x10, 0x40, 0x1F, 0xC3, 0x21, 0x80, 0x37, 0xFA, 0x32, + 0x5E, 0x35, 0xA2, 0x2A, 0xE4, 0x1C, 0x67, 0x14, 0x46, 0x0D, 0x7B, 0x10, + 0xD0, 0x09, 0x1F, 0x17, 0xC6, 0x01, 0x6B, 0x12, 0x7F, 0xFC, 0x27, 0x0A, + 0x68, 0xF1, 0x4C, 0xFA, 0xEA, 0xDA, 0x27, 0xE2, 0x87, 0xD3, 0x0C, 0xD9, + 0x65, 0xE2, 0x4A, 0xDF, 0x9E, 0xF3, 0x47, 0xE5, 0x10, 0x08, 0xFD, 0xF5, + 0x07, 0x2D, 0x04, 0x23, 0xD0, 0x4B, 0x82, 0x4E, 0xBC, 0x4D, 0xA2, 0x54, + 0xB5, 0x3D, 0xD3, 0x43, 0x5E, 0x31, 0x0C, 0x34, 0xE1, 0x21, 0x64, 0x1F, + 0x42, 0x16, 0xEF, 0x0A, 0x15, 0x0F, 0xA5, 0xF6, 0xC6, 0x08, 0x35, 0xEE, + 0x03, 0x09, 0x38, 0xF8, 0x7E, 0xFF, 0xFF, 0xFC, 0x37, 0xFD, 0xCC, 0x04, + 0x93, 0xF7, 0x04, 0x02, 0x84, 0xE1, 0x8C, 0xF1, 0x07, 0xDE, 0x2D, 0xF5, + 0xBD, 0xD7, 0x6E, 0xF3, 0xF6, 0xBE, 0x75, 0xD7, 0x05, 0xCB, 0x90, 0xD2, + 0x0D, 0x05, 0xE2, 0xF9, 0x9C, 0x2F, 0xB6, 0x16, 0x21, 0x2B, 0xCF, 0x0B, + 0x3C, 0x2B, 0x8E, 0x0C, 0xF8, 0x2C, 0xC3, 0x15, 0x7B, 0x0C, 0x32, 0x06, + 0xEE, 0xF8, 0xA5, 0xFF, 0x60, 0xF6, 0x89, 0xFF, 0xF3, 0xF0, 0x4F, 0xF8, + 0x74, 0xFE, 0x13, 0x01, 0x23, 0x0B, 0xF0, 0x07, 0x00, 0xFE, 0x7F, 0xF8, + 0x02, 0xEA, 0x81, 0xEA, 0x4D, 0xE0, 0xFE, 0xEA, 0x92, 0xE4, 0x18, 0xF0, + 0xD8, 0xE2, 0x00, 0xEB, 0xD2, 0xD4, 0x66, 0xDB, 0x49, 0xC9, 0xA5, 0xCF, + 0x24, 0xBE, 0x34, 0xC5, 0x18, 0xBF, 0xDE, 0xBF, 0x63, 0xD7, 0x55, 0xCA, + 0xC7, 0xF4, 0x6C, 0xD8, 0x4D, 0x0D, 0x90, 0xF0, 0xB8, 0x25, 0x10, 0x1C, + 0xEC, 0x37, 0x52, 0x40, 0x10, 0x36, 0xEE, 0x44, 0x1D, 0x26, 0xC6, 0x33, + 0x64, 0x1E, 0xB9, 0x27, 0xFF, 0x17, 0xF4, 0x17, 0xE5, 0x08, 0x45, 0xFB, + 0xF9, 0x01, 0x7E, 0xEF, 0xEA, 0xFC, 0x93, 0xF2, 0x74, 0xE3, 0x08, 0xE5, + 0xDB, 0xD0, 0xF8, 0xDA, 0x06, 0xDC, 0x99, 0xE7, 0x89, 0xE3, 0x6B, 0xED, + 0x26, 0xDF, 0xA0, 0xEA, 0x15, 0xDB, 0xD1, 0xEC, 0xE8, 0xCD, 0x7E, 0xE4, + 0x49, 0xD0, 0xA9, 0xDE, 0x03, 0xFA, 0x21, 0xF7, 0x39, 0x28, 0xE2, 0x16, + 0x3F, 0x3B, 0xB0, 0x1E, 0x6E, 0x3F, 0x39, 0x1B, 0x57, 0x41, 0xF0, 0x1E, + 0xF3, 0x33, 0x9F, 0x23, 0xC8, 0x18, 0x12, 0x20, 0xE0, 0x0C, 0x9B, 0x21, + 0x33, 0x10, 0x26, 0x2A, 0x39, 0x17, 0xF7, 0x2F, 0xEF, 0x1A, 0x54, 0x2C, + 0xC3, 0x13, 0xBF, 0x1C, 0x4E, 0x00, 0xE8, 0x07, 0x05, 0xF5, 0x4A, 0x02, + 0xCE, 0x02, 0xC0, 0x10, 0x7A, 0x03, 0xD9, 0x0F, 0xE5, 0xF2, 0x6A, 0xFE, + 0xD4, 0xE2, 0xC0, 0xEB, 0x95, 0xD2, 0x20, 0xD6, 0xD3, 0xC9, 0xC2, 0xC5, + 0x75, 0xD5, 0x80, 0xC7, 0x5E, 0xEF, 0x24, 0xD1, 0x1F, 0x00, 0x2E, 0xDB, + 0x19, 0x1B, 0x68, 0x01, 0x34, 0x39, 0x13, 0x31, 0xFF, 0x3C, 0xD6, 0x3F, + 0xEB, 0x33, 0x61, 0x3C, 0x64, 0x2E, 0x3E, 0x3E, 0x73, 0x26, 0x74, 0x35, + 0xFF, 0x15, 0xDA, 0x1B, 0xBD, 0x06, 0x58, 0x04, 0x2E, 0xFC, 0x48, 0xF6, + 0x81, 0xF7, 0x40, 0xF3, 0x07, 0xF5, 0xF4, 0xF2, 0x7D, 0xF2, 0x98, 0xF3, + 0x00, 0xF4, 0x08, 0xF7, 0x42, 0xE6, 0xE2, 0xEC, 0xA9, 0xDA, 0x42, 0xEB, + 0x4F, 0xD4, 0x0A, 0xEA, 0x96, 0xBC, 0xFC, 0xCD, 0xE2, 0xC4, 0x68, 0xCA, + 0xA3, 0xF0, 0xE3, 0xE9, 0x84, 0x07, 0x8B, 0xF6, 0xB5, 0x0E, 0x92, 0xF2, + 0x0C, 0x17, 0xFF, 0xF6, 0xD1, 0x11, 0x60, 0xF8, 0xFD, 0xFD, 0x83, 0xF4, + 0x1E, 0xF5, 0x57, 0xFA, 0xEA, 0xFE, 0x44, 0x09, 0x91, 0x06, 0x3C, 0x12, + 0x6E, 0x00, 0xEC, 0x0B, 0xD8, 0xFF, 0xF4, 0x07, 0xED, 0xFF, 0x17, 0x02, + 0x63, 0xF7, 0xF5, 0xF6, 0xD4, 0xF1, 0x3A, 0xF4, 0xDF, 0xF5, 0xED, 0xF7, + 0xFA, 0xF6, 0xCB, 0xF7, 0x7D, 0xEC, 0x96, 0xED, 0x92, 0xD5, 0x4F, 0xD4, + 0xC7, 0xC4, 0xAA, 0xBF, 0x06, 0xC5, 0xAE, 0xBE, 0x9F, 0xC8, 0x38, 0xC4, + 0x15, 0xDA, 0x34, 0xD4, 0xCB, 0xEF, 0x0C, 0xED, 0xAB, 0x06, 0x98, 0x0F, + 0x37, 0x21, 0x54, 0x2F, 0x08, 0x2C, 0x89, 0x34, 0x9E, 0x37, 0x1D, 0x3D, + 0xCD, 0x45, 0x37, 0x4D, 0x02, 0x43, 0x8F, 0x42, 0xBC, 0x41, 0xBE, 0x32, + 0xDF, 0x40, 0x9E, 0x2D, 0xE9, 0x2D, 0x70, 0x1E, 0x12, 0x18, 0x6F, 0x09, + 0xA8, 0x0F, 0xEE, 0x04, 0xA7, 0x00, 0x89, 0xFE, 0x27, 0xEE, 0x48, 0xF1, + 0x60, 0xE9, 0x58, 0xF0, 0x53, 0xD6, 0xB9, 0xE4, 0x5B, 0xC5, 0xB4, 0xD5, + 0x3A, 0xD3, 0xFA, 0xD8, 0xFE, 0xE8, 0x8A, 0xE8, 0x43, 0xF6, 0xE7, 0xF7, + 0x66, 0xF9, 0xBB, 0xF5, 0x9C, 0x00, 0xC3, 0xF0, 0x8D, 0x0A, 0x40, 0xFB, + 0xA1, 0x06, 0x04, 0x04, 0x6D, 0x07, 0xC6, 0x0C, 0x3E, 0x1D, 0xD9, 0x25, + 0x1E, 0x2F, 0x73, 0x38, 0xDA, 0x2E, 0xF4, 0x34, 0xBE, 0x31, 0xCF, 0x2D, + 0x84, 0x2F, 0x0E, 0x25, 0x00, 0x25, 0xBD, 0x17, 0x65, 0x25, 0xED, 0x15, + 0xF4, 0x20, 0xAD, 0x1C, 0x98, 0x0F, 0xB8, 0x1D, 0x73, 0xF0, 0x38, 0x0C, + 0x62, 0xCA, 0xC1, 0xE5, 0x0B, 0xBA, 0x90, 0xCE, 0x79, 0xC0, 0xF3, 0xCB, + 0x97, 0xCE, 0xE2, 0xC8, 0x8A, 0xDF, 0xCF, 0xCD, 0xA2, 0xED, 0xC8, 0xDA, + 0x9A, 0xFE, 0xA2, 0xF3, 0xDE, 0x10, 0xF8, 0x12, 0x85, 0x13, 0xEE, 0x20, + 0xA5, 0x0B, 0xAA, 0x1F, 0xB1, 0x12, 0x5B, 0x24, 0xC1, 0x21, 0x81, 0x2C, + 0xFD, 0x2E, 0xE6, 0x2F, 0x81, 0x3D, 0xA6, 0x31, 0x67, 0x3F, 0x4E, 0x2D, + 0x46, 0x2F, 0x79, 0x1C, 0x29, 0x20, 0xFE, 0x0A, 0x15, 0x10, 0xA1, 0xF9, + 0xAA, 0xF1, 0xD4, 0xE2, 0xAF, 0xCF, 0x4E, 0xCE, 0x0E, 0xBB, 0xD4, 0xC4, + 0x0C, 0xBB, 0x35, 0xCB, 0xF2, 0xBA, 0x33, 0xCC, 0x92, 0xC2, 0x3B, 0xCB, + 0x6F, 0xD5, 0x18, 0xD2, 0x8E, 0xE2, 0x2A, 0xD6, 0x36, 0xEF, 0x33, 0xD9, + 0x0C, 0xFA, 0x87, 0xE0, 0x56, 0xFA, 0x7C, 0xED, 0x37, 0xEC, 0x35, 0xF4, + 0x10, 0xF5, 0xB2, 0x05, 0xC7, 0x0C, 0x87, 0x1C, 0x4D, 0x15, 0x25, 0x27, + 0x5C, 0x1E, 0x82, 0x32, 0xB0, 0x23, 0x94, 0x33, 0xEE, 0x1E, 0x8F, 0x2B, + 0xBE, 0x18, 0xBA, 0x23, 0x25, 0x11, 0x75, 0x17, 0xCF, 0x04, 0xBC, 0x09, + 0x74, 0xEA, 0x15, 0xF3, 0x82, 0xD1, 0xC3, 0xDC, 0x09, 0xDC, 0xB1, 0xE0, + 0xDD, 0xE6, 0x7F, 0xE6, 0x37, 0xDF, 0x2D, 0xDC, 0x24, 0xED, 0x77, 0xDE, + 0xEA, 0x04, 0xAA, 0xEB, 0x53, 0x12, 0x49, 0xFB, 0xA4, 0x18, 0xC1, 0x0B, + 0xD3, 0x15, 0x97, 0x11, 0xFA, 0x0A, 0x91, 0x0F, 0x21, 0x0A, 0x79, 0x14, + 0x2F, 0x1D, 0xD3, 0x1F, 0xD7, 0x29, 0x57, 0x1E, 0x09, 0x29, 0x9A, 0x18, + 0xDC, 0x29, 0xA0, 0x1A, 0x4F, 0x21, 0xBE, 0x14, 0xE3, 0x0B, 0x9B, 0x04, + 0x75, 0xF3, 0x54, 0xF3, 0x3C, 0xE9, 0x33, 0xF0, 0xD4, 0xEA, 0x06, 0xF8, + 0xAD, 0xD8, 0xBA, 0xF1, 0xFC, 0xCB, 0x95, 0xEB, 0x76, 0xE0, 0xE1, 0xFC, + 0x4B, 0xEE, 0x64, 0x06, 0x3C, 0xEE, 0x2B, 0xFA, 0x64, 0xF5, 0x33, 0xEF, + 0x2D, 0x03, 0x04, 0xED, 0xAE, 0x02, 0x12, 0xE8, 0x0F, 0x02, 0x94, 0xEB, + 0xDD, 0x03, 0x77, 0xF5, 0x07, 0x03, 0x50, 0xFC, 0x46, 0x1B, 0xA2, 0x11, + 0x97, 0x33, 0x26, 0x24, 0x44, 0x2B, 0x49, 0x1C, 0xD6, 0x1B, 0xF4, 0x11, + 0x5B, 0x18, 0xD6, 0x12, 0x16, 0x14, 0x4B, 0x13, 0x5B, 0x0A, 0xEC, 0x0F, + 0xEC, 0xFA, 0xE4, 0x03, 0x59, 0xEE, 0x5D, 0xFB, 0xAD, 0xE8, 0x22, 0xFD, + 0x31, 0xE2, 0x2A, 0xF8, 0x2A, 0xDC, 0xFA, 0xE9, 0xDD, 0xE0, 0x38, 0xE7, + 0x85, 0xF6, 0x00, 0xF4, 0xCA, 0x16, 0x14, 0x02, 0x18, 0x26, 0x4B, 0x07, + 0xFD, 0x20, 0x81, 0x08, 0xDD, 0x15, 0xA1, 0x0B, 0x29, 0x0F, 0xF3, 0x14, + 0xB0, 0x08, 0x95, 0x1B, 0xCB, 0xFB, 0x2A, 0x0F, 0xEB, 0x04, 0x4B, 0x0A, + 0xE7, 0x18, 0x75, 0x12, 0xD2, 0x14, 0xF3, 0x0B, 0xC0, 0xFE, 0xD6, 0xF8, + 0x47, 0xF0, 0x6C, 0xF1, 0x8A, 0xE9, 0x14, 0xF3, 0xA2, 0xE3, 0xB5, 0xF0, + 0x9B, 0xD9, 0x88, 0xE5, 0x0F, 0xC4, 0x81, 0xD1, 0xED, 0xC2, 0x95, 0xD5, + 0xA5, 0xDA, 0x21, 0xEC, 0x78, 0xE6, 0xC7, 0xF5, 0x58, 0xE2, 0x80, 0xEF, + 0x68, 0xEC, 0x47, 0xEF, 0xFF, 0x00, 0xDC, 0xF8, 0x75, 0x08, 0x8B, 0xF7, + 0x7C, 0x04, 0x28, 0xEF, 0x1F, 0x02, 0x5B, 0xF0, 0x2A, 0x09, 0x7B, 0x01, + 0xAB, 0x17, 0x9D, 0x14, 0xFF, 0x18, 0x77, 0x15, 0x91, 0x0A, 0x82, 0x0C, + 0xF2, 0x02, 0x15, 0x0B, 0xB2, 0x03, 0xBC, 0x0B, 0x4D, 0x0F, 0x2B, 0x15, + 0x1D, 0x0E, 0x2B, 0x13, 0x1B, 0xFB, 0x6E, 0xFD, 0x54, 0xF4, 0x74, 0xF5, + 0x4A, 0xEC, 0x95, 0xF0, 0xBC, 0xDF, 0xA5, 0xE5, 0x80, 0xE7, 0x56, 0xE5, + 0x82, 0xFA, 0x29, 0xF1, 0x92, 0x0D, 0xF3, 0x03, 0x92, 0x1D, 0x41, 0x0F, + 0xC2, 0x1F, 0xA9, 0x10, 0x7A, 0x19, 0xD0, 0x11, 0x7C, 0x19, 0x3E, 0x14, + 0xE5, 0x1A, 0xE8, 0x12, 0x1A, 0x15, 0xE8, 0x0F, 0x8B, 0x0F, 0xDA, 0x0E, + 0xF9, 0x14, 0x55, 0x10, 0x40, 0x1D, 0x76, 0x17, 0xE2, 0x18, 0x17, 0x17, + 0x14, 0x0D, 0x66, 0x0C, 0xA3, 0x0F, 0x9E, 0x0B, 0xFE, 0x10, 0xD1, 0x0C, + 0x66, 0x06, 0xAB, 0x07, 0x90, 0xFB, 0x93, 0x00, 0x31, 0xEA, 0xC2, 0xF4, + 0xDF, 0xE1, 0xF6, 0xF2, 0x47, 0xEF, 0x44, 0x01, 0x45, 0x00, 0x4D, 0x0C, + 0x40, 0xFB, 0x09, 0x03, 0x08, 0xF6, 0xBB, 0xF6, 0x0C, 0xFA, 0x25, 0xEF, + 0xFB, 0xF6, 0x02, 0xEA, 0x3A, 0xF6, 0x3A, 0xE9, 0x59, 0xF6, 0xF4, 0xE4, + 0x44, 0xFF, 0xA0, 0xEC, 0x0C, 0x0B, 0x50, 0xFF, 0x02, 0x07, 0x04, 0x08, + 0xB0, 0xFC, 0x91, 0x08, 0x52, 0xFA, 0x56, 0x0E, 0xF6, 0xFA, 0xA4, 0x11, + 0x2A, 0xFD, 0x59, 0x12, 0x84, 0x03, 0xD6, 0x13, 0x8C, 0xF5, 0x7F, 0x00, + 0x8F, 0xE4, 0xB5, 0xEC, 0xBA, 0xE3, 0x0E, 0xEA, 0x10, 0xD9, 0xE9, 0xE0, + 0xF4, 0xD8, 0xA7, 0xDC, 0x34, 0xF0, 0x59, 0xE6, 0xD9, 0x03, 0xD2, 0xEE, + 0xC6, 0x0B, 0xE0, 0xF3, 0x43, 0x13, 0xD2, 0xFA, 0x0B, 0x14, 0x0F, 0xFE, + 0xF1, 0x07, 0xC2, 0xF9, 0x98, 0xFE, 0xA5, 0xF9, 0xB2, 0xFF, 0x62, 0x05, + 0x64, 0x02, 0x62, 0x0E, 0x99, 0xFE, 0x8C, 0x0C, 0x42, 0x00, 0xF0, 0x0C, + 0xA7, 0x02, 0x2A, 0x09, 0x4A, 0x01, 0x45, 0xFE, 0x21, 0x0A, 0xD2, 0xFF, + 0x8E, 0x13, 0x46, 0x06, 0xD8, 0x0E, 0xCA, 0x04, 0x6E, 0xFC, 0xDD, 0xFC, + 0x51, 0xE9, 0x8C, 0xF1, 0x90, 0xEC, 0x82, 0xF6, 0xCB, 0xFE, 0xB5, 0x09, + 0x4D, 0x04, 0x0B, 0x0D, 0x44, 0xFC, 0x87, 0x01, 0xCA, 0xFB, 0x19, 0xFF, + 0xBC, 0xFB, 0x55, 0x00, 0x18, 0xF8, 0x8C, 0x01, 0x4E, 0xF4, 0xC1, 0xFD, + 0x1C, 0xF2, 0x20, 0xF2, 0x43, 0x04, 0xD1, 0xF9, 0x17, 0x12, 0x87, 0x06, + 0xEA, 0x03, 0x41, 0xFF, 0x90, 0xF4, 0x25, 0xFE, 0xB5, 0xF7, 0x08, 0x0C, + 0x22, 0xFF, 0x7E, 0x11, 0x81, 0x0B, 0xF5, 0x14, 0x2B, 0x16, 0x32, 0x16, + 0x28, 0x0C, 0x49, 0x04, 0x5E, 0x04, 0xBB, 0xF3, 0xE4, 0x03, 0x60, 0xEB, + 0xC4, 0xFC, 0x92, 0xE5, 0xE1, 0xF1, 0x9B, 0xE7, 0xA2, 0xF2, 0x53, 0xF3, + 0xA9, 0x04, 0x3B, 0x09, 0x36, 0x11, 0x23, 0x18, 0x93, 0x0B, 0x46, 0x0C, + 0xD6, 0x07, 0xB3, 0xFD, 0xAE, 0x08, 0x0A, 0xFC, 0x16, 0x05, 0x47, 0xFB, + 0xA8, 0x06, 0xCB, 0x00, 0xEA, 0x0B, 0xDC, 0x0E, 0xA4, 0x09, 0x0E, 0x19, + 0xB0, 0x01, 0xE6, 0x15, 0x61, 0xFF, 0x28, 0x0E, 0xA7, 0xFD, 0x62, 0x03, + 0xAD, 0xFC, 0x27, 0xFB, 0x7C, 0x08, 0xEE, 0xFE, 0x44, 0x0E, 0x1B, 0x01, + 0xC1, 0xFA, 0x17, 0xF5, 0x48, 0xEE, 0xB6, 0xEA, 0x61, 0xFE, 0x6D, 0xF4, + 0x54, 0x08, 0x67, 0xFF, 0x33, 0xF8, 0x5A, 0xF7, 0xCB, 0xEA, 0x70, 0xEB, + 0xF1, 0xEB, 0xC0, 0xEA, 0x92, 0xE9, 0x0D, 0xE8, 0x53, 0xEE, 0xF3, 0xE9, + 0x7D, 0xF9, 0x44, 0xF4, 0x50, 0xF7, 0x1D, 0xF2, 0xF4, 0x01, 0xF3, 0xF9, + 0xB1, 0x14, 0xA0, 0x0A, 0xA3, 0x0A, 0x8B, 0x04, 0xB2, 0xF9, 0x79, 0xFE, + 0xAB, 0xFE, 0x53, 0x0E, 0x79, 0x0C, 0xC3, 0x1F, 0x37, 0x10, 0x88, 0x21, + 0x77, 0x0B, 0xCB, 0x18, 0xB6, 0x07, 0x1F, 0x0E, 0x44, 0x02, 0xA8, 0x04, + 0x12, 0xFA, 0x55, 0xFD, 0x86, 0xF6, 0xBA, 0xF8, 0x2C, 0xFB, 0xA9, 0xFE, + 0xE3, 0x03, 0x36, 0x0A, 0x5F, 0x0B, 0xE8, 0x14, 0x37, 0x12, 0x4A, 0x1F, + 0x1B, 0x0A, 0xB8, 0x13, 0x9D, 0x01, 0xD2, 0xFF, 0xE4, 0x05, 0xEE, 0xFD, + 0x99, 0x05, 0x98, 0x00, 0x6E, 0xFF, 0x33, 0xFD, 0x36, 0x06, 0xCD, 0x06, + 0xFB, 0x0E, 0x3E, 0x13, 0xD4, 0x02, 0xA8, 0x0A, 0xF8, 0xF8, 0xF4, 0x01, + 0x46, 0x01, 0x08, 0x03, 0xE5, 0x09, 0x28, 0xFF, 0x96, 0x0D, 0x76, 0xFC, + 0x0B, 0x09, 0xD7, 0xFA, 0x1D, 0xF8, 0x9A, 0xED, 0x71, 0xF4, 0x62, 0xEB, + 0xEF, 0x03, 0x76, 0xFC, 0xF5, 0x02, 0x55, 0x00, 0xA4, 0xEA, 0xF5, 0xEF, + 0x1F, 0xE2, 0x2B, 0xEB, 0x83, 0xE3, 0xE0, 0xEE, 0xEA, 0xDF, 0x28, 0xEC, + 0xDF, 0xE4, 0x4A, 0xEC, 0xC5, 0xE6, 0x12, 0xE9, 0xF2, 0xF0, 0x9E, 0xEC, + 0x46, 0x03, 0xCB, 0xF6, 0x57, 0x03, 0x95, 0xF7, 0xC1, 0xF6, 0xDA, 0xF2, + 0x57, 0xFA, 0xE8, 0xF8, 0x4D, 0x0B, 0x96, 0x0C, 0x99, 0x16, 0xE8, 0x1D, + 0xC7, 0x12, 0x41, 0x1C, 0xFC, 0x06, 0x9D, 0x0D, 0xE1, 0x06, 0xCC, 0x07, + 0xB9, 0x07, 0xB2, 0x04, 0xD8, 0x01, 0xF0, 0xF9, 0xF6, 0xFB, 0xE0, 0xEE, + 0x30, 0x02, 0x6C, 0xF3, 0xA1, 0x0B, 0xF9, 0x02, 0xAA, 0x06, 0xED, 0x0A, + 0x68, 0xF8, 0xAB, 0x08, 0xC8, 0xF6, 0x9D, 0x09, 0x9F, 0x01, 0x1E, 0x08, + 0xCA, 0x0B, 0x47, 0x00, 0xED, 0x0E, 0x47, 0xFA, 0x0F, 0x0D, 0x5C, 0xF5, + 0x27, 0x15, 0x66, 0xFF, 0x51, 0x1A, 0x5A, 0x0D, 0x64, 0x0B, 0x2A, 0x0A, + 0xBD, 0xFE, 0x63, 0x07, 0xE8, 0xFE, 0xE9, 0x08, 0x46, 0x05, 0x88, 0x05, + 0xDA, 0x0E, 0x63, 0x09, 0x8A, 0x02, 0xD4, 0xFE, 0x2B, 0xF1, 0x9A, 0xED, + 0xE5, 0xF9, 0xD8, 0xFA, 0x74, 0x04, 0x66, 0x0A, 0x30, 0xFB, 0x97, 0x00, + 0x0D, 0xED, 0x3B, 0xF1, 0x8D, 0xE5, 0xA2, 0xED, 0x8E, 0xE6, 0x68, 0xF4, + 0x63, 0xEA, 0x19, 0xF9, 0xCC, 0xE2, 0xDB, 0xF4, 0xF3, 0xDE, 0x5E, 0xF6, + 0xA0, 0xF0, 0x43, 0x03, 0xDE, 0xFD, 0xEE, 0x00, 0xAA, 0xFE, 0xED, 0xF6, + 0x2D, 0x04, 0xBB, 0xF9, 0x65, 0x0C, 0x1D, 0xFE, 0x8B, 0x15, 0x3B, 0x06, + 0xC2, 0x16, 0xB6, 0x0E, 0xE4, 0x0E, 0x38, 0x0C, 0x1C, 0x0B, 0x9C, 0x07, + 0x97, 0x08, 0x08, 0x06, 0xCC, 0x02, 0x91, 0xFD, 0x4F, 0x00, 0x75, 0xF5, + 0xB4, 0x01, 0x9A, 0xF8, 0x36, 0x03, 0x3D, 0xFE, 0x48, 0x02, 0x7B, 0x04, + 0xE4, 0xFD, 0x75, 0x0B, 0x8F, 0xF8, 0xDA, 0x0C, 0x76, 0xFD, 0xE3, 0x0E, + 0x76, 0x07, 0x95, 0x0C, 0xD2, 0x07, 0x9D, 0x03, 0xBE, 0x07, 0x66, 0x00, + 0xD9, 0x08, 0xC7, 0x00, 0xAC, 0x0A, 0x69, 0x05, 0x00, 0x07, 0x98, 0x07, + 0x9D, 0x00, 0xD8, 0x02, 0xDD, 0x01, 0x6A, 0x03, 0xFC, 0x02, 0xE6, 0x02, + 0x44, 0x08, 0x5D, 0x01, 0xD0, 0x05, 0x8F, 0xFA, 0xE4, 0xF2, 0x45, 0xEB, + 0x30, 0xF9, 0xF5, 0xF6, 0x17, 0x0F, 0xDE, 0x0D, 0x70, 0x04, 0xBB, 0x08, + 0xE4, 0xF2, 0xBE, 0x03, 0x19, 0xF1, 0x02, 0x09, 0x2F, 0xEE, 0xC5, 0x07, + 0x96, 0xF4, 0x27, 0x0A, 0x39, 0xFF, 0x5B, 0x0E, 0x2B, 0xFC, 0x10, 0x09, + 0xEB, 0xFD, 0x48, 0x08, 0x8B, 0x07, 0xEF, 0x0B, 0x01, 0x08, 0x92, 0x01, + 0xAC, 0x06, 0x64, 0xF4, 0xAF, 0x0B, 0x89, 0xF2, 0xB2, 0x14, 0x6F, 0xF9, + 0x0B, 0x19, 0x91, 0x01, 0x5C, 0x0E, 0xFB, 0x04, 0x96, 0xFF, 0x18, 0x02, + 0x78, 0xF9, 0x20, 0xFD, 0x53, 0xF3, 0xA0, 0xF4, 0xB9, 0xF0, 0x5E, 0xEE, + 0x56, 0xF8, 0x9E, 0xF4, 0xD8, 0xFE, 0x10, 0xF9, 0x0B, 0x02, 0xD6, 0xF9, + 0x2F, 0x00, 0x79, 0xFD, 0x55, 0xF7, 0xDF, 0xFF, 0x0E, 0xEF, 0x71, 0xFE, + 0x43, 0xF2, 0x24, 0xFC, 0x00, 0xFC, 0xBE, 0xFE, 0x54, 0x05, 0x4E, 0x06, + 0xBD, 0x0A, 0x83, 0x07, 0xC4, 0x0B, 0x70, 0x03, 0x6A, 0x0E, 0x23, 0x05, + 0xEB, 0x0B, 0x77, 0x05, 0x8B, 0x03, 0x5B, 0x04, 0x9F, 0xFF, 0x4A, 0x0B, + 0xE0, 0xFD, 0x09, 0x11, 0xD7, 0xF4, 0x68, 0x05, 0xF5, 0xEC, 0xE5, 0xF1, + 0x62, 0xF1, 0xD1, 0xEC, 0x4C, 0xFD, 0x8A, 0xF2, 0xE7, 0x0A, 0x10, 0xFA, + 0x68, 0x0A, 0xCE, 0x01, 0x59, 0x00, 0x09, 0x04, 0x48, 0xF7, 0xC3, 0xFB, + 0x91, 0xF6, 0xEF, 0xF2, 0xB4, 0xFB, 0x4D, 0xF1, 0x80, 0xFE, 0x6B, 0xF5, + 0x36, 0x00, 0xA2, 0xFB, 0x4F, 0xFF, 0x46, 0xFF, 0xBF, 0xFF, 0x61, 0x02, + 0x8E, 0x00, 0x6C, 0x02, 0xD0, 0xFA, 0xCE, 0xFB, 0xF4, 0xF9, 0x15, 0xFC, + 0xB2, 0x03, 0x82, 0x02, 0x67, 0x09, 0x87, 0x03, 0x7A, 0x08, 0x77, 0x02, + 0x28, 0x05, 0x5F, 0x06, 0xDE, 0xFA, 0xEB, 0x08, 0xB7, 0xF2, 0xAC, 0x0B, + 0x05, 0xF5, 0xD4, 0x10, 0x8C, 0xFC, 0xBB, 0x0E, 0x17, 0x07, 0x71, 0x08, + 0x53, 0x0B, 0x4A, 0x03, 0x87, 0x09, 0x5D, 0xFC, 0xE3, 0x04, 0xDD, 0xF6, + 0xCB, 0x02, 0xF0, 0xF9, 0xC0, 0x00, 0x3B, 0xFD, 0xA1, 0x03, 0xE3, 0x04, + 0xC7, 0x0C, 0xD7, 0x0D, 0xC3, 0x0D, 0x14, 0x08, 0x2D, 0x0F, 0xA5, 0xFD, + 0x0B, 0x12, 0xAB, 0xF7, 0x44, 0x0E, 0x8C, 0xF7, 0x4E, 0x05, 0x6B, 0xFC, + 0x6E, 0xFC, 0xBE, 0xFE, 0xCD, 0xF5, 0x4B, 0x02, 0xFA, 0xEF, 0x79, 0x04, + 0x16, 0xED, 0xE7, 0x00, 0x33, 0xEE, 0x42, 0xFD, 0xE4, 0xEF, 0xF8, 0xF7, + 0x21, 0xF5, 0xDA, 0xF6, 0x89, 0x05, 0xD0, 0xFF, 0xA0, 0x0B, 0x60, 0x04, + 0x2E, 0x02, 0x48, 0x02, 0x88, 0xFF, 0xDC, 0x03, 0x98, 0x02, 0x53, 0x06, + 0x63, 0xFF, 0xBF, 0x05, 0xF8, 0xFA, 0xDD, 0x04, 0xBA, 0xF8, 0x41, 0x03, + 0x7A, 0xF6, 0x9F, 0xFB, 0xE5, 0xF7, 0xB3, 0xF3, 0x96, 0xFC, 0xCE, 0xF0, + 0x3B, 0xFD, 0x23, 0xEE, 0xF4, 0xF8, 0xA9, 0xED, 0x36, 0xF5, 0xF4, 0xEE, + 0x57, 0xFC, 0xAA, 0xF5, 0x93, 0xFF, 0x19, 0xFB, 0xA7, 0xF2, 0x82, 0xF6, + 0x8B, 0xEF, 0x07, 0xFC, 0x71, 0xF5, 0x5E, 0x06, 0x1F, 0xF8, 0x06, 0x02, + 0x5A, 0x03, 0x31, 0x03, 0x5F, 0x15, 0x06, 0x0B, 0x67, 0x16, 0x9A, 0x05, + 0xA0, 0x11, 0x76, 0x02, 0x6A, 0x11, 0x2D, 0x07, 0xC3, 0x0D, 0x44, 0x0A, + 0xDF, 0x06, 0x81, 0x09, 0x35, 0x04, 0x22, 0x0C, 0xD9, 0x07, 0xF3, 0x10, + 0x5E, 0x0A, 0xDF, 0x0C, 0x72, 0x0C, 0x22, 0x07, 0x80, 0x09, 0xB7, 0x06, + 0xFE, 0x03, 0x24, 0x08, 0xED, 0xFD, 0xF7, 0x05, 0x5A, 0xFE, 0x5D, 0x08, + 0x03, 0x03, 0xC9, 0x0D, 0x6A, 0xFE, 0xA5, 0x09, 0xEB, 0xFC, 0x12, 0x08, + 0xF0, 0xFB, 0xC8, 0x07, 0x79, 0xFD, 0x19, 0x07, 0xCD, 0x06, 0x2E, 0x06, + 0x8B, 0x08, 0x69, 0x00, 0xB0, 0x0C, 0x85, 0x03, 0xBD, 0x11, 0x65, 0x05, + 0x82, 0x0E, 0x88, 0x01, 0x2A, 0x08, 0x75, 0x01, 0xC5, 0xFF, 0x88, 0x03, + 0x78, 0xF9, 0x19, 0x03, 0x52, 0xF2, 0x73, 0xFA, 0x63, 0xED, 0xEA, 0xF3, + 0x7D, 0xEC, 0x1C, 0xEF, 0x4C, 0xEF, 0xE2, 0xEC, 0xC1, 0xF4, 0x96, 0xF2, + 0xD6, 0xF2, 0x87, 0xEF, 0x18, 0xF3, 0x51, 0xED, 0x91, 0xF8, 0x6F, 0xF1, + 0x5D, 0xF3, 0xE2, 0xEC, 0xEA, 0xF3, 0x06, 0xF2, 0x51, 0xFC, 0xCC, 0xFD, + 0xD2, 0xFD, 0x5B, 0x00, 0x3F, 0x04, 0x78, 0x01, 0xCA, 0x0D, 0x73, 0x02, + 0x8A, 0x10, 0x21, 0x03, 0x55, 0x0A, 0x0E, 0xFE, 0xC3, 0x07, 0xF1, 0xFC, + 0x27, 0x08, 0x5E, 0x03, 0x4A, 0xFF, 0xE7, 0x04, 0xA3, 0xF5, 0xDB, 0x01, + 0x7B, 0xF4, 0xF7, 0xFF, 0x4E, 0xFC, 0x24, 0x01, 0x99, 0x02, 0x30, 0x00, + 0x73, 0x08, 0xAB, 0x02, 0x17, 0x08, 0x2A, 0x05, 0x25, 0xFF, 0x3E, 0x04, + 0x71, 0xF7, 0x4D, 0x01, 0x72, 0xF1, 0xAA, 0x00, 0x93, 0xF1, 0x3C, 0x05, + 0xA0, 0xF5, 0x2D, 0x02, 0xEF, 0x00, 0x6C, 0xFE, 0x4D, 0x12, 0x0D, 0x03, + 0x41, 0x12, 0x30, 0xFF, 0x54, 0x0F, 0x5A, 0xFD, 0x83, 0x16, 0x6A, 0x06, + 0xA3, 0x15, 0x8D, 0x09, 0xC4, 0x10, 0x2E, 0x09, 0xCC, 0x0A, 0xF2, 0x07, + 0xB7, 0xFE, 0x74, 0x04, 0xF0, 0xF2, 0xD2, 0xFC, 0x72, 0xED, 0xB5, 0xF5, + 0x53, 0xE9, 0x5A, 0xF2, 0xB2, 0xE3, 0xDE, 0xEF, 0x41, 0xDF, 0x89, 0xED, + 0x96, 0xE7, 0xEE, 0xF1, 0x75, 0xF6, 0xB6, 0xFB, 0x7B, 0xF7, 0xAD, 0xFA, + 0x21, 0xFC, 0x65, 0xFC, 0x9D, 0x02, 0xE5, 0x04, 0x11, 0xFE, 0x50, 0x06, + 0x27, 0xFC, 0x28, 0x06, 0x60, 0xFD, 0xEC, 0x02, 0x12, 0x02, 0xCA, 0xFD, + 0x7E, 0x06, 0x69, 0xFD, 0x7D, 0x08, 0x3D, 0xFF, 0x2D, 0x08, 0xE3, 0xFF, + 0x4F, 0x00, 0x96, 0xFA, 0xF6, 0xF8, 0x43, 0xF6, 0x37, 0xF9, 0xF9, 0xF8, + 0xFC, 0xF9, 0x56, 0xFB, 0xC6, 0xFA, 0x1E, 0xFE, 0xF7, 0xFF, 0x23, 0x05, + 0x68, 0x06, 0x8D, 0x09, 0xD5, 0x08, 0x97, 0x06, 0x23, 0x0B, 0x50, 0x08, + 0xB4, 0x0C, 0x78, 0x0C, 0x10, 0x07, 0x32, 0x09, 0x34, 0x05, 0x3F, 0x0A, + 0x93, 0x04, 0x61, 0x0C, 0x99, 0xFF, 0x1F, 0x04, 0xE2, 0x02, 0x0E, 0xFA, + 0x53, 0x0F, 0x2B, 0xF6, 0xC4, 0x15, 0x53, 0xF3, 0x7B, 0x12, 0x04, 0xF1, + 0x2E, 0x0D, 0x28, 0xF5, 0xCB, 0x07, 0xDA, 0xFE, 0xEB, 0x01, 0xDD, 0x05, + 0x9D, 0xF9, 0x51, 0x07, 0x9C, 0xF5, 0x88, 0x0A, 0x31, 0xF8, 0xFD, 0x0F, + 0xD1, 0xF7, 0x46, 0x10, 0xCA, 0xF9, 0x5F, 0x11, 0xA9, 0xFB, 0x5A, 0x10, + 0x72, 0xF4, 0x98, 0x01, 0x2D, 0xF5, 0x09, 0xF7, 0xA4, 0xFC, 0x13, 0xF8, + 0x8F, 0xFF, 0x46, 0xF8, 0x5C, 0x03, 0xCF, 0xF9, 0xEA, 0x06, 0x96, 0xFE, + 0x73, 0x07, 0xA2, 0x00, 0x92, 0x07, 0x8C, 0x01, 0x07, 0x09, 0x41, 0x00, + 0xD7, 0x08, 0x96, 0xFA, 0x2C, 0x09, 0x28, 0xF6, 0x01, 0x0B, 0x34, 0xF5, + 0xF2, 0x09, 0x17, 0xFA, 0x47, 0x07, 0x09, 0x02, 0x24, 0xFD, 0xE7, 0xFC, + 0x11, 0xF8, 0xD9, 0xF9, 0x8F, 0xF9, 0xFE, 0xFE, 0xAE, 0xF6, 0x90, 0x03, + 0xFE, 0xFA, 0xB2, 0x0C, 0xAC, 0x02, 0x2F, 0x12, 0x04, 0x09, 0xB0, 0x14, + 0x3C, 0x13, 0xC3, 0x19, 0x2A, 0x19, 0x4F, 0x1C, 0x05, 0x15, 0x8C, 0x15, + 0x7B, 0x0E, 0x4C, 0x10, 0xA2, 0x04, 0x06, 0x0F, 0x3F, 0xFE, 0xB6, 0x10, + 0xBC, 0x00, 0xA6, 0x13, 0xE5, 0x05, 0xA8, 0x0E, 0x15, 0x0F, 0x2E, 0x0E, + 0x6C, 0x1C, 0xB7, 0x13, 0xBD, 0x27, 0xD5, 0x16, 0x18, 0x2C, 0x15, 0x18, + 0xC3, 0x23, 0x22, 0x13, 0x67, 0x19, 0x15, 0x14, 0x0C, 0x1C, 0x24, 0x1F, + 0x8E, 0x1C, 0xE7, 0x23, 0xE7, 0x1C, 0x06, 0x25, 0xED, 0x25, 0xB9, 0x29, + 0x2E, 0x32, 0xC9, 0x34, 0x5A, 0x3A, 0xE1, 0x3A, 0x68, 0x38, 0x35, 0x36, + 0x1D, 0x40, 0x51, 0x39, 0x92, 0x50, 0x5B, 0x43, 0x35, 0x60, 0x0C, 0x52, + 0x61, 0x67, 0xD5, 0x59, 0x82, 0x5C, 0xF2, 0x53, 0xB9, 0x50, 0x12, 0x4E, + 0x60, 0x44, 0x77, 0x45, 0x76, 0x36, 0x77, 0x3E, 0x68, 0x30, 0x58, 0x3E, + 0xA1, 0x1B, 0x2A, 0x2E, 0x65, 0x19, 0xCF, 0x27, 0xBD, 0x37, 0x36, 0x3D, + 0xF6, 0x2D, 0xBC, 0x2E, 0xF4, 0x12, 0x39, 0x13, 0xF4, 0x22, 0x4E, 0x25, + 0x35, 0x31, 0x43, 0x31, 0xBC, 0x1A, 0xAD, 0x18, 0x2A, 0x06, 0xFA, 0x04, + 0x05, 0x09, 0xDA, 0x09, 0xC0, 0x29, 0x47, 0x2A, 0x89, 0x25, 0xE4, 0x20, + 0xFE, 0xFF, 0x63, 0xF6, 0x31, 0x02, 0x1D, 0xF8, 0xDF, 0xE7, 0x9C, 0xE4, + 0xD9, 0xB5, 0xAF, 0xBB, 0x12, 0xC0, 0x38, 0xC8, 0xD8, 0xD0, 0x2E, 0xD6, + 0xB7, 0xBC, 0x54, 0xBE, 0x69, 0xB8, 0x54, 0xB9, 0xF2, 0xC8, 0x00, 0xC8, + 0x32, 0xC0, 0xFF, 0xB8, 0x0B, 0xAF, 0xFE, 0xA2, 0x84, 0xC0, 0xFB, 0xB4, + 0x20, 0xC8, 0xCF, 0xC2, 0x8E, 0xBC, 0x63, 0xBB, 0x15, 0xC3, 0x0C, 0xC4, + 0xA0, 0xCD, 0x21, 0xCF, 0xA3, 0xB7, 0xFF, 0xBA, 0xC0, 0xA6, 0xA8, 0xAD, + 0x67, 0xBA, 0x9F, 0xC1, 0x1A, 0xC2, 0xDE, 0xC5, 0xB3, 0xAA, 0xDA, 0xA8, + 0xD0, 0xA4, 0xBD, 0x9E, 0xD8, 0xC0, 0xA6, 0xB9, 0x64, 0xC4, 0x49, 0xBF, + 0x57, 0xB1, 0x5A, 0xAC, 0x51, 0xA5, 0x38, 0xA3, 0xC0, 0xA7, 0xA5, 0xAB, + 0xAE, 0xAE, 0xC0, 0xB4, 0xC4, 0xA8, 0x79, 0xAE, 0x82, 0xA5, 0xCE, 0xA6, + 0x44, 0xB2, 0x17, 0xAF, 0x20, 0xB7, 0x62, 0xB5, 0x19, 0xBA, 0xC6, 0xB8, + 0x3D, 0xC5, 0xD3, 0xC3, 0x14, 0xC6, 0x65, 0xC5, 0xE2, 0xC3, 0x80, 0xC1, + 0xA3, 0xC0, 0x01, 0xBF, 0x8D, 0xBF, 0x66, 0xBE, 0x6E, 0xC1, 0x0C, 0xBE, + 0x9D, 0xBF, 0xF5, 0xBB, 0x95, 0xBD, 0x3F, 0xBC, 0x22, 0xCE, 0xC5, 0xCB, + 0x1D, 0xE0, 0xEB, 0xDA, 0x42, 0xE1, 0x8B, 0xDD, 0xEA, 0xE5, 0x78, 0xE8, + 0xA9, 0xEF, 0x64, 0xF7, 0x74, 0xEF, 0x89, 0xF5, 0x88, 0xE8, 0xE1, 0xE9, + 0x49, 0xEA, 0x42, 0xEA, 0x01, 0xF4, 0xB7, 0xF1, 0x77, 0x02, 0x36, 0xF9, + 0xEC, 0x0A, 0x75, 0xFF, 0xDD, 0x0A, 0xEB, 0x07, 0x9E, 0x11, 0x30, 0x1A, + 0x25, 0x16, 0xEE, 0x27, 0xA4, 0x15, 0x11, 0x29, 0xF7, 0x19, 0x1A, 0x27, + 0x8C, 0x17, 0x23, 0x25, 0xCA, 0x15, 0x3F, 0x1F, 0x72, 0x1C, 0xD8, 0x1A, + 0x04, 0x24, 0x6A, 0x21, 0x94, 0x31, 0xC5, 0x31, 0x2D, 0x3F, 0x9E, 0x41, + 0x99, 0x3E, 0x3E, 0x43, 0x91, 0x36, 0xE5, 0x3A, 0x9D, 0x35, 0x1C, 0x37, + 0x0F, 0x3E, 0xB0, 0x3B, 0x7E, 0x47, 0xF2, 0x42, 0x6D, 0x45, 0x0C, 0x3F, + 0x52, 0x3E, 0xE3, 0x39, 0x98, 0x45, 0x93, 0x44, 0x7D, 0x47, 0xA2, 0x45, + 0x98, 0x3D, 0x18, 0x3B, 0xD4, 0x42, 0xBE, 0x3D, 0x60, 0x4F, 0x16, 0x45, + 0x4A, 0x55, 0x01, 0x4B, 0x2C, 0x55, 0x01, 0x51, 0x43, 0x5A, 0xC2, 0x5C, + 0xE8, 0x60, 0xA8, 0x62, 0x1A, 0x5D, 0x16, 0x59, 0x0B, 0x57, 0x15, 0x54, + 0x3A, 0x57, 0xF6, 0x59, 0xDC, 0x53, 0xBA, 0x59, 0xDE, 0x48, 0x05, 0x53, + 0x19, 0x42, 0xA4, 0x50, 0x5A, 0x3F, 0xAE, 0x4E, 0x2F, 0x44, 0x13, 0x50, + 0x73, 0x51, 0x45, 0x56, 0x74, 0x4D, 0xF4, 0x4C, 0x95, 0x42, 0x1D, 0x39, + 0x2A, 0x4A, 0xFA, 0x36, 0xA2, 0x55, 0x1C, 0x40, 0xE8, 0x59, 0x7B, 0x47, + 0x33, 0x54, 0xB7, 0x4C, 0x9D, 0x4F, 0x02, 0x50, 0x87, 0x4F, 0xD1, 0x50, + 0xA0, 0x4B, 0xF4, 0x50, 0x5F, 0x4A, 0x49, 0x53, 0x4F, 0x4A, 0xD7, 0x52, + 0x2D, 0x47, 0xB4, 0x4D, 0x88, 0x3D, 0x0B, 0x40, 0xDC, 0x2D, 0x2B, 0x30, + 0x50, 0x22, 0x0C, 0x2C, 0x8B, 0x1B, 0x56, 0x28, 0xFE, 0x14, 0x1B, 0x20, + 0xF7, 0x21, 0x31, 0x2D, 0xB5, 0x34, 0xF9, 0x3B, 0xF8, 0x3A, 0xFC, 0x3C, + 0xD8, 0x3E, 0xEF, 0x40, 0x6D, 0x3D, 0x8C, 0x3C, 0xC0, 0x34, 0x04, 0x30, + 0xB2, 0x32, 0x62, 0x2E, 0x7E, 0x2D, 0x55, 0x2B, 0x70, 0x1D, 0xFA, 0x18, + 0x7A, 0x16, 0xBE, 0x11, 0x69, 0x13, 0xF7, 0x12, 0x37, 0x16, 0xF0, 0x18, + 0x8A, 0x17, 0x8D, 0x1F, 0x60, 0x10, 0x65, 0x1B, 0xB9, 0x06, 0xBD, 0x15, + 0x92, 0x06, 0x53, 0x1B, 0x1E, 0x0D, 0xC0, 0x1E, 0x10, 0x0D, 0x5E, 0x15, + 0x23, 0x0C, 0x59, 0x0F, 0xF9, 0x0B, 0xE3, 0x10, 0x71, 0x14, 0x7F, 0x1C, + 0x5F, 0x12, 0x62, 0x1B, 0xE8, 0xFA, 0x87, 0xFF, 0x86, 0xF8, 0x43, 0xF3, + 0x82, 0x01, 0x09, 0xF9, 0xC4, 0xFD, 0x6B, 0xF0, 0x47, 0xFE, 0x65, 0xE6, + 0x69, 0x06, 0x76, 0xF0, 0xC4, 0x0A, 0x75, 0x00, 0x9A, 0xFE, 0x41, 0xFC, + 0x45, 0xEF, 0xA3, 0xF0, 0x62, 0xEB, 0xE3, 0xF0, 0x3F, 0xE7, 0x1A, 0xF0, + 0xD1, 0xE5, 0x75, 0xF3, 0xF3, 0xE6, 0x6A, 0xF6, 0xE0, 0xE3, 0x9A, 0xED, + 0xE3, 0xDF, 0x28, 0xEB, 0xCE, 0xD7, 0x08, 0xE4, 0x0A, 0xCE, 0x66, 0xD3, + 0x15, 0xD4, 0xBE, 0xD3, 0xEC, 0xED, 0x99, 0xE4, 0xFC, 0xF2, 0xB6, 0xE9, + 0x62, 0xDE, 0x48, 0xDC, 0x92, 0xDC, 0x7B, 0xD6, 0x5B, 0xE8, 0xE1, 0xDC, + 0xB5, 0xE8, 0x75, 0xD8, 0xC3, 0xDE, 0xF6, 0xD2, 0x40, 0xD5, 0xE8, 0xCF, + 0x30, 0xD1, 0x00, 0xC8, 0xA3, 0xD0, 0xE7, 0xC6, 0xDC, 0xD0, 0x4C, 0xC7, + 0x3C, 0xC3, 0x57, 0xBE, 0x50, 0xB6, 0x23, 0xBA, 0x0E, 0xBF, 0x59, 0xC1, + 0x98, 0xC9, 0x63, 0xC6, 0xF4, 0xD4, 0x93, 0xCB, 0x38, 0xD9, 0xD2, 0xCB, + 0x4B, 0xD9, 0x6E, 0xCC, 0x44, 0xDE, 0x40, 0xD0, 0xA5, 0xDC, 0x54, 0xD4, + 0x98, 0xD4, 0x1F, 0xD7, 0x23, 0xD6, 0xD3, 0xDE, 0x00, 0xDB, 0x80, 0xE2, + 0xD3, 0xDB, 0xA7, 0xD9, 0x8E, 0xE7, 0xE5, 0xD2, 0xCA, 0xF4, 0xAB, 0xD2, + 0xAF, 0xEF, 0x73, 0xD4, 0x93, 0xEC, 0x1B, 0xD9, 0xE3, 0xF6, 0xF3, 0xDF, + 0xBE, 0xFE, 0xF5, 0xE8, 0x52, 0x06, 0x61, 0xFF, 0x5C, 0xFC, 0x0F, 0x09, + 0xDD, 0xE3, 0x4C, 0x00, 0xDF, 0xEB, 0x6F, 0x00, 0x73, 0x0B, 0x5C, 0xFF, + 0x22, 0x0E, 0x4D, 0x02, 0xA3, 0xFD, 0x93, 0xFF, 0xC6, 0xF8, 0xE2, 0xF5, + 0xC0, 0x08, 0x2D, 0x02, 0x5E, 0x1C, 0xA9, 0x06, 0xDB, 0x1D, 0x8F, 0x0B, + 0x96, 0x0D, 0xE0, 0x16, 0xEE, 0x05, 0x52, 0x12, 0x63, 0x17, 0x8C, 0x10, + 0xE4, 0x33, 0x3C, 0x18, 0x2A, 0x2F, 0x7C, 0x21, 0x9D, 0x11, 0x22, 0x1C, + 0x75, 0x10, 0x27, 0x1A, 0xC6, 0x1A, 0x07, 0x1E, 0x02, 0x22, 0xE0, 0x19, + 0xA5, 0x1A, 0xC7, 0x20, 0x99, 0x13, 0x2C, 0x1E, 0x3F, 0x22, 0x0E, 0x17, + 0xF7, 0x25, 0x9B, 0x19, 0xCB, 0x25, 0x81, 0x16, 0x30, 0x1D, 0x36, 0x1D, + 0xBA, 0x10, 0xF5, 0x2B, 0xE9, 0x18, 0xD2, 0x2A, 0x15, 0x23, 0x17, 0x23, + 0x7A, 0x24, 0xBD, 0x1B, 0xA0, 0x22, 0x53, 0x10, 0xCD, 0x21, 0x76, 0x12, + 0xD7, 0x23, 0x24, 0x19, 0x01, 0x22, 0x19, 0x1C, 0x6A, 0x12, 0x75, 0x2D, + 0x54, 0x0A, 0x02, 0x28, 0xDD, 0x1A, 0x49, 0x13, 0x1B, 0x26, 0xE9, 0x0F, + 0x5A, 0x1E, 0x10, 0x09, 0xCA, 0x10, 0x08, 0x14, 0x02, 0x08, 0x5A, 0x20, + 0xE8, 0x0D, 0x80, 0x20, 0xB9, 0x18, 0xC5, 0x26, 0x31, 0x16, 0x14, 0x29, + 0x4D, 0x04, 0xA1, 0x21, 0xEA, 0xFA, 0x0B, 0x13, 0x14, 0xF4, 0xD4, 0x02, + 0xFA, 0xEB, 0x4C, 0xF4, 0xA3, 0xF4, 0x76, 0x01, 0xAD, 0xFB, 0x21, 0x0F, + 0xF9, 0xFE, 0x95, 0x00, 0x54, 0x15, 0x03, 0xFB, 0x9D, 0x11, 0x8C, 0xFB, + 0xDB, 0xEB, 0x6A, 0xEF, 0xBD, 0xD3, 0xE8, 0xE8, 0xE5, 0xD1, 0x8F, 0xF1, + 0x6D, 0xDD, 0xBE, 0xE7, 0xED, 0xF2, 0xCA, 0xE1, 0xC6, 0xF3, 0xEE, 0xF5, + 0x1D, 0xD7, 0x57, 0xF7, 0xF9, 0xD4, 0x82, 0xD6, 0xBD, 0xDC, 0x67, 0xC3, + 0x4D, 0xD0, 0x86, 0xCC, 0x5E, 0xCB, 0x18, 0xD4, 0xAA, 0xBC, 0x51, 0xE3, + 0x2D, 0xAF, 0x71, 0xEA, 0x54, 0xC9, 0xF5, 0xD2, 0x26, 0xE1, 0xEB, 0xC2, + 0x20, 0xCF, 0xAE, 0xC9, 0x52, 0xC6, 0xDB, 0xC5, 0x29, 0xD3, 0x65, 0xBB, + 0x7F, 0xC9, 0x8C, 0xC6, 0xE5, 0xC8, 0x07, 0xDF, 0xE6, 0xCA, 0x8E, 0xE9, + 0x42, 0xAE, 0x02, 0xE1, 0xD4, 0xA3, 0x31, 0xD1, 0xB6, 0xAF, 0x05, 0xC8, + 0xFB, 0xB5, 0x13, 0xC9, 0x4D, 0xB5, 0x13, 0xBF, 0xD3, 0xC0, 0x01, 0xB8, + 0xFA, 0xD7, 0x67, 0xC9, 0x0A, 0xDA, 0x74, 0xDE, 0x50, 0xCF, 0x92, 0xDE, + 0x5F, 0xBA, 0xD8, 0xDD, 0xA8, 0xB5, 0x51, 0xDA, 0x40, 0xD2, 0x0C, 0xB8, + 0xA5, 0xD0, 0x53, 0xAE, 0xB9, 0xB6, 0x2B, 0xCF, 0xD5, 0xBD, 0x32, 0xD8, + 0x2C, 0xD4, 0x3E, 0xC5, 0x79, 0xD4, 0xDA, 0xC9, 0x11, 0xCC, 0x4C, 0xDA, + 0xA2, 0xD4, 0xF0, 0xD0, 0x95, 0xD7, 0x0C, 0xCE, 0x71, 0xCD, 0x92, 0xD6, + 0x05, 0xC7, 0x6A, 0xCB, 0xBE, 0xC4, 0x37, 0xC8, 0x56, 0xC8, 0x48, 0xC8, + 0x28, 0xCC, 0xF2, 0xBF, 0xD5, 0xC3, 0x6C, 0xC4, 0xBE, 0xBB, 0x3B, 0xC2, + 0xE8, 0xC2, 0x69, 0xBB, 0x6E, 0xBC, 0x8F, 0xB6, 0x15, 0xAB, 0x56, 0xBB, + 0xF0, 0xB9, 0x43, 0xBB, 0x55, 0xCC, 0x02, 0xA8, 0xFE, 0xD7, 0x67, 0xB1, + 0x3C, 0xE5, 0x05, 0xC8, 0x81, 0xD1, 0x47, 0xD7, 0x3F, 0xBB, 0x96, 0xDD, + 0x8F, 0xC2, 0x79, 0xDC, 0x52, 0xDA, 0xB0, 0xDD, 0x43, 0xE9, 0xA2, 0xE1, + 0xC3, 0xE2, 0x93, 0xEC, 0x06, 0xE3, 0xFE, 0xE9, 0x1F, 0xED, 0x8F, 0xDF, + 0x25, 0xEE, 0x28, 0xDC, 0xE5, 0xDC, 0x77, 0xDE, 0x62, 0xD9, 0xF9, 0xE4, + 0x20, 0xFD, 0x30, 0xEA, 0xA8, 0x12, 0x6C, 0xEC, 0xF0, 0x10, 0x5C, 0xF8, + 0xA0, 0x12, 0xF8, 0x0B, 0x1D, 0x0D, 0x2C, 0x19, 0xC5, 0x0A, 0x08, 0x19, + 0x9D, 0x18, 0x4B, 0x14, 0xEE, 0x2E, 0x2E, 0x15, 0x2D, 0x3C, 0x4D, 0x0F, + 0xB6, 0x27, 0x68, 0x0E, 0x72, 0x10, 0x69, 0x17, 0x34, 0x1A, 0x80, 0x14, + 0x55, 0x2D, 0x04, 0x14, 0x2E, 0x2A, 0x00, 0x31, 0xBD, 0x1D, 0xAA, 0x47, + 0xC5, 0x15, 0xC6, 0x2D, 0xD5, 0x25, 0x86, 0x1E, 0x46, 0x43, 0xD1, 0x29, + 0xC5, 0x54, 0x33, 0x36, 0x50, 0x44, 0x1E, 0x37, 0xC1, 0x16, 0x0F, 0x2C, + 0xE8, 0x10, 0x69, 0x35, 0xD0, 0x28, 0x3D, 0x40, 0x86, 0x2A, 0x68, 0x33, + 0x8C, 0x35, 0x6F, 0x19, 0xFC, 0x48, 0xB4, 0x09, 0xC5, 0x4B, 0xA7, 0x17, + 0x02, 0x4C, 0xE1, 0x26, 0x4E, 0x45, 0x5F, 0x30, 0xB3, 0x38, 0xEA, 0x31, + 0x50, 0x3D, 0x9D, 0x37, 0x18, 0x57, 0x70, 0x55, 0x49, 0x5B, 0xB1, 0x5C, + 0x8B, 0x38, 0xA7, 0x52, 0xE9, 0x1D, 0x88, 0x50, 0x50, 0x14, 0x30, 0x46, + 0xD4, 0x16, 0x96, 0x37, 0xCB, 0x2F, 0xD0, 0x31, 0xA6, 0x49, 0x99, 0x3C, + 0x77, 0x51, 0x8E, 0x4A, 0x77, 0x56, 0x94, 0x50, 0xCF, 0x5E, 0x39, 0x4E, + 0xD3, 0x53, 0x1C, 0x47, 0xDC, 0x48, 0x56, 0x3A, 0xB2, 0x57, 0x8B, 0x38, + 0xD8, 0x55, 0x13, 0x3D, 0x66, 0x3F, 0x9F, 0x44, 0x05, 0x3A, 0x12, 0x54, + 0x18, 0x34, 0x71, 0x53, 0x32, 0x2E, 0x45, 0x48, 0x49, 0x40, 0x74, 0x3A, + 0xC2, 0x51, 0x37, 0x36, 0x95, 0x59, 0x1C, 0x40, 0xCF, 0x5B, 0x15, 0x34, + 0xFA, 0x33, 0x85, 0x0C, 0x3C, 0x0C, 0xDC, 0x10, 0xE6, 0x1A, 0xCC, 0x24, + 0x28, 0x31, 0x60, 0x1D, 0xE1, 0x2D, 0x43, 0x22, 0x63, 0x26, 0x80, 0x23, + 0xFA, 0x1F, 0x51, 0x15, 0xBA, 0x1C, 0x13, 0x15, 0x6A, 0x1A, 0x12, 0x20, + 0xE1, 0x1A, 0xBC, 0x0F, 0x16, 0x0C, 0xDF, 0x00, 0x09, 0x12, 0xBE, 0x21, + 0xB2, 0x38, 0xEC, 0x35, 0x06, 0x2E, 0x9C, 0x20, 0x28, 0x0F, 0x53, 0x1D, + 0x4B, 0x13, 0x44, 0x33, 0xA6, 0x29, 0xFE, 0x3C, 0x64, 0x3C, 0xCB, 0x38, + 0xCC, 0x3D, 0xC7, 0x27, 0xDB, 0x2E, 0x91, 0x1E, 0xFA, 0x24, 0xD9, 0x2A, + 0x95, 0x24, 0x69, 0x1E, 0xED, 0x1D, 0x14, 0x02, 0x83, 0x14, 0x96, 0x05, + 0xAD, 0x18, 0x9F, 0x13, 0x3A, 0x24, 0xFF, 0x1A, 0xE9, 0x21, 0x95, 0x20, + 0xF0, 0x2B, 0x53, 0x15, 0x59, 0x48, 0x37, 0xFB, 0xB3, 0x3F, 0x02, 0xF9, + 0xD3, 0x21, 0xE1, 0x0F, 0x24, 0x2A, 0xFC, 0x16, 0x52, 0x3C, 0x03, 0x12, + 0x16, 0x34, 0xCE, 0x11, 0x53, 0x20, 0xAB, 0x15, 0x38, 0x11, 0x75, 0x27, + 0xC0, 0x0A, 0x59, 0x38, 0xE8, 0x1E, 0x58, 0x33, 0x35, 0x35, 0x8F, 0x25, + 0xC1, 0x10, 0x88, 0x18, 0xCB, 0xF1, 0xE2, 0x04, 0xAF, 0x0B, 0xC9, 0x01, + 0xE0, 0x19, 0x83, 0x17, 0x6C, 0x09, 0x6E, 0x1E, 0x4E, 0xFB, 0xFD, 0x1B, + 0xF5, 0xF9, 0xEE, 0x27, 0xB6, 0x0A, 0x9F, 0x27, 0xD1, 0x15, 0xCB, 0x0A, + 0xE7, 0x10, 0x74, 0x02, 0x40, 0x08, 0x58, 0x13, 0x5B, 0x0C, 0x54, 0x1B, + 0xAA, 0x1F, 0xDF, 0x17, 0xD3, 0x29, 0xAB, 0x12, 0x15, 0x28, 0x4D, 0x08, + 0x28, 0x2C, 0x4E, 0x1C, 0x6D, 0x22, 0x9C, 0x48, 0x6B, 0x19, 0xD1, 0x53, + 0x09, 0x20, 0x12, 0x3B, 0x01, 0x24, 0x28, 0x1F, 0xB0, 0x22, 0x9A, 0x19, + 0x03, 0x0F, 0x0B, 0x1B, 0xEE, 0x00, 0x95, 0x1F, 0xE1, 0x05, 0xD1, 0x1D, + 0x3C, 0x0D, 0x76, 0x1F, 0x6B, 0x1D, 0x43, 0x2A, 0x59, 0x25, 0x04, 0x27, + 0x86, 0x22, 0x63, 0x0F, 0x85, 0x24, 0xA3, 0xF9, 0x5C, 0x15, 0xF7, 0x07, + 0x44, 0x03, 0x56, 0x10, 0xB1, 0x06, 0xFD, 0x0D, 0x54, 0x00, 0x30, 0x14, + 0x5D, 0xF1, 0xBB, 0x11, 0x96, 0x09, 0xCC, 0x11, 0xC5, 0x1C, 0x5E, 0x0C, + 0x36, 0x02, 0x55, 0xFF, 0x71, 0xFB, 0x99, 0xFF, 0x11, 0xF8, 0x92, 0xEE, + 0xCC, 0xD6, 0x7C, 0xC6, 0xC0, 0xCC, 0x23, 0xBF, 0x2C, 0xD9, 0x98, 0xD1, + 0x95, 0xCF, 0xD6, 0xDB, 0xAC, 0xCE, 0x8A, 0xDC, 0xAE, 0xE1, 0x20, 0xD6, + 0xB5, 0xDA, 0xE4, 0xD4, 0x56, 0xCB, 0xA7, 0xDB, 0xCE, 0xC3, 0x23, 0xDC, + 0x2E, 0xB4, 0xC3, 0xD9, 0xF5, 0xB2, 0xB9, 0xD0, 0xEC, 0xC4, 0x04, 0xC6, + 0xBE, 0xBC, 0x9D, 0xC0, 0x33, 0xA9, 0x8C, 0xC0, 0x0B, 0xB3, 0x7F, 0xCC, + 0xD0, 0xC9, 0x14, 0xD0, 0x46, 0xD9, 0xF7, 0xD4, 0x3D, 0xDD, 0x36, 0xDB, + 0x60, 0xCC, 0x0B, 0xCF, 0x2C, 0xB5, 0x23, 0xC8, 0x8C, 0xB6, 0x3E, 0xC1, + 0xB4, 0xBC, 0x2F, 0xAE, 0xF1, 0xAF, 0xF9, 0xA7, 0x41, 0xA5, 0x44, 0xBD, + 0x1B, 0xA9, 0x3C, 0xD1, 0x6E, 0xC3, 0x6A, 0xD3, 0x2B, 0xE0, 0xFA, 0xD0, + 0xBC, 0xD3, 0x86, 0xC7, 0x3D, 0xB1, 0x16, 0xBC, 0xF2, 0xAF, 0xF5, 0xBF, + 0xCF, 0xC8, 0x59, 0xC3, 0xB7, 0xC8, 0x03, 0xB8, 0xC6, 0xB7, 0xE6, 0xB4, + 0xA7, 0xB1, 0xA0, 0xC2, 0xC7, 0xB1, 0xE0, 0xD0, 0x47, 0xB2, 0xDB, 0xCF, + 0x5E, 0xB7, 0x5B, 0xCD, 0x41, 0xBF, 0xC1, 0xCE, 0x41, 0xB1, 0xAA, 0xBB, + 0x25, 0xA0, 0x6C, 0xA7, 0x11, 0xA5, 0x05, 0xB0, 0xAD, 0xA7, 0x1C, 0xC6, + 0xE6, 0xA5, 0x7E, 0xCC, 0xE5, 0xA3, 0xD1, 0xC3, 0x74, 0xAC, 0xF7, 0xBC, + 0x4D, 0xC0, 0x16, 0xBA, 0xEA, 0xCC, 0x71, 0xBB, 0xFA, 0xB9, 0x4A, 0xC0, + 0x0B, 0xA5, 0x0F, 0xC2, 0x95, 0xB9, 0xE5, 0xC6, 0x8B, 0xD3, 0x3E, 0xCB, + 0x30, 0xD4, 0xFE, 0xBF, 0xF1, 0xC0, 0xBB, 0xBB, 0xFA, 0xB4, 0x6F, 0xCA, + 0xC1, 0xBC, 0x1D, 0xD5, 0x94, 0xD2, 0xD0, 0xD5, 0x1A, 0xD8, 0x7E, 0xC7, + 0x75, 0xC9, 0xF0, 0xB7, 0x84, 0xC8, 0xC1, 0xB8, 0x56, 0xC7, 0xEC, 0xB7, + 0xE7, 0xB4, 0x16, 0xB6, 0x0C, 0xA3, 0xF4, 0xB6, 0x17, 0xAA, 0x9A, 0xB3, + 0xF5, 0xBF, 0xAD, 0xBD, 0x0D, 0xD2, 0x51, 0xC8, 0x57, 0xD6, 0xB3, 0xC4, + 0xAD, 0xC3, 0xB0, 0xB8, 0x16, 0xB7, 0xC5, 0xB8, 0x28, 0xB7, 0x7F, 0xC6, + 0xF3, 0xBB, 0x85, 0xC8, 0x2F, 0xD7, 0x93, 0xCD, 0x59, 0xEA, 0xDD, 0xCE, + 0x43, 0xE4, 0xF4, 0xC9, 0xF1, 0xE2, 0xF3, 0xDB, 0x1B, 0xDF, 0x11, 0xDD, + 0xB8, 0xD5, 0x56, 0xC3, 0x39, 0xC9, 0x18, 0xBE, 0xE4, 0xB5, 0xA0, 0xB6, + 0x8D, 0xB7, 0xC2, 0xA9, 0x71, 0xC9, 0x3A, 0xB8, 0x12, 0xCF, 0x06, 0xCA, + 0xA1, 0xC5, 0x8A, 0xC7, 0xD8, 0xBB, 0x0A, 0xCD, 0x60, 0xBA, 0xE4, 0xDE, + 0x30, 0xC1, 0x84, 0xDF, 0xC7, 0xCB, 0x39, 0xD7, 0x93, 0xC9, 0x58, 0xCF, + 0xA2, 0xCF, 0x46, 0xD2, 0x0C, 0xE6, 0xBF, 0xEC, 0xDA, 0xE8, 0xDB, 0xFD, + 0x60, 0xDC, 0x3A, 0xF3, 0x5F, 0xE1, 0xDF, 0xEA, 0x78, 0xFA, 0xF0, 0xFA, + 0x58, 0x08, 0xAC, 0x01, 0x3B, 0x0C, 0x47, 0xF4, 0xB9, 0x0F, 0xD7, 0xEA, + 0xCB, 0x05, 0x08, 0xD7, 0xBF, 0xF0, 0x03, 0xC5, 0x4F, 0xD6, 0xE4, 0xC1, + 0xF2, 0xC9, 0xCB, 0xBA, 0x19, 0xD4, 0xF1, 0xBA, 0x5B, 0xEB, 0x36, 0xD5, + 0x7F, 0xFD, 0xAF, 0xF5, 0x3C, 0x05, 0xC5, 0x00, 0xB5, 0x15, 0xDA, 0xFA, + 0x4A, 0x1B, 0x9B, 0xEF, 0x5D, 0x0F, 0x01, 0xE7, 0x79, 0x0A, 0xCA, 0xEE, + 0x7B, 0x15, 0xC4, 0xFA, 0x5B, 0x15, 0xEC, 0xF7, 0xA2, 0x13, 0x14, 0x04, + 0xEA, 0x19, 0x8F, 0x1A, 0x94, 0x16, 0x5F, 0x1D, 0x6D, 0x10, 0x68, 0x0C, + 0x9D, 0x10, 0x9E, 0x01, 0x36, 0x0B, 0xCE, 0xF2, 0x2D, 0xF1, 0x72, 0xDC, + 0x07, 0xE1, 0xA6, 0xEB, 0xCC, 0xE5, 0x11, 0x0E, 0xAE, 0xE8, 0xB1, 0x12, + 0x0A, 0xF3, 0x2B, 0x06, 0x4D, 0xFE, 0xD5, 0x09, 0x13, 0xFC, 0x68, 0x15, + 0xD4, 0xFD, 0xB0, 0x19, 0x7C, 0x0D, 0xB7, 0x17, 0x21, 0x20, 0xB2, 0x0F, + 0xF6, 0x32, 0x89, 0x0F, 0x95, 0x37, 0xC6, 0x21, 0xDE, 0x2B, 0x46, 0x2C, + 0x7B, 0x20, 0xEA, 0x2C, 0xDD, 0x18, 0x9F, 0x3C, 0x40, 0x25, 0xCF, 0x4A, + 0x8D, 0x3B, 0xF7, 0x3D, 0x2D, 0x4C, 0xD1, 0x28, 0xB5, 0x4B, 0xBA, 0x1A, + 0xAD, 0x31, 0x92, 0x0E, 0xB2, 0x0F, 0xDB, 0x07, 0x8E, 0xF6, 0xF6, 0xF8, + 0x59, 0x02, 0xA2, 0xEF, 0x8E, 0x1F, 0xE3, 0x01, 0x0B, 0x3A, 0x14, 0x24, + 0x89, 0x53, 0x72, 0x3D, 0xA7, 0x59, 0x10, 0x3C, 0x54, 0x43, 0xED, 0x2B, + 0x5E, 0x34, 0x03, 0x32, 0x8C, 0x3C, 0xEC, 0x41, 0xCD, 0x41, 0xDB, 0x3F, + 0x98, 0x4C, 0x3D, 0x3E, 0x9B, 0x4E, 0xFD, 0x3C, 0x2B, 0x49, 0x53, 0x39, + 0xFE, 0x49, 0xD8, 0x32, 0x06, 0x46, 0xD0, 0x25, 0xF5, 0x36, 0xEC, 0x12, + 0xB0, 0x33, 0x94, 0x0B, 0xB9, 0x2F, 0x4C, 0x00, 0x02, 0x17, 0x9E, 0xEC, + 0x18, 0x12, 0x27, 0xF0, 0x95, 0x1F, 0x8F, 0x04, 0x4E, 0x24, 0x3B, 0x18, + 0x5C, 0x26, 0x30, 0x2B, 0xB5, 0x21, 0xBE, 0x43, 0x15, 0x16, 0xAC, 0x43, + 0xD8, 0x15, 0xBB, 0x26, 0xD3, 0x25, 0x0B, 0x1F, 0x04, 0x34, 0x84, 0x26, + 0x12, 0x3C, 0x43, 0x2E, 0x88, 0x3E, 0x50, 0x38, 0xDB, 0x3B, 0x8B, 0x36, + 0xE7, 0x3C, 0x4A, 0x3A, 0xE0, 0x3E, 0x80, 0x4E, 0xD4, 0x48, 0x8C, 0x58, + 0x12, 0x52, 0x94, 0x4D, 0x9A, 0x48, 0x20, 0x34, 0x6C, 0x31, 0x6C, 0x18, + 0xA3, 0x20, 0x74, 0x06, 0x5D, 0x0E, 0xC3, 0xE7, 0x15, 0xF2, 0x15, 0xD3, + 0x88, 0xF5, 0x09, 0xE5, 0xE2, 0x19, 0x0F, 0x09, 0x25, 0x3E, 0x66, 0x2F, + 0x2E, 0x57, 0xAE, 0x40, 0x23, 0x53, 0xAF, 0x36, 0x28, 0x3F, 0x7F, 0x25, + 0x14, 0x44, 0x94, 0x1E, 0xCC, 0x4D, 0x01, 0x1E, 0xF6, 0x40, 0xB6, 0x26, + 0x76, 0x33, 0xD6, 0x36, 0xFF, 0x33, 0xC7, 0x44, 0xC8, 0x3E, 0x63, 0x4C, + 0x67, 0x42, 0x4C, 0x44, 0xA6, 0x33, 0xD0, 0x26, 0xE1, 0x20, 0x62, 0x0E, + 0xE6, 0x06, 0x1C, 0x0A, 0x75, 0xE9, 0xA4, 0xF4, 0x39, 0xE8, 0x13, 0xE7, + 0x2B, 0xFE, 0xEA, 0xF9, 0x3D, 0x09, 0x86, 0x05, 0xC1, 0x00, 0xB0, 0x11, + 0xBA, 0xF0, 0x16, 0x1C, 0xB9, 0xE9, 0x6B, 0x11, 0xE9, 0xF5, 0x39, 0x0F, + 0x60, 0x01, 0x2B, 0x15, 0xBB, 0x0F, 0xA9, 0x0A, 0xC5, 0x30, 0xBD, 0x05, + 0x6E, 0x44, 0x21, 0x17, 0x57, 0x35, 0x1D, 0x32, 0xB2, 0x1E, 0x5C, 0x45, + 0x10, 0x0B, 0x9A, 0x3A, 0xC4, 0x10, 0x2A, 0x2A, 0x56, 0x41, 0x4A, 0x2A, + 0x4E, 0x4D, 0x3A, 0x29, 0xD8, 0x2C, 0x85, 0x2A, 0xD0, 0x09, 0x83, 0x11, + 0x2E, 0xE1, 0x32, 0xE6, 0xC4, 0xCA, 0x23, 0xC9, 0x20, 0xC7, 0xAC, 0xAB, + 0x4B, 0xD5, 0x7F, 0xB4, 0x84, 0xF3, 0x7C, 0xE9, 0xAE, 0x08, 0xB2, 0x04, + 0x61, 0x16, 0xA5, 0x11, 0x3E, 0x26, 0xBB, 0x2D, 0x92, 0x27, 0x81, 0x2D, + 0x52, 0x21, 0x66, 0x1C, 0xC0, 0x2B, 0xC7, 0x23, 0xBB, 0x39, 0x0F, 0x32, + 0xC1, 0x3B, 0x65, 0x30, 0x45, 0x30, 0xBB, 0x32, 0x51, 0x1F, 0x27, 0x3D, + 0x25, 0x0A, 0xE6, 0x2E, 0x18, 0xF0, 0x49, 0x1F, 0xC6, 0xDC, 0x22, 0x11, + 0xC2, 0xD9, 0xA5, 0xEF, 0xF3, 0xD8, 0x6A, 0xD1, 0xEB, 0xD5, 0x26, 0xCB, + 0x08, 0xE3, 0x9D, 0xDD, 0x84, 0xEE, 0x9F, 0x02, 0x15, 0xE3, 0x7C, 0x1A, + 0xDD, 0xE1, 0x22, 0x1C, 0x94, 0xF7, 0xD7, 0x35, 0xE7, 0xFF, 0xD9, 0x51, + 0xAA, 0xFC, 0xF3, 0x49, 0xE1, 0x08, 0x7A, 0x31, 0x98, 0x1B, 0xC0, 0x22, + 0x3C, 0x23, 0x5A, 0x2E, 0xD2, 0x14, 0x59, 0x32, 0x2F, 0x03, 0x62, 0x2D, + 0xCA, 0x0A, 0x64, 0x36, 0x0D, 0x0F, 0xEA, 0x32, 0xAC, 0x0A, 0x92, 0x30, + 0xB9, 0x0D, 0x3F, 0x31, 0x71, 0xFF, 0x68, 0x00, 0x2A, 0xD8, 0x89, 0xBF, + 0xF5, 0xB2, 0xE3, 0xAA, 0x3B, 0xAD, 0x28, 0xA9, 0xE8, 0xBF, 0x1A, 0xAF, + 0x25, 0xDC, 0xD7, 0xCB, 0xA8, 0x04, 0x00, 0xF6, 0x61, 0x30, 0x78, 0x1D, + 0x93, 0x40, 0x0D, 0x29, 0x86, 0x35, 0x91, 0x1A, 0x75, 0x26, 0xBB, 0x00, + 0x60, 0x0A, 0xD7, 0xE9, 0x7D, 0xFE, 0xDB, 0xF4, 0xC1, 0xFA, 0x9B, 0x01, + 0x49, 0xE9, 0x89, 0xFD, 0xE1, 0xE6, 0x53, 0xF6, 0x7E, 0xED, 0xF2, 0xE7, + 0xE7, 0xCE, 0x83, 0xD8, 0x58, 0xA2, 0xB8, 0xD6, 0x93, 0x9E, 0x3C, 0xD0, + 0xEE, 0xAB, 0x01, 0xB9, 0x29, 0xAA, 0x0C, 0xA3, 0xCA, 0xAD, 0xF0, 0xA7, + 0x4A, 0xBD, 0x4A, 0xC7, 0xC8, 0xBA, 0xCF, 0xDA, 0x11, 0xC5, 0xFA, 0xF0, + 0xD2, 0xD8, 0x22, 0x00, 0x85, 0xD9, 0x57, 0x01, 0x8D, 0xE0, 0x3A, 0xFC, + 0x5A, 0xE3, 0xD9, 0xE5, 0x9A, 0xDB, 0xDD, 0xDD, 0x5B, 0xDF, 0xFE, 0xEB, + 0x5C, 0xDB, 0x07, 0xF3, 0xBF, 0xCE, 0xE1, 0xF1, 0x73, 0xD9, 0x43, 0xF7, + 0x3B, 0xDE, 0xFB, 0xE9, 0x39, 0xD5, 0x70, 0xDA, 0x43, 0xE1, 0x0B, 0xE8, + 0xC3, 0xD9, 0x42, 0xE0, 0xED, 0xB8, 0x9B, 0xBB, 0xB0, 0xAB, 0x72, 0xA7, + 0x78, 0xAB, 0xA2, 0xA5, 0x6C, 0xB3, 0x80, 0xAC, 0xA2, 0xC7, 0x23, 0xC8, + 0x24, 0xEB, 0x02, 0xF6, 0x18, 0x09, 0x1A, 0x17, 0x55, 0x14, 0xB0, 0x1B, + 0xCC, 0x21, 0x63, 0x1A, 0x9D, 0x22, 0x2F, 0x1D, 0x51, 0x14, 0xA9, 0x12, + 0x2A, 0x07, 0xC8, 0x07, 0x1D, 0x03, 0x0B, 0x04, 0xD1, 0x05, 0xF7, 0xF6, + 0xA9, 0x00, 0x10, 0xF4, 0x14, 0xE8, 0xC7, 0xF7, 0x14, 0xC4, 0x25, 0xDD, + 0xAE, 0xB1, 0x81, 0xB6, 0x32, 0xB9, 0xDE, 0xAA, 0x0C, 0xB9, 0x62, 0xA5, + 0x83, 0xAC, 0x33, 0xA9, 0x77, 0xAE, 0x86, 0xC4, 0xB1, 0xC0, 0x11, 0xD6, + 0x43, 0xE0, 0xD6, 0xDE, 0x38, 0xFA, 0xE1, 0xF7, 0x33, 0xF5, 0x3C, 0x11, + 0x00, 0xE9, 0x57, 0x13, 0x98, 0xED, 0x65, 0x18, 0xE5, 0xF3, 0x24, 0x0A, + 0x22, 0xFC, 0x55, 0xE5, 0x18, 0x08, 0xD6, 0xF2, 0xB0, 0x0C, 0xA5, 0x0F, + 0xCF, 0x10, 0x91, 0x08, 0x1D, 0x0D, 0xDE, 0x02, 0x57, 0xFD, 0x89, 0x07, + 0xFD, 0xF9, 0x79, 0x07, 0xE7, 0xF8, 0x4D, 0x00, 0x5F, 0xE2, 0xBC, 0xE8, + 0x00, 0xC7, 0xC6, 0xC6, 0x10, 0xB9, 0x7E, 0xB1, 0x4A, 0xAA, 0x71, 0xA6, + 0xA0, 0xAA, 0x58, 0xA7, 0x4A, 0xC9, 0x4E, 0xBD, 0x0F, 0xF7, 0xC4, 0xF4, + 0xDC, 0x2D, 0xDE, 0x2E, 0xC5, 0x55, 0xBD, 0x46, 0x01, 0x55, 0x3F, 0x4D, + 0xE1, 0x42, 0xEE, 0x35, 0x63, 0x46, 0x8D, 0x18, 0xBF, 0x36, 0x92, 0x16, + 0x3F, 0x1C, 0xE6, 0x22, 0x11, 0x1E, 0x6D, 0x1E, 0x4B, 0x19, 0x33, 0x08, + 0x4C, 0x07, 0x92, 0xF4, 0x2F, 0xF8, 0x34, 0xE6, 0x83, 0xE0, 0x99, 0xDE, + 0xA9, 0xC7, 0x61, 0xDC, 0xFC, 0xBB, 0xF7, 0xD0, 0x8A, 0xB6, 0xA0, 0xBE, + 0xFC, 0xCA, 0xB2, 0xCE, 0x1C, 0xEF, 0x57, 0xEE, 0xA6, 0xFC, 0xD6, 0x08, + 0xFD, 0xF9, 0x02, 0x29, 0xDB, 0xFF, 0xF5, 0x28, 0xBD, 0x1B, 0x01, 0x0F, + 0x0B, 0x40, 0xA8, 0x09, 0xAD, 0x4C, 0xE3, 0x0A, 0x09, 0x3D, 0x3B, 0x00, + 0x57, 0x26, 0xF0, 0x08, 0x88, 0x31, 0x0C, 0x2A, 0x98, 0x44, 0x91, 0x27, + 0xBF, 0x2D, 0x18, 0x08, 0xC9, 0x11, 0xDB, 0xF8, 0xC2, 0x0E, 0x98, 0xF2, + 0x7E, 0x0F, 0x8F, 0xF2, 0x33, 0x02, 0xF5, 0xF0, 0x16, 0xE5, 0x02, 0xDF, + 0xD9, 0xCD, 0xE1, 0xCC, 0xD1, 0xD4, 0x69, 0xC3, 0x1D, 0xE3, 0x9C, 0xB3, + 0x9F, 0xEC, 0x8A, 0xB8, 0x36, 0xFE, 0xB2, 0xE1, 0x22, 0x16, 0xEB, 0x12, + 0x57, 0x37, 0xFC, 0x3A, 0x47, 0x54, 0x63, 0x52, 0x3E, 0x53, 0x50, 0x46, + 0x63, 0x4E, 0xFF, 0x27, 0xA4, 0x43, 0x4D, 0x15, 0x82, 0x2B, 0x54, 0x05, + 0xC2, 0x29, 0xE9, 0xFD, 0x04, 0x1C, 0x00, 0xFC, 0x99, 0xFC, 0x43, 0xF7, + 0xAF, 0xEB, 0x90, 0xF4, 0xAB, 0xE1, 0xEC, 0xDE, 0xAA, 0xF1, 0xAF, 0xCB, + 0xF7, 0x00, 0x42, 0xD3, 0x49, 0xE3, 0x8E, 0xCD, 0xA7, 0xCD, 0x7B, 0xC9, + 0x06, 0xF0, 0xA0, 0xE7, 0x70, 0x27, 0x86, 0x07, 0xC1, 0x3E, 0x6D, 0x21, + 0x99, 0x30, 0x0F, 0x41, 0xC2, 0x19, 0x18, 0x49, 0x54, 0x1F, 0x25, 0x48, + 0xB9, 0x43, 0xEA, 0x4F, 0x38, 0x50, 0x20, 0x33, 0x07, 0x44, 0x9B, 0x13, + 0xA3, 0x4B, 0xDD, 0x1E, 0xEA, 0x4C, 0x20, 0x2E, 0xCB, 0x43, 0x3D, 0x3B, + 0x80, 0x3D, 0xE0, 0x3B, 0x57, 0x27, 0xC4, 0x23, 0x6E, 0x2A, 0x4D, 0x1B, + 0xA2, 0x3E, 0xC1, 0x28, 0x10, 0x36, 0xE6, 0x2C, 0xCE, 0x20, 0x49, 0x17, + 0x81, 0x08, 0x09, 0xFC, 0x85, 0xFF, 0xA5, 0xF4, 0x2A, 0x10, 0xD7, 0xF4, + 0x97, 0x25, 0x5D, 0xFC, 0x80, 0x32, 0xE2, 0x10, 0x40, 0x47, 0x2B, 0x34, + 0x00, 0x5E, 0x52, 0x50, 0xE9, 0x61, 0x54, 0x4A, 0x96, 0x60, 0x76, 0x3D, + 0xD3, 0x4C, 0x4E, 0x2F, 0x81, 0x2A, 0xA0, 0x17, 0x01, 0x1F, 0xD9, 0x0D, + 0x4E, 0x1F, 0x77, 0x06, 0xA7, 0x14, 0x81, 0xFA, 0xA9, 0x0D, 0x8B, 0xFF, + 0x33, 0x09, 0xED, 0xFF, 0xBE, 0xFD, 0xAE, 0xF3, 0x7D, 0x03, 0xED, 0x00, + 0xC1, 0x06, 0x54, 0x08, 0x8B, 0xF0, 0x6A, 0xEC, 0x05, 0xE9, 0x3F, 0xE5, + 0x21, 0xFA, 0xD2, 0x05, 0xC9, 0x05, 0xC7, 0x23, 0x5A, 0x14, 0xF6, 0x3C, + 0x1F, 0x22, 0xFB, 0x44, 0x0F, 0x25, 0x66, 0x34, 0xC3, 0x31, 0x3B, 0x39, + 0xAA, 0x32, 0x2A, 0x3A, 0x26, 0x2B, 0x06, 0x26, 0x18, 0x2B, 0x80, 0x1D, + 0x9A, 0x20, 0x98, 0x18, 0x92, 0x15, 0x2A, 0x11, 0xE1, 0x18, 0x60, 0x08, + 0x69, 0x11, 0x33, 0x02, 0x0E, 0x03, 0xB6, 0x0A, 0x7B, 0x0D, 0xFE, 0x1C, + 0x87, 0x17, 0x97, 0x2B, 0x04, 0x0D, 0x0A, 0x21, 0x55, 0xFD, 0x1F, 0x08, + 0x15, 0xE2, 0x1F, 0xF4, 0x52, 0xD1, 0xB4, 0xE1, 0x58, 0xDF, 0x8E, 0xDD, + 0x42, 0xF9, 0x21, 0xF8, 0x3D, 0x27, 0xEB, 0x2E, 0x5A, 0x58, 0x58, 0x5C, + 0x97, 0x63, 0x03, 0x69, 0x68, 0x5A, 0x6B, 0x60, 0x11, 0x47, 0x70, 0x41, + 0x97, 0x33, 0x3D, 0x23, 0x72, 0x25, 0x0A, 0x20, 0x35, 0x0C, 0x9C, 0x1C, + 0x68, 0xFA, 0x03, 0x08, 0x60, 0xF7, 0x47, 0xFC, 0x75, 0x07, 0xB3, 0xF7, + 0xE5, 0x15, 0xB7, 0xF0, 0xEE, 0x01, 0x21, 0xF6, 0x0E, 0xF7, 0x36, 0xFB, + 0x01, 0xF3, 0xB1, 0xE6, 0x48, 0xEA, 0x58, 0xDA, 0xF5, 0xFC, 0x32, 0xEF, + 0xB5, 0x14, 0x54, 0x0E, 0xB5, 0x15, 0xA2, 0x24, 0x23, 0x12, 0x36, 0x2D, + 0xEE, 0x21, 0x3A, 0x40, 0x5A, 0x2C, 0x06, 0x50, 0xBC, 0x25, 0x07, 0x42, + 0x70, 0x1A, 0xDC, 0x1C, 0xEF, 0x09, 0x6A, 0x01, 0xE4, 0x05, 0x52, 0x15, + 0x43, 0x0B, 0xE7, 0x24, 0x48, 0x07, 0xF7, 0x14, 0x6B, 0x05, 0xB0, 0x10, + 0xD2, 0x0C, 0xA0, 0x10, 0xEF, 0x1F, 0xCC, 0x1F, 0x4B, 0x2C, 0x98, 0x3A, + 0x33, 0x14, 0x69, 0x29, 0x4A, 0xEF, 0xF3, 0x03, 0x68, 0xDD, 0x43, 0xE9, + 0x5B, 0xD4, 0xCC, 0xC7, 0xA1, 0xCA, 0x35, 0xBE, 0x75, 0xD3, 0xCF, 0xDC, + 0x77, 0x04, 0x53, 0x0A, 0x4D, 0x42, 0x92, 0x33, 0x57, 0x58, 0x77, 0x4D, + 0x03, 0x4E, 0xFF, 0x54, 0xB7, 0x44, 0x2F, 0x49, 0x7D, 0x26, 0x30, 0x29, + 0x7E, 0x00, 0x41, 0x03, 0x2F, 0xF9, 0x1C, 0xF4, 0x82, 0xFA, 0x97, 0xFD, + 0x02, 0xE9, 0x5A, 0x02, 0x29, 0xD7, 0x57, 0x01, 0x76, 0xD7, 0xF7, 0xFF, + 0xE3, 0xDD, 0xA1, 0xF5, 0x79, 0xE7, 0x1F, 0xEF, 0x33, 0xDA, 0x1D, 0xE6, + 0x57, 0xB0, 0x8F, 0xCD, 0x4D, 0xA9, 0x12, 0xCD, 0x2A, 0xC7, 0x49, 0xF1, + 0x1F, 0xE6, 0x95, 0x10, 0xE3, 0xF9, 0x5F, 0x12, 0xE5, 0xFA, 0xEA, 0x09, + 0x4A, 0x04, 0x6E, 0x15, 0x99, 0x1E, 0x49, 0x28, 0xBF, 0x14, 0x24, 0x22, + 0x23, 0xEA, 0xC2, 0x0D, 0x31, 0xDC, 0x4F, 0xFF, 0x54, 0xEA, 0xCB, 0xF5, + 0xE1, 0x01, 0x12, 0xF6, 0xD5, 0xFB, 0x3F, 0xF3, 0xCF, 0xC6, 0x05, 0xE4, + 0x27, 0xBA, 0x7A, 0xF0, 0x9F, 0xE6, 0x98, 0x0B, 0xFB, 0xFB, 0x11, 0xFE, + 0x2B, 0xE5, 0xDF, 0xDE, 0x4B, 0xBC, 0x89, 0xBD, 0x38, 0x9F, 0x5D, 0xA2, + 0x5C, 0x99, 0xB6, 0xA4, 0x50, 0xA4, 0xA8, 0xAB, 0xA6, 0xBB, 0x78, 0xBA, + 0xEC, 0xE3, 0x1C, 0xEE, 0x0E, 0x12, 0xC3, 0x27, 0xB6, 0x24, 0xC9, 0x38, + 0x3E, 0x21, 0xAD, 0x1F, 0xE2, 0x0B, 0x10, 0xF0, 0xD3, 0xE0, 0xCC, 0xD3, + 0x05, 0xD3, 0x43, 0xDB, 0xA7, 0xE1, 0x14, 0xDE, 0xD3, 0xDB, 0x56, 0xD0, + 0xA3, 0xCA, 0x56, 0xD1, 0xBA, 0xB5, 0xD0, 0xE0, 0x03, 0xA5, 0xAC, 0xE0, + 0xA7, 0xAD, 0xCF, 0xD4, 0x12, 0xAF, 0xD7, 0xC0, 0xA1, 0xA3, 0xF1, 0xA5, + 0xCC, 0xAA, 0x8A, 0xA2, 0xD3, 0xB5, 0x60, 0xBF, 0x4B, 0xBB, 0x2E, 0xD6, + 0xC7, 0xC7, 0x5F, 0xE6, 0x8B, 0xD7, 0xA3, 0x01, 0x3F, 0xDF, 0x8A, 0x04, + 0xAC, 0xE4, 0x47, 0xF9, 0xDF, 0xE6, 0x29, 0xED, 0x00, 0xDF, 0x95, 0xE3, + 0x2A, 0xD3, 0xC1, 0xE8, 0x68, 0xD1, 0xD6, 0xF1, 0x55, 0xDB, 0x83, 0xF5, + 0xB5, 0xE5, 0x8F, 0xEC, 0xF5, 0xEA, 0xF2, 0xE6, 0x8B, 0xE0, 0x8B, 0xEC, + 0x6D, 0xCE, 0xB0, 0xF7, 0xDC, 0xD2, 0x37, 0x02, 0x24, 0xD6, 0x8A, 0xEC, + 0x7E, 0xC6, 0x52, 0xC2, 0xEA, 0xB5, 0x04, 0xA9, 0xD9, 0xA7, 0xAC, 0xA0, + 0x5A, 0xAE, 0x46, 0xA2, 0xBB, 0xCF, 0x54, 0xB3, 0x72, 0x07, 0x0D, 0xDE, + 0xCD, 0x3F, 0x5F, 0x0D, 0xCD, 0x50, 0x3B, 0x22, 0x6F, 0x3E, 0xA2, 0x1C, + 0xC4, 0x21, 0x82, 0x06, 0x4E, 0x02, 0xAE, 0xE4, 0x97, 0xF1, 0xBB, 0xD1, + 0x3C, 0xEF, 0x51, 0xD4, 0x32, 0xE7, 0x9D, 0xD4, 0xF2, 0xDB, 0xE5, 0xD9, + 0x6D, 0xD9, 0xE8, 0xEB, 0x6C, 0xD4, 0x6B, 0xEF, 0x5F, 0xCE, 0xAD, 0xE0, + 0xF6, 0xC9, 0xCD, 0xD3, 0xEC, 0xB9, 0x1F, 0xC3, 0x42, 0xB4, 0xE3, 0xB7, + 0x2A, 0xB7, 0xEF, 0xC2, 0x22, 0xB2, 0x2B, 0xCC, 0xE4, 0xC0, 0xDB, 0xD7, + 0x84, 0xDF, 0x30, 0xEC, 0xC0, 0xF7, 0x26, 0xF5, 0x6C, 0x08, 0x69, 0xFA, + 0xE9, 0x03, 0x50, 0xFA, 0x47, 0xEF, 0x2F, 0xEE, 0x42, 0xEB, 0x5F, 0xE6, + 0x2B, 0xF8, 0x1B, 0xE3, 0xFE, 0xFF, 0xCA, 0xDD, 0x4D, 0xF2, 0x6A, 0xDB, + 0x28, 0xDE, 0xE2, 0xE0, 0x16, 0xDB, 0x86, 0xEA, 0x07, 0xE9, 0x62, 0xF5, + 0x05, 0xF4, 0x0D, 0xFB, 0x3B, 0xE9, 0x84, 0xF1, 0x45, 0xD0, 0xDE, 0xD7, + 0x0E, 0xC0, 0xF2, 0xBF, 0xCD, 0xBA, 0x93, 0xAE, 0x24, 0xBA, 0xD8, 0x9E, + 0x9B, 0xC0, 0xC4, 0xA3, 0x10, 0xE0, 0xDC, 0xD8, 0xDD, 0x19, 0xD0, 0x17, + 0x8D, 0x4B, 0x38, 0x36, 0x12, 0x55, 0xA2, 0x34, 0x51, 0x3B, 0x9A, 0x1F, + 0x59, 0x1D, 0xBA, 0x0A, 0x60, 0x0A, 0xB5, 0xF0, 0xEF, 0x01, 0x81, 0xDB, + 0x1E, 0xFF, 0x35, 0xCF, 0x2D, 0xF3, 0x43, 0xCC, 0xC6, 0xED, 0xC7, 0xE0, + 0x58, 0xF1, 0xA1, 0xE4, 0x79, 0xEF, 0xB6, 0xD1, 0x79, 0xEF, 0x17, 0xCA, + 0x67, 0xE6, 0xAB, 0xC1, 0x6E, 0xCF, 0x97, 0xAC, 0x6B, 0xDB, 0xEC, 0xB5, + 0xFD, 0xFB, 0x4F, 0xD7, 0xA1, 0xF2, 0xA0, 0xE9, 0x99, 0xEF, 0x4E, 0xFB, + 0x17, 0x10, 0xB1, 0x09, 0xBC, 0x1F, 0xB5, 0x10, 0xB0, 0x1C, 0xD6, 0x10, + 0xFD, 0x0B, 0x9A, 0x03, 0xE5, 0xF4, 0x02, 0xFF, 0x51, 0xF8, 0x71, 0x08, + 0x75, 0x06, 0xE2, 0x02, 0x5F, 0x16, 0x13, 0xF9, 0x81, 0x1F, 0x58, 0x00, + 0x90, 0x0A, 0x27, 0x0B, 0xEC, 0x00, 0x0E, 0x1A, 0x1E, 0x0E, 0x8C, 0x23, + 0x8D, 0x09, 0x75, 0x11, 0x25, 0xF7, 0x70, 0xF5, 0xEA, 0xD9, 0x97, 0xD7, + 0xB7, 0xC2, 0x60, 0xBC, 0x37, 0xCD, 0x7C, 0xB1, 0xD5, 0xEA, 0x5B, 0xC5, + 0x33, 0x0B, 0xDF, 0xF3, 0x97, 0x3A, 0xEA, 0x2A, 0xF5, 0x5D, 0x15, 0x54, + 0xDD, 0x58, 0x22, 0x54, 0xD5, 0x4D, 0xCC, 0x43, 0xDC, 0x42, 0x64, 0x2D, + 0x13, 0x30, 0x42, 0x09, 0x27, 0x20, 0x8D, 0xF5, 0xF0, 0x0F, 0x2C, 0xF9, + 0x21, 0x09, 0x2A, 0x09, 0x8E, 0x11, 0x12, 0x1D, 0x42, 0x13, 0xFD, 0x27, + 0xA2, 0x08, 0x02, 0x22, 0xFB, 0x0E, 0x23, 0x18, 0x95, 0x0B, 0xA6, 0x06, + 0xD0, 0xE4, 0xB7, 0xEF, 0xFA, 0xDB, 0x69, 0xF3, 0xAD, 0xFA, 0x2A, 0x10, + 0xB1, 0x0A, 0xBB, 0x28, 0x02, 0x16, 0x2F, 0x31, 0x6B, 0x2A, 0xDF, 0x2E, + 0xE2, 0x36, 0x02, 0x34, 0xAD, 0x37, 0xB4, 0x42, 0xA5, 0x2F, 0xA2, 0x44, + 0x73, 0x26, 0x3D, 0x32, 0x05, 0x28, 0xA1, 0x14, 0x99, 0x2F, 0x5E, 0x0C, + 0xF6, 0x34, 0x15, 0x1F, 0x22, 0x32, 0xE1, 0x28, 0x37, 0x27, 0x69, 0x2A, + 0xFF, 0x2B, 0x3A, 0x33, 0x13, 0x3D, 0x70, 0x3D, 0x56, 0x3B, 0x91, 0x32, + 0x20, 0x1B, 0x0F, 0x13, 0xB0, 0xFB, 0xAC, 0xF6, 0x87, 0xED, 0x43, 0xD9, + 0x9B, 0xDC, 0xFF, 0xC0, 0x6D, 0xD7, 0x71, 0xC7, 0xE7, 0xEF, 0x32, 0xEF, + 0x7F, 0x1E, 0x36, 0x21, 0xAA, 0x4F, 0x8E, 0x4A, 0x37, 0x68, 0x09, 0x5E, + 0x8E, 0x5E, 0xDC, 0x59, 0x08, 0x48, 0x49, 0x49, 0xFF, 0x39, 0x69, 0x27, + 0xFE, 0x2D, 0x05, 0xFF, 0xDE, 0x1D, 0xDE, 0xF1, 0x35, 0x09, 0x0C, 0xFE, + 0xEF, 0xFF, 0x02, 0x0C, 0xFC, 0x00, 0x8D, 0x11, 0x20, 0xFF, 0x66, 0x0F, + 0xB1, 0x04, 0x0C, 0x08, 0xED, 0xF9, 0x97, 0xED, 0x0B, 0xDF, 0x03, 0xCF, + 0xB3, 0xDF, 0xA8, 0xD5, 0x12, 0xEA, 0x2A, 0xEC, 0xFD, 0xED, 0x55, 0xFC, + 0x1A, 0xFF, 0x17, 0x16, 0x0C, 0x0D, 0xF7, 0x27, 0x1C, 0x1C, 0x6C, 0x34, + 0x5F, 0x26, 0x82, 0x3C, 0x91, 0x0D, 0x60, 0x32, 0xBE, 0xF1, 0x52, 0x2C, + 0xE6, 0xFC, 0x86, 0x26, 0xC0, 0x13, 0xA8, 0x0E, 0xFB, 0x12, 0x78, 0xF9, + 0x72, 0x0E, 0x9A, 0xFA, 0x3C, 0x0F, 0x4C, 0x0C, 0x6A, 0x13, 0xA5, 0x27, + 0x14, 0x24, 0xEB, 0x3C, 0x91, 0x23, 0x05, 0x34, 0xB4, 0x05, 0x6B, 0x1B, + 0x81, 0xE7, 0xC9, 0xFA, 0x66, 0xD7, 0xCB, 0xD7, 0xCE, 0xC5, 0x33, 0xC2, + 0xB7, 0xC8, 0xC1, 0xC2, 0x63, 0xF5, 0xC4, 0xDC, 0xF3, 0x2F, 0x42, 0x07, + 0x4F, 0x59, 0x21, 0x31, 0x77, 0x5B, 0x68, 0x40, 0xD4, 0x52, 0x26, 0x42, + 0x65, 0x49, 0x65, 0x38, 0x26, 0x32, 0x1C, 0x12, 0xC6, 0x20, 0x61, 0xF2, + 0x01, 0x19, 0x8E, 0xF0, 0x04, 0x0D, 0x3D, 0xF2, 0xC1, 0x00, 0xE8, 0x01, + 0x43, 0xFA, 0x6D, 0x16, 0xBF, 0xF7, 0xE4, 0x0D, 0xDF, 0xF6, 0x6E, 0x05, + 0xA1, 0xEF, 0xC8, 0x01, 0xC8, 0xE3, 0x72, 0xEE, 0x4E, 0xDA, 0x1E, 0xEB, + 0xB9, 0xCF, 0xEE, 0x03, 0x7E, 0xDB, 0xDA, 0x18, 0xEC, 0xEE, 0xBC, 0x19, + 0x49, 0xF8, 0x15, 0x19, 0x4C, 0x15, 0xFA, 0x29, 0x75, 0x27, 0x61, 0x3A, + 0xAA, 0x1E, 0x46, 0x40, 0x04, 0x13, 0xB2, 0x3A, 0xAD, 0x06, 0xF6, 0x19, + 0xFE, 0x02, 0xD7, 0xFD, 0x1E, 0x0B, 0x63, 0xFE, 0x8C, 0x11, 0x7B, 0x09, + 0xCA, 0x11, 0x01, 0x15, 0x69, 0x1B, 0xFB, 0x1D, 0xD8, 0x23, 0xEF, 0x2B, + 0xE5, 0x13, 0xA4, 0x38, 0x82, 0xF9, 0xA2, 0x2C, 0x09, 0xEB, 0xD1, 0x0C, + 0x8A, 0xD6, 0x41, 0xE7, 0xA1, 0xC7, 0x48, 0xCE, 0xD5, 0xE5, 0x74, 0xDF, + 0x41, 0x08, 0xA8, 0x04, 0xC6, 0x16, 0x00, 0x22, 0x29, 0x2D, 0xA8, 0x39, + 0x98, 0x39, 0xF8, 0x47, 0xAD, 0x2B, 0x0C, 0x48, 0x49, 0x18, 0x61, 0x2F, + 0x88, 0x0F, 0x9A, 0x14, 0xAA, 0x14, 0x12, 0x0E, 0x2F, 0x25, 0xD7, 0x0F, + 0xFD, 0x29, 0xD4, 0x14, 0x1B, 0x17, 0x59, 0x18, 0x7B, 0x09, 0x96, 0x10, + 0x6F, 0xF9, 0x73, 0xFD, 0xF3, 0xE0, 0x58, 0xE9, 0x81, 0xDB, 0xB6, 0xD0, + 0xBE, 0xE2, 0x4F, 0xC1, 0x56, 0xEE, 0xDC, 0xC6, 0x74, 0xF3, 0xCA, 0xD0, + 0x66, 0xF6, 0x9E, 0xE8, 0xE4, 0x06, 0x29, 0x0A, 0xF2, 0x18, 0xED, 0x1D, + 0xEB, 0x1F, 0x37, 0x25, 0x98, 0x18, 0x68, 0x26, 0xBE, 0xFF, 0xFE, 0x1B, + 0x6D, 0xDD, 0x34, 0x07, 0x8B, 0xD9, 0x1F, 0x04, 0x1E, 0xF5, 0xCE, 0x0D, + 0x8B, 0x05, 0x7C, 0x06, 0xA8, 0x0A, 0xAF, 0x0B, 0x23, 0x18, 0xD5, 0x23, + 0x21, 0x29, 0x8C, 0x2B, 0xAC, 0x19, 0xA2, 0x26, 0x92, 0xE3, 0x5F, 0x10, + 0x84, 0xC5, 0x56, 0xEB, 0xA4, 0xC7, 0xDD, 0xD1, 0x88, 0xC1, 0x75, 0xC3, + 0x5A, 0xC4, 0xCA, 0xCC, 0x18, 0xDC, 0x42, 0xE8, 0x48, 0x04, 0xF8, 0xFF, + 0x4C, 0x32, 0x63, 0x1E, 0xDD, 0x3B, 0x52, 0x2A, 0x4E, 0x2A, 0xD0, 0x1F, + 0x8A, 0x1B, 0xE2, 0x12, 0xF7, 0x0A, 0x4D, 0x09, 0x8E, 0x02, 0xEA, 0x00, + 0xC4, 0x11, 0xA2, 0xFB, 0x16, 0x1F, 0x2C, 0x05, 0x27, 0x14, 0xCB, 0x07, + 0xC1, 0xFE, 0x2D, 0x00, 0x01, 0xF1, 0x11, 0xF7, 0xC6, 0xE8, 0x24, 0xE9, + 0x06, 0xE2, 0xA9, 0xE3, 0xEB, 0xDF, 0x83, 0xE1, 0xE2, 0xD8, 0x5A, 0xDD, + 0x4F, 0xDB, 0xD9, 0xE6, 0x1F, 0xEC, 0xFD, 0xF5, 0xAF, 0xEC, 0x52, 0xFD, + 0xA7, 0xE3, 0xF1, 0x00, 0xE3, 0xEB, 0xA5, 0x07, 0x64, 0xF3, 0x92, 0x0D, + 0x53, 0xF0, 0x1A, 0x12, 0x74, 0xF0, 0x65, 0x15, 0x17, 0xF4, 0xE6, 0x04, + 0x13, 0xFA, 0xE4, 0xEC, 0x62, 0x04, 0x18, 0xEA, 0x04, 0x11, 0x82, 0xF9, + 0x3E, 0x15, 0xEF, 0x0A, 0x02, 0x0A, 0x68, 0x09, 0x48, 0xFB, 0x19, 0xFF, + 0x26, 0xEF, 0x30, 0xF8, 0x42, 0xDC, 0x25, 0xE5, 0x03, 0xC9, 0x37, 0xD0, + 0xDC, 0xC5, 0x53, 0xCC, 0xBD, 0xD5, 0xAF, 0xD1, 0xB5, 0xEB, 0xA3, 0xDE, + 0xEE, 0xF5, 0x9C, 0xE9, 0x05, 0xF1, 0xA7, 0xED, 0x4C, 0xE6, 0xA7, 0xF2, + 0x2D, 0xEB, 0x18, 0xFA, 0x93, 0xF6, 0xD0, 0x02, 0x49, 0xF7, 0x27, 0xF9, + 0x3D, 0xF5, 0x30, 0xE5, 0xEC, 0xF9, 0xED, 0xE1, 0x21, 0x09, 0x18, 0xE6, + 0xE6, 0x05, 0x1F, 0xE5, 0x1D, 0xE7, 0x66, 0xDF, 0x15, 0xCD, 0x8C, 0xD0, + 0x4C, 0xC9, 0x60, 0xC7, 0x98, 0xD4, 0x89, 0xD2, 0xAE, 0xD4, 0x53, 0xCD, + 0x9B, 0xC9, 0x0E, 0xB2, 0xF6, 0xC7, 0x43, 0xA9, 0xD8, 0xCC, 0x66, 0xB5, + 0x49, 0xCD, 0x69, 0xC6, 0x70, 0xCA, 0xA8, 0xD4, 0xE5, 0xCA, 0x9D, 0xD7, + 0xB3, 0xCC, 0xAA, 0xCF, 0xDE, 0xDD, 0x9B, 0xD1, 0xAC, 0xE3, 0x7C, 0xDE, + 0x3D, 0xC8, 0xA1, 0xE3, 0x0A, 0xC5, 0x2B, 0xEE, 0x09, 0xD5, 0xF4, 0xF7, + 0xB5, 0xDC, 0xFD, 0xE9, 0x5A, 0xE1, 0x63, 0xDF, 0xF0, 0xE3, 0x8B, 0xE2, + 0x26, 0xE4, 0x6E, 0xE0, 0x64, 0xD4, 0x41, 0xE6, 0xD0, 0xC8, 0x45, 0xF2, + 0xB1, 0xCF, 0x67, 0xE8, 0xCE, 0xD1, 0x5F, 0xCF, 0x1E, 0xC8, 0x71, 0xC6, + 0xF2, 0xBE, 0x1D, 0xCB, 0x85, 0xBE, 0x4B, 0xC8, 0x7E, 0xC2, 0x78, 0xC0, + 0xB3, 0xCC, 0xFA, 0xBA, 0xDF, 0xE4, 0xEC, 0xBB, 0x1B, 0xFA, 0x28, 0xC8, + 0xE4, 0x00, 0xD7, 0xD5, 0x03, 0x06, 0xD6, 0xE3, 0x4A, 0x09, 0x25, 0xEC, + 0x15, 0x12, 0x03, 0xE6, 0x89, 0x1B, 0xFA, 0xDC, 0xAA, 0x11, 0x24, 0xD3, + 0x66, 0xF4, 0x66, 0xC7, 0x9F, 0xD4, 0x56, 0xC2, 0x68, 0xC9, 0x2B, 0xC9, + 0xD2, 0xC8, 0xA9, 0xCA, 0x6B, 0xD0, 0x49, 0xC3, 0x56, 0xDA, 0x82, 0xC3, + 0x9C, 0xD2, 0xE3, 0xCC, 0x9D, 0xCE, 0x5D, 0xD9, 0xD5, 0xC9, 0xB1, 0xE4, + 0xD7, 0xC1, 0xBE, 0xEA, 0x20, 0xCC, 0xBE, 0xE6, 0x60, 0xD2, 0xCF, 0xE9, + 0x92, 0xD9, 0xE1, 0xFD, 0xF9, 0xDF, 0x53, 0x06, 0xA8, 0xE5, 0xE7, 0x01, + 0x8F, 0xFC, 0x48, 0x04, 0x50, 0x02, 0x65, 0x00, 0xDC, 0xFA, 0x71, 0xFC, + 0x37, 0xF7, 0x97, 0x07, 0x73, 0xF4, 0xDE, 0x03, 0x28, 0xFB, 0x58, 0xF4, + 0x99, 0xFA, 0xB3, 0xF5, 0x29, 0xFD, 0xB0, 0x00, 0xB3, 0x02, 0x95, 0x03, + 0x79, 0xFA, 0x80, 0x01, 0x41, 0xF1, 0x33, 0x02, 0x06, 0xED, 0x3F, 0x04, + 0x54, 0xEB, 0xBB, 0xFD, 0x72, 0xDF, 0xD5, 0xE8, 0x1B, 0xDB, 0x5D, 0xD6, + 0x3C, 0xF7, 0x6D, 0xDD, 0xC7, 0x1B, 0xB6, 0xFB, 0xC2, 0x2A, 0xC3, 0x12, + 0xCF, 0x25, 0xEB, 0x21, 0x23, 0x2A, 0x4A, 0x29, 0xA5, 0x31, 0xFE, 0x17, + 0xCC, 0x22, 0x54, 0x04, 0x49, 0x11, 0xD8, 0x05, 0x1D, 0x03, 0x2C, 0xFB, + 0x21, 0xF8, 0xC7, 0xE7, 0x3F, 0xFA, 0x94, 0xF6, 0x5F, 0x00, 0x60, 0x03, + 0x52, 0x02, 0x83, 0xF7, 0xAF, 0xFE, 0x6F, 0xE6, 0xCE, 0xF3, 0xEB, 0xCA, + 0x52, 0xE4, 0x32, 0xB5, 0x63, 0xE1, 0xB8, 0xC5, 0x88, 0xE5, 0xD7, 0xE4, + 0xBC, 0xE1, 0xC2, 0xEA, 0xD1, 0xEE, 0xA7, 0xEB, 0x0B, 0x07, 0x40, 0xF3, + 0xC3, 0x07, 0xCC, 0xF4, 0xE7, 0x06, 0x0A, 0x01, 0xEA, 0xFF, 0x30, 0x0B, + 0xB1, 0xEE, 0x16, 0x00, 0x1B, 0xF7, 0xA0, 0xFB, 0x72, 0x05, 0x81, 0xFE, + 0x7E, 0x07, 0x59, 0xF6, 0x94, 0xFC, 0xF2, 0xF3, 0xB2, 0xEE, 0x37, 0x00, + 0xDD, 0xFF, 0xA7, 0x12, 0x5A, 0x15, 0xDF, 0x19, 0xF9, 0x13, 0x5C, 0x11, + 0x0E, 0x0E, 0x9D, 0x0C, 0x05, 0xFE, 0x0D, 0x01, 0x95, 0xEA, 0x59, 0xEE, + 0x1D, 0xDE, 0x5D, 0xE1, 0xB7, 0xD9, 0x73, 0xD6, 0x57, 0xED, 0x73, 0xE2, + 0xA7, 0x1E, 0xF9, 0x01, 0xC5, 0x4C, 0xD5, 0x1F, 0x0D, 0x50, 0x73, 0x35, + 0xEA, 0x35, 0xBA, 0x2E, 0x09, 0x22, 0xE0, 0x18, 0xD7, 0x1F, 0xEF, 0x06, + 0x77, 0x1A, 0x29, 0xF2, 0x7A, 0x14, 0xDF, 0xEE, 0xE4, 0x1C, 0xEE, 0x04, + 0x8E, 0x1A, 0x8C, 0x17, 0x53, 0x20, 0xF3, 0x20, 0x7D, 0x41, 0xB2, 0x27, + 0x18, 0x46, 0xF9, 0x23, 0x22, 0x1E, 0xC7, 0x15, 0x96, 0xF8, 0x93, 0x0D, + 0xFC, 0xEB, 0xFE, 0x0B, 0x4D, 0xEA, 0xCC, 0xFE, 0x2B, 0xE7, 0xA6, 0xFB, + 0x4B, 0xEC, 0xC9, 0x14, 0xEA, 0xFB, 0x1E, 0x2F, 0xEB, 0x16, 0x90, 0x3F, + 0x3F, 0x3C, 0xA5, 0x48, 0x50, 0x48, 0xB9, 0x41, 0x5B, 0x38, 0x1B, 0x33, + 0x37, 0x2B, 0xA1, 0x30, 0x2C, 0x20, 0xA4, 0x25, 0x88, 0x1A, 0xBE, 0x12, + 0x5C, 0x21, 0x30, 0x18, 0xFC, 0x30, 0xB0, 0x2B, 0x2C, 0x41, 0x98, 0x37, + 0x34, 0x46, 0x87, 0x43, 0x80, 0x42, 0x4B, 0x4F, 0xB8, 0x31, 0xDE, 0x42, + 0xD6, 0x16, 0xF6, 0x26, 0x43, 0x0B, 0x3F, 0x0F, 0x59, 0x07, 0x1D, 0xFD, + 0x42, 0x0F, 0xDD, 0x03, 0x67, 0x2E, 0x33, 0x24, 0x2B, 0x41, 0xB5, 0x41, + 0x7E, 0x56, 0x40, 0x57, 0x7D, 0x66, 0x38, 0x53, 0x8E, 0x51, 0xBF, 0x37, + 0x59, 0x37, 0x53, 0x22, 0x49, 0x23, 0x4C, 0x0F, 0xFD, 0x1F, 0x0D, 0x04, + 0x2A, 0x32, 0xAC, 0x11, 0xC9, 0x3D, 0x5C, 0x2F, 0x55, 0x3C, 0xE9, 0x42, + 0x61, 0x3D, 0xF7, 0x4A, 0x3C, 0x3F, 0x50, 0x47, 0xB3, 0x39, 0xB9, 0x2B, + 0xEC, 0x23, 0x5E, 0x0C, 0xFE, 0x02, 0xB4, 0x02, 0x1E, 0xF3, 0x49, 0x09, + 0x68, 0xF7, 0xAD, 0x15, 0xC5, 0x04, 0xCB, 0x1E, 0x80, 0x21, 0x29, 0x24, + 0x80, 0x43, 0x46, 0x30, 0x31, 0x51, 0x30, 0x41, 0x1E, 0x45, 0xCA, 0x50, + 0x6A, 0x2D, 0xD7, 0x55, 0x16, 0x17, 0x48, 0x4A, 0xC8, 0x0A, 0x77, 0x2C, + 0xAC, 0x0B, 0x4E, 0x0E, 0x82, 0x12, 0x6B, 0x10, 0x3E, 0x1C, 0x1F, 0x28, + 0x76, 0x2F, 0x40, 0x40, 0x97, 0x43, 0x69, 0x4F, 0xEE, 0x3E, 0x4C, 0x40, + 0x85, 0x29, 0xE6, 0x2A, 0x84, 0x13, 0xA4, 0x27, 0x73, 0xFF, 0xC1, 0x1F, + 0x5D, 0xEB, 0x0C, 0x0B, 0xBC, 0xE6, 0xCE, 0x03, 0xDD, 0x02, 0x28, 0x10, + 0xE9, 0x1D, 0x95, 0x12, 0x96, 0x31, 0x6F, 0x15, 0xEF, 0x3A, 0x61, 0x25, + 0xA9, 0x29, 0xCE, 0x23, 0xAB, 0x21, 0xBE, 0x18, 0x5B, 0x1E, 0xF5, 0x0D, + 0xC6, 0x19, 0xBB, 0xF4, 0x6B, 0x26, 0x77, 0xDD, 0x24, 0x26, 0x0D, 0xDF, + 0x3D, 0x1B, 0x71, 0xF6, 0xED, 0x11, 0xC8, 0xFF, 0x1C, 0x0D, 0xB1, 0xFB, + 0xAF, 0x13, 0xBB, 0xF9, 0x7E, 0x0E, 0x05, 0xF5, 0xE5, 0x00, 0x30, 0xF9, + 0xCE, 0xF2, 0x4D, 0xFB, 0xEF, 0xE0, 0xAD, 0xEF, 0xDD, 0xDE, 0xE9, 0xEF, + 0x89, 0xDF, 0xC2, 0xFF, 0x24, 0xD6, 0xD1, 0x0D, 0x39, 0xD8, 0xBD, 0x1D, + 0xB3, 0xDF, 0xC4, 0x1C, 0x79, 0xE4, 0xF8, 0x0F, 0xAC, 0xEB, 0xED, 0x16, + 0xA1, 0xEC, 0x96, 0x25, 0x50, 0xEB, 0x6B, 0x25, 0x65, 0xF9, 0x1E, 0x1B, + 0x48, 0x05, 0xF4, 0x18, 0x20, 0x07, 0xE4, 0x13, 0x52, 0x14, 0xCF, 0x0E, + 0xC9, 0x20, 0x2D, 0x15, 0x47, 0x20, 0xA0, 0x1C, 0x98, 0x14, 0x65, 0x1B, + 0x61, 0x05, 0xBE, 0x17, 0xF5, 0xF5, 0xD7, 0x15, 0xFE, 0xEB, 0x19, 0x04, + 0x00, 0xF6, 0x89, 0xF7, 0x94, 0x03, 0x61, 0xFF, 0xD8, 0x04, 0xEB, 0x07, + 0xFE, 0x08, 0x29, 0x15, 0xFF, 0x11, 0x4F, 0x1F, 0x9A, 0x24, 0x2C, 0x1F, + 0xF2, 0x2E, 0xFB, 0x1C, 0x06, 0x0F, 0x5C, 0x15, 0xE5, 0xF8, 0x0B, 0x08, + 0xB7, 0x0A, 0x78, 0x02, 0x6E, 0x1E, 0xD6, 0x01, 0x90, 0x18, 0xDB, 0xFB, + 0x32, 0x00, 0xEF, 0x03, 0xDB, 0x04, 0x6F, 0x16, 0xCE, 0x12, 0xAD, 0x14, + 0xC1, 0x0B, 0xF7, 0xFD, 0x35, 0x00, 0xA0, 0xEA, 0x09, 0xE6, 0xE4, 0xDD, + 0xB1, 0xDB, 0x5F, 0xDB, 0x06, 0xE6, 0xEF, 0xE8, 0xEA, 0xF1, 0x75, 0xF0, + 0x50, 0xFF, 0xC3, 0xE4, 0x41, 0xFA, 0x76, 0xDE, 0x18, 0xED, 0x2E, 0xEA, + 0x83, 0xE7, 0x47, 0xF6, 0x2A, 0xE3, 0x16, 0xFF, 0x0A, 0xE0, 0x22, 0x05, + 0x65, 0xDE, 0x99, 0xF4, 0x7F, 0xDF, 0x39, 0xDA, 0x38, 0xEB, 0x51, 0xDC, + 0x5E, 0xEE, 0xFF, 0xED, 0x3C, 0xE5, 0x86, 0xFC, 0xEB, 0xE8, 0x56, 0x0B, + 0xDD, 0xF1, 0xFD, 0x0D, 0xE6, 0xF8, 0x75, 0x09, 0xD0, 0xF3, 0xE7, 0x00, + 0x45, 0xD7, 0xD5, 0xE9, 0xC9, 0xBE, 0xAE, 0xD8, 0x23, 0xCA, 0xF1, 0xD9, + 0x64, 0xDE, 0x61, 0xD5, 0xD7, 0xE7, 0x72, 0xD2, 0x62, 0xF2, 0xE1, 0xE3, + 0xC8, 0xF5, 0x44, 0xF4, 0x7B, 0xF4, 0x36, 0xFB, 0x16, 0xEE, 0xB3, 0xFB, + 0x19, 0xE8, 0xEC, 0xE8, 0xBB, 0xF1, 0x0D, 0xD7, 0x4D, 0x04, 0xDB, 0xDB, + 0x39, 0x0F, 0x8E, 0xE9, 0xBA, 0x04, 0x05, 0xEF, 0x43, 0xF4, 0x6E, 0xF1, + 0x17, 0xF1, 0xEC, 0xF1, 0x9A, 0xF9, 0xED, 0xEE, 0xD4, 0xFD, 0x12, 0xF4, + 0xB7, 0xF7, 0x6B, 0xF8, 0xE6, 0xF0, 0x10, 0xF9, 0x94, 0xE7, 0x68, 0xF1, + 0x45, 0xDF, 0x03, 0xEE, 0xA4, 0xDC, 0x6F, 0xFF, 0xCE, 0xDB, 0x33, 0x0E, + 0x80, 0xD9, 0x38, 0x10, 0x40, 0xE2, 0x24, 0x0C, 0x39, 0xEB, 0xAE, 0x09, + 0x72, 0xEE, 0x17, 0x05, 0xF3, 0xF1, 0x45, 0xFE, 0x05, 0xEA, 0x12, 0x07, + 0xAC, 0xE7, 0x5B, 0x0B, 0xC3, 0xF2, 0xA2, 0xFE, 0x66, 0xFC, 0x75, 0xFC, + 0xC7, 0x04, 0x93, 0x07, 0xC2, 0x05, 0x32, 0x05, 0xE6, 0xFE, 0x97, 0xFB, + 0x6B, 0xF6, 0x8C, 0xF7, 0x30, 0xF4, 0xBF, 0xF3, 0x3B, 0xFB, 0x88, 0xF5, + 0x9C, 0x04, 0x22, 0xFB, 0xEA, 0x06, 0xDF, 0xF5, 0xA8, 0x00, 0x1D, 0xEB, + 0x6F, 0xFC, 0x60, 0xF3, 0x68, 0xFB, 0x62, 0x00, 0x87, 0xFD, 0x28, 0xFB, + 0x45, 0xFD, 0x0F, 0xF0, 0x92, 0xF2, 0x8F, 0xE6, 0x6B, 0xED, 0x12, 0xE1, + 0xE2, 0xF4, 0x99, 0xDE, 0x10, 0xFC, 0x29, 0xD9, 0x41, 0x00, 0x7B, 0xDC, + 0xDF, 0xFF, 0xD4, 0xE9, 0x96, 0xF4, 0x3F, 0xED, 0x6E, 0xE9, 0x69, 0xEB, + 0x12, 0xEC, 0xB6, 0xE9, 0x5E, 0xF9, 0xB5, 0xE3, 0x5B, 0xFD, 0xA1, 0xDE, + 0x59, 0xF6, 0x0D, 0xE7, 0x7B, 0xED, 0xEC, 0xF3, 0x8A, 0xDB, 0x28, 0xE8, + 0x07, 0xD5, 0x1C, 0xD6, 0x1E, 0xE6, 0x9B, 0xD6, 0x98, 0xED, 0xE1, 0xD9, + 0x28, 0xEB, 0x34, 0xDF, 0x97, 0xE7, 0xDF, 0xEF, 0x3E, 0xD8, 0x39, 0xF6, + 0xDC, 0xD3, 0xCA, 0xE4, 0xE9, 0xD3, 0xBF, 0xDA, 0x6A, 0xCB, 0x9D, 0xD9, + 0x40, 0xD4, 0x55, 0xD9, 0xD5, 0xDD, 0x8F, 0xE2, 0x80, 0xD9, 0x38, 0xE9, + 0x8A, 0xDC, 0x46, 0xEF, 0x69, 0xEE, 0xCF, 0xEF, 0x18, 0xF2, 0x93, 0xEB, + 0x9A, 0xD9, 0x95, 0xE6, 0xFB, 0xCA, 0xEC, 0xE3, 0x9D, 0xD4, 0xD0, 0xEF, + 0xDF, 0xE6, 0x05, 0xF3, 0x5A, 0xEE, 0xC1, 0xE3, 0xE8, 0xF1, 0xD3, 0xD9, + 0x56, 0xF3, 0x91, 0xD8, 0x4C, 0xEC, 0x92, 0xD7, 0x0D, 0xDD, 0x66, 0xCE, + 0x86, 0xCB, 0x55, 0xBB, 0x7B, 0xD8, 0xF6, 0xB1, 0xA6, 0xEA, 0x06, 0xB6, + 0x20, 0xEE, 0x5A, 0xB9, 0x52, 0xF4, 0x72, 0xBF, 0x38, 0xF9, 0x54, 0xCA, + 0x6A, 0xED, 0x96, 0xC7, 0xEB, 0xC9, 0xB4, 0xB2, 0x01, 0xBA, 0xF4, 0xAB, + 0xB7, 0xCE, 0x57, 0xBC, 0x5F, 0xDD, 0xFA, 0xC0, 0x75, 0xD1, 0xD2, 0xBD, + 0xD6, 0xC9, 0x41, 0xCA, 0x63, 0xD6, 0x73, 0xDB, 0x94, 0xCF, 0xA5, 0xDC, + 0x0D, 0xB2, 0x17, 0xD2, 0x53, 0xA4, 0x64, 0xCA, 0xFD, 0xAD, 0xD4, 0xC7, + 0xE0, 0xBC, 0xD9, 0xD1, 0x6A, 0xC8, 0x47, 0xD9, 0x7D, 0xCA, 0xAC, 0xD1, + 0xC9, 0xC5, 0xF4, 0xCE, 0x58, 0xC8, 0x89, 0xD6, 0x9E, 0xD6, 0xF6, 0xE4, + 0xD2, 0xEB, 0xA2, 0xEB, 0x54, 0xEC, 0x7D, 0xE1, 0xE8, 0xE7, 0x47, 0xE6, + 0x9B, 0xF7, 0x87, 0xFA, 0x21, 0xF1, 0x19, 0xF2, 0x4F, 0xD3, 0xF3, 0xCE, + 0x36, 0xCB, 0x5E, 0xCC, 0xE8, 0xD1, 0xE3, 0xE4, 0x6C, 0xDA, 0xAC, 0xEA, + 0xC7, 0xF1, 0x34, 0xF7, 0x43, 0x07, 0x13, 0x05, 0xF4, 0x12, 0xB4, 0xFA, + 0xAA, 0x12, 0x98, 0xF6, 0x81, 0xFD, 0x5C, 0xFF, 0x3C, 0xEF, 0xE7, 0xFE, + 0x0B, 0xF5, 0xF9, 0xEF, 0x23, 0xFD, 0x1E, 0xE5, 0x8A, 0x02, 0xDD, 0xE8, + 0x5E, 0x08, 0xD6, 0xF1, 0x74, 0x0C, 0x0A, 0xFE, 0xCD, 0x0C, 0xAA, 0x01, + 0x85, 0x03, 0x78, 0xFF, 0x10, 0xF8, 0xDF, 0xFC, 0x04, 0xF7, 0xB0, 0xF0, + 0xED, 0xF7, 0xCC, 0xED, 0x0B, 0xEF, 0xB2, 0xEB, 0x67, 0xE3, 0x8A, 0xE7, + 0xB3, 0xE8, 0x5C, 0xEC, 0x09, 0xFE, 0xD2, 0xEB, 0x21, 0x0E, 0xC9, 0xE5, + 0x14, 0x0F, 0x19, 0xE2, 0xA0, 0xFF, 0x0E, 0xE9, 0x95, 0xEF, 0x96, 0xF5, + 0x99, 0xEC, 0x5B, 0xF9, 0x64, 0xFA, 0x0D, 0xFB, 0xA0, 0x06, 0xFA, 0xF4, + 0xCF, 0x06, 0x70, 0xE9, 0x5E, 0xF8, 0xF0, 0xE5, 0x09, 0xE7, 0xBA, 0xEA, + 0xEA, 0xE9, 0x14, 0xF3, 0x75, 0xEE, 0x21, 0xFA, 0xB7, 0xF7, 0x24, 0x00, + 0xDF, 0xFE, 0x3C, 0x00, 0xBA, 0xF4, 0x9F, 0xFC, 0x58, 0xEE, 0x4E, 0xFD, + 0x6E, 0xE5, 0x25, 0xFD, 0x57, 0xDB, 0x39, 0xFF, 0xED, 0xE2, 0x41, 0xFE, + 0x5A, 0xFD, 0xE6, 0xF0, 0x66, 0x11, 0x98, 0xF1, 0x38, 0x09, 0x13, 0xF7, + 0x6E, 0xFA, 0xC3, 0xF3, 0xA2, 0xFA, 0x37, 0xFC, 0x4C, 0x02, 0x24, 0xF9, + 0xE2, 0x07, 0x62, 0xED, 0xEA, 0x14, 0x66, 0xF7, 0x80, 0x25, 0x8E, 0xFF, + 0xF7, 0x26, 0x82, 0xF3, 0x1C, 0x18, 0x68, 0xF4, 0x27, 0x02, 0xFF, 0x08, + 0xFD, 0xF9, 0x70, 0x0D, 0x81, 0x0A, 0xAD, 0x10, 0xF5, 0x17, 0x4F, 0x16, + 0x39, 0x17, 0x0A, 0x07, 0xE2, 0x19, 0x86, 0x07, 0xF7, 0x19, 0x8F, 0x23, + 0x36, 0x12, 0x2C, 0x34, 0x7C, 0x04, 0x7E, 0x28, 0xD9, 0xFE, 0xE8, 0x1E, + 0x3F, 0x09, 0xDC, 0x29, 0x74, 0x17, 0x43, 0x2B, 0xAB, 0x1F, 0x53, 0x26, + 0xA0, 0x11, 0x73, 0x20, 0x5F, 0x13, 0xDC, 0x17, 0x12, 0x2E, 0xBF, 0x22, + 0xB4, 0x39, 0x62, 0x2E, 0x76, 0x33, 0x08, 0x20, 0x77, 0x29, 0x2C, 0x18, + 0x06, 0x2E, 0xFF, 0x23, 0x6D, 0x2E, 0x2B, 0x2B, 0x0D, 0x21, 0xF1, 0x2E, + 0xAE, 0x27, 0x9C, 0x31, 0x0F, 0x2A, 0x2F, 0x1A, 0x64, 0x17, 0x23, 0x09, + 0xFD, 0x1B, 0x88, 0x20, 0x3B, 0x31, 0x21, 0x33, 0xFC, 0x33, 0xD0, 0x2F, + 0x54, 0x2D, 0xF9, 0x2B, 0x1E, 0x2E, 0x01, 0x33, 0x75, 0x39, 0x01, 0x3C, + 0xDC, 0x38, 0xE9, 0x32, 0x95, 0x2F, 0x92, 0x20, 0x45, 0x36, 0xB7, 0x11, + 0xE8, 0x3C, 0xB7, 0x0A, 0xA9, 0x3D, 0x6F, 0x11, 0x13, 0x39, 0xC8, 0x1B, + 0xF9, 0x2D, 0xC9, 0x1F, 0xA5, 0x25, 0x3B, 0x24, 0xA6, 0x29, 0x8B, 0x2B, + 0x3D, 0x32, 0xDB, 0x2C, 0x1D, 0x32, 0xB9, 0x2C, 0x06, 0x29, 0x0F, 0x2E, + 0xF0, 0x16, 0x4B, 0x2E, 0xD0, 0x13, 0xF5, 0x2D, 0x05, 0x1D, 0x99, 0x28, + 0x7D, 0x24, 0x21, 0x24, 0x1C, 0x26, 0xA0, 0x22, 0xCE, 0x1A, 0x4A, 0x25, + 0xAC, 0x21, 0x96, 0x2E, 0xB9, 0x35, 0x6E, 0x38, 0xA6, 0x3B, 0x47, 0x3B, + 0xE2, 0x3D, 0x1F, 0x3F, 0x37, 0x32, 0x7F, 0x40, 0x03, 0x21, 0x5B, 0x37, + 0x45, 0x21, 0x18, 0x33, 0x84, 0x32, 0x95, 0x3A, 0x7B, 0x3D, 0xA4, 0x3F, + 0x32, 0x2D, 0xA1, 0x36, 0xC0, 0x2C, 0xDE, 0x34, 0x1F, 0x40, 0x48, 0x45, + 0x20, 0x31, 0xD7, 0x46, 0x9E, 0x17, 0xDA, 0x41, 0xCC, 0x17, 0xB9, 0x51, + 0xB3, 0x28, 0xC9, 0x4E, 0xE4, 0x3D, 0xFE, 0x31, 0x73, 0x39, 0x78, 0x27, + 0x8B, 0x22, 0x17, 0x2F, 0x98, 0x0F, 0x1B, 0x2C, 0x02, 0x04, 0x5B, 0x1F, + 0xCF, 0x08, 0xC7, 0x14, 0xC0, 0x17, 0xFB, 0x06, 0x75, 0x22, 0xB3, 0xF5, + 0x43, 0x2B, 0x0B, 0xEC, 0x22, 0x26, 0x94, 0xE3, 0x8B, 0x0A, 0x9F, 0xDC, + 0xF1, 0xF1, 0x66, 0xDD, 0xD5, 0xE6, 0xE1, 0xDE, 0x4F, 0xE3, 0xA7, 0xDC, + 0xEE, 0xE4, 0xC5, 0xD4, 0x10, 0xEF, 0x08, 0xCF, 0x99, 0xF3, 0xE0, 0xD0, + 0xEA, 0xE0, 0x7A, 0xDE, 0xC8, 0xD0, 0x8B, 0xF4, 0x73, 0xC6, 0x56, 0xF6, + 0xB0, 0xC3, 0x9F, 0xEE, 0xCD, 0xD7, 0xD4, 0xF9, 0xD6, 0xE5, 0x52, 0x01, + 0x14, 0xE6, 0x35, 0x03, 0x73, 0xEC, 0xBA, 0x10, 0x56, 0xF1, 0x4F, 0x11, + 0x18, 0xF3, 0xCF, 0x0C, 0x1B, 0xF6, 0x73, 0x14, 0xEE, 0xEF, 0x7B, 0x11, + 0xAE, 0xF4, 0xB1, 0x0B, 0x5A, 0x11, 0x7C, 0x19, 0x2E, 0x21, 0x52, 0x24, + 0x1A, 0x1D, 0x32, 0x1E, 0x77, 0x14, 0x15, 0x1E, 0xCE, 0x0E, 0xA8, 0x1F, + 0x47, 0x11, 0xD3, 0x21, 0xC7, 0x14, 0xE4, 0x2D, 0x95, 0x1E, 0xBE, 0x33, + 0xE5, 0x27, 0x59, 0x2E, 0x40, 0x2C, 0x33, 0x27, 0xAF, 0x3A, 0x7A, 0x32, + 0x9B, 0x38, 0x71, 0x39, 0x6F, 0x27, 0xD8, 0x31, 0xCC, 0x1E, 0xDB, 0x38, + 0xA3, 0x16, 0x9D, 0x37, 0xB0, 0x24, 0x46, 0x30, 0xA6, 0x34, 0x33, 0x2A, + 0xC7, 0x27, 0xA0, 0x20, 0xCC, 0x19, 0x4C, 0x23, 0xE8, 0x1C, 0x53, 0x24, + 0x97, 0x27, 0x71, 0x18, 0x0C, 0x26, 0x4D, 0x0C, 0xEB, 0x17, 0x7F, 0x06, + 0xE3, 0x08, 0x4C, 0x07, 0x13, 0x01, 0x92, 0x0A, 0x8D, 0x05, 0xB9, 0x03, + 0xD6, 0x0B, 0x20, 0xF5, 0x09, 0x0A, 0xCD, 0xEC, 0xEA, 0xFE, 0xD9, 0xE9, + 0xA6, 0xFC, 0x70, 0xF3, 0xA5, 0x0A, 0xFC, 0x04, 0x5B, 0x11, 0x1E, 0x03, + 0xA9, 0x15, 0xF5, 0x02, 0x1A, 0x17, 0x1A, 0x10, 0x84, 0x0F, 0x59, 0x10, + 0xB1, 0x0D, 0x5E, 0x11, 0x65, 0x02, 0x38, 0x13, 0x56, 0xEA, 0xAC, 0x02, + 0xB1, 0xE6, 0xD8, 0xF7, 0xF8, 0xFB, 0xBE, 0x03, 0xC3, 0x1A, 0x63, 0x0E, + 0x9A, 0x2C, 0x66, 0x09, 0x5B, 0x21, 0xA2, 0x19, 0x38, 0x0C, 0x08, 0x39, + 0xAA, 0x02, 0x07, 0x37, 0x0B, 0x04, 0xC4, 0x25, 0xA8, 0x06, 0x54, 0x14, + 0x25, 0x10, 0xB5, 0x02, 0x1F, 0x07, 0x5B, 0xF4, 0x7A, 0xE8, 0xF8, 0xEC, + 0x13, 0xE3, 0x77, 0xF1, 0x79, 0xE7, 0x5D, 0xF0, 0xCF, 0xE6, 0x0E, 0xEB, + 0x30, 0xE9, 0xAE, 0xE2, 0x06, 0xE7, 0xB6, 0xD2, 0x86, 0xE6, 0x69, 0xCA, + 0x47, 0xD8, 0x3B, 0xC7, 0x9F, 0xC0, 0x6E, 0xC6, 0xE1, 0xB4, 0x2C, 0xC8, + 0x91, 0xB3, 0x9C, 0xB7, 0xD2, 0xC2, 0xB7, 0xA4, 0x0C, 0xD7, 0x73, 0xB0, + 0x3E, 0xCF, 0xE0, 0xB4, 0x9C, 0xB8, 0xD0, 0xB0, 0xAD, 0xAB, 0xC2, 0xBF, + 0x65, 0xA3, 0x35, 0xC9, 0xC5, 0xA2, 0xEB, 0xCB, 0x90, 0xAA, 0x9B, 0xD4, + 0xE0, 0xAA, 0xFC, 0xD3, 0x75, 0xAD, 0x30, 0xCB, 0xB2, 0xBE, 0x4C, 0xD5, + 0xD6, 0xBB, 0x37, 0xDC, 0x38, 0xB3, 0xE4, 0xD9, 0xC8, 0xC0, 0x86, 0xDC, + 0x43, 0xD3, 0x50, 0xDC, 0x0B, 0xE9, 0xF7, 0xEA, 0x42, 0xED, 0xC0, 0xFB, + 0xA9, 0xE5, 0xD7, 0x00, 0x9F, 0xF3, 0x92, 0x01, 0x08, 0x00, 0xA6, 0xF5, + 0xEA, 0xF9, 0x25, 0xE8, 0xA4, 0xEF, 0x7C, 0xE5, 0xE5, 0xE6, 0x53, 0xE5, + 0x8C, 0xE6, 0x52, 0xE6, 0xF8, 0xFB, 0xC0, 0xF8, 0xF6, 0x11, 0xF1, 0x05, + 0x27, 0x17, 0x7C, 0xFF, 0x13, 0x13, 0x94, 0xFF, 0xFC, 0x03, 0xF9, 0x02, + 0x55, 0x00, 0x92, 0xFE, 0x44, 0x06, 0x18, 0xF1, 0xCC, 0xFB, 0xCE, 0xE4, + 0x12, 0xEF, 0xB8, 0xE1, 0xF9, 0xEF, 0x54, 0xE4, 0x62, 0xF5, 0xAB, 0xEB, + 0x5E, 0xF6, 0x6B, 0xF5, 0xB9, 0x00, 0x13, 0x02, 0x7E, 0x0E, 0xF7, 0x08, + 0x93, 0x0A, 0x06, 0x04, 0xB7, 0x09, 0x57, 0x07, 0x44, 0x12, 0xDB, 0x12, + 0x10, 0x13, 0x5D, 0x10, 0x7C, 0x13, 0x65, 0x0D, 0x13, 0x15, 0x7E, 0x15, + 0xBD, 0x0E, 0xB9, 0x10, 0x4A, 0x1D, 0xF8, 0x0D, 0x68, 0x33, 0x83, 0x19, + 0xE0, 0x2B, 0xB5, 0x1D, 0x47, 0x2A, 0x0C, 0x24, 0x19, 0x38, 0x00, 0x38, + 0x31, 0x36, 0x5C, 0x3F, 0xEB, 0x22, 0x6A, 0x28, 0x78, 0x1A, 0x79, 0x20, + 0xC7, 0x17, 0xA0, 0x34, 0xC1, 0x08, 0x17, 0x30, 0x8D, 0x06, 0xD9, 0x14, + 0x5D, 0x13, 0x09, 0x0D, 0x70, 0x19, 0x57, 0x15, 0x75, 0x1C, 0xDF, 0x27, + 0xA1, 0x10, 0xEE, 0x2E, 0x04, 0xFE, 0xC2, 0x18, 0x8F, 0x08, 0xC2, 0x0A, + 0x38, 0x1B, 0xA5, 0x11, 0x8C, 0x0C, 0xFA, 0x08, 0xC8, 0xF5, 0x5E, 0xF4, + 0x35, 0xF8, 0x65, 0xFC, 0xD1, 0xF6, 0x51, 0x01, 0x76, 0xE8, 0x1D, 0xEC, + 0x1F, 0xE2, 0xCD, 0xDB, 0x26, 0xE7, 0xA5, 0xD2, 0x5F, 0x00, 0x72, 0xD5, + 0xD9, 0x0B, 0x90, 0xD0, 0x24, 0xF6, 0xEC, 0xC1, 0xF2, 0xE4, 0x9B, 0xC3, + 0x7D, 0xD4, 0xAE, 0xC0, 0x7A, 0xCA, 0x13, 0xB2, 0x80, 0xDE, 0x8F, 0xAE, + 0x99, 0xDE, 0xFD, 0xAB, 0x1D, 0xBF, 0x78, 0xA4, 0xFF, 0xC2, 0x9B, 0xB3, + 0xC7, 0xD3, 0xBC, 0xBE, 0xB5, 0xC4, 0x07, 0xB5, 0x97, 0xB3, 0xF8, 0xB1, + 0x99, 0xAC, 0xAC, 0xAF, 0x98, 0xAF, 0x8D, 0xAF, 0x00, 0xB6, 0xBD, 0xAF, + 0x34, 0xAA, 0xC9, 0xA6, 0xC5, 0x9E, 0x5B, 0xAD, 0xFB, 0xA4, 0xA0, 0xC7, + 0xD0, 0xA9, 0x71, 0xCB, 0xFE, 0xB5, 0xF7, 0xC1, 0x05, 0xC8, 0xC1, 0xC6, + 0x91, 0xC6, 0xE7, 0xC9, 0x79, 0xC5, 0x24, 0xCF, 0x4A, 0xD5, 0x74, 0xD7, + 0x31, 0xDA, 0xC2, 0xD0, 0xD4, 0xD2, 0xF9, 0xC6, 0xC6, 0xCB, 0x1B, 0xCA, + 0xC1, 0xBD, 0x85, 0xD1, 0x42, 0xB5, 0x25, 0xD1, 0x45, 0xD2, 0x34, 0xD8, + 0x65, 0xFD, 0x95, 0xE8, 0x85, 0x0B, 0xBA, 0xF3, 0xC4, 0x06, 0xD1, 0xF7, + 0x12, 0x07, 0xA5, 0xFD, 0xC9, 0x0F, 0xD7, 0x0A, 0x06, 0x0A, 0xDA, 0x08, + 0x10, 0xFA, 0x8C, 0x01, 0xA3, 0xF6, 0x5D, 0x04, 0x15, 0xFE, 0xA5, 0x00, + 0xFC, 0x07, 0x4F, 0xFB, 0x49, 0x17, 0x36, 0x03, 0x31, 0x13, 0x6A, 0xFF, + 0x9B, 0xFC, 0x20, 0xF9, 0x2D, 0x03, 0x26, 0x0F, 0x43, 0x12, 0x92, 0x19, + 0x48, 0x10, 0x05, 0x12, 0xF5, 0x0A, 0x42, 0x18, 0x0C, 0x06, 0x1C, 0x17, + 0x73, 0x0B, 0xE5, 0x07, 0x48, 0x11, 0xDC, 0x00, 0x0C, 0x12, 0x8A, 0xFA, + 0x92, 0x14, 0x9E, 0xF5, 0x5B, 0x0E, 0x7B, 0xFA, 0xA2, 0x10, 0xD8, 0xFE, + 0x32, 0x29, 0xC6, 0x00, 0x03, 0x29, 0x13, 0xF5, 0x96, 0x0A, 0x8D, 0xE7, + 0xC4, 0xFD, 0x83, 0xF2, 0xF4, 0xF9, 0xDF, 0xFF, 0x2A, 0x05, 0xBF, 0x07, + 0x56, 0x0F, 0x5B, 0xF7, 0x60, 0xF7, 0x51, 0xD1, 0xFA, 0xEB, 0xF5, 0xD2, + 0xE7, 0xFA, 0xC6, 0xF7, 0x6F, 0xF7, 0xB9, 0x08, 0xAE, 0xE0, 0x80, 0x03, + 0xA8, 0xDE, 0x46, 0xFA, 0x02, 0xF3, 0xB9, 0xEF, 0x91, 0x0F, 0xE1, 0xF2, + 0x93, 0x18, 0xAF, 0xF1, 0x72, 0x08, 0x8E, 0xF0, 0x7A, 0xF4, 0xE6, 0xF8, + 0x8B, 0xEA, 0xFC, 0xF8, 0x06, 0xFD, 0x98, 0xFC, 0x1A, 0x16, 0x8B, 0x00, + 0x81, 0x17, 0x60, 0xEE, 0x0F, 0x06, 0x13, 0xD8, 0x90, 0xED, 0xB8, 0xD6, + 0xCE, 0xE1, 0x42, 0xD9, 0x44, 0xDF, 0x4E, 0xCF, 0x0C, 0xEE, 0xB0, 0xD7, + 0xBF, 0xFF, 0xB9, 0xEC, 0x59, 0x09, 0x27, 0xF8, 0xB5, 0x12, 0x5D, 0xFA, + 0x7C, 0x05, 0x56, 0xF4, 0x10, 0xED, 0x67, 0xED, 0x7D, 0xD9, 0x0A, 0xE5, + 0xC7, 0xCD, 0xB9, 0xE1, 0x77, 0xC7, 0xB8, 0xDF, 0x97, 0xC7, 0x7A, 0xDF, + 0x77, 0xD1, 0x40, 0xE8, 0xDA, 0xD2, 0xA2, 0xEC, 0x48, 0xDE, 0x0B, 0xF7, + 0x49, 0x02, 0x8B, 0x02, 0x48, 0x15, 0xEA, 0xF9, 0x37, 0x09, 0x1E, 0xF5, + 0x35, 0xF4, 0x0A, 0xF6, 0x23, 0xE4, 0x80, 0xF2, 0xDE, 0xEC, 0x59, 0xFB, + 0x4D, 0x0A, 0x67, 0x0D, 0x57, 0x1F, 0xDB, 0x14, 0xED, 0x28, 0x3D, 0x0F, + 0xB5, 0x25, 0x6E, 0x0D, 0x21, 0x27, 0xA2, 0x24, 0x02, 0x33, 0xF5, 0x40, + 0xBF, 0x44, 0x0A, 0x4B, 0xD4, 0x5B, 0xE3, 0x54, 0x8A, 0x56, 0x69, 0x50, + 0x03, 0x4B, 0x93, 0x41, 0x51, 0x5A, 0x90, 0x4E, 0x29, 0x58, 0x90, 0x55, + 0x73, 0x44, 0x73, 0x49, 0x78, 0x4B, 0x69, 0x46, 0xA3, 0x51, 0x3E, 0x3D, + 0xBD, 0x4B, 0xFB, 0x32, 0x8C, 0x50, 0x93, 0x36, 0x1D, 0x4E, 0xCB, 0x39, + 0x95, 0x42, 0x23, 0x2F, 0x4C, 0x2F, 0xA0, 0x1D, 0x48, 0x25, 0x61, 0x23, + 0x42, 0x30, 0x47, 0x33, 0x12, 0x2A, 0x12, 0x25, 0x88, 0x0E, 0xE4, 0x16, + 0x89, 0x05, 0x34, 0x27, 0xB2, 0x0E, 0xCB, 0x2B, 0x6A, 0x13, 0x5E, 0x20, + 0xBE, 0x14, 0xB7, 0x1B, 0x82, 0x19, 0x4E, 0x28, 0xB6, 0x15, 0x36, 0x2E, + 0xF6, 0x14, 0xA0, 0x22, 0x84, 0x2C, 0xFA, 0x20, 0x81, 0x3C, 0xD3, 0x1B, + 0xD6, 0x2F, 0x93, 0x1E, 0x2E, 0x27, 0x3B, 0x2F, 0xC2, 0x27, 0xD1, 0x39, + 0xD1, 0x22, 0xEA, 0x35, 0x87, 0x27, 0xCE, 0x22, 0x15, 0x31, 0x7E, 0x21, + 0x95, 0x34, 0xC1, 0x36, 0x49, 0x37, 0x87, 0x4B, 0x17, 0x30, 0x2B, 0x50, + 0xF3, 0x26, 0xF7, 0x52, 0x7A, 0x27, 0xB4, 0x55, 0xCB, 0x2F, 0xA3, 0x4C, + 0x7E, 0x36, 0x57, 0x4C, 0xC8, 0x33, 0x2C, 0x51, 0x35, 0x26, 0x65, 0x4A, + 0xC6, 0x0D, 0x77, 0x3A, 0xB9, 0xFB, 0xC3, 0x2D, 0x79, 0x16, 0x26, 0x35, + 0x5B, 0x32, 0xE5, 0x29, 0xD5, 0x33, 0x6E, 0x19, 0x5F, 0x41, 0x8A, 0x27, + 0x7E, 0x3E, 0xCF, 0x22, 0x2F, 0x2E, 0x22, 0x0D, 0x44, 0x34, 0x59, 0x0F, + 0xA4, 0x21, 0xCA, 0x00, 0xE8, 0xFF, 0x21, 0xE6, 0x85, 0x0A, 0x38, 0xEE, + 0xB2, 0x16, 0x23, 0xEC, 0x70, 0x0A, 0xDA, 0xDC, 0xD0, 0xF8, 0xF6, 0xE1, + 0xE2, 0xE4, 0xA9, 0xE8, 0x1B, 0xE2, 0x84, 0xE3, 0x22, 0xEC, 0xA0, 0xE0, + 0x15, 0xDC, 0x39, 0xDE, 0x2A, 0xC9, 0x01, 0xE6, 0x74, 0xBC, 0xC6, 0xEB, + 0x94, 0xBA, 0x8D, 0xDF, 0x4E, 0xCD, 0x43, 0xD8, 0xD1, 0xCE, 0x79, 0xD9, + 0x40, 0xD1, 0xEE, 0xE3, 0x7C, 0xE2, 0xA2, 0xF1, 0x63, 0xE7, 0xE4, 0xF7, + 0xD9, 0xF4, 0x39, 0x0E, 0x7D, 0x06, 0xD8, 0x1C, 0xD6, 0x06, 0xB1, 0x09, + 0x1F, 0x05, 0xE5, 0x04, 0xBC, 0x09, 0xD6, 0x11, 0xF8, 0x08, 0x97, 0x12, + 0xBC, 0xFD, 0xDD, 0x1A, 0x16, 0xFA, 0x7D, 0x24, 0x05, 0x04, 0x24, 0x1D, + 0x0C, 0x10, 0x9A, 0x18, 0xC7, 0x22, 0xB8, 0x28, 0x43, 0x2B, 0x27, 0x3A, + 0xAA, 0x12, 0xD4, 0x31, 0x82, 0x03, 0x45, 0x29, 0x53, 0x11, 0xEF, 0x24, + 0x27, 0x24, 0x59, 0x25, 0x14, 0x28, 0x9D, 0x2B, 0x27, 0x1E, 0xB0, 0x20, + 0x1F, 0x1F, 0x87, 0x18, 0xD9, 0x1E, 0x2C, 0x16, 0x29, 0x15, 0x1F, 0x11, + 0xAB, 0x1C, 0x5F, 0x19, 0x1F, 0x20, 0xE7, 0x1D, 0xF7, 0x10, 0xAC, 0x15, + 0x96, 0x13, 0x42, 0x1E, 0x23, 0x13, 0xB4, 0x23, 0x22, 0x0E, 0x77, 0x18, + 0xA3, 0x16, 0xC4, 0x10, 0x9C, 0x11, 0x11, 0x0C, 0xA4, 0x0B, 0x52, 0x10, + 0x15, 0x08, 0xC2, 0x0D, 0x60, 0x0E, 0x1E, 0x08, 0x92, 0x20, 0x92, 0x03, + 0x9C, 0x22, 0xAE, 0xF9, 0x2C, 0x10, 0x89, 0xF6, 0xF8, 0xF9, 0x37, 0xFE, + 0x01, 0xF4, 0x89, 0x09, 0xA1, 0xFD, 0xDD, 0x01, 0x9F, 0x01, 0x1D, 0xEC, + 0x9B, 0x0C, 0x95, 0xF4, 0xEA, 0x12, 0x61, 0x07, 0xD6, 0xF8, 0x36, 0x02, + 0x7E, 0xE9, 0xCA, 0x02, 0xD2, 0xED, 0xE3, 0x08, 0xFC, 0xF4, 0xD7, 0x0C, + 0xCE, 0xF4, 0x0A, 0x04, 0x5D, 0xF0, 0xEF, 0xF8, 0x65, 0xEA, 0xAB, 0xF6, + 0xDA, 0xDE, 0xB4, 0xFE, 0x22, 0xE2, 0x0F, 0x1C, 0x3C, 0xE5, 0x9D, 0x18, + 0x69, 0xE4, 0x09, 0xF9, 0x1E, 0xE7, 0x0B, 0xE9, 0xE4, 0xDC, 0x29, 0xDA, + 0xDA, 0xD7, 0x03, 0xD5, 0x2A, 0xE2, 0x4C, 0xD8, 0x96, 0xE9, 0x94, 0xD9, + 0x5E, 0xDA, 0x81, 0xCB, 0x0E, 0xD1, 0x6F, 0xC8, 0x13, 0xDF, 0xF5, 0xD8, + 0xFE, 0xEA, 0xA1, 0xD9, 0xF0, 0xEC, 0x17, 0xD9, 0x72, 0xE7, 0x9E, 0xDA, + 0x3B, 0xE6, 0xF1, 0xDB, 0xDB, 0xEB, 0x5F, 0xDC, 0x5D, 0xF0, 0x07, 0xE1, + 0x2F, 0xEE, 0x7F, 0xEE, 0x16, 0xE2, 0x6A, 0xF4, 0x85, 0xCD, 0xC6, 0xF6, + 0x52, 0xD0, 0x93, 0x01, 0x8F, 0xDC, 0xF6, 0x01, 0x4E, 0xDA, 0x57, 0xF0, + 0xCA, 0xDF, 0xC3, 0xE4, 0xCE, 0xDF, 0x89, 0xE4, 0x60, 0xE1, 0x2F, 0xF3, + 0xC7, 0xEA, 0x5E, 0x06, 0x5F, 0xE7, 0x03, 0x04, 0x82, 0xEC, 0x67, 0xFF, + 0xA0, 0xFE, 0x36, 0xFC, 0x88, 0x0A, 0x84, 0xF3, 0x9E, 0x07, 0xC8, 0xF0, + 0x76, 0x0A, 0x5B, 0x04, 0xEA, 0x09, 0xB8, 0x14, 0xFD, 0x00, 0x4A, 0x0B, + 0x16, 0x0B, 0xE6, 0xFF, 0x18, 0x16, 0x33, 0xEF, 0xA6, 0x13, 0x9A, 0xF3, + 0x7F, 0x09, 0xEB, 0x0D, 0x21, 0x14, 0xEC, 0x20, 0x7A, 0x1B, 0x26, 0x19, + 0x16, 0x18, 0xF3, 0x08, 0xF3, 0x19, 0x2B, 0x14, 0x10, 0x0C, 0xF5, 0x15, + 0x9D, 0x10, 0x24, 0x0A, 0x57, 0x28, 0x57, 0x06, 0x30, 0x2D, 0xF7, 0x06, + 0x32, 0x2C, 0x53, 0x11, 0xFA, 0x23, 0xD7, 0x06, 0xBF, 0x0C, 0xF5, 0xEE, + 0x82, 0x0E, 0x46, 0x03, 0x12, 0x11, 0x73, 0x14, 0x9F, 0x04, 0x37, 0x0F, + 0xFF, 0x03, 0x22, 0x12, 0xF3, 0x01, 0xDF, 0x07, 0x2E, 0x0D, 0x22, 0x05, + 0x6A, 0x1B, 0x42, 0x14, 0x19, 0x0F, 0xCF, 0x13, 0xA6, 0xFF, 0xB8, 0x03, + 0x22, 0x03, 0x58, 0xF9, 0x2D, 0x0E, 0x9C, 0xF8, 0xB1, 0x11, 0xA7, 0x02, + 0xDC, 0xFD, 0x02, 0x08, 0x42, 0xE2, 0x1C, 0xFB, 0x73, 0xE1, 0xDF, 0xEE, + 0x1C, 0xF8, 0xC6, 0xF0, 0x43, 0x01, 0xAB, 0xF4, 0xA7, 0xF7, 0x63, 0x02, + 0xAD, 0xF9, 0x15, 0x1A, 0x5A, 0xFC, 0x98, 0x1A, 0xC0, 0xF7, 0x02, 0x0E, + 0xBE, 0xFD, 0x2F, 0x0C, 0x60, 0xF7, 0xAA, 0x04, 0x2E, 0xEE, 0x08, 0xF7, + 0x5D, 0xEC, 0x22, 0xEE, 0x22, 0xE3, 0x1F, 0xE6, 0xB4, 0xDD, 0x0E, 0xE6, + 0xDC, 0xDF, 0xA1, 0xF1, 0xD4, 0xDC, 0xBC, 0xF5, 0xAB, 0xD9, 0xC2, 0xF1, + 0x55, 0xE9, 0xB4, 0xF4, 0xF0, 0xF9, 0xF4, 0xF2, 0xAA, 0xF6, 0x61, 0xE6, + 0xBA, 0xEB, 0x31, 0xD9, 0xC5, 0xEE, 0xEF, 0xD2, 0x51, 0xF8, 0xEF, 0xD5, + 0x8A, 0xEE, 0x84, 0xD2, 0xFF, 0xDF, 0x67, 0xC3, 0x57, 0xD7, 0x3B, 0xB8, + 0x41, 0xD4, 0x11, 0xB5, 0x3F, 0xE3, 0xC6, 0xBC, 0x97, 0xEA, 0xF4, 0xBD, + 0x03, 0xE1, 0x2F, 0xB6, 0x55, 0xDE, 0xF9, 0xBB, 0xB4, 0xDD, 0x67, 0xC1, + 0xCB, 0xD0, 0x48, 0xC9, 0xA4, 0xC0, 0xD6, 0xD4, 0x90, 0xB9, 0xB6, 0xD1, + 0xE7, 0xBC, 0x41, 0xCA, 0x78, 0xC7, 0x08, 0xC9, 0xC7, 0xC7, 0xB3, 0xC1, + 0x33, 0xC6, 0xF9, 0xC6, 0xDF, 0xC8, 0x51, 0xE4, 0x15, 0xC4, 0x28, 0xE8, + 0x70, 0xCC, 0x80, 0xE2, 0x51, 0xD3, 0xBF, 0xE1, 0x8C, 0xD4, 0x32, 0xD5, + 0x8E, 0xDC, 0x55, 0xD8, 0x4E, 0xD0, 0xE6, 0xE0, 0x23, 0xC0, 0x7E, 0xE1, + 0xC1, 0xCF, 0x46, 0xDF, 0x0F, 0xE6, 0x7D, 0xD3, 0xE5, 0xF0, 0x20, 0xD4, + 0x5A, 0xF7, 0xF6, 0xE0, 0x09, 0xF8, 0x11, 0xE6, 0xC4, 0xF2, 0x5B, 0xE5, + 0x26, 0xE9, 0xB9, 0xE1, 0x94, 0xDF, 0xB4, 0xE1, 0x9D, 0xE4, 0xC6, 0xE3, + 0x60, 0xF5, 0x8E, 0xE6, 0xAC, 0x01, 0x77, 0xF4, 0xDE, 0xFF, 0xCF, 0xF8, + 0x22, 0xFB, 0xDD, 0xEE, 0x42, 0xF7, 0x92, 0xEE, 0xCE, 0xF2, 0xAF, 0xF0, + 0xCD, 0xF4, 0x29, 0xF1, 0xAA, 0xF1, 0x6B, 0xF1, 0x2E, 0xEE, 0x96, 0xEF, + 0x82, 0xF3, 0x5C, 0xEE, 0xFF, 0xFC, 0x16, 0xF3, 0x83, 0x03, 0xCA, 0xF7, + 0x0F, 0xF6, 0xBF, 0xEF, 0x92, 0xE7, 0xEE, 0xEB, 0x19, 0xE9, 0xE7, 0xE8, + 0xF3, 0xED, 0x0E, 0xDC, 0x40, 0xF9, 0x14, 0xD8, 0xAE, 0x02, 0x3D, 0xDD, + 0x59, 0x02, 0x72, 0xE4, 0xBA, 0xF8, 0x6C, 0xF2, 0xA8, 0xE8, 0xEA, 0xEF, + 0x63, 0xE7, 0x3D, 0xD7, 0x89, 0xFC, 0xF0, 0xD5, 0x78, 0x02, 0x32, 0xE2, + 0xC7, 0xEB, 0x65, 0xDD, 0x6E, 0xE0, 0x5A, 0xE2, 0x6B, 0xE7, 0xB2, 0xF2, + 0x31, 0xE3, 0x76, 0xEE, 0x2E, 0xDB, 0xDD, 0xEA, 0x54, 0xE0, 0x23, 0xF0, + 0x54, 0xE9, 0xEC, 0xE6, 0x1B, 0xEE, 0xEA, 0xE5, 0xFD, 0xEB, 0xC7, 0xE7, + 0x49, 0xE8, 0x6D, 0xE4, 0x2B, 0xE0, 0xFD, 0xE6, 0x4B, 0xD5, 0x30, 0xE4, + 0xDC, 0xD9, 0x93, 0xE5, 0x33, 0xEE, 0x86, 0xEB, 0x89, 0xF3, 0x69, 0xDF, + 0xF9, 0xF4, 0xEE, 0xD7, 0x2C, 0x04, 0x04, 0xE5, 0xCA, 0xFB, 0xE4, 0xDE, + 0x2C, 0xE6, 0xF4, 0xD2, 0x4B, 0xD8, 0x4F, 0xE0, 0xE4, 0xD5, 0x7E, 0xF1, + 0x3B, 0xE2, 0x7E, 0xF1, 0xB4, 0xF1, 0x22, 0xEC, 0xC7, 0xFF, 0xA6, 0xF0, + 0xC8, 0x06, 0xB1, 0xEB, 0xBD, 0x02, 0xE8, 0xE1, 0xB8, 0xF6, 0x41, 0xE3, + 0x13, 0xE2, 0x6D, 0xE3, 0xAA, 0xDB, 0xEA, 0xFD, 0xFB, 0xE4, 0x0C, 0x1B, + 0xE5, 0xEE, 0xB7, 0x10, 0x8E, 0xFC, 0x8B, 0x08, 0x5A, 0x0A, 0x43, 0x0D, + 0x83, 0x15, 0xFC, 0x0E, 0xC0, 0x09, 0xCC, 0x12, 0x10, 0xF3, 0xE0, 0x1C, + 0xCB, 0xFC, 0x18, 0x27, 0xAC, 0x21, 0x92, 0x2A, 0xA9, 0x34, 0x15, 0x28, + 0x2F, 0x2A, 0xCA, 0x1D, 0xF0, 0x24, 0x7B, 0x1E, 0x11, 0x2D, 0xC7, 0x35, + 0x97, 0x28, 0x38, 0x37, 0xCD, 0x22, 0xF9, 0x23, 0x76, 0x1D, 0xBE, 0x23, + 0xDC, 0x15, 0xCC, 0x26, 0x8C, 0x22, 0xA4, 0x1F, 0x7E, 0x31, 0x02, 0x1F, + 0x7B, 0x2B, 0xEB, 0x21, 0x29, 0x20, 0x10, 0x19, 0x83, 0x25, 0x7E, 0x1A, + 0x0E, 0x38, 0xBD, 0x2C, 0x44, 0x40, 0xD6, 0x2E, 0x09, 0x30, 0x28, 0x21, + 0xF9, 0x28, 0x39, 0x26, 0x1E, 0x39, 0x7F, 0x2E, 0x16, 0x44, 0x3B, 0x13, + 0x3E, 0x43, 0x19, 0xFE, 0xA9, 0x39, 0xDA, 0x07, 0xF2, 0x29, 0xC7, 0x11, + 0x1E, 0x20, 0x95, 0x20, 0x01, 0x20, 0x80, 0x27, 0xB6, 0x2C, 0x0D, 0x27, + 0x1C, 0x2B, 0xB8, 0x29, 0x4F, 0x1D, 0x15, 0x2C, 0xAD, 0x21, 0xF2, 0x33, + 0x25, 0x1C, 0xBF, 0x2C, 0x64, 0x1F, 0xEC, 0x23, 0x65, 0x34, 0xEC, 0x21, + 0xC8, 0x35, 0x96, 0x21, 0xC8, 0x37, 0xA5, 0x2F, 0xFB, 0x46, 0xF2, 0x3B, + 0x12, 0x47, 0x70, 0x35, 0xCB, 0x36, 0xC6, 0x30, 0x05, 0x29, 0xFF, 0x38, + 0x8E, 0x1F, 0xF9, 0x2D, 0x66, 0x1B, 0x67, 0x1A, 0x79, 0x23, 0xEE, 0x19, + 0x90, 0x28, 0x30, 0x22, 0x6A, 0x15, 0xBD, 0x24, 0xC7, 0x16, 0xA7, 0x2E, + 0x69, 0x28, 0x11, 0x36, 0xA8, 0x1F, 0x3A, 0x28, 0x4F, 0x12, 0xC1, 0x1E, + 0x74, 0x0C, 0xDD, 0x1C, 0x08, 0x13, 0x4E, 0x23, 0x5B, 0x0A, 0x05, 0x23, + 0xB0, 0xF6, 0xB5, 0x1D, 0xE9, 0xFB, 0x11, 0x25, 0x8E, 0xFA, 0xA3, 0x1E, + 0xD5, 0xF7, 0x11, 0x16, 0x2B, 0x06, 0x15, 0x0C, 0xA2, 0x14, 0x5C, 0x02, + 0x2C, 0x13, 0x88, 0x03, 0xB0, 0x0D, 0x8D, 0xFC, 0x44, 0x17, 0x99, 0xF9, + 0x96, 0x0B, 0x8C, 0xEA, 0xC9, 0xFA, 0xE7, 0xD8, 0xBD, 0xF5, 0xE9, 0xD8, + 0xB1, 0xE6, 0xD2, 0xD4, 0xD6, 0xED, 0x6D, 0xE0, 0x3E, 0x04, 0x73, 0xED, + 0x62, 0x04, 0x01, 0xE7, 0xA0, 0xFD, 0xBD, 0xED, 0x4B, 0xF8, 0x1B, 0xFF, + 0x4D, 0xF8, 0xE8, 0x0D, 0xED, 0xF6, 0x87, 0x0A, 0xE1, 0xF4, 0xD1, 0xF5, + 0x3B, 0xFD, 0xD9, 0xF6, 0x05, 0xF0, 0xE4, 0xF8, 0x27, 0xDE, 0x98, 0xFD, + 0x77, 0xDE, 0x3B, 0x19, 0x80, 0xDC, 0x47, 0x18, 0x82, 0xF1, 0xA1, 0x0B, + 0xE5, 0x11, 0x6B, 0x1B, 0x51, 0x12, 0x85, 0x21, 0x4C, 0x09, 0x17, 0x1D, + 0x62, 0x0E, 0x70, 0x23, 0x80, 0x07, 0xCF, 0x1A, 0xC7, 0xF1, 0xDE, 0x0B, + 0x8B, 0xEA, 0xDC, 0x09, 0xD0, 0xFD, 0x98, 0x0B, 0xC3, 0x13, 0x90, 0x0B, + 0x13, 0x13, 0xEE, 0x08, 0xA6, 0x01, 0xCC, 0x0E, 0xDD, 0xFF, 0x2E, 0x20, + 0x2F, 0x07, 0xB2, 0x21, 0x25, 0xFC, 0xEC, 0x0B, 0xC0, 0xFA, 0x2F, 0x09, + 0x77, 0x01, 0xCA, 0x13, 0xDB, 0x04, 0xD8, 0x11, 0xD4, 0x0F, 0xA2, 0x0D, + 0x7D, 0x1A, 0x13, 0x0F, 0xA9, 0x20, 0x23, 0x0F, 0x82, 0x13, 0xA3, 0x05, + 0x62, 0x06, 0x77, 0x08, 0xFB, 0x10, 0x8E, 0x14, 0xF9, 0x1D, 0xA1, 0x0F, + 0xE3, 0x14, 0xEF, 0x09, 0xC1, 0x05, 0xA3, 0x0D, 0x21, 0x05, 0xE0, 0x10, + 0xEB, 0x03, 0x0B, 0x13, 0x59, 0x03, 0xAD, 0x0C, 0xC9, 0x04, 0x94, 0x01, + 0x4E, 0x00, 0x73, 0xFA, 0xAE, 0xFF, 0xE1, 0xFB, 0x8F, 0x0A, 0xB0, 0x08, + 0xF4, 0x0E, 0x1B, 0x06, 0x4A, 0x0A, 0xB3, 0xF7, 0x10, 0x08, 0xF1, 0xF2, + 0x5B, 0x03, 0x2D, 0xEB, 0x72, 0x0C, 0xC9, 0xE6, 0x38, 0x17, 0xC8, 0xE2, + 0x9B, 0x03, 0xC7, 0xE1, 0x4B, 0xF4, 0x60, 0xFE, 0x85, 0xF7, 0x95, 0x08, + 0xBB, 0xF6, 0x43, 0xF3, 0x80, 0xE9, 0xE7, 0xED, 0xCC, 0xDF, 0xE4, 0xEC, + 0x4A, 0xE5, 0x39, 0xE9, 0x17, 0xF4, 0x23, 0xF0, 0x89, 0xFE, 0xB1, 0xF6, + 0xAD, 0xF2, 0x89, 0xF2, 0xA2, 0xDB, 0x4D, 0xEA, 0x18, 0xD1, 0xAD, 0xEE, + 0xD7, 0xD5, 0x46, 0xF6, 0x10, 0xD7, 0x79, 0xF2, 0x25, 0xD9, 0x2F, 0xF0, + 0xF5, 0xE4, 0x79, 0xEB, 0x80, 0xEB, 0xC5, 0xE5, 0xD4, 0xF3, 0x64, 0xE9, + 0x43, 0xFF, 0x84, 0xE7, 0x9E, 0xF3, 0xE0, 0xDB, 0xB9, 0xE1, 0x0C, 0xE3, + 0xF8, 0xEC, 0x08, 0xF5, 0xCD, 0xFB, 0xCE, 0xF0, 0x4E, 0x0D, 0x05, 0xF0, + 0x63, 0x1D, 0x07, 0xF0, 0x7C, 0x0C, 0xE4, 0xE5, 0x5A, 0xFE, 0x71, 0xFB, + 0x76, 0xFA, 0xF7, 0x13, 0x23, 0xED, 0xE9, 0x17, 0xF3, 0xE8, 0x64, 0x1F, + 0x90, 0xF4, 0x9E, 0x1A, 0x62, 0x05, 0x9A, 0x11, 0x46, 0xFA, 0x91, 0x0B, + 0xF3, 0xEB, 0x1A, 0x12, 0x62, 0xEF, 0xEF, 0x19, 0xFA, 0xE8, 0x13, 0x14, + 0x0A, 0xF1, 0x89, 0x1E, 0x51, 0x02, 0x52, 0x1B, 0xF9, 0x0E, 0xF7, 0x17, + 0x7C, 0x18, 0x95, 0x22, 0x32, 0x1A, 0x84, 0x1C, 0x4F, 0x11, 0x7B, 0x1B, + 0x2B, 0x01, 0x10, 0x16, 0xFF, 0x01, 0x83, 0x0C, 0xB5, 0x0C, 0xF2, 0x0B, + 0x89, 0x09, 0x92, 0x06, 0xCC, 0x08, 0xEF, 0x0C, 0x66, 0x18, 0x49, 0x20, + 0x43, 0x2A, 0x9B, 0x24, 0xC6, 0x27, 0xF4, 0x16, 0xB5, 0x15, 0x37, 0x10, + 0x58, 0x0D, 0x10, 0x1A, 0x15, 0x14, 0x0D, 0x29, 0xCF, 0x14, 0xA8, 0x26, + 0xE5, 0x11, 0x59, 0x15, 0x3F, 0x21, 0x97, 0x08, 0x6F, 0x26, 0x3C, 0xFA, + 0xD6, 0x15, 0xDF, 0xF0, 0xD0, 0x0D, 0xB1, 0xEF, 0x2E, 0x11, 0x61, 0xF6, + 0xC9, 0x09, 0xEE, 0xF9, 0xB9, 0x08, 0x55, 0x06, 0xCB, 0x1B, 0xFB, 0x1F, + 0x56, 0x1B, 0x3A, 0x17, 0xFA, 0x12, 0x78, 0x04, 0xCD, 0x12, 0x4B, 0x03, + 0xC1, 0x08, 0x91, 0xFF, 0xBA, 0x01, 0xD1, 0xFE, 0xD6, 0x09, 0x58, 0x09, + 0x9C, 0x22, 0x05, 0x12, 0xE6, 0x2A, 0x93, 0x0E, 0x9A, 0x18, 0x36, 0x18, + 0xFC, 0x0F, 0x93, 0x1E, 0xD2, 0x17, 0x67, 0x13, 0xC4, 0x10, 0x86, 0x06, + 0xCD, 0xFB, 0xCC, 0xFF, 0x20, 0xF2, 0x49, 0x01, 0x54, 0xF7, 0x71, 0x00, + 0xAB, 0x09, 0xB9, 0x05, 0x21, 0x05, 0x7C, 0xFF, 0xB4, 0xF6, 0x53, 0xFB, + 0x63, 0xF6, 0xA9, 0x01, 0x73, 0xFC, 0x35, 0x02, 0x64, 0x0C, 0x28, 0x0E, + 0x5D, 0x01, 0x5C, 0x08, 0x7D, 0xF4, 0xA6, 0xFD, 0x68, 0xEB, 0x44, 0x03, + 0x00, 0xDD, 0x5F, 0x02, 0x7B, 0xEA, 0x68, 0xFD, 0xDC, 0xF1, 0xC1, 0xFB, + 0x63, 0xEE, 0x7B, 0xFE, 0x76, 0xE9, 0x48, 0xEF, 0xEF, 0xF4, 0x1D, 0xE6, + 0xE0, 0x17, 0xC0, 0xF6, 0xB3, 0x14, 0xAD, 0xF1, 0x5D, 0xF0, 0x96, 0xE1, + 0x2A, 0xE2, 0xC8, 0xE7, 0x23, 0xE4, 0xC5, 0xE1, 0x29, 0xE5, 0xEB, 0xCB, + 0x27, 0xF5, 0xA5, 0xCB, 0x94, 0x01, 0x51, 0xC9, 0x87, 0xF6, 0xC3, 0xB7, + 0x0E, 0xED, 0x6E, 0xBD, 0x76, 0xE8, 0x9E, 0xD8, 0xBD, 0xE0, 0xD8, 0xE3, + 0xEF, 0xDF, 0x2E, 0xDC, 0x81, 0xEA, 0x8B, 0xD6, 0x76, 0xEE, 0xD1, 0xD3, + 0x19, 0xE5, 0xC9, 0xD1, 0xB2, 0xCE, 0x07, 0xD0, 0x52, 0xBF, 0x84, 0xDB, + 0x27, 0xBD, 0x3B, 0xE7, 0x35, 0xC8, 0xC0, 0xEB, 0x5D, 0xDD, 0x62, 0xFC, + 0x38, 0xDE, 0x62, 0xFC, 0xA6, 0xDC, 0x1A, 0xE9, 0xC8, 0xD9, 0xB4, 0xE1, + 0x7C, 0xD9, 0xE9, 0xED, 0x5D, 0xDD, 0xB8, 0xEC, 0xB4, 0xD2, 0x03, 0xD8, + 0xD3, 0xDC, 0x16, 0xD9, 0x13, 0xDF, 0x0E, 0xDA, 0x3D, 0xDC, 0x83, 0xE1, + 0xFE, 0xE4, 0x1E, 0xF0, 0xFD, 0xD6, 0xCE, 0xE8, 0x22, 0xD4, 0xB7, 0xEB, + 0xD4, 0xE2, 0xEA, 0xEC, 0xD2, 0xF6, 0x7B, 0xEA, 0xB1, 0xF3, 0x91, 0xF2, + 0x76, 0xDE, 0xA6, 0xF6, 0xCD, 0xEB, 0x9F, 0xF1, 0x1E, 0xFF, 0x52, 0xE4, + 0x1D, 0x0B, 0x7D, 0xF3, 0xA2, 0x10, 0x8A, 0xFF, 0x65, 0x07, 0x62, 0xF0, + 0x5F, 0xFA, 0x9D, 0xF1, 0x11, 0xF4, 0x5B, 0xFC, 0x86, 0xF3, 0x7A, 0x01, + 0x38, 0xEB, 0x49, 0xFC, 0x33, 0xF2, 0x2B, 0xF5, 0xB5, 0xF1, 0x52, 0xE2, + 0xE0, 0xDC, 0xCA, 0xD3, 0xC5, 0xD1, 0xF4, 0xD7, 0x96, 0xDB, 0x60, 0xDB, + 0x77, 0xEB, 0x66, 0xDF, 0xFC, 0xEC, 0x9D, 0xD9, 0xC9, 0xF6, 0x10, 0xDB, + 0xBF, 0x05, 0xB8, 0xE4, 0x34, 0x04, 0xBA, 0xE0, 0xD3, 0xF7, 0x1E, 0xD5, + 0x6A, 0xE4, 0x49, 0xC7, 0x01, 0xDA, 0x8D, 0xC6, 0x0B, 0xE0, 0x56, 0xCB, + 0xDD, 0xF3, 0xA8, 0xD7, 0x27, 0xEE, 0x31, 0xD9, 0x42, 0xD4, 0xBC, 0xC6, + 0x3D, 0xD1, 0x5D, 0xCC, 0x38, 0xCD, 0x42, 0xD6, 0x63, 0xD1, 0x23, 0xD2, + 0x86, 0xD8, 0x28, 0xC5, 0xE9, 0xDC, 0xB9, 0xC1, 0xBC, 0xE1, 0x23, 0xC6, + 0xC2, 0xD3, 0x66, 0xC2, 0x84, 0xCE, 0xE7, 0xCF, 0x17, 0xC1, 0xF5, 0xD1, + 0x79, 0xB5, 0x23, 0xCC, 0x5E, 0xC2, 0x9E, 0xD4, 0xE8, 0xCE, 0x03, 0xD2, + 0xB8, 0xE3, 0x5A, 0xBE, 0xEF, 0xED, 0xAD, 0xB1, 0x38, 0xEA, 0x30, 0xC6, + 0x79, 0xD8, 0x51, 0xD2, 0x81, 0xCD, 0xC8, 0xD4, 0xC9, 0xD2, 0x95, 0xD6, + 0xAE, 0xD5, 0xED, 0xCF, 0x02, 0xE4, 0xAA, 0xD3, 0x1B, 0xEA, 0xC3, 0xD2, + 0xB2, 0xEA, 0x54, 0xD0, 0xB4, 0xEE, 0x27, 0xD6, 0xA1, 0xEC, 0x29, 0xE5, + 0xE2, 0xEA, 0x56, 0xF8, 0x22, 0xEB, 0xD0, 0x02, 0xC9, 0xF7, 0x55, 0x02, + 0x9E, 0x09, 0x82, 0xFD, 0x06, 0x05, 0x8E, 0xF9, 0x9A, 0xF4, 0x2E, 0xF9, + 0x33, 0xE4, 0x1C, 0xFC, 0xEF, 0xDB, 0xC2, 0x01, 0xBE, 0xEB, 0xD2, 0x0C, + 0xCC, 0xFE, 0x6B, 0x0E, 0x61, 0xFE, 0x7D, 0x00, 0xE5, 0xFF, 0x27, 0x04, + 0x98, 0x11, 0xE1, 0x1B, 0x22, 0x13, 0x95, 0x18, 0xD3, 0x07, 0xE8, 0x09, + 0x48, 0xFE, 0xCD, 0x05, 0x6D, 0xEE, 0x14, 0x01, 0x77, 0xF6, 0xAC, 0x0A, + 0x04, 0x0E, 0x61, 0x12, 0x99, 0x09, 0xF3, 0x0E, 0x3B, 0x06, 0x57, 0x0A, + 0x32, 0x1C, 0x56, 0x01, 0x5A, 0x30, 0xDE, 0x08, 0x85, 0x2A, 0xFD, 0x1D, + 0x77, 0x0D, 0x27, 0x20, 0x59, 0x03, 0xED, 0x23, 0xCF, 0x11, 0x28, 0x30, + 0xAE, 0x2A, 0xF5, 0x24, 0x48, 0x3E, 0xAB, 0x0E, 0xA1, 0x42, 0x83, 0x0D, + 0xD5, 0x36, 0xB4, 0x0E, 0x74, 0x1E, 0x12, 0x01, 0x06, 0x25, 0xDA, 0x11, + 0x73, 0x2D, 0x7B, 0x25, 0x66, 0x27, 0x38, 0x22, 0xDC, 0x2C, 0xF1, 0x2C, + 0x42, 0x2F, 0x3F, 0x39, 0xAC, 0x20, 0x5E, 0x2F, 0x12, 0x14, 0xA9, 0x26, + 0xEE, 0x1A, 0x84, 0x24, 0x85, 0x21, 0x88, 0x20, 0x7B, 0x1E, 0x23, 0x21, + 0xC2, 0x21, 0xE6, 0x1E, 0x31, 0x38, 0xE9, 0x26, 0x7F, 0x34, 0xAE, 0x27, + 0xF5, 0x12, 0xF1, 0x16, 0x1F, 0x19, 0x44, 0x1B, 0xBB, 0x2B, 0x71, 0x24, + 0x32, 0x22, 0x47, 0x13, 0xFB, 0x20, 0x3F, 0x12, 0x74, 0x1D, 0x13, 0x1E, + 0x69, 0x18, 0xF3, 0x25, 0xFE, 0x1C, 0x1E, 0x2A, 0xB0, 0x14, 0x80, 0x23, + 0x8C, 0x13, 0xF0, 0x2B, 0xF4, 0x1C, 0xE3, 0x33, 0xF3, 0x1D, 0xCA, 0x2A, + 0x88, 0x18, 0x34, 0x2A, 0x53, 0x13, 0x73, 0x31, 0x3B, 0x0E, 0x4F, 0x2A, + 0xAB, 0x09, 0x7F, 0x26, 0xB7, 0x07, 0x6E, 0x2E, 0xB3, 0x01, 0x9E, 0x27, + 0x71, 0x14, 0xEE, 0x26, 0xCF, 0x22, 0xF3, 0x24, 0x4D, 0x1A, 0x23, 0x20, + 0x8F, 0x25, 0xB0, 0x21, 0x14, 0x25, 0x22, 0x12, 0x45, 0x1B, 0x72, 0x11, + 0x8A, 0x12, 0x6B, 0x14, 0xB8, 0x0F, 0x80, 0x0E, 0x04, 0x1E, 0xFF, 0x08, + 0x53, 0x2D, 0xED, 0x00, 0x8C, 0x35, 0x4A, 0xFA, 0x38, 0x26, 0x36, 0xF6, + 0x17, 0x19, 0x5E, 0x03, 0xF7, 0x18, 0x12, 0x0F, 0xEF, 0x1A, 0xFB, 0x18, + 0x1D, 0x1E, 0x78, 0x17, 0x1F, 0x1A, 0x7C, 0x06, 0x04, 0x1B, 0xF4, 0x09, + 0xAE, 0x04, 0x8D, 0x01, 0xFA, 0xFD, 0xBB, 0x04, 0x6B, 0x07, 0x74, 0x15, + 0xC2, 0xF9, 0xED, 0x13, 0x1E, 0xFE, 0xF5, 0x0E, 0x05, 0x0C, 0x9B, 0x09, + 0x96, 0x13, 0xF3, 0x15, 0x0C, 0x0A, 0x77, 0x1B, 0xDE, 0xFB, 0x65, 0x14, + 0xA1, 0x01, 0x5D, 0x17, 0x2F, 0x00, 0x6D, 0x09, 0x28, 0xF9, 0x3D, 0xFC, + 0xF5, 0xFC, 0x6E, 0x04, 0x53, 0xFA, 0xB5, 0x0C, 0x02, 0xEB, 0x8D, 0x0D, + 0x1E, 0xEF, 0xB0, 0x13, 0x21, 0x0A, 0x9A, 0x16, 0xD2, 0x10, 0xBC, 0x0A, + 0xEE, 0xFE, 0x64, 0x0F, 0xE0, 0xF1, 0x32, 0x18, 0x1C, 0xFF, 0xA2, 0x1A, + 0x37, 0x0E, 0xCB, 0x1D, 0x4B, 0x1B, 0xC4, 0x1D, 0xEE, 0x30, 0x30, 0x1C, + 0x07, 0x32, 0xA6, 0x10, 0xF0, 0x22, 0x21, 0x11, 0xE2, 0x1A, 0xBA, 0x1F, + 0x01, 0x15, 0x37, 0x27, 0x46, 0x06, 0x16, 0x24, 0xF8, 0x13, 0xE7, 0x2C, + 0x42, 0x28, 0x56, 0x34, 0x60, 0x27, 0x8E, 0x25, 0x7C, 0x21, 0x09, 0x16, + 0x64, 0x07, 0x06, 0x05, 0x62, 0x00, 0xAF, 0x0B, 0x3D, 0xFF, 0xFA, 0x10, + 0x9E, 0xFE, 0x27, 0x06, 0x19, 0x11, 0xD5, 0x0D, 0xA0, 0x10, 0x8A, 0x0B, + 0x7C, 0x06, 0x56, 0x0A, 0x17, 0x03, 0x4C, 0x0C, 0x21, 0x09, 0x47, 0x01, + 0xF0, 0x03, 0xD0, 0xEA, 0x44, 0x02, 0xBE, 0xE5, 0x9B, 0x06, 0xA2, 0xE9, + 0x95, 0xFE, 0x34, 0xE1, 0x08, 0x05, 0x79, 0xED, 0x30, 0xFC, 0x26, 0xF7, + 0x5B, 0xEE, 0x2B, 0xFB, 0xA3, 0xED, 0x67, 0xF6, 0x13, 0xEC, 0x1B, 0xE7, + 0xA2, 0xF2, 0x15, 0xEA, 0x3F, 0xEE, 0x0E, 0xE7, 0x8D, 0xEB, 0x56, 0xE9, + 0x5E, 0xD7, 0x40, 0xF4, 0x8B, 0xB7, 0xC9, 0xF6, 0x0A, 0xBE, 0xE4, 0xEF, + 0x6D, 0xD9, 0xD3, 0xEB, 0x69, 0xDE, 0x80, 0xE8, 0x5F, 0xE0, 0x52, 0xE2, + 0x5E, 0xF6, 0x05, 0xE8, 0x8C, 0x00, 0x56, 0xE2, 0x03, 0xFB, 0x7A, 0xE0, + 0x7D, 0xF3, 0x50, 0xF2, 0x6D, 0xE2, 0x55, 0xFE, 0xB0, 0xE1, 0x34, 0xFC, + 0xB0, 0xFE, 0x2F, 0xF7, 0x5D, 0x07, 0x9B, 0xED, 0x02, 0xFF, 0xD2, 0xE5, + 0x4A, 0xF4, 0xCA, 0xE8, 0xA3, 0xF1, 0x6F, 0xED, 0xFE, 0xF8, 0xA9, 0xEE, + 0x71, 0xF8, 0xA8, 0xF1, 0x95, 0xFD, 0x2C, 0x09, 0x96, 0x01, 0xBB, 0x16, + 0xE4, 0x0A, 0xCB, 0x0F, 0xB9, 0x06, 0xDB, 0x05, 0xE3, 0xF7, 0xEF, 0x09, + 0x01, 0xE9, 0x0E, 0x13, 0x57, 0xDB, 0x7D, 0x17, 0x7C, 0xED, 0x82, 0x1B, + 0x20, 0xFF, 0x7C, 0x0C, 0xC2, 0x09, 0x5D, 0x11, 0x98, 0x05, 0x87, 0x1D, + 0x95, 0x02, 0x5C, 0x1D, 0xB2, 0x11, 0xFC, 0x1F, 0x3F, 0x12, 0x18, 0x13, + 0xCE, 0x0D, 0x97, 0x02, 0x54, 0x02, 0xC3, 0x07, 0xD7, 0xF7, 0xBD, 0x1E, + 0x8E, 0xFA, 0x49, 0x1C, 0xCC, 0x0A, 0x21, 0x07, 0x95, 0x12, 0xCD, 0x02, + 0xD6, 0x04, 0xE7, 0x03, 0x5C, 0xFC, 0xF7, 0x09, 0x59, 0xFC, 0xAA, 0x15, + 0xFE, 0xF7, 0x13, 0x19, 0x8C, 0x07, 0xAF, 0x23, 0x96, 0x23, 0x79, 0x2C, + 0x8D, 0x2A, 0x6B, 0x1A, 0x40, 0x2C, 0x49, 0x07, 0x98, 0x2E, 0x47, 0x02, + 0x70, 0x2A, 0xA0, 0xFD, 0xF1, 0x1E, 0x52, 0x01, 0xA1, 0x19, 0xC6, 0x0B, + 0x6B, 0x2E, 0xB4, 0x1D, 0x1F, 0x36, 0xAE, 0x23, 0xBC, 0x2B, 0x9A, 0x21, + 0xAC, 0x1E, 0xAF, 0x2A, 0x28, 0x04, 0x4A, 0x21, 0x22, 0xFD, 0x7C, 0x10, + 0xDB, 0x0F, 0xEF, 0x09, 0xC5, 0x1C, 0x21, 0x07, 0xFB, 0x24, 0xC8, 0x15, + 0x44, 0x23, 0x29, 0x15, 0x1C, 0x25, 0x0B, 0x15, 0x78, 0x24, 0x2A, 0x19, + 0xE3, 0x0D, 0x39, 0x08, 0x2E, 0x09, 0x1A, 0x0F, 0x85, 0x06, 0x45, 0x0F, + 0xBD, 0x0B, 0xA2, 0x0A, 0x6E, 0x16, 0x95, 0x09, 0x57, 0x12, 0x29, 0x05, + 0x4A, 0x10, 0x37, 0x0C, 0x1E, 0x01, 0xFC, 0x08, 0x80, 0xFD, 0x46, 0x08, + 0xFD, 0x0A, 0x33, 0x0E, 0x2B, 0x0A, 0x0C, 0x0A, 0x91, 0x15, 0xC9, 0x0E, + 0x4C, 0x17, 0x26, 0x0B, 0x23, 0x07, 0x19, 0x10, 0x19, 0xF7, 0x20, 0x1A, + 0xDE, 0xE3, 0x93, 0x00, 0xB3, 0xE7, 0x32, 0x02, 0x9A, 0xE4, 0xC4, 0x11, + 0x71, 0xE5, 0xFB, 0x13, 0xBF, 0xFF, 0x77, 0x0B, 0xD2, 0x10, 0x9D, 0xFD, + 0xF5, 0x09, 0x48, 0xFB, 0xEA, 0xFB, 0x18, 0xFB, 0xF7, 0xF4, 0xFF, 0x00, + 0x11, 0xF9, 0x4B, 0xFB, 0x69, 0x01, 0xD8, 0xE7, 0xEB, 0x09, 0x3C, 0xE4, + 0x83, 0x02, 0xC8, 0xD4, 0xF5, 0xF7, 0x91, 0xC6, 0xAB, 0xFF, 0x2D, 0xD4, + 0x90, 0x01, 0x83, 0xDA, 0x23, 0xFF, 0xBD, 0xDD, 0x9F, 0xF8, 0x1F, 0xE9, + 0xC2, 0xEA, 0x53, 0xE6, 0x17, 0xF2, 0x9A, 0xD2, 0x49, 0xF7, 0xA2, 0xCC, + 0x7A, 0xE7, 0x09, 0xDC, 0x0A, 0xD6, 0x8B, 0xDE, 0xC3, 0xD9, 0x0E, 0xDC, + 0x2D, 0xE0, 0xD7, 0xDB, 0x2F, 0xD7, 0xD0, 0xD2, 0xB7, 0xD4, 0x99, 0xE2, + 0xCD, 0xC4, 0xBD, 0xF9, 0x85, 0xC3, 0x96, 0x01, 0x09, 0xD6, 0x25, 0xF5, + 0xB4, 0xDA, 0xFD, 0xD7, 0x58, 0xDB, 0xE5, 0xCB, 0x56, 0xCA, 0xEF, 0xD1, + 0xAD, 0xBF, 0xFC, 0xE5, 0xA8, 0xB4, 0x74, 0xDA, 0xAB, 0xBB, 0x7C, 0xD0, + 0xB0, 0xDA, 0xCE, 0xE4, 0x37, 0xE0, 0x14, 0xDF, 0x83, 0xE5, 0xF3, 0xE1, + 0x74, 0xD1, 0x57, 0xDD, 0x0E, 0xC6, 0xE3, 0xDB, 0xA3, 0xDD, 0x91, 0xF1, + 0x6D, 0xE3, 0xB2, 0xF2, 0x01, 0xEF, 0x6F, 0xF0, 0xD6, 0xF6, 0x9D, 0xE1, + 0xF7, 0xF9, 0xE9, 0xE1, 0xDC, 0xEA, 0x88, 0xE4, 0x43, 0xD8, 0x03, 0xE3, + 0x17, 0xE8, 0xDE, 0xF4, 0x0F, 0xF6, 0xC4, 0xF0, 0x5C, 0x0E, 0x90, 0xFC, + 0xD8, 0xFF, 0x8C, 0xF7, 0x98, 0xEB, 0xA9, 0xF2, 0x4E, 0xF0, 0xF9, 0xFA, + 0x48, 0xE2, 0x5B, 0xEA, 0xAD, 0xEA, 0x9D, 0xED, 0x4D, 0xE0, 0x4F, 0xE8, + 0x62, 0xDD, 0xC9, 0xEB, 0xDF, 0xE9, 0x9B, 0xEB, 0xFC, 0xEC, 0x55, 0xE3, + 0x3F, 0xF2, 0xA7, 0xE5, 0x2D, 0xE1, 0xC6, 0xDA, 0x96, 0xE5, 0x2D, 0xD6, + 0x52, 0xF3, 0x29, 0xCB, 0x9E, 0xFA, 0x01, 0xC5, 0xA9, 0xF5, 0x03, 0xC2, + 0xAA, 0xE3, 0x15, 0xC9, 0x4C, 0xD9, 0xD2, 0xD7, 0x64, 0xD2, 0x2E, 0xD4, + 0xFB, 0xD4, 0x1B, 0xD4, 0x4F, 0xCC, 0x55, 0xC5, 0x61, 0xD4, 0x80, 0xBD, + 0xDE, 0xD9, 0x2F, 0xC0, 0x89, 0xC9, 0x46, 0xC8, 0x4D, 0xCA, 0x30, 0xDB, + 0x94, 0xC7, 0x8A, 0xD3, 0xBE, 0xC4, 0x62, 0xD2, 0xB8, 0xBC, 0x7E, 0xD4, + 0x9C, 0xCA, 0x60, 0xD9, 0x82, 0xDF, 0xE6, 0xD5, 0xE2, 0xE2, 0xDF, 0xC6, + 0xD2, 0xEF, 0xFC, 0xD0, 0xE3, 0xDD, 0x91, 0xCD, 0x5B, 0xE4, 0x0B, 0xE0, + 0x8C, 0xE9, 0x8B, 0xEE, 0x41, 0xDA, 0x80, 0xEA, 0xEE, 0xE9, 0x36, 0xF5, + 0xF5, 0xE2, 0x28, 0xD9, 0x20, 0xED, 0x22, 0xCE, 0x0A, 0xF2, 0x25, 0xC5, + 0x4E, 0xE4, 0xE7, 0xB8, 0x35, 0xE2, 0xD6, 0xD1, 0xE6, 0xDD, 0xA6, 0xDC, + 0x5A, 0xF3, 0x50, 0xE4, 0x15, 0xFF, 0x48, 0xE4, 0xB4, 0x03, 0xB6, 0xE4, + 0x89, 0xF5, 0xBF, 0xE6, 0xD5, 0xEE, 0x51, 0xF7, 0x49, 0xF5, 0xE7, 0x09, + 0xC2, 0xE4, 0x4F, 0xFB, 0xA5, 0xE5, 0xE9, 0xF2, 0x53, 0xE5, 0xDD, 0xF2, + 0x03, 0xF0, 0xC8, 0x01, 0xF3, 0xF9, 0x4F, 0x0F, 0x95, 0x01, 0x24, 0x12, + 0x64, 0x14, 0xF1, 0x16, 0xF6, 0x00, 0x13, 0x05, 0xF8, 0xFB, 0x04, 0x0A, + 0x3E, 0x00, 0xF0, 0x13, 0x29, 0xF1, 0xFC, 0x0A, 0x52, 0xF6, 0xD5, 0x14, + 0x53, 0xF6, 0x0E, 0x11, 0x3D, 0x01, 0xAD, 0x04, 0x4D, 0x17, 0x20, 0x02, + 0x06, 0x11, 0xF2, 0xFF, 0x5B, 0xFD, 0xB4, 0xFE, 0x8E, 0xFD, 0xC9, 0x10, + 0x94, 0x0D, 0x93, 0x26, 0x30, 0x1C, 0x33, 0x20, 0x1F, 0x3B, 0x42, 0x24, + 0x81, 0x43, 0xC1, 0x25, 0xE1, 0x34, 0x88, 0x19, 0x52, 0x28, 0x42, 0x0E, + 0x95, 0x22, 0x20, 0x11, 0x3D, 0x2F, 0x5C, 0x19, 0x6D, 0x2E, 0xB3, 0x12, + 0xF5, 0x31, 0xE4, 0x1F, 0x7B, 0x2A, 0x48, 0x1D, 0xAD, 0x33, 0x08, 0x21, + 0xEE, 0x38, 0xB9, 0x2A, 0x15, 0x12, 0xDE, 0x1B, 0x00, 0x11, 0xFE, 0x1F, + 0xF6, 0x19, 0x17, 0x18, 0xC3, 0x29, 0xB1, 0x18, 0x29, 0x3B, 0x3A, 0x1E, + 0xE8, 0x38, 0xF3, 0x1B, 0xF7, 0x2A, 0xF5, 0x17, 0x3E, 0x1D, 0x0F, 0x19, + 0xB6, 0x28, 0x7D, 0x29, 0x88, 0x23, 0xF0, 0x20, 0x05, 0x1F, 0xAA, 0x17, + 0x7A, 0x25, 0xCA, 0x17, 0x99, 0x24, 0xE1, 0x17, 0xCD, 0x1C, 0xE9, 0x12, + 0x82, 0x15, 0x6B, 0x15, 0xBA, 0x1A, 0xEC, 0x21, 0x14, 0x14, 0x21, 0x19, + 0xA2, 0x16, 0xB4, 0x18, 0x23, 0x23, 0xB8, 0x2B, 0x32, 0x17, 0xCB, 0x33, + 0xCE, 0x19, 0x13, 0x2F, 0xEA, 0x1B, 0x42, 0x29, 0x16, 0xFF, 0x1F, 0x1F, + 0x03, 0x01, 0xFF, 0x22, 0x2C, 0x0D, 0x38, 0x28, 0x10, 0x0E, 0xB7, 0x22, + 0x11, 0x0E, 0xF7, 0x1E, 0x0F, 0x0C, 0xF7, 0x1A, 0x2F, 0x1B, 0xBC, 0x20, + 0x34, 0x27, 0x00, 0x22, 0x89, 0x29, 0x02, 0x24, 0xA3, 0x1A, 0xCD, 0x1F, + 0xA1, 0x15, 0x1C, 0x19, 0xE6, 0x1A, 0xC5, 0x11, 0x79, 0x17, 0x89, 0x03, + 0xFB, 0x14, 0x1F, 0xF6, 0x69, 0x09, 0xD1, 0xE9, 0x46, 0x0B, 0xCB, 0xF0, + 0xDE, 0x14, 0x28, 0xF6, 0xD6, 0x18, 0x83, 0xF2, 0xED, 0x12, 0x8E, 0xE6, + 0x32, 0x12, 0xE1, 0xE4, 0xA9, 0x0E, 0xCF, 0xEC, 0x68, 0xFC, 0x2B, 0xED, + 0x6B, 0xFE, 0xCF, 0xEB, 0x49, 0x05, 0xED, 0xDE, 0xC1, 0xFB, 0x13, 0xDF, + 0x4A, 0xE3, 0xF5, 0xE2, 0x33, 0xDB, 0xA2, 0xF2, 0x1F, 0xE2, 0x8E, 0x05, + 0x7D, 0xDF, 0x8C, 0x04, 0xF8, 0xE6, 0x94, 0x07, 0xFA, 0xEA, 0x88, 0xFD, + 0x8D, 0xE6, 0x98, 0xF2, 0x2A, 0xE7, 0xD0, 0xF0, 0x7B, 0xE3, 0xBA, 0xF9, + 0x5F, 0xCA, 0x31, 0xFB, 0x19, 0xCF, 0xF0, 0xFF, 0x57, 0xF3, 0xEA, 0x07, + 0x4F, 0xFD, 0x20, 0xFF, 0x8E, 0xF9, 0x19, 0x03, 0x31, 0xE0, 0x89, 0xFE, + 0x2B, 0xD4, 0x74, 0x03, 0xB2, 0xE1, 0xE4, 0x0C, 0x34, 0xF9, 0x86, 0x0F, + 0x2B, 0x0D, 0xB2, 0x11, 0x82, 0x01, 0xEF, 0xFE, 0x1D, 0x03, 0x58, 0xFE, + 0xA6, 0x0D, 0x4D, 0x01, 0xF2, 0x12, 0x00, 0xFF, 0x00, 0x19, 0xD0, 0x06, + 0x3F, 0x0B, 0xE2, 0x09, 0xB8, 0x0C, 0x92, 0x13, 0xB0, 0x20, 0x02, 0x18, + 0x1F, 0x18, 0x63, 0x13, 0x18, 0x03, 0xDD, 0x19, 0x9A, 0xF6, 0xF2, 0x16, + 0x38, 0xE7, 0xD0, 0xFE, 0xA9, 0xFA, 0xF7, 0xFE, 0xA2, 0x0C, 0x82, 0x03, + 0xE4, 0xEF, 0x97, 0xEB, 0x3F, 0xF7, 0x04, 0xFA, 0x69, 0x04, 0x53, 0x0E, + 0xE2, 0xFA, 0x8B, 0x03, 0x19, 0x11, 0x0F, 0x03, 0x06, 0x1B, 0xDD, 0xF5, + 0xED, 0x0F, 0x93, 0xE6, 0xC2, 0x18, 0x07, 0xED, 0x6C, 0x0A, 0xFE, 0xE6, + 0x5E, 0xF3, 0xF8, 0xEE, 0x56, 0xFC, 0xD5, 0x07, 0xC9, 0xF4, 0x9E, 0xF6, + 0x53, 0xF2, 0xCC, 0xE7, 0xD7, 0x03, 0xBA, 0xF1, 0xBC, 0xFE, 0x0C, 0xEE, + 0x8C, 0xF5, 0x5F, 0xEC, 0x85, 0xED, 0x57, 0xF1, 0x9B, 0xDD, 0xF1, 0xEC, + 0xE9, 0xDC, 0x7D, 0xF0, 0xAF, 0xEC, 0x8E, 0x0A, 0x1B, 0xDB, 0xFA, 0xFE, + 0x8F, 0xD1, 0xA2, 0xEE, 0x62, 0xEC, 0x8E, 0xF6, 0x6E, 0xFF, 0x3C, 0xEB, + 0xAA, 0x09, 0x23, 0xED, 0x52, 0xF5, 0xC9, 0xEE, 0x15, 0xE5, 0xC9, 0xF7, + 0x31, 0xF3, 0xD8, 0x0A, 0x11, 0xFA, 0x75, 0x0C, 0x88, 0xFA, 0x37, 0x07, + 0xD2, 0xF7, 0xD4, 0xEE, 0x40, 0xFF, 0xBD, 0xE7, 0x7E, 0xF7, 0xB6, 0xE0, + 0x6E, 0xF4, 0x83, 0xE1, 0xD3, 0xF4, 0x3C, 0xF0, 0x23, 0xE6, 0xF3, 0xE7, + 0x92, 0xF6, 0x5D, 0xF1, 0xB4, 0xFE, 0xD6, 0xF8, 0xE0, 0x06, 0x7F, 0x02, + 0x33, 0x0A, 0x3A, 0x04, 0x3D, 0x01, 0xA1, 0xFD, 0x14, 0x02, 0x56, 0x08, + 0x90, 0xF3, 0x96, 0x02, 0xD6, 0xEC, 0x12, 0x04, 0x8B, 0xF0, 0x05, 0x11, + 0xA4, 0x06, 0x4F, 0x20, 0x7D, 0x0D, 0xF0, 0x1A, 0x1E, 0x09, 0x2C, 0x18, + 0xC3, 0x20, 0x8E, 0x2E, 0x4F, 0x12, 0x42, 0x21, 0xEB, 0x02, 0x18, 0x26, + 0xA5, 0xFC, 0x0E, 0x34, 0x88, 0xF0, 0x98, 0x25, 0x6F, 0x07, 0x60, 0x27, + 0x1C, 0x14, 0xB6, 0x1D, 0xC3, 0x0E, 0xE5, 0x0D, 0x5A, 0x18, 0xE4, 0x13, + 0x5B, 0x18, 0x71, 0x12, 0x81, 0x0E, 0x80, 0x17, 0x90, 0x19, 0xED, 0x33, + 0x73, 0x23, 0xDA, 0x38, 0xA2, 0x33, 0x88, 0x3D, 0xE6, 0x44, 0x93, 0x46, + 0xDD, 0x42, 0x5F, 0x36, 0x51, 0x42, 0xAD, 0x26, 0xCB, 0x37, 0xCD, 0x1A, + 0x6B, 0x2A, 0x89, 0x20, 0x7B, 0x23, 0xE4, 0x26, 0x0B, 0x3A, 0xEE, 0x25, + 0x88, 0x4A, 0xB0, 0x22, 0x63, 0x42, 0xD6, 0x25, 0xCB, 0x43, 0xCD, 0x2F, + 0x72, 0x31, 0x9A, 0x28, 0xB6, 0x2C, 0x8D, 0x2E, 0x1D, 0x28, 0x46, 0x2E, + 0xFC, 0x1B, 0x88, 0x24, 0xD1, 0x28, 0x13, 0x2C, 0xBF, 0x2E, 0x7B, 0x2E, + 0xD7, 0x28, 0xCD, 0x27, 0x51, 0x2B, 0xA6, 0x2A, 0xE6, 0x26, 0xA5, 0x21, + 0xB3, 0x25, 0x26, 0x19, 0xE7, 0x2E, 0xE3, 0x1C, 0xC6, 0x2D, 0x26, 0x19, + 0x40, 0x28, 0x83, 0x1F, 0xDF, 0x1F, 0x39, 0x28, 0xB7, 0x13, 0x24, 0x22, + 0x1D, 0x1D, 0xB6, 0x22, 0x68, 0x24, 0xE8, 0x20, 0xE9, 0x1B, 0xFE, 0x21, + 0x27, 0x24, 0x07, 0x33, 0xC4, 0x1B, 0xB5, 0x22, 0xAC, 0x10, 0x35, 0x1A, + 0xD2, 0x1F, 0xA9, 0x30, 0x27, 0x1C, 0x21, 0x30, 0x52, 0x06, 0xEC, 0x25, + 0xA2, 0xFD, 0xE2, 0x1D, 0x3D, 0x04, 0xA9, 0x18, 0x2F, 0x09, 0x32, 0x12, + 0xE0, 0x11, 0xC7, 0x1A, 0xC0, 0x11, 0xBA, 0x1F, 0x9D, 0x02, 0xB1, 0x12, + 0xAB, 0x0F, 0x4C, 0x1F, 0x13, 0x1D, 0x61, 0x28, 0x62, 0x08, 0x21, 0x19, + 0xCA, 0xF7, 0x09, 0x09, 0xF0, 0xFC, 0x6A, 0xF9, 0xA4, 0x00, 0xE0, 0xEB, + 0x14, 0x01, 0x4A, 0xED, 0x0D, 0x0F, 0x0F, 0xFA, 0x1D, 0x11, 0x28, 0xF2, + 0x8A, 0x05, 0xE6, 0xDC, 0x7A, 0x14, 0xE0, 0xDF, 0x33, 0x18, 0x45, 0xE4, + 0x7C, 0x00, 0xDD, 0xDB, 0x95, 0xFD, 0x5E, 0xE2, 0x10, 0x00, 0xA6, 0xDF, + 0x1A, 0xF6, 0x10, 0xD2, 0xEB, 0xE9, 0xEE, 0xC8, 0x8E, 0xED, 0x3B, 0xDB, + 0x15, 0xD6, 0xB1, 0xDB, 0xD8, 0xBF, 0xF3, 0xCC, 0x97, 0xD9, 0xBC, 0xE7, + 0x61, 0xE7, 0x74, 0xEC, 0x7B, 0xE2, 0x6C, 0xDE, 0x1B, 0xD2, 0xF7, 0xDB, + 0xFD, 0xC6, 0xE0, 0xDC, 0xBB, 0xD4, 0x48, 0xEB, 0x6E, 0xD8, 0x77, 0xEE, + 0xA9, 0xD6, 0x1A, 0xED, 0x48, 0xE0, 0x2C, 0xF3, 0x57, 0xDE, 0xBE, 0xE4, + 0x81, 0xE3, 0xA2, 0xDF, 0x97, 0xF3, 0x46, 0xFC, 0xF4, 0xD6, 0x89, 0xF6, + 0x92, 0xC3, 0x37, 0xE6, 0xBE, 0xDE, 0x29, 0xF4, 0x0A, 0xE2, 0x00, 0xE8, + 0x94, 0xF0, 0x92, 0xEB, 0x48, 0x00, 0x7A, 0xF5, 0x11, 0xE4, 0xAF, 0xDF, + 0xD3, 0xE0, 0xDE, 0xE8, 0x37, 0xEE, 0x57, 0xF8, 0x15, 0xFC, 0xC1, 0xF5, + 0x03, 0x02, 0x3B, 0xF5, 0x82, 0xEE, 0xCE, 0xF1, 0x21, 0xF5, 0x39, 0xFC, + 0xBA, 0xEE, 0xA3, 0xF9, 0xE9, 0xE7, 0xDD, 0xF4, 0x44, 0xF6, 0x09, 0xF8, + 0xFB, 0xE5, 0xF0, 0xE7, 0x35, 0xE5, 0x38, 0xE9, 0xD3, 0xF3, 0x9C, 0xEC, + 0x14, 0xF3, 0x93, 0xE6, 0x33, 0xEF, 0xDD, 0xEB, 0xCD, 0xEE, 0xA3, 0xED, + 0x3C, 0xEE, 0xE9, 0xE9, 0x81, 0xF2, 0xB4, 0xE1, 0xE4, 0x00, 0xFA, 0xD9, + 0x76, 0xF8, 0xEB, 0xD8, 0xA2, 0xD9, 0xF6, 0xD6, 0x47, 0xD4, 0xFD, 0xD3, + 0xCB, 0xE7, 0xB9, 0xD1, 0x62, 0xE8, 0x57, 0xD0, 0x43, 0xE2, 0x5B, 0xD4, + 0x21, 0xE4, 0xCC, 0xD7, 0xF4, 0xDD, 0x6D, 0xD1, 0x03, 0xE0, 0xA7, 0xCC, + 0x93, 0xE6, 0xE5, 0xC8, 0x0F, 0xE7, 0xFA, 0xD2, 0x0B, 0xE4, 0xAB, 0xEB, + 0x67, 0xD3, 0x57, 0xEB, 0x44, 0xC8, 0xD0, 0xE1, 0x0D, 0xDA, 0x69, 0xE9, + 0x30, 0xD7, 0xF7, 0xD9, 0x6A, 0xCE, 0xD6, 0xD2, 0x92, 0xDE, 0xBF, 0xD7, + 0x3B, 0xDA, 0xE5, 0xBB, 0x5E, 0xD9, 0x52, 0xC4, 0x6C, 0xD6, 0x21, 0xE2, + 0x1D, 0xC5, 0x72, 0xDE, 0x5D, 0xD4, 0x9F, 0xE4, 0xF2, 0xDF, 0x5A, 0xE1, + 0xAD, 0xD5, 0xC2, 0xCB, 0xB8, 0xD8, 0x36, 0xCB, 0x30, 0xD6, 0x4B, 0xD1, + 0xE3, 0xC5, 0x00, 0xC6, 0xEC, 0xCA, 0x98, 0xBC, 0xCD, 0xDC, 0x07, 0xC7, + 0xFD, 0xD8, 0xD5, 0xC6, 0xF7, 0xE8, 0xF7, 0xD5, 0x43, 0xF6, 0x5D, 0xE1, + 0x05, 0xE9, 0xB2, 0xD3, 0x34, 0xF9, 0x07, 0xE7, 0x7B, 0xF8, 0xAA, 0xF0, + 0xE4, 0xE1, 0xA8, 0xE6, 0xF3, 0xE4, 0x4C, 0xEF, 0x30, 0xEC, 0x9C, 0xF7, + 0xEC, 0xE8, 0x6A, 0xF4, 0x22, 0xF4, 0xD6, 0xFA, 0xAE, 0xFE, 0xCD, 0x05, + 0x13, 0xF1, 0xC5, 0x01, 0x25, 0xF2, 0xF6, 0x08, 0x03, 0xF7, 0xF8, 0x11, + 0xC4, 0xEE, 0x04, 0x10, 0xE1, 0xF6, 0xB2, 0x1A, 0x18, 0xF6, 0x57, 0x11, + 0xDC, 0x04, 0x07, 0x03, 0x9B, 0x18, 0x69, 0x02, 0x17, 0x04, 0x68, 0xF8, + 0x28, 0x08, 0x46, 0x07, 0xB9, 0x0A, 0x3D, 0x10, 0x0C, 0xFE, 0x64, 0x10, + 0x84, 0x11, 0x17, 0x27, 0x7B, 0x19, 0xE8, 0x24, 0x5A, 0x19, 0xB0, 0x1A, + 0xE1, 0x1F, 0xAA, 0x1B, 0x54, 0x17, 0x8E, 0x14, 0xE8, 0x1D, 0x82, 0x14, + 0xB0, 0x26, 0x5D, 0x08, 0x10, 0x26, 0x02, 0x05, 0x91, 0x28, 0x9F, 0x11, + 0xE8, 0x33, 0xAF, 0x19, 0xBB, 0x30, 0xFA, 0x1A, 0x95, 0x1E, 0x5F, 0x19, + 0x15, 0x1C, 0x25, 0x23, 0x0A, 0x12, 0x54, 0x19, 0x19, 0x13, 0x8D, 0x0D, + 0x49, 0x19, 0x70, 0x0C, 0x24, 0x16, 0x15, 0x0A, 0x4E, 0x17, 0xB7, 0x0D, + 0xC0, 0x17, 0x4B, 0x15, 0x88, 0x27, 0xDB, 0x1B, 0xD5, 0x32, 0xAD, 0x10, + 0x0F, 0x2F, 0x96, 0x04, 0xA3, 0x29, 0x5D, 0x08, 0xE1, 0x1E, 0x1C, 0x0E, + 0x8F, 0x23, 0x9A, 0x17, 0x35, 0x28, 0xDF, 0x1F, 0x53, 0x1A, 0xBB, 0x23, + 0x26, 0x0D, 0x5C, 0x1D, 0x4C, 0x09, 0x3D, 0x1A, 0x78, 0x11, 0xF9, 0x24, + 0xDF, 0x16, 0x57, 0x1F, 0x22, 0x15, 0x28, 0x14, 0xAE, 0x20, 0xF7, 0x21, + 0x77, 0x20, 0xCC, 0x2A, 0xD3, 0x1C, 0xF8, 0x2A, 0xB9, 0x23, 0x31, 0x2C, + 0xE3, 0x0C, 0x75, 0x1C, 0xD3, 0xF3, 0xA9, 0x19, 0xF0, 0x00, 0x67, 0x26, + 0xB4, 0x11, 0x73, 0x1E, 0xEF, 0x18, 0xFF, 0x1D, 0x1B, 0x16, 0x18, 0x25, + 0x34, 0x07, 0x6D, 0x23, 0x6E, 0x04, 0x55, 0x29, 0x1B, 0x09, 0x3F, 0x1D, + 0x98, 0x07, 0xD7, 0x06, 0x27, 0xFB, 0x81, 0xFD, 0xF5, 0xFF, 0x68, 0x06, + 0xEE, 0x0E, 0xAC, 0x06, 0x36, 0x11, 0xFC, 0xF4, 0x76, 0x17, 0x18, 0xEF, + 0x4E, 0x0F, 0xA6, 0xE9, 0xCB, 0x05, 0x8A, 0xE8, 0xB9, 0x06, 0x5C, 0xEC, + 0xDE, 0x08, 0xB7, 0xE7, 0x3C, 0x0A, 0x83, 0xDC, 0x15, 0x09, 0x36, 0xDB, + 0xA3, 0xFB, 0xCD, 0xD4, 0x57, 0xEB, 0xE5, 0xCC, 0x83, 0xF6, 0xB3, 0xDE, + 0xF9, 0xFC, 0x5A, 0xE9, 0x70, 0xF3, 0xBB, 0xE7, 0xB6, 0xF4, 0xA7, 0xEC, + 0x7D, 0xEA, 0x4E, 0xE8, 0xC2, 0xEB, 0x76, 0xED, 0x27, 0xEF, 0xAA, 0xFF, + 0x80, 0xCD, 0x03, 0xFE, 0x2B, 0xC5, 0x03, 0xFE, 0x7E, 0xD1, 0xC7, 0x04, + 0x6D, 0xDE, 0x4A, 0x01, 0xFD, 0xEC, 0x8E, 0xF9, 0xB8, 0xDF, 0xA3, 0xF0, + 0x66, 0xDF, 0x35, 0xF9, 0xFD, 0xEA, 0x56, 0x03, 0x49, 0xEA, 0x10, 0x03, + 0x00, 0xEC, 0xA1, 0x0B, 0x21, 0xE8, 0x41, 0x02, 0x51, 0xEC, 0x99, 0xF3, + 0xD5, 0xFA, 0x8F, 0x02, 0xEC, 0x04, 0x3F, 0x06, 0x23, 0x00, 0xC3, 0xF6, + 0xD7, 0xF8, 0x74, 0xFA, 0xD8, 0xFA, 0xE5, 0x02, 0x26, 0xFE, 0xB4, 0x02, + 0x72, 0x05, 0x20, 0x02, 0xA8, 0x0A, 0x3C, 0x06, 0xD0, 0x05, 0x2B, 0x01, + 0x32, 0x05, 0xAD, 0x02, 0xB4, 0x08, 0xA8, 0x13, 0x99, 0xFF, 0x28, 0x02, + 0xCA, 0x02, 0x4C, 0xFA, 0x49, 0x06, 0x2A, 0x0F, 0x19, 0xE7, 0xB1, 0x03, + 0x7B, 0xE7, 0xE2, 0x02, 0x3F, 0x0A, 0xF6, 0x12, 0x40, 0x0A, 0xAD, 0x04, + 0x52, 0x00, 0xDD, 0xF8, 0xD3, 0xF9, 0xC3, 0xF7, 0x44, 0xFE, 0x16, 0xF4, + 0x40, 0x04, 0x26, 0xE7, 0x05, 0x03, 0xF6, 0xE9, 0x93, 0x03, 0xDE, 0xF6, + 0x97, 0x02, 0x9F, 0xF0, 0xC5, 0x04, 0x14, 0xF2, 0x84, 0x04, 0x69, 0xF6, + 0x87, 0x01, 0x9F, 0xED, 0x24, 0xF8, 0xFA, 0xE4, 0x81, 0xF9, 0x85, 0xEE, + 0x98, 0xFE, 0x5F, 0xFC, 0x20, 0xE6, 0x4E, 0xEC, 0x06, 0xE1, 0x0C, 0xE7, + 0xD2, 0xE9, 0x5D, 0xFA, 0xC3, 0xCF, 0xEB, 0xF2, 0x89, 0xD4, 0xD8, 0xF4, + 0xDD, 0xF2, 0x0F, 0xFA, 0x3E, 0xFE, 0x25, 0xED, 0x07, 0xF4, 0x47, 0xE2, + 0x52, 0xEA, 0x25, 0xEA, 0x56, 0xF4, 0xCA, 0xFF, 0x36, 0xEA, 0x5D, 0xF0, + 0x11, 0xEF, 0x52, 0xF4, 0xA4, 0xF2, 0x9B, 0xFE, 0x33, 0xE4, 0xC0, 0xE8, + 0x63, 0xEB, 0x1F, 0xE8, 0x73, 0xE9, 0x0A, 0xE9, 0x94, 0xE3, 0xB0, 0xE0, + 0x7D, 0xE4, 0x1A, 0xD2, 0x5B, 0xF0, 0x33, 0xD5, 0x98, 0xF1, 0x2F, 0xDC, + 0x59, 0xF1, 0x44, 0xD9, 0x85, 0x03, 0x40, 0xEB, 0x6E, 0xFC, 0x1F, 0xF0, + 0xCB, 0xF8, 0xBC, 0xF4, 0x19, 0x02, 0x9C, 0xF9, 0x35, 0xFD, 0xD1, 0xEE, + 0xB1, 0xFE, 0x07, 0xFF, 0xB7, 0xF0, 0xEE, 0x0B, 0xA0, 0xE1, 0x6F, 0x08, + 0x29, 0xFD, 0x21, 0x14, 0xF8, 0x05, 0xAF, 0x0D, 0xEA, 0x08, 0x82, 0x13, + 0xDB, 0x14, 0xE3, 0x25, 0x4A, 0xFA, 0x06, 0x21, 0xFD, 0xF9, 0xF0, 0x31, + 0xEF, 0x07, 0x95, 0x35, 0xDA, 0x04, 0xCF, 0x24, 0x3A, 0x04, 0xF8, 0x1F, + 0xE8, 0x0F, 0x40, 0x23, 0xC1, 0x19, 0x2C, 0x1A, 0xB8, 0x08, 0x65, 0x09, + 0xA8, 0x09, 0x66, 0x17, 0xB4, 0x08, 0xD9, 0x13, 0x04, 0x09, 0x15, 0x0C, + 0xBF, 0x25, 0xD4, 0x28, 0x26, 0x30, 0x9C, 0x3A, 0x3E, 0x2A, 0xD5, 0x34, + 0xFB, 0x23, 0x3D, 0x2E, 0xA6, 0x20, 0x2F, 0x25, 0xEF, 0x2B, 0x45, 0x20, + 0xD6, 0x38, 0x0C, 0x26, 0x0F, 0x38, 0xF8, 0x17, 0xB0, 0x37, 0x16, 0x12, + 0x75, 0x2F, 0x88, 0x1A, 0x1A, 0x21, 0xA9, 0x21, 0xA5, 0x26, 0x2B, 0x32, + 0xA7, 0x25, 0xCF, 0x23, 0x33, 0x1E, 0x13, 0x17, 0x13, 0x14, 0xBE, 0x16, + 0xF5, 0x10, 0x69, 0x12, 0x13, 0x1C, 0x9A, 0x17, 0xFC, 0x1E, 0x62, 0x15, + 0xFF, 0x1D, 0x6B, 0x18, 0xDB, 0x2B, 0x1C, 0x2B, 0xA2, 0x34, 0x13, 0x2B, + 0x90, 0x2B, 0x9B, 0x16, 0x80, 0x30, 0x7C, 0x17, 0x4B, 0x26, 0x2C, 0x19, + 0x2A, 0x19, 0x46, 0x1E, 0xF3, 0x31, 0x8A, 0x38, 0x54, 0x2F, 0xC6, 0x32, + 0x57, 0x20, 0xC1, 0x22, 0x53, 0x23, 0x5C, 0x25, 0x17, 0x19, 0x54, 0x27, + 0x9F, 0x26, 0xB0, 0x3A, 0x80, 0x30, 0x34, 0x36, 0xDF, 0x38, 0x78, 0x23, + 0x08, 0x46, 0xF5, 0x2B, 0xFA, 0x24, 0x26, 0x2B, 0xE2, 0x1C, 0xC6, 0x38, + 0xB7, 0x19, 0x35, 0x3A, 0x91, 0x08, 0x55, 0x28, 0xE5, 0x14, 0x4C, 0x31, + 0x33, 0x17, 0xC6, 0x2F, 0x24, 0x24, 0xCE, 0x30, 0x89, 0x1F, 0x01, 0x2C, + 0x6A, 0x11, 0x72, 0x24, 0x8A, 0x11, 0xC1, 0x30, 0x8A, 0x02, 0xCE, 0x2C, + 0xC2, 0x10, 0x32, 0x2A, 0xBB, 0x23, 0xD2, 0x24, 0x38, 0x21, 0xD9, 0x12, + 0x1F, 0x1D, 0x28, 0x0C, 0x66, 0x15, 0xF7, 0x08, 0x19, 0x19, 0x9D, 0x09, + 0x8B, 0x16, 0x46, 0x02, 0xFE, 0x0E, 0x8A, 0xF6, 0xE8, 0x08, 0xE6, 0xF1, + 0x6C, 0x09, 0x3B, 0xF1, 0x0A, 0x10, 0x14, 0xE9, 0xAD, 0x15, 0xA8, 0xE4, + 0x6E, 0x15, 0x11, 0xE8, 0x51, 0x06, 0x8D, 0xE5, 0x7E, 0xFF, 0xC2, 0xF1, + 0xAE, 0x02, 0xE2, 0xFD, 0x3D, 0x08, 0x22, 0xF7, 0xC1, 0x09, 0x13, 0xF0, + 0x1F, 0xF7, 0x23, 0xF2, 0xA7, 0xE8, 0x07, 0xFD, 0xE9, 0xF0, 0x28, 0x09, + 0xF8, 0xE7, 0x1D, 0x03, 0x33, 0xD8, 0xBF, 0xF9, 0x60, 0xE2, 0xA2, 0x04, + 0x22, 0xE8, 0x65, 0xFE, 0x7D, 0xFD, 0x2F, 0xFD, 0x3B, 0x04, 0x1E, 0x03, + 0x96, 0xEF, 0xFF, 0xFD, 0x0B, 0xEB, 0xB6, 0xFE, 0x9F, 0xE2, 0x49, 0xF7, + 0xAE, 0xE2, 0xA8, 0xFD, 0xC2, 0xDE, 0x1B, 0x00, 0x49, 0xE1, 0x0F, 0xFD, + 0x8E, 0xF1, 0x1A, 0x02, 0x0E, 0xEF, 0x9B, 0xF2, 0x62, 0xF3, 0x79, 0xEF, + 0xED, 0xF7, 0xBD, 0xF4, 0x78, 0xF4, 0xA2, 0xF4, 0x07, 0xF1, 0xCF, 0xFA, + 0xEC, 0xEF, 0xAE, 0xFB, 0x40, 0x04, 0x6E, 0x06, 0xE6, 0x12, 0x20, 0x0E, + 0x3A, 0x0C, 0x9B, 0x04, 0x5F, 0x04, 0xE5, 0xF9, 0x95, 0xFE, 0xF9, 0xF6, + 0x4D, 0xF7, 0xAA, 0xF8, 0x34, 0xEB, 0xA4, 0xF8, 0x3A, 0xE7, 0x9A, 0x07, + 0xA3, 0xE2, 0xFB, 0x07, 0xB4, 0xE7, 0x55, 0x01, 0xBC, 0xF9, 0xCA, 0x00, + 0x85, 0xF9, 0xD3, 0xEC, 0x5F, 0xF8, 0x41, 0xE7, 0x20, 0xFD, 0x43, 0xE9, + 0x22, 0xFD, 0x59, 0xE9, 0xF5, 0xFF, 0x7B, 0xF3, 0x0C, 0xFE, 0xA4, 0xF5, + 0x26, 0xF2, 0x3E, 0xE8, 0x30, 0xF3, 0x19, 0xE3, 0x6A, 0xEE, 0xAA, 0xDF, + 0x05, 0xEA, 0x71, 0xDC, 0xBE, 0xF4, 0xE4, 0xE6, 0x7B, 0xF0, 0x01, 0xDC, + 0x02, 0xEF, 0xDB, 0xD1, 0x54, 0xDF, 0x99, 0xD4, 0xF4, 0xDB, 0x99, 0xE1, + 0x0A, 0xEC, 0x8D, 0xF1, 0x92, 0xDC, 0xB3, 0xE1, 0x3E, 0xE0, 0x4D, 0xE4, + 0x74, 0xDE, 0xEC, 0xDE, 0xB9, 0xD2, 0x9D, 0xC4, 0xBF, 0xE1, 0x09, 0xD3, + 0xE8, 0xD7, 0x16, 0xDE, 0x9A, 0xD8, 0xBA, 0xE5, 0x2D, 0xFC, 0x8D, 0x00, + 0x99, 0x16, 0x45, 0x17, 0x15, 0x1A, 0xFE, 0x1F, 0x9E, 0x13, 0x83, 0x1D, + 0xCD, 0x12, 0x8B, 0x24, 0xB8, 0x0C, 0x34, 0x25, 0x1C, 0x06, 0x82, 0x12, + 0xA7, 0x12, 0x08, 0x0B, 0x93, 0x27, 0x33, 0x0F, 0x21, 0x03, 0x24, 0xE4, + 0x42, 0xF2, 0x75, 0xD8, 0x6D, 0x34, 0xDC, 0x1E, 0xB0, 0x38, 0xC0, 0x27, + 0x95, 0x14, 0xAB, 0x0A, 0xB1, 0xFE, 0x8D, 0xFD, 0x50, 0xCE, 0x88, 0xDA, + 0xB0, 0xAE, 0xB5, 0xBF, 0xB4, 0xA5, 0x38, 0xAA, 0xEC, 0xA7, 0x4E, 0x9F, + 0x00, 0xAD, 0x0A, 0xA4, 0x54, 0xAB, 0xE6, 0xA2, 0x5B, 0xB5, 0x21, 0xAA, + 0x15, 0xB4, 0x60, 0xAC, 0xE7, 0xA5, 0x41, 0xAB, 0x3A, 0xA9, 0xA5, 0xBE, + 0xEF, 0xAD, 0x0D, 0xC2, 0x25, 0xA4, 0x1B, 0xA7, 0x0E, 0xB7, 0x1F, 0xB1, + 0x01, 0xCF, 0x67, 0xCB, 0x1D, 0xB9, 0xF9, 0xB9, 0x75, 0xB8, 0xA1, 0xBB, + 0x71, 0xC4, 0xC8, 0xC5, 0xED, 0xB5, 0xC1, 0xB6, 0xA9, 0xC4, 0x6C, 0xC7, + 0x17, 0xF1, 0x1C, 0xF1, 0x82, 0x01, 0xBA, 0x01, 0xFC, 0x04, 0x04, 0x09, + 0x7D, 0x30, 0x7F, 0x33, 0x53, 0x39, 0x5B, 0x3A, 0xAA, 0x21, 0x7B, 0x20, + 0x99, 0x30, 0x51, 0x2A, 0x78, 0x3C, 0x90, 0x2C, 0x3B, 0x46, 0x08, 0x31, + 0x23, 0x4F, 0x0D, 0x42, 0x85, 0x52, 0xAF, 0x54, 0xE2, 0x55, 0x92, 0x58, + 0x39, 0x4E, 0xAA, 0x43, 0xC4, 0x52, 0x4A, 0x4B, 0x43, 0x4A, 0xFA, 0x48, + 0x51, 0x39, 0x25, 0x36, 0x5D, 0x41, 0x6E, 0x39, 0x31, 0x51, 0xD6, 0x3B, + 0x5A, 0x4B, 0x4F, 0x2F, 0xF1, 0x37, 0xE2, 0x23, 0x15, 0x2E, 0x4F, 0x2A, + 0xD5, 0x22, 0xC7, 0x1F, 0xB8, 0x13, 0x0C, 0x05, 0xCE, 0x1A, 0x4E, 0x0A, + 0xFE, 0x26, 0x87, 0x14, 0x16, 0x15, 0x2E, 0xFC, 0xB9, 0x00, 0xBE, 0xE6, + 0x31, 0xF0, 0xF6, 0xEF, 0x55, 0xEB, 0x84, 0x02, 0x99, 0xFA, 0x85, 0x0E, + 0x1D, 0xFF, 0xF1, 0x0B, 0x43, 0xF3, 0x07, 0xEA, 0x91, 0x01, 0x2B, 0xE2, + 0x83, 0x1C, 0x01, 0x00, 0x86, 0x0C, 0xEE, 0x0D, 0x84, 0x05, 0xC7, 0x26, + 0x77, 0x20, 0xFC, 0x43, 0x7C, 0x3F, 0x48, 0x54, 0x6B, 0x55, 0x7F, 0x55, + 0x33, 0x57, 0xC8, 0x4F, 0x69, 0x52, 0xD6, 0x50, 0x7F, 0x3B, 0x4E, 0x43, + 0x18, 0x3C, 0x5B, 0x49, 0x62, 0x5A, 0x54, 0x60, 0x82, 0x4C, 0x16, 0x5B, + 0xE9, 0x4A, 0xB4, 0x5E, 0xF9, 0x52, 0xD0, 0x5A, 0x37, 0x42, 0x63, 0x42, + 0x03, 0x3D, 0xFF, 0x35, 0x6D, 0x2B, 0x6C, 0x21, 0x60, 0x12, 0x9A, 0x08, + 0x78, 0x05, 0x25, 0xFC, 0x8A, 0x08, 0xF7, 0xF2, 0x86, 0x00, 0x31, 0xDE, + 0x3A, 0xFB, 0x32, 0xD8, 0x7E, 0xEB, 0x81, 0xC3, 0x85, 0xCF, 0x60, 0xA6, + 0x4C, 0xCF, 0xDE, 0xAA, 0xA6, 0xC0, 0x27, 0xA6, 0x5C, 0xB9, 0x84, 0xA5, + 0x7B, 0xBA, 0xAA, 0xA4, 0x61, 0xAF, 0x4A, 0x9D, 0xB2, 0xC9, 0xEE, 0xB7, + 0x07, 0xCF, 0xB6, 0xBA, 0x54, 0xB4, 0xE8, 0xA8, 0xCD, 0xAE, 0x93, 0xB1, + 0xF4, 0xA5, 0xA4, 0xB1, 0xFD, 0xA6, 0xCB, 0xB4, 0x18, 0xAB, 0x69, 0xBD, + 0x50, 0xAE, 0x0B, 0xC6, 0x54, 0xBF, 0x4F, 0xD1, 0x40, 0xD6, 0x93, 0xD8, + 0x45, 0xDD, 0x37, 0xD7, 0xE9, 0xCE, 0x35, 0xD5, 0xA0, 0xCA, 0xD3, 0xDD, + 0x58, 0xCE, 0x88, 0xE6, 0xBC, 0xCC, 0x5C, 0xE5, 0x7A, 0xD6, 0x37, 0xE2, + 0x04, 0xFA, 0x25, 0xFB, 0x04, 0x01, 0x8A, 0x00, 0xEB, 0xE3, 0x46, 0xE5, + 0x68, 0xD7, 0x7C, 0xDA, 0x69, 0xDD, 0x48, 0xDB, 0xF2, 0xF0, 0x16, 0xED, + 0x6E, 0xEE, 0x40, 0xF3, 0x69, 0xEE, 0xCC, 0xF8, 0xCE, 0xFD, 0x8B, 0xFE, + 0xA9, 0xFA, 0x97, 0xF0, 0xC4, 0xFB, 0xEE, 0xEE, 0x81, 0xEB, 0xE9, 0xE1, + 0x65, 0xD0, 0x39, 0xDA, 0xC1, 0xD4, 0x5B, 0xF1, 0xBB, 0xE6, 0xDD, 0x02, + 0xF0, 0xF6, 0x0C, 0x0C, 0x67, 0x13, 0x41, 0x20, 0x84, 0x27, 0x53, 0x2B, + 0x73, 0x2F, 0x85, 0x27, 0xEC, 0x33, 0x0D, 0x23, 0xB5, 0x35, 0x40, 0x26, + 0xAD, 0x32, 0xF1, 0x28, 0x00, 0x1B, 0x54, 0x17, 0x4E, 0x20, 0x41, 0x1C, + 0x6C, 0x3C, 0x35, 0x37, 0xC5, 0x3C, 0x09, 0x3C, 0x94, 0x3B, 0xDB, 0x41, + 0xDC, 0x49, 0xA6, 0x4B, 0x51, 0x51, 0x5F, 0x43, 0x19, 0x52, 0xE1, 0x3E, + 0x5E, 0x56, 0x92, 0x46, 0x32, 0x50, 0x50, 0x4C, 0xD6, 0x2B, 0x85, 0x3A, + 0x98, 0x1D, 0x76, 0x30, 0x94, 0x2F, 0x9B, 0x32, 0x34, 0x25, 0xEC, 0x19, + 0x36, 0x18, 0x8A, 0x0D, 0x27, 0x16, 0xE7, 0x10, 0x2C, 0x16, 0xBD, 0x10, + 0xF7, 0x1E, 0x3A, 0x18, 0x14, 0x22, 0xD8, 0x1E, 0x1C, 0x1F, 0xCF, 0x1A, + 0x2C, 0x26, 0x9A, 0x1D, 0x00, 0x23, 0xB4, 0x1D, 0x82, 0x14, 0x3D, 0x17, + 0x83, 0x07, 0xC5, 0x0E, 0xFF, 0xEA, 0xF1, 0xF4, 0x8E, 0xEC, 0x9C, 0xF3, + 0xA4, 0xF3, 0xD6, 0xEE, 0x3B, 0xF4, 0xB6, 0xE4, 0xA2, 0x05, 0x56, 0xE9, + 0xE1, 0xF0, 0x94, 0xCF, 0x3F, 0xF4, 0x8A, 0xDD, 0x87, 0xFB, 0x55, 0xF0, + 0x1A, 0xE9, 0xEE, 0xE2, 0x16, 0xEC, 0x0A, 0xE9, 0x57, 0xE5, 0x18, 0xE6, + 0x1E, 0xE6, 0x3B, 0xE2, 0xD6, 0xF0, 0x9E, 0xDE, 0x76, 0xFD, 0x32, 0xDC, + 0x36, 0x01, 0x99, 0xE0, 0xA3, 0xF0, 0x3C, 0xE1, 0xF5, 0xE5, 0xDB, 0xE9, + 0xD3, 0xE8, 0x23, 0xFD, 0x3A, 0xF2, 0xC4, 0x0D, 0x2E, 0xEE, 0x18, 0x0D, + 0x3A, 0xEC, 0xBC, 0x14, 0x3C, 0xE7, 0xDB, 0x0B, 0x71, 0xDC, 0x4C, 0xE9, + 0x10, 0xE7, 0xD9, 0xE5, 0xE3, 0xE5, 0xC5, 0xEB, 0x5B, 0xD0, 0xA0, 0xDF, + 0x2B, 0xC6, 0x84, 0xD9, 0xDD, 0xC6, 0xB2, 0xDA, 0x27, 0xC9, 0x22, 0xD1, + 0x94, 0xC6, 0x1F, 0xC6, 0xDD, 0xD6, 0x69, 0xDB, 0xD8, 0xDC, 0x95, 0xE6, + 0x46, 0xCC, 0x45, 0xD0, 0x26, 0xD6, 0x16, 0xD3, 0xB7, 0xDB, 0x54, 0xDB, + 0xB5, 0xCD, 0x5C, 0xCF, 0xF4, 0xD1, 0x7F, 0xD7, 0xBD, 0xE7, 0x74, 0xE8, + 0x05, 0x07, 0xFE, 0xF7, 0x00, 0x25, 0x9A, 0x0F, 0x68, 0x1C, 0x49, 0x12, + 0xC8, 0x20, 0x22, 0x26, 0xB7, 0x33, 0x4A, 0x3D, 0xD5, 0x31, 0xC0, 0x41, + 0x3D, 0x41, 0xEB, 0x53, 0x1E, 0x45, 0xEF, 0x57, 0x74, 0x36, 0x95, 0x43, + 0x5F, 0x41, 0x85, 0x42, 0xB5, 0x46, 0xDA, 0x4E, 0x61, 0x34, 0x25, 0x4E, + 0x75, 0x3A, 0xAB, 0x5B, 0x24, 0x52, 0xCA, 0x61, 0xD5, 0x5D, 0xC5, 0x4F, + 0x08, 0x5A, 0xAA, 0x35, 0x14, 0x50, 0xF1, 0x2D, 0x03, 0x3C, 0xE5, 0x35, + 0xFD, 0x1F, 0x38, 0x31, 0xD9, 0x19, 0x69, 0x38, 0x1F, 0x19, 0x22, 0x31, + 0x70, 0x17, 0xA4, 0x16, 0x41, 0x1C, 0x51, 0x11, 0x07, 0x12, 0x02, 0x09, + 0xB1, 0x09, 0x74, 0xFC, 0x0B, 0x15, 0xC2, 0x03, 0xB8, 0x17, 0xA8, 0x15, + 0x6A, 0x12, 0x02, 0x20, 0xB8, 0x19, 0x2A, 0x25, 0x9C, 0x23, 0xC6, 0x30, + 0x8B, 0x18, 0x52, 0x28, 0x04, 0x0F, 0x9F, 0x26, 0xF9, 0x0E, 0x31, 0x2E, + 0x13, 0x0C, 0x33, 0x23, 0x6E, 0x10, 0xDB, 0x1E, 0x7F, 0x1A, 0xD4, 0x2C, + 0x3D, 0x17, 0x69, 0x33, 0xFF, 0x18, 0xB3, 0x2E, 0x56, 0x23, 0x34, 0x38, + 0x53, 0x1B, 0xFA, 0x30, 0x52, 0x17, 0x8A, 0x1B, 0x28, 0x0E, 0x37, 0x08, + 0xE6, 0x0A, 0x68, 0xFF, 0x60, 0x10, 0xEC, 0xFB, 0x0E, 0x0B, 0x8F, 0xEB, + 0x53, 0x12, 0x35, 0xED, 0x91, 0x1A, 0xBD, 0xEB, 0x05, 0x1E, 0x22, 0xE5, + 0x5B, 0x1D, 0x8D, 0xEA, 0x41, 0x11, 0x8F, 0xE2, 0xCC, 0xFC, 0x0C, 0xD2, + 0x32, 0xE9, 0x0F, 0xC3, 0xE0, 0xEE, 0xBE, 0xCD, 0x3E, 0xEC, 0x66, 0xD4, + 0x69, 0xDE, 0xD7, 0xC3, 0x18, 0xF1, 0x5C, 0xCC, 0xC5, 0xE1, 0xC5, 0xC7, + 0xA9, 0xC9, 0x95, 0xD1, 0x0C, 0xCE, 0x82, 0xE8, 0x67, 0xC0, 0xBB, 0xD3, + 0xAF, 0xCA, 0xBB, 0xD4, 0xC3, 0xD7, 0xC8, 0xD8, 0x3C, 0xC9, 0x2B, 0xCC, + 0x9E, 0xB9, 0x82, 0xCA, 0xA2, 0xAD, 0xDC, 0xC5, 0xEC, 0xAF, 0x38, 0xCB, + 0x50, 0xBB, 0x86, 0xD6, 0x99, 0xC0, 0xE2, 0xD5, 0xC3, 0xC8, 0xAF, 0xD8, + 0xC2, 0xDF, 0x00, 0xF5, 0x33, 0xFD, 0xEC, 0x0C, 0x85, 0x04, 0x8A, 0x08, + 0x9E, 0xFC, 0xC1, 0x0F, 0xE9, 0x01, 0x4F, 0x21, 0x16, 0x10, 0x53, 0x22, + 0x0F, 0x1D, 0x31, 0x20, 0x1F, 0x26, 0xA6, 0x28, 0xA0, 0x2A, 0x52, 0x2A, + 0xE3, 0x24, 0xBB, 0x1B, 0x2B, 0x29, 0x7F, 0x1A, 0xC2, 0x2E, 0x76, 0x1C, + 0x98, 0x1F, 0x4F, 0x1A, 0x0B, 0x05, 0xEC, 0x13, 0x34, 0x02, 0x36, 0x13, + 0x70, 0x12, 0x5C, 0x17, 0xEB, 0xFA, 0x86, 0xF9, 0x50, 0xE4, 0xFB, 0xE5, + 0xEE, 0xE5, 0x66, 0xEF, 0x64, 0xDD, 0x00, 0xEC, 0x20, 0xE3, 0x3C, 0xE7, + 0x7B, 0xF3, 0x76, 0xE7, 0xCD, 0xF3, 0x9C, 0xE3, 0xC4, 0xE8, 0xE3, 0xE0, + 0x54, 0xF7, 0x1D, 0xF7, 0x74, 0x0A, 0x3C, 0x0A, 0x12, 0x08, 0x3F, 0x00, + 0xAC, 0x0D, 0x4A, 0x03, 0x52, 0x14, 0xB0, 0x0F, 0x27, 0x0D, 0x8A, 0x0B, + 0x0F, 0x06, 0x2A, 0x03, 0x19, 0x11, 0x6D, 0x0C, 0x67, 0x19, 0xD1, 0x18, + 0x36, 0x07, 0x7C, 0x0F, 0x86, 0x03, 0xF2, 0x10, 0x04, 0x1B, 0x7F, 0x20, + 0x6C, 0x1E, 0x88, 0x21, 0xBD, 0x0D, 0x3E, 0x20, 0xF2, 0x14, 0x47, 0x2D, + 0xAA, 0x22, 0x7B, 0x2B, 0xBC, 0x16, 0xFA, 0x13, 0x24, 0x13, 0x6D, 0x18, + 0xE7, 0x0C, 0x68, 0x21, 0x09, 0xFE, 0x5B, 0x1C, 0x3F, 0xFE, 0x59, 0x1A, + 0xB3, 0xFB, 0xCF, 0x0D, 0x7C, 0xFC, 0x45, 0x0B, 0x00, 0xF6, 0xD1, 0x01, + 0x47, 0xF5, 0xEA, 0xEE, 0xFF, 0x02, 0x40, 0xED, 0x5E, 0xF4, 0x83, 0xDB, + 0x84, 0xF4, 0xAD, 0xD9, 0xA2, 0xFE, 0xDD, 0xE1, 0xAD, 0xEE, 0x78, 0xD8, + 0x85, 0xE0, 0x0C, 0xD5, 0xE3, 0xD4, 0x17, 0xC7, 0x12, 0xCC, 0x53, 0xBA, + 0x0E, 0xC7, 0x3F, 0xB4, 0xD4, 0xC1, 0x69, 0xAE, 0x5F, 0xB8, 0x5F, 0xA7, + 0xD5, 0xAF, 0xBE, 0x9C, 0x02, 0xB3, 0x17, 0xA1, 0xD6, 0xB8, 0x79, 0xB4, + 0x3A, 0xB1, 0x8F, 0xC6, 0x9E, 0xAE, 0x3D, 0xD7, 0xC3, 0xB9, 0x95, 0xEB, + 0x95, 0xC4, 0x57, 0xF9, 0x25, 0xCD, 0xC2, 0xF6, 0x28, 0xCD, 0x29, 0xE3, + 0x59, 0xDC, 0xF2, 0xE0, 0x1A, 0xFB, 0x13, 0xFD, 0xFF, 0x0F, 0x2F, 0x10, + 0xB8, 0x1C, 0x7B, 0x1A, 0xA2, 0x1F, 0x67, 0x25, 0x47, 0x14, 0x56, 0x23, + 0x35, 0x19, 0x23, 0x28, 0x4D, 0x31, 0x49, 0x33, 0xAF, 0x2D, 0xF3, 0x28, + 0x15, 0x1D, 0xC3, 0x1B, 0xCF, 0x19, 0x62, 0x18, 0x6F, 0x14, 0xB9, 0x11, + 0xA3, 0x1C, 0xC5, 0x13, 0x70, 0x21, 0x7C, 0x12, 0x0E, 0x12, 0xAD, 0x02, + 0xE6, 0x0C, 0x3A, 0xFA, 0xD1, 0x01, 0x6B, 0xE7, 0x2C, 0xE9, 0xDA, 0xC9, + 0x8A, 0xD8, 0xDF, 0xC6, 0xE2, 0xCE, 0x59, 0xCF, 0x9D, 0xD9, 0x1A, 0xDC, + 0xF9, 0xEF, 0x0B, 0xE1, 0x77, 0xFA, 0xB2, 0xD6, 0x2A, 0xFB, 0xA6, 0xDA, + 0x7D, 0xEA, 0x85, 0xDF, 0xA5, 0xE3, 0xEA, 0xE8, 0xC6, 0xF9, 0xFE, 0xF5, + 0x80, 0x17, 0x06, 0x01, 0xC1, 0x2D, 0xA5, 0x0A, 0xA6, 0x2E, 0x48, 0x07, + 0x09, 0x29, 0x94, 0x0E, 0xF2, 0x28, 0x74, 0x21, 0x97, 0x1D, 0x6E, 0x24, + 0xA5, 0x18, 0xD1, 0x1F, 0x9B, 0x1D, 0x82, 0x25, 0xA1, 0x1A, 0x64, 0x22, + 0x0D, 0x2E, 0xEE, 0x22, 0xFB, 0x45, 0x47, 0x2D, 0xDE, 0x3A, 0xF1, 0x2D, + 0x28, 0x30, 0x41, 0x38, 0x86, 0x2C, 0xC3, 0x34, 0x2D, 0x26, 0x77, 0x1B, + 0x6D, 0x2D, 0xB7, 0x1C, 0x9E, 0x2A, 0x5E, 0x28, 0xFA, 0x14, 0xAF, 0x26, + 0xA2, 0x12, 0x7E, 0x28, 0x18, 0x21, 0xAE, 0x31, 0x8A, 0x1C, 0xED, 0x2F, + 0x39, 0x0E, 0x24, 0x25, 0x42, 0x0E, 0x02, 0x24, 0xE7, 0x05, 0xB1, 0x21, + 0x19, 0xF5, 0x40, 0x1C, 0xD7, 0xF6, 0xB1, 0x22, 0xF8, 0xFD, 0xC4, 0x29, + 0x60, 0xFC, 0xE7, 0x20, 0xDF, 0x06, 0xD3, 0x19, 0xD8, 0x0F, 0xFC, 0x16, + 0xB0, 0xF8, 0xCB, 0xFA, 0xCB, 0xDF, 0xC2, 0xE0, 0xCB, 0xD8, 0x71, 0xD8, + 0x04, 0xEB, 0xBB, 0xDE, 0xA7, 0x02, 0x10, 0xE9, 0x0E, 0xFD, 0x9E, 0xE0, + 0x11, 0xED, 0x9E, 0xD9, 0x7D, 0xEC, 0x38, 0xDC, 0xB8, 0xE9, 0x44, 0xDA, + 0x0C, 0xEC, 0x63, 0xDB, 0xCC, 0xFD, 0x57, 0xDE, 0xC3, 0xFB, 0x63, 0xD8, + 0x04, 0xE2, 0xC6, 0xCE, 0x16, 0xDA, 0x0D, 0xD7, 0xAB, 0xE0, 0x9F, 0xEF, + 0x31, 0xD9, 0x54, 0xFD, 0xCD, 0xDF, 0x0D, 0x07, 0x6C, 0xED, 0xBF, 0x06, + 0x30, 0xF3, 0x9A, 0xFE, 0x30, 0xFC, 0x4C, 0xFE, 0x3B, 0x04, 0x32, 0x09, + 0x83, 0x0D, 0x3C, 0x17, 0x4D, 0x06, 0x8B, 0x08, 0x89, 0xF4, 0x30, 0xF2, + 0xA9, 0xF3, 0x1E, 0xF9, 0xC3, 0xF9, 0x7F, 0xF8, 0x9D, 0xF7, 0xDA, 0xE1, + 0x62, 0xF9, 0x6F, 0xE3, 0x05, 0xFE, 0x2A, 0xF6, 0x39, 0xF9, 0x9B, 0xF9, + 0xF7, 0xEE, 0xD6, 0xF8, 0x3F, 0xE3, 0xF8, 0xF1, 0x7D, 0xE3, 0xA5, 0xEE, + 0x0E, 0xF3, 0xAC, 0xF9, 0xD9, 0xF5, 0x2A, 0xED, 0xBB, 0xF0, 0x86, 0xD8, + 0x87, 0xDD, 0x60, 0xCA, 0xD8, 0xC9, 0xA2, 0xC1, 0x66, 0xD9, 0x02, 0xD6, + 0xF2, 0xE4, 0x6F, 0xED, 0x90, 0xDC, 0xC9, 0xEA, 0x85, 0xDF, 0xDD, 0xE4, + 0xD5, 0xE7, 0x5C, 0xEA, 0x24, 0xE9, 0xDF, 0xE9, 0x48, 0xF8, 0xA4, 0xEE, + 0xBE, 0x06, 0x24, 0x00, 0x09, 0x05, 0x3E, 0x04, 0x06, 0x07, 0x9C, 0xFB, + 0x30, 0x08, 0x66, 0xF9, 0x7F, 0x07, 0x1D, 0xFD, 0x17, 0x17, 0xDD, 0xFF, + 0x57, 0x24, 0x91, 0x03, 0x3E, 0x1E, 0xE2, 0x08, 0x78, 0x19, 0x86, 0x06, + 0x79, 0x1F, 0xAF, 0x05, 0xB6, 0x23, 0xCA, 0x10, 0xD9, 0x14, 0x19, 0x08, + 0x25, 0x05, 0x0F, 0xFA, 0x54, 0x10, 0xD1, 0x0C, 0x0C, 0x16, 0x8C, 0x09, + 0x76, 0x00, 0xD0, 0xE6, 0x53, 0xF5, 0xA3, 0xE7, 0x1B, 0xFE, 0x34, 0x01, + 0x49, 0xFA, 0x20, 0xFD, 0x62, 0xFA, 0x37, 0xFA, 0xAB, 0x00, 0x1E, 0x01, + 0x67, 0xF6, 0xB2, 0xF8, 0x9D, 0xF1, 0x80, 0xF2, 0xB9, 0xF8, 0xA4, 0xF2, + 0x22, 0x03, 0x1B, 0xF9, 0x4E, 0xFC, 0xAF, 0x00, 0xD2, 0xE2, 0x39, 0x00, + 0xF3, 0xE3, 0x15, 0x05, 0x4A, 0xF2, 0x27, 0x09, 0xFA, 0xE4, 0xEF, 0xF5, + 0x13, 0xDD, 0x7E, 0xE8, 0xB5, 0xE1, 0x97, 0xF0, 0xB0, 0xDF, 0x05, 0xF7, + 0xE7, 0xE6, 0x44, 0xF7, 0xCD, 0xFD, 0xD6, 0x04, 0x8A, 0x08, 0x33, 0x0D, + 0xA6, 0xEA, 0x4C, 0xEE, 0x01, 0xCA, 0xC2, 0xCA, 0x16, 0xD2, 0x77, 0xCB, + 0xF8, 0xE3, 0x0F, 0xD6, 0x1D, 0xE1, 0x12, 0xCC, 0x28, 0xE6, 0xD5, 0xD0, + 0x16, 0xF1, 0x0D, 0xE4, 0x9C, 0xED, 0xA9, 0xDE, 0xCB, 0xF7, 0x1F, 0xE9, + 0x76, 0x00, 0x68, 0x08, 0xDD, 0xE6, 0xD9, 0x04, 0xD1, 0xD2, 0x2E, 0xF9, + 0x29, 0xE0, 0xCA, 0xFF, 0xAC, 0xEA, 0x30, 0x02, 0xB2, 0xEB, 0x93, 0x07, + 0x03, 0xEF, 0x6E, 0x0D, 0xA6, 0xED, 0xEF, 0x07, 0x06, 0xE6, 0xDA, 0x02, + 0xFA, 0xE2, 0xE9, 0x01, 0xBD, 0xED, 0x1A, 0x08, 0x31, 0xF9, 0x98, 0x0E, + 0x67, 0xF7, 0x48, 0x0D, 0x22, 0x02, 0x0F, 0x15, 0xC7, 0x19, 0x17, 0x1E, + 0xA8, 0x18, 0xBB, 0x1B, 0x28, 0x12, 0x02, 0x21, 0x7E, 0x13, 0x5B, 0x1E, + 0x6E, 0x0F, 0x7A, 0x06, 0x83, 0x13, 0xB3, 0xFA, 0x2E, 0x15, 0xB7, 0xF9, + 0x03, 0x0A, 0x36, 0xF7, 0x6B, 0x0A, 0x92, 0xFF, 0x4A, 0x16, 0xDB, 0x0E, + 0x86, 0x15, 0x07, 0x08, 0x30, 0x16, 0xC8, 0xF8, 0x04, 0x22, 0x04, 0xFD, + 0x9C, 0x26, 0x14, 0x02, 0x45, 0x23, 0x11, 0x02, 0xBB, 0x19, 0xAC, 0x06, + 0x9A, 0x05, 0xFF, 0x00, 0x8A, 0xFE, 0xFC, 0x00, 0x85, 0x0F, 0x4C, 0x0E, + 0xE2, 0x21, 0x7D, 0x0F, 0x4C, 0x36, 0x77, 0x0F, 0x21, 0x43, 0x57, 0x12, + 0x8C, 0x34, 0x6A, 0x12, 0x1F, 0x1E, 0x6F, 0x15, 0x2A, 0x15, 0xD3, 0x17, + 0xB6, 0x1C, 0x84, 0x1E, 0x56, 0x28, 0xFD, 0x20, 0x26, 0x23, 0x6B, 0x10, + 0xE6, 0x19, 0x05, 0x0A, 0x4E, 0x22, 0xCC, 0x1D, 0x2F, 0x31, 0x5E, 0x2A, + 0x27, 0x35, 0x94, 0x27, 0x1C, 0x2D, 0x4D, 0x29, 0xEC, 0x21, 0xE3, 0x28, + 0xF5, 0x1F, 0x13, 0x23, 0x92, 0x20, 0xD4, 0x24, 0xB3, 0x10, 0xE7, 0x21, + 0x7B, 0x06, 0xF6, 0x1C, 0x70, 0x0E, 0x65, 0x13, 0xD8, 0x07, 0xD9, 0xFF, + 0x2F, 0x03, 0x49, 0x03, 0x5C, 0x0D, 0x57, 0x24, 0x51, 0x05, 0x57, 0x35, + 0x3A, 0xFC, 0x14, 0x2F, 0xF1, 0x05, 0x08, 0x29, 0x0F, 0x0E, 0x59, 0x1F, + 0xA0, 0x0E, 0x9F, 0x17, 0x0C, 0x0C, 0x9A, 0x19, 0xDB, 0x0A, 0x86, 0x27, + 0x25, 0x05, 0xFC, 0x1C, 0xA9, 0x12, 0x2C, 0x0C, 0x5C, 0x37, 0xB1, 0x24, + 0x64, 0x36, 0xB6, 0x27, 0xDC, 0x30, 0x4D, 0x1D, 0xC1, 0x42, 0x90, 0x2B, + 0x4D, 0x41, 0xF2, 0x2B, 0xD8, 0x35, 0x3B, 0x20, 0x09, 0x28, 0x9F, 0x10, + 0xCB, 0x1B, 0x60, 0x03, 0xD3, 0x25, 0xD1, 0xFF, 0x24, 0x2B, 0xEC, 0xFE, + 0xFF, 0x1B, 0x62, 0x08, 0xA3, 0x08, 0xE7, 0x09, 0xA0, 0xED, 0x5D, 0xF8, + 0x53, 0xD4, 0xA7, 0xEC, 0x45, 0xCD, 0x13, 0xF0, 0x92, 0xCF, 0xB8, 0xF3, + 0x55, 0xC9, 0x0E, 0xE4, 0xB9, 0xD5, 0xDD, 0xE5, 0x0C, 0xE4, 0xC5, 0xFD, + 0xF5, 0xCD, 0x12, 0xF9, 0xFA, 0xC1, 0xBB, 0xF1, 0x02, 0xC8, 0xBA, 0xEF, + 0xF6, 0xC2, 0x16, 0xDD, 0x04, 0xC8, 0x80, 0xD7, 0xEC, 0xD3, 0x25, 0xDC, + 0x5E, 0xCD, 0xA3, 0xD4, 0x63, 0xC4, 0x96, 0xD7, 0x12, 0xC2, 0x78, 0xDB, + 0x14, 0xC6, 0x2D, 0xDD, 0xE6, 0xD4, 0xDE, 0xE9, 0x7B, 0xDF, 0xA1, 0xE9, + 0x89, 0xE2, 0x8E, 0xE3, 0xE3, 0xE7, 0xE4, 0xDD, 0x07, 0xF2, 0x14, 0xD5, + 0xE6, 0xEA, 0x85, 0xC8, 0xC3, 0xD6, 0x9A, 0xC6, 0x6B, 0xD4, 0x67, 0xD7, + 0x4B, 0xE1, 0x43, 0xE9, 0x19, 0x09, 0x66, 0x0B, 0x1B, 0x30, 0x28, 0x25, + 0xD9, 0x36, 0xA8, 0x20, 0x24, 0x27, 0xF2, 0x14, 0x9D, 0x1C, 0x8E, 0x18, + 0x3E, 0x24, 0x68, 0x2B, 0x60, 0x22, 0xE8, 0x2C, 0xAD, 0x21, 0xFD, 0x23, + 0x4A, 0x2C, 0x39, 0x24, 0x15, 0x27, 0x71, 0x24, 0x24, 0x1D, 0xD5, 0x1D, + 0x32, 0x2B, 0x2A, 0x20, 0xB2, 0x29, 0x05, 0x16, 0x46, 0x1B, 0x0E, 0xFB, + 0x84, 0x13, 0xD5, 0xF9, 0x70, 0x1A, 0x95, 0x0E, 0xED, 0x2B, 0x84, 0x10, + 0x3A, 0x1C, 0x47, 0xF9, 0x7C, 0x03, 0x1E, 0xEC, 0x17, 0x01, 0xE4, 0xED, + 0x7C, 0x02, 0xB3, 0xE6, 0x3A, 0xF7, 0xAA, 0xDD, 0x57, 0xEA, 0xAD, 0xE2, + 0x3C, 0xD7, 0x18, 0xE4, 0xF1, 0xCB, 0xA3, 0xE1, 0x41, 0xE4, 0x6B, 0xE4, + 0xA3, 0xF7, 0x7F, 0xE2, 0x79, 0xEA, 0xA7, 0xD9, 0xDF, 0xE6, 0xEF, 0xE2, + 0x33, 0xF2, 0x9A, 0xF5, 0x02, 0xF3, 0x0F, 0xFE, 0x2D, 0xEB, 0xCF, 0xFD, + 0x55, 0xEA, 0x5F, 0xFB, 0xDE, 0xF4, 0xD5, 0x07, 0xE6, 0x00, 0x1F, 0x0A, + 0x76, 0x0F, 0xEC, 0x03, 0x56, 0x1C, 0xEB, 0x0C, 0xB2, 0x14, 0x00, 0x06, + 0x8B, 0xFC, 0xA6, 0xED, 0x8F, 0xFC, 0xF5, 0xF4, 0x06, 0x18, 0x20, 0x13, + 0xEC, 0x18, 0xA1, 0x0F, 0x96, 0xFD, 0x37, 0xF6, 0xEA, 0xEB, 0x7D, 0xF5, + 0xC5, 0xEB, 0x88, 0xFB, 0x79, 0xF5, 0xB1, 0xF1, 0xAF, 0xF7, 0xA3, 0xE1, + 0x55, 0xFA, 0x7F, 0xDF, 0x9A, 0xF3, 0x82, 0xEB, 0xE9, 0xE1, 0xA2, 0xEF, + 0x91, 0xDD, 0x61, 0xF2, 0x77, 0xCF, 0x97, 0xF3, 0x18, 0xB8, 0x75, 0xEE, + 0xC3, 0xB3, 0x7A, 0xEE, 0x9D, 0xBE, 0x92, 0xED, 0x8C, 0xCF, 0x6A, 0xED, + 0x84, 0xDC, 0xCF, 0xEF, 0x67, 0xD0, 0x14, 0xEE, 0x6D, 0xB1, 0x8A, 0xDA, + 0x30, 0xAD, 0x85, 0xC6, 0x62, 0xD1, 0x29, 0xCF, 0x77, 0xEF, 0x69, 0xDD, + 0x40, 0xEF, 0x68, 0xE7, 0x0D, 0xE2, 0x66, 0xEF, 0x5D, 0xDF, 0x77, 0xF2, + 0xB1, 0xF2, 0x19, 0xFF, 0x40, 0x08, 0x01, 0x17, 0x56, 0x01, 0x32, 0x14, + 0xE7, 0x03, 0x7B, 0x09, 0x49, 0x2F, 0x79, 0x22, 0xE2, 0x45, 0x4C, 0x31, + 0xD1, 0x2F, 0x14, 0x22, 0xFF, 0x1C, 0x81, 0x1D, 0x16, 0x25, 0x98, 0x2A, + 0x63, 0x33, 0x49, 0x32, 0x44, 0x4D, 0x2F, 0x43, 0x8B, 0x66, 0x3B, 0x4F, + 0xF9, 0x46, 0x4F, 0x2D, 0x06, 0x24, 0x34, 0x19, 0x45, 0x30, 0x81, 0x2D, + 0x28, 0x2C, 0x3F, 0x2F, 0x77, 0x10, 0xBD, 0x14, 0xC6, 0x07, 0x41, 0xFF, + 0x54, 0x17, 0x41, 0x00, 0x8F, 0x1B, 0x4A, 0xFC, 0x77, 0x18, 0x8F, 0x00, + 0x79, 0x25, 0x9A, 0x19, 0x9A, 0x22, 0x2D, 0x15, 0x4E, 0x0F, 0xC7, 0xFB, + 0x06, 0x0C, 0x9F, 0xFB, 0x81, 0xFF, 0x72, 0xF8, 0x39, 0xF0, 0x47, 0xED, + 0xCC, 0xFA, 0x75, 0xF9, 0xDF, 0x03, 0x6D, 0x01, 0xE2, 0x01, 0x65, 0xF1, + 0x1C, 0x10, 0x1D, 0xEB, 0x55, 0x22, 0x77, 0xF3, 0x68, 0x12, 0xFE, 0xF1, + 0xAA, 0x08, 0x91, 0x00, 0xEB, 0x1B, 0x6A, 0x18, 0x80, 0x2D, 0x3C, 0x1D, + 0xE8, 0x29, 0x95, 0x0F, 0x87, 0x1B, 0xD8, 0xFF, 0xFF, 0x25, 0x15, 0x17, + 0x8A, 0x32, 0x0F, 0x38, 0x96, 0x27, 0xC9, 0x36, 0x3D, 0x1A, 0xE4, 0x2F, + 0x57, 0x17, 0xBB, 0x30, 0x51, 0x20, 0x80, 0x37, 0xAC, 0x2A, 0x55, 0x45, + 0x58, 0x34, 0x8C, 0x4D, 0x3D, 0x2A, 0x53, 0x3B, 0x90, 0x13, 0xFA, 0x2B, + 0x58, 0x11, 0x7C, 0x2E, 0x61, 0x15, 0x9C, 0x27, 0x02, 0x1B, 0x87, 0x21, + 0x04, 0x17, 0xD3, 0x0B, 0x20, 0x11, 0xCA, 0xFA, 0xDB, 0x0C, 0x58, 0xFD, + 0xCB, 0xF4, 0x6C, 0xE8, 0x6C, 0xF9, 0x4F, 0xDF, 0xAB, 0x1C, 0x3C, 0xF9, + 0x71, 0x17, 0x90, 0xF4, 0x1D, 0xF9, 0x7E, 0xD2, 0x56, 0xF1, 0x43, 0xD0, + 0x97, 0xF1, 0x64, 0xD8, 0x6D, 0xE2, 0x4F, 0xCB, 0x06, 0xCE, 0xFE, 0xC7, + 0xBA, 0xCA, 0x86, 0xD5, 0xE4, 0xD2, 0x44, 0xDC, 0xD0, 0xCE, 0x10, 0xD7, + 0x80, 0xCF, 0x9D, 0xD9, 0x1D, 0xD3, 0x18, 0xE7, 0xDC, 0xCB, 0x87, 0xF1, + 0x5E, 0xCE, 0xC8, 0xF7, 0x9C, 0xDE, 0x19, 0xF9, 0x5B, 0xDA, 0x84, 0xE4, + 0x28, 0xC6, 0x5D, 0xD6, 0x9D, 0xEE, 0x60, 0x08, 0xBB, 0x1D, 0x98, 0x3A, + 0x0B, 0x01, 0xDA, 0x1A, 0x75, 0xE5, 0x7F, 0xF4, 0x0D, 0xEF, 0x61, 0x09, + 0x11, 0xEF, 0xF7, 0x1F, 0x59, 0xE8, 0x36, 0x1A, 0x46, 0xFB, 0xF5, 0x15, + 0xCF, 0xFC, 0x75, 0x03, 0xBB, 0xE8, 0xC9, 0xE7, 0x64, 0xEB, 0x9E, 0xF1, + 0xF6, 0xEE, 0x14, 0x08, 0xAD, 0xE5, 0xD4, 0xFD, 0xEC, 0xD2, 0xB9, 0xE4, + 0xA3, 0xD7, 0x12, 0xEB, 0xFD, 0xF3, 0xB9, 0xFD, 0xA7, 0xF4, 0x27, 0xEA, + 0x14, 0xE7, 0x50, 0xD5, 0xFD, 0xE4, 0x36, 0xE3, 0x56, 0xD6, 0x8A, 0xE0, + 0x8B, 0xC9, 0x6F, 0xD5, 0xE0, 0xD7, 0x4E, 0xE0, 0x89, 0xDA, 0x5A, 0xD9, + 0xCD, 0xDB, 0xC5, 0xDC, 0x34, 0xE3, 0xD1, 0xE3, 0x3D, 0xE6, 0xAC, 0xE0, + 0x54, 0xF3, 0xA0, 0xEF, 0x3B, 0xF2, 0xC9, 0xE5, 0x4B, 0xF6, 0x80, 0xE5, + 0x7F, 0x04, 0xA0, 0xFF, 0xC0, 0x03, 0xDC, 0x05, 0xBF, 0x14, 0xAA, 0x08, + 0xDD, 0x29, 0xAC, 0x00, 0x6E, 0x2F, 0xCE, 0xF7, 0xE2, 0x36, 0x27, 0x0A, + 0x60, 0x47, 0x4F, 0x2F, 0x5C, 0x4B, 0x6C, 0x3A, 0x34, 0x30, 0x0C, 0x1D, + 0x9B, 0x27, 0x0C, 0x0D, 0xCB, 0x39, 0xDE, 0x1C, 0xD4, 0x3B, 0x93, 0x1D, + 0x1C, 0x33, 0x63, 0x05, 0xDA, 0x2F, 0x17, 0xFF, 0xDB, 0x11, 0x56, 0xE8, + 0xB8, 0xED, 0xAF, 0xDA, 0x7F, 0xFB, 0xE6, 0x05, 0x85, 0x0A, 0x3D, 0x15, + 0xDF, 0xF1, 0x28, 0xEC, 0x01, 0xE6, 0x52, 0xDA, 0xE9, 0xE0, 0x6A, 0xE5, + 0xAF, 0xC3, 0x22, 0xD1, 0x3E, 0xB2, 0x42, 0xB7, 0xD8, 0xBA, 0x7A, 0xB6, + 0x3B, 0xC9, 0xB9, 0xBB, 0x5C, 0xC4, 0x36, 0xB7, 0x99, 0xBF, 0x55, 0xB8, + 0x7B, 0xCC, 0x5B, 0xC3, 0x6A, 0xCC, 0x46, 0xC0, 0x3E, 0xC3, 0xC7, 0xB8, + 0x23, 0xC1, 0x13, 0xB4, 0x0B, 0xC3, 0x23, 0xB3, 0x32, 0xCF, 0x2E, 0xB1, + 0xF5, 0xDF, 0x37, 0xAA, 0x36, 0xF4, 0x01, 0xC3, 0x8C, 0xEC, 0x32, 0xDB, + 0x12, 0xD8, 0x6C, 0xE0, 0xC1, 0xEB, 0x01, 0xFA, 0xFB, 0xFC, 0x16, 0x08, + 0x78, 0xFA, 0x12, 0x09, 0x28, 0x08, 0xFB, 0x27, 0x69, 0x23, 0xF7, 0x4F, + 0x96, 0x1C, 0x6B, 0x4A, 0x39, 0x01, 0x6A, 0x2C, 0xC9, 0x0C, 0x73, 0x2C, + 0x98, 0x15, 0xEC, 0x32, 0x09, 0x07, 0x81, 0x28, 0x32, 0x03, 0xEC, 0x1A, + 0xA5, 0x07, 0x71, 0x14, 0xBB, 0x00, 0xAE, 0x11, 0x79, 0x02, 0x9A, 0x25, + 0x5D, 0x0D, 0xA3, 0x39, 0x0D, 0xFB, 0x3E, 0x1C, 0x3C, 0xF1, 0x5D, 0x03, + 0x61, 0x03, 0xDD, 0x14, 0x98, 0x01, 0xF4, 0x18, 0x3B, 0xFD, 0x75, 0x0F, + 0x42, 0x04, 0x00, 0x09, 0xAB, 0xFB, 0x4B, 0xFB, 0xD4, 0xF0, 0x4D, 0xF5, + 0x14, 0xED, 0xF2, 0xF3, 0x3C, 0xE5, 0x7A, 0xEC, 0x07, 0xDD, 0x92, 0xDD, + 0x60, 0xE7, 0x47, 0xE7, 0x78, 0xFE, 0xDC, 0x06, 0xF3, 0xF4, 0xE5, 0xFE, + 0xEE, 0xE0, 0xAF, 0xE9, 0x61, 0xF1, 0x84, 0xF3, 0xE5, 0x00, 0xF6, 0xFA, + 0x48, 0x07, 0x24, 0xFC, 0x38, 0x11, 0x7D, 0x09, 0x1B, 0x1B, 0x7C, 0x0C, + 0xB1, 0x2A, 0x1C, 0x08, 0xDE, 0x2E, 0xE1, 0x06, 0x0A, 0x3C, 0x70, 0x17, + 0x25, 0x5B, 0xDB, 0x48, 0xA5, 0x4F, 0xBF, 0x53, 0x20, 0x28, 0x1B, 0x32, + 0x4A, 0x3D, 0xA1, 0x38, 0x8F, 0x59, 0x8F, 0x45, 0x15, 0x3B, 0xF1, 0x2F, + 0xFD, 0x2B, 0x1C, 0x23, 0x88, 0x3A, 0x77, 0x26, 0xEE, 0x2E, 0x75, 0x20, + 0xDD, 0x26, 0x36, 0x23, 0xB2, 0x37, 0x55, 0x36, 0x15, 0x2E, 0xB1, 0x29, + 0xC1, 0x17, 0x4B, 0x0A, 0x7F, 0x21, 0x7F, 0x16, 0xC7, 0x23, 0x7F, 0x1D, + 0x53, 0xFB, 0xC5, 0xF3, 0x3B, 0xE7, 0xED, 0xE5, 0xF1, 0xF7, 0x1C, 0xFE, + 0x02, 0xFE, 0x3A, 0x07, 0x8B, 0xF6, 0xA0, 0x00, 0x89, 0xED, 0xA3, 0xFB, + 0x36, 0xE2, 0xD8, 0xF4, 0xEA, 0xDD, 0x82, 0xF2, 0xD5, 0xEA, 0x47, 0xFC, + 0x4A, 0xF7, 0x33, 0xFF, 0xEC, 0xF9, 0x26, 0xF9, 0xB3, 0x01, 0xA7, 0xFF, + 0x88, 0x0E, 0x29, 0x06, 0x70, 0x1C, 0xFB, 0x02, 0xFC, 0x1B, 0x4E, 0x07, + 0xB2, 0x12, 0xFC, 0x06, 0x95, 0x28, 0x3C, 0x0C, 0x79, 0x3B, 0x21, 0x0B, + 0xA9, 0x36, 0x29, 0xFA, 0x89, 0x4E, 0x51, 0x0E, 0x76, 0x5E, 0x50, 0x2F, + 0x14, 0x36, 0xFF, 0x1D, 0x6E, 0x13, 0x41, 0xFD, 0x29, 0x29, 0x27, 0x10, + 0x7B, 0x30, 0x53, 0x21, 0x4E, 0x16, 0x93, 0x12, 0xD8, 0x10, 0x8A, 0x0E, + 0x01, 0x06, 0x3F, 0x06, 0xF8, 0xEB, 0xBF, 0xF8, 0xC0, 0xE9, 0xA4, 0x00, + 0x75, 0xEA, 0x79, 0x0B, 0x6E, 0xD7, 0x41, 0x00, 0xB1, 0xD0, 0x16, 0xF0, + 0xD4, 0xE5, 0x6E, 0xF6, 0x9E, 0xF5, 0x24, 0xF9, 0x5E, 0xDB, 0x3E, 0xE3, + 0x02, 0xC9, 0x9E, 0xE5, 0x80, 0xCD, 0xC4, 0xEE, 0x5D, 0xB8, 0xD5, 0xD9, + 0xC0, 0xB7, 0x66, 0xE1, 0x6D, 0xD4, 0x6D, 0xF6, 0x52, 0xD3, 0x72, 0xE3, + 0xB2, 0xD9, 0x7A, 0xD6, 0xC4, 0xF1, 0xF0, 0xE1, 0xAE, 0xF0, 0xA6, 0xF1, + 0xA5, 0xE0, 0x8B, 0x04, 0xB2, 0xD4, 0xBA, 0x04, 0x08, 0xE4, 0xA1, 0xF6, + 0x3A, 0xFD, 0x9D, 0xF9, 0xF2, 0xFF, 0xEC, 0x05, 0x54, 0x0A, 0x81, 0x12, + 0x43, 0x1A, 0xDF, 0x19, 0x17, 0x0D, 0x1D, 0x07, 0x99, 0xF8, 0xE8, 0xF9, + 0xEA, 0x13, 0xE7, 0x25, 0xE3, 0x1C, 0x48, 0x41, 0x74, 0xED, 0x5A, 0x0F, + 0xC5, 0xF4, 0x76, 0xFF, 0x15, 0x2B, 0x48, 0x29, 0x20, 0x33, 0xE1, 0x2B, + 0xA2, 0x0E, 0x44, 0x10, 0x53, 0xF9, 0xC5, 0x03, 0x5F, 0xF1, 0xB1, 0xFF, + 0x11, 0xF6, 0xF5, 0x04, 0x15, 0x16, 0x2B, 0x1A, 0xCE, 0x11, 0xCE, 0x0B, + 0xB9, 0xEC, 0x7A, 0xD9, 0x05, 0xEB, 0xF0, 0xC9, 0x66, 0x02, 0x75, 0xE5, + 0x10, 0xEB, 0x76, 0xE7, 0x0C, 0xBA, 0xEC, 0xC6, 0xA0, 0xBC, 0x7F, 0xC3, + 0x98, 0xDD, 0x51, 0xD6, 0x54, 0xEF, 0xE6, 0xDF, 0x69, 0xF2, 0xDB, 0xDC, + 0xB7, 0xE9, 0xE6, 0xCA, 0x8B, 0xD5, 0x98, 0xBD, 0x8E, 0xD2, 0x79, 0xC1, + 0xDD, 0xDA, 0xB0, 0xCC, 0x7D, 0xDB, 0xDC, 0xDB, 0xBE, 0xD5, 0x4A, 0xDE, + 0xA1, 0xD4, 0x5F, 0xD7, 0x99, 0xE4, 0x89, 0xDC, 0x6C, 0xF4, 0x81, 0xED, + 0x20, 0xF2, 0x96, 0xF8, 0x53, 0xE1, 0x6A, 0xE9, 0xD6, 0xE5, 0xEE, 0xE6, + 0xEC, 0xF7, 0xF3, 0xED, 0x4D, 0x05, 0xFB, 0xEB, 0x30, 0x1C, 0xA7, 0x00, + 0xB8, 0x21, 0xFB, 0x12, 0x24, 0xFF, 0xA5, 0xFB, 0x7F, 0xF6, 0xE8, 0xEB, + 0xE6, 0x21, 0xBD, 0x0B, 0xC0, 0x22, 0x05, 0x02, 0x7C, 0xFC, 0x3E, 0xD8, + 0xBF, 0xF4, 0xC2, 0xDD, 0x56, 0xF3, 0xC7, 0xE8, 0x53, 0xFA, 0xB2, 0xF2, + 0x64, 0x14, 0x4A, 0x0B, 0x87, 0xF7, 0xD8, 0xF2, 0x26, 0xC8, 0x35, 0xCB, + 0x37, 0xDF, 0x22, 0xED, 0x11, 0xFA, 0x91, 0x1E, 0x59, 0xDD, 0x32, 0x0C, + 0xE5, 0xC1, 0xB1, 0xE7, 0xB4, 0xBE, 0xA0, 0xDE, 0x54, 0xC7, 0x47, 0xDF, + 0xD6, 0xD3, 0x14, 0xE2, 0xE1, 0xD2, 0x14, 0xDD, 0x5E, 0xD5, 0x67, 0xE5, + 0xCC, 0xDD, 0xB8, 0xFC, 0x0F, 0xE7, 0x67, 0x05, 0x9D, 0xF6, 0xF9, 0x04, + 0xE8, 0x02, 0xD7, 0x0A, 0xFD, 0x05, 0x71, 0x19, 0x62, 0x09, 0xE5, 0x22, + 0x29, 0x16, 0xB8, 0x29, 0x90, 0x30, 0x3A, 0x3B, 0xDD, 0x37, 0x8D, 0x3C, + 0xA0, 0x2B, 0x53, 0x33, 0xC2, 0x36, 0x21, 0x40, 0x9E, 0x3D, 0x96, 0x3E, + 0xC7, 0x3E, 0x5B, 0x31, 0x7D, 0x58, 0x46, 0x52, 0x46, 0x4A, 0x6B, 0x4F, + 0x7F, 0x1E, 0xB6, 0x19, 0x05, 0x25, 0x12, 0x19, 0x18, 0x45, 0x65, 0x3B, + 0x64, 0x38, 0x00, 0x34, 0x51, 0x18, 0xDD, 0x18, 0x5D, 0x1A, 0x9B, 0x1C, + 0xB1, 0x1C, 0xB3, 0x12, 0x46, 0x2C, 0xB3, 0x15, 0x62, 0x39, 0x3B, 0x1F, + 0x9E, 0x17, 0x2C, 0xF9, 0x8E, 0xF4, 0x2C, 0xDF, 0xBE, 0xF3, 0x75, 0xEA, + 0x5D, 0x0A, 0xB2, 0x03, 0x3B, 0x0E, 0x27, 0x09, 0x80, 0xFB, 0xBB, 0xF5, + 0x9D, 0xF1, 0xF0, 0xEB, 0x97, 0xF9, 0x94, 0xEB, 0xB6, 0x02, 0x7F, 0xF0, + 0xAA, 0xF2, 0x3A, 0xE7, 0x7D, 0xE2, 0x31, 0xD8, 0x26, 0xEF, 0x40, 0xE5, + 0x6E, 0x0D, 0xFE, 0xF4, 0xDC, 0x1D, 0xDE, 0xFB, 0xBB, 0x21, 0xEF, 0x0A, + 0x0A, 0x2B, 0xC2, 0x1A, 0x6C, 0x21, 0xB2, 0x12, 0x14, 0x11, 0x11, 0x06, + 0xD1, 0x15, 0x6D, 0x11, 0x3F, 0x0C, 0xA0, 0x10, 0x1F, 0xFF, 0x99, 0x12, + 0x4A, 0x1B, 0x32, 0x30, 0xB1, 0x23, 0x99, 0x33, 0xA0, 0x1D, 0x08, 0x3A, + 0x38, 0x37, 0x39, 0x64, 0xD4, 0x2B, 0x4E, 0x5C, 0x00, 0xFE, 0xFA, 0x1D, + 0x13, 0x03, 0xCA, 0x17, 0x87, 0x2C, 0x98, 0x3B, 0x6A, 0x25, 0xE7, 0x2D, + 0x66, 0x0C, 0x61, 0x13, 0xC7, 0x0F, 0xE5, 0x11, 0x31, 0x06, 0x76, 0x06, + 0x7C, 0x16, 0x04, 0x11, 0xF6, 0x34, 0xB9, 0x1E, 0xDE, 0x0E, 0x25, 0xEC, + 0x68, 0xFB, 0xEC, 0xD2, 0x8C, 0x1F, 0xFB, 0xF0, 0x5D, 0x16, 0x6A, 0xEA, + 0x76, 0xF5, 0x51, 0xD6, 0xC0, 0xE9, 0x8B, 0xCF, 0xE6, 0xD4, 0x7F, 0xBF, + 0xAB, 0xCF, 0x41, 0xC1, 0x13, 0xED, 0xB7, 0xDF, 0xB8, 0xF8, 0x88, 0xEF, + 0xF6, 0xE7, 0x1C, 0xE5, 0x12, 0xDF, 0xD1, 0xEE, 0x96, 0xE2, 0xC4, 0x00, + 0x07, 0xE9, 0x8C, 0x05, 0x11, 0xF2, 0x88, 0x09, 0x30, 0xED, 0xEB, 0xF5, + 0xE8, 0xE6, 0x4D, 0xE5, 0xC8, 0x03, 0xCB, 0xF4, 0xC7, 0x1A, 0xCA, 0x03, + 0x60, 0x08, 0xAA, 0x08, 0xA5, 0xF6, 0x71, 0x16, 0x75, 0xF5, 0x5C, 0x24, + 0xF5, 0xEE, 0x54, 0x16, 0xE7, 0xF4, 0x55, 0x07, 0xED, 0x1E, 0x53, 0x1E, + 0x8B, 0x26, 0x05, 0x1F, 0x3C, 0xF8, 0x75, 0xF1, 0x2B, 0xEE, 0x55, 0xEF, + 0xDD, 0x0A, 0x84, 0x19, 0xD2, 0x06, 0x1E, 0x24, 0x0C, 0xF2, 0xFE, 0x1D, + 0x20, 0xFE, 0x44, 0x20, 0x32, 0x0C, 0xB7, 0x0F, 0x23, 0x20, 0x76, 0x0D, + 0x8C, 0x2E, 0xB6, 0x1D, 0xF0, 0x03, 0x1A, 0x06, 0x7A, 0xDB, 0x98, 0xE5, + 0x86, 0xE9, 0xAB, 0xF7, 0x58, 0xF9, 0x46, 0x12, 0x27, 0xF8, 0x3D, 0x0F, + 0x5B, 0xF5, 0x89, 0xFD, 0x43, 0xE7, 0xED, 0xDE, 0x6F, 0xE1, 0x82, 0xCC, + 0x08, 0xED, 0x87, 0xD7, 0xE4, 0xE8, 0x27, 0xE3, 0x41, 0xDB, 0x55, 0xE8, + 0x70, 0xD8, 0xE0, 0xE4, 0x8C, 0xE8, 0xCF, 0xD9, 0xB6, 0x0B, 0x55, 0xE4, + 0x1F, 0x0D, 0xB4, 0xE5, 0xC7, 0xF0, 0xC3, 0xCF, 0x15, 0xF1, 0xD2, 0xD8, + 0xAE, 0xFB, 0xE7, 0xEC, 0xEC, 0xFB, 0x13, 0xF8, 0x04, 0x03, 0x32, 0x09, + 0x57, 0x0B, 0x6C, 0x07, 0x49, 0x0A, 0x19, 0xF2, 0xC6, 0x08, 0x54, 0xE4, + 0xB7, 0x0D, 0x57, 0xEE, 0x72, 0x16, 0xBB, 0x08, 0x66, 0x0B, 0x6B, 0x06, + 0xA2, 0xE5, 0x5F, 0xDD, 0x82, 0xDF, 0xE5, 0xD2, 0x05, 0x04, 0xBC, 0xF9, + 0x15, 0x0B, 0x7B, 0x0E, 0x7F, 0xED, 0xCE, 0xFA, 0x07, 0xDD, 0xE1, 0xDF, + 0x59, 0xD4, 0xB7, 0xCC, 0xC5, 0xD1, 0x5C, 0xCE, 0xC6, 0xE4, 0x86, 0xEB, + 0x07, 0xE1, 0x94, 0xE8, 0x18, 0xBA, 0x76, 0xB5, 0x20, 0xB0, 0x2F, 0xA9, + 0x38, 0xDE, 0x2A, 0xDC, 0x67, 0xF6, 0x22, 0xF0, 0xED, 0xDA, 0xBA, 0xC9, + 0x37, 0xD3, 0x0C, 0xB5, 0xF3, 0xD8, 0x38, 0xBA, 0xE2, 0xD9, 0x03, 0xC7, + 0xF0, 0xEF, 0x02, 0xE3, 0xE6, 0xFB, 0x9F, 0xE5, 0xE8, 0xE0, 0x66, 0xBC, + 0x95, 0xE3, 0xD6, 0xC1, 0x9F, 0x01, 0x5D, 0xF4, 0x4B, 0xFB, 0xE0, 0x00, + 0xDE, 0xE0, 0x4E, 0xF4, 0x15, 0xDF, 0xF8, 0x02, 0xB0, 0xFA, 0x31, 0x24, + 0x33, 0x01, 0x8C, 0x23, 0x45, 0x0B, 0x56, 0x25, 0xD9, 0x13, 0x02, 0x2C, + 0x82, 0x00, 0x5B, 0x20, 0xED, 0xEE, 0x3B, 0x0E, 0x4C, 0xEF, 0x13, 0x06, + 0xBA, 0x13, 0x33, 0x22, 0xE5, 0x2F, 0xA1, 0x3B, 0x38, 0x18, 0x02, 0x30, + 0xE1, 0xF2, 0xBA, 0x12, 0x34, 0xF1, 0xAA, 0x11, 0xE7, 0x12, 0xFE, 0x34, + 0xC0, 0x22, 0x42, 0x41, 0x15, 0x07, 0x96, 0x13, 0xF1, 0xEC, 0x42, 0xE1, + 0xEE, 0x02, 0x1A, 0xF7, 0xB0, 0x2E, 0x45, 0x3D, 0x10, 0x27, 0xE1, 0x49, + 0xCD, 0x01, 0x37, 0x1A, 0xB3, 0xFD, 0x99, 0xFE, 0xBE, 0x21, 0x17, 0x16, + 0x33, 0x3E, 0x6F, 0x35, 0x0F, 0x20, 0x3E, 0x1F, 0xE6, 0xE9, 0xC3, 0xE7, + 0x9D, 0xE5, 0x5B, 0xE6, 0x14, 0x0E, 0xBE, 0x12, 0x2B, 0x15, 0xB8, 0x17, + 0xF1, 0xFE, 0xFC, 0xF9, 0x52, 0x01, 0xF0, 0xE9, 0xA6, 0x26, 0x84, 0x03, + 0x71, 0x3C, 0x4A, 0x18, 0x1F, 0x1F, 0x1C, 0x07, 0x3C, 0x02, 0x14, 0xFB, + 0xA7, 0x04, 0x33, 0xFF, 0x9C, 0x1F, 0xBA, 0x1A, 0x76, 0x35, 0x8E, 0x34, + 0x66, 0x21, 0xEB, 0x1E, 0x58, 0x09, 0x93, 0xFA, 0x60, 0x31, 0x8E, 0x15, + 0xB6, 0x50, 0x40, 0x39, 0xDC, 0x1B, 0xF6, 0x11, 0x6B, 0xFE, 0xF6, 0xFB, + 0xF8, 0x1A, 0xE9, 0x1A, 0x9E, 0x2B, 0x1B, 0x2E, 0x6D, 0x32, 0xAA, 0x27, + 0x43, 0x34, 0x47, 0x19, 0x5A, 0x1C, 0xC2, 0x09, 0x6D, 0x01, 0x40, 0xFE, + 0xEC, 0x14, 0x69, 0x14, 0x53, 0x31, 0x88, 0x25, 0xF0, 0x21, 0x53, 0x18, + 0x79, 0x0D, 0xFC, 0x13, 0x6C, 0x09, 0x2F, 0x15, 0x94, 0x0C, 0x8D, 0x20, + 0xD0, 0x0D, 0x61, 0x25, 0xE1, 0x04, 0x85, 0x20, 0xD3, 0xF3, 0xFA, 0x1D, + 0xFA, 0xEB, 0x63, 0x14, 0x6C, 0x00, 0xDD, 0x15, 0xF5, 0x07, 0xBB, 0x0A, + 0xB9, 0xF0, 0x8D, 0xF3, 0xCF, 0xDD, 0xC2, 0xF2, 0xB8, 0xDA, 0x8A, 0xF7, + 0x4A, 0xE4, 0x37, 0xEB, 0xF6, 0xF7, 0x2F, 0xE1, 0xF1, 0x05, 0x05, 0xE7, + 0xB0, 0x05, 0x7E, 0xE8, 0x94, 0x0E, 0xB8, 0xEA, 0x2A, 0x1B, 0x55, 0xEA, + 0x13, 0x19, 0xEE, 0xE5, 0x9B, 0x1D, 0xC4, 0xF5, 0xD8, 0x23, 0x3A, 0x01, + 0x55, 0x11, 0xA7, 0xEA, 0xF8, 0x0C, 0xA3, 0xE3, 0xAF, 0x17, 0xDA, 0xFC, + 0xEC, 0x14, 0x0A, 0x11, 0xF4, 0x0F, 0xC3, 0x14, 0xDD, 0xFF, 0x64, 0x0C, + 0x86, 0xE6, 0x5D, 0xFF, 0x57, 0xE6, 0x61, 0xFB, 0xB6, 0xFF, 0xEE, 0x01, + 0xE4, 0xFC, 0x8D, 0xF9, 0xC7, 0xE0, 0xB5, 0xE6, 0x17, 0xE5, 0x8F, 0xEC, + 0x7D, 0xFD, 0x63, 0x0A, 0x93, 0xE9, 0x6C, 0x06, 0xFC, 0xC3, 0x88, 0xEB, + 0x48, 0xD6, 0x0B, 0xFE, 0xA3, 0xF5, 0xB4, 0x0F, 0x6A, 0xF9, 0x1F, 0xFB, + 0xA0, 0xF1, 0x7B, 0xE6, 0x55, 0xDA, 0xF8, 0xDD, 0x95, 0xDC, 0x1B, 0xFB, + 0xA8, 0xFC, 0x4E, 0x26, 0x1C, 0x00, 0xA5, 0x1A, 0xBC, 0xD9, 0x2B, 0xEC, + 0x27, 0xD4, 0x44, 0xEC, 0xAD, 0x0A, 0x81, 0x17, 0x9A, 0x27, 0x0F, 0x21, + 0xDB, 0x0D, 0x88, 0x00, 0xE5, 0xE1, 0xD0, 0xE5, 0xB2, 0xDD, 0xEB, 0xFB, + 0xBB, 0x05, 0x2A, 0x2C, 0xDA, 0x0F, 0xBD, 0x2F, 0xDE, 0x05, 0x9E, 0x16, + 0x09, 0xFD, 0x52, 0x07, 0x0E, 0xFC, 0xFD, 0x0C, 0x6E, 0x1C, 0xA5, 0x29, + 0x4F, 0x25, 0x23, 0x29, 0xC2, 0xFC, 0x28, 0x04, 0x92, 0xE0, 0xE1, 0xF2, + 0x96, 0xF7, 0x61, 0x09, 0x0F, 0x24, 0xBB, 0x1C, 0xEA, 0x2C, 0xFC, 0x0C, + 0x93, 0x11, 0x7A, 0xF4, 0x93, 0xF4, 0x18, 0xE1, 0x2B, 0xF8, 0x5F, 0xE7, + 0x86, 0x11, 0x88, 0x08, 0x78, 0x03, 0xE5, 0xF9, 0x66, 0xEB, 0xDB, 0xD5, + 0x1E, 0xEF, 0x62, 0xDC, 0xDD, 0xF0, 0x81, 0xDF, 0x0E, 0xF2, 0x7C, 0xD8, + 0x9E, 0xFB, 0x3F, 0xE0, 0x52, 0xEF, 0x9C, 0xDA, 0x04, 0xD2, 0xC2, 0xC7, + 0xA7, 0xE6, 0x94, 0xDD, 0x1F, 0x06, 0x28, 0x03, 0x62, 0xE8, 0x4C, 0xF1, + 0xB0, 0xCD, 0xB8, 0xD6, 0x8B, 0xD4, 0xE4, 0xDC, 0xED, 0xD1, 0x36, 0xD5, + 0x8E, 0xD0, 0x67, 0xCE, 0x01, 0xDB, 0x46, 0xDB, 0x9B, 0xD2, 0x52, 0xD3, + 0xAB, 0xC3, 0x87, 0xC4, 0x9E, 0xCF, 0xE8, 0xD7, 0x72, 0xE4, 0x60, 0xEC, + 0x13, 0xEF, 0xF9, 0xE2, 0x1E, 0xEB, 0xED, 0xD7, 0x14, 0xCE, 0x52, 0xC8, + 0xA1, 0xC1, 0xEF, 0xBC, 0xC9, 0xE8, 0x04, 0xDE, 0x80, 0x0C, 0x4A, 0xF8, + 0x85, 0x0E, 0x08, 0xEE, 0xAE, 0x00, 0x07, 0xE2, 0xD7, 0xF2, 0x63, 0xD7, + 0x89, 0xFD, 0xAD, 0xDC, 0xC0, 0x12, 0x6F, 0xF6, 0xFE, 0x07, 0xB3, 0xFF, + 0x1C, 0xE3, 0xC2, 0xE9, 0x0D, 0xE3, 0x21, 0xEC, 0x2A, 0x0F, 0x7D, 0x15, + 0x3B, 0x1F, 0xF0, 0x26, 0x01, 0x07, 0x5E, 0x18, 0xC4, 0xEA, 0x7C, 0x07, + 0xAE, 0xE4, 0xB8, 0x03, 0x10, 0xF9, 0xC6, 0x08, 0x7E, 0x06, 0xB7, 0x03, + 0x64, 0xFE, 0xEB, 0xF8, 0xF2, 0xEF, 0x0C, 0xF4, 0x61, 0xEE, 0xBF, 0x03, + 0x8B, 0xF4, 0x25, 0x19, 0x47, 0xF3, 0xA3, 0x19, 0x45, 0xF2, 0x22, 0x16, + 0xA9, 0xFE, 0x90, 0x18, 0x4E, 0x04, 0x4D, 0x0A, 0xCA, 0x01, 0xC0, 0x09, + 0xCE, 0x02, 0x07, 0x19, 0x7C, 0xEC, 0x3C, 0x06, 0x6D, 0xEE, 0x32, 0xFF, + 0x6E, 0x19, 0xAA, 0x1D, 0x44, 0x1F, 0x55, 0x21, 0xB2, 0x19, 0x3D, 0x17, + 0xF9, 0x22, 0x25, 0x22, 0x55, 0x18, 0x22, 0x1E, 0x20, 0x17, 0x21, 0x16, + 0xA5, 0x23, 0x6C, 0x1F, 0xD6, 0x19, 0xD2, 0x1F, 0xFA, 0x15, 0xDE, 0x1E, + 0x0F, 0x2F, 0xC1, 0x2B, 0xCC, 0x3D, 0xFA, 0x31, 0x47, 0x36, 0xE5, 0x28, + 0xBD, 0x35, 0x09, 0x26, 0x07, 0x39, 0x8A, 0x25, 0x83, 0x37, 0x08, 0x2A, + 0x0B, 0x35, 0xB7, 0x3A, 0xD1, 0x2C, 0xAB, 0x35, 0x17, 0x22, 0xAA, 0x1F, + 0xE2, 0x25, 0x9A, 0x1A, 0x06, 0x2D, 0x01, 0x19, 0xF7, 0x1A, 0x94, 0x08, + 0xBF, 0x09, 0x54, 0x00, 0xF2, 0x15, 0x03, 0x09, 0x1B, 0x1E, 0xD5, 0x0C, + 0xA7, 0x0F, 0xF3, 0x09, 0x54, 0x04, 0x66, 0x0A, 0x26, 0x0D, 0x9C, 0x0A, + 0xA7, 0x20, 0x91, 0x0C, 0xB5, 0x20, 0x8F, 0x04, 0xE1, 0x06, 0x07, 0xEE, + 0x63, 0xFA, 0xE9, 0xEB, 0x9B, 0xFA, 0x47, 0xF8, 0x6E, 0x02, 0xD2, 0x07, + 0x7C, 0x15, 0x9C, 0x19, 0x34, 0x10, 0x6B, 0x1E, 0x43, 0xF6, 0x4B, 0x1B, + 0x48, 0x04, 0x35, 0x28, 0x3E, 0x24, 0xDB, 0x38, 0x4A, 0x0A, 0xCC, 0x22, + 0x6D, 0xEE, 0xE7, 0x10, 0x07, 0x05, 0x81, 0x27, 0x47, 0x14, 0x31, 0x30, + 0xC0, 0x13, 0xE5, 0x23, 0xDA, 0x13, 0xE4, 0x1D, 0xFB, 0x01, 0x05, 0x0E, + 0x2E, 0xF7, 0x61, 0xFB, 0xAF, 0x0B, 0x55, 0xFC, 0x6A, 0x24, 0xAE, 0xFE, + 0x7E, 0x27, 0x29, 0xFD, 0x6F, 0x25, 0x30, 0x12, 0xE5, 0x22, 0xD3, 0x1B, + 0xD1, 0x16, 0xD2, 0xFD, 0x88, 0x19, 0xD4, 0xEB, 0xA5, 0x29, 0xA9, 0xF6, + 0x91, 0x25, 0x87, 0xFC, 0x0A, 0x1E, 0xF2, 0xFC, 0xE2, 0x15, 0x74, 0xFA, + 0xF2, 0xFF, 0x7B, 0xE8, 0xE1, 0xFC, 0xF2, 0xEA, 0xEA, 0x01, 0x38, 0x07, + 0x37, 0xEC, 0xE6, 0x00, 0x7F, 0xDA, 0x53, 0xE5, 0x5E, 0xEE, 0x9F, 0xE3, + 0x2D, 0x08, 0x11, 0xF0, 0x2B, 0x05, 0x3A, 0xF7, 0x2B, 0xEA, 0xD6, 0xF4, + 0x7B, 0xD2, 0xAA, 0xEC, 0xF3, 0xC7, 0x4F, 0xE4, 0xA4, 0xC9, 0x25, 0xEC, + 0xD6, 0xDA, 0x30, 0xF7, 0xF5, 0xE3, 0xEE, 0xE9, 0x7C, 0xE3, 0x9C, 0xDD, + 0x39, 0xEC, 0x1A, 0xE9, 0x0A, 0xE9, 0xD2, 0xF2, 0xCF, 0xD4, 0x67, 0xEC, + 0x25, 0xD3, 0x25, 0xF4, 0x24, 0xE3, 0x0C, 0xFF, 0xF2, 0xF1, 0x6B, 0x00, + 0x7E, 0xF9, 0x0C, 0x06, 0xB9, 0xF3, 0x1C, 0xFB, 0x5A, 0xF6, 0x60, 0xEF, + 0x01, 0x03, 0x9C, 0xFD, 0xFC, 0x03, 0x1B, 0x0A, 0x33, 0xFB, 0x55, 0x0A, + 0xE5, 0xFB, 0x44, 0x16, 0x2E, 0x04, 0x30, 0x1D, 0x61, 0x11, 0x44, 0x1B, + 0xEA, 0x1A, 0x02, 0x1E, 0xF5, 0x0E, 0xF0, 0x16, 0x9E, 0x06, 0xC3, 0x16, + 0x91, 0xFE, 0xAA, 0x1D, 0xD9, 0xF1, 0x0C, 0x19, 0x4B, 0x01, 0xA9, 0x1A, + 0x81, 0x0C, 0xE2, 0x18, 0x42, 0x0A, 0x92, 0x04, 0x7C, 0x10, 0x1C, 0xF4, + 0x64, 0x0F, 0x3E, 0xF3, 0xAB, 0x01, 0x03, 0xF2, 0x21, 0xF6, 0x6D, 0xEB, + 0xC3, 0xF4, 0xAA, 0xE8, 0xA4, 0xF5, 0x1D, 0xF0, 0xCC, 0xF1, 0xBF, 0xEE, + 0x37, 0xE8, 0x0E, 0xDD, 0xD4, 0xE8, 0x22, 0xD9, 0x5F, 0xEF, 0x55, 0xD6, + 0x55, 0xE9, 0x7D, 0xCC, 0x23, 0xE4, 0xBA, 0xD2, 0xE9, 0xE1, 0xC8, 0xDA, + 0x6E, 0xDF, 0xF8, 0xD5, 0xC0, 0xDF, 0x03, 0xD6, 0xC8, 0xDB, 0x2A, 0xE3, + 0x6A, 0xE5, 0xE4, 0xEF, 0xF6, 0xE2, 0x01, 0xE3, 0x9B, 0xD0, 0xB2, 0xCD, + 0x07, 0xD2, 0x98, 0xD3, 0x30, 0xD7, 0xE0, 0xE4, 0xC8, 0xE2, 0x2E, 0xF4, + 0xC9, 0xED, 0x38, 0xF6, 0x05, 0xED, 0x86, 0xE9, 0xB7, 0xE4, 0x76, 0xE1, + 0xE6, 0xE6, 0x6C, 0xE9, 0x68, 0xE4, 0x49, 0xE4, 0xC7, 0xD1, 0x0F, 0xD2, + 0x29, 0xD6, 0x2B, 0xD7, 0xF5, 0xEC, 0xF4, 0xE4, 0xC2, 0xF7, 0xEB, 0xE4, + 0x92, 0xF2, 0x04, 0xD4, 0xCF, 0xEC, 0x69, 0xC2, 0xDB, 0xE4, 0x13, 0xBF, + 0xA2, 0xE3, 0xD8, 0xC7, 0x95, 0xDF, 0x11, 0xCD, 0xC1, 0xD5, 0x31, 0xCB, + 0x8C, 0xDE, 0x13, 0xD0, 0x82, 0xEA, 0xFF, 0xD6, 0x13, 0xED, 0xC5, 0xDD, + 0xA0, 0xEC, 0x32, 0xF9, 0x45, 0xDD, 0x4A, 0x0B, 0x58, 0xD8, 0x7E, 0x04, + 0xFC, 0xF4, 0x8F, 0x03, 0x98, 0xFE, 0x95, 0xFD, 0x61, 0xF7, 0x96, 0xF5, + 0x76, 0xFB, 0xB0, 0xF6, 0x76, 0xF2, 0x86, 0xF3, 0xAC, 0xE4, 0x99, 0xF7, + 0xDA, 0xE9, 0xE2, 0x06, 0xF1, 0xF5, 0xD0, 0x0F, 0xCF, 0xF8, 0x61, 0x0E, + 0x9F, 0xFE, 0xE4, 0x0C, 0x81, 0xFE, 0x1F, 0x06, 0x7E, 0xEE, 0x38, 0xFC, + 0xB2, 0xF9, 0x94, 0x09, 0x19, 0x11, 0xC5, 0x12, 0x9D, 0x12, 0x6E, 0x0F, + 0x81, 0x0D, 0xA2, 0x14, 0xB0, 0x08, 0x39, 0x19, 0xAD, 0x0C, 0x85, 0x1D, + 0xBC, 0x1D, 0x23, 0x23, 0x82, 0x2F, 0x27, 0x2C, 0x7B, 0x24, 0x61, 0x1E, + 0x36, 0x0C, 0x66, 0x0C, 0x29, 0x16, 0xE8, 0x1F, 0x6F, 0x1F, 0x5B, 0x22, + 0x51, 0x13, 0x6B, 0x0B, 0x0C, 0x19, 0xC6, 0x0C, 0x90, 0x29, 0x61, 0x16, + 0xD2, 0x2D, 0xB3, 0x14, 0x11, 0x2E, 0x38, 0x1A, 0x53, 0x27, 0xEB, 0x19, + 0xDA, 0x15, 0xBB, 0x0D, 0xD0, 0x11, 0x47, 0x11, 0x52, 0x21, 0x36, 0x1F, + 0xCF, 0x23, 0xF4, 0x17, 0x1A, 0x1C, 0xBB, 0x06, 0x5A, 0x15, 0x85, 0x06, + 0xCA, 0x01, 0x59, 0x04, 0x08, 0x02, 0x94, 0x08, 0x71, 0x14, 0xA9, 0x19, + 0xFE, 0x1C, 0x2F, 0x23, 0x77, 0x1C, 0x31, 0x1D, 0x4D, 0x1E, 0xF0, 0x15, + 0x02, 0x2B, 0xD4, 0x1A, 0x9C, 0x2B, 0xD8, 0x18, 0x99, 0x23, 0xE3, 0x13, + 0x00, 0x21, 0x57, 0x14, 0x6D, 0x1C, 0xCF, 0x1A, 0x11, 0x13, 0x58, 0x1F, + 0x03, 0x10, 0x04, 0x1F, 0x8C, 0x14, 0xFD, 0x2A, 0x27, 0x0C, 0x79, 0x2E, + 0x9F, 0x05, 0xE4, 0x2F, 0x21, 0x0E, 0xB3, 0x32, 0xA4, 0x10, 0x06, 0x28, + 0x4D, 0x11, 0x04, 0x26, 0x49, 0x12, 0x78, 0x2A, 0x58, 0x04, 0x8B, 0x2C, + 0xA5, 0xFC, 0x91, 0x2E, 0xC4, 0x09, 0x90, 0x25, 0x74, 0x11, 0xE0, 0x10, + 0x9F, 0x0D, 0x2C, 0xFF, 0x76, 0x15, 0xDF, 0x02, 0x96, 0x28, 0x6F, 0x14, + 0x9B, 0x2A, 0xEB, 0x0C, 0x51, 0x23, 0x0B, 0xFB, 0x66, 0x23, 0xD3, 0xFE, + 0x56, 0x1E, 0xD3, 0xF8, 0xA6, 0x16, 0x82, 0xE4, 0x01, 0x14, 0xB9, 0xE0, + 0x4D, 0x1C, 0xA7, 0xEA, 0x2D, 0x15, 0x9F, 0xDE, 0x86, 0x04, 0x31, 0xD6, + 0x88, 0x07, 0xAB, 0xE9, 0x32, 0xF9, 0x64, 0xE9, 0x09, 0xEA, 0x5F, 0xE8, + 0x5F, 0xF3, 0x62, 0xF8, 0x6C, 0xFA, 0xA3, 0xF6, 0x70, 0x00, 0x42, 0xF1, + 0xD6, 0x07, 0xEF, 0xF5, 0x9E, 0xFC, 0x1F, 0xEC, 0x2C, 0xE5, 0x37, 0xEB, + 0x2E, 0xD7, 0xEA, 0xFE, 0xA6, 0xD5, 0x8A, 0x01, 0x63, 0xE5, 0xE4, 0x02, + 0x93, 0xFA, 0x4F, 0x0E, 0x4A, 0xFE, 0xD9, 0x07, 0x56, 0xF9, 0x0D, 0xFE, + 0xF4, 0xF1, 0xB0, 0x04, 0xF0, 0xE0, 0xEB, 0xFB, 0x3E, 0xD6, 0xE7, 0xF2, + 0x09, 0xDB, 0x58, 0x07, 0xBA, 0xD7, 0x1E, 0x0A, 0xBB, 0xD7, 0xBE, 0xFC, + 0xFF, 0xF2, 0x98, 0xFC, 0xE4, 0x02, 0x7A, 0xF2, 0x81, 0xFA, 0x9C, 0xE6, + 0x13, 0xF4, 0xC0, 0xEF, 0xDD, 0xF0, 0x3E, 0xFA, 0x89, 0xF6, 0x09, 0xFD, + 0xA5, 0xF7, 0x45, 0xF9, 0x38, 0xF4, 0xFC, 0xF3, 0x7B, 0xFA, 0xDD, 0xF3, + 0x82, 0xFE, 0xDE, 0xF8, 0x1E, 0xFD, 0x82, 0xFF, 0x66, 0xFB, 0xB9, 0xFD, + 0x02, 0xF0, 0x4E, 0xFC, 0x1B, 0xED, 0x66, 0x05, 0x64, 0x09, 0x9F, 0x14, + 0x2A, 0x0F, 0x9C, 0x10, 0xF7, 0x04, 0x2C, 0x01, 0xA8, 0x16, 0x66, 0x06, + 0x1D, 0x1D, 0xB9, 0x03, 0xB3, 0x10, 0x04, 0xF6, 0xEF, 0x08, 0x35, 0xF1, + 0x15, 0x04, 0xF8, 0xFA, 0xE3, 0xFD, 0xA8, 0x06, 0xCD, 0xFC, 0xC5, 0xFF, + 0x00, 0x03, 0xA6, 0xFC, 0x7A, 0x05, 0x55, 0x00, 0x90, 0xFD, 0x0E, 0xF0, + 0x00, 0xFA, 0x28, 0xE4, 0xEB, 0xFA, 0xF7, 0xED, 0xB5, 0xE6, 0x11, 0xE9, + 0x4B, 0xDA, 0x55, 0xE6, 0xCB, 0xF1, 0xFE, 0xFD, 0x16, 0x03, 0xBF, 0x06, + 0x54, 0xEB, 0x16, 0xED, 0x6D, 0xD8, 0xBC, 0xE7, 0x37, 0xDD, 0x0A, 0xF5, + 0x76, 0xD9, 0xD1, 0xF1, 0x4A, 0xD2, 0x24, 0xEB, 0x91, 0xDB, 0x17, 0xED, + 0x8A, 0xEB, 0x63, 0xF4, 0x41, 0xED, 0x41, 0xEC, 0xA1, 0xE9, 0x64, 0xDA, + 0x52, 0xE7, 0xFD, 0xD7, 0x70, 0xD4, 0xDF, 0xD8, 0xCF, 0xC3, 0x8F, 0xD1, + 0x90, 0xD3, 0x09, 0xD3, 0x5B, 0xE6, 0x1C, 0xD3, 0x10, 0xEC, 0xD4, 0xC7, + 0xF8, 0xF3, 0x8B, 0xC7, 0xF7, 0xFE, 0xDA, 0xD8, 0xB7, 0xF6, 0x03, 0xE0, + 0xB2, 0xE4, 0x99, 0xD5, 0x2F, 0xE8, 0x19, 0xCE, 0x36, 0xF0, 0x7F, 0xCC, + 0x59, 0xF5, 0xB1, 0xD4, 0xF1, 0xF0, 0x26, 0xDD, 0xBA, 0xE2, 0xE6, 0xE3, + 0xA1, 0xE3, 0x1D, 0xF9, 0xF8, 0xE0, 0xD6, 0x01, 0xAB, 0xE2, 0x82, 0xFE, + 0xF4, 0xF6, 0xB1, 0x04, 0x86, 0xF4, 0xD2, 0xF9, 0x94, 0xE2, 0x99, 0xE7, + 0x12, 0xE5, 0x4D, 0xF5, 0xF7, 0xF0, 0xC1, 0x0A, 0x1B, 0xF6, 0x69, 0x0E, + 0xDB, 0xF8, 0x6D, 0x0F, 0x98, 0xF3, 0x24, 0x0F, 0x46, 0xF0, 0xD7, 0x0C, + 0x52, 0xF4, 0x28, 0x0D, 0x3B, 0xFD, 0x45, 0x0F, 0x10, 0x09, 0x2A, 0x0B, + 0x54, 0x05, 0x23, 0x03, 0xC9, 0xFB, 0x8A, 0x0C, 0x67, 0x01, 0xC4, 0x1A, + 0xB2, 0x10, 0xA6, 0x16, 0xB2, 0x13, 0xC6, 0x0E, 0x07, 0x1D, 0x88, 0x17, + 0x08, 0x2B, 0x3D, 0x1E, 0xAA, 0x1F, 0x0A, 0x12, 0x5E, 0x1C, 0x62, 0x0D, + 0x96, 0x21, 0x59, 0x12, 0x22, 0x10, 0x62, 0x10, 0x80, 0x08, 0x73, 0x11, + 0xD6, 0x21, 0x64, 0x19, 0xA0, 0x31, 0xAE, 0x17, 0x2E, 0x2E, 0xF9, 0x0D, + 0xAF, 0x35, 0x3A, 0x14, 0x52, 0x3A, 0x97, 0x26, 0x76, 0x31, 0x1D, 0x29, + 0x7C, 0x2C, 0x69, 0x22, 0x87, 0x2D, 0x45, 0x2F, 0x27, 0x29, 0xB7, 0x36, + 0xDE, 0x27, 0x77, 0x23, 0x3C, 0x35, 0xC5, 0x1B, 0xA8, 0x34, 0x28, 0x1B, + 0x6B, 0x1C, 0x97, 0x13, 0x87, 0x0C, 0xD1, 0x18, 0xA9, 0x0A, 0x7B, 0x21, + 0x44, 0x17, 0xB5, 0x23, 0xF1, 0x27, 0x63, 0x28, 0xE9, 0x27, 0x17, 0x2A, + 0xD3, 0x23, 0x69, 0x22, 0x61, 0x21, 0x9A, 0x1E, 0xB8, 0x1A, 0x45, 0x1D, + 0x62, 0x17, 0xA9, 0x13, 0xDE, 0x1F, 0xE8, 0x19, 0x24, 0x27, 0x14, 0x2F, + 0xE1, 0x22, 0xB0, 0x32, 0x2B, 0x1C, 0xCC, 0x2B, 0x44, 0x1C, 0xF7, 0x2D, + 0xFE, 0x1E, 0xBB, 0x2E, 0x5F, 0x1A, 0xC8, 0x2B, 0x12, 0x0C, 0xAB, 0x26, + 0x45, 0x0A, 0x01, 0x28, 0xA0, 0x12, 0xB3, 0x30, 0xE3, 0x10, 0x3D, 0x30, + 0xD2, 0x09, 0xF0, 0x24, 0x62, 0x08, 0x23, 0x1C, 0x58, 0x0A, 0x9B, 0x18, + 0x8F, 0x08, 0xE8, 0x0D, 0x11, 0x0D, 0xC9, 0x05, 0xA7, 0x0C, 0xFE, 0x00, + 0x83, 0x06, 0xA9, 0xF7, 0x2B, 0x12, 0x0F, 0xF9, 0x7E, 0x1C, 0x4E, 0xFF, + 0x25, 0x1B, 0xAB, 0xFD, 0xB4, 0x1A, 0x7C, 0xF5, 0x3B, 0x24, 0xDE, 0xFB, + 0xFF, 0x2C, 0x23, 0x0A, 0x5F, 0x26, 0x35, 0xFF, 0xCB, 0x16, 0x7E, 0xEF, + 0x2C, 0x06, 0x03, 0xF5, 0xB9, 0xF8, 0x67, 0xFC, 0x06, 0xF2, 0x99, 0xF7, + 0xA6, 0xF9, 0x2B, 0xF4, 0x03, 0xFE, 0xB8, 0xEE, 0x62, 0xF2, 0x62, 0xE6, + 0xCB, 0xEC, 0xF3, 0xE6, 0x45, 0xF1, 0x8B, 0xEC, 0x81, 0xE5, 0xBC, 0xE8, + 0x28, 0xDE, 0xE1, 0xE7, 0xA9, 0xE4, 0x87, 0xF0, 0xD9, 0xD8, 0x1A, 0xEF, + 0x40, 0xDC, 0x62, 0xEE, 0x77, 0xF0, 0xB3, 0xF1, 0xFB, 0xF6, 0x63, 0xF7, + 0x7E, 0xF7, 0x0F, 0x06, 0x16, 0xED, 0xCC, 0x08, 0xBB, 0xE5, 0xA6, 0x06, + 0xD7, 0xE6, 0xF2, 0x06, 0xC8, 0xF1, 0xDC, 0x03, 0x6B, 0xFA, 0x00, 0xFF, + 0xCD, 0xED, 0xEF, 0xF5, 0x07, 0xE8, 0xFC, 0xEE, 0x30, 0xF1, 0x85, 0xEE, + 0x80, 0xF6, 0x91, 0xEF, 0xBE, 0xF1, 0xA8, 0xEF, 0xD3, 0xF5, 0x31, 0xF7, + 0x0B, 0x00, 0x62, 0xFF, 0xE2, 0xFC, 0x44, 0xFB, 0xD7, 0xFB, 0x67, 0xF4, + 0x1E, 0xFB, 0xBC, 0xF9, 0x84, 0xEF, 0x3F, 0xFE, 0x6D, 0xF4, 0x63, 0x04, + 0x4A, 0xFF, 0x5A, 0x0D, 0x76, 0xF4, 0x82, 0x0C, 0x5A, 0xEA, 0x6F, 0x16, + 0x7B, 0xF1, 0xCB, 0x1B, 0x24, 0x05, 0x5A, 0x0E, 0x8B, 0x17, 0x58, 0x04, + 0x73, 0x12, 0x04, 0xF9, 0x3F, 0x00, 0x69, 0xF1, 0xFE, 0xF9, 0x16, 0xF8, + 0x15, 0xF6, 0x51, 0x00, 0x6D, 0xF7, 0x03, 0x01, 0xD9, 0x04, 0x41, 0x01, + 0x70, 0x0D, 0x5C, 0xFC, 0x9F, 0x0A, 0xA8, 0xEC, 0x0D, 0x04, 0x95, 0xDE, + 0xBE, 0xFE, 0x20, 0xD9, 0xC9, 0xF3, 0x05, 0xE1, 0xB1, 0xE6, 0xE1, 0xE3, + 0x8C, 0xE9, 0xBA, 0xDF, 0x96, 0xFA, 0xE3, 0xE6, 0x7E, 0x03, 0xDD, 0xEB, + 0xD4, 0xF2, 0x2C, 0xE8, 0x48, 0xDD, 0x96, 0xE6, 0x99, 0xDD, 0xFE, 0xEF, + 0x98, 0xE2, 0x54, 0xF9, 0x82, 0xE3, 0xE4, 0xEC, 0x1B, 0xEA, 0x80, 0xE0, + 0x52, 0xEE, 0xCB, 0xE4, 0x75, 0xE3, 0x35, 0xDD, 0x36, 0xD5, 0x8D, 0xD1, + 0xFC, 0xD1, 0x6F, 0xDB, 0xEE, 0xCA, 0x7F, 0xDF, 0x19, 0xC2, 0xDD, 0xCF, + 0x6F, 0xD0, 0xC2, 0xCB, 0x1B, 0xE5, 0x8D, 0xD4, 0x5A, 0xE0, 0x33, 0xD1, + 0xDA, 0xD4, 0xD5, 0xCB, 0x55, 0xD3, 0xD0, 0xD1, 0xB6, 0xDA, 0x3C, 0xD9, + 0xD8, 0xE2, 0x05, 0xD6, 0xDC, 0xE5, 0xFB, 0xC9, 0xEC, 0xEA, 0xA7, 0xCA, + 0xC2, 0xE6, 0x05, 0xD1, 0x80, 0xE2, 0x96, 0xDC, 0xBB, 0xE4, 0xDA, 0xEA, + 0x93, 0xE2, 0x47, 0xEA, 0xFE, 0xDF, 0xE7, 0xEE, 0xDF, 0xDF, 0x7B, 0xF5, + 0xA8, 0xE8, 0xF8, 0xF7, 0x8E, 0xF2, 0x7F, 0xF5, 0x32, 0xF6, 0xB1, 0xEC, + 0xED, 0xF3, 0xAE, 0xE9, 0xE1, 0xEE, 0x0D, 0xF0, 0x9B, 0xE6, 0x69, 0xF8, + 0x7F, 0xE3, 0x2B, 0xFA, 0xF2, 0xE9, 0xAD, 0xFD, 0x7F, 0xEC, 0x45, 0x01, + 0x94, 0xF1, 0x04, 0x04, 0xF6, 0xF5, 0xCC, 0x09, 0xC6, 0xF2, 0x9F, 0x04, + 0x81, 0xF5, 0x88, 0x00, 0x5B, 0xF2, 0xD2, 0x02, 0xB9, 0xE4, 0xD8, 0x01, + 0xEC, 0xE7, 0x9F, 0x06, 0x40, 0x00, 0x4F, 0x10, 0x20, 0x14, 0xD8, 0x14, + 0xA4, 0x1D, 0xE4, 0x10, 0xD6, 0x20, 0x7E, 0x13, 0x52, 0x1A, 0x59, 0x1B, + 0x0C, 0x15, 0x65, 0x17, 0xE1, 0x11, 0x64, 0x0D, 0x97, 0x15, 0xC9, 0x0D, + 0xF3, 0x20, 0xC9, 0x19, 0x17, 0x23, 0x77, 0x1E, 0x74, 0x2C, 0xB3, 0x18, + 0xB4, 0x3B, 0xB0, 0x19, 0x64, 0x30, 0xA2, 0x1D, 0x92, 0x1A, 0xC3, 0x21, + 0xE9, 0x1C, 0x75, 0x2B, 0x57, 0x31, 0x82, 0x2C, 0x9B, 0x3E, 0xDC, 0x25, + 0xAF, 0x3A, 0xBF, 0x20, 0xB5, 0x29, 0x81, 0x1C, 0x7C, 0x17, 0xAD, 0x13, + 0x44, 0x1D, 0x4F, 0x0D, 0x13, 0x2A, 0x24, 0x13, 0x5B, 0x1A, 0x21, 0x1C, + 0x55, 0x17, 0xD0, 0x26, 0x13, 0x22, 0x6F, 0x23, 0xD3, 0x26, 0x1A, 0x19, + 0x71, 0x35, 0x93, 0x15, 0xB5, 0x33, 0x5D, 0x12, 0xC0, 0x1E, 0x12, 0x15, + 0xB8, 0x0D, 0x22, 0x10, 0x7E, 0x10, 0x2B, 0x0B, 0x77, 0x1F, 0xF8, 0x15, + 0x1D, 0x1E, 0x62, 0x1C, 0x72, 0x12, 0xFE, 0x16, 0xCA, 0x13, 0x5A, 0x15, + 0xFA, 0x18, 0xF0, 0x17, 0x31, 0x08, 0xEF, 0x10, 0x35, 0xEF, 0xDB, 0x12, + 0xAF, 0xE9, 0xED, 0x25, 0x46, 0xED, 0x0B, 0x2A, 0xFB, 0xFE, 0x90, 0x25, + 0xFE, 0x14, 0x66, 0x28, 0xE0, 0x0D, 0xE4, 0x26, 0x73, 0xF6, 0x89, 0x14, + 0xE8, 0xF8, 0xB8, 0x07, 0xD2, 0x13, 0xF5, 0x14, 0x38, 0x12, 0xF4, 0x15, + 0x74, 0x05, 0xAF, 0x09, 0xE3, 0x0C, 0x1A, 0x0B, 0x63, 0x13, 0xAE, 0x0B, + 0x97, 0x22, 0x37, 0x09, 0x25, 0x2F, 0x1C, 0xFE, 0xC6, 0x27, 0xAB, 0xF0, + 0x57, 0x20, 0x37, 0xF5, 0xD8, 0x1C, 0x8B, 0xF3, 0x01, 0x18, 0x68, 0xEF, + 0xEF, 0x08, 0xFD, 0xF3, 0x68, 0x04, 0x77, 0xF8, 0x98, 0x06, 0x54, 0xF3, + 0xD3, 0xFF, 0xED, 0xE9, 0x11, 0x0B, 0x70, 0xEF, 0x2B, 0x11, 0x1C, 0xF1, + 0xDC, 0xF7, 0xC2, 0xE7, 0xE0, 0xE1, 0x87, 0xE9, 0x72, 0xE7, 0xE8, 0xF5, + 0xCA, 0xEE, 0x3B, 0xF8, 0x06, 0xF3, 0xB3, 0xF6, 0x70, 0xFC, 0x7A, 0x02, + 0x0F, 0xF0, 0xE4, 0xFD, 0x64, 0xE4, 0x79, 0xF1, 0x87, 0xF2, 0x52, 0x01, + 0x4B, 0xF0, 0x2E, 0x08, 0x20, 0xDC, 0x71, 0xF7, 0xDE, 0xD5, 0xEC, 0xF2, + 0x95, 0xD8, 0x35, 0xF9, 0xEF, 0xE1, 0xBD, 0xFE, 0x12, 0xEB, 0x60, 0x00, + 0x4F, 0xDE, 0x3E, 0xF5, 0xE9, 0xDC, 0x12, 0xF3, 0xD3, 0xEF, 0xB4, 0xF7, + 0x77, 0xEF, 0x6C, 0xF3, 0x52, 0xF3, 0x62, 0xF7, 0xE3, 0xFA, 0x9E, 0xF8, + 0xDB, 0xF3, 0xDD, 0xF7, 0x63, 0xFF, 0x1A, 0x08, 0xEA, 0x19, 0x54, 0x11, + 0xDC, 0x21, 0x64, 0x0A, 0x7B, 0x17, 0x4D, 0x08, 0x3C, 0xFF, 0x49, 0x09, + 0xF1, 0xED, 0x35, 0x13, 0xE9, 0xF7, 0xCC, 0x1D, 0xE5, 0xFD, 0x57, 0x1A, + 0x8A, 0xFC, 0x5C, 0x12, 0x5D, 0x05, 0xD5, 0x07, 0x87, 0x0C, 0xDE, 0xFF, + 0x09, 0x05, 0x1D, 0xEA, 0x9F, 0xFB, 0x74, 0xDB, 0x90, 0xEE, 0x84, 0xE6, + 0xAB, 0xE3, 0x35, 0xEF, 0x5A, 0xF1, 0xF2, 0xF1, 0x4B, 0x06, 0xC3, 0xF4, + 0x36, 0x07, 0xF4, 0xEE, 0x25, 0xF9, 0x88, 0xEA, 0x82, 0xEF, 0x6F, 0xEF, + 0x9F, 0xE7, 0x93, 0xE7, 0xA3, 0xE6, 0xB1, 0xDE, 0x2A, 0xF5, 0x09, 0xE2, + 0x48, 0xFC, 0xA1, 0xDE, 0xFE, 0xF8, 0x56, 0xE4, 0x3C, 0xF4, 0xDE, 0xEF, + 0x38, 0xEC, 0xBF, 0xF1, 0x0C, 0xE4, 0xEE, 0xF2, 0xCE, 0xD5, 0x0E, 0xEE, + 0x34, 0xD3, 0x7F, 0xE4, 0xE7, 0xE4, 0x8C, 0xE2, 0x48, 0xEE, 0x53, 0xE7, + 0xF9, 0xF0, 0x36, 0xE7, 0x60, 0xF0, 0x76, 0xE9, 0xFA, 0xDD, 0xEE, 0xE9, + 0x59, 0xD5, 0x81, 0xE7, 0x73, 0xDC, 0x0F, 0xE5, 0xE0, 0xDF, 0x37, 0xDB, + 0x34, 0xDD, 0x53, 0xD7, 0x62, 0xDA, 0x4C, 0xD9, 0xD4, 0xE4, 0x01, 0xDA, + 0x1F, 0xEE, 0xD6, 0xDB, 0x02, 0xF1, 0x33, 0xE3, 0xB6, 0xEB, 0x30, 0xE0, + 0xD1, 0xE1, 0x23, 0xD2, 0xC3, 0xE6, 0x8C, 0xCF, 0x38, 0xF4, 0x1F, 0xD1, + 0xAF, 0xF8, 0xEA, 0xD2, 0x5A, 0xF1, 0xC1, 0xDB, 0x5F, 0xE7, 0xC5, 0xE5, + 0x2C, 0xE1, 0xBD, 0xE8, 0x34, 0xDF, 0xD3, 0xE3, 0x15, 0xE0, 0x92, 0xE1, + 0x69, 0xDF, 0x6C, 0xEA, 0xDE, 0xE0, 0x80, 0xF2, 0xE4, 0xEF, 0xA5, 0xF5, + 0xC6, 0xF1, 0x2C, 0xF2, 0x1F, 0xEB, 0xDD, 0xF0, 0x12, 0xEB, 0x9A, 0xF9, + 0x69, 0xDD, 0x2E, 0xFD, 0x07, 0xDA, 0xF5, 0xF7, 0xF4, 0xEA, 0x8A, 0xFC, + 0xC8, 0xF0, 0xB5, 0x08, 0x1A, 0xEB, 0x7C, 0x05, 0x20, 0xEC, 0xF1, 0xFF, + 0x33, 0xEA, 0xE9, 0x03, 0xE1, 0xEB, 0x8F, 0x0C, 0x05, 0xF5, 0xFB, 0x0D, + 0xA1, 0xF8, 0xD7, 0x09, 0x76, 0xFB, 0x7C, 0x0A, 0xF7, 0x10, 0xE8, 0x0B, + 0x26, 0x25, 0x30, 0x0A, 0x7B, 0x21, 0xB6, 0x0C, 0xFF, 0x15, 0x8D, 0x17, + 0x69, 0x0D, 0x5E, 0x1F, 0x22, 0x0F, 0x4A, 0x25, 0x10, 0x1E, 0xAE, 0x2B, + 0xB1, 0x32, 0xB4, 0x29, 0x84, 0x3A, 0x52, 0x22, 0x3B, 0x2B, 0x0B, 0x1A, + 0xEE, 0x22, 0x3E, 0x1B, 0x68, 0x30, 0x69, 0x28, 0x43, 0x2C, 0x72, 0x27, + 0xD1, 0x22, 0x1F, 0x25, 0x21, 0x26, 0x54, 0x2F, 0x6C, 0x2B, 0xD0, 0x2A, + 0x6C, 0x35, 0xB0, 0x16, 0x45, 0x32, 0x14, 0x08, 0x10, 0x27, 0xCB, 0x03, + 0xDE, 0x1B, 0x80, 0x05, 0x83, 0x17, 0x16, 0x17, 0xD8, 0x19, 0xF6, 0x24, + 0x26, 0x22, 0x94, 0x1F, 0x17, 0x28, 0x54, 0x18, 0x48, 0x20, 0x99, 0x15, + 0x31, 0x24, 0x17, 0x11, 0x64, 0x29, 0x76, 0x0A, 0x73, 0x22, 0x23, 0x09, + 0xE8, 0x1D, 0x97, 0x12, 0x51, 0x18, 0xB8, 0x23, 0xE6, 0x16, 0x25, 0x2B, + 0x9F, 0x1C, 0xFE, 0x23, 0xE2, 0x1E, 0xBD, 0x1A, 0x66, 0x21, 0x1A, 0x1D, + 0xB2, 0x14, 0x2B, 0x1A, 0xDC, 0x04, 0xB3, 0x11, 0x31, 0x0B, 0xA3, 0x1A, + 0xF0, 0x0F, 0x97, 0x2B, 0x14, 0x05, 0xDB, 0x2C, 0xDC, 0x05, 0xDC, 0x2C, + 0x6F, 0x10, 0xB6, 0x32, 0x14, 0x13, 0x96, 0x27, 0x93, 0x0C, 0xCF, 0x15, + 0x12, 0x07, 0x9B, 0x15, 0x39, 0x04, 0x06, 0x19, 0x85, 0xFF, 0xF0, 0x15, + 0x17, 0x0B, 0x8F, 0x16, 0x75, 0x14, 0x48, 0x15, 0x8C, 0x12, 0x2F, 0x11, + 0x7C, 0x15, 0x2F, 0x09, 0xFE, 0x1B, 0x59, 0xFE, 0x46, 0x22, 0x89, 0xF4, + 0x45, 0x1F, 0x62, 0xEE, 0x68, 0x1C, 0x2F, 0xF0, 0xF1, 0x13, 0x2E, 0xF4, + 0x54, 0x05, 0x49, 0xF4, 0xA5, 0x04, 0x79, 0xEA, 0xE9, 0x09, 0xB9, 0xE2, + 0x9D, 0x0A, 0xEC, 0xE6, 0xE4, 0x09, 0x9D, 0xEA, 0x96, 0x09, 0x2A, 0xEC, + 0xBC, 0x01, 0x0C, 0xF2, 0x03, 0xF8, 0x21, 0xFB, 0x4F, 0xF2, 0x04, 0xFB, + 0x90, 0xF0, 0x21, 0xF6, 0x90, 0xEF, 0x06, 0xF6, 0xAF, 0xEA, 0x32, 0xF3, + 0x85, 0xF1, 0xAD, 0xF8, 0x4D, 0xF3, 0xFF, 0xFB, 0xF4, 0xE8, 0xFD, 0xFB, + 0xD9, 0xEA, 0xCE, 0x03, 0xED, 0xF4, 0x35, 0x08, 0xF4, 0xF2, 0x84, 0x0A, + 0x1B, 0xEA, 0x88, 0x09, 0x1A, 0xE8, 0x01, 0x08, 0xFA, 0xE8, 0x22, 0x0E, + 0x7A, 0xEA, 0xE5, 0x0D, 0x69, 0xF6, 0x67, 0x06, 0xE4, 0xFD, 0xE6, 0x00, + 0x18, 0xF3, 0x05, 0xF9, 0x86, 0xEF, 0x7C, 0xF6, 0xC2, 0xFE, 0x0A, 0x01, + 0x05, 0x0D, 0x29, 0x06, 0x01, 0x11, 0xFE, 0xFF, 0xC7, 0x11, 0x83, 0xF9, + 0xB7, 0x06, 0x90, 0xF5, 0xCF, 0xFD, 0xF9, 0xFA, 0x84, 0xFA, 0x4A, 0x02, + 0x09, 0xE8, 0x70, 0x09, 0xE9, 0xE4, 0x6F, 0x16, 0x29, 0xF6, 0x47, 0x18, + 0xEB, 0x06, 0xF7, 0x0B, 0x3C, 0x13, 0x99, 0x02, 0xE9, 0x0A, 0xE5, 0xF9, + 0x5B, 0xFE, 0x59, 0xFA, 0xE7, 0xF4, 0xDD, 0x02, 0x14, 0xF2, 0x87, 0xFF, + 0x94, 0xFA, 0x5D, 0xF3, 0x09, 0xFC, 0xE6, 0xE4, 0xB4, 0x01, 0xC1, 0xE4, + 0xB7, 0xFA, 0xF5, 0xEE, 0x3D, 0xEB, 0x7A, 0xF0, 0xCA, 0xED, 0xDD, 0xE9, + 0x08, 0xEE, 0x99, 0xE2, 0x74, 0xE9, 0xA0, 0xE5, 0x07, 0xEF, 0x30, 0xE4, + 0xA8, 0xFE, 0x8A, 0xE0, 0x1A, 0xFF, 0xD7, 0xEB, 0xA8, 0xEC, 0x63, 0xF4, + 0xB2, 0xDF, 0x00, 0xF2, 0x62, 0xE0, 0xC1, 0xF2, 0xD4, 0xE6, 0x0D, 0xF4, + 0x34, 0xED, 0x63, 0xF1, 0xE1, 0xEA, 0x4E, 0xF2, 0x69, 0xE7, 0xCB, 0xF7, + 0x26, 0xF1, 0x2E, 0xF5, 0x6E, 0xF6, 0x1E, 0xE8, 0xB0, 0xF1, 0x62, 0xE5, + 0x2F, 0xE8, 0xDE, 0xEF, 0x1A, 0xDF, 0x94, 0xF4, 0x3E, 0xE4, 0x69, 0xE7, + 0x56, 0xF1, 0xAC, 0xDB, 0x17, 0xF2, 0x06, 0xDA, 0x3B, 0xE5, 0x15, 0xD8, + 0x48, 0xDE, 0x4F, 0xD5, 0x16, 0xE1, 0xF9, 0xD0, 0x97, 0xE2, 0x53, 0xCD, + 0xE3, 0xE0, 0x08, 0xCA, 0x20, 0xE1, 0xA1, 0xC7, 0xB7, 0xE8, 0x89, 0xCF, + 0xB1, 0xF5, 0x19, 0xDA, 0x7E, 0xF4, 0xE8, 0xD5, 0xE1, 0xEB, 0x81, 0xD9, + 0xCA, 0xDF, 0x63, 0xE5, 0x0C, 0xD0, 0x0D, 0xE7, 0xC7, 0xDE, 0x2B, 0xEC, + 0x55, 0xF3, 0x0D, 0xEE, 0x0A, 0xF1, 0x7A, 0xEA, 0x71, 0xEA, 0xD8, 0xEB, + 0xDC, 0xEC, 0xFA, 0xEF, 0x5E, 0xF3, 0x76, 0xF2, 0x4C, 0xED, 0x22, 0xF8, + 0xB9, 0xE5, 0xB1, 0x04, 0xEB, 0xE2, 0x1A, 0x0A, 0xF6, 0xE6, 0x5E, 0x03, + 0x6A, 0xF0, 0x69, 0xFC, 0x75, 0xF1, 0xDE, 0xF7, 0x87, 0xEA, 0x18, 0xFC, + 0xEE, 0xDA, 0xE5, 0x03, 0x9A, 0xDB, 0x64, 0x0D, 0x9D, 0xEB, 0xCC, 0x10, + 0xF7, 0xFC, 0x25, 0x13, 0xA1, 0x0E, 0x58, 0x22, 0xB3, 0x11, 0x6A, 0x20, + 0x0D, 0x15, 0x58, 0x14, 0xA9, 0x1C, 0x39, 0x11, 0x3D, 0x1F, 0xA3, 0x0F, + 0x12, 0x19, 0x22, 0x0D, 0xA3, 0x0F, 0xB6, 0x12, 0x31, 0x0C, 0x80, 0x18, + 0x28, 0x19, 0xD1, 0x16, 0x4F, 0x2A, 0xDF, 0x11, 0xEC, 0x27, 0x16, 0x04, + 0xC7, 0x1E, 0x76, 0xFF, 0x4B, 0x1A, 0xE9, 0x0D, 0x84, 0x22, 0x3B, 0x22, + 0x42, 0x26, 0x68, 0x2A, 0x45, 0x1E, 0xAA, 0x29, 0x9F, 0x20, 0x9C, 0x22, + 0x5C, 0x27, 0x11, 0x14, 0x0F, 0x2B, 0x97, 0x14, 0xFE, 0x24, 0x66, 0x1D, + 0x59, 0x19, 0x86, 0x1B, 0xD8, 0x18, 0xDB, 0x1D, 0x91, 0x1D, 0x81, 0x29, + 0xAB, 0x29, 0x62, 0x30, 0x84, 0x2F, 0xBB, 0x21, 0xDC, 0x2D, 0x97, 0x12, + 0x6A, 0x2A, 0xC6, 0x11, 0x3B, 0x25, 0x04, 0x0D, 0xD9, 0x24, 0xC2, 0x14, + 0x54, 0x1F, 0x94, 0x1B, 0x98, 0x1D, 0xD2, 0x17, 0xEF, 0x27, 0xC6, 0x1E, + 0xF2, 0x2B, 0xD7, 0x1F, 0x74, 0x26, 0x23, 0x1C, 0x99, 0x25, 0x31, 0x1B, + 0xDD, 0x21, 0x6E, 0x16, 0xC7, 0x16, 0x20, 0x1D, 0xAB, 0x0D, 0xED, 0x2F, + 0x01, 0x12, 0xCA, 0x3A, 0x19, 0x1E, 0x6E, 0x36, 0x40, 0x21, 0x10, 0x33, + 0x9E, 0x19, 0x63, 0x32, 0xB2, 0x11, 0x05, 0x2C, 0x5A, 0x0A, 0x87, 0x23, + 0x80, 0x07, 0xED, 0x15, 0x78, 0x08, 0xF4, 0x0C, 0x56, 0x06, 0x28, 0x13, + 0x9B, 0x03, 0xB8, 0x19, 0x48, 0x05, 0x56, 0x17, 0x2B, 0x10, 0x9A, 0x10, + 0x10, 0x17, 0x03, 0x03, 0x95, 0x18, 0x6A, 0xF5, 0xF2, 0x14, 0x60, 0xF1, + 0x3D, 0x0D, 0x06, 0xF0, 0xBC, 0x0E, 0x1C, 0xF0, 0xDB, 0x0F, 0xC2, 0xF4, + 0x8B, 0x08, 0x3E, 0xF4, 0xF4, 0x03, 0x9F, 0xEB, 0x23, 0x01, 0xBA, 0xE2, + 0xB1, 0x00, 0x3F, 0xE6, 0x0B, 0xFE, 0x75, 0xEA, 0xD0, 0xF8, 0x3D, 0xEF, + 0x19, 0xF7, 0xF9, 0xF7, 0xAA, 0xFE, 0x4F, 0xF6, 0x24, 0x01, 0x9A, 0xF2, + 0x7E, 0xF9, 0x95, 0xF6, 0x60, 0xFC, 0xA0, 0xFF, 0xBD, 0xFA, 0xBC, 0xFD, + 0x41, 0xF9, 0x9F, 0xFC, 0x86, 0x00, 0xC0, 0x03, 0xBE, 0xFC, 0x45, 0xFF, + 0x3E, 0xF5, 0x1F, 0xFC, 0x5E, 0xF1, 0xD0, 0xFD, 0x89, 0xE8, 0xEC, 0xFC, + 0x31, 0xE4, 0x11, 0x08, 0xD2, 0xE6, 0x76, 0x0F, 0x29, 0xED, 0x18, 0x05, + 0x43, 0xF2, 0x34, 0xFC, 0x7B, 0xEF, 0xDE, 0xFF, 0xD8, 0xEC, 0x81, 0x03, + 0x8C, 0xEB, 0xEC, 0xFC, 0xDA, 0xED, 0x4E, 0xFB, 0x5B, 0xF4, 0x78, 0x00, + 0x7A, 0x01, 0x8B, 0x03, 0x85, 0x13, 0xA7, 0x04, 0x6A, 0x1D, 0x99, 0xFD, + 0x54, 0x15, 0x9E, 0xF9, 0xC3, 0x00, 0xDA, 0x06, 0x78, 0xEE, 0x51, 0x10, + 0xDB, 0xE8, 0xBA, 0x12, 0x0A, 0xF2, 0x47, 0x13, 0x72, 0xFD, 0x1F, 0x08, + 0x3F, 0x00, 0x77, 0xFE, 0x0B, 0xFE, 0xFF, 0x04, 0x3A, 0xFC, 0xEE, 0x08, + 0xF8, 0xF2, 0x61, 0xFB, 0xC3, 0xE4, 0xCE, 0xF1, 0xBE, 0xE5, 0xB1, 0xF0, + 0xAD, 0xEE, 0xD4, 0xE8, 0x34, 0xF5, 0x0C, 0xEA, 0x6D, 0xF6, 0x58, 0xF4, + 0x5C, 0xF2, 0x91, 0xF3, 0xA5, 0xF4, 0x4D, 0xE9, 0xCC, 0xF7, 0x2C, 0xE2, + 0xBB, 0xF9, 0xEB, 0xE1, 0xD9, 0xF8, 0x5B, 0xDF, 0xD7, 0xF6, 0x23, 0xDF, + 0xCD, 0xFA, 0xE8, 0xE4, 0xB3, 0xFE, 0xC9, 0xE7, 0x03, 0x04, 0x3D, 0xEE, + 0xC1, 0xFA, 0x69, 0xF1, 0xA1, 0xE8, 0xDE, 0xE9, 0x69, 0xEA, 0x4D, 0xED, + 0xB6, 0xEC, 0xF5, 0xF3, 0xD2, 0xE8, 0xEB, 0xF2, 0xF9, 0xE7, 0xEA, 0xED, + 0x5B, 0xEA, 0x00, 0xEB, 0xD9, 0xEB, 0x14, 0xF1, 0x13, 0xE8, 0x03, 0xF1, + 0x95, 0xE3, 0x36, 0xEB, 0x0F, 0xD8, 0x5E, 0xE2, 0xAC, 0xD2, 0x38, 0xDF, + 0x45, 0xE1, 0xFE, 0xEB, 0x8B, 0xEC, 0xFE, 0xEE, 0x95, 0xE1, 0x09, 0xE2, + 0x51, 0xD7, 0x08, 0xDC, 0xDB, 0xD9, 0xBC, 0xD8, 0xC3, 0xDE, 0x47, 0xD2, + 0x66, 0xE0, 0x67, 0xD0, 0x30, 0xEB, 0x08, 0xD4, 0xAF, 0xF8, 0x42, 0xD7, + 0xC4, 0xEF, 0xC9, 0xD7, 0xE4, 0xE6, 0xD5, 0xD6, 0xC7, 0xEF, 0x34, 0xD6, + 0x66, 0xEA, 0x49, 0xD6, 0xE9, 0xD3, 0xA8, 0xD8, 0xE5, 0xCC, 0x23, 0xDF, + 0xF8, 0xDC, 0xB2, 0xE0, 0xBA, 0xF0, 0x2A, 0xDC, 0x5D, 0xF7, 0x34, 0xDD, + 0x4F, 0xF4, 0x6F, 0xEC, 0x63, 0xE9, 0xA2, 0xF7, 0xF2, 0xE0, 0xAE, 0xF4, + 0xA1, 0xEA, 0x43, 0xF2, 0xD9, 0xF7, 0xBB, 0xF4, 0x40, 0xF2, 0x53, 0xF9, + 0xAB, 0xE7, 0x10, 0xFA, 0xCD, 0xEE, 0x30, 0xFA, 0xA1, 0xF4, 0xEC, 0xF7, + 0x7E, 0xED, 0xA4, 0xF8, 0x84, 0xE5, 0x1E, 0x05, 0x5B, 0xDE, 0x44, 0x12, + 0xE3, 0xE6, 0x03, 0x16, 0x27, 0xF9, 0x63, 0x13, 0x02, 0xFE, 0x3A, 0x07, + 0x1B, 0xF9, 0x27, 0xFF, 0x36, 0xFB, 0xDD, 0x08, 0x89, 0x05, 0x4C, 0x0E, + 0xA8, 0x0B, 0x76, 0x0F, 0x0C, 0x0E, 0xA6, 0x18, 0x82, 0x0B, 0x13, 0x1B, + 0x30, 0x12, 0xB1, 0x11, 0x76, 0x22, 0xEB, 0x10, 0x74, 0x24, 0x1A, 0x15, + 0xF3, 0x20, 0xEC, 0x1B, 0x01, 0x19, 0xAD, 0x2A, 0xE0, 0x12, 0xCA, 0x2A, + 0x9F, 0x22, 0xC4, 0x23, 0x17, 0x33, 0xDB, 0x22, 0x38, 0x33, 0xAA, 0x1D, + 0x15, 0x2D, 0xFA, 0x18, 0xCE, 0x22, 0x2E, 0x0F, 0xF9, 0x19, 0xAA, 0x06, + 0xFD, 0x22, 0x5F, 0x10, 0xC5, 0x28, 0x31, 0x1E, 0xC3, 0x28, 0x26, 0x29, + 0xD0, 0x30, 0x20, 0x25, 0xA7, 0x30, 0x3C, 0x13, 0x20, 0x35, 0x88, 0x10, + 0x08, 0x39, 0x22, 0x18, 0x18, 0x28, 0x88, 0x17, 0xBF, 0x1A, 0x9D, 0x17, + 0x9F, 0x20, 0xE9, 0x1F, 0x15, 0x2B, 0x06, 0x27, 0xC9, 0x34, 0x00, 0x2D, + 0xCE, 0x39, 0xB8, 0x24, 0x96, 0x2E, 0x26, 0x16, 0x9A, 0x23, 0x66, 0x1B, + 0x2B, 0x21, 0x85, 0x24, 0xCA, 0x1A, 0xC2, 0x27, 0x72, 0x18, 0x50, 0x2F, + 0xAE, 0x17, 0xE6, 0x33, 0x95, 0x1A, 0x60, 0x38, 0xA8, 0x22, 0xFE, 0x44, + 0xB2, 0x1D, 0xC3, 0x3F, 0x61, 0x10, 0x2C, 0x2C, 0x83, 0x06, 0xDA, 0x21, + 0x84, 0x02, 0x53, 0x1F, 0x46, 0x09, 0xE5, 0x24, 0x00, 0x0E, 0x74, 0x2A, + 0xC9, 0x04, 0x26, 0x24, 0x80, 0x03, 0x39, 0x19, 0x55, 0x10, 0xA2, 0x10, + 0x22, 0x18, 0x8C, 0x08, 0x82, 0x1C, 0x4C, 0x05, 0xA4, 0x19, 0x2D, 0x04, + 0x24, 0x0D, 0xD1, 0x02, 0x82, 0x0D, 0xF2, 0xFB, 0x7F, 0x15, 0x89, 0xEA, + 0xF6, 0x12, 0x8C, 0xDF, 0xCD, 0x07, 0x50, 0xDE, 0x28, 0xF7, 0x35, 0xDA, + 0xC6, 0xFA, 0x2D, 0xDE, 0x1B, 0x0D, 0xFE, 0xE5, 0x7A, 0x0B, 0xD5, 0xE0, + 0x05, 0x01, 0x69, 0xDF, 0xA3, 0x01, 0x1C, 0xE8, 0xBA, 0x01, 0x4B, 0xEB, + 0x7F, 0xF5, 0x95, 0xE7, 0x34, 0xF0, 0xC8, 0xEB, 0xDE, 0xEC, 0x23, 0xF5, + 0xFC, 0xEB, 0x4C, 0xFE, 0x5B, 0xFA, 0x99, 0x03, 0xAE, 0x00, 0xB7, 0x01, + 0x23, 0xFB, 0x60, 0x04, 0xBA, 0xF1, 0x58, 0x08, 0xD5, 0xE9, 0x1D, 0x0E, + 0x91, 0xE9, 0xDE, 0x11, 0xF6, 0xED, 0xAD, 0x0C, 0x3D, 0xF4, 0x2C, 0x09, + 0x4C, 0xF2, 0x23, 0x0D, 0x41, 0xEB, 0x1C, 0x13, 0x93, 0xE8, 0x8C, 0x13, + 0xF0, 0xEC, 0x8A, 0x13, 0x01, 0xF8, 0x8A, 0x15, 0xB0, 0xFC, 0x61, 0x0C, + 0x17, 0x01, 0x12, 0xFF, 0x6C, 0x0A, 0xAE, 0xF5, 0xA0, 0x11, 0x49, 0xF6, + 0x39, 0x0D, 0xAA, 0x00, 0x00, 0xFF, 0x35, 0x09, 0x1A, 0xF7, 0x7C, 0x0D, + 0xA9, 0xFA, 0x22, 0x07, 0x07, 0x07, 0x5A, 0x02, 0x9F, 0x09, 0x9C, 0x06, + 0x03, 0x03, 0x93, 0x0F, 0xC1, 0xFE, 0x63, 0x0E, 0x2A, 0x00, 0xFB, 0xFC, + 0xB5, 0x03, 0x90, 0xF4, 0x23, 0x01, 0x54, 0xF3, 0xF7, 0x01, 0x6B, 0xF5, + 0x30, 0x00, 0xE5, 0xFB, 0xD3, 0xF9, 0x7E, 0xFB, 0x9D, 0xFD, 0x58, 0xF7, + 0x80, 0x00, 0x6B, 0xEE, 0x0A, 0xFB, 0xBA, 0xE9, 0x79, 0xF7, 0x8F, 0xE8, + 0xFC, 0xF8, 0x20, 0xE1, 0xA7, 0xF4, 0x59, 0xDA, 0xBE, 0xF2, 0x66, 0xDE, + 0x9F, 0xF9, 0x53, 0xEA, 0xF2, 0xF5, 0x8A, 0xEF, 0x5A, 0xF3, 0xAA, 0xF1, + 0x0D, 0xF3, 0x00, 0xF1, 0xD8, 0xE6, 0xEF, 0xEF, 0xA6, 0xDC, 0x7C, 0xF2, + 0xDA, 0xD9, 0xA3, 0xED, 0xA1, 0xE0, 0xD1, 0xEA, 0xB4, 0xEB, 0x83, 0xEF, + 0x3D, 0xEC, 0xA0, 0xF0, 0x91, 0xE3, 0x92, 0xEF, 0x8A, 0xD7, 0xCE, 0xED, + 0x84, 0xD7, 0x0A, 0xEA, 0x45, 0xDD, 0x4E, 0xE3, 0x47, 0xE0, 0xA2, 0xE3, + 0x2B, 0xE0, 0x88, 0xE8, 0x8D, 0xD7, 0x8F, 0xE6, 0x0B, 0xD5, 0xA3, 0xDC, + 0xE9, 0xD9, 0xC1, 0xD2, 0x81, 0xDC, 0xC7, 0xD0, 0xE0, 0xDA, 0x81, 0xCF, + 0x55, 0xDB, 0xF1, 0xC9, 0x9E, 0xE4, 0x3C, 0xC3, 0xB9, 0xF0, 0x80, 0xC2, + 0x08, 0xF5, 0x14, 0xC7, 0x80, 0xEA, 0x73, 0xCA, 0x26, 0xDD, 0xB2, 0xD4, + 0x37, 0xDC, 0xD8, 0xDE, 0x96, 0xE3, 0xAE, 0xDA, 0x50, 0xEB, 0x06, 0xDC, + 0x9D, 0xE8, 0xE2, 0xE4, 0x08, 0xE7, 0x29, 0xEB, 0x34, 0xF0, 0xAE, 0xED, + 0x6B, 0xF4, 0xD5, 0xED, 0xB8, 0xF5, 0x5B, 0xF5, 0x39, 0xF5, 0x94, 0xFE, + 0x4C, 0xEE, 0xE0, 0x03, 0x0D, 0xE9, 0xA9, 0x04, 0x46, 0xED, 0xAE, 0xFF, + 0x81, 0xF2, 0x54, 0xFC, 0x4B, 0xE9, 0x0E, 0xF9, 0xA7, 0xDB, 0x64, 0xF7, + 0x5F, 0xD5, 0x74, 0xFE, 0x39, 0xD7, 0xC6, 0x07, 0x9F, 0xDE, 0x9A, 0x0A, + 0x08, 0xEB, 0xBE, 0x0C, 0xFF, 0xF3, 0x44, 0x10, 0x0C, 0xF4, 0x80, 0x0B, + 0x30, 0xFE, 0xD4, 0x07, 0x16, 0x0A, 0x59, 0x0D, 0x71, 0x01, 0xDE, 0x09, + 0xE7, 0xF8, 0x33, 0x04, 0x7B, 0x05, 0x1C, 0x0B, 0x2E, 0x18, 0x2F, 0x08, + 0x36, 0x1F, 0x50, 0xFC, 0x3B, 0x18, 0x54, 0x00, 0x07, 0x0D, 0xAF, 0x0D, + 0x68, 0x0B, 0x56, 0x10, 0xF8, 0x12, 0x76, 0x08, 0x8A, 0x15, 0x93, 0x06, + 0xD5, 0x18, 0x96, 0x0E, 0x0C, 0x1F, 0x75, 0x11, 0xD0, 0x1F, 0xA4, 0x07, + 0x4B, 0x24, 0x68, 0x00, 0x19, 0x23, 0xB3, 0x04, 0xEE, 0x14, 0x83, 0x0B, + 0x90, 0x0F, 0x9A, 0x15, 0xEF, 0x13, 0x37, 0x1F, 0xBD, 0x1A, 0xB0, 0x25, + 0xC6, 0x28, 0x06, 0x28, 0x04, 0x30, 0xA1, 0x20, 0xE9, 0x2D, 0x24, 0x1D, + 0x65, 0x27, 0x97, 0x1D, 0x55, 0x21, 0x08, 0x1E, 0xBC, 0x22, 0xDB, 0x27, + 0x6C, 0x20, 0xC6, 0x2B, 0x67, 0x26, 0xD9, 0x24, 0xC7, 0x32, 0x22, 0x21, + 0x25, 0x33, 0x18, 0x1F, 0xB5, 0x2B, 0x4A, 0x1D, 0x57, 0x22, 0x97, 0x1A, + 0xDA, 0x17, 0x9B, 0x16, 0x92, 0x0C, 0x42, 0x17, 0x4A, 0x0F, 0x40, 0x22, + 0x51, 0x1E, 0xDF, 0x33, 0x3E, 0x27, 0xF1, 0x39, 0xAF, 0x25, 0x29, 0x32, + 0x80, 0x24, 0xF9, 0x2E, 0x75, 0x22, 0xE9, 0x2E, 0x0B, 0x18, 0x10, 0x29, + 0x56, 0x0E, 0x38, 0x23, 0x1F, 0x0C, 0x43, 0x23, 0x25, 0x0C, 0xE6, 0x1F, + 0x1D, 0x0F, 0x2B, 0x1B, 0xDA, 0x10, 0xBD, 0x12, 0x8D, 0x10, 0x17, 0x06, + 0xED, 0x0C, 0xE1, 0xFF, 0x9D, 0x01, 0x42, 0xFE, 0x17, 0x02, 0x60, 0x01, + 0xE6, 0x0F, 0xF1, 0xF6, 0x80, 0x15, 0xC4, 0xE7, 0x91, 0x0D, 0x6F, 0xEA, + 0xE6, 0x03, 0x51, 0xEC, 0x2E, 0x04, 0x0B, 0xE9, 0x48, 0x05, 0x22, 0xEA, + 0x77, 0xFF, 0xCC, 0xEC, 0x0E, 0x01, 0xCD, 0xF0, 0x63, 0x04, 0x41, 0xF2, + 0x68, 0x09, 0x8D, 0xF2, 0x2E, 0x0D, 0x68, 0xF1, 0xB3, 0x02, 0x86, 0xF1, + 0x9E, 0xF6, 0x97, 0xF7, 0xB6, 0xF2, 0x6F, 0xFB, 0xCD, 0xF3, 0x7F, 0xF7, + 0x7C, 0xF6, 0x1C, 0xF1, 0xB8, 0xF7, 0x2D, 0xF6, 0xB1, 0xEF, 0xD2, 0x03, + 0x1B, 0xEB, 0x47, 0x06, 0x16, 0xF4, 0x1D, 0xFF, 0x44, 0xF7, 0x36, 0xFF, + 0x54, 0xF0, 0x8F, 0x04, 0xAC, 0xEF, 0xEA, 0x03, 0x59, 0xEF, 0xDA, 0x01, + 0x8C, 0xE3, 0x23, 0x09, 0xCC, 0xE0, 0xAC, 0x13, 0xC4, 0xE7, 0xC2, 0x13, + 0x95, 0xE5, 0xAC, 0x07, 0x25, 0xEF, 0x81, 0xFD, 0x88, 0x03, 0x1C, 0xFA, + 0x9F, 0x07, 0xBD, 0xF7, 0x8D, 0x05, 0x69, 0xF8, 0x5A, 0x06, 0x65, 0xFC, + 0x44, 0x09, 0x04, 0xFF, 0xE7, 0x0B, 0x65, 0xF8, 0x39, 0x09, 0xD2, 0xF4, + 0x8B, 0xFD, 0x72, 0xFD, 0x9A, 0xF1, 0x47, 0x07, 0x99, 0xF8, 0xC5, 0x0D, + 0xB6, 0x04, 0x82, 0x15, 0x8F, 0xFF, 0x96, 0x10, 0x28, 0xFB, 0x0F, 0x03, + 0xBF, 0xFE, 0xF3, 0x06, 0x2F, 0x00, 0x66, 0x0D, 0x9D, 0x04, 0xFD, 0x0B, + 0xAD, 0x07, 0xE7, 0x08, 0x80, 0x07, 0x26, 0x08, 0xAF, 0x06, 0x56, 0x0A, + 0x19, 0x07, 0x58, 0x04, 0x42, 0x08, 0x64, 0xFB, 0xAC, 0x01, 0x1A, 0xF2, + 0x2B, 0xF6, 0xBB, 0xEC, 0x4E, 0xF6, 0x4F, 0xF0, 0xD3, 0x04, 0x16, 0xED, + 0xA5, 0x0F, 0xB3, 0xE6, 0x42, 0x05, 0x69, 0xE4, 0x6F, 0xF5, 0xD5, 0xE7, + 0xC1, 0xF0, 0x58, 0xE9, 0x75, 0xEC, 0x99, 0xE5, 0xC4, 0xE9, 0xB7, 0xE1, + 0xF2, 0xE7, 0x35, 0xDF, 0x85, 0xDF, 0x7D, 0xE1, 0xB8, 0xDB, 0x66, 0xDE, + 0xB8, 0xE4, 0xEB, 0xDB, 0xD5, 0xE4, 0x4B, 0xDB, 0x4A, 0xD7, 0x3D, 0xDC, + 0x0B, 0xD1, 0xEB, 0xDD, 0x25, 0xD7, 0x8B, 0xDA, 0x54, 0xE5, 0x00, 0xDC, + 0xD8, 0xE5, 0x68, 0xDF, 0x50, 0xD6, 0xE1, 0xDE, 0xC5, 0xCC, 0x19, 0xDA, + 0x5E, 0xC9, 0xD1, 0xD3, 0x11, 0xD0, 0xF5, 0xD4, 0x7E, 0xDB, 0x78, 0xD4, + 0x3A, 0xDF, 0xA8, 0xCC, 0xA7, 0xDE, 0x06, 0xCE, 0xD1, 0xDF, 0x79, 0xD4, + 0xA5, 0xE4, 0x58, 0xD4, 0x94, 0xE3, 0x78, 0xD2, 0x5A, 0xDA, 0x26, 0xD5, + 0x40, 0xD3, 0x35, 0xDA, 0x04, 0xD5, 0xF4, 0xDD, 0x12, 0xDA, 0xA9, 0xE0, + 0x68, 0xE0, 0x74, 0xDF, 0xBB, 0xE8, 0x60, 0xDB, 0x01, 0xEE, 0xCA, 0xDB, + 0xC5, 0xF3, 0xEE, 0xEA, 0x6A, 0xF7, 0x36, 0xFA, 0x3D, 0xF6, 0x46, 0xFA, + 0x81, 0xF2, 0x6F, 0xF8, 0xCE, 0xF0, 0x13, 0xFC, 0x1E, 0xF3, 0x2A, 0xFC, + 0x4F, 0xF6, 0x14, 0xF8, 0x7E, 0xF7, 0x2A, 0xF8, 0x6B, 0xEB, 0x4D, 0xFA, + 0x13, 0xE2, 0x6B, 0xFF, 0x36, 0xE0, 0x78, 0x03, 0xB1, 0xE3, 0x0F, 0x05, + 0x32, 0xF2, 0x88, 0x04, 0x10, 0xFA, 0x6E, 0xFF, 0x74, 0xFA, 0x55, 0xFE, + 0xCA, 0xF7, 0xDE, 0x04, 0x13, 0xF4, 0xCC, 0x09, 0x2A, 0xF8, 0xAE, 0x08, + 0xC6, 0x01, 0xDB, 0x04, 0xA8, 0x07, 0xF1, 0x01, 0xB8, 0x0A, 0xD0, 0x00, + 0x62, 0x0E, 0x95, 0x00, 0x9F, 0x10, 0xA9, 0x00, 0x3F, 0x0E, 0xE6, 0xFE, + 0x4F, 0x06, 0xA0, 0x08, 0x0F, 0x01, 0x15, 0x17, 0x2D, 0x09, 0xDF, 0x18, + 0x0F, 0x17, 0x15, 0x14, 0x33, 0x20, 0x5E, 0x10, 0x18, 0x28, 0x48, 0x12, + 0x21, 0x27, 0x80, 0x16, 0xEC, 0x19, 0x7B, 0x18, 0x3D, 0x11, 0x60, 0x15, + 0x36, 0x16, 0xCE, 0x17, 0x47, 0x1A, 0x94, 0x21, 0x1B, 0x1A, 0xE4, 0x1F, + 0x89, 0x27, 0x6B, 0x17, 0x78, 0x37, 0x40, 0x16, 0xFA, 0x33, 0x71, 0x18, + 0xC4, 0x2B, 0xCB, 0x1B, 0xE5, 0x27, 0xB7, 0x1E, 0x01, 0x24, 0x59, 0x20, + 0xAF, 0x28, 0x01, 0x21, 0x8C, 0x33, 0x0E, 0x21, 0x26, 0x3A, 0xF5, 0x22, + 0x0A, 0x3A, 0xB4, 0x1C, 0x2F, 0x36, 0x56, 0x18, 0x08, 0x2C, 0x5E, 0x1F, + 0xE5, 0x1D, 0x41, 0x26, 0x16, 0x17, 0x11, 0x27, 0x6F, 0x1C, 0xC9, 0x29, + 0x44, 0x28, 0x01, 0x2E, 0x5B, 0x2D, 0xB4, 0x2B, 0xF3, 0x2B, 0xE9, 0x2D, + 0x11, 0x26, 0xF5, 0x2E, 0xAE, 0x14, 0xBA, 0x2A, 0x5C, 0x06, 0x41, 0x2D, + 0xAC, 0x06, 0x04, 0x31, 0x05, 0x07, 0x0F, 0x2C, 0x7A, 0x07, 0xBE, 0x22, + 0xC6, 0x0A, 0xDA, 0x1C, 0xF1, 0x07, 0x7D, 0x1B, 0xB2, 0x05, 0xFB, 0x1A, + 0xEC, 0x08, 0xB2, 0x16, 0x75, 0x0E, 0xF2, 0x12, 0x1A, 0x12, 0x76, 0x14, + 0x4A, 0x13, 0x41, 0x0E, 0xED, 0x19, 0x01, 0xFF, 0x1A, 0x1C, 0xB2, 0xF9, + 0x7A, 0x16, 0x65, 0xFD, 0xFD, 0x14, 0x71, 0xFC, 0x00, 0x15, 0x5F, 0xFA, + 0x73, 0x11, 0x1A, 0xF8, 0xC2, 0x0F, 0xED, 0xED, 0xF0, 0x11, 0x88, 0xE7, + 0x72, 0x0E, 0xFF, 0xE9, 0x5F, 0x06, 0x58, 0xEA, 0xB9, 0x06, 0x36, 0xEA, + 0xB5, 0x06, 0xDE, 0xE8, 0x7B, 0x01, 0x99, 0xE4, 0x96, 0xFC, 0x9A, 0xE5, + 0xE7, 0xF5, 0x2A, 0xED, 0xE2, 0xF4, 0xE1, 0xF9, 0x0B, 0xF5, 0x85, 0x01, + 0xDE, 0xEE, 0x03, 0xFC, 0x26, 0xED, 0xA3, 0xF3, 0x56, 0xF2, 0xAA, 0xF4, + 0xBB, 0xEC, 0x08, 0xFC, 0xCF, 0xE1, 0xEE, 0x01, 0x5F, 0xE0, 0xF0, 0x05, + 0xB9, 0xDE, 0xB9, 0x09, 0x7F, 0xE2, 0xB1, 0x0D, 0x76, 0xE9, 0xEC, 0x09, + 0x5D, 0xE7, 0x66, 0x02, 0x78, 0xE2, 0x17, 0xFD, 0xE9, 0xE4, 0xC7, 0xFB, + 0x4F, 0xF1, 0xC4, 0x00, 0xA3, 0xF8, 0x2E, 0xFF, 0xCD, 0xF9, 0x64, 0xF8, + 0x40, 0xFC, 0x32, 0xF6, 0x43, 0x01, 0xC9, 0xF9, 0x9D, 0x04, 0x31, 0x03, + 0xFD, 0xFC, 0x3C, 0x0B, 0x6B, 0xF5, 0xB7, 0x0E, 0x70, 0xFA, 0xDC, 0x14, + 0x13, 0x0B, 0x35, 0x1C, 0x06, 0x15, 0xA6, 0x18, 0xF6, 0x0F, 0xC1, 0x0D, + 0xF8, 0x0A, 0xA4, 0x0A, 0xE5, 0x07, 0xF0, 0x0F, 0x48, 0x0C, 0xF6, 0x15, + 0x33, 0x18, 0xD3, 0x17, 0xF7, 0x18, 0x80, 0x12, 0x1D, 0x0E, 0x49, 0x09, + 0x76, 0x03, 0xF2, 0x00, 0x66, 0x00, 0x30, 0xF8, 0xDD, 0x00, 0xCF, 0xEE, + 0x32, 0x01, 0x01, 0xEA, 0xF1, 0xFE, 0xFD, 0xEA, 0x18, 0xFC, 0xF2, 0xEC, + 0xF9, 0x04, 0x2F, 0xEC, 0xC6, 0x0B, 0x2C, 0xEA, 0x26, 0xFF, 0x43, 0xEA, + 0x53, 0xED, 0xBF, 0xEB, 0x19, 0xE3, 0x9D, 0xEA, 0xE3, 0xED, 0x93, 0xEB, + 0xC2, 0xF9, 0x21, 0xE8, 0x41, 0xEE, 0x54, 0xE3, 0x1A, 0xE0, 0x71, 0xE9, + 0x5D, 0xD9, 0x15, 0xE9, 0xEC, 0xDA, 0x55, 0xE0, 0xCA, 0xDF, 0x22, 0xDF, + 0x6E, 0xDE, 0xDC, 0xE0, 0xBA, 0xD9, 0x10, 0xDE, 0x38, 0xDA, 0x81, 0xDF, + 0xEE, 0xDD, 0x2D, 0xE3, 0x5C, 0xD8, 0x10, 0xE0, 0x6E, 0xD1, 0x17, 0xDE, + 0xD3, 0xCD, 0x7E, 0xDC, 0x87, 0xCB, 0xD3, 0xD8, 0x0D, 0xD6, 0xE0, 0xD8, + 0xE7, 0xDF, 0x3B, 0xD6, 0x02, 0xE1, 0xB4, 0xCF, 0x2F, 0xE4, 0x06, 0xCE, + 0x68, 0xE9, 0x73, 0xCE, 0x1D, 0xF1, 0x44, 0xD0, 0xC2, 0xF0, 0x9A, 0xD8, + 0xFA, 0xE2, 0x86, 0xDD, 0xBC, 0xD6, 0xC4, 0xD6, 0x38, 0xDD, 0x49, 0xD3, + 0x20, 0xEE, 0x59, 0xDB, 0x38, 0xF8, 0x78, 0xE2, 0x96, 0xF9, 0xFF, 0xE6, + 0x24, 0xF6, 0xB6, 0xEF, 0x7E, 0xEF, 0xF4, 0xF2, 0xE9, 0xEB, 0x1D, 0xF3, + 0x27, 0xF3, 0xF5, 0xFA, 0x89, 0xF8, 0xD2, 0xFF, 0xA9, 0xF4, 0x2E, 0xFB, + 0x19, 0xEC, 0x2B, 0xF6, 0x90, 0xE6, 0x60, 0xF7, 0x26, 0xE5, 0x3E, 0xF9, + 0x16, 0xDF, 0x9B, 0xFB, 0x1A, 0xD9, 0x0C, 0xFC, 0x5A, 0xDF, 0x20, 0xFD, + 0x40, 0xE9, 0x32, 0x02, 0x9A, 0xED, 0x9B, 0x06, 0x99, 0xF6, 0xD7, 0x0D, + 0x87, 0xF7, 0x97, 0x11, 0x37, 0xED, 0x0B, 0x10, 0xE9, 0xED, 0x75, 0x0C, + 0xBD, 0xFB, 0xDC, 0x08, 0x2A, 0x09, 0x04, 0x07, 0x33, 0x10, 0xE3, 0x02, + 0xB7, 0x11, 0x8C, 0x01, 0x1F, 0x12, 0x90, 0x0A, 0x2B, 0x11, 0xB1, 0x11, + 0xAE, 0x0A, 0x8D, 0x0E, 0xD4, 0x07, 0x33, 0x0C, 0x08, 0x0D, 0x5E, 0x0C, + 0x4A, 0x17, 0x3B, 0x0D, 0xCD, 0x24, 0x53, 0x10, 0x22, 0x2E, 0x52, 0x10, + 0xBB, 0x29, 0x8B, 0x0C, 0xB1, 0x1D, 0x2F, 0x10, 0x87, 0x19, 0x80, 0x18, + 0x51, 0x1F, 0x24, 0x1E, 0x26, 0x27, 0xF1, 0x1E, 0x63, 0x30, 0x45, 0x1A, + 0x9B, 0x35, 0xB6, 0x19, 0x64, 0x31, 0x20, 0x1A, 0x10, 0x2E, 0x3C, 0x19, + 0x51, 0x2A, 0xB8, 0x1B, 0xED, 0x1B, 0x63, 0x22, 0xDA, 0x10, 0x32, 0x28, + 0xF6, 0x1A, 0x03, 0x26, 0xAD, 0x31, 0xDD, 0x22, 0x86, 0x3E, 0x26, 0x1F, + 0x4C, 0x35, 0x05, 0x1C, 0xD6, 0x20, 0xF1, 0x1E, 0x54, 0x12, 0x5D, 0x20, + 0xFC, 0x10, 0xA2, 0x1B, 0xEA, 0x16, 0xB1, 0x1A, 0x7A, 0x1A, 0x9D, 0x22, + 0x98, 0x20, 0xFE, 0x23, 0x32, 0x2B, 0x76, 0x20, 0x2F, 0x30, 0x9C, 0x25, + 0xDF, 0x25, 0x5B, 0x2D, 0x52, 0x14, 0x2D, 0x36, 0x08, 0x0B, 0xA3, 0x39, + 0x45, 0x0E, 0x0A, 0x35, 0x71, 0x16, 0x0B, 0x2E, 0xCE, 0x16, 0xFC, 0x28, + 0x50, 0x12, 0xE5, 0x24, 0x33, 0x11, 0x2A, 0x22, 0xA7, 0x0E, 0xBE, 0x21, + 0x5E, 0x10, 0xE4, 0x1F, 0xCF, 0x17, 0x01, 0x1E, 0x83, 0x17, 0x8A, 0x19, + 0xA3, 0x17, 0x26, 0x15, 0x06, 0x22, 0x86, 0x0F, 0x8F, 0x29, 0x93, 0x0B, + 0x44, 0x24, 0xBF, 0x08, 0xF3, 0x1B, 0xC8, 0xFF, 0xA7, 0x17, 0x9C, 0xF8, + 0xD4, 0x11, 0x25, 0xF6, 0xC5, 0x0F, 0xAC, 0xF3, 0x61, 0x10, 0xB1, 0xF1, + 0x87, 0x0C, 0x29, 0xF2, 0xF7, 0x0D, 0xD8, 0xEA, 0xD8, 0x11, 0x5B, 0xDD, + 0xF1, 0x0B, 0x95, 0xDB, 0x49, 0xFF, 0xEC, 0xE5, 0x9D, 0xEE, 0x1F, 0xF3, + 0x20, 0xE6, 0x55, 0xFD, 0x29, 0xEF, 0x1F, 0xFF, 0xAE, 0xF9, 0x61, 0xF9, + 0xA6, 0xF8, 0x43, 0xF4, 0xF1, 0xEE, 0xEC, 0xF2, 0x0C, 0xE4, 0x01, 0xED, + 0xEA, 0xDF, 0xFA, 0xE9, 0x55, 0xE0, 0xD8, 0xF3, 0x03, 0xE3, 0x54, 0xFD, + 0x74, 0xE4, 0x04, 0x01, 0xE6, 0xE0, 0x2A, 0x03, 0x63, 0xE0, 0x4A, 0xFD, + 0xB4, 0xE2, 0x00, 0xFB, 0x5D, 0xE2, 0xE6, 0x00, 0x56, 0xE1, 0x28, 0xFE, + 0x8A, 0xED, 0xBA, 0xFC, 0xEE, 0x00, 0x72, 0xFF, 0xD5, 0x0C, 0x6C, 0x02, + 0xA6, 0x0B, 0xD9, 0xFE, 0xB9, 0x02, 0xD7, 0xF6, 0x9C, 0x02, 0x15, 0xFB, + 0xD6, 0x04, 0xD0, 0x06, 0x98, 0x06, 0x36, 0x13, 0x90, 0x0C, 0xDC, 0x19, + 0xA9, 0x0A, 0xB3, 0x15, 0x12, 0x06, 0x14, 0x0E, 0x0D, 0x0A, 0x55, 0x0C, + 0xCC, 0x07, 0x56, 0x0A, 0x9D, 0xFE, 0xF1, 0x0A, 0xDD, 0xFE, 0x04, 0x12, + 0x76, 0x05, 0x9F, 0x11, 0x9D, 0x0C, 0x0A, 0x13, 0x25, 0x10, 0x6B, 0x15, + 0xE9, 0x09, 0xBE, 0x08, 0xCF, 0xFF, 0x03, 0x00, 0x68, 0xFD, 0x4C, 0x05, + 0x35, 0x04, 0x6F, 0xFF, 0x71, 0x0B, 0x70, 0xF0, 0x9E, 0x0D, 0xB6, 0xF0, + 0xE6, 0x08, 0x56, 0xF5, 0xC4, 0xFC, 0x8B, 0xF3, 0x52, 0xF3, 0x3A, 0xF2, + 0xF1, 0xF2, 0x51, 0xEB, 0x6E, 0xF6, 0x1C, 0xE0, 0xD4, 0xEE, 0x4A, 0xDD, + 0x3C, 0xE4, 0x2D, 0xE2, 0x78, 0xE5, 0x32, 0xE2, 0x1A, 0xE9, 0x4B, 0xDF, + 0x75, 0xE8, 0xD6, 0xDC, 0x50, 0xE3, 0x2B, 0xDD, 0x44, 0xE5, 0x03, 0xE6, + 0xEF, 0xEB, 0xB4, 0xE8, 0x04, 0xE9, 0x89, 0xE3, 0x18, 0xE2, 0x1D, 0xE1, + 0x23, 0xDF, 0x65, 0xE5, 0x26, 0xD9, 0xE0, 0xE6, 0x50, 0xD2, 0xED, 0xE1, + 0x01, 0xCF, 0x0D, 0xE0, 0x99, 0xCA, 0x4E, 0xD9, 0x8C, 0xC8, 0x46, 0xD2, + 0xB2, 0xCF, 0x6E, 0xD3, 0x39, 0xE1, 0x68, 0xD0, 0x3D, 0xEF, 0x5B, 0xCC, + 0x96, 0xEC, 0x3A, 0xCE, 0x5D, 0xE2, 0x07, 0xD1, 0xA2, 0xD8, 0x91, 0xCF, + 0x63, 0xD4, 0x46, 0xCA, 0xCF, 0xD7, 0x13, 0xCA, 0xF4, 0xD9, 0xB0, 0xCE, + 0x89, 0xD8, 0x92, 0xD5, 0x91, 0xDC, 0xAA, 0xDC, 0xF9, 0xE6, 0x44, 0xDE, + 0xCF, 0xEC, 0x2E, 0xE2, 0xF1, 0xED, 0xB4, 0xE9, 0x01, 0xED, 0x2B, 0xF2, + 0x7D, 0xEA, 0x5B, 0xF7, 0xD5, 0xEE, 0x60, 0xF8, 0x70, 0xF8, 0xC6, 0xFC, + 0xA2, 0xF7, 0x80, 0xFC, 0xBD, 0xEB, 0xD0, 0xF9, 0x32, 0xDE, 0xA6, 0xF6, + 0xBF, 0xDA, 0x61, 0xF2, 0x73, 0xE1, 0x99, 0xF4, 0xFB, 0xE3, 0x80, 0xF6, + 0x31, 0xE4, 0xCB, 0xF7, 0x2C, 0xEC, 0x69, 0xFF, 0xE6, 0xF1, 0xFE, 0x06, + 0x34, 0xED, 0x18, 0x0A, 0xDF, 0xE6, 0x80, 0x06, 0x6B, 0xE8, 0xA5, 0xFC, + 0x4A, 0xF5, 0xC9, 0xF9, 0x4D, 0x09, 0x83, 0xFF, 0x05, 0x18, 0x6B, 0x04, + 0x17, 0x17, 0x82, 0x08, 0xF9, 0x0F, 0x5B, 0x0C, 0x01, 0x0B, 0x8B, 0x0C, + 0xF9, 0x0C, 0x1E, 0x0E, 0xD7, 0x0F, 0xCC, 0x13, 0x1E, 0x11, 0x9B, 0x15, + 0x23, 0x1C, 0xDC, 0x13, 0x5B, 0x2A, 0xB0, 0x13, 0x87, 0x30, 0xAC, 0x13, + 0xF6, 0x2A, 0x86, 0x17, 0xAC, 0x1C, 0x8E, 0x1B, 0x2C, 0x13, 0xE3, 0x1B, + 0x48, 0x12, 0xFB, 0x1F, 0x26, 0x1D, 0xE2, 0x21, 0x30, 0x30, 0x02, 0x1B, + 0xD1, 0x32, 0xE2, 0x0D, 0x0F, 0x26, 0x50, 0x09, 0xD6, 0x1A, 0xFB, 0x10, + 0xC7, 0x0F, 0x69, 0x12, 0xA0, 0x0D, 0xE4, 0x13, 0xD6, 0x1A, 0xFC, 0x1A, + 0xD6, 0x27, 0x28, 0x1A, 0xA5, 0x31, 0x24, 0x19, 0x02, 0x34, 0x8E, 0x17, + 0x72, 0x2A, 0x98, 0x11, 0x49, 0x1C, 0x9F, 0x0F, 0x66, 0x10, 0x4A, 0x14, + 0xC1, 0x11, 0x6A, 0x1A, 0x67, 0x1E, 0xE2, 0x1C, 0x03, 0x26, 0xE9, 0x1C, + 0x6B, 0x26, 0x40, 0x15, 0x5F, 0x24, 0x7C, 0x18, 0x12, 0x20, 0xAC, 0x2A, + 0x9F, 0x1E, 0xA4, 0x2D, 0xB8, 0x1F, 0x10, 0x2C, 0xF7, 0x19, 0x19, 0x32, + 0x4C, 0x13, 0x5F, 0x32, 0xD6, 0x17, 0x93, 0x2F, 0xB8, 0x1C, 0xD8, 0x31, + 0xCC, 0x1B, 0x62, 0x35, 0x0E, 0x18, 0xB7, 0x32, 0xEA, 0x10, 0xBA, 0x2F, + 0xDB, 0x0A, 0x87, 0x2A, 0x23, 0x0F, 0x3A, 0x21, 0xB9, 0x15, 0xED, 0x20, + 0xFE, 0x12, 0x88, 0x26, 0x0C, 0x14, 0x6A, 0x22, 0xC9, 0x1F, 0xFA, 0x14, + 0x52, 0x26, 0xF6, 0x06, 0xD4, 0x1B, 0x06, 0xFC, 0x03, 0x0D, 0xD2, 0xFE, + 0x5E, 0x06, 0xBB, 0x07, 0x98, 0x08, 0x9C, 0x03, 0x78, 0x13, 0x83, 0xF6, + 0xE8, 0x1F, 0x8E, 0xEA, 0xCD, 0x21, 0x55, 0xE1, 0x12, 0x18, 0xD9, 0xDC, + 0x39, 0x0B, 0x26, 0xE1, 0xEA, 0xFF, 0xF1, 0xEA, 0xA8, 0xF6, 0x74, 0xF0, + 0x98, 0xF2, 0x58, 0xF3, 0xDB, 0xF8, 0x61, 0xF5, 0x44, 0x00, 0x68, 0xEE, + 0x87, 0xFE, 0xD3, 0xE6, 0xD6, 0xF3, 0x35, 0xE5, 0xF4, 0xE8, 0x57, 0xE8, + 0xF4, 0xE6, 0xD1, 0xF0, 0x97, 0xEC, 0x25, 0xF9, 0xE9, 0xF2, 0xE2, 0xFC, + 0xAD, 0xF2, 0x61, 0x01, 0xF8, 0xE6, 0xCB, 0x06, 0x49, 0xD8, 0x8E, 0x04, + 0x8D, 0xD4, 0x2D, 0xFE, 0xAD, 0xDF, 0x1D, 0xFE, 0xC3, 0xEA, 0x03, 0x03, + 0x08, 0xEB, 0x28, 0x02, 0x4A, 0xF2, 0x97, 0xFD, 0x2A, 0x02, 0x4F, 0xF9, + 0xD1, 0x05, 0xAF, 0xF5, 0x29, 0xFE, 0x3C, 0xF9, 0x0A, 0xFA, 0x18, 0x02, + 0x02, 0xFA, 0xEC, 0x08, 0x8D, 0xFC, 0x5D, 0x0B, 0x7E, 0x05, 0x42, 0x10, + 0x38, 0x09, 0xDB, 0x11, 0x7D, 0x00, 0x2B, 0x0C, 0x9E, 0xFA, 0x2A, 0x0D, + 0xE0, 0xFB, 0xFA, 0x13, 0x53, 0xFF, 0xF4, 0x16, 0x10, 0x09, 0x11, 0x14, + 0x80, 0x10, 0xE6, 0x10, 0xAE, 0x0B, 0x63, 0x10, 0xA8, 0x06, 0xC7, 0x0F, + 0xF9, 0x09, 0x7E, 0x0D, 0xE7, 0x06, 0x9A, 0x02, 0xA1, 0xFE, 0x08, 0xF6, + 0x52, 0xFF, 0xF8, 0xF2, 0x6A, 0x01, 0x09, 0xF4, 0x75, 0x02, 0xF3, 0xF2, + 0xED, 0x02, 0xF0, 0xEC, 0x28, 0x02, 0xFE, 0xE7, 0xA8, 0xFF, 0x26, 0xE9, + 0xB0, 0xF6, 0x26, 0xEC, 0x36, 0xF2, 0x17, 0xEE, 0x3E, 0xF5, 0xC7, 0xEA, + 0x47, 0xF3, 0x44, 0xE5, 0x80, 0xEC, 0x9A, 0xE4, 0x60, 0xE7, 0x94, 0xE4, + 0x71, 0xE9, 0x34, 0xE5, 0x70, 0xEA, 0xE4, 0xE7, 0x9D, 0xE6, 0x49, 0xE8, + 0x36, 0xE6, 0x96, 0xE7, 0xC3, 0xE6, 0x14, 0xEB, 0x39, 0xE9, 0xB7, 0xEC, + 0x47, 0xEA, 0x7A, 0xE5, 0x60, 0xE1, 0x6D, 0xE1, 0x27, 0xD1, 0xD8, 0xE2, + 0x02, 0xC6, 0xE5, 0xDE, 0xE3, 0xC6, 0xD3, 0xDA, 0x94, 0xCD, 0xB7, 0xD7, + 0x85, 0xD6, 0x78, 0xD1, 0xBA, 0xDD, 0x66, 0xD3, 0x3E, 0xE2, 0xDF, 0xDB, + 0x78, 0xE5, 0xB9, 0xD5, 0x8B, 0xE3, 0x0C, 0xC8, 0x1D, 0xDE, 0xDD, 0xC6, + 0x00, 0xD8, 0x98, 0xCC, 0x1C, 0xD5, 0xF8, 0xD1, 0x8F, 0xD8, 0xA3, 0xD2, + 0x67, 0xDF, 0x72, 0xCE, 0xE6, 0xE3, 0xE4, 0xC9, 0x61, 0xE7, 0xFA, 0xCB, + 0xC7, 0xE7, 0x03, 0xD7, 0x38, 0xE2, 0xCC, 0xDA, 0x10, 0xE2, 0x9F, 0xD7, + 0x2C, 0xEA, 0x69, 0xDF, 0xA5, 0xEE, 0x37, 0xEB, 0xB8, 0xEE, 0x03, 0xF1, + 0xBD, 0xEB, 0xC1, 0xF2, 0x2D, 0xE0, 0x96, 0xED, 0x4C, 0xD6, 0xD8, 0xE7, + 0x2F, 0xD9, 0x0D, 0xEB, 0x50, 0xDF, 0x54, 0xF0, 0xE3, 0xE4, 0x30, 0xF5, + 0xB3, 0xEB, 0xEF, 0xFE, 0x59, 0xED, 0x6F, 0x07, 0x83, 0xE7, 0x55, 0x0B, + 0xDE, 0xE4, 0xEE, 0x0C, 0xB7, 0xEA, 0x9E, 0x0C, 0x81, 0xEC, 0x71, 0x06, + 0x53, 0xEF, 0xAC, 0x05, 0xC6, 0xFE, 0x34, 0x11, 0xAC, 0x0F, 0xCA, 0x14, + 0x4F, 0x14, 0xA8, 0x0C, 0x6D, 0x0C, 0x6C, 0x08, 0x5A, 0xFF, 0x4E, 0x0B, + 0x68, 0x02, 0xB8, 0x11, 0x41, 0x11, 0x5D, 0x15, 0xD1, 0x19, 0xA0, 0x16, + 0xB4, 0x23, 0x92, 0x14, 0xAE, 0x2A, 0x03, 0x10, 0x18, 0x2A, 0x32, 0x13, + 0x8D, 0x22, 0x65, 0x16, 0xFD, 0x15, 0x34, 0x18, 0x13, 0x13, 0x88, 0x1C, + 0x1F, 0x20, 0xB3, 0x1C, 0xAD, 0x32, 0x84, 0x1C, 0x20, 0x3A, 0x70, 0x1A, + 0x19, 0x32, 0x30, 0x12, 0x11, 0x23, 0x96, 0x11, 0xB7, 0x11, 0x56, 0x14, + 0x18, 0x0D, 0xD0, 0x10, 0xD1, 0x19, 0x4F, 0x12, 0x58, 0x24, 0x1E, 0x14, + 0xB4, 0x27, 0x74, 0x0E, 0x54, 0x2A, 0x7B, 0x0A, 0x24, 0x29, 0xE1, 0x0E, + 0x0A, 0x1F, 0x1B, 0x14, 0x8F, 0x19, 0x2A, 0x18, 0x11, 0x1B, 0xB0, 0x1D, + 0x60, 0x19, 0xEE, 0x1A, 0x46, 0x1B, 0x12, 0x14, 0x81, 0x25, 0xD8, 0x17, + 0xD2, 0x29, 0xDB, 0x20, 0x20, 0x23, 0x17, 0x24, 0x18, 0x22, 0x04, 0x26, + 0x9F, 0x25, 0x7F, 0x2B, 0x57, 0x24, 0x4C, 0x30, 0x25, 0x21, 0x32, 0x35, + 0x15, 0x1A, 0xFF, 0x3A, 0x82, 0x14, 0x6C, 0x3D, 0xF8, 0x18, 0x33, 0x3E, + 0xBA, 0x1D, 0xC7, 0x3A, 0x86, 0x1B, 0xDA, 0x2E, 0x77, 0x12, 0x3F, 0x26, + 0x69, 0x07, 0x35, 0x26, 0xA7, 0x05, 0x36, 0x27, 0x1B, 0x10, 0xF9, 0x2C, + 0xA8, 0x1B, 0x76, 0x2E, 0x87, 0x1F, 0xDA, 0x1E, 0x16, 0x1D, 0x73, 0x0C, + 0x3F, 0x19, 0x35, 0x06, 0x77, 0x13, 0xEA, 0x08, 0x82, 0x0B, 0x38, 0x0D, + 0x08, 0x0D, 0xE3, 0x0D, 0xD4, 0x15, 0x43, 0x04, 0xF0, 0x1D, 0xB3, 0xF3, + 0x9B, 0x27, 0x66, 0xE9, 0xB1, 0x26, 0x38, 0xE5, 0xFE, 0x15, 0xD2, 0xE2, + 0xBF, 0x02, 0x4D, 0xE7, 0xDD, 0xFD, 0x2A, 0xEE, 0x31, 0x0A, 0xC1, 0xF2, + 0x16, 0x0E, 0x81, 0xF4, 0x73, 0x03, 0x60, 0xF1, 0xD9, 0xF7, 0x8B, 0xEC, + 0x67, 0xEE, 0xB5, 0xE7, 0x6F, 0xED, 0xDF, 0xE8, 0xDD, 0xF2, 0x44, 0xF0, + 0xA0, 0xF3, 0xA4, 0xF5, 0x29, 0xF2, 0x3E, 0xFA, 0x44, 0xF3, 0x9B, 0xFC, + 0xE1, 0xF0, 0x6A, 0x01, 0xBC, 0xE7, 0x76, 0x03, 0x79, 0xDC, 0xA3, 0xFD, + 0xD7, 0xD3, 0x5B, 0x03, 0xE3, 0xD4, 0xB8, 0x0B, 0x91, 0xE5, 0x2B, 0x07, + 0x1A, 0xF7, 0x3A, 0xFF, 0x94, 0xF9, 0xC8, 0xFA, 0xB6, 0xF2, 0x73, 0xF6, + 0xB3, 0xF3, 0x93, 0xF6, 0x4A, 0xFD, 0xEB, 0xFC, 0x30, 0x01, 0x5C, 0xFF, + 0xF6, 0xFC, 0xD4, 0x00, 0x3A, 0xF7, 0x9C, 0x07, 0x5B, 0xFC, 0x38, 0x0B, + 0x4F, 0x06, 0x0B, 0x08, 0x1B, 0x06, 0x03, 0x07, 0x9A, 0x03, 0x63, 0x0B, + 0x51, 0xFE, 0xFA, 0x0E, 0xF6, 0xFA, 0xF8, 0x0D, 0x7A, 0x05, 0xEB, 0x0B, + 0xE0, 0x0E, 0x2C, 0x0D, 0x87, 0x0A, 0xC0, 0x0F, 0xFC, 0x00, 0x54, 0x0C, + 0x3C, 0xFE, 0x82, 0x06, 0xA9, 0x04, 0x84, 0x05, 0x5C, 0x06, 0x6E, 0x04, + 0x97, 0xFE, 0x22, 0xFD, 0xBD, 0xFB, 0x2B, 0xF6, 0x10, 0x04, 0xE6, 0xF3, + 0xF5, 0x0C, 0x57, 0xEF, 0x66, 0x09, 0x55, 0xF0, 0x6B, 0xFF, 0x7A, 0xF7, + 0x90, 0xF7, 0x6D, 0xF4, 0x13, 0xF4, 0xD3, 0xF0, 0x51, 0xF8, 0xE3, 0xF4, + 0xCC, 0xFC, 0x03, 0xF2, 0x61, 0xF6, 0xFB, 0xEB, 0x58, 0xEB, 0x1C, 0xEB, + 0xDD, 0xE6, 0xB5, 0xE7, 0xE5, 0xE7, 0x84, 0xE4, 0x62, 0xEB, 0xF0, 0xE6, + 0x48, 0xEE, 0xF9, 0xEB, 0x16, 0xEF, 0xFE, 0xE9, 0xA3, 0xEE, 0xAF, 0xE4, + 0x1E, 0xEE, 0x97, 0xEB, 0xD1, 0xE7, 0x91, 0xEC, 0x40, 0xDE, 0xA9, 0xE1, + 0xC6, 0xD4, 0xAC, 0xDC, 0xD1, 0xC9, 0xA5, 0xDB, 0x59, 0xCD, 0xA7, 0xDD, + 0xB7, 0xDB, 0xDA, 0xE1, 0xAB, 0xE1, 0x48, 0xDF, 0xA5, 0xE2, 0x51, 0xD5, + 0xD8, 0xE2, 0xD5, 0xCD, 0xC8, 0xE0, 0xDB, 0xCC, 0x88, 0xDA, 0x3B, 0xCB, + 0x73, 0xD3, 0x04, 0xC6, 0xF3, 0xD0, 0x67, 0xC3, 0xE8, 0xD2, 0x90, 0xC8, + 0xED, 0xD6, 0x0B, 0xCF, 0x4F, 0xD8, 0xDB, 0xCC, 0x54, 0xD8, 0x98, 0xC4, + 0x70, 0xD7, 0x6E, 0xC0, 0x72, 0xD7, 0x24, 0xC7, 0xFF, 0xDB, 0xE5, 0xD3, + 0x9D, 0xE3, 0x46, 0xE0, 0xD2, 0xE7, 0x84, 0xE9, 0x6C, 0xE6, 0xD2, 0xEE, + 0x66, 0xE1, 0x2D, 0xF1, 0xF7, 0xDD, 0xBA, 0xEC, 0x26, 0xE2, 0xA1, 0xE3, + 0x7D, 0xE8, 0x18, 0xE4, 0xC3, 0xE7, 0xB8, 0xEF, 0x8D, 0xE5, 0xFE, 0xFA, + 0xCD, 0xE9, 0x59, 0x03, 0x76, 0xEC, 0x76, 0x06, 0xB8, 0xE8, 0xEC, 0x03, + 0xC0, 0xE5, 0x72, 0x03, 0xCA, 0xE4, 0xDD, 0x09, 0x05, 0xEB, 0x63, 0x10, + 0xC7, 0xFC, 0xB4, 0x0F, 0xB6, 0x0B, 0x71, 0x0B, 0xD9, 0x0C, 0xD1, 0x0B, + 0x3C, 0x08, 0xC7, 0x0D, 0x70, 0x08, 0x2C, 0x10, 0x8E, 0x0A, 0x28, 0x15, + 0xAE, 0x0E, 0x5B, 0x16, 0x38, 0x18, 0xC6, 0x18, 0x73, 0x20, 0x1D, 0x19, + 0x30, 0x22, 0x4F, 0x0B, 0xCE, 0x1D, 0x15, 0x05, 0xB8, 0x15, 0x85, 0x10, + 0x28, 0x0C, 0xB2, 0x16, 0xDC, 0x0A, 0x4C, 0x16, 0x37, 0x19, 0x8A, 0x13, + 0x65, 0x2C, 0xFD, 0x10, 0xEA, 0x33, 0xC2, 0x12, 0x29, 0x2E, 0x4D, 0x13, + 0x00, 0x23, 0x3D, 0x12, 0xCC, 0x17, 0xDB, 0x11, 0xB2, 0x0F, 0x42, 0x11, + 0x32, 0x0C, 0x80, 0x10, 0xCF, 0x0E, 0xCB, 0x0D, 0x94, 0x18, 0x54, 0x09, + 0x1C, 0x26, 0x65, 0x0C, 0x17, 0x2C, 0xD9, 0x16, 0x74, 0x24, 0xC6, 0x1F, + 0x32, 0x18, 0xFC, 0x1D, 0x7C, 0x19, 0x2C, 0x16, 0xA5, 0x21, 0x51, 0x18, + 0xBE, 0x1F, 0x8B, 0x1D, 0x11, 0x1F, 0xBC, 0x1E, 0xD5, 0x23, 0x21, 0x1E, + 0x25, 0x29, 0x19, 0x18, 0x2A, 0x2D, 0xE6, 0x12, 0x10, 0x26, 0xE6, 0x15, + 0xBB, 0x19, 0x88, 0x1C, 0x8F, 0x15, 0xE7, 0x26, 0x6D, 0x16, 0x10, 0x32, + 0x4B, 0x1D, 0x77, 0x37, 0x93, 0x2A, 0x3E, 0x35, 0xDF, 0x2B, 0x67, 0x2E, + 0x94, 0x1E, 0xA0, 0x29, 0xBF, 0x12, 0x3D, 0x29, 0x41, 0x0B, 0x01, 0x31, + 0x06, 0x04, 0xE6, 0x36, 0x1E, 0x04, 0xE1, 0x34, 0xB8, 0x0E, 0x28, 0x2F, + 0x5E, 0x1E, 0x6F, 0x23, 0x20, 0x2A, 0x41, 0x1A, 0x45, 0x24, 0xBB, 0x17, + 0xE9, 0x0F, 0xAB, 0x15, 0x56, 0x02, 0x2D, 0x15, 0x40, 0x07, 0x33, 0x19, + 0x62, 0x13, 0x60, 0x17, 0x46, 0x1C, 0xDE, 0x07, 0x6A, 0x20, 0x39, 0xF5, + 0x23, 0x1C, 0x82, 0xE7, 0x14, 0x15, 0x37, 0xDE, 0x8A, 0x0F, 0x5C, 0xDE, + 0x40, 0x08, 0x1F, 0xE8, 0x83, 0x03, 0x99, 0xEB, 0x70, 0x05, 0x57, 0xEC, + 0x16, 0x06, 0x07, 0xF2, 0xEC, 0x05, 0xA7, 0xF4, 0x11, 0x04, 0x68, 0xF0, + 0x36, 0xF9, 0x34, 0xEB, 0x0B, 0xF2, 0xD1, 0xEF, 0x9C, 0xF5, 0x0A, 0xF4, + 0x60, 0xFD, 0x6C, 0xF5, 0xE5, 0x02, 0x47, 0xF9, 0xAD, 0xFF, 0x97, 0xFA, + 0x35, 0xF7, 0x09, 0x00, 0x39, 0xF0, 0x7C, 0x08, 0x34, 0xEC, 0x13, 0x0C, + 0xE3, 0xE7, 0x50, 0x0C, 0xA2, 0xE2, 0x23, 0x0A, 0x04, 0xE3, 0x57, 0x08, + 0x68, 0xEE, 0x6E, 0x08, 0x65, 0xFB, 0x99, 0x04, 0xFE, 0x00, 0x1E, 0xFC, + 0x3C, 0xFC, 0x8F, 0xF9, 0x40, 0xF3, 0x92, 0xFF, 0x10, 0xF2, 0xA0, 0x03, + 0x99, 0xF5, 0x12, 0x02, 0xDA, 0xF8, 0xF8, 0xFC, 0x1B, 0xFD, 0x94, 0xFB, + 0x7E, 0xFF, 0xE2, 0xFF, 0xD6, 0xFF, 0x63, 0x04, 0x92, 0xFF, 0x1D, 0x09, + 0x06, 0xF9, 0x52, 0x0B, 0x31, 0xF2, 0x4A, 0x0C, 0xD3, 0xF3, 0x0A, 0x0D, + 0x0A, 0xFC, 0x96, 0x0B, 0xF4, 0x07, 0x9B, 0x0B, 0x81, 0x0E, 0xDC, 0x0B, + 0xC2, 0x03, 0x30, 0x0A, 0x67, 0xF4, 0x1C, 0x05, 0xE3, 0xF5, 0xBC, 0xFE, + 0x98, 0x01, 0x0D, 0xFD, 0x5D, 0x0A, 0x1F, 0xFF, 0x9D, 0x0A, 0x9E, 0x00, + 0xFA, 0x07, 0x38, 0xFE, 0x2B, 0x0B, 0xF5, 0xFB, 0x58, 0x0F, 0x3F, 0xFC, + 0xB5, 0x0E, 0xC1, 0xF7, 0x06, 0x06, 0x87, 0xF5, 0x26, 0xFE, 0x10, 0xFA, + 0x9A, 0xFF, 0xAE, 0xFB, 0x5D, 0xFF, 0xE8, 0xF6, 0x52, 0xFB, 0x42, 0xF1, + 0xC3, 0xF7, 0x45, 0xF0, 0x1E, 0xF6, 0xA0, 0xEF, 0xD0, 0xFA, 0xC1, 0xEE, + 0xD4, 0xFF, 0x6A, 0xF0, 0xCB, 0xFD, 0xD0, 0xF2, 0x54, 0xF9, 0x47, 0xF4, + 0x0C, 0xF6, 0x4E, 0xF2, 0xF7, 0xEC, 0x0C, 0xEC, 0x1D, 0xE2, 0x2C, 0xEB, + 0xDA, 0xD9, 0xCB, 0xEA, 0x1E, 0xD0, 0x0B, 0xE4, 0x17, 0xCB, 0x54, 0xE6, + 0x32, 0xCF, 0x5F, 0xE9, 0x47, 0xDA, 0xD3, 0xE2, 0xE3, 0xE2, 0xAB, 0xDB, + 0xD2, 0xE0, 0xA5, 0xD5, 0x26, 0xD9, 0x29, 0xCB, 0x98, 0xD6, 0x41, 0xC1, + 0x2B, 0xD7, 0x4A, 0xC4, 0x11, 0xD2, 0x09, 0xCC, 0xB8, 0xCE, 0x78, 0xCE, + 0xF2, 0xD0, 0xBE, 0xCB, 0x8C, 0xD2, 0x0B, 0xC4, 0xC0, 0xD7, 0xD7, 0xBC, + 0x6C, 0xDF, 0x1D, 0xBE, 0x0D, 0xDF, 0xD0, 0xC3, 0x27, 0xDB, 0xF5, 0xCA, + 0x31, 0xDD, 0x08, 0xDA, 0x66, 0xE4, 0x27, 0xE9, 0x82, 0xEA, 0x92, 0xEA, + 0x75, 0xE9, 0xE1, 0xE7, 0x8A, 0xE4, 0x21, 0xE9, 0x4E, 0xE4, 0x7C, 0xE6, + 0xE0, 0xEA, 0x52, 0xE8, 0x46, 0xF2, 0xB1, 0xF2, 0xA7, 0xF1, 0x1A, 0xF9, + 0xDB, 0xE8, 0x50, 0xFC, 0xB8, 0xE2, 0x72, 0x04, 0xF5, 0xE4, 0x34, 0x0B, + 0x48, 0xE9, 0xA8, 0x0B, 0x3A, 0xE9, 0xCE, 0x0A, 0x9A, 0xE9, 0x1D, 0x0A, + 0xCB, 0xF1, 0x7B, 0x05, 0x89, 0xFD, 0x9E, 0xFE, 0x8B, 0x02, 0x40, 0xFF, + 0xDE, 0xFA, 0x59, 0x05, 0x5F, 0xF3, 0x10, 0x0F, 0x0B, 0xFB, 0x51, 0x19, + 0x0A, 0x0C, 0xB4, 0x18, 0xAF, 0x16, 0x6D, 0x0E, 0x96, 0x13, 0x89, 0x09, + 0x3B, 0x0B, 0xC6, 0x09, 0x58, 0x06, 0x30, 0x0B, 0x59, 0x05, 0x93, 0x10, + 0xCD, 0x08, 0xF8, 0x11, 0x2A, 0x0C, 0x7A, 0x12, 0x6F, 0x12, 0x55, 0x0F, + 0x0A, 0x23, 0x75, 0x0B, 0x4B, 0x32, 0xBF, 0x12, 0xC0, 0x32, 0x35, 0x1A, + 0xB1, 0x27, 0x43, 0x1B, 0x27, 0x1D, 0x08, 0x1A, 0x9D, 0x1B, 0x54, 0x17, + 0x03, 0x24, 0x67, 0x0F, 0x81, 0x29, 0x5B, 0x0F, 0xC1, 0x25, 0x98, 0x18, + 0xDD, 0x25, 0x02, 0x1D, 0xDC, 0x2C, 0x44, 0x1C, 0xB6, 0x33, 0xE9, 0x17, + 0x07, 0x33, 0x44, 0x14, 0xCA, 0x26, 0x4C, 0x14, 0x99, 0x19, 0x69, 0x1B, + 0x98, 0x1E, 0xBF, 0x22, 0x76, 0x2E, 0x4E, 0x1F, 0x5A, 0x31, 0xA4, 0x18, + 0x87, 0x2C, 0x48, 0x15, 0x1F, 0x29, 0x84, 0x14, 0x91, 0x26, 0x7D, 0x17, + 0xD9, 0x1E, 0x5B, 0x1D, 0xB0, 0x12, 0xA8, 0x28, 0x6E, 0x16, 0x01, 0x36, + 0x6E, 0x26, 0x59, 0x3A, 0x6F, 0x32, 0xF8, 0x33, 0x88, 0x34, 0xBB, 0x2D, + 0x44, 0x27, 0xC7, 0x2D, 0x99, 0x0E, 0x2F, 0x2E, 0xE7, 0xFA, 0x3E, 0x2F, + 0xAD, 0xFB, 0x13, 0x31, 0xB3, 0x08, 0x5A, 0x2D, 0xFA, 0x0E, 0x50, 0x28, + 0xE9, 0x0F, 0x31, 0x25, 0x51, 0x12, 0xA2, 0x1C, 0x55, 0x0F, 0xFA, 0x13, + 0xA2, 0x07, 0xB9, 0x13, 0xBF, 0x03, 0x3B, 0x18, 0x60, 0x03, 0x92, 0x19, + 0x32, 0x0C, 0x6F, 0x13, 0xA8, 0x19, 0xCB, 0x06, 0x4A, 0x1F, 0x59, 0xF9, + 0x12, 0x20, 0xA3, 0xEF, 0x5C, 0x1B, 0x49, 0xEA, 0xAB, 0x12, 0x40, 0xEC, + 0x97, 0x0D, 0xE8, 0xF0, 0x21, 0x0E, 0x47, 0xF2, 0xE0, 0x0E, 0xCF, 0xF1, + 0x00, 0x0D, 0x33, 0xF4, 0x77, 0x0B, 0xE0, 0xF7, 0x8D, 0x08, 0xB7, 0xF7, + 0xA1, 0x08, 0xF6, 0xF4, 0xC8, 0x08, 0x27, 0xEF, 0xF3, 0x02, 0xA2, 0xEE, + 0x78, 0x01, 0x5B, 0xF6, 0x2F, 0x05, 0xB9, 0xFC, 0xAE, 0x05, 0xBA, 0xFE, + 0x64, 0x01, 0xA9, 0xFF, 0xA5, 0xFA, 0x68, 0x03, 0xDE, 0xED, 0xF7, 0x06, + 0x03, 0xDF, 0xD0, 0x0A, 0xA1, 0xDA, 0xF0, 0x09, 0xAB, 0xE0, 0xD1, 0x02, + 0xAC, 0xE9, 0xC8, 0xFF, 0x0D, 0xF2, 0xE4, 0x01, 0xBA, 0xF7, 0xE1, 0x04, + 0xC9, 0xF7, 0x4F, 0x04, 0xF1, 0xF3, 0xAB, 0xFE, 0x1C, 0xEF, 0x4F, 0xF5, + 0x36, 0xEE, 0x14, 0xF2, 0x0F, 0xF4, 0xA6, 0xF7, 0x5A, 0xFD, 0xED, 0xFC, + 0x09, 0x05, 0xD0, 0x00, 0x99, 0xFF, 0xB6, 0x03, 0x8A, 0xF4, 0x15, 0x04, + 0xBD, 0xF2, 0x97, 0x02, 0x74, 0xF8, 0x48, 0x01, 0x85, 0x01, 0x80, 0x01, + 0x91, 0x05, 0xAE, 0x07, 0x86, 0x03, 0x15, 0x10, 0x60, 0x03, 0xEF, 0x0F, + 0x46, 0x05, 0xAE, 0x09, 0x9D, 0x04, 0x32, 0x06, 0x90, 0x01, 0x4D, 0x05, + 0x8B, 0x01, 0x73, 0x06, 0x85, 0x03, 0xBC, 0x0A, 0x3E, 0x06, 0x4A, 0x0B, + 0xD1, 0x0A, 0x9C, 0x01, 0xA9, 0x0E, 0x4C, 0xF9, 0xF7, 0x0F, 0x95, 0x00, + 0x6F, 0x0D, 0xB7, 0x09, 0x42, 0x08, 0x6F, 0x04, 0xE7, 0x00, 0x24, 0xFC, + 0x2E, 0xF9, 0x2F, 0xFA, 0xFA, 0xF6, 0x63, 0xF8, 0xAB, 0xF8, 0x4A, 0xF6, + 0xBB, 0xF6, 0x53, 0xF0, 0x3E, 0xF1, 0x25, 0xE8, 0x2C, 0xF0, 0x9E, 0xE8, + 0xB9, 0xF1, 0x7E, 0xEE, 0x05, 0xF2, 0x9D, 0xF2, 0x19, 0xF5, 0x0E, 0xF3, + 0xB7, 0xF4, 0xF9, 0xEE, 0x1F, 0xEC, 0xE0, 0xE8, 0x67, 0xE1, 0x1F, 0xE6, + 0x59, 0xD9, 0xAE, 0xE5, 0xB6, 0xD4, 0xBE, 0xE3, 0x52, 0xCD, 0x92, 0xE2, + 0xA3, 0xC9, 0x80, 0xE3, 0x98, 0xD2, 0xA7, 0xDE, 0x73, 0xE1, 0x02, 0xD5, + 0x84, 0xE8, 0xBB, 0xCD, 0x0D, 0xE2, 0x97, 0xC8, 0x94, 0xD7, 0x6F, 0xC8, + 0x76, 0xD1, 0x31, 0xCD, 0x85, 0xD1, 0xF0, 0xD1, 0x4D, 0xD4, 0xA7, 0xCD, + 0x2A, 0xD6, 0x56, 0xC4, 0x89, 0xD9, 0x97, 0xC0, 0xE7, 0xDC, 0x3F, 0xBE, + 0x66, 0xE0, 0x05, 0xC1, 0x10, 0xE6, 0x78, 0xC9, 0x7A, 0xE4, 0xB3, 0xCD, + 0x3F, 0xDF, 0xB5, 0xD5, 0x03, 0xE2, 0xBA, 0xE2, 0x9E, 0xE8, 0x4C, 0xE6, + 0xD2, 0xEA, 0x6B, 0xE3, 0x08, 0xE6, 0x83, 0xE4, 0xD1, 0xE2, 0xD2, 0xE0, + 0xCB, 0xE9, 0x0F, 0xE1, 0xA2, 0xEF, 0xA8, 0xEC, 0x99, 0xEC, 0x5B, 0xF3, + 0x3A, 0xE5, 0x44, 0xF9, 0xC8, 0xDC, 0x21, 0x00, 0x25, 0xDC, 0x9B, 0x03, + 0x80, 0xE3, 0x5D, 0x07, 0x24, 0xE6, 0x66, 0x04, 0x5B, 0xE0, 0x3F, 0xFB, + 0x80, 0xDF, 0x6F, 0xF7, 0xF2, 0xE7, 0x6E, 0xFA, 0x5F, 0xF0, 0x49, 0x02, + 0x05, 0xF3, 0xA9, 0x0B, 0x75, 0xF4, 0x51, 0x0F, 0xB0, 0xFB, 0x9B, 0x0A, + 0x96, 0x07, 0xDB, 0x04, 0x55, 0x10, 0x76, 0x06, 0x5F, 0x12, 0x30, 0x0A, + 0xD6, 0x0F, 0x71, 0x0C, 0x38, 0x07, 0x95, 0x10, 0x26, 0x04, 0xDC, 0x12, + 0x26, 0x0E, 0xC8, 0x0F, 0xC3, 0x1B, 0xC5, 0x0C, 0x7B, 0x20, 0x3B, 0x0E, + 0xE5, 0x1E, 0xB5, 0x13, 0x43, 0x25, 0x95, 0x1B, 0x33, 0x2C, 0x34, 0x1F, + 0xE3, 0x29, 0xF0, 0x1A, 0x37, 0x1F, 0xA2, 0x14, 0x16, 0x15, 0x6B, 0x11, + 0xC0, 0x16, 0xC3, 0x13, 0x37, 0x1E, 0xB6, 0x17, 0x38, 0x23, 0x13, 0x16, + 0x08, 0x27, 0x23, 0x12, 0xAA, 0x29, 0x10, 0x10, 0x25, 0x28, 0x95, 0x12, + 0x57, 0x27, 0xFD, 0x1A, 0x0C, 0x24, 0x28, 0x21, 0x06, 0x19, 0x9E, 0x22, + 0xC2, 0x1A, 0x33, 0x20, 0x69, 0x2C, 0xE2, 0x1A, 0xEA, 0x39, 0xE4, 0x16, + 0x32, 0x39, 0x04, 0x13, 0x9D, 0x29, 0x06, 0x13, 0xFD, 0x15, 0x8B, 0x17, + 0x2F, 0x10, 0xE1, 0x1E, 0x59, 0x1B, 0x84, 0x28, 0xCC, 0x28, 0xEC, 0x2B, + 0xAF, 0x2A, 0xB5, 0x25, 0xE9, 0x25, 0xB0, 0x20, 0x01, 0x21, 0xED, 0x26, + 0xF1, 0x18, 0x9F, 0x29, 0x02, 0x11, 0xE4, 0x24, 0x2C, 0x03, 0x6E, 0x29, + 0x4F, 0xF4, 0xDC, 0x2C, 0x35, 0xFA, 0x83, 0x26, 0x47, 0x0D, 0x98, 0x22, + 0x65, 0x16, 0x64, 0x1F, 0x3D, 0x12, 0x8C, 0x1A, 0xDD, 0x08, 0x15, 0x1B, + 0x2B, 0x03, 0xAE, 0x1E, 0xEE, 0x08, 0x8B, 0x1A, 0x15, 0x11, 0xD1, 0x12, + 0x11, 0x12, 0x33, 0x13, 0xE3, 0x12, 0x01, 0x14, 0xFC, 0x19, 0xC6, 0x0E, + 0x7E, 0x1E, 0x56, 0x04, 0x14, 0x1B, 0x54, 0xF7, 0x05, 0x16, 0xFC, 0xEF, + 0xAF, 0x0E, 0x65, 0xEF, 0xCF, 0x0C, 0xB4, 0xF0, 0xF3, 0x14, 0x7C, 0xF3, + 0x1C, 0x19, 0xE8, 0xF9, 0xA1, 0x15, 0xF2, 0xFA, 0x29, 0x0E, 0x26, 0xF6, + 0x38, 0x04, 0x8D, 0xF4, 0xE6, 0xFF, 0x41, 0xF3, 0x31, 0x02, 0x38, 0xEF, + 0x1E, 0x01, 0xCD, 0xEC, 0x88, 0xFF, 0xF8, 0xEE, 0xC3, 0x05, 0x52, 0xF3, + 0xB1, 0x09, 0x08, 0xFE, 0xC8, 0x00, 0xE1, 0x08, 0x7A, 0xEC, 0xB6, 0x08, + 0x7F, 0xDA, 0xB9, 0x06, 0x67, 0xD7, 0x5B, 0x05, 0x04, 0xE2, 0x06, 0x00, + 0x7D, 0xF1, 0xE7, 0xFF, 0x4D, 0xF5, 0x56, 0x05, 0x03, 0xF1, 0xA8, 0x01, + 0xA9, 0xF0, 0x55, 0xFB, 0xC5, 0xEE, 0x98, 0xF9, 0xE0, 0xEF, 0x7B, 0xF5, + 0x33, 0xF7, 0x67, 0xF3, 0x22, 0xFA, 0x76, 0xF8, 0xB3, 0xF6, 0x45, 0x01, + 0x0E, 0xF7, 0xCC, 0x04, 0xC0, 0xF8, 0xC7, 0xFF, 0xCE, 0xF5, 0x05, 0xFA, + 0x7E, 0xF5, 0x30, 0xFB, 0x08, 0xFA, 0x70, 0x03, 0x6D, 0x02, 0xB9, 0x0B, + 0x3D, 0x08, 0xD8, 0x0E, 0x77, 0x05, 0xB4, 0x0C, 0xBC, 0x00, 0x80, 0x09, + 0xEA, 0xFE, 0x14, 0x0C, 0xDC, 0xFE, 0xAF, 0x14, 0x4A, 0xFE, 0x4A, 0x16, + 0xF1, 0xFC, 0x90, 0x0E, 0x93, 0xFF, 0x12, 0x0A, 0xA2, 0x06, 0xEB, 0x06, + 0xD1, 0x0F, 0x82, 0x02, 0xB6, 0x16, 0x98, 0xFF, 0xF2, 0x10, 0x34, 0xFC, + 0x06, 0x06, 0x57, 0xFA, 0x00, 0x08, 0x91, 0xFE, 0xEC, 0x0A, 0x41, 0x06, + 0xF6, 0x03, 0xE1, 0x03, 0xE2, 0xFB, 0xC1, 0xF4, 0xD0, 0xF4, 0x21, 0xEA, + 0xBE, 0xF0, 0x5D, 0xE8, 0x1A, 0xED, 0x01, 0xE4, 0x62, 0xE9, 0x0C, 0xE4, + 0x16, 0xE9, 0xE6, 0xEC, 0xDC, 0xEA, 0xCA, 0xED, 0x70, 0xF0, 0x03, 0xE9, + 0xE2, 0xF3, 0x9B, 0xE5, 0x9D, 0xF0, 0x10, 0xDE, 0xB7, 0xE5, 0x77, 0xDA, + 0x02, 0xD2, 0x65, 0xDF, 0xA5, 0xC5, 0x8F, 0xE5, 0xF9, 0xC4, 0xAA, 0xE7, + 0x18, 0xCA, 0x10, 0xE6, 0xB8, 0xD3, 0x31, 0xDF, 0xB6, 0xDD, 0xAB, 0xD5, + 0x3C, 0xE4, 0xFD, 0xCE, 0xA0, 0xE1, 0x9C, 0xCE, 0x13, 0xDA, 0x26, 0xD6, + 0x05, 0xD7, 0xB2, 0xDB, 0x3F, 0xDE, 0x18, 0xE2, 0xBD, 0xE9, 0x3C, 0xE8, + 0xE0, 0xED, 0x5B, 0xDE, 0x12, 0xE9, 0xAF, 0xCF, 0x6A, 0xE3, 0x22, 0xCD, + 0x6C, 0xEB, 0x5F, 0xD3, 0xC8, 0xFF, 0x70, 0xE2, 0xF7, 0x15, 0x1F, 0x00, + 0x19, 0x2A, 0x73, 0x24, 0x82, 0x35, 0xB3, 0x3A, 0x22, 0x39, 0x7C, 0x3B, + 0xA5, 0x4C, 0x69, 0x47, 0xFB, 0x52, 0x99, 0x4A, 0x60, 0x3E, 0x72, 0x34, + 0x68, 0x51, 0x9B, 0x45, 0xA6, 0x4D, 0x8A, 0x41, 0x95, 0x13, 0x1F, 0x11, + 0xDC, 0x1E, 0xB8, 0x27, 0xED, 0x53, 0xE5, 0x5E, 0x32, 0x48, 0xA8, 0x58, + 0x1D, 0x25, 0xF8, 0x37, 0x08, 0x19, 0x08, 0x21, 0xFD, 0xFC, 0x4B, 0x04, + 0x91, 0xCF, 0xED, 0xE8, 0x79, 0xAC, 0x29, 0xD4, 0xFF, 0xA6, 0x08, 0xCC, + 0x80, 0xAE, 0xC0, 0xC5, 0x04, 0xB4, 0xF3, 0xC0, 0x56, 0xBC, 0x85, 0xC6, + 0x07, 0xAF, 0xC4, 0xB4, 0xDC, 0xA1, 0x74, 0xA3, 0xCD, 0xB2, 0x71, 0xB7, + 0xAE, 0xB2, 0x8A, 0xBB, 0x54, 0x98, 0xA9, 0xA4, 0xE2, 0xAA, 0x92, 0xBA, + 0x92, 0xD9, 0xBA, 0xE2, 0xA9, 0xDB, 0x3A, 0xD9, 0x7D, 0xD2, 0x30, 0xCB, + 0x8E, 0xDD, 0x61, 0xD3, 0x3E, 0xDD, 0x3D, 0xD0, 0x38, 0xE7, 0x26, 0xD7, + 0x62, 0x09, 0x2A, 0xF8, 0x1D, 0x13, 0xEB, 0x0A, 0x26, 0x2A, 0xCF, 0x2C, + 0xA4, 0x4F, 0x12, 0x54, 0xBD, 0x47, 0x95, 0x40, 0x4A, 0x4A, 0xAE, 0x2E, + 0x42, 0x57, 0x91, 0x36, 0xE3, 0x3F, 0x85, 0x2C, 0x9A, 0x35, 0xCC, 0x2E, + 0x12, 0x52, 0x34, 0x52, 0x4A, 0x66, 0xAE, 0x62, 0x8D, 0x5D, 0x14, 0x4F, + 0x18, 0x56, 0xE5, 0x40, 0x61, 0x54, 0xC8, 0x36, 0x1E, 0x41, 0xF0, 0x1C, + 0x68, 0x2D, 0xFB, 0x0F, 0x62, 0x29, 0x96, 0x1B, 0x4E, 0x1C, 0xA9, 0x1C, + 0xC4, 0x06, 0x7E, 0x0A, 0x16, 0x07, 0x24, 0x0A, 0xE7, 0x10, 0x08, 0x12, + 0xA1, 0xF3, 0x0B, 0xE6, 0x29, 0xD7, 0x2A, 0xC4, 0xC4, 0xE6, 0x70, 0xE8, + 0x6F, 0xD0, 0x3A, 0xDF, 0x4B, 0xA1, 0xD2, 0xAC, 0x00, 0x9F, 0xD2, 0xB1, + 0x99, 0xA0, 0x1C, 0xBE, 0xC5, 0x9C, 0x87, 0xB4, 0xDE, 0xA3, 0xB4, 0xB5, + 0xC2, 0xA0, 0x47, 0xB8, 0xB0, 0x97, 0xB5, 0xAC, 0x1B, 0x9D, 0x99, 0xA9, + 0x13, 0xA9, 0xC6, 0xB8, 0x11, 0xBA, 0x37, 0xCD, 0x5E, 0xD4, 0x29, 0xE4, + 0x73, 0xF5, 0x26, 0x05, 0x9C, 0x18, 0x15, 0x24, 0x70, 0x28, 0x7B, 0x29, + 0xC8, 0x29, 0xFB, 0x20, 0xBE, 0x2D, 0xBD, 0x15, 0x36, 0x2E, 0xBC, 0x08, + 0x6F, 0x2E, 0x7E, 0x06, 0xA2, 0x33, 0x8C, 0x0D, 0xFB, 0x34, 0xDD, 0x12, + 0xC5, 0x44, 0x38, 0x24, 0x5B, 0x56, 0xFA, 0x34, 0x10, 0x45, 0xCF, 0x2D, + 0xF7, 0x2D, 0x16, 0x27, 0xE8, 0x27, 0x1B, 0x22, 0x93, 0x18, 0x28, 0x06, + 0xB2, 0x07, 0x79, 0xEE, 0xFB, 0x0A, 0xD8, 0xEE, 0x37, 0x00, 0x72, 0xE3, + 0x33, 0xED, 0x01, 0xDD, 0xC0, 0xDB, 0xEB, 0xDC, 0x8A, 0xB2, 0xB2, 0xBC, + 0x5D, 0x9E, 0x07, 0xB0, 0xF5, 0xA8, 0x46, 0xC4, 0x35, 0xA6, 0x98, 0xC6, + 0x51, 0xAA, 0x68, 0xC5, 0x97, 0xC0, 0xF0, 0xD0, 0xD8, 0xC7, 0xB3, 0xD2, + 0x8A, 0xBE, 0x0A, 0xCA, 0x84, 0xB6, 0x3C, 0xC6, 0x0B, 0xB8, 0xA8, 0xC5, + 0x2D, 0xCA, 0xBB, 0xD1, 0xA4, 0xD9, 0x2C, 0xE4, 0x19, 0xD2, 0xBA, 0xDE, + 0x80, 0xD0, 0xBC, 0xD6, 0x4B, 0xEE, 0x5C, 0xF4, 0x2C, 0x06, 0x4D, 0x0D, + 0xAA, 0xFA, 0x18, 0xFF, 0xB0, 0xF4, 0x91, 0x01, 0x2D, 0x09, 0xB6, 0x16, + 0x6C, 0x15, 0x5B, 0x15, 0xB4, 0x17, 0x53, 0x14, 0xB4, 0x27, 0x72, 0x2B, + 0xD9, 0x39, 0xC4, 0x43, 0xF9, 0x36, 0x50, 0x47, 0xAD, 0x1E, 0x7B, 0x34, + 0x30, 0x1D, 0x25, 0x27, 0x03, 0x31, 0x2E, 0x2D, 0xD5, 0x32, 0xB3, 0x2C, + 0x2F, 0x36, 0x0A, 0x2C, 0x15, 0x41, 0x45, 0x32, 0x06, 0x45, 0xF7, 0x30, + 0xF9, 0x3E, 0x25, 0x2F, 0xCB, 0x33, 0x48, 0x32, 0xA5, 0x1C, 0xDA, 0x24, + 0xE9, 0x0B, 0x55, 0x11, 0xDB, 0x16, 0xE7, 0x11, 0xBD, 0x23, 0x50, 0x19, + 0x2E, 0x31, 0xBF, 0x26, 0x3A, 0x45, 0x1E, 0x41, 0x1B, 0x50, 0xEF, 0x59, + 0x53, 0x53, 0xFF, 0x5B, 0x78, 0x5B, 0xFF, 0x50, 0x8F, 0x5F, 0x7E, 0x50, + 0x55, 0x52, 0x0A, 0x4B, 0x81, 0x3F, 0xCA, 0x39, 0x6B, 0x4A, 0x0F, 0x40, + 0xE8, 0x5F, 0x7B, 0x54, 0x44, 0x61, 0x43, 0x5D, 0xEF, 0x59, 0x43, 0x5E, + 0x72, 0x5B, 0x0F, 0x60, 0x45, 0x64, 0xDA, 0x5F, 0x62, 0x62, 0x2E, 0x57, + 0xB9, 0x5E, 0xA1, 0x4F, 0xCE, 0x53, 0x3C, 0x48, 0x5D, 0x40, 0xB1, 0x40, + 0xA6, 0x41, 0x98, 0x44, 0x1C, 0x51, 0xB0, 0x51, 0xDF, 0x46, 0xBE, 0x49, + 0x37, 0x37, 0x79, 0x37, 0xC5, 0x42, 0x2F, 0x30, 0x3A, 0x45, 0x6F, 0x1D, + 0x05, 0x37, 0x18, 0x11, 0x34, 0x2D, 0xAA, 0x18, 0x14, 0x23, 0x05, 0x1C, + 0x9E, 0x26, 0x35, 0x29, 0x59, 0x2E, 0x44, 0x36, 0x11, 0x33, 0xDA, 0x31, + 0x3A, 0x2B, 0xEF, 0x1D, 0xE1, 0x1F, 0xDC, 0x0C, 0xB9, 0x1C, 0x23, 0x09, + 0x07, 0x0D, 0x5C, 0x06, 0xB5, 0x02, 0x96, 0x07, 0x5C, 0xFB, 0xEB, 0x07, + 0x9F, 0xFB, 0x4A, 0x0D, 0x2F, 0x02, 0xE6, 0x0A, 0x59, 0xF2, 0xEE, 0xF8, + 0xED, 0xDE, 0x0F, 0xEE, 0xD3, 0xD7, 0x2D, 0xED, 0x4E, 0xCD, 0x26, 0xE3, + 0xE6, 0xC4, 0xE7, 0xD7, 0xE5, 0xCA, 0x56, 0xE1, 0x17, 0xD4, 0xBE, 0xF0, + 0x52, 0xD9, 0x36, 0xF4, 0xD8, 0xD4, 0xA8, 0xEA, 0x93, 0xCA, 0xE0, 0xD5, + 0x8B, 0xCC, 0xBC, 0xCA, 0x7E, 0xDE, 0xEB, 0xDE, 0x47, 0xE8, 0x63, 0xEF, + 0x73, 0xDB, 0x37, 0xE6, 0x64, 0xD2, 0x29, 0xDF, 0x9F, 0xC3, 0x91, 0xD0, + 0xE9, 0xB8, 0x9B, 0xC4, 0x79, 0xB5, 0xD3, 0xBF, 0x56, 0xAD, 0x6E, 0xAE, + 0x2E, 0xBE, 0x26, 0xA7, 0xCE, 0xC8, 0x58, 0xA4, 0xAE, 0xBB, 0xB4, 0xA2, + 0xF5, 0xA9, 0x5B, 0xA8, 0x69, 0xA7, 0x77, 0xAB, 0xD5, 0xAB, 0xB6, 0xAD, + 0x65, 0xA8, 0xCA, 0xA2, 0x25, 0xB3, 0x35, 0x9D, 0x16, 0xAD, 0x79, 0xA2, + 0x1E, 0xA3, 0xF2, 0x9D, 0x38, 0xAF, 0x7A, 0xA2, 0xAE, 0xB6, 0xAB, 0xB7, + 0x3C, 0xC1, 0xA8, 0xCA, 0x69, 0xD4, 0x8F, 0xDD, 0xA7, 0xE0, 0xF8, 0xE3, + 0x01, 0xF2, 0x84, 0xE0, 0xAE, 0x0B, 0x57, 0xF0, 0x3F, 0x08, 0x9F, 0xFC, + 0x91, 0xFB, 0xC2, 0xFD, 0x46, 0xFA, 0xD4, 0x02, 0xEC, 0xF9, 0x7D, 0x0B, + 0x40, 0x07, 0x08, 0x1D, 0xBB, 0x1E, 0xD4, 0x28, 0xEA, 0x2B, 0xA3, 0x26, + 0xD6, 0x28, 0xE1, 0x1F, 0xDB, 0x2F, 0x1E, 0x1E, 0x23, 0x31, 0xA3, 0x1B, + 0xA4, 0x13, 0x66, 0x0B, 0xA7, 0x07, 0x86, 0x0B, 0x80, 0x11, 0x38, 0x26, + 0x87, 0x00, 0xB1, 0x29, 0x1B, 0xEB, 0x11, 0x10, 0x9E, 0xF1, 0x6A, 0x00, + 0x36, 0xFF, 0xE6, 0xFB, 0xB0, 0x03, 0xBB, 0xF7, 0x7E, 0xFF, 0xF3, 0xF8, + 0xCD, 0xF2, 0xC9, 0xFA, 0x12, 0xF0, 0xCA, 0xFA, 0x9C, 0x00, 0x5E, 0xFD, + 0x97, 0x0B, 0x05, 0x0E, 0xB6, 0x0D, 0xFA, 0x1F, 0x76, 0x16, 0x44, 0x1C, + 0x35, 0x21, 0x9B, 0x12, 0x90, 0x27, 0xD3, 0x15, 0xC5, 0x24, 0x98, 0x10, + 0x0F, 0x1F, 0x21, 0x01, 0xF7, 0x26, 0xC5, 0x05, 0xE0, 0x3E, 0xA7, 0x16, + 0xE3, 0x53, 0x95, 0x27, 0xF8, 0x51, 0x7C, 0x3C, 0xE6, 0x45, 0x2B, 0x3E, + 0xC4, 0x33, 0xE9, 0x2E, 0x02, 0x1A, 0xE3, 0x17, 0xB9, 0x1D, 0x3D, 0x03, + 0x77, 0x29, 0x19, 0x05, 0x5E, 0x28, 0x78, 0x15, 0x10, 0x2D, 0x53, 0x14, + 0x77, 0x21, 0xFC, 0x02, 0xAB, 0x0F, 0xD1, 0x05, 0xC7, 0x12, 0x82, 0x15, + 0x0F, 0x12, 0x4B, 0x15, 0xBD, 0xF4, 0x84, 0x02, 0x3C, 0xE2, 0xC1, 0xF8, + 0x90, 0xF3, 0x0A, 0xF4, 0xCD, 0x01, 0xEA, 0xED, 0x09, 0x01, 0xBE, 0xF0, + 0x02, 0xF8, 0xA3, 0xEE, 0x4A, 0xE7, 0xDB, 0xED, 0xA9, 0xE4, 0x94, 0xF5, + 0x48, 0xF8, 0x05, 0x0A, 0xFC, 0xF4, 0xAB, 0x0A, 0x50, 0xDD, 0xFF, 0xE4, + 0xF0, 0xDA, 0x78, 0xE0, 0xD3, 0xDF, 0xAB, 0xF7, 0x02, 0xE0, 0xA0, 0xEB, + 0xCD, 0xD1, 0x5C, 0xD7, 0x7A, 0xBB, 0x17, 0xD1, 0x45, 0xC5, 0x7D, 0xDF, + 0xCE, 0xD0, 0xC4, 0xE0, 0xCA, 0xCA, 0x72, 0xCD, 0xB0, 0xDF, 0x8B, 0xD6, + 0x0A, 0xF7, 0xDB, 0xF6, 0x2B, 0xF6, 0x56, 0x15, 0xC7, 0xE6, 0x32, 0x17, + 0xA6, 0xEC, 0x3D, 0x0E, 0x75, 0x0B, 0x07, 0x03, 0x3F, 0x1E, 0x61, 0xFD, + 0x5B, 0x29, 0x9C, 0x1A, 0x33, 0x1C, 0xA8, 0x2E, 0x85, 0x0C, 0x14, 0x1E, + 0xED, 0x16, 0x7F, 0x13, 0xC1, 0x1C, 0xC4, 0x1D, 0xA9, 0x16, 0xA8, 0x20, + 0x08, 0xFE, 0x53, 0x11, 0xC1, 0xE8, 0x77, 0x0A, 0xDB, 0xF3, 0xF7, 0x04, + 0xC1, 0xF2, 0x25, 0xF2, 0xCD, 0xD1, 0x64, 0xDA, 0x39, 0xC1, 0x2D, 0xC8, + 0x7E, 0xC8, 0x1D, 0xBF, 0x6C, 0xD2, 0xEA, 0xBE, 0x2B, 0xD8, 0x7B, 0xCC, + 0x43, 0xD4, 0x19, 0xC2, 0x9D, 0xCA, 0x67, 0xAF, 0x92, 0xC7, 0x4F, 0xC2, + 0x67, 0xC7, 0x84, 0xDE, 0x10, 0xCB, 0x94, 0xF2, 0xED, 0xC4, 0x16, 0xF6, + 0x76, 0xC9, 0xED, 0xEC, 0x3D, 0xEC, 0x9C, 0xF5, 0x2D, 0xEC, 0xE9, 0xFB, + 0x21, 0xD7, 0xF6, 0xF2, 0x41, 0xD5, 0xFF, 0xEC, 0x82, 0xDD, 0x4C, 0xE1, + 0xB0, 0xED, 0x6F, 0xDF, 0x5E, 0xE1, 0x54, 0xF0, 0xBC, 0xD1, 0xFF, 0xFD, + 0x10, 0xE3, 0xE9, 0xFE, 0x2B, 0xF9, 0xB7, 0xFA, 0xBE, 0x00, 0x13, 0xEF, + 0x75, 0xF1, 0xDC, 0xE6, 0x07, 0xE0, 0x23, 0xE3, 0xBD, 0xDE, 0x64, 0xD7, + 0x1F, 0xE9, 0x26, 0xD7, 0x30, 0x00, 0x8E, 0xD9, 0xB6, 0x03, 0x01, 0xDB, + 0x82, 0xF5, 0xB8, 0xEA, 0xFB, 0xFF, 0xCB, 0xF7, 0xC1, 0x14, 0xF5, 0xFC, + 0x3A, 0x12, 0x6D, 0x07, 0xB0, 0xF9, 0xB8, 0x11, 0x9A, 0xF1, 0x90, 0x10, + 0xC0, 0xFA, 0xBD, 0x11, 0x72, 0xF6, 0xA2, 0x0D, 0xA6, 0xF2, 0x7C, 0xF3, + 0xFD, 0xE6, 0xD4, 0xD6, 0xE4, 0xC2, 0x14, 0xCC, 0xFE, 0xA6, 0x7F, 0xC5, + 0xF3, 0xA2, 0xC2, 0xB3, 0xBC, 0xA8, 0x8A, 0xAF, 0xEC, 0xB4, 0x0F, 0xAA, + 0x28, 0xB3, 0xFF, 0xA2, 0x64, 0x9E, 0xE1, 0xA5, 0xD6, 0xA4, 0x4A, 0xA2, + 0x26, 0xB4, 0x9D, 0x9E, 0x92, 0xB4, 0x4B, 0xA1, 0xA5, 0xB1, 0x50, 0xAF, + 0xEF, 0xB5, 0x5E, 0xC8, 0x72, 0xB7, 0x07, 0xCF, 0x1B, 0xAC, 0x76, 0xB6, + 0x04, 0xC0, 0x8F, 0xAD, 0x63, 0xDB, 0x88, 0xC9, 0xCD, 0xE0, 0xAE, 0xF6, + 0x08, 0x00, 0xEC, 0x21, 0xF9, 0x26, 0xF2, 0x30, 0xD4, 0x2D, 0x25, 0x26, + 0xFC, 0x39, 0x83, 0x1C, 0xF1, 0x36, 0xBE, 0x20, 0x2D, 0x17, 0x0C, 0x24, + 0xD2, 0x25, 0xB9, 0x1C, 0xC2, 0x3C, 0x4F, 0x05, 0x4B, 0x3B, 0x82, 0xFC, + 0xC3, 0x43, 0x23, 0x0F, 0x15, 0x3C, 0xDB, 0x17, 0x3D, 0x29, 0x73, 0x1D, + 0x86, 0x24, 0xF3, 0x12, 0xAE, 0x25, 0x53, 0xFB, 0xF5, 0x15, 0xB3, 0xF6, + 0xCB, 0xFE, 0x44, 0xFA, 0x1F, 0x06, 0xA8, 0xFF, 0x39, 0x10, 0xFB, 0x0F, + 0x88, 0x02, 0x43, 0x13, 0x50, 0x05, 0x9E, 0x04, 0x1F, 0x12, 0x18, 0x0B, + 0x4F, 0x08, 0x7A, 0x02, 0x13, 0x03, 0xEE, 0xF1, 0xE1, 0x12, 0xB2, 0x06, + 0x0E, 0x2F, 0xEF, 0x1F, 0xEB, 0x39, 0x23, 0x29, 0xF5, 0x30, 0xA8, 0x29, + 0xB9, 0x34, 0x04, 0x2C, 0x9F, 0x1D, 0xA9, 0x1F, 0x91, 0x00, 0xBD, 0x14, + 0x43, 0x15, 0xF6, 0x2A, 0xBA, 0x2B, 0x6B, 0x34, 0x55, 0x2C, 0xE7, 0x21, + 0xAA, 0x34, 0x20, 0x31, 0xD8, 0x33, 0x61, 0x41, 0x77, 0x26, 0xB6, 0x29, + 0xAC, 0x29, 0x87, 0x31, 0x99, 0x1F, 0xB3, 0x31, 0x36, 0x0F, 0x23, 0x1A, + 0x95, 0x1C, 0xC8, 0x31, 0x28, 0x27, 0xBD, 0x3C, 0xAC, 0x19, 0x64, 0x32, + 0x0B, 0x1F, 0x2D, 0x45, 0xA9, 0x3A, 0xEA, 0x5E, 0x09, 0x42, 0x53, 0x5D, + 0xB8, 0x48, 0xB4, 0x4D, 0x55, 0x56, 0xE5, 0x4A, 0x3A, 0x55, 0x62, 0x42, + 0x58, 0x53, 0x64, 0x39, 0xE2, 0x56, 0xC5, 0x36, 0x15, 0x49, 0xFF, 0x31, + 0xDC, 0x38, 0x05, 0x30, 0xFF, 0x41, 0x96, 0x33, 0x51, 0x47, 0x72, 0x2D, + 0x5F, 0x2E, 0x6F, 0x18, 0xA6, 0x1D, 0x42, 0x0F, 0x03, 0x1D, 0xB4, 0x0D, + 0x5B, 0x1A, 0x74, 0x21, 0xFF, 0x24, 0xAD, 0x31, 0x5A, 0x24, 0xA3, 0x2A, + 0xE9, 0x1A, 0x52, 0x39, 0xF7, 0x25, 0x73, 0x48, 0x7E, 0x24, 0x92, 0x41, + 0x61, 0x19, 0x96, 0x43, 0x29, 0x1E, 0xE3, 0x44, 0x5F, 0x24, 0xC9, 0x33, + 0x2D, 0x19, 0xA2, 0x1E, 0xFF, 0x0B, 0x8D, 0x10, 0xAD, 0x0F, 0x86, 0x1A, + 0xBC, 0x1B, 0x60, 0x2F, 0xEF, 0x27, 0x3E, 0x35, 0xD5, 0x24, 0x03, 0x23, + 0x7A, 0x15, 0x19, 0x0C, 0xD8, 0x10, 0x31, 0x08, 0xDD, 0x0D, 0xB9, 0x09, + 0x51, 0x01, 0x91, 0x0C, 0x68, 0x0B, 0x06, 0x0D, 0xD2, 0x1F, 0x8B, 0xFB, + 0xA3, 0x26, 0xB9, 0xF8, 0x47, 0x1C, 0x4C, 0x09, 0xCE, 0x0C, 0x85, 0x01, + 0x43, 0x1A, 0xDB, 0xFA, 0x01, 0x29, 0x6B, 0x0F, 0x17, 0x27, 0x1B, 0x16, + 0xC2, 0x2E, 0xF1, 0x0D, 0xE1, 0x39, 0x8F, 0x16, 0xC8, 0x45, 0x19, 0x22, + 0x29, 0x4F, 0x8D, 0x21, 0xD5, 0x33, 0xDF, 0x1A, 0x89, 0x17, 0x17, 0x12, + 0x71, 0x1D, 0xCB, 0x01, 0x74, 0x21, 0x76, 0xFD, 0x99, 0x1F, 0x51, 0x12, + 0x93, 0x15, 0xA9, 0x21, 0xA1, 0xFF, 0xA0, 0x1C, 0x82, 0x04, 0x28, 0x14, + 0x1C, 0x15, 0xFA, 0x0D, 0x5E, 0x11, 0xCD, 0x09, 0x51, 0x0C, 0x1C, 0x13, + 0x64, 0x16, 0xB0, 0x21, 0xD9, 0x2D, 0xFC, 0x27, 0x50, 0x42, 0xB6, 0x26, + 0x1E, 0x4D, 0x90, 0x1E, 0xD2, 0x3C, 0xB6, 0x1E, 0xF7, 0x17, 0x5A, 0x2C, + 0xCD, 0x16, 0xA1, 0x35, 0x97, 0x2D, 0x14, 0x29, 0xF7, 0x32, 0x5B, 0x1B, + 0xBB, 0x2C, 0x0D, 0x26, 0xE7, 0x18, 0x30, 0x2A, 0x42, 0xF6, 0x5F, 0x07, + 0x7B, 0xEE, 0x52, 0xED, 0xC8, 0xF6, 0xED, 0xEE, 0xED, 0xDC, 0x7A, 0xDE, + 0xA3, 0xC3, 0xC4, 0xDD, 0xCE, 0xD5, 0x07, 0xEE, 0xDF, 0xE6, 0x26, 0xDE, + 0x56, 0xD7, 0x5D, 0xD0, 0xF4, 0xD7, 0x89, 0xD7, 0x83, 0xDC, 0x2D, 0xDD, + 0x30, 0xCA, 0xB8, 0xE3, 0xFD, 0xD0, 0x3F, 0xE3, 0xBF, 0xEB, 0x51, 0xD5, + 0xA9, 0xF9, 0x12, 0xD1, 0xFC, 0x03, 0x8B, 0xDE, 0x5D, 0x05, 0xB1, 0xF2, + 0x1B, 0xFF, 0x3B, 0xFB, 0xE2, 0x01, 0x5F, 0xFE, 0x4E, 0xFE, 0xCB, 0x0A, + 0x6D, 0xF7, 0xBF, 0x18, 0xEB, 0xF4, 0x48, 0x25, 0x65, 0xFD, 0x2D, 0x25, + 0x75, 0x09, 0x84, 0x19, 0x15, 0x07, 0x5D, 0x22, 0x9D, 0xF0, 0x51, 0x21, + 0x1F, 0xC1, 0x9F, 0xF8, 0x93, 0xA4, 0x97, 0xD9, 0xF1, 0xB0, 0x26, 0xCC, + 0x6A, 0xB1, 0x35, 0xC3, 0x5D, 0xA3, 0x38, 0xCD, 0xBA, 0xB1, 0x20, 0xDC, + 0xA8, 0xC4, 0xF8, 0xDC, 0x9E, 0xC0, 0x3B, 0xCD, 0x2D, 0xC3, 0x45, 0xC9, + 0x89, 0xC9, 0x84, 0xD0, 0x24, 0xC1, 0x76, 0xD8, 0xDF, 0xB9, 0xF2, 0xE2, + 0x11, 0xC3, 0x3A, 0xD5, 0x87, 0xCC, 0x1C, 0xC4, 0xE4, 0xBC, 0x36, 0xCA, + 0x1E, 0xAE, 0xF5, 0xD8, 0x50, 0xB1, 0x2E, 0xE3, 0x91, 0xB4, 0xBF, 0xDC, + 0x25, 0xBA, 0x44, 0xCF, 0x4A, 0xBC, 0x56, 0xDF, 0xED, 0xC0, 0xB2, 0xEC, + 0x29, 0xCA, 0x10, 0xD7, 0x7C, 0xCF, 0x87, 0xCD, 0xF5, 0xD7, 0xED, 0xCF, + 0xCA, 0xD6, 0x13, 0xC9, 0x87, 0xD2, 0x5D, 0xC4, 0xDC, 0xDB, 0xCC, 0xC2, + 0xF1, 0xE2, 0x48, 0xC5, 0xD7, 0xE1, 0x99, 0xD2, 0x44, 0xE6, 0x2F, 0xE0, + 0xE8, 0xE3, 0xD5, 0xDC, 0x4B, 0xE6, 0xDB, 0xD6, 0x02, 0xEE, 0x3D, 0xE1, + 0x89, 0xE0, 0xB0, 0xEB, 0x46, 0xE6, 0x3C, 0xF6, 0x35, 0xF6, 0xD5, 0x05, + 0x2E, 0xF9, 0x1E, 0x05, 0xCE, 0xF9, 0x63, 0xF3, 0xC4, 0xEF, 0xD3, 0xEC, + 0xE1, 0xDA, 0x50, 0xEC, 0xC0, 0xCF, 0x9C, 0xEB, 0x44, 0xD6, 0x32, 0xE8, + 0xB6, 0xE1, 0x51, 0xD4, 0x72, 0xE8, 0x10, 0xC4, 0xDC, 0xDC, 0x1C, 0xCC, + 0xAA, 0xCE, 0xD4, 0xD5, 0x26, 0xBD, 0x2B, 0xC6, 0x4C, 0xB5, 0xC1, 0xB7, + 0x0B, 0xC6, 0x2F, 0xBC, 0xCB, 0xCC, 0xE4, 0xC7, 0xE8, 0xCD, 0xB2, 0xDC, + 0xEC, 0xD3, 0x6C, 0xE9, 0x7D, 0xDB, 0x6E, 0xEF, 0xB7, 0xD9, 0xEE, 0xF1, + 0x61, 0xDC, 0x0E, 0xE8, 0x00, 0xEA, 0x26, 0xE7, 0x86, 0xE5, 0x46, 0xF9, + 0x7F, 0xD5, 0x7B, 0xFE, 0xC5, 0xCA, 0xA3, 0xE4, 0xC7, 0xC7, 0x66, 0xD2, + 0xE0, 0xC3, 0xBC, 0xD5, 0x2E, 0xBE, 0x85, 0xD7, 0xE3, 0xBD, 0x65, 0xCB, + 0xD7, 0xD2, 0x58, 0xC1, 0x5E, 0xF3, 0x9A, 0xC9, 0xBC, 0xEF, 0xE2, 0xD2, + 0xCF, 0xD0, 0x3B, 0xC3, 0x37, 0xCC, 0xF8, 0xB0, 0xDC, 0xDA, 0xB5, 0xB3, + 0x24, 0xDE, 0x2D, 0xBB, 0xB3, 0xD6, 0x1D, 0xC4, 0x47, 0xD2, 0xA7, 0xCD, + 0xC6, 0xD2, 0xEB, 0xCC, 0x32, 0xE0, 0x32, 0xD0, 0x47, 0xED, 0x1E, 0xE6, + 0x34, 0xDC, 0x36, 0xF2, 0x68, 0xD3, 0x97, 0xF8, 0xBC, 0xE1, 0x4B, 0xFA, + 0xD6, 0xEC, 0xBD, 0xFC, 0x76, 0xF3, 0x90, 0x0A, 0x0F, 0xEA, 0xBA, 0xFE, + 0x10, 0xDC, 0x82, 0xFE, 0xEA, 0xE1, 0xAD, 0x0B, 0x1A, 0xEE, 0x7B, 0x02, + 0x0F, 0xEC, 0x78, 0xFD, 0x1D, 0xDE, 0x39, 0xF5, 0xA2, 0xD3, 0x9C, 0xE8, + 0x90, 0xC9, 0x7C, 0xE0, 0xC1, 0xC8, 0x6D, 0xD3, 0x83, 0xC7, 0x36, 0xC7, + 0x3A, 0xAC, 0x52, 0xC9, 0x2F, 0xB8, 0xB7, 0xD8, 0x86, 0xE4, 0xA5, 0xE6, + 0xF4, 0xE5, 0xE9, 0xE3, 0xAC, 0xE3, 0xD1, 0xE8, 0x33, 0xF5, 0x02, 0xF8, + 0x8E, 0x06, 0x17, 0xF5, 0x6C, 0x16, 0x0C, 0xF7, 0x8D, 0x10, 0xEB, 0xFA, + 0xB5, 0x01, 0xDE, 0xFE, 0xFC, 0x0B, 0x1D, 0x09, 0x23, 0x17, 0xA5, 0x00, + 0xEC, 0x0F, 0x47, 0xE5, 0x43, 0x09, 0x8C, 0xE2, 0x69, 0x02, 0x3A, 0xF2, + 0xF4, 0xFA, 0xA9, 0xE2, 0x25, 0xF6, 0x25, 0xCC, 0x5C, 0xFE, 0xDC, 0xCF, + 0x7C, 0xF2, 0x9A, 0xC6, 0x68, 0xD4, 0x7D, 0xB6, 0x4C, 0xCC, 0xCD, 0xC0, + 0xE6, 0xD6, 0xD7, 0xCE, 0x79, 0xF6, 0x54, 0xE7, 0x80, 0x0D, 0xEE, 0x06, + 0xFE, 0x0E, 0x94, 0x13, 0x34, 0x07, 0x9C, 0x15, 0x2E, 0x11, 0xB9, 0x1A, + 0x87, 0x2C, 0xE5, 0x1A, 0xB9, 0x3D, 0x8A, 0x19, 0x32, 0x4C, 0x22, 0x2D, + 0x15, 0x54, 0x2B, 0x46, 0x26, 0x50, 0xA1, 0x53, 0x08, 0x50, 0x65, 0x58, + 0x88, 0x5B, 0x26, 0x58, 0x1A, 0x5C, 0x22, 0x5A, 0xBC, 0x56, 0x3E, 0x56, + 0x86, 0x59, 0x90, 0x45, 0x8B, 0x58, 0x7B, 0x46, 0x75, 0x51, 0xC5, 0x4C, + 0x20, 0x44, 0x8E, 0x38, 0xCD, 0x36, 0x17, 0x25, 0xFC, 0x29, 0xF6, 0x1C, + 0x16, 0x20, 0x07, 0x1E, 0x16, 0x21, 0xCB, 0x20, 0xA5, 0x2C, 0x70, 0x18, + 0x65, 0x30, 0xDE, 0x14, 0x5C, 0x30, 0xAE, 0x29, 0x4C, 0x35, 0xA3, 0x2D, + 0x71, 0x32, 0x79, 0x22, 0x08, 0x38, 0xB2, 0x22, 0x1A, 0x46, 0x1C, 0x19, + 0x9E, 0x43, 0x50, 0x14, 0x3C, 0x43, 0x1E, 0x1B, 0x97, 0x39, 0xC0, 0x0C, + 0x99, 0x1E, 0x8C, 0xF6, 0xAF, 0x16, 0x3A, 0xF6, 0x91, 0x18, 0x1C, 0xF6, + 0xB2, 0x0D, 0x73, 0xEF, 0x5E, 0x0E, 0x83, 0xF0, 0x68, 0x14, 0x88, 0xF9, + 0x1C, 0x04, 0x36, 0xFE, 0x26, 0xFF, 0x8D, 0x05, 0x07, 0xFC, 0x66, 0x0F, + 0x66, 0xE8, 0x61, 0xFF, 0x0B, 0xE9, 0x94, 0xF5, 0x7C, 0x00, 0xEA, 0x13, + 0x1C, 0x06, 0xAF, 0x21, 0x60, 0xFE, 0xC0, 0x13, 0xEA, 0x02, 0x86, 0x12, + 0xEF, 0x16, 0x5E, 0x23, 0xFC, 0x23, 0xB2, 0x29, 0x22, 0x17, 0xBE, 0x29, + 0x45, 0x15, 0x06, 0x2E, 0xF8, 0x26, 0x03, 0x30, 0xEA, 0x2C, 0x3C, 0x33, + 0x18, 0x1E, 0xB8, 0x30, 0xF5, 0x12, 0xC9, 0x22, 0xD9, 0x1A, 0xA1, 0x12, + 0xBB, 0x1C, 0xDD, 0x0A, 0xAD, 0x09, 0xE7, 0xFF, 0x45, 0xE3, 0x59, 0xE4, + 0x67, 0xD7, 0x68, 0xCD, 0xC7, 0xF4, 0xBF, 0xD6, 0x71, 0xFA, 0xDD, 0xDB, + 0x91, 0xE9, 0x68, 0xCF, 0xC3, 0xEC, 0x69, 0xCD, 0x53, 0xF9, 0xF6, 0xC9, + 0xB4, 0x06, 0x03, 0xC7, 0x4B, 0x15, 0x75, 0xDA, 0xC7, 0x16, 0xCD, 0xF2, + 0x49, 0x14, 0xA4, 0xFB, 0xC8, 0x13, 0xA4, 0xFB, 0xF8, 0x21, 0x54, 0xFF, + 0x73, 0x30, 0xE8, 0x02, 0x73, 0x27, 0xFE, 0x12, 0x37, 0x1B, 0x91, 0x25, + 0xB8, 0x10, 0xA1, 0x20, 0x06, 0x11, 0x49, 0x20, 0xF8, 0x12, 0x6B, 0x17, + 0xE7, 0xFC, 0xA5, 0x02, 0x9B, 0xEE, 0x3E, 0x11, 0xED, 0xF5, 0x49, 0x1A, + 0x02, 0xFF, 0x6A, 0x0A, 0x43, 0x01, 0xB2, 0x01, 0x47, 0x01, 0xCE, 0xEF, + 0x34, 0x09, 0x23, 0xEE, 0x1F, 0x01, 0x3D, 0xFC, 0xB9, 0x03, 0x48, 0x06, + 0x31, 0x20, 0xC0, 0x25, 0x27, 0x2B, 0x57, 0x3D, 0x06, 0x30, 0x89, 0x37, + 0xDC, 0x41, 0x52, 0x30, 0x9A, 0x3D, 0x1C, 0x27, 0x2E, 0x28, 0x46, 0x29, + 0x10, 0x27, 0xD1, 0x37, 0x07, 0x31, 0x92, 0x38, 0xFF, 0x33, 0xD3, 0x34, + 0xD0, 0x3D, 0x8D, 0x41, 0xC0, 0x3C, 0xAA, 0x38, 0xB5, 0x24, 0x31, 0x20, + 0xFA, 0x21, 0x92, 0x21, 0x0F, 0x23, 0xE9, 0x17, 0xD0, 0x0E, 0xAB, 0x05, + 0xE5, 0xFC, 0x7C, 0xF8, 0x4B, 0xEF, 0x0A, 0xEA, 0xB4, 0xF0, 0x21, 0xEB, + 0x64, 0x01, 0x7C, 0xF0, 0x48, 0x12, 0x19, 0xE9, 0x25, 0x19, 0x92, 0xEA, + 0xFA, 0x0F, 0x63, 0xF7, 0xF9, 0x0E, 0xB4, 0x05, 0xB6, 0x1E, 0x05, 0x1D, + 0x19, 0x2B, 0x51, 0x2C, 0x88, 0x27, 0xD0, 0x28, 0xFA, 0x32, 0xA2, 0x35, + 0x2E, 0x35, 0xD3, 0x3F, 0x11, 0x26, 0x4B, 0x3A, 0x0D, 0x22, 0x95, 0x45, + 0x90, 0x13, 0x43, 0x45, 0xA3, 0x09, 0x48, 0x3A, 0x09, 0xF3, 0x51, 0x33, + 0x5E, 0xD3, 0x98, 0x1B, 0xCE, 0xD3, 0x56, 0x0F, 0x7B, 0xE3, 0xB7, 0x18, + 0xF0, 0xEE, 0x78, 0x18, 0xD5, 0xEC, 0x38, 0x0F, 0x9F, 0xD2, 0x53, 0x0B, + 0x0E, 0xC4, 0xA3, 0x06, 0x8F, 0xCD, 0xE9, 0xF8, 0x5A, 0xDD, 0x5D, 0xF5, + 0x29, 0xEB, 0xCE, 0x02, 0xDE, 0xE6, 0x1D, 0x0F, 0xF5, 0xD3, 0xC9, 0xFC, + 0x19, 0xD2, 0x25, 0xE5, 0xBA, 0xCD, 0x36, 0xEB, 0x2F, 0xC3, 0xC1, 0xFB, + 0x72, 0xC9, 0x0F, 0xFE, 0x40, 0xD4, 0x42, 0xF7, 0x52, 0xE0, 0x9D, 0xF3, + 0xAC, 0xE8, 0x7A, 0xFA, 0x55, 0xF2, 0xF9, 0x12, 0x43, 0xFA, 0xF5, 0x19, + 0xB7, 0xF2, 0x1D, 0xFD, 0x2D, 0xF1, 0xF3, 0xE6, 0x67, 0xF4, 0xDC, 0xE4, + 0x70, 0xE1, 0xE4, 0xE5, 0x72, 0xCB, 0xB2, 0xE0, 0xB4, 0xCD, 0xA2, 0xD3, + 0x78, 0xD1, 0x49, 0xC6, 0x1B, 0xCA, 0xBC, 0xC1, 0xC4, 0xBC, 0xFD, 0xC2, + 0x8C, 0xB1, 0xC6, 0xC6, 0xEC, 0xC3, 0x6E, 0xD4, 0x6E, 0xD8, 0x3B, 0xDF, + 0xC0, 0xDC, 0xE7, 0xF4, 0x7D, 0xDC, 0x2C, 0x0B, 0xBB, 0xCB, 0x65, 0x00, + 0x1F, 0xBF, 0x4E, 0xFA, 0x4D, 0xCA, 0xC4, 0xFE, 0xF3, 0xDB, 0x2C, 0xF9, + 0x3F, 0xEE, 0x4C, 0xFF, 0x69, 0xF5, 0xBC, 0x02, 0x2D, 0xE6, 0x4F, 0xEF, + 0x48, 0xD7, 0x29, 0xE9, 0x26, 0xBB, 0x70, 0xE4, 0xA8, 0xB0, 0x49, 0xD1, + 0x88, 0xCD, 0x6A, 0xCF, 0x50, 0xD5, 0x3A, 0xC5, 0x47, 0xDE, 0x7B, 0xD1, + 0x04, 0xEB, 0xE2, 0xF0, 0xF1, 0xE3, 0x5F, 0xEA, 0x46, 0xDD, 0xC9, 0xD4, + 0xC4, 0xD0, 0xAD, 0xC6, 0x05, 0xE1, 0xC0, 0xE2, 0x67, 0xF5, 0x80, 0x03, + 0x9E, 0xE8, 0xBA, 0x00, 0xA5, 0xE4, 0x6B, 0xF9, 0x89, 0xF5, 0x57, 0xFE, + 0xCE, 0x05, 0x18, 0x02, 0x62, 0x0C, 0x39, 0x02, 0xC2, 0x09, 0x73, 0x08, + 0xD8, 0x08, 0x0F, 0x09, 0xB6, 0x1A, 0xBB, 0x11, 0xB5, 0x23, 0xDA, 0x0F, + 0x37, 0x28, 0xB2, 0xFF, 0x94, 0x39, 0x8D, 0x03, 0x31, 0x30, 0xF4, 0x00, + 0x0E, 0x11, 0xF7, 0xED, 0x84, 0xFC, 0x3D, 0xE9, 0xD9, 0xE7, 0xF8, 0xD1, + 0x2B, 0xD9, 0xF4, 0xB0, 0xB7, 0xD2, 0x3C, 0xBB, 0x4B, 0xD1, 0xE8, 0xD7, + 0x5A, 0xD2, 0xDA, 0xDC, 0xCB, 0xD4, 0x4A, 0xDE, 0xFD, 0xD3, 0x5E, 0xEE, + 0xFD, 0xCC, 0xAC, 0xFD, 0xE0, 0xD7, 0xAF, 0x0D, 0x24, 0xE7, 0xEC, 0x13, + 0xC2, 0xEF, 0xA4, 0x04, 0x8A, 0xF7, 0xA8, 0xFB, 0xEB, 0xE6, 0x94, 0x05, + 0x12, 0xD4, 0x03, 0x0E, 0xAF, 0xE9, 0x89, 0x0F, 0x57, 0xFB, 0x8A, 0x00, + 0x38, 0xF2, 0xC1, 0xF7, 0x59, 0xE7, 0x79, 0xFF, 0x10, 0xCE, 0xEE, 0xEF, + 0x4B, 0xBA, 0x66, 0xD5, 0xA2, 0xC4, 0x87, 0xC4, 0x96, 0xD1, 0x84, 0xC3, + 0x5E, 0xD0, 0xAA, 0xCB, 0x79, 0xC8, 0xFB, 0xCB, 0xF9, 0xBE, 0x04, 0xC1, + 0xB8, 0xC1, 0xE0, 0xC0, 0xCE, 0xCC, 0x30, 0xD1, 0x35, 0xD3, 0x19, 0xDC, + 0x2D, 0xDC, 0x79, 0xE5, 0x9A, 0xEB, 0x94, 0xE1, 0xA0, 0x00, 0x22, 0xDD, + 0xE1, 0x02, 0xD7, 0xE5, 0x76, 0xFB, 0x4C, 0xF3, 0x2E, 0x03, 0x94, 0xFB, + 0xE8, 0x15, 0x8C, 0xFD, 0x65, 0x27, 0xFF, 0x03, 0xF2, 0x26, 0xD2, 0x0A, + 0x28, 0x19, 0x58, 0x13, 0x89, 0x16, 0x60, 0x10, 0xE5, 0x1E, 0x3A, 0x0C, + 0x50, 0x15, 0x71, 0x07, 0x2E, 0x00, 0xBF, 0xF3, 0x9E, 0xE8, 0xA0, 0xE0, + 0xDE, 0xCF, 0x62, 0xE3, 0x9E, 0xC8, 0x7B, 0xF1, 0x33, 0xBF, 0x79, 0xE7, + 0x1E, 0xB5, 0x14, 0xD0, 0xD4, 0xCE, 0xDD, 0xC6, 0x8A, 0xED, 0xE6, 0xD0, + 0x2C, 0xF7, 0x59, 0xDC, 0x7A, 0xF4, 0x8B, 0xEB, 0x73, 0xE9, 0xF7, 0xFC, + 0x0F, 0xFB, 0xE0, 0xFE, 0x91, 0x19, 0x01, 0xFC, 0x78, 0x24, 0x52, 0x04, + 0x17, 0x36, 0xEE, 0x22, 0xB1, 0x42, 0xEF, 0x33, 0x96, 0x3C, 0x25, 0x2B, + 0xDB, 0x31, 0x71, 0x24, 0x7F, 0x1E, 0x57, 0x11, 0x25, 0x0A, 0x30, 0xF5, + 0xFF, 0xFA, 0x4B, 0xE1, 0x3E, 0xFF, 0x2F, 0xE4, 0x88, 0x06, 0x2E, 0xDB, + 0x44, 0xF9, 0xA1, 0xC8, 0x51, 0xF1, 0x32, 0xD3, 0x36, 0xF3, 0x7A, 0xD3, + 0xFB, 0xF4, 0x08, 0xCF, 0x51, 0xFC, 0x65, 0xE1, 0xEF, 0xFB, 0x53, 0xE2, + 0xB3, 0x00, 0x0E, 0xD5, 0x01, 0x29, 0xA4, 0xE8, 0x03, 0x4F, 0x6B, 0xFE, + 0x03, 0x43, 0x39, 0x00, 0x78, 0x22, 0x30, 0x0A, 0x02, 0x2B, 0x6F, 0x0E, + 0x94, 0x3E, 0x1E, 0x02, 0xD8, 0x39, 0x64, 0x0D, 0x37, 0x46, 0x34, 0x25, + 0xB8, 0x5D, 0x3F, 0x30, 0x19, 0x61, 0x7D, 0x49, 0x27, 0x64, 0xBC, 0x58, + 0x29, 0x5E, 0x2B, 0x4F, 0xF9, 0x42, 0xA0, 0x51, 0xFB, 0x3D, 0x75, 0x55, + 0xCD, 0x43, 0x7E, 0x3A, 0x2F, 0x35, 0x35, 0x17, 0x57, 0x25, 0x03, 0x16, + 0x07, 0x25, 0x59, 0x28, 0xB0, 0x19, 0xBA, 0x28, 0x89, 0x0B, 0x31, 0x26, + 0xA5, 0x20, 0x8F, 0x2A, 0x09, 0x3A, 0x1C, 0x2D, 0xEB, 0x44, 0x2E, 0x3E, + 0x5E, 0x4D, 0xC9, 0x52, 0x54, 0x4B, 0x24, 0x4C, 0x4A, 0x41, 0xD8, 0x47, + 0x36, 0x3D, 0x8E, 0x48, 0xDD, 0x31, 0xD1, 0x2E, 0x78, 0x1E, 0x85, 0x1E, + 0x19, 0x2A, 0x90, 0x21, 0xFD, 0x38, 0x88, 0x21, 0xE4, 0x1A, 0xDB, 0x1B, + 0x4A, 0x05, 0xF0, 0x10, 0xA0, 0x08, 0x58, 0xF1, 0x20, 0x00, 0x31, 0xD1, + 0xEE, 0x01, 0x5E, 0xD5, 0x92, 0xFE, 0x64, 0xD8, 0x92, 0xE4, 0x0E, 0xCF, + 0x24, 0xF3, 0xD5, 0xDD, 0x6E, 0x13, 0x4D, 0xED, 0x15, 0x08, 0xE8, 0xE2, + 0xB9, 0x04, 0x36, 0xE8, 0x2B, 0x1D, 0x95, 0x01, 0xA1, 0x17, 0xA3, 0x05, + 0xEF, 0x0A, 0x1C, 0x0F, 0x5C, 0x13, 0xE0, 0x1D, 0xAD, 0x19, 0xC1, 0x18, + 0xAB, 0x19, 0xDC, 0x17, 0xBC, 0x22, 0x4F, 0x34, 0x83, 0x27, 0x1A, 0x50, + 0x09, 0x0F, 0x4D, 0x4E, 0xD8, 0x09, 0x20, 0x3E, 0xA4, 0x21, 0xDD, 0x23, + 0xE2, 0x32, 0x15, 0x1F, 0xFC, 0x30, 0xFA, 0x25, 0xF7, 0x1E, 0xC3, 0x22, + 0xCC, 0x0F, 0x0C, 0x1D, 0x88, 0xFB, 0x93, 0x0B, 0x24, 0xF0, 0xD3, 0xF5, + 0x53, 0xFA, 0xE6, 0xE7, 0x2D, 0xFE, 0x99, 0xED, 0x39, 0xF5, 0x01, 0xF5, + 0x47, 0xF7, 0xF1, 0xFD, 0xA9, 0xFF, 0xC7, 0x05, 0xC3, 0xFE, 0x21, 0x06, + 0x48, 0xF3, 0x7A, 0x0A, 0x56, 0xF1, 0x33, 0x11, 0x08, 0x04, 0xEC, 0x15, + 0xB0, 0x05, 0xE3, 0x0B, 0x54, 0x00, 0xAC, 0x04, 0xC9, 0x06, 0x8E, 0x09, + 0x43, 0x0B, 0xE4, 0x19, 0xFE, 0x12, 0x1C, 0x21, 0xCC, 0x16, 0xA7, 0x18, + 0x58, 0x07, 0xE3, 0x0F, 0x7B, 0xF8, 0x6F, 0xF1, 0x9F, 0xFF, 0xDC, 0xD9, + 0xB1, 0x07, 0x60, 0xDF, 0xA3, 0xFA, 0x2E, 0xD4, 0x67, 0xF0, 0xA9, 0xC4, + 0x0B, 0xFD, 0xCC, 0xD0, 0x5D, 0xFF, 0xA1, 0xD8, 0xC7, 0xEB, 0x63, 0xDB, + 0x9C, 0xEE, 0x64, 0xF2, 0x07, 0xF5, 0x61, 0xF4, 0x4A, 0xF8, 0x75, 0xED, + 0xC2, 0x10, 0x5F, 0x0C, 0x45, 0x1A, 0x70, 0x30, 0x42, 0x0D, 0x58, 0x36, + 0x49, 0x0B, 0x06, 0x41, 0x86, 0x19, 0x41, 0x54, 0x18, 0x27, 0x20, 0x4D, + 0xD7, 0x30, 0x66, 0x46, 0xAF, 0x2C, 0xCF, 0x42, 0x73, 0x20, 0xA1, 0x43, + 0x41, 0x25, 0xD0, 0x4B, 0xB7, 0x33, 0x13, 0x4E, 0x93, 0x3B, 0x72, 0x4F, + 0x04, 0x38, 0xB0, 0x41, 0x9D, 0x20, 0x42, 0x24, 0x77, 0x08, 0x9A, 0x0E, + 0xC8, 0xFD, 0x11, 0x07, 0xCE, 0xEC, 0xDD, 0xFB, 0x91, 0xCE, 0x18, 0xE0, + 0x25, 0xCA, 0xD6, 0xD0, 0xBE, 0xDB, 0xD1, 0xD9, 0x4E, 0xD1, 0xEF, 0xE3, + 0xFC, 0xC0, 0xC1, 0xEC, 0xB6, 0xD7, 0xF4, 0x05, 0xA0, 0x01, 0x30, 0x1A, + 0xBE, 0x1E, 0x26, 0x14, 0xC1, 0x24, 0x65, 0x13, 0x5B, 0x1D, 0xC0, 0x1E, + 0x9B, 0x1A, 0x56, 0x19, 0xD7, 0x1F, 0xB6, 0x18, 0x40, 0x2C, 0x2F, 0x2D, + 0x44, 0x2F, 0x32, 0x2C, 0x20, 0x23, 0xAC, 0x19, 0xB5, 0x11, 0xDA, 0x0F, + 0x71, 0xF6, 0x24, 0xFE, 0x8F, 0xDD, 0xBB, 0xE6, 0xA0, 0xD9, 0x6E, 0xDC, + 0x42, 0xE0, 0x5F, 0xD7, 0x4E, 0xDB, 0x15, 0xDA, 0x4E, 0xC4, 0x04, 0xE2, + 0x34, 0xBB, 0x5D, 0xFC, 0xB2, 0xB1, 0x69, 0x06, 0x3A, 0xAF, 0x38, 0xF5, + 0x16, 0xC1, 0x46, 0xF3, 0xBC, 0xE0, 0x4B, 0xF6, 0x8D, 0x02, 0x7B, 0xFE, + 0xC7, 0xF7, 0x37, 0x0F, 0xB4, 0xE8, 0xD1, 0x1E, 0xCC, 0xDE, 0x85, 0x08, + 0x02, 0xE0, 0xED, 0xED, 0x9B, 0xFA, 0x87, 0xF1, 0xEF, 0xFF, 0xAF, 0xF7, + 0xF6, 0x02, 0x75, 0x0E, 0x47, 0x09, 0xAE, 0x17, 0x1B, 0x00, 0x91, 0x0A, + 0x0A, 0xF4, 0x46, 0x01, 0x7F, 0xE7, 0x2E, 0xEB, 0x6E, 0xDF, 0x2C, 0xD6, + 0x2F, 0xCE, 0x81, 0xC4, 0x32, 0xB4, 0x83, 0xB2, 0x0C, 0xA6, 0x3A, 0xAD, + 0x98, 0xA2, 0x9E, 0xAB, 0x5A, 0xA3, 0xA4, 0xAC, 0xB8, 0xA5, 0x7F, 0xB5, + 0x6C, 0xAD, 0xF9, 0xC5, 0xCF, 0xBB, 0x15, 0xC9, 0xAB, 0xD0, 0x4A, 0xBE, + 0x63, 0xDA, 0xB2, 0xCC, 0x5A, 0xE3, 0x86, 0xED, 0x71, 0xFC, 0xC0, 0xF9, + 0xA8, 0x16, 0xF1, 0xFE, 0x1E, 0x18, 0x3E, 0x00, 0xBE, 0x0B, 0x7F, 0x05, + 0xD0, 0x07, 0xBF, 0x12, 0xFB, 0xFC, 0x74, 0x09, 0xC8, 0xF0, 0x6E, 0xF0, + 0x69, 0xE9, 0x9D, 0xDA, 0xE1, 0xDA, 0x3C, 0xD7, 0x47, 0xBF, 0x35, 0xD6, + 0x14, 0xB4, 0x8F, 0xD8, 0xDE, 0xAB, 0x45, 0xE0, 0x37, 0xA7, 0x22, 0xDC, + 0xD0, 0xC8, 0x09, 0xE3, 0x41, 0xD2, 0x50, 0xEB, 0xFD, 0xBC, 0x1D, 0xE5, + 0x9C, 0xBD, 0x52, 0xF0, 0x9A, 0xC5, 0x91, 0x00, 0x38, 0xCF, 0x93, 0xFD, + 0x80, 0xE5, 0x10, 0x09, 0x82, 0xF5, 0x2B, 0x17, 0xEE, 0xFF, 0xF0, 0x0E, + 0x72, 0x13, 0x8C, 0x1F, 0x18, 0x1D, 0xD6, 0x44, 0xF8, 0x1F, 0x6B, 0x44, + 0xB7, 0x27, 0x57, 0x32, 0x06, 0x2C, 0x58, 0x2B, 0x07, 0x36, 0xCB, 0x29, + 0x7E, 0x3A, 0x33, 0x39, 0x39, 0x26, 0x60, 0x33, 0x7F, 0x12, 0xCF, 0x0D, + 0x01, 0x10, 0x2A, 0xF8, 0x85, 0x12, 0x7E, 0xEE, 0xD4, 0x00, 0x2B, 0xDB, + 0x63, 0xF6, 0x96, 0xD7, 0x28, 0xF9, 0xD5, 0xE2, 0x51, 0xEC, 0x55, 0xE0, + 0xFA, 0xF6, 0xFD, 0xE1, 0x72, 0x06, 0x2E, 0xE0, 0x6F, 0x07, 0x54, 0xDB, + 0xE3, 0x0F, 0xA6, 0xF3, 0xEE, 0x0D, 0x5E, 0x0F, 0x66, 0x13, 0xA5, 0x1A, + 0xD7, 0x26, 0xE0, 0x1A, 0x1B, 0x39, 0x16, 0x22, 0x9D, 0x3B, 0xE3, 0x33, + 0x71, 0x35, 0xCB, 0x43, 0x90, 0x35, 0x75, 0x55, 0x34, 0x19, 0xA8, 0x57, + 0x6C, 0xEC, 0xEB, 0x37, 0xA5, 0xE5, 0x6D, 0x09, 0x07, 0xF5, 0x19, 0xE7, + 0xB3, 0xEF, 0xF4, 0xCD, 0x67, 0xD9, 0x82, 0xC5, 0x4C, 0xC5, 0x2C, 0xCB, + 0x77, 0xB7, 0x6B, 0xBD, 0x64, 0xB6, 0x7D, 0xA7, 0x16, 0xCA, 0x08, 0xAE, + 0xAD, 0xD8, 0xB2, 0xB6, 0x02, 0xDE, 0x63, 0xBC, 0x60, 0xF0, 0x96, 0xDC, + 0x6A, 0x00, 0x80, 0xE8, 0x48, 0x08, 0x83, 0xE6, 0x3D, 0x0A, 0x24, 0xFB, + 0xF8, 0xFC, 0xA4, 0xFF, 0x87, 0xFA, 0xB3, 0xF7, 0x1A, 0x0C, 0x7C, 0x03, + 0xEA, 0x1D, 0x11, 0x14, 0x3E, 0x22, 0x10, 0x08, 0x6B, 0x1B, 0xA1, 0x09, + 0x03, 0x13, 0xA1, 0x12, 0x09, 0x0F, 0xBC, 0xFC, 0x15, 0x16, 0x36, 0xF4, + 0x05, 0x13, 0x6A, 0xF9, 0xE0, 0xF9, 0x71, 0xED, 0xD1, 0xE9, 0xF0, 0xCC, + 0xEF, 0xEC, 0x66, 0xB6, 0x48, 0xEB, 0x78, 0xA8, 0x43, 0xE1, 0xC9, 0x9E, + 0x5C, 0xD2, 0xC9, 0xAA, 0xC3, 0xCB, 0xDD, 0xB3, 0xE6, 0xD2, 0xDB, 0xAE, + 0x01, 0xDC, 0xD8, 0xB2, 0x97, 0xE0, 0xAD, 0xB8, 0x69, 0xE8, 0x75, 0xC2, + 0x9D, 0xF5, 0x88, 0xDF, 0x10, 0xFE, 0x18, 0xFF, 0xEF, 0xF9, 0xCE, 0x0D, + 0xED, 0xFB, 0x8D, 0x10, 0x60, 0x01, 0xA1, 0x0D, 0x34, 0xFF, 0x1E, 0x0C, + 0x4B, 0x0B, 0x6C, 0x17, 0xE5, 0x02, 0x17, 0x0E, 0xF8, 0xDB, 0x26, 0xED, + 0x70, 0xC8, 0xBD, 0xE3, 0xC3, 0xCC, 0xCB, 0xE1, 0x05, 0xD3, 0xC6, 0xC9, + 0x13, 0xD7, 0x2F, 0xC0, 0x60, 0xCF, 0xB5, 0xCB, 0x91, 0xCC, 0x94, 0xD6, + 0xE5, 0xD8, 0x32, 0xDB, 0x49, 0xE3, 0x97, 0xD7, 0xF2, 0xEE, 0x0D, 0xCC, + 0x53, 0xEF, 0x98, 0xC8, 0xA8, 0xEF, 0x53, 0xF2, 0x4A, 0xFA, 0xD7, 0x17, + 0x39, 0x06, 0x8A, 0x16, 0x68, 0x0F, 0x5C, 0x13, 0x61, 0x1D, 0x1C, 0x1A, + 0x09, 0x30, 0xF4, 0x1E, 0x57, 0x3F, 0xD4, 0x27, 0xAE, 0x41, 0x44, 0x35, + 0xCB, 0x39, 0xFD, 0x2B, 0x05, 0x4A, 0x0F, 0x29, 0xD1, 0x57, 0xA7, 0x2D, + 0x6A, 0x52, 0xA6, 0x22, 0xF6, 0x42, 0xB4, 0x18, 0x43, 0x2B, 0x96, 0x13, + 0x98, 0x1C, 0xE4, 0x07, 0xA9, 0x0D, 0xE2, 0xFA, 0xDC, 0xFE, 0x09, 0xF3, + 0x44, 0xFB, 0xB5, 0xE7, 0x5B, 0x02, 0xB6, 0xF0, 0x8D, 0x00, 0x4A, 0x0B, + 0x67, 0xDE, 0x80, 0x12, 0x6E, 0xD1, 0x6B, 0x13, 0x31, 0xE8, 0xAA, 0x10, + 0xBC, 0x02, 0x2D, 0x0A, 0x66, 0x29, 0xCB, 0x1E, 0xE0, 0x47, 0x47, 0x4B, + 0x01, 0x44, 0xCF, 0x5D, 0xB6, 0x2F, 0xCC, 0x4E, 0xE8, 0x33, 0xF3, 0x37, + 0xA5, 0x40, 0x13, 0x23, 0xA0, 0x37, 0x66, 0x1F, 0x14, 0x27, 0x77, 0x26, + 0x1D, 0x1C, 0x07, 0x1C, 0xA5, 0x0B, 0xED, 0xF5, 0xD2, 0xF0, 0xC4, 0xD3, + 0x51, 0xE6, 0x13, 0xCD, 0x43, 0xDD, 0x1D, 0xCF, 0x5F, 0xD0, 0xC4, 0xC7, + 0xCE, 0xDA, 0x15, 0xC1, 0xE5, 0xE5, 0xEA, 0xBD, 0xF2, 0xD8, 0x0C, 0xBF, + 0x31, 0xCC, 0x5E, 0xD9, 0x5D, 0xDC, 0x00, 0xEF, 0xB9, 0xEF, 0x4E, 0xE8, + 0x8C, 0xFE, 0x95, 0xF0, 0xA1, 0x13, 0x93, 0x0B, 0x5C, 0x20, 0x88, 0x1C, + 0x37, 0x30, 0x72, 0x29, 0xB2, 0x43, 0x48, 0x2E, 0xC5, 0x57, 0xFE, 0x2C, + 0x41, 0x5C, 0xD7, 0x36, 0xAC, 0x4E, 0xF9, 0x3B, 0x3C, 0x47, 0x61, 0x2C, + 0x28, 0x39, 0xFE, 0x1B, 0xF5, 0x35, 0x1F, 0x18, 0xAA, 0x37, 0x8E, 0x0A, + 0x2F, 0x28, 0x97, 0xFD, 0x52, 0x1A, 0xCE, 0xFB, 0x43, 0xF6, 0xCC, 0xEB, + 0x71, 0xCB, 0x76, 0xDF, 0xE6, 0xC0, 0xAF, 0xDF, 0xB2, 0xC3, 0xFF, 0xE3, + 0x73, 0xCA, 0xAB, 0xE5, 0x63, 0xDD, 0x4A, 0xE9, 0xD7, 0xE4, 0x1F, 0xFD, + 0xB2, 0xD2, 0x2C, 0x0E, 0x2C, 0xDD, 0xCA, 0x16, 0x90, 0x08, 0x18, 0x20, + 0x35, 0x23, 0x21, 0x34, 0xF5, 0x39, 0x1B, 0x4E, 0xE1, 0x48, 0xA7, 0x5C, + 0xBF, 0x36, 0xE0, 0x5D, 0x73, 0x29, 0xFE, 0x52, 0x35, 0x30, 0x3B, 0x3D, + 0xC6, 0x2C, 0x92, 0x26, 0x6B, 0x0B, 0xB5, 0x0B, 0xA8, 0xEB, 0xFB, 0xF5, + 0xAF, 0xDB, 0x81, 0xE5, 0x0B, 0xC0, 0xF2, 0xD0, 0x2C, 0xC0, 0xFF, 0xC8, + 0x3D, 0xDB, 0x6D, 0xC1, 0x82, 0xDE, 0x1F, 0xB6, 0x74, 0xDE, 0x5E, 0xC3, + 0x0A, 0xF5, 0x68, 0xE4, 0x12, 0x00, 0x00, 0xF6, 0x07, 0x01, 0xF6, 0xF5, + 0x36, 0x1A, 0x9D, 0x03, 0xA0, 0x2F, 0x1A, 0x21, 0x69, 0x37, 0x8C, 0x36, + 0x26, 0x3E, 0xA5, 0x43, 0xAA, 0x44, 0x05, 0x4B, 0xED, 0x51, 0xB3, 0x52, + 0x6D, 0x5D, 0xF4, 0x57, 0xC1, 0x5F, 0x91, 0x54, 0xB8, 0x5B, 0x95, 0x53, + 0xB7, 0x53, 0xE9, 0x58, 0xFE, 0x3E, 0x2E, 0x5E, 0x6D, 0x31, 0x3C, 0x5F, + 0x6A, 0x32, 0x30, 0x51, 0x2D, 0x27, 0x76, 0x2A, 0xAE, 0x1C, 0x3B, 0x13, + 0xC0, 0x0F, 0x36, 0x15, 0x77, 0xEE, 0x10, 0x11, 0xE6, 0xD5, 0x76, 0x04, + 0xE2, 0xD2, 0xA7, 0xEC, 0xAF, 0xDB, 0x80, 0xE5, 0x8A, 0xF3, 0xF1, 0x05, + 0xCF, 0x0D, 0x6D, 0x26, 0xC3, 0x18, 0xC2, 0x22, 0x4A, 0x24, 0x1F, 0x1D, + 0x45, 0x31, 0xAB, 0x30, 0xCA, 0x3D, 0xD6, 0x4A, 0xD4, 0x3D, 0xBC, 0x59, + 0x61, 0x38, 0xDA, 0x59, 0x97, 0x38, 0x1A, 0x44, 0x2D, 0x29, 0xB3, 0x29, + 0x58, 0x23, 0xAB, 0x2F, 0x45, 0x1E, 0x75, 0x29, 0xBF, 0x04, 0x2C, 0x0A, + 0x84, 0xE5, 0x96, 0xEE, 0x49, 0xCC, 0xE3, 0xCD, 0x84, 0xB5, 0xCB, 0xB8, + 0xEA, 0xB0, 0x50, 0xB8, 0x32, 0xBD, 0x45, 0xB4, 0xFA, 0xC6, 0xAB, 0xB8, + 0x2B, 0xDD, 0x18, 0xD1, 0x02, 0xFB, 0xB3, 0xE6, 0xE2, 0x09, 0x8A, 0xEE, + 0xB9, 0x0A, 0xCF, 0xF4, 0x55, 0xFD, 0xFB, 0xF8, 0x70, 0xF9, 0xDA, 0xFA, + 0x8B, 0x15, 0x9F, 0x08, 0xFB, 0x2C, 0x29, 0x11, 0x3C, 0x2C, 0x39, 0x0D, + 0x6B, 0x22, 0x40, 0x1B, 0xC5, 0x1C, 0x38, 0x39, 0x56, 0x19, 0x72, 0x44, + 0x52, 0x10, 0x79, 0x2A, 0x59, 0x0C, 0x4B, 0x0D, 0x32, 0x03, 0x38, 0x09, + 0x71, 0xEC, 0xE9, 0x0B, 0x54, 0xE1, 0x07, 0x06, 0x38, 0xD8, 0xCD, 0xEA, + 0x75, 0xCD, 0x80, 0xCF, 0x48, 0xBC, 0x14, 0xC2, 0x21, 0xA3, 0x96, 0xBA, + 0x84, 0x9C, 0x58, 0xC5, 0x98, 0xA0, 0xD0, 0xCF, 0xD4, 0xAC, 0xD4, 0xCE, + 0x16, 0xC5, 0x93, 0xDB, 0xAB, 0xE0, 0xE8, 0xEC, 0x20, 0xEC, 0xEF, 0xEB, + 0x65, 0xEF, 0x9F, 0xF4, 0x14, 0xFC, 0xF6, 0x16, 0x2B, 0x08, 0x92, 0x27, + 0xEC, 0x13, 0x72, 0x22, 0x0D, 0x1A, 0x9F, 0x1F, 0x1B, 0x13, 0xA6, 0x15, + 0x66, 0x06, 0xD6, 0x0A, 0xB0, 0xF4, 0x9C, 0xFF, 0xBE, 0xF1, 0xF8, 0xEF, + 0xB9, 0xFA, 0x25, 0xDE, 0x47, 0xE9, 0xD9, 0xC7, 0xE1, 0xCF, 0x5A, 0xB7, + 0xDB, 0xC7, 0x74, 0xB2, 0x31, 0xC2, 0x90, 0xB0, 0x45, 0xC3, 0xBA, 0xB0, + 0xD0, 0xC6, 0xFF, 0xB1, 0x0C, 0xC4, 0x0C, 0xAE, 0x8D, 0xD3, 0x45, 0xB3, + 0xD1, 0xED, 0x2E, 0xD7, 0x60, 0xF4, 0x52, 0xFC, 0x45, 0xF5, 0x5E, 0x13, + 0x13, 0xED, 0xE1, 0x21, 0x55, 0xE2, 0x63, 0x21, 0xF8, 0xFA, 0x19, 0x26, + 0xCF, 0x12, 0xB4, 0x30, 0xE4, 0x0F, 0xB2, 0x39, 0x02, 0x14, 0x6D, 0x42, + 0xAA, 0x24, 0x3D, 0x43, 0xAC, 0x29, 0x98, 0x34, 0xD7, 0x0C, 0x5B, 0x17, + 0x48, 0xFB, 0xDA, 0x0C, 0x2F, 0x05, 0xFA, 0x0E, 0xC3, 0x03, 0x43, 0x00, + 0x9A, 0xFA, 0x8D, 0xF0, 0xDF, 0xF5, 0xCF, 0xEB, 0x87, 0xDD, 0x8E, 0xDC, + 0x03, 0xBB, 0xA3, 0xC5, 0x5D, 0xAF, 0x94, 0xBC, 0x44, 0xB5, 0xB1, 0xB9, + 0xB7, 0xC0, 0x65, 0xB7, 0xCC, 0xD0, 0xF5, 0xC3, 0x2D, 0xDD, 0x42, 0xDA, + 0xD3, 0xD8, 0x0A, 0xE4, 0x5D, 0xE7, 0x38, 0xF3, 0xEC, 0xFF, 0xEE, 0x02, + 0xB7, 0x09, 0x5A, 0x07, 0x5A, 0x13, 0xCF, 0x10, 0x28, 0x16, 0x0E, 0x16, + 0x1E, 0x1B, 0xAF, 0x10, 0x5A, 0x12, 0x09, 0xF4, 0x83, 0x05, 0xFA, 0xE7, + 0xCD, 0x07, 0x8F, 0xEF, 0x92, 0x02, 0x60, 0xE7, 0x42, 0xED, 0xBA, 0xDE, + 0x3C, 0xD0, 0x10, 0xC9, 0xE1, 0xB7, 0x8C, 0xAA, 0xAD, 0xAE, 0xC9, 0x9E, + 0x05, 0xBE, 0xFD, 0xA8, 0xEE, 0xBC, 0x29, 0xB0, 0x75, 0xA3, 0x34, 0xB3, + 0x12, 0xB2, 0xB1, 0xC6, 0xBE, 0xDD, 0x8C, 0xDC, 0x03, 0xEF, 0xB0, 0xE0, + 0x51, 0xDA, 0x6B, 0xE2, 0x16, 0xC2, 0x2E, 0xF3, 0x73, 0xD2, 0x94, 0x0A, + 0x2C, 0xF0, 0x59, 0x11, 0x77, 0xFB, 0xF7, 0x0A, 0x06, 0x00, 0x34, 0x0A, + 0x89, 0xFB, 0x87, 0x0E, 0x24, 0xF8, 0x2A, 0x17, 0xFB, 0x05, 0x6C, 0x28, + 0xB0, 0x13, 0xA0, 0x30, 0x50, 0x18, 0x8E, 0x1A, 0x6B, 0x09, 0x1A, 0xF7, + 0xCE, 0xF3, 0x60, 0xE8, 0x47, 0xEA, 0xFD, 0xE0, 0xEF, 0xDB, 0xCC, 0xCF, + 0xA4, 0xC3, 0x81, 0xC3, 0xB5, 0xB6, 0xBC, 0xBC, 0xEE, 0xAC, 0x46, 0xAE, + 0xAD, 0xA0, 0x44, 0x9E, 0xBF, 0xB4, 0x3F, 0xAE, 0xFF, 0xCE, 0x7F, 0xC5, + 0x99, 0xDA, 0x0B, 0xC9, 0x36, 0xF5, 0x74, 0xD3, 0x8F, 0x11, 0x1D, 0xEA, + 0xE7, 0x1E, 0x94, 0x03, 0xE9, 0x23, 0xBB, 0x15, 0x56, 0x20, 0x87, 0x1E, + 0xD9, 0x1B, 0xEF, 0x1A, 0x48, 0x1B, 0x21, 0x09, 0x15, 0x14, 0xDB, 0xF3, + 0x92, 0x0C, 0x1E, 0xEB, 0x10, 0x0B, 0x71, 0xEC, 0x6C, 0x05, 0x96, 0xF6, + 0x75, 0xEA, 0x49, 0xFB, 0x62, 0xBC, 0x40, 0xDF, 0xEC, 0xA8, 0x13, 0xBC, + 0x8E, 0xA9, 0xA7, 0xA8, 0xD0, 0xA3, 0x68, 0xA8, 0x47, 0xAF, 0x94, 0xBE, + 0x8F, 0xD2, 0xBE, 0xE1, 0xBB, 0xEF, 0x42, 0xFF, 0xAF, 0x04, 0x9C, 0x1D, + 0xF6, 0x11, 0x8C, 0x33, 0xB4, 0x05, 0xA4, 0x22, 0x1A, 0x0B, 0x64, 0x15, + 0x39, 0x2E, 0xB2, 0x28, 0x2B, 0x48, 0x80, 0x42, 0x92, 0x57, 0xAF, 0x57, + 0x4B, 0x5F, 0x83, 0x59, 0x0B, 0x59, 0x1F, 0x53, 0x13, 0x53, 0x0B, 0x58, + 0x4A, 0x59, 0xE4, 0x59, 0xF6, 0x54, 0x68, 0x48, 0x8A, 0x47, 0x2F, 0x31, + 0x57, 0x3B, 0xC4, 0x24, 0x1C, 0x32, 0x08, 0x22, 0x7B, 0x24, 0xE0, 0x11, + 0x97, 0x10, 0xD4, 0xFB, 0x2B, 0x01, 0x34, 0xF9, 0x2A, 0xEE, 0x91, 0xE5, + 0x48, 0xE0, 0x6B, 0xC8, 0x17, 0xDF, 0xCD, 0xCB, 0xF2, 0xE6, 0xAD, 0xD8, + 0xEB, 0x00, 0x39, 0xE1, 0xC8, 0x12, 0x72, 0xF4, 0x4C, 0x19, 0x60, 0x10, + 0x6B, 0x29, 0x31, 0x25, 0x37, 0x2D, 0x89, 0x26, 0xC9, 0x38, 0xC2, 0x27, + 0xF2, 0x56, 0x8F, 0x30, 0x88, 0x5A, 0x36, 0x35, 0x30, 0x40, 0xC2, 0x3D, + 0x47, 0x22, 0x84, 0x32, 0x13, 0x14, 0x8B, 0x11, 0x69, 0x0C, 0xD7, 0xFD, + 0x7F, 0x02, 0xEA, 0x00, 0xB4, 0xF3, 0x14, 0x03, 0x2E, 0xD6, 0x7A, 0xEA, + 0x51, 0xBB, 0x56, 0xC9, 0x54, 0xA6, 0x34, 0xAE, 0xF0, 0xA5, 0x51, 0xA3, + 0x70, 0xB4, 0xDE, 0xA6, 0xD6, 0xB7, 0x60, 0xB0, 0x73, 0xC3, 0x15, 0xD2, + 0xF7, 0xE6, 0x33, 0x07, 0xF7, 0xFE, 0x75, 0x18, 0xA3, 0x00, 0xF7, 0x04, + 0x53, 0x10, 0xA1, 0x08, 0x54, 0x24, 0x6D, 0x18, 0xD0, 0x2C, 0x15, 0x1E, + 0x34, 0x2E, 0x19, 0x28, 0x2D, 0x26, 0x1F, 0x22, 0x20, 0x28, 0x62, 0x1E, + 0x82, 0x30, 0x2F, 0x29, 0x56, 0x31, 0x31, 0x22, 0x9F, 0x24, 0x91, 0x12, + 0x17, 0x14, 0x93, 0x0A, 0xD5, 0x18, 0x42, 0xFD, 0x87, 0x1B, 0x24, 0xEF, + 0x13, 0x12, 0xCB, 0xE8, 0xFA, 0x03, 0x70, 0xD4, 0x16, 0xE7, 0x9B, 0xB7, + 0xC4, 0xCD, 0xD5, 0xB0, 0xC5, 0xBD, 0x95, 0xB5, 0x77, 0xBD, 0x11, 0xBC, + 0xCC, 0xD7, 0xC2, 0xC9, 0xA7, 0xFB, 0xF7, 0xD3, 0x8E, 0x15, 0x51, 0xE4, + 0x34, 0x14, 0xAC, 0xFD, 0x21, 0x03, 0xC9, 0x14, 0x8B, 0x0B, 0xB5, 0x28, + 0xF1, 0x1F, 0x19, 0x34, 0xC2, 0x27, 0xAE, 0x45, 0x10, 0x29, 0x09, 0x52, + 0xF0, 0x24, 0x9E, 0x4A, 0x29, 0x1F, 0x6B, 0x3D, 0x7B, 0x11, 0x46, 0x24, + 0xC4, 0x02, 0x90, 0x11, 0xED, 0xFE, 0x97, 0x10, 0x01, 0xF7, 0x12, 0x02, + 0xD8, 0xDB, 0xC8, 0xDB, 0x7F, 0xC8, 0x54, 0xC2, 0x7A, 0xCC, 0x3E, 0xC7, + 0xAC, 0xD2, 0xC3, 0xCB, 0x9E, 0xDE, 0x25, 0xD6, 0xB3, 0xF4, 0xCD, 0xEE, + 0x75, 0x05, 0xCA, 0xFC, 0x42, 0x16, 0x87, 0x0D, 0x11, 0x2F, 0xEA, 0x2A, + 0x54, 0x36, 0xDE, 0x3E, 0x43, 0x38, 0xEF, 0x44, 0xF8, 0x4F, 0x7A, 0x4B, + 0x3A, 0x55, 0xE5, 0x57, 0x8D, 0x3F, 0x58, 0x55, 0xF9, 0x39, 0x1A, 0x45, + 0x6D, 0x43, 0x0F, 0x41, 0x97, 0x4D, 0xB0, 0x46, 0x89, 0x54, 0xFC, 0x49, + 0x56, 0x4E, 0xA8, 0x3F, 0x51, 0x3F, 0x56, 0x2A, 0x6C, 0x35, 0x3C, 0x22, + 0x97, 0x31, 0xCC, 0x28, 0xCC, 0x2B, 0x85, 0x30, 0xFF, 0x1E, 0x05, 0x26, + 0xA5, 0x1C, 0x17, 0x03, 0x40, 0x11, 0xB5, 0xDB, 0x8B, 0xEA, 0xCC, 0xCB, + 0x28, 0xD8, 0xF5, 0xDB, 0xE9, 0xE4, 0xC5, 0xF3, 0xE8, 0xF2, 0xE1, 0xFF, + 0x26, 0x08, 0xF7, 0x10, 0x8E, 0x2A, 0x4E, 0x2C, 0xFA, 0x34, 0xA1, 0x33, + 0xF5, 0x2E, 0x2B, 0x3A, 0xAC, 0x37, 0x10, 0x50, 0xE2, 0x4A, 0x36, 0x5D, + 0xC9, 0x58, 0x72, 0x5C, 0xD3, 0x50, 0x9B, 0x51, 0x29, 0x3C, 0x08, 0x46, + 0xC0, 0x28, 0x16, 0x3A, 0x19, 0x1D, 0x52, 0x39, 0x90, 0x1E, 0xA1, 0x3F, + 0x9C, 0x22, 0x67, 0x32, 0xBF, 0x0D, 0x3F, 0x0E, 0xE6, 0xEF, 0x73, 0xEC, + 0x00, 0xE8, 0x49, 0xDB, 0x90, 0xDE, 0x0C, 0xD3, 0x93, 0xD5, 0x99, 0xDC, + 0x03, 0xE4, 0xDA, 0xEA, 0x6E, 0xF6, 0x13, 0xF4, 0x3A, 0x04, 0x1D, 0x0B, + 0x47, 0x0C, 0x3E, 0x1E, 0xFC, 0x0B, 0x03, 0x19, 0xEB, 0x11, 0x5D, 0x13, + 0x9A, 0x1D, 0x4E, 0x17, 0x2B, 0x32, 0x05, 0x20, 0xDD, 0x44, 0x98, 0x29, + 0x4D, 0x39, 0xC3, 0x27, 0xB4, 0x26, 0xF7, 0x23, 0x3A, 0x26, 0x15, 0x2A, + 0x36, 0x1D, 0x7A, 0x2A, 0x9F, 0x10, 0xA3, 0x0D, 0x00, 0x19, 0xB6, 0xEC, + 0x58, 0x1B, 0xBF, 0xE6, 0xED, 0x0C, 0x18, 0xED, 0x06, 0x07, 0x8F, 0xFE, + 0x64, 0x00, 0xD5, 0x0B, 0x43, 0xE6, 0x4C, 0xFD, 0xA0, 0xC9, 0x82, 0xE7, + 0x9F, 0xB9, 0x0F, 0xD8, 0xB3, 0xAC, 0x4D, 0xCC, 0x20, 0xA6, 0xCD, 0xCF, + 0x8A, 0xBA, 0xD8, 0xEA, 0xE1, 0xD2, 0x26, 0x08, 0xD5, 0xE2, 0x20, 0x13, + 0x60, 0xFA, 0x5F, 0x1B, 0x72, 0x0C, 0x55, 0x2A, 0x95, 0x1F, 0x48, 0x32, + 0x54, 0x2D, 0x40, 0x3B, 0x3C, 0x35, 0x05, 0x4A, 0x8C, 0x45, 0x64, 0x51, + 0xE4, 0x44, 0x02, 0x4C, 0xAB, 0x3C, 0x15, 0x43, 0x42, 0x38, 0x09, 0x42, + 0x9C, 0x2B, 0x69, 0x3E, 0x87, 0x1F, 0xCE, 0x31, 0xA8, 0x15, 0x18, 0x19, + 0xA6, 0x08, 0xC1, 0xF9, 0x2E, 0xF0, 0x73, 0xE4, 0x5B, 0xD7, 0x85, 0xD7, + 0xC9, 0xDE, 0x8E, 0xE1, 0x87, 0xEC, 0x21, 0xF8, 0xB6, 0xE5, 0x0C, 0xF8, + 0xE5, 0xF1, 0xAE, 0xFA, 0x28, 0x0F, 0xEE, 0x14, 0xD9, 0x18, 0xE2, 0x1C, + 0x50, 0x1A, 0x60, 0x12, 0x5C, 0x1D, 0x3B, 0x26, 0xDA, 0x21, 0xBF, 0x48, + 0xFF, 0x2B, 0x98, 0x47, 0x33, 0x34, 0x3F, 0x2A, 0x6F, 0x33, 0x94, 0x13, + 0x6C, 0x36, 0x0F, 0x13, 0x26, 0x38, 0x8D, 0x15, 0x1C, 0x27, 0xAC, 0x1B, + 0xE6, 0x16, 0xFD, 0x21, 0x6B, 0x1A, 0xC4, 0x0F, 0x0C, 0x1D, 0x51, 0x03, + 0xCA, 0x16, 0xF0, 0x0E, 0x2A, 0x08, 0x2E, 0x15, 0x0A, 0xF0, 0x6C, 0x10, + 0x9D, 0xE4, 0x7F, 0x02, 0xA3, 0xD7, 0x77, 0xE5, 0x33, 0xBE, 0x07, 0xCE, + 0x2D, 0xB2, 0xCA, 0xCD, 0x23, 0xB9, 0x4A, 0xE9, 0x17, 0xCB, 0x5F, 0x0B, + 0x08, 0xE3, 0xD6, 0x1E, 0xB0, 0xF9, 0x37, 0x2C, 0x23, 0x05, 0xAD, 0x2B, + 0x44, 0x17, 0xE6, 0x2A, 0xEB, 0x25, 0x37, 0x30, 0x7D, 0x21, 0xAF, 0x31, + 0xCB, 0x26, 0xF8, 0x34, 0xC7, 0x2A, 0x40, 0x30, 0x07, 0x17, 0x66, 0x18, + 0x10, 0x02, 0x7E, 0x00, 0xF3, 0xFF, 0x21, 0xFB, 0x4C, 0xF6, 0x8D, 0xF6, + 0x18, 0xDA, 0x56, 0xE4, 0xCE, 0xCE, 0x0E, 0xC5, 0x15, 0xD5, 0xD0, 0xAF, + 0x53, 0xCE, 0x64, 0xA4, 0x02, 0xC8, 0xA7, 0xA2, 0x0E, 0xC7, 0x8E, 0xAE, + 0x77, 0xB4, 0xB8, 0xB0, 0xDA, 0xBA, 0xC1, 0xC0, 0xC0, 0xE6, 0xAE, 0xD7, + 0x31, 0xF6, 0x6F, 0xD5, 0xDA, 0xF1, 0x03, 0xD1, 0xEF, 0xFE, 0xD0, 0xDB, + 0x9B, 0x0A, 0x12, 0xF0, 0x21, 0x03, 0x12, 0x01, 0x00, 0xF6, 0xA6, 0x0B, + 0x93, 0xE7, 0xFF, 0x01, 0xAE, 0xE6, 0x43, 0xF2, 0xE0, 0xF9, 0x2F, 0x02, + 0xAE, 0xFC, 0xB5, 0x17, 0x7E, 0xF3, 0x32, 0x11, 0x32, 0xED, 0xAF, 0x09, + 0x37, 0xE5, 0x92, 0x05, 0x8D, 0xE8, 0xE4, 0xF1, 0x69, 0xE9, 0x07, 0xE2, + 0x02, 0xDB, 0x3D, 0xDF, 0xD4, 0xCB, 0x62, 0xDB, 0x46, 0xBB, 0x34, 0xCB, + 0xCB, 0xAC, 0xBC, 0xBB, 0x38, 0xB7, 0x11, 0xC0, 0xCB, 0xC9, 0x88, 0xCF, + 0x12, 0xC9, 0xD0, 0xDD, 0x8C, 0xD5, 0xE7, 0xEC, 0x8E, 0xF1, 0xD3, 0xF7, + 0xFB, 0x00, 0x87, 0xFD, 0xCE, 0x0C, 0x67, 0x0D, 0x9A, 0x18, 0x14, 0x1D, + 0x30, 0x1C, 0xEC, 0x22, 0xE9, 0x0E, 0x3A, 0x24, 0x85, 0x05, 0x71, 0x1A, + 0x67, 0x01, 0x01, 0x09, 0x57, 0xEF, 0xF2, 0xF6, 0x20, 0xF1, 0x99, 0xE7, + 0x25, 0x00, 0x1A, 0xE0, 0xE7, 0x01, 0x2B, 0xE5, 0x1E, 0xEB, 0x70, 0xDA, + 0x81, 0xC8, 0x9A, 0xC2, 0xA0, 0xBB, 0x0F, 0xB4, 0xC6, 0xC3, 0x12, 0xA5, + 0x83, 0xD9, 0xC9, 0xA2, 0xEF, 0xD8, 0xE8, 0xA4, 0xF2, 0xC9, 0x76, 0xA8, + 0x97, 0xDF, 0xE6, 0xCA, 0x5C, 0xF7, 0xF0, 0xEB, 0x2D, 0xFC, 0x72, 0xE2, + 0x12, 0xFA, 0xFF, 0xD4, 0xE1, 0xF8, 0xC1, 0xEF, 0x45, 0x02, 0x32, 0x0E, + 0x8F, 0x07, 0x62, 0x18, 0x22, 0x05, 0x48, 0x17, 0xAA, 0xFF, 0x96, 0x0B, + 0x55, 0xFF, 0x70, 0x04, 0xE5, 0x00, 0x25, 0x08, 0xC0, 0xF9, 0x0C, 0x0D, + 0x6C, 0xF7, 0xB6, 0x0F, 0xC9, 0xF5, 0x48, 0x13, 0xC0, 0x03, 0x9A, 0x1B, + 0x6F, 0x17, 0x38, 0x1E, 0x3F, 0x07, 0x84, 0x0C, 0xA2, 0xEC, 0x8F, 0xFD, + 0xF6, 0xD8, 0x4A, 0xEE, 0xEB, 0xBF, 0x6D, 0xCF, 0x8A, 0xAE, 0x36, 0xC0, + 0xA6, 0xBD, 0x6E, 0xBA, 0x4A, 0xD4, 0x46, 0xBA, 0xF0, 0xD4, 0xB6, 0xCE, + 0xD8, 0xD6, 0xDB, 0xE5, 0x7A, 0xDE, 0x54, 0xEC, 0x80, 0xEC, 0x71, 0xE5, + 0x4E, 0x0A, 0x7B, 0xED, 0x2C, 0x1D, 0x08, 0xF6, 0xD3, 0x17, 0x2C, 0xF3, + 0xE7, 0x10, 0x7E, 0xF3, 0x7E, 0x0C, 0x34, 0xF0, 0x8A, 0xFE, 0xEF, 0xEB, + 0xBF, 0xF7, 0x9A, 0xE5, 0xFA, 0xF9, 0x8A, 0xD9, 0x55, 0xF7, 0xFC, 0xCB, + 0xE5, 0xEB, 0x67, 0xB4, 0xEA, 0xD5, 0xDE, 0xA5, 0xC3, 0xB5, 0x12, 0xA3, + 0x7F, 0x9E, 0x25, 0x9A, 0xDF, 0xA2, 0x5A, 0x9D, 0xAA, 0xA8, 0x7B, 0xA1, + 0xB1, 0xA7, 0x70, 0xA1, 0x5E, 0xB7, 0xA8, 0xBA, 0x3C, 0xC8, 0xF5, 0xDF, + 0x7C, 0xC6, 0xAB, 0xED, 0x3D, 0xC1, 0xDA, 0xDF, 0x9C, 0xCB, 0x69, 0xE1, + 0xDD, 0xE0, 0xDA, 0xF8, 0xD6, 0xF1, 0xE9, 0x03, 0xDA, 0xF2, 0xE8, 0x01, + 0x04, 0xED, 0xC0, 0xF6, 0xFD, 0xF6, 0x7A, 0xED, 0xE4, 0x02, 0xFB, 0xF4, + 0xB8, 0xF7, 0xE1, 0xF9, 0x33, 0xF2, 0x2B, 0xFA, 0xC7, 0x03, 0xA0, 0x05, + 0x54, 0x0E, 0x73, 0x0C, 0xA9, 0x15, 0xA2, 0x0C, 0x96, 0x1E, 0x6B, 0x09, + 0x39, 0x0A, 0x48, 0xF0, 0x6A, 0xE2, 0xF6, 0xD4, 0x2C, 0xC8, 0xAA, 0xCF, + 0xC6, 0xC3, 0x47, 0xD6, 0x2F, 0xC6, 0xF8, 0xD4, 0xB5, 0xCB, 0x62, 0xCF, + 0x7C, 0xEB, 0x1F, 0xE2, 0x53, 0x0C, 0xF9, 0xF5, 0xA9, 0x12, 0x88, 0xF8, + 0x99, 0x0C, 0xDE, 0x05, 0xD6, 0x13, 0x3E, 0x26, 0x82, 0x2D, 0x58, 0x39, + 0x6A, 0x45, 0xF9, 0x38, 0x91, 0x56, 0x7E, 0x36, 0xDC, 0x5A, 0x22, 0x2F, + 0x31, 0x47, 0x55, 0x24, 0x91, 0x2F, 0x37, 0x17, 0x5E, 0x2F, 0x74, 0x13, + 0x1B, 0x36, 0x06, 0x15, 0x27, 0x1C, 0xEC, 0xFE, 0xC4, 0xF3, 0x86, 0xDE, + 0xE1, 0xE3, 0x76, 0xD9, 0x24, 0xDA, 0x3C, 0xDF, 0xD2, 0xDA, 0x17, 0xE2, + 0xE0, 0xE6, 0xF1, 0xEA, 0x70, 0xE2, 0xBE, 0xE7, 0xB3, 0xE3, 0x4D, 0xF0, + 0x4E, 0xFA, 0x79, 0x16, 0x34, 0x07, 0x20, 0x31, 0x1A, 0x05, 0xD3, 0x37, + 0x84, 0x10, 0x9C, 0x39, 0xEC, 0x21, 0x92, 0x41, 0x8B, 0x32, 0xBC, 0x50, + 0xDE, 0x3C, 0x0C, 0x50, 0xB4, 0x31, 0xD0, 0x44, 0x7F, 0x29, 0x07, 0x3E, + 0x46, 0x38, 0xF6, 0x3D, 0x97, 0x4C, 0xAC, 0x3A, 0x1D, 0x47, 0x6A, 0x2E, + 0x08, 0x2B, 0xB2, 0x27, 0xB7, 0x1F, 0x53, 0x27, 0x4F, 0x23, 0xAD, 0x24, + 0x61, 0x21, 0x35, 0x10, 0x9A, 0x15, 0xF4, 0xF5, 0xB8, 0xFF, 0xB8, 0xE9, + 0xBD, 0xEF, 0x57, 0xD2, 0x6B, 0xE5, 0xAD, 0xBB, 0x54, 0xD6, 0x8E, 0xC2, + 0xC9, 0xCF, 0x4F, 0xD2, 0x67, 0xD9, 0x85, 0xDD, 0x13, 0xEE, 0xC2, 0xEB, + 0x0A, 0x0B, 0x62, 0xF4, 0x03, 0x1F, 0x78, 0xF1, 0x07, 0x25, 0x4C, 0xF8, + 0xAD, 0x2E, 0xB6, 0x0B, 0x81, 0x38, 0x46, 0x26, 0x87, 0x33, 0x6B, 0x33, + 0x85, 0x24, 0x08, 0x22, 0x30, 0x1F, 0xE0, 0x17, 0xD1, 0x16, 0xF4, 0x13, + 0xDF, 0x07, 0x9E, 0x16, 0xCA, 0xFE, 0x6C, 0x19, 0x2E, 0xFA, 0xE3, 0x0C, + 0x85, 0xEB, 0x4B, 0xF9, 0x9A, 0xD0, 0xA5, 0xD5, 0xBE, 0xAF, 0x41, 0xB3, + 0xD6, 0xA7, 0xE8, 0xB4, 0x7B, 0xC0, 0x80, 0xC3, 0x33, 0xC4, 0x9A, 0xC2, + 0xE0, 0xCC, 0x2E, 0xD8, 0x10, 0xF6, 0xF3, 0xFF, 0x97, 0x09, 0x35, 0x0B, + 0x59, 0xFE, 0x0C, 0x05, 0x67, 0xF8, 0x8C, 0x05, 0xE2, 0x08, 0x60, 0x10, + 0x22, 0x23, 0xA5, 0x21, 0xD7, 0x30, 0xF9, 0x21, 0x39, 0x28, 0xF0, 0x12, + 0xB1, 0x1F, 0x36, 0x18, 0x03, 0x25, 0x88, 0x25, 0x9B, 0x21, 0xF8, 0x25, + 0x3A, 0x16, 0xCC, 0x22, 0xC1, 0x16, 0xFB, 0x12, 0x4A, 0x22, 0x29, 0xF9, + 0xC6, 0x26, 0xCA, 0xF6, 0x17, 0x1B, 0x1C, 0x08, 0x18, 0x0C, 0xC0, 0x10, + 0x06, 0x01, 0x8C, 0x0C, 0x56, 0xFC, 0x06, 0xFA, 0x5C, 0xF7, 0x0C, 0xE6, + 0x0F, 0xE1, 0x9E, 0xD2, 0xBF, 0xD8, 0x07, 0xCB, 0xA3, 0xF1, 0x97, 0xE0, + 0x65, 0x09, 0xDA, 0xF8, 0xF2, 0x15, 0xA4, 0x07, 0x36, 0x23, 0x05, 0x15, + 0x93, 0x2B, 0x29, 0x25, 0x3C, 0x38, 0xE6, 0x3F, 0xB1, 0x48, 0x6D, 0x55, + 0x99, 0x4D, 0x7D, 0x59, 0x8B, 0x41, 0x20, 0x52, 0x3A, 0x30, 0x15, 0x46, + 0x47, 0x2C, 0x2D, 0x3D, 0x26, 0x2E, 0x6A, 0x41, 0x7E, 0x3C, 0x6D, 0x56, + 0x2D, 0x48, 0xD4, 0x62, 0x58, 0x2F, 0x19, 0x4E, 0x95, 0x23, 0x55, 0x3A, + 0x4E, 0x26, 0x44, 0x29, 0xC9, 0x1D, 0x43, 0x23, 0x2D, 0x18, 0xE2, 0x31, + 0x54, 0x07, 0x95, 0x20, 0xA3, 0x11, 0xD8, 0x19, 0x94, 0x47, 0x99, 0x43, + 0xD4, 0x56, 0x3A, 0x5A, 0x98, 0x1D, 0x7C, 0x3C, 0x7F, 0xF6, 0xFB, 0x1B, + 0x23, 0x05, 0x1B, 0x1E, 0x67, 0x05, 0x8C, 0x1B, 0x69, 0xF2, 0xF5, 0x05, + 0x14, 0xEC, 0x15, 0xED, 0xD9, 0xEF, 0x37, 0xDA, 0x62, 0xED, 0xF2, 0xD4, + 0x3E, 0xE3, 0x95, 0xD1, 0x5A, 0xD8, 0xD8, 0xD6, 0x0F, 0xCC, 0x4D, 0xDB, + 0x63, 0xD2, 0xA8, 0xD9, 0x9E, 0xE8, 0x7F, 0xD3, 0x8A, 0xF1, 0xBB, 0xC6, + 0x5A, 0xED, 0xAC, 0xC5, 0x57, 0xE2, 0x7A, 0xCE, 0x27, 0xD3, 0x11, 0xD7, + 0x5C, 0xD6, 0xC8, 0xE5, 0x0A, 0xD3, 0x5D, 0xDE, 0x04, 0xB9, 0xC6, 0xBF, + 0xA1, 0xBE, 0xA2, 0xC6, 0x01, 0xEC, 0xE6, 0xF4, 0x89, 0x10, 0x2D, 0x21, + 0x3F, 0x24, 0x73, 0x3F, 0x3F, 0x3C, 0x93, 0x53, 0xA2, 0x4F, 0xDC, 0x5E, + 0xC0, 0x55, 0x9E, 0x5F, 0x6B, 0x58, 0xA2, 0x5C, 0xE4, 0x52, 0x65, 0x5E, + 0x34, 0x49, 0x3C, 0x61, 0x0C, 0x47, 0xEF, 0x55, 0x69, 0x45, 0xD6, 0x49, + 0x61, 0x47, 0x68, 0x51, 0x31, 0x44, 0xC6, 0x50, 0x1C, 0x23, 0xA0, 0x32, + 0x97, 0x15, 0x41, 0x1C, 0xEF, 0x25, 0xB5, 0x16, 0xC0, 0x1B, 0x64, 0x09, + 0xD4, 0xFC, 0x03, 0xF5, 0x39, 0xD9, 0xFC, 0xD3, 0x36, 0xC7, 0xFE, 0xCA, + 0x41, 0xE6, 0xCB, 0x03, 0xD5, 0x10, 0x60, 0x35, 0x24, 0x10, 0x6E, 0x21, + 0x54, 0xFA, 0x2D, 0xF4, 0x4D, 0xF8, 0x10, 0xF1, 0xC5, 0x03, 0xF4, 0x13, + 0x3C, 0x08, 0xF5, 0x23, 0x60, 0x07, 0x13, 0x1E, 0x16, 0x0F, 0x61, 0x1A, + 0xB6, 0x29, 0x8D, 0x23, 0x1D, 0x48, 0x26, 0x34, 0x5A, 0x44, 0x48, 0x2B, + 0x08, 0x1E, 0x57, 0x03, 0xC2, 0x04, 0xA8, 0xE4, 0x92, 0x05, 0xEC, 0xDD, + 0xC5, 0x03, 0xB9, 0xE2, 0x40, 0xF9, 0xE8, 0xE9, 0x0F, 0xEC, 0x80, 0xE2, + 0xE0, 0xDF, 0x8C, 0xD9, 0x8A, 0xD3, 0xBF, 0xDC, 0x6F, 0xC5, 0xB1, 0xD7, + 0x18, 0xBE, 0xC1, 0xD1, 0xB1, 0xC6, 0x82, 0xDA, 0xF8, 0xDA, 0x46, 0xEC, + 0x07, 0xEB, 0x22, 0x07, 0x97, 0xEF, 0xD3, 0x24, 0xC7, 0xF6, 0x16, 0x2F, + 0xF2, 0x07, 0x25, 0x27, 0xF8, 0x0B, 0x4D, 0x1B, 0xA4, 0xF8, 0xDF, 0x15, + 0x16, 0xDB, 0xB9, 0x11, 0xC3, 0xD0, 0xA9, 0xFC, 0xBB, 0xDE, 0xF4, 0xDF, + 0x43, 0xEA, 0xCD, 0xD7, 0x88, 0xDD, 0x17, 0xDB, 0xBB, 0xC3, 0x7C, 0xCD, + 0x4D, 0xBC, 0x89, 0xC3, 0xB4, 0xBB, 0x1D, 0xBC, 0xE7, 0xB4, 0x54, 0xAE, + 0x8B, 0xB3, 0x6E, 0xAC, 0x5D, 0xBA, 0xC5, 0xAE, 0x40, 0xCC, 0x9D, 0xB6, + 0x09, 0xE8, 0xE3, 0xCB, 0x3E, 0xF6, 0xA8, 0xDD, 0xBC, 0xFD, 0xA5, 0xF4, + 0xC4, 0x07, 0x59, 0x13, 0x77, 0x03, 0x36, 0x13, 0x30, 0x08, 0xDC, 0x0B, + 0x2E, 0x24, 0xCD, 0x15, 0x51, 0x2F, 0x92, 0x0E, 0x2C, 0x29, 0xF5, 0x09, + 0xAA, 0x3D, 0xAA, 0x28, 0xB8, 0x51, 0x13, 0x41, 0x62, 0x38, 0x33, 0x2E, + 0x00, 0x2D, 0x4B, 0x28, 0xC8, 0x4C, 0xCA, 0x43, 0x6E, 0x4D, 0x8A, 0x44, + 0x68, 0x2A, 0xFB, 0x2F, 0xD0, 0x18, 0x30, 0x2D, 0xEE, 0x11, 0x20, 0x35, + 0x4F, 0x01, 0x3F, 0x23, 0x60, 0xE9, 0xBA, 0x03, 0x02, 0xD1, 0x3A, 0xF7, + 0xBE, 0xBA, 0x06, 0xEC, 0xB4, 0xB2, 0x0F, 0xE1, 0xEC, 0xC0, 0x28, 0xDA, + 0x83, 0xCA, 0xF3, 0xCD, 0x17, 0xC5, 0x05, 0xCD, 0x79, 0xC7, 0xA6, 0xEA, + 0xE1, 0xE6, 0x81, 0x0E, 0xE6, 0x1B, 0x96, 0x24, 0x6B, 0x3F, 0x8B, 0x35, + 0x09, 0x51, 0xFD, 0x49, 0x49, 0x5A, 0xEB, 0x50, 0xA1, 0x51, 0x33, 0x3D, + 0x97, 0x40, 0x5C, 0x30, 0xFC, 0x30, 0x5D, 0x34, 0xC4, 0x33, 0xD8, 0x3C, + 0x08, 0x39, 0xD2, 0x34, 0x00, 0x1F, 0x61, 0x08, 0x3D, 0xFE, 0x8B, 0xDB, + 0x64, 0xE6, 0xFA, 0xC9, 0x99, 0xCF, 0x13, 0xC7, 0x2A, 0xC9, 0xE2, 0xCF, + 0x64, 0xCC, 0xDB, 0xD1, 0x92, 0xD2, 0xD7, 0xCA, 0x44, 0xE7, 0x10, 0xDB, + 0xB4, 0x01, 0xCA, 0x01, 0x5F, 0x11, 0x6A, 0x0E, 0xCF, 0x00, 0x06, 0xE6, + 0x59, 0xD6, 0xBC, 0xB4, 0x3A, 0xC2, 0xD3, 0xA6, 0x3D, 0xD8, 0xF8, 0xBA, + 0x8D, 0xEA, 0x2D, 0xD3, 0xC3, 0xE8, 0x44, 0xD7, 0x7B, 0xED, 0x21, 0xD7, + 0x37, 0xF0, 0x86, 0xE6, 0x02, 0xE1, 0x2C, 0xE2, 0xCA, 0xC1, 0xCB, 0xBC, + 0xB4, 0xA6, 0x1E, 0xA6, 0x01, 0xA1, 0x45, 0xB0, 0x64, 0xA9, 0xA3, 0xBC, + 0x9D, 0xB9, 0xB4, 0xC5, 0x63, 0xC8, 0x78, 0xCC, 0x66, 0xCA, 0x86, 0xCF, + 0xAC, 0xBC, 0x6C, 0xDD, 0xEB, 0xB3, 0x23, 0xE6, 0x43, 0xB8, 0x2B, 0xD9, + 0xA5, 0xCB, 0x8E, 0xD8, 0x94, 0xF6, 0x43, 0xFA, 0xEF, 0x1C, 0x12, 0x1F, + 0xD2, 0x28, 0x0F, 0x36, 0x0E, 0x26, 0xB3, 0x3F, 0xAA, 0x24, 0x45, 0x37, + 0xCD, 0x2A, 0x93, 0x31, 0x62, 0x2D, 0x49, 0x32, 0x5B, 0x24, 0x4C, 0x1F, + 0x4E, 0x0B, 0xD8, 0xF5, 0x14, 0xF6, 0x5D, 0xD9, 0x9C, 0xE9, 0x1C, 0xC9, + 0xBA, 0xD4, 0x01, 0xB9, 0xB3, 0xC5, 0x52, 0xBE, 0x72, 0xC0, 0xAF, 0xBF, + 0xB9, 0xBB, 0x48, 0xAD, 0x7D, 0xAF, 0xD6, 0xA1, 0x76, 0xA8, 0x32, 0x9E, + 0xF4, 0xC1, 0xD7, 0xA2, 0x75, 0xD0, 0xAD, 0xA4, 0x79, 0xBF, 0xEB, 0xA0, + 0x83, 0xC4, 0xF4, 0xB6, 0x67, 0xE5, 0xE1, 0xE0, 0x0E, 0x01, 0x2A, 0xF3, + 0xC2, 0x06, 0x55, 0xEC, 0xE0, 0x05, 0x58, 0xFE, 0x31, 0x22, 0xC6, 0x35, + 0x3B, 0x40, 0xDE, 0x57, 0x87, 0x3F, 0x4A, 0x59, 0x8D, 0x3C, 0x2E, 0x55, + 0x05, 0x43, 0xB6, 0x54, 0x2E, 0x3F, 0x06, 0x59, 0xB0, 0x37, 0x10, 0x54, + 0x7B, 0x41, 0x4F, 0x40, 0xC6, 0x32, 0xE5, 0x1D, 0x0A, 0x17, 0x99, 0x0D, + 0xFA, 0x1D, 0x8A, 0x19, 0xEA, 0x17, 0x2F, 0x19, 0x20, 0x08, 0xF9, 0x10, + 0x4F, 0x05, 0xDE, 0x07, 0x29, 0xF2, 0x91, 0xE9, 0x65, 0xD3, 0x86, 0xCA, + 0xBC, 0xBB, 0x41, 0xBF, 0x86, 0xB0, 0xC7, 0xC0, 0x21, 0xB6, 0xFA, 0xCB, + 0xC4, 0xD4, 0xA1, 0xDD, 0x72, 0xEF, 0x0F, 0xEF, 0x0B, 0xF7, 0x95, 0xF6, + 0xE9, 0x0E, 0xE0, 0xFD, 0x4B, 0x1F, 0xD5, 0x06, 0x40, 0x08, 0xFF, 0x00, + 0x17, 0xF7, 0x02, 0xF6, 0xC5, 0x04, 0x8B, 0xF5, 0x8A, 0x05, 0xEF, 0xF6, + 0x29, 0xF0, 0xBA, 0xE8, 0xE6, 0xF3, 0x6C, 0xDC, 0x4E, 0x03, 0x09, 0xDC, + 0x96, 0x07, 0x0C, 0xD6, 0x45, 0xF7, 0xB8, 0xBF, 0x20, 0xD1, 0xC6, 0xAD, + 0xFC, 0xB2, 0xA9, 0xA5, 0xEE, 0xB6, 0x29, 0xA7, 0x4B, 0xC6, 0x6D, 0xB6, + 0x88, 0xBD, 0x79, 0xBB, 0xD1, 0xBA, 0x6E, 0xB9, 0x9F, 0xD6, 0x2A, 0xCD, + 0xF6, 0xF0, 0xB1, 0xEB, 0x21, 0xF1, 0xA6, 0xF8, 0xFC, 0xE7, 0x9D, 0x03, + 0x24, 0xF1, 0x81, 0x17, 0xD5, 0x05, 0xB4, 0x19, 0xF5, 0x0E, 0xFA, 0x11, + 0xF3, 0x08, 0x14, 0x11, 0x82, 0x03, 0x4F, 0x15, 0xF8, 0x0C, 0x2F, 0x25, + 0x8A, 0x07, 0xD4, 0x1B, 0x0A, 0xF2, 0x24, 0xF5, 0xC8, 0xFD, 0x17, 0xF3, + 0xA5, 0x1A, 0x47, 0x10, 0xDB, 0x20, 0x3E, 0x0F, 0xC3, 0x0F, 0x3C, 0xF7, + 0x7F, 0xF9, 0x16, 0xF1, 0x2F, 0xEE, 0x66, 0xF0, 0xD9, 0xDF, 0x19, 0xE1, + 0xBB, 0xC5, 0xCD, 0xCD, 0x74, 0xBA, 0x02, 0xC1, 0xCE, 0xD3, 0x64, 0xC0, + 0xCB, 0xF8, 0x8E, 0xDC, 0xE5, 0x0B, 0x11, 0x09, 0x33, 0x0E, 0x08, 0x18, + 0x34, 0x11, 0xD7, 0x14, 0x17, 0x1C, 0x5D, 0x1E, 0x94, 0x27, 0xEC, 0x27, + 0x16, 0x31, 0xDA, 0x22, 0x81, 0x3B, 0xE8, 0x23, 0x27, 0x51, 0x6C, 0x3E, + 0x60, 0x5F, 0x0F, 0x55, 0xEC, 0x5B, 0x37, 0x58, 0x9F, 0x4D, 0xCC, 0x4B, + 0x74, 0x3B, 0x7A, 0x38, 0xDB, 0x32, 0xA8, 0x2D, 0x69, 0x30, 0x5F, 0x2D, + 0x10, 0x23, 0x25, 0x23, 0xB0, 0x0A, 0x7B, 0x0F, 0x5C, 0x00, 0x3F, 0x0D, + 0x67, 0x08, 0x11, 0x20, 0x48, 0x01, 0x30, 0x24, 0xD8, 0xF0, 0x48, 0x15, + 0x5A, 0xF5, 0x21, 0x0F, 0x15, 0xFE, 0x67, 0x07, 0xF4, 0xF8, 0x34, 0xF9, + 0xF4, 0xE0, 0x29, 0xE2, 0x26, 0xC5, 0x4C, 0xD2, 0x73, 0xCE, 0x1A, 0xE8, + 0x26, 0xED, 0x63, 0x01, 0xB4, 0x01, 0x90, 0x00, 0xAA, 0x12, 0xE3, 0xFD, + 0xC8, 0x29, 0x6B, 0x0E, 0x29, 0x37, 0xE6, 0x1E, 0xB3, 0x26, 0x62, 0x1B, + 0x68, 0x0F, 0x77, 0x0D, 0xBB, 0x0F, 0x35, 0x0C, 0x46, 0x1E, 0xBD, 0x13, + 0xA7, 0x22, 0x91, 0x11, 0xEE, 0x1C, 0x77, 0x0A, 0x1B, 0x09, 0x3D, 0xFC, + 0x63, 0xEF, 0x77, 0xEF, 0x5E, 0xE2, 0xD0, 0xE9, 0x9D, 0xCD, 0x84, 0xDF, + 0x30, 0xBF, 0x18, 0xE2, 0x8B, 0xD8, 0x17, 0xFB, 0x25, 0x0C, 0xE7, 0x18, + 0x94, 0x23, 0x72, 0x21, 0x4A, 0x13, 0x2E, 0x14, 0xC6, 0x0A, 0xA4, 0x04, + 0x0A, 0x0E, 0x39, 0xF7, 0xBE, 0x0E, 0x83, 0xEE, 0x97, 0x05, 0x3E, 0xE8, + 0xB0, 0x08, 0x44, 0xF6, 0x7A, 0x16, 0xD0, 0x08, 0x61, 0x18, 0x04, 0x08, + 0x44, 0x14, 0xAB, 0x00, 0x9B, 0x0D, 0x40, 0x00, 0xBA, 0x01, 0x6E, 0x00, + 0xF7, 0xD9, 0xC9, 0xE8, 0xB7, 0xB5, 0xE0, 0xCB, 0x54, 0xA9, 0x7A, 0xB2, + 0xBB, 0xA4, 0x92, 0xA5, 0xD0, 0xB6, 0xA8, 0xC2, 0xDA, 0xBE, 0x87, 0xE1, + 0x77, 0xAB, 0x03, 0xD5, 0x18, 0xB3, 0xAD, 0xD5, 0xA9, 0xEA, 0x32, 0x0E, + 0x31, 0x17, 0x69, 0x41, 0xFE, 0x23, 0x14, 0x4E, 0x04, 0x29, 0x17, 0x48, + 0x10, 0x2E, 0x82, 0x4A, 0xBB, 0x35, 0x67, 0x51, 0x07, 0x32, 0xBA, 0x4E, + 0x8E, 0x24, 0xCF, 0x42, 0xCD, 0x33, 0x50, 0x3B, 0x04, 0x5C, 0x8A, 0x3F, + 0xC1, 0x5E, 0xC3, 0x33, 0xDA, 0x42, 0xB9, 0x21, 0x47, 0x3A, 0x6F, 0x18, + 0x62, 0x39, 0xDD, 0x12, 0xE7, 0x29, 0xEB, 0x0C, 0xC9, 0x1D, 0xD9, 0x05, + 0x45, 0x1B, 0xE4, 0xFF, 0xBE, 0x0F, 0x2F, 0xF4, 0xAE, 0xFB, 0x29, 0xE0, + 0xE9, 0xED, 0x8E, 0xD3, 0x7F, 0xEE, 0x41, 0xDC, 0x02, 0xF6, 0xB1, 0xE3, + 0x13, 0x03, 0x78, 0xEC, 0xAC, 0x0B, 0x3D, 0xFB, 0x58, 0x07, 0x3C, 0xFC, + 0x0D, 0x10, 0xBB, 0x00, 0x78, 0x1B, 0x5A, 0x14, 0x82, 0x21, 0x97, 0x28, + 0xC6, 0x36, 0xD5, 0x3E, 0x76, 0x42, 0x1D, 0x56, 0xE3, 0x34, 0xBE, 0x5A, + 0x58, 0x28, 0xED, 0x57, 0x94, 0x1F, 0x79, 0x49, 0x95, 0x22, 0x15, 0x35, + 0x06, 0x2C, 0x87, 0x2F, 0xF5, 0x0F, 0x78, 0x23, 0x42, 0xE4, 0xA5, 0x0D, + 0x90, 0xD5, 0x90, 0xF9, 0x57, 0xD8, 0x6B, 0xFE, 0x54, 0xF4, 0x4A, 0x20, + 0x56, 0x07, 0x63, 0x1B, 0x53, 0xE3, 0x8E, 0xEB, 0xF7, 0xC9, 0x4B, 0xE0, + 0xA7, 0xDD, 0x66, 0xF6, 0x68, 0xEF, 0xD2, 0x06, 0xD4, 0xE4, 0x47, 0x09, + 0x0E, 0xE6, 0x0B, 0x04, 0x45, 0x06, 0xD7, 0x11, 0x55, 0x1A, 0x17, 0x2C, + 0x7D, 0x20, 0x1C, 0x29, 0xCA, 0x2B, 0xD0, 0x13, 0x4F, 0x22, 0x05, 0x0D, + 0x07, 0x04, 0xC4, 0x0A, 0x40, 0xFD, 0x89, 0x08, 0x93, 0x0C, 0x16, 0x0B, + 0x8C, 0x17, 0xD8, 0x0B, 0x47, 0x23, 0x38, 0x14, 0x3A, 0x27, 0x36, 0x1B, + 0xC7, 0x1D, 0xCF, 0x0B, 0xEC, 0x13, 0xD9, 0xF2, 0xA8, 0xFD, 0x83, 0xDF, + 0xF0, 0xDA, 0xEB, 0xCE, 0x35, 0xC6, 0xE7, 0xC2, 0x69, 0xB9, 0x44, 0xBC, + 0xA1, 0xB5, 0xE1, 0xB4, 0xE7, 0xD3, 0xA5, 0xC3, 0xC4, 0xE8, 0x87, 0xE0, + 0x93, 0xE4, 0x2C, 0xF7, 0xFB, 0xEB, 0xAC, 0x0B, 0x6E, 0xFE, 0x7E, 0x18, + 0xCF, 0x20, 0xA3, 0x2D, 0x62, 0x41, 0x6D, 0x3E, 0x92, 0x49, 0xCC, 0x48, + 0x11, 0x44, 0xA9, 0x56, 0xDD, 0x34, 0x8B, 0x47, 0xDD, 0x19, 0x2E, 0x26, + 0x98, 0x02, 0x6E, 0x1A, 0x12, 0x06, 0xCD, 0x23, 0x96, 0x15, 0xA2, 0x21, + 0x2B, 0x17, 0xF1, 0x0C, 0xB1, 0xFE, 0x8C, 0xEB, 0x33, 0xDD, 0xD4, 0xD7, + 0xB5, 0xD3, 0xAB, 0xE8, 0x23, 0xCB, 0x24, 0xE9, 0xAD, 0xC2, 0xEA, 0xD2, + 0x0A, 0xDD, 0x76, 0xDD, 0xC6, 0xFD, 0xF5, 0xFC, 0x58, 0x02, 0xDD, 0xFE, + 0x11, 0xFE, 0x61, 0xF1, 0x77, 0xF8, 0xAF, 0xE9, 0x03, 0xEB, 0x2B, 0xEB, + 0x7B, 0xEF, 0x64, 0xFD, 0x6A, 0xFD, 0x48, 0xFB, 0x9D, 0xF8, 0x6B, 0xE2, + 0x02, 0xFD, 0x9E, 0xDD, 0x4E, 0x1B, 0xB3, 0xF5, 0x68, 0x31, 0x4F, 0x0D, + 0x00, 0x2E, 0xF6, 0x16, 0xF5, 0x2A, 0xA0, 0x1B, 0x27, 0x2D, 0x00, 0x14, + 0x1A, 0x24, 0x4B, 0x05, 0x32, 0x1A, 0x2C, 0x03, 0x51, 0x0E, 0x01, 0x09, + 0x24, 0x09, 0xCD, 0x0E, 0x6C, 0x13, 0xFA, 0x14, 0x68, 0x0C, 0x8C, 0x1C, + 0x6F, 0xF3, 0xF9, 0x29, 0xFC, 0xF2, 0x42, 0x37, 0x1C, 0x0D, 0xA6, 0x34, + 0x05, 0x1C, 0x03, 0x28, 0xEB, 0x13, 0xC4, 0x16, 0xCD, 0x08, 0x18, 0x07, + 0x59, 0x08, 0xBA, 0x0F, 0x2F, 0x10, 0x85, 0x20, 0xC9, 0x0F, 0x83, 0x17, + 0xDE, 0x0D, 0x6D, 0x06, 0x61, 0x13, 0xE6, 0x04, 0x20, 0x04, 0x97, 0xF6, + 0xA4, 0xE8, 0x06, 0xDE, 0xB8, 0xE3, 0x26, 0xDF, 0x34, 0xEB, 0x4E, 0xE7, + 0xCA, 0xDA, 0xAC, 0xD9, 0xFB, 0xBD, 0x16, 0xC5, 0x49, 0xAC, 0x17, 0xB3, + 0xAE, 0xA6, 0xC9, 0xA2, 0x53, 0xAD, 0xB6, 0x9A, 0xC8, 0xB4, 0x62, 0xA4, + 0x3A, 0xA8, 0xA9, 0xAB, 0x91, 0x9C, 0x60, 0xAA, 0xE7, 0xBD, 0xA0, 0xC2, + 0xDA, 0xDE, 0xBC, 0xE4, 0x58, 0xD8, 0xAA, 0xF3, 0x62, 0xE0, 0x50, 0x02, + 0x50, 0x0C, 0xF2, 0x1C, 0x41, 0x35, 0x22, 0x34, 0x90, 0x44, 0x6A, 0x3A, + 0xED, 0x39, 0x90, 0x2A, 0x8B, 0x22, 0xF0, 0x17, 0x45, 0x1A, 0x32, 0x18, + 0x2D, 0x20, 0x2E, 0x1C, 0x5E, 0x22, 0xB5, 0x13, 0x63, 0x25, 0x7C, 0x0D, + 0x5B, 0x28, 0x83, 0x13, 0xE5, 0x18, 0x1E, 0x16, 0x75, 0xFF, 0x5C, 0x19, + 0xB2, 0xE4, 0x07, 0x06, 0xBA, 0xD3, 0x0F, 0xE4, 0x41, 0xCD, 0x69, 0xDA, + 0x69, 0xB6, 0xFB, 0xCF, 0xA4, 0x9E, 0x46, 0xB3, 0x0C, 0xA3, 0x70, 0xA8, + 0xFE, 0xB8, 0x1E, 0xC7, 0x56, 0xD3, 0xF6, 0xEC, 0xA3, 0xEE, 0x93, 0x03, + 0x98, 0xF8, 0x5D, 0x07, 0x94, 0x04, 0xA8, 0x08, 0x66, 0x31, 0xC2, 0x23, + 0x16, 0x4C, 0x8C, 0x3C, 0x23, 0x3F, 0xA3, 0x3E, 0x80, 0x23, 0xFF, 0x23, + 0x3D, 0x10, 0xBC, 0x0D, 0xE0, 0x05, 0x13, 0x06, 0x02, 0x03, 0x48, 0xF6, + 0xA8, 0x19, 0xD0, 0xF6, 0x7C, 0x25, 0x46, 0xF5, 0x08, 0x0E, 0x0D, 0xE7, + 0x66, 0xF8, 0x5F, 0xDE, 0xFB, 0xE5, 0xEB, 0xCC, 0x05, 0xCC, 0x68, 0xB3, + 0xBD, 0xC6, 0x0B, 0xBA, 0xE2, 0xC7, 0x5E, 0xC5, 0x31, 0xC6, 0x05, 0xB1, + 0x6D, 0xE2, 0x97, 0xC4, 0x64, 0x04, 0x2C, 0xF2, 0xC3, 0x13, 0x5E, 0xFB, + 0xB4, 0x19, 0x7F, 0xF6, 0x31, 0x0C, 0x4D, 0xF1, 0xD1, 0x00, 0xC9, 0xF1, + 0x91, 0x0A, 0x6B, 0xF7, 0x17, 0x0F, 0xA0, 0xF5, 0x35, 0x09, 0xD4, 0xEB, + 0x50, 0x06, 0x5C, 0xF2, 0x20, 0x08, 0x36, 0x11, 0xC5, 0x09, 0xB8, 0x22, + 0x6C, 0x0D, 0x0E, 0x1B, 0xAA, 0x07, 0x7F, 0x09, 0x8A, 0x00, 0xF9, 0xFB, + 0xDA, 0x07, 0xBB, 0xFC, 0x71, 0xED, 0xD9, 0xF2, 0x97, 0xBD, 0x29, 0xD9, + 0xED, 0xAF, 0xF2, 0xCD, 0xC9, 0xB3, 0xBB, 0xC9, 0xBA, 0xB4, 0x58, 0xC3, + 0x38, 0xBB, 0xDA, 0xC7, 0x93, 0xD2, 0xE9, 0xD9, 0xDE, 0xE7, 0x96, 0xE7, + 0x0E, 0xED, 0x2D, 0xE1, 0x88, 0xEB, 0x68, 0xDF, 0x8A, 0xED, 0x5C, 0xEC, + 0x5F, 0xF8, 0x5B, 0xF7, 0x09, 0x0F, 0xA3, 0x0E, 0xA8, 0x27, 0x85, 0x2A, + 0x6F, 0x2A, 0x1D, 0x33, 0x8F, 0x1A, 0x89, 0x28, 0x31, 0x11, 0x2F, 0x17, + 0x2F, 0x0C, 0xDE, 0x06, 0x8B, 0xFE, 0x11, 0x04, 0xFD, 0xFE, 0x22, 0x17, + 0x2B, 0x0C, 0xEF, 0x1B, 0x8F, 0x0D, 0x9A, 0x01, 0x99, 0xFE, 0xC4, 0xE2, + 0x96, 0xEE, 0x96, 0xD1, 0x88, 0xE9, 0x2D, 0xD1, 0xBC, 0xDB, 0x08, 0xC8, + 0x82, 0xC7, 0xB1, 0xB3, 0x65, 0xD0, 0xF9, 0xC1, 0x4F, 0xFF, 0x11, 0xEA, + 0xA1, 0x28, 0x2A, 0xF9, 0x5F, 0x24, 0x74, 0xF3, 0xFB, 0x0C, 0xEF, 0xFC, + 0x51, 0x0C, 0xCE, 0x10, 0xB5, 0x13, 0x90, 0x0F, 0xEB, 0x13, 0x80, 0x09, + 0xC9, 0x12, 0x82, 0x07, 0x02, 0x16, 0x75, 0x09, 0x5F, 0x1C, 0xF6, 0x1A, + 0x95, 0x11, 0xE4, 0x22, 0x86, 0xFA, 0x5F, 0x18, 0x68, 0xF8, 0xA1, 0x0F, + 0xAE, 0x07, 0xF6, 0x0F, 0x48, 0x08, 0x09, 0x0D, 0x8C, 0xF9, 0xE5, 0x05, + 0x98, 0xEA, 0xE3, 0xF6, 0x90, 0xE5, 0x97, 0xED, 0x1B, 0xDD, 0x7B, 0xF2, + 0x7A, 0xC5, 0x07, 0xE9, 0x16, 0xB3, 0x24, 0xDF, 0x2D, 0xC8, 0xCA, 0xEB, + 0x8C, 0x05, 0x8B, 0x05, 0x96, 0x29, 0x94, 0x13, 0xAC, 0x1A, 0x33, 0x10, + 0xD5, 0x07, 0x86, 0x07, 0x47, 0x12, 0x62, 0x01, 0xD7, 0x22, 0xA5, 0x0E, + 0x21, 0x22, 0x0E, 0x1C, 0xC5, 0x1F, 0xFD, 0x13, 0x9A, 0x22, 0x5A, 0x0A, + 0xD5, 0x23, 0x65, 0x06, 0x8D, 0x21, 0x9A, 0x00, 0xD9, 0x1F, 0x41, 0xFB, + 0x55, 0x1F, 0x9D, 0xF6, 0xB7, 0x0B, 0x3B, 0xE4, 0x99, 0xED, 0x53, 0xCE, + 0xA9, 0xDB, 0xCC, 0xC2, 0xC8, 0xCB, 0x26, 0xAF, 0xCD, 0xC1, 0x4A, 0xA0, + 0xF0, 0xD3, 0xED, 0xBF, 0x56, 0xE0, 0x87, 0xEA, 0x8B, 0xDF, 0xD2, 0x01, + 0x21, 0x00, 0x04, 0x27, 0x40, 0x27, 0xDB, 0x42, 0x04, 0x2D, 0xE5, 0x40, + 0x7E, 0x38, 0x0A, 0x3E, 0x73, 0x43, 0x48, 0x39, 0xE2, 0x35, 0x2B, 0x3A, + 0xF1, 0x2E, 0x31, 0x46, 0x01, 0x22, 0x90, 0x32, 0x34, 0x1E, 0x64, 0x1C, + 0x76, 0x41, 0x6F, 0x39, 0x24, 0x5D, 0xBB, 0x4C, 0xD9, 0x58, 0xC8, 0x3D, + 0x15, 0x3F, 0x8C, 0x27, 0xC4, 0x20, 0x2E, 0x0F, 0xC1, 0x17, 0x17, 0x0C, + 0x4A, 0x09, 0x0A, 0x09, 0xDB, 0xF1, 0x21, 0xF7, 0xB1, 0xF4, 0x46, 0xF5, + 0x22, 0xF9, 0xFB, 0xFC, 0x8F, 0xE1, 0xB2, 0xE8, 0x33, 0xD8, 0x31, 0xD1, + 0x33, 0xEB, 0x6F, 0xD0, 0xE7, 0xE6, 0xB2, 0xD1, 0xA5, 0xD5, 0x1E, 0xE1, + 0x4E, 0xCA, 0x7D, 0xE7, 0xF0, 0xC7, 0x8F, 0xD9, 0x01, 0xDF, 0x8A, 0xDE, + 0x32, 0x00, 0x6F, 0xF9, 0x3B, 0x19, 0xDA, 0x0B, 0xCF, 0x1F, 0xB1, 0x09, + 0x6D, 0x13, 0xA1, 0x03, 0xD0, 0x00, 0xE3, 0xFB, 0xA7, 0x01, 0x72, 0xFE, + 0xAE, 0x14, 0x47, 0x09, 0x4C, 0x21, 0x30, 0x0A, 0x7E, 0x2F, 0x1C, 0x16, + 0x88, 0x2B, 0xBF, 0x20, 0x0C, 0x06, 0x06, 0x0F, 0x0C, 0xDF, 0x5A, 0xF2, + 0x73, 0xD2, 0xE7, 0xE6, 0xEB, 0xE6, 0xCA, 0xF0, 0x80, 0xF1, 0xB9, 0xF3, + 0x22, 0xDD, 0x92, 0xEC, 0x8F, 0xD9, 0xC2, 0xFD, 0xBE, 0xEC, 0xB0, 0x14, + 0xCF, 0xF2, 0x61, 0x0F, 0xE7, 0xE9, 0xB3, 0xFF, 0xAA, 0xED, 0xC6, 0xFF, + 0x2F, 0x0A, 0xC1, 0x1C, 0x6E, 0x26, 0x7C, 0x34, 0x4D, 0x2F, 0xA5, 0x2A, + 0x76, 0x2C, 0x1E, 0x23, 0xF2, 0x2A, 0x9D, 0x32, 0x60, 0x33, 0x5B, 0x48, + 0xF8, 0x3B, 0xDA, 0x47, 0xC0, 0x3A, 0x79, 0x37, 0x09, 0x2B, 0xE8, 0x26, + 0xF7, 0x21, 0x91, 0x1C, 0x1A, 0x22, 0xF1, 0x17, 0x14, 0x16, 0xBF, 0x05, + 0xF9, 0x07, 0x5B, 0xFC, 0xA5, 0xF7, 0x49, 0xFC, 0x57, 0xE4, 0x3F, 0xED, + 0xA8, 0xCF, 0x8D, 0xCF, 0x96, 0xC8, 0xC7, 0xC1, 0xE3, 0xE2, 0xC8, 0xDA, + 0x90, 0x00, 0xCA, 0xF1, 0x81, 0x03, 0xB0, 0xE6, 0xA7, 0x01, 0x9B, 0xE0, + 0x9C, 0x0E, 0x66, 0xF9, 0xB9, 0x26, 0x44, 0x18, 0xF1, 0x36, 0xD4, 0x1D, + 0xED, 0x3A, 0xA4, 0x11, 0xC5, 0x3E, 0xFA, 0x14, 0x1C, 0x3A, 0x9D, 0x1A, + 0xB5, 0x24, 0xA7, 0x17, 0xE9, 0x07, 0xDC, 0x1A, 0x55, 0x04, 0x66, 0x25, + 0x57, 0x1B, 0x03, 0x2A, 0x25, 0x25, 0x48, 0x22, 0x6C, 0x15, 0x25, 0x1B, + 0x50, 0xF3, 0x18, 0x05, 0xDF, 0xD1, 0xF9, 0xE3, 0xB8, 0xC5, 0xD1, 0xDB, + 0xFD, 0xBE, 0x81, 0xDC, 0xEC, 0xB3, 0xC9, 0xCD, 0xA8, 0xC6, 0x1D, 0xD7, + 0xB8, 0xF3, 0x46, 0xFB, 0x11, 0x08, 0xB4, 0x04, 0x40, 0x04, 0x85, 0xFD, + 0x19, 0x05, 0x2A, 0x08, 0xC3, 0x05, 0xE7, 0x0E, 0x47, 0x09, 0xBF, 0x09, + 0xA3, 0x12, 0x2A, 0x17, 0x98, 0x08, 0x58, 0x25, 0x91, 0x0B, 0xDE, 0x2D, + 0x5B, 0x26, 0xD4, 0x33, 0x07, 0x20, 0xC4, 0x1D, 0xC8, 0x08, 0x16, 0x04, + 0x3A, 0xFE, 0xFD, 0x00, 0x80, 0xED, 0x3A, 0x02, 0xAA, 0xE2, 0x75, 0x06, + 0x9C, 0xEB, 0x52, 0x0A, 0x8D, 0xFB, 0x56, 0x0B, 0x19, 0x12, 0x84, 0x12, + 0x82, 0x1B, 0xDF, 0x0D, 0x45, 0x02, 0xAE, 0xFA, 0x2A, 0xE7, 0xB5, 0xE8, + 0x19, 0xEF, 0x82, 0xE1, 0xBF, 0x1A, 0xB2, 0xF9, 0x36, 0x36, 0xF7, 0x13, + 0x71, 0x39, 0x9F, 0x17, 0x20, 0x42, 0xD4, 0x1F, 0x15, 0x36, 0x51, 0x28, + 0x8E, 0x16, 0x90, 0x23, 0x52, 0x08, 0x92, 0x20, 0x92, 0x11, 0x8F, 0x1F, + 0x4D, 0x11, 0xCB, 0x11, 0x70, 0x0E, 0x1B, 0x19, 0x0B, 0x12, 0x19, 0x35, + 0xA2, 0x04, 0x11, 0x31, 0xFF, 0x04, 0xDF, 0x29, 0xA9, 0xFC, 0xF1, 0x1F, + 0x7B, 0xE0, 0x4A, 0xF8, 0xBD, 0xD6, 0x4E, 0xDE, 0x52, 0xCC, 0x7F, 0xD6, + 0x3D, 0xCB, 0x6F, 0xD5, 0x25, 0xD7, 0x13, 0xE0, 0x03, 0xCC, 0xAD, 0xE1, + 0xD3, 0xBB, 0xD7, 0xDD, 0x75, 0xD8, 0x51, 0xF6, 0x9D, 0xEF, 0x52, 0x0A, + 0xB8, 0xDC, 0x52, 0xF8, 0x66, 0xE5, 0x79, 0xEF, 0xB8, 0x08, 0x71, 0x02, + 0x3D, 0x18, 0x0D, 0x0C, 0x7C, 0x12, 0x57, 0x08, 0x04, 0x07, 0x61, 0x0F, + 0xBF, 0x06, 0x13, 0x19, 0x66, 0x1E, 0xC7, 0x20, 0xA6, 0x40, 0xF6, 0x35, + 0xDB, 0x4B, 0xFA, 0x40, 0x0B, 0x44, 0xFF, 0x2A, 0x90, 0x3E, 0x2A, 0x14, + 0xB4, 0x3D, 0x75, 0x1B, 0xA5, 0x30, 0x04, 0x24, 0x40, 0x19, 0x90, 0x1E, + 0xC5, 0x14, 0xB7, 0x21, 0x32, 0x0F, 0xE7, 0x10, 0xD1, 0xF3, 0xED, 0xE9, + 0x48, 0xD9, 0xD0, 0xD8, 0x57, 0xD2, 0x49, 0xE4, 0xE0, 0xD9, 0x31, 0xF8, + 0x85, 0xEA, 0xB2, 0x07, 0xF2, 0xF7, 0x21, 0x0C, 0x37, 0xFD, 0x28, 0x0C, + 0x4E, 0x05, 0x7F, 0x14, 0x44, 0x0D, 0x03, 0x1A, 0x52, 0x11, 0xF9, 0x20, + 0x8D, 0x0B, 0x74, 0x22, 0x55, 0x04, 0xA5, 0x15, 0x11, 0x0B, 0x3B, 0x17, + 0x6C, 0x08, 0x6B, 0x11, 0xC7, 0x09, 0x4B, 0x07, 0x4F, 0x28, 0xF2, 0x20, + 0x9E, 0x35, 0xA8, 0x36, 0xBF, 0x22, 0xD0, 0x1C, 0xA8, 0x0B, 0x41, 0xF2, + 0xE5, 0xE8, 0x5F, 0xD1, 0x27, 0xDD, 0x67, 0xD3, 0x70, 0xED, 0x52, 0xF5, + 0xD0, 0xDE, 0x74, 0xF5, 0x8F, 0xDA, 0xD1, 0xE1, 0xA7, 0xF8, 0xE6, 0xE2, + 0xE0, 0xFA, 0x34, 0xE3, 0xE4, 0xDE, 0xD0, 0xDA, 0x11, 0xCD, 0x0B, 0xD6, + 0x98, 0xC7, 0x74, 0xDA, 0x01, 0xDB, 0xDE, 0xEA, 0xF7, 0xFE, 0x77, 0xF9, + 0x0E, 0x07, 0x6D, 0xF7, 0x54, 0xFE, 0x65, 0xEB, 0x14, 0x05, 0x54, 0xEF, + 0x2E, 0x02, 0x23, 0xF2, 0x35, 0xED, 0x3A, 0xE1, 0x82, 0xED, 0x6B, 0xD5, + 0x26, 0xFE, 0x6E, 0xD6, 0x54, 0x0B, 0x6D, 0xDD, 0xD8, 0x09, 0xB5, 0xE0, + 0x2D, 0xF0, 0x63, 0xE3, 0xF0, 0xDA, 0x7C, 0xE2, 0xE5, 0xD3, 0x0C, 0xD4, + 0xFE, 0xBD, 0x3E, 0xBF, 0xDC, 0xA8, 0xCC, 0xB6, 0x78, 0xB6, 0x14, 0xBF, + 0x24, 0xD4, 0x0C, 0xD9, 0xCC, 0xE3, 0x82, 0xFB, 0x51, 0xE5, 0x7D, 0x05, + 0xF6, 0xDC, 0x4C, 0xFB, 0xA1, 0xDF, 0xB0, 0x05, 0x3C, 0xF6, 0xCB, 0x1B, + 0x0C, 0x0C, 0xB0, 0x27, 0xC6, 0x16, 0x5E, 0x33, 0xA4, 0x17, 0x34, 0x36, + 0xEF, 0x18, 0xE3, 0x36, 0xF1, 0x11, 0x98, 0x36, 0xD9, 0x0F, 0xFA, 0x35, + 0x35, 0x1F, 0x94, 0x3E, 0x7D, 0x1C, 0x9E, 0x3D, 0xDC, 0x08, 0x25, 0x25, + 0xC2, 0x09, 0xA9, 0x09, 0xD3, 0x08, 0x4D, 0xF8, 0x11, 0xEF, 0x36, 0xEA, + 0x49, 0xD9, 0x4F, 0xE2, 0x3E, 0xD0, 0x0C, 0xD9, 0x1F, 0xD6, 0x40, 0xD5, + 0x62, 0xF5, 0x6B, 0xE9, 0x29, 0x0E, 0xFA, 0xF7, 0xE1, 0x00, 0xBA, 0xE5, + 0xAE, 0xE6, 0x19, 0xCB, 0xE1, 0xE0, 0xA4, 0xC8, 0xF1, 0xF6, 0x4F, 0xE6, + 0xBE, 0x05, 0x7E, 0xF8, 0x11, 0xFA, 0x2B, 0xE3, 0x39, 0x03, 0xA6, 0xD3, + 0xDB, 0x2D, 0xEC, 0xED, 0xA1, 0x3D, 0xF7, 0x09, 0xA1, 0x29, 0x91, 0x0F, + 0x74, 0x0E, 0xAA, 0x07, 0x76, 0xFF, 0xB5, 0xFF, 0xE7, 0x01, 0xA4, 0x08, + 0xC6, 0xF9, 0xDE, 0x06, 0xE8, 0xEC, 0x5A, 0xFC, 0xB0, 0xEE, 0x07, 0x01, + 0xF1, 0xE9, 0xBA, 0x07, 0x9A, 0xCF, 0x67, 0xFD, 0xE3, 0xB5, 0x15, 0xE1, + 0x16, 0xA2, 0xFA, 0xBC, 0x22, 0x9D, 0x77, 0xA5, 0xA2, 0xC5, 0xF4, 0xBF, + 0x86, 0xEF, 0xDE, 0xE4, 0x01, 0xE7, 0xB0, 0xDB, 0x33, 0xEE, 0xAB, 0xDC, + 0xFD, 0x10, 0x93, 0xF3, 0x1A, 0x13, 0x13, 0xF5, 0x1F, 0x11, 0x02, 0xFE, + 0x56, 0x1D, 0x6D, 0x1C, 0x32, 0x1D, 0x62, 0x23, 0x7E, 0x1C, 0x42, 0x0E, + 0xE6, 0x27, 0xD1, 0x04, 0x1F, 0x2D, 0x57, 0x0F, 0xCF, 0x23, 0xA1, 0x16, + 0x4F, 0x03, 0xE2, 0xFF, 0xC2, 0xD2, 0x95, 0xD7, 0x0F, 0xBC, 0xDF, 0xC0, + 0x35, 0xC2, 0xC8, 0xBC, 0x48, 0xD2, 0xE5, 0xC9, 0x64, 0xE0, 0xCE, 0xD5, + 0xA8, 0xD1, 0x24, 0xC1, 0x6C, 0xBF, 0x29, 0xB6, 0xB4, 0xD7, 0xD1, 0xD4, + 0xCF, 0xEC, 0x88, 0xD7, 0x0C, 0xE3, 0xAE, 0xB7, 0xB3, 0xDB, 0x60, 0xB2, + 0xD3, 0xEB, 0xE7, 0xCC, 0xA1, 0x08, 0xAD, 0xEC, 0xC3, 0x0B, 0xF5, 0xF5, + 0xC0, 0xFC, 0x65, 0xF1, 0xE6, 0x08, 0x52, 0x02, 0x1D, 0x26, 0x58, 0x19, + 0xB6, 0x38, 0xD0, 0x25, 0xC1, 0x3C, 0x39, 0x34, 0x63, 0x2E, 0x47, 0x39, + 0x34, 0x22, 0xB5, 0x3E, 0xE8, 0x15, 0xAB, 0x3D, 0x9A, 0xFA, 0x19, 0x25, + 0x47, 0xEF, 0xA1, 0x16, 0x3D, 0xFC, 0xAD, 0x19, 0x74, 0x04, 0xA2, 0x15, + 0x02, 0xF4, 0x3D, 0xFE, 0x00, 0xD7, 0xC3, 0xE5, 0x4B, 0xD3, 0x15, 0xDE, + 0x23, 0xE1, 0x43, 0xDE, 0x8A, 0xDA, 0x7E, 0xE1, 0x54, 0xD3, 0x26, 0xE7, + 0x11, 0xDD, 0x38, 0xE0, 0xC6, 0xEC, 0xDA, 0xD4, 0xA1, 0xF5, 0xFB, 0xD9, + 0xB0, 0xFA, 0x42, 0xE8, 0xAB, 0xFA, 0xFB, 0xEB, 0x75, 0xF9, 0x55, 0xF2, + 0x10, 0x08, 0x50, 0x0A, 0x25, 0x05, 0x3F, 0x0E, 0xD4, 0x04, 0x85, 0x06, + 0x20, 0x1F, 0xEC, 0x09, 0x55, 0x27, 0xDE, 0x06, 0x34, 0x0D, 0x9C, 0xF4, + 0xB5, 0xF4, 0x32, 0xEB, 0x04, 0xEE, 0xD3, 0xED, 0x1F, 0xF2, 0xBC, 0xEA, + 0x06, 0x01, 0x12, 0xE4, 0x0F, 0xFF, 0xDB, 0xD7, 0x1C, 0x01, 0x0C, 0xE3, + 0x70, 0x15, 0x53, 0xFB, 0x5A, 0x0E, 0x9D, 0x00, 0x3D, 0xE6, 0x38, 0xF8, + 0xFD, 0xC5, 0x31, 0xE7, 0xA0, 0xD3, 0x8C, 0xEC, 0xCA, 0xF6, 0x6F, 0x0A, + 0xA6, 0x09, 0xA7, 0x1B, 0x57, 0x0E, 0xAF, 0x1D, 0xA0, 0x0B, 0x26, 0x1F, + 0x8D, 0x08, 0xED, 0x1A, 0xD2, 0x0C, 0x88, 0x15, 0xB9, 0x05, 0xA7, 0x0B, + 0xC0, 0xFE, 0x2C, 0x02, 0x63, 0x11, 0xC9, 0x0E, 0x80, 0x1E, 0x2D, 0x25, + 0x9B, 0x19, 0x97, 0x1F, 0xBE, 0x1B, 0x32, 0x06, 0x31, 0x1C, 0x07, 0x01, + 0xE0, 0x05, 0xDC, 0x0A, 0x52, 0xED, 0x7E, 0x0A, 0x41, 0xE4, 0xC1, 0xF4, + 0x6A, 0xE7, 0xA8, 0xDB, 0x3E, 0xEE, 0x8D, 0xCB, 0x42, 0xF7, 0x5F, 0xD6, + 0xF6, 0xF9, 0x34, 0xEA, 0xDF, 0xE8, 0xFC, 0xDB, 0x52, 0xD5, 0xC7, 0xCB, + 0xEF, 0xCD, 0x63, 0xD5, 0x51, 0xDE, 0x63, 0xEB, 0xCC, 0x09, 0x6A, 0x03, + 0xF4, 0x24, 0xA8, 0x10, 0x44, 0x1A, 0x41, 0x0F, 0xBD, 0x04, 0x6F, 0x0A, + 0x25, 0xF9, 0x79, 0x00, 0xC1, 0xFD, 0xE5, 0xF2, 0x71, 0x0E, 0xCE, 0xF1, + 0xC3, 0x16, 0x74, 0xF2, 0xC6, 0x0E, 0xEE, 0xE4, 0xC8, 0xFF, 0x75, 0xD8, + 0x15, 0xEC, 0xD4, 0xD7, 0xD2, 0xD2, 0x49, 0xCB, 0xC9, 0xC3, 0x56, 0xBA, + 0x1A, 0xCE, 0x61, 0xC3, 0x41, 0xE1, 0x8F, 0xD7, 0xE0, 0xEF, 0x52, 0xEB, + 0x49, 0xEE, 0xAB, 0xF8, 0x76, 0xE4, 0xB0, 0xFD, 0x80, 0xE7, 0xCD, 0x08, + 0x96, 0xF2, 0xE9, 0x1E, 0x73, 0x0B, 0x6E, 0x37, 0xA4, 0x24, 0xCA, 0x39, + 0x1C, 0x20, 0x42, 0x32, 0x6A, 0x15, 0x36, 0x3F, 0x39, 0x27, 0x5B, 0x51, + 0xC5, 0x3E, 0x0B, 0x50, 0xE7, 0x3C, 0xAE, 0x4A, 0xF4, 0x31, 0xE2, 0x57, + 0x0C, 0x2E, 0xC7, 0x5E, 0xB8, 0x2C, 0x56, 0x57, 0x8E, 0x33, 0x87, 0x56, + 0xC5, 0x3A, 0xB6, 0x53, 0x2E, 0x33, 0xDB, 0x3F, 0x7E, 0x23, 0xC2, 0x28, + 0xC3, 0x09, 0x78, 0x16, 0xE6, 0xFA, 0x8D, 0x0B, 0xB7, 0x0D, 0x64, 0x15, + 0xA6, 0x1F, 0x80, 0x19, 0x8B, 0x1F, 0xC8, 0x08, 0xDC, 0x1F, 0x70, 0xFB, + 0xF8, 0x1C, 0x56, 0xFC, 0xC0, 0x1C, 0xD0, 0x0E, 0x90, 0x2F, 0xCE, 0x26, + 0x05, 0x39, 0x59, 0x2A, 0xBE, 0x30, 0x83, 0x1F, 0x75, 0x2E, 0x19, 0x0E, + 0x72, 0x2F, 0xD1, 0xFA, 0x83, 0x28, 0xCF, 0x00, 0xD7, 0x23, 0xC7, 0x1C, + 0x20, 0x2D, 0x46, 0x33, 0x2F, 0x32, 0xB1, 0x32, 0x82, 0x1E, 0xEE, 0x18, + 0x6D, 0x04, 0x9D, 0xFC, 0x21, 0xFC, 0x48, 0xFA, 0x12, 0xFF, 0x73, 0x0C, + 0x35, 0xFE, 0x4E, 0x10, 0xFB, 0xED, 0x64, 0x01, 0xA6, 0xE1, 0x1F, 0xF7, + 0x1B, 0xE7, 0x56, 0xF3, 0x1F, 0xDC, 0x52, 0xE1, 0xBF, 0xC5, 0x4E, 0xD5, + 0x72, 0xC2, 0x12, 0xDF, 0x7D, 0xD5, 0x43, 0xE0, 0x85, 0xF5, 0xAA, 0xDD, + 0x35, 0x04, 0x5D, 0xE0, 0xFF, 0xF9, 0x60, 0xEC, 0x4F, 0xF7, 0xB4, 0x06, + 0xA1, 0x08, 0x9E, 0x18, 0xA0, 0x11, 0xE9, 0x12, 0xD6, 0x0D, 0xF1, 0x04, + 0xF4, 0x15, 0x57, 0x04, 0xDC, 0x26, 0x41, 0x14, 0x33, 0x21, 0x48, 0x1F, + 0x42, 0xFD, 0x7A, 0x11, 0x09, 0xE3, 0xB5, 0xFE, 0x18, 0xE8, 0xAE, 0xFD, + 0x09, 0xF6, 0x39, 0xFF, 0x1D, 0xFB, 0xCE, 0xF8, 0xDD, 0xFF, 0x70, 0xFF, + 0xE5, 0x06, 0x25, 0x0D, 0x64, 0x05, 0x16, 0x0B, 0xF6, 0xF7, 0x96, 0xFB, + 0xCD, 0xF0, 0xFB, 0xEB, 0x6B, 0x04, 0xB3, 0xEC, 0xF4, 0x12, 0x0D, 0xEE, + 0x34, 0x12, 0x9C, 0xF4, 0x97, 0x16, 0x25, 0x0A, 0xD5, 0x11, 0x89, 0x0F, + 0x70, 0x08, 0x0D, 0x09, 0x5B, 0x07, 0x80, 0x08, 0xE5, 0x11, 0xB9, 0x15, + 0x67, 0x2A, 0x56, 0x30, 0x43, 0x3D, 0x11, 0x3F, 0x74, 0x2C, 0x7B, 0x33, + 0x1C, 0x05, 0xD4, 0x1D, 0x6C, 0xEC, 0xAD, 0x0D, 0x27, 0xEB, 0xDD, 0x03, + 0xCC, 0xFC, 0x90, 0x12, 0xA7, 0xFF, 0x71, 0x26, 0x17, 0xF1, 0x06, 0x1B, + 0x59, 0xFF, 0xB5, 0x18, 0xF7, 0x1B, 0x78, 0x2A, 0xED, 0x12, 0xC8, 0x22, + 0x9E, 0xF1, 0xBB, 0x07, 0x0A, 0xF1, 0xD1, 0x0C, 0x75, 0x0E, 0xE4, 0x32, + 0x16, 0x21, 0xE3, 0x41, 0xAC, 0x26, 0x1E, 0x33, 0x98, 0x29, 0xD0, 0x1D, + 0x8C, 0x24, 0xD4, 0x0F, 0x2F, 0x19, 0xF1, 0x11, 0xFE, 0x0B, 0x64, 0x11, + 0x30, 0x02, 0x1C, 0x04, 0xAF, 0x06, 0x76, 0xF7, 0x48, 0x15, 0x0D, 0xF6, + 0x3C, 0x1F, 0x96, 0xFD, 0xB8, 0x14, 0x63, 0xFA, 0xD9, 0xFC, 0x34, 0xE6, + 0x6E, 0xF1, 0xDE, 0xDE, 0x92, 0xF1, 0xA5, 0xE9, 0x8F, 0xE7, 0x86, 0xDF, + 0xA7, 0xEA, 0x69, 0xCA, 0xB8, 0x08, 0x80, 0xD3, 0x77, 0x19, 0xE7, 0xEC, + 0x59, 0x19, 0x9A, 0x00, 0xA8, 0x0E, 0x28, 0x09, 0x7E, 0x05, 0xD2, 0x0C, + 0xDE, 0x04, 0x35, 0x0E, 0xD6, 0x04, 0x2B, 0x12, 0xE8, 0x0D, 0x9A, 0x29, + 0x2C, 0x13, 0x84, 0x38, 0x00, 0x18, 0xC1, 0x39, 0xF1, 0x14, 0x04, 0x3A, + 0x73, 0x00, 0x3B, 0x25, 0x2D, 0xFA, 0x82, 0x13, 0x97, 0xF9, 0x0A, 0x17, + 0xB0, 0xEB, 0x65, 0x18, 0xFA, 0xDD, 0x6F, 0x05, 0x42, 0xDD, 0x1B, 0xE7, + 0x86, 0xEB, 0x32, 0xDC, 0x9C, 0xFB, 0xEB, 0xE9, 0xB9, 0xF9, 0x81, 0xF7, + 0x21, 0xE1, 0xC9, 0xEA, 0xED, 0xD2, 0xFB, 0xD9, 0x77, 0xE8, 0x9D, 0xEA, + 0xD0, 0xF9, 0xBD, 0xED, 0xE6, 0xF5, 0x23, 0xD8, 0x01, 0xF1, 0x04, 0xD6, + 0x30, 0xEE, 0xA6, 0xE0, 0x27, 0xEF, 0x51, 0xEA, 0xB6, 0xE9, 0xB5, 0xE7, + 0x63, 0xDE, 0x91, 0xD9, 0x2D, 0xDF, 0x73, 0xCE, 0xCC, 0xF5, 0x1F, 0xDF, + 0xAF, 0x0F, 0x01, 0x00, 0x51, 0x13, 0xBF, 0x01, 0x1A, 0x0C, 0xC9, 0xF8, + 0xC8, 0x06, 0x57, 0x00, 0xA7, 0x0C, 0x30, 0x08, 0x5D, 0x13, 0x37, 0xFD, + 0x2E, 0x02, 0x5A, 0xE3, 0x52, 0xFA, 0x18, 0xE0, 0x63, 0xFF, 0x48, 0xEC, + 0x66, 0xF6, 0x55, 0xEA, 0xCF, 0xEA, 0x88, 0xDE, 0x17, 0xF4, 0x53, 0xE3, + 0x47, 0x06, 0x0A, 0xF9, 0x49, 0x08, 0xB1, 0xFE, 0x0D, 0x03, 0x68, 0xF9, + 0xB2, 0xF2, 0x04, 0xF9, 0x11, 0xE0, 0xEB, 0xF8, 0x27, 0xE1, 0x0E, 0x00, + 0xF4, 0xE9, 0x4D, 0x0C, 0xB9, 0xF0, 0x31, 0x16, 0x38, 0xFB, 0x27, 0x23, + 0x19, 0xFD, 0xF9, 0x24, 0xAB, 0xF7, 0x40, 0x19, 0xEB, 0x03, 0xB5, 0x18, + 0x96, 0x10, 0x75, 0x24, 0x30, 0x0B, 0x3E, 0x28, 0x2F, 0x01, 0xB4, 0x20, + 0xA7, 0xF0, 0xB6, 0x16, 0xE4, 0xE9, 0x65, 0x12, 0x77, 0x03, 0x79, 0x15, + 0xFA, 0x14, 0x6B, 0x10, 0x41, 0x07, 0xA7, 0x01, 0xB8, 0xFB, 0xAF, 0xFE, + 0x4C, 0xF5, 0x87, 0x03, 0xDE, 0xF2, 0xBF, 0x01, 0xEA, 0xEE, 0xB0, 0xEE, + 0xCE, 0xE8, 0xFF, 0xDB, 0xAA, 0xF8, 0xC1, 0xEC, 0x58, 0x13, 0x75, 0x04, + 0x61, 0x12, 0xA0, 0xFD, 0x79, 0xFD, 0xE1, 0xF3, 0xA1, 0xFF, 0x50, 0xFF, + 0xF6, 0x0D, 0xE1, 0x06, 0x7B, 0x19, 0x49, 0x00, 0x2B, 0x24, 0x0B, 0xF1, + 0x1E, 0x1D, 0x6C, 0xDE, 0xDF, 0x17, 0x79, 0xEB, 0xC9, 0x1D, 0xA5, 0x07, + 0x2A, 0x18, 0xD2, 0x05, 0x70, 0x06, 0xDA, 0xF9, 0xEF, 0xF9, 0x07, 0xF6, + 0x16, 0xF7, 0x12, 0xF6, 0x1B, 0xF2, 0xBD, 0xFA, 0x83, 0xF0, 0x94, 0x02, + 0x49, 0xF6, 0xFD, 0x02, 0x8B, 0xFF, 0x57, 0xFD, 0x7D, 0xFB, 0x55, 0xF6, + 0x3B, 0xE7, 0x92, 0xEF, 0x22, 0xDA, 0xE8, 0xF2, 0x7B, 0xDC, 0x33, 0xFC, + 0x8C, 0xE9, 0xD3, 0xFC, 0xEF, 0xF5, 0x21, 0xFB, 0xA6, 0xFC, 0x16, 0xFB, + 0x18, 0xF8, 0x7B, 0xF5, 0xFE, 0xDF, 0x71, 0xE8, 0x3E, 0xC8, 0x2F, 0xDD, + 0x23, 0xCB, 0xFA, 0xDA, 0x58, 0xE1, 0xB6, 0xDF, 0x9E, 0xED, 0x03, 0xE3, + 0xFB, 0xDF, 0xA5, 0xCA, 0x22, 0xCD, 0xE5, 0xB3, 0xDE, 0xC0, 0x98, 0xB3, + 0x16, 0xBC, 0x73, 0xB2, 0x24, 0xBA, 0x20, 0xB3, 0xBF, 0xB1, 0xFC, 0xB1, + 0x4D, 0xC0, 0xE1, 0xBC, 0x29, 0xD6, 0x5F, 0xC9, 0xC1, 0xDB, 0xB8, 0xD0, + 0x36, 0xDE, 0x4F, 0xDE, 0x9D, 0xD6, 0xB0, 0xE1, 0x37, 0xD4, 0x49, 0xDE, + 0x0B, 0xE7, 0x49, 0xE0, 0xEA, 0xFC, 0x55, 0xE2, 0x6E, 0x02, 0x16, 0xE0, + 0x76, 0x02, 0xD8, 0xE9, 0xBD, 0x08, 0xFD, 0xF6, 0xAF, 0x11, 0xBD, 0xFB, + 0x9B, 0x1C, 0xF1, 0x00, 0xBF, 0x1D, 0x37, 0x01, 0x57, 0x17, 0x3E, 0xFD, + 0x94, 0x1D, 0xD5, 0x0A, 0x85, 0x1E, 0x3E, 0x22, 0x85, 0x0F, 0x65, 0x29, + 0x3C, 0x05, 0x1D, 0x24, 0x21, 0xF5, 0x6A, 0x0F, 0x26, 0xE8, 0x88, 0xFD, + 0xB8, 0xF5, 0x7E, 0x08, 0xE7, 0x03, 0xB1, 0x16, 0x49, 0x0B, 0x67, 0x22, + 0x6D, 0x18, 0x3F, 0x2D, 0x62, 0x1F, 0xBC, 0x26, 0x7A, 0x0D, 0x50, 0x12, + 0x42, 0xF1, 0x79, 0x05, 0xB2, 0xED, 0xA6, 0x0B, 0x85, 0x05, 0xC0, 0x1D, + 0x4C, 0x1D, 0xFC, 0x27, 0x36, 0x2B, 0x03, 0x26, 0x93, 0x2F, 0xFE, 0x25, + 0xF0, 0x1E, 0xBA, 0x1E, 0xE7, 0x0B, 0x67, 0x10, 0x75, 0x0A, 0xD3, 0x0B, + 0x3E, 0x14, 0x67, 0x0F, 0x13, 0x17, 0x9C, 0x04, 0x9C, 0x08, 0x5C, 0xE5, + 0xD9, 0xFA, 0x00, 0xCC, 0x7D, 0xF6, 0x39, 0xC5, 0xC7, 0xF0, 0x28, 0xD2, + 0x48, 0xED, 0x21, 0xE2, 0xF9, 0xF0, 0x3F, 0xDF, 0xF9, 0xF6, 0x22, 0xD4, + 0x00, 0xFD, 0x94, 0xC9, 0xD7, 0xFB, 0xD6, 0xC6, 0x2E, 0xEE, 0x6D, 0xCB, + 0x1B, 0xE0, 0xEA, 0xCF, 0xAD, 0xDE, 0xED, 0xD4, 0x5F, 0xE9, 0x6F, 0xDB, + 0x8B, 0xF5, 0x96, 0xE5, 0x75, 0xF3, 0x01, 0xF0, 0xA1, 0xF2, 0x28, 0x04, + 0x26, 0x02, 0x9B, 0x1D, 0x4A, 0x0F, 0xCD, 0x26, 0xCF, 0x0F, 0x5B, 0x1F, + 0xEC, 0x06, 0xE7, 0x18, 0xEE, 0xFE, 0x94, 0x1D, 0x75, 0x02, 0x66, 0x2D, + 0x4C, 0x00, 0xCC, 0x35, 0xEC, 0xF2, 0x4B, 0x23, 0x96, 0xF2, 0x6C, 0x0C, + 0x74, 0xFD, 0xDA, 0x03, 0x86, 0x00, 0xB6, 0x05, 0x05, 0xF7, 0x79, 0x02, + 0x88, 0xF1, 0x65, 0xFD, 0x3F, 0xF7, 0xAB, 0x02, 0x43, 0xFB, 0x71, 0xFF, + 0x25, 0x00, 0xB5, 0xF4, 0x0D, 0x00, 0xB7, 0xEB, 0x83, 0xFF, 0x0D, 0xEC, + 0x13, 0x03, 0x0D, 0xF2, 0x09, 0xF8, 0x2B, 0xEA, 0x9C, 0xE6, 0xE2, 0xDD, + 0x25, 0xDA, 0x9E, 0xD1, 0x18, 0xD5, 0x67, 0xC8, 0x13, 0xDF, 0x6E, 0xD0, + 0x35, 0xEE, 0xC5, 0xD9, 0x61, 0xF5, 0xB5, 0xDE, 0x5E, 0xFE, 0x9D, 0xF1, + 0x9B, 0x09, 0x57, 0xFE, 0xF9, 0x11, 0x9C, 0xF1, 0x4A, 0x17, 0x0A, 0xE0, + 0x75, 0x11, 0xBF, 0xD9, 0x60, 0x09, 0x53, 0xD9, 0x3E, 0x0B, 0x52, 0xDE, + 0x70, 0x0F, 0x39, 0xEA, 0x43, 0x0E, 0x46, 0xF1, 0x08, 0x0F, 0xD6, 0xF7, + 0x0A, 0x15, 0xA2, 0x03, 0x0B, 0x13, 0x52, 0x09, 0xE7, 0x08, 0x37, 0x0B, + 0xDD, 0xFD, 0xAB, 0x0A, 0x39, 0xF2, 0xB4, 0x03, 0x00, 0xEF, 0x32, 0x03, + 0x45, 0xF0, 0x77, 0x02, 0x0E, 0xF1, 0xA7, 0x03, 0x1B, 0xF7, 0x7A, 0x15, + 0xC0, 0xF5, 0x88, 0x15, 0xD6, 0xFC, 0x1E, 0x0A, 0x46, 0x0A, 0xA0, 0x0C, + 0x9C, 0x02, 0xBF, 0x11, 0xA4, 0xFE, 0xCA, 0x21, 0x78, 0x0A, 0xB5, 0x35, + 0x01, 0x0C, 0xE2, 0x3A, 0x04, 0x06, 0x5F, 0x2E, 0x4B, 0x12, 0xEA, 0x26, + 0x96, 0x1F, 0xC6, 0x29, 0x5D, 0x21, 0x7D, 0x24, 0x45, 0x20, 0x9E, 0x21, + 0x42, 0x18, 0x6C, 0x26, 0x9F, 0x13, 0x2F, 0x2B, 0x98, 0x0F, 0x9D, 0x20, + 0xE8, 0x10, 0xB3, 0x14, 0x53, 0x16, 0xBF, 0x0C, 0xFC, 0x15, 0xAA, 0x01, + 0x14, 0x15, 0x83, 0x0C, 0xEF, 0x0D, 0x21, 0x1C, 0xE4, 0x09, 0xDC, 0x19, + 0x40, 0x0C, 0x44, 0x04, 0xB9, 0x12, 0xE0, 0xF1, 0x7E, 0x1A, 0x2C, 0xF8, + 0xB1, 0x19, 0xE7, 0xFA, 0x1C, 0x20, 0x56, 0xFA, 0x9E, 0x24, 0x69, 0xF6, + 0x0E, 0x15, 0xEF, 0xEB, 0x62, 0x0A, 0x19, 0xF1, 0x73, 0x06, 0x0F, 0xF9, + 0x75, 0xFD, 0xB6, 0xFC, 0x43, 0xFE, 0x9D, 0x0B, 0xC7, 0x06, 0xE5, 0x12, + 0x4C, 0x08, 0x46, 0x08, 0xD6, 0x06, 0xB2, 0x09, 0xD3, 0xFE, 0x2C, 0x0B, + 0xE8, 0xEA, 0xB3, 0x05, 0x65, 0xDC, 0x35, 0x0A, 0x48, 0xE7, 0xC2, 0x0A, + 0x06, 0xF8, 0xB5, 0x01, 0xCC, 0x04, 0x95, 0x03, 0x4C, 0x17, 0x0D, 0x12, + 0xC3, 0x1B, 0x5B, 0x17, 0xA0, 0x14, 0x26, 0x1B, 0xBF, 0x0E, 0x17, 0x1C, + 0x20, 0x07, 0xFA, 0x0F, 0x6B, 0x02, 0xB1, 0x04, 0xB3, 0x02, 0x11, 0xFE, + 0x7D, 0xFE, 0xB6, 0xF9, 0xA9, 0xED, 0x45, 0xF5, 0x0C, 0xE3, 0x91, 0xEC, + 0x81, 0xE1, 0x6F, 0xE4, 0x93, 0xD3, 0xBA, 0xE0, 0x2A, 0xC6, 0xF6, 0xD8, + 0x76, 0xCF, 0x40, 0xCE, 0x46, 0xE3, 0xAE, 0xD5, 0x44, 0xE3, 0xA1, 0xE8, + 0x71, 0xD7, 0x16, 0xF3, 0x0D, 0xD8, 0x9E, 0xF2, 0xEA, 0xE3, 0xCF, 0xE8, + 0x56, 0xF2, 0x65, 0xE3, 0x93, 0xEF, 0x36, 0xDE, 0x74, 0xEF, 0xA7, 0xE1, + 0x3A, 0x00, 0x41, 0xEE, 0xCE, 0x01, 0x5C, 0xF0, 0x60, 0xFE, 0x18, 0xF3, + 0xC1, 0x07, 0x8A, 0xF0, 0xBD, 0x1A, 0x6B, 0xF1, 0xBB, 0x26, 0xB7, 0xFE, + 0x4E, 0x24, 0xF4, 0x07, 0x05, 0x1E, 0x73, 0x12, 0x70, 0x19, 0x34, 0x21, + 0xB8, 0x18, 0xD8, 0x20, 0xD7, 0x0C, 0x05, 0x15, 0x18, 0xFA, 0xC7, 0x1D, + 0x5D, 0xFB, 0x6D, 0x2A, 0xCB, 0x05, 0x19, 0x20, 0x72, 0x0D, 0xC9, 0x1E, + 0x2E, 0x14, 0x6E, 0x29, 0x7D, 0x0A, 0x75, 0x26, 0xE7, 0x01, 0xB3, 0x2B, + 0xB5, 0x02, 0x55, 0x2D, 0xD9, 0xFA, 0x54, 0x1E, 0x06, 0xFD, 0x78, 0x1F, + 0x71, 0x11, 0x2F, 0x25, 0xB2, 0x24, 0xA9, 0x23, 0xDF, 0x24, 0xA9, 0x20, + 0x6A, 0x20, 0x5B, 0x24, 0x57, 0x2E, 0xF4, 0x37, 0xE2, 0x33, 0x13, 0x44, + 0xD7, 0x27, 0xF2, 0x3D, 0xDE, 0x27, 0x19, 0x2F, 0x07, 0x38, 0x6D, 0x20, + 0x99, 0x35, 0x1E, 0x12, 0x12, 0x23, 0x74, 0x14, 0xDF, 0x1C, 0xFB, 0x24, + 0x85, 0x1D, 0xA3, 0x1E, 0xFE, 0x26, 0xCF, 0x0D, 0xA2, 0x29, 0x2F, 0x0A, + 0x3F, 0x23, 0x56, 0x0D, 0x79, 0x28, 0x0B, 0x0B, 0x7A, 0x2B, 0x5B, 0x05, + 0x68, 0x23, 0x8C, 0x05, 0x27, 0x17, 0x7D, 0xFF, 0xBB, 0xFF, 0x85, 0xEB, + 0x71, 0xE8, 0x68, 0xE2, 0xCE, 0xE9, 0x7E, 0xEC, 0x50, 0xEA, 0x45, 0xF5, + 0xF0, 0xE6, 0x06, 0xFF, 0x1A, 0xF8, 0x5A, 0x09, 0xC7, 0x04, 0x60, 0x05, + 0xB0, 0xFB, 0x46, 0x02, 0x72, 0xEC, 0x45, 0x0A, 0x44, 0xDC, 0x7E, 0x07, + 0xBB, 0xD4, 0x99, 0xFC, 0xCF, 0xDB, 0x76, 0xF7, 0xB0, 0xE1, 0x84, 0xF2, + 0x6D, 0xE5, 0x95, 0xEF, 0x23, 0xE6, 0xD2, 0xEE, 0xB8, 0xDC, 0x64, 0xF1, + 0x04, 0xD3, 0x3B, 0xF5, 0x93, 0xD7, 0x46, 0xF3, 0x7B, 0xE5, 0xC1, 0xF4, + 0x1B, 0xEC, 0x7C, 0xFC, 0x35, 0xF4, 0x20, 0x02, 0xA6, 0xFD, 0x25, 0xFF, + 0x17, 0xFC, 0xC8, 0xFA, 0xB1, 0xF7, 0xA7, 0xFB, 0x45, 0xF6, 0x47, 0x01, + 0xF3, 0xF3, 0x62, 0xFD, 0xBF, 0xFF, 0x00, 0xF5, 0xE7, 0x0E, 0x68, 0xFB, + 0xC0, 0x02, 0x9A, 0x03, 0x79, 0xF9, 0xB9, 0x0B, 0x11, 0x01, 0x63, 0x0F, + 0xB7, 0x04, 0x36, 0x0D, 0x03, 0x02, 0x95, 0x02, 0xB5, 0x07, 0x51, 0xF4, + 0x8A, 0x18, 0x33, 0xF4, 0xC5, 0x1C, 0x58, 0xF4, 0x85, 0x19, 0xB9, 0xFB, + 0x5F, 0x1E, 0xED, 0x0A, 0xB7, 0x1F, 0xE2, 0x00, 0x20, 0x23, 0x3A, 0xF3, + 0xFC, 0x29, 0xE4, 0x01, 0x0E, 0x22, 0xA0, 0x11, 0x58, 0x1E, 0x90, 0x17, + 0x8F, 0x28, 0x17, 0x21, 0x01, 0x28, 0x59, 0x20, 0xCC, 0x1D, 0x14, 0x24, + 0x2F, 0x14, 0xD2, 0x33, 0xD8, 0x0A, 0x08, 0x2F, 0xFD, 0x08, 0xDE, 0x1F, + 0x6A, 0x0F, 0x20, 0x1D, 0x19, 0x0F, 0x5B, 0x18, 0xB8, 0x07, 0xD5, 0x0C, + 0x93, 0xFD, 0x3C, 0x0A, 0xF3, 0xF1, 0x04, 0x0D, 0x53, 0xED, 0xE5, 0x12, + 0x43, 0xEB, 0xC4, 0x10, 0xB5, 0xE6, 0x88, 0x02, 0xAA, 0xDC, 0x1B, 0xF5, + 0x4D, 0xDA, 0x99, 0xEC, 0x9F, 0xEB, 0x44, 0xF2, 0x70, 0xF2, 0xD3, 0xFA, + 0x03, 0xE8, 0x82, 0x05, 0x35, 0xEA, 0x20, 0x14, 0x7B, 0xFC, 0x1D, 0x0A, + 0x54, 0x06, 0xF9, 0xED, 0x54, 0x00, 0xC7, 0xEC, 0x3F, 0xF8, 0x1F, 0xFB, + 0xC2, 0xFC, 0x1B, 0xFB, 0xF4, 0x07, 0x8E, 0xFA, 0xF7, 0x0D, 0x2E, 0xFF, + 0x30, 0x11, 0x74, 0x03, 0xA4, 0x13, 0x2B, 0x07, 0xCF, 0x1D, 0xC6, 0x07, + 0xBE, 0x28, 0x46, 0x08, 0x90, 0x21, 0xFD, 0x08, 0x99, 0x18, 0x78, 0x08, + 0x6F, 0x16, 0x54, 0x03, 0xEB, 0x10, 0x25, 0xFB, 0x80, 0x13, 0x88, 0x04, + 0xE3, 0x17, 0x4A, 0x18, 0x2A, 0x1C, 0x45, 0x25, 0x72, 0x24, 0x93, 0x24, + 0xD3, 0x19, 0x12, 0x17, 0x6C, 0x04, 0xF8, 0x10, 0xF3, 0xFB, 0xC3, 0x10, + 0xA5, 0xF2, 0xD4, 0x0A, 0xAE, 0xE1, 0x0A, 0x04, 0xDB, 0xDA, 0xB6, 0xF6, + 0x93, 0xE7, 0xE3, 0xEA, 0x03, 0xEE, 0xDD, 0xE5, 0x4C, 0xF0, 0x53, 0xE9, + 0x5F, 0xF8, 0x11, 0xF4, 0xAB, 0xF0, 0x3B, 0xF2, 0x4C, 0xF2, 0x71, 0xEB, + 0x17, 0x06, 0x6A, 0xF1, 0xF9, 0x04, 0x96, 0xF6, 0xE1, 0xFA, 0xDF, 0xEF, + 0xF9, 0x02, 0xA9, 0xEB, 0xFF, 0x01, 0x02, 0xE9, 0x90, 0xE8, 0x4E, 0xE1, + 0x0D, 0xD4, 0xF9, 0xDE, 0x91, 0xD2, 0xAD, 0xDA, 0x14, 0xCF, 0x33, 0xC4, + 0xF2, 0xBB, 0x3B, 0xB3, 0x9C, 0xB0, 0x8B, 0xBB, 0x4E, 0xB8, 0x33, 0xC7, + 0xA3, 0xBA, 0xFC, 0xCA, 0xF1, 0xB6, 0xF1, 0xCE, 0xB4, 0xBB, 0x08, 0xC6, + 0xEC, 0xC8, 0x87, 0xB6, 0xC2, 0xDA, 0x59, 0xBB, 0x5A, 0xE6, 0xB4, 0xC9, + 0x85, 0xE9, 0x69, 0xD8, 0x50, 0xEA, 0xA5, 0xE1, 0xDA, 0xEC, 0x9C, 0xD6, + 0xD8, 0xF7, 0x5D, 0xCC, 0xC4, 0xF7, 0xEE, 0xD2, 0x93, 0xEC, 0x43, 0xDC, + 0xAF, 0xF0, 0xF4, 0xE4, 0xF9, 0xFA, 0x65, 0xEC, 0x3E, 0xFA, 0xD5, 0xF1, + 0x86, 0xF6, 0xEB, 0xFC, 0xE7, 0xFF, 0x60, 0x10, 0xBB, 0x04, 0x29, 0x19, + 0xC6, 0xFD, 0x4F, 0x13, 0xF5, 0x05, 0xAF, 0x18, 0xA2, 0x0F, 0x73, 0x1C, + 0x32, 0x0F, 0x8C, 0x1A, 0x8A, 0x0B, 0x71, 0x1D, 0x34, 0xFF, 0xAE, 0x1D, + 0x5C, 0x05, 0x73, 0x2B, 0x34, 0x1D, 0x3E, 0x3F, 0xDD, 0x1E, 0x91, 0x40, + 0x6A, 0x17, 0x40, 0x32, 0xAF, 0x18, 0xC6, 0x1D, 0x1A, 0x22, 0x59, 0x1C, + 0x44, 0x2A, 0x46, 0x27, 0xDD, 0x1A, 0x73, 0x20, 0x83, 0x10, 0x78, 0x1B, + 0x4A, 0x1E, 0x49, 0x14, 0xE8, 0x1E, 0x0E, 0x01, 0x33, 0x10, 0x3C, 0x00, + 0x74, 0x0C, 0x77, 0x02, 0x74, 0x11, 0xA3, 0xFB, 0x76, 0x11, 0xB9, 0xFF, + 0x13, 0x0E, 0xBE, 0xFC, 0x17, 0x05, 0xE1, 0xEB, 0x30, 0xFD, 0x89, 0xE6, + 0x05, 0x04, 0x78, 0xEB, 0xB5, 0x0B, 0x55, 0xED, 0x3A, 0x10, 0x2C, 0xEF, + 0x5F, 0x14, 0x74, 0xE9, 0x0C, 0x14, 0x79, 0xE2, 0x9D, 0x0F, 0x23, 0xE9, + 0x08, 0x07, 0x3B, 0xEF, 0x9F, 0x00, 0x0A, 0xF3, 0x22, 0x02, 0x7C, 0xFE, + 0x10, 0x0E, 0x55, 0x0C, 0x4B, 0x11, 0x59, 0x0E, 0x15, 0xFC, 0xBE, 0x02, + 0x3B, 0xE9, 0x83, 0x03, 0x61, 0xDF, 0x84, 0x09, 0x19, 0xCC, 0xA1, 0xFA, + 0x7D, 0xC1, 0xDD, 0xE8, 0x19, 0xCA, 0x2E, 0xE2, 0x83, 0xCE, 0x1B, 0xDF, + 0x08, 0xD3, 0x0C, 0xE1, 0x17, 0xE0, 0xA3, 0xE9, 0xC2, 0xE7, 0x9B, 0xF1, + 0xDE, 0xE4, 0xD9, 0xF2, 0xF1, 0xE0, 0xF4, 0xEE, 0x84, 0xE7, 0xEC, 0xF0, + 0x1B, 0xF3, 0x42, 0xF3, 0x5C, 0xFC, 0x6D, 0xED, 0x8C, 0xF5, 0x85, 0xEB, + 0x5B, 0xEA, 0x4A, 0xF3, 0xF0, 0xED, 0x2F, 0xF1, 0xAB, 0xF4, 0xF2, 0xE7, + 0x1A, 0xF6, 0x36, 0xEF, 0x85, 0xF5, 0xC3, 0xF1, 0xB3, 0xF6, 0x97, 0xE7, + 0x6B, 0xF0, 0x0C, 0xE8, 0x3F, 0xEE, 0xED, 0xF6, 0x51, 0xF3, 0x80, 0x03, + 0x0C, 0xF2, 0x2D, 0xFE, 0x5E, 0xF2, 0x69, 0xEA, 0x91, 0xF8, 0x5E, 0xE0, + 0xD6, 0xFB, 0xA7, 0xEB, 0x96, 0xF1, 0x63, 0xEE, 0x1B, 0xED, 0x0A, 0xE6, + 0x5E, 0xF5, 0xE5, 0xDD, 0xFC, 0xFA, 0xB7, 0xD7, 0xD2, 0xFE, 0xC2, 0xDB, + 0x75, 0x01, 0xF0, 0xDE, 0xAF, 0x04, 0xE5, 0xE0, 0xE9, 0x03, 0xF0, 0xE7, + 0x4C, 0x04, 0xF7, 0xEC, 0xBA, 0x0F, 0x93, 0xF5, 0x26, 0x11, 0xAF, 0x01, + 0x50, 0x00, 0xA1, 0x07, 0xA6, 0x04, 0xB5, 0x17, 0x5C, 0x1B, 0x16, 0x27, + 0x8B, 0x26, 0x3F, 0x2B, 0x6B, 0x28, 0x64, 0x30, 0x60, 0x1B, 0x01, 0x2C, + 0x1E, 0x06, 0xFF, 0x23, 0x43, 0x01, 0xA7, 0x29, 0x88, 0x05, 0xD4, 0x2E, + 0x30, 0x07, 0x44, 0x2B, 0xC2, 0x13, 0x5A, 0x2B, 0xAF, 0x21, 0xFA, 0x24, + 0xD9, 0x13, 0xE4, 0x12, 0xC5, 0x00, 0x6C, 0x11, 0x1B, 0x01, 0x2B, 0x1B, + 0xB3, 0x09, 0xB3, 0x14, 0x08, 0x12, 0x76, 0x0A, 0x6E, 0x15, 0x6D, 0x0D, + 0x30, 0x0E, 0x2E, 0x0A, 0xFC, 0x02, 0x33, 0xFB, 0x89, 0x03, 0x5A, 0xF7, + 0x10, 0x02, 0x20, 0xF7, 0x90, 0xF7, 0xF7, 0xED, 0xF7, 0xF2, 0x62, 0xE2, + 0xE1, 0xFA, 0xC2, 0xE2, 0x6B, 0x03, 0xE6, 0xEC, 0xA9, 0x08, 0x81, 0xF4, + 0x7A, 0x16, 0x7D, 0x00, 0x42, 0x1D, 0xE6, 0x06, 0xC2, 0x14, 0x63, 0xF8, + 0x74, 0x03, 0x1A, 0xE8, 0x9E, 0xF0, 0x7D, 0xE7, 0xF6, 0xED, 0x36, 0xF2, + 0x66, 0xF0, 0x81, 0xFA, 0x14, 0xF0, 0x85, 0xFD, 0xDB, 0xF4, 0x62, 0xFF, + 0xB6, 0xF7, 0x89, 0x08, 0x25, 0xF4, 0x8D, 0x15, 0xA7, 0xEF, 0x00, 0x14, + 0x83, 0xF1, 0xDB, 0x14, 0xFA, 0xF3, 0x43, 0x17, 0x94, 0xF1, 0xD3, 0x06, + 0xB1, 0xF5, 0x95, 0xFC, 0x66, 0xFD, 0x6D, 0x01, 0x72, 0xFE, 0x5C, 0x02, + 0x42, 0xF9, 0x65, 0xFF, 0xA4, 0xF1, 0x15, 0xFF, 0xAD, 0xF1, 0x85, 0x01, + 0xC2, 0xF7, 0xE3, 0xFE, 0x9B, 0x02, 0x24, 0xFA, 0x98, 0x12, 0x2F, 0x00, + 0x3C, 0x11, 0x79, 0x03, 0x1B, 0x07, 0x28, 0x00, 0x0E, 0x0C, 0x07, 0x03, + 0x03, 0x0A, 0x17, 0xFE, 0xBD, 0x00, 0xA6, 0xF4, 0xA5, 0x02, 0x69, 0xF1, + 0x62, 0x06, 0x39, 0xF1, 0x67, 0x02, 0x8F, 0xF6, 0xB9, 0xFE, 0xDA, 0x03, + 0x70, 0xFA, 0xC9, 0x0B, 0x9D, 0xF5, 0xAD, 0x04, 0x3B, 0xFD, 0x1C, 0xFE, + 0xC7, 0x04, 0x7B, 0xFE, 0x00, 0x00, 0xE4, 0xFF, 0x4E, 0xFD, 0x58, 0x01, + 0xEA, 0xFD, 0x05, 0xF9, 0xDC, 0xFA, 0x5E, 0xEB, 0x65, 0xFE, 0xDF, 0xE2, + 0x99, 0x00, 0x51, 0xD6, 0x17, 0xF8, 0xAB, 0xD2, 0x1A, 0xF3, 0xC4, 0xDE, + 0xED, 0xF6, 0xE0, 0xE0, 0x5C, 0xFC, 0xEC, 0xE1, 0xFD, 0xFB, 0x90, 0xF2, + 0xAF, 0xF2, 0xC5, 0xF7, 0xBD, 0xE5, 0x39, 0xF1, 0x92, 0xDE, 0x59, 0xF4, + 0x64, 0xE5, 0x79, 0x00, 0xED, 0xEF, 0x4D, 0x05, 0xE5, 0xF8, 0x0C, 0x00, + 0x2E, 0xFA, 0x60, 0xFD, 0xDF, 0xF0, 0x99, 0x01, 0xC0, 0xF3, 0x78, 0x0E, + 0xBF, 0xFF, 0xAD, 0x1A, 0x47, 0x09, 0x2A, 0x26, 0xF9, 0x14, 0x40, 0x28, + 0x4E, 0x21, 0x4F, 0x26, 0x3F, 0x26, 0x39, 0x38, 0x40, 0x24, 0x97, 0x47, + 0x1F, 0x23, 0xD1, 0x42, 0x47, 0x24, 0x18, 0x3D, 0x94, 0x27, 0x23, 0x3F, + 0x13, 0x2D, 0x46, 0x3A, 0x8D, 0x29, 0x56, 0x2C, 0x8A, 0x1E, 0x67, 0x22, + 0xD3, 0x21, 0x66, 0x1E, 0x49, 0x2E, 0xAF, 0x1D, 0xFD, 0x2A, 0x67, 0x1B, + 0xF1, 0x26, 0xB0, 0x1A, 0x0F, 0x26, 0x54, 0x15, 0xBE, 0x1D, 0xDA, 0x10, + 0x30, 0x28, 0x8C, 0x1A, 0x0C, 0x37, 0x40, 0x1D, 0xA0, 0x33, 0x4D, 0x12, + 0x65, 0x34, 0x72, 0x06, 0xAB, 0x30, 0xD4, 0xFC, 0x5E, 0x19, 0x60, 0xF9, + 0x60, 0x0E, 0xAD, 0x00, 0x66, 0x18, 0x87, 0x08, 0x31, 0x1E, 0x4A, 0x0E, + 0x25, 0x1D, 0x46, 0x12, 0x01, 0x1D, 0x00, 0x11, 0x9E, 0x1A, 0x07, 0x16, + 0x57, 0x11, 0x30, 0x1D, 0xF3, 0xFE, 0x87, 0x19, 0x7E, 0xEC, 0x94, 0x12, + 0xFE, 0xE8, 0x68, 0x0D, 0x0A, 0xEB, 0xEB, 0x06, 0xD0, 0xDE, 0x47, 0xFD, + 0x75, 0xD6, 0x0F, 0xF6, 0x19, 0xDA, 0x0C, 0xF0, 0x12, 0xCC, 0x24, 0xE6, + 0x6D, 0xC2, 0xB6, 0xE3, 0xBC, 0xCE, 0x11, 0xDF, 0x6A, 0xD3, 0xDA, 0xD4, + 0x31, 0xDC, 0xCB, 0xDB, 0x65, 0xEB, 0x53, 0xE4, 0xDA, 0xEC, 0xEE, 0xE1, + 0x99, 0xE8, 0x5F, 0xE3, 0x28, 0xE2, 0xAB, 0xDF, 0x2D, 0xE5, 0x78, 0xDF, + 0x02, 0xF0, 0x3C, 0xE7, 0x68, 0xE9, 0x13, 0xE3, 0xBC, 0xD8, 0xFB, 0xE2, + 0x28, 0xD4, 0xBD, 0xF2, 0x5A, 0xD6, 0x5D, 0xF7, 0x9A, 0xD5, 0x95, 0xEA, + 0x4B, 0xDD, 0x3E, 0xE8, 0x50, 0xED, 0x5B, 0xED, 0xB2, 0xFE, 0x8B, 0xF6, + 0x32, 0x01, 0x75, 0xFE, 0x45, 0xF7, 0x51, 0xF8, 0x80, 0xFE, 0x67, 0xF5, + 0x37, 0x09, 0xED, 0xF3, 0xB3, 0x0D, 0xFB, 0xEF, 0x3C, 0x12, 0xB3, 0xEB, + 0xA2, 0x16, 0xF8, 0xEB, 0x23, 0x1B, 0x37, 0xF8, 0x3B, 0x1E, 0xE5, 0x0A, + 0xA1, 0x19, 0x3A, 0x0E, 0x42, 0x14, 0x0A, 0x03, 0x45, 0x12, 0xC7, 0x0A, + 0x7D, 0x05, 0xB1, 0x19, 0xE0, 0x06, 0x25, 0x1D, 0xB5, 0x1A, 0x2F, 0x1B, + 0x7C, 0x1C, 0x27, 0x17, 0x28, 0x16, 0x34, 0x1A, 0xD8, 0x0F, 0x11, 0x1C, + 0x0D, 0x01, 0x01, 0x20, 0x00, 0xF7, 0x0A, 0x25, 0x93, 0xF9, 0xB0, 0x19, + 0xB7, 0x0A, 0x35, 0x17, 0x9C, 0x13, 0x4E, 0x1F, 0x03, 0x0E, 0xB5, 0x1B, + 0xBD, 0x0F, 0x98, 0x21, 0x6D, 0x13, 0x44, 0x2D, 0xB2, 0x1A, 0xA2, 0x2A, + 0x42, 0x25, 0x15, 0x27, 0x21, 0x25, 0xE4, 0x25, 0x60, 0x1E, 0xB5, 0x20, + 0x05, 0x15, 0x62, 0x14, 0xBD, 0x0F, 0xF2, 0x05, 0x0A, 0x14, 0xF3, 0x05, + 0x36, 0x11, 0x9B, 0x0D, 0xE1, 0x04, 0x55, 0x05, 0x8A, 0xFC, 0x56, 0xF2, + 0xF5, 0xF4, 0x07, 0xED, 0x7C, 0xEF, 0xDE, 0xF2, 0x93, 0xF3, 0x39, 0xF3, + 0xD7, 0x00, 0x13, 0xEF, 0xFB, 0x06, 0x49, 0xE6, 0x32, 0xFC, 0x5D, 0xDA, + 0xEE, 0xF8, 0x79, 0xDD, 0xE8, 0x04, 0x09, 0xED, 0xD7, 0x04, 0xB4, 0xF0, + 0x8E, 0xF4, 0x6D, 0xEC, 0x0B, 0xF7, 0x89, 0xFA, 0x8A, 0x0D, 0x47, 0x0B, + 0x93, 0x15, 0x8D, 0x0B, 0x8A, 0x08, 0xCA, 0x11, 0xA0, 0xF1, 0x83, 0x18, + 0xFF, 0xEE, 0xC0, 0x19, 0x53, 0xFF, 0xEF, 0x1F, 0x26, 0x06, 0x87, 0x25, + 0x44, 0x02, 0xFC, 0x22, 0xB4, 0xFC, 0xDA, 0x1A, 0x30, 0xFD, 0x04, 0x12, + 0x8E, 0xFE, 0x8B, 0x09, 0x54, 0xFB, 0xE1, 0x07, 0x67, 0xF9, 0x51, 0x0A, + 0x4A, 0x00, 0x10, 0x0A, 0x69, 0x0E, 0x92, 0x0B, 0x94, 0x11, 0x50, 0x09, + 0x08, 0x07, 0x57, 0x05, 0x46, 0xFF, 0x86, 0x08, 0x8A, 0xFE, 0xEF, 0x00, + 0xAC, 0xF6, 0xFE, 0xEC, 0x62, 0xEA, 0xAC, 0xE2, 0x53, 0xEC, 0x11, 0xE5, + 0x42, 0xF5, 0x71, 0xE7, 0xB6, 0xED, 0x7C, 0xE1, 0x5F, 0xDD, 0xB4, 0xDE, + 0xB7, 0xE2, 0x8F, 0xE3, 0xDD, 0xF1, 0x05, 0xE3, 0xDA, 0xF2, 0x4D, 0xDD, + 0xC8, 0xF0, 0x89, 0xE5, 0x1C, 0xF7, 0xE3, 0xF1, 0x48, 0xFB, 0x31, 0xF0, + 0xD4, 0xF8, 0xC1, 0xEF, 0xD1, 0xEF, 0xBA, 0xEC, 0x9A, 0xEC, 0x93, 0xE1, + 0x0F, 0xF8, 0xC0, 0xD7, 0x63, 0xFD, 0xBF, 0xD5, 0xEE, 0xF9, 0x54, 0xDE, + 0xD4, 0xFB, 0xDF, 0xE8, 0xDC, 0x09, 0x18, 0xEC, 0xAC, 0x13, 0xC3, 0xEE, + 0x31, 0x06, 0x8F, 0xF4, 0x6C, 0xF0, 0x27, 0xF8, 0x76, 0xEB, 0xA9, 0xFD, + 0x1E, 0xF8, 0x76, 0xFC, 0xBD, 0xFE, 0x63, 0xF6, 0x36, 0xFB, 0xF8, 0xFB, + 0xAC, 0xF7, 0x44, 0x04, 0x63, 0xED, 0x6C, 0x04, 0xF7, 0xE7, 0x56, 0x04, + 0xAB, 0xEC, 0x0B, 0x04, 0xD5, 0xF5, 0x21, 0x08, 0x3E, 0x04, 0x43, 0x11, + 0x33, 0x0A, 0xDF, 0x13, 0xFE, 0xFC, 0xDE, 0x10, 0x78, 0xF5, 0x3B, 0x12, + 0x39, 0x03, 0x58, 0x16, 0x9C, 0x0D, 0xD9, 0x1F, 0xB0, 0x0A, 0xF9, 0x23, + 0xFF, 0x02, 0xFC, 0x15, 0x9F, 0x06, 0x56, 0x12, 0x6B, 0x16, 0x7B, 0x18, + 0x32, 0x17, 0x17, 0x12, 0xB4, 0x05, 0x28, 0x05, 0xCA, 0xFE, 0xC3, 0xFA, + 0x59, 0xFC, 0xAC, 0xF3, 0x6C, 0xF1, 0x72, 0xEF, 0x1F, 0xEE, 0x84, 0xEC, + 0x00, 0xFB, 0xCB, 0xE9, 0x71, 0x13, 0x2E, 0xEF, 0x9C, 0x23, 0x4B, 0xF5, + 0x38, 0x1E, 0x38, 0xF1, 0x6F, 0x18, 0x72, 0xEC, 0xF9, 0x1A, 0xF0, 0xEA, + 0xA3, 0x0E, 0xA9, 0xEC, 0x70, 0x00, 0xC0, 0xF5, 0xAA, 0x08, 0xFC, 0xFD, + 0x45, 0x13, 0xE0, 0x01, 0x63, 0x12, 0xCA, 0x05, 0x91, 0x00, 0x60, 0x07, + 0xC6, 0xE3, 0xAE, 0xFC, 0x73, 0xE1, 0xF4, 0xF3, 0x56, 0xF2, 0xC0, 0xFB, + 0x5D, 0xFC, 0x16, 0x09, 0xF8, 0x02, 0x01, 0x16, 0xCE, 0xF2, 0x0E, 0x11, + 0x6D, 0xE7, 0xE9, 0x01, 0xF3, 0xEF, 0xD0, 0xFD, 0x08, 0xEA, 0x50, 0x01, + 0x55, 0xE8, 0x47, 0x02, 0x99, 0xF1, 0xE8, 0xF5, 0xBD, 0xF3, 0xC3, 0xEC, + 0x4F, 0xF3, 0x74, 0xF4, 0xBD, 0xF5, 0x4B, 0xF6, 0xEC, 0xF3, 0x28, 0xF2, + 0xCD, 0xF1, 0x31, 0xF4, 0x03, 0xF7, 0x59, 0xF4, 0xA7, 0xF3, 0x6D, 0xEA, + 0x31, 0xEA, 0xB2, 0xD6, 0x5B, 0xE4, 0xFB, 0xCC, 0xFF, 0xD9, 0x72, 0xD6, + 0xCF, 0xD1, 0x87, 0xD3, 0x50, 0xD0, 0xE7, 0xCD, 0x5C, 0xCB, 0xD7, 0xCF, + 0x6B, 0xCD, 0xDE, 0xD1, 0x79, 0xD4, 0x77, 0xD4, 0xD6, 0xD3, 0xEB, 0xD2, + 0x24, 0xCE, 0x83, 0xD2, 0xC9, 0xC7, 0x42, 0xD7, 0xFB, 0xC3, 0x55, 0xD8, + 0xCC, 0xCE, 0x14, 0xC9, 0x9E, 0xEC, 0x44, 0xC1, 0x8D, 0xF7, 0x5A, 0xC9, + 0x1D, 0xF9, 0x21, 0xDE, 0x56, 0x0C, 0x2D, 0xEC, 0x79, 0x17, 0x07, 0xE3, + 0x57, 0x0A, 0x72, 0xE0, 0xD7, 0x00, 0xAF, 0xFA, 0x99, 0x04, 0x01, 0x13, + 0x54, 0x0A, 0x2C, 0x14, 0x77, 0x0F, 0xC9, 0x11, 0xE7, 0x11, 0xE4, 0x14, + 0x01, 0x17, 0xDA, 0x1E, 0x16, 0x0F, 0x7A, 0x1E, 0xF7, 0xFE, 0xA9, 0x13, + 0x26, 0xFB, 0xB6, 0x17, 0x47, 0xFE, 0x51, 0x20, 0xEA, 0x09, 0xF6, 0x21, + 0x8B, 0x19, 0xBB, 0x2A, 0xE9, 0x1F, 0x45, 0x33, 0x55, 0x18, 0x06, 0x2B, + 0xD4, 0x13, 0x5A, 0x25, 0x20, 0x26, 0x6C, 0x2F, 0x41, 0x32, 0xAE, 0x38, + 0xE8, 0x2C, 0x17, 0x39, 0x54, 0x2F, 0xBB, 0x3A, 0x61, 0x2B, 0x5C, 0x2D, + 0x68, 0x21, 0xAC, 0x18, 0xAD, 0x27, 0xCE, 0x1A, 0xE9, 0x33, 0x35, 0x18, + 0x70, 0x27, 0x82, 0x05, 0xAD, 0x14, 0x99, 0xFE, 0x08, 0x12, 0x4F, 0x03, + 0x57, 0x0D, 0xE6, 0x03, 0x39, 0x10, 0x74, 0x02, 0x4B, 0x13, 0x67, 0xFA, + 0x5E, 0x05, 0xA4, 0xED, 0xC5, 0x0A, 0xC9, 0xF6, 0xDA, 0x1B, 0x24, 0xFB, + 0x14, 0x06, 0x1C, 0xE3, 0x26, 0xE3, 0x74, 0xD3, 0x73, 0xD5, 0xFD, 0xCF, + 0x39, 0xE7, 0x86, 0xD6, 0x90, 0xFC, 0xDF, 0xDE, 0x0C, 0xFB, 0x3B, 0xE3, + 0xF6, 0xE9, 0x64, 0xE9, 0xBE, 0xE8, 0x9C, 0xF6, 0x1B, 0xF0, 0xE0, 0xF9, + 0xCD, 0xE5, 0xA0, 0xF0, 0x0A, 0xDF, 0xA2, 0xF8, 0x54, 0xE6, 0xC3, 0x06, + 0x57, 0xEF, 0x0A, 0x09, 0x83, 0xEB, 0x7A, 0x03, 0xBC, 0xE8, 0xBB, 0x0C, + 0xC7, 0xE2, 0xCE, 0x10, 0xAB, 0xE3, 0xDA, 0x04, 0x8C, 0xEF, 0xED, 0x03, + 0x93, 0xF2, 0x65, 0x05, 0x15, 0xF7, 0x9D, 0x04, 0x76, 0x06, 0xEB, 0x10, + 0x09, 0x18, 0x2E, 0x23, 0x63, 0x1B, 0xF8, 0x24, 0x14, 0x14, 0x79, 0x1B, + 0x70, 0x12, 0x0E, 0x11, 0x1F, 0x09, 0x99, 0x02, 0x1F, 0x01, 0xF5, 0xF7, + 0x28, 0x0E, 0x78, 0x01, 0xB5, 0x09, 0x44, 0x08, 0x03, 0xFF, 0xA9, 0x03, + 0x0C, 0xF9, 0x50, 0xF7, 0x69, 0xF4, 0x7F, 0xEC, 0x35, 0xFD, 0x9E, 0xEE, + 0x62, 0x0A, 0xDF, 0xEE, 0xC5, 0x04, 0x33, 0xF1, 0xFE, 0xF0, 0xF8, 0xF5, + 0xFD, 0xF7, 0x02, 0xEE, 0x56, 0xFD, 0x0F, 0xDC, 0xC7, 0xF7, 0x5D, 0xD7, + 0x22, 0xF4, 0x87, 0xDD, 0x33, 0xEE, 0xA8, 0xDC, 0x86, 0xFC, 0x52, 0xE1, + 0xE0, 0x17, 0x2D, 0xEC, 0xED, 0x0F, 0xF0, 0xE6, 0x3F, 0xEA, 0x76, 0xD9, + 0xDB, 0xDA, 0xE4, 0xD9, 0x89, 0xEE, 0x4C, 0xEF, 0x21, 0xFE, 0xD3, 0xF8, + 0x7B, 0xFD, 0xFB, 0xF1, 0xF3, 0x03, 0x0C, 0xFC, 0xB8, 0x0B, 0x81, 0x0E, + 0xC5, 0x04, 0x49, 0x10, 0xB6, 0xF3, 0x05, 0x01, 0x7C, 0xE7, 0x60, 0xF9, + 0x7E, 0xF0, 0x60, 0x07, 0x24, 0x04, 0x90, 0x1C, 0x88, 0x0B, 0x4D, 0x28, + 0xB5, 0x0B, 0xEE, 0x28, 0xFF, 0x01, 0x18, 0x20, 0x3A, 0xFF, 0x26, 0x21, + 0x92, 0x08, 0x40, 0x29, 0x16, 0x09, 0x89, 0x21, 0xCD, 0xFE, 0x26, 0x1E, + 0xE0, 0xFC, 0xCA, 0x21, 0x02, 0x17, 0x90, 0x25, 0x6C, 0x21, 0xD1, 0x22, + 0x51, 0x17, 0xBD, 0x17, 0x41, 0x15, 0xDA, 0x0F, 0xA7, 0x08, 0x05, 0x09, + 0x37, 0x09, 0xE8, 0x10, 0xE4, 0x1E, 0xB7, 0x1B, 0x37, 0x2D, 0x08, 0x1D, + 0x03, 0x27, 0xF8, 0x1E, 0x4C, 0x1B, 0x67, 0x1A, 0x10, 0x23, 0x58, 0x10, + 0xAC, 0x39, 0x14, 0x0F, 0x6B, 0x41, 0xC0, 0x14, 0x30, 0x2F, 0x3F, 0x13, + 0x26, 0x24, 0x2F, 0x0C, 0xD8, 0x24, 0x97, 0x00, 0x37, 0x23, 0x02, 0x00, + 0x62, 0x1E, 0x3C, 0x0F, 0xD4, 0x0F, 0x93, 0x10, 0xE9, 0xF7, 0x02, 0xFA, + 0x27, 0xF9, 0x53, 0xFF, 0x1A, 0x13, 0x42, 0x2C, 0x8F, 0x0F, 0xB4, 0x2B, + 0xA3, 0xF2, 0xFE, 0x09, 0x02, 0xE5, 0xD1, 0x01, 0x4F, 0xE2, 0x6F, 0x03, + 0x67, 0xE5, 0x44, 0x04, 0xD4, 0xE8, 0x9F, 0xFE, 0x65, 0xE9, 0x6F, 0xF7, + 0x74, 0xF1, 0x96, 0xF7, 0x77, 0xFF, 0xD3, 0xFC, 0x5B, 0x09, 0xAB, 0x00, + 0x01, 0x00, 0x52, 0xFA, 0xB9, 0x00, 0x86, 0xFF, 0x17, 0x15, 0x0D, 0x18, + 0x0C, 0x1C, 0xE7, 0x24, 0x36, 0x1D, 0xD3, 0x1E, 0x68, 0x11, 0x78, 0x0C, + 0x50, 0xFA, 0x5A, 0xFA, 0xC6, 0xF5, 0xE6, 0xF0, 0xFF, 0xED, 0xC0, 0xE7, + 0x77, 0xE1, 0x2D, 0xEA, 0x0F, 0xE3, 0x05, 0xF8, 0x68, 0xEC, 0x0E, 0xF7, + 0x52, 0xF7, 0x0E, 0xEF, 0x3A, 0xF9, 0xCC, 0xEE, 0x1A, 0xE9, 0xA3, 0xF5, + 0x46, 0xD8, 0xD3, 0xF4, 0x16, 0xE6, 0x77, 0xE9, 0xA0, 0xF5, 0x97, 0xE7, + 0xDD, 0xF1, 0x10, 0xEA, 0x61, 0xF5, 0x2E, 0xF2, 0x83, 0xFD, 0x57, 0xF0, + 0x87, 0x01, 0x35, 0xDE, 0x54, 0x0B, 0x2D, 0xD9, 0x07, 0x16, 0xAD, 0xE6, + 0x1A, 0x12, 0x2C, 0xF5, 0x34, 0x01, 0xE9, 0xF2, 0x23, 0xF3, 0x64, 0xEC, + 0xBD, 0xF0, 0x2F, 0xEE, 0xFB, 0xF7, 0xAD, 0xF9, 0x10, 0x01, 0x9D, 0x03, + 0x5E, 0x03, 0x2D, 0x07, 0x92, 0x04, 0xAB, 0x12, 0x78, 0x0E, 0x1D, 0x29, + 0xAB, 0x0A, 0x5E, 0x2A, 0xB3, 0xF5, 0x79, 0x14, 0xA2, 0xEF, 0xCE, 0x0D, + 0x48, 0xFA, 0x4C, 0x1D, 0x22, 0x08, 0x82, 0x2C, 0x63, 0x08, 0xA0, 0x22, + 0xDC, 0x02, 0xBD, 0x13, 0x88, 0x0C, 0x1A, 0x1A, 0x82, 0x1A, 0x2F, 0x2A, + 0x96, 0x18, 0x66, 0x31, 0xBE, 0x0E, 0xFF, 0x26, 0x2F, 0x12, 0x13, 0x1B, + 0x52, 0x28, 0x7D, 0x28, 0xE8, 0x3F, 0x45, 0x37, 0x4C, 0x3F, 0xA4, 0x31, + 0x7D, 0x27, 0xD5, 0x2C, 0xD6, 0x18, 0xCB, 0x27, 0xC3, 0x21, 0xC1, 0x17, + 0xF8, 0x18, 0xBE, 0x02, 0xD5, 0x0E, 0x61, 0x05, 0x01, 0x20, 0x0C, 0x17, + 0xB9, 0x32, 0xE8, 0x18, 0x83, 0x3F, 0x4B, 0x19, 0x90, 0x39, 0xCA, 0x16, + 0xCA, 0x27, 0xF4, 0x0B, 0x66, 0x17, 0x49, 0xFF, 0xB7, 0x18, 0x0A, 0xF8, + 0x72, 0x27, 0xC1, 0xFE, 0x29, 0x2A, 0xDF, 0x0A, 0x45, 0x20, 0x09, 0x12, + 0x8C, 0x0F, 0x7A, 0x0E, 0x9E, 0xFF, 0xE5, 0x02, 0xD8, 0xF5, 0x2C, 0xFE, + 0x5E, 0xFF, 0x00, 0x0C, 0xE5, 0x00, 0x87, 0x14, 0xFB, 0xED, 0xD2, 0x04, + 0x51, 0xE3, 0xA8, 0xFC, 0xC1, 0xD6, 0x51, 0xFF, 0x8D, 0xCB, 0x11, 0xF9, + 0x36, 0xC2, 0x25, 0xE9, 0x57, 0xBB, 0x63, 0xDB, 0x05, 0xC6, 0x2F, 0xE1, + 0xDA, 0xDC, 0x63, 0xF7, 0x44, 0xDF, 0x22, 0xFA, 0xB6, 0xCA, 0x23, 0xDC, + 0xFF, 0xC4, 0xC4, 0xCC, 0x8B, 0xC7, 0xCD, 0xD9, 0x47, 0xD7, 0xA6, 0xE8, + 0x65, 0xEC, 0x7D, 0xEA, 0x8D, 0xE6, 0xEF, 0xD9, 0xA2, 0xE3, 0x0D, 0xD2, + 0x9A, 0xF6, 0xC3, 0xE7, 0x96, 0xF1, 0x0B, 0xF1, 0x37, 0xD6, 0xE6, 0xDB, + 0xC8, 0xD6, 0xF7, 0xD1, 0xD2, 0xF4, 0xDC, 0xE9, 0xDE, 0x09, 0xEF, 0x06, + 0xAD, 0x0C, 0xC6, 0x0D, 0x6C, 0x04, 0x50, 0x06, 0x8D, 0xF8, 0xCF, 0x00, + 0xD8, 0xF1, 0x2C, 0xFB, 0xC2, 0xEF, 0x7E, 0xF0, 0x9F, 0xF6, 0xE3, 0xF0, + 0xE8, 0x01, 0xEA, 0xF1, 0x5F, 0x17, 0x6A, 0xF1, 0xB7, 0x2C, 0xB0, 0xF4, + 0x4A, 0x28, 0xCA, 0xF2, 0x03, 0x16, 0x06, 0xF7, 0xE0, 0x05, 0xF9, 0xF6, + 0xCC, 0x04, 0x5F, 0xF3, 0xCB, 0x0C, 0xE5, 0xF7, 0x6A, 0x10, 0x0B, 0x03, + 0xF0, 0x15, 0x88, 0x0E, 0xB4, 0x17, 0xEC, 0x14, 0x0B, 0x16, 0x2D, 0x16, + 0xC4, 0x11, 0x5C, 0x0F, 0x6E, 0x13, 0xFF, 0x15, 0x38, 0x1A, 0xD6, 0x22, + 0xF2, 0x12, 0x15, 0x1A, 0x06, 0x06, 0x5D, 0x12, 0x83, 0xF6, 0x3F, 0x16, + 0x07, 0xEC, 0x97, 0x0C, 0xDB, 0xF0, 0x0A, 0x02, 0x14, 0xF9, 0xF8, 0x07, + 0xBF, 0xED, 0x5D, 0x09, 0xAC, 0xEB, 0x38, 0x16, 0x57, 0xF9, 0xC4, 0x25, + 0x6A, 0xEF, 0x75, 0x10, 0xFC, 0xE4, 0x67, 0xED, 0xEA, 0xED, 0x96, 0xE5, + 0x8A, 0xF8, 0x3C, 0xF5, 0xA1, 0xF4, 0x3B, 0xF7, 0xE0, 0xE7, 0xBD, 0xE8, + 0x1C, 0xE5, 0xFA, 0xE1, 0xCA, 0xED, 0x54, 0xE8, 0xA1, 0xF9, 0xD3, 0xEE, + 0x50, 0x00, 0xD7, 0xED, 0xDE, 0x04, 0x64, 0xF2, 0x73, 0x1B, 0x45, 0x09, + 0xDE, 0x2B, 0x12, 0x16, 0xDD, 0x1F, 0xE1, 0x0B, 0xCC, 0x13, 0x68, 0x08, + 0x38, 0x12, 0xD3, 0x03, 0xE6, 0x09, 0xA8, 0xF2, 0x79, 0x0B, 0xA0, 0xF5, + 0xA7, 0x10, 0xDD, 0xFA, 0xC6, 0x04, 0x28, 0xF5, 0x0A, 0x0B, 0x09, 0x0D, + 0x46, 0x27, 0xB4, 0x32, 0x04, 0x2D, 0xC0, 0x37, 0xA1, 0x16, 0x9C, 0x29, + 0x12, 0x0B, 0x6A, 0x26, 0x61, 0x0D, 0x2D, 0x2D, 0xF6, 0x04, 0xA6, 0x2B, + 0x51, 0xFA, 0xE9, 0x1E, 0x1D, 0xFF, 0x7C, 0x1C, 0xAA, 0x04, 0xC2, 0x1C, + 0xAF, 0xF8, 0x81, 0x0E, 0xF3, 0xE9, 0x29, 0xF7, 0xBD, 0xF8, 0x72, 0xF6, + 0xE5, 0x03, 0x8A, 0xFA, 0xB7, 0xF5, 0x73, 0xF0, 0x51, 0xF6, 0x37, 0xF4, + 0xB2, 0xF7, 0xFF, 0xF0, 0xDA, 0xEB, 0x0A, 0xDE, 0x6D, 0xEA, 0xF8, 0xD8, + 0x79, 0xED, 0x01, 0xD9, 0xBD, 0xE2, 0x7F, 0xCA, 0x8D, 0xE0, 0x53, 0xD3, + 0xFC, 0xDF, 0xB4, 0xE5, 0x80, 0xCD, 0x93, 0xCF, 0x23, 0xBE, 0x6A, 0xB1, + 0x0C, 0xC2, 0x42, 0xBA, 0x56, 0xCE, 0xCA, 0xCF, 0xAD, 0xCE, 0xF5, 0xCB, + 0x0D, 0xCF, 0xE2, 0xC5, 0xCC, 0xCE, 0xD5, 0xC3, 0xB6, 0xCD, 0x3A, 0xCF, + 0x96, 0xD9, 0x2C, 0xE3, 0x95, 0xDE, 0x43, 0xD1, 0x44, 0xE4, 0x00, 0xBC, + 0xC4, 0xFF, 0x34, 0xD2, 0xB1, 0x12, 0xF3, 0xF0, 0x78, 0x0F, 0x79, 0xFB, + 0xD4, 0x05, 0x98, 0xF8, 0x2E, 0xFE, 0x11, 0xF5, 0x9D, 0xF8, 0x14, 0xF5, + 0xF9, 0xF9, 0x04, 0xF4, 0xD4, 0x06, 0xDC, 0xF2, 0xC9, 0x05, 0x5D, 0xF4, + 0xBE, 0x04, 0x52, 0x03, 0x28, 0x0B, 0x86, 0x18, 0xEA, 0x06, 0x85, 0x16, + 0x8A, 0x02, 0xB6, 0x08, 0x4E, 0xF8, 0x31, 0x0D, 0x89, 0xF3, 0x77, 0x1E, + 0x37, 0xFE, 0x97, 0x27, 0x04, 0x0B, 0xAB, 0x25, 0xE3, 0x11, 0xC1, 0x26, + 0xCF, 0x12, 0x1E, 0x2B, 0x30, 0x17, 0xA6, 0x2D, 0xA2, 0x16, 0x4D, 0x2F, + 0x77, 0x11, 0x5C, 0x2F, 0x98, 0x22, 0x39, 0x39, 0xF2, 0x38, 0x03, 0x3B, + 0xDD, 0x2F, 0xED, 0x23, 0x3E, 0x20, 0xA2, 0x14, 0x3B, 0x17, 0xF6, 0x10, + 0xC7, 0x01, 0xC7, 0x08, 0x62, 0xF7, 0x51, 0xFD, 0x90, 0xF8, 0x8C, 0xE7, + 0x54, 0xF8, 0xAE, 0xE4, 0x13, 0x14, 0xCC, 0x09, 0x75, 0x1E, 0xB7, 0x0B, + 0x2D, 0x00, 0x9D, 0xE8, 0xDC, 0xF6, 0x2E, 0xE3, 0x40, 0x02, 0x6F, 0xED, + 0x16, 0x09, 0x48, 0xED, 0x72, 0x0A, 0xD8, 0xDF, 0xA3, 0x07, 0xC6, 0xD8, + 0x58, 0x0B, 0xF0, 0xE5, 0x7D, 0x1A, 0xDD, 0xF6, 0x2D, 0x1C, 0xA1, 0xF9, + 0xB1, 0x0E, 0x58, 0xFB, 0xAE, 0x11, 0xDE, 0x0E, 0x58, 0x22, 0x81, 0x26, + 0xEF, 0x31, 0x1B, 0x38, 0x32, 0x2F, 0x72, 0x36, 0x73, 0x16, 0x5C, 0x2C, + 0x48, 0xFE, 0xAC, 0x26, 0xBD, 0xF2, 0x2A, 0x15, 0x03, 0xF0, 0x97, 0xFF, + 0xD8, 0xDE, 0x9F, 0xF2, 0xEA, 0xD1, 0x9B, 0xF7, 0xF6, 0xE8, 0x4A, 0x04, + 0xB9, 0xFA, 0x25, 0xFF, 0x88, 0xE4, 0xFF, 0xEB, 0x25, 0xD5, 0x2D, 0xEC, + 0xF6, 0xE5, 0x0E, 0xFA, 0x2D, 0xE9, 0x5C, 0xF9, 0x6D, 0xE5, 0x68, 0xF6, + 0x00, 0xF7, 0xD6, 0xFA, 0x2C, 0xFA, 0xAD, 0xF8, 0xC4, 0xFA, 0xD1, 0xF5, + 0xA9, 0xFB, 0xAA, 0xF3, 0x3E, 0xE4, 0x44, 0xE4, 0xD9, 0xE2, 0x20, 0xDF, + 0x2F, 0xEE, 0x76, 0xE3, 0xAA, 0xE0, 0xD4, 0xD7, 0x7D, 0xD5, 0xD5, 0xCD, + 0xDE, 0xCE, 0x8F, 0xC9, 0xBA, 0xC7, 0xA1, 0xC6, 0x8B, 0xCE, 0xC2, 0xD0, + 0x63, 0xC7, 0x12, 0xD3, 0x48, 0xB6, 0x29, 0xCE, 0x42, 0xD5, 0x61, 0xDD, + 0x08, 0xF5, 0xB4, 0xDD, 0x9D, 0xE3, 0x1D, 0xC4, 0x2B, 0xE3, 0xDA, 0xBE, + 0xFA, 0xF6, 0xFE, 0xCB, 0x26, 0xFD, 0xF0, 0xDC, 0x91, 0x03, 0x1C, 0xED, + 0x59, 0x01, 0xA8, 0xEC, 0xDE, 0xFD, 0xEF, 0xE4, 0xE8, 0x17, 0xB8, 0xF7, + 0x8E, 0x2F, 0x0A, 0x12, 0x57, 0x1F, 0x2C, 0x0F, 0x50, 0x05, 0xA3, 0x07, + 0xD1, 0x18, 0xC5, 0x16, 0x6C, 0x33, 0x80, 0x28, 0xA3, 0x21, 0xC6, 0x2B, + 0x0C, 0x19, 0xCB, 0x34, 0x45, 0x1A, 0xAF, 0x38, 0x4A, 0x08, 0xC7, 0x20, + 0xEA, 0x04, 0x16, 0x14, 0x13, 0x09, 0x1A, 0x15, 0x7A, 0xFC, 0x88, 0x0E, + 0x03, 0x06, 0xA3, 0x23, 0xDB, 0x1E, 0x4E, 0x44, 0xB3, 0x18, 0x06, 0x3E, + 0x21, 0x13, 0xA6, 0x26, 0x89, 0x21, 0x79, 0x26, 0x3E, 0x20, 0x7E, 0x29, + 0x5C, 0x18, 0xE2, 0x1F, 0x4C, 0x1F, 0x54, 0x26, 0x0F, 0x16, 0xE8, 0x26, + 0xF6, 0x06, 0x75, 0x0E, 0x1F, 0x04, 0xE8, 0xFB, 0xC1, 0xFF, 0xEF, 0xF1, + 0xAB, 0x0C, 0x11, 0xF5, 0x88, 0x1C, 0x4D, 0x05, 0x43, 0x13, 0x66, 0x04, + 0x33, 0x06, 0x45, 0xF3, 0x05, 0x00, 0x30, 0xE8, 0x25, 0xF8, 0x4E, 0xE6, + 0xDC, 0x01, 0x9D, 0xEE, 0xFA, 0x07, 0x1C, 0xE5, 0x38, 0xFA, 0x49, 0xD4, + 0x1D, 0x06, 0x4C, 0xEE, 0x99, 0x15, 0xE8, 0x0C, 0x47, 0xF6, 0x16, 0xF8, + 0x42, 0xDA, 0x86, 0xD9, 0xD5, 0xEA, 0xE6, 0xE7, 0x67, 0xF6, 0x2C, 0x05, + 0x16, 0xF5, 0x7F, 0x16, 0xBC, 0xFB, 0x4C, 0x18, 0x2B, 0xF7, 0xD2, 0x0A, + 0x75, 0xEA, 0x20, 0x08, 0xB0, 0xF0, 0x7A, 0x15, 0xE8, 0xFC, 0x01, 0x17, + 0x6D, 0xF9, 0x1B, 0x0C, 0x0C, 0xFB, 0xBC, 0x10, 0x51, 0x0D, 0xA9, 0x25, + 0xC0, 0x15, 0x90, 0x2C, 0xB2, 0x17, 0x30, 0x22, 0x2C, 0x11, 0xEC, 0x1C, + 0x2C, 0xF7, 0x23, 0x0B, 0xF0, 0xF9, 0x97, 0xFB, 0xB2, 0x0D, 0xEF, 0xFC, + 0x25, 0x06, 0xAF, 0xF0, 0x8D, 0x00, 0x29, 0xEE, 0xF9, 0x09, 0x08, 0xFC, + 0x39, 0x02, 0x15, 0xF4, 0x09, 0xF0, 0xDF, 0xE1, 0x8D, 0xE5, 0x80, 0xDE, + 0x1E, 0xDB, 0xB0, 0xDB, 0xB6, 0xE3, 0xBD, 0xD6, 0x28, 0xFB, 0xC5, 0xE5, + 0x3C, 0xFB, 0x83, 0xFB, 0xF2, 0xE8, 0xB0, 0xFA, 0xA7, 0xE0, 0xB3, 0xF0, + 0xB2, 0xE3, 0x03, 0xE7, 0x57, 0xEA, 0x78, 0xDC, 0x20, 0xF8, 0x10, 0xDC, + 0xB3, 0x0B, 0xBE, 0xE1, 0xE9, 0x0E, 0xA1, 0xE0, 0x9C, 0xFE, 0xF8, 0xDD, + 0x6E, 0xE4, 0x49, 0xDC, 0xBC, 0xD8, 0xE1, 0xD8, 0xD9, 0xEA, 0xE2, 0xD2, + 0x8A, 0xEC, 0x83, 0xC9, 0x83, 0xEA, 0x14, 0xE2, 0x8E, 0x03, 0x8B, 0x12, + 0x99, 0xF9, 0x10, 0x02, 0xCC, 0xD9, 0x75, 0xD1, 0xE0, 0xDA, 0x21, 0xDF, + 0x07, 0xE6, 0xBD, 0x01, 0xD9, 0xE7, 0xCB, 0x00, 0xD9, 0xEB, 0x56, 0x01, + 0x07, 0xF5, 0xF1, 0x12, 0x36, 0xF6, 0x25, 0x17, 0x3B, 0x06, 0x59, 0x19, + 0xC8, 0x15, 0x4B, 0x23, 0x8E, 0x03, 0x61, 0x22, 0xFA, 0xFC, 0x9B, 0x2A, + 0xE3, 0x1B, 0x37, 0x4D, 0x61, 0x3A, 0x91, 0x59, 0x89, 0x41, 0x85, 0x49, + 0x3E, 0x39, 0x1F, 0x44, 0x60, 0x29, 0xF2, 0x38, 0xB6, 0x22, 0x46, 0x25, + 0x39, 0x1A, 0x8E, 0x16, 0x2F, 0x06, 0x9A, 0x09, 0x59, 0x07, 0x0A, 0x0B, + 0xB4, 0x23, 0x60, 0x19, 0xAA, 0x32, 0xF7, 0x1F, 0x2F, 0x29, 0x62, 0x1D, + 0x78, 0x20, 0xCC, 0x1B, 0x4E, 0x21, 0xB8, 0x1D, 0x24, 0x23, 0x4A, 0x1D, + 0x29, 0x25, 0x65, 0x1D, 0xC9, 0x2F, 0x9A, 0x22, 0xCB, 0x35, 0x53, 0x1C, + 0xD0, 0x33, 0xB9, 0x0F, 0x75, 0x29, 0x5F, 0x0A, 0x57, 0x1E, 0x3C, 0x0B, + 0x55, 0x23, 0xA9, 0x10, 0xBC, 0x2A, 0x88, 0x10, 0x32, 0x1E, 0xEF, 0x05, + 0x8C, 0x0A, 0x94, 0x06, 0x5D, 0x04, 0x2B, 0x11, 0x23, 0xFD, 0x17, 0x09, + 0xB0, 0xF5, 0x5D, 0x03, 0xB7, 0xE0, 0xF0, 0xFB, 0x38, 0xD3, 0xBA, 0xF2, + 0x11, 0xF4, 0xAC, 0x0B, 0x7F, 0xF9, 0x15, 0x10, 0xD7, 0xCB, 0x6F, 0xE4, + 0xCA, 0xBF, 0xC0, 0xD2, 0x50, 0xDA, 0x86, 0xE9, 0xA1, 0xE5, 0x14, 0xF2, + 0x89, 0xE2, 0xE9, 0xEB, 0x82, 0xE8, 0xE1, 0xF5, 0x8D, 0xF0, 0xD7, 0xFD, + 0xAB, 0x01, 0x01, 0x02, 0x48, 0x18, 0x71, 0x09, 0xD9, 0x07, 0x40, 0xF9, + 0xD0, 0xE8, 0xEB, 0xE3, 0xF2, 0xF0, 0x45, 0xF4, 0x51, 0x04, 0x76, 0x0A, + 0x05, 0xFD, 0xF5, 0xFE, 0x67, 0xED, 0x2D, 0xEC, 0xD1, 0xEA, 0x5A, 0xE2, + 0xFD, 0xE4, 0x5D, 0xD8, 0x58, 0xD7, 0x9A, 0xD2, 0xDD, 0xCE, 0x09, 0xD5, + 0xCA, 0xC6, 0x44, 0xDE, 0xAA, 0xCD, 0x1E, 0xEC, 0xD6, 0xEB, 0x44, 0xF9, + 0x50, 0xF7, 0x37, 0xF2, 0x71, 0xF5, 0x9A, 0xE0, 0xF7, 0xFE, 0x20, 0xE1, + 0xC0, 0x03, 0x48, 0xEF, 0xE9, 0xFC, 0x93, 0xFB, 0x57, 0x02, 0xD0, 0xFF, + 0x3A, 0x15, 0x5D, 0xFC, 0xE9, 0x14, 0x57, 0xFE, 0xBD, 0x0F, 0x72, 0x04, + 0x90, 0x14, 0xDE, 0xFF, 0xE9, 0x1C, 0x1E, 0x04, 0x71, 0x1C, 0x42, 0x09, + 0x5E, 0x0D, 0xE0, 0xFD, 0x25, 0x01, 0xBB, 0xF8, 0xCD, 0xF3, 0x10, 0xFB, + 0x15, 0xE6, 0xDC, 0xFE, 0xDD, 0xF0, 0x93, 0x0D, 0x4E, 0xF9, 0xF2, 0x08, + 0x03, 0xEF, 0xDD, 0xF2, 0x0F, 0x01, 0x60, 0x0B, 0x83, 0x12, 0x2E, 0x2E, + 0xAF, 0xEE, 0xEE, 0x14, 0x26, 0xD7, 0xC5, 0xF8, 0x07, 0xF7, 0x57, 0x0B, + 0xEF, 0x13, 0xA6, 0x1B, 0x30, 0x16, 0xCE, 0x18, 0x25, 0x1E, 0x53, 0x20, + 0x69, 0x28, 0x3F, 0x25, 0x74, 0x1D, 0x45, 0x1D, 0x59, 0x20, 0x4F, 0x24, + 0x60, 0x24, 0xA2, 0x1C, 0xA2, 0x11, 0xC3, 0x03, 0x98, 0x18, 0x44, 0x10, + 0xA7, 0x3A, 0x16, 0x2F, 0xE6, 0x43, 0xEF, 0x30, 0xCA, 0x32, 0x19, 0x29, + 0xA4, 0x23, 0xF7, 0x22, 0x08, 0x19, 0x3E, 0x0B, 0x31, 0x16, 0x62, 0xF7, + 0x97, 0x0E, 0x07, 0xEC, 0x10, 0x06, 0x23, 0xE5, 0x15, 0x0B, 0x60, 0xF0, + 0xAA, 0x1E, 0x62, 0x09, 0x60, 0x25, 0x63, 0x0C, 0x2B, 0x0E, 0x15, 0xFE, + 0x27, 0xFA, 0x50, 0x00, 0x30, 0xFD, 0xF8, 0x07, 0x68, 0x09, 0x68, 0x0B, + 0xE4, 0x0C, 0xC8, 0x16, 0xEB, 0x06, 0x1C, 0x25, 0xF5, 0xF6, 0x78, 0x1E, + 0x65, 0xED, 0xB2, 0x0C, 0x66, 0xEA, 0x5B, 0xFF, 0xD8, 0xE5, 0x75, 0xFD, + 0xB3, 0xEB, 0xEB, 0x05, 0xB2, 0xEC, 0x5B, 0xFE, 0x51, 0xE3, 0x75, 0xEF, + 0x19, 0xDD, 0x17, 0xEC, 0x5B, 0xD1, 0x86, 0xE5, 0x2F, 0xD9, 0xD0, 0xF0, + 0x7C, 0xE9, 0xF2, 0xF9, 0x12, 0xE1, 0x54, 0xE2, 0x21, 0xF1, 0xB0, 0xE6, + 0xA5, 0x0F, 0x2E, 0x08, 0xDF, 0xF3, 0x0E, 0xF4, 0xFB, 0xC6, 0xA5, 0xC7, + 0x13, 0xC7, 0x7E, 0xC7, 0x8F, 0xD8, 0xE8, 0xD6, 0x2A, 0xE1, 0x90, 0xDD, + 0xEB, 0xE8, 0xFC, 0xDA, 0xEE, 0xF0, 0xE0, 0xD8, 0x7C, 0xEE, 0xCD, 0xDE, + 0x95, 0xF4, 0x57, 0xED, 0xA0, 0xF4, 0xD0, 0xF6, 0x43, 0xD8, 0x13, 0xEC, + 0x0F, 0xDC, 0x35, 0xED, 0xBA, 0x0A, 0xD6, 0x00, 0x97, 0x24, 0x2A, 0x00, + 0x00, 0x1E, 0xB3, 0xF5, 0x80, 0x0E, 0x57, 0xF2, 0x20, 0xFC, 0xE8, 0xDF, + 0xB7, 0xEE, 0x2D, 0xCA, 0x31, 0xE9, 0x07, 0xC4, 0x9E, 0xE4, 0xCB, 0xC9, + 0x91, 0xE9, 0x89, 0xD5, 0xA0, 0x04, 0x38, 0xEB, 0x9F, 0x1A, 0x8D, 0x01, + 0x2B, 0x06, 0xE8, 0xFB, 0xC3, 0xEB, 0x23, 0xEE, 0x3D, 0xF5, 0xB4, 0xF7, + 0x00, 0xFB, 0x9A, 0x02, 0x6B, 0xF1, 0x8B, 0x08, 0x9C, 0xFB, 0xCF, 0x1E, + 0xBB, 0x06, 0x8C, 0x26, 0x38, 0x04, 0xEF, 0x10, 0x3E, 0xFD, 0x0D, 0xFF, + 0x95, 0xF8, 0x4C, 0x07, 0x78, 0xFD, 0x08, 0x1B, 0xE1, 0xF7, 0xF5, 0x14, + 0x2E, 0xF4, 0x4A, 0x0C, 0xF0, 0xFE, 0x84, 0x13, 0x8C, 0xF6, 0xAA, 0x05, + 0xDD, 0xF3, 0x3A, 0x02, 0xDC, 0xFE, 0x83, 0x0E, 0x63, 0xEF, 0xB5, 0xF8, + 0x3D, 0xE9, 0x39, 0xF4, 0x37, 0x06, 0x07, 0x18, 0x3D, 0x03, 0x34, 0x0E, + 0x41, 0xE1, 0xC9, 0xDD, 0xB3, 0xE7, 0x5D, 0xDC, 0x52, 0x02, 0xA2, 0xFB, + 0x56, 0x06, 0x37, 0x05, 0x38, 0x05, 0xF8, 0x06, 0xE6, 0x0C, 0x4F, 0x0C, + 0xE9, 0x14, 0x76, 0x03, 0xCC, 0x24, 0xBE, 0x00, 0xBB, 0x35, 0x0E, 0x0D, + 0x55, 0x2B, 0x26, 0x09, 0xFD, 0x1D, 0xBE, 0xFE, 0xC6, 0x2D, 0x92, 0x0E, + 0x8E, 0x3D, 0xBD, 0x22, 0x8D, 0x2E, 0xC4, 0x1C, 0x92, 0x23, 0x71, 0x18, + 0x5F, 0x22, 0x81, 0x12, 0x23, 0x17, 0x36, 0x09, 0xDB, 0x0D, 0x66, 0x11, + 0xB3, 0xFE, 0x13, 0x14, 0x57, 0xF7, 0xDC, 0x11, 0xFE, 0x05, 0x7E, 0x1A, + 0xA3, 0x0F, 0xFA, 0x24, 0x5C, 0x02, 0xB1, 0x21, 0x0E, 0xEF, 0xFB, 0x10, + 0x58, 0xEA, 0x13, 0x00, 0xDC, 0xEF, 0x5D, 0xFB, 0x90, 0xED, 0x26, 0xFC, + 0x29, 0xEF, 0xDA, 0x06, 0x70, 0xF5, 0x9C, 0x0E, 0xCC, 0xFD, 0xD6, 0x05, + 0xAD, 0x05, 0xF3, 0xF7, 0x73, 0xFE, 0x01, 0xE7, 0x5C, 0x02, 0x44, 0xEB, + 0x42, 0xFD, 0x18, 0xEF, 0xEC, 0xE0, 0xC1, 0xDE, 0xE3, 0xD7, 0xE1, 0xD9, + 0xD3, 0xD4, 0x50, 0xD3, 0x91, 0xCE, 0x67, 0xC4, 0x41, 0xDA, 0xD1, 0xBF, + 0x6A, 0xD6, 0x82, 0xB8, 0x0D, 0xC1, 0x23, 0xBC, 0x70, 0xCB, 0x7A, 0xE0, + 0x8E, 0xD3, 0x5C, 0xF4, 0x42, 0xB7, 0x79, 0xD3, 0x09, 0xB3, 0x48, 0xB6, + 0x3B, 0xD5, 0x53, 0xC6, 0xD4, 0xE5, 0x9F, 0xD8, 0x2F, 0xE4, 0x90, 0xD3, + 0x9D, 0xEB, 0x85, 0xD2, 0x3D, 0xEF, 0xA3, 0xD9, 0xC5, 0xEE, 0xE8, 0xDB, + 0x46, 0xFC, 0x98, 0xE5, 0xD1, 0xFC, 0x31, 0xE5, 0x31, 0xF3, 0x11, 0xDE, + 0x0D, 0x09, 0xE9, 0xF8, 0x02, 0x25, 0x97, 0x1C, 0x59, 0x22, 0xD3, 0x1D, + 0xDA, 0x1A, 0xCE, 0x11, 0x07, 0x16, 0x21, 0x10, 0x63, 0x05, 0x80, 0x10, + 0x85, 0xFC, 0x11, 0x13, 0x11, 0x01, 0xC6, 0x11, 0x6C, 0x0A, 0xFA, 0x11, + 0x7D, 0x17, 0x0C, 0x1F, 0xE2, 0x23, 0x6D, 0x31, 0xD9, 0x1B, 0x57, 0x36, + 0x21, 0x03, 0xF2, 0x2B, 0x57, 0x00, 0x95, 0x29, 0x42, 0x10, 0x7B, 0x2F, + 0xBC, 0x1C, 0xAD, 0x33, 0xF1, 0x2B, 0x38, 0x3F, 0xCE, 0x32, 0xBB, 0x43, + 0x99, 0x2E, 0xEE, 0x36, 0x9A, 0x25, 0x14, 0x29, 0xB5, 0x18, 0x5B, 0x1B, + 0x45, 0x23, 0xC4, 0x14, 0xD4, 0x31, 0x20, 0x14, 0x45, 0x24, 0xE6, 0x0E, + 0x3C, 0x1A, 0xE3, 0x0D, 0x90, 0x1B, 0xE9, 0x0D, 0x0A, 0x16, 0x00, 0x0F, + 0xA3, 0x12, 0x38, 0x0F, 0x15, 0x0B, 0x8F, 0xF9, 0x3E, 0x00, 0xEF, 0xE3, + 0x5F, 0x12, 0x23, 0xF5, 0xE1, 0x29, 0x88, 0x09, 0x77, 0x11, 0xC8, 0xEC, + 0xDB, 0xF4, 0xFA, 0xD0, 0xC5, 0xF9, 0xBB, 0xDE, 0x0F, 0x00, 0x55, 0xED, + 0xD6, 0x00, 0x6F, 0xEA, 0x88, 0x05, 0x2B, 0xEE, 0xEE, 0x09, 0xE3, 0x00, + 0xA5, 0x0C, 0xF2, 0x14, 0xCF, 0x15, 0x38, 0x29, 0x14, 0x0F, 0x64, 0x23, + 0x55, 0xFB, 0x02, 0x0E, 0xCB, 0xFF, 0x18, 0x1E, 0x71, 0x0D, 0xFA, 0x3A, + 0x59, 0x0B, 0x25, 0x30, 0x12, 0x05, 0x36, 0x16, 0xB1, 0xF3, 0x89, 0x05, + 0xAF, 0xD7, 0x78, 0xF0, 0x22, 0xD2, 0x05, 0xE9, 0x57, 0xD8, 0x61, 0xF0, + 0x89, 0xD8, 0xAC, 0xED, 0x78, 0xEC, 0x9C, 0xF2, 0xC9, 0x0C, 0x3E, 0x0D, + 0x35, 0x12, 0xC9, 0x14, 0xCD, 0x00, 0xF4, 0xFF, 0x53, 0xF1, 0x96, 0xF9, + 0xCE, 0xE5, 0x2E, 0x00, 0x25, 0xE3, 0x84, 0xF9, 0xF0, 0xFA, 0x8F, 0xF6, + 0x7B, 0x0D, 0xFD, 0xF6, 0xB4, 0x02, 0x02, 0xF2, 0xA6, 0xF3, 0xFA, 0xEE, + 0x5B, 0xEB, 0x5A, 0xEA, 0xC9, 0xE8, 0x3B, 0xEA, 0x0F, 0xE9, 0x3E, 0xF0, + 0x94, 0xE3, 0xA1, 0xE6, 0x1F, 0xE5, 0xC1, 0xD9, 0x19, 0xF0, 0x34, 0xDC, + 0xF1, 0xEF, 0x9F, 0xDA, 0x86, 0xF3, 0x5A, 0xD7, 0x09, 0xEF, 0x20, 0xCB, + 0x73, 0xDF, 0x4C, 0xC2, 0x9C, 0xEE, 0xC9, 0xD7, 0xD2, 0x01, 0xE1, 0xE9, + 0xE4, 0xEA, 0x27, 0xD7, 0x5E, 0xD8, 0x68, 0xC6, 0x6E, 0xEB, 0xA8, 0xD6, + 0x5D, 0xFB, 0x74, 0xE5, 0xDC, 0x01, 0x35, 0xE8, 0x91, 0x06, 0xB4, 0xF0, + 0xF5, 0xF8, 0xA9, 0xFF, 0xD6, 0xF0, 0x7C, 0x0B, 0x08, 0x11, 0x35, 0x1C, + 0x91, 0x1C, 0xDC, 0x19, 0x24, 0xFE, 0xA4, 0x00, 0x54, 0x03, 0x7F, 0x10, + 0x98, 0x1B, 0xFD, 0x36, 0xBD, 0x18, 0xF1, 0x3A, 0x8B, 0x14, 0xF3, 0x30, + 0xA5, 0x10, 0xF2, 0x2F, 0x3F, 0x03, 0x08, 0x23, 0x68, 0x07, 0x44, 0x14, + 0x3F, 0x11, 0x76, 0x13, 0x54, 0x07, 0xF6, 0x13, 0xC1, 0x07, 0x94, 0x23, + 0x64, 0x21, 0x3A, 0x3A, 0x7B, 0x2F, 0x14, 0x34, 0xDE, 0x19, 0x7C, 0x1A, + 0xA6, 0x05, 0x8C, 0x11, 0xFA, 0x0C, 0x67, 0x12, 0xFE, 0x18, 0x31, 0x12, + 0xC1, 0x1F, 0x7C, 0x23, 0x35, 0x1D, 0x10, 0x30, 0x14, 0x19, 0x62, 0x24, + 0x7A, 0x1E, 0x1B, 0x13, 0x7B, 0x1C, 0xE1, 0xFF, 0xC9, 0x24, 0x02, 0xFA, + 0x0E, 0x31, 0x53, 0x00, 0x5A, 0x1E, 0xDB, 0xFA, 0x05, 0x0F, 0x07, 0xFA, + 0x2C, 0x0C, 0x6C, 0xFC, 0x70, 0x00, 0x2E, 0xED, 0x75, 0x0C, 0x72, 0xF0, + 0x36, 0x1E, 0x89, 0x06, 0x75, 0x09, 0xA4, 0x08, 0x16, 0x04, 0x9A, 0x0F, + 0x5D, 0x1E, 0xFD, 0x23, 0x99, 0x0E, 0x06, 0x1B, 0x7D, 0xDC, 0x21, 0xFE, + 0xA5, 0xDD, 0x7D, 0x07, 0xBD, 0xF8, 0x26, 0x15, 0x0E, 0xF6, 0x8F, 0x02, + 0x54, 0xF1, 0xE2, 0xFB, 0xD5, 0xEA, 0xB0, 0x01, 0x12, 0xE5, 0xF6, 0xFF, + 0x2E, 0xFA, 0x99, 0x05, 0xAF, 0x08, 0x5B, 0x0C, 0x22, 0xF9, 0x02, 0x00, + 0xEE, 0x03, 0x61, 0x05, 0x32, 0x2D, 0x47, 0x1C, 0x68, 0x38, 0x0B, 0x1E, + 0x4C, 0x20, 0xB7, 0x1C, 0x0D, 0xFF, 0xC0, 0x16, 0xCE, 0xED, 0x19, 0xF8, + 0x2B, 0xF7, 0x8C, 0xDE, 0x0A, 0xFA, 0x47, 0xDB, 0x75, 0xED, 0xE1, 0xDB, + 0xAD, 0xEE, 0x9D, 0xE3, 0x03, 0xFA, 0x47, 0xF8, 0x23, 0xED, 0x48, 0xFF, + 0xC0, 0xD1, 0x6A, 0xEE, 0x73, 0xCB, 0xF2, 0xE4, 0x65, 0xD0, 0x83, 0xE6, + 0x6B, 0xD2, 0x0F, 0xDC, 0x5B, 0xE4, 0x1E, 0xE4, 0xDD, 0xF4, 0x16, 0xF4, + 0x36, 0xF0, 0xA5, 0xE6, 0xAD, 0xEF, 0xC1, 0xDA, 0x5F, 0xEF, 0x01, 0xD3, + 0x51, 0xF5, 0x1E, 0xD3, 0x4D, 0xFC, 0xDE, 0xDC, 0x2B, 0xFA, 0xBD, 0xE4, + 0xD9, 0xF8, 0xDF, 0xE5, 0x50, 0xF8, 0x53, 0xDE, 0xF5, 0xF4, 0x2A, 0xD5, + 0x6E, 0xF1, 0x76, 0xDE, 0x7C, 0xE6, 0x1D, 0xEC, 0xF5, 0xD6, 0xEA, 0xE7, + 0x45, 0xE8, 0xA1, 0xF6, 0xCA, 0x05, 0x48, 0x0D, 0xA0, 0xFE, 0x2E, 0x06, + 0xCC, 0xE0, 0xAD, 0xF0, 0xEA, 0xDA, 0x78, 0xF3, 0xD4, 0xE7, 0xA2, 0x02, + 0x38, 0xED, 0x63, 0x0B, 0x21, 0xF2, 0x80, 0x18, 0xC2, 0xFC, 0x8E, 0x1D, + 0x02, 0x13, 0x53, 0x21, 0xE0, 0x2D, 0xCF, 0x33, 0xA5, 0x2C, 0x64, 0x3D, + 0x80, 0x18, 0xA2, 0x2E, 0x4F, 0x20, 0x08, 0x2E, 0x14, 0x34, 0x3A, 0x3F, + 0x1F, 0x36, 0xA4, 0x42, 0xFF, 0x37, 0x9E, 0x38, 0x7D, 0x32, 0x4E, 0x22, + 0x21, 0x1F, 0x78, 0x11, 0xFD, 0x14, 0xE2, 0x0E, 0x98, 0x0F, 0xBC, 0x0C, + 0x68, 0x0C, 0x77, 0x0E, 0x3B, 0x17, 0xC6, 0x15, 0x28, 0x2B, 0xDE, 0x1C, + 0xE0, 0x37, 0x1A, 0x1A, 0x8B, 0x34, 0x93, 0x11, 0x85, 0x25, 0x11, 0x0C, + 0xE1, 0x11, 0xB3, 0x02, 0xF2, 0x09, 0x6C, 0xF9, 0x21, 0x1A, 0xD4, 0x00, + 0xCA, 0x26, 0x0F, 0x0D, 0xBA, 0x1B, 0x75, 0x12, 0x07, 0x11, 0xB1, 0x0F, + 0x5A, 0x13, 0xDE, 0x02, 0x81, 0x1B, 0xB4, 0x04, 0x82, 0x13, 0xE3, 0x0A, + 0x23, 0xFA, 0x0C, 0x08, 0xC5, 0xF0, 0x31, 0x0B, 0x28, 0xEF, 0xC8, 0x07, + 0xE9, 0xE2, 0x1E, 0xF9, 0x93, 0xDF, 0x84, 0xF4, 0x4A, 0xDA, 0x0D, 0xEE, + 0x19, 0xC5, 0x1A, 0xD6, 0xF7, 0xCD, 0x0C, 0xE3, 0xD9, 0xE4, 0x43, 0x0A, + 0xF3, 0xCF, 0x81, 0xFB, 0xE0, 0xC1, 0x69, 0xD0, 0x86, 0xDE, 0xFC, 0xCC, + 0xD9, 0xEC, 0xA2, 0xE0, 0x62, 0xDA, 0x12, 0xE3, 0x72, 0xD7, 0xB1, 0xE8, + 0x5F, 0xDD, 0xFF, 0xE6, 0xE4, 0xDC, 0xBE, 0xDF, 0x97, 0xF1, 0xF3, 0xEC, + 0x5E, 0x01, 0xBA, 0xEA, 0x81, 0xEC, 0x45, 0xD3, 0x80, 0xDA, 0xC3, 0xD2, + 0xD9, 0xE2, 0xFC, 0xEA, 0x1E, 0xEB, 0x10, 0xFD, 0x37, 0xEB, 0x1F, 0x02, + 0x19, 0xE4, 0x3D, 0xF6, 0x8F, 0xDD, 0xFD, 0xE4, 0xCF, 0xE2, 0x07, 0xDC, + 0x94, 0xE9, 0x39, 0xD2, 0x57, 0xE7, 0xE4, 0xCA, 0x86, 0xEB, 0xF9, 0xD9, + 0x5A, 0xFA, 0xA6, 0xEB, 0xB3, 0x05, 0x78, 0xEE, 0x71, 0x01, 0xDB, 0xF0, + 0x56, 0xF6, 0x6B, 0xF1, 0x23, 0xF9, 0x23, 0xF2, 0xAA, 0x07, 0x98, 0xEE, + 0x2A, 0x1B, 0x2B, 0xF4, 0xCF, 0x19, 0x06, 0x02, 0x2B, 0x05, 0xA1, 0x05, + 0x09, 0xFD, 0x2E, 0x08, 0xC4, 0x04, 0x84, 0x07, 0x81, 0x15, 0xBE, 0x07, + 0xAF, 0x1B, 0x87, 0x0A, 0x8C, 0x0D, 0xBA, 0x02, 0xD6, 0x04, 0x30, 0xFB, + 0xEB, 0xF9, 0x34, 0xFD, 0xE7, 0xE2, 0xD9, 0x03, 0xC1, 0xE1, 0xD8, 0x08, + 0x3A, 0xED, 0x4E, 0x03, 0x55, 0xF9, 0x62, 0x03, 0x02, 0x13, 0x70, 0x20, + 0xF3, 0x22, 0x40, 0x3B, 0x39, 0x11, 0x1B, 0x28, 0xD6, 0xF3, 0x49, 0x09, + 0x3D, 0xF6, 0xB0, 0x11, 0x59, 0x0B, 0x91, 0x1E, 0x16, 0x0B, 0xAF, 0x0C, + 0x5A, 0x08, 0xB0, 0x01, 0xD1, 0x09, 0x75, 0x02, 0x6B, 0x06, 0x7A, 0x05, + 0x06, 0x12, 0x17, 0x1B, 0x2C, 0x18, 0x90, 0x23, 0xC4, 0x0C, 0x7F, 0x0F, + 0xA2, 0x13, 0x48, 0x0A, 0x06, 0x31, 0x92, 0x1B, 0xD4, 0x47, 0xF5, 0x27, + 0xE5, 0x3A, 0x33, 0x22, 0x59, 0x1F, 0x3E, 0x0F, 0x75, 0x14, 0x6C, 0xF7, + 0xD8, 0x11, 0xC7, 0xE6, 0x46, 0x0A, 0x58, 0xE8, 0xA6, 0x02, 0xB9, 0xF5, + 0xF3, 0x0D, 0x32, 0x06, 0xD9, 0x1D, 0x1C, 0x11, 0x35, 0x23, 0x0D, 0x15, + 0xD2, 0x18, 0x00, 0x18, 0xBA, 0x01, 0x5C, 0x1C, 0xC3, 0xF6, 0xF9, 0x1C, + 0x8B, 0xFB, 0x3B, 0x1B, 0xAB, 0x06, 0x8E, 0x24, 0xD3, 0x04, 0x70, 0x23, + 0x07, 0xF8, 0xBE, 0x0D, 0x81, 0xF4, 0x4A, 0x01, 0x32, 0xF7, 0x89, 0x07, + 0x55, 0xF3, 0x9B, 0x0F, 0xC1, 0xF0, 0xDA, 0x08, 0xAA, 0x07, 0x5D, 0x02, + 0xE0, 0x13, 0x6A, 0xFC, 0x29, 0xFE, 0xE7, 0xEC, 0x35, 0xF5, 0xCB, 0xED, + 0xEA, 0xF1, 0x3F, 0xF8, 0x40, 0xD4, 0x23, 0xE4, 0xE7, 0xD3, 0x0B, 0xDB, + 0x6B, 0xFC, 0xF6, 0xF5, 0x91, 0xFF, 0xF9, 0xED, 0x97, 0xDA, 0xB8, 0xC3, + 0x65, 0xCD, 0xCC, 0xB6, 0x9F, 0xD0, 0x6C, 0xC1, 0x91, 0xC3, 0xF8, 0xC4, + 0x16, 0xC1, 0x5C, 0xCA, 0xAB, 0xC3, 0x7D, 0xD5, 0x7F, 0xC0, 0xC7, 0xD5, + 0xCD, 0xD4, 0xE3, 0xD5, 0x70, 0xF2, 0x4D, 0xE3, 0x51, 0xF1, 0x72, 0xDF, + 0xC8, 0xE5, 0x55, 0xCE, 0x40, 0xF7, 0xFF, 0xD6, 0x25, 0x0F, 0x31, 0xF0, + 0x46, 0x12, 0xA8, 0xFD, 0xA0, 0x05, 0x28, 0xF8, 0xD4, 0xFC, 0x1E, 0xEC, + 0x0F, 0x03, 0x24, 0xE2, 0xDC, 0x03, 0xBD, 0xD5, 0x36, 0xF7, 0xA8, 0xD2, + 0x58, 0xF0, 0x2C, 0xE4, 0x92, 0xF3, 0x51, 0xF8, 0xDC, 0xFB, 0x82, 0x08, + 0x24, 0x0C, 0xB7, 0x19, 0x71, 0x0D, 0x91, 0x15, 0x46, 0xFD, 0x62, 0x03, + 0xB1, 0xF6, 0xDC, 0x00, 0xC1, 0xF5, 0xEF, 0x10, 0x0B, 0xF3, 0xD7, 0x24, + 0x1F, 0xF4, 0x73, 0x23, 0x8E, 0xF9, 0x5D, 0x1B, 0x5B, 0x01, 0x50, 0x1F, + 0xE3, 0x17, 0xD2, 0x27, 0xB9, 0x25, 0xE5, 0x2C, 0xA9, 0x1F, 0x99, 0x2A, + 0x63, 0x1D, 0xA7, 0x29, 0xFA, 0x16, 0x69, 0x2A, 0x48, 0x0E, 0x16, 0x24, + 0x71, 0x16, 0xA6, 0x21, 0x56, 0x12, 0x88, 0x0A, 0x50, 0xFD, 0x62, 0xEB, + 0x56, 0x0D, 0xEC, 0x03, 0x63, 0x25, 0x3A, 0x25, 0x58, 0x10, 0x53, 0x19, + 0xF9, 0xF6, 0x85, 0x04, 0xE9, 0xFB, 0xA0, 0xFA, 0x7E, 0x06, 0x94, 0xF1, + 0x9E, 0x10, 0xCA, 0xF6, 0x6C, 0x1F, 0x5F, 0x06, 0xD2, 0x19, 0x27, 0xFF, + 0x2F, 0x0F, 0xA3, 0xEF, 0x84, 0x1D, 0x4D, 0xF8, 0x6C, 0x27, 0x08, 0x05, + 0xD1, 0x1F, 0x2D, 0xFF, 0xE6, 0x25, 0xC5, 0x02, 0x3F, 0x33, 0xD3, 0x13, + 0x9C, 0x3B, 0xA5, 0x21, 0x51, 0x3C, 0x27, 0x2B, 0xF5, 0x27, 0x61, 0x27, + 0x63, 0x12, 0xB8, 0x1D, 0x2F, 0x07, 0xFB, 0x18, 0xB1, 0xFA, 0xFF, 0x10, + 0xAD, 0xF1, 0x92, 0x03, 0xE6, 0xF3, 0xDE, 0xFC, 0x9C, 0xF0, 0x48, 0x00, + 0xCC, 0xE2, 0x32, 0x0C, 0xE8, 0xE3, 0xE5, 0x16, 0xB0, 0xE7, 0x51, 0x12, + 0x81, 0xE2, 0x35, 0x01, 0x00, 0xF1, 0x86, 0xFB, 0x3A, 0x05, 0xFB, 0x07, + 0x85, 0xFF, 0x28, 0x08, 0xDC, 0xF6, 0x2A, 0x09, 0x9C, 0xF3, 0xF8, 0x0E, + 0x0B, 0xEC, 0x90, 0x02, 0xE2, 0xF4, 0xFC, 0xF8, 0xF9, 0xFE, 0x93, 0xED, + 0xDB, 0xF6, 0x78, 0xD9, 0xC5, 0xEB, 0x45, 0xCE, 0xE1, 0xDE, 0xA1, 0xCB, + 0xA6, 0xCB, 0x94, 0xC7, 0xCC, 0xBF, 0xA6, 0xCB, 0xA4, 0xB1, 0x96, 0xCA, + 0x52, 0xA8, 0x66, 0xBD, 0xDD, 0xC5, 0x79, 0xCA, 0xF9, 0xE4, 0x93, 0xE1, + 0xBF, 0xD7, 0x29, 0xD5, 0xE6, 0xC9, 0x1B, 0xC1, 0xF8, 0xD4, 0xF9, 0xC2, + 0x28, 0xD6, 0x11, 0xC2, 0x79, 0xD6, 0xE5, 0xC2, 0x3A, 0xE0, 0x30, 0xD1, + 0xAB, 0xE1, 0x20, 0xD5, 0xB0, 0xF5, 0x39, 0xD8, 0xF8, 0x11, 0xFA, 0xE3, + 0x58, 0x0D, 0x02, 0xE4, 0x6C, 0x00, 0x34, 0xDF, 0x0E, 0x03, 0xDC, 0xED, + 0x74, 0x0E, 0x3B, 0x09, 0xD6, 0x1D, 0xF5, 0x1D, 0xFF, 0x2A, 0xE7, 0x24, + 0x11, 0x27, 0x83, 0x19, 0x17, 0x1D, 0x43, 0x11, 0x28, 0x17, 0x40, 0x15, + 0x0C, 0xFE, 0xCB, 0x12, 0x5E, 0xE9, 0x79, 0x0F, 0x11, 0xF8, 0x3B, 0x1A, + 0x5D, 0x10, 0x43, 0x29, 0x09, 0x21, 0xD6, 0x34, 0xE9, 0x24, 0x98, 0x39, + 0x27, 0x1D, 0xBA, 0x33, 0x3F, 0x13, 0x26, 0x31, 0x37, 0x12, 0xED, 0x39, + 0x93, 0x1A, 0xAD, 0x42, 0xAF, 0x1B, 0x9C, 0x36, 0xE9, 0x1B, 0x49, 0x23, + 0xC8, 0x1C, 0x3A, 0x1D, 0xE9, 0x1D, 0x03, 0x1E, 0x97, 0x23, 0x91, 0x21, + 0xFA, 0x1A, 0xFF, 0x1C, 0x70, 0x0E, 0x47, 0x11, 0xE0, 0x11, 0x38, 0x09, + 0x23, 0x14, 0x9B, 0x04, 0x36, 0x15, 0x37, 0x02, 0x94, 0x16, 0x80, 0xF8, + 0xA5, 0x09, 0x15, 0xE9, 0xE3, 0x02, 0x7F, 0xE9, 0xB0, 0x13, 0x3F, 0xF7, + 0x1D, 0x1B, 0xE5, 0xF4, 0x61, 0x00, 0x1E, 0xE1, 0xBD, 0xF2, 0xEA, 0xE0, + 0x41, 0x02, 0x61, 0xF4, 0x66, 0x02, 0x02, 0xF3, 0x8A, 0xFB, 0x41, 0xEA, + 0x21, 0x00, 0x92, 0xF8, 0xC2, 0xFC, 0x78, 0x0B, 0xF2, 0xF9, 0xA0, 0x1A, + 0x81, 0x08, 0x27, 0x25, 0xC3, 0x06, 0xA1, 0x16, 0x5A, 0xFD, 0x69, 0x04, + 0xBE, 0x03, 0xD7, 0x0F, 0x54, 0x0A, 0x26, 0x29, 0x97, 0x00, 0x65, 0x27, + 0x5C, 0xF2, 0xFD, 0x19, 0x71, 0xF5, 0x1C, 0x16, 0x1A, 0x01, 0x29, 0x0B, + 0x80, 0x04, 0x34, 0xFD, 0x05, 0xF6, 0x4D, 0xF4, 0xFC, 0xEF, 0x92, 0xF9, + 0xD3, 0xF3, 0xF7, 0x05, 0xEA, 0xF3, 0x87, 0x12, 0xE3, 0xF9, 0x3C, 0x14, + 0x96, 0xFF, 0x38, 0x04, 0x89, 0xF8, 0x73, 0xF1, 0x57, 0xF2, 0x57, 0xE6, + 0xF0, 0xF8, 0x69, 0xEC, 0xB7, 0xF3, 0xC3, 0xF1, 0x6F, 0xE9, 0x9F, 0xF2, + 0xAC, 0xE2, 0x7A, 0xF3, 0x72, 0xDC, 0xFE, 0xEE, 0xEB, 0xE1, 0xD8, 0xEF, + 0x14, 0xEF, 0x15, 0xF1, 0x8E, 0xF3, 0xA0, 0xE5, 0xDB, 0xF3, 0xF1, 0xDB, + 0x71, 0xF5, 0xD1, 0xD5, 0x80, 0xEF, 0x19, 0xCB, 0xF8, 0xE3, 0x07, 0xC3, + 0x47, 0xD3, 0x3E, 0xB9, 0x3A, 0xCD, 0xB0, 0xBB, 0xBE, 0xE7, 0x8C, 0xD4, + 0x21, 0x09, 0x68, 0xE8, 0x0E, 0xFC, 0x51, 0xD4, 0x31, 0xDA, 0x98, 0xB6, + 0xD2, 0xDA, 0x29, 0xC5, 0x7D, 0xE5, 0x38, 0xDF, 0x5E, 0xE0, 0xD4, 0xE3, + 0x6D, 0xEA, 0x38, 0xE9, 0xA4, 0x02, 0x32, 0xF8, 0xE1, 0x0A, 0x32, 0x04, + 0x1A, 0x0D, 0xD7, 0x0F, 0x2B, 0x07, 0x80, 0x18, 0xD9, 0xF3, 0x35, 0x11, + 0xB5, 0xF4, 0x6F, 0x13, 0xF3, 0x10, 0x75, 0x2C, 0x84, 0x26, 0x6E, 0x3C, + 0x89, 0x26, 0x62, 0x35, 0x8B, 0x1D, 0x47, 0x2E, 0x8A, 0x13, 0xDD, 0x31, + 0x2B, 0x0C, 0x10, 0x2F, 0x34, 0x0B, 0xCE, 0x27, 0x6C, 0x0C, 0xB9, 0x25, + 0xD7, 0x11, 0xA8, 0x26, 0xF6, 0x1D, 0xB0, 0x25, 0x04, 0x28, 0xDA, 0x2A, + 0x57, 0x28, 0xD3, 0x33, 0x8E, 0x1E, 0xCC, 0x2A, 0x8A, 0x14, 0x97, 0x1F, + 0xD5, 0x14, 0x4A, 0x25, 0x3F, 0x1F, 0xD1, 0x28, 0x91, 0x2F, 0x83, 0x2A, + 0x8A, 0x35, 0x20, 0x30, 0x6C, 0x2E, 0x0E, 0x29, 0x1C, 0x2F, 0xB2, 0x1C, + 0x71, 0x39, 0x00, 0x16, 0x73, 0x37, 0x94, 0x0A, 0x54, 0x2C, 0x7D, 0x01, + 0xDD, 0x23, 0xA7, 0xFC, 0xE0, 0x1B, 0xD7, 0xF9, 0x04, 0x1A, 0x1A, 0xFB, + 0xF3, 0x12, 0xEB, 0xF0, 0x04, 0x03, 0x6A, 0xE4, 0x48, 0x06, 0xF5, 0xFC, + 0x51, 0x17, 0xF1, 0x25, 0xFD, 0x0C, 0x16, 0x21, 0x3B, 0xFB, 0x09, 0x06, + 0x37, 0xFD, 0x60, 0x00, 0xC5, 0xF8, 0xC4, 0x00, 0xD9, 0xE6, 0x66, 0xFD, + 0x62, 0xD8, 0x83, 0xFF, 0x9A, 0xD5, 0xBC, 0xFF, 0xEC, 0xE1, 0xA5, 0xFD, + 0x99, 0xF5, 0xFD, 0x06, 0x3F, 0x03, 0x8A, 0x0E, 0xE9, 0x05, 0xDD, 0x02, + 0x0B, 0x04, 0x66, 0xFA, 0x15, 0x03, 0x1C, 0x0A, 0x1C, 0x06, 0xA0, 0x1C, + 0xA6, 0x0D, 0xC9, 0x18, 0x5C, 0x07, 0xAE, 0x05, 0x0B, 0xFA, 0xF0, 0xF7, + 0x9A, 0xF5, 0x47, 0xE7, 0xF4, 0xEC, 0xE8, 0xD1, 0x01, 0xE4, 0x1C, 0xCC, + 0x4C, 0xE3, 0x31, 0xD8, 0x90, 0xDF, 0x91, 0xE9, 0x3B, 0xD8, 0x7C, 0xF1, + 0x37, 0xD8, 0x62, 0xEF, 0xAD, 0xDE, 0x61, 0xEB, 0xD0, 0xDD, 0x38, 0xE9, + 0x16, 0xDC, 0xE7, 0xE8, 0xDC, 0xE6, 0x6E, 0xE4, 0x48, 0xF1, 0x26, 0xE2, + 0x45, 0xEB, 0x1F, 0xE6, 0xBB, 0xDC, 0xD6, 0xE4, 0x3C, 0xE9, 0xFE, 0xE8, + 0x4D, 0xFC, 0xBC, 0xEB, 0x44, 0xFA, 0x5A, 0xE1, 0x0C, 0xFB, 0x84, 0xD7, + 0x6C, 0x04, 0x55, 0xDA, 0x24, 0xFB, 0xBC, 0xDC, 0xF7, 0xEB, 0xCC, 0xDC, + 0x72, 0xEA, 0xEC, 0xE1, 0x76, 0xE9, 0xDC, 0xDC, 0x20, 0xFD, 0xBD, 0xE8, + 0x46, 0x1C, 0x60, 0x09, 0xE2, 0x13, 0xAE, 0x09, 0x37, 0xEC, 0x82, 0xF0, + 0xDA, 0xE0, 0x37, 0xF3, 0xD8, 0xE5, 0x1E, 0x04, 0x96, 0xDE, 0x38, 0x02, + 0xC5, 0xE6, 0x11, 0x02, 0xD5, 0xFB, 0x61, 0x08, 0x96, 0x09, 0xAB, 0x10, + 0xE0, 0x0C, 0x93, 0x20, 0x54, 0x11, 0xFE, 0x34, 0xDF, 0x14, 0x19, 0x36, + 0x5D, 0x18, 0x51, 0x27, 0x8D, 0x22, 0xAA, 0x29, 0x03, 0x32, 0xAA, 0x39, + 0x3F, 0x3E, 0x6F, 0x39, 0xB2, 0x38, 0xD0, 0x25, 0x39, 0x28, 0x86, 0x21, + 0x51, 0x14, 0xEB, 0x21, 0x37, 0x04, 0x9E, 0x0E, 0x94, 0x08, 0xC0, 0x00, + 0x21, 0x1F, 0x5A, 0x0D, 0xED, 0x2D, 0x87, 0x20, 0x84, 0x2F, 0xA2, 0x2B, + 0x33, 0x2E, 0xB2, 0x29, 0x6F, 0x2C, 0xA4, 0x18, 0x7D, 0x23, 0x06, 0x07, + 0x7B, 0x1A, 0x7B, 0xFF, 0x8A, 0x1F, 0x3E, 0x05, 0x37, 0x27, 0x76, 0x0F, + 0x8E, 0x1E, 0xF4, 0x0B, 0x9A, 0x13, 0x18, 0x01, 0x6B, 0x21, 0x3B, 0x0F, + 0xB4, 0x24, 0xDD, 0x1B, 0xAB, 0x10, 0x72, 0x14, 0xFC, 0x09, 0x2F, 0x19, + 0x3A, 0x0F, 0x54, 0x1B, 0x0B, 0x0A, 0xE5, 0x09, 0xD1, 0xFF, 0xBD, 0x05, + 0x12, 0xE9, 0xE9, 0x03, 0x32, 0xC6, 0x91, 0xE8, 0x11, 0xC7, 0x41, 0xE3, + 0x91, 0xE0, 0x35, 0xFE, 0x6F, 0xDB, 0x82, 0xF8, 0xAF, 0xCE, 0xD1, 0xD9, + 0xBD, 0xDC, 0x6C, 0xDC, 0xD1, 0xE3, 0x28, 0xEA, 0x1B, 0xD6, 0x96, 0xE0, + 0xA5, 0xD1, 0x1B, 0xE2, 0x9D, 0xDE, 0xE1, 0xF4, 0xBB, 0xE8, 0x5A, 0xF7, + 0xAB, 0xEA, 0x66, 0xEF, 0x1D, 0xF3, 0x98, 0xED, 0xFE, 0xF7, 0x12, 0xE5, + 0xE5, 0xF6, 0x7B, 0xD7, 0x71, 0xF8, 0x93, 0xE2, 0x6B, 0xFD, 0x57, 0xFE, + 0x78, 0xF5, 0xF9, 0xFB, 0x54, 0xE0, 0xC8, 0xE8, 0x0C, 0xD5, 0x96, 0xE4, + 0xC5, 0xD2, 0x5C, 0xDE, 0x57, 0xD0, 0xB1, 0xCD, 0xE0, 0xD5, 0x0B, 0xC9, + 0x2D, 0xE4, 0xD8, 0xD2, 0x75, 0xEB, 0xE2, 0xD8, 0x29, 0xF5, 0x27, 0xE3, + 0x31, 0xFC, 0x98, 0xF0, 0x71, 0xF6, 0xD9, 0xF3, 0x37, 0xF4, 0xBF, 0xE8, + 0xDC, 0x00, 0x9E, 0xE1, 0x88, 0x0E, 0x36, 0xEA, 0x71, 0x0B, 0xB3, 0xEE, + 0x53, 0xF7, 0x53, 0xE9, 0x00, 0xEE, 0x2D, 0xF2, 0x6F, 0x05, 0x52, 0x05, + 0xD9, 0x17, 0x89, 0x04, 0xE3, 0x13, 0x52, 0x00, 0xFB, 0x14, 0xCB, 0x07, + 0x5C, 0x10, 0x45, 0xFE, 0xD6, 0xF3, 0x8F, 0xEC, 0xB9, 0xE1, 0x99, 0xFC, + 0x44, 0xDB, 0x61, 0x00, 0x19, 0xD7, 0xA6, 0xE5, 0x5E, 0xF4, 0x87, 0xF0, + 0x58, 0x15, 0xA6, 0x10, 0x65, 0x02, 0xB0, 0x0C, 0xE4, 0xEC, 0xD1, 0x02, + 0x74, 0xFD, 0x14, 0x16, 0x6E, 0xFB, 0x17, 0x1C, 0x30, 0xEA, 0x0F, 0x0B, + 0xAA, 0xF4, 0x13, 0x06, 0xB0, 0x0A, 0xA5, 0x0B, 0x72, 0x16, 0x9D, 0x10, + 0xD4, 0x14, 0xEC, 0x18, 0x9C, 0x0D, 0x94, 0x22, 0x1B, 0x07, 0x1A, 0x17, + 0x9E, 0x0F, 0xEA, 0x08, 0x4D, 0x25, 0xEE, 0x1C, 0x24, 0x32, 0xB6, 0x36, + 0xEA, 0x30, 0xC6, 0x2E, 0xD0, 0x28, 0x24, 0x1B, 0x45, 0x20, 0x5F, 0x12, + 0x57, 0x19, 0x00, 0x01, 0xFD, 0x0F, 0xC4, 0xEB, 0x69, 0x0A, 0x89, 0xEE, + 0xA7, 0x15, 0x66, 0x00, 0xBD, 0x2A, 0x09, 0x0E, 0xE4, 0x34, 0xC5, 0x12, + 0x76, 0x35, 0xC2, 0x17, 0x03, 0x2B, 0x4B, 0x1E, 0x41, 0x14, 0x10, 0x21, + 0x0E, 0x12, 0xFF, 0x27, 0x66, 0x21, 0x0F, 0x2A, 0x83, 0x20, 0x06, 0x29, + 0x5E, 0x12, 0xF2, 0x28, 0xCF, 0x13, 0x85, 0x2E, 0x20, 0x12, 0x44, 0x2C, + 0x83, 0xFC, 0xA0, 0x21, 0xAD, 0xEA, 0x76, 0x1E, 0x2D, 0xED, 0x93, 0x1B, + 0xF7, 0xF9, 0x97, 0x09, 0x3E, 0xFE, 0x7F, 0xF7, 0x5F, 0xF1, 0x5A, 0xF4, + 0xDD, 0xDA, 0x51, 0xE8, 0xDE, 0xD5, 0x75, 0xE0, 0x4E, 0xEE, 0xBB, 0xF3, + 0xE3, 0xFC, 0x45, 0x01, 0xAD, 0xE8, 0x70, 0xE9, 0xEA, 0xD8, 0x69, 0xD1, + 0xAA, 0xE4, 0xDC, 0xD0, 0xD1, 0xE9, 0xA8, 0xC6, 0x84, 0xD9, 0x0A, 0xBD, + 0xC7, 0xCE, 0x7B, 0xC8, 0x4B, 0xCE, 0x6E, 0xCE, 0xED, 0xCC, 0xC0, 0xCC, + 0x05, 0xD0, 0x27, 0xDC, 0xCA, 0xD3, 0xC8, 0xE6, 0x2C, 0xD1, 0x3A, 0xDB, + 0xC6, 0xD9, 0xA4, 0xD7, 0xFE, 0xF1, 0xE4, 0xE4, 0xAC, 0xFE, 0x7F, 0xEB, + 0x28, 0xF3, 0x46, 0xE5, 0x37, 0xE5, 0xDB, 0xE1, 0x7E, 0xE1, 0x20, 0xE2, + 0x8A, 0xDE, 0xC4, 0xD8, 0x70, 0xE8, 0x27, 0xCD, 0xA2, 0xFB, 0xB5, 0xCD, + 0x20, 0xFA, 0xF9, 0xD4, 0xD4, 0xF5, 0x6E, 0xE3, 0x82, 0x00, 0xDE, 0xF4, + 0xB4, 0x06, 0xD1, 0xFF, 0xCD, 0x04, 0xF6, 0x01, 0x77, 0x0D, 0x38, 0x02, + 0xBF, 0x14, 0x47, 0x03, 0xAA, 0x0F, 0xBD, 0x03, 0xFB, 0x01, 0x35, 0x08, + 0x2F, 0xF3, 0x44, 0x15, 0xEE, 0xF9, 0x4D, 0x23, 0x37, 0x09, 0xA7, 0x1E, + 0x24, 0x0B, 0x63, 0x18, 0xFA, 0x0B, 0xD1, 0x20, 0x58, 0x12, 0x82, 0x26, + 0xF0, 0x0F, 0xDF, 0x21, 0x08, 0x0A, 0x8D, 0x23, 0xB2, 0x00, 0xE4, 0x22, + 0x93, 0xF2, 0xD3, 0x14, 0x6C, 0xFE, 0x00, 0x15, 0x12, 0x27, 0x4F, 0x22, + 0x64, 0x2C, 0x6F, 0x17, 0x2C, 0x0C, 0xDB, 0x04, 0x7D, 0x07, 0x5B, 0x0D, + 0x9C, 0x0D, 0x26, 0x0C, 0x7E, 0x00, 0x3D, 0xF4, 0x84, 0xFF, 0x3B, 0xF5, + 0x3C, 0x0F, 0x33, 0x0E, 0xAA, 0x14, 0x0F, 0x16, 0xC1, 0x1D, 0x15, 0x13, + 0xCC, 0x2F, 0xAA, 0x17, 0x88, 0x2D, 0x7D, 0x12, 0x23, 0x21, 0x67, 0x0A, + 0x50, 0x28, 0x3E, 0x14, 0x71, 0x37, 0x8C, 0x1D, 0x17, 0x37, 0xA7, 0x11, + 0xCF, 0x31, 0xA2, 0x07, 0x0B, 0x2E, 0x07, 0x0E, 0x32, 0x1C, 0x80, 0x07, + 0xC9, 0x05, 0x02, 0xF6, 0xDB, 0x03, 0x6C, 0xF8, 0x64, 0x0C, 0xA1, 0x08, + 0x41, 0x13, 0x06, 0x15, 0xFD, 0x1A, 0x60, 0x1C, 0x51, 0x21, 0x94, 0x23, + 0xEC, 0x15, 0x37, 0x25, 0xBD, 0xF8, 0xC0, 0x1F, 0x40, 0xE8, 0x25, 0x1B, + 0x77, 0xEA, 0xDF, 0x16, 0xC0, 0xF1, 0xA8, 0x13, 0x13, 0xF6, 0x0B, 0x15, + 0x5B, 0xFF, 0x73, 0x1C, 0x8D, 0x03, 0xC7, 0x1A, 0xEC, 0xFC, 0x81, 0x0E, + 0xB9, 0xF8, 0xAC, 0x0C, 0xD7, 0xF6, 0x36, 0x16, 0x2C, 0xEA, 0xCA, 0x0E, + 0x38, 0xDF, 0x3B, 0xF8, 0xDD, 0xE2, 0x79, 0xE5, 0xAB, 0xDC, 0xDF, 0xCE, + 0x4A, 0xD5, 0x90, 0xC2, 0x1B, 0xE5, 0x97, 0xD3, 0x52, 0xE5, 0xA5, 0xD6, + 0xF7, 0xC1, 0xCE, 0xBA, 0x1D, 0xB5, 0xE0, 0xB8, 0xDA, 0xC4, 0x1B, 0xCD, + 0x2E, 0xC6, 0xA9, 0xCB, 0xE3, 0xC0, 0x71, 0xBF, 0xB1, 0xCC, 0x3C, 0xC4, + 0x3C, 0xD8, 0xDE, 0xCA, 0x3F, 0xDB, 0x9A, 0xCB, 0xD3, 0xE5, 0x07, 0xD6, + 0x24, 0xEA, 0xE5, 0xDF, 0xFE, 0xE2, 0xC1, 0xDB, 0x5E, 0xF4, 0x1A, 0xE0, + 0xB0, 0x17, 0xE5, 0xF3, 0xF5, 0x1A, 0xE0, 0xF3, 0x12, 0x05, 0x5F, 0xE2, + 0x29, 0xFF, 0x31, 0xE5, 0xD3, 0x00, 0x51, 0xF4, 0xA9, 0xFB, 0xB6, 0xEC, + 0x10, 0x02, 0x7C, 0xE0, 0x3C, 0x0F, 0x95, 0xE7, 0x28, 0x10, 0x06, 0xF5, + 0x52, 0x0D, 0x74, 0x00, 0x27, 0x11, 0x5D, 0x11, 0xC5, 0x0E, 0x01, 0x1E, + 0xED, 0xFF, 0x9F, 0x17, 0xFD, 0xFF, 0xDB, 0x18, 0x03, 0x0B, 0x6A, 0x1F, + 0x85, 0x0F, 0x11, 0x1C, 0x4F, 0x11, 0x9B, 0x1B, 0xC9, 0x1A, 0x70, 0x34, + 0xF4, 0x1C, 0xD0, 0x4E, 0xB0, 0x10, 0x6C, 0x48, 0x6E, 0x18, 0x87, 0x3B, + 0xE9, 0x2E, 0xD0, 0x3B, 0xB7, 0x2D, 0x65, 0x37, 0x1A, 0x1A, 0x04, 0x28, + 0x16, 0x0E, 0x8D, 0x1E, 0x1E, 0xF8, 0x88, 0x08, 0x96, 0xEB, 0x40, 0xF6, + 0x64, 0x02, 0x5D, 0x08, 0x5C, 0x0F, 0x72, 0x18, 0xD5, 0xFC, 0x89, 0x01, + 0x34, 0xFD, 0x47, 0xF4, 0x54, 0x0D, 0x26, 0x02, 0x3D, 0x05, 0xED, 0xF9, + 0x9E, 0xFC, 0x0D, 0xE7, 0x80, 0x04, 0x0E, 0xEA, 0x94, 0x09, 0xFC, 0xEF, + 0x86, 0x10, 0x39, 0xEB, 0x36, 0x29, 0x37, 0xFB, 0xE7, 0x2F, 0x7B, 0x09, + 0x0F, 0x1A, 0x4B, 0xFD, 0xE3, 0x14, 0x7F, 0x02, 0x4D, 0x27, 0x4A, 0x22, + 0xDC, 0x2D, 0x5C, 0x2D, 0xAE, 0x26, 0x1C, 0x24, 0xD5, 0x27, 0xE2, 0x27, + 0x41, 0x26, 0x6F, 0x26, 0x65, 0x0F, 0x97, 0x12, 0xB0, 0xF2, 0xAD, 0x04, + 0x6F, 0xE2, 0x46, 0x04, 0x39, 0xDC, 0xB7, 0x04, 0x33, 0xE5, 0xDE, 0x0B, + 0x17, 0xFE, 0xF9, 0x19, 0x0A, 0x0C, 0x1E, 0x1E, 0x6D, 0xFF, 0x94, 0x0D, + 0x28, 0xFC, 0x2B, 0x01, 0x7C, 0x06, 0x3F, 0x0B, 0xBB, 0xFF, 0x3D, 0x19, + 0xA1, 0xF1, 0x53, 0x15, 0x53, 0xF8, 0x2E, 0x0C, 0x11, 0x0D, 0x69, 0x12, + 0x54, 0x12, 0xAE, 0x0D, 0x2E, 0x15, 0xC8, 0x02, 0xAA, 0x14, 0xF4, 0x01, + 0xDB, 0x00, 0x88, 0xF7, 0xD9, 0xEB, 0xB8, 0xE6, 0xFE, 0xDE, 0x52, 0xE4, + 0x6E, 0xC9, 0xB4, 0xDD, 0x15, 0xBB, 0x0E, 0xCD, 0xDE, 0xCC, 0xA7, 0xD7, + 0xBF, 0xDA, 0x82, 0xE5, 0x7A, 0xD0, 0x63, 0xD0, 0x93, 0xCE, 0xFC, 0xBD, + 0x3F, 0xD2, 0x28, 0xC2, 0xDC, 0xC3, 0x58, 0xBE, 0xB9, 0xBC, 0xD2, 0xB5, + 0xFF, 0xCF, 0x3B, 0xBB, 0x1B, 0xE3, 0x2E, 0xBD, 0x63, 0xE5, 0x9C, 0xB8, + 0xED, 0xEC, 0xBD, 0xC5, 0xE1, 0xF1, 0xBB, 0xD5, 0x84, 0xE6, 0x8F, 0xD4, + 0x57, 0xEF, 0x5D, 0xE0, 0x1A, 0x0F, 0x37, 0xFA, 0xB3, 0x1C, 0xE6, 0x03, + 0xA1, 0x17, 0xE4, 0x02, 0x10, 0x1A, 0x3A, 0x0C, 0xAB, 0x14, 0x08, 0x16, + 0x7C, 0xFA, 0x66, 0x0A, 0x5F, 0xEB, 0xF1, 0xFC, 0x9B, 0xEA, 0x75, 0xFD, + 0x92, 0xE7, 0x3B, 0x00, 0xBC, 0xF6, 0x54, 0x04, 0x7B, 0x14, 0xEE, 0x15, + 0x40, 0x1A, 0xC0, 0x2C, 0x95, 0x0C, 0xFE, 0x35, 0xC2, 0x0C, 0x00, 0x38, + 0x2D, 0x16, 0x06, 0x37, 0x76, 0x1C, 0xB4, 0x2F, 0x05, 0x21, 0xF5, 0x29, + 0xF8, 0x25, 0x88, 0x34, 0x05, 0x2C, 0x9A, 0x3E, 0x33, 0x31, 0x95, 0x39, + 0x7B, 0x32, 0x39, 0x39, 0x5D, 0x2F, 0xAC, 0x41, 0x6E, 0x25, 0x3B, 0x3B, + 0xE8, 0x1F, 0x10, 0x2E, 0x42, 0x1D, 0x3F, 0x22, 0x14, 0x0C, 0x9B, 0x08, + 0xF3, 0x00, 0x47, 0xFB, 0x2E, 0x11, 0x98, 0x0A, 0x80, 0x16, 0xFA, 0x0B, + 0x57, 0x06, 0x1F, 0xFA, 0x21, 0x09, 0xF2, 0xF5, 0x26, 0x1A, 0x12, 0xF5, + 0x1A, 0x12, 0x56, 0xE1, 0xB0, 0x00, 0x50, 0xD2, 0x66, 0x00, 0x50, 0xD9, + 0x8A, 0xF9, 0xB8, 0xE2, 0x67, 0xFC, 0xA0, 0xF3, 0x30, 0x19, 0xEF, 0x0D, + 0xCB, 0x25, 0x6A, 0x18, 0x8F, 0x1B, 0xD3, 0x15, 0xD5, 0x1D, 0x81, 0x1B, + 0x8A, 0x1F, 0xA9, 0x25, 0x9B, 0x09, 0xF7, 0x23, 0x98, 0xFA, 0x5D, 0x1C, + 0x81, 0xFE, 0xF1, 0x20, 0xD2, 0xFA, 0xEA, 0x23, 0x28, 0xF0, 0x4E, 0x0F, + 0x95, 0xEE, 0x4B, 0xF3, 0xB4, 0xF1, 0x5F, 0xF0, 0xDC, 0xF1, 0x0B, 0xFA, + 0x5B, 0xF5, 0xCF, 0x02, 0x50, 0xFA, 0xAF, 0x12, 0x0C, 0xF9, 0xC2, 0x18, + 0x9E, 0xFE, 0xDF, 0x11, 0xF7, 0x04, 0xB5, 0x07, 0x7B, 0x00, 0x5B, 0xFB, + 0xB1, 0xF9, 0x04, 0xE7, 0x81, 0xF8, 0xEE, 0xDC, 0x92, 0xF6, 0xDF, 0xE6, + 0xD9, 0xEB, 0xE4, 0xF0, 0x18, 0xE9, 0x7B, 0xF8, 0x58, 0xF1, 0x64, 0x00, + 0xFF, 0xF3, 0x61, 0x01, 0xF0, 0xEC, 0xA8, 0xF7, 0xA2, 0xE9, 0xAD, 0xEB, + 0xC8, 0xD9, 0xB0, 0xCF, 0x48, 0xBF, 0x4F, 0xB6, 0xCC, 0xBE, 0x85, 0xC2, + 0xA0, 0xCE, 0x61, 0xD9, 0x2E, 0xD6, 0x02, 0xD7, 0x68, 0xE1, 0x00, 0xCE, + 0x67, 0xF0, 0x67, 0xCF, 0x56, 0xE3, 0x66, 0xC6, 0xBB, 0xC6, 0x5A, 0xB5, + 0x69, 0xC4, 0x50, 0xB4, 0xCE, 0xCD, 0x01, 0xB7, 0x10, 0xD3, 0x88, 0xB7, + 0x2E, 0xEB, 0x67, 0xD0, 0x7A, 0x06, 0x24, 0xEC, 0xCA, 0x09, 0x4E, 0xEE, + 0xC3, 0x08, 0x7E, 0xF5, 0xD3, 0x0B, 0x22, 0x0E, 0x21, 0x08, 0x43, 0x1B, + 0xE1, 0x06, 0x1A, 0x17, 0xEF, 0x0C, 0x58, 0x11, 0x90, 0x0D, 0x88, 0x0A, + 0x8F, 0x08, 0x58, 0x0A, 0x34, 0x04, 0xA7, 0x13, 0xFE, 0xFD, 0xA2, 0x16, + 0x5C, 0xFF, 0xE4, 0x19, 0x44, 0x0E, 0xB1, 0x28, 0xB7, 0x21, 0xDF, 0x35, + 0x9C, 0x2D, 0x77, 0x37, 0x38, 0x2A, 0x64, 0x33, 0x3B, 0x27, 0x0C, 0x2F, + 0xB7, 0x20, 0x4D, 0x23, 0x73, 0x18, 0x3E, 0x1F, 0xA9, 0x11, 0x79, 0x1C, + 0x43, 0x17, 0xCF, 0x18, 0xB7, 0x23, 0xEE, 0x24, 0xA3, 0x2A, 0x72, 0x34, + 0xE4, 0x37, 0x99, 0x38, 0x13, 0x3F, 0x46, 0x34, 0x1B, 0x37, 0x92, 0x30, + 0xF0, 0x2C, 0x52, 0x29, 0xEB, 0x1E, 0x80, 0x13, 0x94, 0x09, 0x40, 0xF5, + 0xB7, 0x0C, 0x76, 0xEA, 0x99, 0x1E, 0x27, 0xF6, 0xDD, 0x15, 0xA7, 0xFA, + 0x92, 0x02, 0x66, 0xF3, 0x48, 0x01, 0xC7, 0xF3, 0xBA, 0xFE, 0x4A, 0xF7, + 0x8A, 0xF1, 0x3F, 0xF0, 0xDC, 0xF1, 0xC7, 0xEC, 0x17, 0xF6, 0x28, 0xEF, + 0x3B, 0xF2, 0xFE, 0xEE, 0x21, 0xF1, 0xD5, 0xF5, 0x80, 0xF0, 0x73, 0x00, + 0x75, 0xEC, 0x44, 0x05, 0x66, 0xEF, 0x28, 0x0E, 0x73, 0xF6, 0x7B, 0x1B, + 0xBC, 0xF7, 0xF4, 0x18, 0x05, 0xFF, 0xED, 0x0E, 0xFD, 0x08, 0xEE, 0x0B, + 0x07, 0x07, 0x00, 0x09, 0x46, 0xFD, 0x04, 0x09, 0x9B, 0xEE, 0x4B, 0x08, + 0x02, 0xE5, 0x62, 0xFE, 0xE8, 0xEC, 0x1C, 0xFB, 0x95, 0xF9, 0x9D, 0x04, + 0xC6, 0x05, 0xB5, 0x07, 0x7B, 0x17, 0x32, 0x01, 0x94, 0x18, 0x6C, 0xFB, + 0xD1, 0x0A, 0x72, 0xFD, 0xAC, 0xF7, 0xA6, 0xF2, 0x25, 0xE8, 0xBC, 0xE1, + 0x4E, 0xD8, 0xC4, 0xD8, 0x26, 0xD6, 0x82, 0xE1, 0xF4, 0xE4, 0x1C, 0xF1, + 0x1F, 0xF3, 0x72, 0xF2, 0x99, 0x01, 0xC7, 0xF4, 0x39, 0xFB, 0x34, 0xF6, + 0x88, 0xE8, 0x0E, 0xF0, 0x2D, 0xE7, 0x14, 0xEC, 0x3B, 0xEA, 0x65, 0xE2, + 0x5B, 0xD9, 0xB9, 0xC5, 0x9E, 0xD7, 0x16, 0xBB, 0x0F, 0xEC, 0x7F, 0xD0, + 0xB9, 0xE6, 0x59, 0xD0, 0x4E, 0xD8, 0x6C, 0xC2, 0xDA, 0xDA, 0x5C, 0xD0, + 0x3F, 0xD9, 0x90, 0xD9, 0xCF, 0xD7, 0x58, 0xCA, 0x8A, 0xE3, 0x45, 0xC5, + 0x76, 0xE6, 0xDB, 0xC9, 0x52, 0xDD, 0x16, 0xC8, 0xC7, 0xE0, 0xB2, 0xDA, + 0x4B, 0xEA, 0x36, 0xF7, 0x78, 0xE5, 0xFA, 0xF7, 0xAB, 0xE6, 0xAA, 0xF6, + 0x33, 0xFA, 0xDA, 0x07, 0x6A, 0x0A, 0x25, 0x0E, 0xEB, 0x0D, 0x00, 0x0E, + 0xA0, 0x08, 0x77, 0x1C, 0x48, 0x04, 0x61, 0x22, 0xE6, 0x05, 0x38, 0x1C, + 0x79, 0x04, 0xA6, 0x20, 0x17, 0xFF, 0x3A, 0x21, 0xF0, 0x08, 0x74, 0x18, + 0x76, 0x1B, 0x38, 0x19, 0x6A, 0x24, 0x6A, 0x22, 0x25, 0x28, 0x8C, 0x2B, + 0xE2, 0x23, 0x81, 0x2C, 0xE8, 0x24, 0xA6, 0x2B, 0xC4, 0x2A, 0xDB, 0x2A, + 0xCC, 0x25, 0x6B, 0x28, 0x5B, 0x1D, 0x1D, 0x21, 0x6F, 0x24, 0x47, 0x1D, + 0x2B, 0x32, 0x70, 0x2A, 0xE5, 0x32, 0x63, 0x35, 0xA5, 0x38, 0xA1, 0x36, + 0x96, 0x44, 0xDA, 0x36, 0x1C, 0x47, 0xAD, 0x2B, 0x0D, 0x42, 0x30, 0x16, + 0x5A, 0x37, 0x66, 0x0C, 0x8D, 0x18, 0x57, 0xFC, 0x74, 0x01, 0xF7, 0xE7, + 0x7A, 0x09, 0xDD, 0xEE, 0xC2, 0x10, 0xC6, 0x00, 0x2A, 0x0E, 0xBB, 0x04, + 0xFF, 0x17, 0x6A, 0x0B, 0xEA, 0x19, 0x86, 0x10, 0xC7, 0xFD, 0x31, 0xFF, + 0xAC, 0xE3, 0x58, 0xEC, 0xDB, 0xD6, 0x41, 0xEA, 0x89, 0xC9, 0x22, 0xE8, + 0x91, 0xC2, 0xC5, 0xEA, 0x2F, 0xCC, 0x97, 0xF9, 0x3D, 0xDC, 0x77, 0xF7, + 0x3B, 0xE8, 0x0D, 0xEB, 0x3C, 0xEB, 0xE5, 0xF0, 0x27, 0xE5, 0x1F, 0xF9, + 0x65, 0xE3, 0x09, 0xF9, 0x95, 0xE4, 0xBE, 0xFB, 0x04, 0xE3, 0x5D, 0xFC, + 0x5D, 0xE3, 0x24, 0xF4, 0xB5, 0xEC, 0xF1, 0xE9, 0x14, 0xF2, 0xF8, 0xE1, + 0x2D, 0xEC, 0x0B, 0xE0, 0xAB, 0xE7, 0x9D, 0xE0, 0xE4, 0xF2, 0x55, 0xE5, + 0x79, 0x05, 0x41, 0xF6, 0xAE, 0xFD, 0x19, 0xFE, 0x09, 0xF3, 0xE1, 0x00, + 0x3C, 0xF9, 0xD9, 0x02, 0x27, 0x01, 0x1B, 0x00, 0x91, 0xF7, 0x88, 0xF2, + 0xB4, 0xED, 0xB6, 0xEA, 0x11, 0xF4, 0x0C, 0xF8, 0x65, 0xFA, 0x60, 0x00, + 0xB1, 0x0A, 0xD6, 0x09, 0xD9, 0x1A, 0xD4, 0x16, 0x00, 0x1A, 0x67, 0x13, + 0x9E, 0x11, 0xCC, 0xFE, 0x56, 0x0B, 0x61, 0xEC, 0x2A, 0xEE, 0xB7, 0xD4, + 0x5A, 0xCE, 0xFF, 0xC3, 0x58, 0xDB, 0x95, 0xD5, 0x58, 0xF8, 0x86, 0xEB, + 0x1B, 0x02, 0x3B, 0xEA, 0xD9, 0x0A, 0x3E, 0xED, 0xAE, 0x10, 0x72, 0xF7, + 0x32, 0xFF, 0x9A, 0xEE, 0x1E, 0xE6, 0x5D, 0xE3, 0xCB, 0xD8, 0xD6, 0xE6, + 0x72, 0xD8, 0x84, 0xE5, 0x6E, 0xE3, 0xBD, 0xE8, 0x7D, 0xF3, 0xF4, 0x03, + 0x52, 0xFA, 0x9D, 0x14, 0xEB, 0xFD, 0xBC, 0x0F, 0x11, 0x0E, 0x8E, 0x1A, + 0xE7, 0x12, 0xFE, 0x2C, 0xE6, 0x0B, 0x05, 0x35, 0x97, 0x17, 0xB0, 0x37, + 0x79, 0x26, 0xCF, 0x33, 0x1C, 0x21, 0xD4, 0x2E, 0x2A, 0x15, 0xEF, 0x24, + 0xD7, 0x0D, 0x8B, 0x12, 0x00, 0x0C, 0x7A, 0x09, 0xAF, 0x10, 0xFA, 0x14, + 0x30, 0x18, 0x8E, 0x26, 0xE8, 0x20, 0xD8, 0x2B, 0xCB, 0x2B, 0x0F, 0x2C, + 0xEE, 0x32, 0x1F, 0x2B, 0x2C, 0x2E, 0x37, 0x22, 0x86, 0x20, 0x18, 0x1B, + 0xE5, 0x0E, 0xBC, 0x0F, 0xB4, 0x10, 0xE6, 0x06, 0xBB, 0x20, 0xB8, 0x09, + 0x11, 0x29, 0xF0, 0x0C, 0x50, 0x37, 0x3B, 0x13, 0x9B, 0x47, 0x5B, 0x19, + 0x58, 0x3C, 0x76, 0x14, 0x37, 0x1E, 0x4D, 0x0B, 0x38, 0x0C, 0x8F, 0xFE, + 0x7E, 0xFE, 0x12, 0xE5, 0x89, 0xF8, 0xA6, 0xDE, 0xC3, 0x05, 0xF9, 0xF7, + 0x8A, 0x06, 0xD7, 0xFF, 0xDB, 0xEF, 0x53, 0xEE, 0x38, 0xE8, 0xE8, 0xF4, + 0xBA, 0xE4, 0x71, 0xFF, 0x19, 0xC4, 0xB6, 0xE4, 0xAB, 0xAE, 0xB9, 0xD2, + 0x3C, 0xB5, 0x9D, 0xD2, 0x1A, 0xBA, 0xA0, 0xC9, 0x5A, 0xC5, 0xDD, 0xCC, + 0x2F, 0xDB, 0x79, 0xE0, 0x0D, 0xDA, 0x5B, 0xEB, 0x8E, 0xCF, 0x61, 0xF3, + 0x22, 0xDA, 0xA4, 0x01, 0x20, 0xEB, 0x43, 0x08, 0xE2, 0xF4, 0xD4, 0x02, + 0xD1, 0xF9, 0xDB, 0x00, 0x18, 0xFE, 0xE0, 0xFD, 0x9C, 0xFA, 0x47, 0xEB, + 0xCA, 0xE9, 0xBB, 0xD9, 0xF4, 0xD5, 0x15, 0xD3, 0x1C, 0xCF, 0xFC, 0xDC, + 0xAF, 0xDC, 0xCD, 0xF1, 0x39, 0xFE, 0x70, 0x04, 0xC6, 0x18, 0xA9, 0x0F, + 0x19, 0x17, 0x95, 0x11, 0x6D, 0x0C, 0xD3, 0x13, 0x57, 0x01, 0x5D, 0x0C, + 0x0F, 0xF9, 0x36, 0xFB, 0x4D, 0xF7, 0xFF, 0xF5, 0x5F, 0x03, 0x99, 0x06, + 0xE1, 0x17, 0xDE, 0x12, 0x58, 0x2F, 0xDA, 0x0F, 0xDC, 0x40, 0x08, 0x15, + 0xE7, 0x34, 0x2D, 0x1B, 0x67, 0x19, 0xA9, 0x0F, 0x70, 0x13, 0x05, 0x07, + 0x35, 0x12, 0x3A, 0xFA, 0x8C, 0xFD, 0xED, 0xD9, 0xB6, 0xFB, 0x18, 0xD3, + 0x35, 0x0E, 0xEA, 0xEC, 0x59, 0x09, 0x80, 0xF2, 0x99, 0xFA, 0xB1, 0xE9, + 0xC1, 0xF8, 0xC0, 0xF5, 0x62, 0xF1, 0xD7, 0xFA, 0xDC, 0xDC, 0x1E, 0xEA, + 0x0B, 0xD6, 0x0B, 0xE5, 0x97, 0xD3, 0x50, 0xDA, 0xDD, 0xD0, 0x50, 0xD1, + 0x88, 0xE5, 0x42, 0xED, 0xD2, 0xF4, 0xB2, 0x09, 0x3D, 0xF4, 0x94, 0x16, + 0xB4, 0x06, 0xC7, 0x28, 0xE6, 0x1C, 0x9F, 0x36, 0xC4, 0x23, 0x5A, 0x39, + 0x61, 0x26, 0x46, 0x38, 0xC6, 0x2C, 0x28, 0x3A, 0x77, 0x27, 0x34, 0x30, + 0x4E, 0x0C, 0x75, 0x1D, 0x4F, 0xF6, 0x47, 0x11, 0xCE, 0xF2, 0x4A, 0x05, + 0x3A, 0xF9, 0x91, 0xFC, 0xF5, 0x01, 0x30, 0xFF, 0xA6, 0x11, 0x12, 0x18, + 0xCD, 0x19, 0x5A, 0x27, 0x62, 0x1D, 0x76, 0x23, 0x53, 0x24, 0x28, 0x1F, + 0x3A, 0x1D, 0x8A, 0x12, 0xE9, 0x0E, 0x43, 0x01, 0x03, 0x0F, 0x90, 0xF7, + 0x57, 0x23, 0xD5, 0x02, 0x91, 0x2E, 0x19, 0x0F, 0x29, 0x2A, 0x1B, 0x12, + 0x36, 0x2F, 0x2C, 0x1F, 0x67, 0x41, 0x55, 0x2C, 0xFB, 0x40, 0x11, 0x21, + 0xF1, 0x2E, 0xC4, 0x0F, 0x65, 0x14, 0x89, 0x01, 0xE6, 0xF3, 0xDC, 0xE9, + 0x33, 0xEF, 0x07, 0xE5, 0xFF, 0xFB, 0x5C, 0x01, 0xF4, 0xF2, 0x28, 0x09, + 0xB7, 0xE0, 0x9F, 0xFD, 0x77, 0xE0, 0xBE, 0x02, 0x86, 0xDE, 0xB7, 0xF4, + 0x8C, 0xCE, 0x88, 0xD1, 0xDE, 0xC4, 0x5B, 0xC3, 0xF1, 0xB9, 0xB2, 0xC6, + 0x46, 0xAE, 0x9D, 0xCA, 0x42, 0xC0, 0x66, 0xD9, 0xF1, 0xD7, 0x96, 0xEA, + 0xA4, 0xD3, 0x3F, 0xEE, 0x3B, 0xDF, 0xB2, 0xF5, 0xB0, 0x01, 0xBE, 0xFD, + 0xEF, 0x0E, 0x5E, 0xF7, 0x03, 0x0F, 0xB6, 0xF8, 0x0D, 0x0B, 0x4E, 0xFD, + 0x48, 0xF3, 0xDC, 0xF1, 0x9F, 0xDF, 0x22, 0xEC, 0x9B, 0xE1, 0x89, 0xE5, + 0x02, 0xE4, 0x38, 0xDE, 0xDB, 0xE1, 0x74, 0xE8, 0xF1, 0xE6, 0x87, 0xF4, + 0xC9, 0xFA, 0x27, 0xFE, 0x7A, 0x0A, 0xBE, 0x0C, 0xFD, 0x03, 0xAC, 0x14, + 0x10, 0xFE, 0x47, 0x09, 0x71, 0x03, 0xF6, 0xFC, 0x27, 0x01, 0x7B, 0xF6, + 0x9A, 0xFE, 0xB7, 0xEA, 0x86, 0x06, 0xC2, 0xED, 0xD8, 0x0B, 0x31, 0xFF, + 0x97, 0x13, 0xE8, 0x09, 0xED, 0x27, 0xB8, 0x1B, 0xE7, 0x3C, 0xB1, 0x27, + 0x50, 0x35, 0x3D, 0x14, 0xF1, 0x14, 0x49, 0xFA, 0xE6, 0xF3, 0x34, 0xDF, + 0x1B, 0xE6, 0x34, 0xCD, 0x1E, 0xFB, 0x1D, 0xE6, 0x57, 0x0B, 0x24, 0x07, + 0xC3, 0xFA, 0xA4, 0x06, 0x2D, 0x03, 0x54, 0x06, 0xD6, 0x18, 0xA2, 0x0C, + 0x4A, 0x03, 0xBC, 0xFD, 0xA2, 0xE9, 0x01, 0xEF, 0xC5, 0xDB, 0x8C, 0xF4, + 0x6D, 0xD2, 0xE6, 0xF5, 0xE2, 0xDD, 0xF5, 0xFF, 0xA7, 0xF5, 0x4F, 0x17, + 0xD5, 0x0C, 0x10, 0x16, 0x1B, 0x13, 0x78, 0x1C, 0xBF, 0x09, 0x6D, 0x2E, + 0xCE, 0x09, 0x1C, 0x25, 0xA3, 0x18, 0xFB, 0x14, 0x85, 0x15, 0x4E, 0x15, + 0x40, 0x03, 0xFA, 0x13, 0x52, 0x0F, 0x1A, 0x07, 0x46, 0x1C, 0xBC, 0x07, + 0x24, 0xFC, 0x06, 0x0D, 0x40, 0xE2, 0x38, 0x03, 0x4A, 0xF6, 0x36, 0xFF, + 0xAC, 0x03, 0x5D, 0x06, 0x73, 0x00, 0x46, 0x13, 0xB8, 0x1E, 0x28, 0x21, + 0x87, 0x38, 0x3C, 0x18, 0x53, 0x2A, 0xBC, 0x07, 0x9F, 0x12, 0x31, 0xFB, + 0x28, 0x01, 0x94, 0xF2, 0xAA, 0x11, 0x2D, 0xFE, 0xED, 0x2D, 0x2B, 0x0D, + 0x6B, 0x2F, 0x57, 0x1C, 0x78, 0x3D, 0xE3, 0x27, 0xD1, 0x45, 0xB4, 0x1F, + 0x41, 0x26, 0x64, 0x0B, 0x1A, 0x0B, 0x6F, 0xFD, 0x1E, 0xF8, 0xC6, 0xFB, + 0x18, 0xDD, 0xF5, 0xEB, 0x3C, 0xDA, 0x43, 0xE9, 0xEE, 0xE5, 0x23, 0x08, + 0x4D, 0xDD, 0x95, 0x06, 0x73, 0xDE, 0x8F, 0xF3, 0xC5, 0xF2, 0x2C, 0xEF, + 0xCC, 0xEB, 0xA8, 0xEE, 0x36, 0xCF, 0x61, 0xE6, 0xD0, 0xCB, 0x6F, 0xCF, + 0x8D, 0xCE, 0xDE, 0xCF, 0xA6, 0xCF, 0x71, 0xDC, 0x04, 0xEB, 0xDD, 0xDD, + 0xC0, 0xFD, 0x7C, 0xEA, 0x53, 0xEE, 0xE8, 0xF5, 0x48, 0xEC, 0xC3, 0xF1, + 0x63, 0xFD, 0x83, 0xF2, 0xFD, 0xF9, 0x05, 0xF9, 0xEF, 0xF1, 0x25, 0xED, + 0x60, 0xF3, 0xB7, 0xEC, 0xBB, 0xF7, 0xFC, 0xFD, 0x61, 0xF3, 0xB6, 0xF0, + 0x29, 0xD7, 0x91, 0xE3, 0x25, 0xC2, 0x8D, 0xE8, 0xF9, 0xD3, 0xFD, 0xEB, + 0x2F, 0xEC, 0xCE, 0x07, 0xFB, 0xFD, 0x27, 0x1C, 0x5F, 0x15, 0x90, 0x17, + 0x68, 0x21, 0xA3, 0x25, 0xDC, 0x2B, 0xA8, 0x22, 0xB9, 0x2E, 0xA7, 0x16, + 0x1B, 0x11, 0x02, 0x15, 0xAB, 0x09, 0x2C, 0x05, 0x0B, 0x19, 0x56, 0x00, + 0xBA, 0x21, 0x1E, 0x05, 0x0E, 0x3B, 0x39, 0x0B, 0x8C, 0x4F, 0x18, 0x18, + 0xBD, 0x47, 0x56, 0x1F, 0x56, 0x21, 0xC0, 0x28, 0x73, 0xFD, 0x21, 0x25, + 0x8C, 0xF6, 0xD1, 0xF6, 0x61, 0xF6, 0x4D, 0xDD, 0x54, 0xF6, 0x70, 0xF2, + 0x53, 0x06, 0x16, 0xF6, 0xFC, 0x0A, 0xC5, 0xE6, 0x68, 0xFB, 0x73, 0xF9, + 0x82, 0xF2, 0xF0, 0x07, 0x0E, 0xE6, 0xB5, 0xEA, 0xEC, 0xDD, 0xDE, 0xDD, + 0x1F, 0xD9, 0xC7, 0xE3, 0x66, 0xCB, 0xC4, 0xDC, 0x1F, 0xE6, 0xF1, 0xE6, + 0xF0, 0x14, 0x4A, 0x00, 0x47, 0xFF, 0xB0, 0xFF, 0x4D, 0xDC, 0xF5, 0xFB, + 0xC3, 0xEC, 0xB3, 0x11, 0x24, 0xF6, 0x15, 0x24, 0xB9, 0xF2, 0x27, 0x14, + 0x70, 0x03, 0x44, 0x02, 0x8F, 0x08, 0xFB, 0x00, 0xB7, 0xF3, 0x54, 0xFC, + 0xE6, 0xD5, 0xDB, 0xF7, 0x71, 0xC6, 0x2B, 0xF2, 0xBD, 0xD6, 0x72, 0xEF, + 0x7D, 0xEF, 0x12, 0xEF, 0xA3, 0xF6, 0xD1, 0xEE, 0x05, 0x06, 0x02, 0xF1, + 0xEA, 0x29, 0xD8, 0xF6, 0xBC, 0x2E, 0xAB, 0x01, 0x79, 0x28, 0x06, 0x07, + 0x11, 0x1A, 0x3A, 0xFA, 0x28, 0x04, 0x5F, 0xF1, 0x80, 0x1E, 0x0F, 0x04, + 0x03, 0x39, 0xD7, 0x22, 0xB4, 0x2D, 0x94, 0x2D, 0x77, 0x2B, 0x27, 0x26, + 0xF0, 0x39, 0x05, 0x26, 0xE7, 0x2E, 0xAC, 0x1A, 0x86, 0x0E, 0x25, 0x0A, + 0x9D, 0xEA, 0xE6, 0xFF, 0x75, 0xC5, 0xE4, 0xEF, 0xD5, 0xD4, 0x32, 0xF0, + 0x90, 0x04, 0x4F, 0xF8, 0x15, 0xF6, 0x50, 0xF5, 0x38, 0xCE, 0x92, 0xFE, + 0x78, 0xCD, 0xCE, 0x07, 0xB3, 0xD1, 0xC5, 0xFF, 0x22, 0xCC, 0x57, 0xED, + 0x98, 0xD2, 0x9D, 0xE2, 0x7F, 0xD1, 0x6D, 0xE5, 0x88, 0xCF, 0x46, 0xEB, + 0xF2, 0xF1, 0xE5, 0xF2, 0x52, 0x11, 0x2C, 0xEA, 0xBA, 0x0E, 0xC7, 0xE9, + 0xD1, 0x08, 0x1F, 0xF5, 0x2B, 0x08, 0x4C, 0xF9, 0x5C, 0x03, 0xD5, 0x0E, + 0x3B, 0x07, 0x24, 0x16, 0xED, 0x0B, 0x30, 0x0D, 0xCC, 0x09, 0x8B, 0x05, + 0xE9, 0x0A, 0xEC, 0xF0, 0x3A, 0xF3, 0x0D, 0xE0, 0x4C, 0xE3, 0x13, 0xE4, + 0x02, 0x00, 0x5A, 0xF9, 0xE1, 0x13, 0x0D, 0x08, 0x27, 0x0C, 0x6D, 0x09, + 0xC2, 0x1A, 0xE7, 0x20, 0x36, 0x32, 0x8A, 0x34, 0x42, 0x21, 0x08, 0x2A, + 0xD1, 0x03, 0x57, 0x12, 0xAD, 0x07, 0x22, 0xFD, 0xEF, 0x21, 0xF2, 0x0E, + 0x2F, 0x29, 0x65, 0x24, 0x83, 0x2D, 0x22, 0x23, 0x4A, 0x3A, 0x3F, 0x2C, + 0x6F, 0x4A, 0xEE, 0x2D, 0x88, 0x49, 0x91, 0x1D, 0x13, 0x27, 0xD2, 0x18, + 0x5E, 0x0C, 0x67, 0x0C, 0x4A, 0xF7, 0x25, 0xF0, 0x85, 0xED, 0xB6, 0xF8, + 0xDA, 0x06, 0xD5, 0x11, 0xD1, 0x07, 0xC3, 0xFF, 0xDE, 0xEF, 0x98, 0xE9, + 0x4F, 0x00, 0xF3, 0xF5, 0x75, 0x11, 0x1E, 0xFD, 0xFB, 0xF5, 0x2D, 0xF2, + 0x51, 0xEA, 0xC5, 0xEF, 0xE3, 0xF4, 0x50, 0x00, 0x49, 0x01, 0xF5, 0x12, + 0xE1, 0x17, 0x6D, 0x1D, 0xAF, 0x0D, 0x7D, 0x27, 0x29, 0xFE, 0xCD, 0x1A, + 0xDD, 0x1F, 0xDA, 0x07, 0x33, 0x37, 0x77, 0x10, 0x97, 0x1C, 0x0A, 0x19, + 0xBE, 0x00, 0x7C, 0x1F, 0x66, 0x0D, 0x5E, 0x26, 0x9E, 0x1B, 0xFE, 0x1B, + 0x6A, 0x04, 0xFE, 0x10, 0x04, 0xE7, 0xE5, 0xFE, 0x49, 0xDE, 0xE6, 0xE8, + 0xD3, 0xD7, 0x06, 0xEE, 0xF4, 0xE2, 0xD1, 0xFB, 0x6F, 0x06, 0x40, 0x02, + 0x91, 0x10, 0xE6, 0x19, 0x40, 0x03, 0x46, 0x29, 0x8A, 0x01, 0xDB, 0x10, + 0xED, 0x02, 0xF6, 0xEB, 0x2D, 0x02, 0x94, 0xD1, 0x0A, 0x0D, 0xAA, 0xDA, + 0x12, 0x11, 0xFE, 0xF9, 0x4D, 0x10, 0xAF, 0x0D, 0x26, 0x0C, 0x6A, 0x1C, + 0xEE, 0xF9, 0xBD, 0x2B, 0x50, 0xFA, 0x4D, 0x24, 0x56, 0x00, 0x06, 0x03, + 0xD8, 0xE6, 0x20, 0xDD, 0x55, 0xD1, 0x03, 0xC6, 0xBD, 0xE1, 0x0C, 0xD3, + 0xE6, 0xEF, 0xB8, 0xE5, 0x91, 0xD3, 0x57, 0xDB, 0xA8, 0xBD, 0xA8, 0xD3, + 0xFC, 0xC9, 0x9B, 0xD5, 0x92, 0xCC, 0xBB, 0xCB, 0xC8, 0xBF, 0xCA, 0xBD, + 0x7E, 0xBB, 0x7E, 0xB7, 0x19, 0xBF, 0x1D, 0xB1, 0x2F, 0xBD, 0xC6, 0xB9, + 0x1F, 0xBD, 0xCD, 0xDC, 0x96, 0xC6, 0xCD, 0xEE, 0xDC, 0xD1, 0x20, 0xE2, + 0x20, 0xD8, 0xF5, 0xD2, 0x47, 0xDC, 0x75, 0xD2, 0xA5, 0xE0, 0x7C, 0xD8, + 0x1F, 0xDC, 0x5A, 0xD9, 0x3D, 0xDD, 0x8E, 0xE5, 0x4E, 0xE1, 0xBA, 0xF1, + 0xCD, 0xD6, 0xB0, 0xE3, 0x74, 0xD3, 0x7E, 0xC6, 0xE8, 0xE6, 0xE6, 0xB6, + 0x39, 0xF8, 0xE0, 0xB9, 0x36, 0xF9, 0x9C, 0xC7, 0x0A, 0xFE, 0x59, 0xDC, + 0xCD, 0x0A, 0x01, 0xF7, 0x62, 0x12, 0xDC, 0x03, 0x77, 0x11, 0x45, 0xFB, + 0x47, 0xFC, 0x04, 0xFF, 0xCE, 0xEF, 0xFB, 0x02, 0x3B, 0x16, 0xC8, 0x01, + 0x91, 0x31, 0x66, 0x07, 0x7D, 0x26, 0x68, 0x0D, 0x82, 0x20, 0x72, 0x1A, + 0xFB, 0x1F, 0x62, 0x30, 0x7D, 0x21, 0xB7, 0x39, 0x84, 0x2C, 0xCB, 0x26, + 0xB7, 0x1C, 0x20, 0x0F, 0xD2, 0xEF, 0x17, 0x06, 0x4F, 0xE5, 0x74, 0x0E, + 0xBD, 0xFC, 0xA6, 0x26, 0x04, 0x01, 0x04, 0x26, 0xD8, 0xFC, 0x11, 0x16, + 0xA0, 0x03, 0x25, 0x17, 0x3B, 0x02, 0x36, 0x19, 0xCE, 0xF4, 0xA1, 0x06, + 0xC3, 0xEA, 0x6C, 0xE3, 0xAF, 0xEF, 0x17, 0xDF, 0xD1, 0xF9, 0x65, 0xF2, + 0x26, 0x08, 0x01, 0xFF, 0x3E, 0x0D, 0xF3, 0x0F, 0xDB, 0x00, 0xBE, 0x1F, + 0x14, 0x02, 0x18, 0x24, 0xE8, 0x09, 0xAF, 0x1C, 0xA8, 0x0E, 0xB7, 0x10, + 0x5E, 0x19, 0x6E, 0x0F, 0xE5, 0x25, 0xD8, 0x1C, 0x92, 0x2C, 0x7D, 0x15, + 0x79, 0x20, 0x16, 0x0B, 0xA7, 0x08, 0xCC, 0x0D, 0xC5, 0x05, 0x2C, 0x00, + 0x9E, 0x0E, 0xF2, 0xFD, 0xA6, 0x04, 0x93, 0x0F, 0xF8, 0x02, 0x6E, 0x1D, + 0xFD, 0x1B, 0xA5, 0x21, 0x44, 0x2C, 0x3F, 0x18, 0x96, 0x2B, 0x6A, 0x13, + 0x96, 0x22, 0xC0, 0x13, 0x6F, 0x15, 0x47, 0xFC, 0x3B, 0x21, 0x36, 0xFC, + 0x2A, 0x27, 0xBB, 0x1C, 0xF2, 0x20, 0x05, 0x20, 0x1A, 0x2E, 0xFE, 0x21, + 0x8E, 0x3D, 0x1C, 0x38, 0xDA, 0x35, 0x6B, 0x3A, 0x47, 0x24, 0x4D, 0x35, + 0xD8, 0x1A, 0x7A, 0x25, 0x3A, 0x09, 0x6A, 0x0A, 0x21, 0x09, 0xBE, 0x10, + 0x65, 0x23, 0x6F, 0x23, 0xD4, 0x1D, 0xE3, 0x1B, 0x00, 0x11, 0x40, 0x17, + 0x36, 0x30, 0x93, 0x22, 0xFE, 0x32, 0x5D, 0x20, 0x5B, 0xFD, 0xDD, 0x1E, + 0x3E, 0xE4, 0x03, 0x19, 0x9F, 0xF0, 0x76, 0x09, 0x68, 0x09, 0xD7, 0x08, + 0x71, 0x2C, 0x1C, 0x06, 0xCD, 0x34, 0x49, 0x0B, 0xB5, 0x1C, 0x2C, 0x13, + 0xAA, 0x19, 0x49, 0x0F, 0xE7, 0x25, 0xCD, 0x10, 0xC9, 0x1E, 0xE0, 0x1A, + 0x4A, 0x11, 0x87, 0x29, 0x20, 0x06, 0x06, 0x2C, 0x6C, 0x10, 0xD3, 0x2C, + 0xBE, 0x14, 0xF0, 0x24, 0x8F, 0xFC, 0x5F, 0x0C, 0xAA, 0xF9, 0x4B, 0x0B, + 0xEB, 0xF8, 0xF1, 0x17, 0x85, 0xF2, 0x23, 0x16, 0xE7, 0xFE, 0xD2, 0x0B, + 0xB6, 0x1A, 0xAD, 0x0E, 0x06, 0x31, 0xCA, 0x10, 0xD2, 0x2D, 0x67, 0x05, + 0x49, 0x1F, 0x23, 0x00, 0x5A, 0x0A, 0x71, 0xFE, 0x0D, 0x00, 0x9D, 0x09, + 0xDE, 0xFA, 0x19, 0x19, 0xD7, 0xFE, 0x0D, 0x16, 0x3E, 0x1D, 0x67, 0x14, + 0x8F, 0x2F, 0x1C, 0x1C, 0x1F, 0x2C, 0xFF, 0x15, 0x50, 0x23, 0xB3, 0x13, + 0x3A, 0x10, 0x37, 0x0C, 0xEA, 0xF0, 0xEF, 0xE9, 0x76, 0xE8, 0xA4, 0xE9, + 0x4C, 0x01, 0x14, 0x0B, 0x39, 0xFD, 0xD2, 0x04, 0xE6, 0xEC, 0x9A, 0xE6, + 0xE2, 0xF7, 0xE4, 0xDC, 0x97, 0xEC, 0x69, 0xD6, 0xDA, 0xC7, 0xD3, 0xD4, + 0xCC, 0xB7, 0x9A, 0xD5, 0x90, 0xBC, 0x62, 0xC8, 0x19, 0xC3, 0xA9, 0xCC, + 0xF7, 0xCC, 0x4D, 0xD7, 0x15, 0xD3, 0x63, 0xD0, 0x28, 0xCC, 0x38, 0xC7, + 0x69, 0xCA, 0x06, 0xC7, 0xDC, 0xC7, 0xE3, 0xCF, 0x84, 0xC3, 0xE8, 0xDC, + 0xB8, 0xD1, 0x87, 0xE4, 0xA4, 0xEA, 0xA1, 0xDD, 0x4D, 0xEF, 0x17, 0xD2, + 0xAF, 0xD6, 0xBB, 0xC3, 0xC9, 0xC6, 0xAB, 0xB1, 0x95, 0xD0, 0xDE, 0xAE, + 0x14, 0xD1, 0x33, 0xB6, 0x45, 0xCE, 0x7D, 0xBD, 0xE8, 0xD9, 0x5E, 0xCF, + 0xBE, 0xE2, 0x36, 0xF2, 0x4F, 0xEF, 0x60, 0x01, 0xEC, 0x04, 0x06, 0xF0, + 0x40, 0x06, 0xF6, 0xE0, 0x0C, 0xE5, 0xEC, 0xD4, 0x9B, 0xD1, 0xA9, 0xDC, + 0xA9, 0xE9, 0x46, 0xF7, 0xC6, 0x08, 0xD1, 0xFE, 0x93, 0x12, 0x8F, 0x06, + 0x97, 0x0B, 0x40, 0x1A, 0x7D, 0xFC, 0x5B, 0x0F, 0x76, 0xEB, 0xAC, 0xFF, + 0x2A, 0xCC, 0x8F, 0xF0, 0x2B, 0xB4, 0xE3, 0xD0, 0x2B, 0xBB, 0xB9, 0xD2, + 0x69, 0xCF, 0x2A, 0xEB, 0x22, 0xCC, 0x13, 0xE8, 0xE8, 0xC0, 0xE9, 0xDA, + 0x0A, 0xD5, 0x56, 0xD4, 0xF1, 0xD7, 0xAF, 0xC2, 0xB2, 0xC0, 0xF9, 0xB4, + 0x0F, 0xC2, 0x67, 0xBC, 0x6F, 0xCB, 0xD9, 0xC7, 0xEA, 0xC2, 0xC9, 0xD4, + 0x0C, 0xCC, 0x1C, 0xE8, 0x73, 0xE2, 0xC6, 0xF0, 0x0E, 0xE5, 0x4C, 0xF1, + 0xE9, 0xE9, 0x9B, 0xF6, 0xB5, 0xF6, 0xB8, 0xFB, 0x10, 0x08, 0xB8, 0xFA, + 0xD1, 0x15, 0x7D, 0xFA, 0x0B, 0x18, 0x75, 0x04, 0x1E, 0x22, 0xF4, 0x0C, + 0x9B, 0x18, 0x15, 0x0B, 0xEE, 0xF0, 0x7A, 0xF9, 0xC0, 0xEB, 0xE9, 0xEF, + 0xBD, 0xF8, 0x88, 0xF9, 0xFD, 0xFE, 0x76, 0xFE, 0x91, 0x1B, 0xCC, 0x05, + 0x30, 0x37, 0x20, 0x29, 0x3B, 0x39, 0xEB, 0x3C, 0x74, 0x3A, 0xDB, 0x25, + 0xEB, 0x2C, 0x6E, 0x14, 0x6B, 0x1B, 0x95, 0x11, 0x01, 0x31, 0x15, 0x11, + 0xAF, 0x39, 0x9B, 0x22, 0x9B, 0x33, 0xB6, 0x41, 0x3B, 0x4F, 0xE7, 0x52, + 0x28, 0x5A, 0x27, 0x4D, 0xF1, 0x47, 0x5E, 0x3F, 0xD8, 0x3C, 0xD0, 0x35, + 0xF8, 0x22, 0x76, 0x25, 0x1B, 0x14, 0x0B, 0x13, 0x1B, 0x32, 0xCB, 0x13, + 0x29, 0x4A, 0x8F, 0x21, 0xD8, 0x34, 0x22, 0x30, 0x7B, 0x16, 0x07, 0x3D, + 0x06, 0x16, 0x33, 0x3E, 0x08, 0x1E, 0x21, 0x2F, 0x93, 0x1C, 0xC2, 0x1B, + 0xD7, 0x15, 0x92, 0x13, 0x06, 0x10, 0x4A, 0x15, 0x79, 0x17, 0x46, 0x16, + 0x11, 0x25, 0x34, 0x17, 0x46, 0x1E, 0xDF, 0x17, 0xFD, 0x10, 0xE8, 0x24, + 0xEA, 0x15, 0x05, 0x2E, 0x4E, 0x1A, 0xB2, 0x22, 0x4C, 0x1C, 0x85, 0x23, + 0x88, 0x23, 0x4A, 0x32, 0x02, 0x1F, 0x9C, 0x3A, 0x0F, 0x15, 0x8B, 0x38, + 0x48, 0x06, 0x7A, 0x29, 0xBC, 0xF4, 0x3B, 0x19, 0x34, 0xF9, 0x1D, 0x09, + 0x0C, 0x0C, 0xE2, 0xF9, 0xE1, 0x23, 0xB9, 0xFE, 0xE5, 0x3C, 0xA4, 0x13, + 0x8A, 0x46, 0xF4, 0x2C, 0x1B, 0x2F, 0xE9, 0x33, 0x04, 0x19, 0x61, 0x32, + 0xA1, 0x0E, 0x66, 0x26, 0x53, 0x08, 0xE6, 0x16, 0x9E, 0x0E, 0xF8, 0x19, + 0xDD, 0x18, 0xB8, 0x27, 0xED, 0x30, 0x3F, 0x3A, 0xF5, 0x46, 0x34, 0x3C, + 0xF3, 0x3C, 0x12, 0x2A, 0x2C, 0x28, 0x50, 0x23, 0x1A, 0x17, 0x6A, 0x25, + 0x08, 0xF7, 0x11, 0x05, 0x68, 0xEE, 0xDF, 0xEE, 0xD9, 0x0A, 0x31, 0xFE, + 0xD4, 0x11, 0x12, 0xF3, 0x1E, 0xF7, 0xC0, 0xE0, 0x1F, 0xED, 0xE8, 0xF0, + 0xE0, 0xF9, 0x8F, 0xF2, 0x0F, 0xE8, 0x8B, 0xD7, 0x24, 0xCF, 0xCF, 0xCB, + 0x94, 0xD8, 0xEE, 0xC9, 0x38, 0xE5, 0x1D, 0xC4, 0xD0, 0xE0, 0xD2, 0xC6, + 0x65, 0xD5, 0x59, 0xD4, 0x3B, 0xC7, 0x33, 0xE1, 0xEB, 0xC3, 0xED, 0xEC, + 0x53, 0xD5, 0xCA, 0xE8, 0x82, 0xEB, 0x10, 0xE0, 0xDB, 0xF3, 0x5A, 0xE9, + 0x28, 0xF5, 0x4D, 0xF0, 0xE5, 0xFC, 0xA4, 0xEC, 0x3A, 0x02, 0x44, 0xDE, + 0x6A, 0xED, 0x72, 0xD1, 0x6C, 0xC5, 0x04, 0xC8, 0x5D, 0xB8, 0xA5, 0xC6, + 0x26, 0xCC, 0x8A, 0xDD, 0x41, 0xE9, 0x74, 0xF7, 0x58, 0x03, 0x4E, 0xFE, + 0x2E, 0x06, 0xA5, 0x02, 0xB7, 0xF7, 0x42, 0x00, 0x9E, 0xF0, 0x4A, 0xF1, + 0xA4, 0xE4, 0xEC, 0xE1, 0xD6, 0xE9, 0x17, 0xDE, 0x8A, 0xFB, 0x37, 0xE9, + 0xDD, 0xFE, 0x62, 0xFE, 0x2B, 0x04, 0x48, 0x0B, 0xAF, 0x08, 0xC1, 0x0D, + 0xA3, 0x00, 0xC2, 0x16, 0xFA, 0xF3, 0xBA, 0x0F, 0x64, 0xDA, 0x89, 0xF1, + 0x0E, 0xBA, 0xCB, 0xE2, 0xDF, 0xC8, 0xE9, 0xEA, 0x89, 0xE4, 0x39, 0xED, + 0xE4, 0xDF, 0xC2, 0xD8, 0x2F, 0xE4, 0xA3, 0xCB, 0xE7, 0xEB, 0x6B, 0xD6, + 0x8C, 0xE1, 0x28, 0xD4, 0x15, 0xDB, 0x78, 0xC8, 0xBD, 0xD4, 0xC2, 0xD1, + 0xA9, 0xCC, 0x00, 0xD9, 0x4F, 0xD5, 0xB6, 0xD6, 0xF9, 0xDF, 0x91, 0xEE, + 0x89, 0xE1, 0x37, 0xF6, 0xEB, 0xDE, 0xD3, 0xD6, 0x90, 0xE4, 0xD2, 0xD8, + 0x76, 0x02, 0x37, 0xF0, 0xA5, 0x1A, 0x3A, 0xF7, 0x5A, 0x15, 0x70, 0x04, + 0x8F, 0x16, 0xD0, 0x11, 0x61, 0x19, 0x28, 0x16, 0xBC, 0xF9, 0x93, 0x09, + 0xA2, 0xDD, 0x51, 0xED, 0xDB, 0xE7, 0x74, 0xDD, 0xBE, 0xF7, 0x15, 0xE5, + 0x82, 0xFF, 0x63, 0x04, 0xDE, 0x0D, 0x8D, 0x18, 0xB5, 0x22, 0x6F, 0x16, + 0x13, 0x2B, 0x0D, 0x0E, 0xAD, 0x25, 0x4C, 0x03, 0x2B, 0x10, 0xE5, 0xF9, + 0xEC, 0xFD, 0xF3, 0x02, 0x34, 0x03, 0xEE, 0x15, 0xAC, 0x0E, 0x6F, 0x19, + 0x4B, 0x1F, 0x2A, 0x26, 0x80, 0x28, 0x54, 0x35, 0x20, 0x1C, 0x7C, 0x30, + 0x04, 0x1C, 0x3C, 0x27, 0x2B, 0x2E, 0xEC, 0x16, 0x42, 0x26, 0x6E, 0xF4, + 0xB4, 0x0E, 0xE1, 0xEE, 0x21, 0x0D, 0xC2, 0x13, 0x7A, 0x10, 0x97, 0x24, + 0xBA, 0x05, 0x95, 0x1C, 0x06, 0x03, 0x02, 0x1C, 0x11, 0xFF, 0x54, 0x1C, + 0xB9, 0xF5, 0x27, 0x0C, 0x2A, 0xFB, 0x04, 0xF2, 0x80, 0xFB, 0xFF, 0xE3, + 0x3F, 0xF9, 0xDF, 0xEB, 0xD9, 0x01, 0xB2, 0xFA, 0x86, 0x0B, 0x1E, 0x08, + 0xBC, 0x05, 0x4C, 0x04, 0xE7, 0xFB, 0xF3, 0xF7, 0xAF, 0x03, 0x9B, 0xFF, + 0x1F, 0x10, 0x89, 0x0C, 0xFD, 0x0F, 0x11, 0x1B, 0x2B, 0x13, 0xB1, 0x34, + 0x21, 0x17, 0x82, 0x3E, 0xB2, 0x05, 0x9D, 0x39, 0x05, 0xF0, 0x82, 0x24, + 0xC2, 0xF0, 0x94, 0x01, 0xC8, 0xFE, 0x6B, 0xE6, 0xB8, 0x0E, 0x58, 0xE5, + 0x04, 0x17, 0xAB, 0x09, 0x97, 0x19, 0xC1, 0x27, 0x5C, 0x1F, 0x59, 0x2B, + 0xBE, 0x16, 0xF9, 0x23, 0x01, 0x03, 0x84, 0x17, 0x07, 0xF2, 0x11, 0x11, + 0xAF, 0xF5, 0x8C, 0x13, 0xDB, 0x0E, 0xAF, 0x11, 0x46, 0x32, 0x55, 0x11, + 0xE8, 0x3C, 0x49, 0x1D, 0x2B, 0x32, 0x2F, 0x2E, 0xB0, 0x34, 0x25, 0x38, + 0xC5, 0x34, 0x51, 0x34, 0x03, 0x22, 0xEB, 0x15, 0x09, 0x0C, 0xE1, 0xF0, + 0xF0, 0x11, 0x3B, 0xEE, 0x6E, 0x18, 0xB6, 0xFA, 0x9C, 0x06, 0x60, 0xF4, + 0xAD, 0xF5, 0xA8, 0xEE, 0x5A, 0xEF, 0xE9, 0xF7, 0x88, 0xE9, 0x48, 0xEF, + 0xA2, 0xEC, 0x65, 0xD4, 0x11, 0xEE, 0x0E, 0xC3, 0x12, 0xD8, 0x34, 0xCC, + 0xA0, 0xC9, 0x5E, 0xDA, 0x6F, 0xD0, 0x84, 0xE7, 0x8D, 0xD8, 0x85, 0xF7, + 0x46, 0xD9, 0x74, 0xE9, 0x07, 0xD2, 0x9F, 0xDC, 0xE3, 0xDA, 0xF9, 0xEA, + 0x47, 0x02, 0xD6, 0xF3, 0xDB, 0x18, 0xA4, 0xF0, 0xE9, 0x0C, 0xC1, 0xE5, + 0xD7, 0x06, 0x08, 0xDF, 0x78, 0xF0, 0x49, 0xDF, 0x26, 0xCA, 0xD6, 0xCE, + 0x66, 0xC6, 0x7F, 0xC1, 0xFE, 0xD7, 0xE5, 0xD5, 0x96, 0xE5, 0xA1, 0xE7, + 0x5F, 0xEF, 0x53, 0xE9, 0xF1, 0xF5, 0x7E, 0xFB, 0x55, 0xFC, 0x3D, 0x05, + 0x30, 0xFC, 0x19, 0xF0, 0xC1, 0xED, 0x1B, 0xDC, 0x9F, 0xE6, 0xE8, 0xE2, + 0x69, 0xEE, 0xD8, 0xFA, 0xB4, 0xF2, 0xF4, 0x08, 0xE5, 0x05, 0xB1, 0x10, + 0x05, 0x16, 0x84, 0x19, 0x49, 0x06, 0x5F, 0x24, 0x2C, 0xF5, 0x06, 0x29, + 0xD3, 0xEA, 0x80, 0x29, 0x87, 0xDC, 0x75, 0x18, 0x66, 0xDA, 0x66, 0xFA, + 0x67, 0xE8, 0x91, 0xF6, 0x0F, 0xF1, 0xFD, 0xF4, 0xE9, 0xF1, 0x52, 0xEE, + 0x3C, 0xF3, 0x8B, 0xEA, 0x88, 0xE6, 0xD0, 0xE1, 0x01, 0xDE, 0x0E, 0xD9, + 0x99, 0xE2, 0x03, 0xD5, 0xF8, 0xD6, 0x9F, 0xD6, 0x79, 0xD0, 0xBC, 0xD7, + 0xD3, 0xDE, 0x9A, 0xE1, 0xFA, 0xE8, 0x57, 0xEE, 0xE7, 0xE8, 0x3D, 0xF0, + 0x78, 0xF3, 0xD0, 0xE4, 0xF8, 0x0A, 0x10, 0xE9, 0xD8, 0x1B, 0x7B, 0x07, + 0x03, 0x20, 0x7C, 0x1D, 0x2E, 0x21, 0x10, 0x27, 0x35, 0x27, 0x55, 0x28, + 0x49, 0x1F, 0xAE, 0x1B, 0x6D, 0x07, 0xDF, 0xFA, 0x1F, 0xFB, 0xBD, 0xF1, + 0x49, 0xFA, 0x90, 0x06, 0x61, 0x01, 0x96, 0x0A, 0x54, 0x17, 0x41, 0x0C, + 0x08, 0x3A, 0x1F, 0x15, 0x6D, 0x43, 0x94, 0x21, 0x0D, 0x25, 0x78, 0x23, + 0x16, 0x17, 0xB0, 0x16, 0xF8, 0x22, 0xDB, 0x08, 0x66, 0x2B, 0x39, 0x0D, + 0x37, 0x21, 0x60, 0x22, 0x76, 0x18, 0x89, 0x36, 0x94, 0x2C, 0x24, 0x45, + 0xBD, 0x40, 0x2A, 0x3D, 0x87, 0x3D, 0xDB, 0x2B, 0xCA, 0x3D, 0xB2, 0x2C, + 0x5D, 0x36, 0x0B, 0x24, 0xF6, 0x20, 0x56, 0x0A, 0x36, 0x1F, 0xB1, 0x0C, + 0x0A, 0x23, 0x9B, 0x2E, 0x68, 0x17, 0xC8, 0x39, 0xA5, 0x03, 0x87, 0x2A, + 0x74, 0x05, 0x95, 0x23, 0xD3, 0x12, 0xD1, 0x11, 0xFE, 0x0C, 0xEA, 0xFB, + 0x0A, 0xFD, 0xE5, 0xF7, 0xBB, 0xF6, 0x06, 0xFF, 0x48, 0xFC, 0x60, 0x07, + 0xFC, 0xFE, 0x50, 0x0B, 0x0D, 0x05, 0x17, 0x09, 0x36, 0x07, 0xB3, 0xFE, + 0x82, 0x0A, 0xCB, 0xFE, 0xB3, 0x15, 0x25, 0x0B, 0x70, 0x10, 0x58, 0x21, + 0x0D, 0x06, 0x32, 0x3E, 0x3F, 0x04, 0x1B, 0x4C, 0x2D, 0x03, 0xA5, 0x3C, + 0x7F, 0x02, 0x61, 0x19, 0xEB, 0xFF, 0xE1, 0xFC, 0xEE, 0xF7, 0x2F, 0xF6, + 0x7E, 0xF7, 0x75, 0xFC, 0x7F, 0x0D, 0x3A, 0xF8, 0x05, 0x23, 0x9D, 0xF7, + 0x09, 0x24, 0xF3, 0x10, 0xEC, 0x08, 0x8E, 0x21, 0x75, 0xF9, 0x0B, 0x1B, + 0x47, 0x05, 0x97, 0x0C, 0xC2, 0x09, 0xAF, 0x04, 0xCC, 0x13, 0xD8, 0xFD, + 0x6B, 0x20, 0x37, 0x07, 0xF4, 0x22, 0x55, 0x23, 0xC2, 0x2D, 0xD8, 0x27, + 0x30, 0x2F, 0xBE, 0x29, 0x20, 0x24, 0x86, 0x26, 0x44, 0x24, 0x6A, 0x0F, + 0x63, 0x13, 0x80, 0xF4, 0x1C, 0xFC, 0x3B, 0xE4, 0xF0, 0xFC, 0x67, 0xEE, + 0x7F, 0xF6, 0x90, 0x00, 0x14, 0xE2, 0xB4, 0xF8, 0x45, 0xE5, 0x25, 0xE2, + 0xB5, 0xF3, 0x7F, 0xDA, 0x0C, 0xE2, 0x37, 0xC7, 0xB7, 0xC6, 0xB8, 0xBE, + 0x61, 0xC1, 0xA5, 0xCB, 0x4C, 0xCE, 0x5E, 0xC8, 0x9B, 0xCF, 0x2F, 0xC7, + 0xFF, 0xC0, 0xCA, 0xCF, 0xAB, 0xBA, 0x6F, 0xD1, 0x1B, 0xC3, 0x4E, 0xCD, + 0x85, 0xD7, 0x2B, 0xC9, 0x31, 0xF7, 0x70, 0xCD, 0xAE, 0x06, 0x45, 0xD6, + 0xE7, 0xFA, 0x66, 0xD9, 0xF4, 0xF0, 0xD6, 0xD8, 0x12, 0xE9, 0x52, 0xDC, + 0x9B, 0xD9, 0x6B, 0xD3, 0x45, 0xCC, 0xC2, 0xC1, 0x88, 0xD0, 0xFD, 0xCD, + 0xF4, 0xD6, 0xE1, 0xE3, 0x9A, 0xE0, 0xCA, 0xE8, 0xB3, 0xF4, 0xD2, 0xF3, + 0x59, 0xF7, 0x52, 0x04, 0x95, 0xEF, 0x4F, 0xFE, 0x31, 0xEC, 0x20, 0xF3, + 0x27, 0xE6, 0x99, 0xEE, 0xC8, 0xEE, 0x04, 0xF3, 0x12, 0xFE, 0xA1, 0xF4, + 0xAF, 0xFC, 0xDD, 0xF8, 0x91, 0xF6, 0xAB, 0x15, 0x38, 0xF7, 0xFB, 0x27, + 0xBC, 0xEB, 0xA1, 0x1E, 0x9E, 0xE4, 0xF3, 0x0B, 0xDD, 0xE0, 0xA2, 0xF5, + 0x5A, 0xCB, 0x26, 0xDF, 0x2A, 0xC9, 0xC2, 0xDE, 0x59, 0xE0, 0xE7, 0xEB, + 0x6C, 0xE7, 0xEB, 0xE2, 0xDB, 0xD1, 0x3B, 0xD8, 0x3A, 0xD1, 0x13, 0xDB, + 0xDD, 0xDB, 0x55, 0xD2, 0xC6, 0xCE, 0x5A, 0xCF, 0x95, 0xCA, 0xBB, 0xD0, + 0x48, 0xD1, 0x70, 0xCB, 0x8A, 0xCE, 0x4B, 0xD8, 0x12, 0xD0, 0x04, 0xEC, + 0x6A, 0xE0, 0x0E, 0xEB, 0x58, 0xED, 0x93, 0xE1, 0x76, 0xF9, 0xCF, 0xEE, + 0x31, 0x0A, 0x4D, 0x04, 0x61, 0x1A, 0xCB, 0x10, 0x25, 0x29, 0x0A, 0x13, + 0xBC, 0x2C, 0x21, 0x0B, 0x79, 0x18, 0x5C, 0x06, 0x53, 0xFD, 0xF1, 0x07, + 0xEF, 0xF5, 0x1E, 0xFD, 0x25, 0xFF, 0xA5, 0xEC, 0xE7, 0x0A, 0x20, 0xEC, + 0xF3, 0x11, 0x33, 0xFB, 0x5A, 0x11, 0xC7, 0x0E, 0xCB, 0x1B, 0xDF, 0x21, + 0x13, 0x31, 0x2A, 0x1A, 0x6E, 0x33, 0x4A, 0x08, 0x64, 0x1F, 0x6F, 0x16, + 0x7B, 0x11, 0x37, 0x27, 0xDF, 0x19, 0x41, 0x27, 0x0B, 0x2A, 0x18, 0x25, + 0xC7, 0x31, 0x1F, 0x2E, 0x22, 0x33, 0x95, 0x37, 0x8A, 0x3E, 0x83, 0x34, + 0xC4, 0x42, 0x68, 0x27, 0x16, 0x3A, 0x07, 0x1E, 0x45, 0x2C, 0x58, 0x13, + 0x56, 0x1C, 0x81, 0x0B, 0x90, 0x1E, 0x69, 0x21, 0x14, 0x1F, 0x20, 0x3A, + 0xC9, 0x06, 0x6A, 0x29, 0x6D, 0x09, 0x0E, 0x17, 0x48, 0x19, 0xBA, 0x1C, + 0x03, 0x0A, 0xB7, 0x14, 0x33, 0x05, 0x3E, 0x0A, 0xF3, 0x09, 0x80, 0x08, + 0x10, 0x08, 0xB5, 0x0D, 0xE5, 0x0B, 0xC8, 0x17, 0x08, 0x10, 0x48, 0x13, + 0x6E, 0x15, 0xC0, 0x03, 0x5B, 0x16, 0x88, 0x01, 0x5A, 0x07, 0xAB, 0x1E, + 0x24, 0xFE, 0xF0, 0x38, 0x2F, 0x0B, 0xBF, 0x40, 0x4F, 0x0F, 0x26, 0x4B, + 0x12, 0x07, 0xDE, 0x3E, 0xEB, 0x0C, 0x1B, 0x2B, 0x48, 0x11, 0xDB, 0x23, + 0x8C, 0x10, 0x57, 0x08, 0xA7, 0x12, 0x15, 0xEE, 0x97, 0x11, 0x10, 0x01, + 0xB3, 0x0F, 0x2A, 0x19, 0xF1, 0x10, 0x20, 0x1D, 0x2A, 0x1A, 0xF6, 0x2B, + 0xEB, 0x1D, 0x1C, 0x26, 0x1E, 0x15, 0x4E, 0x11, 0x63, 0x14, 0xCB, 0x06, + 0x1B, 0x27, 0x21, 0x01, 0xD7, 0x2A, 0x65, 0x09, 0x61, 0x20, 0x79, 0x22, + 0x58, 0x26, 0xE7, 0x3F, 0xF8, 0x38, 0x23, 0x3F, 0x12, 0x42, 0xAA, 0x20, + 0xF3, 0x38, 0xAC, 0x0F, 0x22, 0x1B, 0x60, 0xFE, 0x1C, 0xF5, 0xDF, 0xE4, + 0xEC, 0xED, 0x5E, 0xE7, 0x8A, 0xFE, 0x96, 0xF6, 0xE8, 0xF3, 0x6B, 0xE9, + 0xED, 0xE0, 0x5B, 0xD4, 0x44, 0xE6, 0xD3, 0xDA, 0xC9, 0xDB, 0x59, 0xCD, + 0x5C, 0xC9, 0xC6, 0xAF, 0x78, 0xC8, 0x5E, 0xAE, 0x66, 0xBD, 0x28, 0xB1, + 0x3C, 0xA9, 0x7A, 0xBB, 0x48, 0xAB, 0x47, 0xCF, 0xF9, 0xBF, 0x3C, 0xD0, + 0xD8, 0xCC, 0x5E, 0xBE, 0xFC, 0xD5, 0xA8, 0xB3, 0x47, 0xE0, 0x52, 0xBB, + 0x1A, 0xE7, 0xAF, 0xC8, 0x53, 0xEB, 0xBE, 0xD4, 0x2A, 0xE9, 0x5F, 0xDF, + 0x60, 0xE4, 0x15, 0xE4, 0xE3, 0xDB, 0x47, 0xDD, 0xEC, 0xCA, 0x3C, 0xCC, + 0x1B, 0xC5, 0x16, 0xC2, 0x3E, 0xD3, 0xA1, 0xC9, 0x05, 0xDA, 0xC4, 0xD6, + 0xCC, 0xD4, 0xB1, 0xE1, 0xE0, 0xE0, 0x25, 0xF2, 0x0E, 0xF1, 0x74, 0xFC, + 0xC7, 0xEE, 0xFC, 0xF7, 0xBF, 0xE1, 0xCF, 0xE1, 0x6B, 0xE2, 0xC4, 0xDA, + 0x99, 0xEF, 0x6E, 0xED, 0x17, 0xF2, 0x32, 0xFD, 0xC2, 0xEB, 0xAA, 0x11, + 0x27, 0xEB, 0x64, 0x22, 0xE7, 0xF1, 0x00, 0x26, 0x70, 0xF6, 0x6F, 0x22, + 0x1B, 0xF7, 0x1B, 0x25, 0xA5, 0xEA, 0xF5, 0x0D, 0xDF, 0xE4, 0xB8, 0xED, + 0x8E, 0xED, 0xE6, 0xF9, 0x08, 0xF4, 0x27, 0x08, 0x6E, 0xEC, 0xE0, 0xF8, + 0xC0, 0xEB, 0xC7, 0xF2, 0x2C, 0xF7, 0x61, 0xFA, 0xD1, 0xF4, 0x4B, 0xF1, + 0x4F, 0xF2, 0x40, 0xF2, 0xB7, 0xF0, 0xE2, 0xFF, 0xD4, 0xEE, 0x55, 0xF1, + 0xFF, 0xFB, 0x78, 0xEC, 0xF8, 0x0F, 0xE5, 0x03, 0x1B, 0x17, 0xE0, 0x0E, + 0xF6, 0x17, 0x28, 0x14, 0xBB, 0x2C, 0xD0, 0x12, 0xDC, 0x46, 0xAC, 0x0B, + 0x22, 0x3A, 0x28, 0x18, 0xEB, 0x1E, 0x47, 0x30, 0xD7, 0x1C, 0xB4, 0x2D, + 0x8D, 0x24, 0x1E, 0x17, 0x0D, 0x1C, 0xB1, 0x08, 0x49, 0x07, 0x55, 0x04, + 0xE3, 0x09, 0x39, 0x0C, 0xD2, 0x14, 0xD1, 0x0E, 0xB0, 0x14, 0x48, 0x0C, + 0x34, 0x25, 0x71, 0x17, 0x0F, 0x30, 0x9A, 0x2C, 0xB5, 0x25, 0xFA, 0x30, + 0x53, 0x22, 0x27, 0x2B, 0x3A, 0x1C, 0x49, 0x29, 0x9D, 0x22, 0x55, 0x25, + 0x1D, 0x33, 0x7F, 0x26, 0xC1, 0x38, 0x5C, 0x31, 0x5F, 0x41, 0xDF, 0x31, + 0x70, 0x4C, 0xF4, 0x25, 0xEB, 0x49, 0x40, 0x23, 0xB3, 0x44, 0xFE, 0x2A, + 0x0F, 0x38, 0x4E, 0x21, 0x3E, 0x16, 0x62, 0x0F, 0x99, 0x0E, 0x1C, 0x1B, + 0xA8, 0x1B, 0x87, 0x33, 0x67, 0x0E, 0xD2, 0x2F, 0xB0, 0x07, 0x63, 0x16, + 0x4A, 0x15, 0x00, 0x12, 0x1F, 0x07, 0x4F, 0x0B, 0xE4, 0xED, 0x04, 0xFB, + 0x90, 0xE4, 0x5C, 0xF9, 0x4C, 0xDA, 0x4C, 0xE6, 0xD6, 0xDD, 0x9F, 0xCD, + 0x70, 0xED, 0x05, 0xD8, 0xF1, 0xED, 0xCB, 0xE6, 0x53, 0xEC, 0xAF, 0xEB, + 0xA5, 0xF1, 0x36, 0xFB, 0x40, 0xF1, 0x0F, 0x01, 0x13, 0xEB, 0x66, 0x09, + 0x13, 0xEA, 0xC9, 0x18, 0x1B, 0xF1, 0xC2, 0x12, 0x96, 0xF8, 0xA6, 0x09, + 0x07, 0xF8, 0x74, 0xFF, 0x4B, 0xEF, 0x8C, 0xEF, 0xB9, 0xED, 0x57, 0xEB, + 0xE6, 0xF2, 0xC6, 0xEC, 0x52, 0xF8, 0xCD, 0xF5, 0x72, 0xFD, 0x65, 0x0B, + 0x16, 0x07, 0xE7, 0x1B, 0xB2, 0x0F, 0xF0, 0x12, 0xCC, 0x12, 0xB0, 0x00, + 0xC9, 0x0F, 0x56, 0xF0, 0x78, 0xF9, 0xD1, 0xEC, 0xE2, 0xF4, 0x95, 0x0A, + 0xAE, 0x11, 0xDE, 0x23, 0x5B, 0x2A, 0xBC, 0x25, 0x4A, 0x3A, 0xBE, 0x1B, + 0x12, 0x3F, 0xC7, 0x12, 0x85, 0x33, 0x1A, 0x13, 0x35, 0x24, 0xA3, 0x0E, + 0x5B, 0x12, 0xF6, 0xFF, 0x2A, 0xFE, 0x83, 0xF6, 0xD8, 0xFF, 0xC6, 0x05, + 0x09, 0x0C, 0xCC, 0x10, 0xBC, 0x08, 0xE4, 0x05, 0xE4, 0x0B, 0x3E, 0xFB, + 0x44, 0x0B, 0x1D, 0xED, 0x29, 0xF5, 0x4F, 0xDE, 0x8B, 0xE6, 0xC0, 0xE3, + 0xBC, 0xCF, 0xD4, 0xE4, 0xEE, 0xAF, 0xE3, 0xD3, 0x26, 0xBB, 0x5B, 0xDA, + 0x98, 0xDC, 0xA4, 0xEB, 0x2A, 0xE9, 0x25, 0xE7, 0x45, 0xE5, 0xB8, 0xD2, + 0x59, 0xEB, 0x49, 0xC5, 0xDA, 0xFE, 0x83, 0xCE, 0x4B, 0x06, 0x22, 0xE6, + 0x04, 0xF9, 0xCF, 0xF3, 0x95, 0xED, 0x82, 0xEB, 0x1B, 0xEA, 0x0D, 0xE8, + 0x66, 0xDC, 0xC2, 0xDA, 0xED, 0xD3, 0x13, 0xC3, 0xD1, 0xD1, 0x6E, 0xC8, + 0xEF, 0xD1, 0x42, 0xD9, 0x86, 0xD7, 0xD1, 0xE4, 0x26, 0xED, 0x92, 0xFD, + 0x83, 0x12, 0x56, 0x11, 0x6D, 0x15, 0x19, 0xFF, 0x98, 0x06, 0xB2, 0xFB, + 0x56, 0x0D, 0x75, 0x15, 0x5A, 0x05, 0xF0, 0x0C, 0x6A, 0xE7, 0x35, 0xFF, + 0x6B, 0xE0, 0x64, 0x0B, 0x71, 0xF1, 0x4B, 0x1A, 0xE3, 0xFD, 0xBE, 0x29, + 0x17, 0x09, 0xCC, 0x2C, 0x20, 0x11, 0x85, 0x1E, 0x48, 0x03, 0x0F, 0x08, + 0xFD, 0xF0, 0xEC, 0xF7, 0x80, 0xE6, 0x83, 0xEE, 0x2F, 0xE9, 0x1A, 0xEE, + 0x9D, 0xEF, 0xF5, 0xEE, 0xE5, 0xE8, 0xA1, 0xF0, 0x4D, 0xE3, 0x2D, 0x00, + 0x93, 0xE0, 0x68, 0xFB, 0x09, 0xDE, 0x22, 0xDB, 0xA9, 0xE3, 0x90, 0xCB, + 0xB3, 0xC9, 0xD3, 0xC8, 0x71, 0xA9, 0xB3, 0xC7, 0x85, 0xC5, 0x3D, 0xD9, + 0xE5, 0xEE, 0x5D, 0xE9, 0x4E, 0xFC, 0xC4, 0xE2, 0xA8, 0xF6, 0xE0, 0xDF, + 0x94, 0xF6, 0x92, 0xF7, 0x45, 0x02, 0xA1, 0x04, 0xDB, 0x05, 0xCF, 0xF6, + 0xC8, 0xFE, 0x57, 0xEE, 0x19, 0x03, 0x91, 0xFB, 0x22, 0x05, 0x27, 0x04, + 0x3F, 0xF7, 0x37, 0xFD, 0x23, 0x05, 0xED, 0xFD, 0x20, 0x0D, 0x97, 0xF6, + 0xD5, 0x08, 0x6A, 0xF6, 0x0A, 0x21, 0x9D, 0x0B, 0x2A, 0x2F, 0x7B, 0x19, + 0x2E, 0x2B, 0x6F, 0x1A, 0xBF, 0x25, 0xA8, 0x19, 0xE3, 0x2E, 0x80, 0x33, + 0xD7, 0x30, 0x78, 0x3F, 0xB4, 0x1F, 0x73, 0x21, 0xD7, 0x26, 0xA4, 0x14, + 0x49, 0x3D, 0x26, 0x26, 0xAA, 0x3F, 0x64, 0x2E, 0xF0, 0x3B, 0xCC, 0x28, + 0x9F, 0x4D, 0x62, 0x2D, 0x3F, 0x54, 0xE8, 0x3B, 0x06, 0x30, 0x8F, 0x3A, + 0xA8, 0x09, 0x89, 0x28, 0x48, 0x12, 0x30, 0x28, 0xC9, 0x28, 0x7C, 0x26, + 0xD4, 0x0F, 0xEA, 0x12, 0x01, 0xFC, 0x73, 0x1D, 0x98, 0x18, 0x60, 0x33, + 0x5B, 0x2A, 0xED, 0x27, 0xCB, 0x1F, 0xC9, 0x12, 0x52, 0x12, 0x96, 0x05, + 0xE8, 0x04, 0xAF, 0xFB, 0xC5, 0x03, 0x68, 0xFA, 0x52, 0x0F, 0x56, 0xF9, + 0x5A, 0x0B, 0xC5, 0x04, 0x0E, 0xF9, 0x31, 0x18, 0xFA, 0xF7, 0x66, 0x21, + 0xA7, 0x00, 0x70, 0x2F, 0x8B, 0x07, 0x79, 0x34, 0x33, 0x0A, 0x36, 0x25, + 0x9D, 0x0B, 0x03, 0x21, 0x5F, 0x19, 0xF8, 0x26, 0xC5, 0x17, 0x35, 0x16, + 0xCC, 0x02, 0x16, 0x07, 0x03, 0xF6, 0xDA, 0x0D, 0x0E, 0xE6, 0x01, 0x09, + 0xF7, 0xDC, 0xEC, 0xFF, 0xE1, 0x01, 0x54, 0x0A, 0x39, 0x2A, 0x81, 0x14, + 0x48, 0x2A, 0x12, 0x17, 0x67, 0x1B, 0xE5, 0x18, 0x4A, 0x0D, 0x2F, 0x17, + 0x0F, 0x12, 0xA5, 0x13, 0xB2, 0x28, 0x67, 0x16, 0xC7, 0x2B, 0x4D, 0x14, + 0x27, 0x1D, 0x2B, 0x09, 0x87, 0x18, 0xC5, 0x07, 0x80, 0x21, 0x2E, 0x0C, + 0x1F, 0x28, 0xE8, 0x0C, 0xBF, 0x1B, 0xC7, 0x0D, 0xD8, 0xFD, 0x86, 0x05, + 0x20, 0xE8, 0xA5, 0xEE, 0xBE, 0xE7, 0xED, 0xE1, 0x18, 0xED, 0x7B, 0xDB, + 0x04, 0xEC, 0x4D, 0xCB, 0x11, 0xD9, 0x0A, 0xC1, 0xF1, 0xCB, 0x2D, 0xC5, + 0xA4, 0xCC, 0x23, 0xCF, 0x4D, 0xC3, 0xE4, 0xD4, 0xEE, 0xB8, 0x05, 0xCD, + 0xA4, 0xB1, 0x18, 0xBB, 0xDD, 0xB7, 0x1C, 0xB9, 0xD3, 0xCD, 0x65, 0xC0, + 0xFD, 0xE3, 0x31, 0xC2, 0xDF, 0xE5, 0x68, 0xC2, 0xC3, 0xD9, 0x46, 0xBE, + 0xE3, 0xD4, 0x90, 0xC1, 0xD7, 0xD9, 0xE1, 0xD2, 0x2D, 0xE6, 0x63, 0xDD, + 0x31, 0xEE, 0xB5, 0xDC, 0xD2, 0xEC, 0xD7, 0xDB, 0xF1, 0xDD, 0xA5, 0xDC, + 0xC1, 0xD0, 0xF5, 0xDF, 0x9E, 0xCF, 0x01, 0xE0, 0x19, 0xD5, 0x2F, 0xDE, + 0xDF, 0xE1, 0x26, 0xDC, 0xF8, 0xF6, 0xE2, 0xE5, 0x37, 0x0D, 0x0C, 0xFF, + 0x9A, 0x13, 0x31, 0x0B, 0xB6, 0x07, 0x48, 0xFC, 0x95, 0xFA, 0xE3, 0xF4, + 0xB2, 0xFD, 0x2C, 0x0D, 0x4C, 0xF8, 0x1E, 0x1A, 0x60, 0xEA, 0x0B, 0x0F, + 0x0F, 0xF1, 0xFE, 0x05, 0xC4, 0xF8, 0x4A, 0x0C, 0xC1, 0xEB, 0x81, 0x0F, + 0xB8, 0xF6, 0xA9, 0x18, 0x61, 0x05, 0xA2, 0x15, 0xEA, 0xEE, 0x41, 0xEF, + 0x4C, 0xE8, 0x54, 0xEB, 0xCF, 0xE8, 0xD7, 0x03, 0x4E, 0xDA, 0x0A, 0xFA, + 0xA7, 0xDC, 0x51, 0xDE, 0xF6, 0xE5, 0x37, 0xD9, 0xD3, 0xDF, 0x7D, 0xE5, + 0x9D, 0xD0, 0x41, 0xEB, 0xA1, 0xC7, 0x3C, 0xE7, 0xB0, 0xD6, 0x7D, 0xDD, + 0xFD, 0xF3, 0x41, 0xDF, 0x89, 0xFF, 0x15, 0xEB, 0x00, 0x02, 0xDC, 0xF2, + 0xC9, 0x09, 0x85, 0xF9, 0xA2, 0x0E, 0xD8, 0xFD, 0x77, 0x13, 0xED, 0x04, + 0xA1, 0x15, 0xD5, 0x0B, 0x11, 0x19, 0xE4, 0x13, 0x48, 0x20, 0x12, 0x20, + 0xC9, 0x20, 0x89, 0x21, 0xEA, 0x22, 0x7F, 0x1F, 0x3E, 0x1E, 0xD9, 0x20, + 0xFB, 0x0A, 0x79, 0x1B, 0x89, 0x06, 0x97, 0x0D, 0x8C, 0x16, 0x84, 0x0E, + 0xC6, 0x21, 0x43, 0x19, 0x56, 0x1B, 0xE4, 0x14, 0x71, 0x1B, 0x58, 0x26, + 0xCE, 0x2A, 0x82, 0x3A, 0x47, 0x2A, 0x9B, 0x26, 0x06, 0x1D, 0x49, 0x1C, + 0xE4, 0x20, 0xF2, 0x24, 0x86, 0x33, 0xBF, 0x12, 0x96, 0x3D, 0xA4, 0x00, + 0x80, 0x38, 0x96, 0x0A, 0x93, 0x2A, 0xD1, 0x12, 0x45, 0x25, 0x3A, 0x23, + 0xE3, 0x2D, 0x6C, 0x2F, 0x2B, 0x27, 0x3D, 0x1C, 0x18, 0x22, 0x01, 0x1D, + 0x8B, 0x2C, 0xF1, 0x30, 0x58, 0x1E, 0xD7, 0x23, 0x23, 0x0B, 0x04, 0x0F, + 0x50, 0x12, 0xA4, 0x12, 0xDB, 0x0A, 0x95, 0x0A, 0x7A, 0xF1, 0x0A, 0xFF, + 0x30, 0xEF, 0x30, 0x00, 0x99, 0xF7, 0xB5, 0xEF, 0x4F, 0xFF, 0xED, 0xE5, + 0x37, 0x03, 0x94, 0xF4, 0xE4, 0xF6, 0xCD, 0x02, 0x2A, 0xEE, 0xB6, 0x08, + 0xA9, 0xEF, 0x22, 0x16, 0xAD, 0xF0, 0x08, 0x23, 0xBE, 0xF3, 0xD9, 0x1E, + 0x59, 0xFE, 0x80, 0x1B, 0x23, 0x0F, 0xC2, 0x14, 0x91, 0x1E, 0x18, 0x0B, + 0xAA, 0x1A, 0x20, 0x0E, 0x99, 0x04, 0x3E, 0x20, 0xF1, 0xF6, 0xBC, 0x25, + 0xC3, 0xFA, 0x40, 0x15, 0x91, 0x0E, 0xE3, 0x0D, 0xC3, 0x14, 0x1A, 0x06, + 0x68, 0x03, 0x76, 0x04, 0x61, 0x00, 0xFC, 0x12, 0x8F, 0x0C, 0xBB, 0x1C, + 0x49, 0x0B, 0xD7, 0x13, 0x4E, 0x04, 0xBA, 0x0C, 0x5B, 0x15, 0x3D, 0x19, + 0x1C, 0x29, 0x82, 0x1B, 0x88, 0x2E, 0xF3, 0x19, 0xA2, 0x30, 0xCA, 0x17, + 0x17, 0x2D, 0x88, 0x0E, 0x43, 0x23, 0x84, 0x0F, 0x6E, 0x10, 0x42, 0x16, + 0xDD, 0x01, 0xF1, 0x12, 0xF6, 0xFE, 0x4E, 0xFF, 0x51, 0x05, 0x84, 0xEE, + 0x07, 0x10, 0xCF, 0xEA, 0x82, 0x0D, 0xC2, 0xEE, 0x44, 0x04, 0x72, 0xEE, + 0xBC, 0xF6, 0x8F, 0xE5, 0xC2, 0xDD, 0x14, 0xDE, 0x85, 0xC9, 0x9F, 0xDD, + 0xCD, 0xC1, 0x01, 0xD9, 0x8B, 0xBD, 0x6A, 0xBF, 0xFF, 0xC9, 0x05, 0xB2, + 0x29, 0xE3, 0x88, 0xBC, 0xAB, 0xF0, 0xAC, 0xC3, 0xE3, 0xED, 0xCC, 0xCF, + 0x16, 0xDF, 0xD4, 0xE0, 0x89, 0xDD, 0x35, 0xDE, 0xE5, 0xE6, 0x35, 0xCA, + 0x8B, 0xE7, 0x3B, 0xCD, 0x2D, 0xE8, 0xA0, 0xD5, 0x93, 0xED, 0x11, 0xD2, + 0xBD, 0xE6, 0x4D, 0xDD, 0x4A, 0xD2, 0xD3, 0xDD, 0xE0, 0xC8, 0xBB, 0xD6, + 0x7E, 0xC9, 0x45, 0xDC, 0x0D, 0xD7, 0xAC, 0xE3, 0x6A, 0xE9, 0x02, 0xDF, + 0xAD, 0xF3, 0xC5, 0xD8, 0x83, 0x01, 0xCA, 0xEA, 0x62, 0xF6, 0x4D, 0xF9, + 0xD7, 0xDC, 0xE3, 0xFA, 0xAB, 0xDD, 0xFF, 0xF6, 0x6A, 0xE1, 0x4B, 0xF3, + 0xBA, 0xE2, 0xD4, 0xFF, 0xE0, 0xEF, 0xD3, 0x16, 0x08, 0xF6, 0xE7, 0x22, + 0x09, 0xF7, 0x15, 0x0F, 0x4C, 0x00, 0x93, 0x04, 0x47, 0xF9, 0xA8, 0x0A, + 0x3E, 0xDB, 0x2E, 0xFE, 0xF8, 0xCC, 0x88, 0xEE, 0x0E, 0xE1, 0x55, 0xF1, + 0xD5, 0xF9, 0xB2, 0xF1, 0x1A, 0xFA, 0x1F, 0xEE, 0x6A, 0xE7, 0x1A, 0xF8, + 0xCA, 0xDD, 0x1F, 0xF7, 0xFC, 0xDD, 0x05, 0xF5, 0x8E, 0xDB, 0xE7, 0xEE, + 0x66, 0xD7, 0xAE, 0xD8, 0xC7, 0xDB, 0xFF, 0xD8, 0xFC, 0xEA, 0x79, 0xE2, + 0x57, 0xF6, 0xB7, 0xE0, 0xFA, 0x00, 0xE2, 0xED, 0x68, 0x06, 0x06, 0x03, + 0x2E, 0x02, 0xCF, 0x02, 0x2A, 0x03, 0xFD, 0x04, 0xE6, 0x13, 0x33, 0x11, + 0xE4, 0x1B, 0x7C, 0x13, 0x42, 0x14, 0x9F, 0x1C, 0x0C, 0x14, 0xF9, 0x1D, + 0x49, 0x11, 0x13, 0x11, 0x31, 0x08, 0x3A, 0x02, 0x12, 0x02, 0xC5, 0xF1, + 0x10, 0x07, 0xA1, 0xF0, 0xB1, 0x15, 0xCA, 0x01, 0x43, 0x24, 0xB1, 0x14, + 0xF5, 0x27, 0x36, 0x24, 0xD1, 0x20, 0xF0, 0x36, 0x07, 0x23, 0x3C, 0x38, + 0xFD, 0x29, 0x15, 0x1E, 0x42, 0x26, 0xF7, 0xFF, 0x32, 0x1F, 0x76, 0xF3, + 0xFC, 0x26, 0x8A, 0x03, 0x41, 0x32, 0x3A, 0x1E, 0x0A, 0x3A, 0x8B, 0x36, + 0x90, 0x4F, 0xB2, 0x47, 0x6A, 0x49, 0x4F, 0x40, 0x39, 0x24, 0x90, 0x31, + 0x21, 0x1D, 0xE4, 0x30, 0x73, 0x1F, 0xCC, 0x23, 0x59, 0x0E, 0x68, 0x0D, + 0xDA, 0x14, 0xB7, 0x1D, 0x29, 0x24, 0x12, 0x38, 0xA8, 0x1D, 0xAF, 0x34, + 0xC3, 0x1E, 0x3C, 0x29, 0xBE, 0x24, 0xFA, 0x18, 0x63, 0x24, 0xE7, 0x08, + 0x80, 0x1D, 0xB4, 0xF9, 0x72, 0x11, 0x6A, 0xF4, 0x7B, 0x07, 0xDD, 0xFC, + 0x43, 0xFA, 0x3D, 0x09, 0xEB, 0xEE, 0x6A, 0x21, 0x09, 0xF5, 0x1A, 0x31, + 0x5E, 0x0C, 0xCC, 0x29, 0xAD, 0x25, 0xA5, 0x1A, 0x0F, 0x2E, 0x7B, 0x16, + 0xDC, 0x1D, 0x64, 0x1D, 0x04, 0x05, 0x11, 0x23, 0x0F, 0xFB, 0x1E, 0x26, + 0xBE, 0xF3, 0x05, 0x18, 0x98, 0xE7, 0xB6, 0xFC, 0xD2, 0xED, 0x2A, 0xF3, + 0x4D, 0xF9, 0x22, 0xFD, 0xA5, 0xFA, 0xE1, 0x00, 0xBD, 0x0B, 0x9E, 0x0F, + 0xD2, 0x1E, 0x9E, 0x21, 0x63, 0x15, 0x5F, 0x1D, 0x2A, 0x02, 0x61, 0x18, + 0x6E, 0x03, 0xBC, 0x0B, 0x90, 0x14, 0x2C, 0xF9, 0x22, 0x1D, 0xBB, 0xEF, + 0x51, 0x1F, 0xF7, 0xF5, 0x0B, 0x26, 0x71, 0x07, 0x33, 0x28, 0xDF, 0x17, + 0xDE, 0x1F, 0x4B, 0x22, 0xB8, 0x16, 0x56, 0x1F, 0x28, 0x0B, 0x9A, 0x08, + 0x7B, 0xFD, 0xCF, 0xE4, 0xBD, 0xEF, 0xD4, 0xD0, 0xCF, 0xEA, 0x98, 0xD2, + 0xD2, 0xEA, 0x3A, 0xD2, 0x80, 0xDB, 0xEA, 0xDA, 0x99, 0xCE, 0xBD, 0xF0, + 0x1C, 0xCC, 0x15, 0xF3, 0xAF, 0xCC, 0xBB, 0xDF, 0xA0, 0xD4, 0xB3, 0xC7, + 0x30, 0xD7, 0x3A, 0xB4, 0x6B, 0xD2, 0x7A, 0xB2, 0xC9, 0xCF, 0x43, 0xBB, + 0x3E, 0xC5, 0xAF, 0xBD, 0xEA, 0xC1, 0x90, 0xC3, 0x17, 0xDF, 0x9A, 0xCD, + 0xB4, 0xF7, 0x51, 0xD8, 0xA5, 0xF1, 0xE5, 0xDF, 0xFD, 0xEB, 0x8A, 0xD9, + 0xEB, 0xEF, 0x00, 0xDC, 0x8E, 0xE3, 0x11, 0xE1, 0xEB, 0xC6, 0x71, 0xD7, + 0x16, 0xBC, 0xB8, 0xD8, 0x5E, 0xCF, 0x48, 0xDC, 0xF9, 0xE8, 0x85, 0xD0, + 0x27, 0xF0, 0x08, 0xD4, 0x41, 0xF0, 0x13, 0xEA, 0xDE, 0xF6, 0xB4, 0xF1, + 0x0C, 0xF6, 0x36, 0xF2, 0xFE, 0xF4, 0x78, 0xF8, 0x0C, 0xEF, 0x54, 0x00, + 0xFB, 0xD8, 0xAF, 0x05, 0xCC, 0xD7, 0xAA, 0x08, 0x9E, 0xEF, 0xE1, 0x08, + 0xC5, 0xF7, 0x8F, 0xFE, 0xF0, 0xEF, 0xA0, 0xF5, 0x4F, 0xEA, 0x7E, 0xFE, + 0x1B, 0xE8, 0xF6, 0x0F, 0x15, 0xE8, 0x6C, 0x09, 0xD5, 0xE8, 0xDC, 0xF3, + 0x88, 0xEA, 0x86, 0xEF, 0x66, 0xEF, 0xFA, 0xEF, 0x34, 0xE6, 0x9F, 0xEA, + 0x0C, 0xD5, 0x58, 0xE8, 0x20, 0xD4, 0xE2, 0xE8, 0x29, 0xDD, 0x17, 0xEF, + 0xBB, 0xE3, 0xA8, 0xF5, 0xEF, 0xEA, 0xE0, 0xF3, 0xDE, 0xF8, 0xFF, 0xF2, + 0xCB, 0xFF, 0xE9, 0xEC, 0x7F, 0xFA, 0xF8, 0xE1, 0x80, 0xF9, 0xD9, 0xEB, + 0x34, 0xFB, 0xFC, 0xF6, 0xBC, 0xFE, 0x3B, 0xEE, 0xB6, 0x06, 0x23, 0xF4, + 0xB1, 0x0A, 0x09, 0x0C, 0x1A, 0x18, 0x15, 0x15, 0x54, 0x23, 0x5A, 0x08, + 0x4F, 0x17, 0x5A, 0x03, 0xC8, 0x0F, 0x4F, 0x11, 0xC4, 0x15, 0x2C, 0x11, + 0x74, 0x15, 0x13, 0x08, 0x95, 0x11, 0xF9, 0x02, 0xE9, 0x0F, 0xDB, 0x04, + 0x08, 0x09, 0x0F, 0x15, 0x1B, 0x04, 0x43, 0x20, 0xF4, 0x13, 0xFA, 0x20, + 0xD4, 0x28, 0xA1, 0x1D, 0x14, 0x2E, 0xE4, 0x1B, 0x52, 0x28, 0xBC, 0x19, + 0x39, 0x1B, 0x5F, 0x11, 0xA6, 0x19, 0xC0, 0x0A, 0xA9, 0x23, 0x99, 0x08, + 0x23, 0x22, 0x46, 0x0D, 0x24, 0x1B, 0x3C, 0x16, 0x2E, 0x1A, 0x4C, 0x21, + 0xBD, 0x2C, 0x8D, 0x2E, 0xF5, 0x39, 0x33, 0x2F, 0x76, 0x2B, 0x69, 0x2D, + 0x0B, 0x24, 0x15, 0x38, 0xFA, 0x25, 0x95, 0x32, 0x23, 0x1D, 0xAF, 0x1F, + 0x5C, 0x11, 0x22, 0x1A, 0xFC, 0x0E, 0x6D, 0x1B, 0x64, 0x12, 0x51, 0x15, + 0x97, 0x20, 0x0D, 0x0A, 0x65, 0x2E, 0xAA, 0x0A, 0x0D, 0x1C, 0x67, 0x10, + 0x04, 0x01, 0xBE, 0x1B, 0x5A, 0xF8, 0x32, 0x2E, 0x45, 0xFA, 0x96, 0x2E, + 0x3D, 0x01, 0xA9, 0x20, 0xF6, 0x08, 0x15, 0x13, 0xB8, 0x0A, 0xE4, 0x0D, + 0x74, 0x04, 0x2A, 0x1B, 0x64, 0x04, 0x05, 0x2E, 0xBE, 0x11, 0x64, 0x33, + 0xBD, 0x19, 0x86, 0x2C, 0x10, 0x13, 0x71, 0x25, 0xC8, 0x0D, 0xDC, 0x1B, + 0x44, 0x0E, 0xE4, 0x0D, 0xFD, 0x05, 0xCD, 0xF8, 0xCD, 0xFE, 0xD8, 0xEB, + 0xDC, 0x00, 0xDE, 0xFD, 0xB4, 0x01, 0x3C, 0x10, 0x4A, 0x05, 0xFE, 0x1A, + 0x30, 0x13, 0xC8, 0x25, 0x6C, 0x24, 0x7C, 0x15, 0xFE, 0x2C, 0x9E, 0x08, + 0x4C, 0x23, 0x13, 0x06, 0x32, 0x12, 0xF7, 0xF7, 0x27, 0x0C, 0xEF, 0xF2, + 0x78, 0x06, 0xCF, 0xF8, 0x86, 0xF9, 0x2B, 0xFC, 0x59, 0xF3, 0x41, 0xFF, + 0xD5, 0x02, 0x84, 0x04, 0x57, 0x13, 0x54, 0xFA, 0x60, 0x0B, 0xEF, 0xE6, + 0x00, 0x02, 0xC7, 0xDC, 0xCC, 0xF3, 0x55, 0xD6, 0x1E, 0xD5, 0x96, 0xDD, + 0xB3, 0xC3, 0xB6, 0xE5, 0x24, 0xCE, 0x5E, 0xDD, 0x4F, 0xDD, 0xE9, 0xD3, + 0xDC, 0xE5, 0x38, 0xCC, 0xFE, 0xE7, 0x55, 0xC9, 0x41, 0xDD, 0x70, 0xC7, + 0xF2, 0xDB, 0x3B, 0xC1, 0x0A, 0xE2, 0xA6, 0xC4, 0xC7, 0xE2, 0x97, 0xD4, + 0xC5, 0xE7, 0x99, 0xDC, 0x51, 0xE5, 0x65, 0xCF, 0x1A, 0xE2, 0x73, 0xC0, + 0x67, 0xE9, 0x84, 0xCE, 0x79, 0xE5, 0xA1, 0xE5, 0x7A, 0xD3, 0xB2, 0xEC, + 0xCE, 0xCC, 0xB5, 0xEA, 0xC9, 0xDC, 0x8E, 0xE2, 0x18, 0xE8, 0x93, 0xE0, + 0x8F, 0xE2, 0x7F, 0xE3, 0x12, 0xE4, 0xD3, 0xE5, 0x52, 0xF4, 0xA3, 0xDF, + 0xE5, 0xFB, 0x4C, 0xD2, 0x92, 0xE8, 0xAE, 0xD8, 0x5E, 0xD9, 0x52, 0xF1, + 0x91, 0xDE, 0x3F, 0x08, 0x77, 0xE3, 0xAB, 0x0A, 0x1E, 0xE7, 0x48, 0x05, + 0x5C, 0xF1, 0x4B, 0x07, 0xBC, 0xEF, 0x81, 0xFE, 0x08, 0xDA, 0x93, 0xF1, + 0x2C, 0xD0, 0x7B, 0xF4, 0xB6, 0xD4, 0x6F, 0xF7, 0x29, 0xDB, 0x9D, 0xEE, + 0xBD, 0xE8, 0x40, 0xF1, 0x0B, 0xF1, 0x22, 0xF9, 0x86, 0xF4, 0x70, 0xF3, + 0x71, 0xF8, 0xA3, 0xF1, 0x61, 0xE8, 0x08, 0xF3, 0x93, 0xD5, 0x75, 0xF7, + 0xD9, 0xDB, 0x0A, 0xF7, 0xD5, 0xE5, 0xCC, 0xEE, 0xB4, 0xE8, 0x86, 0xF3, + 0xAE, 0xF2, 0x8F, 0xF7, 0xAB, 0x02, 0xCB, 0xEF, 0x9C, 0x07, 0x38, 0xE6, + 0x96, 0x03, 0xA0, 0xE9, 0xBB, 0x04, 0x8A, 0xF3, 0x65, 0x09, 0xE2, 0xF7, + 0x29, 0x10, 0x2A, 0x01, 0xAF, 0x0E, 0x0A, 0x04, 0x9B, 0x0F, 0x91, 0x04, + 0x68, 0x10, 0x71, 0x0F, 0x36, 0x08, 0x41, 0x19, 0x2B, 0x12, 0xD9, 0x18, + 0xBB, 0x1E, 0x82, 0x0F, 0xF7, 0x19, 0xAA, 0x06, 0x47, 0x10, 0x85, 0x0F, + 0xB0, 0x0A, 0x4B, 0x26, 0x90, 0x11, 0x96, 0x28, 0x7C, 0x1D, 0x1A, 0x12, + 0xBD, 0x1D, 0x5C, 0x0B, 0x09, 0x10, 0xB1, 0x15, 0x9D, 0x0B, 0xB8, 0x0C, + 0x35, 0x12, 0x41, 0xFF, 0x91, 0x18, 0x22, 0xFF, 0xB4, 0x26, 0xB9, 0x02, + 0xEA, 0x26, 0x7C, 0x0C, 0x8F, 0x1B, 0x35, 0x10, 0x48, 0x20, 0xEA, 0x0D, + 0x46, 0x26, 0x32, 0x18, 0x40, 0x1A, 0xD2, 0x25, 0x45, 0x10, 0x02, 0x2D, + 0x4C, 0x1C, 0x67, 0x2C, 0xD2, 0x2C, 0xB5, 0x2A, 0x87, 0x2C, 0x3A, 0x32, + 0x56, 0x1E, 0x54, 0x40, 0x5E, 0x16, 0x1E, 0x43, 0xAB, 0x1F, 0x42, 0x2F, + 0xF7, 0x30, 0x63, 0x14, 0xAB, 0x35, 0xAB, 0x05, 0x47, 0x23, 0x89, 0x0C, + 0xEC, 0x0F, 0x5E, 0x19, 0x23, 0x0C, 0x5D, 0x27, 0x7B, 0x10, 0x87, 0x2C, + 0xA7, 0x16, 0x56, 0x20, 0xD8, 0x14, 0xBD, 0x1D, 0x11, 0x0D, 0x2D, 0x1C, + 0xB2, 0x0E, 0x20, 0x19, 0xC6, 0x12, 0x1A, 0x15, 0x04, 0x16, 0xD8, 0x11, + 0x79, 0x19, 0x70, 0x21, 0x39, 0x12, 0xBA, 0x2F, 0x68, 0x0D, 0x45, 0x2C, + 0xD2, 0x11, 0x8A, 0x19, 0x50, 0x0D, 0xDF, 0x08, 0x64, 0x04, 0xA5, 0x00, + 0x9C, 0xF7, 0x9D, 0xFE, 0x93, 0xED, 0x8C, 0x07, 0xC9, 0xFB, 0x87, 0x0B, + 0xD5, 0x0B, 0xEC, 0x08, 0xFF, 0x08, 0x23, 0x0A, 0x2A, 0x0A, 0xB0, 0x05, + 0x19, 0x18, 0x6A, 0xFF, 0xB2, 0x1C, 0x86, 0xFB, 0x92, 0x13, 0xA7, 0xED, + 0xAF, 0x01, 0xA8, 0xE6, 0xF4, 0xF6, 0xE6, 0xF4, 0x1C, 0xFF, 0x72, 0x08, + 0x71, 0x03, 0xEF, 0x09, 0x6F, 0x06, 0x1F, 0xF6, 0xCF, 0x0E, 0x6E, 0xE5, + 0x18, 0x0D, 0x17, 0xDC, 0x9A, 0xF7, 0x83, 0xE2, 0x90, 0xDC, 0x77, 0xF4, + 0x79, 0xD6, 0x3C, 0xF7, 0xDD, 0xDC, 0x55, 0xF2, 0xF7, 0xE3, 0x0E, 0xEE, + 0xA3, 0xE8, 0xDC, 0xE8, 0x3C, 0xE7, 0x37, 0xDE, 0x8A, 0xE9, 0xBE, 0xDA, + 0xCB, 0xE9, 0x42, 0xDE, 0xF3, 0xDD, 0xF6, 0xDA, 0xDE, 0xD3, 0x62, 0xD8, + 0xAA, 0xE1, 0x2E, 0xD0, 0x5E, 0xF3, 0x52, 0xC3, 0x64, 0xEB, 0x3E, 0xBF, + 0xB4, 0xD7, 0x4D, 0xCB, 0x97, 0xD4, 0x94, 0xDE, 0x59, 0xDF, 0x7B, 0xE1, + 0x05, 0xDA, 0xD6, 0xD7, 0xF8, 0xD1, 0x7F, 0xDB, 0x06, 0xD7, 0x72, 0xEB, + 0xD9, 0xDD, 0x4C, 0xEB, 0x3E, 0xE7, 0xB8, 0xD9, 0x67, 0xF2, 0xCE, 0xCF, + 0x44, 0xF7, 0x39, 0xCE, 0xE0, 0xF0, 0xAA, 0xD9, 0x0F, 0xE0, 0x97, 0xEF, + 0xC3, 0xD8, 0xC7, 0xFC, 0x13, 0xE6, 0x63, 0xFE, 0x7A, 0xF2, 0x6E, 0xFB, + 0xEE, 0xED, 0x61, 0xFF, 0x4E, 0xE1, 0xE4, 0xFF, 0x67, 0xD6, 0x60, 0xF4, + 0xA1, 0xCD, 0x13, 0xEF, 0x98, 0xCB, 0xC2, 0xF9, 0x06, 0xD6, 0xD2, 0x01, + 0xC1, 0xE7, 0x84, 0xF9, 0x0B, 0xF4, 0xCE, 0xEF, 0xCB, 0xF1, 0x9E, 0xF3, + 0xEB, 0xEC, 0x07, 0xF7, 0xFB, 0xEE, 0x6A, 0xF0, 0x86, 0xE3, 0x95, 0xF6, + 0xFD, 0xD9, 0x92, 0xFB, 0x82, 0xE6, 0x1A, 0xF7, 0xD0, 0xF1, 0x49, 0xFF, + 0xAB, 0xF8, 0x83, 0x03, 0xFB, 0x05, 0xAF, 0xF6, 0x98, 0x08, 0xF2, 0xEA, + 0x5A, 0xFC, 0x7B, 0xED, 0x1F, 0xFD, 0xB8, 0xF7, 0xB3, 0x09, 0x2C, 0x00, + 0x40, 0x15, 0xDC, 0xFB, 0x64, 0x1C, 0x69, 0xF6, 0xE0, 0x13, 0x44, 0x05, + 0x8A, 0x0D, 0x6B, 0x13, 0xEE, 0x1A, 0xB2, 0x12, 0x48, 0x25, 0xF9, 0x09, + 0xA7, 0x1C, 0x2B, 0x04, 0x80, 0x09, 0x5B, 0x09, 0x6F, 0x00, 0x34, 0x14, + 0x35, 0x07, 0x2A, 0x1A, 0xB2, 0x14, 0x63, 0x17, 0x52, 0x1E, 0x44, 0x18, + 0xE9, 0x16, 0xF1, 0x18, 0x2D, 0x0C, 0x27, 0x14, 0x2E, 0x0C, 0xB9, 0x08, + 0x82, 0x0D, 0x97, 0xFB, 0xC4, 0x0E, 0x47, 0xFD, 0x9B, 0x19, 0x4E, 0x05, + 0x8F, 0x25, 0xFA, 0x0D, 0x96, 0x29, 0x38, 0x0B, 0xD6, 0x22, 0x45, 0x0A, + 0xBA, 0x13, 0x54, 0x1E, 0x86, 0x11, 0x1F, 0x22, 0xAD, 0x1C, 0x10, 0x17, + 0x5A, 0x28, 0x90, 0x1D, 0x56, 0x2F, 0xFE, 0x29, 0x24, 0x27, 0x09, 0x32, + 0x18, 0x13, 0x6A, 0x3E, 0xD7, 0x15, 0x43, 0x47, 0xE9, 0x2F, 0x84, 0x37, + 0xE9, 0x39, 0x4B, 0x1B, 0xA9, 0x31, 0x66, 0x0C, 0x32, 0x21, 0x12, 0x15, + 0x9C, 0x11, 0xB1, 0x25, 0x59, 0x13, 0xA0, 0x23, 0xF2, 0x19, 0x30, 0x1F, + 0xF8, 0x17, 0x0C, 0x29, 0x78, 0x12, 0x7E, 0x2D, 0x1A, 0x06, 0x71, 0x28, + 0xC5, 0x03, 0x8F, 0x1E, 0xE1, 0x12, 0x2F, 0x11, 0x5E, 0x18, 0x14, 0x15, + 0xEC, 0x15, 0x79, 0x28, 0xBC, 0x11, 0x29, 0x33, 0x12, 0x14, 0xCF, 0x32, + 0xA9, 0x1E, 0x66, 0x29, 0xCF, 0x16, 0x74, 0x1A, 0x6D, 0x09, 0xA3, 0x0F, + 0x7E, 0x0A, 0xDE, 0x0C, 0x12, 0x0B, 0xC7, 0x10, 0xAA, 0x05, 0x6B, 0x12, + 0xDC, 0x05, 0x3C, 0x16, 0xC9, 0x09, 0x0F, 0x19, 0x50, 0x13, 0x10, 0x18, + 0x1B, 0x26, 0x19, 0x17, 0x71, 0x32, 0x53, 0x0F, 0xC4, 0x30, 0xEC, 0x03, + 0x62, 0x24, 0x07, 0x03, 0xA9, 0x17, 0xB9, 0x1B, 0xB4, 0x14, 0xF6, 0x2B, + 0x8E, 0x1E, 0x1C, 0x23, 0x95, 0x2F, 0x00, 0x1D, 0xA9, 0x37, 0xD9, 0x1B, + 0xE4, 0x36, 0x53, 0x1D, 0x83, 0x32, 0x5D, 0x1B, 0xEB, 0x2B, 0xFB, 0x20, + 0x94, 0x24, 0x19, 0x32, 0x9C, 0x1D, 0x34, 0x44, 0x5C, 0x2F, 0xCC, 0x53, + 0xF3, 0x3F, 0xEA, 0x4B, 0x80, 0x3D, 0x9E, 0x2F, 0x4A, 0x32, 0x93, 0x19, + 0xAA, 0x1B, 0xE7, 0x16, 0x41, 0x11, 0x52, 0x14, 0xCA, 0x0C, 0xC2, 0x05, + 0xF6, 0x02, 0xF2, 0xF2, 0xD9, 0xFD, 0x9F, 0xEB, 0x56, 0x13, 0x04, 0x07, + 0x5B, 0x16, 0x14, 0x06, 0xEB, 0x03, 0x7F, 0xEE, 0xCE, 0x14, 0x57, 0xFC, + 0x39, 0x0F, 0xCC, 0xFC, 0x1E, 0xE8, 0xEC, 0xEF, 0x2C, 0xC4, 0x72, 0xE8, + 0x94, 0xD4, 0x23, 0xF3, 0xCF, 0x16, 0xED, 0x0F, 0xE8, 0x0D, 0x18, 0xF3, + 0x59, 0xE7, 0xC9, 0xD1, 0x82, 0xF5, 0x98, 0xE9, 0xFF, 0xE2, 0x47, 0xD9, + 0xEE, 0xAA, 0x4F, 0xB1, 0xE9, 0xAA, 0x0F, 0xCA, 0x31, 0xC7, 0x82, 0xE2, + 0xBC, 0xBB, 0x3A, 0xC8, 0x51, 0xBA, 0x5F, 0xC1, 0x51, 0xC3, 0x66, 0xC9, + 0xA2, 0xB4, 0x72, 0xB8, 0x5D, 0xA3, 0x5E, 0xB1, 0x13, 0xAA, 0xC9, 0xC1, + 0xAB, 0xB7, 0xF0, 0xB6, 0x0E, 0xAE, 0x58, 0xA0, 0xAB, 0xB9, 0xB8, 0xAF, + 0x87, 0xD4, 0x3F, 0xBC, 0xA2, 0xC0, 0xAE, 0xAE, 0x6E, 0xA2, 0x34, 0xAA, + 0x15, 0xB1, 0x08, 0xC6, 0xA0, 0xBC, 0x86, 0xD6, 0x58, 0xA1, 0x83, 0xB7, + 0x3A, 0x9A, 0x3C, 0xA3, 0x9E, 0xAC, 0x68, 0xAD, 0x8A, 0xB1, 0x45, 0xB2, + 0x7A, 0xA6, 0x5C, 0xA9, 0xFB, 0x9F, 0x69, 0x9E, 0x15, 0xAD, 0x3C, 0xA3, + 0x35, 0xB6, 0x62, 0xAB, 0x28, 0xB0, 0xDC, 0xAF, 0xC0, 0x9E, 0xC7, 0xB8, + 0x4F, 0xAA, 0x6F, 0xBA, 0x50, 0xCB, 0xE0, 0xB0, 0xCF, 0xD2, 0x8B, 0xB4, + 0xEC, 0xCF, 0x2C, 0xC3, 0x53, 0xC7, 0xAD, 0xCA, 0x82, 0xCC, 0x07, 0xCC, + 0x13, 0xD8, 0xA0, 0xC4, 0x1D, 0xCE, 0xDE, 0xC3, 0x3E, 0xC5, 0xFE, 0xCA, + 0x97, 0xCA, 0x47, 0xC5, 0xA3, 0xD1, 0x7E, 0xC0, 0xCE, 0xD8, 0xEF, 0xD7, + 0x4F, 0xE5, 0x06, 0xEE, 0xA2, 0xEC, 0xC9, 0xEB, 0xE9, 0xF8, 0x6D, 0xEA, + 0xBD, 0x0F, 0xC0, 0xF5, 0xCF, 0x13, 0x25, 0xFB, 0xC0, 0x03, 0x00, 0xF2, + 0x68, 0xF3, 0xC7, 0xF7, 0xD4, 0xF8, 0x42, 0x0C, 0x6A, 0x13, 0xEB, 0x11, + 0x18, 0x18, 0xD7, 0x05, 0x8D, 0x08, 0xB2, 0x05, 0xE5, 0x07, 0xEC, 0x1F, + 0x61, 0x10, 0xAD, 0x30, 0x77, 0x19, 0xF7, 0x30, 0xD1, 0x26, 0x81, 0x32, + 0x29, 0x2F, 0xF7, 0x2F, 0x0D, 0x2B, 0xBF, 0x28, 0xDE, 0x24, 0xD0, 0x23, + 0x56, 0x29, 0x6A, 0x28, 0xA6, 0x3C, 0xC7, 0x30, 0x85, 0x4E, 0x58, 0x44, + 0x2D, 0x41, 0x97, 0x5A, 0xE7, 0x28, 0xDF, 0x56, 0x3A, 0x32, 0x44, 0x50, + 0xB3, 0x44, 0x79, 0x54, 0x17, 0x40, 0xCA, 0x4D, 0xDA, 0x36, 0x77, 0x3D, + 0x1F, 0x3D, 0xDB, 0x3E, 0x15, 0x46, 0x95, 0x4C, 0x5D, 0x3C, 0x32, 0x4B, + 0xA2, 0x34, 0xE7, 0x49, 0x4E, 0x3D, 0xFF, 0x49, 0x76, 0x49, 0x41, 0x49, + 0xFF, 0x4D, 0xDB, 0x51, 0xE6, 0x52, 0xF7, 0x54, 0xDD, 0x5E, 0x32, 0x56, + 0x72, 0x59, 0x56, 0x5B, 0xFA, 0x48, 0x3E, 0x5F, 0xDA, 0x44, 0x6B, 0x5C, + 0x5E, 0x51, 0x3A, 0x56, 0x69, 0x61, 0xCF, 0x4E, 0xAA, 0x63, 0x2C, 0x4A, + 0x8B, 0x5C, 0x07, 0x4F, 0x87, 0x52, 0x11, 0x52, 0xB9, 0x4F, 0x1F, 0x59, + 0xFB, 0x57, 0x8D, 0x63, 0x76, 0x57, 0x28, 0x5A, 0xD1, 0x4F, 0x59, 0x46, + 0x70, 0x54, 0xB0, 0x3D, 0x1E, 0x5A, 0x54, 0x37, 0x1F, 0x52, 0x40, 0x34, + 0x7E, 0x3F, 0xDD, 0x3E, 0xF9, 0x39, 0x6D, 0x4D, 0x07, 0x44, 0x2B, 0x57, + 0xC8, 0x49, 0xB8, 0x55, 0x7A, 0x4B, 0x88, 0x55, 0xA2, 0x4B, 0xBC, 0x59, + 0xC8, 0x41, 0x5D, 0x51, 0xD9, 0x31, 0x0F, 0x38, 0x93, 0x2E, 0xE5, 0x23, + 0x29, 0x2E, 0x47, 0x23, 0x38, 0x21, 0x22, 0x18, 0xBD, 0x1C, 0xC4, 0x16, + 0x78, 0x2C, 0x69, 0x2D, 0xBF, 0x39, 0xC1, 0x28, 0xA8, 0x3B, 0x43, 0x23, + 0x08, 0x38, 0xF5, 0x3A, 0xC6, 0x29, 0xB3, 0x41, 0xBB, 0x1A, 0x73, 0x32, + 0xE2, 0x1E, 0x54, 0x2D, 0xE6, 0x22, 0x18, 0x21, 0xE5, 0x18, 0x95, 0x09, + 0xBE, 0x18, 0x6F, 0x00, 0x1D, 0x19, 0xBF, 0xFD, 0x18, 0x0E, 0x1D, 0x03, + 0x29, 0x04, 0x53, 0x10, 0x01, 0x00, 0x73, 0x1B, 0x20, 0x01, 0xF3, 0x1E, + 0x7A, 0x0A, 0xAB, 0x1E, 0x60, 0x12, 0x7B, 0x20, 0x95, 0x0A, 0xAE, 0x1D, + 0x84, 0xF8, 0x13, 0x19, 0x66, 0xF0, 0x07, 0x1A, 0xA1, 0xF6, 0xB0, 0x1B, + 0xC5, 0xF4, 0x69, 0x15, 0x58, 0xE8, 0x38, 0x0A, 0x7A, 0xEA, 0x13, 0x05, + 0xB4, 0xF3, 0x2F, 0xFB, 0xA2, 0xF2, 0xB6, 0xE9, 0x4B, 0xE9, 0x3D, 0xE4, + 0x74, 0xE0, 0xF3, 0xF9, 0x72, 0xEF, 0xC2, 0x15, 0x4E, 0xF8, 0x2A, 0x07, + 0xC5, 0xE5, 0x2D, 0xF0, 0xDC, 0xDC, 0x08, 0xEE, 0xCB, 0xE8, 0x0E, 0xEB, + 0x68, 0xF4, 0x9A, 0xEE, 0x31, 0xF3, 0xD1, 0xE0, 0x65, 0xF3, 0x12, 0xCC, + 0x37, 0xED, 0x50, 0xDF, 0xC7, 0xDF, 0xE4, 0xF1, 0x87, 0xE4, 0x00, 0xEC, + 0xAC, 0xF6, 0x6A, 0xE6, 0x56, 0xFD, 0xEB, 0xE0, 0x09, 0xF7, 0xBD, 0xDE, + 0x0F, 0xF0, 0xA9, 0xDC, 0x1D, 0xE8, 0xE4, 0xD7, 0x63, 0xE4, 0xFA, 0xD6, + 0x00, 0xE2, 0xAF, 0xDE, 0x85, 0xE1, 0x98, 0xEC, 0xCA, 0xE3, 0x67, 0xE9, + 0xA9, 0xE4, 0x89, 0xDA, 0x1A, 0xE1, 0x74, 0xD1, 0x10, 0xD5, 0xC6, 0xCE, + 0xE8, 0xCE, 0x6F, 0xCD, 0x82, 0xD4, 0x81, 0xCD, 0x7B, 0xD7, 0x37, 0xCB, + 0x89, 0xDB, 0x48, 0xBE, 0x75, 0xE0, 0x1B, 0xBF, 0x46, 0xDC, 0xD5, 0xC8, + 0xD7, 0xD3, 0x8B, 0xCE, 0x60, 0xDB, 0x1D, 0xD7, 0xDC, 0xEC, 0x59, 0xCD, + 0x2A, 0xE9, 0x1C, 0xC4, 0xE0, 0xD8, 0xAA, 0xD6, 0xB4, 0xD0, 0x1A, 0xE7, + 0x5B, 0xDB, 0x92, 0xE8, 0xEC, 0xEE, 0x91, 0xEA, 0x2F, 0xF3, 0x33, 0xF0, + 0xAE, 0xEA, 0xD0, 0xEB, 0x7E, 0xEB, 0xF4, 0xE3, 0xD7, 0xF7, 0x3C, 0xDF, + 0x07, 0xFF, 0xAA, 0xE1, 0xE0, 0xFB, 0xBA, 0xEC, 0xE2, 0xF2, 0x68, 0xF0, + 0xC6, 0xEC, 0x5F, 0xF2, 0x82, 0xEC, 0x40, 0xF6, 0x2F, 0xF1, 0xE6, 0xFD, + 0xE2, 0xEE, 0x50, 0xFE, 0x33, 0xDF, 0x38, 0xF2, 0x03, 0xDE, 0xB4, 0xF2, + 0x91, 0xF3, 0xCC, 0x01, 0xCB, 0x04, 0x73, 0x0E, 0xD0, 0x09, 0x00, 0x10, + 0x9E, 0x06, 0x25, 0x09, 0xA9, 0xFE, 0xCB, 0x0A, 0x0B, 0xFE, 0xFC, 0x0E, + 0x4C, 0x09, 0x7D, 0x04, 0xD0, 0x10, 0x47, 0x01, 0xCB, 0x12, 0x58, 0x0A, + 0xEE, 0x13, 0x15, 0x0E, 0xC2, 0x09, 0xA7, 0x13, 0x7C, 0x0E, 0xB5, 0x1F, + 0xC5, 0x28, 0x87, 0x1E, 0x82, 0x2B, 0xAC, 0x17, 0x66, 0x1E, 0x0D, 0x25, + 0xF1, 0x21, 0x7C, 0x25, 0xFC, 0x32, 0xE3, 0x16, 0x71, 0x33, 0xC3, 0x18, + 0xE1, 0x27, 0x8E, 0x24, 0xDD, 0x23, 0xA9, 0x2B, 0x19, 0x24, 0xE2, 0x20, + 0x22, 0x25, 0xB7, 0x09, 0x22, 0x24, 0xD2, 0x04, 0x58, 0x26, 0x49, 0x15, + 0x96, 0x20, 0x7D, 0x21, 0xDA, 0x19, 0xAA, 0x27, 0x2E, 0x1C, 0x54, 0x26, + 0x8B, 0x1C, 0xBB, 0x21, 0x4A, 0x14, 0x88, 0x25, 0x92, 0x0B, 0xED, 0x21, + 0x9D, 0x12, 0x7D, 0x12, 0xFD, 0x1B, 0x2F, 0x06, 0xFE, 0x17, 0xD2, 0x04, + 0xD7, 0x03, 0x31, 0x0B, 0xF4, 0xF7, 0x32, 0x0C, 0xC0, 0xFF, 0x4C, 0x08, + 0x67, 0xFC, 0x8D, 0xFC, 0xEC, 0xFF, 0xF1, 0xF2, 0x2A, 0x09, 0xE3, 0xF1, + 0xDA, 0xF4, 0x60, 0xEF, 0xBC, 0xE0, 0x6B, 0xF2, 0x8D, 0xE2, 0xD5, 0xF8, + 0x4D, 0xE5, 0x3E, 0xF5, 0x7C, 0xE0, 0x7E, 0xEF, 0x98, 0xDD, 0x42, 0xF4, + 0x65, 0xED, 0x4E, 0xE8, 0x11, 0xF7, 0xAF, 0xD9, 0xAE, 0xEE, 0x1F, 0xE2, + 0x6D, 0xF3, 0x97, 0xDB, 0x9F, 0xFB, 0x94, 0xDA, 0x24, 0xF1, 0x19, 0xEC, + 0xD9, 0xDF, 0x06, 0xF1, 0x88, 0xD2, 0xB4, 0xF1, 0x28, 0xCB, 0x1D, 0xF1, + 0x91, 0xD3, 0x2C, 0xE8, 0xDA, 0xCF, 0x8C, 0xD9, 0x65, 0xBC, 0x01, 0xDD, + 0xC6, 0xB4, 0xB2, 0xE8, 0x50, 0xB4, 0x7A, 0xE8, 0x33, 0xB9, 0xDB, 0xE3, + 0x6F, 0xC8, 0xC4, 0xD4, 0xC3, 0xC6, 0x13, 0xC6, 0xD0, 0xB4, 0x0C, 0xCD, + 0xF2, 0xB9, 0x3D, 0xD9, 0xBB, 0xD1, 0x85, 0xD9, 0x90, 0xD1, 0xDB, 0xD6, + 0x75, 0xBB, 0x2D, 0xE5, 0x9C, 0xBC, 0xD8, 0xE8, 0x97, 0xD6, 0x94, 0xDD, + 0x47, 0xE0, 0xA5, 0xE3, 0x5D, 0xD6, 0x45, 0xDA, 0xB1, 0xD3, 0xE3, 0xC9, + 0x75, 0xCF, 0x02, 0xCC, 0xCF, 0xCF, 0x81, 0xC8, 0x24, 0xD7, 0x26, 0xC7, + 0x43, 0xC8, 0x5A, 0xD1, 0x43, 0xBF, 0xE3, 0xD9, 0x07, 0xD4, 0x8F, 0xD6, + 0x80, 0xE2, 0x88, 0xD4, 0x63, 0xD7, 0x37, 0xDA, 0xC1, 0xDA, 0x86, 0xD7, + 0x53, 0xEA, 0x2A, 0xD6, 0x26, 0xDE, 0x58, 0xD6, 0x7C, 0xDC, 0x93, 0xDA, + 0x7E, 0xF2, 0xBB, 0xDF, 0x5C, 0xE9, 0x34, 0xDF, 0x46, 0xCB, 0xCD, 0xE5, + 0x78, 0xC8, 0xA2, 0xEB, 0xBF, 0xD2, 0x2D, 0xDF, 0x6D, 0xD6, 0x4C, 0xCB, + 0xC8, 0xD8, 0x57, 0xC8, 0x2D, 0xE1, 0x29, 0xD5, 0xBE, 0xDE, 0x76, 0xDE, + 0x1A, 0xD9, 0x28, 0xDD, 0xC7, 0xE0, 0x6E, 0xD3, 0x0A, 0xDA, 0xDE, 0xCA, + 0xDF, 0xCE, 0x87, 0xCC, 0xD8, 0xD4, 0x52, 0xD2, 0xE2, 0xE6, 0x12, 0xD7, + 0x2A, 0xFA, 0x4E, 0xDB, 0x74, 0xF8, 0x20, 0xDD, 0x1B, 0xE4, 0x5F, 0xE0, + 0x30, 0xE3, 0x90, 0xEC, 0x8E, 0xEC, 0x26, 0xF0, 0x7C, 0xE3, 0x69, 0xE1, + 0x7A, 0xDA, 0x05, 0xDA, 0x0F, 0xEC, 0xD8, 0xD2, 0xB9, 0x01, 0x6A, 0xCD, + 0xB1, 0xF5, 0x3E, 0xE1, 0xD7, 0xDD, 0x57, 0xF0, 0x5A, 0xDC, 0x7A, 0xE8, + 0xA9, 0xE7, 0x76, 0xE2, 0xB4, 0xEE, 0x6E, 0xF2, 0x5A, 0xF5, 0xE6, 0x00, + 0x3B, 0xF9, 0x24, 0xFF, 0x2C, 0x00, 0xB9, 0x06, 0x65, 0x0E, 0x88, 0x0C, + 0x84, 0x0C, 0xE9, 0x07, 0xC8, 0x0A, 0xCE, 0x00, 0x77, 0x1B, 0x7E, 0x01, + 0x18, 0x18, 0x7E, 0x05, 0xB2, 0xFE, 0xCE, 0xFD, 0x39, 0xFD, 0x0F, 0x0A, + 0xF5, 0x0C, 0x67, 0x15, 0xF4, 0x03, 0x70, 0x0F, 0x97, 0xF9, 0x38, 0x0C, + 0xFD, 0x06, 0xD9, 0x0C, 0x61, 0x0F, 0x31, 0x11, 0xB4, 0x07, 0x11, 0x09, + 0xC5, 0x0B, 0xD7, 0x0E, 0x74, 0x1B, 0xE3, 0x1C, 0xB6, 0x19, 0x55, 0x1C, + 0xE2, 0x26, 0x12, 0x26, 0xD4, 0x44, 0xF9, 0x29, 0xCC, 0x42, 0x71, 0x27, + 0x4F, 0x34, 0x2E, 0x2F, 0x01, 0x34, 0x6D, 0x37, 0x48, 0x40, 0x8E, 0x3C, + 0x3B, 0x4A, 0xF4, 0x44, 0x72, 0x50, 0x28, 0x4B, 0xCB, 0x4F, 0xAF, 0x42, + 0x85, 0x3E, 0x96, 0x4A, 0x58, 0x3C, 0x32, 0x5A, 0x29, 0x46, 0xCF, 0x4E, + 0x29, 0x43, 0xC2, 0x43, 0x6C, 0x44, 0x25, 0x3C, 0x45, 0x4D, 0x74, 0x30, + 0xEA, 0x46, 0x35, 0x31, 0x9A, 0x3A, 0xD3, 0x3C, 0x1B, 0x44, 0x9F, 0x3E, + 0x61, 0x4A, 0x13, 0x32, 0x45, 0x47, 0x4E, 0x36, 0x46, 0x4F, 0xEA, 0x3A, + 0x80, 0x4C, 0xE3, 0x33, 0xD2, 0x35, 0x6D, 0x36, 0xD6, 0x2A, 0x01, 0x3D, + 0xF5, 0x38, 0xE0, 0x3E, 0xD9, 0x3F, 0x70, 0x38, 0x10, 0x3C, 0xC5, 0x30, + 0x04, 0x3F, 0x1E, 0x2A, 0xAD, 0x44, 0xEA, 0x28, 0x11, 0x44, 0x98, 0x2B, + 0xD9, 0x3B, 0x45, 0x26, 0x1F, 0x3A, 0x88, 0x29, 0x5C, 0x3B, 0xD3, 0x36, + 0x24, 0x36, 0x4E, 0x42, 0xF7, 0x2D, 0x97, 0x41, 0xA1, 0x30, 0xD7, 0x38, + 0xAF, 0x46, 0x1A, 0x38, 0x3F, 0x44, 0x36, 0x38, 0xB7, 0x2A, 0x04, 0x40, + 0xEF, 0x26, 0x7C, 0x47, 0xC5, 0x28, 0xB1, 0x3D, 0x37, 0x24, 0x10, 0x32, + 0xCB, 0x25, 0xBB, 0x2D, 0x12, 0x2A, 0x3C, 0x29, 0xF6, 0x22, 0x1F, 0x26, + 0xB2, 0x1F, 0xD8, 0x24, 0x8B, 0x21, 0xBF, 0x23, 0x91, 0x0F, 0xC1, 0x26, + 0xF3, 0x00, 0xCF, 0x2B, 0xE6, 0x09, 0x1A, 0x30, 0x72, 0x1D, 0x56, 0x29, + 0x3F, 0x2A, 0x3B, 0x14, 0xC5, 0x2A, 0x8F, 0x05, 0x93, 0x2A, 0xEA, 0x0C, + 0x59, 0x28, 0x46, 0x1B, 0x91, 0x20, 0xEC, 0x1F, 0xDB, 0x1C, 0x85, 0x20, + 0xD7, 0x1D, 0xB2, 0x21, 0x4E, 0x1B, 0x7B, 0x21, 0x31, 0x27, 0x75, 0x19, + 0xBB, 0x31, 0x48, 0x07, 0x61, 0x24, 0x2F, 0xFC, 0x9A, 0x16, 0xF7, 0x0B, + 0xA9, 0x14, 0xBE, 0x1C, 0x40, 0x17, 0xE0, 0x1D, 0x1E, 0x1C, 0x57, 0x24, + 0x89, 0x28, 0x61, 0x24, 0x4E, 0x30, 0x0B, 0x1C, 0x28, 0x2A, 0x98, 0x1B, + 0x66, 0x2C, 0x74, 0x11, 0x9D, 0x37, 0x85, 0x04, 0x30, 0x36, 0xFE, 0x09, + 0x12, 0x22, 0x22, 0x19, 0xCA, 0x18, 0xB0, 0x1E, 0x60, 0x22, 0xFC, 0x15, + 0x82, 0x2C, 0x18, 0x08, 0xB2, 0x34, 0x4A, 0x00, 0xDC, 0x2B, 0x80, 0x0B, + 0x21, 0x24, 0xC4, 0x13, 0x9A, 0x29, 0x55, 0x16, 0x47, 0x24, 0x5D, 0x2A, + 0x5C, 0x19, 0x75, 0x33, 0x80, 0x22, 0x84, 0x25, 0x63, 0x2E, 0x74, 0x2B, + 0xBB, 0x2C, 0xB3, 0x3B, 0xC5, 0x2D, 0x48, 0x33, 0x45, 0x34, 0x89, 0x22, + 0xC2, 0x33, 0xEB, 0x1C, 0x34, 0x29, 0x39, 0x26, 0x37, 0x24, 0xB1, 0x2E, + 0xED, 0x1C, 0x9B, 0x28, 0x3E, 0x10, 0xB2, 0x1F, 0xFB, 0x14, 0x01, 0x13, + 0x21, 0x1C, 0x6F, 0x0E, 0xEA, 0x0F, 0x35, 0x1D, 0xEC, 0xF6, 0xEC, 0x1A, + 0x1D, 0xE9, 0x66, 0x03, 0xBA, 0xEA, 0x7E, 0xFC, 0x71, 0xE2, 0x38, 0x06, + 0x76, 0xD9, 0xF3, 0x06, 0x78, 0xE3, 0x88, 0xFF, 0x2C, 0xEE, 0x15, 0xF6, + 0xE2, 0xEC, 0xAF, 0xE9, 0x21, 0xE6, 0xC2, 0xE9, 0xB4, 0xDB, 0xE4, 0xF1, + 0x50, 0xD4, 0xFB, 0xF8, 0x33, 0xDC, 0xF9, 0xF8, 0xFD, 0xE0, 0x02, 0xF6, + 0x32, 0xE0, 0x1F, 0xFA, 0x6E, 0xE7, 0x5B, 0xF6, 0x43, 0xE7, 0xDE, 0xF8, + 0xF3, 0xE5, 0xF7, 0xFD, 0xE2, 0xEE, 0x98, 0xF0, 0x45, 0xEF, 0xE1, 0xED, + 0x4A, 0xEB, 0xBF, 0xF6, 0x8E, 0xF6, 0x85, 0xF3, 0xE9, 0xFF, 0x79, 0xF1, + 0x68, 0xFD, 0x4F, 0xFC, 0x2E, 0xF9, 0x9E, 0x01, 0x14, 0xFD, 0xF4, 0xF7, + 0xD8, 0xFA, 0x31, 0xEC, 0xCE, 0xF0, 0x01, 0xE1, 0x83, 0xE7, 0x49, 0xDD, + 0x6B, 0xDF, 0x15, 0xEC, 0x09, 0xE6, 0x74, 0xF8, 0x5B, 0xE8, 0x2C, 0xEC, + 0x3E, 0xDE, 0x90, 0xD6, 0x09, 0xDE, 0x7C, 0xD0, 0x21, 0xE6, 0xE8, 0xCF, + 0xB5, 0xD4, 0x85, 0xC5, 0x0E, 0xB2, 0x94, 0xC4, 0x23, 0xB4, 0xE1, 0xC7, + 0xCA, 0xC6, 0x23, 0xC1, 0x9B, 0xC8, 0x95, 0xC3, 0x4F, 0xC0, 0xB4, 0xCB, + 0x54, 0xB1, 0x08, 0xCF, 0x2C, 0xAA, 0xA0, 0xD1, 0x4B, 0xB6, 0x86, 0xD2, + 0x0B, 0xC2, 0x05, 0xCC, 0x7A, 0xB6, 0x5F, 0xCB, 0x2B, 0xAF, 0xE1, 0xD6, + 0x96, 0xB6, 0xD2, 0xD1, 0xEF, 0xB7, 0xEB, 0xC5, 0x7D, 0xBB, 0x7C, 0xB6, + 0x6A, 0xBC, 0x02, 0xAA, 0xC9, 0xB2, 0x28, 0xB0, 0xF9, 0xA8, 0x9D, 0xB1, + 0xB4, 0x9F, 0x55, 0xAC, 0xE9, 0x9B, 0xCB, 0xA7, 0x21, 0x9F, 0xF4, 0xAB, + 0xEC, 0x9E, 0x0C, 0xB9, 0x20, 0x9E, 0xA6, 0xBE, 0x86, 0xA7, 0x0F, 0xB4, + 0x42, 0xB1, 0xEF, 0xAA, 0xA4, 0xB9, 0x77, 0xAD, 0xE3, 0xAF, 0xB0, 0xAC, + 0xEE, 0x9C, 0x4A, 0xAD, 0xD1, 0xA3, 0x29, 0xB1, 0x33, 0xB0, 0x1C, 0xAF, + 0x6E, 0xB0, 0xE1, 0xAC, 0x77, 0xA9, 0x2C, 0xB3, 0x7E, 0xA7, 0x5C, 0xBB, + 0x85, 0xA8, 0x30, 0xB0, 0x0E, 0xA6, 0x09, 0xA3, 0xB6, 0xA6, 0x8A, 0xA4, + 0x55, 0xA4, 0x8D, 0xA8, 0x0D, 0xA0, 0xD6, 0xB3, 0x53, 0xA6, 0xC7, 0xBA, + 0x60, 0xAA, 0x9A, 0xB5, 0xC1, 0xAA, 0xB6, 0xB0, 0xAA, 0xAF, 0x9A, 0xA7, + 0x66, 0xB1, 0xF5, 0x9E, 0x07, 0xAD, 0x42, 0xA4, 0x58, 0xAA, 0x60, 0xAD, + 0x77, 0xAF, 0x61, 0xB0, 0x5B, 0xAE, 0xD9, 0xB4, 0x83, 0xAC, 0x20, 0xB9, + 0x73, 0xB2, 0x6B, 0xA8, 0xCB, 0xB4, 0x36, 0x9A, 0xA1, 0xBA, 0xDC, 0xAB, + 0xF8, 0xBD, 0x3F, 0xBF, 0xFA, 0xBE, 0xA5, 0xC5, 0x79, 0xC7, 0x88, 0xC8, + 0x7C, 0xD1, 0x52, 0xCB, 0x97, 0xD9, 0x7F, 0xC3, 0xEC, 0xCD, 0xCC, 0xC0, + 0x35, 0xBE, 0x4E, 0xCE, 0x3E, 0xC9, 0x9C, 0xC7, 0xEA, 0xD4, 0x19, 0xBF, + 0x90, 0xDA, 0x02, 0xCC, 0x20, 0xE3, 0x1D, 0xDC, 0xAB, 0xE2, 0xEA, 0xE2, + 0x22, 0xE2, 0x8C, 0xE4, 0x18, 0xE7, 0x29, 0xE7, 0xA2, 0xE2, 0x8C, 0xDB, + 0xC7, 0xD8, 0x3C, 0xD4, 0x2E, 0xD7, 0xF0, 0xDD, 0x68, 0xDE, 0xF3, 0xE6, + 0x6C, 0xE0, 0xC0, 0xEB, 0x2D, 0xDC, 0xEC, 0xE8, 0x07, 0xDC, 0x89, 0xE8, + 0x8D, 0xD8, 0x16, 0xEA, 0x6B, 0xDE, 0x74, 0xEA, 0x1F, 0xF2, 0xD2, 0xDE, + 0x9B, 0xF5, 0x06, 0xD5, 0x19, 0xE4, 0x2B, 0xE9, 0xA4, 0xE4, 0x0A, 0xF5, + 0x1A, 0xF0, 0xDF, 0xF0, 0x0E, 0xE1, 0xBC, 0xEF, 0x74, 0xE6, 0xEF, 0xED, + 0xA4, 0xFE, 0xEE, 0xEF, 0x0D, 0xF5, 0x66, 0xF7, 0x1C, 0xE9, 0xE8, 0xFF, + 0xFA, 0xF4, 0x49, 0xFD, 0xB5, 0xFE, 0x4C, 0xF8, 0x1F, 0x01, 0x29, 0xFF, + 0xEA, 0x08, 0xFF, 0x03, 0xEF, 0x04, 0xF8, 0xFE, 0xD1, 0xF5, 0x2C, 0x06, + 0x67, 0xFD, 0xFA, 0x16, 0x40, 0x13, 0x00, 0x10, 0x48, 0x13, 0xCC, 0x0A, + 0x54, 0x11, 0x69, 0x15, 0xBB, 0x22, 0xD8, 0x13, 0xE6, 0x28, 0xBE, 0x14, + 0x39, 0x1C, 0x9E, 0x1D, 0x07, 0x0B, 0xD5, 0x1C, 0xD4, 0x09, 0x9B, 0x16, + 0x69, 0x20, 0x96, 0x18, 0x02, 0x39, 0xE0, 0x12, 0x65, 0x44, 0x6B, 0x09, + 0x5F, 0x40, 0x9F, 0x1C, 0x43, 0x43, 0xF3, 0x29, 0x0E, 0x4C, 0x58, 0x1F, + 0xE5, 0x40, 0xF2, 0x1B, 0x2D, 0x33, 0x2C, 0x27, 0xDA, 0x32, 0x8F, 0x30, + 0xC7, 0x37, 0xDD, 0x2C, 0x3A, 0x38, 0xD1, 0x2B, 0xAA, 0x3B, 0x2D, 0x2C, + 0xAE, 0x47, 0x8A, 0x31, 0x56, 0x4A, 0x2C, 0x3C, 0x94, 0x40, 0x84, 0x3A, + 0x37, 0x35, 0x32, 0x2F, 0xA3, 0x2D, 0x2E, 0x26, 0xD3, 0x2A, 0x43, 0x27, + 0x1E, 0x2B, 0xD1, 0x26, 0x41, 0x28, 0xAE, 0x16, 0xD3, 0x2B, 0xBD, 0x0D, + 0xF7, 0x34, 0xDD, 0x13, 0x8B, 0x2D, 0x95, 0x17, 0xF7, 0x1A, 0xD9, 0x1F, + 0x9D, 0x15, 0xD4, 0x23, 0x86, 0x14, 0xBF, 0x1B, 0x08, 0x13, 0x8D, 0x1B, + 0x07, 0x1F, 0xA1, 0x21, 0x7E, 0x2C, 0xE8, 0x19, 0x63, 0x31, 0x41, 0x08, + 0xDD, 0x2F, 0x31, 0x04, 0x63, 0x2A, 0x42, 0x0F, 0xEC, 0x23, 0xAC, 0x18, + 0x43, 0x25, 0x8E, 0x1C, 0xFB, 0x2D, 0x8D, 0x1D, 0x43, 0x27, 0x2F, 0x1D, + 0x65, 0x23, 0xAE, 0x1A, 0xE7, 0x2A, 0x2F, 0x1B, 0x86, 0x29, 0x2E, 0x1C, + 0x15, 0x1F, 0x9D, 0x22, 0xF8, 0x0D, 0xEE, 0x31, 0x10, 0x09, 0x7D, 0x37, + 0x75, 0x0D, 0x4A, 0x38, 0xD0, 0x17, 0x4B, 0x2E, 0xF8, 0x29, 0xD6, 0x0F, + 0xC4, 0x2D, 0x20, 0xFF, 0x73, 0x18, 0x7E, 0x0D, 0x6D, 0x0B, 0xB9, 0x18, + 0x2B, 0x1A, 0xA0, 0x13, 0x88, 0x13, 0xDA, 0x12, 0x0B, 0x00, 0x60, 0x0E, + 0x31, 0x0B, 0x40, 0x01, 0xA6, 0x17, 0x31, 0xFC, 0x85, 0x11, 0xFC, 0xF9, + 0xC1, 0x15, 0x47, 0xF7, 0xBE, 0x1D, 0x5B, 0xFD, 0xD2, 0x14, 0xFA, 0x09, + 0x58, 0x16, 0x14, 0x0D, 0x9F, 0x1E, 0x6C, 0x05, 0x98, 0x1F, 0x4B, 0x03, + 0x13, 0x25, 0x0B, 0x01, 0x9D, 0x26, 0xB5, 0x00, 0xA3, 0x2A, 0x5D, 0x07, + 0xB1, 0x33, 0xC2, 0x0F, 0x7F, 0x35, 0xEA, 0x14, 0xFD, 0x2D, 0x97, 0x1D, + 0x6D, 0x2B, 0xFF, 0x26, 0x2B, 0x34, 0x5F, 0x1F, 0xC5, 0x2C, 0xFB, 0x1A, + 0xF0, 0x26, 0x53, 0x21, 0xF5, 0x2D, 0x9A, 0x1F, 0xAB, 0x2A, 0x98, 0x18, + 0x77, 0x1A, 0xE0, 0x1A, 0x4C, 0x0C, 0xE2, 0x21, 0x7E, 0x0D, 0xCC, 0x1A, + 0xA7, 0x13, 0x29, 0x0F, 0x23, 0x16, 0x36, 0x04, 0x12, 0x16, 0xB6, 0xFC, + 0x24, 0x1B, 0x7E, 0x07, 0x93, 0x1A, 0xE7, 0x0E, 0xE2, 0x07, 0x3C, 0x0B, + 0x96, 0x00, 0x17, 0x0E, 0x79, 0x14, 0x6E, 0x16, 0x4E, 0x20, 0xAD, 0x1D, + 0x18, 0x1C, 0xF5, 0x17, 0x1D, 0x1E, 0x87, 0x15, 0xCF, 0x27, 0xD7, 0x23, + 0x26, 0x2E, 0xC7, 0x23, 0x85, 0x23, 0xB1, 0x14, 0xD4, 0x18, 0x06, 0x12, + 0xA9, 0x1A, 0x51, 0x15, 0x08, 0x16, 0xF5, 0x18, 0x80, 0x0F, 0x9D, 0x20, + 0x0B, 0x11, 0xB5, 0x1D, 0xE7, 0x17, 0xE1, 0x12, 0x13, 0x18, 0x2C, 0x10, + 0x9F, 0x12, 0xC2, 0x11, 0xFC, 0x0B, 0x93, 0x10, 0x6B, 0xF6, 0x08, 0x14, + 0xEA, 0xE6, 0xDF, 0x1A, 0x54, 0xF0, 0x6A, 0x1F, 0xA0, 0xF8, 0x3E, 0x1B, + 0xD0, 0xFD, 0x1F, 0x10, 0x0A, 0x04, 0x44, 0x0C, 0x40, 0x05, 0x5F, 0x0D, + 0x86, 0x09, 0x9D, 0x0E, 0x04, 0x0D, 0x3C, 0x0B, 0x85, 0x04, 0xF6, 0x06, + 0x14, 0xF9, 0x56, 0x0E, 0x0D, 0xF2, 0x2E, 0x14, 0xA2, 0xED, 0x47, 0x0E, + 0x88, 0xEF, 0x40, 0x09, 0x39, 0xF7, 0x36, 0x0D, 0x0A, 0x05, 0xA9, 0x0A, + 0x86, 0x0B, 0x5E, 0x0E, 0x40, 0x0E, 0x17, 0x1A, 0x6F, 0x16, 0xFE, 0x19, + 0xB2, 0x19, 0x8C, 0x20, 0x31, 0x15, 0x77, 0x26, 0x9B, 0x0E, 0xE4, 0x28, + 0xC5, 0x10, 0xA0, 0x29, 0x92, 0x13, 0x27, 0x21, 0x79, 0x10, 0xCA, 0x1C, + 0xB7, 0x0F, 0xFF, 0x1C, 0x55, 0x0C, 0xB7, 0x26, 0x75, 0x03, 0x9F, 0x2B, + 0x70, 0x00, 0x93, 0x25, 0x2A, 0x05, 0xC0, 0x1E, 0x62, 0x05, 0x5C, 0x18, + 0x7E, 0xFE, 0x02, 0x18, 0x7F, 0x01, 0xCD, 0x11, 0xDF, 0x01, 0x8D, 0x0D, + 0x39, 0xF9, 0x7D, 0x03, 0x89, 0xF9, 0x69, 0xF5, 0x35, 0xFD, 0x75, 0xF9, + 0x12, 0xFD, 0xBE, 0x00, 0x0C, 0xFF, 0xA2, 0x06, 0x3C, 0x00, 0x0A, 0x01, + 0x96, 0xFA, 0x3E, 0xFF, 0xC8, 0xF3, 0x68, 0x02, 0x0A, 0xEE, 0xB7, 0xF8, + 0x5B, 0xE1, 0x51, 0x01, 0xF5, 0xD8, 0x7D, 0x11, 0x52, 0xDD, 0x8B, 0x13, + 0x58, 0xE1, 0x25, 0x0D, 0x5B, 0xE3, 0xC7, 0x05, 0x9D, 0xEC, 0x07, 0xF3, + 0x7C, 0xF6, 0xA0, 0xDE, 0x49, 0xEB, 0xE1, 0xEB, 0x74, 0xD6, 0x1A, 0xF7, + 0xB1, 0xCA, 0x09, 0xF4, 0xC7, 0xCA, 0xDD, 0xF4, 0x46, 0xD5, 0x88, 0xEB, + 0xCC, 0xCF, 0x38, 0xDF, 0xBD, 0xBC, 0xB8, 0xD7, 0x23, 0xC1, 0x9B, 0xD6, + 0x74, 0xD1, 0xDA, 0xD4, 0xFC, 0xD2, 0x6A, 0xD3, 0x0F, 0xC9, 0xA8, 0xD2, + 0x2D, 0xC0, 0xAA, 0xD6, 0xB7, 0xBA, 0xC4, 0xDA, 0x12, 0xBE, 0x1D, 0xD3, + 0x66, 0xCB, 0xD5, 0xC7, 0x6A, 0xC8, 0xB2, 0xC5, 0x7A, 0xB8, 0xB6, 0xD3, + 0xAF, 0xC0, 0xC9, 0xDD, 0x66, 0xDD, 0x7B, 0xD7, 0x64, 0xDD, 0x76, 0xD4, + 0x53, 0xC2, 0x58, 0xDB, 0x86, 0xB8, 0x64, 0xDC, 0x16, 0xB8, 0xCF, 0xDA, + 0xD6, 0xB8, 0xC2, 0xD6, 0xEE, 0xBA, 0x2D, 0xCA, 0x8F, 0xB5, 0xF5, 0xC0, + 0x1B, 0xB6, 0x62, 0xC2, 0x32, 0xBE, 0xB1, 0xC2, 0x07, 0xBC, 0x72, 0xB8, + 0x53, 0xB7, 0x73, 0xB0, 0x45, 0xBD, 0x84, 0xAF, 0xC6, 0xB7, 0x99, 0xAF, + 0x85, 0xA3, 0x2E, 0xB7, 0xED, 0xA0, 0xDB, 0xBB, 0x87, 0xB1, 0x07, 0xBA, + 0x8B, 0xC0, 0x68, 0xBD, 0x65, 0xC3, 0x90, 0xC3, 0x73, 0xC3, 0x94, 0xC4, + 0x3C, 0xCA, 0x7F, 0xC9, 0xFE, 0xCC, 0x15, 0xDB, 0x00, 0xCD, 0xB0, 0xD7, + 0x6E, 0xCD, 0xA9, 0xC8, 0xFF, 0xD2, 0x3B, 0xCA, 0xCB, 0xD1, 0x56, 0xC6, + 0x7C, 0xC9, 0xB9, 0xC3, 0x29, 0xC6, 0xBF, 0xC7, 0xDB, 0xC0, 0xE9, 0xCD, + 0x18, 0xC5, 0x6D, 0xCD, 0x86, 0xD2, 0xB4, 0xC5, 0x19, 0xDD, 0x22, 0xC6, + 0x15, 0xD9, 0x4A, 0xC8, 0xFF, 0xD0, 0x71, 0xD2, 0xE7, 0xD5, 0x45, 0xDD, + 0x1C, 0xD0, 0x8D, 0xD9, 0x7F, 0xCC, 0x1E, 0xCC, 0xB9, 0xD3, 0x58, 0xC3, + 0x2E, 0xD2, 0x77, 0xCA, 0xA9, 0xD3, 0x88, 0xD0, 0x7B, 0xD4, 0x53, 0xCD, + 0x03, 0xE0, 0xB5, 0xC9, 0x74, 0xFC, 0x89, 0xC8, 0x79, 0xFE, 0x0A, 0xCA, + 0x38, 0xE1, 0x06, 0xD2, 0x0E, 0xCE, 0x6F, 0xDB, 0xD0, 0xCC, 0xE5, 0xD4, + 0x2B, 0xCC, 0x59, 0xD4, 0xE2, 0xCC, 0x0D, 0xE3, 0x72, 0xDA, 0x9A, 0xE3, + 0xA8, 0xED, 0xB9, 0xDD, 0x4A, 0xF4, 0xC0, 0xE2, 0xE9, 0xF2, 0xA0, 0xEB, + 0xA7, 0xEC, 0x42, 0xF4, 0xC9, 0xE0, 0x6D, 0x00, 0x1D, 0xE1, 0xE1, 0x00, + 0xF9, 0xE7, 0x79, 0xF6, 0x96, 0xED, 0x83, 0xF7, 0xC9, 0xF6, 0x32, 0xFB, + 0xEC, 0xF7, 0x62, 0xFD, 0x10, 0xED, 0xD8, 0x03, 0xA2, 0xE8, 0x8C, 0x01, + 0xD0, 0xED, 0x26, 0xF9, 0x57, 0xEF, 0x5E, 0xFA, 0x08, 0xFF, 0x76, 0xFD, + 0xA1, 0x12, 0xDE, 0xF7, 0x80, 0x14, 0xF3, 0xF3, 0x5B, 0x18, 0xF2, 0xFE, + 0x5D, 0x1E, 0x15, 0x06, 0xF1, 0x20, 0x89, 0xFD, 0xAE, 0x23, 0x9D, 0x03, + 0xC8, 0x24, 0xA4, 0x0F, 0xAD, 0x31, 0x14, 0x14, 0x33, 0x3F, 0x14, 0x18, + 0x37, 0x3F, 0xF6, 0x0E, 0x32, 0x3D, 0xD6, 0x05, 0xD6, 0x2F, 0x27, 0x09, + 0xCB, 0x26, 0xDE, 0x13, 0x96, 0x2B, 0x06, 0x24, 0xF4, 0x26, 0x21, 0x2F, + 0xB3, 0x27, 0x33, 0x28, 0x58, 0x30, 0xA1, 0x1C, 0xC2, 0x2A, 0x95, 0x1A, + 0x2D, 0x2D, 0x87, 0x11, 0x7C, 0x40, 0x71, 0x09, 0x97, 0x43, 0x9B, 0x0D, + 0x33, 0x2F, 0x56, 0x1C, 0x22, 0x21, 0x14, 0x24, 0xF8, 0x1F, 0xBE, 0x1E, + 0xD3, 0x22, 0x6C, 0x1B, 0x8F, 0x27, 0xE9, 0x0F, 0x19, 0x2D, 0x23, 0x06, + 0x50, 0x3A, 0xC9, 0xFE, 0x01, 0x44, 0x49, 0xFE, 0xF6, 0x36, 0x51, 0x09, + 0x8B, 0x22, 0x36, 0x10, 0x4C, 0x18, 0x1A, 0x13, 0x0B, 0x19, 0xE2, 0x0A, + 0xB6, 0x21, 0x5D, 0x01, 0x43, 0x2E, 0x9A, 0x04, 0x12, 0x38, 0x8D, 0x0F, + 0x4C, 0x2F, 0x48, 0x1C, 0x12, 0x28, 0x26, 0x28, 0x85, 0x2F, 0x87, 0x2B, + 0x27, 0x2F, 0x2F, 0x25, 0xAB, 0x28, 0xA8, 0x25, 0xB6, 0x23, 0x82, 0x2E, + 0x66, 0x25, 0x5B, 0x2C, 0x51, 0x2C, 0xA2, 0x23, 0xC6, 0x26, 0x7F, 0x23, + 0xB6, 0x18, 0x0B, 0x24, 0x4A, 0x10, 0xE4, 0x1F, 0x95, 0x12, 0xB5, 0x21, + 0xFB, 0x19, 0x53, 0x1B, 0x54, 0x17, 0x24, 0x09, 0x84, 0x0A, 0x62, 0x05, + 0x78, 0x04, 0xF5, 0x08, 0x9D, 0x06, 0xB5, 0x09, 0x2A, 0x0B, 0x2A, 0x05, + 0xB4, 0x12, 0x03, 0x00, 0x39, 0x18, 0xF9, 0xFB, 0xAD, 0x17, 0xDA, 0xFA, + 0x45, 0x12, 0x22, 0x08, 0x51, 0x18, 0xFD, 0x0B, 0xD6, 0x2A, 0x54, 0x0C, + 0x52, 0x32, 0x85, 0x0F, 0x1E, 0x30, 0xBE, 0x06, 0x77, 0x28, 0xE0, 0x03, + 0x40, 0x1A, 0x01, 0x0F, 0x53, 0x14, 0x77, 0x1D, 0x41, 0x1D, 0x1D, 0x26, + 0xCE, 0x21, 0x2B, 0x21, 0xC7, 0x21, 0x73, 0x13, 0xD3, 0x2C, 0xE3, 0x14, + 0xF7, 0x30, 0xDF, 0x1E, 0x38, 0x22, 0xAA, 0x21, 0x62, 0x15, 0x43, 0x25, + 0xB7, 0x12, 0x6E, 0x22, 0xDA, 0x16, 0xE8, 0x1B, 0x1D, 0x1C, 0xD5, 0x18, + 0x72, 0x16, 0xCE, 0x16, 0xDF, 0x0F, 0xB3, 0x0E, 0x02, 0x18, 0x7C, 0x02, + 0xB6, 0x23, 0x3F, 0xFE, 0x67, 0x26, 0xCE, 0xFF, 0x64, 0x28, 0xC4, 0x05, + 0x11, 0x2C, 0xE1, 0x0B, 0x89, 0x22, 0x78, 0x0E, 0x48, 0x11, 0x98, 0x12, + 0xD2, 0x0C, 0x41, 0x16, 0x60, 0x1D, 0x69, 0x14, 0x05, 0x2C, 0x82, 0x15, + 0xE8, 0x24, 0x7B, 0x1C, 0xAC, 0x26, 0xE4, 0x16, 0x7A, 0x2E, 0x12, 0x0F, + 0xD1, 0x26, 0xF4, 0x19, 0x5C, 0x1C, 0xF0, 0x29, 0x36, 0x1C, 0xB3, 0x28, + 0xA3, 0x24, 0x18, 0x24, 0x8E, 0x27, 0x6A, 0x22, 0x11, 0x21, 0x1A, 0x19, + 0x3A, 0x15, 0xFE, 0x1D, 0x54, 0x0A, 0xD9, 0x23, 0x74, 0xFC, 0xD4, 0x1C, + 0xE8, 0xF6, 0xE3, 0x15, 0x51, 0x04, 0xF0, 0x14, 0x26, 0x0D, 0x11, 0x1C, + 0x9D, 0x0D, 0x71, 0x1E, 0xEE, 0x06, 0x48, 0x1E, 0x10, 0x05, 0x0C, 0x15, + 0x6A, 0x0D, 0x80, 0x09, 0xFC, 0x06, 0x00, 0x12, 0x8C, 0x04, 0x5A, 0x1A, + 0x48, 0x0D, 0x6E, 0x20, 0x85, 0x0F, 0x8A, 0x22, 0x76, 0x14, 0x73, 0x1B, + 0x4C, 0x20, 0xE8, 0x0E, 0xBE, 0x19, 0x81, 0x07, 0x5E, 0x05, 0xB0, 0x0C, + 0x9A, 0x02, 0xA7, 0x14, 0x8F, 0x05, 0x19, 0x26, 0x21, 0x0C, 0xA6, 0x30, + 0x2A, 0x1A, 0x28, 0x2D, 0x22, 0x1D, 0x40, 0x22, 0xDE, 0x17, 0x69, 0x1A, + 0xA3, 0x19, 0x8D, 0x23, 0x96, 0x23, 0x90, 0x26, 0xAF, 0x27, 0xB0, 0x25, + 0xD3, 0x24, 0x58, 0x27, 0x59, 0x1C, 0xCA, 0x25, 0x42, 0x11, 0xA2, 0x28, + 0x2C, 0x15, 0xA0, 0x28, 0xF9, 0x22, 0xB1, 0x1B, 0x3A, 0x2B, 0x85, 0x09, + 0x59, 0x26, 0x23, 0x0C, 0x05, 0x1F, 0xA6, 0x1B, 0x24, 0x1B, 0xE4, 0x19, + 0x31, 0x1C, 0x48, 0x15, 0xDC, 0x17, 0x3D, 0x10, 0xB1, 0x0E, 0xF0, 0x07, + 0xF2, 0x10, 0xCA, 0x04, 0x43, 0x11, 0x76, 0x06, 0x4B, 0x14, 0xB7, 0x0E, + 0x67, 0x1A, 0x4B, 0x13, 0xB1, 0x0A, 0x28, 0x16, 0x56, 0x01, 0xDE, 0x16, + 0xAA, 0x0D, 0x97, 0x0E, 0x26, 0x13, 0x35, 0x0C, 0xBE, 0x13, 0xDC, 0x0F, + 0xA7, 0x08, 0xA6, 0x0E, 0x69, 0xEF, 0xA6, 0x17, 0x0D, 0xE7, 0xCF, 0x1B, + 0x8B, 0xEB, 0x8E, 0x10, 0x4C, 0xEF, 0x7E, 0x0C, 0x21, 0xE8, 0xA2, 0x09, + 0x56, 0xDA, 0x31, 0x00, 0x89, 0xDA, 0x9D, 0xF6, 0x19, 0xD0, 0xC4, 0xF7, + 0x55, 0xC0, 0xC5, 0xFD, 0x83, 0xC3, 0x08, 0xFD, 0xBE, 0xCE, 0xE9, 0xF2, + 0xD2, 0xD6, 0xF1, 0xDF, 0x08, 0xDA, 0xFF, 0xD5, 0x43, 0xCA, 0x90, 0xD6, + 0xF2, 0xBC, 0xF3, 0xE4, 0x16, 0xCB, 0x82, 0xF3, 0x51, 0xD6, 0x01, 0xF2, + 0x51, 0xDB, 0xA8, 0xE6, 0x47, 0xE1, 0x34, 0xDC, 0x2F, 0xD4, 0xB0, 0xDD, + 0x75, 0xC5, 0xD6, 0xE4, 0x2A, 0xC5, 0xB1, 0xF1, 0x5B, 0xCD, 0x11, 0xF1, + 0xE5, 0xDA, 0xE1, 0xEB, 0x89, 0xE3, 0x7B, 0xF1, 0x2A, 0xE1, 0x7F, 0xEB, + 0x42, 0xD9, 0xE7, 0xE6, 0xAD, 0xD6, 0x60, 0xE7, 0xDE, 0xD9, 0x25, 0xE9, + 0x0A, 0xDD, 0x32, 0xE8, 0xFF, 0xD8, 0x78, 0xE4, 0x53, 0xD5, 0x36, 0xED, + 0xBC, 0xD6, 0xC8, 0xE7, 0xBA, 0xD0, 0x58, 0xDD, 0x90, 0xCB, 0x8B, 0xE3, + 0x0C, 0xD8, 0xBA, 0xDD, 0x24, 0xEC, 0xC7, 0xD0, 0xD5, 0xEE, 0x7A, 0xD3, + 0x4B, 0xF0, 0xEE, 0xD2, 0x7A, 0xF0, 0x5F, 0xC7, 0xED, 0xCF, 0x8D, 0xD0, + 0x91, 0xB8, 0xC1, 0xDC, 0x3B, 0xC9, 0x05, 0xD2, 0x97, 0xD2, 0x7A, 0xD5, + 0xB7, 0xD6, 0x33, 0xE3, 0x5C, 0xE5, 0x0C, 0xDC, 0x18, 0xDB, 0x4C, 0xD5, + 0x78, 0xC7, 0x58, 0xE2, 0x39, 0xCD, 0x95, 0xEB, 0x89, 0xD6, 0x57, 0xE6, + 0x32, 0xD7, 0x6E, 0xEA, 0x0A, 0xE2, 0x1E, 0xF0, 0xAE, 0xEA, 0x24, 0xED, + 0xA8, 0xE6, 0x7C, 0xEA, 0xBF, 0xD4, 0x6F, 0xE8, 0x82, 0xC4, 0x84, 0xE8, + 0x3C, 0xC3, 0xF7, 0xE6, 0x75, 0xC6, 0xD6, 0xE1, 0xD8, 0xD3, 0xB8, 0xDD, + 0xDA, 0xE1, 0x24, 0xE4, 0xEA, 0xEA, 0xCF, 0xE1, 0xBA, 0xED, 0x2F, 0xCF, + 0x93, 0xDC, 0xEB, 0xCA, 0x97, 0xD5, 0x4A, 0xDA, 0xAD, 0xE0, 0x87, 0xE5, + 0x88, 0xE5, 0x61, 0xEE, 0xC0, 0xEB, 0x30, 0xEF, 0x84, 0xEE, 0xF7, 0xDA, + 0xAA, 0xE7, 0x6C, 0xCD, 0x28, 0xE7, 0xBC, 0xCA, 0xDE, 0xE5, 0xA6, 0xD1, + 0x1E, 0xE5, 0xFD, 0xE1, 0xE9, 0xE4, 0xE6, 0xED, 0x60, 0xDC, 0x62, 0xF4, + 0x64, 0xDD, 0xCA, 0xF2, 0xDB, 0xDC, 0x9F, 0xF4, 0xF2, 0xD5, 0xC1, 0xF6, + 0xC3, 0xDC, 0xA3, 0xEC, 0xE3, 0xED, 0x82, 0xED, 0x1B, 0xF1, 0xF6, 0xF1, + 0xEF, 0xE7, 0x7E, 0xED, 0xF2, 0xE0, 0x30, 0xEB, 0x5C, 0xD6, 0xB5, 0xE8, + 0x1A, 0xD3, 0x30, 0xE6, 0xDA, 0xE3, 0x98, 0xE4, 0xC6, 0xFD, 0xB1, 0xE0, + 0x3E, 0x01, 0x8B, 0xDA, 0xD5, 0xFB, 0x2A, 0xDB, 0x62, 0x01, 0x87, 0xE2, + 0x38, 0xFB, 0xED, 0xF0, 0xEF, 0xFC, 0x76, 0xF6, 0x13, 0x09, 0x64, 0xEE, + 0x06, 0x0E, 0x83, 0xE7, 0x50, 0x18, 0x38, 0xEA, 0xDE, 0x1E, 0x4D, 0xF6, + 0x17, 0x1A, 0x74, 0xFC, 0x6F, 0x16, 0xF2, 0x00, 0x90, 0x13, 0x35, 0x07, + 0x43, 0x10, 0x44, 0x08, 0x3F, 0x20, 0xB3, 0x03, 0x11, 0x2C, 0x2A, 0x02, + 0xFD, 0x25, 0x31, 0x06, 0x01, 0x21, 0xAE, 0x0B, 0xEF, 0x11, 0x29, 0x16, + 0xB6, 0x0B, 0xBC, 0x12, 0xCA, 0x12, 0x60, 0x08, 0x77, 0x0E, 0x40, 0x07, + 0x00, 0x06, 0xDB, 0xF8, 0x45, 0xF8, 0x01, 0xEA, 0x7B, 0xEC, 0xD2, 0xF4, + 0x85, 0xF3, 0x95, 0x04, 0x2F, 0x06, 0xAA, 0xF6, 0x63, 0x07, 0x0B, 0xE5, + 0x4F, 0xF9, 0x95, 0xE1, 0x6A, 0xF5, 0x5B, 0xD6, 0xC1, 0xEB, 0xED, 0xD3, + 0xBB, 0xE3, 0x38, 0xE0, 0x68, 0xE2, 0x84, 0xE4, 0x41, 0xE5, 0x15, 0xDC, + 0xE0, 0xF4, 0xCA, 0xD7, 0x56, 0x04, 0x8D, 0xD7, 0x29, 0xFE, 0x6D, 0xDC, + 0xBA, 0xD9, 0xEA, 0xEB, 0x1B, 0xC9, 0x59, 0xF0, 0x8E, 0xDB, 0xC8, 0xEB, + 0xA0, 0xE6, 0x5B, 0xEE, 0x4A, 0xEB, 0xD2, 0xE9, 0x0A, 0xEA, 0xA1, 0xD8, + 0x89, 0xDA, 0x51, 0xD2, 0xAA, 0xD0, 0x85, 0xD6, 0xA0, 0xD7, 0xF0, 0xD3, + 0xC0, 0xDD, 0x0F, 0xD8, 0xF3, 0xD6, 0x56, 0xEA, 0x07, 0xD1, 0x68, 0xE9, + 0x47, 0xCD, 0x4A, 0xD6, 0xC5, 0xC8, 0xEB, 0xCE, 0xDA, 0xCF, 0xC8, 0xD0, + 0xB3, 0xDD, 0x29, 0xD3, 0x34, 0xEC, 0x17, 0xD9, 0x37, 0xF9, 0xF2, 0xD8, + 0xC1, 0x00, 0xB0, 0xD1, 0x25, 0x00, 0x77, 0xCE, 0xA7, 0xF9, 0x99, 0xCB, + 0x64, 0xED, 0x78, 0xC9, 0x20, 0xE7, 0x0B, 0xCD, 0x10, 0xF3, 0xF8, 0xCE, + 0x20, 0xFD, 0x7E, 0xD7, 0x53, 0x02, 0x18, 0xEA, 0x12, 0x09, 0xBF, 0xEF, + 0xC0, 0x05, 0x05, 0xE4, 0x44, 0xFB, 0x00, 0xE2, 0xDF, 0xFE, 0x25, 0xF5, + 0xBA, 0x0D, 0x6A, 0x01, 0x85, 0x14, 0x5B, 0x01, 0x97, 0x14, 0x1B, 0x06, + 0x0A, 0x0C, 0xCC, 0x01, 0x72, 0xFF, 0xBB, 0xFE, 0x66, 0xFA, 0x9F, 0x06, + 0xE7, 0xF1, 0xEC, 0x09, 0xF8, 0xF0, 0x03, 0x0C, 0x40, 0xFD, 0x77, 0x0A, + 0x1C, 0x03, 0xAA, 0x06, 0xCD, 0x09, 0xCD, 0xFD, 0x5C, 0x05, 0xE5, 0xF7, + 0xC9, 0xF8, 0xAF, 0xF8, 0x88, 0xF3, 0xC7, 0xF9, 0x54, 0xFE, 0x20, 0x07, + 0xAD, 0x16, 0x19, 0x12, 0x9E, 0x1F, 0x3C, 0x11, 0xBB, 0x22, 0x94, 0x08, + 0x09, 0x23, 0x05, 0xF7, 0x43, 0x20, 0x82, 0xF0, 0x1A, 0x27, 0xB9, 0xFE, + 0x41, 0x25, 0xDF, 0x14, 0xA0, 0x1C, 0x41, 0x1A, 0xB3, 0x25, 0x8F, 0x15, + 0x84, 0x2B, 0x05, 0x1B, 0xF2, 0x19, 0x08, 0x1F, 0x0D, 0x0A, 0x54, 0x25, + 0xD8, 0x0C, 0x5D, 0x30, 0xC7, 0x17, 0xCA, 0x31, 0x70, 0x1B, 0x64, 0x26, + 0xD2, 0x17, 0xC3, 0x1A, 0xE2, 0x12, 0xF1, 0x20, 0xF3, 0x0C, 0xEE, 0x2B, + 0x50, 0x0E, 0xBE, 0x29, 0xA3, 0x15, 0xDB, 0x1D, 0x3D, 0x1C, 0xC2, 0x1A, + 0xE3, 0x20, 0x08, 0x1E, 0xA9, 0x25, 0xEE, 0x1C, 0x25, 0x26, 0x98, 0x19, + 0x03, 0x1D, 0xB4, 0x16, 0x9E, 0x18, 0xFF, 0x19, 0x93, 0x20, 0x55, 0x1E, + 0x86, 0x2F, 0xC7, 0x1E, 0x77, 0x38, 0x41, 0x1B, 0x69, 0x2A, 0x5C, 0x19, + 0x30, 0x18, 0x18, 0x23, 0xD6, 0x1C, 0x43, 0x2E, 0x93, 0x2A, 0xCC, 0x2E, + 0xB7, 0x30, 0x4C, 0x2C, 0x7F, 0x36, 0x47, 0x32, 0xC4, 0x41, 0xF3, 0x38, + 0x32, 0x42, 0x62, 0x3E, 0x97, 0x32, 0x84, 0x46, 0xD0, 0x2D, 0x6F, 0x4D, + 0x75, 0x32, 0x3A, 0x57, 0x97, 0x3A, 0x2D, 0x5D, 0xBD, 0x49, 0x41, 0x4D, + 0xE3, 0x46, 0x3B, 0x35, 0x03, 0x2C, 0x13, 0x3A, 0x1B, 0x23, 0x36, 0x46, + 0xDE, 0x2A, 0xA9, 0x41, 0x66, 0x2D, 0x9F, 0x3D, 0x4F, 0x3D, 0x35, 0x34, + 0x53, 0x46, 0x83, 0x22, 0x8B, 0x38, 0xAA, 0x1F, 0x4B, 0x2E, 0x6F, 0x2C, + 0xEE, 0x2F, 0x21, 0x2C, 0x58, 0x30, 0x74, 0x2E, 0xEA, 0x31, 0xA4, 0x3C, + 0x9C, 0x3D, 0x92, 0x3A, 0x24, 0x48, 0xC9, 0x2D, 0xB9, 0x44, 0x54, 0x30, + 0xC1, 0x3A, 0x1B, 0x41, 0xF1, 0x37, 0x6D, 0x42, 0xDE, 0x36, 0xC1, 0x40, + 0x0A, 0x37, 0x29, 0x3E, 0x19, 0x39, 0x55, 0x30, 0x44, 0x34, 0x49, 0x2B, + 0xB8, 0x34, 0x7D, 0x2A, 0xB2, 0x31, 0xF4, 0x2B, 0xAA, 0x29, 0x8D, 0x2A, + 0x91, 0x24, 0x0D, 0x2A, 0x98, 0x1E, 0x3D, 0x35, 0x87, 0x18, 0x7C, 0x3D, + 0x61, 0x11, 0x93, 0x3C, 0x7F, 0x12, 0x1A, 0x31, 0xD6, 0x0E, 0x9F, 0x28, + 0x31, 0x03, 0x7A, 0x2A, 0xD7, 0x12, 0x11, 0x26, 0x72, 0x23, 0x01, 0x1E, + 0x31, 0x12, 0x70, 0x18, 0xAE, 0x04, 0x88, 0x0F, 0xA3, 0x03, 0x22, 0xFF, + 0x04, 0xF6, 0xB5, 0xF3, 0x89, 0xE5, 0x69, 0xF1, 0xE2, 0xDF, 0x67, 0xF1, + 0x69, 0xE1, 0x3E, 0xF1, 0xDD, 0xE3, 0xF5, 0xED, 0x0E, 0xDF, 0xCC, 0xE8, + 0x83, 0xD8, 0xC6, 0xE2, 0x81, 0xD7, 0x8D, 0xEA, 0x9B, 0xE2, 0xF2, 0xF8, + 0x9E, 0xEB, 0x1C, 0xFB, 0x49, 0xEC, 0xCC, 0xF5, 0x38, 0xF2, 0x3D, 0xEE, + 0x59, 0xF5, 0x14, 0xE8, 0xC9, 0xE9, 0x31, 0xE0, 0x75, 0xD9, 0x77, 0xE0, + 0x20, 0xD3, 0xD6, 0xF2, 0xCF, 0xCF, 0x3C, 0x02, 0xCC, 0xD7, 0x05, 0x08, + 0x8F, 0xEE, 0x72, 0x05, 0x26, 0xFA, 0x9B, 0xF3, 0x75, 0xE7, 0x11, 0xE7, + 0x9E, 0xD9, 0x85, 0xE6, 0xF6, 0xEB, 0xA0, 0xEA, 0xF8, 0xF9, 0x29, 0xFF, + 0xA1, 0xF9, 0x69, 0x16, 0x91, 0x05, 0xCA, 0x12, 0x42, 0x1E, 0x54, 0x04, + 0xB1, 0x1F, 0xA1, 0xFE, 0xA5, 0x11, 0x68, 0xF9, 0x63, 0x13, 0x34, 0xFC, + 0xF9, 0x17, 0x63, 0x0C, 0xE5, 0x1F, 0xB5, 0x20, 0x67, 0x24, 0x8D, 0x28, + 0xED, 0x16, 0xCF, 0x1E, 0x06, 0x0F, 0xA6, 0x1F, 0x47, 0x0E, 0xB8, 0x2D, + 0x0B, 0x10, 0xB3, 0x34, 0x76, 0x19, 0xA9, 0x33, 0xD6, 0x18, 0x27, 0x26, + 0x87, 0x0D, 0x27, 0x1E, 0x97, 0x06, 0xC2, 0x29, 0x31, 0x08, 0x0F, 0x2A, + 0xB9, 0x00, 0xD7, 0x1A, 0x4C, 0xF2, 0x07, 0x15, 0xAE, 0xF9, 0x57, 0x10, + 0x74, 0x0B, 0x01, 0x03, 0x04, 0x08, 0x26, 0xF9, 0xFC, 0xFA, 0xB5, 0xFB, + 0x75, 0xF2, 0xC4, 0x01, 0x93, 0xF4, 0x52, 0xFF, 0x95, 0x03, 0xCD, 0xF5, + 0x2E, 0x06, 0x25, 0xED, 0x68, 0x03, 0x59, 0xEB, 0x78, 0x05, 0xDF, 0xEF, + 0x77, 0xFF, 0x13, 0xFB, 0x92, 0xF9, 0xDC, 0xF9, 0xA7, 0xFF, 0x3D, 0xFE, + 0x07, 0x0E, 0xC4, 0x14, 0xD4, 0x1A, 0x8F, 0x12, 0x1D, 0x1A, 0xBF, 0x02, + 0xA4, 0x05, 0x5F, 0xFF, 0xB9, 0xEB, 0x5E, 0x0C, 0x22, 0xF0, 0x9E, 0x1D, + 0x87, 0x04, 0x04, 0x29, 0x9C, 0x06, 0x49, 0x2B, 0xE2, 0x04, 0x3E, 0x22, + 0x04, 0x05, 0xD2, 0x26, 0x8A, 0x04, 0xAE, 0x2D, 0x39, 0x05, 0xAB, 0x28, + 0x7A, 0x05, 0xC3, 0x26, 0x5C, 0x02, 0x45, 0x29, 0x38, 0x00, 0x1C, 0x20, + 0x8C, 0x03, 0xF8, 0x05, 0xCB, 0xFE, 0x65, 0xF9, 0xDB, 0xF0, 0x7F, 0x00, + 0x54, 0xE8, 0x73, 0x01, 0x99, 0xEB, 0x55, 0xFA, 0xE9, 0xFA, 0x12, 0xF0, + 0xC7, 0xFE, 0x25, 0xE0, 0xEF, 0xEF, 0x7E, 0xD6, 0xBE, 0xF1, 0x49, 0xDD, + 0x9F, 0xF5, 0x96, 0xD8, 0xA9, 0xDD, 0xA0, 0xD0, 0xCF, 0xCF, 0xA3, 0xD8, + 0x32, 0xD9, 0xA9, 0xD5, 0x4F, 0xDD, 0xA7, 0xCF, 0xEF, 0xD4, 0x70, 0xC8, + 0x80, 0xD8, 0x9A, 0xB9, 0x28, 0xDA, 0x3B, 0xAB, 0x56, 0xC8, 0x5E, 0xB6, + 0xC8, 0xCA, 0x0B, 0xD3, 0xD5, 0xCF, 0x73, 0xD6, 0x9D, 0xC7, 0x58, 0xD9, + 0xC4, 0xC4, 0xEA, 0xD8, 0x96, 0xC3, 0x27, 0xC9, 0x89, 0xC5, 0x8A, 0xC4, + 0x0A, 0xCD, 0xE5, 0xC0, 0xA3, 0xD3, 0x60, 0xBD, 0xE1, 0xDC, 0xAC, 0xCC, + 0x93, 0xF1, 0x11, 0xDB, 0xE7, 0xF9, 0x90, 0xD1, 0x81, 0xED, 0xEC, 0xC3, + 0x98, 0xDA, 0xAF, 0xBB, 0x33, 0xD4, 0x2F, 0xBC, 0xEB, 0xD6, 0xC2, 0xC3, + 0x78, 0xCB, 0xB7, 0xCB, 0x10, 0xC6, 0x96, 0xCB, 0x8E, 0xCA, 0xD2, 0xC7, + 0x70, 0xD8, 0xA2, 0xD6, 0x8C, 0xE3, 0x20, 0xE5, 0x58, 0xD7, 0xBC, 0xDE, + 0xC8, 0xCC, 0xF3, 0xD6, 0x93, 0xC7, 0xA2, 0xDE, 0x68, 0xC1, 0x2D, 0xDB, + 0x61, 0xCC, 0x56, 0xCC, 0xC5, 0xCD, 0xAE, 0xC6, 0x57, 0xAE, 0xD9, 0xC3, + 0x41, 0x9D, 0xA3, 0xD3, 0x89, 0xAA, 0x6B, 0xE3, 0x4D, 0xB7, 0xAD, 0xE3, + 0x3C, 0xC2, 0x2B, 0xE5, 0xBF, 0xC0, 0xA9, 0xDC, 0x53, 0xBF, 0x08, 0xD5, + 0x69, 0xD3, 0xD6, 0xD8, 0xA2, 0xDA, 0xF7, 0xE0, 0xC0, 0xD3, 0xED, 0xE3, + 0xE3, 0xD6, 0xC2, 0xE8, 0xDA, 0xED, 0x96, 0xE6, 0x90, 0x0C, 0x37, 0xE0, + 0x37, 0x16, 0xD9, 0xE7, 0x4A, 0x0D, 0xE9, 0xE9, 0x20, 0x17, 0xFD, 0xF3, + 0x8F, 0x24, 0x62, 0x02, 0x28, 0x17, 0x33, 0x00, 0x0B, 0x0F, 0x5D, 0xF3, + 0x29, 0x0A, 0xFB, 0xEE, 0xE1, 0xFF, 0xDB, 0xF8, 0x81, 0x00, 0x28, 0xF6, + 0x05, 0xFD, 0xB7, 0xF3, 0x2A, 0xF9, 0x6A, 0x01, 0xC1, 0x06, 0x16, 0x10, + 0x16, 0x1A, 0x44, 0x19, 0x4D, 0x0F, 0x59, 0x0E, 0x5E, 0xF7, 0xD8, 0x00, + 0x0A, 0xFF, 0x29, 0x07, 0x30, 0x0F, 0xFE, 0x0D, 0x86, 0xFB, 0x90, 0xF2, + 0x9B, 0xE4, 0xFC, 0xDD, 0x50, 0xEF, 0xE4, 0xF9, 0xC7, 0xF4, 0xB0, 0x01, + 0x28, 0xF8, 0x08, 0xED, 0x45, 0xF8, 0xE3, 0xE0, 0x7F, 0xF3, 0x67, 0xE5, + 0x52, 0x00, 0x4D, 0xE4, 0x64, 0xFF, 0xEF, 0xD2, 0x9F, 0xF2, 0x75, 0xD9, + 0x14, 0xF5, 0xC4, 0xE6, 0xA3, 0xF5, 0xB8, 0xDF, 0x57, 0xF2, 0x39, 0xDB, + 0xDE, 0x03, 0x2C, 0xE1, 0x55, 0x0E, 0x41, 0xDD, 0xF5, 0xFC, 0x86, 0xDB, + 0xCC, 0xEF, 0x0A, 0xE5, 0xFF, 0xEF, 0x27, 0xF2, 0xBA, 0xEF, 0x4E, 0xF3, + 0xB1, 0xE9, 0x06, 0xEB, 0x14, 0xEA, 0xFE, 0xEA, 0xD2, 0xE1, 0x8A, 0xE6, + 0x90, 0xD9, 0x89, 0xE7, 0x77, 0xD7, 0xB6, 0xE7, 0xD4, 0xCB, 0xFC, 0xE0, + 0x0D, 0xD7, 0xAC, 0xEC, 0x6C, 0xE1, 0xF3, 0xF4, 0x00, 0xE0, 0xC2, 0xEF, + 0x54, 0xE8, 0x77, 0xEC, 0xD6, 0xE1, 0x9E, 0xE3, 0xDB, 0xDA, 0xD9, 0xE3, + 0xEA, 0xE1, 0x66, 0xEE, 0x8E, 0xE8, 0x5C, 0xEC, 0x66, 0xEB, 0x0F, 0xE0, + 0x1C, 0xEC, 0x8D, 0xDE, 0x70, 0xF3, 0xB5, 0xEA, 0xC7, 0x00, 0x4F, 0xF0, + 0x2A, 0x0E, 0x6E, 0xF2, 0xF6, 0x15, 0x96, 0xFD, 0x39, 0x18, 0x5C, 0x06, + 0x22, 0x13, 0xC2, 0x0A, 0xBA, 0x10, 0x18, 0x1C, 0x4A, 0x1D, 0xB4, 0x23, + 0xD0, 0x2B, 0x79, 0x1B, 0x3F, 0x28, 0xFD, 0x14, 0x48, 0x19, 0xF7, 0x11, + 0x91, 0x13, 0x00, 0x14, 0xEF, 0x18, 0x30, 0x1C, 0xF1, 0x1F, 0xEF, 0x33, + 0xAB, 0x23, 0xDD, 0x3D, 0xB1, 0x28, 0xB4, 0x3B, 0xE3, 0x2C, 0xEE, 0x45, + 0xED, 0x33, 0xF1, 0x45, 0xA2, 0x3B, 0x39, 0x3C, 0x2F, 0x40, 0x50, 0x30, + 0xFF, 0x4C, 0x7A, 0x2E, 0x4D, 0x4E, 0x3C, 0x29, 0x0E, 0x40, 0x6B, 0x18, + 0x4A, 0x41, 0x36, 0x1A, 0x5E, 0x4A, 0x0F, 0x20, 0x54, 0x35, 0xE6, 0x22, + 0xD6, 0x1C, 0x52, 0x21, 0xFA, 0x28, 0x63, 0x1C, 0xD4, 0x29, 0x00, 0x0E, + 0xD5, 0x19, 0x1D, 0xFD, 0x77, 0x1D, 0x62, 0x01, 0xF7, 0x28, 0x71, 0x13, + 0x8A, 0x27, 0x39, 0x1E, 0x9A, 0x25, 0x23, 0x14, 0x71, 0x34, 0xB1, 0x10, + 0x9E, 0x2A, 0x3C, 0x06, 0x7D, 0x07, 0x1C, 0xF7, 0x44, 0x00, 0xF1, 0x05, + 0xAE, 0xFB, 0xD5, 0x13, 0x90, 0xF5, 0xBE, 0x1E, 0x8D, 0xFF, 0x27, 0x2D, + 0xCD, 0xFB, 0xE0, 0x2A, 0x7D, 0x00, 0xDD, 0x17, 0x88, 0x0C, 0x0D, 0x04, + 0x8C, 0x08, 0xC6, 0x04, 0x28, 0x07, 0xB0, 0x13, 0xCB, 0x02, 0x18, 0x20, + 0xF0, 0xFE, 0x4A, 0x1D, 0xEE, 0x05, 0x5A, 0x06, 0x79, 0x04, 0xC2, 0xFB, + 0x3A, 0x07, 0x72, 0xF6, 0x8F, 0x1B, 0x3F, 0xEB, 0xDA, 0x1B, 0xEE, 0xF4, + 0xA9, 0x04, 0xCD, 0xF9, 0xBD, 0x05, 0x39, 0xF7, 0xA9, 0x11, 0xF5, 0x05, + 0x42, 0xFD, 0xA2, 0x08, 0x93, 0xEA, 0xAF, 0xF4, 0x7A, 0xF1, 0xAD, 0xF1, + 0x82, 0xF1, 0x8D, 0xF1, 0xA5, 0xF3, 0xDA, 0xDE, 0xE9, 0xF0, 0xC2, 0xD8, + 0x2A, 0xDA, 0x40, 0xE6, 0xBB, 0xD6, 0xFC, 0xE7, 0x4B, 0xE3, 0x98, 0xE0, + 0x34, 0xEB, 0xF3, 0xEA, 0xF8, 0xE7, 0xDD, 0xED, 0xF2, 0xE3, 0x37, 0xE5, + 0xEB, 0xE0, 0xC7, 0xE3, 0xD2, 0xE1, 0x4B, 0xEC, 0x16, 0xF5, 0x67, 0xF4, + 0x25, 0xFF, 0x74, 0xF6, 0x16, 0x07, 0x40, 0xFE, 0xCA, 0x0D, 0x02, 0xFD, + 0xF9, 0x15, 0xD4, 0xFE, 0xF0, 0x1C, 0x61, 0x09, 0xBC, 0x26, 0x3C, 0x14, + 0x06, 0x35, 0xF2, 0x31, 0x67, 0x2E, 0x59, 0x3B, 0x90, 0x37, 0x1F, 0x2B, + 0x66, 0x48, 0x8C, 0x2E, 0xFC, 0x42, 0xA2, 0x36, 0xAE, 0x48, 0x86, 0x3E, + 0xD2, 0x49, 0x27, 0x4A, 0x8E, 0x45, 0x65, 0x4F, 0x58, 0x51, 0xFB, 0x53, + 0x54, 0x4F, 0x1F, 0x50, 0xE2, 0x39, 0x9D, 0x4B, 0x52, 0x30, 0x7C, 0x52, + 0xD6, 0x3A, 0x16, 0x4D, 0x56, 0x38, 0x95, 0x47, 0x74, 0x2E, 0xB2, 0x50, + 0xA7, 0x3B, 0xD4, 0x52, 0xD6, 0x40, 0xBF, 0x4C, 0xBF, 0x27, 0xDD, 0x3C, + 0x4A, 0x0F, 0xA0, 0x2E, 0x22, 0x0E, 0xFB, 0x2A, 0x69, 0x08, 0x6D, 0x1F, + 0x50, 0x02, 0xE7, 0x18, 0x0A, 0x16, 0x62, 0x15, 0xD2, 0x23, 0x93, 0x14, + 0x08, 0x1D, 0x65, 0x22, 0x1D, 0x19, 0x0A, 0x26, 0xE2, 0x2C, 0x23, 0x22, + 0x42, 0x32, 0x99, 0x1E, 0x0E, 0x19, 0xDA, 0x18, 0xB6, 0x16, 0x01, 0x22, + 0xCF, 0x22, 0x71, 0x30, 0x62, 0x22, 0xDF, 0x38, 0xDD, 0x25, 0xCC, 0x37, + 0x27, 0x2B, 0x72, 0x39, 0xC8, 0x2E, 0xCA, 0x40, 0x63, 0x2F, 0xB5, 0x2F, + 0x08, 0x2D, 0xBB, 0x36, 0xEC, 0x29, 0x5A, 0x5D, 0x08, 0x28, 0xAF, 0x5C, + 0x54, 0x2A, 0xC5, 0x4F, 0x4C, 0x27, 0x94, 0x53, 0x79, 0x1A, 0x64, 0x4C, + 0x3B, 0x15, 0x8A, 0x3C, 0x2F, 0x28, 0xD2, 0x41, 0x29, 0x40, 0xD9, 0x55, + 0xD4, 0x3A, 0x4C, 0x57, 0x35, 0x3B, 0xE9, 0x4B, 0x21, 0x4B, 0x25, 0x45, + 0xB8, 0x47, 0x5C, 0x3A, 0xA3, 0x3D, 0xC0, 0x22, 0x02, 0x30, 0x94, 0x14, + 0x23, 0x2A, 0x65, 0x1C, 0x5B, 0x2A, 0x15, 0x28, 0x1E, 0x28, 0xD1, 0x26, + 0xB6, 0x29, 0x06, 0x25, 0x7C, 0x2A, 0xFC, 0x2A, 0xB5, 0x25, 0x06, 0x27, + 0x66, 0x22, 0x5F, 0x1E, 0x35, 0x27, 0x02, 0x10, 0xAC, 0x24, 0x47, 0x03, + 0xF2, 0x1A, 0x61, 0x06, 0x27, 0x0A, 0x1F, 0x09, 0xA8, 0xF8, 0xD1, 0x0A, + 0x6C, 0xEF, 0x0B, 0x0A, 0x01, 0xE1, 0x00, 0x07, 0x68, 0xDC, 0x17, 0x03, + 0xB3, 0xDD, 0xDD, 0xF7, 0x9F, 0xDC, 0x07, 0xEE, 0xB0, 0xE8, 0xE7, 0xF5, + 0xD4, 0xF5, 0xB7, 0xFA, 0x75, 0xFB, 0x98, 0xFD, 0x57, 0xFC, 0x3F, 0x0F, + 0xE5, 0xF7, 0x12, 0x0C, 0x59, 0xF7, 0xA7, 0xFB, 0xCB, 0x08, 0x9B, 0xF8, + 0xB6, 0x18, 0xFB, 0x00, 0xC0, 0x0D, 0xBE, 0x02, 0x56, 0x10, 0x1C, 0x00, + 0xF9, 0x24, 0xF4, 0x0A, 0xDA, 0x21, 0xAE, 0x10, 0x0C, 0x13, 0x8B, 0x16, + 0xC5, 0x0D, 0x4B, 0x20, 0x47, 0x0C, 0x63, 0x14, 0x5E, 0x00, 0x26, 0x09, + 0xB1, 0xFE, 0xDF, 0x10, 0x23, 0x05, 0x3D, 0x16, 0xF0, 0x01, 0x66, 0x17, + 0x0E, 0xEC, 0x43, 0x12, 0xE4, 0xDB, 0x00, 0x09, 0xD7, 0xEA, 0x37, 0x07, + 0xFB, 0xEB, 0x0F, 0xFC, 0x49, 0xE3, 0xA6, 0xF9, 0xAA, 0xE0, 0xE0, 0xFE, + 0x79, 0xD8, 0x35, 0xF5, 0x70, 0xD0, 0xB1, 0xF2, 0x54, 0xD0, 0x3E, 0xF3, + 0x94, 0xD8, 0xE4, 0xEB, 0xF0, 0xE0, 0x24, 0xE3, 0x4D, 0xE5, 0x51, 0xD5, + 0x36, 0xEE, 0x81, 0xCE, 0xFD, 0xF2, 0x22, 0xDC, 0xD2, 0xE6, 0x55, 0xE9, + 0xBB, 0xD8, 0xA2, 0xEB, 0x27, 0xE2, 0xCA, 0xE9, 0x2B, 0xF3, 0xD7, 0xD0, + 0xAA, 0xEA, 0x78, 0xBE, 0xDF, 0xE5, 0x9B, 0xDA, 0x2E, 0xF4, 0xC8, 0xED, + 0xC6, 0x00, 0x22, 0xE6, 0xF6, 0x07, 0x62, 0xF8, 0x85, 0x0D, 0x13, 0x17, + 0x09, 0x0F, 0x26, 0x17, 0x2F, 0x05, 0xBF, 0xFE, 0xEC, 0x03, 0x16, 0xFC, + 0x96, 0x06, 0xC2, 0x0E, 0x49, 0xF4, 0x33, 0x0F, 0xD7, 0xF2, 0x8C, 0x00, + 0x36, 0xFA, 0x64, 0xFB, 0x2A, 0xF4, 0xC9, 0x01, 0xF7, 0xEE, 0x74, 0x05, + 0x70, 0xE6, 0xA0, 0x06, 0xFF, 0xE8, 0xA1, 0x02, 0x51, 0xDE, 0xCF, 0xF0, + 0x4C, 0xCB, 0xD7, 0xDF, 0x91, 0xD0, 0xB0, 0xD3, 0x1B, 0xD0, 0x31, 0xCE, + 0x92, 0xD1, 0x8C, 0xD2, 0x27, 0xE3, 0x9D, 0xD6, 0x02, 0xE7, 0xFA, 0xD3, + 0xDE, 0xDE, 0x29, 0xCD, 0xD7, 0xE3, 0x03, 0xD3, 0xC5, 0xE7, 0x0E, 0xD6, + 0x8F, 0xD7, 0x90, 0xD2, 0x6D, 0xCB, 0xC4, 0xD9, 0x62, 0xCF, 0x2E, 0xDA, + 0x29, 0xD6, 0xAE, 0xCA, 0x9C, 0xD9, 0x6A, 0xCA, 0x45, 0xDC, 0x28, 0xD3, + 0xDA, 0xE0, 0x90, 0xD0, 0x26, 0xDB, 0x22, 0xD6, 0xC2, 0xCA, 0xD6, 0xDA, + 0x79, 0xC3, 0x2D, 0xD7, 0x2A, 0xC9, 0x4F, 0xD8, 0xF7, 0xC4, 0x58, 0xDE, + 0x3A, 0xC8, 0xE7, 0xE1, 0x18, 0xD4, 0x76, 0xE0, 0x1F, 0xCF, 0xF8, 0xE2, + 0x51, 0xE0, 0x47, 0xE5, 0x74, 0xFA, 0x87, 0xE0, 0x4F, 0xF8, 0xCE, 0xE4, + 0x29, 0xE6, 0xC1, 0xE3, 0x42, 0xE0, 0x56, 0xD5, 0x25, 0xE8, 0xF3, 0xD4, + 0xC2, 0xF1, 0x4F, 0xE2, 0x34, 0xF6, 0xF4, 0xDC, 0x72, 0xF3, 0x1E, 0xDA, + 0x3A, 0xE9, 0x7C, 0xEE, 0x76, 0xE5, 0x50, 0xEA, 0x59, 0xF5, 0x02, 0xDF, + 0xF2, 0x04, 0x05, 0xF3, 0x52, 0x06, 0x3B, 0x01, 0xF3, 0x07, 0x49, 0x00, + 0x07, 0x11, 0x47, 0x02, 0x29, 0x0A, 0x51, 0xF7, 0x04, 0x01, 0xB1, 0xF2, + 0xF5, 0x04, 0x5B, 0x0F, 0x01, 0x00, 0xCA, 0x23, 0x8D, 0xF8, 0x02, 0x13, + 0x0B, 0xFB, 0x35, 0x01, 0xD5, 0x01, 0x07, 0x07, 0xDC, 0xFE, 0x77, 0x02, + 0x21, 0xEF, 0x41, 0xF8, 0xD7, 0xED, 0x95, 0x06, 0x2D, 0xF7, 0x76, 0xFB, + 0x5D, 0xF5, 0xA0, 0xE3, 0x07, 0xF7, 0x02, 0xF6, 0x86, 0x00, 0x7C, 0xFC, + 0x03, 0x01, 0xA8, 0xE3, 0xBB, 0x07, 0x3E, 0xDF, 0x53, 0x13, 0xF6, 0xE7, + 0xD9, 0x0A, 0x44, 0xD9, 0x7E, 0xFE, 0x0F, 0xCE, 0x07, 0xF6, 0x7A, 0xD8, + 0x08, 0xEE, 0x7B, 0xDA, 0xCC, 0xEF, 0x1E, 0xD7, 0x27, 0xF3, 0xA1, 0xD4, + 0x37, 0xF7, 0x45, 0xCD, 0x0E, 0xF4, 0x1E, 0xD3, 0x20, 0xE2, 0x99, 0xDD, + 0x75, 0xD2, 0x4E, 0xE1, 0x34, 0xCD, 0x88, 0xE2, 0xD7, 0xD1, 0xDA, 0xE0, + 0x7D, 0xCE, 0x3F, 0xDE, 0x92, 0xC2, 0xCE, 0xCF, 0x7D, 0xB5, 0x8D, 0xBB, + 0x62, 0xAE, 0xD5, 0xC0, 0xB5, 0xBA, 0x5F, 0xD7, 0xF9, 0xBB, 0x6A, 0xDC, + 0xE6, 0xB4, 0xD2, 0xD1, 0x52, 0xC4, 0x48, 0xBF, 0xB3, 0xD2, 0xE0, 0xB2, + 0x95, 0xC4, 0xE2, 0xB5, 0xDE, 0xAA, 0xD8, 0xB8, 0x28, 0xAB, 0x56, 0xB0, + 0x5A, 0xC3, 0x04, 0xAF, 0x8F, 0xCE, 0x39, 0xBD, 0xDA, 0xC5, 0x22, 0xBD, + 0xC4, 0xC5, 0xE5, 0xB7, 0x12, 0xD0, 0x02, 0xBD, 0xB4, 0xCF, 0xD9, 0xC2, + 0xC0, 0xD1, 0x0D, 0xCC, 0xAA, 0xDE, 0x32, 0xD8, 0x8F, 0xE6, 0xD2, 0xDC, + 0xDF, 0xE3, 0x73, 0xD8, 0x3D, 0xE6, 0x58, 0xDD, 0xE3, 0xEA, 0x57, 0xE9, + 0x23, 0xDB, 0x87, 0xF0, 0xCD, 0xD9, 0x82, 0xF8, 0x5E, 0xF4, 0x3F, 0x01, + 0xEA, 0xFB, 0xA7, 0xEF, 0x68, 0xF6, 0x4D, 0xE0, 0x29, 0xF5, 0x38, 0xF2, + 0xE5, 0xF2, 0xC0, 0xF8, 0xFA, 0xF2, 0x78, 0xF3, 0xCD, 0xEF, 0xE5, 0xF2, + 0xC5, 0xEC, 0x7B, 0xE9, 0x0E, 0xF1, 0x2C, 0xE2, 0xC3, 0xF4, 0x24, 0xE6, + 0x7B, 0xFA, 0x8C, 0xEF, 0x8B, 0x07, 0xCA, 0xF0, 0x3D, 0x14, 0x94, 0xEA, + 0x85, 0x18, 0x88, 0xED, 0x12, 0x0D, 0x3B, 0xEC, 0xB6, 0x08, 0xFE, 0xF5, + 0x6E, 0x0B, 0xF2, 0x0D, 0x29, 0x03, 0x4B, 0x0E, 0x57, 0xFF, 0xC1, 0xFB, + 0x20, 0x02, 0x04, 0xF9, 0xFF, 0x05, 0x5A, 0x05, 0xFC, 0x14, 0x3E, 0x07, + 0xC3, 0x1A, 0x9C, 0x01, 0xD4, 0x11, 0x99, 0x0A, 0x22, 0x17, 0xF3, 0x11, + 0x70, 0x12, 0x4A, 0x11, 0xA8, 0xFD, 0x68, 0x18, 0xF3, 0xFC, 0x50, 0x12, + 0x72, 0x04, 0xDE, 0x05, 0xC6, 0x06, 0xFE, 0x1B, 0xFD, 0x10, 0x30, 0x25, + 0xF9, 0x1E, 0x58, 0x0E, 0xE0, 0x1C, 0xFA, 0x0E, 0x52, 0x0E, 0x61, 0x10, + 0x0B, 0x0B, 0x64, 0x00, 0x09, 0x18, 0xBC, 0x04, 0x95, 0x1D, 0x59, 0x0E, + 0x30, 0x19, 0x7D, 0xFC, 0x52, 0x19, 0xB6, 0xF9, 0x64, 0x0A, 0x3B, 0x0C, + 0x09, 0x00, 0x85, 0x08, 0x1D, 0x13, 0x3D, 0xFC, 0x50, 0x2A, 0xC7, 0x0F, + 0x70, 0x37, 0xEF, 0x25, 0x4B, 0x36, 0x3C, 0x21, 0xF0, 0x30, 0x7F, 0x24, + 0x30, 0x30, 0x59, 0x2F, 0x57, 0x31, 0x7C, 0x2C, 0x5F, 0x2F, 0xD4, 0x28, + 0x47, 0x1E, 0xF2, 0x33, 0x6E, 0x15, 0xEA, 0x3F, 0x1F, 0x1F, 0x39, 0x39, + 0x58, 0x27, 0xF4, 0x2E, 0xDB, 0x2C, 0xB4, 0x33, 0x3A, 0x1F, 0x71, 0x3B, + 0xF5, 0x13, 0x98, 0x3C, 0x75, 0x20, 0xCF, 0x45, 0xAF, 0x1A, 0xAA, 0x43, + 0x4A, 0x09, 0x19, 0x2C, 0xB7, 0x0B, 0x36, 0x1D, 0x9A, 0x0E, 0x76, 0x1E, + 0xA5, 0x1B, 0x4B, 0x27, 0xDE, 0x36, 0x63, 0x22, 0xB1, 0x3E, 0x29, 0x13, + 0xEB, 0x34, 0xB7, 0x12, 0x07, 0x2E, 0xAC, 0x20, 0x04, 0x26, 0xCE, 0x25, + 0xE9, 0x21, 0xBB, 0x1A, 0x8A, 0x2E, 0xC6, 0x16, 0x88, 0x42, 0x14, 0x16, + 0x56, 0x41, 0x0D, 0x13, 0xDF, 0x2B, 0x5B, 0x19, 0x26, 0x1F, 0x43, 0x15, + 0x30, 0x1C, 0x68, 0x1A, 0x07, 0x21, 0x77, 0x30, 0xA8, 0x1B, 0x27, 0x31, + 0xF9, 0x10, 0xB8, 0x1C, 0x98, 0x0F, 0x15, 0x0B, 0xCE, 0x06, 0x77, 0x11, + 0xD1, 0xFB, 0xC0, 0x1D, 0x44, 0x01, 0xCF, 0x1E, 0x96, 0x09, 0xFF, 0x1D, + 0xE7, 0x0F, 0x0C, 0x15, 0xB5, 0x18, 0xDC, 0xFF, 0xD7, 0x10, 0xB9, 0xF7, + 0xCF, 0x05, 0x19, 0xFD, 0x16, 0x08, 0xF6, 0xFA, 0xE0, 0x05, 0x97, 0x01, + 0x05, 0x05, 0x5E, 0x08, 0x74, 0x0E, 0x84, 0x03, 0x17, 0x0A, 0x86, 0xFB, + 0x8D, 0x02, 0xA6, 0xF8, 0x01, 0xFF, 0x5E, 0xF2, 0x73, 0x00, 0x14, 0xF1, + 0x84, 0x14, 0xC2, 0x0A, 0x52, 0x1E, 0x31, 0x1F, 0x64, 0x1A, 0xE2, 0x15, + 0x99, 0x14, 0x80, 0x0B, 0x7C, 0x09, 0x27, 0x0E, 0xFF, 0x08, 0xD1, 0x15, + 0x0B, 0x08, 0x5F, 0x1B, 0x9F, 0x03, 0x35, 0x21, 0x59, 0x08, 0x9E, 0x21, + 0xCA, 0x01, 0xFC, 0x18, 0x96, 0xF3, 0x9F, 0x17, 0xB2, 0xF8, 0xFD, 0x12, + 0xC1, 0xF8, 0xA7, 0x0E, 0x56, 0xED, 0xA6, 0x16, 0x1D, 0xEF, 0xB9, 0x11, + 0x76, 0xEE, 0x01, 0x00, 0x51, 0xF3, 0xAF, 0xF9, 0xAE, 0x04, 0x7A, 0x02, + 0xC0, 0x07, 0x90, 0x0C, 0xA5, 0x05, 0x1A, 0x09, 0xE2, 0x0F, 0x8F, 0x04, + 0xE5, 0x1F, 0x21, 0x00, 0x87, 0x2A, 0x22, 0xFF, 0x63, 0x1F, 0x21, 0x0D, + 0x51, 0x0C, 0x25, 0x0D, 0x0C, 0x0A, 0xF3, 0xFF, 0x59, 0x0E, 0x29, 0x08, + 0x5E, 0x1A, 0x5D, 0x1B, 0xEA, 0x2A, 0xB8, 0x1C, 0x46, 0x29, 0x7E, 0x16, + 0x5B, 0x1F, 0x46, 0x1F, 0x93, 0x23, 0x92, 0x20, 0xBA, 0x26, 0x24, 0x10, + 0x10, 0x17, 0x04, 0x14, 0xE1, 0xFE, 0x68, 0x1B, 0x8F, 0xFC, 0x92, 0x15, + 0x09, 0x00, 0xAA, 0x1A, 0xDF, 0xF7, 0x60, 0x1D, 0x28, 0x06, 0xD0, 0x0F, + 0xB9, 0x0C, 0x79, 0x0E, 0xD1, 0xFA, 0x5E, 0x1F, 0xDC, 0xFA, 0xD5, 0x1A, + 0x8C, 0x0B, 0x92, 0x13, 0x4D, 0x10, 0x10, 0x10, 0x1B, 0x0A, 0x38, 0xFF, + 0xF5, 0x08, 0xC8, 0xF7, 0x2C, 0x04, 0x7B, 0xFD, 0x2D, 0xF8, 0x56, 0xFD, + 0xD6, 0xF9, 0x7A, 0xFC, 0x40, 0x06, 0x1A, 0x08, 0x61, 0x12, 0xC4, 0x17, + 0x35, 0x16, 0x02, 0x22, 0x6E, 0x11, 0xC0, 0x20, 0x95, 0x1B, 0x43, 0x1B, + 0x2C, 0x2B, 0x0D, 0x1B, 0x1D, 0x28, 0x80, 0x1E, 0xB3, 0x21, 0xED, 0x31, + 0x22, 0x26, 0xA9, 0x42, 0x70, 0x2B, 0x48, 0x3F, 0x20, 0x30, 0x40, 0x42, + 0x74, 0x30, 0x3D, 0x47, 0x4F, 0x2A, 0x0F, 0x44, 0xF8, 0x2D, 0x38, 0x42, + 0xB2, 0x2F, 0xA6, 0x41, 0x54, 0x21, 0x48, 0x3C, 0x5D, 0x18, 0x5D, 0x42, + 0x4B, 0x1B, 0x09, 0x51, 0xF1, 0x1F, 0x15, 0x4C, 0x68, 0x20, 0x96, 0x3B, + 0x66, 0x22, 0x6E, 0x36, 0x64, 0x2F, 0x20, 0x37, 0xA6, 0x3A, 0x7B, 0x2D, + 0xB9, 0x3C, 0xEB, 0x23, 0xF3, 0x35, 0x96, 0x22, 0xD6, 0x27, 0xC8, 0x23, + 0xEA, 0x23, 0x37, 0x2C, 0x75, 0x2C, 0x3D, 0x2D, 0xA9, 0x2F, 0x6A, 0x1B, + 0x3A, 0x2B, 0xC5, 0x0B, 0xBB, 0x1E, 0x96, 0x12, 0x55, 0x11, 0x3A, 0x23, + 0x84, 0x13, 0x44, 0x2C, 0x0D, 0x19, 0x27, 0x32, 0x7D, 0x1A, 0x98, 0x2B, + 0xED, 0x19, 0x1F, 0x15, 0x6A, 0x08, 0xD1, 0x0D, 0xFC, 0xF4, 0x87, 0x08, + 0xEA, 0xEA, 0x24, 0x02, 0x29, 0xE5, 0xF4, 0x07, 0x5C, 0xF3, 0x5C, 0x05, + 0x7C, 0x02, 0xBC, 0x01, 0x91, 0xFE, 0xBC, 0xFE, 0x8A, 0xF3, 0xB7, 0xFC, + 0x28, 0xF0, 0x89, 0xF9, 0xC5, 0xEC, 0x07, 0xE9, 0x0E, 0xE5, 0x94, 0xE4, + 0x23, 0xE3, 0x35, 0xEF, 0xC2, 0xE4, 0x35, 0xE8, 0x45, 0xE4, 0x77, 0xD7, + 0x70, 0xE4, 0xB8, 0xCF, 0x94, 0xED, 0xDB, 0xCE, 0xA5, 0xF3, 0x38, 0xD1, + 0xE4, 0xEE, 0xEB, 0xD6, 0xE4, 0xEF, 0x7F, 0xDD, 0x63, 0xF4, 0x48, 0xD2, + 0xB6, 0xEE, 0x7B, 0xCC, 0x11, 0xE6, 0x96, 0xDE, 0xDA, 0xE5, 0x13, 0xE2, + 0xCE, 0xDF, 0x7E, 0xDB, 0xAB, 0xD7, 0x31, 0xE8, 0x05, 0xD6, 0xB0, 0xEC, + 0xFA, 0xD7, 0x50, 0xE2, 0xFD, 0xD5, 0x47, 0xE4, 0xCF, 0xD4, 0xC6, 0xEA, + 0x45, 0xD5, 0x78, 0xEC, 0x48, 0xC1, 0xDD, 0xE7, 0xEF, 0xB6, 0x13, 0xDC, + 0xE4, 0xBA, 0x1D, 0xCF, 0xBD, 0xB3, 0x52, 0xCD, 0x81, 0xB7, 0x48, 0xD0, + 0x81, 0xBF, 0x53, 0xC8, 0x1B, 0xBD, 0xF8, 0xC5, 0x24, 0xC3, 0x0B, 0xC3, + 0x02, 0xD0, 0xB3, 0xBD, 0x80, 0xD1, 0x0B, 0xCB, 0xFD, 0xC9, 0x25, 0xDB, + 0x13, 0xCF, 0x24, 0xDF, 0xD4, 0xDD, 0x3F, 0xDD, 0x69, 0xDD, 0x30, 0xDE, + 0x4A, 0xD7, 0xC4, 0xE2, 0xC9, 0xDD, 0xA8, 0xDD, 0xE4, 0xE0, 0x9E, 0xD5, + 0xEC, 0xE2, 0x82, 0xDD, 0xF8, 0xEA, 0x5A, 0xE3, 0x16, 0xEB, 0xEF, 0xDF, + 0xE1, 0xE9, 0x39, 0xED, 0x5D, 0xDF, 0xEF, 0xF0, 0x31, 0xCE, 0x72, 0xDE, + 0x72, 0xCC, 0x11, 0xDD, 0x34, 0xD3, 0xA7, 0xE1, 0x4D, 0xDA, 0xB7, 0xDA, + 0x95, 0xD9, 0x35, 0xDF, 0xC8, 0xCD, 0x85, 0xEE, 0xC1, 0xD2, 0x7B, 0xF1, + 0x8F, 0xEB, 0x6A, 0xE5, 0x5D, 0xEE, 0xD8, 0xD5, 0x14, 0xE1, 0x78, 0xC6, + 0xD8, 0xDB, 0xAB, 0xC2, 0x02, 0xD0, 0xD5, 0xCD, 0x36, 0xD4, 0xB8, 0xCF, + 0x7A, 0xE8, 0xA1, 0xCC, 0x40, 0xDE, 0xAE, 0xD2, 0x90, 0xD0, 0x57, 0xDD, + 0x20, 0xDB, 0x81, 0xDD, 0x72, 0xDC, 0xAE, 0xC9, 0xC7, 0xD0, 0xB2, 0xBB, + 0x25, 0xCF, 0xD9, 0xC3, 0xE6, 0xDD, 0x19, 0xD9, 0xF6, 0xEC, 0x1F, 0xE7, + 0xDF, 0xFC, 0x2E, 0xE5, 0x9F, 0xFC, 0xEF, 0xE5, 0x74, 0xE1, 0x17, 0xE9, + 0x5A, 0xDD, 0x08, 0xE3, 0x12, 0xE2, 0x1F, 0xDE, 0x57, 0xD8, 0x8A, 0xEA, + 0x6E, 0xE5, 0x1D, 0xF5, 0xB9, 0xFB, 0xC4, 0xF8, 0xE2, 0xFA, 0xF5, 0x05, + 0x2F, 0xF2, 0x90, 0x0F, 0xAF, 0xF3, 0x62, 0x0D, 0x2E, 0xF6, 0xE8, 0x05, + 0x61, 0xF5, 0xC9, 0xFC, 0x89, 0xFD, 0x4B, 0xF8, 0xC1, 0x05, 0x9D, 0xEE, + 0xD2, 0x0C, 0x4E, 0xED, 0xB9, 0x15, 0xA1, 0x00, 0x39, 0x1A, 0x02, 0x0B, + 0xCC, 0x25, 0xFC, 0x0C, 0xDD, 0x31, 0x31, 0x09, 0x07, 0x37, 0xFD, 0xFB, + 0x29, 0x2A, 0xAE, 0xF2, 0x91, 0x11, 0x43, 0xF9, 0x93, 0x00, 0x96, 0x0E, + 0xD6, 0xFB, 0x55, 0x1A, 0xCD, 0x08, 0xF6, 0x1A, 0xA2, 0x1F, 0x53, 0x1A, + 0x60, 0x24, 0x5A, 0x09, 0x4B, 0x11, 0xA7, 0x00, 0x95, 0xF8, 0xAA, 0x01, + 0xF7, 0xE8, 0x4A, 0xF5, 0x42, 0xEF, 0x96, 0xF0, 0x24, 0xF5, 0x34, 0x00, + 0x84, 0xF5, 0x92, 0x07, 0x1C, 0xFB, 0xEF, 0xF9, 0x4D, 0xFE, 0x2E, 0xF3, + 0xB7, 0x03, 0xF2, 0xEF, 0x9F, 0xF5, 0xBD, 0xE4, 0x74, 0xE3, 0x36, 0xEA, + 0x0B, 0xE8, 0x65, 0xF6, 0xB8, 0xE8, 0x17, 0xE7, 0x79, 0xED, 0x4A, 0xD7, + 0x4B, 0xF9, 0xBB, 0xDF, 0xFC, 0xFA, 0x75, 0xE2, 0xDD, 0xF2, 0xA6, 0xE5, + 0x7C, 0xF1, 0x32, 0xEF, 0x59, 0xF5, 0x4F, 0xE5, 0xC3, 0xF5, 0xEA, 0xDB, + 0x5E, 0xF2, 0x69, 0xE1, 0x98, 0xFA, 0x89, 0xE8, 0xDF, 0x03, 0xF0, 0xEB, + 0x0A, 0xF5, 0x17, 0xF7, 0xDC, 0xEA, 0x0D, 0x02, 0x94, 0xF1, 0x98, 0xFB, + 0xC7, 0xED, 0xDD, 0xF7, 0x69, 0xE9, 0xB1, 0xF0, 0x8E, 0xEB, 0xAD, 0xDD, + 0x97, 0xE5, 0x99, 0xDC, 0xB6, 0xDE, 0x48, 0xDF, 0x91, 0xDC, 0xF2, 0xD7, + 0x33, 0xD8, 0xC2, 0xD9, 0x81, 0xCE, 0xF8, 0xE1, 0xDC, 0xC7, 0xDA, 0xD5, + 0xFB, 0xCB, 0xBD, 0xBE, 0x11, 0xD2, 0xA8, 0xB4, 0xC9, 0xCA, 0x46, 0xB1, + 0x90, 0xC5, 0x3E, 0xB6, 0xB6, 0xCF, 0x04, 0xC2, 0xDB, 0xDB, 0x92, 0xCC, + 0xCD, 0xE6, 0xEB, 0xCF, 0x46, 0xDA, 0xCF, 0xC8, 0x55, 0xC9, 0x86, 0xC7, + 0x4D, 0xD1, 0x17, 0xCB, 0x7C, 0xD1, 0x6A, 0xCC, 0x84, 0xD6, 0x9B, 0xD3, + 0x69, 0xEB, 0xF2, 0xD9, 0xF5, 0xF4, 0xF7, 0xDC, 0x46, 0xF0, 0x79, 0xE0, + 0x43, 0xE6, 0xA9, 0xE3, 0xE1, 0xD2, 0xA2, 0xE9, 0xD4, 0xCB, 0x24, 0xE8, + 0x6B, 0xDA, 0x09, 0xE4, 0x07, 0xD8, 0x24, 0xE9, 0xB5, 0xD0, 0xD1, 0xF5, + 0x03, 0xD8, 0xBB, 0xFB, 0xF5, 0xE2, 0x4B, 0xFF, 0x7E, 0xEA, 0xF1, 0x02, + 0x4D, 0xEA, 0x8A, 0xF4, 0x6B, 0xEB, 0xA4, 0xEA, 0x96, 0xEE, 0xC7, 0xEC, + 0xB8, 0xFB, 0x11, 0xEA, 0x1A, 0x08, 0xBD, 0xE7, 0xA2, 0x03, 0x1A, 0xEC, + 0x80, 0x00, 0x60, 0xF1, 0x71, 0xFB, 0x5E, 0xF7, 0x65, 0xFA, 0x14, 0xFB, + 0x5A, 0x07, 0xAE, 0xEE, 0xFB, 0x05, 0x4A, 0xE6, 0x0A, 0x04, 0x98, 0xF3, + 0x8A, 0x15, 0x7B, 0x00, 0x44, 0x26, 0x48, 0x0D, 0xBB, 0x2A, 0x53, 0x18, + 0x45, 0x27, 0xDB, 0x1A, 0xA8, 0x22, 0xB6, 0x15, 0x03, 0x19, 0x42, 0x11, + 0x83, 0x14, 0x4D, 0x16, 0xA1, 0x18, 0x29, 0x14, 0x02, 0x0F, 0x8C, 0x12, + 0x07, 0x04, 0x18, 0x17, 0x00, 0x0E, 0x79, 0x1C, 0x9C, 0x0E, 0x6C, 0x22, + 0x88, 0x01, 0x56, 0x24, 0x78, 0x03, 0xEC, 0x27, 0x68, 0x0E, 0xEF, 0x24, + 0xCE, 0x18, 0xB1, 0x19, 0xE1, 0x20, 0x58, 0x14, 0x3B, 0x29, 0x8F, 0x13, + 0x98, 0x2F, 0x53, 0x17, 0xE2, 0x38, 0xC5, 0x26, 0xB2, 0x3E, 0x1E, 0x34, + 0xEE, 0x44, 0xFE, 0x38, 0xDD, 0x5C, 0xB1, 0x3C, 0xF2, 0x63, 0xD2, 0x35, + 0xB0, 0x50, 0x55, 0x2E, 0x08, 0x43, 0xED, 0x30, 0x57, 0x36, 0xC8, 0x37, + 0x01, 0x35, 0xE1, 0x44, 0x81, 0x44, 0x26, 0x50, 0x2F, 0x3F, 0x64, 0x4E, + 0xF0, 0x35, 0xC1, 0x4F, 0x30, 0x3F, 0x3E, 0x55, 0xA9, 0x39, 0x81, 0x40, + 0x02, 0x28, 0x7F, 0x2E, 0x35, 0x2D, 0x35, 0x34, 0x7F, 0x2A, 0x0B, 0x30, + 0x4A, 0x0E, 0x54, 0x2A, 0xA7, 0x12, 0xFE, 0x36, 0x45, 0x2D, 0x9F, 0x40, + 0xEC, 0x23, 0xE4, 0x2C, 0xE6, 0x10, 0xB0, 0x1C, 0x1E, 0x11, 0xF7, 0x23, + 0xC5, 0x10, 0x6A, 0x1D, 0x82, 0x13, 0x82, 0x0D, 0x44, 0x14, 0xDC, 0x0C, + 0x3E, 0x0F, 0x2C, 0x0D, 0x43, 0x12, 0x0D, 0x0B, 0x70, 0x10, 0xA2, 0x15, + 0x32, 0x12, 0x3F, 0x1A, 0x51, 0x18, 0x03, 0x10, 0xAA, 0x19, 0x6C, 0x13, + 0x30, 0x2C, 0x29, 0x20, 0xBC, 0x33, 0xC0, 0x1E, 0x50, 0x1F, 0xA5, 0x1A, + 0x02, 0x1C, 0xE7, 0x25, 0x6C, 0x26, 0x2E, 0x33, 0x98, 0x26, 0xB2, 0x34, + 0x89, 0x24, 0x8F, 0x32, 0xF2, 0x24, 0x9B, 0x32, 0x6F, 0x23, 0x76, 0x31, + 0x6F, 0x26, 0xEF, 0x27, 0x55, 0x2B, 0xB5, 0x21, 0xA6, 0x1D, 0xDF, 0x24, + 0x09, 0x06, 0xEF, 0x28, 0x99, 0xFF, 0x73, 0x2A, 0x64, 0x0F, 0x96, 0x20, + 0x08, 0x0E, 0xD4, 0x12, 0x54, 0xFA, 0x14, 0x04, 0x30, 0xF7, 0x36, 0xFB, + 0xBB, 0x03, 0x54, 0x01, 0xC9, 0x0F, 0x8F, 0x04, 0xBC, 0x0A, 0x72, 0x02, + 0xBF, 0x12, 0x66, 0x03, 0x84, 0x22, 0x6B, 0x08, 0x6C, 0x0F, 0x3C, 0x00, + 0x5C, 0xFA, 0xF3, 0xF0, 0x97, 0xF9, 0x8F, 0xF5, 0x38, 0x02, 0x8A, 0xFD, + 0xC0, 0x0B, 0x0F, 0xF8, 0xFC, 0x0E, 0xD1, 0xF8, 0x1A, 0x0B, 0x8C, 0x02, + 0xBC, 0x04, 0xBA, 0x02, 0x68, 0x0A, 0x42, 0x0A, 0xA5, 0x07, 0x04, 0x15, + 0xA6, 0xF7, 0x07, 0x06, 0x50, 0xED, 0x7B, 0xF8, 0xDA, 0xE7, 0x78, 0x06, + 0xC7, 0xEE, 0xC6, 0x13, 0xEF, 0xFA, 0x04, 0x14, 0xE2, 0xFE, 0x10, 0x15, + 0x59, 0xFD, 0xE9, 0x17, 0x06, 0x02, 0xFA, 0x0E, 0x17, 0x04, 0xC4, 0xF4, + 0x85, 0xF9, 0x39, 0xE6, 0x35, 0xF6, 0x9B, 0xEA, 0xFD, 0xF8, 0xCA, 0xEE, + 0xAB, 0xFA, 0x5E, 0xF8, 0xF1, 0xFE, 0x9F, 0x05, 0xFE, 0xFF, 0xDD, 0x05, + 0x72, 0xF4, 0x59, 0x01, 0xB6, 0xEF, 0xAD, 0xFD, 0xC7, 0xF7, 0x52, 0xF7, + 0xB4, 0xFB, 0xAD, 0xF8, 0x0F, 0x0E, 0x7C, 0x06, 0x70, 0x27, 0xF0, 0x16, + 0xB0, 0x27, 0x14, 0x23, 0x31, 0x20, 0x25, 0x29, 0x62, 0x19, 0xB8, 0x26, + 0x63, 0x0E, 0x87, 0x1C, 0x8C, 0xFD, 0x19, 0x10, 0xFE, 0xEF, 0x66, 0x07, + 0xDE, 0xFF, 0x5E, 0x06, 0xD5, 0x13, 0x09, 0x0F, 0xF9, 0x0D, 0x18, 0x22, + 0xEA, 0x0A, 0xE5, 0x33, 0x51, 0x1B, 0x9F, 0x3A, 0x0D, 0x1A, 0x04, 0x36, + 0xA8, 0x07, 0x94, 0x1F, 0x84, 0x03, 0x4F, 0x0A, 0xB3, 0x0A, 0x70, 0x06, + 0xBA, 0x13, 0xF6, 0x0D, 0x61, 0x27, 0x9A, 0x23, 0xC1, 0x3E, 0x60, 0x3E, + 0x0F, 0x4E, 0x65, 0x43, 0x34, 0x5B, 0x3E, 0x31, 0x10, 0x59, 0x68, 0x29, + 0x39, 0x3A, 0x4D, 0x2B, 0x24, 0x29, 0xCD, 0x22, 0x54, 0x33, 0x37, 0x25, + 0xE7, 0x34, 0x29, 0x39, 0x74, 0x39, 0x2E, 0x44, 0x29, 0x40, 0xFB, 0x44, + 0xBF, 0x32, 0xB1, 0x43, 0xEA, 0x2E, 0x42, 0x3E, 0x40, 0x36, 0xCB, 0x34, + 0xD0, 0x2E, 0x13, 0x32, 0x4D, 0x19, 0x94, 0x35, 0x18, 0x0E, 0xC1, 0x3C, + 0x32, 0x13, 0xFC, 0x3F, 0x71, 0x1A, 0x43, 0x38, 0xAF, 0x25, 0xF1, 0x2B, + 0x3A, 0x21, 0x8B, 0x23, 0xC8, 0x16, 0xCA, 0x28, 0x67, 0x17, 0xD5, 0x24, + 0x6F, 0x06, 0xF2, 0x14, 0x9F, 0xFC, 0x54, 0x12, 0x13, 0x0E, 0xAD, 0x13, + 0x60, 0x15, 0xF5, 0x03, 0xD4, 0x0F, 0x07, 0xFA, 0xC0, 0x07, 0xBF, 0xFD, + 0x9F, 0x08, 0xB7, 0xF5, 0xDF, 0x11, 0xDF, 0xFB, 0xF1, 0x0D, 0x8D, 0x07, + 0xE7, 0x05, 0xBF, 0xFC, 0xC7, 0x07, 0xA2, 0xFC, 0x83, 0x0A, 0x0F, 0x0C, + 0x43, 0x13, 0xCA, 0x0E, 0x36, 0x11, 0x4E, 0x07, 0xB4, 0xFB, 0xDF, 0x09, + 0x03, 0xF4, 0x4E, 0x0F, 0x8E, 0xFB, 0xBB, 0x10, 0xC7, 0x00, 0x86, 0x0B, + 0x48, 0x06, 0xDC, 0xFF, 0xDB, 0xFE, 0x40, 0xFE, 0x9A, 0xE4, 0x50, 0x07, + 0xDD, 0xD6, 0x6D, 0x09, 0xD3, 0xE0, 0x12, 0xFA, 0x44, 0xE9, 0x9C, 0xF1, + 0x8F, 0xDF, 0x35, 0xF1, 0x3F, 0xD5, 0x94, 0xDF, 0xBA, 0xD9, 0xE4, 0xD7, + 0x9C, 0xDC, 0xC7, 0xE0, 0xBB, 0xD4, 0xA0, 0xDA, 0xD1, 0xDB, 0x53, 0xD1, + 0x7F, 0xEB, 0xDB, 0xD2, 0x05, 0xEA, 0x79, 0xD4, 0x55, 0xE6, 0x92, 0xD3, + 0x3B, 0xE3, 0xD2, 0xD8, 0x16, 0xDE, 0x84, 0xD8, 0xB7, 0xDB, 0x7E, 0xCA, + 0xCE, 0xD5, 0xE9, 0xC4, 0xC4, 0xD6, 0xA7, 0xCF, 0xC3, 0xDF, 0xBD, 0xDA, + 0xF2, 0xE2, 0xB1, 0xDC, 0x21, 0xE0, 0xD2, 0xD8, 0x8D, 0xD3, 0xD3, 0xD8, + 0xB2, 0xC6, 0x83, 0xD9, 0xA4, 0xCA, 0xE6, 0xCD, 0x26, 0xCA, 0xF9, 0xC7, + 0xDF, 0xC6, 0x94, 0xCF, 0xF6, 0xC8, 0x9F, 0xD4, 0x80, 0xCA, 0x2C, 0xD9, + 0xEA, 0xCC, 0x7F, 0xDF, 0x42, 0xCA, 0xDA, 0xD8, 0xA7, 0xC9, 0x05, 0xC6, + 0x65, 0xD1, 0x46, 0xBD, 0xA5, 0xD0, 0x1D, 0xB8, 0x88, 0xCA, 0x53, 0xB0, + 0x40, 0xD1, 0xCF, 0xB5, 0xE2, 0xC9, 0x9D, 0xBF, 0x47, 0xBC, 0x1F, 0xBD, + 0xC0, 0xB9, 0x36, 0xBC, 0x62, 0xB9, 0x7F, 0xB9, 0xB6, 0xC9, 0x4F, 0xB1, + 0x4C, 0xD1, 0x61, 0xB7, 0x90, 0xCD, 0xBB, 0xBE, 0x52, 0xE6, 0x4B, 0xC2, + 0x03, 0xF1, 0x43, 0xCA, 0xCB, 0xEB, 0xD8, 0xD4, 0xC1, 0xF1, 0xBF, 0xDF, + 0xAF, 0xDB, 0x62, 0xDA, 0xE2, 0xCD, 0xC2, 0xDB, 0xBE, 0xDF, 0xF0, 0xE0, + 0x82, 0xDD, 0xEE, 0xD5, 0x3C, 0xCB, 0xDA, 0xDC, 0x30, 0xD0, 0x14, 0xF0, + 0xF7, 0xE2, 0xD3, 0xF5, 0xC1, 0xE1, 0x7B, 0xFA, 0xD8, 0xD2, 0x3C, 0xFF, + 0x9D, 0xD2, 0x8F, 0xF0, 0x63, 0xD5, 0x55, 0xE3, 0xA6, 0xC7, 0x35, 0xE2, + 0x6A, 0xD4, 0xEC, 0xDC, 0xDB, 0xF3, 0x01, 0xE1, 0xF1, 0x03, 0x45, 0xED, + 0xBB, 0x16, 0x6E, 0xEC, 0xA4, 0x21, 0x56, 0xEA, 0x8A, 0x0E, 0xFF, 0xEC, + 0xAE, 0x00, 0xDB, 0xEA, 0x49, 0x07, 0x63, 0xEA, 0x6A, 0x07, 0x4E, 0xF0, + 0x3F, 0x0A, 0x9C, 0xEE, 0xD6, 0x0B, 0x78, 0xF0, 0x29, 0x0E, 0xCB, 0x06, + 0x50, 0x14, 0x18, 0x14, 0xC1, 0x14, 0x1E, 0x10, 0xEA, 0x15, 0xC6, 0x0B, + 0x2A, 0x0C, 0xB3, 0x0C, 0xBC, 0xF7, 0xAE, 0x0E, 0x1C, 0xF0, 0x04, 0x0B, + 0x2B, 0xF4, 0x9B, 0x08, 0x4F, 0xF8, 0xC2, 0x00, 0x24, 0xFA, 0x9F, 0x01, + 0xF9, 0x03, 0x25, 0x12, 0xBE, 0x0F, 0x48, 0x0F, 0x5C, 0x04, 0x6D, 0xFE, + 0xD4, 0xF9, 0xF1, 0xFB, 0xC5, 0xFF, 0x39, 0xFB, 0x36, 0xF7, 0xA8, 0xEF, + 0x95, 0xF1, 0xDB, 0xDF, 0x22, 0xF9, 0x27, 0xD9, 0x1A, 0xF5, 0x5E, 0xE1, + 0xC9, 0xFE, 0xAC, 0xE7, 0xBF, 0x0C, 0x16, 0xEA, 0x36, 0xFE, 0xAC, 0xED, + 0x3F, 0xF8, 0xE4, 0xF3, 0x90, 0x01, 0x50, 0xF4, 0x1F, 0x0E, 0x07, 0xED, + 0x91, 0x13, 0x2D, 0xEE, 0x68, 0xFB, 0xB8, 0xF4, 0xEA, 0xE7, 0x1A, 0x01, + 0x4B, 0xF5, 0x7E, 0x0B, 0x69, 0x02, 0x71, 0x04, 0x72, 0x05, 0xF0, 0xFD, + 0x0C, 0x06, 0x59, 0xFD, 0x07, 0xFE, 0x7B, 0xF5, 0xB4, 0xF0, 0x5B, 0xF0, + 0x4A, 0xE1, 0xF7, 0xF7, 0xC1, 0xD9, 0xDA, 0xF8, 0x61, 0xE1, 0xDC, 0xF2, + 0xEB, 0xDA, 0xB5, 0xED, 0xB5, 0xCD, 0xF5, 0xDD, 0x63, 0xD2, 0xD9, 0xCF, + 0x9D, 0xC9, 0x1D, 0xCC, 0xC2, 0xCB, 0x72, 0xCC, 0x21, 0xDD, 0xF4, 0xCA, + 0x5C, 0xD6, 0xA7, 0xCA, 0x80, 0xD9, 0x06, 0xD4, 0x93, 0xED, 0xE6, 0xD6, + 0xB6, 0xEB, 0x84, 0xD3, 0x69, 0xD8, 0x8D, 0xD2, 0xCE, 0xCC, 0xB5, 0xCB, + 0xF9, 0xD3, 0x2C, 0xC7, 0x3D, 0xE2, 0xF1, 0xD2, 0x32, 0xED, 0x39, 0xE1, + 0x6A, 0xF9, 0x53, 0xE4, 0xFC, 0x00, 0x11, 0xE7, 0xBA, 0xF5, 0x68, 0xE7, + 0x46, 0xEB, 0x95, 0xDA, 0x98, 0xDF, 0x56, 0xD3, 0x33, 0xCB, 0xEC, 0xDA, + 0x33, 0xD0, 0x3C, 0xE6, 0xE9, 0xDE, 0xCB, 0xF2, 0xE2, 0xE5, 0x2E, 0xFC, + 0xD2, 0xEC, 0x09, 0xFA, 0x66, 0xF5, 0x6A, 0xEE, 0x20, 0xF6, 0x52, 0xE7, + 0x7B, 0xE3, 0xFB, 0xDD, 0x29, 0xE8, 0x2B, 0xD4, 0x6F, 0xFC, 0xAF, 0xD6, + 0x5A, 0xF4, 0x5F, 0xE1, 0x03, 0xEA, 0x9D, 0xE8, 0xED, 0xE9, 0xB6, 0xE5, + 0x7A, 0xE9, 0xC9, 0xDC, 0xDC, 0xF5, 0xE8, 0xCF, 0xCE, 0xF6, 0x85, 0xCC, + 0xDF, 0xEB, 0x37, 0xD6, 0xFD, 0xF3, 0x73, 0xD9, 0xDA, 0xF7, 0x2C, 0xDA, + 0xC3, 0xFB, 0x98, 0xE5, 0xB2, 0x01, 0x2A, 0xF6, 0x43, 0xFC, 0xF7, 0xFE, + 0x68, 0x01, 0x04, 0xFD, 0x77, 0x0A, 0xCD, 0xF4, 0xF6, 0xFF, 0x14, 0xED, + 0x5C, 0xF3, 0xD4, 0xEE, 0xCE, 0xF1, 0x08, 0xFA, 0x65, 0xF5, 0x00, 0x0B, + 0x92, 0xFC, 0x2A, 0x1A, 0x44, 0x09, 0x99, 0x25, 0xEC, 0x11, 0x9B, 0x26, + 0x36, 0x0C, 0x25, 0x1E, 0x4D, 0xF7, 0xE6, 0x13, 0xB3, 0xEC, 0x11, 0x0A, + 0xDE, 0x00, 0x9B, 0x12, 0xFD, 0x1D, 0x5A, 0x22, 0xFA, 0x39, 0xB9, 0x28, + 0x84, 0x42, 0x89, 0x2D, 0x6E, 0x39, 0x48, 0x30, 0x91, 0x42, 0x01, 0x35, + 0xDC, 0x4A, 0x1B, 0x32, 0xB9, 0x3D, 0x59, 0x25, 0x8D, 0x33, 0x3F, 0x26, + 0x26, 0x34, 0xB9, 0x2F, 0xC1, 0x31, 0x28, 0x39, 0x4D, 0x33, 0xAF, 0x46, + 0x7C, 0x3E, 0x7E, 0x48, 0x6F, 0x43, 0x8A, 0x46, 0x39, 0x48, 0x86, 0x52, + 0xE1, 0x55, 0x03, 0x5B, 0x36, 0x51, 0xCE, 0x59, 0x9D, 0x3F, 0x97, 0x5C, + 0x26, 0x39, 0x84, 0x5B, 0x2C, 0x3E, 0xC9, 0x52, 0xB0, 0x52, 0x84, 0x58, + 0xC1, 0x53, 0xAD, 0x57, 0xC0, 0x43, 0xC3, 0x4F, 0xF3, 0x51, 0x29, 0x5A, + 0x21, 0x49, 0x73, 0x55, 0x3A, 0x28, 0xDC, 0x37, 0xB5, 0x3B, 0x91, 0x32, + 0x5B, 0x4F, 0x9E, 0x4B, 0x4F, 0x50, 0x82, 0x4F, 0x96, 0x4E, 0xB3, 0x33, + 0x85, 0x2D, 0xDA, 0x19, 0x1C, 0x0C, 0x1D, 0x09, 0xA2, 0xF6, 0x33, 0xF0, + 0x3A, 0xE8, 0xC0, 0xD9, 0x3F, 0xDA, 0x60, 0xC8, 0xC3, 0xCE, 0xCD, 0xAF, + 0x8C, 0xD4, 0xBF, 0xAD, 0x1C, 0xC7, 0x01, 0xB4, 0x88, 0xAE, 0x4F, 0xAD, + 0x2C, 0xBF, 0xA3, 0xC7, 0xDE, 0xDB, 0x4F, 0xE3, 0xFF, 0xCD, 0xC7, 0xCA, + 0xB5, 0xCA, 0xC1, 0xBF, 0x42, 0xEB, 0xF0, 0xDF, 0x20, 0xEB, 0x6C, 0xEB, + 0x92, 0xD5, 0x48, 0xDD, 0xDA, 0xD2, 0x6E, 0xDE, 0xC8, 0xD3, 0xFC, 0xE4, + 0xEE, 0xCC, 0xCE, 0xE3, 0x64, 0xCD, 0x06, 0xE9, 0x38, 0xDF, 0x39, 0xEF, + 0x18, 0xF1, 0x61, 0xF3, 0x69, 0xFB, 0xA6, 0xFC, 0x69, 0x0B, 0xBA, 0x09, + 0x05, 0x20, 0x70, 0x14, 0x4A, 0x30, 0x02, 0x17, 0x50, 0x39, 0xCE, 0x21, + 0xA1, 0x41, 0x32, 0x33, 0xE8, 0x42, 0x4E, 0x30, 0x65, 0x36, 0x2A, 0x2A, + 0x8A, 0x3A, 0x23, 0x34, 0x76, 0x4E, 0x7E, 0x41, 0x30, 0x4C, 0x41, 0x44, + 0xC7, 0x49, 0xC4, 0x46, 0x45, 0x55, 0x3E, 0x4A, 0xC2, 0x4C, 0xB1, 0x40, + 0x00, 0x39, 0xFE, 0x36, 0xF4, 0x35, 0x07, 0x40, 0xCE, 0x30, 0xC2, 0x48, + 0x5A, 0x1E, 0x99, 0x42, 0x79, 0x19, 0x4C, 0x3A, 0x0C, 0x1E, 0xB4, 0x30, + 0x9D, 0x14, 0xB0, 0x26, 0x88, 0x07, 0xC6, 0x2A, 0xA3, 0x08, 0x1F, 0x31, + 0xB4, 0x03, 0xF1, 0x14, 0xA3, 0xFA, 0xB1, 0xF7, 0x82, 0x01, 0x19, 0xFB, + 0xAD, 0xF4, 0x26, 0xF5, 0x8B, 0xDD, 0xAE, 0xEA, 0x01, 0xEC, 0xE0, 0xF5, + 0x8B, 0x06, 0xF0, 0xF8, 0x4E, 0xFC, 0x02, 0xEA, 0x4D, 0xEA, 0x42, 0xE7, + 0x25, 0xF8, 0x92, 0xEA, 0x95, 0x04, 0x51, 0xEA, 0x27, 0x02, 0xE3, 0xEF, + 0x4C, 0x06, 0xE1, 0xFC, 0x37, 0x17, 0xBD, 0x18, 0x39, 0x2D, 0xEB, 0x30, + 0xE9, 0x40, 0x7E, 0x3C, 0x0E, 0x51, 0x60, 0x3F, 0x78, 0x59, 0xC5, 0x3F, + 0xA1, 0x51, 0xDF, 0x45, 0x44, 0x3F, 0x47, 0x45, 0xAE, 0x35, 0xBD, 0x4A, + 0x7D, 0x3B, 0x37, 0x58, 0x59, 0x40, 0xDD, 0x53, 0x05, 0x3C, 0xFC, 0x44, + 0x3E, 0x27, 0x57, 0x33, 0x1E, 0x0E, 0xB6, 0x29, 0x9F, 0x07, 0x3B, 0x28, + 0x24, 0xFA, 0x4D, 0x1C, 0x1A, 0xEF, 0x7F, 0x0D, 0x75, 0xFE, 0xD9, 0x03, + 0x38, 0xFD, 0x85, 0xFD, 0x2F, 0xEA, 0x29, 0xF3, 0x94, 0xF2, 0x24, 0xEA, + 0x79, 0xFD, 0x7C, 0xEC, 0x1E, 0xE8, 0x85, 0xE2, 0xB9, 0xD6, 0x3C, 0xC8, + 0x03, 0xD9, 0x3C, 0xCC, 0x54, 0xD9, 0xA8, 0xE6, 0x63, 0xD7, 0x1D, 0xE1, + 0x10, 0xD6, 0x5D, 0xD3, 0x11, 0xD5, 0x62, 0xE1, 0x29, 0xD8, 0x8C, 0xEA, + 0xB0, 0xDF, 0x66, 0xE0, 0x6C, 0xDE, 0xA7, 0xE1, 0x68, 0xC7, 0x72, 0xE5, + 0xCF, 0xBC, 0xF2, 0xDC, 0x36, 0xD3, 0x9D, 0xED, 0x26, 0xE3, 0xED, 0x06, + 0xB1, 0xED, 0x56, 0x04, 0xC2, 0xFC, 0x36, 0x04, 0x73, 0xF3, 0x61, 0x05, + 0x6E, 0xEA, 0xF9, 0xFB, 0x0C, 0xFC, 0x72, 0xF8, 0x6A, 0x04, 0x6D, 0x01, + 0xEB, 0xFC, 0x05, 0x0B, 0x56, 0xF2, 0xBB, 0xF6, 0x51, 0xE3, 0xA0, 0xD5, + 0x42, 0xDF, 0xFA, 0xCB, 0x8F, 0xD7, 0x6B, 0xC6, 0xD9, 0xC3, 0xA3, 0xBB, + 0x9D, 0xC6, 0x03, 0xBC, 0x46, 0xD6, 0x96, 0xC0, 0x8B, 0xE6, 0x18, 0xCC, + 0xF2, 0xEC, 0x76, 0xD6, 0x75, 0xE6, 0xC4, 0xE1, 0x2C, 0xE9, 0x84, 0xF1, + 0x4C, 0xF2, 0x3F, 0xFB, 0xF1, 0xFD, 0x50, 0x0D, 0xF5, 0x10, 0x04, 0x25, + 0xED, 0x22, 0x09, 0x2E, 0xDF, 0x32, 0xB2, 0x2E, 0xD5, 0x49, 0xD6, 0x49, + 0x63, 0x4C, 0x04, 0x63, 0x5F, 0x3B, 0x90, 0x5B, 0x10, 0x3B, 0x5B, 0x60, + 0x17, 0x3F, 0xF3, 0x62, 0x6C, 0x33, 0xB4, 0x4D, 0x91, 0x2E, 0x25, 0x53, + 0xDF, 0x38, 0x24, 0x59, 0x5C, 0x43, 0x4F, 0x46, 0xD4, 0x4A, 0xFD, 0x4B, + 0xF9, 0x4D, 0x15, 0x57, 0x6D, 0x4E, 0x5B, 0x53, 0x30, 0x4B, 0x99, 0x4E, + 0x39, 0x49, 0x6D, 0x40, 0x8A, 0x38, 0x8E, 0x24, 0xE9, 0x18, 0xC1, 0x08, + 0x7A, 0x11, 0x4D, 0x0F, 0x3B, 0x18, 0xBB, 0x21, 0xDA, 0x1A, 0x1F, 0x1C, + 0x5B, 0x21, 0xA9, 0x1A, 0xA9, 0x25, 0x74, 0x16, 0x32, 0x20, 0x44, 0x04, + 0xB9, 0x16, 0x1F, 0x01, 0xF8, 0x0E, 0x5F, 0x06, 0xE5, 0x07, 0xA7, 0x0A, + 0x29, 0x06, 0xB9, 0x17, 0xF9, 0x09, 0x86, 0x23, 0xF0, 0x04, 0xDC, 0x1B, + 0xCA, 0xF9, 0x0B, 0x0F, 0x12, 0xF1, 0x24, 0x05, 0x9B, 0xEA, 0xCD, 0xF1, + 0x58, 0xE2, 0xAE, 0xE2, 0x5C, 0xDB, 0xE3, 0xDB, 0xE0, 0xDF, 0x33, 0xDC, + 0x92, 0xDB, 0xE4, 0xDF, 0x00, 0xD6, 0x1C, 0xE1, 0x76, 0xD9, 0x71, 0xDD, + 0xF2, 0xD2, 0x11, 0xD5, 0xD6, 0xD6, 0xEA, 0xDB, 0x1D, 0xDF, 0xDD, 0xDA, + 0x5A, 0xDA, 0x88, 0xC2, 0x6B, 0xD7, 0xB4, 0xBA, 0xD3, 0xC8, 0x73, 0xBE, + 0xB1, 0xB7, 0xDE, 0xC0, 0xAF, 0xB7, 0x5C, 0xC6, 0x3E, 0xC3, 0x3C, 0xC9, + 0xF7, 0xDE, 0x10, 0xD2, 0x37, 0xF2, 0x5D, 0xE0, 0x5D, 0xE9, 0x0D, 0xDE, + 0xD9, 0xDA, 0x1F, 0xC9, 0x9D, 0xD1, 0x1E, 0xC9, 0xD8, 0xC8, 0xFC, 0xD5, + 0xA7, 0xC4, 0x2C, 0xD4, 0x9A, 0xCE, 0xAC, 0xD8, 0xE1, 0xDC, 0x4A, 0xDB, + 0x93, 0xCB, 0xAB, 0xCA, 0xB2, 0xAF, 0x61, 0xC2, 0x40, 0xAA, 0x4E, 0xCD, + 0xD9, 0xA8, 0xD9, 0xD1, 0xC5, 0xB6, 0xD3, 0xC8, 0x8F, 0xCB, 0x2D, 0xC6, + 0x73, 0xC6, 0x09, 0xBF, 0x78, 0xC8, 0x67, 0xB0, 0x38, 0xDD, 0x7F, 0xB5, + 0x14, 0xE5, 0xFF, 0xC2, 0x10, 0xE1, 0x93, 0xC1, 0x99, 0xE5, 0xFC, 0xC3, + 0xB7, 0xEB, 0xC8, 0xD4, 0x23, 0xF2, 0x3F, 0xE9, 0x59, 0x04, 0xA1, 0xF8, + 0xB8, 0x10, 0x37, 0xFC, 0x58, 0x14, 0x12, 0x0B, 0xDD, 0x1A, 0x63, 0x22, + 0x4F, 0x29, 0xA6, 0x2E, 0x6E, 0x23, 0xB4, 0x32, 0xF0, 0x0A, 0x1C, 0x32, + 0x69, 0x09, 0x87, 0x2F, 0x31, 0x10, 0xBE, 0x31, 0xE3, 0x10, 0x52, 0x36, + 0xCE, 0x1C, 0xCA, 0x36, 0xE1, 0x2E, 0x94, 0x39, 0xA1, 0x25, 0x9D, 0x30, + 0x8C, 0x14, 0xC3, 0x27, 0x5B, 0x1C, 0x6E, 0x2D, 0x6A, 0x21, 0xD8, 0x2C, + 0xBA, 0x1A, 0x5B, 0x20, 0x93, 0x25, 0xB2, 0x16, 0xB9, 0x36, 0x19, 0x16, + 0x1B, 0x1C, 0xF9, 0x08, 0xD6, 0xFD, 0x32, 0xF9, 0xAE, 0x05, 0x0F, 0xED, + 0xCB, 0x0B, 0x39, 0xEA, 0xC4, 0x08, 0xC6, 0xED, 0x45, 0xFC, 0xD6, 0xD8, + 0x07, 0xF8, 0xD8, 0xD8, 0xAF, 0x0F, 0xA3, 0xF4, 0x95, 0x1D, 0xF3, 0xFF, + 0x52, 0x14, 0xE6, 0x0B, 0x53, 0x0B, 0x51, 0x15, 0x43, 0x09, 0x04, 0x09, + 0x2A, 0x15, 0xEE, 0xFD, 0x90, 0x1E, 0x58, 0x06, 0x1C, 0x1B, 0x2D, 0x13, + 0xCE, 0x1E, 0x2E, 0x17, 0x94, 0x18, 0x8E, 0x1A, 0xEA, 0x05, 0x81, 0x1A, + 0x35, 0x07, 0x8E, 0x18, 0x83, 0x09, 0x5F, 0x19, 0x31, 0x06, 0x6F, 0x18, + 0xAC, 0x05, 0x3D, 0x05, 0x16, 0xEE, 0x64, 0xE3, 0xE0, 0xE3, 0x60, 0xE1, + 0x39, 0xF2, 0xC5, 0xF0, 0xD8, 0xF7, 0xB3, 0xF5, 0xC7, 0xFE, 0x05, 0xF8, + 0xC4, 0x00, 0x6F, 0xEE, 0xB0, 0xF8, 0x7C, 0xD7, 0x1A, 0xE9, 0x7A, 0xC3, + 0xD8, 0xD7, 0xC4, 0xC4, 0x0D, 0xDC, 0x0C, 0xD1, 0xFA, 0xDB, 0x0C, 0xCD, + 0x87, 0xD4, 0x8A, 0xC4, 0x44, 0xDF, 0x20, 0xC2, 0x91, 0xE2, 0x3A, 0xC5, + 0xF4, 0xD1, 0xF8, 0xBD, 0xA0, 0xBE, 0x1B, 0xAB, 0x11, 0xB0, 0x02, 0xAA, + 0xFE, 0xA8, 0x37, 0xB1, 0x09, 0xA8, 0x03, 0xB5, 0x50, 0xAC, 0x7E, 0xC4, + 0xAB, 0xA8, 0xE2, 0xCA, 0x8C, 0xB5, 0xB5, 0xCB, 0x41, 0xC9, 0x6B, 0xD1, + 0x17, 0xBE, 0xDB, 0xC8, 0x69, 0xAD, 0x59, 0xB8, 0x6D, 0xB4, 0x4B, 0xB1, + 0xE1, 0xCF, 0x14, 0xBA, 0xAA, 0xD4, 0x37, 0xC2, 0xAC, 0xCE, 0x70, 0xCF, + 0x5E, 0xE0, 0x46, 0xE5, 0x7C, 0xEE, 0xC9, 0xE5, 0x95, 0xFF, 0xC1, 0xDB, + 0x81, 0x1B, 0x8E, 0xEA, 0x91, 0x17, 0xE1, 0xF5, 0x1B, 0x07, 0x62, 0xEB, + 0x62, 0x09, 0xAE, 0xF0, 0x5A, 0x0F, 0x0C, 0x02, 0xBD, 0x12, 0x0E, 0x02, + 0x9C, 0x13, 0x14, 0x00, 0xC8, 0x0D, 0xDC, 0xFD, 0x20, 0x07, 0x70, 0xE8, + 0x54, 0xF6, 0x7E, 0xDC, 0xE9, 0xD7, 0x54, 0xE3, 0x2D, 0xC8, 0x3A, 0xDB, + 0x81, 0xCD, 0x2D, 0xD6, 0x3A, 0xDA, 0xA9, 0xE1, 0xE0, 0xE2, 0x1D, 0xE9, + 0x8A, 0xDB, 0xCC, 0xE4, 0xF4, 0xC7, 0x6A, 0xDB, 0xE0, 0xBF, 0x01, 0xE6, + 0x0A, 0xD0, 0x87, 0xFE, 0x1B, 0xDD, 0xA0, 0x04, 0xF4, 0xE4, 0x35, 0x05, + 0xC4, 0xFA, 0x79, 0x11, 0x36, 0x0D, 0xD5, 0x1D, 0x89, 0x22, 0x81, 0x24, + 0xC9, 0x32, 0x88, 0x25, 0xC6, 0x2B, 0xFC, 0x24, 0x85, 0x1D, 0xAC, 0x12, + 0x6D, 0x14, 0x94, 0x05, 0xBD, 0x1F, 0x36, 0x1B, 0xD1, 0x32, 0xEB, 0x2D, + 0xA1, 0x3A, 0x97, 0x3A, 0xF3, 0x37, 0xFD, 0x44, 0x46, 0x3C, 0xA6, 0x40, + 0x3C, 0x41, 0x50, 0x3D, 0x69, 0x36, 0xC5, 0x3F, 0xCB, 0x2F, 0x88, 0x3B, + 0x43, 0x26, 0xBA, 0x30, 0xFC, 0x0F, 0xE2, 0x27, 0x0C, 0xFB, 0xA6, 0x17, + 0xAD, 0x01, 0xC8, 0x0C, 0xAE, 0x13, 0x1A, 0x12, 0xCB, 0x0E, 0x1C, 0x16, + 0x8C, 0x0A, 0x53, 0x12, 0x37, 0x13, 0x53, 0x12, 0x30, 0x1F, 0x67, 0x20, + 0x23, 0x27, 0x25, 0x1E, 0xCE, 0x17, 0x45, 0x0D, 0x61, 0x00, 0xDF, 0x09, + 0xC9, 0x04, 0x54, 0x05, 0x07, 0x16, 0x58, 0xFE, 0x73, 0x0A, 0xA1, 0xF8, + 0xFF, 0xFA, 0xB0, 0xF5, 0x14, 0xF5, 0x90, 0xE5, 0x4D, 0xED, 0x78, 0xD6, + 0x5C, 0xF9, 0xE7, 0xD8, 0x40, 0xF4, 0x67, 0xCE, 0xC5, 0xD6, 0x28, 0xCB, + 0x65, 0xD3, 0x20, 0xD5, 0x3A, 0xD7, 0x64, 0xD2, 0xF0, 0xDD, 0x5D, 0xDB, + 0x8B, 0xEB, 0x03, 0xE8, 0xC0, 0xE9, 0xEB, 0xE6, 0x4F, 0xE1, 0x04, 0xE4, + 0x40, 0xE4, 0x1D, 0xE5, 0x80, 0xEB, 0x88, 0xEE, 0x79, 0xEC, 0x29, 0xFF, + 0x58, 0xF5, 0x8E, 0x16, 0xD8, 0x0B, 0xA1, 0x27, 0xEE, 0x1F, 0x69, 0x30, + 0x2D, 0x30, 0xEF, 0x36, 0x10, 0x2F, 0xFD, 0x2E, 0xAB, 0x22, 0x33, 0x29, + 0xAD, 0x1E, 0xA1, 0x2E, 0x01, 0x27, 0xAA, 0x33, 0xF5, 0x2F, 0xAF, 0x27, + 0x0F, 0x27, 0xA5, 0x07, 0xC8, 0x16, 0x94, 0xEE, 0x6A, 0x0B, 0x73, 0xE9, + 0x4C, 0x0C, 0x4F, 0xF5, 0x77, 0xFF, 0xCB, 0x00, 0xCD, 0xF4, 0xEE, 0x08, + 0x93, 0xF8, 0xDB, 0xFC, 0x4E, 0xF7, 0x66, 0xEC, 0xC5, 0xFF, 0xE6, 0xEF, + 0xAA, 0xFA, 0x94, 0xE2, 0x77, 0xEF, 0xEA, 0xDB, 0x3E, 0xED, 0xD1, 0xE2, + 0xD7, 0xD6, 0xD3, 0xE1, 0x0E, 0xCF, 0x7A, 0xF4, 0xE5, 0xDC, 0x25, 0x00, + 0x96, 0xDF, 0x11, 0xF8, 0x79, 0xE4, 0x67, 0xF8, 0xA9, 0xF3, 0xE8, 0x0E, + 0xA1, 0xFB, 0xCB, 0x1A, 0x06, 0x0C, 0x2B, 0x15, 0x6C, 0x2F, 0xC4, 0x28, + 0xD0, 0x34, 0x0D, 0x36, 0xF0, 0x25, 0x0B, 0x2F, 0xE9, 0x1D, 0xFF, 0x27, + 0x67, 0x13, 0x04, 0x20, 0xEB, 0x15, 0x8A, 0x0F, 0x8B, 0x1C, 0x00, 0xF9, + 0x74, 0x1A, 0xD8, 0xF8, 0xB3, 0x14, 0xD2, 0xFE, 0x5C, 0x0E, 0x7F, 0xF6, + 0x0E, 0x13, 0xFF, 0x07, 0xE0, 0x14, 0x79, 0x1F, 0xBC, 0x0B, 0xD7, 0x12, + 0xFB, 0x16, 0x1A, 0x0B, 0x2E, 0x22, 0x2A, 0x0A, 0xD0, 0x18, 0x41, 0xF6, + 0x09, 0x10, 0x18, 0xF3, 0xFA, 0xFC, 0xCA, 0xFB, 0x96, 0xF6, 0xA3, 0x06, + 0xFC, 0x08, 0x3A, 0x19, 0x49, 0x0B, 0xBD, 0x16, 0x7E, 0x03, 0x1D, 0x12, + 0xA2, 0x00, 0x0B, 0x15, 0xA7, 0xF6, 0x27, 0x16, 0x89, 0xFA, 0x67, 0x28, + 0xF4, 0x00, 0xA9, 0x2F, 0x3D, 0xE6, 0x64, 0x1A, 0xE2, 0xCB, 0xC7, 0x09, + 0x14, 0xDB, 0x7B, 0x0D, 0x07, 0xF4, 0x52, 0x0B, 0x65, 0x02, 0x43, 0x0C, + 0x62, 0x0B, 0xC4, 0x10, 0xF6, 0x14, 0x92, 0x0D, 0x3F, 0x1A, 0x5C, 0x1A, + 0x62, 0x0E, 0x98, 0x20, 0xCA, 0x14, 0xEE, 0x21, 0x8A, 0x21, 0x99, 0x2E, + 0xF7, 0x1E, 0x60, 0x2F, 0xA7, 0x18, 0x04, 0x26, 0xD6, 0x17, 0xDB, 0x24, + 0x4E, 0x28, 0x34, 0x31, 0x85, 0x2A, 0x7C, 0x36, 0x5B, 0x24, 0x74, 0x35, + 0x17, 0x24, 0xE5, 0x3B, 0x12, 0x1B, 0x6E, 0x3A, 0xE2, 0x26, 0x51, 0x33, + 0xCF, 0x35, 0x07, 0x28, 0xDF, 0x1F, 0xF0, 0x1F, 0x3D, 0x10, 0x36, 0x21, + 0xE2, 0x17, 0x08, 0x1D, 0xE3, 0x15, 0xC9, 0x0F, 0x28, 0x13, 0x23, 0x03, + 0x9C, 0x11, 0x36, 0x00, 0x79, 0x08, 0xAC, 0x09, 0x0A, 0x0A, 0xB0, 0x08, + 0x2E, 0x16, 0x1E, 0xF4, 0x56, 0x16, 0xBC, 0xE5, 0x5E, 0x0F, 0x9C, 0xED, + 0x02, 0x13, 0x7A, 0xF8, 0x86, 0x1D, 0x65, 0xF8, 0x90, 0x25, 0xE5, 0xF9, + 0x63, 0x1C, 0x66, 0xEB, 0xE2, 0x0C, 0xD3, 0xE8, 0x32, 0x05, 0xE9, 0xFB, + 0xA3, 0xFC, 0xB0, 0xF0, 0x3C, 0xFD, 0xDC, 0xE7, 0x93, 0x07, 0x41, 0x01, + 0x94, 0x0A, 0x7B, 0x15, 0x44, 0x06, 0xB2, 0x0A, 0x6A, 0x0B, 0x2D, 0x08, + 0xFB, 0x19, 0xF6, 0x1A, 0xCA, 0x18, 0xED, 0x16, 0xAB, 0x08, 0x31, 0x0C, + 0x1D, 0xFB, 0xE1, 0x14, 0x2F, 0xF5, 0x1F, 0x13, 0x2F, 0xFF, 0x59, 0x0C, + 0xFF, 0x00, 0xCB, 0x05, 0x96, 0xEC, 0x1B, 0xFA, 0xD4, 0xE3, 0x9A, 0xF7, + 0xA1, 0xE9, 0xA7, 0x07, 0x34, 0xF3, 0x10, 0x18, 0x85, 0xFA, 0x4B, 0x03, + 0x8B, 0xFE, 0xA7, 0xEF, 0x36, 0x05, 0xF2, 0xF6, 0x26, 0x00, 0x42, 0xF2, + 0x73, 0xFE, 0x7C, 0xF0, 0x86, 0x06, 0x33, 0x00, 0xB8, 0x05, 0x17, 0x09, + 0x75, 0xFD, 0x84, 0xFF, 0xD9, 0x01, 0x4A, 0xFD, 0xE3, 0x0B, 0x05, 0xFF, + 0xDA, 0x1C, 0xB4, 0xFD, 0xBC, 0x26, 0x12, 0x03, 0x6B, 0x08, 0x22, 0x01, + 0xA6, 0xF2, 0x99, 0xFD, 0x42, 0x05, 0x62, 0x0B, 0xDF, 0x01, 0xFE, 0x19, + 0x4E, 0xEE, 0xBF, 0x0F, 0xCC, 0xF0, 0x7B, 0xFF, 0xCF, 0xE9, 0x83, 0x03, + 0xB2, 0xDF, 0x5D, 0x00, 0x76, 0xED, 0x50, 0xEF, 0x8F, 0xF6, 0xC3, 0xEC, + 0xAE, 0xE0, 0x0E, 0xEF, 0x0B, 0xDB, 0x41, 0xF9, 0x5D, 0xF1, 0x8B, 0x08, + 0x4D, 0xF3, 0x36, 0x09, 0xA4, 0xF8, 0xDD, 0x01, 0xD8, 0xFF, 0xEB, 0xF6, + 0x43, 0xF8, 0x60, 0xF3, 0x70, 0xE3, 0x34, 0xDC, 0xCD, 0xD5, 0xBD, 0xBB, + 0x30, 0xD1, 0x86, 0xC1, 0x86, 0xC4, 0xEA, 0xD6, 0xDE, 0xD4, 0x22, 0xE3, + 0x60, 0xF1, 0x98, 0xDF, 0x9C, 0xF3, 0x3B, 0xD9, 0x70, 0xE5, 0xA6, 0xD8, + 0xE4, 0xE5, 0x98, 0xE3, 0x59, 0xF2, 0x0C, 0xEF, 0x8B, 0xE6, 0xFC, 0xE2, + 0x95, 0xD8, 0x20, 0xD7, 0x2E, 0xD1, 0x0C, 0xD9, 0xFE, 0xCC, 0xE3, 0xE3, + 0xF2, 0xCF, 0x24, 0xE2, 0xF5, 0xD6, 0x42, 0xE9, 0x41, 0xD6, 0xA4, 0xFA, + 0xB8, 0xC7, 0x33, 0xF3, 0x42, 0xD0, 0x83, 0xF3, 0xF0, 0xD7, 0x08, 0xF8, + 0x6E, 0xD7, 0x67, 0xF5, 0xA2, 0xF7, 0x14, 0x01, 0x08, 0x15, 0x06, 0x0E, + 0xD9, 0x18, 0x33, 0x02, 0x3C, 0x29, 0x0C, 0x00, 0xC8, 0x26, 0xD1, 0x08, + 0x12, 0x14, 0xA5, 0x04, 0xC0, 0x19, 0x98, 0x00, 0x1B, 0x24, 0x8D, 0x07, + 0xBB, 0x24, 0xD0, 0x1B, 0x51, 0x29, 0x28, 0x26, 0x43, 0x41, 0x37, 0x25, + 0xB5, 0x47, 0xED, 0x26, 0xB4, 0x26, 0x26, 0x1D, 0xDE, 0x08, 0x9C, 0x0C, + 0x9C, 0xF9, 0x4A, 0x06, 0x80, 0xF6, 0x4D, 0x04, 0x52, 0xF4, 0xA4, 0xFA, + 0x7C, 0xE7, 0xEF, 0xF1, 0x54, 0xDD, 0x85, 0xF0, 0xFA, 0xDD, 0xC2, 0xF5, + 0xD6, 0xE5, 0xF4, 0xFA, 0x95, 0xE5, 0xB7, 0xE9, 0xE0, 0xE0, 0x55, 0xDC, + 0x43, 0xE8, 0xD0, 0xF4, 0xAF, 0xEE, 0xAB, 0x0A, 0x0F, 0xE8, 0x69, 0xF4, + 0x7C, 0xE1, 0x31, 0xCF, 0xBB, 0xEC, 0xC1, 0xD1, 0x53, 0xF3, 0x56, 0xDC, + 0xCF, 0xF3, 0x6A, 0xD8, 0x23, 0x0C, 0x67, 0xE5, 0x21, 0x25, 0x63, 0xFE, + 0x6F, 0x28, 0x68, 0x10, 0x6B, 0x21, 0xE0, 0x11, 0x67, 0x24, 0x9B, 0x15, + 0x77, 0x32, 0xA3, 0x20, 0x0E, 0x31, 0xA0, 0x18, 0x09, 0x2E, 0x82, 0x1A, + 0x9C, 0x39, 0xAF, 0x30, 0x1C, 0x46, 0x5D, 0x38, 0xB7, 0x46, 0xE9, 0x33, + 0xD1, 0x34, 0x46, 0x28, 0xA0, 0x24, 0x5E, 0x20, 0xAE, 0x1D, 0x3E, 0x26, + 0xA3, 0x14, 0x46, 0x25, 0xE3, 0x0F, 0x4F, 0x1C, 0x0F, 0x12, 0x90, 0x1C, + 0x3C, 0x14, 0x5E, 0x1B, 0xAA, 0x13, 0xB3, 0x11, 0xB1, 0xF7, 0x02, 0x02, + 0x3A, 0xD2, 0x23, 0xFB, 0x66, 0xD9, 0x7C, 0xFC, 0x02, 0xF7, 0x38, 0xFD, + 0x7E, 0xF8, 0xF6, 0xF9, 0x7E, 0xF2, 0xE5, 0xEF, 0x59, 0xF5, 0x91, 0xEA, + 0x3D, 0xF0, 0xCF, 0xE8, 0x50, 0xF2, 0x42, 0xF1, 0xB7, 0xEF, 0xE9, 0xF5, + 0x06, 0xDB, 0xCA, 0xEA, 0x3F, 0xDF, 0x4E, 0xEC, 0x1D, 0xF7, 0xE4, 0xED, + 0x68, 0xF9, 0x4C, 0xE2, 0x0C, 0xED, 0xEF, 0xD9, 0xF5, 0xE1, 0x83, 0xDB, + 0x70, 0xD8, 0xD1, 0xDF, 0xE9, 0xD2, 0x1F, 0xE4, 0xAB, 0xCA, 0xD4, 0xE8, + 0x15, 0xBD, 0xBD, 0xE5, 0x6D, 0xB3, 0x5A, 0xE8, 0x14, 0xBE, 0xE6, 0xF6, + 0xD7, 0xD0, 0x50, 0xEB, 0x8A, 0xE3, 0x8F, 0xD9, 0x44, 0xE4, 0x55, 0xDD, + 0xF1, 0xD0, 0xF1, 0xE2, 0x1E, 0xCD, 0xC4, 0xDA, 0xDF, 0xD5, 0x63, 0xCE, + 0x38, 0xDB, 0xDF, 0xCF, 0x1D, 0xDE, 0xEC, 0xD3, 0xCE, 0xEC, 0x21, 0xD7, + 0x39, 0xEF, 0x68, 0xC5, 0x2C, 0xD9, 0x56, 0xAD, 0xB4, 0xD9, 0x04, 0xB3, + 0xEF, 0xE7, 0x5B, 0xC3, 0x4F, 0xE5, 0xE7, 0xC7, 0x58, 0xF6, 0x88, 0xD2, + 0x2D, 0xFF, 0xB4, 0xD8, 0x7F, 0xF0, 0x29, 0xD0, 0x47, 0xF8, 0x2A, 0xD2, + 0xA9, 0xF2, 0xAB, 0xD4, 0xB8, 0xDF, 0xEA, 0xD8, 0x65, 0xEB, 0x98, 0xE1, + 0x2F, 0xF8, 0x4F, 0xDF, 0xF6, 0xF2, 0xE8, 0xE6, 0x34, 0xFA, 0xDD, 0xFB, + 0x37, 0x05, 0x11, 0x07, 0x2F, 0x00, 0x23, 0x0D, 0x7A, 0xFB, 0x7C, 0x0F, + 0x2A, 0xFC, 0xCA, 0x0C, 0xC2, 0xF2, 0xC7, 0x0C, 0xA2, 0xE4, 0xAC, 0x0E, + 0x6D, 0xE5, 0x3B, 0x0B, 0xBC, 0xF0, 0x1C, 0x00, 0x2A, 0x0E, 0xF5, 0x07, + 0x03, 0x20, 0x6B, 0x0E, 0x9A, 0x23, 0x46, 0x0D, 0xD5, 0x3B, 0x95, 0x21, + 0xA1, 0x43, 0x24, 0x30, 0x2D, 0x31, 0xD5, 0x27, 0x5D, 0x26, 0x73, 0x1E, + 0xE1, 0x23, 0x34, 0x17, 0x13, 0x22, 0x1C, 0x0C, 0x8B, 0x29, 0xDA, 0x0F, + 0x31, 0x31, 0x90, 0x1A, 0x89, 0x25, 0x1F, 0x1D, 0x6B, 0x23, 0x9E, 0x2A, + 0x91, 0x2B, 0x49, 0x30, 0x00, 0x2C, 0x0E, 0x29, 0xDC, 0x2F, 0x6E, 0x2A, + 0x3E, 0x20, 0x4A, 0x24, 0xFB, 0x0E, 0x38, 0x22, 0x13, 0x17, 0xAD, 0x28, + 0x04, 0x25, 0xED, 0x29, 0x8B, 0x2F, 0x71, 0x2F, 0x6A, 0x24, 0x4D, 0x33, + 0x8A, 0x1A, 0x06, 0x32, 0xB7, 0x26, 0x22, 0x2D, 0xF4, 0x1C, 0x6D, 0x1E, + 0x0D, 0x09, 0x24, 0x14, 0xA5, 0x08, 0xE9, 0x0F, 0x22, 0x0C, 0x2D, 0x0A, + 0xED, 0x10, 0x22, 0x06, 0x71, 0x1E, 0x29, 0x0C, 0x48, 0x16, 0xC9, 0x08, + 0xC9, 0xFB, 0x57, 0xF6, 0x4E, 0xFC, 0xF2, 0xF0, 0x1F, 0xFF, 0x71, 0xF2, + 0xD7, 0xF4, 0x83, 0xF4, 0x42, 0xFA, 0xAB, 0xFD, 0xC1, 0x01, 0xC7, 0x04, + 0xD4, 0xFF, 0xDB, 0x09, 0x4D, 0x0D, 0xC0, 0x1A, 0xF7, 0x10, 0xA7, 0x1A, + 0x84, 0x18, 0xF0, 0x13, 0x22, 0x22, 0x70, 0x1E, 0xE2, 0x0C, 0x2B, 0x1C, + 0x84, 0x01, 0x77, 0x11, 0xD3, 0x00, 0x63, 0x0E, 0xE8, 0xFB, 0xC0, 0x09, + 0x56, 0xF8, 0xED, 0xF7, 0xD8, 0xE3, 0x18, 0xE7, 0x43, 0xD7, 0x5C, 0xED, + 0xCF, 0xE6, 0xDB, 0xF8, 0x4A, 0xE2, 0x7C, 0xEA, 0x6E, 0xD8, 0x7A, 0xE1, + 0x09, 0xEB, 0x75, 0xEB, 0x20, 0xE3, 0xF1, 0xD1, 0x68, 0xDA, 0x94, 0xC2, + 0xD7, 0xF4, 0x99, 0xDE, 0xF3, 0xEE, 0xD0, 0xE0, 0x0F, 0xE2, 0x09, 0xDF, + 0x7B, 0xEF, 0x2C, 0xEE, 0x96, 0xFD, 0x84, 0xF9, 0x70, 0x06, 0xC9, 0xF9, + 0xA8, 0x08, 0xAA, 0xEB, 0x92, 0x02, 0x7F, 0xE6, 0x3E, 0xFC, 0x71, 0xE6, + 0xD0, 0x00, 0xD8, 0xE8, 0xCD, 0x01, 0xDF, 0xF7, 0xD3, 0xFD, 0x90, 0x0C, + 0x9A, 0xF0, 0xF1, 0x15, 0x1F, 0xE4, 0xEB, 0x0B, 0xD9, 0xFC, 0x6B, 0x0C, + 0x27, 0x07, 0xCD, 0x09, 0xC8, 0xFA, 0x2D, 0x00, 0xC8, 0x0C, 0xDD, 0x13, + 0xDA, 0x15, 0xE5, 0x1F, 0xAC, 0xFE, 0x63, 0x15, 0xD7, 0xF9, 0xC0, 0x14, + 0xDC, 0x0B, 0x4D, 0x0E, 0x92, 0x12, 0xE7, 0x06, 0x53, 0x01, 0x3C, 0xFB, + 0x24, 0xF1, 0xEA, 0xE6, 0x6A, 0xEC, 0x25, 0xDD, 0xD3, 0xE7, 0x81, 0xD5, + 0x46, 0xEB, 0xF3, 0xD8, 0x0D, 0xF0, 0x06, 0xDE, 0x33, 0xEF, 0xCF, 0xD6, + 0x60, 0xF5, 0x94, 0xDB, 0x77, 0xFA, 0x0F, 0xDC, 0x67, 0x03, 0x5E, 0xDF, + 0x60, 0x05, 0x9D, 0xEB, 0xF7, 0x06, 0xE6, 0xF5, 0xBB, 0x15, 0x99, 0xFB, + 0xEC, 0x03, 0xF7, 0xEA, 0x0C, 0xFC, 0x94, 0xED, 0x97, 0x10, 0xC4, 0x07, + 0x5A, 0x06, 0xFB, 0x0C, 0x3D, 0xFF, 0x38, 0x0C, 0xA0, 0xFD, 0xAB, 0x00, + 0x96, 0xF1, 0x97, 0xFC, 0xEC, 0xF5, 0xD6, 0x10, 0x3F, 0xF4, 0x8A, 0x1C, + 0xB4, 0xF0, 0x7D, 0x2E, 0xE0, 0xF0, 0xFE, 0x2F, 0xA4, 0xF4, 0x68, 0x16, + 0x70, 0x13, 0x55, 0x1B, 0x50, 0x2A, 0xCF, 0x29, 0x30, 0x17, 0x42, 0x13, + 0x0C, 0x11, 0xE2, 0x09, 0xDF, 0x1D, 0xE0, 0x13, 0x55, 0x20, 0xEA, 0x1F, + 0x72, 0x1D, 0xC7, 0x26, 0xCF, 0x1D, 0x6A, 0x1B, 0x6A, 0x2C, 0x61, 0x25, + 0xFF, 0x2F, 0x2D, 0x35, 0x86, 0x24, 0xAF, 0x2C, 0x50, 0x18, 0xFC, 0x1A, + 0x0A, 0x19, 0xC6, 0x16, 0x51, 0x21, 0x38, 0x21, 0x5B, 0x05, 0x79, 0x18, + 0x9A, 0xF8, 0x52, 0x1B, 0x7F, 0x04, 0xB9, 0x25, 0x10, 0xFF, 0xC7, 0x20, + 0x3E, 0xF1, 0x09, 0x16, 0x6A, 0xE6, 0x91, 0x0C, 0x50, 0xF6, 0x14, 0x1A, + 0x2D, 0x16, 0x8C, 0x30, 0x00, 0x1D, 0xF2, 0x3B, 0x9B, 0x01, 0x86, 0x29, + 0xF1, 0xF1, 0xB8, 0x11, 0xBA, 0xF5, 0x9A, 0x0A, 0x4A, 0xF0, 0xED, 0xFA, + 0x81, 0xF0, 0x1A, 0xF4, 0xA5, 0x01, 0x7D, 0xF7, 0xCE, 0x0E, 0x1C, 0xF3, + 0x77, 0x16, 0x3C, 0xFE, 0xC8, 0x06, 0x11, 0xF6, 0x46, 0xF7, 0xDA, 0xE2, + 0x55, 0xFE, 0x28, 0xE6, 0x01, 0x01, 0x4B, 0xF0, 0xBD, 0x10, 0x69, 0xFF, + 0x53, 0x12, 0x66, 0xF6, 0x54, 0xFE, 0xB2, 0xEC, 0x8E, 0x09, 0x3E, 0x00, + 0xAE, 0x18, 0xFD, 0x0A, 0x2E, 0x00, 0x6E, 0x04, 0x9B, 0x00, 0x96, 0x14, + 0xE9, 0x15, 0xF6, 0x27, 0x93, 0x00, 0x60, 0x19, 0x97, 0xF6, 0x9C, 0x0F, + 0xA3, 0x09, 0x00, 0x10, 0x02, 0x01, 0x84, 0x0C, 0xEF, 0xF3, 0x54, 0x1A, + 0x76, 0x01, 0x54, 0x2C, 0xA3, 0x09, 0x24, 0x2C, 0x5D, 0x0E, 0xB6, 0x1C, + 0x63, 0x14, 0xCE, 0x0F, 0x79, 0x19, 0xF9, 0x13, 0xF8, 0x26, 0x7C, 0x16, + 0xBC, 0x29, 0x6C, 0x10, 0x51, 0x0E, 0x20, 0x08, 0x34, 0x0A, 0x49, 0x11, + 0x2A, 0x18, 0xDD, 0x19, 0x44, 0x08, 0xD5, 0x04, 0x39, 0x06, 0x5F, 0xF6, + 0xA3, 0x24, 0x2C, 0x02, 0xAD, 0x1F, 0x0B, 0xF7, 0x9F, 0x01, 0x9B, 0xD1, + 0x0F, 0x13, 0x18, 0xE1, 0x08, 0x20, 0x25, 0x05, 0x59, 0x0E, 0x7C, 0x0B, + 0xB8, 0x03, 0x01, 0x13, 0xB2, 0xF1, 0xCF, 0x04, 0x21, 0xED, 0xA6, 0xE8, + 0xD1, 0x0C, 0x49, 0xF8, 0x5D, 0x1E, 0x36, 0x11, 0x96, 0x0B, 0x49, 0x0D, + 0x59, 0xF8, 0x7C, 0x03, 0x74, 0x03, 0x1E, 0x0A, 0x3D, 0x0B, 0xE6, 0x0A, + 0x0B, 0x07, 0x23, 0x02, 0x61, 0x17, 0xA4, 0x07, 0x4B, 0x15, 0x98, 0x07, + 0x52, 0xFE, 0x53, 0xF6, 0x7D, 0xE0, 0x29, 0xD7, 0x64, 0xD3, 0x2E, 0xD4, + 0xD5, 0xE3, 0xD6, 0xE4, 0xC7, 0xDD, 0x35, 0xDB, 0xEC, 0xDA, 0xDB, 0xE2, + 0xB8, 0xE8, 0x1F, 0xE8, 0x4F, 0xEA, 0xF6, 0xD7, 0x34, 0xDD, 0xF6, 0xD3, + 0x6A, 0xD2, 0x0A, 0xD7, 0x9E, 0xEA, 0x76, 0xE9, 0x96, 0xFB, 0x75, 0xF5, + 0xC2, 0xE7, 0xC5, 0xEA, 0x50, 0xE8, 0x95, 0xE7, 0x69, 0xF4, 0x2D, 0xFF, + 0xFD, 0xF3, 0xE5, 0x18, 0xEA, 0xFD, 0xD4, 0x12, 0xEE, 0x06, 0x62, 0x02, + 0xD8, 0xF4, 0xFF, 0xF7, 0x1F, 0xDF, 0xA7, 0xFC, 0x80, 0xD7, 0xB8, 0x0F, + 0xE2, 0xCF, 0x6D, 0x13, 0x77, 0xD5, 0x44, 0x0F, 0x32, 0xF4, 0xFE, 0x14, + 0x3C, 0x09, 0x08, 0x15, 0xC0, 0xFC, 0x22, 0xFF, 0x3E, 0xF9, 0x00, 0xF8, + 0x6C, 0x03, 0xEC, 0x06, 0x5E, 0xFB, 0x55, 0xFF, 0x6D, 0xFE, 0x1F, 0xFE, + 0xA5, 0x10, 0xCB, 0x08, 0xFE, 0x11, 0x08, 0x04, 0xB1, 0x04, 0xD5, 0xFE, + 0x43, 0x05, 0xFA, 0x01, 0x69, 0x09, 0x06, 0x03, 0xEE, 0x03, 0x33, 0x04, + 0xCC, 0x04, 0x7D, 0x0C, 0x54, 0xFE, 0xF5, 0x02, 0xE2, 0xFC, 0x42, 0xFB, + 0xDE, 0x00, 0x31, 0x04, 0xA7, 0xF2, 0x34, 0x02, 0x29, 0xE9, 0x5C, 0xFC, + 0xC5, 0xE7, 0xBF, 0xF8, 0xBB, 0xED, 0xBD, 0x08, 0x63, 0xFE, 0xE9, 0x1B, + 0x66, 0x09, 0xBC, 0x14, 0x32, 0x10, 0x8B, 0x1D, 0x83, 0x0B, 0xD9, 0x1F, + 0xDD, 0x04, 0xEC, 0x0A, 0x38, 0x07, 0x6D, 0x0B, 0xAB, 0x08, 0x19, 0x0C, + 0x09, 0x00, 0xF9, 0xFB, 0xDD, 0x05, 0x2B, 0xFA, 0xB1, 0x09, 0x40, 0xED, + 0x65, 0xF6, 0x8C, 0xD4, 0x28, 0xF8, 0xC7, 0xDE, 0x82, 0x0B, 0xE3, 0xEE, + 0x38, 0x15, 0x04, 0xF1, 0x45, 0x1A, 0x93, 0xF7, 0x7A, 0x15, 0x2C, 0xF4, + 0x0E, 0x0B, 0xD2, 0xF3, 0xE7, 0x09, 0x71, 0x00, 0xAB, 0x1B, 0xB2, 0x0C, + 0xD5, 0x2D, 0xF7, 0x07, 0xE4, 0x24, 0x42, 0xFF, 0xA9, 0x0C, 0xB0, 0x06, + 0x08, 0x02, 0x8E, 0x04, 0xA8, 0x09, 0x5A, 0xFC, 0xE7, 0x0C, 0xBB, 0xFA, + 0x54, 0x0E, 0xE3, 0x00, 0xA8, 0x0B, 0xA5, 0x0A, 0xDB, 0xF9, 0x04, 0x03, + 0x5F, 0xED, 0x7B, 0xF5, 0xDF, 0xF2, 0x75, 0xF5, 0xE0, 0x01, 0xE9, 0x04, + 0xA4, 0xFE, 0x0C, 0x03, 0x28, 0xF5, 0xB6, 0xEA, 0x57, 0xE7, 0xDB, 0xDD, + 0x93, 0xDF, 0x2C, 0xE0, 0xEA, 0xEF, 0xF4, 0xE0, 0x20, 0xEE, 0xE6, 0xDD, + 0x83, 0xE5, 0xB6, 0xEA, 0xD8, 0xEA, 0x53, 0xFB, 0xF6, 0xF4, 0xE5, 0x03, + 0xB1, 0xF8, 0x04, 0xFA, 0xBC, 0xE7, 0xE0, 0xD4, 0x12, 0xE0, 0x66, 0xBA, + 0x6C, 0xEB, 0xDF, 0xC7, 0x1B, 0xED, 0x2C, 0xE0, 0x6A, 0xD8, 0xCE, 0xDD, + 0xF8, 0xCF, 0x4D, 0xE1, 0x9C, 0xD1, 0xB4, 0xE4, 0x9B, 0xCF, 0x73, 0xE1, + 0x2F, 0xE5, 0xDF, 0xF3, 0x1C, 0xF3, 0xA7, 0xF4, 0x9F, 0xE4, 0xA5, 0xE2, + 0xB9, 0xDC, 0x93, 0xE2, 0x1C, 0xE3, 0xF4, 0xEE, 0x83, 0xEA, 0x6D, 0xF5, + 0xB4, 0xE7, 0xCE, 0xEC, 0xAF, 0xEC, 0xBB, 0xE6, 0xDB, 0xF7, 0x07, 0xF0, + 0x2E, 0xEA, 0x61, 0xE4, 0x12, 0xEB, 0x89, 0xDA, 0x63, 0xF8, 0xBA, 0xE8, + 0x5C, 0xF1, 0xE0, 0xE9, 0x6B, 0xF3, 0xDE, 0xE8, 0x5B, 0xF9, 0x6E, 0xE7, + 0x7C, 0xE0, 0xD6, 0xC2, 0x23, 0xD3, 0x45, 0xB8, 0xD4, 0xE9, 0xB0, 0xDD, + 0xF3, 0xE8, 0xE8, 0xE0, 0xE3, 0xD9, 0x05, 0xD3, 0x23, 0xD9, 0xE8, 0xC9, + 0xE2, 0xD8, 0x77, 0xC3, 0xB0, 0xD8, 0x35, 0xD0, 0x74, 0xD2, 0x94, 0xDE, + 0x35, 0xDB, 0xCA, 0xEA, 0xEC, 0xF4, 0x45, 0xF4, 0x35, 0xFB, 0x37, 0xEE, + 0x5B, 0xE0, 0x80, 0xE2, 0x44, 0xC9, 0xC1, 0xE6, 0x12, 0xC5, 0x3C, 0xEE, + 0xF4, 0xBB, 0x64, 0xEE, 0x3A, 0xBB, 0x74, 0xF3, 0xAA, 0xDE, 0x35, 0x06, + 0xAF, 0xF4, 0xF0, 0x04, 0x24, 0xE6, 0x5C, 0xEF, 0x98, 0xF2, 0xF4, 0xFA, + 0x7F, 0x0F, 0x72, 0x0F, 0xA3, 0x06, 0xDC, 0xFD, 0xB0, 0xFA, 0x66, 0xEC, + 0xCC, 0xFD, 0xD3, 0xF5, 0xFE, 0xFE, 0x35, 0xFC, 0x90, 0x01, 0x71, 0xEF, + 0x6B, 0x14, 0xE7, 0xFA, 0x7E, 0x28, 0xEE, 0x10, 0x31, 0x1D, 0x0D, 0x08, + 0x3B, 0x1B, 0x8A, 0x10, 0x50, 0x31, 0xA1, 0x29, 0xBE, 0x2D, 0x2F, 0x26, + 0x2E, 0x1A, 0x3F, 0x18, 0x22, 0x1A, 0x03, 0x1C, 0xF9, 0x1B, 0xC0, 0x21, + 0x5D, 0x14, 0xFA, 0x1D, 0x02, 0x15, 0xE0, 0x19, 0x02, 0x21, 0x11, 0x1F, + 0x0C, 0x25, 0xDE, 0x2C, 0xA8, 0x22, 0x16, 0x32, 0x86, 0x2B, 0x8A, 0x30, + 0x34, 0x21, 0x4E, 0x29, 0xD6, 0x0E, 0x07, 0x25, 0xA2, 0x12, 0x8F, 0x21, + 0xC2, 0x15, 0xAD, 0x14, 0x79, 0x22, 0x97, 0x12, 0x51, 0x30, 0xD5, 0x0F, + 0xE8, 0x2A, 0x23, 0x0F, 0xA6, 0x1F, 0x6F, 0x15, 0x34, 0x20, 0x24, 0x11, + 0x2D, 0x1C, 0x2D, 0x0C, 0x78, 0x19, 0x7B, 0x1E, 0xF2, 0x29, 0x4C, 0x2E, + 0x9F, 0x2F, 0x8F, 0x20, 0x69, 0x2A, 0x6E, 0x13, 0xD7, 0x28, 0x7D, 0x11, + 0xEB, 0x1F, 0xB7, 0x14, 0x7A, 0x12, 0xFC, 0x19, 0xED, 0x0C, 0xF4, 0x19, + 0xED, 0x18, 0x12, 0x23, 0x36, 0x21, 0x8D, 0x23, 0xE5, 0x0E, 0xA5, 0x0B, + 0xD7, 0x11, 0xF7, 0x0B, 0xD1, 0x0A, 0xD7, 0x0B, 0x31, 0xE7, 0x77, 0xF8, + 0xB0, 0xED, 0x15, 0x04, 0xAC, 0xEE, 0xBB, 0x0C, 0x4E, 0xE1, 0x79, 0xFD, + 0xE4, 0xF5, 0xD4, 0xF6, 0x30, 0xF8, 0xA7, 0xEF, 0xEA, 0xE9, 0x9E, 0xEA, + 0x0D, 0xFF, 0x8A, 0xF2, 0xA6, 0x08, 0xB7, 0xEE, 0x06, 0xFA, 0x62, 0xED, + 0x37, 0xEA, 0x78, 0xF5, 0x06, 0xE8, 0x03, 0xFC, 0xF4, 0xFB, 0x0A, 0x00, + 0x70, 0xF9, 0x00, 0xE7, 0x24, 0xFE, 0x2A, 0xDB, 0x50, 0x0F, 0x20, 0xE7, + 0x37, 0x06, 0x93, 0xE0, 0xCC, 0xF3, 0x19, 0xE0, 0x54, 0xE5, 0xDD, 0xE9, + 0x2C, 0xDE, 0x6C, 0xEA, 0x90, 0xD3, 0x71, 0xE9, 0xBC, 0xD3, 0xCA, 0xEA, + 0x23, 0xDE, 0xC5, 0xE7, 0x4F, 0xDE, 0x87, 0xE5, 0xCA, 0xDC, 0xD3, 0xF1, + 0x2C, 0xD4, 0xAA, 0xF6, 0x7F, 0xCA, 0x81, 0xE8, 0x65, 0xD8, 0x6F, 0xEE, + 0xAE, 0xE7, 0xD7, 0xF6, 0xE2, 0xE4, 0x04, 0xE3, 0x69, 0xE8, 0x01, 0xD7, + 0x41, 0xEF, 0x24, 0xDB, 0x78, 0xED, 0xFE, 0xDE, 0x14, 0xEA, 0x3D, 0xE3, + 0x0D, 0xDE, 0x11, 0xDB, 0x48, 0xE6, 0x73, 0xD2, 0x24, 0xFE, 0x62, 0xD9, + 0x8D, 0x06, 0x0D, 0xE4, 0x24, 0x06, 0x79, 0xED, 0x5C, 0x0C, 0x19, 0xF8, + 0x5C, 0x11, 0x73, 0xF9, 0x93, 0x07, 0x21, 0xEF, 0xF6, 0x03, 0x4E, 0xEE, + 0x16, 0xFE, 0x74, 0xF0, 0xC5, 0xEB, 0xA6, 0xE8, 0x1F, 0xE2, 0x88, 0xE3, + 0x67, 0xF5, 0x4A, 0xF0, 0xA1, 0x02, 0xAD, 0xF5, 0xF6, 0xF5, 0xD7, 0xE6, + 0x13, 0xEF, 0x2B, 0xE7, 0x05, 0xEC, 0x8A, 0xF6, 0x41, 0xD4, 0x3F, 0xFC, + 0x4C, 0xC7, 0x28, 0x03, 0x26, 0xD9, 0x30, 0x0B, 0x0D, 0xDE, 0xF4, 0xFF, + 0xF9, 0xE2, 0xB6, 0xFF, 0x5A, 0xF9, 0xC4, 0x06, 0x54, 0x08, 0x76, 0x02, + 0x45, 0x0D, 0xAB, 0x0B, 0x85, 0x09, 0x6B, 0x10, 0x3D, 0x0D, 0x6B, 0x13, + 0x81, 0x0D, 0x36, 0x16, 0x73, 0x18, 0x5F, 0x1A, 0xB4, 0x3B, 0xFE, 0x34, + 0x88, 0x3B, 0x17, 0x37, 0xC6, 0x26, 0x8E, 0x26, 0xFD, 0x2E, 0x32, 0x29, + 0x29, 0x38, 0x01, 0x24, 0xA9, 0x34, 0xE2, 0x2B, 0xED, 0x36, 0x09, 0x4A, + 0xA9, 0x39, 0xE7, 0x52, 0x68, 0x2F, 0xB9, 0x45, 0xDE, 0x1A, 0x5D, 0x33, + 0xB1, 0x1C, 0x01, 0x30, 0xD7, 0x27, 0x9D, 0x3C, 0x4E, 0x1F, 0x53, 0x3E, + 0x6F, 0x2B, 0xC0, 0x3D, 0x61, 0x45, 0x11, 0x45, 0x5D, 0x3E, 0xAC, 0x43, + 0x78, 0x29, 0x47, 0x3E, 0x07, 0x1A, 0xB9, 0x36, 0xEA, 0x16, 0x06, 0x26, + 0x56, 0x23, 0x1D, 0x1A, 0x38, 0x2B, 0xA3, 0x1D, 0xF1, 0x2B, 0xB6, 0x24, + 0x69, 0x2D, 0xC2, 0x1B, 0x88, 0x27, 0x5F, 0x0D, 0xFE, 0x23, 0x3D, 0x12, + 0x4D, 0x27, 0x5B, 0x19, 0x9C, 0x29, 0x25, 0x1B, 0x76, 0x1F, 0x6B, 0x1E, + 0x84, 0x1C, 0x32, 0x1B, 0x90, 0x33, 0x2C, 0x1B, 0x28, 0x38, 0xDC, 0x1C, + 0x34, 0x26, 0x7D, 0x19, 0x90, 0x1D, 0xD6, 0x1F, 0x23, 0x19, 0xEB, 0x25, + 0x41, 0x1A, 0xEB, 0x24, 0xAB, 0x2B, 0x3A, 0x27, 0x74, 0x30, 0xAD, 0x1B, + 0x1C, 0x12, 0x5C, 0x0A, 0x92, 0x03, 0x22, 0x11, 0xFF, 0x0C, 0x2C, 0x1B, + 0xD2, 0x00, 0x49, 0x14, 0xC2, 0xF6, 0x79, 0x0F, 0x58, 0xF6, 0xED, 0x05, + 0xD0, 0xF8, 0x31, 0xFD, 0xFF, 0xF4, 0x14, 0xFD, 0x60, 0xEB, 0x27, 0xF0, + 0xFC, 0xEE, 0xC7, 0xDD, 0x5E, 0xED, 0x14, 0xDF, 0x15, 0xE8, 0x68, 0xE8, + 0x71, 0xE7, 0xF5, 0xEE, 0xAD, 0xE0, 0x3C, 0xF4, 0x5C, 0xDE, 0x87, 0xE9, + 0x03, 0xEF, 0xA4, 0xDB, 0x4B, 0xFC, 0x47, 0xDF, 0xC0, 0xFE, 0x1F, 0xEA, + 0x2A, 0x04, 0x71, 0xE8, 0xAC, 0x0B, 0x90, 0xED, 0x56, 0x06, 0xFE, 0xFC, + 0x12, 0xED, 0xC0, 0xF9, 0xE3, 0xE5, 0xE2, 0xEC, 0xB2, 0xF2, 0x84, 0xED, + 0xED, 0xEB, 0xB6, 0xEA, 0x5C, 0xE1, 0x62, 0xE2, 0xE9, 0xE2, 0xEE, 0xE7, + 0xD0, 0xE5, 0x50, 0xF1, 0xD5, 0xE4, 0x8A, 0xF4, 0xD6, 0xE0, 0xD3, 0xF5, + 0x31, 0xE6, 0xB9, 0xF7, 0x3D, 0xE3, 0xA4, 0xEB, 0xD1, 0xDE, 0x2A, 0xDF, + 0x9A, 0xEB, 0x97, 0xE5, 0xAE, 0xF1, 0xA1, 0xEE, 0x35, 0xE5, 0xF2, 0xE3, + 0x2F, 0xE1, 0x8F, 0xD9, 0x9E, 0xEC, 0x7B, 0xE0, 0x3A, 0xF7, 0x78, 0xE9, + 0x1B, 0xF4, 0x14, 0xEA, 0x8B, 0xF5, 0xBC, 0xF5, 0xF0, 0x02, 0x15, 0x0B, + 0x91, 0x04, 0x7F, 0x0A, 0x63, 0x0E, 0x5B, 0x07, 0x8E, 0x1B, 0xB5, 0x0B, + 0x92, 0x12, 0x21, 0x07, 0x6C, 0x02, 0x1A, 0x09, 0xA9, 0x0D, 0x19, 0x1B, + 0x60, 0x21, 0xD4, 0x24, 0x1A, 0x1B, 0x98, 0x18, 0x47, 0x13, 0xCC, 0x09, + 0x69, 0x06, 0x2A, 0xFF, 0x84, 0xED, 0xE9, 0xF6, 0xB0, 0xDE, 0x84, 0xFD, + 0x57, 0xD9, 0x2E, 0x03, 0x39, 0xD6, 0x4B, 0x02, 0xC8, 0xD5, 0x6D, 0x07, + 0x22, 0xE0, 0x48, 0x09, 0x9B, 0xF1, 0x2E, 0x0E, 0x20, 0xF5, 0x82, 0x0C, + 0xD2, 0xF1, 0xD4, 0xFB, 0xBB, 0xFB, 0xB7, 0xEF, 0x4A, 0x01, 0x22, 0xEC, + 0x0B, 0xF3, 0x85, 0xEF, 0xA7, 0xFE, 0x35, 0x04, 0x9D, 0x10, 0xA7, 0x07, + 0xE4, 0x09, 0xE7, 0xF5, 0x68, 0x0A, 0x80, 0xF9, 0xC9, 0x11, 0xB3, 0x08, + 0x51, 0x19, 0xA0, 0x10, 0x76, 0x2C, 0x19, 0x26, 0xF7, 0x38, 0xE5, 0x35, + 0xA5, 0x2C, 0xAD, 0x29, 0x97, 0x1C, 0xBE, 0x21, 0xAA, 0x17, 0x1F, 0x23, + 0x22, 0x11, 0x66, 0x27, 0xFA, 0x0C, 0x6C, 0x2D, 0xB5, 0x15, 0xAD, 0x2D, + 0xEC, 0x1C, 0xB4, 0x28, 0x3D, 0x1A, 0xEE, 0x2A, 0x2A, 0x14, 0xBC, 0x2F, + 0xE2, 0x12, 0xB6, 0x29, 0x1D, 0x0F, 0x3A, 0x27, 0xA7, 0x15, 0x22, 0x2D, + 0x47, 0x20, 0x68, 0x22, 0x27, 0x0E, 0xF5, 0x07, 0x17, 0x00, 0x39, 0x01, + 0xF3, 0x0C, 0xDC, 0x03, 0xC9, 0x16, 0x9B, 0xF5, 0xC6, 0x15, 0x1F, 0xF4, + 0x1E, 0x1A, 0x97, 0x07, 0x74, 0x1A, 0xE4, 0x0F, 0x14, 0x15, 0xA4, 0x0E, + 0x41, 0x22, 0x2A, 0x09, 0xBE, 0x30, 0x89, 0xFD, 0xCC, 0x29, 0x38, 0x02, + 0xF1, 0x1F, 0xA7, 0x15, 0x81, 0x1C, 0x64, 0x1A, 0x2A, 0x1C, 0xC7, 0x18, + 0xAD, 0x28, 0x2D, 0x24, 0x7C, 0x33, 0x87, 0x23, 0xD2, 0x2B, 0x37, 0x16, + 0x76, 0x1F, 0x4D, 0x13, 0x08, 0x16, 0x09, 0x17, 0x47, 0x0B, 0x3A, 0x1A, + 0x81, 0x02, 0xFC, 0x1A, 0x55, 0xFE, 0xC6, 0x13, 0xE9, 0xFA, 0xF7, 0x07, + 0x7A, 0xE7, 0xEB, 0xFD, 0xB9, 0xDD, 0xF6, 0xFA, 0x7B, 0xF5, 0x84, 0xF4, + 0xE8, 0x02, 0x7A, 0xE5, 0x88, 0xF4, 0x2A, 0xE1, 0xF5, 0xDF, 0x6D, 0xE2, + 0x6E, 0xDB, 0x6F, 0xE7, 0xD0, 0xE2, 0x28, 0xF1, 0x6A, 0xE6, 0xA5, 0xF8, + 0x2B, 0xEF, 0xFB, 0xF0, 0x03, 0xF8, 0xF9, 0xE1, 0x6E, 0xFB, 0x2E, 0xE0, + 0x91, 0x02, 0x45, 0xE1, 0x4F, 0x01, 0x53, 0xDF, 0x8F, 0xF1, 0x38, 0xE2, + 0xAE, 0xEF, 0xF2, 0xF4, 0x30, 0x03, 0x20, 0x0F, 0x9C, 0xFE, 0xC6, 0x09, + 0xB5, 0xE5, 0xB2, 0xEA, 0x7A, 0xE6, 0xE8, 0xDD, 0x20, 0xE7, 0x8D, 0xE5, + 0x20, 0xE7, 0x83, 0xF7, 0x12, 0x03, 0x28, 0x16, 0x67, 0x0D, 0x14, 0x25, + 0x95, 0x0A, 0xE5, 0x25, 0x27, 0x1D, 0x0E, 0x2B, 0x49, 0x23, 0xFB, 0x21, + 0x1C, 0x20, 0x10, 0x20, 0x67, 0x0A, 0xD4, 0x0E, 0x33, 0xF6, 0xE8, 0xF6, + 0xC4, 0x16, 0x90, 0x0E, 0x88, 0x37, 0xCB, 0x23, 0x18, 0x23, 0xAB, 0x14, + 0xE6, 0xEE, 0xB7, 0xF1, 0x4D, 0xCD, 0x6A, 0xD0, 0x24, 0xCE, 0x57, 0xC4, + 0x40, 0xC0, 0x87, 0xB2, 0xC5, 0xB3, 0x95, 0xB0, 0x50, 0xCA, 0x49, 0xCB, + 0x9B, 0xC1, 0xAA, 0xBE, 0xE8, 0xA5, 0x06, 0xA5, 0x6A, 0xA0, 0x02, 0xA6, + 0x53, 0xA8, 0x84, 0xAC, 0x10, 0xAB, 0x5B, 0xA5, 0xE0, 0xAB, 0xAC, 0xA4, + 0x33, 0xB2, 0x26, 0xAB, 0xBF, 0xAD, 0x49, 0xA3, 0x27, 0xA8, 0x6C, 0xA9, + 0x63, 0xA0, 0x36, 0xAE, 0x24, 0xAD, 0x07, 0xBD, 0xA6, 0xC2, 0x65, 0xD9, + 0x0D, 0xAD, 0x58, 0xD0, 0xA7, 0xA1, 0x8E, 0xC1, 0x5F, 0xC2, 0x34, 0xCF, + 0xCA, 0xE4, 0xEC, 0xE6, 0x44, 0x00, 0x83, 0xFF, 0x69, 0x22, 0xB4, 0x23, + 0xB5, 0x41, 0xE1, 0x46, 0x46, 0x53, 0xC5, 0x54, 0x68, 0x56, 0x33, 0x54, + 0xB3, 0x52, 0x64, 0x4A, 0xEF, 0x4F, 0x44, 0x3C, 0x1D, 0x53, 0x13, 0x39, + 0x81, 0x5A, 0xB0, 0x44, 0x25, 0x5F, 0xBA, 0x4D, 0x3C, 0x57, 0x17, 0x45, + 0x4E, 0x4C, 0x89, 0x40, 0x76, 0x46, 0x4F, 0x3F, 0x46, 0x33, 0x58, 0x30, + 0x16, 0x22, 0xCD, 0x28, 0x81, 0x22, 0xF2, 0x2C, 0x78, 0x1A, 0x6F, 0x25, + 0xFE, 0xFD, 0x63, 0x07, 0xF0, 0xE9, 0x18, 0xF0, 0x0F, 0xFC, 0xEC, 0x03, + 0xFF, 0x13, 0xD9, 0x20, 0x05, 0x0E, 0x0D, 0x1A, 0x1F, 0xFD, 0xC2, 0x08, + 0x65, 0xEB, 0xF2, 0x06, 0xD0, 0xDA, 0xB6, 0xF7, 0x1A, 0xDA, 0x57, 0xD8, + 0xC8, 0xE5, 0x6E, 0xCA, 0xA5, 0xEE, 0x49, 0xD5, 0xD0, 0xF7, 0x79, 0xED, + 0x0A, 0x03, 0x2B, 0xFD, 0xF8, 0x05, 0xBA, 0xFA, 0xBB, 0x01, 0x58, 0xF0, + 0xB0, 0xFC, 0xA0, 0xE3, 0x16, 0xF8, 0x43, 0xDB, 0x32, 0xFC, 0x26, 0xDE, + 0x89, 0x03, 0x5E, 0xEA, 0x06, 0x05, 0x69, 0xF9, 0x31, 0x09, 0xE2, 0x0A, + 0x87, 0x05, 0x93, 0x08, 0x1C, 0x03, 0xC5, 0xF3, 0xA4, 0x11, 0xC1, 0xF8, + 0xEF, 0x0E, 0x0A, 0x06, 0xF4, 0x07, 0x61, 0x0A, 0x04, 0x19, 0xA4, 0x16, + 0x71, 0x1C, 0xD8, 0x1D, 0xD7, 0x03, 0x6A, 0x1A, 0x32, 0xF2, 0x21, 0x13, + 0xEB, 0xEC, 0x6B, 0x07, 0x69, 0xE1, 0xA2, 0xF0, 0xEB, 0xCD, 0x5E, 0xD0, + 0x54, 0xBD, 0xB5, 0xBA, 0x8E, 0xC3, 0x4E, 0xBC, 0x71, 0xD4, 0x77, 0xCD, + 0xBF, 0xCE, 0x31, 0xD5, 0xDE, 0xBB, 0xE6, 0xC7, 0x3C, 0xBB, 0xE8, 0xBE, + 0xBA, 0xC9, 0x1A, 0xC7, 0xA8, 0xD8, 0x1D, 0xD3, 0x17, 0xE6, 0xAF, 0xD6, + 0x83, 0xEA, 0xB2, 0xD3, 0x99, 0xF5, 0xC1, 0xE1, 0x9F, 0x10, 0x40, 0x00, + 0xE7, 0x11, 0xF6, 0x09, 0x06, 0xFF, 0x24, 0x00, 0xA5, 0x00, 0x39, 0x06, + 0x35, 0x03, 0xE5, 0x09, 0xE3, 0xF8, 0x6F, 0x01, 0xE6, 0xFE, 0xD2, 0x0E, + 0xC6, 0x0A, 0x73, 0x20, 0x88, 0xFE, 0x77, 0x19, 0x46, 0x07, 0x28, 0x1F, + 0x71, 0x36, 0x35, 0x44, 0x30, 0x41, 0x08, 0x4D, 0x3F, 0x21, 0xD2, 0x2F, + 0xEF, 0x14, 0xD0, 0x27, 0xD3, 0x2B, 0x89, 0x34, 0xF0, 0x39, 0xC6, 0x2E, + 0xBD, 0x2A, 0x9D, 0x1D, 0xBD, 0x18, 0x5B, 0x1A, 0x43, 0x1D, 0xEB, 0x21, + 0x97, 0x2C, 0x20, 0x24, 0xB6, 0x2D, 0x61, 0x21, 0xED, 0x21, 0x42, 0x17, + 0x4B, 0x15, 0x1C, 0x08, 0x20, 0x06, 0x45, 0xF7, 0xEE, 0xF7, 0x1D, 0xE5, + 0x95, 0xEE, 0x30, 0xD9, 0x6F, 0xDD, 0x8B, 0xD0, 0x6C, 0xDE, 0xE2, 0xD6, + 0x83, 0x03, 0xFF, 0xEF, 0x2C, 0x1F, 0xC0, 0x00, 0x8F, 0x22, 0x9F, 0x07, + 0x0A, 0x28, 0x45, 0x13, 0x3D, 0x31, 0x46, 0x23, 0x2D, 0x36, 0x09, 0x31, + 0x61, 0x35, 0x59, 0x3A, 0x70, 0x35, 0xAC, 0x47, 0x88, 0x30, 0x11, 0x4E, + 0xC2, 0x28, 0x25, 0x52, 0xA0, 0x2D, 0x96, 0x58, 0xC3, 0x2F, 0x50, 0x44, + 0x58, 0x1D, 0x0E, 0x24, 0x43, 0x0A, 0x8F, 0x13, 0x49, 0x0A, 0x58, 0x10, + 0x8A, 0x0D, 0xC9, 0x0C, 0xD4, 0xFD, 0x11, 0xFE, 0x01, 0xF0, 0xFC, 0xED, + 0x2C, 0xFA, 0xDE, 0xEE, 0x8E, 0xFD, 0xDA, 0xF7, 0x2E, 0xE4, 0xEF, 0xE2, + 0xCD, 0xCF, 0xEE, 0xBD, 0x1C, 0xD9, 0xB7, 0xBB, 0xFB, 0xE9, 0xB2, 0xD2, + 0xBF, 0xEA, 0xB5, 0xDC, 0x64, 0xE0, 0x72, 0xD4, 0x2A, 0xDB, 0x35, 0xCE, + 0x29, 0xDD, 0x85, 0xCE, 0xC1, 0xCE, 0x91, 0xBC, 0x3D, 0xAE, 0x0C, 0xA3, + 0x60, 0x9C, 0x37, 0x9D, 0x6E, 0xA8, 0x9D, 0xAB, 0xA0, 0xBF, 0x22, 0xC0, + 0xFC, 0xCC, 0x24, 0xD5, 0xA4, 0xC9, 0xE3, 0xE4, 0xBE, 0xBB, 0x39, 0xE5, + 0x52, 0xC3, 0xEB, 0xE7, 0x94, 0xE6, 0x0D, 0xF5, 0xF5, 0xFF, 0x6F, 0x03, + 0xB4, 0x0D, 0x90, 0x10, 0xC8, 0x23, 0x6B, 0x21, 0x7F, 0x3C, 0xE7, 0x3B, + 0xBA, 0x45, 0x54, 0x49, 0x6F, 0x32, 0xDE, 0x38, 0x52, 0x26, 0x46, 0x28, + 0x90, 0x32, 0xA1, 0x27, 0x97, 0x28, 0xE7, 0x11, 0x39, 0x06, 0x09, 0xEE, + 0x29, 0xF1, 0x27, 0xE7, 0x89, 0xEB, 0x7F, 0xED, 0x80, 0xE7, 0xA1, 0xE6, + 0xF0, 0xEB, 0x2D, 0xE1, 0x32, 0xF0, 0x21, 0xE7, 0x8D, 0xE6, 0x6D, 0xE2, + 0xD0, 0xE7, 0x66, 0xDE, 0x9E, 0xF8, 0xA9, 0xEF, 0x52, 0xFA, 0x16, 0xFB, + 0xF3, 0xF7, 0x92, 0xFD, 0x0E, 0xF8, 0x85, 0x04, 0xB5, 0xF0, 0x8C, 0x0F, + 0x7A, 0xF4, 0x2B, 0x14, 0xF6, 0xFE, 0x1C, 0x0D, 0xAF, 0x03, 0x30, 0x09, + 0x25, 0x0E, 0xF6, 0x0D, 0x5E, 0x1E, 0x4A, 0x1A, 0x4E, 0x27, 0xF3, 0x30, + 0x95, 0x2A, 0x39, 0x46, 0x9E, 0x2D, 0x59, 0x49, 0x3C, 0x3C, 0xC5, 0x49, + 0x1A, 0x51, 0x9A, 0x57, 0x0C, 0x4E, 0xEF, 0x58, 0xC5, 0x48, 0x3A, 0x47, + 0x6C, 0x52, 0x82, 0x3D, 0xB3, 0x52, 0x5A, 0x3F, 0xBC, 0x4F, 0xE4, 0x44, + 0xB3, 0x3D, 0xAD, 0x3E, 0xE8, 0x22, 0xDA, 0x2A, 0x0E, 0x21, 0x54, 0x1D, + 0xFF, 0x1D, 0x83, 0x0D, 0x29, 0x0A, 0x8A, 0x02, 0x9F, 0x02, 0x86, 0x10, + 0x6F, 0x04, 0x1A, 0x18, 0x07, 0x05, 0x2E, 0x13, 0xCF, 0x0D, 0xE4, 0x1B, + 0xEF, 0x0D, 0x1C, 0x1C, 0x85, 0xFC, 0x68, 0x0A, 0x96, 0xF4, 0x3A, 0x03, + 0x64, 0xFD, 0xA7, 0x02, 0xF0, 0x06, 0xBD, 0xF9, 0x65, 0x04, 0xD9, 0xF3, + 0x1A, 0xFB, 0x0C, 0xF4, 0xEC, 0xFC, 0xC6, 0xED, 0xF7, 0xFB, 0x28, 0xE5, + 0xDA, 0xEE, 0xF4, 0xDB, 0xB1, 0xDD, 0xA1, 0xC7, 0xCB, 0xD5, 0x4B, 0xBB, + 0xF1, 0xD8, 0xCE, 0xBF, 0x50, 0xD6, 0x57, 0xBF, 0xE8, 0xD2, 0x32, 0xBE, + 0xB7, 0xD7, 0x5C, 0xC3, 0xFE, 0xCE, 0x7F, 0xC0, 0x34, 0xB6, 0x9C, 0xB1, + 0xC0, 0xB5, 0x69, 0xA9, 0xD5, 0xC4, 0xD8, 0xB5, 0x24, 0xD3, 0x35, 0xCD, + 0x82, 0xE6, 0xA4, 0xDC, 0x4B, 0xED, 0xFA, 0xE4, 0x09, 0xE9, 0xDE, 0xE7, + 0xB2, 0xED, 0x98, 0xF2, 0x4B, 0xF5, 0x6A, 0x0A, 0xDF, 0xE6, 0x35, 0x0D, + 0xE3, 0xD2, 0xC2, 0xF7, 0x73, 0xCF, 0x31, 0xEA, 0x1A, 0xD4, 0xC1, 0xE8, + 0x32, 0xDB, 0xF1, 0xE2, 0x1C, 0xDE, 0xF2, 0xE3, 0xD6, 0xD5, 0x1E, 0xDD, + 0x2E, 0xCE, 0x26, 0xC9, 0xBE, 0xD3, 0xF0, 0xC5, 0x5F, 0xE9, 0xE7, 0xD5, + 0x46, 0xFF, 0x78, 0xEA, 0xD7, 0xF7, 0xC5, 0xEF, 0x64, 0xEF, 0x0D, 0xE6, + 0xEB, 0xFD, 0x70, 0xE1, 0x6B, 0x01, 0x3D, 0xE9, 0x50, 0xFD, 0x9C, 0xFE, + 0x37, 0x11, 0xE1, 0x1B, 0x46, 0x28, 0x5E, 0x27, 0x97, 0x17, 0xE9, 0x1D, + 0x04, 0xFA, 0x01, 0x10, 0xCA, 0xF0, 0x60, 0x04, 0xAB, 0xED, 0x06, 0x0F, + 0x7B, 0xF6, 0x56, 0x22, 0xED, 0x0A, 0x1D, 0x29, 0xC3, 0x1F, 0xA4, 0x39, + 0x33, 0x25, 0xA0, 0x3E, 0xDA, 0x1D, 0x23, 0x36, 0x11, 0x21, 0x42, 0x3E, + 0xCF, 0x2E, 0xAD, 0x53, 0xD8, 0x3C, 0xB5, 0x5E, 0x01, 0x43, 0x41, 0x4C, + 0xAA, 0x46, 0x51, 0x48, 0x6F, 0x3F, 0x79, 0x4F, 0x02, 0x37, 0x5E, 0x44, + 0x99, 0x3F, 0x03, 0x4C, 0xF7, 0x41, 0xF3, 0x4F, 0x53, 0x39, 0x1E, 0x32, + 0xF1, 0x2B, 0x36, 0x0C, 0x05, 0x13, 0x2F, 0xEF, 0x19, 0xF3, 0xB8, 0xDA, + 0x0D, 0xD8, 0xAA, 0xC6, 0x74, 0xCC, 0xF1, 0xBC, 0x1C, 0xD4, 0x95, 0xC4, + 0x88, 0xEE, 0xB0, 0xD0, 0x51, 0x09, 0x96, 0xDD, 0x56, 0x14, 0xAB, 0xE9, + 0x3F, 0x1F, 0x7E, 0x00, 0xB4, 0x27, 0x4A, 0x1C, 0x50, 0x1D, 0xF4, 0x14, + 0x28, 0x0E, 0xCA, 0x0A, 0x8E, 0xFD, 0x3A, 0x09, 0x36, 0xFA, 0x78, 0x05, + 0xC4, 0x15, 0x30, 0x20, 0x78, 0x1C, 0x5A, 0x24, 0xFB, 0x04, 0x27, 0x01, + 0x35, 0xFF, 0xC4, 0xF5, 0x16, 0xFE, 0x3C, 0x04, 0x74, 0xF9, 0xB9, 0x0D, + 0x62, 0x09, 0xA5, 0x0C, 0xC1, 0x15, 0x23, 0x12, 0xE0, 0x06, 0xE5, 0x16, + 0x40, 0xFA, 0x32, 0x0B, 0x02, 0xF7, 0xBD, 0xFA, 0x3F, 0xED, 0x8A, 0xEC, + 0xED, 0xF1, 0x14, 0xED, 0x84, 0xEF, 0xA4, 0xF4, 0x3D, 0xE2, 0xF5, 0xEF, + 0x83, 0xE4, 0xFF, 0xE1, 0xA2, 0xE3, 0x9D, 0xD3, 0xEA, 0xF5, 0xA5, 0xD6, + 0x43, 0x06, 0x73, 0xE2, 0xC5, 0xEB, 0x38, 0xE1, 0x56, 0xDF, 0x62, 0xE0, + 0x01, 0xEB, 0x3C, 0xE6, 0x3A, 0xD8, 0xB5, 0xE2, 0xB4, 0xB8, 0x68, 0xD0, + 0x82, 0xAA, 0x32, 0xBE, 0x19, 0xA1, 0xAA, 0xB1, 0x99, 0xA5, 0x32, 0xAC, + 0x93, 0xBD, 0x1A, 0xBB, 0x6F, 0xD2, 0x3B, 0xD7, 0x3D, 0xE5, 0xB5, 0xFA, + 0xC9, 0x07, 0x90, 0x23, 0xD4, 0x1B, 0x8A, 0x28, 0xDC, 0x0C, 0x60, 0x07, + 0x90, 0x04, 0xE1, 0xF3, 0x86, 0x13, 0x2C, 0xF6, 0xA5, 0x1E, 0xDE, 0xFA, + 0xA2, 0x1A, 0x0C, 0xFD, 0xE0, 0x13, 0x5E, 0x00, 0x1D, 0x08, 0x9A, 0x06, + 0xBE, 0xF1, 0x09, 0x08, 0x3C, 0xF3, 0x31, 0x03, 0x8C, 0x0F, 0xDE, 0xFE, + 0xCD, 0x13, 0xBA, 0xFF, 0xA4, 0x08, 0xAA, 0x02, 0x90, 0x0B, 0x48, 0xFA, + 0x50, 0x02, 0x69, 0xEB, 0x5B, 0xF5, 0x7C, 0xE9, 0x76, 0x09, 0x8C, 0xFD, + 0x55, 0x1C, 0xCE, 0x09, 0x4A, 0x0B, 0x7B, 0xF7, 0x32, 0xFB, 0xD7, 0xF3, + 0x92, 0xFA, 0x52, 0x03, 0x68, 0xFA, 0x58, 0x0B, 0x52, 0xF8, 0x0E, 0x14, + 0x03, 0xF6, 0xB5, 0x0B, 0xA3, 0xF1, 0x9E, 0xF6, 0x13, 0xF6, 0x7E, 0xF0, + 0x6F, 0x0F, 0x44, 0xFE, 0x06, 0x2A, 0xF6, 0x1B, 0x34, 0x38, 0x2E, 0x27, + 0xDB, 0x33, 0x12, 0x23, 0xE8, 0x29, 0x6D, 0x25, 0x33, 0x2E, 0x36, 0x24, + 0x2F, 0x2A, 0x52, 0x2E, 0xE1, 0x27, 0x8E, 0x45, 0x0B, 0x36, 0xD5, 0x53, + 0x16, 0x2E, 0x91, 0x4F, 0xC6, 0x21, 0xA1, 0x43, 0x41, 0x37, 0x57, 0x48, + 0x66, 0x3A, 0xC5, 0x42, 0xCA, 0x0B, 0x12, 0x20, 0x06, 0xE4, 0x2D, 0x0B, + 0x1D, 0xE6, 0x40, 0x02, 0xDE, 0xFD, 0x25, 0xFC, 0xDF, 0xFF, 0x75, 0xFE, + 0xC1, 0xF0, 0xBA, 0x00, 0xB6, 0x00, 0xE3, 0x16, 0x8F, 0x21, 0x7F, 0x2C, + 0xD3, 0x24, 0xB4, 0x1A, 0xCD, 0x18, 0x8A, 0x02, 0x9E, 0x0E, 0xC1, 0x00, + 0x9D, 0xFC, 0xF4, 0x08, 0xEC, 0xFE, 0x2D, 0x0E, 0x8A, 0x17, 0x5B, 0x0C, + 0xCB, 0x0B, 0xD7, 0xF8, 0xD4, 0xF4, 0xB7, 0xEB, 0xB0, 0x03, 0xB5, 0xFD, + 0x5C, 0x05, 0x1B, 0x06, 0xD8, 0xDF, 0xC7, 0xE3, 0xA5, 0xBD, 0xC0, 0xB7, + 0xD6, 0xC2, 0x34, 0xB0, 0x04, 0xE0, 0xFB, 0xC1, 0x12, 0xE2, 0x32, 0xBB, + 0xBA, 0xCA, 0x22, 0xAD, 0x4A, 0xC8, 0x88, 0xC8, 0x50, 0xCC, 0x5D, 0xCD, + 0xB9, 0xC5, 0xF7, 0xAB, 0x5C, 0xE2, 0x91, 0xC4, 0xCE, 0xFD, 0x6A, 0xE7, + 0x92, 0xEA, 0x2E, 0xEA, 0xC0, 0xF4, 0x8D, 0x0B, 0x77, 0x1D, 0x77, 0x24, + 0x96, 0x13, 0xB0, 0x02, 0x58, 0x03, 0xEA, 0xDF, 0x0E, 0x19, 0xA7, 0xED, + 0x07, 0x11, 0x89, 0xF9, 0x2F, 0xF7, 0x2D, 0xEE, 0xEB, 0xF5, 0x00, 0xF6, + 0x56, 0xE6, 0xC8, 0xF6, 0x34, 0xE1, 0x1C, 0xF6, 0x77, 0xEF, 0x76, 0x04, + 0x05, 0xEB, 0x07, 0x00, 0xC2, 0xF8, 0x55, 0xFE, 0x72, 0xFE, 0x6B, 0xF2, + 0x8F, 0xEF, 0xFC, 0xE4, 0xE4, 0xEC, 0x7D, 0xEC, 0x76, 0xE1, 0x59, 0xE8, + 0xDE, 0xE6, 0x84, 0xE8, 0xBF, 0xFA, 0x4F, 0xEE, 0x8E, 0xF4, 0xCD, 0xE4, + 0x3F, 0xE6, 0xF6, 0xD1, 0x44, 0xE0, 0x14, 0xC5, 0xD4, 0xD1, 0x2C, 0xC5, + 0x27, 0xBF, 0x39, 0xCE, 0x7E, 0xC5, 0x75, 0xD6, 0x94, 0xDD, 0x73, 0xDF, + 0xBC, 0xDF, 0x0A, 0xE8, 0x1F, 0xDA, 0xC0, 0xE8, 0x04, 0xE5, 0x70, 0xEE, + 0x2F, 0xF0, 0x0F, 0xFE, 0x4A, 0x04, 0xED, 0x0C, 0xB6, 0x08, 0xAF, 0x0A, + 0x2C, 0xFF, 0x3D, 0x0B, 0x44, 0x13, 0xC7, 0x19, 0x2A, 0x30, 0x68, 0x29, + 0x7C, 0x3F, 0xC5, 0x43, 0xF2, 0x47, 0xC4, 0x50, 0xD4, 0x43, 0xEC, 0x37, + 0xF7, 0x3C, 0xF8, 0x28, 0x85, 0x3F, 0xB6, 0x32, 0x96, 0x2D, 0x66, 0x28, + 0xA3, 0x0F, 0x19, 0x13, 0x01, 0x15, 0x15, 0x0A, 0xF7, 0x1C, 0x12, 0x01, + 0x5E, 0x16, 0x3D, 0xF7, 0x04, 0x1C, 0x5C, 0xE9, 0xF7, 0x1A, 0xBD, 0xE3, + 0x62, 0x18, 0x06, 0xF1, 0xC2, 0x1E, 0x84, 0xF8, 0xD9, 0x0D, 0xAE, 0xFA, + 0x69, 0xF0, 0x21, 0x05, 0x8B, 0xD7, 0xCB, 0xFC, 0xE6, 0xCA, 0x1F, 0xF3, + 0x9E, 0xE2, 0x9A, 0x06, 0xE9, 0xE7, 0x69, 0xF7, 0xE8, 0xAF, 0xE0, 0xBA, + 0x91, 0xB4, 0x81, 0xCC, 0xBC, 0xF2, 0x2F, 0x0C, 0x17, 0xE3, 0xAF, 0xF8, + 0xD9, 0xD2, 0xC1, 0xE9, 0xB3, 0xF1, 0x4A, 0x0D, 0x9B, 0xFB, 0x01, 0x1A, + 0xDB, 0xF5, 0xD4, 0x0B, 0x59, 0x0B, 0x7F, 0x0B, 0xBB, 0x34, 0xE7, 0x29, + 0x59, 0x3E, 0x3C, 0x3D, 0xA3, 0x36, 0xDE, 0x2D, 0x86, 0x3C, 0x6F, 0x25, + 0x11, 0x3B, 0x41, 0x27, 0xCD, 0x1D, 0x23, 0x0A, 0x75, 0x12, 0xED, 0x0B, + 0x56, 0x33, 0xCA, 0x40, 0x3F, 0x29, 0x9D, 0x3A, 0x30, 0xF6, 0xFB, 0x0D, + 0x01, 0xEC, 0x87, 0x01, 0x86, 0xE5, 0x73, 0xEF, 0x26, 0xDA, 0x80, 0xE3, + 0x46, 0xDE, 0x6C, 0xE7, 0x44, 0xD3, 0x5F, 0xDF, 0xD0, 0xC8, 0x09, 0xE4, + 0xC8, 0xD9, 0x23, 0xFA, 0x19, 0xED, 0xE9, 0xFF, 0x39, 0xFB, 0x8F, 0x07, + 0x2D, 0x07, 0x18, 0x17, 0xC1, 0xFF, 0x48, 0x13, 0xC2, 0x05, 0x2B, 0x19, + 0x57, 0x1C, 0xA3, 0x1F, 0xE7, 0x1B, 0x88, 0x0B, 0x66, 0x1B, 0x48, 0xFD, + 0x52, 0x23, 0x41, 0xFA, 0x80, 0x16, 0xC6, 0xEC, 0xBD, 0x0D, 0xE1, 0xE1, + 0xA0, 0x0E, 0x13, 0xE5, 0x1C, 0x05, 0xA4, 0xF7, 0xA9, 0x05, 0x51, 0x0F, + 0x06, 0x0B, 0x09, 0x10, 0xC1, 0xFE, 0x15, 0x01, 0x06, 0xFA, 0x0C, 0xF9, + 0x20, 0x04, 0x54, 0xF4, 0xBB, 0x03, 0x64, 0xF6, 0xBC, 0x03, 0x54, 0x01, + 0x08, 0x05, 0xBF, 0x0A, 0x87, 0xFE, 0x2C, 0x1A, 0x36, 0x06, 0x12, 0x26, + 0xBF, 0x0E, 0x7A, 0x17, 0x72, 0x0C, 0xF4, 0x07, 0xA9, 0x06, 0x73, 0x00, + 0x58, 0xF1, 0x27, 0xE9, 0xBC, 0xE5, 0xB1, 0xE3, 0x06, 0xF8, 0xB1, 0xFC, + 0x76, 0x03, 0x0A, 0xFB, 0x6C, 0xFC, 0x55, 0xF5, 0x4F, 0xFA, 0x7F, 0x08, + 0xBB, 0xF0, 0x25, 0xF4, 0xE7, 0xE6, 0x03, 0xDD, 0x14, 0xE6, 0xB7, 0xE6, + 0xF4, 0xE2, 0x99, 0xE8, 0x30, 0xF6, 0x60, 0xF9, 0xB6, 0x06, 0x24, 0xFB, + 0x12, 0x03, 0x21, 0xE6, 0x78, 0x0D, 0x5C, 0xF6, 0x51, 0x0F, 0xB2, 0xFF, + 0x5F, 0x0B, 0xB2, 0xFE, 0xDD, 0x10, 0x21, 0x12, 0xD6, 0xFE, 0xDC, 0xFD, + 0xDD, 0xE3, 0x2C, 0xD8, 0x67, 0xFB, 0xDF, 0xF9, 0x0B, 0x2A, 0xC8, 0x34, + 0x03, 0x18, 0x7A, 0x2C, 0x7A, 0xF9, 0xEB, 0x13, 0xB1, 0x0F, 0x30, 0x22, + 0x50, 0x22, 0xDA, 0x2D, 0xEA, 0x22, 0x85, 0x29, 0xEC, 0x2E, 0x63, 0x2E, + 0x3B, 0x33, 0x32, 0x4A, 0x0F, 0x1D, 0xDB, 0x57, 0x51, 0x17, 0xD1, 0x47, + 0x9B, 0x31, 0x5C, 0x45, 0xE3, 0x29, 0x27, 0x3E, 0xCE, 0x03, 0x2E, 0x15, + 0xDC, 0xFE, 0xD2, 0xFC, 0x00, 0x10, 0x58, 0x10, 0x42, 0x0A, 0x41, 0x0C, + 0x16, 0x07, 0x36, 0xFF, 0x9B, 0x11, 0x79, 0x1A, 0x4F, 0x0A, 0x9A, 0x1A, + 0x87, 0xFF, 0x42, 0xF2, 0xA0, 0xFF, 0xB3, 0xE3, 0xE1, 0xF3, 0xD9, 0xDE, + 0x47, 0xF4, 0x2A, 0xD3, 0x55, 0x14, 0x15, 0xEC, 0xEE, 0x1A, 0xBF, 0xF9, + 0x6E, 0x07, 0xD6, 0xDC, 0x38, 0xFD, 0x5A, 0xD7, 0xD1, 0xEB, 0xE2, 0xDA, + 0xD9, 0xE2, 0xE8, 0xD5, 0x3A, 0xE3, 0x1B, 0xDB, 0x98, 0xCB, 0x4D, 0xDA, + 0xE5, 0xB7, 0xC5, 0xDA, 0xD9, 0xBA, 0x13, 0xDA, 0x65, 0xB7, 0x57, 0xCB, + 0x63, 0xB5, 0x31, 0xC0, 0xA3, 0xC3, 0xBB, 0xC7, 0xDA, 0xBC, 0x4D, 0xCD, + 0x6C, 0xAD, 0xEA, 0xC9, 0xBF, 0xBF, 0x68, 0xD0, 0xA4, 0xCE, 0x58, 0xD5, + 0x24, 0xD5, 0x42, 0xE2, 0x77, 0xEB, 0xAA, 0xF2, 0xFD, 0xFE, 0x80, 0xF6, + 0xDE, 0xFF, 0x8E, 0x01, 0xB5, 0xF0, 0x63, 0x00, 0xC4, 0xEB, 0x23, 0xF5, + 0x0A, 0xF8, 0x38, 0xF7, 0xD1, 0x03, 0xE5, 0xF3, 0x3F, 0x0A, 0xAB, 0xEB, + 0x4B, 0x10, 0xD8, 0xED, 0x0A, 0x0F, 0x51, 0xF6, 0xE3, 0x08, 0xC7, 0x02, + 0x07, 0x11, 0xA8, 0x16, 0x08, 0x01, 0xFD, 0x13, 0xC7, 0xD5, 0x36, 0xEF, + 0x4B, 0xD6, 0xC6, 0xE9, 0xF6, 0xEC, 0x80, 0xFC, 0xEB, 0xF0, 0x1D, 0xFA, + 0xBF, 0xF3, 0xF3, 0x06, 0x38, 0xFB, 0xF2, 0x24, 0xC9, 0x05, 0x2D, 0x2B, + 0x05, 0x16, 0x42, 0x27, 0x58, 0x23, 0xD2, 0x1E, 0x59, 0x33, 0xDE, 0x1D, + 0xDD, 0x31, 0x48, 0x21, 0x33, 0x2E, 0x92, 0x27, 0xDD, 0x41, 0xFE, 0x3C, + 0x1C, 0x25, 0x23, 0x1F, 0x12, 0x04, 0xBE, 0xF8, 0x42, 0x23, 0xA7, 0x10, + 0xFA, 0x2F, 0x52, 0x11, 0x87, 0x0B, 0x15, 0xEB, 0xD1, 0xFB, 0xBD, 0xEB, + 0x72, 0x08, 0x8E, 0x01, 0xA8, 0x0C, 0xF3, 0x01, 0x98, 0x09, 0xA7, 0xF9, + 0x31, 0x0E, 0x19, 0xFF, 0x28, 0x0E, 0xDE, 0x08, 0xB8, 0x01, 0x16, 0x04, + 0x92, 0x06, 0x79, 0x01, 0x85, 0x1E, 0x85, 0x09, 0xBF, 0x19, 0x9B, 0xFE, + 0x53, 0xFF, 0xD1, 0xEC, 0xB1, 0x07, 0x96, 0xF8, 0xCC, 0x0A, 0x1D, 0x0B, + 0x90, 0xE6, 0xA8, 0x03, 0xA5, 0xE5, 0x0E, 0xFD, 0x37, 0xFB, 0x60, 0x07, + 0x49, 0xE4, 0xCA, 0xEF, 0x50, 0xE6, 0x72, 0xE1, 0xF6, 0x0C, 0x11, 0xFE, + 0x92, 0x07, 0xA2, 0xFF, 0xBC, 0xF7, 0xA9, 0xFF, 0x0D, 0x05, 0x46, 0x1C, + 0x8A, 0x07, 0x80, 0x2C, 0x61, 0x09, 0xD1, 0x2A, 0x0D, 0x18, 0x54, 0x2A, + 0x36, 0x27, 0xE9, 0x33, 0x02, 0x3A, 0x10, 0x40, 0x81, 0x34, 0x3E, 0x41, + 0xFD, 0x21, 0x93, 0x3B, 0x4B, 0x1C, 0x21, 0x38, 0x4D, 0x04, 0x7F, 0x2C, + 0xCC, 0xEE, 0x9C, 0x18, 0xAB, 0xFE, 0xCA, 0x08, 0x6C, 0xFD, 0x00, 0xF8, + 0x3C, 0xE7, 0x65, 0xF1, 0x4B, 0xEC, 0x87, 0xF8, 0xDF, 0xF9, 0x78, 0x00, + 0xB4, 0x02, 0xF0, 0x0B, 0x8D, 0xFF, 0x0D, 0x07, 0xF4, 0xFA, 0x5B, 0xFA, + 0xAA, 0x0B, 0x19, 0xFD, 0xF9, 0x1B, 0x7C, 0xF9, 0xD5, 0x23, 0xC6, 0xEF, + 0x04, 0x29, 0x67, 0xF5, 0xDA, 0x26, 0xF7, 0x0B, 0x87, 0x19, 0x24, 0x0F, + 0x1C, 0x0C, 0xC0, 0xF3, 0x4B, 0x08, 0x6D, 0xEB, 0x74, 0x08, 0xC7, 0xF2, + 0x13, 0x08, 0x7F, 0xED, 0x87, 0x07, 0x58, 0xEE, 0x92, 0xFD, 0x42, 0xF8, + 0x7C, 0xF2, 0x33, 0xF3, 0x7B, 0xFD, 0xFD, 0xE7, 0x3D, 0x09, 0x9D, 0xF1, + 0x37, 0xFF, 0xD8, 0xF4, 0x26, 0xF3, 0x1F, 0xF0, 0x1E, 0xF0, 0x29, 0x08, + 0xA5, 0xEA, 0xFD, 0x13, 0x8E, 0xDF, 0xD5, 0xFA, 0x09, 0xEB, 0x7E, 0xF9, + 0xD1, 0xFE, 0x06, 0xFE, 0x29, 0xFB, 0x35, 0xEE, 0xDA, 0x04, 0xE4, 0x04, + 0x7B, 0x0B, 0x14, 0x14, 0x08, 0xF1, 0x72, 0xF7, 0xEC, 0xF8, 0xF3, 0x01, + 0xCD, 0x0E, 0x53, 0x18, 0x99, 0xED, 0x81, 0xF9, 0x32, 0xE7, 0xFE, 0xED, + 0xBE, 0x12, 0xE1, 0x01, 0x93, 0x25, 0x55, 0x07, 0xB6, 0x0C, 0x53, 0x06, + 0x7F, 0xEB, 0xC3, 0xFF, 0x8F, 0xEA, 0x00, 0xF6, 0x92, 0xEC, 0x0D, 0xE3, + 0x5E, 0xE6, 0x43, 0xD8, 0xB6, 0xF8, 0x60, 0xE7, 0xD6, 0x01, 0x7F, 0xF1, + 0xC2, 0xE6, 0x10, 0xDF, 0x5A, 0xDB, 0x83, 0xDE, 0x40, 0xE4, 0x70, 0xFE, + 0x89, 0xDB, 0xF1, 0xFD, 0x1A, 0xD0, 0x9C, 0xE8, 0x61, 0xDC, 0x7F, 0xE7, + 0x2D, 0xCE, 0xAB, 0xDE, 0x5C, 0xAC, 0xC4, 0xDB, 0x80, 0xB4, 0xFA, 0xDA, + 0x06, 0xCD, 0x79, 0xCE, 0x04, 0xD9, 0xF4, 0xD6, 0xC7, 0xD9, 0x46, 0xE1, + 0xCA, 0xDB, 0x45, 0xE0, 0x9A, 0xE5, 0x10, 0xEE, 0xB4, 0xE6, 0x59, 0xED, + 0x22, 0xED, 0xF3, 0xDF, 0x03, 0x08, 0x9A, 0xF2, 0x91, 0x19, 0xED, 0x01, + 0x1E, 0x15, 0xE3, 0xF9, 0xD2, 0x1F, 0x8C, 0x00, 0x54, 0x35, 0x14, 0x18, + 0x17, 0x27, 0x62, 0x18, 0x04, 0x0F, 0xC8, 0x09, 0xAF, 0x0A, 0x1D, 0xFC, + 0x29, 0x0D, 0x25, 0xEF, 0x12, 0x0A, 0x83, 0xED, 0x7D, 0x0A, 0xAD, 0xF3, + 0x17, 0x0E, 0x5A, 0x02, 0x6F, 0xFC, 0x58, 0x0B, 0x74, 0xEC, 0xDA, 0x0A, + 0xE5, 0xF4, 0xB9, 0x0F, 0xBA, 0xFA, 0xB7, 0x08, 0xA0, 0xF7, 0x5A, 0xF4, + 0x3A, 0xFF, 0xD3, 0xF2, 0x9F, 0x0F, 0x90, 0x0A, 0xE0, 0x01, 0x84, 0x13, + 0x83, 0xF3, 0x48, 0x12, 0x76, 0x09, 0x1C, 0x16, 0x86, 0x0A, 0x7B, 0x12, + 0xB6, 0xF4, 0xD3, 0x06, 0xDD, 0xE9, 0x4E, 0xF0, 0x1E, 0xE7, 0x7C, 0xEC, + 0xFC, 0xED, 0x49, 0xF5, 0x0F, 0x05, 0x9A, 0xFE, 0x64, 0x1D, 0x9B, 0x13, + 0x0F, 0x05, 0x6C, 0x0C, 0x35, 0xEE, 0x3A, 0xFC, 0x11, 0x14, 0x91, 0x01, + 0xEA, 0x2A, 0x72, 0x01, 0xDF, 0x1D, 0x9F, 0x0D, 0xBF, 0x25, 0x6A, 0x23, + 0x53, 0x28, 0x2A, 0x1E, 0xC9, 0x12, 0x67, 0x12, 0x28, 0x14, 0xEA, 0x0F, + 0xFF, 0x19, 0x8C, 0x08, 0x1D, 0xF7, 0x40, 0xF8, 0xDC, 0xF0, 0x15, 0x04, + 0x22, 0x0F, 0xCB, 0x1E, 0xE3, 0xF1, 0xA7, 0x0A, 0xBF, 0xCC, 0x08, 0xF4, + 0x82, 0xE5, 0x54, 0xFC, 0x45, 0x0A, 0x05, 0x0F, 0xB1, 0x07, 0xA9, 0x14, + 0x2A, 0xF9, 0x4F, 0x0C, 0x74, 0xF9, 0xD4, 0x0F, 0x13, 0xED, 0x0E, 0x02, + 0xC1, 0xF7, 0x9C, 0xF0, 0xF1, 0x16, 0x55, 0xFE, 0x06, 0x0F, 0xC3, 0xFD, + 0x99, 0xFA, 0xD0, 0xEC, 0xAA, 0xFC, 0x71, 0xEF, 0x73, 0x0E, 0x6E, 0xF9, + 0xA2, 0x10, 0xCF, 0xFE, 0x00, 0x09, 0xC4, 0x0C, 0xA4, 0x10, 0x6F, 0x1A, + 0x17, 0x1E, 0xA5, 0x0C, 0xF6, 0x26, 0x59, 0x01, 0xE3, 0x1A, 0x9C, 0x09, + 0x09, 0x02, 0xCC, 0xFF, 0xC8, 0x00, 0x03, 0xF7, 0xFA, 0x09, 0x5A, 0x02, + 0xE6, 0x05, 0x35, 0x04, 0xBC, 0xFB, 0x11, 0xEE, 0xE8, 0xE9, 0xA0, 0xDA, + 0xED, 0xDE, 0xC7, 0xDD, 0xBD, 0xE5, 0x53, 0xE0, 0xF9, 0xE0, 0x65, 0xE5, + 0x20, 0xD4, 0x75, 0xF2, 0x37, 0xDB, 0x59, 0xEC, 0xB2, 0xE9, 0x6E, 0xDD, + 0x85, 0xDB, 0x85, 0xCE, 0x79, 0xC3, 0x23, 0xC4, 0x2A, 0xBE, 0x73, 0xC6, + 0xA7, 0xC5, 0x22, 0xD1, 0x97, 0xD4, 0xFD, 0xDC, 0xCD, 0xDB, 0x85, 0xD1, + 0xB5, 0xDA, 0x0F, 0xC2, 0xBD, 0xCF, 0x11, 0xC1, 0xD5, 0xCA, 0x26, 0xC3, + 0x57, 0xD8, 0x27, 0xC9, 0x2F, 0xD7, 0x68, 0xC7, 0x25, 0xD5, 0x96, 0xCF, + 0xC6, 0xEC, 0xE3, 0xE1, 0x3B, 0x04, 0x86, 0xEB, 0x68, 0x0B, 0x26, 0xF7, + 0x76, 0x0D, 0x37, 0x05, 0xBE, 0x0D, 0x26, 0x13, 0xC9, 0x0E, 0x42, 0x1C, + 0xA1, 0x28, 0xFF, 0x28, 0xAA, 0x37, 0x66, 0x2C, 0x97, 0x2A, 0x0C, 0x24, + 0x65, 0x38, 0x6D, 0x3E, 0xC5, 0x4B, 0xB4, 0x5D, 0xA7, 0x41, 0xC7, 0x4E, + 0xB7, 0x2E, 0xA0, 0x46, 0x3B, 0x22, 0x02, 0x59, 0x06, 0x24, 0x69, 0x58, + 0x82, 0x26, 0x18, 0x43, 0xBA, 0x1F, 0xAD, 0x33, 0x24, 0x24, 0x57, 0x41, + 0x21, 0x25, 0xE4, 0x46, 0x5A, 0x2B, 0x2C, 0x42, 0x94, 0x3E, 0xDB, 0x54, + 0x63, 0x27, 0xD4, 0x42, 0xAF, 0x09, 0xB3, 0x1C, 0x2A, 0x20, 0xE1, 0x2B, + 0x93, 0x35, 0xB8, 0x2C, 0xB0, 0x27, 0xA4, 0xFB, 0x9E, 0x1F, 0x3E, 0xFC, + 0xC7, 0x21, 0x4A, 0x24, 0x07, 0x12, 0x27, 0x1A, 0xEC, 0x08, 0x9D, 0x02, + 0x3B, 0x0A, 0x34, 0x03, 0x7F, 0x0B, 0x73, 0xF4, 0xB7, 0x1A, 0xFE, 0xE7, + 0x99, 0x1B, 0xED, 0xF4, 0x0C, 0x16, 0x2A, 0xFB, 0x37, 0x13, 0xCA, 0xF1, + 0x6F, 0xF7, 0x96, 0xE4, 0x23, 0xEC, 0xE9, 0xE5, 0x5B, 0x00, 0x9B, 0xF7, + 0x6E, 0xF5, 0x80, 0xEB, 0x5B, 0xD6, 0xD7, 0xD0, 0x7A, 0xD2, 0xD9, 0xD9, + 0x36, 0xD6, 0x97, 0xE1, 0xF6, 0xD5, 0xB9, 0xD8, 0x6A, 0xD8, 0x19, 0xDD, + 0x29, 0xE1, 0x3F, 0xE8, 0x19, 0xED, 0xD2, 0xE9, 0xD2, 0xEE, 0x0C, 0xED, + 0x9E, 0xE7, 0xC7, 0xEF, 0xEF, 0xE8, 0x1C, 0xE8, 0x53, 0xEF, 0x4E, 0xE6, + 0x87, 0xF0, 0x37, 0xF0, 0x0E, 0x05, 0x39, 0xFD, 0x5F, 0x1A, 0xD9, 0xFA, + 0x67, 0x0F, 0xD4, 0xF3, 0x71, 0x06, 0xA9, 0x07, 0xD0, 0xFF, 0x4D, 0x11, + 0x3A, 0xF8, 0x2D, 0xFE, 0x1B, 0xFC, 0xC7, 0xF9, 0x80, 0xFE, 0x4F, 0x06, + 0xD2, 0xF7, 0x39, 0x03, 0xBC, 0xEA, 0x43, 0xF7, 0xB0, 0xE4, 0xE0, 0xF4, + 0x97, 0xE6, 0x95, 0xF2, 0x2C, 0xE3, 0x7B, 0xF1, 0x6D, 0xE0, 0x89, 0xF3, + 0x1B, 0xEC, 0x21, 0xEA, 0x3F, 0xF8, 0x2E, 0xD6, 0x70, 0xF8, 0x3F, 0xD7, + 0x1E, 0xF9, 0x3E, 0xEA, 0x53, 0xFE, 0x8F, 0xF1, 0x1A, 0x03, 0xE3, 0xFB, + 0x6B, 0x08, 0xE3, 0x0C, 0x1D, 0x08, 0xBE, 0xFF, 0x0E, 0x06, 0x56, 0xEF, + 0x7F, 0x08, 0xEF, 0xF8, 0x9E, 0x07, 0xB5, 0xFA, 0x23, 0x0D, 0x53, 0xF6, + 0x48, 0x0F, 0x93, 0x01, 0xE0, 0x05, 0x3E, 0x08, 0x31, 0x07, 0x16, 0xFD, + 0x65, 0x10, 0xC2, 0xFB, 0xE0, 0x17, 0x87, 0x0D, 0xF8, 0x10, 0xFD, 0x1E, + 0x63, 0xF0, 0xD5, 0x0C, 0x0C, 0xEA, 0x08, 0xF9, 0x4C, 0x02, 0x53, 0x07, + 0x89, 0xFF, 0x82, 0x00, 0xAA, 0x01, 0x38, 0xFE, 0xCB, 0x01, 0xC4, 0x07, + 0xAE, 0xDC, 0xF2, 0xE7, 0xA0, 0xDC, 0x31, 0xE0, 0x26, 0x00, 0x18, 0xFB, + 0xE2, 0xEE, 0x2B, 0xDD, 0x85, 0xD1, 0xBA, 0xB3, 0xCD, 0xEE, 0x6E, 0xD6, + 0xC6, 0x0E, 0xB4, 0x09, 0x87, 0x09, 0x96, 0x09, 0x17, 0x00, 0x55, 0x02, + 0x10, 0xFD, 0x58, 0x1B, 0x72, 0xF9, 0xCD, 0x22, 0x72, 0xF5, 0xC7, 0x13, + 0x8C, 0xF8, 0xF3, 0x13, 0xA5, 0xF8, 0x8A, 0x1A, 0x42, 0xF2, 0x0B, 0x1A, + 0x3A, 0xF8, 0x43, 0x14, 0xFC, 0xFD, 0xDF, 0x1E, 0x4D, 0xFE, 0x45, 0x30, + 0x79, 0xFE, 0x9E, 0x23, 0x76, 0x04, 0x34, 0x18, 0x57, 0x11, 0xB5, 0x20, + 0x28, 0x18, 0x50, 0x21, 0x30, 0x08, 0x7B, 0x17, 0x03, 0xF1, 0x9B, 0x12, + 0x11, 0xFB, 0xA0, 0x18, 0x8A, 0x0D, 0x96, 0x08, 0x4D, 0x0C, 0xBB, 0xED, + 0x8A, 0x14, 0x90, 0xFD, 0x44, 0x1C, 0x90, 0x0A, 0x5E, 0x10, 0x25, 0xED, + 0x21, 0x12, 0x9B, 0xEB, 0xC2, 0x0D, 0x75, 0xF8, 0xF3, 0xEE, 0x74, 0xDA, + 0x34, 0xEA, 0x71, 0xCC, 0x8D, 0xF8, 0x59, 0xE5, 0xA4, 0xF4, 0xD6, 0xE4, + 0xF7, 0xEC, 0xF0, 0xD7, 0x8D, 0xED, 0x9C, 0xDC, 0x7B, 0xF6, 0x08, 0xE2, + 0x75, 0x02, 0xB2, 0xE8, 0xE9, 0x06, 0x25, 0xF3, 0x84, 0x01, 0x8B, 0xF6, + 0xD9, 0x01, 0x22, 0xF8, 0x5E, 0x03, 0x54, 0xFC, 0xED, 0xF6, 0xE1, 0xFA, + 0x36, 0xEA, 0x57, 0xFD, 0x12, 0xEF, 0xE0, 0xFF, 0x0E, 0x0C, 0xC0, 0x01, + 0x63, 0x23, 0x44, 0x11, 0x72, 0x26, 0x33, 0x23, 0x19, 0x28, 0x4C, 0x2F, + 0x52, 0x0F, 0xCD, 0x24, 0xD8, 0x00, 0xA3, 0x14, 0xE6, 0x1C, 0x3B, 0x18, + 0x3B, 0x14, 0x33, 0x0E, 0x01, 0xFB, 0xF6, 0x08, 0xF1, 0x07, 0x4A, 0x1D, + 0xB4, 0x18, 0xB3, 0x24, 0x51, 0x0E, 0x9A, 0x17, 0xEC, 0xFA, 0x1F, 0x13, + 0x7A, 0x04, 0x63, 0x10, 0xDA, 0x05, 0x07, 0xF9, 0x02, 0xF0, 0xDB, 0xDA, + 0x0E, 0xFB, 0x6A, 0xE0, 0x13, 0x05, 0x1F, 0xF8, 0x18, 0x02, 0x99, 0x04, + 0xB1, 0x0E, 0x9C, 0x10, 0xB2, 0x16, 0x0D, 0x13, 0x9F, 0x07, 0x12, 0x05, + 0xF9, 0xF5, 0x08, 0x02, 0x15, 0x0D, 0x94, 0x1C, 0xA1, 0x15, 0x81, 0x1A, + 0x88, 0xEC, 0xE1, 0xF9, 0x31, 0xD4, 0x5D, 0xF9, 0x48, 0xDA, 0x87, 0x03, + 0xCE, 0xDF, 0xCD, 0xF2, 0x10, 0xE9, 0x30, 0xE6, 0xD9, 0xFA, 0x97, 0xFB, + 0xBC, 0xF8, 0x82, 0x0D, 0xAB, 0xE6, 0xF3, 0x06, 0x2F, 0xE4, 0x73, 0xED, + 0x00, 0xF6, 0xF8, 0xE2, 0x9D, 0xEF, 0x9F, 0xE8, 0x0C, 0xDC, 0x7A, 0xE4, + 0x3D, 0xED, 0x29, 0xF7, 0x38, 0xF9, 0xBC, 0x06, 0x99, 0xF6, 0x9B, 0xFA, + 0xF7, 0x11, 0x82, 0xFE, 0x2F, 0x2C, 0xA3, 0x06, 0x26, 0x2C, 0x95, 0xFE, + 0x7F, 0x2B, 0x90, 0x04, 0xDE, 0x23, 0x9D, 0x09, 0xC6, 0x12, 0xDC, 0x02, + 0x28, 0x10, 0x34, 0x09, 0x79, 0x23, 0x43, 0x1C, 0x60, 0x23, 0x5D, 0x1E, + 0x06, 0xF9, 0x14, 0x07, 0x0E, 0xE0, 0x71, 0x0A, 0x00, 0xF7, 0x3D, 0x1A, + 0xAF, 0x0C, 0x27, 0x0F, 0x83, 0x03, 0x92, 0x0B, 0xA9, 0xF6, 0x9C, 0x0E, + 0x91, 0xED, 0x3A, 0x0A, 0x57, 0xE3, 0x45, 0x03, 0x18, 0xEB, 0x55, 0xFA, + 0xB2, 0xFB, 0x12, 0xF2, 0x4D, 0xF3, 0x28, 0xE4, 0x13, 0xE6, 0xE9, 0xE5, + 0xD7, 0xEA, 0xE2, 0xED, 0x2C, 0xED, 0x40, 0xDE, 0xA6, 0xE1, 0xC7, 0xC6, + 0x0F, 0xDA, 0xDA, 0xBD, 0x61, 0xE9, 0x1D, 0xC9, 0x2F, 0xFE, 0xCF, 0xD4, + 0x6D, 0x04, 0x53, 0xD8, 0x7B, 0xFE, 0x0B, 0xD9, 0x6F, 0x06, 0x07, 0xE9, + 0x57, 0x10, 0x0E, 0x03, 0xDA, 0x09, 0x3C, 0x08, 0xE6, 0x04, 0xFC, 0x00, + 0x88, 0xFE, 0x2E, 0xFA, 0xF2, 0x02, 0xB5, 0x08, 0x50, 0x0F, 0xA7, 0x1A, + 0x56, 0x10, 0xC8, 0x15, 0xDD, 0x10, 0x83, 0x1E, 0x78, 0x0D, 0x25, 0x2E, + 0xA3, 0x13, 0x72, 0x2E, 0x8E, 0x21, 0x6C, 0x26, 0xBF, 0x26, 0x5E, 0x29, + 0xDC, 0x25, 0x12, 0x3C, 0x1F, 0x10, 0xE9, 0x3D, 0x19, 0x0A, 0xB4, 0x2E, + 0xD7, 0x13, 0x3C, 0x18, 0x85, 0x11, 0xA5, 0x0B, 0x5E, 0x1C, 0xB4, 0x1D, + 0x24, 0x1D, 0xAA, 0x2E, 0xD0, 0x0B, 0xCB, 0x19, 0x4E, 0x09, 0x8F, 0x0C, + 0x8F, 0x17, 0x6A, 0x29, 0x17, 0x0F, 0x94, 0x29, 0x72, 0x00, 0xB5, 0x0A, + 0x27, 0x16, 0x48, 0x07, 0xD7, 0x20, 0xF5, 0x13, 0xEB, 0x0B, 0xCE, 0x15, + 0x78, 0x06, 0xD4, 0x1D, 0x27, 0x16, 0x53, 0x28, 0xFA, 0x1E, 0x38, 0x1B, + 0x22, 0x0F, 0x3E, 0x0A, 0xD6, 0x0A, 0xD8, 0x09, 0xB8, 0x14, 0x5E, 0x05, + 0xBA, 0xFB, 0x79, 0xEB, 0x0E, 0xFB, 0xC8, 0xE8, 0x14, 0x1D, 0x90, 0x08, + 0x11, 0x04, 0xE8, 0x05, 0x4B, 0xE3, 0x91, 0xE9, 0x7C, 0xF8, 0x24, 0xEA, + 0x9E, 0xFD, 0xEA, 0xDF, 0x25, 0xEB, 0xB0, 0xD4, 0x0D, 0xD1, 0x48, 0xDD, + 0xFF, 0xB6, 0xAA, 0xD2, 0x60, 0xBA, 0xBC, 0xBC, 0x67, 0xCE, 0x42, 0xBE, + 0x19, 0xE5, 0x0A, 0xD6, 0xA4, 0xD9, 0x2B, 0xD1, 0x9D, 0xB3, 0x97, 0xB9, + 0x04, 0xAF, 0x6D, 0xB2, 0x52, 0xB7, 0x3D, 0xB0, 0x5C, 0xB9, 0x05, 0xB4, + 0x5A, 0xC5, 0x7E, 0xB8, 0x1F, 0xD1, 0x75, 0xC0, 0xE4, 0xD8, 0xC4, 0xD2, + 0x94, 0xE3, 0x5B, 0xE2, 0x1C, 0xEA, 0x94, 0xEF, 0xC0, 0xF1, 0x2C, 0xFF, + 0x38, 0x00, 0x1A, 0xFA, 0xDF, 0x03, 0x52, 0xE6, 0xB2, 0x02, 0xFF, 0xF4, + 0x6D, 0x05, 0x16, 0x12, 0x38, 0x0A, 0x72, 0x19, 0xA3, 0x17, 0x06, 0x21, + 0x3E, 0x25, 0xD1, 0x31, 0x86, 0x17, 0x9D, 0x2A, 0x6A, 0x00, 0x2A, 0x1D, + 0xD7, 0x05, 0xB7, 0x22, 0xAA, 0x19, 0x2A, 0x1F, 0x02, 0x1F, 0x2F, 0x21, + 0x74, 0x12, 0xD9, 0x29, 0xC7, 0x09, 0x86, 0x2B, 0xA0, 0x0E, 0x3B, 0x2C, + 0x16, 0x25, 0x8E, 0x29, 0x04, 0x38, 0x03, 0x24, 0x2B, 0x3B, 0x0F, 0x22, + 0xE4, 0x3A, 0xFA, 0x24, 0x18, 0x37, 0x26, 0x22, 0x8A, 0x32, 0xA0, 0x16, + 0x74, 0x2B, 0x11, 0x13, 0x4F, 0x27, 0x18, 0x15, 0x24, 0x33, 0x16, 0x14, + 0x15, 0x42, 0xFA, 0x0D, 0xD3, 0x3A, 0x85, 0x05, 0xC2, 0x24, 0x4C, 0x09, + 0x0F, 0x1D, 0xD6, 0x09, 0xEC, 0x30, 0xE7, 0x1A, 0x00, 0x35, 0xC6, 0x21, + 0x94, 0x12, 0xE7, 0xFE, 0x83, 0x00, 0xFC, 0x06, 0xC2, 0x18, 0xA9, 0x2A, + 0x34, 0x15, 0xFC, 0x0B, 0x6F, 0xEA, 0xA6, 0xE8, 0xDA, 0xED, 0x41, 0xFF, + 0x1F, 0x01, 0xFF, 0x0E, 0xBB, 0xF5, 0xA9, 0xFD, 0xD9, 0xFD, 0x9F, 0xFC, + 0xCA, 0x11, 0x87, 0x07, 0xF6, 0xF9, 0x2C, 0xF0, 0xC1, 0xCE, 0x52, 0xDE, + 0xD5, 0xCE, 0x0C, 0xF0, 0x84, 0xE0, 0x44, 0xED, 0x11, 0xCA, 0x9C, 0xD2, + 0xC6, 0xC3, 0x8D, 0xD4, 0x66, 0xEE, 0xDB, 0xF0, 0xB9, 0xF6, 0x58, 0xF6, + 0x49, 0xE1, 0xA7, 0xE7, 0xF5, 0xDC, 0x30, 0xF6, 0x5D, 0xDB, 0xB9, 0x0B, + 0xE6, 0xE5, 0xD0, 0x01, 0x07, 0xEF, 0x08, 0xF8, 0x6F, 0xEE, 0xF5, 0xFC, + 0x90, 0xE3, 0x9E, 0xFA, 0xD2, 0xD6, 0xDE, 0x00, 0xA2, 0xEB, 0xEF, 0x13, + 0x34, 0x03, 0x78, 0x19, 0x0D, 0xF9, 0xDD, 0xFF, 0x7B, 0xEB, 0xFA, 0xE4, + 0x4C, 0xEA, 0x81, 0xEB, 0x7A, 0xED, 0xE8, 0xE8, 0xEB, 0xFB, 0xCE, 0xDC, + 0x33, 0xF6, 0x71, 0xE2, 0xBF, 0xE4, 0xA6, 0xEC, 0xFB, 0xE9, 0xA8, 0xE9, + 0xE0, 0xEE, 0xC8, 0xD7, 0x6F, 0xEB, 0xC3, 0xD1, 0x49, 0xEA, 0x35, 0xD3, + 0xA5, 0xEB, 0x3F, 0xD8, 0xAB, 0xDE, 0xD6, 0xE5, 0x4F, 0xD2, 0xFA, 0xDE, + 0x4B, 0xD1, 0xF9, 0xD2, 0x2D, 0xD4, 0x3D, 0xD8, 0x83, 0xE8, 0x74, 0xE1, + 0x77, 0xF0, 0x0C, 0xE6, 0x84, 0xE2, 0x86, 0xE3, 0xD7, 0xDF, 0x3E, 0xE2, + 0xD5, 0xF3, 0xD9, 0xF0, 0x1C, 0x0B, 0x91, 0x02, 0x9B, 0x13, 0xC5, 0x03, + 0x28, 0x0D, 0xC0, 0xFD, 0xC1, 0x09, 0x80, 0x00, 0x96, 0x1B, 0xBC, 0x11, + 0x48, 0x25, 0xC6, 0x13, 0x81, 0x2A, 0x31, 0x0E, 0xDD, 0x31, 0x45, 0x12, + 0x95, 0x2B, 0x55, 0x13, 0x74, 0x23, 0x69, 0x17, 0x77, 0x30, 0xAA, 0x1B, + 0xBE, 0x3C, 0xEC, 0x1B, 0xB1, 0x2D, 0x91, 0x1C, 0x7E, 0x1A, 0x0B, 0x22, + 0xDE, 0x11, 0x84, 0x31, 0xDD, 0x10, 0x45, 0x29, 0xCE, 0x0B, 0x42, 0x0D, + 0xF3, 0x0C, 0x5F, 0x15, 0x70, 0x07, 0xA5, 0x1E, 0x54, 0xEC, 0xA4, 0x06, + 0x0A, 0xEC, 0x88, 0x0D, 0x85, 0x06, 0x03, 0x2A, 0x45, 0x0B, 0x56, 0x1F, + 0x20, 0xFC, 0x28, 0x16, 0x1F, 0x0C, 0x82, 0x1F, 0x22, 0x26, 0x03, 0x22, + 0x25, 0x18, 0xEB, 0x24, 0x04, 0x0C, 0xDB, 0x30, 0x50, 0x10, 0x0E, 0x33, + 0x26, 0x1A, 0xE6, 0x1A, 0xE1, 0x2B, 0xF1, 0x07, 0xD2, 0x33, 0x3D, 0x0F, + 0xB8, 0x2B, 0x3E, 0x14, 0xBC, 0x0F, 0x55, 0x0A, 0xFB, 0x07, 0xA0, 0x02, + 0xB8, 0x16, 0x60, 0xFD, 0xC3, 0x08, 0x98, 0xFE, 0x07, 0xF5, 0xDF, 0xF9, + 0x7E, 0xF6, 0xE2, 0xED, 0x53, 0xF6, 0x14, 0xEA, 0x00, 0xF9, 0xEF, 0xE6, + 0xC0, 0xFA, 0x03, 0xF1, 0xB8, 0xEB, 0x4F, 0xF6, 0xEA, 0xED, 0xF2, 0xE8, + 0x34, 0x03, 0x4A, 0xEE, 0x89, 0x07, 0xCB, 0xF9, 0x49, 0xFB, 0x72, 0xF9, + 0x54, 0xF0, 0xA6, 0xFC, 0x31, 0xF5, 0xFC, 0x03, 0x58, 0xED, 0x69, 0x02, + 0x3F, 0xDC, 0x01, 0xFE, 0x48, 0xDE, 0x8E, 0xF4, 0x7B, 0xE6, 0x22, 0xE7, + 0x32, 0xEC, 0xA8, 0xE0, 0xE7, 0xE4, 0x2F, 0xE6, 0x0F, 0xDD, 0x32, 0xF3, + 0xF1, 0xE5, 0x0D, 0xFB, 0xA8, 0xF2, 0xEA, 0xFE, 0x4B, 0xFC, 0xF0, 0xFE, + 0x8A, 0xFB, 0x52, 0xFF, 0xAD, 0xEE, 0xE6, 0xF9, 0x8E, 0xE2, 0xFC, 0xF3, + 0x51, 0xE9, 0x3A, 0xF8, 0x7D, 0xFF, 0x39, 0xF8, 0xFF, 0xF7, 0x81, 0xF6, + 0x4A, 0xDC, 0x33, 0xED, 0xA2, 0xE0, 0xAE, 0xD7, 0xAD, 0xF6, 0x07, 0xD9, + 0x70, 0xFC, 0x8C, 0xDE, 0xAD, 0xF7, 0x18, 0xD6, 0xCD, 0xEB, 0x8E, 0xD5, + 0x2B, 0xE2, 0x85, 0xD7, 0x76, 0xE5, 0x47, 0xD7, 0xC3, 0xF4, 0x98, 0xE1, + 0x86, 0x08, 0x8B, 0xF7, 0xFB, 0xFE, 0x6F, 0xF5, 0xFB, 0xF8, 0x55, 0xF1, + 0xC5, 0xFD, 0x0D, 0xFF, 0x68, 0xF0, 0x25, 0x08, 0x63, 0xF4, 0x25, 0x10, + 0x11, 0x00, 0x1F, 0x0C, 0x26, 0xFC, 0x13, 0xFF, 0xCE, 0xF8, 0x6C, 0xFF, + 0x2E, 0xF5, 0x9B, 0x06, 0xD7, 0xF5, 0x58, 0x09, 0x74, 0xFF, 0xEE, 0x14, + 0x77, 0xF4, 0xAD, 0x0A, 0xBC, 0xEF, 0x98, 0xF2, 0x17, 0xFA, 0xA1, 0x06, + 0x77, 0xF5, 0x44, 0x18, 0x14, 0xFA, 0x1D, 0x01, 0xF8, 0x0D, 0xCB, 0xFB, + 0x32, 0x1B, 0x5E, 0x11, 0x69, 0x18, 0x76, 0x0D, 0xE1, 0x16, 0x4A, 0xFF, + 0x07, 0x2F, 0xA7, 0x0E, 0xB1, 0x3D, 0xEF, 0x1E, 0x55, 0x32, 0x30, 0x12, + 0x55, 0x2F, 0x98, 0x13, 0x40, 0x2E, 0x16, 0x32, 0x33, 0x1F, 0x2A, 0x22, + 0xCE, 0x17, 0x3F, 0x07, 0x6F, 0x20, 0x48, 0x25, 0x0A, 0x22, 0x68, 0x3B, + 0x57, 0x20, 0xEA, 0x33, 0x35, 0x26, 0x7A, 0x2B, 0x4E, 0x26, 0x87, 0x32, + 0x55, 0x1A, 0x36, 0x39, 0x6C, 0x15, 0xAF, 0x2D, 0x3A, 0x26, 0x22, 0x2F, + 0xBB, 0x2B, 0x3F, 0x27, 0xE2, 0x0F, 0x16, 0x09, 0xF0, 0xFF, 0x5B, 0x09, + 0x09, 0x09, 0x2B, 0x1C, 0xCE, 0x0A, 0x12, 0x0E, 0x9D, 0x07, 0xB2, 0xF0, + 0xA4, 0x10, 0x4B, 0xF6, 0xF8, 0x0F, 0x0B, 0x02, 0xF5, 0xFE, 0x65, 0xED, + 0x8F, 0xEB, 0x8D, 0xD5, 0x37, 0xE4, 0x19, 0xD2, 0xCA, 0xE5, 0x5E, 0xCE, + 0x69, 0xDA, 0x2D, 0xC5, 0xA1, 0xCD, 0xBF, 0xC8, 0xA1, 0xD2, 0x18, 0xD7, + 0xF2, 0xD5, 0x12, 0xDA, 0x0D, 0xCE, 0x8F, 0xD4, 0x0B, 0xC8, 0xB0, 0xD4, + 0xB1, 0xD0, 0xDA, 0xD9, 0xE7, 0xE0, 0xA1, 0xE2, 0x0B, 0xD9, 0xC1, 0xEB, + 0x7C, 0xDE, 0x52, 0xF3, 0xD4, 0xF9, 0x2F, 0xF2, 0x68, 0xFB, 0x4F, 0xF4, + 0x4F, 0xF6, 0xF6, 0x06, 0xF0, 0xEC, 0xED, 0x0D, 0x8B, 0xE8, 0xFF, 0x05, + 0x0F, 0x00, 0x21, 0x0A, 0xFC, 0x1A, 0xB8, 0x1B, 0x46, 0x1B, 0x5A, 0x16, + 0x6C, 0x04, 0x03, 0x0D, 0x13, 0x05, 0xAD, 0x22, 0xD6, 0x1B, 0x5E, 0x27, + 0x5D, 0x28, 0xD3, 0x1A, 0xF6, 0x22, 0xCE, 0x1F, 0x6A, 0x20, 0xE5, 0x27, + 0x0B, 0x2A, 0x40, 0x2A, 0x48, 0x34, 0x5A, 0x2F, 0x88, 0x33, 0x4E, 0x34, + 0x4C, 0x23, 0x53, 0x36, 0x0B, 0x17, 0x6B, 0x2C, 0xDF, 0x10, 0xFB, 0x14, + 0xBC, 0x1C, 0x8C, 0x0F, 0xBD, 0x25, 0x2F, 0x0E, 0xC6, 0x08, 0xD7, 0xF8, + 0xC0, 0x0B, 0xEF, 0x01, 0x7F, 0x24, 0xE9, 0x12, 0x75, 0x0B, 0xDF, 0xF4, + 0x8B, 0xEF, 0x9D, 0xDC, 0x65, 0x00, 0x17, 0xF2, 0x0E, 0x15, 0xC2, 0xFF, + 0x46, 0x15, 0xBE, 0xF8, 0xD5, 0x16, 0x9E, 0x04, 0xC7, 0x10, 0xD2, 0x06, + 0xE5, 0xFD, 0x0B, 0xFC, 0x1C, 0xF7, 0xB6, 0xFB, 0x0E, 0x07, 0xF2, 0xFA, + 0x08, 0xFE, 0xBA, 0xF5, 0x18, 0xD2, 0x60, 0xDC, 0x72, 0xC9, 0xCD, 0xD6, + 0xE3, 0xDA, 0xF6, 0xEA, 0xCF, 0xDC, 0x66, 0xDE, 0x15, 0xCC, 0xF2, 0xC6, + 0x2B, 0xC3, 0xD6, 0xCA, 0x68, 0xD3, 0x23, 0xD9, 0xFC, 0xD8, 0x23, 0xD8, + 0x98, 0xD6, 0x79, 0xD5, 0x5C, 0xD3, 0xD0, 0xD3, 0xB8, 0xCC, 0xA9, 0xD0, + 0x22, 0xD7, 0xAC, 0xDA, 0xEF, 0xE8, 0xAF, 0xE1, 0xF5, 0xFB, 0xF0, 0xDC, + 0x98, 0xFA, 0x24, 0xE3, 0xBF, 0xED, 0x8A, 0xF7, 0xA1, 0xFC, 0xFB, 0xF9, + 0x3D, 0xF8, 0x71, 0xEC, 0xBA, 0xE0, 0x88, 0xEC, 0x42, 0xE7, 0x25, 0xFF, + 0xEB, 0xEC, 0x77, 0x0D, 0x26, 0xF1, 0xF7, 0x0E, 0xF0, 0xFC, 0xDE, 0x12, + 0xF8, 0xF2, 0xD9, 0x12, 0xA4, 0xE6, 0x2B, 0x13, 0x89, 0xEE, 0x97, 0x10, + 0xEB, 0x00, 0x7E, 0x09, 0x84, 0x0A, 0x41, 0x0F, 0x41, 0xF7, 0x98, 0x0A, + 0x0E, 0xFC, 0xAF, 0x07, 0x52, 0x1A, 0x47, 0x1A, 0xAF, 0x12, 0x20, 0x1B, + 0x51, 0x09, 0x37, 0x0B, 0x1D, 0x18, 0xAD, 0x09, 0xC8, 0x1D, 0x4F, 0x04, + 0xA4, 0x1A, 0x44, 0x04, 0x3B, 0x22, 0x18, 0x15, 0x08, 0x28, 0xA3, 0x16, + 0xE0, 0x19, 0xDA, 0x14, 0x59, 0x19, 0xAE, 0x0F, 0x74, 0x36, 0xCF, 0x0C, + 0xB0, 0x3E, 0x6E, 0x15, 0x5F, 0x2E, 0x0B, 0x25, 0x11, 0x1C, 0xD0, 0x29, + 0xD4, 0x15, 0xBE, 0x19, 0xBD, 0x27, 0x8A, 0x1D, 0xA7, 0x2D, 0x54, 0x2A, + 0xF9, 0x23, 0x24, 0x1D, 0x50, 0x29, 0x70, 0x15, 0x3E, 0x28, 0xE9, 0x18, + 0x8B, 0x24, 0x9B, 0x16, 0x86, 0x2C, 0xD3, 0x1C, 0x25, 0x1C, 0x81, 0x23, + 0xC2, 0x03, 0x18, 0x1C, 0x66, 0x13, 0xD9, 0x14, 0x6E, 0x27, 0xFC, 0x15, + 0xD5, 0x01, 0x28, 0xFE, 0xB6, 0xDF, 0xCE, 0xE4, 0x78, 0xFC, 0xE6, 0xF2, + 0x2D, 0x0B, 0x6B, 0x00, 0x1F, 0xF9, 0xAE, 0x07, 0x09, 0xF9, 0x84, 0x13, + 0x50, 0xEC, 0x6B, 0x0B, 0x76, 0xDB, 0x9F, 0xFD, 0x4C, 0xF7, 0xF9, 0x02, + 0x89, 0x07, 0x93, 0x09, 0xD1, 0xE8, 0x5E, 0x01, 0xE8, 0xCB, 0xAC, 0xF6, + 0x9F, 0xD6, 0x76, 0xEC, 0x8C, 0xEB, 0x45, 0xE3, 0xDF, 0xE8, 0xCF, 0xE5, + 0x3A, 0xE6, 0x41, 0xE2, 0x3C, 0xEB, 0x07, 0xE4, 0x31, 0xE7, 0xAA, 0xF0, + 0x0D, 0xE6, 0xBE, 0xE8, 0x82, 0xF6, 0x47, 0xE2, 0x83, 0xF9, 0xF2, 0xE1, + 0xBD, 0xEF, 0x61, 0xE0, 0xF9, 0xFA, 0xA1, 0xEF, 0xFB, 0x06, 0x66, 0xF5, + 0xD4, 0xF7, 0xDA, 0xEC, 0x0B, 0xE6, 0xA4, 0xE5, 0x51, 0xEF, 0xE1, 0xE6, + 0x80, 0xEE, 0xB0, 0xED, 0x24, 0xDA, 0x7A, 0xE4, 0x56, 0xD2, 0x41, 0xD9, + 0x10, 0xD1, 0xBE, 0xD1, 0x49, 0xD8, 0x5C, 0xD1, 0x85, 0xD9, 0x85, 0xD9, + 0x7A, 0xCA, 0xE8, 0xD3, 0x95, 0xC0, 0xDD, 0xCF, 0x59, 0xC1, 0xA3, 0xC9, + 0x3E, 0xDB, 0x14, 0xC2, 0xBA, 0xF9, 0x15, 0xDC, 0xD5, 0xF0, 0x8A, 0xF4, + 0x2D, 0xE5, 0xEE, 0xF0, 0x1A, 0xFA, 0xA9, 0xEC, 0xD3, 0x0A, 0x4C, 0xDF, + 0x53, 0x0A, 0x03, 0xD8, 0x8B, 0x01, 0x6D, 0xE4, 0x47, 0x05, 0x26, 0xEF, + 0x10, 0x17, 0x2E, 0x00, 0xCF, 0x1B, 0x5D, 0x0D, 0x02, 0x22, 0x05, 0x18, + 0x3B, 0x28, 0x9F, 0x23, 0xF7, 0x20, 0x6C, 0x17, 0x57, 0x2A, 0x8A, 0x1D, + 0xE7, 0x2D, 0xBB, 0x34, 0xAD, 0x18, 0x53, 0x3D, 0x00, 0x10, 0x92, 0x42, + 0x92, 0x11, 0x0E, 0x33, 0xD6, 0x0E, 0x27, 0x2D, 0x96, 0x0E, 0xC1, 0x37, + 0xEA, 0x11, 0x34, 0x2C, 0xAD, 0x08, 0x29, 0x1E, 0x0A, 0xFD, 0x3C, 0x1F, + 0xCE, 0xFC, 0x3F, 0x17, 0xE2, 0x00, 0x1E, 0x0D, 0xF2, 0x02, 0x0B, 0x17, + 0xC1, 0x00, 0xF7, 0x13, 0x9D, 0xFF, 0x29, 0xFC, 0x1A, 0x11, 0x25, 0x03, + 0x73, 0x23, 0x60, 0x1F, 0x85, 0x0D, 0x80, 0x15, 0xA3, 0xFF, 0xFB, 0xFA, + 0xE7, 0x1D, 0x8E, 0x04, 0xF3, 0x22, 0xFC, 0x10, 0xD8, 0x19, 0xEC, 0x0F, + 0x7A, 0x23, 0x31, 0x1A, 0xA9, 0x17, 0x55, 0x16, 0xC8, 0xFF, 0x7F, 0x04, + 0x5F, 0x02, 0xD9, 0x0A, 0xB0, 0x09, 0x94, 0x18, 0xDA, 0x06, 0x8E, 0x0C, + 0xDF, 0x0D, 0xEE, 0xF4, 0x53, 0x12, 0x7A, 0xF7, 0x2C, 0x12, 0x18, 0x1A, + 0x6F, 0x14, 0x1F, 0x2B, 0x82, 0x09, 0xB5, 0x15, 0xE9, 0x05, 0xFA, 0x09, + 0xA5, 0x13, 0x5C, 0x10, 0x21, 0x12, 0xC2, 0x0D, 0x3E, 0x0B, 0xF2, 0x06, + 0xA8, 0x13, 0x0B, 0x07, 0xFD, 0x19, 0xC5, 0x05, 0x1C, 0x07, 0x8C, 0x05, + 0x7A, 0xE9, 0xAE, 0x0B, 0x59, 0xE2, 0x2A, 0xFF, 0x96, 0xEE, 0xC3, 0xE3, + 0xC5, 0xF2, 0xE5, 0xDF, 0x4B, 0xF4, 0xBF, 0xF1, 0xFD, 0xF5, 0xE3, 0xFB, + 0xD0, 0xEC, 0xDD, 0xFC, 0x98, 0xE0, 0x2F, 0xFE, 0x43, 0xE5, 0x72, 0xF6, + 0xF8, 0xFC, 0xCD, 0xE7, 0x81, 0xF6, 0xBA, 0xD8, 0x5F, 0xDA, 0x79, 0xCB, + 0xA9, 0xDA, 0xFD, 0xC3, 0x96, 0xE2, 0x56, 0xC7, 0x1E, 0xE8, 0x8F, 0xD4, + 0xE6, 0xE6, 0x1E, 0xD0, 0x93, 0xE1, 0xFA, 0xC7, 0x2D, 0xD8, 0x2E, 0xC8, + 0xAF, 0xBC, 0xDA, 0xBD, 0x9D, 0xBB, 0x08, 0xBD, 0x0C, 0xD3, 0x2A, 0xCD, + 0x84, 0xD3, 0x0F, 0xD1, 0x15, 0xCA, 0x0D, 0xCB, 0xBF, 0xD5, 0x40, 0xDD, + 0x91, 0xDE, 0xB2, 0xEB, 0x46, 0xD5, 0xF8, 0xDB, 0x0F, 0xDA, 0x42, 0xD5, + 0x83, 0xDE, 0xFA, 0xD9, 0xA0, 0xCD, 0xDC, 0xDA, 0x64, 0xC6, 0x50, 0xE4, + 0xB3, 0xDE, 0xA6, 0xE6, 0xEE, 0xF0, 0x76, 0xDD, 0xC9, 0xF1, 0x51, 0xEB, + 0x76, 0x01, 0xBA, 0x07, 0x1C, 0x05, 0x46, 0x07, 0x56, 0x00, 0xC5, 0xFF, + 0x5D, 0x15, 0xA6, 0x05, 0xAD, 0x27, 0xA0, 0x07, 0xB5, 0x2E, 0x41, 0x15, + 0x6A, 0x3A, 0xE9, 0x22, 0x58, 0x39, 0x05, 0x1A, 0xB3, 0x2E, 0xD1, 0x20, + 0xA5, 0x3A, 0x8F, 0x43, 0x5C, 0x40, 0x57, 0x47, 0xB7, 0x28, 0xE7, 0x2D, + 0xD0, 0x29, 0xB8, 0x34, 0x44, 0x3C, 0x10, 0x4F, 0x55, 0x32, 0x08, 0x51, + 0xA3, 0x18, 0xCE, 0x45, 0x21, 0x0F, 0x4D, 0x46, 0x4B, 0x0F, 0xC2, 0x3B, + 0x85, 0x0E, 0xF2, 0x2C, 0x9A, 0x1E, 0xB2, 0x3A, 0x66, 0x22, 0xFF, 0x36, + 0x2A, 0x14, 0xC3, 0x18, 0x9E, 0x18, 0xDF, 0x1B, 0x4B, 0x22, 0xD0, 0x30, + 0xC3, 0x1B, 0x2D, 0x29, 0x42, 0x0D, 0x99, 0x0D, 0xBD, 0x11, 0xCE, 0x02, + 0xA3, 0x22, 0x03, 0x0D, 0x87, 0x25, 0x00, 0x0D, 0xBF, 0x22, 0x08, 0x09, + 0x31, 0x25, 0x70, 0x0B, 0x25, 0x2A, 0x64, 0x07, 0x58, 0x22, 0x1F, 0x01, + 0x6B, 0x1C, 0x13, 0x02, 0xFD, 0x1D, 0x33, 0x04, 0x71, 0x06, 0xBD, 0xF5, + 0x94, 0xE9, 0x5E, 0xE8, 0x31, 0xE5, 0x91, 0xFE, 0x73, 0xE7, 0xC7, 0x00, + 0x00, 0xE4, 0x4D, 0xD9, 0xD9, 0xDE, 0xA1, 0xC9, 0x1D, 0xD5, 0x84, 0xC8, + 0x98, 0xC6, 0xEA, 0xC2, 0x03, 0xC1, 0x4A, 0xCA, 0x71, 0xC7, 0x84, 0xCE, + 0x4A, 0xD1, 0x3A, 0xCC, 0x8F, 0xC4, 0x69, 0xC5, 0x64, 0xAE, 0x62, 0xC9, + 0x8C, 0xBE, 0x7A, 0xD6, 0x16, 0xDA, 0x1F, 0xC6, 0x22, 0xDC, 0x29, 0xBE, + 0x83, 0xD0, 0xE0, 0xD3, 0x45, 0xCE, 0x94, 0xE0, 0xC3, 0xCA, 0x68, 0xE7, + 0x6E, 0xC9, 0x4C, 0xE7, 0x01, 0xE4, 0x35, 0xE7, 0x52, 0x01, 0x82, 0xF8, + 0xF8, 0x05, 0x86, 0x0D, 0x85, 0xF3, 0xAF, 0x1B, 0xED, 0xE9, 0xAE, 0x1B, + 0xD4, 0xF8, 0x14, 0x14, 0x60, 0x09, 0x96, 0x12, 0x7E, 0x15, 0x82, 0x1A, + 0x30, 0x14, 0xE6, 0x19, 0xD3, 0x0F, 0x38, 0x0B, 0x42, 0x16, 0xA2, 0x0A, + 0xEB, 0x1F, 0x52, 0x16, 0x89, 0x25, 0x80, 0x10, 0xBF, 0x1A, 0xC5, 0x01, + 0x84, 0x14, 0x82, 0x06, 0x66, 0x1D, 0xDB, 0x13, 0x7C, 0x1C, 0x9E, 0x1B, + 0xAC, 0x1E, 0x9E, 0x17, 0x3F, 0x20, 0x37, 0x09, 0x81, 0x13, 0x2D, 0x05, + 0x0F, 0x07, 0x1A, 0x0F, 0x15, 0xFF, 0x66, 0x0F, 0xCC, 0xFE, 0x41, 0xF6, + 0xC5, 0x0C, 0x42, 0xF1, 0xA6, 0x04, 0xC6, 0x00, 0x68, 0xEE, 0x2A, 0xFF, + 0xC7, 0xF9, 0x72, 0x00, 0x2A, 0x08, 0x34, 0x02, 0x46, 0x0B, 0xC6, 0xF9, + 0xB9, 0x07, 0xCF, 0xF4, 0xFA, 0x04, 0x39, 0x00, 0x68, 0x0B, 0x5F, 0x0C, + 0x1D, 0xFB, 0xB1, 0xF9, 0xB6, 0xED, 0x16, 0xF5, 0x5F, 0xF7, 0xE0, 0x07, + 0x0B, 0x06, 0x6B, 0xF9, 0x0D, 0x0D, 0xAE, 0xE1, 0x72, 0xFD, 0xF8, 0xE7, + 0x46, 0xF9, 0x5E, 0xF6, 0x20, 0x04, 0x9A, 0xF4, 0xE0, 0x0C, 0xE3, 0xFE, + 0x59, 0x0D, 0x06, 0x04, 0x3F, 0xFD, 0x4C, 0xED, 0xE1, 0xF8, 0xCD, 0xF2, + 0x6D, 0xFA, 0x9E, 0x0A, 0x72, 0xEE, 0x05, 0x0E, 0xC1, 0xE7, 0x5E, 0x0D, + 0xE1, 0xEB, 0x5D, 0x0E, 0xCE, 0xF0, 0x46, 0x11, 0x9E, 0xF3, 0x61, 0x0C, + 0x22, 0xFB, 0x07, 0x0B, 0x5B, 0x01, 0xB5, 0x0D, 0x51, 0x00, 0xC0, 0x04, + 0xD8, 0xF7, 0x7D, 0x02, 0xBE, 0xEB, 0x87, 0xFA, 0x1A, 0xED, 0x71, 0xF5, + 0x58, 0xF0, 0x60, 0xFB, 0x5B, 0xEF, 0x35, 0xFC, 0x66, 0xF7, 0xDC, 0x05, + 0x86, 0xFD, 0xBB, 0x05, 0x84, 0xFD, 0x20, 0xF5, 0xE1, 0xFE, 0x45, 0xF3, + 0x0E, 0x05, 0xF9, 0x00, 0xD4, 0x0F, 0x9A, 0x0B, 0x17, 0x12, 0x43, 0x05, + 0xAB, 0x16, 0xDB, 0x04, 0x21, 0x17, 0x00, 0x17, 0x3D, 0x04, 0x6E, 0x15, + 0x76, 0xFD, 0xA5, 0x05, 0x8D, 0x07, 0x88, 0xFB, 0xAD, 0x16, 0xAD, 0xF2, + 0x02, 0x15, 0x8E, 0xF5, 0xA4, 0x08, 0xEB, 0xFE, 0x65, 0x0F, 0xE1, 0x03, + 0xE1, 0x1D, 0x29, 0x06, 0x27, 0x28, 0xFF, 0x0D, 0xB3, 0x16, 0x9F, 0x13, + 0xD8, 0x01, 0x02, 0x09, 0x92, 0x12, 0x7E, 0x02, 0xF3, 0x24, 0xF2, 0x0B, + 0x9F, 0x28, 0xCA, 0x10, 0xAC, 0x38, 0x45, 0x21, 0x54, 0x3C, 0x81, 0x3A, + 0xBA, 0x17, 0xE8, 0x2A, 0x4C, 0xF8, 0x90, 0x0B, 0xDC, 0x07, 0x19, 0x13, + 0x21, 0x17, 0x0D, 0x1C, 0x56, 0x05, 0xD0, 0x0F, 0x1E, 0xFE, 0x5A, 0x11, + 0x38, 0x02, 0x6E, 0x21, 0x73, 0xFB, 0x96, 0x20, 0xEF, 0xFA, 0x30, 0x16, + 0x3B, 0xFD, 0x71, 0x14, 0xF5, 0xEC, 0x76, 0x02, 0x1A, 0xDE, 0xB8, 0xF0, + 0x31, 0xE5, 0x62, 0xF4, 0xCE, 0xF7, 0xD9, 0xF3, 0xB1, 0xF7, 0x80, 0xE8, + 0x41, 0xF2, 0x91, 0xDA, 0x43, 0xFD, 0x85, 0xE2, 0x84, 0xF2, 0x3C, 0xF8, + 0x73, 0xE9, 0xDB, 0xF3, 0xC8, 0xF7, 0xB2, 0xE6, 0x34, 0xF7, 0xCB, 0xE4, + 0x56, 0xED, 0x44, 0xE4, 0xF3, 0xEB, 0x0E, 0xEE, 0x88, 0xE9, 0xFF, 0xEF, + 0x39, 0xED, 0xCB, 0xEA, 0x08, 0xF1, 0x4B, 0xF5, 0xB2, 0xF0, 0xE5, 0xFC, + 0x8F, 0xF4, 0x3D, 0xFE, 0xEA, 0xF1, 0x6F, 0xF8, 0x20, 0xED, 0x69, 0xE8, + 0x6A, 0xE8, 0xD7, 0xE7, 0x71, 0xE8, 0x21, 0xF4, 0x82, 0xEF, 0x97, 0xF0, + 0xDE, 0xE8, 0xD9, 0xE2, 0x0A, 0xE0, 0xA7, 0xE2, 0xC1, 0xDE, 0x8B, 0xEA, + 0xC2, 0xD7, 0xD7, 0xE0, 0x12, 0xDC, 0xF4, 0xD0, 0x50, 0xF2, 0xB6, 0xD0, + 0x37, 0x01, 0x1F, 0xD6, 0x06, 0x00, 0x65, 0xE1, 0x66, 0xF9, 0x5A, 0xEB, + 0x1F, 0xF1, 0xB0, 0xE3, 0x87, 0xEF, 0x93, 0xDA, 0xEC, 0xFC, 0xE6, 0xDF, + 0x6D, 0x01, 0x82, 0xE5, 0xAD, 0xFC, 0x29, 0xEA, 0xA8, 0x02, 0x31, 0xF9, + 0x4A, 0x08, 0xD2, 0x0F, 0x3A, 0x05, 0x5F, 0x20, 0x16, 0xFD, 0x28, 0x21, + 0xF7, 0xFB, 0xF1, 0x20, 0xBF, 0x0B, 0x48, 0x25, 0xE3, 0x11, 0x87, 0x24, + 0x59, 0x0A, 0x3C, 0x27, 0xAF, 0x15, 0xC6, 0x2C, 0x08, 0x21, 0xD6, 0x2C, + 0x12, 0x29, 0xAF, 0x34, 0xCE, 0x2B, 0x1F, 0x39, 0x4D, 0x1E, 0xE1, 0x35, + 0x02, 0x23, 0x61, 0x32, 0x1E, 0x24, 0x5D, 0x20, 0xBF, 0x0A, 0x88, 0x11, + 0x86, 0x00, 0xE8, 0x13, 0x98, 0x0C, 0x9B, 0x18, 0xD9, 0x14, 0x58, 0x0D, + 0x36, 0x16, 0x5D, 0xFA, 0x22, 0x19, 0xCA, 0x02, 0x31, 0x12, 0xD9, 0x13, + 0xD7, 0xF8, 0x93, 0x0A, 0x09, 0xFA, 0x24, 0x00, 0x59, 0x19, 0x1D, 0x07, + 0x05, 0x0E, 0x7C, 0x03, 0x1F, 0x00, 0xA4, 0xF7, 0x1E, 0x12, 0x9E, 0xFB, + 0x29, 0x09, 0xD9, 0xF9, 0x5C, 0x06, 0xF3, 0xF7, 0x26, 0x1F, 0x0B, 0x13, + 0x2B, 0x24, 0x93, 0x22, 0xC3, 0x13, 0x01, 0x13, 0x0E, 0x0C, 0x97, 0x08, + 0x11, 0x1B, 0x38, 0x0B, 0xFC, 0x23, 0xF6, 0x14, 0x57, 0x15, 0xA3, 0x18, + 0x6C, 0x0E, 0xEB, 0x0F, 0x82, 0x0F, 0xBD, 0x13, 0x43, 0x12, 0x35, 0x19, + 0x36, 0x19, 0x63, 0x16, 0xAD, 0x17, 0xD2, 0x1B, 0xF1, 0x13, 0xE0, 0x19, + 0x38, 0x13, 0xBF, 0x15, 0xFD, 0x07, 0xF9, 0x1E, 0x7E, 0xFC, 0xB0, 0x24, + 0x91, 0xF5, 0x2A, 0x18, 0x6F, 0xED, 0x16, 0xFF, 0x44, 0xF7, 0x38, 0xF8, + 0x3D, 0xF6, 0x6A, 0xFD, 0xCA, 0xDC, 0x22, 0xF2, 0x53, 0xDC, 0xDB, 0xE9, + 0xB8, 0xF1, 0xC5, 0xE9, 0xF7, 0xF4, 0x65, 0xD6, 0x76, 0xEC, 0x0B, 0xCA, + 0x86, 0xE6, 0x80, 0xD9, 0x55, 0xE4, 0x56, 0xDB, 0x9A, 0xE1, 0xCB, 0xCF, + 0x9F, 0xDC, 0xE1, 0xD2, 0x92, 0xE0, 0x43, 0xD5, 0xEA, 0xDC, 0xAE, 0xCA, + 0x20, 0xD5, 0xE8, 0xC7, 0xB8, 0xDA, 0xA1, 0xCE, 0x19, 0xD5, 0xF1, 0xD2, + 0x3E, 0xC5, 0x23, 0xD5, 0xE5, 0xC2, 0x4E, 0xCE, 0xAF, 0xC1, 0x2E, 0xC2, + 0xE3, 0xB1, 0x41, 0xB8, 0x27, 0xB4, 0x53, 0xB4, 0x76, 0xC0, 0x62, 0xB5, + 0x63, 0xC3, 0x18, 0xBD, 0xC0, 0xCF, 0x1C, 0xC1, 0xB2, 0xD9, 0x1E, 0xCA, + 0x58, 0xD4, 0x97, 0xDC, 0x6E, 0xD0, 0xD6, 0xD9, 0x85, 0xD2, 0xF2, 0xCD, + 0x7D, 0xE2, 0x91, 0xD2, 0xDD, 0xFC, 0x4D, 0xDB, 0x5E, 0x0A, 0x79, 0xE5, + 0xDD, 0x0D, 0xCD, 0xF7, 0x1E, 0x18, 0xE8, 0x13, 0xB6, 0x25, 0x5C, 0x20, + 0xC4, 0x24, 0xB6, 0x14, 0x4E, 0x1F, 0xD6, 0x13, 0x04, 0x2D, 0xD1, 0x20, + 0x29, 0x3D, 0xF3, 0x32, 0xA8, 0x2E, 0x8C, 0x3F, 0x98, 0x13, 0x4B, 0x46, + 0xA1, 0x12, 0x96, 0x50, 0xE5, 0x23, 0x5F, 0x52, 0x26, 0x26, 0xCF, 0x53, + 0xE4, 0x23, 0x50, 0x59, 0xBB, 0x33, 0x5B, 0x58, 0x1C, 0x31, 0x19, 0x51, + 0x60, 0x2D, 0x79, 0x4B, 0x93, 0x41, 0x6F, 0x49, 0xB7, 0x37, 0xE7, 0x43, + 0xC1, 0x23, 0x8C, 0x39, 0x9E, 0x2A, 0xBA, 0x34, 0xB2, 0x29, 0xC2, 0x30, + 0xBB, 0x21, 0x73, 0x25, 0x6A, 0x1C, 0x8C, 0x13, 0xE9, 0x16, 0xA4, 0x09, + 0xBB, 0x28, 0x36, 0x0C, 0x98, 0x39, 0x15, 0x07, 0x26, 0x34, 0x20, 0x09, + 0x95, 0x25, 0x67, 0x11, 0x95, 0x1A, 0xBB, 0x0D, 0xE8, 0x1C, 0x82, 0x0B, + 0x62, 0x22, 0xF9, 0x16, 0x1C, 0x18, 0x9F, 0x13, 0xF9, 0x00, 0x9D, 0xF5, + 0xC7, 0xFD, 0xBC, 0xE7, 0xC3, 0x0E, 0xC7, 0xEF, 0x78, 0x10, 0x96, 0xEC, + 0x66, 0xFF, 0x0E, 0xEB, 0xA6, 0xF6, 0xF1, 0xF5, 0x03, 0xF6, 0xD5, 0xF8, + 0xC2, 0xE7, 0xDF, 0xE5, 0x3A, 0xE1, 0x8E, 0xD5, 0x42, 0xE7, 0x45, 0xD5, + 0x1F, 0xE1, 0xAF, 0xD1, 0xE3, 0xD7, 0x48, 0xD2, 0x55, 0xD1, 0x9E, 0xD6, + 0x45, 0xCD, 0x98, 0xD1, 0xA0, 0xC9, 0xED, 0xC7, 0x8D, 0xC7, 0x64, 0xC2, + 0x72, 0xD2, 0xE2, 0xC5, 0x7A, 0xDA, 0xD8, 0xCD, 0x45, 0xC9, 0xD7, 0xD6, + 0x6C, 0xBF, 0x9C, 0xE4, 0xB2, 0xD0, 0xB8, 0xED, 0x12, 0xD8, 0x6F, 0xF1, + 0x12, 0xD1, 0x14, 0xEF, 0x3E, 0xCD, 0x70, 0xE7, 0xA8, 0xC9, 0x84, 0xEA, + 0x98, 0xD0, 0xB2, 0xED, 0x67, 0xE4, 0xF3, 0xED, 0x90, 0xF2, 0x0E, 0xFD, + 0x0E, 0xF9, 0xE6, 0x0A, 0xA5, 0x0A, 0xCB, 0x0F, 0x16, 0x22, 0xB6, 0x13, + 0xB5, 0x26, 0x42, 0x1C, 0xD5, 0x20, 0x6C, 0x25, 0x60, 0x1A, 0xE3, 0x1C, + 0x6B, 0x16, 0x9A, 0x15, 0x92, 0x1F, 0x45, 0x1A, 0xFE, 0x28, 0x4F, 0x16, + 0xB2, 0x2D, 0x1B, 0x22, 0x75, 0x2C, 0x10, 0x34, 0xC6, 0x1E, 0xA9, 0x23, + 0x28, 0x0F, 0x8A, 0x0B, 0x97, 0x02, 0x3F, 0x06, 0x94, 0xFB, 0x72, 0x02, + 0x5B, 0xFC, 0x56, 0xEF, 0x14, 0xFE, 0x0F, 0xE4, 0xBD, 0xFA, 0xD5, 0xED, + 0xA0, 0xF3, 0xAD, 0xEC, 0x8F, 0xF2, 0xEB, 0xE7, 0xBC, 0xEB, 0xD2, 0xEA, + 0xCC, 0xD8, 0xB4, 0xDF, 0xB5, 0xD1, 0xDB, 0xC9, 0x40, 0xE1, 0xFB, 0xC8, + 0xC6, 0xF8, 0xAF, 0xDB, 0xE6, 0x03, 0x5B, 0xDF, 0xF0, 0x02, 0x2F, 0xDD, + 0x3D, 0xF4, 0xB2, 0xE2, 0x42, 0xED, 0xFF, 0xEA, 0x4E, 0x00, 0x01, 0xF4, + 0xD8, 0x06, 0x58, 0xEF, 0x2F, 0xFD, 0x3D, 0xE7, 0x46, 0xF4, 0xC0, 0xEF, + 0x50, 0xEE, 0x5E, 0x03, 0xED, 0xF2, 0x15, 0x17, 0xB4, 0xF0, 0xE0, 0x19, + 0x64, 0xE3, 0x44, 0x0F, 0x04, 0xEA, 0x0E, 0x13, 0xFE, 0xFB, 0xFC, 0x1E, + 0xEC, 0x01, 0x6B, 0x19, 0x29, 0x01, 0x0C, 0x15, 0xAA, 0xF7, 0xE2, 0x15, + 0xD2, 0xF1, 0x96, 0x11, 0x0A, 0xFD, 0x0A, 0x18, 0x89, 0x06, 0x10, 0x1C, + 0xAC, 0x07, 0x07, 0x13, 0xDC, 0xFD, 0x8E, 0x08, 0x11, 0xF5, 0xA2, 0x09, + 0xDC, 0x05, 0xDF, 0x0F, 0x85, 0x16, 0x2F, 0x09, 0x17, 0x18, 0xF6, 0x02, + 0x37, 0x15, 0x76, 0x01, 0xD7, 0x0D, 0xAC, 0x00, 0xF2, 0x07, 0x8A, 0x02, + 0x3A, 0x06, 0x52, 0xFE, 0x90, 0x01, 0x8B, 0xFB, 0xAC, 0x03, 0x94, 0x01, + 0xBC, 0x08, 0xFF, 0xFD, 0xD1, 0x07, 0x12, 0xF8, 0x27, 0x0F, 0x02, 0xFA, + 0x4A, 0x10, 0x34, 0xF1, 0x7B, 0x0E, 0x26, 0xF1, 0x81, 0x11, 0x86, 0xFF, + 0xF0, 0x09, 0xC3, 0x04, 0x84, 0x05, 0xBF, 0xFE, 0x2A, 0x10, 0xA4, 0xF7, + 0x0A, 0x20, 0x7B, 0xF9, 0xA3, 0x23, 0x11, 0xFB, 0xD2, 0x19, 0x6C, 0xFA, + 0xE7, 0x16, 0x31, 0x0C, 0x67, 0x18, 0xE5, 0x1B, 0x22, 0x0F, 0x28, 0x0D, + 0xFB, 0x0C, 0x26, 0x08, 0x1A, 0x2C, 0xF2, 0x23, 0xA9, 0x35, 0x7B, 0x2B, + 0x95, 0x15, 0xB3, 0x25, 0x3F, 0x16, 0xB3, 0x2F, 0xC1, 0x2C, 0x4E, 0x37, + 0x63, 0x24, 0xCB, 0x3A, 0x91, 0x1E, 0xAD, 0x3F, 0xEB, 0x24, 0xEC, 0x4D, + 0x4E, 0x23, 0x3A, 0x4E, 0x0E, 0x28, 0x8E, 0x43, 0xFE, 0x2E, 0xC1, 0x4D, + 0x34, 0x32, 0x83, 0x51, 0x19, 0x2B, 0x27, 0x3C, 0xF7, 0x24, 0xDB, 0x2B, + 0x1C, 0x29, 0x30, 0x27, 0x94, 0x2B, 0x36, 0x24, 0x39, 0x1D, 0x2C, 0x19, + 0xD2, 0x01, 0x12, 0x08, 0xED, 0xFB, 0x51, 0xF6, 0x56, 0x00, 0x9C, 0xE2, + 0xEA, 0xF4, 0xA7, 0xE4, 0x74, 0xEC, 0x10, 0xEC, 0x1C, 0xE9, 0x17, 0xE3, + 0x97, 0xDA, 0x7A, 0xDD, 0xDA, 0xCE, 0x5A, 0xDA, 0x3E, 0xC5, 0xB4, 0xD5, + 0x71, 0xB8, 0xA3, 0xC4, 0x1F, 0xAA, 0xD5, 0xAB, 0x5C, 0xA8, 0x11, 0xAE, + 0x68, 0xB7, 0xBB, 0xB4, 0xD0, 0xB3, 0xC6, 0xAF, 0xAF, 0xA6, 0xAC, 0xB0, + 0x2B, 0xAA, 0x0C, 0xB2, 0xD4, 0xAD, 0x2A, 0xB1, 0x96, 0xB1, 0xA3, 0xB3, + 0x38, 0xBC, 0x0B, 0xBA, 0xD9, 0xCB, 0xBB, 0xB7, 0xB4, 0xD9, 0xE8, 0xB1, + 0x3A, 0xD8, 0x27, 0xBF, 0x10, 0xD7, 0x4B, 0xC9, 0x8D, 0xD5, 0x0F, 0xC4, + 0xB7, 0xCF, 0xB6, 0xBF, 0x3C, 0xE4, 0x13, 0xC7, 0x68, 0x00, 0x6C, 0xDD, + 0x1D, 0x04, 0x3D, 0xF1, 0xF4, 0xF9, 0xE3, 0xF6, 0x9E, 0xF2, 0x88, 0xF7, + 0xE5, 0xEC, 0x6C, 0xFA, 0x73, 0xE0, 0x0D, 0x04, 0xF7, 0xE0, 0xE1, 0x0D, + 0x2A, 0xF6, 0x16, 0x0E, 0xF4, 0x06, 0x9B, 0x15, 0xE6, 0x06, 0x9C, 0x1C, + 0x80, 0x03, 0xBE, 0x1D, 0xE0, 0x05, 0xDF, 0x20, 0x3F, 0x12, 0xA9, 0x1E, + 0x5F, 0x19, 0x4B, 0x19, 0x30, 0x12, 0xBD, 0x15, 0x96, 0xFC, 0xE6, 0x12, + 0xB0, 0xE6, 0x33, 0x0E, 0x97, 0xF8, 0x4E, 0x06, 0x34, 0x15, 0x73, 0x01, + 0xC1, 0x16, 0xE4, 0x02, 0xB2, 0x1E, 0xBA, 0x0E, 0xA1, 0x34, 0x69, 0x1E, + 0x8F, 0x33, 0x73, 0x1D, 0xC0, 0x26, 0x3B, 0x18, 0x8A, 0x2C, 0x0E, 0x22, + 0x80, 0x31, 0x9C, 0x28, 0x17, 0x25, 0xE4, 0x28, 0x49, 0x17, 0x23, 0x25, + 0xC2, 0x18, 0x0A, 0x0F, 0xFF, 0x2A, 0xCE, 0x0A, 0x99, 0x45, 0x94, 0x2E, + 0x1B, 0x52, 0x6B, 0x3C, 0x58, 0x43, 0xC2, 0x33, 0x3D, 0x2D, 0x26, 0x37, + 0x81, 0x2D, 0xD9, 0x2D, 0xAE, 0x3D, 0x21, 0x21, 0xB2, 0x3F, 0x15, 0x20, + 0x06, 0x31, 0x55, 0x1D, 0xE4, 0x20, 0x46, 0x1E, 0x3C, 0x12, 0xD4, 0x23, + 0xAF, 0x1C, 0x8F, 0x2E, 0x1D, 0x3A, 0x7A, 0x2F, 0xF0, 0x43, 0xD7, 0x27, + 0x28, 0x30, 0x51, 0x2A, 0x5A, 0x1A, 0x5E, 0x30, 0x0B, 0x26, 0x78, 0x3C, + 0xD0, 0x30, 0xEB, 0x45, 0x41, 0x20, 0x40, 0x38, 0x88, 0x13, 0x3D, 0x29, + 0xF7, 0x14, 0x04, 0x38, 0x84, 0x0D, 0x5E, 0x3B, 0x16, 0x04, 0x6D, 0x21, + 0x70, 0x00, 0x70, 0x10, 0x49, 0xEC, 0x49, 0x07, 0x66, 0xF1, 0xEA, 0x02, + 0x4E, 0xFA, 0x69, 0xF3, 0x28, 0xE0, 0x29, 0xDB, 0xEF, 0xD7, 0x9B, 0xD6, + 0x8E, 0xDA, 0x52, 0xDC, 0x6F, 0xD7, 0xAA, 0xD2, 0xC1, 0xD4, 0xA6, 0xC1, + 0xE8, 0xC1, 0x04, 0xBC, 0xBF, 0xB9, 0x06, 0xB9, 0x9A, 0xC5, 0xC3, 0xB6, + 0xE3, 0xD3, 0x45, 0xBA, 0x5E, 0xD0, 0x82, 0xBD, 0x8E, 0xB9, 0x41, 0xBE, + 0x95, 0xB0, 0x4E, 0xB6, 0xFC, 0xB4, 0x3A, 0xB5, 0x2D, 0xC0, 0x77, 0xBD, + 0xCC, 0xC0, 0xA4, 0xAC, 0xA8, 0xB3, 0x57, 0xA2, 0xDF, 0xB5, 0x45, 0xB4, + 0x63, 0xCF, 0x4C, 0xC2, 0xA0, 0xDA, 0x22, 0xC9, 0xC8, 0xD6, 0xFF, 0xCD, + 0xC9, 0xDE, 0x7B, 0xCE, 0x8D, 0xDD, 0x09, 0xC6, 0xBF, 0xE3, 0xCF, 0xC4, + 0x63, 0xF9, 0x7D, 0xD4, 0x1E, 0x01, 0xB4, 0xDD, 0x51, 0xF7, 0x15, 0xDA, + 0xC1, 0xE6, 0xA2, 0xD3, 0x72, 0xF5, 0xE1, 0xD8, 0x7F, 0x0C, 0xCF, 0xEE, + 0xC0, 0x10, 0xDB, 0x01, 0xDA, 0x20, 0xD4, 0x07, 0xB0, 0x33, 0xB1, 0x13, + 0xDC, 0x2B, 0x2A, 0x25, 0xC9, 0x19, 0x9B, 0x37, 0xBD, 0x14, 0x9C, 0x44, + 0xF8, 0x15, 0x18, 0x4A, 0x90, 0x16, 0xD0, 0x49, 0x94, 0x25, 0x7C, 0x49, + 0x94, 0x33, 0x5D, 0x4C, 0xA9, 0x1D, 0x4F, 0x4C, 0xF3, 0x01, 0x31, 0x45, + 0x8F, 0x0E, 0xE8, 0x37, 0x51, 0x36, 0x69, 0x44, 0x33, 0x42, 0x8B, 0x5B, + 0x6E, 0x2A, 0x19, 0x55, 0xC4, 0x27, 0x4A, 0x4E, 0xFA, 0x34, 0x0D, 0x52, + 0x16, 0x3C, 0xAF, 0x4E, 0xCF, 0x4C, 0x42, 0x4A, 0xAF, 0x4F, 0xFD, 0x46, + 0x7B, 0x3A, 0x4F, 0x39, 0x08, 0x36, 0x9A, 0x2E, 0x7C, 0x42, 0x00, 0x34, + 0xE1, 0x3F, 0xC1, 0x34, 0x29, 0x32, 0x9C, 0x30, 0xD5, 0x22, 0x4A, 0x2A, + 0xC5, 0x13, 0xDA, 0x1A, 0x29, 0x13, 0x36, 0x13, 0x91, 0x25, 0xB6, 0x0F, + 0x6E, 0x24, 0xE0, 0xFC, 0x27, 0x0A, 0xA3, 0xE9, 0x61, 0xF8, 0x6B, 0xE9, + 0x0B, 0xF7, 0x77, 0xF8, 0xAF, 0xFA, 0x6D, 0xF6, 0x1B, 0x00, 0xD2, 0xE5, + 0x84, 0x09, 0xDE, 0xE2, 0x59, 0x09, 0x42, 0xE3, 0xC2, 0xF6, 0xAA, 0xEB, + 0x6B, 0xE3, 0xB9, 0xEC, 0xAF, 0xF0, 0x66, 0xDF, 0x5C, 0xF6, 0xF0, 0xDF, + 0x94, 0xEC, 0xE0, 0xE3, 0x14, 0xF8, 0x56, 0xDC, 0x07, 0xF2, 0x3D, 0xD6, + 0xF2, 0xDB, 0x53, 0xD6, 0x57, 0xDC, 0xC1, 0xE0, 0x48, 0xDE, 0x8C, 0xE8, + 0x02, 0xD4, 0x27, 0xE3, 0x8C, 0xC8, 0x74, 0xDB, 0x7C, 0xD1, 0xE9, 0xE0, + 0x52, 0xEE, 0xA2, 0xFC, 0x91, 0xEF, 0xD5, 0x0A, 0xA5, 0xE0, 0xC0, 0xFF, + 0x94, 0xE0, 0x5F, 0xEF, 0xB1, 0xD0, 0xA6, 0xD8, 0x92, 0xB5, 0x3E, 0xC7, + 0xDF, 0xB7, 0x37, 0xCE, 0x92, 0xC9, 0x8D, 0xC8, 0x44, 0xC7, 0x97, 0xB3, + 0xB7, 0xC1, 0xA0, 0xBE, 0xCA, 0xD3, 0x4F, 0xCE, 0x6B, 0xE4, 0xC6, 0xDA, + 0x92, 0xE6, 0xB0, 0xE6, 0x70, 0xF1, 0x1D, 0xE2, 0x05, 0x01, 0xA8, 0xEA, + 0x0F, 0xEF, 0xFB, 0xED, 0x53, 0xE2, 0x50, 0xEA, 0x0D, 0xF6, 0x30, 0xF8, + 0xD2, 0xF9, 0x71, 0x00, 0x2A, 0xFD, 0x81, 0x00, 0x69, 0x18, 0x3E, 0x08, + 0xD9, 0x20, 0x22, 0x08, 0x01, 0x13, 0x93, 0x0A, 0xAB, 0x14, 0xBB, 0x17, + 0x79, 0x26, 0x80, 0x26, 0xDA, 0x2B, 0xB3, 0x36, 0x78, 0x25, 0x2B, 0x2C, + 0x0D, 0x29, 0x2B, 0x17, 0x8D, 0x2D, 0x00, 0x14, 0x97, 0x25, 0x4D, 0x17, + 0x3E, 0x28, 0x41, 0x1E, 0x32, 0x3B, 0x41, 0x25, 0x2F, 0x33, 0xBD, 0x1F, + 0x45, 0x21, 0x1A, 0x15, 0x31, 0x2F, 0xDD, 0x19, 0xDA, 0x48, 0xD9, 0x28, + 0x81, 0x42, 0x42, 0x1D, 0xEB, 0x17, 0xC6, 0x03, 0x19, 0x0D, 0xF0, 0x17, + 0x0C, 0x1D, 0x22, 0x34, 0x90, 0x0E, 0x28, 0x2A, 0xC4, 0x07, 0xA1, 0x20, + 0x39, 0x13, 0x1A, 0x21, 0x86, 0xFF, 0x13, 0x1A, 0xF8, 0xEC, 0xDE, 0x17, + 0xA1, 0xF1, 0x85, 0x1D, 0xEE, 0xF8, 0x16, 0x1A, 0x2C, 0xF9, 0x07, 0x0C, + 0xAB, 0xEE, 0xE9, 0x07, 0x75, 0xF1, 0xEB, 0x09, 0x4D, 0xEF, 0x05, 0x0D, + 0x1C, 0xD5, 0x79, 0x05, 0x38, 0xD5, 0xBE, 0xF5, 0xDA, 0xE4, 0x79, 0xFA, + 0xC7, 0xE3, 0x06, 0xFB, 0xCF, 0xF0, 0x43, 0xF1, 0xE6, 0xFF, 0xB2, 0xFB, + 0xB9, 0xF8, 0x8B, 0xFB, 0x87, 0x00, 0x46, 0xF7, 0x48, 0x18, 0xE7, 0x09, + 0xB9, 0x1B, 0x58, 0x1B, 0xFD, 0xFE, 0xC8, 0x13, 0x3A, 0xEF, 0xA0, 0xFE, + 0x4D, 0x02, 0x53, 0x01, 0x85, 0x15, 0x4E, 0x06, 0xEB, 0x21, 0xCD, 0xF4, + 0xA1, 0x12, 0x38, 0xF2, 0xF3, 0xEE, 0x01, 0xF7, 0x51, 0xF3, 0x0B, 0xF3, + 0xED, 0x0F, 0x26, 0xF6, 0x34, 0x1D, 0x61, 0xF2, 0x71, 0x19, 0xF5, 0xE9, + 0x5A, 0x0B, 0x59, 0xEF, 0x5A, 0x12, 0x8B, 0x02, 0xBC, 0x1F, 0x2B, 0x0B, + 0x93, 0x11, 0xCA, 0xFC, 0x12, 0x0F, 0x46, 0xF7, 0xD6, 0x1B, 0x1C, 0xFF, + 0xCB, 0x0E, 0x1A, 0xFA, 0xF2, 0x0A, 0x65, 0xFE, 0x24, 0x17, 0xCF, 0x08, + 0x80, 0x00, 0x98, 0x01, 0x53, 0xE8, 0x6C, 0xFE, 0x88, 0xF8, 0xF0, 0x02, + 0x3A, 0xFB, 0xE7, 0xF9, 0x75, 0xE3, 0xB8, 0xF5, 0xE7, 0xD9, 0xD0, 0xFC, + 0xA2, 0xD9, 0xB9, 0xF7, 0x59, 0xD4, 0x4A, 0xEA, 0x2E, 0xD1, 0xAA, 0xE5, + 0x84, 0xDA, 0x40, 0xEB, 0x66, 0xE3, 0xA7, 0xEF, 0x04, 0xE9, 0xC0, 0xF4, + 0x1D, 0x06, 0x1C, 0x01, 0x85, 0x15, 0x9A, 0x02, 0x5D, 0x00, 0x15, 0xF6, + 0x02, 0xFD, 0x04, 0xF8, 0xEE, 0x19, 0xCD, 0x0D, 0x95, 0x25, 0x9E, 0x12, + 0xA3, 0x17, 0x35, 0x09, 0xA4, 0x0F, 0x95, 0x09, 0xB1, 0x0A, 0x02, 0x10, + 0x3B, 0x02, 0x96, 0x0E, 0x44, 0xFA, 0x4D, 0xFF, 0xC3, 0xED, 0x08, 0xF2, + 0x23, 0xD5, 0x5E, 0xDD, 0x9E, 0xCE, 0x6A, 0xD0, 0x48, 0xE7, 0xF9, 0xDD, + 0xE8, 0xE7, 0xA8, 0xED, 0xCB, 0xCF, 0x41, 0xED, 0x6E, 0xC6, 0x3F, 0xDC, + 0x07, 0xD4, 0x64, 0xDC, 0x41, 0xD8, 0xA1, 0xDF, 0xD1, 0xBE, 0x5B, 0xC4, + 0x0E, 0xC4, 0x76, 0xBE, 0x41, 0xDA, 0xCB, 0xCD, 0xD8, 0xD7, 0x4A, 0xCC, + 0xA4, 0xD7, 0xD4, 0xCC, 0x3B, 0xDD, 0x8E, 0xD1, 0xFB, 0xE3, 0x24, 0xD5, + 0x7B, 0xF5, 0xCB, 0xDB, 0xD3, 0x13, 0x60, 0xE8, 0xC1, 0x1E, 0xA1, 0xF7, + 0x85, 0x09, 0xCE, 0xF6, 0xE8, 0xF8, 0x52, 0xFA, 0x6D, 0xFC, 0x1B, 0x08, + 0x4F, 0x13, 0xA9, 0x16, 0xAA, 0x1A, 0x2A, 0x28, 0x5B, 0x0A, 0x81, 0x25, + 0x8C, 0x0E, 0x42, 0x2E, 0x2E, 0x18, 0x88, 0x41, 0xA0, 0x1B, 0x4F, 0x3C, + 0xE1, 0x26, 0x3B, 0x3C, 0xB3, 0x29, 0x33, 0x3F, 0x23, 0x16, 0xD5, 0x26, + 0x74, 0x16, 0xD4, 0x22, 0x6A, 0x20, 0xEE, 0x31, 0xA9, 0x14, 0x86, 0x2F, + 0x56, 0x0D, 0xDA, 0x20, 0x92, 0x17, 0x63, 0x18, 0x12, 0x23, 0x16, 0x1F, + 0xDF, 0x25, 0x88, 0x1F, 0x2F, 0x38, 0xD9, 0x27, 0x67, 0x3E, 0x6A, 0x24, + 0x9E, 0x39, 0xD9, 0x19, 0x55, 0x4B, 0x32, 0x2C, 0x54, 0x3F, 0x1E, 0x33, + 0x26, 0x15, 0x21, 0x1F, 0xAC, 0x0C, 0xE1, 0x07, 0x24, 0x27, 0xCA, 0xFD, + 0xD2, 0x30, 0x66, 0x03, 0x8B, 0x1D, 0xAE, 0x07, 0x6C, 0x0B, 0xBA, 0x05, + 0xCD, 0x04, 0x48, 0x0C, 0x74, 0x05, 0xF7, 0x0C, 0x11, 0x10, 0xEE, 0x03, + 0x29, 0x1A, 0x65, 0x03, 0x56, 0x0A, 0xA2, 0xFE, 0x3F, 0xF5, 0x69, 0x03, + 0xF4, 0x00, 0xAA, 0x0E, 0x95, 0x10, 0xE9, 0x0D, 0xE6, 0x03, 0x7F, 0x02, + 0x9F, 0xF5, 0x54, 0xF6, 0x5A, 0xF8, 0x1E, 0xF6, 0x84, 0x01, 0x52, 0xF9, + 0xFB, 0x00, 0x62, 0xFD, 0x2B, 0xF2, 0xCE, 0xF7, 0x43, 0xE9, 0xED, 0xF2, + 0xA4, 0xF2, 0x3D, 0x04, 0xB1, 0xEF, 0xDD, 0x07, 0x49, 0xDB, 0x3A, 0xFB, + 0x69, 0xD7, 0x06, 0xFD, 0x7A, 0xDD, 0x4B, 0xFB, 0xEA, 0xD4, 0x0A, 0xF2, + 0x82, 0xCD, 0x7A, 0xF5, 0x1A, 0xD2, 0x4A, 0xF7, 0x87, 0xD4, 0x77, 0xE8, + 0x28, 0xD8, 0x02, 0xE0, 0x87, 0xD1, 0x47, 0xDC, 0x5F, 0xCB, 0x21, 0xDB, + 0xAF, 0xDD, 0x17, 0xE4, 0x5D, 0xE4, 0x1C, 0xE1, 0x9A, 0xD7, 0x9C, 0xD4, + 0xB1, 0xE3, 0xAE, 0xD4, 0x27, 0xF5, 0xDE, 0xDE, 0x06, 0xEA, 0x4F, 0xE4, + 0x3D, 0xF0, 0x44, 0xEA, 0xBE, 0x07, 0xE5, 0xF4, 0x4B, 0x00, 0x1D, 0xFA, + 0x8E, 0xEA, 0x36, 0x00, 0x66, 0xE8, 0x85, 0xF5, 0x69, 0xEF, 0xCA, 0xD9, + 0xCC, 0xEF, 0x04, 0xD5, 0x6C, 0xF1, 0x3B, 0xE4, 0x19, 0xF6, 0x4F, 0xF4, + 0x71, 0xEF, 0x55, 0xE8, 0x81, 0xE2, 0x45, 0xD0, 0xC0, 0xF2, 0x05, 0xE2, + 0x3E, 0x06, 0x6A, 0xF1, 0x57, 0x06, 0x8F, 0xE7, 0xE4, 0x05, 0x38, 0xE4, + 0x56, 0x0F, 0x6D, 0xEA, 0x51, 0x1A, 0x27, 0xF3, 0xEC, 0x13, 0x29, 0xF8, + 0x5A, 0x15, 0x6A, 0xFE, 0x06, 0x1E, 0xD5, 0xF3, 0xA5, 0x25, 0xCB, 0xE3, + 0x60, 0x3B, 0x05, 0xF8, 0x98, 0x3F, 0x30, 0x1B, 0x97, 0x24, 0x61, 0x1D, + 0x2C, 0x18, 0x10, 0x16, 0x45, 0x33, 0x0C, 0x24, 0xDD, 0x38, 0x50, 0x2C, + 0x34, 0x18, 0x7D, 0x31, 0x04, 0x07, 0x96, 0x32, 0x2D, 0x07, 0xF6, 0x2E, + 0xB1, 0x06, 0x2F, 0x31, 0x93, 0x0A, 0x73, 0x2E, 0x69, 0x11, 0x0A, 0x2D, + 0xF6, 0x15, 0xD1, 0x31, 0x47, 0x0A, 0x73, 0x31, 0xE3, 0x07, 0x43, 0x36, + 0x9F, 0x1C, 0xA6, 0x45, 0x6B, 0x17, 0x7A, 0x3F, 0xE2, 0x03, 0x5B, 0x28, + 0x79, 0x02, 0xDA, 0x23, 0x01, 0x04, 0x5E, 0x23, 0x97, 0x0E, 0x09, 0x1E, + 0x05, 0x1A, 0x2E, 0x11, 0xCB, 0x1A, 0x50, 0x00, 0xD2, 0x12, 0x56, 0x03, + 0x66, 0x02, 0xA7, 0x14, 0x6A, 0xFA, 0x9D, 0x15, 0x22, 0xF4, 0xE1, 0xFD, + 0xC7, 0xED, 0xB3, 0xE7, 0xCF, 0xF1, 0x51, 0xE3, 0xAC, 0xF1, 0x3D, 0xED, + 0x5D, 0xEA, 0x64, 0xF3, 0x8E, 0xE9, 0x1A, 0xEC, 0x95, 0xE0, 0x90, 0xE0, + 0x94, 0xD9, 0xC0, 0xE2, 0x4E, 0xE1, 0x05, 0xE6, 0xC1, 0xE4, 0x41, 0xDF, + 0x20, 0xE3, 0xE9, 0xDB, 0xFE, 0xE2, 0x79, 0xE3, 0x26, 0xE4, 0xB7, 0xEA, + 0xAE, 0xE0, 0xD2, 0xE3, 0xCC, 0xE5, 0xBA, 0xD5, 0x84, 0xF3, 0xA1, 0xCD, + 0x80, 0xF1, 0x03, 0xD6, 0x1B, 0xF2, 0xA6, 0xE6, 0x94, 0xFD, 0xFA, 0xEE, + 0x63, 0xFC, 0xFA, 0xE8, 0x3A, 0xFC, 0xE5, 0xE9, 0x6C, 0xFB, 0xB0, 0xF7, + 0x86, 0xF9, 0x68, 0x06, 0xB6, 0xFD, 0x33, 0x08, 0x1E, 0xFD, 0x8D, 0xFE, + 0xCB, 0xEC, 0xF3, 0xFA, 0xD1, 0xE4, 0x6A, 0xFB, 0xE5, 0xF2, 0xC0, 0x03, + 0x2E, 0xF2, 0xCC, 0x02, 0x4D, 0xF1, 0x06, 0xFB, 0x6D, 0xFA, 0x1A, 0xF8, + 0xE3, 0xF9, 0x86, 0xF2, 0x9C, 0xF9, 0xA5, 0xF7, 0xA4, 0x05, 0x01, 0xFF, + 0x35, 0x11, 0xAF, 0xF9, 0xA2, 0x08, 0xE8, 0xEE, 0x7B, 0x06, 0xA3, 0xEC, + 0x78, 0x16, 0x39, 0xFA, 0xFD, 0x16, 0x06, 0xFE, 0x64, 0x12, 0x5A, 0xF9, + 0xAC, 0x0E, 0x07, 0x00, 0x74, 0xFD, 0xCB, 0xFF, 0x2B, 0xEE, 0xD2, 0xF3, + 0x12, 0xEA, 0xCB, 0xE3, 0xA9, 0xF2, 0xB5, 0xDA, 0xC2, 0xF4, 0x50, 0xDE, + 0x49, 0xF7, 0x74, 0xEF, 0xE7, 0x00, 0x25, 0xFE, 0x44, 0xFC, 0x3D, 0x02, + 0xC6, 0xE5, 0x3F, 0xF7, 0x7D, 0xE9, 0xC3, 0xFA, 0x2D, 0x0E, 0x1A, 0x11, + 0x15, 0x19, 0x39, 0x0C, 0xFC, 0x09, 0xB6, 0x00, 0x0F, 0x06, 0x6E, 0x05, + 0xAC, 0x07, 0xE8, 0x0B, 0x21, 0x07, 0x91, 0x0D, 0x4F, 0x13, 0xBE, 0x06, + 0x15, 0x18, 0xD8, 0xFC, 0x28, 0x16, 0x44, 0xF9, 0x5A, 0x19, 0xAC, 0xFA, + 0x21, 0x13, 0xC4, 0x03, 0x7A, 0x06, 0x10, 0x06, 0xEB, 0x02, 0xAF, 0x00, + 0x27, 0x02, 0xF5, 0x03, 0xA2, 0x02, 0xEE, 0x13, 0x7A, 0xF8, 0x7B, 0x19, + 0xA3, 0xE5, 0xD4, 0x0C, 0x65, 0xD9, 0x7B, 0x09, 0x98, 0xD4, 0xD1, 0x0F, + 0x05, 0xE3, 0xF6, 0x10, 0xB0, 0xF1, 0xF9, 0x0F, 0x89, 0xE9, 0x69, 0x09, + 0x7C, 0xDF, 0x37, 0x07, 0x13, 0xDF, 0xC0, 0x09, 0x2E, 0xED, 0xF1, 0x08, + 0x4E, 0xF8, 0xEA, 0x0C, 0x62, 0xE2, 0x28, 0x04, 0x88, 0xD3, 0x12, 0xFA, + 0x46, 0xDB, 0xE5, 0xF4, 0x42, 0xED, 0x27, 0xEC, 0x2B, 0x0B, 0x78, 0xE7, + 0x95, 0x0F, 0x73, 0xE7, 0xE8, 0xFE, 0x51, 0xF9, 0x46, 0x08, 0x99, 0x1E, + 0x47, 0x15, 0x0A, 0x23, 0x37, 0x0E, 0x1D, 0x03, 0x6C, 0x03, 0xB1, 0xF0, + 0xC9, 0x05, 0x5A, 0xF4, 0x49, 0x08, 0x6D, 0xFA, 0x47, 0xFD, 0x66, 0xF2, + 0xB5, 0xFF, 0x85, 0xED, 0x9E, 0x09, 0xEB, 0xF3, 0x0E, 0x06, 0x1C, 0xF7, + 0xA2, 0x0B, 0x84, 0xF5, 0xC4, 0x1D, 0x2C, 0xF7, 0xDB, 0x1D, 0xC0, 0xFC, + 0x59, 0x12, 0x30, 0x05, 0x96, 0x18, 0x27, 0x17, 0xFA, 0x24, 0xC6, 0x14, + 0x8D, 0x1F, 0x3F, 0x03, 0xCF, 0x0C, 0x4C, 0xF8, 0xAA, 0x14, 0x8E, 0xFB, + 0xBA, 0x2B, 0x81, 0x0F, 0x8C, 0x24, 0x7B, 0x10, 0x25, 0x11, 0xAA, 0x04, + 0x83, 0x12, 0xA1, 0x08, 0x38, 0x20, 0x56, 0x1A, 0x85, 0x24, 0x93, 0x29, + 0xD2, 0x21, 0xD2, 0x28, 0xCB, 0x1C, 0x1E, 0x26, 0xD7, 0x0A, 0x6D, 0x27, + 0x1A, 0x09, 0x3D, 0x2C, 0xFE, 0x1B, 0x61, 0x32, 0xF3, 0x23, 0x20, 0x30, + 0x22, 0x14, 0xB0, 0x1C, 0xF1, 0x0B, 0x41, 0x1A, 0xBF, 0x1A, 0xBF, 0x20, + 0x05, 0x18, 0xEA, 0x07, 0x92, 0x0C, 0x5D, 0xFC, 0x09, 0x03, 0xCB, 0xFC, + 0xE5, 0x00, 0xD5, 0xF3, 0xAE, 0x11, 0x5D, 0xF0, 0xB0, 0x1B, 0x7F, 0xF3, + 0x34, 0x0F, 0xAE, 0xFB, 0xC3, 0xFC, 0xD7, 0xF9, 0x9A, 0xF0, 0xFE, 0xF3, + 0xBF, 0xEB, 0x5F, 0xF6, 0x8C, 0xDC, 0xB6, 0xE6, 0x83, 0xC3, 0x36, 0xD3, + 0x4F, 0xC5, 0x28, 0xCF, 0x90, 0xCF, 0x7F, 0xCF, 0x38, 0xC8, 0x5F, 0xD0, + 0xF0, 0xC5, 0xFB, 0xD6, 0xF6, 0xB8, 0x8C, 0xDF, 0xED, 0xA8, 0x97, 0xD7, + 0xA8, 0xB4, 0x88, 0xC6, 0x54, 0xD0, 0xFD, 0xC4, 0xE3, 0xCE, 0x9E, 0xBF, + 0x5D, 0xB2, 0x29, 0xB8, 0x24, 0xAB, 0xE3, 0xC0, 0x70, 0xBF, 0x59, 0xD2, + 0xC1, 0xCF, 0xDC, 0xD5, 0x80, 0xE1, 0x2C, 0xCE, 0xD7, 0xF3, 0xFF, 0xD2, + 0x45, 0xEF, 0x5E, 0xD7, 0xEB, 0xEE, 0xB7, 0xD9, 0x7B, 0xF8, 0xED, 0xE1, + 0x25, 0xEC, 0x17, 0xDC, 0xC8, 0xE0, 0x5E, 0xD7, 0x85, 0xED, 0x0F, 0xEB, + 0xB7, 0xEE, 0xFA, 0xF3, 0xCF, 0xDD, 0xAD, 0xF5, 0x36, 0xD7, 0x9B, 0x0A, + 0xD3, 0xE7, 0x77, 0x1A, 0x17, 0x01, 0xE6, 0x20, 0x77, 0x0F, 0x6C, 0x2B, + 0xA9, 0x0E, 0x88, 0x32, 0x2F, 0x0D, 0xC3, 0x33, 0xD7, 0x1A, 0xDE, 0x35, + 0x90, 0x2F, 0xA6, 0x3F, 0xD5, 0x33, 0x84, 0x3E, 0xE0, 0x22, 0xAE, 0x38, + 0x54, 0x14, 0xAC, 0x3F, 0x49, 0x15, 0x37, 0x37, 0x3F, 0x2A, 0x0D, 0x1F, + 0xDE, 0x42, 0xA8, 0x17, 0xA9, 0x42, 0x8C, 0x1C, 0x06, 0x3C, 0x60, 0x23, + 0xE3, 0x43, 0x19, 0x33, 0x6F, 0x48, 0x5F, 0x38, 0xD9, 0x46, 0x2F, 0x2C, + 0xD7, 0x43, 0x84, 0x1E, 0xA3, 0x3F, 0x43, 0x19, 0xF4, 0x3C, 0xBB, 0x20, + 0x70, 0x3F, 0xAD, 0x2B, 0xB1, 0x41, 0x4D, 0x2A, 0x2A, 0x34, 0xC7, 0x1C, + 0x5C, 0x32, 0x8F, 0x18, 0xFC, 0x32, 0x75, 0x13, 0x1F, 0x25, 0x0A, 0x0A, + 0xD8, 0x18, 0x43, 0x04, 0x01, 0x0C, 0xEB, 0xFE, 0xFC, 0x0C, 0x64, 0xFA, + 0x88, 0x10, 0xB1, 0xFB, 0x9D, 0x06, 0xF7, 0xFF, 0xBA, 0xEF, 0x42, 0xF3, + 0x1F, 0xE6, 0xA8, 0xE5, 0x74, 0xFD, 0x07, 0xEB, 0x6B, 0x07, 0xDB, 0xEF, + 0xC3, 0xED, 0x14, 0xE7, 0xEC, 0xCF, 0xD8, 0xE0, 0xD2, 0xD7, 0x19, 0xF0, + 0x36, 0xF3, 0xFC, 0xFB, 0xDE, 0xFA, 0xFB, 0xFD, 0x72, 0xEB, 0x0F, 0x06, + 0xC6, 0xD2, 0x7F, 0x01, 0xE7, 0xCE, 0xDB, 0xF9, 0xFB, 0xDA, 0xEA, 0xFE, + 0x89, 0xDA, 0xB1, 0xF5, 0x12, 0xCA, 0xB3, 0xE8, 0xEE, 0xC1, 0xC4, 0xEB, + 0xCD, 0xC6, 0x1D, 0xE8, 0x09, 0xD4, 0x84, 0xE1, 0x57, 0xD6, 0xEB, 0xDE, + 0x5A, 0xC3, 0xCF, 0xDD, 0x3D, 0xCA, 0x2F, 0xD5, 0x72, 0xE3, 0x0E, 0xCC, + 0xD6, 0xE7, 0x1B, 0xD6, 0xFB, 0xE3, 0xBE, 0xD6, 0xBF, 0xD7, 0xD8, 0xC7, + 0xB6, 0xDB, 0x34, 0xD7, 0xCE, 0xEC, 0x6E, 0xF0, 0xDD, 0xE2, 0xE3, 0xE5, + 0xF6, 0xD1, 0x02, 0xD4, 0x85, 0xD3, 0xD6, 0xD8, 0x35, 0xE9, 0x2F, 0xE3, + 0x8F, 0xFE, 0xD9, 0xE1, 0x4E, 0xF7, 0xA5, 0xE2, 0xC4, 0xE0, 0x89, 0xEA, + 0xA7, 0xD4, 0x63, 0xE8, 0x29, 0xDD, 0xD7, 0xE5, 0xC6, 0x01, 0x32, 0xEF, + 0xCB, 0x09, 0xCC, 0xEA, 0xE2, 0xEC, 0x85, 0xE1, 0x1F, 0xEB, 0x30, 0xF1, + 0x12, 0xFF, 0x7B, 0x05, 0x12, 0x11, 0x18, 0x03, 0x24, 0x19, 0x74, 0xFB, + 0x5E, 0x1D, 0xC8, 0x04, 0xA4, 0x28, 0x7E, 0x09, 0x8E, 0x35, 0xEC, 0x05, + 0x23, 0x2F, 0x61, 0x06, 0xAD, 0x21, 0xA6, 0x09, 0xD3, 0x29, 0x7D, 0x0F, + 0x49, 0x3C, 0x8D, 0x18, 0x62, 0x42, 0x5F, 0x28, 0xEF, 0x2A, 0xE9, 0x2B, + 0x66, 0x16, 0x10, 0x27, 0x49, 0x20, 0x3A, 0x35, 0x25, 0x2B, 0x5E, 0x3D, + 0xCA, 0x2E, 0xF0, 0x39, 0xC4, 0x27, 0x2F, 0x3D, 0x87, 0x14, 0x6A, 0x3A, + 0xDD, 0x15, 0x4B, 0x32, 0x15, 0x2C, 0x2D, 0x30, 0x49, 0x2A, 0x1B, 0x31, + 0x6B, 0x10, 0xE9, 0x32, 0xB0, 0xF9, 0xD3, 0x2B, 0x80, 0xF2, 0x49, 0x21, + 0xED, 0xF6, 0x5B, 0x16, 0xCB, 0x07, 0x17, 0x09, 0x74, 0x14, 0xEA, 0xFF, + 0x0C, 0x00, 0xCA, 0xFB, 0xCC, 0xF4, 0x3C, 0x01, 0x0B, 0x02, 0x44, 0x04, + 0x8D, 0xF9, 0xD2, 0x00, 0x78, 0xE3, 0xB6, 0xF8, 0xE7, 0xE3, 0x65, 0xE6, + 0x9C, 0xED, 0x30, 0xDB, 0x72, 0xE9, 0x98, 0xEA, 0x1D, 0xDF, 0xB6, 0xF1, + 0x4F, 0xDB, 0x2E, 0xE3, 0x2F, 0xDF, 0x3C, 0xE4, 0xEA, 0xE5, 0x93, 0xE9, + 0xFC, 0xE7, 0x85, 0xE4, 0x76, 0xE8, 0xE4, 0xED, 0x68, 0xE3, 0x6A, 0xF5, + 0xA8, 0xF3, 0xA5, 0xF5, 0x80, 0x13, 0x6A, 0x00, 0xE9, 0x0B, 0x48, 0x07, + 0x9C, 0xF3, 0x07, 0x00, 0x0A, 0x00, 0xCC, 0xF9, 0x8A, 0x1A, 0xA7, 0xFE, + 0xBC, 0x17, 0x1A, 0x01, 0x92, 0x07, 0x94, 0xFF, 0xE1, 0x05, 0x95, 0x07, + 0x8B, 0x0E, 0xB9, 0x0A, 0x27, 0x16, 0x72, 0x07, 0xC3, 0x2A, 0x93, 0x18, + 0x6B, 0x32, 0xE3, 0x26, 0x4C, 0x11, 0x8D, 0x1E, 0x6C, 0x06, 0x04, 0x23, + 0x77, 0x1C, 0x70, 0x31, 0x73, 0x14, 0x82, 0x25, 0xA4, 0x01, 0xCD, 0x12, + 0xCB, 0x03, 0xDB, 0x0F, 0x56, 0x0F, 0x9A, 0x16, 0xCA, 0x17, 0x22, 0x1C, + 0x50, 0x0C, 0xCB, 0x0F, 0x4B, 0x05, 0x30, 0xFF, 0x9B, 0x07, 0x52, 0xF8, + 0x4C, 0x06, 0xE3, 0xF3, 0x8A, 0x10, 0xC7, 0xEC, 0x5F, 0x17, 0x29, 0xE9, + 0x42, 0x0F, 0xE2, 0xEE, 0x3D, 0x10, 0x4B, 0xF5, 0xD0, 0x18, 0x21, 0xF8, + 0xDD, 0x10, 0x26, 0xFF, 0xA9, 0xFA, 0xAD, 0xFF, 0xFD, 0xEA, 0x2C, 0xEF, + 0x41, 0xF9, 0x8B, 0xE6, 0xBC, 0x09, 0xAD, 0xE9, 0x47, 0x02, 0x36, 0xEA, + 0x4E, 0xE9, 0xF1, 0xE5, 0x71, 0xCF, 0x40, 0xE9, 0x87, 0xD4, 0x81, 0xEA, + 0x27, 0xE3, 0xF5, 0xD8, 0xBF, 0xDD, 0xE8, 0xCD, 0x7C, 0xD1, 0x07, 0xC9, + 0xBD, 0xCF, 0x23, 0xC7, 0x76, 0xC6, 0xF2, 0xC8, 0x69, 0xB9, 0xAD, 0xC5, + 0x48, 0xC7, 0x40, 0xC6, 0xCC, 0xD8, 0x12, 0xC2, 0x07, 0xE3, 0x8F, 0xC5, + 0x98, 0xE6, 0x00, 0xD2, 0x34, 0xDF, 0x34, 0xD4, 0x93, 0xDB, 0x16, 0xDA, + 0x82, 0xE9, 0x89, 0xE2, 0x81, 0x04, 0x6E, 0xE5, 0xAB, 0x0A, 0x9C, 0xEB, + 0x28, 0xF2, 0x56, 0xF4, 0x15, 0xE2, 0x01, 0x03, 0xD8, 0xEF, 0x5D, 0x0D, + 0xA9, 0x04, 0xED, 0x12, 0xD7, 0xFC, 0xD6, 0x20, 0xCB, 0xEB, 0x7B, 0x28, + 0x90, 0xEA, 0x02, 0x20, 0x3C, 0xF2, 0xFA, 0x18, 0xDC, 0x0A, 0x6B, 0x22, + 0xFC, 0x18, 0x06, 0x29, 0x32, 0x02, 0x61, 0x24, 0x96, 0xF6, 0x90, 0x34, + 0x14, 0x05, 0x1D, 0x3F, 0xBD, 0x0A, 0xC3, 0x2C, 0x06, 0x04, 0x82, 0x1F, + 0x3D, 0x0A, 0x2C, 0x1D, 0xB0, 0x1B, 0xD5, 0x1C, 0xEA, 0x23, 0xAB, 0x23, + 0xD6, 0x2D, 0x61, 0x34, 0x81, 0x32, 0xFD, 0x3B, 0xC2, 0x25, 0x1A, 0x2A, + 0xA6, 0x29, 0x5F, 0x1B, 0xF4, 0x38, 0xC1, 0x21, 0xFD, 0x2B, 0x67, 0x1D, + 0xF7, 0x0D, 0x2D, 0x0D, 0x2A, 0x0B, 0xBB, 0x0E, 0x8C, 0x26, 0xE1, 0x19, + 0x60, 0x2A, 0x79, 0x0E, 0xB8, 0x18, 0xC8, 0x02, 0xBF, 0x0B, 0x61, 0x07, + 0xE4, 0x0F, 0x3B, 0x03, 0xFD, 0x27, 0xF8, 0x05, 0x10, 0x2D, 0x44, 0x11, + 0x5B, 0x1E, 0x5B, 0x11, 0xBC, 0x15, 0xA0, 0x08, 0x37, 0x19, 0x50, 0x0B, + 0xF0, 0x26, 0x78, 0x18, 0x9E, 0x29, 0xC5, 0x10, 0xB3, 0x14, 0x8F, 0x03, + 0xC9, 0x05, 0x3B, 0x03, 0xD8, 0x11, 0x60, 0xFF, 0x33, 0x20, 0x0F, 0xFF, + 0x08, 0x16, 0xF4, 0x05, 0x4B, 0x05, 0xDB, 0x06, 0xE7, 0x01, 0xF1, 0xFD, + 0xFA, 0xFD, 0xB2, 0xFA, 0x27, 0xF0, 0xB3, 0x02, 0x08, 0xDF, 0x13, 0xFC, + 0x64, 0xD6, 0x56, 0xE8, 0x91, 0xE1, 0xE7, 0xE8, 0x6B, 0xF0, 0xDF, 0xF0, + 0x7C, 0xEB, 0xF6, 0xE6, 0xF7, 0xD9, 0xBC, 0xE1, 0x44, 0xDB, 0xC7, 0xE8, + 0xDD, 0xE3, 0xE5, 0xE2, 0x01, 0xE0, 0x5E, 0xD3, 0x66, 0xD8, 0x88, 0xCA, + 0xC9, 0xD2, 0x25, 0xC7, 0xDE, 0xE4, 0x8B, 0xC8, 0xFF, 0xFA, 0xD1, 0xD4, + 0x66, 0xFF, 0x2A, 0xE7, 0x56, 0xF6, 0xE4, 0xEF, 0xA1, 0xE0, 0x82, 0xF2, + 0x73, 0xD8, 0x3A, 0xEE, 0xEF, 0xE3, 0x55, 0xE4, 0x34, 0xE9, 0x94, 0xD8, + 0xE8, 0xE5, 0xD9, 0xD6, 0xF2, 0xD3, 0xD4, 0xD9, 0xB7, 0xCA, 0x24, 0xE0, + 0x91, 0xCE, 0x29, 0xE2, 0xD3, 0xC1, 0x1E, 0xD5, 0x26, 0xBF, 0x79, 0xCC, + 0x8A, 0xD2, 0x9D, 0xD0, 0xE3, 0xDC, 0xCE, 0xD9, 0xB4, 0xD1, 0x4B, 0xDB, + 0x90, 0xC6, 0x0F, 0xDB, 0xBA, 0xCE, 0xEB, 0xDA, 0xFD, 0xE1, 0xE1, 0xDF, + 0x80, 0xFE, 0x8B, 0xEC, 0xC9, 0x14, 0x2B, 0xF3, 0xB5, 0x09, 0xA0, 0xF7, + 0x76, 0xFA, 0x5B, 0xFB, 0xFB, 0x10, 0xE8, 0xFE, 0xA8, 0x35, 0x5C, 0x07, + 0x83, 0x30, 0x1D, 0x0B, 0xE8, 0x16, 0xDB, 0x15, 0xF7, 0x18, 0xA9, 0x24, + 0x21, 0x1D, 0x74, 0x24, 0x1D, 0x17, 0x97, 0x23, 0x26, 0x1D, 0x2D, 0x32, + 0xEE, 0x1D, 0x41, 0x48, 0xDE, 0x16, 0xE3, 0x4D, 0x5B, 0x28, 0x20, 0x49, + 0x28, 0x3F, 0x9F, 0x4A, 0x8B, 0x33, 0xD9, 0x40, 0x04, 0x1A, 0x7A, 0x39, + 0x5C, 0x1B, 0x80, 0x47, 0xF1, 0x11, 0xCF, 0x44, 0xD7, 0xED, 0x46, 0x2B, + 0xF1, 0xEE, 0xB0, 0x17, 0xD7, 0x02, 0x9F, 0x0D, 0x9C, 0xFE, 0x9B, 0x00, + 0xD7, 0xFE, 0x3A, 0xF5, 0x78, 0x07, 0xB9, 0xFD, 0x04, 0xFF, 0x68, 0xFD, + 0x70, 0xF2, 0x14, 0xEC, 0x34, 0xFE, 0x68, 0xE7, 0x26, 0x07, 0xA6, 0xE2, + 0x3A, 0xF0, 0x7B, 0xD7, 0x66, 0xE2, 0xA0, 0xD7, 0xF2, 0xF1, 0x49, 0xE2, + 0xA3, 0xFB, 0xDA, 0xDE, 0x11, 0xE7, 0xA1, 0xCD, 0xCA, 0xD8, 0xED, 0xCB, + 0xC9, 0xDC, 0xD3, 0xCE, 0x6C, 0xE6, 0x89, 0xCD, 0x26, 0xF3, 0x31, 0xD9, + 0x73, 0xEC, 0x2F, 0xDE, 0x5E, 0xE5, 0x6D, 0xDD, 0x09, 0xEB, 0x52, 0xE2, + 0xC8, 0xFD, 0x88, 0xE1, 0xDA, 0x0D, 0xAD, 0xDF, 0x65, 0x00, 0xF9, 0xE6, + 0x32, 0xF4, 0x77, 0xF4, 0x8D, 0x04, 0x73, 0xF8, 0xF9, 0x14, 0x3E, 0xF6, + 0x49, 0x1A, 0xFE, 0xFE, 0x8B, 0x10, 0x5A, 0x05, 0x5F, 0x02, 0x0D, 0x09, + 0x52, 0x14, 0x7C, 0x17, 0x50, 0x21, 0x5A, 0x16, 0x65, 0x11, 0xD9, 0x0A, + 0x76, 0x09, 0x69, 0x1D, 0xC2, 0x08, 0x45, 0x32, 0x18, 0x0D, 0x25, 0x28, + 0x71, 0x0E, 0x4E, 0x15, 0x79, 0x02, 0x60, 0x18, 0xA9, 0xFF, 0xCF, 0x28, + 0x04, 0x04, 0x8E, 0x27, 0x28, 0x08, 0x25, 0x21, 0x1E, 0x0D, 0x86, 0x21, + 0x90, 0xFB, 0xDE, 0x0F, 0x8A, 0xEF, 0x74, 0x00, 0xFC, 0x03, 0x67, 0x0A, + 0x60, 0x13, 0x24, 0x03, 0xB9, 0x08, 0x2D, 0xEE, 0xE7, 0xFB, 0x2C, 0xF7, + 0xE8, 0xF9, 0x01, 0x0F, 0x8C, 0xEF, 0xAF, 0x09, 0x15, 0xEA, 0x57, 0xF3, + 0x5E, 0xFA, 0x36, 0xF8, 0x75, 0x09, 0x55, 0x0A, 0x5C, 0x07, 0xC7, 0x0B, + 0x40, 0x02, 0x9C, 0x07, 0x07, 0x01, 0xD1, 0x0A, 0x3E, 0xF8, 0x60, 0x0F, + 0x63, 0xFA, 0x88, 0x13, 0xB7, 0x11, 0x45, 0x1C, 0x9A, 0x1F, 0x6C, 0x1A, + 0xD7, 0x18, 0x8C, 0x0A, 0x36, 0x0C, 0x4D, 0x0E, 0x31, 0x12, 0x3A, 0x25, + 0xBC, 0x2F, 0x25, 0x2B, 0x8B, 0x40, 0x4C, 0x1F, 0x2E, 0x40, 0xDE, 0x25, + 0x5E, 0x42, 0xFD, 0x36, 0xA1, 0x47, 0xBA, 0x36, 0xC0, 0x4F, 0x64, 0x26, + 0xFD, 0x53, 0xB5, 0x19, 0x12, 0x41, 0x59, 0x16, 0xB1, 0x26, 0xF8, 0x12, + 0xE1, 0x19, 0x46, 0x09, 0x21, 0x17, 0x19, 0xFD, 0xCC, 0x15, 0x21, 0xFA, + 0xC4, 0x00, 0x3A, 0x01, 0x90, 0xE3, 0x85, 0x02, 0xDD, 0xD8, 0x04, 0xF8, + 0x70, 0xD5, 0xEC, 0xE4, 0xBB, 0xD2, 0x94, 0xD9, 0x88, 0xCD, 0x0B, 0xD9, + 0xB4, 0xCD, 0xAE, 0xD4, 0x6E, 0xD3, 0x4B, 0xD1, 0x16, 0xC4, 0xA5, 0xD5, + 0x9E, 0xB0, 0xC4, 0xD6, 0x75, 0xA9, 0x20, 0xCC, 0x4C, 0xA9, 0xE7, 0xBF, + 0x20, 0xB7, 0x98, 0xB3, 0xDB, 0xC0, 0xAE, 0xB0, 0x86, 0xBD, 0xF6, 0xBC, + 0xEC, 0xC5, 0x4B, 0xCB, 0x77, 0xD7, 0xBB, 0xCF, 0xB8, 0xD9, 0xD9, 0xC6, + 0x15, 0xD3, 0x73, 0xBF, 0xF3, 0xCA, 0x54, 0xC4, 0x04, 0xC8, 0xCA, 0xC6, + 0x25, 0xD1, 0xDF, 0xC1, 0x6D, 0xE0, 0x1D, 0xCD, 0x3F, 0xEC, 0x28, 0xE8, + 0x11, 0xEB, 0x20, 0xF7, 0xE8, 0xED, 0xE7, 0xF6, 0xEB, 0xFF, 0xCC, 0xF5, + 0xD4, 0xFF, 0xCB, 0xEA, 0x87, 0xED, 0x6C, 0xEB, 0x89, 0xEB, 0xB4, 0x05, + 0xB1, 0xF5, 0x23, 0x02, 0x36, 0x01, 0xF3, 0xEC, 0xD0, 0x0C, 0x84, 0xFC, + 0xEE, 0x0F, 0x54, 0x15, 0x2B, 0x08, 0x52, 0x16, 0x9B, 0x01, 0xC1, 0x09, + 0xB4, 0x13, 0x4E, 0x08, 0x59, 0x19, 0x80, 0x08, 0xAA, 0x04, 0xAE, 0x04, + 0xE1, 0x0B, 0xBA, 0x0F, 0x21, 0x16, 0xAC, 0x12, 0x8F, 0x0A, 0x5E, 0x0C, + 0xBC, 0x15, 0xD7, 0x20, 0x9C, 0x27, 0x2C, 0x41, 0x79, 0x24, 0x33, 0x4D, + 0x1A, 0x25, 0x7F, 0x43, 0xFF, 0x26, 0x18, 0x3A, 0x79, 0x25, 0x05, 0x48, + 0xBE, 0x22, 0x66, 0x47, 0xE9, 0x28, 0xE3, 0x37, 0x06, 0x34, 0x83, 0x3B, + 0x2D, 0x29, 0xB6, 0x32, 0x6A, 0x0F, 0x31, 0x24, 0xD9, 0x14, 0xEA, 0x29, + 0xCB, 0x2E, 0xA6, 0x24, 0xD3, 0x37, 0x00, 0x11, 0x26, 0x3C, 0x54, 0x0E, + 0x9A, 0x37, 0x9B, 0x1D, 0x7F, 0x2C, 0xA5, 0x23, 0x94, 0x2C, 0x1C, 0x1B, + 0xE5, 0x20, 0xB7, 0x13, 0x49, 0x0E, 0x29, 0x0B, 0x7D, 0x0B, 0x50, 0x00, + 0x77, 0x06, 0x39, 0xF6, 0x1E, 0x04, 0x5F, 0xF4, 0xB5, 0x02, 0xDB, 0xFD, + 0xE1, 0xF6, 0x47, 0x05, 0xB0, 0xE9, 0xB1, 0xFE, 0xEC, 0xEF, 0xCE, 0xF2, + 0xCD, 0x05, 0x62, 0xEE, 0x7F, 0xFA, 0x64, 0xF1, 0x75, 0xCD, 0x9A, 0xE2, + 0xAB, 0xCC, 0x63, 0xD9, 0x21, 0xEA, 0xEB, 0xDD, 0x25, 0xE7, 0x72, 0xCF, + 0xD5, 0xD7, 0xD2, 0xD5, 0xAB, 0xCA, 0x0B, 0xDD, 0x62, 0xD1, 0x66, 0xC9, + 0x7E, 0xED, 0x44, 0xC3, 0xB5, 0xF1, 0x5E, 0xC3, 0x04, 0xE7, 0xC3, 0xC5, + 0xEF, 0xE4, 0x99, 0xCC, 0x84, 0xE3, 0x89, 0xC7, 0x03, 0xEC, 0x12, 0xC9, + 0x18, 0xEE, 0x2A, 0xD4, 0x8D, 0xE0, 0x93, 0xE0, 0xEA, 0xDA, 0xC2, 0xEE, + 0x22, 0xD9, 0x95, 0xEE, 0x9B, 0xDC, 0xF4, 0xED, 0x33, 0xE7, 0x1F, 0xF9, + 0x50, 0xE1, 0x7E, 0xF7, 0x0A, 0xDA, 0xEF, 0xE9, 0xEF, 0xEB, 0x88, 0xF3, + 0x33, 0xF0, 0x40, 0x07, 0xD7, 0xD9, 0x5B, 0x02, 0x4E, 0xCF, 0x2A, 0x05, + 0xF0, 0xDA, 0xFF, 0x11, 0x32, 0xF1, 0xAC, 0x09, 0x43, 0xFC, 0xB0, 0x07, + 0x88, 0x02, 0x30, 0x16, 0x8E, 0x15, 0x8C, 0x1C, 0xAE, 0x22, 0x6E, 0x16, + 0x09, 0x21, 0xE5, 0x1A, 0x2B, 0x21, 0x44, 0x28, 0xBD, 0x24, 0xD8, 0x24, + 0xD2, 0x22, 0x81, 0x16, 0x96, 0x24, 0x64, 0x12, 0x9C, 0x2F, 0xAC, 0x1E, + 0x45, 0x32, 0x39, 0x2F, 0x3E, 0x2B, 0x03, 0x31, 0x52, 0x30, 0xC8, 0x27, + 0x63, 0x34, 0x9D, 0x1A, 0x8D, 0x2F, 0x12, 0x13, 0x75, 0x1D, 0x03, 0x16, + 0xF5, 0x04, 0xBA, 0x0C, 0x53, 0x05, 0x00, 0xFE, 0x10, 0x0C, 0xC6, 0xFD, + 0x9D, 0x04, 0x57, 0xFD, 0xB2, 0x02, 0x81, 0x00, 0xD7, 0x0B, 0x4F, 0x05, + 0xA1, 0xF9, 0x74, 0xEB, 0xAE, 0xF0, 0xCB, 0xE3, 0x1D, 0x09, 0x0E, 0x04, + 0x81, 0x09, 0x91, 0x09, 0x46, 0x05, 0x36, 0xFB, 0x26, 0x0C, 0x37, 0xFD, + 0xA6, 0x05, 0xD7, 0x05, 0x5F, 0xFB, 0x59, 0x07, 0xFA, 0xFD, 0xA9, 0x0F, + 0xBD, 0x08, 0x43, 0x1B, 0x6F, 0xFC, 0x27, 0x08, 0x89, 0xE1, 0x5C, 0xFC, + 0x63, 0xDF, 0x8D, 0x06, 0x28, 0xE0, 0x2D, 0xFD, 0x84, 0xDC, 0xD5, 0xF0, + 0x12, 0xEE, 0xB5, 0xF5, 0xB2, 0xED, 0x10, 0xFA, 0xEF, 0xD6, 0x5B, 0xFD, + 0x4B, 0xE0, 0x97, 0x05, 0x5D, 0xF4, 0x2A, 0xF1, 0x76, 0xF0, 0xEB, 0xC7, + 0x19, 0xE9, 0x00, 0xC3, 0x8E, 0xF9, 0x39, 0xE1, 0x32, 0x09, 0x76, 0xF0, + 0x94, 0xFE, 0x32, 0xEF, 0xB6, 0xFC, 0xF3, 0xF3, 0x1B, 0x0F, 0x85, 0x05, + 0x9A, 0x16, 0x22, 0x0D, 0x56, 0x16, 0xA8, 0xFE, 0x17, 0x1A, 0x46, 0xFF, + 0x3F, 0x06, 0x57, 0xFE, 0x33, 0xEF, 0xDC, 0xF8, 0xFD, 0xF9, 0x50, 0x03, + 0xB0, 0x0B, 0x89, 0xFF, 0x86, 0x03, 0x39, 0xF4, 0x60, 0xEA, 0x9F, 0xF7, + 0x1F, 0xDA, 0x0D, 0xF4, 0xD9, 0xDC, 0xD5, 0xE1, 0x31, 0xF1, 0x5B, 0xDE, + 0xA5, 0x0F, 0x09, 0xFE, 0x32, 0x17, 0x8E, 0x16, 0xD4, 0xFF, 0x45, 0x09, + 0xBA, 0xFF, 0x46, 0x01, 0xA3, 0x17, 0xFA, 0x00, 0xDF, 0x09, 0x0F, 0xEB, + 0xED, 0xE6, 0x3D, 0xD1, 0x96, 0xDC, 0x19, 0xC7, 0xA1, 0xE6, 0xCA, 0xC6, + 0xA9, 0xF3, 0x07, 0xCA, 0xC3, 0xEC, 0xF2, 0xC8, 0x63, 0xDE, 0xB4, 0xCD, + 0x38, 0xE7, 0x15, 0xE9, 0xD5, 0xE8, 0x86, 0xFB, 0x02, 0xDD, 0x97, 0xFC, + 0x3E, 0xD5, 0x55, 0xF7, 0xEC, 0xC4, 0xC1, 0xE3, 0x10, 0xC6, 0xF5, 0xDA, + 0xDF, 0xDD, 0x00, 0xE7, 0x7D, 0xE9, 0x51, 0xFB, 0x9F, 0xE1, 0xBA, 0x14, + 0x1D, 0xDE, 0x05, 0x21, 0x70, 0xEF, 0x20, 0x1E, 0x2A, 0x01, 0x02, 0x23, + 0xCD, 0xFE, 0x04, 0x29, 0x3F, 0x04, 0x41, 0x2C, 0x24, 0x20, 0xD9, 0x33, + 0x11, 0x29, 0x66, 0x2C, 0x2E, 0x1E, 0xB7, 0x20, 0xA6, 0x17, 0x29, 0x27, + 0x6D, 0x14, 0x81, 0x26, 0x76, 0x1B, 0x05, 0x16, 0x00, 0x28, 0x65, 0x0C, + 0xC2, 0x21, 0xD0, 0x08, 0xE6, 0x0F, 0xA8, 0x0C, 0xE3, 0x14, 0xB3, 0x19, + 0xF3, 0x28, 0xCD, 0x18, 0x84, 0x0C, 0xF7, 0xF4, 0xDD, 0xE9, 0x14, 0xE1, + 0x6F, 0x05, 0x9A, 0xFB, 0x99, 0x10, 0x5B, 0xFE, 0x57, 0xF4, 0x39, 0xDA, + 0xF0, 0xEF, 0x0F, 0xD3, 0x85, 0xFD, 0x53, 0xE6, 0x9B, 0x05, 0xE7, 0xEB, + 0xD7, 0x0F, 0x0E, 0xF2, 0x41, 0x1A, 0x4E, 0xF8, 0xC1, 0x16, 0x73, 0xFB, + 0x73, 0x01, 0xDF, 0xFB, 0x1C, 0x06, 0x9E, 0xFA, 0x76, 0x25, 0xB1, 0xFE, + 0x0D, 0x21, 0x55, 0xF8, 0x60, 0x0A, 0x33, 0xF6, 0x23, 0x0D, 0x13, 0x10, + 0x7A, 0x18, 0x1C, 0x1F, 0xE1, 0x1E, 0x2E, 0x1A, 0xD5, 0x2F, 0x7E, 0x2A, + 0x4A, 0x32, 0xC2, 0x3B, 0x7E, 0x12, 0xD8, 0x34, 0x4A, 0x0D, 0x9C, 0x31, + 0xDB, 0x37, 0x8F, 0x42, 0x15, 0x47, 0x1B, 0x47, 0x91, 0x2C, 0x7F, 0x40, + 0x80, 0x20, 0x4E, 0x51, 0xEC, 0x23, 0xC5, 0x59, 0x63, 0x1D, 0xE0, 0x3C, + 0xDB, 0x1B, 0xDB, 0x24, 0x57, 0x25, 0x03, 0x1E, 0x41, 0x27, 0xE0, 0x16, + 0x3C, 0x24, 0xC0, 0x14, 0xC7, 0x17, 0x46, 0x0C, 0xBD, 0x12, 0x46, 0x12, + 0x88, 0x13, 0xC6, 0x1D, 0x72, 0x0F, 0xA1, 0x0D, 0x40, 0x17, 0xA4, 0xFA, + 0x1A, 0x02, 0x05, 0xF3, 0xF0, 0xCF, 0x11, 0xEC, 0x1E, 0xCB, 0xD8, 0xE9, + 0x67, 0xDA, 0x27, 0xDE, 0xCD, 0xD2, 0x21, 0xCE, 0x03, 0xC5, 0x19, 0xCF, + 0x57, 0xB7, 0xCA, 0xCF, 0xE7, 0xB1, 0x75, 0xC3, 0x5F, 0xAC, 0xA9, 0xB3, + 0x7B, 0xA7, 0xDA, 0xAF, 0x61, 0xA8, 0xD7, 0xAF, 0x1E, 0xA6, 0x08, 0xB1, + 0x85, 0xA6, 0xA6, 0xB2, 0x05, 0xA9, 0x35, 0xAC, 0x1D, 0xAA, 0x32, 0xA3, + 0xD2, 0xBC, 0xC1, 0xAF, 0x08, 0xD3, 0x72, 0xC2, 0xB8, 0xD6, 0x13, 0xC0, + 0x8F, 0xD7, 0xCD, 0xC0, 0x0D, 0xEC, 0x46, 0xD1, 0xBD, 0xFC, 0xA1, 0xD7, + 0xB9, 0xF1, 0x78, 0xD1, 0x77, 0xF5, 0x7C, 0xDE, 0xC1, 0x0F, 0xCB, 0xFE, + 0x3D, 0x05, 0xA2, 0x0B, 0xD4, 0xE8, 0xD7, 0x04, 0x36, 0xF1, 0x7D, 0x01, + 0x15, 0x10, 0xDF, 0x04, 0x84, 0x14, 0x38, 0x07, 0xB2, 0x0C, 0xF0, 0x17, + 0x3C, 0x1B, 0x71, 0x35, 0x4A, 0x21, 0x52, 0x38, 0x73, 0x1D, 0x43, 0x2E, + 0x89, 0x28, 0xA9, 0x3D, 0xBA, 0x31, 0xFA, 0x49, 0x70, 0x23, 0x63, 0x36, + 0xC9, 0x16, 0x3A, 0x25, 0x58, 0x2C, 0xDD, 0x28, 0xF0, 0x30, 0xEB, 0x24, + 0xF5, 0x12, 0xBA, 0x1B, 0x4D, 0x1A, 0x48, 0x22, 0xC1, 0x34, 0x4F, 0x20, + 0x9A, 0x41, 0x72, 0x18, 0x66, 0x46, 0xC8, 0x1D, 0x8B, 0x3A, 0xA3, 0x2B, + 0x3A, 0x30, 0xD1, 0x2E, 0x20, 0x29, 0x1C, 0x23, 0xE5, 0x31, 0x77, 0x27, + 0x3C, 0x40, 0xF6, 0x2F, 0x76, 0x34, 0x4E, 0x24, 0x37, 0x2C, 0xDF, 0x18, + 0x64, 0x28, 0x7D, 0x18, 0x83, 0x21, 0x54, 0x1D, 0x13, 0x20, 0x38, 0x1B, + 0x52, 0x1E, 0xDD, 0x13, 0xFC, 0x21, 0x8B, 0x11, 0xE1, 0x1C, 0x7A, 0x0D, + 0x83, 0x11, 0x62, 0x10, 0x71, 0x1D, 0xB2, 0x1C, 0xD9, 0x16, 0xBA, 0x11, + 0x4E, 0xFE, 0x98, 0xFC, 0x87, 0x02, 0xD0, 0xF3, 0x9A, 0x08, 0xEF, 0xF6, + 0x1B, 0xFD, 0x97, 0x03, 0x1B, 0xF2, 0x3B, 0x04, 0x96, 0xFD, 0x91, 0x01, + 0xA5, 0xFC, 0x62, 0xF8, 0xF0, 0xEC, 0x42, 0x04, 0x9B, 0xEA, 0x30, 0x1D, + 0xC2, 0xD9, 0x58, 0x0A, 0xAE, 0xDC, 0xCF, 0xFD, 0x2A, 0xEE, 0x48, 0x01, + 0x9E, 0xE3, 0x74, 0x02, 0xDA, 0xD7, 0xB3, 0x0B, 0x27, 0xCC, 0x38, 0x0A, + 0x36, 0xC3, 0x92, 0xF8, 0xEE, 0xCA, 0xE7, 0xEA, 0x98, 0xD0, 0x2A, 0xE6, + 0xE0, 0xDE, 0x7F, 0xDB, 0xD0, 0xF1, 0xB3, 0xD7, 0x25, 0xE7, 0x5E, 0xDD, + 0x42, 0xCE, 0xBB, 0xDF, 0xAB, 0xD0, 0x70, 0xDF, 0x91, 0xEC, 0x69, 0xDC, + 0x72, 0xF8, 0xC9, 0xD4, 0x95, 0xE4, 0x5C, 0xCD, 0xDE, 0xD3, 0xAA, 0xD2, + 0x64, 0xD0, 0xA8, 0xD2, 0x30, 0xD8, 0x64, 0xD2, 0xE9, 0xE9, 0x08, 0xD8, + 0x35, 0xE4, 0x57, 0xD7, 0x77, 0xD2, 0x86, 0xDC, 0x2F, 0xD3, 0xC4, 0xE1, + 0xB9, 0xEE, 0xF0, 0xE8, 0xA9, 0xF7, 0x1E, 0xE1, 0xE5, 0xD5, 0x6C, 0xC8, + 0x58, 0xD5, 0xE5, 0xD0, 0x95, 0xF3, 0x08, 0xE9, 0xDE, 0xED, 0xB2, 0xE1, + 0x64, 0xE8, 0xE7, 0xD6, 0xE9, 0x01, 0xCF, 0xE5, 0xDA, 0x0F, 0xB4, 0xF4, + 0x7A, 0x11, 0x00, 0xFA, 0x09, 0x19, 0x10, 0xF7, 0x06, 0x17, 0x4E, 0xE6, + 0x26, 0x14, 0x01, 0xE5, 0xFD, 0x29, 0xDA, 0xFE, 0x71, 0x46, 0x30, 0x0E, + 0x8D, 0x3E, 0xAA, 0x0A, 0x72, 0x22, 0x11, 0x1A, 0x52, 0x1B, 0x48, 0x31, + 0xD4, 0x23, 0x1A, 0x35, 0x13, 0x27, 0x32, 0x2E, 0x5E, 0x2A, 0x78, 0x27, + 0x13, 0x29, 0x8E, 0x2C, 0xA0, 0x1E, 0x94, 0x3C, 0x56, 0x17, 0xD8, 0x3E, + 0xF0, 0x13, 0x06, 0x33, 0xAA, 0x15, 0x05, 0x35, 0x61, 0x08, 0xED, 0x33, + 0x42, 0xFB, 0xE0, 0x28, 0xFA, 0x08, 0x0F, 0x21, 0x61, 0x15, 0x9A, 0x19, + 0x5A, 0x12, 0x63, 0x1F, 0x2C, 0x11, 0xB0, 0x2E, 0xDC, 0x12, 0x36, 0x2C, + 0x08, 0x14, 0xD5, 0x1A, 0xB4, 0x1D, 0xEC, 0x15, 0x10, 0x1D, 0xC2, 0x10, + 0xDA, 0x10, 0x98, 0x0A, 0xDF, 0x06, 0x40, 0x06, 0x71, 0xFC, 0x2D, 0xF6, + 0x13, 0xFA, 0xED, 0xF3, 0xC7, 0xF9, 0xAF, 0x00, 0x92, 0xFE, 0x7F, 0xFD, + 0x89, 0x10, 0xBE, 0xFB, 0xE6, 0x10, 0xF9, 0x02, 0x56, 0xFE, 0x65, 0xFE, + 0x4E, 0xF8, 0x7E, 0xFD, 0x6E, 0xFC, 0x84, 0x02, 0xAA, 0xF6, 0x5E, 0xF5, + 0xE0, 0xF9, 0xA6, 0xF0, 0x39, 0xFF, 0x00, 0xF8, 0xDA, 0xEB, 0x8B, 0xEA, + 0xE8, 0xEA, 0xA0, 0xEB, 0x09, 0x09, 0x97, 0xFE, 0x0A, 0x0A, 0x36, 0xF3, + 0xB6, 0xF1, 0x18, 0xEB, 0x69, 0xF1, 0x3C, 0xFB, 0x2A, 0xFE, 0xC5, 0xF7, + 0x3A, 0xFF, 0x1E, 0xE6, 0x38, 0x01, 0x73, 0xF0, 0x16, 0x06, 0xDF, 0x0F, + 0xF1, 0xF4, 0x74, 0x14, 0xC7, 0xE1, 0x06, 0xFF, 0x6F, 0xF0, 0x90, 0xF7, + 0xFC, 0x02, 0x00, 0xFE, 0x37, 0xF9, 0x62, 0x03, 0x5D, 0xEF, 0x59, 0x0E, + 0xD6, 0xF3, 0x67, 0x12, 0xD5, 0xE9, 0x49, 0x07, 0xBB, 0xDD, 0xD0, 0x09, + 0xB7, 0xE9, 0x7D, 0x11, 0x13, 0x06, 0xE0, 0xFD, 0x07, 0x10, 0x53, 0xE9, + 0x45, 0x07, 0xC1, 0xF5, 0x8F, 0x0A, 0xB5, 0x07, 0xC8, 0x0C, 0xE3, 0x09, + 0x05, 0x12, 0x89, 0x06, 0xEF, 0x21, 0x58, 0x06, 0x0D, 0x21, 0x85, 0x03, + 0x2B, 0x10, 0x01, 0xFD, 0x86, 0xFC, 0xC3, 0xFC, 0x01, 0xFB, 0x4A, 0xF8, + 0xD3, 0x03, 0xA3, 0xEE, 0xA9, 0xFC, 0xED, 0xEB, 0x1E, 0xFD, 0xB5, 0xF6, + 0x13, 0xF7, 0x3E, 0xFA, 0x40, 0xE8, 0x5F, 0xEE, 0x20, 0xEC, 0x4B, 0xE9, + 0xD2, 0xF1, 0xAD, 0xED, 0x4F, 0xE9, 0x58, 0xEE, 0xC9, 0xD6, 0x25, 0xE1, + 0x09, 0xDD, 0x65, 0xD8, 0x8B, 0xE0, 0x22, 0xD0, 0x79, 0xD4, 0xDC, 0xCD, + 0x3B, 0xE8, 0x38, 0xDB, 0x69, 0xFD, 0x4C, 0xE6, 0x14, 0xF1, 0xA7, 0xE2, + 0xD0, 0xEE, 0x1A, 0xDB, 0x3A, 0xFC, 0x02, 0xDF, 0xB8, 0x08, 0x2F, 0xDC, + 0x4F, 0x14, 0x1A, 0xDB, 0xF9, 0x0A, 0xEA, 0xE6, 0x75, 0x02, 0x61, 0xF0, + 0x0F, 0xFA, 0xD0, 0xF9, 0xF8, 0xF3, 0x92, 0x0C, 0x8E, 0x01, 0x0B, 0x15, + 0x54, 0xFA, 0xFF, 0x00, 0xBA, 0xE5, 0x3E, 0xF6, 0x04, 0xED, 0x95, 0x05, + 0x23, 0xFC, 0x64, 0x0F, 0xD1, 0xF2, 0x21, 0x0F, 0x80, 0xE5, 0xDF, 0x19, + 0x53, 0xEE, 0x0F, 0x25, 0xE8, 0xFA, 0x16, 0x22, 0x69, 0x04, 0xAB, 0x26, + 0x71, 0x0B, 0xBD, 0x2B, 0xE2, 0x06, 0xA7, 0x25, 0xE5, 0x0D, 0x11, 0x2E, + 0x0C, 0x20, 0x72, 0x39, 0xF4, 0x29, 0x63, 0x32, 0xFB, 0x25, 0xA9, 0x21, + 0x10, 0x16, 0x1A, 0x1A, 0xB4, 0x1F, 0x62, 0x22, 0xE9, 0x37, 0x45, 0x25, + 0x9B, 0x2D, 0x47, 0x23, 0x1E, 0x1C, 0x16, 0x29, 0xAA, 0x23, 0xFD, 0x29, + 0x33, 0x2D, 0x66, 0x25, 0x51, 0x31, 0x3A, 0x22, 0x30, 0x35, 0xF2, 0x1F, + 0xD6, 0x28, 0x77, 0x1C, 0xC5, 0x0C, 0x1E, 0x1A, 0x16, 0x10, 0x23, 0x1F, + 0x85, 0x2C, 0xF4, 0x1B, 0x84, 0x27, 0x10, 0x11, 0xD7, 0x13, 0xF2, 0x0E, + 0xF6, 0x0B, 0xA5, 0x09, 0x1D, 0x14, 0xAE, 0x04, 0x18, 0x25, 0x5C, 0x06, + 0x3B, 0x1B, 0xDF, 0x02, 0x29, 0x09, 0xBE, 0xFF, 0xDB, 0x03, 0xE9, 0xF9, + 0xB8, 0x05, 0xBF, 0xF3, 0x68, 0x0F, 0xB1, 0xEB, 0x94, 0x14, 0x59, 0xEC, + 0x4C, 0x03, 0x00, 0xF4, 0xE2, 0xEA, 0x03, 0xF3, 0x64, 0xF7, 0x11, 0xFE, + 0x99, 0x04, 0xFA, 0xFC, 0x3A, 0xF2, 0xAE, 0xEC, 0x01, 0xF5, 0x91, 0xF7, + 0xA9, 0x03, 0x3F, 0x0E, 0x09, 0xF7, 0xF2, 0x10, 0x8D, 0xE5, 0xEB, 0x10, + 0x44, 0xD7, 0x1C, 0x0F, 0x79, 0xD9, 0x8D, 0xFC, 0x92, 0xF3, 0xE7, 0xF4, + 0xB3, 0xFA, 0x71, 0xEE, 0x89, 0xEC, 0x00, 0xE1, 0xC7, 0xE2, 0xD4, 0xE4, + 0xB2, 0xE6, 0xA0, 0xEA, 0x4D, 0xF3, 0x20, 0xE7, 0xD6, 0xF8, 0x9E, 0xE8, + 0x03, 0xF7, 0xE8, 0xE8, 0x10, 0xEB, 0xB8, 0xDB, 0x89, 0xE4, 0x6D, 0xD0, + 0x8A, 0xE4, 0xD7, 0xD3, 0xF7, 0xD2, 0x02, 0xD1, 0xC9, 0xC7, 0x65, 0xC2, + 0x63, 0xC9, 0xE5, 0xC9, 0x19, 0xD0, 0x7B, 0xDE, 0xEC, 0xD5, 0x9C, 0xDB, + 0xD0, 0xD0, 0x4A, 0xD4, 0xBE, 0xCB, 0xED, 0xDB, 0xC1, 0xC7, 0x71, 0xDF, + 0x48, 0xCC, 0x48, 0xD7, 0xD2, 0xD3, 0xB9, 0xD9, 0x82, 0xCB, 0x6D, 0xE0, + 0x38, 0xCC, 0x64, 0xD4, 0x74, 0xDC, 0xAD, 0xCE, 0x67, 0xE5, 0xC6, 0xDE, + 0x9C, 0xEC, 0xFA, 0xEE, 0x7F, 0xEF, 0x76, 0xF0, 0xD0, 0xFD, 0x46, 0xF0, + 0x3A, 0x0B, 0xDD, 0xE6, 0xB4, 0x12, 0xB3, 0xE1, 0x08, 0x2A, 0x2D, 0xF8, + 0xBF, 0x24, 0xE6, 0x07, 0x17, 0x19, 0x43, 0x14, 0xF3, 0x2C, 0x88, 0x27, + 0xD2, 0x33, 0xFB, 0x2F, 0x2A, 0x2C, 0xD0, 0x34, 0x80, 0x26, 0xAC, 0x34, + 0xE9, 0x26, 0xB5, 0x31, 0xA0, 0x33, 0xF4, 0x32, 0x40, 0x39, 0xB9, 0x3E, + 0xE3, 0x2A, 0xD9, 0x51, 0xDD, 0x15, 0xAE, 0x53, 0x44, 0x11, 0x63, 0x42, + 0x5E, 0x23, 0xB1, 0x34, 0x72, 0x2E, 0xD1, 0x33, 0xF6, 0x21, 0x44, 0x3B, + 0x2B, 0x0E, 0x7F, 0x34, 0xE2, 0x13, 0x61, 0x23, 0x81, 0x24, 0x0F, 0x27, + 0x16, 0x15, 0xB2, 0x24, 0xD5, 0x0B, 0xD6, 0x19, 0xAD, 0x18, 0xA2, 0x14, + 0xF2, 0x1D, 0x55, 0x0F, 0x4C, 0x1B, 0xA2, 0x0D, 0x77, 0x0E, 0xC5, 0x02, + 0xC9, 0x0B, 0x70, 0x05, 0xDD, 0x08, 0xEC, 0xFF, 0xC2, 0xFA, 0xAA, 0xED, + 0x83, 0xF6, 0x83, 0xF0, 0xEE, 0xE6, 0x49, 0xE7, 0x40, 0xD9, 0xF3, 0xDC, + 0x42, 0xDD, 0x20, 0xD6, 0x70, 0xDC, 0x6E, 0xCA, 0x07, 0xDB, 0x42, 0xD4, + 0xE7, 0xE6, 0x8C, 0xE1, 0x69, 0xF2, 0xAF, 0xDB, 0x19, 0xED, 0x80, 0xCE, + 0x6A, 0xEF, 0x42, 0xD7, 0x49, 0xF5, 0x03, 0xF0, 0x0C, 0xE9, 0x62, 0xF1, + 0xD6, 0xE1, 0xD3, 0xDF, 0xEE, 0xF1, 0xD4, 0xD3, 0xE0, 0xFA, 0x5B, 0xD2, + 0x1E, 0xFE, 0xFF, 0xEB, 0x47, 0x06, 0x97, 0xFC, 0xEF, 0x00, 0x77, 0xF9, + 0x2E, 0xF1, 0x16, 0xFF, 0x32, 0xED, 0x14, 0x05, 0x80, 0x00, 0x46, 0x13, + 0xE1, 0x0F, 0x8F, 0x18, 0xF0, 0x07, 0xFC, 0x04, 0x2A, 0xFF, 0xF4, 0x07, + 0x5C, 0x00, 0xE6, 0x24, 0xDD, 0xEB, 0x64, 0x2A, 0xCD, 0xD9, 0x9B, 0x1F, + 0x31, 0xFB, 0x70, 0x17, 0x84, 0x0D, 0x48, 0x0F, 0xA0, 0xFA, 0xCC, 0x0E, + 0x0F, 0x03, 0xF1, 0x18, 0x14, 0x11, 0x0B, 0x10, 0x7A, 0x0E, 0xBF, 0xFB, + 0x87, 0x10, 0x30, 0x03, 0xF0, 0x18, 0xEF, 0x13, 0x29, 0x1D, 0xAC, 0x11, + 0xE9, 0x15, 0xE3, 0x01, 0x3E, 0x0F, 0x1F, 0xFC, 0xD1, 0x08, 0x16, 0x00, + 0x3F, 0xFB, 0x51, 0x03, 0x50, 0xF3, 0x4A, 0x00, 0xB1, 0xFD, 0x6F, 0xFA, + 0x40, 0x00, 0x90, 0xF6, 0xDA, 0xEE, 0x22, 0xEF, 0x84, 0xE8, 0x4E, 0xEE, + 0x8D, 0xEB, 0x63, 0xF1, 0x45, 0xE4, 0x77, 0xED, 0x10, 0xE0, 0xD7, 0xEA, + 0xB0, 0xE9, 0x13, 0xEE, 0xFD, 0xEA, 0xC9, 0xE8, 0xEB, 0xED, 0x53, 0xE1, + 0x41, 0xF1, 0x23, 0xDC, 0x83, 0xEF, 0x4D, 0xE4, 0xFB, 0xF4, 0x64, 0xF1, + 0x30, 0xF5, 0x05, 0xE7, 0xC6, 0xF4, 0xC9, 0xD0, 0x0A, 0x03, 0xC1, 0xC7, + 0xF0, 0x0C, 0x42, 0xCC, 0xA1, 0x0A, 0x62, 0xD2, 0xA9, 0x0F, 0xAF, 0xDE, + 0x3B, 0x0E, 0xDA, 0xEB, 0x47, 0xF9, 0x24, 0xE9, 0x81, 0xED, 0x19, 0xE1, + 0xBD, 0xE9, 0x3D, 0xE8, 0x54, 0xE5, 0x6B, 0xEB, 0xEC, 0xE9, 0xF8, 0xDC, + 0x53, 0xF2, 0x54, 0xEA, 0x8F, 0xF5, 0x36, 0x0B, 0x2D, 0xEC, 0x9B, 0x0E, + 0xB7, 0xE3, 0x35, 0x08, 0x7A, 0xE6, 0x22, 0x09, 0x2D, 0xEA, 0x9B, 0x09, + 0x17, 0xE8, 0x18, 0x07, 0x1A, 0xEE, 0x5F, 0x0D, 0xB8, 0xF3, 0xB5, 0x19, + 0xB9, 0xE9, 0x63, 0x15, 0xEF, 0xEB, 0x02, 0x11, 0x7F, 0x01, 0xFD, 0x16, + 0x03, 0x12, 0xB7, 0x1C, 0x10, 0x0D, 0xF8, 0x14, 0x8B, 0xFE, 0xFD, 0x08, + 0xC1, 0x0D, 0xFC, 0x20, 0x85, 0x25, 0xE8, 0x2E, 0x44, 0x1E, 0x49, 0x17, + 0xEA, 0x1B, 0xCA, 0x12, 0x87, 0x1B, 0xD9, 0x1A, 0xF0, 0x0E, 0x98, 0x1D, + 0x14, 0x1C, 0x6D, 0x20, 0xAA, 0x2B, 0xCB, 0x20, 0x6C, 0x1F, 0x87, 0x1B, + 0xED, 0x17, 0xC6, 0x18, 0xA7, 0x17, 0xF9, 0x2B, 0xE1, 0x1B, 0x1A, 0x35, + 0x9E, 0x33, 0x62, 0x1C, 0x66, 0x3D, 0x6A, 0x1B, 0x35, 0x30, 0x2D, 0x2F, + 0x6E, 0x29, 0xDB, 0x32, 0xAE, 0x28, 0x56, 0x2C, 0xF6, 0x26, 0x68, 0x19, + 0xE0, 0x21, 0x8C, 0x0E, 0xDE, 0x25, 0x17, 0x0D, 0x49, 0x2A, 0x1C, 0x0E, + 0x23, 0x21, 0x2E, 0x16, 0x95, 0x15, 0x2C, 0x12, 0x6F, 0x0D, 0x51, 0x15, + 0x72, 0x09, 0x54, 0x16, 0x1B, 0x0E, 0x86, 0x00, 0x9E, 0x16, 0x7B, 0xF9, + 0xD7, 0x06, 0x36, 0xFD, 0xE0, 0xEC, 0xD1, 0x05, 0x9B, 0xE5, 0x8D, 0x13, + 0x8E, 0xE6, 0x38, 0x0F, 0x2D, 0xE4, 0xDB, 0xFA, 0x39, 0xE9, 0x13, 0xEF, + 0x15, 0xE6, 0x9B, 0xE6, 0x8F, 0xDA, 0x20, 0xDA, 0x25, 0xE1, 0x98, 0xD9, + 0x1B, 0xE9, 0xF1, 0xDB, 0x21, 0xE3, 0x4E, 0xD0, 0x9E, 0xDE, 0x49, 0xCF, + 0xAF, 0xEC, 0xAD, 0xE4, 0xC5, 0xF7, 0xEC, 0xDF, 0xEE, 0xE5, 0x2B, 0xC6, + 0x31, 0xE0, 0x95, 0xD0, 0x3B, 0xED, 0xB9, 0xDD, 0x6E, 0xDD, 0xB3, 0xCC, + 0x3D, 0xCB, 0xA3, 0xCA, 0x77, 0xD8, 0x3A, 0xD7, 0xCF, 0xDD, 0x03, 0xD4, + 0xBC, 0xD5, 0x01, 0xD2, 0xCC, 0xD9, 0x2E, 0xD6, 0xCA, 0xD3, 0xBA, 0xD3, + 0x3A, 0xC1, 0x41, 0xD6, 0xFD, 0xC9, 0x6C, 0xE0, 0x29, 0xD8, 0xF5, 0xDA, + 0x98, 0xCC, 0x50, 0xC5, 0xA1, 0xC3, 0x7B, 0xBC, 0x73, 0xC5, 0x51, 0xCF, + 0xF1, 0xD5, 0x57, 0xEC, 0x65, 0xE9, 0x74, 0xEA, 0x9F, 0xF0, 0x13, 0xDD, + 0x91, 0xF2, 0x84, 0xDA, 0x3F, 0xF6, 0x9B, 0xD3, 0xC6, 0x0A, 0xF0, 0xDA, + 0x1E, 0x1F, 0x18, 0xEA, 0x39, 0x1F, 0x1F, 0xF0, 0x25, 0x11, 0x4B, 0xFD, + 0x7B, 0x08, 0x6B, 0x13, 0x1B, 0x18, 0xFD, 0x1E, 0xCE, 0x20, 0x4D, 0x10, + 0xFC, 0x18, 0xFA, 0x06, 0xF6, 0x1E, 0x77, 0x22, 0xA2, 0x27, 0xA4, 0x38, + 0xF7, 0x27, 0xE0, 0x3A, 0x9B, 0x1D, 0x4C, 0x41, 0xE8, 0x0F, 0xB5, 0x3E, + 0x3C, 0x15, 0xB3, 0x35, 0x6B, 0x22, 0x51, 0x3A, 0x22, 0x20, 0x01, 0x3E, + 0xB5, 0x14, 0x74, 0x34, 0x8E, 0x0E, 0xB2, 0x34, 0x2A, 0x0C, 0xE0, 0x3D, + 0x0F, 0x16, 0xC4, 0x38, 0x55, 0x28, 0x3A, 0x29, 0xE2, 0x24, 0x88, 0x1C, + 0x64, 0x10, 0x7F, 0x1B, 0xD9, 0x18, 0xDD, 0x27, 0xBE, 0x27, 0x99, 0x27, + 0xF8, 0x28, 0xC8, 0x17, 0x4F, 0x33, 0x56, 0x11, 0xF2, 0x29, 0x0B, 0x18, + 0x2F, 0x16, 0x7D, 0x1D, 0x10, 0x0F, 0x7C, 0x0F, 0x1B, 0x14, 0xC8, 0x00, + 0x54, 0x11, 0xC3, 0xF7, 0xFA, 0x01, 0xFF, 0xF5, 0x1C, 0xFF, 0x0F, 0xFC, + 0x5B, 0xF4, 0x8B, 0xEF, 0x75, 0xEC, 0xAB, 0xDE, 0x69, 0x06, 0x9D, 0xE5, + 0x2E, 0x08, 0x16, 0xEE, 0xAE, 0xE5, 0x83, 0xE1, 0x75, 0xDD, 0x71, 0xD9, + 0xBA, 0xE5, 0x04, 0xE3, 0x5E, 0xE7, 0x44, 0xDC, 0x79, 0xF3, 0x6E, 0xCF, + 0xD2, 0x06, 0xDD, 0xDB, 0x9C, 0xFF, 0xB9, 0xE1, 0x1C, 0xE7, 0x15, 0xE2, + 0xD7, 0xE5, 0xA4, 0xFA, 0x0D, 0xF0, 0x5E, 0x06, 0x0C, 0xF2, 0x7E, 0xED, + 0x75, 0xF3, 0x83, 0xE4, 0x42, 0xF2, 0x60, 0xF9, 0x53, 0xEE, 0x90, 0x01, + 0x88, 0xE8, 0xBB, 0x04, 0xC7, 0xE2, 0x94, 0x10, 0x5C, 0xE7, 0x36, 0x15, + 0x0F, 0xE7, 0x37, 0x15, 0x9D, 0xE7, 0x11, 0x12, 0x01, 0xF7, 0x5F, 0x0A, + 0xAF, 0xF7, 0xCF, 0x03, 0x37, 0xFA, 0x32, 0x09, 0x4D, 0x0D, 0x24, 0x15, + 0xA3, 0x0D, 0xFB, 0x0F, 0x67, 0x0C, 0x0D, 0x09, 0xF6, 0x18, 0xD6, 0x10, + 0x57, 0x19, 0xE0, 0x0F, 0xF0, 0x16, 0xB1, 0x05, 0x25, 0x15, 0x8C, 0xFE, + 0x42, 0x0D, 0x35, 0xFF, 0x60, 0x0C, 0x4C, 0x04, 0x07, 0x03, 0xF1, 0x02, + 0xBA, 0xF3, 0x31, 0x03, 0xB1, 0xF9, 0x3E, 0xF6, 0xE5, 0x02, 0x82, 0xE8, + 0xD3, 0xF3, 0xE5, 0xF1, 0x1E, 0xE5, 0x97, 0xFF, 0x31, 0xDE, 0xCC, 0xF4, + 0x9B, 0xDB, 0xE3, 0xE1, 0x32, 0xE4, 0x40, 0xE1, 0x3F, 0xE1, 0x14, 0xD3, + 0xB7, 0xD0, 0xA8, 0xC8, 0x16, 0xCF, 0x39, 0xDE, 0x25, 0xE0, 0xA0, 0xE8, + 0xDA, 0xEE, 0xAE, 0xE2, 0xAF, 0xEE, 0x2A, 0xDC, 0x3E, 0xE4, 0x25, 0xCC, + 0x15, 0xEC, 0xE2, 0xC9, 0x29, 0x02, 0x23, 0xC9, 0xC0, 0x12, 0x7D, 0xC9, + 0x37, 0x10, 0x40, 0xDC, 0xCC, 0xF4, 0x4A, 0xE6, 0xF2, 0xDF, 0xDB, 0xE7, + 0xCC, 0xF1, 0x41, 0xF1, 0x25, 0x07, 0x8A, 0xF9, 0x81, 0xF8, 0xEF, 0xEC, + 0xDE, 0xFB, 0x00, 0xF5, 0xBB, 0x0C, 0xE5, 0x16, 0x86, 0xFB, 0x52, 0x14, + 0x04, 0xF3, 0xAA, 0x0D, 0x09, 0x01, 0x6E, 0x1F, 0xAA, 0x03, 0xF5, 0x19, + 0xF8, 0xF1, 0x7F, 0x09, 0x81, 0xEC, 0x29, 0x16, 0x22, 0xF6, 0xC7, 0x23, + 0xA9, 0xDA, 0xEA, 0x11, 0x63, 0xB3, 0x3E, 0xF8, 0x38, 0xB7, 0x4B, 0xF4, + 0xA8, 0xCF, 0x0C, 0xFA, 0x62, 0xD2, 0x60, 0xFB, 0x1A, 0xD7, 0xB8, 0x07, + 0x8A, 0xFC, 0x65, 0x14, 0x66, 0x17, 0x3D, 0x14, 0x2E, 0x1B, 0x74, 0x1B, + 0xB7, 0x21, 0xB2, 0x28, 0xEA, 0x11, 0xEC, 0x1C, 0x76, 0x12, 0xB3, 0x15, + 0x5B, 0x33, 0x02, 0x2C, 0xF8, 0x28, 0x43, 0x28, 0x1E, 0x2D, 0x09, 0x23, + 0x71, 0x38, 0x28, 0x2E, 0xBC, 0x0D, 0x4D, 0x1D, 0x9F, 0x0A, 0x4D, 0x15, + 0x35, 0x37, 0x92, 0x29, 0x70, 0x41, 0x9A, 0x2E, 0xCD, 0x4A, 0x6C, 0x39, + 0xDD, 0x5F, 0x9B, 0x51, 0xC2, 0x52, 0x40, 0x52, 0x21, 0x33, 0xF7, 0x36, + 0x34, 0x39, 0x6A, 0x23, 0xA5, 0x4E, 0xDF, 0x22, 0xEE, 0x40, 0xC2, 0x23, + 0xDF, 0x2B, 0x48, 0x26, 0x31, 0x2D, 0xC8, 0x34, 0xBB, 0x3B, 0xEF, 0x44, + 0xA1, 0x36, 0x12, 0x38, 0x82, 0x22, 0x80, 0x23, 0x8B, 0x0C, 0x5C, 0x16, + 0xD9, 0xFB, 0x25, 0x12, 0x8B, 0x08, 0x39, 0x27, 0x21, 0x18, 0xF6, 0x3B, + 0xF5, 0xFF, 0x2F, 0x2B, 0xE9, 0xF9, 0x58, 0x1F, 0xE8, 0x18, 0xAA, 0x30, + 0x51, 0x06, 0x76, 0x28, 0xF7, 0xD6, 0xCA, 0x05, 0x88, 0xCD, 0x36, 0xF0, + 0x42, 0xDD, 0x78, 0xF2, 0xBA, 0xE5, 0x72, 0xF3, 0xA5, 0xD7, 0x71, 0xE1, + 0xDB, 0xB8, 0xB5, 0xCB, 0x5F, 0xD8, 0x5F, 0xEB, 0xC3, 0x01, 0xA5, 0x04, + 0xBB, 0xDF, 0xA4, 0xD6, 0x8C, 0xEA, 0x1D, 0xD9, 0x4B, 0x05, 0x2F, 0xF6, + 0xF9, 0xDA, 0xB6, 0xD4, 0xDB, 0xD3, 0xC8, 0xCB, 0xF3, 0xFD, 0x88, 0xEB, + 0xE4, 0xE8, 0x4A, 0xD4, 0x22, 0xB8, 0xD4, 0xB3, 0x0E, 0xC1, 0xD8, 0xCA, + 0x73, 0xC4, 0xDA, 0xCF, 0x8F, 0xA5, 0xB7, 0xB1, 0xC5, 0xA6, 0xB0, 0xA8, + 0xD7, 0xC4, 0x3A, 0xBA, 0xBC, 0xC1, 0xB9, 0xBA, 0x69, 0xB4, 0xBE, 0xB6, + 0x62, 0xC5, 0x41, 0xD1, 0x62, 0xC8, 0xE8, 0xD4, 0x22, 0xA4, 0x2A, 0xB2, + 0xA4, 0xA0, 0xE0, 0xB0, 0x44, 0xC7, 0x93, 0xC8, 0x42, 0xC6, 0x4D, 0xBB, + 0x30, 0xB1, 0x70, 0xA0, 0xB1, 0xC7, 0xA7, 0xB5, 0x5C, 0xDA, 0x0C, 0xCF, + 0xFB, 0xCF, 0xD9, 0xC0, 0x6D, 0xBA, 0xC0, 0xAF, 0x99, 0xA4, 0x30, 0xAC, + 0xA8, 0xA8, 0x2A, 0xAF, 0x7F, 0xB8, 0x2F, 0xB8, 0xCD, 0xB7, 0x56, 0xBA, + 0x1C, 0xAB, 0x31, 0xB9, 0x86, 0xA5, 0x5D, 0xC2, 0x64, 0xAE, 0x10, 0xCB, + 0x5D, 0xBC, 0x0F, 0xD0, 0xFB, 0xC2, 0x39, 0xD2, 0xA5, 0xBD, 0x60, 0xD9, + 0xDA, 0xA9, 0xA5, 0xDC, 0x4F, 0xA5, 0x81, 0xD5, 0xED, 0xB5, 0x2D, 0xCF, + 0x9B, 0xBD, 0x74, 0xC9, 0x6A, 0xB8, 0x8C, 0xC6, 0x1A, 0xC2, 0x7E, 0xD8, + 0xC7, 0xDD, 0x49, 0xED, 0xCB, 0xF2, 0xAF, 0xF2, 0xE8, 0xFC, 0x0C, 0xF0, + 0x22, 0x06, 0x58, 0xF8, 0x01, 0x11, 0x38, 0x0C, 0xEC, 0x0F, 0xEB, 0x00, + 0x9E, 0x07, 0x88, 0xEA, 0xB9, 0x0C, 0x19, 0xF9, 0x4C, 0x1A, 0x29, 0x0D, + 0x09, 0x12, 0x35, 0xFF, 0x8C, 0x03, 0x56, 0xF4, 0x04, 0x10, 0x0B, 0x08, + 0xEC, 0x14, 0x3A, 0x0D, 0xFD, 0x17, 0xBB, 0x0A, 0x0A, 0x36, 0x0D, 0x1F, + 0x79, 0x44, 0x42, 0x20, 0xF9, 0x33, 0x6A, 0x0C, 0x39, 0x33, 0x62, 0x1D, + 0x6A, 0x3A, 0x7B, 0x34, 0xCE, 0x30, 0x35, 0x1E, 0x56, 0x3C, 0x54, 0x0C, + 0x02, 0x58, 0x05, 0x22, 0xB9, 0x4E, 0xFB, 0x2F, 0x16, 0x36, 0x4C, 0x27, + 0x27, 0x3A, 0x24, 0x2C, 0xFC, 0x43, 0x99, 0x36, 0x57, 0x43, 0xA6, 0x2B, + 0x72, 0x4F, 0xBA, 0x29, 0xA8, 0x4E, 0x8B, 0x36, 0x05, 0x32, 0x2F, 0x34, + 0x85, 0x2E, 0x9E, 0x38, 0x07, 0x44, 0x3C, 0x4A, 0x68, 0x4F, 0x4C, 0x56, + 0x2F, 0x59, 0x58, 0x5F, 0xF1, 0x63, 0xD5, 0x63, 0x92, 0x61, 0x88, 0x64, + 0x0B, 0x5D, 0x29, 0x62, 0x04, 0x60, 0x73, 0x5A, 0x9E, 0x5D, 0x17, 0x58, + 0x81, 0x53, 0xDF, 0x57, 0x8B, 0x4E, 0xEE, 0x55, 0x91, 0x50, 0x2A, 0x56, + 0xC4, 0x54, 0x84, 0x51, 0xDC, 0x57, 0x30, 0x46, 0xA6, 0x50, 0x7B, 0x40, + 0xB3, 0x4A, 0xD3, 0x48, 0x68, 0x48, 0x95, 0x4E, 0x27, 0x41, 0x60, 0x4C, + 0xB4, 0x38, 0xB6, 0x43, 0xD1, 0x37, 0x31, 0x3A, 0x0E, 0x3B, 0x19, 0x39, + 0x17, 0x36, 0x56, 0x44, 0x7D, 0x34, 0xFF, 0x4E, 0x6D, 0x39, 0xAF, 0x4B, + 0xDA, 0x2A, 0xFE, 0x3E, 0x2A, 0x1B, 0xBB, 0x38, 0x99, 0x1B, 0xD4, 0x38, + 0x59, 0x19, 0x83, 0x31, 0x5E, 0x1A, 0xDB, 0x2B, 0xB7, 0x0D, 0x84, 0x26, + 0x81, 0xEB, 0x32, 0x16, 0xCF, 0xE4, 0x48, 0x0C, 0x90, 0xFB, 0xDB, 0x0C, + 0x71, 0x00, 0x1B, 0xFB, 0xC3, 0xFC, 0x0F, 0xE9, 0xDD, 0x10, 0xA7, 0xF4, + 0x43, 0x24, 0xC4, 0x07, 0xAE, 0x1A, 0x2E, 0x0B, 0x0A, 0x10, 0xAF, 0x0B, + 0xFB, 0x0B, 0xD2, 0x0D, 0xD2, 0xFD, 0x35, 0xFE, 0x67, 0xF7, 0x88, 0xE9, + 0x77, 0x02, 0x25, 0xF4, 0xC3, 0xEF, 0x13, 0xFB, 0x3B, 0xC6, 0xC4, 0xEC, + 0x2E, 0xC9, 0xD4, 0xF4, 0x7C, 0xE7, 0x20, 0x05, 0x1C, 0xEA, 0xA1, 0xFE, + 0xAB, 0xDC, 0x37, 0x00, 0xC8, 0xDE, 0x15, 0x11, 0x5B, 0xE3, 0xAE, 0x0B, + 0xAF, 0xE0, 0x48, 0x04, 0x23, 0xE9, 0x12, 0x0F, 0xF6, 0xF6, 0x64, 0x18, + 0x57, 0xF1, 0x14, 0x17, 0xD4, 0xE7, 0x13, 0x11, 0x51, 0xF2, 0x38, 0x12, + 0x38, 0x02, 0x81, 0x18, 0xA2, 0x02, 0x77, 0x19, 0xC1, 0x01, 0x65, 0x13, + 0xF4, 0x0A, 0x16, 0x15, 0xB2, 0x14, 0x98, 0x20, 0x21, 0x14, 0x36, 0x1A, + 0x63, 0x0B, 0x54, 0x08, 0x60, 0xFC, 0x41, 0x00, 0x36, 0xEF, 0x68, 0xF7, + 0x92, 0xF3, 0x8F, 0xF3, 0x21, 0xEB, 0xA8, 0xED, 0xA0, 0xDB, 0xA1, 0xDC, + 0x26, 0xE9, 0x67, 0xD9, 0x5A, 0xFA, 0x8E, 0xE0, 0xF3, 0xEF, 0xA6, 0xDF, + 0x17, 0xDA, 0x07, 0xDB, 0x22, 0xDD, 0xFE, 0xDF, 0x04, 0xED, 0x44, 0xDE, + 0x75, 0xF3, 0xB8, 0xCE, 0xE9, 0xF2, 0x44, 0xC1, 0x3E, 0xE9, 0x31, 0xBD, + 0xEC, 0xD6, 0xA8, 0xBC, 0xF6, 0xD2, 0x13, 0xC2, 0xAA, 0xD7, 0x9D, 0xC5, + 0xEE, 0xD5, 0x12, 0xC0, 0x38, 0xD8, 0x90, 0xBC, 0x81, 0xD5, 0x15, 0xB2, + 0x20, 0xCA, 0xEA, 0xA3, 0xBD, 0xCF, 0xEA, 0xB2, 0xD9, 0xE1, 0xBD, 0xCE, + 0xA2, 0xDE, 0x1D, 0xCB, 0xAB, 0xDC, 0x22, 0xCB, 0x51, 0xEA, 0x1E, 0xE5, + 0xFF, 0xE3, 0xA0, 0xE7, 0x39, 0xD8, 0x39, 0xD8, 0xEC, 0xE3, 0x97, 0xD9, + 0x3D, 0xEF, 0xF1, 0xD2, 0xB3, 0xE9, 0x13, 0xC2, 0x19, 0xEF, 0xD7, 0xCF, + 0x15, 0xFA, 0x20, 0xE2, 0x15, 0xF6, 0x13, 0xD2, 0x8C, 0xF6, 0x98, 0xB9, + 0xBC, 0x04, 0x55, 0xC8, 0x8C, 0x08, 0x33, 0xDE, 0x5D, 0x05, 0xFF, 0xD8, + 0xBB, 0x09, 0x23, 0xDD, 0x18, 0x13, 0x0F, 0xEC, 0xD7, 0x1D, 0x4C, 0xEF, + 0x58, 0x23, 0x2C, 0xF1, 0x72, 0x22, 0x61, 0x01, 0xEB, 0x23, 0x9F, 0x0A, + 0xE9, 0x2C, 0x71, 0x03, 0xCA, 0x2E, 0xAC, 0x07, 0x81, 0x1D, 0xA7, 0x17, + 0x7A, 0x15, 0x6C, 0x15, 0x50, 0x1D, 0xCD, 0x11, 0x3D, 0x18, 0x91, 0x17, + 0xFC, 0x18, 0x2B, 0x1D, 0x74, 0x1A, 0x82, 0x23, 0xF5, 0x05, 0x0F, 0x1D, + 0x6B, 0xFC, 0x28, 0x14, 0x8D, 0x0B, 0xF9, 0x0E, 0xB0, 0x18, 0xE7, 0x0A, + 0x47, 0x1D, 0xA9, 0x0E, 0x9B, 0x2D, 0xD0, 0x13, 0xA7, 0x36, 0x67, 0x1A, + 0x38, 0x27, 0x6A, 0x25, 0xA7, 0x24, 0x40, 0x2E, 0xEC, 0x25, 0xBE, 0x2C, + 0xE5, 0x0F, 0x17, 0x23, 0xC8, 0xFF, 0xDF, 0x1E, 0x64, 0x0A, 0x19, 0x26, + 0xDF, 0x0B, 0x57, 0x29, 0x8E, 0x00, 0x07, 0x27, 0x46, 0xFF, 0xA5, 0x1E, + 0x26, 0xF8, 0xA5, 0x1B, 0xAF, 0xEC, 0xF3, 0x24, 0x1B, 0xEB, 0x20, 0x23, + 0x2D, 0xEF, 0xDF, 0x22, 0xA0, 0xEC, 0xE5, 0x29, 0xE4, 0xE4, 0xAC, 0x29, + 0xDE, 0xE6, 0xAE, 0x25, 0xAC, 0xF5, 0x0A, 0x2B, 0xC0, 0xF4, 0xF0, 0x29, + 0xD8, 0xE0, 0xD3, 0x0C, 0xD6, 0xE9, 0xA6, 0x09, 0x29, 0xFA, 0xFD, 0x1C, + 0x7B, 0xEC, 0x6F, 0x13, 0x03, 0xE3, 0x4E, 0x10, 0x4C, 0xF0, 0x8A, 0x14, + 0xE1, 0xEC, 0xB3, 0xFF, 0x23, 0xDF, 0x5A, 0xF0, 0x46, 0xF6, 0xE5, 0x01, + 0xF3, 0xFB, 0x3A, 0x09, 0xED, 0xC9, 0x1E, 0xEE, 0x2B, 0xB2, 0x0E, 0xE2, + 0x94, 0xC9, 0xB5, 0xEA, 0x8C, 0xD8, 0xFA, 0xDD, 0xC5, 0xD3, 0xBB, 0xCC, + 0xF1, 0xD5, 0x99, 0xDB, 0xAF, 0xE7, 0xFA, 0xEB, 0x66, 0xEF, 0x1A, 0xF5, + 0x64, 0xFF, 0xF8, 0xFA, 0xC6, 0x13, 0xE3, 0xE2, 0xAF, 0x0B, 0x49, 0xCF, + 0x22, 0xFC, 0x41, 0xD5, 0x96, 0xF8, 0x9E, 0xE3, 0x14, 0xF6, 0xFD, 0xEB, + 0x77, 0xEA, 0xA7, 0xE7, 0x29, 0xE5, 0x29, 0xEB, 0x3D, 0xF3, 0x43, 0xE6, + 0xE6, 0xFB, 0x5B, 0xDB, 0x1E, 0xF1, 0x3D, 0xE2, 0xA7, 0xE5, 0xDA, 0xE9, + 0x49, 0xDC, 0x96, 0xED, 0x7F, 0xDC, 0x89, 0xEB, 0xC0, 0xE3, 0x19, 0xEF, + 0x73, 0xDA, 0x92, 0xF7, 0xCF, 0xE2, 0x60, 0xF9, 0xF0, 0xFB, 0x67, 0xF9, + 0xAF, 0xF7, 0x53, 0xEF, 0xB1, 0xE5, 0x05, 0xE5, 0xBC, 0xE4, 0x19, 0xE1, + 0x7C, 0xEB, 0x80, 0xE1, 0x9A, 0xDE, 0xAE, 0xE0, 0x2A, 0xD9, 0xAE, 0xD5, + 0xFF, 0xE7, 0x89, 0xCE, 0xFE, 0xE8, 0xCD, 0xC5, 0x5D, 0xE5, 0x6C, 0xB7, + 0x67, 0xE4, 0xB5, 0xBE, 0x33, 0xCE, 0x50, 0xC1, 0xC8, 0xC8, 0x1C, 0xC2, + 0xB3, 0xD9, 0x88, 0xCA, 0x16, 0xCB, 0x48, 0xBD, 0x77, 0xBB, 0x5F, 0xB8, + 0x8C, 0xDA, 0xBB, 0xD1, 0x78, 0xED, 0xA1, 0xD6, 0x22, 0xD1, 0x85, 0xB0, + 0x8E, 0xC5, 0x27, 0xAF, 0x94, 0xD2, 0x9F, 0xD0, 0x13, 0xCB, 0x49, 0xD1, + 0x6D, 0xC5, 0x7C, 0xC7, 0x42, 0xC9, 0x25, 0xCE, 0xCA, 0xB5, 0xEF, 0xCA, + 0x6A, 0xA6, 0x56, 0xBE, 0x4E, 0xC0, 0x03, 0xD0, 0xB6, 0xDA, 0x37, 0xD7, + 0xB6, 0xC7, 0xCB, 0xB9, 0x7E, 0xB9, 0x7C, 0xB1, 0x2F, 0xCD, 0x22, 0xBA, + 0x52, 0xD8, 0xB1, 0xBF, 0x6B, 0xD3, 0xAB, 0xBE, 0xAF, 0xD8, 0xB6, 0xB3, + 0x0A, 0xF0, 0xC0, 0xB9, 0xD2, 0x07, 0x29, 0xC2, 0x89, 0x05, 0x91, 0xC6, + 0x20, 0xEC, 0xC3, 0xD8, 0x8B, 0xE0, 0x9F, 0xE6, 0xD2, 0xE7, 0x54, 0xE4, + 0x55, 0xF2, 0x10, 0xE8, 0x8A, 0x01, 0xD6, 0xF8, 0xCB, 0x0A, 0xC2, 0xED, + 0x85, 0x00, 0x2A, 0xD9, 0x26, 0xF0, 0x4B, 0xF1, 0x20, 0xF8, 0xBF, 0x15, + 0x85, 0x07, 0x2F, 0x17, 0xDB, 0x00, 0x09, 0x11, 0x21, 0x00, 0x10, 0x1D, + 0x4F, 0x0E, 0xE3, 0x20, 0x9D, 0x18, 0xEF, 0x22, 0xE1, 0x1C, 0x31, 0x30, + 0x9A, 0x15, 0x66, 0x2F, 0x37, 0x06, 0x01, 0x1C, 0x93, 0x10, 0x4E, 0x15, + 0xCE, 0x24, 0x12, 0x20, 0xB6, 0x1D, 0xF2, 0x25, 0x88, 0x19, 0x35, 0x1F, + 0x53, 0x22, 0xB4, 0x22, 0x5B, 0x27, 0x7E, 0x31, 0x5B, 0x1E, 0x64, 0x3B, + 0x6A, 0x0C, 0x62, 0x36, 0x13, 0xFF, 0x1E, 0x27, 0x88, 0xFE, 0xA4, 0x1E, + 0xEF, 0x05, 0xE3, 0x12, 0xDA, 0x0C, 0xDF, 0x23, 0xA3, 0x0D, 0xD4, 0x40, + 0x01, 0x01, 0x57, 0x31, 0x55, 0x07, 0xDD, 0x24, 0x9D, 0x30, 0x6E, 0x30, + 0x2A, 0x32, 0xA7, 0x2F, 0x94, 0x00, 0xEA, 0x22, 0x5A, 0x00, 0xA1, 0x1D, + 0x05, 0x2B, 0x7E, 0x33, 0xF2, 0x2F, 0xA8, 0x4A, 0x63, 0x32, 0x5F, 0x50, + 0x29, 0x43, 0x6A, 0x4D, 0x64, 0x33, 0x00, 0x4B, 0x26, 0x29, 0x90, 0x51, + 0x5C, 0x3B, 0x8A, 0x4F, 0x27, 0x40, 0x66, 0x47, 0xB1, 0x31, 0x30, 0x37, + 0xC0, 0x30, 0x98, 0x30, 0x97, 0x3D, 0x78, 0x4F, 0x9C, 0x49, 0x7A, 0x67, + 0x15, 0x55, 0xF9, 0x52, 0xA1, 0x4E, 0x3C, 0x3C, 0x9B, 0x44, 0xDC, 0x48, + 0xFB, 0x4D, 0x39, 0x4B, 0x62, 0x52, 0x87, 0x41, 0x29, 0x4A, 0xFC, 0x4C, + 0xA2, 0x49, 0xCA, 0x43, 0x36, 0x54, 0x3F, 0x2D, 0xD1, 0x5D, 0xDD, 0x38, + 0x39, 0x63, 0x6A, 0x45, 0x11, 0x65, 0x44, 0x32, 0x0B, 0x5F, 0x95, 0x2D, + 0x5F, 0x57, 0x87, 0x40, 0xC0, 0x58, 0x3A, 0x3F, 0xB4, 0x57, 0x36, 0x38, + 0x36, 0x59, 0x70, 0x3F, 0x4A, 0x58, 0x4E, 0x43, 0x12, 0x44, 0xAA, 0x3D, + 0xBF, 0x40, 0x08, 0x41, 0x89, 0x56, 0x44, 0x4C, 0xA3, 0x5D, 0xF0, 0x3C, + 0xFE, 0x4C, 0x45, 0x2A, 0xA9, 0x3E, 0xA2, 0x3C, 0x29, 0x42, 0xF6, 0x46, + 0x10, 0x50, 0x29, 0x33, 0x43, 0x4F, 0x44, 0x21, 0x24, 0x3D, 0x48, 0x22, + 0xE8, 0x2A, 0x49, 0x2D, 0x5D, 0x23, 0x25, 0x27, 0x64, 0x23, 0x61, 0x14, + 0x25, 0x1E, 0x63, 0x08, 0x95, 0x15, 0xB7, 0x01, 0x58, 0x0B, 0xED, 0xFE, + 0x12, 0x18, 0x40, 0x01, 0xE5, 0x2A, 0x77, 0xF4, 0xB5, 0x19, 0xBF, 0xD8, + 0xB4, 0x0E, 0x5B, 0xDD, 0x3B, 0x14, 0x32, 0x02, 0xE0, 0xFF, 0x34, 0x00, + 0x85, 0xE7, 0x48, 0xE2, 0xBA, 0xDE, 0x51, 0xE4, 0x9D, 0xDE, 0xA0, 0xEF, + 0xB9, 0xE9, 0xF9, 0xE1, 0x1D, 0xEA, 0xCE, 0xE0, 0x7C, 0xDC, 0x1B, 0xEF, + 0x73, 0xCE, 0xF2, 0xE0, 0xC2, 0xD5, 0x9B, 0xE6, 0xE9, 0xE9, 0x5B, 0x0D, + 0xA0, 0xDB, 0xDE, 0x09, 0xC5, 0xC0, 0x04, 0xEB, 0x9E, 0xC5, 0x24, 0xE9, + 0x23, 0xD8, 0xF1, 0xEE, 0x12, 0xDB, 0x11, 0xDC, 0x08, 0xD3, 0x2B, 0xD1, + 0x60, 0xCE, 0xA7, 0xDC, 0xD1, 0xCD, 0xF4, 0xEC, 0x9F, 0xDA, 0x15, 0xF7, + 0xDD, 0xF3, 0x87, 0xF5, 0x55, 0x02, 0x46, 0xE9, 0x01, 0xF9, 0xD3, 0xD9, + 0xBE, 0xE8, 0xF1, 0xEC, 0x2D, 0xF3, 0xF8, 0x0D, 0x58, 0x06, 0x32, 0x15, + 0x6D, 0xFF, 0x4B, 0x0A, 0xE2, 0xF6, 0x49, 0x02, 0xC5, 0x05, 0x17, 0x0F, + 0x5D, 0x0C, 0xFD, 0x18, 0x6B, 0xFF, 0xA8, 0x17, 0xE3, 0xF6, 0x60, 0x1A, + 0x1D, 0xFA, 0xB7, 0x0E, 0xC3, 0x06, 0xF4, 0xFF, 0xF6, 0x0D, 0x5F, 0x11, + 0xDF, 0x07, 0x26, 0x1A, 0x45, 0xF4, 0x78, 0x03, 0xE1, 0xE7, 0x0D, 0x01, + 0x36, 0x02, 0xF2, 0x0E, 0xC1, 0x1B, 0x82, 0x13, 0x2D, 0x09, 0x72, 0x13, + 0xF4, 0xE6, 0x90, 0x0B, 0xF3, 0xEC, 0xE4, 0x0C, 0xDE, 0x02, 0x0F, 0x11, + 0xE0, 0xF6, 0x31, 0x14, 0x88, 0xF0, 0x57, 0x1E, 0xB5, 0xFD, 0xC6, 0x22, + 0x1C, 0xF9, 0xF8, 0x16, 0x57, 0x07, 0xFC, 0x1B, 0x66, 0x1C, 0xCC, 0x2E, + 0x59, 0xF9, 0x6D, 0x1A, 0xAA, 0xD9, 0xB1, 0x09, 0x6F, 0xFE, 0xCF, 0x24, + 0x47, 0x23, 0xBB, 0x36, 0xC0, 0x0D, 0x7B, 0x1C, 0xBF, 0xFD, 0xB5, 0x0F, + 0x0F, 0x17, 0xAF, 0x2A, 0x81, 0x21, 0xBE, 0x2E, 0xB4, 0x1E, 0xF1, 0x1B, + 0x1C, 0x2B, 0xE4, 0x1F, 0xC5, 0x23, 0x9C, 0x1A, 0x15, 0x15, 0xC3, 0x05, + 0x2D, 0x1C, 0x0D, 0x12, 0xE6, 0x1D, 0xCF, 0x1F, 0xEB, 0x12, 0x69, 0x03, + 0x3E, 0x09, 0x5E, 0xE2, 0xA8, 0x05, 0xE2, 0xED, 0x21, 0x0B, 0xC2, 0xFC, + 0x87, 0x00, 0xC3, 0xEA, 0xBD, 0xE2, 0xD0, 0xEC, 0xA7, 0xE5, 0x63, 0xFE, + 0x55, 0x05, 0xC1, 0xEC, 0x4E, 0x12, 0xF4, 0xD8, 0x5B, 0x13, 0x51, 0xE6, + 0x2C, 0x0A, 0x18, 0xEB, 0x40, 0xF1, 0x3D, 0xE1, 0xB5, 0xEA, 0x89, 0xF2, + 0x38, 0x00, 0x80, 0xFB, 0x7A, 0x03, 0xE0, 0xDD, 0xBA, 0xF7, 0x0E, 0xD3, + 0x41, 0xFC, 0xEC, 0xED, 0x50, 0xF8, 0x3C, 0xFB, 0x87, 0xF5, 0x41, 0xF0, + 0x92, 0x07, 0x80, 0xE8, 0x34, 0x11, 0x5D, 0xDD, 0x82, 0xFC, 0x70, 0xD8, + 0x26, 0xF0, 0x14, 0xEE, 0xB2, 0xFD, 0x12, 0xF5, 0x85, 0xF7, 0xDF, 0xDC, + 0xAD, 0xDF, 0x93, 0xC5, 0xB9, 0xE0, 0xA4, 0xD1, 0x06, 0xEF, 0x15, 0xE9, + 0xE1, 0xE3, 0xE2, 0xE3, 0xEB, 0xC8, 0x3C, 0xD8, 0x9A, 0xC2, 0xF5, 0xD2, + 0x59, 0xC8, 0xB0, 0xDD, 0x8C, 0xC2, 0x6B, 0xF0, 0x14, 0xB3, 0xE2, 0xEA, + 0x41, 0xAF, 0xA6, 0xD0, 0x18, 0xB9, 0xE9, 0xBE, 0xEB, 0xBD, 0xE0, 0xC2, + 0x28, 0xC7, 0x2F, 0xCC, 0x09, 0xC3, 0x97, 0xC7, 0x66, 0xA5, 0x5C, 0xB6, + 0xC5, 0x9F, 0x50, 0xB2, 0x05, 0xC4, 0x75, 0xCC, 0x77, 0xCB, 0x52, 0xCD, + 0x87, 0xA9, 0x90, 0xAD, 0x5F, 0xA5, 0xF4, 0xA3, 0x3A, 0xB5, 0x9F, 0xB0, + 0x72, 0xAE, 0x2A, 0xB2, 0xA2, 0xA4, 0xF2, 0xAE, 0xD4, 0x9F, 0x46, 0xBB, + 0x50, 0x9E, 0x79, 0xB4, 0xBE, 0xA6, 0x89, 0xB1, 0x7F, 0xB6, 0x15, 0xC7, + 0x9B, 0xBA, 0x45, 0xBA, 0x80, 0xA9, 0xA2, 0xA0, 0x89, 0xA1, 0x42, 0xA3, + 0x0B, 0xAB, 0x9E, 0xB3, 0x54, 0xA9, 0x81, 0xB6, 0xB6, 0xA0, 0xEC, 0xA8, + 0x2A, 0xA4, 0x6F, 0xA5, 0xB8, 0xA7, 0x17, 0xA5, 0x8A, 0xA0, 0x3C, 0xA1, + 0xD0, 0xA2, 0xB6, 0xB0, 0x0B, 0xAF, 0x9A, 0xBA, 0x06, 0xA8, 0xC4, 0xAA, + 0x6B, 0xA7, 0x85, 0xB0, 0x2F, 0xC2, 0x19, 0xCE, 0xF8, 0xC8, 0xAF, 0xC8, + 0x4A, 0xA9, 0xD4, 0xB7, 0xD1, 0xA5, 0x0C, 0xCA, 0x7F, 0xCA, 0x33, 0xD7, + 0x25, 0xD4, 0xB1, 0xD1, 0xD3, 0xC8, 0xD2, 0xD9, 0x66, 0xC8, 0x4F, 0xE8, + 0xBA, 0xC2, 0x99, 0xDB, 0x21, 0xC1, 0x85, 0xD9, 0xF0, 0xD0, 0x7F, 0xEE, + 0xBF, 0xD5, 0x33, 0xE4, 0x5E, 0xC1, 0xB5, 0xC8, 0x59, 0xCA, 0x14, 0xCE, + 0xB5, 0xF3, 0xE3, 0xE1, 0xE9, 0xED, 0x29, 0xDC, 0x4B, 0xD0, 0x9D, 0xD5, + 0x51, 0xD5, 0x8B, 0xD9, 0x2B, 0xE9, 0xBA, 0xDA, 0x89, 0xF0, 0x5D, 0xE4, + 0xA0, 0xF8, 0xCA, 0xDF, 0xF7, 0xF4, 0x41, 0xCA, 0xC1, 0xE4, 0x6B, 0xD7, + 0x78, 0xEB, 0x5C, 0xE5, 0xEA, 0xFC, 0x39, 0xE9, 0xC5, 0xF4, 0x6D, 0xEE, + 0x8B, 0xE9, 0xB0, 0xDD, 0x30, 0x00, 0x79, 0xD7, 0x1A, 0x1C, 0x2E, 0xEE, + 0xE8, 0x14, 0x3E, 0xFF, 0xCB, 0xFE, 0x82, 0xEC, 0xA3, 0xFF, 0xD5, 0xE3, + 0xAA, 0x0E, 0xAD, 0x02, 0x45, 0x14, 0xAE, 0x04, 0x33, 0x19, 0x46, 0xF9, + 0xD0, 0x20, 0x60, 0x09, 0x03, 0x21, 0x98, 0x04, 0x9E, 0x27, 0x11, 0xF4, + 0xD6, 0x41, 0xBF, 0x03, 0x13, 0x4E, 0xCF, 0x0A, 0x28, 0x35, 0x9A, 0xF0, + 0x06, 0x20, 0xFD, 0xEE, 0x09, 0x27, 0xB6, 0x0B, 0x6C, 0x2A, 0x7E, 0x11, + 0xC2, 0x22, 0xDB, 0xFA, 0x02, 0x27, 0xF5, 0xF2, 0x5E, 0x3B, 0x9A, 0xFE, + 0xBA, 0x41, 0xB1, 0xFB, 0xCC, 0x36, 0xE4, 0x07, 0x16, 0x3C, 0x5E, 0x19, + 0x02, 0x35, 0x44, 0x06, 0x9A, 0x25, 0xAE, 0x07, 0xC5, 0x34, 0x63, 0x33, + 0x5A, 0x31, 0x88, 0x45, 0x93, 0x13, 0xF3, 0x29, 0xCE, 0x17, 0x6C, 0x1F, + 0x1F, 0x3C, 0x48, 0x28, 0xEB, 0x3E, 0x01, 0x27, 0x49, 0x28, 0xDD, 0x33, + 0xD9, 0x29, 0x3F, 0x41, 0x77, 0x25, 0x4D, 0x32, 0x36, 0x1F, 0x9E, 0x24, + 0x91, 0x30, 0x89, 0x2E, 0xC7, 0x36, 0xE4, 0x2F, 0x27, 0x22, 0x70, 0x1A, + 0xFB, 0x1C, 0x7C, 0x1A, 0x3B, 0x2F, 0x8B, 0x31, 0x1E, 0x26, 0x31, 0x32, + 0x55, 0x08, 0xAF, 0x28, 0xFC, 0x03, 0xDF, 0x1F, 0xCA, 0x1A, 0x33, 0x1A, + 0x32, 0x20, 0xBF, 0x1B, 0xFD, 0x18, 0x55, 0x1B, 0x93, 0x14, 0x5A, 0x16, + 0x08, 0x0E, 0x3D, 0x13, 0x3C, 0x0B, 0x52, 0x07, 0xD7, 0x13, 0xA9, 0x0E, + 0x1E, 0x1C, 0x34, 0x1E, 0x40, 0x05, 0x59, 0x07, 0xD6, 0xF8, 0x0D, 0xFA, + 0xFC, 0x19, 0x1D, 0x13, 0x04, 0x24, 0x29, 0x1E, 0xE5, 0xFE, 0x28, 0x01, + 0xE3, 0xF2, 0x1D, 0xF3, 0xCA, 0x02, 0x5E, 0x0A, 0xE4, 0xF2, 0x68, 0x1C, + 0x46, 0xEB, 0x49, 0x1E, 0x01, 0xFB, 0x0F, 0x1D, 0xCB, 0xFC, 0x49, 0x0D, + 0x55, 0x02, 0x01, 0xF1, 0x4D, 0x18, 0xDC, 0xF1, 0xA5, 0x12, 0x27, 0x06, + 0xE4, 0xE8, 0xA9, 0xFD, 0xE4, 0xE3, 0x73, 0xEE, 0x59, 0xF9, 0x9F, 0x05, + 0xDF, 0xFA, 0x83, 0x11, 0xB8, 0xF5, 0xC7, 0xE9, 0x7A, 0xFA, 0x52, 0xD8, + 0xFD, 0x05, 0x13, 0xEF, 0xBA, 0x13, 0x34, 0xF4, 0x15, 0x26, 0xA7, 0xF9, + 0xD9, 0x25, 0x0F, 0x10, 0x84, 0x14, 0xBC, 0x09, 0xCD, 0x15, 0xF6, 0x01, + 0xA8, 0x30, 0x0B, 0x22, 0x68, 0x3E, 0x66, 0x21, 0xD0, 0x32, 0xA3, 0x02, + 0x34, 0x34, 0x08, 0x0C, 0x09, 0x40, 0x12, 0x29, 0x9F, 0x41, 0xF3, 0x33, + 0x9E, 0x36, 0xFB, 0x34, 0x78, 0x2F, 0x41, 0x30, 0xCB, 0x34, 0xCA, 0x17, + 0xCB, 0x38, 0xC0, 0x1D, 0x99, 0x43, 0xE6, 0x3B, 0x56, 0x49, 0x2B, 0x39, + 0x20, 0x36, 0x83, 0x28, 0x80, 0x24, 0x36, 0x2A, 0xF4, 0x2E, 0x26, 0x39, + 0x51, 0x35, 0xE2, 0x37, 0xAF, 0x1E, 0x85, 0x27, 0xA5, 0x17, 0x62, 0x17, + 0x56, 0x2E, 0x1C, 0x19, 0x5D, 0x3C, 0xD7, 0x2C, 0x69, 0x3C, 0x7F, 0x30, + 0xF8, 0x31, 0x41, 0x1E, 0x5E, 0x2B, 0x74, 0x18, 0x2B, 0x36, 0x58, 0x25, + 0x65, 0x49, 0xAF, 0x33, 0xAA, 0x4B, 0x8A, 0x2A, 0x7E, 0x34, 0xAA, 0x12, + 0x54, 0x32, 0x97, 0x18, 0xD5, 0x53, 0x91, 0x37, 0xE4, 0x51, 0xE4, 0x33, + 0x5B, 0x2F, 0x2D, 0x15, 0x4A, 0x2A, 0x3A, 0x16, 0xAF, 0x36, 0x56, 0x31, + 0xBD, 0x33, 0xBC, 0x3B, 0x2F, 0x2E, 0x92, 0x35, 0xED, 0x31, 0x0B, 0x28, + 0xCE, 0x27, 0x37, 0x15, 0x37, 0x24, 0x4C, 0x14, 0x3B, 0x38, 0x0C, 0x26, + 0xD8, 0x23, 0x72, 0x28, 0x3E, 0xF1, 0xFE, 0x15, 0x12, 0xEF, 0x72, 0x0D, + 0x0C, 0x0C, 0x27, 0x15, 0xE6, 0x10, 0x3B, 0x13, 0xFF, 0x03, 0xB2, 0xFE, + 0x42, 0x05, 0xD1, 0xFA, 0xD1, 0x11, 0x20, 0x02, 0x06, 0x20, 0x15, 0x02, + 0x26, 0x20, 0xEE, 0x0D, 0xEA, 0x08, 0xA9, 0x13, 0x07, 0xF2, 0xCB, 0x0B, + 0x9C, 0xF5, 0x7A, 0x0D, 0x22, 0x0D, 0x19, 0x14, 0xFE, 0x0E, 0x05, 0x11, + 0x9E, 0x03, 0x0C, 0x09, 0x16, 0x07, 0x8A, 0x14, 0x6C, 0x10, 0xB7, 0x25, + 0xBA, 0x17, 0xA0, 0x25, 0x73, 0x15, 0xAE, 0x22, 0x70, 0xFC, 0xD0, 0x17, + 0x8E, 0xE8, 0xE2, 0x0D, 0x57, 0xFA, 0xE6, 0x13, 0x17, 0x02, 0xF4, 0x13, + 0xAB, 0xEA, 0x27, 0x08, 0x5C, 0xD2, 0x38, 0x01, 0xE9, 0xCD, 0x33, 0x0E, + 0x52, 0xD3, 0x80, 0x12, 0x8A, 0xC9, 0x02, 0x05, 0xCF, 0xC0, 0x7D, 0xF9, + 0x63, 0xC2, 0x91, 0xF9, 0xDA, 0xC8, 0xEC, 0x04, 0xBC, 0xD9, 0x98, 0x05, + 0x09, 0xD2, 0x5C, 0x02, 0x2D, 0xC2, 0x97, 0xFE, 0xA7, 0xC6, 0x6D, 0xF5, + 0x35, 0xCA, 0xAD, 0xFB, 0xA7, 0xD2, 0x18, 0x0F, 0xF2, 0xCC, 0x53, 0x0A, + 0xD1, 0xB6, 0x60, 0xEC, 0xBA, 0xC3, 0x7A, 0xEF, 0x1F, 0xE6, 0x64, 0xF9, + 0x26, 0xDA, 0x01, 0xDF, 0x11, 0xB1, 0xDC, 0xDD, 0x4C, 0xAF, 0x74, 0xFE, + 0x39, 0xC6, 0x12, 0x06, 0x84, 0xC7, 0x16, 0xFE, 0x12, 0xC9, 0xDE, 0x00, + 0x47, 0xCD, 0xCA, 0xDD, 0x60, 0xC4, 0x75, 0xB3, 0x23, 0xCF, 0x54, 0xD5, + 0xCE, 0xD8, 0xBE, 0xF2, 0x6D, 0xB8, 0x67, 0xD5, 0x9D, 0xA1, 0x79, 0xC2, + 0xE4, 0xB9, 0x6C, 0xC2, 0xEA, 0xCD, 0xD5, 0xBC, 0xD0, 0xBF, 0xC5, 0xB0, + 0xA2, 0xB9, 0xBD, 0xAE, 0x87, 0xC5, 0xCC, 0xB3, 0xFD, 0xCC, 0x5E, 0xB8, + 0x6B, 0xDA, 0xA4, 0xCB, 0x71, 0xDA, 0xE8, 0xD8, 0x82, 0xC3, 0xD9, 0xCC, + 0xE0, 0xC5, 0x49, 0xCB, 0xFD, 0xEA, 0xEA, 0xD6, 0x8A, 0xF7, 0x8B, 0xD6, + 0xC0, 0xE2, 0x17, 0xD3, 0x60, 0xE8, 0xD9, 0xD4, 0x43, 0xFE, 0x64, 0xDE, + 0x72, 0xFB, 0x6C, 0xE8, 0xDF, 0xF4, 0x8F, 0xE8, 0x79, 0xF5, 0xDD, 0xDF, + 0xD9, 0xEF, 0x78, 0xDB, 0xF2, 0xF4, 0x15, 0xE9, 0x16, 0xFF, 0x5E, 0xF7, + 0xEA, 0xF4, 0xD8, 0xF2, 0xDF, 0xE3, 0x72, 0xE7, 0xE0, 0xE8, 0x89, 0xE4, + 0x43, 0xF4, 0xC6, 0xEB, 0xC8, 0xEF, 0x9A, 0xF1, 0xAA, 0xE6, 0x3E, 0xF0, + 0x0D, 0xDF, 0x91, 0xEE, 0x87, 0xE1, 0xCF, 0xEE, 0x8E, 0xEA, 0x2C, 0xEE, + 0x15, 0xEC, 0x1E, 0xF5, 0xB0, 0xE7, 0xB0, 0xF9, 0x63, 0xE2, 0xDA, 0xF3, + 0x4B, 0xE2, 0x3C, 0xF4, 0x0B, 0xF6, 0x6B, 0x0D, 0x8E, 0x03, 0x4F, 0x1F, + 0xDA, 0xF9, 0xE3, 0x01, 0x0F, 0x03, 0xAD, 0xF0, 0x02, 0x23, 0xBF, 0x07, + 0x7A, 0x18, 0xE9, 0x0B, 0x7E, 0xEC, 0xF1, 0xFF, 0x05, 0xE8, 0x9B, 0x04, + 0xAB, 0xFA, 0x7A, 0x14, 0x9E, 0xFF, 0x94, 0x0E, 0x36, 0x0D, 0xC9, 0x01, + 0xD2, 0x16, 0x5D, 0xFF, 0xBB, 0xFE, 0x16, 0xED, 0xDF, 0xED, 0x4E, 0xF8, + 0x21, 0xFC, 0x1C, 0x1A, 0x3E, 0xF6, 0xF1, 0x06, 0xB8, 0xDB, 0x39, 0xE0, + 0xD5, 0xD9, 0x82, 0xDF, 0xF4, 0xE9, 0xF0, 0xF7, 0x53, 0xEE, 0xDC, 0xF1, + 0xE2, 0xE8, 0x3F, 0xD9, 0x36, 0xEB, 0x6D, 0xD9, 0x82, 0xFE, 0xDF, 0xD9, + 0x00, 0x0E, 0x1D, 0xE2, 0xE1, 0x01, 0xBA, 0xFB, 0xDC, 0xE6, 0x5A, 0xF8, + 0xCC, 0xD5, 0x91, 0xDB, 0xF8, 0xE1, 0x2A, 0xE8, 0xCB, 0xF7, 0x8A, 0x0C, + 0x86, 0xF6, 0xCA, 0x03, 0x12, 0xEF, 0x87, 0xF0, 0x80, 0xFF, 0xF8, 0x03, + 0x75, 0x13, 0x44, 0x14, 0x6C, 0x0A, 0x2C, 0x16, 0x17, 0xF7, 0x3F, 0x23, + 0xC7, 0xEE, 0x00, 0x1E, 0x24, 0xEB, 0x05, 0x09, 0x81, 0xF7, 0x74, 0x0C, + 0x8E, 0x0A, 0x4C, 0x10, 0x3B, 0xF9, 0xE1, 0xFB, 0x12, 0xD8, 0xF1, 0xF5, + 0xEB, 0xEB, 0x35, 0x0E, 0x84, 0x05, 0x0F, 0x11, 0x04, 0xF4, 0xC2, 0x04, + 0x5D, 0xED, 0xC9, 0xFE, 0xAA, 0x01, 0x01, 0xF1, 0xB8, 0x12, 0x47, 0xEB, + 0x60, 0x15, 0xC7, 0xF5, 0x20, 0x0E, 0xF1, 0xF5, 0x67, 0x03, 0xC1, 0xEA, + 0x28, 0xFC, 0xBD, 0xEE, 0x3A, 0x08, 0x18, 0x01, 0x10, 0x20, 0x5B, 0x08, + 0xB5, 0x1B, 0x78, 0xF0, 0xA9, 0x05, 0x60, 0xD6, 0x56, 0x09, 0xA9, 0xE0, + 0x88, 0x0A, 0xA1, 0xF8, 0x75, 0xF4, 0x34, 0xF6, 0x09, 0xE9, 0x58, 0xF6, + 0x54, 0xED, 0xCB, 0x0C, 0x00, 0xF6, 0x77, 0x08, 0x0A, 0xFF, 0x5D, 0xF9, + 0x7D, 0x06, 0xFA, 0x02, 0xC0, 0x02, 0x1F, 0xF7, 0x0E, 0x00, 0xDC, 0xE0, + 0xC9, 0x1A, 0x37, 0xF5, 0xEE, 0x24, 0x63, 0x10, 0x78, 0x08, 0xC2, 0xF6, + 0x0F, 0xF3, 0x6B, 0xD7, 0x8A, 0xFF, 0x98, 0xEC, 0xB7, 0x1B, 0xFA, 0xF7, + 0x67, 0x21, 0xD8, 0xE0, 0xFA, 0x20, 0xF6, 0xD9, 0xBB, 0x1D, 0x6A, 0xE8, + 0xE7, 0x1B, 0xBF, 0xEF, 0x6B, 0x2A, 0xD8, 0xF8, 0xB0, 0x2F, 0xA8, 0x0E, + 0xAC, 0x21, 0x17, 0x01, 0x59, 0x19, 0x32, 0xEE, 0x8B, 0x37, 0x4F, 0x0F, + 0x1B, 0x4F, 0xC6, 0x23, 0x6E, 0x35, 0xAF, 0x11, 0xBF, 0x24, 0x8D, 0x14, + 0x87, 0x35, 0xD0, 0x2D, 0xE4, 0x40, 0xD8, 0x2A, 0xA7, 0x3A, 0x47, 0x22, + 0x0F, 0x34, 0xE3, 0x2F, 0xB6, 0x32, 0x19, 0x25, 0x2C, 0x39, 0x02, 0x18, + 0x0E, 0x3C, 0x00, 0x2C, 0x74, 0x2F, 0xAA, 0x2C, 0xC2, 0x1F, 0x87, 0x0E, + 0x53, 0x27, 0x76, 0x15, 0x1A, 0x41, 0x2B, 0x2F, 0xE3, 0x39, 0x28, 0x22, + 0x78, 0x22, 0xEE, 0x15, 0x93, 0x21, 0xE5, 0x18, 0x1F, 0x2A, 0xBB, 0x1A, + 0x6E, 0x30, 0x6E, 0x16, 0xF9, 0x30, 0x32, 0x1B, 0x76, 0x2F, 0x55, 0x1B, + 0xD0, 0x2C, 0xD9, 0x14, 0xE1, 0x29, 0xD6, 0x26, 0x32, 0x3C, 0x78, 0x3D, + 0x46, 0x54, 0xAA, 0x42, 0x06, 0x4A, 0xE3, 0x2B, 0x32, 0x3C, 0xF9, 0x19, + 0x37, 0x4B, 0x96, 0x2C, 0x76, 0x43, 0x37, 0x38, 0x1E, 0x21, 0x3C, 0x30, + 0x58, 0x22, 0xCA, 0x34, 0x26, 0x3C, 0x3C, 0x3B, 0x48, 0x45, 0x4F, 0x29, + 0x53, 0x49, 0x67, 0x23, 0x80, 0x3F, 0x80, 0x33, 0xD8, 0x22, 0x06, 0x2A, + 0xF3, 0x1C, 0xBB, 0x21, 0x9A, 0x2F, 0x50, 0x34, 0x88, 0x28, 0xDB, 0x34, + 0x7F, 0x02, 0xA2, 0x1F, 0x5A, 0xF2, 0xAC, 0x1E, 0xA2, 0x00, 0x95, 0x26, + 0x73, 0x09, 0xF5, 0x12, 0x1E, 0x0D, 0x6A, 0xFD, 0xEC, 0x11, 0xF2, 0x00, + 0x90, 0x14, 0x05, 0x06, 0x7A, 0x25, 0x87, 0x0A, 0xB5, 0x2F, 0xEA, 0x17, + 0xE7, 0x11, 0x8C, 0x18, 0xC8, 0xEB, 0xC5, 0x0D, 0xDE, 0xFA, 0xFD, 0x0E, + 0x2D, 0x29, 0xB9, 0x1E, 0xCD, 0x2E, 0x7A, 0x21, 0x6C, 0x20, 0xDD, 0x11, + 0xF6, 0x22, 0x30, 0x1E, 0x31, 0x25, 0x6B, 0x3C, 0x7D, 0x1F, 0x96, 0x40, + 0x29, 0x1F, 0x38, 0x35, 0xDC, 0x22, 0x5F, 0x2F, 0x79, 0x23, 0x27, 0x29, + 0x10, 0x30, 0x52, 0x26, 0x03, 0x31, 0x0F, 0x35, 0xF9, 0x11, 0xF1, 0x35, + 0x95, 0xF7, 0x44, 0x21, 0x76, 0xFD, 0xB9, 0x28, 0x2D, 0x0B, 0x33, 0x38, + 0xD2, 0x06, 0xF7, 0x2C, 0xA0, 0xFC, 0x41, 0x1E, 0x20, 0x03, 0x2B, 0x1A, + 0xFC, 0x17, 0x6A, 0x11, 0x6C, 0x20, 0xDA, 0x09, 0x61, 0x0A, 0xC7, 0x12, + 0xA4, 0xFB, 0x39, 0x14, 0xDF, 0x08, 0xCF, 0x0F, 0x3D, 0x19, 0x64, 0x1A, + 0x26, 0x2F, 0xAE, 0x1D, 0x87, 0x2B, 0xD1, 0xFE, 0xD9, 0xFE, 0x65, 0xE4, + 0x33, 0xF4, 0x5A, 0xF7, 0xAC, 0x0D, 0x9F, 0x11, 0x11, 0x03, 0x3F, 0x0E, + 0xD8, 0xE7, 0x08, 0x02, 0x96, 0xEF, 0xCC, 0x06, 0x20, 0xFA, 0xB9, 0x02, + 0xB6, 0xF6, 0x4E, 0xFC, 0x52, 0x02, 0x8A, 0x04, 0x20, 0x04, 0x1A, 0xF7, + 0x93, 0xF2, 0x6D, 0xE6, 0x14, 0xF8, 0x42, 0xF3, 0xED, 0xFB, 0xAC, 0x03, + 0x3D, 0xDC, 0xCF, 0xF8, 0x9C, 0xC4, 0x30, 0xE0, 0x66, 0xD7, 0xE2, 0xDC, + 0x56, 0xF7, 0x51, 0xDF, 0xB5, 0xFB, 0xAD, 0xCF, 0x57, 0xEF, 0xB8, 0xCC, + 0x4D, 0xE7, 0x57, 0xDB, 0xFC, 0xE2, 0x14, 0xE6, 0x13, 0xEB, 0xDF, 0xF1, + 0x75, 0xFD, 0x4B, 0xF8, 0x81, 0xF5, 0x89, 0xE9, 0x4E, 0xE7, 0x53, 0xDC, + 0xDA, 0x01, 0xDC, 0xED, 0x3A, 0x15, 0x0A, 0x02, 0xCA, 0xFC, 0xAE, 0xFB, + 0x3B, 0xEC, 0x08, 0xF6, 0x74, 0xFE, 0xCD, 0x01, 0x79, 0x11, 0x3D, 0x0D, + 0x03, 0x1A, 0x26, 0x11, 0x23, 0x1B, 0xAC, 0x13, 0x1B, 0xFD, 0x42, 0x10, + 0xB4, 0xE8, 0x96, 0x0B, 0x98, 0x00, 0xB5, 0x13, 0x55, 0x0F, 0x91, 0x14, + 0x8F, 0xF2, 0x6B, 0x04, 0x93, 0xE3, 0x6A, 0xFA, 0xE2, 0xFC, 0xC6, 0xFF, + 0x58, 0xFC, 0x6C, 0x07, 0x76, 0xE3, 0xB4, 0x01, 0xEB, 0xDC, 0xB1, 0xFA, + 0xA9, 0xEC, 0x91, 0xFB, 0x3A, 0xFE, 0x7B, 0xFC, 0x68, 0xFD, 0x85, 0xFC, + 0x8A, 0xE5, 0x0D, 0xFB, 0xA1, 0xD8, 0x4F, 0x07, 0x37, 0xEB, 0x2E, 0x16, + 0xF1, 0x03, 0xEB, 0x1F, 0xE1, 0x0E, 0x45, 0x21, 0x26, 0xFC, 0xED, 0x07, + 0xAE, 0xE3, 0x59, 0xF7, 0x17, 0xEE, 0x3F, 0x11, 0xF2, 0xF6, 0x97, 0x2D, + 0x1B, 0xE3, 0xB0, 0x15, 0x75, 0xDC, 0x82, 0x01, 0x84, 0xF4, 0xEB, 0x15, + 0xE0, 0x02, 0x2E, 0x13, 0x54, 0xFA, 0x5C, 0x06, 0x92, 0xF6, 0x43, 0x07, + 0x41, 0xF0, 0x4D, 0x01, 0xAF, 0xE4, 0x41, 0xFA, 0xDF, 0xE5, 0xE3, 0x10, + 0x42, 0xDD, 0x50, 0x23, 0x44, 0xBF, 0x6F, 0xFA, 0x09, 0xB6, 0x7B, 0xDD, + 0x22, 0xD6, 0x10, 0xF0, 0x4A, 0xEF, 0xB3, 0xEA, 0xF3, 0xE5, 0xB9, 0xCF, + 0xAD, 0xE0, 0x0B, 0xD9, 0x7F, 0xF5, 0x40, 0xEB, 0x36, 0xF6, 0x30, 0xDD, + 0xDD, 0xDD, 0x18, 0xE8, 0x04, 0xD1, 0xF7, 0xFC, 0xAF, 0xC2, 0xF8, 0xE1, + 0xB1, 0xC4, 0xAD, 0xD8, 0x8E, 0xE8, 0x37, 0xFA, 0x3A, 0xF8, 0x54, 0x02, + 0x89, 0xDC, 0x54, 0xEE, 0x2D, 0xCD, 0xB7, 0xF6, 0xC8, 0xE2, 0x1D, 0x08, + 0xBA, 0xEE, 0xA8, 0xFA, 0x34, 0xEA, 0xC8, 0xF7, 0x02, 0xEE, 0xE2, 0xFC, + 0x6B, 0xE9, 0x94, 0xEF, 0x32, 0xE5, 0xCE, 0xEF, 0x6F, 0xE6, 0x7E, 0xFC, + 0x52, 0xD5, 0x5E, 0xFA, 0x78, 0xC1, 0xC6, 0xF0, 0x07, 0xCF, 0xD7, 0xF3, + 0xA4, 0xED, 0xCB, 0xF8, 0xB6, 0xF1, 0x96, 0xF9, 0x5F, 0xE7, 0x3D, 0xF0, + 0x7A, 0xED, 0x7C, 0xDE, 0xDA, 0xF6, 0x4A, 0xE0, 0xD7, 0xF3, 0xB4, 0xF4, + 0x2E, 0xEC, 0xE4, 0xFB, 0xCA, 0xEC, 0xF2, 0xF9, 0x1B, 0xFB, 0x45, 0xFF, + 0x6D, 0x08, 0xDA, 0xF3, 0xA9, 0x0E, 0x21, 0xE6, 0x54, 0x04, 0xE1, 0xDD, + 0xD0, 0xE4, 0x37, 0xCC, 0xDB, 0xE4, 0xD3, 0xD4, 0xCD, 0x04, 0x61, 0xFD, + 0x44, 0xFD, 0xA3, 0x00, 0x5B, 0xDC, 0x7E, 0xDF, 0x92, 0xDB, 0x12, 0xE3, + 0x86, 0xED, 0x2D, 0xF5, 0x4E, 0xF5, 0xFD, 0xE7, 0x30, 0xFD, 0x36, 0xE0, + 0xAA, 0xFC, 0x22, 0xDF, 0x0E, 0xE4, 0x78, 0xCF, 0xD8, 0xDA, 0x9A, 0xD1, + 0x84, 0xE5, 0x50, 0xE7, 0x74, 0xD7, 0xA1, 0xDF, 0x1F, 0xC7, 0xF1, 0xB6, + 0xB7, 0xD9, 0x3E, 0xA7, 0x60, 0xF7, 0xCF, 0xB5, 0xD5, 0xF3, 0x37, 0xB6, + 0x1F, 0xDC, 0xCE, 0xAF, 0xB7, 0xD9, 0xEC, 0xBC, 0xE9, 0xE1, 0x04, 0xC4, + 0x45, 0xE9, 0xEB, 0xC0, 0xF9, 0xF7, 0xF8, 0xC8, 0xF6, 0xF7, 0x75, 0xC8, + 0xFE, 0xEE, 0x6C, 0xBF, 0xD3, 0xF3, 0x2D, 0xCC, 0xF6, 0xFD, 0xDF, 0xEB, + 0x74, 0xFB, 0xAE, 0xEC, 0x2A, 0xF8, 0xBD, 0xD9, 0xD7, 0x0C, 0x53, 0xE5, + 0xD6, 0x17, 0x64, 0xF7, 0x56, 0x0A, 0x2C, 0xFB, 0x1A, 0xF9, 0xE1, 0xFE, + 0x1F, 0xE2, 0xD0, 0xFB, 0x3B, 0xD3, 0x7D, 0xF0, 0xCF, 0xD8, 0x63, 0xF2, + 0x79, 0xE8, 0x15, 0xF8, 0xA9, 0xEB, 0x59, 0xE6, 0x93, 0xDB, 0xAD, 0xD1, + 0x93, 0xD2, 0x05, 0xE0, 0x71, 0xDA, 0x25, 0xFA, 0x4D, 0xE7, 0x3D, 0xF2, + 0x68, 0xDE, 0xF9, 0xD2, 0x0C, 0xD9, 0xE3, 0xC1, 0xFC, 0xE8, 0xD2, 0xC8, + 0x0F, 0xE6, 0xE0, 0xD8, 0x5E, 0xD7, 0x67, 0xE1, 0x70, 0xDF, 0x4A, 0xE9, + 0xDD, 0xEE, 0xA9, 0xE6, 0x2F, 0xFC, 0xA5, 0xE8, 0xCD, 0x0D, 0xD0, 0xF5, + 0xB6, 0xFE, 0x0B, 0xE7, 0x13, 0xD9, 0x0A, 0xD7, 0x23, 0xE6, 0x49, 0xEA, + 0xE9, 0x0A, 0x8E, 0x00, 0xF0, 0xF9, 0x57, 0xF5, 0x6C, 0xE2, 0x0E, 0xE5, + 0xB2, 0xF5, 0x49, 0xED, 0xBC, 0xFD, 0x2A, 0xF0, 0xA4, 0xF9, 0xD4, 0xF0, + 0xB6, 0x02, 0xB2, 0xFF, 0xAF, 0xF3, 0x54, 0xFA, 0x7B, 0xD7, 0x4C, 0xEF, + 0x74, 0xE5, 0xCC, 0x00, 0xA6, 0xF7, 0xAC, 0x04, 0x79, 0xDB, 0x25, 0xE2, + 0x85, 0xC8, 0x0B, 0xC5, 0xC3, 0xE3, 0xDF, 0xD2, 0x94, 0xFF, 0xF1, 0xEA, + 0xCD, 0xFF, 0x33, 0xE1, 0xB7, 0xF9, 0x02, 0xD1, 0x49, 0x00, 0xD7, 0xD3, + 0xB0, 0x00, 0x54, 0xD5, 0xDC, 0xF1, 0xE8, 0xD6, 0xE3, 0xE7, 0x62, 0xE1, + 0xCC, 0xE5, 0xBC, 0xE1, 0x44, 0xF1, 0x61, 0xE3, 0x75, 0x0E, 0xF8, 0xFE, + 0x53, 0x20, 0x78, 0x10, 0xC6, 0x10, 0x9B, 0xFC, 0xCD, 0xFF, 0x95, 0xF8, + 0xA9, 0x09, 0x47, 0x15, 0x6B, 0x1A, 0x73, 0x20, 0xA3, 0x1E, 0x28, 0x1B, + 0xD2, 0x15, 0xC9, 0x17, 0x9D, 0x0B, 0x8B, 0x06, 0x2C, 0x0B, 0x80, 0x02, + 0xE4, 0x0F, 0xE1, 0x14, 0xEB, 0x09, 0x80, 0x1E, 0x19, 0xFB, 0xEE, 0x14, + 0xDD, 0xFE, 0xCF, 0x12, 0x51, 0x19, 0x5E, 0x21, 0x99, 0x30, 0x5D, 0x19, + 0xB6, 0x20, 0x8C, 0x04, 0x20, 0x04, 0x40, 0xFF, 0xA6, 0x0B, 0xC4, 0x08, + 0x12, 0x27, 0x8C, 0x1B, 0x62, 0x34, 0x35, 0x27, 0xA5, 0x32, 0xB6, 0x23, + 0x20, 0x33, 0x96, 0x10, 0xEC, 0x33, 0x50, 0xFE, 0xF8, 0x40, 0x3D, 0x0E, + 0x77, 0x47, 0x42, 0x1C, 0xDD, 0x25, 0x64, 0x10, 0x93, 0x14, 0xA7, 0x13, + 0x66, 0x32, 0x84, 0x2A, 0x02, 0x38, 0x7B, 0x2B, 0x83, 0x10, 0x75, 0x0F, + 0x99, 0x07, 0xC8, 0x12, 0x82, 0x28, 0xF0, 0x28, 0x8D, 0x32, 0xDD, 0x23, + 0x4C, 0x30, 0xBA, 0x19, 0xBB, 0x2B, 0xB2, 0x1A, 0xF2, 0x0C, 0xC1, 0x0E, + 0xEF, 0x02, 0xC3, 0x08, 0xE3, 0x22, 0x00, 0x24, 0xFB, 0x28, 0xFF, 0x17, + 0xF6, 0x07, 0xF9, 0xE9, 0x41, 0x08, 0xED, 0xED, 0xB3, 0x20, 0x47, 0x0F, + 0x71, 0x1A, 0xA7, 0x0D, 0x66, 0x0D, 0x3A, 0xF5, 0xCF, 0x09, 0xA2, 0xF5, + 0x51, 0x09, 0x96, 0xFA, 0xFC, 0x1C, 0xCB, 0xFC, 0xDE, 0x2D, 0x23, 0x0C, + 0x60, 0x1C, 0x7D, 0x06, 0x15, 0x03, 0xEA, 0xF7, 0x33, 0x12, 0x8F, 0x05, + 0xA6, 0x35, 0x5F, 0x1D, 0x58, 0x30, 0xD9, 0x1C, 0x39, 0x1E, 0x90, 0x0F, + 0xEB, 0x2A, 0x39, 0x1A, 0xA9, 0x32, 0x16, 0x29, 0x18, 0x20, 0x93, 0x30, + 0x07, 0x11, 0xF5, 0x35, 0x4D, 0x0C, 0xA5, 0x29, 0xAB, 0x0F, 0xC6, 0x1F, + 0x44, 0x1E, 0xD0, 0x23, 0xDA, 0x1E, 0x5B, 0x1E, 0x51, 0x04, 0xCD, 0x14, + 0x1B, 0xF0, 0x0F, 0x19, 0x5D, 0x01, 0x16, 0x2D, 0x85, 0x14, 0x2A, 0x34, + 0xF8, 0x12, 0xCD, 0x21, 0xF2, 0x06, 0x9E, 0x07, 0x56, 0xFD, 0xF3, 0x04, + 0x39, 0x00, 0xD3, 0x1B, 0x99, 0x08, 0x15, 0x25, 0x5C, 0x09, 0x2D, 0x23, + 0x20, 0x0C, 0x35, 0x24, 0x59, 0x1D, 0xFF, 0x16, 0xB0, 0x2C, 0x70, 0x11, + 0x0A, 0x2C, 0xBD, 0x22, 0xBC, 0x14, 0xF0, 0x1F, 0x81, 0xFD, 0xDB, 0x09, + 0xBB, 0x0C, 0x92, 0x1F, 0x60, 0x2A, 0x89, 0x3F, 0x22, 0x1A, 0x31, 0x26, + 0x66, 0xFF, 0xDE, 0x0E, 0x55, 0x10, 0xCF, 0x1D, 0x38, 0x18, 0xFB, 0x21, + 0x8C, 0x0E, 0x48, 0x21, 0x32, 0x18, 0x4B, 0x2F, 0x8D, 0x17, 0xB2, 0x2A, + 0xB1, 0xFB, 0x85, 0x18, 0xC8, 0xF8, 0xCD, 0x27, 0x44, 0x10, 0xE7, 0x32, + 0xEF, 0xF7, 0x8C, 0x12, 0xB6, 0xD7, 0x05, 0x01, 0x04, 0xFB, 0xC5, 0x10, + 0xE1, 0x1D, 0xF0, 0x19, 0xA6, 0x12, 0xD9, 0x0D, 0xCD, 0x0A, 0xAB, 0x05, + 0xD2, 0x09, 0xFF, 0x00, 0xEF, 0xFF, 0xCD, 0x01, 0x38, 0x03, 0xD3, 0x19, + 0xE2, 0x0B, 0xD4, 0x25, 0xEB, 0x0D, 0x1E, 0x17, 0x0B, 0x1C, 0x41, 0x17, + 0x6D, 0x31, 0x41, 0x2E, 0x4E, 0x30, 0x3A, 0x38, 0x17, 0x1E, 0xB1, 0x2D, + 0xC8, 0x1F, 0xB0, 0x2A, 0x33, 0x29, 0x31, 0x35, 0xBA, 0x2B, 0x1E, 0x3C, + 0x1E, 0x33, 0xD5, 0x36, 0x9A, 0x30, 0x3E, 0x2B, 0xAD, 0x1A, 0x0A, 0x20, + 0xFF, 0x0C, 0x36, 0x27, 0x8E, 0x12, 0x5C, 0x3C, 0xAA, 0x0D, 0x13, 0x3A, + 0x66, 0x00, 0xC0, 0x26, 0x1F, 0x0B, 0xE0, 0x23, 0x95, 0x1D, 0xD6, 0x24, + 0x7E, 0x15, 0x39, 0x1A, 0x07, 0x09, 0x01, 0x12, 0x3F, 0x0B, 0xF5, 0x0F, + 0x43, 0x12, 0x31, 0x1D, 0x5E, 0x1D, 0x56, 0x2F, 0x33, 0x2B, 0x51, 0x26, + 0x9D, 0x2D, 0x4B, 0x0D, 0x37, 0x2C, 0x8F, 0x00, 0x5F, 0x2E, 0x9E, 0x03, + 0x5B, 0x31, 0x63, 0x16, 0x49, 0x29, 0x7C, 0x26, 0xD9, 0x12, 0x81, 0x17, + 0xA6, 0x0C, 0x81, 0xFE, 0x90, 0x16, 0xBA, 0x0D, 0xF2, 0x12, 0x7D, 0x22, + 0x88, 0xFD, 0x7D, 0x0F, 0x0F, 0xF5, 0x08, 0x05, 0xDA, 0x02, 0x3C, 0x14, + 0x13, 0x09, 0xF5, 0x0F, 0x82, 0x06, 0x80, 0x0B, 0x42, 0xFD, 0x19, 0x12, + 0x36, 0xE7, 0x08, 0xFF, 0xE0, 0xE2, 0xBE, 0xE9, 0x54, 0xF7, 0xE5, 0xF8, + 0x92, 0xF9, 0xF0, 0xFD, 0xB3, 0xE4, 0x54, 0xD8, 0x4D, 0xDC, 0x15, 0xC4, + 0xA8, 0xE9, 0x6B, 0xD9, 0xCF, 0xEF, 0xAE, 0xE1, 0x45, 0xEA, 0x39, 0xCB, + 0xF7, 0xEF, 0x4A, 0xC3, 0x82, 0xEF, 0xE3, 0xCF, 0xED, 0xEB, 0x2B, 0xDB, + 0x16, 0xF4, 0x2D, 0xE9, 0xF2, 0xF0, 0x39, 0xED, 0xBA, 0xE2, 0x1D, 0xDC, + 0x22, 0xE3, 0x49, 0xE0, 0xFB, 0xFE, 0x59, 0xFF, 0xD9, 0x0F, 0x82, 0x05, + 0xF9, 0xFB, 0xF8, 0xF1, 0x73, 0xEB, 0x03, 0xEA, 0xF3, 0xEE, 0x2C, 0x00, + 0x80, 0xF3, 0x3D, 0x0D, 0x3D, 0xEB, 0xDF, 0x03, 0xA0, 0xDD, 0xE1, 0xF8, + 0x69, 0xDE, 0xD7, 0xE9, 0x91, 0xDD, 0xEC, 0xEB, 0x55, 0xD8, 0xC5, 0xFB, + 0xB0, 0xD3, 0x48, 0xF9, 0x26, 0xC5, 0xBC, 0xE8, 0x40, 0xC2, 0x14, 0xE8, + 0x0B, 0xCB, 0xEB, 0xED, 0x36, 0xC8, 0x5B, 0xE3, 0xA2, 0xBD, 0xED, 0xCA, + 0x9C, 0xBE, 0xB0, 0xC4, 0x21, 0xCD, 0x84, 0xDA, 0x66, 0xD6, 0x0C, 0xEA, + 0x4B, 0xD7, 0x3C, 0xE6, 0xED, 0xDC, 0x39, 0xE1, 0xB6, 0xDB, 0x5D, 0xE0, + 0x49, 0xDC, 0x5F, 0xE5, 0xD7, 0xEC, 0x6A, 0xF0, 0x7E, 0xE3, 0xBB, 0xEE, + 0x3B, 0xC7, 0xB9, 0xD5, 0xDA, 0xD3, 0x3C, 0xD7, 0x6C, 0xEF, 0x94, 0xFF, + 0x0F, 0xE3, 0x60, 0xFD, 0x4A, 0xD3, 0xC6, 0xD6, 0x9E, 0xE5, 0x00, 0xD1, + 0x7B, 0xEB, 0xA4, 0xE0, 0xDA, 0xE1, 0x2A, 0xE7, 0xC4, 0xE4, 0x40, 0xEE, + 0x21, 0xDA, 0x95, 0xF3, 0xC4, 0xBF, 0x78, 0xE1, 0x56, 0xC2, 0xB3, 0xDB, + 0xAD, 0xD6, 0xB9, 0xE8, 0x93, 0xCB, 0x1A, 0xD4, 0x40, 0xBB, 0xF9, 0xB2, + 0x19, 0xCD, 0x00, 0xBB, 0x63, 0xE8, 0xFA, 0xD5, 0x55, 0xF0, 0x61, 0xCD, + 0x42, 0xE2, 0xE2, 0xB2, 0x8E, 0xCC, 0x4D, 0xB1, 0xD0, 0xCB, 0x06, 0xBC, + 0x8D, 0xE0, 0xD2, 0xC8, 0xAB, 0xE7, 0xA2, 0xD3, 0xCB, 0xDF, 0xAE, 0xCD, + 0x1A, 0xDD, 0x7A, 0xC9, 0xD1, 0xEA, 0x9C, 0xDD, 0x03, 0xFA, 0xE3, 0xF3, + 0x2E, 0xF8, 0xB7, 0xEE, 0xE3, 0xF1, 0x96, 0xE6, 0x5B, 0xF5, 0xA5, 0xF3, + 0xB8, 0x0A, 0x32, 0x04, 0x08, 0x19, 0x03, 0x0A, 0xB1, 0x00, 0xD8, 0x04, + 0xE0, 0xDE, 0x15, 0xFA, 0x4E, 0xDF, 0xCB, 0x01, 0xBA, 0xF0, 0x4F, 0x17, + 0xDC, 0xF3, 0x6E, 0x1C, 0x18, 0xEC, 0x61, 0x09, 0x09, 0xE2, 0x0B, 0xFA, + 0x10, 0xE2, 0x0B, 0x02, 0xDE, 0xF0, 0x3A, 0x08, 0x13, 0xF4, 0x3E, 0xFE, + 0x4E, 0xE7, 0xE2, 0xF5, 0x2E, 0xE7, 0x12, 0x05, 0x28, 0x03, 0xF6, 0x08, + 0x62, 0x1A, 0x97, 0xEE, 0x3B, 0x12, 0xDB, 0xE0, 0xC2, 0x08, 0x31, 0xE5, + 0x3C, 0x0C, 0x17, 0xE8, 0x2F, 0x16, 0x12, 0xF3, 0x2F, 0x19, 0xC3, 0xF9, + 0x03, 0x03, 0x60, 0xDC, 0x0A, 0xF5, 0x34, 0xCE, 0x19, 0x09, 0x0E, 0xF3, + 0xD8, 0x0B, 0xFA, 0xFC, 0x74, 0xED, 0xA6, 0xDB, 0x48, 0xE9, 0x99, 0xDB, + 0xAF, 0x01, 0xB0, 0xF6, 0xCE, 0x03, 0x8F, 0xF6, 0xF1, 0xF5, 0x63, 0xF3, + 0x5C, 0xED, 0xF9, 0xF4, 0x6C, 0xDC, 0x35, 0xDE, 0x50, 0xD8, 0xFD, 0xD6, + 0x3F, 0xF7, 0xD6, 0xE7, 0x17, 0xFC, 0xBD, 0xDB, 0x91, 0xDD, 0x4D, 0xC2, + 0xE9, 0xDB, 0xD0, 0xC1, 0xC5, 0xF4, 0x90, 0xCE, 0x90, 0xFC, 0x08, 0xCD, + 0x71, 0xF2, 0xFF, 0xC4, 0x80, 0xF3, 0x97, 0xBF, 0xF2, 0xEF, 0xAE, 0xBD, + 0xDD, 0xEB, 0xC3, 0xD0, 0x96, 0xF4, 0x99, 0xDD, 0x16, 0xEA, 0xBB, 0xD0, + 0xDA, 0xDB, 0xC0, 0xCC, 0xD6, 0xF2, 0xCF, 0xDB, 0xC6, 0x12, 0x11, 0xE4, + 0x8B, 0x0A, 0x45, 0xDF, 0x1E, 0xFA, 0x7C, 0xEA, 0xEB, 0xF9, 0x5E, 0x00, + 0x84, 0xF4, 0x36, 0x08, 0xE0, 0xF3, 0x03, 0x0B, 0x9C, 0xFB, 0x71, 0x09, + 0x6A, 0xE6, 0x79, 0xF8, 0xFD, 0xCE, 0x36, 0xEB, 0x3F, 0xE3, 0xA6, 0xF6, + 0x80, 0xF9, 0xB5, 0x08, 0x86, 0xEB, 0x7E, 0x06, 0x41, 0xD7, 0x51, 0xFD, + 0x68, 0xDB, 0x60, 0x01, 0xF6, 0xE6, 0x92, 0xFD, 0x85, 0xE7, 0x14, 0xEF, + 0x20, 0xE3, 0x47, 0xEC, 0x9E, 0xE4, 0xB1, 0xF9, 0x21, 0xF1, 0xDA, 0xFF, + 0x5A, 0xFF, 0x8A, 0xFA, 0x8F, 0x07, 0xEC, 0x04, 0x7C, 0x09, 0x9C, 0x0C, + 0x62, 0x05, 0x1A, 0x00, 0x47, 0x16, 0xF0, 0x04, 0x4B, 0x2A, 0x82, 0x1B, + 0x0B, 0x11, 0x56, 0x13, 0xB7, 0xF2, 0x90, 0x02, 0xD3, 0x05, 0x54, 0x1D, + 0x2E, 0x1E, 0xF9, 0x32, 0xF1, 0x11, 0xDC, 0x13, 0x9B, 0x09, 0xDE, 0xF9, + 0x6B, 0x11, 0x84, 0x0A, 0xD9, 0x0C, 0x59, 0x14, 0x41, 0x0C, 0x63, 0x1B, + 0x71, 0x0C, 0x1A, 0x2C, 0x52, 0xF8, 0x3D, 0x1A, 0x74, 0xE6, 0xE6, 0x00, + 0xF5, 0xF8, 0x59, 0x0A, 0x90, 0x05, 0xD9, 0x10, 0x7D, 0xF5, 0x53, 0x00, + 0x9B, 0xF6, 0x54, 0xF7, 0xFE, 0x08, 0x1A, 0x00, 0xB1, 0x16, 0x16, 0x00, + 0xAF, 0x17, 0x1D, 0xF6, 0x43, 0x0E, 0x9C, 0xF0, 0xDC, 0x05, 0xBB, 0xE6, + 0xCF, 0x07, 0xFC, 0xEC, 0xEB, 0x0C, 0x7D, 0x02, 0xE5, 0x0A, 0xFA, 0xFF, + 0x6E, 0x0B, 0x47, 0xF3, 0x6D, 0x14, 0xBE, 0xFB, 0xC4, 0x25, 0x81, 0x0E, + 0xA7, 0x2A, 0xE0, 0x10, 0x58, 0x25, 0x47, 0x13, 0xA5, 0x33, 0xB6, 0x1F, + 0xB6, 0x42, 0xC2, 0x25, 0xE6, 0x3C, 0x3A, 0x23, 0x88, 0x31, 0x0B, 0x27, + 0x99, 0x2D, 0xEB, 0x2C, 0x1B, 0x2B, 0xB4, 0x25, 0x58, 0x2F, 0x2C, 0x28, + 0x3D, 0x38, 0xC4, 0x3D, 0xE1, 0x32, 0x9D, 0x47, 0xD8, 0x27, 0x05, 0x34, + 0xF8, 0x2B, 0xDA, 0x24, 0x89, 0x36, 0x3D, 0x2D, 0x00, 0x3A, 0x90, 0x3D, + 0x8F, 0x31, 0x8F, 0x3D, 0xDF, 0x2E, 0xC6, 0x34, 0xB9, 0x37, 0x4C, 0x33, + 0xF7, 0x3E, 0x13, 0x2D, 0xC6, 0x4E, 0x2D, 0x28, 0xD9, 0x5E, 0x50, 0x26, + 0xD7, 0x50, 0xD8, 0x1B, 0x7B, 0x3B, 0x54, 0x1C, 0x49, 0x47, 0x5F, 0x34, + 0xDC, 0x4E, 0xF6, 0x36, 0xF9, 0x2D, 0x54, 0x18, 0x68, 0x26, 0xF3, 0x11, + 0xB2, 0x40, 0xA6, 0x2F, 0x81, 0x34, 0xDE, 0x30, 0x51, 0x1F, 0x03, 0x16, + 0x5D, 0x22, 0xBF, 0x1F, 0xB1, 0x15, 0x87, 0x39, 0xB6, 0x10, 0x8F, 0x34, + 0x01, 0x28, 0xD6, 0x2B, 0x76, 0x2E, 0x28, 0x20, 0x38, 0x0E, 0xE2, 0x02, + 0xFE, 0xFE, 0x11, 0x04, 0x66, 0x15, 0x46, 0x20, 0xC8, 0x0D, 0xB7, 0x18, + 0x4E, 0xF4, 0x1D, 0xF6, 0xC6, 0xFB, 0x3F, 0xF0, 0xD1, 0x12, 0x03, 0xFF, + 0x90, 0x13, 0x6F, 0xFD, 0x3F, 0x0D, 0xD3, 0xED, 0x1B, 0x0F, 0x37, 0xE9, + 0x32, 0x0A, 0x40, 0xF8, 0xA4, 0x06, 0x9D, 0x0C, 0x54, 0x0F, 0x61, 0x0E, + 0x09, 0x1B, 0xA4, 0xFA, 0x19, 0x14, 0xCA, 0xEF, 0xB0, 0x14, 0x16, 0x03, + 0xCF, 0x2A, 0x99, 0x19, 0x43, 0x27, 0x90, 0x21, 0x4C, 0x1B, 0x4C, 0x24, + 0x62, 0x28, 0x75, 0x2A, 0x0A, 0x2D, 0x77, 0x33, 0xC7, 0x17, 0xC2, 0x31, + 0x52, 0x09, 0x33, 0x26, 0x7C, 0x09, 0xC0, 0x18, 0x20, 0xFE, 0x05, 0x21, + 0x36, 0xFB, 0xDD, 0x3A, 0x12, 0x0E, 0xC3, 0x41, 0x4E, 0x0E, 0xD1, 0x27, + 0x00, 0xFD, 0x54, 0x11, 0x03, 0xF9, 0xAC, 0x1E, 0x90, 0x00, 0xAD, 0x2C, + 0xE3, 0xFB, 0x0A, 0x20, 0x6D, 0xF2, 0x06, 0x0F, 0xFC, 0xFC, 0x2D, 0x14, + 0x0E, 0x09, 0x14, 0x1E, 0x80, 0x0B, 0xBF, 0x1E, 0xD1, 0x16, 0xEC, 0x25, + 0x81, 0x23, 0x40, 0x27, 0xC2, 0x1E, 0xC3, 0x1D, 0x92, 0x21, 0x07, 0x30, + 0x0E, 0x29, 0x28, 0x44, 0x4D, 0x14, 0xAB, 0x2C, 0xC9, 0x05, 0x3C, 0x22, + 0x37, 0x1C, 0x6C, 0x41, 0xBA, 0x24, 0x76, 0x47, 0x99, 0x11, 0x9A, 0x29, + 0x9D, 0x1A, 0x92, 0x25, 0xD9, 0x28, 0x71, 0x37, 0x37, 0x17, 0x76, 0x3E, + 0xAF, 0x12, 0x4C, 0x4A, 0x91, 0x14, 0x58, 0x50, 0xB0, 0xF7, 0xA0, 0x31, + 0x93, 0xEA, 0x4B, 0x1E, 0xE2, 0x0B, 0x4B, 0x3A, 0xFC, 0x1D, 0x10, 0x43, + 0xB4, 0x05, 0xBC, 0x23, 0xCF, 0xF8, 0xEA, 0x11, 0xB2, 0x13, 0xE6, 0x1B, + 0x27, 0x1F, 0xC3, 0x1E, 0x65, 0x14, 0x43, 0x0E, 0x99, 0x14, 0xB5, 0xFD, + 0xF9, 0x0B, 0x1A, 0xFC, 0xBB, 0x09, 0x6C, 0x0D, 0x93, 0x1D, 0xBD, 0x1B, + 0xC8, 0x26, 0x9A, 0x13, 0x2F, 0x17, 0x55, 0x0A, 0x2B, 0x0E, 0x62, 0x19, + 0xC2, 0x25, 0xEF, 0x2E, 0xF2, 0x31, 0x0C, 0x34, 0x76, 0x30, 0x93, 0x2A, + 0x0A, 0x39, 0xB4, 0x22, 0x2D, 0x35, 0x48, 0x2A, 0xE2, 0x2D, 0x52, 0x37, + 0xDC, 0x2C, 0x72, 0x35, 0xB4, 0x20, 0x91, 0x22, 0xC7, 0x11, 0x87, 0x24, + 0x95, 0x1B, 0x31, 0x38, 0x44, 0x29, 0xD9, 0x34, 0x48, 0x17, 0x45, 0x1F, + 0xBF, 0x0B, 0xF4, 0x18, 0x2E, 0x21, 0x3D, 0x22, 0x20, 0x27, 0x21, 0x2C, + 0x88, 0x12, 0x7C, 0x32, 0x38, 0x0A, 0x75, 0x1D, 0x94, 0x1B, 0x72, 0x08, + 0x5C, 0x2C, 0x02, 0x14, 0x9B, 0x34, 0x27, 0x15, 0xA3, 0x31, 0x4E, 0x07, + 0x4B, 0x2D, 0x4B, 0x09, 0xA6, 0x2C, 0xB5, 0x0A, 0x9F, 0x2E, 0x54, 0x0D, + 0xF5, 0x28, 0xF3, 0x1B, 0x81, 0x10, 0x3C, 0x10, 0x67, 0x08, 0x81, 0xED, + 0xB0, 0x18, 0x96, 0xFC, 0xC4, 0x1A, 0x87, 0x12, 0xEB, 0xFC, 0x87, 0xF3, + 0xFA, 0xEB, 0x89, 0xF0, 0xEB, 0xF6, 0x0F, 0x15, 0xB6, 0xF8, 0x94, 0x11, + 0x04, 0xF9, 0xD9, 0xF9, 0x5D, 0xFC, 0xF3, 0xFC, 0xB8, 0xEB, 0x7E, 0xEF, + 0x57, 0xD9, 0x33, 0xD2, 0xAF, 0xE0, 0xA0, 0xDF, 0x25, 0xE3, 0x07, 0xF0, + 0x49, 0xC8, 0xA1, 0xD4, 0xBC, 0xC2, 0xAB, 0xC4, 0x46, 0xE6, 0x08, 0xCC, + 0xF9, 0xEE, 0x8D, 0xC2, 0x98, 0xD4, 0x93, 0xB4, 0x9C, 0xCE, 0x53, 0xBA, + 0x96, 0xD3, 0x38, 0xC2, 0xE4, 0xCA, 0x25, 0xC6, 0xC4, 0xD1, 0xB5, 0xC7, + 0xAB, 0xE2, 0x35, 0xBC, 0xE1, 0xD7, 0xFA, 0xB2, 0x18, 0xCD, 0xCB, 0xC2, + 0x7F, 0xDD, 0x1B, 0xD8, 0xAF, 0xE4, 0x81, 0xD1, 0xB2, 0xDD, 0x7E, 0xD7, + 0x30, 0xE5, 0xA0, 0xED, 0xF2, 0xEE, 0xAF, 0xEB, 0xAC, 0xE7, 0x32, 0xE6, + 0x64, 0xD7, 0x09, 0xED, 0x1E, 0xCA, 0x18, 0xE9, 0x70, 0xC3, 0xFB, 0xE4, + 0x62, 0xCD, 0x86, 0xF5, 0x58, 0xD5, 0x29, 0x04, 0xEF, 0xC6, 0x20, 0xF2, + 0xBE, 0xBA, 0x11, 0xD9, 0x0D, 0xBF, 0x71, 0xE3, 0x6B, 0xC1, 0xA1, 0xEE, + 0x7F, 0xB2, 0x2F, 0xE8, 0xCB, 0xA2, 0x52, 0xDD, 0xDD, 0xB2, 0x4D, 0xD4, + 0x66, 0xC8, 0x0E, 0xD6, 0x91, 0xC9, 0x87, 0xE2, 0x37, 0xCF, 0xB2, 0xE5, + 0xD6, 0xDE, 0x97, 0xE0, 0xAB, 0xDC, 0x3D, 0xE6, 0x8A, 0xDE, 0xCE, 0xF0, + 0xEA, 0xF0, 0xE0, 0xF2, 0xFB, 0xE2, 0x2F, 0xE9, 0xEC, 0xC9, 0x4C, 0xE7, + 0x28, 0xE1, 0xC7, 0xFA, 0x8C, 0xFE, 0x75, 0xFB, 0x88, 0xE9, 0x62, 0xDF, + 0x49, 0xDF, 0x35, 0xE0, 0x4E, 0xFF, 0x43, 0xFB, 0xBE, 0x01, 0xE7, 0x06, + 0xA3, 0xE9, 0xF4, 0x08, 0x5C, 0xE3, 0x96, 0x09, 0x94, 0xD8, 0x9C, 0xFE, + 0x95, 0xCB, 0x77, 0xF2, 0x2C, 0xD9, 0xFC, 0xF8, 0x15, 0xE0, 0xB2, 0xFA, + 0x53, 0xCA, 0x7E, 0xEC, 0xA8, 0xCF, 0xAA, 0xDF, 0x10, 0xF1, 0xE9, 0xE2, + 0xEB, 0xF3, 0x56, 0xEA, 0x7D, 0xE2, 0x95, 0xDA, 0xB5, 0xE8, 0xEA, 0xCB, + 0x74, 0xF9, 0xFA, 0xCB, 0x46, 0xF7, 0x99, 0xD2, 0xAC, 0xFA, 0x00, 0xD6, + 0x64, 0xF8, 0xA5, 0xD6, 0x2F, 0xE8, 0x39, 0xE6, 0x21, 0xF9, 0x21, 0xE6, + 0x25, 0x10, 0x61, 0xDF, 0x2E, 0x0C, 0xBF, 0xEB, 0x6F, 0x0D, 0x53, 0xED, + 0xE5, 0x1C, 0xFE, 0xEB, 0xD3, 0x1D, 0x56, 0xF3, 0x51, 0x12, 0x5C, 0xF7, + 0x1D, 0x0E, 0xD6, 0xFB, 0x9F, 0x05, 0x62, 0xFD, 0x11, 0xF6, 0x41, 0x00, + 0xA6, 0xF2, 0xE9, 0x01, 0x72, 0xF9, 0x13, 0xFA, 0x1A, 0xFC, 0x15, 0xF9, + 0xF1, 0xFC, 0x79, 0xF7, 0x80, 0xFE, 0xDB, 0xF5, 0x1C, 0xF1, 0x07, 0x02, + 0x5F, 0xEA, 0x5A, 0x00, 0x14, 0xEE, 0x1A, 0xE9, 0x90, 0xEE, 0xC9, 0xE6, + 0xF4, 0xFC, 0xDB, 0xF0, 0x81, 0x09, 0x51, 0xEA, 0x2E, 0x0A, 0xD7, 0xDE, + 0x3A, 0x10, 0x98, 0xDA, 0x05, 0x12, 0x55, 0xD5, 0x77, 0x13, 0x34, 0xD9, + 0xFD, 0x12, 0x91, 0xED, 0x6E, 0xFB, 0x98, 0xE8, 0xEF, 0xEB, 0x4D, 0xCD, + 0x6B, 0xFF, 0xAF, 0xCF, 0x06, 0x0C, 0x42, 0xD9, 0xD7, 0xEE, 0x57, 0xCC, + 0x93, 0xD5, 0x73, 0xD1, 0x2B, 0xE0, 0xC7, 0xE6, 0xA3, 0xEC, 0x89, 0xE7, + 0x88, 0xE8, 0x4F, 0xE2, 0xAB, 0xDE, 0x39, 0xE1, 0xBB, 0xCD, 0x3F, 0xC5, + 0x44, 0xBF, 0x4E, 0xA9, 0x8F, 0xC2, 0xDC, 0xBA, 0x49, 0xC6, 0x6F, 0xC6, + 0x5D, 0xB7, 0xE3, 0xB9, 0xE4, 0xB2, 0x4F, 0xB8, 0x10, 0xCC, 0x70, 0xB5, + 0x1A, 0xE3, 0x9A, 0xAB, 0x0C, 0xD5, 0x3D, 0xA9, 0xE6, 0xB4, 0x45, 0xB2, + 0x8C, 0xB7, 0x88, 0xB1, 0x37, 0xCA, 0xCC, 0xB4, 0x07, 0xCF, 0xD6, 0xC2, + 0xEA, 0xC8, 0x79, 0xB8, 0x97, 0xC0, 0xA8, 0xAD, 0x4C, 0xC6, 0xCA, 0xB5, + 0x57, 0xD5, 0x12, 0xBE, 0x3F, 0xD8, 0xA9, 0xCA, 0xFE, 0xD5, 0x9C, 0xD7, + 0x25, 0xE6, 0xD9, 0xD8, 0xB3, 0xED, 0x99, 0xD8, 0xA4, 0xE4, 0xFA, 0xE0, + 0xD9, 0xDC, 0xB5, 0xE5, 0xB5, 0xD3, 0x82, 0xE4, 0x6E, 0xD4, 0xB0, 0xEC, + 0x4E, 0xE1, 0x5B, 0xF7, 0x48, 0xE7, 0x84, 0xF5, 0x70, 0xE2, 0x39, 0xF2, + 0x55, 0xDA, 0x9B, 0xF0, 0x54, 0xE0, 0x3B, 0xEF, 0xEE, 0xEC, 0xBF, 0xF2, + 0x4E, 0xE9, 0x32, 0xF9, 0x93, 0xDE, 0x44, 0xF6, 0xDE, 0xDA, 0xCC, 0xED, + 0x81, 0xE3, 0x6C, 0xEF, 0x21, 0xEF, 0xC5, 0xFB, 0x7D, 0xF0, 0x2D, 0x03, + 0xCF, 0xF3, 0xB7, 0x01, 0xEF, 0xFE, 0xAE, 0xFE, 0x71, 0x0A, 0x46, 0x02, + 0x96, 0x12, 0x98, 0x12, 0x60, 0x02, 0xD8, 0x15, 0xC4, 0xE7, 0xA2, 0x09, + 0xBB, 0xEF, 0x84, 0x08, 0x3C, 0x05, 0xF3, 0x10, 0xE2, 0x02, 0xC0, 0x0A, + 0x69, 0xFE, 0xD3, 0x03, 0x5D, 0x0B, 0x15, 0x10, 0xC0, 0x0C, 0x19, 0x1B, + 0xD5, 0x04, 0x25, 0x1B, 0x74, 0xFD, 0xB9, 0x1B, 0xEF, 0xE0, 0x61, 0x18, + 0x55, 0xD9, 0xB4, 0x0B, 0xB2, 0xF2, 0xCB, 0x04, 0xA2, 0xFB, 0xA3, 0x12, + 0xB9, 0xF2, 0x69, 0x10, 0xD7, 0xF3, 0x84, 0xFC, 0x99, 0x01, 0x86, 0x05, + 0x06, 0x0C, 0x81, 0x14, 0x73, 0x0D, 0x23, 0x08, 0xBB, 0x0C, 0x15, 0xF4, + 0xA9, 0x11, 0x27, 0xF3, 0xC0, 0x24, 0xFE, 0xF6, 0xB2, 0x2E, 0xBB, 0xF9, + 0x6B, 0x17, 0x08, 0x07, 0xC6, 0x0B, 0x91, 0x0A, 0xCB, 0x21, 0x67, 0x05, + 0x67, 0x39, 0x04, 0x0F, 0x64, 0x41, 0x93, 0x1D, 0x35, 0x41, 0xAC, 0x1E, + 0x2D, 0x43, 0x36, 0x1A, 0x0F, 0x4F, 0x81, 0x22, 0x3E, 0x61, 0xE5, 0x2A, + 0x02, 0x5C, 0xF7, 0x2A, 0x4C, 0x3E, 0x62, 0x36, 0x94, 0x32, 0x9E, 0x3F, + 0x05, 0x46, 0xBE, 0x34, 0xA7, 0x4E, 0xB1, 0x2B, 0xC5, 0x3F, 0xC9, 0x32, + 0x39, 0x35, 0xE6, 0x39, 0xD7, 0x3D, 0xEA, 0x37, 0xAE, 0x47, 0x37, 0x38, + 0xB2, 0x3C, 0x8F, 0x36, 0x7B, 0x28, 0x85, 0x35, 0x95, 0x2A, 0x4E, 0x38, + 0x2E, 0x40, 0x33, 0x34, 0x6D, 0x47, 0x64, 0x2F, 0x64, 0x49, 0x63, 0x21, + 0xE7, 0x52, 0xD1, 0x13, 0xBC, 0x55, 0xFB, 0x1B, 0xCB, 0x53, 0x5A, 0x29, + 0xB6, 0x4E, 0xF6, 0x2D, 0x80, 0x40, 0x55, 0x27, 0x05, 0x37, 0xBB, 0x19, + 0xA8, 0x43, 0xB9, 0x15, 0x2E, 0x49, 0xAB, 0x1B, 0xA5, 0x2F, 0x00, 0x19, + 0x51, 0x17, 0x2E, 0x11, 0x5C, 0x1A, 0x08, 0x27, 0x8D, 0x21, 0x4D, 0x3C, + 0x44, 0x1B, 0xE7, 0x2E, 0x5D, 0x11, 0x56, 0x19, 0x2C, 0x04, 0x2C, 0x08, + 0xFB, 0xF9, 0x4F, 0x00, 0x02, 0xF7, 0xAF, 0x06, 0x08, 0xF0, 0x0D, 0x11, + 0xFB, 0xE3, 0xEA, 0x0C, 0xC8, 0xE5, 0x33, 0x03, 0x22, 0xF9, 0xC8, 0xFE, + 0xCC, 0xFC, 0xAC, 0xF9, 0x7C, 0xEE, 0xC4, 0xEC, 0xF8, 0xE7, 0x5D, 0xE2, + 0x26, 0xE6, 0x78, 0xEC, 0xBA, 0xEA, 0x6A, 0xFB, 0x6F, 0xE9, 0xC2, 0xF9, + 0xED, 0xCF, 0x82, 0xE5, 0xD4, 0xB6, 0x71, 0xD3, 0x45, 0xB8, 0xBB, 0xD3, + 0x35, 0xCD, 0xC6, 0xDD, 0xFD, 0xDE, 0x3E, 0xED, 0xDB, 0xF0, 0x95, 0x00, + 0x9A, 0x02, 0x0D, 0x0E, 0x9E, 0x03, 0xC2, 0x11, 0xEF, 0x03, 0x63, 0x12, + 0x63, 0x04, 0xBE, 0x1B, 0x2D, 0xFD, 0xC3, 0x22, 0xAB, 0xFF, 0x2F, 0x26, + 0xB8, 0x00, 0x22, 0x22, 0x06, 0x11, 0xEE, 0x20, 0x21, 0x19, 0xE6, 0x28, + 0xD5, 0xF5, 0x35, 0x19, 0x1A, 0xF2, 0x78, 0x15, 0x11, 0x1E, 0x74, 0x35, + 0xA1, 0x2A, 0x96, 0x3E, 0xB5, 0x29, 0xA7, 0x36, 0x67, 0x4B, 0xD0, 0x41, + 0x42, 0x5B, 0x5E, 0x4D, 0x91, 0x3F, 0x7E, 0x40, 0x1C, 0x3A, 0x63, 0x29, + 0xC1, 0x44, 0x36, 0x23, 0x8A, 0x38, 0x07, 0x20, 0x40, 0x3B, 0x4C, 0x23, + 0x14, 0x43, 0x78, 0x34, 0x76, 0x30, 0x86, 0x32, 0x4D, 0x09, 0x97, 0x1C, + 0xB8, 0xE9, 0x94, 0x0E, 0xF5, 0xDE, 0x9E, 0x08, 0xA9, 0xDE, 0xFF, 0xFE, + 0xD4, 0xF4, 0x4E, 0x04, 0x05, 0x0B, 0x3B, 0x1B, 0xC4, 0x00, 0x5C, 0x1D, + 0x65, 0xFE, 0x86, 0x16, 0x87, 0x0F, 0x08, 0x25, 0x57, 0xF9, 0x83, 0x22, + 0x1B, 0xD1, 0x51, 0x06, 0x38, 0xC3, 0x65, 0x03, 0x36, 0xCF, 0x6E, 0x14, + 0x72, 0xDB, 0xC0, 0x07, 0x98, 0xD4, 0x1A, 0xF9, 0x52, 0xC7, 0x97, 0x04, + 0xF8, 0xDC, 0xA6, 0x0F, 0xA1, 0xFA, 0x1D, 0x0D, 0x41, 0xFA, 0x65, 0x00, + 0xBF, 0x05, 0x92, 0xFD, 0xA8, 0x18, 0xFE, 0x04, 0x8D, 0x19, 0xF7, 0x07, + 0x3D, 0x1C, 0xFC, 0x0E, 0x25, 0x29, 0x0D, 0x12, 0x43, 0x1E, 0x87, 0x07, + 0xAA, 0x0D, 0x1A, 0x08, 0x64, 0x1D, 0x81, 0x16, 0xD7, 0x21, 0xDB, 0x10, + 0x1B, 0x1D, 0x4D, 0x05, 0x9A, 0x2F, 0x75, 0x0B, 0x33, 0x3A, 0x01, 0x16, + 0x85, 0x32, 0x69, 0x23, 0x8D, 0x2C, 0x20, 0x29, 0xD5, 0x21, 0x91, 0x23, + 0xBA, 0x10, 0x76, 0x23, 0x2E, 0xFA, 0x72, 0x15, 0x68, 0xF5, 0xE9, 0x08, + 0xAA, 0x0A, 0x69, 0x18, 0x23, 0x17, 0x27, 0x27, 0xA8, 0x0F, 0x74, 0x25, + 0x11, 0x0D, 0xB2, 0x23, 0xCA, 0x1A, 0xF9, 0x28, 0x58, 0x1E, 0x65, 0x2B, + 0x8E, 0x12, 0x7D, 0x2A, 0x50, 0x0F, 0xF9, 0x24, 0x12, 0x1E, 0x73, 0x19, + 0xB2, 0x33, 0x71, 0x11, 0xC8, 0x32, 0x58, 0x16, 0xA5, 0x18, 0x42, 0x20, + 0x6E, 0x13, 0xD3, 0x1C, 0x41, 0x1A, 0xBF, 0x13, 0x38, 0x1E, 0x07, 0x0C, + 0x1E, 0x23, 0xD3, 0x03, 0x62, 0x14, 0x3C, 0xF8, 0x9C, 0x05, 0x7E, 0xF4, + 0x78, 0x04, 0x66, 0x04, 0x49, 0x07, 0x79, 0x11, 0xC9, 0x02, 0x34, 0x13, + 0x44, 0x02, 0xEC, 0x12, 0x55, 0x0B, 0x6D, 0x07, 0x18, 0x04, 0x98, 0xFA, + 0xB7, 0xF6, 0xA0, 0x00, 0xAB, 0xF2, 0xB4, 0x07, 0x72, 0xE1, 0x73, 0x02, + 0x68, 0xDD, 0x23, 0xFC, 0x76, 0xFD, 0x69, 0xFC, 0xBB, 0x05, 0x90, 0xFC, + 0x8E, 0xEC, 0xF5, 0xF0, 0x70, 0xE8, 0x8F, 0xE9, 0xF3, 0xF0, 0xB6, 0xEB, + 0xBF, 0xEA, 0xB5, 0xED, 0x57, 0xED, 0xC8, 0xF9, 0x99, 0xF3, 0xC8, 0xFC, + 0x7D, 0xF8, 0xC4, 0xF5, 0xCF, 0x09, 0x08, 0xF5, 0x29, 0x18, 0x68, 0xFB, + 0x2A, 0x14, 0x05, 0xFF, 0x8A, 0x0D, 0x71, 0x05, 0x75, 0x24, 0x10, 0x13, + 0x90, 0x32, 0xC4, 0x0D, 0x96, 0x1A, 0x3C, 0x08, 0xDE, 0x1A, 0x71, 0x18, + 0x23, 0x26, 0xD8, 0x20, 0x88, 0x19, 0x3F, 0x25, 0xF3, 0x18, 0xF0, 0x32, + 0xFD, 0x14, 0x31, 0x28, 0x3A, 0x05, 0xFF, 0x16, 0xAB, 0x13, 0x60, 0x23, + 0x16, 0x20, 0xDE, 0x28, 0x4B, 0x04, 0x99, 0x1A, 0x88, 0xEF, 0x4A, 0x14, + 0x42, 0xFA, 0xA0, 0x13, 0xF3, 0x11, 0x31, 0x13, 0xA9, 0x1D, 0x74, 0x1E, + 0xF5, 0x1D, 0xBF, 0x23, 0x7D, 0x16, 0x8A, 0x09, 0x33, 0x08, 0xF7, 0xF5, + 0xDB, 0x0D, 0x81, 0xF8, 0x69, 0x1A, 0xB2, 0xF5, 0x3E, 0x0A, 0x94, 0xF5, + 0xC8, 0xF1, 0x6A, 0xF9, 0xD3, 0xF9, 0x61, 0xF4, 0x1F, 0x00, 0x77, 0xE9, + 0x00, 0xEC, 0xFF, 0xE5, 0xEC, 0xE4, 0x7F, 0xE8, 0x59, 0xE8, 0xB6, 0xDF, + 0xDF, 0xEB, 0x40, 0xDD, 0x2D, 0xF8, 0x7D, 0xE9, 0x98, 0xF8, 0xA0, 0xEB, + 0x22, 0xEC, 0x90, 0xE6, 0x29, 0xE9, 0xAF, 0xEF, 0x32, 0xE4, 0x75, 0xF8, + 0x1E, 0xD9, 0x09, 0xF0, 0x1F, 0xD3, 0x7C, 0xEB, 0x9B, 0xC4, 0x7F, 0xE4, + 0x6B, 0xB2, 0x6C, 0xD5, 0x52, 0xA6, 0xF0, 0xD0, 0x3E, 0xA1, 0xD5, 0xD4, + 0x57, 0xAF, 0x32, 0xDE, 0xFD, 0xC1, 0xFC, 0xDC, 0x03, 0xC2, 0x7B, 0xCB, + 0x14, 0xB5, 0x39, 0xC1, 0x04, 0xB1, 0x4B, 0xBC, 0x5B, 0xB0, 0x86, 0xB9, + 0x76, 0xB3, 0x40, 0xB9, 0x39, 0xB5, 0x19, 0xB3, 0x3A, 0xA9, 0xC4, 0xB8, + 0x87, 0xA7, 0xF2, 0xC2, 0x26, 0xB9, 0xD9, 0xBF, 0xBC, 0xD2, 0xAC, 0xC0, + 0xDE, 0xDD, 0x15, 0xC2, 0xD6, 0xD4, 0x46, 0xBD, 0xA0, 0xD1, 0x6D, 0xC4, + 0x93, 0xD5, 0x9F, 0xD3, 0x4E, 0xCA, 0x50, 0xD6, 0x80, 0xB3, 0x85, 0xCD, + 0x9D, 0xA7, 0x16, 0xC9, 0x1B, 0xB1, 0x05, 0xCC, 0x59, 0xC6, 0xFC, 0xCF, + 0xA8, 0xCA, 0x81, 0xD4, 0xDC, 0xC1, 0x4D, 0xD0, 0x08, 0xC0, 0x2D, 0xCF, + 0x55, 0xBB, 0x27, 0xD4, 0xA7, 0xB4, 0x86, 0xCF, 0x1F, 0xB7, 0x71, 0xD0, + 0x22, 0xC0, 0xAC, 0xD6, 0x5E, 0xCF, 0xDA, 0xD8, 0x97, 0xE5, 0x4D, 0xDE, + 0x3C, 0xF5, 0x90, 0xDB, 0x97, 0xFF, 0x16, 0xD6, 0xE1, 0x02, 0xB9, 0xE2, + 0xDE, 0xFB, 0xD6, 0xEF, 0x13, 0xF9, 0x8E, 0xE7, 0xA5, 0xFB, 0x41, 0xD3, + 0x24, 0xF9, 0x4C, 0xCA, 0x05, 0xF8, 0x45, 0xCC, 0x3E, 0xF8, 0x85, 0xD4, + 0xFB, 0xF2, 0xB2, 0xDF, 0xC7, 0xEF, 0x7B, 0xE2, 0xAC, 0xF7, 0xF5, 0xE9, + 0xCA, 0x03, 0x0A, 0xED, 0x5A, 0xFE, 0x76, 0xE6, 0xE5, 0xF4, 0x8C, 0xE9, + 0x89, 0xF7, 0xA7, 0xEB, 0x15, 0xFE, 0x03, 0xF1, 0xEB, 0x07, 0x62, 0xF5, + 0xBA, 0x06, 0x8F, 0xF4, 0xA0, 0xFF, 0xC5, 0xF6, 0x65, 0xFD, 0xF8, 0xE8, + 0xD4, 0xF5, 0xFC, 0xDB, 0x89, 0xF2, 0x9C, 0xE3, 0x12, 0xFC, 0x24, 0xEB, + 0x8F, 0x06, 0x90, 0xF8, 0x10, 0x04, 0xFE, 0x00, 0xF7, 0xFC, 0xC6, 0xF1, + 0x16, 0x00, 0x63, 0xE9, 0xC0, 0x11, 0x62, 0xF2, 0xCD, 0x25, 0x84, 0xF7, + 0x99, 0x28, 0xA7, 0xFF, 0x99, 0x23, 0x7A, 0x11, 0x4C, 0x29, 0x0F, 0x0F, + 0x9A, 0x2A, 0x2C, 0x03, 0xAA, 0x27, 0x4C, 0x0E, 0x75, 0x2F, 0xF3, 0x1B, + 0x25, 0x34, 0xFC, 0x22, 0xF2, 0x2E, 0x7C, 0x2C, 0x5B, 0x27, 0x86, 0x27, + 0x9B, 0x24, 0xFF, 0x15, 0x0A, 0x26, 0x50, 0x19, 0x0B, 0x26, 0xA7, 0x21, + 0xA1, 0x20, 0x75, 0x19, 0xC3, 0x17, 0x30, 0x1B, 0xE0, 0x19, 0x3A, 0x22, + 0x71, 0x23, 0x3C, 0x1F, 0xF7, 0x1C, 0x82, 0x1C, 0x14, 0x18, 0x70, 0x1C, + 0x55, 0x20, 0x5E, 0x1B, 0x79, 0x15, 0x92, 0x0C, 0x95, 0x0B, 0x39, 0xFB, + 0x20, 0x1D, 0xE0, 0xFC, 0xCD, 0x29, 0x19, 0x00, 0xA0, 0x20, 0x7F, 0x01, + 0x7E, 0x14, 0xF8, 0x09, 0xAC, 0x0B, 0xFE, 0x0A, 0xC3, 0x09, 0xD4, 0x02, + 0x87, 0x06, 0xFC, 0xFF, 0x0B, 0xF1, 0x20, 0xFF, 0x99, 0xEA, 0xA9, 0xF9, + 0xF3, 0xFF, 0x60, 0xFD, 0xFE, 0x0A, 0x80, 0x0D, 0xCD, 0x09, 0xFB, 0x15, + 0xAA, 0x0B, 0x4D, 0x15, 0x64, 0x01, 0xD3, 0x17, 0x0D, 0xEB, 0x39, 0x1C, + 0x97, 0xE7, 0x4C, 0x14, 0xD9, 0xF5, 0xE7, 0x03, 0xB0, 0xF3, 0xF8, 0x03, + 0x39, 0xE6, 0xB8, 0x0B, 0x54, 0xDD, 0x91, 0x0F, 0x8F, 0xDE, 0x21, 0x15, + 0x99, 0xF3, 0xC0, 0x10, 0xF8, 0xF9, 0xAD, 0x07, 0x68, 0xED, 0xE3, 0xFF, + 0xF0, 0xF0, 0x69, 0xEB, 0x25, 0xE7, 0xEE, 0xD6, 0xC0, 0xCF, 0x8B, 0xD0, + 0x45, 0xCF, 0x64, 0xD8, 0xEC, 0xE6, 0x71, 0xEE, 0x73, 0xF7, 0x23, 0xF7, + 0xEA, 0xEA, 0x09, 0xEB, 0x07, 0xDF, 0x64, 0xDD, 0x87, 0xDC, 0x68, 0xE1, + 0xFC, 0xE3, 0x53, 0xEA, 0x72, 0xF7, 0x02, 0xE7, 0x60, 0x02, 0xEC, 0xF6, + 0x12, 0x08, 0x10, 0x01, 0x46, 0x02, 0xE1, 0xFB, 0x4A, 0xF4, 0x6A, 0x03, + 0xCE, 0xF7, 0xCD, 0xF9, 0x1C, 0xFD, 0xA0, 0xEE, 0xD1, 0xF4, 0x7D, 0xFC, + 0xB2, 0xEB, 0x58, 0x00, 0x70, 0xE6, 0x73, 0xF4, 0x32, 0xEC, 0x87, 0xF6, + 0xCA, 0xF4, 0xE6, 0xFE, 0xE3, 0xEC, 0xD5, 0xFA, 0xF1, 0xE2, 0x9A, 0xFB, + 0x59, 0xEE, 0xB0, 0x00, 0xF4, 0xF9, 0x2D, 0xFE, 0x71, 0xF4, 0x65, 0xFD, + 0xAA, 0xFD, 0xDE, 0xF6, 0xA0, 0x09, 0xBE, 0xF1, 0xCE, 0x0A, 0x2E, 0xF5, + 0xD0, 0x0D, 0xC7, 0xEA, 0x8B, 0x04, 0x85, 0xEE, 0x39, 0x0F, 0x6C, 0xFA, + 0xF7, 0x26, 0xFD, 0xEC, 0x82, 0x1D, 0xDD, 0xEB, 0x2A, 0x12, 0x17, 0xF8, + 0x2E, 0x0E, 0x1C, 0xF8, 0xC1, 0x07, 0xBE, 0xF3, 0xE0, 0x13, 0x23, 0xE9, + 0xE5, 0x21, 0x2D, 0xEF, 0xE7, 0x1C, 0x66, 0xFE, 0xDB, 0x09, 0x88, 0x03, + 0x07, 0xF8, 0x59, 0x0F, 0x8C, 0xFE, 0xC1, 0x0A, 0x24, 0x0E, 0x73, 0xF5, + 0xE9, 0x03, 0xBB, 0xEE, 0xBF, 0xF7, 0x34, 0xF1, 0x48, 0x07, 0x91, 0xE9, + 0x7B, 0x14, 0x78, 0xEB, 0x41, 0x0A, 0x0D, 0xF2, 0x02, 0xFF, 0x0C, 0xEB, + 0x2F, 0x08, 0x1E, 0xF2, 0x93, 0x12, 0xCD, 0xFA, 0x2C, 0x06, 0x62, 0xF3, + 0xB8, 0xFA, 0x3C, 0xEA, 0x96, 0x0D, 0x56, 0xE7, 0x2F, 0x1D, 0xF3, 0xEF, + 0x67, 0x10, 0xCC, 0xF8, 0x44, 0x0F, 0x69, 0xFD, 0xF2, 0x14, 0xA4, 0x0A, + 0x97, 0x0D, 0x4E, 0x19, 0xA8, 0x14, 0x0B, 0x13, 0x21, 0x28, 0xE2, 0x0E, + 0xFB, 0x1C, 0xD1, 0x15, 0x6E, 0xFD, 0x8A, 0x1A, 0x4F, 0xFD, 0x69, 0x26, + 0xDD, 0x14, 0x42, 0x2D, 0x75, 0x27, 0x29, 0x28, 0xF9, 0x28, 0x76, 0x25, + 0xDF, 0x21, 0xA9, 0x2B, 0x93, 0x27, 0x46, 0x28, 0xAC, 0x2B, 0x13, 0x1E, + 0x74, 0x24, 0x47, 0x1C, 0x9D, 0x17, 0x1F, 0x24, 0x98, 0x16, 0xA4, 0x30, + 0xE3, 0x21, 0x1D, 0x2D, 0x69, 0x1C, 0xC4, 0x25, 0xB1, 0x0F, 0xC5, 0x24, + 0xD9, 0x0F, 0x5D, 0x1E, 0xF4, 0x1F, 0x1A, 0x1D, 0xCA, 0x29, 0x2B, 0x1B, + 0x66, 0x17, 0x7A, 0x0E, 0x96, 0xFB, 0xEF, 0x0B, 0x42, 0xEA, 0xC6, 0x15, + 0x5B, 0xEE, 0xEA, 0x16, 0x18, 0x05, 0x4C, 0x10, 0xE2, 0x09, 0xB9, 0x15, + 0xD5, 0xFA, 0x5B, 0x24, 0xF3, 0xFD, 0xA7, 0x2D, 0x84, 0x05, 0x00, 0x2A, + 0x45, 0x02, 0xC2, 0x1C, 0xE5, 0x00, 0xFB, 0x17, 0xD1, 0xF7, 0x06, 0x1F, + 0x9A, 0xEE, 0xC6, 0x2C, 0xA9, 0xF7, 0x6B, 0x32, 0xAB, 0x0A, 0x62, 0x26, + 0xA0, 0x0A, 0xFC, 0x20, 0x7A, 0x00, 0xC5, 0x29, 0xD4, 0x03, 0xC4, 0x31, + 0xEC, 0xFF, 0xBF, 0x37, 0x2E, 0xF8, 0x8A, 0x33, 0x7A, 0xFD, 0xA3, 0x26, + 0xAB, 0x13, 0xC5, 0x20, 0x03, 0x27, 0xE9, 0x1F, 0x54, 0x20, 0xC5, 0x1E, + 0xF5, 0x13, 0x76, 0x1D, 0x1A, 0x17, 0x67, 0x26, 0x77, 0x21, 0xDB, 0x30, + 0x6F, 0x1C, 0x2E, 0x2C, 0xDA, 0x12, 0x4B, 0x2F, 0xD9, 0x1E, 0xE4, 0x39, + 0xF8, 0x28, 0x91, 0x3A, 0x1C, 0x1C, 0x5C, 0x36, 0x67, 0x1B, 0xF4, 0x2E, + 0x56, 0x33, 0x1F, 0x2D, 0x3F, 0x33, 0xEC, 0x35, 0xB3, 0x27, 0xB0, 0x3A, + 0xC3, 0x2C, 0x2B, 0x3A, 0x2B, 0x2D, 0xA2, 0x33, 0xC0, 0x34, 0x58, 0x2D, + 0xBA, 0x41, 0x46, 0x37, 0xF1, 0x43, 0xD4, 0x39, 0xD6, 0x39, 0x95, 0x2A, + 0x88, 0x19, 0xFE, 0x27, 0xB0, 0x07, 0xD7, 0x32, 0xF0, 0x15, 0x59, 0x35, + 0x03, 0x1E, 0x42, 0x30, 0x82, 0x2B, 0x52, 0x1F, 0x8F, 0x42, 0x8B, 0x0C, + 0x0C, 0x41, 0x32, 0x09, 0x5B, 0x33, 0x16, 0x03, 0x2A, 0x2D, 0x8C, 0x01, + 0x69, 0x2D, 0x38, 0x15, 0x2E, 0x40, 0xFA, 0x13, 0x9E, 0x46, 0xB2, 0x03, + 0xF4, 0x3A, 0x7A, 0x07, 0xE9, 0x41, 0x99, 0xF7, 0x49, 0x47, 0xB8, 0xE0, + 0x11, 0x39, 0x21, 0xE6, 0x68, 0x18, 0x1A, 0xFA, 0xC2, 0x07, 0x33, 0x02, + 0x78, 0x15, 0xBC, 0xF1, 0xE5, 0x0F, 0x97, 0xEC, 0xB9, 0xFD, 0xD8, 0xF5, + 0x71, 0x00, 0xD4, 0xF2, 0xEF, 0xFC, 0x65, 0xF0, 0x2C, 0xEA, 0xC4, 0xF6, + 0xD2, 0xF3, 0x2D, 0xF3, 0x09, 0x01, 0x22, 0xF8, 0xF4, 0xF4, 0x47, 0x0D, + 0x95, 0xF4, 0xC5, 0x05, 0xFF, 0xFA, 0x9B, 0xEB, 0x57, 0x00, 0xA6, 0xE1, + 0xB2, 0x0A, 0xB8, 0xDF, 0x29, 0x07, 0x92, 0xE7, 0x62, 0xF2, 0xD1, 0xF0, + 0x0E, 0xE1, 0xBD, 0xEA, 0x7F, 0xD5, 0xC1, 0xE6, 0x87, 0xD5, 0x2B, 0xEB, + 0xA7, 0xDE, 0x51, 0xDF, 0xF6, 0xD6, 0x63, 0xC9, 0x76, 0xCF, 0x96, 0xC4, + 0xFF, 0xDA, 0x4E, 0xD3, 0xBF, 0xE4, 0xCB, 0xDF, 0xFB, 0xE2, 0x65, 0xE1, + 0xE3, 0xDD, 0xF6, 0xE3, 0x90, 0xDD, 0x9A, 0xE4, 0x4E, 0xD7, 0xC2, 0xE4, + 0x8B, 0xC0, 0xFE, 0xE6, 0xA8, 0xB8, 0x65, 0xE8, 0xEA, 0xCB, 0x45, 0xEB, + 0x43, 0xD8, 0xCA, 0xE7, 0xC4, 0xCD, 0xDB, 0xEC, 0xB3, 0xBD, 0x75, 0xFE, + 0xD8, 0xB9, 0xE2, 0xFA, 0x62, 0xBD, 0xAF, 0xE4, 0xF6, 0xB8, 0x44, 0xDD, + 0xA6, 0xB4, 0xE3, 0xE4, 0x95, 0xAE, 0x27, 0xE4, 0x7D, 0xA8, 0x06, 0xDD, + 0xB4, 0xB6, 0xE7, 0xDE, 0xB6, 0xB4, 0x32, 0xE1, 0x84, 0xAE, 0xF0, 0xDC, + 0x4E, 0xCC, 0x10, 0xD3, 0xFE, 0xE6, 0xCE, 0xCA, 0x3F, 0xE2, 0xC8, 0xC7, + 0x0E, 0xCF, 0x3F, 0xCC, 0x96, 0xCA, 0x08, 0xDF, 0xF4, 0xCD, 0xA5, 0xF0, + 0x5C, 0xD4, 0x17, 0xE7, 0x4C, 0xD8, 0x2C, 0xDE, 0xEC, 0xD2, 0x50, 0xED, + 0x34, 0xE0, 0xEB, 0xEF, 0x49, 0xF6, 0x25, 0xEA, 0x79, 0xED, 0x67, 0xE9, + 0x70, 0xC7, 0x74, 0xE8, 0xE2, 0xAE, 0xDC, 0xE8, 0x30, 0xB2, 0x93, 0xED, + 0x5B, 0xBC, 0x0F, 0xEA, 0xD7, 0xC2, 0x5B, 0xDE, 0x44, 0xC5, 0x5C, 0xEC, + 0xFB, 0xC3, 0x88, 0xFF, 0x0C, 0xC1, 0x97, 0x03, 0x15, 0xD0, 0x92, 0x05, + 0xFB, 0xDE, 0x18, 0xFC, 0xE0, 0xD9, 0x04, 0xED, 0x17, 0xDB, 0x4E, 0xEB, + 0x06, 0xE3, 0x0A, 0xEC, 0x88, 0xF2, 0x64, 0xE5, 0x66, 0x0A, 0x30, 0xEE, + 0x08, 0x18, 0x69, 0x01, 0x57, 0x1A, 0x83, 0x07, 0x79, 0x19, 0xB0, 0x09, + 0xF0, 0x0F, 0x7B, 0x09, 0x99, 0x08, 0x52, 0x0A, 0x72, 0x12, 0xCC, 0x0A, + 0xB4, 0x1C, 0xBD, 0x00, 0x26, 0x25, 0x41, 0x00, 0x70, 0x39, 0x15, 0x16, + 0xF9, 0x52, 0x64, 0x20, 0x7D, 0x53, 0x4A, 0x19, 0x76, 0x46, 0x51, 0x22, + 0xA2, 0x53, 0x8F, 0x29, 0xC6, 0x54, 0x72, 0x21, 0x9B, 0x34, 0x67, 0x26, + 0xB8, 0x24, 0xAA, 0x29, 0x7F, 0x2C, 0xB1, 0x16, 0x66, 0x2C, 0x4A, 0x05, + 0x2B, 0x2C, 0xDD, 0x0A, 0x50, 0x34, 0x1D, 0x10, 0xE9, 0x30, 0x7F, 0x02, + 0x92, 0x2A, 0x32, 0xF2, 0x27, 0x21, 0xBD, 0xEE, 0xDD, 0x13, 0x7D, 0xEA, + 0xA0, 0x13, 0x77, 0xDE, 0x2F, 0x20, 0x29, 0xD7, 0x91, 0x2B, 0xF4, 0xD4, + 0x95, 0x23, 0xA6, 0xDC, 0x7F, 0x14, 0xDF, 0xDE, 0x23, 0x0C, 0xF0, 0xCD, + 0x51, 0x0F, 0x20, 0xCF, 0xA6, 0x1A, 0x34, 0xD6, 0x8D, 0x1C, 0x5F, 0xD0, + 0x0D, 0x12, 0xFD, 0xD8, 0xE1, 0x14, 0xDA, 0xDD, 0x57, 0x1C, 0xA5, 0xCF, + 0x4D, 0x00, 0x68, 0xD4, 0xAF, 0xDD, 0x1E, 0xE9, 0x55, 0xDC, 0xC0, 0xEB, + 0x25, 0xE9, 0x65, 0xE1, 0x83, 0xEB, 0x32, 0xCB, 0xCC, 0xEE, 0x72, 0xBF, + 0xF2, 0xDE, 0xE0, 0xCB, 0xAE, 0xC9, 0x9F, 0xD1, 0x66, 0xCC, 0xF2, 0xC4, + 0x62, 0xC9, 0x4E, 0xC1, 0x0A, 0xC2, 0xC4, 0xC9, 0xE2, 0xBF, 0x20, 0xD0, + 0x49, 0xC0, 0xE2, 0xD3, 0x93, 0xC0, 0x14, 0xC9, 0x93, 0xB4, 0x26, 0xBF, + 0x1C, 0xAE, 0x24, 0xC9, 0xD2, 0xB2, 0x58, 0xDA, 0x4C, 0xAD, 0x4C, 0xDB, + 0xF4, 0xA7, 0xA1, 0xCC, 0x04, 0xA8, 0x61, 0xC1, 0x05, 0xB6, 0x0E, 0xBD, + 0x32, 0xC8, 0xFB, 0xC0, 0x2E, 0xC7, 0x4E, 0xCA, 0x77, 0xBA, 0xE0, 0xD8, + 0xCA, 0xAF, 0x7E, 0xEA, 0xF6, 0xA6, 0xE2, 0xF1, 0x27, 0xA9, 0xAF, 0xF1, + 0x03, 0xB8, 0xBD, 0xE9, 0x46, 0xBD, 0x0F, 0xE3, 0xEC, 0xC0, 0xBB, 0xE0, + 0x3B, 0xBE, 0x4B, 0xE3, 0x43, 0xBA, 0x23, 0xEF, 0xFC, 0xBF, 0x8B, 0xE9, + 0x35, 0xB5, 0x2E, 0xE3, 0xD6, 0xB3, 0x43, 0xEC, 0xCE, 0xC2, 0xE5, 0xF0, + 0xC6, 0xC0, 0x80, 0xE4, 0x89, 0xBF, 0x8A, 0xCF, 0xD2, 0xCA, 0x4A, 0xC9, + 0x69, 0xCC, 0xC2, 0xD8, 0x8F, 0xBE, 0x12, 0xEF, 0xE4, 0xC1, 0x86, 0xEE, + 0x84, 0xD3, 0x84, 0xE5, 0x87, 0xD8, 0xB0, 0xE9, 0x88, 0xD9, 0x7D, 0xE6, + 0xD1, 0xD8, 0x78, 0xDE, 0x59, 0xE4, 0x76, 0xE5, 0x0D, 0xED, 0x32, 0xF4, + 0x89, 0xD7, 0x89, 0xFC, 0xC6, 0xD6, 0xD7, 0x02, 0xFF, 0xF8, 0xAC, 0xFC, + 0x53, 0x06, 0xEA, 0xEA, 0x9D, 0xF8, 0x8A, 0xE3, 0x32, 0xF5, 0x24, 0xE6, + 0xD3, 0xFA, 0xFC, 0xEE, 0xB0, 0xFB, 0x6A, 0xF8, 0x32, 0x03, 0x44, 0xFF, + 0x69, 0x00, 0x0B, 0x01, 0x35, 0xEF, 0x4C, 0x09, 0x36, 0xF9, 0x58, 0x12, + 0x1C, 0x20, 0xBD, 0x0B, 0xD1, 0x39, 0x6D, 0x03, 0x84, 0x39, 0x67, 0x04, + 0xFB, 0x28, 0x1E, 0x07, 0x9A, 0x2C, 0x0C, 0x0E, 0x99, 0x3F, 0xB3, 0x0B, + 0xC8, 0x3E, 0xB9, 0x00, 0x55, 0x35, 0x32, 0x07, 0xC3, 0x31, 0x7C, 0x05, + 0x3D, 0x30, 0x30, 0x02, 0x3D, 0x2E, 0x95, 0x17, 0xB4, 0x3A, 0xE6, 0x1F, + 0x7E, 0x45, 0x2A, 0x1A, 0x37, 0x3F, 0x3B, 0x1A, 0xE3, 0x2C, 0xCD, 0x1B, + 0xAE, 0x26, 0xC5, 0x19, 0xF5, 0x39, 0xD3, 0x0D, 0xD3, 0x48, 0x91, 0x09, + 0x5E, 0x4C, 0x0E, 0x0D, 0x38, 0x49, 0x0E, 0x17, 0xCC, 0x51, 0x82, 0x2D, + 0x52, 0x58, 0x44, 0x3A, 0x5C, 0x49, 0xB7, 0x38, 0xD1, 0x44, 0x69, 0x33, + 0x74, 0x4A, 0x00, 0x2E, 0xAD, 0x49, 0x98, 0x27, 0xF8, 0x46, 0xE3, 0x2A, + 0x14, 0x49, 0xE1, 0x2D, 0x58, 0x53, 0xFA, 0x22, 0xEE, 0x58, 0x89, 0x24, + 0x86, 0x5B, 0x47, 0x2E, 0x0E, 0x5D, 0xA8, 0x31, 0x4F, 0x4E, 0xD6, 0x31, + 0x42, 0x46, 0x80, 0x2C, 0xAE, 0x45, 0x1C, 0x26, 0xB5, 0x41, 0xF1, 0x2A, + 0x7F, 0x46, 0xB8, 0x28, 0x5A, 0x4A, 0x30, 0x21, 0x20, 0x48, 0xC5, 0x34, + 0xE2, 0x44, 0x2A, 0x38, 0x68, 0x34, 0x74, 0x22, 0x65, 0x1C, 0x66, 0x1F, + 0xC6, 0x1F, 0x76, 0x18, 0x4C, 0x1F, 0x64, 0x0D, 0x99, 0x08, 0xFD, 0x14, + 0x5C, 0xFB, 0xE5, 0x1A, 0x95, 0xF5, 0x6B, 0x13, 0x5D, 0xF4, 0x26, 0x04, + 0x6E, 0xF4, 0x4D, 0x00, 0x0F, 0xEB, 0xAF, 0x07, 0x4A, 0xE4, 0xEB, 0x03, + 0x77, 0xF0, 0x9C, 0xFA, 0x2D, 0xFB, 0x5E, 0xF7, 0xF7, 0xF7, 0x96, 0x01, + 0x92, 0xDE, 0xCE, 0x0D, 0xE7, 0xC4, 0x76, 0x10, 0xFE, 0xCF, 0x76, 0x0D, + 0xC7, 0xE1, 0xAA, 0xF9, 0x83, 0xE0, 0x27, 0xEC, 0x4A, 0xD7, 0x9E, 0xF4, + 0x31, 0xD3, 0x9C, 0xF8, 0x77, 0xD3, 0xED, 0xEE, 0x60, 0xCF, 0x0F, 0xE5, + 0xCD, 0xC2, 0x15, 0xEB, 0x11, 0xBD, 0x42, 0xF4, 0xF1, 0xB7, 0xC3, 0xF0, + 0x50, 0xA9, 0xEB, 0xEF, 0x2A, 0xAD, 0xDC, 0xEE, 0xA7, 0xB3, 0xED, 0xF9, + 0x45, 0xB4, 0xD3, 0x11, 0xB9, 0xBA, 0xFD, 0x12, 0xC6, 0xB9, 0xC9, 0x14, + 0x38, 0xBE, 0xC6, 0x1D, 0x21, 0xCA, 0xD3, 0x0A, 0xE4, 0xD1, 0xF2, 0xF7, + 0xCA, 0xD7, 0xD6, 0xF7, 0x41, 0xD9, 0x6B, 0xFA, 0xF2, 0xCC, 0xE0, 0xFF, + 0x71, 0xC5, 0xED, 0x0A, 0xD7, 0xC7, 0x41, 0x0F, 0xC0, 0xC4, 0x73, 0x04, + 0xB0, 0xCB, 0xAC, 0xF2, 0x92, 0xE1, 0x78, 0xF7, 0x41, 0xEE, 0x47, 0x07, + 0x49, 0xF8, 0xFD, 0x00, 0x3F, 0x0A, 0x77, 0xF2, 0x61, 0x0A, 0x05, 0xF2, + 0xC2, 0x02, 0x61, 0x09, 0x32, 0x09, 0xCC, 0x14, 0x5E, 0x14, 0x5B, 0x0C, + 0xD3, 0x21, 0x03, 0x09, 0xB7, 0x28, 0xB1, 0x02, 0x84, 0x1B, 0x8D, 0xF8, + 0xE3, 0x13, 0xB8, 0xF8, 0x40, 0x21, 0x56, 0xFF, 0x7A, 0x24, 0xE7, 0x02, + 0x90, 0x17, 0xA5, 0x08, 0x40, 0x1D, 0xC8, 0x13, 0x0A, 0x28, 0x0F, 0x0F, + 0x5F, 0x27, 0x68, 0x01, 0x89, 0x20, 0x3F, 0x06, 0x9B, 0x0E, 0xD7, 0x13, + 0xB6, 0x12, 0xC0, 0x1B, 0x3E, 0x31, 0x39, 0x15, 0x2A, 0x43, 0x27, 0x05, + 0x37, 0x44, 0xCB, 0x03, 0x5E, 0x43, 0x21, 0x0F, 0x9E, 0x44, 0x35, 0x0D, + 0xE5, 0x4C, 0x5B, 0xFE, 0xEE, 0x51, 0xD7, 0xF9, 0xAB, 0x46, 0x7E, 0x0A, + 0xE5, 0x34, 0x8F, 0x16, 0xA2, 0x3A, 0x96, 0x17, 0x2C, 0x4E, 0x90, 0x1D, + 0xD6, 0x55, 0x40, 0x20, 0x80, 0x4F, 0x39, 0x21, 0xC5, 0x42, 0x5C, 0x2A, + 0x47, 0x47, 0x0B, 0x34, 0xE5, 0x4B, 0xA7, 0x2B, 0xAF, 0x4E, 0xCA, 0x1B, + 0x23, 0x54, 0x2A, 0x22, 0xEB, 0x47, 0x2A, 0x35, 0xBE, 0x37, 0x08, 0x34, + 0x26, 0x32, 0xD9, 0x2B, 0xF1, 0x33, 0xDE, 0x33, 0x2D, 0x38, 0x13, 0x3B, + 0x45, 0x2E, 0x4B, 0x35, 0xAF, 0x20, 0x18, 0x33, 0x7D, 0x25, 0x41, 0x34, + 0x96, 0x29, 0x74, 0x2C, 0xFA, 0x25, 0x7B, 0x1E, 0x7A, 0x24, 0x74, 0x10, + 0x19, 0x2B, 0xFC, 0x0A, 0xB8, 0x36, 0x35, 0x11, 0x44, 0x37, 0xC9, 0x1D, + 0xF3, 0x2F, 0xE6, 0x2A, 0x27, 0x2A, 0x65, 0x2E, 0x54, 0x26, 0x33, 0x24, + 0xD7, 0x19, 0x1C, 0x25, 0xC6, 0x0E, 0x8B, 0x2F, 0x53, 0x10, 0xAA, 0x23, + 0x4F, 0x0E, 0xD9, 0x16, 0x52, 0x18, 0xC9, 0x1D, 0x02, 0x2E, 0x74, 0x2A, + 0xFA, 0x2D, 0xF7, 0x36, 0x28, 0x2A, 0x4A, 0x3E, 0xCE, 0x2A, 0x56, 0x3E, + 0xBD, 0x12, 0x8C, 0x39, 0x08, 0xF5, 0x72, 0x2F, 0x3E, 0xEB, 0x41, 0x21, + 0x6B, 0xF3, 0x7E, 0x1E, 0x97, 0xFD, 0xD5, 0x2B, 0x64, 0xFA, 0x0D, 0x32, + 0x7F, 0xF5, 0xE2, 0x2A, 0x50, 0xF2, 0x81, 0x1C, 0x81, 0xE8, 0xF6, 0x09, + 0xB5, 0xE0, 0x9D, 0x08, 0x9B, 0xD6, 0xBB, 0x13, 0xFB, 0xC7, 0x11, 0x13, + 0xE0, 0xC1, 0x5C, 0xFE, 0xF0, 0xC6, 0xA4, 0xEE, 0x23, 0xC7, 0x84, 0xF9, + 0x5F, 0xBD, 0xAD, 0x00, 0xE6, 0xB6, 0x1E, 0xF7, 0x8F, 0xC4, 0xC7, 0xEB, + 0xF0, 0xD7, 0xEE, 0xDA, 0x07, 0xD4, 0x3E, 0xDD, 0x19, 0xBD, 0xDA, 0xF2, + 0xAF, 0xBA, 0xB7, 0x00, 0xF3, 0xC4, 0x7F, 0xFC, 0x70, 0xC6, 0xBB, 0xF7, + 0x0F, 0xC5, 0x28, 0x00, 0xD0, 0xC4, 0x81, 0x02, 0xDD, 0xD0, 0x6A, 0xFD, + 0xF2, 0xDE, 0xE2, 0xF4, 0x28, 0xD7, 0x5C, 0xEB, 0xEA, 0xCD, 0xD2, 0xF6, + 0xFD, 0xCF, 0x6C, 0xFA, 0xF3, 0xCE, 0x05, 0xEB, 0x7E, 0xD0, 0x71, 0xE6, + 0xD7, 0xD2, 0x1D, 0xE0, 0xD4, 0xCD, 0x10, 0xDA, 0xE5, 0xC6, 0xBA, 0xD9, + 0x0B, 0xC4, 0x09, 0xE1, 0x74, 0xC6, 0xB1, 0xEC, 0xDB, 0xCD, 0x32, 0xF3, + 0x28, 0xD4, 0x0E, 0xF6, 0xA7, 0xDA, 0x49, 0xE7, 0xE9, 0xE7, 0x6D, 0xCF, + 0xF7, 0xF9, 0xF4, 0xC6, 0x1C, 0xFE, 0xB4, 0xD3, 0x84, 0xF7, 0x9E, 0xE7, + 0xF1, 0xFA, 0x11, 0xF2, 0xE3, 0xFD, 0x97, 0xF4, 0xAC, 0xFA, 0x86, 0xEF, + 0x64, 0xF6, 0x46, 0xE9, 0x42, 0xF9, 0x42, 0xED, 0x11, 0x02, 0x56, 0xE8, + 0x77, 0x0E, 0x34, 0xD7, 0x35, 0x12, 0xF9, 0xD1, 0xBB, 0x07, 0x04, 0xDE, + 0x07, 0x0A, 0xA8, 0xEF, 0xDA, 0x18, 0x7D, 0xF9, 0xEA, 0x1F, 0xB8, 0xF3, + 0xB2, 0x1F, 0xEE, 0xE8, 0x11, 0x26, 0x7F, 0xE2, 0xBE, 0x2B, 0xB1, 0xDF, + 0xE4, 0x25, 0x49, 0xE2, 0xD4, 0x20, 0xF2, 0xE6, 0x57, 0x1E, 0x76, 0xEE, + 0x1D, 0x20, 0xF8, 0xF5, 0x52, 0x2D, 0x75, 0xEC, 0xE4, 0x3E, 0x2B, 0xDE, + 0x45, 0x36, 0xDF, 0xDE, 0x5B, 0x18, 0x3B, 0xE3, 0x1D, 0x10, 0x4E, 0xE3, + 0x12, 0x1C, 0xBB, 0xEC, 0xBB, 0x1C, 0x5E, 0xF3, 0xB7, 0x10, 0xD0, 0xED, + 0x75, 0x15, 0x91, 0xF4, 0x3A, 0x2F, 0xA8, 0xF7, 0x86, 0x40, 0x19, 0xEC, + 0x7E, 0x3B, 0x4E, 0xE7, 0xBE, 0x31, 0xC8, 0xEC, 0xD4, 0x20, 0x28, 0xFA, + 0xD3, 0x0D, 0x41, 0x08, 0x12, 0x0D, 0xDE, 0x05, 0x8E, 0x16, 0x68, 0x05, + 0xE7, 0x16, 0xB7, 0x0F, 0xC7, 0x10, 0x3A, 0x0D, 0x77, 0x06, 0x49, 0x05, + 0x2D, 0xF3, 0xF0, 0x06, 0x8D, 0xF1, 0xD8, 0x0A, 0x1D, 0xFC, 0x59, 0x07, + 0xC1, 0xFD, 0x34, 0x06, 0xC8, 0xFF, 0x8F, 0x09, 0x1A, 0xF7, 0x08, 0x03, + 0x73, 0xF5, 0xEF, 0xF7, 0x06, 0xFB, 0x17, 0xF1, 0x0B, 0xED, 0x1D, 0xFE, + 0x64, 0xDC, 0x49, 0x07, 0x87, 0xD9, 0x8E, 0x06, 0x02, 0xD8, 0x15, 0x11, + 0x2E, 0xD9, 0xFD, 0x0F, 0xEC, 0xD6, 0x29, 0xF7, 0xC5, 0xD3, 0xBA, 0xE7, + 0x90, 0xD5, 0x58, 0xED, 0x45, 0xD5, 0x38, 0xF1, 0xD2, 0xC9, 0x60, 0xF1, + 0xDC, 0xC5, 0x15, 0xFB, 0xF9, 0xD5, 0x9F, 0x08, 0x19, 0xD0, 0x7A, 0x0D, + 0xF8, 0xBC, 0x93, 0x0D, 0x1F, 0xB6, 0xFF, 0x09, 0xF8, 0xB8, 0x08, 0xFD, + 0x25, 0xBD, 0x1D, 0xF4, 0x9B, 0xBB, 0x03, 0xF2, 0x6D, 0xC5, 0x50, 0xEB, + 0x3C, 0xD0, 0x1F, 0xF4, 0x1E, 0xD5, 0x22, 0x00, 0xD9, 0xE5, 0xCB, 0xFE, + 0xE1, 0xF3, 0xBB, 0x01, 0x9B, 0xE4, 0x14, 0xF7, 0xA8, 0xD1, 0x7C, 0xDF, + 0x65, 0xD6, 0xCB, 0xDD, 0xAB, 0xE2, 0x7B, 0xF5, 0x8C, 0xEA, 0x40, 0x02, + 0xA2, 0xED, 0x2F, 0xF9, 0xAC, 0xF8, 0x58, 0xEE, 0xFF, 0xFE, 0x4B, 0xEC, + 0xC7, 0xEC, 0x68, 0xF5, 0x6D, 0xDD, 0x8A, 0xF6, 0x9E, 0xE5, 0x49, 0xEC, + 0x3F, 0xEF, 0x78, 0xE6, 0x1A, 0xE5, 0x41, 0xF2, 0xBB, 0xD6, 0xA1, 0x06, + 0x65, 0xD8, 0xB0, 0x08, 0x25, 0xE2, 0xF1, 0xF4, 0x04, 0xE6, 0xB1, 0xDF, + 0xB4, 0xE4, 0xF7, 0xD6, 0x11, 0xEA, 0xEB, 0xD8, 0x66, 0xF5, 0x7B, 0xDC, + 0xDB, 0xF3, 0x36, 0xD5, 0xF9, 0xEA, 0x33, 0xD8, 0x45, 0xF0, 0x7B, 0xED, + 0x7B, 0xF5, 0x08, 0xF2, 0x2C, 0xF0, 0x37, 0xE4, 0xCE, 0xF9, 0xFD, 0xDE, + 0xA6, 0x07, 0x59, 0xDF, 0xB9, 0x08, 0x0D, 0xDE, 0x62, 0x07, 0x49, 0xDB, + 0xD5, 0x06, 0xB5, 0xDC, 0xAE, 0xFF, 0x17, 0xE1, 0x4D, 0x00, 0x47, 0xE1, + 0x76, 0x0C, 0xB4, 0xE1, 0x25, 0x0F, 0xD1, 0xDB, 0x4A, 0x10, 0x7F, 0xD4, + 0x59, 0x09, 0x07, 0xDC, 0x78, 0xF8, 0xEF, 0xE9, 0xDE, 0xF2, 0xA5, 0xF9, + 0xDD, 0xF0, 0x05, 0xFD, 0xC4, 0xF2, 0x2E, 0xED, 0x3B, 0x01, 0x5D, 0xE7, + 0x47, 0x0D, 0xAB, 0xEB, 0xE1, 0x0A, 0x24, 0xE9, 0xAB, 0x0A, 0x7D, 0xE5, + 0xBE, 0x14, 0xC7, 0xE1, 0x83, 0x15, 0xB5, 0xE5, 0x0C, 0x02, 0xBE, 0xF2, + 0x6D, 0xFB, 0x3C, 0xFB, 0xE9, 0x14, 0xD3, 0xF6, 0xD6, 0x21, 0xCE, 0xEC, + 0x5D, 0x1B, 0x79, 0xE4, 0x56, 0x1B, 0xD9, 0xDE, 0xE1, 0x1C, 0x77, 0xE3, + 0xD7, 0x1D, 0x67, 0xE0, 0x2F, 0x26, 0x4E, 0xE8, 0x87, 0x27, 0x0D, 0xF2, + 0x19, 0x2D, 0x1C, 0xEC, 0xA8, 0x32, 0x29, 0xEA, 0x44, 0x2A, 0x4D, 0xE5, + 0xF7, 0x25, 0xCB, 0xE6, 0x19, 0x1B, 0xFB, 0xF1, 0x22, 0x0E, 0x2B, 0xF4, + 0xF5, 0x1A, 0x66, 0xED, 0x90, 0x25, 0x7F, 0xF1, 0x92, 0x17, 0xA0, 0xFF, + 0xE4, 0x0F, 0x9D, 0x04, 0xF8, 0x0E, 0x6E, 0x07, 0x8A, 0x09, 0x65, 0x01, + 0x84, 0x04, 0xF5, 0xF5, 0xD9, 0xF4, 0x81, 0xF8, 0x0A, 0xE1, 0x00, 0x01, + 0x3F, 0xE1, 0x95, 0x0B, 0xD7, 0xEA, 0xCD, 0x09, 0x45, 0xF3, 0x32, 0xFC, + 0x8E, 0xF8, 0xCD, 0xF3, 0xD9, 0xEE, 0x2D, 0xEE, 0x5D, 0xE7, 0x6E, 0xEC, + 0xC8, 0xE4, 0x32, 0xEE, 0xE5, 0xE3, 0x9B, 0xEC, 0x6B, 0xEF, 0xC3, 0xF1, + 0xCF, 0xE8, 0x5D, 0xFB, 0x99, 0xD9, 0x92, 0x03, 0x91, 0xE0, 0x53, 0x03, + 0x9E, 0xE7, 0xAC, 0xFE, 0xC2, 0xD8, 0x1F, 0x01, 0xD6, 0xCE, 0x4B, 0x08, + 0x62, 0xD5, 0x2B, 0x0C, 0x92, 0xD9, 0x1C, 0x0B, 0xC6, 0xDC, 0x24, 0x0B, + 0x42, 0xDD, 0xDD, 0x07, 0x95, 0xD3, 0x19, 0xFB, 0x65, 0xC5, 0xE3, 0x00, + 0xDC, 0xBA, 0x43, 0x12, 0x98, 0xB7, 0x34, 0x16, 0x7F, 0xBC, 0x60, 0x19, + 0xC8, 0xC7, 0x7D, 0x18, 0x8A, 0xCB, 0x07, 0x0C, 0xDD, 0xC4, 0xC9, 0xFF, + 0x0E, 0xC7, 0x37, 0xFF, 0x19, 0xCF, 0x70, 0xFB, 0xCC, 0xD1, 0xFC, 0xF8, + 0x3D, 0xD3, 0x8D, 0xFD, 0xCD, 0xDA, 0xE7, 0xF9, 0x11, 0xE4, 0x96, 0xFB, + 0x7E, 0xEA, 0xFA, 0x02, 0xBE, 0xEB, 0xA6, 0x00, 0x5C, 0xE6, 0xFB, 0xFF, + 0x37, 0xE1, 0xEF, 0xFE, 0x29, 0xE5, 0xA2, 0xF9, 0xCB, 0xEC, 0xA3, 0xF2, + 0xA3, 0xF8, 0x08, 0xFD, 0x2E, 0x02, 0x62, 0x10, 0x10, 0x11, 0x5F, 0x1B, + 0x3C, 0x1C, 0x2E, 0x19, 0x2F, 0x20, 0x14, 0x0F, 0xE0, 0x21, 0xA6, 0x13, + 0x38, 0x14, 0x9C, 0x1D, 0x3A, 0x19, 0x3E, 0x2B, 0xA9, 0x29, 0xBE, 0x32, + 0xE5, 0x34, 0xF0, 0x31, 0xA2, 0x40, 0x14, 0x37, 0x41, 0x3B, 0xCA, 0x36, + 0xEA, 0x36, 0x92, 0x33, 0x85, 0x45, 0xE8, 0x29, 0xE7, 0x4C, 0xA2, 0x19, + 0xC6, 0x43, 0x9E, 0x20, 0x7B, 0x3F, 0x8C, 0x33, 0x34, 0x43, 0xD9, 0x39, + 0x48, 0x3E, 0xA8, 0x2B, 0xD5, 0x3E, 0x1F, 0x1E, 0x82, 0x45, 0xE2, 0x1C, + 0x5E, 0x43, 0x0C, 0x10, 0xAF, 0x46, 0xC6, 0x0A, 0xD7, 0x4A, 0xD9, 0x14, + 0xCC, 0x4C, 0xF6, 0x18, 0x45, 0x4F, 0x6B, 0x1C, 0x66, 0x47, 0x1C, 0x24, + 0xC8, 0x41, 0x2B, 0x28, 0xD0, 0x3F, 0x73, 0x23, 0xE6, 0x40, 0xCD, 0x17, + 0xF5, 0x48, 0xA7, 0x16, 0x2A, 0x42, 0xF0, 0x21, 0x0D, 0x35, 0x56, 0x28, + 0x63, 0x34, 0xC1, 0x24, 0x32, 0x32, 0x6D, 0x1F, 0x8A, 0x30, 0x0F, 0x25, + 0x44, 0x33, 0xAA, 0x20, 0x8D, 0x35, 0xF1, 0x0D, 0x50, 0x36, 0xCF, 0x07, + 0x80, 0x2D, 0xBC, 0x1A, 0x54, 0x1C, 0xC5, 0x2C, 0x73, 0x16, 0x9E, 0x24, + 0xAE, 0x19, 0xE0, 0x28, 0x51, 0x0E, 0x94, 0x28, 0xA0, 0x0A, 0xB6, 0x0F, + 0x07, 0x1C, 0x0F, 0x0D, 0x78, 0x2A, 0x18, 0x12, 0x63, 0x30, 0x3A, 0x08, + 0x62, 0x29, 0xC2, 0x02, 0xA1, 0x14, 0xDC, 0x0D, 0xD2, 0x04, 0x68, 0x15, + 0xBB, 0x01, 0x13, 0x0E, 0x93, 0x07, 0x54, 0x0A, 0xD2, 0x0B, 0x51, 0x0A, + 0x15, 0x05, 0x8F, 0x00, 0xEF, 0x00, 0x9A, 0xF1, 0xEC, 0x04, 0x48, 0xF8, + 0x4D, 0xFE, 0xC9, 0x0B, 0x35, 0xF3, 0x72, 0x0F, 0x3F, 0xF4, 0x43, 0x0B, + 0xEE, 0xFE, 0x85, 0xFE, 0x1A, 0x0B, 0xD2, 0xEE, 0xC3, 0x05, 0x62, 0xEE, + 0xFE, 0xE9, 0xB3, 0xEF, 0xE5, 0xDE, 0x37, 0xF7, 0x60, 0xE3, 0x25, 0xF9, + 0x74, 0xE2, 0x26, 0xF2, 0xB9, 0xE7, 0x25, 0xF3, 0x7C, 0xEA, 0xDF, 0xF0, + 0x87, 0xE7, 0x1B, 0xF1, 0xB0, 0xE8, 0x15, 0xF3, 0xB1, 0xF0, 0x35, 0xED, + 0xA8, 0xF1, 0x0E, 0xEB, 0x8F, 0xD6, 0x10, 0xF3, 0xCB, 0xBD, 0x8C, 0xFE, + 0xA9, 0xCE, 0x8E, 0x06, 0x60, 0xE8, 0x22, 0x06, 0x76, 0xF3, 0x3A, 0xFF, + 0x1B, 0xFE, 0x8E, 0xFA, 0xE3, 0x01, 0xB3, 0xFA, 0x81, 0xF5, 0x72, 0xFC, + 0xB7, 0xEB, 0xEA, 0xFD, 0xFB, 0xE1, 0xE1, 0xFB, 0x8E, 0xD4, 0x4F, 0x03, + 0x6D, 0xD4, 0xAC, 0x10, 0xD6, 0xD9, 0x2B, 0x0E, 0x8E, 0xE0, 0x03, 0x0E, + 0x3F, 0xE1, 0x8D, 0x14, 0xA7, 0xCE, 0x74, 0x0A, 0x77, 0xC3, 0x8E, 0x0C, + 0x87, 0xCA, 0x11, 0x1B, 0x83, 0xD2, 0xC9, 0x1A, 0x28, 0xD7, 0x95, 0x0F, + 0x48, 0xDC, 0x59, 0x04, 0x1E, 0xE2, 0x82, 0x06, 0x99, 0xDE, 0x69, 0x07, + 0xC5, 0xD4, 0x6A, 0x04, 0x68, 0xD6, 0xAB, 0x0E, 0x25, 0xDE, 0x8B, 0x18, + 0x7A, 0xE4, 0x3C, 0x18, 0x8B, 0xEA, 0x4A, 0x18, 0x6A, 0xEA, 0xBE, 0x12, + 0x5A, 0xF1, 0xBC, 0x03, 0x20, 0xFA, 0x2A, 0xFE, 0x67, 0xF7, 0x50, 0xFC, + 0xD2, 0x00, 0xEB, 0xFE, 0xD7, 0x14, 0x97, 0x0F, 0xC0, 0x18, 0xAE, 0x15, + 0x9B, 0x22, 0x2A, 0x1F, 0xE4, 0x30, 0x0A, 0x2F, 0xDC, 0x28, 0xB7, 0x30, + 0x0C, 0x1E, 0xF5, 0x26, 0x76, 0x16, 0x47, 0x13, 0xF5, 0x18, 0x2D, 0x0A, + 0x6C, 0x28, 0x40, 0x13, 0x42, 0x31, 0x84, 0x1E, 0x99, 0x41, 0x06, 0x21, + 0x5A, 0x5D, 0xC9, 0x1D, 0x31, 0x5C, 0x4A, 0x1C, 0x42, 0x38, 0xAD, 0x1A, + 0xD7, 0x33, 0xE4, 0x21, 0x2D, 0x47, 0xE5, 0x19, 0x7C, 0x4A, 0x80, 0x0D, + 0xBE, 0x4D, 0x98, 0x1E, 0x00, 0x50, 0x6B, 0x2E, 0xB3, 0x51, 0x66, 0x31, + 0xA5, 0x50, 0xDF, 0x2B, 0xAD, 0x4F, 0x83, 0x22, 0x38, 0x50, 0xDE, 0x1E, + 0x28, 0x4C, 0x62, 0x1E, 0x72, 0x46, 0xEE, 0x19, 0x5F, 0x42, 0xBE, 0x1D, + 0xEA, 0x3E, 0xDF, 0x25, 0xAD, 0x40, 0x58, 0x26, 0xD1, 0x39, 0xCF, 0x1F, + 0x7A, 0x31, 0x86, 0x18, 0x65, 0x37, 0x47, 0x0B, 0x92, 0x37, 0x18, 0xFB, + 0x50, 0x33, 0xE7, 0x00, 0xCA, 0x30, 0xD7, 0x0C, 0x66, 0x2A, 0x8D, 0x0F, + 0x63, 0x20, 0xC3, 0x0F, 0x9C, 0x17, 0x61, 0x11, 0xB8, 0x15, 0xCC, 0x15, + 0x1B, 0x15, 0xD0, 0x0A, 0x34, 0x0F, 0xED, 0xF7, 0xF2, 0x0B, 0xA0, 0xF8, + 0xE7, 0x07, 0x4D, 0xF6, 0x47, 0x07, 0x13, 0xF4, 0x51, 0x0C, 0x04, 0xFB, + 0xF2, 0x10, 0xDE, 0xF4, 0xA9, 0x06, 0xB5, 0xDF, 0x61, 0xF4, 0x73, 0xDE, + 0x0A, 0xF0, 0x26, 0xEE, 0x68, 0xE9, 0x91, 0xE7, 0xC2, 0xE1, 0x65, 0xE5, + 0x3A, 0xD7, 0xA9, 0xEF, 0xF5, 0xC2, 0xDF, 0xF5, 0x9C, 0xBE, 0xAF, 0xFD, + 0x4F, 0xCB, 0xC5, 0xFD, 0x66, 0xD6, 0x91, 0xEF, 0x4E, 0xDA, 0x58, 0xE4, + 0xC7, 0xD1, 0x69, 0xE1, 0x75, 0xC4, 0xEF, 0xDC, 0xA9, 0xC0, 0x4A, 0xE0, + 0x99, 0xBA, 0x81, 0xEA, 0xB5, 0xB2, 0x82, 0xEE, 0x91, 0xB6, 0x94, 0xE6, + 0x98, 0xBB, 0x5B, 0xD5, 0x49, 0xBA, 0x74, 0xC5, 0x5C, 0xB4, 0x1A, 0xBE, + 0xF9, 0xAE, 0x8A, 0xCF, 0x99, 0xAF, 0xC8, 0xDB, 0x74, 0xBA, 0x1B, 0xCF, + 0x3D, 0xC7, 0x50, 0xC3, 0x70, 0xC8, 0x7E, 0xBE, 0x82, 0xC8, 0x66, 0xC1, + 0xF9, 0xC1, 0xB8, 0xC5, 0xB1, 0xB8, 0xAE, 0xCA, 0x45, 0xBB, 0x33, 0xCA, + 0x0C, 0xC3, 0xC5, 0xCA, 0xE4, 0xC4, 0x2D, 0xCF, 0xC8, 0xBE, 0x93, 0xD0, + 0xA2, 0xC0, 0x1F, 0xD6, 0xE9, 0xC8, 0xF5, 0xD0, 0xD4, 0xCE, 0x4A, 0xC8, + 0xDF, 0xC3, 0x18, 0xCC, 0x00, 0xAE, 0xBB, 0xDC, 0x8F, 0xA6, 0x67, 0xE8, + 0x39, 0xA5, 0xC2, 0xDB, 0xFE, 0xB7, 0x6E, 0xDA, 0x6B, 0xCE, 0xB5, 0xDC, + 0xDC, 0xCF, 0xFE, 0xD7, 0x43, 0xD4, 0xF1, 0xDA, 0x7C, 0xDC, 0x00, 0xD6, + 0x96, 0xD9, 0x56, 0xCC, 0x81, 0xC7, 0x16, 0xC7, 0x65, 0xC5, 0x83, 0xCE, + 0x73, 0xD5, 0xD6, 0xDF, 0x12, 0xDE, 0x83, 0xE2, 0x39, 0xEA, 0xAD, 0xD9, + 0xD3, 0xEB, 0xEA, 0xDB, 0x6E, 0xDF, 0x0E, 0xEA, 0x9D, 0xDC, 0x39, 0xF1, + 0xCA, 0xE2, 0xE7, 0xF6, 0xC7, 0xEB, 0x1D, 0xFC, 0x86, 0xF8, 0x25, 0xF5, + 0x57, 0x05, 0x33, 0xFB, 0x59, 0xFE, 0x64, 0x05, 0x2F, 0xF5, 0xE7, 0x02, + 0xC9, 0xF4, 0xB9, 0x04, 0x52, 0xEE, 0x03, 0x07, 0x5F, 0xED, 0x3E, 0x11, + 0x8D, 0xF0, 0x87, 0x23, 0x14, 0xF8, 0x78, 0x25, 0x67, 0x08, 0xBF, 0x1B, + 0x7C, 0x0E, 0xA1, 0x13, 0x91, 0x08, 0x49, 0x0A, 0x7A, 0x07, 0x6B, 0x05, + 0xB8, 0x06, 0x36, 0x02, 0xE4, 0x0D, 0x1C, 0xFD, 0x67, 0x1E, 0x00, 0x01, + 0xB6, 0x21, 0x5A, 0x11, 0xEC, 0x2B, 0xC0, 0x23, 0x1E, 0x3F, 0xC5, 0x22, + 0xE1, 0x3E, 0xAD, 0x10, 0xDF, 0x27, 0x63, 0x04, 0xF1, 0x10, 0x80, 0x07, + 0x6E, 0x15, 0x18, 0x11, 0xBA, 0x2F, 0xF7, 0x13, 0x40, 0x4B, 0x8A, 0x0F, + 0xC6, 0x5C, 0xEC, 0x14, 0x01, 0x5A, 0x62, 0x1F, 0xF6, 0x4D, 0x5C, 0x1E, + 0x73, 0x4A, 0xE0, 0x17, 0xE1, 0x49, 0x92, 0x0F, 0x50, 0x4E, 0xA4, 0x13, + 0x5C, 0x48, 0x00, 0x1D, 0xFF, 0x39, 0xFD, 0x24, 0xC9, 0x3E, 0xD2, 0x2A, + 0x41, 0x46, 0xCE, 0x23, 0xC9, 0x3F, 0x07, 0x1C, 0xA7, 0x39, 0x2F, 0x15, + 0xEA, 0x34, 0xFD, 0x11, 0x5B, 0x2A, 0xEF, 0x10, 0x82, 0x24, 0x0E, 0x0E, + 0xE1, 0x22, 0xA4, 0x13, 0xC9, 0x19, 0x0C, 0x1A, 0x97, 0x12, 0x3D, 0x0C, + 0x52, 0x1D, 0x4C, 0xFB, 0x72, 0x25, 0x68, 0xF5, 0x3D, 0x20, 0x37, 0xED, + 0xD0, 0x1A, 0xD3, 0xE2, 0x4A, 0x20, 0x32, 0xE4, 0x30, 0x22, 0x7F, 0xEA, + 0x4E, 0x12, 0xCB, 0xF1, 0xCB, 0x01, 0x52, 0xFC, 0xD0, 0xF8, 0x19, 0xFA, + 0x7E, 0xFC, 0xC4, 0xEA, 0x23, 0xF4, 0x3E, 0xDE, 0xE9, 0xD7, 0xA2, 0xE3, + 0xCD, 0xD0, 0xB1, 0xEF, 0xB9, 0xE2, 0x6A, 0xF0, 0x58, 0xE9, 0xA1, 0xED, + 0x06, 0xDE, 0x62, 0xEA, 0x9E, 0xD4, 0x5E, 0xE1, 0x76, 0xCE, 0xFE, 0xDC, + 0xD5, 0xC8, 0xE3, 0xD9, 0x29, 0xC1, 0xE5, 0xD3, 0x3B, 0xB4, 0x23, 0xDB, + 0x72, 0xAA, 0x6C, 0xE3, 0xA1, 0xA7, 0xCC, 0xE6, 0x56, 0xA9, 0xDB, 0xEA, + 0x05, 0xB2, 0x09, 0xE8, 0xEC, 0xB9, 0xF2, 0xDE, 0xC2, 0xBD, 0x83, 0xDA, + 0x29, 0xC7, 0xBE, 0xD6, 0x4D, 0xCA, 0x73, 0xCD, 0x5A, 0xB7, 0xF3, 0xCF, + 0x70, 0xA7, 0x36, 0xE0, 0x8C, 0xAF, 0x9C, 0xEC, 0xF8, 0xBD, 0x3E, 0xE6, + 0x9F, 0xC6, 0xFB, 0xD8, 0x4A, 0xC6, 0x2A, 0xDB, 0x8B, 0xB9, 0x2E, 0xDE, + 0x12, 0xB6, 0x46, 0xE5, 0xD2, 0xC0, 0x3F, 0xED, 0xA8, 0xC7, 0x2C, 0xE5, + 0xF2, 0xD5, 0xF6, 0xE5, 0x6C, 0xDD, 0xAF, 0xE7, 0xCB, 0xD6, 0x3F, 0xE4, + 0x78, 0xDD, 0xC8, 0xE6, 0x86, 0xE5, 0x05, 0xE1, 0x4E, 0xE2, 0x25, 0xDF, + 0x1D, 0xDA, 0x72, 0xEA, 0xA6, 0xD4, 0x3D, 0xEF, 0x0F, 0xD7, 0xC0, 0xE7, + 0xBF, 0xE5, 0x22, 0xE1, 0xD5, 0xF2, 0x2F, 0xDC, 0x17, 0xEA, 0x33, 0xD8, + 0x78, 0xE3, 0xF3, 0xD9, 0x6C, 0xE5, 0xE5, 0xDF, 0xA1, 0xE2, 0x50, 0xEB, + 0x1C, 0xEA, 0xCB, 0xF3, 0xA1, 0xE8, 0x0A, 0xEA, 0xBC, 0xE7, 0x24, 0xE9, + 0xF8, 0x01, 0x8E, 0xF6, 0xB6, 0x12, 0xFB, 0xED, 0x84, 0x13, 0x4B, 0xE6, + 0x76, 0x13, 0xE2, 0xE6, 0xF3, 0x0F, 0x61, 0xE9, 0x98, 0x0F, 0x28, 0xFC, + 0xC6, 0x1A, 0x2A, 0x06, 0x40, 0x24, 0xA9, 0x03, 0x7A, 0x21, 0x86, 0x09, + 0x43, 0x1E, 0x83, 0x0F, 0xB1, 0x1A, 0x29, 0x13, 0x43, 0x14, 0xFB, 0x18, + 0x8B, 0x14, 0xF7, 0x18, 0x20, 0x1B, 0x7D, 0x15, 0x73, 0x23, 0xF5, 0x1A, + 0x92, 0x30, 0x9D, 0x22, 0x1E, 0x36, 0x2D, 0x1E, 0x35, 0x2E, 0xFC, 0x13, + 0x5E, 0x23, 0x19, 0x14, 0xA3, 0x1D, 0x4D, 0x1D, 0xCE, 0x16, 0xEB, 0x1A, + 0x4A, 0x1B, 0xD4, 0x20, 0xFD, 0x28, 0x70, 0x29, 0x66, 0x27, 0x5F, 0x25, + 0xEB, 0x1F, 0x83, 0x2E, 0x66, 0x1A, 0x6B, 0x2E, 0xBE, 0x22, 0x46, 0x1D, + 0x70, 0x2B, 0x5B, 0x08, 0x1A, 0x29, 0xD5, 0x04, 0xCB, 0x24, 0x3C, 0x10, + 0x28, 0x2A, 0xF2, 0x19, 0x85, 0x40, 0xE3, 0x24, 0xDD, 0x4D, 0x8E, 0x29, + 0xE4, 0x47, 0x9F, 0x2E, 0x64, 0x2F, 0x1D, 0x2E, 0xE5, 0x16, 0x62, 0x29, + 0xDC, 0x1F, 0x0A, 0x21, 0xFF, 0x34, 0x34, 0x14, 0x91, 0x41, 0x68, 0x1C, + 0x2C, 0x45, 0xCC, 0x29, 0xCF, 0x43, 0x1C, 0x31, 0x38, 0x47, 0xC5, 0x36, + 0xA0, 0x40, 0x02, 0x2C, 0xF7, 0x3A, 0x1C, 0x28, 0x75, 0x37, 0x0F, 0x2C, + 0x93, 0x34, 0xB0, 0x26, 0x89, 0x39, 0x0F, 0x24, 0xDF, 0x38, 0x47, 0x2A, + 0x01, 0x3B, 0x9F, 0x31, 0x96, 0x37, 0x2F, 0x33, 0xD4, 0x2D, 0x7E, 0x2C, + 0x2E, 0x29, 0x50, 0x1C, 0x81, 0x28, 0x15, 0x16, 0xDD, 0x24, 0x0B, 0x18, + 0x6D, 0x1B, 0x64, 0x21, 0x46, 0x16, 0x80, 0x2E, 0x66, 0x1A, 0x00, 0x28, + 0x53, 0x18, 0xDC, 0x19, 0xF1, 0x08, 0xFD, 0x13, 0x15, 0x05, 0x50, 0x09, + 0x78, 0x0B, 0x7A, 0xF7, 0xBA, 0x06, 0x34, 0xF1, 0x34, 0xFA, 0x0B, 0xFB, + 0x94, 0xED, 0x53, 0x0B, 0x6C, 0xEE, 0x9E, 0x12, 0x99, 0xED, 0x7A, 0x03, + 0x06, 0xE6, 0x81, 0xF6, 0x53, 0xE1, 0x5F, 0xFB, 0xFD, 0xD1, 0xB8, 0xF9, + 0x4A, 0xD3, 0x63, 0xF7, 0x09, 0xE2, 0xD5, 0xFA, 0xD9, 0xE3, 0x55, 0xF7, + 0xA5, 0xDF, 0x6C, 0xF6, 0xB2, 0xD4, 0x1B, 0xF3, 0x62, 0xD4, 0x08, 0xE7, + 0x8E, 0xE1, 0xCE, 0xDD, 0x1C, 0xDB, 0xE2, 0xD6, 0x65, 0xC4, 0xEF, 0xE2, + 0x91, 0xBF, 0x49, 0xF7, 0x8C, 0xC4, 0xC2, 0xFA, 0x88, 0xB8, 0xEF, 0xFB, + 0xC2, 0xB2, 0xB0, 0x02, 0x8D, 0xC2, 0x77, 0x06, 0xED, 0xD0, 0xFF, 0xF7, + 0x71, 0xDC, 0xAF, 0xEB, 0x0D, 0xD7, 0xD1, 0xED, 0x92, 0xC3, 0xE9, 0xF8, + 0xAC, 0xBF, 0x4C, 0x0B, 0xF6, 0xC5, 0x2B, 0x0D, 0xA3, 0xD7, 0xBE, 0x04, + 0x0C, 0xE5, 0x73, 0xFB, 0x84, 0xDA, 0xD4, 0xF6, 0x3C, 0xD1, 0x82, 0xFA, + 0x67, 0xCE, 0x46, 0xF9, 0x85, 0xD5, 0x45, 0xFE, 0x2A, 0xE3, 0x35, 0xFE, + 0xD6, 0xE7, 0x3B, 0xF6, 0xE2, 0xF6, 0x2D, 0xFB, 0x84, 0x03, 0xAD, 0xF6, + 0x8D, 0x09, 0xEB, 0xF1, 0x84, 0x10, 0xC7, 0xF1, 0xD3, 0x0A, 0xC1, 0xE9, + 0x7A, 0xF7, 0xFE, 0xEF, 0xC0, 0xEC, 0xF2, 0xFE, 0x94, 0x00, 0x45, 0x03, + 0x89, 0x14, 0xE8, 0xFB, 0xB1, 0x15, 0x5B, 0xF1, 0xE0, 0x19, 0x5F, 0xF6, + 0xAC, 0x20, 0xCA, 0xFF, 0x4E, 0x1F, 0xD8, 0x01, 0x5C, 0x16, 0x06, 0x0A, + 0xC3, 0x0A, 0x9A, 0x10, 0x50, 0x05, 0x65, 0x14, 0x0C, 0x0F, 0x16, 0x1A, + 0x7A, 0x1E, 0x82, 0x17, 0xE5, 0x2A, 0x59, 0x09, 0x91, 0x32, 0x62, 0xFF, + 0x9E, 0x30, 0xE9, 0x03, 0xE6, 0x29, 0x35, 0x0A, 0x5D, 0x28, 0x68, 0x10, + 0x23, 0x35, 0x21, 0x11, 0x82, 0x3E, 0xAE, 0x0C, 0x27, 0x3D, 0xB6, 0x0D, + 0x7A, 0x44, 0xD6, 0x0E, 0x7A, 0x3F, 0xB6, 0x0E, 0x5A, 0x2C, 0x42, 0x13, + 0xAE, 0x24, 0xEA, 0x18, 0xDA, 0x2D, 0x3F, 0x20, 0x7C, 0x3A, 0xBC, 0x26, + 0x11, 0x3F, 0xA7, 0x23, 0xD0, 0x45, 0x51, 0x1F, 0x4C, 0x4F, 0x54, 0x1B, + 0xC2, 0x42, 0x42, 0x11, 0xDE, 0x2B, 0x57, 0x1B, 0xD2, 0x22, 0xB2, 0x24, + 0x33, 0x1C, 0x73, 0x1F, 0x40, 0x1D, 0x18, 0x2C, 0xBC, 0x1E, 0xFC, 0x36, + 0xE8, 0x19, 0xAF, 0x36, 0x34, 0x21, 0xC7, 0x2A, 0xC1, 0x27, 0xB9, 0x1C, + 0x75, 0x1C, 0x7E, 0x19, 0xE3, 0x06, 0x31, 0x13, 0xF3, 0xFC, 0x24, 0x12, + 0x8E, 0x06, 0x18, 0x14, 0xB7, 0x1D, 0xED, 0x14, 0x3A, 0x33, 0x49, 0x19, + 0x48, 0x2A, 0x44, 0x21, 0x6C, 0x18, 0xF1, 0x25, 0x11, 0x0D, 0x46, 0x1E, + 0xE6, 0xFB, 0x4A, 0x17, 0x79, 0xFF, 0xE0, 0x11, 0xF4, 0x0D, 0x4A, 0x0B, + 0xAD, 0x19, 0x38, 0x14, 0xA2, 0x24, 0xE6, 0x1B, 0xC9, 0x2A, 0x4A, 0x1D, + 0x1D, 0x31, 0x0C, 0x23, 0xE3, 0x28, 0xE3, 0x22, 0xA9, 0x19, 0x08, 0x24, + 0x6C, 0x1B, 0x30, 0x27, 0x80, 0x21, 0xF4, 0x23, 0x06, 0x1B, 0x0A, 0x29, + 0x1D, 0x1D, 0xE8, 0x39, 0x7A, 0x27, 0xE2, 0x3D, 0xA7, 0x1F, 0xAD, 0x2F, + 0x22, 0x13, 0xD8, 0x24, 0xF4, 0x0E, 0xED, 0x20, 0x15, 0x03, 0x01, 0x1C, + 0x08, 0xFD, 0x96, 0x22, 0x38, 0xFB, 0x6B, 0x26, 0xDB, 0xEF, 0xE5, 0x23, + 0x30, 0xF0, 0x5D, 0x2A, 0x89, 0xF8, 0xD9, 0x1C, 0xB9, 0xFD, 0xFE, 0xFC, + 0xC9, 0xF6, 0xEB, 0xE9, 0x9C, 0xEB, 0xE3, 0xE9, 0xE8, 0xE5, 0x3E, 0xEE, + 0x07, 0xDE, 0xCD, 0xF5, 0x1C, 0xE8, 0x90, 0xF8, 0x45, 0xF0, 0x82, 0xEC, + 0x05, 0xE3, 0x43, 0xF0, 0x3D, 0xE2, 0x88, 0xFC, 0xF8, 0xE5, 0xEA, 0xEF, + 0x08, 0xE2, 0x46, 0xE2, 0xAF, 0xDB, 0xF6, 0xED, 0x25, 0xD9, 0x31, 0xFB, + 0x91, 0xD8, 0xE6, 0xF7, 0x48, 0xD4, 0xF9, 0xF2, 0x5E, 0xD7, 0x50, 0xEC, + 0xED, 0xDA, 0xB9, 0xE1, 0x8C, 0xDF, 0x7C, 0xDB, 0xDE, 0xDC, 0x2B, 0xD5, + 0xA1, 0xD7, 0xDE, 0xD8, 0xAA, 0xD0, 0xF9, 0xE1, 0xF8, 0xB9, 0x56, 0xEC, + 0x89, 0xB0, 0xBD, 0xF6, 0x12, 0xBB, 0x8E, 0xF1, 0x5D, 0xCC, 0xCD, 0xDD, + 0x3C, 0xD9, 0x92, 0xC9, 0x3E, 0xD2, 0xC7, 0xC8, 0x56, 0xC5, 0x53, 0xD8, + 0x55, 0xC9, 0x33, 0xDF, 0x50, 0xD1, 0x34, 0xD9, 0x58, 0xD2, 0xD2, 0xD7, + 0xC6, 0xDA, 0x95, 0xD8, 0xD4, 0xD8, 0xDC, 0xD1, 0xC9, 0xCC, 0x72, 0xCD, + 0x45, 0xD2, 0x58, 0xD0, 0xE8, 0xDD, 0xF3, 0xD3, 0xC6, 0xDB, 0x2B, 0xD0, + 0x73, 0xD4, 0xD4, 0xD9, 0x17, 0xDE, 0x87, 0xE4, 0xE4, 0xF8, 0x64, 0xDD, + 0x47, 0x07, 0x6C, 0xDC, 0x1F, 0x00, 0x85, 0xDB, 0x57, 0xF8, 0xBD, 0xD3, + 0xB3, 0xF5, 0x3E, 0xD9, 0xAD, 0xEF, 0xB9, 0xE5, 0x52, 0xF4, 0x10, 0xE7, + 0x34, 0x00, 0x60, 0xE4, 0x0F, 0x08, 0x58, 0xE3, 0xE9, 0x0F, 0x16, 0xDD, + 0x8A, 0x12, 0xF8, 0xDE, 0xAD, 0x11, 0x02, 0xDF, 0xA0, 0x09, 0x48, 0xD5, + 0xBA, 0xF7, 0x2D, 0xDF, 0xF6, 0xEC, 0x10, 0xEF, 0xE5, 0xF9, 0xC2, 0xF0, + 0x85, 0x0D, 0xF0, 0xE5, 0xFE, 0x0C, 0x9F, 0xCC, 0xB6, 0x0F, 0x84, 0xCE, + 0x25, 0x10, 0xB7, 0xE0, 0xA0, 0x06, 0x07, 0xDD, 0xDB, 0x07, 0x51, 0xDB, + 0xFA, 0x0F, 0x96, 0xDD, 0x41, 0x17, 0xB2, 0xDC, 0x7C, 0x16, 0xA5, 0xE3, + 0x9F, 0x0F, 0xE9, 0xE7, 0x75, 0x0C, 0xC6, 0xE2, 0x9B, 0x02, 0x1F, 0xE3, + 0x4A, 0xF3, 0x7A, 0xEE, 0xDB, 0xEB, 0x56, 0xF2, 0x65, 0xF3, 0x7A, 0xF2, + 0x2E, 0x07, 0xD9, 0xF1, 0xB3, 0x0C, 0xB6, 0xEC, 0x84, 0x06, 0xB5, 0xFA, + 0xF8, 0x03, 0x22, 0xFF, 0x4A, 0xFA, 0x4A, 0xED, 0x9D, 0xF2, 0xC9, 0xE6, + 0x84, 0xF0, 0x3B, 0xEF, 0x35, 0xE9, 0x11, 0x02, 0xEF, 0xDF, 0x43, 0x09, + 0xD3, 0xE9, 0x68, 0x06, 0xB2, 0xFE, 0xC9, 0x05, 0xE2, 0xFF, 0x37, 0x05, + 0xCA, 0xEA, 0xF0, 0xFB, 0x20, 0xD5, 0x4A, 0xF0, 0xE9, 0xD0, 0xDC, 0xEE, + 0x50, 0xCF, 0xAD, 0xE3, 0x81, 0xD5, 0x0C, 0xE6, 0x09, 0xF6, 0x96, 0xFE, + 0xCA, 0x00, 0x50, 0x03, 0x89, 0xF0, 0x82, 0x07, 0x94, 0xE7, 0x77, 0x0B, + 0xA1, 0xE3, 0x25, 0x07, 0x50, 0xDB, 0xA9, 0x08, 0xE4, 0xDA, 0xD2, 0x0B, + 0x69, 0xE9, 0x4B, 0x09, 0xC7, 0xF1, 0x1F, 0x04, 0x29, 0x01, 0x70, 0x13, + 0x75, 0x08, 0x93, 0x1A, 0x66, 0xFF, 0xF8, 0x18, 0x4D, 0xFF, 0x18, 0x24, + 0xA6, 0x01, 0x1C, 0x1E, 0x9F, 0x06, 0x9B, 0x19, 0xCF, 0x08, 0x0F, 0x24, + 0xF8, 0x0F, 0xFB, 0x26, 0x17, 0x1E, 0x18, 0x29, 0x49, 0x1B, 0xBA, 0x2A, + 0xBF, 0x16, 0xD4, 0x25, 0x5E, 0x1B, 0x72, 0x22, 0xD8, 0x1A, 0x1C, 0x1F, + 0x10, 0x18, 0x50, 0x20, 0x62, 0x14, 0x0A, 0x2B, 0x41, 0x09, 0xEF, 0x32, + 0x42, 0x0B, 0x85, 0x33, 0x91, 0x1E, 0xCE, 0x28, 0x9E, 0x21, 0xE4, 0x12, + 0xC8, 0x1A, 0x88, 0x0C, 0x4C, 0x0F, 0xA5, 0x0F, 0x28, 0x06, 0x3F, 0x0C, + 0x1C, 0x0F, 0x7B, 0x07, 0x08, 0x19, 0x2F, 0x06, 0xFB, 0x15, 0x54, 0x0D, + 0x38, 0x0A, 0xAF, 0x10, 0x50, 0x0B, 0x41, 0x0E, 0xE7, 0x0F, 0x18, 0x06, + 0xFC, 0x02, 0x6F, 0xFC, 0xE6, 0xF1, 0x03, 0x00, 0xDA, 0xF0, 0x35, 0x06, + 0x94, 0xFE, 0xCF, 0x04, 0xCE, 0xFF, 0x94, 0xFB, 0xC7, 0xF7, 0x72, 0xEF, + 0x1F, 0xFC, 0xBC, 0xEE, 0xA7, 0x05, 0xB4, 0xE7, 0x1E, 0x10, 0x2A, 0xDA, + 0x48, 0x02, 0x8A, 0xD0, 0x37, 0xE7, 0x22, 0xD5, 0x2B, 0xDD, 0x9F, 0xED, + 0xED, 0xD9, 0xA2, 0xF4, 0x9A, 0xE7, 0x33, 0xEF, 0x44, 0xF6, 0x3A, 0xED, + 0x30, 0xF8, 0xE5, 0xE3, 0xF0, 0xF3, 0xB7, 0xE1, 0xF5, 0xE7, 0xB0, 0xEB, + 0xB5, 0xEB, 0xE3, 0xEF, 0x8D, 0xFB, 0xEB, 0xF0, 0xBE, 0xFA, 0x11, 0xF5, + 0x5C, 0xF7, 0x0D, 0xF7, 0xBE, 0xF7, 0x97, 0xF3, 0x64, 0xF4, 0x53, 0xF0, + 0x3C, 0xF2, 0x0A, 0xE8, 0x0A, 0xF3, 0xBE, 0xE5, 0x56, 0xED, 0x1F, 0xF0, + 0x7B, 0xE5, 0x97, 0xF3, 0x08, 0xF2, 0x7B, 0xF3, 0x7C, 0x06, 0x99, 0xEA, + 0x98, 0x13, 0xB9, 0xDD, 0xE5, 0x13, 0xD8, 0xD9, 0x81, 0x0B, 0x99, 0xD8, + 0xDB, 0x08, 0x9A, 0xDC, 0xA0, 0x01, 0xD7, 0xDF, 0xE2, 0xF5, 0xD1, 0xDF, + 0x9A, 0xF1, 0x2E, 0xE0, 0x46, 0xFA, 0xD3, 0xE1, 0x81, 0x09, 0x62, 0xDE, + 0x75, 0x0D, 0xEB, 0xD1, 0xC9, 0x09, 0x0E, 0xCD, 0xA0, 0x03, 0x7A, 0xCF, + 0xA3, 0xF7, 0xFC, 0xE2, 0x91, 0xE3, 0x51, 0xF8, 0x69, 0xE2, 0x2D, 0xF1, + 0x93, 0xF4, 0x3A, 0xE6, 0xAC, 0xF8, 0xB6, 0xE0, 0x52, 0x01, 0xC4, 0xDE, + 0x4F, 0xFE, 0x6F, 0xE0, 0x27, 0xF3, 0x4B, 0xE5, 0x50, 0xF6, 0xC8, 0xE6, + 0xDE, 0xF3, 0x59, 0xE8, 0xC2, 0xF0, 0xBE, 0xEB, 0x40, 0xFC, 0x95, 0xEE, + 0x5F, 0x05, 0xAD, 0xEB, 0xA3, 0x0B, 0x6F, 0xF1, 0x00, 0x06, 0x42, 0x01, + 0x7B, 0xEA, 0x6F, 0xFE, 0x80, 0xE1, 0x24, 0xFA, 0x54, 0xEF, 0x92, 0xF8, + 0x25, 0xFE, 0xA7, 0xFF, 0xA4, 0x00, 0x7D, 0x0C, 0x0F, 0x00, 0x7B, 0x0D, + 0xBD, 0x02, 0xDC, 0x01, 0x0F, 0x09, 0x73, 0xF9, 0x93, 0xFD, 0xDD, 0xFD, + 0x8F, 0xE4, 0x83, 0x0E, 0x72, 0xDE, 0x7D, 0x1B, 0x9E, 0xE5, 0x75, 0x1A, + 0x5D, 0xEC, 0xF7, 0x19, 0x78, 0xF3, 0x85, 0x23, 0x1B, 0xFE, 0x06, 0x2C, + 0xDD, 0xF8, 0x6C, 0x25, 0x12, 0xE9, 0x43, 0x20, 0x6B, 0xDB, 0x70, 0x17, + 0x25, 0xDD, 0x29, 0x13, 0x59, 0xE4, 0x25, 0x13, 0xA7, 0xE9, 0xAC, 0x13, + 0xB1, 0xFB, 0x99, 0x1E, 0x89, 0x0C, 0x09, 0x25, 0x64, 0x0B, 0x54, 0x26, + 0x91, 0xFD, 0x02, 0x2B, 0xF2, 0xFA, 0xD7, 0x2B, 0xEE, 0xFC, 0x93, 0x1F, + 0x36, 0xFD, 0xDC, 0x1A, 0xDC, 0x04, 0x3C, 0x1D, 0x51, 0x1A, 0x69, 0x20, + 0x70, 0x2C, 0x3E, 0x23, 0xE2, 0x33, 0x8E, 0x30, 0x0F, 0x37, 0x6D, 0x41, + 0xC5, 0x33, 0xFD, 0x3C, 0xB8, 0x31, 0xD8, 0x36, 0x68, 0x38, 0xCB, 0x3C, + 0x0D, 0x41, 0xEE, 0x43, 0x0E, 0x45, 0x94, 0x48, 0xBA, 0x44, 0x06, 0x51, + 0x37, 0x48, 0x8B, 0x58, 0x67, 0x49, 0x98, 0x49, 0x2D, 0x4A, 0x32, 0x40, + 0xB0, 0x42, 0x2A, 0x43, 0xDA, 0x30, 0x5C, 0x45, 0x0C, 0x31, 0xB3, 0x4F, + 0x0A, 0x3D, 0x8B, 0x4A, 0x5C, 0x46, 0xE9, 0x3F, 0x98, 0x3A, 0xF0, 0x37, + 0xEC, 0x2E, 0x53, 0x30, 0x34, 0x32, 0x90, 0x27, 0x70, 0x33, 0xC7, 0x1A, + 0xBC, 0x37, 0x90, 0x10, 0x0F, 0x34, 0x6B, 0x0B, 0x9E, 0x2B, 0xF4, 0x0D, + 0x64, 0x30, 0x4B, 0x15, 0x8F, 0x36, 0xE3, 0x1D, 0xC4, 0x2E, 0x66, 0x16, + 0x59, 0x1D, 0x27, 0x08, 0x46, 0x1A, 0x66, 0x0B, 0x47, 0x25, 0x72, 0x0D, + 0x42, 0x24, 0x97, 0x03, 0x72, 0x18, 0xBE, 0x08, 0x2A, 0x0D, 0x50, 0x14, + 0xE3, 0x16, 0x35, 0x12, 0xA6, 0x2C, 0x49, 0x06, 0x96, 0x2E, 0x53, 0xF7, + 0xAB, 0x20, 0x82, 0xF5, 0xFB, 0x0A, 0x89, 0xFA, 0xE8, 0xF8, 0x20, 0x03, + 0xFE, 0xF0, 0x78, 0x08, 0xEE, 0xF6, 0x98, 0x00, 0x71, 0xFC, 0x45, 0xF9, + 0x05, 0xF8, 0x1F, 0xF4, 0x25, 0xF2, 0x96, 0xEE, 0xE3, 0xF0, 0xE5, 0xED, + 0xCB, 0xF3, 0x24, 0xE8, 0x31, 0xF2, 0xF2, 0xE3, 0x20, 0xEF, 0x94, 0xEC, + 0xDC, 0xF0, 0xB3, 0xF8, 0x38, 0xF3, 0x0C, 0xF1, 0xDA, 0xF7, 0x02, 0xE5, + 0x61, 0xF8, 0x11, 0xE6, 0x37, 0xEE, 0xC1, 0xDF, 0xA0, 0xE8, 0xE9, 0xE2, + 0x3A, 0xE9, 0xDA, 0xE6, 0x58, 0xEF, 0xD9, 0xE3, 0x89, 0xF2, 0xF3, 0xED, + 0xB3, 0xF0, 0x28, 0xEC, 0x05, 0xFD, 0x6A, 0xE6, 0x50, 0xFE, 0xC0, 0xE3, + 0x94, 0xFD, 0x9F, 0xE0, 0xC8, 0xFC, 0x31, 0xDC, 0x9B, 0xE8, 0xF6, 0xD8, + 0x13, 0xE5, 0x8B, 0xEE, 0x1D, 0xE3, 0x59, 0xF9, 0x43, 0xE8, 0x52, 0xED, + 0xDF, 0xFA, 0x23, 0xE1, 0xF2, 0xFA, 0x04, 0xD7, 0xFA, 0xF1, 0x69, 0xDB, + 0xAF, 0xE3, 0x03, 0xE8, 0x34, 0xD6, 0xA8, 0xEE, 0xF5, 0xD2, 0x43, 0xF3, + 0x35, 0xDA, 0xCF, 0xF7, 0x67, 0xDE, 0x48, 0xF4, 0xC9, 0xE1, 0x80, 0xED, + 0x69, 0xF0, 0x49, 0xEA, 0xB1, 0xF0, 0xB6, 0xE5, 0xA3, 0xEC, 0xF5, 0xEC, + 0xB7, 0xE8, 0xF3, 0xF7, 0xF5, 0xDF, 0x3A, 0xED, 0x2A, 0xF5, 0x4F, 0xE8, + 0x1F, 0x06, 0x6F, 0xEE, 0xB8, 0xFC, 0x48, 0xF7, 0xBF, 0xF1, 0x6B, 0x09, + 0xC4, 0xED, 0xEA, 0x09, 0xBB, 0xEC, 0x9A, 0xF5, 0x0A, 0xE9, 0x3B, 0xFA, + 0x04, 0xE3, 0xD3, 0x14, 0x3A, 0xE5, 0x4C, 0x20, 0x7E, 0xF2, 0x88, 0x16, + 0xC1, 0xFD, 0xE3, 0x0B, 0xED, 0x05, 0x23, 0x0E, 0x81, 0xFB, 0x37, 0x0E, + 0x2D, 0xEB, 0xDF, 0x1A, 0x3F, 0xE2, 0x7F, 0x26, 0x84, 0xDF, 0x03, 0x1D, + 0xBB, 0xF0, 0x3A, 0x1D, 0x62, 0xFC, 0x37, 0x26, 0xCD, 0xFA, 0x5C, 0x2B, + 0xCD, 0x01, 0xE9, 0x2B, 0x2E, 0x04, 0x22, 0x27, 0x69, 0xF2, 0x30, 0x1F, + 0x67, 0xEA, 0x3C, 0x18, 0xAA, 0xF8, 0x7B, 0x10, 0xD7, 0x04, 0x3E, 0x08, + 0x6A, 0x10, 0xD1, 0x0E, 0x75, 0x1D, 0xC6, 0x1B, 0x99, 0x27, 0x33, 0x1F, + 0x05, 0x2F, 0x43, 0x2F, 0xF8, 0x19, 0xA0, 0x2F, 0x6D, 0x0E, 0x7B, 0x24, + 0x40, 0x12, 0x9B, 0x23, 0x80, 0x0E, 0x39, 0x1F, 0xCC, 0x1F, 0xCC, 0x1F, + 0x7C, 0x2C, 0xDD, 0x1A, 0xB7, 0x30, 0x55, 0x24, 0xE5, 0x34, 0xE6, 0x2F, + 0x92, 0x39, 0x47, 0x31, 0xE0, 0x38, 0x57, 0x2B, 0x02, 0x38, 0x47, 0x1D, + 0x6E, 0x3D, 0xBF, 0x28, 0x37, 0x36, 0xD0, 0x34, 0x39, 0x3C, 0x34, 0x32, + 0x0F, 0x50, 0x5D, 0x31, 0x76, 0x4F, 0xB6, 0x24, 0x91, 0x4A, 0xC2, 0x28, + 0x4B, 0x3B, 0x8D, 0x30, 0x89, 0x2F, 0xDF, 0x2C, 0xC7, 0x37, 0xF1, 0x28, + 0xE5, 0x3D, 0x3C, 0x25, 0x50, 0x38, 0xF8, 0x26, 0x90, 0x2C, 0x3C, 0x1F, + 0xB7, 0x32, 0x1D, 0x1D, 0x23, 0x38, 0xB6, 0x1B, 0x67, 0x2C, 0x70, 0x0D, + 0xB4, 0x27, 0xF2, 0x07, 0x89, 0x26, 0x95, 0x05, 0x19, 0x28, 0x3B, 0x00, + 0x1A, 0x23, 0x3C, 0xFB, 0x11, 0x11, 0x78, 0x00, 0xB2, 0x0D, 0x1E, 0x0E, + 0x35, 0x10, 0x7F, 0x09, 0x3E, 0x0E, 0x54, 0xFC, 0x00, 0x13, 0x21, 0xFC, + 0xE8, 0x0B, 0x37, 0xF9, 0x8C, 0xF5, 0xCD, 0xF6, 0xDE, 0xEA, 0x15, 0xFF, + 0x6F, 0xF6, 0x57, 0xF7, 0x94, 0x05, 0x82, 0xDF, 0xEA, 0x09, 0xEE, 0xD2, + 0x72, 0xF9, 0xAD, 0xD2, 0x35, 0xE5, 0xF3, 0xDB, 0x8E, 0xDC, 0xD0, 0xD5, + 0xEB, 0xE6, 0xD5, 0xD8, 0x95, 0xE5, 0xE7, 0xDB, 0xC4, 0xD1, 0x1F, 0xCE, + 0x0B, 0xD0, 0x04, 0xD7, 0x73, 0xC2, 0xCE, 0xC6, 0x2C, 0xB6, 0x82, 0xA8, + 0x38, 0xBE, 0x8B, 0xAE, 0xDF, 0xBD, 0x9E, 0xC0, 0x76, 0xBB, 0xE3, 0xC7, + 0xF9, 0xC8, 0xEC, 0xCE, 0x1B, 0xD1, 0xA1, 0xCE, 0xF3, 0xC7, 0x59, 0xC5, + 0xC5, 0xBE, 0xFB, 0xC6, 0xCF, 0xBF, 0x1C, 0xCB, 0x43, 0xBE, 0x2F, 0xCC, + 0x2A, 0xB9, 0xB4, 0xD1, 0x7A, 0xBD, 0xC4, 0xD4, 0x7F, 0xC7, 0x0D, 0xDB, + 0x65, 0xCC, 0x95, 0xDE, 0x6A, 0xDA, 0xAF, 0xE3, 0xDE, 0xD6, 0x60, 0xD2, + 0xA0, 0xDE, 0x18, 0xCD, 0xFE, 0x01, 0xD4, 0xED, 0x44, 0xE3, 0xD3, 0xDE, + 0xD7, 0xD3, 0x1D, 0xE7, 0x8F, 0xFD, 0x16, 0x16, 0x48, 0xF2, 0x04, 0xF8, + 0xE3, 0xD2, 0x57, 0xC2, 0xD3, 0xDD, 0x4E, 0xC9, 0xC6, 0xEC, 0x2E, 0xE3, + 0x2C, 0xF4, 0x85, 0xF1, 0x8E, 0x04, 0x4A, 0x0F, 0xDA, 0xFD, 0x37, 0x23, + 0x79, 0xE6, 0x02, 0x1D, 0xB8, 0xF0, 0xC6, 0x20, 0x39, 0xF4, 0xF4, 0x08, + 0x87, 0xF7, 0xC2, 0xF7, 0x40, 0x04, 0xBD, 0x0C, 0xD6, 0xEB, 0x1E, 0x03, + 0x52, 0xF7, 0x9F, 0x0C, 0x71, 0x11, 0xCF, 0x16, 0xD8, 0xFB, 0xAF, 0xFA, + 0xAD, 0xF7, 0xC6, 0x05, 0xF7, 0x0F, 0xD9, 0x2A, 0x6A, 0x13, 0xB1, 0x25, + 0x05, 0xFE, 0x06, 0xFD, 0xBA, 0xF5, 0x05, 0xF0, 0x1A, 0xF0, 0xF5, 0xF9, + 0xA9, 0xE6, 0x0A, 0x01, 0x10, 0xE9, 0x97, 0x01, 0xB2, 0xF9, 0xC5, 0xFF, + 0x7A, 0x09, 0x16, 0xFD, 0xB5, 0x08, 0x59, 0xED, 0x7E, 0x04, 0xDE, 0xEC, + 0x64, 0xED, 0xF2, 0xE6, 0xA9, 0xEF, 0x57, 0xF5, 0x10, 0x01, 0xAC, 0x17, + 0x6E, 0xF3, 0xBD, 0x0C, 0xF3, 0xEF, 0xAB, 0xFE, 0x1A, 0xFC, 0xD3, 0x0B, + 0xD0, 0xF7, 0xD4, 0x09, 0xEA, 0xED, 0x8F, 0x01, 0x0A, 0xEC, 0xAE, 0x07, + 0x3B, 0xE6, 0x88, 0xFD, 0xEA, 0xDE, 0xF3, 0xDF, 0x2B, 0xE2, 0xFD, 0xDD, + 0x28, 0xF3, 0xC0, 0xEC, 0xCD, 0xFD, 0xF2, 0xE4, 0x24, 0xF7, 0x9A, 0xD7, + 0xFE, 0xEC, 0xB1, 0xD2, 0x7A, 0xED, 0xFA, 0xE3, 0x4F, 0xE9, 0x71, 0xEC, + 0x40, 0xE8, 0x44, 0xE1, 0x54, 0xFE, 0xB9, 0xE5, 0x72, 0x08, 0x35, 0xE9, + 0x4B, 0x05, 0x3B, 0xEB, 0x4D, 0xFD, 0x8D, 0xDD, 0x73, 0xFA, 0xF6, 0xD0, + 0x57, 0x05, 0x26, 0xD4, 0x57, 0x0B, 0xF4, 0xD4, 0x0D, 0x14, 0x87, 0xEB, + 0x26, 0x06, 0xC3, 0xF1, 0xCC, 0xFD, 0x34, 0xE9, 0x74, 0x0E, 0x65, 0xE4, + 0x9C, 0x19, 0xE9, 0xEF, 0xA3, 0x17, 0x64, 0x06, 0x66, 0x09, 0x22, 0x0A, + 0xB9, 0x16, 0xD6, 0x15, 0x18, 0x2D, 0x44, 0x11, 0xC4, 0x28, 0xF1, 0x05, + 0x4F, 0x19, 0x19, 0x08, 0x3B, 0x16, 0xCA, 0x05, 0xE7, 0x18, 0xB2, 0x04, + 0x21, 0x09, 0x02, 0x00, 0x65, 0xFA, 0xD6, 0xF9, 0x82, 0xF7, 0x34, 0xF0, + 0x12, 0xE8, 0x8F, 0xDC, 0x9F, 0xEC, 0xEF, 0xDA, 0x00, 0xFA, 0x45, 0xDF, + 0x22, 0xF7, 0xD4, 0xE1, 0x77, 0xF2, 0xA9, 0xEA, 0x9D, 0xE9, 0x48, 0xF5, + 0x91, 0xFB, 0x70, 0x03, 0x1A, 0x0F, 0x68, 0xFB, 0x91, 0x07, 0x6E, 0xF2, + 0x38, 0x06, 0x80, 0x0B, 0x24, 0xF8, 0x2F, 0x16, 0x46, 0xF4, 0xC5, 0x09, + 0xEC, 0x0D, 0x64, 0x05, 0xFE, 0x0C, 0x58, 0xF9, 0x35, 0xF9, 0x65, 0xEB, + 0x8E, 0xF5, 0xEC, 0xE7, 0x16, 0xE9, 0xF9, 0xD6, 0x4D, 0xDE, 0x02, 0xCD, + 0xFD, 0xDE, 0x72, 0xD6, 0x3A, 0xCE, 0x01, 0xE0, 0xC9, 0xCD, 0xBD, 0xF9, + 0xE5, 0xD4, 0x03, 0x00, 0xE7, 0xD4, 0x54, 0xF3, 0x16, 0xE1, 0x8B, 0xFA, + 0xEA, 0xE9, 0xA8, 0x07, 0x53, 0xEA, 0xFC, 0x0B, 0x43, 0xFC, 0xC5, 0x19, + 0xB4, 0x06, 0xF8, 0x26, 0x21, 0xF9, 0xF7, 0x1F, 0x02, 0xFC, 0x7C, 0x1A, + 0x3E, 0x00, 0x2B, 0x11, 0xD1, 0xF4, 0x61, 0x03, 0x45, 0xF1, 0x84, 0x00, + 0xF7, 0xF0, 0x73, 0xFA, 0x12, 0xEF, 0x31, 0x01, 0x99, 0xF3, 0x50, 0x1A, + 0x07, 0xF9, 0xBC, 0x1F, 0x32, 0x00, 0x3E, 0x13, 0x35, 0x08, 0x5F, 0x05, + 0xBE, 0x1D, 0x48, 0x12, 0x33, 0x24, 0x12, 0x21, 0xD6, 0x10, 0xDA, 0x1D, + 0x07, 0x0C, 0x07, 0x27, 0xB9, 0x18, 0x5A, 0x32, 0x98, 0x1C, 0xB0, 0x2E, + 0xBD, 0x20, 0x8F, 0x29, 0x82, 0x2C, 0x8C, 0x27, 0xF9, 0x2F, 0x3B, 0x1C, + 0xAF, 0x31, 0x4A, 0x1A, 0x89, 0x28, 0x3B, 0x29, 0x60, 0x17, 0x94, 0x33, + 0x78, 0x16, 0x57, 0x30, 0x56, 0x1F, 0x72, 0x22, 0xDB, 0x1E, 0x85, 0x18, + 0x43, 0x14, 0x46, 0x15, 0x60, 0x0F, 0xD7, 0x1A, 0xDF, 0x0D, 0xA2, 0x14, + 0x23, 0x12, 0x9B, 0x08, 0x9D, 0x10, 0x5B, 0x08, 0xA1, 0x12, 0x02, 0x05, + 0xF3, 0x1A, 0xF2, 0x06, 0x7E, 0x19, 0x45, 0x0C, 0x45, 0x26, 0x12, 0x0B, + 0x83, 0x26, 0xB8, 0x01, 0x90, 0x17, 0xBC, 0xFD, 0xF5, 0x0E, 0x1D, 0x0D, + 0xE4, 0x01, 0x07, 0x1B, 0x81, 0x0A, 0x9D, 0x2A, 0x79, 0x21, 0xA2, 0x3A, + 0x3D, 0x2C, 0x26, 0x36, 0xA5, 0x3C, 0xE3, 0x36, 0x6A, 0x45, 0xE5, 0x30, + 0x9E, 0x3C, 0xBC, 0x27, 0x7E, 0x2B, 0x8B, 0x27, 0x1E, 0x1B, 0xC2, 0x22, + 0x76, 0x23, 0xE3, 0x2A, 0xAF, 0x29, 0xAF, 0x27, 0x34, 0x27, 0xAB, 0x24, + 0x6C, 0x22, 0xD1, 0x24, 0x7C, 0x10, 0x7E, 0x19, 0x55, 0x04, 0xE9, 0x13, + 0x5D, 0x06, 0x27, 0x11, 0xCB, 0x06, 0xFB, 0x15, 0xD1, 0x06, 0x51, 0x1A, + 0x7E, 0x12, 0xEB, 0x14, 0x68, 0x1A, 0xDD, 0x0A, 0x15, 0x19, 0x02, 0x06, + 0xDF, 0x15, 0xEB, 0x0C, 0x4B, 0x00, 0xC8, 0x0E, 0x84, 0xF2, 0xDA, 0x0E, + 0x68, 0x04, 0x02, 0x0D, 0xBE, 0x0D, 0x45, 0x08, 0x73, 0x06, 0xCE, 0x08, + 0x08, 0xFE, 0x19, 0x02, 0x05, 0xF7, 0xCB, 0xF0, 0xD7, 0xF7, 0xC7, 0xD7, + 0x56, 0xF6, 0x52, 0xC1, 0xE7, 0xE8, 0xA6, 0xC5, 0x48, 0xDF, 0x21, 0xDB, + 0x04, 0xD8, 0x24, 0xDA, 0x00, 0xCD, 0x2B, 0xCC, 0x3A, 0xD7, 0x7E, 0xCA, + 0x5A, 0xE7, 0x91, 0xD0, 0x03, 0xE5, 0x5C, 0xCC, 0xF5, 0xE0, 0x20, 0xC2, + 0x41, 0xDB, 0xCD, 0xC9, 0x7F, 0xD6, 0x51, 0xD7, 0xDC, 0xD3, 0x85, 0xD8, + 0x6F, 0xCF, 0x21, 0xDA, 0x46, 0xD4, 0xD2, 0xDA, 0x3F, 0xDC, 0x67, 0xD2, + 0x47, 0xCF, 0xFC, 0xC8, 0x5D, 0xC8, 0xB5, 0xCB, 0xFC, 0xD0, 0xEA, 0xCF, + 0xBD, 0xD1, 0x78, 0xCC, 0x6A, 0xD5, 0x30, 0xC1, 0xCB, 0xDA, 0xE2, 0xB2, + 0x6C, 0xD3, 0x0A, 0xB5, 0xE3, 0xC8, 0xC3, 0xC0, 0xBF, 0xCB, 0x30, 0xC6, + 0x6F, 0xD5, 0x6B, 0xC1, 0x70, 0xD8, 0x0F, 0xB5, 0x02, 0xCF, 0xE3, 0xB9, + 0xD5, 0xBD, 0xC4, 0xD4, 0xC2, 0xC1, 0x24, 0xE3, 0xEA, 0xD4, 0xB2, 0xDA, + 0x3E, 0xDA, 0x7F, 0xDB, 0xB9, 0xD2, 0xAF, 0xDF, 0xDD, 0xD2, 0x07, 0xDD, + 0xF3, 0xE2, 0x1F, 0xE1, 0x4E, 0xEF, 0xA9, 0xE6, 0x54, 0xF2, 0xD3, 0xEA, + 0x9B, 0xED, 0x75, 0xF1, 0x5C, 0xE8, 0x62, 0xF8, 0x82, 0xEC, 0xCE, 0xFA, + 0x0F, 0xF0, 0x0F, 0x01, 0x76, 0xEB, 0xD8, 0xFF, 0xD5, 0xE5, 0x9B, 0xF9, + 0x52, 0xE6, 0x81, 0xFB, 0xF8, 0xF2, 0xB9, 0x03, 0x6B, 0xFE, 0xFB, 0x0A, + 0x6C, 0x04, 0x2C, 0x0E, 0x16, 0xF8, 0xB2, 0x07, 0x5E, 0xEC, 0x82, 0xFF, + 0x1C, 0xF7, 0xAE, 0x08, 0xC6, 0xFE, 0x04, 0x13, 0x3E, 0x06, 0x03, 0x14, + 0x9B, 0x09, 0xCC, 0x1D, 0xB1, 0x02, 0x60, 0x28, 0xAE, 0xFA, 0x66, 0x2B, + 0x58, 0xFB, 0x78, 0x32, 0xA7, 0x11, 0xC4, 0x33, 0xA2, 0x26, 0x7E, 0x2A, + 0x35, 0x2C, 0x30, 0x36, 0x41, 0x38, 0xAE, 0x44, 0xA7, 0x4C, 0xBD, 0x43, + 0xA9, 0x4D, 0x84, 0x4A, 0x0B, 0x45, 0x7D, 0x52, 0x35, 0x4F, 0x65, 0x56, + 0x01, 0x5F, 0x48, 0x4F, 0xE7, 0x5F, 0x9E, 0x42, 0xCB, 0x5F, 0x3B, 0x3E, + 0x42, 0x5E, 0x36, 0x36, 0xEB, 0x4E, 0x7C, 0x2D, 0x92, 0x46, 0x00, 0x34, + 0x58, 0x4C, 0x51, 0x42, 0x52, 0x54, 0x39, 0x48, 0x1B, 0x59, 0xB9, 0x4C, + 0x00, 0x53, 0x24, 0x5B, 0x99, 0x40, 0xD1, 0x5C, 0x90, 0x3D, 0x1F, 0x46, + 0x34, 0x4E, 0x7A, 0x33, 0xE1, 0x54, 0x9D, 0x33, 0x2B, 0x45, 0xE6, 0x3B, + 0xBB, 0x38, 0x42, 0x45, 0x28, 0x47, 0x28, 0x44, 0x94, 0x57, 0xD8, 0x39, + 0x6F, 0x4A, 0xC2, 0x39, 0x9F, 0x3C, 0xE7, 0x3D, 0x59, 0x44, 0xBA, 0x3E, + 0x61, 0x3F, 0xFE, 0x41, 0x80, 0x30, 0x58, 0x43, 0x60, 0x2A, 0x1A, 0x3B, + 0x88, 0x3A, 0x2C, 0x39, 0xC8, 0x4E, 0x3C, 0x3A, 0x7E, 0x48, 0x02, 0x28, + 0x45, 0x30, 0x7D, 0x16, 0xD6, 0x21, 0xF0, 0x1D, 0x48, 0x2C, 0xB3, 0x2C, + 0xC2, 0x2F, 0x3A, 0x2D, 0x4B, 0x25, 0xA6, 0x35, 0x1B, 0x1B, 0xB9, 0x47, + 0x7C, 0x17, 0xC3, 0x46, 0x0E, 0x1F, 0x83, 0x39, 0xB6, 0x18, 0x90, 0x34, + 0xC0, 0x04, 0xC4, 0x3A, 0x20, 0x01, 0x10, 0x3E, 0xA1, 0x08, 0xBC, 0x3A, + 0x06, 0x10, 0x9B, 0x2F, 0x9A, 0x0A, 0xD0, 0x19, 0x4B, 0xF4, 0xA4, 0x0F, + 0xBE, 0xEE, 0x0D, 0x11, 0x65, 0xFF, 0xBC, 0x18, 0xD2, 0x0A, 0x0C, 0x1B, + 0xEE, 0x05, 0xD8, 0x08, 0xD7, 0xF9, 0xAD, 0x04, 0x5E, 0xF0, 0x0A, 0x07, + 0xBA, 0xEE, 0x45, 0xFD, 0x76, 0xEF, 0xBE, 0xF2, 0x76, 0xEB, 0xD5, 0xE1, + 0xFD, 0xEA, 0x4B, 0xDB, 0x79, 0xE7, 0x78, 0xE3, 0x0C, 0xDE, 0x34, 0xE7, + 0xD9, 0xE0, 0x6D, 0xEA, 0xD4, 0xE6, 0xF4, 0xE8, 0x91, 0xE6, 0x68, 0xE7, + 0x7E, 0xED, 0xEC, 0xE3, 0x2D, 0xF4, 0x43, 0xD6, 0xC0, 0xEA, 0xED, 0xD6, + 0x37, 0xE4, 0xEE, 0xD9, 0xC3, 0xE1, 0xD1, 0xD5, 0xD9, 0xC9, 0xCD, 0xDD, + 0xC7, 0xBB, 0x12, 0xE3, 0x84, 0xD2, 0x4B, 0xD3, 0xDB, 0xE7, 0x27, 0xCD, + 0x8F, 0xD8, 0xBC, 0xCB, 0x9F, 0xC0, 0xA7, 0xC2, 0x94, 0xBA, 0x16, 0xC7, + 0x82, 0xBC, 0x30, 0xBE, 0x4E, 0xC8, 0x3F, 0xAD, 0x96, 0xCB, 0x68, 0xB3, + 0xED, 0xB6, 0xFA, 0xBE, 0xA0, 0xB0, 0x41, 0xB6, 0xCA, 0xBA, 0x78, 0xA3, + 0xFC, 0xBB, 0xB6, 0x9D, 0x9C, 0xBA, 0x6C, 0xA4, 0x87, 0xB3, 0xFF, 0xB3, + 0x24, 0xAE, 0xE7, 0xC3, 0xC1, 0xB4, 0xC9, 0xC8, 0xCE, 0xAE, 0x06, 0xCB, + 0xD2, 0xA9, 0x19, 0xD1, 0x00, 0xC4, 0x7E, 0xC7, 0x45, 0xDA, 0x57, 0xB9, + 0xD1, 0xD1, 0x57, 0xB5, 0x86, 0xC1, 0xBF, 0xA9, 0xEB, 0xC4, 0xDE, 0xA4, + 0xFA, 0xCD, 0xA4, 0xB6, 0x73, 0xC3, 0x54, 0xC6, 0x87, 0xBD, 0x08, 0xC2, + 0x03, 0xC7, 0x6B, 0xBC, 0x8F, 0xC7, 0x1B, 0xC3, 0x22, 0xBD, 0xF2, 0xC8, + 0xD0, 0xB6, 0x7A, 0xCD, 0xBA, 0xBC, 0xE8, 0xD1, 0x0B, 0xD2, 0x40, 0xD4, + 0x2E, 0xE4, 0x32, 0xE0, 0x5A, 0xD7, 0x51, 0xE9, 0xB0, 0xC9, 0x20, 0xE8, + 0xBB, 0xE2, 0x85, 0xE4, 0xD9, 0xFC, 0x2E, 0xE3, 0xD1, 0xFA, 0x8E, 0xE5, + 0xA7, 0xF5, 0x51, 0xE4, 0xE3, 0xF7, 0x8E, 0xEA, 0x03, 0x00, 0x2E, 0xF5, + 0xCF, 0x01, 0x43, 0xF8, 0x42, 0xFD, 0x3D, 0xFA, 0x8B, 0x0C, 0x9E, 0xF7, + 0x80, 0x1B, 0xD7, 0xE7, 0xA8, 0x19, 0xB0, 0xD5, 0x73, 0x18, 0x40, 0xD2, + 0x77, 0x11, 0x61, 0xDE, 0x5A, 0x0B, 0xDA, 0xE8, 0xEB, 0x19, 0x7C, 0xEB, + 0x4B, 0x24, 0xA9, 0xF1, 0x3A, 0x1F, 0x36, 0xF5, 0x9D, 0x1C, 0x3A, 0xFC, + 0xC3, 0x1F, 0xB6, 0x0D, 0xBF, 0x27, 0x9B, 0x10, 0x0F, 0x2B, 0x22, 0x12, + 0x13, 0x2D, 0x37, 0x1F, 0x96, 0x34, 0x4F, 0x21, 0x63, 0x3E, 0xFD, 0x22, + 0xAC, 0x44, 0x0C, 0x30, 0xAA, 0x42, 0xE3, 0x36, 0x84, 0x3E, 0x4E, 0x3B, + 0x0E, 0x3D, 0xE6, 0x41, 0xA1, 0x41, 0x35, 0x45, 0x0B, 0x47, 0xB9, 0x48, + 0x7D, 0x4A, 0x8A, 0x3E, 0x99, 0x43, 0x09, 0x32, 0xB4, 0x2E, 0x22, 0x31, + 0x64, 0x24, 0x4C, 0x2E, 0xA9, 0x26, 0x6C, 0x2A, 0x81, 0x2D, 0x25, 0x2E, + 0x74, 0x2C, 0x6C, 0x31, 0xF5, 0x21, 0xB1, 0x37, 0x49, 0x1C, 0xB3, 0x3F, + 0x12, 0x21, 0x65, 0x3D, 0x88, 0x33, 0xA6, 0x37, 0x4F, 0x44, 0x19, 0x2C, + 0xBA, 0x46, 0xE5, 0x28, 0xAD, 0x37, 0x44, 0x34, 0xA6, 0x29, 0xF2, 0x3B, + 0xF0, 0x24, 0x74, 0x4A, 0x56, 0x14, 0x2D, 0x5B, 0x8E, 0x12, 0xD4, 0x54, + 0xA8, 0x27, 0x15, 0x44, 0xBF, 0x36, 0x66, 0x40, 0x46, 0x38, 0x92, 0x40, + 0x04, 0x26, 0x68, 0x45, 0x99, 0x0B, 0x42, 0x4B, 0xE1, 0x0B, 0x85, 0x40, + 0xD2, 0x17, 0x3F, 0x35, 0x5D, 0x0A, 0x73, 0x33, 0x3C, 0xF6, 0xF0, 0x27, + 0x26, 0xF1, 0xF8, 0x1C, 0xB4, 0xF4, 0x8D, 0x13, 0xFD, 0xF2, 0x77, 0x03, + 0xCE, 0xE5, 0x4F, 0xFF, 0x7C, 0xD0, 0xD3, 0xF7, 0xDD, 0xCF, 0x46, 0xF0, + 0x9C, 0xDF, 0x8B, 0xF6, 0xD3, 0xDA, 0x20, 0xFB, 0x4F, 0xD9, 0x00, 0xF5, + 0xA3, 0xEB, 0x3A, 0xF3, 0xF0, 0xF4, 0x22, 0xF6, 0xEC, 0xF6, 0xAE, 0xE9, + 0x14, 0xF8, 0x01, 0xEA, 0x53, 0xF2, 0x09, 0x03, 0xE1, 0xF6, 0x23, 0x0C, + 0x3F, 0x06, 0x79, 0x05, 0xB6, 0x0E, 0x10, 0x0B, 0xE3, 0x1C, 0x38, 0x10, + 0xA9, 0x27, 0x94, 0x10, 0x9C, 0x14, 0xCD, 0x10, 0x1F, 0x06, 0xEC, 0x04, + 0x6E, 0x0B, 0x93, 0xFC, 0x2C, 0x05, 0x13, 0xFE, 0x71, 0xF1, 0xF5, 0xFE, + 0x4F, 0xE1, 0x18, 0x01, 0x45, 0xE4, 0x8D, 0x09, 0xEF, 0xF3, 0x0B, 0x0B, + 0x5A, 0xFC, 0xF7, 0xFF, 0x6B, 0xE9, 0x06, 0xF8, 0x43, 0xD9, 0x29, 0xF9, + 0xE6, 0xEF, 0x0B, 0xF8, 0x52, 0x06, 0x82, 0xF1, 0x86, 0xF8, 0xFD, 0xEB, + 0x3E, 0xE6, 0x94, 0xF0, 0xF3, 0xE2, 0xBB, 0xF9, 0x31, 0xEC, 0x17, 0xFC, + 0x24, 0xF7, 0xD8, 0xED, 0xFA, 0xF0, 0xFE, 0xE8, 0x9C, 0xE5, 0xFD, 0xF6, + 0xD2, 0xE7, 0x24, 0xF7, 0x19, 0xEA, 0x5A, 0xEC, 0x44, 0xE4, 0xBE, 0xE2, + 0xEC, 0xEA, 0x9E, 0xDC, 0x18, 0xED, 0xDC, 0xD3, 0xBF, 0xDF, 0x37, 0xD3, + 0x86, 0xDA, 0xD8, 0xD0, 0x00, 0xDA, 0xC5, 0xBA, 0x2C, 0xD1, 0x38, 0xAA, + 0x1C, 0xCA, 0xA8, 0xA6, 0x40, 0xBA, 0xC5, 0x9F, 0x08, 0xA8, 0x20, 0xA0, + 0x5B, 0xA5, 0xD0, 0xA4, 0xEE, 0xA4, 0x50, 0xA0, 0xD6, 0x9B, 0x0F, 0x9F, + 0x7A, 0x99, 0x63, 0xA4, 0xDD, 0xB7, 0xB9, 0xA9, 0x71, 0xD2, 0x4E, 0xA4, + 0x53, 0xD5, 0x7F, 0xA1, 0x3C, 0xD6, 0x09, 0xAC, 0x2F, 0xDB, 0xD3, 0xBB, + 0xE7, 0xDE, 0x1A, 0xC4, 0x03, 0xE2, 0x4A, 0xC4, 0x84, 0xDD, 0x66, 0xC8, + 0x30, 0xD9, 0x7C, 0xD4, 0xC5, 0xEC, 0x63, 0xDD, 0xA0, 0xFD, 0xE3, 0xDC, + 0xF1, 0xF5, 0xDC, 0xD3, 0x22, 0xE7, 0x16, 0xC6, 0x30, 0xE0, 0x46, 0xC6, + 0xC0, 0xDC, 0xD9, 0xCB, 0x27, 0xD3, 0xC8, 0xCE, 0x84, 0xC9, 0x0E, 0xD0, + 0xD1, 0xD4, 0x73, 0xD1, 0x38, 0xEA, 0xDD, 0xCE, 0x78, 0xF8, 0x8E, 0xCA, + 0x09, 0x01, 0x9C, 0xD3, 0xF7, 0x0B, 0x19, 0xE9, 0xF4, 0x13, 0x1F, 0xF6, + 0x2B, 0x0C, 0xD5, 0xF7, 0xB0, 0x0A, 0x9B, 0x05, 0xB3, 0x1D, 0x9F, 0x14, + 0x20, 0x25, 0x40, 0x11, 0xB3, 0x1F, 0x73, 0x06, 0xAA, 0x2C, 0xB9, 0x01, + 0xC4, 0x38, 0x7B, 0x05, 0x53, 0x2E, 0x1B, 0x0E, 0xE7, 0x18, 0xCC, 0x18, + 0x0D, 0x0B, 0xB3, 0x1E, 0xD9, 0x09, 0x03, 0x1E, 0x4C, 0x14, 0x1E, 0x27, + 0x2C, 0x20, 0x9B, 0x2A, 0x5C, 0x16, 0x2E, 0x20, 0x00, 0xFF, 0x9C, 0x20, + 0x0F, 0xFD, 0x83, 0x23, 0x12, 0x07, 0x53, 0x16, 0x32, 0xF2, 0x01, 0x06, + 0x3E, 0xD3, 0xE3, 0xFD, 0xCA, 0xCA, 0xA3, 0xF5, 0xF3, 0xD0, 0x0B, 0xFB, + 0x42, 0xE0, 0xD3, 0x00, 0x0A, 0xF5, 0xD7, 0xF7, 0x1A, 0xFA, 0x82, 0xFE, + 0x12, 0xF5, 0x41, 0x20, 0xED, 0x01, 0xC0, 0x3C, 0xE2, 0x16, 0x90, 0x41, + 0xAC, 0x24, 0x8F, 0x45, 0xE1, 0x33, 0xDF, 0x4E, 0x20, 0x42, 0x51, 0x55, + 0x39, 0x46, 0x58, 0x5E, 0x23, 0x3B, 0xF4, 0x60, 0x89, 0x3C, 0x74, 0x5E, + 0x56, 0x52, 0x37, 0x60, 0x31, 0x50, 0xF0, 0x5B, 0xD2, 0x40, 0x4B, 0x50, + 0x79, 0x36, 0xFC, 0x44, 0xE0, 0x22, 0xE2, 0x40, 0xF7, 0x0B, 0xFE, 0x3E, + 0x20, 0xFB, 0x4B, 0x38, 0xB2, 0xF7, 0xD0, 0x34, 0xD7, 0xFF, 0xD2, 0x30, + 0x6F, 0x10, 0x0B, 0x2C, 0x2E, 0x20, 0x2A, 0x32, 0x35, 0x2F, 0x10, 0x49, + 0x72, 0x42, 0xAE, 0x56, 0x86, 0x52, 0x99, 0x49, 0x02, 0x55, 0x39, 0x46, + 0xBC, 0x4E, 0x73, 0x5A, 0xCC, 0x55, 0x79, 0x69, 0xA6, 0x5D, 0x19, 0x67, + 0x8F, 0x5D, 0x78, 0x5D, 0x7B, 0x60, 0xDA, 0x58, 0x69, 0x60, 0xDC, 0x5A, + 0xCC, 0x5E, 0x97, 0x57, 0x3D, 0x5F, 0xAF, 0x4B, 0xF3, 0x5D, 0x58, 0x43, + 0x42, 0x58, 0x81, 0x4B, 0x6B, 0x4F, 0x46, 0x4F, 0x0C, 0x4D, 0x1C, 0x3F, + 0x02, 0x43, 0xD1, 0x2D, 0x25, 0x30, 0x57, 0x22, 0x32, 0x25, 0x1F, 0x0D, + 0xAB, 0x0F, 0x44, 0xEF, 0x26, 0xF0, 0xCC, 0xDF, 0xE0, 0xDF, 0x88, 0xE0, + 0x41, 0xD6, 0x96, 0xE1, 0x6F, 0xDA, 0x39, 0xDB, 0x36, 0xF2, 0xB4, 0xD1, + 0x30, 0x01, 0x28, 0xDB, 0xEA, 0x07, 0xDF, 0xEC, 0x42, 0x12, 0x13, 0xEB, + 0xE1, 0x12, 0xF5, 0xEB, 0x46, 0x0D, 0xAE, 0x00, 0x6E, 0x20, 0xC2, 0x15, + 0xF7, 0x2D, 0x18, 0x1C, 0x81, 0x1F, 0x2F, 0x25, 0xDC, 0x22, 0x1C, 0x2B, + 0x1E, 0x30, 0x28, 0x1C, 0xFC, 0x2C, 0xDF, 0x0D, 0x47, 0x30, 0xF3, 0x02, + 0x96, 0x30, 0xBB, 0xEF, 0x82, 0x11, 0xD4, 0xE7, 0xE1, 0xE9, 0x15, 0xE7, + 0x67, 0xDC, 0x09, 0xD4, 0x56, 0xD8, 0xB2, 0xBD, 0x22, 0xC5, 0xD5, 0xBB, + 0x95, 0xB1, 0x52, 0xC5, 0x89, 0xA8, 0x6B, 0xC3, 0x3C, 0xB0, 0xC6, 0xC0, + 0x5A, 0xCA, 0xD8, 0xCF, 0x5F, 0xDB, 0x26, 0xE3, 0xD6, 0xDB, 0x69, 0xEF, + 0xD4, 0xE4, 0x09, 0xF6, 0x15, 0xF2, 0x26, 0xFC, 0x69, 0xF2, 0x29, 0xF8, + 0x04, 0xF6, 0x37, 0xEB, 0xA8, 0xFA, 0x20, 0xE2, 0x12, 0xFF, 0x06, 0xDF, + 0x3C, 0x03, 0x1E, 0xE6, 0x68, 0xEE, 0xDF, 0xEF, 0x77, 0xD5, 0x7C, 0xEB, + 0x14, 0xD4, 0x5C, 0xDC, 0x21, 0xCF, 0x6F, 0xD2, 0x91, 0xC4, 0x9B, 0xCF, + 0xB5, 0xC7, 0xE7, 0xC6, 0xDA, 0xD0, 0x20, 0xC4, 0x48, 0xC9, 0xCF, 0xBD, + 0xE5, 0xBA, 0x68, 0xA9, 0x4A, 0xB3, 0x39, 0x9E, 0xE1, 0xA4, 0x8F, 0x9D, + 0x7B, 0x9D, 0xFA, 0x9F, 0x25, 0xA0, 0x3B, 0x9F, 0x4F, 0x9F, 0x8C, 0x9D, + 0x2D, 0xA7, 0x76, 0xA4, 0x0F, 0xB7, 0x9F, 0xB3, 0xF2, 0xC0, 0xD4, 0xBE, + 0xE2, 0xC6, 0x78, 0xBF, 0xC3, 0xCB, 0x38, 0xC0, 0x35, 0xCD, 0x10, 0xC6, + 0x57, 0xCA, 0x1E, 0xD6, 0x04, 0xCA, 0x17, 0xEB, 0x7D, 0xD4, 0x1F, 0xED, + 0x43, 0xE5, 0x1A, 0xE8, 0x65, 0xEC, 0xB7, 0xEB, 0xD1, 0xEA, 0x3C, 0xE8, + 0x62, 0xDF, 0x0A, 0xD6, 0x6D, 0xD0, 0x7B, 0xCE, 0xC7, 0xCA, 0x43, 0xD5, + 0x8B, 0xBB, 0xB2, 0xCB, 0x9F, 0xA9, 0x64, 0xC0, 0x20, 0xA2, 0x58, 0xB9, + 0x8B, 0xAF, 0x43, 0xB4, 0x75, 0xBA, 0x5D, 0xB3, 0xC2, 0xAF, 0xD8, 0xB9, + 0x2B, 0xB5, 0x9F, 0xC7, 0x97, 0xCD, 0x10, 0xD2, 0x82, 0xE6, 0xA8, 0xED, + 0xCF, 0xF1, 0x7E, 0x0E, 0x7D, 0xF6, 0x9B, 0x1D, 0xA9, 0x03, 0x34, 0x27, + 0x82, 0x0B, 0xB6, 0x35, 0x15, 0x0C, 0xB2, 0x43, 0xF7, 0x18, 0x8B, 0x44, + 0xCF, 0x28, 0x45, 0x3C, 0xB5, 0x27, 0xD1, 0x3D, 0x46, 0x1C, 0xF2, 0x42, + 0xE6, 0x14, 0x6C, 0x3F, 0x2F, 0x17, 0x19, 0x41, 0x35, 0x1B, 0x4A, 0x3F, + 0xC9, 0x1C, 0x90, 0x2D, 0xB9, 0x1C, 0x7D, 0x26, 0x78, 0x0F, 0xA2, 0x2D, + 0x2D, 0x01, 0xAD, 0x2E, 0x5C, 0xFC, 0x90, 0x22, 0x79, 0xEF, 0x1D, 0x0B, + 0x11, 0xE3, 0xB2, 0xF8, 0x0F, 0xE1, 0x41, 0xF1, 0x95, 0xE6, 0x02, 0xF0, + 0x04, 0xF5, 0x11, 0xF5, 0xC4, 0x04, 0x02, 0xF9, 0x22, 0x22, 0xD9, 0x05, + 0xEC, 0x46, 0xF6, 0x1E, 0xF8, 0x53, 0xF8, 0x2F, 0x04, 0x56, 0xCB, 0x37, + 0x79, 0x5E, 0xD9, 0x3F, 0x58, 0x61, 0xD0, 0x4E, 0x9D, 0x58, 0x89, 0x5B, + 0x74, 0x55, 0x22, 0x59, 0x95, 0x5B, 0xCD, 0x56, 0xFD, 0x5C, 0xCC, 0x5C, + 0x5C, 0x62, 0x7D, 0x59, 0x9D, 0x68, 0x3F, 0x4E, 0x61, 0x5E, 0x8A, 0x46, + 0x09, 0x5A, 0x22, 0x39, 0x8B, 0x5A, 0x63, 0x27, 0x73, 0x45, 0x8C, 0x25, + 0x77, 0x2F, 0xDE, 0x25, 0xCC, 0x28, 0x99, 0x1C, 0x76, 0x1F, 0x95, 0x1C, + 0x38, 0x1D, 0x4D, 0x1E, 0x80, 0x34, 0xDD, 0x1F, 0x61, 0x47, 0x4F, 0x2D, + 0x5C, 0x4A, 0x06, 0x38, 0x0B, 0x5B, 0x1B, 0x3D, 0xED, 0x67, 0x7E, 0x46, + 0x68, 0x5F, 0xC5, 0x53, 0x77, 0x5D, 0x9D, 0x58, 0xAB, 0x5F, 0x10, 0x4E, + 0xE5, 0x53, 0xE6, 0x44, 0x82, 0x51, 0xDC, 0x40, 0x37, 0x59, 0x1A, 0x37, + 0x8C, 0x46, 0x1A, 0x32, 0x7D, 0x2B, 0x10, 0x31, 0x25, 0x28, 0x5B, 0x27, + 0xED, 0x23, 0x9D, 0x1A, 0xF6, 0x1A, 0x6C, 0x10, 0xE2, 0x15, 0xC1, 0x0A, + 0x7E, 0x0A, 0x70, 0x10, 0x65, 0x00, 0x47, 0x0A, 0x77, 0xF5, 0xBA, 0xED, + 0x1E, 0xE2, 0xB2, 0xDA, 0x5B, 0xCB, 0x17, 0xCE, 0xBD, 0xB3, 0xBF, 0xC8, + 0x6E, 0x9F, 0x1B, 0xD2, 0xDF, 0xA2, 0xDA, 0xD0, 0x3F, 0xBA, 0xD1, 0xC9, + 0x56, 0xD1, 0x90, 0xDB, 0x27, 0xE1, 0x6E, 0xF0, 0xE3, 0xEB, 0x6A, 0xF4, + 0x94, 0xF1, 0x3F, 0xFA, 0x74, 0xEF, 0xAF, 0x04, 0xCC, 0xEE, 0xB0, 0x0B, + 0x12, 0xE9, 0x89, 0x09, 0xE7, 0xDD, 0x58, 0x0E, 0x61, 0xD9, 0x59, 0x12, + 0xF0, 0xE1, 0x39, 0x05, 0x54, 0xE3, 0x3B, 0xF7, 0x66, 0xD5, 0x68, 0xF4, + 0x55, 0xD0, 0x59, 0xF2, 0x69, 0xCA, 0x04, 0xE7, 0x92, 0xB2, 0xA8, 0xD9, + 0x22, 0x9D, 0x4A, 0xC9, 0xF1, 0x9A, 0x44, 0xB4, 0x28, 0xA3, 0xEB, 0xA8, + 0xD1, 0xA7, 0x86, 0xA2, 0xCE, 0xB0, 0xD8, 0xA0, 0x95, 0xC1, 0xF8, 0xB1, + 0xDC, 0xC8, 0xB8, 0xCA, 0x43, 0xD0, 0xC4, 0xE1, 0xA3, 0xDB, 0x0A, 0xF0, + 0x48, 0xDD, 0xBD, 0xF4, 0xB3, 0xDA, 0x67, 0xF4, 0x7A, 0xE6, 0xC5, 0xEF, + 0x15, 0xF2, 0xBB, 0xE3, 0x5E, 0xEB, 0x0E, 0xD7, 0x3F, 0xE4, 0xBA, 0xDB, + 0x0F, 0xE5, 0xF3, 0xE8, 0x53, 0xE4, 0xBD, 0xDC, 0x31, 0xE0, 0xBA, 0xC0, + 0x08, 0xDA, 0x08, 0xBD, 0xFE, 0xC7, 0xC9, 0xC2, 0xA2, 0xB8, 0xC5, 0xC0, + 0xF5, 0xB8, 0xD0, 0xB3, 0xB2, 0xC1, 0x29, 0xAA, 0xD8, 0xBB, 0x3D, 0xAF, + 0x8C, 0xA8, 0xAD, 0xAF, 0xCE, 0x9F, 0x74, 0xA9, 0x97, 0x9B, 0xFA, 0xA5, + 0xC9, 0x9A, 0xFF, 0x9F, 0x86, 0x9F, 0xD6, 0x9B, 0xF2, 0xA1, 0x20, 0x9F, + 0xCE, 0xAA, 0x57, 0xA5, 0xCF, 0xBE, 0x82, 0xB3, 0xBC, 0xCF, 0x90, 0xC4, + 0x1D, 0xDE, 0xD8, 0xD7, 0xC5, 0xE9, 0xFC, 0xEC, 0x68, 0xF3, 0x9F, 0x00, + 0x64, 0x05, 0xF0, 0x0D, 0xD2, 0x17, 0xFE, 0x09, 0xA1, 0x16, 0x88, 0xFE, + 0xA2, 0x08, 0x8A, 0xFF, 0x7F, 0x0E, 0xD0, 0x0B, 0x66, 0x17, 0x0B, 0x0B, + 0xA5, 0x0F, 0x4E, 0xFB, 0x3E, 0x0A, 0xE4, 0xF2, 0xCE, 0x03, 0xA8, 0xF6, + 0xF5, 0xEC, 0xFD, 0xEA, 0x11, 0xD3, 0x94, 0xD0, 0x47, 0xCB, 0x59, 0xCA, + 0x3F, 0xCB, 0x37, 0xD7, 0x43, 0xCD, 0x6A, 0xDD, 0xCD, 0xE0, 0x19, 0xDE, + 0x3F, 0xFF, 0xE5, 0xF1, 0x28, 0x15, 0x43, 0x10, 0x2E, 0x2D, 0xD1, 0x25, + 0xDB, 0x44, 0xE1, 0x34, 0x8E, 0x57, 0xFC, 0x3A, 0x0F, 0x61, 0x2D, 0x30, + 0x62, 0x57, 0xB6, 0x35, 0x44, 0x49, 0xCB, 0x43, 0x60, 0x42, 0x57, 0x30, + 0x75, 0x48, 0x65, 0x1F, 0x5F, 0x55, 0x89, 0x2C, 0xAF, 0x56, 0x7D, 0x32, + 0x93, 0x4B, 0x55, 0x23, 0x6E, 0x3E, 0xB9, 0x1B, 0xF8, 0x38, 0x79, 0x20, + 0x8E, 0x3B, 0x8F, 0x15, 0x33, 0x3B, 0x55, 0x00, 0x57, 0x3C, 0x0B, 0x06, + 0x3E, 0x3A, 0x61, 0x14, 0x4D, 0x26, 0x84, 0x0F, 0xE0, 0x15, 0x2D, 0x02, + 0x15, 0x0E, 0x77, 0xF4, 0xAD, 0xF6, 0xA6, 0xEC, 0xF8, 0xDE, 0x36, 0xEA, + 0xB3, 0xEB, 0xAD, 0xE9, 0x0E, 0x08, 0x1F, 0xF3, 0xE4, 0x12, 0xB8, 0x0C, + 0xD4, 0x21, 0x95, 0x23, 0xA4, 0x39, 0xD3, 0x31, 0x1A, 0x47, 0xFB, 0x43, + 0xDD, 0x54, 0xEA, 0x4E, 0xFC, 0x5E, 0x9E, 0x50, 0x0D, 0x50, 0x89, 0x57, + 0x38, 0x42, 0x7F, 0x5A, 0xEC, 0x42, 0x26, 0x54, 0x43, 0x40, 0x11, 0x4F, + 0x04, 0x38, 0x0F, 0x41, 0xC0, 0x31, 0x4A, 0x34, 0x40, 0x33, 0xA2, 0x34, + 0x5A, 0x2B, 0x00, 0x30, 0x63, 0x0A, 0x34, 0x1C, 0x8D, 0xED, 0x2F, 0x07, + 0xD5, 0xE2, 0xFF, 0xF8, 0x2D, 0xDA, 0x18, 0xF1, 0x47, 0xD0, 0xD2, 0xEA, + 0x91, 0xD0, 0x46, 0xF3, 0x9C, 0xE2, 0x53, 0x14, 0x81, 0xFD, 0xCB, 0x39, + 0x33, 0x17, 0xD6, 0x52, 0x00, 0x2F, 0x8F, 0x56, 0xB7, 0x33, 0xB8, 0x4B, + 0x37, 0x24, 0x13, 0x46, 0x07, 0x1C, 0x8F, 0x49, 0x20, 0x19, 0x9D, 0x46, + 0x97, 0x10, 0x6F, 0x34, 0x54, 0x16, 0xC5, 0x21, 0xF5, 0x2B, 0x4E, 0x24, + 0xBE, 0x25, 0x2F, 0x2F, 0xB4, 0xFF, 0x76, 0x32, 0xD9, 0xEB, 0x06, 0x34, + 0xF1, 0xF0, 0x9D, 0x2A, 0xE5, 0xEF, 0x51, 0x1F, 0x28, 0xE8, 0xD4, 0x1D, + 0x0B, 0xE8, 0x0F, 0x18, 0x67, 0xE6, 0x6E, 0x09, 0x6F, 0xD8, 0x0C, 0xF5, + 0xF6, 0xCD, 0x3F, 0xE1, 0x6D, 0xC5, 0xD8, 0xCC, 0xC9, 0xB6, 0xBB, 0xB9, + 0x58, 0xB3, 0x22, 0xBA, 0xDC, 0xB8, 0x17, 0xC8, 0xB6, 0xBF, 0xF2, 0xD3, + 0xF1, 0xCF, 0xEA, 0xE5, 0xAF, 0xEC, 0x07, 0xFE, 0x93, 0x08, 0x73, 0x0E, + 0x40, 0x0F, 0xBB, 0x19, 0x2B, 0x05, 0x3B, 0x25, 0xC7, 0x00, 0xD7, 0x23, + 0x8B, 0xFE, 0x85, 0x0F, 0xBA, 0xFD, 0xA7, 0x00, 0x29, 0x09, 0xFB, 0xFC, + 0x36, 0x10, 0x24, 0xF0, 0xC3, 0x10, 0xBF, 0xE1, 0x69, 0x14, 0x4D, 0xDD, + 0x53, 0x0A, 0x55, 0xE1, 0x18, 0xE7, 0x50, 0xE0, 0xD4, 0xC2, 0x2D, 0xCA, + 0x83, 0xB9, 0xB2, 0xB4, 0x0F, 0xB3, 0x43, 0xA9, 0x1D, 0xA6, 0x48, 0xA3, + 0x74, 0xAD, 0x0B, 0xA5, 0xE9, 0xCA, 0xE7, 0xAC, 0x54, 0xF0, 0x35, 0xBF, + 0x5B, 0x17, 0x1D, 0xD9, 0x1C, 0x2D, 0xBD, 0xED, 0xCB, 0x27, 0x58, 0xFD, + 0x48, 0x20, 0xE1, 0x05, 0x66, 0x23, 0xC4, 0x00, 0x9C, 0x25, 0xD5, 0xEF, + 0x5B, 0x16, 0x2E, 0xDC, 0x3B, 0xFD, 0x18, 0xD9, 0x89, 0xFA, 0x4D, 0xE2, + 0x88, 0x04, 0x3C, 0xE4, 0x63, 0xF8, 0x5B, 0xE0, 0x78, 0xE3, 0x1E, 0xE1, + 0xCA, 0xE1, 0x53, 0xEE, 0xCF, 0xE7, 0x0D, 0xED, 0xA4, 0xF2, 0x73, 0xD2, + 0x64, 0xFD, 0x1D, 0xC6, 0x6B, 0xF0, 0x0B, 0xD0, 0x74, 0xCA, 0xAB, 0xDC, + 0x65, 0xAD, 0x0A, 0xDA, 0x99, 0xB0, 0xA3, 0xBF, 0x9E, 0xB3, 0xAD, 0xA7, + 0xAB, 0xAF, 0xC1, 0xA1, 0xE4, 0xB1, 0x2D, 0x9E, 0xB1, 0xB0, 0x09, 0xA8, + 0x8A, 0xC0, 0x62, 0xBF, 0x0A, 0xF6, 0xF5, 0xD3, 0x60, 0x24, 0x7B, 0xEA, + 0x05, 0x2E, 0x72, 0xFE, 0xDA, 0x2A, 0x1B, 0x0F, 0x78, 0x22, 0x90, 0x1A, + 0x9B, 0x19, 0xFA, 0x1E, 0x8D, 0x1C, 0x8A, 0x17, 0x38, 0x25, 0x9A, 0x07, + 0xEC, 0x17, 0x6C, 0x0A, 0x2B, 0x0A, 0x46, 0x1C, 0xA4, 0x11, 0xF8, 0x1C, + 0x5C, 0x17, 0xBF, 0x18, 0x40, 0x13, 0xA1, 0x12, 0xB0, 0x0C, 0xAF, 0x02, + 0x2C, 0xFD, 0xC8, 0xF7, 0xD5, 0xEA, 0xB7, 0xE8, 0x88, 0xD9, 0xEB, 0xD8, + 0x97, 0xC9, 0xDD, 0xE2, 0x54, 0xC6, 0xED, 0xEB, 0xB1, 0xDF, 0x8E, 0xF2, + 0x92, 0x06, 0xB5, 0x0F, 0x21, 0x18, 0xA5, 0x31, 0xC6, 0x22, 0xB5, 0x41, + 0xED, 0x34, 0x42, 0x47, 0x2C, 0x3B, 0x9F, 0x4C, 0xD3, 0x31, 0x44, 0x45, + 0x1D, 0x23, 0x2B, 0x2E, 0x80, 0x15, 0x2E, 0x17, 0xDC, 0x0D, 0x6D, 0x0C, + 0x84, 0x0E, 0x6B, 0x0D, 0xA8, 0x18, 0x50, 0x13, 0x65, 0x17, 0x4B, 0x0C, + 0x34, 0x0C, 0xF8, 0x09, 0x5C, 0x11, 0x44, 0x22, 0x8E, 0x0C, 0xD3, 0x2D, + 0x70, 0xFD, 0xCD, 0x1D, 0x50, 0xF8, 0x53, 0x19, 0x20, 0xF2, 0x56, 0x1C, + 0x6A, 0xF2, 0x6D, 0x0C, 0xEB, 0xEC, 0xC2, 0xF6, 0xCE, 0xDB, 0x49, 0xE1, + 0xD3, 0xCE, 0xAD, 0xCD, 0x01, 0xCA, 0x7D, 0xD8, 0x13, 0xCE, 0x96, 0xF1, + 0x23, 0xDB, 0x78, 0x00, 0xC4, 0xEF, 0x0B, 0x11, 0x91, 0x17, 0xE4, 0x25, + 0x5D, 0x38, 0xEE, 0x3A, 0x7A, 0x40, 0xB4, 0x4A, 0x93, 0x45, 0x8A, 0x58, + 0xF0, 0x3B, 0x38, 0x64, 0x84, 0x31, 0x29, 0x5E, 0x64, 0x2F, 0x2C, 0x48, + 0xA0, 0x2B, 0xF3, 0x35, 0x6D, 0x28, 0xFF, 0x2B, 0xD3, 0x1D, 0xE2, 0x2F, + 0x7A, 0x17, 0x3C, 0x39, 0x3C, 0x21, 0xDE, 0x32, 0xFB, 0x22, 0xE6, 0x29, + 0xF3, 0x17, 0x6D, 0x27, 0x1E, 0x06, 0x9F, 0x24, 0x6D, 0xE8, 0xD9, 0x1D, + 0x8E, 0xD6, 0xD5, 0x0A, 0xAF, 0xE4, 0xF5, 0xFD, 0xAF, 0x00, 0xED, 0xFE, + 0x2D, 0x19, 0xB1, 0x07, 0x73, 0x34, 0x7E, 0x25, 0x5C, 0x4B, 0x93, 0x49, + 0xCB, 0x55, 0xFA, 0x5A, 0xDA, 0x5C, 0x9B, 0x5F, 0xA4, 0x55, 0x3F, 0x58, + 0x00, 0x4A, 0x11, 0x53, 0x9F, 0x4C, 0x44, 0x55, 0xF8, 0x3E, 0xE3, 0x3D, + 0x55, 0x25, 0xB4, 0x1F, 0xFC, 0x27, 0xCE, 0x1B, 0x5F, 0x36, 0x34, 0x21, + 0x9A, 0x30, 0xD4, 0x1B, 0xFA, 0x27, 0xA8, 0x11, 0x9F, 0x2F, 0xE3, 0x0F, + 0x56, 0x2A, 0xAD, 0x10, 0x66, 0x16, 0x33, 0x0C, 0x4B, 0x13, 0xEC, 0x09, + 0x31, 0x11, 0x68, 0x0B, 0x26, 0x01, 0x75, 0x04, 0xFF, 0xEC, 0xEA, 0xF6, + 0xEA, 0xCF, 0x07, 0xE5, 0x06, 0xBE, 0xA0, 0xCC, 0xD1, 0xC5, 0x0D, 0xBB, + 0x45, 0xD2, 0x6F, 0xBA, 0x64, 0xE5, 0xDD, 0xBA, 0x84, 0x0A, 0x40, 0xC4, + 0x38, 0x32, 0xA6, 0xEA, 0xF6, 0x49, 0xAF, 0x10, 0x40, 0x4D, 0xDC, 0x1E, + 0xF8, 0x45, 0x7E, 0x21, 0x5C, 0x3B, 0xCA, 0x18, 0xA9, 0x2C, 0xB2, 0x0C, + 0xF0, 0x0E, 0x91, 0x05, 0x95, 0xF0, 0x5A, 0xFA, 0x19, 0xF1, 0xA3, 0xEC, + 0x27, 0xFF, 0x8D, 0xE1, 0x41, 0x06, 0xBC, 0xDF, 0x08, 0x02, 0x8D, 0xDB, + 0x7F, 0xF7, 0x6B, 0xD9, 0xC6, 0xE6, 0x32, 0xDD, 0x00, 0xCD, 0x59, 0xCE, + 0x90, 0xBA, 0x61, 0xB9, 0x8E, 0xB1, 0xAF, 0xB0, 0x5E, 0xB5, 0xCA, 0xA9, + 0x8C, 0xBF, 0x64, 0xA4, 0xD8, 0xC5, 0x8B, 0xB7, 0x22, 0xD2, 0x2E, 0xD4, + 0xBD, 0xEB, 0xFC, 0xEC, 0xBF, 0xF5, 0xF6, 0x04, 0x3C, 0xF7, 0xB7, 0x12, + 0xA8, 0xFB, 0xA6, 0x06, 0x37, 0xF9, 0x7F, 0xF4, 0x34, 0xED, 0x35, 0xE6, + 0xA5, 0xCE, 0x1C, 0xCD, 0x83, 0xB0, 0xB3, 0xBE, 0xEB, 0xB2, 0x6C, 0xC5, + 0x37, 0xC8, 0xE5, 0xC5, 0x43, 0xC4, 0xDB, 0xBF, 0xB6, 0xB2, 0xFA, 0xD0, + 0xF0, 0xB3, 0xC1, 0xE2, 0xEF, 0xBD, 0x79, 0xE2, 0x4C, 0xC5, 0x16, 0xE4, + 0x6C, 0xCE, 0x73, 0xDD, 0xE5, 0xCE, 0xB7, 0xCC, 0xA7, 0xC4, 0x95, 0xC5, + 0xB6, 0xB9, 0xD9, 0xBB, 0xF3, 0xA8, 0x70, 0xAB, 0x9B, 0x9E, 0xE3, 0x9F, + 0xB7, 0xA9, 0x78, 0x9D, 0x89, 0xB6, 0xEF, 0xA7, 0x13, 0xB7, 0x19, 0xBA, + 0xB9, 0xB9, 0x93, 0xD6, 0xC8, 0xCD, 0xAB, 0xFA, 0xA3, 0xE7, 0x77, 0x11, + 0xD8, 0xF6, 0x86, 0x1D, 0x4C, 0xFD, 0xE4, 0x23, 0x3C, 0xFA, 0xBA, 0x1C, + 0x5D, 0xF4, 0x21, 0x13, 0x85, 0xEE, 0x60, 0xFF, 0x73, 0xE0, 0x6E, 0xE9, + 0x41, 0xD9, 0xAC, 0xE9, 0xEF, 0xDE, 0xE9, 0xE3, 0xE7, 0xE5, 0x38, 0xDA, + 0x16, 0xE4, 0xF8, 0xE5, 0x9B, 0xE1, 0xE8, 0xF8, 0x5A, 0xE0, 0xB1, 0xF7, + 0xC7, 0xDB, 0xE2, 0xEC, 0x16, 0xD0, 0x20, 0xDE, 0x97, 0xC4, 0x8C, 0xC8, + 0x7A, 0xC7, 0xF8, 0xC3, 0xA8, 0xD0, 0x64, 0xCE, 0x70, 0xE4, 0x60, 0xDD, + 0x77, 0x02, 0xD3, 0xF7, 0x7A, 0x2A, 0xEF, 0x1D, 0xA8, 0x50, 0xFF, 0x2F, + 0x94, 0x5E, 0xCC, 0x32, 0x06, 0x4E, 0x76, 0x3C, 0x27, 0x3A, 0x44, 0x43, + 0x46, 0x2C, 0x18, 0x31, 0x20, 0x13, 0x5E, 0x11, 0xF1, 0x01, 0x0B, 0x05, + 0x31, 0x0A, 0x45, 0x08, 0x0D, 0x15, 0x03, 0x03, 0xA6, 0x1C, 0x1B, 0xFD, + 0xF5, 0x2B, 0x2C, 0x10, 0x4F, 0x34, 0x4E, 0x28, 0xCA, 0x37, 0x95, 0x2C, + 0xE9, 0x3C, 0xD8, 0x2C, 0x07, 0x3A, 0x03, 0x30, 0xA5, 0x30, 0x37, 0x26, + 0xEA, 0x1F, 0xC7, 0x1A, 0x34, 0x0E, 0x29, 0x14, 0xA2, 0xFF, 0xA4, 0xF6, + 0x60, 0xFE, 0xF7, 0xDF, 0xC6, 0x09, 0x4B, 0xE9, 0x32, 0x12, 0xBC, 0xF6, + 0x60, 0x1B, 0x03, 0x08, 0x57, 0x27, 0xE6, 0x22, 0x8D, 0x3D, 0x9C, 0x42, + 0x62, 0x5A, 0x6F, 0x57, 0xBD, 0x60, 0x4B, 0x59, 0x4E, 0x56, 0x5E, 0x5F, + 0x30, 0x53, 0xFC, 0x61, 0x47, 0x49, 0x9F, 0x4F, 0xF0, 0x39, 0xDA, 0x39, + 0x18, 0x3A, 0xA3, 0x20, 0x07, 0x40, 0x92, 0x0D, 0xD2, 0x42, 0x59, 0x0F, + 0x2D, 0x4A, 0xC1, 0x13, 0x23, 0x4D, 0x91, 0x18, 0xD4, 0x45, 0xF4, 0x24, + 0x63, 0x39, 0x9A, 0x2B, 0x72, 0x2C, 0xD0, 0x2E, 0xDE, 0x1C, 0x22, 0x2B, + 0x65, 0x13, 0xE8, 0x26, 0x13, 0x11, 0x00, 0x24, 0x9B, 0x19, 0x0C, 0x1B, + 0x46, 0x30, 0xFF, 0x1A, 0x65, 0x45, 0x2A, 0x33, 0xC8, 0x52, 0x0B, 0x57, + 0x74, 0x5B, 0x91, 0x60, 0x55, 0x5B, 0x15, 0x53, 0x6B, 0x49, 0xAF, 0x50, + 0x53, 0x37, 0x1B, 0x4D, 0x99, 0x32, 0x5F, 0x32, 0xDC, 0x21, 0x76, 0x11, + 0xF0, 0x07, 0x3A, 0x01, 0x1E, 0x03, 0x4E, 0x0F, 0xAE, 0xF6, 0x3F, 0x24, + 0x48, 0xDF, 0x13, 0x28, 0x47, 0xEE, 0xAF, 0x24, 0x91, 0x08, 0xB5, 0x21, + 0x73, 0x03, 0x29, 0x27, 0x53, 0xF9, 0xC4, 0x23, 0xE6, 0x00, 0x4F, 0x17, + 0x11, 0xFF, 0x03, 0x10, 0xFA, 0xF3, 0x7B, 0xF9, 0x7B, 0xE7, 0xC5, 0xDB, + 0xC7, 0xBF, 0x76, 0xC8, 0x5E, 0x9C, 0xCD, 0xB8, 0x82, 0x9E, 0xB5, 0xB6, + 0x5D, 0xAC, 0xE5, 0xC4, 0x3C, 0xBD, 0x12, 0xD0, 0x3B, 0xDE, 0xE6, 0xE3, + 0xC1, 0xFE, 0x68, 0x04, 0x1F, 0x10, 0x60, 0x1F, 0xAB, 0x12, 0xC5, 0x25, + 0x04, 0x0B, 0xC3, 0x1E, 0xA1, 0xFD, 0xD3, 0x15, 0x73, 0xE8, 0x71, 0xFB, + 0xAC, 0xCE, 0xC0, 0xDA, 0x24, 0xC0, 0xB7, 0xC5, 0xC7, 0xC5, 0x94, 0xB1, + 0xDE, 0xC2, 0x24, 0xAC, 0xA9, 0xB7, 0x8B, 0xBE, 0x43, 0xBA, 0x5D, 0xC7, + 0x1F, 0xBD, 0xD3, 0xCE, 0x21, 0xB8, 0xDE, 0xD9, 0x6D, 0xBC, 0xD2, 0xD1, + 0xBA, 0xB6, 0x2C, 0xBC, 0x3F, 0xA4, 0x58, 0xB2, 0x07, 0xA3, 0x65, 0xB4, + 0x35, 0xB4, 0xD0, 0xB7, 0x53, 0xC6, 0xB7, 0xC5, 0x39, 0xD0, 0x70, 0xD7, + 0xBF, 0xDD, 0x89, 0xE9, 0xB0, 0xE1, 0x17, 0x00, 0x50, 0xD6, 0x21, 0x09, + 0x13, 0xDB, 0x9D, 0xFE, 0xAA, 0xE7, 0x27, 0xF0, 0x2E, 0xDD, 0x55, 0xD6, + 0xC3, 0xC3, 0x0C, 0xB2, 0xBB, 0xB5, 0x8D, 0xA5, 0xB4, 0xB4, 0xE5, 0xAE, + 0x86, 0xB3, 0x64, 0xB2, 0x6B, 0xB8, 0xD0, 0xAE, 0x60, 0xD1, 0x30, 0xBA, + 0xDD, 0xE2, 0xED, 0xD1, 0x01, 0xDE, 0x32, 0xE5, 0xCB, 0xD8, 0x26, 0xF3, + 0xB9, 0xD6, 0xFC, 0xF2, 0x9D, 0xD0, 0xDF, 0xDF, 0x1B, 0xC7, 0xDA, 0xCC, + 0x96, 0xB8, 0x7E, 0xC0, 0xAF, 0xA2, 0xF1, 0xAD, 0xE9, 0x9B, 0x30, 0x9F, + 0x13, 0xB3, 0x18, 0xA0, 0xCA, 0xC8, 0x98, 0xA7, 0xAC, 0xD6, 0xB2, 0xB8, + 0x2F, 0xF4, 0xE5, 0xD8, 0x06, 0x16, 0xA8, 0xFC, 0xF8, 0x27, 0xDF, 0x1B, + 0xB1, 0x29, 0x35, 0x2F, 0x9F, 0x26, 0x81, 0x2E, 0xB0, 0x22, 0xBC, 0x1D, + 0x4A, 0x15, 0x9D, 0x07, 0x4F, 0x02, 0x9A, 0xEB, 0xB9, 0xF9, 0xB3, 0xD2, + 0x4F, 0xFE, 0xD0, 0xC7, 0x1B, 0x0C, 0xA9, 0xC3, 0x90, 0x15, 0x6A, 0xC7, + 0x3D, 0x1A, 0xA3, 0xDC, 0x0C, 0x26, 0x4A, 0xF0, 0x17, 0x2A, 0x16, 0xF3, + 0x60, 0x25, 0x8F, 0xF7, 0x0F, 0x18, 0xB0, 0xF2, 0x20, 0x0B, 0x22, 0xED, + 0xEC, 0x0B, 0x88, 0xF2, 0x65, 0x16, 0x39, 0xF6, 0x0A, 0x28, 0x7C, 0x01, + 0xD2, 0x3F, 0xA0, 0x14, 0xF5, 0x57, 0xC7, 0x2D, 0xA0, 0x63, 0x93, 0x4C, + 0x0D, 0x5F, 0xC8, 0x56, 0x7C, 0x59, 0x42, 0x4A, 0xCB, 0x57, 0xDF, 0x37, + 0xCC, 0x4B, 0xE6, 0x21, 0x6D, 0x33, 0x9D, 0x12, 0xAC, 0x23, 0x80, 0x0F, + 0x8A, 0x2E, 0x35, 0x12, 0xB9, 0x39, 0xEE, 0x0C, 0x5C, 0x38, 0x58, 0x10, + 0x2D, 0x3D, 0x95, 0x2F, 0x2C, 0x43, 0x41, 0x44, 0x04, 0x4C, 0x81, 0x44, + 0xA8, 0x4E, 0x06, 0x47, 0x2B, 0x3C, 0xFD, 0x45, 0x90, 0x2A, 0x9B, 0x37, + 0x41, 0x26, 0xD3, 0x21, 0x71, 0x14, 0x60, 0x0E, 0x82, 0xF2, 0x72, 0xFB, + 0x47, 0xE0, 0xEE, 0xEC, 0x39, 0xE4, 0x2B, 0xEC, 0x58, 0xF6, 0x4D, 0xF2, + 0x0E, 0x16, 0xC0, 0x07, 0xB4, 0x30, 0x43, 0x30, 0x4E, 0x44, 0x82, 0x4B, + 0xD4, 0x5D, 0x1B, 0x58, 0x5C, 0x68, 0x5E, 0x5F, 0x82, 0x58, 0x67, 0x5A, + 0x47, 0x3C, 0x22, 0x58, 0xF8, 0x19, 0x48, 0x55, 0x98, 0xFC, 0xCE, 0x3D, + 0x46, 0xF3, 0xF0, 0x24, 0x4E, 0xF6, 0x41, 0x1D, 0x23, 0xFE, 0x58, 0x23, + 0x21, 0x09, 0xF2, 0x28, 0x4A, 0x0C, 0xCE, 0x2E, 0x38, 0x03, 0x6D, 0x3D, + 0xA4, 0xFC, 0xEC, 0x41, 0x1A, 0xF4, 0x3C, 0x38, 0x38, 0xDE, 0x5A, 0x2C, + 0x1D, 0xDB, 0x8F, 0x1F, 0xF8, 0xE6, 0xBE, 0x0D, 0x80, 0xE7, 0x8E, 0x09, + 0x31, 0xF0, 0xA3, 0x22, 0xBA, 0x03, 0x59, 0x44, 0xBA, 0x12, 0x35, 0x5A, + 0x48, 0x1F, 0x2B, 0x62, 0x0A, 0x1E, 0x47, 0x5C, 0x40, 0x09, 0x3C, 0x54, + 0xA5, 0xFA, 0xFF, 0x44, 0x81, 0xF7, 0xB3, 0x1F, 0x14, 0xEA, 0xBF, 0xF8, + 0xA4, 0xE6, 0x9E, 0xED, 0x50, 0xEF, 0xE6, 0xEF, 0x6C, 0xE5, 0xA9, 0xED, + 0xAF, 0xE3, 0xD4, 0xF8, 0x48, 0xF4, 0x88, 0x0E, 0xEC, 0xFC, 0x7F, 0x1A, + 0xD3, 0xFF, 0xDC, 0x1B, 0x3A, 0x00, 0xE9, 0x15, 0x59, 0xFB, 0x2C, 0x09, + 0x5E, 0xED, 0x50, 0xFA, 0xB3, 0xDB, 0x73, 0xE3, 0xE4, 0xC8, 0xD3, 0xC0, + 0x5C, 0xAC, 0x73, 0xAA, 0x10, 0xA1, 0xB4, 0xA8, 0x6D, 0xB6, 0xA0, 0xA5, + 0x6D, 0xCD, 0x03, 0xA2, 0xA7, 0xE4, 0x3C, 0xB0, 0x27, 0xFD, 0x07, 0xD6, + 0x8C, 0x0D, 0xD9, 0x03, 0x90, 0x1B, 0x8C, 0x1C, 0xE8, 0x1C, 0x42, 0x1D, + 0x62, 0x14, 0xC2, 0x15, 0xBF, 0x05, 0x31, 0x01, 0x10, 0xE8, 0x11, 0xE2, + 0x8D, 0xD5, 0xA7, 0xC6, 0x3F, 0xD7, 0x9F, 0xB2, 0x12, 0xDA, 0x06, 0xAC, + 0xB1, 0xE2, 0x5F, 0xB2, 0x0F, 0xE8, 0x6D, 0xBC, 0xFF, 0xE1, 0x1C, 0xCF, + 0x88, 0xD8, 0x22, 0xE1, 0x39, 0xDA, 0x36, 0xEA, 0xD8, 0xDF, 0xEA, 0xDF, + 0x3F, 0xE1, 0xD1, 0xCC, 0x50, 0xE2, 0x36, 0xCA, 0xEA, 0xDD, 0x36, 0xC8, + 0xAE, 0xE3, 0x69, 0xCA, 0xB4, 0xF6, 0x04, 0xD6, 0xFB, 0x12, 0x89, 0xE2, + 0x1B, 0x2B, 0x59, 0xF3, 0x1F, 0x28, 0xF6, 0x04, 0xDE, 0x1D, 0x29, 0x10, + 0x48, 0x1E, 0xD8, 0x11, 0x74, 0x15, 0xB5, 0x04, 0xE1, 0xFE, 0x8D, 0xED, + 0xAD, 0xE5, 0xFC, 0xD7, 0x76, 0xDC, 0x1E, 0xD6, 0xF0, 0xDF, 0xCA, 0xE2, + 0xC5, 0xDB, 0x85, 0xE1, 0xBD, 0xE7, 0x2F, 0xE3, 0x75, 0x05, 0x7F, 0xF5, + 0xA1, 0x12, 0xC9, 0x02, 0x6F, 0x13, 0x7C, 0x0A, 0xBD, 0x14, 0x14, 0x11, + 0x48, 0x0D, 0x5C, 0x0B, 0x87, 0xF8, 0x43, 0xFA, 0x55, 0xE0, 0xB6, 0xE2, + 0x43, 0xCA, 0x4B, 0xC3, 0x3D, 0xB9, 0x67, 0xA4, 0xD2, 0xB5, 0x4C, 0x9B, + 0xD3, 0xBD, 0xF0, 0xAC, 0xF3, 0xCF, 0x0B, 0xC2, 0x30, 0xF5, 0xF3, 0xD8, + 0x14, 0x1F, 0x89, 0xFD, 0x92, 0x3B, 0x23, 0x1D, 0x3F, 0x48, 0xE1, 0x28, + 0xAF, 0x47, 0x12, 0x27, 0x48, 0x42, 0x1B, 0x1E, 0x07, 0x33, 0x0F, 0x10, + 0xD6, 0x16, 0xDC, 0x00, 0x59, 0xF9, 0x17, 0xF5, 0x3E, 0xE7, 0x00, 0xE4, + 0x81, 0xF0, 0xE7, 0xCF, 0xEF, 0x05, 0x59, 0xCC, 0xBE, 0x06, 0xCC, 0xDB, + 0x6B, 0xFB, 0xD6, 0xF3, 0xB9, 0xFD, 0x2A, 0x01, 0x0A, 0x0C, 0x60, 0x02, + 0xB0, 0x07, 0xC1, 0x00, 0xE1, 0xFB, 0xF8, 0xFD, 0x93, 0xF3, 0xB8, 0xFB, + 0xDD, 0xE8, 0xB5, 0xFD, 0xEB, 0xFA, 0x03, 0xFC, 0x0E, 0x18, 0xF9, 0xFC, + 0xF4, 0x23, 0x0E, 0x14, 0xAB, 0x33, 0xD5, 0x30, 0xF6, 0x3A, 0xAB, 0x42, + 0x19, 0x30, 0x82, 0x47, 0xE7, 0x28, 0x27, 0x3F, 0xAF, 0x19, 0xF0, 0x2C, + 0x87, 0xFF, 0x7C, 0x11, 0xC9, 0xEA, 0x1E, 0xFD, 0x8A, 0xE4, 0x7A, 0x00, + 0x83, 0xE4, 0x4B, 0x08, 0x2D, 0xE3, 0x19, 0x0B, 0x7D, 0xF1, 0x56, 0x14, + 0xA9, 0x02, 0x2B, 0x28, 0xE3, 0x08, 0x24, 0x3C, 0xD0, 0x10, 0xB8, 0x3B, + 0xF7, 0x0D, 0x84, 0x37, 0xBB, 0xFF, 0xDC, 0x2E, 0xBF, 0xFA, 0xB0, 0x0C, + 0x33, 0xEC, 0x37, 0xEE, 0x8A, 0xCB, 0x64, 0xDB, 0x4D, 0xB5, 0xFC, 0xC6, + 0x80, 0xB6, 0x87, 0xC7, 0x96, 0xC2, 0x5E, 0xDD, 0x60, 0xCC, 0xA8, 0xF3, + 0x2B, 0xE7, 0xB2, 0x12, 0x32, 0x13, 0x77, 0x36, 0xD7, 0x35, 0x2E, 0x50, + 0xA2, 0x43, 0x9E, 0x5D, 0x92, 0x38, 0x47, 0x61, 0xB1, 0x2A, 0x32, 0x61, + 0x45, 0x22, 0x68, 0x48, 0x8E, 0x13, 0x29, 0x1B, 0xEC, 0x04, 0x34, 0xFE, + 0xDE, 0xF7, 0x54, 0xE8, 0x77, 0xF9, 0xEF, 0xE1, 0x5E, 0x05, 0x2C, 0xF6, + 0x65, 0x10, 0x33, 0x08, 0x5E, 0x19, 0x28, 0x1A, 0x14, 0x0D, 0x8F, 0x31, + 0x16, 0x02, 0xDC, 0x39, 0x4E, 0x02, 0xD5, 0x2C, 0x9A, 0xFD, 0xEF, 0x26, + 0x0C, 0xFF, 0xD4, 0x19, 0xBD, 0x15, 0xC2, 0x03, 0xC7, 0x30, 0x5F, 0x06, + 0xC3, 0x3B, 0xC8, 0x1A, 0x14, 0x4B, 0x70, 0x32, 0x88, 0x60, 0xEF, 0x45, + 0x91, 0x5C, 0x5E, 0x4A, 0xA4, 0x45, 0x59, 0x48, 0x86, 0x36, 0x31, 0x41, + 0x5B, 0x2F, 0x4B, 0x27, 0xFB, 0x2A, 0xE3, 0x04, 0x40, 0x20, 0xDD, 0xE9, + 0x6D, 0x14, 0xAB, 0xEA, 0x18, 0x0B, 0x6B, 0xF4, 0xE1, 0x0B, 0x6C, 0xF9, + 0xB8, 0x27, 0xA7, 0x11, 0x39, 0x43, 0x53, 0x1D, 0x4C, 0x4C, 0xEF, 0x12, + 0x6D, 0x4C, 0xE7, 0x17, 0x8C, 0x4C, 0x97, 0x1D, 0x2D, 0x40, 0x02, 0x10, + 0x01, 0x1B, 0xCF, 0xFB, 0x44, 0xFE, 0xF6, 0xE3, 0xA1, 0xE9, 0xE4, 0xC8, + 0xA4, 0xCC, 0x77, 0xB4, 0x98, 0xC5, 0x69, 0xAF, 0x94, 0xD0, 0x68, 0xB3, + 0x7C, 0xE7, 0xBE, 0xC1, 0x90, 0x12, 0x31, 0xE5, 0x0B, 0x33, 0x44, 0x10, + 0x94, 0x3C, 0x34, 0x31, 0xFA, 0x38, 0x00, 0x44, 0x57, 0x2A, 0xEC, 0x46, + 0x8A, 0x14, 0x70, 0x36, 0x27, 0x01, 0x19, 0x1B, 0x59, 0xEF, 0xCC, 0xF3, + 0xC6, 0xDD, 0x0A, 0xD1, 0x03, 0xD6, 0x00, 0xCA, 0x74, 0xDC, 0x5D, 0xCB, + 0xBC, 0xE9, 0x6B, 0xC9, 0xE6, 0xF7, 0x7F, 0xD1, 0x7E, 0xF8, 0x3E, 0xE6, + 0x4D, 0xEA, 0x75, 0xF8, 0xF2, 0xE5, 0xCB, 0x00, 0xD0, 0xE0, 0x01, 0xF4, + 0x1E, 0xDA, 0x74, 0xE4, 0x41, 0xCD, 0xA3, 0xDC, 0xC0, 0xC1, 0x86, 0xE3, + 0x7D, 0xCD, 0x67, 0xF7, 0x97, 0xDF, 0x28, 0x08, 0x1D, 0xF7, 0x04, 0x20, + 0xE9, 0x10, 0xAF, 0x32, 0x7E, 0x15, 0xA1, 0x2D, 0xD1, 0x0F, 0x16, 0x1B, + 0xD0, 0x04, 0x5D, 0x0B, 0x38, 0xE9, 0x88, 0xFB, 0x76, 0xCA, 0xFF, 0xE3, + 0x9A, 0xB1, 0x28, 0xDA, 0x44, 0xAD, 0x23, 0xE3, 0x33, 0xB6, 0x93, 0xD8, + 0x8B, 0xC2, 0xA7, 0xD3, 0x9F, 0xD2, 0x7C, 0xEA, 0x75, 0xDC, 0x88, 0xF8, + 0xEE, 0xE8, 0x0B, 0x00, 0x63, 0xEF, 0xE3, 0x08, 0x61, 0xE2, 0x20, 0x07, + 0x6E, 0xCE, 0x1D, 0xF1, 0x06, 0xC2, 0x41, 0xD3, 0x3C, 0xB7, 0xD9, 0xBA, + 0xE0, 0xA9, 0xFA, 0xA3, 0x68, 0x9E, 0xE3, 0x9B, 0x60, 0x9E, 0x19, 0xA3, + 0xF6, 0xAA, 0xE4, 0xAB, 0x67, 0xBF, 0x31, 0xBE, 0xE7, 0xD6, 0xA2, 0xDA, + 0x3C, 0xEC, 0xA4, 0xF9, 0xD3, 0xFE, 0x18, 0x13, 0xB1, 0x05, 0xB5, 0x1C, + 0x9C, 0x08, 0x45, 0x18, 0x92, 0x04, 0x73, 0x02, 0x07, 0xE8, 0x87, 0xE5, + 0x26, 0xC6, 0x1A, 0xD1, 0xAB, 0xBD, 0x05, 0xBE, 0xE3, 0xC4, 0x4B, 0xB6, + 0xA4, 0xCB, 0x0F, 0xB9, 0xC5, 0xD2, 0x7C, 0xB8, 0xCF, 0xDC, 0xE7, 0xCB, + 0xA0, 0xE8, 0xCC, 0xE9, 0xFB, 0xF1, 0x79, 0xF8, 0x6D, 0xF0, 0x25, 0xFE, + 0x0C, 0xDD, 0x5F, 0xF3, 0x4D, 0xD5, 0x15, 0xE6, 0x7D, 0xDE, 0xF4, 0xE1, + 0x48, 0xE9, 0xC7, 0xE6, 0x6F, 0xF2, 0xFD, 0xEA, 0x54, 0x06, 0xE1, 0xEA, + 0x14, 0x1A, 0xB3, 0x01, 0xE0, 0x1D, 0x62, 0x27, 0x28, 0x20, 0xCE, 0x2E, + 0xF8, 0x1B, 0xE3, 0x29, 0x2E, 0x17, 0xE6, 0x24, 0xF3, 0x11, 0xE5, 0x00, + 0x5C, 0xFC, 0x87, 0xDD, 0xD9, 0xF2, 0x4A, 0xD6, 0x8C, 0x08, 0x77, 0xD7, + 0x62, 0x17, 0x42, 0xD4, 0x26, 0x21, 0x8B, 0xE5, 0x92, 0x32, 0x16, 0x0E, + 0xD0, 0x42, 0x8A, 0x2F, 0xDB, 0x4E, 0x97, 0x42, 0xAD, 0x50, 0x98, 0x41, + 0x00, 0x54, 0x00, 0x31, 0x30, 0x47, 0x8D, 0x24, 0x94, 0x24, 0xC6, 0x15, + 0xB8, 0x08, 0x8A, 0xFB, 0x00, 0xF4, 0xA7, 0xE1, 0xD5, 0xE6, 0x10, 0xD3, + 0xEB, 0xEC, 0xEA, 0xD5, 0x3D, 0x00, 0x68, 0xE2, 0x82, 0x16, 0x7B, 0xFA, + 0xD9, 0x2E, 0xA1, 0x1E, 0x1A, 0x4C, 0x02, 0x3F, 0x7A, 0x61, 0x61, 0x54, + 0x90, 0x62, 0x6F, 0x5D, 0xA0, 0x51, 0xF7, 0x61, 0x29, 0x32, 0x34, 0x5C, + 0xFF, 0x1B, 0xFE, 0x3E, 0x59, 0x15, 0x55, 0x1F, 0xC3, 0x0C, 0x35, 0x07, + 0x2F, 0x09, 0x31, 0xF4, 0xE7, 0x16, 0x69, 0xF5, 0x28, 0x32, 0xC1, 0x00, + 0x0E, 0x4E, 0x50, 0x0D, 0x01, 0x50, 0x2F, 0x1B, 0x68, 0x3E, 0x6F, 0x2B, + 0x89, 0x28, 0xA9, 0x35, 0x0C, 0x18, 0xC9, 0x2D, 0x7E, 0x20, 0x1D, 0x1C, + 0x48, 0x26, 0xCC, 0x09, 0x18, 0x23, 0x5C, 0x08, 0xF2, 0x20, 0xBC, 0x11, + 0x60, 0x25, 0x16, 0x27, 0xD4, 0x3C, 0xA0, 0x43, 0x0E, 0x54, 0xEE, 0x47, + 0x27, 0x54, 0x84, 0x41, 0x40, 0x47, 0x50, 0x41, 0x8B, 0x33, 0xA2, 0x35, + 0x4C, 0x1A, 0x00, 0x1F, 0xFC, 0x05, 0x71, 0x09, 0xE2, 0xF8, 0x59, 0xFD, + 0x05, 0xFC, 0xF5, 0xF5, 0x03, 0x03, 0xCA, 0xF6, 0xD4, 0x05, 0x7C, 0x0F, + 0x2C, 0x0D, 0x2C, 0x28, 0x8F, 0x17, 0x9F, 0x2E, 0x05, 0x27, 0xB1, 0x29, + 0x38, 0x2E, 0xCE, 0x21, 0x42, 0x1F, 0x04, 0x20, 0x1C, 0xFF, 0xDE, 0x15, + 0xEA, 0xDA, 0xD4, 0xFE, 0x93, 0xC0, 0x90, 0xDD, 0xEF, 0xAE, 0x96, 0xB6, + 0xDA, 0xA1, 0x56, 0xAF, 0x24, 0xA5, 0x82, 0xB9, 0x8E, 0xB4, 0xC6, 0xC5, + 0x04, 0xC8, 0x8B, 0xE6, 0x1B, 0xE7, 0x60, 0x0C, 0x03, 0x07, 0xF5, 0x2E, + 0x50, 0x16, 0x5D, 0x3C, 0xDF, 0x14, 0xC2, 0x37, 0x5C, 0x07, 0x0B, 0x37, + 0xA3, 0xE8, 0x32, 0x21, 0xCF, 0xD0, 0xE7, 0xF4, 0x8B, 0xCA, 0x24, 0xD4, + 0x4C, 0xB4, 0x00, 0xC4, 0x7B, 0xA2, 0xC2, 0xC2, 0x7A, 0xAE, 0x1A, 0xCB, + 0x46, 0xBA, 0xEC, 0xD9, 0xDA, 0xC0, 0x14, 0xEE, 0xCA, 0xC5, 0x8B, 0xFA, + 0x0C, 0xC5, 0x82, 0x06, 0x15, 0xC6, 0x22, 0x05, 0x8D, 0xC7, 0xB7, 0xF5, + 0xDF, 0xC0, 0xF0, 0xE8, 0x05, 0xBC, 0xFD, 0xE1, 0x56, 0xC7, 0x60, 0xE7, + 0x28, 0xD1, 0x5B, 0xF9, 0x97, 0xDB, 0xB5, 0x11, 0xD9, 0xF1, 0x62, 0x17, + 0xDB, 0x00, 0x98, 0x10, 0xD0, 0x00, 0x7C, 0x16, 0x62, 0xF5, 0x0A, 0x1B, + 0xAB, 0xDC, 0xC6, 0x08, 0x35, 0xC5, 0xA3, 0xEC, 0xFA, 0xBE, 0x67, 0xCF, + 0xA4, 0xC7, 0x91, 0xC0, 0xD0, 0xC8, 0x9F, 0xC4, 0xD8, 0xC8, 0x78, 0xC9, + 0xE1, 0xDE, 0x94, 0xD0, 0x4E, 0xFB, 0x26, 0xE1, 0xB1, 0x10, 0x08, 0xF9, + 0xD8, 0x1A, 0x75, 0x04, 0xAB, 0x1A, 0xF0, 0x06, 0x2F, 0x10, 0x89, 0x03, + 0xA4, 0xF4, 0x52, 0xF1, 0x2D, 0xD8, 0xEF, 0xD6, 0xA4, 0xC5, 0x43, 0xBD, + 0xED, 0xBD, 0xB1, 0xA5, 0xC2, 0xC5, 0x8A, 0x9D, 0x5E, 0xC8, 0xB1, 0xAE, + 0x8C, 0xCC, 0x21, 0xC2, 0xB5, 0xEF, 0x9B, 0xD4, 0xEA, 0x1F, 0x09, 0xF8, + 0xD8, 0x3D, 0xEA, 0x1A, 0x71, 0x4D, 0x61, 0x2B, 0xC4, 0x5A, 0x9B, 0x31, + 0x69, 0x56, 0xE7, 0x28, 0x90, 0x3A, 0xC8, 0x0E, 0x08, 0x1C, 0x57, 0xEE, + 0xE9, 0x09, 0x60, 0xD9, 0x28, 0x04, 0x0B, 0xCE, 0x33, 0x0C, 0x2D, 0xC3, + 0xB9, 0x17, 0xD6, 0xC5, 0x40, 0x23, 0x47, 0xD2, 0x60, 0x33, 0xC9, 0xDF, + 0x91, 0x35, 0xE6, 0xF8, 0xC1, 0x2D, 0x3F, 0x13, 0xEC, 0x21, 0xC8, 0x13, + 0x16, 0x1B, 0xC4, 0x0F, 0x6F, 0x18, 0xE6, 0x10, 0x17, 0x1A, 0x23, 0x0B, + 0xF6, 0x2E, 0xD9, 0x04, 0x32, 0x4A, 0x01, 0x02, 0x7E, 0x60, 0x81, 0x0F, + 0x39, 0x66, 0x68, 0x26, 0x23, 0x60, 0x64, 0x3B, 0x87, 0x57, 0xA8, 0x49, + 0xB5, 0x4E, 0x2D, 0x47, 0x8F, 0x40, 0x66, 0x31, 0x0D, 0x2B, 0x21, 0x15, + 0xA8, 0x1B, 0xBC, 0x01, 0x71, 0x17, 0xF0, 0x04, 0xD4, 0x0F, 0x7D, 0x0A, + 0x12, 0x0B, 0x99, 0x0A, 0xA4, 0x1A, 0xD4, 0x1F, 0xFD, 0x2B, 0xDA, 0x33, + 0x8E, 0x34, 0x49, 0x39, 0x03, 0x3B, 0x2D, 0x36, 0x32, 0x40, 0xE1, 0x2E, + 0x6F, 0x3C, 0xF1, 0x20, 0x5D, 0x2A, 0x07, 0x07, 0xE5, 0x07, 0x08, 0xF1, + 0x35, 0xDF, 0x3C, 0xE2, 0x2F, 0xC0, 0x27, 0xD4, 0xAA, 0xAC, 0x40, 0xD1, + 0x59, 0xA8, 0x63, 0xDF, 0xB8, 0xB8, 0x9C, 0xF1, 0x17, 0xDD, 0xD6, 0x07, + 0xE5, 0x0A, 0x5F, 0x26, 0xDE, 0x30, 0xC4, 0x3B, 0xDB, 0x40, 0x93, 0x46, + 0x4A, 0x3A, 0x9F, 0x52, 0x4D, 0x1F, 0x16, 0x4E, 0x15, 0x00, 0x8B, 0x32, + 0xF0, 0xED, 0x5C, 0x0F, 0xDB, 0xDE, 0xEE, 0xEB, 0x96, 0xD4, 0xC1, 0xCE, + 0xFC, 0xD2, 0x37, 0xC6, 0x39, 0xCE, 0xB6, 0xCE, 0xD7, 0xC8, 0x1C, 0xE2, + 0xD8, 0xD7, 0x9B, 0xFA, 0xF6, 0xF0, 0x08, 0x05, 0xA0, 0xF6, 0xC5, 0x0C, + 0x01, 0xE8, 0xFB, 0x0C, 0x7B, 0xDC, 0x17, 0x06, 0x87, 0xD9, 0xC4, 0xF9, + 0x4E, 0xE5, 0xAE, 0xE5, 0x4D, 0xF7, 0x98, 0xE6, 0x02, 0xF9, 0x27, 0xFE, + 0x3B, 0xFF, 0xC8, 0x18, 0x12, 0x0E, 0x6A, 0x2E, 0x65, 0x10, 0xE7, 0x31, + 0x81, 0x08, 0x55, 0x25, 0x42, 0xFD, 0x2A, 0x1E, 0x06, 0xEE, 0x58, 0x0D, + 0xF5, 0xDC, 0x02, 0xEA, 0x87, 0xCA, 0x18, 0xD6, 0xAE, 0xC2, 0xFA, 0xD9, + 0x7E, 0xBF, 0x39, 0xDF, 0xE4, 0xBF, 0x2A, 0xE7, 0x06, 0xC9, 0x4B, 0xFA, + 0x80, 0xDA, 0xD0, 0x0B, 0xFE, 0xF5, 0x36, 0x0F, 0x2F, 0x03, 0x6C, 0x10, + 0xAA, 0x03, 0x00, 0x18, 0x20, 0xFA, 0x56, 0x0D, 0xA2, 0xE3, 0x7B, 0xF5, + 0x05, 0xCF, 0x8E, 0xDC, 0xF7, 0xB5, 0x82, 0xBF, 0xD0, 0x9E, 0x4E, 0xB6, + 0xDB, 0x9D, 0xCF, 0xB5, 0x20, 0xB2, 0xFE, 0xB4, 0x61, 0xCC, 0x97, 0xD0, + 0xBD, 0xE2, 0xCE, 0xFC, 0x7F, 0x05, 0xA4, 0x1E, 0xEC, 0x29, 0x4A, 0x36, + 0x6C, 0x33, 0x1C, 0x4E, 0xE3, 0x2E, 0x66, 0x60, 0x4A, 0x20, 0x66, 0x50, + 0xD1, 0x0F, 0x49, 0x2A, 0x84, 0x08, 0x42, 0x01, 0x88, 0xFE, 0x62, 0xDC, + 0xD9, 0xEF, 0x87, 0xD5, 0x08, 0xE2, 0x7E, 0xDF, 0x02, 0xE7, 0xDD, 0xE6, + 0x13, 0xFF, 0x44, 0xF4, 0x9F, 0x10, 0x12, 0x08, 0x36, 0x18, 0xD8, 0x1C, + 0x7A, 0x13, 0x85, 0x26, 0x6C, 0x06, 0xB3, 0x24, 0x78, 0x06, 0x64, 0x23, + 0xF9, 0x06, 0x3E, 0x14, 0x65, 0x0F, 0x9F, 0x09, 0xF4, 0x21, 0xB5, 0x06, + 0xA0, 0x28, 0x5B, 0x0B, 0x50, 0x2F, 0x60, 0x23, 0xF9, 0x44, 0x73, 0x2C, + 0xB8, 0x56, 0x8B, 0x28, 0x7E, 0x50, 0xD4, 0x2A, 0xEE, 0x45, 0x4F, 0x29, + 0xAA, 0x38, 0x6E, 0x1B, 0x5A, 0x1F, 0xD7, 0xFC, 0x44, 0x0B, 0x2C, 0xE8, + 0xE3, 0x08, 0x9A, 0xE8, 0xFC, 0x0A, 0xF7, 0xE3, 0x1E, 0x1B, 0xD3, 0xEA, + 0xA8, 0x39, 0xE9, 0xFC, 0xE9, 0x4B, 0x04, 0x0D, 0x4A, 0x50, 0xF3, 0x1E, + 0xD8, 0x56, 0xD2, 0x23, 0xEC, 0x5B, 0x96, 0x1D, 0x97, 0x48, 0x17, 0x17, + 0xA0, 0x2F, 0x1E, 0x09, 0x8A, 0x19, 0xDC, 0xE7, 0xE7, 0xFE, 0xDD, 0xC5, + 0x8B, 0xEA, 0xF5, 0xBD, 0x56, 0xDA, 0xA0, 0xC7, 0x5A, 0xE4, 0x99, 0xD2, + 0xB3, 0x08, 0x25, 0xE9, 0xBD, 0x23, 0x81, 0x0F, 0xC4, 0x36, 0x78, 0x38, + 0x4B, 0x46, 0xA6, 0x55, 0x4C, 0x55, 0xFE, 0x59, 0xF3, 0x5B, 0x55, 0x50, + 0xDC, 0x42, 0xA0, 0x3D, 0x07, 0x16, 0x6C, 0x1B, 0x77, 0xF4, 0xC4, 0xFD, + 0xDB, 0xE1, 0xC6, 0xEC, 0x4B, 0xD1, 0x23, 0xD7, 0x03, 0xD0, 0xEE, 0xC3, + 0x03, 0xE5, 0x19, 0xC1, 0x3C, 0xFA, 0xCF, 0xCB, 0x10, 0xFC, 0x8E, 0xE3, + 0x98, 0xF6, 0x36, 0xFD, 0x3F, 0xFB, 0x2D, 0x03, 0xAA, 0x00, 0xAD, 0x01, + 0x34, 0xF5, 0x7E, 0x00, 0x14, 0xDF, 0x65, 0xFA, 0xE8, 0xE0, 0x6B, 0xFF, + 0x31, 0xED, 0x34, 0x05, 0xAF, 0xF9, 0xA4, 0x0B, 0xFE, 0x05, 0x6F, 0x1B, + 0x97, 0xF9, 0x33, 0x2A, 0x95, 0xEF, 0xF0, 0x29, 0x69, 0xF6, 0x5F, 0x1E, + 0xE9, 0xEB, 0xB3, 0x0E, 0x84, 0xD0, 0x95, 0xF3, 0x16, 0xBC, 0x38, 0xD3, + 0xBA, 0xBD, 0xEE, 0xC4, 0xC3, 0xC4, 0x29, 0xC6, 0x7A, 0xBD, 0xC0, 0xC0, + 0xB5, 0xC2, 0x0C, 0xCB, 0xC1, 0xCC, 0x74, 0xEA, 0x8E, 0xCC, 0x43, 0x05, + 0x4A, 0xCF, 0x71, 0x14, 0x07, 0xDD, 0x1D, 0x16, 0x5D, 0xEC, 0x81, 0x06, + 0xA5, 0xE7, 0x73, 0xEA, 0x41, 0xD4, 0x29, 0xD3, 0x4A, 0xBA, 0x8E, 0xB8, + 0x5D, 0xA0, 0xE5, 0xA3, 0xE7, 0x9B, 0x98, 0xA3, 0x6A, 0xA8, 0xAE, 0xA3, + 0x2A, 0xB5, 0x8C, 0xAD, 0x70, 0xCB, 0x1C, 0xC9, 0x60, 0xEC, 0x65, 0xED, + 0x4D, 0x09, 0xF8, 0x17, 0x3D, 0x1B, 0xEF, 0x2D, 0xC0, 0x26, 0x32, 0x2D, + 0xA1, 0x29, 0x46, 0x29, 0x82, 0x14, 0xE9, 0x18, 0x06, 0xF6, 0xF6, 0xFD, + 0x65, 0xE5, 0x7A, 0xDC, 0xDE, 0xDD, 0x85, 0xBA, 0x7D, 0xDD, 0x91, 0xA3, + 0x9F, 0xE6, 0x01, 0xA0, 0x87, 0xEE, 0x52, 0xB4, 0x8C, 0xF2, 0x10, 0xD0, + 0x66, 0xFA, 0x86, 0xE3, 0x87, 0x02, 0xAA, 0xF8, 0x27, 0xFD, 0x88, 0x00, + 0x1E, 0xFB, 0x29, 0xFE, 0x82, 0x02, 0x2E, 0xFD, 0x7B, 0x04, 0x66, 0xF0, + 0x17, 0x0B, 0xD5, 0xEA, 0x4D, 0x11, 0x41, 0xF3, 0xEE, 0x17, 0x45, 0x07, + 0x2D, 0x20, 0x8B, 0x1C, 0x1B, 0x20, 0xA3, 0x27, 0x5E, 0x1C, 0xFF, 0x2D, + 0x9C, 0x20, 0xA5, 0x2B, 0x75, 0x19, 0x49, 0x17, 0xA7, 0x01, 0x4C, 0xFF, + 0xC4, 0xFC, 0xCB, 0xEC, 0xC0, 0x0A, 0x99, 0xE3, 0x8F, 0x06, 0x0D, 0xE0, + 0xF7, 0xF3, 0x31, 0xD6, 0xB8, 0xFB, 0xD3, 0xDD, 0x05, 0x13, 0x8D, 0xFB, + 0x1C, 0x26, 0x40, 0x11, 0xE5, 0x34, 0x19, 0x19, 0xFB, 0x3B, 0x30, 0x23, + 0xA1, 0x36, 0x5A, 0x2C, 0x97, 0x2A, 0x2C, 0x28, 0x13, 0x15, 0x0C, 0x1B, + 0x29, 0xF4, 0x37, 0x09, 0x40, 0xE3, 0xA3, 0xF1, 0xB4, 0xE5, 0x53, 0xE3, + 0x07, 0xEA, 0x01, 0xE5, 0x69, 0xF2, 0xDB, 0xF1, 0xA3, 0x0B, 0x73, 0x16, + 0x70, 0x1F, 0xA0, 0x31, 0x42, 0x2D, 0x56, 0x39, 0xB9, 0x4E, 0xED, 0x52, + 0xBC, 0x56, 0x14, 0x53, 0xA7, 0x47, 0xEB, 0x3D, 0x79, 0x4C, 0x46, 0x47, + 0x89, 0x40, 0x82, 0x42, 0x54, 0x06, 0x60, 0x0B, 0x98, 0xE6, 0x4D, 0xE9, + 0xB0, 0xF6, 0xD1, 0xF0, 0x72, 0x0B, 0x7D, 0x03, 0x43, 0x1E, 0xDE, 0x17, + 0x23, 0x2F, 0x80, 0x2D, 0x76, 0x35, 0x39, 0x39, 0xE0, 0x3A, 0xC7, 0x3D, + 0xB3, 0x40, 0xA0, 0x3F, 0xBC, 0x37, 0xD4, 0x31, 0x7D, 0x3D, 0xAD, 0x40, + 0x08, 0x31, 0x03, 0x3D, 0x6B, 0x24, 0xD0, 0x2C, 0xA9, 0x3C, 0x2E, 0x48, + 0x4B, 0x3F, 0x69, 0x4C, 0x57, 0x3C, 0x54, 0x40, 0x47, 0x51, 0x22, 0x54, + 0xB7, 0x51, 0x41, 0x61, 0xE4, 0x30, 0x24, 0x4B, 0x9E, 0x14, 0x09, 0x2D, + 0x70, 0x06, 0x43, 0x0F, 0x22, 0xFE, 0xD7, 0xFC, 0x48, 0xF3, 0xA4, 0xF7, + 0xEE, 0xE3, 0x08, 0xEE, 0x2D, 0xE5, 0x9E, 0xF1, 0x00, 0xF4, 0xB3, 0x00, + 0x44, 0x00, 0x19, 0x10, 0xC5, 0xFE, 0xC4, 0x11, 0x72, 0x02, 0x63, 0x15, + 0xDA, 0x15, 0xC3, 0x2C, 0x71, 0x0C, 0xB0, 0x21, 0x5E, 0xE9, 0xB6, 0xFA, + 0x7D, 0xD7, 0xA7, 0xE1, 0x28, 0xCB, 0x8E, 0xC6, 0xCE, 0xB2, 0xB4, 0xAE, + 0x39, 0xA9, 0x82, 0xB2, 0xBE, 0xA4, 0xA8, 0xBA, 0xED, 0x9D, 0x64, 0xB9, + 0x90, 0xB1, 0x29, 0xC6, 0xE4, 0xD5, 0x80, 0xE5, 0x78, 0xED, 0x65, 0xFF, + 0xA8, 0xF4, 0xAB, 0x03, 0xD8, 0xF0, 0x51, 0xF7, 0x5A, 0xF3, 0xB1, 0xF5, + 0xC5, 0xEC, 0xA1, 0xE9, 0x5B, 0xC9, 0x80, 0xBC, 0x6B, 0xB4, 0x27, 0xA3, + 0x07, 0xAE, 0x5B, 0x9F, 0x02, 0xA7, 0xD5, 0xA1, 0xAE, 0x9F, 0x8C, 0xA1, + 0x6C, 0x9F, 0x49, 0xA5, 0x4B, 0xB6, 0xDF, 0xBF, 0x8B, 0xBB, 0x7C, 0xD1, + 0x74, 0xBD, 0x99, 0xDF, 0x87, 0xCF, 0xA5, 0xE4, 0x39, 0xC4, 0x6D, 0xD0, + 0xCD, 0xAA, 0xDE, 0xBD, 0x03, 0xAC, 0xAC, 0xC6, 0xFF, 0xC2, 0xDD, 0xDE, + 0x45, 0xDF, 0x49, 0xE0, 0x19, 0x02, 0x38, 0xDE, 0xF8, 0x13, 0xC2, 0xEB, + 0xD6, 0x0A, 0xB9, 0xFE, 0x43, 0xFB, 0x82, 0x05, 0xD6, 0xEE, 0xDA, 0xFC, + 0xF7, 0xEA, 0x50, 0xF2, 0xE9, 0xE6, 0x38, 0xD7, 0x24, 0xD7, 0x86, 0xB5, + 0x70, 0xD2, 0xDE, 0xB9, 0xC2, 0xCE, 0x16, 0xBF, 0x09, 0xCE, 0x80, 0xB1, + 0xAD, 0xEF, 0x7F, 0xC7, 0x40, 0x12, 0x9C, 0xE7, 0x02, 0x16, 0xA5, 0xF4, + 0x3D, 0x11, 0x67, 0x05, 0xCB, 0x1B, 0x0B, 0x10, 0x9B, 0x20, 0x88, 0x01, + 0x03, 0x11, 0xF3, 0xE7, 0x44, 0xFF, 0x70, 0xD4, 0x94, 0xED, 0xEA, 0xC3, + 0xE3, 0xD7, 0x10, 0xB2, 0x6A, 0xCA, 0x6D, 0xAC, 0xC5, 0xCF, 0xAD, 0xB2, + 0x8B, 0xE7, 0xB5, 0xBE, 0xC0, 0x10, 0x7C, 0xDE, 0x07, 0x39, 0x6A, 0xFD, + 0x84, 0x4A, 0x95, 0x0D, 0xFB, 0x50, 0x86, 0x1D, 0x8D, 0x5A, 0x17, 0x29, + 0x99, 0x57, 0x4F, 0x2B, 0x2B, 0x36, 0xA0, 0x12, 0x99, 0x11, 0xC1, 0xEB, + 0xD4, 0x07, 0x87, 0xDA, 0x4D, 0x08, 0x81, 0xD6, 0x61, 0x05, 0x33, 0xD5, + 0x87, 0x0C, 0xFA, 0xDD, 0x53, 0x22, 0x99, 0xF4, 0x83, 0x2C, 0x7D, 0x0D, + 0x2A, 0x1B, 0x27, 0x17, 0xD6, 0x0E, 0x46, 0x21, 0x27, 0x0A, 0x29, 0x2C, + 0x50, 0x06, 0x84, 0x29, 0xFE, 0x03, 0xA3, 0x1C, 0x62, 0x09, 0x89, 0x16, + 0x74, 0x20, 0x0F, 0x1A, 0xB4, 0x32, 0xB4, 0x1F, 0x9A, 0x3B, 0xE4, 0x32, + 0x46, 0x3A, 0x7D, 0x44, 0xE2, 0x36, 0x84, 0x45, 0x5C, 0x42, 0x2A, 0x44, + 0xFA, 0x47, 0xA0, 0x3F, 0x75, 0x38, 0xC2, 0x2D, 0x27, 0x23, 0xA7, 0x19, + 0xAA, 0x10, 0x2F, 0x14, 0xA1, 0x07, 0x76, 0x1C, 0x05, 0x03, 0xA6, 0x21, + 0xFC, 0x02, 0x57, 0x23, 0x5F, 0x1B, 0x8A, 0x33, 0x32, 0x34, 0x96, 0x4F, + 0xB0, 0x33, 0xEA, 0x5C, 0x04, 0x32, 0xE5, 0x5A, 0x62, 0x3B, 0xCF, 0x57, + 0x1C, 0x36, 0x3A, 0x44, 0x7B, 0x1B, 0x05, 0x2A, 0x23, 0xFE, 0x62, 0x17, + 0x28, 0xDF, 0x26, 0x01, 0x3B, 0xC9, 0x94, 0xF6, 0x69, 0xC5, 0x9A, 0xFC, + 0xAC, 0xCA, 0x5D, 0x01, 0xAD, 0xDB, 0x80, 0x0B, 0xB8, 0xFE, 0x68, 0x2B, + 0x0E, 0x1D, 0x6F, 0x4A, 0x47, 0x2A, 0xA8, 0x5C, 0x21, 0x2D, 0x90, 0x60, + 0x9B, 0x2B, 0xD6, 0x5A, 0xB5, 0x2B, 0xFF, 0x51, 0xD4, 0x1F, 0x4F, 0x38, + 0x86, 0x0B, 0xEE, 0x1B, 0x00, 0xFF, 0x1C, 0x07, 0x9F, 0xF3, 0xDF, 0xFD, + 0xB0, 0xED, 0x7D, 0x00, 0x5D, 0xF5, 0x17, 0x08, 0xC6, 0xFF, 0x27, 0x13, + 0x3E, 0x0D, 0x7A, 0x19, 0x48, 0x15, 0x57, 0x1E, 0xAB, 0x0C, 0x4F, 0x24, + 0x12, 0x02, 0xBA, 0x25, 0x2B, 0x09, 0xB0, 0x28, 0x63, 0x06, 0xF7, 0x17, + 0x8A, 0xF9, 0x7C, 0x06, 0xAD, 0xFF, 0xD3, 0x13, 0x40, 0x0C, 0xA8, 0x1F, + 0xC7, 0x20, 0xAD, 0x2B, 0xFD, 0x2E, 0xAC, 0x35, 0x82, 0x28, 0x85, 0x2D, + 0xF5, 0x1C, 0xE1, 0x28, 0x2C, 0x0D, 0x6D, 0x27, 0x90, 0xF7, 0x6B, 0x1B, + 0x89, 0xE0, 0x0B, 0x04, 0x97, 0xE0, 0x54, 0xF1, 0x36, 0xF5, 0xB1, 0xEE, + 0x00, 0xF2, 0xEF, 0xE7, 0x85, 0xE7, 0xF0, 0xE5, 0x9E, 0xEB, 0xB6, 0xF5, + 0xDC, 0xEB, 0x57, 0xFD, 0xD9, 0xE9, 0xB6, 0xFF, 0x11, 0xED, 0x37, 0x02, + 0x41, 0xF8, 0xD5, 0xF9, 0xC2, 0xF3, 0x28, 0xEC, 0x07, 0xD5, 0x3F, 0xD1, + 0xB7, 0xB7, 0x55, 0xB5, 0xD4, 0xA4, 0xB2, 0xA8, 0xC2, 0x9C, 0x3C, 0xA2, + 0x5E, 0x9A, 0xC9, 0x9E, 0x7A, 0xA0, 0x04, 0xA4, 0x20, 0xBF, 0xC4, 0xBA, + 0xC1, 0xE5, 0xC6, 0xD6, 0x66, 0x00, 0x98, 0xF4, 0xCC, 0x12, 0x0D, 0x13, + 0xD2, 0x25, 0xCE, 0x1C, 0x1B, 0x31, 0x67, 0x12, 0x06, 0x1F, 0x8B, 0x01, + 0x1B, 0xFA, 0xF7, 0xE4, 0x65, 0xDA, 0xBA, 0xC1, 0x03, 0xC4, 0xAE, 0xB0, + 0x12, 0xB9, 0x78, 0xAA, 0x5F, 0xC7, 0x07, 0xA6, 0xCF, 0xE1, 0x2C, 0xA4, + 0x35, 0xF4, 0x00, 0xA7, 0x76, 0xF7, 0x2B, 0xB6, 0x6C, 0xE8, 0x1E, 0xCD, + 0x9E, 0xDE, 0x64, 0xDC, 0x72, 0xDF, 0x90, 0xD8, 0xDA, 0xE3, 0xE2, 0xD5, + 0x77, 0xDF, 0xBC, 0xD4, 0x8C, 0xDE, 0xA6, 0xD9, 0x77, 0xE8, 0x7E, 0xE6, + 0xD6, 0xF5, 0xB4, 0xEF, 0x98, 0x15, 0x23, 0xFA, 0x61, 0x2E, 0xF1, 0x04, + 0xAF, 0x2A, 0x4D, 0x0D, 0xB7, 0x25, 0xC1, 0x0E, 0x14, 0x1C, 0x88, 0x04, + 0xDA, 0x04, 0x4F, 0xE5, 0x78, 0xFE, 0x84, 0xC8, 0x84, 0x02, 0xED, 0xC8, + 0x9C, 0xF7, 0x9F, 0xCC, 0xC0, 0xEB, 0xBA, 0xCC, 0xDC, 0xF5, 0xA5, 0xDA, + 0x65, 0x0D, 0x5B, 0xEF, 0x4A, 0x1A, 0xEA, 0x01, 0x4F, 0x1A, 0xD0, 0x0A, + 0x40, 0x1A, 0x1D, 0x08, 0x36, 0x22, 0x12, 0x08, 0x13, 0x26, 0x90, 0x02, + 0xE8, 0x14, 0x50, 0xED, 0xE6, 0xF5, 0x41, 0xD9, 0xAE, 0xDC, 0xA6, 0xC4, + 0x83, 0xD0, 0xCD, 0xC0, 0xDB, 0xCB, 0xEE, 0xD0, 0x9C, 0xC9, 0xF8, 0xDA, + 0xEC, 0xDD, 0x6E, 0xF2, 0x7B, 0x12, 0xDE, 0x20, 0x77, 0x3D, 0xC9, 0x4C, + 0x74, 0x4C, 0xCF, 0x5A, 0x84, 0x4E, 0xFD, 0x54, 0x0F, 0x46, 0x5A, 0x56, + 0x59, 0x2C, 0xA2, 0x4B, 0x03, 0x02, 0xDD, 0x2E, 0x1F, 0xE1, 0x4A, 0x0E, + 0xBC, 0xDB, 0xA3, 0xEF, 0xA2, 0xDD, 0xAB, 0xDB, 0x2F, 0xD7, 0xD2, 0xD5, + 0x07, 0xD6, 0x0F, 0xDC, 0x64, 0xE7, 0x7D, 0xEF, 0x3E, 0xF2, 0xF8, 0x08, + 0x99, 0xF8, 0x14, 0x1E, 0x16, 0x05, 0x41, 0x25, 0xAE, 0x05, 0xBF, 0x1E, + 0x94, 0x08, 0x0B, 0x20, 0xD2, 0x06, 0x36, 0x22, 0x9E, 0x00, 0xEE, 0x23, + 0xD7, 0x07, 0x26, 0x2A, 0x79, 0x17, 0xC9, 0x30, 0x11, 0x24, 0x9C, 0x3F, + 0x1A, 0x21, 0xA5, 0x4D, 0x7B, 0x16, 0x85, 0x51, 0xA1, 0x14, 0x97, 0x56, + 0xED, 0x14, 0x02, 0x53, 0x7B, 0x0D, 0x35, 0x37, 0xD9, 0x04, 0x64, 0x19, + 0x1D, 0x01, 0x12, 0x0D, 0xB1, 0xF8, 0x67, 0x0C, 0xDA, 0xEE, 0xA1, 0x0C, + 0x6F, 0xF7, 0xBA, 0x1E, 0x28, 0x06, 0x55, 0x38, 0xEC, 0x0E, 0x77, 0x3F, + 0xCC, 0x20, 0x5F, 0x49, 0x8F, 0x2C, 0xDC, 0x52, 0xF3, 0x22, 0xAE, 0x4E, + 0xA2, 0x10, 0x4B, 0x40, 0x94, 0xF7, 0x59, 0x21, 0x3B, 0xDE, 0x1F, 0xFE, + 0xEE, 0xD3, 0xA8, 0xEB, 0x0E, 0xDF, 0xEA, 0xE0, 0xBE, 0xE4, 0x33, 0xDF, + 0xDB, 0xE1, 0x8D, 0xEF, 0x5E, 0x01, 0xF8, 0x0B, 0xFB, 0x2D, 0xF6, 0x32, + 0xE2, 0x44, 0xFA, 0x4F, 0xEC, 0x4E, 0x7D, 0x5C, 0x8E, 0x54, 0x86, 0x64, + 0x3D, 0x50, 0xE0, 0x59, 0xAA, 0x39, 0x0B, 0x3A, 0x4F, 0x1B, 0xB2, 0x16, + 0xA6, 0x06, 0x03, 0xF7, 0xC1, 0xFB, 0xBD, 0xDC, 0x97, 0xF1, 0x1C, 0xD4, + 0x3D, 0xED, 0x15, 0xE4, 0xE5, 0xF3, 0x3A, 0xF0, 0xFC, 0x04, 0x44, 0xF6, + 0x5D, 0x17, 0x67, 0x03, 0xEC, 0x25, 0x5F, 0x0C, 0x19, 0x1A, 0xF9, 0x11, + 0x96, 0x08, 0x85, 0x1F, 0x5C, 0x11, 0xF9, 0x24, 0x95, 0x15, 0xA1, 0x14, + 0x99, 0x1C, 0x4E, 0x14, 0xEE, 0x2D, 0x08, 0x1E, 0x23, 0x38, 0x35, 0x1F, + 0xB2, 0x36, 0x9D, 0x27, 0xDB, 0x30, 0x8A, 0x25, 0x64, 0x33, 0x9D, 0x1C, + 0x08, 0x2F, 0x3A, 0x1E, 0xCF, 0x14, 0x6B, 0x16, 0x2E, 0xFD, 0x62, 0xFC, + 0x8E, 0xFA, 0xE8, 0xEA, 0xDF, 0xFC, 0x6D, 0xE5, 0x74, 0xF7, 0x81, 0xD9, + 0x79, 0xF7, 0xCF, 0xD0, 0x2D, 0x09, 0xDA, 0xE1, 0xD7, 0x19, 0xBE, 0xF2, + 0xA6, 0x1C, 0xC5, 0xF3, 0x61, 0x1A, 0x72, 0xFE, 0x6D, 0x19, 0x0C, 0x07, + 0xFA, 0x15, 0x9F, 0x05, 0x19, 0x07, 0x04, 0xFF, 0xA7, 0xF9, 0xC0, 0xE5, + 0x7B, 0xF5, 0x01, 0xBD, 0x7A, 0xE1, 0x50, 0xAA, 0x5C, 0xC2, 0x09, 0xB6, + 0x5F, 0xB9, 0x57, 0xC4, 0x23, 0xC5, 0x5B, 0xD7, 0xC1, 0xDF, 0x1B, 0xF1, + 0x9D, 0x0E, 0x12, 0x02, 0x59, 0x36, 0xA0, 0x0F, 0x55, 0x3C, 0xB2, 0x20, + 0x15, 0x36, 0x88, 0x27, 0xFA, 0x2C, 0x1A, 0x1C, 0x74, 0x0E, 0xCD, 0xFC, + 0x3B, 0xE6, 0xA2, 0xD5, 0x2B, 0xCA, 0x6F, 0xBE, 0xFC, 0xB6, 0x6D, 0xBA, + 0xC1, 0xA4, 0x8D, 0xBB, 0x6B, 0xA6, 0xF1, 0xB4, 0x96, 0xB8, 0x14, 0xB1, + 0x1C, 0xC9, 0xDF, 0xC1, 0xF8, 0xD6, 0x43, 0xD2, 0x80, 0xDF, 0xC9, 0xE3, + 0xF1, 0xDC, 0x56, 0xF7, 0xE4, 0xD7, 0x26, 0xF9, 0x5A, 0xD7, 0xDE, 0xEC, + 0x91, 0xD7, 0x74, 0xDF, 0xD0, 0xE1, 0x91, 0xE2, 0x57, 0xE9, 0x8E, 0xDE, + 0xD0, 0xE7, 0xF8, 0xD8, 0x61, 0xE4, 0xA3, 0xE8, 0xFE, 0xDC, 0x69, 0xE9, + 0x6E, 0xD4, 0xC8, 0xDF, 0xA8, 0xD0, 0xD2, 0xE3, 0x35, 0xC7, 0x88, 0xDA, + 0xB0, 0xBD, 0x62, 0xBD, 0x4C, 0xC3, 0x3E, 0xAC, 0xAF, 0xCD, 0xAA, 0xB2, + 0xFB, 0xCB, 0x59, 0xBC, 0x68, 0xBF, 0x5F, 0xBF, 0x6B, 0xCB, 0x94, 0xCD, + 0xB4, 0xE1, 0xA1, 0xE7, 0xB1, 0xE9, 0x2E, 0xFE, 0x81, 0xF5, 0x15, 0x0F, + 0xAD, 0x06, 0xFB, 0x15, 0x86, 0x11, 0xB8, 0x05, 0x96, 0x06, 0x39, 0xE6, + 0x6B, 0xE4, 0x70, 0xCD, 0x91, 0xC4, 0xA8, 0xBB, 0x96, 0xB5, 0xE7, 0xAD, + 0x3B, 0xA6, 0x92, 0xAF, 0x64, 0xA0, 0xC4, 0xBF, 0xA4, 0xBB, 0xDD, 0xD3, + 0x05, 0xE3, 0xC2, 0xF2, 0x3D, 0xFE, 0x86, 0x19, 0x71, 0x11, 0x6F, 0x37, + 0x89, 0x21, 0xE6, 0x4A, 0x1E, 0x28, 0x0A, 0x4C, 0x5A, 0x25, 0xF4, 0x35, + 0xBB, 0x13, 0x61, 0x13, 0xE5, 0xF6, 0x39, 0xEF, 0x8B, 0xE6, 0x7A, 0xD6, + 0x55, 0xDA, 0x69, 0xCD, 0x30, 0xCF, 0xEB, 0xCF, 0x6B, 0xD9, 0x40, 0xD8, + 0x9B, 0xED, 0x92, 0xE5, 0x5D, 0xFE, 0x82, 0xFE, 0x43, 0x05, 0x58, 0x15, + 0x7C, 0x08, 0x39, 0x20, 0xBC, 0x06, 0x9B, 0x24, 0xA3, 0x08, 0x8A, 0x27, + 0x4E, 0x13, 0xA6, 0x1C, 0x9D, 0x18, 0x85, 0x13, 0xEF, 0x29, 0x94, 0x1E, + 0x7A, 0x3B, 0x9D, 0x22, 0xBE, 0x3A, 0x01, 0x27, 0x1A, 0x2F, 0x49, 0x34, + 0xDE, 0x21, 0x46, 0x33, 0x73, 0x26, 0xF9, 0x2D, 0xB6, 0x30, 0xE7, 0x2E, + 0x38, 0x21, 0x29, 0x25, 0x88, 0x01, 0xEB, 0x0F, 0xEF, 0xF6, 0x76, 0x02, + 0x56, 0x07, 0x8C, 0x04, 0x06, 0x0E, 0xC2, 0x06, 0xE0, 0x06, 0x40, 0x07, + 0x57, 0x16, 0xBB, 0x13, 0x6B, 0x2E, 0xBC, 0x24, 0xFB, 0x3B, 0x06, 0x34, + 0x96, 0x47, 0x96, 0x39, 0x11, 0x4F, 0xE4, 0x32, 0x85, 0x4E, 0xE6, 0x28, + 0xCB, 0x39, 0x14, 0x0D, 0x1D, 0x11, 0xA5, 0xED, 0x99, 0xED, 0x17, 0xDF, + 0x1D, 0xE3, 0xAE, 0xD4, 0xF0, 0xEA, 0x3A, 0xD0, 0x14, 0xF1, 0xF2, 0xDA, + 0x9B, 0xFB, 0xA9, 0xF2, 0x6C, 0x1E, 0x5D, 0x19, 0x86, 0x44, 0x1E, 0x44, + 0xB3, 0x56, 0x32, 0x5C, 0x86, 0x60, 0xC2, 0x5E, 0x5C, 0x65, 0xC7, 0x58, + 0x20, 0x5B, 0x91, 0x55, 0x74, 0x41, 0x82, 0x3F, 0xA4, 0x27, 0xEE, 0x19, + 0xD5, 0x1A, 0x73, 0x05, 0x21, 0x15, 0x89, 0xF8, 0xC2, 0x10, 0x72, 0xF2, + 0x17, 0x07, 0x4A, 0xFB, 0x9A, 0x0A, 0xDF, 0x0E, 0x19, 0x20, 0xDF, 0x20, + 0xA9, 0x27, 0xA4, 0x27, 0x55, 0x28, 0x0A, 0x2E, 0x4F, 0x25, 0x7E, 0x2D, + 0x1B, 0x1D, 0xF8, 0x2F, 0x26, 0x12, 0x10, 0x2C, 0xA9, 0x0F, 0xD0, 0x1B, + 0xFC, 0x18, 0xAC, 0x21, 0x45, 0x1B, 0xDB, 0x2F, 0xDE, 0x1F, 0xCB, 0x32, + 0x1B, 0x28, 0x1D, 0x31, 0x6E, 0x22, 0xAF, 0x26, 0x94, 0x18, 0x31, 0x15, + 0xD9, 0x13, 0x40, 0x09, 0xD9, 0xFB, 0xA8, 0xFB, 0xCC, 0xD6, 0x04, 0xEB, + 0xC5, 0xCE, 0xBE, 0xE3, 0x36, 0xE3, 0xB9, 0xDD, 0x8D, 0xEB, 0xDF, 0xD0, + 0xEF, 0xE2, 0x74, 0xD5, 0x6E, 0xDD, 0xEF, 0xFD, 0xD3, 0xD9, 0x0B, 0x1C, + 0xB4, 0xE2, 0x63, 0x17, 0xC1, 0xF5, 0xEE, 0x11, 0x88, 0xFA, 0x36, 0x10, + 0xDB, 0xEC, 0x53, 0x03, 0x42, 0xD6, 0xA0, 0xE7, 0x5A, 0xBC, 0xE9, 0xBF, + 0x83, 0xA8, 0x1D, 0xA3, 0x52, 0x9F, 0xB3, 0x9D, 0x98, 0x9A, 0xC2, 0xA4, + 0xD6, 0x9A, 0x01, 0xBC, 0xA9, 0xA5, 0xF9, 0xDC, 0x77, 0xC1, 0x06, 0xFB, + 0x31, 0xE3, 0x75, 0x16, 0x2A, 0xF9, 0x58, 0x27, 0x06, 0x01, 0x07, 0x2B, + 0xA6, 0xF8, 0x36, 0x20, 0xE2, 0xEC, 0x5A, 0x0C, 0x60, 0xDD, 0x5C, 0xED, + 0xD7, 0xBF, 0x83, 0xC5, 0xA8, 0xA8, 0x59, 0xB3, 0x26, 0x9E, 0x56, 0xB3, + 0xF8, 0xA3, 0x02, 0xAF, 0x86, 0xB3, 0x96, 0xA8, 0x08, 0xC5, 0x05, 0xB6, + 0xCA, 0xD5, 0x1A, 0xCF, 0x49, 0xD9, 0x28, 0xDB, 0x7D, 0xD1, 0x77, 0xE2, + 0xBA, 0xCD, 0xAA, 0xE6, 0x04, 0xDA, 0x42, 0xE2, 0xBA, 0xDE, 0x8B, 0xD6, + 0xC3, 0xE7, 0x1D, 0xD8, 0x6D, 0x00, 0xE0, 0xE4, 0x74, 0x0D, 0x23, 0xED, + 0xA6, 0x13, 0x8B, 0xF5, 0xC4, 0x19, 0x9D, 0xFA, 0x53, 0x13, 0x40, 0xFD, + 0xB9, 0x07, 0x9B, 0xFD, 0x1E, 0x04, 0x61, 0xF8, 0x67, 0xFB, 0xA6, 0xE5, + 0xF7, 0xEF, 0x18, 0xCC, 0xBF, 0xEF, 0xC6, 0xC4, 0x2C, 0xF5, 0xCA, 0xCB, + 0x9F, 0xF7, 0xD6, 0xC8, 0x36, 0x01, 0x2C, 0xD1, 0x41, 0x0A, 0x08, 0xF1, + 0x45, 0x03, 0xFB, 0x05, 0xF9, 0x06, 0xBA, 0x09, 0x46, 0x1C, 0xA0, 0x09, + 0x96, 0x24, 0x3C, 0x0D, 0xC2, 0x12, 0x9A, 0x04, 0x79, 0xFA, 0x12, 0xE5, + 0x12, 0xEB, 0xB2, 0xC9, 0x90, 0xDE, 0x1D, 0xBE, 0x60, 0xD6, 0x49, 0xB7, + 0x53, 0xD8, 0xDB, 0xBD, 0xDB, 0xE9, 0x57, 0xD5, 0x11, 0x11, 0xB0, 0xF3, + 0x20, 0x3C, 0xBE, 0x1B, 0xDD, 0x4F, 0x8E, 0x3D, 0x39, 0x58, 0x43, 0x4A, + 0x7D, 0x5E, 0x31, 0x4A, 0x42, 0x53, 0x39, 0x44, 0xC0, 0x3C, 0x37, 0x38, + 0x06, 0x1B, 0xDF, 0x18, 0x7A, 0xFF, 0x19, 0xF8, 0xCB, 0xFF, 0x88, 0xED, + 0x26, 0x07, 0xB4, 0xEE, 0xD8, 0x0E, 0x85, 0xF5, 0x7F, 0x14, 0xC0, 0xF9, + 0x98, 0x1B, 0xB8, 0x08, 0xED, 0x24, 0x1B, 0x21, 0xB5, 0x2D, 0x6A, 0x33, + 0xF3, 0x34, 0xFA, 0x3D, 0x06, 0x33, 0x48, 0x40, 0xB2, 0x2E, 0xB8, 0x41, + 0x92, 0x26, 0x73, 0x39, 0x7E, 0x27, 0x90, 0x3B, 0x16, 0x30, 0x9E, 0x45, + 0x54, 0x34, 0x93, 0x45, 0xD6, 0x36, 0xC3, 0x51, 0x9F, 0x35, 0x46, 0x57, + 0x70, 0x38, 0x94, 0x47, 0x92, 0x3B, 0xDE, 0x42, 0x21, 0x33, 0x85, 0x36, + 0x0A, 0x26, 0x5E, 0x0D, 0x93, 0x1D, 0xEF, 0xF5, 0x5D, 0x1C, 0x66, 0xFC, + 0xEA, 0x1A, 0xC5, 0x05, 0x68, 0x0A, 0x0E, 0x04, 0x39, 0x0D, 0x32, 0x09, + 0xC6, 0x27, 0x7F, 0x1E, 0x05, 0x28, 0xE9, 0x28, 0x52, 0x1A, 0x1D, 0x2A, + 0x3B, 0x21, 0xBE, 0x2E, 0xE7, 0x30, 0x32, 0x27, 0xEA, 0x26, 0x70, 0x0A, + 0xDF, 0x07, 0x7D, 0xEB, 0xC8, 0xED, 0xD8, 0xCE, 0xA0, 0xDB, 0xA1, 0xBE, + 0x6F, 0xD0, 0xE8, 0xC9, 0xD2, 0xD2, 0x5E, 0xDB, 0x48, 0xE5, 0xF1, 0xEF, + 0xE9, 0x03, 0x76, 0x16, 0x67, 0x2C, 0xC0, 0x42, 0x06, 0x4B, 0x2B, 0x59, + 0x34, 0x56, 0xD3, 0x57, 0xAB, 0x4F, 0x35, 0x4A, 0x9F, 0x35, 0x51, 0x36, + 0x80, 0x14, 0x5A, 0x1F, 0x3C, 0xF2, 0x10, 0x01, 0xDC, 0xD5, 0xE4, 0xE3, + 0x97, 0xCC, 0xF8, 0xD2, 0x15, 0xCE, 0x8D, 0xD2, 0x43, 0xC5, 0x69, 0xDF, + 0x85, 0xBF, 0xDD, 0xF3, 0x50, 0xD1, 0x78, 0x0B, 0x73, 0xE4, 0xC7, 0x10, + 0x6C, 0xED, 0x4D, 0x06, 0x3D, 0xE7, 0x5C, 0xFF, 0xF4, 0xDE, 0xB5, 0x05, + 0x35, 0xE4, 0x40, 0x0B, 0xD9, 0xE1, 0xB5, 0xFC, 0xF5, 0xEB, 0x92, 0xF6, + 0x4B, 0x00, 0xF6, 0xFB, 0x04, 0x03, 0x33, 0x09, 0x16, 0x01, 0x75, 0x24, + 0xA3, 0xF7, 0x61, 0x2A, 0xB4, 0xED, 0xE8, 0x1A, 0x68, 0xEE, 0xF9, 0x13, + 0x4C, 0xE0, 0x40, 0x0B, 0x80, 0xC7, 0x3E, 0xF3, 0xDD, 0xC0, 0x5D, 0xE0, + 0xBE, 0xC3, 0xFF, 0xDA, 0xE1, 0xC5, 0xD7, 0xD3, 0x22, 0xC8, 0x80, 0xCF, + 0xE5, 0xD8, 0x7E, 0xE2, 0x7E, 0xF3, 0xD1, 0xF8, 0x42, 0xF8, 0x72, 0x00, + 0x19, 0xF3, 0x30, 0x08, 0xB6, 0xF1, 0x16, 0x0A, 0x80, 0xE7, 0x47, 0xFD, + 0x3E, 0xD1, 0x59, 0xE3, 0x45, 0xB5, 0x8D, 0xCA, 0x52, 0xA3, 0xC4, 0xB6, + 0x1A, 0xAC, 0x63, 0xA4, 0x76, 0xBC, 0x35, 0xA8, 0x5E, 0xC0, 0xED, 0xBF, + 0x41, 0xCE, 0x3C, 0xDA, 0xC1, 0xF0, 0xD3, 0xFD, 0xF8, 0x19, 0x05, 0x1F, + 0x1D, 0x3B, 0x2C, 0x29, 0xAE, 0x47, 0x39, 0x28, 0x3B, 0x35, 0x4D, 0x1B, + 0xFC, 0x19, 0x35, 0x05, 0x21, 0x05, 0x51, 0xE8, 0x15, 0xE9, 0x82, 0xC0, + 0xB8, 0xD2, 0x4F, 0xAA, 0xAC, 0xC9, 0xCF, 0xAE, 0x95, 0xCE, 0xCD, 0xBB, + 0xBA, 0xE5, 0x65, 0xC1, 0x14, 0xFF, 0x46, 0xC4, 0x3F, 0x0F, 0x08, 0xD8, + 0x2F, 0x15, 0xE7, 0xE6, 0xD1, 0x19, 0x7D, 0xE8, 0x01, 0x19, 0x78, 0xEF, + 0xF1, 0x11, 0x7F, 0xF3, 0xC7, 0x13, 0x99, 0xED, 0x86, 0x18, 0x67, 0xE4, + 0x36, 0x24, 0x38, 0xE7, 0xA7, 0x35, 0x0A, 0xF4, 0x7C, 0x3C, 0x4D, 0x02, + 0xDB, 0x3A, 0x96, 0x11, 0xE7, 0x34, 0x00, 0x16, 0xB0, 0x28, 0xD6, 0x0D, + 0xC2, 0x1E, 0xEB, 0x06, 0x13, 0x10, 0x4D, 0xFA, 0xE1, 0xF4, 0xB9, 0xE3, + 0x6F, 0xE9, 0xBD, 0xDD, 0x28, 0xF2, 0xED, 0xE6, 0xD8, 0xF3, 0x60, 0xE9, + 0x18, 0xF0, 0x57, 0xEB, 0xD7, 0x03, 0x39, 0x04, 0x73, 0x18, 0xF3, 0x24, + 0x09, 0x17, 0x8C, 0x30, 0xE2, 0x20, 0xDD, 0x2E, 0xB9, 0x2D, 0xB3, 0x27, + 0x47, 0x25, 0x28, 0x1B, 0x8E, 0x14, 0x6F, 0x00, 0x82, 0x01, 0xBB, 0xE1, + 0x2E, 0xE5, 0xC1, 0xD9, 0x7D, 0xD1, 0x71, 0xE0, 0xD8, 0xD0, 0xE3, 0xE8, + 0x68, 0xDD, 0x4A, 0x02, 0x95, 0x01, 0x10, 0x28, 0x7E, 0x30, 0xF5, 0x42, + 0x0F, 0x4B, 0x25, 0x58, 0x21, 0x56, 0x3C, 0x65, 0xA8, 0x5C, 0x59, 0x61, + 0x59, 0x4F, 0x59, 0x55, 0xD6, 0x35, 0x2E, 0x41, 0xBD, 0x1B, 0x41, 0x20, + 0xFA, 0xFC, 0x66, 0x01, 0x76, 0xE7, 0x89, 0xF7, 0x64, 0xE7, 0xA6, 0xFD, + 0xBB, 0xF0, 0x31, 0x04, 0x2E, 0xF3, 0xB0, 0x0A, 0x08, 0xFB, 0x72, 0x19, + 0x1D, 0x07, 0x0D, 0x29, 0xFD, 0xFE, 0xBD, 0x2E, 0x5B, 0xFC, 0x35, 0x2F, + 0x24, 0x05, 0xFC, 0x1E, 0xDF, 0x04, 0x62, 0x0D, 0xC1, 0xFF, 0xD9, 0x00, + 0x92, 0x01, 0x0E, 0xF6, 0x5A, 0x0F, 0x22, 0x03, 0x08, 0x16, 0xE5, 0x13, + 0xC5, 0x17, 0x99, 0x1D, 0x20, 0x1B, 0x0D, 0x23, 0x87, 0x10, 0x30, 0x1D, + 0x0D, 0xFE, 0x18, 0x13, 0x1D, 0xF5, 0x28, 0x0B, 0xC0, 0xE9, 0x4C, 0xFD, + 0x7D, 0xDD, 0x22, 0xE3, 0x55, 0xE8, 0x43, 0xD5, 0xF5, 0xF1, 0xA9, 0xDB, + 0xE1, 0xE5, 0x4E, 0xDA, 0x95, 0xE4, 0xB7, 0xDA, 0xF9, 0xFA, 0xA2, 0xFB, + 0xBE, 0x02, 0xB2, 0x12, 0x0C, 0xFB, 0x67, 0x10, 0x9D, 0xFF, 0x67, 0x19, + 0x25, 0x08, 0x8A, 0x1D, 0xBF, 0x08, 0x4C, 0x04, 0xB7, 0xFA, 0x48, 0xDA, + 0x34, 0xDF, 0x4E, 0xBD, 0xDD, 0xC5, 0x57, 0xB8, 0xF8, 0xB8, 0x3F, 0xC2, + 0x7A, 0xB9, 0xC3, 0xCE, 0x0C, 0xD0, 0x32, 0xDE, 0xEA, 0xF8, 0x1B, 0xFA, + 0x73, 0x14, 0xA7, 0x21, 0x1C, 0x18, 0xF7, 0x46, 0x2D, 0x22, 0xEF, 0x58, + 0xE2, 0x31, 0xD9, 0x4A, 0x1B, 0x2A, 0xE7, 0x24, 0x53, 0x11, 0x11, 0x03, + 0x58, 0xF1, 0x5C, 0xE8, 0x7D, 0xCC, 0x8A, 0xCE, 0xE8, 0xB7, 0xF2, 0xBA, + 0x5A, 0xC1, 0x1B, 0xB1, 0x2C, 0xD9, 0xBD, 0xB5, 0x5B, 0xEA, 0xEB, 0xC7, + 0x42, 0xFA, 0xA9, 0xE1, 0xDC, 0x0A, 0x9E, 0xF5, 0xD1, 0x0A, 0xBD, 0xFF, + 0xF1, 0x00, 0xA2, 0x06, 0xC8, 0xFD, 0x44, 0x03, 0xBE, 0x01, 0xE8, 0xFB, + 0x01, 0x00, 0x91, 0xFB, 0x95, 0x03, 0x07, 0x01, 0x6D, 0x0F, 0xB2, 0xFE, + 0xDD, 0x13, 0xE1, 0xFD, 0x85, 0x1D, 0x98, 0x0C, 0xFF, 0x25, 0x31, 0x15, + 0xC8, 0x1F, 0xCE, 0x14, 0xD3, 0x1A, 0x78, 0x0F, 0xA2, 0x20, 0x84, 0x03, + 0xC3, 0x0F, 0x27, 0xEC, 0xAF, 0xEE, 0x77, 0xD9, 0xCF, 0xE8, 0xDF, 0xDF, + 0xF3, 0xEE, 0xD2, 0xE7, 0x03, 0xEA, 0x29, 0xE1, 0x61, 0xF1, 0x6C, 0xE9, + 0x1B, 0x0B, 0xAA, 0x0E, 0x14, 0x0B, 0xA5, 0x27, 0x07, 0x06, 0x31, 0x27, + 0x42, 0x18, 0xEE, 0x1C, 0x5E, 0x23, 0x5D, 0x11, 0x07, 0x19, 0x95, 0xFD, + 0x66, 0xFE, 0x24, 0xE1, 0x1B, 0xE4, 0x9F, 0xC9, 0xF7, 0xD8, 0xEC, 0xBC, + 0xEB, 0xD3, 0x11, 0xBF, 0xBA, 0xD1, 0x9B, 0xC8, 0xA2, 0xE7, 0xDC, 0xE1, + 0x54, 0x0B, 0x22, 0x0E, 0x97, 0x28, 0x3B, 0x33, 0x73, 0x40, 0xA6, 0x3F, + 0x58, 0x50, 0xE6, 0x3C, 0x74, 0x49, 0x11, 0x2E, 0x9C, 0x33, 0x94, 0x14, + 0xA8, 0x22, 0x6F, 0xF9, 0x1F, 0x04, 0xB6, 0xDF, 0xE9, 0xE2, 0xA7, 0xCB, + 0x00, 0xDF, 0xDC, 0xBF, 0x1A, 0xEA, 0x8B, 0xC7, 0xB0, 0xF5, 0x68, 0xDA, + 0xEC, 0x03, 0x64, 0xE8, 0x57, 0x12, 0x76, 0x00, 0x6D, 0x16, 0xA2, 0x14, + 0x0F, 0x16, 0x15, 0x0C, 0x1A, 0x12, 0x7B, 0xFA, 0xC1, 0xFE, 0xAF, 0xF7, + 0xD1, 0xF1, 0xF7, 0xFA, 0x0C, 0xED, 0x93, 0xF2, 0x7D, 0xE7, 0x02, 0xFD, + 0xD9, 0xEA, 0x51, 0x11, 0x60, 0xF8, 0x4F, 0x0E, 0x53, 0x03, 0xC6, 0x14, + 0x7D, 0x02, 0x90, 0x1D, 0x73, 0xF7, 0xD0, 0x10, 0xD2, 0xE3, 0x1E, 0x09, + 0x64, 0xD4, 0xBF, 0x02, 0xF4, 0xCC, 0x60, 0xE7, 0xE2, 0xCF, 0xE3, 0xD5, + 0x29, 0xDF, 0x74, 0xE2, 0x0E, 0xE6, 0xAB, 0xEA, 0xA9, 0xDB, 0xDA, 0xE5, + 0x30, 0xDC, 0x3D, 0xF9, 0x9C, 0xEB, 0x23, 0x1F, 0x34, 0xEC, 0x43, 0x2E, + 0x64, 0xEA, 0xCD, 0x33, 0xEF, 0xF6, 0x37, 0x38, 0x05, 0xFA, 0x39, 0x27, + 0xC5, 0xE7, 0xF8, 0x0D, 0x78, 0xD9, 0x2A, 0xF4, 0x97, 0xD5, 0x63, 0xD8, + 0xAA, 0xCE, 0x10, 0xCE, 0x40, 0xC9, 0x1F, 0xD6, 0xC4, 0xCD, 0xC7, 0xE9, + 0xCE, 0xE2, 0x10, 0x11, 0x51, 0x01, 0xFA, 0x36, 0x06, 0x1E, 0xB1, 0x4B, + 0xD0, 0x34, 0x75, 0x5C, 0xA6, 0x3C, 0xBB, 0x62, 0x8F, 0x2C, 0x32, 0x51, + 0xBB, 0x13, 0x6F, 0x39, 0x47, 0xFA, 0xD2, 0x23, 0xB7, 0xDA, 0xFA, 0xFC, + 0x7D, 0xC6, 0x24, 0xD6, 0xDD, 0xC7, 0x55, 0xD4, 0x8A, 0xD7, 0x34, 0xE3, + 0x20, 0xEF, 0xCB, 0xE8, 0x27, 0x08, 0x46, 0xF5, 0x2C, 0x17, 0x95, 0x0A, + 0xA3, 0x0F, 0xF9, 0x0E, 0x4E, 0x05, 0x13, 0x07, 0xB1, 0x03, 0xA4, 0x00, + 0xC0, 0x01, 0x1E, 0xF9, 0x24, 0x00, 0x8F, 0xF0, 0x76, 0xFA, 0x1D, 0xEB, + 0x76, 0x07, 0x5F, 0xF9, 0x55, 0x23, 0xCD, 0x07, 0x43, 0x31, 0xCA, 0x0B, + 0xC9, 0x39, 0xD0, 0x13, 0x1B, 0x3C, 0x26, 0x16, 0x69, 0x2B, 0xA4, 0x0D, + 0x0D, 0x1A, 0xE5, 0x0E, 0x17, 0x11, 0x53, 0x0C, 0x46, 0x0D, 0x11, 0xE7, + 0x09, 0x18, 0x34, 0xCE, 0xB6, 0x1E, 0xE2, 0xD9, 0x5C, 0x15, 0xCA, 0xE5, + 0xA9, 0x0A, 0x35, 0xED, 0xE9, 0x19, 0x8F, 0x04, 0xFA, 0x33, 0x73, 0x15, + 0x96, 0x31, 0x69, 0x10, 0x28, 0x2E, 0xEA, 0x1B, 0x3B, 0x2C, 0x73, 0x2D, + 0xAB, 0x1D, 0x1E, 0x22, 0x45, 0x13, 0x33, 0xFE, 0x29, 0x05, 0x25, 0xDC, + 0xCD, 0xF6, 0x55, 0xC7, 0x89, 0xF1, 0x75, 0xBF, 0x06, 0xE7, 0xEC, 0xCE, + 0xD1, 0xE8, 0x8B, 0xE8, 0x4A, 0x08, 0xA6, 0x02, 0x8B, 0x2A, 0x61, 0x21, + 0x78, 0x42, 0x38, 0x3A, 0xDA, 0x59, 0x8B, 0x48, 0x30, 0x5F, 0x5C, 0x44, + 0x55, 0x41, 0xC7, 0x24, 0xD0, 0x24, 0xE9, 0x00, 0x30, 0x15, 0xEA, 0xEA, + 0xEE, 0xF3, 0xCC, 0xDC, 0xA7, 0xDB, 0x2A, 0xD9, 0x86, 0xE4, 0xBF, 0xE1, + 0xE3, 0xF2, 0x8E, 0xF1, 0xB5, 0xFE, 0xD6, 0xFE, 0x0C, 0x08, 0xBB, 0x09, + 0x7F, 0x0B, 0x48, 0x15, 0xE5, 0x0A, 0xB5, 0x0D, 0xED, 0x10, 0x03, 0xFF, + 0xF0, 0x10, 0xE3, 0xF0, 0xA7, 0x03, 0x36, 0xE9, 0x90, 0xF1, 0x82, 0xED, + 0xA2, 0xE7, 0x76, 0xF3, 0x67, 0xFC, 0x1E, 0x00, 0x45, 0x0F, 0x2D, 0x07, + 0x41, 0x09, 0xEF, 0x10, 0x3E, 0x00, 0xA2, 0x22, 0x0F, 0xF4, 0x29, 0x23, + 0x19, 0xE6, 0xC0, 0x17, 0xBA, 0xE7, 0xBE, 0x0A, 0xAC, 0xE3, 0x2B, 0xEE, + 0x50, 0xCF, 0x81, 0xD6, 0x9F, 0xD1, 0x7F, 0xD5, 0xC4, 0xE4, 0x5D, 0xD7, + 0x4C, 0xE4, 0xFB, 0xD6, 0xD2, 0xDE, 0x74, 0xDB, 0xFF, 0xEA, 0x9B, 0xED, + 0x29, 0xE7, 0x72, 0xFC, 0xAC, 0xDB, 0xD5, 0x02, 0x22, 0xE6, 0x21, 0x0C, + 0x84, 0xE6, 0x15, 0x07, 0x31, 0xDE, 0xFB, 0xF2, 0x29, 0xDD, 0x95, 0xD4, + 0xBA, 0xD3, 0xE6, 0xAE, 0x0A, 0xC2, 0x63, 0xA3, 0xF9, 0xB6, 0x36, 0xB0, + 0x16, 0xB5, 0xA1, 0xB9, 0x90, 0xC3, 0xF7, 0xCF, 0xD2, 0xE7, 0xFA, 0xF0, + 0x4A, 0x08, 0xE8, 0x07, 0xC2, 0x1C, 0x26, 0x24, 0x3C, 0x2F, 0xA4, 0x39, + 0x14, 0x2A, 0x65, 0x2D, 0xF1, 0x0A, 0xA0, 0x0F, 0xE0, 0xF3, 0xD5, 0xF0, + 0x46, 0xE6, 0x77, 0xD0, 0x30, 0xD0, 0x5F, 0xB6, 0xFF, 0xBF, 0x87, 0xB2, + 0x04, 0xBE, 0x95, 0xC2, 0x56, 0xC2, 0x32, 0xDA, 0x1B, 0xCD, 0x15, 0xF1, + 0x6C, 0xDE, 0x48, 0xFF, 0xDC, 0xEB, 0x76, 0x07, 0xAE, 0xE3, 0xC3, 0x08, + 0x90, 0xD2, 0x84, 0xFD, 0x87, 0xC4, 0xD8, 0xE9, 0x32, 0xBD, 0xB7, 0xDF, + 0x69, 0xC0, 0xA5, 0xDB, 0x61, 0xD3, 0xD2, 0xDF, 0xDC, 0xEE, 0xB4, 0xF5, + 0x43, 0xFA, 0xAF, 0x06, 0x8D, 0x01, 0x40, 0x12, 0xCA, 0x08, 0x6D, 0x1D, + 0x7B, 0xFA, 0x9A, 0x17, 0x85, 0xEB, 0x1C, 0x0B, 0xBC, 0xE9, 0xF0, 0x04, + 0xD7, 0xDB, 0x77, 0xF6, 0xD9, 0xD4, 0xE8, 0xE7, 0x95, 0xE6, 0x16, 0xF1, + 0x29, 0xED, 0xC1, 0xFE, 0xEB, 0xEC, 0xCB, 0xFB, 0xF6, 0xFF, 0x7D, 0x00, + 0xDB, 0x14, 0x81, 0x18, 0xFC, 0x0F, 0x04, 0x2A, 0x94, 0x0B, 0x0B, 0x34, + 0xA2, 0x1B, 0x2B, 0x3A, 0x13, 0x24, 0xC1, 0x31, 0x7B, 0x21, 0x96, 0x24, + 0xEE, 0x13, 0x7D, 0x15, 0xBA, 0xFE, 0xEB, 0x01, 0x83, 0xF7, 0x7B, 0xF6, + 0x9C, 0xF1, 0x8F, 0xF9, 0xCA, 0xEB, 0x41, 0x00, 0x02, 0x02, 0x9C, 0x12, + 0x71, 0x21, 0x5E, 0x38, 0xD4, 0x39, 0xB3, 0x51, 0xB9, 0x54, 0x12, 0x5B, + 0xE2, 0x63, 0x47, 0x61, 0x2C, 0x5A, 0xC8, 0x4B, 0xE6, 0x43, 0xEF, 0x24, + 0x95, 0x2A, 0x1D, 0x0F, 0x7A, 0x15, 0x09, 0xF8, 0xB4, 0x0B, 0xF1, 0xD9, + 0xE7, 0x07, 0x5F, 0xDF, 0xB2, 0x0B, 0x8E, 0x01, 0xC9, 0x25, 0x75, 0x1A, + 0x39, 0x47, 0x82, 0x22, 0x34, 0x57, 0xD5, 0x21, 0x00, 0x53, 0x6A, 0x1B, + 0x3E, 0x3D, 0x26, 0x16, 0xFE, 0x24, 0xC2, 0x16, 0xF3, 0x22, 0x59, 0x0B, + 0xE6, 0x32, 0xD7, 0xFC, 0x1B, 0x35, 0x59, 0xFE, 0x6D, 0x3F, 0xEC, 0x13, + 0x13, 0x58, 0xAF, 0x2E, 0xA7, 0x5C, 0x30, 0x3D, 0x31, 0x5A, 0x83, 0x43, + 0xAA, 0x59, 0xF5, 0x3E, 0xD4, 0x42, 0xB0, 0x2A, 0x95, 0x29, 0x28, 0x1C, + 0xA3, 0x19, 0x68, 0x16, 0x3C, 0x01, 0x0C, 0x08, 0x04, 0x01, 0xC2, 0xFE, + 0xDA, 0x1C, 0xE4, 0x01, 0xDA, 0x21, 0x34, 0xFF, 0x26, 0x14, 0xBD, 0xFF, + 0xA3, 0x15, 0x7A, 0x15, 0xE7, 0x0E, 0x5A, 0x21, 0xCF, 0xF4, 0x3A, 0x14, + 0x74, 0xF7, 0xE2, 0x0F, 0xED, 0x0D, 0xE6, 0x18, 0x19, 0x10, 0x00, 0x16, + 0xD1, 0x08, 0x51, 0xFF, 0xA2, 0xFD, 0x13, 0xE2, 0xE7, 0xEA, 0x38, 0xC5, + 0x90, 0xDA, 0xAB, 0xAF, 0x74, 0xCB, 0xD0, 0xB4, 0x8A, 0xC5, 0x12, 0xD5, + 0x61, 0xDE, 0x0B, 0xF9, 0x9E, 0x03, 0xBD, 0x14, 0xEB, 0x16, 0xD1, 0x32, + 0x84, 0x20, 0xCA, 0x4F, 0x26, 0x19, 0x77, 0x4A, 0xB4, 0xFF, 0xF3, 0x1F, + 0xE0, 0xEF, 0x0A, 0xED, 0x5A, 0xDF, 0x7A, 0xC5, 0x82, 0xC3, 0xA9, 0xAF, + 0xA2, 0xB6, 0xCC, 0xAC, 0x47, 0xBF, 0x94, 0xBB, 0xC9, 0xCB, 0x1E, 0xD1, + 0x96, 0xD9, 0x42, 0xE4, 0xD9, 0xDE, 0x59, 0xEF, 0xF7, 0xD5, 0xB9, 0xF1, + 0x6F, 0xC5, 0x5A, 0xE9, 0xB1, 0xB7, 0x0B, 0xDF, 0x4B, 0xAA, 0xD9, 0xCC, + 0x0F, 0xA4, 0xA6, 0xBE, 0xF1, 0xB0, 0xCD, 0xC9, 0xFA, 0xBC, 0x68, 0xD9, + 0xEA, 0xCC, 0x6B, 0xF3, 0xD3, 0xEA, 0x83, 0x08, 0x96, 0xFD, 0x82, 0x05, + 0x0B, 0xF4, 0x09, 0x03, 0x2E, 0xDB, 0x9D, 0xF4, 0xC3, 0xC0, 0x3B, 0xD8, + 0xD8, 0xB2, 0xD8, 0xCF, 0x10, 0xAA, 0x05, 0xC8, 0x02, 0xA1, 0x5D, 0xB6, + 0x38, 0xAE, 0x7D, 0xB9, 0xFB, 0xCA, 0xFE, 0xC7, 0x71, 0xD6, 0x0E, 0xC2, + 0x94, 0xD1, 0x69, 0xBD, 0x6F, 0xD3, 0x49, 0xD9, 0x35, 0xD5, 0x86, 0xE6, + 0x4C, 0xD3, 0xB3, 0xDF, 0x14, 0xDD, 0x39, 0xEC, 0x3A, 0xED, 0xDA, 0xEE, + 0x62, 0xF6, 0x10, 0xE0, 0xA2, 0xF0, 0x61, 0xD7, 0xE6, 0xDA, 0x74, 0xC1, + 0x36, 0xC9, 0xD2, 0xA2, 0x2A, 0xC8, 0x8E, 0x9D, 0x55, 0xD3, 0x74, 0xAD, + 0x0A, 0xEC, 0x38, 0xCA, 0x87, 0x08, 0xDD, 0xF2, 0x3B, 0x1C, 0x55, 0x13, + 0x88, 0x2A, 0x3C, 0x25, 0x76, 0x34, 0xC6, 0x2F, 0x2B, 0x2B, 0x75, 0x24, + 0x68, 0x09, 0x5C, 0x00, 0x98, 0xE8, 0xF6, 0xDA, 0x47, 0xD8, 0xE5, 0xC8, + 0xCB, 0xCE, 0x30, 0xC5, 0x6A, 0xD4, 0x5C, 0xC9, 0x39, 0xEB, 0x25, 0xD9, + 0xA2, 0x06, 0xB5, 0xF2, 0x70, 0x1A, 0x19, 0x07, 0x7A, 0x18, 0x2A, 0x07, + 0x42, 0x0B, 0x6F, 0xFD, 0x5B, 0xFA, 0x54, 0xEF, 0x59, 0xEC, 0x1E, 0xE5, + 0x4C, 0xE7, 0xA2, 0xDF, 0x5C, 0xF8, 0x88, 0xEE, 0xA7, 0x11, 0x46, 0x11, + 0x26, 0x26, 0x2F, 0x2A, 0xCB, 0x44, 0x95, 0x45, 0x71, 0x55, 0x5E, 0x5D, + 0xAA, 0x4C, 0x37, 0x53, 0xD9, 0x3E, 0x43, 0x3C, 0x19, 0x29, 0x28, 0x31, + 0xC3, 0x12, 0x6D, 0x24, 0x6B, 0x16, 0x3B, 0x18, 0x5C, 0x1F, 0x01, 0x0E, + 0x84, 0x24, 0x74, 0x0C, 0x5B, 0x3A, 0x68, 0x22, 0x05, 0x4B, 0x78, 0x40, + 0x7B, 0x3F, 0x49, 0x49, 0xCC, 0x34, 0xE2, 0x43, 0x55, 0x35, 0xEF, 0x4A, + 0x28, 0x21, 0x6B, 0x50, 0x13, 0x17, 0xAD, 0x53, 0x30, 0x2F, 0x1A, 0x5C, + 0x75, 0x3D, 0xCB, 0x59, 0xEC, 0x41, 0x16, 0x4C, 0x36, 0x41, 0xDC, 0x3A, + 0x77, 0x2A, 0x46, 0x20, 0x77, 0x1A, 0x96, 0xFD, 0xC3, 0x1F, 0xE4, 0xF0, + 0x04, 0x20, 0x60, 0x00, 0x86, 0x26, 0xBD, 0x1E, 0x79, 0x3D, 0x0E, 0x47, + 0x2A, 0x4E, 0x38, 0x5F, 0x97, 0x5A, 0xAF, 0x5D, 0xAE, 0x63, 0x86, 0x57, + 0xD6, 0x4F, 0x35, 0x43, 0x36, 0x2A, 0x76, 0x24, 0x98, 0x17, 0x4B, 0x12, + 0x29, 0x1B, 0x7C, 0x0A, 0xAF, 0x25, 0x3F, 0x0A, 0x59, 0x39, 0x71, 0x15, + 0x54, 0x4A, 0xA1, 0x29, 0xE0, 0x46, 0xC0, 0x41, 0x63, 0x3C, 0x6A, 0x4A, + 0x7B, 0x2B, 0xCA, 0x3A, 0x57, 0x0E, 0x60, 0x1C, 0x22, 0xFF, 0x48, 0xF9, + 0x5B, 0x0E, 0xA1, 0xF4, 0x41, 0x11, 0xFF, 0x05, 0x78, 0x12, 0x26, 0x21, + 0xE3, 0x24, 0xFC, 0x3B, 0x61, 0x35, 0xA9, 0x4A, 0x5F, 0x4B, 0x1B, 0x57, + 0x28, 0x4A, 0x2A, 0x54, 0xAE, 0x22, 0x2B, 0x47, 0x89, 0x03, 0x15, 0x35, + 0xC0, 0xEF, 0xCF, 0x10, 0x09, 0xDE, 0xBB, 0xFA, 0x3A, 0xDF, 0xE5, 0x01, + 0x21, 0xE2, 0x78, 0x02, 0x23, 0xE8, 0xEC, 0xFE, 0x3E, 0x01, 0x48, 0x02, + 0x5D, 0x0B, 0xBB, 0xFE, 0x3D, 0xEB, 0xFD, 0xEE, 0x82, 0xD4, 0xE3, 0xE8, + 0xB9, 0xDF, 0x21, 0xF3, 0x79, 0xDE, 0x72, 0xF9, 0x93, 0xE3, 0x17, 0x08, + 0x61, 0xFB, 0x03, 0x18, 0x5D, 0xF3, 0x4C, 0x14, 0x92, 0xD8, 0x19, 0x07, + 0xEF, 0xCD, 0xBC, 0xEE, 0x6D, 0xC0, 0xBA, 0xCA, 0x93, 0xB4, 0xC0, 0xB3, + 0x2A, 0xBD, 0xE3, 0xB3, 0x04, 0xCC, 0xD9, 0xC8, 0x74, 0xE4, 0xE4, 0xED, + 0x63, 0xFF, 0x0E, 0x07, 0x79, 0x06, 0x83, 0x07, 0x0C, 0xFE, 0xBD, 0x03, + 0xC8, 0xEC, 0x75, 0x00, 0x84, 0xD3, 0x27, 0xE7, 0xAD, 0xBD, 0x77, 0xC7, + 0x0E, 0xBB, 0x74, 0xC6, 0x04, 0xC5, 0x20, 0xCA, 0xB1, 0xCD, 0x55, 0xC3, + 0x5C, 0xD3, 0x5A, 0xCF, 0xCA, 0xD5, 0xC0, 0xDE, 0x7E, 0xCD, 0xEF, 0xDB, + 0x25, 0xBA, 0xF0, 0xD0, 0xAE, 0xAE, 0x3E, 0xBE, 0x68, 0xA9, 0x7D, 0xA8, + 0x22, 0xA4, 0x65, 0xA3, 0xA3, 0xB5, 0xB3, 0xB0, 0x14, 0xD5, 0x0F, 0xC1, + 0x4D, 0xEA, 0x0C, 0xD3, 0xCB, 0xEC, 0x45, 0xDD, 0x05, 0xED, 0x85, 0xE1, + 0xD5, 0xF8, 0xCC, 0xE3, 0x56, 0xF7, 0xEA, 0xD9, 0xFC, 0xE2, 0x42, 0xD1, + 0x9C, 0xD7, 0xD8, 0xCF, 0x30, 0xD2, 0x76, 0xBC, 0xAF, 0xD9, 0x6E, 0xB0, + 0xEF, 0xF3, 0x82, 0xC0, 0x8C, 0xF2, 0xA0, 0xBD, 0x95, 0xE0, 0x2E, 0xB3, + 0x4B, 0xE9, 0xE5, 0xBE, 0xEE, 0xF1, 0x1D, 0xC2, 0x47, 0xE0, 0x17, 0xB3, + 0xEE, 0xE2, 0x0E, 0xBC, 0x48, 0xFB, 0x00, 0xD1, 0x88, 0xFC, 0xFA, 0xD3, + 0x00, 0xFF, 0xFF, 0xE2, 0x4A, 0x0F, 0x6B, 0xEF, 0x62, 0x10, 0xFD, 0xDA, + 0x4A, 0x03, 0x17, 0xC5, 0xFB, 0xF1, 0x63, 0xBE, 0x2E, 0xDA, 0x1C, 0xB1, + 0x27, 0xCC, 0xD4, 0xA5, 0x5A, 0xCE, 0x3A, 0xB2, 0xB6, 0xD8, 0x38, 0xCD, + 0x74, 0xED, 0x57, 0xE8, 0x17, 0xFC, 0xC6, 0xFE, 0x32, 0x01, 0x50, 0x0B, + 0xF5, 0x0F, 0x97, 0x0D, 0x53, 0x15, 0x1B, 0x0B, 0x30, 0x02, 0x03, 0xFD, + 0xEE, 0xFC, 0xFD, 0xE8, 0x92, 0x07, 0x1A, 0xE2, 0x90, 0x04, 0x61, 0xE5, + 0x30, 0x06, 0xD6, 0xF2, 0xE1, 0x0A, 0x25, 0x07, 0xD4, 0x01, 0x9A, 0x0E, + 0xAB, 0xFC, 0xD7, 0x09, 0x00, 0xF5, 0x65, 0x01, 0x2B, 0xE6, 0x54, 0xF4, + 0x84, 0xDF, 0x67, 0xEB, 0xCC, 0xE1, 0x63, 0xF6, 0x75, 0xF4, 0xF2, 0x0A, + 0x32, 0x13, 0x03, 0x13, 0x51, 0x30, 0xE3, 0x20, 0x3E, 0x35, 0xA0, 0x31, + 0xC9, 0x2F, 0x32, 0x41, 0x47, 0x3A, 0xE0, 0x53, 0xCB, 0x3D, 0xBE, 0x55, + 0xD0, 0x31, 0x2B, 0x53, 0x6A, 0x24, 0x1A, 0x56, 0x07, 0x0E, 0x84, 0x45, + 0xB5, 0x0D, 0x72, 0x3D, 0x55, 0x24, 0x29, 0x43, 0xA8, 0x12, 0xA8, 0x2C, + 0x51, 0xF8, 0x9C, 0x23, 0x7B, 0x0B, 0xE6, 0x3B, 0xC7, 0x23, 0x9B, 0x3B, + 0x1E, 0x1F, 0x84, 0x1D, 0xE5, 0x22, 0xE5, 0x1C, 0xF2, 0x26, 0x9C, 0x2D, + 0xB7, 0x16, 0xC0, 0x2F, 0x4D, 0x1F, 0x1E, 0x47, 0xCF, 0x2F, 0x90, 0x57, + 0xEB, 0x24, 0xC0, 0x39, 0xA7, 0x19, 0xF0, 0x1F, 0x85, 0x0C, 0xF1, 0x19, + 0xC3, 0xF9, 0xDF, 0x0C, 0x0C, 0xF9, 0xF1, 0x02, 0xF4, 0xFB, 0x0F, 0x02, + 0xDB, 0x10, 0xFE, 0x12, 0x28, 0x43, 0xE4, 0x31, 0x76, 0x54, 0xF5, 0x47, + 0x85, 0x3B, 0x34, 0x5A, 0x8E, 0x34, 0x9F, 0x65, 0x50, 0x41, 0x4B, 0x5C, + 0x7B, 0x38, 0x5C, 0x3D, 0x1E, 0x32, 0xDF, 0x22, 0xA7, 0x3B, 0x5A, 0x24, + 0x53, 0x34, 0x36, 0x2F, 0xEC, 0x33, 0x42, 0x32, 0x9B, 0x3D, 0xFC, 0x30, + 0xCF, 0x28, 0x6A, 0x31, 0x79, 0x14, 0xAB, 0x38, 0xDA, 0x0F, 0xC1, 0x33, + 0xB3, 0x02, 0x13, 0x21, 0xE2, 0xF9, 0x90, 0x10, 0x7C, 0xFF, 0x5C, 0x0A, + 0x3C, 0x07, 0x5D, 0x18, 0x2F, 0x11, 0x0A, 0x32, 0x2F, 0x22, 0x3D, 0x44, + 0x44, 0x25, 0xA4, 0x3E, 0xB0, 0x27, 0x6F, 0x3E, 0xC1, 0x2F, 0x3D, 0x48, + 0x67, 0x21, 0xC3, 0x34, 0x49, 0x12, 0x2D, 0x1F, 0xB2, 0x14, 0x2C, 0x18, + 0x0A, 0x0F, 0x53, 0x00, 0x4E, 0x0D, 0xB1, 0xFE, 0x52, 0x0F, 0xD2, 0x13, + 0x43, 0xFF, 0xB1, 0x07, 0x27, 0xF8, 0x05, 0xFD, 0xE1, 0x04, 0xA7, 0x0C, + 0xFD, 0x03, 0xD1, 0x06, 0x18, 0xF9, 0x28, 0xF2, 0x1A, 0x00, 0x15, 0xFA, + 0x88, 0x01, 0x83, 0x04, 0x7B, 0x00, 0x43, 0x04, 0x3A, 0x18, 0xE4, 0x12, + 0xD4, 0x1C, 0x1B, 0x12, 0x49, 0x07, 0x02, 0xFA, 0x92, 0xFF, 0xA5, 0xED, + 0x2A, 0xF3, 0x23, 0xDB, 0x5A, 0xE0, 0x46, 0xBF, 0x53, 0xDF, 0x91, 0xBC, + 0xE0, 0xD9, 0xAC, 0xC2, 0x08, 0xE0, 0x8B, 0xD6, 0xEF, 0x01, 0x1E, 0x02, + 0x6E, 0x0C, 0x32, 0x13, 0x49, 0xFA, 0xB3, 0x09, 0x23, 0xFC, 0xAB, 0x10, + 0x72, 0x07, 0xEC, 0x0B, 0x45, 0xFE, 0x7D, 0xE5, 0xCF, 0xFF, 0x3D, 0xD5, + 0x92, 0x09, 0xB7, 0xE1, 0x9F, 0x00, 0xA2, 0xE5, 0x52, 0xFD, 0x8E, 0xE4, + 0xEB, 0xF7, 0xC0, 0xDB, 0xB9, 0xDF, 0x10, 0xCC, 0x8A, 0xD0, 0x1E, 0xC3, + 0x8A, 0xC8, 0x38, 0xB7, 0x89, 0xBE, 0x92, 0xAA, 0x37, 0xB9, 0xBC, 0xA0, + 0x86, 0xC5, 0x1B, 0xA7, 0xBF, 0xDF, 0xAD, 0xBC, 0x07, 0xF9, 0x0B, 0xD0, + 0x2F, 0xFF, 0xB1, 0xDD, 0x43, 0xEB, 0x72, 0xDE, 0xA7, 0xEA, 0x96, 0xE1, + 0xF2, 0xFB, 0x83, 0xE4, 0x4E, 0xF8, 0xBA, 0xDA, 0xB0, 0xF3, 0xD4, 0xD7, + 0x93, 0xF3, 0x08, 0xD3, 0x33, 0xE8, 0x20, 0xC2, 0x67, 0xEE, 0x1C, 0xC8, + 0x85, 0xF0, 0x30, 0xC7, 0xEA, 0xD7, 0x20, 0xA9, 0x35, 0xD2, 0x9C, 0xA9, + 0xA9, 0xDB, 0xB7, 0xC1, 0xE9, 0xCE, 0x38, 0xB8, 0x6E, 0xC2, 0xE3, 0xAA, + 0x3A, 0xC7, 0x40, 0xBD, 0xF4, 0xBC, 0x0C, 0xC2, 0x55, 0xB8, 0xC3, 0xC6, + 0x82, 0xC6, 0xCE, 0xE2, 0x30, 0xC2, 0x71, 0xE3, 0xFF, 0xBA, 0x4C, 0xD0, + 0x62, 0xBC, 0x8E, 0xCA, 0xB9, 0xAC, 0x4E, 0xBA, 0x01, 0xA5, 0xE3, 0xA1, + 0x82, 0xB3, 0x85, 0x9B, 0x2C, 0xB8, 0x95, 0xA9, 0x91, 0xC5, 0x79, 0xD0, + 0xA9, 0xE4, 0x1D, 0xFA, 0x53, 0xE8, 0x2B, 0x03, 0x04, 0xDD, 0xEC, 0xFC, + 0x73, 0xE4, 0x5B, 0x05, 0x37, 0xDF, 0x4E, 0x06, 0xF5, 0xD2, 0x84, 0xF2, + 0x58, 0xE5, 0xAD, 0xE6, 0x66, 0xF6, 0x5E, 0xE8, 0x30, 0xF4, 0xCE, 0xF2, + 0x71, 0xF6, 0x46, 0x02, 0x36, 0xF5, 0x34, 0xFA, 0xD1, 0xE9, 0xBC, 0xE3, + 0xDF, 0xD9, 0x55, 0xE3, 0xA3, 0xCA, 0xD2, 0xEB, 0xB4, 0xCE, 0xDB, 0xEC, + 0x01, 0xDB, 0x4C, 0xEE, 0x11, 0xE5, 0xB5, 0xFE, 0x70, 0xF3, 0x53, 0x16, + 0x07, 0x04, 0x9D, 0x27, 0x2B, 0xFC, 0xEA, 0x2C, 0x3D, 0xE9, 0xBE, 0x31, + 0xC6, 0xFF, 0x17, 0x3E, 0x8F, 0x1A, 0xBB, 0x37, 0xD1, 0x1B, 0xA7, 0x2E, + 0x9D, 0x24, 0x41, 0x31, 0xF9, 0x20, 0x09, 0x24, 0x5B, 0x0D, 0x69, 0x1E, + 0x1A, 0x12, 0x50, 0x2F, 0xFA, 0x14, 0xAF, 0x1F, 0xDB, 0x0B, 0xE5, 0xFC, + 0xF3, 0x17, 0xB1, 0x03, 0x63, 0x25, 0xBA, 0x1C, 0x1B, 0x15, 0x00, 0x18, + 0x95, 0x0B, 0xDC, 0x12, 0xF1, 0x18, 0x91, 0x17, 0x2C, 0x19, 0xF5, 0x0E, + 0xB1, 0x23, 0x62, 0x27, 0xD8, 0x38, 0xF5, 0x48, 0xEA, 0x34, 0xAE, 0x3A, + 0x32, 0x30, 0xD2, 0x27, 0x51, 0x2F, 0x40, 0x1C, 0xA6, 0x1E, 0xE8, 0x0A, + 0xEF, 0x13, 0xA8, 0x08, 0x3C, 0x1C, 0x97, 0x0E, 0x65, 0x2C, 0x90, 0x14, + 0xEB, 0x4D, 0xE5, 0x2E, 0x51, 0x65, 0x2D, 0x51, 0x39, 0x4C, 0xFB, 0x5B, + 0x14, 0x3C, 0xD9, 0x5B, 0xFC, 0x52, 0xCE, 0x5B, 0xF1, 0x58, 0x2C, 0x4E, + 0x89, 0x4F, 0x36, 0x44, 0x6F, 0x51, 0x81, 0x4B, 0xD2, 0x51, 0x42, 0x4F, + 0x5D, 0x56, 0x95, 0x50, 0xD8, 0x52, 0x3B, 0x4E, 0xD6, 0x35, 0x14, 0x3E, + 0x63, 0x23, 0xC3, 0x34, 0x09, 0x1F, 0xB6, 0x2F, 0xE7, 0x13, 0x3C, 0x22, + 0x09, 0x16, 0x0B, 0x1A, 0x85, 0x26, 0x6D, 0x14, 0xAC, 0x37, 0xE8, 0x13, + 0x9B, 0x46, 0x3C, 0x21, 0xCD, 0x4E, 0x2F, 0x3A, 0xC8, 0x3F, 0x7B, 0x40, + 0x83, 0x35, 0xFF, 0x3D, 0x1E, 0x40, 0xD3, 0x4F, 0x68, 0x3F, 0xBE, 0x57, + 0xA4, 0x41, 0xBF, 0x54, 0x08, 0x4D, 0x01, 0x5A, 0x32, 0x40, 0xE7, 0x46, + 0x09, 0x36, 0xA5, 0x2F, 0xED, 0x40, 0xCA, 0x34, 0xD4, 0x32, 0x60, 0x25, + 0x76, 0x1B, 0x49, 0x10, 0xFC, 0x23, 0xED, 0x20, 0x18, 0x2E, 0x86, 0x28, + 0x6A, 0x1C, 0x02, 0x0F, 0x27, 0x11, 0xF2, 0x05, 0xFF, 0x07, 0x7F, 0x0A, + 0xB8, 0xEF, 0xCD, 0x08, 0x6E, 0xF5, 0x7A, 0x21, 0x73, 0x07, 0xF5, 0x37, + 0x84, 0xFE, 0x50, 0x24, 0x91, 0xED, 0xBB, 0x0A, 0x06, 0xD9, 0x25, 0xF4, + 0x39, 0xD0, 0x14, 0xD2, 0xEF, 0xDE, 0x35, 0xC8, 0x40, 0xDE, 0x23, 0xDC, + 0x94, 0xD6, 0xF1, 0xF2, 0xF2, 0xED, 0x9A, 0x14, 0x9F, 0x03, 0x9F, 0x28, + 0xE5, 0xF6, 0x34, 0x10, 0x1C, 0xE3, 0xDF, 0xFB, 0xF8, 0xD7, 0xEB, 0xFF, + 0x88, 0xCE, 0x48, 0xF4, 0xEE, 0xD9, 0x36, 0xE5, 0xAE, 0xED, 0x7E, 0xE5, + 0x4E, 0xED, 0xB6, 0xE5, 0xD1, 0xEE, 0x19, 0xE5, 0xB5, 0xE9, 0x0F, 0xE2, + 0x75, 0xC7, 0xBC, 0xD5, 0xD7, 0xAB, 0xE0, 0xC3, 0x6B, 0xA6, 0x2B, 0xB8, + 0x27, 0xAC, 0x16, 0xB7, 0xE5, 0xB7, 0x85, 0xB1, 0x64, 0xBC, 0x96, 0xAC, + 0x76, 0xC3, 0x35, 0xB7, 0xCD, 0xD0, 0xCB, 0xC0, 0x6C, 0xD7, 0x22, 0xC8, + 0xDB, 0xC9, 0x0C, 0xC0, 0xBD, 0xC5, 0xFA, 0xB9, 0x7A, 0xD6, 0xA4, 0xC8, + 0x9D, 0xDA, 0x18, 0xCD, 0xDE, 0xD8, 0x22, 0xD3, 0x92, 0xCD, 0xC9, 0xD4, + 0xF0, 0xAC, 0x92, 0xB3, 0x4F, 0xA6, 0xBC, 0xA5, 0xAF, 0xB6, 0x47, 0xBD, + 0x93, 0xAA, 0x66, 0xBC, 0xA9, 0x9F, 0x09, 0xAE, 0xF1, 0xB1, 0x23, 0xB8, + 0x0D, 0xBB, 0x3E, 0xBA, 0xA0, 0xAB, 0x3C, 0xA4, 0x75, 0xA0, 0x32, 0xA2, + 0x14, 0x9E, 0x5A, 0xA8, 0x98, 0xA6, 0x4A, 0xA4, 0x3F, 0xC3, 0xA6, 0xBE, + 0x92, 0xC7, 0xF1, 0xD6, 0x14, 0xB4, 0x5E, 0xCB, 0xB1, 0xAF, 0xAA, 0xBA, + 0xA6, 0xA5, 0xF8, 0xA8, 0xD5, 0x9D, 0x8B, 0x9C, 0x38, 0xB1, 0x74, 0xA2, + 0x44, 0xB9, 0x62, 0xAF, 0x51, 0xBA, 0x54, 0xC7, 0xF4, 0xDD, 0x86, 0xE4, + 0xF9, 0xF5, 0x07, 0xE5, 0x18, 0xDE, 0xCF, 0xCE, 0x76, 0xCE, 0x0E, 0xCE, + 0xF9, 0xDB, 0x75, 0xE1, 0x92, 0xEC, 0xCF, 0xEB, 0xB1, 0x03, 0xC7, 0xF4, + 0xAF, 0x15, 0xD1, 0xF7, 0x98, 0x11, 0x27, 0xF2, 0x0E, 0x07, 0x95, 0xF8, + 0x49, 0xF8, 0x10, 0xFB, 0x46, 0xDA, 0x17, 0xEB, 0xA7, 0xC7, 0xFF, 0xE2, + 0x06, 0xD5, 0x00, 0xE1, 0xDF, 0xF0, 0xFE, 0xDE, 0x42, 0xFF, 0xC5, 0xE4, + 0x05, 0x01, 0x4D, 0xEA, 0x6D, 0x02, 0xB3, 0xE9, 0x33, 0x0D, 0xC1, 0xED, + 0xF7, 0x1A, 0x95, 0xF6, 0x9A, 0x12, 0x20, 0xF8, 0xA0, 0x13, 0x40, 0x0C, + 0xF6, 0x24, 0x29, 0x29, 0x0F, 0x2C, 0x4F, 0x29, 0xDD, 0x3C, 0x63, 0x1C, + 0xBC, 0x45, 0xC1, 0x0F, 0xB0, 0x2C, 0x82, 0x03, 0xA4, 0x2C, 0x28, 0x12, + 0x39, 0x4A, 0x25, 0x25, 0xA3, 0x4A, 0x7C, 0x11, 0xBF, 0x40, 0x81, 0x05, + 0xDA, 0x42, 0x13, 0x19, 0xCA, 0x38, 0xA1, 0x17, 0x83, 0x32, 0xB7, 0x08, + 0x95, 0x3E, 0x6B, 0x0D, 0x58, 0x3D, 0x1B, 0x13, 0x3C, 0x3E, 0xDC, 0x26, + 0x66, 0x54, 0x99, 0x52, 0x7E, 0x4F, 0xBD, 0x56, 0x26, 0x3B, 0xFA, 0x34, + 0xB0, 0x38, 0x4D, 0x23, 0x45, 0x30, 0x80, 0x1B, 0x52, 0x2C, 0xAA, 0x1A, + 0x73, 0x3B, 0x3B, 0x2F, 0xE5, 0x41, 0x85, 0x3E, 0x9B, 0x4B, 0x4D, 0x45, + 0xF2, 0x5F, 0x16, 0x5A, 0xF5, 0x50, 0xB4, 0x60, 0xCA, 0x2B, 0x76, 0x53, + 0x7C, 0x2C, 0x26, 0x58, 0xA7, 0x45, 0x73, 0x61, 0x8D, 0x50, 0x73, 0x59, + 0xE3, 0x5A, 0x01, 0x55, 0xD5, 0x5F, 0xEE, 0x4D, 0xC3, 0x52, 0x74, 0x3F, + 0x9E, 0x48, 0xE2, 0x41, 0xCA, 0x3E, 0x81, 0x44, 0x66, 0x2B, 0xB2, 0x36, + 0xE9, 0x1B, 0xC4, 0x3A, 0x99, 0x15, 0x7E, 0x49, 0x5D, 0x18, 0xED, 0x47, + 0x8F, 0x17, 0x14, 0x42, 0x5D, 0x15, 0x99, 0x3A, 0x89, 0x1D, 0x73, 0x2C, + 0x54, 0x2C, 0xD8, 0x34, 0x77, 0x2D, 0xEA, 0x47, 0x6E, 0x21, 0xC7, 0x43, + 0xBA, 0x29, 0x26, 0x4C, 0xA4, 0x34, 0xFC, 0x5D, 0x15, 0x2E, 0x7B, 0x56, + 0x17, 0x2D, 0x3B, 0x49, 0xCC, 0x23, 0x3C, 0x38, 0x9B, 0x10, 0xEC, 0x25, + 0xE0, 0x1B, 0xA1, 0x37, 0xC4, 0x1C, 0x7B, 0x46, 0x8B, 0xF4, 0x3B, 0x2B, + 0x7A, 0xE8, 0x38, 0x1C, 0x4D, 0xFC, 0x89, 0x22, 0x4D, 0xF5, 0x86, 0x13, + 0x9C, 0xE8, 0x3C, 0x03, 0x9E, 0xEA, 0xD8, 0x0B, 0x8D, 0xDC, 0x05, 0x10, + 0x45, 0xDE, 0xC3, 0x19, 0x74, 0xF6, 0x8B, 0x2D, 0x1E, 0xEE, 0xEB, 0x19, + 0x0A, 0xD6, 0x95, 0xFE, 0x72, 0xC4, 0x33, 0xF9, 0x3E, 0xB6, 0xA1, 0xE5, + 0xB8, 0xC1, 0x5A, 0xD8, 0x5A, 0xD6, 0xD9, 0xE1, 0x0B, 0xD5, 0x09, 0xE3, + 0xA6, 0xDF, 0x04, 0xEC, 0x6D, 0xF3, 0x07, 0xFF, 0x81, 0xE3, 0x93, 0xF8, + 0xF2, 0xCC, 0xF0, 0xEB, 0x3E, 0xD8, 0x0B, 0x00, 0xC8, 0xE7, 0x4C, 0x0D, + 0x38, 0xF2, 0x73, 0xF3, 0x63, 0x04, 0xD0, 0xE2, 0xC0, 0xFE, 0x43, 0xDF, + 0xD2, 0xE7, 0x17, 0xCF, 0x4E, 0xE0, 0x1E, 0xCE, 0xF0, 0xD5, 0xDE, 0xD4, + 0xD2, 0xCB, 0xCF, 0xC8, 0x7F, 0xD1, 0x7C, 0xC5, 0x66, 0xCF, 0xF7, 0xCA, + 0x82, 0xC8, 0x27, 0xBE, 0x03, 0xC5, 0x91, 0xA5, 0x2F, 0xBC, 0x49, 0x9F, + 0x10, 0xB9, 0x73, 0xAF, 0xE8, 0xC3, 0x78, 0xC6, 0x19, 0xBE, 0x05, 0xCF, + 0x03, 0xAF, 0xBF, 0xC7, 0xD9, 0xBA, 0xFA, 0xCB, 0xD3, 0xC5, 0xB1, 0xD1, + 0xCA, 0xC4, 0x34, 0xCE, 0x7C, 0xD0, 0x8E, 0xC7, 0x7F, 0xD1, 0x73, 0xAF, + 0xF5, 0xCB, 0x08, 0xA5, 0xBF, 0xDD, 0x27, 0xC4, 0x47, 0xDA, 0x9E, 0xCC, + 0xFE, 0xC1, 0x67, 0xB2, 0xFF, 0xCC, 0x68, 0xAF, 0x64, 0xD9, 0xFE, 0xB5, + 0x36, 0xC3, 0x29, 0xAD, 0x3F, 0xB9, 0x24, 0xAD, 0xC9, 0xC4, 0x33, 0xB7, + 0x67, 0xC7, 0x91, 0xBA, 0xFA, 0xD0, 0x03, 0xCA, 0x18, 0xE1, 0x13, 0xD7, + 0xF7, 0xD8, 0x66, 0xC3, 0x6C, 0xCE, 0xE0, 0xB3, 0x62, 0xCA, 0x45, 0xB1, + 0x73, 0xBE, 0xA1, 0xA9, 0x85, 0xCE, 0x5B, 0xAD, 0x2F, 0xED, 0x5F, 0xBB, + 0x0A, 0xEF, 0xE0, 0xCC, 0x9A, 0xF2, 0xE0, 0xF1, 0xEE, 0xF8, 0x73, 0x0B, + 0x4E, 0xE9, 0x23, 0xFA, 0xA7, 0xE2, 0x3B, 0xEB, 0x72, 0xF3, 0xDC, 0xF7, + 0x95, 0x03, 0xB7, 0x01, 0xFA, 0x0F, 0xCC, 0x05, 0x8C, 0x17, 0x24, 0x04, + 0xF6, 0x16, 0xC2, 0xED, 0xB9, 0x1C, 0x63, 0xE1, 0xE8, 0x1E, 0xBD, 0xEE, + 0x85, 0x09, 0x25, 0xF7, 0x1A, 0xF9, 0xB3, 0xF7, 0xC9, 0xFD, 0xEC, 0xF4, + 0x53, 0x00, 0x18, 0xED, 0x22, 0xFF, 0x4F, 0xE0, 0xF2, 0xFE, 0x4C, 0xDB, + 0xE6, 0x04, 0x03, 0xF0, 0x0A, 0x1E, 0xF5, 0xFE, 0xC9, 0x36, 0x52, 0xFD, + 0xD9, 0x2B, 0x98, 0xFD, 0x85, 0x18, 0x09, 0x05, 0x7F, 0x1E, 0xBC, 0x17, + 0xAA, 0x2C, 0xFC, 0x22, 0x38, 0x3C, 0x25, 0x22, 0xED, 0x46, 0x79, 0x1F, + 0xA3, 0x3B, 0xA0, 0x13, 0x75, 0x37, 0x83, 0x1B, 0x4A, 0x46, 0x4A, 0x32, + 0x6E, 0x40, 0x19, 0x21, 0xB3, 0x2D, 0xF5, 0x08, 0x2B, 0x31, 0x1E, 0x15, + 0x32, 0x36, 0xB2, 0x1F, 0x8A, 0x29, 0x25, 0x1A, 0x85, 0x1B, 0x37, 0x1B, + 0x0B, 0x15, 0xE9, 0x1C, 0xED, 0x1C, 0x88, 0x1C, 0x9D, 0x2B, 0x6A, 0x31, + 0x36, 0x22, 0x91, 0x42, 0x07, 0x0B, 0xDC, 0x37, 0x71, 0x03, 0x2E, 0x2F, + 0x9D, 0xFA, 0x66, 0x21, 0x40, 0xF4, 0xC1, 0x05, 0x72, 0x06, 0x64, 0xFE, + 0x95, 0x16, 0x07, 0x0D, 0x77, 0x1E, 0x1A, 0x1F, 0x16, 0x2C, 0x42, 0x34, + 0x0C, 0x2D, 0xFB, 0x3B, 0x04, 0x22, 0x99, 0x33, 0xF5, 0x1D, 0x65, 0x37, + 0x66, 0x20, 0xFF, 0x47, 0x89, 0x26, 0x12, 0x55, 0xF7, 0x35, 0x52, 0x57, + 0x62, 0x38, 0xA2, 0x4C, 0x70, 0x26, 0xE0, 0x3E, 0x70, 0x23, 0x70, 0x3C, + 0x50, 0x29, 0x1A, 0x42, 0xE8, 0x22, 0x85, 0x3F, 0x27, 0x1E, 0xEC, 0x3E, + 0xF1, 0x12, 0xF5, 0x3B, 0x67, 0x09, 0xF1, 0x2E, 0x34, 0x10, 0x95, 0x20, + 0xE7, 0x16, 0x08, 0x15, 0xA1, 0x1A, 0x07, 0x1C, 0xDA, 0x1B, 0x16, 0x32, + 0x83, 0x11, 0x78, 0x3E, 0x9F, 0xF9, 0x0E, 0x37, 0xF8, 0xF5, 0xEA, 0x30, + 0x91, 0x09, 0x9F, 0x39, 0x5A, 0x11, 0xEF, 0x44, 0x19, 0x19, 0xF7, 0x46, + 0xF1, 0x21, 0xF4, 0x3F, 0xFC, 0x13, 0x7F, 0x2F, 0x75, 0x18, 0x51, 0x2D, + 0x7E, 0x2E, 0xBA, 0x3E, 0xC4, 0x1E, 0x1A, 0x36, 0x76, 0x0A, 0x37, 0x1E, + 0x40, 0x11, 0x01, 0x20, 0x2B, 0x0D, 0xB5, 0x20, 0x40, 0x01, 0x18, 0x10, + 0x43, 0x00, 0xCD, 0x04, 0x28, 0xF9, 0x7D, 0x00, 0xB1, 0xFD, 0xFC, 0x04, + 0xA1, 0x17, 0x1E, 0x16, 0x2A, 0x0E, 0x3A, 0x17, 0x85, 0xEA, 0xBC, 0x09, + 0xAE, 0xE2, 0xD5, 0xFA, 0xA7, 0xE3, 0x11, 0xE1, 0xD6, 0xE6, 0xEF, 0xD3, + 0x5B, 0xFE, 0x84, 0xE2, 0x21, 0x0B, 0xC3, 0xF3, 0xE2, 0x0A, 0x34, 0xFB, + 0xA1, 0x15, 0xD0, 0xFB, 0x20, 0x0F, 0xA5, 0xF4, 0x35, 0xF9, 0x6A, 0xF5, + 0x67, 0x00, 0x4D, 0x07, 0x75, 0x18, 0x11, 0x0F, 0xA9, 0x25, 0x02, 0x06, + 0x28, 0x29, 0x8F, 0xFC, 0x67, 0x1C, 0xB6, 0xEE, 0x43, 0x09, 0xCD, 0xE0, + 0xA4, 0x07, 0x52, 0xE4, 0xD9, 0x03, 0x4A, 0xEE, 0xA4, 0xE9, 0x7B, 0xF6, + 0xA7, 0xD5, 0xB0, 0xFE, 0x11, 0xD1, 0xE5, 0xED, 0x0B, 0xCF, 0x04, 0xD4, + 0x8F, 0xD0, 0x02, 0xC8, 0x42, 0xD6, 0x75, 0xBC, 0xBA, 0xDF, 0xA4, 0xBF, + 0xFC, 0xED, 0xE1, 0xD9, 0xCD, 0xEB, 0x18, 0xE5, 0xC7, 0xD3, 0x0A, 0xD9, + 0x26, 0xCF, 0xF7, 0xDD, 0xA0, 0xDD, 0x23, 0xEB, 0xF4, 0xE6, 0x39, 0xF1, + 0x42, 0xF1, 0x40, 0x05, 0x52, 0xF1, 0x12, 0x08, 0x98, 0xE8, 0xBD, 0xEA, + 0x3D, 0xF0, 0x57, 0xE4, 0x05, 0xF8, 0x82, 0xED, 0x53, 0xEA, 0x8E, 0xDE, + 0x96, 0xE3, 0x3B, 0xD6, 0xCB, 0xE9, 0x08, 0xE2, 0x25, 0xE3, 0xBA, 0xD9, + 0x95, 0xE4, 0xB1, 0xC0, 0x03, 0xED, 0xBD, 0xC0, 0x1B, 0xDE, 0x2C, 0xD9, + 0xE5, 0xCD, 0x9B, 0xF6, 0x29, 0xD3, 0x70, 0x0A, 0x84, 0xD5, 0x5C, 0xFA, + 0x82, 0xCC, 0x7A, 0xDF, 0xAF, 0xBE, 0x19, 0xD6, 0x23, 0xAD, 0xE7, 0xCD, + 0xD3, 0xB2, 0xA2, 0xC7, 0x2A, 0xD4, 0x89, 0xC8, 0x20, 0xE2, 0x07, 0xC9, + 0x6E, 0xDC, 0x95, 0xD7, 0xCB, 0xE0, 0xBA, 0xE8, 0x06, 0xDF, 0xE3, 0xDA, + 0xFC, 0xD9, 0xA1, 0xCD, 0x55, 0xE5, 0xB0, 0xDA, 0xBB, 0xEF, 0x31, 0xE8, + 0x22, 0xF4, 0xE9, 0xED, 0x6B, 0xF7, 0x29, 0xEC, 0x74, 0xF4, 0x07, 0xD6, + 0x2C, 0xF9, 0x83, 0xBE, 0x69, 0x01, 0xE8, 0xC4, 0xE7, 0xF6, 0x2E, 0xD5, + 0xF9, 0xE3, 0x3E, 0xE0, 0x74, 0xDF, 0xE2, 0xE7, 0x0C, 0xE2, 0x9E, 0xD4, + 0x4C, 0xE7, 0x55, 0xBB, 0x1B, 0xEB, 0x9B, 0xB9, 0x5D, 0xE7, 0x5B, 0xC4, + 0x03, 0xEE, 0x8B, 0xD1, 0x75, 0xFF, 0xAC, 0xDE, 0x4C, 0xF7, 0x7F, 0xDB, + 0xBC, 0xE4, 0x3C, 0xCD, 0x4F, 0xF1, 0x3C, 0xD3, 0xD8, 0x04, 0x41, 0xE8, + 0xD9, 0x0B, 0x52, 0xFE, 0xB9, 0x0F, 0xE2, 0x12, 0xC2, 0x0A, 0x6D, 0x0B, + 0x30, 0x04, 0xFC, 0xF0, 0xD1, 0x16, 0x5F, 0xFA, 0x9F, 0x1C, 0x70, 0x0F, + 0x39, 0xFF, 0x91, 0x0B, 0xBC, 0xF9, 0x2A, 0x07, 0x26, 0x0A, 0xC8, 0x0A, + 0x85, 0x00, 0xD0, 0x00, 0xB5, 0xF1, 0x01, 0xF1, 0x65, 0xF6, 0x91, 0xEE, + 0x09, 0xFC, 0x8E, 0xEF, 0xAF, 0x02, 0x5A, 0xFB, 0x46, 0x02, 0xA1, 0x06, + 0xF7, 0xEF, 0xE7, 0xF6, 0xE3, 0xE8, 0x9B, 0xE9, 0x9B, 0xED, 0xC9, 0xEC, + 0xDE, 0xE5, 0x41, 0xEA, 0x8B, 0xE7, 0x66, 0xF0, 0x06, 0xFE, 0xC8, 0x05, + 0x69, 0x07, 0xC9, 0x0C, 0x1F, 0x0A, 0x83, 0x0A, 0x1F, 0x12, 0x13, 0x0F, + 0x70, 0x0D, 0x1F, 0x13, 0x6E, 0x0C, 0x4E, 0x1F, 0x12, 0x1A, 0x6D, 0x32, + 0xEA, 0x2C, 0x2C, 0x38, 0x85, 0x41, 0xC4, 0x31, 0xBA, 0x4C, 0x19, 0x2D, + 0xC0, 0x40, 0x09, 0x2A, 0xD9, 0x2E, 0x72, 0x2A, 0x83, 0x2A, 0x97, 0x2B, + 0x2A, 0x28, 0x7B, 0x2C, 0xED, 0x20, 0x75, 0x35, 0x7F, 0x15, 0x07, 0x3A, + 0x87, 0x08, 0x18, 0x30, 0x4F, 0x0A, 0x98, 0x23, 0xCB, 0x16, 0xB9, 0x1B, + 0x83, 0x1D, 0xA5, 0x1E, 0xE7, 0x20, 0x91, 0x2B, 0xAA, 0x25, 0x65, 0x34, + 0x02, 0x21, 0x9A, 0x2A, 0xC7, 0x13, 0xF9, 0x1B, 0xCB, 0x18, 0x71, 0x2D, + 0x6E, 0x21, 0xE6, 0x4A, 0xAA, 0x20, 0x7A, 0x53, 0xB2, 0x2B, 0x2D, 0x4C, + 0x9D, 0x33, 0x41, 0x37, 0x01, 0x34, 0x9B, 0x2D, 0x6F, 0x43, 0x65, 0x40, + 0xF3, 0x51, 0xB9, 0x4D, 0xDA, 0x41, 0xA2, 0x3E, 0xB7, 0x36, 0x75, 0x32, + 0xB7, 0x43, 0x3E, 0x3C, 0xC9, 0x3D, 0x34, 0x3F, 0xC7, 0x30, 0x36, 0x35, + 0xED, 0x38, 0x15, 0x32, 0x28, 0x42, 0xE5, 0x36, 0x33, 0x42, 0x6F, 0x41, + 0xA5, 0x3A, 0x83, 0x41, 0xEF, 0x26, 0xA2, 0x2B, 0xEB, 0x20, 0x53, 0x27, + 0x83, 0x2A, 0x45, 0x2F, 0x4B, 0x32, 0xED, 0x2A, 0xB3, 0x32, 0xEE, 0x25, + 0xF7, 0x35, 0x31, 0x29, 0xE2, 0x2E, 0x7D, 0x1B, 0x89, 0x1A, 0x96, 0x0B, + 0x8B, 0x18, 0x7B, 0x21, 0xEB, 0x1B, 0x67, 0x40, 0xBC, 0x24, 0x70, 0x55, + 0x9E, 0x37, 0x86, 0x65, 0x9A, 0x2D, 0x8A, 0x53, 0x89, 0x15, 0x90, 0x29, + 0xEC, 0x19, 0x85, 0x27, 0x4C, 0x2E, 0xBA, 0x3B, 0xAB, 0x3A, 0x63, 0x3D, + 0x2D, 0x45, 0x28, 0x48, 0xFC, 0x39, 0xEB, 0x4B, 0xB8, 0x07, 0x0E, 0x2C, + 0x25, 0xEE, 0xA7, 0x16, 0xC5, 0xF6, 0xBD, 0x28, 0x0C, 0xF1, 0xCC, 0x30, + 0x14, 0xFC, 0x6B, 0x2B, 0x40, 0x1C, 0x87, 0x32, 0xB1, 0xF7, 0xF9, 0x08, + 0x6B, 0xBC, 0x30, 0xE2, 0x8C, 0xC1, 0xCE, 0xFD, 0xF2, 0xDF, 0xA4, 0x1C, + 0x10, 0x07, 0x03, 0x27, 0x80, 0x27, 0x89, 0x22, 0xC2, 0x26, 0x59, 0x20, + 0x2A, 0x16, 0x2D, 0x2A, 0x13, 0xE4, 0x2B, 0x04, 0x4F, 0xC9, 0xF4, 0xE2, + 0x6B, 0xF4, 0xDE, 0x0D, 0x93, 0xF7, 0x5F, 0x15, 0xDF, 0xBD, 0xF5, 0xE3, + 0x55, 0xA9, 0xC2, 0xDD, 0x7C, 0xAE, 0x6F, 0xE4, 0x61, 0xAA, 0x06, 0xC8, + 0x97, 0xD5, 0x9D, 0xD8, 0x2C, 0x06, 0x56, 0x0C, 0x8C, 0xFB, 0x89, 0x12, + 0x2D, 0xDC, 0xAA, 0xFA, 0x50, 0xC8, 0xE4, 0xDE, 0x85, 0xB3, 0xAD, 0xBA, + 0xDD, 0xA2, 0x15, 0xA8, 0x49, 0xB2, 0x27, 0xC4, 0xDE, 0xBD, 0xAC, 0xD3, + 0x03, 0xAC, 0x74, 0xB4, 0x9B, 0x9E, 0x38, 0x9D, 0x53, 0xA0, 0x1F, 0xA3, + 0xE8, 0xA9, 0x75, 0xAB, 0xA9, 0xB6, 0xCE, 0xA7, 0x54, 0xD7, 0x44, 0xC1, + 0x7C, 0xF3, 0x31, 0xE9, 0x8B, 0xDF, 0x9E, 0xE5, 0x08, 0xB5, 0xD6, 0xBA, + 0x51, 0xA6, 0x2A, 0x9D, 0x6C, 0xBC, 0x33, 0xAB, 0xD2, 0xCD, 0xBD, 0xB9, + 0x93, 0xC9, 0x15, 0xB6, 0xE1, 0xBA, 0x3D, 0xAD, 0x50, 0xA8, 0x62, 0xA7, + 0xBF, 0xA3, 0xAE, 0xA9, 0x55, 0xC2, 0xD3, 0xB7, 0x81, 0xFC, 0x4F, 0xD4, + 0xA4, 0x29, 0x2C, 0xEB, 0x31, 0x23, 0x1C, 0xE8, 0xB8, 0xF1, 0x8D, 0xCE, + 0xE7, 0xB9, 0xC8, 0xAC, 0x17, 0xA0, 0xF4, 0x9D, 0xEB, 0xA3, 0xD6, 0xA6, + 0x36, 0xB5, 0xA9, 0xB9, 0x58, 0xD3, 0xFB, 0xD5, 0xC6, 0xD6, 0x76, 0xDC, + 0x3B, 0xBE, 0x88, 0xCB, 0xC3, 0xC4, 0x4A, 0xCB, 0xD2, 0xF0, 0xB7, 0xDA, + 0xF4, 0x27, 0xED, 0xF7, 0x84, 0x52, 0xF9, 0x1A, 0xDD, 0x4E, 0x61, 0x17, + 0xEA, 0x21, 0xC5, 0xEC, 0x4D, 0xFC, 0x73, 0xD1, 0x5B, 0xEA, 0xC6, 0xD0, + 0xF5, 0xE9, 0xB4, 0xDA, 0x1E, 0x03, 0x80, 0xF3, 0x74, 0x17, 0xBC, 0x03, + 0x9B, 0x0A, 0xA2, 0xFA, 0x4A, 0xF7, 0xB0, 0xFE, 0x93, 0xF7, 0xC5, 0x12, + 0xB3, 0x0E, 0x7F, 0x1B, 0x57, 0x3D, 0xA6, 0x26, 0xA3, 0x60, 0xD7, 0x3A, + 0xF4, 0x5B, 0xCB, 0x3E, 0x6F, 0x43, 0x8E, 0x2D, 0xC4, 0x24, 0xFE, 0x15, + 0xBE, 0x05, 0x49, 0x00, 0x80, 0x06, 0xF4, 0x04, 0x74, 0x26, 0x83, 0x27, + 0x55, 0x26, 0x87, 0x37, 0x01, 0x04, 0x4B, 0x28, 0xAA, 0xFC, 0xF2, 0x25, + 0x9C, 0x17, 0x4A, 0x39, 0x73, 0x3A, 0xB8, 0x4C, 0x31, 0x59, 0x8C, 0x5C, + 0x14, 0x63, 0x46, 0x61, 0xE7, 0x57, 0xF9, 0x5C, 0x3E, 0x4D, 0x95, 0x57, + 0xBA, 0x3A, 0xA8, 0x4F, 0xE7, 0x29, 0x95, 0x50, 0x16, 0x28, 0x1D, 0x54, + 0x9B, 0x2C, 0x3E, 0x4B, 0xAF, 0x25, 0xED, 0x3A, 0xC8, 0x14, 0xD0, 0x33, + 0xE4, 0x19, 0xA1, 0x34, 0xAD, 0x36, 0xF6, 0x3B, 0x9D, 0x56, 0x71, 0x4E, + 0xB3, 0x5D, 0xF8, 0x5B, 0xB5, 0x56, 0xE9, 0x5F, 0xC9, 0x53, 0xE5, 0x5F, + 0x61, 0x44, 0xD8, 0x52, 0x90, 0x37, 0x79, 0x3F, 0x0C, 0x36, 0x42, 0x3B, + 0x55, 0x2E, 0x33, 0x3B, 0xAB, 0x28, 0x65, 0x38, 0xBF, 0x2E, 0xBB, 0x37, + 0xFA, 0x2D, 0x78, 0x34, 0xD7, 0x28, 0xBD, 0x36, 0x7F, 0x3D, 0x0F, 0x4C, + 0x20, 0x57, 0xFF, 0x62, 0xCD, 0x5B, 0x1A, 0x65, 0xCF, 0x5D, 0x8F, 0x59, + 0x99, 0x51, 0x12, 0x45, 0x7A, 0x34, 0x33, 0x3A, 0x1A, 0x26, 0x2B, 0x43, + 0x2E, 0x1A, 0xE0, 0x3D, 0x93, 0x01, 0x52, 0x27, 0x7A, 0xEF, 0x0C, 0x1C, + 0x89, 0xE6, 0x70, 0x0C, 0x3D, 0xEB, 0x51, 0xFE, 0xEE, 0x0D, 0xCB, 0x16, + 0x51, 0x35, 0x7E, 0x39, 0x97, 0x45, 0x7F, 0x42, 0x1A, 0x51, 0x9E, 0x41, + 0xBF, 0x49, 0x35, 0x32, 0x8C, 0x23, 0xA8, 0x17, 0xC7, 0x03, 0xA6, 0x16, + 0x8A, 0xFB, 0x33, 0x25, 0xED, 0xFD, 0xAA, 0x22, 0x66, 0xF5, 0x32, 0x0D, + 0xDB, 0xE1, 0x17, 0xFC, 0x3F, 0xD2, 0x02, 0xF8, 0xA9, 0xE1, 0x61, 0x10, + 0xC9, 0x0A, 0xA7, 0x3E, 0x24, 0x24, 0x6C, 0x56, 0x06, 0x30, 0xBC, 0x54, + 0x00, 0x3A, 0x07, 0x49, 0x6F, 0x33, 0xC2, 0x39, 0x02, 0x15, 0xCB, 0x1F, + 0xBF, 0xF7, 0x37, 0x03, 0x0F, 0xEC, 0x4B, 0xF2, 0x99, 0xDD, 0x03, 0xED, + 0x8E, 0xBF, 0xC0, 0xEB, 0x38, 0xA2, 0x06, 0xE2, 0x0E, 0xA5, 0x61, 0xE4, + 0x13, 0xC8, 0x62, 0xFD, 0xEE, 0xE3, 0x21, 0x14, 0x04, 0xF9, 0x93, 0x25, + 0x3E, 0x0B, 0x38, 0x2C, 0xF9, 0x10, 0x83, 0x1C, 0x9A, 0x1C, 0xEB, 0x11, + 0x29, 0x17, 0x9D, 0x05, 0x71, 0xE9, 0x65, 0xDE, 0xD4, 0xC4, 0xF8, 0xBE, + 0xEB, 0xC8, 0x25, 0xBF, 0x1E, 0xD5, 0x6B, 0xC6, 0xD8, 0xDB, 0xBC, 0xC5, + 0x5C, 0xE0, 0x24, 0xC0, 0xC6, 0xDC, 0xA0, 0xBB, 0x85, 0xDE, 0x63, 0xCC, + 0x9E, 0xF7, 0x52, 0xEF, 0xFB, 0x09, 0x68, 0xFA, 0xFC, 0xF9, 0x00, 0xE8, + 0xB8, 0xEB, 0x84, 0xDC, 0x8B, 0xDD, 0x91, 0xCB, 0x48, 0xC6, 0x30, 0xAE, + 0xA1, 0xBB, 0x58, 0xA3, 0x13, 0xBC, 0x85, 0xA0, 0x0D, 0xC1, 0x62, 0xA0, + 0x50, 0xCD, 0x5D, 0xB1, 0x60, 0xD5, 0x0D, 0xB9, 0xEF, 0xD3, 0xC2, 0xBA, + 0x53, 0xDF, 0x80, 0xD9, 0xDE, 0xF8, 0x00, 0xF7, 0xB2, 0x14, 0x7E, 0xF2, + 0x9C, 0x22, 0xAC, 0xEB, 0x53, 0x10, 0x8A, 0xEF, 0x3A, 0xF3, 0x02, 0xE5, + 0x21, 0xE7, 0xE7, 0xD8, 0x15, 0xDA, 0x54, 0xD3, 0x91, 0xD1, 0x8D, 0xD0, + 0xAD, 0xE0, 0x24, 0xD6, 0x39, 0xEF, 0x6C, 0xDA, 0x1B, 0xF1, 0xE9, 0xDB, + 0x69, 0xEF, 0xEB, 0xD8, 0xB9, 0xF0, 0xB0, 0xDE, 0xF3, 0xFB, 0x6B, 0xEC, + 0x09, 0x13, 0x95, 0xF0, 0x06, 0x14, 0x1E, 0xE5, 0x98, 0xFB, 0x65, 0xD9, + 0xDB, 0xEF, 0xFB, 0xE2, 0xD4, 0xEF, 0xB2, 0xE8, 0x6D, 0xE6, 0x93, 0xE0, + 0xE6, 0xDE, 0xAE, 0xD9, 0x46, 0xE2, 0xF5, 0xD1, 0x40, 0xF1, 0x8C, 0xE0, + 0x48, 0x12, 0x0F, 0x0E, 0x54, 0x1A, 0xE7, 0x1F, 0x83, 0x0C, 0x71, 0x05, + 0x5D, 0x1B, 0xD9, 0x02, 0xED, 0x37, 0x17, 0x1F, 0x78, 0x42, 0x80, 0x27, + 0xAE, 0x3E, 0xE7, 0x1D, 0x4B, 0x35, 0xDB, 0x15, 0x20, 0x19, 0x02, 0x0B, + 0x81, 0x08, 0x1F, 0x0E, 0x2A, 0x08, 0x56, 0x20, 0xBD, 0xF5, 0x1E, 0x1B, + 0x7E, 0xEF, 0x14, 0x09, 0xFA, 0xFB, 0x9F, 0x0B, 0x61, 0x03, 0xEB, 0x19, + 0xF9, 0x16, 0x5C, 0x26, 0x74, 0x31, 0x1F, 0x27, 0x4E, 0x2C, 0x5A, 0x1E, + 0x4C, 0x1A, 0x76, 0x1E, 0xD6, 0x18, 0xAA, 0x1B, 0xDC, 0x0B, 0xF6, 0x0A, + 0x07, 0xF8, 0xE8, 0x01, 0x36, 0xFD, 0xCE, 0x0D, 0x78, 0x07, 0x31, 0x1D, + 0x22, 0x06, 0x26, 0x22, 0x45, 0x0B, 0x51, 0x18, 0xB3, 0x1F, 0xCA, 0x0F, + 0x6E, 0x37, 0x0F, 0x2A, 0x31, 0x43, 0xB0, 0x44, 0x3E, 0x41, 0x1A, 0x3D, + 0x46, 0x38, 0x30, 0x2A, 0x1B, 0x2C, 0xDC, 0x1D, 0xC3, 0x1F, 0x66, 0x1B, + 0x8A, 0x15, 0x64, 0x25, 0x4F, 0x0B, 0x38, 0x27, 0x3C, 0x09, 0x07, 0x0A, + 0x04, 0x06, 0x7B, 0xEF, 0x5F, 0xF6, 0xEF, 0xF2, 0xAC, 0xE7, 0xEB, 0xFD, + 0xD5, 0xF1, 0x35, 0x06, 0xBE, 0x1D, 0x09, 0x1F, 0x4C, 0x3E, 0xEF, 0x32, + 0x48, 0x2F, 0xFF, 0x26, 0x7F, 0x0D, 0xC0, 0x15, 0x74, 0xF7, 0xFC, 0x00, + 0x22, 0xF9, 0x5C, 0xF7, 0x1A, 0x14, 0xDF, 0x0D, 0xDE, 0x1A, 0x27, 0x17, + 0xFD, 0xF8, 0x1D, 0xFE, 0x33, 0xE8, 0x70, 0xFA, 0xFF, 0xFD, 0xFB, 0x09, + 0xCC, 0x0A, 0xF7, 0xFE, 0x83, 0xFA, 0x21, 0x01, 0x01, 0xEF, 0x3B, 0x11, + 0x6A, 0xED, 0xB7, 0x06, 0x29, 0xEB, 0xAD, 0x03, 0xA2, 0xDC, 0xE1, 0x04, + 0x09, 0xC5, 0xA9, 0xE6, 0x02, 0xBE, 0x38, 0xCC, 0xE0, 0xBA, 0xEA, 0xCC, + 0x9F, 0xB7, 0x92, 0xBE, 0x43, 0xC0, 0x30, 0xB8, 0x68, 0xCE, 0x2A, 0xD2, + 0x8E, 0xE2, 0x13, 0xE2, 0x94, 0xF3, 0xF3, 0xEE, 0xD8, 0xE8, 0x2E, 0x07, + 0xE8, 0xD2, 0x01, 0x09, 0x84, 0xD6, 0x6A, 0xF4, 0xB2, 0xD9, 0x4C, 0xF4, + 0x9E, 0xC6, 0xC3, 0xE8, 0x88, 0xCA, 0xBC, 0xC3, 0x5E, 0xDF, 0xBC, 0xC2, + 0x76, 0xCE, 0x44, 0xD7, 0x5B, 0xBD, 0x1E, 0xDD, 0x43, 0xCF, 0xD9, 0xD8, + 0x15, 0xD4, 0x05, 0xD3, 0x97, 0xD2, 0x8F, 0xD7, 0xE5, 0xE1, 0xA2, 0xE7, + 0x0C, 0xE6, 0x52, 0x08, 0x71, 0xDE, 0x0B, 0x16, 0xEF, 0xD3, 0x81, 0xFA, + 0xC0, 0xC6, 0x05, 0xD9, 0x99, 0xC4, 0x3B, 0xC6, 0x43, 0xCE, 0xD0, 0xCD, + 0x1E, 0xBF, 0xE4, 0xDD, 0x74, 0xA1, 0xE3, 0xE5, 0x6A, 0xAF, 0xB6, 0xE7, + 0xAC, 0xC4, 0x08, 0xDA, 0x58, 0xC8, 0xF2, 0xD1, 0xF9, 0xD8, 0x0D, 0xE3, + 0x7E, 0xE0, 0xFB, 0xEB, 0x92, 0xE5, 0x93, 0xF1, 0x1A, 0xF7, 0x9F, 0xF1, + 0x74, 0xE7, 0xEB, 0xC5, 0xA8, 0xC3, 0xAD, 0xA0, 0x10, 0xC9, 0x73, 0xB1, + 0x4C, 0xE6, 0x45, 0xCA, 0x21, 0xF2, 0x8E, 0xC9, 0xA7, 0xEA, 0xB5, 0xC4, + 0x8F, 0xDB, 0x9D, 0xC8, 0xAB, 0xD2, 0x98, 0xD0, 0xE5, 0xEE, 0x8D, 0xE4, + 0xAA, 0x0B, 0x02, 0xF1, 0xE4, 0xEF, 0x9E, 0xE4, 0x61, 0xD3, 0x95, 0xDD, + 0x87, 0xDC, 0xB2, 0xD6, 0x45, 0xE4, 0x2C, 0xC0, 0xC6, 0xD1, 0x91, 0xBB, + 0xA1, 0xC3, 0x55, 0xC6, 0xCB, 0xD1, 0xE1, 0xCD, 0xAF, 0xE2, 0xDA, 0xD0, + 0x59, 0xE0, 0x1C, 0xD1, 0x3B, 0xD5, 0xE2, 0xDA, 0xD7, 0xDE, 0xAD, 0xF5, + 0x06, 0xF8, 0x24, 0x19, 0x51, 0x0B, 0x5B, 0x1E, 0x60, 0x13, 0xBB, 0x0D, + 0x15, 0x0D, 0x54, 0x03, 0xD8, 0x03, 0x23, 0xF9, 0x01, 0x09, 0x06, 0x02, + 0x08, 0x14, 0xD6, 0x0E, 0xEC, 0x0E, 0x09, 0xFF, 0xB9, 0xFC, 0x64, 0xF5, + 0x62, 0xF3, 0x26, 0x05, 0x47, 0x01, 0xCD, 0x0D, 0xAD, 0x1B, 0x6E, 0x10, + 0x2C, 0x1E, 0x78, 0x11, 0xCD, 0x05, 0x7E, 0x07, 0x01, 0xFF, 0x12, 0x04, + 0x08, 0x09, 0xA8, 0x0C, 0xF2, 0x04, 0xD5, 0x0C, 0x60, 0x0A, 0x47, 0x08, + 0x73, 0x2A, 0x0A, 0x11, 0x86, 0x38, 0xAF, 0x1A, 0xBD, 0x22, 0x89, 0x1B, + 0xC5, 0x0D, 0x3E, 0x15, 0xCB, 0x12, 0x91, 0x0D, 0xDB, 0x33, 0x41, 0x19, + 0xC9, 0x4F, 0x35, 0x2F, 0x9A, 0x40, 0xDA, 0x2C, 0x63, 0x24, 0x59, 0x1B, + 0xBC, 0x34, 0xCD, 0x24, 0xAA, 0x4A, 0xC6, 0x38, 0x49, 0x33, 0x2B, 0x3E, + 0xFA, 0x24, 0xC4, 0x3F, 0x48, 0x36, 0xB3, 0x39, 0x64, 0x43, 0x0C, 0x3B, + 0x0B, 0x46, 0xC9, 0x47, 0x31, 0x38, 0xEC, 0x36, 0x72, 0x1C, 0xA7, 0x12, + 0x16, 0x0B, 0xCD, 0x13, 0x0F, 0x13, 0xAA, 0x2B, 0xE6, 0x20, 0xFE, 0x2A, + 0x01, 0x1D, 0x64, 0x1F, 0x1C, 0x1B, 0x6D, 0x16, 0xEC, 0x20, 0x58, 0x14, + 0x94, 0x27, 0x6C, 0x2D, 0xBD, 0x30, 0xEE, 0x3E, 0x6D, 0x33, 0x22, 0x2C, + 0x9C, 0x44, 0x1B, 0x22, 0x11, 0x5B, 0xDC, 0x36, 0xC2, 0x56, 0x3C, 0x34, + 0xF7, 0x4C, 0xFC, 0x1E, 0x87, 0x4A, 0x25, 0x1E, 0x3A, 0x3C, 0x4D, 0x2A, + 0x4A, 0x31, 0x12, 0x3C, 0x66, 0x3E, 0x2C, 0x3F, 0x46, 0x49, 0x94, 0x31, + 0x74, 0x4E, 0x9B, 0x25, 0xF7, 0x55, 0xB4, 0x3A, 0xCD, 0x5E, 0x5C, 0x4F, + 0x05, 0x57, 0x11, 0x3B, 0xE3, 0x46, 0xC1, 0x22, 0xF2, 0x43, 0xE8, 0x17, + 0x55, 0x40, 0xA2, 0x1C, 0xFA, 0x42, 0x0A, 0x25, 0x04, 0x3F, 0xD8, 0x18, + 0x72, 0x2C, 0x4B, 0x10, 0xA8, 0x20, 0xF2, 0x23, 0x39, 0x1A, 0x79, 0x33, + 0xF2, 0x18, 0x21, 0x33, 0xAD, 0x1B, 0x36, 0x2D, 0xD4, 0x2E, 0xA3, 0x23, + 0x7C, 0x57, 0x7A, 0x2D, 0xD5, 0x5B, 0x9D, 0x34, 0x52, 0x31, 0xB8, 0x10, + 0xD7, 0x1E, 0xC6, 0xF3, 0xEC, 0x33, 0x29, 0x0A, 0xD5, 0x36, 0xB3, 0x27, + 0x84, 0x1B, 0x82, 0x22, 0xB2, 0x0B, 0x73, 0x15, 0x25, 0x0F, 0x85, 0x0A, + 0x60, 0x19, 0x07, 0x0B, 0xB1, 0x21, 0x8C, 0x2C, 0x02, 0x1A, 0x93, 0x2F, + 0xB1, 0x08, 0x80, 0x11, 0xC7, 0x07, 0x23, 0x0A, 0x60, 0x0C, 0x7E, 0x08, + 0x42, 0xFF, 0x52, 0xFA, 0x63, 0xFD, 0x52, 0xF1, 0x7B, 0x07, 0x16, 0xF6, + 0x2D, 0x02, 0xB6, 0xF7, 0x6A, 0xF8, 0xE9, 0x02, 0x2B, 0xEE, 0xEA, 0x0D, + 0x67, 0xE6, 0x8C, 0xF8, 0x07, 0xED, 0x55, 0xF4, 0x3F, 0xFC, 0x98, 0x0D, + 0x6B, 0x00, 0xBA, 0x19, 0x26, 0x00, 0x86, 0x23, 0x38, 0x09, 0x07, 0x21, + 0xE1, 0x08, 0xC2, 0x04, 0xB1, 0x0A, 0xC9, 0x01, 0xA3, 0x10, 0xF8, 0x18, + 0x85, 0x04, 0x54, 0x1A, 0x63, 0xFE, 0xA9, 0x18, 0x30, 0x0E, 0x1B, 0x22, + 0xE9, 0x1B, 0xD3, 0x10, 0xE6, 0x0E, 0xF0, 0xF6, 0x45, 0xF8, 0xA1, 0x06, + 0x46, 0xEC, 0x31, 0x14, 0x3B, 0xF7, 0x64, 0x0B, 0x80, 0x0C, 0xF0, 0x05, + 0x4D, 0x0A, 0x37, 0xFE, 0x9B, 0xFA, 0x94, 0xFD, 0xE1, 0xF2, 0xDD, 0x0F, + 0x80, 0xFD, 0x42, 0x24, 0x9D, 0x05, 0x02, 0x20, 0xD6, 0xF7, 0x31, 0x12, + 0x50, 0xE5, 0x25, 0x10, 0x74, 0xEC, 0x30, 0x08, 0xFE, 0x01, 0x01, 0xFA, + 0x0B, 0xF5, 0x64, 0xFB, 0xE0, 0xEB, 0xDB, 0x05, 0xFF, 0x09, 0x4B, 0x1A, + 0xC8, 0x15, 0x30, 0x2D, 0xEA, 0x07, 0xAF, 0x1B, 0x11, 0x02, 0x9D, 0x01, + 0x52, 0x02, 0x40, 0xFC, 0xC9, 0x08, 0x3D, 0x0F, 0x22, 0x0A, 0x71, 0x29, + 0xD6, 0xEE, 0x46, 0x14, 0xA6, 0xD3, 0x32, 0xEC, 0xE0, 0xDA, 0xDF, 0xE7, + 0xD8, 0xE2, 0xAA, 0xF0, 0xB9, 0xD0, 0xD7, 0xF9, 0x4D, 0xCE, 0xA6, 0x00, + 0x6D, 0xDE, 0x7D, 0xF7, 0x90, 0xE4, 0xE6, 0xF0, 0x87, 0xEE, 0x24, 0xF9, + 0x1A, 0xE3, 0xC9, 0x03, 0xD7, 0xBC, 0xFF, 0xF3, 0xB3, 0xBC, 0x26, 0xE5, + 0xA1, 0xDC, 0xA4, 0xEA, 0xC9, 0xDC, 0x70, 0xDB, 0xAE, 0xCE, 0x65, 0xC7, + 0x9B, 0xD1, 0x73, 0xC2, 0x9E, 0xD3, 0x07, 0xD1, 0xE0, 0xD8, 0x9B, 0xE3, + 0x7D, 0xE0, 0x40, 0xE9, 0x68, 0xD8, 0xBF, 0xEB, 0x41, 0xD4, 0x7D, 0xE8, + 0x23, 0xDD, 0x09, 0xE7, 0xBB, 0xD6, 0x7F, 0xE0, 0x90, 0xC0, 0x5A, 0xD0, + 0x45, 0xC7, 0x15, 0xCE, 0x24, 0xDB, 0x38, 0xD0, 0x86, 0xD7, 0x60, 0xD9, + 0xA0, 0xCF, 0x34, 0xDA, 0x19, 0xCD, 0x8A, 0xC7, 0x60, 0xD0, 0xE5, 0xD8, + 0xBA, 0xDB, 0xE7, 0xFC, 0x05, 0xE3, 0xC6, 0xF7, 0x6C, 0xDE, 0xEC, 0xE1, + 0x37, 0xD7, 0x27, 0xD4, 0x37, 0xD8, 0x8D, 0xCA, 0x1A, 0xDF, 0x7A, 0xD8, + 0x49, 0xCB, 0xB4, 0xD8, 0xDC, 0xA7, 0x93, 0xBB, 0x43, 0xB7, 0x25, 0xC1, + 0x37, 0xE6, 0xAC, 0xE6, 0xF8, 0xE5, 0x7A, 0xE5, 0x85, 0xC7, 0x49, 0xC6, + 0x0B, 0xC8, 0xFE, 0xD2, 0x75, 0xE4, 0x99, 0xEA, 0xA7, 0xF9, 0x8C, 0xF3, + 0xFC, 0xF8, 0x5B, 0xF9, 0xA4, 0xDA, 0x09, 0xD9, 0xDE, 0xB8, 0x12, 0xBB, + 0x3E, 0xB8, 0x5B, 0xCA, 0x06, 0xB6, 0xF1, 0xD5, 0x15, 0xAB, 0xF3, 0xC0, + 0x08, 0xC1, 0x42, 0xAD, 0x68, 0xD7, 0x41, 0xA6, 0xFB, 0xC8, 0x1D, 0xAB, + 0x60, 0xB8, 0xA0, 0xC2, 0x43, 0xAC, 0x98, 0xD3, 0xF0, 0xB2, 0x47, 0xC5, + 0xC8, 0xE0, 0xAD, 0xBA, 0x4A, 0xFA, 0xC9, 0xC2, 0x2E, 0xE3, 0xC9, 0xBB, + 0xF5, 0xCC, 0x8E, 0xB6, 0x9D, 0xC9, 0x70, 0xBA, 0xE4, 0xC3, 0x0C, 0xB7, + 0x33, 0xC8, 0xAF, 0xAE, 0x85, 0xD5, 0x2F, 0xAE, 0x45, 0xD2, 0x16, 0xBA, + 0x68, 0xCF, 0x65, 0xC0, 0xBC, 0xD7, 0x7C, 0xC7, 0x50, 0xD0, 0x49, 0xC8, + 0xF8, 0xC2, 0x52, 0xBA, 0xB6, 0xC8, 0x9F, 0xBD, 0xDA, 0xCF, 0x78, 0xBA, + 0xD7, 0xC6, 0xDB, 0xB3, 0x85, 0xB6, 0x84, 0xB8, 0x45, 0xAD, 0xB6, 0xB0, + 0xCF, 0xAD, 0xC6, 0xB7, 0xF7, 0xB7, 0xB8, 0xC4, 0x55, 0xB6, 0xED, 0xC2, + 0x7F, 0xB2, 0x06, 0xBD, 0xA0, 0xBE, 0x96, 0xC5, 0xDD, 0xD9, 0x9B, 0xE3, + 0x2C, 0xFA, 0x18, 0xF8, 0x06, 0x00, 0x50, 0xE7, 0x8E, 0xED, 0xD1, 0xC7, + 0xC8, 0xDF, 0xB6, 0xC8, 0xEE, 0xDC, 0x7C, 0xDF, 0xFD, 0xCD, 0xE6, 0xE0, + 0x1F, 0xB8, 0x1F, 0xD1, 0x80, 0xB8, 0xF8, 0xCD, 0x04, 0xCB, 0xCD, 0xD1, + 0x65, 0xDB, 0xFA, 0xDE, 0xE6, 0xDC, 0xDA, 0xEC, 0x0D, 0xD0, 0x3A, 0xD5, + 0x8F, 0xC7, 0xBF, 0xCE, 0x64, 0xCD, 0xFB, 0xF4, 0xB9, 0xD1, 0x6E, 0xF8, + 0xCD, 0xC3, 0xE8, 0xDB, 0xB5, 0xB2, 0x3E, 0xC0, 0x86, 0xAD, 0xC9, 0xB2, + 0xA5, 0xB6, 0x20, 0xCC, 0x7D, 0xC7, 0x0C, 0xEC, 0xFE, 0xD2, 0x61, 0xF3, + 0x32, 0xDA, 0xDB, 0xDE, 0xE1, 0xEA, 0x69, 0xD7, 0x2D, 0x04, 0xB8, 0xF3, + 0xEC, 0x11, 0x34, 0xF7, 0x8B, 0x13, 0x18, 0xE9, 0x21, 0x11, 0x6E, 0xF3, + 0x9C, 0x0D, 0xC8, 0xFA, 0xF6, 0x0A, 0x2B, 0xEF, 0xF2, 0xFD, 0x70, 0xE8, + 0x3B, 0xF3, 0x11, 0xE8, 0x82, 0xFE, 0x60, 0xF8, 0x69, 0x12, 0xBD, 0x24, + 0x80, 0x16, 0x5A, 0x29, 0x7C, 0x02, 0xCC, 0x00, 0x57, 0xFA, 0xC0, 0xFB, + 0x89, 0x10, 0x0D, 0x13, 0xC5, 0x22, 0x1B, 0x1D, 0x59, 0x19, 0x53, 0x12, + 0x76, 0x07, 0x90, 0x0C, 0x2A, 0x0F, 0xAA, 0x1C, 0xB5, 0x13, 0x2F, 0x28, + 0x38, 0x02, 0x45, 0x1F, 0x86, 0xFC, 0x16, 0x18, 0x4C, 0xFF, 0xDB, 0x11, + 0x71, 0x14, 0xD1, 0x1A, 0x3E, 0x32, 0x20, 0x38, 0x92, 0x1D, 0x7C, 0x29, + 0x33, 0x00, 0xF6, 0x05, 0x84, 0x26, 0xC2, 0x1B, 0xC4, 0x58, 0xF8, 0x48, + 0x4B, 0x4E, 0x17, 0x48, 0xC9, 0x27, 0xC2, 0x2E, 0x81, 0x19, 0x47, 0x22, + 0x94, 0x1A, 0x50, 0x1C, 0x20, 0x26, 0xE8, 0x23, 0xDC, 0x30, 0x28, 0x32, + 0xCC, 0x18, 0x6A, 0x21, 0x33, 0x0F, 0x19, 0x05, 0x0D, 0x2A, 0x38, 0x09, + 0x7E, 0x22, 0x0C, 0x0A, 0xD7, 0x04, 0x44, 0xF5, 0x56, 0x09, 0x75, 0xEF, + 0x35, 0x17, 0xB1, 0xF8, 0x27, 0x15, 0x16, 0x05, 0x1B, 0x12, 0xBA, 0x0B, + 0xF3, 0x07, 0xFC, 0x0D, 0xC0, 0x00, 0x7C, 0x0C, 0xB7, 0x14, 0xEA, 0xFF, + 0x92, 0x28, 0x4C, 0x02, 0xFB, 0x2A, 0x66, 0x06, 0x5C, 0x2B, 0xE4, 0xFE, + 0xA5, 0x26, 0xC0, 0x0E, 0xE2, 0x27, 0x8C, 0x27, 0x65, 0x3A, 0x16, 0x2F, + 0xB4, 0x42, 0xCB, 0x28, 0xB4, 0x48, 0x4C, 0x29, 0x51, 0x4C, 0x25, 0x34, + 0xB2, 0x32, 0x29, 0x3B, 0x7F, 0x16, 0x94, 0x34, 0x95, 0x18, 0xF0, 0x23, + 0xA6, 0x2A, 0x44, 0x14, 0x2A, 0x35, 0x97, 0x15, 0x63, 0x33, 0x1B, 0x31, + 0xDB, 0x21, 0xF6, 0x36, 0xC9, 0x11, 0x06, 0x2D, 0xCE, 0x21, 0xED, 0x38, + 0x06, 0x39, 0xA2, 0x3F, 0xC5, 0x36, 0x31, 0x36, 0xA8, 0x3C, 0x06, 0x3F, + 0x14, 0x42, 0x53, 0x48, 0xF6, 0x3C, 0x56, 0x44, 0xBF, 0x46, 0x23, 0x48, + 0x0C, 0x45, 0x2E, 0x31, 0x5A, 0x33, 0x21, 0x0C, 0xB7, 0x3F, 0x14, 0x14, + 0xBA, 0x5C, 0xA0, 0x38, 0xC0, 0x4D, 0xD8, 0x40, 0x4D, 0x36, 0x39, 0x30, + 0x78, 0x45, 0x65, 0x24, 0xC0, 0x59, 0x12, 0x2A, 0xF1, 0x5C, 0x22, 0x4A, + 0xC3, 0x58, 0x8A, 0x52, 0x90, 0x51, 0x81, 0x2C, 0x52, 0x50, 0xF7, 0x18, + 0x22, 0x54, 0x2C, 0x1F, 0x7B, 0x3E, 0x36, 0x1D, 0x93, 0x25, 0xF6, 0x22, + 0x6E, 0x23, 0x15, 0x23, 0xDB, 0x25, 0x26, 0x19, 0x0D, 0x31, 0x8A, 0x28, + 0x5C, 0x3C, 0x5E, 0x39, 0x6E, 0x2F, 0x61, 0x25, 0x56, 0x21, 0xED, 0x11, + 0x29, 0x28, 0xC7, 0x21, 0x63, 0x2E, 0xDA, 0x39, 0x95, 0x2C, 0x5C, 0x2F, + 0xF6, 0x20, 0xA3, 0x1A, 0x49, 0x0B, 0xCB, 0x1E, 0xDD, 0xFD, 0x8C, 0x19, + 0xBE, 0x03, 0x13, 0x12, 0xCA, 0x02, 0x01, 0x13, 0xBC, 0xF9, 0x82, 0x0A, + 0x35, 0x0B, 0xB9, 0x10, 0x1F, 0x29, 0x42, 0x21, 0x2B, 0x25, 0x7B, 0x17, + 0x48, 0x08, 0x31, 0x06, 0x45, 0xF7, 0xFE, 0x08, 0xCC, 0xF3, 0x33, 0x17, + 0x76, 0xFA, 0x4C, 0x16, 0xD2, 0x02, 0xC1, 0x08, 0x74, 0x07, 0xCF, 0x0B, + 0x50, 0x00, 0x79, 0x09, 0x1D, 0xE7, 0x08, 0xF1, 0x6D, 0xDB, 0x46, 0xE1, + 0x6B, 0xE3, 0xFE, 0xE2, 0x0A, 0xEA, 0x60, 0xD7, 0xD2, 0x02, 0xA4, 0xDE, + 0x24, 0x1A, 0xFE, 0xF3, 0xC6, 0x00, 0x72, 0xCD, 0xD6, 0xE7, 0x11, 0xB7, + 0x2D, 0x06, 0xA0, 0xE9, 0x39, 0x24, 0x83, 0x00, 0x4D, 0x11, 0x2D, 0xDF, + 0x62, 0xF7, 0x0E, 0xD0, 0x70, 0xF0, 0x7A, 0xE1, 0xD2, 0xEC, 0x9C, 0xEC, + 0x2E, 0xE5, 0x9B, 0xFB, 0xAC, 0xD0, 0x2C, 0xFC, 0x50, 0xBF, 0x4C, 0xDE, + 0x6F, 0xD0, 0x6D, 0xDD, 0xBA, 0xE9, 0xA9, 0xF6, 0xB0, 0xE4, 0x38, 0xF8, + 0xDE, 0xD7, 0x73, 0xE9, 0x57, 0xDF, 0x61, 0xE8, 0x1C, 0xEB, 0xE9, 0xF8, + 0xC0, 0xEE, 0x91, 0x08, 0x69, 0xE2, 0xAA, 0x0A, 0x8C, 0xB9, 0x5A, 0x01, + 0x35, 0xA3, 0xE0, 0xF2, 0xEB, 0xB4, 0x46, 0xEE, 0x1A, 0xCF, 0xBE, 0xF6, + 0xCD, 0xE4, 0x44, 0xFB, 0x36, 0xE3, 0x60, 0xF4, 0xC5, 0xCF, 0x12, 0xEF, + 0x78, 0xD3, 0xE7, 0xF9, 0x4B, 0xEC, 0x45, 0x0D, 0x4C, 0xF1, 0x1A, 0x17, + 0xC4, 0xF1, 0xC1, 0x10, 0x60, 0xFF, 0x73, 0x0C, 0xE4, 0x09, 0xCD, 0x03, + 0xCB, 0x02, 0x93, 0xF3, 0x30, 0xF0, 0x54, 0xF9, 0x77, 0xEA, 0x1E, 0xF4, + 0x4B, 0xF9, 0xAE, 0xE8, 0x76, 0x08, 0x2F, 0xEC, 0xD0, 0xFF, 0x4C, 0xE9, + 0x6C, 0xF3, 0x3C, 0xFA, 0xBF, 0xFE, 0xF3, 0x0D, 0xD2, 0x00, 0xE6, 0x0C, + 0xD7, 0xF8, 0x4D, 0x05, 0xC1, 0x0B, 0xC2, 0x02, 0x00, 0x17, 0xEF, 0x0F, + 0x87, 0x11, 0x59, 0x23, 0x0B, 0x0B, 0x81, 0x27, 0x5A, 0xF6, 0xCC, 0x02, + 0x1A, 0xF9, 0x7A, 0xE6, 0xC3, 0x22, 0x38, 0x02, 0x45, 0x23, 0x91, 0x1F, + 0x43, 0xE9, 0x02, 0x18, 0x18, 0xD4, 0xA5, 0x09, 0x6D, 0xEF, 0x9F, 0x06, + 0x04, 0x09, 0xFC, 0x0D, 0x5B, 0x17, 0xB1, 0x2C, 0x58, 0x02, 0x57, 0x27, + 0x9E, 0xCE, 0x4E, 0xF7, 0xBF, 0xC6, 0x23, 0xF8, 0x7D, 0xE4, 0xD1, 0x11, + 0xF9, 0xD4, 0xE0, 0x13, 0x85, 0xBD, 0x00, 0x0A, 0x7E, 0xCB, 0x95, 0xFB, + 0x1C, 0xD0, 0x32, 0x00, 0x4E, 0xCB, 0x82, 0x1F, 0x02, 0xD5, 0xD1, 0x27, + 0xDB, 0xE4, 0x9D, 0x06, 0x57, 0x00, 0xA6, 0xF9, 0x88, 0x19, 0x7B, 0x16, + 0x88, 0x08, 0x42, 0x20, 0x25, 0xE7, 0x04, 0x10, 0x77, 0xE1, 0xAE, 0x09, + 0x7A, 0xDF, 0xF9, 0xFD, 0x0A, 0xD9, 0x45, 0xF3, 0x75, 0xE4, 0xD0, 0xF9, + 0x58, 0xE4, 0xD7, 0xF8, 0x35, 0xD7, 0x63, 0xE5, 0x6A, 0xDB, 0x85, 0xE7, + 0x35, 0xE3, 0xD9, 0xF2, 0x47, 0xE6, 0xE4, 0xE2, 0xE2, 0xF4, 0x85, 0xEB, + 0x23, 0x08, 0x33, 0xFE, 0x22, 0x05, 0x4C, 0x03, 0xAE, 0xF5, 0x14, 0x02, + 0x90, 0xE9, 0xA8, 0xE3, 0xDD, 0xE2, 0x51, 0xDA, 0xC0, 0xEE, 0xBE, 0xF0, + 0x05, 0xEC, 0x15, 0xEE, 0x6E, 0xC8, 0xA0, 0xE5, 0x9C, 0xBC, 0x9E, 0xE9, + 0xC0, 0xD2, 0x72, 0xE9, 0x51, 0xE4, 0xC9, 0xF4, 0xC6, 0xE7, 0x0B, 0xFE, + 0xA7, 0xE3, 0x8F, 0xEA, 0x0E, 0xF1, 0x27, 0xEF, 0xDA, 0x07, 0x22, 0x22, + 0xB4, 0xF3, 0x6D, 0x2C, 0x34, 0xC8, 0x40, 0x00, 0x80, 0xC3, 0xBD, 0xEB, + 0x0C, 0xDB, 0x7D, 0xF4, 0x26, 0xE4, 0x28, 0xF7, 0x0C, 0xD1, 0x69, 0xFE, + 0xD5, 0xAF, 0x96, 0xF5, 0x97, 0x9F, 0x00, 0xCC, 0x6B, 0xB6, 0x14, 0xC8, + 0x54, 0xDD, 0x10, 0xE5, 0xE1, 0xEB, 0x63, 0xDF, 0x08, 0xE4, 0x32, 0xD2, + 0x66, 0xDB, 0x9D, 0xD4, 0x44, 0xD1, 0x56, 0xCE, 0xFF, 0xC8, 0x71, 0xC1, + 0x2F, 0xC1, 0x95, 0xBB, 0x46, 0xB5, 0x87, 0xAA, 0x05, 0xC1, 0xDA, 0x9C, + 0xD3, 0xD8, 0xAE, 0xA7, 0x14, 0xD4, 0xBD, 0xA9, 0x7E, 0xCA, 0x22, 0xAB, + 0xC9, 0xDB, 0x10, 0xC1, 0xD0, 0xEE, 0x4C, 0xD0, 0xE1, 0x04, 0x26, 0xCC, + 0x12, 0x19, 0xFE, 0xC6, 0xB9, 0xFE, 0xA2, 0xCF, 0x4A, 0xE2, 0x3C, 0xE6, + 0x6A, 0xEB, 0x5C, 0xF2, 0x38, 0xF4, 0xF8, 0xDD, 0x15, 0xEF, 0x56, 0xBF, + 0xF2, 0xE1, 0x37, 0xBF, 0x2D, 0xD4, 0xA8, 0xC6, 0xA8, 0xD8, 0x7D, 0xCD, + 0xA4, 0xE5, 0xCB, 0xD5, 0x0E, 0xE9, 0xF1, 0xCA, 0xEE, 0xEA, 0x59, 0xD0, + 0xD3, 0xE9, 0x3D, 0xE3, 0x38, 0xDD, 0x4A, 0xE8, 0x34, 0xD1, 0x50, 0xEA, + 0xE4, 0xD9, 0x37, 0xE9, 0x65, 0xFA, 0x6C, 0xDD, 0x8C, 0x1B, 0x1E, 0xDE, + 0xF7, 0x10, 0xD9, 0xE4, 0x8E, 0xE9, 0xD5, 0xD0, 0x20, 0xE7, 0x00, 0xD5, + 0x91, 0x0A, 0x07, 0xF3, 0x7A, 0x0E, 0xE0, 0xF8, 0xD5, 0xF6, 0xBC, 0xF9, + 0x73, 0xFE, 0xB2, 0x02, 0xC5, 0x20, 0x77, 0xFE, 0x35, 0x3B, 0x68, 0xFE, + 0xC2, 0x3D, 0x2B, 0x0D, 0x18, 0x28, 0x7D, 0x05, 0x7A, 0x0C, 0xB0, 0xF6, + 0x32, 0x0D, 0x81, 0x02, 0x47, 0x13, 0x59, 0x00, 0x11, 0x05, 0xC7, 0xE7, + 0x1E, 0xFB, 0x14, 0xE5, 0xED, 0xF8, 0xBE, 0xE5, 0x13, 0x01, 0xB7, 0xEF, + 0xF7, 0x11, 0x5D, 0x0A, 0x5F, 0x13, 0xF5, 0xFC, 0x68, 0x20, 0xB5, 0xDB, + 0x5E, 0x46, 0xCF, 0xE8, 0xEB, 0x58, 0x0B, 0xFE, 0x67, 0x49, 0x46, 0xF3, + 0x54, 0x32, 0xAD, 0xF3, 0x7E, 0x2B, 0x08, 0x05, 0xBC, 0x29, 0x4A, 0x00, + 0xCC, 0x24, 0xEC, 0xF4, 0x96, 0x1D, 0xF0, 0xF7, 0x2A, 0x23, 0x23, 0xFE, + 0x77, 0x43, 0xDC, 0x11, 0x44, 0x5A, 0x44, 0x32, 0x5A, 0x58, 0x01, 0x43, + 0x43, 0x47, 0xD3, 0x33, 0x50, 0x30, 0x57, 0x29, 0x15, 0x2C, 0xD8, 0x36, + 0x4E, 0x36, 0xAC, 0x4C, 0x47, 0x29, 0x32, 0x51, 0x9B, 0x15, 0x19, 0x36, + 0x6F, 0x1C, 0xE9, 0x22, 0x99, 0x24, 0x2F, 0x24, 0x4E, 0x16, 0xA1, 0x2A, + 0x90, 0x0C, 0xE3, 0x39, 0x60, 0x14, 0xFB, 0x3D, 0x3A, 0x29, 0x5F, 0x42, + 0x9B, 0x49, 0x60, 0x5B, 0x04, 0x4C, 0xC1, 0x46, 0xC3, 0x37, 0x28, 0x0E, + 0x9C, 0x48, 0x59, 0x18, 0x46, 0x5F, 0x57, 0x43, 0xDB, 0x44, 0x28, 0x3E, + 0x4D, 0x30, 0xE3, 0x2F, 0xF6, 0x3F, 0x51, 0x37, 0xF0, 0x40, 0x51, 0x3B, + 0xF8, 0x37, 0x12, 0x45, 0xF8, 0x3D, 0x9B, 0x47, 0xF7, 0x43, 0xE4, 0x2E, + 0x2D, 0x50, 0x90, 0x2A, 0xB1, 0x5B, 0x9A, 0x4F, 0x66, 0x47, 0x53, 0x57, + 0xF1, 0x2A, 0xCE, 0x38, 0xDE, 0x2D, 0x52, 0x2A, 0xF9, 0x39, 0x8F, 0x30, + 0xC0, 0x38, 0xE2, 0x4B, 0x19, 0x30, 0x6E, 0x57, 0x7C, 0x1B, 0x76, 0x36, + 0x64, 0x13, 0xB2, 0x1F, 0x83, 0x1D, 0xA9, 0x2B, 0xC5, 0x1A, 0xAC, 0x34, + 0x5D, 0x16, 0x3C, 0x38, 0x13, 0x29, 0x4B, 0x3F, 0x8B, 0x3C, 0xC2, 0x38, + 0x6B, 0x37, 0x0D, 0x34, 0x8B, 0x2F, 0x4F, 0x3B, 0x18, 0x2A, 0xAC, 0x38, + 0x19, 0x25, 0x94, 0x32, 0xD1, 0x2E, 0x12, 0x3E, 0x94, 0x3A, 0x09, 0x47, + 0x13, 0x3E, 0x00, 0x3D, 0xE5, 0x2F, 0xAA, 0x2C, 0x28, 0x16, 0xDB, 0x23, + 0x78, 0x1E, 0x22, 0x24, 0xDC, 0x3F, 0x38, 0x35, 0x6A, 0x43, 0x41, 0x44, + 0x87, 0x31, 0xD1, 0x41, 0xFB, 0x1D, 0x0A, 0x48, 0x21, 0x0B, 0xF7, 0x56, + 0x9A, 0x09, 0x7A, 0x4A, 0x38, 0x1C, 0xAA, 0x3A, 0x95, 0x27, 0x00, 0x3A, + 0xB1, 0x2F, 0xCF, 0x34, 0x8E, 0x3D, 0x8F, 0x36, 0x1A, 0x30, 0xF8, 0x26, + 0xE9, 0x13, 0x0B, 0x0C, 0x76, 0x22, 0xCC, 0x1A, 0x5A, 0x4A, 0xBE, 0x3E, + 0xE4, 0x45, 0xF2, 0x3E, 0xBE, 0x29, 0x05, 0x21, 0xAD, 0x29, 0x01, 0x0D, + 0x84, 0x22, 0x1F, 0x0C, 0x0F, 0x10, 0x2F, 0x11, 0x57, 0x14, 0x82, 0x0F, + 0x04, 0x0C, 0x1F, 0xFB, 0x18, 0xFD, 0x04, 0xEF, 0xDB, 0x09, 0x21, 0xFF, + 0xBA, 0x05, 0x29, 0x05, 0xC7, 0xF0, 0x8B, 0xF2, 0xB1, 0xFC, 0x84, 0xE9, + 0xA6, 0x05, 0x46, 0xF6, 0x05, 0xFF, 0x4A, 0x0A, 0x20, 0x0B, 0x57, 0x16, + 0xE7, 0xFF, 0xE7, 0xFC, 0x51, 0xDF, 0x64, 0xE0, 0x45, 0xDE, 0x21, 0xED, + 0x81, 0xEA, 0xA8, 0xFE, 0xBE, 0xE0, 0xD6, 0xF2, 0xAC, 0xD6, 0x9D, 0xE1, + 0x89, 0xD7, 0x5C, 0xE8, 0x80, 0xCD, 0x58, 0xF2, 0x33, 0xD5, 0x8E, 0xFF, + 0x83, 0xEA, 0x75, 0xFF, 0x8F, 0xF2, 0x80, 0xEB, 0xEA, 0x0A, 0xE2, 0xEB, + 0x65, 0x1C, 0x16, 0xFA, 0xE9, 0xF2, 0x83, 0xF8, 0x24, 0xC3, 0x11, 0xE4, + 0xA6, 0xD0, 0xA8, 0xD4, 0xF6, 0xEE, 0xCA, 0xCE, 0xAF, 0xF2, 0x3D, 0xCF, + 0x5D, 0xE9, 0xC1, 0xD6, 0x65, 0xDC, 0x13, 0xE6, 0x0C, 0xE0, 0xE5, 0xEE, + 0x5D, 0xEC, 0x2D, 0xE6, 0x50, 0xE7, 0xBF, 0xDB, 0xD4, 0xDE, 0xF0, 0xE8, + 0xAC, 0xE0, 0xF9, 0xEC, 0x72, 0xF0, 0x9D, 0xE1, 0xC9, 0xFB, 0xEA, 0xF0, + 0x25, 0xEA, 0x4A, 0xE8, 0x1F, 0xD1, 0xD5, 0xCA, 0xF4, 0xDD, 0x4F, 0xE5, + 0x31, 0xF0, 0xF2, 0x01, 0x10, 0xD4, 0x26, 0xEA, 0xDF, 0xBC, 0x35, 0xDD, + 0x06, 0xD0, 0x85, 0xE3, 0x10, 0xE5, 0xFA, 0xE1, 0x3C, 0xF0, 0x17, 0xF1, + 0xAE, 0xE5, 0x46, 0xF8, 0x33, 0xBB, 0x7F, 0xCF, 0x60, 0xAD, 0x8B, 0xC0, + 0xCE, 0xC6, 0xBF, 0xDB, 0x6F, 0xD2, 0x00, 0xD4, 0x84, 0xD1, 0xDA, 0xBD, + 0xDB, 0xDA, 0x49, 0xC5, 0x5C, 0xD2, 0xA6, 0xDB, 0x9E, 0xBD, 0xCA, 0xDD, + 0x98, 0xBE, 0x12, 0xC9, 0x9C, 0xB8, 0xB5, 0xB4, 0x5E, 0xBB, 0xED, 0xB2, + 0xD6, 0xD3, 0x52, 0xCD, 0x8E, 0xD0, 0xEF, 0xE2, 0x4A, 0xBB, 0x42, 0xDC, + 0xD6, 0xBF, 0x67, 0xCE, 0x2D, 0xD1, 0x6F, 0xCB, 0x81, 0xC6, 0x19, 0xCE, + 0x5A, 0xB7, 0xB0, 0xE2, 0x73, 0xB7, 0xE5, 0xFC, 0x9E, 0xB6, 0x92, 0xED, + 0x72, 0xBE, 0xCD, 0xD5, 0xA2, 0xC8, 0xC6, 0xDC, 0x8F, 0xBD, 0xF7, 0xDC, + 0xEC, 0xB6, 0x7F, 0xD1, 0x22, 0xD5, 0x41, 0xCF, 0xF5, 0xEB, 0xF0, 0xD5, + 0xEA, 0xE6, 0x57, 0xE4, 0x2F, 0xDC, 0x96, 0xE6, 0x2F, 0xD4, 0xBF, 0xE1, + 0xB7, 0xE3, 0xC0, 0xEC, 0xAC, 0xF0, 0xD4, 0xF8, 0xE7, 0xD7, 0xB2, 0xFD, + 0xD9, 0xC3, 0x32, 0x02, 0x27, 0xCD, 0xD7, 0xF3, 0x17, 0xEE, 0x89, 0xEA, + 0x4C, 0x13, 0x2E, 0xF7, 0x48, 0x15, 0xFF, 0xE9, 0x42, 0x01, 0xB1, 0xE7, + 0x7B, 0x17, 0xA2, 0x1E, 0x99, 0x37, 0x18, 0x3F, 0xE3, 0x15, 0x5C, 0x28, + 0x9D, 0xF7, 0xF3, 0x12, 0x5B, 0x0D, 0xCF, 0x10, 0x81, 0x18, 0x3D, 0x1B, + 0x79, 0x12, 0x1C, 0x31, 0xDD, 0x0E, 0x5E, 0x2E, 0x07, 0xF6, 0xDA, 0x03, + 0x22, 0xEB, 0xE0, 0xF9, 0x4D, 0x07, 0x37, 0x16, 0x94, 0x02, 0xE7, 0x18, + 0x87, 0xED, 0x4F, 0x16, 0x23, 0xFB, 0x49, 0x27, 0x39, 0x07, 0x1C, 0x23, + 0x3E, 0x07, 0xD9, 0x0F, 0xEA, 0x13, 0xEB, 0x06, 0x91, 0x13, 0xC0, 0xF5, + 0xE7, 0xFE, 0xE2, 0x02, 0x46, 0x07, 0x7C, 0x2A, 0xBF, 0x11, 0x58, 0x20, + 0xF2, 0x01, 0xE6, 0xF2, 0x81, 0x02, 0xA1, 0xE1, 0x76, 0x06, 0xD8, 0xE4, + 0xE2, 0x07, 0x60, 0xFA, 0x91, 0x1E, 0x05, 0x20, 0xC8, 0x1E, 0xB7, 0x22, + 0xCB, 0x0E, 0xF1, 0x16, 0x1C, 0x13, 0x0F, 0x24, 0xDE, 0x19, 0x87, 0x28, + 0x0C, 0x0D, 0xF7, 0x0D, 0xA5, 0xFF, 0x8D, 0x0D, 0xC0, 0x0A, 0x63, 0x1F, + 0x12, 0x0F, 0x11, 0x15, 0x58, 0x01, 0x27, 0x09, 0x6D, 0xF4, 0x2D, 0xFA, + 0xA4, 0xEB, 0xFC, 0xED, 0xCD, 0xEF, 0x6E, 0xF9, 0xA4, 0xFB, 0x40, 0x08, + 0x10, 0xFA, 0x04, 0x09, 0xD2, 0xFA, 0x20, 0xFA, 0xF2, 0x0F, 0xC4, 0xEC, + 0x91, 0x2C, 0x42, 0xF5, 0x5C, 0x30, 0x17, 0xFC, 0x95, 0x09, 0xE1, 0xDC, + 0x03, 0xEC, 0x25, 0xCF, 0xE7, 0x0C, 0x53, 0xFB, 0xA3, 0x20, 0xFE, 0x02, + 0x6F, 0xF9, 0x87, 0xE0, 0xB0, 0xEB, 0xAA, 0xE0, 0x0A, 0x07, 0x0F, 0xF6, + 0xB0, 0x18, 0xBC, 0x07, 0x84, 0x13, 0xDC, 0x14, 0x1C, 0xFC, 0x59, 0x17, + 0x11, 0xDD, 0x77, 0x03, 0x53, 0xE9, 0x70, 0xFB, 0xF9, 0x08, 0xBE, 0xF8, + 0x0B, 0xF7, 0xC6, 0xE0, 0x58, 0xE5, 0xDA, 0xD5, 0xBD, 0xE0, 0xEE, 0xD8, + 0xF7, 0xC9, 0xAF, 0xDA, 0x51, 0xBF, 0xD3, 0xD8, 0x10, 0xC9, 0xF8, 0xD2, + 0xFD, 0xCC, 0x97, 0xC0, 0x6F, 0xCF, 0xBE, 0xC7, 0x3A, 0xDE, 0x43, 0xDF, + 0x55, 0xD9, 0x6B, 0xD1, 0xEB, 0xC9, 0x99, 0xC8, 0x84, 0xDD, 0x4F, 0xD9, + 0x8F, 0xE9, 0x26, 0xE4, 0x0A, 0xDD, 0xC0, 0xEF, 0xA0, 0xDF, 0x47, 0xF2, + 0xAA, 0xE2, 0x63, 0xDC, 0xB3, 0xE8, 0x60, 0xD1, 0xB3, 0xFD, 0x0C, 0xE2, + 0x0E, 0xFE, 0xFE, 0xE9, 0xB9, 0xE2, 0x4B, 0xD2, 0xE2, 0xDD, 0xA3, 0xC9, + 0xE6, 0xE7, 0x7B, 0xD4, 0x8E, 0xDA, 0xE2, 0xDE, 0xB0, 0xCF, 0x4C, 0xE7, + 0x60, 0xEC, 0xF8, 0xD4, 0xEE, 0x07, 0x07, 0xD1, 0x85, 0x01, 0xE4, 0xEA, + 0xD3, 0xE9, 0xBE, 0xEE, 0x3F, 0xCA, 0xD4, 0xEB, 0x5A, 0xCC, 0xA1, 0xEF, + 0x42, 0xEB, 0x70, 0xDA, 0xCC, 0xFE, 0x13, 0xD4, 0xC7, 0xF8, 0xCF, 0xEB, + 0x2D, 0xE3, 0xAF, 0xE1, 0xA6, 0xEE, 0x6A, 0xCE, 0xAF, 0x18, 0xA1, 0xE4, + 0x6A, 0x15, 0x0C, 0xF1, 0x3A, 0xEC, 0x33, 0xE1, 0x3C, 0xED, 0xAE, 0xE6, + 0xAD, 0x06, 0x68, 0xE5, 0x79, 0x16, 0xFB, 0xE1, 0x86, 0x1F, 0xC5, 0xFE, + 0xE5, 0x03, 0x16, 0xF9, 0xDA, 0xE9, 0x0B, 0xD8, 0xC8, 0xFC, 0x61, 0xDF, + 0x06, 0xFA, 0x98, 0xED, 0x38, 0xE9, 0x8C, 0xEA, 0xE5, 0xFD, 0xCC, 0xEA, + 0x4C, 0x13, 0x2C, 0xF4, 0x98, 0x17, 0x6E, 0x07, 0x10, 0x14, 0xC7, 0x1D, + 0x26, 0xFE, 0x62, 0x15, 0x34, 0xF6, 0x26, 0xEF, 0xE1, 0x12, 0x53, 0xEF, + 0xC2, 0x20, 0xB3, 0xF8, 0x4A, 0x0C, 0xC4, 0xE3, 0xE5, 0xF6, 0xF3, 0xE0, + 0x34, 0xF9, 0xFD, 0xF0, 0x46, 0xF5, 0x9D, 0xEE, 0x56, 0xED, 0xA3, 0xEE, + 0x91, 0xF7, 0x79, 0xFD, 0x4E, 0x00, 0xD8, 0xF6, 0x58, 0x19, 0xC9, 0xF9, + 0x44, 0x34, 0x28, 0x11, 0x8E, 0x2D, 0xDB, 0x14, 0x34, 0x1E, 0xBD, 0x03, + 0xD3, 0x21, 0xC3, 0xFB, 0xAA, 0x2A, 0xBC, 0xFB, 0xD3, 0x29, 0x0E, 0xFF, + 0xC8, 0x20, 0x97, 0x08, 0x38, 0x19, 0xF1, 0xF7, 0x19, 0x1B, 0xD7, 0xF4, + 0xE3, 0x16, 0xF2, 0x11, 0x0D, 0x08, 0xBC, 0x1F, 0xD6, 0x08, 0x92, 0x29, + 0xF9, 0x1B, 0xF5, 0x1F, 0xA2, 0x37, 0x56, 0x15, 0xAF, 0x43, 0x69, 0x2F, + 0x23, 0x25, 0x3A, 0x2B, 0xC9, 0x07, 0x7E, 0x05, 0xEE, 0x1D, 0xD5, 0x0E, + 0x92, 0x3F, 0xEE, 0x1E, 0xB4, 0x2F, 0xCF, 0x01, 0x43, 0x0F, 0x77, 0xFA, + 0xB6, 0x08, 0xC2, 0x0E, 0x5E, 0x10, 0x76, 0x17, 0xAB, 0x2A, 0x01, 0x21, + 0xF9, 0x2C, 0xDA, 0x1E, 0x31, 0x07, 0x4E, 0x07, 0xC9, 0x0C, 0x35, 0x08, + 0x38, 0x27, 0xC7, 0x22, 0x52, 0x0D, 0xE3, 0x17, 0xBE, 0xFF, 0xB8, 0x09, + 0xBD, 0x19, 0xBF, 0x1A, 0x28, 0x25, 0xC1, 0x15, 0x55, 0x24, 0x83, 0x0A, + 0x61, 0x22, 0xDD, 0x13, 0x8F, 0x10, 0xC3, 0x1B, 0x8E, 0x00, 0xB5, 0x1D, + 0xF9, 0x0A, 0x2F, 0x29, 0xEC, 0x14, 0xC2, 0x22, 0x7D, 0x11, 0xA1, 0x0D, + 0x9C, 0x0B, 0x31, 0x1B, 0xE4, 0x02, 0xE5, 0x29, 0xFA, 0x06, 0x0D, 0x21, + 0xB8, 0x15, 0x4E, 0x15, 0x78, 0x15, 0x57, 0x13, 0x31, 0x06, 0x6C, 0x22, + 0x6B, 0x04, 0xA0, 0x2F, 0xA9, 0x07, 0xB7, 0x25, 0x8C, 0xFC, 0xAE, 0x08, + 0x45, 0xFB, 0xDF, 0xF6, 0xE0, 0x05, 0xE7, 0xF8, 0x3B, 0x14, 0x63, 0x01, + 0x16, 0x14, 0x2F, 0x13, 0xD7, 0x03, 0x18, 0x17, 0x68, 0x11, 0x84, 0x15, + 0xC5, 0x22, 0x05, 0x21, 0x3A, 0x0F, 0x76, 0x18, 0xBE, 0xFB, 0x37, 0x07, + 0x0D, 0x00, 0xA1, 0x0E, 0x4D, 0x00, 0x51, 0x1B, 0x96, 0x01, 0xF1, 0x1C, + 0xFE, 0x0F, 0x9C, 0x1F, 0xC6, 0xFF, 0x7B, 0x1C, 0xA7, 0xF3, 0xE6, 0x1C, + 0xAD, 0x17, 0x02, 0x38, 0x76, 0x2C, 0xB5, 0x3E, 0xCD, 0x1E, 0xD4, 0x27, + 0xBE, 0x1C, 0x29, 0x23, 0xE8, 0x23, 0x52, 0x2A, 0xB4, 0x19, 0x43, 0x32, + 0xA5, 0x0F, 0xBF, 0x35, 0x0F, 0xFC, 0x10, 0x22, 0x5F, 0xE1, 0x2A, 0x0D, + 0x53, 0xF9, 0x72, 0x12, 0x92, 0x0F, 0x59, 0x14, 0xDE, 0xF2, 0xEA, 0x0B, + 0x64, 0xF0, 0xA2, 0x13, 0xF2, 0x0D, 0x29, 0x1A, 0x7B, 0x10, 0xD8, 0x13, + 0x5A, 0x09, 0xDD, 0x24, 0x27, 0x10, 0x04, 0x33, 0xF9, 0xFF, 0xE9, 0x0D, + 0x23, 0xF7, 0xF5, 0xFB, 0x63, 0x0D, 0x3C, 0x18, 0x79, 0x07, 0xC2, 0x16, + 0x87, 0xF4, 0xBE, 0xFD, 0x7E, 0xF4, 0xD0, 0xFC, 0xE9, 0xF3, 0x41, 0x0B, + 0xD3, 0x03, 0xC1, 0x1F, 0x82, 0x11, 0x9F, 0x27, 0x2A, 0x07, 0xF3, 0x1C, + 0x4E, 0x0A, 0x60, 0x1E, 0x22, 0x18, 0xB4, 0x2E, 0xCE, 0x1B, 0x71, 0x2C, + 0x14, 0x04, 0x5D, 0x0B, 0xD4, 0xE6, 0xC7, 0xFB, 0xBC, 0xED, 0xCF, 0x0C, + 0xE7, 0xFA, 0xBD, 0x12, 0x94, 0xF0, 0xAD, 0x02, 0xFF, 0xEC, 0xB6, 0xF1, + 0xEA, 0x00, 0x44, 0xF3, 0xBB, 0x09, 0x01, 0x05, 0x8F, 0xF9, 0xA6, 0x12, + 0x42, 0xF4, 0xFB, 0x1E, 0x6B, 0xFE, 0x64, 0x15, 0x3C, 0x17, 0x0D, 0x05, + 0x17, 0x3D, 0x10, 0x10, 0x8D, 0x37, 0x7F, 0x09, 0x3D, 0x0A, 0x0C, 0xEA, + 0xD7, 0x07, 0x64, 0xF5, 0xB7, 0x20, 0xFB, 0x27, 0x9A, 0x0E, 0xD8, 0x1C, + 0x32, 0xF2, 0xC9, 0xFF, 0x7B, 0xF8, 0x6D, 0x19, 0x65, 0x09, 0xEE, 0x28, + 0x9E, 0x0B, 0xD6, 0x31, 0xA5, 0x05, 0xD9, 0x3A, 0x05, 0xFA, 0xE3, 0x24, + 0xD2, 0xF0, 0x40, 0x11, 0x93, 0x01, 0xC0, 0x12, 0xAA, 0xF9, 0x40, 0x0B, + 0x54, 0xCA, 0xF6, 0xF9, 0x2D, 0xC9, 0x66, 0xF2, 0xF8, 0xE6, 0xBE, 0xF0, + 0x05, 0xEC, 0xBB, 0xF9, 0x13, 0xF2, 0xBC, 0xF5, 0x9B, 0xF3, 0xA4, 0xC7, + 0x4D, 0xE9, 0xC4, 0xBF, 0xAD, 0xF2, 0xD0, 0xF1, 0x95, 0xFA, 0x54, 0xF9, + 0x8D, 0xF7, 0x6A, 0xD6, 0x8E, 0xFD, 0x09, 0xCA, 0x5D, 0x06, 0xB4, 0xD4, + 0x12, 0x04, 0x25, 0xE0, 0xE2, 0xEE, 0x7A, 0xEA, 0xAC, 0xE7, 0x03, 0xE1, + 0x73, 0xF6, 0x0B, 0xDA, 0xD4, 0x06, 0xAB, 0xEA, 0xC2, 0x13, 0xE5, 0xEC, + 0x24, 0x0B, 0x74, 0xE4, 0x10, 0x00, 0x3E, 0xEB, 0xFE, 0x00, 0xB5, 0xFA, + 0x47, 0x00, 0x67, 0xFA, 0x5F, 0xFB, 0xB4, 0xF2, 0x7B, 0xF7, 0xF7, 0xF2, + 0xFB, 0xFE, 0xE1, 0xF3, 0xA0, 0xFA, 0xBE, 0xF2, 0xE2, 0xE2, 0xBA, 0xF0, + 0x22, 0xCE, 0xD5, 0xFD, 0x07, 0xBE, 0x79, 0x01, 0x37, 0xC5, 0x10, 0xE8, + 0xC3, 0xE1, 0xDC, 0xEB, 0x06, 0xE9, 0x19, 0xF5, 0x43, 0xE0, 0x65, 0xDE, + 0x52, 0xEB, 0x3A, 0xE9, 0x3A, 0x14, 0x65, 0x0B, 0xCA, 0x27, 0x0D, 0x04, + 0xBD, 0x01, 0x0F, 0xDD, 0xF1, 0xE9, 0x12, 0xDE, 0xC4, 0xEF, 0x4F, 0xF9, + 0x6C, 0xE5, 0xD1, 0xF6, 0xC1, 0xD7, 0x96, 0xF4, 0x4C, 0xCC, 0xC6, 0xE2, + 0xAC, 0xCA, 0xAA, 0xCF, 0x54, 0xDC, 0xD9, 0xF0, 0x15, 0xE0, 0x45, 0x05, + 0xF5, 0xC2, 0x39, 0xED, 0xCE, 0xBD, 0xFD, 0xE2, 0xB4, 0xE6, 0x74, 0xEC, + 0x11, 0xF8, 0x2B, 0xF0, 0xA2, 0xED, 0xD3, 0xEF, 0x67, 0xE1, 0x3E, 0xE8, + 0xF2, 0xD0, 0x94, 0xCC, 0x79, 0xCD, 0xB8, 0xBE, 0x8E, 0xD9, 0x3A, 0xCC, + 0xED, 0xE1, 0x56, 0xC6, 0xC6, 0xD8, 0x39, 0xBB, 0xC7, 0xD6, 0x99, 0xC4, + 0x88, 0xDA, 0x9F, 0xC4, 0x34, 0xD0, 0xFB, 0xBB, 0xE0, 0xD0, 0x34, 0xC7, + 0xC1, 0xE3, 0xA0, 0xD2, 0x09, 0xF1, 0x34, 0xD0, 0x54, 0xF7, 0xDF, 0xCD, + 0x6E, 0xF6, 0xF1, 0xCA, 0x76, 0xEA, 0xDF, 0xD8, 0x60, 0xDE, 0x49, 0xE2, + 0xAF, 0xD3, 0x7F, 0xD0, 0x83, 0xDE, 0x12, 0xCB, 0xF0, 0xF1, 0x82, 0xD8, + 0x19, 0xEA, 0x1D, 0xDE, 0xB0, 0xD0, 0x44, 0xE5, 0x96, 0xBC, 0x8E, 0xF7, + 0x0F, 0xCA, 0xDC, 0xFE, 0x35, 0xDB, 0xB6, 0xFA, 0x79, 0xD1, 0x7C, 0xFE, + 0x37, 0xD5, 0xCC, 0x0E, 0x1F, 0xD6, 0xB5, 0x10, 0x2F, 0xC3, 0x86, 0xFA, + 0xCC, 0xC0, 0x31, 0xEB, 0x5F, 0xE0, 0x2A, 0xF5, 0xC2, 0xF1, 0x7A, 0xE9, + 0x1E, 0xDD, 0xEE, 0xC4, 0x95, 0xD3, 0x72, 0xCA, 0x04, 0xD0, 0x75, 0xE6, + 0x9D, 0xDA, 0x04, 0xED, 0x12, 0x00, 0x65, 0xEA, 0x45, 0x0A, 0x31, 0xD6, + 0x0C, 0x01, 0xCA, 0xCC, 0xA6, 0x0A, 0xC5, 0xE8, 0x94, 0x02, 0xCE, 0xE1, + 0xB4, 0xE8, 0x75, 0xBE, 0x40, 0xE2, 0xC1, 0xB1, 0x7C, 0xDB, 0x9E, 0xB9, + 0xC8, 0xE1, 0xB5, 0xC7, 0xD5, 0xFE, 0x1F, 0xDA, 0x35, 0xF5, 0x84, 0xE1, + 0x5E, 0xCB, 0x06, 0xD0, 0x0E, 0xCD, 0xD7, 0xDB, 0xB6, 0xEF, 0x66, 0xF2, + 0x17, 0xFD, 0x89, 0xE9, 0x5C, 0xFF, 0x05, 0xE4, 0x24, 0xF3, 0x69, 0xE9, + 0xBA, 0xCF, 0x64, 0xE4, 0xDB, 0xB1, 0xE5, 0xE3, 0xB1, 0xB0, 0x2F, 0xEE, + 0x4A, 0xC1, 0x76, 0xE8, 0x03, 0xCE, 0xFC, 0xDC, 0x36, 0xE2, 0xAB, 0xEA, + 0x3B, 0xF3, 0x4D, 0xF7, 0x87, 0xED, 0xAF, 0xEB, 0xCC, 0xDD, 0x08, 0xEF, + 0xA7, 0xDF, 0x5D, 0xF2, 0x13, 0xF5, 0x8B, 0xE5, 0x1A, 0x09, 0xFB, 0xDF, + 0x31, 0x15, 0x3D, 0xE3, 0x09, 0x04, 0x21, 0xE4, 0x03, 0xEF, 0x05, 0xE9, + 0x76, 0xF1, 0x9F, 0xF4, 0x52, 0xF0, 0x36, 0xF2, 0xC2, 0xF3, 0xC0, 0xFC, + 0x83, 0x0A, 0x28, 0x20, 0xD1, 0x1A, 0x9E, 0x2A, 0x3C, 0x09, 0x67, 0x0D, + 0x15, 0xF7, 0x59, 0x01, 0x2D, 0x17, 0x15, 0x2C, 0x19, 0x43, 0x7D, 0x38, + 0x1A, 0x3C, 0x97, 0x09, 0xD1, 0x1D, 0xE0, 0x00, 0xB4, 0x15, 0x79, 0x10, + 0x67, 0x13, 0xF0, 0x15, 0x7C, 0x18, 0xD7, 0x18, 0xF1, 0x1B, 0xB7, 0xFD, + 0xDF, 0x11, 0xED, 0xE6, 0x16, 0x1A, 0xF3, 0xFB, 0x45, 0x21, 0xC6, 0x16, + 0x4F, 0x0B, 0x53, 0x0E, 0xA0, 0xFA, 0xA3, 0x00, 0xCE, 0x05, 0x65, 0x04, + 0x73, 0x19, 0xB8, 0x07, 0x2A, 0x39, 0x36, 0x04, 0x9A, 0x45, 0x21, 0xFA, + 0x21, 0x20, 0x63, 0xED, 0xFF, 0x09, 0xC9, 0xF4, 0x4D, 0x15, 0x41, 0x02, + 0x18, 0x0A, 0x45, 0xF4, 0xD1, 0xF6, 0x7A, 0xF9, 0x9D, 0x08, 0x8F, 0x13, + 0x0F, 0x14, 0x7F, 0x0C, 0xD3, 0x00, 0x3E, 0xFD, 0x32, 0xED, 0x54, 0x0C, + 0x45, 0xE0, 0xC0, 0x13, 0x5F, 0xE6, 0x4A, 0x0F, 0x7D, 0xFC, 0xE5, 0x19, + 0x32, 0x03, 0x8C, 0x1D, 0xB0, 0xEC, 0x59, 0x13, 0xF6, 0xE8, 0xC7, 0x0F, + 0x9B, 0xF5, 0x7B, 0x14, 0x13, 0xF6, 0xAB, 0x00, 0x9D, 0x02, 0xDB, 0xE3, + 0x71, 0x01, 0x7A, 0xDF, 0x00, 0xF3, 0x82, 0xE1, 0x43, 0xF3, 0x3C, 0xE1, + 0x3B, 0xEB, 0xE4, 0xE1, 0xDD, 0xE4, 0x6B, 0xDC, 0x3E, 0xE7, 0xC0, 0xD7, + 0x0B, 0xFD, 0x14, 0xF0, 0x9F, 0x1C, 0xF8, 0xFE, 0x4A, 0x13, 0xE8, 0xE2, + 0xFE, 0x07, 0x61, 0xD6, 0xCE, 0x26, 0x47, 0xE9, 0x1B, 0x3B, 0xC0, 0xF2, + 0x50, 0x23, 0x5D, 0xEB, 0xD3, 0x0B, 0x43, 0xF8, 0x5C, 0x07, 0xD5, 0x0D, + 0x05, 0x0F, 0xA6, 0x03, 0x0C, 0x18, 0xB3, 0xFC, 0x73, 0x09, 0x7A, 0x0A, + 0x39, 0xEE, 0x8A, 0x0D, 0x83, 0xF6, 0x22, 0x15, 0x17, 0x13, 0x4F, 0x22, + 0x8C, 0x08, 0x26, 0x0B, 0xA0, 0xF5, 0xE9, 0xF8, 0xCB, 0xF2, 0x89, 0x07, + 0x32, 0xE8, 0x84, 0x02, 0x63, 0xE9, 0xDC, 0xFA, 0x68, 0xFC, 0x21, 0x0D, + 0xE7, 0xFC, 0xE8, 0x0F, 0x91, 0xED, 0x3A, 0x04, 0x3F, 0xF4, 0x69, 0x0A, + 0x6C, 0x0A, 0xA7, 0x09, 0x34, 0x0E, 0x77, 0x01, 0x7A, 0x0F, 0x00, 0x09, + 0x9A, 0x17, 0xB8, 0x0E, 0xBF, 0x0F, 0x1C, 0x0C, 0x77, 0x06, 0x51, 0x0E, + 0x35, 0x0F, 0x6C, 0x11, 0x4F, 0x22, 0x04, 0x05, 0xB9, 0x26, 0xFA, 0x0A, + 0x60, 0x23, 0xF3, 0x26, 0xDD, 0x28, 0x20, 0x1E, 0x86, 0x2F, 0xC5, 0x10, + 0x6C, 0x2A, 0x5C, 0x0E, 0x26, 0x1D, 0x84, 0x14, 0x42, 0x1B, 0x1B, 0x29, + 0x87, 0x2B, 0x33, 0x22, 0x37, 0x3C, 0xC9, 0x10, 0xEF, 0x37, 0xAF, 0x17, + 0x95, 0x2F, 0xE4, 0x17, 0x8C, 0x30, 0xFE, 0x0B, 0xCA, 0x32, 0x87, 0x1B, + 0x9F, 0x31, 0x7F, 0x3A, 0x38, 0x2C, 0x73, 0x4A, 0x81, 0x28, 0x30, 0x42, + 0x3E, 0x27, 0x12, 0x27, 0xF8, 0x33, 0x9E, 0x1E, 0x38, 0x4F, 0xA3, 0x37, + 0x29, 0x58, 0xBD, 0x43, 0xD5, 0x49, 0x55, 0x43, 0xEF, 0x45, 0x2E, 0x41, + 0xFE, 0x54, 0xAE, 0x3F, 0x81, 0x61, 0xDC, 0x53, 0x8B, 0x5A, 0xEC, 0x51, + 0xC6, 0x3F, 0x59, 0x3A, 0xF6, 0x34, 0x15, 0x4A, 0x0C, 0x38, 0x12, 0x60, + 0x1C, 0x2B, 0x87, 0x4A, 0xED, 0x28, 0x3C, 0x30, 0xA4, 0x33, 0x8E, 0x2B, + 0x3D, 0x31, 0x98, 0x38, 0x31, 0x2A, 0x52, 0x4F, 0x5B, 0x36, 0x2A, 0x64, + 0x96, 0x3E, 0x12, 0x55, 0xF4, 0x37, 0xA4, 0x30, 0x3A, 0x3C, 0x45, 0x42, + 0x33, 0x3E, 0xE1, 0x60, 0x9B, 0x2E, 0xD1, 0x4C, 0x5C, 0x22, 0xE6, 0x39, + 0x23, 0x2A, 0x26, 0x48, 0x88, 0x30, 0x8A, 0x4B, 0xD1, 0x34, 0xC0, 0x3B, + 0xFF, 0x3D, 0x42, 0x2E, 0x95, 0x35, 0xAA, 0x23, 0xC5, 0x36, 0xA1, 0x2B, + 0xC2, 0x52, 0x53, 0x3F, 0xAD, 0x53, 0x3F, 0x35, 0x16, 0x40, 0x3E, 0x21, + 0xDB, 0x3F, 0x87, 0x31, 0x09, 0x45, 0x6B, 0x48, 0xBB, 0x3D, 0xD3, 0x39, + 0x14, 0x33, 0x37, 0x23, 0xF2, 0x3B, 0xE4, 0x25, 0x6F, 0x43, 0xE9, 0x29, + 0xC0, 0x32, 0x73, 0x1F, 0x5A, 0x37, 0x99, 0x1E, 0xC2, 0x35, 0xA1, 0x21, + 0xCD, 0x25, 0x9D, 0x2E, 0x5F, 0x26, 0xC0, 0x46, 0x89, 0x00, 0xF4, 0x3B, + 0xCF, 0xDE, 0xAC, 0x1F, 0x1E, 0x04, 0x37, 0x21, 0xB8, 0x30, 0x02, 0x26, + 0xE8, 0x27, 0x77, 0x23, 0xF3, 0x0B, 0xC4, 0x2A, 0x1A, 0x0A, 0x05, 0x2B, + 0xF3, 0x0A, 0x9E, 0x27, 0x95, 0x07, 0x96, 0x25, 0x1A, 0xFB, 0xAE, 0x17, + 0xA2, 0xE3, 0x1B, 0x03, 0x97, 0xF6, 0xF5, 0x0F, 0x50, 0x17, 0x23, 0x22, + 0x33, 0x04, 0xFC, 0x06, 0x17, 0xE8, 0x3C, 0xF9, 0xC2, 0xE8, 0xB4, 0x03, + 0xC8, 0xF3, 0xA1, 0x07, 0xA7, 0xFC, 0x5C, 0x09, 0x70, 0xF4, 0xD8, 0x07, + 0xC1, 0xE1, 0x06, 0xF4, 0x82, 0xEC, 0x80, 0xEE, 0x75, 0x02, 0xA4, 0xFA, + 0x53, 0xF8, 0x70, 0xE5, 0x84, 0xE7, 0x8B, 0xD8, 0x2C, 0xF0, 0xC2, 0xEC, + 0xAA, 0xF9, 0xE7, 0xFA, 0x44, 0xED, 0xBD, 0xF0, 0x63, 0xE3, 0xEE, 0xE8, + 0x9B, 0xD9, 0xF9, 0xDF, 0x57, 0xCE, 0x49, 0xD5, 0x84, 0xCE, 0xA4, 0xE9, + 0x28, 0xCA, 0xC3, 0xEC, 0x3B, 0xBD, 0xBF, 0xD3, 0xFD, 0xBC, 0x44, 0xCB, + 0x0E, 0xD6, 0xBD, 0xCE, 0xEE, 0xE3, 0xBC, 0xC4, 0x2B, 0xDC, 0xE8, 0xB2, + 0x90, 0xDB, 0x0C, 0xD2, 0xB0, 0xEB, 0x1E, 0xF0, 0x05, 0xF5, 0x9F, 0xD3, + 0x19, 0xE3, 0x70, 0xC1, 0x27, 0xCA, 0x4B, 0xCC, 0x54, 0xBE, 0x95, 0xD3, + 0xFD, 0xD5, 0xD6, 0xDE, 0x3B, 0xE4, 0xF4, 0xE4, 0xC6, 0xC0, 0xE4, 0xD6, + 0xF2, 0xA4, 0x88, 0xDD, 0x8E, 0xC7, 0xE9, 0xFE, 0xA6, 0xE8, 0xBE, 0xFE, + 0xDB, 0xD0, 0xF6, 0xE2, 0x9C, 0xCD, 0x2E, 0xED, 0x8F, 0xF7, 0xD1, 0x09, + 0xA7, 0x0B, 0x03, 0x0E, 0x02, 0xF5, 0x40, 0xFD, 0xA9, 0xD1, 0xE1, 0xE6, + 0xC3, 0xBF, 0xC5, 0xDC, 0xD1, 0xDB, 0x97, 0xE2, 0x9C, 0xF8, 0xC5, 0xD8, + 0xBF, 0xE1, 0xA5, 0xBD, 0x1E, 0xCD, 0x05, 0xC6, 0x95, 0xCD, 0x96, 0xD8, + 0xB2, 0xCB, 0x46, 0xE3, 0xD6, 0xE6, 0x0A, 0xEA, 0x2F, 0x03, 0x38, 0xDC, + 0x64, 0xF9, 0xF8, 0xD6, 0x1D, 0xF3, 0x1E, 0xE4, 0xED, 0xF7, 0xB6, 0xE2, + 0x32, 0xE1, 0xE8, 0xCF, 0xB0, 0xCC, 0x92, 0xD7, 0xC1, 0xED, 0x8E, 0xF1, + 0x6F, 0x0D, 0x94, 0xEF, 0x51, 0x0B, 0xBE, 0xDA, 0x18, 0x0E, 0xF4, 0xE3, + 0xFF, 0x09, 0x95, 0xF2, 0xD9, 0xF9, 0x04, 0xEA, 0xE9, 0x01, 0x7C, 0xF2, + 0x87, 0x02, 0xFE, 0xF1, 0x8F, 0xF6, 0x3A, 0xE8, 0xF9, 0xFC, 0xFF, 0xF3, + 0x97, 0xF2, 0x86, 0xFF, 0x94, 0xD3, 0xC6, 0xE6, 0x94, 0xCF, 0xCF, 0xDE, + 0x79, 0xE5, 0xFB, 0x08, 0x98, 0xF8, 0xA9, 0x06, 0x3D, 0x01, 0x12, 0xE7, + 0x4D, 0x11, 0xED, 0xEE, 0x53, 0x14, 0xE8, 0xFB, 0xA3, 0x01, 0xC3, 0x00, + 0x5D, 0x03, 0x97, 0x12, 0x97, 0xF9, 0xA5, 0x08, 0x7C, 0xDD, 0x00, 0xF0, + 0x36, 0xDF, 0xB2, 0x0E, 0x3F, 0xF4, 0xF6, 0x2E, 0x59, 0xF0, 0x79, 0x0C, + 0xAB, 0xE7, 0x18, 0xEC, 0x26, 0x07, 0xCF, 0x08, 0x9F, 0x2C, 0x55, 0x25, + 0xAB, 0x2E, 0xDA, 0x1D, 0xA5, 0x20, 0x69, 0x17, 0xCB, 0x02, 0x29, 0x06, + 0xF5, 0xF2, 0x79, 0xFF, 0x62, 0xFF, 0xA9, 0x17, 0x68, 0xFB, 0xF3, 0x14, + 0x1C, 0xF3, 0x77, 0xF6, 0x2F, 0xEE, 0xC8, 0xEB, 0xB1, 0xE8, 0x60, 0xEA, + 0xBF, 0xE0, 0xC4, 0xE6, 0xE5, 0xE6, 0x75, 0xF7, 0x80, 0xFD, 0x3A, 0x00, + 0xE7, 0xFE, 0xFD, 0xED, 0x08, 0xF8, 0x43, 0xDB, 0x54, 0xF9, 0xAF, 0xDF, + 0xCA, 0xFE, 0xAC, 0xE4, 0x85, 0x05, 0xE8, 0xE9, 0x14, 0x03, 0x66, 0xF6, + 0x71, 0x04, 0xF6, 0xE5, 0xA0, 0x03, 0xCF, 0xDC, 0x41, 0xF9, 0x2C, 0xEF, + 0x28, 0xEF, 0x21, 0xEF, 0x0E, 0xF4, 0x76, 0xF1, 0x90, 0xF7, 0x66, 0xFB, + 0x73, 0xF0, 0x5F, 0xF7, 0x52, 0xF7, 0x01, 0xF9, 0xC2, 0xFC, 0xB5, 0x03, + 0x39, 0xF3, 0x26, 0xF9, 0x9D, 0xE8, 0x73, 0xF7, 0xB0, 0xF8, 0x20, 0x14, + 0x04, 0x0E, 0x30, 0x18, 0xE6, 0xFE, 0x3A, 0x08, 0xFB, 0xED, 0xDF, 0x09, + 0x47, 0xEC, 0xC2, 0xFC, 0x90, 0xE3, 0xBF, 0xD5, 0xC6, 0xE7, 0x32, 0xDA, + 0xFE, 0xF1, 0x95, 0xFC, 0xA4, 0xDD, 0xDD, 0xF2, 0xDE, 0xE0, 0xB0, 0xEA, + 0x57, 0x06, 0xBE, 0x06, 0xA3, 0xF5, 0xB7, 0xFE, 0x81, 0xD2, 0x5E, 0xEB, + 0x04, 0xF9, 0x6A, 0x00, 0x80, 0x2C, 0x67, 0x0F, 0x1D, 0x1E, 0xD1, 0xF7, + 0xD2, 0x0C, 0x6D, 0xF0, 0xEF, 0x12, 0x95, 0x02, 0x43, 0xFE, 0x21, 0xEE, + 0xA5, 0xEE, 0xC4, 0xDE, 0x4E, 0xEB, 0xEF, 0xEE, 0x3C, 0xE7, 0xA5, 0xEB, + 0x29, 0xFE, 0x77, 0xEA, 0xE5, 0x05, 0xBA, 0xF4, 0x8F, 0xE7, 0x43, 0xE7, + 0xAD, 0xD8, 0xDD, 0xDB, 0xB7, 0xE4, 0xB7, 0xF3, 0x52, 0xE8, 0xCB, 0x08, + 0x8D, 0xE4, 0xBA, 0xF3, 0x5A, 0xE0, 0x86, 0xE7, 0xA2, 0xD8, 0x95, 0xDE, + 0x5A, 0xEC, 0x93, 0xC8, 0x83, 0x0A, 0xB0, 0xD4, 0xF3, 0x04, 0x21, 0xE7, + 0x89, 0xF4, 0xC5, 0xE9, 0x62, 0xEC, 0x2C, 0xE9, 0x07, 0xE0, 0x57, 0xDC, + 0x27, 0xE0, 0x1D, 0xD0, 0x80, 0xF4, 0xF9, 0xD7, 0x23, 0x03, 0x61, 0xE8, + 0x7E, 0x02, 0x36, 0xE4, 0xE6, 0xFC, 0x75, 0xDD, 0x1C, 0xE0, 0xEC, 0xDA, + 0xBA, 0xC9, 0x20, 0xE3, 0x75, 0xE1, 0x43, 0x02, 0x02, 0x02, 0x4C, 0x0D, + 0x24, 0x05, 0xF2, 0x06, 0xF7, 0xFB, 0x5C, 0x06, 0xB6, 0xF6, 0x2E, 0x0A, + 0xE0, 0xF4, 0xC3, 0x01, 0x21, 0x06, 0x9B, 0x03, 0x4B, 0x10, 0x9E, 0x0A, + 0x5D, 0xFE, 0x14, 0xEB, 0x05, 0x08, 0x1E, 0xE7, 0x5B, 0x23, 0x28, 0x11, + 0x93, 0xF4, 0x1B, 0x07, 0xEC, 0xB4, 0xB4, 0xDB, 0x30, 0xC8, 0xBC, 0xE2, + 0x0C, 0xF1, 0x8D, 0xF5, 0x47, 0xFC, 0xE6, 0xEF, 0xBD, 0xFE, 0x12, 0xF4, + 0xCA, 0xF1, 0x92, 0xF6, 0x4E, 0xEF, 0x28, 0xE9, 0x20, 0x18, 0x1A, 0xE2, + 0x35, 0x2A, 0x21, 0xD9, 0x27, 0x05, 0x81, 0xCE, 0x5B, 0xF7, 0x6D, 0xD7, + 0x5F, 0xF5, 0xD4, 0xE4, 0x02, 0xDA, 0x14, 0xE1, 0xBD, 0xD5, 0x6C, 0xE0, + 0x7F, 0xE6, 0x6F, 0xDE, 0x22, 0xE4, 0x87, 0xC6, 0xAD, 0xE0, 0x88, 0xBC, + 0xFC, 0xE2, 0x7C, 0xDD, 0x6B, 0xD8, 0xC9, 0xF8, 0x17, 0xCE, 0xEE, 0xF0, + 0x70, 0xCD, 0x67, 0xE6, 0x7D, 0xD6, 0x9F, 0xE3, 0xEB, 0xEA, 0x62, 0xDD, + 0xD9, 0xFC, 0x59, 0xDC, 0x2C, 0xE3, 0x5D, 0xE8, 0x28, 0xCF, 0x28, 0xF4, + 0x25, 0xDA, 0xF2, 0xEA, 0x39, 0xDC, 0x3C, 0xD3, 0xD7, 0xE8, 0xB0, 0xCA, + 0xC9, 0xF8, 0x47, 0xD1, 0xFC, 0xE5, 0x21, 0xCC, 0x4F, 0xCA, 0x1B, 0xCE, + 0xCD, 0xDC, 0x87, 0xD6, 0xF2, 0xF1, 0x1B, 0xD6, 0x89, 0xED, 0xFD, 0xD6, + 0x39, 0xFE, 0x27, 0xDD, 0xF8, 0x02, 0x56, 0xE6, 0x6D, 0xF7, 0xCE, 0xEA, + 0xA7, 0x04, 0x0E, 0x02, 0x1C, 0x00, 0xCE, 0x0A, 0x15, 0xED, 0xC4, 0xF5, + 0x4F, 0x05, 0x6F, 0xF9, 0xA0, 0x30, 0x32, 0x0D, 0x58, 0x29, 0x34, 0x10, + 0x17, 0x04, 0x7A, 0x0D, 0xEA, 0xF4, 0xCC, 0x1C, 0x0F, 0xEE, 0x1E, 0x1F, + 0xDD, 0xEF, 0xD8, 0x12, 0x8B, 0xFF, 0xE3, 0x1E, 0x16, 0x0A, 0x03, 0x1E, + 0x4F, 0x0E, 0x22, 0x12, 0x7D, 0x0F, 0x7C, 0x1F, 0xD3, 0x0E, 0xCD, 0x1F, + 0x9F, 0x14, 0xC9, 0x0E, 0x38, 0x24, 0x91, 0x01, 0x53, 0x25, 0xFE, 0xF8, + 0x93, 0x1A, 0x11, 0xEF, 0x55, 0x24, 0x70, 0xEF, 0x0E, 0x25, 0x92, 0xF6, + 0x14, 0x14, 0x37, 0xF3, 0xA4, 0x0B, 0x20, 0x00, 0x9C, 0x0C, 0xA3, 0x0C, + 0xD6, 0x15, 0xDF, 0x04, 0x3C, 0x15, 0x7D, 0x08, 0x51, 0x1A, 0xCB, 0x25, + 0xB3, 0x23, 0x6E, 0x32, 0x90, 0x23, 0x96, 0x23, 0x1D, 0x2D, 0xAF, 0x23, + 0x59, 0x2E, 0x86, 0x28, 0xB1, 0x22, 0x1D, 0x31, 0x47, 0x18, 0xD2, 0x3A, + 0x6B, 0x1A, 0xFC, 0x2E, 0x8A, 0x17, 0x43, 0x16, 0x0E, 0x03, 0xB0, 0x09, + 0x2C, 0x03, 0x6E, 0x0D, 0x75, 0x1A, 0xCB, 0x1B, 0x95, 0x28, 0xBB, 0x32, + 0xE9, 0x1B, 0x52, 0x31, 0x04, 0x0A, 0xCA, 0x1F, 0x57, 0x1E, 0xCC, 0x1A, + 0xBF, 0x39, 0x00, 0x11, 0xA0, 0x3A, 0x87, 0x0D, 0xAD, 0x26, 0x0F, 0x1C, + 0x81, 0x0D, 0x5A, 0x20, 0xA2, 0x16, 0xA1, 0x14, 0x4E, 0x43, 0x04, 0x20, + 0x4E, 0x47, 0x45, 0x24, 0x3C, 0x24, 0xBF, 0x0C, 0x93, 0x2D, 0xDE, 0x14, + 0xBB, 0x46, 0x41, 0x30, 0x52, 0x3F, 0xF7, 0x36, 0x21, 0x37, 0xEA, 0x42, + 0xAD, 0x2F, 0xF3, 0x4C, 0x20, 0x1C, 0xD8, 0x32, 0xF8, 0x1E, 0x2A, 0x23, + 0x3F, 0x2D, 0x5E, 0x2F, 0xF3, 0x2B, 0x9F, 0x38, 0x64, 0x2F, 0x63, 0x38, + 0x65, 0x37, 0xCA, 0x37, 0xE5, 0x27, 0xE5, 0x3C, 0xD2, 0x11, 0x92, 0x3C, + 0x24, 0x10, 0x03, 0x4A, 0xBE, 0x07, 0x09, 0x4B, 0x90, 0x03, 0x9C, 0x25, + 0x06, 0x23, 0xD4, 0x11, 0x8C, 0x1E, 0xCA, 0x1D, 0x1F, 0xFE, 0x33, 0x21, + 0xAA, 0x05, 0xAC, 0x13, 0x93, 0x0E, 0xFC, 0x0E, 0xD7, 0x0F, 0x7F, 0x07, + 0xB5, 0x24, 0xDF, 0x02, 0x85, 0x3C, 0xBE, 0x0C, 0x30, 0x28, 0xDF, 0x09, + 0xB6, 0x0B, 0x95, 0x04, 0x55, 0x13, 0x18, 0x18, 0x07, 0x12, 0x92, 0x29, + 0xD2, 0x01, 0x49, 0x22, 0xC5, 0xF9, 0xFC, 0x1D, 0xAE, 0xF9, 0x3B, 0x1A, + 0x0B, 0x0A, 0xDB, 0x1E, 0xCC, 0x12, 0x33, 0x24, 0x19, 0x02, 0x0F, 0x20, + 0x6D, 0xF3, 0xFB, 0x24, 0xE4, 0x00, 0x97, 0x2B, 0x9C, 0x18, 0x79, 0x41, + 0x44, 0x06, 0xF8, 0x3A, 0x46, 0xEC, 0x9D, 0x16, 0x68, 0x01, 0x1F, 0x2B, + 0xDA, 0x31, 0x0E, 0x57, 0x8C, 0x3E, 0x3F, 0x4A, 0x16, 0x25, 0xDB, 0x20, + 0x61, 0x26, 0xE4, 0x17, 0xCF, 0x37, 0xE7, 0x2A, 0x30, 0x3A, 0xB3, 0x35, + 0xE3, 0x2F, 0x05, 0x2C, 0x9C, 0x24, 0x81, 0x21, 0x6D, 0x24, 0x14, 0x16, + 0x58, 0x31, 0xAE, 0x15, 0x53, 0x37, 0x32, 0x1E, 0xF6, 0x26, 0x60, 0x2B, + 0xB3, 0x1B, 0x65, 0x38, 0x01, 0x2A, 0x99, 0x3B, 0xEC, 0x38, 0x18, 0x3C, + 0x25, 0x41, 0x58, 0x2D, 0x4F, 0x46, 0x1D, 0x2E, 0x26, 0x3C, 0x09, 0x2D, + 0x74, 0x2A, 0x38, 0x22, 0x87, 0x1E, 0xD3, 0x34, 0xFE, 0x11, 0x2D, 0x3A, + 0x58, 0x07, 0xFC, 0x24, 0x54, 0x0D, 0x0A, 0x16, 0xFC, 0x0E, 0xE4, 0x1A, + 0x63, 0x05, 0x91, 0x2F, 0x0B, 0x01, 0xA9, 0x40, 0x1C, 0xFC, 0x53, 0x3E, + 0x11, 0xFA, 0x04, 0x20, 0x47, 0x09, 0x35, 0x15, 0x0C, 0x0D, 0xA0, 0x1F, + 0xF0, 0x10, 0xD8, 0x20, 0xEA, 0x24, 0x42, 0x1C, 0xA4, 0x16, 0xA4, 0x0C, + 0x72, 0x12, 0x52, 0x01, 0xA9, 0x2A, 0xDC, 0x09, 0xCC, 0x23, 0x3E, 0x09, + 0x65, 0x19, 0x2D, 0xF7, 0x29, 0x18, 0xE5, 0xF9, 0xF1, 0x18, 0x4E, 0x0D, + 0x7D, 0x14, 0x01, 0x23, 0xFA, 0x04, 0xD8, 0x1F, 0x4D, 0xF5, 0xC4, 0xF7, + 0x05, 0xF7, 0x13, 0xF1, 0xA5, 0x15, 0x7F, 0x21, 0xE3, 0x13, 0xEA, 0x30, + 0xFD, 0xF1, 0x2B, 0x16, 0xBB, 0xF1, 0x9D, 0x1D, 0x85, 0x0A, 0x4B, 0x30, + 0x24, 0x0F, 0x62, 0x31, 0x67, 0x08, 0x9E, 0x1F, 0x20, 0x0C, 0x66, 0xFE, + 0x3B, 0x0F, 0x69, 0xF0, 0x40, 0x12, 0x88, 0x03, 0x55, 0x11, 0xB4, 0x0B, + 0xE5, 0xEF, 0x41, 0xF4, 0x36, 0xD7, 0xB5, 0xE6, 0x50, 0xE1, 0x4F, 0xE1, + 0x64, 0xE5, 0x19, 0xD6, 0xA4, 0xF0, 0xBE, 0xCF, 0x45, 0xFE, 0x0C, 0xC9, + 0xD5, 0xF7, 0x49, 0xBD, 0xE7, 0xEF, 0xDC, 0xBC, 0x38, 0xFB, 0xAF, 0xD6, + 0xF1, 0xF4, 0xC3, 0xDF, 0xFB, 0xDE, 0x3D, 0xCB, 0xC4, 0xE6, 0x71, 0xCD, + 0x58, 0xF0, 0x16, 0xDD, 0x74, 0xF2, 0xC2, 0xD7, 0x11, 0xF1, 0x56, 0xD4, + 0x11, 0xDA, 0x3E, 0xD7, 0x27, 0xC0, 0x3D, 0xD5, 0x10, 0xB4, 0xDF, 0xD0, + 0x09, 0xBB, 0x2E, 0xDB, 0x88, 0xBB, 0xBC, 0xEA, 0xC8, 0xAE, 0xA8, 0xD5, + 0xA3, 0xB9, 0x72, 0xC8, 0x9D, 0xC8, 0x31, 0xD4, 0xE0, 0xCE, 0x43, 0xDF, + 0xD5, 0xD2, 0x1A, 0xEE, 0xBB, 0xC6, 0xB1, 0xE6, 0xEE, 0xB8, 0xE8, 0xD4, + 0xF8, 0xCA, 0x19, 0xD9, 0xAE, 0xE8, 0xE5, 0xCF, 0x61, 0xE2, 0x31, 0xAD, + 0x0D, 0xCA, 0x9C, 0xA8, 0xC6, 0xE2, 0x7B, 0xD9, 0x2D, 0xE8, 0x3B, 0xE7, + 0xD1, 0xBF, 0x20, 0xC8, 0xCF, 0xC3, 0xE5, 0xBC, 0x56, 0xE2, 0x04, 0xC7, + 0x75, 0xF5, 0x28, 0xD9, 0xAA, 0xF9, 0x2F, 0xE6, 0xD1, 0xE3, 0x5A, 0xE6, + 0xD7, 0xCF, 0xA3, 0xCD, 0xD7, 0xD5, 0xB5, 0xC8, 0x61, 0xE2, 0xDB, 0xD6, + 0xC0, 0xE2, 0x8D, 0xC7, 0xA0, 0xD8, 0xD7, 0xB7, 0xE1, 0xD0, 0x16, 0xC6, + 0x25, 0xC4, 0xE8, 0xD8, 0x55, 0xC1, 0xD1, 0xE3, 0xF9, 0xC4, 0x8C, 0xED, + 0x3C, 0xAD, 0x27, 0xD8, 0xC2, 0xA0, 0x56, 0xC9, 0x9D, 0xC7, 0x22, 0xEE, + 0xA1, 0xE9, 0x26, 0x01, 0x8F, 0xDD, 0xDA, 0xDB, 0xBC, 0xD7, 0x6E, 0xC7, + 0xF2, 0xF9, 0x98, 0xDC, 0xF5, 0x05, 0x81, 0xDA, 0x26, 0xEA, 0x01, 0xCA, + 0xBC, 0xDF, 0xDF, 0xCE, 0x75, 0xEB, 0xF6, 0xDF, 0x40, 0xF3, 0x23, 0xE4, + 0x58, 0xF1, 0x6D, 0xE2, 0x63, 0xE9, 0x69, 0xDE, 0xDB, 0xE2, 0x10, 0xD4, + 0x9E, 0xE6, 0x3C, 0xE8, 0x67, 0xDD, 0xF0, 0xFE, 0x0C, 0xCF, 0x7F, 0xF8, + 0x22, 0xD9, 0x0E, 0xF9, 0xC1, 0xF5, 0x54, 0x01, 0xC5, 0xFA, 0x70, 0xF8, + 0xBB, 0xFE, 0xE4, 0x00, 0x8F, 0x10, 0xEF, 0x18, 0xFC, 0xFC, 0x56, 0x1B, + 0x62, 0xE1, 0xFC, 0x04, 0xDC, 0xF0, 0x22, 0x07, 0x08, 0xFF, 0x3B, 0x0F, + 0xC9, 0xE8, 0x5D, 0xF5, 0x19, 0xEB, 0x9C, 0xF4, 0xF8, 0x11, 0x13, 0x06, + 0x16, 0x0E, 0x76, 0xFB, 0x92, 0xFC, 0xF8, 0xFC, 0xD9, 0x05, 0x0C, 0xFE, + 0x86, 0x02, 0xD5, 0xE5, 0x88, 0x04, 0x64, 0xE2, 0x24, 0x25, 0x27, 0xFE, + 0xFD, 0x1E, 0xC5, 0xFF, 0xC1, 0xF0, 0x3D, 0xE6, 0x03, 0xE9, 0xB7, 0xE0, + 0x16, 0xF1, 0x2C, 0xD2, 0x3E, 0xEB, 0x52, 0xC1, 0x82, 0xEF, 0xBE, 0xE3, + 0xDF, 0xEF, 0xC9, 0xF7, 0x43, 0xE0, 0x4B, 0xD8, 0xCB, 0xE2, 0x09, 0xD9, + 0x5B, 0xEF, 0x74, 0xF3, 0x00, 0xEA, 0x08, 0xED, 0xD0, 0xD9, 0x13, 0xD8, + 0x85, 0xCD, 0x87, 0xD8, 0xCA, 0xD2, 0x44, 0xEF, 0xB2, 0xDB, 0xB1, 0xFB, + 0x8A, 0xCE, 0xEF, 0xE7, 0x18, 0xD3, 0x10, 0xDA, 0xD0, 0xE3, 0xF7, 0xE5, + 0x8A, 0xE7, 0xF6, 0xF5, 0x55, 0xF0, 0x76, 0xF6, 0x3F, 0xE4, 0x95, 0xEE, + 0x6C, 0xDC, 0x60, 0xEB, 0x6E, 0xEB, 0x63, 0xEA, 0xF1, 0xF3, 0xA2, 0xED, + 0x73, 0xF7, 0x37, 0xE2, 0x30, 0xE8, 0x7C, 0xCC, 0xCD, 0xE1, 0x58, 0xD5, + 0x9D, 0x02, 0x91, 0xFF, 0xFD, 0x11, 0x1A, 0x0D, 0x2E, 0xF9, 0x0E, 0xEB, + 0x21, 0xFA, 0x41, 0xEC, 0x1E, 0x38, 0x22, 0x20, 0x9B, 0x43, 0xE2, 0x27, + 0x3D, 0x19, 0x5F, 0x08, 0x36, 0x12, 0x2D, 0xFE, 0x20, 0x1D, 0xD4, 0x02, + 0xAC, 0x27, 0xAB, 0x0B, 0x83, 0x2B, 0x6F, 0x19, 0xC8, 0x16, 0xA9, 0x11, + 0x04, 0x0D, 0x9B, 0xFC, 0x8A, 0x22, 0x58, 0x00, 0x40, 0x31, 0x0A, 0x18, + 0xAC, 0x0F, 0x8F, 0x15, 0x7D, 0xF2, 0xBA, 0x0D, 0xA9, 0x0A, 0x62, 0x1E, + 0x31, 0x16, 0x5A, 0x0D, 0x78, 0x0D, 0xB3, 0xEC, 0x3F, 0x12, 0x7A, 0xF7, + 0xCF, 0x1A, 0x9F, 0xFA, 0xD8, 0x1F, 0x71, 0xDA, 0x00, 0x23, 0xC6, 0xE2, + 0x6A, 0x15, 0xB6, 0x00, 0xE9, 0x05, 0x2A, 0xF9, 0x5A, 0x08, 0x13, 0xED, + 0xF7, 0x05, 0x40, 0xF3, 0x41, 0xFA, 0xD7, 0x09, 0x5F, 0xF7, 0x7C, 0x1B, + 0xEC, 0xF4, 0x2D, 0x0B, 0x16, 0x03, 0x32, 0xF8, 0x78, 0x0C, 0x4D, 0xFE, + 0x0B, 0xFD, 0xC3, 0x01, 0x61, 0x01, 0xC4, 0xFB, 0x7D, 0x07, 0xFD, 0xFA, + 0x24, 0xFE, 0xD5, 0x05, 0x2D, 0xF8, 0x28, 0x02, 0x2A, 0xF0, 0x11, 0xF1, + 0x2F, 0xF9, 0x01, 0xF8, 0x71, 0x03, 0x91, 0xFE, 0x9E, 0x01, 0x8A, 0xFC, + 0xE3, 0xF9, 0xBC, 0x0C, 0xB9, 0xDF, 0x01, 0x13, 0x27, 0xCB, 0xE8, 0xED, + 0xB5, 0xDF, 0x10, 0xDE, 0xA7, 0x10, 0xB3, 0xFD, 0x18, 0x26, 0xC4, 0xF8, + 0xFF, 0x1B, 0x09, 0xDC, 0x0E, 0x1C, 0xF7, 0xEA, 0x90, 0x20, 0x3F, 0x06, + 0xF9, 0x1C, 0x0B, 0x04, 0xCC, 0x19, 0x57, 0x08, 0xBA, 0x15, 0x80, 0x03, + 0x8A, 0x17, 0xB9, 0xEE, 0x45, 0x18, 0x81, 0xF8, 0xD7, 0x0F, 0x62, 0xFB, + 0x48, 0x07, 0x4D, 0xE6, 0x94, 0x01, 0x87, 0xE2, 0x9B, 0xF6, 0x22, 0xEC, + 0xA9, 0xEE, 0x02, 0xF3, 0xB4, 0xFE, 0x7B, 0xFE, 0x02, 0x07, 0x25, 0x0E, + 0xD8, 0xF6, 0x5B, 0x0D, 0x49, 0xF2, 0x0F, 0x06, 0x72, 0xFA, 0xCA, 0x02, + 0x77, 0x00, 0x61, 0xF7, 0xDF, 0xFA, 0x6F, 0xFC, 0xA5, 0xE4, 0xF6, 0xFA, + 0xF2, 0xD5, 0xE8, 0xEE, 0x4D, 0xEB, 0x7F, 0xFD, 0xDE, 0x03, 0x84, 0xFB, + 0x72, 0x07, 0x07, 0xEB, 0x5C, 0x0D, 0x45, 0xF4, 0x17, 0x09, 0xB3, 0x0E, + 0xED, 0xEC, 0xD3, 0x09, 0x5A, 0xE0, 0x1C, 0xED, 0xF7, 0xF6, 0x4C, 0xEB, + 0xAF, 0x03, 0xCA, 0xF2, 0xB2, 0xFE, 0x93, 0xF4, 0xFF, 0xFC, 0xD4, 0x0C, + 0x8E, 0x00, 0xBB, 0x21, 0x90, 0xF9, 0xD1, 0x06, 0x3B, 0x0E, 0x4A, 0xFF, + 0x94, 0x2B, 0x37, 0x15, 0x58, 0x12, 0x37, 0x03, 0x15, 0x09, 0x2C, 0xF8, + 0x9B, 0x1D, 0xBD, 0x20, 0xDF, 0x10, 0xAC, 0x23, 0x02, 0xFC, 0x6F, 0xF9, + 0x5E, 0xFC, 0x51, 0xFB, 0x4D, 0xFC, 0xFF, 0x1A, 0x2F, 0x0E, 0x25, 0x14, + 0x3B, 0x2B, 0x70, 0x0D, 0xB2, 0x1A, 0x6E, 0x1A, 0x50, 0xFB, 0x28, 0x0B, + 0x9A, 0x0D, 0xE3, 0xFB, 0xCA, 0x2E, 0x41, 0x06, 0xD3, 0x26, 0x32, 0x03, + 0x33, 0x0E, 0x7E, 0xFE, 0x14, 0x04, 0x7B, 0x0B, 0xE5, 0x08, 0xEC, 0x0D, + 0x5E, 0x18, 0xCD, 0x04, 0x5E, 0x17, 0x1C, 0x02, 0x93, 0x0F, 0x04, 0x19, + 0xAA, 0x13, 0xD1, 0x2A, 0x6D, 0xFF, 0xC3, 0x1A, 0x9C, 0xEB, 0x2E, 0x13, + 0x97, 0xF9, 0xDA, 0x1F, 0x0B, 0x0D, 0xF5, 0x29, 0xAC, 0x1A, 0xFE, 0x2D, + 0x65, 0x17, 0xF1, 0x35, 0x39, 0x0B, 0x7C, 0x1D, 0x62, 0x06, 0xB2, 0x02, + 0xA1, 0x07, 0x1D, 0x19, 0xB5, 0x15, 0x6C, 0x23, 0xCE, 0x10, 0xB7, 0x14, + 0xBE, 0xED, 0x6B, 0x0E, 0x5A, 0xEB, 0x51, 0x0F, 0x70, 0x01, 0x02, 0x12, + 0x3E, 0xFD, 0x6B, 0x21, 0xF2, 0x02, 0x6B, 0x22, 0x65, 0x17, 0xB8, 0x1C, + 0xA7, 0x1F, 0x9A, 0x13, 0xAB, 0x2F, 0x58, 0x19, 0xBF, 0x43, 0x63, 0x31, + 0xBB, 0x31, 0x0A, 0x17, 0xA8, 0x24, 0x52, 0xEC, 0xFA, 0x53, 0xAC, 0x0D, + 0x48, 0x53, 0x69, 0x42, 0x49, 0x20, 0x35, 0x2B, 0xC6, 0x1C, 0xF1, 0x08, + 0xFE, 0x2C, 0x0A, 0x1F, 0x24, 0x39, 0xA4, 0x46, 0xD8, 0x46, 0x83, 0x53, + 0xD3, 0x39, 0x44, 0x54, 0x42, 0x22, 0x25, 0x48, 0x28, 0x19, 0xD5, 0x3A, + 0x83, 0x1E, 0xDB, 0x3D, 0xA2, 0x22, 0xFD, 0x3C, 0xD0, 0x21, 0x68, 0x3B, + 0xD5, 0x2A, 0x01, 0x3B, 0x90, 0x28, 0x1B, 0x3F, 0x36, 0x24, 0xB7, 0x36, + 0x2F, 0x2B, 0xD2, 0x2C, 0x00, 0x35, 0xE4, 0x37, 0xC5, 0x35, 0x92, 0x30, + 0xA3, 0x2A, 0x16, 0x18, 0x73, 0x1D, 0x8E, 0x1B, 0xDF, 0x0A, 0xDB, 0x28, + 0x7F, 0x08, 0x64, 0x1F, 0x95, 0x15, 0x74, 0x11, 0x23, 0x11, 0x5D, 0x17, + 0x11, 0x0D, 0xE9, 0x2D, 0x01, 0x24, 0x00, 0x37, 0x7C, 0x28, 0xD0, 0x35, + 0xE6, 0x10, 0x4B, 0x39, 0xAA, 0x15, 0x2C, 0x37, 0xF5, 0x1A, 0xFA, 0x1B, + 0xD3, 0x10, 0xC3, 0x0B, 0x29, 0x12, 0xA2, 0x14, 0x09, 0x0B, 0x0E, 0x13, + 0x60, 0xFD, 0x15, 0x11, 0x93, 0xFF, 0x4C, 0x1D, 0xCB, 0xF5, 0xB0, 0x0F, + 0xC8, 0xF2, 0x16, 0xF9, 0x5D, 0x08, 0xA4, 0x03, 0x83, 0x0D, 0x53, 0x02, + 0x61, 0xFE, 0x60, 0xF0, 0x8D, 0xF8, 0x4B, 0xFD, 0xBB, 0x04, 0x77, 0x15, + 0x64, 0x02, 0xD6, 0x05, 0x31, 0xF9, 0x39, 0xE0, 0x13, 0x10, 0x32, 0xE0, + 0x90, 0x1E, 0x23, 0xF2, 0xAB, 0x12, 0x02, 0xFC, 0xCE, 0xF8, 0x59, 0xF4, + 0x1B, 0xED, 0x21, 0xE4, 0x33, 0x04, 0x16, 0xEB, 0x33, 0x06, 0xC7, 0xF4, + 0xD5, 0xFE, 0x56, 0xFC, 0x42, 0xF2, 0xFA, 0x02, 0x19, 0xDA, 0xCA, 0xF9, + 0x46, 0xD6, 0xB3, 0xE5, 0x60, 0xE8, 0xC4, 0xF2, 0x71, 0xF8, 0x9B, 0x0B, + 0x41, 0xEF, 0xDC, 0x0A, 0xC8, 0xDC, 0xCB, 0xFE, 0x79, 0xD8, 0xF2, 0xF9, + 0xC9, 0xCE, 0x67, 0x00, 0x8B, 0xB9, 0x63, 0xFE, 0x36, 0xC3, 0xCB, 0xF7, + 0xD0, 0xE2, 0xC5, 0xFE, 0xE0, 0xFB, 0x58, 0xFE, 0x48, 0xF5, 0x0F, 0xE6, + 0x2B, 0xE1, 0x99, 0xE5, 0xE9, 0xD7, 0x57, 0xF3, 0x50, 0xD1, 0xEB, 0xE8, + 0x5E, 0xE4, 0x00, 0xDC, 0x52, 0xF8, 0x89, 0xD4, 0xBA, 0xFD, 0x44, 0xCA, + 0x12, 0xFB, 0x61, 0xCD, 0xE6, 0xF6, 0x72, 0xD4, 0x7C, 0xF1, 0x5B, 0xCA, + 0x9A, 0xE1, 0x27, 0xC4, 0x79, 0xE4, 0xC1, 0xD0, 0xE0, 0x07, 0x4B, 0xE9, + 0xE3, 0x11, 0xF7, 0xE2, 0x9E, 0xF7, 0x90, 0xCA, 0xC0, 0xF4, 0xA3, 0xE2, + 0x18, 0x17, 0x21, 0x0F, 0x7C, 0x24, 0x62, 0x10, 0xFC, 0x0E, 0xF6, 0xFF, + 0x67, 0xF5, 0xF2, 0x08, 0x84, 0xF8, 0x2E, 0x21, 0x4D, 0x1D, 0xF1, 0x30, + 0x88, 0x31, 0xAB, 0x2E, 0x9F, 0x26, 0x03, 0x17, 0xD8, 0x0E, 0x9D, 0x01, + 0x3C, 0x09, 0xEB, 0x0E, 0x3E, 0x18, 0x59, 0x24, 0x16, 0x12, 0x3E, 0x1D, + 0x8B, 0x07, 0x70, 0x0D, 0xF2, 0x0B, 0xE2, 0x14, 0xB2, 0xFB, 0x5C, 0x13, + 0x73, 0xFF, 0x57, 0x13, 0xE2, 0x20, 0x11, 0x1A, 0x18, 0x18, 0xAD, 0x06, + 0x56, 0xF5, 0x4B, 0xF8, 0xED, 0xFD, 0x21, 0x03, 0x3D, 0x1B, 0x38, 0x1B, + 0x55, 0x16, 0x92, 0x26, 0x78, 0x1A, 0xB3, 0x23, 0xDB, 0x2E, 0x5D, 0x24, + 0x2E, 0x29, 0x8B, 0x26, 0xA2, 0x23, 0x16, 0x2B, 0x86, 0x2E, 0x4D, 0x39, + 0x76, 0x23, 0x6F, 0x2F, 0xDA, 0x0A, 0x3D, 0x09, 0x20, 0x04, 0xEB, 0xF5, + 0x4A, 0xFD, 0xC6, 0xFE, 0x5B, 0xEC, 0x59, 0x17, 0xEF, 0xEE, 0xD5, 0x1D, + 0xF4, 0xEC, 0xD8, 0x04, 0x2D, 0xE4, 0x01, 0xF8, 0x7D, 0xF2, 0xEE, 0x0D, + 0x77, 0x10, 0xE8, 0x31, 0xC8, 0x2A, 0x40, 0x2E, 0xC1, 0x29, 0x93, 0xFD, + 0xAB, 0x16, 0x53, 0xD9, 0x21, 0x15, 0x40, 0xEE, 0x57, 0x26, 0x5C, 0x0C, + 0xFD, 0x14, 0x22, 0xE7, 0xD5, 0xFC, 0x74, 0xBE, 0x99, 0x07, 0xDF, 0xCF, + 0x2F, 0x1D, 0x14, 0xF8, 0x51, 0x32, 0xCC, 0x02, 0x9D, 0x2F, 0x4A, 0x01, + 0x8B, 0xFF, 0x5D, 0x06, 0x68, 0xE2, 0x7E, 0xFB, 0x6F, 0x01, 0xF7, 0xF8, + 0xB1, 0x17, 0x24, 0x05, 0x0F, 0xFB, 0xBB, 0x04, 0xFB, 0xDE, 0xEF, 0x01, + 0x68, 0xE2, 0x35, 0x07, 0xC8, 0xE8, 0xFA, 0xF9, 0x34, 0xEB, 0xC9, 0xFA, + 0xC5, 0xE9, 0x35, 0x18, 0x38, 0xCD, 0x79, 0x0B, 0x82, 0xC1, 0xD2, 0xE5, + 0x2E, 0xD5, 0x56, 0xE8, 0xE0, 0xC1, 0x7D, 0x04, 0x88, 0xB8, 0x3C, 0x0A, + 0x86, 0xCE, 0x83, 0xF6, 0x8A, 0xCE, 0xA9, 0xE2, 0x6B, 0xC1, 0x4A, 0xC7, + 0x37, 0xC6, 0xC6, 0xC8, 0x41, 0xD6, 0x1D, 0xE2, 0xCC, 0xDA, 0x73, 0xDA, + 0xA9, 0xD5, 0xA9, 0xB0, 0xA5, 0xD4, 0x1B, 0x9A, 0x6D, 0xE1, 0x9E, 0xAF, + 0x2A, 0xE8, 0x1B, 0xC9, 0x7F, 0xE6, 0xC5, 0xD0, 0x5F, 0xE3, 0xC3, 0xC4, + 0x42, 0xCC, 0xEC, 0xBF, 0x92, 0xC7, 0x41, 0xC9, 0xF1, 0xF0, 0xA2, 0xD9, + 0x98, 0xEE, 0x7B, 0xCE, 0xC7, 0xB6, 0xC8, 0xA8, 0x73, 0xA6, 0xC6, 0xB6, + 0x5D, 0xC4, 0x65, 0xEC, 0xE4, 0xD1, 0xC4, 0xEA, 0x5B, 0xC5, 0x6A, 0xC5, + 0xF4, 0xB8, 0xE7, 0xCD, 0xF2, 0xC4, 0x58, 0xDA, 0xA3, 0xE9, 0x6A, 0xD7, + 0x52, 0xFC, 0x06, 0xE8, 0x37, 0xE2, 0x47, 0xEB, 0x41, 0xC4, 0x3B, 0xC8, + 0x14, 0xD7, 0xB0, 0xB7, 0x29, 0xE7, 0x83, 0xBC, 0x92, 0xC4, 0x5F, 0xBB, + 0x52, 0xA5, 0x44, 0xD3, 0x4D, 0xB4, 0xDE, 0xDC, 0x57, 0xC2, 0x9C, 0xB4, + 0x76, 0xC9, 0x5E, 0x9D, 0xF1, 0xDD, 0xBF, 0xB8, 0x26, 0xDE, 0x6E, 0xD7, + 0x81, 0xE0, 0xE9, 0xD6, 0x7A, 0xEE, 0x47, 0xCA, 0xB0, 0xEB, 0x1F, 0xC4, + 0x52, 0xE6, 0xAD, 0xD1, 0xF8, 0xED, 0x2B, 0xE1, 0x5B, 0xED, 0xD5, 0xD4, + 0x83, 0xCD, 0x6B, 0xC3, 0x1D, 0xC5, 0x28, 0xD2, 0xB0, 0xD6, 0x04, 0xF1, + 0x13, 0xD8, 0xFA, 0xF2, 0x2E, 0xD4, 0xD4, 0xD5, 0x06, 0xBA, 0xB5, 0xC2, + 0x79, 0xC7, 0x59, 0xDE, 0x5B, 0xFE, 0x95, 0x01, 0xB3, 0xFD, 0x5C, 0xFA, + 0xE0, 0xDF, 0x75, 0xDF, 0x8E, 0xDB, 0xCE, 0xDF, 0x2E, 0xE1, 0x7D, 0xCD, + 0x56, 0xED, 0x80, 0xBF, 0xB7, 0xF9, 0xA0, 0xD7, 0x21, 0xEF, 0x15, 0xCA, + 0xB8, 0xF0, 0xBC, 0xB4, 0x22, 0x1B, 0x72, 0xCC, 0x0F, 0x25, 0x45, 0xEA, + 0xB2, 0xF6, 0x79, 0xD4, 0xE3, 0xEC, 0xEE, 0xCC, 0xB3, 0x0F, 0xA6, 0xF9, + 0xD3, 0x1D, 0x69, 0x04, 0x1F, 0x1C, 0x3B, 0xFE, 0xB7, 0x13, 0x56, 0x11, + 0x97, 0x02, 0x06, 0x0C, 0x07, 0xFD, 0xE0, 0xF3, 0xDD, 0x03, 0x49, 0x00, + 0xE0, 0xF8, 0x72, 0x16, 0x45, 0xE5, 0x5F, 0x1F, 0xBB, 0xED, 0xE2, 0x1C, + 0x5A, 0xFC, 0x0D, 0x04, 0x94, 0xFD, 0xD4, 0xF0, 0x14, 0xFC, 0xC4, 0x08, + 0x78, 0x11, 0x2B, 0x2A, 0x9E, 0x16, 0x94, 0x1D, 0xD8, 0xFF, 0x5D, 0x0C, + 0xCB, 0xFD, 0x94, 0x1A, 0xA7, 0x0A, 0x5C, 0x22, 0x25, 0x21, 0x70, 0x06, + 0x17, 0x29, 0x0B, 0xF9, 0xEB, 0x1D, 0x2D, 0x06, 0xE2, 0x1B, 0xA8, 0x03, + 0xFC, 0x1A, 0x81, 0x08, 0xB3, 0x19, 0xDD, 0x08, 0x4D, 0x0A, 0xBE, 0x00, + 0xAF, 0xF8, 0xDA, 0x02, 0x05, 0x1E, 0xFC, 0x17, 0x64, 0x4C, 0xB1, 0x20, + 0xEC, 0x39, 0x97, 0x10, 0xC5, 0x08, 0x56, 0x1B, 0x46, 0xFD, 0x3B, 0x22, + 0x16, 0x05, 0x2C, 0x13, 0x46, 0x14, 0x7A, 0x23, 0xF1, 0x27, 0xA1, 0x35, + 0x0B, 0x17, 0xC7, 0x1F, 0xF7, 0x0B, 0x1B, 0x0A, 0x2E, 0x2A, 0xE6, 0x22, + 0xB6, 0x3A, 0x83, 0x3C, 0x6E, 0x1C, 0xDE, 0x29, 0x4E, 0x05, 0x81, 0x2D, + 0x85, 0x27, 0x6F, 0x45, 0x34, 0x44, 0xEB, 0x39, 0x68, 0x35, 0xA1, 0x30, + 0xFD, 0x25, 0xB7, 0x38, 0x01, 0x15, 0xBA, 0x2B, 0x01, 0x0F, 0x47, 0x09, + 0x5A, 0x2A, 0x3C, 0x05, 0x22, 0x38, 0xC1, 0x19, 0xEF, 0x2D, 0x94, 0x1A, + 0x72, 0x25, 0xBF, 0x14, 0x6A, 0x23, 0x0F, 0x14, 0xF2, 0x27, 0xC6, 0x0D, + 0xCE, 0x33, 0x10, 0x1C, 0xCC, 0x4D, 0xFD, 0x30, 0xF0, 0x47, 0x23, 0x19, + 0xFD, 0x1E, 0x38, 0x08, 0x4D, 0x06, 0x68, 0x1A, 0xD2, 0x0E, 0xC9, 0x20, + 0x01, 0x17, 0xBF, 0x1C, 0xDE, 0x0E, 0xB0, 0x20, 0xED, 0xFD, 0xB8, 0x24, + 0x78, 0xFF, 0xC7, 0x32, 0xDA, 0x16, 0xEC, 0x39, 0x55, 0x16, 0xB0, 0x31, + 0x8F, 0x0F, 0x01, 0x31, 0x5D, 0x1A, 0x49, 0x2C, 0xBF, 0x2F, 0xD8, 0x20, + 0x53, 0x2F, 0xCA, 0x13, 0x95, 0x0E, 0x95, 0x13, 0x06, 0xF9, 0x60, 0x15, + 0x33, 0xF4, 0x5B, 0xFC, 0x79, 0xEF, 0xCB, 0xEB, 0x52, 0x08, 0x0E, 0xF9, + 0xC0, 0x19, 0x27, 0xFE, 0x03, 0xFA, 0xFB, 0xF7, 0x87, 0xF8, 0x3E, 0xFA, + 0xA3, 0x24, 0x5C, 0x0E, 0x85, 0x25, 0xA6, 0x18, 0xA2, 0x18, 0xE9, 0x10, + 0x1E, 0x2C, 0x1E, 0x18, 0xDD, 0x29, 0x4D, 0x22, 0xC5, 0x21, 0xD4, 0x24, + 0xD9, 0x35, 0xB3, 0x3C, 0xEC, 0x37, 0x98, 0x45, 0xCF, 0x1D, 0x20, 0x12, + 0xD4, 0x1C, 0x0D, 0x01, 0x38, 0x26, 0x74, 0x1E, 0x4D, 0x1F, 0xF5, 0x24, + 0x82, 0x18, 0xD6, 0x2E, 0x9C, 0x01, 0x84, 0x35, 0xE5, 0xE9, 0xC8, 0x23, + 0x2D, 0xF6, 0xDB, 0x13, 0x17, 0x1D, 0x16, 0x25, 0x09, 0x24, 0xBA, 0x2A, + 0xEB, 0x06, 0xBD, 0x17, 0x77, 0x05, 0xE1, 0x0B, 0x80, 0x14, 0x28, 0x0F, + 0x38, 0x11, 0xAC, 0x14, 0x6F, 0x1B, 0xA5, 0x10, 0x52, 0x26, 0x00, 0x03, + 0xD6, 0x16, 0xA0, 0xDE, 0x31, 0x1B, 0x65, 0xDD, 0xB1, 0x24, 0xC0, 0xFD, + 0x53, 0x14, 0x0A, 0x02, 0x1B, 0xF9, 0x8A, 0xEC, 0x29, 0xF4, 0x76, 0xEC, + 0xD5, 0x01, 0xF3, 0xFD, 0x23, 0xF9, 0x84, 0x00, 0x26, 0xEB, 0x92, 0xF8, + 0x89, 0xE0, 0x59, 0xF3, 0x6E, 0xD6, 0x21, 0xF0, 0x3F, 0xE6, 0xB2, 0xED, + 0xB7, 0xF9, 0xDD, 0x0A, 0xC1, 0xDD, 0x22, 0x14, 0x3D, 0xC8, 0xB0, 0xF2, + 0xA2, 0xEA, 0x84, 0xF6, 0xED, 0x0E, 0x29, 0x18, 0x6D, 0xF8, 0x99, 0x10, + 0xE0, 0xDB, 0x49, 0xF5, 0xA5, 0xED, 0x5B, 0xEC, 0x05, 0xF5, 0xC4, 0xEE, + 0xF5, 0xE7, 0x2B, 0xFE, 0xE6, 0xEC, 0xFC, 0x02, 0x19, 0xE5, 0x4C, 0xEF, + 0x2E, 0xD4, 0x89, 0xD7, 0x9E, 0xEB, 0x58, 0xD9, 0x99, 0x0A, 0xEE, 0xEC, + 0xD6, 0x1D, 0x01, 0xF6, 0x00, 0x1A, 0x87, 0xEF, 0xC7, 0xF5, 0xD4, 0xE0, + 0xDB, 0xE4, 0x27, 0xDC, 0x8A, 0x03, 0x95, 0xF7, 0x78, 0x24, 0xE7, 0x0E, + 0x90, 0x12, 0x9C, 0xF2, 0xCC, 0xDE, 0xDF, 0xDD, 0xFF, 0xCC, 0x33, 0xEC, + 0xE4, 0xE5, 0x3A, 0xEE, 0x18, 0xEC, 0x04, 0xE7, 0xE0, 0xCF, 0xD9, 0xFF, + 0xE1, 0xC2, 0x61, 0x12, 0x62, 0xDC, 0x0D, 0xFE, 0x8E, 0xF4, 0x96, 0xFE, + 0x54, 0xF3, 0x52, 0x04, 0xBD, 0xE6, 0x7C, 0xFC, 0x57, 0xD3, 0xB0, 0xEE, + 0xDF, 0xD9, 0x42, 0xED, 0x3B, 0xF0, 0x3D, 0xF1, 0xFA, 0xEF, 0x8E, 0xDC, + 0xFB, 0xDD, 0xBC, 0xD4, 0xC2, 0xDE, 0x78, 0xE7, 0xDF, 0xF3, 0x16, 0xF4, + 0xD3, 0xFD, 0x01, 0x05, 0xFE, 0xEE, 0x77, 0x05, 0xED, 0xD1, 0xF3, 0xE5, + 0x1F, 0xD6, 0xB1, 0xE1, 0x18, 0x12, 0x08, 0x05, 0x37, 0x3A, 0x6D, 0x1F, + 0x89, 0x21, 0x47, 0x15, 0x29, 0x17, 0x17, 0x01, 0x51, 0x20, 0x0F, 0x0B, + 0xFB, 0x1B, 0x00, 0x1C, 0xCA, 0x19, 0xAD, 0x2E, 0xDC, 0x0D, 0xB0, 0x31, + 0x92, 0x08, 0x96, 0x0D, 0xE1, 0x07, 0x50, 0x0E, 0x2A, 0x06, 0x1A, 0x2F, + 0x88, 0x07, 0x67, 0x28, 0xEE, 0x0A, 0x12, 0x1E, 0xA1, 0x0B, 0x6B, 0x20, + 0x71, 0xFA, 0xE5, 0x1A, 0x7F, 0x01, 0x1B, 0x28, 0x60, 0x23, 0x4F, 0x43, + 0x70, 0x37, 0x1E, 0x35, 0xFB, 0x2B, 0x80, 0x07, 0x4A, 0x13, 0x5E, 0xFB, + 0x25, 0x19, 0x5E, 0x07, 0xC2, 0x1F, 0x39, 0x09, 0xC6, 0x17, 0x2E, 0x07, + 0x04, 0x16, 0xF8, 0x07, 0xE0, 0x18, 0xFA, 0xFD, 0x59, 0x23, 0x72, 0x07, + 0x5C, 0x25, 0x02, 0x17, 0xB0, 0x23, 0xBC, 0x13, 0x7C, 0x17, 0xEC, 0x0A, + 0x2B, 0x10, 0xEB, 0x19, 0xE9, 0x0C, 0x5B, 0x29, 0x20, 0xFC, 0x16, 0x0E, + 0xA4, 0xFC, 0x6D, 0x00, 0x32, 0x02, 0xDE, 0x05, 0xB6, 0xEE, 0xB2, 0xFC, + 0xDD, 0xED, 0xBC, 0x06, 0x42, 0x0A, 0x6B, 0x26, 0x9A, 0xF5, 0x05, 0x10, + 0x0D, 0xD3, 0x19, 0xDF, 0x1E, 0xE9, 0xE4, 0xF0, 0x1B, 0x0C, 0xBE, 0x1E, + 0xD8, 0x09, 0x88, 0x17, 0x00, 0xF9, 0x2D, 0x02, 0x94, 0xF1, 0x6F, 0x06, + 0x85, 0xF6, 0x82, 0xFA, 0x4C, 0x0F, 0x5E, 0xFA, 0x93, 0x23, 0xCC, 0x04, + 0x42, 0x0F, 0x71, 0xE6, 0x10, 0xE8, 0xC1, 0xE6, 0x97, 0xF2, 0x41, 0x0A, + 0xD3, 0x0A, 0xB1, 0x07, 0xDD, 0x05, 0x7A, 0xF5, 0xEE, 0x09, 0xBF, 0xF2, + 0x70, 0x09, 0xF2, 0xFA, 0xB2, 0xF1, 0xA6, 0xF2, 0x91, 0xF5, 0x72, 0xF7, + 0xB2, 0x03, 0x11, 0xFD, 0x57, 0xE2, 0x5C, 0xE6, 0x1C, 0xBF, 0x0E, 0xE7, + 0xB8, 0xD0, 0x8C, 0xF3, 0x44, 0xED, 0x0D, 0xF0, 0x7A, 0xEE, 0x15, 0xEE, + 0x36, 0xEE, 0x59, 0x08, 0xC8, 0xDE, 0x8E, 0x11, 0xDE, 0xE2, 0x28, 0xFC, + 0x85, 0x00, 0x58, 0xEE, 0x26, 0x0F, 0x74, 0xEB, 0x8E, 0xF7, 0xBB, 0xEC, + 0x16, 0xDB, 0xA6, 0xFA, 0xAB, 0xEB, 0x30, 0x06, 0xFE, 0xFB, 0x0C, 0xE4, + 0xB9, 0xF1, 0x4F, 0xCC, 0xF4, 0xDB, 0x99, 0xE2, 0x29, 0xDB, 0x89, 0xE9, + 0x61, 0x00, 0x04, 0xE2, 0x00, 0x17, 0xE4, 0xEE, 0x59, 0xF9, 0xC0, 0xEC, + 0x10, 0xE4, 0x1B, 0xDF, 0x28, 0xFA, 0x3B, 0xFB, 0xD4, 0x14, 0x27, 0x16, + 0x2A, 0x10, 0x83, 0x03, 0x06, 0xFF, 0xAB, 0xFC, 0x7D, 0x09, 0x28, 0x06, + 0x7E, 0x19, 0x6A, 0xFE, 0x7F, 0x17, 0xF9, 0x0D, 0xCA, 0x13, 0x1D, 0x1C, + 0x1B, 0x01, 0x71, 0x05, 0x87, 0xE9, 0x92, 0xF9, 0x46, 0xEE, 0x38, 0x14, + 0xC6, 0xFA, 0xF5, 0x26, 0x18, 0xFC, 0x8B, 0x0D, 0xB7, 0xFD, 0x73, 0xF8, + 0xD1, 0x0A, 0x77, 0xF7, 0xCF, 0x13, 0xB4, 0x04, 0xDF, 0x20, 0x34, 0x1A, + 0x71, 0x22, 0x22, 0x1B, 0xB5, 0xF5, 0x51, 0xFE, 0x38, 0xE6, 0x8F, 0xEB, + 0x82, 0xFE, 0x5B, 0xF7, 0xE7, 0x04, 0x06, 0xF9, 0xDC, 0x01, 0xF8, 0xF7, + 0xB3, 0xFB, 0x1B, 0xEF, 0x6A, 0xEE, 0xBB, 0xE7, 0xEB, 0xE9, 0x50, 0x04, + 0x81, 0xF4, 0x5D, 0x19, 0x9E, 0x0B, 0xEC, 0x17, 0x45, 0x09, 0xF5, 0xF5, + 0x3C, 0xFA, 0xB7, 0xF6, 0xE3, 0xFC, 0x55, 0x20, 0xE6, 0xF4, 0x77, 0x1E, + 0x67, 0xE7, 0x64, 0xFA, 0xEA, 0xE0, 0xCA, 0xE2, 0x2D, 0xDF, 0x94, 0xE7, + 0x59, 0xED, 0x4E, 0xF9, 0xBA, 0x0D, 0xF4, 0x15, 0xCA, 0x03, 0x77, 0x0C, + 0xC9, 0xDB, 0xDF, 0xE8, 0x23, 0xE3, 0x52, 0xF4, 0xD4, 0x15, 0xB0, 0x1D, + 0x38, 0x2A, 0x9A, 0x12, 0xC1, 0x0B, 0xBF, 0xEB, 0x8E, 0xF9, 0x8C, 0xE8, + 0x21, 0xF9, 0x4A, 0xF7, 0x0D, 0x04, 0xF7, 0x10, 0xAA, 0x1D, 0x89, 0x23, + 0xBF, 0x1D, 0xC4, 0x09, 0x86, 0x0C, 0x41, 0xDB, 0x5E, 0x0F, 0x4B, 0xDA, + 0x35, 0x16, 0x18, 0xF3, 0x01, 0x13, 0x66, 0x05, 0x08, 0x0B, 0x21, 0x15, + 0x11, 0x10, 0x36, 0x03, 0xDA, 0x10, 0x02, 0xEA, 0x9F, 0x03, 0x9D, 0xEF, + 0x85, 0x05, 0xD0, 0x00, 0xA5, 0xFE, 0x63, 0xFD, 0xD0, 0xE0, 0x94, 0xDE, + 0xD4, 0xDD, 0xB6, 0xE3, 0xEB, 0x0D, 0x2B, 0xFD, 0x97, 0x1E, 0xF9, 0x00, + 0x1F, 0xFB, 0x70, 0x00, 0x9E, 0xEC, 0xF4, 0xF5, 0x84, 0xE1, 0x39, 0xDF, + 0x3E, 0xE4, 0x04, 0xCE, 0xAD, 0xFC, 0x14, 0xD9, 0x73, 0xEB, 0x2E, 0xCA, + 0x9F, 0xDE, 0x25, 0xBA, 0x93, 0xED, 0x47, 0xD3, 0x87, 0xDF, 0xF7, 0xCF, + 0x7B, 0xCD, 0x9C, 0xB8, 0x15, 0xDA, 0x2F, 0xC0, 0x52, 0xD5, 0xDF, 0xC2, + 0x3C, 0xD4, 0x1F, 0xCA, 0x51, 0xE7, 0x99, 0xD9, 0x20, 0xDD, 0x3D, 0xC0, + 0xFE, 0xD3, 0xA4, 0xAD, 0x2D, 0xF3, 0x40, 0xDF, 0xF9, 0xFE, 0x5F, 0x0C, + 0xFD, 0xDE, 0x15, 0xE8, 0xC2, 0xD3, 0x5E, 0xBE, 0x88, 0xDE, 0x74, 0xCE, + 0xB8, 0xDF, 0x9D, 0xF3, 0x06, 0xE3, 0x16, 0xFD, 0x25, 0xE8, 0x90, 0xED, + 0xCE, 0xD5, 0x0F, 0xD3, 0x1D, 0xB9, 0xE3, 0xCA, 0x8D, 0xBF, 0x92, 0xE1, + 0x31, 0xD4, 0xE5, 0xDD, 0x5E, 0xD3, 0xFA, 0xBF, 0x36, 0xDE, 0xD6, 0xB8, + 0x66, 0xE3, 0x29, 0xC3, 0x5A, 0xDD, 0x18, 0xBE, 0x17, 0xE2, 0xE8, 0xB7, + 0x3D, 0xE7, 0x34, 0xB7, 0xF2, 0xDF, 0xAF, 0xB0, 0xE2, 0xD4, 0x64, 0xAE, + 0xA0, 0xE3, 0x7F, 0xC4, 0x31, 0xE4, 0xB3, 0xD4, 0x3C, 0xDE, 0x83, 0xD1, + 0x1F, 0xE3, 0x87, 0xCE, 0x4A, 0xDE, 0x82, 0xC7, 0x2E, 0xD9, 0x0E, 0xDA, + 0x71, 0xED, 0x25, 0xF8, 0x10, 0xFA, 0x1C, 0xEE, 0x34, 0xDA, 0x86, 0xCB, + 0x76, 0xE1, 0xE4, 0xDB, 0x09, 0xFD, 0x1A, 0xFA, 0x41, 0xF4, 0x52, 0xF4, + 0x72, 0xE9, 0x93, 0xE8, 0x29, 0xDE, 0x60, 0xDF, 0x21, 0xD2, 0x57, 0xE5, + 0x7B, 0xDF, 0x01, 0x00, 0x4A, 0xDD, 0x5B, 0x09, 0x30, 0xC1, 0xAA, 0xDF, + 0x53, 0xB9, 0x0F, 0xCE, 0xD1, 0xDF, 0x58, 0xF7, 0x0A, 0xFB, 0x80, 0x05, + 0xD4, 0xD8, 0x08, 0x01, 0x44, 0xD9, 0xEB, 0x11, 0x7A, 0x02, 0x43, 0x11, + 0x95, 0x1C, 0x39, 0xF6, 0xCC, 0x33, 0x6A, 0xFD, 0xAE, 0x33, 0x1D, 0x23, + 0x51, 0x0E, 0xC7, 0x13, 0x82, 0xF5, 0x34, 0x07, 0x6D, 0xFE, 0x25, 0x17, + 0xB6, 0x0E, 0xEE, 0x04, 0x20, 0x1C, 0x25, 0xF2, 0xE9, 0x23, 0x31, 0xF6, + 0x1A, 0x0B, 0x79, 0xFE, 0x42, 0xE8, 0x27, 0x03, 0x2A, 0xEE, 0x90, 0x11, + 0xF8, 0x0F, 0xC8, 0x1A, 0x19, 0x1A, 0xDD, 0x1C, 0xF2, 0x09, 0x1B, 0x2B, + 0x63, 0x0A, 0xDF, 0x1A, 0x35, 0x11, 0x5A, 0x0A, 0x25, 0x07, 0x6E, 0x1F, + 0xB4, 0xEE, 0xF1, 0x1B, 0x7A, 0xF7, 0xBC, 0x09, 0xD2, 0x20, 0x8A, 0x00, + 0x81, 0x34, 0x80, 0x09, 0x75, 0x21, 0xA9, 0x04, 0xAF, 0x13, 0x75, 0xF9, + 0x37, 0x20, 0x6B, 0x09, 0x61, 0x20, 0xCF, 0x07, 0xB5, 0x13, 0x8E, 0xFD, + 0xF7, 0x16, 0x65, 0xF8, 0x9B, 0x15, 0x81, 0xF2, 0x43, 0x19, 0x1F, 0x0A, + 0x7F, 0x31, 0xB5, 0x2F, 0x1C, 0x1E, 0xC6, 0x2A, 0xE2, 0xFA, 0xF2, 0x0B, + 0x48, 0x01, 0x1F, 0x17, 0x65, 0x2A, 0x81, 0x49, 0xB0, 0x3D, 0xDB, 0x4C, + 0xC8, 0x30, 0x08, 0x2A, 0xF2, 0x2A, 0xED, 0x28, 0xD6, 0x29, 0x1F, 0x4B, + 0xE2, 0x36, 0x6A, 0x60, 0xC5, 0x3F, 0x5F, 0x5A, 0xF9, 0x1D, 0x62, 0x4F, + 0x88, 0xFD, 0xEB, 0x3A, 0xDF, 0x07, 0x0F, 0x3E, 0x7D, 0x1B, 0x72, 0x54, + 0x4E, 0x29, 0x39, 0x52, 0x51, 0x2F, 0xB0, 0x40, 0x45, 0x33, 0x64, 0x2A, + 0x39, 0x2D, 0xF2, 0x14, 0x8D, 0x29, 0x8A, 0x1F, 0x01, 0x3C, 0xFE, 0x34, + 0xB7, 0x43, 0xFA, 0x26, 0xE4, 0x3F, 0x99, 0x05, 0xB4, 0x41, 0x02, 0x06, + 0xC5, 0x33, 0x15, 0x0F, 0x5B, 0x30, 0x1D, 0x0F, 0x19, 0x47, 0x96, 0x21, + 0xD0, 0x42, 0x8D, 0x28, 0x05, 0x31, 0x0F, 0x26, 0xB1, 0x35, 0x64, 0x26, + 0x6B, 0x49, 0x1A, 0x23, 0x8A, 0x42, 0xE6, 0x08, 0x41, 0x2A, 0x78, 0x14, + 0x78, 0x1A, 0x30, 0x41, 0xCE, 0x15, 0xFC, 0x3E, 0x0E, 0x15, 0x47, 0x34, + 0xD0, 0x0F, 0x5A, 0x23, 0x79, 0x0D, 0x26, 0x0A, 0xE1, 0x22, 0xD6, 0x2F, + 0x0F, 0x34, 0xFD, 0x5E, 0x8F, 0x1B, 0x42, 0x3A, 0x92, 0xFF, 0x8A, 0x18, + 0x4B, 0x17, 0xFD, 0x32, 0x57, 0x3F, 0xD1, 0x37, 0x91, 0x1F, 0x42, 0x16, + 0x15, 0x09, 0x68, 0x0F, 0x75, 0x23, 0xAD, 0x1A, 0x1B, 0x2F, 0x93, 0x1F, + 0xDB, 0x3D, 0x77, 0x32, 0x97, 0x43, 0x28, 0x36, 0x05, 0x2A, 0x6A, 0x19, + 0xA8, 0x15, 0xD8, 0x0C, 0xFF, 0x1E, 0x13, 0x2B, 0xFF, 0x24, 0x26, 0x3C, + 0x1B, 0x22, 0x90, 0x25, 0xD0, 0x1E, 0x7C, 0x0E, 0x94, 0x0C, 0x0B, 0x05, + 0x21, 0x09, 0x93, 0x07, 0xB8, 0x1C, 0xB6, 0x1D, 0xF0, 0x1B, 0x62, 0x29, + 0xAF, 0x01, 0xC9, 0x1E, 0xDA, 0x01, 0x81, 0x25, 0xEE, 0x21, 0x7A, 0x27, + 0x87, 0x28, 0x4B, 0x0E, 0x34, 0x27, 0x5A, 0x0C, 0xE3, 0x12, 0x4F, 0x18, + 0x5F, 0xF8, 0xBB, 0x0F, 0xAB, 0xFB, 0xEF, 0xF7, 0x22, 0x07, 0x52, 0xFB, + 0x36, 0x08, 0x67, 0xFB, 0xCC, 0xFF, 0xB3, 0xD7, 0x88, 0x0E, 0xAA, 0xD8, + 0xF9, 0x09, 0xD7, 0xF5, 0x86, 0xEA, 0xFE, 0xF5, 0xE9, 0xE4, 0x85, 0xE8, + 0x0B, 0xEF, 0x2E, 0xE0, 0x00, 0xF5, 0x8C, 0xE5, 0xB3, 0x09, 0x08, 0x02, + 0x4B, 0x0D, 0x51, 0x0D, 0x3B, 0xF1, 0x08, 0xEE, 0x89, 0xE8, 0x7E, 0xDE, + 0xAC, 0xFE, 0xDE, 0x10, 0xAE, 0x03, 0x43, 0x27, 0xC7, 0xEE, 0xDE, 0x04, + 0xA2, 0xEB, 0x91, 0x01, 0x2C, 0xEC, 0xD5, 0x0D, 0xE9, 0xEB, 0x60, 0x14, + 0xB0, 0xF4, 0x1E, 0x25, 0x08, 0xEB, 0x3C, 0x1F, 0x39, 0xCE, 0xE6, 0x03, + 0xF9, 0xCC, 0x3F, 0x08, 0x35, 0xEC, 0xDB, 0x15, 0x5D, 0xFA, 0xE2, 0x0D, + 0x87, 0xF9, 0x27, 0x04, 0x02, 0xF6, 0xDB, 0xF6, 0x5A, 0xE7, 0xEC, 0xD7, + 0x1E, 0xE6, 0x5F, 0xD0, 0x1C, 0xFF, 0x04, 0xEC, 0x4A, 0x00, 0x01, 0xE2, + 0xB9, 0xE7, 0x27, 0xB9, 0xE5, 0xE6, 0x75, 0xC0, 0x05, 0xF5, 0x4A, 0xD0, + 0xCA, 0xFA, 0xDB, 0xC6, 0xC4, 0xFB, 0x37, 0xD1, 0xFB, 0x01, 0xCA, 0xE3, + 0x22, 0x01, 0x13, 0xEF, 0xE0, 0xF4, 0x0A, 0xEB, 0xFA, 0xFC, 0xCF, 0xE9, + 0xCA, 0xF8, 0xAE, 0xE2, 0xAC, 0xE8, 0xAD, 0xE5, 0x92, 0xF1, 0xD2, 0xFA, + 0x0E, 0xF3, 0x28, 0xF4, 0xB9, 0xD9, 0x41, 0xDE, 0x7A, 0xCD, 0xF5, 0xDD, + 0xAB, 0xD1, 0x65, 0xED, 0xC9, 0xD8, 0xCC, 0xF9, 0xA8, 0xE2, 0x76, 0x0A, + 0x02, 0xCC, 0xCF, 0x08, 0xB8, 0xAE, 0x16, 0xED, 0x71, 0xC7, 0xED, 0xE0, + 0x6B, 0xF5, 0x7B, 0xFA, 0x75, 0xF2, 0x1A, 0x09, 0x88, 0xDF, 0xC3, 0xF9, + 0x1E, 0xED, 0x6F, 0xF6, 0x74, 0xFB, 0x2F, 0xF6, 0xC3, 0x00, 0xEF, 0xF8, + 0x55, 0x05, 0xA7, 0xF9, 0x7E, 0x02, 0x08, 0xF1, 0xA1, 0xFA, 0x21, 0xF5, + 0x80, 0xF9, 0x0D, 0xF8, 0x4C, 0x04, 0xB8, 0x04, 0x6B, 0x17, 0x6D, 0x09, + 0xF0, 0x11, 0x8F, 0xF9, 0x5D, 0xE9, 0xD8, 0xFD, 0xE2, 0xDF, 0x4F, 0x0B, + 0x49, 0xFD, 0xC3, 0x15, 0xAF, 0x14, 0x98, 0x10, 0xED, 0x16, 0xE9, 0x01, + 0xBF, 0x0E, 0x03, 0x01, 0x37, 0x05, 0x7B, 0x0E, 0x45, 0x01, 0xD0, 0x12, + 0x9A, 0x0D, 0x14, 0x02, 0x6B, 0x0E, 0xFB, 0x02, 0xAF, 0x12, 0x5D, 0x1E, + 0x63, 0x1B, 0x4C, 0x19, 0x13, 0x1E, 0xA3, 0x02, 0xAF, 0x12, 0xDB, 0xF8, + 0xAD, 0x02, 0x9A, 0xF8, 0x40, 0xFA, 0xDC, 0x09, 0x3F, 0xF4, 0xE1, 0x0F, + 0x0E, 0x06, 0xC7, 0xF8, 0x2F, 0x13, 0x70, 0xE4, 0xF8, 0x0F, 0xAE, 0xF0, + 0xFB, 0xFD, 0xA0, 0x05, 0x39, 0x0C, 0x9C, 0x13, 0xB1, 0x1C, 0x94, 0x0B, + 0x84, 0xFC, 0xDF, 0xED, 0x06, 0xFA, 0xB5, 0xF6, 0xB5, 0x26, 0x56, 0x2A, + 0x8A, 0x35, 0x48, 0x30, 0x12, 0x16, 0xEC, 0x0E, 0x68, 0x11, 0x00, 0x0D, + 0x2A, 0x19, 0xEC, 0x25, 0xA8, 0x0A, 0x6C, 0x37, 0x3F, 0x0C, 0x2B, 0x40, + 0xA9, 0x02, 0xF3, 0x38, 0x72, 0xE3, 0x56, 0x1D, 0x31, 0xEC, 0x20, 0x15, + 0x19, 0x12, 0x19, 0x15, 0xC1, 0x11, 0xD1, 0x10, 0x79, 0xF9, 0x23, 0x10, + 0x8E, 0xEF, 0x82, 0x0F, 0xF3, 0xE3, 0x14, 0xFE, 0x37, 0xF4, 0xEF, 0xDF, + 0x58, 0x11, 0x54, 0xE8, 0x90, 0x0E, 0xA7, 0xFA, 0xFF, 0x03, 0x00, 0xD9, + 0x5A, 0xFE, 0xF6, 0xC4, 0xD5, 0xF3, 0x5C, 0xDB, 0x86, 0xEF, 0x79, 0xE7, + 0x61, 0xF8, 0x0B, 0xDA, 0x7E, 0xFC, 0x27, 0xC7, 0xBB, 0xFC, 0x03, 0xD3, + 0x3D, 0xFB, 0x8B, 0xDB, 0x6E, 0xEF, 0xD3, 0xDC, 0x5E, 0xDC, 0x98, 0xDA, + 0x29, 0xE1, 0x6B, 0xD8, 0xDC, 0xD9, 0xBD, 0xE4, 0x2B, 0xD2, 0x98, 0xE7, + 0x06, 0xD9, 0x21, 0xDE, 0xC6, 0xBA, 0x2B, 0xD7, 0x03, 0x9F, 0x0A, 0xD5, + 0x58, 0xBA, 0xB5, 0xF0, 0xFD, 0xDB, 0x5F, 0xFC, 0xC5, 0xC5, 0xD1, 0xC9, + 0x0B, 0xA2, 0x0C, 0xC7, 0x53, 0xAD, 0x24, 0xF4, 0xE2, 0xC6, 0x59, 0xF6, + 0xE3, 0xC5, 0x9A, 0xD3, 0x5C, 0xCA, 0x7E, 0xD1, 0x69, 0xDF, 0x07, 0xDA, + 0xC3, 0xED, 0x3E, 0xDC, 0x2A, 0xF3, 0xE3, 0x08, 0x4C, 0xF5, 0xFD, 0x0C, + 0xC2, 0xDA, 0x56, 0xDB, 0xBA, 0xCF, 0x52, 0xD2, 0xF7, 0xED, 0x66, 0xE4, + 0xCC, 0xF4, 0xB8, 0xE3, 0xED, 0xEF, 0x07, 0xE1, 0x83, 0xF3, 0x87, 0xE4, + 0xC0, 0xE3, 0xCE, 0xDA, 0x37, 0xDC, 0xF0, 0xCD, 0x96, 0xFE, 0xDF, 0xD7, + 0xDA, 0x15, 0xA3, 0xEC, 0xBF, 0x0B, 0x2B, 0xE8, 0xD4, 0xFD, 0xF5, 0xDD, + 0x44, 0xF3, 0x9A, 0xF6, 0x4F, 0xE8, 0x33, 0xF9, 0x19, 0xE4, 0x14, 0xE6, + 0xF4, 0xE3, 0xC3, 0xE4, 0x9A, 0xEE, 0x60, 0xEB, 0x2B, 0xF9, 0x95, 0xF6, + 0xB6, 0xF0, 0xFF, 0xFB, 0xC8, 0xDD, 0x61, 0xEC, 0x97, 0xEC, 0xC3, 0xD1, + 0xD3, 0x19, 0x31, 0xD8, 0xC3, 0x16, 0x22, 0xEB, 0x42, 0xFA, 0xFC, 0xE1, + 0x4F, 0xF4, 0xB5, 0xD0, 0x12, 0xED, 0xC4, 0xD3, 0xAF, 0xEA, 0x32, 0xEB, + 0x3E, 0x07, 0xCA, 0x12, 0x07, 0x05, 0x64, 0x0D, 0xD7, 0xEC, 0x4D, 0xD8, + 0xA3, 0x04, 0xB3, 0xCF, 0xF4, 0x1D, 0xE2, 0xFF, 0x28, 0x0E, 0xCA, 0x1C, + 0xB6, 0xF5, 0xFB, 0x04, 0xA0, 0xF0, 0x0C, 0xF2, 0x70, 0xFD, 0xC5, 0xFD, + 0x82, 0x15, 0xF0, 0x19, 0x08, 0x1D, 0x5A, 0x35, 0xFD, 0xFE, 0xB6, 0x2B, + 0x83, 0xE2, 0xA0, 0x0C, 0x02, 0xF4, 0x64, 0x1C, 0xA3, 0x15, 0x12, 0x36, + 0xE1, 0x28, 0x13, 0x32, 0x46, 0x2C, 0x99, 0x20, 0xB7, 0x19, 0x21, 0x00, + 0x89, 0x09, 0x6A, 0xFA, 0xAA, 0x16, 0x94, 0x0F, 0xB9, 0x28, 0x3A, 0x04, + 0xA6, 0x26, 0xD6, 0xEA, 0x93, 0x1A, 0x9C, 0xEB, 0x4F, 0x0A, 0x47, 0xEF, + 0x84, 0x00, 0xF6, 0xF9, 0x45, 0x0F, 0x89, 0x1F, 0xAA, 0x23, 0xB6, 0x30, + 0x9E, 0x2D, 0xCF, 0x15, 0x8D, 0x37, 0xDF, 0x10, 0x92, 0x3C, 0xE3, 0x1D, + 0x82, 0x3A, 0x28, 0x15, 0xF6, 0x0F, 0x9B, 0x00, 0x63, 0xFF, 0xA7, 0xFC, + 0x9E, 0x1F, 0x79, 0x0A, 0x24, 0x21, 0x46, 0x09, 0x8B, 0x11, 0xFE, 0xF7, + 0x88, 0x00, 0x98, 0xF0, 0xDA, 0xF1, 0xB6, 0xE8, 0x1E, 0xF6, 0x84, 0x00, + 0x14, 0x10, 0x64, 0x39, 0x5C, 0x05, 0x4A, 0x2B, 0xA0, 0xDD, 0xAA, 0xF4, + 0xEC, 0xEA, 0x3B, 0xEC, 0xDC, 0x12, 0xD6, 0x00, 0xD4, 0x0D, 0xDF, 0xFE, + 0xA5, 0xFB, 0x4E, 0xF9, 0xD5, 0x03, 0x63, 0x04, 0x48, 0x04, 0x2B, 0xFF, + 0xF2, 0xFA, 0x3B, 0xFF, 0x7A, 0x03, 0x05, 0x12, 0x06, 0x0F, 0x86, 0x16, + 0x14, 0x0B, 0x69, 0x0B, 0xA7, 0x09, 0x28, 0x14, 0x4C, 0x02, 0x80, 0x1B, + 0x77, 0xF3, 0xB5, 0x03, 0x06, 0xEC, 0x13, 0xEA, 0xE9, 0xDF, 0x7A, 0xDF, + 0x30, 0xD0, 0x48, 0xE3, 0xBD, 0xE2, 0xFE, 0x04, 0xDE, 0xF5, 0x4D, 0x08, + 0xD6, 0xF0, 0xF2, 0xDD, 0xC1, 0xF1, 0x7D, 0xD3, 0xE4, 0xEB, 0x6C, 0xE1, + 0xC4, 0xDE, 0x6E, 0xF7, 0x69, 0xDF, 0xC7, 0x10, 0x5E, 0xEC, 0xFF, 0x0B, + 0x4D, 0xFC, 0x1E, 0xFE, 0x35, 0xF3, 0xD5, 0xF0, 0x5A, 0xE7, 0x10, 0xD9, + 0xE7, 0xDC, 0x26, 0xC2, 0xD3, 0xC1, 0x84, 0xBC, 0xE4, 0xCB, 0xD6, 0xD0, + 0x31, 0xD4, 0x03, 0xCC, 0xBB, 0xC8, 0x31, 0xAE, 0x11, 0xDB, 0x1F, 0xA5, + 0xE6, 0xF0, 0x9B, 0xB0, 0x09, 0xE7, 0xA4, 0xC1, 0xC8, 0xE9, 0x0A, 0xEA, + 0xF0, 0xEB, 0x72, 0xFE, 0x47, 0xB8, 0x77, 0xC9, 0x36, 0xAC, 0x50, 0xB4, + 0xBE, 0xF4, 0xDF, 0xEA, 0x3F, 0x16, 0xDB, 0x0B, 0xF1, 0xE9, 0xF8, 0xEF, + 0xDE, 0xCE, 0x66, 0xD3, 0xA7, 0xD4, 0x97, 0xCD, 0x82, 0xE8, 0x5E, 0xE5, + 0x12, 0xFD, 0x47, 0x12, 0xD9, 0xE8, 0x56, 0x20, 0x91, 0xD5, 0x6F, 0xFB, + 0xA4, 0xEC, 0x69, 0xE4, 0xE3, 0xFB, 0x84, 0x05, 0x94, 0xFA, 0xD4, 0x0F, + 0xEF, 0xEB, 0x0C, 0xF8, 0x4D, 0xDA, 0x4D, 0xF4, 0xD1, 0xDE, 0xAA, 0xE9, + 0x9B, 0xF1, 0xE3, 0xD0, 0xA7, 0xF6, 0x55, 0xE3, 0x65, 0xEA, 0x51, 0xEB, + 0xF9, 0xE5, 0xCA, 0xCD, 0xDB, 0xD7, 0xB3, 0xE1, 0x54, 0xD4, 0xDE, 0xFE, + 0x6A, 0xF9, 0xAF, 0x04, 0x9B, 0x0D, 0x37, 0x18, 0x91, 0xFC, 0x72, 0x09, + 0xAF, 0xF7, 0x01, 0xF6, 0x17, 0xFE, 0x35, 0x0E, 0x48, 0x19, 0xAE, 0x18, + 0x85, 0x16, 0x93, 0xE7, 0x3C, 0xF8, 0x2C, 0xC6, 0x05, 0xF8, 0x3D, 0xE6, + 0xEA, 0xED, 0x48, 0xF7, 0xCA, 0xE2, 0x6D, 0xE6, 0xF3, 0xE6, 0xEA, 0xDB, + 0x7C, 0xEC, 0xD0, 0xDF, 0x5A, 0xF4, 0xE7, 0xFC, 0x4F, 0x14, 0x09, 0x22, + 0x98, 0x16, 0xBD, 0x10, 0xD3, 0xE1, 0x2F, 0xF2, 0x4A, 0xDD, 0xE4, 0x03, + 0x1A, 0x17, 0x3E, 0x1C, 0x2E, 0x27, 0x7F, 0x0C, 0xE7, 0x16, 0x4C, 0xF9, + 0x14, 0x12, 0x99, 0xF5, 0xF5, 0x04, 0xAD, 0xFC, 0x86, 0x08, 0x70, 0x22, + 0x61, 0x23, 0x7F, 0x37, 0xA0, 0x30, 0x14, 0x29, 0xE4, 0x24, 0xAA, 0x13, + 0x1D, 0x2E, 0x0F, 0x17, 0x72, 0x2D, 0xE2, 0x2D, 0x9F, 0x1F, 0x8A, 0x3D, + 0xC7, 0x28, 0x69, 0x38, 0xBF, 0x2B, 0x10, 0x1E, 0x9F, 0x24, 0x2C, 0x18, + 0xCA, 0x22, 0x13, 0x25, 0x2B, 0x2C, 0x46, 0x25, 0xEE, 0x27, 0xA4, 0x22, + 0x8A, 0x1C, 0x6E, 0x22, 0xF1, 0x1A, 0x9F, 0x33, 0xD8, 0x11, 0x2E, 0x34, + 0xAE, 0x1A, 0x27, 0x26, 0x87, 0x2A, 0xA6, 0x24, 0x3D, 0x24, 0xF1, 0x22, + 0x6F, 0x1B, 0x14, 0x30, 0xEF, 0x11, 0x62, 0x34, 0x93, 0x0D, 0xDA, 0x1C, + 0xCC, 0x16, 0x5B, 0xFD, 0x31, 0x32, 0x08, 0xFF, 0x0C, 0x2B, 0x8A, 0x00, + 0x63, 0x03, 0xFE, 0xFE, 0x7C, 0xF6, 0x94, 0x07, 0xED, 0xFD, 0x89, 0xFB, + 0x7F, 0x05, 0x23, 0xF0, 0x37, 0x1E, 0x4B, 0x21, 0xE5, 0x2F, 0xF8, 0x4C, + 0xE3, 0x10, 0xA2, 0x18, 0x58, 0x03, 0xCD, 0xFF, 0xFF, 0x2C, 0x3C, 0x1F, + 0xEB, 0x44, 0x11, 0x2A, 0xE5, 0x1C, 0x80, 0x25, 0xA1, 0xFA, 0x3D, 0x1D, + 0x76, 0xFE, 0x3A, 0x03, 0x1B, 0x0C, 0xF5, 0x0C, 0xCD, 0x28, 0x8B, 0x45, + 0x78, 0x3C, 0x7C, 0x4C, 0xFF, 0x1F, 0x4B, 0x27, 0x76, 0x06, 0x81, 0x14, + 0x0F, 0x18, 0xB1, 0x22, 0x18, 0x24, 0xE9, 0x2C, 0x84, 0x26, 0x78, 0x31, + 0x1E, 0x23, 0xCF, 0x2A, 0x01, 0x0F, 0x94, 0x09, 0xEA, 0x06, 0xE6, 0xF5, + 0x35, 0x17, 0xBC, 0x07, 0x1F, 0x1F, 0xEC, 0x1E, 0xD4, 0x0B, 0x0A, 0x13, + 0x2F, 0x04, 0x90, 0x07, 0x0E, 0x19, 0x87, 0x11, 0xF6, 0x25, 0x22, 0x1B, + 0x8C, 0x2A, 0xD4, 0x2E, 0x82, 0x20, 0xD5, 0x42, 0xD5, 0x17, 0xED, 0x35, + 0x33, 0x20, 0x89, 0x1E, 0x41, 0x29, 0x11, 0x24, 0x15, 0x1E, 0x95, 0x1B, + 0xA9, 0x10, 0x36, 0x16, 0x81, 0x09, 0x86, 0x1F, 0x82, 0xF5, 0x86, 0x14, + 0x0F, 0x03, 0x8F, 0x0D, 0xE5, 0x1E, 0x69, 0x15, 0xC8, 0x10, 0x77, 0x18, + 0xCE, 0xF7, 0x5D, 0x18, 0xC9, 0xF7, 0x21, 0x31, 0xD9, 0xF5, 0x5F, 0x26, + 0x38, 0xFB, 0x83, 0x0B, 0xB9, 0x21, 0x32, 0x24, 0x7C, 0x44, 0x00, 0x2B, + 0xE6, 0x3A, 0x6A, 0x0D, 0x5D, 0x1F, 0x99, 0xFE, 0x2B, 0x17, 0x6A, 0x0C, + 0xC1, 0x21, 0x40, 0x1D, 0x22, 0x3B, 0x72, 0x2D, 0x11, 0x42, 0x1A, 0x38, + 0x50, 0x2D, 0xBD, 0x22, 0xF9, 0x1E, 0xC4, 0x0F, 0xCD, 0x24, 0x8D, 0x1F, + 0x23, 0x22, 0x5A, 0x30, 0x32, 0x19, 0x6F, 0x3A, 0x03, 0x20, 0x11, 0x37, + 0xA3, 0x24, 0x27, 0x1A, 0x4E, 0x21, 0x48, 0x1A, 0x76, 0x2A, 0xBA, 0x45, + 0x6B, 0x23, 0xDE, 0x50, 0xF5, 0x0B, 0x49, 0x2D, 0xF3, 0x10, 0x42, 0x19, + 0x74, 0x17, 0x3F, 0x21, 0x60, 0x04, 0xB5, 0x28, 0x37, 0xFC, 0x57, 0x2C, + 0x74, 0x0C, 0x9A, 0x1B, 0xBB, 0x07, 0x8A, 0x05, 0x1E, 0x0B, 0x40, 0x0E, + 0x1E, 0x23, 0x43, 0x15, 0x6C, 0x1A, 0x51, 0xF8, 0x49, 0x02, 0xD6, 0xCE, + 0x86, 0x03, 0xD9, 0xD2, 0xCD, 0x01, 0x6A, 0xF3, 0x60, 0xF7, 0xC1, 0x08, + 0x71, 0x0C, 0xC5, 0xFF, 0x5E, 0x07, 0x34, 0xED, 0x0B, 0xE2, 0x6D, 0xDF, + 0xC0, 0xFE, 0x3E, 0xFA, 0xAD, 0x0E, 0x68, 0x1E, 0x90, 0xE3, 0x94, 0xEC, + 0x9E, 0xE8, 0x55, 0xC5, 0xF8, 0x08, 0x90, 0xEA, 0x68, 0x14, 0xCB, 0x15, + 0x13, 0x0E, 0x32, 0x02, 0x03, 0xF8, 0xF1, 0xF9, 0xA6, 0xDC, 0x35, 0x0C, + 0xB5, 0xE4, 0x84, 0x10, 0xD4, 0x08, 0x4E, 0x2B, 0xD6, 0x0E, 0xF7, 0x1E, + 0xD8, 0xFA, 0xA4, 0xFE, 0xE5, 0xE8, 0x6A, 0x02, 0xE1, 0xE1, 0xCA, 0x04, + 0xD5, 0xE6, 0x68, 0xF7, 0x06, 0xF9, 0x2B, 0xF1, 0x82, 0x0D, 0x69, 0xF6, + 0xF7, 0x00, 0xA2, 0xE7, 0xF0, 0xE9, 0x91, 0xCD, 0x77, 0xE7, 0x9A, 0xC2, + 0xC6, 0xE4, 0x41, 0xC6, 0x49, 0xE3, 0x6D, 0xDC, 0x05, 0xDA, 0x63, 0xEB, + 0xFB, 0xD4, 0x27, 0xE2, 0x4E, 0xE1, 0x49, 0xD9, 0x19, 0xF8, 0x07, 0xE0, + 0xBA, 0xFD, 0x97, 0xD8, 0xDB, 0xEF, 0x1F, 0xCE, 0xE5, 0xEE, 0xD6, 0xDF, + 0x69, 0xED, 0xF1, 0xDF, 0x4B, 0xE1, 0xF2, 0xC3, 0x83, 0xD9, 0x1A, 0xCF, + 0x75, 0xCE, 0x84, 0xF1, 0xB9, 0xB2, 0xF7, 0xEA, 0x6C, 0xA5, 0xFC, 0xDD, + 0x7F, 0xAF, 0x7A, 0xDD, 0xA8, 0xB4, 0x93, 0xD4, 0x29, 0xD0, 0x3C, 0xE9, + 0x18, 0xEE, 0x8D, 0x12, 0xE2, 0xC8, 0x1B, 0xF3, 0xC9, 0xB2, 0xD9, 0xB7, + 0xB8, 0xDE, 0x13, 0xCE, 0x37, 0x0A, 0xE9, 0xF9, 0x35, 0x05, 0x82, 0xEF, + 0xDC, 0xEC, 0x2F, 0xD3, 0x0F, 0xEA, 0xDA, 0xBC, 0xF9, 0xED, 0x4B, 0xC0, + 0xEC, 0x07, 0xED, 0xF0, 0x3E, 0x17, 0x9F, 0x1C, 0xF1, 0xF8, 0x9E, 0xF9, + 0xFB, 0xE6, 0x19, 0xCA, 0x4C, 0xF4, 0x88, 0xE5, 0xDE, 0xF1, 0xD7, 0xFE, + 0xE9, 0xF3, 0x5E, 0x02, 0xB2, 0x05, 0x64, 0x01, 0x2A, 0xFD, 0xF1, 0xED, + 0x14, 0xF3, 0xC8, 0xDF, 0x2D, 0x02, 0x83, 0xF6, 0x96, 0x09, 0x56, 0x0E, + 0x8D, 0xFA, 0x4A, 0x01, 0xA2, 0xEB, 0x96, 0xFB, 0xD4, 0xE0, 0x25, 0xFE, + 0x1D, 0xE2, 0x44, 0xF1, 0x2C, 0xFD, 0x51, 0xF0, 0x14, 0x00, 0xB4, 0x00, + 0x93, 0xE5, 0x22, 0x02, 0xF9, 0xDC, 0xBB, 0xEE, 0x90, 0xE9, 0xFF, 0xE1, + 0xF2, 0xFD, 0x46, 0xE8, 0x5F, 0xED, 0xC3, 0xDB, 0xAD, 0xE1, 0x7C, 0xCD, + 0x34, 0xEA, 0xEB, 0xCD, 0x23, 0xDA, 0x06, 0xCB, 0xD7, 0xDC, 0x7E, 0xCF, + 0x29, 0xD7, 0x32, 0xD9, 0xAF, 0xBC, 0x4F, 0xCC, 0x35, 0xD8, 0x17, 0xCF, + 0x8E, 0x01, 0xDD, 0xEF, 0xD5, 0xF3, 0xB5, 0xE4, 0x7E, 0xDE, 0x71, 0xCC, + 0x6F, 0xF9, 0xBE, 0xD9, 0xFB, 0x06, 0xC4, 0xE9, 0x64, 0xDE, 0x6F, 0xD6, + 0x91, 0xD0, 0x0C, 0xD0, 0xB1, 0xD7, 0xC2, 0xEA, 0xD8, 0xCB, 0xBF, 0x06, + 0xAC, 0xDE, 0x40, 0x0E, 0xA4, 0xF9, 0x6D, 0xF4, 0x82, 0xE7, 0xEB, 0xE4, + 0x98, 0xD8, 0xB7, 0xF8, 0x1C, 0xE0, 0x61, 0x1D, 0x79, 0xE6, 0xF1, 0x10, + 0x16, 0xF8, 0xD0, 0xD6, 0x0D, 0x02, 0x69, 0xC2, 0x0A, 0xEB, 0x82, 0xC7, + 0x31, 0xDB, 0xF0, 0xC0, 0x7F, 0xDC, 0xF8, 0xC8, 0x59, 0xD5, 0xE4, 0xCB, + 0x7E, 0xDF, 0x75, 0xBA, 0xFE, 0xF2, 0x8B, 0xC9, 0x1E, 0xF7, 0x16, 0xE5, + 0x5B, 0xF7, 0xDD, 0xE3, 0x87, 0xF5, 0x3C, 0xDF, 0x48, 0xF5, 0x43, 0xEB, + 0x9F, 0x00, 0xA2, 0xFC, 0x5E, 0x03, 0xAE, 0xF8, 0xEA, 0xFD, 0xBA, 0xEB, + 0x45, 0xE9, 0x7B, 0xDD, 0x6C, 0xDD, 0x85, 0xDA, 0x7E, 0xF5, 0xE7, 0xF5, + 0xD3, 0x00, 0x15, 0x0E, 0x58, 0xF6, 0x54, 0x04, 0x94, 0xF1, 0xDD, 0xF9, + 0x28, 0xE6, 0x04, 0x03, 0x65, 0xE1, 0xA2, 0x09, 0xD9, 0x00, 0x52, 0x21, + 0x79, 0xFC, 0xCF, 0x2E, 0xF2, 0xD5, 0xD4, 0x09, 0xC2, 0xEB, 0x0B, 0xEA, + 0xF7, 0x2F, 0xCA, 0xFB, 0x9F, 0x2D, 0x54, 0x0A, 0x14, 0xED, 0x19, 0x03, + 0xA5, 0xD8, 0x54, 0x04, 0xFE, 0xE7, 0x42, 0xFB, 0xDF, 0x12, 0xDB, 0x02, + 0x46, 0x4E, 0x88, 0x34, 0xF9, 0x52, 0x5C, 0x42, 0xE6, 0x22, 0x38, 0x0C, + 0xD2, 0x0A, 0x3D, 0xF0, 0x0F, 0x21, 0x88, 0x15, 0xB4, 0x37, 0x0D, 0x23, + 0x92, 0x32, 0xF0, 0x1D, 0xB5, 0x29, 0x8B, 0x2A, 0xEB, 0x1D, 0x6E, 0x0E, + 0xD2, 0x12, 0xCA, 0xF8, 0x2E, 0x12, 0x3E, 0x12, 0xDF, 0x0E, 0x9B, 0x23, + 0xF4, 0x00, 0xE1, 0x13, 0xDB, 0xFC, 0xF5, 0x0F, 0x98, 0x06, 0x6F, 0x27, + 0x5A, 0x0F, 0xAE, 0x2E, 0xE9, 0x17, 0x00, 0x2C, 0xCE, 0x19, 0x8E, 0x32, + 0x24, 0x0C, 0xD0, 0x1F, 0x97, 0xFB, 0xCF, 0x0E, 0xB5, 0x07, 0x0E, 0x22, + 0xD8, 0x0D, 0x46, 0x1B, 0x99, 0x06, 0x93, 0x02, 0x78, 0x0D, 0x2C, 0xF1, + 0x21, 0x15, 0x8A, 0xF4, 0xE1, 0x0C, 0x4F, 0xFE, 0x51, 0x07, 0x24, 0x04, + 0x06, 0x0C, 0x1E, 0x10, 0xDC, 0x1A, 0xFB, 0x16, 0xDE, 0x27, 0x90, 0x0D, + 0x99, 0x11, 0xD4, 0xF7, 0x1E, 0x00, 0x0B, 0x00, 0xD4, 0x23, 0x2F, 0x1F, + 0x40, 0x39, 0xCE, 0x2A, 0x9F, 0x10, 0x3C, 0x1B, 0xF4, 0x01, 0xFD, 0x1F, + 0x50, 0x1B, 0x5F, 0x2A, 0xC4, 0x29, 0x70, 0x2E, 0xA4, 0x34, 0x92, 0x49, + 0xD1, 0x33, 0x36, 0x4C, 0x30, 0x13, 0x89, 0x33, 0xE7, 0x07, 0x07, 0x29, + 0x1A, 0x23, 0x76, 0x34, 0xDA, 0x1E, 0xCC, 0x2C, 0xA9, 0x09, 0xB7, 0x17, + 0x73, 0x09, 0xE3, 0x0D, 0xB5, 0x02, 0xA0, 0xF9, 0x3A, 0xF6, 0x21, 0xED, + 0x55, 0x06, 0xFF, 0xEB, 0x01, 0x11, 0x3A, 0xED, 0xCC, 0xF9, 0x17, 0xDD, + 0x25, 0xFA, 0x55, 0xD6, 0xF2, 0x11, 0xF2, 0xFF, 0xA0, 0x0F, 0x1A, 0x1F, + 0x8E, 0x10, 0x27, 0xFE, 0x42, 0x22, 0x6A, 0xD4, 0x2B, 0x28, 0xB6, 0xD8, + 0x91, 0x10, 0x2E, 0xDF, 0xE3, 0xF7, 0x04, 0xF2, 0x76, 0xEB, 0x75, 0xF1, + 0x87, 0xD4, 0xA0, 0xC7, 0x36, 0xCF, 0xCF, 0xCA, 0xE8, 0xD2, 0x98, 0xE6, + 0x70, 0xD2, 0x09, 0xE7, 0x0B, 0xC8, 0x75, 0xE3, 0xFE, 0xBF, 0x78, 0xED, + 0x5F, 0xD7, 0xF1, 0xF7, 0xA3, 0xFB, 0x75, 0x03, 0x6B, 0xFF, 0xAD, 0x03, + 0x10, 0xD8, 0x1E, 0xE8, 0x3D, 0xB8, 0x04, 0xCC, 0x2F, 0xD5, 0xAD, 0xE4, + 0x7E, 0xF4, 0xE7, 0xFB, 0x6F, 0xE2, 0xEA, 0xE3, 0xEF, 0xD6, 0x20, 0xD1, + 0xE2, 0xE3, 0x43, 0xD2, 0xDD, 0xF2, 0x2F, 0xE1, 0x66, 0x02, 0xCA, 0xFD, + 0x84, 0x02, 0xAF, 0x18, 0xA3, 0xE6, 0xA7, 0x0D, 0x97, 0xE8, 0xCD, 0xE3, + 0x3F, 0x04, 0xE4, 0xC9, 0x15, 0x0F, 0x8F, 0xD2, 0xAC, 0x08, 0x0C, 0xE1, + 0xF9, 0xF3, 0xFF, 0xD9, 0xB5, 0xD9, 0xE5, 0xD2, 0x9D, 0xDF, 0x8B, 0xDC, + 0x96, 0x04, 0x9E, 0xE3, 0xFD, 0x03, 0x2D, 0xEB, 0xC3, 0xE9, 0xC4, 0xF4, + 0x5A, 0xE0, 0x79, 0xEC, 0x31, 0xDA, 0xA5, 0xEA, 0x7D, 0xD9, 0x4A, 0x08, + 0x59, 0xED, 0xD2, 0x03, 0x0D, 0xF4, 0xA9, 0xE1, 0x0B, 0xEC, 0x58, 0xDD, + 0xF3, 0xE3, 0x69, 0xEB, 0xF2, 0xDC, 0x88, 0xFD, 0x79, 0xCF, 0xF3, 0xE1, + 0x7B, 0xE4, 0x33, 0xC9, 0x59, 0x09, 0x8F, 0xDA, 0x0A, 0xEF, 0x9C, 0xDD, + 0x46, 0xCF, 0x02, 0xDE, 0xE8, 0xCE, 0x8B, 0xF0, 0xCB, 0xDD, 0xDE, 0xE7, + 0xCA, 0xFF, 0x4F, 0xDF, 0x9F, 0x17, 0xCE, 0xFB, 0xD4, 0xFF, 0x80, 0xF5, + 0x1C, 0xDC, 0x28, 0xCC, 0x29, 0xE4, 0x57, 0xE1, 0x10, 0xFB, 0x7E, 0x2C, + 0xDD, 0xE7, 0x4C, 0x28, 0x58, 0xCB, 0xF6, 0xF2, 0xC6, 0xDA, 0x5B, 0xF5, + 0xCF, 0xF4, 0x7E, 0x1B, 0x78, 0x06, 0x8C, 0x30, 0x6B, 0x11, 0x69, 0x2F, + 0x55, 0x0A, 0x1C, 0x20, 0x7D, 0xFC, 0xE2, 0x01, 0x5B, 0xFF, 0xA5, 0x01, + 0xF7, 0x17, 0xAF, 0x1E, 0x5C, 0x21, 0x27, 0x25, 0xBC, 0x0C, 0x30, 0x0E, + 0x07, 0xFA, 0x2F, 0xF5, 0x38, 0xFD, 0x85, 0xE9, 0xFF, 0x0D, 0x14, 0xF6, + 0xA6, 0x17, 0x2D, 0x0A, 0xB5, 0x10, 0x22, 0x0A, 0xA1, 0x05, 0x7E, 0xF8, + 0xAA, 0x0E, 0x40, 0xE8, 0xEC, 0x20, 0x1D, 0x00, 0x7C, 0x28, 0x4D, 0x21, + 0x87, 0x1D, 0x55, 0x0C, 0x17, 0x19, 0x15, 0xFB, 0x57, 0x18, 0xCC, 0x17, + 0xEB, 0x10, 0x74, 0x23, 0x7A, 0x1E, 0x6C, 0x07, 0x46, 0x21, 0xC7, 0xF7, + 0x18, 0x1C, 0x08, 0x0A, 0x10, 0x17, 0xDD, 0x14, 0x9C, 0x0C, 0x8F, 0x18, + 0xB0, 0x08, 0x6C, 0x25, 0x66, 0xF6, 0xC5, 0x19, 0x4A, 0xE3, 0x7A, 0x14, + 0xC8, 0x02, 0x94, 0x3E, 0x8D, 0x26, 0xE9, 0x49, 0x10, 0x14, 0x1F, 0x19, + 0xAA, 0x06, 0x09, 0x10, 0x82, 0x1C, 0x3A, 0x43, 0x6A, 0x1C, 0x7E, 0x40, + 0x6F, 0xFE, 0x48, 0x20, 0xCD, 0xFE, 0xA0, 0x22, 0x16, 0x19, 0x29, 0x2A, + 0x4E, 0x24, 0xFA, 0x41, 0xA4, 0x38, 0xB7, 0x52, 0x44, 0x3E, 0x66, 0x37, + 0xCB, 0x21, 0x50, 0x17, 0x47, 0x19, 0xE5, 0x1F, 0x22, 0x1F, 0xAB, 0x3C, + 0x23, 0x26, 0x82, 0x2F, 0x45, 0x36, 0x41, 0x22, 0xA9, 0x38, 0xDD, 0x39, + 0x05, 0x2C, 0x3D, 0x37, 0x92, 0x1E, 0x8A, 0x24, 0x80, 0x1D, 0x05, 0x1F, + 0xE9, 0x24, 0x99, 0x2B, 0x28, 0x17, 0xEC, 0x2A, 0x00, 0x1E, 0x37, 0x26, + 0x2A, 0x22, 0xBF, 0x29, 0x1B, 0x17, 0x08, 0x27, 0x5B, 0x2A, 0xBA, 0x24, + 0xE7, 0x2F, 0xCC, 0x1D, 0xCE, 0x30, 0x7E, 0x1E, 0x12, 0x35, 0xAF, 0x17, + 0x59, 0x2B, 0xB9, 0x15, 0xA5, 0x0F, 0x0B, 0x13, 0x48, 0x0A, 0xD1, 0x01, + 0x03, 0x27, 0x21, 0xF9, 0x58, 0x2E, 0x81, 0x0D, 0x0D, 0x12, 0x1D, 0x19, + 0x0C, 0xF9, 0x27, 0xFF, 0xDB, 0xFF, 0x12, 0xF2, 0xB5, 0x20, 0xFD, 0x16, + 0xD6, 0x40, 0xF1, 0x30, 0x07, 0x27, 0x61, 0x18, 0x0A, 0xF9, 0x50, 0x0D, + 0x3A, 0x0E, 0x4E, 0x21, 0x21, 0x39, 0x8F, 0x3D, 0x97, 0x30, 0x42, 0x47, + 0xAF, 0x17, 0xEC, 0x30, 0x00, 0x17, 0x47, 0x11, 0xDF, 0x29, 0x8E, 0x1B, + 0xA7, 0x2C, 0x30, 0x52, 0xE4, 0x0F, 0x6D, 0x5A, 0x14, 0xF9, 0xB1, 0x27, + 0xB2, 0xF7, 0xDD, 0x13, 0x6C, 0x0C, 0x72, 0x24, 0x50, 0x25, 0xDA, 0x29, + 0x61, 0x2F, 0x31, 0x2C, 0x4D, 0x1A, 0x61, 0x25, 0xF2, 0xF1, 0x02, 0x01, + 0x63, 0xF5, 0x9A, 0xEF, 0x98, 0x0C, 0x37, 0x12, 0xA4, 0x12, 0xC1, 0x23, + 0x1B, 0x15, 0x57, 0x0F, 0xBE, 0x0C, 0x8A, 0xFC, 0xCA, 0x0E, 0xE3, 0xF0, + 0x50, 0x18, 0x54, 0xF3, 0x19, 0x25, 0x99, 0x01, 0xA2, 0x25, 0xBE, 0x06, + 0x3A, 0x14, 0xAD, 0xFC, 0x1A, 0x10, 0xB9, 0xE8, 0xAC, 0x0F, 0x7E, 0xF3, + 0xCF, 0x04, 0x83, 0x0B, 0x66, 0xEE, 0xBA, 0xFD, 0xB9, 0xDE, 0xA1, 0xF4, + 0x0E, 0xEC, 0x36, 0xFA, 0xEC, 0xFB, 0x84, 0x00, 0x01, 0xFC, 0x3A, 0x06, + 0xC1, 0xEC, 0x09, 0xF9, 0x40, 0xDC, 0xBD, 0xEC, 0x9C, 0x07, 0xAF, 0x02, + 0x10, 0x14, 0xCD, 0x1C, 0x82, 0xE5, 0xA3, 0x07, 0xDD, 0xE2, 0x84, 0xEF, + 0xBC, 0xF1, 0xDB, 0xFA, 0x18, 0xEF, 0xBB, 0x02, 0x8B, 0xEC, 0x18, 0x00, + 0xE3, 0x04, 0x74, 0xFF, 0x47, 0x1A, 0x12, 0xF7, 0xF7, 0x1E, 0xE0, 0xED, + 0x0E, 0x18, 0x4B, 0x08, 0x9A, 0xF4, 0x5D, 0x13, 0x9A, 0xD9, 0x2A, 0xEA, + 0xDB, 0xE2, 0xF6, 0xD7, 0xA3, 0xF3, 0xF5, 0xED, 0xF5, 0x03, 0x90, 0x0B, + 0x86, 0x08, 0xF6, 0x0E, 0x10, 0xF6, 0xB6, 0xF5, 0x4B, 0xE6, 0x5B, 0xE3, + 0x33, 0xF2, 0x04, 0xF9, 0x68, 0x05, 0x2A, 0x14, 0x78, 0xFB, 0x50, 0xEA, + 0xBB, 0xEF, 0x2E, 0xC0, 0x56, 0xE0, 0xB7, 0xD8, 0xCC, 0xD0, 0x88, 0xEA, + 0xC7, 0xD2, 0x32, 0xE3, 0x47, 0xCB, 0xE4, 0xC9, 0x74, 0xCD, 0x6D, 0xB2, + 0x82, 0xDB, 0x12, 0xC3, 0xD7, 0xD6, 0x1A, 0xD8, 0xE1, 0xDE, 0x3B, 0xD2, + 0x52, 0xE4, 0x19, 0xB6, 0x84, 0xD6, 0x87, 0xAA, 0x9C, 0xDB, 0x17, 0xBB, + 0xB6, 0xE9, 0xDE, 0xC8, 0xB3, 0xD4, 0x91, 0xC7, 0xB1, 0xA9, 0x30, 0xC8, + 0xA1, 0xB0, 0xD8, 0xC1, 0x3B, 0xD8, 0x5F, 0xC5, 0xEB, 0xE8, 0x90, 0xDD, + 0xAA, 0xD1, 0x70, 0xDB, 0x14, 0xB0, 0x2B, 0xC6, 0x96, 0xBA, 0xED, 0xCC, + 0x49, 0xDB, 0x57, 0xEE, 0xCB, 0xE4, 0xC5, 0xF2, 0xA5, 0xE2, 0x77, 0xE9, + 0xA4, 0xDB, 0x8F, 0xE8, 0x64, 0xDA, 0x98, 0xF0, 0x89, 0xE9, 0x74, 0x06, + 0xD7, 0xF1, 0x64, 0x0E, 0x53, 0xE3, 0xE8, 0xF2, 0x68, 0xC9, 0x3F, 0xDC, + 0x34, 0xC9, 0x16, 0xD9, 0xD0, 0xCD, 0x7D, 0xDB, 0x09, 0xD4, 0x04, 0xF8, + 0x4E, 0xF3, 0x3F, 0xF8, 0x72, 0xFF, 0xF3, 0xD7, 0xFB, 0xF0, 0x41, 0xC3, + 0xDF, 0xFC, 0x97, 0xD4, 0x13, 0xFC, 0xBE, 0xEB, 0xFE, 0xE1, 0x22, 0xE2, + 0xD1, 0xF7, 0x11, 0xE5, 0x3C, 0x1E, 0x74, 0xF2, 0x3B, 0x23, 0x35, 0xEF, + 0x76, 0x11, 0xB1, 0xED, 0x59, 0x02, 0x6F, 0xEC, 0x01, 0x00, 0xA4, 0xE1, + 0x03, 0xFE, 0x2E, 0xEF, 0xF4, 0x01, 0xEE, 0x09, 0x6C, 0x15, 0xDF, 0xF4, + 0x60, 0x1F, 0x48, 0xDD, 0xF3, 0x0A, 0x1C, 0xFD, 0x93, 0x06, 0x16, 0x1D, + 0x92, 0xF8, 0x0B, 0x1F, 0xE4, 0xDF, 0x34, 0x1A, 0x65, 0xE9, 0x0A, 0x11, + 0x44, 0x04, 0x89, 0x10, 0xA7, 0x1E, 0x88, 0x24, 0xD2, 0x0F, 0x70, 0x1D, + 0x95, 0xFA, 0x33, 0xF4, 0x41, 0x05, 0x69, 0xEC, 0x3C, 0x1E, 0xDA, 0x0B, + 0x08, 0x21, 0x21, 0x13, 0x8C, 0x09, 0xA0, 0x04, 0x6B, 0xFF, 0xB4, 0xFB, + 0xC7, 0x11, 0x94, 0x0B, 0x2D, 0x32, 0xDD, 0x2E, 0x6A, 0x47, 0x8C, 0x37, + 0xF6, 0x33, 0xC0, 0x25, 0x0C, 0x11, 0x78, 0x18, 0x54, 0xF7, 0x80, 0x0C, + 0x97, 0xFC, 0x97, 0x03, 0x46, 0x14, 0xA8, 0x22, 0xDE, 0x0E, 0xF9, 0x36, + 0x1E, 0x12, 0x45, 0x0B, 0xA7, 0x07, 0x71, 0xF0, 0x70, 0x08, 0x67, 0x07, + 0x76, 0x0F, 0x6D, 0x18, 0x6B, 0xEC, 0x8A, 0x13, 0x58, 0xEE, 0x52, 0x0B, + 0xB2, 0x00, 0xA1, 0x07, 0x23, 0xFB, 0xAC, 0x03, 0x67, 0xF9, 0x19, 0x09, + 0x50, 0xEF, 0xCF, 0x04, 0xEA, 0xEB, 0x92, 0xE9, 0x15, 0xEE, 0x6A, 0xD1, + 0x98, 0xF2, 0xA9, 0xE0, 0xBF, 0x0D, 0x74, 0xF6, 0x0C, 0x10, 0x16, 0xE4, + 0xB7, 0xFB, 0xA0, 0xD3, 0x94, 0xEF, 0x0C, 0xDA, 0xD9, 0xE8, 0x5C, 0xD9, + 0xC2, 0xEC, 0x54, 0xDD, 0x47, 0xF8, 0xE3, 0xF5, 0x90, 0xF3, 0xD6, 0xE2, + 0xB3, 0xE7, 0x44, 0xD3, 0xD9, 0xEF, 0x94, 0xF3, 0x65, 0xE5, 0x6B, 0xEF, + 0x87, 0xC3, 0xA0, 0xCF, 0x15, 0xD9, 0xA7, 0xE7, 0x09, 0x12, 0xF4, 0x18, + 0xC7, 0x07, 0x66, 0x05, 0xC5, 0xED, 0x49, 0xF2, 0x83, 0x00, 0xD6, 0x15, + 0xFB, 0x07, 0xC6, 0x2C, 0x36, 0x07, 0x31, 0x34, 0xE5, 0x07, 0x56, 0x3E, + 0x3E, 0xF8, 0x7D, 0x27, 0x95, 0xEB, 0xA7, 0x15, 0xC3, 0xE7, 0x41, 0x1E, + 0x2E, 0xF4, 0x51, 0x08, 0x04, 0xFB, 0x9D, 0xE7, 0xE0, 0xE8, 0x50, 0xE3, + 0x6E, 0xEA, 0xCA, 0xE6, 0xBF, 0x03, 0x89, 0xE9, 0x8A, 0x07, 0x3F, 0xFA, + 0xCB, 0x08, 0x32, 0x01, 0xA1, 0x0D, 0x6E, 0xED, 0xEA, 0x0D, 0x69, 0xDF, + 0x26, 0x1C, 0x0C, 0xF4, 0x0F, 0x10, 0x78, 0x04, 0xC9, 0xF9, 0x5C, 0x01, + 0x81, 0xF1, 0x68, 0xFA, 0x0F, 0x03, 0x68, 0xEF, 0x2B, 0x14, 0xE7, 0xEB, + 0x69, 0x10, 0x37, 0xF1, 0xC6, 0x01, 0x90, 0xEE, 0x11, 0xE9, 0xFD, 0xED, + 0xE1, 0xF8, 0x37, 0xFD, 0x22, 0x0A, 0x76, 0x09, 0x03, 0xFC, 0xA8, 0x0C, + 0xDF, 0xF3, 0xF2, 0x04, 0x29, 0xEB, 0x94, 0x05, 0xE4, 0xE8, 0x54, 0x17, + 0xA4, 0x0C, 0xCE, 0x2F, 0x5B, 0x05, 0xD2, 0x15, 0xD0, 0xCB, 0x18, 0xD5, + 0xDD, 0xDA, 0x30, 0xDA, 0xA7, 0x17, 0xC8, 0x01, 0x9B, 0x19, 0xFA, 0xF8, + 0xD9, 0x00, 0xBE, 0xE1, 0x7E, 0x08, 0x8B, 0xF0, 0xEA, 0x11, 0x02, 0x0B, + 0xE0, 0x17, 0x98, 0x16, 0x0B, 0x23, 0x2E, 0x24, 0x12, 0x23, 0xE0, 0x22, + 0x8D, 0x12, 0xC8, 0x17, 0xC9, 0x05, 0x2C, 0x1A, 0xBE, 0x16, 0xB8, 0x13, + 0x21, 0x36, 0x4E, 0x06, 0x2E, 0x3E, 0x71, 0x18, 0x97, 0x26, 0xDD, 0x18, + 0xAF, 0x0E, 0x3A, 0x00, 0x9B, 0x0C, 0x71, 0x11, 0xC4, 0x18, 0x60, 0x2B, + 0xF2, 0x12, 0x98, 0x1A, 0x3D, 0x11, 0xCA, 0x0F, 0x57, 0x08, 0x25, 0x1E, + 0xA0, 0xF3, 0x6F, 0x20, 0x1A, 0xF3, 0xB2, 0x20, 0x15, 0xFD, 0x9E, 0x20, + 0x8D, 0x15, 0xBE, 0x1C, 0xEF, 0x1D, 0x0E, 0x1B, 0xA8, 0x13, 0x55, 0x0D, + 0x84, 0x20, 0x8B, 0x06, 0xDB, 0x0B, 0x33, 0xFB, 0x62, 0xEF, 0x15, 0xE8, + 0x63, 0x0B, 0x0B, 0xEA, 0xCB, 0x0D, 0x38, 0xE7, 0x48, 0x00, 0x92, 0xE9, + 0x32, 0xFD, 0x7C, 0xE5, 0x0D, 0xFA, 0x45, 0xD4, 0x6D, 0x0E, 0x2C, 0xDD, + 0xD5, 0x1E, 0x3C, 0xEE, 0xD4, 0x11, 0x61, 0xEE, 0xA3, 0xFB, 0x13, 0xE3, + 0x96, 0x08, 0x48, 0xF5, 0x0E, 0x14, 0x0C, 0x0E, 0xE6, 0xF6, 0x92, 0x04, + 0x9E, 0xEC, 0x70, 0xFF, 0x93, 0xF5, 0x35, 0x08, 0x93, 0xFA, 0x32, 0x23, + 0x13, 0x09, 0xBD, 0x45, 0x36, 0x0C, 0x64, 0x38, 0x69, 0xFB, 0x4E, 0x0A, + 0x98, 0xEA, 0xA5, 0x01, 0xA0, 0xE5, 0x54, 0x0D, 0xD1, 0xEC, 0xBE, 0x14, + 0xA3, 0x03, 0xDF, 0x1C, 0x78, 0x03, 0x86, 0x01, 0x6C, 0xEA, 0xF1, 0xD1, + 0x52, 0xE6, 0xDD, 0xC7, 0x74, 0xF0, 0x52, 0xDD, 0x7C, 0xF8, 0x89, 0xE2, + 0xB8, 0xEB, 0xE8, 0xDB, 0xC2, 0xF2, 0x16, 0xED, 0xC3, 0x10, 0x25, 0x02, + 0xC7, 0x0D, 0x37, 0xF1, 0x27, 0x09, 0x62, 0xE2, 0x52, 0xFD, 0xC5, 0xEC, + 0x1A, 0xF1, 0xD8, 0xF8, 0xAA, 0xF0, 0x54, 0xF9, 0x25, 0x01, 0xFF, 0xFF, + 0x07, 0x0F, 0xDB, 0xFD, 0x23, 0xEC, 0x94, 0xDB, 0xF4, 0xDE, 0x5E, 0xE1, + 0x0E, 0xEA, 0x33, 0x06, 0x40, 0xE4, 0xDB, 0x07, 0xF6, 0xE0, 0x1E, 0xFD, + 0x94, 0xE0, 0xAF, 0xF1, 0x80, 0xED, 0xEF, 0xDF, 0x15, 0x04, 0x98, 0xF8, + 0x22, 0xF7, 0x1E, 0x0E, 0x74, 0xCE, 0x85, 0xEC, 0xF1, 0xC4, 0x87, 0xE5, + 0x20, 0xDC, 0xC3, 0xFF, 0x06, 0xEA, 0xDD, 0xF6, 0xDB, 0xE3, 0x05, 0xE1, + 0x38, 0xEA, 0x92, 0xED, 0xA8, 0xE8, 0x49, 0xFC, 0x9E, 0xEF, 0x12, 0xFC, + 0x08, 0x08, 0xAD, 0xFD, 0x34, 0x0C, 0x49, 0x01, 0x9E, 0x0B, 0xC7, 0xFC, + 0xD1, 0x06, 0x8D, 0xF1, 0xBF, 0x12, 0xFB, 0xFF, 0x11, 0x0F, 0xCA, 0x14, + 0xC4, 0x00, 0x7D, 0x0B, 0xE3, 0x06, 0x18, 0x00, 0x5A, 0xFE, 0x02, 0xF9, + 0xA9, 0xF7, 0xF7, 0xEF, 0xDF, 0xF9, 0x91, 0xF7, 0x87, 0xF4, 0x6B, 0x0C, + 0xAA, 0xDF, 0x33, 0x0E, 0xE2, 0xD9, 0x5A, 0x04, 0xE3, 0xE3, 0x2E, 0x13, + 0x80, 0xDA, 0x02, 0x0E, 0x87, 0xE9, 0x38, 0x0F, 0x15, 0x0F, 0xC9, 0x2A, + 0x84, 0x10, 0x24, 0x24, 0xE3, 0x06, 0x7B, 0x14, 0x14, 0x0C, 0xA3, 0x05, + 0x96, 0xFF, 0xD0, 0xE7, 0x75, 0xF2, 0x73, 0xF0, 0x75, 0xFD, 0x0E, 0x07, + 0x41, 0x08, 0x9D, 0xF0, 0x22, 0xF6, 0x59, 0xD3, 0xC7, 0xF0, 0xE9, 0xDF, + 0xFA, 0x01, 0x0E, 0xE3, 0xD5, 0x1A, 0x69, 0xE5, 0x5C, 0x2F, 0x46, 0x15, + 0x36, 0x13, 0x74, 0x14, 0xB2, 0xEB, 0x49, 0xEC, 0x19, 0x01, 0x09, 0x00, + 0xD9, 0x38, 0x1A, 0x23, 0xF4, 0x30, 0x69, 0x18, 0x31, 0x0F, 0x63, 0x1A, + 0xEB, 0x10, 0x27, 0x28, 0x3C, 0x0D, 0xA1, 0x1D, 0x99, 0x0F, 0x2E, 0x22, + 0x87, 0x23, 0x7D, 0x36, 0x2E, 0x16, 0x6D, 0x39, 0xEB, 0x0F, 0xAD, 0x27, + 0x46, 0x2F, 0x8E, 0x1F, 0x13, 0x2D, 0x2E, 0x22, 0xD3, 0x22, 0x4D, 0x31, + 0xDE, 0x17, 0x1E, 0x1F, 0xBD, 0xF7, 0x66, 0xFC, 0x83, 0xEA, 0x01, 0x0A, + 0xAA, 0x0B, 0x69, 0x2D, 0x90, 0x27, 0xFA, 0x34, 0x1A, 0x1A, 0xD9, 0x1A, + 0xE3, 0x12, 0xB4, 0x03, 0xC9, 0x14, 0xE2, 0x01, 0x61, 0x0A, 0x0E, 0x09, + 0x8E, 0x18, 0xF5, 0x18, 0xEF, 0x25, 0xCE, 0x1B, 0xFD, 0x2E, 0x6F, 0x0F, + 0x4E, 0x33, 0xD3, 0x0B, 0x9D, 0x19, 0x59, 0x0E, 0x7C, 0x18, 0x9C, 0x0C, + 0x7B, 0x08, 0xA8, 0xFB, 0x41, 0xE6, 0x02, 0x00, 0xE4, 0xEF, 0xFC, 0x12, + 0xB3, 0xFF, 0xF4, 0x10, 0xFB, 0xFE, 0xEC, 0x19, 0x22, 0x01, 0x4A, 0x2A, + 0x9C, 0x02, 0xB8, 0x20, 0xA2, 0x1A, 0xC3, 0x31, 0xDF, 0x1A, 0x93, 0x33, + 0x3C, 0xFB, 0xB0, 0x02, 0x3D, 0xE5, 0xD0, 0xF7, 0xBA, 0xFA, 0xA6, 0x13, + 0x7E, 0x1F, 0x7D, 0x03, 0x22, 0x11, 0x00, 0xE0, 0xEC, 0x06, 0x55, 0xF6, + 0x83, 0x09, 0xE5, 0x12, 0x69, 0x08, 0xBD, 0x0B, 0x91, 0x18, 0xA3, 0x0A, + 0x64, 0x28, 0x23, 0x07, 0x23, 0x22, 0xB1, 0xFD, 0xA9, 0x24, 0x0C, 0x0B, + 0x17, 0x2E, 0x3A, 0x04, 0xE1, 0x23, 0x57, 0xFB, 0x43, 0x16, 0x67, 0x09, + 0x06, 0x03, 0x97, 0xFF, 0x22, 0xF3, 0xC9, 0xE9, 0xDD, 0x05, 0x82, 0xF9, + 0x1F, 0x1E, 0x62, 0x17, 0x22, 0x21, 0xBD, 0x1F, 0x40, 0x0F, 0xC7, 0x0F, + 0x4F, 0x0C, 0xB5, 0x02, 0x78, 0x12, 0x9E, 0x10, 0xF4, 0x04, 0x7B, 0x29, + 0xCC, 0xFE, 0x15, 0x32, 0x07, 0xF9, 0xF9, 0x14, 0xFA, 0x0D, 0x70, 0x04, + 0x39, 0x16, 0xA5, 0x02, 0xAB, 0xF4, 0x7B, 0xF9, 0x4C, 0xDC, 0x7F, 0xF2, + 0x98, 0xDA, 0xA8, 0xEB, 0x96, 0xE7, 0x24, 0xED, 0x22, 0xED, 0x85, 0xEC, + 0x0B, 0xEE, 0x3D, 0xEB, 0x4B, 0xF2, 0x9C, 0xE3, 0x1B, 0xEB, 0x5A, 0xDF, + 0x8A, 0xF5, 0xFA, 0xF0, 0xE8, 0x19, 0x43, 0x02, 0xFC, 0x0E, 0x98, 0xFB, + 0x78, 0xEC, 0xD8, 0xE0, 0x97, 0xF8, 0xDA, 0xE4, 0xAF, 0x16, 0x9F, 0xFE, + 0x3C, 0x0F, 0xBC, 0xFB, 0x74, 0xF2, 0xA6, 0xE9, 0x0A, 0xF7, 0xAD, 0xF1, + 0x9F, 0x06, 0x7F, 0x0A, 0x45, 0x09, 0x4D, 0x15, 0xD1, 0x07, 0xC4, 0x1E, + 0xEC, 0xF6, 0x24, 0x1A, 0xA5, 0xE8, 0x13, 0x05, 0x46, 0xE0, 0xB1, 0xFB, + 0x5A, 0xEB, 0x8B, 0xFB, 0x66, 0x0C, 0x6F, 0x01, 0x41, 0x0B, 0xA1, 0x08, + 0x32, 0xFA, 0x24, 0x00, 0x93, 0xF5, 0xA7, 0xE9, 0xD5, 0xF9, 0x8E, 0xEB, + 0x5F, 0x0A, 0xA7, 0x0E, 0x11, 0x1B, 0x93, 0x18, 0x60, 0x2A, 0x7B, 0x0E, + 0x4D, 0x1C, 0x0E, 0x05, 0x02, 0x00, 0x41, 0xEF, 0xFC, 0x01, 0x08, 0xF8, + 0xF3, 0xF0, 0xDE, 0xFE, 0x21, 0xF8, 0x68, 0xF1, 0xBE, 0x0B, 0x2A, 0xDE, + 0x97, 0xFB, 0x32, 0xE0, 0xA6, 0x07, 0x23, 0xF5, 0xC5, 0x04, 0x2B, 0xE5, + 0x47, 0xFF, 0x8C, 0xE5, 0xE7, 0x04, 0x56, 0xFD, 0x77, 0xF5, 0x76, 0x0E, + 0xAA, 0xFB, 0xDC, 0x20, 0xEE, 0xF6, 0xC4, 0x18, 0x33, 0xDD, 0x74, 0x02, + 0x4A, 0xDE, 0xF3, 0x01, 0x39, 0xEC, 0x1B, 0x06, 0x77, 0xE0, 0xF4, 0xEA, + 0x2F, 0xCE, 0x4E, 0xD2, 0x04, 0xF5, 0x31, 0xF8, 0x8C, 0xFB, 0x42, 0x05, + 0xF1, 0xD7, 0xA0, 0xE5, 0x22, 0xEA, 0x26, 0xE3, 0xDC, 0xF6, 0x5F, 0xE8, + 0x22, 0xFF, 0xDC, 0xF9, 0x6E, 0x12, 0xE1, 0x0B, 0xC0, 0x02, 0x62, 0x01, + 0xE0, 0xE8, 0xFC, 0xE7, 0xF7, 0xEF, 0x1F, 0xEF, 0xEB, 0x00, 0x57, 0x02, + 0x89, 0xED, 0x80, 0xE8, 0x4E, 0xF0, 0xBB, 0xE4, 0xF1, 0x06, 0x47, 0xEF, + 0x1C, 0xFF, 0xD8, 0xE5, 0xEC, 0xF2, 0x81, 0xE4, 0xD1, 0xE6, 0x29, 0xE0, + 0x84, 0xE5, 0x94, 0xF4, 0x52, 0xE3, 0xB1, 0x03, 0x93, 0xE7, 0x1A, 0x00, + 0x78, 0xE1, 0xFB, 0xFA, 0x35, 0xD8, 0x77, 0xF0, 0x05, 0xE4, 0x92, 0xF4, + 0x67, 0xEB, 0x41, 0xEE, 0xCD, 0x01, 0x1F, 0xE7, 0xE5, 0x03, 0xAA, 0xDD, + 0xE7, 0xE9, 0x9E, 0xDD, 0xAB, 0xCA, 0x8B, 0xE0, 0x2C, 0xC3, 0x57, 0xDE, + 0x33, 0xDF, 0x91, 0xED, 0x1C, 0xF2, 0x2C, 0xE9, 0x89, 0xE4, 0x39, 0xDA, + 0x1F, 0xDD, 0x33, 0xDD, 0x00, 0xDC, 0x02, 0xE3, 0x41, 0xD3, 0x80, 0xE5, + 0x41, 0xED, 0x2C, 0xFA, 0x6F, 0xF1, 0x96, 0x04, 0x86, 0xD3, 0x9B, 0xE6, + 0x81, 0xE4, 0x15, 0xEF, 0x09, 0x0D, 0x37, 0x07, 0x82, 0x1D, 0x61, 0xF4, + 0x4A, 0x20, 0x23, 0xF5, 0x84, 0x0E, 0x44, 0x04, 0x0E, 0xFB, 0xCE, 0x07, + 0x96, 0x0E, 0x9F, 0x0A, 0xA3, 0x25, 0xD5, 0x21, 0x54, 0x12, 0x7B, 0x2F, + 0xAD, 0xFB, 0xF1, 0x1A, 0xAF, 0xF7, 0x12, 0x04, 0x6E, 0xF6, 0x58, 0x03, + 0x35, 0xFA, 0xBD, 0x0D, 0x95, 0x04, 0xB6, 0x09, 0x99, 0x03, 0x91, 0x07, + 0xB7, 0xF7, 0x21, 0x0A, 0x80, 0x00, 0x19, 0x03, 0xDA, 0x14, 0xF0, 0xFA, + 0x03, 0x18, 0x75, 0x0E, 0xFB, 0x1F, 0xE3, 0x1B, 0xF7, 0x23, 0x84, 0xFC, + 0x43, 0x0E, 0x7D, 0xF2, 0x53, 0x01, 0x8A, 0x0E, 0x0C, 0x07, 0xDA, 0x12, + 0xF7, 0x10, 0x5C, 0xFA, 0x42, 0x0D, 0x5D, 0xF0, 0xAD, 0x08, 0x87, 0xF8, + 0xE9, 0xF4, 0xE2, 0xE9, 0x6C, 0xD6, 0x85, 0xE5, 0x94, 0xD9, 0x1C, 0x00, + 0x0D, 0xF1, 0x0C, 0xF7, 0x43, 0xF6, 0x07, 0xF0, 0x58, 0xE3, 0x45, 0xFD, + 0xF1, 0xEC, 0x86, 0xFE, 0xBE, 0xEA, 0x76, 0xFF, 0xFB, 0xD9, 0x63, 0x03, + 0x65, 0xF1, 0x58, 0xFC, 0x86, 0xDC, 0x35, 0xDD, 0xD2, 0xB9, 0x9B, 0xD0, + 0x15, 0xE6, 0xF0, 0xE6, 0xF0, 0x00, 0x87, 0xED, 0xF8, 0xF2, 0xF4, 0xDB, + 0x96, 0xF5, 0xBD, 0xD2, 0xB4, 0xF7, 0x72, 0xE0, 0xE9, 0xF8, 0xEB, 0xEB, + 0xC3, 0x0A, 0xF0, 0xFA, 0x29, 0x09, 0x09, 0x05, 0xBD, 0xF1, 0x4E, 0xDF, + 0x9E, 0xF3, 0x15, 0xD7, 0x63, 0xF2, 0x83, 0xF8, 0xF5, 0xE1, 0xE8, 0xF5, + 0xF6, 0xE3, 0x0E, 0xE1, 0x89, 0xE4, 0x57, 0xDC, 0x04, 0xEE, 0x17, 0xDD, + 0x99, 0x0A, 0xB7, 0xD2, 0xEA, 0x10, 0x2A, 0xE3, 0x84, 0x10, 0x3A, 0xF8, + 0x4D, 0x05, 0x6B, 0xEB, 0x38, 0xE9, 0x5B, 0xEB, 0x26, 0xE5, 0x9B, 0xF1, + 0xB1, 0xF8, 0x1D, 0xF9, 0xC5, 0xFC, 0x54, 0xFF, 0xFE, 0xE5, 0x64, 0xF0, + 0x1C, 0xE6, 0x0E, 0xF6, 0x8A, 0xFD, 0x69, 0xF6, 0x78, 0xEF, 0xCA, 0xDE, + 0xF0, 0xD3, 0x60, 0xD1, 0x2D, 0xDF, 0x22, 0xD2, 0x96, 0xEF, 0xAD, 0xE2, + 0x92, 0xFA, 0x63, 0xE9, 0x52, 0xF0, 0x91, 0xE8, 0x26, 0xD5, 0x4E, 0xE3, + 0x0A, 0xD3, 0xC5, 0xD6, 0x8A, 0xEE, 0x38, 0xE2, 0x4F, 0x15, 0xB4, 0xFF, + 0x62, 0x11, 0xA5, 0x0E, 0xB9, 0xEE, 0x2A, 0xFB, 0x0D, 0xE6, 0xD6, 0xEE, + 0x44, 0xF7, 0x70, 0xF4, 0x8A, 0xFB, 0xD6, 0xEB, 0xF3, 0xF4, 0x1C, 0xFA, + 0x47, 0xFB, 0x46, 0x15, 0x5E, 0x0B, 0xAE, 0x18, 0x42, 0x13, 0xC7, 0x17, + 0xF0, 0x1A, 0xBB, 0x2A, 0x18, 0x22, 0x5D, 0x2A, 0xC5, 0x10, 0x8F, 0x1C, + 0xE6, 0x11, 0x4A, 0x1D, 0x02, 0x25, 0x74, 0x0D, 0xEE, 0x20, 0x59, 0x0A, + 0x39, 0x17, 0x5C, 0x12, 0xA8, 0x09, 0x6C, 0xFA, 0xBC, 0x01, 0x64, 0xE5, + 0x52, 0xFF, 0xC2, 0xF8, 0x7D, 0x16, 0x19, 0x0D, 0xDC, 0x38, 0x84, 0x08, + 0x5F, 0x27, 0x4C, 0x08, 0x85, 0x19, 0x49, 0x21, 0x80, 0x25, 0xAB, 0x1D, + 0x76, 0x30, 0x00, 0x0D, 0x53, 0x24, 0x7D, 0x18, 0xE0, 0x19, 0x39, 0x1E, + 0xB7, 0x26, 0xDA, 0x26, 0x69, 0x1E, 0xDD, 0x28, 0xF3, 0x09, 0x67, 0x23, + 0xFA, 0x0D, 0xB4, 0x1D, 0xC2, 0x32, 0x32, 0x21, 0xD0, 0x3F, 0xBC, 0x2E, + 0x45, 0x27, 0xA2, 0x32, 0x1C, 0x1B, 0x1C, 0x3B, 0x85, 0x0A, 0x2D, 0x2E, + 0xC2, 0xF6, 0xAF, 0x24, 0x6A, 0x13, 0xD8, 0x38, 0x8D, 0x33, 0x4B, 0x39, + 0x27, 0x12, 0xB8, 0x1D, 0x8E, 0xF5, 0x65, 0x0C, 0x6E, 0x18, 0x79, 0x25, + 0x5C, 0x26, 0x89, 0x2E, 0xBD, 0x16, 0x6E, 0x22, 0x0B, 0x16, 0xE8, 0x1F, + 0x2E, 0x1B, 0xFE, 0x1B, 0xEB, 0x33, 0x64, 0x26, 0x83, 0x49, 0xA5, 0x45, + 0x6B, 0x46, 0xAB, 0x56, 0xDD, 0x3D, 0x25, 0x48, 0xA6, 0x3A, 0x13, 0x3E, + 0x18, 0x3F, 0xC5, 0x21, 0xF2, 0x2F, 0xC3, 0x0E, 0xFE, 0x1C, 0x09, 0x37, + 0x96, 0x24, 0x2B, 0x3E, 0x36, 0x24, 0x1A, 0x0F, 0x84, 0x17, 0x3D, 0xFA, + 0x29, 0x0C, 0x82, 0x09, 0xC4, 0x06, 0x58, 0x1B, 0x9F, 0x0E, 0xF6, 0x21, + 0xBC, 0x15, 0x55, 0x23, 0x91, 0x15, 0x5B, 0x16, 0xF8, 0x13, 0x51, 0x12, + 0xB5, 0x25, 0x4A, 0x2A, 0xC7, 0x2E, 0x33, 0x34, 0xC4, 0x18, 0xD5, 0x0F, + 0x3C, 0xFD, 0x2C, 0xF0, 0x17, 0xEF, 0x99, 0x0B, 0x50, 0xEB, 0xBD, 0xFE, + 0x82, 0xE2, 0x1F, 0xCF, 0x11, 0xEA, 0x9A, 0xD5, 0x94, 0xF4, 0xA9, 0xDD, + 0x2D, 0xF0, 0x19, 0xD2, 0xE3, 0xF8, 0xB2, 0xD8, 0xC2, 0xF2, 0x76, 0xE4, + 0x9F, 0xE9, 0x81, 0xE9, 0xE1, 0x03, 0x31, 0x0B, 0xB0, 0xF9, 0x08, 0x0E, + 0x71, 0xDD, 0x83, 0xD8, 0x17, 0xEE, 0xB6, 0xE6, 0x6A, 0x0A, 0xDB, 0x1C, + 0x89, 0x15, 0x1F, 0x0C, 0x31, 0x11, 0x39, 0xF2, 0x45, 0xED, 0xC6, 0x07, + 0xF0, 0xCD, 0x7E, 0x1A, 0x56, 0xEB, 0xB9, 0x1F, 0xD7, 0xFC, 0x0F, 0x29, + 0xA7, 0xF9, 0x8B, 0x18, 0xE9, 0x00, 0x93, 0x0C, 0x92, 0xF0, 0x69, 0x1E, + 0xA6, 0xEE, 0x45, 0x0E, 0xD3, 0xF5, 0x26, 0xE1, 0xF0, 0xE7, 0x54, 0xD4, + 0x99, 0xFA, 0x10, 0xEB, 0xA9, 0x07, 0x79, 0xFB, 0xBF, 0xF3, 0xC9, 0xE6, + 0x28, 0xF5, 0x7F, 0xC5, 0x06, 0xF1, 0xE3, 0xCA, 0xE0, 0xD9, 0x8F, 0xD1, + 0xE9, 0xE5, 0xF3, 0xD9, 0x5A, 0xF3, 0xE0, 0xF0, 0xFE, 0xED, 0xEB, 0xED, + 0xCB, 0xFE, 0xD7, 0xEE, 0x61, 0x0D, 0x0A, 0xF6, 0x1C, 0x00, 0x51, 0xE5, + 0x93, 0xEA, 0x40, 0xDA, 0x14, 0xD8, 0x98, 0xE4, 0xF3, 0xC0, 0x3B, 0xD8, + 0x8A, 0xCB, 0xA1, 0xD2, 0x53, 0xDD, 0xE7, 0xEA, 0xAF, 0xD8, 0xFC, 0xF5, + 0xAB, 0xCB, 0x93, 0xEB, 0xE7, 0xC4, 0x85, 0xE3, 0x01, 0xCA, 0x2E, 0xE1, + 0x29, 0xDE, 0xFB, 0xF6, 0xD1, 0xE8, 0xF3, 0x12, 0x83, 0xD0, 0xCE, 0xEE, + 0x85, 0xC2, 0xA3, 0xC0, 0x75, 0xCD, 0x03, 0xDC, 0x72, 0xE7, 0x05, 0xFD, + 0xF6, 0xF2, 0x82, 0xE8, 0xE7, 0xE8, 0xB4, 0xDD, 0x04, 0xE1, 0xD2, 0xF6, + 0x1B, 0xEC, 0x42, 0x02, 0x95, 0xFF, 0x3A, 0xFD, 0x88, 0x07, 0xE8, 0x02, + 0xAA, 0x12, 0x38, 0xFC, 0xDA, 0x17, 0x45, 0xF4, 0x9D, 0x05, 0xBD, 0x04, + 0x1A, 0x0B, 0x5F, 0x0D, 0xCC, 0x1C, 0x98, 0xFB, 0xAE, 0x0E, 0x02, 0xFB, + 0x88, 0x06, 0x7E, 0x01, 0x11, 0x0D, 0xDA, 0xE8, 0x05, 0x0B, 0xD9, 0xE5, + 0x91, 0x04, 0xDD, 0x0C, 0x58, 0xF4, 0xCA, 0x18, 0x73, 0xF3, 0x7F, 0x12, + 0xB8, 0x01, 0xD8, 0x11, 0x89, 0x05, 0xFA, 0xFF, 0x45, 0x0B, 0x0F, 0x03, + 0xA6, 0x0B, 0x7D, 0x24, 0x74, 0x0B, 0x1B, 0x25, 0x1C, 0x0B, 0x9D, 0xFF, + 0x7D, 0x09, 0xA9, 0xE6, 0xA9, 0x04, 0xF0, 0xCD, 0xCA, 0xEC, 0x93, 0xD3, + 0xB3, 0xEC, 0x53, 0xF5, 0xF6, 0xF7, 0x0F, 0xEB, 0x48, 0xE9, 0x3C, 0xD7, + 0x14, 0xF8, 0xD7, 0xE0, 0x36, 0x04, 0xFE, 0xE6, 0x46, 0x0B, 0x24, 0xE4, + 0xF0, 0x2A, 0x72, 0x04, 0x3A, 0x20, 0x6F, 0x17, 0x46, 0xFE, 0xE7, 0xFD, + 0x3C, 0xF9, 0x79, 0xFF, 0x04, 0x0C, 0x6E, 0x0E, 0x8B, 0x08, 0x46, 0x13, + 0x17, 0xF2, 0x61, 0x18, 0xC4, 0xF3, 0x1B, 0x18, 0x42, 0xFD, 0x3B, 0x19, + 0x59, 0x0F, 0xD8, 0x22, 0x79, 0x1D, 0x2A, 0x3B, 0xA7, 0x22, 0x90, 0x3F, + 0x03, 0x1E, 0x67, 0x2E, 0x21, 0x04, 0x0C, 0x20, 0x7B, 0xF7, 0x12, 0x26, + 0xBD, 0x00, 0x5B, 0x37, 0xCE, 0x09, 0x8F, 0x22, 0x20, 0x12, 0x2B, 0x0C, + 0x51, 0x1A, 0x6C, 0x0A, 0x22, 0x1E, 0xEC, 0xFA, 0x16, 0x0F, 0x7D, 0xF8, + 0x97, 0x13, 0x51, 0x07, 0x14, 0x30, 0xBB, 0x00, 0xD7, 0x26, 0x8E, 0xFE, + 0x11, 0x28, 0x12, 0x11, 0x12, 0x35, 0x4B, 0x0A, 0xF8, 0x22, 0x8C, 0xFD, + 0x1F, 0x1C, 0x85, 0x0C, 0xAA, 0x2E, 0xC9, 0x06, 0xBB, 0x30, 0x3C, 0x04, + 0x63, 0x17, 0xEB, 0x11, 0x1E, 0x10, 0x37, 0xFC, 0xBA, 0x20, 0x18, 0xFF, + 0xB6, 0x2C, 0x7E, 0x14, 0x80, 0x2A, 0x75, 0x12, 0x11, 0x16, 0xCA, 0x21, + 0xE3, 0x01, 0xB1, 0x2A, 0xF0, 0xE8, 0xCF, 0x17, 0x1B, 0x04, 0xE0, 0x21, + 0xDA, 0x33, 0xBF, 0x44, 0x56, 0x1B, 0xC8, 0x2B, 0x5A, 0x01, 0xAC, 0x0B, + 0xA6, 0x05, 0xC5, 0x20, 0xAE, 0x08, 0x88, 0x25, 0x5A, 0x08, 0xB1, 0x13, + 0x42, 0x15, 0x04, 0x11, 0x52, 0x17, 0x27, 0x25, 0x75, 0x10, 0x2C, 0x2A, + 0x50, 0x24, 0x5A, 0x1E, 0x56, 0x2D, 0x67, 0x27, 0x52, 0x30, 0x15, 0x31, + 0xA1, 0x27, 0xBF, 0x2D, 0x67, 0x12, 0x1E, 0x23, 0x53, 0x1A, 0xEE, 0x1F, + 0xD6, 0x1C, 0xCF, 0x16, 0xEC, 0x19, 0xC7, 0x11, 0x8C, 0x1E, 0xDD, 0x1D, + 0x35, 0x12, 0x07, 0x18, 0x38, 0x06, 0x1F, 0x06, 0x1C, 0x00, 0x5F, 0x0E, + 0x52, 0x08, 0xED, 0x23, 0x12, 0x18, 0xBC, 0x29, 0xB5, 0x1C, 0x73, 0x2A, + 0x4A, 0x1D, 0x81, 0x22, 0x84, 0x16, 0xE3, 0x15, 0x62, 0x08, 0xA1, 0x14, + 0xFD, 0x04, 0x27, 0x18, 0x01, 0xFC, 0x41, 0x0A, 0xF3, 0xEB, 0x3A, 0xF8, + 0x03, 0xE2, 0x7E, 0xE5, 0x7C, 0xE7, 0xC7, 0xD6, 0x8F, 0xF9, 0x94, 0xEE, + 0x72, 0x08, 0x6B, 0xFA, 0xA0, 0x11, 0xB2, 0xDF, 0x30, 0xFB, 0xED, 0xD0, + 0xFA, 0xDF, 0x36, 0xDB, 0xD0, 0xED, 0x52, 0xEF, 0x7A, 0x0C, 0x9A, 0x07, + 0x3D, 0x0E, 0x81, 0x0C, 0x9F, 0xF6, 0x31, 0xF1, 0x2C, 0xF8, 0x7E, 0xE3, + 0x00, 0x0C, 0xB6, 0xF1, 0x5F, 0x02, 0x4D, 0xFB, 0xF9, 0xFC, 0x6D, 0x08, + 0xED, 0x06, 0xCF, 0x0F, 0x18, 0x00, 0xB0, 0x14, 0xB6, 0x0E, 0xB4, 0x26, + 0xFD, 0x21, 0xDF, 0x2E, 0x42, 0x02, 0x12, 0x25, 0x21, 0xF3, 0xAD, 0x11, + 0x11, 0xFB, 0x61, 0x02, 0x15, 0xF0, 0x69, 0x03, 0x5E, 0xE8, 0x88, 0xFC, + 0x71, 0xE9, 0x9F, 0xEF, 0xF7, 0xE8, 0xA9, 0x00, 0x23, 0xE4, 0xF4, 0x0A, + 0xB4, 0xE5, 0xE5, 0xEA, 0xC2, 0xED, 0x41, 0xE7, 0xC9, 0xF1, 0xA6, 0xFF, + 0x12, 0xF5, 0x61, 0xE7, 0x6B, 0xF2, 0x5E, 0xD2, 0xCA, 0xF0, 0xA6, 0xDD, + 0x10, 0xEF, 0xEF, 0xD3, 0x9F, 0xE7, 0xAC, 0xC0, 0xED, 0xE4, 0x31, 0xCD, + 0x95, 0xDE, 0x64, 0xCD, 0x6E, 0xDA, 0x31, 0xB5, 0x3E, 0xDA, 0xA1, 0xCD, + 0x30, 0xC8, 0xEC, 0xD7, 0x19, 0xCE, 0x31, 0xBE, 0xC1, 0xF4, 0x54, 0xD4, + 0x6D, 0xF7, 0x13, 0xF6, 0xA9, 0xDE, 0x3B, 0xE9, 0x45, 0xCE, 0xF8, 0xCF, + 0x1E, 0xB1, 0x8E, 0xC0, 0xA4, 0xAA, 0xED, 0xBF, 0x39, 0xCB, 0x18, 0xDA, + 0x2B, 0xC6, 0xAC, 0xD4, 0x05, 0xAD, 0xB0, 0xBA, 0x8D, 0xB8, 0x23, 0xC9, + 0xDA, 0xD0, 0xC1, 0xD8, 0x45, 0xD4, 0x7E, 0xD9, 0x78, 0xE2, 0x25, 0xEA, + 0x12, 0x01, 0xCF, 0xF0, 0x1C, 0x00, 0x2F, 0xEC, 0xB4, 0xF1, 0x36, 0xEE, + 0x82, 0xEF, 0xC8, 0xDD, 0x3B, 0xDD, 0xE5, 0xD2, 0xE3, 0xCD, 0xD1, 0xDC, + 0xFA, 0xDA, 0x7E, 0xDC, 0x9C, 0xDC, 0xBA, 0xD9, 0x2D, 0xDF, 0xA5, 0xDF, + 0x78, 0xFD, 0x1A, 0xE5, 0x84, 0x07, 0x15, 0xE0, 0xFE, 0xF6, 0xB6, 0xEA, + 0x76, 0xF7, 0xD4, 0xFD, 0x22, 0x04, 0xDA, 0xF9, 0xAD, 0x07, 0xE1, 0xF8, + 0xEC, 0x0F, 0xBA, 0x05, 0x24, 0x14, 0x35, 0x07, 0x45, 0xFA, 0x35, 0xF4, + 0x8D, 0xEE, 0x15, 0xEB, 0x1B, 0xF6, 0xCB, 0xEB, 0xBB, 0xFD, 0x4F, 0xE9, + 0x12, 0x05, 0xBB, 0xE7, 0x43, 0xFE, 0x2B, 0xF3, 0x0F, 0xF2, 0x62, 0xF0, + 0x02, 0xE6, 0x00, 0xD2, 0x90, 0xF2, 0xB3, 0xD7, 0x8A, 0x02, 0xF2, 0xFB, + 0x99, 0xFD, 0x65, 0x02, 0xC8, 0xF9, 0xB3, 0xED, 0x29, 0xED, 0x86, 0xEE, + 0x14, 0xEB, 0x55, 0xE4, 0x78, 0x14, 0xC8, 0xD3, 0x50, 0x25, 0x6C, 0xF9, + 0x20, 0xFE, 0x44, 0x0D, 0xA3, 0xF3, 0xE2, 0xE9, 0x58, 0x10, 0xFF, 0xED, + 0xAA, 0x15, 0x08, 0x0D, 0x5B, 0x0B, 0xC6, 0x02, 0x50, 0x0E, 0x1C, 0x01, + 0x7C, 0x18, 0x94, 0x12, 0xBC, 0x22, 0xE1, 0x25, 0x31, 0x20, 0x49, 0x35, + 0x46, 0x0D, 0x5A, 0x2E, 0x52, 0xF5, 0xEE, 0x1B, 0x11, 0xF0, 0x50, 0x0D, + 0xE8, 0xFA, 0x40, 0x12, 0x11, 0xFF, 0x5E, 0x13, 0x1F, 0x06, 0x20, 0x0E, + 0x26, 0x11, 0x52, 0x10, 0xE9, 0x10, 0x2D, 0x0E, 0x9D, 0x04, 0x67, 0x04, + 0x9B, 0x02, 0x5F, 0xF4, 0xDB, 0x05, 0xCC, 0xFC, 0x48, 0x00, 0x61, 0x13, + 0x24, 0x11, 0x09, 0x0A, 0x52, 0x14, 0x59, 0xEC, 0x93, 0xF8, 0x80, 0xEE, + 0xB8, 0xEE, 0x6D, 0xEA, 0x77, 0xF6, 0xBD, 0xDB, 0x66, 0xFF, 0xA3, 0xEF, + 0xA5, 0x05, 0x6A, 0xF1, 0x1C, 0x03, 0x1B, 0xE2, 0xE5, 0x01, 0x1C, 0xEE, + 0x59, 0x07, 0x31, 0x06, 0x4E, 0x06, 0x61, 0xFA, 0x7C, 0xFF, 0x79, 0xF0, + 0x76, 0xF1, 0x25, 0x01, 0xA9, 0xE4, 0x4A, 0xF6, 0x82, 0xD5, 0x2C, 0xE0, + 0x61, 0xD9, 0xB2, 0xEE, 0x17, 0xFD, 0x19, 0xF9, 0x9D, 0x07, 0xED, 0xE6, + 0x02, 0xE2, 0xD9, 0xDD, 0x1B, 0xCA, 0x93, 0xED, 0xDE, 0xDC, 0xF2, 0x09, + 0x04, 0xEB, 0x80, 0x0C, 0x32, 0xF1, 0xE9, 0x0D, 0xB6, 0xFE, 0x93, 0x17, + 0x36, 0x0B, 0x07, 0x1A, 0xF7, 0x11, 0x94, 0x1B, 0x27, 0x07, 0x3A, 0x18, + 0x6D, 0xF3, 0x75, 0x17, 0xDB, 0xF0, 0x1D, 0x0D, 0xCF, 0xFD, 0x13, 0x04, + 0x3A, 0x08, 0x2D, 0x0C, 0xCF, 0x11, 0x95, 0x07, 0x41, 0x0B, 0xF5, 0xF3, + 0x88, 0x03, 0xAF, 0x02, 0x26, 0x0D, 0x6B, 0x1D, 0x48, 0x07, 0x7E, 0x14, + 0x5B, 0xF4, 0x9E, 0x0A, 0x6C, 0xF1, 0x7C, 0x0E, 0x80, 0x05, 0x2E, 0x0B, + 0x7F, 0x15, 0xD4, 0x05, 0x30, 0x0D, 0xC8, 0x0E, 0x7A, 0xFE, 0x40, 0x17, + 0x16, 0x00, 0x06, 0x04, 0xBD, 0x05, 0xAB, 0x08, 0x37, 0x04, 0xD6, 0x1D, + 0xA0, 0x0B, 0xF0, 0x12, 0x11, 0x12, 0x57, 0x0A, 0x3A, 0x12, 0xB7, 0x05, + 0x7D, 0x17, 0x07, 0xF7, 0x59, 0x1A, 0x4D, 0xF4, 0x3F, 0x17, 0xE0, 0xFD, + 0x8C, 0x0E, 0xF9, 0xF1, 0xB5, 0xF5, 0x69, 0xE0, 0x25, 0xE1, 0xFF, 0xF3, + 0x33, 0xF8, 0x58, 0x14, 0x66, 0x24, 0x7E, 0x17, 0x86, 0x38, 0x0F, 0x0C, + 0xC4, 0x25, 0x14, 0x12, 0x16, 0x18, 0x8B, 0x19, 0xA4, 0x18, 0xEE, 0x14, + 0x88, 0x13, 0x0A, 0x1A, 0x3C, 0x20, 0x32, 0x31, 0xCE, 0x36, 0xAB, 0x3C, + 0x6E, 0x31, 0x63, 0x3F, 0x57, 0x31, 0xBE, 0x4B, 0xC0, 0x47, 0x08, 0x3A, + 0x82, 0x23, 0xAE, 0x20, 0x78, 0x01, 0x61, 0x31, 0x64, 0x23, 0x96, 0x3C, + 0x2E, 0x3D, 0xF9, 0x2C, 0x60, 0x35, 0xA6, 0x38, 0x66, 0x37, 0xE9, 0x48, + 0x3C, 0x2A, 0x9C, 0x30, 0x03, 0x10, 0x7A, 0x1E, 0x97, 0x1D, 0xCD, 0x1C, + 0x79, 0x2A, 0xB9, 0x07, 0x23, 0x1A, 0xAC, 0x01, 0x22, 0x10, 0x57, 0x25, + 0x6A, 0x23, 0x3F, 0x29, 0x22, 0x2A, 0x3E, 0x0F, 0xD6, 0x10, 0x68, 0x0C, + 0xF8, 0x0D, 0xA8, 0x18, 0xEF, 0x32, 0x2B, 0x31, 0xE0, 0x45, 0x68, 0x3B, + 0x04, 0x33, 0xB7, 0x2C, 0xDB, 0x0C, 0x4A, 0x14, 0xE9, 0xFF, 0x6E, 0x06, + 0x70, 0x1B, 0x46, 0x00, 0x99, 0x2B, 0xC7, 0x11, 0x22, 0x13, 0xD8, 0x1B, + 0x58, 0xF4, 0xBB, 0x00, 0xB5, 0xEB, 0x40, 0xE7, 0xE1, 0xF5, 0xBC, 0xE3, + 0xA0, 0x02, 0x9E, 0xFB, 0x88, 0x01, 0x62, 0x08, 0x78, 0x02, 0x9D, 0xF1, + 0x7A, 0x13, 0xED, 0xE5, 0x47, 0x1E, 0xF0, 0x05, 0x3D, 0x0C, 0xBA, 0x10, + 0x72, 0xFA, 0xAC, 0xFE, 0x6C, 0x02, 0x47, 0xF4, 0x08, 0x0F, 0x2A, 0xF1, + 0x8D, 0x0D, 0xB7, 0x05, 0x30, 0x03, 0x8B, 0x1D, 0x66, 0xF2, 0xF3, 0x12, + 0x66, 0xED, 0xAA, 0xFB, 0x44, 0xFA, 0x18, 0xF3, 0x36, 0x07, 0x51, 0xF8, + 0x96, 0x0D, 0xD4, 0x08, 0x83, 0x15, 0x7B, 0x0B, 0x4A, 0x13, 0xB0, 0x01, + 0x0E, 0xF3, 0x40, 0xEE, 0xE6, 0xE1, 0x64, 0xE2, 0xBA, 0xED, 0xBF, 0xE2, + 0x21, 0xF5, 0xD5, 0xEA, 0x24, 0xF5, 0x1E, 0xF5, 0x59, 0xF7, 0x62, 0xF3, + 0x97, 0xFC, 0xAE, 0xEB, 0x37, 0xED, 0x2F, 0xEA, 0xE0, 0xCA, 0xC5, 0xE4, + 0x53, 0xCE, 0x6D, 0xDC, 0x4A, 0xE7, 0x82, 0xEF, 0x88, 0xEA, 0xD2, 0x00, + 0x81, 0xE0, 0xF8, 0xE3, 0x9C, 0xCD, 0x14, 0xBF, 0x64, 0xC0, 0xF3, 0xBE, + 0x3D, 0xC9, 0x04, 0xB2, 0xCE, 0xD6, 0x89, 0xA9, 0x39, 0xDB, 0x89, 0xC2, + 0x2D, 0xD7, 0xDD, 0xBE, 0x7B, 0xCB, 0xFA, 0xAA, 0x8A, 0xD3, 0x08, 0xC1, + 0xCA, 0xE0, 0x17, 0xCF, 0x36, 0xD3, 0x0B, 0xC3, 0xD6, 0xBA, 0xE4, 0xCB, + 0x57, 0xBA, 0x98, 0xE1, 0xDC, 0xCC, 0x0D, 0xE6, 0xE4, 0xC6, 0xDB, 0xC4, + 0x12, 0xBD, 0x39, 0xCC, 0x16, 0xCC, 0x74, 0xF6, 0xD6, 0xDF, 0x17, 0xF8, + 0xAD, 0xEB, 0x05, 0xFD, 0xC9, 0xEA, 0x48, 0xF9, 0x68, 0xDD, 0x6B, 0xE6, + 0xE3, 0xD4, 0x57, 0xDA, 0xBB, 0xD8, 0x5F, 0xD1, 0xA3, 0xE3, 0x21, 0xDE, + 0xAF, 0xE8, 0x52, 0xED, 0x96, 0xE9, 0x93, 0xD6, 0xC2, 0xEC, 0x56, 0xC2, + 0x70, 0xE8, 0x76, 0xD9, 0xC8, 0xE1, 0x39, 0xE0, 0x75, 0xD6, 0xFC, 0xC5, + 0x42, 0xE5, 0xE4, 0xC5, 0x4F, 0x02, 0x3A, 0xE9, 0x97, 0xFB, 0xBF, 0xF5, + 0xFE, 0xDD, 0xAC, 0xF0, 0x11, 0xD1, 0x4C, 0xE6, 0x66, 0xCA, 0xD2, 0xDC, + 0x8D, 0xD0, 0x36, 0xFC, 0x44, 0xF1, 0x3B, 0x14, 0x2F, 0x08, 0x06, 0x0E, + 0xCF, 0x05, 0x36, 0x00, 0x32, 0xFA, 0x9C, 0xF5, 0xEE, 0xF5, 0x71, 0xEC, + 0xC9, 0xF7, 0xF5, 0xF1, 0xA3, 0xF1, 0xDD, 0xFD, 0x31, 0xF2, 0x9D, 0xFB, + 0xEE, 0xF3, 0x71, 0xDA, 0x21, 0xE8, 0x74, 0xD0, 0x69, 0xEA, 0x52, 0xFE, + 0xAD, 0xF4, 0xEB, 0x10, 0x4F, 0xEF, 0x80, 0xF9, 0x37, 0xEA, 0xD1, 0xEA, + 0x3D, 0xFB, 0x62, 0xFF, 0x0A, 0x06, 0x0E, 0x02, 0x8C, 0xFD, 0x33, 0xF9, + 0x72, 0x06, 0xD7, 0x13, 0xFE, 0x1F, 0x00, 0x26, 0xB9, 0x29, 0x87, 0x14, + 0x64, 0x2B, 0x42, 0x14, 0x2A, 0x21, 0x38, 0x1C, 0x76, 0x0D, 0xE9, 0x0D, + 0xC7, 0x0A, 0xF0, 0x1F, 0x35, 0x15, 0xA2, 0x28, 0x8C, 0x26, 0x7B, 0x17, + 0x1F, 0x2E, 0xA1, 0x27, 0x84, 0x24, 0xF3, 0x36, 0x4A, 0x21, 0x9E, 0x22, + 0x99, 0x13, 0xE3, 0x15, 0x57, 0xF8, 0xEA, 0x2E, 0x8B, 0xFE, 0xB8, 0x3B, + 0xA5, 0x16, 0x20, 0x3B, 0x1F, 0x24, 0x4C, 0x3A, 0x50, 0x24, 0x95, 0x20, + 0x11, 0x1A, 0x82, 0x19, 0x15, 0x0F, 0xF5, 0x29, 0x6C, 0x11, 0x3F, 0x1F, + 0x07, 0x1E, 0xBF, 0x20, 0xB3, 0x1D, 0xF0, 0x28, 0x1E, 0x17, 0xC0, 0x0A, + 0x27, 0x16, 0xB4, 0xF4, 0x0A, 0x0C, 0xD5, 0x03, 0x65, 0x11, 0xA7, 0x0F, + 0x8C, 0x15, 0xE9, 0x07, 0x7B, 0x10, 0x2D, 0x12, 0xB2, 0x1C, 0xAC, 0x14, + 0x8B, 0x0C, 0xE3, 0x00, 0x02, 0xFB, 0xD8, 0x07, 0xF0, 0x0E, 0x0B, 0x17, + 0xB1, 0x1E, 0x42, 0x0C, 0x1A, 0x1C, 0x37, 0x0D, 0x48, 0x1F, 0x9A, 0x24, + 0xE3, 0x1B, 0xA9, 0x22, 0x3E, 0x12, 0x44, 0x10, 0x51, 0x12, 0x3C, 0x1F, + 0xC0, 0x23, 0xD9, 0x3F, 0xBA, 0x30, 0x75, 0x42, 0x46, 0x32, 0x82, 0x40, + 0x23, 0x37, 0xD8, 0x37, 0x1C, 0x2C, 0xD6, 0x1B, 0xAF, 0x12, 0xE4, 0x06, + 0x9D, 0x05, 0x02, 0x14, 0x57, 0x15, 0x16, 0x2F, 0xE4, 0x2D, 0x74, 0x20, + 0xB9, 0x33, 0x66, 0x12, 0x82, 0x27, 0xE6, 0x1E, 0x17, 0x17, 0xA8, 0x0C, + 0xE4, 0x06, 0x32, 0xEF, 0xF0, 0x07, 0x4F, 0xF5, 0xAC, 0x1F, 0xCC, 0x0C, + 0xF5, 0x2B, 0x7E, 0x21, 0x24, 0x26, 0x50, 0x1E, 0xA8, 0x20, 0xBF, 0x0D, + 0x88, 0x13, 0x73, 0xF6, 0xA1, 0x00, 0x73, 0xF8, 0x8C, 0x0A, 0xE8, 0x0D, + 0xA7, 0x27, 0xA7, 0x09, 0xF6, 0x28, 0x1C, 0x16, 0x07, 0x02, 0xB1, 0x19, + 0xB7, 0xD5, 0x2B, 0x0A, 0x0C, 0xD3, 0xAA, 0x01, 0x25, 0xE3, 0x77, 0x04, + 0xBC, 0xE5, 0xA2, 0x0E, 0xE2, 0xF8, 0x94, 0x19, 0xAF, 0xF5, 0x43, 0x08, + 0x25, 0xD8, 0x6B, 0xEE, 0xE0, 0xE1, 0xA2, 0xF8, 0x53, 0xF4, 0x0F, 0xFF, + 0xA4, 0xE8, 0xC0, 0xFF, 0xE2, 0xF6, 0xCB, 0xFD, 0x51, 0x1D, 0x2C, 0xFF, + 0xFA, 0x17, 0xDC, 0xF3, 0x92, 0xFE, 0x5B, 0xDC, 0xDC, 0xF6, 0xD3, 0xDD, + 0xBC, 0xF8, 0x6B, 0xF0, 0x60, 0xFE, 0x3A, 0xFC, 0x9A, 0x0F, 0x3E, 0x07, + 0x9C, 0x14, 0x48, 0xFE, 0x5B, 0x08, 0xFB, 0xE5, 0x89, 0x05, 0x9E, 0xEF, + 0xA0, 0x12, 0x44, 0xF5, 0x95, 0x19, 0x2D, 0xE9, 0xE4, 0x11, 0xF0, 0xF6, + 0xBA, 0x1E, 0x21, 0x1E, 0x11, 0x13, 0x74, 0x19, 0x04, 0xF4, 0x90, 0x03, + 0x1E, 0xF8, 0x87, 0x0F, 0x57, 0x04, 0xAC, 0x0E, 0x9C, 0x10, 0xCF, 0x0E, + 0xBD, 0x16, 0xD2, 0x19, 0x30, 0x09, 0x96, 0x0F, 0x3D, 0xF2, 0x83, 0xFC, + 0xC0, 0xDB, 0x40, 0xFC, 0xA5, 0xE6, 0x1F, 0x03, 0x33, 0x0D, 0xC2, 0xFD, + 0x4E, 0x1B, 0x9E, 0xF3, 0x42, 0x0E, 0x60, 0xE3, 0x9C, 0xEC, 0x74, 0xC9, + 0x51, 0xD6, 0xF1, 0xB9, 0x7E, 0xDD, 0x36, 0xC5, 0x71, 0xDD, 0xA9, 0xCC, + 0xA7, 0xE4, 0x28, 0xDE, 0xBF, 0xF1, 0x65, 0xEC, 0xA1, 0xDF, 0xD2, 0xD3, + 0x56, 0xDB, 0x29, 0xD2, 0xD7, 0xF2, 0x87, 0xDE, 0xF8, 0xE8, 0xD7, 0xDA, + 0xF9, 0xDF, 0x34, 0xDE, 0x01, 0xF3, 0x40, 0xDD, 0x5D, 0xEF, 0x23, 0xD3, + 0xAC, 0xDD, 0x11, 0xD6, 0x23, 0xD8, 0xF0, 0xDE, 0x70, 0xD9, 0x02, 0xE6, + 0x98, 0xD5, 0xCA, 0xEB, 0xD3, 0xDE, 0xD8, 0xF7, 0x47, 0xE8, 0x7F, 0x11, + 0xE2, 0xDD, 0x4B, 0x14, 0xA4, 0xD8, 0xBB, 0xED, 0x2A, 0xE7, 0xCB, 0xD9, + 0xFF, 0xFB, 0xD9, 0xE9, 0xAE, 0xF5, 0xA6, 0xEF, 0xCD, 0xED, 0x7A, 0xDC, + 0x73, 0xEC, 0x66, 0xD5, 0x51, 0xDE, 0x48, 0xD3, 0x55, 0xD5, 0x07, 0xC4, + 0x35, 0xDA, 0xC7, 0xD1, 0x6B, 0xE5, 0x7B, 0xD9, 0x90, 0xF1, 0x36, 0xDC, + 0xA4, 0xF1, 0x25, 0xD6, 0x17, 0xE5, 0x2C, 0xBD, 0xAF, 0xD8, 0x3C, 0xC7, + 0xC4, 0xDD, 0x56, 0xDA, 0xA3, 0x05, 0x7A, 0xDB, 0x1A, 0x1F, 0xE5, 0xDF, + 0x6E, 0x13, 0x03, 0xF5, 0x58, 0xFE, 0x1E, 0xEE, 0xD5, 0xE6, 0x7E, 0xD3, + 0xE4, 0xD0, 0x37, 0xEA, 0x7C, 0xC4, 0x4E, 0x07, 0xCC, 0xC7, 0xD2, 0xF3, + 0xF6, 0xCC, 0xAC, 0xFB, 0x43, 0xCF, 0x0C, 0x0B, 0x2E, 0xD0, 0x7C, 0xEC, + 0xE8, 0xCB, 0xE6, 0xFA, 0x8D, 0xE1, 0xEA, 0x1C, 0x88, 0xFF, 0x7D, 0x00, + 0x10, 0x0B, 0x21, 0xF0, 0x42, 0x0C, 0x7A, 0x0B, 0x21, 0x09, 0xF6, 0x03, + 0x73, 0xFF, 0x22, 0xEF, 0x6F, 0xFC, 0xDA, 0x02, 0x61, 0x0B, 0xE1, 0x10, + 0x4C, 0x18, 0x59, 0x13, 0xEA, 0x22, 0xCB, 0x20, 0x3C, 0x1A, 0xEA, 0x20, + 0xCD, 0x06, 0x2B, 0x20, 0x80, 0x11, 0x4A, 0x25, 0x4A, 0x2A, 0x40, 0x1A, + 0x51, 0x3C, 0x5C, 0x1E, 0xCF, 0x40, 0x62, 0x29, 0xA8, 0x2B, 0x5C, 0x24, + 0x01, 0x16, 0x64, 0x27, 0x7A, 0x06, 0x54, 0x28, 0x26, 0xFD, 0x7F, 0x20, + 0xF9, 0x04, 0x93, 0x1F, 0xD1, 0x15, 0xCE, 0x1D, 0x0C, 0x1F, 0x95, 0x2B, + 0x32, 0x1C, 0x5A, 0x3C, 0x44, 0x11, 0xA6, 0x2C, 0x2B, 0x06, 0x18, 0x14, + 0x7E, 0x0E, 0xA2, 0x18, 0xC0, 0x17, 0x0C, 0x2E, 0xFC, 0x1E, 0x4B, 0x25, + 0xE2, 0x18, 0xE9, 0x08, 0x51, 0xF8, 0x0A, 0xF5, 0x31, 0xEC, 0xFC, 0xF0, + 0xCD, 0xF6, 0xC3, 0xEE, 0xD9, 0xF2, 0x10, 0xEC, 0x84, 0xEE, 0x69, 0xFE, + 0x9C, 0xEC, 0x18, 0xFF, 0x47, 0xEE, 0xD9, 0xF6, 0xCB, 0x01, 0xC4, 0xFF, + 0xBC, 0x05, 0xDD, 0xFC, 0x44, 0xFA, 0x7E, 0xF5, 0x5C, 0xFD, 0x82, 0xF1, + 0xE3, 0x07, 0xD1, 0xF9, 0x11, 0x12, 0x0C, 0x09, 0x63, 0x16, 0x70, 0x0E, + 0x4C, 0x04, 0x76, 0x08, 0xD0, 0xFE, 0x20, 0xFF, 0x79, 0x05, 0xE2, 0x0C, + 0x08, 0xFF, 0x81, 0x22, 0x65, 0x05, 0xEB, 0x23, 0xF3, 0x05, 0xBC, 0x26, + 0x2B, 0xFC, 0x6F, 0x20, 0xCA, 0x00, 0x20, 0x15, 0x91, 0x00, 0x15, 0x0A, + 0x12, 0xFD, 0x79, 0xF7, 0x54, 0x0A, 0x14, 0xFB, 0x6A, 0x0C, 0xEF, 0x07, + 0x88, 0xFD, 0xC4, 0xF7, 0xE5, 0xF4, 0x67, 0xDA, 0x18, 0xF4, 0xB7, 0xDF, + 0x64, 0xFB, 0x3B, 0xF3, 0xF4, 0xFE, 0x23, 0xF5, 0x0D, 0xFB, 0x05, 0xF2, + 0xD6, 0xF8, 0x46, 0xED, 0xD0, 0xFF, 0xE1, 0xF0, 0x54, 0x02, 0x92, 0x00, + 0x35, 0xF5, 0x49, 0xF5, 0x78, 0xF9, 0x39, 0xDF, 0x73, 0x13, 0x54, 0xEB, + 0xDB, 0x07, 0xBC, 0xF5, 0x99, 0xE8, 0xD8, 0xF0, 0xC2, 0xD7, 0xC1, 0xE6, + 0xD5, 0xCB, 0xAF, 0xEC, 0x1D, 0xD5, 0xB2, 0xF3, 0xD3, 0xEB, 0xB2, 0xF9, + 0x8F, 0xED, 0x00, 0xF6, 0xA1, 0xD7, 0xBA, 0xE1, 0x80, 0xD5, 0x9D, 0xEE, + 0xD8, 0xD9, 0x51, 0xFA, 0xDE, 0xD4, 0x83, 0xF0, 0x08, 0xE5, 0xED, 0xEE, + 0xC7, 0x06, 0xFB, 0xF3, 0x26, 0x11, 0x21, 0xFB, 0xC2, 0xFC, 0x24, 0xF5, + 0x47, 0xF4, 0xE2, 0xEF, 0x12, 0xF5, 0xD0, 0x02, 0xDF, 0xFB, 0x5E, 0x0C, + 0xDD, 0x11, 0x43, 0x08, 0xB0, 0x27, 0xD4, 0x16, 0xCC, 0x20, 0xBE, 0x26, + 0x0B, 0x1D, 0xCA, 0x1D, 0xC8, 0x30, 0x45, 0x04, 0x45, 0x2D, 0x61, 0xFD, + 0x02, 0x1D, 0xDD, 0xFE, 0xA6, 0x1E, 0xE4, 0xFB, 0x09, 0x2D, 0x27, 0x12, + 0x4E, 0x2F, 0x6C, 0x24, 0xF1, 0x28, 0x65, 0x19, 0x77, 0x26, 0x62, 0x11, + 0x07, 0x23, 0x5F, 0x14, 0xFC, 0x1A, 0x32, 0x14, 0x98, 0x11, 0x63, 0x17, + 0xA6, 0x09, 0xD5, 0x2B, 0xCF, 0x12, 0xFF, 0x2C, 0x6E, 0x26, 0xB8, 0x1D, + 0x2D, 0x33, 0xF9, 0x13, 0x29, 0x39, 0x02, 0x01, 0xD4, 0x22, 0xB0, 0x07, + 0xD5, 0x00, 0x65, 0x13, 0xAD, 0xF2, 0xED, 0x09, 0x2A, 0xF4, 0x6B, 0xFB, + 0x9D, 0x04, 0x5F, 0xF3, 0xED, 0x0E, 0x36, 0xFF, 0x59, 0x03, 0x7E, 0x0C, + 0x6B, 0xEE, 0x79, 0xFA, 0x75, 0xF1, 0x80, 0xE7, 0x79, 0x0D, 0xC4, 0xFB, + 0xE5, 0x15, 0xD5, 0x02, 0x47, 0x08, 0x51, 0xF6, 0x1C, 0xFF, 0xEA, 0x05, + 0xF1, 0x03, 0x68, 0x0D, 0xA4, 0x0C, 0x53, 0x0A, 0x67, 0x0A, 0x7D, 0x26, + 0xA8, 0x03, 0x44, 0x36, 0x78, 0xF9, 0x17, 0x36, 0xA1, 0x03, 0x5B, 0x3A, + 0x67, 0x22, 0x5C, 0x3E, 0x14, 0x32, 0x04, 0x39, 0x32, 0x2B, 0x37, 0x2A, + 0x9F, 0x20, 0x4D, 0x35, 0x3E, 0x19, 0x81, 0x1F, 0x54, 0x0E, 0x25, 0xF3, + 0xC5, 0x0A, 0x62, 0xF9, 0xA3, 0x09, 0xCB, 0x19, 0xAB, 0x0B, 0x6E, 0x14, + 0xE4, 0x15, 0x8E, 0xEC, 0xD7, 0x14, 0x09, 0xF2, 0xB2, 0x0D, 0x0E, 0x09, + 0xD2, 0x0C, 0xCA, 0xF9, 0x2C, 0x14, 0x4E, 0xE6, 0x00, 0x18, 0x52, 0xEC, + 0xFA, 0x10, 0x7F, 0xFF, 0xA6, 0x0E, 0xF8, 0x07, 0x87, 0x1B, 0x22, 0x00, + 0x7A, 0x20, 0x2E, 0xFD, 0x67, 0x08, 0x67, 0xF6, 0x35, 0xF6, 0x8B, 0xEE, + 0xEE, 0x01, 0xCF, 0x00, 0xA2, 0x04, 0x20, 0x06, 0x34, 0xE9, 0x8F, 0xF0, + 0x0F, 0xDA, 0x4D, 0xDE, 0xE3, 0xDA, 0x37, 0xE1, 0xE3, 0xDF, 0xA2, 0xDF, + 0x3F, 0xED, 0xAD, 0xED, 0xB3, 0xF2, 0xAB, 0x12, 0xD2, 0xF0, 0x15, 0x06, + 0x6E, 0xF1, 0x54, 0xEC, 0xB1, 0xEF, 0x78, 0xF2, 0x84, 0xE6, 0x71, 0xF8, + 0xD2, 0xDF, 0x23, 0xF5, 0x3B, 0xD7, 0xBB, 0x08, 0x5F, 0xD3, 0xF0, 0x11, + 0xD4, 0xDC, 0x7B, 0x02, 0xAE, 0xE8, 0x98, 0x0A, 0x40, 0xF9, 0x5D, 0x18, + 0x1E, 0x08, 0x79, 0x11, 0x35, 0x0F, 0x41, 0x06, 0xFE, 0x0F, 0xDB, 0x00, + 0x8D, 0x0E, 0xFA, 0xF7, 0x20, 0x00, 0xC4, 0xF9, 0xCF, 0xF7, 0x1C, 0xFF, + 0x43, 0x05, 0x88, 0xE2, 0x8A, 0xF8, 0x23, 0xD0, 0x4D, 0xE7, 0x42, 0xF4, + 0xD1, 0xE2, 0x64, 0x03, 0x5F, 0xD3, 0x77, 0xE7, 0x12, 0xE0, 0x2E, 0xEA, + 0x64, 0xFA, 0x0F, 0x05, 0xC7, 0x00, 0xDA, 0x03, 0xB3, 0xF8, 0x3A, 0xF1, + 0xAA, 0xE6, 0x93, 0xE8, 0x58, 0xDA, 0xA4, 0xF2, 0xBF, 0xDE, 0xA5, 0xF3, + 0xDF, 0xEB, 0x8E, 0xDB, 0x77, 0xEC, 0xA9, 0xD6, 0xFA, 0xE4, 0x4B, 0xDE, + 0x2E, 0xDF, 0x43, 0xDC, 0x0F, 0xD9, 0x38, 0xCD, 0x0B, 0xE1, 0x72, 0xC8, + 0x5A, 0xE7, 0xFA, 0xD6, 0x33, 0xD5, 0xB2, 0xD5, 0x62, 0xC6, 0xDA, 0xCC, + 0x49, 0xD6, 0x44, 0xC3, 0x65, 0xE2, 0x7F, 0xD0, 0x7F, 0xDD, 0x6E, 0xF2, + 0x72, 0xE3, 0x11, 0xF5, 0xF7, 0xEC, 0x84, 0xF1, 0x95, 0xF3, 0x3B, 0xFF, + 0x6A, 0xF6, 0x1E, 0x05, 0xF0, 0xE7, 0x6A, 0x08, 0xCB, 0xE3, 0x88, 0x19, + 0x1D, 0xF7, 0x4D, 0x2D, 0xC6, 0x09, 0x2B, 0x2A, 0xC3, 0x16, 0x53, 0x1F, + 0x67, 0x1D, 0x71, 0x28, 0x94, 0x21, 0x79, 0x28, 0x2E, 0x1C, 0x4B, 0x1C, + 0x35, 0x13, 0x4D, 0x13, 0x1E, 0x0C, 0xC8, 0x07, 0xDB, 0x0A, 0x9A, 0x03, + 0x30, 0x14, 0x9E, 0xFC, 0x8B, 0x0E, 0xC3, 0xFF, 0x0A, 0xF8, 0xDE, 0xFC, + 0x66, 0xE8, 0x6B, 0xF1, 0x8E, 0xE5, 0x7B, 0x06, 0x93, 0xF1, 0x48, 0x1D, + 0x8C, 0x06, 0xD2, 0x05, 0xEE, 0x14, 0x64, 0xED, 0x10, 0x1B, 0xF0, 0x06, + 0xE1, 0x1B, 0x80, 0x0A, 0x79, 0x1F, 0x14, 0xF1, 0xE1, 0x1E, 0xA4, 0xFB, + 0xE9, 0x15, 0x18, 0x0C, 0x97, 0x02, 0x4A, 0xFA, 0x8A, 0xE9, 0x71, 0xE7, + 0xCE, 0xD8, 0xA3, 0xEE, 0xC2, 0xDC, 0xFA, 0xF2, 0xDF, 0xE5, 0x6B, 0xE3, + 0xF5, 0xE5, 0x00, 0xE2, 0x1F, 0xE0, 0xD0, 0xDF, 0xFE, 0xD2, 0xD9, 0xD5, + 0xB6, 0xD8, 0x60, 0xEA, 0x56, 0xE6, 0x9D, 0x02, 0xA2, 0xF5, 0x01, 0x01, + 0x05, 0x04, 0xDB, 0xFE, 0x56, 0x12, 0xA4, 0x0E, 0x25, 0x19, 0x33, 0xFF, + 0xD5, 0xF5, 0x79, 0xE3, 0xA9, 0xD9, 0x96, 0xF0, 0xC4, 0xE9, 0xD0, 0x0B, + 0xA2, 0x01, 0x62, 0x04, 0xBE, 0x10, 0xC4, 0x00, 0xD9, 0x23, 0x00, 0x27, + 0xC7, 0x24, 0x75, 0x29, 0xFD, 0x0E, 0x98, 0x0B, 0xC0, 0x10, 0x70, 0x11, + 0x48, 0x22, 0xA6, 0x24, 0xB0, 0x1B, 0x68, 0x16, 0xE5, 0x04, 0x5C, 0x13, + 0xC3, 0x08, 0x71, 0x26, 0xCA, 0x17, 0x01, 0x20, 0x49, 0x0C, 0x75, 0x07, + 0x72, 0x07, 0x13, 0xFD, 0x06, 0x0B, 0x73, 0xFE, 0x8C, 0x07, 0xA1, 0x05, + 0xCE, 0x0E, 0x31, 0x11, 0x48, 0x15, 0x65, 0x1A, 0x81, 0x1F, 0xD9, 0x16, + 0xFC, 0x2E, 0x30, 0xFF, 0x13, 0x2D, 0xC1, 0xF9, 0x48, 0x2B, 0xEB, 0x00, + 0x4A, 0x17, 0x95, 0xF2, 0x7C, 0xEB, 0x8D, 0xDB, 0x58, 0xD9, 0xD5, 0xD1, + 0x4F, 0xD7, 0x29, 0xC6, 0x90, 0xEE, 0xFB, 0xC4, 0x77, 0x07, 0x47, 0xD8, + 0xA8, 0x04, 0x26, 0xDC, 0xCB, 0xF5, 0xF7, 0xDB, 0x23, 0xDE, 0x37, 0xF2, + 0x51, 0xE9, 0xDD, 0x0B, 0xB6, 0x0A, 0x39, 0x09, 0x5C, 0x11, 0x8F, 0xFB, + 0x62, 0x0A, 0x6C, 0x05, 0xFC, 0x0D, 0xD0, 0x0F, 0xE2, 0x07, 0xEE, 0x09, + 0x03, 0xED, 0x1E, 0x0C, 0x53, 0xE4, 0x69, 0x0A, 0xCC, 0xE8, 0x4D, 0x05, + 0xB9, 0xEE, 0xFE, 0x16, 0xC3, 0x06, 0x05, 0x27, 0x6D, 0x19, 0x9E, 0x1F, + 0xA6, 0x0F, 0x71, 0x1D, 0x66, 0x08, 0x22, 0x2F, 0x7E, 0x07, 0x2B, 0x1D, + 0xE6, 0x03, 0xE4, 0xF6, 0x2A, 0x0A, 0xFB, 0x01, 0x5D, 0x0D, 0x8F, 0x10, + 0x20, 0x0D, 0xF4, 0x02, 0xB6, 0x10, 0xDF, 0xFD, 0xA4, 0x0B, 0x9F, 0xFE, + 0xF7, 0x07, 0xF0, 0xF1, 0x0B, 0x10, 0xD8, 0xF1, 0xE6, 0x0E, 0x25, 0xFB, + 0xE1, 0x10, 0x89, 0xFB, 0xD3, 0x10, 0xE8, 0x07, 0xF4, 0x0E, 0xCF, 0x0C, + 0x20, 0x1E, 0xB7, 0xFF, 0xC0, 0x26, 0x51, 0xF0, 0x37, 0x2A, 0x44, 0xF8, + 0x5A, 0x18, 0x1F, 0x0B, 0xD8, 0x05, 0xE8, 0xFE, 0xDF, 0x0A, 0x7D, 0xED, + 0xAB, 0xFC, 0x79, 0xF2, 0x15, 0xE4, 0xA9, 0xFB, 0x5E, 0xE6, 0x10, 0x08, + 0xB2, 0xED, 0xBA, 0x04, 0x79, 0xF3, 0xAE, 0x04, 0x05, 0x05, 0x1C, 0x14, + 0xA0, 0x0F, 0xB2, 0x07, 0x53, 0x0E, 0x62, 0x06, 0x6E, 0x0C, 0xA3, 0x0A, + 0x1B, 0x12, 0xC8, 0x08, 0x97, 0x03, 0x2A, 0x0B, 0xB3, 0xF3, 0x65, 0x02, + 0xCC, 0xED, 0x30, 0x0B, 0x57, 0xE5, 0x61, 0x11, 0xD0, 0xF8, 0xDF, 0x04, + 0x13, 0x11, 0x8F, 0x0E, 0x45, 0x1F, 0x39, 0x1C, 0xC4, 0x2C, 0xF1, 0x16, + 0xA3, 0x2C, 0x35, 0x24, 0x1A, 0x1E, 0xDB, 0x2D, 0xB4, 0x19, 0xEF, 0x14, + 0x03, 0x18, 0xE5, 0x0A, 0x4E, 0x08, 0xD3, 0x11, 0xF7, 0xFA, 0x99, 0x0B, + 0x0A, 0xE7, 0xC9, 0x0E, 0xFA, 0xDF, 0x50, 0x10, 0xB1, 0xDC, 0x75, 0x03, + 0x42, 0xD8, 0x35, 0x10, 0xC6, 0xE1, 0x88, 0x15, 0x74, 0xEF, 0x3F, 0xF3, + 0x17, 0xFD, 0x4F, 0xED, 0x19, 0x02, 0x07, 0xFB, 0xED, 0x09, 0xEB, 0xF5, + 0x73, 0xFD, 0x09, 0xEF, 0x72, 0xEE, 0x47, 0xDF, 0x52, 0xF8, 0xD7, 0xC7, + 0x6B, 0xED, 0x56, 0xC7, 0x6A, 0xD9, 0x6B, 0xD7, 0x43, 0xCE, 0x93, 0xD4, + 0xAA, 0xBB, 0x1A, 0xC2, 0x17, 0xBB, 0xFC, 0xB4, 0x45, 0xD0, 0x53, 0xBB, + 0xF7, 0xCE, 0x67, 0xC8, 0x13, 0xCA, 0x60, 0xCC, 0x9D, 0xD9, 0x34, 0xD2, + 0x31, 0xE6, 0x2D, 0xDD, 0x7F, 0xF0, 0xE6, 0xE3, 0x11, 0xFB, 0x62, 0xF3, + 0x25, 0xF6, 0x6F, 0x04, 0xD2, 0xE6, 0xCF, 0xFC, 0x2C, 0xDC, 0x06, 0xEC, + 0xC0, 0xD6, 0x05, 0xF5, 0xB3, 0xD6, 0x4E, 0x01, 0x6C, 0xEB, 0x09, 0x02, + 0xF8, 0x00, 0x81, 0x13, 0xF9, 0xFE, 0x0A, 0x24, 0xA5, 0x04, 0x53, 0x20, + 0x84, 0x12, 0x5C, 0x15, 0x8A, 0x05, 0x05, 0x06, 0x24, 0xF5, 0x06, 0xF6, + 0xD9, 0xF0, 0xF0, 0xF8, 0xBF, 0xF3, 0xE7, 0xF9, 0x56, 0xFF, 0xE2, 0xF7, + 0xD4, 0xEB, 0x82, 0xFD, 0xDA, 0xD2, 0xB7, 0xF9, 0xB8, 0xE2, 0xE4, 0xEB, + 0xB7, 0xFC, 0x51, 0xE9, 0x10, 0x12, 0xA0, 0xEF, 0x57, 0x25, 0x07, 0xF2, + 0x12, 0x39, 0x6E, 0xF7, 0x1E, 0x3E, 0xCD, 0xFD, 0x1D, 0x31, 0xFE, 0x00, + 0xCA, 0x1C, 0xE5, 0x01, 0xA9, 0x0D, 0x3E, 0x08, 0x56, 0xFD, 0xCB, 0x05, + 0x85, 0xE8, 0xEF, 0x01, 0x15, 0xE5, 0x9D, 0xFF, 0x2C, 0xE7, 0x3D, 0xF3, + 0xDD, 0xE5, 0x1D, 0xFA, 0xF9, 0xDF, 0x61, 0x0B, 0x67, 0xE3, 0x6D, 0x05, + 0x10, 0xF7, 0x87, 0x04, 0xF8, 0x06, 0x4B, 0x13, 0x21, 0x08, 0x37, 0x11, + 0x57, 0x05, 0x70, 0x0C, 0x3E, 0x08, 0xB7, 0x06, 0xF1, 0x14, 0xEF, 0xFD, + 0xB0, 0x15, 0x86, 0xF7, 0xC3, 0x08, 0xEF, 0xE6, 0xFC, 0x03, 0x4D, 0xEC, + 0x1E, 0xF7, 0xC0, 0x06, 0xCE, 0xEC, 0x5F, 0x0C, 0xC7, 0x0D, 0x8F, 0x0B, + 0x9A, 0x3D, 0xC1, 0x15, 0x53, 0x47, 0xEC, 0x20, 0xE5, 0x3A, 0x1A, 0x20, + 0x76, 0x25, 0x72, 0x17, 0xF6, 0x0B, 0x67, 0x02, 0xB4, 0x00, 0x63, 0xF4, + 0x13, 0x06, 0xA2, 0x06, 0xE5, 0x0C, 0x72, 0x0E, 0x3F, 0x04, 0x9D, 0xFE, + 0x79, 0xF7, 0xD1, 0xF3, 0x0F, 0xF8, 0x6B, 0x01, 0x06, 0xFE, 0x55, 0x0F, + 0xAA, 0xFC, 0xC9, 0x0F, 0x16, 0x0A, 0x8B, 0x12, 0x6B, 0x16, 0x68, 0x19, + 0x46, 0x10, 0x3C, 0x19, 0xF2, 0x14, 0xB4, 0x03, 0x38, 0x0F, 0xCE, 0xEE, + 0x38, 0xED, 0x39, 0xE5, 0xC2, 0xE0, 0xE7, 0xE7, 0xF3, 0xE1, 0x20, 0xD5, + 0xB7, 0xD7, 0x81, 0xC7, 0xB7, 0xDF, 0x76, 0xD3, 0xD9, 0xE5, 0x4C, 0xC9, + 0xC1, 0xD5, 0x64, 0xC5, 0xBD, 0xDE, 0xED, 0xC5, 0x74, 0xFC, 0x34, 0xC1, + 0xEE, 0x00, 0xC9, 0xCD, 0xA1, 0xEC, 0x7C, 0xDE, 0x24, 0xE9, 0x07, 0xDF, + 0x74, 0xE7, 0x72, 0xD2, 0x48, 0xDD, 0xDF, 0xD8, 0xB6, 0xE7, 0x55, 0xF6, + 0xAB, 0xDB, 0xF9, 0xF8, 0xA7, 0xD0, 0xEB, 0xF0, 0x59, 0xE2, 0x18, 0x06, + 0x47, 0xE8, 0x3D, 0x1D, 0xD9, 0xF6, 0xB6, 0x28, 0x45, 0x06, 0x86, 0x2D, + 0xAE, 0x05, 0x1A, 0x32, 0x7B, 0xFF, 0x76, 0x23, 0x57, 0x09, 0xC2, 0x11, + 0x2B, 0x09, 0xDC, 0x0B, 0xF6, 0xED, 0x7B, 0xFA, 0x40, 0xDF, 0xC0, 0xED, + 0x5F, 0xE5, 0xEF, 0xE7, 0x7D, 0xFB, 0x4A, 0xE2, 0xBD, 0x05, 0xB1, 0xE4, + 0xB2, 0xFF, 0x6B, 0xEB, 0x82, 0xF0, 0x84, 0xEE, 0x2A, 0x03, 0x47, 0xF0, + 0x52, 0x23, 0x83, 0xF4, 0xB5, 0x24, 0xBB, 0xFA, 0xBC, 0x20, 0xDD, 0xFD, + 0x90, 0x0E, 0xA0, 0xFE, 0xA5, 0x01, 0x9D, 0x0A, 0x9B, 0x0C, 0x04, 0x0D, + 0x92, 0x25, 0xA9, 0x11, 0x4B, 0x2F, 0xA1, 0x16, 0x27, 0x1B, 0x90, 0xF5, + 0x9D, 0x05, 0xAC, 0xF5, 0x9A, 0x03, 0xF0, 0x18, 0xA3, 0x03, 0x5E, 0x0F, + 0x9D, 0xF2, 0x6B, 0x09, 0x60, 0xF2, 0x8F, 0x09, 0xE0, 0x05, 0x69, 0xF6, + 0x7D, 0x0C, 0x9F, 0x07, 0xD1, 0x08, 0x04, 0x1C, 0xDB, 0x02, 0x0C, 0x0E, + 0xB2, 0xFE, 0x28, 0x0E, 0x7E, 0x03, 0x29, 0x1D, 0x51, 0x05, 0xC4, 0x2C, + 0x97, 0x07, 0xA9, 0x2E, 0x94, 0x17, 0x34, 0x1B, 0xED, 0x2B, 0x36, 0x15, + 0xE6, 0x38, 0x3F, 0x38, 0xA0, 0x48, 0xB0, 0x57, 0x45, 0x5A, 0x74, 0x46, + 0x6B, 0x5E, 0x87, 0x3F, 0x2B, 0x53, 0x04, 0x49, 0x07, 0x3A, 0xB5, 0x40, + 0x2C, 0x28, 0x1A, 0x33, 0x99, 0x20, 0xF9, 0x2A, 0xE5, 0x18, 0xA0, 0x20, + 0x53, 0x25, 0xA7, 0x16, 0x2C, 0x2C, 0x62, 0x18, 0x0B, 0x19, 0xDF, 0x1D, + 0x38, 0x0E, 0xDD, 0x33, 0x88, 0x18, 0xA7, 0x45, 0xE0, 0x2B, 0xC3, 0x4B, + 0x33, 0x3C, 0x7D, 0x54, 0x61, 0x35, 0x8B, 0x58, 0xCE, 0x1E, 0xA5, 0x48, + 0x78, 0x16, 0x33, 0x29, 0x85, 0x15, 0xB2, 0x27, 0x28, 0x14, 0x8E, 0x34, + 0xA4, 0x0B, 0xFC, 0x32, 0x62, 0x11, 0xBD, 0x26, 0xF1, 0x2E, 0x77, 0x07, + 0xB0, 0x2C, 0x30, 0xF0, 0x4C, 0x0B, 0x78, 0xF9, 0xA4, 0x05, 0xB0, 0xF5, + 0xB9, 0x08, 0x37, 0xEB, 0x25, 0xF9, 0x79, 0xEF, 0x68, 0x02, 0x4C, 0xE9, + 0xF8, 0x0E, 0x8E, 0xEB, 0x0E, 0x10, 0xCE, 0xE8, 0xEB, 0x0A, 0x54, 0xF9, + 0x67, 0x03, 0x19, 0x12, 0xF7, 0x12, 0x68, 0x02, 0x57, 0x1A, 0x80, 0xFF, + 0xFF, 0x1D, 0xFD, 0x10, 0x34, 0x23, 0xF4, 0x22, 0x94, 0x23, 0xBB, 0x34, + 0x25, 0x38, 0x09, 0x48, 0x09, 0x3F, 0x2E, 0x47, 0xDF, 0x2B, 0x6A, 0x42, + 0xB3, 0x1E, 0xCC, 0x42, 0xF2, 0x0B, 0xB8, 0x2B, 0x59, 0xF8, 0x63, 0x0E, + 0x23, 0xF5, 0xC6, 0x00, 0x0F, 0xFA, 0x22, 0xFA, 0xDD, 0xF0, 0x27, 0xF4, + 0x52, 0xE6, 0x9B, 0x06, 0x92, 0xEF, 0xC0, 0x09, 0x62, 0xF5, 0xFA, 0xF0, + 0x59, 0xFB, 0x34, 0xF1, 0x61, 0xFF, 0x33, 0xFC, 0x3F, 0xFB, 0x83, 0x06, + 0xE4, 0x0C, 0x2B, 0xFF, 0x74, 0x15, 0xCE, 0xE2, 0x2E, 0xFF, 0xC7, 0xDD, + 0x15, 0xEC, 0xCE, 0xF3, 0xC5, 0xD5, 0xE6, 0x03, 0xD6, 0xDA, 0x97, 0xF4, + 0x8E, 0xE9, 0xB5, 0xDF, 0x78, 0xE0, 0xE0, 0xDC, 0x7D, 0xE2, 0xE5, 0xE0, + 0xE0, 0xE7, 0xAD, 0xE3, 0x3C, 0xE6, 0xC4, 0xDD, 0x2A, 0xD1, 0xF6, 0xC8, + 0x61, 0xB6, 0xE1, 0xB8, 0xA6, 0xB8, 0xAF, 0xCA, 0xD1, 0xB5, 0x43, 0xD4, + 0x35, 0xA4, 0x6A, 0xCD, 0x05, 0xBA, 0x7F, 0xD8, 0xA9, 0xCE, 0x01, 0xD2, + 0xC9, 0xC3, 0x60, 0xCA, 0xE5, 0xC5, 0x48, 0xDF, 0x2E, 0xCC, 0xE4, 0xE1, + 0x91, 0xD1, 0x7E, 0xDB, 0x16, 0xE6, 0x87, 0xEB, 0x2C, 0xF8, 0x89, 0xEE, + 0x90, 0x03, 0xC9, 0xEE, 0xD0, 0x03, 0x68, 0xEF, 0x02, 0x03, 0x64, 0xE1, + 0xD4, 0x01, 0x2E, 0xDA, 0x37, 0xEB, 0xDC, 0xD6, 0xF7, 0xDF, 0xB8, 0xCE, + 0x55, 0xEB, 0x4F, 0xC9, 0x0F, 0xF7, 0x48, 0xCF, 0x43, 0xFB, 0xFE, 0xCB, + 0x3E, 0xF9, 0x2D, 0xCA, 0x04, 0xF5, 0x5B, 0xDA, 0x6F, 0xEC, 0x43, 0xF7, + 0xC0, 0xE3, 0x01, 0xFA, 0x30, 0xE3, 0xF3, 0xE7, 0x54, 0xEC, 0xF8, 0xF6, + 0x83, 0xEE, 0x37, 0x07, 0xD4, 0xE9, 0xAD, 0x02, 0x91, 0xE7, 0xCC, 0xF9, + 0x58, 0xDC, 0x72, 0xF8, 0xBC, 0xD0, 0xE5, 0xEE, 0x42, 0xDE, 0x34, 0xEE, + 0xF4, 0xE0, 0xED, 0xF9, 0xB1, 0xDB, 0x5E, 0xE5, 0x0C, 0xF0, 0xF3, 0xCE, + 0x31, 0xEF, 0xA4, 0xD2, 0xF7, 0xDE, 0x19, 0xCD, 0xFE, 0xDB, 0x8F, 0xC4, + 0xB5, 0xD9, 0x5D, 0xC1, 0x01, 0xE6, 0x9C, 0xC3, 0x27, 0xE7, 0xCE, 0xCE, + 0x76, 0xE0, 0x0D, 0xCB, 0xD3, 0xEE, 0x11, 0xD1, 0x82, 0xEC, 0xD8, 0xE8, + 0xD2, 0xE4, 0xCD, 0xF4, 0xE2, 0xF6, 0xEA, 0xF0, 0x52, 0x02, 0x0D, 0xF5, + 0x47, 0x07, 0x98, 0x14, 0x2B, 0x11, 0x96, 0x1F, 0x95, 0x16, 0x08, 0x12, + 0xEF, 0x1B, 0xFA, 0x15, 0xAD, 0x20, 0xC4, 0x20, 0x0F, 0x22, 0xE6, 0x16, + 0x3F, 0x1A, 0xDB, 0x10, 0x5C, 0x0B, 0x9F, 0x1E, 0xB6, 0xF9, 0x7F, 0x19, + 0x26, 0xF1, 0x73, 0x0D, 0x22, 0x02, 0x11, 0x03, 0x12, 0x0F, 0xEE, 0xFF, + 0x4A, 0x03, 0xAE, 0x01, 0x5B, 0x02, 0x8C, 0xF7, 0xFE, 0x0C, 0x35, 0xFE, + 0x86, 0x0C, 0xB1, 0x03, 0x11, 0x11, 0x23, 0x06, 0x24, 0x17, 0x6B, 0x0D, + 0x47, 0x1A, 0xDB, 0x0A, 0x9C, 0x23, 0xEA, 0x10, 0x98, 0x18, 0xDF, 0x0F, + 0x43, 0x10, 0x7D, 0x04, 0xB1, 0x28, 0xDA, 0xFF, 0xB1, 0x24, 0xAE, 0x0C, + 0xD6, 0x12, 0x8A, 0x15, 0x06, 0x17, 0xB5, 0x0B, 0xC3, 0x0A, 0x15, 0x04, + 0x2F, 0xF7, 0x8B, 0x17, 0x87, 0xF5, 0x53, 0x1D, 0x07, 0xF1, 0x3B, 0x0C, + 0xB3, 0xF2, 0x98, 0x14, 0x17, 0x1C, 0x7C, 0x09, 0x11, 0x18, 0x1E, 0x0C, + 0x81, 0xF7, 0x57, 0x1B, 0x29, 0x06, 0x8E, 0x13, 0x7A, 0x07, 0x04, 0x1C, + 0x93, 0x03, 0x02, 0x29, 0x45, 0x12, 0x65, 0x25, 0xC1, 0x17, 0x38, 0x2A, + 0xE9, 0x11, 0xEC, 0x31, 0x92, 0x18, 0xF0, 0x25, 0x4F, 0x3E, 0xF8, 0x23, + 0xBA, 0x53, 0x74, 0x2D, 0x28, 0x43, 0x2D, 0x40, 0xDB, 0x45, 0x86, 0x3E, + 0x42, 0x42, 0x69, 0x20, 0x76, 0x2C, 0xDB, 0x15, 0xD2, 0x1F, 0xCF, 0x12, + 0xE7, 0x14, 0xF1, 0x06, 0x63, 0x12, 0x84, 0x00, 0xFF, 0x15, 0x94, 0x0B, + 0xCC, 0x1B, 0xE5, 0x10, 0x77, 0x19, 0xCA, 0x1A, 0x4F, 0x20, 0x9D, 0x32, + 0xBE, 0x35, 0xD8, 0x3C, 0xFD, 0x35, 0x3F, 0x38, 0xC2, 0x28, 0x96, 0x32, + 0xEA, 0x1C, 0x3D, 0x2B, 0x7F, 0x0E, 0xDF, 0x18, 0xAD, 0xFC, 0x1A, 0x14, + 0xC1, 0xF6, 0xEA, 0x1E, 0x50, 0x0C, 0xF2, 0x11, 0x1B, 0x17, 0x62, 0xFA, + 0x62, 0x0C, 0xA2, 0x08, 0xF3, 0xF8, 0xAF, 0x0D, 0xCC, 0xE6, 0xA9, 0xFB, + 0x07, 0xE3, 0x84, 0xFD, 0x3B, 0xDE, 0xA2, 0xF1, 0x15, 0xE4, 0xF1, 0xE5, + 0x71, 0xFE, 0x4D, 0xFA, 0x51, 0x02, 0x83, 0x08, 0x5E, 0xF8, 0x9E, 0xFC, + 0xE7, 0xFD, 0x83, 0xF2, 0xFE, 0xF5, 0x86, 0xF4, 0x43, 0xFE, 0x8B, 0x0A, + 0xEF, 0x10, 0x4D, 0x1A, 0x06, 0x0C, 0x4D, 0x0B, 0x4A, 0x15, 0x50, 0x0C, + 0x72, 0x22, 0xF4, 0x1B, 0xD3, 0x2C, 0x93, 0x2C, 0x67, 0x30, 0x08, 0x43, + 0x1C, 0x27, 0xD0, 0x3A, 0xEF, 0x25, 0x2E, 0x1F, 0x7D, 0x23, 0xD2, 0x18, + 0x11, 0x16, 0x36, 0x22, 0x50, 0x07, 0xE2, 0x19, 0x61, 0x0C, 0x75, 0xFF, + 0x8D, 0x15, 0x49, 0xF6, 0x6D, 0x0E, 0x58, 0x19, 0x29, 0x05, 0xB8, 0x25, + 0x2C, 0xF5, 0x3B, 0x17, 0xB2, 0xF4, 0x3D, 0x24, 0xFD, 0x17, 0x60, 0x16, + 0x11, 0x33, 0x9D, 0x12, 0x8B, 0x2F, 0xA5, 0x2A, 0xBD, 0x23, 0xA6, 0x1F, + 0x5D, 0x15, 0xEC, 0x01, 0x7A, 0x00, 0xF8, 0xFD, 0x5E, 0x00, 0xBA, 0x01, + 0x55, 0x13, 0x8D, 0xF5, 0xC4, 0x0A, 0xB5, 0xF7, 0x68, 0xF7, 0xEF, 0xFD, + 0xA5, 0xF7, 0xAF, 0xF2, 0x0D, 0xF6, 0x1A, 0xDE, 0xD6, 0xDD, 0x25, 0xE4, + 0xC0, 0xD9, 0xDA, 0xF2, 0x6B, 0xED, 0x9A, 0xE0, 0x6D, 0xDE, 0x65, 0xD7, + 0x97, 0xC9, 0xCA, 0xEB, 0x6F, 0xC7, 0x0F, 0xF5, 0x64, 0xC9, 0xD6, 0xE1, + 0xA2, 0xC4, 0xB8, 0xDB, 0xC4, 0xCA, 0xA0, 0xDF, 0x5E, 0xED, 0xDB, 0xE3, + 0xEE, 0xF2, 0x61, 0xE6, 0xD7, 0xDE, 0x88, 0xE4, 0x20, 0xE4, 0x94, 0xE6, + 0x7B, 0xED, 0x83, 0xE5, 0x97, 0xFE, 0xC0, 0xF3, 0xC9, 0x1B, 0x9D, 0xFC, + 0xED, 0x1C, 0x9A, 0xFD, 0x33, 0x02, 0x4E, 0xF2, 0x66, 0xEF, 0xD2, 0xEC, + 0x42, 0xF6, 0x9D, 0xED, 0x98, 0xF0, 0x94, 0xE1, 0xA7, 0xE1, 0x66, 0xDA, + 0x49, 0xF0, 0xA2, 0xD5, 0xC5, 0xF7, 0x3E, 0xDF, 0x4A, 0xF2, 0x2E, 0xF3, + 0x8F, 0xF3, 0x0C, 0xF2, 0x5F, 0xF2, 0x73, 0xDA, 0x0C, 0xF8, 0xA7, 0xF0, + 0x0D, 0x07, 0x10, 0x0C, 0x2A, 0x18, 0xAC, 0xEC, 0xD5, 0x0D, 0x30, 0xD5, + 0xE0, 0xE6, 0xF1, 0xDE, 0x8C, 0xD9, 0x7F, 0xE1, 0xCC, 0xDF, 0xE1, 0xD7, + 0x78, 0xE6, 0x8D, 0xD1, 0x70, 0xE9, 0xCC, 0xBF, 0xD0, 0xDE, 0x84, 0xC4, + 0x8C, 0xC9, 0x36, 0xD1, 0xBF, 0xB3, 0x4E, 0xC9, 0xEE, 0xB3, 0x1E, 0xCC, + 0x39, 0xC7, 0x28, 0xCE, 0x0C, 0xD1, 0xC2, 0xCD, 0xE0, 0xD1, 0x15, 0xD1, + 0x37, 0xD2, 0x74, 0xD2, 0x6C, 0xBE, 0x08, 0xD2, 0x93, 0xB4, 0x08, 0xDF, + 0x60, 0xD4, 0x41, 0xE3, 0x1B, 0xEF, 0x5A, 0xDA, 0x3B, 0xE9, 0xB1, 0xE9, + 0x04, 0xE9, 0x1F, 0xF5, 0x0F, 0xFA, 0x07, 0xE8, 0xC9, 0xFF, 0x49, 0xF5, + 0x7E, 0x03, 0xBB, 0x10, 0x7E, 0x11, 0x32, 0x15, 0x4B, 0x07, 0x46, 0x14, + 0x41, 0xFD, 0x86, 0x17, 0x16, 0x09, 0xED, 0x0D, 0x2D, 0x00, 0x9A, 0x02, + 0x15, 0xF1, 0x99, 0x07, 0x14, 0xEB, 0x21, 0x04, 0x1E, 0xE7, 0xD7, 0xFA, + 0xF1, 0xF6, 0x7D, 0xF3, 0x38, 0x13, 0x07, 0xEF, 0xA1, 0x1D, 0x9C, 0xF3, + 0x17, 0x13, 0xEB, 0xF8, 0x52, 0x14, 0x44, 0x03, 0x3A, 0x2E, 0x2F, 0x0C, + 0xE1, 0x1E, 0x0D, 0xFC, 0x71, 0x00, 0xA9, 0xFC, 0x3E, 0x02, 0x8A, 0x11, + 0xD9, 0xFC, 0xBD, 0xF9, 0xDC, 0x0B, 0xF2, 0xDA, 0x11, 0x1B, 0x72, 0xF5, + 0xFB, 0x11, 0x7B, 0x0C, 0xE0, 0x00, 0xA8, 0xF3, 0xA1, 0xE8, 0xFB, 0xF0, + 0x44, 0xE2, 0xBD, 0xF8, 0x0C, 0xDF, 0x1D, 0xF7, 0xB5, 0xDD, 0x9E, 0x03, + 0xC1, 0xE8, 0x04, 0x08, 0xD9, 0xF4, 0xF8, 0xFD, 0x7B, 0xFD, 0xFE, 0xEC, + 0xB7, 0xF1, 0x34, 0xE7, 0x07, 0xE5, 0x0F, 0xEF, 0xCA, 0xDF, 0x5D, 0xF6, + 0xF0, 0xD0, 0xCE, 0x08, 0x87, 0xDC, 0xDB, 0x0D, 0x1A, 0xF9, 0xFA, 0xF2, + 0x05, 0xFD, 0xB5, 0xF3, 0xDF, 0x0A, 0xB4, 0x0B, 0x46, 0x1A, 0xE3, 0x1A, + 0x6D, 0x1D, 0xAB, 0x20, 0x89, 0x1C, 0xB0, 0x1E, 0xED, 0x1B, 0x65, 0x33, + 0x93, 0x1F, 0x96, 0x2F, 0x9E, 0x03, 0xA5, 0x0B, 0x7C, 0xF7, 0x76, 0x01, + 0xC7, 0x04, 0x5D, 0xFB, 0x3B, 0xF5, 0xF5, 0xE0, 0xA9, 0xE4, 0xD4, 0xD8, + 0xE7, 0xEB, 0xC9, 0xF1, 0x89, 0xF5, 0xF1, 0x00, 0x6C, 0x02, 0xD1, 0x0B, + 0xBF, 0x1C, 0x1E, 0x18, 0xBE, 0x2C, 0x61, 0x1F, 0x4B, 0x15, 0x85, 0x18, + 0xB3, 0xF2, 0x5F, 0x15, 0x3E, 0xF6, 0x97, 0x18, 0x90, 0xEA, 0x91, 0xF7, + 0xE9, 0xCF, 0x98, 0xE0, 0xE9, 0xDC, 0xE7, 0xEB, 0x23, 0xFA, 0xD0, 0xF7, + 0xEA, 0x02, 0x7D, 0xE9, 0x96, 0xFD, 0xF4, 0xE0, 0xAE, 0xF1, 0x0D, 0xE1, + 0x24, 0xDE, 0x54, 0xCF, 0x95, 0xE6, 0xD0, 0xE3, 0xD2, 0xF4, 0x0E, 0xFB, + 0x42, 0xEF, 0xAB, 0xE6, 0x1C, 0xEF, 0xCB, 0xDA, 0x4C, 0xF5, 0xC7, 0xE1, + 0x94, 0xEE, 0x1A, 0xF0, 0x97, 0xE0, 0x92, 0xF9, 0x61, 0xDD, 0x0E, 0xF0, + 0xEB, 0xF0, 0x9C, 0xFC, 0xFF, 0x13, 0x85, 0x16, 0xD5, 0x1A, 0x77, 0x13, + 0x0B, 0x1B, 0x99, 0x1F, 0x05, 0x2A, 0x7E, 0x38, 0x51, 0x36, 0xDE, 0x3F, + 0x67, 0x43, 0xE9, 0x46, 0x39, 0x43, 0x0E, 0x54, 0xEC, 0x35, 0xDE, 0x56, + 0xAF, 0x2E, 0x6D, 0x3A, 0xAF, 0x16, 0x80, 0x20, 0x1D, 0x11, 0x60, 0x16, + 0xF2, 0x1D, 0x75, 0x05, 0xB8, 0x13, 0xDC, 0x15, 0x49, 0x20, 0x6E, 0x24, + 0x94, 0x21, 0x82, 0x0F, 0x10, 0x0C, 0x4C, 0x08, 0xFC, 0x20, 0xA3, 0x1A, + 0x8A, 0x43, 0x8E, 0x35, 0x7A, 0x4B, 0x1B, 0x3B, 0xBA, 0x40, 0xF9, 0x26, + 0x53, 0x3A, 0x3C, 0x1E, 0x24, 0x2A, 0xA9, 0x23, 0xCA, 0x0E, 0xB5, 0x25, + 0x1E, 0x09, 0x4D, 0x21, 0x8A, 0x11, 0x31, 0x11, 0x17, 0x15, 0xC9, 0x0B, + 0x2F, 0x19, 0x10, 0x1E, 0x0B, 0x1F, 0xB9, 0x2D, 0xC1, 0x0C, 0x4E, 0x1F, + 0x3A, 0xF2, 0xD9, 0x12, 0x5A, 0xF4, 0x51, 0x11, 0x95, 0x0A, 0x3C, 0x05, + 0x95, 0x07, 0x7E, 0x0F, 0xEC, 0xF6, 0xAD, 0x20, 0x0A, 0xFA, 0x45, 0x1B, + 0xEB, 0xF8, 0xA3, 0x06, 0x94, 0xF8, 0x6E, 0xF8, 0x8D, 0xFD, 0xC3, 0x07, + 0x75, 0x0E, 0x11, 0x25, 0x86, 0x10, 0xF2, 0x1D, 0x54, 0x0C, 0xB6, 0x16, + 0x58, 0x37, 0x18, 0x35, 0x61, 0x4A, 0x2E, 0x3A, 0x23, 0x34, 0x43, 0x38, + 0xDE, 0x2F, 0x8A, 0x4A, 0xBC, 0x40, 0x5C, 0x44, 0xEB, 0x48, 0xED, 0x21, + 0x9B, 0x38, 0xEE, 0x16, 0xEF, 0x13, 0xCE, 0x29, 0x5D, 0xEA, 0xEA, 0x07, + 0x26, 0xEE, 0x92, 0xD9, 0x66, 0x05, 0x62, 0xE8, 0xF8, 0x1D, 0xEF, 0xFF, + 0x0B, 0x24, 0x1B, 0x0A, 0xF1, 0x15, 0xA0, 0x1F, 0x81, 0x29, 0x49, 0x1C, + 0x35, 0x3F, 0xC1, 0x0E, 0x57, 0x3C, 0x9B, 0x18, 0x9B, 0x26, 0x95, 0x24, + 0x76, 0x0D, 0xC9, 0x20, 0x7C, 0xFC, 0x71, 0x03, 0x09, 0xF8, 0xD7, 0xFB, + 0x7D, 0xF6, 0x4B, 0xF4, 0xA7, 0xE2, 0x82, 0xDA, 0xEB, 0xBF, 0x0F, 0xC1, + 0xF1, 0xCA, 0x5F, 0xC1, 0x3D, 0xE3, 0x3C, 0xCB, 0x5F, 0xD9, 0x84, 0xC3, + 0x04, 0xDE, 0x41, 0xD4, 0xDC, 0xE9, 0x00, 0xD8, 0xEB, 0xF1, 0x40, 0xC0, + 0x00, 0xF8, 0x91, 0xB3, 0xD3, 0xF9, 0xA6, 0xC3, 0xB1, 0xEC, 0x4D, 0xE6, + 0xE9, 0xCE, 0x69, 0xE8, 0xB2, 0xBF, 0x41, 0xCE, 0x1A, 0xD5, 0x29, 0xE2, + 0x44, 0xE3, 0x7A, 0xF4, 0xA9, 0xE3, 0x4A, 0xDE, 0x93, 0xF2, 0x69, 0xFA, + 0xBA, 0xEF, 0xD0, 0x1A, 0x14, 0xDE, 0xA2, 0x11, 0x93, 0xF5, 0x22, 0x13, + 0x44, 0x17, 0x3F, 0x1A, 0xDA, 0xFD, 0xAD, 0x1F, 0xFC, 0xE6, 0x41, 0x19, + 0xFC, 0xE8, 0xDF, 0xFC, 0xF0, 0xD5, 0x0D, 0xD6, 0x0E, 0xBB, 0x13, 0xB1, + 0x6E, 0xAE, 0x92, 0xAC, 0x05, 0xC4, 0xB0, 0xB7, 0x87, 0xE1, 0x8D, 0xAF, + 0xE4, 0xEC, 0x56, 0xBC, 0x08, 0x01, 0x93, 0xE1, 0xAE, 0x14, 0xCB, 0xE8, + 0x5B, 0xFC, 0xC6, 0xE8, 0x2B, 0xE2, 0x3D, 0xE3, 0x48, 0xEC, 0x4D, 0xCF, + 0xEB, 0xE4, 0xF0, 0xCA, 0xEF, 0xD6, 0xEC, 0xC9, 0xB3, 0xE1, 0x3C, 0xC6, + 0xD2, 0xDB, 0xFB, 0xB9, 0x36, 0xC0, 0x5D, 0xB7, 0x62, 0xBA, 0xCC, 0xB6, + 0xEB, 0xD6, 0xA3, 0xB0, 0xA5, 0xDB, 0xF1, 0xC4, 0x55, 0xD3, 0xAA, 0xDE, + 0xB2, 0xEF, 0x01, 0xE6, 0x1C, 0xFC, 0x7C, 0xD9, 0x97, 0xF0, 0x46, 0xE2, + 0x09, 0xED, 0x9C, 0xFB, 0xB8, 0xE6, 0x8D, 0xFE, 0x89, 0xCB, 0x15, 0xF9, + 0x9B, 0xBC, 0x8E, 0xF5, 0x7A, 0xC8, 0x63, 0xFB, 0x59, 0xC8, 0x4D, 0x0A, + 0x0D, 0xC5, 0x58, 0xFF, 0xC6, 0xE1, 0x72, 0xEF, 0xE5, 0x11, 0x8E, 0x0A, + 0x54, 0x21, 0x6C, 0x19, 0x38, 0x1E, 0xE8, 0x25, 0x0C, 0x24, 0x8B, 0x3A, + 0xF2, 0x26, 0x50, 0x31, 0xFF, 0x1C, 0xFD, 0x21, 0xD1, 0x1D, 0x70, 0x09, + 0xC4, 0x19, 0x11, 0xF4, 0xF4, 0xE9, 0x31, 0xE8, 0x28, 0xCE, 0x2A, 0xC9, + 0x9C, 0xE0, 0x53, 0xCA, 0x7A, 0xF8, 0x4E, 0xEA, 0x0C, 0x06, 0xD2, 0xEA, + 0xE6, 0x15, 0x3F, 0x03, 0xEE, 0x27, 0xA8, 0x36, 0x21, 0x21, 0x14, 0x42, + 0xD9, 0x0F, 0xEA, 0x30, 0x51, 0x0F, 0xA6, 0x2E, 0x4A, 0x04, 0xD9, 0x2D, + 0xBB, 0xF0, 0x03, 0x10, 0x30, 0xE9, 0x32, 0x02, 0x42, 0xF0, 0x06, 0xF1, + 0x7B, 0x03, 0x21, 0xDC, 0x70, 0xF6, 0xF3, 0xE3, 0x11, 0xEB, 0x98, 0xE2, + 0x06, 0xF1, 0x21, 0xD4, 0x65, 0xF0, 0x77, 0xD5, 0x53, 0xFC, 0x8D, 0xEA, + 0xE6, 0xF7, 0x68, 0xF5, 0x5E, 0xEB, 0x7F, 0xF3, 0x43, 0xF5, 0x94, 0xF8, + 0x31, 0x11, 0x92, 0x04, 0xB6, 0x1E, 0xD8, 0x03, 0xCA, 0x10, 0x47, 0xF8, + 0x3C, 0x09, 0xB3, 0x04, 0x4C, 0x18, 0x0E, 0x24, 0xA1, 0x15, 0x0C, 0x20, + 0x79, 0x08, 0x57, 0x0A, 0x30, 0x24, 0xDF, 0x18, 0xD8, 0x3B, 0x44, 0x34, + 0xE4, 0x31, 0x37, 0x4D, 0x5C, 0x3B, 0x79, 0x56, 0x6C, 0x56, 0xC6, 0x45, + 0xD2, 0x3E, 0x3E, 0x46, 0x5B, 0x14, 0x38, 0x4D, 0xDF, 0x0E, 0xEC, 0x36, + 0xB2, 0xF5, 0x65, 0x18, 0x0F, 0xD8, 0x9F, 0x02, 0x15, 0xEB, 0xB2, 0x01, + 0x41, 0xF3, 0x18, 0x14, 0x74, 0xE6, 0xF8, 0x12, 0x25, 0xFB, 0xAD, 0x10, + 0xD8, 0x25, 0x99, 0x28, 0xEC, 0x41, 0x40, 0x33, 0x38, 0x44, 0x89, 0x37, + 0x9A, 0x30, 0x75, 0x38, 0x8F, 0x2D, 0x66, 0x31, 0xF6, 0x35, 0xE3, 0x1D, + 0xFD, 0x34, 0xBE, 0x03, 0x82, 0x19, 0xE3, 0x01, 0x66, 0xFC, 0xBC, 0xEF, + 0x37, 0x01, 0x98, 0xE6, 0x36, 0xF2, 0x8F, 0xF3, 0x73, 0xF0, 0x49, 0xE5, + 0xB4, 0xFF, 0xCC, 0xD9, 0x28, 0xFE, 0x85, 0xF3, 0x51, 0x0C, 0xB9, 0x11, + 0xBA, 0x0B, 0x03, 0x12, 0x02, 0xF8, 0xB9, 0x0D, 0xEB, 0xFD, 0x6C, 0x1B, + 0x76, 0x15, 0x74, 0x29, 0xA9, 0x07, 0x78, 0x2B, 0x89, 0xF1, 0x99, 0x1C, + 0x39, 0x0D, 0xBF, 0x0C, 0xCE, 0x1F, 0x5F, 0x19, 0x7E, 0x02, 0x23, 0x1D, + 0x4A, 0xF9, 0x46, 0x12, 0xE8, 0x19, 0x1E, 0x19, 0x7F, 0x33, 0xBB, 0x14, + 0xC0, 0x31, 0xBD, 0x1C, 0x80, 0x2D, 0xDD, 0x2F, 0x80, 0x2E, 0x57, 0x30, + 0x58, 0x1A, 0xB3, 0x29, 0x83, 0x0C, 0xD3, 0x0B, 0x35, 0x0A, 0x95, 0xF2, + 0x77, 0xED, 0x0C, 0xE2, 0x6E, 0xDA, 0x41, 0xD7, 0xFB, 0xE2, 0x3A, 0xF4, + 0x1F, 0xF0, 0xF4, 0x02, 0x73, 0x0A, 0xE0, 0xEE, 0xA5, 0x30, 0x57, 0x0C, + 0x38, 0x4A, 0x4A, 0x4F, 0xB9, 0x48, 0xF7, 0x55, 0xBE, 0x2E, 0x81, 0x29, + 0xE3, 0x15, 0x19, 0x0F, 0x4C, 0x11, 0xC4, 0x15, 0x27, 0x10, 0x60, 0x17, + 0xD4, 0x08, 0x38, 0xFE, 0x2B, 0xF5, 0x16, 0xDD, 0x96, 0xE1, 0xC7, 0xCE, + 0x96, 0xD1, 0x1D, 0xD3, 0xDF, 0xCB, 0xCA, 0xCC, 0x2A, 0xD8, 0xDB, 0xD2, + 0x21, 0xE1, 0x7E, 0xE3, 0xE4, 0xFF, 0x31, 0xE9, 0x04, 0x21, 0xDC, 0xF7, + 0x87, 0x14, 0xA2, 0xF8, 0x74, 0xFD, 0xE7, 0xE9, 0xAE, 0x02, 0x66, 0x04, + 0x57, 0x05, 0x39, 0x0E, 0x42, 0xFF, 0x02, 0xEA, 0xE8, 0x08, 0x53, 0xED, + 0xBF, 0x14, 0xD6, 0x16, 0x19, 0x08, 0xE2, 0x0E, 0x7A, 0xF2, 0x0C, 0xDF, + 0x3C, 0x08, 0x14, 0xEE, 0xF1, 0x13, 0xE8, 0x08, 0x39, 0x08, 0x09, 0x19, + 0x21, 0x12, 0x1F, 0x2F, 0x6A, 0x2A, 0xDE, 0x21, 0xF2, 0x24, 0x2A, 0x12, + 0xD2, 0xFD, 0x3B, 0x04, 0x06, 0xEB, 0x45, 0xF6, 0x74, 0xC3, 0xA5, 0xE2, + 0x06, 0x9E, 0x0C, 0xC1, 0xB7, 0xBE, 0x17, 0xB9, 0x2E, 0xD2, 0x0D, 0xD4, + 0xCB, 0xC9, 0xAD, 0xE9, 0x52, 0xDA, 0x6D, 0xED, 0x21, 0xF5, 0x05, 0x06, + 0x33, 0x16, 0x99, 0x1F, 0xD5, 0x1B, 0xBE, 0x10, 0x4C, 0x0D, 0xC3, 0xFC, + 0x5C, 0x01, 0x2F, 0xFA, 0xB0, 0xED, 0xC3, 0xEB, 0x6D, 0xEC, 0x22, 0xCB, + 0x60, 0xF7, 0x9E, 0xBD, 0xEF, 0xF2, 0x14, 0xB4, 0xA9, 0xDD, 0x31, 0xB1, + 0x83, 0xC0, 0x59, 0xBC, 0xEC, 0xB4, 0x87, 0xBF, 0x1D, 0xBB, 0xE3, 0xC3, + 0x09, 0xCE, 0xEA, 0xBA, 0xC8, 0xED, 0x1D, 0xC7, 0xE5, 0xF7, 0x00, 0xE9, + 0x34, 0xEE, 0xE9, 0xE4, 0x20, 0xEA, 0xEC, 0xE6, 0x86, 0xEF, 0x6E, 0x0D, + 0x5E, 0xE9, 0x03, 0x08, 0x81, 0xDD, 0x0B, 0xEF, 0x32, 0xE9, 0xD2, 0xFD, + 0x69, 0xFD, 0xAC, 0x04, 0x3D, 0xF1, 0xFB, 0xEA, 0x72, 0xDC, 0x6E, 0xD8, + 0x2E, 0xE0, 0xD9, 0xEA, 0x3F, 0xEB, 0xE7, 0x02, 0x5A, 0x0A, 0x93, 0x17, + 0x5F, 0x1C, 0x6C, 0x24, 0xD9, 0x15, 0x5B, 0x1C, 0x23, 0x09, 0x98, 0x06, + 0x70, 0xF6, 0x4B, 0xF6, 0x98, 0xDC, 0x06, 0xEE, 0x32, 0xB3, 0x1C, 0xBD, + 0xB5, 0x9E, 0x34, 0x9F, 0xC4, 0xB2, 0x28, 0xCE, 0xFC, 0xD2, 0xF9, 0xF7, + 0x0B, 0xE0, 0x30, 0xF1, 0x60, 0xFB, 0xA7, 0xF3, 0x87, 0x24, 0x94, 0x17, + 0xA4, 0x30, 0x88, 0x36, 0x00, 0x2D, 0xDA, 0x39, 0x58, 0x26, 0x92, 0x2B, + 0x7A, 0x17, 0x83, 0x19, 0x4B, 0x01, 0x65, 0x04, 0xB9, 0xF7, 0x7C, 0xF7, + 0xE3, 0xE6, 0x96, 0xEC, 0x4B, 0xE0, 0x31, 0xDC, 0xBC, 0xE7, 0x22, 0xCF, + 0x20, 0xD0, 0x05, 0xC9, 0x95, 0xC6, 0xC7, 0xD1, 0x92, 0xC9, 0x16, 0xE6, + 0x20, 0xD9, 0x31, 0xF9, 0xBD, 0x00, 0x21, 0xFC, 0x2B, 0x17, 0x1C, 0xF9, + 0x69, 0x22, 0xAD, 0x06, 0x2F, 0x2D, 0x5B, 0x26, 0x68, 0x33, 0xC7, 0x37, + 0xAB, 0x20, 0xF9, 0x23, 0xF5, 0x0C, 0xE1, 0x17, 0x1E, 0x24, 0xC8, 0x10, + 0xDB, 0x27, 0x7A, 0x01, 0x44, 0x04, 0x0A, 0x07, 0x61, 0x07, 0x89, 0x12, + 0x83, 0x2D, 0xA0, 0x13, 0x90, 0x42, 0x91, 0x2B, 0x18, 0x44, 0x7A, 0x43, + 0x50, 0x3D, 0x63, 0x37, 0x1D, 0x30, 0x40, 0x3A, 0x68, 0x1A, 0x03, 0x35, + 0x3B, 0x06, 0xB7, 0x1A, 0x71, 0xE5, 0x8F, 0x0E, 0x78, 0xC0, 0xDC, 0xF1, + 0xC2, 0xCB, 0x10, 0xD7, 0xD4, 0xF2, 0x2D, 0xDC, 0x31, 0x03, 0x28, 0xF1, + 0x38, 0x0A, 0xFF, 0x0E, 0x16, 0x1D, 0x04, 0x30, 0x37, 0x34, 0xC4, 0x4F, + 0xFF, 0x39, 0x0D, 0x55, 0xF8, 0x39, 0xEA, 0x45, 0xD2, 0x32, 0xDB, 0x2B, + 0x9A, 0x1B, 0x8E, 0x0C, 0x9A, 0x01, 0x7B, 0x04, 0x17, 0xDD, 0x76, 0xF8, + 0xAA, 0xD1, 0x29, 0xD0, 0xDB, 0xE2, 0xC4, 0xBC, 0x61, 0xCB, 0x24, 0xB9, + 0xB4, 0xB7, 0x11, 0xB4, 0xBF, 0xCE, 0xFC, 0xCE, 0x0B, 0xDD, 0x45, 0xEA, + 0x48, 0xEA, 0xAB, 0xF4, 0x23, 0xFC, 0xD5, 0xFE, 0xD0, 0x08, 0x84, 0x0B, + 0x3C, 0x12, 0x2D, 0x0B, 0xD7, 0x14, 0x2D, 0x13, 0xDB, 0x0A, 0x14, 0x1C, + 0xBC, 0xF5, 0x1B, 0x0C, 0x98, 0xE4, 0xD6, 0x01, 0x28, 0xE2, 0x8E, 0xFC, + 0x6F, 0xE5, 0x25, 0xE7, 0x80, 0xDF, 0x4A, 0xCD, 0x61, 0xEA, 0x72, 0xED, + 0x25, 0x0A, 0xDA, 0x25, 0x8C, 0x17, 0xEB, 0x26, 0xA7, 0x12, 0xBE, 0x17, + 0x7F, 0x15, 0x04, 0x1B, 0xBD, 0x0A, 0xD1, 0x13, 0x10, 0xE3, 0xFE, 0xEE, + 0xEE, 0xCB, 0xD0, 0xC6, 0xC3, 0xC0, 0x9C, 0xBC, 0xB8, 0xAC, 0xAD, 0xAF, + 0x6A, 0xC5, 0x89, 0xAF, 0xAA, 0xFC, 0xAC, 0xDB, 0xB3, 0x17, 0xF7, 0xFA, + 0x3F, 0x2C, 0xB8, 0x18, 0x6B, 0x40, 0xE4, 0x4C, 0xC4, 0x39, 0x4A, 0x57, + 0xCA, 0x2F, 0xE9, 0x3C, 0x08, 0x30, 0xA8, 0x2D, 0x85, 0x29, 0x24, 0x2B, + 0x0D, 0x11, 0x0B, 0x09, 0x7A, 0xF9, 0xFB, 0xD8, 0xE6, 0xEA, 0xE6, 0xD2, + 0x15, 0xDE, 0x59, 0xD8, 0x30, 0xD3, 0x4A, 0xBA, 0x0B, 0xBF, 0x2B, 0x9F, + 0xAC, 0xC7, 0xD9, 0xBF, 0x25, 0xE6, 0xCE, 0xE8, 0xCB, 0xFC, 0x91, 0xF4, + 0xF2, 0x14, 0x92, 0x06, 0xBA, 0x1F, 0xFF, 0x1C, 0x21, 0x1E, 0x22, 0x17, + 0x80, 0x2D, 0xD6, 0x1B, 0x54, 0x3C, 0xB7, 0x27, 0x6A, 0x2A, 0x32, 0x1D, + 0x70, 0x18, 0xFE, 0x1B, 0x42, 0x1D, 0x0A, 0x1A, 0xE6, 0x1C, 0xC4, 0x0A, + 0x67, 0x08, 0x3A, 0x05, 0x6D, 0xFC, 0xE1, 0x09, 0x23, 0x09, 0x56, 0x25, + 0xE3, 0x2A, 0xAA, 0x46, 0x5B, 0x3B, 0x72, 0x3F, 0x33, 0x2D, 0xAB, 0x38, + 0xE6, 0x25, 0x6B, 0x31, 0x52, 0x10, 0xB1, 0x09, 0x56, 0xE2, 0x76, 0xE0, + 0x8D, 0xC3, 0x15, 0xC1, 0x17, 0xC4, 0xBC, 0xB6, 0xB3, 0xD8, 0x91, 0xD0, + 0x94, 0xF3, 0x30, 0xE9, 0xD9, 0x12, 0xA5, 0xF8, 0x60, 0x3F, 0x81, 0x1D, + 0x94, 0x54, 0xC1, 0x46, 0x13, 0x53, 0xC1, 0x5E, 0x9B, 0x4B, 0x9C, 0x53, + 0xD7, 0x30, 0xFD, 0x37, 0xA6, 0x22, 0xDD, 0x21, 0x12, 0x1D, 0xE4, 0x16, + 0xF9, 0x00, 0xE7, 0x0B, 0x33, 0xEF, 0x70, 0xE1, 0x6C, 0xF0, 0x42, 0xC4, + 0xD8, 0xDB, 0xB7, 0xD3, 0x89, 0xC8, 0x57, 0xD9, 0x7E, 0xCF, 0xAF, 0xD7, + 0x85, 0xD9, 0x55, 0xEB, 0x7F, 0xF0, 0x12, 0xFD, 0x75, 0x17, 0x37, 0x23, + 0x16, 0x21, 0x18, 0x36, 0x81, 0x2F, 0xC7, 0x22, 0xBD, 0x4C, 0x9F, 0x2D, + 0xB7, 0x40, 0x80, 0x46, 0xC7, 0x2E, 0x7B, 0x38, 0x97, 0x32, 0xDE, 0x25, + 0xDC, 0x1D, 0xE9, 0x1E, 0x09, 0x0C, 0x50, 0x07, 0x70, 0x16, 0x01, 0x00, + 0xC1, 0x17, 0x42, 0x05, 0x55, 0x13, 0xDE, 0x07, 0xCD, 0x0E, 0x34, 0x17, + 0x28, 0x1C, 0xCA, 0x3E, 0xFF, 0x22, 0x91, 0x38, 0xD9, 0x17, 0x45, 0x13, + 0xDB, 0x0F, 0xE7, 0x0A, 0xB3, 0xF4, 0x49, 0xF2, 0x60, 0xCF, 0xF2, 0xC6, + 0x32, 0xAB, 0x4D, 0xA3, 0x7A, 0xAD, 0x18, 0xB6, 0x0A, 0xD0, 0x46, 0xD0, + 0xEF, 0xEC, 0xAF, 0xDB, 0x6C, 0x14, 0x2E, 0x16, 0x28, 0x31, 0x9F, 0x4F, + 0x48, 0x46, 0xBD, 0x5B, 0x3A, 0x55, 0xE8, 0x60, 0x38, 0x36, 0xDB, 0x52, + 0x22, 0x02, 0xDA, 0x27, 0x26, 0xE3, 0x57, 0x01, 0x77, 0xD7, 0xB9, 0xE2, + 0x7E, 0xC6, 0x1B, 0xBB, 0x6E, 0xAA, 0x50, 0x9A, 0x01, 0xA1, 0x17, 0xA2, + 0xE8, 0xAD, 0x0A, 0xA9, 0xB7, 0xC0, 0xBF, 0xAD, 0x01, 0xD0, 0x4C, 0xC5, + 0x08, 0xCD, 0x8F, 0xCC, 0x15, 0xDC, 0x9D, 0xDD, 0x1B, 0xF4, 0x4D, 0xFD, + 0xF9, 0x00, 0x07, 0x0B, 0x82, 0x20, 0xC0, 0x0F, 0x07, 0x2C, 0xEF, 0x0C, + 0x43, 0x1F, 0x86, 0x02, 0x0D, 0x0E, 0x26, 0xFC, 0x77, 0xF4, 0x9D, 0x05, + 0xBC, 0xE4, 0xA8, 0x06, 0x23, 0xD4, 0x1D, 0xE7, 0xEC, 0xD5, 0x00, 0xE8, + 0x0B, 0xF7, 0xE9, 0xFE, 0x45, 0x09, 0xEB, 0xF5, 0xA6, 0x03, 0x3E, 0xEF, + 0x4D, 0xFA, 0xE7, 0xFF, 0xA9, 0xF4, 0x21, 0x14, 0x55, 0xEE, 0xB6, 0xFA, + 0xF5, 0xE7, 0x01, 0xD6, 0x95, 0xD1, 0x8A, 0xC3, 0x3E, 0xAB, 0x83, 0xAD, + 0x0E, 0xA1, 0xE8, 0x9E, 0xF5, 0xBD, 0xD8, 0xAC, 0x8A, 0xD3, 0x05, 0xC9, + 0xD5, 0xE2, 0x73, 0xE3, 0x67, 0x1E, 0xC7, 0x1D, 0x42, 0x4C, 0x06, 0x4B, + 0x0C, 0x4A, 0xE0, 0x5A, 0xFC, 0x3E, 0x69, 0x56, 0x5C, 0x2A, 0x46, 0x33, + 0x70, 0x15, 0xDB, 0x02, 0x42, 0xF2, 0x7F, 0xCD, 0x0B, 0xCC, 0x3A, 0xB4, + 0x88, 0xB5, 0xF2, 0xAD, 0x90, 0xA7, 0xA3, 0xAD, 0x94, 0xA7, 0xD6, 0xCA, + 0xBF, 0xB1, 0x5F, 0xD5, 0xD0, 0xCB, 0x1A, 0xD9, 0x28, 0xEC, 0x7C, 0xF1, + 0xA1, 0xF1, 0x67, 0xF3, 0x34, 0xF0, 0x4D, 0x09, 0xC6, 0xFA, 0x7E, 0x14, + 0xB3, 0x07, 0x20, 0x12, 0xD3, 0x20, 0xCA, 0x38, 0xDE, 0x24, 0x88, 0x47, + 0xDF, 0x0F, 0x4F, 0x2F, 0x6E, 0x0B, 0xD4, 0x20, 0x6F, 0x0F, 0x23, 0x2D, + 0xBA, 0xFE, 0x63, 0x25, 0x2E, 0xEE, 0x62, 0xFA, 0xB2, 0xFA, 0x6F, 0xEA, + 0x23, 0x1A, 0x14, 0xFD, 0xBA, 0x24, 0x0D, 0x05, 0x44, 0x1D, 0x51, 0xF7, + 0xDC, 0x26, 0x0F, 0xF8, 0xE6, 0x23, 0xC2, 0x03, 0xAB, 0x07, 0x6F, 0xF7, + 0xAA, 0xEA, 0xC3, 0xE1, 0x3A, 0xC9, 0x11, 0xBE, 0x7A, 0xAE, 0x86, 0xA5, + 0x55, 0xB1, 0xC1, 0xC5, 0xA2, 0xE0, 0x25, 0xE5, 0xA5, 0x11, 0x2F, 0xF7, + 0xB5, 0x2E, 0x02, 0x1D, 0x6C, 0x53, 0xC0, 0x49, 0x09, 0x64, 0x1A, 0x5B, + 0x7F, 0x60, 0x6B, 0x5C, 0xCD, 0x51, 0x40, 0x52, 0xB5, 0x35, 0x64, 0x28, + 0x0C, 0x21, 0x69, 0xFD, 0x5A, 0xF7, 0xC2, 0xD4, 0x7D, 0xC4, 0xA7, 0xBE, + 0xC1, 0xC0, 0x47, 0xBD, 0x63, 0xCE, 0xBC, 0xBC, 0xDD, 0xD0, 0x6D, 0xDB, + 0x07, 0xD5, 0x70, 0xEF, 0x0A, 0xEC, 0x6B, 0xF0, 0x2D, 0x06, 0x99, 0x13, + 0x87, 0x10, 0x3D, 0x20, 0xD2, 0x19, 0x1A, 0x15, 0x00, 0x18, 0x17, 0x16, + 0x15, 0x0D, 0x77, 0x1F, 0x24, 0x1C, 0xE2, 0x30, 0x59, 0x35, 0x31, 0x2C, + 0xBC, 0x24, 0x36, 0x2B, 0x2D, 0x19, 0x4A, 0x34, 0x5E, 0x3D, 0xDE, 0x34, + 0x39, 0x3E, 0x25, 0x27, 0x8D, 0x05, 0x2F, 0xFA, 0xB9, 0xF5, 0x53, 0xF2, + 0xB6, 0x07, 0x6E, 0x06, 0x7B, 0x0C, 0xE4, 0xFD, 0x11, 0x14, 0x50, 0xFE, + 0xC3, 0x19, 0xCB, 0x0E, 0x0A, 0x12, 0x49, 0x08, 0xB8, 0xFC, 0x5D, 0xF2, + 0x17, 0xDE, 0xA4, 0xF4, 0x9B, 0xB6, 0x7C, 0xEB, 0xFD, 0xA6, 0xC9, 0xC7, + 0xBE, 0xC2, 0xA3, 0xCB, 0xDB, 0xF2, 0xD4, 0xEF, 0x8D, 0x13, 0x63, 0x0E, + 0x55, 0x29, 0x49, 0x27, 0x64, 0x51, 0x25, 0x40, 0x5A, 0x5F, 0xE4, 0x4B, + 0x3A, 0x3F, 0x2C, 0x37, 0xFE, 0x26, 0xA1, 0x17, 0x93, 0x18, 0x19, 0xF5, + 0x7B, 0xFC, 0x8D, 0xCD, 0x4C, 0xD6, 0xBD, 0xA8, 0xDF, 0xCF, 0x2B, 0xA9, + 0xC3, 0xCC, 0x80, 0xC4, 0x1F, 0xC9, 0x35, 0xDE, 0x95, 0xEA, 0x9C, 0xF5, + 0xFE, 0xFC, 0x1E, 0xF9, 0x70, 0x00, 0x93, 0x06, 0x57, 0xFC, 0x62, 0x0B, + 0x95, 0xFD, 0x7B, 0x10, 0xB1, 0x0E, 0x0C, 0x26, 0xF0, 0x0A, 0x84, 0x1E, + 0x91, 0x09, 0xE6, 0x23, 0x3E, 0x22, 0xBF, 0x4D, 0xFB, 0x2D, 0x19, 0x51, + 0x37, 0x1A, 0x96, 0x22, 0x54, 0x0E, 0x19, 0x12, 0xC7, 0x20, 0x5E, 0x38, + 0xA4, 0x0D, 0x2E, 0x30, 0xEE, 0xEA, 0xB5, 0xF3, 0x87, 0x01, 0xD5, 0xF7, + 0x7D, 0x16, 0xAA, 0x09, 0xB5, 0x1B, 0xD7, 0xF3, 0xED, 0x24, 0xF7, 0xF2, + 0x31, 0x1E, 0x14, 0x10, 0xAE, 0x10, 0x3F, 0x0B, 0x19, 0xFD, 0x17, 0xEB, + 0xC7, 0xD8, 0x7A, 0xDF, 0x5D, 0xB1, 0x27, 0xCD, 0x4D, 0xAE, 0x97, 0xBC, + 0xF6, 0xDD, 0x65, 0xD8, 0x4E, 0x15, 0x49, 0x0F, 0x39, 0x33, 0xD6, 0x2F, + 0xEA, 0x47, 0xC3, 0x3D, 0xAF, 0x5C, 0x6B, 0x59, 0xD1, 0x5A, 0x3C, 0x5B, + 0xF6, 0x39, 0x34, 0x3D, 0x56, 0x04, 0x19, 0x21, 0xA3, 0xE3, 0xAD, 0xFD, + 0x07, 0xD7, 0xBD, 0xD0, 0x08, 0xC5, 0x5F, 0xBA, 0x24, 0xBF, 0x02, 0xCE, + 0x54, 0xCE, 0xF7, 0xE4, 0xB3, 0xF7, 0x9E, 0xF8, 0x3D, 0x12, 0x10, 0xFC, + 0x0A, 0x0F, 0x8A, 0xEF, 0xC1, 0xF5, 0x45, 0xEA, 0x9B, 0xDB, 0xE1, 0xE7, + 0x8C, 0xE6, 0x1F, 0xF2, 0x84, 0xF1, 0xF1, 0xFC, 0x7F, 0xF3, 0xFC, 0x02, + 0xB2, 0x11, 0xFB, 0x20, 0xAF, 0x37, 0x8E, 0x31, 0x80, 0x2A, 0xA8, 0x17, + 0x7F, 0x02, 0xDD, 0x08, 0xE8, 0x02, 0xE9, 0x11, 0x9D, 0x16, 0x12, 0x1D, + 0x52, 0x06, 0x93, 0xFE, 0xEF, 0xF3, 0xA1, 0xDD, 0x35, 0x05, 0xF7, 0xEB, + 0x11, 0x12, 0x98, 0xF0, 0x2D, 0x09, 0xEE, 0xF7, 0x7B, 0x00, 0x8C, 0x02, + 0xD2, 0xFB, 0xA2, 0xFF, 0xF0, 0xE2, 0xE5, 0xFC, 0xD3, 0xCF, 0x5A, 0xF3, + 0x2C, 0xC7, 0x10, 0xDF, 0x63, 0xAC, 0x55, 0xC3, 0xB3, 0xA8, 0x86, 0xC5, + 0x72, 0xD8, 0x49, 0xDD, 0x17, 0x06, 0xD9, 0xF1, 0xE9, 0x12, 0x47, 0x12, + 0xE1, 0x2A, 0x2F, 0x34, 0x16, 0x3D, 0xBD, 0x49, 0xB3, 0x27, 0xCB, 0x2A, + 0xE8, 0x11, 0x44, 0xF1, 0x3D, 0xFF, 0xA1, 0xD5, 0xDB, 0xE3, 0x86, 0xBA, + 0x59, 0xC5, 0x84, 0xA3, 0xF7, 0xC0, 0x91, 0xA9, 0x2C, 0xD4, 0x80, 0xBC, + 0x83, 0xE2, 0x17, 0xDE, 0x82, 0xF7, 0x17, 0xFB, 0x09, 0xF6, 0x01, 0xF4, + 0x69, 0xEB, 0xB0, 0xE7, 0x1D, 0xE5, 0x4A, 0xE9, 0x3B, 0xD6, 0x0B, 0xF3, + 0x14, 0xD7, 0x82, 0x00, 0x2E, 0xD8, 0x5E, 0x0B, 0x16, 0xE4, 0x1B, 0x0A, + 0x5E, 0x06, 0xB9, 0x19, 0x10, 0x16, 0x34, 0x2D, 0xF8, 0x0D, 0x5B, 0x1E, + 0xE9, 0xF9, 0xB8, 0x0D, 0x57, 0xF5, 0x5B, 0x13, 0xB3, 0xFE, 0xDB, 0x09, + 0x56, 0xF5, 0xCB, 0xD6, 0xD7, 0xF4, 0x96, 0xD6, 0xB3, 0xF2, 0x70, 0x0D, + 0x13, 0x01, 0xCB, 0x1D, 0xE9, 0x1A, 0x33, 0x0D, 0x97, 0x10, 0x06, 0xFF, + 0x2A, 0xFF, 0x1C, 0x07, 0xF3, 0xEA, 0xBD, 0x00, 0x40, 0xCF, 0x0E, 0xD2, + 0x36, 0xBA, 0x85, 0xC0, 0x4E, 0xBE, 0x91, 0xCC, 0xD8, 0xE2, 0x1D, 0xD8, + 0x78, 0x0C, 0x8B, 0x05, 0x56, 0x30, 0xDB, 0x2B, 0xE0, 0x4A, 0xE3, 0x28, + 0xEE, 0x55, 0x30, 0x38, 0xCF, 0x4F, 0x63, 0x5C, 0x59, 0x3F, 0xC4, 0x3B, + 0x4E, 0x2B, 0x1B, 0xF7, 0xD6, 0x05, 0x6D, 0xE8, 0x98, 0xEE, 0xD2, 0xDF, + 0xA2, 0xE4, 0xCE, 0xC9, 0xD9, 0xD3, 0xA6, 0xD4, 0x80, 0xD9, 0x0F, 0xED, + 0x3D, 0xF2, 0xD8, 0x00, 0xF6, 0xF7, 0x38, 0xFA, 0x90, 0xEC, 0x25, 0xED, + 0x6B, 0xF0, 0x38, 0x00, 0x34, 0xEC, 0x88, 0x02, 0x56, 0xEB, 0x1A, 0xFD, + 0x66, 0x10, 0xE7, 0x0B, 0x4A, 0x20, 0xA9, 0x0C, 0x54, 0x18, 0xE2, 0x05, + 0x4E, 0x28, 0xB1, 0x24, 0xE0, 0x2B, 0x7C, 0x2F, 0x1B, 0x11, 0xBA, 0xFB, + 0xFB, 0xF2, 0x07, 0xF0, 0xE4, 0xF1, 0x89, 0x09, 0x46, 0xF0, 0x4B, 0xF3, + 0x8D, 0xDA, 0x65, 0xD6, 0x4F, 0xE6, 0x40, 0xE3, 0x6D, 0xFE, 0x27, 0xF1, + 0x00, 0xFE, 0xC5, 0x0C, 0xC6, 0xFC, 0x41, 0x23, 0x45, 0x04, 0xB9, 0x0F, + 0xFF, 0xFC, 0xA8, 0xF9, 0x50, 0xD8, 0xF4, 0xE7, 0x7C, 0xAF, 0x50, 0xC9, + 0x29, 0x9C, 0x61, 0xAD, 0xCB, 0xA5, 0x49, 0xAC, 0x23, 0xCD, 0xA4, 0xC8, + 0x20, 0xFC, 0x31, 0xF5, 0xC1, 0x1D, 0x03, 0x08, 0x51, 0x2F, 0x1C, 0x0C, + 0xD0, 0x25, 0x3D, 0x1B, 0x26, 0x14, 0xF7, 0x1B, 0xAB, 0x05, 0xB0, 0xFD, + 0xF3, 0xE4, 0x17, 0xD0, 0x7F, 0xC8, 0x1B, 0xAE, 0xE2, 0xC2, 0x32, 0xA1, + 0xF2, 0xC3, 0xA6, 0xAE, 0x18, 0xD0, 0x8D, 0xBF, 0x0A, 0xEA, 0x07, 0xC9, + 0x13, 0xFA, 0x6F, 0xE9, 0x2F, 0xEE, 0xD3, 0xF6, 0xCD, 0xEF, 0xBC, 0xDA, + 0x0F, 0xF6, 0xB9, 0xD0, 0xD6, 0xE6, 0x59, 0xDE, 0xA2, 0xFC, 0x03, 0xF0, + 0xDD, 0x14, 0x24, 0x05, 0x5A, 0x18, 0x5F, 0x1D, 0x4A, 0x32, 0xA0, 0x26, + 0x95, 0x2D, 0xCB, 0x21, 0xF8, 0x04, 0xCA, 0x19, 0xBB, 0xEF, 0xFE, 0x00, + 0xD7, 0xE9, 0xA5, 0x01, 0x18, 0xEE, 0x7B, 0x18, 0x0C, 0xE5, 0x00, 0x0F, + 0x7C, 0xE2, 0x38, 0x07, 0x3B, 0x08, 0x65, 0x12, 0x5D, 0x27, 0x99, 0x20, + 0x09, 0x28, 0x63, 0x37, 0x2A, 0x23, 0x52, 0x29, 0x5D, 0x24, 0xD9, 0x0C, + 0x28, 0x0C, 0x54, 0x18, 0x18, 0xEF, 0xD9, 0x06, 0x7A, 0xE0, 0xFC, 0xDB, + 0x9B, 0xD1, 0xBF, 0xCF, 0xE1, 0xDD, 0x3A, 0xDE, 0x0D, 0x0D, 0xDE, 0xFA, + 0xF4, 0x37, 0x49, 0x23, 0x8D, 0x3D, 0x59, 0x44, 0x6F, 0x4A, 0xA5, 0x48, + 0x2E, 0x5D, 0xD7, 0x43, 0x63, 0x49, 0xB2, 0x3A, 0x61, 0x22, 0xB1, 0x1A, + 0x67, 0xFA, 0x37, 0xF5, 0x92, 0xE5, 0x3E, 0xF2, 0x7B, 0xE4, 0x65, 0xE9, + 0x5A, 0xEE, 0x09, 0xD8, 0x64, 0x0C, 0x1B, 0x07, 0x3F, 0x24, 0x5C, 0x31, + 0x8C, 0x32, 0xD2, 0x20, 0xBE, 0x17, 0x97, 0x16, 0x08, 0xEC, 0x45, 0x1C, + 0x14, 0xF6, 0x27, 0x20, 0xAD, 0x03, 0xE2, 0x19, 0xEF, 0x17, 0xB8, 0x15, + 0x5A, 0x30, 0xF2, 0x1D, 0x36, 0x39, 0x4B, 0x1F, 0xE7, 0x4E, 0xDA, 0x30, + 0x1F, 0x40, 0x55, 0x50, 0xCC, 0x21, 0xA1, 0x49, 0xC8, 0x16, 0x0B, 0x21, + 0xBC, 0x0C, 0xBA, 0x1E, 0x63, 0x17, 0x32, 0x35, 0x8C, 0x16, 0xE6, 0x20, + 0x09, 0x1D, 0x5D, 0x19, 0x88, 0x3A, 0x3D, 0x3A, 0x06, 0x46, 0xA0, 0x48, + 0xBE, 0x4C, 0xB8, 0x46, 0x63, 0x41, 0xBD, 0x47, 0x45, 0x2B, 0xA9, 0x47, + 0x71, 0x1F, 0x12, 0x36, 0x7A, 0x14, 0xCA, 0x12, 0x3F, 0xFA, 0xC0, 0x01, + 0xC9, 0xE2, 0x71, 0xF9, 0x04, 0xEB, 0x76, 0xEF, 0x54, 0x04, 0xAC, 0x11, + 0x84, 0x20, 0x49, 0x35, 0x66, 0x3D, 0x13, 0x38, 0x9F, 0x55, 0xCD, 0x40, + 0x29, 0x5E, 0x84, 0x51, 0xD2, 0x52, 0xEA, 0x41, 0x81, 0x27, 0xC2, 0xFE, + 0x8B, 0xF6, 0xF9, 0xD3, 0xE4, 0xE4, 0x41, 0xE4, 0x93, 0xE2, 0xB7, 0xEC, + 0xC3, 0xE2, 0x65, 0xEE, 0x78, 0xF7, 0x1D, 0x02, 0xEA, 0x0D, 0x07, 0xF6, + 0xA4, 0x0F, 0xFB, 0xF2, 0xEA, 0xF9, 0x45, 0x03, 0x47, 0xF2, 0x8B, 0xE9, + 0x83, 0xFB, 0xD4, 0xDC, 0xF1, 0xE9, 0x21, 0xFB, 0x75, 0xF6, 0x54, 0xFD, + 0x72, 0x15, 0x2A, 0xF6, 0x38, 0x14, 0xDE, 0x13, 0x02, 0x05, 0x3A, 0x21, + 0x08, 0x04, 0xC9, 0x10, 0x7E, 0x03, 0xFA, 0x04, 0xD8, 0xDE, 0x03, 0x03, + 0x84, 0xD3, 0x78, 0x03, 0xAA, 0xE9, 0x2D, 0xFC, 0x6B, 0xDB, 0x6F, 0xE8, + 0x96, 0xD0, 0x3E, 0xF0, 0x58, 0xFA, 0xEF, 0x0C, 0xDB, 0x1A, 0xBF, 0x16, + 0x17, 0x06, 0x3A, 0x0B, 0x13, 0xE2, 0x9F, 0xFC, 0x8D, 0xE1, 0xB5, 0xED, + 0x1D, 0xE3, 0x5E, 0xDA, 0x2D, 0xC9, 0x22, 0xD1, 0x02, 0xC5, 0x1D, 0xB6, + 0xE5, 0xC0, 0xFB, 0x99, 0x66, 0xBA, 0x75, 0xB5, 0xC3, 0xDF, 0x50, 0xE2, + 0x00, 0x16, 0xF8, 0xF9, 0x96, 0x33, 0xB5, 0x10, 0xA5, 0x3D, 0xA8, 0x1A, + 0xB5, 0x3F, 0xF8, 0x0F, 0x34, 0x1A, 0x62, 0x0A, 0x6D, 0xD9, 0xEA, 0xEC, + 0xF3, 0xB2, 0xDA, 0xC3, 0x96, 0xAC, 0x35, 0xB4, 0x4B, 0xB5, 0x31, 0xA4, + 0x65, 0xC2, 0x5A, 0xA4, 0x10, 0xD5, 0x4A, 0xCA, 0x94, 0xE5, 0x1F, 0xE2, + 0xB1, 0xEF, 0x23, 0xE3, 0x85, 0xE4, 0xF2, 0xCE, 0x64, 0xD8, 0x01, 0xAE, + 0xC1, 0xE4, 0x33, 0xC2, 0x31, 0xEF, 0xA9, 0xE2, 0x48, 0xEE, 0x0A, 0xF3, + 0x51, 0xE8, 0xAE, 0x08, 0xE9, 0xF1, 0xCC, 0x05, 0x1B, 0x02, 0xDE, 0x01, + 0xFF, 0x10, 0xE1, 0x09, 0x21, 0x03, 0x92, 0xFC, 0x42, 0xD2, 0x50, 0xD9, + 0xB3, 0xCB, 0x2A, 0xD0, 0xFC, 0xDD, 0xBC, 0xF5, 0x03, 0xDE, 0x4C, 0xFF, + 0x07, 0xE2, 0x93, 0xE5, 0x72, 0xF2, 0xF0, 0xEB, 0x78, 0xFE, 0x4C, 0x0D, + 0xFC, 0x0A, 0x3D, 0x1B, 0xF3, 0x08, 0xAC, 0x0B, 0xEB, 0xEC, 0xC7, 0xFA, + 0x24, 0xDC, 0x5D, 0xE4, 0xA2, 0xCE, 0xE5, 0xCC, 0xB2, 0xBF, 0xAB, 0xB3, + 0xE1, 0xB7, 0x7F, 0xAB, 0x2B, 0xC0, 0x60, 0xBB, 0x7D, 0xEA, 0x94, 0xD7, + 0xE5, 0x13, 0x71, 0x02, 0x0B, 0x2B, 0x70, 0x1A, 0xA2, 0x3C, 0x49, 0x26, + 0x9B, 0x38, 0x32, 0x3A, 0xA9, 0x1C, 0xB0, 0x1E, 0x58, 0xF8, 0x92, 0xE6, + 0x32, 0xD8, 0x75, 0xD7, 0xFB, 0xCF, 0x8C, 0xC3, 0xA8, 0xE2, 0x11, 0xAC, + 0xDA, 0xED, 0xC1, 0xC1, 0x42, 0xF4, 0x90, 0xE3, 0x8C, 0x04, 0x04, 0xEB, + 0xFA, 0xFF, 0x7F, 0xF6, 0x91, 0xF7, 0x67, 0xF8, 0x3A, 0xF6, 0x48, 0xE4, + 0xE8, 0xF1, 0x1B, 0xFC, 0xAA, 0xFD, 0xDA, 0x13, 0x8B, 0x13, 0x30, 0x0F, + 0xD1, 0x25, 0x85, 0x15, 0x12, 0x28, 0xC5, 0x23, 0xF4, 0x18, 0x19, 0x31, + 0x40, 0x16, 0xAA, 0x1E, 0x3B, 0x1B, 0xCC, 0x0D, 0x5B, 0x07, 0x7D, 0x13, + 0x5D, 0x00, 0xF8, 0x10, 0x80, 0x15, 0x1B, 0x17, 0x0D, 0x0F, 0x2C, 0x0E, + 0x42, 0x01, 0xE8, 0xF1, 0x95, 0x1A, 0x34, 0x02, 0xB4, 0x30, 0x32, 0x38, + 0x82, 0x1B, 0xFD, 0x4B, 0xD3, 0x14, 0x65, 0x2F, 0x1F, 0x1E, 0xF1, 0x1B, + 0x9D, 0x02, 0x29, 0x1A, 0xD7, 0xDF, 0x65, 0x0E, 0xF7, 0xC8, 0x15, 0xF4, + 0x97, 0xC6, 0xAA, 0xCA, 0xEE, 0xD8, 0xE4, 0xC4, 0x53, 0xF9, 0xCC, 0xF9, + 0xBC, 0x22, 0x38, 0x3E, 0xC5, 0x41, 0xE4, 0x60, 0xE7, 0x58, 0xF0, 0x5F, + 0x95, 0x57, 0xF7, 0x56, 0x21, 0x34, 0x43, 0x45, 0x98, 0x07, 0xC2, 0x29, + 0xD4, 0xF0, 0xDA, 0xF2, 0x49, 0xEB, 0x98, 0xC2, 0x67, 0xE7, 0xD7, 0xD1, + 0x72, 0xE2, 0x1B, 0xE3, 0xFB, 0xE4, 0x6E, 0xDF, 0x9F, 0xFA, 0xA3, 0xF5, + 0x3B, 0x01, 0xD3, 0xFB, 0x28, 0x09, 0xFB, 0xE5, 0x58, 0x02, 0xDC, 0xEE, + 0x11, 0xF7, 0x72, 0x09, 0xCC, 0x1A, 0xEF, 0x0C, 0xBE, 0x27, 0x8E, 0x1E, + 0x92, 0x21, 0x3C, 0x31, 0x43, 0x2D, 0x3A, 0x26, 0x5F, 0x33, 0xCE, 0x27, + 0xB0, 0x34, 0x60, 0x43, 0x04, 0x33, 0x56, 0x45, 0x88, 0x13, 0x32, 0x13, + 0x35, 0xF6, 0x86, 0xED, 0xCF, 0x12, 0x50, 0x02, 0x50, 0x24, 0x3B, 0x0B, + 0xE0, 0x0E, 0x1F, 0xF7, 0xA4, 0x0E, 0x4A, 0x22, 0x37, 0x29, 0x2A, 0x50, + 0x76, 0x38, 0x42, 0x3D, 0x3A, 0x39, 0xCE, 0x39, 0xCB, 0x2D, 0x07, 0x4B, + 0xC8, 0x0B, 0x07, 0x2D, 0x53, 0xF1, 0x3A, 0x00, 0x21, 0xD1, 0xE5, 0x02, + 0xCE, 0xB8, 0x5F, 0xF5, 0xD2, 0xCE, 0x32, 0xD2, 0x32, 0xF0, 0x12, 0xE9, + 0x29, 0x1A, 0x54, 0x17, 0x7A, 0x4A, 0xC4, 0x2D, 0x49, 0x5D, 0xA3, 0x47, + 0x96, 0x55, 0x64, 0x60, 0xA6, 0x46, 0x3B, 0x54, 0xB5, 0x29, 0xA8, 0x2A, + 0x57, 0x00, 0x3C, 0xFE, 0x68, 0xE6, 0xBE, 0xE5, 0x81, 0xE8, 0x4A, 0xD8, + 0xBF, 0xF3, 0x82, 0xD7, 0x8F, 0xF0, 0x06, 0xE2, 0x3B, 0xED, 0x7E, 0xE8, + 0x9C, 0xF3, 0x83, 0xF8, 0xB8, 0x05, 0x49, 0x1F, 0x7C, 0x04, 0xAE, 0x22, + 0x7E, 0xFA, 0x43, 0x07, 0x75, 0x13, 0x94, 0x2C, 0xDE, 0x13, 0xAE, 0x35, + 0x56, 0x0A, 0x60, 0x1B, 0xFA, 0x21, 0xA3, 0x34, 0x5B, 0x27, 0xB3, 0x27, + 0xBA, 0x1D, 0x34, 0x07, 0xF9, 0x23, 0xFA, 0x1F, 0x41, 0x13, 0x23, 0x22, + 0x20, 0xEE, 0xBB, 0xF6, 0x41, 0xF9, 0x44, 0xE7, 0xB7, 0x17, 0x97, 0xFF, + 0xBE, 0x0B, 0x8D, 0xFA, 0x28, 0x0E, 0x55, 0xE4, 0xDA, 0x24, 0xD6, 0x05, + 0xE0, 0x1F, 0xDD, 0x23, 0xDF, 0x25, 0xB2, 0x1E, 0x85, 0x25, 0xF1, 0x05, + 0x54, 0x0F, 0x00, 0xF9, 0x50, 0xF7, 0xCC, 0x00, 0x6F, 0xD3, 0x20, 0xED, + 0xF3, 0xB9, 0x1E, 0xD8, 0x13, 0xB2, 0x4A, 0xCB, 0xE2, 0xC2, 0x94, 0xC6, + 0x0D, 0xFC, 0xC8, 0xE9, 0x72, 0x27, 0x21, 0x35, 0xFE, 0x30, 0x5F, 0x57, + 0xE5, 0x40, 0xF9, 0x32, 0x42, 0x4C, 0x5A, 0x32, 0x97, 0x30, 0xE6, 0x29, + 0xCC, 0xF9, 0xDF, 0xEF, 0xBB, 0xD4, 0x32, 0xD2, 0x46, 0xBB, 0x5A, 0xC5, + 0x7C, 0xAC, 0xA8, 0xBA, 0x28, 0xB4, 0xAA, 0xB0, 0xCF, 0xBA, 0xF9, 0xBE, + 0x62, 0xC3, 0xD7, 0xD5, 0xC5, 0xDD, 0x4C, 0xD4, 0x23, 0xF3, 0xBE, 0xDA, + 0x96, 0xE7, 0x38, 0xE9, 0xAF, 0xE7, 0xD2, 0xF4, 0xE2, 0xF6, 0xA3, 0xE8, + 0x31, 0xFE, 0x33, 0xE3, 0x13, 0x0A, 0xC4, 0xED, 0x3F, 0x0C, 0xFB, 0xDF, + 0x4D, 0x07, 0x69, 0xE4, 0x23, 0x02, 0x5A, 0xFC, 0xBE, 0xED, 0xB8, 0xEF, + 0xCB, 0xC8, 0x63, 0xCE, 0x35, 0xC9, 0x23, 0xD0, 0x19, 0xF3, 0x6B, 0xEE, + 0x34, 0xE9, 0x1F, 0xF9, 0xAC, 0xD6, 0xE8, 0xED, 0x7E, 0xEC, 0x2D, 0xF6, + 0xCB, 0xF1, 0x15, 0xF9, 0x6A, 0xFB, 0x3D, 0xFD, 0xA3, 0xF7, 0xE6, 0x0F, + 0x85, 0xD7, 0x98, 0xF9, 0x5B, 0xC1, 0x47, 0xDD, 0x94, 0xB7, 0x42, 0xDE, + 0xF3, 0xA8, 0x79, 0xC8, 0x53, 0x9C, 0x63, 0xA1, 0x0E, 0xB3, 0xDA, 0xAD, + 0xC9, 0xDD, 0x0E, 0xCE, 0x6B, 0x02, 0x9A, 0xDE, 0x0E, 0x21, 0xFF, 0x0C, + 0xB7, 0x3B, 0x1D, 0x3F, 0xEA, 0x42, 0xA4, 0x3A, 0x7E, 0x3A, 0xF6, 0x16, + 0x5D, 0x20, 0x97, 0x03, 0x4B, 0xF0, 0xDA, 0xF0, 0x59, 0xC4, 0x52, 0xD1, + 0xE7, 0xBE, 0x96, 0xC3, 0xA5, 0xCB, 0xD7, 0xC3, 0x7A, 0xC8, 0x1D, 0xC3, + 0x63, 0xE4, 0x7A, 0xEA, 0x79, 0x0D, 0x23, 0x16, 0x9D, 0x1C, 0x32, 0x14, + 0x9B, 0x0D, 0x52, 0xFD, 0xFF, 0xFB, 0x40, 0xED, 0x8F, 0x03, 0xD8, 0x05, + 0x11, 0x00, 0x9A, 0x13, 0x8F, 0x13, 0xDF, 0x0A, 0xEC, 0x2C, 0x2E, 0x18, + 0x94, 0x23, 0x71, 0x12, 0x47, 0x26, 0xB1, 0x0C, 0x3D, 0x23, 0x58, 0x24, + 0x55, 0xFD, 0xD2, 0x0C, 0xFD, 0xDC, 0xB4, 0xDA, 0xF2, 0xEC, 0xB9, 0xF9, + 0xEE, 0x04, 0xD7, 0x1B, 0xC8, 0xF9, 0xCF, 0xFC, 0xF6, 0x05, 0xF6, 0xFA, + 0x21, 0x32, 0x44, 0x11, 0x27, 0x38, 0x04, 0x0C, 0x52, 0x1E, 0x9C, 0x16, + 0xA6, 0x12, 0xC6, 0x18, 0x4D, 0x06, 0x5B, 0x07, 0xFF, 0xEF, 0x21, 0xFE, + 0x6A, 0xEC, 0x4F, 0xE7, 0xFE, 0xD9, 0xA7, 0xD0, 0xC9, 0xBA, 0x40, 0xC4, + 0x83, 0xBF, 0x13, 0xDE, 0x81, 0xD5, 0x1B, 0x05, 0xF4, 0xEF, 0x5A, 0x14, + 0xF2, 0x09, 0xC8, 0x29, 0x54, 0x23, 0x8B, 0x39, 0x6A, 0x33, 0xBD, 0x3C, + 0xE9, 0x31, 0x1F, 0x26, 0x3E, 0x14, 0xF2, 0xFA, 0x7A, 0xDC, 0x39, 0xDC, + 0x64, 0xC0, 0xC2, 0xC5, 0xF4, 0xCA, 0x1A, 0xC3, 0x5D, 0xD6, 0x95, 0xCC, + 0x57, 0xE0, 0x2D, 0xCC, 0xB0, 0xE7, 0x7E, 0xCE, 0xDC, 0xE8, 0x5C, 0xD6, + 0xCA, 0xF3, 0x20, 0xD7, 0x8E, 0xE6, 0x6E, 0xC7, 0x18, 0xE0, 0x0D, 0xD3, + 0x58, 0xF7, 0xCD, 0xDF, 0xA6, 0x03, 0xAB, 0xDB, 0x61, 0x12, 0x0A, 0x02, + 0x72, 0x1A, 0x1E, 0x15, 0xA4, 0x15, 0x9C, 0x02, 0x4C, 0x08, 0xCE, 0x0B, + 0xD7, 0xF8, 0x95, 0x1A, 0x78, 0xE6, 0x61, 0x14, 0x3F, 0xD4, 0x44, 0x09, + 0xE6, 0xE8, 0xF3, 0x0A, 0x8C, 0xF5, 0xBF, 0x0D, 0x97, 0xEB, 0xCC, 0xFE, + 0x1D, 0x05, 0x17, 0xFA, 0xA9, 0x1A, 0x53, 0x0E, 0x23, 0x18, 0x07, 0x25, + 0x2A, 0x1E, 0x42, 0x29, 0x51, 0x0D, 0x10, 0x16, 0xC4, 0xE8, 0x59, 0x0A, + 0xBE, 0xD9, 0x4B, 0xF7, 0x44, 0xD2, 0x57, 0xDF, 0x73, 0xCA, 0x7A, 0xD1, + 0x8D, 0xD0, 0x69, 0xC7, 0x72, 0xD4, 0x5B, 0xDB, 0x27, 0xEF, 0xE6, 0x0A, + 0x59, 0x2B, 0xA6, 0x2A, 0x1C, 0x4D, 0x05, 0x35, 0xF9, 0x55, 0x64, 0x4A, + 0x55, 0x5D, 0xA2, 0x4F, 0xB7, 0x52, 0x61, 0x40, 0x6D, 0x29, 0xA7, 0x2A, + 0x71, 0x03, 0xD9, 0x0E, 0xA3, 0xFA, 0x1F, 0xF2, 0x70, 0xF5, 0x3E, 0xDF, + 0x95, 0xF2, 0x10, 0xEC, 0xFF, 0xF8, 0xEC, 0x00, 0x21, 0xED, 0xBB, 0x02, + 0xFB, 0xEE, 0xE4, 0xFD, 0x9F, 0xFD, 0x12, 0xFC, 0x79, 0xF1, 0xA5, 0xF8, + 0xCC, 0x05, 0x30, 0x08, 0xC7, 0x28, 0xC3, 0x2A, 0xEA, 0x2E, 0xB0, 0x45, + 0x83, 0x39, 0x48, 0x38, 0x1F, 0x3B, 0x89, 0x2B, 0x79, 0x2A, 0x0F, 0x3B, + 0x00, 0x2C, 0x38, 0x3E, 0x42, 0x1A, 0xF9, 0x3D, 0xA4, 0xE6, 0x9E, 0x20, + 0x26, 0xEF, 0xC0, 0xFE, 0x50, 0x12, 0x7F, 0x0D, 0x87, 0x06, 0x86, 0x12, + 0x66, 0x0F, 0xDE, 0x00, 0x90, 0x35, 0x38, 0x0E, 0x18, 0x50, 0xF6, 0x25, + 0xAB, 0x58, 0x67, 0x2F, 0x62, 0x4E, 0x7E, 0x37, 0xC0, 0x35, 0xF0, 0x21, + 0x18, 0x12, 0xD3, 0x0A, 0x7B, 0x03, 0x0B, 0x05, 0xC8, 0xF3, 0xC7, 0xFC, + 0x25, 0xCC, 0xE6, 0xF6, 0xEB, 0xCF, 0x4E, 0xEC, 0xD4, 0xFC, 0x2F, 0xF8, + 0xF1, 0x1E, 0x83, 0x1E, 0xD9, 0x38, 0xE6, 0x40, 0x7A, 0x50, 0xEF, 0x55, + 0x57, 0x58, 0x00, 0x53, 0x9D, 0x54, 0x54, 0x53, 0xAE, 0x3F, 0x67, 0x49, + 0xA9, 0x1A, 0xC7, 0x14, 0xC9, 0x04, 0x48, 0xF8, 0xE9, 0xF9, 0xA1, 0xFE, + 0xE6, 0xFE, 0x25, 0xF9, 0x7C, 0xFB, 0xDA, 0xD4, 0x4A, 0xE7, 0xA7, 0xD6, + 0x56, 0xF9, 0x8F, 0x02, 0x75, 0x18, 0x94, 0xFC, 0xFD, 0x11, 0x35, 0xE6, + 0x61, 0x09, 0xAC, 0xDD, 0xCA, 0x19, 0x5B, 0xED, 0x6C, 0x24, 0xCE, 0x0A, + 0x0B, 0x24, 0x11, 0x1A, 0x7B, 0x17, 0x36, 0x1C, 0x3A, 0x03, 0x2F, 0x0F, + 0x1A, 0x03, 0x22, 0x12, 0xE4, 0x0C, 0xA3, 0x22, 0x8A, 0xFE, 0xF6, 0x21, + 0x15, 0xE3, 0x97, 0x0F, 0x12, 0xE2, 0x30, 0xF7, 0x16, 0xFB, 0x7C, 0xEC, + 0x65, 0xFC, 0x77, 0xFB, 0x70, 0xE6, 0x6F, 0x02, 0xE0, 0x00, 0x05, 0x01, + 0x4F, 0x1E, 0xAA, 0xFE, 0xB2, 0x17, 0x1A, 0xF3, 0xAE, 0x10, 0x4F, 0xFD, + 0x0B, 0xF9, 0x52, 0xF0, 0xBF, 0xDA, 0x10, 0xC0, 0x4D, 0xB9, 0xF9, 0xBF, + 0x77, 0xA4, 0xC1, 0xC1, 0xB0, 0xA1, 0x3B, 0xA1, 0x30, 0xA9, 0x82, 0xB8, + 0x94, 0xCB, 0xD7, 0xE2, 0xF4, 0xEB, 0x73, 0xE6, 0xEA, 0xFD, 0x35, 0xF1, + 0xAF, 0x19, 0x16, 0x0C, 0x6E, 0x2A, 0x43, 0x06, 0xE5, 0x21, 0xB0, 0xF7, + 0x0F, 0x15, 0xB7, 0x08, 0xF7, 0xF6, 0x14, 0xFA, 0xF5, 0xE3, 0xFD, 0xCD, + 0x12, 0xEF, 0x92, 0xC0, 0x27, 0xDD, 0xD4, 0xC0, 0x64, 0xC0, 0x44, 0xB6, + 0x15, 0xC8, 0xE5, 0xBF, 0x1E, 0xD0, 0x18, 0xDC, 0xF2, 0xCF, 0xFA, 0xE5, + 0xFF, 0xD6, 0xAE, 0xDB, 0x38, 0xD3, 0x02, 0xDF, 0x21, 0xD5, 0x22, 0xED, + 0x19, 0xD6, 0xC5, 0xE2, 0x77, 0xD0, 0xBA, 0xED, 0x20, 0xD9, 0x83, 0x04, + 0x20, 0xE1, 0x1C, 0x05, 0x3E, 0xE0, 0x27, 0xEC, 0x16, 0xF4, 0x94, 0xD8, + 0xE9, 0x01, 0xAA, 0xF0, 0xA2, 0xEC, 0x2A, 0xEC, 0x5A, 0xDA, 0xD9, 0xD4, + 0x1B, 0xD9, 0x86, 0xDF, 0x03, 0xEA, 0xBA, 0xD5, 0x86, 0xE8, 0x5D, 0xC3, + 0x4B, 0xEC, 0xC1, 0xDE, 0x95, 0x13, 0x2A, 0xEA, 0x15, 0x16, 0xEE, 0xD8, + 0x07, 0xF7, 0x24, 0xDD, 0x67, 0xE0, 0x6F, 0xEF, 0xD9, 0xC6, 0xF7, 0xE0, + 0x9E, 0xBD, 0x70, 0xC0, 0x16, 0xB7, 0xB4, 0xC9, 0x44, 0x9F, 0x5C, 0xD0, + 0x3C, 0xA0, 0xF1, 0xBE, 0x33, 0xB4, 0xBC, 0xD0, 0x8D, 0xD9, 0xA3, 0xFC, + 0xFD, 0xFC, 0xE7, 0x0E, 0x83, 0x12, 0x7B, 0x10, 0x76, 0x20, 0x6A, 0x0E, + 0xA0, 0x1C, 0xF3, 0x0E, 0x14, 0x15, 0x37, 0x0B, 0xE7, 0x06, 0x7E, 0x07, + 0xE1, 0xF4, 0x6A, 0xF4, 0xAE, 0xE9, 0x2E, 0xCE, 0x63, 0xEA, 0xFB, 0xCD, + 0xB1, 0xEE, 0x65, 0xE2, 0x06, 0xE2, 0x27, 0xE4, 0x7C, 0xD4, 0x57, 0xE3, + 0x58, 0xE0, 0x00, 0xF3, 0xFC, 0xF8, 0x5C, 0xEE, 0x3B, 0xF7, 0x32, 0xD8, + 0x7A, 0xDF, 0x89, 0xE3, 0x34, 0xDF, 0xE5, 0x01, 0x89, 0xF7, 0x9F, 0x0D, + 0x1F, 0x1E, 0x6D, 0x16, 0x0C, 0x34, 0x82, 0x26, 0xEA, 0x24, 0xA1, 0x1F, + 0x9F, 0x26, 0xB7, 0x13, 0x91, 0x34, 0x0B, 0x25, 0xBC, 0x15, 0xA7, 0x2F, + 0xED, 0xF3, 0x47, 0x0D, 0x28, 0xFF, 0xC8, 0x09, 0x5B, 0x0C, 0x27, 0x35, + 0xB4, 0x0C, 0x9C, 0x18, 0xD1, 0x15, 0x93, 0xEE, 0x62, 0x1A, 0x03, 0x0A, + 0xAC, 0x20, 0xCE, 0x1F, 0xF6, 0x2B, 0x63, 0x2B, 0x75, 0x35, 0x30, 0x2D, + 0x82, 0x33, 0x66, 0x16, 0x27, 0x15, 0x54, 0x05, 0xDC, 0x01, 0x5A, 0x00, + 0xDD, 0xF2, 0x30, 0xFF, 0x8F, 0xD6, 0xF3, 0xF3, 0xC3, 0xE3, 0x5E, 0xF2, + 0xCD, 0x04, 0xAE, 0xFD, 0xED, 0x06, 0x64, 0x0C, 0x17, 0x14, 0x98, 0x2F, + 0x71, 0x30, 0x1E, 0x43, 0xB7, 0x30, 0x1D, 0x3E, 0x67, 0x2B, 0xED, 0x3F, + 0xB3, 0x35, 0xC5, 0x48, 0x3D, 0x33, 0xFD, 0x40, 0xB3, 0x1D, 0xEE, 0x27, + 0xE5, 0x07, 0x56, 0x13, 0x84, 0x02, 0x12, 0x10, 0xA9, 0x09, 0x4A, 0x12, + 0x6E, 0x0E, 0xFC, 0x05, 0x9B, 0x05, 0x4E, 0x07, 0xF8, 0xF4, 0x4E, 0x16, + 0x7F, 0xE9, 0x65, 0x02, 0x4A, 0xDD, 0x99, 0xE8, 0x77, 0xE5, 0xF6, 0x03, + 0xCA, 0xF6, 0xD7, 0x21, 0xCE, 0x03, 0xA8, 0x1F, 0xBD, 0x1D, 0xDD, 0x19, + 0x84, 0x2C, 0x3B, 0x21, 0xBA, 0x29, 0xC7, 0x1E, 0x0C, 0x37, 0x3B, 0x1E, + 0xC5, 0x44, 0xD1, 0x2D, 0x2A, 0x30, 0x99, 0x25, 0x82, 0x20, 0x44, 0x14, + 0xB8, 0x29, 0x1C, 0x1D, 0x85, 0x17, 0x6C, 0x21, 0xA7, 0x02, 0xC7, 0x00, + 0x03, 0x1D, 0x28, 0xF9, 0x4E, 0x38, 0x59, 0x09, 0x3F, 0x35, 0x34, 0xFF, + 0x9E, 0x3A, 0x75, 0x0B, 0x4D, 0x4A, 0x6B, 0x25, 0xA0, 0x29, 0x44, 0x14, + 0x94, 0xFA, 0xBE, 0xF3, 0x99, 0xEF, 0x73, 0xE8, 0x36, 0xE9, 0x67, 0xEA, + 0x1E, 0xDF, 0xBA, 0xE8, 0x3D, 0xE8, 0x51, 0xE8, 0xE1, 0xF6, 0xE8, 0xFA, + 0x7C, 0xF8, 0x72, 0x14, 0x29, 0x0E, 0x68, 0x23, 0xB6, 0x2B, 0x0E, 0x34, + 0xEA, 0x33, 0xD5, 0x42, 0x16, 0x36, 0x68, 0x40, 0xB9, 0x30, 0x66, 0x35, + 0xC8, 0x2E, 0x98, 0x25, 0x54, 0x24, 0xF1, 0x0E, 0xCA, 0x11, 0xB6, 0x02, + 0xBC, 0x0B, 0xDA, 0x01, 0x9D, 0xEE, 0x2E, 0xFA, 0x08, 0xD4, 0xA9, 0xF4, + 0x96, 0xD5, 0xE4, 0xFD, 0x8B, 0xCF, 0x46, 0xFC, 0xF8, 0xD5, 0xD3, 0xE3, + 0x1F, 0xE2, 0x08, 0xD3, 0x5A, 0xEA, 0x65, 0xE7, 0x8B, 0xF3, 0x19, 0xFD, + 0x47, 0xF8, 0xD5, 0x09, 0xA7, 0x16, 0xB6, 0x26, 0xC3, 0x29, 0xCA, 0x22, + 0x36, 0x18, 0x03, 0x10, 0x17, 0x24, 0x33, 0x1D, 0xA5, 0x37, 0x27, 0x28, + 0x34, 0x1A, 0x27, 0x0C, 0xEF, 0xF6, 0x00, 0xF6, 0x34, 0xF2, 0xE5, 0x01, + 0x91, 0xF1, 0xB0, 0xF5, 0x68, 0xEC, 0x45, 0xE3, 0x14, 0x06, 0x2C, 0xF8, + 0xCA, 0x20, 0xF7, 0x0F, 0x89, 0x1B, 0xBE, 0x03, 0xD5, 0x29, 0x07, 0xF7, + 0x9E, 0x2F, 0x71, 0x0C, 0x3F, 0x10, 0xCB, 0x0E, 0xB3, 0xFF, 0xD4, 0xE9, + 0xD3, 0xE6, 0x68, 0xDD, 0x2D, 0xC8, 0xE0, 0xE4, 0xAB, 0xCC, 0xC4, 0xD5, + 0x1E, 0xE0, 0x25, 0xDC, 0xEE, 0xE9, 0xFE, 0xF6, 0x37, 0xF2, 0x18, 0xFB, + 0xB8, 0x04, 0x52, 0x02, 0x05, 0x1B, 0x23, 0x20, 0xF0, 0x25, 0x46, 0x26, + 0x9C, 0x26, 0x4B, 0x1B, 0xA6, 0x25, 0x91, 0x15, 0xC9, 0x1C, 0xE7, 0x08, + 0x49, 0x03, 0x71, 0x03, 0x4A, 0xE1, 0x26, 0xFC, 0xE1, 0xD7, 0xD8, 0xE3, + 0xB3, 0xCB, 0x66, 0xCF, 0x2E, 0xC4, 0x60, 0xCD, 0x1E, 0xD5, 0xC4, 0xCA, + 0xF1, 0xD4, 0xF9, 0xE0, 0x0C, 0xCC, 0x51, 0xEC, 0x7A, 0xCB, 0x9C, 0xD0, + 0x51, 0xCC, 0x70, 0xD2, 0x40, 0xD6, 0x4E, 0xEA, 0x5E, 0xF4, 0x79, 0xF9, + 0x03, 0x0C, 0xD4, 0x0A, 0xE8, 0x0F, 0x0E, 0x06, 0x10, 0x01, 0x09, 0xE3, + 0x25, 0xEC, 0xF1, 0xE9, 0xDD, 0xE6, 0x54, 0xFE, 0x7D, 0xD6, 0x4A, 0xEA, + 0x24, 0xD1, 0x99, 0xE2, 0xD8, 0xF0, 0x46, 0xED, 0x23, 0x02, 0xBD, 0xD6, + 0xAE, 0xFF, 0xCD, 0xCA, 0xB1, 0xFF, 0xD6, 0xE7, 0x5B, 0x07, 0x34, 0xE6, + 0xF0, 0x05, 0xC1, 0xD6, 0x91, 0x03, 0xB3, 0xE9, 0x15, 0x00, 0xCE, 0xF8, + 0x0B, 0xE4, 0x2E, 0xE7, 0xB2, 0xD2, 0x88, 0xC3, 0x27, 0xC2, 0x8D, 0xB1, + 0xB4, 0xAB, 0xBF, 0xB9, 0xDC, 0xB2, 0x85, 0xC3, 0xD0, 0xCC, 0xAB, 0xC6, + 0xA2, 0xDE, 0xB3, 0xDD, 0x07, 0xF0, 0xF5, 0x06, 0x11, 0x02, 0xBA, 0x0C, + 0x1A, 0xFE, 0xC7, 0x02, 0x12, 0x00, 0xB1, 0x06, 0xA3, 0x15, 0x8F, 0x05, + 0x48, 0x0C, 0x22, 0x0C, 0x93, 0xEB, 0xFE, 0x0A, 0x28, 0xEB, 0x9E, 0xFC, + 0x53, 0xF1, 0xAB, 0xF4, 0x82, 0xF0, 0x35, 0xFD, 0x85, 0xF8, 0xD4, 0x0C, + 0x9A, 0x00, 0xB3, 0x07, 0x65, 0x05, 0x5A, 0x04, 0xA8, 0xFD, 0x33, 0x10, + 0x0A, 0xE9, 0x30, 0x0D, 0x9A, 0xD4, 0x39, 0xFF, 0xB4, 0xE5, 0x81, 0xFC, + 0x62, 0x04, 0xF3, 0xF6, 0xAE, 0x0E, 0x48, 0xF8, 0x2A, 0x1A, 0x55, 0x09, + 0xF9, 0x17, 0xDA, 0x11, 0xBD, 0x0F, 0xCC, 0x07, 0x9B, 0x1D, 0x70, 0x04, + 0x85, 0x2F, 0x9B, 0x13, 0x60, 0x35, 0x51, 0x23, 0x5C, 0x33, 0xFA, 0x2A, + 0x75, 0x29, 0xEB, 0x1F, 0x66, 0x18, 0x9E, 0x17, 0x99, 0x0E, 0xD1, 0x18, + 0xCD, 0x19, 0xA7, 0x1C, 0x68, 0x28, 0x8D, 0x17, 0xAE, 0x24, 0xAE, 0x0E, + 0xAB, 0x13, 0x08, 0x20, 0x6B, 0x15, 0x75, 0x2E, 0x05, 0x17, 0xE9, 0x1A, + 0x05, 0x02, 0xB1, 0x03, 0x5C, 0xF8, 0x29, 0x04, 0x6D, 0xF6, 0x9D, 0x03, + 0x16, 0xF1, 0x9F, 0x03, 0x84, 0xEF, 0x2F, 0x0B, 0xB8, 0xEC, 0x5A, 0xFE, + 0x56, 0xE5, 0xC6, 0xF5, 0xE1, 0xE9, 0x03, 0x03, 0x34, 0xF2, 0xB6, 0x0F, + 0xEE, 0xEF, 0xFA, 0x14, 0x67, 0xF8, 0xF1, 0x14, 0x9E, 0x00, 0x5B, 0x12, + 0xF6, 0xF5, 0xD1, 0x06, 0x37, 0xF2, 0x77, 0xFF, 0x5E, 0xF8, 0x04, 0xFD, + 0x0D, 0xFC, 0x89, 0xF6, 0x24, 0x09, 0xCB, 0xF6, 0x21, 0x12, 0xC7, 0xEC, + 0xD8, 0xFE, 0x0A, 0xE2, 0xF8, 0xE8, 0xE6, 0xE4, 0xEB, 0xE5, 0xDF, 0xDF, + 0xE1, 0xE0, 0x0B, 0xDB, 0x2C, 0xDB, 0x52, 0xE3, 0x1B, 0xE1, 0xB4, 0xF1, + 0x58, 0xEF, 0x15, 0xE7, 0xDF, 0xFF, 0xB2, 0xD6, 0xF3, 0x0A, 0x2C, 0xF2, + 0x75, 0xFD, 0x80, 0x0C, 0xFF, 0xF7, 0x1D, 0x04, 0x46, 0x0D, 0x75, 0x05, + 0x9F, 0x07, 0xEA, 0x0B, 0x36, 0xEF, 0x42, 0x0E, 0xE3, 0xEE, 0x22, 0x0C, + 0x8F, 0xFA, 0x20, 0xFB, 0x56, 0x05, 0xCD, 0xF2, 0x04, 0x1F, 0xA9, 0xF2, + 0xB0, 0x28, 0xA7, 0xFB, 0xB3, 0x14, 0xD4, 0xFB, 0x47, 0x07, 0x7E, 0xF9, + 0x03, 0x09, 0x77, 0xF8, 0xAE, 0x0E, 0x53, 0xF7, 0x5A, 0x02, 0x0B, 0x00, + 0x20, 0xEF, 0xCF, 0xF5, 0x58, 0xEE, 0x05, 0xDE, 0xED, 0xE4, 0x01, 0xD1, + 0xD8, 0xCF, 0xAF, 0xD4, 0x9F, 0xC9, 0xB8, 0xE0, 0x04, 0xD4, 0xB1, 0xF6, + 0x3A, 0xEB, 0xCD, 0x08, 0xC4, 0xF9, 0x0E, 0x1E, 0x17, 0xFD, 0xF7, 0x2F, + 0x88, 0x06, 0xEB, 0x1A, 0x9A, 0x0C, 0xB9, 0x0B, 0x5D, 0x15, 0x76, 0x10, + 0x14, 0x0F, 0x94, 0x14, 0x32, 0xFA, 0xCE, 0x1C, 0x5B, 0x05, 0x5A, 0x11, + 0x23, 0x0B, 0xA8, 0xFF, 0xFD, 0xFB, 0x94, 0x06, 0x60, 0xF9, 0xA3, 0x02, + 0xFD, 0x08, 0x10, 0xE8, 0x64, 0x1A, 0x81, 0xDF, 0x11, 0x12, 0xC7, 0xF2, + 0xBC, 0x02, 0xC6, 0xFD, 0xFA, 0xFD, 0xFC, 0xFB, 0x89, 0xFE, 0x34, 0x0C, + 0xD5, 0x0B, 0x71, 0x15, 0x9D, 0x2C, 0x18, 0x0E, 0x6E, 0x43, 0x7D, 0x0A, + 0xAD, 0x27, 0x33, 0xFE, 0x87, 0x07, 0x3B, 0xF7, 0x0E, 0x13, 0x9D, 0x0F, + 0x4B, 0x1D, 0x69, 0x27, 0x3D, 0x28, 0x2F, 0x2B, 0x2C, 0x41, 0xED, 0x34, + 0x9C, 0x45, 0x23, 0x3D, 0x58, 0x33, 0x1D, 0x32, 0x68, 0x25, 0x37, 0x1B, + 0x02, 0x25, 0xB0, 0x13, 0x86, 0x26, 0xEF, 0x1B, 0xD6, 0x2D, 0xCD, 0x13, + 0x08, 0x31, 0x5B, 0x19, 0xE7, 0x29, 0x4C, 0x35, 0x49, 0x13, 0x6C, 0x30, + 0x1C, 0xFA, 0xBD, 0x20, 0xF4, 0x01, 0xB4, 0x0E, 0x98, 0x0B, 0x82, 0xFD, + 0xE0, 0xFC, 0xD2, 0x18, 0xC8, 0xF5, 0xC5, 0x3A, 0x4E, 0x08, 0x7C, 0x36, + 0x61, 0x09, 0x2E, 0x24, 0xD3, 0x09, 0xC4, 0x2C, 0xB3, 0x21, 0xEE, 0x2B, + 0x12, 0x1D, 0xD3, 0x12, 0xB8, 0x10, 0x68, 0x15, 0x84, 0x1C, 0xAA, 0x1C, + 0x4E, 0x20, 0xE0, 0x14, 0xC0, 0x17, 0x51, 0x09, 0x0A, 0x20, 0x1B, 0xF9, + 0xCD, 0x2C, 0xA1, 0xFE, 0xFA, 0x1E, 0x9A, 0x08, 0x6F, 0x08, 0x25, 0x02, + 0x38, 0xFB, 0x2C, 0x07, 0x94, 0xF3, 0x8D, 0x0F, 0xB8, 0xF8, 0xA2, 0x0A, + 0x43, 0x05, 0xB0, 0xFF, 0x63, 0x0A, 0x6C, 0xF9, 0xEF, 0x04, 0x03, 0xF2, + 0xA8, 0x05, 0x55, 0xF2, 0xBD, 0x03, 0x2D, 0xFF, 0x6A, 0xF0, 0x6A, 0x02, + 0xD7, 0xF1, 0xCB, 0xFD, 0x33, 0x0D, 0x68, 0xF4, 0xB8, 0x18, 0x8E, 0xF3, + 0xA8, 0x0D, 0xBD, 0xF6, 0xF8, 0x03, 0x1A, 0xFB, 0x18, 0x09, 0xB2, 0xF8, + 0x39, 0x05, 0x44, 0xD5, 0xB5, 0xF8, 0xA2, 0xCF, 0x85, 0x01, 0x53, 0xF6, + 0x0F, 0xF0, 0xB7, 0xF5, 0x1A, 0xDA, 0xB7, 0xD3, 0x86, 0xEC, 0xCA, 0xCE, + 0xF9, 0xF1, 0x21, 0xEA, 0xA3, 0xE3, 0xC3, 0xFE, 0xA5, 0xE1, 0xE6, 0xFF, + 0x9F, 0xF1, 0xDE, 0x03, 0xE9, 0xEB, 0xD3, 0x03, 0xFE, 0xD8, 0x46, 0x06, + 0x5B, 0xD3, 0x1A, 0x03, 0x19, 0xD3, 0xA7, 0xF0, 0x32, 0xDA, 0xD1, 0xEB, + 0x40, 0xDF, 0x29, 0xEB, 0x86, 0xE6, 0xEC, 0xF1, 0x0F, 0xE9, 0xB3, 0xEC, + 0x07, 0xEE, 0x8E, 0xDE, 0xAA, 0xF2, 0x54, 0xE0, 0x46, 0xE4, 0x8A, 0xE5, + 0x90, 0xD3, 0x13, 0xE3, 0x15, 0xDB, 0x7F, 0xE1, 0xD8, 0xF4, 0xBF, 0xF1, + 0xE6, 0xEC, 0xB2, 0xE8, 0x0A, 0xD0, 0xD0, 0xD4, 0x06, 0xD0, 0x34, 0xEC, + 0xA6, 0xD5, 0x38, 0xEF, 0xF0, 0xD5, 0xAF, 0xCA, 0x2E, 0xE7, 0xE0, 0xC3, + 0x0D, 0xF1, 0x18, 0xCB, 0xDB, 0xE7, 0xF4, 0xC8, 0x0C, 0xFC, 0x8D, 0xD1, + 0x30, 0x13, 0x06, 0xDD, 0x51, 0xF4, 0xC1, 0xDD, 0xB6, 0xDF, 0xD4, 0xE9, + 0x2E, 0xF1, 0x71, 0x00, 0x3D, 0xF4, 0x07, 0xF6, 0x5C, 0xE8, 0x72, 0xF2, + 0xAF, 0xED, 0x86, 0x0C, 0x00, 0xF2, 0x9A, 0x04, 0x23, 0xE4, 0x91, 0xE7, + 0x5B, 0xE2, 0x75, 0xE8, 0x72, 0xE4, 0x23, 0xF8, 0x07, 0xCD, 0x7C, 0xFE, + 0x9B, 0xC0, 0x6A, 0x03, 0x27, 0xDC, 0xE5, 0x0B, 0xFD, 0xF7, 0xD9, 0x13, + 0x71, 0xFD, 0xA7, 0x0D, 0xB1, 0xF3, 0x85, 0xFD, 0x0A, 0xF1, 0x56, 0x11, + 0xB3, 0xEB, 0x67, 0x1A, 0xE9, 0xDF, 0x82, 0xF3, 0x80, 0xF2, 0x02, 0xE8, + 0x2E, 0x0B, 0xA0, 0xF5, 0x55, 0x13, 0xCF, 0xF4, 0xDA, 0x11, 0x54, 0xE4, + 0x18, 0x0B, 0x7C, 0xD7, 0xB7, 0xF4, 0xC9, 0xE2, 0x43, 0xE0, 0x34, 0xFF, + 0xB2, 0xF1, 0xE7, 0x07, 0xA9, 0x01, 0xC4, 0xF1, 0x3E, 0xFC, 0xA8, 0xEE, + 0x65, 0x02, 0x31, 0xFE, 0x75, 0x12, 0x47, 0x0F, 0x20, 0x0C, 0x08, 0x21, + 0x50, 0x02, 0x4E, 0x10, 0x69, 0x0C, 0x67, 0xF7, 0x99, 0x06, 0x57, 0xF9, + 0x41, 0x00, 0xA7, 0xEF, 0xA6, 0x09, 0xB4, 0xE2, 0xE6, 0x03, 0x8C, 0xEE, + 0x2E, 0x00, 0xF3, 0xF8, 0x92, 0x04, 0x82, 0xF3, 0x70, 0xFB, 0xAE, 0xF7, + 0x82, 0xED, 0x57, 0xF8, 0xAD, 0xEB, 0x02, 0xF1, 0x81, 0x02, 0x3B, 0x10, + 0x36, 0x18, 0xA7, 0x1E, 0x6E, 0x1C, 0x6A, 0x03, 0xF8, 0x22, 0x19, 0xFF, + 0x81, 0x22, 0x1A, 0xFA, 0xCD, 0x07, 0x61, 0xF4, 0x44, 0xEA, 0x2C, 0x07, + 0xD8, 0xFE, 0xC2, 0x10, 0xA5, 0x20, 0xF3, 0x05, 0x77, 0x17, 0x62, 0x07, + 0xF9, 0x0E, 0x96, 0x16, 0x99, 0x0D, 0xCC, 0x17, 0xB3, 0xF7, 0x7B, 0x10, + 0x4C, 0xFA, 0xCF, 0x17, 0x8F, 0x18, 0x2E, 0x35, 0x9F, 0x12, 0x84, 0x38, + 0x99, 0x0B, 0xAE, 0x1B, 0xCC, 0x24, 0x0F, 0x25, 0x5A, 0x28, 0x22, 0x3F, + 0x34, 0x10, 0xC5, 0x27, 0x34, 0x01, 0xAF, 0x08, 0xB7, 0x07, 0xFB, 0x0B, + 0xD0, 0x0E, 0x2B, 0x15, 0x18, 0x16, 0xB7, 0x28, 0x3A, 0x36, 0x5D, 0x4E, + 0x42, 0x50, 0xA2, 0x5F, 0xF0, 0x49, 0xA5, 0x5A, 0x30, 0x53, 0x68, 0x60, + 0x2D, 0x5F, 0x22, 0x57, 0x97, 0x3C, 0x56, 0x37, 0x81, 0x3A, 0xE9, 0x41, + 0x67, 0x55, 0x5A, 0x49, 0xE3, 0x30, 0xFD, 0x1B, 0x2B, 0x1B, 0x0F, 0x12, + 0xBE, 0x4C, 0x57, 0x3F, 0x44, 0x5A, 0xEA, 0x47, 0x06, 0x3B, 0xF6, 0x26, + 0x86, 0x2E, 0x75, 0x17, 0x45, 0x13, 0x85, 0x0F, 0x4A, 0xFC, 0x2F, 0x06, + 0x49, 0xEE, 0xB4, 0xE9, 0xCA, 0xD5, 0xED, 0xCB, 0xC0, 0xCD, 0xFA, 0xC9, + 0xB4, 0xBD, 0x6D, 0xC0, 0xF8, 0xB6, 0xFF, 0xBE, 0x9C, 0xBF, 0xA6, 0xBE, + 0x25, 0xAF, 0xAD, 0xAE, 0xAF, 0xA4, 0xBC, 0xB2, 0x34, 0xAE, 0x65, 0xB2, + 0x19, 0xA8, 0x43, 0xA4, 0x7F, 0x9C, 0x75, 0xAD, 0x35, 0xC0, 0x54, 0xD3, + 0x98, 0xE1, 0xC2, 0xE6, 0x5E, 0xCE, 0x91, 0xD6, 0x46, 0xCC, 0x87, 0xCF, + 0xD4, 0xD9, 0x21, 0xD1, 0x4C, 0xE2, 0x65, 0xDC, 0x2F, 0xFB, 0x2D, 0xF6, + 0x52, 0x15, 0x91, 0x0F, 0x0B, 0x31, 0xD7, 0x30, 0x0D, 0x46, 0x84, 0x46, + 0x06, 0x2B, 0x9B, 0x34, 0x8C, 0x19, 0x39, 0x34, 0xE2, 0x2B, 0x55, 0x45, + 0x09, 0x21, 0x61, 0x31, 0x89, 0x1E, 0xFC, 0x26, 0x75, 0x41, 0x29, 0x44, + 0x65, 0x41, 0x54, 0x4F, 0x29, 0x2A, 0xCC, 0x38, 0xDB, 0x31, 0xD9, 0x28, + 0x95, 0x31, 0xEA, 0x22, 0x5D, 0x19, 0xFC, 0x0B, 0xFD, 0x1A, 0x51, 0xFB, + 0xE1, 0x20, 0x76, 0x02, 0x65, 0xFD, 0xBB, 0xF7, 0xF1, 0xF2, 0x99, 0xF5, + 0xD3, 0x07, 0x46, 0x08, 0x17, 0x03, 0x18, 0x08, 0x90, 0xE1, 0xBD, 0xE6, + 0x1C, 0xC3, 0xDE, 0xC6, 0x46, 0xC8, 0x00, 0xCE, 0xB7, 0xC1, 0xD7, 0xBE, + 0xE8, 0xA9, 0xD5, 0x9D, 0xA9, 0xAE, 0x68, 0xA4, 0x7F, 0xB0, 0x74, 0xAA, + 0xC5, 0xAA, 0x3B, 0xA7, 0x9E, 0xB5, 0xA2, 0xB2, 0x7C, 0xB6, 0xFA, 0xB2, + 0x51, 0xAF, 0x48, 0xA7, 0x14, 0xB3, 0x08, 0xA9, 0x75, 0xBB, 0x5E, 0xBA, + 0x88, 0xBD, 0xF1, 0xCA, 0x83, 0xCD, 0xFA, 0xE2, 0xE7, 0xF2, 0x51, 0x00, + 0xE0, 0x06, 0x8C, 0x09, 0x89, 0x10, 0x2A, 0x12, 0x19, 0x27, 0x2E, 0x25, + 0x67, 0x2D, 0x52, 0x2C, 0x55, 0x14, 0x30, 0x26, 0x34, 0x0D, 0x00, 0x25, + 0x89, 0x21, 0x49, 0x2C, 0xBA, 0x22, 0x8B, 0x30, 0x3E, 0x36, 0x4A, 0x47, + 0xCA, 0x57, 0x56, 0x5D, 0xAA, 0x42, 0x78, 0x48, 0xE7, 0x27, 0x84, 0x31, + 0x77, 0x21, 0x94, 0x20, 0x78, 0x0B, 0x52, 0x04, 0x80, 0xFA, 0xF2, 0xF2, + 0xBA, 0xFF, 0x4A, 0xEF, 0x3A, 0xF4, 0x7C, 0xDE, 0xD5, 0xD7, 0x22, 0xCF, + 0x5C, 0xC2, 0x66, 0xC8, 0xD6, 0xB1, 0xD4, 0xB2, 0x45, 0xAE, 0x08, 0xA8, + 0x54, 0xB6, 0xE9, 0xB3, 0x65, 0xC1, 0x96, 0xB9, 0x40, 0xCE, 0x45, 0xB5, + 0xC3, 0xCA, 0x06, 0xBA, 0x51, 0xB8, 0x52, 0xC6, 0x39, 0xBB, 0x12, 0xC4, + 0xF3, 0xC3, 0xAD, 0xB8, 0xB5, 0xC7, 0x18, 0xBF, 0x22, 0xDC, 0x2E, 0xCF, + 0x4B, 0xE2, 0x30, 0xD4, 0x1B, 0xC5, 0x0F, 0xC7, 0xA6, 0xBC, 0x75, 0xBE, + 0xC5, 0xE5, 0x4B, 0xE1, 0x29, 0xFD, 0xF1, 0x10, 0xA9, 0xE9, 0x17, 0x15, + 0x49, 0xE8, 0x64, 0x08, 0x08, 0xF9, 0xEF, 0x04, 0xBB, 0xFC, 0xF1, 0xF9, + 0x1A, 0x00, 0xB9, 0xF6, 0x02, 0x0E, 0x6D, 0x0D, 0x89, 0x1F, 0xDA, 0x21, + 0x9C, 0x2A, 0x57, 0x29, 0x3F, 0x24, 0x26, 0x2B, 0xE3, 0x1E, 0x7F, 0x27, + 0x3E, 0x34, 0xB0, 0x30, 0x2A, 0x48, 0x94, 0x37, 0xA5, 0x4B, 0x1D, 0x3C, + 0x60, 0x47, 0x73, 0x4D, 0xB6, 0x3D, 0x9E, 0x56, 0xD3, 0x35, 0xB8, 0x4D, + 0x77, 0x3D, 0x43, 0x40, 0x7D, 0x38, 0x8D, 0x25, 0x2C, 0x2A, 0xFA, 0x10, + 0x52, 0x21, 0xB6, 0x0D, 0x66, 0x11, 0x37, 0x10, 0x70, 0x12, 0x02, 0x22, + 0x5B, 0x26, 0xCC, 0x34, 0x41, 0x43, 0x68, 0x51, 0xC9, 0x52, 0xF8, 0x69, + 0xEC, 0x51, 0xBF, 0x5B, 0x67, 0x55, 0xBB, 0x4C, 0x75, 0x50, 0x44, 0x4F, + 0xA5, 0x3F, 0xFA, 0x3E, 0xBA, 0x3E, 0x7E, 0x37, 0x1B, 0x4D, 0x0E, 0x4F, + 0x0F, 0x56, 0x27, 0x62, 0x78, 0x5A, 0x08, 0x60, 0xF0, 0x5D, 0x64, 0x55, + 0x89, 0x5C, 0xF5, 0x54, 0xBE, 0x54, 0x74, 0x5C, 0xB1, 0x53, 0x72, 0x66, + 0xC9, 0x53, 0x36, 0x65, 0x91, 0x49, 0x00, 0x58, 0x48, 0x3B, 0x38, 0x4C, + 0xE8, 0x35, 0x5E, 0x47, 0x88, 0x38, 0xF5, 0x42, 0x60, 0x2F, 0xAF, 0x22, + 0xC0, 0x39, 0xC1, 0x0D, 0xCA, 0x46, 0x8D, 0x1A, 0x60, 0x34, 0x61, 0x18, + 0xE6, 0x2D, 0x2B, 0x15, 0xB8, 0x2C, 0xD3, 0x28, 0xFC, 0x21, 0xB5, 0x30, + 0x28, 0x27, 0x73, 0x33, 0x69, 0x2C, 0xAB, 0x44, 0x6C, 0x1B, 0xE1, 0x3B, + 0x6A, 0x0C, 0x76, 0x18, 0x6F, 0x0A, 0x2B, 0x0F, 0x25, 0x09, 0x4F, 0x1A, + 0x42, 0x10, 0x5C, 0x0E, 0x56, 0x0E, 0x9E, 0x03, 0xF9, 0x03, 0xEF, 0x0E, + 0x19, 0x0C, 0xD1, 0x07, 0xF5, 0x07, 0xAB, 0xF3, 0x99, 0xFF, 0x70, 0xFD, + 0x67, 0x05, 0xCF, 0x09, 0x57, 0x0C, 0xA5, 0x09, 0x5D, 0x06, 0x8E, 0xFC, + 0xCF, 0xF9, 0x23, 0xEA, 0xF5, 0xFF, 0xD6, 0xF5, 0x0E, 0xF5, 0x75, 0xEB, + 0x7A, 0xE5, 0xA0, 0xD0, 0xB4, 0xE3, 0x0E, 0xCF, 0xC2, 0xDF, 0xD3, 0xD0, + 0x1B, 0xDD, 0x75, 0xD4, 0xF3, 0xD5, 0xE7, 0xDD, 0x6C, 0xCD, 0x8B, 0xE1, + 0x8E, 0xCF, 0x3B, 0xDE, 0xB2, 0xD4, 0xB1, 0xE0, 0xD2, 0xD2, 0x9B, 0xE8, + 0x20, 0xC7, 0x2D, 0xDE, 0x5B, 0xC0, 0x54, 0xC6, 0x74, 0xC2, 0xD7, 0xB6, + 0xA5, 0xB6, 0x88, 0xAD, 0x8D, 0xAB, 0x2E, 0xAB, 0xC2, 0xA7, 0x9A, 0xA7, + 0x09, 0xB2, 0x52, 0xAB, 0x5B, 0xB9, 0x30, 0xAB, 0xE0, 0xAD, 0xE3, 0x9E, + 0x71, 0xAB, 0xED, 0xA2, 0x72, 0xA2, 0xE8, 0xA3, 0x6A, 0x9B, 0xC9, 0x9A, + 0x95, 0xA3, 0x33, 0xAE, 0x7E, 0xAB, 0xD5, 0xCE, 0x37, 0xC4, 0xF4, 0xD7, + 0xEB, 0xE6, 0x8B, 0xDB, 0xD1, 0xF0, 0x21, 0xE3, 0xBF, 0xF5, 0xCD, 0xF3, + 0x9D, 0x12, 0x89, 0x14, 0xE2, 0x1D, 0x6A, 0x1F, 0x6D, 0x1A, 0xEC, 0x16, + 0x66, 0x1E, 0x77, 0x12, 0x7C, 0x14, 0x79, 0x10, 0x50, 0x15, 0x03, 0x1B, + 0x93, 0x30, 0x16, 0x36, 0xF8, 0x3D, 0xFF, 0x46, 0xDA, 0x39, 0x5C, 0x3F, + 0x0C, 0x44, 0xC5, 0x40, 0xDE, 0x48, 0x68, 0x42, 0xD7, 0x2F, 0x3F, 0x24, + 0x7E, 0x21, 0x03, 0x18, 0x2D, 0x2A, 0x78, 0x23, 0x01, 0x18, 0xB3, 0x0E, + 0x1A, 0xFE, 0x69, 0xF8, 0xC7, 0x01, 0x55, 0xFC, 0x4E, 0xF9, 0x81, 0xF9, + 0x49, 0xF4, 0xC2, 0xF2, 0x6A, 0x09, 0xB9, 0xF7, 0xA1, 0x0E, 0x7C, 0x00, + 0x13, 0x08, 0x60, 0x06, 0x79, 0x0F, 0x13, 0x08, 0x63, 0x1A, 0x0D, 0x03, + 0xF4, 0x18, 0xB5, 0xFE, 0x6F, 0x19, 0xAB, 0x02, 0x16, 0x16, 0x5A, 0x02, + 0x68, 0x09, 0x0A, 0xFF, 0xE1, 0x0E, 0x51, 0xFD, 0x4D, 0x21, 0x05, 0xF8, + 0xDB, 0x23, 0x9D, 0xF7, 0x62, 0x22, 0x6B, 0x0D, 0x8B, 0x31, 0x63, 0x2A, + 0x7E, 0x32, 0x9E, 0x30, 0x7A, 0x2C, 0x0D, 0x35, 0x11, 0x27, 0x60, 0x35, + 0xCA, 0x0E, 0x90, 0x25, 0xB5, 0x08, 0x3F, 0x1C, 0x93, 0x1F, 0x3E, 0x1A, + 0x34, 0x25, 0x02, 0x19, 0x85, 0x15, 0x78, 0x1A, 0x28, 0x07, 0xFA, 0x10, + 0xC3, 0x00, 0xE3, 0x07, 0xCD, 0xFE, 0xF1, 0x0F, 0xE7, 0x06, 0xD7, 0x1F, + 0xFC, 0x0F, 0x70, 0x1E, 0xFC, 0x11, 0xA8, 0x0F, 0xC1, 0x1F, 0x59, 0x14, + 0xA2, 0x1F, 0x82, 0x15, 0x0F, 0x06, 0x5E, 0x0C, 0xDB, 0xFA, 0x11, 0x0E, + 0xC9, 0xF8, 0x5F, 0x08, 0xD8, 0xF7, 0x6E, 0xFC, 0xD1, 0x06, 0xDB, 0x04, + 0x2C, 0xFE, 0x0F, 0x01, 0xE5, 0xD9, 0xA7, 0xE0, 0x3D, 0xCD, 0xC9, 0xD6, + 0x28, 0xD7, 0xA2, 0xD9, 0x12, 0xD2, 0xA2, 0xD2, 0xE0, 0xC0, 0x05, 0xD1, + 0x6D, 0xC0, 0x58, 0xCA, 0x0D, 0xD0, 0x20, 0xCC, 0xED, 0xD7, 0xCC, 0xD0, + 0x0C, 0xD3, 0x6E, 0xC7, 0xE5, 0xCD, 0xDA, 0xC8, 0xC1, 0xCD, 0x6D, 0xD7, + 0x9D, 0xDA, 0x7A, 0xE9, 0xC0, 0xE2, 0x7D, 0xE7, 0x36, 0xEF, 0x49, 0xE8, + 0xF2, 0xFE, 0x2C, 0xF8, 0x06, 0x00, 0x58, 0xFC, 0x4D, 0x0F, 0x69, 0x0D, + 0xA5, 0x10, 0x1D, 0x17, 0x86, 0xF5, 0x7E, 0x08, 0xD7, 0xE3, 0xC9, 0x02, + 0xE9, 0xE4, 0xEA, 0x04, 0xF1, 0xEA, 0xFA, 0x04, 0x4E, 0xE5, 0x5A, 0xF9, + 0x31, 0xE7, 0x5D, 0xE2, 0x02, 0xED, 0xA8, 0xCD, 0x89, 0xD6, 0xA2, 0xBD, + 0x04, 0xBE, 0xC1, 0xBC, 0x1D, 0xBC, 0xE4, 0xC0, 0x61, 0xC1, 0x4C, 0xC4, + 0x59, 0xC6, 0x4E, 0xCF, 0xD7, 0xCE, 0x4F, 0xD8, 0x3C, 0xCE, 0xCA, 0xD3, + 0x70, 0xC7, 0xA3, 0xCF, 0x7C, 0xC2, 0x09, 0xDF, 0xCB, 0xC7, 0xDE, 0xEF, + 0x6F, 0xE0, 0xDC, 0xF7, 0x6A, 0xEB, 0xEE, 0xFB, 0xE5, 0xE2, 0xD8, 0xFA, + 0x86, 0xE4, 0x79, 0xFE, 0x9F, 0xE0, 0xB9, 0xFF, 0xC8, 0xD4, 0x68, 0x01, + 0x57, 0xD9, 0xBF, 0x08, 0xBE, 0xE0, 0x33, 0x12, 0x8E, 0xE4, 0xE4, 0x20, + 0xC4, 0xF0, 0xA2, 0x1C, 0xE5, 0x0A, 0xCA, 0x15, 0xF0, 0x19, 0xF6, 0x18, + 0x01, 0x09, 0xDF, 0x09, 0xD5, 0xF4, 0x2C, 0xF4, 0x7C, 0xED, 0x58, 0xE9, + 0x25, 0xE6, 0x7C, 0xE3, 0x5A, 0xE1, 0x6F, 0xDE, 0x33, 0xE4, 0x12, 0xDF, + 0x5D, 0xE3, 0xF1, 0xE3, 0x49, 0xE6, 0x06, 0xE5, 0x94, 0xF2, 0x70, 0xE5, + 0x67, 0xF6, 0xFC, 0xE5, 0x64, 0xF0, 0x19, 0xDE, 0x72, 0xF3, 0xB2, 0xE0, + 0x89, 0xEC, 0x2E, 0xD9, 0x54, 0xD7, 0x71, 0xC6, 0xB3, 0xD2, 0xA9, 0xCA, + 0xB9, 0xD5, 0x4F, 0xC8, 0xF2, 0xD3, 0x92, 0xC0, 0xE6, 0xCE, 0x4D, 0xB8, + 0xF9, 0xC7, 0xCA, 0xA5, 0xC6, 0xC5, 0x58, 0xA7, 0xB3, 0xBD, 0x7E, 0xB7, + 0xF4, 0xB4, 0xE0, 0xBA, 0xF9, 0xB6, 0x9D, 0xAD, 0x4C, 0xB2, 0x89, 0xA0, + 0xC7, 0xB1, 0xF2, 0xAC, 0x2C, 0xBA, 0x1B, 0xC3, 0x80, 0xC7, 0xBC, 0xD7, + 0x47, 0xD5, 0xB9, 0xE6, 0xF3, 0xD7, 0x26, 0xE0, 0x61, 0xE2, 0x3F, 0xE0, + 0x2A, 0xE6, 0xCB, 0xEE, 0xD3, 0xD6, 0xFB, 0xEE, 0x0A, 0xE3, 0xD8, 0xF1, + 0xCC, 0x0F, 0xCF, 0x0E, 0x3A, 0x2F, 0x10, 0x2E, 0xCB, 0x41, 0x0F, 0x3D, + 0x84, 0x59, 0xA1, 0x41, 0x1D, 0x5A, 0xD2, 0x31, 0xE2, 0x4B, 0x2F, 0x27, + 0xDD, 0x44, 0xCF, 0x31, 0xD1, 0x3D, 0x43, 0x36, 0xF3, 0x3E, 0x8B, 0x36, + 0xC7, 0x43, 0xC1, 0x32, 0x70, 0x3E, 0xBD, 0x29, 0x63, 0x24, 0x33, 0x13, + 0x56, 0xFF, 0xB6, 0xED, 0xC2, 0xF8, 0x56, 0xE8, 0x8C, 0xFD, 0x13, 0xFA, + 0xC6, 0xFB, 0x3C, 0x02, 0xCE, 0x11, 0x7E, 0x03, 0xCE, 0x1B, 0xC4, 0xED, + 0xE3, 0x0E, 0x28, 0xDC, 0xAD, 0x00, 0x9C, 0xE9, 0xD4, 0xE0, 0xF8, 0xE7, + 0xA1, 0xCB, 0x58, 0xD0, 0x5E, 0xDC, 0xAD, 0xD3, 0x27, 0xFA, 0x87, 0xF0, + 0x08, 0x00, 0xB3, 0xFA, 0x33, 0x0A, 0xAC, 0x05, 0xEE, 0x3B, 0x01, 0x2C, + 0x7D, 0x51, 0x56, 0x3B, 0xC7, 0x41, 0xE0, 0x35, 0x5E, 0x3C, 0x8F, 0x3A, + 0x68, 0x33, 0x86, 0x34, 0xDD, 0x1E, 0x3D, 0x24, 0x94, 0x24, 0xD6, 0x31, + 0xD7, 0x39, 0xB1, 0x49, 0x6F, 0x33, 0xC1, 0x3D, 0xBA, 0x35, 0xE4, 0x37, + 0x21, 0x44, 0xD3, 0x3F, 0x3A, 0x37, 0x61, 0x3B, 0xBA, 0x3A, 0xA4, 0x51, + 0xFD, 0x46, 0x97, 0x5B, 0xF2, 0x3A, 0x90, 0x41, 0x71, 0x4B, 0xB5, 0x4F, + 0xB9, 0x5E, 0x8B, 0x5C, 0x78, 0x48, 0xBE, 0x39, 0xD8, 0x37, 0x8E, 0x33, + 0xA2, 0x44, 0xD8, 0x57, 0x3A, 0x45, 0x78, 0x53, 0x93, 0x34, 0xDF, 0x2E, + 0x46, 0x41, 0x67, 0x38, 0x80, 0x51, 0x40, 0x4E, 0x35, 0x4A, 0x7A, 0x45, + 0x40, 0x57, 0x79, 0x4E, 0x42, 0x64, 0x28, 0x5B, 0x6D, 0x56, 0x0E, 0x43, + 0x30, 0x4F, 0x36, 0x2F, 0xA1, 0x37, 0xCD, 0x18, 0x1C, 0x0A, 0x80, 0xE6, + 0x87, 0xFC, 0x4A, 0xCB, 0xBC, 0xFE, 0x5E, 0xDC, 0x6B, 0xF9, 0xC6, 0xFF, + 0x5E, 0x03, 0x04, 0x19, 0xB6, 0x11, 0x0D, 0x1C, 0x78, 0x14, 0xEF, 0x20, + 0xE6, 0x10, 0xAD, 0x29, 0x24, 0x0F, 0xC9, 0x22, 0xFD, 0x13, 0x82, 0x17, + 0x02, 0x1F, 0x35, 0x1F, 0xF8, 0x2E, 0x51, 0x38, 0xEC, 0x1E, 0x92, 0x33, + 0x9C, 0xFC, 0xEA, 0x1D, 0x83, 0x00, 0x38, 0x2B, 0xB2, 0x03, 0x0B, 0x31, + 0x9A, 0xF9, 0x8F, 0x26, 0x06, 0xFA, 0xB1, 0x20, 0x96, 0xF7, 0x20, 0x10, + 0x49, 0xF5, 0xD2, 0xFD, 0x9D, 0x03, 0xFF, 0x03, 0xBD, 0x0B, 0x1F, 0x08, + 0x90, 0x0A, 0x6D, 0xF7, 0xAA, 0x0D, 0xB5, 0xE6, 0x25, 0x1C, 0xFB, 0xEA, + 0x55, 0x2F, 0xA8, 0xFC, 0x9C, 0x2C, 0x5D, 0xFE, 0xB8, 0x28, 0x67, 0x03, + 0x23, 0x26, 0xC0, 0x0E, 0x7E, 0x1D, 0xBE, 0x15, 0x88, 0x19, 0xE5, 0x17, + 0xA9, 0x1D, 0x92, 0x12, 0x27, 0x19, 0x82, 0x05, 0xA0, 0x21, 0xA8, 0x12, + 0x4F, 0x28, 0xC7, 0x17, 0xBF, 0x19, 0x70, 0xF6, 0x4A, 0x0C, 0xB9, 0xDC, + 0xF2, 0x04, 0xC2, 0xDD, 0x22, 0x1C, 0xB2, 0xFF, 0xFD, 0x36, 0x41, 0x1D, + 0xBF, 0x27, 0x35, 0x12, 0xC9, 0x0D, 0x59, 0x00, 0xB8, 0xFE, 0x32, 0xFB, + 0x15, 0xD2, 0x36, 0xDD, 0x34, 0xAD, 0x9E, 0xC2, 0xBB, 0xC5, 0x39, 0xD2, + 0xA1, 0xF2, 0x25, 0xEB, 0x3D, 0x06, 0xCE, 0xF1, 0x4C, 0x1B, 0x88, 0x03, + 0x22, 0x2D, 0x54, 0x16, 0x59, 0x23, 0x5C, 0x11, 0x92, 0x20, 0x41, 0x16, + 0x30, 0x28, 0x5A, 0x23, 0x91, 0x1D, 0x74, 0x1C, 0x47, 0x14, 0x07, 0x1A, + 0x20, 0x1A, 0xDF, 0x29, 0x42, 0x0D, 0x8F, 0x24, 0xC9, 0xF2, 0x6D, 0x09, + 0x2F, 0x01, 0x00, 0x11, 0x09, 0x0B, 0x5B, 0x16, 0xAA, 0xED, 0x92, 0xF7, + 0x35, 0xF5, 0x2B, 0xFA, 0x45, 0x07, 0x3A, 0x09, 0x9C, 0xF8, 0xE1, 0x02, + 0x03, 0xF6, 0xAA, 0x08, 0x41, 0x00, 0x98, 0x0F, 0x22, 0xEC, 0xA1, 0xFA, + 0x17, 0xD2, 0xF8, 0xED, 0xAA, 0xD9, 0x06, 0x01, 0x18, 0xED, 0x43, 0x15, + 0xEA, 0xF3, 0x01, 0x1D, 0x16, 0xFA, 0xC8, 0x1E, 0xAB, 0x0A, 0xB2, 0x1D, + 0x74, 0x13, 0x0C, 0x12, 0xD8, 0x13, 0x29, 0x04, 0xAA, 0x18, 0x43, 0x03, + 0xDE, 0x25, 0x9A, 0x13, 0xFB, 0x1A, 0x6F, 0x13, 0xAD, 0x0D, 0x37, 0x11, + 0x7D, 0x04, 0x98, 0x0C, 0x48, 0xE5, 0xF7, 0xF1, 0x6B, 0xC9, 0x25, 0xDC, + 0x9D, 0xC6, 0x03, 0xD8, 0x64, 0xDE, 0x2A, 0xEA, 0x83, 0xE9, 0xE7, 0xF2, + 0x1D, 0xDF, 0x4F, 0xE4, 0x24, 0xDD, 0x20, 0xDC, 0xC6, 0xD2, 0xA2, 0xCE, + 0x3E, 0xAF, 0x85, 0xA7, 0x4F, 0x9E, 0x34, 0x9A, 0xB3, 0xA9, 0x2D, 0xB4, + 0x65, 0xB0, 0x03, 0xC8, 0x9B, 0xAE, 0x41, 0xCF, 0x9A, 0xB5, 0xB4, 0xDE, + 0xF0, 0xB4, 0x13, 0xE9, 0x6F, 0xA6, 0x78, 0xE0, 0xD0, 0xAF, 0x4E, 0xE7, + 0xC4, 0xC7, 0x49, 0xFC, 0x93, 0xD8, 0x4A, 0xFF, 0x68, 0xEF, 0xF3, 0xFF, + 0x2E, 0xFE, 0x3D, 0x06, 0xF3, 0xF4, 0x5F, 0x05, 0xB4, 0xE7, 0x23, 0xFF, + 0xEA, 0xE5, 0xAC, 0xFA, 0xC2, 0xD8, 0x02, 0xF4, 0x3B, 0xCB, 0xC2, 0xED, + 0x32, 0xDF, 0x67, 0xF1, 0x9E, 0xEB, 0xCF, 0xE4, 0x1C, 0xDE, 0xB1, 0xCF, + 0xA5, 0xD6, 0x04, 0xD4, 0xE6, 0xCD, 0xCD, 0xCF, 0x14, 0xB7, 0xD1, 0xB2, + 0x2E, 0xC5, 0x20, 0xC3, 0x70, 0xEF, 0x4C, 0xE8, 0x90, 0xFA, 0x91, 0xE1, + 0x77, 0xFA, 0x6A, 0xDA, 0x31, 0xFD, 0x38, 0xE5, 0xCB, 0xE7, 0x19, 0xDA, + 0x04, 0xC1, 0x78, 0xC3, 0x2C, 0xAE, 0x5E, 0xCB, 0xD3, 0xAE, 0xEF, 0xD4, + 0x23, 0xB6, 0x8B, 0xC8, 0x2B, 0xC7, 0x71, 0xC4, 0xCD, 0xD6, 0xB9, 0xC9, + 0xF2, 0xC5, 0x32, 0xB2, 0x1F, 0xAF, 0x02, 0x93, 0x86, 0xB6, 0xD0, 0x9B, + 0x87, 0xB4, 0xDE, 0xAE, 0x0E, 0xA4, 0x8B, 0xB1, 0x31, 0xAF, 0xB1, 0xC2, + 0xEA, 0xBB, 0x55, 0xD2, 0xF3, 0xAA, 0xD8, 0xB8, 0x13, 0x9B, 0xA8, 0x99, + 0xEF, 0x9B, 0x33, 0x98, 0x36, 0x99, 0xA0, 0xA2, 0x81, 0x99, 0x70, 0xB8, + 0x65, 0xB1, 0x0C, 0xD0, 0x2A, 0xD0, 0xA4, 0xD8, 0x1D, 0xEA, 0x1D, 0xEB, + 0x47, 0xFE, 0xB0, 0xF9, 0xDA, 0x00, 0x21, 0xEF, 0x58, 0xF5, 0xDF, 0xE5, + 0xBA, 0xE7, 0x46, 0xE3, 0x97, 0xDC, 0xF5, 0xD7, 0x5E, 0xE3, 0x27, 0xE0, + 0x05, 0xF4, 0xE7, 0xFC, 0xC4, 0xFA, 0xE7, 0xF9, 0x4F, 0xF7, 0x80, 0xE7, + 0x37, 0xE1, 0x0E, 0xE2, 0xA9, 0xCA, 0x90, 0xDC, 0x67, 0xC7, 0x6C, 0xD3, + 0x97, 0xD9, 0x21, 0xCE, 0xE8, 0xEA, 0x77, 0xCD, 0x94, 0xE0, 0x7B, 0xC2, + 0x1F, 0xDA, 0x6A, 0xC0, 0xC1, 0xE3, 0xD4, 0xD9, 0x07, 0xD3, 0x12, 0xD8, + 0xB4, 0xC8, 0x2F, 0xD7, 0xF1, 0xE7, 0xA1, 0xFB, 0x41, 0x00, 0xB5, 0x07, + 0xE3, 0x01, 0x63, 0x06, 0x35, 0xF8, 0xD3, 0x03, 0xD4, 0xEB, 0xB1, 0xF1, + 0x3E, 0xE6, 0xF5, 0xE0, 0xC3, 0xEB, 0x69, 0xDD, 0x6B, 0xF4, 0x07, 0xE8, + 0x11, 0xE6, 0x38, 0xEA, 0x16, 0xCB, 0xDF, 0xE5, 0xB9, 0xCD, 0xA0, 0xEE, + 0xB9, 0xCD, 0x64, 0xE8, 0xC2, 0xC3, 0xC3, 0xE2, 0x89, 0xC9, 0xAF, 0xE7, + 0x89, 0xD7, 0x35, 0xFB, 0xCF, 0xE5, 0x84, 0x1A, 0xAB, 0xED, 0x66, 0x1A, + 0xD0, 0xF3, 0x93, 0x0E, 0x2F, 0xFA, 0x82, 0x04, 0x65, 0xF1, 0xE1, 0xE0, + 0xE7, 0xDC, 0x66, 0xC1, 0x66, 0xCA, 0xAE, 0xBA, 0xD2, 0xC3, 0x22, 0xBF, + 0xF6, 0xD8, 0x31, 0xD1, 0x9A, 0xEA, 0x95, 0xD3, 0x15, 0xFA, 0xE9, 0xE0, + 0xEF, 0x17, 0xD8, 0x08, 0xF6, 0x23, 0x8B, 0x11, 0xB6, 0x23, 0xEB, 0x0A, + 0x7E, 0x1F, 0xCA, 0x02, 0xE6, 0x18, 0xBE, 0xF3, 0x95, 0x14, 0xD8, 0xE4, + 0x09, 0x19, 0x94, 0xDA, 0xA8, 0x1E, 0x33, 0xD8, 0x22, 0x11, 0xAC, 0xD3, + 0xDB, 0x08, 0x9A, 0xE0, 0xE5, 0x16, 0x81, 0xFB, 0x20, 0x1D, 0x36, 0x07, + 0x09, 0x1D, 0x50, 0x14, 0xC3, 0x2E, 0x3F, 0x20, 0x04, 0x3B, 0x05, 0x20, + 0xDA, 0x2E, 0x9F, 0x17, 0x86, 0x27, 0x78, 0x0E, 0x1E, 0x28, 0x1D, 0x13, + 0x76, 0x25, 0xA8, 0x1A, 0x92, 0x2E, 0xCB, 0x22, 0x9B, 0x4B, 0x68, 0x39, + 0x18, 0x5B, 0xEB, 0x4B, 0x85, 0x52, 0x7E, 0x50, 0x89, 0x4F, 0x9F, 0x49, + 0xB4, 0x51, 0xDE, 0x46, 0xAD, 0x55, 0x1D, 0x57, 0xAE, 0x54, 0x2B, 0x5C, + 0xE1, 0x4F, 0xDD, 0x54, 0x52, 0x48, 0x3B, 0x4D, 0x09, 0x49, 0x04, 0x56, + 0x1D, 0x54, 0x60, 0x59, 0xDE, 0x51, 0xDB, 0x42, 0xFE, 0x3A, 0xD3, 0x31, + 0xC4, 0x40, 0xF3, 0x42, 0x5D, 0x54, 0x64, 0x55, 0x34, 0x4E, 0x1D, 0x47, + 0xE2, 0x48, 0x0C, 0x31, 0xF0, 0x42, 0xF8, 0x22, 0x6A, 0x29, 0x62, 0x0A, + 0x59, 0x0E, 0x64, 0xEF, 0x66, 0xF7, 0x92, 0xE2, 0x09, 0xE4, 0xD3, 0xE0, + 0x2A, 0xF2, 0xF0, 0xEE, 0x76, 0x14, 0x39, 0xFF, 0x0B, 0x2F, 0xDE, 0x07, + 0xEA, 0x47, 0x8F, 0x1C, 0xB3, 0x57, 0x40, 0x36, 0x94, 0x4A, 0x83, 0x29, + 0x55, 0x32, 0x74, 0x14, 0x11, 0x2C, 0x41, 0x1C, 0xD8, 0x2F, 0xED, 0x1E, + 0x27, 0x28, 0xDC, 0x14, 0x35, 0x35, 0xBD, 0x1F, 0xB3, 0x4B, 0xC9, 0x2E, + 0xE3, 0x3C, 0xD9, 0x1E, 0x3B, 0x29, 0x4C, 0x06, 0xD4, 0x2A, 0x3E, 0x05, + 0x29, 0x23, 0x9B, 0x05, 0xF1, 0x15, 0xC2, 0x05, 0xE5, 0x0E, 0x02, 0x07, + 0xA1, 0x04, 0x2D, 0xF8, 0x9D, 0xFE, 0xA7, 0xF4, 0xB0, 0xF7, 0xD1, 0x02, + 0xDC, 0xE9, 0xE9, 0x0B, 0x66, 0xE9, 0x6F, 0x0E, 0x83, 0x02, 0xAB, 0x1B, + 0xDF, 0x17, 0x8E, 0x31, 0x1F, 0x09, 0x16, 0x29, 0xD1, 0xFC, 0x05, 0x11, + 0x5F, 0x0F, 0x5E, 0x11, 0xA4, 0x1A, 0x01, 0x13, 0x0A, 0x1C, 0xE0, 0x08, + 0xAF, 0x1B, 0xA6, 0xFC, 0x01, 0x08, 0x54, 0xE9, 0x70, 0xF8, 0x05, 0xE2, + 0x5E, 0x01, 0xAB, 0xEC, 0x16, 0x04, 0x2E, 0xEB, 0xC9, 0xFC, 0xEC, 0xE2, + 0xBE, 0x0B, 0xF2, 0xED, 0xB0, 0x11, 0x7C, 0x04, 0x24, 0xE8, 0x16, 0x07, + 0x58, 0xD8, 0xB5, 0x03, 0xE7, 0xF8, 0x76, 0x0B, 0xED, 0xFE, 0x82, 0xFE, + 0x56, 0xF4, 0x71, 0xF2, 0xD7, 0xEF, 0x8C, 0xEC, 0xCF, 0xD3, 0xE8, 0xC6, + 0xA2, 0xCA, 0xA3, 0xB6, 0xD6, 0xE8, 0xD4, 0xBE, 0x36, 0xF8, 0xBC, 0xC6, + 0xAF, 0x04, 0x46, 0xED, 0xE6, 0x2D, 0xA1, 0x11, 0x4D, 0x51, 0x4A, 0x21, + 0x6E, 0x4D, 0x36, 0x19, 0x50, 0x3D, 0x79, 0x0D, 0x9B, 0x31, 0xE5, 0x11, + 0x08, 0x28, 0xE4, 0x0B, 0x43, 0x1B, 0x8D, 0x0D, 0xEA, 0x08, 0x15, 0x16, + 0x40, 0x05, 0x24, 0x16, 0xE6, 0x07, 0xB7, 0x12, 0x4F, 0x09, 0x7C, 0x0C, + 0xC3, 0x0C, 0x2C, 0x14, 0x5D, 0x03, 0x70, 0x12, 0x02, 0xFC, 0x20, 0x0E, + 0x8E, 0xFE, 0xDC, 0x1B, 0xF5, 0xFB, 0x29, 0x13, 0x26, 0xF7, 0x27, 0xFC, + 0x8C, 0x01, 0xEF, 0xFD, 0x64, 0x03, 0x39, 0x03, 0x07, 0xFC, 0xB4, 0x05, + 0x1B, 0x09, 0x93, 0x10, 0xEE, 0x15, 0xD8, 0x1D, 0x20, 0x1C, 0x69, 0x27, + 0x26, 0x23, 0xE7, 0x25, 0x8D, 0x1A, 0xAB, 0x22, 0x6E, 0x0C, 0xAA, 0x15, + 0x54, 0x0F, 0xC4, 0x05, 0x3C, 0x0F, 0x0F, 0x0C, 0xA8, 0xFA, 0x1D, 0x10, + 0x5F, 0xF5, 0x3C, 0x1A, 0x31, 0x19, 0xA2, 0x3A, 0x91, 0x29, 0xE3, 0x31, + 0x8D, 0x19, 0x8C, 0x16, 0x25, 0x1D, 0xEA, 0x28, 0x2E, 0x23, 0x2C, 0x3E, + 0x70, 0x19, 0xBC, 0x36, 0xBE, 0x18, 0x92, 0x2F, 0x01, 0x1B, 0x2F, 0x30, + 0xB9, 0x09, 0xCC, 0x23, 0xF2, 0xF6, 0x43, 0x19, 0xF0, 0xDE, 0x10, 0x06, + 0xC9, 0xBD, 0x3B, 0xE5, 0x30, 0xAE, 0xB9, 0xDD, 0x29, 0xBD, 0xED, 0xE7, + 0x61, 0xD6, 0x2C, 0xF7, 0x6F, 0xED, 0x9E, 0x16, 0x5F, 0x13, 0x30, 0x45, + 0x88, 0x28, 0x38, 0x5F, 0x53, 0x15, 0xEE, 0x3C, 0x70, 0x08, 0xDF, 0x13, + 0x59, 0x00, 0x0F, 0x06, 0x48, 0xEA, 0x04, 0xFD, 0x4E, 0xDE, 0x19, 0x03, + 0x48, 0xDD, 0x3E, 0x00, 0xDD, 0xDA, 0xBE, 0xEC, 0x47, 0xC7, 0x30, 0xDE, + 0x2A, 0xC0, 0xE0, 0xE9, 0xAA, 0xD0, 0x88, 0xFB, 0x8D, 0xD6, 0xFA, 0xF6, + 0xA5, 0xD5, 0x58, 0x01, 0x71, 0xD2, 0x29, 0x0C, 0x14, 0xD0, 0xD9, 0xFA, + 0x32, 0xC3, 0x27, 0xE6, 0x7D, 0xBC, 0xD1, 0xEB, 0xEB, 0xBE, 0xF6, 0xEF, + 0x6D, 0xCD, 0x28, 0xFA, 0xA8, 0xEC, 0xF1, 0x18, 0x16, 0xFB, 0x93, 0x22, + 0x10, 0x09, 0xBF, 0x1B, 0x3D, 0x06, 0xC6, 0x0E, 0x31, 0xE8, 0x62, 0xF9, + 0xD0, 0xE3, 0x0C, 0xF4, 0x66, 0xE7, 0x6F, 0xF0, 0xAD, 0xD2, 0x47, 0xD9, + 0x9F, 0xD3, 0x9A, 0xD2, 0xAC, 0xEC, 0xFA, 0xDB, 0xAF, 0xEC, 0xF1, 0xE2, + 0xCA, 0xE6, 0xB2, 0xE6, 0x06, 0xDE, 0xE5, 0xDC, 0xAF, 0xDD, 0x81, 0xE5, + 0xAD, 0xE2, 0x81, 0xEB, 0x49, 0xDA, 0x36, 0xDF, 0x21, 0xF2, 0xD0, 0xF3, + 0x72, 0xFF, 0xF1, 0xFE, 0x65, 0xE9, 0x26, 0xF7, 0x70, 0xD6, 0x35, 0xF0, + 0xE1, 0xBB, 0xC4, 0xC8, 0xC1, 0xAB, 0x9F, 0xA8, 0x6A, 0xAF, 0x03, 0xA7, + 0x8D, 0xD2, 0xF5, 0xC2, 0x6B, 0xF9, 0xD2, 0xED, 0xCF, 0x0C, 0x2C, 0x09, + 0xD2, 0x28, 0xE2, 0x22, 0xCF, 0x2D, 0x3A, 0x2E, 0x67, 0x0D, 0x25, 0x1F, + 0xEB, 0xEC, 0x25, 0x0F, 0x92, 0xDB, 0x3D, 0xFF, 0xA8, 0xD6, 0xE2, 0xE5, + 0x29, 0xED, 0x6E, 0xE4, 0x44, 0xEF, 0x42, 0xE7, 0xE1, 0xDA, 0x3B, 0xE4, + 0x11, 0xDC, 0xCE, 0xF0, 0x5D, 0xE0, 0x6B, 0xF5, 0x16, 0xD6, 0x2C, 0xDD, + 0x59, 0xD5, 0x46, 0xD8, 0xA0, 0xD4, 0xB4, 0xD9, 0xF3, 0xBF, 0x39, 0xBA, + 0x9A, 0xB3, 0x54, 0xA7, 0xD9, 0xB5, 0xC8, 0xB7, 0x47, 0xBE, 0x6D, 0xC9, + 0x3A, 0xC0, 0x09, 0xC1, 0xC2, 0xD4, 0xAF, 0xCA, 0x83, 0xEE, 0x80, 0xE2, + 0x5F, 0xF7, 0x73, 0xEF, 0xD9, 0xFE, 0x62, 0xF5, 0x5D, 0xFA, 0x86, 0xEC, + 0x8D, 0xEC, 0x6B, 0xD9, 0x45, 0xE5, 0xF2, 0xDE, 0xB8, 0xE9, 0x1D, 0xF1, + 0xF2, 0xEB, 0x9D, 0xED, 0x52, 0xDA, 0xAD, 0xDA, 0xD6, 0xDF, 0xFE, 0xE3, + 0xFF, 0xF2, 0xA1, 0x01, 0xAE, 0xEA, 0x26, 0x00, 0xED, 0xDF, 0x71, 0xF6, + 0xCE, 0xE5, 0x1F, 0x05, 0x2E, 0xF5, 0x4E, 0x14, 0x2F, 0x03, 0x5C, 0x1C, + 0x9D, 0x14, 0xE7, 0x24, 0x3A, 0x1F, 0xFC, 0x1F, 0x93, 0x0F, 0xE2, 0x04, + 0x99, 0xF2, 0x96, 0xE0, 0x86, 0xD3, 0xA0, 0xC1, 0x61, 0xC2, 0x64, 0xB6, + 0x85, 0xC8, 0x61, 0xC8, 0xF5, 0xE9, 0xEB, 0xF3, 0x33, 0x17, 0x27, 0x18, + 0x87, 0x35, 0x12, 0x2C, 0x96, 0x4E, 0x87, 0x42, 0x78, 0x54, 0x96, 0x47, + 0x5D, 0x44, 0xF3, 0x3A, 0x52, 0x35, 0x78, 0x30, 0xFD, 0x1C, 0x9E, 0x24, + 0x80, 0xFA, 0xD3, 0x08, 0x96, 0xF4, 0x64, 0x01, 0x93, 0x02, 0xF2, 0x0E, + 0x38, 0xFF, 0x85, 0x07, 0x90, 0xFC, 0xCB, 0x01, 0x65, 0x0D, 0x84, 0x11, + 0xC6, 0x1D, 0xEE, 0x17, 0x30, 0x11, 0x23, 0xFA, 0x32, 0xEB, 0x01, 0xDB, + 0xF2, 0xE8, 0x07, 0xEA, 0x2A, 0xFA, 0xED, 0xF7, 0xEE, 0xF8, 0x03, 0xF1, + 0x76, 0x02, 0xBC, 0xFF, 0x4C, 0x00, 0x15, 0xFE, 0xDF, 0x01, 0x96, 0xFB, + 0x4A, 0x0F, 0x02, 0x0C, 0xE2, 0x14, 0x90, 0x0F, 0xCD, 0x2F, 0x4B, 0x1D, + 0xE6, 0x45, 0x9F, 0x2C, 0x56, 0x39, 0x26, 0x16, 0x8B, 0x38, 0xAF, 0xFA, + 0xA0, 0x37, 0x98, 0xED, 0x07, 0x1D, 0x42, 0xDF, 0x62, 0x0D, 0x5E, 0xE0, + 0x4A, 0x2B, 0xC8, 0xFA, 0x19, 0x42, 0x47, 0x0C, 0xD0, 0x2D, 0xF8, 0x08, + 0x33, 0x26, 0x90, 0x05, 0x9A, 0x27, 0xD3, 0x09, 0x25, 0x1F, 0x4C, 0x09, + 0x37, 0x23, 0xF8, 0x0E, 0xF6, 0x29, 0xC5, 0x21, 0x5D, 0x22, 0x1F, 0x21, + 0x1A, 0x11, 0x10, 0x0B, 0xA9, 0xFD, 0xFA, 0xE8, 0xC0, 0xE3, 0x92, 0xC8, + 0xC0, 0xC4, 0x64, 0xAF, 0xDF, 0xC2, 0x5C, 0xA9, 0x07, 0xDB, 0xCA, 0xBB, + 0x7A, 0x09, 0xE1, 0xDA, 0x5B, 0x40, 0xD6, 0x08, 0xFF, 0x5E, 0xD9, 0x2A, + 0x5B, 0x64, 0x0E, 0x2E, 0xBF, 0x5B, 0x68, 0x2C, 0xC7, 0x48, 0x29, 0x23, + 0x55, 0x2B, 0x6A, 0x0F, 0xDB, 0x17, 0x92, 0x06, 0x8D, 0x10, 0x91, 0x04, + 0x74, 0x10, 0x68, 0xFB, 0x79, 0x14, 0x6A, 0xF6, 0x97, 0x1F, 0xF1, 0x02, + 0x8E, 0x24, 0xFF, 0x0B, 0xC3, 0x16, 0xA0, 0x09, 0xEB, 0x12, 0x88, 0x1A, + 0xE5, 0x02, 0x9E, 0x1C, 0x44, 0xEF, 0x7B, 0x0A, 0x6C, 0xF9, 0x82, 0x0B, + 0xC0, 0x03, 0xF4, 0x0F, 0x2D, 0x03, 0x7B, 0x08, 0xAD, 0xFA, 0x73, 0xFE, + 0x8A, 0xFC, 0xC1, 0x0C, 0xCA, 0x0F, 0x02, 0x16, 0xF9, 0x24, 0x07, 0x11, + 0xCC, 0x39, 0x96, 0x28, 0x8B, 0x35, 0x2B, 0x33, 0x32, 0x1B, 0xEB, 0x0D, + 0xCA, 0x15, 0xD8, 0x02, 0x27, 0x0C, 0x60, 0x09, 0x3F, 0xFF, 0x2D, 0xEF, + 0x66, 0x0A, 0xB7, 0xE0, 0xF2, 0x12, 0x9E, 0xF0, 0x58, 0x1A, 0x79, 0x04, + 0x16, 0x18, 0x0E, 0x08, 0x41, 0x0A, 0x48, 0x00, 0x21, 0x10, 0x94, 0x05, + 0xC5, 0x1C, 0x71, 0x08, 0x4F, 0x1F, 0x7A, 0x0B, 0x7D, 0x2A, 0x6B, 0x26, + 0x54, 0x36, 0x67, 0x29, 0x45, 0x27, 0x9A, 0x0C, 0x02, 0xFD, 0x92, 0xF3, + 0x04, 0xD9, 0x34, 0xE4, 0xA1, 0xD2, 0x1F, 0xDE, 0xE3, 0xD0, 0x04, 0xE7, + 0xDD, 0xD6, 0x1E, 0x04, 0x5F, 0xF6, 0xBF, 0x19, 0x50, 0x26, 0xB0, 0x30, + 0xAC, 0x54, 0x92, 0x46, 0xB2, 0x64, 0xA7, 0x3C, 0x5F, 0x55, 0x19, 0x38, + 0x5C, 0x32, 0x57, 0x3E, 0xB8, 0x1D, 0xBE, 0x3A, 0x71, 0x19, 0xE5, 0x2E, + 0xDE, 0x0D, 0x27, 0x2B, 0xD8, 0x01, 0x2D, 0x2A, 0x11, 0x09, 0x54, 0x2B, + 0x19, 0x14, 0x65, 0x2D, 0xE5, 0x0F, 0x68, 0x18, 0x67, 0x07, 0x00, 0x02, + 0x84, 0x02, 0x64, 0xF7, 0xE8, 0x0A, 0x95, 0xFD, 0x8C, 0x0B, 0x74, 0xFD, + 0xF3, 0x0A, 0x5F, 0xF3, 0xB6, 0x16, 0x5E, 0x0A, 0x0A, 0x15, 0xE0, 0x2C, + 0x3F, 0x02, 0xCA, 0x32, 0x60, 0x11, 0x93, 0x45, 0xD7, 0x32, 0x28, 0x5C, + 0x2B, 0x39, 0x18, 0x4F, 0x77, 0x4A, 0xC9, 0x46, 0xF2, 0x52, 0x9D, 0x3E, + 0x64, 0x2B, 0x0A, 0x1A, 0x14, 0x0D, 0x7C, 0x05, 0xA4, 0x08, 0xA8, 0x04, + 0xFC, 0xFF, 0xC1, 0xF2, 0xAE, 0xF7, 0x75, 0xEB, 0x98, 0x05, 0xA0, 0x06, + 0x01, 0x10, 0x4C, 0x0E, 0xE9, 0xFB, 0x7A, 0xFA, 0x01, 0xFA, 0x8F, 0xFD, + 0xF2, 0x18, 0x8D, 0x19, 0x67, 0x14, 0x8C, 0x1E, 0xBA, 0x0C, 0x9D, 0x25, + 0x47, 0x2A, 0xB2, 0x3E, 0x10, 0x31, 0xBF, 0x36, 0x45, 0x19, 0x7F, 0x17, + 0x53, 0xF6, 0xA8, 0xE8, 0x92, 0xE1, 0xF7, 0xC4, 0x09, 0xDC, 0x20, 0xBA, + 0xEB, 0xD8, 0x65, 0xBE, 0x32, 0xEE, 0xCD, 0xE2, 0x44, 0x0E, 0xFC, 0x12, + 0x7D, 0x17, 0xE4, 0x23, 0x4A, 0x22, 0x1F, 0x2E, 0x83, 0x36, 0x90, 0x4B, + 0xCE, 0x2E, 0xD5, 0x4D, 0xD1, 0x08, 0xE7, 0x21, 0xED, 0xF3, 0x63, 0x00, + 0xAC, 0xE6, 0xDF, 0xF9, 0x2E, 0xD8, 0xE9, 0xF3, 0x43, 0xDD, 0x7E, 0xEE, + 0x3B, 0xEB, 0x48, 0xF9, 0x4F, 0xF9, 0x77, 0x0D, 0x96, 0xF7, 0x8E, 0x0A, + 0x9D, 0xE4, 0xA8, 0x08, 0x39, 0xE0, 0xCA, 0x1F, 0x82, 0xDD, 0x53, 0x16, + 0x09, 0xDF, 0xDE, 0xFA, 0x49, 0xFC, 0x17, 0xFF, 0xFD, 0x12, 0x28, 0x04, + 0xE1, 0x14, 0xEC, 0xF8, 0x7A, 0x0B, 0x03, 0xF5, 0x95, 0x0B, 0x67, 0x01, + 0x97, 0x0F, 0x76, 0x08, 0x3D, 0x14, 0xBF, 0x15, 0xFB, 0x1C, 0xC9, 0x31, + 0xE1, 0x11, 0x47, 0x2E, 0x60, 0xF0, 0xAC, 0xF9, 0x3C, 0xEF, 0x17, 0xEF, + 0x0A, 0xF4, 0x09, 0x00, 0x37, 0xD7, 0xAB, 0xED, 0x1F, 0xC4, 0x3E, 0xE6, + 0xC2, 0xCD, 0x37, 0xFC, 0x8E, 0xD2, 0xF2, 0xFE, 0x7C, 0xC6, 0xE7, 0xEA, + 0x09, 0xE0, 0xDE, 0x01, 0x9A, 0xED, 0x65, 0x03, 0xFD, 0xCA, 0xE2, 0xD1, + 0xE2, 0xC7, 0xA6, 0xD5, 0xB8, 0xD8, 0xF0, 0xEE, 0x7F, 0xD1, 0xA8, 0xE2, + 0xF6, 0xC2, 0xE4, 0xCD, 0x50, 0xB5, 0x8F, 0xC2, 0x18, 0xA4, 0x66, 0xB7, + 0xD2, 0x9A, 0x33, 0xA4, 0x35, 0xAB, 0x8F, 0xA2, 0x07, 0xC8, 0xF1, 0xAF, + 0xAC, 0xD2, 0xAB, 0xB5, 0x4F, 0xE8, 0x0B, 0xDC, 0x1C, 0x12, 0x19, 0x17, + 0x4E, 0x1F, 0x8C, 0x1A, 0xF8, 0x19, 0xFE, 0x08, 0x77, 0x18, 0x13, 0x17, + 0xC8, 0x02, 0x45, 0x0F, 0xE7, 0xE1, 0x5D, 0xE4, 0xA1, 0xD2, 0x90, 0xDA, + 0xEC, 0xCD, 0xBD, 0xE9, 0x6C, 0xCF, 0x85, 0xDF, 0xF8, 0xE1, 0xFA, 0xD3, + 0x38, 0xF5, 0xAC, 0xDB, 0xB4, 0xF6, 0xFB, 0xE4, 0xEC, 0xF3, 0xBE, 0xE7, + 0x62, 0xEA, 0x3F, 0xEB, 0xBF, 0xDD, 0xF0, 0xF4, 0xB3, 0xC9, 0x45, 0xE9, + 0x53, 0xC7, 0x5E, 0xE8, 0x00, 0xD3, 0x0A, 0xFB, 0x4A, 0xDC, 0x98, 0x09, + 0xCA, 0xF3, 0xCC, 0x1F, 0x6C, 0x07, 0xCF, 0x2F, 0xB7, 0x22, 0xED, 0x38, + 0xD1, 0x33, 0x50, 0x33, 0xFF, 0x23, 0x43, 0x1C, 0x35, 0x17, 0xE1, 0x12, + 0x13, 0x16, 0xEF, 0x13, 0x46, 0x02, 0xD9, 0xF4, 0x2F, 0xE8, 0x70, 0xD4, + 0x09, 0xE8, 0x60, 0xE0, 0x46, 0xEA, 0xCF, 0xF5, 0xD9, 0xE2, 0x14, 0xFB, + 0x0B, 0xE6, 0x89, 0x08, 0x02, 0xF5, 0xDA, 0x22, 0x73, 0xFC, 0x96, 0x2C, + 0x9F, 0xED, 0xB3, 0x1F, 0xBB, 0xF4, 0xCC, 0x21, 0xC3, 0x1A, 0x35, 0x35, + 0xC8, 0x1C, 0x1B, 0x25, 0x6B, 0xFE, 0x9D, 0xFA, 0x53, 0xE3, 0xC2, 0xE4, + 0x80, 0xC7, 0xEC, 0xD8, 0x44, 0xB2, 0xF3, 0xC2, 0x59, 0xBE, 0x8D, 0xC6, + 0x82, 0xE9, 0x71, 0xEC, 0x43, 0x05, 0x7C, 0xF8, 0xEC, 0x14, 0xF5, 0xFA, + 0xFA, 0x27, 0x40, 0x0F, 0xD6, 0x30, 0x0A, 0x14, 0x55, 0x2A, 0x60, 0x09, + 0x3C, 0x15, 0xA6, 0x00, 0x72, 0x09, 0x2D, 0xFB, 0x22, 0x04, 0xC7, 0xF7, + 0x34, 0xFE, 0xE3, 0xF4, 0x24, 0x01, 0xA7, 0xE6, 0x28, 0x06, 0xA0, 0xE2, + 0xF2, 0xFC, 0xE0, 0xEE, 0xA8, 0xEE, 0x56, 0xF4, 0x88, 0xE6, 0x60, 0xE6, + 0x50, 0xEE, 0xE0, 0xDD, 0x60, 0xFB, 0x11, 0xE4, 0x4E, 0xF6, 0x36, 0xE3, + 0xC6, 0xEC, 0x19, 0xD4, 0x6B, 0xFF, 0x57, 0xCC, 0x89, 0x02, 0x60, 0xD1, + 0x66, 0xE1, 0x18, 0xD5, 0x26, 0xDF, 0xC3, 0xEE, 0xAB, 0xE8, 0xF7, 0x02, + 0xCB, 0xEA, 0x5C, 0xFC, 0xCB, 0x02, 0xBC, 0x06, 0xD2, 0xFF, 0x58, 0x04, + 0xB6, 0xE1, 0x35, 0xE5, 0xD4, 0xE3, 0xE6, 0xD4, 0xA7, 0xE4, 0x08, 0xCA, + 0x7C, 0xD1, 0xCE, 0xBA, 0x6D, 0xD7, 0x29, 0xC3, 0xFE, 0xF3, 0xDA, 0xE2, + 0xF4, 0xF0, 0x94, 0xE2, 0x87, 0xE6, 0xCF, 0xE3, 0xE3, 0xF2, 0x91, 0x0E, + 0x8C, 0xE2, 0x88, 0x0D, 0xB5, 0xC9, 0x42, 0xE5, 0x30, 0xE3, 0xAD, 0xEB, + 0xF2, 0x00, 0x90, 0xFA, 0x1F, 0xED, 0x90, 0xD9, 0x8C, 0xD7, 0x0D, 0xBA, + 0x91, 0xD2, 0xE3, 0xAD, 0xCF, 0xB9, 0x8D, 0x9E, 0x11, 0x9C, 0xCC, 0x9C, + 0xA8, 0xA2, 0x5C, 0xAA, 0x6E, 0xCB, 0xC1, 0xB8, 0xF3, 0xEB, 0x7D, 0xC6, + 0xD7, 0x01, 0x37, 0xDA, 0xD3, 0x16, 0x89, 0xF3, 0x56, 0x1C, 0x9A, 0xFB, + 0x60, 0x19, 0xBD, 0xF4, 0x4C, 0x13, 0x57, 0xEF, 0x6B, 0x09, 0x85, 0xEC, + 0x4F, 0xF5, 0x53, 0xE2, 0x0F, 0xE2, 0xAA, 0xCF, 0x2C, 0xE4, 0xA9, 0xCE, + 0x69, 0xE2, 0x8B, 0xCF, 0xB6, 0xD9, 0x0D, 0xCE, 0xAB, 0xDD, 0xBF, 0xD9, + 0x83, 0xE9, 0x39, 0xDC, 0x06, 0xEB, 0xFA, 0xD2, 0x17, 0xF0, 0x4D, 0xDF, + 0x9D, 0xFB, 0x98, 0xF9, 0x77, 0x03, 0xAD, 0x01, 0xCC, 0x12, 0x0F, 0x08, + 0xE8, 0x0F, 0xC5, 0x0D, 0xC5, 0x10, 0x3B, 0x1B, 0xA1, 0x1E, 0xA6, 0x2C, + 0x09, 0x26, 0x5C, 0x35, 0xD2, 0x22, 0x01, 0x32, 0xDD, 0x1F, 0xBE, 0x27, + 0x2F, 0x19, 0x71, 0x19, 0x7C, 0x00, 0x35, 0x06, 0xBB, 0xF8, 0x94, 0x06, + 0xBD, 0x05, 0x22, 0x19, 0x10, 0x00, 0xD3, 0x12, 0x3D, 0xF5, 0x4B, 0xFE, + 0x79, 0x06, 0xB2, 0x07, 0x2E, 0x0F, 0xB2, 0x0D, 0xD9, 0x03, 0x37, 0x04, + 0x02, 0x15, 0xF6, 0x11, 0x8F, 0x1B, 0x34, 0x17, 0x6B, 0x0A, 0xBA, 0x0D, + 0x76, 0x1E, 0x9C, 0x1B, 0x60, 0x35, 0x19, 0x2A, 0xD7, 0x22, 0x70, 0x1B, + 0xF6, 0x0B, 0xF2, 0x04, 0x1E, 0x08, 0x58, 0xF9, 0xFD, 0xED, 0x5E, 0xD6, + 0xDD, 0xD3, 0x74, 0xB2, 0xCE, 0xF1, 0x08, 0xC2, 0x97, 0x0F, 0x74, 0xE6, + 0x0A, 0x18, 0x93, 0x00, 0x16, 0x30, 0x8D, 0x19, 0x2F, 0x3D, 0x1F, 0x25, + 0x63, 0x3E, 0x6E, 0x1E, 0xC9, 0x46, 0xF0, 0x24, 0xEC, 0x3B, 0x7D, 0x28, + 0x22, 0x1A, 0x2D, 0x0D, 0xD0, 0x0D, 0xA1, 0xF6, 0x70, 0x0E, 0x3A, 0xF8, + 0x9F, 0xFE, 0x05, 0x01, 0x1D, 0xFC, 0xA9, 0x06, 0xBE, 0x07, 0x88, 0x0F, + 0x11, 0xFB, 0x8B, 0x09, 0xB2, 0xED, 0x00, 0xFD, 0x94, 0xEF, 0x04, 0xF0, + 0x54, 0xEE, 0xDC, 0xDE, 0x16, 0xF0, 0x45, 0xE4, 0xE2, 0xFE, 0x07, 0xF3, + 0x0A, 0x0A, 0x61, 0xFC, 0x91, 0x09, 0x4F, 0x03, 0xA7, 0x21, 0x8A, 0x22, + 0x47, 0x36, 0xBC, 0x41, 0x92, 0x2C, 0x45, 0x3F, 0x6D, 0x38, 0xEE, 0x45, + 0x10, 0x43, 0x3D, 0x3F, 0x64, 0x26, 0x92, 0x1B, 0x06, 0x1E, 0x08, 0x11, + 0x13, 0x26, 0x7E, 0x0B, 0xB1, 0x15, 0x6D, 0xF2, 0x98, 0x05, 0x11, 0xE0, + 0xAC, 0x12, 0x27, 0xF8, 0xF3, 0x18, 0xD9, 0x10, 0x8D, 0x09, 0x6C, 0x09, + 0xBF, 0x1C, 0x83, 0x20, 0xF2, 0x3C, 0xA8, 0x40, 0x36, 0x36, 0xF8, 0x2E, + 0xA9, 0x2D, 0xEF, 0x1A, 0x08, 0x33, 0x7E, 0x29, 0xAA, 0x22, 0x4E, 0x2D, + 0xBA, 0x06, 0x51, 0x14, 0xE2, 0xF9, 0x4C, 0xFA, 0x41, 0xE2, 0xDA, 0xD9, + 0xBD, 0xC6, 0x80, 0xC6, 0xC1, 0xCD, 0x03, 0xD2, 0x55, 0xE6, 0x46, 0xE4, + 0x3C, 0xFC, 0x4B, 0x05, 0x56, 0x1E, 0x26, 0x34, 0xD6, 0x3E, 0xC2, 0x4D, + 0x37, 0x4C, 0xC9, 0x52, 0xB5, 0x44, 0xB0, 0x4F, 0x34, 0x33, 0x84, 0x47, + 0xD3, 0x1C, 0xC7, 0x38, 0xAA, 0x02, 0x22, 0x22, 0x0D, 0xEF, 0x37, 0x0B, + 0xD7, 0xE0, 0xB9, 0xF7, 0xD2, 0xE6, 0x91, 0xF0, 0x58, 0xF1, 0xD3, 0xF2, + 0x53, 0xEB, 0xE7, 0xF0, 0x12, 0xEE, 0x6D, 0xEC, 0xC5, 0xF9, 0x32, 0xF2, + 0xC7, 0xF4, 0xEA, 0x00, 0x0D, 0xE7, 0x16, 0x0C, 0x85, 0xEA, 0x23, 0x12, + 0x8D, 0xF1, 0xE5, 0x10, 0x6D, 0xED, 0x52, 0xFF, 0x7C, 0xFD, 0x18, 0x0F, + 0x7C, 0x11, 0xD4, 0x31, 0x95, 0x1D, 0x1A, 0x3A, 0x7F, 0x2F, 0x3D, 0x43, + 0x0A, 0x45, 0x0D, 0x51, 0xAA, 0x3F, 0xEA, 0x37, 0x15, 0x2B, 0xA8, 0x11, + 0xD1, 0x24, 0xB2, 0x0D, 0xC8, 0x20, 0x82, 0x0E, 0x2C, 0x13, 0xC8, 0x06, + 0x28, 0x06, 0x6D, 0x09, 0xB8, 0x10, 0xC1, 0x0F, 0xA7, 0x18, 0xD8, 0x15, + 0xC0, 0x13, 0x42, 0x20, 0x1D, 0x28, 0xCF, 0x36, 0x0D, 0x2F, 0x32, 0x3A, + 0x8E, 0x0D, 0xCE, 0x1A, 0x9B, 0x0D, 0xBA, 0x1B, 0x7B, 0x22, 0x56, 0x3A, + 0xDD, 0x10, 0x5B, 0x3D, 0xCD, 0xF8, 0x9F, 0x19, 0x4B, 0xF3, 0x59, 0xF5, + 0xB1, 0xED, 0xD2, 0xE7, 0xD6, 0xE2, 0x81, 0xE0, 0x08, 0xE5, 0x19, 0xE8, + 0xCD, 0xF8, 0xFF, 0xFF, 0xC8, 0x08, 0x1B, 0x11, 0x63, 0x2C, 0x1E, 0x32, + 0xF6, 0x54, 0xED, 0x52, 0xA8, 0x5A, 0xBD, 0x5A, 0xBC, 0x4C, 0x82, 0x5C, + 0x1D, 0x33, 0xDA, 0x51, 0x06, 0x1D, 0x1F, 0x40, 0x61, 0x0F, 0x05, 0x3A, + 0x5B, 0x03, 0x43, 0x3A, 0xEC, 0x03, 0x77, 0x41, 0x53, 0xFA, 0x10, 0x46, + 0x50, 0xF1, 0x6E, 0x34, 0xD7, 0xFA, 0x03, 0x1F, 0x93, 0xF7, 0x84, 0x19, + 0x85, 0xE6, 0xCA, 0x0A, 0x84, 0xE7, 0x10, 0xFD, 0xB7, 0x00, 0xC9, 0x00, + 0xCA, 0x1A, 0xE1, 0x04, 0x42, 0x2E, 0xAB, 0x01, 0xBC, 0x32, 0x7B, 0x01, + 0x4D, 0x32, 0x97, 0x1A, 0x66, 0x33, 0xBF, 0x30, 0xA7, 0x27, 0x3F, 0x36, + 0xAF, 0x18, 0xAA, 0x35, 0xB0, 0x01, 0x9E, 0x24, 0xBF, 0xE9, 0x3B, 0x06, + 0x6B, 0xF7, 0xA3, 0xF4, 0x86, 0x01, 0x73, 0xE9, 0x19, 0xF1, 0xA2, 0xE3, + 0x38, 0xF1, 0x2F, 0xE7, 0x04, 0x08, 0x87, 0xEA, 0x0F, 0x11, 0xD4, 0xF5, + 0xEA, 0xFA, 0x81, 0xFA, 0xF1, 0xEF, 0xBE, 0x04, 0xEA, 0x01, 0xB5, 0x1D, + 0x7B, 0x12, 0xEA, 0x23, 0x88, 0x17, 0x28, 0x26, 0xCD, 0x14, 0x8E, 0x2F, + 0x9F, 0xFE, 0x8D, 0x18, 0x42, 0xDF, 0x7D, 0xE7, 0x06, 0xCA, 0xEE, 0xCE, + 0xBE, 0xB6, 0x57, 0xC4, 0xD2, 0x9F, 0x7C, 0xAA, 0x82, 0xA9, 0xFF, 0xB5, + 0xA1, 0xC6, 0xE9, 0xDF, 0x26, 0xD1, 0x49, 0xF0, 0xDA, 0xF1, 0xCB, 0x13, + 0xC4, 0x23, 0x64, 0x3F, 0xA0, 0x31, 0x16, 0x42, 0x59, 0x29, 0x1E, 0x39, + 0x78, 0x22, 0x54, 0x29, 0x37, 0x0D, 0x26, 0x0C, 0xBA, 0xEC, 0xD6, 0xEC, + 0xBD, 0xD2, 0xF2, 0xD3, 0xD7, 0xCC, 0xAA, 0xCF, 0x3D, 0xD4, 0x63, 0xD2, + 0xA4, 0xD0, 0xBA, 0xCD, 0x47, 0xCC, 0xD4, 0xC6, 0x16, 0xCE, 0x4C, 0xC8, + 0x2C, 0xC3, 0x94, 0xC6, 0x1E, 0xC4, 0xD3, 0xCE, 0xDD, 0xD5, 0x2B, 0xE3, + 0x82, 0xD9, 0xA3, 0xDF, 0x40, 0xD6, 0xB3, 0xE3, 0x0D, 0xD8, 0x99, 0xF9, + 0x2A, 0xEE, 0x00, 0x08, 0x39, 0xF9, 0x22, 0x01, 0x2E, 0xFC, 0x65, 0x02, + 0xF6, 0x0E, 0x30, 0x12, 0xB9, 0x08, 0xB3, 0x00, 0xF0, 0xE8, 0x30, 0xD4, + 0xEF, 0xD9, 0x0C, 0xC7, 0xC7, 0xCC, 0x46, 0xC5, 0xBA, 0xBC, 0x8B, 0xB0, + 0x78, 0xBF, 0xC5, 0xA4, 0xBA, 0xD3, 0x2E, 0xAF, 0x07, 0xE1, 0xC0, 0xB6, + 0x32, 0xD6, 0x0B, 0xB0, 0x90, 0xD2, 0x20, 0xC4, 0x1F, 0xE2, 0x73, 0xEB, + 0x7A, 0xE6, 0x32, 0xF6, 0x87, 0xD8, 0x03, 0xEE, 0xD3, 0xE3, 0x0D, 0xF9, + 0x16, 0xF8, 0x91, 0xFB, 0x91, 0xE2, 0x63, 0xE7, 0x71, 0xBF, 0xEE, 0xD5, + 0xE2, 0xB7, 0xAF, 0xB7, 0x93, 0xB2, 0x2A, 0x9F, 0x53, 0xAD, 0x8F, 0xA5, + 0x39, 0xC5, 0xB4, 0xBB, 0x48, 0xE6, 0x4B, 0xD5, 0x11, 0xF2, 0x26, 0xE7, + 0xD6, 0x03, 0xE5, 0x02, 0x37, 0x21, 0x3A, 0x13, 0x19, 0x1D, 0xC2, 0x10, + 0xFC, 0x14, 0x3B, 0x1D, 0x62, 0x11, 0xC1, 0x0D, 0x9B, 0xF9, 0x10, 0xE8, + 0x8D, 0xDB, 0x5F, 0xCD, 0x93, 0xD7, 0x6A, 0xBE, 0x93, 0xEE, 0x9A, 0xBD, + 0x02, 0xF1, 0xF7, 0xC3, 0x49, 0xE7, 0x12, 0xDA, 0x00, 0xDA, 0x32, 0xDB, + 0x83, 0xCA, 0x30, 0xC9, 0x1C, 0xD1, 0x00, 0xD4, 0x62, 0xE6, 0x98, 0xDA, + 0x29, 0xEF, 0x45, 0xD0, 0x05, 0xED, 0x97, 0xDA, 0x98, 0xF5, 0x36, 0xEC, + 0x00, 0x0C, 0x7E, 0x01, 0x8A, 0x17, 0xC2, 0x11, 0x42, 0x16, 0xFB, 0x1B, + 0x2B, 0x15, 0x76, 0x1F, 0x86, 0x0F, 0x99, 0x10, 0xFA, 0xFE, 0xB3, 0x02, + 0xEF, 0xEF, 0x1F, 0xFF, 0x94, 0xEB, 0x10, 0xFC, 0xD2, 0xDA, 0xF4, 0xE8, + 0x4D, 0xC5, 0x13, 0xD1, 0x9B, 0xC4, 0x53, 0xD2, 0x3E, 0xD8, 0x22, 0xE7, + 0x46, 0xE4, 0x4B, 0xFA, 0x25, 0xE5, 0x72, 0x0C, 0xB0, 0xF9, 0x45, 0x19, + 0x84, 0x06, 0xDD, 0x17, 0x81, 0x03, 0x00, 0x0E, 0x2C, 0x16, 0xD9, 0x04, + 0xCE, 0x17, 0xDA, 0xFA, 0xDC, 0xF2, 0x44, 0xEA, 0xBF, 0xDC, 0x8F, 0xDA, + 0xC3, 0xD4, 0xA8, 0xBC, 0x30, 0xC5, 0xCF, 0x9E, 0x5B, 0xC4, 0xA8, 0xA2, + 0xD8, 0xCF, 0x63, 0xAF, 0x9C, 0xD8, 0xB8, 0xC1, 0xDD, 0xED, 0xF4, 0xE7, + 0xD0, 0x19, 0xF0, 0x0A, 0xF2, 0x41, 0xA0, 0x27, 0x72, 0x4F, 0x47, 0x3E, + 0xCA, 0x43, 0x97, 0x31, 0x61, 0x2C, 0xA6, 0x1A, 0x65, 0x16, 0xC2, 0x13, + 0xBC, 0xF8, 0x2B, 0x0B, 0xC9, 0xE8, 0xCB, 0x03, 0xD0, 0xE9, 0xF9, 0xEF, + 0x63, 0xE5, 0xFB, 0xDB, 0x3D, 0xEC, 0xDD, 0xDB, 0x15, 0xF0, 0xA3, 0xDB, + 0xAB, 0xF6, 0xDB, 0xDC, 0xBF, 0xFF, 0x3A, 0xDB, 0x7A, 0xF9, 0x15, 0xE1, + 0xBB, 0xEC, 0x18, 0xDA, 0x4D, 0xF4, 0x87, 0xDE, 0x6C, 0x05, 0x87, 0xF4, + 0xD3, 0x04, 0x72, 0xFA, 0x4A, 0x0F, 0x2A, 0x11, 0xE5, 0x16, 0xB0, 0x24, + 0xF2, 0x0F, 0x24, 0x21, 0xCC, 0x0E, 0x35, 0x1B, 0xCB, 0x04, 0x96, 0x15, + 0x8E, 0xF1, 0x68, 0x0C, 0x69, 0xF0, 0x8A, 0xFF, 0xA3, 0xF8, 0x19, 0xF1, + 0xB0, 0xE6, 0xB8, 0xDD, 0x58, 0xCE, 0x5F, 0xCD, 0xD1, 0xDE, 0xCA, 0xD7, + 0x08, 0xE8, 0x1E, 0xDC, 0x7D, 0xDF, 0x3F, 0xD5, 0xBD, 0xF9, 0x1D, 0xF9, + 0x72, 0x18, 0x2A, 0x27, 0x6C, 0x0F, 0x07, 0x21, 0xB5, 0xFA, 0x8B, 0x07, + 0x08, 0x02, 0x08, 0x04, 0xC0, 0xFB, 0x96, 0xFD, 0xBE, 0xE3, 0xF8, 0xEC, + 0x74, 0xDA, 0xFA, 0xDC, 0xBC, 0xC3, 0x82, 0xC3, 0x18, 0xAF, 0x20, 0xA5, + 0xEC, 0xC3, 0x2F, 0xA5, 0xCB, 0xED, 0xEB, 0xBD, 0x21, 0x0A, 0xE2, 0xD3, + 0x64, 0x15, 0x56, 0xEF, 0xE7, 0x2D, 0x37, 0x0C, 0x66, 0x52, 0xDE, 0x23, + 0xCC, 0x5C, 0xF6, 0x26, 0x04, 0x42, 0x4F, 0x14, 0x15, 0x2E, 0xFF, 0x12, + 0xA3, 0x27, 0x35, 0x0A, 0xD4, 0x0E, 0x21, 0xFA, 0xBB, 0x00, 0x2C, 0x0B, + 0xEB, 0xFC, 0x29, 0x0D, 0x82, 0x05, 0xF2, 0x02, 0xEC, 0x13, 0x53, 0x0D, + 0xED, 0x13, 0x83, 0x1E, 0xAC, 0x07, 0x89, 0x1F, 0xFA, 0x00, 0x64, 0x23, + 0xDC, 0x0F, 0x13, 0x32, 0x36, 0x21, 0x88, 0x31, 0xA0, 0x30, 0xF1, 0x34, + 0x42, 0x38, 0x22, 0x3F, 0xB1, 0x43, 0xC1, 0x44, 0x27, 0x4B, 0x49, 0x43, + 0x61, 0x3F, 0xF9, 0x42, 0x90, 0x3B, 0x64, 0x46, 0xA4, 0x3B, 0x96, 0x3E, + 0x7B, 0x2B, 0xAE, 0x29, 0x9D, 0x2D, 0xA5, 0x20, 0xC2, 0x2B, 0xFE, 0x1A, + 0x75, 0x0B, 0xBD, 0x05, 0x1C, 0xFF, 0x3E, 0xF9, 0x49, 0x17, 0x65, 0x02, + 0xD4, 0x28, 0x93, 0x12, 0x6B, 0x17, 0x40, 0x1B, 0xA5, 0x1C, 0xF4, 0x26, + 0xB5, 0x3F, 0x20, 0x3A, 0x54, 0x32, 0xFA, 0x28, 0x09, 0x1D, 0xC9, 0x16, + 0x3A, 0x32, 0xB6, 0x35, 0xAB, 0x2F, 0x1B, 0x34, 0x22, 0x10, 0x11, 0x04, + 0xEE, 0xF6, 0xFB, 0xE5, 0x34, 0xDF, 0x80, 0xD5, 0x69, 0xCB, 0x5E, 0xC1, + 0xCC, 0xD0, 0x0A, 0xC3, 0x06, 0xEA, 0x41, 0xDC, 0xEF, 0xF3, 0xFA, 0xEB, + 0x8F, 0x04, 0xF2, 0xFD, 0xA5, 0x2B, 0x63, 0x2C, 0x0A, 0x48, 0x3F, 0x4D, + 0xCB, 0x4E, 0xFE, 0x49, 0xF0, 0x4C, 0xE9, 0x45, 0x5B, 0x44, 0xBF, 0x32, + 0x77, 0x1E, 0xF7, 0x07, 0x36, 0xF7, 0x6C, 0xF6, 0xB7, 0xEC, 0x0A, 0xFD, + 0x70, 0xF1, 0x69, 0xF4, 0x62, 0x02, 0x36, 0xF4, 0x05, 0x0E, 0x06, 0xF8, + 0xFC, 0x17, 0x98, 0xFA, 0x22, 0x22, 0xD5, 0x03, 0x7F, 0x11, 0xBE, 0xFF, + 0x8C, 0x03, 0x1B, 0x04, 0xFA, 0x04, 0xED, 0x0E, 0xAA, 0x07, 0x83, 0x1E, + 0x0F, 0x0B, 0xCE, 0x26, 0x2A, 0x17, 0x74, 0x2C, 0x67, 0x2C, 0x67, 0x3B, + 0x63, 0x39, 0x45, 0x42, 0x4B, 0x3A, 0x2F, 0x47, 0x5C, 0x30, 0x51, 0x43, + 0x67, 0x23, 0x4A, 0x31, 0xCC, 0x1C, 0xBD, 0x28, 0x14, 0x12, 0xFC, 0x1C, + 0x57, 0x05, 0xEB, 0x0B, 0x5F, 0x0B, 0xD2, 0x0D, 0xC4, 0x1A, 0xFD, 0x12, + 0x63, 0x0F, 0x33, 0x0B, 0xCD, 0xFA, 0x9B, 0xFF, 0xFB, 0x06, 0x50, 0x0D, + 0x0E, 0x28, 0x45, 0x27, 0x5B, 0x3C, 0x2F, 0x26, 0x69, 0x41, 0x63, 0x2C, + 0xAE, 0x44, 0x0B, 0x3B, 0x2F, 0x31, 0xDF, 0x26, 0xD7, 0x18, 0xBC, 0x09, + 0xFD, 0x09, 0xD1, 0xFC, 0x40, 0xEF, 0xA8, 0xF4, 0xDB, 0xD6, 0x98, 0xD6, + 0xC4, 0xD8, 0x7E, 0xC8, 0xC8, 0xF5, 0x1E, 0xF3, 0x0A, 0x0F, 0x2E, 0x1C, + 0x70, 0x1E, 0x81, 0x2A, 0xDA, 0x33, 0x07, 0x41, 0xF2, 0x41, 0xE9, 0x59, + 0x92, 0x45, 0xF8, 0x61, 0x39, 0x4E, 0x2A, 0x5D, 0x1C, 0x46, 0x97, 0x4A, + 0x62, 0x21, 0xE8, 0x1E, 0x55, 0x05, 0x49, 0xFB, 0xCF, 0xEF, 0x69, 0xF6, + 0x2E, 0xD5, 0xA7, 0xEF, 0x2C, 0xD1, 0xFE, 0xF4, 0x50, 0xDC, 0x28, 0xFE, + 0x7B, 0xE0, 0x89, 0xF5, 0x9F, 0xEB, 0xAF, 0xF8, 0x64, 0x0B, 0x81, 0x0E, + 0x0C, 0x1D, 0x89, 0x13, 0xB6, 0x16, 0xEF, 0x0E, 0x3D, 0x10, 0x7D, 0x18, + 0x2E, 0x05, 0xF4, 0x13, 0xA5, 0x12, 0x9E, 0x18, 0xC6, 0x2D, 0xF2, 0x2D, + 0xB3, 0x29, 0x1C, 0x2C, 0x3C, 0x22, 0x44, 0x1E, 0x41, 0x24, 0x1D, 0x19, + 0x31, 0x16, 0x07, 0x0C, 0xE0, 0x05, 0xE9, 0x01, 0xF1, 0xEF, 0xB1, 0x08, + 0xB0, 0xDF, 0xDE, 0x03, 0x54, 0xF2, 0x78, 0xFD, 0xA5, 0x06, 0x71, 0x06, + 0x03, 0xFE, 0x05, 0x05, 0xAA, 0xF6, 0x1D, 0x02, 0xAD, 0x0A, 0xA6, 0x13, + 0x4B, 0x21, 0xE2, 0x2D, 0xCC, 0x21, 0x41, 0x30, 0x0E, 0x24, 0x07, 0x2C, + 0xA2, 0x2B, 0x7B, 0x3E, 0x34, 0x1C, 0x5E, 0x35, 0xAA, 0x04, 0x48, 0x16, + 0x7D, 0xED, 0x37, 0x01, 0x9F, 0xD4, 0xF0, 0xDE, 0x76, 0xBD, 0x46, 0xBB, + 0xB8, 0xB2, 0x66, 0xB4, 0x3F, 0xC1, 0x05, 0xC9, 0x9D, 0xD7, 0xB2, 0xDD, + 0x6A, 0xF8, 0xA8, 0xF4, 0xF3, 0x2D, 0xC7, 0x27, 0xEB, 0x4B, 0x4F, 0x4E, + 0x29, 0x3D, 0xCE, 0x4B, 0x6E, 0x25, 0x2F, 0x3F, 0x00, 0x1A, 0x61, 0x2C, + 0x06, 0xFC, 0x2C, 0x0F, 0x85, 0xDA, 0xF9, 0xF9, 0x0F, 0xCE, 0x64, 0xE8, + 0x0F, 0xC6, 0xE5, 0xCF, 0x7B, 0xD3, 0xAC, 0xCA, 0x4E, 0xE9, 0x2C, 0xDC, + 0x8A, 0xED, 0x9B, 0xE1, 0x42, 0xE6, 0x41, 0xD1, 0x1C, 0xEC, 0xD3, 0xD0, + 0x8D, 0xEB, 0xB9, 0xE1, 0x2C, 0xD9, 0xFF, 0xE5, 0xE3, 0xD8, 0x94, 0xE6, + 0x3B, 0xE8, 0x7F, 0xEE, 0x15, 0xF7, 0xB0, 0x04, 0xD1, 0x05, 0x71, 0x18, + 0xB4, 0x0C, 0x84, 0x1F, 0xCD, 0x0B, 0xB4, 0x27, 0xA3, 0x10, 0x26, 0x1D, + 0x89, 0x08, 0x20, 0xFB, 0x2C, 0xF2, 0x5C, 0xE2, 0x0E, 0xE3, 0xC4, 0xD8, + 0x6C, 0xDB, 0x95, 0xCF, 0x5E, 0xDB, 0x93, 0xC7, 0x69, 0xEA, 0x04, 0xD0, + 0x35, 0xE7, 0xC4, 0xD4, 0x02, 0xDD, 0xF4, 0xD6, 0xCE, 0xF0, 0xAF, 0xF0, + 0xDA, 0x0A, 0xCC, 0x0D, 0xD1, 0x0F, 0x1C, 0x19, 0x8C, 0x14, 0x9F, 0x21, + 0xC2, 0x1A, 0x9F, 0x1C, 0x86, 0x02, 0x25, 0xF6, 0xA4, 0xE0, 0xCF, 0xD4, + 0xF0, 0xC5, 0xAC, 0xC8, 0x22, 0xB1, 0xDA, 0xB6, 0x7D, 0xA4, 0x1F, 0x9E, + 0x90, 0xAD, 0xCD, 0xA1, 0xBC, 0xC9, 0x5E, 0xC5, 0x9F, 0xE2, 0xF7, 0xE9, + 0x57, 0xFB, 0x00, 0x06, 0x1E, 0x1E, 0x45, 0x27, 0x83, 0x30, 0x0B, 0x37, + 0x03, 0x29, 0xFD, 0x26, 0xFA, 0x23, 0x85, 0x19, 0x2B, 0x1E, 0x92, 0x10, + 0xD6, 0xFF, 0x0C, 0xF0, 0xA2, 0xD8, 0x60, 0xCF, 0xA2, 0xBE, 0xBC, 0xC0, + 0x91, 0xB3, 0xAE, 0xBA, 0xD3, 0xB3, 0xEB, 0xBD, 0x55, 0xB9, 0xA1, 0xCC, + 0x00, 0xC8, 0x96, 0xDC, 0x49, 0xE0, 0xAA, 0xDF, 0xCE, 0xF6, 0xC9, 0xF0, + 0xEB, 0xF7, 0xA9, 0xF8, 0xBB, 0xF1, 0x7F, 0xEE, 0xFE, 0xEC, 0x26, 0xEE, + 0xC1, 0xF4, 0xBE, 0xF6, 0x81, 0x09, 0xC3, 0xFC, 0xB3, 0x1A, 0x68, 0x00, + 0x46, 0x26, 0x67, 0x09, 0x07, 0x20, 0xE5, 0x0D, 0x4C, 0x0D, 0x3D, 0x08, + 0xBF, 0xF0, 0x30, 0xFB, 0x65, 0xD9, 0x63, 0xF4, 0x86, 0xCE, 0x1A, 0xED, + 0xC6, 0xC6, 0x2E, 0xE2, 0x83, 0xD9, 0xA2, 0xE5, 0x26, 0xF7, 0x06, 0xF8, + 0x1A, 0x01, 0xDB, 0xFB, 0x22, 0x05, 0x85, 0xF5, 0x0F, 0x12, 0xBA, 0x03, + 0x76, 0x1E, 0xB2, 0x07, 0x44, 0x22, 0x78, 0xFF, 0xA8, 0x2C, 0x60, 0x10, + 0x69, 0x21, 0x30, 0x16, 0x59, 0xFB, 0xF6, 0xFD, 0x52, 0xE8, 0x66, 0xE9, + 0x81, 0xE4, 0xE1, 0xD3, 0xE3, 0xD7, 0xBF, 0xB3, 0x67, 0xC3, 0xB6, 0x9D, + 0xC5, 0xBF, 0xC1, 0xA3, 0x8B, 0xCF, 0xEF, 0xC1, 0x0D, 0xEC, 0x48, 0xDE, + 0x21, 0x1A, 0x59, 0x03, 0x52, 0x39, 0xD4, 0x37, 0x42, 0x3C, 0xB8, 0x4D, + 0x19, 0x33, 0x33, 0x3A, 0x91, 0x1D, 0x57, 0x1F, 0xC2, 0xFA, 0x18, 0x0E, + 0x62, 0xDE, 0x06, 0xF6, 0x5D, 0xE7, 0xDA, 0xE4, 0x72, 0xF2, 0x58, 0xDE, + 0x80, 0xE4, 0x9F, 0xE1, 0xBB, 0xD8, 0x48, 0xEC, 0x88, 0xD6, 0x09, 0xEC, + 0xBE, 0xD5, 0x5C, 0xE2, 0x87, 0xDA, 0x77, 0xDF, 0xEA, 0xE8, 0x01, 0xE0, + 0xDA, 0xEE, 0x43, 0xD2, 0x61, 0xEA, 0x23, 0xCD, 0xB8, 0xE5, 0x60, 0xD5, + 0xC4, 0xE4, 0xC0, 0xE2, 0x6D, 0xE8, 0x8B, 0xEC, 0xDC, 0xF6, 0xBF, 0xFE, + 0x67, 0x0B, 0x2E, 0x13, 0x90, 0x0D, 0xC7, 0x06, 0xEC, 0xF9, 0x3B, 0xF0, + 0x7D, 0xEE, 0x7E, 0xE5, 0xB4, 0xE9, 0x3A, 0xDA, 0x49, 0xDC, 0x86, 0xD1, + 0x55, 0xCC, 0xB6, 0xC6, 0x0E, 0xD5, 0xB7, 0xC2, 0x0F, 0xE0, 0x1C, 0xC3, + 0xC9, 0xD7, 0xAE, 0xC7, 0xD2, 0xE2, 0xBC, 0xDE, 0x56, 0xFB, 0xAD, 0xF4, + 0x54, 0x00, 0xE4, 0xF5, 0x47, 0xFD, 0x68, 0xE9, 0x0E, 0x05, 0x57, 0xE7, + 0xFE, 0xF8, 0x7D, 0xE7, 0x71, 0xE3, 0xD2, 0xDF, 0xCE, 0xDE, 0x1E, 0xD5, + 0x0E, 0xC8, 0x3E, 0xBB, 0x1B, 0xA5, 0x15, 0xA0, 0xF8, 0xA1, 0xA9, 0xA5, + 0x4E, 0xBB, 0xE9, 0xBB, 0xBD, 0xDA, 0x46, 0xCE, 0x32, 0xFD, 0x4C, 0xEA, + 0x24, 0x25, 0x65, 0x16, 0x28, 0x49, 0xCE, 0x44, 0x02, 0x54, 0x3B, 0x50, + 0x1E, 0x3C, 0x92, 0x31, 0x1E, 0x17, 0x30, 0x12, 0xF2, 0xF0, 0xF2, 0xF8, + 0x79, 0xDA, 0xC1, 0xE3, 0xCC, 0xDE, 0xCB, 0xD4, 0x1A, 0xE1, 0x78, 0xC4, + 0xB9, 0xDE, 0xA9, 0xC0, 0x0E, 0xEC, 0xD4, 0xCE, 0x23, 0x02, 0x09, 0xED, + 0x22, 0x02, 0xF6, 0x05, 0x4F, 0xF6, 0x28, 0x11, 0xAA, 0xF8, 0xEB, 0x0E, + 0xC6, 0x02, 0x7A, 0x03, 0x7B, 0x01, 0xDB, 0x03, 0xCB, 0xF3, 0x99, 0x03, + 0x59, 0xF6, 0x4D, 0x07, 0xC8, 0x0A, 0x95, 0x18, 0x98, 0x21, 0x4B, 0x24, + 0x69, 0x38, 0xBB, 0x2E, 0x95, 0x3B, 0x2B, 0x34, 0x5F, 0x24, 0x72, 0x1C, + 0xA2, 0x17, 0xEF, 0xFE, 0x82, 0x07, 0x03, 0xEE, 0x0F, 0xE4, 0x8D, 0xE8, + 0x72, 0xD5, 0x27, 0xE5, 0xE2, 0xE6, 0x24, 0xE0, 0x67, 0xF6, 0xE7, 0xE1, + 0x83, 0xF8, 0xA8, 0xE4, 0x1D, 0x04, 0xB6, 0xF7, 0x76, 0x17, 0x0A, 0x14, + 0x95, 0x1A, 0xF2, 0x15, 0x91, 0x16, 0x25, 0x11, 0xF0, 0x19, 0x13, 0x1B, + 0x7D, 0x13, 0x3C, 0x1A, 0xE5, 0x06, 0xCC, 0x0A, 0x63, 0xFC, 0x69, 0xF9, + 0xEB, 0xE3, 0x8B, 0xE2, 0x92, 0xC5, 0x54, 0xC6, 0x8D, 0xB9, 0x16, 0xBA, + 0xD2, 0xCD, 0xE4, 0xCD, 0x19, 0xF1, 0x52, 0xED, 0xE2, 0x13, 0x73, 0x14, + 0xEF, 0x36, 0x8A, 0x3F, 0xEC, 0x4F, 0x51, 0x5A, 0xCE, 0x5F, 0x38, 0x62, + 0xE2, 0x56, 0x77, 0x4E, 0xC2, 0x34, 0x60, 0x2E, 0xA4, 0x0F, 0x44, 0x1E, + 0xF2, 0xF0, 0x1A, 0x14, 0x2A, 0xDD, 0xD7, 0x01, 0x19, 0xCC, 0x60, 0xF3, + 0x40, 0xC7, 0x60, 0xED, 0x55, 0xDB, 0x43, 0xE2, 0x81, 0xEE, 0xF0, 0xD7, + 0x5E, 0xF2, 0x49, 0xE4, 0x0E, 0xF9, 0x37, 0xEE, 0x3B, 0xFE, 0x9C, 0xF0, + 0x7F, 0x0F, 0x2A, 0xF6, 0xA5, 0x2A, 0xE7, 0xE8, 0xA5, 0x30, 0x11, 0xF2, + 0xF5, 0x31, 0xCD, 0x15, 0x92, 0x34, 0x39, 0x22, 0x83, 0x30, 0xEA, 0x18, + 0x8F, 0x2E, 0x63, 0x1E, 0xBC, 0x1C, 0xCC, 0x24, 0x71, 0x0F, 0x80, 0x13, + 0x54, 0x0A, 0x00, 0xFF, 0x12, 0xEB, 0x35, 0xFA, 0xE5, 0xCE, 0xEC, 0xFC, + 0xC8, 0xD6, 0x5F, 0xFC, 0xB9, 0xE9, 0xDB, 0xF6, 0xAD, 0xE8, 0x1F, 0xF3, + 0x78, 0xF3, 0x80, 0xFF, 0x71, 0x19, 0x23, 0x12, 0x59, 0x2D, 0xEB, 0x18, + 0xF3, 0x32, 0xD2, 0x1C, 0x54, 0x3E, 0x3F, 0x26, 0x9E, 0x2C, 0x7B, 0x1A, + 0xC3, 0xFB, 0x09, 0xF5, 0x86, 0xD7, 0x18, 0xCF, 0x39, 0xC3, 0x9C, 0xBC, + 0xC8, 0xB5, 0xB5, 0xB7, 0x28, 0xBD, 0x22, 0xB1, 0x33, 0xD5, 0x97, 0xBB, + 0xD2, 0xE6, 0x63, 0xD6, 0x6E, 0xF9, 0x21, 0xF8, 0xF4, 0x1B, 0x2B, 0x2C, + 0x09, 0x3D, 0xA2, 0x56, 0x35, 0x4B, 0x0E, 0x5F, 0xF0, 0x3B, 0x5F, 0x4D, + 0xDB, 0x1F, 0x01, 0x2F, 0xFC, 0x0B, 0xA6, 0x17, 0xD1, 0xF3, 0xD9, 0xFB, + 0xD3, 0xD8, 0x57, 0xD3, 0xA5, 0xCF, 0x60, 0xCD, 0x4B, 0xD0, 0x09, 0xDF, + 0xE3, 0xE2, 0x63, 0xE3, 0x30, 0x02, 0x9D, 0xE7, 0xF6, 0x0B, 0x98, 0xF8, + 0x0E, 0x05, 0xDA, 0x06, 0x5F, 0xFC, 0xD7, 0xF4, 0xB1, 0x05, 0xCD, 0xEA, + 0x9B, 0x0B, 0xEA, 0xF6, 0xAA, 0x00, 0x7D, 0x04, 0xB7, 0x03, 0xC6, 0x1E, + 0x07, 0x16, 0x98, 0x32, 0x65, 0x31, 0x5B, 0x2D, 0xC5, 0x51, 0x32, 0x29, + 0x0A, 0x55, 0xBE, 0x35, 0xBC, 0x42, 0x60, 0x32, 0x9D, 0x3E, 0x1A, 0x21, + 0x9D, 0x2A, 0xC5, 0x0C, 0xB6, 0x03, 0x9A, 0xF2, 0x0A, 0xFF, 0x7F, 0xFA, + 0x21, 0x1D, 0x0B, 0x1C, 0x36, 0x1B, 0x0D, 0x1F, 0xBB, 0x09, 0x8E, 0x1B, + 0x9B, 0x13, 0x4E, 0x36, 0x43, 0x0E, 0x84, 0x3D, 0x48, 0x14, 0xC5, 0x3A, + 0x71, 0x3A, 0xBD, 0x48, 0xEB, 0x47, 0x28, 0x41, 0x70, 0x31, 0x34, 0x2D, + 0x9D, 0x0B, 0xEF, 0x1F, 0xCC, 0xE1, 0x87, 0x0E, 0x61, 0xC2, 0xA1, 0xF8, + 0x4A, 0xBB, 0x3D, 0xED, 0xF4, 0xD3, 0x81, 0x00, 0x2D, 0xF7, 0x60, 0x19, + 0x21, 0x0C, 0x9C, 0x29, 0xAD, 0x1F, 0xF1, 0x3C, 0xCC, 0x38, 0x99, 0x42, + 0xF4, 0x49, 0x73, 0x45, 0xEE, 0x47, 0xE9, 0x47, 0x07, 0x3B, 0xE4, 0x3E, + 0x14, 0x33, 0xEB, 0x2D, 0x56, 0x29, 0x15, 0x1B, 0xA2, 0x16, 0x96, 0x05, + 0x10, 0x05, 0x6D, 0xF5, 0xBE, 0xF6, 0x30, 0xF1, 0x3B, 0xF9, 0x15, 0xF1, + 0x18, 0x0E, 0x8E, 0x01, 0x8B, 0x1E, 0xEB, 0x1E, 0x59, 0x22, 0x66, 0x29, + 0xF3, 0x1E, 0xD6, 0x25, 0xB6, 0x2C, 0xA0, 0x2A, 0x08, 0x41, 0xAB, 0x2E, + 0x60, 0x51, 0x83, 0x35, 0xB4, 0x5D, 0x69, 0x49, 0xCE, 0x5E, 0x10, 0x58, + 0x88, 0x5E, 0x4B, 0x59, 0x9E, 0x55, 0xA4, 0x4E, 0xAF, 0x42, 0x22, 0x3A, + 0x3B, 0x3A, 0x17, 0x36, 0x45, 0x26, 0x1E, 0x28, 0x92, 0x01, 0x29, 0x10, + 0xBD, 0xF6, 0x94, 0x11, 0x0C, 0xFD, 0x04, 0x19, 0x40, 0xF5, 0x93, 0x15, + 0x54, 0xF5, 0x7C, 0x21, 0x07, 0x11, 0x37, 0x45, 0x98, 0x2D, 0x82, 0x50, + 0x53, 0x36, 0xA9, 0x3C, 0x00, 0x3F, 0x95, 0x3D, 0x52, 0x43, 0x6A, 0x48, + 0xD4, 0x2C, 0x01, 0x43, 0xF2, 0x0C, 0x34, 0x2D, 0x37, 0xEE, 0xC6, 0x03, + 0x30, 0xD4, 0x05, 0xE9, 0x0D, 0xBF, 0xA2, 0xDB, 0x64, 0xB1, 0x0A, 0xD4, + 0x0D, 0xC2, 0x87, 0xE1, 0xAB, 0xE4, 0x1B, 0xF9, 0x68, 0x08, 0xDB, 0x17, + 0x9F, 0x33, 0x35, 0x42, 0x9B, 0x51, 0x27, 0x5B, 0x1A, 0x52, 0xE4, 0x53, + 0x82, 0x46, 0xD6, 0x4D, 0x33, 0x40, 0xDD, 0x49, 0x01, 0x39, 0x18, 0x38, + 0x7B, 0x25, 0xFF, 0x0E, 0x27, 0x0E, 0x3F, 0xE8, 0x36, 0xF5, 0x15, 0xDC, + 0x96, 0xD1, 0xAF, 0xD9, 0xB6, 0xB6, 0x20, 0xDC, 0x5A, 0xB5, 0xAC, 0xD7, + 0xD5, 0xD3, 0x52, 0xE4, 0xC7, 0xF5, 0xC9, 0xF1, 0xDC, 0x0D, 0x27, 0xE9, + 0xD4, 0x22, 0xF3, 0xEA, 0x2F, 0x28, 0xDB, 0xFA, 0x36, 0x2C, 0xB9, 0x0A, + 0x6E, 0x2C, 0x56, 0x13, 0x47, 0x29, 0xCB, 0x1B, 0x14, 0x2E, 0x6C, 0x2A, + 0x17, 0x27, 0x33, 0x27, 0xC7, 0x14, 0xAA, 0x1A, 0x42, 0x04, 0xEA, 0x0F, + 0x20, 0xEB, 0x29, 0xFD, 0x61, 0xD0, 0xEC, 0xEB, 0x5A, 0xD0, 0x5D, 0xEF, + 0x00, 0xE2, 0x25, 0x00, 0x9D, 0xE1, 0x78, 0x00, 0x68, 0xDE, 0x66, 0x00, + 0xBC, 0xE5, 0xD9, 0x07, 0x71, 0xE6, 0x85, 0x0D, 0xB2, 0xEC, 0x1E, 0x0A, + 0x8C, 0xF2, 0x68, 0x09, 0x4F, 0xEC, 0xEE, 0x07, 0xB4, 0xDB, 0xC6, 0xF6, + 0x0B, 0xBF, 0x56, 0xDF, 0xAD, 0xB1, 0x8D, 0xCE, 0x39, 0xB6, 0xB6, 0xC0, + 0x41, 0xB6, 0x92, 0xAF, 0xB8, 0xB1, 0x30, 0xA7, 0x65, 0xAC, 0x44, 0xAA, + 0x95, 0xBC, 0xFA, 0xBD, 0x45, 0xEE, 0xF1, 0xF1, 0xE1, 0x1A, 0x11, 0x25, + 0x9E, 0x36, 0xA4, 0x32, 0xFE, 0x47, 0xAB, 0x34, 0xD6, 0x33, 0xF3, 0x2F, + 0x85, 0x0C, 0xE5, 0x20, 0x30, 0xED, 0x9E, 0x00, 0xC1, 0xDB, 0xD0, 0xD7, + 0xE1, 0xE3, 0xAE, 0xC3, 0xC8, 0xED, 0xE3, 0xC6, 0xBB, 0xEB, 0x2F, 0xD1, + 0xC5, 0xD8, 0xDC, 0xC3, 0x56, 0xCB, 0x67, 0xBD, 0x46, 0xCC, 0xCF, 0xCB, + 0x03, 0xC5, 0x48, 0xD8, 0xAE, 0xC3, 0x12, 0xDF, 0x6D, 0xC9, 0x95, 0xE2, + 0x2B, 0xEA, 0x4E, 0x00, 0xF1, 0x05, 0x25, 0x17, 0xFD, 0xF9, 0x30, 0x0B, + 0x66, 0xF7, 0xD2, 0xF8, 0x41, 0x03, 0xBC, 0xF3, 0x34, 0x07, 0x25, 0xF8, + 0x62, 0x07, 0x95, 0xF7, 0xA3, 0xFD, 0x33, 0xEE, 0x2C, 0xEE, 0x50, 0xE5, + 0xEC, 0xE8, 0xD6, 0xD6, 0xC2, 0xED, 0x48, 0xDA, 0x42, 0xD5, 0xF3, 0xE6, + 0xE8, 0xA8, 0x0E, 0xD5, 0xA1, 0xB4, 0x3C, 0xDB, 0x3F, 0xDD, 0xA7, 0x00, + 0x65, 0xED, 0x76, 0x09, 0xF5, 0xF5, 0xF0, 0x03, 0x8F, 0x0B, 0x6A, 0x0B, + 0xEB, 0x1E, 0x37, 0x0D, 0xFB, 0x0A, 0x6E, 0xF9, 0xA9, 0xDB, 0xF8, 0xD8, + 0x79, 0xB8, 0x57, 0xB4, 0x6D, 0xAD, 0xEB, 0xA1, 0xA0, 0xAC, 0x5C, 0xB0, + 0x38, 0xB8, 0xBA, 0xC8, 0x01, 0xCA, 0x28, 0xE2, 0x6A, 0xE3, 0x19, 0xF7, + 0x73, 0x0A, 0x26, 0x05, 0x27, 0x21, 0x15, 0x16, 0x5D, 0x23, 0xED, 0x1C, + 0xF6, 0x27, 0x0A, 0x17, 0x3C, 0x2D, 0xFF, 0x13, 0xCB, 0x25, 0x7C, 0x09, + 0xA5, 0x0D, 0x8F, 0xEA, 0x32, 0xEF, 0x4B, 0xCA, 0x57, 0xDD, 0x73, 0xBF, + 0x6B, 0xCF, 0x52, 0xB8, 0x40, 0xB9, 0x1E, 0xAC, 0xF8, 0xB4, 0xC8, 0xB5, + 0xD5, 0xC1, 0xD0, 0xC9, 0xA4, 0xD8, 0x98, 0xD4, 0x9E, 0xF0, 0x7C, 0xE1, + 0x94, 0xEA, 0xB3, 0xEE, 0x66, 0xDF, 0xB5, 0xF8, 0xB6, 0xEF, 0xA1, 0x09, + 0xBD, 0x06, 0x48, 0x0D, 0x73, 0x0D, 0x34, 0x02, 0x94, 0x18, 0xAE, 0x0E, + 0x94, 0x11, 0xC4, 0x0B, 0xFD, 0xEE, 0x9B, 0xEA, 0x50, 0xDA, 0x45, 0xDA, + 0x09, 0xC3, 0x31, 0xC9, 0x2E, 0xA1, 0xEA, 0xA8, 0x80, 0xA5, 0x1F, 0xA5, + 0x40, 0xBB, 0x74, 0xC1, 0x6A, 0xB4, 0xC5, 0xCC, 0xFF, 0xBE, 0x1D, 0xD7, + 0x6E, 0xEF, 0x7C, 0xF7, 0x6A, 0x08, 0xBE, 0x04, 0x9E, 0x02, 0x4D, 0xFA, + 0xC8, 0xF9, 0x95, 0xE7, 0x21, 0xFF, 0xC3, 0xDA, 0xBD, 0xFB, 0xFD, 0xC9, + 0xEA, 0xD2, 0xB4, 0xAE, 0x18, 0xB2, 0x30, 0xA0, 0x79, 0xA7, 0x32, 0xA0, + 0xE6, 0xA6, 0xD4, 0xA7, 0x73, 0xB6, 0xE9, 0xAF, 0xF5, 0xCF, 0xC2, 0xBA, + 0xBA, 0xE8, 0xF0, 0xD0, 0x41, 0x02, 0xFD, 0xEE, 0xF9, 0x2A, 0x0B, 0x19, + 0x58, 0x50, 0xAF, 0x48, 0x9F, 0x4A, 0xE5, 0x4F, 0xF4, 0x33, 0x56, 0x39, + 0x10, 0x24, 0xD6, 0x1B, 0x70, 0x05, 0x8B, 0xED, 0x0F, 0xE3, 0xF8, 0xCB, + 0x5D, 0xCE, 0x57, 0xC0, 0xB3, 0xCD, 0xF9, 0xC2, 0x75, 0xCE, 0x4C, 0xCB, + 0xBF, 0xD1, 0xB1, 0xDB, 0xA9, 0xE0, 0x7A, 0xF4, 0xF3, 0xEB, 0x27, 0x04, + 0x63, 0xFC, 0x81, 0x0C, 0x20, 0x05, 0x6F, 0x10, 0xB7, 0x12, 0x19, 0x2A, + 0xDD, 0x1E, 0x7D, 0x42, 0x09, 0x25, 0x13, 0x46, 0xCB, 0x36, 0x5F, 0x53, + 0x3D, 0x38, 0x1E, 0x58, 0xEE, 0x2A, 0xAA, 0x49, 0x86, 0x34, 0x86, 0x37, + 0xE8, 0x38, 0xC6, 0x20, 0xCD, 0x20, 0x61, 0x06, 0xDA, 0x0E, 0x89, 0xEA, + 0x57, 0x12, 0xE1, 0xE8, 0xD3, 0x1B, 0x4F, 0x06, 0xD7, 0x13, 0x42, 0x14, + 0x09, 0x12, 0x17, 0x15, 0xA7, 0x2A, 0x66, 0x28, 0xD8, 0x40, 0xCF, 0x2F, + 0xC2, 0x31, 0x89, 0x1C, 0x2D, 0x20, 0xAC, 0x1B, 0x69, 0x1F, 0xF4, 0x26, + 0x26, 0x19, 0x0B, 0x22, 0xFC, 0x14, 0x38, 0x0F, 0xBE, 0x10, 0xEA, 0xF4, + 0x43, 0xF6, 0x98, 0xC8, 0x33, 0xDB, 0x02, 0xA5, 0x42, 0xDD, 0xE8, 0xB7, + 0xC6, 0xEA, 0x27, 0xE4, 0xEA, 0xFD, 0xA6, 0x0B, 0xE5, 0x23, 0x04, 0x32, + 0xED, 0x53, 0x5D, 0x52, 0xE8, 0x62, 0xDA, 0x56, 0xD5, 0x50, 0x46, 0x3F, + 0xF5, 0x30, 0xD5, 0x2D, 0x95, 0x14, 0xE1, 0x19, 0x38, 0x0E, 0xA8, 0xFE, + 0x8B, 0x08, 0x69, 0xF1, 0x06, 0xEF, 0xCB, 0xE5, 0xF6, 0xE1, 0xBB, 0xE3, + 0x75, 0xE4, 0x12, 0xE0, 0x14, 0xDD, 0x11, 0xD9, 0xF8, 0xD8, 0xFA, 0xE2, + 0x7B, 0xD7, 0xD6, 0xEA, 0xA7, 0xE4, 0xCF, 0xF8, 0x7E, 0xEB, 0x68, 0x06, + 0xDF, 0xFB, 0x02, 0x20, 0x02, 0x1F, 0x16, 0x39, 0x0B, 0x29, 0x18, 0x35, + 0xDF, 0x32, 0x18, 0x33, 0x66, 0x33, 0xEC, 0x2A, 0xFE, 0x13, 0xC2, 0x12, + 0x70, 0x06, 0xC0, 0x0D, 0x05, 0x0C, 0xA1, 0x0D, 0x8C, 0xFC, 0x8B, 0xF5, + 0x82, 0xEF, 0xB9, 0xDF, 0xEB, 0x02, 0x53, 0xDD, 0x3B, 0x0A, 0xAE, 0xDE, + 0x9D, 0xE9, 0x23, 0xDB, 0x61, 0xDC, 0xE6, 0xE2, 0x4D, 0xE6, 0x20, 0xFE, + 0xDC, 0xFB, 0x6A, 0x1A, 0xDF, 0x22, 0xCC, 0x27, 0xB6, 0x3A, 0x16, 0x33, + 0x6E, 0x39, 0x9E, 0x35, 0x5C, 0x1D, 0xB4, 0x18, 0x11, 0xF5, 0x62, 0xE8, + 0x36, 0xE8, 0xF1, 0xC9, 0x59, 0xE8, 0xF5, 0xB8, 0xCB, 0xDD, 0x03, 0xB1, + 0x53, 0xE5, 0x02, 0xBF, 0xC1, 0x00, 0xBE, 0xDC, 0x38, 0x10, 0xBB, 0xFC, + 0x31, 0x17, 0x93, 0x12, 0x84, 0x27, 0x61, 0x2C, 0x4F, 0x39, 0x76, 0x49, + 0x62, 0x3A, 0xEF, 0x4A, 0xF2, 0x31, 0x85, 0x48, 0xA8, 0x1A, 0xC0, 0x4F, + 0x9F, 0xF4, 0x6E, 0x39, 0xBC, 0xE3, 0x51, 0x0E, 0xF7, 0xE1, 0x71, 0xEE, + 0xBE, 0xE8, 0xD0, 0xE6, 0xAA, 0xF7, 0xFF, 0xE7, 0x5F, 0xFC, 0xB9, 0xED, + 0x96, 0xFC, 0xCE, 0xFB, 0xCB, 0xFF, 0xE6, 0x04, 0x6A, 0x0F, 0xFB, 0x0B, + 0x07, 0x26, 0x8C, 0x15, 0x75, 0x30, 0x49, 0x21, 0xEA, 0x2D, 0xDC, 0x29, + 0xC3, 0x25, 0x79, 0x26, 0x23, 0x33, 0xE9, 0x32, 0xFB, 0x42, 0x30, 0x46, + 0x69, 0x3C, 0x1F, 0x3C, 0x49, 0x34, 0xC7, 0x31, 0xBF, 0x21, 0xE9, 0x29, + 0x2D, 0x12, 0x9A, 0x1D, 0x68, 0x0F, 0x48, 0x0D, 0x31, 0x11, 0xE3, 0x05, + 0x17, 0x03, 0xE3, 0x04, 0x6B, 0xED, 0xF2, 0xF2, 0xFB, 0xF5, 0x66, 0xF4, + 0xC6, 0x0F, 0x30, 0x10, 0x43, 0x1C, 0x15, 0x1C, 0x68, 0x22, 0xD2, 0x20, + 0x9C, 0x29, 0xC5, 0x23, 0x9B, 0x26, 0xB5, 0x17, 0xD8, 0x16, 0x16, 0x08, + 0x22, 0xFF, 0x0E, 0xFC, 0x9E, 0xEB, 0xC7, 0xEB, 0x2B, 0xE3, 0x0B, 0xD2, + 0x24, 0xD8, 0x28, 0xBD, 0x76, 0xD1, 0x33, 0xC4, 0xDC, 0xE3, 0xCE, 0xE0, + 0xA1, 0x04, 0xC2, 0x0D, 0x53, 0x1B, 0xA3, 0x37, 0x72, 0x29, 0x36, 0x4F, + 0x0F, 0x30, 0x1D, 0x5E, 0xCC, 0x23, 0xFB, 0x53, 0x58, 0x20, 0xAA, 0x4B, + 0x9D, 0x1A, 0xA7, 0x41, 0x55, 0xFA, 0xD1, 0x1D, 0xDA, 0xDF, 0x08, 0xF5, + 0xC4, 0xDA, 0x5B, 0xE0, 0x23, 0xD7, 0xA7, 0xDA, 0xC9, 0xCB, 0xB6, 0xC7, + 0x78, 0xD3, 0x48, 0xC0, 0x92, 0xEB, 0x0F, 0xC0, 0x66, 0xF9, 0xD6, 0xC5, + 0x61, 0xFA, 0x30, 0xDF, 0xCE, 0xF8, 0xBB, 0xFF, 0x03, 0x13, 0x97, 0x30, + 0x68, 0x2C, 0x71, 0x4B, 0x69, 0x2D, 0xAE, 0x4A, 0x1E, 0x30, 0xA5, 0x59, + 0x32, 0x2A, 0xFA, 0x59, 0xE9, 0x2A, 0x74, 0x37, 0xB2, 0x33, 0x0D, 0x1D, + 0x66, 0x20, 0x15, 0x06, 0x18, 0x02, 0x88, 0xE6, 0xCB, 0xF8, 0x68, 0xD6, + 0x80, 0x08, 0x5D, 0xD9, 0x2F, 0x0D, 0x5A, 0xD7, 0xC0, 0xF3, 0x8B, 0xD2, + 0xA5, 0xEA, 0xB8, 0xEF, 0xC0, 0xFC, 0x55, 0x0F, 0xE1, 0x0A, 0xBD, 0x11, + 0xEE, 0x10, 0x97, 0x20, 0x13, 0x17, 0xBB, 0x2F, 0xF5, 0x14, 0xE7, 0x1A, + 0x38, 0xF6, 0x16, 0xEE, 0x0D, 0xDE, 0xC6, 0xD1, 0x93, 0xD5, 0x46, 0xCD, + 0xA7, 0xC4, 0xF4, 0xC5, 0x73, 0xC2, 0x35, 0xC5, 0x22, 0xD4, 0x50, 0xD9, + 0x7D, 0xE7, 0x18, 0xF8, 0x57, 0xFC, 0x08, 0x21, 0xAB, 0x16, 0xD1, 0x45, + 0xE9, 0x34, 0x6B, 0x59, 0xA1, 0x42, 0xFE, 0x5E, 0xCD, 0x39, 0x7D, 0x56, + 0xDB, 0x1F, 0x65, 0x41, 0xEC, 0xF9, 0x9D, 0x1C, 0xA6, 0xDE, 0xAB, 0xF9, + 0x19, 0xCD, 0x13, 0xE5, 0xB5, 0xC9, 0x98, 0xD9, 0x97, 0xCE, 0x9B, 0xCE, + 0x89, 0xD1, 0x10, 0xC0, 0x31, 0xD9, 0x76, 0xC7, 0x9A, 0xDD, 0x03, 0xE3, + 0x4B, 0xE7, 0x18, 0xF3, 0xB6, 0xF8, 0x69, 0xF5, 0xBA, 0x0D, 0x22, 0x0B, + 0x37, 0x23, 0xD5, 0x2F, 0x21, 0x2F, 0x9C, 0x33, 0x28, 0x3F, 0x15, 0x32, + 0xF4, 0x53, 0x7A, 0x3D, 0x4B, 0x4B, 0x27, 0x2C, 0x1E, 0x25, 0xBF, 0x0E, + 0xA8, 0x00, 0x6F, 0x00, 0xF3, 0xE4, 0x57, 0xF1, 0xE1, 0xE0, 0xDC, 0xDF, + 0xB0, 0xFA, 0x5F, 0xF2, 0x58, 0xFD, 0x4F, 0x02, 0xE9, 0xE4, 0x53, 0xE9, + 0xE0, 0xE5, 0xB7, 0xEA, 0x03, 0x00, 0xE0, 0x0D, 0xD9, 0x0F, 0xC8, 0x26, + 0x96, 0x16, 0x5E, 0x32, 0xD0, 0x20, 0x1B, 0x31, 0xFB, 0x38, 0x58, 0x36, + 0xEC, 0x37, 0xD1, 0x2E, 0x03, 0x0D, 0x1B, 0x09, 0xFA, 0xDE, 0x4B, 0xDB, + 0x95, 0xBE, 0x54, 0xB7, 0x67, 0xB1, 0xBF, 0xA4, 0xC4, 0xBB, 0xDB, 0xAB, + 0x93, 0xE2, 0x5D, 0xD6, 0xA6, 0x0B, 0x52, 0x0B, 0xB8, 0x2C, 0xE6, 0x2D, + 0x3F, 0x50, 0x50, 0x48, 0x75, 0x59, 0x5A, 0x55, 0x31, 0x4B, 0x1B, 0x4A, + 0x0F, 0x3E, 0xAC, 0x41, 0xF2, 0x1B, 0x1F, 0x33, 0x49, 0xF5, 0xDC, 0x0F, + 0x50, 0xE6, 0x4C, 0xF1, 0x7A, 0xD4, 0x54, 0xE6, 0x72, 0xBA, 0x1F, 0xDA, + 0x1E, 0xB1, 0x26, 0xD5, 0x5E, 0xBC, 0x86, 0xDF, 0x93, 0xD2, 0x00, 0xE5, + 0x0A, 0xF2, 0x8C, 0xEF, 0xDD, 0x08, 0x05, 0x02, 0x63, 0x11, 0xED, 0x1A, + 0xF4, 0x20, 0xC6, 0x2C, 0x6C, 0x2F, 0x2A, 0x2E, 0x48, 0x2C, 0x7A, 0x30, + 0x3E, 0x1E, 0xC7, 0x2B, 0x62, 0x0E, 0xFB, 0x19, 0x26, 0x10, 0x4D, 0x0A, + 0xB0, 0x16, 0xA6, 0xF5, 0x65, 0x06, 0x2C, 0xE2, 0xBC, 0xF3, 0x2E, 0xE5, + 0x69, 0xF3, 0x31, 0xF1, 0x34, 0xF1, 0xF8, 0xE4, 0xEB, 0xEC, 0xB3, 0xCF, + 0x78, 0xF4, 0xE4, 0xE0, 0xD0, 0x09, 0x20, 0x05, 0xA3, 0x11, 0x8F, 0x0C, + 0x36, 0x09, 0x3D, 0x0E, 0xAF, 0x08, 0xAD, 0x12, 0xF3, 0x0E, 0xEB, 0x13, + 0x53, 0x0A, 0xC1, 0x06, 0x00, 0xF5, 0xF3, 0xE9, 0xF0, 0xDE, 0xB2, 0xD0, + 0xC4, 0xD3, 0xF0, 0xB8, 0x82, 0xCE, 0x98, 0xAF, 0x17, 0xD2, 0xAF, 0xBC, + 0xB9, 0xEA, 0x68, 0xCE, 0xF1, 0x06, 0x2A, 0xED, 0x3B, 0x1D, 0x1B, 0x11, + 0xCE, 0x2E, 0xAA, 0x28, 0xD0, 0x31, 0xDD, 0x42, 0xC2, 0x23, 0xB0, 0x42, + 0xC4, 0x1B, 0xBF, 0x28, 0x30, 0x0B, 0xD1, 0x0F, 0x43, 0xE8, 0x4E, 0xF5, + 0x5B, 0xCD, 0xE1, 0xDF, 0x9C, 0xB1, 0xAF, 0xCD, 0xE8, 0x9A, 0x4D, 0xB8, + 0xB2, 0xA0, 0xFA, 0xA8, 0x91, 0xBA, 0x54, 0xA2, 0x4B, 0xC9, 0x95, 0xA6, + 0x3B, 0xCC, 0x26, 0xB9, 0x35, 0xC9, 0x88, 0xC5, 0x97, 0xD4, 0x40, 0xDF, + 0xB1, 0xF8, 0x4C, 0x0C, 0x64, 0x04, 0x04, 0x1C, 0x38, 0x04, 0x88, 0x11, + 0xC0, 0x12, 0x18, 0x11, 0x26, 0x07, 0x26, 0x11, 0xDA, 0xF6, 0xB1, 0x0B, + 0xFC, 0xEB, 0x5C, 0x01, 0x1E, 0xD2, 0x88, 0xE5, 0x8B, 0xC2, 0x35, 0xD0, + 0x3C, 0xD4, 0x4B, 0xE0, 0xA5, 0xE6, 0x02, 0xF0, 0x0A, 0xD9, 0x19, 0xE6, + 0x6F, 0xD5, 0xF0, 0xE9, 0xDE, 0xE5, 0xBE, 0x04, 0x45, 0xF3, 0x86, 0x17, + 0x11, 0x06, 0x56, 0x19, 0xC0, 0x20, 0xEF, 0x19, 0x66, 0x2F, 0x56, 0x1A, + 0xAA, 0x19, 0x07, 0x05, 0x83, 0xF2, 0x30, 0xDC, 0xFE, 0xD0, 0xC0, 0xBD, + 0x40, 0xB9, 0xCC, 0xA5, 0xCD, 0xB9, 0xBF, 0x9F, 0x46, 0xCA, 0x8E, 0xAF, + 0xF8, 0xDB, 0x59, 0xC0, 0x6A, 0xF8, 0x84, 0xE5, 0x57, 0x20, 0x38, 0x0C, + 0x13, 0x3A, 0xD9, 0x20, 0x90, 0x3E, 0xCE, 0x2F, 0x5D, 0x40, 0x97, 0x29, + 0xD9, 0x42, 0xFF, 0x21, 0xBC, 0x30, 0x06, 0x19, 0xA2, 0x0A, 0x19, 0xF7, + 0x2C, 0xEB, 0x43, 0xDA, 0x03, 0xDE, 0x90, 0xCC, 0xC1, 0xCA, 0x5D, 0xBA, + 0xDC, 0xB3, 0xAC, 0xB2, 0xC8, 0xAF, 0x2C, 0xB7, 0xE3, 0xAF, 0x9B, 0xB9, + 0x61, 0xAD, 0x4B, 0xC5, 0x61, 0xB1, 0x52, 0xD7, 0x94, 0xCC, 0x96, 0xED, + 0x66, 0xF9, 0x58, 0x07, 0xC4, 0x17, 0x90, 0x16, 0x91, 0x21, 0xE1, 0x1F, + 0xA1, 0x1D, 0xEB, 0x26, 0x02, 0x11, 0x67, 0x13, 0xF4, 0x12, 0x7D, 0x05, + 0x48, 0x0B, 0x65, 0xFB, 0x9F, 0xF1, 0x90, 0xD9, 0xE4, 0xE1, 0xCA, 0xC4, + 0x32, 0xDE, 0x68, 0xC4, 0x5F, 0xD5, 0xA5, 0xC7, 0x68, 0xC5, 0xA5, 0xC5, + 0x16, 0xDD, 0x95, 0xD7, 0xA8, 0x0C, 0xE2, 0xFF, 0xD2, 0x1C, 0x8D, 0x13, + 0xCE, 0x1E, 0xD9, 0x21, 0xFF, 0x17, 0x7D, 0x32, 0x7A, 0xFF, 0x19, 0x2E, + 0xED, 0xE2, 0x0B, 0x10, 0x1D, 0xC9, 0x5B, 0xE2, 0x37, 0xB4, 0x08, 0xC0, + 0x81, 0xB0, 0x22, 0xAA, 0x75, 0xC1, 0xD2, 0x9D, 0x10, 0xC9, 0xBE, 0x9D, + 0x52, 0xC8, 0x5B, 0xAA, 0x28, 0xDF, 0xF5, 0xD6, 0x2E, 0x05, 0x8A, 0x07, + 0x26, 0x17, 0x7F, 0x21, 0x34, 0x20, 0x91, 0x38, 0xE7, 0x30, 0x48, 0x4A, + 0x53, 0x2F, 0x0A, 0x44, 0xC9, 0x12, 0x36, 0x16, 0x73, 0xEF, 0xE4, 0xDA, + 0xE7, 0xCB, 0x00, 0xBB, 0xD6, 0xB0, 0xD0, 0xB2, 0xA7, 0xA1, 0xAD, 0xA5, + 0xD8, 0x9F, 0x5D, 0xA2, 0x61, 0xB8, 0x8A, 0xB9, 0x8C, 0xD9, 0x10, 0xCF, + 0xA3, 0xF4, 0x8D, 0xDC, 0xFC, 0x09, 0x6C, 0xE9, 0xC5, 0x17, 0x18, 0xFC, + 0xB0, 0x1A, 0xB6, 0x11, 0x32, 0x16, 0x10, 0x2B, 0x65, 0x2A, 0xB1, 0x48, + 0x78, 0x3F, 0xAF, 0x48, 0x3F, 0x2A, 0x69, 0x31, 0xD6, 0x0F, 0x09, 0x1B, + 0x55, 0xF3, 0xD6, 0x04, 0xF9, 0xD3, 0x5A, 0xF2, 0x3A, 0xCD, 0xEE, 0xE9, + 0x1E, 0xD3, 0x7B, 0xE9, 0x57, 0xD5, 0xD1, 0xDD, 0x5D, 0xE7, 0x0C, 0xD8, + 0x9D, 0x06, 0x96, 0xEB, 0x88, 0x0C, 0xD4, 0xFD, 0xA0, 0x07, 0xF1, 0xFF, + 0xE3, 0x19, 0x9F, 0x0A, 0x8F, 0x2D, 0x53, 0x18, 0x66, 0x2A, 0x59, 0x1B, + 0xD9, 0x0B, 0x22, 0x0D, 0x38, 0xE6, 0xFD, 0xE4, 0x6E, 0xD1, 0x95, 0xB9, + 0x6E, 0xCE, 0x84, 0xAE, 0x16, 0xCB, 0xF0, 0xB2, 0x7A, 0xC5, 0xE7, 0xB2, + 0x73, 0xDD, 0x49, 0xCB, 0x34, 0x08, 0xB4, 0xF5, 0x4D, 0x28, 0x1B, 0x17, + 0x44, 0x34, 0x35, 0x35, 0xBC, 0x3B, 0xA5, 0x51, 0xC3, 0x50, 0xAB, 0x5E, + 0x55, 0x50, 0x93, 0x5B, 0x2C, 0x2C, 0x7B, 0x46, 0xDC, 0x0A, 0xD9, 0x25, + 0xA7, 0xFB, 0x16, 0x0D, 0x5D, 0xEA, 0xC9, 0xF0, 0xE9, 0xC5, 0x8F, 0xCF, + 0x8C, 0xBE, 0x4F, 0xCA, 0xCA, 0xDE, 0x94, 0xDA, 0x91, 0xFA, 0x35, 0xE5, + 0xF5, 0x0F, 0xE3, 0xF2, 0xF4, 0x25, 0x43, 0x1A, 0x71, 0x46, 0x81, 0x43, + 0xA7, 0x5C, 0x72, 0x59, 0x68, 0x5B, 0xEE, 0x60, 0x0D, 0x60, 0x11, 0x61, + 0xA8, 0x58, 0x9A, 0x5F, 0x41, 0x49, 0xD9, 0x49, 0x1F, 0x42, 0xC3, 0x31, + 0x3A, 0x2A, 0x2A, 0x2D, 0xE6, 0x0D, 0xE8, 0x1B, 0x5B, 0x12, 0x32, 0x09, + 0xF1, 0x24, 0x05, 0xFF, 0xAB, 0x22, 0x50, 0xF2, 0x09, 0x26, 0x97, 0x00, + 0xED, 0x3D, 0xB1, 0x21, 0x8B, 0x4C, 0xC4, 0x31, 0xFA, 0x50, 0x28, 0x3E, + 0x04, 0x45, 0x3B, 0x41, 0xEF, 0x24, 0xFC, 0x38, 0x12, 0x0E, 0xC6, 0x35, + 0x30, 0xFA, 0x76, 0x14, 0xE9, 0xE3, 0x5E, 0xE9, 0x72, 0xDD, 0x26, 0xE2, + 0xF3, 0xEB, 0xBF, 0xE7, 0x49, 0xF2, 0xDA, 0xE0, 0xF6, 0xF5, 0xF2, 0xD9, + 0x23, 0x0C, 0xAF, 0xF3, 0x1D, 0x23, 0x6E, 0x25, 0x1E, 0x30, 0x54, 0x3B, + 0x8C, 0x41, 0x52, 0x41, 0x8A, 0x52, 0x8D, 0x58, 0x7A, 0x4F, 0x22, 0x61, + 0xC5, 0x37, 0xD1, 0x40, 0x87, 0x0A, 0x33, 0x16, 0x22, 0xDF, 0x54, 0xF6, + 0x20, 0xCC, 0xBF, 0xE5, 0xCA, 0xC4, 0x47, 0xDF, 0xBC, 0xD1, 0xC1, 0xD2, + 0x30, 0xF2, 0xF6, 0xD0, 0xCA, 0x00, 0x1E, 0xDF, 0x74, 0xF8, 0xB6, 0xEF, + 0x85, 0xF0, 0xCA, 0x05, 0xC1, 0x04, 0x37, 0x22, 0x96, 0x23, 0x25, 0x37, + 0xEA, 0x23, 0xDA, 0x3B, 0x20, 0x27, 0x94, 0x46, 0x7C, 0x35, 0x76, 0x54, + 0x7A, 0x31, 0x8D, 0x55, 0x62, 0x30, 0x08, 0x4D, 0xC0, 0x23, 0xEA, 0x33, + 0xBB, 0x0A, 0xA9, 0x11, 0x4E, 0xFC, 0x64, 0xEA, 0x0B, 0x02, 0xE1, 0xDB, + 0x4D, 0x03, 0xFC, 0xE4, 0xA6, 0xF0, 0x27, 0xEC, 0x92, 0xFA, 0x64, 0xF6, + 0xCA, 0x19, 0xC3, 0x03, 0xA8, 0x1F, 0xD4, 0x11, 0x39, 0x11, 0xFC, 0x18, + 0xD0, 0x0D, 0x6A, 0x14, 0x8A, 0x22, 0x94, 0x1C, 0xF9, 0x2B, 0x27, 0x1E, + 0xA5, 0x16, 0x59, 0xFB, 0x5F, 0x01, 0x4F, 0xE3, 0xC5, 0xFE, 0xAB, 0xE2, + 0x74, 0xFB, 0x1D, 0xE0, 0xA8, 0xF0, 0xDF, 0xE7, 0xD1, 0x01, 0x5A, 0x0B, + 0x81, 0x26, 0x9B, 0x2C, 0xFA, 0x45, 0x64, 0x34, 0xE7, 0x54, 0x14, 0x3F, + 0x18, 0x52, 0x3A, 0x57, 0xBC, 0x4C, 0xBF, 0x62, 0x80, 0x3D, 0x5F, 0x52, + 0xEC, 0x26, 0x2A, 0x36, 0xF1, 0x10, 0x2C, 0x23, 0x4A, 0xFA, 0x96, 0x19, + 0xD8, 0xDE, 0xA3, 0x09, 0xFB, 0xC8, 0x7B, 0xF2, 0xA9, 0xC5, 0xC9, 0xEB, + 0xBF, 0xCF, 0x5E, 0xF7, 0xBF, 0xE3, 0x20, 0xFD, 0xDA, 0xF1, 0x04, 0x02, + 0x01, 0x06, 0x38, 0x16, 0x1E, 0x29, 0x1B, 0x30, 0xBD, 0x39, 0x83, 0x3F, + 0xF6, 0x47, 0x47, 0x47, 0x84, 0x5D, 0x10, 0x4C, 0xAD, 0x56, 0xBB, 0x3E, + 0xCE, 0x43, 0x11, 0x2D, 0x5A, 0x30, 0xCD, 0x20, 0x02, 0x14, 0x1F, 0x0C, + 0x7A, 0xFE, 0xF8, 0xF8, 0xE7, 0x04, 0x02, 0xF7, 0x92, 0x0D, 0x26, 0xF1, + 0x22, 0xF9, 0x4A, 0xE0, 0x65, 0xE5, 0xAB, 0xEC, 0xF0, 0xED, 0x0E, 0x15, + 0x7D, 0x00, 0xAA, 0x2F, 0x45, 0x0B, 0x2E, 0x36, 0x4F, 0x14, 0x4A, 0x3D, + 0x4A, 0x22, 0x17, 0x47, 0x3F, 0x22, 0x09, 0x38, 0xBC, 0xF8, 0x0E, 0x03, + 0x3F, 0xD7, 0x7B, 0xDE, 0x83, 0xDC, 0xE7, 0xD8, 0xF5, 0xDA, 0x92, 0xD2, + 0xA0, 0xD2, 0xF4, 0xCD, 0x5E, 0xEF, 0x28, 0xD8, 0x07, 0x1C, 0x89, 0xF6, + 0x39, 0x28, 0xAC, 0x18, 0x22, 0x30, 0xC4, 0x2C, 0x4B, 0x4C, 0x86, 0x41, + 0xF0, 0x63, 0x66, 0x53, 0xD0, 0x56, 0xD1, 0x4B, 0x1C, 0x25, 0x71, 0x39, + 0x87, 0xF5, 0xFF, 0x29, 0x55, 0xD0, 0x7B, 0x0E, 0x92, 0xB4, 0x65, 0xEC, + 0x74, 0xA3, 0xE9, 0xD7, 0x35, 0xA1, 0x11, 0xCB, 0x03, 0xAE, 0x3D, 0xC6, + 0x3C, 0xBE, 0x49, 0xD5, 0xE5, 0xD2, 0xE4, 0xE3, 0xB8, 0xF2, 0xB3, 0xF3, + 0x3B, 0x15, 0xAE, 0x07, 0x6A, 0x2A, 0xDB, 0x12, 0x12, 0x3C, 0xE6, 0x24, + 0x1D, 0x52, 0xE0, 0x3F, 0x4A, 0x49, 0x30, 0x3F, 0x7D, 0x22, 0x3F, 0x1B, + 0x62, 0xF9, 0x44, 0xFB, 0xB6, 0xD2, 0x62, 0xE5, 0x84, 0xB1, 0x1B, 0xC8, + 0x34, 0xA7, 0xEC, 0xB7, 0xB4, 0xAD, 0xE7, 0xB6, 0x07, 0xA9, 0x9D, 0xB1, + 0xFA, 0xB8, 0xF2, 0xBD, 0xEF, 0xE9, 0x37, 0xE0, 0x9F, 0x0A, 0x73, 0xF1, + 0xE9, 0x04, 0x42, 0xEF, 0x39, 0xF5, 0x62, 0xF4, 0x16, 0xF7, 0x3B, 0x03, + 0x88, 0xF4, 0x17, 0x01, 0x30, 0xCE, 0xC6, 0xD5, 0x6B, 0xA5, 0xC7, 0xB2, + 0x6D, 0x9F, 0x7F, 0xAD, 0xA4, 0xA9, 0xE1, 0xA0, 0x05, 0xA1, 0x23, 0x9C, + 0x9A, 0xA1, 0x49, 0xB4, 0xC8, 0xC5, 0xBF, 0xD2, 0x98, 0xEC, 0xAD, 0xE8, + 0x12, 0x0C, 0x98, 0x00, 0x3C, 0x25, 0x38, 0x19, 0x68, 0x29, 0xF8, 0x2C, + 0x73, 0x13, 0xF4, 0x2F, 0x4E, 0xEB, 0x0D, 0x12, 0xD1, 0xC5, 0xDD, 0xF0, + 0xAD, 0xAF, 0x43, 0xE5, 0x0A, 0xA7, 0xD0, 0xD5, 0xF0, 0xA4, 0x4F, 0xB7, + 0x2A, 0xA4, 0x61, 0xAB, 0x59, 0xAC, 0xD7, 0xBC, 0x23, 0xBE, 0x54, 0xC7, + 0xBE, 0xC8, 0xE0, 0xB9, 0xEF, 0xDF, 0x0F, 0xCB, 0xAD, 0x0A, 0x47, 0xF8, + 0xA2, 0x1F, 0xF2, 0x07, 0x25, 0x23, 0xF3, 0x14, 0x47, 0x35, 0xE4, 0x25, + 0xDD, 0x41, 0x2A, 0x1C, 0x70, 0x30, 0x65, 0x13, 0x4A, 0x17, 0x19, 0x1B, + 0xB8, 0x01, 0x9F, 0x0F, 0xFD, 0xF2, 0x35, 0xEE, 0x82, 0xF1, 0x86, 0xDA, + 0x37, 0xF7, 0x35, 0xDB, 0x94, 0xEE, 0x2B, 0xD3, 0x6E, 0xEF, 0x40, 0xC8, + 0x29, 0x0A, 0x32, 0xD7, 0x27, 0x13, 0x27, 0xFA, 0x2D, 0x11, 0xB8, 0x15, + 0x64, 0x15, 0xCA, 0x1B, 0xBF, 0x23, 0x59, 0x16, 0x86, 0x30, 0xFC, 0x11, + 0x9D, 0x0A, 0x91, 0xFB, 0x05, 0xD9, 0xE0, 0xDA, 0x26, 0xC3, 0xB7, 0xCD, + 0x78, 0xB9, 0x3F, 0xCD, 0x66, 0xBC, 0x6F, 0xCB, 0x30, 0xCB, 0x37, 0xD6, + 0x81, 0xF0, 0x00, 0x03, 0xF6, 0x1D, 0xF3, 0x2F, 0x46, 0x3B, 0x16, 0x43, + 0x22, 0x3F, 0x19, 0x4E, 0x33, 0x30, 0x40, 0x51, 0x23, 0x1E, 0x19, 0x48, + 0x90, 0xFF, 0xE7, 0x2B, 0x24, 0xDF, 0x17, 0x0C, 0x63, 0xCD, 0xBA, 0xF9, + 0xD0, 0xBA, 0xA3, 0xD9, 0x53, 0xA5, 0xDD, 0xB3, 0x82, 0xA8, 0xD3, 0xA9, + 0x7F, 0xC3, 0x2B, 0xB9, 0x0C, 0xD8, 0x95, 0xCC, 0xF5, 0xE2, 0x81, 0xCC, + 0xA0, 0xF7, 0xB7, 0xD9, 0xBA, 0x0F, 0x7E, 0x06, 0xC5, 0x18, 0x2C, 0x22, + 0x87, 0x1C, 0xEC, 0x27, 0xC3, 0x2F, 0xB1, 0x29, 0xC6, 0x36, 0x22, 0x27, + 0xAC, 0x20, 0xCC, 0x24, 0xE4, 0x11, 0xFD, 0x1E, 0xB8, 0x08, 0x73, 0xFD, + 0xED, 0xF6, 0x6B, 0xCE, 0x10, 0xF4, 0x52, 0xC0, 0x0F, 0x08, 0x0B, 0xCC, + 0x8F, 0x0C, 0x82, 0xC6, 0x16, 0x06, 0x91, 0xC6, 0x86, 0x10, 0x5D, 0xDE, + 0xE7, 0x18, 0x33, 0xF6, 0x9F, 0x1B, 0x6C, 0x05, 0xC1, 0x29, 0xE1, 0x06, + 0xB9, 0x2E, 0xD1, 0x09, 0x74, 0x22, 0x3E, 0x17, 0xA2, 0x01, 0xC6, 0x08, + 0xB2, 0xD4, 0x8B, 0xE1, 0x9C, 0xBC, 0x1B, 0xC7, 0xF2, 0xBF, 0xCE, 0xC2, + 0xE9, 0xC5, 0x4B, 0xC3, 0x46, 0xD5, 0x52, 0xCB, 0x95, 0xF9, 0xB2, 0xEC, + 0x43, 0x16, 0xCA, 0x11, 0xD8, 0x28, 0xE2, 0x20, 0x2C, 0x39, 0x0C, 0x27, + 0xFF, 0x36, 0xAE, 0x33, 0xE0, 0x29, 0xC7, 0x3C, 0x5D, 0x0A, 0x9E, 0x2D, + 0xED, 0xE1, 0x9F, 0x04, 0x69, 0xD4, 0x31, 0xE2, 0xC9, 0xC4, 0x49, 0xC8, + 0x80, 0xAA, 0x87, 0xAC, 0x94, 0xA1, 0xC0, 0xA8, 0x9D, 0xAF, 0x27, 0xB7, + 0xED, 0xC4, 0x00, 0xC3, 0x58, 0xDC, 0x53, 0xC3, 0x44, 0xF7, 0x01, 0xD8, + 0xB8, 0x0F, 0xDC, 0x0D, 0x78, 0x24, 0xCB, 0x23, 0x55, 0x2A, 0xD2, 0x1F, + 0xB6, 0x2A, 0xEF, 0x31, 0x21, 0x2A, 0x2A, 0x44, 0xC7, 0x1E, 0xAF, 0x38, + 0xA8, 0x1E, 0x24, 0x15, 0x58, 0x22, 0xC4, 0xF2, 0x24, 0x09, 0xD4, 0xDE, + 0x6C, 0xF2, 0x19, 0xD9, 0x09, 0x00, 0x9D, 0xE1, 0xE6, 0x01, 0x6A, 0xDA, + 0x8F, 0xFF, 0x99, 0xDB, 0x3E, 0x19, 0x8F, 0x02, 0x5F, 0x32, 0xAC, 0x24, + 0xEB, 0x3C, 0x93, 0x2F, 0x74, 0x33, 0xF8, 0x2C, 0xEA, 0x25, 0x72, 0x29, + 0x75, 0x25, 0xF9, 0x2D, 0xA9, 0x10, 0xCC, 0x1C, 0x18, 0xEB, 0xCF, 0xF7, + 0x51, 0xE2, 0x2F, 0xE6, 0xC7, 0xF4, 0x83, 0xE4, 0x36, 0xF8, 0xEF, 0xDB, + 0x0B, 0xFB, 0x2E, 0xE8, 0x0A, 0x1E, 0x08, 0x15, 0xD2, 0x3D, 0xE8, 0x32, + 0x85, 0x4A, 0x20, 0x3D, 0x95, 0x49, 0xF0, 0x4C, 0x86, 0x35, 0xAA, 0x59, + 0x5C, 0x27, 0x7C, 0x4A, 0x6B, 0x13, 0x51, 0x2C, 0x90, 0xF7, 0xC4, 0x13, + 0x87, 0xF4, 0x03, 0xF8, 0x13, 0xE1, 0xC8, 0xD7, 0x1F, 0xB9, 0x33, 0xC5, + 0x71, 0xB0, 0x6F, 0xC1, 0xD2, 0xC5, 0x27, 0xC4, 0x9A, 0xD8, 0x7F, 0xD1, + 0xD2, 0xDD, 0xB3, 0xD8, 0xA1, 0xEC, 0xB1, 0xE1, 0x47, 0x09, 0xCD, 0xFE, + 0x7A, 0x1F, 0x12, 0x15, 0x4A, 0x27, 0xAE, 0x18, 0x62, 0x2F, 0x41, 0x1E, + 0x92, 0x2F, 0x32, 0x20, 0x87, 0x1E, 0x81, 0x15, 0x81, 0x10, 0x56, 0x08, + 0x7E, 0xFD, 0x15, 0xF3, 0x91, 0xDC, 0xFB, 0xD7, 0xF7, 0xCD, 0xB8, 0xCC, + 0xE6, 0xD7, 0x32, 0xDE, 0xFF, 0xD1, 0x93, 0xDD, 0x15, 0xCA, 0xC2, 0xCD, + 0xD1, 0xDD, 0xF9, 0xE3, 0xC8, 0xF6, 0x0E, 0xFF, 0x68, 0x09, 0x44, 0xFF, + 0x66, 0x14, 0x68, 0xFF, 0x04, 0x16, 0x44, 0x09, 0xFF, 0x12, 0xCC, 0x07, + 0x10, 0xF4, 0x96, 0xEC, 0x27, 0xD5, 0xD5, 0xCF, 0xFE, 0xC3, 0xAA, 0xBF, + 0x67, 0xB3, 0x36, 0xB8, 0xE5, 0xB1, 0x73, 0xAE, 0xF8, 0xBF, 0x5B, 0xB6, + 0x56, 0xE3, 0x77, 0xDE, 0x30, 0x05, 0x35, 0xF9, 0x2E, 0x11, 0x44, 0x08, + 0x9B, 0x1F, 0x70, 0x26, 0x37, 0x2F, 0xF2, 0x48, 0xD6, 0x2C, 0x96, 0x52, + 0x1F, 0x12, 0x93, 0x38, 0x67, 0xF7, 0xF7, 0x0A, 0xB7, 0xE7, 0x80, 0xE9, + 0x2C, 0xCA, 0x45, 0xD4, 0x6D, 0xA9, 0x48, 0xB4, 0x78, 0x9E, 0xFE, 0xA0, + 0xD9, 0xAC, 0x60, 0xB0, 0x3F, 0xC8, 0x69, 0xCD, 0xFC, 0xDA, 0xF4, 0xD5, + 0xF9, 0xE7, 0xE6, 0xD7, 0x38, 0x07, 0xA9, 0xF3, 0xD4, 0x15, 0xC9, 0x09, + 0x49, 0x11, 0xCA, 0x0B, 0x46, 0x22, 0x6D, 0x17, 0xE9, 0x27, 0x80, 0x1F, + 0x43, 0x1E, 0xB0, 0x17, 0x97, 0x24, 0xC8, 0x04, 0x76, 0x20, 0x3D, 0xEC, + 0x41, 0xFC, 0x5C, 0xDC, 0xBE, 0xDB, 0x8B, 0xCD, 0x3B, 0xD8, 0x92, 0xCA, + 0x86, 0xD5, 0x79, 0xD4, 0x0E, 0xD7, 0xAC, 0xE1, 0xB3, 0xF3, 0xFA, 0xF4, + 0x23, 0x0A, 0x93, 0x0F, 0x69, 0x01, 0x5B, 0x24, 0x54, 0xF0, 0x9C, 0x25, + 0xDC, 0xF2, 0x8C, 0x23, 0x71, 0x04, 0xA4, 0x22, 0x28, 0xF4, 0xAE, 0x0F, + 0x57, 0xD0, 0x56, 0xF5, 0x14, 0xC2, 0x2C, 0xE6, 0xE2, 0xC1, 0xD6, 0xE5, + 0xE9, 0xC9, 0xC9, 0xE3, 0x75, 0xD7, 0x70, 0xF0, 0xE7, 0xF6, 0xCC, 0x10, + 0x5D, 0x1A, 0xDE, 0x17, 0xB6, 0x2C, 0x0A, 0x1F, 0x3D, 0x3D, 0x2C, 0x3E, + 0x6B, 0x52, 0xFB, 0x59, 0xE8, 0x59, 0x21, 0x59, 0x99, 0x42, 0x69, 0x3B, + 0x1C, 0x18, 0x99, 0x19, 0x86, 0xF8, 0x5F, 0x0E, 0xD9, 0xEE, 0x73, 0x01, + 0x75, 0xE6, 0x68, 0xE0, 0xA2, 0xE3, 0xEE, 0xDB, 0x66, 0xF9, 0x89, 0xF1, + 0x16, 0x11, 0x92, 0xFA, 0x26, 0x1A, 0x2B, 0x09, 0x31, 0x28, 0xE7, 0x1E, + 0x10, 0x46, 0xEC, 0x2A, 0xE1, 0x54, 0xBB, 0x34, 0xCB, 0x54, 0x90, 0x40, + 0x83, 0x5D, 0x14, 0x51, 0x7F, 0x5D, 0x13, 0x60, 0xA8, 0x50, 0x4F, 0x63, + 0xA4, 0x42, 0x24, 0x4F, 0x7F, 0x36, 0x55, 0x34, 0xFA, 0x25, 0x71, 0x27, + 0xA4, 0x13, 0x85, 0x1F, 0xF7, 0x06, 0xD1, 0x12, 0x56, 0x01, 0x36, 0xF9, + 0x18, 0x05, 0x43, 0xF4, 0x99, 0x18, 0x84, 0x08, 0x2A, 0x30, 0xF7, 0x1D, + 0x6C, 0x37, 0xD1, 0x32, 0x57, 0x33, 0xA4, 0x33, 0xEC, 0x2F, 0x27, 0x32, + 0x4B, 0x27, 0xC1, 0x37, 0x5E, 0x03, 0x0C, 0x20, 0x5E, 0xE4, 0x02, 0xFD, + 0xD5, 0xE3, 0xAA, 0xEA, 0x68, 0xE3, 0xD4, 0xEC, 0x6D, 0xD9, 0xE8, 0xEF, + 0xBA, 0xDE, 0xBB, 0xEE, 0x5B, 0x05, 0x09, 0x07, 0x99, 0x2E, 0xB2, 0x26, + 0x1A, 0x43, 0x14, 0x3A, 0x35, 0x50, 0x48, 0x4B, 0xE2, 0x53, 0x7B, 0x4D, + 0x71, 0x42, 0xDE, 0x41, 0xFB, 0x0D, 0xBA, 0x2C, 0xE5, 0xDD, 0xD5, 0x0B, + 0xFC, 0xD9, 0x0E, 0xF8, 0x11, 0xDE, 0xE8, 0xF0, 0xDD, 0xCA, 0xF5, 0xDE, + 0xCE, 0xC5, 0xB7, 0xD3, 0xCE, 0xD6, 0x85, 0xD7, 0xE2, 0xD9, 0x1C, 0xDB, + 0x1B, 0xD8, 0xF3, 0xE4, 0x2E, 0xEB, 0x18, 0xF8, 0x2F, 0x12, 0xEC, 0x11, + 0x57, 0x2F, 0x92, 0x23, 0xBF, 0x32, 0xC1, 0x21, 0x82, 0x2E, 0x91, 0x28, + 0xCA, 0x2E, 0x8E, 0x2A, 0xD7, 0x30, 0x44, 0x1F, 0xC8, 0x33, 0x63, 0x15, + 0x2F, 0x2C, 0x4E, 0x0D, 0x85, 0x17, 0xD9, 0x05, 0x78, 0x03, 0x51, 0xF6, + 0xA4, 0xFB, 0x0E, 0xF0, 0x0F, 0xF8, 0x34, 0xEC, 0xBF, 0xF6, 0xCF, 0x03, + 0x25, 0x04, 0xC2, 0x30, 0xC6, 0x1B, 0x99, 0x3F, 0xAD, 0x2C, 0x58, 0x41, + 0xCE, 0x23, 0xBE, 0x3F, 0x16, 0x0F, 0x6C, 0x3A, 0x99, 0x08, 0x43, 0x38, + 0x29, 0xFC, 0x78, 0x1B, 0xB2, 0xE1, 0xD3, 0xF1, 0x64, 0xD9, 0x7E, 0xEA, + 0xEB, 0xE4, 0xEE, 0xF6, 0x30, 0xEE, 0xDA, 0xF6, 0x91, 0x08, 0x71, 0x04, + 0x28, 0x3C, 0x3A, 0x2B, 0x12, 0x55, 0x38, 0x47, 0xA5, 0x4F, 0x73, 0x51, + 0x1E, 0x51, 0x03, 0x59, 0x99, 0x51, 0x2B, 0x60, 0x8D, 0x42, 0xB4, 0x55, + 0xAC, 0x29, 0x7D, 0x33, 0x2C, 0x12, 0xE4, 0x10, 0x0E, 0x06, 0x1D, 0xFD, + 0x2E, 0xFA, 0xC6, 0xF6, 0x2E, 0xE0, 0x48, 0xED, 0x61, 0xD4, 0x60, 0xE1, + 0xB0, 0xE8, 0xBE, 0xEA, 0xBE, 0x05, 0x23, 0xFA, 0x60, 0x12, 0x4E, 0x08, + 0x44, 0x23, 0x2E, 0x19, 0x6E, 0x34, 0xB2, 0x23, 0x6A, 0x27, 0x3F, 0x2B, + 0x90, 0x20, 0x71, 0x34, 0x75, 0x35, 0x72, 0x3F, 0x15, 0x40, 0x75, 0x37, + 0xC2, 0x36, 0xC1, 0x2A, 0x1A, 0x31, 0x00, 0x1D, 0x69, 0x1E, 0x47, 0x02, + 0x90, 0xF5, 0x5F, 0xF1, 0x1D, 0xE4, 0xB8, 0xEB, 0xBE, 0xE4, 0x30, 0xEC, + 0x08, 0xD8, 0x11, 0xF5, 0xA4, 0xE6, 0xB7, 0x07, 0x84, 0x08, 0x17, 0x1B, + 0xF2, 0x12, 0x7B, 0x22, 0xDB, 0x0F, 0x5D, 0x1D, 0x2E, 0x06, 0x6F, 0x15, + 0xC3, 0x07, 0x5A, 0x16, 0x46, 0x0D, 0x18, 0x11, 0x18, 0xF4, 0x85, 0xEC, + 0xB3, 0xD5, 0xD5, 0xBF, 0x98, 0xD8, 0x27, 0xB3, 0x4B, 0xEC, 0x34, 0xBB, + 0x34, 0xF8, 0x25, 0xBA, 0xB6, 0x07, 0x0C, 0xC8, 0x8B, 0x22, 0x06, 0x05, + 0xBA, 0x2B, 0x1C, 0x38, 0x4B, 0x21, 0xBA, 0x44, 0xE4, 0x1F, 0xC8, 0x50, + 0x64, 0x26, 0x5A, 0x5B, 0x47, 0x14, 0xF6, 0x4A, 0x38, 0xEB, 0xBB, 0x1A, + 0x56, 0xCD, 0x55, 0xF1, 0x8E, 0xBE, 0xE5, 0xDF, 0x0A, 0xAC, 0xA7, 0xCC, + 0x44, 0xA5, 0xBE, 0xB2, 0x70, 0xCA, 0x0F, 0xAC, 0x5F, 0xF4, 0x7C, 0xBA, + 0x07, 0xFE, 0x06, 0xCB, 0x39, 0xF6, 0xA5, 0xCD, 0xDB, 0xF9, 0x99, 0xCE, + 0xA4, 0x01, 0xA0, 0xDB, 0x03, 0xF5, 0x97, 0xE3, 0x89, 0xE9, 0x53, 0xE2, + 0x58, 0xFB, 0xD7, 0xED, 0xA8, 0x06, 0xF8, 0xF7, 0xE4, 0xFC, 0xD9, 0xF8, + 0x3D, 0xED, 0x8D, 0xF9, 0x60, 0xD1, 0xF5, 0xEB, 0xBA, 0xC1, 0xA7, 0xD4, + 0x35, 0xC6, 0xB4, 0xCD, 0x26, 0xC2, 0x13, 0xD2, 0x3E, 0xB5, 0xFD, 0xCD, + 0xDC, 0xB9, 0xF5, 0xCC, 0x8D, 0xCE, 0x60, 0xD6, 0x23, 0xDE, 0x5B, 0xE0, + 0x85, 0xE5, 0x6E, 0xE3, 0x61, 0xE2, 0xF3, 0xE0, 0xE4, 0xDA, 0x21, 0xD9, + 0xAE, 0xD6, 0xC8, 0xCF, 0x5F, 0xBD, 0xBF, 0xC2, 0xD8, 0x9E, 0x0A, 0xB3, + 0xE3, 0xA5, 0x3D, 0xAB, 0xED, 0xB8, 0x22, 0xB2, 0x8E, 0xBC, 0x23, 0xAF, + 0x62, 0xC0, 0xC4, 0xA6, 0x56, 0xCD, 0xC5, 0xC3, 0xAC, 0xE7, 0x1B, 0xF4, + 0xCD, 0x04, 0x47, 0x0B, 0xC0, 0x1A, 0xC2, 0x06, 0x9F, 0x26, 0xF3, 0x06, + 0x6C, 0x17, 0x13, 0x02, 0x82, 0xF6, 0xCC, 0xE3, 0x99, 0xDB, 0xD9, 0xCD, + 0x7C, 0xC1, 0xA7, 0xCB, 0x3D, 0xA8, 0xEC, 0xB9, 0x7F, 0xA3, 0x7D, 0xA1, + 0xE0, 0xAD, 0x6B, 0xA9, 0xFB, 0xBD, 0x16, 0xC6, 0x40, 0xCD, 0x65, 0xCC, + 0xA3, 0xD5, 0x42, 0xC6, 0xB0, 0xE7, 0xCD, 0xD5, 0xC2, 0xFE, 0x0E, 0xF8, + 0x8B, 0x06, 0x8D, 0x0F, 0x14, 0x06, 0xE1, 0x07, 0xCE, 0x12, 0x95, 0x05, + 0x38, 0x1D, 0x55, 0x18, 0x3E, 0x17, 0xF9, 0x26, 0x44, 0x0B, 0x1E, 0x22, + 0x75, 0xFB, 0xB3, 0x0D, 0x2F, 0xEA, 0x87, 0xF6, 0x31, 0xE8, 0x65, 0xE9, + 0xF1, 0xE3, 0xFE, 0xE2, 0x7D, 0xDB, 0x22, 0xD7, 0x86, 0xF6, 0x50, 0xD8, + 0x12, 0x10, 0x55, 0xF0, 0xD3, 0x14, 0x9B, 0x03, 0x63, 0x1D, 0x31, 0x06, + 0x9E, 0x20, 0xA6, 0xFF, 0x3E, 0x1B, 0x85, 0xFC, 0xB0, 0x07, 0x45, 0xF6, + 0xAD, 0xE8, 0x53, 0xE3, 0x79, 0xC3, 0xD5, 0xCD, 0x17, 0xBF, 0xD9, 0xCF, + 0x4E, 0xDD, 0xA9, 0xE0, 0x46, 0xEA, 0x70, 0xE3, 0x51, 0xF3, 0x66, 0xF2, + 0xCB, 0x11, 0x65, 0x1B, 0x06, 0x2A, 0x9A, 0x39, 0x34, 0x26, 0xDD, 0x38, + 0x27, 0x22, 0xE4, 0x30, 0x2B, 0x28, 0xB5, 0x28, 0xC7, 0x13, 0x95, 0x21, + 0x2B, 0xEF, 0x64, 0x14, 0x07, 0xDC, 0xBE, 0xF0, 0x52, 0xCA, 0x36, 0xD6, + 0xD3, 0xBA, 0x86, 0xC9, 0x43, 0xC2, 0xE9, 0xBE, 0x28, 0xD7, 0xD6, 0xD4, + 0x51, 0xED, 0x0F, 0x00, 0xE3, 0xFB, 0xB1, 0x0C, 0x35, 0xFA, 0x46, 0xF9, + 0x23, 0xF9, 0xE6, 0xFB, 0x1A, 0x04, 0x05, 0x0B, 0xCD, 0x10, 0x71, 0x01, + 0x4A, 0x1F, 0x22, 0x00, 0x3A, 0x30, 0x73, 0x14, 0xF5, 0x35, 0x40, 0x17, + 0x2A, 0x31, 0x5A, 0x11, 0x57, 0x16, 0xC9, 0x0E, 0x37, 0xFA, 0x7A, 0xFA, + 0x85, 0xF7, 0x7E, 0xE3, 0x6D, 0x01, 0x10, 0xE7, 0xDE, 0x04, 0x03, 0xF1, + 0x65, 0xFF, 0x39, 0xF1, 0x89, 0x08, 0xC2, 0xFD, 0xA4, 0x1D, 0xF1, 0x0B, + 0x2A, 0x2A, 0xA2, 0x1B, 0xA0, 0x25, 0xD7, 0x2A, 0xAC, 0x0D, 0xCC, 0x26, + 0x1B, 0xF8, 0x06, 0x1D, 0x1A, 0xED, 0x2E, 0xFF, 0x25, 0xD7, 0xAC, 0xD3, + 0x0D, 0xC4, 0xB3, 0xC2, 0x3C, 0xD1, 0x09, 0xCA, 0x8C, 0xF0, 0xB0, 0xCF, + 0xB4, 0xFD, 0xB1, 0xD4, 0x58, 0x01, 0xCD, 0xF8, 0x3D, 0x16, 0x90, 0x27, + 0x68, 0x2D, 0xE2, 0x37, 0x96, 0x39, 0xCD, 0x33, 0xEE, 0x39, 0x82, 0x2D, + 0xDA, 0x29, 0xA3, 0x27, 0x36, 0x0A, 0x17, 0x0F, 0xF5, 0xDE, 0x2A, 0xEC, + 0x04, 0xC5, 0x68, 0xD8, 0x6A, 0xCA, 0x4A, 0xD0, 0x83, 0xCD, 0xA5, 0xCF, + 0xAE, 0xD0, 0xC1, 0xDC, 0xE2, 0xE7, 0x76, 0xEF, 0xA4, 0xFE, 0x6D, 0xFE, + 0x91, 0xFF, 0x48, 0x01, 0x15, 0xEA, 0x2D, 0xF8, 0x1A, 0xEA, 0xD6, 0x04, + 0x51, 0x04, 0xE8, 0x1F, 0xB0, 0x13, 0x21, 0x23, 0x66, 0x1D, 0x9B, 0x20, + 0x8E, 0x19, 0x12, 0x2D, 0x06, 0x15, 0x60, 0x29, 0x7A, 0x27, 0x7F, 0x22, + 0x42, 0x33, 0x1B, 0x27, 0x08, 0x26, 0x10, 0x19, 0xBD, 0x18, 0xD9, 0xFB, + 0xDE, 0x2B, 0x8B, 0x04, 0x38, 0x36, 0x2E, 0x1A, 0x9F, 0x26, 0x17, 0x13, + 0x73, 0x2F, 0xAC, 0x1B, 0x57, 0x4C, 0x7D, 0x2F, 0xF8, 0x50, 0xBA, 0x37, + 0x1E, 0x39, 0x71, 0x3E, 0xF6, 0x24, 0x76, 0x3A, 0x4C, 0x21, 0x53, 0x2C, + 0x7A, 0x1C, 0xA8, 0x18, 0xA3, 0x09, 0x9B, 0xFE, 0xB1, 0xFB, 0x20, 0xEE, + 0xEF, 0xFF, 0xB3, 0xEB, 0x9D, 0x09, 0xDA, 0xE6, 0x5C, 0x11, 0xB3, 0xE7, + 0x3F, 0x28, 0xDB, 0x05, 0x2D, 0x50, 0xA4, 0x31, 0x0B, 0x5F, 0x3F, 0x49, + 0xAE, 0x4C, 0x28, 0x4F, 0xFC, 0x31, 0x9E, 0x4B, 0x24, 0x1C, 0x72, 0x41, + 0x2C, 0x05, 0xD7, 0x36, 0xA5, 0xE9, 0x16, 0x1A, 0x94, 0xDB, 0x6B, 0x07, + 0xF9, 0xE3, 0xCB, 0x0E, 0x88, 0xEB, 0x15, 0x10, 0x20, 0xE3, 0x37, 0x13, + 0x61, 0xEE, 0xD6, 0x17, 0x59, 0x05, 0xC4, 0x0F, 0xD3, 0x07, 0xBA, 0x03, + 0xED, 0x00, 0x00, 0xF9, 0xA2, 0x07, 0x94, 0xF3, 0xD5, 0x09, 0xCD, 0xF1, + 0xC4, 0x02, 0x44, 0xF6, 0xB7, 0x0C, 0xDE, 0x04, 0x64, 0x1A, 0x0C, 0x19, + 0xD6, 0x1D, 0x45, 0x1D, 0xE4, 0x23, 0x90, 0x1B, 0x67, 0x1C, 0x54, 0x17, + 0x02, 0x03, 0xA3, 0xFE, 0x00, 0xEC, 0xBA, 0xEA, 0x07, 0xE7, 0x1B, 0xF9, + 0x1D, 0xE6, 0x2D, 0x08, 0x0C, 0xDF, 0xE5, 0xF3, 0xCD, 0xF4, 0xFE, 0xE7, + 0x6D, 0x17, 0x4D, 0xF2, 0x12, 0x1E, 0x9F, 0xFC, 0x22, 0x12, 0x0D, 0x00, + 0xC8, 0x0B, 0xF6, 0xFE, 0x29, 0x0B, 0x48, 0x02, 0x45, 0xF8, 0x90, 0xF6, + 0x0C, 0xD3, 0x15, 0xDA, 0x33, 0xBD, 0x0B, 0xC4, 0x03, 0xC8, 0x61, 0xB8, + 0xFB, 0xDD, 0x90, 0xC2, 0x00, 0xE5, 0xFC, 0xDB, 0x7A, 0xF7, 0x90, 0xF5, + 0xB8, 0x1A, 0x59, 0x0D, 0xA4, 0x26, 0x65, 0x1A, 0xAE, 0x1B, 0x30, 0x21, + 0xC2, 0x0F, 0x7B, 0x1F, 0x21, 0x0A, 0x0E, 0x19, 0xE7, 0x01, 0x15, 0x07, + 0xF1, 0xEB, 0x5C, 0xEC, 0x49, 0xCC, 0x54, 0xDD, 0x06, 0xBA, 0x3F, 0xDE, + 0xB0, 0xBE, 0x09, 0xE4, 0x6E, 0xD1, 0x64, 0xE8, 0x81, 0xDA, 0xB2, 0xF5, + 0x41, 0xDF, 0x01, 0xF9, 0x9C, 0xE7, 0x37, 0xE8, 0x8C, 0xE1, 0x77, 0xDC, + 0xF1, 0xDE, 0xB7, 0xDB, 0x99, 0xDA, 0x80, 0xDD, 0xB5, 0xDD, 0x88, 0xDF, + 0x1E, 0xF6, 0x10, 0xEC, 0x13, 0x02, 0xAF, 0xF9, 0x88, 0x02, 0x17, 0xFA, + 0xF8, 0x03, 0xAC, 0x01, 0xF5, 0x05, 0x3F, 0xFD, 0x94, 0xF9, 0xB2, 0xE5, + 0x30, 0xE5, 0x65, 0xDE, 0x8C, 0xE2, 0x65, 0xEC, 0xA4, 0xDA, 0x2A, 0xE5, + 0x63, 0xD2, 0x30, 0xCD, 0xB9, 0xE9, 0x9E, 0xD9, 0xC0, 0x0A, 0x0E, 0xF1, + 0x00, 0x12, 0x7E, 0xFA, 0x32, 0x03, 0xD6, 0xFB, 0x91, 0xF9, 0xFD, 0xEF, + 0xC5, 0xF1, 0xCE, 0xE8, 0xB3, 0xD4, 0x6C, 0xDF, 0xD4, 0xBA, 0xE7, 0xC5, + 0x48, 0xBD, 0xE5, 0xB8, 0xB6, 0xD3, 0x97, 0xC5, 0xE5, 0xDF, 0x21, 0xDC, + 0xE2, 0xE4, 0xB9, 0xF7, 0x51, 0x08, 0x0A, 0x12, 0xB9, 0x2E, 0x89, 0x25, + 0xAF, 0x36, 0x0D, 0x34, 0xA6, 0x2C, 0xD7, 0x3D, 0xD8, 0x1E, 0xC0, 0x34, + 0xB6, 0x1B, 0x8C, 0x1E, 0xA4, 0x0B, 0x08, 0x0C, 0x25, 0xEB, 0xD2, 0xFA, + 0x82, 0xE2, 0x2B, 0xF7, 0x04, 0xF5, 0xD4, 0x01, 0xF2, 0xFB, 0x61, 0x11, + 0x2D, 0xF9, 0x37, 0x24, 0x1A, 0x04, 0x3A, 0x25, 0x01, 0x13, 0x3B, 0x22, + 0x2E, 0x15, 0x2E, 0x24, 0xB6, 0x01, 0x1C, 0x1E, 0x70, 0xFD, 0x80, 0x12, + 0xD5, 0x17, 0x22, 0x0E, 0x17, 0x2D, 0x3D, 0x1E, 0x6C, 0x3D, 0x4B, 0x31, + 0x90, 0x4B, 0x90, 0x30, 0xF4, 0x51, 0xB4, 0x2E, 0x89, 0x4D, 0x8F, 0x3C, + 0x4F, 0x39, 0xAB, 0x41, 0xF6, 0x14, 0x78, 0x2C, 0x3E, 0xFE, 0x70, 0x1D, + 0x58, 0x0C, 0xAF, 0x28, 0x52, 0x18, 0x82, 0x20, 0x12, 0x1C, 0xBB, 0x06, + 0xB5, 0x2A, 0x02, 0x11, 0x15, 0x2D, 0xAA, 0x2D, 0x00, 0x1C, 0x0F, 0x28, + 0x15, 0x14, 0x83, 0x1B, 0xAB, 0x1B, 0x37, 0x28, 0x8F, 0x13, 0xB2, 0x26, + 0xAD, 0xFA, 0xCC, 0x0A, 0x4B, 0xEB, 0x37, 0xE7, 0xAC, 0xE1, 0xBA, 0xD2, + 0xB7, 0xDC, 0x21, 0xD9, 0x71, 0xE7, 0x94, 0xF6, 0xFD, 0xFD, 0xA8, 0x14, + 0x87, 0x16, 0x1A, 0x35, 0x6C, 0x2D, 0xE0, 0x57, 0x75, 0x3B, 0xE2, 0x4C, + 0x3F, 0x30, 0xCB, 0x25, 0x08, 0x20, 0xEF, 0x13, 0xFC, 0x13, 0xA5, 0x0E, + 0x8C, 0x01, 0xB4, 0xF6, 0x97, 0xF1, 0x34, 0xD7, 0x13, 0xF2, 0xEF, 0xD7, + 0x91, 0xFB, 0xCF, 0xF5, 0x6B, 0xFA, 0x2D, 0x0A, 0x7D, 0xFB, 0x32, 0x13, + 0x23, 0xF9, 0x33, 0x19, 0xA7, 0xF5, 0x19, 0x19, 0x65, 0xF2, 0xC9, 0x09, + 0xC0, 0xF3, 0xF9, 0xFE, 0x8D, 0x05, 0xFE, 0x0A, 0x47, 0x1E, 0x17, 0x0B, + 0x59, 0x34, 0xFD, 0x09, 0x00, 0x42, 0xA9, 0x20, 0xDD, 0x3A, 0x7F, 0x2D, + 0x93, 0x29, 0xA2, 0x2C, 0x3C, 0x28, 0x5B, 0x2B, 0x9E, 0x24, 0x16, 0x1A, + 0x0E, 0x10, 0x0B, 0xFF, 0x31, 0x06, 0x3A, 0xFE, 0x31, 0x08, 0x52, 0x05, + 0x5D, 0x04, 0x72, 0xFB, 0x87, 0xFF, 0x1C, 0xFD, 0x62, 0x0C, 0x0F, 0x1B, + 0x12, 0x24, 0x8A, 0x36, 0x50, 0x2A, 0xCA, 0x31, 0x77, 0x21, 0x26, 0x2A, + 0x5B, 0x1C, 0xA4, 0x25, 0x74, 0x16, 0x7B, 0x11, 0x5F, 0x01, 0xF8, 0xF4, + 0x81, 0xE9, 0x8A, 0xD9, 0xA1, 0xE4, 0xAE, 0xC9, 0x7E, 0xF2, 0xF8, 0xCB, + 0xFA, 0xFB, 0x1E, 0xF2, 0x89, 0x06, 0xFE, 0x19, 0x01, 0x1F, 0xCB, 0x30, + 0x5F, 0x35, 0x44, 0x49, 0x2D, 0x3E, 0xFE, 0x52, 0xAD, 0x2F, 0x33, 0x50, + 0x5D, 0x1D, 0xF8, 0x44, 0xF3, 0x0F, 0xF8, 0x36, 0xDE, 0xFC, 0x79, 0x16, + 0xD0, 0xE3, 0x6A, 0xFB, 0xF7, 0xDC, 0xC3, 0xFD, 0x27, 0xFB, 0xC6, 0xFB, + 0xED, 0x09, 0xEF, 0xF9, 0x64, 0x01, 0xBF, 0x06, 0x23, 0xFF, 0xB3, 0x0E, + 0xC6, 0x03, 0xCC, 0x04, 0x40, 0x01, 0x19, 0xFB, 0x26, 0xFF, 0xA9, 0xF7, + 0xC8, 0x0D, 0x79, 0xFC, 0x1D, 0x1E, 0xC3, 0x08, 0x36, 0x24, 0x1E, 0x0E, + 0xB3, 0x2D, 0x5C, 0x10, 0x2C, 0x32, 0xD2, 0x07, 0x53, 0x2B, 0xFC, 0x01, + 0x4F, 0x20, 0x80, 0x00, 0x27, 0x0B, 0x71, 0xF1, 0xA4, 0xF2, 0xF0, 0xD7, + 0xC8, 0xEE, 0x4A, 0xE1, 0x24, 0x01, 0x86, 0x05, 0xC6, 0x06, 0x63, 0x0B, + 0x9D, 0x08, 0xF0, 0x06, 0xCB, 0x1C, 0x18, 0x0D, 0x43, 0x1D, 0x90, 0x1F, + 0x10, 0x08, 0x97, 0x23, 0x63, 0x07, 0xAF, 0x13, 0xCC, 0x0C, 0x16, 0x01, + 0x96, 0xFE, 0xA2, 0xE7, 0xF8, 0xE7, 0x64, 0xCF, 0x4A, 0xD6, 0x8A, 0xB6, + 0x7D, 0xD2, 0x8F, 0xB1, 0x2D, 0xE0, 0x32, 0xC7, 0x63, 0xF7, 0x71, 0xE5, + 0x53, 0x04, 0x0B, 0x06, 0x92, 0x0B, 0x76, 0x21, 0xA8, 0x0E, 0xCB, 0x32, + 0x30, 0x09, 0xC4, 0x3E, 0xED, 0x00, 0x35, 0x37, 0x93, 0xEF, 0x1F, 0x1E, + 0x1F, 0xDF, 0x34, 0x01, 0x9E, 0xD5, 0xB8, 0xDF, 0x5A, 0xD1, 0x25, 0xCC, + 0x7E, 0xDE, 0xE3, 0xDC, 0x4D, 0xEF, 0x66, 0xEC, 0xF0, 0xF9, 0xE5, 0xDA, + 0x70, 0xFA, 0x65, 0xD8, 0x06, 0xF0, 0xDE, 0xE0, 0x6C, 0xE6, 0xD3, 0xD9, + 0xD5, 0xD9, 0xF9, 0xC8, 0x06, 0xD0, 0xC3, 0xC3, 0x3E, 0xD9, 0xB8, 0xD2, + 0xD0, 0xE7, 0xBF, 0xE9, 0x49, 0xE6, 0xEE, 0xFC, 0xE9, 0xE4, 0xB2, 0xFC, + 0x9E, 0xDE, 0x13, 0xF3, 0xCB, 0xE1, 0x0F, 0xEE, 0x6E, 0xE2, 0xAD, 0xE1, + 0x9E, 0xD9, 0x69, 0xCC, 0x33, 0xD1, 0xFA, 0xBF, 0x31, 0xCD, 0xED, 0xC5, + 0x9F, 0xDB, 0x47, 0xC2, 0x56, 0xE0, 0xB1, 0xB3, 0xB3, 0xDE, 0xFA, 0xC0, + 0x78, 0xE1, 0x70, 0xDD, 0xD1, 0xE3, 0xCF, 0xDF, 0x9C, 0xDB, 0xD6, 0xD3, + 0x31, 0xD1, 0xBC, 0xCF, 0xEE, 0xD9, 0x6A, 0xC9, 0x78, 0xCA, 0x35, 0xB4, + 0x72, 0xA9, 0x18, 0xA8, 0x4D, 0xA1, 0xBB, 0xA6, 0xC1, 0xA7, 0x54, 0x9F, + 0x61, 0xBC, 0x40, 0xAE, 0x98, 0xE2, 0x8F, 0xD6, 0x83, 0x06, 0x87, 0xF5, + 0x86, 0x1B, 0x0B, 0x0C, 0x43, 0x20, 0x0E, 0x25, 0xB9, 0x0F, 0x50, 0x2B, + 0x04, 0xF0, 0x5F, 0x10, 0xBE, 0xCF, 0xD7, 0xED, 0xD9, 0xBD, 0x0B, 0xD7, + 0x60, 0xB3, 0x12, 0xCF, 0x1A, 0xB2, 0xC7, 0xD8, 0xFD, 0xCD, 0x96, 0xDD, + 0x61, 0xE8, 0x1C, 0xD7, 0xE5, 0xED, 0x60, 0xE3, 0x48, 0xE5, 0x7E, 0xF3, + 0x72, 0xD8, 0xAD, 0xEE, 0xF6, 0xE1, 0x26, 0xEB, 0xA0, 0xF1, 0x3E, 0xDE, + 0x96, 0xF1, 0xFA, 0xDE, 0x6C, 0xEF, 0xC6, 0xF0, 0x8B, 0xFA, 0x08, 0xEA, + 0x7E, 0x08, 0xA0, 0xE9, 0x85, 0x12, 0x99, 0xFF, 0xF1, 0x0E, 0x70, 0x07, + 0x19, 0x0A, 0x84, 0x00, 0x71, 0x0F, 0xC0, 0x00, 0x3E, 0x14, 0xF3, 0x00, + 0xE1, 0x0E, 0x00, 0xFA, 0x4B, 0x12, 0x82, 0xFD, 0x25, 0x21, 0xA1, 0x07, + 0xB4, 0x12, 0xA8, 0x02, 0x3A, 0x03, 0x93, 0xF8, 0x51, 0x0C, 0x02, 0x02, + 0x4E, 0x14, 0xA8, 0x16, 0xAC, 0x15, 0x9C, 0x18, 0xEE, 0x0F, 0xDF, 0x07, + 0x36, 0x00, 0x6C, 0xFE, 0xF4, 0xEC, 0x97, 0x00, 0xD3, 0xD8, 0xB3, 0xF6, + 0x84, 0xD0, 0xA2, 0xE3, 0xB4, 0xDA, 0x3E, 0xE1, 0x9C, 0xED, 0x43, 0xF6, + 0xBE, 0x0E, 0x36, 0x15, 0xDC, 0x2C, 0x90, 0x2D, 0x3A, 0x35, 0xAB, 0x3C, + 0x91, 0x22, 0xA1, 0x3E, 0x57, 0x11, 0xCA, 0x3A, 0xEE, 0x0A, 0xCB, 0x28, + 0xC4, 0xFB, 0x90, 0x06, 0x9B, 0xEF, 0x91, 0xEF, 0xA0, 0xED, 0x0A, 0xF0, + 0x21, 0xED, 0x25, 0xF5, 0x7B, 0xFB, 0x07, 0x05, 0x35, 0x0B, 0xBC, 0x0C, + 0x1C, 0x09, 0xA1, 0x09, 0x1B, 0x0C, 0x67, 0x11, 0x63, 0x13, 0xBC, 0x0C, + 0x16, 0x0F, 0xCE, 0x02, 0xB4, 0xFD, 0x44, 0xF6, 0x66, 0xF3, 0x33, 0xEE, + 0xD1, 0x01, 0x92, 0xFC, 0x8D, 0x10, 0xAA, 0x16, 0x5F, 0x12, 0xE1, 0x22, + 0x23, 0x12, 0x3B, 0x1A, 0xD3, 0x12, 0x59, 0x11, 0xCC, 0x1C, 0x08, 0x11, + 0xC0, 0x1F, 0x53, 0x02, 0x4D, 0x11, 0x00, 0xF1, 0x74, 0x05, 0x2B, 0xE9, + 0x55, 0x0F, 0x3B, 0xE7, 0x71, 0x20, 0xF9, 0xF1, 0x6E, 0x21, 0x45, 0xF9, + 0x59, 0x19, 0x24, 0xFB, 0x0A, 0x0F, 0x60, 0xFE, 0x16, 0x01, 0xF5, 0xFF, + 0x17, 0xF9, 0xEA, 0x01, 0x2A, 0xFE, 0xD0, 0x06, 0xD1, 0xFF, 0x93, 0x0B, + 0x4A, 0xF2, 0x07, 0xFC, 0x6B, 0xE5, 0x5B, 0xE1, 0x62, 0xDC, 0x1C, 0xD2, + 0x6F, 0xDB, 0x0D, 0xD3, 0xE5, 0xE8, 0xEB, 0xF0, 0xBB, 0xF7, 0x72, 0x13, + 0x91, 0x0E, 0x8F, 0x1C, 0xBB, 0x26, 0xFC, 0x22, 0xF9, 0x27, 0x89, 0x2D, + 0x36, 0x1B, 0x05, 0x29, 0x24, 0xFF, 0x45, 0x19, 0xAD, 0xE2, 0xB2, 0x06, + 0x22, 0xDB, 0xA0, 0xF9, 0xD0, 0xDB, 0x66, 0x05, 0x2A, 0xDE, 0x70, 0x0E, + 0x5B, 0xE5, 0x30, 0x0B, 0x82, 0xEF, 0x26, 0x0A, 0x60, 0xFA, 0x51, 0x07, + 0x85, 0x08, 0xB8, 0x00, 0xDE, 0x06, 0xFA, 0xEF, 0xA5, 0xF6, 0x5C, 0xE1, + 0x79, 0xF0, 0x76, 0xDB, 0x53, 0xF5, 0xAA, 0xE1, 0x21, 0x0C, 0xA3, 0xF4, + 0x94, 0x2C, 0xAD, 0x09, 0x92, 0x41, 0x40, 0x1F, 0x6F, 0x47, 0xE2, 0x21, + 0x3E, 0x3F, 0xF6, 0x13, 0xDF, 0x33, 0x9A, 0x18, 0x10, 0x24, 0x37, 0x23, + 0x06, 0x1C, 0xB0, 0x1F, 0x89, 0x27, 0xEF, 0x14, 0xE7, 0x35, 0x61, 0x19, + 0xAB, 0x34, 0xFB, 0x27, 0xA4, 0x26, 0x06, 0x28, 0xB6, 0x1B, 0x8B, 0x24, + 0x10, 0x14, 0x27, 0x2E, 0xEF, 0x19, 0x70, 0x40, 0x22, 0x2F, 0xE6, 0x47, + 0x01, 0x39, 0x57, 0x3A, 0x99, 0x2D, 0x7D, 0x26, 0x7E, 0x1D, 0xE8, 0x1D, + 0xAB, 0x13, 0xED, 0x0A, 0x4E, 0x09, 0x89, 0xF6, 0xC6, 0x03, 0x07, 0x00, + 0x11, 0x10, 0xE4, 0x08, 0x24, 0x25, 0xF0, 0x13, 0x22, 0x33, 0xE0, 0x32, + 0x86, 0x36, 0x3B, 0x4A, 0xA2, 0x2C, 0x4A, 0x4E, 0xD6, 0x1E, 0x8A, 0x43, + 0x71, 0x08, 0xAB, 0x2F, 0x7A, 0xF3, 0xE9, 0x1C, 0xF6, 0xEE, 0x7D, 0x15, + 0xAF, 0xF1, 0xEF, 0x17, 0x74, 0xFB, 0xBB, 0x1A, 0xE5, 0x0B, 0x49, 0x1E, + 0xE0, 0x0D, 0xD6, 0x10, 0x72, 0x0F, 0xA4, 0xF9, 0xC2, 0x10, 0x48, 0xE2, + 0xB3, 0xFE, 0x77, 0xD5, 0xF1, 0xF3, 0x1B, 0xE0, 0xDB, 0xFC, 0x99, 0xEE, + 0x36, 0x10, 0xA9, 0xFA, 0xF2, 0x1C, 0xC3, 0x0D, 0xB0, 0x14, 0x56, 0x17, + 0x77, 0x0C, 0xE1, 0x0B, 0xC1, 0x07, 0xD2, 0x03, 0x47, 0x03, 0xA9, 0x0B, + 0x81, 0x08, 0x00, 0x13, 0x8F, 0x10, 0x4D, 0x0B, 0x17, 0x13, 0xCA, 0xFD, + 0x09, 0x0C, 0x3C, 0xF9, 0x92, 0x0A, 0xE0, 0x05, 0x0D, 0x0E, 0x96, 0x10, + 0xB9, 0x05, 0x7A, 0x0C, 0x16, 0x03, 0x1A, 0x05, 0x8F, 0x0F, 0x95, 0x01, + 0xE9, 0x0E, 0x6C, 0x04, 0xBE, 0x07, 0xF9, 0x0B, 0xCA, 0x08, 0x6E, 0x06, + 0x92, 0xFE, 0x05, 0xEF, 0xA3, 0xF8, 0x13, 0xE5, 0x35, 0xF6, 0x01, 0xE1, + 0x1E, 0xDC, 0x2D, 0xCB, 0xEA, 0xCB, 0x65, 0xC8, 0xC3, 0xE5, 0x4B, 0xE3, + 0x9F, 0xFB, 0x7D, 0x02, 0x29, 0x02, 0x4D, 0x26, 0x4B, 0x14, 0xAB, 0x37, + 0x9D, 0x0F, 0x36, 0x2D, 0xA2, 0xEF, 0xD1, 0x1F, 0x05, 0xDA, 0x3C, 0x0E, + 0x68, 0xD3, 0xAA, 0xF4, 0x73, 0xD6, 0x7B, 0xED, 0x19, 0xE5, 0xD6, 0xF5, + 0xD9, 0xF3, 0x68, 0xE9, 0xD9, 0xF4, 0x22, 0xD7, 0x86, 0xE9, 0x89, 0xD5, + 0xF5, 0xDB, 0x31, 0xDD, 0xCF, 0xD1, 0x6C, 0xDB, 0xB5, 0xD7, 0x47, 0xD1, + 0x13, 0xDE, 0xBB, 0xC3, 0x66, 0xD1, 0xCD, 0xB9, 0x6B, 0xCB, 0x09, 0xC0, + 0x38, 0xDA, 0x2B, 0xD5, 0xD8, 0xE7, 0x8E, 0xE4, 0x42, 0xF9, 0x16, 0xE8, + 0x48, 0x01, 0x95, 0xE9, 0xF1, 0xF3, 0xE5, 0xE6, 0x6F, 0xF3, 0x08, 0xDA, + 0xDF, 0xEB, 0xE7, 0xD3, 0x30, 0xD9, 0xFA, 0xDC, 0xA7, 0xDE, 0x57, 0xEA, + 0x2B, 0xE8, 0x89, 0xF0, 0x52, 0xE2, 0x7C, 0xEC, 0x33, 0xD5, 0x55, 0xE7, + 0xDD, 0xCA, 0x09, 0xE6, 0x7C, 0xC8, 0xDB, 0xEE, 0x30, 0xD4, 0x90, 0xF5, + 0xB7, 0xE9, 0x8C, 0xF4, 0xB3, 0xF4, 0x17, 0xF8, 0x57, 0xF4, 0xA1, 0xF7, + 0x73, 0xEA, 0x5A, 0xED, 0xFE, 0xD6, 0xB2, 0xE4, 0x3F, 0xC9, 0xDD, 0xE3, + 0x0F, 0xCC, 0x87, 0xE7, 0xFF, 0xEA, 0x39, 0xF6, 0xF4, 0x18, 0xA4, 0x09, + 0x6A, 0x2C, 0xBB, 0x1A, 0x09, 0x25, 0x0E, 0x2E, 0x82, 0x23, 0xF3, 0x29, + 0x36, 0x25, 0xD5, 0x12, 0x4C, 0x17, 0x3C, 0x07, 0x19, 0x0B, 0x17, 0x04, + 0x01, 0x10, 0xC4, 0x06, 0x90, 0x11, 0xBE, 0x0C, 0x7D, 0x0B, 0x34, 0x11, + 0x29, 0x09, 0x32, 0x0D, 0x81, 0x06, 0x21, 0x0E, 0xC8, 0x0A, 0x82, 0x1A, + 0x79, 0x14, 0x07, 0x12, 0x88, 0x14, 0x2F, 0xFE, 0xEF, 0x08, 0x62, 0xF8, + 0xE9, 0x0C, 0xDD, 0xFE, 0x1B, 0x1E, 0x27, 0x1C, 0xF8, 0x2B, 0xAF, 0x3B, + 0x65, 0x3C, 0xD9, 0x3A, 0xF2, 0x39, 0xBD, 0x37, 0x59, 0x1E, 0xB6, 0x39, + 0x95, 0x0C, 0x97, 0x2B, 0x18, 0x09, 0xB0, 0x17, 0xE9, 0x09, 0x2C, 0x14, + 0x3F, 0x10, 0x07, 0x1A, 0xA8, 0x1D, 0x3C, 0x1E, 0xD7, 0x27, 0x90, 0x1F, + 0x4C, 0x18, 0xEC, 0x1F, 0xE1, 0xF6, 0xAD, 0x22, 0x7E, 0xED, 0xEB, 0x15, + 0x7E, 0x02, 0xFD, 0x0D, 0x45, 0x11, 0x55, 0x14, 0x69, 0x19, 0xB4, 0x1B, + 0xD9, 0x20, 0xC0, 0x1F, 0x97, 0x12, 0xB4, 0x17, 0x37, 0xFF, 0x00, 0x11, + 0xFF, 0xED, 0xA3, 0x00, 0x44, 0xCF, 0x38, 0xED, 0x34, 0xD4, 0x8B, 0xED, + 0xA3, 0xFA, 0x57, 0xE8, 0x7B, 0x0B, 0x73, 0xEB, 0x3A, 0x11, 0x76, 0x01, + 0x5C, 0x11, 0x37, 0x02, 0x97, 0x10, 0x50, 0xF1, 0x96, 0x14, 0x0D, 0xF1, + 0x99, 0x09, 0x2B, 0xFD, 0x60, 0xFB, 0x64, 0x03, 0x5D, 0x01, 0x90, 0x11, + 0x73, 0x0A, 0xC9, 0x17, 0x87, 0x0C, 0x8E, 0x04, 0x41, 0x08, 0x9A, 0xFA, + 0x76, 0x04, 0x6E, 0xFD, 0xD0, 0x04, 0x9C, 0xF2, 0xDC, 0x01, 0x5C, 0xE3, + 0x73, 0x06, 0x27, 0xDE, 0x74, 0xF8, 0xFE, 0xE1, 0x0A, 0xF0, 0x48, 0xF6, + 0x6D, 0x07, 0x75, 0x06, 0x72, 0x0F, 0xF5, 0x05, 0x56, 0x10, 0x9A, 0x10, + 0x22, 0x13, 0x1B, 0x17, 0xF3, 0x02, 0x76, 0x0F, 0x42, 0xFE, 0x04, 0x0C, + 0x40, 0x19, 0xD7, 0x02, 0xED, 0x22, 0x7F, 0x00, 0x0E, 0x18, 0x05, 0x08, + 0xD7, 0x13, 0xE0, 0x05, 0x91, 0x0A, 0xB7, 0xFD, 0xA6, 0xFA, 0xCE, 0x0B, + 0xF5, 0xE9, 0xFE, 0x19, 0xE3, 0xE7, 0x4B, 0x07, 0x59, 0xF4, 0xA7, 0x07, + 0x02, 0xFB, 0xAE, 0x20, 0x2B, 0xFA, 0xF9, 0x23, 0x40, 0xFF, 0xFA, 0x1D, + 0xEC, 0xFC, 0x11, 0x14, 0xD1, 0xED, 0xA1, 0xFF, 0x76, 0xE6, 0x4D, 0xEC, + 0x38, 0xEE, 0x06, 0xE8, 0x18, 0xFA, 0x48, 0xEF, 0xC3, 0x07, 0x1A, 0xFA, + 0x17, 0x1E, 0x89, 0x04, 0xB8, 0x24, 0x1A, 0x07, 0xA6, 0x10, 0x92, 0x04, + 0x9D, 0x09, 0xFC, 0x06, 0x6B, 0x0F, 0x35, 0x19, 0xF5, 0x05, 0x48, 0x23, + 0x6A, 0x00, 0x9E, 0x1F, 0x85, 0xFF, 0x9B, 0x26, 0xB1, 0xF9, 0xD3, 0x29, + 0x2A, 0x05, 0x5E, 0x11, 0x30, 0x14, 0x24, 0xFC, 0x11, 0x1E, 0x23, 0x00, + 0x47, 0x23, 0x21, 0xF9, 0x1C, 0x19, 0x02, 0xDF, 0x21, 0x1A, 0x66, 0xE6, + 0x79, 0x16, 0x0C, 0xF6, 0xC8, 0x0C, 0x53, 0xF2, 0xF9, 0x10, 0xD0, 0x03, + 0x35, 0x16, 0x4F, 0x17, 0xDE, 0x14, 0xBE, 0x1B, 0x4D, 0x08, 0x62, 0x15, + 0x12, 0x09, 0x03, 0x17, 0xEC, 0x08, 0x71, 0x1A, 0x7B, 0xFC, 0x21, 0x0D, + 0x3E, 0x04, 0xAB, 0x01, 0xF9, 0x1C, 0x81, 0x06, 0x01, 0x25, 0x12, 0x14, + 0xA2, 0x16, 0x63, 0x17, 0x4E, 0x08, 0xCE, 0x0D, 0x27, 0xFC, 0x20, 0xFB, + 0xC5, 0xF7, 0x13, 0xF1, 0x91, 0xF8, 0x58, 0xFA, 0x5C, 0xF7, 0xBD, 0x06, + 0x74, 0xF8, 0xFE, 0xFF, 0xEF, 0xFF, 0x1A, 0x02, 0x3B, 0x03, 0x8B, 0x0E, + 0x15, 0xF6, 0xA4, 0xFC, 0x7E, 0xE8, 0xC1, 0xE3, 0xC4, 0xEC, 0x93, 0xDD, + 0xCB, 0xFA, 0x36, 0xDE, 0x62, 0xF7, 0x2D, 0xDE, 0xF7, 0xF8, 0x12, 0xE5, + 0x24, 0x00, 0x20, 0xF4, 0xA5, 0xEA, 0x32, 0xF9, 0x1F, 0xE7, 0x11, 0xF7, + 0x7E, 0xF4, 0xCA, 0xF6, 0x6D, 0xDF, 0xB4, 0xF6, 0x9A, 0xD0, 0x91, 0xF3, + 0x02, 0xDA, 0xCE, 0xF7, 0xC0, 0xE8, 0xE2, 0x02, 0xD8, 0xF2, 0xAA, 0x01, + 0x50, 0xFA, 0x2B, 0x04, 0xAE, 0x02, 0xAC, 0xFE, 0xEB, 0x00, 0x56, 0xED, + 0x69, 0xEB, 0x7B, 0xD7, 0x8C, 0xD0, 0xD5, 0xC1, 0x9C, 0xCB, 0x63, 0xC0, + 0x63, 0xD5, 0xEF, 0xC3, 0x36, 0xE4, 0x41, 0xB6, 0x15, 0xF8, 0xFB, 0xBF, + 0xCE, 0xF3, 0x2B, 0xE7, 0x08, 0xD5, 0xA8, 0xE9, 0x16, 0xCE, 0x5D, 0xDA, + 0xE9, 0xD7, 0xA8, 0xDE, 0x8A, 0xDF, 0xD7, 0xE6, 0x54, 0xEC, 0xD1, 0xF0, + 0xBD, 0xEA, 0x06, 0xF6, 0x0A, 0xDA, 0x3F, 0xDF, 0x05, 0xDD, 0xFE, 0xD2, + 0x42, 0xE8, 0x34, 0xCF, 0x2F, 0xDB, 0xF9, 0xB8, 0x22, 0xDB, 0x8C, 0xBF, + 0x6F, 0xE6, 0x4E, 0xCC, 0x24, 0xE2, 0x4A, 0xCF, 0x80, 0xE0, 0x34, 0xDF, + 0xA7, 0xD9, 0x77, 0xE8, 0x6F, 0xCF, 0x02, 0xE4, 0x3D, 0xD2, 0xEE, 0xD8, + 0xEB, 0xD6, 0x5F, 0xDD, 0x13, 0xD6, 0x5C, 0xED, 0x23, 0xD2, 0x5F, 0xEE, + 0x4D, 0xCB, 0x32, 0xDC, 0x64, 0xD6, 0xAF, 0xD8, 0xF2, 0xED, 0x6E, 0xDF, + 0x8C, 0xE9, 0x92, 0xD4, 0x43, 0xE0, 0x7E, 0xC7, 0xC1, 0xE3, 0xF5, 0xCB, + 0x77, 0xDE, 0x51, 0xDB, 0x8E, 0xD8, 0x0A, 0xDB, 0xC2, 0xD9, 0x35, 0xD8, + 0xDE, 0xEA, 0x5D, 0xDF, 0xF7, 0xF7, 0x33, 0xE3, 0x31, 0xF7, 0xA3, 0xFB, + 0x49, 0xE9, 0xD5, 0x0B, 0xC1, 0xD5, 0x76, 0xF6, 0xC0, 0xD2, 0xBE, 0xED, + 0x92, 0xE7, 0xA4, 0xF7, 0xB1, 0xFF, 0x7B, 0xF0, 0x5A, 0xF9, 0x37, 0xEB, + 0xD0, 0xF0, 0x4F, 0xFD, 0xA6, 0xF1, 0xE7, 0x03, 0x27, 0xF3, 0x84, 0x01, + 0xA2, 0xF7, 0x80, 0x05, 0x60, 0xFE, 0x13, 0x01, 0xC5, 0x05, 0xE8, 0xFF, + 0xCE, 0x06, 0x96, 0x01, 0xE9, 0xFC, 0xA0, 0xEF, 0xEF, 0xFA, 0x93, 0xEC, + 0xD7, 0xF6, 0x19, 0xF1, 0xD4, 0xF0, 0xF5, 0xF1, 0xFE, 0xF8, 0x84, 0x01, + 0x86, 0xF8, 0xA0, 0x07, 0xFC, 0xFD, 0x3D, 0x02, 0x03, 0x10, 0xAB, 0xFE, + 0x46, 0x11, 0xF1, 0xF9, 0x0A, 0x0D, 0x2B, 0xEE, 0xDE, 0x15, 0xCD, 0xF7, + 0xA9, 0x20, 0x07, 0x08, 0x49, 0x1A, 0x29, 0x07, 0x2E, 0x0E, 0x67, 0x0C, + 0xD9, 0x15, 0x8D, 0x16, 0x33, 0x1C, 0xE2, 0x16, 0x2F, 0x16, 0x7A, 0x13, + 0x5A, 0x0B, 0x83, 0x16, 0x50, 0x00, 0xDD, 0x19, 0xB5, 0x02, 0xD5, 0x0C, + 0x86, 0x0F, 0xC3, 0xFA, 0xC0, 0x19, 0x24, 0x05, 0x15, 0x0D, 0x2F, 0x12, + 0xCC, 0x03, 0xAF, 0x11, 0x0D, 0x11, 0x72, 0x0E, 0x5C, 0x12, 0x2C, 0x16, + 0xB3, 0xF3, 0x24, 0x21, 0xBA, 0xF2, 0xC8, 0x2A, 0x40, 0x06, 0x25, 0x2C, + 0x1B, 0x09, 0xB3, 0x1F, 0xC7, 0x0C, 0x7D, 0x16, 0xCE, 0x02, 0x87, 0x0D, + 0x2F, 0x04, 0xEE, 0x06, 0x88, 0x14, 0x46, 0xFC, 0xCD, 0x0F, 0xB1, 0xF4, + 0x0D, 0xFE, 0x86, 0xF4, 0x6E, 0x01, 0xC9, 0xF4, 0xD4, 0x11, 0x21, 0xFD, + 0xD6, 0x1A, 0xF4, 0x06, 0x84, 0x17, 0xB9, 0xFE, 0x44, 0x16, 0x30, 0xF9, + 0xC5, 0x11, 0xE3, 0xF7, 0x5C, 0x0B, 0x5C, 0xF7, 0xEE, 0x01, 0x35, 0xFF, + 0x90, 0xEC, 0x3E, 0x06, 0x6B, 0xEB, 0x82, 0x01, 0x35, 0xF5, 0x0C, 0xF8, + 0xBD, 0x00, 0x56, 0x01, 0xAF, 0xFC, 0x51, 0xF8, 0x78, 0xF7, 0xE2, 0xF5, + 0xEB, 0x00, 0xE6, 0x05, 0x75, 0x06, 0x9E, 0x0A, 0xB2, 0x09, 0x2D, 0x13, + 0x37, 0x03, 0x23, 0x13, 0x91, 0xFA, 0xC2, 0x0F, 0x4F, 0xF7, 0x36, 0x10, + 0x6C, 0xF2, 0x1D, 0x01, 0x79, 0xF8, 0xC6, 0xF8, 0x66, 0xFC, 0xD6, 0xF8, + 0xAB, 0xF7, 0xE8, 0xE8, 0xF0, 0x00, 0x40, 0xE3, 0x45, 0x00, 0x70, 0xE5, + 0x64, 0xF8, 0x7F, 0xEC, 0xE9, 0xF8, 0x55, 0xF8, 0xB9, 0xFD, 0x03, 0x03, + 0x95, 0xFF, 0x86, 0x0B, 0xBF, 0xFF, 0x89, 0x18, 0xFA, 0x07, 0x1D, 0x2F, + 0x08, 0x0C, 0xB4, 0x2B, 0xEE, 0x1C, 0x15, 0x1E, 0x63, 0x26, 0xA7, 0x1E, + 0x6B, 0x14, 0x53, 0x1C, 0x34, 0x19, 0x5D, 0x0B, 0x42, 0x27, 0xAD, 0xFF, + 0x7B, 0x10, 0xA0, 0x03, 0x7D, 0xFD, 0xB4, 0x05, 0xDD, 0x18, 0x09, 0x12, + 0x88, 0x2F, 0xD5, 0x26, 0xC8, 0x25, 0xC6, 0x30, 0x2F, 0x1B, 0x0F, 0x2B, + 0x49, 0x16, 0x30, 0x2D, 0xBE, 0x0D, 0xFC, 0x33, 0x0D, 0x11, 0xE0, 0x2A, + 0x98, 0x14, 0x6C, 0x29, 0x5A, 0x10, 0x6D, 0x2E, 0x75, 0x26, 0xF2, 0x20, + 0xB7, 0x3C, 0x44, 0x0D, 0x4A, 0x36, 0xD9, 0x10, 0x81, 0x25, 0x9F, 0x14, + 0x2A, 0x21, 0x87, 0x14, 0x96, 0x36, 0xB1, 0x1E, 0xF2, 0x4E, 0x37, 0x28, + 0x21, 0x45, 0xCD, 0x24, 0xE3, 0x33, 0xB0, 0x1D, 0x14, 0x2F, 0x28, 0x1F, + 0x43, 0x2D, 0xF3, 0x1F, 0xF7, 0x26, 0x77, 0x1A, 0x01, 0x19, 0x9F, 0x1A, + 0x2D, 0x13, 0x83, 0x23, 0xE9, 0x10, 0x6C, 0x23, 0xAF, 0x0C, 0x68, 0x1F, + 0xD2, 0x0C, 0xEB, 0x23, 0x30, 0x0E, 0x43, 0x2F, 0x41, 0x00, 0xB7, 0x29, + 0xF2, 0xF7, 0x7B, 0x22, 0x5E, 0x02, 0x74, 0x2E, 0x9B, 0x0A, 0xFF, 0x2A, + 0x7F, 0x04, 0xF4, 0x20, 0x90, 0x01, 0x38, 0x21, 0xC8, 0x0F, 0x79, 0x17, + 0x39, 0x14, 0x23, 0x0E, 0xB2, 0x0F, 0x47, 0x14, 0xAA, 0x10, 0xE3, 0x15, + 0xEB, 0x14, 0x90, 0x07, 0x10, 0x17, 0x0E, 0xF1, 0x79, 0x13, 0x75, 0xF1, + 0x49, 0x05, 0x23, 0x02, 0x15, 0x00, 0x65, 0xFA, 0xEA, 0x11, 0x93, 0xFA, + 0x9D, 0x1E, 0x67, 0x13, 0x4F, 0x1E, 0x86, 0x0C, 0x9D, 0x14, 0xE3, 0xF6, + 0x43, 0x0D, 0xED, 0x08, 0x72, 0x10, 0x2E, 0x1A, 0xC2, 0x18, 0x4D, 0x0F, + 0xEC, 0x17, 0x67, 0x0F, 0x04, 0x13, 0xEC, 0x18, 0x77, 0x0F, 0x4E, 0x09, + 0x52, 0x0A, 0xB1, 0x01, 0x5B, 0x0D, 0x5E, 0x0E, 0x4F, 0x17, 0x5E, 0x07, + 0x31, 0x23, 0x05, 0xFD, 0x23, 0x16, 0xB7, 0xF8, 0xE9, 0x03, 0x03, 0xF9, + 0x0E, 0xFB, 0xBF, 0xFB, 0x1B, 0xFA, 0x5D, 0x04, 0xF4, 0xFE, 0x53, 0x0B, + 0xA0, 0xF7, 0xE4, 0x03, 0x71, 0xF2, 0xA9, 0xFD, 0xC6, 0xEE, 0xB1, 0xFB, + 0x10, 0xE0, 0x82, 0xEF, 0x43, 0xD8, 0xCC, 0xF1, 0x42, 0xE0, 0x70, 0x04, + 0xCB, 0xF9, 0x05, 0x13, 0x72, 0x06, 0x42, 0x07, 0xC0, 0xFD, 0x45, 0xEF, + 0x2F, 0xF1, 0x7A, 0xF4, 0xF9, 0xD2, 0xE1, 0xED, 0x3E, 0xC8, 0x3B, 0xDD, + 0x18, 0xD6, 0xB8, 0xE2, 0xDB, 0xD8, 0x49, 0xE6, 0x8D, 0xE2, 0x4E, 0xE5, + 0x8B, 0xE6, 0x53, 0xEB, 0x8A, 0xE4, 0x11, 0xEE, 0xAC, 0xD9, 0xE5, 0xD9, + 0x9B, 0xC5, 0x73, 0xDE, 0x46, 0xCB, 0xF7, 0xFC, 0x97, 0xE1, 0x4F, 0x01, + 0x63, 0xEE, 0x3F, 0xF4, 0x17, 0xEC, 0x90, 0xE9, 0xE6, 0xE1, 0x22, 0xDF, + 0xB8, 0xDC, 0xD3, 0xCE, 0xED, 0xD9, 0x24, 0xC4, 0x73, 0xDB, 0x81, 0xD1, + 0x73, 0xD9, 0x8D, 0xD2, 0xB2, 0xDD, 0xD6, 0xBF, 0xB8, 0xE5, 0xB6, 0xC6, + 0xBA, 0xE5, 0xC2, 0xD8, 0xFE, 0xE8, 0x71, 0xDB, 0x5D, 0xF7, 0x0A, 0xDA, + 0x65, 0x04, 0x65, 0xDE, 0x06, 0xF7, 0xEF, 0xDC, 0x6E, 0xF1, 0x27, 0xD7, + 0x31, 0x00, 0x06, 0xD6, 0x5B, 0x04, 0xFF, 0xD4, 0x31, 0x02, 0x59, 0xE0, + 0x1D, 0x0E, 0x22, 0x00, 0x30, 0x10, 0x2E, 0x0F, 0x72, 0xF7, 0x59, 0x01, + 0xBB, 0xEC, 0x9D, 0xFF, 0x9F, 0xFA, 0xE1, 0x10, 0x80, 0xFC, 0x74, 0x12, + 0xDC, 0xFF, 0x58, 0x0F, 0x6E, 0x0C, 0x85, 0x10, 0x36, 0x04, 0x38, 0x17, + 0x33, 0xF4, 0xA9, 0x0C, 0x77, 0xF3, 0x8D, 0xF9, 0x86, 0xF7, 0x70, 0x0B, + 0x64, 0xEC, 0xE9, 0x15, 0x96, 0xEF, 0xDF, 0x17, 0x4F, 0xFF, 0x5C, 0x1F, + 0x72, 0x0C, 0xCB, 0x27, 0x4C, 0x14, 0x5B, 0x26, 0x3F, 0x15, 0x08, 0x1A, + 0x90, 0x20, 0x93, 0x13, 0xD3, 0x1C, 0x4D, 0xFB, 0xB5, 0x13, 0x07, 0xEF, + 0x55, 0x1E, 0xA0, 0x05, 0x2E, 0x11, 0x2D, 0x05, 0x8C, 0x09, 0xA1, 0xF8, + 0xB9, 0x0F, 0x86, 0xFE, 0x83, 0x02, 0x2A, 0x05, 0x6A, 0xFA, 0xB2, 0x05, + 0xDB, 0xFC, 0x1D, 0x0A, 0x4A, 0x00, 0xAD, 0x17, 0xE5, 0xFB, 0x25, 0x0E, + 0x13, 0x00, 0x12, 0xFF, 0x84, 0x05, 0x74, 0x09, 0xF5, 0x01, 0x9C, 0x0C, + 0x42, 0x10, 0x9E, 0x08, 0x5B, 0x1E, 0xFC, 0x04, 0xA6, 0x12, 0x3B, 0xF8, + 0x19, 0x05, 0xAD, 0xF5, 0x5F, 0xFA, 0xD7, 0xF8, 0x6A, 0xF4, 0x6C, 0xFB, + 0x44, 0xED, 0x38, 0x00, 0x43, 0xDE, 0xB5, 0x08, 0x71, 0xE5, 0xE3, 0x14, + 0x61, 0xF4, 0xFB, 0x13, 0x99, 0xF6, 0xB7, 0x03, 0x03, 0x02, 0x70, 0x03, + 0x68, 0x1D, 0xD8, 0x12, 0xE6, 0x21, 0x33, 0x06, 0xAA, 0x16, 0x19, 0xF6, + 0xE5, 0x0F, 0x15, 0xF2, 0x93, 0x06, 0x43, 0xEA, 0x62, 0x01, 0x8D, 0xE5, + 0x40, 0xFD, 0xCF, 0xE7, 0x06, 0xF8, 0xBF, 0xED, 0x51, 0xEE, 0x7F, 0xF4, + 0x7D, 0xF1, 0x00, 0x03, 0xA8, 0xFC, 0xD7, 0x10, 0xFF, 0xFB, 0xD7, 0x17, + 0x8B, 0xF9, 0x6C, 0x15, 0x51, 0x08, 0x4C, 0x15, 0x7B, 0x1A, 0x88, 0x11, + 0x87, 0x15, 0x85, 0x09, 0x42, 0x09, 0xF9, 0x08, 0x6F, 0x08, 0x71, 0x01, + 0x4C, 0xFC, 0xBB, 0xED, 0x13, 0xFC, 0x57, 0xE5, 0x39, 0x09, 0x71, 0xE0, + 0xF5, 0xFC, 0xF2, 0xDD, 0x4D, 0xF1, 0x3D, 0xEB, 0xA2, 0x04, 0xC2, 0xF9, + 0xB9, 0x10, 0x09, 0x06, 0x16, 0xFE, 0x04, 0x05, 0xA2, 0xF1, 0xA2, 0x03, + 0x74, 0xF5, 0x81, 0x11, 0xA2, 0xFD, 0x98, 0x08, 0x5A, 0x07, 0xE7, 0xE8, + 0x50, 0x13, 0x06, 0xE9, 0xB7, 0x0A, 0xD5, 0xF0, 0xE8, 0xFF, 0x4E, 0xEB, + 0x2B, 0xFB, 0x81, 0xE9, 0xF2, 0xFA, 0xD2, 0xEF, 0x7F, 0xFF, 0x9B, 0xFC, + 0xB7, 0x04, 0x36, 0x0A, 0xCC, 0x13, 0xD8, 0x18, 0xE0, 0x15, 0xF7, 0x1E, + 0xA8, 0x0E, 0xD7, 0x23, 0x05, 0xFF, 0x28, 0x24, 0x9E, 0xF5, 0x37, 0x15, + 0x7F, 0xF2, 0xCC, 0x01, 0x03, 0xF4, 0x30, 0x07, 0xD3, 0x00, 0x35, 0x19, + 0x89, 0x08, 0xBC, 0x18, 0xDF, 0x09, 0xD7, 0x0F, 0x5A, 0x0F, 0x2F, 0x10, + 0xB1, 0x0C, 0xB7, 0x14, 0x04, 0xFD, 0xE1, 0x1A, 0x71, 0x07, 0x6E, 0x26, + 0xB0, 0x1E, 0xA9, 0x2B, 0xB9, 0x22, 0x62, 0x28, 0xE6, 0x21, 0x24, 0x18, + 0xD2, 0x2F, 0xDA, 0x09, 0x52, 0x34, 0x82, 0xFA, 0x87, 0x23, 0x77, 0xE8, + 0x8C, 0x18, 0x51, 0xEA, 0x7A, 0x1B, 0xBF, 0xF7, 0x0B, 0x20, 0xB5, 0xFE, + 0x4B, 0x23, 0x7F, 0xFD, 0xDB, 0x32, 0xDE, 0x0B, 0x5F, 0x35, 0x60, 0x1B, + 0x42, 0x1E, 0xF2, 0x1E, 0x21, 0x11, 0x87, 0x29, 0xC8, 0x03, 0x26, 0x1C, + 0x2D, 0xF0, 0x2A, 0x0C, 0xEC, 0xE8, 0x7B, 0x15, 0xA0, 0xF6, 0xE0, 0x12, + 0x61, 0x0D, 0x4F, 0x03, 0xA6, 0x14, 0x48, 0xFF, 0xAB, 0x13, 0x67, 0x0F, + 0x97, 0x0C, 0x49, 0x0B, 0xAC, 0x03, 0xC8, 0xF7, 0xE9, 0x0C, 0xDC, 0xFF, + 0x85, 0x19, 0x6C, 0x0A, 0x85, 0x10, 0xB7, 0x10, 0x07, 0x03, 0x66, 0x12, + 0x05, 0x04, 0x6F, 0x0F, 0xEA, 0xFA, 0x4F, 0x0A, 0x53, 0xE1, 0xFD, 0x04, + 0x97, 0xDC, 0x66, 0x07, 0x54, 0xED, 0x03, 0x04, 0x95, 0xF5, 0x31, 0x00, + 0xC0, 0x00, 0x55, 0x09, 0x3C, 0x0C, 0x79, 0x06, 0xE9, 0x0C, 0x6D, 0xFA, + 0x6E, 0xFF, 0xB7, 0xF5, 0x4D, 0xF0, 0x4A, 0xF5, 0x33, 0xEC, 0xCC, 0xFA, + 0x27, 0xE3, 0x84, 0xF2, 0x16, 0xE3, 0x27, 0xEB, 0x0B, 0xEE, 0x5D, 0xF0, + 0x13, 0xE9, 0x95, 0xED, 0xCD, 0xEA, 0x00, 0xEA, 0x9F, 0xF4, 0x7B, 0xE5, + 0xCD, 0xEC, 0x84, 0xE1, 0xBF, 0xE7, 0xD9, 0xE2, 0xCB, 0xE3, 0x35, 0xEB, + 0x5A, 0xDB, 0xEE, 0xE3, 0xC6, 0xE0, 0xDC, 0xD1, 0x48, 0xE8, 0xFE, 0xD6, + 0x8F, 0xEE, 0x2E, 0xE2, 0x5B, 0xEE, 0x17, 0xE2, 0xBE, 0xE7, 0x8F, 0xDB, + 0xE4, 0xE9, 0x8A, 0xD7, 0xA3, 0xF0, 0xA8, 0xD3, 0x8F, 0xF7, 0xAC, 0xDA, + 0xEE, 0xEA, 0x70, 0xD5, 0x84, 0xED, 0x94, 0xCB, 0x75, 0xEF, 0x1A, 0xCF, + 0x3E, 0xDB, 0x0B, 0xD8, 0x43, 0xD6, 0xF5, 0xE3, 0xD3, 0xD3, 0x73, 0xCF, + 0x28, 0xC7, 0x50, 0xBA, 0xEA, 0xC2, 0xD3, 0xC5, 0x2B, 0xC7, 0xD5, 0xCD, + 0xEB, 0xD0, 0x73, 0xD4, 0x04, 0xE7, 0xC5, 0xDE, 0xC7, 0xE5, 0xEE, 0xDA, + 0x43, 0xD7, 0x04, 0xDD, 0x56, 0xCE, 0x1F, 0xE5, 0x41, 0xD6, 0xD2, 0xE6, + 0xCE, 0xD6, 0x75, 0xE7, 0xB9, 0xCF, 0x19, 0xED, 0x83, 0xD7, 0x9A, 0xE5, + 0x86, 0xD6, 0x19, 0xD8, 0xB7, 0xD0, 0xBA, 0xCB, 0x50, 0xCE, 0x48, 0xC8, + 0x64, 0xC8, 0x8A, 0xD5, 0x82, 0xB9, 0x88, 0xD7, 0xB8, 0xBC, 0xA0, 0xD3, + 0xF7, 0xD9, 0x5C, 0xD8, 0xE2, 0xE8, 0x09, 0xDF, 0xF0, 0xE8, 0x8F, 0xE7, + 0x46, 0xF2, 0xB9, 0xFA, 0x9D, 0xF2, 0x36, 0xFF, 0xAC, 0xEC, 0x0A, 0xF0, + 0xC9, 0xE9, 0x20, 0xE8, 0x3A, 0xE2, 0xFD, 0xE5, 0x82, 0xE4, 0xD0, 0xDD, + 0xBE, 0xEF, 0xAE, 0xD2, 0x5D, 0xF5, 0xC2, 0xD5, 0xF2, 0xF5, 0x51, 0xE0, + 0xD1, 0x02, 0xE3, 0xE4, 0x85, 0x12, 0xFA, 0xE2, 0x46, 0x08, 0x39, 0xE8, + 0x45, 0xF8, 0xD3, 0xEE, 0x9D, 0xF9, 0xA3, 0xF7, 0x15, 0xFA, 0xCF, 0x05, + 0x71, 0xFE, 0x86, 0x11, 0x94, 0x09, 0x62, 0x18, 0xED, 0x0E, 0x36, 0x16, + 0x04, 0x02, 0xDC, 0x14, 0x1D, 0x01, 0x0E, 0x0E, 0x3E, 0x11, 0x8B, 0x08, + 0x76, 0x13, 0xF6, 0x0E, 0x28, 0x18, 0x17, 0x0A, 0xA1, 0x1A, 0x88, 0x05, + 0xFC, 0x17, 0xC4, 0x10, 0xBE, 0x1A, 0x24, 0x1B, 0x81, 0x13, 0x0A, 0x20, + 0xA9, 0x05, 0x8D, 0x28, 0x3C, 0x06, 0x36, 0x2E, 0x28, 0x0D, 0xFB, 0x22, + 0x3D, 0x09, 0xC0, 0x1F, 0x01, 0x0E, 0xC9, 0x2E, 0xFA, 0x0E, 0x77, 0x27, + 0xCA, 0x01, 0xA7, 0x1A, 0xDD, 0x06, 0x3F, 0x1B, 0x84, 0x0E, 0xD5, 0x0C, + 0xC8, 0x0C, 0x8C, 0xFD, 0x6F, 0x10, 0x1E, 0x0B, 0xE5, 0x15, 0x1E, 0x1C, + 0x58, 0x18, 0x7B, 0x11, 0xB6, 0x19, 0x01, 0x11, 0xF3, 0x1E, 0x64, 0x26, + 0x73, 0x1B, 0xEE, 0x20, 0x72, 0x0E, 0x14, 0x0D, 0x5B, 0x05, 0xEE, 0x05, + 0x68, 0xFE, 0x03, 0x03, 0x10, 0xF9, 0xEB, 0x04, 0xA6, 0xF3, 0xC3, 0xFA, + 0x83, 0xFF, 0xB5, 0xF0, 0xAB, 0x0E, 0xC5, 0xEA, 0x3B, 0x10, 0xBF, 0xE8, + 0x52, 0x0E, 0xC6, 0xF1, 0xC3, 0x02, 0x45, 0xEA, 0x81, 0xFE, 0x76, 0xE2, + 0xB1, 0x07, 0x14, 0xF8, 0x14, 0x0B, 0x00, 0x18, 0x5F, 0x02, 0x0E, 0x18, + 0x8C, 0x06, 0x16, 0x09, 0xEC, 0x11, 0xC6, 0x13, 0x3B, 0xFE, 0x4B, 0x0B, + 0x9F, 0xED, 0xDC, 0xF5, 0xE9, 0xF9, 0xEC, 0x00, 0x51, 0xFE, 0x4F, 0x08, + 0x78, 0xFD, 0x76, 0xFD, 0xAB, 0x0A, 0xB7, 0xF8, 0xB9, 0x07, 0x27, 0xFF, + 0xB9, 0xF4, 0x18, 0xFC, 0x92, 0xF1, 0x84, 0xEA, 0x43, 0x00, 0x4D, 0xF0, + 0x37, 0x0A, 0x1A, 0x05, 0x42, 0x05, 0x3D, 0x02, 0xCF, 0x0B, 0xFE, 0x05, + 0x3F, 0x1B, 0x0A, 0x23, 0x1B, 0x18, 0xD3, 0x28, 0x5D, 0x12, 0xA7, 0x11, + 0x98, 0x11, 0x5B, 0x0B, 0x33, 0xFB, 0xDC, 0x0D, 0x16, 0xEC, 0x67, 0x08, + 0xA7, 0xFC, 0xD4, 0x1A, 0x38, 0x09, 0x6E, 0x27, 0xD4, 0x12, 0x84, 0x19, + 0x98, 0x19, 0x8C, 0x17, 0x93, 0x15, 0x10, 0x1F, 0x7E, 0x1C, 0x03, 0x1D, + 0x90, 0x2A, 0x3B, 0x0D, 0x75, 0x2A, 0x54, 0x10, 0x8C, 0x28, 0xB9, 0x25, + 0x33, 0x2F, 0xCD, 0x1E, 0x69, 0x31, 0xF5, 0x0F, 0x99, 0x2C, 0x3B, 0x19, + 0xC9, 0x16, 0x0D, 0x1E, 0x75, 0x0E, 0x2D, 0x17, 0xEE, 0x1A, 0xF3, 0x15, + 0xDF, 0x1E, 0x24, 0x1A, 0x27, 0x1D, 0xD8, 0x18, 0x1F, 0x1F, 0xB3, 0x2F, + 0xCE, 0x2C, 0x41, 0x4A, 0x14, 0x3D, 0x5E, 0x3B, 0x63, 0x3B, 0x7F, 0x32, + 0x2A, 0x2C, 0x1C, 0x3B, 0x0A, 0x24, 0xF0, 0x2E, 0x77, 0x2B, 0xDC, 0x23, + 0x54, 0x2D, 0xF8, 0x21, 0x16, 0x24, 0x0F, 0x17, 0xC0, 0x1B, 0x12, 0x19, + 0x2D, 0x0D, 0x31, 0x26, 0xBF, 0x13, 0x6D, 0x33, 0x94, 0x20, 0xF8, 0x36, + 0x94, 0x14, 0xED, 0x2F, 0x25, 0x16, 0xD6, 0x31, 0xF1, 0x1A, 0x38, 0x37, + 0x39, 0x12, 0x5E, 0x29, 0x60, 0x0E, 0x95, 0x1F, 0x29, 0x08, 0x54, 0x27, + 0xDB, 0xFA, 0x5A, 0x15, 0xD7, 0x05, 0xD2, 0x01, 0x67, 0x10, 0x32, 0x06, + 0xAE, 0xF9, 0x43, 0x07, 0xCD, 0xF4, 0x8F, 0x06, 0x5D, 0x0A, 0xCB, 0x09, + 0xCF, 0x1A, 0x5D, 0x0A, 0x83, 0x1B, 0xF5, 0xFD, 0xFC, 0x1B, 0x8E, 0xF8, + 0x04, 0x24, 0x07, 0x02, 0x8D, 0x27, 0x3C, 0x02, 0xA8, 0x1D, 0x01, 0xF8, + 0x83, 0x0B, 0x3E, 0xF1, 0xAC, 0xFE, 0xBB, 0xF7, 0x63, 0xF6, 0xB6, 0xFE, + 0xB8, 0xFE, 0x2C, 0x04, 0x4F, 0x0A, 0xB0, 0x0F, 0xA2, 0x04, 0x9A, 0x12, + 0x0E, 0x07, 0xAF, 0x0B, 0x0F, 0x13, 0xAC, 0x0E, 0x81, 0x0D, 0xD9, 0x0D, + 0x7D, 0xFB, 0xEF, 0xFC, 0xCD, 0xFD, 0xF8, 0xF7, 0x2F, 0x05, 0xC3, 0xFC, + 0xCD, 0x01, 0xC9, 0xFB, 0x8B, 0xFF, 0x86, 0xFA, 0xE9, 0x01, 0x28, 0xF7, + 0xCB, 0x01, 0x14, 0xEC, 0x88, 0xF2, 0xDA, 0xED, 0x58, 0xE2, 0x54, 0xF8, + 0x67, 0xED, 0x7E, 0xFE, 0xCD, 0xF4, 0x73, 0xF0, 0x31, 0xEE, 0x35, 0xE3, + 0x49, 0xF3, 0x55, 0xF3, 0x4F, 0xEE, 0x59, 0xFD, 0xEA, 0xE4, 0xFD, 0xF1, + 0x51, 0xE4, 0xEA, 0xEB, 0xE6, 0xDF, 0x80, 0xF1, 0x7A, 0xDA, 0x43, 0xED, + 0x3F, 0xE5, 0x6E, 0xF1, 0xC4, 0xF3, 0x8C, 0xEF, 0xA9, 0xF5, 0x36, 0xDD, + 0x22, 0xEA, 0xFF, 0xE0, 0x32, 0xCE, 0xAF, 0xEC, 0xFF, 0xC2, 0xDF, 0xEF, + 0x00, 0xC6, 0x52, 0xE7, 0x62, 0xCA, 0x03, 0xE0, 0x31, 0xD1, 0x82, 0xD7, + 0x56, 0xD0, 0xA6, 0xD6, 0xE7, 0xD6, 0x9E, 0xDE, 0xA7, 0xDD, 0x10, 0xD1, + 0x2F, 0xD6, 0x00, 0xCD, 0x7C, 0xC3, 0x94, 0xCA, 0x03, 0xC6, 0x57, 0xBE, + 0x77, 0xDE, 0x44, 0xC4, 0x1C, 0xE0, 0xFD, 0xC8, 0xAA, 0xE0, 0xDF, 0xC8, + 0x2F, 0xEB, 0xD3, 0xCF, 0x0E, 0xEA, 0xB1, 0xCE, 0xF9, 0xE8, 0x6E, 0xC8, + 0x13, 0xF7, 0x8F, 0xD9, 0x89, 0xF4, 0x34, 0xE7, 0xA6, 0xDF, 0x4D, 0xDD, + 0xA6, 0xE1, 0x57, 0xD8, 0xF0, 0xEF, 0x88, 0xDB, 0xC0, 0xE4, 0xDA, 0xD4, + 0xF0, 0xDB, 0x94, 0xD7, 0xD0, 0xEC, 0xA8, 0xE1, 0x1D, 0xEA, 0x05, 0xE5, + 0x64, 0xD7, 0x89, 0xF4, 0xBA, 0xDD, 0x7A, 0x03, 0x07, 0xEB, 0xEE, 0x04, + 0x17, 0xE8, 0x65, 0x04, 0xB3, 0xF2, 0x9C, 0x0F, 0x2E, 0x06, 0x82, 0x1A, + 0xF3, 0xFE, 0x07, 0x15, 0x26, 0xF0, 0x9E, 0x08, 0x8F, 0xFA, 0x61, 0x0E, + 0x46, 0x0A, 0xB0, 0x0E, 0x49, 0x12, 0x33, 0xF2, 0x2E, 0x23, 0xBC, 0xEF, + 0x5F, 0x1F, 0xA2, 0xFF, 0x95, 0xF9, 0xC2, 0xF4, 0xD3, 0xED, 0x92, 0xF4, + 0x2B, 0xFC, 0x99, 0x02, 0x04, 0x05, 0x47, 0x01, 0x4F, 0x0B, 0xFF, 0x02, + 0x9A, 0x11, 0xEE, 0x08, 0x95, 0x1F, 0x81, 0x06, 0x20, 0x24, 0xDF, 0xFF, + 0x6F, 0x22, 0x49, 0x09, 0x53, 0x20, 0xAC, 0x19, 0xB1, 0x11, 0xF7, 0x16, + 0xE2, 0x08, 0x44, 0x11, 0xB1, 0x13, 0x85, 0x17, 0x9D, 0x07, 0xB9, 0x17, + 0x71, 0xE2, 0x36, 0x12, 0x05, 0xDD, 0x63, 0x0E, 0x7C, 0xF4, 0x45, 0x05, + 0x44, 0xFB, 0x87, 0xFB, 0xBA, 0xF6, 0xD8, 0x02, 0x63, 0xFE, 0x6B, 0x0B, + 0x8A, 0x08, 0xC1, 0x0D, 0xD3, 0x12, 0xDA, 0x13, 0x90, 0x16, 0x8F, 0x0E, + 0xC8, 0x18, 0x31, 0x16, 0x44, 0x07, 0xB4, 0x1A, 0x59, 0xF8, 0xD7, 0x0B, + 0xA1, 0xFB, 0x63, 0xFF, 0x76, 0xE9, 0x55, 0xF5, 0xA5, 0xE9, 0x3E, 0xF3, + 0x2E, 0x0C, 0x6D, 0xF8, 0xE4, 0x1C, 0xA6, 0xF8, 0x0D, 0x16, 0x45, 0xF4, + 0xF7, 0x08, 0x7B, 0xEF, 0xA7, 0x04, 0xBE, 0xF6, 0x8E, 0x0B, 0xB7, 0x01, + 0x3F, 0x0E, 0x26, 0xFC, 0xB2, 0x16, 0xA8, 0x04, 0x56, 0x18, 0x7D, 0x08, + 0xF6, 0x09, 0x4C, 0xFC, 0x87, 0xFD, 0xBA, 0x02, 0x93, 0xEA, 0x40, 0x01, + 0x34, 0xE0, 0x58, 0xFB, 0x4F, 0xE4, 0xFB, 0x05, 0x2B, 0xEF, 0xE0, 0x12, + 0x09, 0xFA, 0x7E, 0x12, 0x0C, 0xF5, 0x0B, 0x08, 0xA1, 0xFB, 0xF8, 0x06, + 0x51, 0x06, 0xA1, 0x04, 0xF9, 0x09, 0xAE, 0x08, 0x0B, 0x09, 0xBD, 0x0B, + 0x6D, 0x05, 0x4C, 0xFB, 0xA5, 0x07, 0x79, 0xF0, 0x88, 0xFC, 0xCF, 0xEA, + 0x3E, 0xFA, 0x58, 0xE4, 0x6B, 0xF8, 0xBF, 0xDE, 0x61, 0xF0, 0xF8, 0xE4, + 0xBE, 0xF5, 0x6F, 0xF0, 0x26, 0xFE, 0xA7, 0xEF, 0x04, 0x01, 0xE6, 0xF4, + 0x14, 0x03, 0xCD, 0xFB, 0x9B, 0x02, 0xA4, 0xF1, 0xF7, 0xFD, 0x3C, 0xF9, + 0xA7, 0x01, 0x12, 0x16, 0x8B, 0xFD, 0x89, 0x17, 0x61, 0xEB, 0x10, 0x07, + 0x4D, 0xDF, 0x41, 0x07, 0x8E, 0xE6, 0x16, 0x13, 0x7D, 0xF0, 0xFF, 0x0E, + 0x09, 0xF7, 0x6D, 0x0A, 0x85, 0xFD, 0x92, 0x13, 0xBC, 0xFC, 0x85, 0x15, + 0xD0, 0x02, 0xD7, 0x11, 0x9B, 0x12, 0x86, 0x1B, 0x08, 0x18, 0xDC, 0x19, + 0x16, 0x1F, 0x2F, 0x18, 0xD0, 0x19, 0x38, 0x19, 0xC4, 0x03, 0x4C, 0x08, + 0x1B, 0x03, 0x4D, 0xFF, 0x71, 0x05, 0x3D, 0xFB, 0xE9, 0x02, 0xBB, 0xFF, + 0x04, 0x12, 0x61, 0x14, 0x32, 0x25, 0x4E, 0x23, 0x01, 0x29, 0x27, 0x21, + 0xE3, 0x25, 0xF0, 0x26, 0x5E, 0x24, 0xD6, 0x30, 0x4F, 0x26, 0xEF, 0x25, + 0xD4, 0x3A, 0xCE, 0x1B, 0x20, 0x48, 0x1C, 0x13, 0x40, 0x37, 0x13, 0x0C, + 0xDE, 0x31, 0x8D, 0x19, 0x33, 0x34, 0x6A, 0x1A, 0x09, 0x2B, 0x21, 0x02, + 0x9F, 0x2E, 0x73, 0x0A, 0x52, 0x24, 0x46, 0x1A, 0xCE, 0x1C, 0x48, 0x21, + 0xC6, 0x25, 0x7B, 0x3E, 0xF0, 0x15, 0xCF, 0x44, 0x86, 0x0D, 0x18, 0x38, + 0xAE, 0x17, 0xE6, 0x2F, 0xE4, 0x15, 0x39, 0x28, 0xB8, 0x10, 0xF5, 0x25, + 0x33, 0x0B, 0x17, 0x14, 0x6B, 0x05, 0xAD, 0x05, 0x19, 0x01, 0x76, 0x02, + 0x59, 0x0A, 0xEF, 0xFA, 0xC9, 0x11, 0x94, 0xEE, 0x67, 0x09, 0x2F, 0xEF, + 0x97, 0x0E, 0x2D, 0x04, 0x90, 0x17, 0x63, 0x08, 0x08, 0x20, 0xC7, 0x07, + 0x3D, 0x22, 0xF3, 0x18, 0x99, 0x16, 0x23, 0x07, 0x4C, 0x1B, 0xFA, 0xEA, + 0x50, 0x15, 0x1D, 0xF8, 0x8F, 0xF8, 0x8E, 0x04, 0x1A, 0xE6, 0x4E, 0xFB, + 0x01, 0xE9, 0x4D, 0xF5, 0xED, 0xF8, 0x2B, 0xFC, 0x86, 0xFA, 0x0D, 0x00, + 0x03, 0xF5, 0xF8, 0x05, 0xCD, 0xF3, 0x00, 0x15, 0xED, 0xE5, 0x7F, 0x0C, + 0x41, 0xDE, 0xC8, 0xFF, 0x6B, 0xE6, 0x47, 0x08, 0x75, 0xEA, 0x36, 0x14, + 0xB8, 0xF1, 0x6D, 0x0E, 0x57, 0xFF, 0x83, 0xF0, 0x6E, 0x04, 0x12, 0xE8, + 0x08, 0xF1, 0xB6, 0xE5, 0x42, 0xE0, 0x15, 0xD3, 0x36, 0xEA, 0x94, 0xD7, + 0x11, 0xED, 0xBF, 0xD6, 0x02, 0xF7, 0x58, 0xD2, 0x49, 0xFC, 0x78, 0xE2, + 0x48, 0xF5, 0xEB, 0xEA, 0xEC, 0xFB, 0xC9, 0xE6, 0x02, 0x00, 0x61, 0xEB, + 0xA3, 0x02, 0xA1, 0xF5, 0x6E, 0xF8, 0x61, 0xE5, 0x9E, 0xF3, 0xBF, 0xE4, + 0x26, 0xF0, 0x0E, 0xEF, 0x63, 0xE0, 0xAB, 0xE5, 0x3E, 0xD9, 0x50, 0xEA, + 0x52, 0xD7, 0x1C, 0xEE, 0xFF, 0xDD, 0x4A, 0xE6, 0x85, 0xD8, 0x09, 0xDF, + 0xC7, 0xC8, 0x45, 0xE8, 0xA3, 0xCC, 0xA0, 0xF1, 0xC7, 0xE1, 0xF4, 0xE5, + 0xD7, 0xEF, 0x9C, 0xD9, 0x39, 0xF2, 0x4D, 0xE1, 0xDC, 0xEC, 0xDF, 0xEB, + 0x4B, 0xD5, 0x07, 0xD7, 0xF8, 0xC6, 0xF8, 0xC4, 0x1E, 0xC1, 0x5F, 0xCE, + 0x06, 0xBF, 0x83, 0xCF, 0x89, 0xCB, 0x45, 0xCA, 0x33, 0xD8, 0x75, 0xD1, + 0xF6, 0xE2, 0xF2, 0xD9, 0x01, 0xEA, 0x20, 0xD4, 0x46, 0xE5, 0xC7, 0xC8, + 0x70, 0xE4, 0xB6, 0xCD, 0x40, 0xDB, 0x32, 0xC8, 0x0C, 0xDB, 0x8F, 0xCD, + 0x56, 0xE3, 0xFD, 0xDF, 0x0A, 0xDB, 0x8D, 0xE6, 0xFC, 0xD6, 0xE1, 0xEA, + 0xF6, 0xCE, 0x9B, 0xD9, 0x8A, 0xC4, 0x8B, 0xD4, 0x0B, 0xB9, 0xDF, 0xE1, + 0x6B, 0xC6, 0x16, 0xE8, 0xF7, 0xE3, 0x06, 0xF2, 0x5C, 0xE3, 0xA2, 0xF2, + 0x7A, 0xEA, 0x1F, 0xFD, 0x27, 0xF7, 0x92, 0x09, 0xC5, 0xF0, 0x95, 0x02, + 0x14, 0xF0, 0x91, 0x00, 0x4E, 0xEF, 0x58, 0xF9, 0x23, 0xF2, 0x2F, 0xF8, + 0x10, 0xF3, 0x6B, 0xF8, 0xED, 0xF2, 0x90, 0xF0, 0x91, 0xF4, 0xA8, 0xE9, + 0x8F, 0xF5, 0x51, 0xE5, 0xF1, 0x03, 0x24, 0xED, 0x18, 0x18, 0x6F, 0xF9, + 0xFA, 0x1D, 0xD5, 0xF6, 0xA3, 0x16, 0xCC, 0xF1, 0x43, 0x13, 0x48, 0xF3, + 0xC7, 0x1F, 0x9B, 0xFA, 0x6C, 0x2A, 0x7B, 0xFD, 0xBB, 0x27, 0xCD, 0x03, + 0xC4, 0x28, 0xC4, 0x18, 0x2B, 0x20, 0x6A, 0x11, 0x5D, 0x1C, 0x2A, 0x07, + 0x19, 0x19, 0x89, 0x12, 0x92, 0x06, 0x67, 0x1D, 0xB9, 0xFB, 0xF9, 0x23, + 0x1A, 0x06, 0x56, 0x2D, 0x94, 0x0E, 0xFE, 0x32, 0xA8, 0x05, 0x03, 0x30, + 0xFE, 0x03, 0x83, 0x2D, 0xB0, 0x06, 0x96, 0x17, 0x4C, 0x0B, 0x96, 0x04, + 0x25, 0x14, 0x89, 0x16, 0x97, 0x1B, 0x2B, 0x28, 0xC9, 0x22, 0x97, 0x2D, + 0x43, 0x1C, 0x7F, 0x27, 0xE2, 0x11, 0xEB, 0x23, 0x05, 0x05, 0xB8, 0x2F, + 0x8B, 0xFC, 0xB3, 0x38, 0xB4, 0xFC, 0x0D, 0x30, 0x78, 0xFE, 0x33, 0x19, + 0x96, 0x0E, 0x8B, 0x10, 0x8F, 0x09, 0x2D, 0x01, 0x96, 0xF6, 0xEA, 0xEA, + 0x9A, 0x07, 0x50, 0xF6, 0x35, 0x1C, 0xE7, 0xFB, 0xF2, 0x20, 0x06, 0xF5, + 0x90, 0x1E, 0xD2, 0xFD, 0x1B, 0x1A, 0xAF, 0x06, 0x50, 0x0A, 0x74, 0x02, + 0x28, 0xF1, 0xB3, 0xFD, 0x1E, 0xF1, 0x48, 0x09, 0xBA, 0xFA, 0x05, 0x16, + 0xC3, 0x00, 0x89, 0x11, 0x8A, 0x0B, 0xF7, 0xFD, 0xEA, 0x0A, 0xB7, 0xEF, + 0x62, 0x06, 0x51, 0xEF, 0x99, 0x04, 0xC0, 0xEE, 0xD7, 0x0A, 0x83, 0xFC, + 0xCD, 0x0A, 0x72, 0x0D, 0x27, 0xFA, 0x86, 0x06, 0x70, 0x03, 0x30, 0x0B, + 0xB8, 0x0F, 0x33, 0x0F, 0x9D, 0x02, 0x9E, 0xFF, 0xE0, 0x03, 0xC4, 0xFF, + 0x53, 0x09, 0xE1, 0x01, 0xF7, 0x03, 0x6D, 0xFD, 0x78, 0x0A, 0xA2, 0xFC, + 0xDE, 0x11, 0x1D, 0xF6, 0xF4, 0x13, 0xC5, 0xF0, 0x20, 0x1B, 0x13, 0xF8, + 0x3D, 0x1B, 0x89, 0x04, 0x1B, 0x0E, 0x6B, 0x07, 0xCE, 0xFC, 0x1B, 0x0F, + 0xFB, 0xF9, 0x81, 0x1E, 0xFA, 0x01, 0x76, 0x1C, 0xB8, 0xFD, 0x3B, 0x1F, + 0x2F, 0xF7, 0x58, 0x2F, 0x82, 0x02, 0x15, 0x35, 0x9D, 0x06, 0xA3, 0x1F, + 0xC1, 0x0F, 0x61, 0x10, 0xF2, 0x20, 0x1B, 0x19, 0xE9, 0x1A, 0xE2, 0x1E, + 0xB0, 0x10, 0xD5, 0x1C, 0xBF, 0x18, 0x44, 0x25, 0x59, 0x29, 0x55, 0x33, + 0x4D, 0x26, 0x6A, 0x24, 0x8D, 0x1E, 0x28, 0x10, 0x0A, 0x10, 0x78, 0x01, + 0x56, 0xFD, 0xB7, 0x03, 0x2C, 0xFD, 0xC4, 0x18, 0xBF, 0x04, 0xCA, 0x1F, + 0xB8, 0x15, 0x8C, 0x1D, 0xF0, 0x29, 0xB2, 0x1A, 0xA2, 0x33, 0xCB, 0x20, + 0x73, 0x2D, 0x88, 0x25, 0xFE, 0x20, 0x01, 0x19, 0xCD, 0x12, 0xA7, 0x0E, + 0x16, 0x12, 0x4C, 0x17, 0x4D, 0x21, 0x09, 0x18, 0x09, 0x2A, 0x39, 0x10, + 0x72, 0x38, 0x06, 0x12, 0xEB, 0x3F, 0x80, 0x03, 0x48, 0x38, 0x74, 0x04, + 0x0E, 0x26, 0x8E, 0x1C, 0x42, 0x12, 0x07, 0x1B, 0xDE, 0x12, 0x22, 0x14, + 0x4A, 0x13, 0x95, 0x14, 0x50, 0x15, 0x01, 0x1B, 0x86, 0x0B, 0x95, 0x24, + 0x75, 0x08, 0x46, 0x30, 0x5B, 0x0F, 0x6E, 0x1F, 0xEB, 0x0A, 0x27, 0x0A, + 0xFD, 0x0B, 0xE0, 0x19, 0x9C, 0x04, 0x56, 0x1F, 0x0C, 0xFE, 0x51, 0x20, + 0xE6, 0x0A, 0xF2, 0x2D, 0x56, 0x1D, 0xEE, 0x2E, 0x35, 0x1D, 0x2B, 0x24, + 0x79, 0x15, 0x17, 0x1C, 0x0D, 0x0D, 0x3F, 0x04, 0x1D, 0x06, 0x33, 0xF5, + 0xF4, 0xFC, 0x4A, 0xF9, 0xDD, 0xFB, 0x3A, 0xFB, 0x0F, 0x0D, 0x6E, 0x05, + 0xDF, 0x15, 0xBD, 0x04, 0xA4, 0x1D, 0x67, 0x04, 0x0B, 0x1B, 0x2C, 0x0D, + 0x1E, 0x09, 0xE1, 0x0F, 0x2C, 0xF8, 0xF2, 0x0B, 0x75, 0xF8, 0x06, 0x0A, + 0x31, 0x01, 0x95, 0x08, 0x8E, 0xFB, 0xE8, 0xF9, 0x04, 0xFE, 0x87, 0xF5, + 0x36, 0x03, 0xAF, 0xFF, 0x3A, 0xFE, 0x07, 0x02, 0xC0, 0x03, 0xDD, 0xF8, + 0x67, 0x06, 0x17, 0xE8, 0x08, 0xFB, 0x05, 0xE2, 0x16, 0xF7, 0x1E, 0xE4, + 0x9A, 0x05, 0xCC, 0xEB, 0x93, 0x08, 0x9F, 0xE5, 0x43, 0xFD, 0x6F, 0xE1, + 0x93, 0xF9, 0x60, 0xF2, 0xD8, 0xF1, 0x00, 0xEA, 0x6D, 0xDF, 0x80, 0xE0, + 0x84, 0xD5, 0xA5, 0xED, 0xF4, 0xDB, 0xCE, 0xEF, 0x7F, 0xDC, 0x58, 0xEF, + 0x26, 0xE6, 0x92, 0xFA, 0x1D, 0xF8, 0xA1, 0xFD, 0x19, 0xEC, 0x82, 0xF0, + 0xF3, 0xDD, 0xBC, 0xEE, 0x48, 0xD1, 0x87, 0xF0, 0x44, 0xCE, 0xD5, 0xE9, + 0x13, 0xCD, 0x43, 0xE3, 0x88, 0xC6, 0x07, 0xDA, 0xF7, 0xCE, 0xD1, 0xD2, + 0x9A, 0xD1, 0x75, 0xD4, 0x9E, 0xCC, 0x1A, 0xCF, 0x81, 0xC8, 0x5B, 0xCA, + 0xB6, 0xC5, 0xCA, 0xCD, 0xCE, 0xBC, 0x62, 0xC7, 0x88, 0xC1, 0x34, 0xC7, + 0xF4, 0xC8, 0x04, 0xCC, 0x5D, 0xC5, 0x84, 0xCD, 0xD6, 0xD5, 0x16, 0xD6, + 0x60, 0xE6, 0xEB, 0xD3, 0xD3, 0xE8, 0xAA, 0xC8, 0x8B, 0xEE, 0x32, 0xCC, + 0x36, 0xED, 0x02, 0xD4, 0x55, 0xE8, 0x53, 0xCE, 0x40, 0xE9, 0x7A, 0xC4, + 0xB5, 0xE5, 0x5A, 0xCD, 0x12, 0xDF, 0xD0, 0xCF, 0xB0, 0xE3, 0xE1, 0xCC, + 0x2A, 0xDE, 0x4C, 0xD2, 0x2C, 0xCE, 0x54, 0xD3, 0x1E, 0xC8, 0x0F, 0xD3, + 0xCA, 0xCD, 0xBA, 0xDB, 0xD9, 0xDD, 0x50, 0xE3, 0xFF, 0xEA, 0x0E, 0xD8, + 0xE6, 0xEE, 0x3A, 0xDC, 0xD9, 0xF1, 0x0B, 0xF2, 0xCB, 0xF2, 0x20, 0xEC, + 0x86, 0xFD, 0xE0, 0xEC, 0x0D, 0x00, 0x27, 0xFF, 0xC7, 0xF5, 0x96, 0x03, + 0xCC, 0xF9, 0x57, 0xFB, 0xB4, 0xF6, 0xBA, 0xF2, 0x07, 0xF5, 0x66, 0x00, + 0x58, 0xFD, 0x53, 0x09, 0x81, 0xFC, 0x18, 0x04, 0x05, 0xF3, 0xDB, 0x01, + 0x99, 0xF7, 0xA2, 0x02, 0x69, 0x03, 0xD2, 0x00, 0xB0, 0xF3, 0xCD, 0xFE, + 0xAC, 0xEB, 0x43, 0x13, 0xDC, 0xFA, 0x5D, 0x1B, 0x8D, 0x02, 0x5F, 0x10, + 0xB4, 0x03, 0xF2, 0x19, 0x20, 0x04, 0x22, 0x24, 0x6B, 0x07, 0x63, 0x19, + 0x88, 0x07, 0x35, 0x09, 0xFE, 0xFF, 0x8E, 0x02, 0x92, 0xF9, 0x29, 0x0C, + 0xAE, 0xFC, 0xF0, 0x18, 0xC4, 0x01, 0xCE, 0x15, 0x14, 0x12, 0xD1, 0x15, + 0x21, 0x24, 0x71, 0x10, 0x85, 0x18, 0x2D, 0x01, 0x88, 0x11, 0x7B, 0x03, + 0x8A, 0x12, 0x4A, 0xFE, 0xF5, 0x0C, 0x93, 0xF4, 0xBD, 0x0B, 0x95, 0xFC, + 0xF3, 0x0C, 0x29, 0x09, 0x7C, 0x14, 0x88, 0x04, 0xDC, 0x16, 0xC6, 0xF9, + 0xED, 0x10, 0xAD, 0x01, 0x58, 0x09, 0x72, 0x04, 0x18, 0x09, 0x25, 0x03, + 0xD9, 0x12, 0xA6, 0x05, 0x26, 0x20, 0x0C, 0x0D, 0x5D, 0x24, 0x6E, 0x1C, + 0x33, 0x1A, 0x48, 0x20, 0x85, 0x13, 0xFA, 0x17, 0xE3, 0x0C, 0xA7, 0x08, + 0xAB, 0x02, 0x00, 0x00, 0xD4, 0xF5, 0x09, 0x04, 0x39, 0xF3, 0x71, 0x08, + 0xDD, 0xFF, 0xCA, 0x02, 0x08, 0x07, 0x7A, 0x07, 0x42, 0x03, 0x12, 0x0D, + 0x83, 0xFD, 0x65, 0x09, 0x00, 0x01, 0x09, 0x0C, 0xAD, 0x07, 0x5C, 0x07, + 0x27, 0x02, 0x3A, 0x06, 0x57, 0xFE, 0xB0, 0x0F, 0xC3, 0x06, 0xF8, 0x13, + 0xEF, 0x00, 0x62, 0x08, 0xB4, 0xF7, 0x27, 0xFE, 0xBE, 0xF2, 0x3B, 0xF6, + 0x4E, 0xEB, 0xE1, 0xF0, 0xB4, 0xEE, 0x53, 0xEC, 0x02, 0xF1, 0xE7, 0xE4, + 0xB2, 0xF0, 0x80, 0xF1, 0xEC, 0xFA, 0x85, 0xF7, 0x31, 0x0E, 0x9F, 0xF8, + 0x6A, 0x17, 0x85, 0xFF, 0x50, 0x1B, 0x8C, 0xFA, 0x0E, 0x19, 0x01, 0xF3, + 0x3C, 0x04, 0xE1, 0xFB, 0x26, 0xF6, 0x50, 0x02, 0xDC, 0xF7, 0x98, 0xF6, + 0x34, 0xF8, 0xC3, 0xF4, 0x15, 0xF4, 0xF3, 0xF8, 0x7A, 0xF9, 0xE6, 0xF7, + 0xD6, 0xEE, 0x02, 0xF1, 0x86, 0xDB, 0x17, 0xF4, 0x9D, 0xE0, 0x6B, 0xFC, + 0xA7, 0xF2, 0x11, 0xF8, 0xF0, 0x11, 0xE9, 0xFA, 0x2D, 0x1F, 0x20, 0x09, + 0x37, 0x15, 0x55, 0x0E, 0x7D, 0x1B, 0x0E, 0x0C, 0x14, 0x23, 0xCB, 0x12, + 0xD0, 0x1C, 0x0C, 0x11, 0x6F, 0x0B, 0x96, 0x01, 0x8A, 0xF7, 0xD9, 0xF9, + 0x2E, 0xF5, 0xBD, 0xF7, 0xC0, 0x01, 0x8F, 0x00, 0xBF, 0x0D, 0x99, 0x13, + 0x98, 0x08, 0x61, 0x12, 0xC9, 0x0C, 0x31, 0x0F, 0x5E, 0x26, 0x24, 0x1D, + 0xDC, 0x30, 0xC9, 0x2E, 0x10, 0x2E, 0xAD, 0x39, 0x2A, 0x1E, 0x25, 0x3C, + 0x56, 0x0F, 0x20, 0x43, 0x73, 0x12, 0x8E, 0x46, 0x70, 0x10, 0x20, 0x40, + 0x8D, 0x0B, 0xBD, 0x39, 0xDA, 0x0E, 0xFE, 0x30, 0x26, 0x15, 0xC3, 0x14, + 0x18, 0x20, 0xC9, 0x03, 0x15, 0x2E, 0x49, 0x13, 0x7C, 0x33, 0x63, 0x15, + 0xB7, 0x32, 0x31, 0x07, 0xD9, 0x3E, 0xBA, 0x0B, 0x27, 0x4D, 0xAF, 0x1F, + 0x30, 0x3D, 0x6E, 0x1B, 0x8E, 0x2C, 0x77, 0x19, 0x6D, 0x25, 0x6C, 0x21, + 0xE0, 0x1B, 0x98, 0x17, 0x7D, 0x0B, 0x25, 0x09, 0xAC, 0xFF, 0x22, 0x02, + 0xE5, 0x05, 0x16, 0x07, 0x28, 0x06, 0x22, 0x07, 0x35, 0x0C, 0x0C, 0x07, + 0xA9, 0x1A, 0xF7, 0x15, 0x43, 0x1D, 0xA4, 0x0D, 0x26, 0x21, 0xBE, 0xFE, + 0x77, 0x24, 0xDC, 0x07, 0x2A, 0x18, 0x20, 0x11, 0xF9, 0x14, 0x2B, 0x0B, + 0x92, 0x18, 0x4D, 0x00, 0x7B, 0x05, 0x03, 0x08, 0xAE, 0xF6, 0x2B, 0x12, + 0xB4, 0xF5, 0xEF, 0x0F, 0xF1, 0xF1, 0x32, 0x0C, 0xF5, 0xEA, 0x89, 0x09, + 0xA0, 0xE4, 0x3B, 0x0C, 0x96, 0xEA, 0x74, 0x12, 0x09, 0xF9, 0x5D, 0x11, + 0x3F, 0xFD, 0x2A, 0x0E, 0x48, 0xFF, 0x8A, 0x11, 0x5E, 0x05, 0xFB, 0x10, + 0xF7, 0xF9, 0xB2, 0x0B, 0xEB, 0xEA, 0xE8, 0xFF, 0x94, 0xEC, 0x1C, 0xF4, + 0x5D, 0xF1, 0xB4, 0xEC, 0xAC, 0xEF, 0xC8, 0xE2, 0xB2, 0x02, 0x15, 0xE1, + 0xF5, 0x0E, 0x93, 0xDF, 0x00, 0xFA, 0xCA, 0xD5, 0xA0, 0xF5, 0x79, 0xD8, + 0xC5, 0xFC, 0xD3, 0xE4, 0x76, 0x03, 0xFE, 0xF4, 0xAF, 0x06, 0x64, 0xF8, + 0x95, 0x07, 0x15, 0xEF, 0xFF, 0x0A, 0x4B, 0xFA, 0x26, 0x02, 0x21, 0xFE, + 0x24, 0xF6, 0x78, 0xF9, 0x95, 0xE7, 0xB5, 0xFE, 0x9D, 0xDA, 0x86, 0xF2, + 0x90, 0xD6, 0xA5, 0xDE, 0xBC, 0xDA, 0x4E, 0xD8, 0x70, 0xDD, 0x14, 0xDB, + 0xE7, 0xDF, 0xDA, 0xDE, 0xA8, 0xE6, 0x11, 0xE5, 0x6E, 0xF3, 0x84, 0xE9, + 0xB7, 0xF4, 0x23, 0xE3, 0xF9, 0xDF, 0x87, 0xD7, 0x3D, 0xD9, 0xB3, 0xDD, + 0x06, 0xD7, 0x1F, 0xE2, 0xC1, 0xD8, 0x5A, 0xD3, 0x04, 0xDD, 0x04, 0xCA, + 0xF6, 0xD9, 0x1B, 0xD2, 0xED, 0xD2, 0x31, 0xD3, 0xA1, 0xBC, 0xA7, 0xC6, + 0xC4, 0xB5, 0x6C, 0xCB, 0x89, 0xC9, 0xCC, 0xCE, 0xCE, 0xDC, 0x24, 0xCF, + 0x06, 0xEB, 0x7D, 0xE9, 0xB9, 0xEC, 0xE3, 0xF4, 0xA0, 0xE4, 0x60, 0xE5, + 0xD7, 0xD8, 0xC1, 0xDB, 0x70, 0xCC, 0x42, 0xE2, 0x9E, 0xC4, 0xFD, 0xEA, + 0xB8, 0xB4, 0x5C, 0xE4, 0x5B, 0xB9, 0x36, 0xE2, 0x18, 0xC7, 0x47, 0xDF, + 0xED, 0xC6, 0xE9, 0xD8, 0x4A, 0xC7, 0x52, 0xD6, 0x54, 0xC6, 0x8B, 0xD4, + 0x58, 0xC9, 0xCB, 0xD8, 0x60, 0xD7, 0x93, 0xDA, 0x18, 0xF1, 0x50, 0xE3, + 0x19, 0xFC, 0x6F, 0xF5, 0x85, 0xF8, 0x56, 0xFB, 0x3E, 0x01, 0x27, 0xEB, + 0x06, 0x0E, 0xE9, 0xDB, 0x23, 0x05, 0x2C, 0xDF, 0xEC, 0xF9, 0xA1, 0xE8, + 0xF5, 0x02, 0x5F, 0xE6, 0x99, 0x08, 0x43, 0xE7, 0x98, 0x06, 0xC0, 0xEC, + 0x85, 0x08, 0xC5, 0xE9, 0x40, 0x11, 0x90, 0xF0, 0xB3, 0x13, 0x9F, 0xF9, + 0xB4, 0x13, 0x8C, 0xFF, 0x60, 0x0E, 0x85, 0x08, 0xAF, 0xFF, 0xC6, 0x14, + 0xD0, 0x05, 0x08, 0x1F, 0xBD, 0x1A, 0x12, 0x21, 0x64, 0x2A, 0xBC, 0x1F, + 0x60, 0x22, 0xAE, 0x24, 0xC7, 0x0F, 0x28, 0x31, 0xD9, 0x02, 0x48, 0x29, + 0x14, 0xF6, 0xA4, 0x18, 0x01, 0xF7, 0x31, 0x14, 0x50, 0x01, 0x63, 0x21, + 0x1F, 0x0D, 0x84, 0x23, 0xA2, 0x18, 0xA8, 0x15, 0x37, 0x1E, 0xA7, 0x1A, + 0x7A, 0x19, 0xDA, 0x1F, 0x3F, 0x0C, 0x64, 0x22, 0xD2, 0x08, 0x87, 0x15, + 0xAF, 0x13, 0xB1, 0x03, 0x4B, 0x14, 0x1A, 0x10, 0xD5, 0x0C, 0x57, 0x1C, + 0x35, 0x07, 0xB5, 0x13, 0x25, 0x00, 0xAA, 0x0A, 0x46, 0xFD, 0x64, 0x0C, + 0x6D, 0xFF, 0xD1, 0x0F, 0xED, 0x07, 0x91, 0x0F, 0x0A, 0x16, 0x95, 0x0E, + 0xB7, 0x1B, 0x82, 0x0C, 0x3B, 0x1A, 0xFB, 0x0D, 0x68, 0x15, 0x63, 0x11, + 0x5F, 0x09, 0x06, 0x10, 0xDE, 0x02, 0xB1, 0x11, 0x5B, 0xFF, 0x94, 0x08, + 0xB9, 0xF7, 0x3F, 0x01, 0x41, 0xEF, 0x34, 0x03, 0xC1, 0xF4, 0xEC, 0xF0, + 0xE8, 0xFD, 0x37, 0xDB, 0x36, 0xFC, 0x7F, 0xDF, 0xFD, 0xFE, 0x6F, 0xF5, + 0xF6, 0x05, 0xF0, 0xF8, 0xEB, 0x07, 0x25, 0xF5, 0x95, 0x07, 0x48, 0x00, + 0xAE, 0x10, 0xDA, 0x00, 0xBA, 0x0A, 0x33, 0x02, 0x2E, 0xFE, 0xD7, 0x0A, + 0x97, 0xFF, 0x6B, 0xFA, 0x35, 0x00, 0x14, 0xEF, 0x4C, 0x01, 0x59, 0xFB, + 0xCC, 0x02, 0x14, 0x02, 0x52, 0x01, 0xDB, 0xFA, 0xC1, 0xFF, 0xC3, 0xF2, + 0x5D, 0xFF, 0x09, 0xFE, 0xA1, 0x0A, 0xE2, 0x0B, 0x5C, 0x1D, 0xC1, 0x0A, + 0x4D, 0x18, 0xA2, 0x06, 0x47, 0x0E, 0xDF, 0x0E, 0xFD, 0x14, 0xA9, 0x17, + 0xAD, 0x16, 0x78, 0x15, 0xD6, 0x0B, 0x63, 0x1C, 0xBA, 0xFA, 0x5C, 0x20, + 0xE8, 0xEC, 0x7A, 0x12, 0x15, 0xEB, 0xD6, 0x07, 0x2D, 0xEB, 0xA2, 0x0A, + 0xEF, 0xE5, 0x13, 0x15, 0xFB, 0xED, 0x43, 0x1D, 0xE1, 0x0A, 0xA5, 0x23, + 0x16, 0x20, 0x59, 0x18, 0x4C, 0x25, 0x04, 0x0A, 0xE9, 0x25, 0x1B, 0x0F, + 0x6F, 0x1F, 0xA7, 0x09, 0x9C, 0x1A, 0x7F, 0x03, 0x6C, 0x18, 0xFC, 0xF8, + 0x88, 0x1C, 0x8D, 0xF5, 0xA3, 0x1F, 0xED, 0x07, 0x3D, 0x12, 0xAD, 0x03, + 0xB9, 0x0B, 0xBB, 0xFF, 0xD4, 0x06, 0x49, 0x03, 0x5B, 0x01, 0x64, 0x0C, + 0x0F, 0x09, 0x67, 0x1D, 0x2E, 0x14, 0xC5, 0x1A, 0x87, 0x23, 0x87, 0x1F, + 0xFE, 0x22, 0x61, 0x32, 0x5D, 0x17, 0x8E, 0x3E, 0x74, 0x1C, 0x40, 0x3C, + 0xE7, 0x28, 0x6D, 0x2F, 0xC4, 0x2B, 0x37, 0x22, 0xE0, 0x24, 0xCB, 0x16, + 0xE8, 0x20, 0xC4, 0x16, 0x74, 0x19, 0x89, 0x1D, 0xC0, 0x0D, 0xDD, 0x14, + 0xB7, 0x16, 0xEE, 0x13, 0x4E, 0x1D, 0xFF, 0x18, 0xFD, 0x17, 0x50, 0x19, + 0xC5, 0x1F, 0x6F, 0x21, 0x90, 0x29, 0x9F, 0x19, 0x36, 0x33, 0xB2, 0x1F, + 0x00, 0x2C, 0x1E, 0x2A, 0x21, 0x22, 0xDB, 0x21, 0x9D, 0x27, 0x92, 0x1E, + 0x8D, 0x1D, 0xB7, 0x1A, 0xF9, 0x14, 0xEB, 0x1A, 0x88, 0x16, 0x28, 0x15, + 0xF7, 0x0D, 0x11, 0x0F, 0xAC, 0x07, 0xFA, 0x0E, 0x57, 0x0E, 0x56, 0x0B, + 0xC8, 0x1B, 0x4D, 0x0D, 0x14, 0x19, 0xD9, 0x07, 0xF5, 0x1B, 0x3C, 0x0D, + 0x3A, 0x28, 0x75, 0x20, 0xAC, 0x24, 0x53, 0x27, 0x16, 0x21, 0x2F, 0x22, + 0x1E, 0x1D, 0xA3, 0x1E, 0xC5, 0x0C, 0xD4, 0x1A, 0xE5, 0x04, 0xE6, 0x14, + 0x74, 0x07, 0x92, 0x0B, 0xCD, 0xFE, 0xF1, 0x00, 0xD7, 0xF5, 0x8F, 0xF7, + 0xA7, 0xFB, 0x51, 0xF7, 0xD9, 0x01, 0xC6, 0x04, 0xF7, 0xFA, 0xD4, 0x09, + 0x12, 0x03, 0x21, 0x0C, 0x4D, 0x0A, 0x11, 0x06, 0x0C, 0xFC, 0xD0, 0x04, + 0x4A, 0xFD, 0x18, 0x0A, 0x4F, 0xF9, 0x04, 0xF7, 0x48, 0xF6, 0xD7, 0xF4, + 0xBB, 0xF7, 0xD7, 0xF7, 0xAB, 0xF0, 0x63, 0xDF, 0xEE, 0xF6, 0x16, 0xD4, + 0x86, 0xEC, 0x39, 0xDD, 0xE2, 0xE3, 0x29, 0xE4, 0xEC, 0xEF, 0x50, 0xE6, + 0x44, 0xF7, 0xE9, 0xF5, 0x53, 0xF4, 0x1B, 0xFF, 0x89, 0xF8, 0xF9, 0xFE, + 0xF0, 0x01, 0x42, 0xFD, 0x6B, 0xE8, 0x05, 0xEA, 0x5C, 0xD3, 0x91, 0xE6, + 0xAE, 0xDA, 0x69, 0xEC, 0x27, 0xD8, 0x36, 0xE7, 0x72, 0xD7, 0x5D, 0xE9, + 0x86, 0xDC, 0x84, 0xE2, 0x22, 0xD0, 0xF3, 0xD0, 0x60, 0xCC, 0xA8, 0xDB, + 0x4C, 0xD4, 0x64, 0xDE, 0xB5, 0xDC, 0xD9, 0xC7, 0xE8, 0xE4, 0x28, 0xC3, + 0x63, 0xDC, 0x4F, 0xC8, 0x8F, 0xD3, 0x4D, 0xCC, 0xEF, 0xD7, 0xA4, 0xD9, + 0xB6, 0xD4, 0x2E, 0xDA, 0x23, 0xD2, 0x92, 0xC6, 0xD5, 0xE0, 0xE1, 0xC3, + 0x1B, 0xE0, 0xCD, 0xCB, 0x0E, 0xD6, 0x8C, 0xC5, 0x81, 0xDA, 0xD2, 0xBF, + 0x24, 0xE1, 0x6F, 0xC7, 0x14, 0xEB, 0x8E, 0xD7, 0xFC, 0xF4, 0x37, 0xDD, + 0xBF, 0xF1, 0xED, 0xCF, 0x6C, 0xE2, 0xA0, 0xD1, 0xBC, 0xD4, 0xDF, 0xDC, + 0xDF, 0xCE, 0x50, 0xD5, 0xBA, 0xC4, 0xAE, 0xD4, 0x08, 0xBD, 0x2D, 0xE6, + 0xDB, 0xC1, 0x85, 0xEF, 0xF7, 0xD2, 0xA7, 0xEC, 0xBC, 0xD2, 0x70, 0xE8, + 0x1E, 0xC7, 0x69, 0xED, 0xF4, 0xD4, 0xC1, 0xF6, 0x8C, 0xE9, 0xC9, 0xFA, + 0x6D, 0xF8, 0x68, 0xF7, 0xE9, 0x02, 0xC5, 0xEE, 0x1D, 0xFE, 0x4F, 0xEA, + 0x7E, 0xF3, 0x38, 0xE7, 0xFB, 0xF7, 0xCD, 0xE7, 0x97, 0xF7, 0x3E, 0xE3, + 0x18, 0xF0, 0xF1, 0xEE, 0x49, 0xF0, 0x80, 0x04, 0x32, 0xF5, 0x9A, 0xF7, + 0x97, 0xF5, 0xF3, 0xF5, 0x8E, 0xE8, 0x19, 0x00, 0xAD, 0xF0, 0x7A, 0x03, + 0xB2, 0x08, 0x36, 0x0C, 0xED, 0x05, 0xB5, 0x02, 0x43, 0x0A, 0x8D, 0xFD, + 0x5A, 0x15, 0x0A, 0xFA, 0xD7, 0x0B, 0x50, 0xFB, 0xD6, 0x08, 0x87, 0x0A, + 0x5E, 0x0A, 0x3B, 0x03, 0x4D, 0x0E, 0x9D, 0xFE, 0x78, 0x05, 0xAE, 0x07, + 0x48, 0xFB, 0xF1, 0x0E, 0xB6, 0x01, 0xC0, 0x0B, 0x92, 0xFD, 0x9E, 0x0D, + 0x28, 0x09, 0xE3, 0x24, 0xDB, 0x15, 0x34, 0x2A, 0x26, 0x10, 0x2C, 0x20, + 0xD5, 0x15, 0x10, 0x15, 0xA4, 0x13, 0x56, 0x06, 0x22, 0x1A, 0x51, 0x00, + 0x75, 0x20, 0x91, 0xFF, 0x69, 0x11, 0xE7, 0x01, 0x6A, 0x13, 0xC5, 0x04, + 0x0C, 0x07, 0x0D, 0x04, 0xD2, 0xEA, 0xB5, 0x12, 0xF6, 0xE7, 0xB7, 0x1A, + 0x1D, 0xF3, 0xB0, 0x15, 0xF2, 0x0B, 0x0F, 0x1F, 0xCA, 0x22, 0x8C, 0x2B, + 0x8E, 0x21, 0xC5, 0x29, 0x06, 0x18, 0x32, 0x1A, 0xE0, 0x08, 0x84, 0x0F, + 0xB9, 0x07, 0x82, 0x0B, 0x4F, 0x0E, 0xD8, 0x02, 0xB4, 0x0D, 0xAE, 0xF9, + 0x77, 0x09, 0x2C, 0xE9, 0x74, 0xF7, 0x3A, 0xD3, 0x25, 0xFA, 0x04, 0xD8, + 0x7F, 0x06, 0x37, 0xE9, 0x55, 0x00, 0x10, 0xE5, 0xC0, 0x0D, 0x77, 0xF0, + 0x0B, 0x0C, 0x00, 0x0A, 0xE8, 0x01, 0x2A, 0x18, 0xCC, 0x06, 0x88, 0x0E, + 0x09, 0xFF, 0x55, 0xFD, 0x1C, 0xFA, 0x5E, 0x06, 0x5B, 0xF0, 0xFA, 0x01, + 0xA0, 0xEA, 0x54, 0xF6, 0x51, 0xE8, 0x73, 0xF8, 0xE3, 0xDA, 0x81, 0xEF, + 0xA1, 0xDF, 0x70, 0xE5, 0x9A, 0xEC, 0x43, 0xE5, 0xAF, 0xF9, 0xFC, 0xEF, + 0xF7, 0x05, 0x52, 0xFA, 0x6E, 0x0A, 0x6F, 0x04, 0x4E, 0x0B, 0xB2, 0x04, + 0x84, 0x07, 0x05, 0xFA, 0x5B, 0x0F, 0x02, 0xFD, 0x13, 0x0F, 0xDA, 0xFD, + 0x64, 0x04, 0x8F, 0xF6, 0x63, 0xF5, 0x22, 0xF2, 0xEC, 0xD8, 0x4C, 0xE8, + 0x9B, 0xD0, 0x03, 0xEB, 0x71, 0xD3, 0x2B, 0xEC, 0x0B, 0xE3, 0xF2, 0xEC, + 0xBA, 0xF4, 0xEC, 0xFF, 0x87, 0x04, 0xE2, 0x0B, 0xFC, 0x20, 0xD7, 0x0B, + 0x11, 0x2A, 0x51, 0x16, 0x51, 0x22, 0x96, 0x1F, 0x79, 0x1D, 0xC8, 0x10, + 0xC0, 0x1A, 0x06, 0x06, 0x88, 0x11, 0x72, 0x09, 0x5C, 0x08, 0xF8, 0x0D, + 0xFB, 0x04, 0xC3, 0x0B, 0x63, 0x06, 0x83, 0x06, 0xAC, 0x0C, 0xE3, 0x0D, + 0x82, 0x13, 0x3B, 0x16, 0xD6, 0x1C, 0x42, 0x1C, 0x57, 0x20, 0x85, 0x2B, + 0x60, 0x22, 0xFC, 0x36, 0x10, 0x27, 0x85, 0x38, 0xE9, 0x2A, 0xD7, 0x3E, + 0xFA, 0x22, 0xF7, 0x33, 0x0C, 0x21, 0x5D, 0x22, 0x84, 0x1B, 0x45, 0x29, + 0xDA, 0x0E, 0x8A, 0x22, 0x1B, 0x14, 0x22, 0x11, 0xBB, 0x18, 0x2E, 0x1B, + 0x67, 0x25, 0x65, 0x27, 0xC1, 0x39, 0x5B, 0x28, 0x3F, 0x43, 0x2C, 0x27, + 0x6E, 0x3E, 0x1E, 0x22, 0x74, 0x38, 0x74, 0x1A, 0xBB, 0x38, 0x59, 0x1E, + 0x73, 0x20, 0xB0, 0x29, 0xF9, 0x07, 0xC2, 0x25, 0x6A, 0x0D, 0x4D, 0x22, + 0xFD, 0x0E, 0xE5, 0x1D, 0xBD, 0x10, 0xD8, 0x1C, 0xCC, 0x12, 0x4C, 0x28, + 0x3A, 0x0B, 0xD8, 0x1C, 0xEF, 0x12, 0x54, 0x14, 0x81, 0x13, 0x6F, 0x29, + 0x99, 0xFD, 0xB8, 0x28, 0x78, 0x05, 0x6B, 0x1B, 0x0E, 0x18, 0x6F, 0x1F, + 0xD1, 0x24, 0x71, 0x18, 0x21, 0x31, 0x27, 0x0B, 0x85, 0x1D, 0x52, 0x02, + 0x12, 0x10, 0x68, 0xFB, 0xBE, 0x0F, 0x3E, 0xF1, 0x6C, 0x00, 0x95, 0xEA, + 0xFA, 0xF6, 0xF8, 0xFA, 0x9D, 0x08, 0x2A, 0x04, 0x7E, 0x1C, 0x03, 0xFD, + 0x93, 0x15, 0x07, 0x00, 0xFA, 0x09, 0xBA, 0xFC, 0xDA, 0xFC, 0x8C, 0xEA, + 0xEB, 0x01, 0xCF, 0xEF, 0xDB, 0x15, 0xD2, 0x02, 0xDF, 0x0F, 0x71, 0x09, + 0x41, 0x11, 0xF2, 0x11, 0x85, 0x15, 0xF9, 0x13, 0xC7, 0x00, 0x4F, 0x04, + 0x9C, 0xFD, 0x5F, 0xF9, 0x45, 0xF7, 0xD6, 0xF5, 0x5C, 0xDF, 0x60, 0xFA, + 0x6A, 0xEE, 0xA1, 0x04, 0x64, 0xFF, 0x8A, 0x00, 0x02, 0xFB, 0xDD, 0x08, + 0x14, 0xFB, 0x48, 0x10, 0x1B, 0xFA, 0x85, 0x09, 0xE4, 0xFB, 0x83, 0x05, + 0xE2, 0xFE, 0x19, 0x04, 0x34, 0xF9, 0xF1, 0x0A, 0x0A, 0xEA, 0x9A, 0x02, + 0xC9, 0xE9, 0xD9, 0xF6, 0x04, 0xF5, 0xB0, 0xEF, 0x63, 0xF3, 0xD9, 0xDF, + 0x22, 0xEE, 0x42, 0xE6, 0xE6, 0xE9, 0xBB, 0xF1, 0x8D, 0xE4, 0x9D, 0xE7, + 0xB1, 0xEB, 0x03, 0xDF, 0x36, 0xED, 0x02, 0xD2, 0x0D, 0xE2, 0xC5, 0xC8, + 0x5F, 0xE2, 0x05, 0xD1, 0x5E, 0xEE, 0xAA, 0xD6, 0x23, 0xEC, 0x76, 0xCD, + 0xD9, 0xD5, 0x37, 0xC0, 0xE2, 0xC1, 0x01, 0xD2, 0xEC, 0xBF, 0xB2, 0xDF, + 0x97, 0xD3, 0x52, 0xD1, 0x25, 0xD8, 0x8F, 0xC9, 0x97, 0xD1, 0xB3, 0xD7, + 0xAD, 0xCE, 0x94, 0xE4, 0x6E, 0xD2, 0x12, 0xDF, 0x04, 0xDE, 0x72, 0xDD, + 0xDC, 0xDF, 0x27, 0xD7, 0xDA, 0xD8, 0xDE, 0xD1, 0xBE, 0xD9, 0xE7, 0xDE, + 0x49, 0xDE, 0x34, 0xDD, 0xD5, 0xCC, 0xC7, 0xD4, 0x54, 0xBB, 0x90, 0xD1, + 0x85, 0xB9, 0x20, 0xCE, 0x79, 0xC0, 0x81, 0xD0, 0x6D, 0xC7, 0x1A, 0xCE, + 0xFF, 0xC4, 0xC0, 0xC8, 0xD4, 0xC9, 0x10, 0xCD, 0xF0, 0xCF, 0x1E, 0xDC, + 0x89, 0xD9, 0xBC, 0xDA, 0xD6, 0xEE, 0xC9, 0xDC, 0xD5, 0xF3, 0x12, 0xEF, + 0x19, 0xF1, 0xE5, 0xF7, 0x46, 0xFA, 0xD2, 0xF6, 0xBD, 0xF9, 0xD3, 0xE7, + 0xF3, 0xED, 0x3D, 0xE6, 0x51, 0xF6, 0x49, 0xFC, 0x42, 0xFC, 0xEA, 0x04, + 0x23, 0xF4, 0xF6, 0x01, 0x49, 0xFA, 0x0F, 0x09, 0xC8, 0xFD, 0xB0, 0x04, + 0x93, 0xFF, 0x29, 0x02, 0x9C, 0xFF, 0x4D, 0x00, 0x9B, 0x03, 0xB3, 0xFD, + 0xD0, 0x01, 0x67, 0xFB, 0xFC, 0x03, 0x4B, 0xF3, 0xFC, 0x13, 0x5E, 0x03, + 0x8B, 0x11, 0x32, 0x1A, 0xC8, 0x16, 0x26, 0x18, 0xD3, 0x1E, 0xD3, 0x01, + 0x2D, 0x21, 0xD7, 0x01, 0x00, 0x22, 0x75, 0x0C, 0xF0, 0x11, 0xA2, 0xFF, + 0xEE, 0x05, 0x85, 0xF8, 0xF3, 0x07, 0xBE, 0xFC, 0xC3, 0x0A, 0xDA, 0x07, + 0xA1, 0x11, 0xDE, 0x0C, 0x12, 0x18, 0x31, 0x05, 0x31, 0x1B, 0x4A, 0x0B, + 0x83, 0x1D, 0xB7, 0x0A, 0x9A, 0x17, 0x0E, 0xFD, 0x52, 0x12, 0x78, 0x0F, + 0x8D, 0x0B, 0xD7, 0x26, 0xC2, 0x04, 0x4C, 0x1E, 0xD4, 0x06, 0x26, 0x1F, + 0xB5, 0xF4, 0x7D, 0x25, 0x46, 0xDE, 0xD4, 0x1B, 0xC9, 0xEA, 0x07, 0x1E, + 0xDC, 0xF3, 0x8E, 0x1F, 0xB8, 0xF2, 0xBC, 0x1C, 0xB6, 0xFD, 0xE0, 0x22, + 0x9B, 0x03, 0xF5, 0x22, 0x89, 0xFD, 0xBB, 0x15, 0x49, 0xFF, 0x42, 0x12, + 0x6A, 0x03, 0x68, 0x10, 0x83, 0xF6, 0x97, 0xFD, 0x18, 0xF1, 0xEB, 0xED, + 0x27, 0xF8, 0x54, 0xDF, 0x5D, 0x08, 0x5F, 0xDD, 0xAD, 0x0A, 0xE3, 0xE1, + 0xD6, 0x08, 0x1F, 0xEA, 0x11, 0x1B, 0x60, 0xF0, 0x77, 0x1C, 0x4C, 0xE4, + 0x63, 0x12, 0xA2, 0xDD, 0x8E, 0x16, 0x01, 0xE7, 0x85, 0x16, 0xB8, 0xF3, + 0xAF, 0x01, 0xB6, 0xF2, 0x64, 0x0A, 0x57, 0xFC, 0x46, 0x1D, 0x41, 0x09, + 0x96, 0x02, 0xF3, 0x01, 0x1E, 0xF2, 0x19, 0x01, 0x00, 0xF0, 0x99, 0xFC, + 0x9B, 0xEE, 0x15, 0xFF, 0x05, 0xF5, 0x3B, 0x09, 0x40, 0x00, 0x70, 0x0D, + 0x22, 0x08, 0x27, 0x0C, 0xA1, 0x08, 0xD4, 0x06, 0xA9, 0x12, 0x63, 0x09, + 0x5E, 0x18, 0x49, 0x0B, 0xF5, 0x0B, 0x64, 0x05, 0x5F, 0x04, 0x0F, 0x0D, + 0xDD, 0xFC, 0xE6, 0x0D, 0x67, 0xF3, 0x57, 0x03, 0x24, 0xF4, 0x53, 0x0B, + 0x39, 0xED, 0x1D, 0x11, 0x84, 0xF5, 0xD8, 0x17, 0x7E, 0x02, 0xD5, 0x13, + 0x26, 0xFE, 0xE6, 0xFF, 0x28, 0xFF, 0x3A, 0xFB, 0x00, 0xFF, 0x57, 0x00, + 0x9D, 0x04, 0x77, 0x08, 0xFD, 0x10, 0x9A, 0x14, 0xC1, 0x15, 0x20, 0x19, + 0xA3, 0x0E, 0xE8, 0x12, 0x59, 0x06, 0x44, 0x12, 0x94, 0x04, 0x55, 0x19, + 0xB6, 0x00, 0x6E, 0x22, 0x82, 0xFE, 0x7D, 0x1D, 0xA3, 0x11, 0x7F, 0x25, + 0x39, 0x17, 0xBB, 0x2B, 0x5D, 0x1B, 0x22, 0x29, 0x84, 0x1E, 0x6D, 0x20, + 0x9F, 0x12, 0xA0, 0x0E, 0xAF, 0x11, 0xB7, 0x15, 0x89, 0x09, 0xD4, 0x18, + 0x17, 0x11, 0x5D, 0x1A, 0x3A, 0x1F, 0xDA, 0x19, 0x82, 0x1B, 0xF2, 0x11, + 0x22, 0x1E, 0xE4, 0x14, 0x13, 0x27, 0x6C, 0x15, 0xBD, 0x28, 0x3E, 0x0D, + 0xDC, 0x2C, 0x91, 0x0A, 0x1F, 0x3E, 0x5C, 0x0C, 0x2B, 0x47, 0xEC, 0x08, + 0x27, 0x3A, 0x43, 0x05, 0xF2, 0x33, 0xA1, 0x0B, 0xEA, 0x34, 0x1A, 0x13, + 0x88, 0x28, 0xE8, 0x0C, 0xF7, 0x26, 0x1E, 0x13, 0x00, 0x29, 0x7B, 0x14, + 0xB4, 0x2C, 0x76, 0x12, 0x80, 0x27, 0x0C, 0x27, 0xAB, 0x15, 0x88, 0x35, + 0xD1, 0x12, 0xF6, 0x3F, 0x2E, 0x09, 0x09, 0x3D, 0x4E, 0x0A, 0xFC, 0x38, + 0x12, 0x1A, 0xC3, 0x36, 0x9B, 0x14, 0x40, 0x29, 0xFB, 0x02, 0x19, 0x22, + 0xB1, 0x02, 0xC4, 0x19, 0x79, 0x0B, 0xF5, 0x15, 0xCE, 0xFE, 0x9D, 0x0D, + 0xF5, 0x04, 0xDE, 0x0B, 0x05, 0x1B, 0xE1, 0x18, 0x3B, 0x14, 0x0E, 0x14, + 0x06, 0x0E, 0xBA, 0x11, 0xB5, 0x0F, 0x14, 0x11, 0x43, 0x07, 0x3A, 0x08, + 0xB9, 0xFF, 0x0A, 0x04, 0xA4, 0x04, 0x12, 0xF5, 0xA3, 0x0D, 0x10, 0xEF, + 0x6A, 0x0D, 0x4B, 0xFC, 0x0D, 0x0F, 0x1A, 0xFF, 0x93, 0x17, 0x0D, 0xFA, + 0x30, 0x14, 0xF7, 0xF0, 0xC8, 0x0D, 0x21, 0xF0, 0xB5, 0x02, 0xE3, 0xF1, + 0x8C, 0xFE, 0xF1, 0xF4, 0x89, 0xFF, 0xC4, 0xF7, 0x3D, 0xF7, 0xA9, 0xF1, + 0x20, 0xFB, 0xC1, 0xF6, 0xD7, 0xF5, 0x7B, 0xFD, 0xB8, 0xE6, 0x0A, 0x05, + 0x61, 0xE5, 0x24, 0x03, 0x61, 0xDA, 0x36, 0xEA, 0xA7, 0xD7, 0x2C, 0xF5, + 0x75, 0xDF, 0xE6, 0x04, 0xAF, 0xEA, 0x59, 0xF4, 0x8F, 0xF5, 0x68, 0xEA, + 0x8C, 0xF8, 0x1E, 0xED, 0x06, 0xFC, 0xD7, 0xF5, 0x08, 0xF1, 0x57, 0xF2, + 0x97, 0xE9, 0x54, 0xEE, 0x47, 0xE4, 0xF0, 0xF1, 0x16, 0xDC, 0xFB, 0xF3, + 0xA9, 0xDF, 0x84, 0xF3, 0x9E, 0xE8, 0xDC, 0xE5, 0xB2, 0xE6, 0x77, 0xC8, + 0xCF, 0xDB, 0xA6, 0xC3, 0xD1, 0xD2, 0xE7, 0xD8, 0xDA, 0xC8, 0x6F, 0xD4, + 0x2C, 0xD6, 0x9E, 0xC5, 0x14, 0xE2, 0xEA, 0xCA, 0x7E, 0xE9, 0x6D, 0xEC, + 0x3B, 0xEF, 0x5F, 0xEE, 0xA6, 0xEE, 0x70, 0xE1, 0x61, 0xE8, 0xE2, 0xEF, + 0xC5, 0xD3, 0x92, 0xF4, 0xC4, 0xD0, 0xC0, 0xF4, 0x5A, 0xCE, 0x3A, 0xE7, + 0xA6, 0xD1, 0x3F, 0xE5, 0xDD, 0xDD, 0x1E, 0xE5, 0x34, 0xDC, 0xBD, 0xD3, + 0x1F, 0xDB, 0xCD, 0xD2, 0x24, 0xD7, 0x63, 0xC6, 0x4A, 0xD8, 0x90, 0xB7, + 0x2F, 0xDF, 0x7D, 0xBA, 0x88, 0xE0, 0xA9, 0xB2, 0x93, 0xE0, 0x03, 0xAF, + 0x9A, 0xDF, 0x3A, 0xC2, 0x18, 0xD8, 0x64, 0xCB, 0x73, 0xD1, 0xE1, 0xC9, + 0x05, 0xC4, 0x6F, 0xCC, 0xD1, 0xC3, 0xE2, 0xD7, 0xA8, 0xCE, 0x1F, 0xD6, + 0x79, 0xD3, 0x6B, 0xD5, 0xD0, 0xE7, 0x0E, 0xF1, 0xD7, 0xF1, 0xEE, 0xEF, + 0xB4, 0x07, 0x96, 0xE8, 0xCC, 0x12, 0x8E, 0xEC, 0xAA, 0xFD, 0xB3, 0xEE, + 0x68, 0xF7, 0x84, 0xF1, 0x01, 0xEF, 0xAF, 0xEA, 0x9B, 0xEF, 0xC0, 0xFD, + 0xC1, 0xE9, 0x31, 0x08, 0x61, 0xDF, 0xBA, 0xFC, 0xAA, 0xE5, 0x84, 0x02, + 0x5A, 0xDF, 0x50, 0x0D, 0x7E, 0xDC, 0x64, 0x11, 0x18, 0xD7, 0xFE, 0x07, + 0x9D, 0xE3, 0x9F, 0x15, 0xFD, 0x02, 0x33, 0x17, 0x07, 0x0F, 0x94, 0xF6, + 0xE0, 0x13, 0x6E, 0xFD, 0x0A, 0x0E, 0xF4, 0x08, 0xE8, 0x0B, 0xFF, 0xFD, + 0xC0, 0x0C, 0x01, 0xFA, 0x06, 0x0B, 0x31, 0xFC, 0x99, 0x0A, 0xCB, 0xFA, + 0x67, 0x08, 0x45, 0xEF, 0x97, 0x13, 0xAE, 0xEF, 0x4A, 0x23, 0x12, 0xFF, + 0x29, 0x26, 0x62, 0x0E, 0xE5, 0x29, 0x12, 0x1D, 0xA3, 0x2D, 0x88, 0x1D, + 0x15, 0x20, 0x43, 0x0E, 0x7F, 0x0F, 0x3B, 0x04, 0x9D, 0x03, 0x6A, 0x04, + 0x65, 0xFC, 0xC4, 0x02, 0xE8, 0x00, 0x3C, 0x05, 0xB1, 0x0C, 0x6D, 0x1B, + 0x83, 0x02, 0x44, 0x1C, 0x45, 0xF5, 0xBC, 0x09, 0xC3, 0xFD, 0x58, 0x10, + 0x33, 0xF7, 0x8A, 0x19, 0x33, 0xFA, 0xC5, 0x20, 0xCA, 0x08, 0x39, 0x21, + 0xCF, 0x07, 0xCC, 0x19, 0xDF, 0x12, 0xDD, 0x18, 0x67, 0x12, 0xCF, 0x04, + 0x6F, 0x00, 0x34, 0xF1, 0x40, 0x01, 0xBC, 0xF8, 0x71, 0x07, 0x1B, 0xF5, + 0x42, 0x0C, 0x57, 0xF1, 0x5A, 0x08, 0xDB, 0xF2, 0xA1, 0x00, 0xD8, 0xF0, + 0x53, 0xFA, 0x7C, 0xF3, 0xC1, 0x00, 0xCB, 0x02, 0x56, 0x0A, 0xCE, 0x15, + 0x8B, 0xFC, 0x42, 0x19, 0x54, 0xFC, 0x28, 0x24, 0xCB, 0xF8, 0x54, 0x19, + 0x10, 0xF3, 0x91, 0x05, 0x47, 0xFF, 0x38, 0x02, 0x50, 0xFC, 0x04, 0xFD, + 0xE4, 0xF2, 0x10, 0x02, 0xF7, 0xF8, 0x08, 0x03, 0x94, 0xFD, 0xD9, 0xFD, + 0xF0, 0xF7, 0xE1, 0xFE, 0x7A, 0xF4, 0xD0, 0xF0, 0x4F, 0xFA, 0x92, 0xE5, + 0xC3, 0x0B, 0x5E, 0xF9, 0x27, 0x0C, 0xD2, 0xFD, 0x31, 0x01, 0x1E, 0xED, + 0x2A, 0x02, 0x88, 0xE8, 0xBF, 0xF7, 0xA0, 0xE8, 0x0B, 0xEA, 0x8F, 0xEA, + 0x9E, 0xEC, 0xFC, 0xEB, 0x32, 0x01, 0x6D, 0xF4, 0xA2, 0x0A, 0x98, 0xFB, + 0x8B, 0x0D, 0x68, 0xFD, 0xC6, 0x0F, 0x8C, 0xFF, 0x2E, 0xFC, 0xFA, 0xF1, + 0x18, 0xFD, 0xA6, 0xF3, 0x76, 0x0F, 0x46, 0x05, 0xE8, 0x13, 0x86, 0x0E, + 0x7C, 0x14, 0x56, 0x13, 0x5E, 0x17, 0xBE, 0x10, 0x26, 0x22, 0xE7, 0x14, + 0xFC, 0x23, 0x3D, 0x1F, 0xF0, 0x20, 0x42, 0x25, 0x90, 0x21, 0x2D, 0x2F, + 0xB0, 0x1A, 0xE4, 0x34, 0x58, 0x15, 0x9E, 0x2F, 0x15, 0x13, 0x15, 0x25, + 0xFB, 0x15, 0xE4, 0x2A, 0x19, 0x17, 0xA4, 0x3D, 0xF5, 0x0F, 0xAE, 0x3D, + 0xDF, 0x18, 0x26, 0x43, 0xA8, 0x20, 0x6B, 0x42, 0x92, 0x1F, 0x0C, 0x35, + 0x34, 0x1E, 0x80, 0x2A, 0x80, 0x1B, 0x9E, 0x21, 0x4E, 0x1C, 0x24, 0x1B, + 0x56, 0x26, 0x70, 0x1A, 0x25, 0x34, 0xDB, 0x1E, 0x35, 0x3B, 0xC5, 0x16, + 0xE9, 0x39, 0x23, 0x0B, 0x3A, 0x2E, 0xE2, 0x0D, 0x3C, 0x21, 0x09, 0x0C, + 0xCC, 0x21, 0x85, 0x0A, 0x11, 0x20, 0xF8, 0x0A, 0x5D, 0x1E, 0xA7, 0x12, + 0x1F, 0x1D, 0x0F, 0x1C, 0x90, 0x12, 0x93, 0x15, 0x43, 0x10, 0x05, 0x19, + 0x38, 0x11, 0x84, 0x22, 0xFD, 0x09, 0xF5, 0x16, 0xBB, 0x0E, 0x4D, 0x11, + 0x9C, 0x18, 0x0D, 0x1E, 0x16, 0x14, 0x7D, 0x19, 0xEB, 0x19, 0xD7, 0x0C, + 0xE5, 0x27, 0x49, 0x11, 0x3E, 0x19, 0x4E, 0x0F, 0x2C, 0x03, 0x2D, 0x08, + 0x38, 0x01, 0x41, 0x0C, 0x6C, 0xFE, 0xB3, 0x05, 0x5F, 0xFB, 0x3A, 0x04, + 0x14, 0xF6, 0x4A, 0x10, 0xF9, 0xFE, 0x4B, 0x1E, 0x9C, 0x13, 0xEA, 0x1A, + 0x61, 0x1A, 0x67, 0x06, 0x02, 0x1A, 0x3A, 0x07, 0x43, 0x13, 0x20, 0x16, + 0x1D, 0x09, 0x8C, 0x1A, 0x3E, 0x0C, 0x2F, 0x1A, 0x01, 0x1B, 0x4C, 0x23, + 0xBC, 0x1A, 0x01, 0x26, 0x7B, 0x06, 0x74, 0x10, 0xD4, 0x06, 0x7C, 0x09, + 0x3E, 0x07, 0xF5, 0x0C, 0xE4, 0xF1, 0xBA, 0x02, 0x3E, 0xF4, 0x26, 0x03, + 0x9C, 0xFB, 0x0F, 0xFC, 0xB4, 0xFC, 0xCD, 0xF3, 0x24, 0x03, 0x99, 0xF4, + 0x43, 0x06, 0x2D, 0xF7, 0x9F, 0xF7, 0x25, 0xEE, 0x69, 0xE2, 0xCD, 0xDE, + 0x0D, 0xE2, 0xE5, 0xDF, 0x2C, 0xE9, 0x57, 0xDF, 0xE1, 0xE2, 0xF2, 0xD0, + 0x14, 0xD8, 0x71, 0xCA, 0x07, 0xDC, 0xFA, 0xD9, 0xD9, 0xE1, 0xA0, 0xDF, + 0x12, 0xE6, 0x4B, 0xD9, 0x4B, 0xE5, 0x59, 0xD5, 0x26, 0xDD, 0x84, 0xD2, + 0x57, 0xD0, 0xA6, 0xC6, 0xEF, 0xCB, 0x50, 0xBE, 0x8D, 0xD1, 0xBE, 0xCB, + 0x58, 0xCE, 0x99, 0xCF, 0x19, 0xDA, 0xE9, 0xD0, 0x78, 0xE1, 0x00, 0xD3, + 0x8B, 0xD8, 0xE4, 0xCF, 0x87, 0xD5, 0xA7, 0xD6, 0x54, 0xD3, 0xAD, 0xDF, + 0x2B, 0xCC, 0x08, 0xE3, 0x87, 0xCB, 0x69, 0xEE, 0x68, 0xCF, 0x71, 0xF4, + 0xAC, 0xD9, 0x1F, 0xF3, 0x03, 0xDD, 0xC5, 0xED, 0x66, 0xD4, 0xB7, 0xE0, + 0xFD, 0xDB, 0x80, 0xDE, 0xA8, 0xE6, 0xED, 0xDC, 0xD2, 0xE3, 0x6E, 0xD2, + 0xAD, 0xE5, 0x32, 0xD1, 0x34, 0xF4, 0x25, 0xE3, 0xAA, 0xF0, 0x54, 0xDD, + 0xC1, 0xE6, 0x3F, 0xCE, 0x41, 0xE4, 0x58, 0xD7, 0x46, 0xE2, 0x4A, 0xE4, + 0x76, 0xE3, 0xF3, 0xE6, 0xF1, 0xEB, 0xEE, 0xE6, 0xEC, 0xF2, 0x2B, 0xE9, + 0x85, 0xE6, 0x43, 0xE5, 0x1D, 0xE5, 0xE0, 0xF4, 0x03, 0xE7, 0x62, 0xFF, + 0x1A, 0xEB, 0x77, 0xF8, 0x64, 0xFB, 0xAA, 0xFB, 0x40, 0x01, 0xA0, 0x02, + 0xA3, 0x00, 0x2D, 0x05, 0xC8, 0x04, 0x4E, 0x08, 0xC2, 0x10, 0x35, 0x0A, + 0x23, 0x1B, 0x04, 0x05, 0x6A, 0x12, 0xE3, 0xFB, 0x98, 0xFE, 0x0E, 0xF7, + 0x6B, 0x0C, 0xFC, 0x03, 0x23, 0x12, 0x65, 0x03, 0x7B, 0x01, 0x9A, 0xFF, + 0xC0, 0xFF, 0x82, 0x02, 0x61, 0x0D, 0x87, 0x01, 0x16, 0x1F, 0xEF, 0x05, + 0x06, 0x15, 0x23, 0xFE, 0x96, 0x0F, 0x20, 0x09, 0x45, 0x0C, 0x2C, 0x13, + 0x23, 0xF6, 0x73, 0x09, 0xD8, 0xF7, 0x7D, 0x12, 0x42, 0x00, 0x17, 0x0E, + 0x71, 0x02, 0x28, 0x0A, 0x3C, 0x04, 0xF4, 0x13, 0x4F, 0x0B, 0x9C, 0x12, + 0xB1, 0x1A, 0x50, 0x14, 0x1F, 0x10, 0x99, 0x13, 0x8A, 0x0D, 0xC8, 0x1E, + 0x8E, 0x15, 0xB4, 0x2B, 0x0D, 0x0B, 0x18, 0x27, 0x7C, 0x0D, 0x15, 0x2B, + 0x84, 0x0D, 0xB4, 0x25, 0xFA, 0x0D, 0xF2, 0x1D, 0x42, 0x09, 0xBA, 0x16, + 0xD2, 0x01, 0x29, 0x13, 0x09, 0x05, 0xF1, 0x18, 0x4E, 0xFB, 0x8F, 0x0E, + 0x2A, 0xF9, 0xEA, 0x03, 0x8B, 0x04, 0x42, 0xFF, 0x02, 0xFF, 0xFF, 0xEF, + 0x51, 0xFE, 0xB2, 0xEF, 0x1A, 0x08, 0x9B, 0xFC, 0x79, 0x03, 0xDE, 0xFB, + 0x40, 0x04, 0x6D, 0xFF, 0x57, 0xFE, 0xC9, 0xF0, 0x50, 0xF5, 0xD5, 0xE1, + 0x74, 0xF9, 0x70, 0xEC, 0x30, 0xFC, 0xCB, 0xEC, 0x02, 0x07, 0x57, 0xE4, + 0x60, 0x0E, 0xC5, 0xE0, 0x9E, 0x01, 0x63, 0xE1, 0x1B, 0x02, 0xEC, 0xE7, + 0x47, 0x07, 0xDD, 0xE9, 0x5F, 0x00, 0xFD, 0xEF, 0x5A, 0x05, 0x9C, 0x00, + 0xD8, 0x0C, 0xA2, 0x0C, 0x5C, 0x0B, 0x09, 0x1D, 0x52, 0x02, 0x07, 0x2A, + 0x3B, 0xFE, 0x11, 0x27, 0xC2, 0xFC, 0xF2, 0x14, 0x69, 0xE6, 0x74, 0x00, + 0xA7, 0xE4, 0x6C, 0x06, 0xFD, 0xF5, 0x95, 0x07, 0xEE, 0xFE, 0x85, 0x01, + 0x85, 0x08, 0xFC, 0x00, 0xBB, 0x18, 0xF0, 0xF3, 0x3D, 0x2D, 0xAF, 0xF8, + 0xE9, 0x22, 0x57, 0xFF, 0x80, 0x0F, 0xC7, 0xF5, 0xA3, 0x0A, 0x57, 0xF1, + 0xF8, 0xF7, 0x31, 0xF2, 0xD5, 0xF5, 0xC3, 0x05, 0x17, 0xFE, 0x3D, 0x06, + 0x49, 0x03, 0x17, 0xFD, 0xE5, 0x0A, 0x28, 0x11, 0xA1, 0xFD, 0xE5, 0x16, + 0xA8, 0x01, 0x70, 0x1C, 0x25, 0x03, 0x73, 0x1C, 0xC3, 0xF7, 0xEB, 0x19, + 0xA4, 0x03, 0x31, 0x25, 0x15, 0x0A, 0x40, 0x1A, 0x8C, 0x06, 0xEB, 0x13, + 0x83, 0x03, 0x78, 0x0F, 0x96, 0xF8, 0xE7, 0xF9, 0x8E, 0xF1, 0x68, 0xFD, + 0xFE, 0xF1, 0x6F, 0x04, 0xF6, 0xF7, 0xF8, 0xF6, 0x67, 0x0B, 0xC0, 0xF9, + 0x8C, 0x13, 0xBB, 0x03, 0x44, 0x09, 0xA7, 0x03, 0x89, 0x00, 0xA1, 0x03, + 0xC5, 0xFC, 0x40, 0x0B, 0x8D, 0xFF, 0xA2, 0x14, 0x73, 0xFF, 0xF4, 0x11, + 0x92, 0xFF, 0x2C, 0x10, 0x4F, 0x0D, 0x7F, 0x0B, 0x89, 0x14, 0xE4, 0xF5, + 0x95, 0x17, 0xBB, 0xF1, 0x68, 0x15, 0x4E, 0xF7, 0xBF, 0x10, 0x57, 0xF5, + 0x04, 0x18, 0xCA, 0xF5, 0x98, 0x17, 0x6F, 0xFA, 0x97, 0x11, 0x8F, 0x12, + 0x5F, 0x16, 0x26, 0x22, 0x23, 0x20, 0xC9, 0x1A, 0x5B, 0x22, 0x05, 0x18, + 0x28, 0x17, 0x7F, 0x0D, 0x9D, 0x07, 0x9C, 0x07, 0x9A, 0xF4, 0x46, 0x0B, + 0xA8, 0xF6, 0xF9, 0x10, 0x1E, 0x03, 0x33, 0x16, 0x2F, 0xF7, 0x8F, 0x0D, + 0x35, 0xFE, 0x70, 0x11, 0xAB, 0x11, 0x4E, 0x13, 0x3D, 0x06, 0x6C, 0x07, + 0xB9, 0xF4, 0x9A, 0x08, 0xF5, 0xF6, 0xDD, 0xFF, 0x93, 0x02, 0x7A, 0xEF, + 0x2A, 0xFD, 0x0F, 0xE6, 0x21, 0xF9, 0xFE, 0xE2, 0xA1, 0xFF, 0xFA, 0xE3, + 0x07, 0xF9, 0x91, 0xE1, 0xEA, 0xE5, 0x0E, 0xDF, 0xD5, 0xD8, 0xF6, 0xDB, + 0xA9, 0xD8, 0x08, 0xDB, 0xB7, 0xE9, 0xAC, 0xEB, 0x5B, 0xF9, 0x55, 0xF2, + 0x43, 0xF0, 0xE4, 0xDC, 0xE1, 0xE7, 0x42, 0xDB, 0x2F, 0xEC, 0x67, 0xEC, + 0xD6, 0xEB, 0xDE, 0xF0, 0x9F, 0xED, 0x6E, 0xFA, 0x7D, 0xF6, 0x96, 0x0A, + 0x33, 0xF9, 0x96, 0x05, 0x64, 0x02, 0x3B, 0x0B, 0x3A, 0x04, 0xE2, 0x1C, + 0x5D, 0x05, 0x94, 0x1B, 0x62, 0x09, 0x61, 0x0A, 0x10, 0xF3, 0x57, 0xFC, + 0x5B, 0xEA, 0xF6, 0xFE, 0x6B, 0xF9, 0xF8, 0xF6, 0xF5, 0xF8, 0x4A, 0xE4, + 0x0B, 0xF9, 0x7F, 0xE5, 0xB9, 0x03, 0xAB, 0xEB, 0x02, 0x12, 0x24, 0xF2, + 0xD4, 0x16, 0x2C, 0x01, 0x94, 0x0C, 0xDC, 0x0A, 0xC4, 0x0F, 0x48, 0x0B, + 0xB4, 0x15, 0xEA, 0xFF, 0x38, 0x1A, 0x14, 0x01, 0xE7, 0x19, 0x77, 0x00, + 0x30, 0x13, 0xD1, 0xEC, 0xE6, 0x15, 0x09, 0xF2, 0xBE, 0x0A, 0x22, 0x07, + 0xD9, 0xF7, 0x67, 0x01, 0x5E, 0xFA, 0x8F, 0xFB, 0x42, 0x07, 0x12, 0x14, + 0xA2, 0x08, 0x72, 0x1D, 0xB7, 0xF7, 0x24, 0x08, 0xD9, 0xEB, 0xE4, 0x06, + 0x69, 0xE2, 0xCE, 0x0B, 0xE1, 0xD2, 0xDF, 0xFD, 0x86, 0xD9, 0x09, 0xFD, + 0xF5, 0xE7, 0x40, 0x04, 0x70, 0xE7, 0x46, 0xFB, 0xCC, 0xE9, 0xFE, 0xF5, + 0x81, 0xEF, 0x2A, 0x01, 0x5C, 0xFD, 0xAC, 0x06, 0x7D, 0x0B, 0x25, 0xF6, + 0x52, 0x0B, 0xAE, 0xEF, 0x3A, 0x05, 0xBF, 0xF9, 0x2A, 0xFD, 0x75, 0xF8, + 0xF2, 0xFC, 0x33, 0xF4, 0x4E, 0xF4, 0xEB, 0xDF, 0x9D, 0xEC, 0x5D, 0xCC, + 0x17, 0xF0, 0xE0, 0xCD, 0xF7, 0xEE, 0x30, 0xDB, 0xB6, 0xF9, 0xB8, 0xFA, + 0x1C, 0x09, 0x41, 0x09, 0xE8, 0x08, 0x1B, 0xFC, 0xE3, 0xFE, 0x83, 0xFB, + 0xB8, 0xF7, 0xD8, 0x0C, 0xF9, 0xFC, 0x92, 0x1A, 0x52, 0xFE, 0x4A, 0x1A, + 0x1A, 0xF6, 0x60, 0x15, 0x9E, 0xE8, 0x09, 0x00, 0xF4, 0xE8, 0x48, 0xF5, + 0x8C, 0xF8, 0x1F, 0xFF, 0x40, 0x04, 0x94, 0xFB, 0xB1, 0xFE, 0x2F, 0xFA, + 0x36, 0xF3, 0x4C, 0x03, 0xE0, 0xF7, 0x84, 0xFF, 0x81, 0xF8, 0xAA, 0xF4, + 0x9C, 0xF6, 0xC5, 0xF7, 0x32, 0xF8, 0x7E, 0xF3, 0x2D, 0xFB, 0x6C, 0xF0, + 0xC5, 0x00, 0xC4, 0xFE, 0x05, 0x05, 0x43, 0x06, 0xD0, 0x03, 0x38, 0xFA, + 0x72, 0xF7, 0xC2, 0xE6, 0x65, 0x01, 0xA2, 0xEF, 0xCA, 0x09, 0x38, 0xF5, + 0xA5, 0x02, 0x99, 0xF3, 0x08, 0x07, 0xDB, 0x01, 0x1A, 0x0B, 0xDA, 0x06, + 0x99, 0x10, 0x64, 0x06, 0xBD, 0x1E, 0xA7, 0x0C, 0xEE, 0x28, 0xF3, 0x1D, + 0x9D, 0x25, 0x2C, 0x32, 0x8C, 0x1B, 0xC0, 0x2E, 0x67, 0x1D, 0xE5, 0x24, + 0xA6, 0x1B, 0xB3, 0x24, 0xF8, 0x09, 0xC0, 0x1D, 0x4F, 0x08, 0x77, 0x22, + 0x25, 0x02, 0xDF, 0x24, 0xE2, 0x02, 0xC8, 0x25, 0xE4, 0x16, 0x88, 0x2E, + 0x8F, 0x20, 0x85, 0x32, 0xF7, 0x2D, 0xA2, 0x35, 0xB6, 0x30, 0x16, 0x27, + 0x2C, 0x2F, 0x0C, 0x1F, 0x69, 0x34, 0x03, 0x20, 0x59, 0x22, 0x94, 0x10, + 0x83, 0x17, 0x9B, 0x17, 0x8B, 0x18, 0xAC, 0x24, 0xD9, 0x10, 0xB0, 0x15, + 0x69, 0x16, 0x92, 0x08, 0x4F, 0x1B, 0x3D, 0x09, 0x09, 0x14, 0xBE, 0x08, + 0x04, 0x0D, 0x26, 0x00, 0x28, 0x0F, 0x74, 0x03, 0x44, 0x0F, 0x64, 0x02, + 0x05, 0x0A, 0x60, 0xF3, 0xDB, 0x17, 0xAE, 0x04, 0x3E, 0x25, 0x92, 0x1E, + 0xB9, 0x17, 0x93, 0x13, 0xA9, 0x0E, 0x97, 0x05, 0x51, 0x0A, 0x1F, 0x07, + 0xAC, 0x04, 0xD9, 0x18, 0xBF, 0xFB, 0x40, 0x20, 0x52, 0xF5, 0x18, 0x17, + 0x1E, 0xFC, 0x24, 0x19, 0xE5, 0xF0, 0x49, 0x14, 0xD4, 0xE9, 0xC6, 0x0F, + 0xEE, 0xF1, 0x55, 0x0B, 0x9F, 0xF1, 0x8E, 0xFD, 0xA4, 0xF6, 0x38, 0xF1, + 0x81, 0x05, 0x6A, 0xF2, 0x85, 0x17, 0xE3, 0x08, 0x7E, 0x0C, 0xDA, 0xF2, + 0x3A, 0x08, 0x79, 0xD5, 0x2A, 0x0E, 0x91, 0xDF, 0xA1, 0xFA, 0x68, 0xDB, + 0x5E, 0xF0, 0xDA, 0xDA, 0x5C, 0xF0, 0xEF, 0xE4, 0x44, 0xFA, 0xB2, 0xF0, + 0xCE, 0xF7, 0xF3, 0xFB, 0xB9, 0xE9, 0xE4, 0xFB, 0xF3, 0xEB, 0xDB, 0xF3, + 0x31, 0xF3, 0xF1, 0xF2, 0x47, 0xF6, 0xC0, 0xFC, 0x8F, 0xF1, 0x0E, 0x07, + 0xCD, 0xE7, 0xF0, 0xF7, 0xDE, 0xDD, 0x9D, 0xDD, 0x46, 0xD5, 0x53, 0xE1, + 0x33, 0xD8, 0xF2, 0xEF, 0xD5, 0xD5, 0xAC, 0xEB, 0x7A, 0xD0, 0xCB, 0xD6, + 0x2C, 0xE9, 0x8C, 0xD6, 0x38, 0xEA, 0x12, 0xD7, 0x4B, 0xD7, 0xFB, 0xD8, + 0xC9, 0xD8, 0x6D, 0xED, 0x21, 0xDA, 0x77, 0xF0, 0xF8, 0xDF, 0x10, 0xF4, + 0xB7, 0xD9, 0x5F, 0xF3, 0x99, 0xD2, 0x4C, 0xE7, 0x0A, 0xD5, 0xA2, 0xDE, + 0x2B, 0xD7, 0x14, 0xD6, 0x19, 0xE0, 0x31, 0xD2, 0xB9, 0xD8, 0xE1, 0xCB, + 0x88, 0xDB, 0x7E, 0xCE, 0xA8, 0xF0, 0x58, 0xD5, 0xEB, 0xEF, 0x92, 0xD1, + 0x71, 0xEB, 0xD6, 0xD4, 0x6E, 0xED, 0x14, 0xE0, 0x53, 0xF3, 0x96, 0xEC, + 0x35, 0xFD, 0x80, 0xF6, 0xE0, 0xF8, 0x2C, 0xF9, 0x3F, 0xE8, 0x4D, 0xF7, + 0x76, 0xE0, 0xFA, 0xF0, 0x97, 0xDD, 0xF2, 0xEC, 0x95, 0xE2, 0xF8, 0xF7, + 0x1C, 0xE0, 0xC0, 0xF4, 0xFE, 0xD3, 0x13, 0xE2, 0xDD, 0xDE, 0x35, 0xE6, + 0xEE, 0xE1, 0x3A, 0xE5, 0x92, 0xDF, 0xBC, 0xE2, 0xE1, 0xEC, 0x73, 0xF3, + 0x3B, 0xFB, 0x24, 0xF8, 0x39, 0x06, 0xA6, 0xF4, 0x6B, 0x02, 0x5D, 0xF1, + 0x20, 0x04, 0x81, 0xEA, 0x76, 0x05, 0xB5, 0xDC, 0x6D, 0xFE, 0x5C, 0xDB, + 0xB4, 0xFA, 0x55, 0xE4, 0x5A, 0xE9, 0x51, 0xDB, 0x5E, 0xEE, 0x1F, 0xE2, + 0x8C, 0x02, 0xD2, 0xEB, 0x73, 0x06, 0xF8, 0xEC, 0x0A, 0x16, 0xC2, 0x01, + 0x95, 0x17, 0xD0, 0x0A, 0x01, 0x0D, 0xD4, 0x0A, 0x57, 0x0A, 0x55, 0x11, + 0xE7, 0x07, 0x6B, 0x11, 0x5B, 0x0B, 0xF6, 0x0A, 0x56, 0x03, 0x85, 0x03, + 0x77, 0x0A, 0x8B, 0x14, 0xB6, 0x13, 0xD8, 0x20, 0xD0, 0x0C, 0x2B, 0x1F, + 0xC0, 0x0C, 0x38, 0x25, 0xD7, 0x06, 0xC1, 0x19, 0xCE, 0x05, 0xA7, 0x09, + 0xFC, 0x06, 0xB2, 0x09, 0x82, 0x02, 0x7B, 0x0C, 0xBA, 0x03, 0x7A, 0x03, + 0xF2, 0xFB, 0xD1, 0xFE, 0x19, 0xF3, 0x12, 0xFA, 0x82, 0xFF, 0x98, 0xF7, + 0x4D, 0xFC, 0xA9, 0x02, 0x06, 0xFD, 0xE7, 0x09, 0x6F, 0x14, 0x6C, 0x09, + 0xE0, 0x11, 0x12, 0xFF, 0x9F, 0x09, 0xB5, 0x04, 0x70, 0x04, 0x59, 0x08, + 0x3E, 0x06, 0xF5, 0x07, 0x23, 0x05, 0xD4, 0x0E, 0x45, 0xFC, 0x5A, 0x06, + 0x44, 0x07, 0xB1, 0x11, 0xDD, 0x09, 0x42, 0x1A, 0x14, 0x01, 0xDB, 0x01, + 0x2F, 0x0D, 0xB5, 0xFE, 0xF8, 0x19, 0x3B, 0x0C, 0xB9, 0x12, 0xBC, 0x0D, + 0x95, 0x05, 0xFB, 0x11, 0x83, 0xF9, 0xCE, 0x0F, 0xF1, 0xF6, 0x2C, 0x06, + 0x02, 0xFD, 0x2A, 0x0B, 0x2C, 0x0E, 0xCC, 0x1A, 0x3A, 0x1E, 0x3A, 0x22, + 0xCC, 0x12, 0x80, 0x23, 0x16, 0x14, 0x2F, 0x24, 0x55, 0x1F, 0xF0, 0x16, + 0xA8, 0x20, 0x27, 0x11, 0xF4, 0x29, 0x36, 0x11, 0xB5, 0x35, 0x33, 0x08, + 0x32, 0x45, 0xE8, 0x0F, 0x80, 0x3A, 0x69, 0x18, 0x55, 0x29, 0x7E, 0x1A, + 0xF7, 0x1F, 0x9C, 0x17, 0x0A, 0x0D, 0x4E, 0x13, 0x08, 0x0E, 0x6D, 0x15, + 0xBD, 0x1A, 0xD6, 0x1A, 0x9E, 0x23, 0xB5, 0x2D, 0x10, 0x22, 0xD1, 0x37, + 0xCC, 0x1A, 0xE2, 0x33, 0x7A, 0x1A, 0x71, 0x2D, 0x37, 0x0F, 0x00, 0x23, + 0x66, 0x06, 0xA0, 0x28, 0x15, 0x13, 0xA6, 0x2C, 0x77, 0x15, 0x40, 0x22, + 0x15, 0x0E, 0x7F, 0x1E, 0x4A, 0x11, 0x77, 0x1A, 0xAE, 0x09, 0xA5, 0x09, + 0x81, 0xFF, 0xAF, 0xFD, 0x4B, 0xFE, 0xB9, 0x02, 0x1E, 0xFB, 0xF6, 0x01, + 0xAA, 0xF8, 0x7C, 0xFF, 0x8D, 0xF3, 0x32, 0xFF, 0x2E, 0xF7, 0x22, 0xF4, + 0x2D, 0x14, 0xD2, 0xF6, 0xEA, 0x1B, 0x57, 0xF9, 0x52, 0x16, 0x97, 0xF0, + 0x54, 0x1B, 0x99, 0xF0, 0x74, 0x11, 0x6A, 0xFD, 0x16, 0x08, 0xC6, 0x0C, + 0xE8, 0x0A, 0x9E, 0x11, 0x5B, 0x11, 0x4B, 0x12, 0xB4, 0x13, 0x6E, 0x17, + 0x88, 0x14, 0xCA, 0x15, 0x64, 0x15, 0x6A, 0x11, 0xCA, 0x0C, 0x68, 0x18, + 0x7A, 0x04, 0x35, 0x15, 0xFD, 0x0E, 0x3D, 0x0F, 0x5E, 0x21, 0x10, 0x14, + 0x8E, 0x30, 0x60, 0x1B, 0x13, 0x33, 0xF0, 0x1C, 0xF2, 0x2B, 0x38, 0x25, + 0xB2, 0x27, 0xCC, 0x30, 0x88, 0x20, 0x5D, 0x2D, 0xCE, 0x19, 0x73, 0x2C, + 0x11, 0x15, 0x5E, 0x31, 0xD8, 0x14, 0xEC, 0x29, 0x1C, 0x12, 0xC0, 0x15, + 0x6F, 0x0D, 0xD1, 0x16, 0xB6, 0x0A, 0x40, 0x28, 0x67, 0x07, 0xD5, 0x27, + 0xD1, 0x09, 0x4E, 0x24, 0x3F, 0x04, 0x4B, 0x22, 0x8C, 0x00, 0x6C, 0x1D, + 0xDA, 0x0E, 0x7B, 0x1C, 0x22, 0x17, 0xF0, 0x19, 0x96, 0x14, 0xAF, 0x18, + 0xCB, 0x0A, 0x75, 0x02, 0x12, 0x0C, 0xC2, 0xF0, 0xEA, 0x05, 0x8F, 0xEE, + 0x70, 0xF9, 0x4F, 0xE6, 0x49, 0x02, 0x6C, 0xED, 0x1D, 0x09, 0x18, 0xF5, + 0xEF, 0x13, 0x53, 0x02, 0xF4, 0x15, 0x12, 0x0A, 0xE8, 0x0D, 0xC6, 0x07, + 0x7E, 0x05, 0xBD, 0x01, 0x51, 0xF9, 0x02, 0xF0, 0xAB, 0xF8, 0x33, 0xF0, + 0x7F, 0xEE, 0x0F, 0xF6, 0xB2, 0xE7, 0xA6, 0xF5, 0xDF, 0xE9, 0x4A, 0xEE, + 0xB0, 0xE7, 0xD3, 0xE0, 0xD7, 0xE5, 0x59, 0xD5, 0x43, 0xE2, 0x97, 0xCE, + 0x4E, 0xE3, 0x78, 0xD0, 0x67, 0xE7, 0xD9, 0xE0, 0x33, 0xEA, 0x52, 0xE4, + 0x3A, 0xE5, 0xD8, 0xCB, 0xBC, 0xDD, 0x45, 0xCA, 0x93, 0xDD, 0x07, 0xD2, + 0x2D, 0xE4, 0x8E, 0xDA, 0xB9, 0xDB, 0x9C, 0xEC, 0x97, 0xCD, 0x47, 0xF8, + 0x21, 0xCB, 0x3C, 0xEC, 0x94, 0xC9, 0x63, 0xD2, 0xA7, 0xC5, 0x5D, 0xD3, + 0xB2, 0xBD, 0xD1, 0xD3, 0x16, 0xBC, 0x7F, 0xCC, 0x71, 0xC3, 0x29, 0xD7, + 0x61, 0xC0, 0x93, 0xE0, 0xA3, 0xB9, 0x89, 0xDA, 0x05, 0xB1, 0x09, 0xC3, + 0x23, 0xB2, 0x16, 0xC1, 0x61, 0xC2, 0xD6, 0xCD, 0x2B, 0xCD, 0xA3, 0xCE, + 0xA9, 0xC6, 0xC6, 0xCD, 0xC2, 0xB9, 0x63, 0xC9, 0x37, 0xBD, 0xB7, 0xC0, + 0x51, 0xC9, 0xF1, 0xB3, 0xED, 0xD2, 0x67, 0xB6, 0x05, 0xD5, 0x90, 0xB7, + 0x6A, 0xD5, 0xE7, 0xBF, 0x24, 0xD4, 0x32, 0xD4, 0x4B, 0xCB, 0x5A, 0xCC, + 0x49, 0xD1, 0x7D, 0xC7, 0xCD, 0xE3, 0x1D, 0xD0, 0x6F, 0xED, 0x75, 0xD6, + 0xBE, 0xEE, 0xCD, 0xE4, 0x62, 0xF1, 0x62, 0xE9, 0xAA, 0xEB, 0x67, 0xDB, + 0x2B, 0xE7, 0xC1, 0xD7, 0x8F, 0xF1, 0x9C, 0xD6, 0x7A, 0xFD, 0x2A, 0xD9, + 0xF3, 0x00, 0xBE, 0xED, 0x72, 0x00, 0x44, 0xF6, 0x2F, 0x0D, 0x21, 0xF3, + 0x79, 0x11, 0x09, 0xF7, 0x66, 0xFD, 0xD5, 0xF8, 0x39, 0xF6, 0xC0, 0xEE, + 0xA4, 0x01, 0x48, 0xF2, 0x72, 0x02, 0x2A, 0x06, 0x3F, 0x01, 0x9B, 0x19, + 0x3E, 0x0B, 0x91, 0x2A, 0xEA, 0x07, 0x3D, 0x20, 0xBC, 0x07, 0xFD, 0x0D, + 0xF8, 0x0E, 0x29, 0x06, 0xB1, 0x14, 0x81, 0x0D, 0x24, 0x1C, 0xCC, 0x1E, + 0x1D, 0x15, 0x7E, 0x23, 0x6D, 0x04, 0xFB, 0x1A, 0xF6, 0xFA, 0xF6, 0x14, + 0x79, 0x01, 0xB5, 0x1A, 0xFC, 0x0D, 0xB1, 0x1D, 0x93, 0x0A, 0xD0, 0x1B, + 0xF4, 0xFA, 0x4C, 0x14, 0xC3, 0xFE, 0xEC, 0x15, 0x4E, 0x09, 0x74, 0x1F, + 0x6D, 0x0A, 0xC6, 0x1C, 0xD2, 0x10, 0x3E, 0x18, 0x69, 0x16, 0xC9, 0x1D, + 0x69, 0x16, 0x32, 0x23, 0x2D, 0x16, 0x6F, 0x18, 0x6B, 0x1E, 0x72, 0x0E, + 0xFF, 0x1C, 0xD1, 0x09, 0x3A, 0x0E, 0x56, 0x04, 0xF7, 0x13, 0xFE, 0xFC, + 0x1B, 0x21, 0x9E, 0xF7, 0x37, 0x19, 0x75, 0x00, 0x62, 0x19, 0xDA, 0x0D, + 0x2C, 0x1E, 0x9D, 0x0C, 0xAC, 0x1C, 0x9E, 0x0A, 0xBF, 0x24, 0xD5, 0x09, + 0xE0, 0x2A, 0xD9, 0x06, 0x80, 0x27, 0xC4, 0x0E, 0xA9, 0x2A, 0xB5, 0x1E, + 0x50, 0x32, 0xBA, 0x21, 0xB7, 0x2A, 0xD4, 0x1B, 0x3E, 0x26, 0x3C, 0x29, + 0xC2, 0x2F, 0x00, 0x36, 0x4A, 0x28, 0x0B, 0x30, 0x3B, 0x2A, 0x06, 0x40, + 0x59, 0x35, 0x96, 0x46, 0xF5, 0x34, 0xC2, 0x3E, 0x9C, 0x32, 0x5C, 0x4C, + 0x7E, 0x26, 0xDE, 0x4B, 0x25, 0x26, 0x33, 0x4A, 0xC7, 0x27, 0x28, 0x45, + 0xBF, 0x23, 0xFC, 0x36, 0xF4, 0x22, 0xB2, 0x35, 0xC3, 0x1F, 0xA4, 0x2B, + 0x64, 0x1C, 0x25, 0x1D, 0x0F, 0x0E, 0x25, 0x0D, 0x82, 0x10, 0xBE, 0x0B, + 0xD9, 0x1B, 0xC9, 0x1A, 0xE5, 0x14, 0x64, 0x1F, 0x05, 0x15, 0x60, 0x27, + 0xBC, 0x1B, 0x66, 0x20, 0x18, 0x11, 0xF4, 0xFD, 0xE0, 0x12, 0x59, 0xF8, + 0x0B, 0x11, 0x76, 0xEC, 0x08, 0x10, 0x0D, 0xE6, 0x5E, 0x18, 0x33, 0xF8, + 0x9F, 0xFE, 0x3F, 0xEE, 0x4F, 0xF3, 0xEF, 0xF0, 0x60, 0xF0, 0x46, 0xEC, + 0xB6, 0xE3, 0xBC, 0xDE, 0xDB, 0xE3, 0x8A, 0xE9, 0x8B, 0xE3, 0xBC, 0xEE, + 0xA9, 0xE5, 0x13, 0xED, 0x6D, 0xE3, 0x93, 0xEC, 0xC3, 0xEA, 0x07, 0xF8, + 0x57, 0xF0, 0x34, 0xF6, 0xCC, 0xEE, 0x46, 0xEA, 0x73, 0xF4, 0x0D, 0xF0, + 0x58, 0xFA, 0x00, 0xFC, 0xE9, 0xFA, 0x7E, 0xF6, 0x17, 0xF4, 0x8F, 0xED, + 0x7D, 0xEA, 0x3D, 0xF7, 0xD8, 0xED, 0xD2, 0xFE, 0xB8, 0x00, 0xF4, 0x00, + 0xFD, 0x02, 0x50, 0xFD, 0xD3, 0xF1, 0x65, 0xF7, 0xBC, 0xE4, 0xA7, 0xEC, + 0x7B, 0xF2, 0xF2, 0xE0, 0x0C, 0x0C, 0x93, 0xE5, 0xB4, 0x15, 0x9F, 0xF0, + 0xA7, 0x1C, 0x81, 0x04, 0x72, 0x0E, 0xD0, 0x05, 0x30, 0xF7, 0x49, 0xF9, + 0xFC, 0xEF, 0x95, 0xFD, 0xD6, 0xEB, 0x5C, 0x00, 0x49, 0xE4, 0xFF, 0xFD, + 0x91, 0xE2, 0x77, 0x08, 0xFB, 0xEA, 0xFC, 0x14, 0xC2, 0xEA, 0x09, 0x0D, + 0xE1, 0xEC, 0xF7, 0x0A, 0xE7, 0xEE, 0x4D, 0x0D, 0xD4, 0xEC, 0xCA, 0x00, + 0x96, 0xF7, 0xC2, 0xEA, 0x49, 0xFF, 0x9B, 0xDE, 0x2A, 0xF5, 0xCD, 0xE4, + 0x79, 0xE6, 0xB0, 0xDD, 0xC0, 0xE3, 0x7E, 0xCD, 0x76, 0xE4, 0x61, 0xC7, + 0xDE, 0xE2, 0x0A, 0xD2, 0x9A, 0xE3, 0x17, 0xDB, 0x7D, 0xE4, 0x03, 0xDD, + 0x24, 0xE3, 0x60, 0xDD, 0x5E, 0xE1, 0x00, 0xD3, 0x2D, 0xE7, 0xA2, 0xD6, + 0x07, 0xF4, 0xBD, 0xE4, 0x9B, 0xF7, 0x23, 0xED, 0x4B, 0xF3, 0xA1, 0xFB, + 0xD2, 0xEA, 0xB5, 0xF8, 0x6F, 0xDC, 0x20, 0xE6, 0xDD, 0xDC, 0x20, 0xEC, + 0x40, 0xE7, 0x18, 0xF5, 0x38, 0xEA, 0xEA, 0xF7, 0x39, 0xF0, 0x4D, 0x07, + 0xE7, 0xF8, 0xF3, 0x0E, 0x9A, 0xF9, 0xB3, 0x10, 0x3C, 0xF3, 0xDA, 0x0A, + 0x1E, 0xF5, 0x5F, 0x0A, 0xEF, 0xFF, 0x80, 0x08, 0x04, 0x0A, 0x83, 0x00, + 0xDC, 0x0E, 0xDA, 0x0E, 0x11, 0x03, 0xAA, 0x0E, 0x62, 0xF0, 0x31, 0x05, + 0x0C, 0xE7, 0xFB, 0x04, 0xF3, 0xF0, 0x99, 0xFD, 0xB3, 0x06, 0x20, 0x04, + 0xE6, 0x0B, 0x73, 0x02, 0xAE, 0x0D, 0xA1, 0xFB, 0x7A, 0x05, 0x31, 0xF3, + 0xC5, 0xFA, 0xBB, 0xEB, 0xCA, 0x08, 0xBD, 0xFB, 0x8A, 0x14, 0x4C, 0xFB, + 0x53, 0x21, 0xAF, 0xF4, 0x30, 0x26, 0x36, 0xF9, 0x8E, 0x1B, 0x91, 0xF7, + 0x43, 0x0C, 0xFC, 0xF1, 0x0A, 0xFB, 0x22, 0xE9, 0x1F, 0xFB, 0x54, 0xF0, + 0x24, 0xF8, 0x75, 0xFD, 0x5C, 0xEF, 0xE8, 0x03, 0xC7, 0xF5, 0x90, 0x0E, + 0xD5, 0xFC, 0x5F, 0x0D, 0x98, 0xF9, 0x3D, 0x05, 0x3B, 0xF9, 0x38, 0x0C, + 0xB4, 0xF8, 0x4C, 0x03, 0x32, 0xF7, 0x54, 0xFD, 0x7D, 0xFE, 0x3E, 0x0F, + 0xE2, 0x02, 0x3B, 0x11, 0x58, 0x04, 0x02, 0x09, 0xF8, 0x05, 0x60, 0x05, + 0x31, 0x05, 0x2B, 0x03, 0xA8, 0x03, 0x3A, 0xFE, 0x94, 0x07, 0xC9, 0xFB, + 0xF8, 0x09, 0x95, 0x05, 0x0D, 0x08, 0xB4, 0x05, 0x72, 0x15, 0x00, 0xF6, + 0xC5, 0x13, 0xC0, 0xF3, 0x44, 0x08, 0xC2, 0xFF, 0x12, 0x08, 0x36, 0x03, + 0x69, 0xFC, 0x3C, 0x0C, 0x0B, 0xF2, 0x30, 0x19, 0x93, 0xF6, 0xC2, 0x18, + 0x00, 0xFB, 0x26, 0x10, 0x13, 0xFC, 0x18, 0x14, 0x6B, 0x0A, 0xBB, 0x26, + 0x48, 0x1D, 0xC5, 0x28, 0x93, 0x1B, 0xC1, 0x17, 0xB8, 0x0B, 0x5B, 0x18, + 0xBC, 0xF9, 0x08, 0x19, 0xB3, 0xF9, 0x8E, 0x0A, 0x00, 0x03, 0x23, 0xFC, + 0x2D, 0x04, 0xAC, 0xEF, 0xFB, 0xFD, 0x97, 0xEC, 0xC5, 0xF8, 0xB2, 0xF4, + 0xD7, 0xF7, 0xBE, 0xF3, 0x89, 0xF4, 0x0B, 0xE4, 0x8E, 0xEC, 0x23, 0xE6, + 0x41, 0xE4, 0x7E, 0xED, 0xAD, 0xEF, 0x3E, 0xEC, 0x22, 0x03, 0xD3, 0xF0, + 0xC5, 0x09, 0x5D, 0xF2, 0x3E, 0x06, 0xB7, 0xF2, 0x45, 0x04, 0xB0, 0xEA, + 0x8D, 0x0A, 0x31, 0xE2, 0xAF, 0x0F, 0x2A, 0xE6, 0xB8, 0x0B, 0x97, 0xEA, + 0x01, 0xFF, 0xF2, 0xF0, 0x67, 0x04, 0x63, 0x01, 0xA5, 0x16, 0x3D, 0x0C, + 0x2F, 0x16, 0xAA, 0x00, 0x8A, 0x0D, 0xFD, 0x02, 0xD4, 0x09, 0xBD, 0x1D, + 0x2C, 0x02, 0xD9, 0x21, 0x98, 0xFD, 0xD6, 0x1E, 0x4F, 0x0B, 0xB2, 0x30, + 0xC0, 0x10, 0xED, 0x37, 0x4B, 0x12, 0xD6, 0x2F, 0xF7, 0x23, 0x6E, 0x30, + 0x1A, 0x21, 0xDD, 0x30, 0x24, 0x18, 0xF2, 0x2A, 0x55, 0x18, 0x56, 0x2E, + 0x59, 0x0E, 0xEF, 0x32, 0xAB, 0x10, 0x0B, 0x29, 0x12, 0x24, 0xA6, 0x1F, + 0x20, 0x31, 0x24, 0x22, 0x2D, 0x31, 0x12, 0x24, 0xA5, 0x27, 0x4A, 0x15, + 0x4E, 0x1A, 0x10, 0xF5, 0xD1, 0x14, 0xB0, 0xE2, 0xC8, 0x14, 0x47, 0xEA, + 0xBB, 0x16, 0x83, 0xFE, 0xEF, 0x10, 0xB3, 0x0E, 0x26, 0x07, 0xC2, 0x0A, + 0x1A, 0x01, 0x5A, 0x06, 0x30, 0xF9, 0xD4, 0x10, 0x56, 0xF5, 0xB0, 0x15, + 0xF0, 0xF1, 0xE1, 0x0B, 0x73, 0xF0, 0x71, 0x01, 0x90, 0xF3, 0x1C, 0x00, + 0xE3, 0xFA, 0xCA, 0x01, 0x68, 0xFA, 0xC6, 0xFF, 0x06, 0xEE, 0x36, 0xF3, + 0x3F, 0xE0, 0xB6, 0xDE, 0x5F, 0xD9, 0xE4, 0xDF, 0xBB, 0xD6, 0x0E, 0xE8, + 0x33, 0xD4, 0x3B, 0xE6, 0xC4, 0xD7, 0xCB, 0xE6, 0x76, 0xD5, 0xC1, 0xDC, + 0x30, 0xD2, 0x16, 0xD3, 0xE9, 0xD3, 0xEF, 0xCC, 0x56, 0xDA, 0x67, 0xCF, + 0x05, 0xE2, 0xDD, 0xDA, 0xE2, 0xE6, 0xD9, 0xD9, 0x5A, 0xF1, 0x4D, 0xD7, + 0x02, 0xFD, 0x70, 0xD4, 0x69, 0x03, 0x61, 0xD0, 0x8F, 0x00, 0x47, 0xDA, + 0xE5, 0xF7, 0x58, 0xE8, 0x02, 0xF9, 0xEC, 0xF3, 0x2D, 0xF4, 0x01, 0xF7, + 0x1D, 0xE9, 0x87, 0xE8, 0xAB, 0xED, 0xE6, 0xDC, 0x91, 0xF1, 0x17, 0xEE, + 0x52, 0xF0, 0x60, 0x01, 0xCE, 0xEF, 0xAA, 0xFB, 0xFD, 0xF1, 0x61, 0xF8, + 0x43, 0xF0, 0x06, 0xF8, 0xA3, 0xE2, 0x13, 0xEE, 0x79, 0xD9, 0x3A, 0xEF, + 0xBE, 0xD3, 0xD8, 0xF3, 0x76, 0xDA, 0x8D, 0xF4, 0xA2, 0xEC, 0xA4, 0xFA, + 0x44, 0xF7, 0xC4, 0x06, 0xF2, 0xF2, 0xB0, 0x0D, 0x42, 0xE9, 0xBF, 0x01, + 0x21, 0xF0, 0xE9, 0xF0, 0x54, 0xF8, 0x93, 0xE4, 0xBA, 0xF1, 0x66, 0xDC, + 0xA0, 0xF1, 0xC8, 0xD9, 0x9B, 0xF3, 0x17, 0xCC, 0x54, 0xEF, 0x5E, 0xC7, + 0x41, 0xF8, 0xD6, 0xD5, 0xF4, 0xFE, 0x0E, 0xDE, 0xE9, 0xF9, 0x18, 0xE4, + 0x3A, 0xF2, 0x35, 0xE9, 0x43, 0xF5, 0x65, 0xF6, 0x2B, 0xFF, 0x9A, 0xFC, + 0xFC, 0xF4, 0x10, 0xFA, 0x91, 0xE1, 0x13, 0x05, 0x8A, 0xE5, 0xFA, 0x0F, + 0x7F, 0xFA, 0x02, 0x16, 0x82, 0x06, 0x88, 0x16, 0x41, 0x08, 0xCA, 0x15, + 0xE4, 0x0B, 0x7A, 0x15, 0x84, 0x0D, 0x1B, 0x12, 0x02, 0x09, 0x9A, 0x17, + 0x01, 0x15, 0xE4, 0x27, 0x41, 0x26, 0x95, 0x33, 0xBA, 0x34, 0x66, 0x44, + 0x6B, 0x3A, 0x70, 0x4B, 0x36, 0x2D, 0xDD, 0x38, 0x4D, 0x22, 0x78, 0x21, + 0x53, 0x1D, 0xC3, 0x16, 0x4F, 0x24, 0xDA, 0x1E, 0xF9, 0x33, 0x87, 0x24, + 0xDF, 0x35, 0x55, 0x22, 0x11, 0x32, 0x9F, 0x1F, 0xD6, 0x34, 0xC0, 0x1D, + 0x62, 0x29, 0xB4, 0x1D, 0x7C, 0x1B, 0xA4, 0x1B, 0x3A, 0x1A, 0xC5, 0x23, + 0xE9, 0x16, 0xCD, 0x32, 0x82, 0x16, 0x34, 0x32, 0x93, 0x17, 0x38, 0x30, + 0xA3, 0x0C, 0xA9, 0x31, 0x73, 0x03, 0x87, 0x1F, 0x13, 0x0D, 0xC9, 0x0E, + 0x52, 0x00, 0xFB, 0x01, 0xEE, 0xEF, 0xE4, 0xF3, 0x5B, 0x04, 0x61, 0xEC, + 0x42, 0x19, 0xF9, 0xEC, 0xD7, 0x1C, 0x99, 0xFE, 0x1E, 0x1F, 0xB1, 0x18, + 0x66, 0x22, 0x24, 0x1B, 0x37, 0x1A, 0x94, 0x0F, 0xBA, 0x07, 0xAF, 0x18, + 0xFB, 0xFB, 0xED, 0x1E, 0xA7, 0x05, 0xAF, 0x13, 0x47, 0x0C, 0x24, 0x00, + 0x06, 0x0E, 0x7B, 0xF9, 0xD0, 0x18, 0x83, 0x04, 0xF0, 0x1A, 0x31, 0x0E, + 0xD2, 0x13, 0x0C, 0x0B, 0x04, 0x18, 0xA2, 0x00, 0xC3, 0x20, 0xCC, 0x09, + 0x7F, 0x1E, 0xF1, 0x17, 0xC4, 0x21, 0x9D, 0x1D, 0x9E, 0x2D, 0x1F, 0x28, + 0xDB, 0x32, 0x35, 0x2C, 0xBA, 0x27, 0x5D, 0x26, 0x76, 0x19, 0x7B, 0x27, + 0x07, 0x0B, 0x03, 0x21, 0xA9, 0x00, 0xA3, 0x09, 0xDB, 0x05, 0x8A, 0x00, + 0x11, 0x09, 0xBA, 0x0A, 0xA4, 0x0B, 0x59, 0x13, 0xAD, 0x09, 0x34, 0x14, + 0xBC, 0x0A, 0xB2, 0x19, 0xA7, 0x0C, 0xAF, 0x1A, 0x35, 0xF7, 0x36, 0x12, + 0x24, 0xE7, 0x9C, 0x09, 0xF6, 0xF4, 0x7C, 0x01, 0x7F, 0xFB, 0x94, 0xFA, + 0xE9, 0xFA, 0xAB, 0xFB, 0x15, 0xFF, 0x7E, 0xFE, 0x2E, 0xFC, 0x7D, 0xF6, + 0x68, 0x00, 0xED, 0xE8, 0x3B, 0xFB, 0xB9, 0xDD, 0x73, 0xF2, 0x22, 0xE1, + 0x3D, 0xEF, 0xFF, 0xDF, 0xB2, 0xEB, 0xBD, 0xDC, 0x6E, 0xEF, 0xCD, 0xEB, + 0x9F, 0xF3, 0x0C, 0xFB, 0xB0, 0xF7, 0x58, 0xFA, 0x5A, 0xF2, 0x6A, 0xEF, + 0x4D, 0xE6, 0xA8, 0xE8, 0x21, 0xE4, 0x48, 0xEB, 0x4E, 0xE8, 0xC1, 0xEF, + 0xD6, 0xE9, 0x79, 0xF1, 0xE7, 0xE4, 0x48, 0xF3, 0x49, 0xEC, 0x8F, 0xEC, + 0xFC, 0x07, 0xEE, 0xE6, 0x00, 0x0D, 0xA4, 0xE8, 0x95, 0xF4, 0xD2, 0xE7, + 0x4A, 0xEF, 0xD9, 0xEC, 0xF0, 0xF5, 0x7B, 0xEE, 0x91, 0xF7, 0xA4, 0xF6, + 0xB1, 0xFD, 0x8A, 0x01, 0xAA, 0x09, 0x93, 0x01, 0x25, 0x0E, 0x41, 0x00, + 0x1E, 0x06, 0x96, 0xFB, 0x0B, 0x01, 0xBB, 0xF4, 0x55, 0xF7, 0x76, 0xED, + 0x65, 0xEA, 0xB1, 0xED, 0xFC, 0xEE, 0x94, 0xF5, 0xBC, 0xF6, 0x53, 0xFD, + 0x79, 0xF0, 0xA9, 0x00, 0xAB, 0xE5, 0xDE, 0xFB, 0x9E, 0xE2, 0x81, 0xF5, + 0x0F, 0xDC, 0x48, 0xDD, 0xFB, 0xCC, 0xA9, 0xBE, 0xDF, 0xC9, 0xD5, 0xC0, + 0x17, 0xD0, 0x0B, 0xD0, 0x33, 0xC8, 0xC0, 0xCD, 0x4E, 0xC9, 0xE7, 0xD1, + 0x8E, 0xD2, 0xA7, 0xD3, 0xB1, 0xC9, 0x0D, 0xCE, 0x83, 0xC0, 0x74, 0xD6, + 0xAA, 0xB9, 0x46, 0xD7, 0x8A, 0xAF, 0x34, 0xD0, 0xFE, 0xA5, 0xF0, 0xC5, + 0x32, 0xA9, 0x55, 0xC2, 0x9F, 0xB8, 0xAF, 0xC5, 0x9D, 0xCA, 0x83, 0xC4, + 0x58, 0xDA, 0x2A, 0xC6, 0xEF, 0xDF, 0xDA, 0xC4, 0xD3, 0xD4, 0x96, 0xC3, + 0x1F, 0xD1, 0x95, 0xCA, 0x2E, 0xDE, 0x3F, 0xC9, 0xE2, 0xDC, 0x1F, 0xC1, + 0x97, 0xD9, 0x5E, 0xC4, 0xAF, 0xEB, 0x4A, 0xD1, 0x4A, 0xFD, 0x2E, 0xDE, + 0xB3, 0xED, 0x44, 0xE4, 0x60, 0xE0, 0x72, 0xF2, 0x25, 0xF0, 0x38, 0xFC, + 0x02, 0xF7, 0x28, 0xF6, 0xCA, 0xFD, 0x2F, 0x00, 0x6A, 0x0D, 0x2D, 0x14, + 0xBC, 0x10, 0xC9, 0x18, 0xCC, 0x03, 0x4A, 0x07, 0xF2, 0x02, 0xBB, 0xFE, + 0x80, 0x0E, 0x3C, 0x02, 0x93, 0x0B, 0x22, 0xFF, 0x08, 0x0B, 0xB3, 0x07, + 0x7D, 0x13, 0x66, 0x16, 0x46, 0x17, 0x09, 0x20, 0x5A, 0x1C, 0x1F, 0x29, + 0x8A, 0x24, 0x71, 0x27, 0x49, 0x24, 0x01, 0x14, 0x9A, 0x1A, 0x55, 0x08, + 0x83, 0x02, 0x45, 0x06, 0xD8, 0xED, 0x28, 0x08, 0x72, 0xFC, 0x94, 0x1C, + 0x02, 0x13, 0x27, 0x30, 0x33, 0x15, 0x7C, 0x27, 0x66, 0x14, 0xA9, 0x15, + 0xD8, 0x21, 0xCE, 0x22, 0xFD, 0x2D, 0x22, 0x32, 0xA9, 0x23, 0xDD, 0x27, + 0xAC, 0x0B, 0x7E, 0x19, 0xF0, 0x00, 0x00, 0x0A, 0x7C, 0x0D, 0xA9, 0x06, + 0x73, 0x18, 0xD7, 0x07, 0xD6, 0x1C, 0x26, 0xFC, 0xA9, 0x13, 0x24, 0xF5, + 0x40, 0xF3, 0x36, 0xF2, 0xD3, 0xE5, 0xBA, 0xEC, 0x3B, 0xF1, 0x50, 0xF2, + 0xDB, 0xEA, 0x07, 0xF4, 0x57, 0xE4, 0xBD, 0xF1, 0x7C, 0xF7, 0x9F, 0x02, + 0xE0, 0x0E, 0xBE, 0x12, 0x4A, 0x1B, 0x85, 0x15, 0xE3, 0x18, 0x0E, 0x19, + 0x1A, 0x13, 0x17, 0x25, 0x7E, 0x19, 0x48, 0x1D, 0x53, 0x28, 0xF6, 0x0E, + 0x8C, 0x2E, 0xF4, 0x1A, 0x85, 0x2E, 0x88, 0x28, 0x09, 0x33, 0x76, 0x29, + 0x19, 0x3A, 0x0A, 0x29, 0x6F, 0x33, 0xB2, 0x1F, 0x45, 0x15, 0xBE, 0x04, + 0x88, 0x06, 0x52, 0x03, 0x84, 0x0F, 0x41, 0x1F, 0xDE, 0x14, 0x86, 0x2F, + 0x74, 0x1A, 0x44, 0x24, 0x53, 0x20, 0xAE, 0x11, 0x16, 0x1F, 0x19, 0x0E, + 0xDF, 0x0E, 0xE6, 0xFF, 0x27, 0xFA, 0xA3, 0xF5, 0x33, 0xED, 0xC1, 0xFD, + 0x5E, 0xF2, 0x97, 0x08, 0xAE, 0x04, 0xB0, 0x0C, 0x83, 0x07, 0x15, 0x0F, + 0x57, 0x02, 0x49, 0x0F, 0x94, 0x03, 0xA9, 0x06, 0x4C, 0xF9, 0x1F, 0x09, + 0x6C, 0xE8, 0x5B, 0x00, 0x91, 0xE6, 0xB4, 0xE4, 0xAA, 0xE2, 0x82, 0xDA, + 0x51, 0xE8, 0x19, 0xE0, 0x70, 0xFC, 0xC5, 0xE4, 0xA3, 0x05, 0x27, 0xEE, + 0x37, 0x0C, 0x51, 0x02, 0x2E, 0x07, 0xEA, 0x0E, 0xF4, 0xED, 0x30, 0x03, + 0x9E, 0xDE, 0x06, 0xF5, 0x5F, 0xEC, 0x11, 0xF9, 0x35, 0xFE, 0x3C, 0x0A, + 0x25, 0xFB, 0x88, 0x15, 0xFC, 0xFE, 0xBD, 0x1A, 0xCD, 0x0D, 0x1C, 0x20, + 0xB0, 0x10, 0x04, 0x21, 0x9C, 0x10, 0x4F, 0x29, 0x29, 0x16, 0xDB, 0x2B, + 0xB9, 0x13, 0xE6, 0x22, 0x27, 0x0E, 0xA0, 0x22, 0xD9, 0x1B, 0xD2, 0x1C, + 0x4B, 0x2E, 0xAC, 0x13, 0x2E, 0x33, 0x58, 0x14, 0xF4, 0x27, 0xBF, 0x0C, + 0x48, 0x1B, 0x96, 0x04, 0xD1, 0x26, 0x97, 0x0E, 0x09, 0x3C, 0x09, 0x14, + 0xCC, 0x41, 0xCF, 0x11, 0x72, 0x38, 0x65, 0x1D, 0x44, 0x31, 0x74, 0x21, + 0x7E, 0x2B, 0x8D, 0x18, 0x81, 0x19, 0xD1, 0x13, 0xB0, 0x01, 0xB6, 0x0F, + 0xED, 0x05, 0x91, 0x1B, 0x6B, 0x14, 0xE7, 0x22, 0xE4, 0x0F, 0x69, 0x11, + 0xFE, 0x07, 0xA8, 0x07, 0xD4, 0x00, 0x46, 0x12, 0x93, 0xF7, 0x5B, 0x13, + 0xC9, 0xF7, 0x49, 0x03, 0xC4, 0x04, 0x5C, 0xF7, 0xAE, 0xF5, 0xAB, 0xE6, + 0xF6, 0xCC, 0xAA, 0xD6, 0x6C, 0xBB, 0x9E, 0xCE, 0x37, 0xD1, 0x8C, 0xD6, + 0xB8, 0xE4, 0xA2, 0xDE, 0x5A, 0xE5, 0xB5, 0xDC, 0x6B, 0xE4, 0x54, 0xDA, + 0xB2, 0xD7, 0x2C, 0xD7, 0xAE, 0xD2, 0x7B, 0xDD, 0xE9, 0xDC, 0xBE, 0xDB, + 0x7C, 0xE3, 0x84, 0xDD, 0x89, 0xE9, 0xAA, 0xE0, 0x50, 0xEC, 0x91, 0xD0, + 0xB1, 0xE5, 0x0A, 0xCF, 0x18, 0xDB, 0xC3, 0xD6, 0x91, 0xD3, 0x93, 0xCB, + 0x12, 0xD9, 0xCD, 0xC6, 0x31, 0xEA, 0xAC, 0xD4, 0xB2, 0xF7, 0x0B, 0xE7, + 0x60, 0xF9, 0x6C, 0xF5, 0x7C, 0xF3, 0x24, 0xF9, 0x81, 0xEC, 0x4E, 0xFA, + 0x24, 0xE7, 0xA6, 0x04, 0x53, 0xDF, 0x48, 0x08, 0xBF, 0xDD, 0xD9, 0xF9, + 0xB5, 0xE0, 0x91, 0xF2, 0xD4, 0xDD, 0x6C, 0xF2, 0x18, 0xE2, 0xF6, 0xEF, + 0xB4, 0xED, 0x82, 0xF5, 0xD7, 0xED, 0x21, 0xFB, 0x24, 0xDE, 0x8E, 0xF3, + 0xC2, 0xDC, 0x15, 0xEB, 0x40, 0xE5, 0xEF, 0xE9, 0xF1, 0xF1, 0xAA, 0xEA, + 0xE5, 0xFB, 0x14, 0xE3, 0xA6, 0xEC, 0xBF, 0xDC, 0xF3, 0xE6, 0xE9, 0xE2, + 0x1A, 0xF6, 0xD1, 0xE3, 0xDB, 0xF7, 0xCD, 0xD6, 0xEA, 0xE4, 0xC7, 0xCE, + 0x8D, 0xDE, 0x33, 0xD0, 0xA2, 0xE6, 0xDD, 0xCF, 0x77, 0xEC, 0x72, 0xD9, + 0xCD, 0xEB, 0x48, 0xE5, 0xCB, 0xEF, 0x1D, 0xF6, 0x38, 0x00, 0x31, 0x09, + 0x09, 0xFF, 0x68, 0x09, 0xFB, 0xFE, 0xB7, 0x0B, 0x29, 0x07, 0x1E, 0x12, + 0x34, 0x05, 0x2E, 0x17, 0x0D, 0x0C, 0xD3, 0x17, 0x10, 0x0F, 0x0E, 0x10, + 0x05, 0x0C, 0xF0, 0x11, 0xE8, 0x16, 0xB9, 0x17, 0xA9, 0x25, 0xAA, 0x19, + 0xE3, 0x27, 0x53, 0x1B, 0x19, 0x23, 0xD9, 0x1F, 0xD8, 0x1F, 0x60, 0x22, + 0xC4, 0x1A, 0xF2, 0x1D, 0x74, 0x26, 0xF2, 0x26, 0x0B, 0x34, 0x23, 0x30, + 0xA4, 0x32, 0x76, 0x2A, 0x0A, 0x34, 0x10, 0x2D, 0x37, 0x39, 0x8B, 0x30, + 0x56, 0x3A, 0xE8, 0x29, 0x96, 0x32, 0xDA, 0x1D, 0x31, 0x28, 0xFE, 0x1B, + 0x0C, 0x25, 0x26, 0x23, 0xD9, 0x2C, 0x2F, 0x21, 0x39, 0x31, 0x49, 0x24, + 0xB7, 0x31, 0x09, 0x2B, 0xF1, 0x2C, 0x90, 0x23, 0xDD, 0x26, 0x92, 0x1D, + 0x1F, 0x2B, 0x62, 0x28, 0xDA, 0x21, 0xB6, 0x2D, 0x79, 0x14, 0xF8, 0x35, + 0xB3, 0x10, 0x59, 0x44, 0xA3, 0x0F, 0xCA, 0x42, 0x20, 0x12, 0x96, 0x35, + 0x30, 0x0D, 0xD7, 0x25, 0xF4, 0xFF, 0x3D, 0x1B, 0x03, 0xF4, 0x2B, 0x15, + 0xCB, 0xEB, 0xB8, 0x0D, 0x97, 0xE0, 0xF5, 0xFA, 0xFD, 0xE6, 0x4A, 0x01, + 0x3D, 0x09, 0x33, 0x14, 0x6F, 0x28, 0xE4, 0x0A, 0x18, 0x28, 0x0A, 0x02, + 0x81, 0x16, 0x29, 0x01, 0x16, 0x0D, 0x0D, 0xF7, 0x68, 0x12, 0xA4, 0xF7, + 0x52, 0x1C, 0x18, 0x01, 0xE9, 0x18, 0xC0, 0xF5, 0x68, 0x0E, 0xE5, 0xEB, + 0x51, 0x0F, 0x20, 0xF7, 0x3E, 0x19, 0xA9, 0x07, 0x05, 0x10, 0xD5, 0x0E, + 0xAC, 0x05, 0xC1, 0x13, 0x84, 0x10, 0x2C, 0x1B, 0x07, 0x1E, 0xE9, 0x19, + 0xCD, 0x20, 0xE2, 0x18, 0x5F, 0x21, 0xDD, 0x24, 0xC9, 0x1A, 0xBD, 0x22, + 0x7B, 0x11, 0x4B, 0x12, 0x9A, 0x1B, 0x77, 0x15, 0x4F, 0x21, 0xC1, 0x13, + 0x5B, 0x12, 0x8E, 0x05, 0x1F, 0xFD, 0xB6, 0x07, 0xAB, 0xFC, 0x2F, 0x12, + 0x15, 0xFF, 0xCF, 0x0C, 0xC2, 0xF5, 0x26, 0x06, 0x0E, 0xFC, 0x0B, 0x12, + 0x41, 0xFB, 0x3B, 0x04, 0xA8, 0xF4, 0x15, 0xEA, 0x49, 0xFA, 0x4F, 0xEA, + 0x17, 0xFE, 0x36, 0xF2, 0xF2, 0xFA, 0x84, 0xFB, 0xBC, 0xF9, 0x9F, 0xFD, + 0xAE, 0xFC, 0x35, 0xF6, 0x2D, 0xF7, 0x56, 0xED, 0x73, 0xF1, 0x51, 0xF3, + 0xF2, 0xEB, 0xC4, 0xFD, 0x0F, 0xD6, 0x8F, 0xEE, 0x1D, 0xCB, 0xF7, 0xE6, + 0x38, 0xDE, 0xDC, 0xF9, 0x85, 0xE8, 0x14, 0xFC, 0x06, 0xDE, 0x24, 0xEC, + 0x7E, 0xE1, 0x4D, 0xEF, 0x1F, 0xEA, 0x47, 0xF6, 0xCA, 0xE9, 0x1A, 0xF1, + 0x3F, 0xF2, 0x96, 0xF2, 0x97, 0xEC, 0xA2, 0xEA, 0x1B, 0xE0, 0x1D, 0xD5, + 0xD3, 0xE5, 0x56, 0xCD, 0x50, 0xE6, 0xF6, 0xD2, 0x95, 0xDC, 0x1E, 0xD6, + 0x4B, 0xDE, 0xF6, 0xE2, 0x0B, 0xF1, 0x24, 0xF2, 0x26, 0x02, 0x9E, 0xEE, + 0x95, 0x01, 0xC4, 0xEB, 0xD3, 0xF7, 0xAE, 0xEB, 0x8E, 0xF4, 0x8E, 0xE8, + 0xED, 0xFB, 0x28, 0xEB, 0xFF, 0x08, 0x82, 0xED, 0xAD, 0x05, 0x43, 0xDB, + 0xB6, 0xFF, 0xDF, 0xCE, 0xBB, 0x07, 0x40, 0xDB, 0xD1, 0x08, 0xC2, 0xDD, + 0x6A, 0xFA, 0xC0, 0xE9, 0x44, 0xF1, 0x02, 0x00, 0xBE, 0xF8, 0xBB, 0x00, + 0x6C, 0x06, 0xE2, 0x01, 0x2F, 0x10, 0xC1, 0x0E, 0x08, 0x08, 0x70, 0x14, + 0x2E, 0xFC, 0xE9, 0x1B, 0x75, 0xF6, 0x22, 0x2F, 0x54, 0xEB, 0xC3, 0x25, + 0xF1, 0xDE, 0xC1, 0x10, 0x1F, 0xD6, 0x3B, 0x09, 0x49, 0xD3, 0x97, 0xFF, + 0x6B, 0xD5, 0x6B, 0xF7, 0x3E, 0xE1, 0x0A, 0xEF, 0xAA, 0xF2, 0x92, 0xF3, + 0x77, 0xFB, 0x53, 0xFB, 0xB4, 0xF9, 0xE5, 0xFC, 0xC3, 0xF9, 0x79, 0xF3, + 0xEC, 0x03, 0x45, 0xDB, 0x58, 0x05, 0x2C, 0xD3, 0x52, 0xFD, 0x66, 0xE2, + 0xC9, 0xFA, 0x7E, 0xED, 0x5B, 0xF9, 0xB5, 0xDF, 0xA0, 0xF5, 0x5E, 0xCF, + 0x78, 0xED, 0x46, 0xD9, 0xD4, 0xE4, 0x8A, 0xE8, 0x11, 0xE8, 0x44, 0xE5, + 0x7F, 0xF2, 0x11, 0xE3, 0xEB, 0xFF, 0x20, 0xEC, 0xF7, 0x0C, 0x65, 0xFC, + 0x3A, 0x08, 0xDE, 0x06, 0x61, 0x00, 0xA7, 0xFC, 0x83, 0x03, 0xD9, 0xF4, + 0x60, 0x03, 0x14, 0xFD, 0x1E, 0xFE, 0xA1, 0x02, 0x6C, 0xF7, 0xA0, 0xFD, + 0x34, 0xF1, 0xCB, 0xF6, 0x8E, 0xEB, 0x6E, 0xF7, 0xDD, 0xE6, 0x93, 0xFD, + 0x71, 0xE1, 0xC6, 0xFA, 0x02, 0xE4, 0x36, 0xF9, 0x83, 0xF2, 0xAF, 0x04, + 0xA2, 0xFA, 0xC0, 0x07, 0x81, 0xFF, 0x41, 0x01, 0xA6, 0x03, 0x83, 0x02, + 0xC5, 0x0B, 0x86, 0x0C, 0xDE, 0x18, 0x6C, 0x12, 0xFD, 0x13, 0xF1, 0x0C, + 0x37, 0x03, 0xBD, 0x02, 0x41, 0xF6, 0xFE, 0xFA, 0xF0, 0xF3, 0x87, 0xFB, + 0x3A, 0x04, 0xD7, 0x08, 0xBB, 0x16, 0x68, 0x19, 0xE4, 0x15, 0xA6, 0x1B, + 0x5B, 0x0A, 0xA7, 0x17, 0xB9, 0xFC, 0xD5, 0x14, 0x69, 0xF7, 0x38, 0x0F, + 0x25, 0x03, 0xFB, 0x0E, 0xE8, 0x12, 0x9D, 0x1B, 0xBA, 0x22, 0xDE, 0x26, + 0x1F, 0x21, 0xBF, 0x1B, 0x42, 0x08, 0x90, 0x0F, 0xEA, 0xF3, 0xC1, 0x15, + 0xE7, 0xED, 0x5E, 0x17, 0x37, 0xF6, 0x7D, 0x0C, 0x95, 0xFC, 0x03, 0x04, + 0xF0, 0x04, 0xCD, 0x01, 0x1A, 0x1B, 0x1B, 0x05, 0x7E, 0x20, 0xF3, 0x0A, + 0xFB, 0x1A, 0xAE, 0xFF, 0xC1, 0x1D, 0x82, 0xED, 0x78, 0x26, 0xCB, 0xEE, + 0x63, 0x2B, 0xC1, 0xF6, 0x5D, 0x24, 0xBE, 0xFE, 0x04, 0x11, 0x69, 0xF7, + 0x6B, 0x03, 0x1F, 0xE7, 0x2B, 0x0B, 0x0D, 0xEC, 0x1B, 0x0A, 0x57, 0xFD, + 0x6C, 0xFE, 0x41, 0x06, 0x86, 0xFE, 0x0E, 0x03, 0x22, 0xFF, 0x5D, 0x09, + 0xDD, 0xFB, 0x1B, 0x14, 0x47, 0xFF, 0xF6, 0x17, 0xC1, 0x08, 0xEA, 0x19, + 0x15, 0x0E, 0xD2, 0x17, 0x2E, 0x0F, 0x9D, 0x19, 0x39, 0x0B, 0xCC, 0x16, + 0xA4, 0x02, 0x48, 0x13, 0xFF, 0xF5, 0x33, 0x14, 0xA7, 0xEF, 0x5D, 0x14, + 0xBD, 0xF8, 0x9D, 0x15, 0xE3, 0xF9, 0x51, 0x14, 0xB8, 0xF0, 0x09, 0x16, + 0x9B, 0xE6, 0x41, 0x0D, 0x73, 0xE7, 0x30, 0xFD, 0xF3, 0xF5, 0x61, 0xF4, + 0x56, 0xFD, 0x0D, 0xF1, 0xBA, 0x0D, 0x0B, 0xFD, 0x7A, 0x20, 0x36, 0x0B, + 0x0A, 0x1D, 0x0D, 0x04, 0x25, 0x1A, 0x22, 0xF9, 0xA2, 0x18, 0x92, 0xFD, + 0x7D, 0x10, 0xEC, 0x05, 0x94, 0x0D, 0x8B, 0x07, 0xF4, 0x11, 0x2A, 0x07, + 0x30, 0x15, 0x58, 0x07, 0x3E, 0x15, 0x81, 0x01, 0x8F, 0x11, 0xD3, 0xFC, + 0x31, 0x11, 0x76, 0x02, 0x89, 0x0F, 0xB8, 0x0B, 0x68, 0x0E, 0xAB, 0x0D, + 0x70, 0x1C, 0xC1, 0x0C, 0xB7, 0x16, 0x53, 0x0C, 0xE7, 0x07, 0x37, 0x0C, + 0x0F, 0x0A, 0xE3, 0x11, 0xF7, 0x03, 0x28, 0x17, 0x6D, 0xFF, 0x99, 0x17, + 0x31, 0x00, 0x9D, 0x13, 0xF9, 0xFA, 0x65, 0x0D, 0xA8, 0xF5, 0x81, 0x02, + 0x5E, 0xF9, 0x37, 0xFA, 0x72, 0xFF, 0x37, 0xFC, 0xAF, 0x03, 0x6E, 0xFB, + 0x2F, 0x08, 0x4E, 0xF6, 0x74, 0xFF, 0x0E, 0xF4, 0xC5, 0xF7, 0x02, 0xFC, + 0x9F, 0xF5, 0xDB, 0xFF, 0xC3, 0xED, 0x72, 0xF5, 0xCC, 0xEB, 0xDF, 0xF3, + 0xDD, 0xE7, 0x5E, 0xFD, 0xEE, 0xD9, 0x36, 0xF9, 0x36, 0xCE, 0x25, 0xEC, + 0xDE, 0xCB, 0x1C, 0xEC, 0x30, 0xD2, 0x30, 0xEF, 0xD6, 0xE0, 0x88, 0xED, + 0xA6, 0xE7, 0x19, 0xF1, 0xBA, 0xE6, 0xFB, 0xF1, 0x24, 0xEF, 0x32, 0xE3, + 0xE9, 0xEE, 0xD7, 0xD8, 0x4A, 0xE3, 0x8F, 0xE2, 0x5E, 0xE1, 0xEB, 0xE4, + 0xDB, 0xE6, 0x55, 0xDF, 0xC0, 0xE1, 0xE0, 0xE6, 0x3E, 0xDE, 0x7A, 0xE6, + 0x04, 0xE2, 0xA2, 0xD5, 0x6D, 0xDD, 0x01, 0xCB, 0x65, 0xE4, 0xFD, 0xCF, + 0x30, 0xEE, 0xB6, 0xD3, 0x54, 0xEC, 0xEA, 0xC9, 0x16, 0xF4, 0x06, 0xC8, + 0x8D, 0xF6, 0xB5, 0xD3, 0x95, 0xEC, 0x9B, 0xD5, 0x74, 0xEF, 0x27, 0xD6, + 0x2A, 0xF5, 0x91, 0xE3, 0xD9, 0xEA, 0xC2, 0xEA, 0x35, 0xE8, 0x36, 0xF1, + 0xC0, 0xEF, 0x08, 0xFB, 0xB1, 0xEF, 0xC8, 0xF4, 0xF7, 0xE9, 0x87, 0xE8, + 0x89, 0xE0, 0xC6, 0xE6, 0xD9, 0xE0, 0xA8, 0xE0, 0xE9, 0xEC, 0xFD, 0xDB, + 0xE8, 0xEC, 0x66, 0xE5, 0xD9, 0xE8, 0x06, 0xE9, 0x0D, 0xEF, 0xCD, 0xEA, + 0x0C, 0xF2, 0x5B, 0xF8, 0x70, 0xF8, 0x78, 0x07, 0x07, 0xFD, 0x5C, 0x10, + 0x08, 0xF9, 0xAF, 0x14, 0xDD, 0xF6, 0x4A, 0x0D, 0xA4, 0xF7, 0xE9, 0x04, + 0xE5, 0xFB, 0xBE, 0x01, 0x1D, 0x00, 0x40, 0xFF, 0x20, 0x03, 0x34, 0x02, + 0xC2, 0x09, 0x9D, 0x03, 0x25, 0x10, 0xF2, 0x00, 0x20, 0x16, 0x9E, 0x0A, + 0x26, 0x19, 0xF6, 0x1A, 0x85, 0x16, 0x29, 0x13, 0x82, 0x18, 0x11, 0x0D, + 0x2F, 0x1A, 0xFB, 0x19, 0x92, 0x15, 0x34, 0x1B, 0xBE, 0x09, 0x81, 0x12, + 0xBC, 0x06, 0xC6, 0x0E, 0xCB, 0x11, 0xBA, 0x09, 0xCB, 0x18, 0x7A, 0xFF, + 0xC8, 0x1E, 0xC5, 0x01, 0x3F, 0x26, 0x7E, 0x18, 0xAF, 0x2C, 0xD3, 0x2D, + 0xD6, 0x2E, 0x2B, 0x36, 0x2F, 0x27, 0x6C, 0x3D, 0xE4, 0x16, 0x6E, 0x41, + 0x13, 0x0C, 0x91, 0x3B, 0xFC, 0x02, 0x09, 0x32, 0x27, 0xFD, 0x28, 0x2C, + 0xCF, 0x0E, 0xCD, 0x22, 0xE4, 0x1E, 0x72, 0x19, 0x23, 0x1D, 0x31, 0x20, + 0xBA, 0x27, 0x82, 0x1A, 0x4A, 0x3A, 0x57, 0x06, 0xC1, 0x3C, 0x43, 0x0A, + 0x9B, 0x31, 0xF2, 0x10, 0xCA, 0x28, 0xDE, 0x18, 0x7F, 0x2D, 0x1B, 0x2D, + 0xFF, 0x31, 0x4F, 0x33, 0x3F, 0x2A, 0x24, 0x35, 0x23, 0x22, 0xB0, 0x33, + 0x35, 0x18, 0xBB, 0x2B, 0xFB, 0x13, 0xE9, 0x2A, 0xF0, 0x20, 0x6C, 0x2B, + 0x19, 0x2C, 0xBE, 0x27, 0x55, 0x2B, 0x10, 0x22, 0x10, 0x24, 0x1E, 0x1C, + 0x49, 0x28, 0x35, 0x18, 0x49, 0x30, 0x80, 0x18, 0x1B, 0x2A, 0x09, 0x1D, + 0x5F, 0x1C, 0x4D, 0x21, 0x02, 0x17, 0xAC, 0x27, 0xD5, 0x1A, 0xC0, 0x29, + 0xBB, 0x16, 0xAB, 0x16, 0xFF, 0x0F, 0xA7, 0x0D, 0xE7, 0x12, 0x60, 0x15, + 0xDC, 0x19, 0x5A, 0x07, 0xDE, 0x11, 0xE5, 0xF9, 0x4C, 0x04, 0x4F, 0xF4, + 0x4A, 0x05, 0x87, 0xE4, 0xDF, 0x06, 0x90, 0xE6, 0xE7, 0xFD, 0xB8, 0xF8, + 0xAD, 0xF8, 0xAE, 0x02, 0x12, 0x04, 0xC9, 0x06, 0xD5, 0x0D, 0x86, 0x03, + 0x68, 0x0A, 0xAD, 0xFB, 0x2F, 0x00, 0xB4, 0xF9, 0x34, 0xEF, 0x05, 0xFB, + 0xD7, 0xE8, 0x61, 0x02, 0xA4, 0xF2, 0x64, 0x06, 0xC4, 0xF8, 0x52, 0x02, + 0x3F, 0xF9, 0x34, 0xFE, 0xC8, 0xF2, 0x53, 0xEF, 0x59, 0xE7, 0xCC, 0xDE, + 0x86, 0xE5, 0xE4, 0xE2, 0x99, 0xDC, 0xFB, 0xF0, 0xF9, 0xCF, 0x05, 0xFB, + 0xE0, 0xD8, 0xDD, 0x05, 0xD1, 0xE2, 0x25, 0x0A, 0xD3, 0xDE, 0x21, 0x08, + 0x1B, 0xDF, 0x22, 0x02, 0x67, 0xEF, 0x29, 0xF5, 0x53, 0xF8, 0xAC, 0xF1, + 0x89, 0xFA, 0x0B, 0xEE, 0x71, 0x07, 0x81, 0xE3, 0x33, 0x05, 0x27, 0xDE, + 0xA6, 0xFD, 0x4F, 0xE0, 0xC5, 0xF9, 0x8C, 0xE0, 0x23, 0xEF, 0x88, 0xE3, + 0xA3, 0xF0, 0x36, 0xED, 0x28, 0xFF, 0xD0, 0xEC, 0x25, 0x01, 0xA4, 0xE6, + 0x74, 0xEF, 0xF4, 0xF0, 0x2F, 0xE7, 0x3F, 0xF7, 0x39, 0xE9, 0x28, 0xE9, + 0x28, 0xE5, 0x95, 0xE6, 0xD3, 0xEA, 0x0D, 0xE7, 0xE3, 0xF2, 0xDF, 0xE3, + 0x15, 0xE6, 0xAB, 0xE9, 0x2A, 0xD6, 0x70, 0xEF, 0x64, 0xD8, 0x31, 0xEC, + 0xA7, 0xE1, 0x8B, 0xE2, 0x39, 0xE6, 0x6F, 0xE1, 0x4E, 0xEC, 0x94, 0xE4, + 0x42, 0xF9, 0x31, 0xEA, 0x8E, 0xFE, 0xE4, 0xE9, 0x80, 0xFC, 0xD8, 0xE2, + 0xC0, 0xF1, 0x7C, 0xDE, 0x84, 0xE5, 0x8E, 0xDD, 0x05, 0xE7, 0x83, 0xDF, + 0x3B, 0xE8, 0x3C, 0xDE, 0xFB, 0xE1, 0xC7, 0xE6, 0x6A, 0xE0, 0x3F, 0xFA, + 0x9A, 0xE4, 0x81, 0xFC, 0x4D, 0xE9, 0xEA, 0xEE, 0x91, 0xF0, 0xCD, 0xE9, + 0xEA, 0xEC, 0x71, 0xEF, 0x0E, 0xE3, 0xFC, 0xF4, 0xBD, 0xE5, 0xDE, 0xFD, + 0xFD, 0xE7, 0x9A, 0x01, 0xA8, 0xE4, 0x56, 0xFA, 0x71, 0xE8, 0xC5, 0xF9, + 0xD1, 0xF1, 0x25, 0xFB, 0xFA, 0xF3, 0xB2, 0xF3, 0x06, 0xE7, 0xC7, 0xE7, + 0x22, 0xE1, 0xA8, 0xE7, 0x49, 0xE2, 0xBA, 0xEA, 0x02, 0xDE, 0xD8, 0xE8, + 0xD1, 0xE0, 0xDF, 0xEA, 0x83, 0xEA, 0x2A, 0xE4, 0x11, 0xF2, 0x3C, 0xE0, + 0x84, 0xED, 0x0E, 0xE5, 0xD5, 0xE0, 0xD2, 0xE8, 0x3B, 0xDB, 0x8D, 0xE5, + 0x0A, 0xDB, 0x8C, 0xD6, 0xE5, 0xE8, 0x38, 0xD6, 0xF8, 0xFE, 0xF9, 0xE4, + 0xB0, 0xFF, 0x6E, 0xF1, 0x29, 0xFE, 0x00, 0xF7, 0xD1, 0x04, 0x7E, 0xFA, + 0x87, 0x01, 0xB4, 0xFC, 0x9C, 0xFD, 0x8C, 0xF6, 0x8B, 0x03, 0xA7, 0xF4, + 0x8C, 0x12, 0x44, 0xFC, 0xB7, 0x17, 0x80, 0xFF, 0xFF, 0x11, 0x1E, 0x05, + 0xEF, 0x04, 0x9E, 0x07, 0xCF, 0xF8, 0x2B, 0x03, 0xCC, 0x00, 0x09, 0x03, + 0xD2, 0x01, 0x43, 0x08, 0x3E, 0xF6, 0x80, 0x17, 0x3C, 0xFA, 0x96, 0x26, + 0x56, 0x0E, 0x02, 0x2D, 0x82, 0x21, 0xE8, 0x28, 0x00, 0x23, 0x54, 0x1E, + 0x24, 0x1B, 0x1C, 0x19, 0xB9, 0x17, 0x5A, 0x12, 0xDE, 0x13, 0x55, 0x03, + 0x6C, 0x14, 0xA5, 0xF2, 0xD5, 0x17, 0x36, 0xEF, 0xC8, 0x14, 0x92, 0xF6, + 0xF0, 0x12, 0x5D, 0xF1, 0x3D, 0x1D, 0x32, 0xEE, 0xD8, 0x25, 0x73, 0xFA, + 0xE1, 0x16, 0x80, 0x02, 0xC3, 0x06, 0xF6, 0x0A, 0x45, 0x02, 0x36, 0x1C, + 0x53, 0x02, 0xA3, 0x21, 0xD9, 0x08, 0x15, 0x1F, 0xAD, 0x03, 0x11, 0x25, + 0x37, 0xF3, 0x88, 0x1A, 0xBC, 0xED, 0x9F, 0x08, 0x96, 0xED, 0x4B, 0x07, + 0x7D, 0xE8, 0xC0, 0x0B, 0xA3, 0xEC, 0x2B, 0x11, 0xA3, 0x01, 0xB7, 0x03, + 0x61, 0x0D, 0x44, 0xF3, 0x49, 0x04, 0x95, 0x00, 0xDB, 0x01, 0xB5, 0x11, + 0x12, 0xFA, 0x5C, 0x0E, 0xFB, 0xED, 0x0B, 0x02, 0x32, 0xF4, 0x63, 0xFB, + 0xAC, 0xF9, 0x62, 0xEF, 0x21, 0xFD, 0xC5, 0xE9, 0x5D, 0x08, 0x8C, 0xF2, + 0x78, 0x13, 0xD6, 0xF0, 0xD3, 0x1C, 0xCA, 0xF2, 0xD5, 0x20, 0x4A, 0xF9, + 0x4B, 0x15, 0x79, 0xFE, 0x83, 0x08, 0x0D, 0x07, 0x51, 0x0D, 0x08, 0x0C, + 0xFC, 0x18, 0x1C, 0x15, 0xD8, 0x1B, 0xCF, 0x1E, 0x30, 0x21, 0x9F, 0x2B, + 0xA9, 0x2A, 0x2F, 0x2B, 0x7D, 0x1E, 0xB4, 0x17, 0x04, 0x0C, 0xA4, 0x19, + 0xCE, 0x05, 0xA3, 0x1E, 0x24, 0x0A, 0x0F, 0x1E, 0x9E, 0x14, 0xA8, 0x23, + 0xE6, 0x13, 0x5D, 0x19, 0x1E, 0x1C, 0x95, 0x19, 0x4E, 0x23, 0xD1, 0x25, + 0x5D, 0x11, 0x76, 0x23, 0xEE, 0x0A, 0xDD, 0x2C, 0x67, 0x0A, 0x0C, 0x2B, + 0x77, 0x07, 0x21, 0x1F, 0xF8, 0x11, 0x5C, 0x24, 0xF7, 0x1A, 0x95, 0x27, + 0x91, 0x0D, 0x17, 0x18, 0xC3, 0x0F, 0x79, 0x15, 0x58, 0x13, 0xE6, 0x12, + 0x44, 0x0A, 0x12, 0x07, 0x6F, 0x17, 0x20, 0x0D, 0x7E, 0x1E, 0x32, 0x06, + 0x81, 0x25, 0x51, 0x01, 0x9D, 0x2A, 0x3F, 0x02, 0x3C, 0x21, 0xD3, 0x04, + 0x89, 0x0F, 0xCF, 0x02, 0x1E, 0x21, 0xFA, 0x12, 0xD8, 0x29, 0x4C, 0x21, + 0x0A, 0x04, 0x0F, 0x10, 0x67, 0x08, 0x88, 0x1B, 0x2D, 0x04, 0x33, 0x17, + 0x40, 0xF4, 0xD4, 0x08, 0x30, 0x12, 0x83, 0x1D, 0x5C, 0x0E, 0x48, 0x14, + 0xFE, 0xF9, 0x45, 0xFA, 0xA4, 0x06, 0x7E, 0xFD, 0x2C, 0x02, 0xEA, 0x07, + 0x08, 0xF1, 0xDF, 0x0E, 0xD8, 0xF0, 0x37, 0x10, 0xC3, 0xF0, 0x69, 0xF5, + 0xC3, 0xF3, 0x11, 0xE8, 0xD7, 0xED, 0x5D, 0xE9, 0xA8, 0xE2, 0xE4, 0xDA, + 0x00, 0xEB, 0xF0, 0xD4, 0xDB, 0xEB, 0xD6, 0xC2, 0x2E, 0xEC, 0x1A, 0xBB, + 0xD2, 0xF2, 0x96, 0xC4, 0x22, 0xE7, 0x51, 0xBD, 0xF8, 0xDC, 0xDA, 0xC1, + 0x79, 0xE0, 0x33, 0xD3, 0xF6, 0xE0, 0xBF, 0xDA, 0x6B, 0xDD, 0xBF, 0xD8, + 0x9F, 0xE4, 0xAD, 0xE0, 0x7C, 0xD5, 0x00, 0xE4, 0xEC, 0xBC, 0x3D, 0xDE, + 0x99, 0xC0, 0x3E, 0xDE, 0x18, 0xC2, 0x58, 0xD4, 0xE0, 0xC0, 0x3A, 0xCD, + 0xF4, 0xC4, 0xAC, 0xD2, 0x9C, 0xCF, 0xE9, 0xD7, 0x41, 0xD9, 0xF4, 0xDA, + 0xE1, 0xD2, 0x16, 0xDD, 0xD0, 0xCE, 0x8C, 0xE2, 0xCE, 0xC4, 0x69, 0xE3, + 0x9E, 0xCB, 0x19, 0xE8, 0x73, 0xD4, 0x8F, 0xE5, 0x51, 0xC9, 0x10, 0xDD, + 0xBB, 0xD9, 0xC5, 0xE4, 0xB2, 0xE4, 0x3E, 0xE5, 0xCC, 0xD5, 0xEA, 0xD2, + 0x01, 0xDC, 0x8F, 0xCB, 0x85, 0xE6, 0x29, 0xCF, 0x43, 0xED, 0x77, 0xDD, + 0x86, 0xF4, 0xA8, 0xE8, 0x0C, 0xFC, 0x3E, 0xE3, 0xFE, 0x08, 0x16, 0xE3, + 0xCD, 0xFE, 0x0C, 0xDB, 0x9C, 0xF7, 0x3A, 0xDF, 0xC8, 0xFB, 0x42, 0xF1, + 0x63, 0xF3, 0x79, 0xF1, 0x5C, 0xF1, 0x65, 0xF7, 0xE2, 0xF2, 0x22, 0x01, + 0x94, 0xFA, 0xC7, 0x07, 0x6A, 0xF7, 0xBF, 0xFD, 0xD6, 0xEC, 0xB4, 0xEE, + 0x10, 0xFB, 0x3B, 0x00, 0xF6, 0xED, 0x18, 0x01, 0x75, 0xE2, 0xD6, 0x02, + 0x41, 0xEF, 0xE8, 0x18, 0xA1, 0xE6, 0xAB, 0x0E, 0x6F, 0xFD, 0xAE, 0x11, + 0x42, 0x10, 0xF3, 0x15, 0xA2, 0x01, 0xA7, 0xFE, 0xE2, 0x0C, 0xF9, 0x00, + 0xF3, 0x0E, 0x29, 0xFD, 0x1D, 0xF7, 0x53, 0xE4, 0x7D, 0xFF, 0x09, 0xEF, + 0xC2, 0x0C, 0x50, 0xF3, 0xB3, 0x08, 0x3F, 0xE9, 0x83, 0x13, 0xA9, 0xFF, + 0x3E, 0x21, 0xA2, 0x13, 0xA5, 0x1B, 0x65, 0x0B, 0x42, 0x17, 0xC8, 0x0D, + 0x3C, 0x22, 0x10, 0x20, 0x8B, 0x26, 0x4C, 0x24, 0x27, 0x20, 0x50, 0x20, + 0x0E, 0x27, 0x82, 0x2C, 0x6F, 0x26, 0x85, 0x35, 0x00, 0x1C, 0xAA, 0x2E, + 0x2F, 0x1C, 0x8F, 0x2A, 0x12, 0x17, 0xE0, 0x27, 0x25, 0x17, 0x82, 0x2C, + 0x83, 0x1B, 0xD8, 0x2F, 0xFA, 0x26, 0xE7, 0x39, 0xBE, 0x2F, 0xBF, 0x44, + 0x84, 0x24, 0x93, 0x35, 0xB3, 0x25, 0x6A, 0x26, 0xC2, 0x26, 0x46, 0x1B, + 0xBE, 0x19, 0x4A, 0x0E, 0x11, 0x22, 0x12, 0x15, 0xB2, 0x2F, 0x30, 0x21, + 0x5E, 0x25, 0xAC, 0x1C, 0x9E, 0x2F, 0x11, 0x21, 0xCB, 0x39, 0x7E, 0x18, + 0xBE, 0x21, 0xAE, 0x03, 0x6F, 0x21, 0x89, 0x11, 0x5D, 0x2B, 0x1A, 0x1D, + 0xBF, 0x1E, 0x5B, 0x14, 0x87, 0x23, 0x1C, 0x18, 0xA2, 0x28, 0x1B, 0x27, + 0x73, 0x1E, 0x57, 0x29, 0x81, 0x28, 0x2D, 0x1A, 0xE8, 0x2C, 0x2C, 0x10, + 0x08, 0x1F, 0x66, 0x1A, 0xDF, 0x0E, 0x59, 0x1E, 0xD8, 0x06, 0xE9, 0x1E, + 0x48, 0x06, 0x30, 0x21, 0x1D, 0x03, 0x4A, 0x1E, 0x00, 0x02, 0xB8, 0x25, + 0x16, 0x00, 0x33, 0x2D, 0x36, 0xFB, 0x27, 0x29, 0x77, 0x00, 0x81, 0x22, + 0x32, 0x01, 0xF1, 0x14, 0x60, 0xFA, 0xCC, 0x09, 0xC2, 0x05, 0x8C, 0x0C, + 0xD1, 0x12, 0x6C, 0x0B, 0x3E, 0x1A, 0x72, 0x0C, 0x99, 0x1C, 0x11, 0x0D, + 0x88, 0x1E, 0xD6, 0x0C, 0xE2, 0x19, 0x86, 0x04, 0x6E, 0x0E, 0x28, 0xFA, + 0x5B, 0x15, 0x57, 0x03, 0xD9, 0x0F, 0x76, 0xFC, 0xFB, 0x0D, 0xA8, 0xF7, + 0xA5, 0x1B, 0x78, 0x00, 0xEB, 0x19, 0xD0, 0xFA, 0xBE, 0x13, 0x69, 0xFB, + 0x2E, 0x1B, 0xC5, 0x16, 0x35, 0x1C, 0x90, 0x27, 0x96, 0x12, 0x8D, 0x1D, + 0xAB, 0x1B, 0xD2, 0x29, 0x6C, 0x0C, 0xBB, 0x2C, 0xB8, 0xED, 0x71, 0x1C, + 0x2B, 0xF5, 0x15, 0x1D, 0x7A, 0x03, 0x4B, 0x15, 0x96, 0x13, 0x30, 0x15, + 0x7A, 0x1F, 0xAE, 0x1E, 0xDA, 0x28, 0x8E, 0x25, 0x83, 0x29, 0x97, 0x29, + 0x4D, 0x12, 0xEA, 0x1C, 0x9A, 0x23, 0x9E, 0x23, 0xDF, 0x39, 0x45, 0x2D, + 0xA9, 0x37, 0x43, 0x2F, 0xBE, 0x4C, 0xD4, 0x3C, 0x06, 0x4A, 0xFC, 0x2D, + 0xA9, 0x36, 0xB8, 0x1C, 0x6C, 0x36, 0x38, 0x2A, 0xA1, 0x25, 0x45, 0x21, + 0x15, 0x1B, 0x6B, 0x0A, 0xA6, 0x19, 0x37, 0x04, 0xAF, 0x08, 0x1E, 0xF9, + 0x0C, 0x14, 0xFB, 0x07, 0x86, 0x1F, 0x67, 0x22, 0x46, 0x08, 0xB5, 0x1B, + 0x6A, 0x08, 0x02, 0x20, 0x9E, 0x18, 0x29, 0x29, 0x08, 0x07, 0x8C, 0x13, + 0x0A, 0xE6, 0x60, 0xFD, 0x72, 0xE0, 0xC7, 0xFE, 0x1D, 0xF9, 0x7A, 0x13, + 0x1F, 0x05, 0x5C, 0x17, 0x45, 0xEA, 0xEE, 0xF9, 0xA8, 0xE0, 0x30, 0xF4, + 0x3C, 0xE0, 0xBF, 0xED, 0xF7, 0xB8, 0xAF, 0xC4, 0xAB, 0x9A, 0x24, 0xAF, + 0x3D, 0xB3, 0x31, 0xC6, 0x2A, 0xCE, 0x98, 0xDC, 0x89, 0xC3, 0xEC, 0xC9, + 0x82, 0xC3, 0x26, 0xBD, 0x2F, 0xC2, 0x2E, 0xBC, 0xBE, 0xA8, 0x13, 0xAA, + 0x4B, 0xAF, 0xC3, 0xAB, 0xCB, 0xC1, 0xCB, 0xB3, 0x17, 0xBC, 0xA2, 0xA9, + 0xEA, 0xB9, 0x20, 0xA5, 0x63, 0xC1, 0xB6, 0xB2, 0x43, 0xB4, 0xF1, 0xB1, + 0x2A, 0xA2, 0x1C, 0xA2, 0xB3, 0xA8, 0xC3, 0xA1, 0x45, 0xAE, 0xF0, 0xA2, + 0xFC, 0xA7, 0x49, 0xA0, 0x2F, 0xA5, 0x6D, 0xA2, 0x0B, 0xAA, 0x89, 0xA4, + 0x4A, 0xAC, 0xB1, 0xA4, 0x6A, 0xAA, 0x1B, 0xA7, 0x14, 0xA5, 0xD3, 0xA3, + 0x8D, 0xA4, 0x03, 0xA2, 0x45, 0xA9, 0x0B, 0xAE, 0xC2, 0xA6, 0x57, 0xB2, + 0x77, 0xA2, 0xDA, 0xA8, 0x76, 0xA1, 0xF7, 0xA1, 0xEE, 0xA9, 0xF1, 0xAA, + 0x14, 0xB1, 0x23, 0xB4, 0x9D, 0xB8, 0x5F, 0xB5, 0x1A, 0xCC, 0xF4, 0xBC, + 0x63, 0xCC, 0xAB, 0xBD, 0xA4, 0xC8, 0xE8, 0xBC, 0x9A, 0xCB, 0x6A, 0xBB, + 0x58, 0xBC, 0x1B, 0xAB, 0xE3, 0xB2, 0x2A, 0xA8, 0x17, 0xAA, 0x38, 0xA9, + 0x55, 0xAC, 0xE2, 0xB1, 0x35, 0xC4, 0x9D, 0xD4, 0x08, 0xD0, 0x6A, 0xEC, + 0xFA, 0xE3, 0x48, 0xF5, 0xFA, 0xFA, 0x0D, 0xFC, 0xFC, 0x03, 0x3D, 0x06, + 0x51, 0xFF, 0xE7, 0x02, 0xA6, 0xED, 0x48, 0xF0, 0x25, 0xEF, 0x22, 0xF7, + 0xDD, 0xFD, 0xED, 0x05, 0xDF, 0x04, 0x4B, 0x01, 0x53, 0x03, 0x83, 0xFB, + 0x31, 0x05, 0xFD, 0x04, 0x84, 0x0E, 0x48, 0x0F, 0xA7, 0x08, 0x0A, 0x10, + 0x0B, 0x04, 0x0F, 0x15, 0x9B, 0x0A, 0xFD, 0x1C, 0x43, 0x12, 0xC5, 0x24, + 0xA0, 0x28, 0x35, 0x31, 0xDE, 0x2F, 0xB1, 0x2D, 0xFC, 0x2D, 0x22, 0x31, + 0xD6, 0x3F, 0xD5, 0x47, 0x1E, 0x46, 0x46, 0x46, 0xF2, 0x3F, 0x70, 0x37, + 0xC4, 0x46, 0x10, 0x34, 0x5E, 0x49, 0xE4, 0x2C, 0xFD, 0x51, 0x52, 0x39, + 0x42, 0x57, 0xFA, 0x42, 0xA3, 0x45, 0x5F, 0x33, 0x5E, 0x40, 0x0A, 0x44, + 0x0B, 0x49, 0x90, 0x58, 0x57, 0x4C, 0x98, 0x52, 0x89, 0x50, 0x6E, 0x4E, + 0xF5, 0x5C, 0x53, 0x4F, 0xD6, 0x58, 0x25, 0x4F, 0xEE, 0x48, 0x62, 0x4F, + 0x9D, 0x4F, 0xAE, 0x57, 0x3C, 0x4F, 0xF9, 0x5E, 0x7A, 0x40, 0xFE, 0x55, + 0xDD, 0x4C, 0xA6, 0x54, 0x3C, 0x4F, 0xF2, 0x53, 0xB6, 0x41, 0x2C, 0x48, + 0xB5, 0x4F, 0x17, 0x4D, 0xBD, 0x57, 0x62, 0x4F, 0x4D, 0x56, 0x0A, 0x4B, + 0xD4, 0x5B, 0xA7, 0x49, 0x24, 0x58, 0x34, 0x44, 0xDF, 0x51, 0x66, 0x3D, + 0xA2, 0x3F, 0x89, 0x27, 0x7B, 0x35, 0xD1, 0x27, 0x70, 0x35, 0xF3, 0x30, + 0xAE, 0x31, 0x92, 0x2A, 0x69, 0x37, 0x87, 0x34, 0x7E, 0x36, 0xD5, 0x3C, + 0x43, 0x31, 0xD0, 0x3E, 0x88, 0x37, 0xCE, 0x47, 0x80, 0x4C, 0xDE, 0x51, + 0x76, 0x5C, 0x7A, 0x59, 0xC8, 0x55, 0xE8, 0x55, 0xD0, 0x4E, 0xB5, 0x4E, + 0x28, 0x3C, 0x51, 0x3F, 0x8C, 0x28, 0xA9, 0x30, 0x8E, 0x1F, 0xF4, 0x26, + 0xDE, 0x06, 0xE8, 0x12, 0x01, 0x06, 0x6E, 0x18, 0x43, 0x16, 0xA0, 0x29, + 0xAD, 0x18, 0xBE, 0x2E, 0x01, 0x25, 0xD1, 0x35, 0xB5, 0x2D, 0xB0, 0x37, + 0x1E, 0x29, 0xD2, 0x34, 0x36, 0x2B, 0x15, 0x37, 0x3B, 0x35, 0x0C, 0x34, + 0xF3, 0x35, 0x5C, 0x27, 0x8C, 0x1C, 0xAC, 0x11, 0x52, 0x0A, 0xAB, 0x06, + 0xFF, 0x17, 0xA2, 0x1B, 0x69, 0x12, 0xCB, 0x22, 0xB8, 0x07, 0xA8, 0x1E, + 0x3B, 0x15, 0xA2, 0x2B, 0x7D, 0x0E, 0x90, 0x20, 0xB9, 0x0F, 0xD9, 0x19, + 0xF2, 0x20, 0xA3, 0x2D, 0xC9, 0x1E, 0xC7, 0x27, 0x6B, 0x27, 0x5B, 0x24, + 0xBF, 0x2F, 0xFA, 0x29, 0x66, 0x1C, 0x36, 0x11, 0x1C, 0x0C, 0xC7, 0x02, + 0x8E, 0xFB, 0xC0, 0xFF, 0x22, 0xF3, 0x5E, 0xFB, 0x5E, 0xF9, 0xCA, 0xF9, + 0x8F, 0xF1, 0xEC, 0xEB, 0xB3, 0xEE, 0x37, 0xEF, 0xD4, 0xF6, 0x77, 0x00, + 0x0B, 0x01, 0xA2, 0x0B, 0xF0, 0x05, 0x59, 0x01, 0xD5, 0x05, 0x24, 0xEB, + 0x8A, 0x05, 0x2A, 0xEA, 0xE5, 0x05, 0x90, 0xF2, 0xFF, 0x00, 0x57, 0xEC, + 0x81, 0xFA, 0x81, 0xE3, 0x1A, 0xF1, 0x47, 0xDD, 0x6E, 0xE7, 0x0C, 0xDE, + 0xAF, 0xDF, 0xC5, 0xDA, 0x59, 0xD4, 0xC8, 0xCF, 0x36, 0xD5, 0xB7, 0xD9, + 0x84, 0xD9, 0xCF, 0xE2, 0xFB, 0xD5, 0x59, 0xD9, 0x66, 0xD7, 0x6D, 0xDC, + 0x29, 0xDA, 0x67, 0xEA, 0x11, 0xDD, 0x63, 0xEE, 0xB1, 0xE0, 0xEF, 0xF2, + 0x09, 0xDB, 0xB3, 0xF5, 0x3F, 0xCD, 0xF4, 0xE6, 0x71, 0xBF, 0x2F, 0xD1, + 0xE8, 0xBB, 0x09, 0xC6, 0x85, 0xB6, 0xB3, 0xBF, 0x64, 0xB7, 0x6F, 0xC0, + 0xB0, 0xC4, 0x90, 0xCE, 0xBB, 0xC7, 0xC2, 0xCE, 0xDB, 0xCA, 0x97, 0xC3, + 0x2A, 0xD9, 0x2B, 0xC6, 0x98, 0xDE, 0xE7, 0xC5, 0x9B, 0xD9, 0xBC, 0xBE, + 0x4F, 0xE4, 0x4A, 0xC9, 0x68, 0xF4, 0xD2, 0xD4, 0xF9, 0xEB, 0xDF, 0xC9, + 0x56, 0xE3, 0x2F, 0xC1, 0x44, 0xF1, 0x53, 0xD0, 0xF6, 0xF1, 0xF3, 0xD6, + 0xAA, 0xEC, 0x2D, 0xD1, 0xC4, 0xF8, 0xAA, 0xE3, 0x19, 0xF1, 0xE5, 0xE8, + 0xCF, 0xEB, 0x6D, 0xEB, 0x29, 0x03, 0xCC, 0xFF, 0x94, 0x0E, 0xBB, 0xF9, + 0x97, 0x0E, 0x51, 0xF5, 0xAF, 0x02, 0xE3, 0xF5, 0x05, 0xF3, 0x5F, 0xF5, + 0xC2, 0xF1, 0x3E, 0xFD, 0x3C, 0xFC, 0xA5, 0x00, 0x86, 0x04, 0xE6, 0xFE, + 0x70, 0x02, 0x87, 0xF8, 0xBF, 0x0B, 0xE5, 0x00, 0x2C, 0x1A, 0xAE, 0x0D, + 0xB3, 0x1B, 0x5A, 0x12, 0x1C, 0x14, 0x8B, 0x19, 0xEB, 0x03, 0xA4, 0x17, + 0x1C, 0x04, 0x6E, 0x17, 0x51, 0x14, 0xCC, 0x1E, 0xC2, 0x16, 0xC0, 0x1E, + 0x7A, 0x18, 0x65, 0x29, 0xB3, 0x12, 0xCA, 0x2A, 0x14, 0x0B, 0xA9, 0x18, + 0xA0, 0x17, 0xD8, 0x1B, 0x3B, 0x1C, 0x12, 0x27, 0xA0, 0x1C, 0x6E, 0x33, + 0x47, 0x2B, 0xB3, 0x46, 0x96, 0x28, 0xAE, 0x37, 0x68, 0x25, 0x76, 0x2B, + 0x0F, 0x26, 0x8D, 0x34, 0xA7, 0x14, 0x4A, 0x25, 0xAD, 0x15, 0x93, 0x1B, + 0x45, 0x1C, 0x96, 0x18, 0xAA, 0x1D, 0x52, 0x1B, 0x62, 0x1C, 0xC1, 0x19, + 0x36, 0x19, 0x02, 0x0E, 0x98, 0x1B, 0x48, 0x0C, 0x81, 0x21, 0x5F, 0x0E, + 0x35, 0x24, 0xE8, 0x15, 0x47, 0x1A, 0xC9, 0x1D, 0x2A, 0x14, 0x40, 0x1E, + 0x27, 0x17, 0x88, 0x18, 0xF0, 0x19, 0xA5, 0x0F, 0xD1, 0x1A, 0x1E, 0x0C, + 0x56, 0x19, 0xF3, 0x05, 0x73, 0x1A, 0x35, 0x01, 0x17, 0x1B, 0xC1, 0xFE, + 0x01, 0x19, 0x78, 0xF9, 0x77, 0x11, 0x39, 0xF3, 0xB6, 0x0E, 0xBC, 0xF7, + 0xCE, 0x0E, 0x5F, 0xFF, 0x86, 0x07, 0x08, 0xFA, 0x6A, 0x06, 0xE6, 0x05, + 0xC9, 0xF9, 0xDF, 0x14, 0xA2, 0xE8, 0xB7, 0x16, 0x31, 0xE7, 0x9F, 0x0F, + 0x51, 0xE0, 0xAC, 0x01, 0x05, 0xD9, 0xE8, 0x01, 0xF7, 0xDF, 0xA3, 0x03, + 0xED, 0xE1, 0xF3, 0xFC, 0x0A, 0xDF, 0xDD, 0xFA, 0x6E, 0xE6, 0x8D, 0xFC, + 0xBC, 0xE6, 0x37, 0xF3, 0x98, 0xE0, 0x74, 0xE9, 0xBF, 0xE1, 0x73, 0xE4, + 0xD3, 0xD7, 0x60, 0xCE, 0x08, 0xD1, 0x33, 0xC7, 0x78, 0xDA, 0xA1, 0xD9, + 0x59, 0xDC, 0x6A, 0xE0, 0xBF, 0xD1, 0xC8, 0xD6, 0xAA, 0xC9, 0xD1, 0xCF, + 0xA2, 0xCC, 0x8A, 0xDB, 0x12, 0xCC, 0xA5, 0xE8, 0xFC, 0xCB, 0x20, 0xEB, + 0x70, 0xCC, 0x8E, 0xE2, 0xF3, 0xD4, 0x2D, 0xE1, 0x84, 0xE4, 0x36, 0xE4, + 0x85, 0xE0, 0xB2, 0xD5, 0x73, 0xDE, 0xB4, 0xD2, 0x6C, 0xDE, 0x5C, 0xD9, + 0x99, 0xD0, 0x99, 0xD3, 0x64, 0xD8, 0x73, 0xDB, 0xFB, 0xE0, 0x6E, 0xE0, + 0x7F, 0xCD, 0x36, 0xCC, 0xF6, 0xC5, 0x5B, 0xC7, 0x88, 0xCB, 0xCA, 0xD4, + 0x6B, 0xC3, 0xAD, 0xD7, 0x25, 0xBC, 0x15, 0xD5, 0x42, 0xBB, 0x97, 0xD0, + 0x2C, 0xBB, 0xFE, 0xC6, 0x06, 0xBE, 0x2E, 0xC2, 0x7D, 0xC3, 0xE8, 0xC7, + 0xFD, 0xCB, 0x41, 0xCD, 0x5C, 0xD1, 0x14, 0xC4, 0x04, 0xD7, 0x8F, 0xBE, + 0x88, 0xD5, 0xF5, 0xC3, 0x07, 0xC8, 0xCE, 0xC0, 0x2B, 0xBF, 0x7A, 0xC1, + 0x7B, 0xC5, 0xDE, 0xC7, 0xA3, 0xCE, 0xBB, 0xC5, 0xB8, 0xD3, 0xDD, 0xCD, + 0xAF, 0xD7, 0xEC, 0xDA, 0xD5, 0xC8, 0x27, 0xD2, 0x6F, 0xC4, 0xF2, 0xCF, + 0x18, 0xCC, 0x5A, 0xDB, 0x3A, 0xC0, 0x07, 0xD3, 0xC7, 0xC2, 0x6F, 0xD2, + 0x85, 0xCE, 0x42, 0xD9, 0xF8, 0xCE, 0x3C, 0xD1, 0x66, 0xD6, 0x10, 0xE2, + 0xE6, 0xD8, 0xB0, 0xEB, 0x2F, 0xD2, 0x44, 0xDF, 0x9B, 0xD7, 0x90, 0xE2, + 0x13, 0xE4, 0x20, 0xE9, 0x57, 0xE6, 0xA5, 0xE3, 0xB7, 0xEF, 0xE1, 0xE5, + 0x32, 0xFB, 0xF8, 0xE8, 0x5E, 0xF1, 0xB0, 0xD1, 0xDC, 0xF8, 0x17, 0xCD, + 0x8E, 0x06, 0x30, 0xD8, 0xCC, 0xFA, 0x73, 0xCE, 0x97, 0xFA, 0x9F, 0xCE, + 0x18, 0x0A, 0x1C, 0xDA, 0x24, 0x0A, 0x5D, 0xDF, 0xF7, 0x02, 0x7F, 0xE8, + 0x86, 0x05, 0x0D, 0xF7, 0xB5, 0x05, 0xAA, 0x01, 0x57, 0x01, 0x0E, 0x09, + 0xA3, 0xFF, 0xD4, 0x0C, 0x24, 0xFF, 0xDC, 0x11, 0x8D, 0xFA, 0x2F, 0x15, + 0xF4, 0xF9, 0x0D, 0x0D, 0x33, 0x08, 0x68, 0x0D, 0x82, 0x1A, 0x40, 0x19, + 0x89, 0x19, 0x07, 0x1A, 0x6B, 0x1A, 0x59, 0x26, 0xA3, 0x13, 0x51, 0x2B, + 0x9D, 0xFA, 0x70, 0x17, 0x8B, 0xF6, 0xBB, 0x11, 0x11, 0x03, 0xDD, 0x1E, + 0xF1, 0x0E, 0x04, 0x22, 0x7E, 0x12, 0xBC, 0x19, 0xA2, 0x15, 0x05, 0x1F, + 0x55, 0x16, 0x35, 0x1D, 0x37, 0x1C, 0xF8, 0x13, 0x12, 0x29, 0xB4, 0x13, + 0x8B, 0x30, 0x65, 0x1C, 0x5A, 0x41, 0x9E, 0x28, 0xC0, 0x4E, 0xD0, 0x2E, + 0xED, 0x52, 0xDC, 0x34, 0x45, 0x52, 0xDC, 0x35, 0x80, 0x44, 0xD3, 0x2E, + 0x40, 0x40, 0x23, 0x35, 0xED, 0x3F, 0xA0, 0x3D, 0x2D, 0x3F, 0x67, 0x3F, + 0x05, 0x48, 0x0A, 0x47, 0x02, 0x4E, 0x9E, 0x44, 0xD5, 0x4A, 0x6E, 0x39, + 0x20, 0x43, 0x0E, 0x38, 0x15, 0x46, 0xD7, 0x41, 0x59, 0x43, 0x4D, 0x47, + 0xD6, 0x44, 0xA8, 0x52, 0x56, 0x50, 0x58, 0x5D, 0xE8, 0x48, 0xDF, 0x4E, + 0x90, 0x46, 0xCC, 0x4A, 0x71, 0x47, 0x81, 0x4C, 0xC8, 0x42, 0x12, 0x45, + 0x2D, 0x49, 0x5F, 0x4C, 0x43, 0x3B, 0xB3, 0x42, 0xDB, 0x29, 0xC9, 0x30, + 0x79, 0x2D, 0xE3, 0x2D, 0x6C, 0x35, 0x28, 0x22, 0x50, 0x49, 0x56, 0x22, + 0x8B, 0x58, 0xD9, 0x2B, 0xDD, 0x51, 0xCD, 0x29, 0xFB, 0x49, 0x54, 0x27, + 0x3D, 0x44, 0x44, 0x25, 0x6C, 0x39, 0x5C, 0x29, 0x6E, 0x31, 0xBD, 0x30, + 0xE4, 0x3B, 0xF8, 0x41, 0xEC, 0x43, 0x57, 0x52, 0xE5, 0x37, 0x80, 0x51, + 0x40, 0x36, 0x61, 0x53, 0x7D, 0x3B, 0x31, 0x55, 0x9B, 0x31, 0x25, 0x4A, + 0xFA, 0x2C, 0xDA, 0x41, 0x9E, 0x3F, 0xC7, 0x4A, 0xF7, 0x43, 0xD8, 0x48, + 0x48, 0x3D, 0xC3, 0x3C, 0xCC, 0x3B, 0x38, 0x35, 0xEA, 0x30, 0x63, 0x27, + 0xE3, 0x29, 0x2A, 0x1F, 0xA3, 0x23, 0xA9, 0x1E, 0xE6, 0x21, 0x97, 0x1F, + 0x47, 0x27, 0xC7, 0x1B, 0x11, 0x2C, 0x69, 0x17, 0xD5, 0x2D, 0xCA, 0x12, + 0x89, 0x32, 0xF0, 0x10, 0x3A, 0x36, 0x24, 0x11, 0x23, 0x29, 0x87, 0x08, + 0xA1, 0x22, 0x65, 0x03, 0xB8, 0x25, 0xF9, 0x03, 0xDE, 0x19, 0x51, 0xF9, + 0x2D, 0x10, 0x14, 0xF3, 0x19, 0x0B, 0xC1, 0xF6, 0xFE, 0x01, 0xD1, 0xF7, + 0xC1, 0xFF, 0x05, 0xFD, 0xFE, 0xF8, 0x4C, 0xFC, 0xEC, 0xF6, 0x18, 0xF7, + 0xA1, 0x01, 0xE0, 0xFA, 0x8A, 0x04, 0x82, 0x02, 0xD4, 0xF9, 0x2E, 0x04, + 0x29, 0xF7, 0x55, 0x00, 0x0B, 0xF3, 0x4A, 0xF6, 0x55, 0xED, 0x19, 0xF5, + 0x36, 0xF9, 0xF2, 0x01, 0x16, 0xFD, 0x12, 0x05, 0x92, 0xF8, 0x46, 0x01, + 0x01, 0xFD, 0xE3, 0x03, 0x92, 0x05, 0xB9, 0x06, 0x9B, 0x0D, 0x55, 0x08, + 0xED, 0x11, 0x5F, 0x0A, 0xF8, 0x18, 0xD8, 0x10, 0x5F, 0x24, 0x14, 0x18, + 0x7A, 0x28, 0x54, 0x15, 0x60, 0x2A, 0xBD, 0x16, 0x5C, 0x24, 0xD3, 0x11, + 0x4A, 0x1A, 0xD0, 0x02, 0x50, 0x1F, 0x4C, 0x06, 0x10, 0x26, 0x25, 0x10, + 0x5C, 0x21, 0x68, 0x0A, 0x3A, 0x19, 0x89, 0x08, 0xAA, 0x15, 0x54, 0x11, + 0x82, 0x10, 0xEF, 0x12, 0x4B, 0x0D, 0x5D, 0x1C, 0xF3, 0x05, 0x69, 0x25, + 0x8A, 0x03, 0xF2, 0x28, 0x11, 0x05, 0xE9, 0x24, 0xA5, 0xFB, 0x07, 0x1B, + 0xB0, 0xF6, 0xD4, 0x17, 0x2F, 0xEE, 0x34, 0x0D, 0x32, 0xE8, 0xD7, 0x03, + 0xB2, 0xEB, 0xB4, 0xFF, 0x21, 0xE4, 0xE0, 0xF5, 0xF1, 0xE2, 0x99, 0xF4, + 0x3C, 0xED, 0x3D, 0xF6, 0xCE, 0xEA, 0xD0, 0xE5, 0xB1, 0xE7, 0x62, 0xD6, + 0xD4, 0xF2, 0xE4, 0xDD, 0x28, 0xEF, 0xC1, 0xDF, 0xA7, 0xDC, 0xF5, 0xDB, + 0x33, 0xDC, 0x08, 0xE7, 0xA7, 0xDD, 0xA9, 0xE8, 0x35, 0xDA, 0xCA, 0xDF, + 0x5F, 0xE8, 0x4C, 0xE8, 0x50, 0xF4, 0x9A, 0xF9, 0x81, 0xF5, 0x53, 0xFD, + 0xDA, 0x00, 0xBB, 0x04, 0xAB, 0x02, 0xBB, 0x0F, 0x89, 0xFB, 0x94, 0x15, + 0x09, 0x04, 0x92, 0x1C, 0xF4, 0x06, 0xC4, 0x18, 0x5F, 0x01, 0x6D, 0x18, + 0x5E, 0x06, 0xE8, 0x23, 0x6E, 0xFE, 0x3F, 0x1B, 0x0C, 0xF4, 0xEC, 0x0C, + 0x6E, 0xF9, 0xED, 0x09, 0xCE, 0xF1, 0x9E, 0xFE, 0xAA, 0xEC, 0xBC, 0xFD, + 0x43, 0xFB, 0xFD, 0x08, 0x0A, 0xFB, 0x7B, 0x03, 0x59, 0xEE, 0x5B, 0xFC, + 0xEB, 0xE7, 0xE7, 0xF8, 0x54, 0xE6, 0x1B, 0xF0, 0x7A, 0xE4, 0x25, 0xE3, + 0x20, 0xE1, 0x2D, 0xDB, 0x14, 0xD6, 0xA8, 0xD0, 0x2D, 0xCE, 0xD9, 0xCE, + 0xA4, 0xCF, 0x38, 0xD4, 0x1A, 0xCC, 0x65, 0xC3, 0x6E, 0xD2, 0x34, 0xBD, + 0xF9, 0xCD, 0xFE, 0xBE, 0x62, 0xB7, 0x0C, 0xB7, 0x8F, 0xB1, 0x27, 0xB9, + 0xA5, 0xB4, 0x37, 0xBD, 0x2B, 0xAD, 0x35, 0xB8, 0xA3, 0xA6, 0x64, 0xB7, + 0x55, 0xAC, 0x9D, 0xBE, 0x46, 0xB1, 0x94, 0xB7, 0x2D, 0xAB, 0x5E, 0xA8, + 0x8E, 0xA5, 0x4D, 0xAB, 0x66, 0xA1, 0x2C, 0xB2, 0x89, 0x9C, 0x8F, 0xAD, + 0x77, 0x9D, 0x69, 0xAD, 0x86, 0xA5, 0xC1, 0xB9, 0x87, 0xAB, 0x83, 0xBD, + 0xAC, 0xAD, 0x64, 0xBA, 0xC3, 0xBC, 0x5B, 0xC1, 0xDD, 0xCB, 0x0C, 0xC2, + 0xF2, 0xC4, 0xAD, 0xB4, 0x44, 0xBB, 0xA7, 0xB0, 0xBA, 0xBC, 0x32, 0xB7, + 0xBE, 0xC3, 0xC0, 0xBC, 0x21, 0xCA, 0xC7, 0xC3, 0x08, 0xC8, 0xA4, 0xBD, + 0xB4, 0xC9, 0x07, 0xBC, 0x12, 0xC6, 0x79, 0xBC, 0xF6, 0xBB, 0x5D, 0xB2, + 0xFC, 0xBA, 0x53, 0xB6, 0xBE, 0xB8, 0x1F, 0xBE, 0xA9, 0xBB, 0x3B, 0xC0, + 0x51, 0xBD, 0xE7, 0xBD, 0x54, 0xC0, 0x35, 0xCD, 0x2C, 0xC1, 0x6F, 0xD5, + 0x06, 0xB8, 0xD3, 0xC8, 0xA0, 0xB6, 0x4D, 0xCC, 0x79, 0xBB, 0xF0, 0xD4, + 0x62, 0xBA, 0x85, 0xD1, 0xFD, 0xB3, 0x67, 0xCA, 0x64, 0xAE, 0xEA, 0xC1, + 0x9D, 0xAB, 0x78, 0xBC, 0x34, 0xA4, 0xE4, 0xB1, 0x6B, 0xA2, 0xBE, 0xA7, + 0x4A, 0xA9, 0x87, 0xAE, 0xA0, 0xAB, 0x1E, 0xAE, 0x6F, 0xB0, 0xFE, 0xA7, + 0x94, 0xB8, 0x8A, 0xAB, 0xD6, 0xB4, 0x67, 0xA8, 0xF9, 0xAF, 0xEF, 0xA2, + 0xD7, 0xB8, 0x40, 0xA7, 0x2D, 0xB6, 0x40, 0xAC, 0xBB, 0xAE, 0xAB, 0xB4, + 0xA7, 0xA8, 0xFE, 0xB5, 0x4C, 0xAB, 0xFC, 0xB5, 0x0F, 0xBF, 0xED, 0xBC, + 0xDF, 0xC9, 0x48, 0xC3, 0x6B, 0xCF, 0xE8, 0xC9, 0x15, 0xDB, 0x8E, 0xD1, + 0x91, 0xE4, 0x7C, 0xD4, 0x98, 0xE9, 0x3F, 0xD3, 0x2C, 0xE3, 0xD1, 0xDA, + 0x07, 0xE3, 0xB6, 0xE7, 0x3A, 0xE9, 0xDE, 0xE5, 0x25, 0xE8, 0x8F, 0xE2, + 0x73, 0xEB, 0x48, 0xF0, 0x3A, 0xEA, 0xEA, 0xFD, 0x91, 0xE2, 0x96, 0xFF, + 0xC0, 0xE4, 0x10, 0xFD, 0x69, 0xE9, 0x8D, 0xF6, 0x68, 0xED, 0x8B, 0xF1, + 0x22, 0xEC, 0xAE, 0xF0, 0x82, 0xF1, 0x54, 0xF4, 0xE5, 0xFD, 0x5B, 0xF0, + 0xC7, 0x03, 0x19, 0xE9, 0x33, 0x0A, 0xF7, 0xEC, 0x07, 0x0E, 0x3D, 0xF1, + 0xB4, 0x05, 0x88, 0xE7, 0x50, 0xF8, 0xEF, 0xDF, 0x30, 0xFB, 0x8B, 0xE8, + 0x85, 0xFB, 0x7F, 0xE9, 0x6F, 0xF2, 0xB6, 0xEC, 0x8F, 0xF4, 0x85, 0xED, + 0xEC, 0xF5, 0x0E, 0xE3, 0x7A, 0xF1, 0xFE, 0xE7, 0xB0, 0xF9, 0xCB, 0xFC, + 0x04, 0x04, 0xB2, 0xFF, 0x43, 0x0A, 0x8D, 0xFB, 0x09, 0x0A, 0x84, 0x03, + 0x4C, 0x06, 0x59, 0x04, 0xDE, 0x06, 0xA3, 0x01, 0xC4, 0x05, 0x0C, 0x05, + 0x1D, 0x01, 0x8C, 0x02, 0xF9, 0xFF, 0x82, 0xFD, 0xD7, 0x0E, 0x7C, 0x08, + 0x40, 0x20, 0x20, 0x14, 0xFB, 0x26, 0xB2, 0x0F, 0x56, 0x39, 0x2F, 0x17, + 0xB8, 0x44, 0x6F, 0x28, 0x5D, 0x48, 0xC8, 0x2D, 0x77, 0x57, 0x2C, 0x34, + 0x4E, 0x55, 0x89, 0x39, 0x70, 0x45, 0xE2, 0x33, 0x92, 0x3E, 0x36, 0x33, + 0x9C, 0x38, 0xEC, 0x36, 0x1A, 0x31, 0xD3, 0x36, 0x22, 0x34, 0xBB, 0x38, + 0x89, 0x35, 0xDE, 0x38, 0xAD, 0x2F, 0x44, 0x39, 0x53, 0x31, 0xDC, 0x39, + 0x7D, 0x37, 0x1B, 0x33, 0x94, 0x3E, 0x5A, 0x35, 0xF6, 0x3D, 0x15, 0x36, + 0x2F, 0x3E, 0x30, 0x31, 0x4B, 0x47, 0x3D, 0x34, 0x07, 0x41, 0xBF, 0x2F, + 0xD6, 0x27, 0xD0, 0x22, 0xED, 0x1C, 0xB4, 0x1E, 0xCF, 0x1A, 0x57, 0x1B, + 0xB2, 0x12, 0xC1, 0x13, 0xA5, 0x17, 0x64, 0x11, 0x08, 0x19, 0x4A, 0x05, + 0xED, 0x0E, 0xA8, 0xFA, 0x1B, 0x0B, 0xF5, 0x00, 0x9A, 0x10, 0x10, 0x05, + 0x4F, 0x14, 0xB9, 0xFA, 0xEC, 0x14, 0xE0, 0xF2, 0x94, 0x16, 0x14, 0xF5, + 0x71, 0x18, 0x47, 0xFA, 0xEE, 0x20, 0xA8, 0x01, 0xAB, 0x2E, 0x05, 0x03, + 0x27, 0x30, 0x28, 0xFE, 0xC4, 0x28, 0xF7, 0x02, 0xC0, 0x20, 0xA9, 0x0B, + 0x7C, 0x1C, 0xDC, 0x0F, 0x04, 0x27, 0xAF, 0x17, 0x8A, 0x33, 0x37, 0x1E, + 0xF6, 0x36, 0x04, 0x23, 0xFC, 0x36, 0xD5, 0x29, 0xE5, 0x36, 0x36, 0x2E, + 0xFC, 0x34, 0xF7, 0x2F, 0x2D, 0x34, 0x8C, 0x2B, 0x9F, 0x39, 0xD0, 0x2B, + 0xEB, 0x3D, 0x1B, 0x34, 0x42, 0x3A, 0xCB, 0x2F, 0x31, 0x35, 0x29, 0x2E, + 0xBA, 0x2F, 0xBD, 0x33, 0x55, 0x27, 0xE2, 0x2B, 0x8C, 0x2A, 0x1D, 0x1F, + 0x58, 0x36, 0x23, 0x1A, 0x66, 0x39, 0x4F, 0x1F, 0x33, 0x30, 0x67, 0x19, + 0x87, 0x30, 0x84, 0x15, 0xB5, 0x38, 0xE5, 0x1F, 0xCC, 0x2E, 0x3D, 0x1B, + 0x9A, 0x23, 0x43, 0x17, 0x19, 0x24, 0x55, 0x1B, 0xD8, 0x19, 0x25, 0x17, + 0xB4, 0x10, 0x42, 0x1A, 0xA5, 0x12, 0x09, 0x24, 0xB2, 0x0F, 0x61, 0x20, + 0x74, 0x11, 0x0F, 0x1D, 0x22, 0x14, 0x1D, 0x22, 0x10, 0x18, 0x8F, 0x23, + 0x1E, 0x1B, 0x17, 0x1D, 0x28, 0x13, 0x68, 0x12, 0x45, 0x11, 0x60, 0x0C, + 0x24, 0x1B, 0x8D, 0x0B, 0x78, 0x22, 0xA5, 0x0D, 0x30, 0x25, 0x4A, 0x13, + 0xA8, 0x1F, 0x4E, 0x12, 0x37, 0x20, 0x2A, 0x0F, 0x4D, 0x23, 0x50, 0x0A, + 0x42, 0x21, 0xF8, 0x07, 0x49, 0x25, 0x9A, 0x15, 0x3B, 0x2E, 0x14, 0x24, + 0x41, 0x35, 0xBE, 0x25, 0x75, 0x35, 0xD1, 0x22, 0xA5, 0x36, 0x89, 0x25, + 0x9C, 0x30, 0xDB, 0x2B, 0xB4, 0x2E, 0x21, 0x30, 0x04, 0x35, 0xD9, 0x2D, + 0x82, 0x3A, 0x25, 0x29, 0x3D, 0x3E, 0x57, 0x1F, 0xBA, 0x32, 0xD9, 0x1D, + 0x26, 0x25, 0x74, 0x23, 0x98, 0x21, 0x3A, 0x25, 0x60, 0x19, 0x46, 0x27, + 0x10, 0x11, 0xF6, 0x23, 0xF6, 0x10, 0xFB, 0x1A, 0x89, 0x0E, 0x35, 0x18, + 0x73, 0x08, 0x99, 0x1E, 0xCC, 0x0E, 0x95, 0x1F, 0x9A, 0x0E, 0x57, 0x15, + 0x57, 0xFB, 0x5E, 0x0F, 0x96, 0xEC, 0x15, 0x0C, 0xB0, 0xE5, 0xC2, 0xFF, + 0x2C, 0xE9, 0xB1, 0xFA, 0x51, 0xEF, 0x4B, 0xF9, 0x84, 0xE4, 0x6D, 0xEE, + 0xC5, 0xDD, 0x3A, 0xE9, 0x76, 0xE6, 0x46, 0xEB, 0x22, 0xDF, 0xBD, 0xE6, + 0x32, 0xD2, 0x2B, 0xDD, 0x51, 0xD2, 0x11, 0xDC, 0x18, 0xD1, 0xF3, 0xDE, + 0x3B, 0xD5, 0x5F, 0xE1, 0xC1, 0xDE, 0x71, 0xEC, 0xCD, 0xE4, 0x29, 0xF6, + 0x57, 0xEA, 0xA6, 0xF4, 0x82, 0xED, 0x9C, 0xFE, 0xCF, 0xEB, 0xAC, 0x0D, + 0xCB, 0xE8, 0xF7, 0x0A, 0x02, 0xE8, 0xE7, 0x07, 0x3D, 0xE8, 0x0F, 0x0F, + 0x22, 0xE9, 0xCD, 0x0C, 0x51, 0xF0, 0x6F, 0x05, 0xFF, 0xFA, 0xDE, 0x0F, + 0x78, 0xFB, 0xA2, 0x15, 0x2E, 0xF9, 0x5D, 0x11, 0xE2, 0xFC, 0x9D, 0x12, + 0xDC, 0x05, 0xFA, 0x11, 0xCE, 0x05, 0xAA, 0x04, 0xD5, 0xFF, 0xE7, 0xFB, + 0x41, 0xF8, 0x10, 0xFF, 0x9E, 0xE5, 0xF8, 0xFC, 0x9C, 0xDA, 0xCE, 0xF8, + 0xBA, 0xDE, 0x52, 0xFA, 0x1B, 0xE9, 0xDD, 0xF9, 0x32, 0xEF, 0xD8, 0xF3, + 0x7A, 0xF3, 0x24, 0xF4, 0x31, 0xF9, 0x12, 0x00, 0xBF, 0xF5, 0x81, 0x0A, + 0x2D, 0xEF, 0xA1, 0x0B, 0x02, 0xEE, 0x2A, 0x0D, 0x0E, 0xE9, 0x51, 0x04, + 0xF2, 0xE0, 0x97, 0xFD, 0xEE, 0xDE, 0x9B, 0x03, 0x1D, 0xD7, 0xAC, 0xF0, + 0x94, 0xCC, 0xA5, 0xDA, 0xA4, 0xCC, 0x79, 0xDA, 0xBC, 0xCC, 0x42, 0xDF, + 0x4C, 0xCA, 0x3A, 0xE2, 0xAE, 0xCE, 0x4E, 0xE3, 0xC5, 0xD4, 0xBA, 0xE4, + 0x74, 0xD2, 0xB4, 0xDF, 0x48, 0xD3, 0xD8, 0xE4, 0xA3, 0xD8, 0xAB, 0xED, + 0xC2, 0xE2, 0xA3, 0xEC, 0xF5, 0xF1, 0x32, 0xF6, 0x23, 0xF6, 0x0A, 0xFC, + 0x28, 0xF1, 0x37, 0xFA, 0xAA, 0xEB, 0x6A, 0xF6, 0x86, 0xF1, 0xB2, 0xF0, + 0xF3, 0xF9, 0xAF, 0xF2, 0xAF, 0xF4, 0x50, 0xF4, 0x0C, 0xF1, 0x2C, 0xF2, + 0x00, 0xF4, 0x16, 0xF5, 0xA5, 0xE9, 0x4C, 0xF5, 0xF6, 0xE4, 0x41, 0xF7, + 0x77, 0xF0, 0xF3, 0xFE, 0xFA, 0xF2, 0xF9, 0x00, 0x67, 0xEA, 0x18, 0xF9, + 0x52, 0xE6, 0x09, 0xF4, 0xC0, 0xE6, 0x3E, 0xF8, 0x64, 0xE5, 0x6A, 0xFF, + 0x49, 0xE2, 0x7B, 0xFB, 0x3C, 0xE8, 0x57, 0xF7, 0x0D, 0xEE, 0x01, 0xF8, + 0xBB, 0xDD, 0x87, 0xF1, 0x41, 0xC8, 0x56, 0xEB, 0xA7, 0xC2, 0xBE, 0xEB, + 0x3B, 0xBD, 0x6B, 0xE5, 0x70, 0xBA, 0xFA, 0xD9, 0xCF, 0xC4, 0x44, 0xD1, + 0x38, 0xCC, 0x20, 0xCC, 0xA1, 0xC5, 0x3E, 0xC6, 0x5F, 0xB7, 0x97, 0xB6, + 0x26, 0xB2, 0x5F, 0xB0, 0x55, 0xBC, 0x6C, 0xB9, 0xF4, 0xCA, 0x11, 0xC2, + 0x6C, 0xCE, 0x65, 0xC1, 0x87, 0xCC, 0xD9, 0xC3, 0xDE, 0xCB, 0xC6, 0xCA, + 0x20, 0xCA, 0xD1, 0xD1, 0xF6, 0xC6, 0x16, 0xDB, 0xF4, 0xBF, 0xA3, 0xDD, + 0x48, 0xBF, 0xF1, 0xE3, 0xC5, 0xC9, 0xB0, 0xF2, 0x17, 0xD5, 0xA8, 0xFB, + 0xE2, 0xDD, 0xB6, 0xFA, 0x3C, 0xE5, 0xDD, 0xF5, 0x04, 0xEB, 0xAB, 0xF6, + 0xE2, 0xF5, 0x6D, 0xFC, 0x9B, 0xF8, 0x94, 0xFF, 0x1F, 0xEC, 0xA3, 0xF9, + 0xCB, 0xE3, 0x81, 0xF2, 0x51, 0xE5, 0xCF, 0xEB, 0xF0, 0xED, 0xD8, 0xE2, + 0xB7, 0xEF, 0x7B, 0xDE, 0x00, 0xEE, 0xA3, 0xDD, 0xEF, 0xF3, 0xD5, 0xD9, + 0xF4, 0xF9, 0xF6, 0xD0, 0x97, 0xF9, 0xD0, 0xCE, 0xE4, 0xFC, 0x18, 0xD9, + 0x68, 0x06, 0xB5, 0xE1, 0xB3, 0x0F, 0x05, 0xE8, 0x92, 0x0C, 0xDB, 0xEE, + 0x6C, 0xFB, 0xF5, 0xEF, 0x30, 0xED, 0xF2, 0xEC, 0xE3, 0xE2, 0x88, 0xEA, + 0x64, 0xDB, 0xA8, 0xE9, 0x73, 0xDF, 0x0B, 0xEB, 0x23, 0xDE, 0x01, 0xE6, + 0x72, 0xDB, 0xD7, 0xDF, 0x64, 0xE8, 0x58, 0xE0, 0x2F, 0xED, 0x16, 0xDD, + 0x1F, 0xE6, 0x31, 0xD9, 0xF4, 0xE6, 0x16, 0xE0, 0x79, 0xE9, 0xD0, 0xED, + 0x42, 0xDD, 0xC6, 0xEB, 0xE8, 0xD3, 0xCC, 0xDE, 0xBB, 0xD5, 0x26, 0xE0, + 0x89, 0xD0, 0xDF, 0xE4, 0xCB, 0xD4, 0x2E, 0xE0, 0x63, 0xEC, 0x4B, 0xDF, + 0xDE, 0xF4, 0xA4, 0xE4, 0xBB, 0xF3, 0xE5, 0xE6, 0x0B, 0x00, 0xBB, 0xEA, + 0xA9, 0x13, 0xEB, 0xEE, 0xEB, 0x23, 0x62, 0xEB, 0x5E, 0x2D, 0x70, 0xED, + 0xE5, 0x32, 0x8F, 0xF9, 0x7C, 0x31, 0xD4, 0x01, 0x3A, 0x25, 0x95, 0xFD, + 0xFD, 0x15, 0x8B, 0xF8, 0xD6, 0x10, 0x7C, 0xFF, 0x0B, 0x11, 0x03, 0x07, + 0xD4, 0x12, 0xD0, 0x04, 0x84, 0x1A, 0x8C, 0x05, 0x4C, 0x1D, 0x2B, 0x0E, + 0x7F, 0x19, 0x1C, 0x14, 0xF4, 0x1E, 0xF5, 0x1E, 0x8F, 0x2F, 0x0D, 0x31, + 0x05, 0x39, 0x32, 0x36, 0x08, 0x38, 0x6C, 0x2E, 0x04, 0x3C, 0x52, 0x33, + 0xE6, 0x35, 0x83, 0x34, 0x7B, 0x23, 0x74, 0x23, 0xA0, 0x1F, 0x6A, 0x19, + 0xB2, 0x1D, 0x59, 0x10, 0xE3, 0x1A, 0x71, 0x08, 0xFE, 0x1F, 0x4A, 0x07, + 0xC1, 0x20, 0x62, 0x01, 0x02, 0x22, 0x54, 0xFA, 0x0D, 0x24, 0xDB, 0xF3, + 0x88, 0x24, 0x0E, 0xEF, 0xEB, 0x29, 0xA4, 0xF8, 0xA1, 0x30, 0x47, 0x0F, + 0xB6, 0x2C, 0x7E, 0x14, 0xA5, 0x20, 0xD6, 0x0E, 0x0D, 0x1A, 0x5B, 0x15, + 0xB0, 0x1B, 0x80, 0x1B, 0x43, 0x21, 0x92, 0x1D, 0xA0, 0x2F, 0x1F, 0x28, + 0x38, 0x39, 0x4A, 0x34, 0x3E, 0x3B, 0x8E, 0x3C, 0x74, 0x3F, 0xA7, 0x40, + 0x07, 0x40, 0x17, 0x3D, 0xEB, 0x41, 0x88, 0x34, 0xD6, 0x48, 0x39, 0x2B, + 0x5E, 0x53, 0x1A, 0x30, 0x4E, 0x57, 0xD2, 0x40, 0x6D, 0x4C, 0x1E, 0x43, + 0xC2, 0x3E, 0x2E, 0x35, 0x97, 0x34, 0x45, 0x28, 0x81, 0x28, 0x67, 0x21, + 0xBF, 0x20, 0xA6, 0x1A, 0xA9, 0x25, 0x63, 0x1B, 0x0C, 0x2F, 0x1A, 0x1D, + 0x40, 0x37, 0xE5, 0x17, 0xEF, 0x3E, 0x1C, 0x16, 0xDB, 0x48, 0x68, 0x19, + 0x81, 0x52, 0x82, 0x1C, 0xD5, 0x51, 0x97, 0x1C, 0xAB, 0x49, 0x24, 0x1D, + 0xBE, 0x3F, 0x0E, 0x1B, 0x21, 0x37, 0x15, 0x1A, 0x31, 0x34, 0x51, 0x19, + 0x12, 0x2F, 0x13, 0x10, 0xCF, 0x24, 0xBA, 0x10, 0xEE, 0x18, 0xC3, 0x1A, + 0xD6, 0x06, 0x7E, 0x1A, 0x4E, 0xFE, 0x37, 0x1D, 0x22, 0x04, 0x3B, 0x23, + 0xE1, 0x07, 0xCB, 0x23, 0xA2, 0x0C, 0x3C, 0x2A, 0x30, 0x17, 0x1A, 0x36, + 0xF2, 0x1C, 0xAB, 0x33, 0x3A, 0x12, 0xBC, 0x21, 0xC6, 0x04, 0x75, 0x1D, + 0x7C, 0x0A, 0x35, 0x1E, 0x01, 0x19, 0xE2, 0x0E, 0x05, 0x2B, 0xB1, 0x0E, + 0xB3, 0x3C, 0x84, 0x1E, 0x66, 0x40, 0xF3, 0x22, 0x5A, 0x39, 0x45, 0x21, + 0x82, 0x33, 0x5A, 0x23, 0x53, 0x35, 0x48, 0x26, 0x17, 0x3C, 0x6F, 0x26, + 0x7A, 0x3F, 0xA0, 0x2B, 0x78, 0x44, 0x95, 0x32, 0xF9, 0x48, 0x5C, 0x2D, + 0x49, 0x3B, 0xCC, 0x26, 0x49, 0x2B, 0xC9, 0x28, 0xD6, 0x29, 0x0D, 0x32, + 0xD6, 0x28, 0x93, 0x36, 0x3F, 0x27, 0xFE, 0x33, 0xDB, 0x28, 0xF5, 0x31, + 0x24, 0x29, 0x3C, 0x31, 0x26, 0x2C, 0xF5, 0x33, 0xD6, 0x2A, 0x88, 0x31, + 0xF8, 0x27, 0xAB, 0x30, 0x3B, 0x28, 0x8C, 0x34, 0xE0, 0x25, 0x6E, 0x33, + 0xB8, 0x1C, 0x06, 0x2A, 0xCB, 0x11, 0x12, 0x1E, 0xD6, 0x13, 0x77, 0x19, + 0x92, 0x18, 0xCF, 0x15, 0xDE, 0x12, 0x73, 0x12, 0x25, 0x0E, 0x7F, 0x12, + 0x1B, 0x07, 0x57, 0x06, 0xCE, 0xFA, 0xE2, 0xFB, 0x47, 0xF7, 0xD7, 0x02, + 0xC4, 0xFA, 0xB3, 0x05, 0xE2, 0xFD, 0x2F, 0x02, 0x0F, 0x06, 0xD7, 0x09, + 0xDF, 0x11, 0x28, 0x12, 0xCA, 0x0E, 0x62, 0x0A, 0x50, 0x02, 0x23, 0x05, + 0x94, 0xFB, 0x42, 0x0F, 0xBA, 0xFB, 0x9A, 0x15, 0x0F, 0x06, 0x15, 0x16, + 0x31, 0x11, 0xD7, 0x19, 0xD8, 0x14, 0x0D, 0x21, 0x63, 0x15, 0x73, 0x2A, + 0x88, 0x14, 0x3E, 0x2B, 0x7D, 0x15, 0x73, 0x27, 0xEC, 0x1A, 0x0E, 0x26, + 0x42, 0x1E, 0x06, 0x28, 0x06, 0x1B, 0xFB, 0x2A, 0x91, 0x1C, 0x64, 0x27, + 0x6C, 0x20, 0xE6, 0x21, 0x3E, 0x16, 0x22, 0x1E, 0x8F, 0x07, 0xF8, 0x14, + 0xC3, 0x0C, 0x09, 0x0F, 0x48, 0x10, 0x81, 0x09, 0x0E, 0x02, 0xC8, 0xFE, + 0x41, 0xFC, 0xB6, 0xF6, 0xC9, 0x03, 0x94, 0xF3, 0xC5, 0x02, 0xB1, 0xF2, + 0xE2, 0xF9, 0x33, 0xF5, 0xC6, 0xFC, 0xCB, 0xF5, 0x53, 0x00, 0x1F, 0xED, + 0x8C, 0xFB, 0x72, 0xE8, 0x49, 0xEF, 0xC8, 0xE2, 0xA5, 0xE5, 0xDB, 0xE3, + 0x46, 0xE0, 0xC0, 0xF2, 0x0A, 0xD2, 0xC3, 0xF8, 0xB6, 0xC7, 0x84, 0xF2, + 0x36, 0xC7, 0x23, 0xF1, 0x4C, 0xBF, 0x00, 0xEE, 0x99, 0xB7, 0xEC, 0xED, + 0x8F, 0xB8, 0x9F, 0xF1, 0x07, 0xB1, 0x8D, 0xED, 0x0C, 0xA8, 0x4D, 0xE4, + 0x92, 0xB4, 0xD4, 0xE4, 0x17, 0xC0, 0xF2, 0xE8, 0x28, 0xB7, 0x0D, 0xDD, + 0xD2, 0xB3, 0x80, 0xD6, 0xAD, 0xBF, 0xEE, 0xD9, 0xE3, 0xC6, 0xB0, 0xD8, + 0x80, 0xCA, 0x18, 0xD8, 0x37, 0xD5, 0xA7, 0xD4, 0x06, 0xE0, 0x46, 0xD8, + 0xDC, 0xE7, 0x96, 0xE7, 0x60, 0xEC, 0x57, 0xED, 0xFE, 0xF0, 0xD9, 0xE9, + 0xB4, 0xF7, 0xE2, 0xE6, 0x13, 0xFA, 0x19, 0xE1, 0x5F, 0xF7, 0xEC, 0xE5, + 0xF8, 0xF0, 0xD9, 0xF1, 0x1C, 0xE9, 0xB4, 0xF6, 0x9B, 0xE5, 0xF3, 0xF8, + 0x99, 0xE4, 0x0A, 0xF8, 0xF2, 0xE2, 0x76, 0xF2, 0x9C, 0xE3, 0xA9, 0xEE, + 0x5C, 0xE3, 0x3F, 0xF4, 0xE5, 0xE3, 0x34, 0xF4, 0xF4, 0xE4, 0x9E, 0xF2, + 0xDC, 0xDF, 0xBE, 0xF7, 0xE0, 0xE0, 0xE7, 0xF4, 0xE0, 0xE9, 0x4B, 0xF8, + 0x96, 0xE7, 0x02, 0x04, 0x9D, 0xE3, 0x75, 0x03, 0x94, 0xDE, 0xBD, 0xF5, + 0x97, 0xD6, 0xD2, 0xF1, 0xBD, 0xD0, 0x6F, 0xF2, 0xCB, 0xC7, 0x17, 0xE9, + 0x72, 0xC7, 0xE5, 0xE1, 0x49, 0xD1, 0x91, 0xDC, 0xD5, 0xCF, 0xBD, 0xD4, + 0x93, 0xD5, 0x86, 0xDB, 0xE2, 0xE3, 0x3B, 0xE2, 0x92, 0xD8, 0xCF, 0xD2, + 0x43, 0xCA, 0x6A, 0xC9, 0x46, 0xD5, 0xE8, 0xD9, 0xFB, 0xD7, 0xD4, 0xE2, + 0x77, 0xC9, 0x71, 0xE0, 0xDF, 0xC9, 0xAD, 0xEF, 0xF2, 0xD5, 0xAB, 0x00, + 0x0C, 0xDD, 0x31, 0xFB, 0xB4, 0xDE, 0xAD, 0xFB, 0x88, 0xE0, 0x5B, 0x08, + 0x62, 0xEB, 0xAB, 0x0D, 0x2C, 0xFF, 0xAC, 0x1D, 0xF8, 0x08, 0x87, 0x29, + 0xE5, 0x09, 0x27, 0x20, 0x55, 0x0B, 0xD9, 0x16, 0x61, 0xFF, 0x42, 0x14, + 0xA0, 0xF2, 0x46, 0x0E, 0xA1, 0xF5, 0x61, 0x05, 0x2C, 0xFD, 0xBF, 0xFF, + 0x99, 0xFC, 0xC6, 0xF7, 0x90, 0x00, 0x26, 0xF3, 0x11, 0x0B, 0x45, 0xF2, + 0x15, 0x0C, 0x0E, 0xE5, 0x49, 0x0F, 0x4A, 0xDE, 0x15, 0x19, 0x5C, 0xEF, + 0x7E, 0x16, 0xF2, 0xF5, 0xB9, 0x07, 0x4C, 0xEF, 0x6A, 0xFC, 0xB8, 0xED, + 0xEA, 0x00, 0x47, 0xF1, 0x31, 0x01, 0xA1, 0xF2, 0xD7, 0xF9, 0x5D, 0xF3, + 0xA8, 0xF3, 0x03, 0xF8, 0xB9, 0xED, 0x5C, 0xFA, 0x66, 0xEB, 0x1A, 0xF5, + 0xA1, 0xEB, 0xB6, 0xF1, 0x9D, 0xEF, 0x66, 0xF6, 0x28, 0xF5, 0xA8, 0xF7, + 0x1E, 0xF2, 0xEC, 0xF1, 0x48, 0xF2, 0xC5, 0xF3, 0xE1, 0xF3, 0xBC, 0xF5, + 0xC5, 0xE2, 0x17, 0xE3, 0x17, 0xD3, 0x20, 0xCD, 0xD4, 0xD6, 0xF0, 0xD3, + 0xF0, 0xDE, 0xAE, 0xE3, 0x34, 0xD7, 0x59, 0xDC, 0x6F, 0xD9, 0x1D, 0xD8, + 0x76, 0xEC, 0x0F, 0xE4, 0xB0, 0xF0, 0x11, 0xED, 0x55, 0xF2, 0xAA, 0xF0, + 0x23, 0xFF, 0x05, 0xEF, 0xFA, 0x0B, 0xA6, 0xF1, 0x38, 0x16, 0xD4, 0xFA, + 0x6C, 0x19, 0xA8, 0xFC, 0x5B, 0x0E, 0xE0, 0xEF, 0x4E, 0x02, 0xAD, 0xE5, + 0xAA, 0xFF, 0x2B, 0xEA, 0x9A, 0xFE, 0xF3, 0xEE, 0xCE, 0xFB, 0x0C, 0xF5, + 0x6D, 0xF4, 0x76, 0xEE, 0xA9, 0xF0, 0xE2, 0xDB, 0x76, 0xF0, 0xB2, 0xDA, + 0xF7, 0xE8, 0xE3, 0xE4, 0xB9, 0xE0, 0x41, 0xE8, 0x93, 0xDF, 0xCC, 0xE3, + 0x49, 0xE8, 0x41, 0xE1, 0xA2, 0xEC, 0x66, 0xE2, 0x09, 0xE8, 0x6B, 0xE5, + 0xE0, 0xE0, 0xDF, 0xE1, 0x2B, 0xE2, 0xBA, 0xDD, 0x65, 0xEC, 0x60, 0xDB, + 0xE9, 0xEB, 0x95, 0xD2, 0xE5, 0xE1, 0x50, 0xC7, 0x51, 0xD7, 0xE5, 0xC1, + 0x3F, 0xCE, 0xD2, 0xC7, 0xC6, 0xCA, 0x3F, 0xCB, 0x88, 0xCC, 0xBD, 0xC5, + 0xE8, 0xD7, 0x5E, 0xC4, 0x30, 0xE2, 0x8E, 0xC1, 0xF8, 0xDF, 0x95, 0xBD, + 0x61, 0xE2, 0xA0, 0xC8, 0xAA, 0xDE, 0xB2, 0xCB, 0x8D, 0xD2, 0x9B, 0xC5, + 0x47, 0xD4, 0xCF, 0xCF, 0x33, 0xDA, 0xF8, 0xDC, 0x58, 0xD5, 0xC2, 0xD9, + 0x21, 0xD3, 0x0D, 0xD6, 0x89, 0xDC, 0x71, 0xE3, 0x81, 0xEE, 0x49, 0xF1, + 0xFE, 0xFD, 0x43, 0xF8, 0x1C, 0x03, 0x4F, 0x00, 0x0C, 0x07, 0xD8, 0x03, + 0x8E, 0x10, 0xBD, 0x05, 0x6E, 0x16, 0xE4, 0x05, 0x81, 0x14, 0x83, 0xFD, + 0x16, 0x11, 0xEF, 0xF3, 0x33, 0x12, 0xEB, 0xF0, 0x20, 0x12, 0x63, 0xE8, + 0x86, 0x0F, 0xD3, 0xE4, 0xBE, 0x07, 0xFE, 0xEA, 0x13, 0x00, 0xA3, 0xE9, + 0x42, 0x04, 0x22, 0xEC, 0x7A, 0x0C, 0x9F, 0xF2, 0x68, 0x14, 0x61, 0xF4, + 0xF6, 0x0F, 0x1A, 0xF4, 0x05, 0x06, 0x7E, 0xF6, 0x24, 0x05, 0x8F, 0xFB, + 0xCD, 0x09, 0xC5, 0x05, 0xA5, 0x09, 0x9C, 0x0F, 0xBB, 0x02, 0xB5, 0x0A, + 0x69, 0x02, 0xFA, 0x05, 0x7F, 0x00, 0xDE, 0x03, 0x57, 0xFA, 0x18, 0x01, + 0xED, 0xEF, 0x91, 0xF3, 0xA8, 0xEE, 0x05, 0xEF, 0xE2, 0xF8, 0x8A, 0xFC, + 0xBA, 0xF5, 0x80, 0xF7, 0x9F, 0xF3, 0xBA, 0xED, 0xD1, 0x00, 0x7F, 0xEF, + 0xF9, 0xFE, 0x2C, 0xEA, 0xB0, 0xFB, 0x8C, 0xEC, 0x17, 0x06, 0x22, 0xF8, + 0x75, 0xFE, 0xED, 0xF1, 0xEE, 0xF0, 0xF0, 0xE4, 0xFA, 0xFD, 0xFA, 0xF5, + 0x2F, 0x0C, 0x13, 0x10, 0x39, 0x02, 0xCD, 0x09, 0x3D, 0x03, 0x55, 0x01, + 0xB3, 0x1B, 0xA5, 0x14, 0xBE, 0x2C, 0x76, 0x24, 0x0E, 0x30, 0xF7, 0x20, + 0x37, 0x31, 0x34, 0x1B, 0x43, 0x33, 0xC7, 0x1C, 0xF7, 0x3D, 0xE0, 0x24, + 0x26, 0x43, 0x84, 0x26, 0xBA, 0x3B, 0x9B, 0x2B, 0xFC, 0x36, 0x13, 0x30, + 0x99, 0x32, 0x8B, 0x2C, 0xE7, 0x29, 0xEA, 0x2C, 0x8E, 0x27, 0x32, 0x35, + 0xB8, 0x26, 0x0C, 0x3B, 0x4F, 0x26, 0x28, 0x38, 0x61, 0x30, 0xC7, 0x3A, + 0x09, 0x3D, 0x7E, 0x45, 0x8A, 0x39, 0xC8, 0x45, 0x93, 0x27, 0xAB, 0x36, + 0x27, 0x22, 0xF6, 0x2F, 0x7B, 0x29, 0xC4, 0x29, 0x29, 0x2D, 0xF5, 0x18, + 0x0F, 0x2B, 0x69, 0x0E, 0x97, 0x26, 0x75, 0x11, 0x35, 0x24, 0xCC, 0x16, + 0x6F, 0x20, 0x48, 0x15, 0xFE, 0x1F, 0x7C, 0x12, 0x95, 0x22, 0x4D, 0x07, + 0xED, 0x21, 0x04, 0x04, 0xC2, 0x22, 0x5D, 0x14, 0x91, 0x19, 0xA2, 0x20, + 0x79, 0x07, 0x3F, 0x25, 0xAE, 0x05, 0x30, 0x23, 0xDE, 0x06, 0x88, 0x19, + 0x48, 0x0A, 0xEB, 0x1A, 0xD6, 0x0F, 0xC5, 0x21, 0x67, 0x03, 0x41, 0x18, + 0xAB, 0xFB, 0x10, 0x0C, 0xCF, 0x12, 0xB5, 0x18, 0x8A, 0x22, 0x2F, 0x1D, + 0x4E, 0x17, 0x7C, 0x0B, 0x70, 0x16, 0xE0, 0x11, 0xE6, 0x21, 0xAA, 0x27, + 0x49, 0x23, 0x67, 0x28, 0xA4, 0x22, 0xD9, 0x23, 0xF8, 0x25, 0xB0, 0x28, + 0x14, 0x29, 0x96, 0x2B, 0x8C, 0x30, 0x29, 0x2B, 0xCE, 0x35, 0x1D, 0x2B, + 0xF0, 0x2D, 0xC8, 0x28, 0xEB, 0x1F, 0x9F, 0x21, 0xFD, 0x19, 0xC9, 0x1B, + 0x43, 0x1F, 0xDA, 0x1A, 0xFF, 0x24, 0xBA, 0x1A, 0xA3, 0x24, 0x93, 0x18, + 0x53, 0x23, 0xBA, 0x18, 0x64, 0x24, 0xB4, 0x24, 0x6A, 0x22, 0x4B, 0x2C, + 0x78, 0x1A, 0x57, 0x1E, 0x6B, 0x19, 0xFA, 0x13, 0xAE, 0x1D, 0xE8, 0x20, + 0xD2, 0x1B, 0xAA, 0x2F, 0xF7, 0x16, 0x84, 0x30, 0xED, 0x15, 0x3B, 0x2D, + 0xC5, 0x12, 0x70, 0x28, 0x84, 0x13, 0x8C, 0x2D, 0xF5, 0x10, 0xC3, 0x31, + 0xF1, 0x02, 0x48, 0x2A, 0xD5, 0x01, 0xF4, 0x1D, 0xBF, 0x0D, 0x9B, 0x17, + 0xE3, 0x12, 0xCD, 0x1D, 0x5E, 0x13, 0x2B, 0x27, 0xD3, 0x15, 0x06, 0x20, + 0x4D, 0x1D, 0x0A, 0x12, 0x9E, 0x1E, 0xEC, 0x10, 0x68, 0x1B, 0xB2, 0x1A, + 0x56, 0x21, 0x1D, 0x20, 0x45, 0x23, 0xD9, 0x10, 0x9C, 0x1D, 0x1F, 0x03, + 0x7F, 0x21, 0x8E, 0x0C, 0xAC, 0x26, 0xF4, 0x21, 0x66, 0x14, 0x8B, 0x25, + 0x9A, 0x05, 0xF9, 0x1E, 0xAD, 0x10, 0x53, 0x2C, 0x14, 0x1A, 0x88, 0x3A, + 0x35, 0x21, 0xB6, 0x3E, 0x1F, 0x2F, 0x56, 0x41, 0x80, 0x2D, 0xF8, 0x3B, + 0xF0, 0x23, 0xFA, 0x37, 0xE5, 0x1F, 0x3B, 0x3B, 0x6D, 0x1C, 0x50, 0x3B, + 0x7E, 0x1B, 0x1F, 0x30, 0x8E, 0x14, 0x4D, 0x1F, 0xB1, 0x08, 0x9A, 0x1B, + 0xA2, 0x09, 0xDD, 0x18, 0x9B, 0x0F, 0x0B, 0x07, 0x22, 0x01, 0x7D, 0xF7, + 0x6F, 0xEB, 0x40, 0xF8, 0x4C, 0xE5, 0x68, 0xFF, 0x74, 0xEA, 0xAC, 0xF7, + 0x6C, 0xED, 0x58, 0xE3, 0xB8, 0xE4, 0x7A, 0xDD, 0x72, 0xDF, 0x4B, 0xE5, + 0x9D, 0xE9, 0x62, 0xE7, 0xE7, 0xEF, 0x07, 0xEA, 0x12, 0xEC, 0x65, 0xED, + 0x3E, 0xE4, 0x74, 0xED, 0xCD, 0xD9, 0x1A, 0xF1, 0xCF, 0xD3, 0xD3, 0xF1, + 0x63, 0xD8, 0xCE, 0xF0, 0xF0, 0xD6, 0x5B, 0xEA, 0xB8, 0xCE, 0x1D, 0xEC, + 0xBA, 0xCF, 0x67, 0xF2, 0xDD, 0xD1, 0x61, 0xEA, 0xBD, 0xD0, 0x2C, 0xDE, + 0xF8, 0xD6, 0xB0, 0xDD, 0x1D, 0xDB, 0x4C, 0xE2, 0x58, 0xE2, 0x86, 0xEC, + 0xA5, 0xE4, 0xB2, 0xF2, 0x18, 0xCA, 0x2A, 0xDF, 0x22, 0xB7, 0xF1, 0xD2, + 0x4C, 0xC9, 0xA2, 0xE8, 0x03, 0xDA, 0xFB, 0xEF, 0x5A, 0xD9, 0x37, 0xDD, + 0x31, 0xE3, 0x7F, 0xE1, 0x80, 0xF6, 0xDB, 0xF2, 0xED, 0x07, 0xE5, 0xF1, + 0x9C, 0x18, 0xF3, 0xF5, 0xEE, 0x17, 0x72, 0xFD, 0xC4, 0x0C, 0x51, 0xF9, + 0x2A, 0x0D, 0x98, 0xFF, 0xF4, 0x0C, 0xF5, 0x08, 0xD4, 0xFD, 0xC0, 0xFE, + 0x1D, 0xE7, 0xC3, 0xF2, 0x63, 0xDD, 0x71, 0xF2, 0x10, 0xE4, 0xCF, 0xF4, + 0xFD, 0xEE, 0xA9, 0xF9, 0xCD, 0xF0, 0x75, 0xFD, 0xE0, 0xDF, 0x33, 0xFE, + 0x5D, 0xD6, 0xAB, 0x03, 0x04, 0xE4, 0x59, 0x0A, 0xF8, 0xE9, 0x25, 0x01, + 0xC2, 0xE1, 0x4D, 0xF7, 0xAE, 0xDA, 0xD8, 0xFA, 0x38, 0xDB, 0x5D, 0xFA, + 0x63, 0xDC, 0x9C, 0xF2, 0xD7, 0xDD, 0xA5, 0xE9, 0x34, 0xE7, 0x61, 0xDF, + 0x36, 0xE8, 0x10, 0xD6, 0x7C, 0xE7, 0x83, 0xD3, 0x84, 0xEC, 0xED, 0xD2, + 0x35, 0xF1, 0x1B, 0xD4, 0x98, 0xF2, 0x35, 0xCE, 0xB1, 0xF1, 0x9D, 0xC7, + 0xBF, 0xF2, 0x93, 0xCF, 0x4A, 0xF4, 0x1E, 0xD6, 0x14, 0xEA, 0x09, 0xD3, + 0x57, 0xDC, 0xC1, 0xD2, 0x1E, 0xD7, 0xC9, 0xD1, 0x7F, 0xD7, 0x98, 0xD8, + 0x1B, 0xDD, 0x29, 0xEB, 0xD3, 0xDD, 0x85, 0xF2, 0x77, 0xDB, 0xC0, 0xEE, + 0x6A, 0xE2, 0x42, 0xFA, 0xA0, 0xF0, 0x35, 0x0B, 0xE4, 0xEE, 0xEE, 0x00, + 0x7C, 0xE3, 0x77, 0xFC, 0x4A, 0xE9, 0x01, 0x07, 0xBA, 0xF9, 0x6A, 0x08, + 0xA3, 0xFC, 0x30, 0x09, 0xD9, 0xFD, 0xEE, 0x06, 0x5B, 0xFC, 0xFB, 0xFD, + 0x91, 0xF6, 0x62, 0xF9, 0x83, 0x01, 0xF5, 0xF9, 0x31, 0x0A, 0x91, 0xF3, + 0xEB, 0x00, 0x96, 0xE8, 0x3A, 0xFD, 0x96, 0xE8, 0x8D, 0x01, 0xDB, 0xE7, + 0xD2, 0x04, 0x74, 0xE3, 0xD5, 0x05, 0x74, 0xEF, 0x80, 0xF4, 0x2C, 0xF1, + 0xC6, 0xDD, 0x03, 0xDB, 0xA3, 0xDE, 0x62, 0xD7, 0xAE, 0xE5, 0xA0, 0xDF, + 0xAA, 0xD7, 0x90, 0xDA, 0x03, 0xD1, 0xFB, 0xDB, 0xF7, 0xE1, 0xA1, 0xEA, + 0x76, 0xEF, 0x52, 0xEC, 0x32, 0xF1, 0xE6, 0xDD, 0x1B, 0xF0, 0xDE, 0xE4, + 0xDB, 0xEC, 0x92, 0xF1, 0x38, 0xE7, 0x10, 0xEF, 0x73, 0xE9, 0xDE, 0xF5, + 0xEC, 0xE9, 0x65, 0xF2, 0x1F, 0xDD, 0xEA, 0xE4, 0x05, 0xCE, 0xC5, 0xE0, + 0xCB, 0xC8, 0xB0, 0xE2, 0xD8, 0xCA, 0xC4, 0xE8, 0x99, 0xCD, 0x8B, 0xEC, + 0xC4, 0xCE, 0xA3, 0xEB, 0xD6, 0xD3, 0x6D, 0xE5, 0x2E, 0xDD, 0x2E, 0xD9, + 0x3E, 0xF2, 0x42, 0xDB, 0xF6, 0x01, 0x73, 0xE3, 0x02, 0xF2, 0x63, 0xD6, + 0x19, 0xE1, 0xB9, 0xC9, 0x99, 0xED, 0xFC, 0xD7, 0x14, 0xFD, 0x44, 0xE3, + 0xE4, 0xF7, 0xB7, 0xD2, 0x28, 0xF9, 0x5F, 0xD2, 0x76, 0x09, 0x6F, 0xE8, + 0x20, 0x0D, 0x23, 0xF2, 0xEA, 0x05, 0xFE, 0x00, 0x6D, 0x01, 0x46, 0x15, + 0x9B, 0xFC, 0xAF, 0x13, 0xB0, 0xFD, 0xAA, 0x0B, 0x05, 0x04, 0x27, 0x0E, + 0xE7, 0xFF, 0x45, 0x12, 0x68, 0xF4, 0xC8, 0x0A, 0x8D, 0xE9, 0xF3, 0xFA, + 0x95, 0xE5, 0xEC, 0xEE, 0x6B, 0xE8, 0xF1, 0xED, 0xBE, 0xE9, 0x80, 0xEB, + 0x74, 0xE5, 0x47, 0xDD, 0xBB, 0xE9, 0x65, 0xDB, 0x8F, 0xFD, 0x08, 0xE4, + 0xAB, 0x06, 0x40, 0xE1, 0x75, 0xFF, 0x21, 0xDE, 0x6B, 0xF7, 0xD5, 0xDD, + 0x55, 0xF3, 0x86, 0xD5, 0x3D, 0xF2, 0xBD, 0xD5, 0x77, 0xF6, 0xBF, 0xDB, + 0xFD, 0xF8, 0x96, 0xD2, 0x62, 0xEB, 0x52, 0xC7, 0xC9, 0xDF, 0x50, 0xC8, + 0x3F, 0xE6, 0x09, 0xCD, 0xCC, 0xE9, 0x85, 0xD3, 0x4F, 0xEA, 0xAE, 0xE8, + 0x20, 0xE5, 0x84, 0xEC, 0x27, 0xE4, 0x8A, 0xE1, 0x0F, 0xEC, 0x5B, 0xE4, + 0xB9, 0xEB, 0x9F, 0xE5, 0xA5, 0xE2, 0x21, 0xE0, 0xA8, 0xE0, 0x4C, 0xE5, + 0xA4, 0xDF, 0x84, 0xE9, 0x10, 0xDE, 0xF3, 0xEE, 0xE6, 0xDD, 0xCA, 0xF7, + 0x9C, 0xD2, 0x0B, 0xEB, 0xF5, 0xD1, 0x25, 0xE5, 0x60, 0xF2, 0x0A, 0xFE, + 0xE4, 0x08, 0x8D, 0x0C, 0xAA, 0xF6, 0xCA, 0x04, 0x2D, 0xE9, 0x76, 0x03, + 0x02, 0xF7, 0x69, 0x08, 0x8E, 0x0A, 0x15, 0x02, 0xB7, 0x14, 0x85, 0x01, + 0x4A, 0x18, 0x16, 0x08, 0xFD, 0x1A, 0x29, 0xFB, 0x8D, 0x20, 0x0C, 0xF2, + 0x37, 0x29, 0x73, 0xF8, 0xD6, 0x28, 0x21, 0xFB, 0x20, 0x21, 0x31, 0xFE, + 0xEF, 0x1A, 0xB7, 0x00, 0x26, 0x13, 0xF7, 0xFE, 0xD8, 0x0F, 0x98, 0x04, + 0x0F, 0x11, 0xBE, 0x13, 0x2A, 0x0C, 0x7E, 0x0C, 0x29, 0x09, 0x2E, 0xF9, + 0xE4, 0x0D, 0x9A, 0x01, 0xFB, 0x0D, 0x09, 0x11, 0x4B, 0x08, 0xCD, 0x14, + 0x6E, 0x0D, 0xD7, 0x16, 0x37, 0x0F, 0x37, 0x11, 0x51, 0x05, 0x2F, 0x09, + 0x6F, 0x0C, 0xF1, 0x11, 0x47, 0x1F, 0xAA, 0x1B, 0xCD, 0x25, 0x85, 0x0E, + 0x39, 0x1D, 0x2C, 0xFE, 0x79, 0x17, 0x36, 0x01, 0x5E, 0x10, 0x2B, 0xFF, + 0x00, 0x0A, 0x43, 0xEE, 0x37, 0x0B, 0x9F, 0xDE, 0x45, 0x09, 0xE2, 0xD8, + 0x2E, 0x10, 0x93, 0xE0, 0x81, 0x10, 0x26, 0xE9, 0x37, 0xFE, 0x62, 0xE9, + 0x85, 0xF2, 0x06, 0xEF, 0x94, 0xF5, 0x44, 0xFA, 0x44, 0x00, 0xF6, 0x05, + 0x52, 0x1D, 0xB2, 0x20, 0xAF, 0x28, 0xE8, 0x2A, 0xEC, 0x0A, 0xEC, 0x16, + 0x74, 0x00, 0x9E, 0x1B, 0x64, 0x1B, 0xED, 0x3B, 0x41, 0x1C, 0x6B, 0x36, + 0x3C, 0x03, 0xAF, 0x1D, 0x1C, 0x06, 0x2D, 0x1D, 0x7B, 0x17, 0x18, 0x22, + 0x1A, 0x1E, 0x20, 0x22, 0x59, 0x24, 0x18, 0x26, 0xBA, 0x22, 0x41, 0x24, + 0xE7, 0x14, 0xC7, 0x1B, 0x5D, 0x0F, 0x9D, 0x1A, 0x88, 0x14, 0x34, 0x17, + 0xF7, 0x15, 0x2A, 0x13, 0xBC, 0x17, 0x17, 0x17, 0x90, 0x1F, 0xB7, 0x12, + 0x1E, 0x1D, 0xC9, 0xFE, 0xBB, 0x1D, 0x9C, 0xFF, 0x70, 0x23, 0xED, 0x0B, + 0x63, 0x18, 0xA9, 0x02, 0x02, 0x12, 0x88, 0xF9, 0x50, 0x1C, 0xE5, 0xFF, + 0x80, 0x1F, 0x97, 0x0A, 0x52, 0x1D, 0xB9, 0x0F, 0x06, 0x22, 0x16, 0x14, + 0x34, 0x22, 0xA2, 0x13, 0x8C, 0x19, 0x3D, 0x12, 0x57, 0x13, 0x9E, 0x1C, + 0xAD, 0x15, 0x68, 0x26, 0xE7, 0x16, 0xF7, 0x21, 0xB4, 0x15, 0x45, 0x17, + 0xB3, 0x17, 0x2F, 0x1F, 0x7C, 0x16, 0xE7, 0x30, 0xE9, 0x1D, 0xEA, 0x3B, + 0x15, 0x1D, 0x53, 0x38, 0xED, 0x12, 0x98, 0x32, 0xAC, 0x12, 0x8D, 0x39, + 0x74, 0x15, 0x48, 0x3A, 0x60, 0x1A, 0x23, 0x29, 0xA0, 0x25, 0x81, 0x1F, + 0x2B, 0x2F, 0xBE, 0x1F, 0xDE, 0x39, 0x1E, 0x24, 0xAE, 0x48, 0x26, 0x30, + 0x01, 0x3D, 0x9B, 0x24, 0xAE, 0x28, 0x48, 0x12, 0x0B, 0x3F, 0x9C, 0x28, + 0x2C, 0x5E, 0x96, 0x4A, 0xDA, 0x4F, 0x4D, 0x42, 0x7A, 0x3A, 0x23, 0x34, + 0x9D, 0x3C, 0xB9, 0x44, 0x80, 0x42, 0x12, 0x55, 0x10, 0x41, 0x3E, 0x5C, + 0x0F, 0x41, 0x69, 0x5F, 0x44, 0x40, 0x68, 0x51, 0x39, 0x40, 0xCC, 0x49, + 0x1B, 0x46, 0xE9, 0x58, 0x43, 0x45, 0x61, 0x5E, 0x5D, 0x3C, 0xCC, 0x4E, + 0x6F, 0x35, 0xA5, 0x3E, 0x68, 0x31, 0x3C, 0x33, 0x99, 0x25, 0x3A, 0x2F, + 0xA8, 0x1C, 0x65, 0x3C, 0xA3, 0x1B, 0x4A, 0x3D, 0x4C, 0x1A, 0x59, 0x28, + 0xE4, 0x18, 0x98, 0x1B, 0xB1, 0x1A, 0x62, 0x16, 0x8B, 0x1B, 0x60, 0x0F, + 0x1E, 0x1E, 0xC5, 0x12, 0xE9, 0x23, 0x17, 0x1B, 0x47, 0x27, 0x1C, 0x1C, + 0xE0, 0x27, 0x55, 0x17, 0x77, 0x25, 0xAF, 0x17, 0x28, 0x22, 0x5C, 0x1B, + 0x9C, 0x17, 0xDC, 0x17, 0x8A, 0x06, 0xE7, 0x0E, 0xDC, 0x02, 0xAB, 0x0E, + 0xD9, 0x00, 0x97, 0x0D, 0x9A, 0xFC, 0x44, 0x07, 0x96, 0xF4, 0x2C, 0xFE, + 0xA0, 0xF5, 0xD2, 0xFD, 0x26, 0x05, 0xFA, 0x0C, 0xF8, 0x03, 0x71, 0x16, + 0x22, 0xFB, 0x4F, 0x10, 0xF8, 0x05, 0x3E, 0x11, 0xC9, 0x04, 0xF6, 0x14, + 0xD3, 0xF7, 0xA2, 0x15, 0x3C, 0x01, 0x5C, 0x26, 0x20, 0xFC, 0xEA, 0x1A, + 0xDA, 0xE5, 0xE9, 0xF7, 0x28, 0xF3, 0xDD, 0x04, 0x09, 0x0C, 0xDA, 0x21, + 0x49, 0xFF, 0xD0, 0x0B, 0x6E, 0xF8, 0x43, 0xF0, 0xD6, 0x0A, 0xC4, 0xFF, + 0x95, 0x11, 0xF2, 0x0C, 0x68, 0x0E, 0x40, 0x07, 0x3D, 0x0B, 0xC5, 0x08, + 0x11, 0x03, 0xD9, 0xFF, 0x1D, 0x01, 0xEB, 0xF2, 0x0F, 0x03, 0xFB, 0xF4, + 0xDA, 0xFC, 0x58, 0xEF, 0x3E, 0xF6, 0x75, 0xE5, 0x0C, 0xF6, 0x82, 0xEC, + 0x5B, 0xEF, 0x66, 0xEE, 0x2B, 0xE7, 0xE3, 0xEA, 0x7E, 0xEB, 0xAA, 0xF4, + 0x96, 0xED, 0x6F, 0xFB, 0xF6, 0xE5, 0xCF, 0xF6, 0x77, 0xE7, 0x3B, 0xF8, + 0xA9, 0xEB, 0xD5, 0xFF, 0xF7, 0xE0, 0x7C, 0xFE, 0xBA, 0xDA, 0x30, 0xFA, + 0x57, 0xE0, 0x00, 0xFA, 0x32, 0xE3, 0x7F, 0xF7, 0x4D, 0xE6, 0x6D, 0xF1, + 0x85, 0xEE, 0xA8, 0xF1, 0x3C, 0xF0, 0x9E, 0xF4, 0x04, 0xEE, 0x91, 0xED, + 0x50, 0xEC, 0x56, 0xE3, 0x95, 0xEA, 0xB5, 0xE8, 0x2E, 0xEC, 0xD9, 0xED, + 0x4F, 0xF4, 0xEA, 0xEE, 0x14, 0xF2, 0x0A, 0xF2, 0x14, 0xF3, 0x54, 0xFD, + 0x90, 0x04, 0x13, 0x0D, 0x99, 0x03, 0x55, 0x0C, 0xEE, 0xF4, 0xE6, 0x01, + 0x95, 0xF8, 0xA2, 0x0A, 0x37, 0xF8, 0xEE, 0x0A, 0xBF, 0xFB, 0xD4, 0x04, + 0x74, 0x20, 0x10, 0x20, 0x66, 0x2C, 0x09, 0x20, 0x15, 0x10, 0x2B, 0xFD, + 0xA5, 0x10, 0x9C, 0x07, 0x1F, 0x22, 0x0E, 0x2E, 0x31, 0x0E, 0xB2, 0x29, + 0x51, 0xFA, 0x6B, 0x19, 0x1F, 0x0F, 0x80, 0x24, 0xCC, 0x26, 0x19, 0x25, + 0x06, 0x20, 0x87, 0x18, 0x25, 0x18, 0x03, 0x1A, 0xED, 0x11, 0x90, 0x17, + 0xDF, 0x02, 0x50, 0x0E, 0x74, 0x05, 0xA0, 0x14, 0x53, 0x12, 0xD4, 0x16, + 0xE9, 0x0A, 0x2D, 0x07, 0x8C, 0xFE, 0xCB, 0xFF, 0xA4, 0xFD, 0x13, 0x00, + 0xDD, 0xFD, 0x1F, 0x01, 0xB5, 0x00, 0xD5, 0x08, 0x9E, 0x07, 0x32, 0x09, + 0xED, 0x05, 0xFD, 0xFB, 0xD7, 0x04, 0x02, 0xF7, 0x1B, 0x0E, 0xBE, 0x04, + 0xFC, 0x06, 0x33, 0x08, 0x7A, 0xF9, 0xB5, 0xFD, 0xD8, 0x00, 0x1D, 0xFF, + 0x01, 0x01, 0xF2, 0x09, 0x9D, 0xE7, 0xCC, 0x07, 0xCA, 0xD9, 0x70, 0xFE, + 0xAE, 0xDD, 0xEF, 0x01, 0xAF, 0xE3, 0x2D, 0x04, 0x83, 0xE9, 0x1F, 0xF7, + 0x5E, 0xEC, 0x42, 0xF5, 0xFF, 0xEE, 0xF3, 0x01, 0x26, 0xF6, 0x9A, 0x00, + 0x66, 0xFC, 0x01, 0xF1, 0xF8, 0xF0, 0x99, 0xEA, 0xE1, 0xE9, 0xEA, 0xF1, + 0x52, 0xF7, 0x29, 0xF0, 0x75, 0xFB, 0x4D, 0xE1, 0x86, 0xF2, 0xA6, 0xD8, + 0x3B, 0xED, 0x12, 0xD6, 0x84, 0xDB, 0x56, 0xC9, 0x90, 0xDC, 0xFA, 0xCF, + 0x0A, 0xF6, 0xF1, 0xE4, 0x73, 0xF3, 0xAC, 0xE0, 0x38, 0xE7, 0xB6, 0xDA, + 0x1B, 0xFF, 0xCE, 0xF4, 0x37, 0x0B, 0x82, 0xFE, 0x44, 0xEC, 0x78, 0xE5, + 0x2F, 0xDC, 0xB6, 0xDF, 0xD6, 0xE1, 0xCB, 0xF1, 0xD4, 0xDF, 0x7F, 0xF8, + 0xD1, 0xE7, 0x89, 0xF2, 0xAE, 0xF0, 0x41, 0xEC, 0x64, 0xDB, 0x73, 0xDC, + 0x73, 0xD5, 0x94, 0xD7, 0xD1, 0xF0, 0x52, 0xE2, 0x2C, 0xF2, 0x4A, 0xE1, + 0x64, 0xDF, 0x62, 0xD2, 0x5D, 0xD9, 0x01, 0xC8, 0x85, 0xD1, 0xDF, 0xC8, + 0x53, 0xCE, 0x35, 0xC8, 0xB9, 0xD3, 0xD4, 0xC6, 0x3E, 0xCC, 0x78, 0xC6, + 0xC7, 0xC5, 0xB2, 0xC1, 0x41, 0xCF, 0xD0, 0xC2, 0x3C, 0xD4, 0xF2, 0xCA, + 0xA2, 0xC5, 0x6C, 0xD0, 0xD9, 0xBD, 0x7E, 0xD2, 0xFF, 0xCD, 0xB8, 0xD5, + 0x91, 0xDC, 0x71, 0xD5, 0x95, 0xDC, 0xD9, 0xCC, 0xB5, 0xD7, 0xD1, 0xCE, + 0xD3, 0xD2, 0x52, 0xD4, 0xED, 0xCC, 0x3D, 0xCB, 0x6E, 0xC6, 0x07, 0xC0, + 0x35, 0xC9, 0xF2, 0xC6, 0x10, 0xCA, 0x50, 0xD2, 0x29, 0xCA, 0x1E, 0xCD, + 0xE8, 0xC3, 0x19, 0xBD, 0xCB, 0xB7, 0x1F, 0xBB, 0x10, 0xBC, 0x76, 0xCB, + 0x1A, 0xC7, 0xEB, 0xD3, 0xDB, 0xC7, 0x99, 0xCD, 0x1C, 0xCE, 0x91, 0xCA, + 0x18, 0xD4, 0x8A, 0xC7, 0xEC, 0xD7, 0xF9, 0xC5, 0x09, 0xE6, 0xB8, 0xCF, + 0x5F, 0xDA, 0x6E, 0xBF, 0x24, 0xC0, 0xC7, 0x9C, 0x74, 0xCE, 0x62, 0xAF, + 0xB0, 0xEB, 0x87, 0xD8, 0x08, 0xE2, 0x53, 0xC9, 0xF5, 0xCB, 0x8A, 0xAF, + 0x52, 0xD4, 0xFA, 0xBD, 0xDC, 0xEC, 0x24, 0xCD, 0x41, 0xF6, 0x51, 0xD6, + 0x6A, 0xF5, 0x77, 0xE1, 0x62, 0xEC, 0x96, 0xD2, 0x83, 0xD8, 0xCA, 0xC5, + 0xC6, 0xD7, 0xD7, 0xD9, 0xBE, 0xE0, 0x85, 0xEA, 0xCD, 0xD6, 0x80, 0xE5, + 0x61, 0xC7, 0xCB, 0xD9, 0x12, 0xC3, 0xE5, 0xD1, 0x91, 0xC7, 0x82, 0xDC, + 0x8D, 0xD3, 0x1F, 0xEB, 0xAB, 0xDA, 0x5F, 0xE2, 0xB4, 0xD1, 0xEF, 0xD4, + 0x71, 0xD3, 0xFD, 0xD2, 0x0F, 0xE4, 0x64, 0xD6, 0x66, 0xE9, 0x0D, 0xD6, + 0x38, 0xE8, 0xE7, 0xCF, 0xB5, 0xED, 0xD6, 0xCD, 0x84, 0xF1, 0x16, 0xD2, + 0x9B, 0xEE, 0xA2, 0xD7, 0x2D, 0xEB, 0x10, 0xD7, 0xDB, 0xE6, 0xE2, 0xD0, + 0x39, 0xE5, 0x8F, 0xD2, 0x0F, 0xE8, 0x39, 0xDC, 0x22, 0xE6, 0x40, 0xE2, + 0x7F, 0xE7, 0x17, 0xE4, 0xA3, 0xF0, 0x47, 0xE4, 0xBF, 0xF6, 0x70, 0xE6, + 0x7F, 0xEE, 0x07, 0xEA, 0xAF, 0xE8, 0x0F, 0xF4, 0x9C, 0xF2, 0xAE, 0xFA, + 0x08, 0xF9, 0x2B, 0xF9, 0x55, 0xF8, 0x8E, 0xF7, 0x6F, 0xF7, 0x4B, 0xF4, + 0x17, 0xEE, 0x35, 0xEB, 0xCD, 0xEF, 0x97, 0xF0, 0xD8, 0x06, 0xC7, 0x02, + 0x87, 0x03, 0x74, 0xFA, 0x34, 0xEE, 0xA7, 0xE9, 0xBE, 0xFE, 0xB9, 0xF7, + 0x9E, 0x1A, 0xAD, 0x0A, 0x1F, 0x0D, 0xA0, 0xF8, 0xD2, 0xF4, 0x88, 0xEC, + 0x59, 0xF9, 0x7D, 0xFD, 0x76, 0x06, 0x3E, 0x04, 0x28, 0x0C, 0x85, 0x05, + 0x1A, 0x15, 0x14, 0x0E, 0x53, 0x0F, 0x12, 0x0D, 0x34, 0x00, 0x80, 0x0B, + 0xC5, 0x06, 0x58, 0x1A, 0x57, 0x0D, 0x4A, 0x1E, 0xB9, 0x02, 0x0B, 0x0D, + 0xB8, 0xFD, 0x06, 0xFD, 0x80, 0xFF, 0x9C, 0xF9, 0xBE, 0x06, 0x83, 0x01, + 0xDA, 0x10, 0x10, 0x0C, 0x51, 0x06, 0x24, 0x0B, 0x18, 0xF5, 0x1F, 0x05, + 0x43, 0xFE, 0x18, 0x06, 0xE5, 0x0A, 0xD2, 0x00, 0xDA, 0x03, 0xB3, 0x02, + 0x67, 0x04, 0x9B, 0x15, 0x7F, 0x0F, 0x25, 0x1B, 0x61, 0x14, 0xA0, 0x0E, + 0x04, 0x18, 0x5B, 0x0C, 0x05, 0x15, 0xC0, 0x0D, 0xE0, 0x0C, 0x39, 0x01, + 0x0E, 0x10, 0xAF, 0xF9, 0x39, 0x1A, 0xB2, 0xF9, 0x03, 0x1E, 0x95, 0xF7, + 0x7F, 0x23, 0xD8, 0xF5, 0x75, 0x28, 0x18, 0xF4, 0x81, 0x24, 0x5C, 0xF1, + 0xBD, 0x1F, 0x4F, 0xF0, 0xEE, 0x1D, 0x1D, 0x01, 0x01, 0x1C, 0xE4, 0x12, + 0xED, 0x1C, 0xFB, 0x0D, 0xE2, 0x1E, 0x67, 0x0A, 0x99, 0x1C, 0x8D, 0x14, + 0x8E, 0x15, 0x77, 0x1A, 0x69, 0x1D, 0x98, 0x2C, 0xA0, 0x27, 0x10, 0x40, + 0x01, 0x0F, 0x33, 0x32, 0x70, 0xF8, 0x61, 0x22, 0x2D, 0x14, 0xA1, 0x33, + 0xC8, 0x2F, 0xA7, 0x40, 0x91, 0x23, 0xCD, 0x2A, 0xD5, 0x1B, 0xEC, 0x1E, + 0x4A, 0x23, 0x7B, 0x2D, 0xC5, 0x20, 0x94, 0x2C, 0x16, 0x19, 0x6E, 0x1E, + 0xA6, 0x19, 0xE4, 0x18, 0xAF, 0x17, 0x0C, 0x10, 0x0D, 0x18, 0x85, 0x07, + 0x11, 0x20, 0x27, 0x0A, 0xE5, 0x1B, 0x16, 0x13, 0x70, 0x0C, 0x22, 0x11, + 0x8E, 0x01, 0xD3, 0x08, 0xEA, 0x00, 0x1E, 0x0B, 0x56, 0x0B, 0xE9, 0x13, + 0xC1, 0x16, 0x05, 0x1A, 0x60, 0x10, 0x08, 0x13, 0xC8, 0x08, 0xCA, 0x0D, + 0xD4, 0x13, 0xC5, 0x13, 0x49, 0x1A, 0x25, 0x0C, 0x2A, 0x0D, 0x03, 0xFF, + 0x86, 0x07, 0xB0, 0x03, 0x2C, 0x0D, 0xC4, 0x0A, 0xD4, 0x09, 0xE5, 0x0F, + 0x32, 0x0F, 0x58, 0x15, 0x8F, 0x18, 0xC1, 0x14, 0x06, 0x12, 0xDC, 0x10, + 0x43, 0x0B, 0x2F, 0x0F, 0xE0, 0x07, 0x80, 0x15, 0xCB, 0x04, 0x90, 0x15, + 0x8D, 0x09, 0x1F, 0x12, 0xAF, 0x09, 0x6E, 0x0C, 0x22, 0x08, 0x94, 0x07, + 0x9D, 0x0B, 0xED, 0x04, 0x88, 0x11, 0x9D, 0x04, 0x82, 0x19, 0xF9, 0x0C, + 0xD3, 0x1A, 0x04, 0x0E, 0xA4, 0x12, 0x64, 0x05, 0x0A, 0x19, 0x0B, 0x04, + 0x15, 0x22, 0x4A, 0x05, 0xD0, 0x1A, 0x60, 0x0B, 0xB1, 0x20, 0xD4, 0x1B, + 0x77, 0x1B, 0xA0, 0x15, 0x79, 0xFF, 0x3A, 0xFF, 0x8D, 0x04, 0x14, 0x12, + 0x08, 0x24, 0x2E, 0x34, 0xD4, 0x18, 0xD4, 0x1D, 0x21, 0xFC, 0x5C, 0x08, + 0x1A, 0x05, 0xE8, 0x28, 0x9E, 0x13, 0x3B, 0x43, 0x93, 0x0D, 0x42, 0x3D, + 0xCA, 0x0D, 0x2D, 0x36, 0xF9, 0x0C, 0x8C, 0x2C, 0x4C, 0x07, 0xF7, 0x26, + 0x50, 0x0D, 0x36, 0x31, 0x6C, 0x0F, 0x6B, 0x2A, 0xA0, 0x0D, 0x7F, 0x0F, + 0xD4, 0x09, 0x96, 0x00, 0x33, 0x05, 0x6E, 0x04, 0x5E, 0x08, 0x9E, 0x06, + 0x34, 0x09, 0x35, 0xFF, 0x55, 0xFD, 0xFF, 0xF3, 0xF8, 0xF3, 0x49, 0xEF, + 0x2C, 0xFA, 0xD0, 0xFA, 0xF7, 0x03, 0x3E, 0x05, 0xC5, 0x05, 0x48, 0xFE, + 0x34, 0x07, 0x15, 0xF6, 0x78, 0x11, 0xF1, 0x00, 0xD0, 0x17, 0x1A, 0x0A, + 0xA4, 0x19, 0x61, 0x06, 0xF0, 0x1B, 0xCE, 0x04, 0x53, 0x1A, 0x98, 0x0F, + 0x7C, 0x11, 0x6D, 0x1E, 0x92, 0x12, 0xCC, 0x26, 0x87, 0x14, 0xD5, 0x22, + 0x07, 0x05, 0x76, 0x1C, 0xD5, 0x03, 0x32, 0x29, 0xC3, 0x12, 0xD7, 0x3A, + 0x44, 0x18, 0x8E, 0x35, 0xD5, 0x17, 0x68, 0x23, 0x73, 0x1D, 0xAC, 0x29, + 0x1E, 0x23, 0x6D, 0x40, 0x79, 0x28, 0x58, 0x43, 0x9A, 0x2D, 0xF3, 0x37, + 0x92, 0x32, 0x62, 0x38, 0x54, 0x3F, 0x01, 0x3C, 0xBB, 0x4E, 0xFB, 0x46, + 0x17, 0x4E, 0x70, 0x4B, 0x32, 0x2F, 0xF3, 0x29, 0xAB, 0x19, 0x9A, 0x1E, + 0x1B, 0x39, 0x30, 0x42, 0x8A, 0x50, 0x0E, 0x47, 0x87, 0x3F, 0x1F, 0x2A, + 0x8B, 0x38, 0xBC, 0x24, 0x5A, 0x42, 0x87, 0x38, 0x95, 0x45, 0xE7, 0x43, + 0xDA, 0x42, 0x78, 0x42, 0xBB, 0x3A, 0x87, 0x3B, 0xDA, 0x2E, 0x53, 0x3A, + 0x9E, 0x27, 0x14, 0x43, 0x44, 0x24, 0xF9, 0x42, 0xBF, 0x1D, 0x0C, 0x38, + 0x97, 0x16, 0x9D, 0x2D, 0xCE, 0x0B, 0xC8, 0x24, 0x5B, 0x06, 0xB7, 0x22, + 0x28, 0x0E, 0x90, 0x26, 0xA1, 0x12, 0x7A, 0x2A, 0x4F, 0x0B, 0x04, 0x25, + 0x7E, 0x04, 0x82, 0x1B, 0xEF, 0x07, 0x30, 0x1C, 0x2B, 0x06, 0x8C, 0x16, + 0xAD, 0xFB, 0xC9, 0x08, 0xA6, 0xF9, 0x07, 0x0B, 0x0B, 0xFF, 0xCB, 0x09, + 0x17, 0x06, 0xEF, 0xFB, 0xA8, 0x0A, 0x5D, 0xF3, 0xED, 0x0B, 0x8B, 0xF4, + 0x28, 0x13, 0x94, 0x02, 0x57, 0x17, 0xAA, 0x0A, 0x8F, 0x14, 0x5B, 0x03, + 0x14, 0x08, 0x9C, 0xF3, 0x5B, 0xFD, 0x2A, 0xF8, 0x56, 0x00, 0xE0, 0x0C, + 0x24, 0x0D, 0xF0, 0x11, 0xA6, 0x0E, 0x50, 0x0C, 0x82, 0x03, 0xF7, 0x12, + 0x09, 0x02, 0x12, 0x21, 0x6E, 0x02, 0xB9, 0x26, 0x8C, 0xF7, 0xFD, 0x1C, + 0x8B, 0xF5, 0xE2, 0x12, 0x3F, 0xFE, 0x43, 0x13, 0x67, 0x00, 0x73, 0x10, + 0x4C, 0x0F, 0x49, 0x14, 0x37, 0x12, 0xF9, 0x0D, 0x9C, 0xF6, 0xF9, 0xF6, + 0x4A, 0xEC, 0xF9, 0xF8, 0x49, 0x07, 0x0E, 0x0E, 0xDE, 0x0D, 0x94, 0x04, + 0xE1, 0xF4, 0xC8, 0xE7, 0xA0, 0xF9, 0x55, 0xE8, 0xD0, 0x0E, 0x7D, 0xF8, + 0x86, 0x0A, 0x0F, 0xF3, 0x4E, 0xFC, 0x22, 0xF2, 0xAD, 0xEB, 0x92, 0xF6, + 0xFD, 0xD6, 0x0A, 0xE7, 0x40, 0xDD, 0xDC, 0xE7, 0x77, 0xEC, 0xDD, 0xF2, + 0x6A, 0xDC, 0x98, 0xE3, 0x1C, 0xC6, 0xCC, 0xCF, 0xF0, 0xC3, 0x55, 0xD3, + 0xA2, 0xD0, 0xDA, 0xDC, 0x39, 0xD6, 0xBF, 0xDD, 0xCB, 0xCA, 0x51, 0xE0, + 0x9C, 0xBB, 0x57, 0xD7, 0xBC, 0xB5, 0x6C, 0xC6, 0x6D, 0xB9, 0x8C, 0xC2, + 0x5B, 0xBC, 0x1A, 0xC7, 0x07, 0xBB, 0xDA, 0xC9, 0xD6, 0xC2, 0x6F, 0xD0, + 0xC4, 0xD0, 0x9D, 0xDA, 0x57, 0xD1, 0x83, 0xE1, 0x6C, 0xBF, 0x7D, 0xDD, + 0xEB, 0xBB, 0x38, 0xD8, 0x10, 0xD0, 0x26, 0xD4, 0xC0, 0xE1, 0x8B, 0xCB, + 0x9D, 0xE3, 0x95, 0xC5, 0xF5, 0xD7, 0xF2, 0xC2, 0x9D, 0xD8, 0xB5, 0xC4, + 0x32, 0xDE, 0xCE, 0xC4, 0xE3, 0xE2, 0x67, 0xCD, 0xD4, 0xE3, 0x60, 0xC9, + 0x44, 0xE3, 0xD9, 0xC3, 0x16, 0xED, 0xDB, 0xD9, 0x07, 0xF1, 0x77, 0xE6, + 0xEA, 0xE0, 0x24, 0xDC, 0x68, 0xD6, 0xED, 0xD9, 0x42, 0xD6, 0xC3, 0xE0, + 0x16, 0xDF, 0x5C, 0xF2, 0x0F, 0xF3, 0xB9, 0x0B, 0xBD, 0xED, 0x8E, 0x06, + 0xA1, 0xD8, 0xE0, 0xF0, 0x1B, 0xE6, 0xF5, 0xF7, 0x38, 0x00, 0x63, 0x0B, + 0xFB, 0xEA, 0x8B, 0xFA, 0xB7, 0xD1, 0xF4, 0xE4, 0x36, 0xE5, 0x66, 0xF6, + 0x7A, 0xF5, 0xA6, 0x05, 0x3E, 0xF8, 0xF5, 0xFB, 0x4B, 0x05, 0xE1, 0xF5, + 0xC1, 0x04, 0x7F, 0xE9, 0x32, 0xFA, 0x4D, 0xDD, 0x6F, 0x04, 0xA5, 0xE8, + 0xBB, 0x0B, 0x35, 0xF0, 0x93, 0xF1, 0x4F, 0xE2, 0xBE, 0xD3, 0x5B, 0xD6, + 0xC2, 0xCE, 0x21, 0xDE, 0x2B, 0xDB, 0x2C, 0xE9, 0x16, 0xE8, 0x34, 0xEE, + 0xB3, 0xE8, 0x50, 0xE9, 0xEA, 0xE2, 0xB4, 0xE1, 0x33, 0xE4, 0xD1, 0xE6, + 0x37, 0xEA, 0x0E, 0xF4, 0x07, 0xEF, 0xAA, 0xF5, 0xF6, 0xF9, 0xCB, 0xEB, + 0x2C, 0x04, 0x60, 0xEC, 0xA1, 0x03, 0x0D, 0xEF, 0x45, 0x01, 0xFF, 0xF0, + 0x18, 0xFB, 0xCA, 0xF4, 0xF1, 0xEB, 0xAC, 0xF8, 0x6F, 0xE3, 0x1D, 0xFA, + 0x1A, 0xF2, 0x2D, 0xFC, 0xD9, 0xF8, 0x1F, 0xFE, 0xF1, 0xE5, 0x1E, 0xED, + 0x1C, 0xDF, 0x27, 0xE3, 0x53, 0xE9, 0xEC, 0xE7, 0xF8, 0xF3, 0x21, 0xE7, + 0x24, 0xED, 0x19, 0xDF, 0xA7, 0xF0, 0x27, 0xE0, 0xB5, 0xF9, 0x0D, 0xE2, + 0xEB, 0xF6, 0x8C, 0xDC, 0xCE, 0xFA, 0x28, 0xD9, 0xDA, 0xF7, 0x00, 0xD4, + 0x82, 0xF1, 0x36, 0xCD, 0x92, 0xFD, 0xC0, 0xD9, 0x5E, 0x04, 0x90, 0xE9, + 0x7E, 0xE5, 0x0E, 0xD6, 0x4D, 0xC7, 0xDF, 0xC2, 0xCA, 0xD9, 0x3E, 0xD9, + 0xCD, 0xF4, 0x79, 0xEB, 0xE6, 0xE8, 0x1E, 0xD7, 0xA9, 0xDB, 0x82, 0xD0, + 0x85, 0xE3, 0x0E, 0xEF, 0x8A, 0xDE, 0x88, 0xF7, 0xC6, 0xD3, 0x84, 0xE4, + 0x8C, 0xD8, 0x15, 0xE8, 0xD7, 0xD5, 0x8F, 0xE6, 0x20, 0xD6, 0x67, 0xE0, + 0xAE, 0xF0, 0x3A, 0xF2, 0x5B, 0x02, 0x39, 0xF4, 0xAB, 0xF5, 0x6C, 0xDF, + 0x43, 0xEF, 0x61, 0xD7, 0xBF, 0xF4, 0x81, 0xD7, 0x47, 0xF4, 0x20, 0xD0, + 0x96, 0xE9, 0x46, 0xCB, 0x7A, 0xDA, 0xEE, 0xCC, 0xBD, 0xDD, 0xCA, 0xD5, + 0xFA, 0xEF, 0xC7, 0xE3, 0x2C, 0xFA, 0xB5, 0xE9, 0xCF, 0xEF, 0xF1, 0xE6, + 0x85, 0xEF, 0x29, 0xED, 0xFD, 0x05, 0x27, 0x02, 0x1F, 0x0A, 0x24, 0x07, + 0x30, 0xFF, 0xF0, 0xF8, 0xE8, 0x02, 0x9D, 0xF9, 0x8B, 0x0B, 0xE0, 0x08, + 0x2D, 0x0D, 0x86, 0x0E, 0x14, 0x10, 0x35, 0x0E, 0x96, 0x06, 0x5C, 0x07, + 0x86, 0xFE, 0x8B, 0x03, 0x5D, 0x0D, 0x3F, 0x18, 0xE4, 0x12, 0x38, 0x29, + 0x54, 0x0D, 0xCD, 0x1D, 0xC3, 0x05, 0x3C, 0x0F, 0xFD, 0x03, 0xEF, 0x15, + 0xA9, 0x0C, 0xF4, 0x18, 0xA2, 0x0D, 0x9A, 0x0B, 0xB4, 0x0A, 0x60, 0x02, + 0xD4, 0x12, 0x6F, 0x01, 0x62, 0x1B, 0x6E, 0xFE, 0x0D, 0x22, 0x0E, 0x0F, + 0xE0, 0x1C, 0x60, 0x18, 0x3F, 0x06, 0x1E, 0x00, 0x6C, 0x04, 0x9C, 0x01, + 0xA4, 0x23, 0x37, 0x29, 0x04, 0x29, 0x4F, 0x2E, 0x2F, 0x0D, 0xF1, 0x04, + 0x12, 0x06, 0xA7, 0xF3, 0x64, 0x1B, 0x7C, 0x00, 0xBF, 0x27, 0x1F, 0x05, + 0x84, 0x24, 0x4D, 0x0A, 0x1E, 0x1E, 0x1C, 0x06, 0xB0, 0x0A, 0x76, 0xE9, + 0x1F, 0x05, 0x09, 0xE6, 0x85, 0x0F, 0x91, 0xFD, 0xC9, 0x00, 0xE6, 0xFE, + 0x2C, 0xF1, 0x5C, 0xF6, 0xFA, 0xF2, 0x1D, 0xFA, 0x51, 0xF2, 0xBF, 0xFA, + 0xFC, 0xF2, 0xD7, 0xFC, 0xA0, 0xEF, 0xCD, 0xFE, 0xC6, 0xE8, 0x71, 0xED, + 0x84, 0xEE, 0xCC, 0xE5, 0xC1, 0xFB, 0x51, 0xF3, 0xE2, 0xF5, 0x77, 0xF0, + 0x0F, 0xE7, 0x81, 0xDD, 0xC4, 0xE4, 0xB7, 0xD9, 0xBA, 0xE1, 0xDD, 0xE2, + 0xD6, 0xD9, 0x9F, 0xD6, 0x7F, 0xDE, 0x1D, 0xD1, 0x3E, 0xEC, 0x40, 0xE2, + 0xDA, 0xE5, 0x1E, 0xDD, 0xF3, 0xD7, 0xEB, 0xCD, 0xCF, 0xE6, 0xA6, 0xD8, + 0xA4, 0xEF, 0x9D, 0xE5, 0xD8, 0xE0, 0x74, 0xE4, 0x2C, 0xDA, 0x8D, 0xE5, + 0x57, 0xE4, 0xC9, 0xEE, 0x51, 0xEC, 0xA9, 0xF5, 0x3A, 0xE5, 0xAE, 0xF8, + 0x87, 0xDE, 0x4E, 0xF8, 0x11, 0xD9, 0x60, 0xF0, 0x78, 0xDD, 0xEB, 0xEA, + 0xEE, 0xEF, 0x50, 0xED, 0xE9, 0xF0, 0xDE, 0xEC, 0xF0, 0xEA, 0x17, 0xE5, + 0xA8, 0x01, 0x20, 0xFA, 0x6C, 0x14, 0xB4, 0x0F, 0x6A, 0x0C, 0xEC, 0xFA, + 0xBA, 0x0E, 0x2C, 0xF0, 0x66, 0x2C, 0x5D, 0x11, 0xA7, 0x2A, 0x46, 0x1F, + 0x14, 0x11, 0xD8, 0x05, 0x49, 0x1A, 0xF8, 0x06, 0x8C, 0x29, 0x8D, 0x1C, + 0x1E, 0x1F, 0xF4, 0x1F, 0xD8, 0x21, 0xD8, 0x2A, 0xB0, 0x2D, 0x9E, 0x36, + 0x92, 0x1C, 0x0D, 0x28, 0x5F, 0x0E, 0x02, 0x21, 0x3E, 0x24, 0x77, 0x2F, + 0xE3, 0x31, 0xD4, 0x31, 0x7A, 0x28, 0xCB, 0x2A, 0x1E, 0x20, 0x07, 0x23, + 0x7A, 0x18, 0x51, 0x1C, 0xFB, 0x19, 0xC9, 0x21, 0x18, 0x26, 0x7F, 0x27, + 0x89, 0x21, 0xFE, 0x18, 0xCB, 0x17, 0x22, 0x0D, 0x75, 0x20, 0x07, 0x18, + 0x92, 0x24, 0xE6, 0x1F, 0xAC, 0x18, 0x2E, 0x1C, 0xFD, 0x14, 0xA2, 0x1E, + 0xF2, 0x19, 0x5B, 0x22, 0x4D, 0x1D, 0xA0, 0x1E, 0x75, 0x2A, 0xC7, 0x1D, + 0x6D, 0x2C, 0xA3, 0x1A, 0x68, 0x18, 0xB1, 0x16, 0xAB, 0x18, 0xF6, 0x1E, + 0x28, 0x30, 0x5C, 0x2B, 0x8F, 0x32, 0xF2, 0x1F, 0x46, 0x2B, 0x9B, 0x1F, + 0x7E, 0x24, 0x91, 0x30, 0x4F, 0x24, 0x5C, 0x2D, 0xFD, 0x26, 0x1B, 0x1B, + 0x0E, 0x29, 0x97, 0x1A, 0x60, 0x2B, 0xF1, 0x2F, 0x74, 0x26, 0x97, 0x30, + 0x0B, 0x29, 0xE9, 0x26, 0xBC, 0x33, 0x34, 0x2D, 0x85, 0x2F, 0x64, 0x34, + 0xD3, 0x28, 0x23, 0x42, 0x67, 0x43, 0x25, 0x5F, 0x11, 0x4A, 0x20, 0x4E, + 0x24, 0x28, 0x9D, 0x21, 0x5A, 0x28, 0x40, 0x29, 0x10, 0x42, 0xE8, 0x46, + 0x05, 0x33, 0x55, 0x32, 0xE2, 0x14, 0xBF, 0x0F, 0x0A, 0x1A, 0x73, 0x1C, + 0x86, 0x2B, 0x6A, 0x2C, 0xE9, 0x36, 0x95, 0x27, 0xBA, 0x44, 0x88, 0x21, + 0xB0, 0x37, 0x33, 0x1B, 0xF3, 0x1C, 0x11, 0x1B, 0x76, 0x18, 0x9F, 0x26, + 0x47, 0x1A, 0x8B, 0x27, 0x5E, 0x14, 0x54, 0x15, 0xAE, 0x05, 0x83, 0x0B, + 0x9E, 0xF6, 0x6B, 0x14, 0x2A, 0xF4, 0x4A, 0x1B, 0xAA, 0xF9, 0xD5, 0x1B, + 0x2E, 0xF5, 0xFD, 0x1B, 0xDD, 0xE7, 0xA8, 0x17, 0x01, 0xF2, 0x93, 0x18, + 0xC6, 0x11, 0xBA, 0x21, 0x5F, 0x21, 0x8F, 0x1E, 0x98, 0x0E, 0xF2, 0x0C, + 0xB1, 0xFF, 0x51, 0x12, 0x32, 0x08, 0x13, 0x22, 0x6B, 0x15, 0xD8, 0x1C, + 0x9E, 0x1E, 0x33, 0x12, 0x1A, 0x1D, 0xBA, 0x0F, 0x82, 0x0B, 0xCE, 0x07, + 0xAD, 0x04, 0x16, 0x03, 0x23, 0x1A, 0x59, 0x0D, 0x5B, 0x16, 0xFF, 0x09, + 0xF0, 0x07, 0x66, 0x08, 0x09, 0x0E, 0x32, 0x10, 0xA6, 0x20, 0xC7, 0x1B, + 0x08, 0x2E, 0x14, 0x22, 0xDB, 0x30, 0xDE, 0x23, 0x51, 0x31, 0xB9, 0x27, + 0xF0, 0x29, 0xBB, 0x21, 0xA5, 0x21, 0x0F, 0x17, 0x6B, 0x1F, 0x84, 0x1A, + 0xEB, 0x0D, 0x19, 0x1B, 0x5B, 0xFF, 0xAE, 0x12, 0xF6, 0x12, 0x9A, 0x21, + 0x3C, 0x16, 0x61, 0x22, 0x35, 0xFF, 0x88, 0x04, 0xE6, 0x0A, 0xCE, 0x09, + 0xF5, 0x27, 0x04, 0x25, 0xA6, 0x15, 0x47, 0x1B, 0xEA, 0xF5, 0x8D, 0x08, + 0xC9, 0xFA, 0x59, 0x17, 0xD2, 0x03, 0x6B, 0x24, 0x17, 0x07, 0x7B, 0x21, + 0x9C, 0x0D, 0xAC, 0x1C, 0x8A, 0xF9, 0xFB, 0x00, 0xFA, 0xE4, 0x31, 0xEF, + 0xE5, 0xF4, 0x7F, 0x00, 0x2C, 0x01, 0x8F, 0x03, 0xB5, 0xFD, 0x28, 0xFC, + 0x6E, 0x00, 0xEC, 0xFB, 0xDD, 0xFA, 0xB3, 0xF0, 0x56, 0xEE, 0x88, 0xEC, + 0x55, 0xF1, 0x71, 0xF9, 0x4B, 0xEF, 0xA7, 0xFD, 0xBC, 0xDF, 0x0D, 0xF5, + 0x48, 0xED, 0xEF, 0xFE, 0x88, 0x06, 0xBB, 0x0B, 0xD0, 0xF9, 0xAC, 0xF9, + 0x80, 0xE1, 0x7D, 0xE7, 0x60, 0xEB, 0x6B, 0xF9, 0xAA, 0xF5, 0x0F, 0x11, + 0x30, 0xF1, 0x75, 0x0F, 0x36, 0xFC, 0xFF, 0x0B, 0xE7, 0x09, 0x0A, 0x12, + 0x21, 0x06, 0x6F, 0x09, 0x0C, 0x05, 0x81, 0x03, 0x05, 0x0C, 0x2C, 0x0B, + 0xDC, 0xFF, 0x9A, 0x02, 0x21, 0xFA, 0xD0, 0xFD, 0xE6, 0x03, 0x5D, 0xFB, + 0x24, 0x02, 0x97, 0xE7, 0x62, 0xFA, 0x55, 0xD9, 0x3E, 0x01, 0xB1, 0xE9, + 0x12, 0x08, 0x76, 0xF9, 0x06, 0xFE, 0xA2, 0xEF, 0xE0, 0xF4, 0x6C, 0xE9, + 0x7B, 0xFD, 0x90, 0xF8, 0x78, 0x00, 0x07, 0xFE, 0x47, 0xFF, 0x83, 0xFE, + 0x23, 0x0D, 0x05, 0x10, 0x19, 0x07, 0x14, 0x0E, 0xB8, 0xF4, 0x59, 0x01, + 0xDA, 0x05, 0x7C, 0x16, 0x36, 0x13, 0x8F, 0x2B, 0x78, 0xF5, 0xAB, 0x0E, + 0x20, 0xE3, 0x79, 0xF7, 0x12, 0xF8, 0xF8, 0x0D, 0xB4, 0xF8, 0xEF, 0x11, + 0x53, 0xEF, 0xD3, 0x00, 0x00, 0xFB, 0x7F, 0xFC, 0x88, 0xF3, 0x67, 0xF0, + 0xC2, 0xE9, 0xD9, 0xE9, 0x98, 0xF1, 0xAB, 0xF8, 0xF0, 0xF0, 0x5D, 0xFB, + 0x9C, 0xEB, 0x77, 0xED, 0x68, 0xEA, 0x45, 0xEB, 0x6E, 0xED, 0xFB, 0xED, + 0x82, 0xF3, 0xE5, 0xEA, 0x1F, 0xEF, 0xAF, 0xE8, 0xDB, 0xE3, 0xCB, 0xE6, + 0xE7, 0xDE, 0x6F, 0xE3, 0x19, 0xEA, 0x95, 0xE9, 0xDB, 0xEC, 0xFD, 0xE9, + 0xAB, 0xDB, 0x9A, 0xD7, 0x5D, 0xDC, 0x41, 0xCF, 0x64, 0xF6, 0xB5, 0xDB, + 0x65, 0x04, 0x1C, 0xE8, 0x13, 0xFC, 0x18, 0xEF, 0x4C, 0xF5, 0x5F, 0xED, + 0x46, 0xE9, 0xF5, 0xDB, 0xCD, 0xE1, 0x4B, 0xD6, 0x86, 0xF1, 0xEC, 0xEC, + 0x10, 0xFA, 0x45, 0xFD, 0xB2, 0xDC, 0x0D, 0xEC, 0xBE, 0xD1, 0x6D, 0xE4, + 0xAD, 0xE0, 0x3B, 0xF3, 0x29, 0xE8, 0x4B, 0xFB, 0x1A, 0xE6, 0xF0, 0xF7, + 0xDC, 0xE4, 0x9A, 0xF7, 0x4C, 0xF6, 0x24, 0x05, 0xDC, 0xFD, 0x67, 0x05, + 0xE3, 0xF8, 0xC1, 0xF0, 0xCA, 0x00, 0x39, 0xEE, 0x33, 0x00, 0xC3, 0xE7, + 0x92, 0x01, 0x7E, 0xE0, 0x30, 0x15, 0x56, 0xF5, 0x23, 0x06, 0x55, 0xEE, + 0x24, 0xE2, 0x64, 0xD4, 0x5E, 0xEF, 0x20, 0xE5, 0x21, 0x0D, 0x1D, 0x01, + 0x4F, 0xF8, 0xC1, 0xF3, 0xA8, 0xDC, 0x72, 0xE7, 0x4D, 0xE5, 0x41, 0xFB, + 0x2D, 0xEA, 0x02, 0x05, 0x4A, 0xE7, 0x3C, 0x08, 0x01, 0xF5, 0x92, 0x12, + 0x7A, 0xF3, 0x83, 0x08, 0x3F, 0xE1, 0x7E, 0xF9, 0xF2, 0xEF, 0x5C, 0x08, + 0x77, 0xF7, 0x0E, 0x11, 0x67, 0xDA, 0x31, 0x01, 0xE1, 0xC9, 0x25, 0xEC, + 0xFB, 0xD2, 0xD9, 0xDB, 0xAD, 0xDF, 0x29, 0xDA, 0x62, 0xDC, 0x35, 0xDA, + 0xCD, 0xD9, 0xDC, 0xD5, 0xCF, 0xDE, 0x98, 0xCA, 0x5F, 0xE8, 0xB1, 0xCD, + 0x1C, 0xF2, 0xF8, 0xDE, 0x19, 0xE7, 0x0E, 0xD6, 0x13, 0xDA, 0x4C, 0xC7, + 0x6B, 0xE7, 0x00, 0xCD, 0x5A, 0xF6, 0x63, 0xD4, 0xD3, 0xEF, 0x93, 0xD3, + 0x51, 0xF2, 0xF4, 0xDC, 0x9E, 0xF7, 0xE2, 0xD7, 0x3D, 0xEF, 0x05, 0xCC, + 0x28, 0xEC, 0x28, 0xE0, 0x97, 0xF1, 0xA7, 0xEA, 0x6B, 0xE9, 0x45, 0xD4, + 0x9A, 0xE4, 0xC2, 0xCE, 0xFD, 0xF6, 0xDC, 0xEB, 0xD9, 0x00, 0xB9, 0xFF, + 0xB3, 0xEF, 0xC1, 0xF2, 0x48, 0xDA, 0x16, 0xE1, 0xD2, 0xD8, 0xCA, 0xE5, + 0x4C, 0xDC, 0x63, 0xF6, 0xBE, 0xCE, 0xEC, 0xEF, 0xF4, 0xC8, 0x0A, 0xDA, + 0xA5, 0xD6, 0x61, 0xD7, 0xB6, 0xDC, 0xE6, 0xDB, 0x15, 0xE9, 0x35, 0xEA, + 0xAC, 0xEB, 0xEE, 0xED, 0x86, 0xD4, 0x68, 0xD2, 0x11, 0xD8, 0xCA, 0xCC, + 0x6C, 0xF5, 0xB6, 0xE7, 0xB0, 0xF1, 0xCC, 0xDF, 0x30, 0xDB, 0x29, 0xC1, + 0x76, 0xE0, 0x2F, 0xC2, 0x08, 0xE8, 0xCC, 0xCA, 0xB7, 0xE3, 0x09, 0xCA, + 0x45, 0xE9, 0xA0, 0xD2, 0x4A, 0xE1, 0x2B, 0xC8, 0xA7, 0xC5, 0xB7, 0xAB, + 0xD2, 0xC7, 0x08, 0xBE, 0xF7, 0xD9, 0x9C, 0xDB, 0xF3, 0xC9, 0x59, 0xCC, + 0xE1, 0xB8, 0x7D, 0xC2, 0x02, 0xC0, 0xC6, 0xCE, 0x8A, 0xC6, 0xC8, 0xD5, + 0x73, 0xCA, 0xE4, 0xD9, 0x6A, 0xC4, 0x7D, 0xD9, 0x40, 0xB7, 0x0D, 0xD4, + 0x62, 0xC6, 0x1C, 0xD8, 0x85, 0xE8, 0xFC, 0xED, 0x87, 0xEB, 0xBA, 0xEE, + 0x23, 0xD3, 0xFE, 0xCF, 0xBA, 0xD2, 0xFB, 0xC6, 0xEE, 0xDE, 0xD8, 0xD2, + 0x74, 0xDB, 0x2E, 0xCE, 0x90, 0xE6, 0x66, 0xCB, 0xBC, 0xF1, 0x4E, 0xCD, + 0x60, 0xE8, 0x1F, 0xCB, 0x77, 0xEB, 0xF9, 0xE0, 0x72, 0xF9, 0xA3, 0xFD, + 0xB8, 0xEF, 0xB8, 0xF4, 0x96, 0xE2, 0xEA, 0xE4, 0x4A, 0xF8, 0x1E, 0xF6, + 0x05, 0x11, 0x9C, 0xFF, 0x66, 0x12, 0xAB, 0xFA, 0x30, 0x02, 0xB5, 0xF6, + 0xC6, 0xFA, 0x41, 0x01, 0xE8, 0x07, 0x5B, 0x10, 0x9C, 0x0D, 0xD3, 0x0E, + 0xE3, 0x0C, 0xF4, 0x11, 0x49, 0x13, 0x1B, 0x1C, 0x66, 0x10, 0xE8, 0x16, + 0x1E, 0x1B, 0xF7, 0x1A, 0xB9, 0x36, 0x54, 0x2E, 0x2C, 0x22, 0xAF, 0x1A, + 0xB8, 0x03, 0x8D, 0x05, 0xB8, 0x1B, 0x8E, 0x2A, 0x9E, 0x2E, 0xAE, 0x45, + 0x1F, 0x19, 0x9B, 0x25, 0xE1, 0x13, 0x60, 0x10, 0x02, 0x2C, 0x94, 0x24, + 0xF1, 0x35, 0x54, 0x2F, 0x2E, 0x39, 0xC3, 0x2C, 0xD4, 0x44, 0x13, 0x30, + 0x84, 0x39, 0xCE, 0x1F, 0x47, 0x2B, 0xB3, 0x10, 0x6A, 0x36, 0x3F, 0x19, + 0xA0, 0x3D, 0xD8, 0x13, 0x1A, 0x26, 0xD8, 0x00, 0x1E, 0x15, 0xE8, 0x07, + 0x28, 0x1F, 0xEC, 0x19, 0xA7, 0x1D, 0xE4, 0x1B, 0x09, 0x17, 0x95, 0x1D, + 0x99, 0x11, 0xA7, 0x1B, 0x80, 0x06, 0x84, 0x17, 0x9A, 0x10, 0xED, 0x26, + 0xE8, 0x1C, 0x77, 0x2C, 0x06, 0x0B, 0x21, 0x17, 0x46, 0xFC, 0xCB, 0x18, + 0xCD, 0x06, 0x62, 0x2E, 0xF2, 0x13, 0x0B, 0x30, 0x79, 0x13, 0x59, 0x27, + 0x7B, 0x0E, 0x83, 0x20, 0xB3, 0x07, 0x42, 0x15, 0xA0, 0x07, 0xB5, 0x11, + 0x2F, 0x11, 0xD2, 0x1C, 0x5A, 0x0B, 0x10, 0x0F, 0x1B, 0xFA, 0x96, 0xEA, + 0xA2, 0x0C, 0xFB, 0xF3, 0xCC, 0x29, 0xFD, 0x11, 0xA0, 0x20, 0xD5, 0x0E, + 0xD1, 0x0D, 0x5C, 0x06, 0xA0, 0x0E, 0x6B, 0x0C, 0x00, 0x1E, 0x14, 0x17, + 0x8D, 0x2C, 0x7B, 0x1E, 0xFF, 0x30, 0xB4, 0x21, 0xAE, 0x29, 0x9E, 0x21, + 0x21, 0x22, 0x7B, 0x1E, 0x92, 0x25, 0xA2, 0x21, 0x0B, 0x2E, 0x31, 0x2C, + 0x66, 0x22, 0xFB, 0x25, 0x7F, 0x0E, 0xE5, 0x16, 0x10, 0x24, 0x38, 0x1F, + 0x22, 0x50, 0x21, 0x3E, 0xC9, 0x44, 0x01, 0x3C, 0xAF, 0x16, 0x89, 0x18, + 0x8B, 0x13, 0x6D, 0x15, 0x5E, 0x28, 0x75, 0x28, 0x12, 0x25, 0x9A, 0x29, + 0x3C, 0x1F, 0xE8, 0x28, 0x1A, 0x1C, 0x10, 0x1E, 0x1B, 0x14, 0xAC, 0xFF, + 0xE8, 0x21, 0xAE, 0xFF, 0x70, 0x31, 0x48, 0x15, 0x55, 0x23, 0x28, 0x0C, + 0x56, 0x0F, 0x87, 0x05, 0xC0, 0x08, 0x49, 0x12, 0x37, 0x02, 0x0D, 0x0F, + 0xBD, 0xF9, 0x1F, 0x0C, 0xD8, 0xF3, 0x3D, 0x0F, 0xE9, 0xEE, 0xE0, 0x03, + 0xC3, 0xF5, 0x9D, 0xFB, 0x51, 0xFD, 0x58, 0x06, 0xD9, 0xED, 0x7F, 0x02, + 0xDE, 0xDF, 0x61, 0xEC, 0x17, 0xF0, 0xC3, 0xED, 0x3B, 0x03, 0x34, 0x00, + 0x9B, 0xFF, 0x7B, 0x05, 0xC8, 0xF8, 0x49, 0x01, 0x2F, 0xF3, 0xED, 0xFF, + 0x0B, 0xED, 0x30, 0x03, 0x02, 0xF3, 0x13, 0x0F, 0x07, 0xF6, 0x66, 0x13, + 0xF6, 0xE7, 0x55, 0x02, 0x2D, 0xDF, 0x04, 0xF0, 0x45, 0xF9, 0x51, 0xFA, + 0xFD, 0x0E, 0xEC, 0x08, 0xEE, 0x01, 0x66, 0xFD, 0x12, 0xF3, 0x9E, 0xEF, + 0x3E, 0xFB, 0xA6, 0xF1, 0xCB, 0x04, 0xC8, 0xFA, 0xCD, 0x04, 0x3C, 0xFB, + 0xD4, 0x0A, 0x95, 0xF4, 0x1F, 0x18, 0xA2, 0xF5, 0xED, 0x18, 0x53, 0xF0, + 0x33, 0x15, 0x5B, 0xF9, 0x59, 0x1E, 0xB8, 0x12, 0xE7, 0x14, 0xBE, 0x07, + 0xC5, 0xFF, 0x7A, 0xF3, 0x6A, 0x12, 0xF8, 0x09, 0x29, 0x2E, 0x77, 0x2A, + 0x6A, 0x18, 0x8D, 0x19, 0x58, 0xF9, 0xF9, 0x02, 0xD9, 0x08, 0x56, 0x19, + 0x0D, 0x1B, 0x19, 0x2F, 0xD8, 0x0A, 0x09, 0x2C, 0xDB, 0x06, 0x65, 0x33, + 0x9F, 0x00, 0xD3, 0x30, 0xF9, 0xF4, 0x49, 0x1E, 0x7A, 0x06, 0x1F, 0x26, + 0x17, 0x13, 0x4C, 0x27, 0xD7, 0x04, 0xE5, 0x0C, 0xBF, 0x02, 0xD3, 0x04, + 0x2D, 0x0A, 0x05, 0x0D, 0x06, 0x02, 0x95, 0x0A, 0x06, 0xFD, 0x95, 0x0A, + 0xF5, 0xFB, 0x43, 0x05, 0x70, 0xFE, 0x74, 0xF3, 0x9D, 0x0E, 0x90, 0xFC, + 0xAA, 0x14, 0x39, 0x0B, 0xEC, 0xF9, 0xF0, 0xF9, 0x75, 0xE9, 0xC6, 0xF2, + 0xF3, 0xFA, 0xEB, 0x02, 0x81, 0x02, 0xCF, 0x05, 0x53, 0x03, 0x02, 0x04, + 0x94, 0x10, 0x07, 0x12, 0x43, 0x11, 0xC9, 0x09, 0xF7, 0x07, 0xC1, 0xF3, + 0xF7, 0x0B, 0x4D, 0xF9, 0x58, 0x14, 0x43, 0x05, 0x8C, 0x07, 0xA4, 0x01, + 0xF8, 0xFD, 0x21, 0x05, 0x26, 0x08, 0xD3, 0x18, 0xA6, 0x03, 0x66, 0x17, + 0x4A, 0xFB, 0x3D, 0x08, 0x34, 0xFE, 0xFA, 0xFB, 0xF8, 0x03, 0x8D, 0xFD, + 0xD5, 0x07, 0x69, 0x11, 0x41, 0x09, 0xE4, 0x19, 0x40, 0x05, 0xAB, 0x10, + 0xE8, 0x06, 0x62, 0x0D, 0xF2, 0x0B, 0x68, 0x10, 0xAF, 0x13, 0xE0, 0x17, + 0x78, 0x26, 0xC0, 0x24, 0x1A, 0x20, 0xD9, 0x18, 0xDB, 0x05, 0x0E, 0x07, + 0x0D, 0x16, 0x0D, 0x20, 0xA2, 0x2F, 0x5F, 0x2F, 0x08, 0x11, 0xB3, 0x08, + 0x15, 0xFB, 0xAE, 0xFB, 0xD3, 0x14, 0xAC, 0x21, 0x9C, 0x1A, 0x98, 0x2A, + 0xBF, 0x10, 0xBF, 0x1C, 0xAA, 0x18, 0x22, 0x26, 0xFB, 0x0A, 0x1F, 0x22, + 0x67, 0xF6, 0x1D, 0x1B, 0x5D, 0x07, 0x1C, 0x30, 0x81, 0x17, 0xD9, 0x38, + 0xDA, 0x05, 0xCB, 0x21, 0xC3, 0xF9, 0x6D, 0x18, 0xD6, 0x00, 0x06, 0x23, + 0x12, 0x04, 0x6C, 0x20, 0xE5, 0x00, 0x72, 0x14, 0x81, 0x02, 0x0E, 0x05, + 0x1B, 0x0E, 0x39, 0xFE, 0x2E, 0x20, 0xA8, 0x10, 0x95, 0x24, 0x9E, 0x12, + 0x85, 0x17, 0x03, 0xFE, 0x67, 0x18, 0x0B, 0x03, 0xE8, 0x1F, 0xC5, 0x11, + 0xC1, 0x1C, 0xC0, 0x0D, 0xB3, 0x19, 0xC7, 0x07, 0x7F, 0x16, 0xE1, 0x10, + 0xD8, 0x09, 0x19, 0x14, 0x32, 0x09, 0xD9, 0x10, 0x76, 0x1C, 0xDE, 0x18, + 0xB5, 0x22, 0x0C, 0x1F, 0x6B, 0x11, 0x65, 0x1B, 0x39, 0x0A, 0x08, 0x1C, + 0x29, 0x11, 0xE7, 0x1F, 0x50, 0x0A, 0x3A, 0x1B, 0xE6, 0x09, 0x27, 0x1E, + 0x80, 0x0E, 0xDA, 0x1D, 0x40, 0x0F, 0xA6, 0x0F, 0xB3, 0x1A, 0xB6, 0x0A, + 0xBE, 0x1B, 0x38, 0x0F, 0x67, 0x02, 0xE5, 0x04, 0x1A, 0xF8, 0x2F, 0x02, + 0x0E, 0xF8, 0x2B, 0x00, 0x5B, 0xF3, 0xD1, 0xF7, 0xE9, 0xF8, 0xFE, 0x06, + 0x7B, 0xF1, 0xF9, 0x0C, 0xEB, 0xDF, 0xC1, 0xFB, 0xFC, 0xF4, 0xA4, 0x08, + 0x84, 0x0F, 0x53, 0x1D, 0xBB, 0xF2, 0x4E, 0x06, 0xA2, 0xE3, 0xEA, 0xF5, + 0x70, 0x03, 0x6E, 0x03, 0x95, 0x05, 0xE9, 0xF8, 0x40, 0xF0, 0xC3, 0xE8, + 0x7C, 0xF6, 0x5C, 0xF4, 0x1A, 0xF0, 0x67, 0xE7, 0xD2, 0xCE, 0x50, 0xC8, + 0xCE, 0xCA, 0x89, 0xD0, 0x67, 0xDA, 0x80, 0xE6, 0xB4, 0xCC, 0x4C, 0xD5, + 0x13, 0xC7, 0x8B, 0xC0, 0xAD, 0xE2, 0x99, 0xD4, 0x6E, 0xEE, 0xEA, 0xEE, + 0x59, 0xDF, 0xC0, 0xE7, 0x14, 0xCD, 0x4F, 0xCE, 0xD5, 0xC4, 0xAC, 0xC4, + 0x42, 0xCD, 0x0C, 0xCC, 0x94, 0xD9, 0x6A, 0xD1, 0xFC, 0xDA, 0xE2, 0xCC, + 0x12, 0xE2, 0x81, 0xCB, 0x28, 0xE5, 0x54, 0xC9, 0x95, 0xD9, 0x20, 0xC7, + 0xB5, 0xE0, 0x38, 0xD5, 0x64, 0xF2, 0x91, 0xE3, 0xD5, 0xEF, 0x4B, 0xDB, + 0xB7, 0xE8, 0xE1, 0xD8, 0x7E, 0xE9, 0xB4, 0xEC, 0x23, 0xE1, 0x38, 0xF0, + 0x59, 0xD2, 0xC2, 0xDA, 0x48, 0xD4, 0x38, 0xD4, 0xD5, 0xE1, 0xBF, 0xE3, + 0xDB, 0xDF, 0xB7, 0xE7, 0x4A, 0xD5, 0xE6, 0xE8, 0xD0, 0xCD, 0xA7, 0xE8, + 0xE4, 0xD2, 0x1A, 0xEA, 0x37, 0xEA, 0xF1, 0x01, 0xFE, 0xF5, 0xE9, 0x0E, + 0x07, 0xEC, 0x8F, 0xFE, 0x9D, 0xEC, 0xD5, 0xFD, 0x10, 0xF1, 0xD4, 0xFD, + 0x50, 0xF2, 0xF9, 0xF0, 0x79, 0xFC, 0x17, 0xF5, 0xF0, 0xF3, 0x6A, 0xE6, + 0xCB, 0xD8, 0x82, 0xCB, 0x6B, 0xE3, 0xC2, 0xE2, 0xFE, 0xFF, 0xF6, 0xFE, + 0xA2, 0xEB, 0xB5, 0xDF, 0x35, 0xD9, 0x91, 0xC5, 0x21, 0xF9, 0xE8, 0xE0, + 0xF5, 0x0A, 0xC3, 0xF2, 0x8B, 0x06, 0x62, 0xF2, 0x71, 0x16, 0xCD, 0x00, + 0x8E, 0x11, 0x13, 0xF9, 0xD4, 0xF6, 0x01, 0xE9, 0x85, 0xFD, 0xD4, 0xF8, + 0x27, 0x09, 0x67, 0x05, 0xE5, 0xF0, 0x24, 0xF3, 0x9A, 0xDB, 0x5F, 0xE6, + 0x34, 0xDF, 0x9C, 0xF6, 0x17, 0xEB, 0xE2, 0x02, 0xE0, 0xED, 0x5F, 0xF3, + 0x0A, 0xE2, 0x58, 0xE2, 0x75, 0xE3, 0x4F, 0xE3, 0xA6, 0x01, 0x80, 0xF1, + 0x6B, 0x0C, 0x81, 0xFA, 0xAC, 0xF5, 0x3C, 0xF1, 0xC1, 0xEC, 0xB5, 0xEC, + 0x26, 0xF2, 0xC8, 0xEC, 0xCB, 0xFA, 0xFE, 0xEC, 0x69, 0x04, 0x64, 0xF5, + 0x1A, 0xFE, 0x31, 0xF6, 0xFD, 0xEC, 0x63, 0xEA, 0x7F, 0xEF, 0x8D, 0xE7, + 0x80, 0xFF, 0x9F, 0xF6, 0x6D, 0x06, 0x8C, 0x01, 0x8A, 0x04, 0x6A, 0xFE, + 0x69, 0xFA, 0xF6, 0xF4, 0xB1, 0xFE, 0x6E, 0xF4, 0x68, 0x0E, 0x3A, 0x02, + 0xC1, 0x08, 0xFA, 0x05, 0x1B, 0xF6, 0xD8, 0xF1, 0xFD, 0xF5, 0xAF, 0xE7, + 0xE4, 0x00, 0x35, 0xFA, 0x77, 0xFD, 0x7B, 0x01, 0x95, 0xEE, 0x66, 0xF1, + 0x2D, 0xF4, 0xF3, 0xF8, 0xA9, 0x01, 0x82, 0x0B, 0x8D, 0x07, 0x93, 0x11, + 0x96, 0x16, 0xCE, 0x1E, 0x8E, 0x11, 0xA6, 0x1C, 0x5A, 0xF0, 0x6B, 0x05, + 0xCC, 0xF3, 0x78, 0x0B, 0x80, 0x15, 0xBE, 0x1F, 0x9B, 0x08, 0x79, 0x06, + 0x8A, 0xEC, 0x36, 0xE5, 0xB6, 0xF8, 0x89, 0xEE, 0x68, 0x0B, 0x27, 0xFF, + 0xFC, 0x05, 0xD3, 0xF8, 0x4F, 0x01, 0xEE, 0xF0, 0xCC, 0x01, 0x86, 0xEC, + 0x87, 0xFD, 0x71, 0xE4, 0x05, 0x05, 0xA1, 0xEC, 0xFA, 0x0D, 0x5D, 0xFC, + 0x3B, 0x04, 0xDF, 0xF2, 0x7C, 0xF3, 0x85, 0xDB, 0x7B, 0xE5, 0x42, 0xD3, + 0x0D, 0xE4, 0x4B, 0xDE, 0x35, 0xE9, 0x31, 0xE4, 0x93, 0xD7, 0x61, 0xDD, + 0x0F, 0xCD, 0x75, 0xDE, 0x49, 0xE5, 0x19, 0xEC, 0xA1, 0xF3, 0xB3, 0xF0, + 0xF4, 0xE7, 0x48, 0xE4, 0x06, 0xE5, 0xB0, 0xE6, 0xCD, 0xED, 0xAF, 0xF4, + 0x7D, 0xEA, 0xE4, 0xF5, 0x72, 0xE9, 0xA2, 0xF2, 0x06, 0xF2, 0x68, 0xE9, + 0x37, 0xF2, 0x1D, 0xDA, 0xD4, 0xF5, 0x62, 0xD4, 0x28, 0xF8, 0x16, 0xD9, + 0xBC, 0xED, 0xE9, 0xD9, 0x75, 0xED, 0xCB, 0xDA, 0x57, 0xEE, 0x44, 0xD9, + 0x35, 0xEE, 0x4C, 0xD7, 0x26, 0xFD, 0xC0, 0xEB, 0x2B, 0x00, 0xF2, 0xF9, + 0x00, 0xF3, 0x10, 0xEB, 0xB0, 0xF6, 0x84, 0xE4, 0x2C, 0x03, 0xC0, 0xF2, + 0x9A, 0x01, 0xD0, 0xF6, 0x58, 0xF9, 0x39, 0xEC, 0x3E, 0xFD, 0xE4, 0xED, + 0x73, 0x02, 0x22, 0xF4, 0xF7, 0xFE, 0xA8, 0xF6, 0x01, 0x09, 0x93, 0x08, + 0x76, 0x09, 0xC9, 0x0E, 0xDA, 0xEB, 0x9C, 0xF1, 0xF4, 0xDE, 0xCD, 0xEF, + 0x2E, 0xF9, 0xDF, 0x1C, 0x1A, 0xFF, 0x55, 0x1D, 0x2E, 0xE7, 0x89, 0xF5, + 0x3B, 0xED, 0x64, 0xF5, 0x6F, 0xFD, 0x56, 0x0A, 0xAC, 0xF5, 0x8F, 0x04, + 0x28, 0xF0, 0x7F, 0xF9, 0xB3, 0xF0, 0xDA, 0xF5, 0x5E, 0xEB, 0x5B, 0xEE, + 0xFD, 0xF1, 0x0F, 0xF4, 0xE0, 0xFD, 0x67, 0xF9, 0xDD, 0xFC, 0x89, 0xED, + 0xCE, 0xF5, 0xA0, 0xDE, 0xA0, 0xF0, 0xB1, 0xD7, 0xF1, 0xF6, 0xF0, 0xDE, + 0xE2, 0x03, 0xDD, 0xF0, 0x45, 0xF6, 0xD2, 0xEB, 0x4C, 0xE4, 0xA5, 0xD9, + 0x86, 0xF0, 0x87, 0xE3, 0xFE, 0xF9, 0x7D, 0xF5, 0xB0, 0xEF, 0x48, 0xF1, + 0x39, 0xEB, 0xC3, 0xEF, 0xD2, 0xE9, 0x1A, 0xFE, 0x1A, 0xEF, 0xE8, 0x09, + 0x35, 0x01, 0x20, 0x11, 0x6D, 0x01, 0x11, 0x0D, 0xF1, 0xFA, 0x0B, 0x02, + 0x3F, 0xFE, 0x4F, 0xFF, 0x4F, 0xFD, 0x2D, 0x0B, 0x45, 0xFB, 0x91, 0x12, + 0xFC, 0x05, 0xB8, 0x06, 0x11, 0x0F, 0x69, 0xFA, 0xD8, 0x0D, 0xEC, 0xF7, + 0x9A, 0x1A, 0x13, 0xFE, 0x25, 0x1F, 0xDE, 0x05, 0x30, 0x12, 0x93, 0x0A, + 0x0D, 0x0C, 0xAB, 0x04, 0x33, 0x10, 0x7B, 0x03, 0x24, 0x16, 0x8A, 0x13, + 0xF6, 0x16, 0x20, 0x1B, 0xDC, 0x0F, 0xCE, 0x10, 0xE0, 0x13, 0xE9, 0x12, + 0x34, 0x1D, 0x60, 0x19, 0xC6, 0x20, 0xB0, 0x1A, 0x16, 0x29, 0xE9, 0x27, + 0xA2, 0x1B, 0xD1, 0x1E, 0xEF, 0x06, 0xC2, 0x03, 0xEA, 0x1A, 0x0A, 0x1C, + 0x6A, 0x2C, 0xDB, 0x3E, 0x41, 0x11, 0xFE, 0x28, 0xB5, 0x01, 0xC7, 0x1B, + 0xC9, 0x0F, 0x06, 0x2D, 0xCF, 0x13, 0xC5, 0x2E, 0xCC, 0x0B, 0xB7, 0x27, + 0x31, 0x0A, 0xF5, 0x25, 0xF7, 0x04, 0xCA, 0x16, 0xFD, 0x02, 0x1D, 0x06, + 0xEC, 0x0D, 0x71, 0x11, 0xF3, 0x10, 0x08, 0x19, 0xD1, 0x08, 0xA9, 0x09, + 0xED, 0xF7, 0x29, 0xFD, 0x91, 0xF4, 0xCA, 0xFD, 0xF4, 0x0C, 0xAE, 0x09, + 0x92, 0x19, 0x80, 0x0C, 0xD3, 0x0A, 0x42, 0xFA, 0x3D, 0x0A, 0xC5, 0xF1, + 0x48, 0x20, 0x8C, 0xFC, 0x59, 0x21, 0xA9, 0xFF, 0x3A, 0x0C, 0x10, 0xFA, + 0x6A, 0x08, 0x95, 0xFF, 0xF8, 0x14, 0x7E, 0x0E, 0xBD, 0x1C, 0xA1, 0x1C, + 0x2E, 0x1A, 0x20, 0x24, 0x54, 0x15, 0xD6, 0x24, 0x9E, 0x14, 0xF4, 0x25, + 0x76, 0x15, 0x42, 0x2D, 0x08, 0x17, 0x1F, 0x3A, 0xA6, 0x19, 0x92, 0x41, + 0x75, 0x14, 0x9A, 0x3E, 0xEE, 0x0E, 0x09, 0x33, 0xF6, 0x1F, 0xC6, 0x35, + 0xB8, 0x34, 0xDC, 0x3F, 0x15, 0x33, 0x92, 0x32, 0x04, 0x2B, 0x79, 0x22, + 0x41, 0x2B, 0x83, 0x21, 0x47, 0x33, 0xFD, 0x2D, 0xF0, 0x3D, 0x0D, 0x35, + 0xD7, 0x39, 0xDC, 0x24, 0xFA, 0x2C, 0x07, 0x13, 0xF4, 0x36, 0xCF, 0x1E, + 0x77, 0x41, 0x80, 0x2E, 0x0A, 0x3F, 0x2E, 0x2B, 0x15, 0x41, 0x59, 0x25, + 0xFE, 0x33, 0xFB, 0x12, 0xE4, 0x28, 0x77, 0x0F, 0x48, 0x3A, 0x83, 0x32, + 0x81, 0x39, 0xB0, 0x34, 0xF9, 0x1E, 0x06, 0x15, 0x33, 0x20, 0x9E, 0x1D, + 0x1B, 0x2A, 0x5E, 0x3E, 0xFA, 0x19, 0x49, 0x42, 0xA1, 0x0D, 0x06, 0x3A, + 0x75, 0x10, 0xA2, 0x3C, 0x78, 0x0B, 0x54, 0x35, 0xA3, 0x03, 0x1B, 0x27, + 0x7D, 0x06, 0xC5, 0x21, 0x87, 0x08, 0x53, 0x11, 0xE4, 0xF9, 0x9F, 0xF4, + 0x51, 0xE5, 0x4F, 0xEA, 0x50, 0xE8, 0x6F, 0xF3, 0xF7, 0xFB, 0x60, 0xF8, + 0xB3, 0xF3, 0xD7, 0xE6, 0xE9, 0xDC, 0x34, 0xDF, 0xA5, 0xE9, 0xD8, 0xF1, + 0x1B, 0xFB, 0x87, 0xF5, 0x13, 0xEE, 0x0A, 0xEC, 0x6E, 0xE5, 0xEE, 0xF1, + 0x7F, 0xE6, 0x2E, 0xFA, 0xDD, 0xE1, 0xB1, 0xF5, 0x02, 0xEA, 0xD2, 0xEE, + 0xEF, 0xF5, 0xA0, 0xE6, 0x2B, 0xEF, 0x7A, 0xDB, 0xD3, 0xE1, 0x06, 0xDB, + 0x37, 0xE7, 0x82, 0xE7, 0x43, 0xF4, 0x1D, 0xEC, 0x3F, 0xF7, 0x63, 0xEB, + 0x20, 0xF4, 0x6B, 0xED, 0x19, 0xEF, 0x43, 0xED, 0xB2, 0xF2, 0x16, 0xFB, + 0x10, 0xF1, 0xD1, 0x05, 0xF9, 0xE5, 0xD7, 0x05, 0x52, 0xE5, 0xBA, 0x06, + 0x0A, 0xF2, 0x09, 0x05, 0x66, 0x01, 0x9F, 0x09, 0x52, 0x03, 0xE0, 0x0E, + 0x41, 0xEF, 0x26, 0x05, 0x58, 0xE5, 0xB6, 0xF9, 0xE2, 0xF7, 0x92, 0x04, + 0xD4, 0x0D, 0x76, 0x13, 0xD9, 0x1D, 0x52, 0x15, 0x58, 0x19, 0xAD, 0x0A, + 0xDE, 0x00, 0x24, 0xF8, 0x68, 0x04, 0x69, 0xFA, 0x7D, 0x20, 0xB6, 0x0E, + 0x37, 0x1B, 0xAC, 0x07, 0xC6, 0x0F, 0x3C, 0xF1, 0x1A, 0x27, 0x80, 0xFD, + 0x41, 0x2C, 0x2F, 0x16, 0xFC, 0x0E, 0x7B, 0x14, 0x94, 0xFD, 0x71, 0x11, + 0x21, 0xFC, 0x3D, 0x19, 0xBF, 0xF6, 0xE7, 0x18, 0x05, 0xF9, 0x4F, 0x17, + 0xA6, 0x03, 0x5C, 0x1E, 0x60, 0x04, 0x73, 0x22, 0x82, 0xFF, 0xDC, 0x19, + 0xBC, 0xFB, 0xCF, 0x0C, 0x54, 0x04, 0x34, 0x0F, 0x41, 0x0F, 0x98, 0x14, + 0xA3, 0x03, 0x2B, 0x00, 0xF6, 0xF8, 0x59, 0xF1, 0x9A, 0xFA, 0x70, 0xFB, + 0x5D, 0xF4, 0xA4, 0xFA, 0x4D, 0xF6, 0xAE, 0xEF, 0x2B, 0x02, 0x23, 0xF6, + 0xA8, 0xFB, 0xA2, 0xF8, 0x53, 0xF5, 0xB6, 0xF3, 0xF3, 0x02, 0xE5, 0x01, + 0xDD, 0x0A, 0xB8, 0x03, 0x43, 0x0A, 0x91, 0xF7, 0x0D, 0x11, 0xA3, 0x01, + 0x6E, 0x15, 0xD1, 0x0B, 0x01, 0x12, 0xD4, 0x05, 0xEC, 0x12, 0xF1, 0x06, + 0x19, 0x12, 0x9D, 0x04, 0x51, 0x09, 0x34, 0xF7, 0xB1, 0x0A, 0xEF, 0xFE, + 0xEF, 0x16, 0xF5, 0x0F, 0xB5, 0x23, 0x01, 0x16, 0x89, 0x1C, 0x2F, 0x19, + 0xEA, 0x0A, 0x89, 0x1A, 0xEB, 0x15, 0x54, 0x21, 0xD3, 0x26, 0x58, 0x2C, + 0xF4, 0x1C, 0xC6, 0x25, 0xEE, 0x10, 0xA4, 0x1F, 0x96, 0x0C, 0xA3, 0x26, + 0xBA, 0x11, 0x55, 0x29, 0x18, 0x21, 0x10, 0x2B, 0x63, 0x13, 0x84, 0x1B, + 0xED, 0xF6, 0xAA, 0x07, 0x22, 0x06, 0xF3, 0x1A, 0xD2, 0x21, 0x5C, 0x32, + 0x51, 0x19, 0xB7, 0x1B, 0xAA, 0x0C, 0x1B, 0x00, 0xDF, 0x1B, 0x6F, 0x0D, + 0x53, 0x31, 0x13, 0x21, 0x04, 0x31, 0x09, 0x21, 0xD7, 0x1C, 0x3D, 0x15, + 0xA5, 0x08, 0x27, 0x01, 0x81, 0x01, 0xBE, 0xF7, 0x96, 0x02, 0xBE, 0xF9, + 0xF6, 0x05, 0x74, 0x01, 0xFB, 0x00, 0xC0, 0x06, 0x41, 0xEB, 0x29, 0xFB, + 0xA1, 0xE5, 0x67, 0xF5, 0x1A, 0xF6, 0xDA, 0x00, 0x5A, 0xF2, 0xCA, 0xFC, + 0xF3, 0xE2, 0x0D, 0xED, 0xEB, 0xE7, 0xB3, 0xF3, 0x92, 0xF2, 0x35, 0xFE, + 0x24, 0xEB, 0x5A, 0xEE, 0x41, 0xE2, 0x38, 0xE2, 0x04, 0xE4, 0x71, 0xE2, + 0x2A, 0xE3, 0xD4, 0xD6, 0x41, 0xE2, 0x41, 0xD3, 0x84, 0xE9, 0x1D, 0xDA, + 0xA8, 0xE8, 0x5B, 0xD2, 0xEE, 0xDB, 0x12, 0xC8, 0x0B, 0xDB, 0x09, 0xCC, + 0xEC, 0xE7, 0x05, 0xD3, 0x86, 0xEB, 0xA3, 0xD2, 0x7F, 0xE7, 0x19, 0xD8, + 0xB5, 0xE8, 0x85, 0xE0, 0xFD, 0xED, 0x52, 0xE1, 0x4B, 0xEF, 0x7E, 0xE2, + 0xC8, 0xED, 0xD8, 0xEB, 0xE8, 0xF0, 0xF0, 0xF8, 0x94, 0xEC, 0x3D, 0xF0, + 0xAC, 0xEA, 0x9C, 0xE9, 0x23, 0xF4, 0x86, 0xFC, 0x0C, 0xF5, 0x28, 0x04, + 0x41, 0xEB, 0xCB, 0xF8, 0xD6, 0xE5, 0x36, 0xFA, 0x7B, 0xE8, 0xDA, 0xFC, + 0x6E, 0xEE, 0x1C, 0xFB, 0xE3, 0xF3, 0x93, 0x05, 0x9F, 0xED, 0x22, 0x00, + 0x45, 0xE2, 0xB7, 0xE6, 0xD8, 0xEE, 0x88, 0xED, 0x35, 0x00, 0x21, 0x06, + 0x10, 0xF5, 0xCE, 0xFC, 0xB7, 0xE1, 0xFE, 0xED, 0xA7, 0xE7, 0x18, 0xF6, + 0x31, 0xFA, 0x01, 0xFD, 0x0D, 0xFC, 0xF4, 0xF7, 0x97, 0xFB, 0xB8, 0xEF, + 0xA5, 0x01, 0xCD, 0xE6, 0x59, 0x00, 0x88, 0xE5, 0xBC, 0xF5, 0xB9, 0xE8, + 0x1C, 0xED, 0x1A, 0xE7, 0x2E, 0xEA, 0x16, 0xE0, 0xAF, 0xDE, 0x89, 0xD0, + 0xA7, 0xD9, 0x13, 0xC6, 0x9F, 0xE6, 0xD0, 0xD4, 0xB1, 0xE7, 0xAF, 0xDC, + 0xC0, 0xD9, 0xBF, 0xD3, 0x54, 0xD5, 0xB9, 0xDB, 0xCA, 0xD0, 0x3C, 0xDF, + 0xA3, 0xC6, 0xEE, 0xD4, 0x14, 0xCF, 0x12, 0xDB, 0xA0, 0xDC, 0x4A, 0xE6, + 0x7F, 0xD9, 0xA8, 0xE7, 0x87, 0xD5, 0x50, 0xE8, 0x6C, 0xDD, 0x33, 0xED, + 0xEA, 0xE5, 0x40, 0xEF, 0x6F, 0xE2, 0xD1, 0xE4, 0x3F, 0xDB, 0x2E, 0xDB, + 0xD5, 0xDF, 0xA6, 0xE2, 0x64, 0xE8, 0x7C, 0xE8, 0xD4, 0xE8, 0x4E, 0xDA, + 0x80, 0xE5, 0xD5, 0xCE, 0x78, 0xE3, 0x8C, 0xD2, 0xF8, 0xE1, 0x3B, 0xDB, + 0xA9, 0xE5, 0xDB, 0xE6, 0x36, 0xF3, 0xB8, 0xED, 0xF1, 0xF3, 0xA7, 0xE5, + 0x13, 0xEF, 0x9F, 0xE6, 0x9D, 0x06, 0xAD, 0xFB, 0xB1, 0x1D, 0x72, 0x04, + 0x7A, 0x12, 0xBC, 0xFB, 0xA7, 0xFE, 0xFA, 0xFD, 0x06, 0xE9, 0xC5, 0x05, + 0x3E, 0xDF, 0x61, 0x09, 0x62, 0xF9, 0xB0, 0x0F, 0xA1, 0x02, 0x64, 0x0A, + 0x58, 0xE8, 0x3E, 0xFA, 0x61, 0xF1, 0x8B, 0x00, 0x33, 0x16, 0xD7, 0x12, + 0xFA, 0x0E, 0x6F, 0x04, 0x54, 0xF1, 0x24, 0xE5, 0x8F, 0xEF, 0x8F, 0xE3, + 0x9B, 0xFE, 0x6D, 0xF7, 0x70, 0x10, 0xC6, 0xFD, 0x75, 0x1A, 0xAF, 0xFA, + 0x4F, 0x0E, 0x26, 0xEA, 0x27, 0xFC, 0x48, 0xCF, 0x0C, 0xF6, 0xC7, 0xCB, + 0x54, 0xF6, 0xAF, 0xE2, 0x3A, 0xF1, 0xED, 0xF3, 0x4E, 0xE2, 0xE8, 0xED, + 0x61, 0xE1, 0x9F, 0xE4, 0x52, 0xF3, 0x29, 0xE7, 0xE7, 0xF6, 0xED, 0xE8, + 0xE0, 0xE4, 0x9A, 0xE0, 0xF6, 0xDC, 0xD4, 0xDF, 0x16, 0xE1, 0xFB, 0xE7, + 0x8F, 0xDE, 0x88, 0xE0, 0xB0, 0xE1, 0xBB, 0xD5, 0xDE, 0xE5, 0xB9, 0xD8, + 0x8D, 0xE2, 0xD8, 0xDA, 0x59, 0xE8, 0xB6, 0xE5, 0x98, 0xED, 0x9C, 0xF8, + 0xBC, 0xE7, 0x8D, 0xF8, 0xAC, 0xE6, 0xDC, 0xF6, 0x70, 0xE6, 0x8A, 0x01, + 0xD1, 0xE3, 0x84, 0x05, 0x0E, 0xEA, 0x32, 0x03, 0xAE, 0xF8, 0x0B, 0x09, + 0x5A, 0x05, 0x8A, 0x0D, 0xCC, 0x0A, 0xFC, 0x00, 0xE1, 0x07, 0x4E, 0xFB, + 0xA5, 0x04, 0x69, 0x01, 0x90, 0x0C, 0x4C, 0x0B, 0x86, 0x16, 0x13, 0x17, + 0x37, 0x1D, 0x7D, 0x1B, 0x07, 0x25, 0xCA, 0x1C, 0x8A, 0x26, 0x49, 0x18, + 0x07, 0x24, 0xED, 0x14, 0xD9, 0x28, 0x67, 0x1A, 0x5D, 0x26, 0x9B, 0x19, + 0x64, 0x1C, 0xA9, 0x12, 0x0B, 0x29, 0xAB, 0x19, 0x7A, 0x37, 0xA7, 0x24, + 0x29, 0x25, 0x4A, 0x17, 0xAB, 0x13, 0x1B, 0x0B, 0xCD, 0x21, 0xF6, 0x17, + 0xC4, 0x2E, 0x42, 0x23, 0x98, 0x22, 0xB3, 0x20, 0x48, 0x12, 0xB5, 0x1D, + 0xEB, 0x14, 0x5E, 0x1D, 0x9B, 0x21, 0xAD, 0x17, 0xD9, 0x2C, 0xD9, 0x10, + 0xE9, 0x31, 0x09, 0x0A, 0x72, 0x25, 0x69, 0x03, 0xA1, 0x14, 0xA4, 0x00, + 0x39, 0x0E, 0x1C, 0xFF, 0xA5, 0x10, 0x61, 0xFF, 0x17, 0x0A, 0x05, 0xF5, + 0x2C, 0xF5, 0x18, 0xDF, 0xFC, 0xE5, 0xB4, 0xDF, 0x55, 0xE0, 0x9B, 0xF5, + 0x1F, 0xDE, 0x0B, 0xFF, 0xE5, 0xD7, 0x16, 0xF8, 0x73, 0xCE, 0xFF, 0xEC, + 0x2F, 0xCE, 0x08, 0xE0, 0xEC, 0xD2, 0x31, 0xDF, 0xDF, 0xD8, 0xDF, 0xEC, + 0xE9, 0xE0, 0x3C, 0xEF, 0x5A, 0xE5, 0x6D, 0xE6, 0x76, 0xE7, 0xDA, 0xE0, + 0x18, 0xE4, 0xA3, 0xDB, 0xD7, 0xDC, 0x2E, 0xDA, 0x2C, 0xDF, 0xE3, 0xE1, + 0x77, 0xE3, 0xF0, 0xE7, 0x6F, 0xDB, 0xDD, 0xEA, 0xB1, 0xD2, 0x2F, 0xEA, + 0xAD, 0xD8, 0x91, 0xE1, 0xF9, 0xE2, 0xE4, 0xDB, 0x09, 0xDF, 0x1F, 0xDB, + 0xCD, 0xD3, 0x91, 0xDD, 0xAC, 0xD7, 0x52, 0xE8, 0x02, 0xE6, 0x5D, 0xE8, + 0xC1, 0xE9, 0x9D, 0xDF, 0x90, 0xEB, 0x6B, 0xE5, 0x3F, 0xFB, 0x49, 0xF0, + 0xFF, 0x07, 0xC1, 0xF8, 0x54, 0x07, 0x5C, 0xFD, 0x93, 0x07, 0x7A, 0xFC, + 0x6A, 0x05, 0x71, 0xFB, 0x4C, 0xFF, 0xE8, 0x02, 0x4F, 0x04, 0xEC, 0x05, + 0x15, 0x09, 0x4B, 0xF8, 0x5F, 0x01, 0xDF, 0xFA, 0x22, 0x01, 0x0B, 0x13, + 0x03, 0x11, 0x95, 0x1D, 0x77, 0x19, 0xE7, 0x15, 0x70, 0x0B, 0x83, 0x0C, + 0x8C, 0x00, 0x56, 0x0C, 0xE2, 0x09, 0xD6, 0x18, 0x6E, 0x15, 0x9B, 0x25, + 0xA0, 0x19, 0x3D, 0x25, 0xC1, 0x16, 0x33, 0x1F, 0x22, 0x07, 0x4A, 0x14, + 0x5B, 0xFB, 0x73, 0x09, 0x9A, 0x05, 0xD1, 0x0A, 0x2D, 0x13, 0x0B, 0x11, + 0x2B, 0x12, 0x49, 0x0B, 0xD1, 0x11, 0x49, 0xFA, 0x3F, 0x18, 0x92, 0xF6, + 0x9A, 0x16, 0x5D, 0xFF, 0x63, 0x0B, 0xFF, 0xFF, 0x4C, 0xFF, 0xE4, 0x00, + 0x88, 0xFC, 0xF8, 0x06, 0x18, 0xFF, 0x04, 0x03, 0xEA, 0xFB, 0x30, 0xFC, + 0xCB, 0xF7, 0xAC, 0x00, 0xCE, 0xF6, 0xD8, 0x08, 0x17, 0xF8, 0xC8, 0x0E, + 0x74, 0x07, 0x65, 0x14, 0xCB, 0x19, 0x2A, 0x17, 0xB2, 0x16, 0xB4, 0x18, + 0x85, 0x0E, 0xFC, 0x16, 0xBE, 0x14, 0x06, 0x1A, 0xA2, 0x18, 0x7F, 0x20, + 0xAA, 0x12, 0x49, 0x1E, 0xCF, 0x0F, 0xC9, 0x17, 0x15, 0x0D, 0xEA, 0x11, + 0x57, 0x0A, 0x7C, 0x11, 0x35, 0x0D, 0x72, 0x10, 0x2F, 0x12, 0x9C, 0x0C, + 0x13, 0x17, 0xEC, 0x0A, 0x9A, 0x1C, 0x9D, 0x10, 0x38, 0x22, 0x4B, 0x1B, + 0x48, 0x2A, 0xAA, 0x25, 0xA8, 0x2E, 0x77, 0x2D, 0x47, 0x2D, 0x09, 0x2E, + 0x23, 0x2B, 0xF6, 0x30, 0x3A, 0x27, 0xF1, 0x33, 0xA5, 0x24, 0x07, 0x33, + 0x07, 0x28, 0xDD, 0x35, 0xD3, 0x27, 0x8D, 0x32, 0xD3, 0x1F, 0xDE, 0x27, + 0xF4, 0x1D, 0x1D, 0x27, 0x62, 0x25, 0xD3, 0x2C, 0xCB, 0x29, 0x40, 0x2A, + 0x41, 0x23, 0xC7, 0x26, 0x12, 0x21, 0x67, 0x2C, 0xFF, 0x2B, 0x70, 0x34, + 0xCF, 0x33, 0x65, 0x36, 0x13, 0x30, 0x6A, 0x3A, 0xB4, 0x1F, 0x86, 0x37, + 0x9A, 0x09, 0x13, 0x27, 0x5B, 0x02, 0xFD, 0x1A, 0x10, 0x0E, 0x4A, 0x18, + 0xCF, 0x12, 0xD9, 0x18, 0xDD, 0x08, 0xDE, 0x0F, 0xBD, 0x09, 0xB3, 0x0A, + 0xF7, 0x15, 0x84, 0x0E, 0xF7, 0x1B, 0x65, 0x03, 0x1F, 0x1C, 0xED, 0xF5, + 0x99, 0x18, 0x1C, 0xF9, 0x98, 0x12, 0xFE, 0xFF, 0x58, 0x10, 0xB2, 0x01, + 0x19, 0x0D, 0x7F, 0xFF, 0x1F, 0x06, 0xAC, 0xF9, 0xAA, 0x02, 0x2B, 0xF6, + 0x8D, 0x03, 0xC7, 0xF9, 0x3C, 0x08, 0x19, 0x01, 0x6C, 0x09, 0xD4, 0x03, + 0x73, 0x04, 0x4D, 0x06, 0x30, 0x08, 0x30, 0x10, 0xE2, 0x0E, 0xBA, 0x15, + 0xA0, 0x07, 0x98, 0x17, 0xC0, 0x05, 0xC4, 0x22, 0x92, 0x0B, 0x9B, 0x2F, + 0x13, 0x08, 0xD6, 0x2D, 0x6A, 0x04, 0x08, 0x21, 0xEE, 0xFF, 0xD7, 0x18, + 0x0B, 0xFB, 0x68, 0x14, 0x7E, 0x02, 0x0B, 0x13, 0x81, 0x0F, 0xBB, 0x16, + 0x4D, 0x10, 0xEF, 0x17, 0x75, 0x0A, 0xDE, 0x13, 0xC6, 0x10, 0x69, 0x10, + 0xE7, 0x1E, 0x65, 0x12, 0x51, 0x22, 0xC0, 0x16, 0xB9, 0x1E, 0x03, 0x1A, + 0x9F, 0x1F, 0x66, 0x19, 0xCF, 0x1D, 0x66, 0x1C, 0xD7, 0x11, 0xCD, 0x20, + 0x6B, 0x07, 0x42, 0x15, 0xF1, 0x0A, 0x11, 0x0C, 0x3C, 0x13, 0x6A, 0x12, + 0x6C, 0x16, 0x29, 0x15, 0xE4, 0x1E, 0x2B, 0x15, 0xB3, 0x24, 0x35, 0x1B, + 0xF4, 0x19, 0xEE, 0x1F, 0x41, 0x14, 0xBB, 0x20, 0x11, 0x15, 0xD2, 0x1E, + 0x3F, 0x0C, 0x99, 0x17, 0xD7, 0x05, 0x94, 0x0B, 0x19, 0x09, 0x4C, 0xFE, + 0x8C, 0x05, 0x64, 0xF3, 0xC8, 0xFB, 0x5F, 0xEC, 0xBE, 0xF3, 0xB8, 0xEB, + 0x3E, 0xF0, 0x1D, 0xF3, 0xF2, 0xF9, 0xA2, 0xFA, 0xF4, 0x07, 0xEE, 0xF8, + 0x1D, 0x12, 0x99, 0xF5, 0xAB, 0x0F, 0x1D, 0xF7, 0xCD, 0xFE, 0xEB, 0xF7, + 0x2E, 0xF5, 0xA4, 0xF7, 0x0A, 0xF6, 0x76, 0xF9, 0x6B, 0xF3, 0x7E, 0xF8, + 0xA1, 0xEF, 0x9E, 0xF6, 0xFC, 0xEF, 0x9B, 0xFD, 0x69, 0xF3, 0x24, 0x02, + 0x95, 0xFA, 0x61, 0x00, 0x03, 0xFF, 0xD0, 0x04, 0x14, 0xFD, 0xBF, 0x07, + 0x32, 0xF9, 0x89, 0x06, 0x60, 0xF7, 0xA0, 0x0E, 0xDD, 0xFB, 0x3B, 0x1A, + 0x97, 0xFF, 0x51, 0x1A, 0xA5, 0xF9, 0xB3, 0x16, 0xBE, 0xF4, 0x75, 0x10, + 0x69, 0xFC, 0xCF, 0x07, 0x00, 0x02, 0x13, 0x06, 0xA4, 0xF3, 0x85, 0x09, + 0x12, 0xEA, 0x50, 0x0D, 0x60, 0xF8, 0x3F, 0x0D, 0x67, 0x0A, 0xD2, 0x08, + 0x7C, 0x10, 0xBB, 0xFC, 0x1C, 0x0C, 0xD7, 0xF8, 0x5D, 0x08, 0xF8, 0xFD, + 0xC3, 0x0A, 0x2A, 0xFA, 0x49, 0x11, 0x39, 0xF5, 0x72, 0x16, 0x40, 0xEE, + 0x76, 0x16, 0x28, 0xE7, 0x80, 0x13, 0x31, 0xE9, 0x7D, 0x15, 0x01, 0xEF, + 0xE7, 0x13, 0x6B, 0xEE, 0x7F, 0xFE, 0xEF, 0xE9, 0x40, 0xEA, 0x93, 0xEA, + 0xEA, 0xEC, 0x31, 0xEE, 0x1C, 0xF4, 0xCB, 0xF3, 0x6D, 0xF0, 0x4C, 0xF9, + 0x48, 0xE8, 0xBA, 0xF8, 0xED, 0xE3, 0x1E, 0xF2, 0xBC, 0xE5, 0xB2, 0xE8, + 0x14, 0xE5, 0x77, 0xE2, 0x46, 0xD9, 0xC6, 0xE2, 0x59, 0xCE, 0x65, 0xDD, + 0x1F, 0xD2, 0x49, 0xD4, 0x09, 0xDB, 0xBE, 0xD3, 0x2F, 0xDC, 0x37, 0xD6, + 0x37, 0xD3, 0xCD, 0xD5, 0xE9, 0xCC, 0x15, 0xD2, 0x67, 0xD3, 0x8B, 0xD0, + 0x2A, 0xDA, 0xD9, 0xD2, 0x4A, 0xD7, 0x2D, 0xD5, 0x34, 0xD2, 0x85, 0xD3, + 0xF3, 0xD7, 0x11, 0xD4, 0xD3, 0xE3, 0x48, 0xDC, 0x38, 0xE5, 0xD9, 0xE3, + 0xA6, 0xDF, 0x2C, 0xE9, 0x7F, 0xDF, 0x60, 0xEE, 0x49, 0xEA, 0x88, 0xF1, + 0x70, 0xF6, 0xB0, 0xF3, 0x52, 0xF6, 0x01, 0xF9, 0x3B, 0xEE, 0xC8, 0x00, + 0xF8, 0xEC, 0x6E, 0x01, 0xF4, 0xFB, 0xB6, 0xFD, 0x90, 0x07, 0x81, 0x05, + 0x09, 0x02, 0x57, 0x0F, 0x25, 0xFB, 0xCC, 0x0C, 0x83, 0x00, 0xC1, 0x0C, + 0xC8, 0x0A, 0x84, 0x11, 0xCA, 0x11, 0x35, 0x15, 0xE6, 0x15, 0x36, 0x1C, + 0x65, 0x19, 0x49, 0x1B, 0x96, 0x1C, 0x45, 0x16, 0x23, 0x17, 0x26, 0x15, + 0xDA, 0x09, 0xCF, 0x12, 0xDE, 0x08, 0xAD, 0x0E, 0x07, 0x17, 0x08, 0x0A, + 0x82, 0x20, 0x6A, 0x07, 0x3D, 0x22, 0x90, 0xFE, 0x3E, 0x1E, 0x45, 0xF4, + 0xC4, 0x13, 0x44, 0xF0, 0xEF, 0x11, 0xCE, 0xF0, 0xA3, 0x13, 0xFF, 0xF0, + 0xB8, 0x0A, 0x8C, 0xEB, 0xB9, 0x08, 0xE5, 0xE9, 0x1E, 0x0C, 0x11, 0xF0, + 0xDB, 0x06, 0x0E, 0xF7, 0xFF, 0xF9, 0x8D, 0xF8, 0x92, 0xED, 0x3D, 0xF9, + 0xE9, 0xEA, 0xE5, 0xF9, 0xE3, 0xE8, 0xAF, 0xF3, 0xA2, 0xE2, 0x41, 0xF2, + 0x86, 0xDC, 0x99, 0xF6, 0xAD, 0xD9, 0x0B, 0xF6, 0x70, 0xDA, 0x8B, 0xEE, + 0xF4, 0xD9, 0xBB, 0xE7, 0x1D, 0xD4, 0x20, 0xE8, 0xA3, 0xCF, 0xE1, 0xE3, + 0x98, 0xD0, 0xCB, 0xE1, 0xFB, 0xD0, 0x13, 0xE3, 0xB9, 0xD4, 0x5A, 0xDC, + 0x7E, 0xD8, 0x76, 0xD6, 0xFF, 0xD6, 0x2A, 0xCC, 0x41, 0xD5, 0x54, 0xBD, + 0x76, 0xD5, 0x32, 0xB8, 0x14, 0xD7, 0x6C, 0xC0, 0xBC, 0xD9, 0xDF, 0xC5, + 0xF2, 0xDD, 0xA7, 0xC6, 0xED, 0xE4, 0x23, 0xD3, 0xDA, 0xE8, 0x66, 0xDB, + 0xA3, 0xE6, 0xA1, 0xD9, 0x8B, 0xE5, 0x21, 0xDF, 0xE0, 0xE4, 0x0A, 0xEA, + 0x57, 0xDC, 0x04, 0xE6, 0x84, 0xD6, 0x21, 0xE0, 0x3D, 0xDC, 0xE9, 0xE2, + 0x14, 0xE5, 0x2C, 0xE2, 0x79, 0xEB, 0xB5, 0xE2, 0xA3, 0xEB, 0x03, 0xE7, + 0x2A, 0xE7, 0x68, 0xEE, 0xDF, 0xE4, 0x59, 0xED, 0xBE, 0xE6, 0x49, 0xE9, + 0x3B, 0xE6, 0x30, 0xED, 0xC7, 0xE3, 0x86, 0xF0, 0x3E, 0xE4, 0x4E, 0xEE, + 0x03, 0xE8, 0x91, 0xF0, 0x09, 0xE8, 0x7C, 0xFB, 0xA9, 0xE2, 0xCB, 0xFA, + 0xE6, 0xE5, 0xAD, 0xF2, 0x0B, 0xEF, 0x64, 0xF1, 0xE4, 0xF5, 0x66, 0xF3, + 0x66, 0xFB, 0x26, 0xF2, 0x71, 0x00, 0x5F, 0xED, 0x33, 0x02, 0x57, 0xF1, + 0x1A, 0x02, 0xCF, 0xF4, 0x52, 0xFF, 0xFC, 0xEC, 0x61, 0xF4, 0xE4, 0xE8, + 0xF2, 0xEB, 0x80, 0xEC, 0xAC, 0xF0, 0x0C, 0xEF, 0xC1, 0xF7, 0x1B, 0xF0, + 0x93, 0xF6, 0x3F, 0xEF, 0x95, 0xF6, 0x72, 0xE8, 0x1C, 0xF6, 0xF3, 0xE3, + 0xDA, 0xF3, 0xA5, 0xEE, 0xD3, 0xF6, 0x0B, 0x01, 0x58, 0xF8, 0xCE, 0x08, + 0x68, 0xF4, 0x2E, 0x06, 0x7C, 0xF0, 0xE0, 0xFD, 0xF0, 0xEF, 0xF2, 0xF6, + 0xE3, 0xF0, 0x41, 0xFF, 0x2D, 0xF5, 0x1C, 0x0C, 0xE4, 0xF8, 0x9C, 0x06, + 0x9D, 0xFA, 0x97, 0xF5, 0x34, 0x01, 0xF6, 0xF3, 0xAA, 0x01, 0x50, 0xFA, + 0x35, 0x00, 0x94, 0xF4, 0x58, 0x03, 0x48, 0xF2, 0x20, 0x08, 0xFD, 0xF9, + 0x63, 0x13, 0xE3, 0xFA, 0xEF, 0x1A, 0xAC, 0xF5, 0x09, 0x14, 0x22, 0xF9, + 0x99, 0x06, 0x38, 0xFF, 0x12, 0x04, 0xAB, 0x01, 0x06, 0x0B, 0x2C, 0x08, + 0x6F, 0x11, 0xE4, 0x0D, 0x11, 0x17, 0x49, 0x0E, 0x3D, 0x17, 0x79, 0x12, + 0xD2, 0x16, 0x79, 0x1B, 0x10, 0x1D, 0x57, 0x22, 0xC3, 0x1F, 0xE0, 0x28, + 0xDF, 0x19, 0x4C, 0x30, 0xEF, 0x16, 0x2A, 0x30, 0xB3, 0x1A, 0xD5, 0x29, + 0xD9, 0x1A, 0xF0, 0x24, 0x50, 0x18, 0x16, 0x21, 0xAE, 0x14, 0x0B, 0x1E, + 0x19, 0x0E, 0xC5, 0x1A, 0x5A, 0x09, 0xFE, 0x14, 0xCB, 0x0A, 0x75, 0x10, + 0x35, 0x0F, 0x67, 0x0A, 0x3F, 0x16, 0xDD, 0x05, 0x2A, 0x1E, 0xE7, 0x0B, + 0x14, 0x24, 0xC0, 0x10, 0x9A, 0x27, 0xC5, 0x10, 0x1F, 0x21, 0xD0, 0x14, + 0x22, 0x14, 0x4C, 0x1A, 0xDC, 0x09, 0x66, 0x1A, 0x5D, 0x06, 0x3B, 0x11, + 0x40, 0x03, 0xBA, 0x06, 0xB5, 0xFD, 0xD8, 0x01, 0x3E, 0xFD, 0x9C, 0x00, + 0x0D, 0x03, 0x0B, 0x03, 0x59, 0x06, 0xA6, 0x03, 0x00, 0x02, 0x12, 0xFC, + 0x0B, 0xFE, 0x27, 0xF7, 0x23, 0xFE, 0x47, 0xFF, 0xF7, 0x00, 0x5B, 0x02, + 0x76, 0xFD, 0xB2, 0xFC, 0xAE, 0xF2, 0x50, 0xFD, 0xF3, 0xE9, 0x99, 0xFA, + 0xCB, 0xE6, 0xC0, 0xF5, 0xBB, 0xE3, 0x21, 0xF7, 0x5F, 0xE2, 0x04, 0xF9, + 0x6E, 0xE6, 0xB0, 0xFB, 0x92, 0xEF, 0xC7, 0xFC, 0x04, 0x02, 0xE1, 0xFB, + 0x44, 0x14, 0xD6, 0xF6, 0x3A, 0x19, 0x45, 0xF7, 0x2C, 0x15, 0xAF, 0x00, + 0xC7, 0x12, 0xD0, 0x04, 0x22, 0x0E, 0x3F, 0x00, 0xEF, 0x08, 0xC6, 0xF8, + 0x24, 0x0A, 0x90, 0xF6, 0x74, 0x0C, 0xB7, 0xF3, 0x53, 0x09, 0x23, 0xF3, + 0x96, 0x06, 0xEE, 0x01, 0x45, 0x07, 0xC4, 0x0E, 0x31, 0x08, 0x65, 0x12, + 0x1F, 0x08, 0x2D, 0x1A, 0x2C, 0x0B, 0xFA, 0x1C, 0xF7, 0x16, 0x08, 0x1C, + 0xBA, 0x20, 0x41, 0x28, 0x90, 0x1B, 0x8C, 0x34, 0xC3, 0x10, 0x26, 0x30, + 0xFF, 0x10, 0x50, 0x26, 0x00, 0x10, 0xA1, 0x1E, 0x25, 0x0E, 0x43, 0x11, + 0xC8, 0x10, 0xDF, 0x08, 0xC6, 0x08, 0xBA, 0x09, 0x99, 0x01, 0x45, 0x05, + 0x93, 0x08, 0xC5, 0x00, 0xE1, 0x13, 0x19, 0x06, 0x40, 0x18, 0x44, 0x0C, + 0x36, 0x15, 0x6D, 0x08, 0x45, 0x09, 0x35, 0x04, 0x2C, 0xFE, 0x71, 0x09, + 0x0D, 0xFC, 0x76, 0x0F, 0xFA, 0xFA, 0x85, 0x0E, 0x3B, 0x01, 0x1A, 0x0C, + 0x85, 0x08, 0x0B, 0x06, 0x51, 0xFC, 0x46, 0xFA, 0x48, 0xE6, 0xF9, 0xF2, + 0x74, 0xE3, 0x82, 0xF6, 0x04, 0xF5, 0x34, 0xFA, 0x79, 0x04, 0x7B, 0xF5, + 0x20, 0x05, 0x38, 0xF9, 0xA4, 0x00, 0x28, 0x06, 0xA7, 0x04, 0x7C, 0x09, + 0xD5, 0x04, 0xC7, 0x01, 0x18, 0xFF, 0x51, 0xFA, 0x4E, 0xFB, 0x6B, 0xFB, + 0x87, 0xFB, 0x5B, 0x03, 0x3D, 0x01, 0x1C, 0x09, 0xCD, 0xFE, 0x3A, 0x05, + 0x27, 0xF5, 0xD0, 0x02, 0xCC, 0xF5, 0xFB, 0x08, 0xBE, 0xFF, 0xE6, 0x08, + 0x78, 0x0A, 0xE7, 0x06, 0x1A, 0x12, 0x90, 0x09, 0x8D, 0x0F, 0x64, 0x04, + 0x6C, 0x0B, 0xED, 0xFF, 0xD0, 0x16, 0x9C, 0x04, 0x5C, 0x27, 0x8B, 0x07, + 0x2F, 0x25, 0x4E, 0x0A, 0x52, 0x1F, 0x8C, 0x0F, 0x62, 0x24, 0xA3, 0x10, + 0x80, 0x20, 0x4F, 0x10, 0xD8, 0x13, 0x7D, 0x0C, 0x81, 0x06, 0xE8, 0x09, + 0x0B, 0x00, 0xE9, 0x17, 0x83, 0x09, 0xB5, 0x1F, 0x6A, 0x16, 0x75, 0x19, + 0x7B, 0x19, 0x1F, 0x19, 0x63, 0x0F, 0x98, 0x18, 0xA2, 0x07, 0xC3, 0x15, + 0xC7, 0x0F, 0x66, 0x1E, 0xD5, 0x15, 0xE8, 0x22, 0xF2, 0x0D, 0x9C, 0x1C, + 0x54, 0x0A, 0x6F, 0x1C, 0x2E, 0x10, 0x86, 0x18, 0x9B, 0x06, 0x7E, 0x0D, + 0xD5, 0xF4, 0xEB, 0x04, 0xE5, 0xF1, 0x5E, 0x02, 0x83, 0xF9, 0x8E, 0x04, + 0x35, 0x02, 0x78, 0x07, 0xFF, 0x04, 0x80, 0x02, 0xD4, 0xFD, 0xD9, 0xF5, + 0x0A, 0xF5, 0x1E, 0xEE, 0x35, 0xF7, 0x68, 0xEF, 0xFD, 0xFE, 0x0C, 0xF6, + 0x9B, 0x01, 0x57, 0xFC, 0xAA, 0xF9, 0x09, 0xFC, 0x50, 0xED, 0x45, 0xF6, + 0x58, 0xE9, 0x99, 0xE9, 0x30, 0xEC, 0x2E, 0xE4, 0x97, 0xED, 0x31, 0xF4, + 0x02, 0xF2, 0x16, 0x01, 0xCA, 0xFF, 0x95, 0x01, 0xEB, 0x05, 0x9D, 0x00, + 0xE8, 0xFC, 0x90, 0x00, 0x54, 0xF3, 0x3D, 0xFA, 0xF5, 0xF6, 0xC1, 0xF6, + 0x78, 0xFF, 0xE8, 0xFD, 0x12, 0x01, 0xE3, 0x04, 0x02, 0x04, 0xC3, 0x0D, + 0xB1, 0x07, 0xAF, 0x10, 0x0D, 0x0E, 0x4F, 0x0B, 0x45, 0x12, 0x9E, 0x0B, + 0x89, 0x0B, 0x5C, 0x14, 0xEC, 0x04, 0x08, 0x1D, 0xA4, 0x08, 0x08, 0x1F, + 0xF6, 0x16, 0x99, 0x1B, 0x5F, 0x21, 0x95, 0x19, 0x5D, 0x28, 0x54, 0x1B, + 0x5F, 0x35, 0x09, 0x21, 0x4F, 0x3B, 0x45, 0x2B, 0x9D, 0x30, 0xA0, 0x2F, + 0xB8, 0x1F, 0x51, 0x2D, 0xDB, 0x1A, 0x35, 0x2D, 0xA0, 0x21, 0xD7, 0x2F, + 0x13, 0x2B, 0x39, 0x2C, 0x67, 0x2D, 0xF2, 0x26, 0xFE, 0x2A, 0x53, 0x28, + 0x78, 0x32, 0xD1, 0x2B, 0xEE, 0x35, 0x25, 0x2C, 0xF2, 0x2A, 0xC9, 0x22, + 0x98, 0x20, 0x48, 0x1D, 0x4D, 0x22, 0xDA, 0x20, 0xFA, 0x31, 0xBD, 0x24, + 0xB6, 0x39, 0x32, 0x2A, 0x50, 0x2B, 0xFE, 0x26, 0x14, 0x14, 0xBB, 0x17, + 0x85, 0x05, 0x1F, 0x0D, 0x0E, 0x08, 0xF9, 0x0F, 0xBF, 0x0A, 0xD7, 0x14, + 0xDB, 0x06, 0x73, 0x17, 0x0A, 0x06, 0x73, 0x17, 0x95, 0x0B, 0x72, 0x0E, + 0xE7, 0x0C, 0xE7, 0xF8, 0x4C, 0x00, 0xCB, 0xE8, 0x8A, 0xF0, 0x41, 0xE9, + 0xA3, 0xEB, 0x29, 0xEC, 0x39, 0xEF, 0x57, 0xED, 0xDE, 0xE8, 0x0B, 0xEA, + 0xC2, 0xDD, 0x9A, 0xE3, 0x26, 0xE3, 0xEA, 0xDB, 0x82, 0xEC, 0x9C, 0xDE, + 0xAA, 0xE5, 0x95, 0xF0, 0x55, 0xD6, 0x94, 0xF3, 0x7D, 0xCA, 0x50, 0xE7, + 0xFA, 0xCA, 0x45, 0xE1, 0xD6, 0xD1, 0x47, 0xDD, 0xAD, 0xD6, 0x06, 0xD9, + 0x14, 0xDC, 0xDA, 0xDD, 0x59, 0xE4, 0x57, 0xE5, 0xCD, 0xF3, 0x9C, 0xDF, + 0x3E, 0xFB, 0x9F, 0xDE, 0xC4, 0xEA, 0x99, 0xE3, 0xC3, 0xD9, 0xF2, 0xDB, + 0x8D, 0xE0, 0x2D, 0xD9, 0x40, 0xEF, 0xEC, 0xDC, 0xFE, 0xF3, 0x70, 0xDC, + 0x78, 0xF5, 0x49, 0xDB, 0x49, 0xF3, 0x97, 0xDF, 0xE6, 0xEE, 0x54, 0xE2, + 0x19, 0xF1, 0x07, 0xEA, 0x12, 0xF1, 0x36, 0xFA, 0x37, 0xF5, 0xC3, 0xFE, + 0xD1, 0xFF, 0x89, 0xF7, 0x95, 0x01, 0x05, 0xF9, 0x6B, 0x01, 0x98, 0x0D, + 0x01, 0x01, 0xCF, 0x1A, 0x25, 0xF7, 0x85, 0x12, 0xE5, 0xF5, 0x2F, 0x0A, + 0xBF, 0x00, 0xE7, 0x0B, 0x53, 0x01, 0x24, 0x0B, 0x00, 0xFD, 0x05, 0x08, + 0x76, 0xFF, 0x38, 0x06, 0x33, 0x07, 0xBA, 0x01, 0x9D, 0x0B, 0x62, 0x00, + 0x1D, 0x0C, 0x5C, 0x02, 0xCA, 0x0B, 0xD0, 0x07, 0x9E, 0x01, 0xCE, 0x0A, + 0xFA, 0xFC, 0xAC, 0x0E, 0x82, 0xFD, 0x66, 0x14, 0x0A, 0xF8, 0x5F, 0x0A, + 0xC8, 0xFB, 0x0A, 0xFE, 0x6E, 0x00, 0x92, 0x02, 0x88, 0xF8, 0x8E, 0x05, + 0xC4, 0xED, 0x17, 0xFE, 0xAF, 0xE5, 0x06, 0xEF, 0x41, 0xE7, 0xCC, 0xDC, + 0x8D, 0xF3, 0x28, 0xDA, 0x66, 0xFB, 0xA9, 0xE1, 0xA9, 0xFF, 0xF7, 0xE5, + 0x61, 0xFE, 0xC5, 0xEB, 0x6C, 0xF8, 0xB3, 0xF3, 0xC9, 0xF2, 0xB7, 0xF5, + 0x77, 0xEE, 0xBC, 0xF6, 0x8B, 0xEB, 0xCD, 0xFA, 0xA9, 0xEC, 0x91, 0xFB, + 0x21, 0xF5, 0x33, 0xFB, 0x8A, 0xF4, 0xA7, 0xF5, 0x8F, 0xED, 0x3F, 0xEE, + 0x34, 0xF1, 0x16, 0xED, 0x4F, 0xFA, 0x00, 0xF4, 0xBA, 0xFA, 0x10, 0xF5, + 0x1F, 0xFB, 0x97, 0xEF, 0x98, 0x03, 0x63, 0xEF, 0x1D, 0x09, 0x89, 0xED, + 0x69, 0x0A, 0x19, 0xEA, 0x82, 0x0E, 0x98, 0xE7, 0x5F, 0x14, 0xB7, 0xE6, + 0x72, 0x18, 0x0A, 0xF0, 0x70, 0x11, 0x09, 0xFC, 0xCF, 0x04, 0xFB, 0xF9, + 0xC3, 0x08, 0x01, 0xFD, 0xA9, 0x08, 0xB9, 0x04, 0x9B, 0x01, 0x68, 0x04, + 0xB1, 0xFE, 0x15, 0x08, 0xB5, 0xF7, 0xD7, 0x14, 0x94, 0xF9, 0x69, 0x20, + 0x37, 0x01, 0x6F, 0x1C, 0x64, 0x01, 0xB7, 0x14, 0x1B, 0xFD, 0x17, 0x15, + 0x56, 0xFF, 0x3B, 0x1C, 0x06, 0xFB, 0xCF, 0x1F, 0x4A, 0x01, 0xDA, 0x1F, + 0x49, 0x14, 0x36, 0x19, 0x98, 0x11, 0xDA, 0x0A, 0x80, 0x04, 0xF9, 0x01, + 0xE8, 0xF6, 0x00, 0xFD, 0x65, 0xF0, 0x2D, 0xF7, 0xE1, 0xF9, 0xCF, 0xF4, + 0xE0, 0x07, 0x67, 0xFA, 0x87, 0x08, 0x1E, 0x00, 0xA6, 0xFD, 0x3C, 0x01, + 0xDD, 0xFA, 0xD0, 0xFC, 0x8B, 0xF9, 0xB1, 0xF1, 0xF6, 0xF9, 0xC7, 0xF4, + 0x3D, 0x00, 0x65, 0x02, 0xC0, 0xF4, 0x70, 0xF6, 0x0D, 0xED, 0x61, 0xD8, + 0x00, 0xEF, 0x26, 0xD3, 0xB6, 0xF1, 0xB4, 0xDF, 0x18, 0xF2, 0xB6, 0xDA, + 0xEF, 0xF5, 0xA0, 0xE0, 0xE7, 0xF6, 0xF8, 0xDE, 0x71, 0xEB, 0x89, 0xD5, + 0xCB, 0xEA, 0x39, 0xE2, 0x51, 0xE5, 0xF2, 0xED, 0x48, 0xE7, 0xA0, 0xEF, + 0xF5, 0xF2, 0xC4, 0xE8, 0x21, 0xE7, 0xA4, 0xE8, 0xD6, 0xE2, 0x11, 0xEB, + 0xE6, 0xE9, 0x80, 0xE8, 0xCA, 0xE2, 0x80, 0xE4, 0x95, 0xEA, 0x66, 0xEE, + 0xB7, 0xF3, 0xBC, 0xF6, 0x2A, 0xF5, 0xAC, 0xF5, 0x19, 0xFF, 0x6A, 0xFC, + 0x81, 0x05, 0xA8, 0xFA, 0x54, 0x01, 0x3D, 0xF9, 0xA3, 0xFE, 0x06, 0x04, + 0x8A, 0x00, 0x2B, 0x03, 0x74, 0xFB, 0xD9, 0xFA, 0xC4, 0x02, 0xE7, 0x02, + 0x4A, 0x02, 0x4B, 0x01, 0x65, 0x07, 0xBF, 0xF9, 0x35, 0x07, 0x53, 0xF4, + 0x60, 0xEE, 0xDE, 0xF1, 0xBE, 0xE7, 0xC6, 0xFF, 0xDF, 0xF3, 0x52, 0x12, + 0xF1, 0xFE, 0x6A, 0x14, 0x1F, 0x05, 0x53, 0x0E, 0xB7, 0x0C, 0xAF, 0x11, + 0x3D, 0x10, 0x90, 0x1B, 0xA6, 0x0E, 0xCF, 0x21, 0x11, 0x0D, 0x83, 0x1E, + 0x87, 0x11, 0xAB, 0x1B, 0x1E, 0x0D, 0x9C, 0x12, 0x54, 0x0A, 0x6D, 0x0A, + 0xE8, 0x0B, 0xCB, 0x01, 0x67, 0xFA, 0x6D, 0xF4, 0x60, 0xED, 0xD7, 0xEC, + 0xB3, 0xF7, 0xAB, 0xEF, 0xE0, 0xFF, 0x85, 0xF0, 0x34, 0xFB, 0x98, 0xEC, + 0x95, 0xF7, 0xDB, 0xE6, 0xA8, 0xFB, 0xB7, 0xE4, 0x66, 0xFA, 0x7B, 0xE9, + 0xEC, 0xFB, 0x9C, 0xEA, 0xCB, 0xFF, 0x74, 0xE1, 0x6E, 0xF8, 0x34, 0xD5, + 0x17, 0xF4, 0x7D, 0xD4, 0x05, 0xED, 0x54, 0xDB, 0x0D, 0xF1, 0xA4, 0xEC, + 0xA9, 0xEE, 0x1E, 0xF1, 0xF3, 0xDD, 0x2A, 0xED, 0x6E, 0xDE, 0xE3, 0xF5, + 0xEA, 0xE1, 0xE7, 0xF9, 0xF9, 0xDD, 0xBD, 0xF4, 0xF5, 0xE2, 0x42, 0xF5, + 0x62, 0xF0, 0x36, 0xF6, 0x55, 0xF2, 0x66, 0xE9, 0xE3, 0xF3, 0xCF, 0xE5, + 0xB1, 0xF7, 0x1A, 0xEF, 0xF3, 0xEB, 0x1B, 0xF4, 0x18, 0xEC, 0x34, 0xF9, + 0xCE, 0xFB, 0xC0, 0xF8, 0x63, 0xFB, 0xCD, 0xF3, 0x53, 0xF1, 0xEE, 0xF5, + 0xC3, 0xF6, 0x08, 0xFE, 0xE5, 0x04, 0x51, 0x08, 0xC4, 0x02, 0x85, 0x08, + 0x7F, 0x0F, 0xD5, 0x11, 0x07, 0x20, 0xA0, 0x18, 0xB4, 0x19, 0x7E, 0x0A, + 0xB3, 0x1A, 0x44, 0x01, 0x56, 0x1E, 0x8A, 0x02, 0x4A, 0x18, 0x5F, 0x09, + 0xDB, 0x13, 0x8A, 0x03, 0x89, 0x13, 0x17, 0x00, 0x40, 0x0F, 0x29, 0x0A, + 0xD0, 0x04, 0x2A, 0x10, 0x95, 0x07, 0x06, 0x1A, 0x08, 0x18, 0xB3, 0x1D, + 0xA8, 0x19, 0x61, 0x16, 0xB4, 0x13, 0xD8, 0x1F, 0x8F, 0x14, 0xB8, 0x2E, + 0x94, 0x1B, 0xC4, 0x2E, 0xE5, 0x1E, 0xD3, 0x21, 0x4C, 0x1D, 0x21, 0x22, + 0xDF, 0x14, 0x2F, 0x27, 0xF3, 0x0A, 0x3A, 0x18, 0xD8, 0x14, 0xD3, 0x10, + 0x7B, 0x13, 0x4B, 0x0E, 0x38, 0x05, 0x56, 0x0E, 0xAC, 0xFA, 0xEE, 0x07, + 0x8E, 0xED, 0x46, 0xF8, 0x68, 0xF1, 0xE3, 0xF5, 0xCB, 0x00, 0xCA, 0xF1, + 0x50, 0x06, 0x8F, 0xE9, 0x01, 0x03, 0x11, 0xF0, 0xC4, 0xFC, 0x9C, 0xEF, + 0x83, 0x06, 0xAC, 0xED, 0x5A, 0x01, 0x9E, 0xF2, 0xFA, 0xF3, 0x7A, 0xF8, + 0xCD, 0xED, 0x8B, 0xFA, 0x81, 0xE2, 0x3A, 0xFA, 0x24, 0xE7, 0x2E, 0x08, + 0x70, 0xE9, 0x62, 0x03, 0x38, 0xE6, 0x1D, 0xFD, 0x19, 0xEA, 0xA8, 0x09, + 0x7C, 0xF6, 0x60, 0x0C, 0x43, 0x04, 0x5E, 0x0D, 0xC6, 0x04, 0xC4, 0x11, + 0x24, 0x00, 0x20, 0x15, 0xF1, 0x0F, 0xC4, 0x0F, 0xFE, 0x16, 0x1A, 0x07, + 0x65, 0x10, 0x0B, 0x13, 0x6C, 0xFD, 0xA6, 0x14, 0x47, 0xF0, 0x26, 0x04, + 0xFB, 0x08, 0x92, 0xFC, 0x7C, 0x16, 0xB1, 0xF9, 0x0C, 0x14, 0x2A, 0x00, + 0xF1, 0x1D, 0xD0, 0x04, 0x4E, 0x28, 0x47, 0x03, 0xB9, 0x24, 0xA3, 0x01, + 0xE6, 0x1F, 0x10, 0x05, 0xA5, 0x1A, 0xD3, 0x0A, 0xB9, 0x1E, 0x4D, 0x11, + 0xED, 0x23, 0x9D, 0x0C, 0x08, 0x28, 0xE6, 0x06, 0x4D, 0x22, 0x31, 0x10, + 0x2C, 0x13, 0x9C, 0x15, 0xFD, 0x15, 0xA0, 0x10, 0x1E, 0x14, 0x0C, 0x0A, + 0x37, 0x13, 0xAD, 0x16, 0x1B, 0x15, 0xE7, 0x1F, 0xA7, 0x0A, 0x72, 0x20, + 0x98, 0x0F, 0x18, 0x2B, 0x68, 0x16, 0x8B, 0x23, 0xC2, 0x0B, 0x75, 0x1A, + 0xF4, 0x02, 0xC1, 0x20, 0x1E, 0xF4, 0xC0, 0x15, 0x16, 0xE9, 0x2F, 0x0D, + 0xBB, 0xE2, 0x8B, 0x0C, 0x55, 0xE8, 0x29, 0x0B, 0x9D, 0xEA, 0xC4, 0xFE, + 0x64, 0xED, 0x3A, 0xF0, 0x0B, 0xF5, 0x1A, 0xF0, 0x6A, 0xE6, 0x29, 0xE2, + 0xDB, 0xE1, 0xCE, 0xDC, 0xDC, 0xEA, 0xEE, 0xE0, 0x42, 0xED, 0xC6, 0xD4, + 0x88, 0xEB, 0x12, 0xCB, 0x9F, 0xEA, 0x19, 0xD3, 0xA5, 0xE3, 0xE8, 0xDF, + 0x25, 0xD1, 0x2B, 0xDA, 0x60, 0xCB, 0x63, 0xD2, 0x8C, 0xD7, 0x6A, 0xDF, + 0x96, 0xE2, 0xF4, 0xEF, 0xC3, 0xE9, 0xB1, 0xF2, 0x62, 0xEB, 0xD9, 0xF8, + 0x36, 0xED, 0x50, 0xFF, 0x89, 0xF2, 0x79, 0xFC, 0xD6, 0xF3, 0x31, 0x05, + 0x04, 0xF1, 0x41, 0x0B, 0xD6, 0xF2, 0xC3, 0x05, 0x98, 0xFD, 0x13, 0x03, + 0x64, 0x0E, 0x5D, 0x0A, 0x2F, 0x12, 0xD8, 0x16, 0x1C, 0x10, 0xA6, 0x15, + 0x45, 0x15, 0xFD, 0x09, 0xC5, 0x19, 0xB9, 0x0C, 0xF4, 0x20, 0x87, 0x1B, + 0x5F, 0x21, 0x0A, 0x1F, 0xD4, 0x21, 0xEB, 0x19, 0x31, 0x23, 0x9B, 0x0F, + 0xA6, 0x1D, 0xE8, 0x09, 0xE3, 0x28, 0xAF, 0x1A, 0x48, 0x21, 0xAA, 0x20, + 0xED, 0x13, 0xC4, 0x1E, 0xCA, 0x23, 0xF6, 0x2A, 0x7F, 0x25, 0x3A, 0x2A, + 0x69, 0x24, 0x02, 0x2E, 0x56, 0x2C, 0x54, 0x33, 0x3C, 0x30, 0x63, 0x24, + 0x2A, 0x32, 0x5E, 0x1E, 0x34, 0x25, 0xBD, 0x25, 0xEE, 0x16, 0xEB, 0x2A, + 0x58, 0x16, 0x88, 0x22, 0x94, 0x16, 0x30, 0x1E, 0xEB, 0x1A, 0xE3, 0x28, + 0x05, 0x1C, 0xCB, 0x20, 0x66, 0x14, 0x75, 0x1B, 0x45, 0x06, 0xAB, 0x16, + 0x6B, 0xF3, 0x43, 0x0A, 0x54, 0xF1, 0xF9, 0x0B, 0xC9, 0xEF, 0x20, 0xFE, + 0x9A, 0xF0, 0x74, 0xF7, 0xFA, 0xF7, 0x14, 0xFE, 0x67, 0x05, 0x1D, 0xF9, + 0x37, 0x0A, 0x61, 0xF4, 0x8A, 0xF2, 0x8E, 0xE7, 0xDD, 0xF8, 0xC9, 0xEC, + 0x91, 0x0B, 0x10, 0xF0, 0xC6, 0x01, 0x1F, 0xE1, 0x1C, 0xF9, 0x6D, 0xF4, + 0x42, 0xF0, 0x3E, 0xF6, 0xC7, 0xE8, 0xF0, 0xE3, 0xA5, 0xE8, 0xF6, 0xEE, + 0x74, 0xE6, 0xCE, 0xEB, 0xA1, 0xEC, 0xB3, 0xEA, 0xE6, 0xF6, 0x1A, 0xF6, + 0x5B, 0x0B, 0x69, 0x00, 0x98, 0x10, 0x30, 0x07, 0xDC, 0x07, 0x8C, 0x06, + 0xF5, 0x0E, 0x34, 0x0E, 0xB7, 0x11, 0x01, 0x18, 0x01, 0x09, 0xD6, 0x1E, + 0x3A, 0x06, 0xCE, 0x22, 0xA9, 0x09, 0xFC, 0x1B, 0xE5, 0x04, 0x6C, 0x0E, + 0x7B, 0x12, 0x5E, 0x16, 0x3C, 0x21, 0xE9, 0x1E, 0x66, 0x12, 0xBC, 0x10, + 0x13, 0x0B, 0x63, 0x0F, 0x32, 0x1B, 0x9B, 0x16, 0x53, 0x19, 0x93, 0x16, + 0xA9, 0x16, 0x5F, 0x0F, 0xFA, 0x21, 0x43, 0xFE, 0x0B, 0x1B, 0x0B, 0x03, + 0xD1, 0x16, 0x2E, 0x16, 0x49, 0x19, 0x11, 0x0D, 0x1D, 0x1B, 0xB5, 0x10, + 0x59, 0x15, 0x2D, 0x19, 0x04, 0x07, 0x07, 0x10, 0x56, 0xFD, 0x8F, 0x1C, + 0x48, 0x05, 0x4B, 0x29, 0x6A, 0x0F, 0x7C, 0x18, 0xAF, 0x0B, 0x15, 0x08, + 0xD3, 0xFF, 0x7D, 0x12, 0x37, 0x01, 0xD0, 0x18, 0x84, 0x08, 0x03, 0x12, + 0x60, 0xFC, 0x6D, 0x13, 0xC4, 0xF2, 0x07, 0x0B, 0x08, 0xEB, 0xC7, 0xF5, + 0xCE, 0xDB, 0x64, 0xE6, 0xB6, 0xE6, 0x35, 0xDB, 0x62, 0xF2, 0x44, 0xE2, + 0xDF, 0xDF, 0x40, 0xF0, 0x4C, 0xE3, 0x7F, 0xE8, 0xC4, 0xF3, 0x53, 0xE4, + 0x2C, 0xF2, 0xB4, 0xE2, 0xC8, 0xEF, 0x64, 0xCF, 0xB7, 0xE4, 0xA3, 0xC8, + 0x29, 0xD9, 0x82, 0xCF, 0x3C, 0xE9, 0x24, 0xD1, 0xFC, 0xE4, 0x3B, 0xD8, + 0xAB, 0xCD, 0x60, 0xE6, 0x55, 0xCB, 0x27, 0xE8, 0x1C, 0xC6, 0x76, 0xE3, + 0x67, 0xC8, 0xE2, 0xE3, 0x39, 0xDA, 0xA5, 0xDD, 0xF1, 0xE5, 0x18, 0xDB, + 0x75, 0xF0, 0x90, 0xE6, 0x5A, 0x00, 0x4A, 0xE3, 0xFF, 0xFC, 0x70, 0xE8, + 0xCE, 0xF1, 0x0A, 0x14, 0x31, 0xFF, 0xB3, 0x17, 0xB0, 0x05, 0xBA, 0xF4, + 0x97, 0x05, 0x06, 0x05, 0x4B, 0x0E, 0x31, 0x14, 0xE9, 0xF9, 0xCD, 0xFE, + 0x05, 0xEA, 0xB5, 0xFE, 0x72, 0x03, 0x5F, 0x0F, 0x66, 0x0D, 0x6A, 0x21, + 0xC1, 0xFC, 0x78, 0x24, 0xD2, 0x0C, 0x1F, 0x17, 0x4A, 0x27, 0xC9, 0x12, + 0x55, 0x2C, 0x4C, 0x09, 0x72, 0x31, 0x44, 0xF5, 0x01, 0x31, 0x1E, 0xF8, + 0xFF, 0x27, 0x50, 0x09, 0x4E, 0x20, 0x4A, 0x16, 0x7B, 0x27, 0xA6, 0x26, + 0xFE, 0x27, 0x7A, 0x2E, 0x0B, 0x13, 0x16, 0x17, 0x3B, 0x0B, 0x29, 0xF9, + 0x76, 0x16, 0x56, 0xFA, 0xD6, 0x13, 0xD6, 0x01, 0x5E, 0xFC, 0x21, 0x03, + 0x22, 0xFF, 0x8C, 0x12, 0x29, 0x1D, 0x75, 0x16, 0xAC, 0x16, 0xA7, 0x06, + 0x49, 0xFF, 0x67, 0x0E, 0x41, 0x0E, 0x26, 0x18, 0xE7, 0x1C, 0x97, 0x03, + 0x30, 0xFA, 0x31, 0xF6, 0x2B, 0xD8, 0x9E, 0x03, 0xA5, 0xD9, 0x78, 0x03, + 0xFA, 0xD1, 0xEC, 0xE1, 0x73, 0xC4, 0xAD, 0xCE, 0xE2, 0xCF, 0x0F, 0xE4, + 0x89, 0xD5, 0x39, 0xE8, 0x33, 0xD8, 0x44, 0xD4, 0xC3, 0xF9, 0xEE, 0xDA, + 0x2A, 0x0E, 0xA2, 0xEA, 0x94, 0xF0, 0x79, 0xF0, 0x0E, 0xCA, 0xEA, 0xEA, + 0xD2, 0xBF, 0x50, 0xDD, 0x15, 0xBC, 0x34, 0xD8, 0xDF, 0xC5, 0xB9, 0xCE, + 0x2A, 0xD6, 0xA3, 0xC5, 0xE1, 0xDF, 0xA5, 0xDC, 0x5A, 0xE6, 0x42, 0xF0, + 0x47, 0xEE, 0xA2, 0xFC, 0x82, 0x01, 0xD0, 0x0B, 0x34, 0xFC, 0x69, 0xFC, + 0x0A, 0xF2, 0x15, 0xE5, 0xF9, 0xFA, 0xDB, 0xD4, 0x46, 0xFD, 0x5D, 0xD7, + 0xA2, 0xEF, 0x13, 0xE2, 0xF2, 0xE2, 0xD1, 0xE8, 0x79, 0xE1, 0x58, 0xF0, + 0x68, 0xF2, 0x20, 0xFA, 0x5D, 0x03, 0xA2, 0x12, 0xEA, 0x00, 0x6E, 0x1E, + 0x6D, 0x0C, 0xE9, 0x14, 0xE5, 0x1C, 0x09, 0x01, 0xAD, 0x19, 0xE3, 0xF4, + 0x0A, 0x14, 0xC7, 0xF6, 0x50, 0x16, 0x1C, 0x00, 0x8D, 0x0D, 0x77, 0x01, + 0xD1, 0x08, 0x62, 0x02, 0xDB, 0x07, 0x67, 0x13, 0xB7, 0x03, 0x9C, 0x16, + 0x3F, 0x0D, 0xF4, 0xFD, 0x3A, 0x18, 0xB3, 0xED, 0x38, 0x09, 0xBD, 0xE4, + 0x97, 0xF2, 0x6B, 0xE1, 0x4F, 0xEA, 0x06, 0xEB, 0xDF, 0xE2, 0x95, 0xEA, + 0x27, 0xE1, 0x39, 0xEB, 0x97, 0xEE, 0x5B, 0xF4, 0x55, 0x04, 0x0E, 0x01, + 0xCF, 0x01, 0x1F, 0x04, 0xC2, 0xE7, 0xA4, 0x09, 0x70, 0xE5, 0x5B, 0x15, + 0x56, 0xEF, 0x00, 0x00, 0xFF, 0xD7, 0xFF, 0xDE, 0x80, 0xB1, 0x9A, 0xCD, + 0xB1, 0xA6, 0xAF, 0xBC, 0xEE, 0xB2, 0x50, 0xB5, 0x84, 0xBB, 0xB1, 0xB4, + 0x60, 0xCA, 0xFD, 0xB4, 0x8F, 0xE6, 0x05, 0xD5, 0x5F, 0x0F, 0x71, 0x03, + 0x57, 0x29, 0x34, 0x0F, 0xB6, 0x18, 0x7D, 0x0C, 0x62, 0x10, 0xDA, 0x12, + 0xD8, 0x0E, 0x93, 0x06, 0xA1, 0xF2, 0xE4, 0xFE, 0xF6, 0xE8, 0x86, 0x07, + 0xB2, 0xF6, 0xB7, 0x08, 0x83, 0xFE, 0x0F, 0x07, 0xB8, 0x1D, 0xBB, 0x12, + 0x01, 0x3E, 0x03, 0x33, 0xD7, 0x34, 0x2C, 0x46, 0x65, 0x27, 0x03, 0x3E, + 0xDA, 0x1E, 0x48, 0x24, 0x94, 0x03, 0xA3, 0x06, 0xC3, 0xF6, 0x36, 0xF2, + 0xAD, 0x01, 0x14, 0xE1, 0xF1, 0xFC, 0xED, 0xEA, 0xE8, 0xFD, 0xFE, 0x05, + 0xEB, 0x20, 0x09, 0x08, 0xC4, 0x34, 0x9C, 0x0D, 0x7E, 0x37, 0x81, 0x2C, + 0xCB, 0x38, 0xFE, 0x38, 0xBD, 0x29, 0xF8, 0x2F, 0x77, 0x22, 0x69, 0x2B, + 0x6F, 0x24, 0x51, 0x1E, 0x37, 0x1C, 0xBC, 0x0E, 0xCF, 0x0F, 0x2C, 0x07, + 0x17, 0x1D, 0xF5, 0x0A, 0xB7, 0x26, 0xFC, 0x11, 0xF1, 0x1C, 0x26, 0x1C, + 0x15, 0x27, 0xD3, 0x2C, 0xF7, 0x29, 0xB7, 0x20, 0x2A, 0x03, 0x82, 0xF0, + 0x42, 0xE4, 0xA9, 0xDB, 0x7C, 0xD7, 0xDE, 0xD9, 0xD9, 0xC3, 0x75, 0xC2, + 0xFE, 0xC0, 0x5F, 0xC0, 0xB5, 0xE8, 0xFC, 0xE6, 0x3A, 0x0C, 0x50, 0x04, + 0x9E, 0x0D, 0x44, 0x0B, 0xBF, 0x15, 0x9B, 0x1E, 0x55, 0x0F, 0x05, 0x28, + 0x06, 0xED, 0x12, 0x09, 0x37, 0xCE, 0x87, 0xDF, 0xB8, 0xB5, 0x86, 0xC1, + 0x9F, 0xA9, 0x5C, 0xA6, 0x8C, 0xB3, 0x1E, 0xB0, 0xCD, 0xC6, 0xB7, 0xD7, + 0xB2, 0xE5, 0x59, 0xF2, 0xD0, 0x0A, 0x5C, 0x08, 0xCE, 0x23, 0x6B, 0x11, + 0x46, 0x2A, 0x0E, 0x0D, 0x56, 0x28, 0x86, 0x09, 0x66, 0x14, 0x17, 0xF7, + 0x64, 0xEE, 0xA2, 0xDD, 0x9B, 0xE1, 0x69, 0xD9, 0xB5, 0xDB, 0x66, 0xDA, + 0x8B, 0xDD, 0xF7, 0xE6, 0xB1, 0x06, 0x94, 0x09, 0x5C, 0x2B, 0xF8, 0x23, + 0xF9, 0x2B, 0x4B, 0x28, 0xAB, 0x19, 0xC6, 0x22, 0x1B, 0x02, 0x08, 0x0F, + 0x03, 0xE8, 0x29, 0xEF, 0xB5, 0xC8, 0xF2, 0xD6, 0xF0, 0xB7, 0xEE, 0xD2, + 0xE2, 0xBC, 0x49, 0xDF, 0x66, 0xD6, 0x80, 0xEC, 0xDF, 0x04, 0x92, 0xFC, + 0xBB, 0x3A, 0xA6, 0x19, 0xB8, 0x3D, 0xCD, 0x27, 0xBD, 0x1E, 0x4B, 0x27, + 0xF6, 0x09, 0x33, 0x22, 0xB7, 0xE9, 0xBD, 0x08, 0xD3, 0xD9, 0x69, 0xE6, + 0xC7, 0xEE, 0xD6, 0xD7, 0x7A, 0xFA, 0x53, 0xDD, 0x36, 0xF6, 0x56, 0xEA, + 0x56, 0x04, 0x5F, 0x03, 0x3C, 0x16, 0xAA, 0x11, 0xE2, 0x1D, 0x57, 0x0E, + 0xC2, 0x09, 0xC1, 0xFC, 0x80, 0xD8, 0x2B, 0xDC, 0x6E, 0xBC, 0x15, 0xD1, + 0x21, 0xC9, 0x9C, 0xD9, 0x67, 0xCE, 0x15, 0xCD, 0xBC, 0xD7, 0xAD, 0xCC, + 0xDE, 0xFD, 0xD6, 0xF3, 0x09, 0x21, 0xFA, 0x1E, 0x13, 0x29, 0x89, 0x3A, + 0x55, 0x22, 0x04, 0x3F, 0xDC, 0x25, 0xD8, 0x27, 0x92, 0x10, 0x3A, 0xFC, + 0xC7, 0xDF, 0x3C, 0xD0, 0x2E, 0xC6, 0xDF, 0xB7, 0xA5, 0xAF, 0xEF, 0xAB, + 0xA3, 0x9F, 0xE8, 0xAE, 0x8A, 0xBF, 0x32, 0xC7, 0x07, 0xE3, 0x7D, 0xE7, + 0xA0, 0xF1, 0x4C, 0x01, 0xFB, 0x0F, 0xF5, 0x10, 0x3C, 0x2B, 0xE9, 0x0E, + 0x5A, 0x1E, 0x21, 0x01, 0x9F, 0x0B, 0xDD, 0xF2, 0x94, 0xFF, 0xB1, 0xEB, + 0x9D, 0xEE, 0xF7, 0xEC, 0x56, 0xF8, 0x20, 0xE4, 0x2E, 0x0C, 0xAF, 0xE5, + 0xA0, 0x1E, 0x89, 0x06, 0xDF, 0x30, 0xC0, 0x18, 0xBA, 0x25, 0xD3, 0x10, + 0xA7, 0x0E, 0xEF, 0x04, 0x84, 0xF6, 0x04, 0xEA, 0x9E, 0xCC, 0x40, 0xD4, + 0x5A, 0xAB, 0x83, 0xD8, 0x1B, 0xB8, 0x2E, 0xDB, 0xD8, 0xDC, 0x03, 0xDF, + 0xC7, 0xFF, 0xCA, 0x03, 0xB2, 0x33, 0x51, 0x31, 0xF7, 0x4B, 0xB8, 0x4B, + 0x07, 0x3F, 0x20, 0x5B, 0xDB, 0x3C, 0xC6, 0x52, 0x5F, 0x34, 0xAD, 0x42, + 0xB0, 0x13, 0x5C, 0x29, 0x2E, 0x0F, 0x5C, 0x0D, 0xCA, 0x20, 0x83, 0x0A, + 0xED, 0x23, 0x76, 0x20, 0xB5, 0x31, 0xFD, 0x2E, 0xBC, 0x4A, 0xFA, 0x2C, + 0xAE, 0x47, 0x04, 0x33, 0x14, 0x29, 0x27, 0x3D, 0x45, 0x13, 0x41, 0x3F, + 0x6F, 0xF8, 0x4A, 0x1E, 0xFC, 0xD9, 0x99, 0xED, 0xA7, 0xE2, 0x42, 0xEF, + 0x46, 0x02, 0x78, 0x17, 0xE0, 0x11, 0x6C, 0x2A, 0xE8, 0x29, 0x0E, 0x38, + 0x66, 0x4C, 0x3C, 0x53, 0xE1, 0x59, 0xEA, 0x58, 0x90, 0x58, 0x13, 0x54, + 0x16, 0x52, 0x14, 0x53, 0x33, 0x38, 0x3F, 0x3B, 0xBD, 0x19, 0x1B, 0x1D, + 0x7C, 0x0B, 0x89, 0x0C, 0x3F, 0xF4, 0x2E, 0xF8, 0xFA, 0xDA, 0x93, 0xE8, + 0x46, 0xE5, 0x26, 0xEF, 0x19, 0x0A, 0xD7, 0xFD, 0x2A, 0x2B, 0xA1, 0x13, + 0x1B, 0x38, 0xD4, 0x2C, 0x7B, 0x3E, 0x7D, 0x37, 0x3A, 0x4B, 0x82, 0x36, + 0xC6, 0x49, 0xF3, 0x34, 0x73, 0x31, 0xD7, 0x30, 0x18, 0x2A, 0xB6, 0x2D, + 0xA5, 0x40, 0xAF, 0x2F, 0xEF, 0x44, 0x80, 0x2A, 0xC0, 0x38, 0x8D, 0x1E, + 0xEF, 0x35, 0xCD, 0x11, 0xF3, 0x29, 0x58, 0x03, 0xF8, 0x06, 0x35, 0xF5, + 0x8D, 0xE8, 0x7E, 0xF1, 0xA6, 0xD4, 0xA0, 0xE0, 0x3B, 0xC1, 0x5E, 0xBB, + 0xB7, 0xB9, 0x9B, 0xB1, 0xE0, 0xC3, 0x16, 0xCE, 0x3D, 0xCD, 0x52, 0xE7, + 0xEB, 0xE8, 0x50, 0x01, 0x64, 0x18, 0xA4, 0x1E, 0x19, 0x1B, 0x6C, 0x2B, + 0xED, 0x0C, 0xE5, 0x2F, 0xFB, 0x0E, 0xA6, 0x23, 0x40, 0x0F, 0x06, 0x12, + 0xF8, 0xFC, 0x82, 0xF8, 0x97, 0xED, 0x89, 0xEA, 0xA8, 0xF3, 0x4A, 0xEA, + 0x82, 0xFA, 0x7D, 0xE1, 0xF5, 0xF4, 0x8F, 0xDA, 0x70, 0xED, 0xAD, 0xDA, + 0x6F, 0xDF, 0xDC, 0xCF, 0x41, 0xCB, 0x7B, 0xC1, 0x77, 0xC9, 0x2B, 0xC7, + 0x29, 0xC3, 0x1A, 0xB9, 0x60, 0xAD, 0xB0, 0xA3, 0x30, 0xAC, 0x1B, 0xBF, + 0xE2, 0xC3, 0x2D, 0xEC, 0xDC, 0xCE, 0x46, 0xF4, 0x19, 0xE8, 0x00, 0xF9, + 0x4D, 0x18, 0x8C, 0x16, 0x9A, 0x1C, 0x3E, 0x20, 0xBC, 0xF6, 0x97, 0x16, + 0xDA, 0xE9, 0xF6, 0x17, 0x91, 0xEB, 0x94, 0x10, 0xF6, 0xCC, 0x65, 0xED, + 0x57, 0xB6, 0xC7, 0xC5, 0x1F, 0xB7, 0x27, 0xB6, 0x5C, 0xA9, 0xAE, 0xA7, + 0x1C, 0xA4, 0xBB, 0xA0, 0x0A, 0xB8, 0x93, 0xBC, 0x78, 0xD9, 0xF4, 0xD9, + 0x4F, 0xF9, 0x50, 0xE4, 0xB2, 0x06, 0xF6, 0x05, 0xDE, 0x1B, 0x71, 0x35, + 0x70, 0x42, 0x76, 0x37, 0x1B, 0x4E, 0xAB, 0x29, 0xA5, 0x37, 0x70, 0x23, + 0x3B, 0x29, 0xD5, 0x1B, 0x2D, 0x0D, 0xC7, 0x0F, 0x93, 0xFA, 0x43, 0x07, + 0xA8, 0x05, 0x23, 0xFB, 0x36, 0xFC, 0xF1, 0xE8, 0xE0, 0xEC, 0x59, 0xDE, + 0x76, 0xF6, 0xC5, 0xD5, 0xD4, 0xF9, 0xAB, 0xD3, 0x08, 0xEA, 0x22, 0xD9, + 0x83, 0xE7, 0xBC, 0xDF, 0x54, 0xE8, 0x06, 0xF1, 0x59, 0xF0, 0xF0, 0x14, + 0xAF, 0x0E, 0x54, 0x39, 0x9A, 0x2A, 0xAD, 0x4E, 0x31, 0x3F, 0x30, 0x50, + 0xC1, 0x52, 0x57, 0x49, 0xBA, 0x4C, 0x8B, 0x4D, 0x7A, 0x45, 0x1F, 0x56, + 0x7E, 0x34, 0xDA, 0x2D, 0xE0, 0x0F, 0x8B, 0x09, 0x31, 0x09, 0xB4, 0x09, + 0x3C, 0x1F, 0xED, 0xFF, 0xA8, 0x20, 0x7B, 0xF9, 0x6A, 0x12, 0x4E, 0xF3, + 0x32, 0x07, 0x01, 0xE1, 0xD8, 0xFA, 0x37, 0xE3, 0x82, 0xF7, 0x5C, 0xFC, + 0x3F, 0xEB, 0x18, 0xFC, 0x4B, 0xD4, 0xCE, 0xE9, 0x6A, 0xE9, 0x5C, 0xF4, + 0x3D, 0x20, 0x08, 0x0F, 0xAC, 0x25, 0x9F, 0x12, 0x13, 0x19, 0xE4, 0x21, + 0x39, 0x2E, 0xBE, 0x4D, 0xA7, 0x3C, 0x70, 0x58, 0x8F, 0x33, 0x0C, 0x3D, + 0xC8, 0x25, 0x7F, 0x30, 0x8B, 0x10, 0xDE, 0x2D, 0xE4, 0xED, 0x05, 0x11, + 0xB4, 0xD1, 0x26, 0xEA, 0x33, 0xC0, 0x16, 0xD5, 0x9A, 0xAE, 0xF4, 0xB9, + 0x83, 0xB2, 0x0F, 0xB5, 0x64, 0xD0, 0x16, 0xEB, 0xF9, 0xF2, 0x07, 0x1A, + 0x52, 0x0D, 0xEB, 0x1A, 0x92, 0x32, 0x8C, 0x27, 0x38, 0x58, 0xF1, 0x48, + 0x24, 0x56, 0x38, 0x55, 0x39, 0x3D, 0x64, 0x4F, 0x95, 0x29, 0xAC, 0x38, + 0x26, 0x21, 0xCA, 0x1E, 0x24, 0x0F, 0xC6, 0x04, 0x2C, 0x00, 0x94, 0xEC, + 0xC9, 0x00, 0x75, 0xE1, 0xA2, 0x05, 0x58, 0xDB, 0x91, 0xFC, 0x29, 0xD7, + 0x82, 0xE4, 0xEC, 0xDE, 0x90, 0xDB, 0xC3, 0xEA, 0x27, 0xD7, 0xC4, 0xE5, + 0x2B, 0xCF, 0x5D, 0xDC, 0x59, 0xDE, 0x53, 0xE7, 0x84, 0x06, 0x71, 0xFF, + 0x48, 0x28, 0xA9, 0x1C, 0x90, 0x3B, 0x3D, 0x45, 0xCC, 0x47, 0x98, 0x57, + 0x4F, 0x4E, 0x7A, 0x49, 0x74, 0x3A, 0x44, 0x2C, 0x7B, 0x1E, 0x0F, 0x1F, + 0xD7, 0xFF, 0xDC, 0x0A, 0x0E, 0xEC, 0x04, 0xE7, 0x4A, 0xFA, 0x9E, 0xCF, + 0x53, 0x07, 0x63, 0xC4, 0x4E, 0xFB, 0xC0, 0xC7, 0x07, 0xE6, 0x29, 0xCD, + 0x56, 0xD6, 0xA8, 0xCA, 0xD2, 0xD4, 0xAD, 0xC6, 0x06, 0xE1, 0x3A, 0xD5, + 0x50, 0xD4, 0x6A, 0xD8, 0xB8, 0xBE, 0x43, 0xBF, 0x2A, 0xD3, 0x1F, 0xCC, + 0x16, 0xEA, 0x2B, 0xF3, 0x43, 0xDC, 0x58, 0xF0, 0xDA, 0xDD, 0x6A, 0xF1, + 0x7A, 0xFB, 0x8C, 0x19, 0xD7, 0x0E, 0x72, 0x25, 0x2D, 0x0E, 0x9E, 0x03, + 0xFF, 0xFB, 0x70, 0xEA, 0xF0, 0xE1, 0x5B, 0xE0, 0x94, 0xC0, 0xC5, 0xCD, + 0xB9, 0xA1, 0x45, 0xB6, 0x90, 0x9E, 0xFC, 0xA3, 0xEE, 0xA5, 0x07, 0x9B, + 0xD3, 0xA6, 0x62, 0xA5, 0x15, 0xB4, 0xAB, 0xB8, 0x30, 0xD5, 0x01, 0xD7, + 0x36, 0xF2, 0xED, 0x08, 0xF3, 0x0B, 0x45, 0x27, 0x7F, 0x26, 0x76, 0x30, + 0x46, 0x23, 0x32, 0x3B, 0x46, 0x0A, 0x86, 0x29, 0xC9, 0xF3, 0x47, 0xFF, + 0xDC, 0xE1, 0xCF, 0xE1, 0xAC, 0xDA, 0xD3, 0xC3, 0xDC, 0xD1, 0xE6, 0xAE, + 0x33, 0xB8, 0xFE, 0xBE, 0xC8, 0xB5, 0xCC, 0xC9, 0x73, 0xC6, 0x7E, 0xBA, + 0x47, 0xBC, 0x0A, 0xBF, 0x16, 0xB0, 0x87, 0xCC, 0x77, 0xBB, 0x5E, 0xCF, + 0xB4, 0xCC, 0xD9, 0xD4, 0x71, 0xE9, 0x40, 0xDE, 0xB5, 0xFF, 0xB8, 0xEB, + 0xD1, 0xFF, 0xE7, 0x08, 0x6C, 0x13, 0xEE, 0x31, 0x82, 0x2E, 0x5A, 0x42, + 0x4F, 0x38, 0x1B, 0x42, 0x87, 0x37, 0xE6, 0x2E, 0xC6, 0x36, 0x94, 0x17, + 0x13, 0x15, 0x3E, 0x00, 0x54, 0xF4, 0x21, 0xF1, 0xC8, 0xFA, 0x7C, 0xF6, + 0xCF, 0xFD, 0x4F, 0xF8, 0x02, 0x01, 0x57, 0xF4, 0xA0, 0x0A, 0x58, 0xEE, + 0xDB, 0x0C, 0x7E, 0xF6, 0x27, 0x0E, 0xD5, 0xFF, 0x77, 0x20, 0xB6, 0x07, + 0x17, 0x25, 0x70, 0x0C, 0x15, 0x18, 0xD8, 0x07, 0xE7, 0x26, 0xE5, 0x20, + 0x44, 0x42, 0xCA, 0x4B, 0x74, 0x34, 0xC5, 0x43, 0x25, 0x26, 0xD2, 0x28, + 0x88, 0x48, 0x13, 0x3A, 0xA4, 0x5D, 0x86, 0x51, 0x7A, 0x46, 0xAC, 0x44, + 0x7E, 0x32, 0x44, 0x2A, 0xEC, 0x2A, 0x04, 0x17, 0xFE, 0x16, 0xF2, 0x05, + 0xB8, 0xF9, 0xD0, 0xF4, 0x52, 0xE0, 0x0F, 0xE5, 0x7A, 0xD7, 0xE4, 0xD7, + 0x54, 0xED, 0x1F, 0xDE, 0x37, 0x02, 0x79, 0xF6, 0xC4, 0x14, 0x7F, 0x1F, + 0x34, 0x33, 0x72, 0x4D, 0xFC, 0x44, 0x49, 0x5F, 0xC7, 0x52, 0x4F, 0x61, + 0x95, 0x5A, 0x9B, 0x5A, 0xE0, 0x4B, 0x00, 0x40, 0x6C, 0x2E, 0x57, 0x1E, + 0xFF, 0x12, 0xDE, 0x07, 0x8C, 0xF6, 0x1D, 0xF4, 0x10, 0xE0, 0x41, 0xDB, + 0x12, 0xEA, 0xFC, 0xD3, 0x1E, 0xF8, 0x11, 0xDF, 0xF4, 0xEA, 0xC5, 0xEB, + 0x3C, 0xE1, 0xC3, 0xF4, 0xF9, 0xE8, 0x35, 0xEF, 0xFF, 0xE6, 0x10, 0xE5, + 0xBB, 0xE1, 0x4F, 0xEC, 0x20, 0xEE, 0xED, 0xFF, 0xBC, 0x0A, 0x5A, 0x1A, + 0xED, 0x21, 0x29, 0x27, 0x1B, 0x28, 0x7B, 0x2A, 0xC0, 0x1E, 0x1B, 0x35, + 0xAF, 0x16, 0x34, 0x3B, 0xD4, 0x12, 0xD7, 0x2C, 0x20, 0x09, 0x7A, 0x1A, + 0x00, 0xE9, 0xED, 0xFD, 0x40, 0xC7, 0x1A, 0xD8, 0xF8, 0xC4, 0x47, 0xCD, + 0xD0, 0xC9, 0xF5, 0xCB, 0x5C, 0xD6, 0xF4, 0xC9, 0x5B, 0xE7, 0xF1, 0xCB, + 0x7B, 0xF1, 0xA0, 0xD5, 0x93, 0xED, 0xC2, 0xDD, 0x2D, 0xE3, 0xB9, 0xE8, + 0x14, 0xDA, 0x15, 0xEB, 0x7C, 0xC9, 0x14, 0xD4, 0x19, 0xC4, 0x1C, 0xD6, + 0x17, 0xE6, 0xA3, 0xFC, 0x8C, 0x02, 0x9B, 0x06, 0x5A, 0xF7, 0x64, 0xF2, + 0x20, 0xFB, 0x3C, 0xF2, 0x4E, 0x10, 0x03, 0x04, 0x84, 0x0D, 0x71, 0x05, + 0xBD, 0xFC, 0xC3, 0xEF, 0x77, 0xF2, 0xFA, 0xE0, 0x57, 0xEA, 0x73, 0xD5, + 0xDC, 0xD1, 0x42, 0xB2, 0x0C, 0xB5, 0xA3, 0x9F, 0x67, 0xA3, 0xEB, 0xA2, + 0x90, 0xAE, 0x54, 0xA7, 0xE8, 0xD0, 0x20, 0xBB, 0xAC, 0xF1, 0xF3, 0xE1, + 0x44, 0x0A, 0x37, 0x10, 0xC6, 0x15, 0x46, 0x2E, 0xE4, 0x33, 0x66, 0x3E, + 0xEF, 0x4E, 0x8C, 0x3B, 0x79, 0x2B, 0xB0, 0x2A, 0xC1, 0xEC, 0xD5, 0x12, + 0x8D, 0xDA, 0x69, 0xEC, 0xC4, 0xDC, 0x32, 0xCD, 0x1B, 0xD0, 0x3B, 0xBC, + 0x65, 0xD9, 0x8E, 0xB9, 0x66, 0xEF, 0x29, 0xD1, 0x51, 0xFA, 0x33, 0xE8, + 0xB2, 0xFD, 0x3D, 0xE9, 0xB4, 0xF4, 0x97, 0xEF, 0x94, 0xE8, 0x49, 0xEA, + 0x59, 0xE8, 0x82, 0xDF, 0x25, 0xE0, 0x60, 0xF4, 0x4D, 0xE7, 0x51, 0x12, + 0x8F, 0x19, 0x83, 0x22, 0x34, 0x46, 0x2E, 0x37, 0x0F, 0x4F, 0xA0, 0x4E, + 0xA6, 0x45, 0xA8, 0x56, 0x18, 0x2C, 0x4B, 0x4F, 0x76, 0x14, 0x72, 0x3E, + 0xE7, 0x02, 0x82, 0x1D, 0xE5, 0xD7, 0xD9, 0xF4, 0x5D, 0xD3, 0x96, 0xF3, + 0xA6, 0xF8, 0xC5, 0xFA, 0x4A, 0x06, 0xEE, 0xFF, 0xC3, 0x06, 0x05, 0x08, + 0x83, 0x12, 0xE2, 0x04, 0xD0, 0x08, 0x70, 0x0A, 0x6B, 0xF3, 0xAB, 0x16, + 0xBA, 0xFE, 0xFB, 0x19, 0xB8, 0x04, 0x8A, 0x01, 0xE6, 0x00, 0x54, 0xE4, + 0x6B, 0x17, 0x4C, 0xFA, 0x6D, 0x1C, 0xF2, 0x1C, 0x18, 0x02, 0x4B, 0x14, + 0xC5, 0x05, 0x5D, 0x0B, 0xC5, 0x21, 0xFD, 0x1E, 0xA5, 0x25, 0x24, 0x2C, + 0xA7, 0x1B, 0xD9, 0x20, 0x5D, 0x18, 0x64, 0x17, 0x2C, 0x12, 0xE9, 0x16, + 0x09, 0xF8, 0x38, 0xF7, 0x1E, 0xDE, 0xF5, 0xD6, 0x16, 0xCE, 0xA1, 0xD0, + 0xCF, 0xC6, 0xEC, 0xCF, 0x02, 0xD7, 0x81, 0xDE, 0x90, 0x03, 0x00, 0xF6, + 0x1C, 0x3C, 0xD5, 0x13, 0x74, 0x56, 0x8C, 0x34, 0x19, 0x5C, 0x57, 0x51, + 0x20, 0x5C, 0x24, 0x62, 0x47, 0x44, 0xDA, 0x52, 0xF5, 0x1D, 0x4D, 0x2D, + 0xAE, 0xFC, 0x39, 0x0B, 0xAB, 0xEF, 0x3A, 0xF3, 0x06, 0xEC, 0xA5, 0xE1, + 0xD7, 0xEC, 0xE7, 0xDA, 0x20, 0x00, 0xDF, 0xDF, 0xEB, 0x11, 0x81, 0xE7, + 0x44, 0x10, 0x4F, 0xF1, 0xEB, 0x01, 0x3E, 0x02, 0x4E, 0xF3, 0x30, 0x07, + 0xD8, 0xF1, 0xEA, 0xF2, 0x8A, 0x00, 0x3B, 0xEF, 0x00, 0x10, 0x8F, 0x07, + 0x57, 0x19, 0x8E, 0x26, 0x0C, 0x26, 0xCD, 0x44, 0x4C, 0x37, 0xFE, 0x4A, + 0x7E, 0x35, 0xE8, 0x3A, 0x1D, 0x1F, 0xE7, 0x2F, 0xA9, 0x07, 0x17, 0x1B, + 0x61, 0x02, 0x93, 0x05, 0xCA, 0xEF, 0x3C, 0xE6, 0x55, 0xD9, 0xD0, 0xCE, + 0x3F, 0xE3, 0xA1, 0xDD, 0x41, 0xEF, 0x37, 0xF0, 0x33, 0xF7, 0xA5, 0x02, + 0x3D, 0xFF, 0x4F, 0x09, 0xF5, 0x00, 0x1D, 0x06, 0xCE, 0xFB, 0xFD, 0x05, + 0xC7, 0xFD, 0xF4, 0xFF, 0x0E, 0xFA, 0xB9, 0xF5, 0x07, 0xEA, 0xC4, 0xE6, + 0x30, 0xF8, 0x2A, 0xE9, 0x53, 0x16, 0x0D, 0x05, 0xBB, 0x08, 0x57, 0xFC, + 0x2F, 0xEC, 0x57, 0xE3, 0x14, 0xEF, 0xEF, 0xF7, 0xEE, 0xF3, 0x03, 0x0D, + 0xC6, 0xE6, 0x1A, 0x0C, 0xD4, 0xD9, 0x49, 0x09, 0x49, 0xDB, 0xBA, 0x07, + 0x3B, 0xD0, 0xF4, 0xF2, 0xDC, 0xB3, 0x74, 0xC5, 0xF3, 0xAB, 0x3F, 0xAD, + 0xF0, 0xAE, 0xA2, 0xA5, 0xE7, 0xBF, 0x21, 0xAB, 0xA2, 0xE3, 0x84, 0xCE, + 0xCE, 0x07, 0xE8, 0xF4, 0x56, 0x21, 0x11, 0x11, 0x6A, 0x27, 0xEE, 0x2D, + 0xF2, 0x23, 0xDF, 0x40, 0x27, 0x13, 0x81, 0x2B, 0xF5, 0xF8, 0x56, 0x00, + 0xB2, 0xE1, 0x14, 0xE3, 0x89, 0xC8, 0x31, 0xC5, 0x52, 0xB7, 0x5E, 0xAE, + 0x19, 0xBD, 0x9F, 0xB9, 0x5F, 0xD6, 0xD6, 0xC0, 0x1F, 0xEB, 0x60, 0xC1, + 0x8D, 0xE9, 0x5B, 0xDB, 0xD4, 0xEF, 0x53, 0xE9, 0x1E, 0xFF, 0xD1, 0xDE, + 0x98, 0xF4, 0xDF, 0xD6, 0x93, 0xF3, 0x10, 0xE0, 0xEF, 0xF9, 0xE7, 0xF7, + 0xB6, 0xF5, 0xF9, 0x10, 0xB5, 0x12, 0xF2, 0x21, 0x7F, 0x3A, 0x00, 0x2A, + 0xE7, 0x37, 0xAB, 0x29, 0xF1, 0x26, 0x86, 0x27, 0x0F, 0x17, 0x99, 0x20, + 0x83, 0xF8, 0xD7, 0x0C, 0xBE, 0xE9, 0x3B, 0xF0, 0x33, 0xE7, 0xD0, 0xD2, + 0x40, 0xE8, 0xBC, 0xDD, 0x87, 0xF4, 0xE3, 0xF3, 0x5A, 0x0C, 0x03, 0x06, + 0x0E, 0x17, 0xDB, 0x1E, 0xE7, 0x24, 0xC6, 0x20, 0x33, 0x2F, 0x04, 0x15, + 0x03, 0x20, 0xC0, 0x1F, 0x4E, 0x19, 0x29, 0x27, 0xE9, 0x0A, 0x0F, 0x0F, + 0x0C, 0xFF, 0x4B, 0x02, 0x75, 0x29, 0x23, 0x16, 0x00, 0x4E, 0x56, 0x27, + 0xF5, 0x31, 0x4B, 0x24, 0x29, 0x25, 0x11, 0x37, 0x28, 0x3E, 0x19, 0x53, + 0x4F, 0x38, 0x5F, 0x4B, 0xE3, 0x1B, 0x5F, 0x40, 0x09, 0x0E, 0x13, 0x3C, + 0xAD, 0x10, 0x1B, 0x30, 0xD6, 0x0A, 0x7D, 0x16, 0x91, 0xFF, 0x58, 0xFD, + 0xF4, 0xEF, 0xCC, 0xF1, 0x8B, 0xE4, 0x1B, 0xF8, 0x44, 0xF7, 0x7B, 0x14, + 0x2F, 0x18, 0xEF, 0x30, 0x22, 0x3D, 0x1B, 0x49, 0x5A, 0x59, 0x58, 0x5D, + 0x34, 0x62, 0x23, 0x65, 0x07, 0x54, 0x9F, 0x5C, 0x59, 0x30, 0xBF, 0x45, + 0x9F, 0x0F, 0x45, 0x21, 0xFA, 0xF7, 0x42, 0xF3, 0x4F, 0xE5, 0xED, 0xCF, + 0xAE, 0xE2, 0x19, 0xCA, 0xA9, 0xF1, 0x4E, 0xD9, 0xCF, 0x07, 0x29, 0xE1, + 0x24, 0x1A, 0xDF, 0xEA, 0x83, 0x1B, 0xE5, 0x04, 0x9A, 0x0D, 0x45, 0x18, + 0x7B, 0xEF, 0x3C, 0x14, 0x6B, 0xDB, 0xC9, 0x11, 0x1A, 0xEA, 0x82, 0x17, + 0x96, 0x00, 0xB5, 0x0E, 0x2F, 0x1E, 0xB4, 0x15, 0xA0, 0x3B, 0x63, 0x34, + 0x88, 0x45, 0xD5, 0x3D, 0x99, 0x35, 0x22, 0x23, 0x06, 0x1F, 0xF3, 0x11, + 0x63, 0xFE, 0xFA, 0xFD, 0x11, 0xE0, 0x33, 0xE7, 0xEF, 0xCC, 0x90, 0xD9, + 0x70, 0xC8, 0xFA, 0xC4, 0x7B, 0xE1, 0x02, 0xC4, 0x6B, 0xF3, 0x56, 0xD7, + 0xAF, 0xFB, 0x06, 0xF7, 0xD8, 0xFD, 0x12, 0x07, 0x77, 0xF4, 0xD6, 0xF9, + 0xD5, 0xE6, 0x1B, 0xE4, 0x2D, 0xE9, 0x19, 0xD7, 0x09, 0xF0, 0x89, 0xD1, + 0xA9, 0xD8, 0x02, 0xCB, 0xB0, 0xD2, 0xA1, 0xD6, 0xAB, 0xFA, 0xD2, 0xF3, + 0x85, 0x04, 0xA6, 0xF4, 0xAB, 0xE5, 0x86, 0xE4, 0x8B, 0xE5, 0x7E, 0xF5, + 0xC3, 0xFB, 0x87, 0x02, 0xCB, 0xFB, 0xFE, 0xED, 0x5C, 0xF0, 0x76, 0xDF, + 0x69, 0xEC, 0xE7, 0xDA, 0xA1, 0xE0, 0xB0, 0xCB, 0x12, 0xC2, 0xCD, 0xB3, + 0x56, 0xB5, 0xB6, 0xAA, 0x40, 0xB3, 0x7C, 0xAC, 0x20, 0xB7, 0x42, 0xBA, + 0x03, 0xDA, 0x30, 0xD7, 0x14, 0x01, 0xF0, 0xF9, 0x17, 0x17, 0xA1, 0x24, + 0x6A, 0x29, 0x03, 0x40, 0x21, 0x3F, 0x68, 0x4C, 0x31, 0x34, 0x6B, 0x42, + 0xED, 0x0B, 0xDF, 0x14, 0x3F, 0xF0, 0x9D, 0xE6, 0x2A, 0xDB, 0x9D, 0xBD, + 0xF0, 0xC7, 0x5A, 0x9D, 0x30, 0xBF, 0xA7, 0xAE, 0x17, 0xBF, 0x36, 0xCF, + 0xFF, 0xD4, 0x8F, 0xD8, 0x79, 0xEB, 0x30, 0xF0, 0x12, 0xE6, 0x9F, 0x06, + 0x4D, 0xDE, 0x52, 0xFC, 0xA7, 0xDE, 0xD1, 0xF8, 0x3B, 0xEE, 0x6B, 0x0C, + 0x5F, 0x04, 0xD3, 0x0F, 0x62, 0x06, 0x70, 0x17, 0xF3, 0x07, 0xC8, 0x38, + 0x3B, 0x1B, 0xBF, 0x44, 0xFB, 0x18, 0x73, 0x2F, 0x19, 0x08, 0xFD, 0x22, + 0xE7, 0x00, 0x69, 0x0D, 0x5B, 0xF6, 0x61, 0xED, 0xDA, 0xE8, 0x99, 0xE1, + 0x90, 0xE5, 0xC0, 0xD3, 0x5E, 0xF6, 0x6B, 0xD7, 0xA0, 0xFE, 0x55, 0xEE, + 0x22, 0x0A, 0x32, 0x05, 0x2E, 0x19, 0x18, 0x14, 0x12, 0x1C, 0x3A, 0x11, + 0xE4, 0x1B, 0x36, 0xFB, 0x5E, 0x15, 0x58, 0xEC, 0x45, 0x06, 0xB8, 0xEC, + 0x20, 0xEF, 0x42, 0xDE, 0x23, 0xED, 0xE4, 0xDE, 0x80, 0x12, 0x86, 0xFD, + 0x0A, 0x2E, 0xDF, 0x02, 0x3B, 0x1B, 0xC0, 0xF5, 0x5B, 0x0A, 0x03, 0x09, + 0xC5, 0x12, 0x95, 0x18, 0x7C, 0x15, 0x01, 0x08, 0xDA, 0x17, 0x34, 0x03, + 0x85, 0x10, 0xDD, 0xFE, 0xCD, 0xF5, 0x60, 0xF1, 0xF3, 0xD3, 0xC5, 0xE0, + 0x1D, 0xC7, 0x5C, 0xCE, 0xF9, 0xD0, 0xD5, 0xBF, 0x73, 0xE2, 0xDF, 0xC0, + 0x8E, 0xFE, 0xA0, 0xE0, 0x60, 0x19, 0x0D, 0x0A, 0x08, 0x33, 0xF9, 0x37, + 0x96, 0x40, 0xA2, 0x5E, 0x5A, 0x46, 0x08, 0x62, 0x4B, 0x4A, 0xAC, 0x47, + 0x78, 0x33, 0xA0, 0x2A, 0x5A, 0x0B, 0xF4, 0x0D, 0x96, 0xED, 0x0D, 0xE9, + 0xA9, 0xD6, 0x05, 0xC7, 0xE4, 0xC7, 0xFF, 0xBC, 0xA7, 0xC8, 0x5B, 0xCE, + 0xF9, 0xD9, 0x42, 0xED, 0xCC, 0xFD, 0x2D, 0x0D, 0x90, 0x18, 0x19, 0x16, + 0x22, 0x10, 0x6A, 0x0A, 0xF8, 0xF5, 0x55, 0x0E, 0xA5, 0xEC, 0xDC, 0x22, + 0xE5, 0xF2, 0xB5, 0x2D, 0x59, 0xF8, 0xFD, 0x32, 0x92, 0x05, 0xCA, 0x3B, + 0x66, 0x19, 0xC2, 0x42, 0xBF, 0x1E, 0x72, 0x3E, 0x07, 0x16, 0x01, 0x2D, + 0xC7, 0x03, 0x7D, 0x15, 0x4A, 0xE7, 0x6D, 0xEF, 0x24, 0xE4, 0x9E, 0xD6, + 0x11, 0xDA, 0xB6, 0xC9, 0xB8, 0xC9, 0xFE, 0xC6, 0x6C, 0xE6, 0xAE, 0xD7, + 0x03, 0x14, 0xEE, 0xE9, 0xE9, 0x2A, 0x4A, 0xF7, 0xD7, 0x2C, 0x48, 0x00, + 0x12, 0x14, 0xCA, 0xFC, 0x55, 0xED, 0xC4, 0xF1, 0x89, 0xDF, 0xB3, 0xEA, + 0x83, 0xD8, 0x93, 0xDB, 0xF9, 0xCC, 0x8B, 0xCB, 0x0E, 0xED, 0xE7, 0xDB, + 0xCD, 0x1E, 0x92, 0xFC, 0xB2, 0x1B, 0xE2, 0xFA, 0xAE, 0x06, 0x66, 0xE7, + 0xF7, 0x12, 0xE2, 0xF6, 0xD0, 0x11, 0xA9, 0x0B, 0xFE, 0xF3, 0x85, 0x06, + 0x57, 0xE5, 0x3C, 0xF9, 0x2A, 0xED, 0x2C, 0xE7, 0x3C, 0xE9, 0x7B, 0xD1, + 0x28, 0xBF, 0x32, 0xBA, 0x46, 0xA4, 0x30, 0xB6, 0x0D, 0xAC, 0xD9, 0xB9, + 0x5D, 0xB9, 0x3E, 0xBC, 0x64, 0xD0, 0xE2, 0xD2, 0x43, 0xF7, 0x10, 0xFC, + 0x96, 0x19, 0x9C, 0x24, 0xD4, 0x26, 0x96, 0x35, 0xC3, 0x31, 0x5E, 0x36, + 0xC8, 0x21, 0x5B, 0x27, 0x2B, 0xEA, 0x97, 0xFB, 0x94, 0xC2, 0x11, 0xCF, + 0x50, 0xB0, 0x97, 0xBD, 0x83, 0x9E, 0x3E, 0xAD, 0x10, 0xAD, 0x2C, 0xA1, + 0x70, 0xD0, 0x44, 0xB3, 0xD8, 0xEC, 0xD4, 0xCE, 0x4F, 0x03, 0xE1, 0xE0, + 0x0F, 0xFE, 0xBC, 0xEE, 0xC5, 0xE9, 0xD9, 0xF5, 0xDD, 0xE2, 0xEE, 0xF7, + 0xC6, 0xE2, 0x93, 0xFF, 0x66, 0xF0, 0x07, 0x02, 0x02, 0x0E, 0x1A, 0x09, + 0x01, 0x1B, 0xCA, 0x22, 0x66, 0x25, 0x5F, 0x3B, 0x7B, 0x27, 0x9F, 0x33, + 0x3B, 0x1A, 0xD3, 0x29, 0xD8, 0x0B, 0xA9, 0x15, 0xC4, 0x06, 0xA7, 0xF4, + 0x68, 0xFA, 0xF3, 0xE7, 0xBD, 0xE7, 0x6A, 0xE1, 0xDD, 0xF8, 0x41, 0xF1, + 0xB6, 0x0E, 0x3E, 0x13, 0xC6, 0x1E, 0xAA, 0x2F, 0x13, 0x24, 0x12, 0x3B, + 0x74, 0x0F, 0x77, 0x3E, 0x9C, 0x01, 0x18, 0x34, 0xDD, 0x0E, 0x95, 0x1E, + 0x26, 0x1B, 0x85, 0x17, 0x2C, 0x11, 0x58, 0x08, 0xB4, 0x12, 0x10, 0xFD, + 0x49, 0x32, 0x02, 0x25, 0x80, 0x40, 0x64, 0x40, 0x8C, 0x31, 0x8B, 0x29, + 0xE2, 0x2B, 0x66, 0x2A, 0x5E, 0x32, 0xBA, 0x3A, 0x68, 0x36, 0x4C, 0x31, + 0x67, 0x33, 0x1B, 0x2B, 0x92, 0x30, 0xA9, 0x2A, 0xAC, 0x2E, 0x2E, 0x26, + 0xE1, 0x10, 0x42, 0x1E, 0xDD, 0xEE, 0x5B, 0x0D, 0x46, 0xED, 0x4B, 0xF6, + 0x20, 0x07, 0xC7, 0xF2, 0x94, 0x24, 0xCD, 0x05, 0x8B, 0x37, 0x35, 0x25, + 0x4F, 0x4F, 0x06, 0x4E, 0x22, 0x62, 0x6A, 0x5E, 0x65, 0x64, 0x91, 0x58, + 0xBB, 0x55, 0xCA, 0x4F, 0x61, 0x30, 0x43, 0x31, 0x52, 0x08, 0xDF, 0xFF, + 0x30, 0xF5, 0xCD, 0xDE, 0xAA, 0xED, 0x5D, 0xD0, 0x71, 0xEC, 0xF6, 0xC4, + 0x27, 0xFA, 0xCC, 0xD1, 0x9C, 0x08, 0x3D, 0xF9, 0xE0, 0x0C, 0x34, 0x19, + 0xEB, 0x08, 0x92, 0x20, 0xDD, 0x07, 0x09, 0x1A, 0x36, 0x07, 0xB6, 0x09, + 0x43, 0x09, 0x93, 0x07, 0xCF, 0x09, 0xFE, 0x16, 0x66, 0x0A, 0x41, 0x22, + 0x19, 0x1E, 0x46, 0x28, 0xC9, 0x31, 0xD7, 0x28, 0x81, 0x28, 0x1D, 0x23, + 0x60, 0x0A, 0xFB, 0x0F, 0x6F, 0xFB, 0x02, 0xFC, 0x85, 0xF6, 0x62, 0xE7, + 0xDD, 0xF2, 0x0E, 0xDA, 0xC1, 0xD9, 0x3D, 0xCF, 0x4A, 0xCB, 0x54, 0xE1, + 0x09, 0xE2, 0xA2, 0x0C, 0x7A, 0xF7, 0x18, 0x1D, 0x10, 0x00, 0x18, 0x15, + 0x10, 0x03, 0x22, 0x0C, 0x0D, 0xF8, 0xA0, 0xFB, 0xD1, 0xE4, 0xBA, 0xEE, + 0x4A, 0xDF, 0xE9, 0xF7, 0x34, 0xD6, 0x80, 0xED, 0x14, 0xCA, 0x4A, 0xD7, + 0x5C, 0xDE, 0x83, 0xE8, 0xF5, 0x01, 0xF1, 0x02, 0x55, 0x02, 0x03, 0xF9, + 0x6A, 0xFC, 0xA6, 0xEA, 0x62, 0x0C, 0x5A, 0xF0, 0x03, 0xFE, 0x3C, 0xED, + 0x7D, 0xDF, 0x32, 0xEA, 0xE4, 0xD6, 0x34, 0xF0, 0xC9, 0xD2, 0xB7, 0xE8, + 0xA8, 0xD0, 0xFA, 0xD3, 0x42, 0xC9, 0x5F, 0xBF, 0x2D, 0xBE, 0xF8, 0xBC, + 0xFF, 0xB9, 0xE1, 0xC3, 0xF2, 0xC4, 0x1A, 0xD1, 0x96, 0xE5, 0x43, 0xEF, + 0xE5, 0x0F, 0xD5, 0x18, 0x1B, 0x26, 0x29, 0x40, 0xDF, 0x25, 0x35, 0x54, + 0xA4, 0x2A, 0xCE, 0x47, 0x4B, 0x2A, 0xD0, 0x1B, 0xD1, 0x0A, 0x60, 0xE7, + 0xD1, 0xE8, 0x23, 0xCE, 0x13, 0xD7, 0x01, 0xCD, 0x5F, 0xC9, 0xC7, 0xCA, + 0x34, 0xD0, 0xD8, 0xCB, 0x3A, 0xE6, 0xC9, 0xD7, 0x44, 0xF0, 0x47, 0xE4, + 0x0F, 0xFC, 0x94, 0xF0, 0x43, 0x00, 0xD0, 0x02, 0x1C, 0xEA, 0xC1, 0x0D, + 0x95, 0xE3, 0x1D, 0x08, 0x78, 0xF3, 0xEB, 0x04, 0x55, 0x03, 0x8C, 0x12, + 0x94, 0x1A, 0xA5, 0x1D, 0x78, 0x32, 0x35, 0x29, 0xB7, 0x40, 0x10, 0x36, + 0xF7, 0x39, 0xC6, 0x1C, 0xD9, 0x1A, 0x0A, 0xFF, 0xB2, 0xEF, 0xD6, 0xF5, + 0x25, 0xDE, 0x0D, 0xEA, 0x8F, 0xD2, 0x7C, 0xD1, 0xE4, 0xD0, 0x62, 0xCE, + 0x39, 0xFB, 0xBD, 0xEC, 0x8F, 0x18, 0x77, 0xFF, 0x8D, 0x17, 0x17, 0x05, + 0xAE, 0x1E, 0xAD, 0x08, 0xDA, 0x1D, 0x96, 0x02, 0x9F, 0x00, 0x4E, 0xF9, + 0x84, 0xF6, 0xB8, 0x04, 0x57, 0xF6, 0xF7, 0x04, 0xF6, 0xE8, 0x72, 0xE4, + 0xCE, 0xFC, 0x6B, 0xDA, 0x11, 0x21, 0xE1, 0xFE, 0xC3, 0x1D, 0x1F, 0x19, + 0x0E, 0x14, 0xAD, 0x0D, 0x89, 0x28, 0xE1, 0x0E, 0x2B, 0x26, 0x7C, 0x12, + 0x26, 0x09, 0x3B, 0x01, 0xDF, 0xFE, 0x0D, 0x01, 0xB7, 0x01, 0xF8, 0x04, + 0xFB, 0xFE, 0xFE, 0xF0, 0xF1, 0xE2, 0x67, 0xE0, 0x16, 0xC3, 0xE3, 0xE7, + 0xDE, 0xB7, 0xC1, 0xE3, 0x85, 0xC3, 0x32, 0xE6, 0x61, 0xDC, 0x6C, 0x05, + 0x9A, 0x08, 0xE1, 0x27, 0x36, 0x3B, 0x98, 0x45, 0x0B, 0x4E, 0x0B, 0x60, + 0x80, 0x4A, 0x8D, 0x62, 0x90, 0x3F, 0xAC, 0x3E, 0xF5, 0x20, 0x6E, 0x16, + 0x85, 0xF2, 0xC7, 0xFB, 0xCA, 0xCF, 0xF8, 0xE1, 0xB9, 0xC4, 0x0E, 0xC8, + 0x3E, 0xDA, 0x48, 0xC1, 0xE1, 0xFE, 0xCA, 0xD7, 0x37, 0x08, 0x1C, 0xF3, + 0xC6, 0x03, 0xDB, 0x03, 0xFD, 0x06, 0x7B, 0x11, 0x5A, 0x08, 0xBD, 0x17, + 0x3D, 0x0B, 0x14, 0x0F, 0x72, 0x13, 0xD7, 0x08, 0x51, 0x1B, 0x30, 0x11, + 0x59, 0x27, 0x9D, 0x20, 0x9E, 0x3A, 0x07, 0x32, 0x4D, 0x4C, 0x0F, 0x3C, + 0x7A, 0x3E, 0x30, 0x25, 0xD5, 0x1D, 0xF1, 0x09, 0x12, 0xFF, 0x2D, 0xFC, + 0x6F, 0xE7, 0xC4, 0xE5, 0x21, 0xE6, 0xDF, 0xCC, 0x3C, 0xE9, 0xBB, 0xBD, + 0x5E, 0xF8, 0x55, 0xD4, 0xDC, 0x09, 0x0B, 0xFA, 0xC7, 0x0F, 0xCB, 0x13, + 0x1F, 0x0C, 0x3F, 0x1C, 0x27, 0x01, 0x4D, 0x13, 0x4C, 0xE5, 0x70, 0xF2, + 0x45, 0xD7, 0xF8, 0xE1, 0xB4, 0xE0, 0x19, 0xF0, 0x04, 0xDF, 0x3C, 0xE7, + 0x4A, 0xE9, 0x8D, 0xD9, 0xBD, 0x0B, 0x1A, 0xF3, 0xA4, 0x10, 0xFD, 0x02, + 0x43, 0xF3, 0xDC, 0xEC, 0x5C, 0xF1, 0xE4, 0xEC, 0xC9, 0x09, 0x97, 0xF8, + 0xA1, 0x0B, 0xD2, 0xE5, 0xB3, 0x01, 0x0A, 0xE5, 0xE7, 0xF7, 0x04, 0xF7, + 0x7A, 0xE1, 0xDF, 0xF3, 0x05, 0xC3, 0xF7, 0xDF, 0xE0, 0xAB, 0x44, 0xC9, + 0xE5, 0xA3, 0x92, 0xB8, 0x36, 0xAD, 0xF4, 0xB6, 0x1E, 0xD1, 0xD3, 0xD8, + 0x26, 0xF7, 0x87, 0x03, 0x26, 0x13, 0xEF, 0x1C, 0x55, 0x2C, 0x1B, 0x34, + 0x93, 0x37, 0xA5, 0x48, 0x33, 0x24, 0xDB, 0x40, 0x20, 0xF7, 0x0E, 0x1D, + 0x8C, 0xCE, 0xC5, 0xF1, 0x4E, 0xC0, 0x22, 0xC6, 0xA7, 0xBE, 0x9F, 0xAC, + 0x81, 0xB2, 0x19, 0xB9, 0xA7, 0xB4, 0x9A, 0xD3, 0x33, 0xD6, 0x70, 0xD6, + 0xA5, 0xE8, 0x6F, 0xD3, 0x86, 0xE5, 0x71, 0xE0, 0xBB, 0xE3, 0x0C, 0xE6, + 0x47, 0xE1, 0xA2, 0xE9, 0xF2, 0xEF, 0x80, 0xF8, 0x18, 0x04, 0x47, 0xFC, + 0xF1, 0x09, 0x3F, 0x0B, 0x80, 0x0F, 0x1A, 0x2D, 0x03, 0x1A, 0xA6, 0x38, + 0x51, 0x17, 0xC4, 0x27, 0xAB, 0x07, 0xFD, 0x03, 0x28, 0x06, 0x34, 0xEC, + 0xB2, 0xF8, 0x18, 0xE5, 0x22, 0xEF, 0x7B, 0xE8, 0x8E, 0xF7, 0x3C, 0xE8, + 0xF8, 0x05, 0x7B, 0xF8, 0xCF, 0x1C, 0x9E, 0x17, 0xEB, 0x2D, 0x8F, 0x24, + 0x79, 0x32, 0x09, 0x2D, 0xB8, 0x31, 0x52, 0x2B, 0x20, 0x2D, 0x89, 0x16, + 0x04, 0x19, 0xA9, 0x0B, 0x1D, 0x12, 0xDA, 0x18, 0xEA, 0x0C, 0x82, 0x13, + 0x8D, 0xFD, 0xB2, 0x04, 0x41, 0x15, 0x77, 0x14, 0x9D, 0x44, 0xF1, 0x29, + 0xF0, 0x43, 0x1B, 0x25, 0x8D, 0x34, 0x62, 0x21, 0xBC, 0x45, 0x96, 0x2D, + 0x7E, 0x48, 0x0C, 0x36, 0x77, 0x39, 0x98, 0x35, 0x97, 0x2F, 0xFF, 0x33, + 0x0C, 0x1A, 0x67, 0x34, 0x4C, 0x03, 0x81, 0x24, 0x13, 0xFE, 0xEF, 0xFB, + 0xA7, 0xF3, 0xD4, 0xDC, 0x72, 0xE5, 0xDD, 0xDE, 0xC3, 0xF9, 0x49, 0xFB, + 0x9E, 0x25, 0x7E, 0x1F, 0x81, 0x4B, 0x16, 0x40, 0x2D, 0x5F, 0x49, 0x58, + 0xE8, 0x61, 0xA6, 0x63, 0xD6, 0x5B, 0x2E, 0x5E, 0xC6, 0x45, 0xA4, 0x42, + 0xB5, 0x20, 0xCC, 0x20, 0xDB, 0xFA, 0x42, 0x0A, 0x41, 0xE3, 0x98, 0xF7, + 0xF8, 0xDC, 0xFD, 0xEC, 0xB5, 0xE3, 0x41, 0xF6, 0x1B, 0xFC, 0xD0, 0xFF, + 0xCB, 0x1C, 0xDA, 0xFE, 0x9E, 0x2A, 0x1C, 0xFF, 0xCB, 0x15, 0x4B, 0x08, + 0x17, 0xF1, 0x3D, 0x11, 0xF7, 0xE7, 0xAE, 0x13, 0x75, 0xFA, 0x85, 0x16, + 0xA5, 0x03, 0xD8, 0x1D, 0x65, 0x09, 0x9F, 0x25, 0xED, 0x1B, 0x87, 0x29, + 0xAC, 0x29, 0x0F, 0x28, 0x23, 0x1D, 0x08, 0x0F, 0x8D, 0x08, 0xE3, 0xF5, + 0x85, 0xEE, 0xD8, 0xEA, 0xCD, 0xCD, 0x75, 0xE9, 0xA1, 0xBF, 0x92, 0xE4, + 0xCC, 0xD2, 0x90, 0xDA, 0xFE, 0xF8, 0xA3, 0xE5, 0xE7, 0x09, 0x7E, 0xEE, + 0x02, 0x0D, 0x6A, 0xF9, 0x82, 0x06, 0xC1, 0x08, 0xC4, 0xF8, 0x4C, 0xFF, + 0xF0, 0xE5, 0x7D, 0xDA, 0x2C, 0xDF, 0xB8, 0xD4, 0x31, 0xDD, 0xAE, 0xE4, + 0x7E, 0xD3, 0x6D, 0xD5, 0xC8, 0xE5, 0x56, 0xCE, 0xB3, 0x0C, 0x52, 0xED, + 0x8D, 0x11, 0xFB, 0xF0, 0xB1, 0x02, 0xEE, 0xD9, 0x04, 0x00, 0xCD, 0xF3, + 0x12, 0xF3, 0x01, 0x0E, 0x47, 0xEA, 0x10, 0xF6, 0xFF, 0xF0, 0xC4, 0xDF, + 0xBA, 0xEC, 0x5E, 0xD6, 0xE8, 0xD4, 0x20, 0xD0, 0x51, 0xB9, 0xBD, 0xCB, + 0xC1, 0xA8, 0x4C, 0xBB, 0xB1, 0xA2, 0x24, 0xA8, 0x9C, 0xA7, 0x0F, 0xB3, + 0xE4, 0xBC, 0x19, 0xDB, 0xAB, 0xE8, 0xC4, 0x00, 0xEC, 0x20, 0x8C, 0x1B, + 0xA8, 0x44, 0x93, 0x27, 0x72, 0x46, 0x57, 0x29, 0x48, 0x28, 0x7B, 0x24, + 0xE1, 0xF6, 0x62, 0x08, 0x48, 0xCD, 0x28, 0xDB, 0x57, 0xBB, 0x4E, 0xB7, + 0x09, 0xC2, 0xC0, 0xA0, 0x6C, 0xD5, 0x55, 0xA3, 0x37, 0xE5, 0x26, 0xC3, + 0x90, 0xF3, 0x29, 0xE5, 0x74, 0xF5, 0x65, 0xFD, 0x2B, 0xEC, 0xC0, 0x0A, + 0xAA, 0xE9, 0xB2, 0x07, 0x40, 0xE1, 0x03, 0x05, 0x33, 0xDA, 0x82, 0x11, + 0xDC, 0xEC, 0x39, 0x0E, 0x0F, 0x11, 0xF9, 0xFF, 0x07, 0x2A, 0x62, 0x0A, + 0xE3, 0x34, 0x60, 0x1B, 0x34, 0x25, 0xCB, 0x23, 0x62, 0xFF, 0x73, 0x25, + 0x74, 0xF4, 0xF1, 0x10, 0x3F, 0xEF, 0x0F, 0xEE, 0x42, 0xE5, 0xB3, 0xE7, + 0x7A, 0xE1, 0x63, 0xEA, 0x28, 0xEA, 0x5C, 0xF8, 0xC6, 0xF7, 0x7F, 0x13, + 0x5D, 0x06, 0xFA, 0x1D, 0x5B, 0x0B, 0x2D, 0x1A, 0xD5, 0xF6, 0xAE, 0x12, + 0xB1, 0xE7, 0xF4, 0xF9, 0xA6, 0xED, 0x16, 0xDB, 0x9B, 0xF8, 0x55, 0xDB, + 0x8E, 0xF2, 0xD4, 0xE0, 0x94, 0xEF, 0x0C, 0xE4, 0x99, 0x07, 0xD8, 0x04, + 0xA1, 0x14, 0xC8, 0x1A, 0x96, 0x05, 0x83, 0x0D, 0x41, 0x03, 0x89, 0x02, + 0x70, 0x17, 0xC7, 0x03, 0x95, 0x14, 0x32, 0x05, 0xC7, 0x03, 0xE3, 0x0C, + 0x26, 0x02, 0xD6, 0x13, 0xE3, 0xFD, 0x86, 0x13, 0xD1, 0xEE, 0xE6, 0x0E, + 0x4A, 0xD7, 0x58, 0xF4, 0x15, 0xC3, 0x61, 0xD9, 0x7A, 0xC9, 0xD7, 0xD2, + 0x5B, 0xF0, 0xF4, 0xD9, 0xF7, 0x0D, 0x77, 0xF5, 0x19, 0x22, 0x8B, 0x27, + 0x72, 0x42, 0xA9, 0x4F, 0xBC, 0x57, 0xA3, 0x51, 0xD4, 0x4D, 0x0D, 0x3F, + 0xA2, 0x2A, 0x93, 0x21, 0xB4, 0x07, 0xA1, 0xEA, 0x99, 0xF2, 0x17, 0xBE, + 0xCC, 0xED, 0x71, 0xB6, 0x5D, 0xEB, 0x86, 0xB8, 0x29, 0xE5, 0x07, 0xD2, + 0x5F, 0xEE, 0x9C, 0xFB, 0xE7, 0xFB, 0xD8, 0x14, 0x87, 0xF8, 0x87, 0x12, + 0xC3, 0xF2, 0x7D, 0x04, 0xF7, 0xEE, 0x0F, 0x01, 0x3A, 0xEA, 0xED, 0xFE, + 0x10, 0xF6, 0x4D, 0x04, 0x24, 0x12, 0xA5, 0x12, 0x27, 0x2E, 0x78, 0x16, + 0xCA, 0x34, 0x7F, 0x19, 0x22, 0x33, 0xA5, 0x23, 0xB8, 0x2A, 0xEF, 0x14, + 0xA9, 0x15, 0x86, 0xFE, 0x3F, 0xFC, 0x8F, 0xE9, 0x52, 0xEF, 0xE6, 0xE8, + 0xDE, 0xE4, 0x57, 0xF0, 0x78, 0xD9, 0x90, 0xEF, 0xD2, 0xEF, 0x53, 0x03, + 0x08, 0x12, 0xDB, 0x0A, 0xCE, 0x24, 0x5B, 0x05, 0xCE, 0x20, 0xCE, 0xFF, + 0xB5, 0x0A, 0x09, 0xF1, 0x68, 0xF4, 0x2B, 0xE6, 0x8B, 0xF3, 0xE7, 0xEB, + 0xCB, 0xEE, 0xA8, 0xF2, 0x50, 0xD6, 0xD5, 0xED, 0x15, 0xE2, 0xFB, 0xF4, + 0x9C, 0x12, 0x82, 0x03, 0xEB, 0x1C, 0xA0, 0xF7, 0x93, 0x0D, 0x1A, 0xE6, + 0xD2, 0x0B, 0x3A, 0xF6, 0xE0, 0xF0, 0xFF, 0x0F, 0x15, 0xD7, 0xA8, 0x12, + 0xDC, 0xE1, 0x9A, 0x0A, 0x09, 0xE6, 0x6E, 0xFF, 0x5C, 0xDF, 0xC0, 0xEF, + 0x41, 0xD4, 0x21, 0xD6, 0x77, 0xB6, 0xAB, 0xC3, 0x1C, 0xA1, 0xB9, 0xC1, + 0x3C, 0xB7, 0x9C, 0xC6, 0x40, 0xDD, 0xE7, 0xD8, 0x30, 0xF7, 0xBB, 0xFE, + 0xC3, 0x1C, 0x0E, 0x2D, 0x38, 0x3F, 0x28, 0x4A, 0x5B, 0x45, 0xA3, 0x3F, + 0x48, 0x37, 0x42, 0x13, 0x10, 0x0D, 0x24, 0xEC, 0x6E, 0xDB, 0xF4, 0xD2, + 0xE2, 0xC4, 0x7E, 0xC3, 0x87, 0xB8, 0x1E, 0xB7, 0xB6, 0xBB, 0xCE, 0xAF, + 0xE5, 0xD7, 0xF3, 0xC8, 0x0F, 0xEE, 0xC2, 0xE9, 0xBC, 0xF6, 0x13, 0xF2, + 0xD4, 0xF6, 0x44, 0xF2, 0x84, 0xED, 0xBE, 0xF8, 0xBD, 0xE0, 0xBC, 0xFD, + 0xD1, 0xDF, 0xE0, 0x01, 0x90, 0xED, 0x0D, 0x08, 0x1A, 0x12, 0x53, 0x0D, + 0xAD, 0x36, 0xF7, 0x15, 0x86, 0x3F, 0xA8, 0x24, 0xAE, 0x2E, 0x80, 0x22, + 0x7D, 0x10, 0x97, 0x1D, 0x18, 0x00, 0x33, 0x19, 0x3D, 0xF9, 0xE8, 0xFA, + 0x77, 0xFE, 0x9C, 0xED, 0x9F, 0x08, 0x2A, 0xEE, 0x4D, 0x1C, 0x62, 0xF8, + 0xEA, 0x2C, 0x6B, 0x0F, 0x1C, 0x34, 0x85, 0x21, 0xF9, 0x37, 0x95, 0x27, + 0x80, 0x2B, 0x7D, 0x1E, 0x70, 0x13, 0x04, 0x1A, 0xD3, 0x08, 0x65, 0x21, + 0x26, 0x12, 0x72, 0x21, 0x13, 0x18, 0x18, 0x09, 0x38, 0x2D, 0x05, 0xFF, + 0xEE, 0x45, 0x1C, 0x2A, 0x8D, 0x42, 0x6C, 0x4B, 0x75, 0x35, 0xC8, 0x39, + 0x22, 0x31, 0x5F, 0x3B, 0x25, 0x2E, 0x96, 0x4F, 0x36, 0x25, 0x4F, 0x4E, + 0x5E, 0x27, 0x97, 0x4D, 0x43, 0x32, 0x41, 0x49, 0xB6, 0x29, 0xA0, 0x3A, + 0xEB, 0x0A, 0x2F, 0x26, 0xCC, 0xEF, 0x17, 0x0D, 0x5A, 0xDB, 0x91, 0xF7, + 0x6E, 0xD4, 0xA5, 0xFC, 0xA1, 0xF1, 0x51, 0x18, 0xF9, 0x1E, 0x98, 0x25, + 0x56, 0x43, 0x08, 0x37, 0x6A, 0x58, 0xD9, 0x54, 0xD5, 0x63, 0x27, 0x60, + 0x9E, 0x5D, 0xC9, 0x59, 0x67, 0x37, 0xF5, 0x45, 0xFA, 0x0F, 0xA0, 0x1D, + 0x81, 0xFA, 0x25, 0xF3, 0xC0, 0xEB, 0xB0, 0xDD, 0x5F, 0xE5, 0x4A, 0xD0, + 0x3B, 0xF0, 0xBA, 0xD7, 0xEB, 0x05, 0x30, 0xFE, 0x0E, 0x11, 0xED, 0x13, + 0x8F, 0x15, 0x2F, 0x17, 0x9A, 0x18, 0x32, 0x1F, 0xFE, 0x15, 0x83, 0x17, + 0x3F, 0x18, 0x2E, 0x05, 0xFB, 0x1B, 0x0A, 0x04, 0x03, 0x13, 0xA4, 0x0F, + 0xF2, 0x1B, 0x57, 0x18, 0xF7, 0x32, 0x76, 0x20, 0x48, 0x2A, 0x08, 0x29, + 0xBA, 0x0B, 0x02, 0x1D, 0x10, 0xF8, 0xFC, 0x0A, 0x14, 0xEB, 0x0F, 0xEE, + 0xC5, 0xE9, 0xAB, 0xD3, 0x49, 0xE6, 0x7F, 0xCF, 0x3F, 0xE0, 0xE6, 0xD7, + 0xB7, 0xEB, 0x60, 0xF2, 0xD0, 0xFB, 0xD7, 0x0C, 0xA7, 0x03, 0xA3, 0x0D, + 0x55, 0xFB, 0x10, 0xF9, 0x80, 0xED, 0xC0, 0xDE, 0x3A, 0xE1, 0xB4, 0xCD, + 0xD6, 0xDF, 0x4B, 0xD0, 0x7C, 0xE3, 0xE7, 0xCD, 0xA8, 0xE0, 0xC3, 0xC0, + 0xF9, 0xE7, 0x8E, 0xCE, 0x29, 0xFB, 0x9C, 0xF7, 0x6E, 0xF4, 0xE9, 0xFA, + 0xCF, 0xEE, 0xA1, 0xE4, 0x9C, 0x03, 0xF0, 0xEC, 0x7C, 0xF9, 0x92, 0xFA, + 0x7A, 0xDF, 0x23, 0xFE, 0x5E, 0xE2, 0xB5, 0x02, 0x5A, 0xE8, 0x2D, 0x01, + 0x6A, 0xD2, 0x35, 0xE9, 0x44, 0xBE, 0xE5, 0xCB, 0x05, 0xB4, 0x9E, 0xBC, + 0x7D, 0xB1, 0x7E, 0xA9, 0x42, 0xCF, 0xF7, 0xA2, 0xE8, 0xF4, 0x86, 0xC5, + 0x0A, 0x0A, 0x02, 0xFC, 0xFA, 0x1A, 0x7F, 0x2D, 0x1F, 0x22, 0x4D, 0x4D, + 0xCC, 0x1C, 0xB4, 0x49, 0xBB, 0x18, 0x59, 0x21, 0x2F, 0x02, 0x0E, 0xEE, + 0x54, 0xD5, 0xD4, 0xCB, 0x7C, 0xB3, 0xE3, 0xC0, 0x2B, 0xAA, 0xFE, 0xC0, + 0x16, 0xBB, 0x5B, 0xC7, 0xD1, 0xD6, 0x82, 0xDB, 0xEE, 0xE1, 0xD2, 0xF3, + 0x42, 0xED, 0x9D, 0xFE, 0xA3, 0xF9, 0x55, 0x03, 0x0A, 0xF6, 0x88, 0x05, + 0xD7, 0xF7, 0x07, 0xF8, 0xB4, 0x00, 0xD8, 0xEC, 0xB1, 0xFD, 0x0D, 0xFA, + 0xEC, 0xFD, 0x80, 0x0E, 0x84, 0x08, 0xCC, 0x1B, 0x83, 0x18, 0x2B, 0x24, + 0x98, 0x25, 0x3E, 0x0E, 0x8B, 0x24, 0x3A, 0xFA, 0x48, 0x0A, 0xE6, 0xFE, + 0xDD, 0xF7, 0x2F, 0xF8, 0x99, 0xFB, 0x1F, 0xED, 0x2C, 0xE8, 0x64, 0xF1, + 0xB4, 0xDF, 0x86, 0x05, 0x3D, 0xF3, 0xB9, 0x0E, 0xEF, 0x0B, 0xBD, 0x08, + 0x3B, 0x21, 0xB2, 0xF8, 0xA7, 0x22, 0x69, 0xE8, 0xD5, 0x05, 0x75, 0xE0, + 0xC9, 0xEE, 0x6B, 0xE1, 0xFF, 0xEE, 0x98, 0xE9, 0xF2, 0xE0, 0xB5, 0xE6, + 0x0C, 0xE3, 0x8A, 0xDE, 0xCD, 0x0E, 0x09, 0xEF, 0xB4, 0x1A, 0xD5, 0x00, + 0x4F, 0x00, 0x71, 0xFA, 0xF1, 0xFF, 0xC7, 0x09, 0xC2, 0x03, 0x4F, 0x23, + 0x0E, 0xFA, 0x99, 0x11, 0xA1, 0xF8, 0xA8, 0x07, 0xB5, 0xF6, 0xFD, 0x1F, + 0x95, 0xF4, 0x27, 0x0E, 0x9A, 0xF3, 0xAB, 0xD8, 0xA7, 0xE3, 0xEC, 0xBC, + 0x74, 0xD4, 0xC0, 0xB2, 0xBB, 0xD5, 0xA5, 0xBE, 0xFB, 0xE0, 0x48, 0xF1, + 0xE4, 0xFF, 0xBE, 0x22, 0xB9, 0x2A, 0x66, 0x3E, 0x32, 0x49, 0x50, 0x57, + 0x8E, 0x4D, 0x2A, 0x58, 0x51, 0x3C, 0x63, 0x36, 0x19, 0x1E, 0x83, 0x11, + 0x0E, 0xFB, 0xB6, 0xF0, 0x5C, 0xD6, 0x03, 0xD3, 0xE6, 0xBA, 0xA6, 0xCF, + 0xFD, 0xBE, 0xFC, 0xE2, 0x2E, 0xE2, 0x0D, 0xF4, 0x82, 0x07, 0xB8, 0x01, + 0xDD, 0x17, 0xE9, 0x0E, 0x68, 0x17, 0xFF, 0x18, 0x6B, 0x11, 0x39, 0x1C, + 0xCC, 0x02, 0x44, 0x15, 0xA5, 0xF1, 0x5D, 0x14, 0xCA, 0xF1, 0x8D, 0x11, + 0x25, 0x07, 0x09, 0x05, 0xBF, 0x1C, 0x79, 0xFE, 0x5A, 0x2C, 0x3E, 0x06, + 0x2A, 0x2D, 0x30, 0x0B, 0x71, 0x16, 0x35, 0xFF, 0x56, 0x01, 0xF0, 0xFC, + 0xEA, 0xE2, 0xB2, 0xFF, 0xB3, 0xD1, 0xDB, 0xFA, 0xDA, 0xDC, 0x48, 0xE6, + 0x1F, 0xF1, 0x8B, 0xDF, 0x85, 0x00, 0x4B, 0xF4, 0x76, 0x03, 0x00, 0x04, + 0x4B, 0x06, 0x7B, 0x00, 0x37, 0x10, 0x13, 0xF9, 0xD0, 0x09, 0xB2, 0xF4, + 0xC4, 0xF5, 0x42, 0xF4, 0xAD, 0xF1, 0x1A, 0xF5, 0xA3, 0xEF, 0xD5, 0xE2, + 0x28, 0xEB, 0x19, 0xCC, 0xBC, 0xF8, 0x43, 0xD7, 0xDB, 0x08, 0x33, 0xF0, + 0xC3, 0xF2, 0xD6, 0xEB, 0xE5, 0xDB, 0x55, 0xF4, 0x14, 0xE9, 0x3C, 0x10, + 0xB5, 0xF1, 0xD2, 0x07, 0x9A, 0xE8, 0xD6, 0xF0, 0x39, 0xE8, 0x60, 0xF1, + 0x49, 0xEB, 0xC6, 0xED, 0x0D, 0xDF, 0x7A, 0xD5, 0x0C, 0xCE, 0x6D, 0xC2, + 0x10, 0xB1, 0xB3, 0xB9, 0xB5, 0x99, 0x31, 0xC2, 0x17, 0xAE, 0xF6, 0xDA, + 0xE0, 0xDF, 0xF5, 0xF0, 0x06, 0x0A, 0xE3, 0x07, 0x96, 0x27, 0xE5, 0x20, + 0xD3, 0x36, 0x7D, 0x2E, 0x45, 0x27, 0xB9, 0x24, 0xF6, 0x08, 0x13, 0x04, + 0x64, 0xF0, 0xC2, 0xDD, 0x4A, 0xD7, 0x4F, 0xBE, 0xCF, 0xC5, 0xF6, 0xA9, + 0x8F, 0xC0, 0x5A, 0xA3, 0xE1, 0xC6, 0x98, 0xB3, 0x99, 0xE2, 0x99, 0xD9, + 0x55, 0xF5, 0xA0, 0xF7, 0xDD, 0xF3, 0x7B, 0x08, 0x7D, 0xF4, 0x50, 0x15, + 0x17, 0xFB, 0xE5, 0x13, 0xD2, 0x05, 0x5E, 0xFF, 0x46, 0x14, 0x10, 0xEB, + 0x9D, 0x19, 0x82, 0xEC, 0xC3, 0x13, 0xC7, 0xF9, 0x03, 0x11, 0xB7, 0x07, + 0x5F, 0x16, 0x98, 0x1C, 0xF2, 0x14, 0x9F, 0x18, 0xC5, 0x10, 0x35, 0x03, + 0x5A, 0x03, 0x1E, 0xFE, 0x39, 0xFB, 0x27, 0x04, 0x8C, 0x00, 0x44, 0x01, + 0x11, 0x03, 0x3B, 0x04, 0x58, 0x15, 0xB6, 0x17, 0x50, 0x22, 0x98, 0x24, + 0x2D, 0x16, 0x60, 0x39, 0x9C, 0x0E, 0x1E, 0x49, 0x58, 0x1A, 0x8A, 0x35, + 0xE7, 0x18, 0x21, 0x11, 0x29, 0x18, 0x96, 0x0B, 0xB2, 0x1A, 0x73, 0x17, + 0x4D, 0x03, 0x63, 0x0F, 0xAD, 0x01, 0xCF, 0x0F, 0x05, 0x2E, 0x0A, 0x2D, + 0x60, 0x3A, 0x53, 0x36, 0xEB, 0x29, 0x5F, 0x26, 0x02, 0x41, 0x49, 0x2F, + 0x45, 0x55, 0xB8, 0x45, 0xEA, 0x47, 0xD1, 0x44, 0x37, 0x3C, 0x50, 0x3F, + 0x27, 0x2C, 0xFA, 0x45, 0xBF, 0x11, 0x6C, 0x38, 0x16, 0x06, 0x0C, 0x1E, + 0x46, 0xFA, 0xE7, 0x0D, 0x6D, 0xF3, 0xA3, 0xF7, 0xAD, 0x07, 0x7E, 0xED, + 0xBA, 0x24, 0x52, 0x11, 0x8F, 0x3B, 0xF6, 0x3A, 0x59, 0x4F, 0xA8, 0x4F, + 0x4E, 0x5C, 0x2C, 0x62, 0x87, 0x5E, 0xAB, 0x5F, 0xC7, 0x53, 0x8A, 0x42, + 0xB9, 0x2D, 0xBE, 0x25, 0xB6, 0x03, 0x2F, 0x0B, 0xB5, 0xF4, 0x07, 0xE9, + 0x5A, 0xF3, 0x07, 0xD5, 0x74, 0xEF, 0xDD, 0xDF, 0x5D, 0xF4, 0xA0, 0xF8, + 0xA7, 0x07, 0xCC, 0x0C, 0xAD, 0x23, 0x5C, 0x14, 0xC2, 0x3A, 0xD7, 0x18, + 0x17, 0x30, 0x47, 0x1A, 0x4D, 0x1A, 0x7F, 0x13, 0xFB, 0x1A, 0x5F, 0x08, + 0xCE, 0x23, 0x36, 0x02, 0xD1, 0x1D, 0xA0, 0x04, 0xD9, 0x02, 0x18, 0x08, + 0xB5, 0x00, 0xB1, 0x16, 0x12, 0x15, 0xA2, 0x10, 0xE7, 0x0E, 0xFA, 0xED, + 0xB2, 0x02, 0x36, 0xE7, 0x97, 0xFE, 0xE0, 0xF2, 0xB0, 0xFA, 0x04, 0xF8, + 0x4C, 0xE9, 0x7C, 0xF3, 0x40, 0xE7, 0xFE, 0x01, 0x97, 0xF2, 0x93, 0x13, + 0xDA, 0xFA, 0x1F, 0x10, 0xB2, 0x05, 0x21, 0x06, 0xE4, 0x05, 0xF3, 0xFE, + 0xA0, 0xE8, 0xFA, 0xF3, 0xF7, 0xCA, 0x9A, 0xEC, 0x42, 0xCF, 0x66, 0xF3, + 0x3A, 0xC8, 0xE1, 0xE3, 0xFC, 0xBE, 0xC0, 0xCD, 0x97, 0xE2, 0x99, 0xDC, + 0xC4, 0x05, 0x0E, 0xE8, 0x28, 0xFD, 0xDD, 0xD3, 0x3E, 0xF5, 0x9F, 0xD9, + 0xFB, 0xF9, 0x11, 0xF8, 0x8F, 0xED, 0xF9, 0xFB, 0x2D, 0xDE, 0x38, 0xF8, + 0x72, 0xDE, 0x5F, 0x00, 0x33, 0xD3, 0x0A, 0xF4, 0x8F, 0xBB, 0xD3, 0xD7, + 0x62, 0xB7, 0x64, 0xC1, 0x49, 0xBC, 0xC7, 0xA8, 0xA2, 0xC0, 0xB2, 0xA5, + 0x8A, 0xD3, 0xBD, 0xCB, 0xD1, 0xF5, 0x7A, 0xFE, 0xA7, 0x14, 0xCB, 0x1C, + 0x46, 0x31, 0xFF, 0x29, 0x7E, 0x3E, 0xE7, 0x2B, 0x42, 0x25, 0xC3, 0x1B, + 0x15, 0xFE, 0x95, 0x02, 0x1B, 0xE6, 0xE1, 0xEF, 0x89, 0xD1, 0x58, 0xDD, + 0xFB, 0xBF, 0x3D, 0xC5, 0x6C, 0xBD, 0x9C, 0xB7, 0x7F, 0xBE, 0xE7, 0xB7, + 0x2F, 0xCA, 0x14, 0xC3, 0xEA, 0xE7, 0x76, 0xDB, 0x28, 0x03, 0xB6, 0xF4, + 0xA1, 0x0D, 0x2C, 0xFF, 0x97, 0x03, 0x37, 0x01, 0xE0, 0xF7, 0xE2, 0x0C, + 0xFC, 0xF9, 0x27, 0x0E, 0x8C, 0xFA, 0x87, 0xFC, 0x38, 0xEF, 0xAF, 0xF2, + 0xCB, 0xED, 0x5B, 0xF7, 0x78, 0xF7, 0x49, 0xF9, 0xF2, 0xF7, 0x20, 0xF3, + 0x3F, 0x00, 0xF5, 0xF5, 0x8B, 0xFD, 0xF8, 0xF4, 0x18, 0xFA, 0x4D, 0xFF, + 0xE5, 0xFF, 0xD5, 0xFF, 0x54, 0x03, 0x2A, 0xF0, 0xDC, 0x10, 0x79, 0xFE, + 0x04, 0x13, 0x17, 0x06, 0x4C, 0x06, 0x6D, 0xFE, 0x01, 0xF6, 0x5A, 0x05, + 0x0A, 0xEF, 0x3C, 0x08, 0xBD, 0xF7, 0xFB, 0xF9, 0x5D, 0x02, 0x9A, 0xE8, + 0xDC, 0x0A, 0xA8, 0xD9, 0xCD, 0xFF, 0xD5, 0xCA, 0x06, 0xF3, 0x41, 0xDA, + 0x9C, 0x16, 0x3A, 0x0A, 0xB7, 0x28, 0x5D, 0x0D, 0xA6, 0x0D, 0x56, 0xFB, + 0x83, 0x0B, 0x7F, 0x16, 0x28, 0x0E, 0x26, 0x32, 0x16, 0xF6, 0x31, 0x2E, + 0xB9, 0xF4, 0xBA, 0x20, 0x66, 0x07, 0xC2, 0x11, 0x85, 0xF5, 0x59, 0xFD, + 0xC8, 0xD2, 0x7B, 0xE8, 0xA8, 0xC5, 0xCC, 0xDD, 0x5B, 0xBD, 0x6A, 0xD6, + 0x89, 0xCA, 0xFE, 0xD7, 0xF9, 0xFB, 0x5C, 0xF8, 0x5A, 0x1B, 0x19, 0x1D, + 0x25, 0x2C, 0x35, 0x31, 0x21, 0x47, 0x03, 0x42, 0xF9, 0x44, 0x8A, 0x47, + 0x42, 0x23, 0x0E, 0x33, 0x97, 0x0B, 0x2A, 0x1A, 0xC1, 0xF9, 0x7A, 0x05, + 0x04, 0xE8, 0xA9, 0xE6, 0x6A, 0xE4, 0xDF, 0xCD, 0x98, 0xEB, 0xE0, 0xD1, + 0x02, 0xF4, 0xBD, 0xDE, 0x5E, 0xFD, 0x53, 0xEE, 0xA5, 0x08, 0x3E, 0x0F, + 0x35, 0x12, 0x32, 0x22, 0x9A, 0x14, 0xA8, 0x12, 0xE7, 0x1C, 0x52, 0x0D, + 0xDB, 0x25, 0x51, 0x14, 0x15, 0x1B, 0x56, 0x09, 0xB3, 0x09, 0x55, 0xFB, + 0xB8, 0x05, 0x41, 0xF6, 0x78, 0x0B, 0xAB, 0xFC, 0xDB, 0xF4, 0x9B, 0xF6, + 0xD9, 0xE8, 0x66, 0xF6, 0x8E, 0xF6, 0xE7, 0xFC, 0xF8, 0xFB, 0xF5, 0xF9, + 0x2D, 0x01, 0x4B, 0xFF, 0x26, 0xF7, 0xA0, 0xFF, 0xE9, 0xE9, 0x45, 0x04, + 0x5F, 0xF1, 0x98, 0x11, 0x11, 0x01, 0x2A, 0x13, 0xEE, 0x01, 0xC0, 0xFE, + 0xEF, 0x02, 0x52, 0xF0, 0xAA, 0x02, 0x3F, 0xE7, 0x7B, 0xFC, 0xD5, 0xD9, + 0x42, 0xF5, 0x8E, 0xCD, 0xE8, 0xE6, 0xE7, 0xC3, 0x78, 0xDC, 0x91, 0xC9, + 0x40, 0xF1, 0x33, 0xEF, 0xB0, 0x01, 0x4D, 0x04, 0xEC, 0xFD, 0x82, 0xFD, + 0x2E, 0x0B, 0xBB, 0x0E, 0x27, 0x0F, 0xA9, 0x1C, 0xF7, 0xFB, 0x5C, 0x11, + 0x88, 0xEC, 0x54, 0x0E, 0x04, 0xEF, 0x92, 0x21, 0xAA, 0xDE, 0xE3, 0x12, + 0xBA, 0xBD, 0x07, 0xE1, 0x90, 0xBE, 0x04, 0xC7, 0x28, 0xC6, 0xE2, 0xB6, + 0x16, 0xC8, 0xD2, 0xB6, 0x32, 0xE6, 0xE0, 0xE0, 0x0C, 0x0B, 0x3C, 0x0B, + 0xED, 0x15, 0x4F, 0x22, 0x1A, 0x16, 0xDE, 0x34, 0x2B, 0x1F, 0x0A, 0x35, + 0x85, 0x19, 0x8E, 0x14, 0x58, 0xFF, 0x41, 0xED, 0x48, 0xEF, 0xE1, 0xD7, + 0x6F, 0xE2, 0xA8, 0xC9, 0x92, 0xD6, 0x14, 0xC1, 0x97, 0xD5, 0x57, 0xC0, + 0x74, 0xCB, 0x91, 0xC8, 0xE2, 0xC3, 0xA5, 0xDE, 0xC3, 0xD4, 0xB9, 0xED, + 0x59, 0xF6, 0xB4, 0xF6, 0xA2, 0x04, 0x50, 0xF2, 0xB6, 0x07, 0x6C, 0xE5, + 0x4E, 0x17, 0x03, 0xF5, 0x8D, 0x14, 0xB8, 0x08, 0x2D, 0x0B, 0x7A, 0x0A, + 0xD1, 0x10, 0x74, 0x0E, 0x7B, 0x16, 0x26, 0x14, 0x4C, 0x12, 0x37, 0x06, + 0xB5, 0x0B, 0x17, 0xFF, 0x24, 0x0E, 0x09, 0x14, 0x7E, 0x11, 0x1A, 0x16, + 0x04, 0x15, 0xA3, 0x18, 0xC5, 0x00, 0x6B, 0x22, 0x23, 0xF0, 0x2A, 0x21, + 0x34, 0x08, 0x8E, 0x2B, 0xA0, 0x1C, 0xBA, 0x31, 0x37, 0x22, 0x0E, 0x1C, + 0xB3, 0x21, 0xDA, 0x08, 0xB9, 0x1C, 0x27, 0x12, 0xD4, 0x1F, 0x20, 0x13, + 0x64, 0x25, 0x00, 0x0B, 0x7E, 0x21, 0xE5, 0x0D, 0x62, 0x13, 0x85, 0x03, + 0x2D, 0x20, 0xBD, 0x13, 0xB6, 0x38, 0xFB, 0x36, 0x06, 0x2C, 0x1F, 0x27, + 0x6E, 0x22, 0x65, 0x1E, 0x5D, 0x33, 0xE4, 0x3F, 0x7E, 0x34, 0xFE, 0x4B, + 0x75, 0x26, 0xED, 0x41, 0xBC, 0x2A, 0x49, 0x4C, 0x0D, 0x33, 0x55, 0x43, + 0x71, 0x1D, 0x04, 0x15, 0x05, 0x01, 0x10, 0xFF, 0xCB, 0xF2, 0x74, 0xF8, + 0x54, 0xE8, 0x19, 0xF9, 0xCA, 0xF5, 0xA6, 0x19, 0x18, 0x23, 0xAC, 0x32, + 0x7A, 0x4B, 0xFA, 0x3E, 0x84, 0x57, 0xB2, 0x50, 0x9A, 0x60, 0xE0, 0x5E, + 0x6A, 0x5C, 0x93, 0x53, 0x06, 0x48, 0x91, 0x33, 0x62, 0x36, 0x84, 0x1D, + 0xA3, 0x18, 0xB0, 0x0E, 0x54, 0xF4, 0xBE, 0x04, 0xD7, 0xEF, 0xCF, 0x00, + 0xF8, 0xFB, 0x27, 0xF1, 0xD9, 0xF5, 0xB8, 0xE4, 0xAA, 0xF5, 0x0B, 0xF2, + 0x66, 0x04, 0xCF, 0x07, 0xC5, 0x10, 0x3E, 0x12, 0x15, 0x1B, 0x40, 0x16, + 0xE8, 0x25, 0xB7, 0x27, 0x03, 0x25, 0xD4, 0x2B, 0x9A, 0x1D, 0x93, 0x18, + 0x9F, 0x15, 0x63, 0x0E, 0x94, 0x0D, 0xC5, 0x0B, 0x49, 0x08, 0xF5, 0x04, + 0x4A, 0x00, 0x25, 0xF6, 0x09, 0xFA, 0x36, 0xFC, 0xCA, 0xEF, 0x58, 0x0A, + 0xEF, 0xEE, 0x84, 0x07, 0x42, 0xF5, 0xEC, 0xFA, 0x2C, 0xFD, 0xB4, 0xE6, + 0x0D, 0x0D, 0xC4, 0xE7, 0xB3, 0x0C, 0xDE, 0xFD, 0xBE, 0xFE, 0xA0, 0x00, + 0x66, 0xFB, 0xF2, 0xF8, 0xAE, 0xF6, 0x5F, 0xF0, 0xDA, 0xEF, 0xDF, 0xE3, + 0xDA, 0xF1, 0xDF, 0xE2, 0x82, 0xF7, 0xAA, 0xE3, 0xB4, 0xEB, 0x27, 0xD6, + 0xC9, 0xE2, 0x16, 0xC9, 0x32, 0xFB, 0x31, 0xDD, 0x95, 0xF0, 0x1D, 0xE4, + 0x42, 0xD0, 0xC3, 0xD8, 0x4F, 0xD7, 0x89, 0xE7, 0x83, 0xE6, 0x20, 0xF3, + 0x58, 0xE7, 0xD1, 0xF1, 0xFE, 0xDE, 0x00, 0xF8, 0xA4, 0xD7, 0x68, 0xFA, + 0x8E, 0xC6, 0x3C, 0xE5, 0x10, 0xB2, 0xFE, 0xCE, 0x41, 0xAC, 0x6D, 0xC0, + 0xBC, 0xA0, 0x5A, 0xB1, 0x45, 0xA9, 0x4B, 0xBC, 0x49, 0xDC, 0x99, 0xE4, + 0xD6, 0x04, 0x1F, 0xFB, 0x8C, 0x11, 0x79, 0xFE, 0xAE, 0x1E, 0xF4, 0x0B, + 0xD4, 0x1F, 0xBC, 0x12, 0x36, 0x0F, 0x87, 0x07, 0x93, 0xFF, 0xEB, 0xFA, + 0x95, 0xF4, 0xFD, 0xED, 0x79, 0xE8, 0xA4, 0xD9, 0x72, 0xDA, 0xAA, 0xCA, + 0x83, 0xD6, 0xD9, 0xC4, 0x4B, 0xD8, 0xDE, 0xBD, 0x7A, 0xD0, 0xE8, 0xC0, + 0x1E, 0xD4, 0xB0, 0xDB, 0xFA, 0xE9, 0x1E, 0xF3, 0x40, 0xFC, 0x01, 0xFE, + 0x7D, 0x15, 0x30, 0x0F, 0x90, 0x2D, 0x24, 0x1E, 0x36, 0x28, 0xD5, 0x1C, + 0xC5, 0x16, 0xF9, 0x16, 0xBD, 0x0E, 0x06, 0x16, 0x4D, 0xFF, 0x71, 0x12, + 0x1A, 0xE8, 0x9C, 0x07, 0x34, 0xE7, 0x7D, 0xFF, 0x2D, 0xF7, 0xF0, 0x07, + 0x92, 0xF9, 0x6D, 0x08, 0xF7, 0xFA, 0x8C, 0xFE, 0x00, 0xF8, 0x03, 0xF7, + 0x48, 0xF4, 0x29, 0xF8, 0xE3, 0xF9, 0xC7, 0x03, 0xA4, 0xF4, 0xD4, 0x0D, + 0x68, 0xF9, 0x59, 0x09, 0xF4, 0x03, 0xDA, 0xF2, 0xBA, 0xF5, 0xD5, 0xE6, + 0xE3, 0xE9, 0xDC, 0xED, 0x61, 0xF6, 0xC9, 0xEE, 0x1A, 0xFD, 0xE0, 0xE9, + 0x80, 0xF6, 0xEA, 0xE8, 0x8E, 0x06, 0x5B, 0xFA, 0x99, 0x16, 0x5D, 0x16, + 0x93, 0x08, 0x3A, 0x0A, 0x4F, 0x07, 0x08, 0xF7, 0x40, 0x19, 0xF4, 0x0E, + 0x8A, 0x17, 0x6B, 0x20, 0x75, 0x0B, 0xE8, 0x1D, 0x97, 0x06, 0x27, 0x2D, + 0xDB, 0xF9, 0xAD, 0x25, 0x98, 0xE4, 0xC7, 0xF5, 0x05, 0xD9, 0x7B, 0xD2, + 0xC6, 0xCC, 0xB9, 0xC3, 0x6D, 0xC7, 0x92, 0xC3, 0x0C, 0xE0, 0x5A, 0xE0, + 0x77, 0x0D, 0xF8, 0x0C, 0xBC, 0x30, 0x7F, 0x26, 0x25, 0x3B, 0x3E, 0x34, + 0x54, 0x37, 0x7B, 0x3B, 0x12, 0x2E, 0xF0, 0x2F, 0x1B, 0x1E, 0x54, 0x20, + 0x0B, 0x0D, 0xB9, 0x11, 0x0A, 0x05, 0xED, 0xFC, 0x79, 0xF7, 0xC6, 0xF1, + 0x59, 0xE3, 0xA0, 0xF1, 0x02, 0xDB, 0x0C, 0xE6, 0x74, 0xE1, 0x67, 0xD2, + 0x6A, 0xF5, 0x9B, 0xCD, 0x33, 0x0B, 0xB2, 0xDC, 0x61, 0x07, 0x95, 0xF3, + 0x4C, 0xFF, 0x38, 0x0C, 0x99, 0x10, 0x21, 0x1F, 0x49, 0x1A, 0x33, 0x1A, + 0x1B, 0x10, 0x7E, 0x08, 0x09, 0x0A, 0x85, 0x08, 0x06, 0x0F, 0x90, 0x13, + 0xD2, 0x0F, 0x7E, 0x19, 0xB6, 0x04, 0x40, 0x0E, 0xB0, 0x05, 0x9A, 0x01, + 0x6F, 0xFF, 0xC4, 0xFB, 0xD3, 0xFE, 0x0F, 0x04, 0x31, 0x01, 0xDF, 0x07, + 0x7E, 0xEB, 0x09, 0xFA, 0xB9, 0xF4, 0xE6, 0xFA, 0xD8, 0x05, 0x76, 0xFA, + 0xD9, 0xFB, 0x6F, 0xEF, 0xC7, 0xFB, 0xA5, 0xEF, 0xB5, 0xF9, 0x16, 0xEE, + 0xEA, 0xF2, 0x28, 0xE5, 0x10, 0xEE, 0xC0, 0xE7, 0x25, 0xEF, 0xA5, 0xF2, + 0xA5, 0xE6, 0x55, 0xE4, 0x70, 0xDF, 0xBF, 0xD8, 0xA1, 0x05, 0x30, 0xF5, + 0xB1, 0x08, 0x7D, 0xF6, 0x0B, 0xDF, 0xAC, 0xE6, 0x53, 0xDD, 0xB7, 0xFD, + 0xA3, 0xEF, 0x78, 0x1F, 0xC4, 0xF5, 0x1D, 0x1F, 0x31, 0xFC, 0x92, 0x09, + 0x8E, 0x05, 0x51, 0x04, 0x3E, 0xF2, 0x5E, 0xF3, 0xFA, 0xCA, 0x64, 0xCD, + 0x35, 0xC1, 0x6F, 0xB1, 0x1A, 0xBF, 0x7E, 0xA5, 0x4F, 0xC0, 0x2D, 0xB0, + 0xD5, 0xEA, 0x3B, 0xE4, 0x01, 0x11, 0x93, 0x17, 0x32, 0x1F, 0x8E, 0x1E, + 0x4D, 0x24, 0x6C, 0x13, 0xC8, 0x1E, 0x0A, 0x16, 0x2A, 0x15, 0x5B, 0x10, + 0x1A, 0xFE, 0xFD, 0xFE, 0xDF, 0xE0, 0x45, 0xF3, 0xE1, 0xD7, 0xAB, 0xE9, + 0x4E, 0xD5, 0xD2, 0xD6, 0x7A, 0xC2, 0x11, 0xC3, 0x1E, 0xB2, 0x5D, 0xBE, + 0x5E, 0xC4, 0x83, 0xC0, 0x92, 0xDE, 0xED, 0xCB, 0xCC, 0xEA, 0xB1, 0xDD, + 0x16, 0xF9, 0xD8, 0xE8, 0x9A, 0x01, 0xAD, 0xF8, 0x7C, 0x0F, 0x34, 0x06, + 0x70, 0x15, 0x3D, 0xFC, 0x09, 0x0E, 0x83, 0xFE, 0xF2, 0x0D, 0x6F, 0x02, + 0xD5, 0x0E, 0xC8, 0xFC, 0x4A, 0x0D, 0xC0, 0x04, 0x57, 0x08, 0xCE, 0x0D, + 0xCB, 0xFC, 0x8D, 0x17, 0x02, 0xF6, 0xE3, 0x1C, 0x4E, 0x01, 0x47, 0x18, + 0xCF, 0x0A, 0x62, 0x0D, 0xBB, 0x18, 0xC5, 0x16, 0x52, 0x2F, 0x17, 0x2B, + 0xFA, 0x2D, 0x8F, 0x26, 0xFF, 0x19, 0xD3, 0x20, 0x73, 0x14, 0xF7, 0x1F, + 0x2D, 0x0F, 0xC1, 0x0B, 0x70, 0x0D, 0x16, 0x0A, 0x1E, 0x28, 0xF5, 0x23, + 0x34, 0x33, 0x07, 0x2D, 0x18, 0x19, 0x70, 0x27, 0x24, 0x27, 0x10, 0x3D, + 0xA9, 0x3E, 0x0E, 0x50, 0x81, 0x18, 0xFC, 0x3A, 0xD2, 0x02, 0x8E, 0x34, + 0x8A, 0x1F, 0xF9, 0x4C, 0xD8, 0x34, 0x77, 0x54, 0x6D, 0x38, 0xB3, 0x42, + 0x57, 0x40, 0x18, 0x42, 0xB6, 0x35, 0xFE, 0x39, 0xA7, 0x11, 0xBC, 0x0D, + 0x82, 0xFC, 0x44, 0xF8, 0xBE, 0xF4, 0x24, 0xF8, 0x9F, 0xF4, 0x0B, 0xF4, + 0x39, 0x04, 0x23, 0x02, 0x72, 0x29, 0xAC, 0x22, 0x18, 0x51, 0x65, 0x31, + 0xAF, 0x56, 0x75, 0x2D, 0x51, 0x4B, 0x33, 0x3C, 0x79, 0x43, 0xC0, 0x47, + 0xC4, 0x39, 0x1A, 0x3B, 0x34, 0x34, 0xD4, 0x31, 0xEE, 0x3A, 0x17, 0x30, + 0x96, 0x35, 0xDF, 0x2A, 0x8E, 0x15, 0x29, 0x1B, 0x65, 0xFE, 0x61, 0x03, + 0x74, 0xFF, 0x1E, 0xF7, 0xC1, 0x05, 0x3D, 0xF8, 0x37, 0x0E, 0x64, 0xF8, + 0xF4, 0x15, 0x3F, 0xFB, 0x09, 0x18, 0xDB, 0x08, 0x4B, 0x19, 0xF5, 0x0C, + 0x05, 0x21, 0x9B, 0xFB, 0x8E, 0x2B, 0x1D, 0xF2, 0xCA, 0x25, 0x80, 0x00, + 0xA1, 0x0E, 0x29, 0x1A, 0xD3, 0xFA, 0x6A, 0x25, 0x52, 0xFB, 0xA9, 0x19, + 0xF3, 0x0A, 0xCB, 0x14, 0x81, 0x05, 0xB2, 0x12, 0x9D, 0xED, 0x85, 0x0B, + 0xD3, 0xD9, 0xA3, 0x06, 0xB0, 0xD6, 0xC0, 0xFF, 0x70, 0xE9, 0xFF, 0xF8, + 0xEF, 0xF7, 0x21, 0xED, 0x9C, 0xF1, 0x01, 0xDD, 0x82, 0xEA, 0x84, 0xDB, + 0xDB, 0xE2, 0xAF, 0xD8, 0x6A, 0xDE, 0x43, 0xD3, 0x4B, 0xE5, 0x1A, 0xD9, + 0xFD, 0xE1, 0x2B, 0xD8, 0x1C, 0xD1, 0x40, 0xCD, 0x69, 0xDD, 0x59, 0xDF, + 0x43, 0xF6, 0x07, 0xFB, 0x0D, 0xE5, 0x12, 0xE4, 0x1B, 0xD6, 0x4E, 0xCA, + 0xDC, 0xF5, 0xCC, 0xEA, 0x77, 0x0F, 0xB8, 0x09, 0xC1, 0x05, 0x2B, 0x04, + 0x41, 0xFE, 0x4C, 0x07, 0x63, 0xF4, 0x33, 0x00, 0x98, 0xCE, 0x23, 0xD6, + 0x8F, 0xAF, 0xFF, 0xB9, 0xDC, 0xAC, 0x79, 0xAB, 0x7B, 0xB8, 0x8E, 0x9E, + 0x16, 0xD6, 0x6D, 0xB7, 0x68, 0xFD, 0xD7, 0xE5, 0x73, 0x07, 0xEA, 0xFE, + 0x73, 0xF4, 0xEF, 0xFE, 0xBF, 0xFF, 0x96, 0x00, 0x99, 0x17, 0x37, 0x03, + 0xD5, 0x0E, 0xB3, 0x00, 0x8F, 0xFE, 0x98, 0x07, 0x2D, 0xF3, 0xD0, 0x10, + 0xA3, 0xEB, 0xA0, 0x0E, 0xD4, 0xE2, 0xF9, 0xF8, 0x51, 0xCE, 0x14, 0xDD, + 0x0A, 0xC4, 0xC6, 0xD4, 0x98, 0xD6, 0xEA, 0xD3, 0x9A, 0xEB, 0x3F, 0xD3, + 0xE6, 0xEB, 0x41, 0xDC, 0x12, 0xF4, 0x6C, 0xE1, 0x57, 0x06, 0x81, 0xE6, + 0x98, 0xFA, 0x53, 0xEC, 0x51, 0xF2, 0x2B, 0xF3, 0x3A, 0x02, 0xEA, 0x05, + 0xCC, 0x08, 0x0A, 0x15, 0xAB, 0x0B, 0x1E, 0x17, 0x69, 0x0E, 0xD7, 0x17, + 0x25, 0x13, 0x9A, 0x1B, 0x80, 0x15, 0x98, 0x11, 0xF0, 0x0B, 0xE0, 0x03, + 0x2A, 0xF6, 0xE0, 0xF8, 0x90, 0xE9, 0xAC, 0xF1, 0x13, 0xEB, 0xD0, 0xF2, + 0xA5, 0xE8, 0x49, 0xF7, 0x1F, 0xE8, 0xB3, 0xF9, 0x5D, 0xE9, 0xF3, 0xF1, + 0x83, 0xDE, 0xBF, 0xD7, 0xB9, 0xDB, 0x00, 0xD0, 0xA8, 0xED, 0x13, 0xFB, + 0x63, 0xF7, 0x34, 0x13, 0xAD, 0xEF, 0x61, 0xF2, 0x2C, 0xF8, 0x8B, 0xE9, + 0x88, 0x17, 0x9E, 0x01, 0x66, 0x17, 0x9C, 0xF3, 0xE1, 0xFE, 0xC1, 0xE6, + 0x53, 0x05, 0xA1, 0x09, 0x14, 0x16, 0x6E, 0x29, 0xF1, 0x0E, 0xF6, 0x2A, + 0x42, 0x11, 0xC8, 0x2D, 0xF7, 0x14, 0xF4, 0x20, 0x78, 0xF7, 0x53, 0xF7, + 0xC7, 0xDE, 0x12, 0xDD, 0xC2, 0xDB, 0x00, 0xD6, 0x51, 0xD4, 0x6F, 0xCE, + 0xAB, 0xE3, 0x3C, 0xDA, 0x43, 0x0D, 0x64, 0xFD, 0xC4, 0x16, 0x3C, 0x17, + 0xA2, 0x0C, 0xB2, 0x1C, 0x50, 0x1E, 0xB4, 0x24, 0x6A, 0x34, 0x3F, 0x31, + 0x7C, 0x35, 0x67, 0x35, 0xDD, 0x28, 0x3A, 0x43, 0xE9, 0x0B, 0x38, 0x4E, + 0xB6, 0xF9, 0x27, 0x38, 0xD5, 0x03, 0xAA, 0x18, 0xFD, 0xFD, 0xD2, 0xFD, + 0x63, 0xE6, 0xEF, 0xDA, 0x7B, 0xED, 0xC9, 0xCF, 0x6D, 0x04, 0x48, 0xE6, + 0x80, 0x05, 0xC8, 0xEB, 0x60, 0xF6, 0x08, 0xDC, 0x11, 0xED, 0x92, 0xE5, + 0xFC, 0xE7, 0x88, 0xF2, 0x95, 0xE8, 0xF7, 0xF0, 0x86, 0xF6, 0xE4, 0x05, + 0x61, 0x05, 0x79, 0x1D, 0xB5, 0x0F, 0x88, 0x1B, 0xB2, 0x12, 0xFE, 0x13, + 0xD8, 0x18, 0x6D, 0x1B, 0xED, 0x1A, 0x84, 0x1A, 0xF0, 0x14, 0x25, 0x08, + 0x61, 0x0A, 0xC9, 0xF0, 0xB8, 0x01, 0x65, 0xF0, 0x1F, 0xFB, 0x53, 0xFF, + 0x76, 0xF6, 0xE6, 0xF5, 0xBE, 0xFE, 0x5C, 0xE6, 0xC2, 0x03, 0xAC, 0xE0, + 0xBF, 0xF0, 0x63, 0xD7, 0x7E, 0xDA, 0x73, 0xE0, 0xF9, 0xE4, 0x51, 0xFD, + 0x97, 0xF9, 0xC8, 0xF5, 0x4A, 0xF6, 0x0F, 0xD4, 0x88, 0xFB, 0xA0, 0xE0, + 0x89, 0x08, 0x6C, 0x03, 0x37, 0xF0, 0xAA, 0xFE, 0x5C, 0xE0, 0x14, 0xF0, + 0xC7, 0xFE, 0xB7, 0xF2, 0x45, 0x0C, 0xED, 0xFB, 0xC8, 0xF4, 0x14, 0x0C, + 0xFE, 0xEB, 0xA8, 0x18, 0xA6, 0xEA, 0x26, 0x08, 0x3D, 0xD4, 0xFD, 0xE1, + 0x9D, 0xC7, 0x08, 0xCA, 0xFE, 0xC8, 0x4A, 0xBE, 0xA1, 0xC9, 0x14, 0xB0, + 0xB3, 0xD6, 0x37, 0xB4, 0xC5, 0xEB, 0x3E, 0xDC, 0x92, 0xF6, 0x51, 0xF4, + 0x5A, 0xFB, 0x4D, 0xE6, 0xFF, 0xF9, 0x42, 0xE8, 0xDD, 0xF6, 0x6F, 0x05, + 0xB4, 0xFE, 0x42, 0x1D, 0xCD, 0x03, 0xF9, 0x1F, 0xD9, 0x09, 0x84, 0x19, + 0xF5, 0x0F, 0xD8, 0x0B, 0x25, 0x02, 0x18, 0xFD, 0xF9, 0xF0, 0x4A, 0xE9, + 0x66, 0xF2, 0xB3, 0xC7, 0x0B, 0xF6, 0xE9, 0xC2, 0x30, 0xE8, 0x34, 0xD7, + 0xE9, 0xE0, 0xAA, 0xD9, 0x42, 0xE3, 0x93, 0xD4, 0x12, 0xE3, 0x2E, 0xDB, + 0x78, 0xE5, 0x1F, 0xDF, 0x5D, 0xEA, 0x5C, 0xEA, 0xC3, 0xFA, 0x76, 0x0D, + 0xD4, 0x13, 0xB5, 0x2A, 0x82, 0x20, 0x32, 0x36, 0xC0, 0x1C, 0x4C, 0x35, + 0xAE, 0x21, 0xA1, 0x34, 0x46, 0x26, 0xD0, 0x37, 0x1C, 0x1E, 0x5D, 0x33, + 0xF5, 0x0F, 0x5E, 0x21, 0xD4, 0x03, 0xF7, 0x12, 0x85, 0x05, 0xB2, 0x12, + 0xDB, 0x0B, 0x6A, 0x10, 0x59, 0x0B, 0x0E, 0x0F, 0x29, 0x10, 0xD5, 0x11, + 0x9B, 0x13, 0xF6, 0x01, 0xE6, 0x15, 0xC6, 0xFA, 0xCD, 0x2B, 0x10, 0x15, + 0x72, 0x3B, 0xBA, 0x22, 0x3A, 0x27, 0x8A, 0x16, 0xDE, 0x1E, 0xFA, 0x1A, + 0x8F, 0x39, 0x66, 0x2F, 0x82, 0x3B, 0x45, 0x2E, 0x18, 0x2B, 0x9F, 0x29, + 0xCC, 0x38, 0x46, 0x41, 0xA0, 0x4B, 0xC4, 0x5B, 0x24, 0x4B, 0xE8, 0x57, + 0xC8, 0x45, 0xA2, 0x44, 0xDF, 0x3F, 0x77, 0x37, 0x6B, 0x2D, 0xC0, 0x27, + 0x26, 0x11, 0xA1, 0x11, 0x91, 0x01, 0x85, 0x00, 0xAE, 0x01, 0x03, 0xF5, + 0x56, 0x07, 0xD7, 0xF0, 0x84, 0x18, 0x70, 0x08, 0xA3, 0x2B, 0x11, 0x28, + 0x2B, 0x21, 0x53, 0x29, 0xC5, 0x0F, 0x0B, 0x2A, 0xCF, 0x1D, 0x91, 0x3B, + 0xD6, 0x3A, 0x80, 0x4B, 0x7A, 0x44, 0xC0, 0x51, 0x72, 0x41, 0xE6, 0x4A, + 0x16, 0x40, 0x13, 0x3C, 0x61, 0x30, 0xEA, 0x2C, 0xB9, 0x18, 0x42, 0x1C, + 0xC9, 0x0E, 0x22, 0x08, 0xE4, 0x11, 0x52, 0xFB, 0x7B, 0x0D, 0x78, 0xFC, + 0x20, 0xF7, 0xD0, 0xFB, 0x10, 0xEB, 0x82, 0xF1, 0x6F, 0xFB, 0x06, 0xEA, + 0x23, 0x03, 0xDB, 0xE4, 0xE6, 0xFA, 0x21, 0xEF, 0xCA, 0xFA, 0xCB, 0x09, + 0x51, 0x0D, 0x91, 0x21, 0x7D, 0x19, 0x75, 0x24, 0x00, 0x15, 0x35, 0x1F, + 0xC0, 0x1B, 0x28, 0x30, 0x18, 0x25, 0xA6, 0x46, 0x2F, 0x20, 0xDF, 0x46, + 0x58, 0x0B, 0xBE, 0x2E, 0x01, 0xFF, 0xCB, 0x1D, 0x5A, 0xFB, 0xD4, 0x14, + 0x63, 0xE8, 0x12, 0xFE, 0x22, 0xD3, 0xF9, 0xE6, 0xF6, 0xD7, 0xDF, 0xDC, + 0x5C, 0xED, 0x78, 0xD0, 0x9D, 0xFD, 0x5D, 0xC8, 0x35, 0xFE, 0x1D, 0xD7, + 0xB4, 0xEB, 0x0E, 0xD9, 0x3A, 0xD7, 0xA4, 0xC3, 0x86, 0xDB, 0x7F, 0xD3, + 0x15, 0xE1, 0xFF, 0xED, 0xD8, 0xD3, 0xA7, 0xDA, 0xB3, 0xD0, 0x95, 0xCE, + 0x0F, 0xE4, 0x24, 0xEB, 0xF9, 0xFB, 0x45, 0x03, 0x2D, 0x04, 0xD0, 0xFF, + 0x23, 0x00, 0x8D, 0xF4, 0x79, 0xEC, 0x87, 0xE6, 0x3A, 0xD1, 0x3E, 0xD7, + 0x5D, 0xC0, 0x91, 0xC5, 0xE8, 0xCA, 0x56, 0xB6, 0x6D, 0xE1, 0x3C, 0xBA, + 0x05, 0xD8, 0x17, 0xCA, 0x67, 0xCC, 0x55, 0xDD, 0xAE, 0xDC, 0x1A, 0xEC, + 0x6C, 0xE9, 0x69, 0xE0, 0x62, 0xE7, 0x3B, 0xD1, 0xF0, 0xE8, 0x8B, 0xEB, + 0x22, 0xF9, 0x5E, 0x12, 0x41, 0x0B, 0x04, 0x18, 0xAD, 0x0D, 0x11, 0x11, + 0x26, 0x05, 0x47, 0x0B, 0x49, 0xFB, 0x70, 0xF6, 0x34, 0xE8, 0x14, 0xDF, + 0xA2, 0xD4, 0x09, 0xDB, 0xA6, 0xD2, 0x78, 0xE5, 0xC0, 0xCE, 0x06, 0xE9, + 0x52, 0xC1, 0x65, 0xDC, 0x5D, 0xC9, 0x97, 0xC9, 0xA5, 0xDB, 0xE7, 0xC2, + 0xA1, 0xE0, 0xCF, 0xD2, 0x25, 0xEB, 0xBE, 0xE0, 0x16, 0xFE, 0x95, 0xDF, + 0x3A, 0x0B, 0x3C, 0xE7, 0x55, 0x0C, 0x93, 0xF2, 0xC3, 0x08, 0x67, 0xFF, + 0x7B, 0x08, 0x96, 0x13, 0xBC, 0x10, 0x02, 0x27, 0x1A, 0x11, 0xA6, 0x2C, + 0x34, 0xF7, 0xDF, 0x1F, 0xDF, 0xE4, 0xAD, 0x18, 0x21, 0xF0, 0xB0, 0x16, + 0x79, 0x04, 0x13, 0x02, 0x14, 0x09, 0x84, 0xEB, 0x84, 0x02, 0x41, 0xF0, + 0x60, 0x01, 0xF0, 0xF8, 0x16, 0x05, 0x0E, 0xF2, 0x61, 0x02, 0xD9, 0xE3, + 0xFE, 0xFA, 0x84, 0xD2, 0x67, 0xF9, 0x9B, 0xCE, 0x09, 0x05, 0x76, 0xEC, + 0x9D, 0x03, 0x71, 0x06, 0xA8, 0xF4, 0xCE, 0xF9, 0x96, 0xF4, 0x71, 0xF2, + 0x23, 0x07, 0x86, 0x09, 0xFD, 0x18, 0xC4, 0x1B, 0x45, 0x1A, 0xC6, 0x23, + 0x6C, 0x18, 0x9A, 0x26, 0xCC, 0x01, 0x5F, 0x17, 0xD0, 0xD9, 0x2E, 0xFC, + 0xA4, 0xCC, 0xA7, 0xED, 0xBA, 0xD4, 0x70, 0xF8, 0xAC, 0xD8, 0x35, 0xFD, + 0x4D, 0xE7, 0x4A, 0xF4, 0xCA, 0xFD, 0x51, 0xF5, 0xDC, 0x03, 0x28, 0x02, + 0x3C, 0x02, 0x20, 0x03, 0x82, 0x08, 0xE9, 0xF7, 0x22, 0x1B, 0x83, 0x05, + 0x64, 0x2D, 0x95, 0x1F, 0xAF, 0x2D, 0x46, 0x26, 0x90, 0x2C, 0x69, 0x2C, + 0x2E, 0x30, 0x75, 0x2E, 0x58, 0x20, 0xAB, 0x16, 0x54, 0x05, 0x29, 0x03, + 0x3D, 0x07, 0xF7, 0xFC, 0x6C, 0x11, 0x63, 0xF2, 0x2D, 0xFC, 0x01, 0xF0, + 0x07, 0xE2, 0xAD, 0xF0, 0xA3, 0xDD, 0xF5, 0xE3, 0x34, 0xE3, 0x95, 0xD3, + 0xFF, 0xEB, 0xFD, 0xD4, 0x2F, 0xFB, 0x7E, 0xE3, 0x05, 0x0B, 0x52, 0xF0, + 0x6A, 0x0D, 0x3F, 0xF7, 0xE5, 0x00, 0x1A, 0xF8, 0x1D, 0xFA, 0xB2, 0x05, + 0xB4, 0xFE, 0x3C, 0x14, 0xDD, 0x10, 0x58, 0x15, 0x72, 0x14, 0xD0, 0x12, + 0x07, 0x02, 0x2F, 0x12, 0x54, 0xF9, 0x83, 0x17, 0x51, 0xFE, 0xD2, 0x19, + 0xA9, 0xFE, 0x30, 0x06, 0x89, 0xEE, 0xF4, 0xE8, 0xED, 0xE5, 0xDB, 0xE3, + 0x37, 0xEF, 0xDD, 0xF5, 0xD4, 0xF8, 0xA4, 0xF3, 0x39, 0xF0, 0xD5, 0xDB, + 0x1E, 0xE4, 0x3D, 0xD0, 0x6F, 0xEE, 0x57, 0xDB, 0x36, 0x02, 0x56, 0xF0, + 0x53, 0xFD, 0x91, 0xEA, 0x4C, 0xEE, 0x20, 0xDB, 0x52, 0xFC, 0xB3, 0xE5, + 0x4F, 0x0C, 0xDE, 0x03, 0x02, 0x00, 0xDD, 0x10, 0x4B, 0xFB, 0x50, 0x0F, + 0x09, 0x07, 0x74, 0x15, 0x07, 0xF8, 0x9B, 0x13, 0x5C, 0xCB, 0xAE, 0x00, + 0x31, 0xB3, 0x5E, 0xE9, 0xFE, 0xC0, 0x75, 0xE0, 0x4A, 0xD0, 0xB6, 0xE4, + 0xC6, 0xD5, 0x73, 0xE9, 0x6A, 0xE0, 0x3A, 0xE8, 0xEB, 0xF2, 0xFA, 0xE1, + 0x9E, 0xF9, 0xA5, 0xE0, 0xE3, 0xF2, 0x32, 0xED, 0x54, 0xF9, 0x7E, 0xFD, + 0x3B, 0x0A, 0x21, 0x03, 0xE4, 0x06, 0x7F, 0x03, 0x0C, 0xF3, 0x10, 0x01, + 0xC7, 0xEB, 0xCE, 0xFD, 0xA3, 0xEE, 0xB7, 0xF6, 0x0B, 0xEF, 0x1C, 0xE6, + 0x95, 0xED, 0x69, 0xDF, 0x02, 0xEA, 0x29, 0xE2, 0xD6, 0xDE, 0xC8, 0xD7, + 0x75, 0xDF, 0x01, 0xCC, 0x58, 0xEA, 0x51, 0xCE, 0x6D, 0xF0, 0xDE, 0xD4, + 0x21, 0xF9, 0xC0, 0xDE, 0x61, 0xFD, 0xF6, 0xF5, 0x14, 0x04, 0xD0, 0x0E, + 0x4D, 0x10, 0x93, 0x06, 0xC4, 0x15, 0xF2, 0xF0, 0x14, 0x10, 0xFA, 0xF1, + 0x96, 0x0F, 0x08, 0x0B, 0xB8, 0x16, 0x0B, 0x2C, 0xB7, 0x19, 0x45, 0x37, + 0x95, 0x1E, 0x58, 0x30, 0xBC, 0x20, 0x13, 0x24, 0x61, 0x21, 0x5D, 0x1E, + 0x3D, 0x20, 0x8A, 0x22, 0x9E, 0x0C, 0x76, 0x18, 0x78, 0xFA, 0xB4, 0x0C, + 0x82, 0x09, 0xB1, 0x14, 0xAC, 0x16, 0xBB, 0x17, 0x6A, 0x03, 0x98, 0x0C, + 0x43, 0xFD, 0x98, 0x0B, 0x92, 0x1B, 0xE7, 0x18, 0x2C, 0x30, 0x01, 0x10, + 0x58, 0x2D, 0x68, 0x00, 0xD3, 0x24, 0x50, 0x0E, 0x3B, 0x28, 0x13, 0x20, + 0xEB, 0x35, 0xAB, 0x21, 0x22, 0x3D, 0x94, 0x2A, 0x48, 0x38, 0xF6, 0x3E, + 0x83, 0x28, 0x63, 0x44, 0xA1, 0x15, 0xC0, 0x3D, 0x5E, 0x0A, 0xB0, 0x30, + 0x26, 0x0C, 0x9C, 0x21, 0xA8, 0x16, 0x14, 0x1B, 0x0D, 0x27, 0x7E, 0x25, + 0x75, 0x31, 0xD4, 0x2E, 0xE2, 0x34, 0x90, 0x2E, 0x7B, 0x3A, 0xB3, 0x33, + 0x6A, 0x38, 0x88, 0x28, 0xDE, 0x36, 0xD6, 0x1A, 0xCF, 0x47, 0xE7, 0x2D, + 0xB0, 0x50, 0xB0, 0x49, 0x5C, 0x39, 0xD4, 0x4E, 0x0F, 0x28, 0x9D, 0x45, + 0x68, 0x32, 0x24, 0x44, 0x58, 0x32, 0x38, 0x47, 0xEC, 0x24, 0x90, 0x3C, + 0x0C, 0x21, 0xC4, 0x2D, 0x1C, 0x1F, 0x64, 0x1E, 0x6E, 0x11, 0xF2, 0x06, + 0x6E, 0x01, 0x06, 0xF7, 0xE5, 0xFD, 0x15, 0xFC, 0x51, 0xFE, 0xF1, 0x06, + 0x38, 0x00, 0x17, 0x0C, 0xEA, 0x04, 0xFD, 0x0F, 0x0F, 0x0A, 0x9E, 0x0C, + 0x9B, 0x15, 0x18, 0x06, 0x92, 0x1D, 0xF1, 0x08, 0x62, 0x1C, 0xA3, 0x0C, + 0xAF, 0x20, 0x69, 0x12, 0x87, 0x1A, 0x33, 0x18, 0x73, 0x11, 0x0E, 0x1D, + 0x18, 0x17, 0x95, 0x26, 0x49, 0x12, 0x16, 0x24, 0xBE, 0x01, 0xAE, 0x10, + 0xBB, 0xFD, 0x09, 0x05, 0x2F, 0xFF, 0x45, 0xFC, 0xE3, 0x03, 0x10, 0xF0, + 0xBC, 0x0F, 0x51, 0xF0, 0x96, 0x04, 0xED, 0xEE, 0xBB, 0xE8, 0x24, 0xDD, + 0x69, 0xEE, 0x3B, 0xD6, 0x92, 0xFF, 0xC0, 0xE0, 0xCD, 0xF0, 0x71, 0xD8, + 0x7B, 0xE1, 0x9C, 0xC9, 0x43, 0xE6, 0xB8, 0xD1, 0x7F, 0xE4, 0x08, 0xE0, + 0xE3, 0xD7, 0x6D, 0xE5, 0x6D, 0xD6, 0x3C, 0xEA, 0x60, 0xDB, 0x9D, 0xEB, + 0x48, 0xD4, 0x4E, 0xE1, 0xC5, 0xC5, 0x0B, 0xD8, 0xD9, 0xC5, 0x8A, 0xDA, + 0x4A, 0xD4, 0xC6, 0xDD, 0x75, 0xDC, 0xFD, 0xDC, 0xE5, 0xD9, 0x15, 0xDA, + 0x75, 0xD4, 0xA1, 0xD3, 0xD3, 0xE2, 0xE1, 0xD1, 0x0B, 0xFA, 0xE4, 0xD6, + 0xE5, 0xF3, 0xA1, 0xDE, 0x8B, 0xE3, 0x7F, 0xDF, 0x44, 0xED, 0xD9, 0xDD, + 0xDB, 0xF6, 0x04, 0xEF, 0xC6, 0xEA, 0xF9, 0x04, 0x81, 0xE7, 0x87, 0x06, + 0x90, 0xEF, 0xE0, 0xFE, 0xD7, 0xEE, 0x63, 0x03, 0xBE, 0xE9, 0x43, 0x0B, + 0xC9, 0xE9, 0xF6, 0x05, 0x4F, 0xEC, 0x46, 0xF9, 0x03, 0xED, 0x29, 0xEE, + 0x4F, 0xE1, 0xAC, 0xEA, 0xE3, 0xD0, 0x04, 0xEF, 0x65, 0xD7, 0x33, 0xF0, + 0x1A, 0xE1, 0xB2, 0xEF, 0x73, 0xDF, 0x8E, 0xEA, 0xDE, 0xE7, 0xA5, 0xE2, + 0xC3, 0xF3, 0x4D, 0xED, 0x86, 0x01, 0xF0, 0xFA, 0x2E, 0x18, 0x8E, 0xFC, + 0x97, 0x18, 0xC5, 0xF9, 0xA8, 0x05, 0x74, 0x01, 0x98, 0xF7, 0x1F, 0x13, + 0xC8, 0xED, 0x00, 0x1F, 0x5A, 0xEA, 0x70, 0x1C, 0x49, 0xF4, 0x4C, 0x0D, + 0xC8, 0xF9, 0xCC, 0x02, 0xD6, 0xEE, 0xE9, 0x01, 0x98, 0xF3, 0x0B, 0xFB, + 0xF7, 0x01, 0xDF, 0xF1, 0x4E, 0xFD, 0xFB, 0xE7, 0xDF, 0xFA, 0xBA, 0xDD, + 0x1F, 0x08, 0xDD, 0xE4, 0x0D, 0x13, 0x4D, 0xF1, 0xD1, 0x14, 0x79, 0xFA, + 0x89, 0x11, 0x67, 0xFE, 0xA9, 0x0D, 0x27, 0xF2, 0xBB, 0x0C, 0x7B, 0xEB, + 0x0F, 0x0A, 0x12, 0xF4, 0x37, 0xFD, 0xCE, 0xFC, 0xA2, 0xE7, 0x7F, 0x03, + 0x02, 0xE1, 0x6E, 0x05, 0x78, 0xEB, 0xC2, 0xF6, 0xC0, 0xEC, 0x4F, 0xEE, + 0x37, 0xF0, 0x7C, 0x01, 0x49, 0x03, 0xD5, 0x09, 0x77, 0x09, 0xF6, 0xEE, + 0x7E, 0xFE, 0x6F, 0xE6, 0x10, 0xFA, 0xB0, 0xF8, 0xDD, 0xFA, 0xE1, 0xFA, + 0xFF, 0xFE, 0x09, 0xFE, 0xD5, 0x0F, 0xB4, 0x09, 0xBE, 0x15, 0x43, 0x07, + 0xF5, 0x08, 0xFC, 0x00, 0x1E, 0x0A, 0x23, 0x08, 0xCB, 0x11, 0xB5, 0x11, + 0x36, 0x14, 0xB0, 0x0D, 0xB3, 0x1B, 0xA7, 0x0B, 0x8A, 0x13, 0x94, 0x11, + 0xF5, 0xF9, 0xBF, 0x11, 0xAF, 0xED, 0xA9, 0x11, 0x43, 0xF1, 0xD7, 0x0F, + 0x9F, 0xF0, 0xDB, 0xFC, 0x60, 0xF5, 0x1A, 0xE6, 0xE0, 0x00, 0x80, 0xE9, + 0xFC, 0x08, 0x81, 0xFC, 0x16, 0x0A, 0xEA, 0xFC, 0xA4, 0x05, 0xD1, 0xF7, + 0xDE, 0x0F, 0xF6, 0x05, 0xDC, 0x22, 0x2C, 0x07, 0xBA, 0x1F, 0x3C, 0xF9, + 0x3E, 0x0C, 0x37, 0x02, 0x7C, 0x07, 0x19, 0x12, 0x3B, 0x09, 0xE5, 0x0F, + 0xB4, 0xFA, 0xCE, 0x0B, 0xEE, 0xE8, 0xDC, 0x13, 0x7C, 0xE5, 0xCA, 0x1E, + 0xBE, 0xEF, 0xAA, 0x1C, 0x92, 0x04, 0xFD, 0x0C, 0x16, 0x0A, 0x0A, 0xF8, + 0xAF, 0xF8, 0x3C, 0xE9, 0x90, 0xF1, 0x09, 0xF1, 0x6E, 0xFD, 0xC0, 0x01, + 0xA3, 0xFC, 0x21, 0xFB, 0x90, 0xEE, 0xDE, 0xEC, 0x29, 0xF1, 0x92, 0xEF, + 0x15, 0xF6, 0xE3, 0xED, 0x89, 0xF1, 0x89, 0xDF, 0x84, 0xF0, 0x4F, 0xDF, + 0x10, 0xEE, 0xD4, 0xE8, 0x89, 0xEA, 0xC9, 0xDF, 0x73, 0xE8, 0xFD, 0xDA, + 0xD6, 0xDC, 0x49, 0xE5, 0xC5, 0xD6, 0x1C, 0xEC, 0x8E, 0xE2, 0x50, 0xF6, + 0x37, 0xEA, 0x47, 0x00, 0x42, 0xE5, 0x2D, 0xF8, 0x10, 0xEC, 0xDB, 0xE4, + 0x70, 0x01, 0x2A, 0xE0, 0x34, 0x07, 0x9F, 0xEA, 0xC1, 0x02, 0xE7, 0xEE, + 0x3F, 0x02, 0x21, 0xEC, 0x44, 0x05, 0xDC, 0xEF, 0xC3, 0x08, 0x70, 0xEA, + 0x93, 0x08, 0xB2, 0xDF, 0x19, 0x02, 0x08, 0xE5, 0x25, 0xF2, 0xBE, 0xEB, + 0x43, 0xE6, 0xEC, 0xEA, 0xB0, 0xE0, 0xAD, 0xEE, 0xAA, 0xD4, 0x40, 0xF8, + 0xFA, 0xCA, 0x7D, 0xF3, 0x34, 0xD1, 0x5C, 0xE7, 0x09, 0xE0, 0x87, 0xE6, + 0x0A, 0xEB, 0x0D, 0xE0, 0xEB, 0xE9, 0x58, 0xD4, 0x61, 0xE2, 0x9A, 0xD9, + 0xB3, 0xEB, 0x50, 0xF0, 0xFF, 0xFE, 0xCB, 0xFF, 0x42, 0x02, 0xDF, 0xFD, + 0xFC, 0xFF, 0x79, 0xFD, 0x60, 0x00, 0xFE, 0xF8, 0xAF, 0xFF, 0x82, 0xEF, + 0x52, 0x05, 0xD4, 0xF5, 0xBE, 0x0D, 0x8B, 0x08, 0x5C, 0x0A, 0x48, 0x10, + 0x8B, 0x01, 0xC5, 0x11, 0x7F, 0xFC, 0x04, 0x16, 0x38, 0xF8, 0xEA, 0x14, + 0xE0, 0xFF, 0x8E, 0x19, 0x33, 0x14, 0xCF, 0x25, 0x81, 0x1D, 0x43, 0x27, + 0x3E, 0x22, 0x73, 0x27, 0x9D, 0x29, 0xA1, 0x33, 0xF9, 0x23, 0x76, 0x35, + 0xDA, 0x21, 0x9E, 0x22, 0xF6, 0x28, 0x9B, 0x1A, 0x46, 0x22, 0xA6, 0x2B, + 0x1B, 0x12, 0xC8, 0x31, 0x93, 0x1B, 0x82, 0x29, 0x61, 0x36, 0x91, 0x20, + 0x5B, 0x34, 0x7D, 0x18, 0x91, 0x1F, 0x35, 0x1C, 0x3F, 0x13, 0x74, 0x1E, + 0xBE, 0x0E, 0xBE, 0x1D, 0x63, 0x0C, 0x9F, 0x27, 0x72, 0x0F, 0x6E, 0x2B, + 0xC7, 0x0E, 0x4A, 0x1D, 0xA2, 0x0C, 0xFB, 0x20, 0xFF, 0x14, 0x97, 0x35, + 0xA9, 0x1C, 0x41, 0x30, 0xCF, 0x27, 0xC6, 0x2B, 0xCF, 0x40, 0x48, 0x2D, + 0x93, 0x4D, 0xF0, 0x18, 0xBD, 0x36, 0xF4, 0x16, 0x92, 0x27, 0x52, 0x31, + 0x9B, 0x38, 0x98, 0x40, 0x02, 0x3E, 0x4D, 0x3A, 0x0B, 0x3A, 0xC0, 0x2A, + 0x0F, 0x3E, 0x2A, 0x24, 0x44, 0x32, 0x15, 0x28, 0xA5, 0x1B, 0x8F, 0x28, + 0xFE, 0x0F, 0x15, 0x1B, 0x4D, 0x0B, 0x46, 0x0D, 0x73, 0x13, 0x5B, 0x16, + 0xDF, 0x24, 0x3A, 0x1D, 0x9E, 0x22, 0x72, 0x10, 0x33, 0x1D, 0xEA, 0x04, + 0x8A, 0x20, 0x40, 0x06, 0xB8, 0x16, 0x79, 0x13, 0xCF, 0x04, 0x1F, 0x17, + 0xD1, 0x05, 0xCF, 0x12, 0x25, 0x14, 0x01, 0x16, 0x32, 0x1B, 0x0F, 0x16, + 0x1F, 0x14, 0x87, 0x15, 0xD8, 0x04, 0x97, 0x1A, 0xAE, 0x02, 0x59, 0x12, + 0x86, 0x09, 0x4E, 0xFA, 0x98, 0x08, 0x9C, 0xF3, 0xC5, 0x09, 0xC1, 0xFF, + 0x57, 0x07, 0x40, 0x00, 0x50, 0xF3, 0x71, 0x01, 0xF6, 0xE9, 0xFB, 0x0A, + 0xA5, 0xF0, 0xEA, 0xFF, 0x53, 0xF0, 0x8D, 0xEA, 0xFF, 0xEB, 0x53, 0xE7, + 0x3A, 0xE8, 0x2C, 0xEA, 0xC2, 0xEB, 0x0B, 0xE9, 0x36, 0xF8, 0x8B, 0xEC, + 0x70, 0xFC, 0x14, 0xED, 0xFB, 0xF3, 0x28, 0xE4, 0xDE, 0xF1, 0x35, 0xDF, + 0x31, 0xF6, 0x7E, 0xDF, 0x36, 0xEC, 0xAE, 0xD2, 0x16, 0xDA, 0xBD, 0xC2, + 0x0F, 0xD0, 0xA5, 0xCB, 0x8D, 0xCB, 0x8E, 0xD9, 0x2F, 0xCB, 0xE9, 0xDD, + 0x9E, 0xCF, 0x37, 0xE4, 0x27, 0xD7, 0xA8, 0xDD, 0x46, 0xE2, 0xF5, 0xD0, + 0x9F, 0xEF, 0x62, 0xD5, 0x7A, 0xF3, 0xDA, 0xE2, 0x55, 0xEC, 0xC7, 0xEB, + 0x3C, 0xE5, 0x8D, 0xF0, 0xDA, 0xE1, 0x2A, 0xED, 0x09, 0xDC, 0xFA, 0xE8, + 0xE0, 0xD3, 0xC4, 0xEC, 0x55, 0xDA, 0x7B, 0xEB, 0x17, 0xE5, 0xDE, 0xE9, + 0x05, 0xDD, 0xE4, 0xEC, 0x24, 0xD6, 0x4A, 0xEA, 0x44, 0xE2, 0xB7, 0xE4, + 0xAD, 0xEB, 0xEE, 0xE7, 0x22, 0xE9, 0x7C, 0xEE, 0x8B, 0xEB, 0xA2, 0xEE, + 0x80, 0xF6, 0x22, 0xF0, 0xCA, 0x01, 0xF9, 0xEF, 0xCE, 0x08, 0x1D, 0xE7, + 0x08, 0x08, 0xA4, 0xE4, 0xA6, 0x02, 0x8C, 0xF0, 0x97, 0xFC, 0xF1, 0xFE, + 0xA3, 0xF6, 0x1A, 0x0D, 0xF1, 0xFA, 0x6B, 0x0B, 0xA3, 0x09, 0xE3, 0xF8, + 0xAE, 0x09, 0x03, 0xF6, 0x38, 0x01, 0x61, 0xFB, 0xC5, 0x01, 0x21, 0xF6, + 0x5E, 0x01, 0xE4, 0xF3, 0x7C, 0xF9, 0x3E, 0xFC, 0xB2, 0xE9, 0xC4, 0x05, + 0x12, 0xDE, 0x72, 0x04, 0x77, 0xE3, 0xAC, 0xF8, 0x9F, 0xED, 0x57, 0xF5, + 0xAC, 0xED, 0x58, 0xFA, 0xA7, 0xEE, 0xEF, 0xF2, 0x1A, 0xFB, 0x96, 0xE5, + 0xF2, 0xFF, 0x92, 0xE2, 0x07, 0xF7, 0x69, 0xE5, 0x8F, 0xF8, 0x1B, 0xEE, + 0x81, 0x03, 0x26, 0xF6, 0xB5, 0x01, 0xED, 0xEB, 0x74, 0xF8, 0x71, 0xE5, + 0x92, 0xF6, 0xAB, 0xEE, 0xFB, 0xFD, 0x6F, 0xF4, 0x81, 0xFD, 0x05, 0xEF, + 0xFC, 0xF2, 0x7F, 0xE8, 0x72, 0xEE, 0xF5, 0xF2, 0xC5, 0xE9, 0x69, 0x00, + 0x17, 0xEC, 0xA8, 0xFD, 0x40, 0xF7, 0x2E, 0xF0, 0x4D, 0xF7, 0xA3, 0xEA, + 0x01, 0xF6, 0xB9, 0x02, 0x8E, 0x03, 0x9D, 0x21, 0x1E, 0x12, 0x67, 0x28, + 0x2E, 0x1A, 0xFA, 0x26, 0x71, 0x18, 0x32, 0x27, 0x6F, 0x03, 0x95, 0x2A, + 0xA6, 0xF4, 0x06, 0x30, 0xAB, 0x00, 0xBF, 0x2A, 0xC7, 0x07, 0xBD, 0x1F, + 0x9C, 0xFA, 0xB0, 0x19, 0xD2, 0xFB, 0x31, 0x1B, 0x1C, 0x06, 0xB1, 0x1A, + 0x8B, 0xFB, 0x58, 0x16, 0x5E, 0xF4, 0x6B, 0x11, 0xAD, 0x00, 0xDF, 0x07, + 0x3C, 0x08, 0x4A, 0xFC, 0x29, 0x07, 0xF3, 0xF7, 0x68, 0x04, 0x26, 0xFD, + 0xC3, 0xFE, 0x7A, 0x03, 0xCB, 0x04, 0xAA, 0x01, 0xE0, 0x12, 0x7E, 0xF7, + 0x1C, 0x14, 0x75, 0xF1, 0xC6, 0x0D, 0x18, 0xF9, 0x4F, 0x06, 0xBA, 0x02, + 0xB1, 0xFE, 0x29, 0xFB, 0xA6, 0x06, 0x25, 0xEB, 0x46, 0x14, 0xC3, 0xEF, + 0xB6, 0x12, 0xED, 0x00, 0x56, 0x12, 0xC4, 0x09, 0xA7, 0x16, 0xD5, 0x0E, + 0x12, 0x0C, 0xA8, 0x07, 0xB7, 0xF7, 0x68, 0xFE, 0xA3, 0xE9, 0x00, 0x05, + 0xF6, 0xEC, 0xE5, 0x09, 0x7E, 0x03, 0xD7, 0x01, 0x2B, 0x17, 0xEE, 0xF4, + 0x67, 0x17, 0x9B, 0xE9, 0x03, 0x0F, 0x5E, 0xDE, 0xFB, 0x07, 0x52, 0xDC, + 0x61, 0xFA, 0x1F, 0xE9, 0x69, 0xE7, 0x6A, 0xEB, 0xBD, 0xE1, 0xDA, 0xE3, + 0x9E, 0xE8, 0x5F, 0xEA, 0xD6, 0xE8, 0xFE, 0xF5, 0x1E, 0xE0, 0x6D, 0xF5, + 0x36, 0xDE, 0xF3, 0xE6, 0x63, 0xDF, 0x50, 0xD5, 0x4A, 0xDE, 0x3B, 0xCE, + 0x55, 0xE5, 0xEC, 0xD5, 0xEA, 0xEA, 0x55, 0xE3, 0x47, 0xE5, 0xE9, 0xE9, + 0x8A, 0xE0, 0x84, 0xED, 0x46, 0xE4, 0x4C, 0xF0, 0xCF, 0xE6, 0xCA, 0xF2, + 0x28, 0xE6, 0x82, 0xF8, 0xD3, 0xE2, 0xA9, 0xF7, 0x63, 0xDC, 0x05, 0xF0, + 0xC1, 0xDE, 0xBB, 0xE9, 0x8A, 0xEA, 0xFD, 0xEC, 0xCA, 0xF0, 0xD2, 0xF4, + 0xDF, 0xEF, 0xB9, 0xF4, 0xF1, 0xF6, 0xE9, 0xF3, 0x87, 0xFD, 0xCA, 0xEE, + 0xCC, 0xF2, 0xCA, 0xE3, 0x5A, 0xE4, 0x5C, 0xE4, 0x52, 0xDF, 0x1E, 0xEC, + 0x5B, 0xE5, 0xA1, 0xE8, 0xFC, 0xEC, 0x20, 0xE2, 0x63, 0xEE, 0xA5, 0xE6, + 0x0E, 0xFE, 0x09, 0xEC, 0x1D, 0x14, 0xB2, 0xF5, 0x4E, 0x12, 0x06, 0x06, + 0xAC, 0x06, 0x75, 0x04, 0x1A, 0x03, 0x80, 0xF9, 0x67, 0x04, 0xDC, 0xFD, + 0x11, 0x0A, 0x15, 0x08, 0x57, 0x07, 0xF0, 0x09, 0x5F, 0xFE, 0xE2, 0x0B, + 0xFD, 0xFF, 0x04, 0x13, 0x5D, 0x01, 0xAF, 0x15, 0x1B, 0x02, 0x4B, 0x15, + 0x6C, 0x0C, 0x15, 0x17, 0x71, 0x16, 0x70, 0x1C, 0x7C, 0x15, 0xED, 0x2B, + 0x12, 0x14, 0x89, 0x37, 0x07, 0x1B, 0x52, 0x36, 0x54, 0x24, 0x2F, 0x2F, + 0xB4, 0x2A, 0xAB, 0x22, 0xDD, 0x28, 0x19, 0x1B, 0x83, 0x25, 0x50, 0x17, + 0x17, 0x26, 0x27, 0x19, 0x0A, 0x27, 0xC5, 0x20, 0xBE, 0x21, 0x2B, 0x1E, + 0x99, 0x1A, 0x9A, 0x16, 0x04, 0x1D, 0xDC, 0x11, 0x80, 0x26, 0x9B, 0x0A, + 0x1A, 0x33, 0x14, 0x0A, 0x8B, 0x38, 0x93, 0x0D, 0xE4, 0x2D, 0xC4, 0x0B, + 0xAF, 0x1A, 0x43, 0x0E, 0x12, 0x0C, 0xF6, 0x1E, 0x67, 0x0F, 0xCE, 0x2D, + 0xDF, 0x1A, 0x1D, 0x2C, 0xF5, 0x17, 0xE3, 0x2B, 0xA6, 0x13, 0x1A, 0x2B, + 0x24, 0x1B, 0x00, 0x24, 0x7E, 0x1D, 0x53, 0x26, 0x98, 0x1D, 0xD8, 0x26, + 0x84, 0x27, 0x7C, 0x23, 0x93, 0x30, 0xE9, 0x2B, 0x39, 0x34, 0x83, 0x34, + 0xE7, 0x35, 0xCB, 0x2E, 0xE5, 0x35, 0xFE, 0x25, 0x65, 0x34, 0xFB, 0x24, + 0x50, 0x32, 0xAA, 0x25, 0x22, 0x28, 0xF4, 0x2A, 0xA5, 0x1A, 0x37, 0x32, + 0x6E, 0x1B, 0x36, 0x29, 0xDD, 0x1F, 0x57, 0x17, 0x7E, 0x1A, 0xBA, 0x0F, + 0x7F, 0x15, 0x74, 0x12, 0x2A, 0x1C, 0xF7, 0x1D, 0xED, 0x2D, 0x75, 0x2B, + 0xC2, 0x39, 0xF2, 0x31, 0x8E, 0x30, 0x8E, 0x34, 0xE6, 0x23, 0x84, 0x38, + 0xFE, 0x23, 0x07, 0x39, 0x4F, 0x20, 0x85, 0x36, 0xA5, 0x1A, 0x13, 0x2D, + 0x76, 0x1B, 0x76, 0x17, 0x71, 0x18, 0x4D, 0x0C, 0x0B, 0x10, 0x29, 0x13, + 0x6B, 0x02, 0x05, 0x1E, 0xA8, 0xF2, 0xC5, 0x1D, 0x03, 0xF8, 0x74, 0x0D, + 0x8B, 0x09, 0x47, 0xFF, 0x7F, 0x00, 0x93, 0xFF, 0xE8, 0xEC, 0xAA, 0xFF, + 0x9F, 0xEA, 0xE8, 0xF2, 0x77, 0xE6, 0xB5, 0xE8, 0x61, 0xDB, 0xC0, 0xE7, + 0x40, 0xDD, 0xE1, 0xE3, 0x0B, 0xDF, 0xD9, 0xDC, 0xF1, 0xD8, 0x86, 0xD0, + 0x60, 0xD9, 0x6A, 0xC5, 0xDC, 0xDA, 0xD1, 0xC1, 0x88, 0xD7, 0xF9, 0xB9, + 0xA8, 0xD9, 0x15, 0xB7, 0x1A, 0xE7, 0xF5, 0xC2, 0xF7, 0xF1, 0x47, 0xCC, + 0x27, 0xF0, 0x79, 0xC4, 0x49, 0xE2, 0x70, 0xBE, 0xEE, 0xD2, 0x1D, 0xCB, + 0x98, 0xCA, 0x6C, 0xDA, 0x2B, 0xC5, 0x6C, 0xE1, 0xDB, 0xCB, 0xE8, 0xE2, + 0x23, 0xDE, 0x09, 0xE3, 0x97, 0xE8, 0x72, 0xEC, 0x72, 0xE8, 0x02, 0xF8, + 0x61, 0xE4, 0x94, 0xF2, 0x25, 0xE5, 0xEE, 0xE5, 0x07, 0xEA, 0x6D, 0xE0, + 0x01, 0xEA, 0x87, 0xE2, 0xBA, 0xE6, 0x61, 0xED, 0x3F, 0xE2, 0x48, 0xF9, + 0x5D, 0xDD, 0xBF, 0xF8, 0xD4, 0xDA, 0x2B, 0xF0, 0x5B, 0xE5, 0x55, 0xEB, + 0x8B, 0xEF, 0x5F, 0xE5, 0xF8, 0xEA, 0x57, 0xDD, 0xCA, 0xEE, 0x71, 0xDB, + 0xFD, 0xF5, 0xE7, 0xE0, 0x6E, 0xEB, 0xB1, 0xE5, 0x67, 0xE9, 0x4F, 0xF0, + 0x2E, 0xF8, 0x82, 0x08, 0x48, 0x03, 0xB4, 0x0E, 0x2C, 0x08, 0xBE, 0xFE, + 0xC5, 0x07, 0xD6, 0xF9, 0x2B, 0x04, 0x5B, 0xFC, 0x6E, 0x01, 0xA7, 0xFA, + 0x50, 0x03, 0xE1, 0x00, 0x3F, 0x08, 0x03, 0x05, 0xA5, 0x0F, 0x41, 0xFB, + 0x8D, 0x14, 0x84, 0xF6, 0x03, 0x0F, 0x69, 0xFC, 0x04, 0x00, 0x93, 0xF9, + 0x40, 0xEC, 0xD3, 0xF3, 0x90, 0xE1, 0xCE, 0xF7, 0x5F, 0xE7, 0xF4, 0xFD, + 0x46, 0xF2, 0x1D, 0x03, 0x7F, 0xFA, 0x91, 0xFB, 0x50, 0xFD, 0xD7, 0xEF, + 0x89, 0xF8, 0x2E, 0xF3, 0xDE, 0xF0, 0xBC, 0xFB, 0x6A, 0xEC, 0x5F, 0xFE, + 0x63, 0xEB, 0x3C, 0xF6, 0x1F, 0xEE, 0x7B, 0xEE, 0xEF, 0xEA, 0x6E, 0xF0, + 0xDB, 0xE0, 0xA0, 0xF1, 0x58, 0xE1, 0x3D, 0xE9, 0xB9, 0xEB, 0x66, 0xDF, + 0x86, 0xF0, 0x56, 0xE1, 0x5C, 0xF0, 0xE5, 0xE5, 0x3E, 0xF0, 0xCE, 0xE8, + 0xDB, 0xE9, 0x74, 0xF8, 0xA2, 0xE6, 0x6F, 0x0B, 0x64, 0xEF, 0x90, 0x0F, + 0x3A, 0xFC, 0xE2, 0x10, 0xF7, 0x03, 0x4B, 0x13, 0x2A, 0x05, 0x42, 0x15, + 0x79, 0x09, 0xD9, 0x15, 0xBE, 0x12, 0x34, 0x10, 0xF0, 0x13, 0xEC, 0x0E, + 0x9C, 0x0B, 0xBF, 0x13, 0xBA, 0x0F, 0x3F, 0x1B, 0x89, 0x22, 0xCD, 0x1C, + 0x36, 0x30, 0xCE, 0x13, 0x22, 0x34, 0x8F, 0x06, 0x1D, 0x2B, 0x3C, 0xFB, + 0xDE, 0x17, 0x6F, 0xF8, 0xB9, 0x0A, 0x6D, 0xFD, 0xC4, 0x02, 0xC5, 0x00, + 0xAE, 0xFE, 0xE2, 0xFD, 0xBD, 0x01, 0xE6, 0xF9, 0x74, 0x02, 0x32, 0xFD, + 0xE8, 0xFC, 0xB7, 0x02, 0x0F, 0xFF, 0x62, 0x02, 0x3B, 0x14, 0x63, 0x04, + 0x5F, 0x22, 0xBE, 0x0C, 0x58, 0x16, 0x0E, 0x0D, 0x03, 0x06, 0xBC, 0x02, + 0x04, 0x08, 0x6E, 0x04, 0x65, 0x14, 0x25, 0x07, 0x80, 0x12, 0x05, 0xF8, + 0x66, 0x06, 0x56, 0xF2, 0x1A, 0x01, 0xE8, 0x00, 0xC1, 0xF6, 0xE5, 0x05, + 0xFA, 0xE9, 0x67, 0xFD, 0xFD, 0xE6, 0x8F, 0xF5, 0x58, 0xE5, 0x94, 0xEB, + 0xF0, 0xE2, 0x2C, 0xE6, 0xEE, 0xE2, 0xEF, 0xEA, 0x49, 0xE6, 0xA1, 0xED, + 0x73, 0xEA, 0x09, 0xE2, 0x7B, 0xEC, 0xFF, 0xD5, 0xAF, 0xE6, 0xCE, 0xE6, + 0xF9, 0xDA, 0x92, 0x02, 0x21, 0xD9, 0xAC, 0x01, 0xC9, 0xE0, 0xE5, 0xF3, + 0x9A, 0xE4, 0x42, 0xEA, 0xFE, 0xE9, 0x46, 0xDF, 0x01, 0xEE, 0x44, 0xDD, + 0xFA, 0xE3, 0xAB, 0xE8, 0x0A, 0xDC, 0xD0, 0xF3, 0x18, 0xE3, 0x17, 0xF6, + 0x3D, 0xED, 0x22, 0xF2, 0x8A, 0xEB, 0x62, 0xEE, 0x5E, 0xE0, 0xF0, 0xF5, + 0x2F, 0xDF, 0x13, 0xFE, 0x44, 0xE4, 0xA8, 0xFB, 0xC0, 0xDF, 0xC9, 0xF8, + 0x6D, 0xDB, 0x67, 0xF4, 0x65, 0xE0, 0x1A, 0xF1, 0xF8, 0xEC, 0xCB, 0xEF, + 0x1A, 0xFA, 0x3E, 0xE5, 0x4D, 0x00, 0x53, 0xDA, 0x55, 0x02, 0x63, 0xE5, + 0x5F, 0x04, 0x9A, 0xF7, 0x4B, 0x07, 0x00, 0xFB, 0x49, 0x09, 0x4E, 0xF8, + 0x27, 0x0B, 0x8E, 0xF5, 0x11, 0x0E, 0xD1, 0xF5, 0x6B, 0x06, 0x22, 0xFB, + 0xA9, 0xF5, 0x33, 0xFA, 0x7F, 0xED, 0x13, 0xF2, 0x93, 0xED, 0xE1, 0xEE, + 0x6E, 0xFB, 0x5F, 0xEE, 0xD5, 0x0A, 0x0E, 0xF5, 0x87, 0x09, 0x93, 0x0A, + 0x2A, 0x0F, 0x40, 0x1B, 0x68, 0x21, 0x83, 0x11, 0xE0, 0x23, 0x1D, 0xFD, + 0xED, 0x17, 0xA1, 0xF8, 0xCD, 0x11, 0x3A, 0xFF, 0x76, 0x0B, 0x6F, 0x0B, + 0x52, 0xFF, 0x89, 0x11, 0xA7, 0xF5, 0x13, 0x0C, 0x67, 0xEF, 0x73, 0x0F, + 0xC4, 0xEF, 0x22, 0x15, 0xE3, 0xF9, 0x28, 0x13, 0x1D, 0x07, 0x45, 0x0A, + 0x5D, 0x0D, 0x7E, 0xF3, 0x2B, 0x0E, 0xA1, 0xEC, 0xF6, 0x0B, 0x21, 0x05, + 0x24, 0x0B, 0x0B, 0x10, 0x27, 0x14, 0x46, 0x09, 0xC2, 0x17, 0x4E, 0x0D, + 0xF1, 0x10, 0xF5, 0x0B, 0xE8, 0x0D, 0xC5, 0x05, 0x4F, 0x10, 0xD1, 0x0E, + 0x1C, 0x12, 0x3F, 0x11, 0xD7, 0x17, 0x44, 0x08, 0x26, 0x22, 0x92, 0x13, + 0x41, 0x28, 0x74, 0x26, 0x13, 0x2D, 0xD2, 0x24, 0x10, 0x33, 0x9A, 0x23, + 0x2A, 0x2E, 0xAE, 0x33, 0x71, 0x22, 0x5B, 0x40, 0x69, 0x1F, 0x58, 0x3B, + 0x5B, 0x23, 0xD7, 0x34, 0x6B, 0x29, 0xC6, 0x39, 0xD9, 0x2F, 0xCF, 0x3F, + 0xAC, 0x33, 0x8E, 0x3E, 0x34, 0x35, 0x4F, 0x38, 0x82, 0x3C, 0x48, 0x35, + 0xEA, 0x4A, 0xB7, 0x36, 0x1A, 0x51, 0xB3, 0x35, 0xB0, 0x49, 0xBE, 0x38, + 0x54, 0x3C, 0x4D, 0x43, 0x9F, 0x2C, 0x12, 0x49, 0xFE, 0x28, 0xBB, 0x4E, + 0xE2, 0x2B, 0x48, 0x51, 0xAE, 0x22, 0xD8, 0x40, 0x5F, 0x1B, 0xB8, 0x2E, + 0x0D, 0x1D, 0x4C, 0x29, 0xDD, 0x1C, 0x25, 0x27, 0xAD, 0x1A, 0xE4, 0x25, + 0xBE, 0x1C, 0x24, 0x25, 0x8D, 0x22, 0x3C, 0x23, 0x50, 0x25, 0x7F, 0x26, + 0xB1, 0x29, 0x6D, 0x27, 0x8D, 0x31, 0xA3, 0x16, 0x1B, 0x2D, 0x68, 0x06, + 0xBC, 0x20, 0x68, 0x08, 0x6A, 0x0F, 0x24, 0x0F, 0xA6, 0x01, 0xE5, 0x0E, + 0xAC, 0x07, 0x55, 0x09, 0xEB, 0x11, 0x81, 0x00, 0xF7, 0x0F, 0xA8, 0xFD, + 0x10, 0xFC, 0xB9, 0xFC, 0x55, 0xEB, 0x0D, 0xF1, 0x3F, 0xF5, 0x34, 0xE8, + 0x54, 0xFA, 0xEC, 0xE0, 0x39, 0xE1, 0xBA, 0xD6, 0x30, 0xCD, 0x2B, 0xD5, + 0x08, 0xD1, 0x92, 0xD8, 0xF3, 0xD9, 0xEF, 0xD7, 0xFD, 0xE0, 0xA9, 0xD2, + 0xB3, 0xE0, 0x3A, 0xCC, 0xDD, 0xDE, 0xF5, 0xCA, 0x8C, 0xE2, 0x8C, 0xD0, + 0x6A, 0xE3, 0x3F, 0xD2, 0xBF, 0xE0, 0xC6, 0xCC, 0x6D, 0xDF, 0x19, 0xCC, + 0x1B, 0xDE, 0x3A, 0xD1, 0xCA, 0xD6, 0x97, 0xD7, 0x76, 0xD5, 0x10, 0xE2, + 0x20, 0xDC, 0x82, 0xE8, 0xE3, 0xDD, 0x34, 0xEA, 0x6C, 0xDD, 0x46, 0xED, + 0x2D, 0xDB, 0x01, 0xF4, 0x56, 0xD6, 0xE3, 0xFB, 0xE8, 0xD4, 0xE2, 0xFB, + 0x81, 0xDE, 0xC4, 0xF2, 0xCC, 0xF5, 0x34, 0xE4, 0x65, 0x05, 0xD9, 0xDE, + 0xF9, 0xFD, 0xEB, 0xE9, 0xA1, 0xF7, 0xE8, 0xF9, 0xDB, 0xFF, 0x2D, 0x03, + 0x2B, 0x03, 0x0B, 0x00, 0x19, 0xF7, 0xF8, 0xFE, 0x33, 0xEC, 0x96, 0x06, + 0x81, 0xEA, 0x53, 0x0C, 0x25, 0xE8, 0x3D, 0x0F, 0x4F, 0xE8, 0x11, 0x08, + 0x05, 0xE8, 0xFA, 0xFE, 0x55, 0xE5, 0xBA, 0x01, 0x7A, 0xEE, 0x3B, 0x03, + 0x64, 0xF6, 0xD9, 0xFA, 0x3C, 0xF3, 0x28, 0xEE, 0xCD, 0xF1, 0xA2, 0xEB, + 0xD8, 0xEF, 0x60, 0xF2, 0xBA, 0xE8, 0xC2, 0xF0, 0xBC, 0xE5, 0x52, 0xE5, + 0xFD, 0xE7, 0x1B, 0xD7, 0x9C, 0xE9, 0x3D, 0xD3, 0xAA, 0xE6, 0xE6, 0xD9, + 0x05, 0xD8, 0x6D, 0xE0, 0xEF, 0xD1, 0x3B, 0xE3, 0x6B, 0xE9, 0x23, 0xE0, + 0xC4, 0xFC, 0x7B, 0xE5, 0x22, 0xF6, 0x68, 0xF4, 0x22, 0xEC, 0x90, 0xFC, + 0x41, 0xEB, 0xEC, 0xFE, 0x26, 0xE9, 0x15, 0xFC, 0x33, 0xEB, 0x52, 0xED, + 0xED, 0xF6, 0x57, 0xDA, 0x2C, 0xF9, 0x63, 0xD7, 0xF4, 0xF7, 0xD2, 0xEB, + 0x5B, 0xFB, 0xBA, 0xFE, 0xEF, 0xFD, 0xF2, 0xF9, 0x6B, 0x0B, 0xE6, 0xE6, + 0xA3, 0x17, 0xBF, 0xE1, 0x1C, 0x15, 0xB5, 0xF1, 0x26, 0x12, 0x5D, 0xFA, + 0x4C, 0x0B, 0xD5, 0xF6, 0x14, 0xFB, 0xF4, 0xFB, 0x78, 0xEE, 0x2C, 0x06, + 0x0D, 0xF3, 0x5B, 0x11, 0x5D, 0xFF, 0xC5, 0x1A, 0xC4, 0x02, 0x9D, 0x1A, + 0x32, 0x04, 0xDF, 0x13, 0x63, 0x09, 0x54, 0x12, 0x41, 0x0F, 0x34, 0x1B, + 0x40, 0x10, 0x72, 0x1D, 0xB0, 0x0F, 0x6D, 0x18, 0x08, 0x16, 0xD3, 0x18, + 0x3A, 0x19, 0x70, 0x15, 0xD2, 0x16, 0xE6, 0x08, 0x65, 0x17, 0x4C, 0x00, + 0x98, 0x15, 0x99, 0x02, 0xE4, 0x12, 0xA4, 0x0B, 0x14, 0x0B, 0xAE, 0x0F, + 0x2E, 0x00, 0x5B, 0x0B, 0x96, 0x0B, 0x9C, 0x0A, 0x4B, 0x1C, 0xE8, 0x0E, + 0x78, 0x13, 0x39, 0x11, 0xB0, 0x03, 0x0E, 0x0B, 0xD4, 0x02, 0x85, 0xFF, + 0xC5, 0x02, 0xA8, 0xF6, 0x7E, 0xF9, 0x67, 0xED, 0xDB, 0xF1, 0xCC, 0xEA, + 0xBD, 0xEA, 0x4C, 0xF8, 0xB0, 0xEC, 0xBC, 0xFD, 0xA8, 0xFD, 0xA2, 0xF4, + 0x76, 0x04, 0xF7, 0xF0, 0x8A, 0x01, 0x77, 0xE9, 0x27, 0x01, 0x63, 0xDF, + 0x57, 0xF9, 0xD2, 0xE5, 0xD4, 0xEA, 0xCE, 0xF6, 0x5F, 0xE2, 0x91, 0xFD, + 0x1E, 0xDF, 0x38, 0x00, 0x3C, 0xD8, 0x50, 0x04, 0x82, 0xCF, 0x13, 0x00, + 0xC5, 0xCF, 0x07, 0xFC, 0x51, 0xDD, 0xF1, 0xF4, 0xCA, 0xE4, 0x2E, 0xE1, + 0x78, 0xE4, 0xB7, 0xD9, 0xFE, 0xE7, 0x45, 0xE3, 0xC3, 0xE8, 0x5C, 0xE5, + 0xA4, 0xEE, 0x0E, 0xE7, 0x19, 0x06, 0x3E, 0xF0, 0x85, 0x12, 0xEE, 0xF1, + 0x81, 0x02, 0x52, 0xED, 0x4C, 0xF8, 0x9D, 0xEF, 0x0F, 0x00, 0xB2, 0xF6, + 0x00, 0x02, 0x81, 0xF8, 0x8B, 0xFC, 0xFC, 0xF5, 0xE9, 0xFB, 0x60, 0xFB, + 0x27, 0xF9, 0x01, 0x06, 0x26, 0xFE, 0x9D, 0x07, 0x31, 0x0E, 0xB4, 0xFA, + 0x3E, 0x10, 0x0D, 0xEC, 0xB7, 0x03, 0x72, 0xEB, 0x08, 0xF9, 0xC2, 0xFE, + 0x31, 0xF4, 0x10, 0x15, 0x20, 0xFB, 0x1C, 0x12, 0x7C, 0x06, 0xED, 0x04, + 0x24, 0x02, 0xD3, 0x01, 0x91, 0xF8, 0xEC, 0xFB, 0xDC, 0xF6, 0x1B, 0xFC, + 0xD2, 0xF2, 0x9C, 0x04, 0x35, 0xF2, 0x69, 0xFB, 0x5E, 0xF6, 0x86, 0xE7, + 0x27, 0xF2, 0xA8, 0xD8, 0x26, 0xE8, 0x37, 0xD7, 0x26, 0xE1, 0x6C, 0xE5, + 0xDD, 0xE8, 0x99, 0xE6, 0x54, 0xF8, 0x3D, 0xD8, 0x36, 0xFA, 0xD3, 0xD7, + 0x53, 0xED, 0x75, 0xE0, 0x2D, 0xE1, 0xBC, 0xE2, 0x92, 0xD8, 0x7B, 0xE4, + 0x04, 0xD8, 0xD9, 0xE3, 0x7E, 0xE0, 0xE0, 0xD9, 0xFC, 0xE3, 0xB6, 0xD8, + 0xCF, 0xEA, 0xE8, 0xE7, 0xA3, 0xF3, 0xFA, 0xEE, 0x80, 0xF1, 0x91, 0xEB, + 0xD3, 0xF0, 0x67, 0xEB, 0x55, 0xF9, 0xCC, 0xF2, 0x94, 0xF7, 0x0B, 0x07, + 0xDC, 0xEF, 0x7D, 0x1C, 0x6D, 0xF7, 0x86, 0x20, 0x13, 0xFE, 0xD2, 0x20, + 0x8F, 0xFE, 0x0A, 0x27, 0x97, 0x04, 0x9A, 0x29, 0x2B, 0x06, 0x9E, 0x24, + 0x24, 0x0F, 0x13, 0x17, 0x37, 0x24, 0xED, 0x0D, 0x1C, 0x26, 0x22, 0x0F, + 0x94, 0x19, 0xD5, 0x18, 0xD2, 0x1D, 0xEC, 0x29, 0x08, 0x2D, 0x60, 0x2F, + 0x3D, 0x33, 0x33, 0x25, 0xA1, 0x36, 0x38, 0x21, 0xFD, 0x31, 0x21, 0x28, + 0x8F, 0x28, 0x7C, 0x2E, 0xDD, 0x27, 0x37, 0x31, 0x67, 0x23, 0x3F, 0x33, + 0xD8, 0x26, 0xC8, 0x2F, 0x32, 0x42, 0x6A, 0x2F, 0x68, 0x55, 0x14, 0x40, + 0xDE, 0x4E, 0xB4, 0x4B, 0x21, 0x48, 0xF3, 0x43, 0xBA, 0x48, 0x58, 0x39, + 0xFF, 0x47, 0xB7, 0x3C, 0x69, 0x47, 0xE8, 0x4C, 0x14, 0x49, 0x91, 0x55, + 0xD2, 0x47, 0xA1, 0x52, 0x27, 0x40, 0x13, 0x4C, 0x2F, 0x3B, 0x89, 0x41, + 0x6E, 0x3B, 0xCB, 0x36, 0x99, 0x3D, 0xBA, 0x32, 0x4F, 0x3C, 0xB2, 0x32, + 0x90, 0x34, 0xE5, 0x24, 0x5B, 0x26, 0x34, 0x10, 0x7E, 0x13, 0x07, 0x0A, + 0x1A, 0x08, 0xD6, 0x0E, 0x67, 0x04, 0x61, 0x18, 0xF1, 0x07, 0xDC, 0x18, + 0x5C, 0x0F, 0x90, 0x06, 0x26, 0x09, 0xAF, 0xF7, 0x0D, 0xFE, 0x0A, 0xF7, + 0xFA, 0x04, 0x14, 0xF5, 0x4A, 0x09, 0x8F, 0xF4, 0x7B, 0xF9, 0x15, 0xFB, + 0xF3, 0xF4, 0x2F, 0x00, 0xEF, 0x03, 0x60, 0xFE, 0xCC, 0x0C, 0x6C, 0xF5, + 0xFD, 0x04, 0x27, 0xF2, 0x48, 0xF1, 0xD2, 0xF9, 0xA5, 0xE2, 0xD6, 0xFD, + 0xF9, 0xE6, 0x3A, 0xFD, 0xA9, 0xEF, 0x3A, 0x03, 0xFC, 0xEF, 0xFE, 0x06, + 0xF3, 0xF3, 0x56, 0x05, 0xBF, 0xFE, 0xA7, 0x09, 0x89, 0x03, 0xEA, 0x09, + 0xFB, 0x02, 0xAD, 0xFF, 0xCF, 0x02, 0x1C, 0xF5, 0x14, 0x00, 0x09, 0xEE, + 0x4A, 0xFC, 0x36, 0xE8, 0xFA, 0xF3, 0xB2, 0xEA, 0xDE, 0xF1, 0x96, 0xF8, + 0x61, 0xFF, 0x9F, 0xFB, 0x2F, 0x07, 0xBC, 0xEF, 0x0E, 0x05, 0x0D, 0xE9, + 0xDA, 0x07, 0x57, 0xE8, 0x7F, 0x00, 0x2D, 0xEE, 0x1E, 0xF0, 0xE1, 0xF6, + 0x70, 0xEF, 0x17, 0xF8, 0x96, 0xF3, 0x3A, 0xF9, 0x71, 0xF0, 0x33, 0x02, + 0xD0, 0xF0, 0x3A, 0x09, 0xE5, 0xF6, 0xD9, 0x06, 0xCE, 0xF3, 0xF0, 0x02, + 0xC9, 0xE8, 0x6D, 0xFC, 0x49, 0xDE, 0x5A, 0xF1, 0x7E, 0xD5, 0xE2, 0xED, + 0x8C, 0xDD, 0x5A, 0xF1, 0x62, 0xED, 0x66, 0xEF, 0x40, 0xED, 0x3C, 0xE6, + 0x0A, 0xE3, 0xCD, 0xE1, 0x69, 0xDC, 0xBA, 0xE5, 0x7D, 0xDF, 0xB1, 0xE0, + 0xC5, 0xE0, 0xF5, 0xD7, 0xBF, 0xD9, 0x98, 0xDB, 0x7E, 0xD9, 0x62, 0xE2, + 0x74, 0xDC, 0x41, 0xE2, 0x57, 0xDC, 0x72, 0xE3, 0x68, 0xE4, 0x3D, 0xE1, + 0xCA, 0xEE, 0xBD, 0xD0, 0x8A, 0xED, 0xB5, 0xC1, 0x23, 0xE8, 0x0A, 0xC3, + 0x5D, 0xE5, 0x99, 0xD1, 0x2D, 0xE5, 0x8B, 0xDB, 0x03, 0xEA, 0x1C, 0xD5, + 0x8D, 0xEA, 0x73, 0xCF, 0x1E, 0xE0, 0xE4, 0xDB, 0x4F, 0xD6, 0x92, 0xE7, + 0x2D, 0xDB, 0xC8, 0xEA, 0xA6, 0xE6, 0xD8, 0xE8, 0x9D, 0xE6, 0xA0, 0xDB, + 0xCF, 0xDD, 0x6C, 0xDE, 0xF5, 0xD7, 0x23, 0xFD, 0x12, 0xDC, 0x4D, 0x10, + 0x87, 0xE8, 0xC6, 0x0C, 0x83, 0xF9, 0xF2, 0x0A, 0x2C, 0x0C, 0x2D, 0x0B, + 0xD9, 0x11, 0x61, 0x08, 0xE7, 0x0C, 0xBD, 0x0F, 0x1E, 0x0C, 0xFF, 0x14, + 0x15, 0x0A, 0x54, 0x06, 0xBE, 0x04, 0x04, 0xFA, 0x97, 0x08, 0x33, 0xFD, + 0xE2, 0x0E, 0xB1, 0xFF, 0xD2, 0x0B, 0x78, 0xF7, 0x56, 0x0B, 0xE1, 0xF1, + 0x53, 0x12, 0x76, 0xFA, 0x20, 0x16, 0xA9, 0x05, 0x78, 0x16, 0xBA, 0x0B, + 0x47, 0x1E, 0xCB, 0x17, 0x9E, 0x24, 0x3C, 0x29, 0xA2, 0x1E, 0xFA, 0x2D, + 0x0A, 0x19, 0x25, 0x2C, 0x91, 0x15, 0x5A, 0x33, 0x6F, 0x14, 0xED, 0x35, + 0xA9, 0x18, 0xE3, 0x2B, 0xD9, 0x15, 0x91, 0x1B, 0x05, 0x0A, 0x04, 0x0B, + 0x8B, 0xFD, 0x5F, 0x0B, 0x62, 0xF4, 0x4A, 0x18, 0x6D, 0xF2, 0x36, 0x12, + 0xED, 0xF6, 0xBC, 0xFC, 0x4A, 0xFB, 0x78, 0xEF, 0xBF, 0xF5, 0x19, 0xEE, + 0xEE, 0xE9, 0x6A, 0xF3, 0xD0, 0xE2, 0xA4, 0xF2, 0x49, 0xDB, 0x5B, 0xE9, + 0xE7, 0xDC, 0x5D, 0xE5, 0xFE, 0xE6, 0x41, 0xEC, 0x34, 0xE6, 0x06, 0xF1, + 0x0B, 0xE3, 0xDB, 0xF0, 0xCF, 0xE9, 0x11, 0xE9, 0x46, 0xF0, 0x99, 0xDA, + 0xB5, 0xED, 0xAE, 0xDA, 0x3C, 0xF0, 0x2D, 0xE4, 0x67, 0xF5, 0x84, 0xEF, + 0x13, 0xF7, 0x4C, 0xF6, 0xDA, 0xFA, 0x45, 0xEE, 0x35, 0xFE, 0x70, 0xEB, + 0x20, 0xFE, 0x35, 0xF7, 0x4F, 0x05, 0x24, 0x06, 0x86, 0x11, 0x5C, 0x01, + 0xA4, 0x19, 0x0C, 0xFF, 0x8F, 0x0C, 0x79, 0x03, 0x2C, 0x02, 0xA0, 0x0B, + 0x74, 0x29, 0x90, 0x39, 0xB9, 0x35, 0x5B, 0x48, 0x4C, 0x28, 0xE7, 0x3D, + 0x61, 0x41, 0x2E, 0x52, 0x46, 0x59, 0xFC, 0x5F, 0x2A, 0x5D, 0x20, 0x5A, + 0x12, 0x52, 0x1A, 0x4A, 0xD0, 0x44, 0x5A, 0x3F, 0xB8, 0x3A, 0x3D, 0x37, + 0x8A, 0x25, 0x4C, 0x1E, 0x49, 0x0E, 0x66, 0xF9, 0xCB, 0x0B, 0xFD, 0xE7, + 0xE8, 0x0D, 0xE8, 0xE9, 0xD9, 0x01, 0x53, 0xE8, 0x0B, 0xFF, 0xE3, 0xEA, + 0x07, 0xFA, 0x15, 0xEF, 0xA0, 0xEC, 0x9B, 0xE8, 0x5E, 0xE1, 0x8B, 0xDB, + 0x39, 0xD1, 0x1C, 0xD3, 0xF3, 0xC0, 0x63, 0xCD, 0x88, 0xAF, 0x60, 0xBD, + 0x0F, 0xB4, 0xE2, 0xC0, 0x5F, 0xCE, 0x5B, 0xDD, 0xE0, 0xD3, 0xAF, 0xDA, + 0x08, 0xD4, 0xD3, 0xD3, 0xCF, 0xD4, 0x2B, 0xE5, 0xDF, 0xCC, 0xFB, 0xE1, + 0x92, 0xC9, 0x07, 0xCB, 0xA7, 0xE5, 0xD9, 0xD2, 0x14, 0xF9, 0xA0, 0xDF, + 0xF8, 0xE9, 0x0D, 0xDA, 0x94, 0x00, 0x60, 0xEF, 0xE2, 0x15, 0x1E, 0xFC, + 0x59, 0x0D, 0x43, 0xF8, 0x7A, 0x0A, 0xB7, 0x0D, 0x7E, 0x15, 0xF0, 0x2F, + 0x0F, 0x0C, 0x79, 0x2B, 0x13, 0xF0, 0xCC, 0x07, 0xAB, 0x02, 0x93, 0x15, + 0x96, 0x27, 0xF0, 0x40, 0x33, 0x0B, 0xB6, 0x20, 0x94, 0xE0, 0x62, 0xEF, + 0xC9, 0x00, 0x94, 0x0C, 0x62, 0x14, 0x0C, 0x1E, 0xAD, 0x00, 0x5C, 0xFE, + 0x07, 0x12, 0x7F, 0xF7, 0xAD, 0x18, 0xD8, 0xF9, 0x10, 0xE9, 0xD1, 0xD8, + 0x55, 0xD9, 0x16, 0xC9, 0x07, 0xE1, 0x0E, 0xD6, 0xF9, 0xC5, 0x7E, 0xD2, + 0xCE, 0xBF, 0xC0, 0xDA, 0x5D, 0xEF, 0xA8, 0x0B, 0x5C, 0x06, 0x3B, 0x13, + 0x0E, 0xF7, 0x53, 0xF2, 0x43, 0x14, 0xBA, 0x03, 0xFD, 0x25, 0x79, 0x18, + 0xED, 0x0A, 0x20, 0x06, 0x32, 0x11, 0x3C, 0x0A, 0x98, 0x38, 0x5F, 0x2E, + 0x46, 0x39, 0x34, 0x28, 0xE0, 0x0C, 0x2B, 0xF9, 0x04, 0x0B, 0x09, 0x00, + 0x28, 0x2C, 0x9C, 0x21, 0xF8, 0x23, 0x18, 0x0C, 0xFB, 0x0D, 0x52, 0xEA, + 0x03, 0x0B, 0x99, 0xEB, 0x7E, 0x01, 0x98, 0xF4, 0xAB, 0xEA, 0xC5, 0xF3, + 0x44, 0xDB, 0x56, 0xEC, 0xD1, 0xD7, 0x9A, 0xE0, 0x2E, 0xD0, 0x80, 0xDA, + 0x3C, 0xCD, 0xE9, 0xDD, 0x6F, 0xCE, 0x76, 0xE2, 0x65, 0xC5, 0x88, 0xDB, + 0xBD, 0xB2, 0x21, 0xBE, 0x44, 0xAC, 0xAF, 0xA8, 0x81, 0xAB, 0x1F, 0xA6, + 0x30, 0xA3, 0xE5, 0xA2, 0x00, 0xA3, 0x46, 0xA5, 0x7C, 0xA4, 0x83, 0xA9, + 0x76, 0xAA, 0xB6, 0xA8, 0x50, 0xBD, 0xA9, 0xB1, 0x9F, 0xBE, 0xF6, 0xB7, + 0xF8, 0xBF, 0xDA, 0xBC, 0x56, 0xD8, 0x4D, 0xD7, 0x7A, 0xEC, 0xA2, 0xF7, + 0xD7, 0xE6, 0x9A, 0xFB, 0xFC, 0xCC, 0x55, 0xED, 0x62, 0xBE, 0x05, 0xE0, + 0x5B, 0xC0, 0x24, 0xD1, 0xE5, 0xCE, 0x81, 0xD8, 0xED, 0xE6, 0x93, 0xF0, + 0xCC, 0xFB, 0xD9, 0x03, 0x7D, 0x06, 0x6B, 0x1B, 0xE8, 0x11, 0xF8, 0x2E, + 0x16, 0x26, 0x38, 0x36, 0xFE, 0x30, 0x7C, 0x2F, 0x89, 0x25, 0x9E, 0x1C, + 0x0A, 0x22, 0xA7, 0x1E, 0xD7, 0x2C, 0x46, 0x36, 0x0F, 0x29, 0x38, 0x3C, + 0x74, 0x2C, 0x69, 0x3F, 0xC5, 0x40, 0x7F, 0x56, 0x96, 0x44, 0xA5, 0x60, + 0x07, 0x39, 0xDE, 0x4E, 0x2C, 0x3F, 0xF0, 0x3E, 0x40, 0x47, 0x87, 0x33, + 0x3F, 0x30, 0xB1, 0x1C, 0x8C, 0x1D, 0xBA, 0x0E, 0x0C, 0x1F, 0x3E, 0x0F, + 0x69, 0x1B, 0x07, 0x0B, 0x75, 0x12, 0x60, 0x02, 0xEA, 0x04, 0xEB, 0xF9, + 0x79, 0x03, 0xBB, 0xFB, 0x0B, 0x08, 0x01, 0xFC, 0x61, 0x09, 0x7F, 0xF2, + 0x00, 0x1E, 0x20, 0xFC, 0x82, 0x35, 0x76, 0x15, 0x54, 0x31, 0xEC, 0x14, + 0xEE, 0x2E, 0x09, 0x10, 0xC5, 0x36, 0x6A, 0x1B, 0x16, 0x25, 0xF2, 0x24, + 0x98, 0x17, 0xA3, 0x33, 0x1B, 0x1F, 0x9C, 0x38, 0xCF, 0x27, 0xF9, 0x36, + 0x2D, 0x32, 0x67, 0x35, 0x8B, 0x35, 0xCB, 0x35, 0x08, 0x36, 0xFF, 0x43, + 0xC2, 0x41, 0x23, 0x4F, 0xD6, 0x4E, 0xF7, 0x50, 0x1F, 0x52, 0xFD, 0x4F, + 0xCB, 0x4D, 0x4D, 0x4B, 0x4A, 0x42, 0x07, 0x37, 0x14, 0x3D, 0xEF, 0x2D, + 0xFF, 0x48, 0xCE, 0x48, 0x8D, 0x52, 0xF5, 0x59, 0x88, 0x50, 0xE2, 0x57, + 0xC1, 0x4B, 0x29, 0x59, 0x58, 0x42, 0x5B, 0x53, 0x05, 0x38, 0xF2, 0x47, + 0x25, 0x33, 0xEF, 0x3A, 0xE6, 0x3C, 0x92, 0x35, 0xE5, 0x4D, 0xAB, 0x43, + 0x7D, 0x44, 0x9E, 0x49, 0xDA, 0x35, 0x73, 0x42, 0x0C, 0x48, 0x2B, 0x4B, + 0x85, 0x57, 0xE2, 0x59, 0x07, 0x4C, 0xDE, 0x58, 0x2B, 0x4D, 0xF4, 0x53, + 0xF9, 0x59, 0xDC, 0x5A, 0x38, 0x55, 0x57, 0x57, 0xCC, 0x50, 0x3B, 0x48, + 0x5C, 0x4F, 0xEC, 0x44, 0x5B, 0x4A, 0x25, 0x4B, 0x63, 0x3F, 0x2D, 0x49, + 0x12, 0x35, 0x4C, 0x3F, 0xDE, 0x39, 0x7C, 0x41, 0x26, 0x37, 0xA5, 0x37, + 0x67, 0x24, 0xC6, 0x1D, 0x76, 0x15, 0x4B, 0x1E, 0xB8, 0x11, 0x91, 0x27, + 0x35, 0x0A, 0xCE, 0x19, 0xDB, 0xF6, 0xBE, 0x05, 0x42, 0xED, 0xB2, 0xFD, + 0x39, 0xF2, 0x4F, 0xF8, 0x98, 0xF0, 0x35, 0xEC, 0xEE, 0xE0, 0x5B, 0xDC, + 0x04, 0xD8, 0x38, 0xCC, 0x72, 0xDB, 0x1F, 0xC6, 0x41, 0xCC, 0x50, 0xC2, + 0x57, 0xB0, 0x0E, 0xBA, 0x2E, 0xA4, 0x6D, 0xB5, 0x4C, 0xB5, 0x28, 0xC1, + 0xB2, 0xCB, 0xFF, 0xCF, 0x7B, 0xC3, 0x4B, 0xC9, 0xC7, 0xB1, 0x1B, 0xBD, + 0xF5, 0xA9, 0x16, 0xAE, 0xA9, 0xAF, 0xE4, 0x9F, 0x3E, 0xC0, 0x8F, 0xA4, + 0x80, 0xC0, 0x4E, 0xA5, 0x3A, 0xB8, 0xEF, 0xA1, 0x29, 0xBA, 0x41, 0xB1, + 0x98, 0xB2, 0xA3, 0xB5, 0x32, 0xA7, 0x7E, 0xA9, 0xD6, 0xA9, 0x91, 0xA3, + 0x7B, 0xB5, 0xDC, 0xA8, 0xAA, 0xB9, 0x9F, 0xB7, 0x10, 0xB8, 0x4D, 0xC8, + 0xA8, 0xB5, 0xB9, 0xC4, 0x2F, 0xB9, 0x1F, 0xB4, 0x50, 0xC9, 0xFA, 0xBF, + 0x44, 0xD4, 0xDC, 0xD8, 0xA8, 0xD5, 0xB6, 0xD2, 0x9F, 0xDD, 0x33, 0xCC, + 0x73, 0xEF, 0xF8, 0xE4, 0x2F, 0xF4, 0xC4, 0xEE, 0x24, 0xED, 0x79, 0xE3, + 0xA0, 0x03, 0xA8, 0xF8, 0x77, 0x16, 0x36, 0x08, 0x66, 0x0A, 0x6A, 0xF4, + 0x33, 0x08, 0xC5, 0xF7, 0x77, 0x03, 0x7B, 0x03, 0x5E, 0xFD, 0x9A, 0x01, + 0x50, 0xF9, 0x9D, 0x03, 0x16, 0xFD, 0x40, 0x0A, 0x76, 0x0D, 0x9A, 0x06, + 0x4A, 0x02, 0x0E, 0xF5, 0x83, 0xEB, 0xEE, 0xF4, 0x63, 0xE7, 0x88, 0xFC, + 0x08, 0xEE, 0x08, 0xF4, 0xC8, 0xE4, 0x62, 0xE1, 0xC1, 0xD8, 0xDD, 0xD0, + 0x03, 0xE9, 0xA9, 0xD2, 0x51, 0xF1, 0xC6, 0xDF, 0xFA, 0xED, 0xD1, 0xEE, + 0x91, 0xEE, 0xDE, 0xF0, 0x22, 0xFA, 0x4E, 0xF1, 0x0B, 0x03, 0x05, 0xF8, + 0x0D, 0x01, 0xD9, 0xFB, 0xEE, 0x0A, 0xC5, 0x0B, 0xFE, 0x1A, 0x19, 0x28, + 0x3B, 0x19, 0x65, 0x2E, 0x8F, 0x04, 0x4A, 0x23, 0x73, 0x04, 0x7B, 0x34, + 0xB5, 0x18, 0xD0, 0x4D, 0x2F, 0x20, 0x73, 0x46, 0xEE, 0x24, 0x04, 0x35, + 0x37, 0x2D, 0x1F, 0x32, 0xD5, 0x2D, 0xA7, 0x28, 0xAF, 0x30, 0x37, 0x19, + 0x87, 0x34, 0x14, 0x16, 0x87, 0x26, 0xC3, 0x10, 0xDF, 0x0C, 0x62, 0xFC, + 0x8E, 0x0D, 0xE9, 0xF4, 0xE6, 0x21, 0x69, 0x05, 0x6C, 0x1C, 0xDF, 0x0E, + 0x42, 0x05, 0x76, 0x03, 0x9F, 0xFA, 0xAE, 0xF6, 0xFE, 0xFD, 0x4A, 0xF4, + 0xAC, 0x02, 0xC9, 0xEA, 0xB8, 0xFE, 0x18, 0xE0, 0xCB, 0xF4, 0x2F, 0xE4, + 0x89, 0xEA, 0xCE, 0xE5, 0xD9, 0xEF, 0x56, 0xE6, 0xF5, 0xEF, 0x15, 0xE2, + 0x2F, 0xE9, 0xE3, 0xE1, 0x42, 0xF9, 0x9D, 0xED, 0x7A, 0x01, 0x02, 0xF7, + 0x0B, 0x05, 0xA9, 0x11, 0xFE, 0x08, 0x4D, 0x1B, 0x7C, 0x02, 0x12, 0x0C, + 0xD5, 0x0B, 0x06, 0x16, 0xCF, 0x1E, 0xEA, 0x22, 0xED, 0x1B, 0x26, 0x15, + 0x5C, 0x08, 0xE6, 0x0F, 0xAB, 0xF8, 0x85, 0x1B, 0x58, 0xF7, 0xE8, 0x18, + 0xF7, 0x02, 0x95, 0x1B, 0xFB, 0x0C, 0x0F, 0x2D, 0x6E, 0x0E, 0xE6, 0x1F, + 0x5F, 0x0E, 0x67, 0x07, 0x1B, 0x12, 0x53, 0x06, 0x2A, 0xFF, 0x07, 0xFB, + 0x36, 0xDD, 0x95, 0xE9, 0x80, 0xD8, 0x01, 0xE4, 0x0C, 0xE9, 0x9A, 0xDF, + 0x2F, 0xF4, 0x21, 0xD0, 0xDE, 0xF3, 0x87, 0xCE, 0xD7, 0xE8, 0x41, 0xDC, + 0x2F, 0xE0, 0x58, 0xD7, 0xA4, 0xE3, 0xC3, 0xD3, 0x0A, 0xF5, 0xC2, 0xD9, + 0xEF, 0xF7, 0x62, 0xDB, 0x74, 0xE1, 0xC7, 0xD6, 0x84, 0xD8, 0xC9, 0xDC, + 0xB9, 0xD3, 0xEE, 0xF1, 0xD7, 0xC2, 0xCF, 0xF4, 0xBF, 0xC4, 0x8E, 0xF0, + 0x6C, 0xD9, 0x7B, 0xF2, 0x90, 0xE0, 0x43, 0xF3, 0xF4, 0xDD, 0x97, 0xF6, + 0x9A, 0xD7, 0xD4, 0xED, 0x18, 0xCD, 0xA8, 0xE9, 0xC1, 0xCB, 0x39, 0xEF, + 0x59, 0xD1, 0x2A, 0xF1, 0x41, 0xD3, 0x3E, 0xF9, 0x2B, 0xD7, 0xA3, 0x00, + 0x1B, 0xF1, 0xEE, 0xF9, 0xAA, 0x04, 0xBB, 0xEF, 0x60, 0xF3, 0xF0, 0xF5, + 0x12, 0xF0, 0xCF, 0x0E, 0x57, 0x0C, 0x6B, 0x24, 0x20, 0x1A, 0x44, 0x2D, + 0x7F, 0x09, 0x81, 0x1B, 0x33, 0x00, 0x50, 0xFD, 0x33, 0x04, 0xA5, 0x02, + 0x5C, 0xF6, 0x45, 0x0B, 0x64, 0xE3, 0x2C, 0xEB, 0x91, 0xDE, 0x57, 0xD0, + 0xBB, 0xDF, 0x0A, 0xD9, 0x5F, 0xDC, 0xD5, 0xD8, 0xF8, 0xD9, 0x47, 0xC6, + 0x23, 0xD9, 0x56, 0xC9, 0xFF, 0xD0, 0x57, 0xD1, 0xCA, 0xCD, 0xF0, 0xC6, + 0x27, 0xBC, 0x60, 0xB1, 0x0E, 0xAD, 0xD7, 0xB1, 0x4C, 0xB6, 0x1C, 0xC0, + 0xF5, 0xB8, 0xEA, 0xBB, 0x1E, 0xC2, 0xEE, 0xC7, 0xDF, 0xCC, 0xC6, 0xD6, + 0x50, 0xBE, 0x18, 0xCE, 0x28, 0xAF, 0xF8, 0xC9, 0x2E, 0xC0, 0x0C, 0xD9, + 0x16, 0xD5, 0xF7, 0xD7, 0x28, 0xCC, 0xCF, 0xBF, 0x7E, 0xC0, 0x70, 0xC9, + 0x53, 0xD8, 0x1C, 0xE9, 0x0E, 0xEB, 0xCE, 0xE7, 0x3D, 0xD4, 0xB8, 0xCF, + 0x8D, 0xD3, 0xB3, 0xCC, 0xD0, 0xEC, 0x6F, 0xD2, 0x5E, 0xF9, 0xBB, 0xD1, + 0xDC, 0x03, 0x82, 0xDD, 0x2C, 0xFC, 0x27, 0xE5, 0xE4, 0xEE, 0x3C, 0xE1, + 0xB1, 0xF8, 0x37, 0xEE, 0x2A, 0x03, 0x3A, 0x08, 0x2A, 0xF9, 0x01, 0x0A, + 0x46, 0xE6, 0x05, 0xF8, 0xE6, 0xEE, 0xF3, 0xF1, 0x8B, 0xF3, 0x57, 0xEC, + 0xAE, 0xDA, 0x6E, 0xE4, 0xB4, 0xD9, 0xDF, 0xEC, 0x3E, 0xE1, 0x2C, 0xEE, + 0xA3, 0xE1, 0x93, 0xD1, 0xE3, 0xFA, 0x1F, 0xD4, 0x76, 0xFE, 0xFB, 0xED, + 0x5C, 0xED, 0xCD, 0xE2, 0x38, 0x00, 0x40, 0xE9, 0x61, 0x07, 0x7E, 0xF5, + 0x63, 0xF9, 0x6F, 0xEE, 0x72, 0x05, 0xE7, 0xF0, 0xA6, 0x0B, 0xB7, 0xF0, + 0x2B, 0xF3, 0x78, 0xE5, 0x8A, 0xE5, 0xE9, 0xDE, 0xE2, 0xF0, 0x60, 0xF1, + 0xA1, 0xF2, 0xE1, 0xF8, 0x1D, 0xEB, 0x76, 0xE8, 0x8C, 0x03, 0xD6, 0xEC, + 0xAE, 0x19, 0x54, 0xFD, 0x83, 0x04, 0xF6, 0xF8, 0x6F, 0x04, 0xBA, 0xFC, + 0x5B, 0x1E, 0xBF, 0x17, 0x1C, 0x1F, 0x9B, 0x21, 0x60, 0x15, 0x25, 0x27, + 0x94, 0x21, 0x29, 0x3D, 0xC7, 0x3C, 0xFA, 0x50, 0x82, 0x44, 0xBE, 0x5A, + 0x67, 0x48, 0xF4, 0x52, 0x3C, 0x54, 0x47, 0x4F, 0xA4, 0x48, 0x7F, 0x4B, + 0xAB, 0x43, 0xAB, 0x43, 0xFE, 0x57, 0x5B, 0x52, 0x01, 0x57, 0x1D, 0x60, + 0xD4, 0x3E, 0xC2, 0x57, 0xD4, 0x41, 0x12, 0x42, 0x20, 0x52, 0xE7, 0x33, + 0xFA, 0x3D, 0x6C, 0x30, 0xF7, 0x26, 0xD6, 0x28, 0x52, 0x35, 0x06, 0x2A, + 0xDB, 0x2D, 0xED, 0x1A, 0x41, 0x1C, 0x4E, 0x08, 0x1D, 0x29, 0x4B, 0x10, + 0x9F, 0x39, 0x92, 0x1B, 0xF0, 0x43, 0x9B, 0x20, 0x65, 0x4A, 0x21, 0x20, + 0x61, 0x47, 0x56, 0x32, 0x95, 0x37, 0x48, 0x4C, 0x7D, 0x2B, 0xE3, 0x3B, + 0xCE, 0x37, 0x7A, 0x34, 0xDA, 0x45, 0xBE, 0x48, 0x02, 0x3B, 0x0A, 0x34, + 0xCB, 0x3E, 0x07, 0x30, 0x51, 0x45, 0x69, 0x51, 0x39, 0x3E, 0x6E, 0x58, + 0x10, 0x49, 0xCE, 0x4D, 0x29, 0x54, 0xC7, 0x4E, 0x55, 0x4A, 0xE4, 0x4D, + 0x61, 0x3C, 0x53, 0x3B, 0x68, 0x2B, 0x4B, 0x33, 0x63, 0x1F, 0x2D, 0x36, + 0x4B, 0x28, 0x9A, 0x2C, 0x94, 0x3D, 0x53, 0x34, 0x22, 0x3B, 0xFB, 0x3C, + 0xC4, 0x2A, 0xFC, 0x2D, 0xBA, 0x2A, 0x64, 0x26, 0x18, 0x27, 0xED, 0x1B, + 0x1B, 0x30, 0x9B, 0x10, 0x71, 0x34, 0xB8, 0x11, 0x22, 0x22, 0x50, 0x19, + 0xDA, 0x18, 0x21, 0x1B, 0x36, 0x0D, 0x48, 0x08, 0x9C, 0xFA, 0x3C, 0xFB, + 0x0B, 0xEB, 0x24, 0x03, 0x33, 0xEA, 0xDF, 0x04, 0x12, 0xFB, 0x53, 0x01, + 0x33, 0x01, 0xFE, 0x07, 0xB1, 0x05, 0xC9, 0x03, 0x94, 0xFD, 0x77, 0xEE, + 0x0E, 0xF2, 0x59, 0xF6, 0x6B, 0xF2, 0x32, 0x09, 0x3B, 0xED, 0xDD, 0x04, + 0x28, 0xF7, 0xA7, 0x04, 0xBC, 0x07, 0xFD, 0x0C, 0x87, 0x09, 0x77, 0x00, + 0xD2, 0x07, 0x37, 0xF6, 0xD1, 0x08, 0xEE, 0x07, 0xF4, 0x0C, 0xEE, 0x09, + 0x4B, 0x15, 0x64, 0x08, 0xE8, 0x1E, 0x28, 0x20, 0xAB, 0x20, 0xF5, 0x22, + 0x18, 0x1A, 0xFD, 0x0D, 0x22, 0x2C, 0x22, 0x14, 0x48, 0x3F, 0x56, 0x0F, + 0x45, 0x33, 0xE2, 0xEA, 0xFA, 0x32, 0x98, 0xF3, 0x6F, 0x45, 0xB0, 0x20, + 0xB4, 0x45, 0xC3, 0x33, 0x51, 0x41, 0x67, 0x36, 0x0E, 0x45, 0x48, 0x2F, + 0x6B, 0x45, 0xD3, 0x1D, 0xA9, 0x3B, 0x20, 0x0D, 0xF2, 0x2A, 0x7F, 0x06, + 0xE9, 0x1D, 0x0C, 0x07, 0x2E, 0x14, 0x41, 0x04, 0x2E, 0x07, 0x87, 0x04, + 0xDB, 0xF7, 0x81, 0x02, 0x49, 0x02, 0x1D, 0xF9, 0x1D, 0x0F, 0x35, 0xE8, + 0x80, 0xFC, 0x3B, 0xD0, 0x44, 0xE9, 0x0A, 0xD0, 0x30, 0xE6, 0x6D, 0xE8, + 0x9C, 0xDF, 0xF6, 0xF3, 0xBD, 0xDC, 0x04, 0xF4, 0xD4, 0xF1, 0x43, 0xEC, + 0x8D, 0xED, 0xFC, 0xE0, 0xC2, 0xDF, 0xDA, 0xEA, 0xC7, 0xF2, 0xB1, 0xED, + 0x7B, 0x02, 0x2D, 0xF0, 0xDB, 0xFB, 0xA2, 0x02, 0x77, 0xE3, 0x7F, 0xFC, + 0x0D, 0xDD, 0x6F, 0xF7, 0x65, 0xDF, 0x4C, 0x08, 0xCC, 0xE2, 0xB7, 0x16, + 0x24, 0xEA, 0xE8, 0x07, 0xF7, 0xE0, 0x26, 0xF7, 0xFC, 0xE3, 0xEB, 0x07, + 0xB3, 0xF4, 0x1A, 0x19, 0x58, 0xF2, 0xC8, 0x17, 0x73, 0xE7, 0x23, 0x24, + 0x18, 0xEE, 0x3D, 0x2A, 0xAE, 0xFF, 0xA8, 0x1C, 0x38, 0x0E, 0x89, 0x1F, + 0xE5, 0x17, 0xB4, 0x1E, 0xD6, 0x17, 0x28, 0x24, 0x57, 0x0E, 0x8F, 0x36, + 0x34, 0x07, 0xA1, 0x2D, 0x9C, 0x05, 0x67, 0x14, 0xC3, 0x08, 0x97, 0x18, + 0xE1, 0x0D, 0x01, 0x2B, 0xB0, 0x1A, 0xAA, 0x2A, 0x62, 0x16, 0xAB, 0x1F, + 0x69, 0x0F, 0xED, 0x20, 0x71, 0x1B, 0xD4, 0x16, 0xA0, 0x18, 0x7B, 0x01, + 0x19, 0x07, 0xA6, 0xFA, 0xEC, 0xF0, 0x4F, 0xE9, 0x99, 0xDD, 0xFE, 0xEB, + 0x80, 0xE3, 0x46, 0x18, 0x83, 0xFA, 0x93, 0x1E, 0x06, 0xFF, 0xC9, 0xEF, + 0x54, 0xF4, 0xDB, 0xDC, 0xEB, 0xEA, 0x0E, 0xE4, 0x6E, 0xEF, 0xE3, 0xE2, + 0x7D, 0xED, 0x80, 0xDC, 0x60, 0xD2, 0x30, 0xCC, 0x62, 0xC8, 0x68, 0xC1, + 0xE7, 0xCA, 0xD5, 0xC3, 0xFE, 0xC7, 0x37, 0xC4, 0xA6, 0xCA, 0x4F, 0xCA, + 0xC7, 0xC9, 0x39, 0xD6, 0x5D, 0xB9, 0x0D, 0xD9, 0x14, 0xA2, 0x8C, 0xCE, + 0x2A, 0xA3, 0x57, 0xC8, 0xA4, 0xAA, 0xA0, 0xC4, 0x72, 0xA8, 0xF9, 0xB7, + 0x19, 0xAD, 0x7D, 0xAF, 0x55, 0xB0, 0x27, 0xAE, 0x04, 0xAC, 0x0D, 0xAB, + 0x08, 0xB2, 0x0B, 0xAE, 0x9B, 0xBA, 0xA6, 0xB2, 0x71, 0xB1, 0x16, 0xB3, + 0x45, 0xA3, 0x59, 0xBA, 0xD7, 0xA2, 0x87, 0xBD, 0xEB, 0xB5, 0xD2, 0xC8, + 0x30, 0xBE, 0xAC, 0xD2, 0x65, 0xB7, 0x3A, 0xC7, 0xD6, 0xBE, 0xB7, 0xC7, + 0xD7, 0xD1, 0xAC, 0xDF, 0x6E, 0xD6, 0x56, 0xE6, 0x0B, 0xD7, 0x42, 0xE6, + 0x72, 0xD6, 0xA6, 0xE5, 0xFF, 0xC5, 0x3D, 0xD5, 0x3E, 0xB9, 0x2E, 0xD6, + 0x90, 0xC8, 0x87, 0xEB, 0x19, 0xE4, 0xA8, 0xF7, 0x3B, 0xE1, 0xF7, 0xE2, + 0x33, 0xE0, 0x10, 0xD5, 0x92, 0xED, 0xCD, 0xE4, 0x01, 0xE1, 0x08, 0xDF, + 0x64, 0xD7, 0x22, 0xDB, 0xE9, 0xD8, 0x8E, 0xE8, 0x32, 0xDB, 0xA0, 0xE9, + 0xA2, 0xDC, 0xB3, 0xEF, 0xD7, 0xDA, 0x3B, 0xEB, 0x50, 0xE7, 0xE0, 0xD5, + 0x5A, 0xE3, 0xF6, 0xBF, 0x32, 0xC9, 0x32, 0xB2, 0x4B, 0xC2, 0x90, 0xC7, + 0x31, 0xCC, 0xCD, 0xDD, 0x9D, 0xCE, 0x8C, 0xD8, 0x74, 0xD0, 0x93, 0xD9, + 0xBE, 0xDF, 0x92, 0xD7, 0x93, 0xD7, 0x03, 0xCA, 0x86, 0xC0, 0x64, 0xD0, + 0xE7, 0xC0, 0xC6, 0xD6, 0xF3, 0xBF, 0xF8, 0xCC, 0xA5, 0xC7, 0x1C, 0xCF, + 0xD8, 0xE7, 0xC2, 0xDA, 0x33, 0x01, 0xE7, 0xDE, 0x89, 0xFB, 0x3B, 0xDD, + 0xF9, 0xE6, 0xFB, 0xD9, 0x8B, 0xE3, 0x47, 0xCD, 0x70, 0xDE, 0xF1, 0xBF, + 0xDC, 0xC5, 0xF8, 0xC0, 0x17, 0xBF, 0xC9, 0xCA, 0x2D, 0xC8, 0x17, 0xD6, + 0x12, 0xC9, 0xF3, 0xDD, 0x97, 0xD4, 0xF8, 0xE3, 0x1C, 0xDB, 0x38, 0xD9, + 0x83, 0xC7, 0xC6, 0xC2, 0x82, 0xBE, 0x11, 0xC0, 0x0A, 0xC5, 0xA9, 0xC4, + 0x61, 0xBE, 0x23, 0xC1, 0xB2, 0xBD, 0x31, 0xCA, 0xDB, 0xC6, 0x40, 0xDD, + 0x00, 0xD2, 0x80, 0xEB, 0xA1, 0xD7, 0xE8, 0xEB, 0xED, 0xD1, 0x8D, 0xCD, + 0xD4, 0xCA, 0x5A, 0xBB, 0xF1, 0xD0, 0x71, 0xE5, 0x9B, 0xD6, 0x3E, 0xF9, + 0x80, 0xCE, 0x32, 0xE6, 0x75, 0xD3, 0x5B, 0xEB, 0xE0, 0xE3, 0xA3, 0xF1, + 0xAC, 0xF7, 0x88, 0xF0, 0x62, 0xFB, 0xCE, 0xF5, 0xDE, 0xFA, 0x2C, 0xFB, + 0x27, 0x17, 0x3B, 0xF3, 0x16, 0x29, 0x44, 0xF2, 0x87, 0x22, 0x42, 0x06, + 0x47, 0x1D, 0xF0, 0x0B, 0x23, 0x0A, 0x43, 0xFC, 0xC6, 0xF8, 0x10, 0x00, + 0x38, 0xFF, 0xD7, 0x07, 0xF5, 0x04, 0xC6, 0xF7, 0x30, 0x09, 0x6A, 0xF0, + 0x0B, 0x1D, 0x21, 0xF8, 0x2E, 0x2E, 0xAE, 0x08, 0xCE, 0x25, 0x85, 0x19, + 0x33, 0x0D, 0x62, 0x1F, 0x55, 0x01, 0x04, 0x14, 0x3B, 0x1A, 0x20, 0x11, + 0xB5, 0x29, 0xCF, 0x18, 0xFD, 0x17, 0xAF, 0x02, 0xAC, 0x0E, 0x95, 0xF7, + 0x29, 0x0B, 0x59, 0xF9, 0x3D, 0x0C, 0xA8, 0xF5, 0x7C, 0x0D, 0x48, 0xF7, + 0x8C, 0x0D, 0x3F, 0xFE, 0xB5, 0x0F, 0x5A, 0x10, 0x7B, 0x13, 0x51, 0x06, + 0x77, 0x1E, 0xED, 0xF4, 0x69, 0x23, 0x4B, 0x00, 0x5B, 0x21, 0xC8, 0xF9, + 0x1A, 0x17, 0xE3, 0xE4, 0x87, 0x08, 0xDA, 0xEE, 0x3F, 0x00, 0x76, 0xF8, + 0x1A, 0x0E, 0xDF, 0xF5, 0x21, 0x1A, 0x13, 0xFA, 0x0B, 0x23, 0x0D, 0x03, + 0xB1, 0x28, 0xA2, 0xFD, 0x53, 0x1A, 0x4C, 0xF3, 0x30, 0x27, 0x3C, 0x0F, + 0xF5, 0x2C, 0x0D, 0x13, 0x27, 0x12, 0xE9, 0xF6, 0xBC, 0x18, 0xA0, 0x1B, + 0xED, 0x2C, 0x38, 0x3E, 0x2D, 0x35, 0xD7, 0x28, 0x87, 0x3E, 0x35, 0x22, + 0x6D, 0x3E, 0x97, 0x28, 0x96, 0x3F, 0x87, 0x32, 0xB8, 0x3E, 0x81, 0x37, + 0x13, 0x3D, 0x09, 0x39, 0x12, 0x3D, 0xA5, 0x41, 0x96, 0x3D, 0xB6, 0x40, + 0x9C, 0x3A, 0x2B, 0x44, 0xE7, 0x41, 0x40, 0x4C, 0xB4, 0x5C, 0xD6, 0x47, + 0x0B, 0x59, 0x63, 0x38, 0xA0, 0x42, 0x5E, 0x27, 0xC1, 0x37, 0xE1, 0x18, + 0xBD, 0x26, 0x8C, 0x23, 0x35, 0x1B, 0x00, 0x4B, 0x40, 0x16, 0x0D, 0x47, + 0xAC, 0x10, 0x4A, 0x1C, 0x9E, 0x1E, 0x4A, 0x0F, 0x1F, 0x24, 0x66, 0x01, + 0xFB, 0x1C, 0xE9, 0xF0, 0x06, 0x1B, 0x13, 0x02, 0xF9, 0x16, 0xD0, 0x0C, + 0x0D, 0x0F, 0x17, 0xF1, 0x3D, 0xFF, 0x9D, 0xE7, 0x97, 0x05, 0x8B, 0xFE, + 0x98, 0x11, 0xD9, 0xFC, 0x32, 0x08, 0x42, 0xEF, 0xB4, 0x06, 0x5E, 0xEF, + 0x48, 0x05, 0x2B, 0xF2, 0x8A, 0x07, 0x5E, 0xFA, 0xC3, 0x0E, 0xA5, 0x03, + 0x68, 0x15, 0x20, 0x0A, 0xBF, 0x28, 0xBD, 0x08, 0x17, 0x32, 0x8B, 0xFE, + 0xDD, 0x39, 0x9D, 0x07, 0x24, 0x45, 0x62, 0x1F, 0xB2, 0x41, 0xAF, 0x2C, + 0x64, 0x31, 0xB5, 0x22, 0xF2, 0x26, 0xA0, 0x15, 0x1A, 0x24, 0x57, 0x10, + 0xF4, 0x22, 0xBB, 0x0F, 0xAF, 0x25, 0x46, 0x17, 0xA5, 0x2C, 0xF0, 0x19, + 0x29, 0x31, 0x69, 0x14, 0xD8, 0x3B, 0x99, 0x1D, 0x3C, 0x48, 0xC0, 0x38, + 0xD9, 0x28, 0x43, 0x41, 0x29, 0x09, 0x5C, 0x2E, 0x9D, 0x17, 0x92, 0x1C, + 0xF4, 0x1A, 0x67, 0x14, 0xD1, 0x13, 0xAB, 0x11, 0x9B, 0x1A, 0x80, 0x18, + 0x32, 0x0C, 0xBA, 0x18, 0xE3, 0x07, 0x40, 0x1A, 0xAE, 0x09, 0xB2, 0x08, + 0x7B, 0xF6, 0x27, 0xED, 0x5F, 0xEF, 0xE1, 0xF0, 0x8F, 0xEA, 0x5C, 0xE6, + 0xBD, 0xE0, 0x82, 0xD9, 0xAB, 0xE5, 0x6C, 0xE8, 0x3A, 0xFD, 0x5C, 0xF6, + 0xE0, 0x19, 0x9D, 0x06, 0x2C, 0x20, 0xA4, 0x09, 0x1E, 0x15, 0xEF, 0xFD, + 0x9A, 0x14, 0x59, 0xFE, 0x01, 0x07, 0xA0, 0x00, 0x12, 0xFA, 0x2B, 0x05, + 0xAD, 0x02, 0x5C, 0x14, 0x0E, 0x19, 0xA6, 0x25, 0x79, 0x36, 0x38, 0x27, + 0xD4, 0x3C, 0x2D, 0x1F, 0x44, 0x36, 0xD3, 0x1E, 0xEC, 0x29, 0xF3, 0x29, + 0x58, 0x1C, 0x51, 0x2E, 0x0A, 0x24, 0xA3, 0x28, 0xB0, 0x3A, 0xBC, 0x3B, + 0x09, 0x30, 0xB8, 0x46, 0xA4, 0x2E, 0xC0, 0x44, 0x27, 0x45, 0x74, 0x43, + 0xF0, 0x3B, 0x8E, 0x39, 0x69, 0x29, 0x64, 0x29, 0xCC, 0x1A, 0x0F, 0x13, + 0xC2, 0x17, 0x7C, 0x16, 0xD3, 0x14, 0x16, 0x25, 0xFF, 0x07, 0x8B, 0x20, + 0x2A, 0x04, 0xC1, 0x22, 0x01, 0x08, 0xA9, 0x2A, 0xA1, 0x0F, 0x40, 0x24, + 0x65, 0x10, 0x5D, 0x1E, 0x11, 0x0C, 0xDA, 0x22, 0x39, 0x03, 0x71, 0x1C, + 0xAB, 0xF2, 0xE5, 0x07, 0xB7, 0xFD, 0x1A, 0x0F, 0x43, 0x10, 0xDF, 0x27, + 0x7A, 0xF9, 0x4B, 0x13, 0x94, 0xF2, 0x49, 0xF9, 0xF1, 0x05, 0xA5, 0x0F, + 0xCB, 0xF0, 0x6E, 0x14, 0xCC, 0xDF, 0x46, 0x0C, 0xEF, 0xE9, 0x52, 0x1B, + 0x97, 0xE7, 0x1B, 0x23, 0x41, 0xE2, 0xEA, 0x1A, 0x2C, 0xD8, 0xD2, 0x10, + 0x3D, 0xD1, 0x23, 0x0C, 0x5E, 0xDA, 0x9D, 0x00, 0x35, 0xE0, 0x0A, 0xF3, + 0x24, 0xDC, 0x81, 0xF0, 0x3D, 0xCC, 0x12, 0xE9, 0xDD, 0xBC, 0x4C, 0xE1, + 0xCC, 0xC1, 0x15, 0xF5, 0x8E, 0xBE, 0x09, 0xF0, 0x1F, 0xB9, 0x5E, 0xDA, + 0xDD, 0xC8, 0xDB, 0xDF, 0xB6, 0xDA, 0xA1, 0xD4, 0x17, 0xE2, 0xC8, 0xDB, + 0xC3, 0xD2, 0xF8, 0xF9, 0xDE, 0xBA, 0xA3, 0xF8, 0x47, 0xB0, 0x80, 0xF3, + 0x94, 0xBD, 0x6B, 0xF9, 0x3F, 0xD8, 0x56, 0xF2, 0xC2, 0xDD, 0xF2, 0xDB, + 0x21, 0xD8, 0x9D, 0xD3, 0xF8, 0xD0, 0xAE, 0xD3, 0xBB, 0xCE, 0x2B, 0xDC, + 0x56, 0xCF, 0x1C, 0xF1, 0x68, 0xCD, 0x7E, 0xEF, 0x68, 0xE0, 0xF3, 0xF1, + 0x7F, 0xE4, 0xDA, 0xF9, 0x66, 0xDB, 0x51, 0xED, 0x4F, 0xF5, 0x1F, 0xF3, + 0xC1, 0xFF, 0x9C, 0x01, 0x2B, 0xF0, 0x3F, 0x01, 0x1B, 0xEB, 0xFD, 0xF8, + 0x0C, 0xE3, 0x43, 0xEB, 0xF4, 0xD4, 0xA2, 0xDE, 0x45, 0xDB, 0xA0, 0xE5, + 0xBD, 0xE8, 0x97, 0xE4, 0x10, 0xDA, 0x0A, 0xCF, 0x55, 0xCD, 0xDE, 0xD4, + 0xDE, 0xDB, 0x55, 0xE5, 0x34, 0xF0, 0x82, 0xF2, 0x25, 0xF6, 0xFC, 0xF9, + 0xF3, 0xEE, 0x02, 0xEA, 0x69, 0xF6, 0xA4, 0xEF, 0x4F, 0x02, 0x03, 0x0C, + 0xEF, 0xEE, 0x94, 0xFB, 0xF3, 0xDE, 0x7F, 0xD3, 0xEB, 0xE7, 0x93, 0xD7, + 0x2B, 0xD8, 0x4C, 0xDF, 0x6C, 0xCE, 0xCE, 0xD7, 0xDD, 0xD7, 0x76, 0xD9, + 0x46, 0xDA, 0xDF, 0xDB, 0xA5, 0xE3, 0x69, 0xDB, 0xA7, 0xDE, 0x3F, 0xD2, + 0x55, 0xC9, 0xE5, 0xC8, 0x8B, 0xBB, 0xA7, 0xC1, 0x12, 0xC3, 0x5D, 0xC9, + 0xD2, 0xC9, 0xC6, 0xCC, 0xAD, 0xB7, 0x28, 0xC0, 0x60, 0xA6, 0xE7, 0xBB, + 0xCF, 0x9B, 0x0C, 0xB5, 0xD1, 0x9C, 0x51, 0xB1, 0xF8, 0xAD, 0x40, 0xB2, + 0x80, 0xAF, 0x12, 0xAB, 0x2B, 0xA2, 0x94, 0x9C, 0x20, 0xAF, 0x8A, 0xA5, + 0xD8, 0xC5, 0xCE, 0xC3, 0x26, 0xB1, 0x21, 0xC6, 0x72, 0x9C, 0xA3, 0xC5, + 0x42, 0xB3, 0x03, 0xD0, 0xD1, 0xCD, 0xFD, 0xD6, 0x02, 0xD6, 0x71, 0xDF, + 0x91, 0xD9, 0x3B, 0xDD, 0x7E, 0xEC, 0xE3, 0xE8, 0x08, 0xF2, 0xF5, 0xF2, + 0x11, 0xEF, 0x0A, 0xF9, 0x28, 0x03, 0x1E, 0x10, 0x1A, 0x0C, 0x67, 0x16, + 0xD9, 0x17, 0xB8, 0x19, 0xF9, 0x25, 0xDF, 0x1E, 0x83, 0x17, 0x75, 0x15, + 0x13, 0x13, 0x3F, 0x15, 0xC9, 0x29, 0x09, 0x2C, 0x75, 0x3A, 0x6C, 0x38, + 0x76, 0x3A, 0x04, 0x2B, 0x26, 0x38, 0x1D, 0x26, 0xC1, 0x1D, 0x9C, 0x19, + 0x5A, 0x09, 0x4F, 0x13, 0x71, 0x14, 0x10, 0x22, 0x4B, 0x10, 0x6C, 0x17, + 0x21, 0x0D, 0x68, 0x06, 0xD3, 0x15, 0xCB, 0x05, 0x62, 0x1D, 0x3A, 0x0A, + 0xBE, 0x21, 0xBD, 0x15, 0xCF, 0x15, 0x94, 0x14, 0x5E, 0x04, 0xE2, 0xFB, + 0xB3, 0x09, 0xAC, 0xF2, 0xC0, 0x16, 0xFA, 0xFC, 0x70, 0x06, 0xD6, 0xF4, + 0xA1, 0xF8, 0x82, 0xE8, 0xD7, 0xF2, 0xAC, 0xEA, 0xC9, 0xE3, 0xAD, 0xE4, + 0xD8, 0xDD, 0xA6, 0xDB, 0x68, 0xDD, 0x15, 0xE8, 0xE4, 0xE9, 0x70, 0xF0, + 0x90, 0xFC, 0x08, 0xE8, 0x0B, 0xF4, 0x31, 0xE2, 0x77, 0xDE, 0x83, 0xDD, + 0x7C, 0xDF, 0x1F, 0xDC, 0x51, 0xEC, 0x68, 0xEB, 0x21, 0xEB, 0x88, 0x00, + 0x73, 0xEB, 0x33, 0x00, 0xA0, 0xFA, 0x6A, 0xF7, 0x75, 0x05, 0x3C, 0xF6, + 0x6F, 0x12, 0xEA, 0xF4, 0x82, 0x18, 0xB8, 0xF8, 0xEE, 0xFE, 0x64, 0xFF, + 0xBE, 0xF3, 0x76, 0x06, 0x03, 0x09, 0x38, 0x11, 0x63, 0x08, 0xF2, 0x0B, + 0x5B, 0xFE, 0x1E, 0x04, 0xD8, 0x0B, 0xF3, 0x12, 0x0B, 0x11, 0x0F, 0x1D, + 0xEB, 0x11, 0xE1, 0x13, 0x49, 0x29, 0x1D, 0x0E, 0x51, 0x38, 0xF1, 0x11, + 0x4F, 0x28, 0x4C, 0x14, 0xA1, 0x27, 0x93, 0x0F, 0xF7, 0x31, 0x25, 0x08, + 0xAE, 0x39, 0x98, 0x0C, 0x13, 0x49, 0xD9, 0x10, 0x20, 0x4A, 0x95, 0x0D, + 0x3A, 0x40, 0xEE, 0x12, 0xF9, 0x42, 0x38, 0x28, 0x03, 0x4E, 0x09, 0x32, + 0x82, 0x4F, 0x0A, 0x2D, 0x53, 0x4F, 0x93, 0x30, 0x4D, 0x56, 0xC6, 0x27, + 0x61, 0x57, 0xDA, 0x12, 0x64, 0x55, 0xEA, 0x0A, 0x90, 0x4F, 0xF4, 0x06, + 0xCF, 0x42, 0x31, 0x06, 0xDD, 0x3C, 0x4F, 0x0D, 0xAF, 0x3C, 0x05, 0x15, + 0x13, 0x4D, 0x58, 0x1D, 0xC0, 0x4F, 0xCE, 0x16, 0x38, 0x3C, 0xD7, 0x05, + 0x2B, 0x2B, 0xC5, 0xFB, 0x6F, 0x12, 0x91, 0xFD, 0x90, 0xF1, 0x90, 0xFD, + 0x5B, 0xEC, 0x62, 0xF4, 0xEC, 0xFE, 0x91, 0xED, 0xDF, 0x06, 0x4A, 0xEA, + 0x8A, 0x06, 0x87, 0xEA, 0xF9, 0xF9, 0x0A, 0xE7, 0x46, 0xEE, 0x7D, 0xEA, + 0x61, 0xF1, 0xFF, 0xF6, 0xDA, 0xFC, 0xD9, 0xF8, 0xB4, 0x01, 0x87, 0x00, + 0xFE, 0xFA, 0xF7, 0x0D, 0xE3, 0xFA, 0x07, 0x08, 0xBA, 0xFD, 0xE5, 0x07, + 0xA8, 0xF3, 0xB2, 0x0C, 0xF6, 0xEF, 0xD1, 0x06, 0x9A, 0x0C, 0x67, 0x14, + 0xD0, 0x21, 0x8E, 0x18, 0xDC, 0x1A, 0x08, 0x01, 0x13, 0x1F, 0x59, 0xF9, + 0x87, 0x13, 0xF0, 0x01, 0xF1, 0xFE, 0xB0, 0x0D, 0xBE, 0x06, 0x4B, 0x13, + 0x9D, 0x0F, 0x50, 0x10, 0x30, 0x23, 0xF1, 0x13, 0x20, 0x42, 0x73, 0x1F, + 0xF0, 0x47, 0xEA, 0x20, 0x3F, 0x3C, 0x12, 0x23, 0xB4, 0x2F, 0x3F, 0x2E, + 0xAA, 0x2B, 0xDA, 0x30, 0xAC, 0x2F, 0xAB, 0x2C, 0x18, 0x31, 0xFA, 0x2A, + 0xC3, 0x2A, 0xA6, 0x27, 0x22, 0x29, 0xF6, 0x2D, 0x30, 0x3D, 0x61, 0x41, + 0x95, 0x4C, 0x94, 0x43, 0x5C, 0x4F, 0x70, 0x3E, 0xBA, 0x51, 0x4D, 0x44, + 0xD0, 0x45, 0x40, 0x3F, 0x75, 0x3F, 0xB4, 0x36, 0x09, 0x3C, 0xF2, 0x40, + 0xF9, 0x2D, 0xF7, 0x52, 0x4F, 0x2F, 0x46, 0x5A, 0xC3, 0x36, 0xF0, 0x54, + 0x50, 0x3D, 0xB7, 0x49, 0x9E, 0x43, 0x67, 0x33, 0xD8, 0x3F, 0xE0, 0x2B, + 0x3A, 0x38, 0x99, 0x36, 0xB8, 0x28, 0x98, 0x33, 0x2A, 0x20, 0x23, 0x24, + 0x2F, 0x15, 0x84, 0x0C, 0x94, 0x0F, 0x1C, 0xF5, 0xA4, 0x15, 0xA7, 0xE6, + 0xD9, 0x00, 0xC4, 0xEA, 0xDC, 0xF3, 0xDD, 0xFA, 0x67, 0xF9, 0xF8, 0xFD, + 0xC8, 0xEE, 0x6B, 0xFE, 0x8A, 0xE0, 0xA8, 0x01, 0x6D, 0xED, 0x67, 0x02, + 0xC3, 0xFA, 0x7C, 0xF3, 0xA6, 0xEB, 0x47, 0xDC, 0x8A, 0xDB, 0xAD, 0xD2, + 0xB7, 0xC7, 0x63, 0xCD, 0xEF, 0xC5, 0x31, 0xE0, 0xFE, 0xE4, 0xF5, 0xF4, + 0xFB, 0xFC, 0x3B, 0xFC, 0xBC, 0xFE, 0x09, 0xFD, 0xE6, 0x0D, 0xF4, 0xFA, + 0x13, 0x1B, 0xA0, 0xFA, 0x78, 0xFE, 0xC5, 0xF6, 0x9F, 0xF1, 0xB8, 0x02, + 0x2D, 0x06, 0xE5, 0x17, 0xB4, 0x0A, 0xB5, 0x21, 0x20, 0xFF, 0xB5, 0x1E, + 0x06, 0x05, 0xBD, 0x17, 0x2D, 0x0D, 0x98, 0x13, 0x95, 0xFF, 0x99, 0x19, + 0x78, 0x06, 0x05, 0x1F, 0x3E, 0x1F, 0x7A, 0x1E, 0x81, 0x24, 0xEF, 0x23, + 0x38, 0x17, 0x64, 0x20, 0xAB, 0x05, 0xBD, 0x15, 0x1A, 0x04, 0x13, 0x1D, + 0xB0, 0x08, 0x34, 0x24, 0x2C, 0x0F, 0xCE, 0x18, 0x7F, 0x1D, 0x45, 0x12, + 0xD1, 0x21, 0x2A, 0x1D, 0x55, 0x1F, 0xEF, 0x24, 0x91, 0x16, 0xC5, 0x2E, + 0xF7, 0x0A, 0x54, 0x44, 0x8B, 0x0A, 0x09, 0x3F, 0x1B, 0x15, 0xCA, 0x2A, + 0xB3, 0x1B, 0xB1, 0x1E, 0x50, 0x12, 0xC8, 0x09, 0xEE, 0x08, 0x09, 0x04, + 0x98, 0xF5, 0x0B, 0x0C, 0xD7, 0xCD, 0x2D, 0x04, 0xBA, 0xC0, 0x34, 0xF2, + 0xE4, 0xD3, 0xB8, 0xDD, 0x27, 0xD6, 0xA6, 0xCC, 0x4C, 0xDB, 0x99, 0xC5, + 0xE1, 0xDF, 0xC0, 0xC2, 0x76, 0xC5, 0xA5, 0xC5, 0xA7, 0xB6, 0xBC, 0xD3, + 0x41, 0xC0, 0x06, 0xD9, 0x4D, 0xD1, 0xA4, 0xD6, 0xA9, 0xDC, 0x94, 0xD8, + 0xBC, 0xDE, 0x83, 0xD3, 0xE0, 0xD0, 0x69, 0xD0, 0xEB, 0xB4, 0x90, 0xD6, + 0xFC, 0xAE, 0x80, 0xD4, 0xDC, 0xC0, 0x8D, 0xD4, 0x8E, 0xDA, 0xE6, 0xE4, + 0xF7, 0xE7, 0xA7, 0xEB, 0x40, 0xE0, 0x53, 0xEC, 0x1D, 0xD4, 0xC0, 0xF8, + 0xA3, 0xCC, 0xF9, 0x09, 0x54, 0xD9, 0x54, 0x0B, 0xB2, 0xF4, 0xEE, 0x01, + 0xF8, 0x04, 0x74, 0x02, 0x9E, 0x00, 0x99, 0x02, 0xCA, 0xEB, 0x38, 0x01, + 0x44, 0xDA, 0x73, 0x00, 0x7C, 0xD5, 0xD5, 0x05, 0xD0, 0xDC, 0x91, 0x03, + 0x54, 0xFA, 0xAB, 0x03, 0x05, 0x15, 0xB3, 0x17, 0xD2, 0x15, 0x90, 0x12, + 0x71, 0x12, 0x6A, 0x05, 0x7B, 0x02, 0x8C, 0x07, 0x5D, 0xF2, 0xC2, 0x0D, + 0xAB, 0xF6, 0xA7, 0x21, 0x4C, 0x04, 0x8D, 0x2E, 0x35, 0x13, 0x54, 0x23, + 0x7A, 0x0E, 0xDA, 0x01, 0xBE, 0x08, 0xDE, 0xFF, 0xD3, 0x04, 0x23, 0x18, + 0x10, 0x01, 0xC8, 0x16, 0x97, 0x0F, 0x4F, 0x18, 0xEB, 0x1B, 0xBB, 0x20, + 0x20, 0x26, 0x1F, 0x1A, 0x11, 0x1C, 0x2F, 0x0E, 0x4A, 0x04, 0x1D, 0x17, + 0xDC, 0xFC, 0x7D, 0x1A, 0xD1, 0xEF, 0xDE, 0xFF, 0x70, 0xDF, 0x2B, 0xEF, + 0x71, 0xEC, 0x3C, 0xFE, 0x21, 0xFE, 0x9C, 0x01, 0xF4, 0xE6, 0xAE, 0xEA, + 0xC9, 0xD1, 0xC7, 0xE2, 0x1D, 0xDB, 0x16, 0xE2, 0x5B, 0xE0, 0x99, 0xDE, + 0xB7, 0xEA, 0x76, 0xE5, 0xB4, 0x01, 0xED, 0xF8, 0x09, 0xFD, 0x67, 0xFD, + 0xEE, 0xE1, 0x19, 0xE8, 0x14, 0xD2, 0x3C, 0xDE, 0x4F, 0xC3, 0x96, 0xE8, + 0x05, 0xBC, 0xD3, 0xF8, 0xB3, 0xCA, 0x2E, 0xF6, 0x7B, 0xE0, 0x71, 0xE8, + 0x87, 0xEB, 0xB8, 0xE8, 0xA2, 0xEB, 0xF7, 0xE8, 0xC2, 0xE7, 0x87, 0xE5, + 0x8F, 0xD8, 0x33, 0xED, 0x75, 0xD0, 0x70, 0xFE, 0x43, 0xD7, 0x9A, 0xF7, + 0xA8, 0xD1, 0x56, 0xE3, 0x21, 0xD3, 0x84, 0xE2, 0x5A, 0xE0, 0x11, 0xD8, + 0x69, 0xEB, 0x21, 0xCC, 0xD6, 0xE3, 0x0F, 0xCD, 0x87, 0xD0, 0x25, 0xC7, + 0x7F, 0xDD, 0xC7, 0xC3, 0xCF, 0xDD, 0x0E, 0xCA, 0x6D, 0xCF, 0x2C, 0xD8, + 0x85, 0xD0, 0x5C, 0xD8, 0x90, 0xD6, 0x77, 0xD9, 0x42, 0xF6, 0x59, 0xF0, + 0x56, 0x03, 0xB5, 0xEB, 0x52, 0xF6, 0x7C, 0xDC, 0x95, 0xF3, 0x00, 0xE6, + 0x41, 0xE7, 0x48, 0xEC, 0x0F, 0xE6, 0x5D, 0xF0, 0x3B, 0xF9, 0x7E, 0xFA, + 0x13, 0x01, 0x27, 0xF9, 0x95, 0x0A, 0x9E, 0xEF, 0x18, 0x10, 0x7B, 0xE9, + 0xD3, 0x10, 0xD2, 0xF0, 0xB9, 0x1C, 0x77, 0x04, 0x3C, 0x15, 0xDD, 0x0D, + 0xE3, 0x03, 0xF8, 0x19, 0x80, 0x0E, 0xCE, 0x2A, 0x20, 0x19, 0xA0, 0x1B, + 0x32, 0x0E, 0xEF, 0xFD, 0x3E, 0x10, 0xB4, 0xF9, 0x2B, 0x14, 0xC3, 0xF8, + 0xAF, 0xF0, 0x69, 0xE4, 0xE1, 0xD3, 0xD5, 0xDD, 0x33, 0xDC, 0xAD, 0xE4, + 0x19, 0xEE, 0x6F, 0xDB, 0x53, 0xFA, 0x9D, 0xD0, 0x70, 0xEE, 0x91, 0xC8, + 0xAB, 0xCC, 0x92, 0xBE, 0x6D, 0xB7, 0x3E, 0xC4, 0x9D, 0xC0, 0x25, 0xCE, + 0x2F, 0xC7, 0x6C, 0xC8, 0x58, 0xC6, 0xED, 0xC2, 0x5D, 0xD6, 0x00, 0xCA, + 0x5A, 0xDC, 0x14, 0xCE, 0xE4, 0xCE, 0x24, 0xC9, 0x10, 0xCB, 0x1A, 0xD1, + 0x2E, 0xD5, 0x05, 0xD7, 0xA9, 0xF0, 0x56, 0xD3, 0x2E, 0x03, 0xF8, 0xDC, + 0x92, 0xFB, 0x0E, 0xD9, 0x48, 0xEE, 0x7B, 0xC9, 0xBA, 0xDC, 0xA3, 0xD2, + 0x32, 0xDA, 0x4F, 0xE6, 0x1D, 0xDE, 0x33, 0xE6, 0xCD, 0xF2, 0xA7, 0xE7, + 0x3F, 0x17, 0xE9, 0xF2, 0xD7, 0x1D, 0x02, 0xEB, 0xAD, 0x13, 0xC6, 0xE5, + 0x75, 0x00, 0xB8, 0xE7, 0x15, 0x04, 0xA1, 0xE9, 0x2E, 0x21, 0x47, 0xFE, + 0x0A, 0x1F, 0xD9, 0x0F, 0xDB, 0x14, 0x64, 0x00, 0x97, 0x1A, 0x1D, 0xEC, + 0x6D, 0x1F, 0xFB, 0x00, 0x8A, 0x1A, 0x49, 0x10, 0x14, 0x18, 0x22, 0xFE, + 0x25, 0x17, 0xA3, 0x00, 0x29, 0x13, 0x31, 0x13, 0xC5, 0x16, 0x57, 0x12, + 0xC1, 0x18, 0x51, 0x0D, 0x88, 0x18, 0xE5, 0x14, 0x54, 0x1C, 0x95, 0x11, + 0x7E, 0x1E, 0xFF, 0x0B, 0xBE, 0x20, 0x67, 0x1F, 0xE4, 0x2D, 0xFD, 0x2B, + 0xCD, 0x28, 0x77, 0x1D, 0x51, 0x12, 0x2B, 0x11, 0xFE, 0x06, 0xDF, 0x11, + 0x86, 0xF6, 0x49, 0x0E, 0xBE, 0xE9, 0xBB, 0x05, 0xDF, 0xF8, 0xBC, 0xFD, + 0x66, 0x0B, 0x31, 0xEF, 0x71, 0x04, 0x2F, 0xE4, 0x64, 0xF8, 0x97, 0xE7, + 0x4D, 0xFC, 0x11, 0xEE, 0x95, 0xFA, 0x74, 0xF4, 0x99, 0xE6, 0x90, 0xEF, + 0x57, 0xE7, 0x02, 0xE2, 0x17, 0xFE, 0x3E, 0xDE, 0xE3, 0xFB, 0x14, 0xDA, + 0xDC, 0xF5, 0x99, 0xDE, 0x30, 0xF8, 0x91, 0xE8, 0x93, 0xE7, 0xF3, 0xE8, + 0x65, 0xDA, 0x87, 0xF6, 0x51, 0xE0, 0x63, 0xFC, 0xD5, 0xEB, 0x01, 0xFD, + 0x6B, 0xEE, 0x66, 0x05, 0x4C, 0x01, 0xF2, 0xFA, 0xC2, 0x21, 0xCF, 0xFF, + 0x2D, 0x20, 0x39, 0x16, 0x6B, 0x0D, 0xB4, 0x1F, 0xB0, 0x0A, 0xA1, 0x22, + 0x41, 0x1F, 0x46, 0x20, 0xB1, 0x32, 0x62, 0x15, 0x67, 0x34, 0x9B, 0x04, + 0x3F, 0x26, 0x1C, 0xF6, 0xDB, 0x15, 0xC8, 0xEF, 0x4C, 0x24, 0xEC, 0xF8, + 0x7C, 0x28, 0xFD, 0xFC, 0x0B, 0x0E, 0x89, 0xF9, 0x3D, 0x05, 0xEB, 0x04, + 0xC1, 0x09, 0xD7, 0x0F, 0xA7, 0x05, 0x57, 0x0F, 0x95, 0x01, 0x69, 0x08, + 0x1A, 0x0C, 0xAB, 0x01, 0x43, 0x0D, 0x5D, 0x01, 0xD8, 0xFD, 0xDF, 0x00, + 0x91, 0xFE, 0x0C, 0xFE, 0xA0, 0xFA, 0x35, 0xF3, 0xC9, 0xEA, 0x23, 0xEE, + 0x3D, 0xF7, 0x4B, 0xFC, 0xA8, 0x09, 0xC9, 0xFE, 0xE8, 0x06, 0x83, 0xFE, + 0x72, 0x0A, 0xD4, 0x0D, 0xD9, 0x1F, 0x23, 0x1D, 0xDC, 0x1C, 0xE5, 0x21, + 0x7A, 0x04, 0x73, 0x23, 0x7D, 0xFF, 0x11, 0x27, 0x20, 0x0B, 0xB2, 0x25, + 0x9E, 0x25, 0x37, 0x2D, 0x32, 0x39, 0x73, 0x2D, 0xCD, 0x39, 0x89, 0x1F, + 0x09, 0x3C, 0x83, 0x31, 0x3C, 0x35, 0x27, 0x43, 0x6E, 0x36, 0xFE, 0x36, + 0x7B, 0x40, 0x22, 0x30, 0x8F, 0x3E, 0x65, 0x2A, 0x5A, 0x3C, 0x4F, 0x20, + 0xB6, 0x33, 0x86, 0x26, 0x77, 0x2A, 0x11, 0x38, 0x82, 0x21, 0x27, 0x31, + 0xD6, 0x1C, 0xA8, 0x17, 0x8E, 0x25, 0xAB, 0x0A, 0x51, 0x33, 0x4D, 0x15, + 0x07, 0x2D, 0xEF, 0x13, 0x20, 0x0F, 0xCE, 0x15, 0x53, 0xFA, 0xDF, 0x25, + 0x39, 0xFC, 0xCF, 0x12, 0x13, 0x0A, 0x13, 0x04, 0xC8, 0x0E, 0x27, 0x0D, + 0x2C, 0x0A, 0x80, 0x0F, 0x2A, 0xFC, 0x2F, 0x0C, 0xCA, 0xF0, 0xB5, 0x0E, + 0xA0, 0xF9, 0x65, 0x0C, 0x2C, 0x06, 0xD1, 0x02, 0x96, 0x0A, 0x17, 0x07, + 0xA8, 0x13, 0xED, 0x0F, 0x0D, 0x15, 0xB8, 0xFE, 0x1E, 0x12, 0x5E, 0xF6, + 0x6B, 0x1B, 0x50, 0x0A, 0xE0, 0x22, 0x23, 0x1A, 0x17, 0x1D, 0x08, 0x2A, + 0xD0, 0x20, 0x88, 0x38, 0x80, 0x33, 0xDC, 0x35, 0x61, 0x30, 0x57, 0x2D, + 0x77, 0x29, 0xB3, 0x2F, 0x48, 0x2D, 0xBE, 0x36, 0x0A, 0x2A, 0xB9, 0x2C, + 0xED, 0x28, 0x32, 0x24, 0x71, 0x38, 0x0E, 0x3C, 0xA8, 0x38, 0x96, 0x44, + 0x01, 0x1D, 0xB7, 0x2D, 0x7B, 0x16, 0x76, 0x22, 0xE3, 0x17, 0xA9, 0x2A, + 0xA7, 0x0C, 0x71, 0x29, 0x18, 0x08, 0x4C, 0x10, 0xA0, 0x07, 0x89, 0x0B, + 0x20, 0xFB, 0x0C, 0x14, 0x4D, 0xF1, 0x1A, 0x15, 0x80, 0xFB, 0xF4, 0x18, + 0xF9, 0xFE, 0x0C, 0x0D, 0xC3, 0xE8, 0xE1, 0x02, 0x2D, 0xD7, 0x46, 0x01, + 0xCA, 0xE2, 0x0F, 0xFA, 0x6F, 0xF7, 0x4A, 0xFE, 0x25, 0xF8, 0x07, 0xFF, + 0xAC, 0xE9, 0x6D, 0xF1, 0xE3, 0xE3, 0xD9, 0xF1, 0x7A, 0xED, 0xC3, 0x02, + 0x11, 0xF2, 0x5B, 0x06, 0x9D, 0xF2, 0x05, 0xF2, 0x32, 0x06, 0x07, 0xE9, + 0x68, 0x14, 0x00, 0xEE, 0xCC, 0x08, 0x66, 0xF0, 0xA5, 0xF3, 0x89, 0xFA, + 0xEB, 0xF8, 0xB3, 0x10, 0xC8, 0x06, 0xD1, 0x1E, 0x6B, 0x02, 0xE5, 0x16, + 0x70, 0x06, 0x2A, 0x0F, 0x92, 0x08, 0xCA, 0x0A, 0xE0, 0xFE, 0x43, 0x0A, + 0x66, 0x06, 0x7D, 0x1C, 0x08, 0x22, 0xDD, 0x33, 0xF2, 0x27, 0xF5, 0x37, + 0x85, 0x1D, 0xEF, 0x31, 0x85, 0x1B, 0xF4, 0x21, 0x5F, 0x1E, 0x4B, 0x16, + 0xC1, 0x1F, 0xCD, 0x0E, 0xCF, 0x24, 0xA7, 0x05, 0xDD, 0x29, 0xAC, 0x05, + 0x05, 0x26, 0x69, 0x14, 0xC7, 0x1C, 0x48, 0x1C, 0x10, 0x17, 0x16, 0x10, + 0x8E, 0x0E, 0x41, 0x04, 0xA2, 0x08, 0x5E, 0x0B, 0x33, 0x09, 0x3D, 0x1D, + 0x2F, 0xFE, 0xB6, 0x17, 0x12, 0xFF, 0x31, 0x18, 0x6D, 0x08, 0xF9, 0x25, + 0x9B, 0x0E, 0x53, 0x23, 0x7D, 0x0F, 0x91, 0x1B, 0xE8, 0x11, 0x57, 0x1D, + 0x21, 0x10, 0x85, 0x0F, 0x69, 0xF9, 0x71, 0xEB, 0x2E, 0xF3, 0xF3, 0xE4, + 0x9C, 0xFF, 0x22, 0xF8, 0x71, 0xFD, 0x55, 0xFB, 0xBF, 0xF8, 0x96, 0xFE, + 0x80, 0xF4, 0xB7, 0x08, 0xB0, 0xE6, 0x5B, 0x08, 0xB5, 0xE8, 0x14, 0x0B, + 0x80, 0xF5, 0x5B, 0x0E, 0x99, 0xFD, 0x2B, 0x09, 0x85, 0x00, 0x6E, 0x0A, + 0xD4, 0xED, 0x35, 0x0A, 0xE1, 0xE2, 0x57, 0x00, 0x11, 0xED, 0xCF, 0x01, + 0x41, 0xF0, 0xF6, 0x05, 0xED, 0xF4, 0x18, 0xF8, 0x33, 0xF2, 0x6B, 0xE9, + 0x67, 0xEC, 0xFE, 0xF6, 0xED, 0xED, 0x34, 0x0B, 0xE2, 0xEB, 0x69, 0x0C, + 0xE7, 0xF8, 0x92, 0x18, 0xBF, 0x00, 0x5B, 0x14, 0xF9, 0xF7, 0x1E, 0xF5, + 0x4A, 0xFC, 0xB7, 0xFE, 0x1E, 0xFE, 0x52, 0x13, 0x41, 0xF5, 0x2B, 0xFC, + 0xF7, 0xF0, 0xED, 0xEC, 0x7D, 0xFC, 0x9F, 0xFE, 0xCA, 0x0C, 0xFE, 0x03, + 0x4E, 0x08, 0x68, 0xF9, 0x15, 0xF9, 0x95, 0xF1, 0x83, 0xEE, 0x1B, 0xED, + 0xCB, 0xE2, 0xF7, 0xE8, 0x2F, 0xDD, 0x12, 0xEB, 0x87, 0xED, 0x2D, 0xFA, + 0xC1, 0xF9, 0x2B, 0xF9, 0x00, 0xEB, 0x20, 0xE7, 0x37, 0xEC, 0xE1, 0xDB, + 0x9C, 0xE8, 0xD0, 0xC7, 0x23, 0xC8, 0x82, 0xB7, 0xD7, 0xBF, 0xA5, 0xB1, + 0x55, 0xBD, 0xE9, 0xAB, 0xD2, 0xB7, 0xDF, 0xB6, 0x5B, 0xC8, 0x4E, 0xC9, + 0x92, 0xD6, 0x5B, 0xC8, 0xB9, 0xDB, 0xCB, 0xC1, 0xFD, 0xD3, 0x53, 0xCA, + 0xC7, 0xCF, 0xA1, 0xD6, 0x98, 0xE5, 0x1D, 0xE2, 0x2B, 0xF2, 0xA6, 0xE8, + 0xE0, 0xE4, 0x09, 0xE3, 0x12, 0xD2, 0xB9, 0xCF, 0x46, 0xD9, 0x83, 0xD0, + 0xE6, 0xD8, 0x1E, 0xD6, 0xCC, 0xD2, 0x05, 0xCE, 0x4E, 0xEC, 0x5E, 0xE0, + 0xC8, 0xF7, 0x09, 0xFB, 0x41, 0xF8, 0x37, 0xFE, 0xC4, 0xF8, 0xD1, 0xED, + 0xC3, 0xE7, 0x36, 0xDF, 0x98, 0xC9, 0xB1, 0xD4, 0xFD, 0xB8, 0x1A, 0xCA, + 0x79, 0xC4, 0x22, 0xD6, 0x0D, 0xC6, 0x9D, 0xDC, 0x8F, 0xC2, 0xAE, 0xCF, + 0x78, 0xC7, 0x2F, 0xCA, 0x30, 0xC1, 0x4D, 0xC7, 0x16, 0xBC, 0x79, 0xC4, + 0x1A, 0xB7, 0x78, 0xC4, 0x3C, 0xB3, 0xBF, 0xC1, 0x6A, 0xBA, 0xBF, 0xB0, + 0xA7, 0xC5, 0x49, 0xAC, 0x55, 0xBD, 0x3F, 0xB7, 0xA0, 0xA5, 0x5E, 0xB2, + 0x57, 0xA0, 0xE4, 0xAF, 0x6D, 0xAF, 0x4A, 0xC4, 0x92, 0xBB, 0x3C, 0xCB, + 0x8D, 0xC3, 0xC0, 0xB5, 0x80, 0xCD, 0xC4, 0xAB, 0x91, 0xD1, 0x91, 0xBF, + 0x53, 0xD8, 0x63, 0xE3, 0x4E, 0xDE, 0xF0, 0xED, 0xD0, 0xEE, 0x3B, 0xF2, + 0x09, 0x02, 0xCF, 0x08, 0x5C, 0x04, 0xD4, 0x00, 0x6D, 0x0E, 0xD0, 0xEF, + 0xDC, 0x1D, 0x10, 0xF7, 0x2A, 0x1A, 0xFF, 0xEC, 0x38, 0x13, 0x21, 0xDA, + 0xB3, 0x16, 0x4C, 0xE0, 0x31, 0x14, 0x23, 0xED, 0xBF, 0x11, 0x61, 0xED, + 0xBF, 0x17, 0x98, 0xF1, 0xFE, 0x0F, 0xEB, 0xF4, 0xD1, 0x04, 0xC9, 0xEF, + 0x01, 0x00, 0xF7, 0xF7, 0x97, 0xF4, 0xF1, 0x07, 0xF9, 0xFB, 0x3D, 0x0C, + 0x5A, 0x0D, 0xA2, 0x00, 0x13, 0x03, 0x02, 0xF5, 0x42, 0xF8, 0x31, 0xF4, + 0x73, 0x07, 0x63, 0xFD, 0x85, 0x12, 0x97, 0x02, 0x8B, 0x11, 0xD0, 0xFB, + 0xBB, 0x0B, 0xA6, 0xF7, 0xDA, 0xFD, 0xCB, 0xF2, 0x75, 0xEE, 0x72, 0xF4, + 0xBC, 0xE7, 0xF3, 0x04, 0x68, 0xEE, 0x02, 0x0F, 0xDE, 0xF3, 0xA0, 0x08, + 0x8A, 0xFD, 0xC3, 0xFA, 0x4D, 0x08, 0x48, 0x01, 0xED, 0xFB, 0x02, 0x0F, + 0xEB, 0xF2, 0xA4, 0x05, 0xC5, 0xFD, 0xF7, 0xFD, 0xED, 0x04, 0x42, 0x02, + 0xF3, 0x05, 0xA1, 0x09, 0xA3, 0x0B, 0xC3, 0x06, 0x44, 0x11, 0x16, 0xFB, + 0xD0, 0x08, 0xB4, 0x01, 0xCD, 0xFB, 0x5F, 0x04, 0x70, 0xF8, 0x9B, 0xF7, + 0x6C, 0x00, 0x86, 0xFF, 0x75, 0x03, 0x09, 0xFE, 0x95, 0xF9, 0x27, 0xF0, + 0x88, 0xF8, 0xCD, 0xF7, 0x93, 0x05, 0xA5, 0xFD, 0xE7, 0x08, 0x45, 0xF8, + 0xD9, 0x0A, 0x7D, 0xFA, 0x15, 0x11, 0xBE, 0x02, 0xE6, 0x0E, 0x6E, 0x0E, + 0x78, 0x19, 0xAE, 0x1D, 0x6F, 0x25, 0xB3, 0x1F, 0x6D, 0x1E, 0xB1, 0x19, + 0x53, 0x0C, 0xC7, 0x18, 0x86, 0x0A, 0xF1, 0x18, 0xCE, 0x19, 0x5F, 0x0A, + 0x97, 0x1D, 0x6C, 0xFB, 0xE6, 0x1F, 0x63, 0x01, 0xD2, 0x2F, 0x40, 0x09, + 0xCA, 0x38, 0x6C, 0x0F, 0x5E, 0x28, 0x45, 0x1A, 0x3C, 0x19, 0x4C, 0x1B, + 0x49, 0x16, 0xA9, 0x14, 0x88, 0x14, 0x31, 0x13, 0x75, 0x19, 0xEF, 0x0B, + 0xC6, 0x19, 0xE3, 0xFC, 0xAE, 0x15, 0x66, 0xF1, 0x40, 0x0D, 0x5E, 0xE5, + 0x6D, 0x06, 0x6C, 0xE0, 0xBB, 0x09, 0x9E, 0xEA, 0x7D, 0x03, 0xC5, 0xFA, + 0xC0, 0x02, 0xCB, 0xFB, 0x7B, 0x0D, 0xDF, 0xEF, 0xC0, 0x0C, 0x89, 0xEC, + 0x2B, 0x05, 0x07, 0xEA, 0xA8, 0xFD, 0x0D, 0xF3, 0x87, 0xF5, 0x34, 0x04, + 0xF0, 0xFE, 0x86, 0x0A, 0xCA, 0x0A, 0xAB, 0x09, 0xE4, 0xF6, 0x49, 0xF9, + 0xE4, 0xE0, 0xF8, 0xE5, 0x3E, 0xE8, 0xF1, 0xE8, 0x90, 0xF2, 0xB5, 0xF6, + 0x96, 0xE6, 0xCB, 0xF3, 0xBD, 0xE5, 0x62, 0xF0, 0x7A, 0xFF, 0x64, 0x02, + 0xD9, 0x0A, 0x60, 0x15, 0x5D, 0x02, 0xD6, 0x1B, 0x13, 0xFE, 0x32, 0x1D, + 0x86, 0x13, 0x03, 0x22, 0x7F, 0x2F, 0xB6, 0x1D, 0x36, 0x33, 0x24, 0x0B, + 0xC2, 0x29, 0x63, 0x04, 0x41, 0x13, 0x70, 0x0C, 0xC9, 0xFC, 0x45, 0x0A, + 0xD2, 0xFD, 0xFF, 0x02, 0x92, 0x03, 0x85, 0x0C, 0x92, 0x05, 0x83, 0x15, + 0xCD, 0x09, 0xF9, 0x09, 0xB3, 0x15, 0x0B, 0x09, 0x78, 0x1F, 0xB4, 0x1B, + 0xBF, 0x17, 0x4E, 0x1F, 0xCF, 0x0D, 0x73, 0x22, 0xD4, 0x06, 0xBC, 0x35, + 0x73, 0x03, 0xF4, 0x36, 0xC3, 0x0B, 0x0E, 0x1E, 0x67, 0x18, 0x56, 0x0B, + 0x16, 0x24, 0x45, 0x0E, 0x11, 0x29, 0x13, 0x0F, 0x7C, 0x25, 0x87, 0x0B, + 0x82, 0x2A, 0xDE, 0x1A, 0x1C, 0x33, 0x63, 0x24, 0x5C, 0x39, 0xE5, 0x27, + 0x97, 0x37, 0x7F, 0x30, 0x4A, 0x30, 0xE6, 0x2F, 0xBD, 0x2F, 0x11, 0x2C, + 0x1C, 0x34, 0x5C, 0x2C, 0x49, 0x3D, 0xCC, 0x2E, 0xF9, 0x37, 0x40, 0x34, + 0x85, 0x29, 0xAB, 0x41, 0x2C, 0x37, 0x08, 0x4A, 0x6E, 0x4A, 0x58, 0x3B, + 0x3A, 0x43, 0xBF, 0x22, 0x24, 0x39, 0x59, 0x21, 0x92, 0x3A, 0x28, 0x2E, + 0xDA, 0x38, 0x46, 0x2D, 0xC6, 0x28, 0x53, 0x27, 0xD7, 0x25, 0x7C, 0x25, + 0xBF, 0x2E, 0x70, 0x26, 0x6B, 0x26, 0xC7, 0x2C, 0xBB, 0x1F, 0xDE, 0x29, + 0x8C, 0x1C, 0x1D, 0x16, 0x1B, 0x11, 0x09, 0x05, 0x4A, 0x0A, 0x07, 0x06, + 0xF5, 0x02, 0x94, 0x11, 0x8F, 0xF8, 0xB7, 0x15, 0xDF, 0xF0, 0x32, 0x0D, + 0x3F, 0xF3, 0x9E, 0x06, 0xB7, 0xFC, 0x95, 0x04, 0x3C, 0x02, 0xCE, 0x0A, + 0xC1, 0xFF, 0xEE, 0x0E, 0xF0, 0x02, 0x3A, 0x0C, 0x64, 0x12, 0x29, 0x13, + 0x78, 0x18, 0xB6, 0x13, 0x74, 0x0A, 0x2E, 0x10, 0xA7, 0xFE, 0x5F, 0x1B, + 0xC6, 0x02, 0xA7, 0x19, 0xE6, 0x0E, 0x3B, 0x0E, 0x0D, 0x16, 0xC2, 0x16, + 0x77, 0x0D, 0x11, 0x19, 0x88, 0x07, 0x2A, 0x0B, 0x77, 0x05, 0xD0, 0x04, + 0xFB, 0x10, 0xD2, 0x18, 0x7C, 0x24, 0x48, 0x30, 0x0F, 0x16, 0x73, 0x29, + 0x58, 0x06, 0x71, 0x23, 0x04, 0x09, 0xA7, 0x28, 0x36, 0x09, 0xF5, 0x1C, + 0xD4, 0x0E, 0xBB, 0x13, 0x49, 0x1C, 0x47, 0x20, 0xC5, 0x1E, 0xFC, 0x1D, + 0x31, 0x16, 0x14, 0x12, 0xE1, 0x1C, 0x1C, 0x1C, 0xC9, 0x22, 0x27, 0x1A, + 0xD3, 0x24, 0xDC, 0x12, 0x04, 0x30, 0xF4, 0x1E, 0x17, 0x38, 0x9E, 0x23, + 0x3F, 0x37, 0xBF, 0x1A, 0x49, 0x28, 0xD9, 0x17, 0x68, 0x1D, 0xEE, 0x0E, + 0xC9, 0x27, 0xE0, 0x06, 0x0C, 0x2B, 0xD9, 0x1A, 0x74, 0x17, 0xA6, 0x24, + 0x0E, 0x05, 0xAC, 0x1B, 0x47, 0xEF, 0x6B, 0x0A, 0xBF, 0xE3, 0xBE, 0xF2, + 0xA8, 0xF2, 0x0A, 0xF0, 0xAE, 0xFF, 0x65, 0xF9, 0x29, 0xFF, 0x64, 0xFB, + 0x3A, 0xF9, 0x31, 0xFA, 0x1B, 0xF5, 0xDE, 0xFB, 0x7C, 0xEA, 0x08, 0xFD, + 0xAA, 0xE1, 0xFB, 0xF8, 0x44, 0xEC, 0x2C, 0xF9, 0xE9, 0xF3, 0x06, 0x00, + 0x4A, 0xF7, 0x1D, 0x0A, 0x10, 0xF1, 0xE8, 0x04, 0xA9, 0xDC, 0x14, 0xF3, + 0x61, 0xCF, 0x52, 0xF3, 0xB7, 0xCE, 0x32, 0x03, 0x2D, 0xE3, 0x86, 0x10, + 0x94, 0xF4, 0x1C, 0x11, 0x58, 0xF4, 0xF2, 0x05, 0x4C, 0xFC, 0xB0, 0xF7, + 0x9D, 0x11, 0x03, 0x00, 0xDD, 0x1B, 0xFE, 0x15, 0x13, 0x0A, 0x6B, 0x0E, + 0x57, 0xFF, 0x3E, 0x0B, 0x5A, 0x01, 0xA6, 0x20, 0x8F, 0xFF, 0x54, 0x21, + 0xB0, 0x00, 0xFC, 0x0E, 0x2B, 0x03, 0x7D, 0x0D, 0x12, 0x10, 0x2D, 0x13, + 0xB6, 0x20, 0x24, 0x16, 0x44, 0x1B, 0xD8, 0x24, 0x74, 0x0A, 0xE3, 0x2D, + 0x91, 0x05, 0x64, 0x25, 0x7A, 0x08, 0x7E, 0x24, 0xFE, 0x15, 0x05, 0x31, + 0x49, 0x27, 0xD6, 0x2E, 0x11, 0x1F, 0x19, 0x10, 0xA5, 0x0A, 0x89, 0xEC, + 0xA1, 0x0A, 0x3A, 0xE5, 0x00, 0x11, 0x56, 0xEF, 0xA3, 0xFF, 0x35, 0xEE, + 0x68, 0xF2, 0x99, 0xE6, 0x18, 0xFB, 0xFE, 0xDA, 0xB0, 0xF3, 0xB6, 0xD5, + 0x9F, 0xF1, 0x36, 0xE4, 0x40, 0x02, 0x77, 0xEF, 0xB5, 0x00, 0xBD, 0xF2, + 0x7B, 0xFA, 0x4F, 0x05, 0xE1, 0xF6, 0xE4, 0x15, 0xC0, 0xEE, 0xA0, 0x10, + 0x46, 0xF0, 0xFC, 0x06, 0x27, 0xF7, 0xE4, 0xFE, 0xF1, 0xF7, 0x7B, 0xF9, + 0x0B, 0xFE, 0x71, 0x01, 0x5C, 0x09, 0xB3, 0x12, 0xCD, 0x05, 0x2C, 0x18, + 0x85, 0x12, 0x0C, 0x1C, 0xB5, 0x2B, 0xCE, 0x21, 0xA2, 0x2A, 0x43, 0x1D, + 0x69, 0x21, 0xA0, 0x29, 0xD9, 0x14, 0x1B, 0x3D, 0x27, 0x03, 0x1A, 0x31, + 0x52, 0xF9, 0xB8, 0x14, 0x46, 0x01, 0x6C, 0x0D, 0xD4, 0x01, 0x95, 0x03, + 0x9C, 0xF5, 0x6D, 0xFC, 0x74, 0xE5, 0x18, 0x02, 0x2D, 0xD5, 0xD5, 0xF1, + 0x71, 0xDE, 0x57, 0xE2, 0xA2, 0xF7, 0x64, 0xEB, 0xA3, 0xF8, 0x35, 0xF0, + 0x05, 0xF0, 0x18, 0xEF, 0xDF, 0xEE, 0x73, 0xEC, 0x27, 0xD9, 0xBD, 0xDF, + 0x68, 0xC5, 0x18, 0xD8, 0x9B, 0xC8, 0x59, 0xDD, 0x58, 0xBF, 0x78, 0xD4, + 0x5F, 0xC5, 0x83, 0xCA, 0x01, 0xE4, 0x1F, 0xCC, 0x9B, 0xE7, 0xA4, 0xC3, + 0x92, 0xCD, 0x6D, 0xBD, 0x7D, 0xC9, 0x91, 0xD2, 0x59, 0xD7, 0xC9, 0xE8, + 0xEC, 0xD3, 0x1C, 0xE4, 0x7E, 0xE1, 0x16, 0xE0, 0x2A, 0xE5, 0x7D, 0xE0, + 0x27, 0xD7, 0x26, 0xE7, 0x5A, 0xEB, 0xA4, 0xF5, 0x90, 0x06, 0xF1, 0xFA, + 0x52, 0x0D, 0xB2, 0xF6, 0x0C, 0x0D, 0x2D, 0xF2, 0x6C, 0x09, 0x47, 0xF6, + 0xCA, 0x05, 0x6D, 0x07, 0xF9, 0x07, 0xC9, 0x12, 0xEB, 0x0F, 0x1B, 0x09, + 0xC8, 0x0B, 0xCC, 0xFD, 0x22, 0x05, 0x57, 0xF9, 0xFB, 0x0F, 0x2F, 0xF1, + 0x63, 0x14, 0x56, 0xEC, 0xA0, 0x0B, 0xF2, 0xF7, 0x04, 0xFB, 0x12, 0x03, + 0xA9, 0xE7, 0x12, 0x00, 0x09, 0xF1, 0x5D, 0x03, 0xC6, 0xFD, 0x28, 0xFD, + 0x19, 0xE6, 0x99, 0xE4, 0xD5, 0xDF, 0xFE, 0xE5, 0x2D, 0xFE, 0x86, 0xFB, + 0x2D, 0x10, 0x93, 0x0B, 0xAF, 0x09, 0xB2, 0x0F, 0x02, 0x04, 0x56, 0x0B, + 0x04, 0x04, 0x2C, 0x00, 0x8D, 0x0E, 0xD6, 0xF9, 0x19, 0x1C, 0x69, 0x01, + 0x77, 0x10, 0x70, 0xFF, 0x83, 0xFE, 0xBA, 0xF2, 0xB9, 0xEC, 0xBE, 0xEA, + 0x75, 0xE3, 0x72, 0xF2, 0x4A, 0xE9, 0x9D, 0xF5, 0x67, 0xDE, 0xC0, 0xE9, + 0x78, 0xE1, 0x60, 0xEB, 0xAC, 0xFA, 0x12, 0xE8, 0x29, 0xFD, 0x62, 0xDB, + 0x7F, 0xEA, 0x2B, 0xD4, 0x5B, 0xE5, 0x08, 0xCC, 0x35, 0xF4, 0x67, 0xD2, + 0xA1, 0xF7, 0x63, 0xEA, 0x58, 0xE4, 0xAC, 0xEB, 0xF7, 0xD4, 0xBF, 0xDC, + 0xB0, 0xC7, 0x2E, 0xD7, 0xDF, 0xC9, 0x88, 0xDD, 0x3B, 0xD9, 0x2C, 0xE5, + 0x8C, 0xCF, 0x04, 0xE7, 0xD2, 0xD1, 0xAF, 0xF7, 0x6E, 0xE8, 0x4A, 0x00, + 0xC9, 0xE8, 0xC6, 0xF2, 0xF1, 0xDF, 0x92, 0xF2, 0x7D, 0xE2, 0xAB, 0xFE, + 0xF4, 0xE5, 0x30, 0xEF, 0x50, 0xED, 0x2D, 0xD4, 0x2B, 0x02, 0x6C, 0xD5, + 0x90, 0x0E, 0xF3, 0xE1, 0xFC, 0xFB, 0x04, 0xDF, 0xC5, 0xEF, 0xCE, 0xD9, + 0xC0, 0xF5, 0xA7, 0xDE, 0x1A, 0xF3, 0x41, 0xDC, 0xEA, 0xEF, 0x90, 0xD0, + 0x2F, 0xF7, 0x12, 0xCD, 0xBC, 0xF7, 0x54, 0xD0, 0x0E, 0xDE, 0x3F, 0xD0, + 0xA5, 0xBE, 0x87, 0xBE, 0x95, 0xBC, 0x6B, 0xB2, 0x04, 0xD2, 0x75, 0xC3, + 0x7B, 0xD7, 0xB1, 0xBD, 0xC0, 0xCC, 0x93, 0xA1, 0xF6, 0xCC, 0xC0, 0xAB, + 0xB0, 0xC8, 0xD3, 0xBE, 0xA4, 0xB6, 0xC6, 0xB3, 0x2D, 0xB5, 0x85, 0xB9, + 0xC3, 0xC5, 0xB0, 0xCB, 0xA9, 0xD4, 0x24, 0xBF, 0xAA, 0xDD, 0x27, 0xB4, + 0x81, 0xD2, 0x9F, 0xC7, 0x98, 0xBA, 0x8D, 0xD9, 0x09, 0xBB, 0x2D, 0xDD, + 0x96, 0xD9, 0x0E, 0xF3, 0xB5, 0xF7, 0xE3, 0x06, 0x0F, 0xFD, 0x80, 0xF7, + 0xC3, 0xF3, 0xA9, 0xE6, 0x14, 0xEF, 0xDF, 0xF2, 0xEE, 0xEE, 0x8E, 0x03, + 0xD3, 0xEF, 0x5F, 0x00, 0x16, 0xF5, 0x53, 0xFE, 0xB6, 0xFE, 0xBE, 0xF6, + 0x1F, 0x05, 0x8F, 0xEA, 0x83, 0xFA, 0x6E, 0xEF, 0x41, 0xF9, 0xAB, 0xFA, + 0x46, 0x0C, 0xDD, 0xFF, 0x3A, 0x08, 0xE5, 0xF9, 0x08, 0xF6, 0x82, 0xF6, + 0x71, 0xF9, 0x6B, 0xFB, 0x29, 0xF4, 0xFF, 0xF7, 0x3E, 0xE4, 0x3A, 0xFA, + 0xA9, 0xE4, 0xB8, 0xF5, 0x32, 0xD6, 0x14, 0xDE, 0x0A, 0xC1, 0x64, 0xDE, + 0x1A, 0xCC, 0x46, 0xEF, 0x31, 0xD4, 0x84, 0xE6, 0xA2, 0xC8, 0xA6, 0xD3, + 0x90, 0xC3, 0x41, 0xCB, 0xCE, 0xBE, 0x42, 0xC0, 0xF9, 0xC2, 0x0F, 0xC3, + 0x85, 0xD3, 0x96, 0xCF, 0xAF, 0xDB, 0x82, 0xC7, 0xDE, 0xDB, 0xA9, 0xBE, + 0x63, 0xE6, 0x2A, 0xD1, 0x60, 0xEA, 0x49, 0xE7, 0xCE, 0xCB, 0xAC, 0xDC, + 0x96, 0xBD, 0x17, 0xCF, 0xC3, 0xF6, 0xC7, 0xEB, 0x5A, 0x28, 0xED, 0xF9, + 0xAB, 0x23, 0x31, 0xEA, 0xB1, 0x1D, 0xDC, 0xF0, 0x80, 0x26, 0x27, 0x02, + 0xB6, 0x29, 0x75, 0x06, 0xBC, 0x19, 0x5B, 0x0C, 0x6D, 0x17, 0xF4, 0x1D, + 0x64, 0x1E, 0x3C, 0x19, 0x7C, 0x1B, 0x0C, 0x07, 0x6D, 0x27, 0x1C, 0x05, + 0x1C, 0x33, 0xDF, 0x0F, 0x82, 0x19, 0x97, 0x10, 0xCD, 0xFD, 0x5C, 0x06, + 0xB5, 0x06, 0x04, 0x00, 0x48, 0x17, 0xFE, 0x08, 0xF6, 0x16, 0x4E, 0x1A, + 0x56, 0x19, 0x1A, 0x18, 0xD1, 0x1B, 0x7D, 0x19, 0xC0, 0x06, 0x4A, 0x23, + 0x4B, 0xF6, 0x07, 0x25, 0x6C, 0xF5, 0xBF, 0x23, 0xD6, 0xFC, 0x2A, 0x25, + 0xA4, 0x10, 0xBC, 0x28, 0x92, 0x19, 0x9B, 0x1A, 0x55, 0x18, 0x46, 0x0E, + 0xAB, 0x23, 0xB7, 0x0F, 0xBA, 0x34, 0xEE, 0x0B, 0x93, 0x3C, 0x17, 0x13, + 0xAB, 0x36, 0xE7, 0x26, 0x44, 0x2A, 0x96, 0x31, 0xCD, 0x1C, 0x27, 0x25, + 0x55, 0x21, 0xD3, 0x1E, 0x99, 0x2B, 0x07, 0x29, 0x61, 0x28, 0x6F, 0x27, + 0x79, 0x37, 0xDA, 0x2B, 0x2A, 0x48, 0xD4, 0x3A, 0x3F, 0x3E, 0x28, 0x3F, + 0x6A, 0x33, 0x05, 0x43, 0xBD, 0x37, 0x63, 0x4B, 0xD7, 0x38, 0xA3, 0x42, + 0x8B, 0x3A, 0x66, 0x36, 0x91, 0x41, 0x30, 0x2E, 0x07, 0x3A, 0x51, 0x24, + 0xD9, 0x2D, 0xF1, 0x22, 0x26, 0x2D, 0x3B, 0x27, 0xCC, 0x24, 0xB7, 0x24, + 0xCA, 0x11, 0x22, 0x1A, 0xCC, 0x0D, 0xBC, 0x19, 0xD6, 0x16, 0x46, 0x13, + 0x9D, 0x0B, 0xD0, 0xF6, 0xA9, 0xF6, 0xA1, 0xEF, 0xBC, 0xEF, 0x3B, 0x05, + 0xFA, 0xE6, 0xF9, 0x14, 0x13, 0xD6, 0x23, 0x0C, 0x09, 0xEC, 0x94, 0x0B, + 0xA3, 0x20, 0x6A, 0x1B, 0xCB, 0x1E, 0x5E, 0x03, 0x8A, 0xF9, 0x7A, 0xE8, + 0x38, 0xEE, 0x61, 0xFB, 0x17, 0xE8, 0xC4, 0xFE, 0xD1, 0xE8, 0x97, 0xEA, + 0x08, 0x07, 0xB6, 0xEB, 0x53, 0x13, 0xE9, 0xEA, 0xBA, 0xFC, 0xA1, 0xE3, + 0x38, 0xF2, 0x1F, 0xEA, 0x3D, 0xFF, 0xA8, 0xF9, 0xE8, 0x06, 0xDA, 0x02, + 0xBA, 0xF9, 0x7C, 0xFA, 0x6A, 0xFE, 0x64, 0x00, 0xF2, 0x13, 0xB7, 0x12, + 0x8F, 0x06, 0xAC, 0x0C, 0x87, 0xF5, 0xF2, 0xFC, 0x80, 0xFC, 0x02, 0xFC, + 0xC4, 0x0D, 0x5D, 0x12, 0xC9, 0x26, 0x95, 0x26, 0xC0, 0x2E, 0xE5, 0x28, + 0xB0, 0x2C, 0xA0, 0x36, 0x9A, 0x30, 0x18, 0x40, 0x7E, 0x30, 0xEB, 0x3D, + 0xD2, 0x36, 0xEE, 0x52, 0xE0, 0x42, 0x0F, 0x67, 0x4B, 0x4B, 0x0E, 0x5A, + 0xEE, 0x56, 0x5E, 0x52, 0x6F, 0x63, 0xAF, 0x5E, 0xD6, 0x5D, 0xFC, 0x5A, + 0x8E, 0x4E, 0x45, 0x5A, 0x6A, 0x4B, 0x0B, 0x67, 0x56, 0x50, 0x42, 0x5F, + 0x9E, 0x58, 0x88, 0x55, 0x13, 0x58, 0xDD, 0x57, 0x77, 0x49, 0x4E, 0x51, + 0x64, 0x43, 0xE3, 0x48, 0x0C, 0x3B, 0x6E, 0x3D, 0x53, 0x28, 0x43, 0x34, + 0x20, 0x2B, 0xAC, 0x40, 0x1C, 0x37, 0xDD, 0x46, 0xF3, 0x29, 0x6F, 0x37, + 0xEF, 0x1C, 0x6C, 0x29, 0x07, 0x1F, 0xC7, 0x20, 0xFB, 0x0F, 0x8B, 0x15, + 0x1F, 0x04, 0x99, 0x14, 0x72, 0x0A, 0x8C, 0x15, 0xFF, 0x00, 0x88, 0x05, + 0x55, 0xEE, 0xB0, 0xFC, 0x06, 0xEE, 0x0D, 0xF7, 0x12, 0xF8, 0xD4, 0xF5, + 0x3E, 0xF5, 0x76, 0x0A, 0x0A, 0xE4, 0x20, 0x0A, 0xAA, 0xE1, 0xB9, 0x01, + 0x24, 0xE8, 0xBE, 0x05, 0x89, 0xED, 0xF4, 0x00, 0x9D, 0xF9, 0xEB, 0xF5, + 0x41, 0x00, 0xE0, 0xF7, 0xA7, 0x00, 0xC6, 0x07, 0x62, 0x13, 0x09, 0x15, + 0x6A, 0x22, 0x95, 0x1E, 0xF5, 0x1B, 0x71, 0x1C, 0x77, 0x1E, 0x8F, 0x10, + 0x3E, 0x1F, 0x45, 0x08, 0x9A, 0x07, 0xE4, 0x08, 0xBC, 0xF3, 0x97, 0x15, + 0x78, 0x0E, 0x86, 0x25, 0xE9, 0x2F, 0x14, 0x2C, 0xAA, 0x2A, 0x31, 0x27, + 0x35, 0x21, 0xE6, 0x1D, 0x8B, 0x27, 0x58, 0x1B, 0x90, 0x21, 0xEB, 0x14, + 0xC3, 0x0F, 0x73, 0x0E, 0xA5, 0x08, 0xB5, 0x13, 0xD4, 0x06, 0xB3, 0x16, + 0xF5, 0x0A, 0xFE, 0x14, 0xB3, 0x09, 0xB9, 0x04, 0x78, 0xFB, 0x18, 0xF9, + 0x60, 0xF4, 0x0B, 0x07, 0xAB, 0xF0, 0xB8, 0x0B, 0x7C, 0xE8, 0x6C, 0x05, + 0x7C, 0xEE, 0x80, 0x07, 0x06, 0x06, 0xC1, 0x07, 0x58, 0x10, 0x12, 0x0F, + 0xC9, 0x08, 0xBA, 0x22, 0xCB, 0x05, 0xC3, 0x2F, 0x5D, 0x0A, 0xA1, 0x2B, + 0x4C, 0x11, 0x51, 0x26, 0xE2, 0x1F, 0x5F, 0x30, 0x85, 0x32, 0x17, 0x30, + 0x2F, 0x33, 0x10, 0x20, 0xD6, 0x29, 0xA3, 0x1B, 0xBD, 0x35, 0xCB, 0x29, + 0x20, 0x46, 0x0D, 0x3C, 0x20, 0x49, 0x5D, 0x40, 0x8C, 0x46, 0x4C, 0x33, + 0x0A, 0x3B, 0x34, 0x1D, 0x39, 0x28, 0x03, 0x19, 0xD6, 0x12, 0x40, 0x27, + 0xB3, 0x0B, 0xDC, 0x2C, 0xF8, 0x0A, 0x0E, 0x23, 0x4C, 0x07, 0x40, 0x0E, + 0xA5, 0x12, 0xE3, 0xFC, 0x53, 0x13, 0xCF, 0xF4, 0x0D, 0xF5, 0xF0, 0xE6, + 0x54, 0xDF, 0xAF, 0xD7, 0xD9, 0xDC, 0xF9, 0xD6, 0xD5, 0xDA, 0xE2, 0xD7, + 0x6D, 0xD8, 0xC2, 0xC8, 0x00, 0xD4, 0x35, 0xC0, 0x71, 0xC3, 0x93, 0xC8, + 0x5F, 0xB5, 0x6A, 0xD0, 0xEB, 0xB5, 0x30, 0xD2, 0xD4, 0xB9, 0x06, 0xD4, + 0xC8, 0xBF, 0x3C, 0xD5, 0x5C, 0xBF, 0xBC, 0xC3, 0x34, 0xB6, 0x09, 0xB4, + 0x6C, 0xB3, 0x1C, 0xB6, 0x50, 0xAF, 0xDB, 0xB2, 0x98, 0xAA, 0x9F, 0xB3, + 0xB8, 0xBD, 0x3B, 0xC6, 0x08, 0xCC, 0x7E, 0xCB, 0xB9, 0xC1, 0x7A, 0xBA, + 0x50, 0xC0, 0x3D, 0xBA, 0x49, 0xC5, 0xBC, 0xCC, 0xB5, 0xBA, 0xD0, 0xD0, + 0x67, 0xB5, 0x35, 0xD2, 0x80, 0xC9, 0x20, 0xE1, 0x5D, 0xCD, 0x6E, 0xDA, + 0xEE, 0xBB, 0xE1, 0xCC, 0x0F, 0xC3, 0xC1, 0xD8, 0x2D, 0xD8, 0x21, 0xDA, + 0x5F, 0xDC, 0x18, 0xCF, 0x28, 0xD0, 0x17, 0xD8, 0xE0, 0xD8, 0x2A, 0xF1, + 0x0E, 0xFD, 0xB1, 0x04, 0xB7, 0x04, 0x82, 0x06, 0xBD, 0xEC, 0x35, 0x00, + 0x39, 0xE2, 0x3F, 0xF7, 0xF1, 0xE4, 0x86, 0xF1, 0x0B, 0xEF, 0xFE, 0xF0, + 0x7C, 0x01, 0x6B, 0xE9, 0x36, 0x12, 0xAD, 0xF5, 0xAB, 0x0D, 0x8A, 0x0D, + 0xCF, 0x06, 0xF7, 0x16, 0xB6, 0x19, 0x0C, 0x26, 0xEB, 0x20, 0xDF, 0x27, + 0x8E, 0x17, 0x3C, 0x10, 0x41, 0x18, 0x5A, 0x06, 0xD7, 0x20, 0xC4, 0x1B, + 0x9D, 0x1F, 0xFA, 0x1A, 0x89, 0x10, 0x4C, 0xF9, 0x11, 0x00, 0x17, 0xEA, + 0x04, 0xF9, 0x21, 0xF3, 0x9F, 0xFB, 0x8E, 0xF7, 0x16, 0xFF, 0x9F, 0xF3, + 0x5D, 0xFE, 0xBB, 0xEF, 0x29, 0xFE, 0x8D, 0xDF, 0x1D, 0xF9, 0xFD, 0xCF, + 0x02, 0xE7, 0xE0, 0xD3, 0x2B, 0xC9, 0x34, 0xD9, 0x30, 0xB3, 0xE2, 0xD4, + 0xE1, 0xC2, 0x91, 0xD7, 0x62, 0xDD, 0xEC, 0xDF, 0x6F, 0xE3, 0xC1, 0xDA, + 0x4D, 0xE8, 0xBB, 0xDB, 0x99, 0xE7, 0xAE, 0xE5, 0x67, 0xE4, 0x5B, 0xE7, + 0xB2, 0xE0, 0x2F, 0xEA, 0x73, 0xD7, 0xB9, 0xF2, 0x94, 0xDA, 0x1E, 0xFA, + 0xD2, 0xE5, 0x05, 0xF6, 0x2F, 0xE8, 0xBE, 0xE8, 0x53, 0xE6, 0xB6, 0xDE, + 0x49, 0xF1, 0x2C, 0xE1, 0x47, 0xF3, 0xD7, 0xE7, 0xFE, 0xE7, 0x47, 0xEB, + 0x4B, 0xEB, 0x9F, 0xE8, 0xD2, 0xE4, 0x5C, 0xDA, 0x9F, 0xD3, 0xAE, 0xD1, + 0xB7, 0xE6, 0xF9, 0xE0, 0xEC, 0xFB, 0x74, 0xF3, 0x82, 0xEE, 0x4D, 0xF4, + 0xE6, 0xE3, 0xE9, 0xED, 0xB2, 0xEC, 0x89, 0xF7, 0x0F, 0xE9, 0x17, 0x06, + 0x7C, 0xDC, 0x03, 0x0A, 0x68, 0xEB, 0x15, 0x0D, 0xC7, 0xFB, 0xFD, 0x07, + 0xFD, 0xF5, 0x23, 0xF8, 0x59, 0xFD, 0x03, 0xF0, 0xEE, 0x07, 0x03, 0xEF, + 0x0F, 0xF8, 0x96, 0xDE, 0x1F, 0xEF, 0xC4, 0xDD, 0xA8, 0xF3, 0xD8, 0xF6, + 0x42, 0xF7, 0x5B, 0xFA, 0xE2, 0x12, 0x0C, 0xF0, 0x0C, 0x23, 0xB0, 0xE3, + 0x32, 0x0E, 0xC6, 0xDF, 0xCA, 0x01, 0x3A, 0xED, 0xCD, 0x02, 0xFE, 0xF3, + 0x16, 0xF3, 0xEF, 0xEE, 0x5C, 0xF3, 0x20, 0xFC, 0x8D, 0x0D, 0xCB, 0x07, + 0xD5, 0x18, 0xA5, 0xFB, 0x7E, 0x25, 0x15, 0x04, 0xA2, 0x31, 0x8C, 0x0E, + 0xF4, 0x27, 0xFB, 0x04, 0x0E, 0x24, 0xC6, 0x09, 0x87, 0x27, 0x91, 0x10, + 0x49, 0x1B, 0x99, 0x02, 0x22, 0x0D, 0x65, 0xF2, 0x6A, 0x0B, 0x9F, 0xEF, + 0xD0, 0x0F, 0x10, 0xEE, 0x3B, 0x10, 0xF2, 0xF3, 0x3C, 0x07, 0xBF, 0xFF, + 0x97, 0xF9, 0x3A, 0xFC, 0xD5, 0xEC, 0x9C, 0xF5, 0x21, 0xE3, 0x1A, 0xEE, + 0xA9, 0xE3, 0x43, 0xE5, 0xA6, 0xDF, 0x58, 0xE1, 0x39, 0xC2, 0xC4, 0xD4, + 0xE9, 0xBC, 0xA5, 0xD3, 0x5F, 0xDA, 0xB4, 0xDA, 0x99, 0xDB, 0x11, 0xD3, + 0x0A, 0xCB, 0xC7, 0xCA, 0xDC, 0xD1, 0x6C, 0xCB, 0x74, 0xD3, 0x04, 0xCF, + 0x25, 0xBE, 0x33, 0xCB, 0x00, 0xB0, 0x4B, 0xB4, 0xB3, 0xB4, 0x79, 0xAB, + 0x11, 0xBF, 0xF7, 0xC8, 0x36, 0xD3, 0x45, 0xE1, 0x50, 0xEB, 0x0F, 0xE3, + 0x85, 0xE8, 0x8E, 0xE6, 0xAD, 0xE7, 0xC2, 0xF4, 0x28, 0x04, 0xE5, 0xFB, + 0xC3, 0x0A, 0x93, 0xFB, 0x33, 0xFB, 0x6A, 0x05, 0x15, 0xF6, 0xDC, 0xFE, + 0x5E, 0xF4, 0x06, 0xEE, 0xBC, 0x00, 0x41, 0xFF, 0x40, 0x04, 0xB2, 0x04, + 0x9E, 0xF5, 0xE1, 0xF0, 0x3E, 0x08, 0xF1, 0x08, 0x82, 0x1F, 0x54, 0x21, + 0x81, 0x14, 0xC3, 0x0B, 0x76, 0x0C, 0xAF, 0x06, 0x40, 0x0E, 0xC9, 0x10, + 0x65, 0x0D, 0x96, 0x12, 0x28, 0x15, 0x7A, 0x1A, 0x44, 0x1F, 0xB2, 0x1A, + 0x37, 0x1D, 0xC8, 0x05, 0x1C, 0x12, 0xE9, 0xED, 0xC4, 0x0D, 0xCE, 0xF2, + 0x4D, 0x13, 0xFD, 0x06, 0xE1, 0x1B, 0x7B, 0x15, 0xC1, 0x1C, 0x3B, 0x18, + 0x08, 0x1E, 0x71, 0x11, 0x6B, 0x33, 0x43, 0x18, 0x02, 0x39, 0x14, 0x1B, + 0x26, 0x22, 0xEF, 0x10, 0x57, 0x29, 0x78, 0x14, 0xA2, 0x3B, 0xA3, 0x1C, + 0x15, 0x26, 0x46, 0x1E, 0x41, 0x16, 0xDD, 0x1C, 0x58, 0x21, 0x9E, 0x0B, + 0x7F, 0x21, 0xA2, 0xF5, 0x4E, 0x1E, 0x9B, 0xF6, 0x0E, 0x20, 0x6B, 0x02, + 0xF6, 0x0A, 0x62, 0x0D, 0x6E, 0xF2, 0xB5, 0x15, 0x0F, 0xF1, 0x94, 0x04, + 0x3B, 0xF1, 0xEB, 0xEC, 0xCF, 0xE7, 0xC2, 0xEF, 0x5A, 0xE5, 0xBA, 0xEF, + 0x3E, 0xEF, 0x24, 0xE1, 0x43, 0xF1, 0x1F, 0xDC, 0x9C, 0xEA, 0xA2, 0xD6, + 0xF8, 0xE6, 0x54, 0xD0, 0xF4, 0xDD, 0xB7, 0xD8, 0x4F, 0xC6, 0x7B, 0xD4, + 0x5E, 0xB7, 0x96, 0xC9, 0x6B, 0xBC, 0xC5, 0xCE, 0xEE, 0xC9, 0x4B, 0xDC, + 0xD3, 0xD7, 0xFE, 0xE8, 0xA8, 0xDC, 0xBB, 0xF1, 0x11, 0xE4, 0x5B, 0xF9, + 0x5F, 0xF2, 0x0A, 0xFE, 0xA3, 0xF4, 0xE2, 0x07, 0xA0, 0xE3, 0x78, 0x0B, + 0x8F, 0xDA, 0x63, 0x02, 0x34, 0xEC, 0xC8, 0xFE, 0xFB, 0xFD, 0x2F, 0x03, + 0xF4, 0x00, 0x4A, 0x0D, 0x77, 0x02, 0xC5, 0x17, 0xFB, 0x0C, 0x41, 0x19, + 0xB2, 0x19, 0x68, 0x10, 0xB0, 0x1D, 0x2E, 0x0A, 0x5D, 0x0F, 0x57, 0xFA, + 0x82, 0xFF, 0x3F, 0xEA, 0xF5, 0x0F, 0xD6, 0xFF, 0xE9, 0x1F, 0x43, 0x13, + 0xB3, 0x0A, 0x16, 0x01, 0x6A, 0xFA, 0x23, 0xF3, 0xB3, 0x00, 0x3C, 0xFA, + 0x18, 0xFF, 0x46, 0xFA, 0xC0, 0xFD, 0x09, 0xFF, 0x02, 0x09, 0x33, 0x0A, + 0x1E, 0x13, 0xEC, 0x04, 0x82, 0x20, 0x7D, 0x0A, 0x17, 0x33, 0x86, 0x1D, + 0xDB, 0x38, 0xB5, 0x1E, 0x61, 0x2B, 0xD6, 0x0A, 0xFD, 0x1A, 0x74, 0xF8, + 0x0E, 0x20, 0x57, 0x0C, 0xD2, 0x26, 0xEE, 0x2D, 0xDD, 0x1E, 0x31, 0x2C, + 0x2F, 0x22, 0x53, 0x1F, 0x93, 0x25, 0xA9, 0x23, 0x92, 0x29, 0xF7, 0x29, + 0x8D, 0x3C, 0x7F, 0x27, 0x07, 0x3D, 0x45, 0x2B, 0xDD, 0x2A, 0xFC, 0x39, + 0x71, 0x2E, 0x14, 0x3E, 0xBF, 0x35, 0xDF, 0x2E, 0xD6, 0x2D, 0x59, 0x2A, + 0xC2, 0x36, 0xDB, 0x32, 0x94, 0x35, 0xB3, 0x25, 0xBC, 0x20, 0x5A, 0x25, + 0x5B, 0x12, 0x99, 0x35, 0xFD, 0xF9, 0x08, 0x1E, 0x47, 0xE6, 0xCB, 0xFD, + 0x02, 0xE9, 0x32, 0xFD, 0x0C, 0xF2, 0x24, 0x02, 0xD7, 0xF1, 0x60, 0xFC, + 0xE8, 0xF6, 0x00, 0xFC, 0x32, 0x05, 0x0F, 0x01, 0xAF, 0x02, 0x0D, 0x02, + 0xD5, 0xE4, 0xF0, 0xF4, 0xC0, 0xD0, 0x43, 0xEE, 0x38, 0xD8, 0x69, 0xF3, + 0xEA, 0xD3, 0x92, 0xE4, 0xA1, 0xD0, 0x21, 0xE3, 0xF5, 0xD8, 0x10, 0xF6, + 0x91, 0xD9, 0x5C, 0xF4, 0x0B, 0xE4, 0x60, 0xEF, 0x4A, 0xF3, 0x8D, 0xF9, + 0xB5, 0x00, 0x89, 0x02, 0x56, 0x12, 0x56, 0x05, 0xD4, 0x13, 0x31, 0x01, + 0x69, 0x09, 0x39, 0x02, 0xC1, 0x0A, 0xEA, 0x15, 0xB6, 0x1D, 0x93, 0x25, + 0x8B, 0x2E, 0xEC, 0x16, 0x57, 0x3B, 0x02, 0x12, 0x67, 0x30, 0x6D, 0x1F, + 0x00, 0x10, 0xEB, 0x13, 0xC2, 0x0F, 0xB6, 0x08, 0xAC, 0x20, 0x32, 0x16, + 0xA4, 0x14, 0x45, 0x0B, 0x1E, 0x0E, 0x85, 0xF9, 0x9D, 0x22, 0x7B, 0x11, + 0x5A, 0x11, 0x7C, 0x11, 0x7E, 0xF5, 0x95, 0xFA, 0x78, 0xF8, 0x50, 0x09, + 0x55, 0xF9, 0x51, 0x24, 0x69, 0xF9, 0x9C, 0x22, 0xAF, 0xFC, 0xF4, 0x0C, + 0xD6, 0x09, 0xA4, 0x09, 0xEE, 0x18, 0x51, 0x16, 0x8D, 0x16, 0x04, 0x22, + 0x2C, 0x0D, 0x5A, 0x2F, 0xA9, 0x07, 0xBE, 0x2E, 0xC6, 0x05, 0xCC, 0x16, + 0x11, 0x18, 0x67, 0x12, 0x7C, 0x3A, 0x2A, 0x29, 0x97, 0x3C, 0xD2, 0x2F, + 0x3F, 0x26, 0x7F, 0x28, 0xAD, 0x1E, 0x47, 0x22, 0x23, 0x34, 0xD2, 0x2F, + 0xC0, 0x45, 0x4D, 0x3C, 0x75, 0x3E, 0xBA, 0x2D, 0x3B, 0x3E, 0xF7, 0x27, + 0x4E, 0x39, 0x82, 0x2E, 0x3B, 0x32, 0xB8, 0x35, 0x22, 0x36, 0x94, 0x3D, + 0xD6, 0x2C, 0xE1, 0x35, 0xBE, 0x2A, 0x7E, 0x30, 0xB8, 0x39, 0x92, 0x45, + 0x66, 0x34, 0x06, 0x56, 0x7E, 0x23, 0xDB, 0x4D, 0x6A, 0x1B, 0xEC, 0x34, + 0x82, 0x17, 0x3F, 0x25, 0x96, 0x1C, 0x73, 0x3A, 0x71, 0x14, 0x5D, 0x48, + 0x3A, 0x05, 0x7A, 0x3D, 0x8B, 0x17, 0xEA, 0x3A, 0x58, 0x2D, 0xBA, 0x30, + 0x19, 0x38, 0xAA, 0x28, 0x3B, 0x43, 0x20, 0x2B, 0x65, 0x3D, 0xCB, 0x1B, + 0xBF, 0x2A, 0x85, 0x08, 0x2F, 0x1F, 0x74, 0x12, 0xE8, 0x14, 0xDF, 0x2B, + 0x54, 0x09, 0xB6, 0x32, 0x1D, 0x14, 0xD4, 0x2A, 0x2A, 0x1F, 0x8C, 0x24, + 0xC8, 0x17, 0xE2, 0x22, 0x5F, 0x18, 0x71, 0x17, 0xE4, 0x1A, 0xD6, 0x08, + 0xA6, 0x0D, 0xC7, 0x08, 0xB9, 0x09, 0xDD, 0x0C, 0xDB, 0x1A, 0x81, 0x10, + 0x3D, 0x16, 0x7E, 0x0F, 0x1A, 0x00, 0x04, 0x00, 0x80, 0x03, 0x26, 0xEF, + 0xBA, 0xF3, 0x8C, 0xE8, 0x15, 0xD7, 0xE3, 0xF2, 0x92, 0xDE, 0x8A, 0xFA, + 0x70, 0xD9, 0x07, 0xE8, 0x63, 0xC2, 0xA4, 0xDA, 0x98, 0xD7, 0x7D, 0xEE, + 0xE0, 0xEF, 0x32, 0xF7, 0xAE, 0xE0, 0x78, 0xEC, 0x6E, 0xDC, 0xAE, 0xE7, + 0x30, 0xE6, 0xF6, 0xE3, 0x67, 0xF2, 0x5B, 0xF6, 0x0A, 0xFF, 0xAC, 0x0A, + 0x02, 0xFD, 0x98, 0xFF, 0x93, 0xF8, 0x59, 0xF2, 0x91, 0xFA, 0xC8, 0xF4, + 0xDE, 0x03, 0xBB, 0xFF, 0x14, 0x08, 0x3C, 0x03, 0xBE, 0x01, 0x2F, 0xF8, + 0x5E, 0xFC, 0xDD, 0xF3, 0x11, 0x00, 0xFF, 0xFE, 0x8F, 0x11, 0x3B, 0x0D, + 0x2C, 0x0D, 0xC2, 0xFF, 0xCA, 0xF3, 0x86, 0xE4, 0xA2, 0xF3, 0xAF, 0xED, + 0x3D, 0x08, 0xC2, 0x06, 0x2A, 0x04, 0x24, 0x01, 0xE5, 0xEA, 0x6E, 0xED, + 0xAD, 0xE2, 0x54, 0xED, 0x90, 0xEB, 0x91, 0xFA, 0xDF, 0xF7, 0x43, 0x00, + 0x27, 0xF1, 0x3B, 0x02, 0xE8, 0xE4, 0x78, 0x02, 0x9C, 0xEC, 0xF1, 0xF3, + 0x8E, 0xF4, 0x74, 0xED, 0xFE, 0xE6, 0xCD, 0xF6, 0x24, 0xD3, 0xB7, 0xED, + 0x5F, 0xCC, 0xFD, 0xD5, 0xAA, 0xDA, 0x1E, 0xD7, 0x49, 0xEE, 0x82, 0xE8, + 0x8A, 0xE9, 0xAF, 0xE8, 0xA1, 0xDD, 0x3F, 0xE4, 0x71, 0xE5, 0xDE, 0xEA, + 0x41, 0xEC, 0x25, 0xE3, 0x64, 0xE2, 0x3B, 0xD8, 0xE4, 0xD5, 0x88, 0xD9, + 0xBC, 0xD3, 0x25, 0xD4, 0x4E, 0xDC, 0x9B, 0xD1, 0xCC, 0xE3, 0x7E, 0xD4, + 0x7F, 0xE7, 0x4D, 0xD8, 0x13, 0xEE, 0x3B, 0xE5, 0x8C, 0xF7, 0xAD, 0xF0, + 0xCA, 0xFE, 0x9D, 0xF3, 0x7C, 0x04, 0xB8, 0xEC, 0x27, 0x0F, 0x4A, 0xDE, + 0x80, 0x0C, 0xC6, 0xCC, 0x28, 0xF8, 0xE4, 0xCA, 0x57, 0xEB, 0xA2, 0xE1, + 0x4F, 0xDF, 0xC4, 0xE7, 0xDF, 0xD3, 0x54, 0xD9, 0x04, 0xC9, 0xD2, 0xD3, + 0xFE, 0xBA, 0x45, 0xD7, 0xF8, 0xBC, 0x8F, 0xDB, 0x46, 0xCD, 0x3F, 0xD1, + 0xBB, 0xD2, 0x1C, 0xBE, 0x74, 0xC1, 0xE8, 0xAF, 0x9E, 0xB5, 0x03, 0xAF, + 0x5A, 0xBF, 0xBC, 0xBE, 0xDF, 0xC1, 0x27, 0xBE, 0x89, 0xB0, 0xEB, 0xA5, + 0x05, 0xAC, 0x81, 0xA1, 0x4B, 0xBE, 0xCB, 0xB9, 0x11, 0xC1, 0xB4, 0xBD, + 0xC3, 0xB4, 0x53, 0xB0, 0xA5, 0xB3, 0xAE, 0xB8, 0x53, 0xBA, 0xDD, 0xCE, + 0xFC, 0xB8, 0xF4, 0xDA, 0x77, 0xC0, 0x06, 0xE7, 0xC1, 0xDD, 0x3D, 0xF1, + 0x7F, 0xEC, 0xE9, 0xE2, 0x0B, 0xF3, 0xFC, 0xED, 0x32, 0x0B, 0x51, 0x1A, + 0xD8, 0x16, 0x93, 0x2F, 0x23, 0xFE, 0x93, 0x25, 0x92, 0xF8, 0x1C, 0x1F, + 0x5C, 0x21, 0xBD, 0x27, 0x4B, 0x37, 0x87, 0x1D, 0x0D, 0x2D, 0x7E, 0x0C, + 0x45, 0x2C, 0xB1, 0x0A, 0x8D, 0x32, 0x75, 0x13, 0xEA, 0x30, 0xC7, 0x29, + 0x25, 0x2B, 0xE9, 0x2F, 0x1F, 0x24, 0x16, 0x24, 0x3F, 0x1A, 0xF0, 0x29, + 0x41, 0x18, 0x69, 0x30, 0x54, 0x1B, 0x79, 0x1A, 0xF0, 0x11, 0xE9, 0x07, + 0xAE, 0x04, 0x46, 0x08, 0x7F, 0x05, 0xF8, 0x07, 0x81, 0x07, 0x77, 0x05, + 0x39, 0x03, 0x71, 0x05, 0xCA, 0x03, 0x19, 0xFE, 0xB1, 0x07, 0x1A, 0xED, + 0xCE, 0x11, 0xC9, 0xF1, 0xB3, 0x1B, 0x76, 0xFC, 0xAB, 0x16, 0x2A, 0xED, + 0x78, 0x0F, 0xAE, 0xE1, 0x24, 0x0B, 0xCE, 0xE3, 0x22, 0x05, 0xD7, 0xE8, + 0xAE, 0xF5, 0x18, 0xEE, 0x06, 0xE2, 0xD5, 0xEC, 0x01, 0xE2, 0x5C, 0xED, + 0x08, 0xE8, 0xD5, 0xEF, 0x3F, 0xE6, 0x5E, 0xEC, 0x64, 0xD8, 0x9E, 0xDC, + 0x17, 0xDB, 0xAB, 0xDC, 0xD9, 0xEC, 0xCD, 0xEA, 0x74, 0xE8, 0x1E, 0xE4, + 0x0D, 0xED, 0xE2, 0xE6, 0xE4, 0xF4, 0x2B, 0xF9, 0x2C, 0xE5, 0x53, 0xFD, + 0xF2, 0xD7, 0xB4, 0xEF, 0xBC, 0xD7, 0xBE, 0xE6, 0x52, 0xD6, 0x8D, 0xE6, + 0x9A, 0xE0, 0x9F, 0xE6, 0xC7, 0xEB, 0x42, 0xE6, 0x84, 0xE1, 0xED, 0xEA, + 0xA3, 0xD6, 0x3D, 0xEF, 0xC3, 0xE8, 0x8C, 0xEF, 0xA8, 0xFC, 0xB0, 0xEF, + 0xFC, 0xEE, 0xCD, 0xE9, 0xC7, 0xE7, 0x9C, 0xE5, 0x09, 0xF7, 0x14, 0xEF, + 0x30, 0xF4, 0xB0, 0xF7, 0x85, 0xE5, 0x73, 0xF2, 0x18, 0xED, 0x55, 0xF7, + 0xAD, 0xF8, 0x52, 0xFD, 0x70, 0xF3, 0x83, 0xED, 0xB5, 0xF9, 0x8A, 0xE1, + 0x30, 0x0B, 0xD6, 0xE2, 0x04, 0x08, 0xB9, 0xE1, 0x68, 0xF8, 0xF2, 0xE2, + 0xDF, 0xFB, 0x5B, 0xEE, 0x39, 0x04, 0x34, 0xF1, 0x8D, 0xF4, 0xD7, 0xDE, + 0x17, 0xE5, 0xA3, 0xD4, 0x23, 0xEE, 0x47, 0xE1, 0x89, 0xEC, 0x9D, 0xE3, + 0x8F, 0xD2, 0xB4, 0xC9, 0x1F, 0xD7, 0x6C, 0xC9, 0x68, 0xEB, 0xB7, 0xE4, + 0x55, 0xE8, 0xAD, 0xE9, 0xD3, 0xEB, 0xFD, 0xF0, 0xB7, 0xF6, 0x7A, 0x04, + 0xA6, 0xFE, 0x3C, 0x06, 0x65, 0x0C, 0x78, 0xFF, 0x3F, 0x1C, 0xA2, 0x06, + 0xBA, 0x26, 0x66, 0x11, 0xC6, 0x2C, 0xDB, 0x14, 0xE0, 0x2D, 0xD8, 0x14, + 0xDD, 0x21, 0x5D, 0x1D, 0x7D, 0x0F, 0x76, 0x26, 0xFD, 0x05, 0x32, 0x26, + 0xF8, 0x09, 0x06, 0x1D, 0x52, 0x11, 0xEB, 0x0A, 0x22, 0x06, 0x4F, 0x00, + 0x01, 0xFE, 0xDB, 0x00, 0xB6, 0x0D, 0xDB, 0xFD, 0xB3, 0x10, 0x8A, 0xF9, + 0x69, 0x09, 0x34, 0xFE, 0xF7, 0x06, 0x12, 0x06, 0x37, 0xFC, 0xCE, 0x0C, + 0xB0, 0xF6, 0x6A, 0x0C, 0xE5, 0xFA, 0xC9, 0xF4, 0x33, 0xFE, 0xFC, 0xDA, + 0xA8, 0xFD, 0xBD, 0xE0, 0x8D, 0xF0, 0x8D, 0xED, 0x63, 0xDD, 0xC1, 0xEB, + 0x58, 0xD0, 0xFE, 0xF3, 0x24, 0xDD, 0x3F, 0x01, 0x59, 0xEE, 0x90, 0xEB, + 0xFF, 0xEB, 0x5B, 0xDC, 0xEB, 0xE8, 0xE0, 0xEF, 0x33, 0xE4, 0x3F, 0xFA, + 0x36, 0xE8, 0x75, 0x02, 0xE5, 0xF8, 0x5F, 0x17, 0x8F, 0xFE, 0xD2, 0x15, + 0x10, 0xFC, 0x40, 0xFA, 0x22, 0x02, 0x35, 0xF0, 0x63, 0x1B, 0x4B, 0x01, + 0xB0, 0x2D, 0xE2, 0x07, 0xFF, 0x1C, 0x56, 0x02, 0x16, 0x17, 0xDE, 0x12, + 0xB8, 0x39, 0xDB, 0x30, 0x88, 0x47, 0x90, 0x3B, 0x11, 0x2B, 0x0C, 0x36, + 0xEA, 0x2A, 0xDE, 0x42, 0x1B, 0x3E, 0x88, 0x50, 0x8E, 0x3B, 0xE9, 0x50, + 0x66, 0x42, 0x66, 0x4F, 0xAC, 0x57, 0x5B, 0x44, 0xC1, 0x59, 0x71, 0x3E, + 0xB2, 0x49, 0x29, 0x3F, 0x55, 0x4A, 0x29, 0x49, 0xE7, 0x4D, 0xC7, 0x57, + 0xF3, 0x34, 0x36, 0x49, 0x74, 0x21, 0x6B, 0x28, 0x13, 0x31, 0x93, 0x28, + 0xE6, 0x39, 0x97, 0x35, 0xF1, 0x2C, 0x68, 0x23, 0x39, 0x29, 0xA3, 0x12, + 0xFC, 0x23, 0xA7, 0x1A, 0x19, 0x15, 0xE0, 0x1F, 0x87, 0x14, 0xCF, 0x18, + 0xED, 0x1C, 0x63, 0x16, 0x81, 0x22, 0x32, 0x18, 0x93, 0x29, 0x73, 0x11, + 0xF0, 0x28, 0xC4, 0x08, 0xE2, 0x20, 0x9D, 0x12, 0x59, 0x1E, 0x2B, 0x1B, + 0x5E, 0x22, 0x66, 0x0D, 0xA6, 0x16, 0x76, 0x0A, 0xB6, 0xF9, 0xC6, 0x0F, + 0x7A, 0xF8, 0x5E, 0x0D, 0x08, 0x10, 0x0B, 0x0A, 0x0B, 0x19, 0x7A, 0x01, + 0x2E, 0x14, 0x48, 0xFB, 0x36, 0x13, 0x3D, 0x00, 0x15, 0x16, 0xF1, 0x05, + 0xDE, 0x17, 0xC4, 0x06, 0xD2, 0x13, 0xA1, 0x10, 0x4F, 0x06, 0xE3, 0x14, + 0x9E, 0xF6, 0x99, 0x0D, 0x4F, 0xF2, 0x29, 0x0D, 0x4E, 0xF8, 0x8B, 0x09, + 0xC8, 0xFB, 0xE5, 0x02, 0x33, 0xFB, 0x5C, 0x03, 0xDA, 0xF4, 0x67, 0x07, + 0x93, 0xEE, 0x39, 0x09, 0x5A, 0xEB, 0x0F, 0xFE, 0x57, 0xF1, 0x52, 0xF8, + 0x90, 0x00, 0xC8, 0x01, 0xE2, 0x08, 0x22, 0x03, 0x21, 0x02, 0x75, 0xFC, + 0xF7, 0xF7, 0x77, 0xFF, 0xCF, 0xF7, 0xDD, 0x0D, 0x00, 0xFA, 0xC0, 0x18, + 0xA7, 0xFA, 0x05, 0x1A, 0x00, 0xF3, 0x72, 0x10, 0x36, 0xF1, 0xFA, 0xFB, + 0x51, 0x0B, 0x93, 0xF5, 0x0C, 0x17, 0xAF, 0xFB, 0xE3, 0xFF, 0xD0, 0xEA, + 0x11, 0xF2, 0x3F, 0xE6, 0xF7, 0xFD, 0xF9, 0x06, 0xB6, 0x08, 0x1D, 0x17, + 0x5B, 0xFB, 0xBB, 0x09, 0xE9, 0xE8, 0x53, 0x02, 0x76, 0xEF, 0xB8, 0x01, + 0xC6, 0x02, 0x6B, 0xF8, 0x90, 0x0E, 0xC7, 0xF3, 0x93, 0x15, 0xB8, 0xFD, + 0x28, 0x18, 0x26, 0x08, 0x08, 0x00, 0xB8, 0x04, 0x48, 0xE6, 0x94, 0x00, + 0x96, 0xEA, 0x96, 0xFD, 0xA1, 0xEC, 0xC9, 0xF7, 0x59, 0xEA, 0xBB, 0xF8, + 0x9F, 0xFD, 0xBE, 0x00, 0x2C, 0x12, 0x32, 0x05, 0x99, 0x10, 0x6F, 0x06, + 0xBE, 0x03, 0x82, 0x0A, 0xA0, 0x08, 0x21, 0x17, 0xA2, 0x13, 0x92, 0x1F, + 0x4C, 0x15, 0x39, 0x18, 0x19, 0x21, 0x59, 0x0B, 0xC3, 0x2B, 0xC0, 0x01, + 0xB7, 0x24, 0x16, 0x07, 0x21, 0x13, 0x89, 0x14, 0x0C, 0xFD, 0xD9, 0x1A, + 0x45, 0xF9, 0xBE, 0x1D, 0x47, 0x0B, 0x33, 0x16, 0x42, 0x11, 0x1B, 0x04, + 0xBB, 0x00, 0xF9, 0xF9, 0x68, 0xF1, 0x2D, 0x00, 0xE9, 0xF6, 0x2B, 0x0F, + 0x00, 0xFD, 0xA7, 0x1B, 0x15, 0xF4, 0x68, 0x18, 0x38, 0xF4, 0xB0, 0x0B, + 0x1C, 0xFF, 0x78, 0x05, 0x5C, 0xFB, 0xC3, 0xF4, 0x22, 0xF4, 0x04, 0xEB, + 0x21, 0xF9, 0xD8, 0xF8, 0xA0, 0xF9, 0x7F, 0xFC, 0xE2, 0xFD, 0xEE, 0xF6, + 0x7E, 0x0A, 0x7D, 0xFB, 0x10, 0x04, 0x88, 0x02, 0xB2, 0xF7, 0x0A, 0xFF, + 0xCF, 0xFF, 0xEB, 0x01, 0xE8, 0x08, 0xEE, 0x14, 0x9B, 0x06, 0xD3, 0x1A, + 0x0E, 0x09, 0x67, 0x11, 0x10, 0x18, 0xD0, 0x18, 0xD5, 0x2A, 0x94, 0x26, + 0x56, 0x30, 0xBB, 0x1C, 0xC3, 0x2E, 0x45, 0x1E, 0x8E, 0x24, 0x44, 0x33, + 0x9D, 0x1D, 0x63, 0x3C, 0x46, 0x35, 0x1D, 0x39, 0xA5, 0x3D, 0xFF, 0x23, + 0x99, 0x27, 0xA3, 0x16, 0x5D, 0x25, 0x6C, 0x2C, 0xCD, 0x2C, 0x4A, 0x42, + 0xDC, 0x20, 0x6F, 0x3C, 0x65, 0x15, 0x39, 0x31, 0x27, 0x1E, 0xDD, 0x34, + 0x24, 0x2C, 0xEB, 0x41, 0xB6, 0x22, 0x42, 0x47, 0xE5, 0x0D, 0x9F, 0x3F, + 0xEC, 0x0B, 0x1F, 0x33, 0x4A, 0x12, 0x31, 0x1C, 0x8D, 0x11, 0xD8, 0x0C, + 0xD2, 0x07, 0xE6, 0x16, 0xF0, 0xFB, 0x67, 0x22, 0xBD, 0xFC, 0xAC, 0x1E, + 0x48, 0x06, 0x4B, 0x14, 0xAF, 0x05, 0x14, 0x0E, 0x5A, 0xF9, 0x74, 0x02, + 0x55, 0xEB, 0x84, 0xF6, 0x0C, 0xEF, 0xEC, 0xFB, 0x71, 0x03, 0x6C, 0xF6, + 0xA6, 0x03, 0x00, 0xE5, 0xA2, 0xF0, 0xD3, 0xE9, 0x56, 0xE1, 0xA3, 0xF2, + 0x8F, 0xE1, 0xB8, 0xED, 0xAE, 0xF1, 0x9E, 0xE7, 0x9F, 0xFC, 0x49, 0xEF, + 0x0F, 0xFE, 0xA0, 0xF5, 0x71, 0x0A, 0x41, 0xF2, 0x06, 0x14, 0xFF, 0x01, + 0x0F, 0x05, 0x90, 0x10, 0x92, 0xF7, 0xF4, 0xFE, 0x55, 0xF8, 0x4A, 0xF3, + 0xC1, 0xF8, 0x5D, 0xFB, 0x54, 0xF5, 0xC9, 0xF2, 0x5A, 0xF2, 0x8F, 0xE1, + 0xAC, 0xF7, 0x33, 0xE3, 0xA4, 0xFA, 0x84, 0xE9, 0x9B, 0xF4, 0xAA, 0xE8, + 0x38, 0xEB, 0x3F, 0xE2, 0x5A, 0xE0, 0x7D, 0xCF, 0xA2, 0xD7, 0x38, 0xC1, + 0x7D, 0xCC, 0x44, 0xC6, 0x57, 0xC1, 0xA3, 0xC2, 0x19, 0xC4, 0x75, 0xBE, + 0xEE, 0xC9, 0x38, 0xCC, 0x6F, 0xC1, 0xA2, 0xD4, 0x2F, 0xBC, 0x06, 0xD8, + 0xCF, 0xBE, 0x6B, 0xDA, 0xBF, 0xBC, 0x2D, 0xD9, 0x02, 0xC6, 0x11, 0xD0, + 0xB1, 0xDA, 0x60, 0xC7, 0xDC, 0xE2, 0x78, 0xD2, 0xBD, 0xEA, 0x0C, 0xE1, + 0x9F, 0xFB, 0x46, 0xE8, 0x54, 0xFF, 0x32, 0xF5, 0xB5, 0xEC, 0x40, 0xFA, + 0xE5, 0xDB, 0x28, 0xFA, 0x4A, 0xD6, 0x83, 0x04, 0xD1, 0xDF, 0xDA, 0x0B, + 0xEB, 0xF6, 0xA7, 0x00, 0x06, 0xFD, 0xEC, 0xEA, 0x35, 0xFA, 0x80, 0xE8, + 0x55, 0xFF, 0x7E, 0xFD, 0xE4, 0xFB, 0xFE, 0x0E, 0xF3, 0xF1, 0x5E, 0x09, + 0x29, 0xFD, 0xA7, 0xFA, 0x12, 0x12, 0xF8, 0xF6, 0xFC, 0x0D, 0x32, 0xF0, + 0xC9, 0xF8, 0xA1, 0xE2, 0x08, 0xE9, 0x36, 0xE3, 0xF3, 0xEC, 0x87, 0xF7, + 0xD7, 0xF5, 0x86, 0x07, 0x3A, 0xFD, 0x7A, 0x07, 0x87, 0xFE, 0xCB, 0xFB, + 0x8A, 0xF7, 0x19, 0xEF, 0x4C, 0x01, 0xE9, 0xED, 0x36, 0x04, 0xFA, 0xF9, + 0x92, 0xED, 0xAD, 0x0B, 0xC0, 0xE4, 0x28, 0x10, 0x6A, 0x04, 0x57, 0x17, + 0x7C, 0x22, 0x83, 0x28, 0x0B, 0x19, 0x4D, 0x1C, 0x9F, 0x12, 0x2B, 0x01, + 0x42, 0x1D, 0xEB, 0x06, 0xB8, 0x21, 0x6E, 0x1A, 0x29, 0x27, 0x7C, 0x11, + 0x97, 0x2E, 0x2B, 0xFF, 0x7A, 0x25, 0x97, 0x00, 0x68, 0x1C, 0x00, 0x07, + 0xFC, 0x1D, 0x96, 0x02, 0xA5, 0x05, 0x73, 0x00, 0xFC, 0xE5, 0x5F, 0x02, + 0x96, 0xEE, 0xFC, 0xF4, 0x47, 0x01, 0x8D, 0xDF, 0x3E, 0xFA, 0x6F, 0xD7, + 0x7A, 0xE6, 0x08, 0xCF, 0x69, 0xDC, 0xD1, 0xC8, 0xDB, 0xDC, 0x8B, 0xDC, + 0xDC, 0xD5, 0xC8, 0xE5, 0xAB, 0xCF, 0x03, 0xD0, 0xD7, 0xCE, 0x4C, 0xC2, + 0x13, 0xCE, 0x89, 0xD2, 0x05, 0xDE, 0x4B, 0xEE, 0xC6, 0xEE, 0xEB, 0xFB, + 0x86, 0xE9, 0xA2, 0xF8, 0xAC, 0xEE, 0xC2, 0xF6, 0xC2, 0xFE, 0x8F, 0xFD, + 0x2E, 0x06, 0x49, 0xFD, 0xEA, 0x03, 0xAD, 0xF0, 0xF0, 0xFA, 0x39, 0xE8, + 0x65, 0x01, 0x8F, 0xF3, 0x7A, 0x0D, 0x91, 0x04, 0x80, 0x0F, 0x77, 0x02, + 0x24, 0x0D, 0x82, 0x01, 0x8F, 0x0C, 0xF4, 0x11, 0xA5, 0x11, 0xC8, 0x10, + 0x27, 0x0C, 0xE6, 0x01, 0xEC, 0xEF, 0xA3, 0xF7, 0x0E, 0xDB, 0xB1, 0xE1, + 0xDD, 0xE4, 0x12, 0xD3, 0xD1, 0xF9, 0x92, 0xE8, 0x83, 0xFB, 0x39, 0xF6, + 0xA8, 0xEC, 0x11, 0xE4, 0x9D, 0xE4, 0x79, 0xDA, 0x71, 0xE2, 0xC1, 0xDC, + 0xAF, 0xD7, 0x29, 0xDA, 0x6B, 0xC2, 0xFC, 0xD5, 0xC6, 0xB8, 0xD1, 0xD9, + 0xD8, 0xC5, 0xFB, 0xDE, 0xA0, 0xCB, 0xA1, 0xD7, 0x5C, 0xC2, 0xF2, 0xC6, + 0x09, 0xBC, 0xC1, 0xC4, 0x58, 0xB9, 0xE3, 0xDB, 0xD0, 0xC0, 0x69, 0xE3, + 0x7E, 0xD5, 0x76, 0xD2, 0xDF, 0xE2, 0xF0, 0xC8, 0xE6, 0xE4, 0x7D, 0xCE, + 0x15, 0xF5, 0x1C, 0xDF, 0xA9, 0x00, 0xFF, 0xE9, 0x7C, 0xFC, 0x5E, 0xF3, + 0x1F, 0x06, 0x21, 0xF4, 0xCE, 0x11, 0x10, 0xE8, 0x9B, 0x0F, 0xF4, 0xE7, + 0x84, 0x12, 0x9D, 0xEA, 0x8C, 0x16, 0xB6, 0xDC, 0xC1, 0x11, 0xDA, 0xD4, + 0xDF, 0x0A, 0x20, 0xE6, 0xDD, 0x06, 0x72, 0xF3, 0x7F, 0x0E, 0xC2, 0xF8, + 0xB0, 0x11, 0x97, 0xFB, 0xE5, 0x07, 0x48, 0xF4, 0xD6, 0xFF, 0xC4, 0xEE, + 0x1C, 0xF9, 0xE1, 0xF3, 0xC5, 0xEE, 0x81, 0xF9, 0x22, 0xEB, 0x11, 0xF1, + 0xC4, 0xEC, 0x93, 0xE1, 0x09, 0xE7, 0xCF, 0xD9, 0xA0, 0xD7, 0xCA, 0xDC, + 0x9D, 0xC1, 0x43, 0xDB, 0xA9, 0xB9, 0x25, 0xD0, 0xC4, 0xC6, 0xB8, 0xC5, + 0x9D, 0xCB, 0x34, 0xB3, 0xFC, 0xC4, 0x9E, 0xA8, 0x11, 0xC6, 0x51, 0xB8, + 0x9C, 0xC5, 0x90, 0xD3, 0x3E, 0xBF, 0x76, 0xE4, 0xFF, 0xC0, 0x61, 0xDA, + 0xDB, 0xC8, 0x72, 0xCA, 0xEE, 0xCE, 0x92, 0xC3, 0x7D, 0xD2, 0x68, 0xBC, + 0x84, 0xCD, 0x5F, 0xB7, 0xE8, 0xCB, 0xE7, 0xC3, 0x32, 0xD1, 0x40, 0xD6, + 0x17, 0xD8, 0x55, 0xDB, 0x9A, 0xE9, 0x0B, 0xE7, 0x65, 0xFB, 0x31, 0xF6, + 0x68, 0xF5, 0x3D, 0xEF, 0x50, 0xE5, 0x9A, 0xE4, 0x17, 0xE6, 0x81, 0x00, + 0xE2, 0xE4, 0xDD, 0x22, 0x29, 0xE8, 0x62, 0x24, 0x50, 0xF6, 0x66, 0x21, + 0x4A, 0xFA, 0x00, 0x23, 0xF3, 0x05, 0x4C, 0x26, 0x48, 0x15, 0x98, 0x22, + 0xFC, 0x12, 0x2E, 0x16, 0xB4, 0x0F, 0x93, 0x1C, 0x1C, 0x0E, 0x4A, 0x1F, + 0x16, 0x0E, 0xEC, 0x11, 0x60, 0x14, 0x93, 0x10, 0x4B, 0x12, 0x30, 0x10, + 0x4A, 0x09, 0x74, 0x14, 0x8F, 0x04, 0xB9, 0x21, 0x9C, 0x0C, 0x88, 0x24, + 0xB0, 0x18, 0x19, 0x1D, 0x2A, 0x22, 0x36, 0x13, 0x7F, 0x2C, 0x41, 0x06, + 0x3C, 0x2C, 0x7D, 0x06, 0x44, 0x28, 0x6C, 0x14, 0x96, 0x26, 0xD9, 0x15, + 0x3D, 0x28, 0x3A, 0x15, 0x04, 0x2E, 0xB7, 0x18, 0x78, 0x29, 0x99, 0x18, + 0xCA, 0x23, 0x3E, 0x18, 0xDB, 0x2E, 0x1A, 0x1E, 0x79, 0x3D, 0x3B, 0x24, + 0xA4, 0x43, 0xF8, 0x20, 0xD7, 0x3F, 0x65, 0x22, 0x94, 0x31, 0xCD, 0x2F, + 0xB1, 0x27, 0x5A, 0x36, 0x07, 0x2B, 0x18, 0x2B, 0x87, 0x2D, 0x85, 0x21, + 0xB1, 0x24, 0xEB, 0x23, 0xF6, 0x14, 0xEF, 0x1A, 0x8D, 0x0A, 0x26, 0x10, + 0xE4, 0x13, 0xCA, 0x1D, 0x75, 0x1F, 0xAC, 0x2A, 0x53, 0x1E, 0x40, 0x2A, + 0x04, 0x22, 0x0E, 0x2D, 0x94, 0x25, 0x79, 0x2E, 0xE9, 0x20, 0xBB, 0x29, + 0xBF, 0x22, 0x92, 0x23, 0x52, 0x2A, 0x55, 0x23, 0xDC, 0x2A, 0x55, 0x29, + 0x23, 0x20, 0xBE, 0x28, 0xBA, 0x1C, 0x21, 0x2B, 0x0D, 0x25, 0x91, 0x2F, + 0x66, 0x21, 0x4B, 0x2A, 0xAC, 0x15, 0xAB, 0x20, 0x37, 0x13, 0xBF, 0x0F, + 0x68, 0x15, 0x39, 0x02, 0xC2, 0x0F, 0xFC, 0xFC, 0x48, 0x09, 0x78, 0xFF, + 0x3F, 0xFD, 0xBD, 0x07, 0xC3, 0xEB, 0x67, 0x0D, 0x3F, 0xEE, 0x8B, 0x0E, + 0xCE, 0xF2, 0xFB, 0x03, 0xB4, 0xEC, 0xB4, 0xF3, 0x63, 0xF3, 0xDE, 0xEA, + 0xAF, 0xF2, 0x2E, 0xE3, 0x34, 0xE3, 0xCB, 0xE2, 0x6E, 0xE1, 0x28, 0xF2, + 0xBA, 0xDC, 0x77, 0xF9, 0xD2, 0xD9, 0x68, 0xF5, 0xBA, 0xE2, 0xBA, 0xE8, + 0xEF, 0xE9, 0x34, 0xE1, 0xEB, 0xF0, 0x5A, 0xEC, 0x03, 0xEB, 0x78, 0xF3, + 0x41, 0xE5, 0x36, 0xFC, 0x65, 0xF3, 0xC2, 0x0B, 0xB1, 0xF9, 0x35, 0x14, + 0x40, 0xED, 0x19, 0x15, 0x2C, 0xF9, 0xB1, 0x16, 0x4C, 0x15, 0x32, 0x1C, + 0x1B, 0x20, 0x85, 0x1C, 0x28, 0x2F, 0xA2, 0x1B, 0x9A, 0x43, 0x60, 0x1E, + 0xB2, 0x4C, 0x5A, 0x29, 0xE9, 0x49, 0xD9, 0x32, 0x15, 0x3C, 0xC5, 0x39, + 0x04, 0x2C, 0x1D, 0x43, 0x3E, 0x2F, 0xB9, 0x43, 0x44, 0x42, 0x83, 0x39, + 0x07, 0x43, 0x10, 0x28, 0x39, 0x28, 0xB6, 0x18, 0xEB, 0x14, 0xC6, 0x16, + 0xEC, 0x17, 0xCA, 0x1D, 0x35, 0x1B, 0x19, 0x25, 0x14, 0x1C, 0xDF, 0x1B, + 0xFB, 0x21, 0xA5, 0x0A, 0xAE, 0x2A, 0xE9, 0x06, 0xFF, 0x26, 0x6B, 0xFB, + 0x1A, 0x1C, 0x5D, 0xF4, 0x9F, 0x0A, 0x68, 0xFB, 0xA4, 0xF0, 0xE6, 0x00, + 0x7B, 0xF2, 0x2B, 0x07, 0xE7, 0x03, 0x99, 0x04, 0x48, 0xF9, 0x00, 0xF9, + 0xB5, 0xE9, 0xDC, 0xF0, 0xAF, 0xF0, 0xF2, 0xEC, 0x81, 0xF6, 0x94, 0xEF, + 0xD6, 0xF0, 0x79, 0xF3, 0xA6, 0xEC, 0x2C, 0xF0, 0x6C, 0xED, 0x35, 0xF4, + 0x77, 0xFC, 0x1C, 0x07, 0x3A, 0x08, 0x65, 0x10, 0xA9, 0x05, 0xED, 0x12, + 0x5A, 0x0C, 0xA6, 0x1D, 0xD1, 0x1A, 0x42, 0x22, 0x5A, 0x2B, 0x67, 0x1F, + 0x4B, 0x2E, 0x47, 0x19, 0x8A, 0x1E, 0xA8, 0x12, 0xCA, 0x17, 0xDD, 0x14, + 0x4F, 0x1E, 0xA8, 0x20, 0x75, 0x22, 0xD1, 0x2F, 0x95, 0x1C, 0xA9, 0x35, + 0x9D, 0x14, 0xAE, 0x2E, 0xB7, 0x0C, 0x66, 0x2B, 0xE4, 0x06, 0x39, 0x2F, + 0x72, 0x07, 0x1A, 0x2C, 0x04, 0xF8, 0xF8, 0x24, 0x04, 0xE8, 0x8D, 0x20, + 0x2C, 0xEC, 0x93, 0x17, 0x5E, 0xE5, 0x07, 0x09, 0xEF, 0xDE, 0x14, 0x06, + 0x1D, 0xEA, 0x5C, 0x00, 0x1B, 0xF7, 0x65, 0xF3, 0x7F, 0x06, 0x50, 0xFC, + 0x83, 0x00, 0xFD, 0xFD, 0x59, 0xEC, 0x6B, 0xF5, 0x20, 0xEF, 0x92, 0xFF, + 0x12, 0xFB, 0xCE, 0x08, 0x80, 0xFB, 0x99, 0x02, 0xB2, 0xFC, 0xA9, 0xFC, + 0xD7, 0x07, 0x34, 0xFE, 0xAF, 0x11, 0xC1, 0xFE, 0x09, 0x13, 0x91, 0x00, + 0x34, 0x1A, 0x8F, 0x06, 0x64, 0x22, 0x53, 0x07, 0xCF, 0x26, 0xA3, 0x0F, + 0xC9, 0x26, 0xE2, 0x14, 0xB7, 0x27, 0x49, 0x11, 0x63, 0x2A, 0xB6, 0x0D, + 0x4B, 0x21, 0x8F, 0x11, 0x05, 0x1E, 0x7F, 0x1D, 0xBB, 0x22, 0x15, 0x1C, + 0xB7, 0x25, 0x5A, 0x10, 0x46, 0x2A, 0x94, 0x07, 0x38, 0x30, 0x27, 0x13, + 0x50, 0x2B, 0x6A, 0x23, 0x3E, 0x23, 0x1E, 0x24, 0x16, 0x21, 0x20, 0x17, + 0x59, 0x1B, 0x1B, 0xFE, 0xEF, 0x13, 0xDD, 0xF4, 0x73, 0x04, 0x48, 0x00, + 0x65, 0xEF, 0x1F, 0x0C, 0xCB, 0xE5, 0xA1, 0x0F, 0xA0, 0xE7, 0xE3, 0x0A, + 0x31, 0xF3, 0xBC, 0x09, 0x19, 0x00, 0x1C, 0x05, 0xA1, 0x0C, 0xF5, 0xF8, + 0x53, 0x11, 0x3D, 0xEF, 0x04, 0x03, 0x99, 0xF2, 0xD4, 0xF5, 0x52, 0xFB, + 0xF9, 0xF4, 0xF8, 0x00, 0x8E, 0xF1, 0x5B, 0x09, 0xF6, 0xEC, 0x69, 0x05, + 0xBE, 0xF1, 0x62, 0xF6, 0x21, 0xF1, 0xB9, 0xF0, 0xB8, 0xE6, 0x2B, 0xF3, + 0x06, 0xDE, 0x9E, 0xEF, 0x8D, 0xD6, 0x01, 0xE6, 0xF0, 0xCA, 0x3E, 0xE4, + 0xB3, 0xC4, 0x4A, 0xE4, 0x43, 0xC6, 0x53, 0xDF, 0xC2, 0xBA, 0xAC, 0xE0, + 0x69, 0xB0, 0x36, 0xE5, 0x72, 0xC9, 0xFD, 0xE5, 0xBE, 0xE6, 0x28, 0xDB, + 0xE2, 0xEB, 0x40, 0xCD, 0x34, 0xE3, 0xF7, 0xD3, 0x7F, 0xCC, 0x7B, 0xE5, + 0xF9, 0xC2, 0xA5, 0xF2, 0x1C, 0xD3, 0x98, 0xEF, 0x1F, 0xE2, 0x23, 0xD9, + 0x4E, 0xE4, 0xB9, 0xCC, 0xD1, 0xEA, 0xB8, 0xDD, 0x5B, 0xF8, 0x06, 0xED, + 0x27, 0xF8, 0xCA, 0xEF, 0xE6, 0xF7, 0xBB, 0xF9, 0x32, 0x08, 0x73, 0x0A, + 0xE4, 0x11, 0x49, 0x10, 0xF1, 0x12, 0x86, 0x0B, 0x8E, 0x10, 0x81, 0x03, + 0x34, 0x07, 0x75, 0xF9, 0xCA, 0x04, 0xCC, 0xF4, 0xA8, 0x09, 0xAF, 0xF2, + 0xA8, 0x0B, 0x56, 0xED, 0x0D, 0x02, 0x88, 0xE2, 0x74, 0xFE, 0x56, 0xE6, + 0x48, 0x07, 0x8F, 0xEF, 0x92, 0x0A, 0x14, 0xF2, 0xCD, 0x04, 0xA3, 0xFA, + 0xF2, 0xFA, 0xE8, 0xF7, 0xD1, 0xF8, 0x1A, 0xF5, 0x65, 0xF3, 0x3D, 0xFC, + 0xE3, 0xE7, 0xD8, 0xFD, 0x8B, 0xE8, 0x27, 0xFE, 0x99, 0xEE, 0x7A, 0x02, + 0x9E, 0xEF, 0xBC, 0xFF, 0x64, 0xFC, 0x78, 0xF1, 0xBC, 0x10, 0xA0, 0xE9, + 0xC9, 0x1D, 0x31, 0xF1, 0x53, 0x29, 0xD7, 0xFD, 0x2E, 0x27, 0xE8, 0x03, + 0x77, 0x0E, 0x9C, 0x03, 0x9B, 0x00, 0x76, 0x0C, 0x48, 0x0B, 0x97, 0x1C, + 0xAF, 0x0F, 0x73, 0x23, 0x0E, 0x12, 0x7B, 0x2C, 0x76, 0x1C, 0x54, 0x2A, + 0xE7, 0x1E, 0x30, 0x14, 0x12, 0x26, 0xAF, 0x0D, 0xDD, 0x28, 0x47, 0x0C, + 0x76, 0x16, 0xE1, 0x0A, 0x32, 0x0E, 0xDB, 0x19, 0x32, 0x0D, 0x1F, 0x1A, + 0xC9, 0x09, 0x79, 0x10, 0x6F, 0x0F, 0x47, 0x14, 0xF9, 0x14, 0x75, 0x14, + 0x80, 0x0F, 0x7D, 0x11, 0xC6, 0xFB, 0xED, 0x16, 0x7E, 0xEF, 0x82, 0x16, + 0xF1, 0xF1, 0x0B, 0x0B, 0xBF, 0xF3, 0xA1, 0x0C, 0x6D, 0xF0, 0x3B, 0x0D, + 0x45, 0xF1, 0x26, 0x00, 0xA6, 0xFB, 0x5A, 0xFA, 0xDC, 0xFF, 0x52, 0xF9, + 0xDE, 0xF8, 0x5D, 0xFA, 0xB5, 0xEE, 0xB0, 0xFE, 0xCB, 0xDC, 0xB9, 0xFF, + 0xCA, 0xCD, 0x24, 0xFB, 0x22, 0xD7, 0x71, 0xF4, 0x43, 0xE3, 0x69, 0xF1, + 0x4A, 0xDE, 0xDC, 0xE9, 0x98, 0xE1, 0x12, 0xE5, 0x82, 0xF1, 0x92, 0xE6, + 0x33, 0xFE, 0xBF, 0xE6, 0x19, 0x05, 0xA8, 0xF0, 0xAE, 0xFD, 0xAB, 0xF4, + 0xC4, 0xF8, 0xE8, 0xF0, 0x1A, 0x02, 0xFB, 0xF0, 0x15, 0x0A, 0x3B, 0xF4, + 0xA1, 0x04, 0x3A, 0xEF, 0xE5, 0x00, 0x57, 0xED, 0x9E, 0x03, 0x6D, 0xF7, + 0xE3, 0x02, 0x9E, 0xF9, 0xDD, 0xFE, 0xF5, 0xF7, 0xEC, 0xFB, 0x95, 0xF6, + 0x22, 0x00, 0xED, 0xFC, 0x7B, 0x0A, 0x17, 0x04, 0x26, 0x14, 0xF7, 0xF0, + 0x7F, 0x0C, 0xE0, 0xDB, 0x4F, 0xFF, 0xF9, 0xE6, 0x6C, 0xFE, 0x13, 0xF9, + 0xF0, 0xEF, 0x31, 0xF4, 0xA6, 0xDB, 0x8E, 0xE7, 0x0D, 0xDE, 0xB8, 0xDE, + 0xDF, 0xE4, 0xC2, 0xD8, 0x9B, 0xE6, 0xF7, 0xDA, 0xE0, 0xE5, 0xCB, 0xD6, + 0x52, 0xE4, 0x23, 0xC6, 0xE2, 0xE2, 0x34, 0xC0, 0x49, 0xDD, 0x03, 0xCE, + 0xA1, 0xD7, 0x86, 0xD6, 0x5C, 0xCD, 0xEB, 0xD2, 0x43, 0xCB, 0x6A, 0xD7, + 0xB1, 0xDE, 0x11, 0xDF, 0xC7, 0xF2, 0x25, 0xDE, 0x1B, 0xFB, 0x69, 0xDF, + 0x4B, 0xF3, 0xA2, 0xE2, 0x80, 0xE7, 0xB7, 0xDD, 0xA1, 0xEB, 0x3B, 0xE2, + 0xE5, 0xE7, 0xCD, 0xED, 0x0C, 0xDC, 0xC6, 0xEE, 0x00, 0xE0, 0xB4, 0xF0, + 0x23, 0xE7, 0x60, 0xF7, 0xF1, 0xE5, 0x18, 0xF6, 0xE1, 0xDA, 0xDA, 0xEF, + 0xF9, 0xD6, 0xC2, 0xF8, 0x23, 0xE3, 0x64, 0xFF, 0xDD, 0xF4, 0x31, 0xF3, + 0x74, 0xFC, 0x9A, 0xE5, 0xD5, 0xEF, 0x73, 0xDE, 0xC6, 0xEA, 0x29, 0xE1, + 0xB2, 0xEC, 0x0B, 0xE9, 0x0C, 0xEB, 0x6F, 0xF5, 0xA1, 0xF2, 0x5B, 0xF3, + 0x1B, 0xFB, 0x29, 0xE6, 0x59, 0xFA, 0x40, 0xEB, 0x5A, 0x00, 0x79, 0xF3, + 0xB8, 0x02, 0xBE, 0xF0, 0xA3, 0xF5, 0x1A, 0xF1, 0x9D, 0xF9, 0x37, 0xFE, + 0x33, 0x01, 0xB4, 0x04, 0x55, 0xF7, 0x4B, 0xFC, 0xE3, 0xF8, 0x50, 0x01, + 0x0D, 0x05, 0x86, 0x06, 0x19, 0x0A, 0xB3, 0x03, 0xDA, 0x0C, 0xE7, 0x14, + 0xA5, 0x06, 0x5B, 0x19, 0xEA, 0x00, 0xB1, 0x06, 0xBD, 0x08, 0xB7, 0x02, + 0x32, 0x0B, 0x1E, 0x05, 0x08, 0x04, 0x17, 0xFA, 0xE5, 0xFD, 0x5A, 0xF7, + 0x31, 0xFD, 0xB6, 0xFE, 0x36, 0x00, 0xA3, 0xF9, 0x56, 0xF9, 0x19, 0xFB, + 0x71, 0xE7, 0x34, 0xFD, 0x44, 0xE1, 0xE0, 0xF6, 0x46, 0xE9, 0x82, 0xFB, + 0xA1, 0xF1, 0xB7, 0xFD, 0x09, 0xF9, 0x8F, 0xF2, 0xDF, 0xFA, 0x0B, 0xE7, + 0x34, 0xF4, 0xF7, 0xE4, 0xFA, 0xEE, 0xAA, 0xEC, 0x9E, 0xF7, 0x35, 0xF6, + 0x34, 0x05, 0xF1, 0xFA, 0xE0, 0x05, 0x05, 0xFA, 0x4D, 0x07, 0x85, 0xF5, + 0x69, 0x14, 0x87, 0xF3, 0xE1, 0x22, 0x0E, 0xF8, 0x67, 0x23, 0x6C, 0x00, + 0x7F, 0x16, 0xBF, 0x06, 0xF8, 0x0F, 0x8B, 0x0B, 0x36, 0x09, 0xA7, 0x10, + 0x8B, 0x09, 0x25, 0x17, 0x8E, 0x12, 0x36, 0x18, 0xDB, 0x0F, 0x30, 0x14, + 0x75, 0x0A, 0xD4, 0x14, 0x25, 0x10, 0xE5, 0x11, 0xA6, 0x17, 0xB3, 0x07, + 0x36, 0x10, 0xDD, 0x04, 0x01, 0x02, 0x16, 0xFD, 0x8F, 0xFB, 0x7D, 0xED, + 0x19, 0x00, 0x86, 0xEF, 0x85, 0x06, 0x69, 0xF6, 0x6B, 0xFF, 0x97, 0xEF, + 0x59, 0xF3, 0x13, 0xE7, 0x17, 0xEC, 0xEE, 0xEA, 0xF5, 0xEF, 0x91, 0xFA, + 0x66, 0xF6, 0x2C, 0xFC, 0xF1, 0xED, 0x0F, 0xF6, 0xE4, 0xEF, 0x64, 0x04, + 0x4C, 0xFC, 0x19, 0x0C, 0x73, 0xF8, 0x43, 0xFD, 0x95, 0xF1, 0xE3, 0xF1, + 0x52, 0xEF, 0x5B, 0xEF, 0x33, 0xF1, 0x6C, 0xF3, 0xEC, 0xF0, 0x8F, 0x02, + 0x98, 0xE9, 0x05, 0x13, 0x9D, 0xE8, 0x2B, 0x11, 0xD1, 0xF3, 0xCA, 0x08, + 0xFF, 0x00, 0x6B, 0x09, 0x45, 0x04, 0xF6, 0x0A, 0x41, 0x01, 0x9C, 0x0C, + 0xAD, 0x0A, 0x67, 0x18, 0x0E, 0x18, 0x34, 0x2A, 0x0D, 0x13, 0x88, 0x25, + 0xEB, 0x0B, 0xEF, 0x11, 0xE2, 0x05, 0xFA, 0x08, 0xC7, 0x06, 0x57, 0x05, + 0x0F, 0x18, 0x80, 0x05, 0x58, 0x10, 0xDD, 0xFD, 0x54, 0xF9, 0xDD, 0xF3, + 0x36, 0xED, 0xC5, 0xFE, 0xEE, 0xE4, 0x61, 0x0C, 0x2D, 0xEE, 0x78, 0x09, + 0xEC, 0xFF, 0x71, 0xF8, 0xDC, 0x09, 0xE3, 0xE6, 0xCD, 0x0D, 0x20, 0xE4, + 0xCE, 0x09, 0x8B, 0xE7, 0xC4, 0xFC, 0xFD, 0xE9, 0xDF, 0xEA, 0x69, 0xEB, + 0xDA, 0xE9, 0x95, 0xEB, 0xFD, 0xF3, 0xCC, 0xE6, 0xF9, 0xEB, 0x45, 0xDE, + 0xF5, 0xDD, 0x71, 0xDA, 0x65, 0xD9, 0x66, 0xDF, 0x82, 0xD8, 0x66, 0xEA, + 0x36, 0xEA, 0xF6, 0xF2, 0xAF, 0x05, 0x4C, 0xF7, 0x49, 0x0A, 0xF3, 0xF3, + 0x93, 0x04, 0xF2, 0xED, 0xFF, 0x06, 0xC8, 0xEE, 0xF5, 0x06, 0x57, 0xEE, + 0x72, 0xFD, 0x78, 0xEF, 0x3C, 0xFA, 0x14, 0xFC, 0xD1, 0x00, 0x16, 0x02, + 0x90, 0x05, 0x88, 0xFD, 0x55, 0x04, 0x61, 0xFA, 0x7B, 0x0B, 0xBE, 0xF9, + 0x99, 0x0D, 0x58, 0x00, 0xFC, 0xFD, 0x1F, 0x0E, 0x6C, 0x02, 0xCA, 0x14, + 0xFE, 0x0B, 0xAF, 0x0C, 0x3C, 0x09, 0xCB, 0x0E, 0xC2, 0x07, 0x9E, 0x1E, + 0x95, 0x02, 0x8B, 0x34, 0x1F, 0xFA, 0xBE, 0x41, 0xC8, 0xF9, 0x3A, 0x30, + 0xAC, 0x12, 0x35, 0x23, 0xCC, 0x2C, 0xFF, 0x2F, 0x23, 0x29, 0x46, 0x35, + 0x3E, 0x1E, 0xC4, 0x2C, 0xDF, 0x24, 0x0B, 0x2E, 0x1E, 0x28, 0xA9, 0x28, + 0xDA, 0x21, 0x87, 0x1D, 0x82, 0x20, 0x56, 0x1F, 0x96, 0x2A, 0x80, 0x2A, + 0x65, 0x32, 0xA1, 0x39, 0xB8, 0x26, 0x51, 0x3A, 0x33, 0x2E, 0xC7, 0x3C, + 0xE1, 0x3C, 0xB6, 0x3B, 0x6B, 0x33, 0xF6, 0x2E, 0x15, 0x29, 0xFB, 0x2D, + 0xE1, 0x28, 0xB4, 0x2D, 0xD3, 0x2E, 0x11, 0x26, 0xFE, 0x32, 0xE2, 0x20, + 0xF6, 0x37, 0xDB, 0x27, 0x83, 0x2F, 0x64, 0x27, 0x72, 0x20, 0x21, 0x1D, + 0x65, 0x1E, 0x90, 0x1E, 0xBC, 0x17, 0xCA, 0x22, 0x2F, 0x0E, 0x81, 0x23, + 0xD5, 0x08, 0xB8, 0x24, 0xA3, 0x03, 0x4F, 0x1B, 0xFF, 0x0A, 0xE9, 0x11, + 0xF3, 0x15, 0x08, 0x1B, 0x29, 0x15, 0x55, 0x23, 0x75, 0x19, 0x53, 0x2A, + 0x83, 0x24, 0x0D, 0x30, 0x3D, 0x2B, 0x9D, 0x2B, 0x25, 0x2C, 0x9D, 0x27, + 0x88, 0x30, 0xAE, 0x2C, 0x02, 0x37, 0x8B, 0x3A, 0xC3, 0x36, 0xDB, 0x3A, + 0xB6, 0x34, 0xD7, 0x2D, 0x52, 0x2A, 0xC8, 0x28, 0x86, 0x27, 0x41, 0x2E, + 0x7F, 0x2D, 0xFF, 0x30, 0xF4, 0x31, 0x6E, 0x2E, 0xED, 0x3E, 0x5B, 0x2A, + 0xC7, 0x42, 0x6B, 0x1E, 0x32, 0x37, 0x4D, 0x15, 0xA5, 0x28, 0xC9, 0x0F, + 0xBE, 0x1B, 0xEF, 0x03, 0xC2, 0x10, 0x28, 0xFB, 0xFC, 0x04, 0x02, 0xFF, + 0xFA, 0xFB, 0x7E, 0x00, 0xF9, 0xF8, 0xE5, 0xF8, 0xB3, 0xF3, 0xE8, 0xFA, + 0x50, 0xEA, 0x1C, 0xFE, 0xDA, 0xDF, 0x12, 0xEC, 0xB3, 0xDE, 0x2A, 0xE0, + 0xE1, 0xE5, 0xFA, 0xEA, 0x76, 0xE8, 0xC7, 0xF0, 0x07, 0xEE, 0x91, 0xED, + 0xCF, 0xE9, 0x8B, 0xEE, 0xCA, 0xD7, 0xE3, 0xF0, 0x2A, 0xCD, 0xF7, 0xEA, + 0xD8, 0xD4, 0xED, 0xEE, 0xAD, 0xE9, 0x7F, 0xF7, 0xB3, 0xF9, 0x51, 0xEC, + 0x28, 0xFB, 0x1D, 0xE6, 0xE6, 0xEE, 0x10, 0xF3, 0x24, 0xF0, 0x5E, 0x08, + 0x9B, 0xF8, 0x51, 0x10, 0xBA, 0xF7, 0x72, 0x0A, 0x32, 0x05, 0xB3, 0x0A, + 0x4B, 0x1E, 0x89, 0x14, 0x16, 0x22, 0xC5, 0x1F, 0xE6, 0x0B, 0x62, 0x21, + 0xE6, 0x00, 0xE5, 0x21, 0x46, 0x05, 0xCF, 0x22, 0xAB, 0x08, 0x1E, 0x23, + 0x14, 0x11, 0x1C, 0x21, 0x07, 0x17, 0xDA, 0x18, 0x59, 0x0F, 0x75, 0x0F, + 0xF5, 0x0A, 0x08, 0x0D, 0x39, 0x06, 0xE1, 0x09, 0xF7, 0xF3, 0x85, 0x05, + 0xF8, 0xF2, 0xE5, 0x11, 0x09, 0xFF, 0xBA, 0x13, 0x69, 0xF7, 0xC2, 0xFB, + 0x5F, 0xEC, 0xC7, 0xE9, 0x69, 0xEC, 0x65, 0xE5, 0x28, 0xEA, 0xBA, 0xE9, + 0x06, 0xE9, 0xC4, 0xF4, 0x67, 0xF0, 0x98, 0xF8, 0x3E, 0xEE, 0x99, 0xEC, + 0x95, 0xED, 0x86, 0xE7, 0xAD, 0xF9, 0x51, 0xEA, 0xC9, 0xF6, 0x03, 0xE1, + 0x2C, 0xEE, 0x2C, 0xDD, 0x0A, 0xE9, 0xBD, 0xDB, 0xF1, 0xEA, 0x0B, 0xD4, + 0x1C, 0xF8, 0xC7, 0xD1, 0x54, 0xF0, 0xA9, 0xD5, 0x3A, 0xE1, 0x65, 0xDF, + 0x96, 0xEA, 0x53, 0xEE, 0x0E, 0xF8, 0xD9, 0xFA, 0xFC, 0x03, 0xA9, 0x05, + 0xDB, 0x14, 0x5C, 0x0F, 0x87, 0x1C, 0xC3, 0x09, 0x66, 0x1D, 0x20, 0x02, + 0x5B, 0x1C, 0x98, 0x07, 0x80, 0x15, 0x21, 0x0E, 0x2A, 0x0F, 0xC3, 0x15, + 0x41, 0x0A, 0x7D, 0x15, 0x10, 0x06, 0xF0, 0x06, 0x82, 0x06, 0x4F, 0x00, + 0x86, 0xFD, 0x5E, 0xFE, 0xC9, 0xFB, 0xB2, 0x07, 0x1B, 0x02, 0xCE, 0x0F, + 0x73, 0xFD, 0x0B, 0x00, 0xEE, 0xF9, 0x5B, 0xF8, 0x8D, 0xF2, 0x13, 0xFA, + 0x75, 0xE1, 0x1B, 0xEF, 0xE5, 0xD8, 0x00, 0xEC, 0xCC, 0xDC, 0x7A, 0xF2, + 0x0D, 0xDA, 0xBA, 0xEB, 0x78, 0xD4, 0xCE, 0xDE, 0x96, 0xE1, 0xE5, 0xDF, + 0x16, 0xEE, 0x47, 0xE3, 0x84, 0xE6, 0x08, 0xDC, 0xCD, 0xE1, 0xE4, 0xE3, + 0xFF, 0xDE, 0x70, 0xED, 0xBB, 0xDD, 0x24, 0xEB, 0x6B, 0xE5, 0x46, 0xEF, + 0xB4, 0xF3, 0xA5, 0xF4, 0x4D, 0x09, 0x3A, 0xF9, 0xCA, 0x0B, 0xDF, 0xF3, + 0x2E, 0x01, 0xE7, 0xF0, 0x34, 0xFD, 0x76, 0xF8, 0x16, 0xF8, 0xD8, 0xFE, + 0xC1, 0xED, 0x6A, 0xF8, 0xFB, 0xEF, 0xC9, 0xEA, 0x04, 0xFA, 0x48, 0xE7, + 0x6A, 0xF7, 0x5C, 0xEA, 0x56, 0xFB, 0x27, 0xF7, 0x4A, 0x03, 0x0D, 0x03, + 0x97, 0xFB, 0x11, 0xFA, 0x5F, 0xF8, 0x9E, 0xF9, 0xFC, 0xF2, 0xE0, 0x03, + 0x46, 0xE8, 0x13, 0xFC, 0xFA, 0xED, 0x05, 0xF5, 0xD1, 0xF0, 0xFF, 0xEE, + 0x87, 0xF6, 0x53, 0xE6, 0x22, 0xFF, 0xAF, 0xE8, 0xFA, 0xF6, 0xA7, 0xEB, + 0x59, 0xF7, 0x7E, 0xEF, 0x7A, 0xF9, 0xF6, 0xEF, 0xC4, 0xEE, 0xF2, 0xEA, + 0xC2, 0xE9, 0xC7, 0xE8, 0xD2, 0xF8, 0x5B, 0xED, 0xCC, 0x00, 0xA0, 0xF2, + 0xEA, 0xFC, 0x66, 0xF2, 0xDF, 0x07, 0x32, 0xED, 0xEA, 0x04, 0xF1, 0xE7, + 0xAE, 0xF2, 0xDB, 0xEC, 0x2C, 0xE9, 0x88, 0xEF, 0xA2, 0xE4, 0xA9, 0xEB, + 0x3F, 0xEB, 0x97, 0xE6, 0x86, 0xF2, 0x47, 0xD2, 0x72, 0xFD, 0x88, 0xC5, + 0xE3, 0x03, 0x23, 0xCB, 0x72, 0xF1, 0x55, 0xCE, 0xB4, 0xD3, 0x02, 0xD5, + 0xF3, 0xB7, 0x35, 0xDC, 0x00, 0xB2, 0x42, 0xDB, 0x54, 0xC5, 0x99, 0xD6, + 0xD2, 0xD2, 0x95, 0xD1, 0x51, 0xCE, 0xFC, 0xD0, 0x82, 0xC8, 0xD1, 0xCE, + 0xD0, 0xD0, 0x77, 0xD5, 0xDB, 0xD6, 0xCA, 0xE0, 0xE2, 0xDA, 0xEB, 0xDF, + 0xFA, 0xEC, 0x91, 0xE2, 0x35, 0xFA, 0xB9, 0xE7, 0x51, 0xFC, 0x0E, 0xEB, + 0x4D, 0xFA, 0x5C, 0xF1, 0x86, 0xFA, 0x18, 0xFB, 0x93, 0xF6, 0xB5, 0x05, + 0xDA, 0xEB, 0xCF, 0x06, 0xE4, 0xF5, 0x46, 0x0B, 0xC5, 0x04, 0xA4, 0x14, + 0x89, 0xFE, 0xDE, 0x07, 0x60, 0xFE, 0x64, 0xF5, 0x40, 0x0C, 0x92, 0xFD, + 0xDE, 0x09, 0x4A, 0x06, 0xB4, 0xFC, 0x08, 0xFF, 0x18, 0x07, 0xD7, 0x01, + 0x23, 0x0F, 0xF0, 0x00, 0x02, 0xF7, 0x03, 0xF4, 0x77, 0xE5, 0xDA, 0xFD, + 0x56, 0xE0, 0x73, 0x07, 0xFC, 0xD6, 0xA9, 0xEE, 0x50, 0xE3, 0xE6, 0xE0, + 0x6A, 0xF1, 0xD6, 0xE7, 0x8D, 0xE4, 0x6D, 0xE2, 0x13, 0xD9, 0xAA, 0xE6, + 0x7F, 0xD9, 0xEA, 0xF7, 0x0B, 0xDD, 0xF9, 0xF7, 0x1A, 0xEA, 0xE7, 0xF3, + 0xAB, 0xF2, 0x02, 0xF9, 0x50, 0xEC, 0x46, 0xFA, 0x0F, 0xFA, 0x30, 0x06, + 0x99, 0x0D, 0x9E, 0x0E, 0x0D, 0x18, 0x94, 0x07, 0x86, 0x28, 0x5B, 0x09, + 0x9E, 0x25, 0x34, 0x07, 0x81, 0x17, 0x35, 0x05, 0x52, 0x1F, 0xE1, 0x0F, + 0x69, 0x2F, 0xA2, 0x12, 0xC0, 0x39, 0x68, 0x19, 0xF7, 0x43, 0x7A, 0x2A, + 0x30, 0x3B, 0xA1, 0x26, 0x35, 0x32, 0x40, 0x28, 0xC8, 0x2E, 0x8C, 0x2D, + 0xD9, 0x23, 0xD5, 0x24, 0xF8, 0x26, 0x1C, 0x32, 0x47, 0x26, 0x9A, 0x3D, + 0x44, 0x1E, 0x6D, 0x2A, 0x0E, 0x2A, 0x91, 0x1E, 0xF5, 0x34, 0xF0, 0x22, + 0xCE, 0x2F, 0x41, 0x27, 0x55, 0x26, 0xE8, 0x2A, 0xAC, 0x1A, 0x56, 0x26, + 0x25, 0x11, 0xAF, 0x1A, 0x2D, 0x0C, 0x74, 0x0D, 0x8D, 0x0C, 0x42, 0x08, + 0x03, 0x0A, 0x38, 0x0C, 0xBD, 0x05, 0xD9, 0x0C, 0x93, 0x04, 0xD2, 0x01, + 0x4B, 0x07, 0xFD, 0xF9, 0x68, 0x09, 0xFF, 0xFF, 0xFE, 0xF6, 0x3B, 0xF8, + 0x95, 0xED, 0x2E, 0xF5, 0x2B, 0xFE, 0x05, 0x08, 0x2A, 0xF8, 0xB3, 0x04, + 0x0A, 0xF3, 0x80, 0x01, 0x2F, 0x04, 0xA2, 0x0D, 0x1C, 0x01, 0x88, 0x03, + 0xA8, 0x02, 0xDF, 0x04, 0x1B, 0x0E, 0x04, 0x15, 0x15, 0x09, 0x7B, 0x08, + 0xF9, 0x08, 0x07, 0x01, 0xCD, 0x06, 0xAB, 0x06, 0x5B, 0x02, 0x0F, 0xFC, + 0xA9, 0x08, 0x98, 0xF4, 0xA2, 0x09, 0x5E, 0xFE, 0x09, 0x07, 0x81, 0x08, + 0xAC, 0x15, 0x34, 0x0F, 0xDF, 0x22, 0x41, 0x19, 0x37, 0x0D, 0xB6, 0x14, + 0x92, 0xF6, 0x66, 0x09, 0x41, 0xF1, 0xB4, 0x0C, 0xBD, 0xE6, 0x1F, 0x07, + 0x6E, 0xF3, 0x17, 0xF7, 0xB4, 0x0A, 0x4A, 0xEA, 0x68, 0x04, 0xEF, 0xE4, + 0x35, 0xF7, 0xBE, 0xEB, 0x72, 0xEE, 0x96, 0xF0, 0x08, 0xE8, 0x8B, 0xF5, + 0x64, 0xE0, 0xC1, 0xED, 0x31, 0xE5, 0x54, 0xDC, 0xE4, 0xFE, 0x7A, 0xE1, + 0xD2, 0xF8, 0x0D, 0xD7, 0x27, 0xE5, 0x65, 0xC8, 0x65, 0xE0, 0x49, 0xD7, + 0x1F, 0xCB, 0x6C, 0xDD, 0x0F, 0xC1, 0x2E, 0xDF, 0x93, 0xD0, 0xAF, 0xE4, + 0xB1, 0xE0, 0x51, 0xE2, 0xF5, 0xE9, 0xE9, 0xDE, 0xED, 0xF1, 0x41, 0xE2, + 0x28, 0xFF, 0x1C, 0xF6, 0x43, 0x02, 0x72, 0x05, 0x39, 0x07, 0x17, 0x08, + 0x31, 0x14, 0xBD, 0x08, 0xC8, 0x10, 0x03, 0x01, 0xEC, 0xFB, 0x80, 0xEF, + 0x7B, 0xED, 0x99, 0xDF, 0xBF, 0xF7, 0x45, 0xEA, 0x17, 0xFA, 0x88, 0xF4, + 0x2D, 0xF8, 0x44, 0xF0, 0x53, 0x08, 0xEA, 0xF9, 0xA9, 0xFD, 0xF5, 0xEF, + 0x3B, 0xF3, 0xC4, 0xE9, 0xD4, 0xFC, 0xC1, 0xFD, 0x34, 0xF2, 0x29, 0xFE, + 0x13, 0xFC, 0x32, 0x02, 0xED, 0x11, 0xAB, 0x0B, 0x4A, 0x0C, 0xDB, 0x0C, + 0x05, 0x0B, 0x80, 0x13, 0xCE, 0x09, 0x6C, 0x0D, 0xCC, 0xFC, 0xA9, 0x03, + 0x51, 0xF9, 0x50, 0x04, 0xDB, 0x03, 0x89, 0xFF, 0x14, 0x0B, 0x1E, 0xF9, + 0x6D, 0x0B, 0x88, 0xFE, 0xAA, 0x0A, 0x8A, 0x02, 0x22, 0x05, 0x9F, 0x03, + 0x54, 0xFF, 0xAD, 0x0F, 0x49, 0xF7, 0x31, 0x18, 0x51, 0xEB, 0xB1, 0x1B, + 0x2C, 0xE5, 0x12, 0x1E, 0xEF, 0xE4, 0xCB, 0x0F, 0xD1, 0xED, 0xC3, 0x04, + 0xBC, 0xF9, 0xA5, 0x09, 0x6F, 0xFF, 0x59, 0x09, 0x64, 0x0E, 0x80, 0x0D, + 0xD6, 0x0A, 0xC6, 0x0A, 0xDE, 0xFC, 0x58, 0x04, 0x48, 0xFF, 0xCA, 0x08, + 0x53, 0xFA, 0x0E, 0x0F, 0x3F, 0xF2, 0x41, 0x15, 0x09, 0xFB, 0x1F, 0x11, + 0x9C, 0x07, 0xC6, 0x03, 0x7E, 0x05, 0x7E, 0x01, 0x95, 0x04, 0x0B, 0x11, + 0x25, 0x04, 0x8D, 0x13, 0x60, 0x00, 0x2C, 0x05, 0x91, 0x05, 0x5C, 0x01, + 0x61, 0x0E, 0x1D, 0x08, 0x02, 0x13, 0xE9, 0x0E, 0xE6, 0x15, 0x69, 0x19, + 0xDE, 0x1A, 0x1E, 0x24, 0x56, 0x1C, 0xCA, 0x1C, 0x0F, 0x1C, 0x91, 0x18, + 0x78, 0x26, 0x8E, 0x31, 0xB0, 0x22, 0xF6, 0x34, 0xED, 0x14, 0x2F, 0x17, + 0x44, 0x27, 0xC4, 0x0B, 0x22, 0x35, 0x77, 0x09, 0x32, 0x29, 0x43, 0x07, + 0xE7, 0x28, 0x38, 0x15, 0x22, 0x28, 0x06, 0x15, 0x38, 0x1A, 0xAA, 0x09, + 0xE6, 0x0C, 0x29, 0x08, 0x99, 0x02, 0x6B, 0xFE, 0x1D, 0xF5, 0x05, 0xF6, + 0x1C, 0xEE, 0xFF, 0xF9, 0x6F, 0x05, 0x87, 0xF9, 0xE3, 0x1D, 0xC2, 0xF2, + 0x22, 0x16, 0x36, 0xFC, 0xEB, 0x03, 0x34, 0x08, 0xF8, 0x02, 0x8C, 0x06, + 0x33, 0x10, 0x13, 0x0A, 0x2A, 0x0A, 0x55, 0x01, 0x3B, 0xFE, 0x67, 0xF0, + 0xA3, 0xF8, 0x5A, 0xF0, 0x1E, 0xF1, 0xDA, 0xFB, 0xC4, 0xF4, 0xD4, 0x00, + 0xD8, 0xF8, 0x6C, 0xFB, 0x53, 0xFA, 0x5E, 0xFA, 0x8E, 0xF8, 0xF3, 0xF6, + 0x3D, 0xF6, 0x82, 0xF5, 0x29, 0xF8, 0x8E, 0xFC, 0x7D, 0xEE, 0x30, 0xF8, + 0x3D, 0xED, 0xF3, 0xF3, 0x4E, 0x01, 0xCD, 0x05, 0x2D, 0x0E, 0x6C, 0x1A, + 0xC8, 0x0E, 0xC0, 0x23, 0x30, 0xFE, 0xD5, 0x25, 0xED, 0xF2, 0x62, 0x2C, + 0xDF, 0xFA, 0x9E, 0x25, 0x2C, 0x01, 0x3A, 0x0F, 0xBC, 0x08, 0xA0, 0x07, + 0x18, 0x0C, 0xC6, 0xFE, 0x17, 0x07, 0x7E, 0xF4, 0x0D, 0x01, 0x16, 0xFA, + 0x47, 0xF2, 0xE1, 0xFF, 0xE1, 0xEC, 0x8A, 0xFF, 0x10, 0xFB, 0xB1, 0xFA, + 0x2D, 0xFE, 0x9D, 0xF0, 0x18, 0xEC, 0x02, 0xE5, 0xC4, 0xDE, 0xD3, 0xE5, + 0xB2, 0xE0, 0x49, 0xF3, 0xF2, 0xE6, 0xEC, 0xF9, 0x07, 0xF1, 0xB1, 0xF8, + 0x2A, 0xF5, 0x3C, 0xED, 0x26, 0xF6, 0xD5, 0xE4, 0xE0, 0xF8, 0x3C, 0xE1, + 0x0F, 0xFB, 0xD4, 0xDB, 0x25, 0xFA, 0xCC, 0xE9, 0xEC, 0xE9, 0xA5, 0xEF, + 0x6E, 0xE0, 0x44, 0xEB, 0x8E, 0xED, 0x6F, 0xF4, 0xE9, 0xF0, 0xCD, 0xF3, + 0xBE, 0xED, 0x49, 0xF2, 0x6E, 0xEB, 0x0A, 0xF2, 0xE7, 0xE5, 0x0E, 0xE5, + 0xB3, 0xFA, 0xD7, 0xE3, 0x03, 0x10, 0x06, 0xEE, 0xD8, 0x0B, 0xCB, 0xF6, + 0x5A, 0x0B, 0xCB, 0x02, 0xF5, 0x0A, 0xD3, 0x06, 0x07, 0x09, 0x3B, 0x0C, + 0xF6, 0x10, 0x58, 0x0E, 0x96, 0x14, 0x63, 0x04, 0x03, 0x0D, 0xDC, 0x05, + 0xA3, 0xF8, 0x76, 0x03, 0xD9, 0xEF, 0x4C, 0xFC, 0x30, 0xFC, 0x7C, 0x04, + 0xA6, 0x04, 0xAF, 0x09, 0x3D, 0x02, 0xC7, 0x05, 0xDC, 0xFA, 0xB7, 0x0B, + 0x66, 0xFA, 0x42, 0x14, 0xB2, 0xFF, 0xF4, 0x11, 0xE9, 0x0A, 0xE9, 0x14, + 0x20, 0x15, 0x81, 0x1C, 0xE0, 0x14, 0xFB, 0x1B, 0xA9, 0x1E, 0xE7, 0x1C, + 0x0C, 0x24, 0x72, 0x23, 0x1D, 0x18, 0x09, 0x2B, 0x3A, 0x1B, 0xA8, 0x2D, + 0xB3, 0x26, 0xE7, 0x2B, 0x64, 0x23, 0x7B, 0x2B, 0xAB, 0x20, 0xD4, 0x2C, + 0x3E, 0x26, 0x68, 0x2B, 0x35, 0x29, 0xBD, 0x2D, 0x6F, 0x2A, 0x7D, 0x34, + 0x87, 0x2C, 0x96, 0x2C, 0xBC, 0x2B, 0x14, 0x21, 0x3C, 0x26, 0xB5, 0x1F, + 0x6C, 0x24, 0x27, 0x21, 0x63, 0x1C, 0xC2, 0x20, 0xE9, 0x0B, 0x91, 0x13, + 0xF7, 0x10, 0xE0, 0x11, 0x4A, 0x24, 0x2B, 0x25, 0x83, 0x2B, 0x1E, 0x23, + 0x9F, 0x26, 0xD8, 0x12, 0x74, 0x26, 0xB4, 0x21, 0x7B, 0x20, 0x1F, 0x34, + 0x8D, 0x15, 0xA2, 0x29, 0x0E, 0x1F, 0xBB, 0x2A, 0xE0, 0x26, 0x13, 0x37, + 0x5A, 0x26, 0x75, 0x2F, 0x0E, 0x32, 0x58, 0x2D, 0x5F, 0x39, 0xA0, 0x3F, + 0x4D, 0x2C, 0x63, 0x43, 0xFC, 0x1E, 0xC3, 0x38, 0xC5, 0x1F, 0x91, 0x2B, + 0x20, 0x29, 0xEE, 0x1C, 0xE6, 0x2E, 0x5A, 0x13, 0xBF, 0x27, 0xB9, 0x0D, + 0x60, 0x20, 0xF4, 0x1E, 0x25, 0x1D, 0xCB, 0x25, 0x5E, 0x1D, 0x22, 0x1D, + 0x7E, 0x13, 0xD5, 0x21, 0x7B, 0x05, 0x73, 0x15, 0x12, 0x04, 0x81, 0x01, + 0xF6, 0x07, 0x25, 0xFB, 0x62, 0xF8, 0x54, 0xE8, 0xD2, 0xE9, 0xF3, 0xE3, + 0xDA, 0xF9, 0x58, 0xF8, 0x4D, 0xF8, 0x7A, 0xEE, 0x30, 0xE6, 0x02, 0xD5, + 0x1D, 0xDB, 0x5D, 0xD1, 0xA3, 0xCE, 0x12, 0xDB, 0x37, 0xC8, 0x3D, 0xD4, + 0xFB, 0xD5, 0xF4, 0xCB, 0xE1, 0xE2, 0x37, 0xD0, 0x0E, 0xDB, 0xB4, 0xCC, + 0x0E, 0xDA, 0xB1, 0xD1, 0xAF, 0xDC, 0x81, 0xE2, 0x0B, 0xDF, 0xE8, 0xEE, + 0x52, 0xE1, 0x30, 0xE7, 0x21, 0xE9, 0x7C, 0xD5, 0x3A, 0xF2, 0xBB, 0xC7, + 0xA0, 0xEB, 0xC4, 0xC1, 0x9E, 0xE0, 0xB8, 0xCA, 0xF3, 0xDB, 0xD9, 0xDE, + 0x8C, 0xE3, 0x88, 0xF2, 0x68, 0xF1, 0x42, 0xF9, 0xAA, 0xF0, 0x35, 0xEB, + 0x05, 0xEB, 0x65, 0xDD, 0x6F, 0xF2, 0xFD, 0xDF, 0x12, 0xEE, 0x61, 0xD7, + 0xC0, 0xE9, 0xD1, 0xD8, 0xA7, 0xE7, 0xDC, 0xE5, 0x9B, 0xE0, 0x56, 0xEA, + 0x4A, 0xE7, 0x86, 0xF2, 0x83, 0xEA, 0xCF, 0xEA, 0x81, 0xE9, 0x48, 0xE0, + 0x6C, 0xEB, 0x5D, 0xE6, 0xC7, 0xE6, 0xCA, 0xEE, 0xCF, 0xD8, 0x19, 0xEC, + 0x0E, 0xD6, 0xEB, 0xE7, 0x5F, 0xD6, 0x30, 0xE4, 0x0A, 0xD0, 0x03, 0xE4, + 0x58, 0xD6, 0x39, 0xF0, 0xD5, 0xDE, 0x8E, 0xF2, 0x0F, 0xE9, 0xD1, 0xE5, + 0xA6, 0xF2, 0xFB, 0xD8, 0x8E, 0xE6, 0x64, 0xD4, 0xAE, 0xE0, 0xAD, 0xE1, + 0xE0, 0xE9, 0x16, 0xED, 0x6E, 0xE3, 0x31, 0xE4, 0x47, 0xE3, 0x30, 0xE3, + 0x69, 0xDF, 0x73, 0xDA, 0xE3, 0xDA, 0xD8, 0xCD, 0x52, 0xED, 0x02, 0xDA, + 0x39, 0xF9, 0x6D, 0xDF, 0x2E, 0xF6, 0x97, 0xD6, 0x75, 0xEF, 0xB2, 0xD6, + 0x2B, 0xE9, 0x9B, 0xE3, 0x87, 0xD9, 0xBE, 0xE9, 0xE7, 0xD9, 0x80, 0xF2, + 0xF2, 0xE5, 0xF8, 0x04, 0x55, 0xDC, 0x0B, 0x04, 0x0D, 0xE0, 0x88, 0xFD, + 0xA7, 0xED, 0xFF, 0xFD, 0x18, 0xF2, 0xB5, 0xF6, 0x51, 0xF3, 0x60, 0xF1, + 0x3C, 0xF6, 0x3C, 0xFD, 0xD8, 0x01, 0xCF, 0x10, 0x86, 0xFD, 0xDD, 0x09, + 0xDE, 0x03, 0x53, 0x01, 0x56, 0x13, 0x0A, 0x01, 0x7B, 0x06, 0xAC, 0xFA, + 0xBD, 0xF2, 0xCD, 0xF8, 0x3C, 0xEC, 0x22, 0xEF, 0xFB, 0xE8, 0xBB, 0xEE, + 0x73, 0xED, 0xC7, 0xF1, 0xF1, 0xF5, 0x50, 0xED, 0x4B, 0xFF, 0x65, 0xF0, + 0x60, 0xF5, 0xAC, 0xDD, 0xCF, 0xE8, 0x85, 0xCE, 0xEB, 0x02, 0x00, 0xDF, + 0x50, 0x0B, 0x09, 0xE0, 0x1F, 0xF9, 0x6A, 0xD9, 0x47, 0xF1, 0xE2, 0xEF, + 0x78, 0xEC, 0xCC, 0xF9, 0x2B, 0xE2, 0x34, 0xE9, 0xED, 0xF0, 0xBB, 0xF1, + 0x1C, 0xFA, 0x54, 0xF4, 0x76, 0xE3, 0x7B, 0xEB, 0x42, 0xED, 0x59, 0xF2, + 0x3C, 0x07, 0x02, 0xF2, 0x1F, 0x06, 0x32, 0xEC, 0x04, 0x02, 0x9E, 0xEB, + 0x05, 0x06, 0x61, 0xFD, 0x03, 0x02, 0x6B, 0x0F, 0xD1, 0xF8, 0xBA, 0x03, + 0x3A, 0xF9, 0x33, 0xF3, 0x02, 0xFC, 0xE9, 0xF5, 0x5A, 0xFA, 0x93, 0x00, + 0x7E, 0xF2, 0x53, 0x03, 0x50, 0xF5, 0x63, 0x07, 0xC4, 0xF5, 0x25, 0x0C, + 0x3B, 0xEB, 0xC5, 0x08, 0x52, 0x02, 0x17, 0x0D, 0x2E, 0x0D, 0x4C, 0x02, + 0x91, 0x04, 0xE8, 0xFF, 0x3E, 0x14, 0x24, 0x17, 0x0E, 0x13, 0x2E, 0x0D, + 0xD6, 0x17, 0x15, 0x08, 0xEE, 0x1D, 0x89, 0x1D, 0x06, 0x05, 0x46, 0x1E, + 0x32, 0xF2, 0x6C, 0x17, 0x71, 0xFE, 0x55, 0x1B, 0x11, 0x0B, 0x39, 0x11, + 0xF8, 0xFD, 0x8F, 0xFF, 0x1A, 0xFF, 0x8F, 0x00, 0xAF, 0x0C, 0xA3, 0x06, + 0x9D, 0x06, 0xCD, 0xFF, 0x59, 0xFA, 0x9B, 0xFC, 0x57, 0xFB, 0x71, 0x0C, + 0x7A, 0xF2, 0xFF, 0x0E, 0x0F, 0xE7, 0x5B, 0xFF, 0x80, 0xF4, 0xBE, 0xF1, + 0x7F, 0xFF, 0x1A, 0xE1, 0x31, 0xEA, 0x5F, 0xCC, 0x3C, 0xE8, 0xE1, 0xD7, + 0x6F, 0xF5, 0x70, 0xED, 0x95, 0xE3, 0x01, 0xDC, 0x2F, 0xE4, 0x70, 0xD3, + 0x13, 0xFC, 0xB4, 0xDC, 0xA4, 0xFB, 0xF0, 0xD3, 0x2E, 0xF3, 0x17, 0xD8, + 0x3C, 0xF9, 0xE1, 0xF1, 0x9B, 0xEC, 0x83, 0xF3, 0xB2, 0xEB, 0x2B, 0xEB, + 0x68, 0x04, 0xC9, 0xF5, 0x66, 0x17, 0x09, 0xFE, 0xCE, 0x19, 0x7D, 0xFF, + 0xE7, 0x15, 0x49, 0x0C, 0x97, 0x17, 0xDC, 0x09, 0x5F, 0x18, 0xB2, 0xFA, + 0xFD, 0x22, 0xF4, 0xFF, 0x9A, 0x25, 0x32, 0x0B, 0x4D, 0x18, 0x9B, 0x13, + 0xBC, 0x08, 0xCB, 0x15, 0x99, 0x07, 0x64, 0x14, 0x00, 0x1B, 0xA5, 0x16, + 0x8A, 0x16, 0x75, 0x06, 0x8A, 0x0A, 0xFC, 0xF7, 0x34, 0x15, 0x61, 0x04, + 0xD7, 0x07, 0xED, 0x02, 0x44, 0xEF, 0xA0, 0xF3, 0x1B, 0xF1, 0xE0, 0xFC, + 0x5D, 0xEC, 0xD0, 0x03, 0x75, 0xD8, 0xD8, 0xF5, 0x7E, 0xD9, 0x91, 0xF3, + 0x91, 0xE7, 0xCB, 0xF9, 0xD5, 0xE8, 0xB1, 0xF6, 0xF9, 0xEB, 0x5D, 0xF7, + 0xAA, 0xED, 0x9A, 0xF8, 0xC5, 0xE5, 0x33, 0xF6, 0xF6, 0xDD, 0x7C, 0xF4, + 0x64, 0xE2, 0xDF, 0xFB, 0x9E, 0xEC, 0x21, 0x10, 0x52, 0xF4, 0x6C, 0x0F, + 0xEE, 0xFC, 0x75, 0xFB, 0x40, 0x00, 0xB6, 0xEF, 0x94, 0x09, 0x15, 0xFB, + 0x5D, 0x0F, 0x46, 0x09, 0xE3, 0x10, 0xC8, 0x0C, 0xD0, 0x0D, 0xF5, 0x12, + 0x39, 0xFF, 0x7C, 0x0F, 0x79, 0x0C, 0x4D, 0x14, 0x9C, 0x25, 0xEC, 0x1A, + 0x0D, 0x29, 0xBB, 0x0E, 0xFE, 0x2C, 0x93, 0x0E, 0xE3, 0x2A, 0xE5, 0x16, + 0x97, 0x27, 0x83, 0x20, 0xF1, 0x28, 0xE8, 0x29, 0x54, 0x1F, 0x88, 0x26, + 0x24, 0x1C, 0x4A, 0x21, 0x31, 0x21, 0xA0, 0x1A, 0x39, 0x11, 0xE5, 0x0B, + 0x06, 0x04, 0x21, 0x07, 0x61, 0x0B, 0xC0, 0x0B, 0xA4, 0x0A, 0xAD, 0x0C, + 0x01, 0xFD, 0x9A, 0x0B, 0x25, 0xFB, 0x24, 0x12, 0x10, 0x01, 0x4D, 0x1B, + 0x67, 0xFC, 0xE8, 0x18, 0x2C, 0x08, 0x33, 0x19, 0x36, 0x1F, 0x88, 0x1A, + 0x68, 0x16, 0x7B, 0x08, 0x51, 0x11, 0xEC, 0x05, 0xC2, 0x1A, 0x9E, 0x16, + 0x05, 0x10, 0xB7, 0x14, 0xFB, 0x07, 0x89, 0x10, 0x0E, 0x0F, 0x5C, 0x15, + 0xBA, 0x20, 0xF9, 0x12, 0x36, 0x2F, 0xBC, 0x0A, 0xD0, 0x30, 0x84, 0x06, + 0x32, 0x2F, 0x05, 0x0B, 0xAB, 0x26, 0xB2, 0x0E, 0x8D, 0x24, 0x98, 0x17, + 0x65, 0x2C, 0xB1, 0x2E, 0xC7, 0x1B, 0x72, 0x2A, 0xEF, 0x0B, 0x38, 0x1E, + 0x95, 0x14, 0x5F, 0x27, 0x5A, 0x1E, 0x31, 0x22, 0x9A, 0x21, 0x4C, 0x17, + 0xFC, 0x29, 0xFD, 0x2A, 0x23, 0x2E, 0x0D, 0x3E, 0xD6, 0x16, 0xFA, 0x2B, + 0xBC, 0x11, 0x55, 0x28, 0x58, 0x20, 0x11, 0x32, 0xEC, 0x22, 0x4A, 0x22, + 0x56, 0x29, 0xB5, 0x11, 0xA4, 0x30, 0xFF, 0x0E, 0xEA, 0x1C, 0x74, 0x05, + 0x1C, 0xFE, 0xAC, 0x05, 0xB5, 0xF6, 0x50, 0x1D, 0x07, 0xEF, 0x47, 0x25, + 0x18, 0xEF, 0x9C, 0x15, 0xD6, 0x02, 0xF6, 0xFF, 0x13, 0x0E, 0xEB, 0xFA, + 0xD4, 0x0B, 0x95, 0xFD, 0x38, 0x0A, 0x51, 0xF7, 0xC2, 0x11, 0xD1, 0x00, + 0x0D, 0x13, 0xCC, 0x0F, 0x2E, 0x04, 0xA8, 0x0F, 0x82, 0x03, 0xD5, 0x0F, + 0x14, 0x01, 0x8A, 0x0A, 0x5B, 0xF5, 0xB2, 0x03, 0xAF, 0xEF, 0x39, 0x05, + 0x71, 0xEF, 0xF3, 0x0C, 0xCF, 0xF0, 0xBB, 0x0B, 0x30, 0xF2, 0x6F, 0xFD, + 0x86, 0x03, 0x56, 0xFC, 0x99, 0x01, 0xB5, 0xFE, 0x87, 0xEF, 0x1E, 0xFE, + 0xCE, 0xEC, 0x8B, 0x00, 0xC0, 0xF9, 0xC9, 0x04, 0x14, 0x00, 0x8E, 0xFE, + 0x3D, 0xF3, 0xB1, 0xF4, 0xD4, 0xF2, 0x53, 0x05, 0x66, 0xEA, 0x27, 0x06, + 0x4B, 0xDD, 0xD5, 0xF5, 0x74, 0xF5, 0x45, 0x00, 0x29, 0x06, 0xDF, 0xFA, + 0x0E, 0x03, 0xAE, 0xE6, 0xD3, 0x1A, 0xD5, 0xF0, 0x75, 0x24, 0x9A, 0xF8, + 0xCE, 0x11, 0x62, 0xFB, 0xA3, 0x13, 0xD6, 0x0B, 0x7F, 0x1A, 0x0F, 0x06, + 0xB3, 0x13, 0x4F, 0xFD, 0x63, 0x07, 0x7F, 0x04, 0x05, 0x01, 0xED, 0x01, + 0x83, 0xFF, 0x5F, 0xFC, 0x0C, 0x00, 0x99, 0xFF, 0xBC, 0x0A, 0xE9, 0xF7, + 0xF6, 0x0F, 0xA8, 0xE6, 0x57, 0x0C, 0x69, 0xEA, 0xE5, 0xFC, 0x17, 0xF3, + 0xCE, 0xE5, 0x2D, 0xF4, 0x47, 0xE1, 0x15, 0x04, 0x77, 0xDC, 0x29, 0x05, + 0x46, 0xDD, 0xD9, 0xF9, 0x6F, 0xE6, 0x47, 0xFC, 0x06, 0xE8, 0xC2, 0xF4, + 0x45, 0xF1, 0x5D, 0xED, 0x30, 0xEF, 0xBF, 0xE8, 0x62, 0xF1, 0x65, 0xEB, + 0xE2, 0xF4, 0xAA, 0xF0, 0x55, 0xD9, 0x99, 0xDC, 0x83, 0xDA, 0x94, 0xE3, + 0x1B, 0xF1, 0xB7, 0xF4, 0xB4, 0xF7, 0x0E, 0xEE, 0xB4, 0x03, 0xD9, 0xFA, + 0x35, 0x09, 0x96, 0x07, 0xEF, 0xFA, 0xD8, 0x06, 0xE6, 0xF4, 0x57, 0x11, + 0xD5, 0x03, 0xE9, 0x1C, 0x7F, 0x06, 0x22, 0x0E, 0xA7, 0xFC, 0x0D, 0x02, + 0x4C, 0xFD, 0x50, 0x05, 0x54, 0x08, 0x9A, 0xFD, 0xEF, 0x13, 0xB9, 0xFC, + 0xF9, 0x12, 0x9A, 0x05, 0x1B, 0x11, 0xBE, 0x0D, 0xF3, 0x08, 0x75, 0x12, + 0x04, 0xF7, 0x87, 0x11, 0xB0, 0xF4, 0x34, 0x0F, 0xED, 0xFE, 0x50, 0x0C, + 0xD5, 0x03, 0x9E, 0x05, 0x09, 0x05, 0x5D, 0xFE, 0xFD, 0x0A, 0xFE, 0x02, + 0xE0, 0xF6, 0xE2, 0xF7, 0xC8, 0xEA, 0x7B, 0xEF, 0x3D, 0xF4, 0x1E, 0xF6, + 0xB7, 0xE7, 0x39, 0xEB, 0x75, 0xDB, 0xBA, 0xE5, 0x11, 0xEC, 0xBF, 0xEF, + 0x92, 0x09, 0x4E, 0xF6, 0x9E, 0x0E, 0xCD, 0xF4, 0x2E, 0xFD, 0x37, 0xF1, + 0x12, 0xE9, 0x09, 0xF6, 0x29, 0xD6, 0x9B, 0x00, 0xE7, 0xDC, 0xA6, 0x05, + 0x4F, 0xF1, 0x0C, 0xF7, 0xDB, 0xFD, 0x78, 0xEB, 0x70, 0x10, 0x06, 0xED, + 0x8E, 0x11, 0x96, 0xF1, 0xCF, 0xFE, 0xB8, 0xFD, 0x7A, 0xF1, 0x9D, 0x03, + 0xE3, 0xF9, 0xF4, 0x08, 0x29, 0x0D, 0x9E, 0x0C, 0x88, 0x1A, 0xDE, 0x0E, + 0x23, 0x20, 0x36, 0x19, 0x25, 0x16, 0xCF, 0x1E, 0x4B, 0x12, 0xCA, 0x12, + 0x37, 0x1A, 0x2C, 0x09, 0xA3, 0x15, 0xDD, 0x0B, 0x13, 0x0D, 0xC8, 0x0E, + 0x05, 0x0D, 0xC6, 0x1A, 0xAF, 0x03, 0xB7, 0x19, 0x07, 0x04, 0x4A, 0x01, + 0x43, 0x15, 0xA0, 0xF0, 0x55, 0x11, 0x69, 0xEE, 0xBD, 0x04, 0xA1, 0xF8, + 0x0D, 0x0C, 0x41, 0xFF, 0xC6, 0x10, 0x13, 0xFA, 0x3C, 0x04, 0x01, 0xFB, + 0xF6, 0xF9, 0x3D, 0xFF, 0x6D, 0xF4, 0x0D, 0x04, 0x86, 0xE3, 0x70, 0xFD, + 0xA5, 0xE7, 0x10, 0xF1, 0x41, 0xF6, 0xAB, 0xE6, 0xF5, 0xE9, 0x75, 0xEA, + 0xD8, 0xD5, 0xEA, 0xF3, 0x23, 0xD3, 0x43, 0xEC, 0xCB, 0xEE, 0x02, 0xF0, + 0x1F, 0x0A, 0x9E, 0xF8, 0x4B, 0xFF, 0xC6, 0xF2, 0xD6, 0xE9, 0x0E, 0xF4, + 0x3E, 0xEA, 0x3D, 0xF3, 0x4E, 0xF0, 0x19, 0xE7, 0x74, 0xF8, 0x5C, 0xEA, + 0x79, 0xFA, 0xCF, 0xF2, 0x7A, 0xF9, 0x10, 0xFD, 0x37, 0xFB, 0x48, 0x07, + 0x68, 0x06, 0xA9, 0x05, 0xDE, 0x13, 0x61, 0xFE, 0x75, 0x0C, 0x89, 0x07, + 0x36, 0x03, 0x90, 0x1D, 0x56, 0x0D, 0x34, 0x26, 0x66, 0x18, 0x17, 0x24, + 0xA9, 0x13, 0x8D, 0x17, 0xED, 0x0F, 0x35, 0x0E, 0xC9, 0x0C, 0x77, 0x0C, + 0xDE, 0x03, 0xD8, 0x02, 0xEB, 0xFF, 0xB9, 0xF8, 0xD7, 0x01, 0xF2, 0xF7, + 0x31, 0x03, 0xF3, 0xF6, 0x82, 0x08, 0x97, 0xF9, 0x3F, 0x00, 0x9C, 0xFB, + 0x90, 0xE2, 0xEB, 0xFD, 0xEC, 0xD3, 0xA8, 0x05, 0x09, 0xE6, 0x8F, 0x04, + 0xF8, 0xFE, 0x2B, 0x04, 0x4E, 0x04, 0x4D, 0x04, 0xAF, 0x02, 0x7B, 0x09, + 0x3B, 0x09, 0xE2, 0x10, 0x1F, 0x08, 0x98, 0x0A, 0x69, 0x04, 0x8F, 0x00, + 0x63, 0x0B, 0x01, 0xFF, 0x2E, 0x0A, 0x2E, 0x05, 0xA3, 0x07, 0x1E, 0x01, + 0x6C, 0x11, 0x93, 0xF8, 0x8C, 0x14, 0xF8, 0xF5, 0x26, 0xFB, 0xCE, 0xF2, + 0xC4, 0xF0, 0xEB, 0xFF, 0xAA, 0x04, 0xB9, 0x06, 0x5B, 0x0B, 0xDC, 0xF3, + 0x8F, 0x0D, 0x1F, 0xE6, 0xBC, 0x0A, 0x95, 0xE9, 0x0A, 0x00, 0x3D, 0xF6, + 0x49, 0xEF, 0x33, 0xFC, 0x52, 0xE5, 0x6B, 0xF5, 0xDE, 0xED, 0x9C, 0xEC, + 0x8C, 0xF9, 0x4F, 0xF1, 0xE9, 0x0B, 0xEE, 0xF6, 0x61, 0x08, 0xF0, 0xF3, + 0xC5, 0xE7, 0x94, 0xF5, 0x4F, 0xE2, 0xF8, 0xF7, 0xDE, 0xF4, 0x49, 0xF1, + 0xC7, 0xFB, 0x9E, 0xF4, 0xF1, 0xF6, 0x2F, 0x0C, 0x44, 0xFE, 0xC6, 0x1C, + 0x87, 0x16, 0x22, 0x21, 0x80, 0x1D, 0x41, 0x1C, 0xD2, 0x13, 0x0F, 0x10, + 0x70, 0x0D, 0x5B, 0x0E, 0xBC, 0x07, 0xE4, 0x10, 0x78, 0x06, 0x06, 0x10, + 0x76, 0x0B, 0x53, 0x0F, 0x04, 0x09, 0x05, 0x0C, 0x6B, 0xF7, 0x92, 0x06, + 0x56, 0xF8, 0x26, 0x06, 0x33, 0x0A, 0xE0, 0x05, 0x48, 0xF8, 0xA2, 0xFD, + 0xD4, 0xED, 0x2B, 0xF7, 0x2C, 0x0C, 0x37, 0xF5, 0xD6, 0x11, 0x6B, 0xF3, + 0xF3, 0x02, 0x10, 0xEC, 0x81, 0x00, 0x03, 0xEA, 0xC0, 0xFB, 0x15, 0xF7, + 0xED, 0xF2, 0x80, 0x00, 0xF5, 0xEC, 0x17, 0xFB, 0x59, 0xEE, 0x57, 0xEC, + 0x1B, 0xEC, 0x37, 0xDD, 0xDB, 0xEB, 0x23, 0xDB, 0xF1, 0xF1, 0xAD, 0xE2, + 0x93, 0xF5, 0x92, 0xF4, 0x3C, 0xEE, 0xBF, 0x05, 0x88, 0xEC, 0xA9, 0x07, + 0xEC, 0xFA, 0x19, 0xFB, 0xF5, 0xFF, 0x2C, 0xEF, 0x16, 0xF2, 0x93, 0xE8, + 0x27, 0xEB, 0x3A, 0xE4, 0xBC, 0xFA, 0xBA, 0xF4, 0x7B, 0xFE, 0xCE, 0xFF, + 0x34, 0xF1, 0x87, 0xF8, 0x49, 0xF1, 0xB7, 0xF8, 0x13, 0xFD, 0x10, 0x00, + 0xC3, 0xFE, 0xF7, 0xFB, 0xF2, 0x07, 0x43, 0xF6, 0x26, 0x19, 0x34, 0x02, + 0x29, 0x0B, 0x26, 0x0A, 0xDF, 0xF8, 0x04, 0x04, 0x94, 0xFE, 0xF2, 0xF7, + 0xAE, 0xF3, 0x38, 0xEE, 0xF7, 0xE9, 0xA4, 0xF5, 0x66, 0xFA, 0xE6, 0xF6, + 0x52, 0x04, 0x34, 0xEC, 0x11, 0xFE, 0xAF, 0xE9, 0xC8, 0xF2, 0x52, 0xE6, + 0x2B, 0xEF, 0x83, 0xE2, 0xD1, 0xE8, 0xEE, 0xE8, 0x8F, 0xE0, 0x17, 0xFB, + 0x01, 0xE9, 0x3B, 0x00, 0x2B, 0xED, 0xD8, 0xFD, 0xB3, 0xED, 0xD6, 0xFF, + 0xBC, 0xF0, 0x5A, 0xEF, 0x8D, 0xE6, 0x04, 0xEB, 0x1A, 0xDB, 0xE5, 0xF3, + 0x98, 0xE7, 0x74, 0xEC, 0x81, 0x00, 0xC0, 0xE3, 0x25, 0x03, 0x9F, 0xDE, + 0x04, 0xF4, 0x5D, 0xDF, 0xA5, 0xE6, 0x7F, 0xE4, 0xAC, 0xDD, 0xC2, 0xE6, + 0xCA, 0xE7, 0xB3, 0xE9, 0x07, 0xF8, 0x39, 0xE0, 0x6B, 0xF8, 0x82, 0xD5, + 0x39, 0xFB, 0x26, 0xDA, 0x53, 0xFC, 0xE4, 0xDF, 0x7C, 0xF5, 0xB7, 0xE8, + 0x9A, 0xEF, 0x5F, 0xF8, 0x55, 0xF6, 0x95, 0xFE, 0x58, 0x0A, 0x2B, 0xF9, + 0x97, 0x0B, 0x42, 0xFB, 0xC0, 0xF4, 0x61, 0x00, 0xBE, 0xF1, 0xDC, 0xFF, + 0x06, 0x00, 0xA5, 0xFD, 0xEE, 0xF9, 0xCA, 0xFD, 0x5D, 0xF3, 0x6A, 0x04, + 0x9F, 0xFD, 0x0A, 0x15, 0x34, 0xFF, 0xB4, 0x20, 0xC1, 0xFD, 0x1D, 0x20, + 0xD0, 0x09, 0xE2, 0x19, 0xA6, 0x09, 0x38, 0x11, 0x4C, 0xFE, 0x6A, 0x0D, + 0x9D, 0x00, 0xBF, 0x05, 0x02, 0x04, 0x10, 0x01, 0xC6, 0x05, 0xA2, 0x0D, + 0xCB, 0xF7, 0x35, 0x11, 0x7C, 0xE4, 0x35, 0x11, 0x15, 0xEA, 0x74, 0x14, + 0xB2, 0xF2, 0x12, 0xFB, 0x60, 0xFC, 0x6E, 0xE1, 0x28, 0x0D, 0x7E, 0xED, + 0x34, 0x07, 0xE8, 0xFC, 0x74, 0xFB, 0x5F, 0xF8, 0xDD, 0x03, 0xA1, 0xF0, + 0x4B, 0x10, 0x98, 0xF2, 0x71, 0x13, 0x9D, 0xF6, 0x43, 0x0A, 0x92, 0xFA, + 0x01, 0xEF, 0xDB, 0x02, 0x12, 0xDC, 0x1A, 0x01, 0xE1, 0xEE, 0xCA, 0x00, + 0x92, 0x09, 0xBB, 0x07, 0x38, 0x1A, 0xBB, 0x09, 0x9D, 0x1D, 0x69, 0x0E, + 0x76, 0x0E, 0x7E, 0x12, 0xD4, 0x06, 0x82, 0x14, 0x5C, 0x11, 0x95, 0x0D, + 0x53, 0x1B, 0x0E, 0x00, 0x31, 0x25, 0x6E, 0x02, 0xCE, 0x20, 0x2E, 0x09, + 0xEA, 0x0B, 0x90, 0x08, 0xF1, 0x09, 0x5A, 0x13, 0xB5, 0x11, 0x38, 0x25, + 0xF6, 0x1E, 0xA2, 0x2B, 0xE2, 0x29, 0x74, 0x20, 0xF5, 0x22, 0x10, 0x15, + 0x56, 0x25, 0x15, 0x17, 0x80, 0x2F, 0x21, 0x1E, 0x15, 0x34, 0x84, 0x2A, + 0x67, 0x2D, 0xF9, 0x2C, 0x9F, 0x18, 0x59, 0x23, 0xD0, 0x12, 0xC6, 0x20, + 0x88, 0x20, 0x24, 0x19, 0xC9, 0x24, 0x51, 0x0F, 0x6D, 0x18, 0xCA, 0x12, + 0x21, 0x02, 0xB9, 0x1A, 0x19, 0xF0, 0xC4, 0x1C, 0xE6, 0xEE, 0x0C, 0x14, + 0x52, 0x02, 0xBC, 0x06, 0x74, 0x0A, 0xB0, 0xFB, 0xE1, 0xF1, 0x35, 0xF9, + 0x48, 0xDE, 0xB6, 0xFA, 0xF8, 0xE0, 0xEC, 0xF9, 0xD8, 0xEF, 0xA7, 0xF7, + 0xE2, 0xF6, 0xED, 0xF0, 0x65, 0xF2, 0x74, 0xF3, 0x2A, 0xF2, 0xC8, 0x03, + 0x17, 0xF6, 0xD3, 0x0A, 0xAE, 0xF9, 0x94, 0xFF, 0x08, 0xF9, 0xE3, 0xF5, + 0xE3, 0xF4, 0x47, 0xF2, 0x8D, 0xED, 0x71, 0xEC, 0x6D, 0xE6, 0x1C, 0xEF, + 0x25, 0xE8, 0xB9, 0xF4, 0x47, 0xFD, 0xCD, 0xEB, 0x1C, 0x18, 0xD7, 0xDF, + 0xB1, 0x1F, 0xBD, 0xE9, 0xD1, 0x15, 0xCF, 0xFE, 0xCB, 0x06, 0x79, 0xFF, + 0x6E, 0xFE, 0x85, 0xF5, 0x52, 0x02, 0x2A, 0xF5, 0xE1, 0x01, 0x35, 0xF6, + 0x34, 0xEF, 0x17, 0xF7, 0x47, 0xDB, 0xE7, 0xF2, 0x7C, 0xDE, 0x54, 0xEA, + 0x12, 0xEE, 0xCE, 0xE6, 0xBB, 0xF1, 0x4B, 0xE4, 0x7B, 0xEA, 0x91, 0xE2, + 0xD7, 0xE5, 0x98, 0xE7, 0x36, 0xEC, 0x40, 0xF8, 0x31, 0xEE, 0xA6, 0x0B, + 0xAB, 0xE6, 0xBB, 0x0F, 0x00, 0xE9, 0x64, 0x03, 0x09, 0xEB, 0x7B, 0xF6, + 0x48, 0xE7, 0x0D, 0xEE, 0x36, 0xED, 0x8F, 0xE4, 0x1B, 0xF5, 0x0C, 0xE3, + 0xBC, 0xEF, 0xE2, 0xE1, 0xB4, 0xE6, 0x71, 0xD5, 0xC3, 0xEB, 0xD3, 0xD6, + 0xF5, 0xEB, 0x6B, 0xE0, 0x19, 0xE7, 0x0B, 0xE4, 0x8C, 0xE8, 0xB1, 0xEE, + 0xBA, 0xE5, 0x64, 0xFF, 0x05, 0xE9, 0xF2, 0x02, 0x7D, 0xF8, 0xC0, 0xFE, + 0x05, 0x06, 0x47, 0xFD, 0xB2, 0x06, 0xD2, 0xF6, 0xD6, 0x01, 0x29, 0xFB, + 0x90, 0xFD, 0x01, 0x06, 0x89, 0xF7, 0xC5, 0x01, 0x64, 0x01, 0xE2, 0xFB, + 0xCD, 0x12, 0x71, 0xF8, 0x64, 0x13, 0x3D, 0xF7, 0x0D, 0x0C, 0xA9, 0x04, + 0x18, 0x01, 0x7B, 0x0E, 0xDA, 0xFC, 0x0A, 0x0F, 0xA1, 0xFE, 0xD9, 0x17, + 0x8D, 0xF4, 0x17, 0x15, 0x28, 0xF5, 0x55, 0x02, 0x36, 0x04, 0xD9, 0xFC, + 0x42, 0x05, 0xC6, 0xFD, 0x98, 0x01, 0x09, 0xF8, 0x03, 0x01, 0x4F, 0xF3, + 0x47, 0xF4, 0x95, 0xEF, 0x71, 0xEC, 0x1B, 0xF9, 0x33, 0xF3, 0x12, 0x08, + 0x76, 0xF5, 0xA9, 0x09, 0xA5, 0x01, 0x86, 0x0A, 0x68, 0x0F, 0x08, 0x08, + 0x18, 0x07, 0x0D, 0x08, 0xC0, 0xFF, 0xC1, 0x11, 0x7B, 0xFF, 0x05, 0x0F, + 0x3D, 0x05, 0xB0, 0x05, 0x0A, 0x0F, 0xB5, 0x0B, 0xBD, 0x08, 0xCC, 0x14, + 0xC0, 0x03, 0xC8, 0x1B, 0xD3, 0x0F, 0xC0, 0x27, 0x99, 0x16, 0xD4, 0x24, + 0x8B, 0x14, 0x2A, 0x15, 0xA7, 0x18, 0xB3, 0x1C, 0xED, 0x1D, 0xBF, 0x32, + 0x83, 0x18, 0xDC, 0x3F, 0x9F, 0x1F, 0x82, 0x43, 0x78, 0x2E, 0xA0, 0x3F, + 0x6A, 0x36, 0x09, 0x44, 0xA5, 0x41, 0xB0, 0x41, 0x14, 0x47, 0x62, 0x36, + 0xE9, 0x47, 0x0E, 0x38, 0x1E, 0x45, 0xC0, 0x34, 0xF3, 0x39, 0x5A, 0x32, + 0x2B, 0x2A, 0x33, 0x41, 0x7F, 0x21, 0x20, 0x47, 0x7D, 0x2A, 0xBB, 0x30, + 0x09, 0x45, 0xFD, 0x19, 0x40, 0x51, 0x76, 0x11, 0xB4, 0x48, 0x78, 0x11, + 0x6A, 0x3B, 0xF4, 0x1C, 0xBF, 0x29, 0x68, 0x26, 0x7A, 0x2D, 0x58, 0x28, + 0xDE, 0x3C, 0x9D, 0x21, 0x3B, 0x34, 0x53, 0x17, 0xEC, 0x29, 0x10, 0x1A, + 0x24, 0x31, 0x81, 0x1B, 0xC8, 0x27, 0xEB, 0x14, 0xCB, 0x13, 0xD0, 0x07, + 0x25, 0x16, 0x42, 0xFA, 0x08, 0x1C, 0xF9, 0xFB, 0xB3, 0x19, 0xDD, 0x01, + 0x99, 0x13, 0x9C, 0x02, 0xE8, 0x08, 0x32, 0x08, 0x8E, 0x02, 0x3B, 0x1C, + 0xCE, 0xFA, 0x08, 0x1E, 0x3E, 0xF7, 0x9F, 0x07, 0xBE, 0xF9, 0x51, 0x03, + 0x2B, 0xF4, 0x7D, 0x09, 0x4C, 0xEB, 0x21, 0x0D, 0x7D, 0xE8, 0xAB, 0x0E, + 0xB7, 0xE9, 0x06, 0x0D, 0x96, 0xE8, 0x67, 0x07, 0xE8, 0xF3, 0x1B, 0xF8, + 0xA4, 0x03, 0x31, 0xF5, 0xE3, 0xFB, 0x3C, 0x03, 0xCF, 0xEB, 0x43, 0x05, + 0x81, 0xEC, 0xA4, 0xF4, 0x9D, 0xF2, 0x54, 0xEA, 0xE7, 0xF2, 0xB0, 0xED, + 0xD2, 0xF4, 0x8B, 0xEE, 0x67, 0xF2, 0x82, 0xF2, 0x7E, 0xEE, 0x4F, 0xF3, + 0x0C, 0xF4, 0xC5, 0xE9, 0x10, 0xF2, 0x1C, 0xE6, 0x2F, 0xEB, 0xD7, 0xE6, + 0x48, 0xF2, 0x7A, 0xE7, 0x1B, 0x04, 0xD1, 0xF0, 0xF4, 0x0A, 0x6B, 0xF7, + 0xA1, 0xFE, 0x6D, 0xF6, 0x0A, 0xF5, 0x71, 0xF9, 0x2C, 0xF8, 0x8D, 0xF5, + 0x70, 0xF5, 0xEB, 0xDF, 0xFE, 0xE7, 0xEB, 0xC8, 0xBA, 0xE2, 0x4A, 0xC4, + 0x37, 0xD9, 0xA0, 0xC9, 0x59, 0xCB, 0x12, 0xCF, 0x40, 0xCF, 0xF4, 0xD8, + 0x6C, 0xD0, 0xF5, 0xDA, 0xAC, 0xCA, 0x74, 0xD8, 0xF6, 0xDF, 0x4E, 0xE6, + 0x53, 0xFA, 0x22, 0xF4, 0xF2, 0xFC, 0x8D, 0xF4, 0xB7, 0xF7, 0xC3, 0xF0, + 0x65, 0xF7, 0x1F, 0xF7, 0x5A, 0xF8, 0x3A, 0x03, 0xFD, 0xF3, 0x11, 0x04, + 0x2D, 0xF6, 0xC9, 0xFF, 0x47, 0xFF, 0x74, 0x03, 0x2F, 0x09, 0xE5, 0x05, + 0x7F, 0x16, 0x5E, 0x00, 0x46, 0x16, 0x12, 0x04, 0x74, 0x08, 0xE7, 0x0C, + 0x28, 0x09, 0xBE, 0x0F, 0xDC, 0x16, 0xDB, 0x14, 0xF7, 0x18, 0xD6, 0x1F, + 0x29, 0x0C, 0x8E, 0x19, 0x14, 0x0E, 0x64, 0x0A, 0x64, 0x0C, 0xE1, 0x0E, + 0xAF, 0xFC, 0x34, 0x13, 0xDA, 0xF6, 0x87, 0x0F, 0xDD, 0xF7, 0x8C, 0x0E, + 0x89, 0x02, 0x3F, 0x06, 0xF9, 0x08, 0xFF, 0xFC, 0x3D, 0xFC, 0x20, 0xFF, + 0x2E, 0xE9, 0x99, 0x03, 0xD9, 0xE5, 0x1A, 0x06, 0x6E, 0xF0, 0x04, 0xFF, + 0x41, 0xFA, 0xB8, 0xF0, 0xD2, 0xEB, 0x77, 0xE2, 0x25, 0xCD, 0xBD, 0xD4, + 0xB0, 0xC5, 0x21, 0xD2, 0xDD, 0xD0, 0xCB, 0xD4, 0x3A, 0xD8, 0xA1, 0xCD, + 0x3B, 0xE8, 0xDD, 0xC9, 0xC2, 0xFC, 0xF8, 0xCD, 0xBF, 0xFE, 0x41, 0xD1, + 0xAA, 0xF8, 0xD4, 0xD5, 0x6C, 0xEF, 0x26, 0xD8, 0x63, 0xE3, 0xDB, 0xDC, + 0xCA, 0xDF, 0x9F, 0xE0, 0x9B, 0xE6, 0x84, 0xD7, 0x9D, 0xEE, 0x84, 0xD1, + 0x57, 0xF5, 0x62, 0xDC, 0xAA, 0xEC, 0xF7, 0xF1, 0x16, 0xDC, 0x95, 0x03, + 0x6F, 0xDA, 0x0D, 0x00, 0x8F, 0xE4, 0x96, 0xF6, 0x9F, 0xF5, 0x33, 0xF4, + 0x02, 0xFD, 0xB3, 0xF4, 0x38, 0xF3, 0x3A, 0xFD, 0xAF, 0xEC, 0xA2, 0x05, + 0x04, 0xF0, 0x24, 0x04, 0x33, 0xEF, 0x30, 0xF8, 0xF8, 0xEE, 0x14, 0xEF, + 0x3E, 0xED, 0xB2, 0xF6, 0x4D, 0xDC, 0x46, 0xFF, 0x10, 0xD4, 0xD7, 0xF8, + 0xDF, 0xE6, 0xF0, 0xF0, 0xA7, 0xFB, 0x27, 0xF2, 0xE1, 0x03, 0x06, 0xF7, + 0x2C, 0x05, 0xFF, 0xF7, 0x37, 0x04, 0x76, 0xF5, 0xD1, 0xFF, 0x66, 0xF5, + 0x07, 0xF7, 0xD6, 0xF5, 0x72, 0xFA, 0x89, 0xF8, 0xE4, 0xFE, 0x06, 0xF8, + 0xAD, 0xFA, 0x74, 0xF0, 0x9E, 0x02, 0x0C, 0xEE, 0x43, 0x0E, 0x5A, 0xFA, + 0x40, 0x16, 0xD5, 0x0E, 0xE3, 0x14, 0x12, 0x0A, 0x34, 0x0B, 0x73, 0xFA, + 0x99, 0x0E, 0xCA, 0xFA, 0xA4, 0x1D, 0x6E, 0xFC, 0x90, 0x25, 0x49, 0x05, + 0xC1, 0x20, 0xB0, 0x0F, 0xCF, 0x19, 0xA7, 0x0F, 0xFF, 0x1A, 0x50, 0x12, + 0xFF, 0x24, 0x3D, 0x1F, 0x31, 0x29, 0x18, 0x25, 0xB4, 0x22, 0x0A, 0x20, + 0xA9, 0x1B, 0x48, 0x1F, 0xD1, 0x20, 0xAF, 0x21, 0xC3, 0x2D, 0x7C, 0x20, + 0xF0, 0x37, 0xC5, 0x1A, 0x2C, 0x35, 0x47, 0x1C, 0x63, 0x23, 0x56, 0x21, + 0x90, 0x1C, 0xBE, 0x25, 0x37, 0x22, 0x25, 0x31, 0x5B, 0x1E, 0xE5, 0x33, + 0xE2, 0x15, 0x5D, 0x2E, 0x76, 0x1B, 0x9E, 0x26, 0x88, 0x1E, 0x3D, 0x20, + 0x98, 0x15, 0xBB, 0x1F, 0x65, 0x11, 0x2A, 0x1C, 0xB4, 0x0C, 0x42, 0x1D, + 0x72, 0x06, 0x41, 0x1B, 0xAB, 0xFE, 0x5F, 0x17, 0x03, 0xED, 0xBC, 0x1C, + 0x70, 0xE3, 0x91, 0x20, 0x88, 0xEE, 0xAE, 0x20, 0x86, 0xFF, 0x81, 0x18, + 0x21, 0x04, 0x82, 0x0F, 0x2F, 0xF9, 0x11, 0x09, 0x60, 0xF5, 0x0C, 0x06, + 0x1A, 0xF8, 0xA9, 0x06, 0x14, 0xF8, 0x6E, 0xFD, 0x63, 0xF7, 0x23, 0xEE, + 0x62, 0xF4, 0xC7, 0xE6, 0xDE, 0xF5, 0xED, 0xE5, 0xBA, 0xF5, 0x98, 0xDC, + 0xA1, 0xF5, 0x1D, 0xD5, 0xB9, 0xF2, 0x29, 0xD7, 0x18, 0xEA, 0x8C, 0xD6, + 0x2E, 0xEB, 0xFE, 0xD3, 0xFA, 0xEB, 0xB3, 0xD2, 0x37, 0xE5, 0x9B, 0xCD, + 0xCF, 0xDD, 0x3E, 0xC9, 0xA5, 0xDB, 0xBF, 0xC7, 0x1D, 0xDF, 0x6F, 0xBF, + 0xBB, 0xD8, 0xD9, 0xB5, 0xA2, 0xD8, 0x49, 0xAF, 0x06, 0xED, 0x8A, 0xB7, + 0xB8, 0xEA, 0xC2, 0xCC, 0x22, 0xD0, 0x9F, 0xDF, 0x77, 0xC9, 0xB9, 0xEA, + 0x4E, 0xD8, 0xA7, 0xE9, 0x27, 0xF0, 0xF5, 0xEC, 0xFD, 0x03, 0xE1, 0xF7, + 0x69, 0xFC, 0xF5, 0x04, 0xA5, 0xE9, 0x72, 0x0F, 0xF1, 0xEA, 0xF3, 0x0C, + 0x97, 0xFA, 0xF5, 0x06, 0xB0, 0x07, 0xE4, 0x03, 0x21, 0x05, 0x26, 0x04, + 0xCE, 0xF8, 0x5D, 0x07, 0xAC, 0xF8, 0xB3, 0x07, 0xBF, 0x07, 0xD7, 0x08, + 0x68, 0x11, 0x35, 0x0E, 0xBA, 0x0A, 0xB1, 0x14, 0x23, 0x02, 0x98, 0x16, + 0x0D, 0x00, 0xD1, 0x10, 0x6C, 0x05, 0xDE, 0x0C, 0xD2, 0x05, 0xB9, 0x0C, + 0xB9, 0xFF, 0x63, 0x0C, 0xC2, 0x04, 0x1F, 0x0E, 0x60, 0x0D, 0xF3, 0x14, + 0x4F, 0x12, 0x8A, 0x1A, 0xD1, 0x16, 0x0D, 0x16, 0x98, 0x1F, 0x74, 0x15, + 0x79, 0x20, 0x67, 0x1C, 0xD4, 0x12, 0xDD, 0x1C, 0x64, 0x10, 0x9B, 0x1C, + 0x91, 0x18, 0xF6, 0x21, 0xC5, 0x1E, 0x84, 0x1E, 0x11, 0x28, 0x6B, 0x0F, + 0x02, 0x26, 0x50, 0x0A, 0x29, 0x18, 0xFF, 0x13, 0x40, 0x1A, 0xBE, 0x16, + 0xE0, 0x22, 0x10, 0x08, 0x61, 0x21, 0x7F, 0x09, 0x3E, 0x1E, 0x01, 0x1B, + 0x83, 0x1F, 0x7D, 0x1D, 0x41, 0x27, 0xD0, 0x25, 0xC3, 0x30, 0x9E, 0x2C, + 0xE7, 0x2C, 0xC5, 0x1B, 0xAD, 0x1B, 0xCC, 0x10, 0xF0, 0x0C, 0x17, 0x14, + 0x3D, 0x04, 0xF2, 0x13, 0xD1, 0x05, 0xFC, 0x14, 0xC5, 0x05, 0xDD, 0x14, + 0xF8, 0x04, 0xE8, 0x0A, 0x4A, 0x0B, 0xFF, 0x08, 0x6A, 0xFC, 0xF5, 0x0B, + 0xD5, 0xEB, 0x65, 0xFF, 0x32, 0xEC, 0xB2, 0xF2, 0x41, 0xEE, 0xDA, 0xF7, + 0xAA, 0xEA, 0xA5, 0x01, 0xE1, 0xDE, 0xB8, 0x08, 0xB9, 0xDB, 0x09, 0x08, + 0xC9, 0xE2, 0x44, 0xFE, 0x48, 0xEA, 0x7C, 0xF1, 0x20, 0xF6, 0x82, 0xE0, + 0xDE, 0xFC, 0x1B, 0xE2, 0x88, 0xEC, 0x1C, 0xF3, 0x7A, 0xDD, 0x1B, 0xF1, + 0x87, 0xE1, 0x83, 0xE3, 0xE3, 0xED, 0x1F, 0xE0, 0x4B, 0xF8, 0xDD, 0xE4, + 0x9C, 0xF9, 0xF6, 0xE5, 0x1E, 0xF2, 0xF0, 0xE5, 0x9C, 0xE9, 0x88, 0xE5, + 0xB0, 0xF1, 0xAA, 0xDC, 0x6D, 0x02, 0xF4, 0xD7, 0x86, 0x09, 0x2E, 0xD8, + 0x36, 0x0B, 0xAE, 0xD5, 0x14, 0x13, 0x34, 0xE1, 0x7E, 0x17, 0xDC, 0xF6, + 0x61, 0x11, 0xFB, 0x01, 0xA9, 0x0E, 0x3C, 0xFF, 0x76, 0x0F, 0x4C, 0xFF, + 0x75, 0x0E, 0xF5, 0x00, 0xAE, 0x10, 0x5D, 0x01, 0x24, 0x11, 0x84, 0x0D, + 0x45, 0x09, 0xC3, 0x1B, 0xF4, 0x04, 0x11, 0x23, 0xE1, 0x0F, 0xF8, 0x26, + 0xAD, 0x1F, 0x0A, 0x2C, 0x04, 0x1D, 0x70, 0x2F, 0x43, 0x0F, 0xEA, 0x36, + 0xEF, 0x10, 0xF3, 0x43, 0x81, 0x16, 0x30, 0x43, 0x8D, 0x0F, 0xE9, 0x39, + 0x29, 0x12, 0x02, 0x36, 0x8F, 0x22, 0xC4, 0x3B, 0x42, 0x25, 0xF8, 0x41, + 0x0A, 0x18, 0x8C, 0x3A, 0x9F, 0x11, 0xD4, 0x2E, 0x8E, 0x18, 0x86, 0x27, + 0x36, 0x26, 0xD0, 0x22, 0xD0, 0x2D, 0x6B, 0x19, 0x76, 0x26, 0xB6, 0x10, + 0x43, 0x20, 0x78, 0x13, 0xC4, 0x1C, 0x7F, 0x18, 0xD9, 0x11, 0xF9, 0x20, + 0xFD, 0x01, 0x74, 0x1D, 0x3C, 0xFA, 0xEE, 0x08, 0x87, 0x02, 0x93, 0xFC, + 0x92, 0x13, 0xD7, 0xFA, 0xBA, 0x22, 0x91, 0xFF, 0xEA, 0x1D, 0xA3, 0x03, + 0x45, 0x0D, 0x2A, 0x07, 0xFF, 0x08, 0x66, 0x0C, 0xB1, 0x12, 0xFD, 0x0C, + 0x7A, 0x11, 0xAB, 0x01, 0xF4, 0xFE, 0x67, 0xF0, 0xB0, 0xF6, 0xE0, 0xE7, + 0x27, 0xF7, 0x06, 0xE0, 0x6B, 0xF0, 0xEB, 0xD7, 0x8C, 0xE2, 0x55, 0xD7, + 0x39, 0xDD, 0xB7, 0xDC, 0xF3, 0xE5, 0x90, 0xE9, 0x7B, 0xED, 0x3F, 0xF1, + 0x02, 0xF0, 0xD3, 0xE9, 0x60, 0xF5, 0x5E, 0xE2, 0x85, 0xF7, 0xB1, 0xE1, + 0xE6, 0xF3, 0x38, 0xE9, 0x8C, 0xEB, 0xAD, 0xEF, 0xC4, 0xDA, 0x10, 0xF0, + 0xA3, 0xD3, 0x17, 0xF0, 0xDB, 0xDA, 0x8F, 0xE9, 0x12, 0xE3, 0xA9, 0xE3, + 0x15, 0xE2, 0xD2, 0xDC, 0x78, 0xD8, 0xBF, 0xCF, 0x3C, 0xD7, 0x3B, 0xCA, + 0x6F, 0xDF, 0xAA, 0xCD, 0xFE, 0xE0, 0x3E, 0xCC, 0x9D, 0xD0, 0xB4, 0xC4, + 0xEF, 0xB9, 0xD4, 0xCA, 0x26, 0xB5, 0x79, 0xDA, 0x60, 0xBF, 0x16, 0xDE, + 0xA0, 0xC0, 0xF0, 0xDC, 0xE0, 0xBB, 0x92, 0xDB, 0xB8, 0xC3, 0xFE, 0xD6, + 0x17, 0xCF, 0xE0, 0xDB, 0x9B, 0xD1, 0xBE, 0xE5, 0x4D, 0xD7, 0x50, 0xF0, + 0xFA, 0xE8, 0x30, 0xFD, 0xE5, 0xFF, 0xC3, 0xF9, 0xFA, 0x08, 0x54, 0xE9, + 0xF2, 0x00, 0xD9, 0xE2, 0xBE, 0xF7, 0x52, 0xED, 0xFB, 0xF1, 0x33, 0xFC, + 0xB5, 0xF3, 0xD3, 0x01, 0xCB, 0x00, 0x80, 0x00, 0x42, 0x0E, 0x1E, 0xFB, + 0xC1, 0x18, 0x84, 0xFD, 0xC6, 0x2A, 0xF5, 0x0B, 0x79, 0x33, 0x80, 0x18, + 0xD2, 0x2A, 0x9A, 0x1F, 0x66, 0x23, 0x94, 0x1B, 0x0D, 0x25, 0x84, 0x0C, + 0x9D, 0x2E, 0x81, 0x09, 0x4D, 0x2D, 0xF1, 0x12, 0x71, 0x19, 0xCA, 0x17, + 0x29, 0x0A, 0xCA, 0x1E, 0x57, 0x0C, 0x4C, 0x21, 0x32, 0x11, 0x1F, 0x1D, + 0xE3, 0x0E, 0x39, 0x1C, 0x00, 0x12, 0x54, 0x1A, 0x64, 0x10, 0xE5, 0x1F, + 0xDC, 0x00, 0xE7, 0x28, 0x0C, 0x04, 0xCB, 0x2C, 0x3D, 0x11, 0xD1, 0x25, + 0x6A, 0x0E, 0x8C, 0x14, 0x45, 0x08, 0x86, 0x08, 0x45, 0xFE, 0xE2, 0x06, + 0xF2, 0xE9, 0x46, 0x0D, 0xF1, 0xDD, 0xCC, 0x08, 0x85, 0xEA, 0x4B, 0xFB, + 0x00, 0xF9, 0xD0, 0xF3, 0x6B, 0xFE, 0x78, 0xEA, 0x9C, 0x08, 0xCF, 0xEF, + 0x46, 0x0A, 0x25, 0x00, 0x5A, 0x00, 0xCA, 0xFD, 0xA1, 0xF7, 0x20, 0xF2, + 0xDE, 0xEF, 0x37, 0xEA, 0x6C, 0xEC, 0xEF, 0xE8, 0xC9, 0xF3, 0xE6, 0xEB, + 0x0A, 0xFF, 0x90, 0xF1, 0x96, 0xFB, 0xBF, 0xF6, 0x3B, 0xFA, 0xDF, 0xFA, + 0x22, 0x03, 0x37, 0xFE, 0x11, 0x08, 0x11, 0xF8, 0x3D, 0x0D, 0xBF, 0xF5, + 0x5D, 0x0C, 0x7B, 0xFF, 0x1C, 0x0C, 0xE1, 0x07, 0xF1, 0x0F, 0x88, 0x0A, + 0xF3, 0x09, 0x50, 0x06, 0x4B, 0x02, 0x74, 0xF7, 0x75, 0xFF, 0xCB, 0xEA, + 0xDF, 0xF9, 0x64, 0xEB, 0xDB, 0xF7, 0x28, 0xF2, 0x2A, 0xF9, 0x82, 0xF9, + 0x83, 0xFC, 0x1C, 0xFE, 0xFA, 0x08, 0x0C, 0xFC, 0x3C, 0x0F, 0x94, 0xF8, + 0x9E, 0x01, 0x61, 0xF7, 0x0E, 0xF3, 0xF4, 0xF4, 0x64, 0xF5, 0x95, 0xF4, + 0x97, 0xFF, 0x78, 0xF7, 0xD3, 0x01, 0xEC, 0xF7, 0x70, 0xF8, 0x69, 0xF9, + 0xCF, 0xF3, 0xE8, 0x05, 0xCF, 0xFB, 0x76, 0x18, 0x85, 0x04, 0x16, 0x21, + 0xD5, 0x06, 0xE7, 0x1C, 0x74, 0x07, 0xE6, 0x1D, 0x5A, 0x10, 0xC1, 0x21, + 0xD5, 0x19, 0xD0, 0x1F, 0xC4, 0x15, 0x93, 0x26, 0xD8, 0x0C, 0x3F, 0x35, + 0x6F, 0x10, 0x86, 0x3F, 0xC3, 0x1E, 0x1F, 0x40, 0x49, 0x28, 0x94, 0x37, + 0x89, 0x23, 0x40, 0x2D, 0xD7, 0x17, 0x96, 0x2F, 0x0D, 0x1B, 0x3F, 0x38, + 0x98, 0x2A, 0xA9, 0x37, 0x3E, 0x2F, 0x3E, 0x36, 0x6C, 0x30, 0xB0, 0x3E, + 0xBB, 0x34, 0xDC, 0x45, 0x05, 0x34, 0x0D, 0x3F, 0x07, 0x32, 0xC5, 0x36, + 0x4A, 0x31, 0x2A, 0x2B, 0x0D, 0x32, 0xFE, 0x17, 0x56, 0x3B, 0xD1, 0x0A, + 0xEA, 0x41, 0x2E, 0x05, 0x44, 0x2F, 0xAE, 0x05, 0xB6, 0x15, 0x41, 0x0B, + 0x84, 0x11, 0x68, 0x0F, 0xD5, 0x14, 0xBA, 0x03, 0x45, 0x0E, 0x73, 0xEE, + 0x78, 0x03, 0x05, 0xE5, 0xF8, 0xFC, 0xBC, 0xE5, 0xB8, 0xF6, 0xFB, 0xE5, + 0x93, 0xF5, 0x5C, 0xEA, 0x27, 0xF2, 0x75, 0xF4, 0x14, 0xEB, 0x49, 0xFB, + 0x9B, 0xF2, 0x22, 0xF6, 0xBE, 0xF5, 0x7E, 0xF1, 0x97, 0xE7, 0x35, 0xEF, + 0xEB, 0xD8, 0x0B, 0xE3, 0x55, 0xD6, 0x93, 0xE9, 0x02, 0xD6, 0xA8, 0xF0, + 0xF8, 0xCF, 0xB6, 0xDF, 0x5D, 0xC9, 0x4D, 0xD8, 0x32, 0xC3, 0x37, 0xDD, + 0x56, 0xC3, 0x44, 0xDA, 0xD2, 0xCC, 0x13, 0xCC, 0xF5, 0xD4, 0xE5, 0xBF, + 0x16, 0xD9, 0xD9, 0xBE, 0x32, 0xE2, 0x6B, 0xC8, 0x8C, 0xEB, 0x93, 0xD0, + 0xAA, 0xE7, 0xB2, 0xCE, 0xFA, 0xD7, 0xF6, 0xCF, 0xA0, 0xC7, 0x5E, 0xD5, + 0x0F, 0xC1, 0x0D, 0xD8, 0xB1, 0xCB, 0x7C, 0xD9, 0x4D, 0xDD, 0xD3, 0xD2, + 0x7A, 0xEB, 0x3E, 0xCB, 0xC9, 0xF0, 0x70, 0xCE, 0x0F, 0xE9, 0xAA, 0xD7, + 0x77, 0xE4, 0x39, 0xE9, 0x2A, 0xE5, 0x6B, 0xF3, 0x1E, 0xE2, 0x01, 0xED, + 0x84, 0xE7, 0x3F, 0xEB, 0x6E, 0xF3, 0xFE, 0xE8, 0x97, 0xF1, 0x5D, 0xE1, + 0xC8, 0xEA, 0x21, 0xDA, 0x1D, 0xEB, 0x83, 0xD7, 0x90, 0xE4, 0x89, 0xD9, + 0x22, 0xE2, 0x9C, 0xDD, 0x1E, 0xE6, 0x90, 0xE0, 0x2C, 0xE8, 0x7E, 0xE5, + 0xA4, 0xF5, 0x72, 0xF0, 0x6D, 0x01, 0x58, 0xF4, 0xA5, 0x02, 0xBF, 0xFD, + 0x73, 0x02, 0x54, 0x0E, 0xC3, 0x02, 0xBC, 0x16, 0xBC, 0xFE, 0x9D, 0x15, + 0xC2, 0xFE, 0x05, 0x13, 0x5F, 0x05, 0x74, 0x1C, 0x13, 0x0C, 0xFB, 0x24, + 0x0C, 0x18, 0x9B, 0x26, 0x0F, 0x24, 0x12, 0x26, 0x20, 0x2F, 0xB1, 0x26, + 0xB3, 0x39, 0xB3, 0x28, 0x6B, 0x37, 0xE4, 0x2F, 0xC2, 0x2C, 0x04, 0x44, + 0x17, 0x24, 0xBF, 0x4C, 0x7F, 0x19, 0x3B, 0x4B, 0xB0, 0x14, 0x97, 0x4A, + 0x77, 0x21, 0x36, 0x3E, 0xBF, 0x31, 0xB3, 0x34, 0x93, 0x35, 0x28, 0x35, + 0xB4, 0x2E, 0x0C, 0x39, 0x8B, 0x24, 0x32, 0x3C, 0xF6, 0x1E, 0x52, 0x3D, + 0xF5, 0x1A, 0x8E, 0x38, 0x27, 0x16, 0xCE, 0x29, 0x01, 0x1E, 0x0F, 0x21, + 0xAD, 0x27, 0xD7, 0x21, 0xE7, 0x1F, 0xD5, 0x1F, 0xA0, 0x1C, 0xAE, 0x14, + 0x75, 0x23, 0x15, 0xFF, 0xEE, 0x1A, 0xB7, 0xED, 0x99, 0x0C, 0x87, 0xED, + 0x80, 0x06, 0xB5, 0xF8, 0xB9, 0x0A, 0x07, 0x02, 0xEF, 0x13, 0xB5, 0xF7, + 0xE2, 0x15, 0x3A, 0xE9, 0x47, 0x16, 0xDF, 0xE8, 0x07, 0x12, 0xD0, 0xE8, + 0x40, 0x01, 0x03, 0xE9, 0x85, 0xF8, 0x8E, 0xEF, 0x83, 0xFE, 0x8F, 0xF1, + 0x94, 0x01, 0x64, 0xE8, 0x68, 0x00, 0xA1, 0xE2, 0x0B, 0x00, 0xA6, 0xE3, + 0x9B, 0xF8, 0x27, 0xE2, 0x25, 0xEE, 0xFF, 0xEA, 0x91, 0xE8, 0x35, 0xFB, + 0xE0, 0xE4, 0xC4, 0x00, 0x2C, 0xE5, 0x37, 0x00, 0x57, 0xE2, 0x2A, 0xF7, + 0x7F, 0xE1, 0xF1, 0xEE, 0xBE, 0xE7, 0x77, 0xF0, 0x21, 0xEA, 0x67, 0xF2, + 0x64, 0xE4, 0xD3, 0xF3, 0x43, 0xDC, 0x07, 0xF2, 0x39, 0xDB, 0x27, 0xEF, + 0xE7, 0xE1, 0x80, 0xEE, 0x62, 0xEA, 0x3A, 0xF2, 0xC8, 0xF0, 0x94, 0xFC, + 0xB1, 0xF4, 0x65, 0x01, 0x70, 0xF2, 0x61, 0xFE, 0xEB, 0xEB, 0xBA, 0xF7, + 0x70, 0xEA, 0x19, 0xF3, 0xDD, 0xEB, 0x31, 0xEF, 0xAC, 0xF4, 0x72, 0xEE, + 0xFC, 0x00, 0x3C, 0xF4, 0xD0, 0xFF, 0x1B, 0xF6, 0x60, 0xFD, 0xD9, 0xFA, + 0x7A, 0x01, 0x2B, 0xFB, 0x19, 0x07, 0xFE, 0xF7, 0xE9, 0x08, 0x65, 0xFD, + 0x6E, 0x00, 0xC2, 0x05, 0xF1, 0xFA, 0x3F, 0x0E, 0x5E, 0xFC, 0xF0, 0x07, + 0x1E, 0xFB, 0x95, 0xFA, 0x0D, 0xF5, 0x4E, 0xF5, 0xD7, 0xF0, 0x4F, 0xF5, + 0x1C, 0xF2, 0x35, 0xF6, 0x35, 0xFE, 0x41, 0xF7, 0xEE, 0x15, 0x62, 0xF5, + 0x69, 0x1E, 0x80, 0xF0, 0x2E, 0x10, 0x7B, 0x00, 0x59, 0x03, 0x90, 0x0F, + 0xCC, 0xFE, 0x6D, 0x06, 0x24, 0x04, 0x2C, 0x03, 0x03, 0x0C, 0xF1, 0x00, + 0x6F, 0x07, 0x1F, 0xFC, 0xA1, 0x02, 0xCA, 0x03, 0x2D, 0x04, 0x36, 0x06, + 0x01, 0x05, 0x87, 0x01, 0x13, 0x09, 0x64, 0x06, 0xD0, 0x13, 0xB7, 0x0B, + 0x7F, 0x1A, 0xB7, 0x05, 0xAD, 0x16, 0x95, 0x00, 0xCE, 0x0B, 0xE8, 0xFE, + 0x4F, 0x02, 0xAB, 0xFB, 0xCA, 0xFF, 0xB4, 0xFC, 0x25, 0xFC, 0x16, 0xF8, + 0xAC, 0xEF, 0x14, 0xF2, 0xB0, 0xE3, 0x4B, 0xF3, 0x90, 0xE1, 0x9B, 0xF0, + 0x5E, 0xDB, 0x3C, 0xF5, 0x06, 0xD0, 0x74, 0xFB, 0x29, 0xD0, 0x0F, 0xF4, + 0x02, 0xDB, 0xA3, 0xEE, 0x6E, 0xE7, 0xD9, 0xEC, 0x24, 0xEB, 0x01, 0xED, + 0x41, 0xDD, 0x2C, 0xF8, 0x5F, 0xCB, 0xE2, 0xFD, 0xE4, 0xCB, 0x09, 0xED, + 0x0B, 0xDC, 0x19, 0xD4, 0xA5, 0xE4, 0xD7, 0xC8, 0x97, 0xE0, 0x30, 0xC9, + 0x1D, 0xE1, 0xBE, 0xCF, 0x29, 0xE6, 0x20, 0xDA, 0x6B, 0xEC, 0xC5, 0xDD, + 0x93, 0xF5, 0x1E, 0xDD, 0x4A, 0xF8, 0xC8, 0xD8, 0x98, 0xF5, 0xE1, 0xD5, + 0x58, 0xF0, 0x77, 0xD8, 0x92, 0xED, 0x2B, 0xD9, 0xED, 0xF2, 0x56, 0xDA, + 0x26, 0xFA, 0x31, 0xDE, 0x34, 0x01, 0x99, 0xE5, 0xE2, 0xFF, 0x78, 0xEC, + 0xBC, 0xF1, 0x89, 0xF8, 0x51, 0xEA, 0x2B, 0x10, 0x46, 0xF5, 0x76, 0x19, + 0x0A, 0x07, 0x14, 0x13, 0x4A, 0x15, 0xBC, 0x0E, 0x23, 0x20, 0x74, 0x13, + 0x1E, 0x24, 0x08, 0x22, 0x8A, 0x1D, 0x01, 0x2F, 0xEA, 0x0A, 0x21, 0x36, + 0x2F, 0xF6, 0x5E, 0x31, 0xC5, 0xF3, 0xD4, 0x29, 0x6C, 0x02, 0x5A, 0x25, + 0x50, 0x14, 0x77, 0x1C, 0xA2, 0x1D, 0x23, 0x18, 0xD8, 0x1B, 0xF7, 0x1C, + 0x2F, 0x1E, 0x83, 0x24, 0x3E, 0x22, 0x41, 0x2C, 0x58, 0x1B, 0xC0, 0x28, + 0x08, 0x16, 0x81, 0x13, 0xE2, 0x17, 0x2E, 0x0C, 0xF8, 0x18, 0xC0, 0x19, + 0x10, 0x14, 0x21, 0x20, 0xA4, 0x10, 0xD6, 0x1B, 0xD1, 0x16, 0x0F, 0x19, + 0xE3, 0x1C, 0x51, 0x1F, 0xC2, 0x21, 0xFC, 0x29, 0x93, 0x21, 0x79, 0x32, + 0x24, 0x1D, 0x27, 0x38, 0x57, 0x27, 0x6C, 0x32, 0xA7, 0x38, 0x66, 0x23, + 0xC9, 0x3D, 0x2A, 0x1D, 0xE1, 0x32, 0xBF, 0x24, 0x04, 0x26, 0xDC, 0x2F, + 0x67, 0x28, 0x5A, 0x32, 0xD0, 0x30, 0x6D, 0x2C, 0x22, 0x31, 0xB8, 0x20, + 0x78, 0x2C, 0xA7, 0x1A, 0x1A, 0x29, 0x54, 0x24, 0xC8, 0x28, 0x3E, 0x29, + 0x63, 0x2F, 0x0D, 0x23, 0x8F, 0x37, 0xD6, 0x1C, 0x3F, 0x33, 0xD1, 0x18, + 0x10, 0x2A, 0xD2, 0x22, 0x13, 0x25, 0x31, 0x2A, 0xB7, 0x1A, 0x46, 0x1F, + 0x7D, 0x17, 0x7C, 0x12, 0x2F, 0x24, 0xB9, 0x09, 0x45, 0x27, 0xA6, 0x0D, + 0x0E, 0x16, 0x8A, 0x14, 0x72, 0x04, 0x43, 0x10, 0x45, 0xF9, 0xE2, 0x08, + 0x08, 0xF4, 0xA4, 0x04, 0xA7, 0xF1, 0xE4, 0x00, 0x4B, 0xED, 0xDF, 0xFA, + 0xE6, 0xED, 0x93, 0xF7, 0x89, 0xF2, 0xB2, 0xF4, 0x9A, 0xF7, 0x7C, 0xF5, + 0x41, 0xF6, 0xD6, 0xFA, 0x4D, 0xEB, 0xAC, 0xFA, 0x2A, 0xE6, 0x40, 0xFD, + 0xFD, 0xE7, 0x5A, 0xFF, 0x9F, 0xE9, 0x97, 0xF2, 0x89, 0xE5, 0x1A, 0xEA, + 0x95, 0xDE, 0x33, 0xF2, 0xFA, 0xE1, 0x46, 0xF3, 0xBC, 0xE9, 0xE2, 0xE4, + 0x19, 0xF2, 0x7C, 0xD3, 0xC1, 0xFA, 0xCF, 0xC8, 0x97, 0xFA, 0xA9, 0xD2, + 0x8E, 0xF5, 0xC1, 0xE0, 0x25, 0xF0, 0xD3, 0xE1, 0xE6, 0xEE, 0xF3, 0xDD, + 0x63, 0xF6, 0xA4, 0xD0, 0x08, 0xFF, 0x5A, 0xC6, 0x77, 0xFC, 0x16, 0xCF, + 0x8D, 0xE9, 0x88, 0xD8, 0xC9, 0xDD, 0x60, 0xDB, 0x53, 0xE4, 0xEE, 0xDD, + 0xA2, 0xE9, 0xBD, 0xDB, 0x32, 0xE7, 0x60, 0xD5, 0xB5, 0xE1, 0xDC, 0xDA, + 0x96, 0xDF, 0x7B, 0xEB, 0xA6, 0xDF, 0xB5, 0xFA, 0x63, 0xDD, 0x08, 0x06, + 0xF4, 0xE3, 0x72, 0x0D, 0xC6, 0xEC, 0x61, 0x15, 0xEE, 0xEA, 0xDD, 0x14, + 0x79, 0xE8, 0x4D, 0x06, 0x22, 0xE9, 0x0A, 0xFB, 0x40, 0xE7, 0xDD, 0xF9, + 0xBD, 0xE2, 0x13, 0xF9, 0xAE, 0xE4, 0x85, 0xFA, 0x60, 0xE9, 0x7D, 0xF9, + 0x9C, 0xEF, 0xCE, 0xF3, 0xE3, 0xFE, 0x6C, 0xF9, 0x4A, 0x06, 0xDB, 0x03, + 0xA9, 0xFB, 0x76, 0x04, 0xBE, 0xEB, 0xE8, 0x02, 0x3C, 0xE5, 0xD5, 0xFE, + 0x6D, 0xEC, 0x61, 0xF3, 0xF6, 0xF5, 0x3E, 0xEC, 0xA2, 0xF6, 0x8A, 0xED, + 0xDE, 0xF2, 0x1A, 0xF1, 0xC6, 0xF0, 0xC0, 0xF2, 0x36, 0xEF, 0x5D, 0xED, + 0x96, 0xF4, 0xDF, 0xDF, 0xC8, 0xFB, 0x45, 0xDB, 0x62, 0xFE, 0xE8, 0xEA, + 0x18, 0x02, 0xE1, 0xF8, 0x2E, 0xFF, 0x7B, 0xF8, 0xCD, 0xF2, 0x34, 0xF4, + 0x0F, 0xEC, 0x80, 0xF3, 0x97, 0xEC, 0xC5, 0xF1, 0x42, 0xE9, 0x55, 0xE5, + 0x4D, 0xE8, 0x20, 0xD8, 0x29, 0xEA, 0xBD, 0xD8, 0x57, 0xF3, 0x71, 0xE5, + 0x36, 0x08, 0xFA, 0xF6, 0x65, 0x0D, 0x96, 0x01, 0x4A, 0x02, 0x87, 0xF7, + 0x9D, 0x08, 0xB7, 0xEC, 0x60, 0x19, 0x9A, 0xF4, 0x94, 0x13, 0x29, 0xF8, + 0x35, 0xFB, 0x24, 0xF4, 0xE0, 0xEF, 0xB7, 0xF8, 0x3C, 0xFD, 0x26, 0x03, + 0xF9, 0x0D, 0xFA, 0x04, 0x9D, 0x10, 0x75, 0x03, 0x9E, 0x0C, 0x8F, 0x0C, + 0xF0, 0x0C, 0x02, 0x12, 0x7E, 0x09, 0x8E, 0x0B, 0x06, 0xFE, 0x22, 0x06, + 0xC9, 0xF4, 0x8E, 0x09, 0x4A, 0xF2, 0x5E, 0x0E, 0xB9, 0xF9, 0x7B, 0x13, + 0xC8, 0x05, 0x12, 0x1A, 0xBB, 0x03, 0x40, 0x18, 0x02, 0xF7, 0x67, 0x13, + 0x94, 0xF3, 0xF1, 0x11, 0xD3, 0xFB, 0x4D, 0x12, 0xFC, 0x02, 0xB7, 0x14, + 0x20, 0x03, 0x3A, 0x17, 0x21, 0x05, 0xE8, 0x21, 0x22, 0x0C, 0xB8, 0x34, + 0x4C, 0x13, 0xD8, 0x3A, 0x14, 0x16, 0x3C, 0x2E, 0x16, 0x1B, 0x6C, 0x1E, + 0x66, 0x27, 0x77, 0x11, 0x4C, 0x2B, 0x6D, 0x0B, 0xBF, 0x25, 0xC7, 0x0F, + 0xB6, 0x21, 0xB0, 0x13, 0xEB, 0x22, 0x53, 0x16, 0xC2, 0x2B, 0x44, 0x17, + 0xC5, 0x34, 0x13, 0x18, 0xDE, 0x34, 0x00, 0x1E, 0x4A, 0x2F, 0xC9, 0x23, + 0xCA, 0x2E, 0x11, 0x20, 0x6C, 0x36, 0x44, 0x0F, 0xAE, 0x37, 0xB7, 0x04, + 0xAA, 0x30, 0x84, 0x05, 0x15, 0x2B, 0xF5, 0x02, 0xBC, 0x24, 0x29, 0x03, + 0x35, 0x1B, 0x41, 0x0C, 0x8E, 0x0C, 0x87, 0x10, 0x42, 0x06, 0x56, 0x0B, + 0x11, 0x0A, 0xA8, 0x09, 0x85, 0x05, 0xA8, 0x0D, 0x9C, 0x05, 0x6E, 0x0F, + 0x3F, 0x0A, 0x09, 0x14, 0x97, 0x06, 0xE8, 0x1C, 0x14, 0x00, 0x63, 0x1B, + 0x5C, 0xF4, 0x7C, 0x11, 0xFE, 0xE9, 0xB7, 0x0B, 0x9D, 0xF0, 0x5D, 0x08, + 0x39, 0x03, 0x80, 0x02, 0x09, 0x0D, 0x74, 0xFC, 0x8A, 0x0D, 0xE6, 0xFD, + 0xB0, 0x03, 0xC3, 0x02, 0x5B, 0xF8, 0x24, 0x03, 0xBD, 0xFB, 0x72, 0xFE, + 0x79, 0xF9, 0xA0, 0xF9, 0x25, 0xF0, 0x7C, 0xF6, 0xE2, 0xEF, 0x3D, 0xEF, + 0xB8, 0xEF, 0x0E, 0xE4, 0x26, 0xE8, 0xB0, 0xDD, 0x51, 0xE3, 0xF8, 0xE6, + 0xF2, 0xE6, 0x68, 0xFB, 0x77, 0xED, 0x86, 0x03, 0x9E, 0xF3, 0xF5, 0xFB, + 0xBD, 0xF6, 0xFC, 0xFA, 0x80, 0xFA, 0xCF, 0xFD, 0x2F, 0xFF, 0x4E, 0xF4, + 0xDE, 0xFC, 0x48, 0xEF, 0xCC, 0xF5, 0x0C, 0xF6, 0x17, 0xEC, 0xEB, 0xF2, + 0x8F, 0xE8, 0xDF, 0xEA, 0x97, 0xE9, 0xD4, 0xE9, 0xEA, 0xE6, 0xDB, 0xEA, + 0x11, 0xE8, 0x05, 0xEC, 0xB8, 0xEE, 0x1B, 0xEF, 0xB2, 0xFD, 0xD3, 0xEE, + 0x70, 0x0D, 0x3F, 0xE1, 0xB6, 0x0C, 0xCD, 0xDB, 0xB8, 0xFF, 0xA4, 0xED, + 0x7C, 0xEE, 0xD1, 0xFB, 0x41, 0xE3, 0x39, 0x00, 0x2F, 0xEA, 0x86, 0x02, + 0x40, 0xF8, 0xC7, 0xF8, 0x7D, 0xFF, 0x70, 0xE6, 0x7B, 0x02, 0x27, 0xDE, + 0xE2, 0x01, 0x87, 0xE2, 0x95, 0xF5, 0xDD, 0xEA, 0x43, 0xEC, 0xE0, 0xF8, + 0x37, 0xF5, 0x8F, 0xFD, 0x6C, 0xFF, 0x33, 0xF5, 0xB3, 0x08, 0xDC, 0xEF, + 0xD3, 0x07, 0x6D, 0xF4, 0x8C, 0xF3, 0x2F, 0x04, 0xB2, 0xE7, 0xED, 0x0C, + 0x81, 0xE7, 0x02, 0x08, 0x6E, 0xE9, 0xE9, 0x04, 0xE7, 0xED, 0x9C, 0x0C, + 0x8F, 0xF5, 0x7D, 0x17, 0x37, 0xFB, 0x29, 0x1B, 0x3F, 0xF9, 0xFB, 0x1C, + 0xF1, 0xFF, 0xF2, 0x18, 0x63, 0x0D, 0x85, 0x10, 0xE2, 0x0C, 0xC8, 0x0D, + 0xC5, 0xFC, 0x55, 0x07, 0xFF, 0xF1, 0xB4, 0x03, 0xF3, 0xFB, 0xCF, 0x0E, + 0x39, 0x0B, 0x56, 0x17, 0x9E, 0x11, 0xA7, 0x0D, 0x7A, 0x0F, 0xEC, 0xFD, + 0x27, 0x08, 0xF5, 0xF2, 0xAD, 0x06, 0xE6, 0xEC, 0xAC, 0x0C, 0xF9, 0xF0, + 0x46, 0x11, 0xCB, 0xF9, 0x6C, 0x0E, 0xAB, 0xF5, 0x7A, 0x0B, 0xA6, 0xE8, + 0x9C, 0x0D, 0xE6, 0xE9, 0xEA, 0x0B, 0xD2, 0xF3, 0x27, 0x02, 0x3B, 0xF8, + 0x03, 0xF2, 0xD6, 0xFA, 0x48, 0xE7, 0x91, 0x00, 0x55, 0xE5, 0x6A, 0x03, + 0x55, 0xE9, 0x6C, 0x01, 0xB3, 0xF7, 0xE8, 0x02, 0x6E, 0x0A, 0xCD, 0x05, + 0xC2, 0x10, 0x68, 0x09, 0xC0, 0x07, 0x89, 0x0A, 0xC6, 0xF7, 0xBC, 0x06, + 0x44, 0xE9, 0x60, 0x00, 0x20, 0xE3, 0xD6, 0xF0, 0x95, 0xDA, 0x15, 0xEA, + 0xAA, 0xD4, 0x0F, 0xF7, 0x45, 0xDD, 0xDE, 0x00, 0xB6, 0xEA, 0xF3, 0x03, + 0xD5, 0xF7, 0xED, 0xF5, 0xDA, 0xFE, 0x43, 0xDE, 0x42, 0xF9, 0x8C, 0xE1, + 0x75, 0xF1, 0x67, 0xF3, 0x05, 0xF4, 0xE8, 0xF6, 0xE8, 0xFE, 0x47, 0xEF, + 0xCB, 0x02, 0x96, 0xEA, 0x5C, 0xFD, 0x5E, 0xEE, 0xD4, 0xFB, 0xE9, 0xF8, + 0x1C, 0x04, 0x50, 0x04, 0x3A, 0x0E, 0xAA, 0x06, 0x49, 0x14, 0xD0, 0xFC, + 0xD1, 0x1A, 0x4B, 0xF3, 0x6D, 0x1E, 0xC5, 0xF9, 0x13, 0x10, 0x97, 0x04, + 0x9B, 0xFC, 0x59, 0x07, 0xBD, 0xFE, 0x13, 0x08, 0x2C, 0x11, 0x7E, 0x08, + 0xAF, 0x1D, 0x36, 0x03, 0x8B, 0x16, 0xFA, 0x02, 0x0E, 0x0A, 0x24, 0x09, + 0x98, 0x0B, 0x0C, 0x02, 0x8B, 0x11, 0x2C, 0xFB, 0xC2, 0x13, 0x0B, 0x04, + 0xE7, 0x14, 0x6F, 0x0A, 0xDB, 0x13, 0xE9, 0x01, 0xB6, 0x0C, 0x36, 0xFA, + 0xF8, 0x04, 0xA0, 0xFB, 0x50, 0x04, 0x17, 0xFC, 0x2D, 0x02, 0x93, 0x01, + 0x1C, 0x03, 0xE8, 0x0B, 0xB6, 0x0B, 0x10, 0x0D, 0x9F, 0x0F, 0x39, 0x0D, + 0x92, 0x0B, 0xB0, 0x14, 0xF5, 0x07, 0x8E, 0x1A, 0xFD, 0x0C, 0x9A, 0x16, + 0xBF, 0x15, 0x64, 0x13, 0xCD, 0x15, 0x04, 0x15, 0xEE, 0x11, 0x5C, 0x16, + 0xDE, 0x09, 0x04, 0x1F, 0xE5, 0xFF, 0x50, 0x2E, 0x9A, 0xFE, 0xD7, 0x34, + 0x6B, 0xFF, 0xE9, 0x2B, 0x2E, 0x06, 0xA2, 0x1D, 0x9B, 0x14, 0xC9, 0x16, + 0x1F, 0x19, 0x5D, 0x1D, 0x57, 0x0D, 0xB2, 0x27, 0xFF, 0xFF, 0x4C, 0x2E, + 0x70, 0xFC, 0x8A, 0x2C, 0xA4, 0xFD, 0x1D, 0x1B, 0x39, 0xFF, 0xB4, 0x07, + 0x0F, 0xFB, 0x38, 0xFC, 0x34, 0xF1, 0x50, 0xED, 0xA7, 0xEE, 0x28, 0xDF, + 0x33, 0xF7, 0x81, 0xDF, 0xA4, 0xFE, 0x2D, 0xE2, 0x5C, 0xFB, 0x00, 0xEA, + 0x25, 0xF6, 0x59, 0xF5, 0x57, 0xF5, 0x70, 0xEE, 0x5C, 0xF0, 0x51, 0xDE, + 0x0C, 0xEE, 0x0E, 0xD2, 0x68, 0xEE, 0x38, 0xCC, 0xCE, 0xEE, 0xD9, 0xCF, + 0x05, 0xF2, 0xD2, 0xCE, 0x80, 0xEC, 0x78, 0xC4, 0x82, 0xDD, 0x5D, 0xBF, + 0x61, 0xCD, 0xB9, 0xC6, 0xE5, 0xC5, 0xDC, 0xD6, 0x36, 0xC8, 0xD1, 0xD9, + 0x2A, 0xD3, 0x3C, 0xD0, 0xE6, 0xE7, 0x86, 0xCF, 0x47, 0xF4, 0xCE, 0xDE, + 0x61, 0xE8, 0xA6, 0xF5, 0x25, 0xDB, 0x7C, 0xFF, 0x3B, 0xD5, 0x17, 0xF5, + 0xFD, 0xCE, 0xEC, 0xE4, 0x0B, 0xD4, 0x7D, 0xDC, 0xB8, 0xDE, 0x12, 0xDF, + 0x15, 0xE1, 0xFC, 0xE4, 0x9E, 0xE2, 0x62, 0xE1, 0xE7, 0xE8, 0xDE, 0xDA, + 0x52, 0xEB, 0x7F, 0xE1, 0x09, 0xE8, 0x0E, 0xEB, 0x99, 0xE7, 0x64, 0xEF, + 0x8A, 0xE8, 0x3C, 0xF2, 0xBD, 0xE4, 0x35, 0xED, 0x83, 0xE7, 0xF0, 0xE4, + 0xE5, 0xEE, 0x33, 0xE4, 0xF0, 0xF2, 0xA2, 0xEE, 0x7C, 0xEF, 0x2E, 0xEA, + 0xB3, 0xE6, 0x55, 0xDE, 0x5E, 0xE8, 0xB3, 0xE8, 0xDF, 0xF0, 0x77, 0xF1, + 0x32, 0xF3, 0x48, 0xF8, 0x90, 0xF5, 0xD8, 0x07, 0x5D, 0xFC, 0xB2, 0x0A, + 0xC2, 0x02, 0xA4, 0xFB, 0xF1, 0x02, 0xF4, 0xEF, 0x74, 0xF9, 0xD4, 0xF6, + 0x02, 0xE9, 0xD1, 0xFC, 0x34, 0xDB, 0x9A, 0xFA, 0x97, 0xE2, 0x32, 0xFA, + 0xBA, 0xF7, 0x73, 0xF5, 0xAC, 0x02, 0xFE, 0xF0, 0x6E, 0x06, 0x33, 0xF3, + 0xEE, 0x07, 0x5F, 0xF5, 0x2C, 0x07, 0xA3, 0xFA, 0x58, 0x04, 0x46, 0x06, + 0x21, 0x00, 0x4B, 0x10, 0xBC, 0x08, 0x65, 0x1B, 0x3A, 0x17, 0x2A, 0x23, + 0xD1, 0x1F, 0x9A, 0x22, 0xAB, 0x26, 0x35, 0x1F, 0xB4, 0x2B, 0x40, 0x1B, + 0x65, 0x2D, 0x0E, 0x1B, 0x56, 0x25, 0xC9, 0x1A, 0x38, 0x16, 0xA7, 0x14, + 0x00, 0x0F, 0x09, 0x1B, 0xAD, 0x0E, 0x97, 0x2A, 0x31, 0x15, 0x79, 0x2F, + 0xFA, 0x1B, 0x95, 0x30, 0xF5, 0x19, 0xF0, 0x32, 0x2F, 0x22, 0xB6, 0x33, + 0xA1, 0x2F, 0x01, 0x25, 0xE9, 0x31, 0xC5, 0x16, 0x3E, 0x25, 0x33, 0x19, + 0x22, 0x14, 0xC5, 0x21, 0x9E, 0x0E, 0x84, 0x31, 0xD4, 0x0A, 0xDE, 0x32, + 0x23, 0x10, 0x80, 0x23, 0x3A, 0x1B, 0x58, 0x16, 0xF7, 0x16, 0x6E, 0x0D, + 0x0B, 0x0D, 0xAF, 0x0D, 0x20, 0x04, 0x41, 0x0F, 0x56, 0x01, 0xF3, 0x0A, + 0x08, 0x0B, 0x3A, 0x08, 0x5B, 0x1A, 0x2B, 0x0A, 0xE9, 0x26, 0x1D, 0x09, + 0x01, 0x24, 0x46, 0xFC, 0xEA, 0x1B, 0x8F, 0xF0, 0xB7, 0x20, 0x7C, 0xF3, + 0x27, 0x26, 0x34, 0xFB, 0xB2, 0x20, 0x02, 0xFD, 0xEE, 0x16, 0xEB, 0xFE, + 0xEF, 0x12, 0xF0, 0xFC, 0x25, 0x21, 0xFD, 0xFB, 0xAC, 0x2A, 0xC4, 0xFF, + 0x55, 0x21, 0x4B, 0x02, 0xDC, 0x13, 0x1D, 0x09, 0xEA, 0x0D, 0x95, 0x11, + 0xF7, 0x17, 0xE4, 0x13, 0x65, 0x20, 0x4A, 0x17, 0x35, 0x16, 0xA7, 0x21, + 0xBB, 0x08, 0xE0, 0x27, 0xDB, 0x06, 0x51, 0x20, 0xA8, 0x0B, 0xE8, 0x18, + 0xA6, 0x05, 0x97, 0x18, 0x2E, 0xF7, 0xA7, 0x1A, 0x4A, 0xF7, 0x1B, 0x21, + 0x4B, 0xFE, 0x79, 0x1F, 0x51, 0xFF, 0x73, 0x1B, 0xA1, 0xFF, 0x9D, 0x1F, + 0xC1, 0x05, 0x32, 0x23, 0xD8, 0x0F, 0xC9, 0x20, 0xF1, 0x13, 0xEF, 0x17, + 0xF3, 0x06, 0xFC, 0x0F, 0x6C, 0xF5, 0xC2, 0x0A, 0xBD, 0xF1, 0x1B, 0x02, + 0x15, 0xF2, 0x67, 0x01, 0x26, 0xEF, 0x31, 0x09, 0x52, 0xED, 0x63, 0x00, + 0x4C, 0xF3, 0x10, 0xEF, 0x47, 0xF9, 0x03, 0xED, 0x43, 0xFA, 0x17, 0xF6, + 0x35, 0x01, 0x36, 0xFC, 0x14, 0x07, 0xD4, 0x00, 0xFD, 0x0D, 0x77, 0x11, + 0xEE, 0x14, 0x9B, 0x14, 0x2E, 0x14, 0x8F, 0x09, 0x4B, 0x03, 0x35, 0x02, + 0xE9, 0xE5, 0x1A, 0xF0, 0xFB, 0xEC, 0x8A, 0xF4, 0xBB, 0xFB, 0x04, 0xFB, + 0x09, 0xF2, 0x02, 0xEE, 0x29, 0xF8, 0x69, 0xF1, 0x72, 0xFF, 0xD5, 0xED, + 0xFA, 0xEE, 0x3C, 0xD7, 0x9B, 0xF5, 0x89, 0xE7, 0x60, 0xF7, 0xF3, 0xFE, + 0x7C, 0xE2, 0x38, 0xF8, 0x88, 0xEF, 0xC3, 0xFF, 0xCA, 0x05, 0x8C, 0x02, + 0xB9, 0xFB, 0x4D, 0xE8, 0x74, 0xF0, 0x34, 0xE6, 0xD7, 0xF4, 0x3A, 0xF8, + 0x16, 0xF4, 0xCB, 0xF7, 0xAF, 0xF6, 0x34, 0xF5, 0x88, 0x05, 0x61, 0xF1, + 0xAC, 0x12, 0xA6, 0xEE, 0xB4, 0x0C, 0xC4, 0xE9, 0xC9, 0xF8, 0x76, 0xDE, + 0xDE, 0xFB, 0xE1, 0xEF, 0xD0, 0xF6, 0x35, 0xF9, 0x67, 0xDD, 0x24, 0xE8, + 0x23, 0xE1, 0x9D, 0xEB, 0x17, 0xE8, 0x95, 0xEE, 0x08, 0xDE, 0x0A, 0xE7, + 0xFC, 0xE1, 0xC6, 0xEF, 0xEF, 0xED, 0x47, 0xF8, 0x61, 0xEC, 0xB5, 0xF2, + 0xA1, 0xF9, 0xC8, 0xFF, 0x4E, 0xFD, 0xBD, 0xFC, 0x5F, 0xF3, 0x32, 0xF0, + 0x1B, 0xF6, 0xB8, 0xF8, 0x1A, 0xF5, 0x3F, 0xF1, 0x85, 0xF7, 0xCE, 0xE3, + 0xA7, 0x02, 0x03, 0xEA, 0x61, 0xF8, 0x4A, 0xE6, 0x60, 0xEB, 0x69, 0xDC, + 0xC6, 0xF7, 0xC3, 0xE7, 0xEC, 0xF5, 0x4B, 0xED, 0x7D, 0xEA, 0x52, 0xEC, + 0x0A, 0xF1, 0xEA, 0xEE, 0x38, 0x01, 0x76, 0xF0, 0xF2, 0x10, 0x5F, 0xEF, + 0xB4, 0x14, 0x94, 0xE2, 0xFF, 0x12, 0x78, 0xE6, 0x1E, 0x09, 0xC9, 0xF6, + 0x94, 0xF0, 0x5F, 0xF6, 0x41, 0xE6, 0x80, 0xFC, 0xC2, 0xF7, 0x03, 0x0C, + 0x9B, 0xF4, 0xBB, 0x02, 0xC1, 0xEC, 0x96, 0xFE, 0xC3, 0x05, 0xA9, 0x1B, + 0x5F, 0x00, 0x72, 0x1A, 0x5E, 0xE9, 0x36, 0x01, 0xD9, 0xE8, 0xBB, 0x07, + 0xB4, 0xD9, 0x8E, 0x11, 0xC2, 0xCD, 0xDA, 0x14, 0xE9, 0xD9, 0x6A, 0x19, + 0x13, 0xE2, 0x1B, 0x07, 0x3E, 0xEA, 0xE3, 0xF9, 0xE4, 0xF6, 0xE6, 0x02, + 0xE0, 0xF8, 0x18, 0x09, 0x83, 0xF2, 0x95, 0x11, 0x6E, 0xEC, 0xA1, 0x11, + 0xE5, 0xFA, 0xC9, 0x06, 0x2B, 0x0C, 0x0C, 0x01, 0xB6, 0x01, 0x40, 0x00, + 0x22, 0xF9, 0xE9, 0x01, 0xE8, 0x04, 0xCC, 0x02, 0x84, 0x08, 0x0C, 0xFC, + 0x6D, 0x09, 0x6B, 0xF6, 0x55, 0x0E, 0x62, 0xF6, 0xF9, 0x09, 0x1F, 0xF9, + 0xFC, 0x08, 0x48, 0xFD, 0x71, 0x13, 0x1B, 0xFF, 0x9F, 0x1D, 0xBB, 0x01, + 0x78, 0x1A, 0xD9, 0x01, 0xED, 0x1B, 0x69, 0x07, 0xF9, 0x24, 0xFF, 0x0B, + 0xDB, 0x18, 0xA5, 0x03, 0x06, 0x0C, 0xD6, 0x04, 0xF1, 0x0F, 0x4E, 0x0D, + 0x8D, 0x12, 0x49, 0x13, 0x1B, 0x1D, 0x53, 0x13, 0x1B, 0x24, 0xE8, 0xFA, + 0xCC, 0x1E, 0x78, 0xF1, 0x47, 0x1F, 0x49, 0x08, 0x67, 0x18, 0x0A, 0x0F, + 0xBE, 0x16, 0xC6, 0x12, 0x9D, 0x16, 0x32, 0x0E, 0xF3, 0x18, 0x39, 0xFD, + 0xB9, 0x27, 0xE0, 0xFB, 0xB7, 0x22, 0x2F, 0x07, 0xEE, 0x0D, 0x93, 0x13, + 0xF9, 0x0D, 0x06, 0x17, 0x7D, 0x1F, 0x84, 0x14, 0x1B, 0x21, 0x79, 0x0B, + 0x97, 0x1A, 0xF0, 0x09, 0x73, 0x13, 0x44, 0x13, 0x3A, 0x0B, 0xA4, 0x1E, + 0xAE, 0x07, 0xFC, 0x24, 0x93, 0x0A, 0xFD, 0x23, 0xDA, 0x03, 0xEB, 0x17, + 0xBA, 0xFB, 0x8C, 0x11, 0x70, 0xFE, 0xFE, 0x0E, 0x8C, 0x05, 0xC1, 0x09, + 0x86, 0xFE, 0x55, 0x05, 0x03, 0xEC, 0xD3, 0x08, 0xF5, 0xEB, 0xB8, 0x1B, + 0xE8, 0xF0, 0x62, 0x1E, 0x70, 0xF1, 0x5F, 0x12, 0x6C, 0xFE, 0x25, 0x10, + 0x4E, 0xFA, 0x0D, 0x04, 0x78, 0xEF, 0xCA, 0xFD, 0x77, 0xFE, 0xB6, 0x06, + 0x77, 0x03, 0x33, 0x03, 0x19, 0x00, 0x85, 0xFF, 0x33, 0x05, 0x06, 0xFD, + 0x9D, 0x06, 0xB9, 0xF4, 0x84, 0x02, 0x06, 0xF3, 0x66, 0xF3, 0x6A, 0xF4, + 0xC6, 0xEA, 0xF4, 0xED, 0x75, 0xEC, 0xF8, 0xD9, 0xEC, 0xEE, 0x09, 0xD0, + 0x81, 0xF0, 0xD5, 0xD4, 0x58, 0xEB, 0x17, 0xD7, 0x98, 0xE3, 0x1A, 0xD7, + 0x26, 0xDA, 0x32, 0xD3, 0x43, 0xD5, 0x1E, 0xD1, 0x44, 0xD5, 0xD5, 0xD2, + 0xC8, 0xD9, 0xA7, 0xDD, 0x4B, 0xE1, 0x9F, 0xE8, 0x91, 0xDE, 0x6A, 0xE3, + 0xAB, 0xDA, 0xFA, 0xE4, 0x8B, 0xDD, 0x6C, 0xF1, 0x92, 0xD8, 0x26, 0xEB, + 0x9F, 0xD4, 0x0A, 0xE6, 0x1D, 0xD7, 0x63, 0xEE, 0xBD, 0xD4, 0xBA, 0xE0, + 0x81, 0xE4, 0xF9, 0xD9, 0x97, 0xF2, 0x90, 0xE3, 0x24, 0xE5, 0xC4, 0xE4, + 0xCD, 0xDC, 0x50, 0xE8, 0xA3, 0xE5, 0x07, 0xEA, 0x6E, 0xF0, 0x45, 0xE6, + 0xCC, 0xFB, 0x6A, 0xE9, 0xC5, 0xFE, 0x2B, 0xEF, 0xAC, 0xF0, 0xC5, 0xE6, + 0x5A, 0xF0, 0xF5, 0xE4, 0x27, 0xF7, 0x18, 0xE4, 0x38, 0xF1, 0x21, 0xD9, + 0x1A, 0xF9, 0xF1, 0xE9, 0xD3, 0xF3, 0x11, 0xEF, 0x1C, 0xE5, 0x6E, 0xE1, + 0xA5, 0xF4, 0x57, 0xE8, 0x81, 0xFC, 0x9D, 0xED, 0x6C, 0xF2, 0x7F, 0xF8, + 0x79, 0xED, 0x48, 0x05, 0xC9, 0xED, 0xD0, 0xFC, 0x17, 0xF3, 0x81, 0xEB, + 0x10, 0xF5, 0xC4, 0xE7, 0xCD, 0xF9, 0x13, 0xFC, 0x37, 0xFF, 0x75, 0x06, + 0xCC, 0xFA, 0x3D, 0xF3, 0x0A, 0x05, 0xC9, 0xF4, 0x36, 0x14, 0x4E, 0x06, + 0x9B, 0x0E, 0x88, 0x05, 0xAF, 0x01, 0x8A, 0x07, 0x46, 0x0E, 0xA6, 0x18, + 0x8F, 0x14, 0xE8, 0x17, 0x04, 0x0C, 0xA8, 0x16, 0xA1, 0x14, 0xD3, 0x2A, + 0x48, 0x14, 0x3C, 0x26, 0x00, 0x16, 0x17, 0x17, 0x63, 0x1F, 0x39, 0x14, + 0xC7, 0x1C, 0x88, 0x09, 0xDB, 0x17, 0x3E, 0x05, 0xF5, 0x0E, 0xEF, 0x05, + 0xDB, 0x03, 0x03, 0x04, 0xFE, 0xFF, 0x79, 0x08, 0x7E, 0x03, 0xAE, 0x0F, + 0x0D, 0xFA, 0xF8, 0x10, 0x55, 0xF2, 0x0D, 0x10, 0x8E, 0xF9, 0x9D, 0x09, + 0xD0, 0xF8, 0x5E, 0xFD, 0xD8, 0xF3, 0x19, 0xFB, 0x93, 0xF8, 0xFE, 0x05, + 0xF8, 0xEC, 0xF1, 0x09, 0x45, 0xE8, 0xE6, 0x1D, 0x92, 0xF8, 0xEA, 0x2C, + 0x54, 0x02, 0x34, 0x20, 0xE5, 0x0B, 0x20, 0x20, 0x44, 0x0B, 0xA4, 0x1B, + 0x98, 0x0D, 0x51, 0x16, 0x0B, 0x13, 0x3F, 0x19, 0x91, 0x0F, 0x5C, 0x15, + 0xB4, 0x13, 0xF3, 0x0B, 0x6F, 0x23, 0x37, 0x05, 0x03, 0x2F, 0x9A, 0x09, + 0x09, 0x27, 0xFB, 0x0E, 0x61, 0x1B, 0xC6, 0x14, 0xDB, 0x1B, 0x16, 0x1E, + 0x94, 0x26, 0x1D, 0x20, 0xAB, 0x2F, 0xA9, 0x12, 0xDC, 0x2A, 0x33, 0x08, + 0x10, 0x30, 0xF3, 0x19, 0xDA, 0x31, 0xC5, 0x15, 0x6A, 0x23, 0x5B, 0x01, + 0xD6, 0x1E, 0xA5, 0x0C, 0xE6, 0x1C, 0xF9, 0x0E, 0xBF, 0x15, 0xC5, 0x02, + 0x52, 0x1C, 0x4F, 0x0B, 0x48, 0x1F, 0x51, 0x11, 0xDC, 0x1D, 0xD4, 0x12, + 0xEA, 0x1B, 0x85, 0x18, 0x21, 0x15, 0x4A, 0x1F, 0x27, 0x16, 0x33, 0x26, + 0xE0, 0x0B, 0xAA, 0x1D, 0x44, 0x0E, 0xC9, 0x23, 0x3A, 0x11, 0x46, 0x22, + 0xA5, 0x0B, 0xC8, 0x13, 0x5C, 0x11, 0xFE, 0x1E, 0x58, 0x02, 0x2D, 0x1D, + 0xDE, 0xFF, 0x9D, 0x12, 0x7A, 0x0E, 0x15, 0x17, 0xEB, 0x10, 0xE6, 0x1B, + 0xC4, 0x0A, 0x19, 0x12, 0x40, 0x03, 0x8E, 0x0C, 0x77, 0x06, 0x91, 0x10, + 0xCF, 0x09, 0x27, 0x06, 0x1E, 0x08, 0x74, 0xFF, 0xBC, 0x09, 0x23, 0x0A, + 0x2F, 0x04, 0xC3, 0x07, 0x17, 0xF9, 0xD2, 0xF2, 0xC9, 0x00, 0x4D, 0xF3, + 0x79, 0x15, 0xE3, 0x09, 0x83, 0x1A, 0x17, 0x14, 0x1B, 0x1A, 0x75, 0x19, + 0x1A, 0x1C, 0x83, 0x16, 0x8C, 0x1A, 0x85, 0x0D, 0x20, 0x13, 0xBA, 0x0B, + 0xC0, 0x06, 0xC5, 0x14, 0xDC, 0xF8, 0x9E, 0x1B, 0x9C, 0xF1, 0xEE, 0x0A, + 0x97, 0xF5, 0x5C, 0xFB, 0xF4, 0xFC, 0x69, 0xF8, 0x89, 0x03, 0x3C, 0xF5, + 0x5D, 0xF9, 0xF3, 0xEE, 0x30, 0xF3, 0x8C, 0xF4, 0xC7, 0xF3, 0xCE, 0xF4, + 0x48, 0xEC, 0x5D, 0xE0, 0xD5, 0xF7, 0xD1, 0xDE, 0x91, 0xF4, 0x90, 0xE0, + 0xDC, 0xDC, 0x4B, 0xDD, 0xD8, 0xE0, 0x16, 0xED, 0x7F, 0xEC, 0x02, 0xEE, + 0xA0, 0xE8, 0x9F, 0xD9, 0x42, 0xE0, 0xFE, 0xD1, 0x12, 0xD3, 0x13, 0xD3, + 0xA7, 0xD2, 0x1F, 0xE1, 0xFD, 0xDC, 0x3D, 0xE3, 0xBF, 0xEA, 0x85, 0xD6, + 0x11, 0xED, 0xBC, 0xD3, 0xA9, 0xDB, 0xF8, 0xCB, 0xE6, 0xD8, 0x90, 0xD3, + 0x4A, 0xD2, 0x11, 0xDA, 0xC4, 0xC8, 0x13, 0xD9, 0xB1, 0xCC, 0xA9, 0xE1, + 0x84, 0xCC, 0xA3, 0xDE, 0x87, 0xCB, 0x9E, 0xDF, 0xBE, 0xD7, 0x84, 0xF3, + 0xA5, 0xE6, 0x08, 0xFA, 0x9C, 0xF2, 0xCE, 0xFE, 0x07, 0xF3, 0x3C, 0x0A, + 0x45, 0xE2, 0x92, 0x03, 0x69, 0xDB, 0x70, 0xF8, 0x3A, 0xE3, 0x17, 0xF2, + 0x1B, 0xEB, 0xF2, 0xE4, 0xE8, 0xEC, 0x8E, 0xD6, 0x68, 0xF0, 0xE8, 0xE9, + 0x98, 0xE7, 0xC0, 0xFC, 0xA6, 0xD7, 0x68, 0xEC, 0x4F, 0xE0, 0xFC, 0xE2, + 0xDB, 0xF0, 0x84, 0xDD, 0xFF, 0xF9, 0xB7, 0xD9, 0xDE, 0x06, 0xAE, 0xE1, + 0xDE, 0x07, 0x13, 0xDC, 0x43, 0xFC, 0x30, 0xD3, 0x79, 0xEF, 0x21, 0xCF, + 0xFF, 0xEA, 0xFB, 0xD8, 0xFB, 0xE7, 0xB4, 0xE7, 0xB7, 0xE3, 0x80, 0xF2, + 0x62, 0xEA, 0x16, 0xFF, 0xD1, 0xF9, 0xA9, 0x01, 0x7F, 0x08, 0x12, 0xFC, + 0xD3, 0x0C, 0xD1, 0x00, 0x63, 0x0B, 0xE1, 0x16, 0x85, 0x04, 0x26, 0x17, + 0x7D, 0xF6, 0xF9, 0x02, 0x33, 0x02, 0x4F, 0x11, 0xF7, 0x05, 0x3C, 0x18, + 0x0F, 0xF6, 0xA5, 0x0A, 0x13, 0x07, 0xA2, 0x1D, 0x40, 0x0F, 0x3E, 0x22, + 0x22, 0x0E, 0x9A, 0x17, 0xE5, 0x1C, 0xE2, 0x2B, 0x20, 0x24, 0xB8, 0x3B, + 0xCF, 0x22, 0xC2, 0x34, 0xAF, 0x22, 0xC4, 0x23, 0xA2, 0x24, 0x3B, 0x0C, + 0xC0, 0x26, 0xC2, 0x0A, 0xE3, 0x23, 0x60, 0x11, 0xF6, 0x1C, 0x9D, 0x0E, + 0xA8, 0x16, 0x9B, 0x09, 0xCD, 0x0F, 0x75, 0x03, 0xAD, 0x0A, 0xC9, 0x06, + 0x97, 0x1B, 0xAF, 0x1A, 0xB9, 0x23, 0x2F, 0x22, 0x12, 0x18, 0x50, 0x18, + 0xFF, 0x21, 0x21, 0x20, 0x80, 0x2E, 0xEE, 0x22, 0xF6, 0x2C, 0xEF, 0x18, + 0x22, 0x2E, 0x6C, 0x24, 0x1F, 0x23, 0x30, 0x2B, 0x56, 0x18, 0xD8, 0x24, + 0xEA, 0x1C, 0xBF, 0x1B, 0x4A, 0x1B, 0x96, 0x0B, 0x9E, 0x0B, 0xBE, 0x05, + 0x59, 0x00, 0x5D, 0x0D, 0xE6, 0x03, 0x5B, 0x0D, 0xE8, 0x11, 0xE9, 0x0C, + 0x54, 0x18, 0xCC, 0x06, 0xA4, 0x09, 0x41, 0xF3, 0xE5, 0x03, 0x38, 0xFC, + 0x90, 0x0A, 0x4A, 0x11, 0x54, 0xFD, 0x33, 0x04, 0xA2, 0xF9, 0x2D, 0xF9, + 0x6C, 0x04, 0x1A, 0xFF, 0x09, 0xFC, 0xC2, 0xF6, 0x01, 0x00, 0xCC, 0xF5, + 0xDD, 0x01, 0x8A, 0xF7, 0xF9, 0xEF, 0x03, 0xF0, 0x60, 0xF8, 0xD2, 0xFD, + 0xBC, 0x06, 0x5A, 0x08, 0x23, 0xFA, 0x88, 0x01, 0xB4, 0xF5, 0x8E, 0x08, + 0x5D, 0xF0, 0xA8, 0xFB, 0x23, 0xE8, 0xCD, 0xED, 0xAC, 0xF4, 0xB0, 0x01, + 0x1C, 0xEE, 0x8B, 0xFF, 0xAF, 0xE4, 0xA7, 0x00, 0xFA, 0xF8, 0x9C, 0x13, + 0xC6, 0xFC, 0x4F, 0xFF, 0x5F, 0xF5, 0x21, 0xF5, 0x73, 0xF3, 0x37, 0x0B, + 0xE5, 0xF1, 0xAF, 0x11, 0xD4, 0xFB, 0x1B, 0x06, 0xC5, 0x03, 0xB3, 0xF1, + 0xA1, 0x08, 0x9A, 0xE8, 0x3A, 0x0C, 0xC1, 0xF2, 0xDE, 0xF8, 0x64, 0xF0, + 0xD8, 0xEC, 0xBD, 0xF0, 0x00, 0xEF, 0x1D, 0xF3, 0x73, 0xEF, 0xD4, 0xDE, + 0x31, 0x05, 0xE0, 0xDB, 0x4F, 0x10, 0x58, 0xDE, 0x2F, 0xFD, 0x34, 0xCB, + 0xF7, 0xED, 0xD2, 0xC9, 0x41, 0xEC, 0x6F, 0xDB, 0x82, 0xF0, 0xF7, 0xE2, + 0x32, 0xF2, 0x2C, 0xE3, 0xF6, 0xF5, 0x1B, 0xEB, 0x42, 0xFF, 0x47, 0xF3, + 0x45, 0x04, 0xBE, 0xF7, 0x07, 0x08, 0x5F, 0x05, 0xF3, 0x0E, 0x6E, 0x16, + 0xDF, 0x0E, 0x6C, 0x20, 0x69, 0xFD, 0x6A, 0x15, 0xEC, 0xF9, 0x93, 0x0D, + 0x1C, 0xF6, 0x26, 0x07, 0x77, 0xEA, 0xBB, 0xF7, 0x5B, 0x02, 0x1A, 0x07, + 0xFF, 0x09, 0x94, 0x0B, 0xD4, 0xF7, 0x32, 0xFB, 0xAE, 0xF4, 0x20, 0x05, + 0x6E, 0xEA, 0xA6, 0x08, 0x6A, 0xEE, 0x98, 0x08, 0xB4, 0x00, 0x17, 0x15, + 0x80, 0xF1, 0x76, 0x06, 0x85, 0xE3, 0x0D, 0xF2, 0x77, 0xE5, 0xFE, 0xEE, + 0x49, 0xE5, 0xAE, 0xF6, 0xF5, 0xE5, 0x94, 0xF1, 0x69, 0xE9, 0x56, 0xE7, + 0xFA, 0xE1, 0x14, 0xEC, 0x9B, 0xD2, 0x64, 0xE7, 0xF5, 0xDD, 0xB6, 0xE4, + 0xA3, 0xF7, 0x05, 0xED, 0x28, 0xFD, 0xF9, 0xF0, 0x2A, 0xFE, 0x2A, 0xFB, + 0x63, 0x04, 0x2C, 0x04, 0x5A, 0xFF, 0x45, 0xFF, 0xDA, 0xEF, 0xF8, 0xF5, + 0xC1, 0xE2, 0xDB, 0xEB, 0x4C, 0xE5, 0x56, 0xE9, 0x4B, 0xEC, 0x8F, 0xEA, + 0x22, 0xF6, 0xFF, 0xEF, 0x2A, 0xFB, 0x3D, 0xF3, 0x2A, 0x00, 0x3D, 0xF7, + 0x22, 0x0A, 0xC0, 0xFF, 0x46, 0x0D, 0xB7, 0x06, 0x9B, 0x01, 0x99, 0x02, + 0x48, 0xF8, 0xE6, 0xF7, 0x60, 0x04, 0x19, 0xF5, 0xB1, 0x0D, 0x51, 0xF7, + 0x7F, 0x08, 0x04, 0xF9, 0xCE, 0x06, 0xE7, 0xF6, 0x4E, 0x0C, 0xFF, 0xF4, + 0xE5, 0x06, 0x75, 0xF1, 0x15, 0xFB, 0xAC, 0xEB, 0x30, 0xF6, 0x89, 0xE8, + 0x58, 0xFC, 0x3D, 0xF5, 0x9D, 0x00, 0xC1, 0x02, 0x9C, 0xFC, 0xF9, 0xFF, + 0x61, 0xF8, 0xC1, 0xFD, 0xC4, 0x05, 0x60, 0x0A, 0xF3, 0x14, 0x27, 0x0C, + 0x02, 0x08, 0x27, 0x00, 0x43, 0xF8, 0x2B, 0x02, 0x77, 0xF2, 0x09, 0x08, + 0x27, 0xFC, 0xF4, 0x13, 0x4B, 0x0B, 0x88, 0x14, 0x68, 0x11, 0xF1, 0x0A, + 0xC6, 0x18, 0x6B, 0x14, 0x21, 0x17, 0x23, 0x1C, 0xE9, 0x0C, 0x9C, 0x1B, + 0x8C, 0x02, 0xAD, 0x1A, 0xC6, 0xFF, 0x1A, 0x15, 0x63, 0x0F, 0xB6, 0x0C, + 0x4D, 0x21, 0xE7, 0x0B, 0x93, 0x2A, 0xB0, 0x12, 0xE8, 0x2B, 0xF4, 0x14, + 0xAE, 0x24, 0xBC, 0x12, 0x34, 0x26, 0xDB, 0x16, 0x2B, 0x30, 0x22, 0x22, + 0xB2, 0x30, 0xA0, 0x22, 0x4C, 0x2A, 0x54, 0x14, 0xC6, 0x28, 0x62, 0x0A, + 0x8D, 0x2A, 0xC2, 0x0E, 0x3F, 0x25, 0xA9, 0x18, 0xC6, 0x16, 0x88, 0x12, + 0x40, 0x19, 0x60, 0x0B, 0x1F, 0x29, 0x77, 0x15, 0x22, 0x2C, 0x08, 0x1C, + 0x3F, 0x24, 0x4E, 0x15, 0x9A, 0x1C, 0x99, 0x14, 0x86, 0x19, 0x18, 0x1C, + 0x03, 0x19, 0x52, 0x1D, 0x6B, 0x14, 0xD4, 0x17, 0xFE, 0x07, 0x85, 0x16, + 0x07, 0xFD, 0x0C, 0x1A, 0x38, 0xFA, 0x67, 0x1E, 0xFA, 0xF0, 0x12, 0x1A, + 0x92, 0xE6, 0x66, 0x14, 0xAA, 0xE8, 0x14, 0x1B, 0x28, 0xEA, 0xA0, 0x16, + 0x3E, 0xF0, 0x23, 0x0F, 0xFA, 0xF9, 0x7A, 0x0A, 0x2E, 0xFE, 0xA7, 0xFF, + 0xB8, 0xFD, 0xC9, 0x06, 0x00, 0xED, 0x99, 0x0D, 0xBB, 0xDE, 0x87, 0x01, + 0x82, 0xE8, 0xFA, 0xFD, 0xDA, 0xF0, 0x25, 0xF7, 0xAB, 0xF9, 0x03, 0xED, + 0xFB, 0xFF, 0x9F, 0xF0, 0x36, 0xF2, 0xF6, 0xF2, 0x3A, 0xEF, 0xEF, 0xF1, + 0xC0, 0x06, 0x6B, 0x01, 0x07, 0x19, 0xE1, 0x12, 0x96, 0x17, 0x1C, 0x06, + 0x97, 0x0E, 0x6E, 0xF5, 0x07, 0x08, 0x77, 0xF9, 0x46, 0x02, 0x5C, 0xFC, + 0x4F, 0x06, 0x97, 0xFF, 0xEA, 0x02, 0x08, 0xFA, 0x3D, 0xF4, 0x5A, 0xF0, + 0xDF, 0xF6, 0x2E, 0xF1, 0xD9, 0xF7, 0x3B, 0xE3, 0x94, 0xF3, 0xE8, 0xD7, + 0x18, 0xF1, 0xD0, 0xD9, 0xAE, 0xED, 0x21, 0xD4, 0xEF, 0xF1, 0xB3, 0xD2, + 0x75, 0xF6, 0x51, 0xDC, 0xC6, 0xF6, 0x1F, 0xE2, 0x33, 0xF3, 0xD0, 0xE8, + 0x05, 0xEF, 0xCB, 0xF3, 0x1C, 0xEB, 0x8E, 0xF0, 0xBA, 0xE2, 0x14, 0xEB, + 0xAD, 0xE1, 0x2C, 0xEC, 0x8D, 0xE0, 0xD9, 0xDD, 0x3A, 0xE6, 0x9C, 0xDD, + 0x82, 0xF6, 0xB8, 0xF2, 0xD6, 0x00, 0x6D, 0xFB, 0x4D, 0x06, 0xF0, 0xFB, + 0xA2, 0x09, 0x27, 0xFB, 0x63, 0x0B, 0xE2, 0xF4, 0x47, 0x00, 0xEF, 0xED, + 0xA3, 0xF2, 0xCC, 0xF0, 0x14, 0xEC, 0x7B, 0xFA, 0x63, 0xDC, 0x30, 0xFD, + 0x72, 0xD9, 0x9C, 0xFD, 0xD4, 0xF1, 0xDB, 0x09, 0x1B, 0xFB, 0xBF, 0x10, + 0xEA, 0xF1, 0x56, 0x0B, 0xCD, 0xEC, 0x2B, 0x0A, 0xA9, 0xEF, 0xD5, 0x0C, + 0x14, 0xFD, 0xE4, 0x0D, 0x99, 0x03, 0x8C, 0x0B, 0xF3, 0xFC, 0xD9, 0x07, + 0x39, 0xF6, 0x65, 0x09, 0x12, 0xF7, 0xA6, 0x0D, 0x7C, 0xF2, 0xEB, 0x08, + 0xE7, 0xEA, 0x31, 0xFC, 0xD2, 0xE8, 0xA9, 0xF2, 0xB6, 0xE7, 0xD9, 0xF2, + 0xB0, 0xF7, 0x88, 0xF5, 0xF3, 0x08, 0xDB, 0xF0, 0x88, 0x09, 0x6A, 0xE8, + 0x7D, 0x0D, 0x59, 0xE7, 0x3B, 0x17, 0x18, 0xF9, 0xA2, 0x10, 0xCF, 0x0A, + 0x17, 0xF5, 0xAD, 0xFE, 0xE8, 0xEA, 0x0A, 0xE9, 0x07, 0xF8, 0x05, 0xEB, + 0x6A, 0xF7, 0x53, 0xF5, 0x10, 0xF5, 0x59, 0xF9, 0xA3, 0xFE, 0x78, 0xFF, + 0x29, 0x04, 0x80, 0xFA, 0xD2, 0x0B, 0xBC, 0xF7, 0x4D, 0x07, 0x65, 0x05, + 0xD1, 0xF7, 0x05, 0x0B, 0x07, 0xF7, 0x2C, 0xFE, 0x8E, 0x04, 0xDA, 0xF9, + 0xFA, 0x05, 0xAC, 0x05, 0x7B, 0xF7, 0xE3, 0x09, 0x29, 0xF8, 0x4B, 0x0B, + 0x76, 0x06, 0x62, 0x12, 0xA9, 0x07, 0xA7, 0x0A, 0x38, 0xF8, 0x2C, 0xF8, + 0x95, 0xF3, 0xFC, 0xF9, 0x49, 0xFC, 0x90, 0x09, 0xD9, 0x01, 0x52, 0x0E, + 0x49, 0x09, 0xA5, 0x05, 0xEC, 0x0F, 0xBD, 0xF9, 0xD9, 0x13, 0xCE, 0xFA, + 0xAB, 0x14, 0x5A, 0x03, 0x41, 0x0A, 0xF9, 0x08, 0xE7, 0x02, 0x9C, 0x07, + 0xB4, 0x0A, 0x38, 0xF4, 0x0A, 0x16, 0x13, 0xE3, 0xF0, 0x15, 0xE7, 0xE9, + 0xD1, 0x0D, 0x51, 0xF7, 0x3D, 0x0A, 0x8C, 0x01, 0xA5, 0x0B, 0xEF, 0x0C, + 0x85, 0x0C, 0xE6, 0x0F, 0xA1, 0x00, 0xA6, 0x02, 0x77, 0xF3, 0x05, 0xF7, + 0x71, 0xFC, 0xBE, 0xFC, 0xFB, 0x08, 0x32, 0x02, 0x33, 0x01, 0x8B, 0x00, + 0xF9, 0xF7, 0x29, 0x0B, 0xBA, 0xFA, 0x24, 0x13, 0xE3, 0x00, 0x8C, 0x09, + 0x75, 0x01, 0x82, 0x02, 0x82, 0xFB, 0xB6, 0xFC, 0xD0, 0x02, 0xE9, 0xF9, + 0x7E, 0x16, 0x99, 0x05, 0x73, 0x1D, 0xFB, 0x13, 0x5F, 0x19, 0x52, 0x19, + 0xB8, 0x18, 0x9A, 0x1B, 0x14, 0x1B, 0xAD, 0x1E, 0x9D, 0x1E, 0x47, 0x1B, + 0xDD, 0x1C, 0x92, 0x19, 0xC1, 0x19, 0x3E, 0x1E, 0xED, 0x1A, 0xEC, 0x1D, + 0x99, 0x17, 0x91, 0x17, 0x38, 0x1A, 0x63, 0x16, 0x50, 0x23, 0x53, 0x1F, + 0x30, 0x18, 0x34, 0x26, 0xB2, 0x03, 0x38, 0x2B, 0x23, 0x00, 0x1E, 0x26, + 0x66, 0x06, 0x2A, 0x0E, 0x44, 0x13, 0xCB, 0x07, 0x19, 0x22, 0xB9, 0x1F, + 0x8F, 0x1F, 0xFD, 0x30, 0x1C, 0x0B, 0xDA, 0x2C, 0x59, 0xF9, 0x82, 0x25, + 0x57, 0x00, 0xA3, 0x28, 0x05, 0x14, 0x05, 0x2A, 0xB2, 0x11, 0xD2, 0x1A, + 0x10, 0xFE, 0x60, 0x04, 0xF0, 0xF3, 0xB6, 0xF6, 0x5A, 0xFA, 0xA9, 0xF9, + 0x83, 0x04, 0x59, 0x02, 0x03, 0x03, 0x3F, 0x00, 0xAD, 0xF8, 0x7F, 0xF3, + 0xE2, 0x01, 0x42, 0xF0, 0xDD, 0x16, 0xFE, 0xF4, 0xD3, 0x17, 0x31, 0xF3, + 0x3E, 0x06, 0x48, 0xE8, 0x7B, 0xF8, 0x4B, 0xDF, 0xFC, 0xF2, 0x36, 0xE0, + 0x18, 0xEA, 0xF1, 0xDA, 0x5B, 0xEE, 0x0D, 0xDD, 0xE2, 0xF7, 0x3A, 0xED, + 0x02, 0xF0, 0x72, 0xF0, 0x97, 0xE8, 0x17, 0xE1, 0xE1, 0xED, 0xB4, 0xCD, + 0x38, 0xEE, 0xC3, 0xC9, 0xB1, 0xE3, 0xD0, 0xD8, 0x23, 0xDC, 0x85, 0xE9, + 0x11, 0xD7, 0x3F, 0xEE, 0xE2, 0xD3, 0xBE, 0xED, 0x1E, 0xD7, 0x18, 0xED, + 0x6B, 0xE5, 0x46, 0xF3, 0xA7, 0xF2, 0xF7, 0xF7, 0xF9, 0xF0, 0xFF, 0xEA, + 0xFF, 0xF3, 0xA2, 0xE1, 0xF2, 0xF2, 0xC5, 0xE6, 0x6D, 0xEC, 0x3A, 0xEF, + 0x7F, 0xE9, 0xF0, 0xF1, 0xC2, 0xE1, 0x8D, 0xF2, 0xE7, 0xE7, 0xF2, 0xF7, + 0x84, 0xF9, 0x2E, 0xF8, 0x88, 0xF2, 0xEC, 0xEC, 0x9C, 0xDC, 0xE4, 0xE0, + 0x1A, 0xDB, 0x4C, 0xD9, 0xD8, 0xE2, 0x27, 0xD1, 0xFC, 0xE4, 0x4D, 0xD5, + 0xD5, 0xE9, 0xE5, 0xE3, 0x30, 0xED, 0xF4, 0xE6, 0xA3, 0xF2, 0x6B, 0xEC, + 0x6F, 0xFB, 0x08, 0xF7, 0x25, 0xF7, 0xA8, 0xF2, 0xBD, 0xEC, 0x50, 0xEB, + 0x47, 0xEB, 0x63, 0xF2, 0xDC, 0xF0, 0xA8, 0xFC, 0x1E, 0xF3, 0xFE, 0xFB, + 0xBE, 0xEF, 0x44, 0xFA, 0x66, 0xF0, 0x55, 0x00, 0x34, 0xF5, 0x13, 0xFE, + 0xDC, 0xFB, 0x03, 0xF7, 0xA4, 0xF4, 0xA8, 0xF2, 0xAB, 0xE6, 0xCF, 0xF0, + 0x4B, 0xE8, 0xEF, 0xF5, 0xEE, 0xF1, 0x66, 0xFE, 0xB2, 0xFC, 0x16, 0x09, + 0x26, 0x00, 0x1E, 0x15, 0x34, 0x03, 0xC4, 0x1B, 0x9E, 0x17, 0x5E, 0x15, + 0xFF, 0x27, 0xA4, 0x0C, 0xF3, 0x21, 0xB3, 0x0B, 0x85, 0x19, 0x8B, 0x08, + 0xDE, 0x18, 0xE4, 0x0C, 0x16, 0x15, 0x78, 0x20, 0xA5, 0x0B, 0x8D, 0x2A, + 0x05, 0x09, 0x74, 0x22, 0xD0, 0x11, 0xCA, 0x1B, 0x53, 0x15, 0x75, 0x17, + 0x39, 0x0E, 0x19, 0x11, 0xEE, 0x02, 0x39, 0x07, 0xFA, 0x02, 0x88, 0x03, + 0x19, 0x11, 0x1A, 0x0F, 0x7C, 0x14, 0x66, 0x18, 0xBB, 0x16, 0x61, 0x21, + 0x0F, 0x15, 0xA9, 0x2A, 0x4F, 0x08, 0xB8, 0x29, 0xAB, 0x0E, 0x2F, 0x24, + 0xAC, 0x23, 0xBA, 0x1D, 0xA8, 0x25, 0x9D, 0x19, 0xFB, 0x1F, 0x34, 0x22, + 0x45, 0x23, 0x3F, 0x32, 0x3A, 0x24, 0xE1, 0x34, 0x6E, 0x23, 0xBC, 0x2A, + 0xF1, 0x22, 0x86, 0x20, 0x0D, 0x1C, 0x9B, 0x11, 0x19, 0x1B, 0x46, 0x02, + 0xD5, 0x25, 0x76, 0xFE, 0xED, 0x2A, 0x8E, 0x00, 0xC4, 0x27, 0xD9, 0x05, + 0x31, 0x24, 0x85, 0x0A, 0xC0, 0x27, 0xC5, 0x07, 0x9E, 0x29, 0x8A, 0x00, + 0x4E, 0x1D, 0xE5, 0xF8, 0x12, 0x16, 0x84, 0xF1, 0xC8, 0x19, 0xA3, 0xE9, + 0x73, 0x19, 0xE2, 0xEB, 0xAD, 0x16, 0x9D, 0xF6, 0xD5, 0x18, 0x8E, 0x06, + 0xA2, 0x16, 0xC5, 0x16, 0xAE, 0x10, 0x01, 0x1A, 0x5E, 0x10, 0xF2, 0x16, + 0x66, 0x06, 0xD8, 0x12, 0x1D, 0xF4, 0xA6, 0x0B, 0x53, 0xED, 0x06, 0x07, + 0x52, 0xEC, 0x9F, 0x02, 0xD3, 0xEB, 0x01, 0x02, 0x78, 0xEB, 0xD0, 0x01, + 0xC4, 0xED, 0x04, 0xFD, 0x31, 0xF0, 0x14, 0xFE, 0xC2, 0xE6, 0xDC, 0x02, + 0x0C, 0xE2, 0x4F, 0x09, 0x74, 0xF3, 0xD2, 0x18, 0x00, 0x00, 0x24, 0x20, + 0x54, 0xF9, 0x13, 0x13, 0xB2, 0xF1, 0xD5, 0x08, 0x81, 0xE9, 0x16, 0x08, + 0xDF, 0xE1, 0x49, 0x07, 0x68, 0xE2, 0x60, 0x04, 0xB8, 0xE7, 0x15, 0xFB, + 0x86, 0xEF, 0x1B, 0xEA, 0x3D, 0xFF, 0xE4, 0xE5, 0x2C, 0x09, 0x1E, 0xF4, + 0x47, 0x03, 0x05, 0xFF, 0x90, 0x03, 0x68, 0x07, 0x26, 0x06, 0x2F, 0x0E, + 0xB7, 0x01, 0xB2, 0x0C, 0xE6, 0x03, 0xB2, 0x08, 0x0A, 0x04, 0x0E, 0x00, + 0x0D, 0x06, 0x41, 0xFB, 0xE1, 0x0B, 0x28, 0xFB, 0xE8, 0xFF, 0xA0, 0xF0, + 0x67, 0xF0, 0x80, 0xEE, 0xFB, 0xF3, 0xD0, 0xFA, 0xB6, 0xF9, 0xA2, 0xF8, + 0xF0, 0xF1, 0xCE, 0xED, 0xC2, 0xEE, 0xAA, 0xF4, 0xD4, 0xF7, 0xE3, 0xFC, + 0x45, 0xFC, 0xA1, 0xF5, 0x19, 0xFB, 0x1C, 0xEE, 0x3D, 0xF6, 0x7C, 0xE8, + 0x79, 0xED, 0x35, 0xE1, 0xA8, 0xE6, 0x03, 0xDE, 0xBF, 0xEA, 0xF3, 0xEA, + 0x57, 0xF3, 0xAD, 0xFA, 0xE4, 0xF4, 0x83, 0xF2, 0x02, 0x00, 0x97, 0xDE, + 0x7B, 0x18, 0xDC, 0xDB, 0xFA, 0x27, 0x70, 0xEC, 0xA2, 0x1D, 0x85, 0xF5, + 0xBF, 0x05, 0x50, 0xF3, 0x1E, 0xF8, 0xE7, 0xF0, 0x42, 0xF8, 0xB0, 0xEE, + 0xFA, 0xF6, 0x1B, 0xF3, 0x8C, 0xEE, 0x44, 0xF9, 0x76, 0xEB, 0xAD, 0xF7, + 0xFA, 0xEB, 0x29, 0xF2, 0x6B, 0xEB, 0x65, 0xEF, 0x63, 0xEC, 0x74, 0xF3, + 0xA1, 0xEE, 0x22, 0x00, 0xF1, 0xF7, 0x89, 0x0A, 0x1D, 0x02, 0xEC, 0x04, + 0xD7, 0x05, 0xA3, 0xF5, 0xB0, 0x09, 0xB4, 0xEE, 0x90, 0x01, 0xE8, 0xF6, + 0xD5, 0xE6, 0xF5, 0xF9, 0x1E, 0xD8, 0x48, 0xF2, 0xEE, 0xDB, 0x0C, 0xF2, + 0x5A, 0xD8, 0x5E, 0xEF, 0xD3, 0xDB, 0xC4, 0xE7, 0xEC, 0xEB, 0x81, 0xE5, + 0x40, 0xF2, 0xB9, 0xDE, 0xCD, 0xF4, 0x33, 0xD5, 0x1B, 0xF6, 0xDE, 0xCF, + 0x7B, 0xF0, 0x9A, 0xD2, 0xDC, 0xEA, 0x5A, 0xDD, 0x26, 0xE7, 0x89, 0xE7, + 0x82, 0xDE, 0xDB, 0xE8, 0xEF, 0xDD, 0x24, 0xE6, 0x25, 0xE9, 0xCC, 0xE6, + 0x7A, 0xF3, 0x46, 0xE9, 0x9F, 0xF8, 0xEE, 0xEB, 0x6C, 0xF6, 0xA3, 0xF0, + 0xD3, 0xF6, 0x64, 0xFC, 0x7F, 0xF8, 0x9C, 0x0D, 0xFA, 0xF5, 0x25, 0x1C, + 0x1B, 0xF4, 0x0E, 0x20, 0x1C, 0xFE, 0x67, 0x21, 0xCC, 0x0A, 0xDF, 0x1B, + 0xAE, 0x04, 0xCE, 0x0B, 0xA0, 0xF8, 0x13, 0x0B, 0x71, 0xF9, 0xC1, 0x1E, + 0xC9, 0xFC, 0xD9, 0x28, 0x93, 0x01, 0x92, 0x23, 0xB2, 0x0C, 0x29, 0x1D, + 0xEF, 0x0E, 0x64, 0x14, 0x86, 0x0C, 0x04, 0x10, 0x7D, 0x0C, 0xFB, 0x11, + 0xC6, 0x06, 0x0D, 0x0D, 0xDE, 0x04, 0xEE, 0x09, 0xFB, 0x0C, 0x57, 0x0B, + 0xDD, 0x19, 0xB7, 0x0B, 0x8A, 0x20, 0x69, 0x11, 0x1E, 0x1B, 0xF1, 0x15, + 0x08, 0x12, 0x30, 0x14, 0x97, 0x12, 0x07, 0x11, 0x2D, 0x15, 0x4D, 0x09, + 0x2B, 0x18, 0xAB, 0x05, 0x15, 0x22, 0xC7, 0x0A, 0x5B, 0x1F, 0x88, 0x0B, + 0xF6, 0x14, 0x10, 0x0F, 0x59, 0x18, 0x1A, 0x1D, 0x07, 0x1F, 0xDC, 0x24, + 0x26, 0x1D, 0x28, 0x21, 0x11, 0x18, 0x2B, 0x18, 0x12, 0x1C, 0x1D, 0x11, + 0xEF, 0x27, 0xCC, 0x11, 0x36, 0x2B, 0xC0, 0x19, 0x57, 0x1F, 0xD9, 0x27, + 0xC6, 0x10, 0x68, 0x2D, 0x0A, 0x14, 0x60, 0x1E, 0xAD, 0x23, 0x35, 0x0C, + 0x53, 0x22, 0xB5, 0x03, 0xD1, 0x18, 0x57, 0x03, 0x93, 0x17, 0xB3, 0x03, + 0x20, 0x0B, 0xE0, 0xFD, 0x93, 0xFE, 0xA3, 0xFF, 0xC4, 0x04, 0xF3, 0x04, + 0xE6, 0x0F, 0x7F, 0x04, 0x0B, 0x15, 0xE9, 0x08, 0xAC, 0x13, 0x09, 0x0B, + 0x28, 0x0A, 0x4F, 0x04, 0xBD, 0x01, 0xAF, 0xFD, 0xBD, 0x09, 0x2D, 0xFC, + 0x46, 0x13, 0xB7, 0x00, 0x6E, 0x08, 0x64, 0x09, 0x04, 0xF2, 0x52, 0x10, + 0x2E, 0xE9, 0xF0, 0x11, 0x86, 0xF0, 0xCC, 0x13, 0xF2, 0xF5, 0x54, 0x12, + 0xE3, 0xF0, 0x22, 0x02, 0x5A, 0xEC, 0x7E, 0xF4, 0xFF, 0xEF, 0x25, 0xF7, + 0xE2, 0xF6, 0x20, 0xFA, 0x4A, 0xF9, 0x08, 0xF4, 0x53, 0xEF, 0x63, 0xF2, + 0x75, 0xDB, 0xE9, 0xEE, 0xB1, 0xCF, 0x34, 0xE1, 0x14, 0xD6, 0x01, 0xE1, + 0xE2, 0xDE, 0xC0, 0xE4, 0xFD, 0xE9, 0xE7, 0xDB, 0x2F, 0xF9, 0x3E, 0xD5, + 0x15, 0xFA, 0xA1, 0xD5, 0x6E, 0xEF, 0xEA, 0xD6, 0x06, 0xE9, 0xE9, 0xD7, + 0x6A, 0xE5, 0xBD, 0xD9, 0x33, 0xE3, 0xBF, 0xD6, 0x86, 0xEB, 0xF2, 0xCE, + 0xF8, 0xF4, 0xED, 0xCF, 0xD3, 0xF0, 0x55, 0xD9, 0x18, 0xEE, 0xB3, 0xE6, + 0x5B, 0xF6, 0xC4, 0xFB, 0xCC, 0xF8, 0xD2, 0x0A, 0xDB, 0xF3, 0x67, 0x0D, + 0x40, 0xF3, 0x6A, 0x09, 0x35, 0xF7, 0x03, 0x04, 0x1F, 0x00, 0x5A, 0x02, + 0xD9, 0x07, 0x21, 0x07, 0x70, 0x04, 0x4C, 0x12, 0x01, 0x00, 0xB7, 0x11, + 0xE8, 0x03, 0xE3, 0x06, 0x80, 0x02, 0x6D, 0x06, 0xAC, 0xF2, 0x38, 0x06, + 0x7F, 0xE8, 0x48, 0x03, 0x57, 0xF5, 0x88, 0x06, 0x43, 0x02, 0xA7, 0x01, + 0x6F, 0xFE, 0x58, 0xF3, 0x0C, 0xF5, 0x22, 0xF2, 0x31, 0xE7, 0x89, 0xFA, + 0x37, 0xDC, 0xE7, 0xF9, 0x6A, 0xE0, 0x07, 0xF0, 0x1D, 0xEE, 0x44, 0xE5, + 0xFE, 0xFB, 0x07, 0xE2, 0x55, 0x04, 0x94, 0xE3, 0x63, 0x07, 0x96, 0xE7, + 0xFE, 0x02, 0x33, 0xF2, 0x18, 0xF8, 0xF0, 0x00, 0xA0, 0xEF, 0x9E, 0x09, + 0x63, 0xED, 0x92, 0x09, 0x38, 0xF6, 0x35, 0x04, 0xBD, 0xFF, 0x56, 0xF8, + 0xFA, 0xFA, 0xF3, 0xEC, 0x0E, 0xF7, 0xC9, 0xE8, 0x94, 0x01, 0x78, 0xED, + 0x65, 0x02, 0xAA, 0xE8, 0x34, 0xF2, 0x83, 0xD8, 0xDD, 0xEB, 0x88, 0xD8, + 0xCC, 0xEA, 0x1E, 0xE8, 0xFC, 0xE4, 0x3C, 0xF5, 0x0F, 0xE3, 0x4D, 0xF8, + 0xA6, 0xE2, 0xF8, 0xF2, 0x7B, 0xED, 0x8A, 0xEE, 0x26, 0x02, 0x38, 0xF0, + 0xB9, 0x07, 0x9B, 0xF1, 0x66, 0xF9, 0xB2, 0xEF, 0x63, 0xEE, 0xB1, 0xF1, + 0xC1, 0xEC, 0x2F, 0xF5, 0xAA, 0xEF, 0xD0, 0xF1, 0x28, 0xFE, 0xE2, 0xEE, + 0x9D, 0x0E, 0xD8, 0xF5, 0xA5, 0x09, 0x9D, 0xF8, 0x6A, 0xFB, 0x52, 0xF4, + 0xE7, 0xFB, 0xCA, 0xF9, 0xDB, 0xF6, 0x45, 0x02, 0x52, 0xEC, 0x2E, 0x03, + 0xE0, 0xF3, 0x6D, 0x02, 0xBD, 0x02, 0x8C, 0x08, 0xC8, 0x01, 0xED, 0x0F, + 0xB9, 0xFA, 0x24, 0x12, 0xB1, 0xFD, 0x74, 0x17, 0xAF, 0x04, 0x5D, 0x21, + 0x97, 0x0D, 0x14, 0x27, 0xFF, 0x0F, 0xF3, 0x27, 0x50, 0x0F, 0x9F, 0x2D, + 0x1B, 0x19, 0x03, 0x33, 0xEA, 0x23, 0x22, 0x29, 0x80, 0x23, 0x61, 0x1F, + 0x33, 0x18, 0x16, 0x21, 0x07, 0x0F, 0x6E, 0x22, 0x7E, 0x13, 0x74, 0x20, + 0x02, 0x23, 0xCA, 0x21, 0xFE, 0x2E, 0x3B, 0x25, 0xD4, 0x34, 0x17, 0x28, + 0x26, 0x40, 0x38, 0x2F, 0x41, 0x4A, 0x22, 0x33, 0x42, 0x46, 0x09, 0x29, + 0xC7, 0x3B, 0x87, 0x21, 0x86, 0x36, 0x1F, 0x27, 0x86, 0x3B, 0x39, 0x2D, + 0x64, 0x3E, 0x4F, 0x33, 0xD0, 0x34, 0x26, 0x34, 0x48, 0x2F, 0xE1, 0x2A, + 0x78, 0x39, 0x77, 0x28, 0x4F, 0x42, 0x98, 0x28, 0x79, 0x36, 0x17, 0x17, + 0xA8, 0x26, 0x9B, 0x09, 0xCE, 0x1F, 0x95, 0x15, 0x66, 0x14, 0x30, 0x1B, + 0xC4, 0x0A, 0x35, 0x16, 0x1D, 0x08, 0xDE, 0x1A, 0x95, 0x06, 0x56, 0x19, + 0x4A, 0x06, 0x8C, 0x0C, 0x12, 0x05, 0x70, 0x0A, 0x37, 0x01, 0x65, 0x0F, + 0xE3, 0x00, 0xF4, 0x10, 0x92, 0x09, 0x47, 0x12, 0xDE, 0x12, 0x6F, 0x12, + 0x07, 0x0D, 0xCB, 0x0F, 0x2D, 0x02, 0x4C, 0x0A, 0xED, 0xF9, 0xA1, 0xFF, + 0xD2, 0xF1, 0x60, 0xF0, 0x2A, 0xF0, 0x8A, 0xE9, 0x4F, 0xF2, 0x9D, 0xEE, + 0xC5, 0xF2, 0x8C, 0xF2, 0xF4, 0xF6, 0x1D, 0xF6, 0x33, 0xFD, 0xB0, 0xF6, + 0xB3, 0xFA, 0x0F, 0xEE, 0xEF, 0xF5, 0x3E, 0xEA, 0x39, 0xF5, 0x4A, 0xED, + 0x27, 0xF6, 0xED, 0xE5, 0x6F, 0xFC, 0xCA, 0xDA, 0xFB, 0xFE, 0x41, 0xDE, + 0x03, 0xF1, 0xAF, 0xEF, 0x28, 0xE0, 0xDF, 0xFB, 0x03, 0xDC, 0xA2, 0xF1, + 0x9B, 0xDA, 0x5C, 0xD8, 0xC1, 0xD9, 0xA8, 0xC7, 0xAA, 0xD6, 0x61, 0xCB, + 0xBA, 0xC4, 0x47, 0xCF, 0x11, 0xB6, 0x89, 0xCC, 0xF0, 0xC0, 0x03, 0xD0, + 0xAE, 0xD1, 0x1A, 0xD1, 0x85, 0xD2, 0x68, 0xCD, 0x51, 0xD1, 0x34, 0xD2, + 0xFC, 0xCC, 0x56, 0xD6, 0x70, 0xBF, 0x70, 0xD1, 0xCC, 0xC1, 0xA2, 0xCD, + 0x5B, 0xD5, 0x26, 0xD0, 0x45, 0xE1, 0x97, 0xE0, 0x23, 0xE5, 0x58, 0xF2, + 0x7A, 0xEE, 0x84, 0xF5, 0x03, 0xF5, 0x23, 0xF1, 0xAC, 0xF3, 0xE9, 0xEC, + 0x42, 0xF3, 0x7E, 0xE9, 0x3B, 0xF5, 0x98, 0xEC, 0xCD, 0xF3, 0x59, 0xF5, + 0x93, 0xF4, 0xD4, 0xF2, 0x83, 0xFB, 0xF4, 0xF0, 0x3C, 0x00, 0x66, 0x01, + 0x84, 0x01, 0x30, 0x11, 0x11, 0x00, 0x2A, 0x13, 0x08, 0xFD, 0x62, 0x12, + 0x7F, 0x02, 0xB1, 0x17, 0x9D, 0x14, 0x8D, 0x1D, 0x34, 0x25, 0x66, 0x22, + 0x48, 0x24, 0x2F, 0x23, 0x23, 0x1E, 0x50, 0x24, 0xFC, 0x20, 0xF7, 0x2A, + 0x14, 0x1A, 0x7F, 0x2C, 0xD7, 0x08, 0xFC, 0x29, 0x6D, 0x01, 0xCD, 0x23, + 0x02, 0x09, 0xE0, 0x1C, 0xF2, 0x19, 0xAC, 0x17, 0xC9, 0x25, 0xDB, 0x0C, + 0x23, 0x2A, 0x0E, 0x07, 0x7F, 0x29, 0x03, 0x0A, 0x54, 0x24, 0xDD, 0x08, + 0x4D, 0x1E, 0x0B, 0x05, 0x2C, 0x17, 0xCE, 0x02, 0xCE, 0x0E, 0xD5, 0xFD, + 0x07, 0x0B, 0x33, 0xFA, 0x57, 0x0F, 0xF7, 0xFF, 0x02, 0x0C, 0xF2, 0xFF, + 0x15, 0x07, 0x4D, 0xFA, 0xF2, 0x0E, 0xE8, 0x02, 0x9A, 0x15, 0xF3, 0x0A, + 0xE6, 0x16, 0x61, 0x0B, 0xCB, 0x14, 0xF6, 0x0C, 0xA2, 0x08, 0x03, 0x08, + 0x46, 0xFB, 0xA8, 0xFC, 0x42, 0xF9, 0xE0, 0xF4, 0xE9, 0xF5, 0x64, 0xF9, + 0xA7, 0xE5, 0xD3, 0x03, 0xF0, 0xDA, 0x05, 0x09, 0x13, 0xDF, 0x53, 0x05, + 0x5C, 0xE7, 0xB9, 0xFE, 0x3B, 0xF3, 0x72, 0xFB, 0x98, 0xFC, 0x34, 0xF9, + 0x26, 0xFB, 0x40, 0xF7, 0x03, 0xFB, 0x1F, 0xFA, 0xAD, 0xF9, 0x09, 0xFA, + 0xDA, 0xF2, 0x1E, 0xF7, 0xD2, 0xEA, 0xF1, 0xF8, 0x67, 0xE3, 0xF6, 0xF3, + 0x70, 0xDD, 0x8B, 0xE3, 0xCE, 0xDD, 0xEB, 0xDE, 0x22, 0xE4, 0x37, 0xE7, + 0xD4, 0xE4, 0x60, 0xE8, 0x12, 0xE5, 0xBC, 0xE9, 0xCB, 0xE7, 0xB6, 0xE9, + 0x96, 0xE9, 0x9D, 0xE0, 0x77, 0xED, 0xA5, 0xDF, 0xE3, 0xED, 0x95, 0xF0, + 0x54, 0xE7, 0xF6, 0xFA, 0x2A, 0xEE, 0xA9, 0xF1, 0x5C, 0xFE, 0x57, 0xE5, + 0xAD, 0x00, 0x90, 0xDF, 0x2C, 0xFA, 0x52, 0xE4, 0xAD, 0xF5, 0x62, 0xF4, + 0x78, 0xEA, 0x5B, 0xFC, 0x00, 0xE1, 0x04, 0xF8, 0xB9, 0xEF, 0xD8, 0xEE, + 0xE1, 0x08, 0x60, 0xEB, 0x91, 0x0F, 0x15, 0xF8, 0x5F, 0x08, 0xCD, 0x03, + 0x67, 0x02, 0x2F, 0x02, 0xD9, 0x02, 0x8D, 0x04, 0x19, 0x08, 0x8F, 0x0A, + 0x6D, 0x0F, 0x84, 0x08, 0xB4, 0x17, 0xBB, 0x07, 0xF8, 0x17, 0x17, 0x07, + 0x83, 0x17, 0xC6, 0x03, 0x1F, 0x1F, 0x43, 0x09, 0x96, 0x1C, 0x24, 0x12, + 0x3E, 0x15, 0x4F, 0x15, 0x3A, 0x1C, 0xA6, 0x1B, 0x23, 0x26, 0x6B, 0x25, + 0xD3, 0x2D, 0x23, 0x2B, 0xCA, 0x33, 0x8B, 0x2F, 0xB3, 0x2B, 0x2D, 0x31, + 0x3D, 0x1D, 0x0D, 0x31, 0x4A, 0x16, 0xE7, 0x33, 0x17, 0x10, 0x4F, 0x32, + 0x17, 0x0D, 0xE2, 0x32, 0xAE, 0x14, 0xE3, 0x3B, 0x3C, 0x1A, 0xD7, 0x3A, + 0xA4, 0x1A, 0x6E, 0x32, 0xF9, 0x1E, 0x8B, 0x2B, 0x8B, 0x24, 0x7C, 0x26, + 0xA0, 0x20, 0x29, 0x24, 0x35, 0x18, 0x63, 0x22, 0xD5, 0x16, 0xDC, 0x20, + 0xBD, 0x1C, 0xFB, 0x1B, 0x6A, 0x1F, 0x1F, 0x11, 0xFF, 0x1B, 0xE7, 0x03, + 0xA2, 0x1B, 0x6C, 0xFB, 0xE6, 0x14, 0x57, 0xF9, 0x17, 0x00, 0xCE, 0xF3, + 0x84, 0xF1, 0x13, 0xE8, 0x44, 0xF3, 0x80, 0xDB, 0xDE, 0xFC, 0x0E, 0xD6, + 0x3A, 0xFE, 0x9E, 0xD4, 0xDB, 0xF5, 0x62, 0xD8, 0x7B, 0xF2, 0xDB, 0xE4, + 0x31, 0xEF, 0x2E, 0xE1, 0x2E, 0xED, 0x08, 0xCF, 0xCE, 0xEA, 0xB4, 0xCD, + 0x47, 0xDD, 0xD6, 0xD9, 0xED, 0xD3, 0x2A, 0xE4, 0xE3, 0xCF, 0x6F, 0xE4, + 0x56, 0xCE, 0x89, 0xE2, 0x8B, 0xD8, 0x44, 0xE5, 0xF2, 0xDF, 0xE1, 0xE5, + 0xCD, 0xD2, 0xC0, 0xE1, 0xFB, 0xCC, 0xF8, 0xE0, 0x97, 0xD6, 0x33, 0xDC, + 0xE2, 0xD7, 0x55, 0xD0, 0x20, 0xDC, 0x73, 0xD6, 0x15, 0xDF, 0x1D, 0xE1, + 0xB9, 0xD4, 0x08, 0xE0, 0xA0, 0xCA, 0x3F, 0xE4, 0xD6, 0xC9, 0xCF, 0xE3, + 0x1C, 0xCF, 0xCA, 0xDD, 0x7F, 0xCE, 0x69, 0xDF, 0x53, 0xC7, 0xB5, 0xDD, + 0x07, 0xCE, 0x74, 0xDA, 0x83, 0xE5, 0x67, 0xE4, 0x50, 0xF9, 0x79, 0xF9, + 0xB6, 0xFC, 0x3A, 0x03, 0xE1, 0xFC, 0xA3, 0xFD, 0xC2, 0x02, 0x27, 0xFB, + 0x14, 0xFF, 0x78, 0xF7, 0x9C, 0xF4, 0x1F, 0xF3, 0x70, 0xF4, 0xBF, 0x02, + 0x92, 0xF5, 0xB5, 0x14, 0xC9, 0xF9, 0x75, 0x17, 0x49, 0x0B, 0xE5, 0x13, + 0x39, 0x1B, 0x99, 0x0E, 0xFD, 0x1B, 0xD3, 0x0D, 0xE4, 0x15, 0x26, 0x11, + 0x9E, 0x12, 0xBB, 0x13, 0x78, 0x11, 0x87, 0x11, 0xA1, 0x19, 0xBC, 0x11, + 0x3E, 0x25, 0x7F, 0x1C, 0x2F, 0x27, 0x13, 0x25, 0xAE, 0x1F, 0x20, 0x1F, + 0x0E, 0x12, 0x52, 0x12, 0x90, 0x0A, 0xC4, 0x0B, 0xA7, 0x0D, 0xE8, 0x05, + 0xF8, 0x15, 0x29, 0xFF, 0xDB, 0x21, 0xA9, 0x04, 0x6E, 0x20, 0xE4, 0x09, + 0x6D, 0x14, 0x30, 0x08, 0xD5, 0x0E, 0x17, 0x0F, 0x83, 0x0C, 0xD7, 0x13, + 0x98, 0x08, 0x10, 0x07, 0x9D, 0x04, 0x16, 0xF8, 0x72, 0x06, 0x82, 0xF2, + 0x0E, 0x0D, 0x9D, 0xF6, 0x16, 0x0D, 0x2A, 0x02, 0x34, 0x08, 0xA6, 0x0C, + 0xE9, 0x08, 0x6F, 0x18, 0xE4, 0x08, 0xBE, 0x1D, 0x34, 0x01, 0xF8, 0x11, + 0xC2, 0xFE, 0x70, 0x03, 0xC6, 0x03, 0x09, 0x02, 0x05, 0x06, 0x73, 0x0A, + 0xD7, 0x04, 0xF4, 0x0F, 0xD3, 0xFE, 0xC4, 0x0F, 0x33, 0xF1, 0x21, 0x0E, + 0xD8, 0xE3, 0xD6, 0x03, 0x42, 0xE7, 0xA4, 0xF5, 0x39, 0xF2, 0x6D, 0xE9, + 0x11, 0xF4, 0xA1, 0xDC, 0xF6, 0xF3, 0x6C, 0xDE, 0xE6, 0xF1, 0x84, 0xEA, + 0xBC, 0xEC, 0xE1, 0xE8, 0x13, 0xF7, 0xED, 0xE8, 0xC8, 0x07, 0xEE, 0xF2, + 0xC5, 0x05, 0xBD, 0xF4, 0xCC, 0x00, 0x1C, 0xEE, 0x47, 0x02, 0x01, 0xEB, + 0x07, 0xF9, 0xD0, 0xE9, 0x71, 0xEE, 0xBE, 0xE1, 0x50, 0xEA, 0xAD, 0xD4, + 0xB4, 0xE2, 0xD4, 0xCF, 0x5D, 0xE7, 0x6C, 0xDF, 0xAC, 0xF1, 0x00, 0xED, + 0x56, 0xF3, 0x76, 0xEF, 0x1D, 0xF7, 0xBF, 0xF7, 0xA9, 0xFD, 0xF6, 0xFB, + 0x40, 0x01, 0xE3, 0xF5, 0x06, 0x00, 0x27, 0xFC, 0x70, 0xFF, 0xF5, 0x12, + 0x93, 0xFD, 0x1C, 0x21, 0xD2, 0xF4, 0x10, 0x1B, 0xCD, 0xF3, 0x56, 0x13, + 0x05, 0xFA, 0xA5, 0x15, 0xAF, 0xFE, 0x32, 0x1A, 0xFE, 0x07, 0xDC, 0x1F, + 0x16, 0x0F, 0x64, 0x1F, 0xF0, 0x0A, 0x25, 0x1A, 0x3A, 0x03, 0x38, 0x1D, + 0x8A, 0x06, 0x76, 0x23, 0x2E, 0x10, 0xF1, 0x21, 0x58, 0x10, 0x21, 0x18, + 0x6B, 0x0D, 0x21, 0x12, 0x20, 0x12, 0xEB, 0x14, 0xDF, 0x1A, 0xE8, 0x1E, + 0x72, 0x22, 0x58, 0x24, 0x41, 0x24, 0x58, 0x16, 0xCB, 0x26, 0xEB, 0x0F, + 0x55, 0x32, 0x2A, 0x2A, 0x90, 0x36, 0xF1, 0x41, 0x72, 0x2E, 0x1B, 0x3F, + 0x62, 0x27, 0x0A, 0x32, 0x40, 0x2E, 0x72, 0x28, 0x6B, 0x3E, 0x24, 0x22, + 0xA8, 0x3D, 0x9D, 0x1F, 0x05, 0x28, 0xE5, 0x1C, 0xC3, 0x0F, 0x27, 0x0A, + 0x71, 0x06, 0xA8, 0xF3, 0x95, 0x0B, 0xC9, 0xF1, 0x1A, 0x0E, 0x09, 0xFA, + 0xA6, 0x0D, 0x54, 0xFF, 0xE8, 0x09, 0xBD, 0xFA, 0x22, 0xFD, 0x91, 0xEE, + 0xAE, 0xF1, 0x17, 0xEB, 0x35, 0xE3, 0xD3, 0xEA, 0x3A, 0xDD, 0x73, 0xED, + 0x58, 0xE9, 0x7F, 0xF4, 0x80, 0xF5, 0x84, 0xF4, 0x1E, 0xFE, 0x65, 0xEF, + 0xF6, 0x00, 0x9C, 0xEB, 0x95, 0xF1, 0x33, 0xE2, 0x5C, 0xDA, 0x53, 0xD2, + 0xA3, 0xCE, 0xA7, 0xC5, 0x27, 0xCD, 0x43, 0xC3, 0xC0, 0xD4, 0x7F, 0xCE, + 0xFF, 0xE0, 0xAE, 0xD7, 0x97, 0xE7, 0xB3, 0xD7, 0x6D, 0xED, 0x08, 0xDA, + 0xE0, 0xEA, 0xE0, 0xDC, 0x2B, 0xDC, 0xC2, 0xDD, 0x9C, 0xD0, 0x52, 0xDF, + 0xD9, 0xD3, 0xB1, 0xE5, 0xED, 0xE3, 0x17, 0xF2, 0x20, 0xE7, 0x0C, 0xF3, + 0xFD, 0xE2, 0x6E, 0xED, 0xD9, 0xE2, 0x81, 0xF2, 0x69, 0xDF, 0xE0, 0xFC, + 0x9C, 0xE1, 0x25, 0x00, 0xA8, 0xDD, 0x8E, 0xF5, 0xCF, 0xC9, 0x53, 0xE0, + 0x22, 0xBE, 0x23, 0xD3, 0xC3, 0xC9, 0x3B, 0xDB, 0x88, 0xDA, 0x04, 0xE6, + 0x7D, 0xE7, 0x01, 0xE8, 0x1D, 0xF3, 0xE5, 0xDD, 0x64, 0xF9, 0x1D, 0xD4, + 0xBC, 0x01, 0x2C, 0xE5, 0x84, 0xFC, 0xDA, 0xEF, 0x39, 0xE8, 0x5A, 0xE4, + 0x72, 0xE2, 0x44, 0xE1, 0x1E, 0xEC, 0x39, 0xE9, 0x88, 0xF6, 0x10, 0xEF, + 0x44, 0xF8, 0x00, 0xEE, 0xFB, 0xF2, 0xCA, 0xEF, 0xD0, 0xFE, 0x9F, 0xFE, + 0x22, 0x11, 0xCD, 0x10, 0x41, 0x11, 0xD0, 0x17, 0x9D, 0x0E, 0x3B, 0x14, + 0xB8, 0x16, 0x56, 0x17, 0xC8, 0x1C, 0x4B, 0x1E, 0x4C, 0x20, 0xB4, 0x21, + 0x43, 0x29, 0x20, 0x28, 0x8F, 0x22, 0x7D, 0x2B, 0xF4, 0x08, 0xC8, 0x24, + 0x6A, 0xFE, 0x5E, 0x1A, 0x3C, 0x06, 0x62, 0x18, 0x75, 0x10, 0x49, 0x1E, + 0xAE, 0x1D, 0x44, 0x2C, 0x49, 0x21, 0x17, 0x35, 0x59, 0x17, 0x33, 0x2C, + 0x19, 0x17, 0x64, 0x23, 0x7E, 0x1B, 0x85, 0x1A, 0x4F, 0x1E, 0x2C, 0x1A, + 0x1D, 0x22, 0x54, 0x2A, 0x70, 0x1B, 0xE2, 0x30, 0x78, 0x10, 0x62, 0x24, + 0x96, 0x0D, 0x3D, 0x0B, 0x1B, 0x13, 0xC1, 0xF6, 0xF8, 0x14, 0x6C, 0xF3, + 0xA3, 0x14, 0x40, 0x04, 0x0B, 0x15, 0x23, 0x12, 0xEF, 0x17, 0x6A, 0x0C, + 0x11, 0x25, 0xA6, 0x0E, 0x46, 0x29, 0xAD, 0x11, 0x47, 0x25, 0x17, 0x0D, + 0x8E, 0x1D, 0xBC, 0x0F, 0x83, 0x0F, 0x48, 0x13, 0x29, 0x09, 0x70, 0x11, + 0x14, 0x03, 0x96, 0x05, 0xA0, 0xFA, 0x3A, 0xFC, 0x7A, 0xFF, 0xEC, 0x01, + 0x30, 0x01, 0xED, 0xFD, 0x8E, 0xF3, 0xBB, 0xEA, 0x8F, 0xF1, 0xA9, 0xE4, + 0xD5, 0xF5, 0x41, 0xE9, 0xC1, 0xEE, 0xA1, 0xE3, 0x85, 0xE8, 0x50, 0xD5, + 0xAE, 0xE1, 0x3B, 0xC8, 0xF3, 0xE3, 0xCB, 0xCB, 0xFE, 0xF0, 0x9E, 0xDB, + 0x00, 0xEA, 0x04, 0xDF, 0x57, 0xD1, 0x65, 0xD9, 0x9B, 0xCB, 0x4C, 0xDB, + 0x24, 0xDA, 0xAC, 0xDF, 0xBF, 0xEE, 0x20, 0xEB, 0xAF, 0xF9, 0xA1, 0xF6, + 0x98, 0xF8, 0x05, 0xF9, 0xE8, 0xFD, 0x0B, 0xFA, 0x60, 0xFB, 0x4F, 0xEF, + 0xCA, 0xF0, 0x0B, 0xEB, 0x3F, 0xE9, 0xE3, 0xF5, 0xCC, 0xE8, 0x7C, 0xFD, + 0xB1, 0xEC, 0xE0, 0x00, 0x46, 0xF0, 0x51, 0x09, 0x86, 0xF9, 0xEF, 0x16, + 0x81, 0xF7, 0xE8, 0x10, 0x01, 0xF3, 0x31, 0x07, 0xCB, 0xF8, 0x45, 0x15, + 0x4D, 0xF4, 0xCF, 0x1C, 0xA9, 0xF4, 0x5C, 0x10, 0x81, 0x04, 0x21, 0x02, + 0x94, 0x0B, 0x6C, 0xFD, 0x7D, 0x07, 0x2F, 0x02, 0xDA, 0x08, 0x8F, 0x0B, + 0x0C, 0x04, 0xF7, 0x0A, 0x81, 0x01, 0xB5, 0x04, 0xCC, 0x0B, 0x89, 0x05, + 0x9D, 0x0B, 0x9D, 0x07, 0x29, 0x08, 0xEB, 0x0A, 0x30, 0x0F, 0x01, 0x0A, + 0x53, 0x15, 0x4C, 0x01, 0xDB, 0x19, 0x47, 0xF7, 0xA3, 0x1C, 0xE8, 0xED, + 0xD9, 0x13, 0x46, 0xEC, 0x3D, 0x0A, 0xD6, 0xF4, 0x41, 0x0F, 0xB2, 0x02, + 0x89, 0x14, 0x92, 0x11, 0x0A, 0x14, 0x23, 0x1F, 0x05, 0x16, 0x52, 0x24, + 0xB1, 0x14, 0x93, 0x1B, 0x0F, 0x17, 0xED, 0x18, 0x8F, 0x12, 0x30, 0x18, + 0x5C, 0x00, 0x00, 0x16, 0x34, 0xF3, 0x09, 0x17, 0xFC, 0xEE, 0x5B, 0x10, + 0xB3, 0xEE, 0xE4, 0xFF, 0x4A, 0x00, 0x0D, 0xFA, 0x92, 0x16, 0x38, 0x06, + 0x5A, 0x1B, 0x0D, 0x18, 0x13, 0x16, 0x48, 0x1D, 0xEF, 0xFF, 0x55, 0x08, + 0xB3, 0xED, 0xBD, 0xF2, 0xDE, 0xF8, 0x0F, 0xF0, 0xBA, 0x00, 0xC3, 0xF5, + 0x4D, 0xF2, 0xBD, 0xFA, 0xE8, 0xEE, 0x9F, 0xFA, 0x3E, 0xFB, 0x72, 0xEF, + 0x3B, 0xFF, 0x3C, 0xE2, 0x0C, 0x00, 0xC3, 0xE7, 0xB7, 0xF5, 0xB8, 0xF0, + 0xB5, 0xE6, 0x71, 0xF0, 0x72, 0xEB, 0x95, 0xF0, 0xFE, 0xEF, 0x74, 0xF0, + 0x22, 0xEF, 0xCD, 0xEE, 0xD1, 0xEE, 0x1A, 0xE3, 0x07, 0xEE, 0x37, 0xDC, + 0x7E, 0xED, 0x6A, 0xE6, 0xEF, 0xE3, 0x54, 0xE5, 0x1A, 0xDC, 0x14, 0xDA, + 0xEA, 0xD4, 0x9C, 0xD0, 0x27, 0xD0, 0x19, 0xCC, 0x54, 0xCF, 0xE5, 0xC9, + 0xA6, 0xD4, 0xBD, 0xD0, 0x61, 0xE1, 0x09, 0xE2, 0xA3, 0xD7, 0xEE, 0xDD, + 0x06, 0xD2, 0x42, 0xD9, 0x30, 0xD7, 0x62, 0xDA, 0x1E, 0xD5, 0x58, 0xD7, + 0x78, 0xDD, 0x72, 0xD9, 0x2C, 0xE8, 0xF3, 0xDA, 0x22, 0xEC, 0x9F, 0xE6, + 0x0B, 0xED, 0xEE, 0xFA, 0x82, 0xF2, 0x1D, 0x05, 0xC7, 0xF5, 0x85, 0xF8, + 0x8A, 0xEE, 0xCA, 0xE5, 0x6F, 0xF4, 0xD4, 0xEB, 0xBE, 0x0B, 0x64, 0x04, + 0xF1, 0x10, 0xEF, 0x0F, 0xC3, 0x07, 0xED, 0x09, 0xCA, 0x07, 0x00, 0x08, + 0x56, 0x0F, 0x4F, 0x11, 0x95, 0x19, 0x60, 0x1F, 0x2C, 0x17, 0xA5, 0x25, + 0x1F, 0x08, 0xC4, 0x19, 0xD3, 0x08, 0xAF, 0x0F, 0x58, 0x1A, 0x8E, 0x1D, + 0xE9, 0x20, 0x35, 0x32, 0x8D, 0x1A, 0x5C, 0x36, 0x3E, 0x15, 0xAA, 0x2E, + 0xF1, 0x1A, 0x13, 0x2E, 0x54, 0x27, 0x12, 0x30, 0xF3, 0x25, 0x57, 0x2D, + 0x5F, 0x1D, 0xBA, 0x2E, 0x1E, 0x19, 0x41, 0x2B, 0xEB, 0x27, 0xDF, 0x2E, + 0x4E, 0x3E, 0x91, 0x35, 0x6B, 0x3C, 0xDE, 0x28, 0xF7, 0x38, 0x09, 0x2B, + 0xDB, 0x3C, 0xD6, 0x3A, 0xA8, 0x34, 0x94, 0x2D, 0xEB, 0x30, 0x5A, 0x18, + 0xAC, 0x38, 0xAA, 0x16, 0x95, 0x38, 0x57, 0x16, 0x29, 0x35, 0x35, 0x14, + 0xC6, 0x3A, 0x26, 0x19, 0xBF, 0x34, 0x61, 0x14, 0x13, 0x20, 0x45, 0x0E, + 0x54, 0x1C, 0xA3, 0x1E, 0x96, 0x26, 0xDD, 0x2A, 0xDE, 0x27, 0x57, 0x24, + 0xCB, 0x21, 0x04, 0x1B, 0x63, 0x24, 0xF7, 0x18, 0x90, 0x22, 0xB7, 0x1B, + 0x34, 0x0F, 0x39, 0x1A, 0xCD, 0xFF, 0xEF, 0x14, 0x99, 0xFF, 0xE3, 0x11, + 0x73, 0x0B, 0x6D, 0x12, 0x21, 0x11, 0x85, 0x12, 0x45, 0x07, 0x5C, 0x17, + 0x05, 0xFD, 0xA0, 0x17, 0x67, 0xF7, 0xB8, 0x0A, 0xF7, 0xF3, 0x47, 0xFD, + 0x16, 0xF2, 0xBD, 0xF6, 0x5C, 0xE9, 0xAE, 0xF6, 0xFF, 0xDD, 0xFE, 0xF8, + 0x15, 0xDC, 0x9A, 0xF4, 0x68, 0xD6, 0x1A, 0xE4, 0x3B, 0xD2, 0x94, 0xDD, + 0x3E, 0xDF, 0x22, 0xE7, 0x94, 0xE8, 0xE5, 0xE8, 0x9D, 0xE6, 0xF2, 0xDD, + 0xA1, 0xE8, 0xB3, 0xD6, 0xB3, 0xE9, 0x1E, 0xD8, 0x32, 0xE7, 0x7C, 0xE0, + 0x6E, 0xE5, 0x87, 0xE7, 0x8C, 0xE0, 0xFF, 0xE0, 0x97, 0xD4, 0xAE, 0xCE, + 0xF6, 0xC5, 0x04, 0xBF, 0x64, 0xC1, 0xC3, 0xC4, 0xCD, 0xBF, 0x3F, 0xC7, + 0x46, 0xC5, 0x3C, 0xC3, 0xEC, 0xD2, 0x0F, 0xCC, 0xB4, 0xD8, 0x2D, 0xCB, + 0xF8, 0xDB, 0x9B, 0xC5, 0xF2, 0xDB, 0x72, 0xC8, 0xA2, 0xD9, 0xA5, 0xCD, + 0xB8, 0xD4, 0x34, 0xD3, 0x39, 0xCF, 0x7A, 0xD4, 0xE7, 0xD3, 0xC6, 0xD7, + 0x93, 0xD9, 0x7D, 0xE6, 0xEC, 0xDF, 0x55, 0xF4, 0xED, 0xEC, 0x30, 0xF7, + 0x81, 0xF5, 0x1A, 0xF9, 0x28, 0xF8, 0x33, 0xFD, 0xD2, 0xFF, 0x7F, 0xFF, + 0x8A, 0x0E, 0x7C, 0xFC, 0x56, 0x1A, 0x43, 0xF8, 0x9C, 0x1E, 0xDA, 0xFD, + 0xD5, 0x21, 0x91, 0x10, 0xC1, 0x22, 0xDA, 0x19, 0x8C, 0x1D, 0xD4, 0x10, + 0x36, 0x16, 0xD5, 0x0C, 0x42, 0x0F, 0x6D, 0x12, 0xDE, 0x09, 0x2F, 0x16, + 0xBF, 0x0B, 0x62, 0x14, 0x50, 0x12, 0xD1, 0x14, 0xED, 0x17, 0x68, 0x28, + 0x04, 0x1B, 0x7F, 0x36, 0xDC, 0x20, 0x4A, 0x30, 0xF9, 0x24, 0xB0, 0x24, + 0x63, 0x1E, 0xFB, 0x1A, 0x78, 0x16, 0x2B, 0x1D, 0x56, 0x0C, 0x60, 0x24, + 0x72, 0x01, 0x6C, 0x25, 0x17, 0xF8, 0xDD, 0x13, 0xDC, 0xF6, 0x2F, 0x03, + 0x5B, 0x09, 0x79, 0x0A, 0xE1, 0x14, 0x11, 0x10, 0x00, 0x14, 0x15, 0x09, + 0x4E, 0x1A, 0xDC, 0x05, 0x01, 0x1E, 0x29, 0x0A, 0xE1, 0x13, 0x3D, 0x03, + 0x92, 0x08, 0x34, 0xF7, 0x89, 0x08, 0x61, 0xF6, 0xD8, 0x05, 0x1D, 0xF3, + 0xEB, 0xFA, 0x30, 0xED, 0x1D, 0xF3, 0x21, 0xEB, 0x14, 0xF2, 0x23, 0xEE, + 0x7F, 0xF0, 0x1A, 0xEC, 0x77, 0xEE, 0x99, 0xE5, 0x27, 0xF7, 0x60, 0xE6, + 0xCA, 0x00, 0x0F, 0xE7, 0x0F, 0xFF, 0xC3, 0xF1, 0xE6, 0xF0, 0xD8, 0xFC, + 0xEA, 0xE0, 0xE5, 0xF5, 0x85, 0xD9, 0xF8, 0xE9, 0xE0, 0xD8, 0x48, 0xDB, + 0x35, 0xDF, 0x28, 0xDD, 0x37, 0xDB, 0x98, 0xF5, 0xA4, 0xC8, 0x9C, 0x00, + 0x4A, 0xC7, 0x23, 0xFB, 0x35, 0xDA, 0xD7, 0xF4, 0x69, 0xE5, 0xF6, 0xE8, + 0x1D, 0xE6, 0x77, 0xDE, 0x03, 0xE8, 0x4C, 0xDC, 0xE9, 0xE6, 0xB3, 0xE0, + 0x3F, 0xE2, 0xCA, 0xEA, 0x67, 0xDF, 0x55, 0xE9, 0xD9, 0xE1, 0xE5, 0xE5, + 0x5E, 0xE5, 0x84, 0xEA, 0x72, 0xE5, 0xE2, 0xE5, 0xAD, 0xE5, 0x61, 0xE1, + 0x51, 0xE1, 0x79, 0xE3, 0x66, 0xE1, 0x55, 0xE6, 0x91, 0xF2, 0xE3, 0xEA, + 0xFD, 0x03, 0xA1, 0xEC, 0xFC, 0x08, 0x70, 0xEF, 0xA5, 0x05, 0x2F, 0xFA, + 0x2B, 0x02, 0x55, 0x0B, 0xEB, 0xFF, 0x82, 0x0F, 0xCE, 0xFD, 0xEA, 0x04, + 0xD1, 0xFE, 0x7D, 0x01, 0x35, 0x03, 0xE6, 0x05, 0xF0, 0x06, 0x9D, 0x08, + 0xCF, 0x0D, 0xDE, 0x0F, 0xED, 0x1A, 0x2F, 0x1B, 0xDB, 0x23, 0x4B, 0x1D, + 0x17, 0x23, 0x80, 0x1C, 0x66, 0x1E, 0x87, 0x1E, 0x32, 0x1F, 0x04, 0x20, + 0x6A, 0x28, 0x24, 0x1B, 0x4D, 0x37, 0x9E, 0x1B, 0xC1, 0x3E, 0x5D, 0x29, + 0xA8, 0x38, 0xAD, 0x30, 0x9D, 0x31, 0x67, 0x34, 0xCF, 0x2C, 0x58, 0x36, + 0xF6, 0x2F, 0x5B, 0x31, 0xFE, 0x34, 0xAD, 0x2E, 0xC4, 0x2B, 0x87, 0x28, + 0xEE, 0x2B, 0xED, 0x22, 0xE2, 0x35, 0x89, 0x22, 0x13, 0x34, 0x18, 0x23, + 0x5A, 0x2D, 0xD4, 0x2A, 0x2E, 0x27, 0x63, 0x35, 0x55, 0x1F, 0x30, 0x3A, + 0x0E, 0x21, 0x3A, 0x35, 0xAF, 0x30, 0x5A, 0x2A, 0x7F, 0x31, 0xBF, 0x27, + 0xF5, 0x20, 0x4B, 0x2C, 0xE4, 0x17, 0x06, 0x26, 0xF3, 0x0F, 0x82, 0x14, + 0x90, 0x03, 0x07, 0x0F, 0x0E, 0xFD, 0x03, 0x18, 0xD3, 0xFE, 0x3F, 0x1C, + 0xED, 0x01, 0xFB, 0x18, 0x6E, 0x02, 0x71, 0x10, 0xB3, 0x07, 0x59, 0x05, + 0x59, 0x10, 0xE9, 0xFD, 0xF5, 0x12, 0xF3, 0xFA, 0x1D, 0x0A, 0xC3, 0xF5, + 0x50, 0xF5, 0x39, 0xEE, 0x4A, 0xE5, 0x5D, 0xE6, 0xA4, 0xE8, 0xC3, 0xDA, + 0x30, 0xF3, 0x8D, 0xD2, 0x5E, 0xF3, 0xFB, 0xC6, 0x3A, 0xF0, 0x43, 0xBA, + 0x69, 0xF0, 0x7E, 0xBB, 0x8C, 0xE6, 0xD4, 0xC4, 0x97, 0xD5, 0xE0, 0xD1, + 0x85, 0xCC, 0xED, 0xDB, 0x1D, 0xCC, 0x08, 0xDB, 0x44, 0xD8, 0xE3, 0xD1, + 0x40, 0xE5, 0x93, 0xCD, 0x04, 0xD8, 0x6C, 0xD6, 0x77, 0xC1, 0xE8, 0xDC, + 0xFD, 0xB7, 0x52, 0xD7, 0x7A, 0xBD, 0x55, 0xD0, 0xAF, 0xCA, 0xA3, 0xD6, + 0xD8, 0xCF, 0xAA, 0xDF, 0x98, 0xD4, 0xCA, 0xDF, 0x90, 0xD9, 0x7A, 0xE2, + 0xED, 0xD8, 0x6A, 0xE5, 0x91, 0xDA, 0xE9, 0xDD, 0xD4, 0xD8, 0xE8, 0xDC, + 0xF9, 0xD4, 0x4F, 0xE8, 0x5A, 0xD8, 0xA0, 0xE9, 0xB0, 0xDA, 0x69, 0xE9, + 0x63, 0xD4, 0xEA, 0xEE, 0xCE, 0xD3, 0x47, 0xEC, 0x87, 0xE1, 0x3C, 0xE7, + 0x6C, 0xED, 0x22, 0xE1, 0x14, 0xEE, 0xE2, 0xDA, 0x26, 0xE7, 0xA5, 0xE0, + 0xDB, 0xDE, 0xFF, 0xE8, 0x25, 0xE4, 0x85, 0xEE, 0x18, 0xF4, 0xBD, 0xFC, + 0xAF, 0xFB, 0xCF, 0x08, 0x61, 0x02, 0xE9, 0x09, 0xD9, 0x0B, 0xD6, 0x07, + 0xCC, 0x09, 0x8A, 0x0A, 0xB2, 0x01, 0x36, 0x0C, 0x86, 0x01, 0x05, 0x02, + 0x65, 0x03, 0x49, 0xFA, 0xB0, 0xFF, 0x39, 0xFF, 0x5C, 0xFD, 0xE4, 0x05, + 0x38, 0x02, 0x3D, 0x07, 0x12, 0x09, 0x80, 0x0A, 0x0F, 0x0B, 0x62, 0x0A, + 0x26, 0x0C, 0x87, 0x07, 0x82, 0x0F, 0xCB, 0x13, 0x81, 0x14, 0x43, 0x1D, + 0xC7, 0x1A, 0x87, 0x18, 0x44, 0x21, 0x65, 0x1B, 0x2F, 0x28, 0x4F, 0x24, + 0x12, 0x2A, 0xF0, 0x1F, 0xE2, 0x2A, 0x4B, 0x1B, 0x55, 0x2C, 0xFF, 0x1C, + 0xBF, 0x2F, 0x29, 0x1A, 0x9D, 0x2F, 0x74, 0x15, 0x85, 0x23, 0xAB, 0x14, + 0xAF, 0x1A, 0x07, 0x18, 0x51, 0x1D, 0x2D, 0x1C, 0x0A, 0x21, 0xB3, 0x20, + 0x13, 0x1A, 0x54, 0x22, 0x10, 0x0E, 0x94, 0x15, 0x2E, 0x10, 0x58, 0x09, + 0xE2, 0x20, 0x23, 0x12, 0xCF, 0x29, 0x09, 0x1C, 0x29, 0x23, 0x32, 0x21, + 0x08, 0x19, 0x6F, 0x28, 0xAE, 0x11, 0x51, 0x22, 0x2B, 0x0D, 0xD4, 0x18, + 0x74, 0x0B, 0xF8, 0x1B, 0xD5, 0x08, 0xA9, 0x17, 0x69, 0x0A, 0x6F, 0x0D, + 0x29, 0x0A, 0x0B, 0x0E, 0x4C, 0x07, 0xE9, 0x11, 0xD9, 0x0E, 0x4C, 0x12, + 0xFB, 0x0E, 0x35, 0x0A, 0x89, 0x04, 0xCF, 0xFF, 0x61, 0x04, 0x4B, 0xFC, + 0xF5, 0x03, 0xC2, 0xFA, 0x75, 0xF6, 0xF7, 0xF8, 0x49, 0xF1, 0x82, 0xF7, + 0xE7, 0xF6, 0x70, 0xF3, 0xD6, 0xFB, 0x6C, 0xEE, 0xAB, 0xFF, 0x73, 0xEA, + 0xDA, 0xFC, 0x74, 0xE8, 0xD2, 0xF8, 0x2C, 0xEF, 0xFE, 0xFD, 0xCE, 0xEF, + 0x35, 0x0D, 0xD6, 0xE8, 0x4B, 0x17, 0x2B, 0xEA, 0x2A, 0x18, 0xFD, 0xF6, + 0xAA, 0x13, 0x1D, 0x05, 0x56, 0x05, 0x3D, 0x07, 0xA0, 0xF9, 0x93, 0x05, + 0x0D, 0xF8, 0x0C, 0x07, 0x95, 0xF3, 0x12, 0x05, 0x49, 0xF1, 0x4E, 0x07, + 0x17, 0xFF, 0xE2, 0x0F, 0xCA, 0x08, 0x35, 0x10, 0x08, 0x03, 0xDF, 0x11, + 0xFB, 0x01, 0x52, 0x1C, 0xC6, 0x0B, 0x49, 0x22, 0x72, 0x12, 0xB3, 0x20, + 0x93, 0x0B, 0x91, 0x16, 0x32, 0x08, 0xCA, 0x0F, 0x20, 0x09, 0x46, 0x11, + 0x9A, 0xFF, 0xF4, 0x0F, 0x6F, 0xF6, 0x59, 0x0F, 0x49, 0xF7, 0x65, 0x11, + 0xD1, 0xFC, 0xA5, 0x0F, 0x68, 0x03, 0x22, 0x0B, 0x93, 0x09, 0xA1, 0x07, + 0x94, 0x08, 0xC3, 0x0A, 0xD8, 0x07, 0xC3, 0x0F, 0x61, 0x15, 0xFA, 0x10, + 0x6C, 0x24, 0xA3, 0x13, 0x1F, 0x23, 0x31, 0x18, 0xC3, 0x16, 0xCA, 0x1E, + 0x21, 0x0D, 0x5D, 0x1F, 0xD8, 0x07, 0x01, 0x15, 0x4A, 0x06, 0x34, 0x09, + 0xC3, 0x06, 0x3C, 0x04, 0x7C, 0x07, 0x36, 0x06, 0x78, 0x0E, 0xD0, 0x05, + 0x38, 0x1C, 0x03, 0x04, 0x4A, 0x1E, 0x50, 0x06, 0x35, 0x0F, 0x92, 0x08, + 0xA3, 0x03, 0x77, 0x07, 0xBC, 0x01, 0xD0, 0x02, 0xF7, 0xFE, 0x1A, 0xFA, + 0xA9, 0xF6, 0xE3, 0xE6, 0x8E, 0xF1, 0x3F, 0xD7, 0xD9, 0xF0, 0xCE, 0xDA, + 0x48, 0xEC, 0x1A, 0xE0, 0x47, 0xE6, 0x76, 0xE4, 0xD0, 0xE0, 0x10, 0xEB, + 0xDB, 0xE4, 0x3C, 0xE8, 0x6E, 0xF3, 0xA3, 0xDC, 0x30, 0xFE, 0x6C, 0xD7, + 0x6F, 0x00, 0x8A, 0xDC, 0xC8, 0xF9, 0x36, 0xE1, 0xC6, 0xF2, 0x2B, 0xE1, + 0x6A, 0xF1, 0xEF, 0xDB, 0xFB, 0xE9, 0x60, 0xE0, 0x4E, 0xDA, 0x67, 0xE9, + 0xE5, 0xD1, 0x9B, 0xE0, 0x49, 0xD8, 0x7D, 0xD8, 0x2B, 0xE8, 0x04, 0xDE, + 0xEB, 0xF5, 0x36, 0xE2, 0x71, 0xF5, 0xEE, 0xE4, 0xA3, 0xEB, 0x7C, 0xEB, + 0xA2, 0xE3, 0x30, 0xF1, 0xED, 0xDB, 0x2D, 0xF7, 0x88, 0xD6, 0x1F, 0x01, + 0xF1, 0xD9, 0x8C, 0x06, 0x76, 0xDF, 0xCB, 0xFF, 0x81, 0xE2, 0xB2, 0xF9, + 0xAA, 0xE7, 0xEE, 0xFB, 0x63, 0xEE, 0x92, 0xF7, 0xC5, 0xF4, 0x5C, 0xF6, + 0x4E, 0xFA, 0x32, 0x01, 0x3E, 0xF2, 0x7C, 0x04, 0xE5, 0xE3, 0x24, 0xFB, + 0x9B, 0xE6, 0xE6, 0xEE, 0x66, 0xEE, 0x60, 0xE7, 0x94, 0xF3, 0x94, 0xE9, + 0xB2, 0xF7, 0x77, 0xEF, 0x3F, 0xF2, 0x5D, 0xEF, 0xCB, 0xF1, 0x52, 0xEB, + 0xFD, 0xFE, 0x6F, 0xED, 0xD7, 0x08, 0x3B, 0xF6, 0xCA, 0x09, 0xB1, 0xFC, + 0xBA, 0x05, 0x6B, 0x03, 0x23, 0x07, 0xF6, 0x0A, 0x5B, 0x11, 0x96, 0x07, + 0x1F, 0x18, 0x32, 0x03, 0xDA, 0x15, 0x65, 0x0D, 0x4A, 0x0F, 0x89, 0x1B, + 0x60, 0x06, 0x03, 0x1D, 0x1E, 0xFD, 0x44, 0x1A, 0x55, 0xF9, 0xC1, 0x1B, + 0x3A, 0xFE, 0xED, 0x13, 0xB8, 0x09, 0xF2, 0x08, 0xC0, 0x0F, 0x5D, 0x09, + 0xD7, 0x0A, 0xB0, 0x0B, 0x95, 0x08, 0x5B, 0x0F, 0xC2, 0x05, 0x8D, 0x18, + 0xF7, 0xFF, 0x02, 0x18, 0xA3, 0x06, 0x1F, 0x0D, 0xBE, 0x11, 0x58, 0x05, + 0xA1, 0x13, 0x0E, 0x00, 0x4E, 0x11, 0x74, 0xFB, 0x82, 0x0E, 0x10, 0xFD, + 0x95, 0x07, 0xD2, 0x01, 0x70, 0x02, 0x06, 0x05, 0x35, 0x05, 0xBF, 0x0D, + 0x2C, 0x10, 0xC2, 0x19, 0x08, 0x1C, 0xF4, 0x1A, 0x31, 0x1B, 0x65, 0x10, + 0xBE, 0x14, 0x61, 0x09, 0xAE, 0x11, 0x7B, 0x08, 0xD8, 0x0E, 0xE7, 0x05, + 0x59, 0x0F, 0x4D, 0x08, 0x9A, 0x11, 0x5B, 0x0D, 0xB0, 0x11, 0x17, 0x0B, + 0xAE, 0x10, 0x02, 0x04, 0x85, 0x0E, 0x05, 0xFB, 0xEA, 0x08, 0xAD, 0xF0, + 0x81, 0x03, 0x0F, 0xF2, 0x53, 0x01, 0xC7, 0xFD, 0x1F, 0x01, 0x72, 0x02, + 0x6F, 0x06, 0x49, 0x05, 0x57, 0x0C, 0x71, 0x04, 0x45, 0x0B, 0xA3, 0xFB, + 0x00, 0x05, 0xF2, 0xFA, 0xA4, 0xFD, 0xF8, 0x02, 0x8B, 0xF8, 0x9E, 0x04, + 0xE5, 0xFB, 0x47, 0xFE, 0x3E, 0x05, 0x3E, 0xF9, 0xD9, 0x08, 0xF8, 0xFB, + 0x10, 0x09, 0x7D, 0x01, 0xEF, 0x0F, 0xB6, 0x05, 0x41, 0x17, 0x46, 0x0B, + 0x68, 0x11, 0x86, 0x0A, 0x2D, 0x0A, 0x40, 0x09, 0x9E, 0x0B, 0x94, 0x0F, + 0xFE, 0x0C, 0x03, 0x16, 0x5B, 0x0B, 0xD6, 0x18, 0x2B, 0x0E, 0x3F, 0x1D, + 0x30, 0x11, 0x1B, 0x25, 0x7E, 0x0E, 0x6B, 0x25, 0x27, 0x0A, 0xCE, 0x1F, + 0x64, 0xFC, 0x22, 0x1C, 0xF9, 0xF0, 0xC7, 0x15, 0x8E, 0xF8, 0x09, 0x13, + 0xA0, 0x02, 0x3A, 0x16, 0x9B, 0x06, 0x9B, 0x12, 0x33, 0x0A, 0xBD, 0x09, + 0x16, 0x09, 0xE5, 0x06, 0x03, 0x02, 0x26, 0x04, 0xB8, 0xFC, 0x77, 0x02, + 0x22, 0xFA, 0x75, 0x09, 0xAA, 0xF7, 0x36, 0x03, 0x52, 0xF8, 0x28, 0xEE, + 0xDC, 0xFC, 0x0D, 0xE5, 0x5B, 0x03, 0x8D, 0xEA, 0x78, 0x03, 0xE4, 0xEF, + 0xC9, 0xF7, 0xB0, 0xEC, 0x8B, 0xED, 0x30, 0xE4, 0x6A, 0xEC, 0xC6, 0xDB, + 0xF9, 0xEC, 0xF4, 0xD1, 0x0A, 0xF0, 0xDB, 0xD3, 0x91, 0xF0, 0xA9, 0xE0, + 0x8D, 0xE6, 0xC0, 0xE6, 0xE8, 0xDD, 0xF1, 0xE8, 0xFB, 0xE0, 0x38, 0xEA, + 0x51, 0xE8, 0x9E, 0xE7, 0xC5, 0xE8, 0x77, 0xE2, 0x50, 0xE6, 0x5A, 0xE4, + 0x9F, 0xE6, 0x5B, 0xED, 0x56, 0xEB, 0x05, 0xF1, 0xDC, 0xF7, 0x2A, 0xF1, + 0xCA, 0x03, 0x29, 0xF4, 0xDF, 0x01, 0x52, 0xF8, 0x94, 0xEF, 0x22, 0xFC, + 0x86, 0xDB, 0x27, 0xFD, 0x84, 0xD3, 0xA1, 0xF9, 0x77, 0xD8, 0x9D, 0xF5, + 0x47, 0xE3, 0x31, 0xF0, 0x75, 0xEE, 0xA8, 0xE9, 0x1C, 0xF7, 0x1E, 0xE8, + 0x79, 0xF6, 0x9B, 0xE7, 0x4A, 0xF1, 0x8E, 0xE4, 0x6B, 0xF0, 0x5B, 0xE5, + 0x4A, 0xF1, 0x59, 0xEC, 0x78, 0xF0, 0x08, 0xF1, 0x04, 0xF0, 0x4C, 0xEF, + 0xF6, 0xF5, 0x6F, 0xF0, 0x7A, 0xFF, 0x55, 0xF8, 0xCC, 0x03, 0x27, 0x00, + 0xB0, 0xF9, 0xBA, 0x00, 0x9B, 0xE6, 0x04, 0xF8, 0x3C, 0xDF, 0xDC, 0xE6, + 0xBC, 0xE4, 0xBF, 0xD8, 0x8B, 0xEB, 0xF2, 0xD7, 0x43, 0xF0, 0xCC, 0xDF, + 0xDE, 0xEE, 0xD0, 0xEB, 0x18, 0xE6, 0xE8, 0xF4, 0xA3, 0xE5, 0xF2, 0xF6, + 0x43, 0xEA, 0xF9, 0xF9, 0xA1, 0xE3, 0x61, 0xFB, 0x03, 0xE5, 0x9B, 0xF2, + 0x3B, 0xF6, 0xAC, 0xE7, 0xD0, 0x02, 0x1E, 0xE5, 0xC9, 0x03, 0x4D, 0xEB, + 0x1E, 0x02, 0x82, 0xF4, 0xA9, 0x04, 0xE8, 0xFB, 0xA1, 0x02, 0x8D, 0x03, + 0x3B, 0x01, 0xB3, 0x07, 0x53, 0x09, 0x86, 0x0D, 0xDD, 0x10, 0xC6, 0x19, + 0x9C, 0x13, 0x1D, 0x1D, 0x8B, 0x13, 0x40, 0x18, 0x5B, 0x12, 0x71, 0x14, + 0x25, 0x13, 0xBF, 0x11, 0x6F, 0x19, 0x05, 0x17, 0x95, 0x1C, 0xAB, 0x20, + 0x44, 0x16, 0x90, 0x21, 0xE7, 0x13, 0x48, 0x1A, 0x54, 0x19, 0x77, 0x18, + 0x34, 0x20, 0x41, 0x1F, 0xD3, 0x26, 0x00, 0x21, 0xFA, 0x26, 0xC0, 0x21, + 0x9F, 0x1C, 0x05, 0x29, 0xA4, 0x11, 0x58, 0x32, 0x20, 0x0A, 0xDE, 0x35, + 0x8A, 0x04, 0x92, 0x26, 0x6B, 0x04, 0xFD, 0x12, 0xE9, 0x09, 0xDE, 0x0E, + 0x90, 0x10, 0xBD, 0x11, 0x76, 0x10, 0xE7, 0x13, 0x5E, 0x10, 0xC8, 0x18, + 0x79, 0x16, 0x25, 0x1A, 0xAE, 0x1C, 0x8B, 0x16, 0xFA, 0x21, 0xF8, 0x17, + 0xF2, 0x26, 0x4A, 0x1E, 0xAC, 0x29, 0xAC, 0x20, 0x08, 0x27, 0x17, 0x16, + 0x29, 0x21, 0x81, 0x09, 0xAB, 0x1D, 0xB8, 0x08, 0x96, 0x1F, 0x21, 0x0B, + 0xFD, 0x28, 0x67, 0x09, 0xD3, 0x2F, 0x97, 0x0B, 0xEC, 0x29, 0xBB, 0x12, + 0x73, 0x22, 0xD6, 0x15, 0x2C, 0x21, 0x21, 0x12, 0xEB, 0x22, 0x3F, 0x0C, + 0xAB, 0x23, 0x50, 0x07, 0xE7, 0x22, 0x51, 0x0A, 0x7B, 0x18, 0xF5, 0x12, + 0x91, 0x08, 0x5F, 0x16, 0xFF, 0x03, 0x7C, 0x18, 0x24, 0x05, 0x10, 0x15, + 0xEA, 0x0D, 0xA0, 0x11, 0x2B, 0x19, 0x63, 0x15, 0xCB, 0x13, 0x31, 0x17, + 0x2A, 0x06, 0x34, 0x1A, 0xC4, 0xFD, 0xD5, 0x1A, 0x47, 0xFD, 0x13, 0x1C, + 0x5D, 0x03, 0xFD, 0x1F, 0x71, 0x05, 0xA6, 0x12, 0xCC, 0x05, 0x47, 0x02, + 0xC4, 0x0A, 0xA3, 0x05, 0x71, 0x08, 0xAD, 0x06, 0xF8, 0xFE, 0x1D, 0xFD, + 0xC2, 0xF6, 0xE8, 0xF9, 0xAE, 0xFE, 0x70, 0x0A, 0x6F, 0x12, 0x4A, 0x17, + 0x1C, 0x1A, 0x37, 0x11, 0x65, 0x13, 0x14, 0x0F, 0xAA, 0x0E, 0xC8, 0x1A, + 0xE1, 0x0F, 0x65, 0x1F, 0xFF, 0x10, 0x61, 0x12, 0xB3, 0x22, 0x00, 0x18, + 0xE8, 0x35, 0x90, 0x2D, 0x02, 0x33, 0xBA, 0x37, 0x56, 0x2D, 0x55, 0x38, + 0x16, 0x36, 0x19, 0x35, 0x28, 0x33, 0xF5, 0x2D, 0x16, 0x2A, 0x2B, 0x31, + 0x06, 0x36, 0x6D, 0x3F, 0x8E, 0x3B, 0x75, 0x3B, 0x55, 0x30, 0x5A, 0x2E, + 0xDC, 0x2D, 0xB6, 0x2F, 0xF6, 0x2E, 0x97, 0x36, 0x3D, 0x1C, 0x09, 0x31, + 0x29, 0x0E, 0x29, 0x24, 0xD3, 0x07, 0x9B, 0x17, 0xA1, 0x0C, 0xC0, 0x1D, + 0x6F, 0x26, 0xBE, 0x33, 0xB9, 0x23, 0xA0, 0x26, 0xE7, 0x1C, 0x04, 0x16, + 0x7A, 0x2B, 0x61, 0x24, 0x46, 0x1E, 0xD1, 0x17, 0xFF, 0x07, 0xC9, 0xF6, + 0xE6, 0xF5, 0xA8, 0xE5, 0x2C, 0xFC, 0x72, 0xF8, 0x7E, 0x16, 0xC4, 0x14, + 0x5E, 0xFE, 0x49, 0xF9, 0x66, 0xF8, 0x06, 0xF2, 0x0C, 0x0E, 0x68, 0x0A, + 0x6A, 0xED, 0x94, 0xED, 0x81, 0xD1, 0xC2, 0xC9, 0x6B, 0xE9, 0x4E, 0xD2, + 0xCB, 0xE9, 0x85, 0xD7, 0xD4, 0xC3, 0xC7, 0xB6, 0x8D, 0xBB, 0x85, 0xB2, + 0xAF, 0xB8, 0x77, 0xC1, 0x30, 0xA3, 0xDB, 0xAB, 0x97, 0xA9, 0x77, 0xAC, + 0x67, 0xBF, 0xD3, 0xCD, 0x8E, 0xC4, 0xC6, 0xD5, 0x25, 0xCE, 0xEB, 0xCD, + 0x21, 0xEC, 0x92, 0xDF, 0xA2, 0xF7, 0xEA, 0xE1, 0xA4, 0xE5, 0xBF, 0xCC, + 0x58, 0xE3, 0x14, 0xD1, 0xEA, 0xE3, 0x1B, 0xD6, 0x94, 0xC9, 0x5D, 0xC3, + 0xF5, 0xA5, 0x5C, 0xA7, 0xCF, 0xA5, 0x64, 0xA4, 0x6F, 0xBC, 0x82, 0xB1, + 0x16, 0xBC, 0x2E, 0xAB, 0xD9, 0xB1, 0x5E, 0xA2, 0x0D, 0xB1, 0xB3, 0xAC, + 0x45, 0xBD, 0xDB, 0xBF, 0x1E, 0xD0, 0x27, 0xC8, 0x85, 0xE3, 0x22, 0xCE, + 0x63, 0xEE, 0xC9, 0xD3, 0xA7, 0xE7, 0x90, 0xD2, 0xF8, 0xD2, 0x01, 0xCE, + 0xA6, 0xB4, 0xB4, 0xC1, 0xBF, 0x9F, 0xED, 0xAF, 0x86, 0xA2, 0x6E, 0xAB, + 0x78, 0xAD, 0x00, 0xB8, 0xF4, 0xB8, 0x94, 0xC4, 0xE1, 0xBA, 0x17, 0xC5, + 0x27, 0xB0, 0xAA, 0xBF, 0x6B, 0xA3, 0x1B, 0xB6, 0x42, 0xAE, 0xA2, 0xBE, + 0x42, 0xDE, 0xD9, 0xEC, 0xFB, 0x06, 0x53, 0x11, 0x0B, 0x1F, 0x22, 0x1F, + 0x2C, 0x21, 0xDE, 0x20, 0x24, 0x07, 0xF9, 0x10, 0x85, 0xD8, 0xED, 0xEC, + 0x86, 0xB4, 0x50, 0xCA, 0x7F, 0xBF, 0x43, 0xCC, 0x7D, 0xEB, 0xAD, 0xEA, + 0xF4, 0x12, 0xEE, 0x0A, 0xA9, 0x15, 0x02, 0x14, 0x6B, 0x0E, 0x15, 0x0A, + 0xE7, 0x19, 0x6A, 0x09, 0x6C, 0x21, 0x72, 0x12, 0xFA, 0x2A, 0xCC, 0x2A, + 0x72, 0x4B, 0x77, 0x4E, 0x66, 0x55, 0x08, 0x4F, 0x42, 0x43, 0x20, 0x33, + 0xEE, 0x24, 0xD1, 0x1E, 0x07, 0xFE, 0x5B, 0x19, 0xFF, 0xF0, 0x05, 0x1E, + 0xEC, 0x10, 0x2C, 0x36, 0x3E, 0x3B, 0xAD, 0x47, 0x8B, 0x4F, 0x5E, 0x3D, + 0xB9, 0x51, 0x60, 0x32, 0xAD, 0x44, 0xEE, 0x36, 0x2B, 0x35, 0xCA, 0x37, + 0x90, 0x38, 0x45, 0x30, 0x8F, 0x4E, 0xE0, 0x42, 0xEC, 0x5D, 0x9C, 0x58, + 0x1C, 0x5A, 0x00, 0x4E, 0xC7, 0x42, 0xD4, 0x3E, 0x85, 0x1F, 0x7E, 0x32, + 0xED, 0x0B, 0x89, 0x1A, 0xAB, 0x1F, 0x40, 0x1B, 0xF3, 0x40, 0x30, 0x37, + 0x7C, 0x5F, 0xB4, 0x59, 0xF5, 0x5B, 0x8E, 0x55, 0x60, 0x42, 0xCF, 0x3F, + 0x5F, 0x44, 0x23, 0x4B, 0x16, 0x46, 0x5D, 0x4E, 0x5F, 0x47, 0xA5, 0x53, + 0x6D, 0x54, 0x39, 0x61, 0x9F, 0x5D, 0x64, 0x66, 0x2A, 0x51, 0x49, 0x5A, + 0x35, 0x3A, 0xB9, 0x47, 0x33, 0x2B, 0x04, 0x43, 0x69, 0x18, 0xC7, 0x32, + 0xD6, 0x0D, 0xD2, 0x1C, 0xF7, 0x24, 0xFA, 0x29, 0xDF, 0x3A, 0x02, 0x3D, + 0x17, 0x40, 0x16, 0x43, 0x37, 0x3E, 0xB6, 0x46, 0xE3, 0x3F, 0xFA, 0x4C, + 0x49, 0x5A, 0x3D, 0x5F, 0xF9, 0x68, 0x8E, 0x61, 0x81, 0x61, 0xA8, 0x5A, + 0xCE, 0x57, 0x2D, 0x56, 0x3F, 0x41, 0x9C, 0x41, 0x4F, 0x0F, 0x95, 0x12, + 0x8A, 0xE9, 0xE8, 0xEC, 0xFB, 0xE0, 0x86, 0xDD, 0x99, 0xE7, 0xA9, 0xDC, + 0x89, 0x0D, 0xD7, 0xFF, 0xDA, 0x37, 0x00, 0x30, 0xC7, 0x44, 0xD5, 0x41, + 0x97, 0x52, 0x45, 0x48, 0x0A, 0x61, 0xF4, 0x55, 0xB4, 0x4E, 0x23, 0x48, + 0x8B, 0x31, 0x7C, 0x2D, 0xD8, 0x21, 0xE5, 0x30, 0xE0, 0xFD, 0x03, 0x1C, + 0x5F, 0xDA, 0x68, 0xEF, 0x08, 0xD8, 0xF9, 0xE3, 0x6A, 0xE1, 0xB6, 0xEF, + 0x33, 0xFA, 0x73, 0x07, 0xCF, 0x1C, 0xC5, 0x24, 0xE3, 0x35, 0xB3, 0x45, + 0xB8, 0x38, 0xEB, 0x4A, 0xE1, 0x1F, 0x23, 0x34, 0x8F, 0x0A, 0x54, 0x2F, + 0x6D, 0x01, 0x41, 0x1D, 0x66, 0x01, 0x4D, 0x05, 0xF3, 0x10, 0xF9, 0x07, + 0x53, 0x19, 0x49, 0x0A, 0x5D, 0x03, 0x31, 0xF8, 0x84, 0xE4, 0x1C, 0xE0, + 0x6A, 0xEC, 0x0C, 0xE5, 0x0E, 0xFA, 0xF8, 0xF0, 0x9D, 0xFD, 0xAD, 0x03, + 0xDD, 0x10, 0x11, 0x1E, 0xC1, 0x21, 0x23, 0x24, 0x9C, 0x18, 0xFE, 0x1D, + 0x66, 0xE7, 0xC7, 0xF2, 0xBE, 0xC5, 0x72, 0xC7, 0xBF, 0xC2, 0x04, 0xC7, + 0xDC, 0xC6, 0x99, 0xCC, 0xF7, 0xD6, 0x8D, 0xD1, 0x02, 0xDA, 0x12, 0xD4, + 0x5C, 0xDB, 0x6A, 0xE1, 0xB1, 0xEF, 0x51, 0xFC, 0x77, 0x00, 0xF2, 0x06, + 0x7B, 0x0D, 0x0B, 0x10, 0x3C, 0x18, 0x37, 0x14, 0xFA, 0x0B, 0x64, 0x00, + 0xF6, 0xE7, 0x4B, 0xDD, 0xA1, 0xB9, 0xA7, 0xB6, 0xB0, 0xA2, 0x9A, 0xA0, + 0x8E, 0x9E, 0xFA, 0x94, 0xAB, 0xC0, 0xB2, 0xB8, 0x35, 0xEE, 0xBF, 0xEC, + 0xA4, 0xFB, 0xC0, 0xF6, 0x1D, 0x0D, 0xC6, 0x00, 0xB4, 0x0D, 0x99, 0x05, + 0x0A, 0xFD, 0x89, 0xF3, 0x27, 0xF5, 0x89, 0xE2, 0xF8, 0xEB, 0xB2, 0xD7, + 0x6B, 0xDE, 0xC7, 0xC5, 0x3B, 0xD1, 0xAD, 0xB4, 0x7C, 0xC5, 0xA4, 0xAC, + 0xF7, 0xBC, 0xBB, 0xA8, 0xBC, 0xBC, 0x5D, 0xB1, 0xDE, 0xDD, 0xAA, 0xD3, + 0x44, 0x04, 0xEA, 0xE9, 0xE4, 0x12, 0x9F, 0xF8, 0xC0, 0xF9, 0x7F, 0xFF, + 0xBE, 0xD5, 0xBC, 0xF2, 0x03, 0xDD, 0xFE, 0xE9, 0x59, 0xE5, 0xB9, 0xE0, + 0x34, 0xE4, 0xBC, 0xDB, 0x77, 0xF1, 0x52, 0xE7, 0x18, 0xF6, 0xB7, 0xF7, + 0x14, 0xEB, 0xF0, 0xF4, 0x0B, 0xE7, 0x8D, 0xF8, 0xCF, 0xE0, 0x13, 0xFB, + 0x24, 0xEA, 0xFE, 0xF0, 0x57, 0x0F, 0x08, 0xFC, 0x43, 0x22, 0x5C, 0x10, + 0xBE, 0x11, 0xA5, 0x11, 0x15, 0xFC, 0x71, 0x03, 0x7B, 0xE2, 0x65, 0xED, + 0x8C, 0xD5, 0x28, 0xE2, 0xF3, 0xF3, 0xA4, 0xF0, 0x7E, 0x00, 0x0A, 0xF4, + 0xC3, 0x07, 0x30, 0xF9, 0xA5, 0x26, 0x86, 0x0A, 0x3E, 0x27, 0xFF, 0x07, + 0x3B, 0x20, 0xF7, 0x09, 0xBD, 0x28, 0x3F, 0x18, 0x13, 0x29, 0x05, 0x25, + 0xC8, 0x20, 0x35, 0x27, 0x73, 0x1C, 0x05, 0x1F, 0xD4, 0x12, 0xFB, 0x14, + 0x60, 0x06, 0x10, 0x0E, 0xC1, 0x08, 0x70, 0x0E, 0x33, 0x1E, 0xE5, 0x20, + 0x1E, 0x33, 0xA7, 0x38, 0x98, 0x47, 0xB9, 0x3B, 0xA2, 0x54, 0xAE, 0x38, + 0x35, 0x3C, 0x81, 0x36, 0x8C, 0x15, 0x7D, 0x2F, 0x96, 0x07, 0x8D, 0x23, + 0x84, 0x17, 0xC4, 0x22, 0xCF, 0x13, 0x10, 0x29, 0xC1, 0xFB, 0xFA, 0x24, + 0x52, 0xF4, 0x0C, 0x1F, 0xBE, 0xED, 0x69, 0x18, 0xF9, 0xF3, 0xE4, 0x17, + 0xFE, 0x1D, 0x42, 0x10, 0x32, 0x49, 0x45, 0x0B, 0x46, 0x53, 0x0C, 0x23, + 0x54, 0x48, 0xB3, 0x32, 0x3F, 0x35, 0x9B, 0x27, 0xA6, 0x1B, 0xA6, 0x1B, + 0x9B, 0xFC, 0xA3, 0x1A, 0x91, 0xE1, 0x78, 0x0F, 0x56, 0xDE, 0xEB, 0x03, + 0xDD, 0xEF, 0x98, 0x02, 0x88, 0x08, 0xC7, 0xF7, 0xAD, 0x11, 0x13, 0xF0, + 0x49, 0x04, 0xDA, 0xF4, 0xF6, 0x07, 0x1A, 0x08, 0x4E, 0x1C, 0xFC, 0x18, + 0x09, 0x2C, 0xA1, 0x18, 0x82, 0x2D, 0xC7, 0x10, 0x8B, 0x0D, 0xE8, 0x07, + 0x0E, 0xDB, 0x44, 0xF7, 0xEB, 0xBE, 0xC6, 0xDA, 0x5B, 0xD6, 0xF1, 0xCF, + 0x47, 0xEF, 0x0C, 0xD5, 0x82, 0xE1, 0xAD, 0xE4, 0x97, 0xCE, 0x06, 0xFB, + 0x26, 0xD1, 0x9A, 0xF7, 0xEF, 0xE0, 0x3D, 0xD9, 0xB6, 0xDD, 0x2E, 0xC6, + 0x92, 0xD8, 0xEA, 0xCE, 0x60, 0xE7, 0xCB, 0xE5, 0x7A, 0xE5, 0x51, 0x02, + 0x44, 0xD6, 0x96, 0x00, 0xA5, 0xD3, 0x1D, 0xD7, 0x17, 0xCF, 0xDA, 0xCB, + 0xD1, 0xB6, 0x76, 0xD6, 0x97, 0xAE, 0xCD, 0xC2, 0xA8, 0xD1, 0x8E, 0xB3, + 0x51, 0xE2, 0xA1, 0xBE, 0x9A, 0xE2, 0xE8, 0xD4, 0x1E, 0xF1, 0xC1, 0xDC, + 0xFA, 0xF4, 0x3F, 0xDF, 0x27, 0xE3, 0xE6, 0xF2, 0x7B, 0xC9, 0x6F, 0xF7, + 0x45, 0xCB, 0x7E, 0xF2, 0x30, 0xD2, 0x2D, 0xF0, 0x10, 0xC5, 0x3F, 0xDB, + 0xFF, 0xC9, 0x3D, 0xCE, 0xF9, 0xCD, 0xE8, 0xCF, 0x23, 0xB3, 0x58, 0xCC, + 0xDD, 0x9E, 0x41, 0xC8, 0xE3, 0x9E, 0x15, 0xB1, 0xAB, 0xAA, 0x81, 0x9F, + 0x4E, 0xBD, 0x01, 0xBA, 0x54, 0xC4, 0xA2, 0xD3, 0x35, 0xCB, 0x0E, 0xD6, + 0x34, 0xDF, 0xD2, 0xD8, 0xD9, 0xE1, 0xC4, 0xD6, 0xEE, 0xCD, 0x3C, 0xC1, + 0x20, 0xBF, 0x15, 0xB4, 0xB8, 0xC5, 0xF4, 0xB3, 0x4F, 0xCC, 0x71, 0xA3, + 0x5A, 0xC4, 0x70, 0xA0, 0xAC, 0xBA, 0x48, 0xA8, 0x11, 0xB4, 0x41, 0xA1, + 0x72, 0xB2, 0xA8, 0xA1, 0x91, 0xB9, 0x50, 0xAF, 0xD2, 0xC9, 0x64, 0xC8, + 0x93, 0xDA, 0x99, 0xE9, 0xE5, 0xD3, 0xCA, 0xE0, 0xE0, 0xC0, 0xD7, 0xC1, + 0x1F, 0xBC, 0xC4, 0xB8, 0x72, 0xB6, 0x36, 0xB3, 0x95, 0xBA, 0xF0, 0xBB, + 0x60, 0xDA, 0x15, 0xCE, 0x61, 0xEB, 0x46, 0xDC, 0xCE, 0xDB, 0x71, 0xD9, + 0x6F, 0xC8, 0x3C, 0xCE, 0xFB, 0xCE, 0xCC, 0xD3, 0x97, 0xD6, 0x7F, 0xE4, + 0x98, 0xC8, 0xD2, 0xF1, 0xCF, 0xDF, 0x5D, 0xF5, 0xC5, 0x08, 0xCF, 0xF1, + 0x26, 0x03, 0x44, 0xEB, 0xF2, 0xEE, 0x9C, 0xE6, 0x57, 0xF2, 0x81, 0xE4, + 0x15, 0xEF, 0xDB, 0xF0, 0x9E, 0xEA, 0xBD, 0xF9, 0xA1, 0x02, 0x33, 0xF4, + 0x2A, 0x0C, 0x14, 0xF8, 0xF3, 0xFC, 0xD2, 0xFA, 0xF5, 0xF6, 0x62, 0xEF, + 0xDA, 0xFF, 0x1D, 0xEF, 0x8C, 0x10, 0x53, 0x06, 0x1F, 0x29, 0x80, 0x16, + 0xAA, 0x2B, 0x78, 0x1B, 0x3C, 0x15, 0x03, 0x1D, 0x0C, 0x10, 0x6A, 0x0E, + 0x94, 0x1F, 0x5C, 0x02, 0xEF, 0x24, 0xC0, 0x08, 0xB7, 0x0B, 0x62, 0x13, + 0x21, 0xFF, 0xAA, 0x19, 0x95, 0x1B, 0xCA, 0x19, 0x0A, 0x31, 0xE0, 0x1A, + 0x76, 0x26, 0x4A, 0x19, 0x87, 0x18, 0xF5, 0x1D, 0xE0, 0x14, 0xBD, 0x26, + 0x00, 0x25, 0x8F, 0x2F, 0x1E, 0x44, 0xF8, 0x40, 0x85, 0x56, 0xB2, 0x4F, + 0xE9, 0x5F, 0xBE, 0x4C, 0xFD, 0x56, 0x04, 0x3B, 0x8E, 0x3A, 0x4F, 0x34, + 0x9E, 0x35, 0x35, 0x32, 0xE2, 0x4A, 0xAA, 0x33, 0x1B, 0x52, 0xB2, 0x3E, + 0xB3, 0x45, 0x68, 0x48, 0x03, 0x44, 0xB8, 0x49, 0xBC, 0x49, 0x95, 0x45, + 0x16, 0x37, 0xFD, 0x3D, 0x6B, 0x1E, 0x6E, 0x38, 0x84, 0x21, 0xD4, 0x42, + 0x9C, 0x3C, 0xD0, 0x4B, 0x42, 0x4C, 0x4A, 0x50, 0x51, 0x46, 0xAD, 0x56, + 0xB7, 0x3E, 0x3F, 0x59, 0x7F, 0x2C, 0xE0, 0x4C, 0x0C, 0x2B, 0x1C, 0x39, + 0x69, 0x45, 0x3F, 0x3B, 0x34, 0x58, 0x9D, 0x39, 0x80, 0x5F, 0xD1, 0x3D, + 0xE0, 0x57, 0x79, 0x4F, 0x68, 0x41, 0x73, 0x54, 0xAA, 0x2D, 0x45, 0x51, + 0xDF, 0x27, 0x20, 0x52, 0x7B, 0x38, 0xAF, 0x53, 0xC1, 0x57, 0x19, 0x4B, + 0x59, 0x63, 0x2E, 0x4B, 0x22, 0x5D, 0x84, 0x47, 0xFF, 0x54, 0x59, 0x34, + 0xE5, 0x47, 0x2F, 0x30, 0x63, 0x3C, 0x4D, 0x3B, 0xA3, 0x43, 0xD8, 0x3E, + 0x81, 0x5C, 0x62, 0x43, 0xEB, 0x64, 0xC0, 0x47, 0x31, 0x53, 0x8E, 0x42, + 0x16, 0x4A, 0xF2, 0x44, 0x50, 0x4F, 0x59, 0x42, 0x06, 0x3E, 0x0E, 0x3F, + 0xBA, 0x33, 0xE8, 0x4A, 0xE5, 0x3C, 0x73, 0x46, 0xE3, 0x3F, 0x2D, 0x32, + 0xE1, 0x45, 0xE0, 0x24, 0xBD, 0x35, 0xC2, 0x20, 0xBD, 0x14, 0x3B, 0x20, + 0x76, 0x0D, 0xB1, 0x21, 0xF0, 0x19, 0xE3, 0x21, 0x4D, 0x27, 0x15, 0x26, + 0x90, 0x30, 0xAA, 0x27, 0x39, 0x21, 0x5B, 0x27, 0x27, 0xFE, 0x84, 0x27, + 0xD7, 0xEB, 0x71, 0x12, 0x06, 0xEE, 0xA2, 0xF9, 0x8F, 0x07, 0xEB, 0xF6, + 0xC4, 0x24, 0x6B, 0xFE, 0xC8, 0x21, 0xD8, 0x05, 0x3A, 0x18, 0x43, 0x0E, + 0x13, 0x1C, 0xF9, 0x12, 0xA0, 0x22, 0x40, 0x0D, 0x87, 0x1F, 0x02, 0x0F, + 0x53, 0x0E, 0x39, 0x18, 0xAB, 0x05, 0xCA, 0x0C, 0x1F, 0x15, 0x2E, 0xF9, + 0xDA, 0x1E, 0xAC, 0xEE, 0x12, 0x09, 0xF2, 0xE4, 0x1A, 0xF0, 0x14, 0xE8, + 0x6D, 0xE9, 0xDC, 0xF2, 0x3E, 0xF4, 0x48, 0xF1, 0x00, 0xFE, 0x31, 0xF9, + 0xC8, 0xF0, 0x52, 0x05, 0xFC, 0xE4, 0xC7, 0xF7, 0xB8, 0xE9, 0x2D, 0xED, + 0x0E, 0xF2, 0x6D, 0xEE, 0x05, 0xFF, 0x1B, 0xF1, 0xE6, 0x07, 0xC9, 0xFE, + 0xE3, 0xFF, 0x87, 0x10, 0x4D, 0xF8, 0x51, 0x16, 0xB0, 0xEF, 0x63, 0x03, + 0x0F, 0xE4, 0x59, 0xF9, 0x08, 0xDD, 0x76, 0xF9, 0x89, 0xDC, 0xFF, 0xF1, + 0x76, 0xF6, 0x61, 0xEF, 0x11, 0x18, 0xD8, 0xF7, 0xCD, 0x22, 0xAA, 0xF9, + 0x17, 0x14, 0x11, 0xF7, 0x98, 0xF6, 0x61, 0x0E, 0x68, 0xEF, 0x26, 0x20, + 0x1A, 0x11, 0x4B, 0x13, 0xD3, 0x2A, 0x94, 0xFF, 0x57, 0x20, 0x66, 0xF4, + 0xF8, 0x15, 0x06, 0xF3, 0xF3, 0x11, 0x61, 0xFC, 0x8D, 0x09, 0x18, 0x01, + 0xFA, 0xFB, 0xF9, 0x0C, 0x67, 0xF3, 0x41, 0x1A, 0x35, 0xFC, 0x6E, 0x1C, + 0x2C, 0x05, 0x88, 0x19, 0xEB, 0x0C, 0x9E, 0x06, 0xF0, 0x14, 0x93, 0x08, + 0xA4, 0x13, 0xD0, 0x09, 0x5D, 0x04, 0xE1, 0xFC, 0x0E, 0xFB, 0x39, 0x0B, + 0x41, 0xFD, 0x93, 0x0D, 0x9B, 0x01, 0xCB, 0xF5, 0xCF, 0xF9, 0xD3, 0xF0, + 0x56, 0xD8, 0x34, 0xF9, 0xB8, 0xC8, 0x65, 0xF7, 0x45, 0xDB, 0xF2, 0xF9, + 0x49, 0xEA, 0x0B, 0x03, 0x94, 0xF6, 0xDC, 0xFB, 0x63, 0x04, 0xEB, 0xF8, + 0x41, 0x04, 0x1C, 0x0E, 0xB2, 0x09, 0xD5, 0x1A, 0xFA, 0x19, 0x9A, 0x1A, + 0xE1, 0x17, 0x6F, 0x18, 0x84, 0x06, 0x3E, 0x08, 0x29, 0xF7, 0xC4, 0xF7, + 0xEA, 0xE0, 0xD0, 0xE9, 0x81, 0xD0, 0x4E, 0xD7, 0x15, 0xD0, 0x0B, 0xD0, + 0x9D, 0xCE, 0x80, 0xCB, 0x98, 0xC4, 0x8F, 0xC4, 0x1D, 0xBE, 0x09, 0xC0, + 0x55, 0xBD, 0xF2, 0xBC, 0x64, 0xB0, 0x1E, 0xBF, 0xD8, 0xAF, 0x7A, 0xC4, + 0x1B, 0xC6, 0xCD, 0xD7, 0xB9, 0xDD, 0x70, 0xE9, 0xC2, 0xF2, 0x4D, 0xE1, + 0x43, 0xF2, 0xF0, 0xDA, 0x2D, 0xD8, 0x70, 0xE1, 0x5B, 0xC1, 0x16, 0xE3, + 0x03, 0xBD, 0x6C, 0xE0, 0x6C, 0xC3, 0x5F, 0xDE, 0x3B, 0xCA, 0x6B, 0xD6, + 0x3C, 0xD2, 0x7E, 0xDB, 0xDF, 0xD6, 0xE2, 0xEC, 0xCD, 0xD5, 0x74, 0xEF, + 0xE3, 0xD9, 0x38, 0xEB, 0xC4, 0xE7, 0x7D, 0xF1, 0xC1, 0xF0, 0xCD, 0xF5, + 0xAC, 0xE6, 0xD2, 0xF3, 0x89, 0xDF, 0x43, 0xF4, 0x13, 0xDA, 0x76, 0xE7, + 0xF5, 0xC4, 0x04, 0xD8, 0xD7, 0xB7, 0x4D, 0xCF, 0x0C, 0xB5, 0x9E, 0xD1, + 0x82, 0xBC, 0x17, 0xD6, 0x18, 0xC5, 0xBD, 0xD1, 0x24, 0xB7, 0x93, 0xDA, + 0x67, 0xA3, 0xDF, 0xD2, 0x72, 0xA4, 0x61, 0xC1, 0x46, 0xB6, 0x21, 0xC8, + 0x61, 0xC7, 0x0A, 0xCF, 0xBF, 0xD8, 0x84, 0xD1, 0x2C, 0xD6, 0xE6, 0xDA, + 0x77, 0xC6, 0x5F, 0xDD, 0xD6, 0xC2, 0xEE, 0xC7, 0x45, 0xC4, 0xB8, 0xB5, + 0x61, 0xC0, 0x61, 0xB7, 0x75, 0xB3, 0xC8, 0xBE, 0xDE, 0xAC, 0x68, 0xC0, + 0x11, 0xA8, 0xB7, 0xB4, 0x07, 0xA1, 0x3F, 0xA4, 0x25, 0xA4, 0xDA, 0x9B, + 0xBF, 0xB1, 0x16, 0xA7, 0x9F, 0xBC, 0xBF, 0xBC, 0xAE, 0xBC, 0x42, 0xC7, + 0x03, 0xBC, 0x04, 0xC9, 0xD0, 0xBB, 0x7D, 0xC0, 0xD8, 0xB1, 0x4E, 0xAD, + 0xD2, 0xAC, 0x57, 0xA1, 0xC0, 0xB8, 0x37, 0xA8, 0x72, 0xC2, 0x11, 0xB8, + 0x54, 0xBA, 0xC2, 0xBB, 0x4E, 0xAD, 0x05, 0xB1, 0x16, 0xA6, 0xD4, 0xA8, + 0xA1, 0xA0, 0x6C, 0xA0, 0x1A, 0xA4, 0xE7, 0x9E, 0x06, 0xAB, 0x40, 0xAA, + 0x59, 0xB4, 0xB8, 0xA6, 0xCB, 0xBD, 0x0F, 0xA0, 0xD8, 0xBC, 0xBA, 0xA7, + 0x1A, 0xBA, 0x4D, 0xA9, 0x92, 0xB8, 0x59, 0xAF, 0xD9, 0xBC, 0x5C, 0xC5, + 0x9F, 0xCD, 0x6B, 0xD8, 0x30, 0xDD, 0xB7, 0xF1, 0xA6, 0xE6, 0xBF, 0x03, + 0x83, 0xE1, 0xB1, 0xF4, 0x61, 0xCC, 0xB8, 0xE3, 0x58, 0xC5, 0xA0, 0xDE, + 0x8B, 0xD1, 0xDB, 0xDF, 0x8E, 0xD6, 0x04, 0xE6, 0xC4, 0xC9, 0xB0, 0xE9, + 0x1C, 0xBF, 0x00, 0xE6, 0x83, 0xBD, 0xA6, 0xDD, 0xF4, 0xC2, 0xC7, 0xE3, + 0x87, 0xD0, 0xC3, 0xE2, 0x31, 0xD7, 0xF1, 0xCF, 0xD2, 0xD5, 0xDE, 0xC9, + 0xD0, 0xCA, 0x8F, 0xD2, 0x13, 0xBA, 0x79, 0xD6, 0x38, 0xC5, 0xA9, 0xD4, + 0x21, 0xE0, 0x83, 0xD8, 0x0E, 0xEB, 0x3D, 0xDB, 0x5C, 0xF5, 0x28, 0xE1, + 0xC8, 0x03, 0xE8, 0xE9, 0x1E, 0x13, 0xCF, 0xEA, 0x41, 0x20, 0x01, 0xED, + 0xF3, 0x23, 0x3F, 0xF9, 0xD4, 0x2C, 0xB1, 0x0C, 0xC3, 0x3E, 0xEF, 0x17, + 0x2B, 0x3B, 0x46, 0x1C, 0x96, 0x1F, 0x11, 0x19, 0x86, 0x0D, 0xE6, 0x0D, + 0xE5, 0x10, 0x2A, 0x00, 0xB8, 0x20, 0x1A, 0xF7, 0xB2, 0x28, 0x71, 0xFC, + 0x4E, 0x24, 0x0D, 0x0D, 0xCC, 0x1A, 0x6D, 0x1C, 0x94, 0x12, 0x30, 0x15, + 0xFF, 0x0E, 0x0A, 0xFE, 0x0D, 0x0F, 0x29, 0xF2, 0xAF, 0x0A, 0x20, 0xF8, + 0x75, 0xFF, 0x86, 0xFF, 0x2D, 0xFD, 0x86, 0x0A, 0xDE, 0xFE, 0xFA, 0x09, + 0x11, 0xFF, 0xCA, 0xF4, 0x73, 0xF4, 0x86, 0xE8, 0xEA, 0xDB, 0xD5, 0xEE, + 0x1F, 0xD6, 0xA6, 0xF1, 0xEF, 0xE5, 0xD0, 0xF2, 0x0A, 0xF9, 0xF2, 0xFB, + 0x6F, 0x08, 0xA0, 0xFA, 0x7E, 0x07, 0xBD, 0xFD, 0x4D, 0x00, 0x25, 0x06, + 0x6B, 0x0B, 0x8E, 0x05, 0xF9, 0x15, 0x53, 0x0F, 0xC2, 0x12, 0x9D, 0x15, + 0x7B, 0x14, 0x44, 0x0D, 0xC0, 0x15, 0xEA, 0xFF, 0xCD, 0x0B, 0x06, 0xF0, + 0x98, 0x01, 0x7F, 0xEA, 0x72, 0x02, 0xC7, 0xEF, 0x71, 0x03, 0xBA, 0xF6, + 0xA5, 0x10, 0xC7, 0xFC, 0xA3, 0x2D, 0x79, 0x07, 0x2F, 0x34, 0x38, 0x17, + 0xEB, 0x2D, 0x25, 0x1E, 0x5C, 0x31, 0xB3, 0x1B, 0xEE, 0x34, 0xBF, 0x1A, + 0x80, 0x41, 0x98, 0x1E, 0xCB, 0x44, 0x57, 0x15, 0xDA, 0x2B, 0x67, 0x01, + 0x94, 0x0D, 0x0F, 0xEF, 0xD2, 0xF1, 0xC2, 0xDB, 0xD1, 0xE2, 0x27, 0xDF, + 0x43, 0xEB, 0x6F, 0xF0, 0x76, 0xFA, 0x2C, 0xFB, 0x43, 0x0B, 0xB3, 0x01, + 0x47, 0x25, 0xA3, 0x0D, 0x6A, 0x3C, 0x29, 0x21, 0xFA, 0x42, 0x88, 0x2E, + 0x24, 0x47, 0x5D, 0x3D, 0xA2, 0x56, 0xA1, 0x52, 0x70, 0x61, 0x21, 0x5B, + 0x63, 0x58, 0x46, 0x5B, 0x58, 0x40, 0x64, 0x57, 0xD1, 0x26, 0xBD, 0x3B, + 0x11, 0x16, 0xF2, 0x16, 0x87, 0x1C, 0x95, 0x0E, 0x33, 0x31, 0x11, 0x1E, + 0xBF, 0x2B, 0x52, 0x2A, 0x88, 0x1F, 0x4A, 0x2C, 0x7A, 0x27, 0xA1, 0x2A, + 0x21, 0x2A, 0x37, 0x2C, 0x2D, 0x2E, 0x82, 0x38, 0xF2, 0x3D, 0x08, 0x45, + 0x9D, 0x3F, 0xE3, 0x47, 0xEA, 0x3D, 0x63, 0x41, 0x9E, 0x3E, 0x2C, 0x37, + 0xCA, 0x36, 0xB7, 0x31, 0x85, 0x34, 0x6F, 0x28, 0x2C, 0x31, 0x0D, 0x2B, + 0xD6, 0x2F, 0x90, 0x39, 0x0A, 0x40, 0xE7, 0x48, 0x91, 0x56, 0x06, 0x5B, + 0xB0, 0x5F, 0x41, 0x60, 0xD7, 0x5F, 0x5F, 0x54, 0xDF, 0x5D, 0x0E, 0x4F, + 0xAA, 0x58, 0xFC, 0x51, 0x50, 0x5A, 0xE8, 0x4B, 0x55, 0x5D, 0x86, 0x45, + 0xC3, 0x54, 0x9D, 0x44, 0x71, 0x42, 0x69, 0x40, 0x95, 0x28, 0x31, 0x31, + 0xB1, 0x1C, 0x88, 0x17, 0xFA, 0x24, 0x2E, 0x02, 0xFE, 0x23, 0x41, 0x01, + 0x30, 0x15, 0x22, 0x13, 0x46, 0x0F, 0x16, 0x1D, 0x0B, 0x14, 0x15, 0x15, + 0xDB, 0x1F, 0x18, 0x0E, 0x5A, 0x33, 0x55, 0x0D, 0x01, 0x39, 0x25, 0x15, + 0xC0, 0x30, 0xF6, 0x1D, 0x17, 0x2B, 0x86, 0x21, 0x4B, 0x20, 0x9B, 0x1D, + 0xA3, 0x0A, 0x76, 0x0C, 0xCF, 0xF6, 0x1D, 0x05, 0xC2, 0xF9, 0x8B, 0x00, + 0x5A, 0x0A, 0xCE, 0xF7, 0x5D, 0x11, 0xE8, 0x04, 0x1C, 0x0D, 0x79, 0x17, + 0x51, 0x02, 0xE4, 0x19, 0xE9, 0xFF, 0x2E, 0x0D, 0x78, 0x05, 0x1F, 0xF7, + 0x46, 0x0B, 0xAB, 0xF8, 0x82, 0x11, 0x31, 0x0E, 0xF0, 0x07, 0x2D, 0x12, + 0x40, 0xF3, 0xCE, 0x11, 0x31, 0xE7, 0xC6, 0x14, 0x49, 0xE7, 0x08, 0x10, + 0xCA, 0xF4, 0x32, 0x08, 0xB2, 0x0F, 0xAF, 0x17, 0x6F, 0x2D, 0x83, 0x2E, + 0xE3, 0x34, 0xE0, 0x32, 0x5D, 0x21, 0x3D, 0x3A, 0xA2, 0x10, 0x08, 0x34, + 0xBD, 0x0C, 0x05, 0x1A, 0x3D, 0x01, 0xC2, 0x0C, 0x70, 0xFB, 0x07, 0x0B, + 0x9F, 0x01, 0x80, 0xFD, 0x0D, 0xF8, 0xF7, 0xEC, 0xCE, 0xE2, 0xC3, 0xE8, + 0x43, 0xD5, 0x24, 0xE3, 0x38, 0xCD, 0x10, 0xE2, 0xCC, 0xD7, 0xC8, 0xF3, + 0xDF, 0xF0, 0xD5, 0x0C, 0xB3, 0x00, 0x2A, 0x21, 0x59, 0x14, 0x10, 0x32, + 0xCF, 0x31, 0x47, 0x3A, 0x40, 0x36, 0xA7, 0x38, 0xF0, 0x21, 0x64, 0x36, + 0xA7, 0x17, 0xBE, 0x2F, 0x17, 0x09, 0x6C, 0x2B, 0xC5, 0xEB, 0x8A, 0x1F, + 0xBD, 0xD6, 0xC4, 0x09, 0x21, 0xDA, 0x7C, 0xF7, 0xEE, 0xE0, 0x1D, 0xE1, + 0x6E, 0xD0, 0x5F, 0xDB, 0xA5, 0xC2, 0x3F, 0xE8, 0x79, 0xCA, 0xDA, 0xEE, + 0x57, 0xD2, 0xC3, 0xEC, 0x1B, 0xD9, 0x62, 0xE4, 0xFA, 0xDB, 0xF3, 0xE7, + 0xDE, 0xDA, 0x1F, 0xF0, 0xE3, 0xE7, 0x9D, 0xEA, 0x0C, 0xF2, 0x67, 0xE7, + 0xF7, 0xF0, 0x7C, 0xEB, 0x28, 0xF5, 0xA7, 0xEE, 0x0A, 0xFD, 0x94, 0xEA, + 0x22, 0xFA, 0xC8, 0xE6, 0x1B, 0xF0, 0x0E, 0xF2, 0x5C, 0xED, 0x2F, 0xFF, + 0xD9, 0xED, 0x79, 0x03, 0x21, 0xF4, 0x0D, 0xFB, 0x6B, 0xF9, 0x4F, 0xE8, + 0x6C, 0xF3, 0xA7, 0xE4, 0x80, 0xE9, 0x6B, 0xE9, 0x58, 0xE0, 0x24, 0xE5, + 0x0C, 0xDD, 0x06, 0xDB, 0x67, 0xDA, 0x1E, 0xD4, 0x59, 0xD2, 0xCB, 0xD5, + 0x14, 0xC0, 0x32, 0xD5, 0x22, 0xA5, 0x53, 0xDA, 0xA4, 0x9A, 0x54, 0xDB, + 0xED, 0xA8, 0xF9, 0xCB, 0xC6, 0xB8, 0xC7, 0xC9, 0x91, 0xBE, 0x27, 0xD1, + 0xD3, 0xBE, 0x0B, 0xD5, 0xE5, 0xB5, 0x77, 0xDD, 0x4E, 0xAD, 0x67, 0xE2, + 0x18, 0xB3, 0x52, 0xE4, 0xCC, 0xBE, 0x1B, 0xEB, 0xF7, 0xCF, 0xEE, 0xEF, + 0xCE, 0xDE, 0x02, 0xEA, 0x34, 0xDF, 0x80, 0xDE, 0xBB, 0xD0, 0x8B, 0xDD, + 0xE8, 0xB8, 0xA6, 0xE2, 0xEC, 0xB3, 0xFA, 0xD4, 0x71, 0xBF, 0xFD, 0xC4, + 0x4A, 0xBF, 0x0C, 0xC3, 0xAE, 0xB7, 0xA5, 0xBD, 0x00, 0xB6, 0xB9, 0xB9, + 0x1E, 0xBC, 0xD1, 0xB8, 0x3F, 0xC2, 0x0B, 0xBB, 0x10, 0xC8, 0x87, 0xC3, + 0xDE, 0xD2, 0x0E, 0xD5, 0x3A, 0xE0, 0x78, 0xE6, 0x63, 0xDF, 0x5D, 0xEE, + 0xB0, 0xCE, 0x61, 0xF6, 0x3C, 0xD8, 0xC9, 0xF7, 0xF1, 0xF2, 0x24, 0xE9, + 0x34, 0xF6, 0xB3, 0xE0, 0x9F, 0xF1, 0x53, 0xEB, 0x24, 0xE3, 0x3E, 0xE3, + 0x94, 0xC9, 0x95, 0xC9, 0xD5, 0xBB, 0x3A, 0xC2, 0x9D, 0xBD, 0xFF, 0xC0, + 0xA4, 0xD0, 0x02, 0xC2, 0xBC, 0xD9, 0xB7, 0xD6, 0xCA, 0xD6, 0xBC, 0xE9, + 0x9D, 0xDE, 0x28, 0xF0, 0xF1, 0xEB, 0xC4, 0xF4, 0x85, 0xFE, 0x7D, 0xF7, + 0x74, 0x08, 0x19, 0x0A, 0x8E, 0x08, 0x91, 0x26, 0xB6, 0x10, 0x78, 0x2E, + 0xE3, 0x12, 0x05, 0x26, 0xB8, 0xFC, 0x8A, 0x1C, 0xA5, 0xE3, 0xE0, 0x12, + 0xAF, 0xD9, 0x60, 0x08, 0xF6, 0xDA, 0x76, 0x01, 0x29, 0xEF, 0xFB, 0xF7, + 0xB2, 0x0C, 0xF7, 0xE5, 0x0C, 0x09, 0xBC, 0xDC, 0x3A, 0xE8, 0xD4, 0xE6, + 0x5A, 0xDA, 0x2F, 0xEF, 0x05, 0xE2, 0x28, 0xEF, 0x4A, 0xE5, 0x41, 0xF9, + 0xDB, 0xEC, 0xB5, 0xFF, 0x45, 0xFE, 0x32, 0xF6, 0xD6, 0x00, 0x89, 0xF5, + 0x0A, 0x02, 0x3F, 0xFA, 0xAE, 0x0F, 0x46, 0xF7, 0x94, 0x12, 0xA0, 0xFE, + 0xC9, 0x0B, 0x22, 0x10, 0x91, 0x1E, 0xFB, 0x15, 0x08, 0x40, 0xC8, 0x1A, + 0xBF, 0x42, 0x0D, 0x2A, 0xCA, 0x2E, 0x29, 0x2A, 0xCF, 0x18, 0x97, 0x1A, + 0x6A, 0x12, 0xFC, 0x0C, 0x80, 0x1D, 0x51, 0x02, 0xB4, 0x1A, 0xA4, 0xFD, + 0x66, 0x06, 0x89, 0xFC, 0x44, 0xF5, 0x84, 0xF3, 0x4B, 0xF1, 0x94, 0xE5, + 0x00, 0xF9, 0x36, 0xE2, 0x1F, 0xFF, 0xF4, 0xE6, 0x0E, 0xFE, 0xDB, 0xEC, + 0x63, 0xFE, 0x19, 0xF3, 0x75, 0x06, 0x3C, 0xF7, 0xC3, 0x09, 0x62, 0xF5, + 0xAE, 0x05, 0x75, 0xF2, 0xBE, 0x04, 0x59, 0xF6, 0x25, 0xFE, 0x2E, 0xFA, + 0xEE, 0xF3, 0x06, 0x06, 0x3E, 0xF0, 0xD1, 0x15, 0x20, 0xFA, 0x6D, 0x0A, + 0x26, 0x04, 0xC1, 0xF3, 0xD4, 0x03, 0x08, 0xF8, 0x67, 0x12, 0x4A, 0x0A, + 0xDE, 0x27, 0x85, 0x1D, 0xBC, 0x2B, 0xE3, 0x2E, 0xE8, 0x1F, 0xC1, 0x2E, + 0xD2, 0x0E, 0x97, 0x1E, 0xBF, 0x0F, 0xFE, 0x0E, 0x0C, 0x1D, 0x31, 0x0C, + 0x23, 0x17, 0xD4, 0x06, 0x82, 0x07, 0x87, 0xFB, 0xFE, 0xFE, 0xE4, 0xF7, + 0x4F, 0x01, 0x47, 0xF5, 0xC8, 0x0F, 0x3A, 0xFA, 0x65, 0x24, 0xA9, 0x0C, + 0x41, 0x3D, 0x80, 0x1D, 0xC0, 0x54, 0x48, 0x28, 0x47, 0x5F, 0x3C, 0x30, + 0x79, 0x60, 0x96, 0x2D, 0x54, 0x62, 0xCA, 0x23, 0xBF, 0x4C, 0xF0, 0x1F, + 0x5A, 0x23, 0x60, 0x19, 0xC6, 0x0A, 0xF0, 0x0B, 0xFB, 0x09, 0x19, 0xF1, + 0x9B, 0x0E, 0x5D, 0xCF, 0x3B, 0x09, 0x4A, 0xC7, 0x7D, 0x06, 0x4C, 0xD7, + 0xAC, 0x13, 0x17, 0xF1, 0x91, 0x32, 0x80, 0x0D, 0xB8, 0x57, 0xEC, 0x20, + 0x8B, 0x64, 0x30, 0x30, 0xB4, 0x5A, 0x00, 0x45, 0x89, 0x56, 0x9B, 0x57, + 0x2A, 0x5C, 0xF2, 0x60, 0x0F, 0x5F, 0x89, 0x5A, 0x87, 0x53, 0xF7, 0x48, + 0x9A, 0x37, 0xB0, 0x40, 0x12, 0x1A, 0x8A, 0x30, 0x1A, 0x08, 0xE8, 0x0F, + 0x8F, 0xFE, 0xB8, 0xFF, 0x95, 0xFE, 0xA4, 0x03, 0x5D, 0x07, 0x75, 0x06, + 0x15, 0x0B, 0xB1, 0x07, 0xF7, 0x06, 0xE3, 0x0D, 0x95, 0x06, 0xB6, 0x13, + 0x65, 0x0E, 0xE0, 0x17, 0xC5, 0x0F, 0x2C, 0x20, 0x69, 0x17, 0x82, 0x23, + 0x28, 0x33, 0x31, 0x1C, 0xCA, 0x39, 0x89, 0x1C, 0xDA, 0x28, 0xCA, 0x20, + 0x7A, 0x22, 0xDE, 0x19, 0x81, 0x24, 0x70, 0x12, 0xE4, 0x2C, 0x47, 0x11, + 0x26, 0x3A, 0x50, 0x1B, 0xAD, 0x45, 0x98, 0x32, 0xE3, 0x51, 0x98, 0x45, + 0x89, 0x57, 0x3C, 0x42, 0xB2, 0x52, 0x0A, 0x27, 0x0B, 0x46, 0xFA, 0x0E, + 0x83, 0x32, 0xD1, 0x04, 0x27, 0x1B, 0xE1, 0xF6, 0x23, 0x0C, 0xCD, 0xE7, + 0x07, 0x06, 0xC1, 0xE5, 0x28, 0x01, 0x4E, 0xE1, 0xE9, 0xFC, 0xF5, 0xD7, + 0xD5, 0xEC, 0x7B, 0xDA, 0x59, 0xDD, 0xCA, 0xE1, 0xEB, 0xE1, 0xAA, 0xF0, + 0x5F, 0xF0, 0x4C, 0xF7, 0xA9, 0xFC, 0xF0, 0xF0, 0xB5, 0x04, 0xC1, 0xF3, + 0x46, 0x08, 0xD8, 0xF6, 0x2F, 0xFC, 0x4C, 0xF3, 0x0C, 0xEA, 0x4F, 0xF2, + 0x68, 0xE5, 0x15, 0xFD, 0xF6, 0xEF, 0x06, 0x04, 0x1B, 0x01, 0x92, 0xF8, + 0xE5, 0x0A, 0x40, 0xF5, 0xF3, 0x0C, 0x3A, 0xFA, 0x4E, 0x06, 0x7B, 0xFB, + 0x00, 0xF8, 0x8E, 0x09, 0xF6, 0xF9, 0x75, 0x14, 0x61, 0x0E, 0x6B, 0x13, + 0x60, 0x1B, 0xFB, 0x13, 0x9A, 0x23, 0x1A, 0x15, 0xE8, 0x27, 0xAE, 0x20, + 0x71, 0x1D, 0x6A, 0x2B, 0x98, 0x11, 0x68, 0x24, 0xD8, 0x0E, 0x4D, 0x1D, + 0xFA, 0x0E, 0x40, 0x1B, 0x68, 0x13, 0x48, 0x22, 0x86, 0x1C, 0xC4, 0x32, + 0x9E, 0x2D, 0xE6, 0x39, 0xD0, 0x36, 0x35, 0x3F, 0xEA, 0x31, 0x9A, 0x49, + 0x69, 0x39, 0x33, 0x50, 0xB8, 0x3A, 0x64, 0x4D, 0x2E, 0x2A, 0x8A, 0x38, + 0xCE, 0x24, 0xD1, 0x12, 0x2D, 0x1C, 0x68, 0xF5, 0x88, 0x04, 0xEE, 0xEF, + 0x5C, 0xFE, 0x85, 0xF7, 0x16, 0x06, 0x94, 0x06, 0x1A, 0x13, 0xB8, 0x1B, + 0x0E, 0x26, 0x0E, 0x32, 0x67, 0x2C, 0xA3, 0x48, 0x4C, 0x37, 0xF9, 0x55, + 0x18, 0x51, 0x9D, 0x4E, 0x9A, 0x5F, 0xA8, 0x4B, 0x57, 0x5D, 0xEE, 0x57, + 0x0D, 0x55, 0xAD, 0x60, 0x03, 0x4A, 0x34, 0x59, 0xF0, 0x3D, 0x3F, 0x43, + 0xB1, 0x35, 0x33, 0x2E, 0x08, 0x2D, 0xA1, 0x14, 0xAC, 0x10, 0xA7, 0x05, + 0x52, 0xF8, 0x1C, 0x03, 0x09, 0xFC, 0xE5, 0xF6, 0x55, 0xFD, 0xF3, 0xF8, + 0x4C, 0xF8, 0x49, 0x06, 0xF7, 0xF7, 0x1D, 0x13, 0x6F, 0xFD, 0xF4, 0x20, + 0x0E, 0x0C, 0x2F, 0x22, 0x2F, 0x17, 0xE8, 0x20, 0x82, 0x20, 0xC7, 0x20, + 0x91, 0x27, 0x8E, 0x1A, 0xB1, 0x1A, 0x9C, 0x17, 0x37, 0x19, 0x1A, 0x16, + 0x01, 0x2F, 0x8C, 0x1A, 0xF3, 0x27, 0xCF, 0x24, 0x83, 0x0E, 0xE6, 0x2A, + 0xB9, 0x10, 0xA2, 0x32, 0xDB, 0x1E, 0x51, 0x2E, 0x10, 0x19, 0x10, 0x27, + 0x1F, 0x08, 0xFD, 0x28, 0xC8, 0xFE, 0x96, 0x15, 0xD2, 0xFB, 0xC4, 0xF6, + 0x8B, 0xFF, 0x45, 0xEE, 0xAA, 0x03, 0x26, 0xF4, 0x43, 0xFA, 0x5A, 0xF5, + 0x5E, 0xE3, 0x1E, 0xF9, 0x9C, 0xCE, 0x50, 0xFE, 0x7D, 0xC7, 0x29, 0xF3, + 0x8D, 0xC1, 0x1D, 0xE8, 0xBA, 0xC1, 0xED, 0xE3, 0x1F, 0xCA, 0xC8, 0xD4, + 0x71, 0xCC, 0xC8, 0xCA, 0x01, 0xCB, 0x91, 0xD1, 0x3B, 0xC0, 0xAA, 0xDA, + 0x6A, 0xB3, 0x0D, 0xE1, 0x68, 0xAE, 0xF4, 0xDD, 0x52, 0xB1, 0x77, 0xD7, + 0x94, 0xC8, 0x1F, 0xD7, 0xC8, 0xE3, 0xAF, 0xD2, 0xAA, 0xE7, 0xCE, 0xD6, + 0x44, 0xD8, 0x8B, 0xE7, 0x45, 0xD1, 0x99, 0xEF, 0xD9, 0xD0, 0x6B, 0xE9, + 0x10, 0xC6, 0x5A, 0xDD, 0xE1, 0xC2, 0x8D, 0xD6, 0x0C, 0xBD, 0x38, 0xCC, + 0x98, 0xAC, 0xCF, 0xC6, 0xAE, 0xAD, 0x5B, 0xCB, 0xD4, 0xB1, 0x56, 0xCD, + 0xEC, 0xA7, 0x48, 0xD3, 0x41, 0xB4, 0xB7, 0xDC, 0x40, 0xD2, 0x57, 0xE8, + 0x90, 0xEB, 0x27, 0xF0, 0x83, 0x05, 0x61, 0xEE, 0x8B, 0x0A, 0xB9, 0xF4, + 0x63, 0xF1, 0x02, 0x00, 0x40, 0xCB, 0x19, 0xF9, 0x7E, 0xB8, 0x49, 0xDD, + 0xFE, 0xC1, 0xB4, 0xC0, 0x7A, 0xBD, 0x8A, 0xB2, 0x38, 0xAD, 0xCD, 0xA5, + 0x55, 0xAA, 0x3C, 0x9F, 0x63, 0xAA, 0x0A, 0xA6, 0x12, 0xB8, 0x8E, 0xA5, + 0xED, 0xCF, 0x6B, 0xAC, 0x34, 0xDF, 0x5A, 0xCF, 0xCE, 0xEB, 0xB3, 0xEE, + 0xE7, 0xF8, 0x9D, 0xFF, 0x4D, 0x06, 0x2C, 0x11, 0xDB, 0x09, 0x63, 0x1C, + 0x34, 0x05, 0x56, 0x1E, 0x7A, 0x01, 0x9A, 0x1F, 0xC9, 0xFC, 0x84, 0x1B, + 0xC5, 0xEA, 0xC8, 0x0C, 0x74, 0xCE, 0xF9, 0xFB, 0xF6, 0xC4, 0x26, 0xEC, + 0x83, 0xC0, 0x85, 0xDD, 0xB1, 0xB4, 0xC3, 0xD5, 0x31, 0xB5, 0xA1, 0xDD, + 0x6B, 0xC4, 0x8B, 0xEC, 0xCD, 0xD1, 0xA1, 0xF6, 0x07, 0xD3, 0xBD, 0xFE, + 0xE4, 0xE0, 0xA4, 0xFD, 0x85, 0xF9, 0xE2, 0xF3, 0x48, 0xF8, 0x43, 0xF5, + 0x88, 0xE2, 0x04, 0x00, 0xFD, 0xE2, 0xF0, 0xFD, 0xFE, 0xF6, 0xA3, 0xF1, + 0x2D, 0xFE, 0x21, 0xEA, 0x07, 0xFE, 0x51, 0xEB, 0xC5, 0xFC, 0x36, 0xF6, + 0x6B, 0xFB, 0x56, 0xFD, 0xEA, 0x05, 0x63, 0xFC, 0x55, 0x1D, 0x16, 0xF8, + 0xA8, 0x2C, 0xAD, 0xF1, 0xC1, 0x21, 0xEE, 0xF3, 0xA0, 0x0C, 0x62, 0xF7, + 0xDE, 0xF6, 0x2A, 0xEA, 0xB6, 0xDC, 0x7D, 0xD2, 0x0D, 0xD2, 0xBD, 0xC5, + 0x5B, 0xD5, 0xF3, 0xC4, 0x83, 0xDB, 0x12, 0xC6, 0xE6, 0xD9, 0xF7, 0xCB, + 0x95, 0xC8, 0xB0, 0xD5, 0xE0, 0xBE, 0x9C, 0xDB, 0xEF, 0xCF, 0x82, 0xDD, + 0x40, 0xEB, 0x7B, 0xE0, 0x6B, 0xF6, 0x34, 0xE9, 0xE0, 0xF0, 0xDE, 0xF2, + 0xA1, 0xDB, 0xAD, 0xF2, 0x3F, 0xBD, 0xD0, 0xE8, 0x8F, 0xB1, 0xEA, 0xDA, + 0x21, 0xBB, 0xC3, 0xC7, 0xF6, 0xC5, 0x6C, 0xBA, 0x3E, 0xCF, 0xB1, 0xC5, + 0x80, 0xD8, 0x3C, 0xDB, 0xAB, 0xD6, 0xF1, 0xDF, 0x41, 0xD1, 0xD1, 0xD9, + 0xF0, 0xDF, 0xCD, 0xD7, 0x7A, 0xF4, 0xB6, 0xCF, 0x7F, 0xFC, 0x71, 0xCA, + 0x16, 0x00, 0xF7, 0xCF, 0xF2, 0xFD, 0xE2, 0xCB, 0x0F, 0xEC, 0x92, 0xBF, + 0xCA, 0xD4, 0x1C, 0xBF, 0x0F, 0xCF, 0x45, 0xCA, 0xAE, 0xCF, 0x61, 0xD6, + 0xDD, 0xD4, 0x22, 0xE7, 0xA1, 0xEC, 0x1E, 0xF7, 0xA9, 0x0A, 0xE6, 0xF9, + 0x15, 0x21, 0x74, 0xF6, 0x13, 0x21, 0x85, 0x01, 0x29, 0x16, 0xCB, 0x04, + 0x5A, 0x0B, 0x94, 0xEF, 0x78, 0xF8, 0x56, 0xDD, 0x10, 0xE9, 0x31, 0xCE, + 0xFB, 0xDA, 0x21, 0xC0, 0x93, 0xC6, 0xFD, 0xB1, 0xD0, 0xBB, 0xE4, 0xA5, + 0xEB, 0xBB, 0xE4, 0xA7, 0xDE, 0xBC, 0xEC, 0xB6, 0x89, 0xD3, 0x0D, 0xD2, + 0x28, 0x03, 0xBB, 0xF0, 0xBF, 0x26, 0x22, 0x0A, 0x43, 0x39, 0x3B, 0x1C, + 0xA0, 0x46, 0xB4, 0x22, 0x7A, 0x46, 0x7F, 0x1E, 0xF6, 0x39, 0x59, 0x17, + 0xC4, 0x2A, 0xB7, 0x0A, 0x0D, 0x1B, 0x98, 0x03, 0x1A, 0x09, 0xB5, 0x01, + 0x71, 0xEC, 0x9D, 0xEF, 0x04, 0xD1, 0x7B, 0xD3, 0x0D, 0xCB, 0x82, 0xBE, + 0xCF, 0xCF, 0x2D, 0xC4, 0xA7, 0xD5, 0x3E, 0xDD, 0x97, 0xE1, 0x1A, 0xF6, + 0x83, 0xF0, 0xEE, 0x08, 0x99, 0x02, 0x38, 0x11, 0x2B, 0x18, 0x38, 0x1A, + 0xA8, 0x25, 0x0C, 0x26, 0x8D, 0x27, 0x0C, 0x32, 0xCF, 0x20, 0x5B, 0x40, + 0xAC, 0x1D, 0xDF, 0x41, 0x67, 0x1A, 0xE2, 0x31, 0x15, 0x10, 0xF8, 0x24, + 0x0F, 0x11, 0x76, 0x25, 0x17, 0x23, 0xAC, 0x29, 0x63, 0x2E, 0x8E, 0x26, + 0x81, 0x27, 0x27, 0x1E, 0x70, 0x22, 0xF3, 0x15, 0x18, 0x25, 0x31, 0x06, + 0x02, 0x26, 0x78, 0xF5, 0x01, 0x26, 0xE8, 0xF4, 0x99, 0x22, 0xA4, 0xF8, + 0x9A, 0x1E, 0x3E, 0xF0, 0x46, 0x15, 0xB5, 0xE2, 0x55, 0xFB, 0xF4, 0xE1, + 0xCC, 0xEB, 0xD2, 0xE7, 0x61, 0xF0, 0x37, 0xE5, 0xC8, 0xF1, 0x20, 0xE1, + 0x92, 0xFA, 0x3C, 0xE2, 0xE7, 0x0B, 0xA7, 0xEB, 0xAE, 0x13, 0x38, 0xF1, + 0x5A, 0x18, 0x64, 0xF4, 0xAA, 0x1E, 0x8F, 0xFF, 0x4E, 0x1F, 0x37, 0x0B, + 0x93, 0x12, 0xA5, 0x12, 0xCA, 0xFF, 0x4F, 0x0D, 0x06, 0xF5, 0x14, 0x00, + 0x0F, 0xF0, 0xD2, 0xF5, 0x1E, 0xF0, 0xEB, 0xEE, 0x19, 0xF2, 0xF1, 0xF3, + 0xC4, 0xEF, 0xB8, 0xFA, 0xE9, 0xEE, 0x7F, 0xEC, 0x5D, 0xF1, 0xEE, 0xDE, + 0x3A, 0xFA, 0x0B, 0xE2, 0x19, 0xFA, 0x73, 0xEE, 0xB3, 0xE8, 0xF1, 0xFD, + 0x57, 0xE7, 0x2D, 0xFC, 0x13, 0xF8, 0x82, 0xF0, 0x77, 0x03, 0x99, 0xF4, + 0x9D, 0x06, 0x5D, 0x0F, 0x54, 0x0A, 0xDD, 0x25, 0x67, 0x1A, 0x47, 0x26, + 0x66, 0x24, 0xD4, 0x26, 0xC1, 0x1B, 0x4A, 0x27, 0xD5, 0x12, 0xAB, 0x20, + 0xD5, 0x08, 0x51, 0x1A, 0xA7, 0xF7, 0x95, 0x0E, 0x49, 0xEF, 0x35, 0xF8, + 0x94, 0xF2, 0x23, 0xEC, 0xF4, 0xF8, 0x6A, 0xE8, 0x49, 0xFF, 0x5F, 0xDD, + 0x9C, 0x05, 0x09, 0xDB, 0x61, 0x11, 0xE1, 0xEA, 0xF8, 0x1B, 0x0B, 0x03, + 0x3C, 0x1E, 0xAA, 0x18, 0xF5, 0x1B, 0x6F, 0x29, 0x59, 0x25, 0x44, 0x32, + 0x1F, 0x3F, 0xA1, 0x37, 0x88, 0x5B, 0x5A, 0x3D, 0xAE, 0x6A, 0xC0, 0x34, + 0x6E, 0x58, 0x53, 0x28, 0x5E, 0x32, 0xEB, 0x25, 0xFF, 0x12, 0x74, 0x21, + 0x04, 0x03, 0xF3, 0x14, 0x12, 0x0B, 0xBA, 0x0B, 0x1D, 0x13, 0x0C, 0x09, + 0x01, 0x0A, 0x86, 0xFE, 0xF1, 0xF4, 0xC4, 0x00, 0xD4, 0xDD, 0x98, 0x15, + 0x93, 0xDA, 0xF8, 0x1A, 0x2A, 0xF1, 0x6E, 0x1B, 0x1F, 0x14, 0x0E, 0x24, + 0xF6, 0x29, 0x34, 0x2D, 0x96, 0x34, 0x26, 0x3D, 0x82, 0x3D, 0x77, 0x4C, + 0x2F, 0x34, 0xB8, 0x54, 0xF9, 0x33, 0x42, 0x56, 0x2F, 0x4D, 0x49, 0x56, + 0xD4, 0x57, 0xD8, 0x57, 0x6C, 0x50, 0xF2, 0x54, 0x5C, 0x3A, 0xC4, 0x4F, + 0x33, 0x21, 0x1F, 0x49, 0x01, 0x26, 0xD5, 0x3D, 0xB9, 0x38, 0x9F, 0x31, + 0x6C, 0x37, 0xF1, 0x1D, 0x49, 0x24, 0x80, 0x11, 0x72, 0x10, 0xCE, 0x15, + 0xD6, 0x05, 0xD4, 0x0F, 0x4A, 0x0C, 0x75, 0x03, 0x72, 0x1A, 0x93, 0x06, + 0x19, 0x19, 0x97, 0x16, 0x07, 0x13, 0x57, 0x22, 0x8B, 0x1A, 0x85, 0x24, + 0xF1, 0x2B, 0x44, 0x21, 0x1E, 0x38, 0xA4, 0x25, 0x22, 0x37, 0xE2, 0x2C, + 0x35, 0x2C, 0x87, 0x2E, 0x5F, 0x1C, 0xCE, 0x2F, 0xAE, 0x14, 0x65, 0x27, + 0xCA, 0x0F, 0x49, 0x22, 0xA9, 0x05, 0xB1, 0x2B, 0x70, 0xFE, 0x70, 0x35, + 0x60, 0x08, 0x50, 0x2F, 0x3F, 0x23, 0x07, 0x25, 0x76, 0x36, 0x39, 0x2D, + 0xDB, 0x32, 0x9C, 0x30, 0x0C, 0x21, 0xDA, 0x2B, 0xF0, 0x18, 0xFA, 0x23, + 0x38, 0x15, 0x70, 0x0C, 0xA2, 0x08, 0x7B, 0xFB, 0x4B, 0x00, 0x7E, 0xFD, + 0x7A, 0x07, 0x0A, 0xFF, 0xE8, 0x12, 0x68, 0xFB, 0xE2, 0x15, 0xD4, 0x03, + 0x9C, 0x16, 0xD1, 0x18, 0xCB, 0x16, 0x27, 0x2D, 0x77, 0x1F, 0x56, 0x39, + 0xD9, 0x35, 0xF1, 0x36, 0xFE, 0x47, 0xD4, 0x34, 0x1C, 0x53, 0xAB, 0x37, + 0xF4, 0x45, 0x5B, 0x36, 0x17, 0x19, 0x27, 0x29, 0xD3, 0xF9, 0xDD, 0x0A, + 0x02, 0xEB, 0xA3, 0xED, 0xEC, 0xD7, 0x77, 0xDE, 0xFF, 0xCA, 0xFE, 0xDD, + 0xDF, 0xCA, 0x82, 0xEB, 0xDF, 0xDB, 0xD8, 0xF9, 0xF4, 0xF7, 0xF3, 0x04, + 0x30, 0x0B, 0x80, 0x1E, 0xD7, 0x19, 0x0F, 0x3D, 0x0A, 0x33, 0x04, 0x54, + 0x20, 0x4F, 0xA9, 0x5F, 0x1B, 0x58, 0x3F, 0x5A, 0xC8, 0x49, 0x1C, 0x53, + 0xA2, 0x2F, 0x90, 0x4D, 0xAB, 0x14, 0x76, 0x39, 0x4D, 0xFB, 0xA5, 0x21, + 0xBC, 0xEA, 0x64, 0x10, 0x53, 0xE8, 0xBE, 0xF9, 0x7F, 0xE3, 0x83, 0xEA, + 0xCE, 0xDA, 0x54, 0xE8, 0xEC, 0xD3, 0x4C, 0xE9, 0xD6, 0xD1, 0x84, 0xEB, + 0x83, 0xDC, 0xB8, 0xE9, 0xAD, 0xE4, 0x22, 0xEF, 0xFB, 0xEB, 0xA2, 0xFB, + 0xFA, 0x01, 0x26, 0x0A, 0x6F, 0x11, 0x05, 0x19, 0x38, 0x12, 0x2F, 0x25, + 0x25, 0x11, 0x24, 0x32, 0x4A, 0x0D, 0x61, 0x31, 0xCA, 0x02, 0x7E, 0x1E, + 0xA0, 0xFF, 0x26, 0x0C, 0xA3, 0x03, 0x32, 0x0C, 0xCC, 0x01, 0x4A, 0x12, + 0xFB, 0xFF, 0x1A, 0x12, 0xAB, 0x01, 0x35, 0x10, 0xB0, 0x05, 0x3A, 0xFE, + 0xC0, 0x03, 0x98, 0xE9, 0xC0, 0xF9, 0x4E, 0xE9, 0x5B, 0xEC, 0x19, 0xE8, + 0xD2, 0xDB, 0xD2, 0xD6, 0x0F, 0xCE, 0x5D, 0xC3, 0xE7, 0xC4, 0x75, 0xB7, + 0xCF, 0xC2, 0x0B, 0xB4, 0x1C, 0xC4, 0xB3, 0xB9, 0x7D, 0xC7, 0x05, 0xC0, + 0xCB, 0xCD, 0xFC, 0xBE, 0xE4, 0xCD, 0xBD, 0xBD, 0xA8, 0xC3, 0xA2, 0xCB, + 0xD8, 0xC5, 0x80, 0xD7, 0xEE, 0xD7, 0x34, 0xD1, 0xDF, 0xE0, 0x5A, 0xCA, + 0x2D, 0xDD, 0x49, 0xCA, 0x53, 0xCF, 0x01, 0xCE, 0x98, 0xBD, 0x52, 0xCF, + 0xC9, 0xB7, 0x5F, 0xC8, 0x03, 0xC2, 0x56, 0xBE, 0xF6, 0xC3, 0x79, 0xC4, + 0x4D, 0xBD, 0xDA, 0xD6, 0x0F, 0xC3, 0xFD, 0xD4, 0x4C, 0xC8, 0x9D, 0xC7, + 0x9D, 0xCB, 0xC1, 0xC1, 0xE7, 0xCF, 0xCE, 0xC0, 0xAF, 0xC9, 0xA8, 0xC9, + 0xEF, 0xC2, 0xD7, 0xD4, 0xFD, 0xC2, 0xE6, 0xD4, 0x21, 0xC5, 0xE3, 0xD3, + 0x54, 0xC7, 0xCB, 0xDF, 0x5F, 0xC4, 0xC1, 0xF3, 0x3A, 0xCA, 0xC7, 0x01, + 0xBF, 0xE2, 0x92, 0x06, 0x70, 0xF3, 0xC5, 0x08, 0xF1, 0xEC, 0xF7, 0x02, + 0x03, 0xDF, 0x62, 0xF9, 0x92, 0xD5, 0x91, 0xEF, 0x2F, 0xCA, 0xA3, 0xD5, + 0x03, 0xBD, 0x14, 0xB9, 0xB3, 0xB6, 0xB0, 0xA8, 0x02, 0xB2, 0xD2, 0x9A, + 0xFD, 0xA8, 0xAC, 0x9C, 0xE2, 0xB3, 0xC6, 0xAE, 0x77, 0xD9, 0xA1, 0xC2, + 0xD7, 0xFE, 0xB6, 0xD6, 0xD9, 0x17, 0x45, 0xF0, 0xD7, 0x27, 0x2E, 0x06, + 0xEA, 0x25, 0x49, 0x10, 0x18, 0x17, 0x18, 0x19, 0x75, 0x0B, 0x18, 0x1E, + 0x75, 0x06, 0xAC, 0x12, 0x90, 0x03, 0x99, 0xF8, 0x0E, 0xF4, 0x29, 0xE3, + 0x39, 0xE2, 0x2C, 0xD8, 0x0F, 0xDA, 0xE5, 0xD2, 0x06, 0xD0, 0xE0, 0xCB, + 0x5B, 0xC9, 0x20, 0xC8, 0x53, 0xD8, 0x35, 0xC7, 0x9F, 0xE0, 0x01, 0xD0, + 0xD3, 0xCF, 0xC9, 0xE2, 0x6E, 0xC8, 0xFB, 0xE2, 0xBF, 0xD0, 0x44, 0xDF, + 0xFD, 0xDA, 0xCA, 0xE6, 0xAB, 0xE7, 0xC2, 0xF7, 0x47, 0xF7, 0x0A, 0x0C, + 0xA1, 0xFE, 0x4A, 0x1E, 0xA1, 0x03, 0x86, 0x2D, 0xEC, 0x13, 0xA1, 0x2A, + 0xD2, 0x24, 0xF1, 0x1E, 0xC5, 0x24, 0xC5, 0x14, 0x5D, 0x17, 0xB5, 0x0B, + 0x26, 0x0F, 0x7B, 0x07, 0x14, 0x0C, 0x4B, 0xFF, 0xE1, 0x09, 0xD9, 0xED, + 0xB3, 0x08, 0x17, 0xDE, 0xFF, 0x02, 0x67, 0xD1, 0x1F, 0xF8, 0xAB, 0xCB, + 0x55, 0xF2, 0x02, 0xD6, 0x09, 0xF6, 0x06, 0xDE, 0x75, 0xFB, 0x8C, 0xD4, + 0xD6, 0xF9, 0xE5, 0xCD, 0xE7, 0xF8, 0x7C, 0xD9, 0x80, 0xFE, 0xAB, 0xE9, + 0xDA, 0xFD, 0xF3, 0xF0, 0x3F, 0xF0, 0xF5, 0xFE, 0x28, 0xEB, 0x16, 0x06, + 0x39, 0xF7, 0x3F, 0xF1, 0xB3, 0xF6, 0x55, 0xDB, 0xF2, 0xE8, 0xB0, 0xD8, + 0x19, 0xD8, 0xAE, 0xE2, 0xD6, 0xC9, 0x92, 0xEA, 0xE6, 0xC8, 0xA0, 0xF1, + 0xE6, 0xCB, 0x76, 0xF1, 0xB1, 0xD8, 0x89, 0xE4, 0x69, 0xE9, 0x19, 0xE4, + 0xB0, 0xF0, 0x7F, 0xF0, 0xDF, 0xF6, 0x65, 0xF3, 0x12, 0x00, 0xD0, 0xEF, + 0xEB, 0x0A, 0x40, 0xE5, 0xCA, 0x05, 0x82, 0xDC, 0x0D, 0xF1, 0x70, 0xDE, + 0x76, 0xE5, 0xCE, 0xDE, 0x89, 0xE7, 0xDB, 0xE4, 0xF5, 0xF3, 0x75, 0xEE, + 0xBE, 0xF9, 0x85, 0xFC, 0x08, 0xFA, 0x50, 0x15, 0x8E, 0x15, 0xEA, 0x26, + 0x72, 0x31, 0x36, 0x2F, 0xDB, 0x3D, 0xA8, 0x30, 0x6E, 0x44, 0xCC, 0x33, + 0xBE, 0x36, 0x5A, 0x34, 0x41, 0x23, 0xD2, 0x25, 0x54, 0x17, 0xD4, 0x16, + 0x3D, 0x04, 0xFE, 0x06, 0x4B, 0xE7, 0xC1, 0xEB, 0x16, 0xD5, 0xC5, 0xD6, + 0x90, 0xD2, 0x94, 0xD6, 0x59, 0xDF, 0x41, 0xE4, 0xB6, 0xFA, 0x87, 0xFF, + 0xCF, 0x1B, 0x1A, 0x22, 0x14, 0x3E, 0x2B, 0x3C, 0xD1, 0x5A, 0x82, 0x43, + 0x2D, 0x67, 0x0B, 0x41, 0x73, 0x60, 0x75, 0x45, 0x6F, 0x4D, 0xFA, 0x4D, + 0x22, 0x35, 0x5D, 0x4E, 0x4E, 0x2E, 0x14, 0x37, 0x03, 0x33, 0xDE, 0x12, + 0x2E, 0x24, 0x4C, 0xF9, 0xDF, 0x03, 0x9E, 0xE9, 0xDA, 0xEC, 0xD1, 0xDF, + 0xCD, 0xFB, 0xE9, 0xD5, 0x79, 0x10, 0xA1, 0xD5, 0x82, 0x0E, 0x05, 0xE5, + 0xCB, 0x15, 0x87, 0xF5, 0x7F, 0x1E, 0xEE, 0x09, 0x3C, 0x1D, 0xD6, 0x15, + 0x13, 0x1F, 0x1C, 0x16, 0x7E, 0x1F, 0xAB, 0x21, 0xE1, 0x19, 0x91, 0x2B, + 0x32, 0x0E, 0x37, 0x2C, 0x7B, 0x09, 0xDF, 0x29, 0xC6, 0x0F, 0xB9, 0x26, + 0xB1, 0x10, 0xDE, 0x25, 0xAC, 0x0C, 0xB5, 0x25, 0xEA, 0x09, 0x82, 0x20, + 0xC1, 0x06, 0xC9, 0x14, 0xC0, 0x04, 0x08, 0x0C, 0xCA, 0x00, 0x4B, 0x08, + 0x15, 0xFC, 0x64, 0xF7, 0x94, 0xF4, 0x4F, 0xE0, 0x2D, 0xF3, 0x4D, 0xD5, + 0x57, 0xF9, 0x13, 0xCF, 0x35, 0xEA, 0x2D, 0xCE, 0x96, 0xCE, 0x5C, 0xD1, + 0xA9, 0xCD, 0xA2, 0xD0, 0x3E, 0xE4, 0x84, 0xCA, 0x80, 0xF3, 0xDA, 0xC6, + 0x45, 0xEC, 0x36, 0xD3, 0x29, 0xE3, 0x6D, 0xE9, 0x93, 0xE8, 0x54, 0xF6, + 0xC2, 0xEE, 0x0E, 0xF9, 0x87, 0xF8, 0x33, 0xEE, 0x2F, 0x05, 0x39, 0xDE, + 0xED, 0x02, 0x57, 0xE0, 0x71, 0xF4, 0x74, 0xEC, 0xEF, 0xE7, 0xE7, 0xF5, + 0x40, 0xE8, 0x06, 0xF7, 0xAA, 0xEB, 0xC3, 0xE6, 0x23, 0xE2, 0x79, 0xD8, + 0xFD, 0xDC, 0x03, 0xD7, 0xDC, 0xDC, 0xC3, 0xDE, 0x40, 0xDC, 0xF4, 0xE6, + 0x21, 0xE9, 0x84, 0xE7, 0xE2, 0xFB, 0x38, 0xEC, 0x6F, 0x03, 0x45, 0xED, + 0xDD, 0x03, 0xAE, 0xEC, 0x9B, 0x02, 0x35, 0xEF, 0x47, 0xFA, 0x65, 0xEE, + 0x7E, 0xF0, 0x65, 0xF5, 0x5B, 0xF3, 0x97, 0x06, 0x1E, 0x06, 0xEA, 0x12, + 0x09, 0x1C, 0x0A, 0x1D, 0x80, 0x27, 0x04, 0x2F, 0x83, 0x2C, 0xEC, 0x36, + 0x40, 0x34, 0x54, 0x30, 0xEC, 0x35, 0x68, 0x25, 0x50, 0x27, 0x77, 0x16, + 0x13, 0x0E, 0x6B, 0x00, 0x58, 0x00, 0xB1, 0xF1, 0xE5, 0xFC, 0x2B, 0xF2, + 0x36, 0xF8, 0xF3, 0xF4, 0xC0, 0x04, 0x8C, 0xFE, 0x0F, 0x19, 0xE9, 0x16, + 0x82, 0x24, 0x73, 0x37, 0x1A, 0x36, 0xC5, 0x4D, 0xF2, 0x48, 0x2D, 0x5C, + 0xF9, 0x57, 0xC0, 0x63, 0xDC, 0x64, 0x13, 0x60, 0xEF, 0x56, 0x2A, 0x62, + 0x41, 0x3D, 0x6C, 0x62, 0x21, 0x41, 0x83, 0x55, 0x20, 0x4D, 0x75, 0x45, + 0xA1, 0x49, 0x62, 0x30, 0x7B, 0x3D, 0x96, 0x20, 0xFC, 0x2F, 0x81, 0x1D, + 0x3B, 0x26, 0xC2, 0x15, 0x9C, 0x1B, 0xD9, 0x0E, 0x53, 0x1A, 0xFB, 0x14, + 0xDA, 0x2A, 0xC4, 0x24, 0x53, 0x3A, 0xDC, 0x36, 0xFF, 0x4A, 0x9D, 0x3E, + 0x60, 0x55, 0x8C, 0x49, 0x0E, 0x4D, 0x33, 0x5C, 0x86, 0x4C, 0xA8, 0x61, + 0x86, 0x57, 0x6F, 0x5F, 0x5E, 0x5F, 0xB2, 0x5D, 0xD4, 0x62, 0xB8, 0x5B, + 0x18, 0x5D, 0x67, 0x5F, 0x22, 0x54, 0x6E, 0x62, 0xF8, 0x4C, 0x06, 0x5F, + 0x69, 0x46, 0xB5, 0x58, 0x76, 0x46, 0x76, 0x4E, 0xBD, 0x42, 0xF4, 0x40, + 0x0C, 0x31, 0x04, 0x39, 0xBD, 0x26, 0x2D, 0x33, 0xE0, 0x32, 0x00, 0x24, + 0x75, 0x40, 0xE3, 0x18, 0xB5, 0x40, 0xDA, 0x16, 0x5D, 0x3F, 0x30, 0x10, + 0x6C, 0x3D, 0x11, 0x0D, 0xC9, 0x36, 0x71, 0x15, 0x53, 0x34, 0xFC, 0x18, + 0x7C, 0x30, 0x61, 0x18, 0x6C, 0x2B, 0xC7, 0x19, 0x28, 0x29, 0x7B, 0x17, + 0x5E, 0x25, 0xB9, 0x15, 0xD7, 0x1D, 0xC0, 0x17, 0x88, 0x16, 0xF4, 0x19, + 0x84, 0x17, 0x3E, 0x16, 0xDE, 0x1E, 0xEF, 0x15, 0x7F, 0x20, 0x6D, 0x20, + 0x15, 0x17, 0xB4, 0x29, 0x31, 0x0E, 0x4E, 0x2C, 0x43, 0x05, 0x17, 0x2E, + 0x94, 0xF8, 0x4D, 0x28, 0x96, 0xF8, 0x45, 0x1F, 0xBA, 0x04, 0x52, 0x1F, + 0xAC, 0x03, 0x07, 0x1B, 0x30, 0xF2, 0xAD, 0x14, 0xF8, 0xEB, 0x0D, 0x13, + 0xDC, 0xF8, 0x45, 0x0E, 0x8A, 0xFE, 0xEE, 0x08, 0xE5, 0xF3, 0x0E, 0x0A, + 0x43, 0xEC, 0xED, 0x0D, 0xFA, 0xF4, 0x1D, 0x13, 0x8D, 0x02, 0x6A, 0x19, + 0xC4, 0x0A, 0x2B, 0x1D, 0x93, 0x11, 0x34, 0x20, 0x1A, 0x19, 0xDA, 0x18, + 0x6C, 0x16, 0xD7, 0x09, 0xC8, 0x00, 0x20, 0xFF, 0x11, 0xEF, 0x5C, 0xEC, + 0xCC, 0xE9, 0xD9, 0xD7, 0x19, 0xE4, 0xC6, 0xD1, 0xD4, 0xE3, 0x0D, 0xD1, + 0x25, 0xEB, 0xA5, 0xD8, 0x45, 0xF5, 0x64, 0xE8, 0xE0, 0xF4, 0x68, 0xFA, + 0xE7, 0xF1, 0x92, 0x0E, 0x91, 0x05, 0xEA, 0x20, 0xD5, 0x23, 0x63, 0x2E, + 0x31, 0x36, 0xDF, 0x32, 0xE7, 0x37, 0xA9, 0x30, 0xA2, 0x22, 0x3D, 0x2A, + 0x9C, 0x06, 0x33, 0x1F, 0xDC, 0xF6, 0xDC, 0x0D, 0xFE, 0xEF, 0xE2, 0xF1, + 0x63, 0xEA, 0x89, 0xD2, 0x39, 0xD6, 0xBE, 0xBF, 0xC4, 0xBD, 0x55, 0xB9, + 0xFA, 0xBC, 0x6E, 0xB4, 0x0A, 0xC5, 0x9C, 0xB9, 0x26, 0xCB, 0xCA, 0xC9, + 0xF4, 0xDC, 0x4A, 0xD2, 0x5D, 0xE9, 0x62, 0xDC, 0xF5, 0xF5, 0x78, 0xF0, + 0x37, 0x0A, 0x00, 0xFC, 0xA5, 0x11, 0xE8, 0xFF, 0xA6, 0x11, 0xED, 0x06, + 0xD5, 0x13, 0xB9, 0x09, 0x09, 0x11, 0x56, 0x0A, 0x7C, 0x0B, 0x14, 0x15, + 0xE5, 0x08, 0x2C, 0x21, 0x12, 0x01, 0xA3, 0x1E, 0x57, 0xF8, 0xC8, 0x16, + 0x20, 0xF4, 0xB2, 0x11, 0x7A, 0xF3, 0xA1, 0x0B, 0x22, 0xF1, 0xEA, 0x06, + 0xD9, 0xDF, 0x96, 0x06, 0x78, 0xD1, 0xB3, 0x05, 0xB9, 0xD3, 0x8F, 0xFE, + 0x31, 0xDA, 0xFC, 0xF5, 0x43, 0xE4, 0xA1, 0xEC, 0x81, 0xEC, 0xD0, 0xE9, + 0x13, 0xEF, 0x49, 0xEE, 0x93, 0xEE, 0x71, 0xED, 0xE6, 0xE0, 0x56, 0xE9, + 0x06, 0xD1, 0xDB, 0xDF, 0xBF, 0xCE, 0x8C, 0xD1, 0x48, 0xD4, 0x31, 0xCA, + 0x2C, 0xDA, 0xDD, 0xCE, 0x46, 0xDC, 0x84, 0xD4, 0x68, 0xDB, 0xF2, 0xCF, + 0xF6, 0xDC, 0x7E, 0xC9, 0xE7, 0xE2, 0x76, 0xCA, 0x77, 0xE9, 0xC5, 0xD3, + 0xD0, 0xFA, 0x88, 0xDA, 0xFA, 0x0D, 0xF6, 0xDB, 0x9C, 0x03, 0x9D, 0xE3, + 0x83, 0xEA, 0x6E, 0xED, 0x29, 0xDC, 0xAF, 0xEE, 0xE2, 0xCE, 0xE9, 0xE5, + 0xFB, 0xBF, 0x4D, 0xDA, 0x3A, 0xC0, 0xAB, 0xCC, 0x03, 0xD2, 0xBD, 0xC5, + 0x09, 0xE1, 0xC7, 0xCE, 0x8A, 0xE4, 0x60, 0xE2, 0xEC, 0xE1, 0x09, 0xF5, + 0xCC, 0xE4, 0x98, 0x01, 0xC8, 0xF0, 0x1F, 0x0E, 0x15, 0xFF, 0x7D, 0x13, + 0x41, 0x0A, 0x1B, 0x11, 0x3D, 0x06, 0xE9, 0x0B, 0x8C, 0xEE, 0x4E, 0xFB, + 0x9B, 0xD4, 0x37, 0xE3, 0x36, 0xC5, 0xB3, 0xCA, 0x69, 0xB9, 0x4D, 0xB8, + 0x76, 0xB1, 0x15, 0xB4, 0xE3, 0xB2, 0x49, 0xBA, 0x69, 0xBB, 0x0A, 0xC7, + 0x4A, 0xD1, 0xD9, 0xCF, 0xCD, 0xF4, 0x67, 0xD9, 0x2D, 0x14, 0xA0, 0xF0, + 0x5E, 0x21, 0x39, 0x10, 0xB6, 0x26, 0x76, 0x2C, 0x5D, 0x30, 0x4C, 0x38, + 0xAA, 0x39, 0x5E, 0x32, 0x00, 0x34, 0x66, 0x1E, 0x14, 0x1E, 0xED, 0x04, + 0x32, 0x0B, 0x79, 0xF5, 0x46, 0xF8, 0x8A, 0xE7, 0x8B, 0xD8, 0xE8, 0xD4, + 0x5C, 0xBE, 0x90, 0xCC, 0x32, 0xC2, 0xC6, 0xC2, 0x8D, 0xCF, 0x36, 0xBA, + 0x6F, 0xD2, 0x91, 0xC1, 0x99, 0xD4, 0x6B, 0xCE, 0x1D, 0xE0, 0x85, 0xDC, + 0xD6, 0xED, 0x2F, 0xE9, 0x73, 0xF9, 0x6A, 0xF2, 0x29, 0x06, 0xEA, 0xF5, + 0x24, 0x07, 0x41, 0xFB, 0x11, 0xFE, 0xBD, 0x07, 0xE6, 0xF5, 0xA5, 0x0A, + 0x97, 0xF6, 0xB6, 0xFE, 0xC0, 0xFF, 0xF4, 0xF2, 0xF2, 0x03, 0x0C, 0xEC, + 0x1B, 0xF4, 0xCB, 0xEB, 0x66, 0xDE, 0xEB, 0xF3, 0x64, 0xE1, 0xF4, 0xEF, + 0x01, 0xF0, 0x32, 0xE2, 0x9E, 0xF8, 0x32, 0xDE, 0x96, 0xF9, 0xE6, 0xE5, + 0x80, 0xF0, 0xE9, 0xEE, 0x66, 0xE4, 0x83, 0xF0, 0x2D, 0xD8, 0xA4, 0xE9, + 0x1E, 0xD0, 0x3C, 0xE0, 0xF7, 0xD7, 0x22, 0xDA, 0x51, 0xEC, 0xD7, 0xCE, + 0xE3, 0xF7, 0x58, 0xC2, 0x19, 0xF1, 0x1B, 0xCA, 0x2E, 0xDE, 0x53, 0xE1, + 0xBF, 0xCA, 0x5A, 0xEA, 0x7F, 0xC9, 0xBC, 0xDD, 0x46, 0xDB, 0x9F, 0xD6, + 0x74, 0xEB, 0x17, 0xD8, 0xBC, 0xEF, 0x09, 0xD7, 0x2C, 0xEC, 0xA5, 0xE0, + 0x91, 0xE7, 0x49, 0xED, 0xE0, 0xE7, 0x66, 0xEC, 0x0D, 0xEA, 0x57, 0xEB, + 0xCE, 0xEA, 0xC7, 0xEE, 0x5B, 0xED, 0x97, 0xE6, 0x2D, 0xF1, 0xC5, 0xD9, + 0xB1, 0xEF, 0xB9, 0xD8, 0x3F, 0xE0, 0xA5, 0xE0, 0x01, 0xCE, 0xF2, 0xE2, + 0x9B, 0xC7, 0x8F, 0xDF, 0x5B, 0xD1, 0x8E, 0xDE, 0x2F, 0xEA, 0x71, 0xDD, + 0xBC, 0xFB, 0x12, 0xE6, 0x25, 0xFA, 0xBA, 0xF9, 0xD6, 0xFA, 0xDA, 0x07, + 0x83, 0x05, 0xB4, 0x11, 0x22, 0x0C, 0x8A, 0x14, 0x4A, 0x0B, 0x1F, 0x0C, + 0xA9, 0x04, 0xBE, 0xFF, 0x29, 0xF3, 0xEB, 0xEA, 0xDD, 0xE2, 0xDF, 0xCF, + 0x15, 0xD5, 0xA1, 0xBF, 0x06, 0xBB, 0xA1, 0xB4, 0x1C, 0xA7, 0x09, 0xAE, + 0xC3, 0xA7, 0x7A, 0xB3, 0x4B, 0xB4, 0x88, 0xBD, 0x6B, 0xD1, 0x97, 0xCB, + 0xA2, 0xFD, 0x34, 0xE1, 0x01, 0x1F, 0x30, 0xFD, 0x47, 0x28, 0xEE, 0x0E, + 0x4C, 0x25, 0x67, 0x13, 0xA1, 0x22, 0x08, 0x14, 0x62, 0x13, 0x8F, 0x0F, + 0x54, 0xFA, 0x25, 0x03, 0xFD, 0xE9, 0xC6, 0xEC, 0xBE, 0xE3, 0xD3, 0xD3, + 0x3B, 0xE3, 0x62, 0xBC, 0x5C, 0xD8, 0x0E, 0xAC, 0x5F, 0xC8, 0xD8, 0xAE, + 0xC5, 0xC5, 0xD6, 0xB9, 0x58, 0xC5, 0x93, 0xBE, 0xB9, 0xC1, 0x63, 0xC6, + 0xDD, 0xC9, 0x02, 0xD4, 0x1D, 0xDE, 0xD1, 0xE0, 0x08, 0xF6, 0xE1, 0xEE, + 0x6E, 0x09, 0x3D, 0x02, 0xC1, 0x14, 0xC8, 0x15, 0x3A, 0x1C, 0x16, 0x19, + 0xED, 0x16, 0x9F, 0x14, 0xBB, 0x08, 0xA6, 0x13, 0xCE, 0x09, 0x2F, 0x0B, + 0xF9, 0x11, 0x1E, 0xFC, 0x2F, 0x06, 0x58, 0xF0, 0x6B, 0xF7, 0x39, 0xEE, + 0x65, 0xF6, 0x20, 0xF5, 0x97, 0xF4, 0x1C, 0x00, 0x0C, 0xF2, 0x2D, 0x06, + 0x49, 0xFA, 0xC9, 0x00, 0x0D, 0x02, 0xD2, 0xFC, 0x10, 0x00, 0x84, 0xFE, + 0xA5, 0xFE, 0x64, 0xFA, 0x0E, 0xFB, 0xA5, 0xF3, 0x56, 0xF0, 0x54, 0xFA, + 0xAF, 0xE7, 0xE3, 0x03, 0xD8, 0xEB, 0xDB, 0xF8, 0x57, 0xF2, 0x30, 0xEA, + 0xC2, 0xF7, 0xFC, 0xEC, 0x71, 0xFC, 0x16, 0xF2, 0x5B, 0xF6, 0x8B, 0xF7, + 0xFF, 0xEC, 0x6D, 0x07, 0x21, 0xF2, 0xAA, 0x0B, 0x9E, 0x09, 0x59, 0xF9, + 0xB9, 0x1D, 0x95, 0xE9, 0x68, 0x1E, 0x69, 0xF2, 0x5B, 0x19, 0xAE, 0x06, + 0x5D, 0x1B, 0xFC, 0x11, 0xF9, 0x16, 0x7C, 0x17, 0x9E, 0x05, 0xAE, 0x1B, + 0xD0, 0xF3, 0xDE, 0x10, 0x04, 0xED, 0x60, 0xFE, 0x5E, 0xFA, 0xF4, 0xF1, + 0x4F, 0x06, 0x2D, 0xEB, 0x8E, 0x00, 0x77, 0xF5, 0x40, 0xF9, 0x61, 0x0B, + 0xB5, 0xFD, 0xC0, 0x17, 0xA2, 0x07, 0x58, 0x17, 0x29, 0x12, 0xBA, 0x1A, + 0x9A, 0x24, 0x0F, 0x2C, 0xCB, 0x39, 0x64, 0x3C, 0x43, 0x46, 0xC4, 0x3A, + 0x14, 0x49, 0xCA, 0x30, 0x00, 0x3F, 0x78, 0x28, 0xA2, 0x27, 0xC8, 0x1C, + 0x07, 0x0B, 0xBC, 0x0D, 0x04, 0xE6, 0xA7, 0xFF, 0x80, 0xD1, 0xE4, 0xF7, + 0x34, 0xE4, 0xBD, 0xF5, 0x12, 0x01, 0x0B, 0xFA, 0x86, 0x17, 0x57, 0x0B, + 0x19, 0x2E, 0x1D, 0x24, 0xEB, 0x48, 0xB7, 0x38, 0x81, 0x5B, 0x18, 0x4A, + 0xAB, 0x5E, 0xF6, 0x5B, 0xAC, 0x60, 0xE1, 0x61, 0xA4, 0x5F, 0x27, 0x59, + 0x4A, 0x59, 0x7B, 0x4A, 0x30, 0x48, 0x09, 0x38, 0xAF, 0x23, 0x02, 0x24, + 0xEB, 0x05, 0xAD, 0x12, 0xC1, 0xFE, 0x59, 0x02, 0xF9, 0x01, 0x39, 0xF1, + 0xA8, 0x0F, 0xA0, 0xE7, 0x36, 0x22, 0xE9, 0xE5, 0xEE, 0x21, 0x68, 0xEE, + 0xB4, 0x0E, 0x15, 0x04, 0xB6, 0x09, 0x85, 0x1C, 0xE8, 0x24, 0x5C, 0x2A, + 0x3C, 0x4B, 0x59, 0x2E, 0x2A, 0x58, 0xF4, 0x38, 0x53, 0x54, 0x47, 0x44, + 0x77, 0x53, 0x11, 0x43, 0xCC, 0x4F, 0x4E, 0x3A, 0x4D, 0x47, 0x0E, 0x36, + 0xCA, 0x3A, 0x08, 0x3A, 0xBF, 0x31, 0x8C, 0x40, 0xC7, 0x33, 0x47, 0x43, + 0xE1, 0x3C, 0x5B, 0x3D, 0xB6, 0x42, 0x98, 0x38, 0x3D, 0x43, 0x5B, 0x39, + 0xC3, 0x39, 0xA6, 0x3D, 0xE9, 0x2A, 0x4E, 0x44, 0x3B, 0x20, 0x98, 0x43, + 0xCD, 0x16, 0xA6, 0x39, 0xC1, 0x0F, 0x29, 0x32, 0xE2, 0x0B, 0x24, 0x34, + 0x2F, 0x09, 0x81, 0x32, 0x97, 0x0E, 0x59, 0x29, 0x54, 0x17, 0x03, 0x23, + 0x22, 0x12, 0x9F, 0x22, 0x23, 0x06, 0x58, 0x27, 0x2D, 0xFE, 0xC6, 0x25, + 0x71, 0x08, 0x54, 0x14, 0xC1, 0x24, 0x77, 0xFD, 0x04, 0x24, 0x38, 0xF9, + 0x34, 0x11, 0x79, 0x08, 0xC2, 0x15, 0x32, 0x15, 0x78, 0x21, 0x9F, 0x12, + 0xAB, 0x20, 0x56, 0x12, 0x7B, 0x19, 0xE2, 0x17, 0x8E, 0x16, 0x7F, 0x10, + 0x2C, 0x12, 0x8F, 0x04, 0xD1, 0x10, 0xC6, 0xFB, 0xCE, 0x12, 0x2C, 0xF8, + 0xB8, 0x02, 0x20, 0xFB, 0xAD, 0xF1, 0x51, 0xFF, 0x9D, 0xF8, 0xFA, 0x01, + 0xB6, 0xFE, 0x74, 0xFF, 0x9B, 0xFC, 0x0E, 0x01, 0x01, 0x04, 0x18, 0x11, + 0x9C, 0x0B, 0x8D, 0x26, 0x18, 0x05, 0x01, 0x2E, 0x1C, 0xFD, 0xAA, 0x23, + 0x71, 0xFB, 0x99, 0x14, 0xF3, 0xF0, 0x9C, 0x02, 0xB5, 0xE5, 0xE4, 0xEC, + 0x3A, 0xE6, 0x33, 0xE0, 0x18, 0xE7, 0xC5, 0xD5, 0xBE, 0xE1, 0xBE, 0xC5, + 0xE0, 0xD1, 0xB0, 0xCB, 0x88, 0xC9, 0x87, 0xE4, 0x6E, 0xE4, 0x59, 0xF0, + 0x9F, 0x06, 0x59, 0xF5, 0x98, 0x16, 0x45, 0x0B, 0x66, 0x2A, 0x99, 0x26, + 0xEA, 0x3F, 0x13, 0x30, 0xA7, 0x45, 0x73, 0x32, 0x81, 0x39, 0x79, 0x36, + 0x56, 0x28, 0x05, 0x3E, 0xA4, 0x1E, 0x00, 0x39, 0xF3, 0x14, 0xE6, 0x1B, + 0xE9, 0x07, 0x23, 0xFE, 0x83, 0xFD, 0xD7, 0xF0, 0xB3, 0xEC, 0xC1, 0xF1, + 0xC9, 0xDB, 0x93, 0xF4, 0x99, 0xD3, 0x5B, 0x00, 0x6F, 0xD7, 0xD0, 0x0B, + 0x2B, 0xED, 0xF4, 0x0B, 0xBD, 0x0D, 0x76, 0x10, 0xB3, 0x25, 0xC9, 0x1C, + 0x24, 0x23, 0x03, 0x2C, 0x58, 0x1D, 0xD9, 0x3A, 0xB6, 0x21, 0x3D, 0x47, + 0x8A, 0x25, 0x55, 0x47, 0xC2, 0x21, 0xD6, 0x38, 0x9A, 0x23, 0x90, 0x28, + 0xB7, 0x2C, 0x85, 0x20, 0xDF, 0x23, 0x42, 0x1D, 0x71, 0x1A, 0xB9, 0x14, + 0xEB, 0x18, 0xD0, 0x0B, 0x34, 0x1B, 0x27, 0x0A, 0xE8, 0x24, 0x55, 0x02, + 0x70, 0x22, 0x50, 0xFD, 0x9C, 0x13, 0x17, 0x07, 0x6A, 0x15, 0xBF, 0x0F, + 0xED, 0x1F, 0xA3, 0x15, 0xB0, 0x17, 0xCE, 0x18, 0x86, 0x08, 0x43, 0x0F, + 0xCF, 0x0A, 0xBF, 0x02, 0x35, 0x10, 0xCD, 0xFB, 0x20, 0xFD, 0xFA, 0xF6, + 0x13, 0xEB, 0x18, 0xF6, 0x5E, 0xEE, 0x7E, 0xFA, 0x2D, 0xF8, 0x9D, 0xFF, + 0xB9, 0xF8, 0x74, 0xFC, 0x37, 0xEE, 0x0E, 0x00, 0x16, 0xE7, 0xC3, 0x0D, + 0xA9, 0xEB, 0xD8, 0x0A, 0x1F, 0xF0, 0x62, 0xF9, 0xE5, 0xF6, 0xF2, 0xF9, + 0xA2, 0x07, 0xAB, 0x08, 0x08, 0x0B, 0x0C, 0x09, 0x63, 0xFC, 0x14, 0x03, + 0x32, 0xF3, 0xEB, 0xFA, 0xDB, 0xF3, 0x79, 0xF1, 0x07, 0xF2, 0xB9, 0xEB, + 0x34, 0xF5, 0x2A, 0xEA, 0xAB, 0x04, 0xAF, 0xE8, 0x8E, 0x0C, 0x8B, 0xE1, + 0xEF, 0x04, 0x5C, 0xE4, 0xF5, 0xF8, 0x56, 0xF0, 0xB6, 0xED, 0xCB, 0xFE, + 0xAF, 0xF1, 0x5C, 0x0B, 0x86, 0xFE, 0xE5, 0x0C, 0x97, 0x04, 0x4B, 0x0A, + 0xF6, 0x01, 0xF5, 0xFF, 0x01, 0xF5, 0x56, 0xED, 0xC1, 0xE4, 0xD8, 0xDB, + 0x4F, 0xC5, 0xA9, 0xCE, 0xC0, 0xA2, 0xF1, 0xC5, 0x8F, 0x99, 0xC2, 0xBE, + 0xA2, 0xA9, 0x33, 0xB9, 0xF3, 0xC3, 0x46, 0xB8, 0x9E, 0xD3, 0x73, 0xCB, + 0x88, 0xDA, 0x15, 0xED, 0x4D, 0xE6, 0x36, 0x07, 0x63, 0xF6, 0x51, 0x1B, + 0xF1, 0xF7, 0x5F, 0x23, 0x86, 0xF4, 0x41, 0x19, 0x32, 0xFC, 0xE7, 0x0D, + 0x60, 0xF9, 0x74, 0x00, 0x18, 0xE8, 0xDC, 0xE7, 0x3E, 0xD3, 0x86, 0xCE, + 0xEC, 0xBA, 0xE9, 0xB7, 0x71, 0xAB, 0xA9, 0xA3, 0x51, 0xAB, 0xDD, 0x9E, + 0x9E, 0xB7, 0x1E, 0xA4, 0x8F, 0xC6, 0x59, 0xA4, 0x4D, 0xD1, 0x1C, 0xB5, + 0xDD, 0xDC, 0x67, 0xD5, 0xBB, 0xE8, 0x1D, 0xE9, 0x93, 0xF4, 0xE4, 0xFA, + 0xD8, 0x0B, 0x4C, 0x0F, 0x81, 0x2D, 0x65, 0x18, 0x2C, 0x35, 0x02, 0x11, + 0xFC, 0x26, 0xEF, 0x09, 0x3A, 0x17, 0x9B, 0x15, 0x01, 0x05, 0x50, 0x1D, + 0x5C, 0xF7, 0x0F, 0x19, 0xE3, 0xEF, 0x1D, 0x12, 0xEB, 0xEC, 0x4D, 0xFD, + 0xD1, 0xEF, 0xD6, 0xF2, 0x04, 0xF9, 0x99, 0xFE, 0xD5, 0xFE, 0xAB, 0x08, + 0x45, 0x04, 0xF3, 0x11, 0x76, 0x11, 0x00, 0x1C, 0xA9, 0x0E, 0x92, 0x16, + 0xAE, 0xFE, 0x72, 0x0B, 0x53, 0x02, 0x93, 0x06, 0xA1, 0x0D, 0x7D, 0x00, + 0x75, 0x06, 0x68, 0x01, 0x46, 0xFE, 0xC5, 0x00, 0x7E, 0xFC, 0x9E, 0xF5, + 0x00, 0xF6, 0xC7, 0xE4, 0xA7, 0xEE, 0xD2, 0xD8, 0x81, 0xE3, 0x19, 0xE2, + 0xB3, 0xDC, 0x20, 0xF9, 0x46, 0xE7, 0x3D, 0x09, 0xD9, 0xF5, 0xF2, 0x05, + 0xA5, 0x05, 0xC9, 0xFF, 0x65, 0x0E, 0x23, 0x01, 0x7C, 0x01, 0x4D, 0x06, + 0xA0, 0xF5, 0x60, 0x0B, 0x83, 0xF6, 0x74, 0x00, 0xE1, 0xF6, 0xE1, 0xF1, + 0xA3, 0xF3, 0xAE, 0xE7, 0x71, 0xF0, 0x9C, 0xDA, 0xC5, 0xE9, 0xF1, 0xD9, + 0xE4, 0xDC, 0x9C, 0xDD, 0x4D, 0xD6, 0x44, 0xD2, 0x39, 0xE1, 0x65, 0xC7, + 0xCC, 0xE9, 0x53, 0xCC, 0xCB, 0xEF, 0x85, 0xD8, 0xF4, 0x02, 0x9B, 0xDD, + 0x24, 0x0B, 0x4D, 0xE1, 0x16, 0xFB, 0x72, 0xEB, 0x34, 0xE5, 0x15, 0xE7, + 0x3B, 0xD0, 0xD8, 0xCB, 0x8B, 0xC2, 0xFE, 0xAD, 0xF5, 0xBA, 0xAA, 0x9D, + 0x31, 0xAB, 0x88, 0x98, 0xCA, 0x9E, 0x92, 0x9D, 0x30, 0xA2, 0x94, 0xA9, + 0x74, 0xA7, 0xC7, 0xB0, 0x78, 0xAA, 0x7B, 0xC1, 0x41, 0xC2, 0x01, 0xE0, + 0x9E, 0xED, 0xE0, 0xF4, 0x42, 0x07, 0x9E, 0xFD, 0x2F, 0x04, 0xEC, 0x05, + 0x51, 0xF0, 0x2A, 0x0E, 0x4D, 0xDC, 0x36, 0x08, 0x75, 0xD3, 0x7B, 0xF7, + 0x9D, 0xC3, 0xD7, 0xDF, 0x6E, 0xAD, 0xD9, 0xBF, 0x56, 0xA6, 0xC1, 0xAC, + 0x71, 0xA0, 0x4A, 0xA4, 0xF9, 0xA0, 0xD2, 0x9B, 0x33, 0xAE, 0x47, 0x9E, + 0xFA, 0xAF, 0xE1, 0xAA, 0x26, 0xB6, 0xDD, 0xB0, 0xD3, 0xC4, 0x40, 0xB3, + 0x08, 0xD6, 0x09, 0xBF, 0xA6, 0xEC, 0x92, 0xD3, 0x56, 0xFE, 0x4A, 0xF0, + 0x47, 0x0C, 0xD9, 0x03, 0x9A, 0x16, 0x90, 0x05, 0xB2, 0x1F, 0xF2, 0x05, + 0x67, 0x1C, 0x9A, 0x00, 0x89, 0x02, 0x2D, 0xF5, 0x1B, 0xEE, 0x20, 0xEF, + 0xAA, 0xF3, 0xDF, 0xF2, 0x64, 0xFE, 0xD7, 0xFD, 0xE7, 0x06, 0x35, 0x07, + 0xEE, 0x14, 0x14, 0x10, 0x2D, 0x17, 0x1B, 0x15, 0xDE, 0x20, 0xD9, 0x0E, + 0xEA, 0x30, 0x88, 0x0A, 0x04, 0x20, 0x97, 0x10, 0x13, 0x0D, 0xB5, 0x15, + 0x6B, 0x0E, 0xEE, 0x13, 0xBA, 0x0A, 0x7A, 0x0D, 0x0E, 0x08, 0xAD, 0x01, + 0x1B, 0x02, 0x54, 0xF2, 0x90, 0xF1, 0xDF, 0xED, 0x22, 0xEC, 0x43, 0xEB, + 0xD6, 0xF0, 0x0D, 0xE4, 0x56, 0xF1, 0xAF, 0xE1, 0xFD, 0xF4, 0xFD, 0xE9, + 0x51, 0x01, 0x18, 0xF4, 0xCF, 0x13, 0xB1, 0xF7, 0xBF, 0x22, 0x65, 0x0A, + 0x7B, 0x28, 0xA5, 0x1E, 0x9A, 0x29, 0x0E, 0x1D, 0xF0, 0x1B, 0xD6, 0x13, + 0xFE, 0x11, 0x80, 0x0A, 0xDF, 0x11, 0xA8, 0x02, 0x05, 0x09, 0x6C, 0x0D, + 0xCA, 0xFA, 0x0B, 0x19, 0x35, 0xE9, 0xC2, 0x0E, 0x49, 0xEC, 0xFE, 0x09, + 0x0E, 0x0C, 0xB0, 0x05, 0x8C, 0x23, 0x30, 0x08, 0x38, 0x30, 0xE7, 0x28, + 0x39, 0x3B, 0x17, 0x48, 0xB5, 0x36, 0xB9, 0x52, 0xCD, 0x28, 0xFA, 0x4D, + 0x91, 0x15, 0x5D, 0x37, 0x24, 0x02, 0x30, 0x19, 0x3F, 0xF7, 0x81, 0x02, + 0x76, 0xEB, 0xFA, 0xF2, 0xD2, 0xDE, 0xC0, 0xDF, 0xBF, 0xDF, 0x37, 0xCE, + 0x2E, 0xE6, 0xAC, 0xC3, 0x05, 0xE7, 0xB6, 0xC1, 0x00, 0xF0, 0x96, 0xC7, + 0x86, 0x08, 0xBB, 0xD9, 0xF9, 0x24, 0x22, 0x04, 0xCA, 0x3C, 0xEE, 0x2C, + 0xE4, 0x4C, 0x45, 0x39, 0x5A, 0x52, 0x56, 0x38, 0x1F, 0x47, 0x1C, 0x34, + 0x94, 0x2D, 0x79, 0x1E, 0x2B, 0x18, 0xBA, 0x04, 0xF8, 0x09, 0x10, 0xF6, + 0x6E, 0xFA, 0xE8, 0xED, 0x0F, 0xE4, 0x83, 0xE2, 0xAE, 0xCF, 0xB5, 0xD1, + 0x42, 0xCB, 0xA7, 0xC5, 0x8D, 0xD1, 0xFD, 0xC6, 0xE9, 0xD7, 0x0F, 0xDB, + 0x8D, 0xE4, 0xAA, 0xF0, 0x1A, 0xFF, 0xC4, 0x05, 0x8D, 0x0C, 0xF7, 0x20, + 0x3D, 0x13, 0xCE, 0x33, 0x55, 0x28, 0xBB, 0x3B, 0x88, 0x2E, 0xD8, 0x3A, + 0x1F, 0x2B, 0x09, 0x3E, 0x99, 0x2B, 0x7F, 0x42, 0x7B, 0x22, 0x56, 0x3E, + 0x0C, 0x1D, 0x2C, 0x33, 0x41, 0x2C, 0x59, 0x27, 0xBC, 0x37, 0x50, 0x1F, + 0x9B, 0x31, 0x21, 0x1D, 0xDB, 0x32, 0x02, 0x30, 0xC1, 0x34, 0x3C, 0x40, + 0xA7, 0x2F, 0x14, 0x33, 0x00, 0x34, 0xEF, 0x22, 0x0A, 0x38, 0xE2, 0x1F, + 0x74, 0x36, 0x8E, 0x1C, 0x50, 0x2A, 0x2F, 0x13, 0x89, 0x17, 0x05, 0x0B, + 0xC8, 0x0F, 0xEF, 0x07, 0x33, 0x0A, 0x1D, 0x08, 0xFA, 0x02, 0x12, 0x03, + 0x6E, 0x05, 0x45, 0xFB, 0x40, 0x0D, 0xF4, 0xF9, 0xB5, 0x0B, 0x6E, 0xFF, + 0xD2, 0x02, 0xEA, 0x12, 0x8D, 0x09, 0xB3, 0x20, 0x42, 0x13, 0xD0, 0x14, + 0xFD, 0x08, 0x02, 0x09, 0x6A, 0x00, 0x8D, 0x0B, 0x0F, 0xFC, 0x27, 0x0F, + 0x48, 0xF2, 0xE4, 0x0F, 0xA0, 0xF8, 0x9D, 0x08, 0x18, 0x0C, 0x2D, 0xFF, + 0x88, 0x10, 0x02, 0xFB, 0xCC, 0x00, 0x7E, 0xF1, 0x9E, 0xEA, 0x7B, 0xE8, + 0xB4, 0xE8, 0x89, 0xE6, 0x90, 0xF5, 0x8B, 0xE6, 0x06, 0xF6, 0x9D, 0xF2, + 0x45, 0xF5, 0xAF, 0x0B, 0xE3, 0xFF, 0x65, 0x19, 0xCF, 0x01, 0x0A, 0x0C, + 0x18, 0xFF, 0x51, 0x02, 0x85, 0x0A, 0x90, 0x07, 0xC7, 0x15, 0x98, 0x09, + 0x4F, 0x0E, 0x2A, 0x0A, 0x22, 0xF4, 0xA1, 0xFC, 0xEE, 0xDF, 0xB5, 0xE3, + 0xD2, 0xE1, 0x79, 0xDB, 0xE8, 0xDB, 0xBB, 0xDE, 0xAA, 0xD2, 0x35, 0xDC, + 0x6D, 0xE1, 0x04, 0xDD, 0x40, 0xFB, 0x04, 0xF3, 0x90, 0x0B, 0x18, 0x14, + 0xEE, 0x18, 0x44, 0x34, 0xB9, 0x27, 0x6F, 0x4C, 0xD0, 0x2E, 0x10, 0x49, + 0xA1, 0x33, 0x86, 0x3D, 0x8C, 0x2C, 0x70, 0x36, 0xDE, 0x10, 0xAB, 0x1F, + 0xC3, 0xEF, 0x18, 0x07, 0x54, 0xDD, 0x77, 0xF7, 0x9A, 0xDC, 0x6D, 0xEA, + 0x63, 0xDD, 0x46, 0xE6, 0x10, 0xDB, 0xD7, 0xDE, 0x0C, 0xD0, 0x7E, 0xD4, + 0xCD, 0xC3, 0x9D, 0xD9, 0xB4, 0xCE, 0x76, 0xE5, 0xF4, 0xEE, 0x97, 0xEA, + 0x66, 0x16, 0xC2, 0xF5, 0x79, 0x25, 0xFC, 0x01, 0xCC, 0x1B, 0xFD, 0x12, + 0x57, 0x1A, 0x42, 0x2C, 0x08, 0x23, 0x49, 0x34, 0x4E, 0x29, 0xC5, 0x38, + 0xE3, 0x28, 0xD4, 0x41, 0xD4, 0x2A, 0x3D, 0x3E, 0xF6, 0x2E, 0x5C, 0x31, + 0x4D, 0x2A, 0x1F, 0x26, 0x9D, 0x1E, 0xAD, 0x1E, 0x2F, 0x16, 0x17, 0x1C, + 0xE7, 0x15, 0x7E, 0x21, 0x54, 0x26, 0x4C, 0x2E, 0x22, 0x38, 0x81, 0x30, + 0xC5, 0x33, 0x5D, 0x28, 0xEE, 0x24, 0xC0, 0x2E, 0x33, 0x1E, 0x01, 0x3B, + 0x4A, 0x20, 0x0B, 0x38, 0x0A, 0x21, 0x00, 0x2B, 0x3C, 0x22, 0x68, 0x11, + 0xAF, 0x15, 0xAD, 0xFB, 0x22, 0xF9, 0xEE, 0xFD, 0x10, 0xF4, 0x92, 0x04, + 0x89, 0x00, 0x49, 0x07, 0xA7, 0xFF, 0xF4, 0x04, 0x81, 0xFF, 0xC9, 0x01, + 0x6D, 0x09, 0x14, 0x0B, 0xBA, 0x10, 0xC0, 0x0F, 0x36, 0x1B, 0xFD, 0x11, + 0x4A, 0x25, 0x81, 0x27, 0x2E, 0x24, 0x7C, 0x3D, 0x26, 0x22, 0xD9, 0x3D, + 0xDD, 0x22, 0xF3, 0x29, 0x44, 0x2A, 0xFB, 0x1C, 0xA0, 0x24, 0xB8, 0x1B, + 0x2A, 0x11, 0xB9, 0x0F, 0xDA, 0x0E, 0x7D, 0x08, 0xB7, 0x19, 0x9B, 0x0E, + 0xC1, 0x1A, 0xD4, 0x08, 0x01, 0x1A, 0x54, 0x0E, 0x78, 0x21, 0x0A, 0x27, + 0x0C, 0x1D, 0x9F, 0x27, 0x00, 0x0B, 0xF1, 0x1A, 0xAD, 0x00, 0x01, 0x20, + 0xE8, 0x01, 0x08, 0x29, 0x9C, 0xF2, 0x00, 0x1F, 0x1E, 0xD7, 0x9C, 0x07, + 0x2C, 0xD1, 0xD0, 0xF3, 0x9F, 0xD4, 0x37, 0xDC, 0x6A, 0xCE, 0xFB, 0xC2, + 0x60, 0xCD, 0x16, 0xC6, 0xC0, 0xDB, 0xD7, 0xE0, 0xEF, 0xF6, 0x10, 0xF6, + 0x98, 0x10, 0xE2, 0x03, 0x91, 0x1E, 0x03, 0x18, 0x20, 0x22, 0xAC, 0x2C, + 0xDF, 0x1C, 0x31, 0x33, 0xE4, 0x21, 0xC0, 0x33, 0xD1, 0x33, 0x3C, 0x31, + 0x40, 0x2E, 0xEF, 0x24, 0x89, 0x12, 0xD0, 0x0D, 0xCC, 0xFB, 0x06, 0xEF, + 0xC0, 0xE1, 0xAB, 0xC9, 0xD6, 0xC4, 0xE2, 0xB0, 0xBC, 0xBA, 0xD6, 0xB2, + 0xB2, 0xC9, 0x62, 0xB7, 0x2C, 0xD7, 0xDF, 0xB8, 0x16, 0xD4, 0xAE, 0xC4, + 0x83, 0xDB, 0xFA, 0xDE, 0xA1, 0xEF, 0x4E, 0xFB, 0x16, 0x02, 0x76, 0x0B, + 0x65, 0x19, 0x5B, 0x1C, 0xB9, 0x2E, 0x65, 0x29, 0x6A, 0x3C, 0xF6, 0x2B, + 0xB9, 0x3F, 0x31, 0x36, 0x89, 0x23, 0x5F, 0x3A, 0x1A, 0x08, 0x23, 0x2E, + 0x64, 0x13, 0xE5, 0x1F, 0x9D, 0x20, 0x4D, 0x11, 0x71, 0x0E, 0x5A, 0x08, + 0x2C, 0xF6, 0x2F, 0x10, 0x50, 0xFB, 0x17, 0x1C, 0xBE, 0x06, 0xD5, 0x1C, + 0x72, 0x0A, 0xDA, 0x16, 0xCF, 0x12, 0x64, 0x19, 0xFB, 0x1A, 0xB1, 0x2C, + 0x9A, 0x1F, 0x40, 0x36, 0x66, 0x1D, 0x8C, 0x30, 0xC2, 0x13, 0xAA, 0x24, + 0xE8, 0x09, 0x57, 0x0B, 0xF5, 0x00, 0x1C, 0xFC, 0x92, 0xF4, 0x8C, 0xF8, + 0xC5, 0xEE, 0x6D, 0xF1, 0x86, 0xF9, 0xD3, 0xF1, 0x68, 0x09, 0x73, 0xF7, + 0xC5, 0x0D, 0x9A, 0xF9, 0xE8, 0xFD, 0xBD, 0xF7, 0x84, 0xEA, 0xD1, 0xEE, + 0xAE, 0xE5, 0x34, 0xEC, 0xD8, 0xEB, 0xC1, 0xF6, 0x2E, 0xF4, 0x54, 0xFA, + 0x73, 0xFC, 0x37, 0xED, 0x4C, 0x05, 0x29, 0xDB, 0x97, 0xFD, 0xE3, 0xD8, + 0x16, 0xDC, 0xA1, 0xE2, 0xFE, 0xCB, 0xA4, 0xE3, 0xB9, 0xE5, 0xCA, 0xDB, + 0xFF, 0x00, 0xF7, 0xD0, 0xED, 0x02, 0x6E, 0xC3, 0x4F, 0xF6, 0xAE, 0xC6, + 0x06, 0xE9, 0x0C, 0xD7, 0x3E, 0xE2, 0x4E, 0xDE, 0x6C, 0xDF, 0xD5, 0xEB, + 0x87, 0xE0, 0xD3, 0xF9, 0xC3, 0xE7, 0xC1, 0xF7, 0x11, 0xDF, 0xAA, 0xE8, + 0x2A, 0xC2, 0x84, 0xC7, 0x76, 0xA8, 0xF0, 0xA3, 0x98, 0x9D, 0x18, 0x97, + 0x6D, 0xA0, 0x63, 0x9A, 0xE1, 0xA9, 0xAB, 0xA8, 0x62, 0xB7, 0xC9, 0xBF, + 0x3B, 0xCB, 0x7E, 0xD2, 0x8E, 0xD5, 0x0A, 0xE6, 0x82, 0xD5, 0x20, 0xF6, + 0x28, 0xDF, 0xE4, 0xFE, 0x81, 0xF4, 0x60, 0x02, 0xEF, 0x00, 0x8C, 0xF3, + 0xCE, 0xF8, 0x4D, 0xEC, 0x07, 0xE4, 0xA8, 0xEA, 0xBF, 0xCC, 0x26, 0xD2, + 0xA8, 0xBA, 0x10, 0xBC, 0x77, 0xAD, 0xB2, 0xAA, 0xDB, 0xA0, 0xFC, 0x9D, + 0xCA, 0x9E, 0x6A, 0x9F, 0xCC, 0xB1, 0x00, 0xA1, 0x96, 0xC2, 0x2B, 0x9F, + 0x94, 0xC2, 0x91, 0xA9, 0xF6, 0xC5, 0x7F, 0xC0, 0x4E, 0xD9, 0x77, 0xD7, + 0x8A, 0xF2, 0x5A, 0xED, 0xEA, 0x03, 0xFC, 0xFD, 0x99, 0x11, 0x64, 0x09, + 0x8F, 0x1C, 0xB9, 0x06, 0xA7, 0x13, 0xC6, 0xF6, 0x58, 0x03, 0x14, 0xEC, + 0x4A, 0x02, 0x50, 0xEB, 0xCA, 0x07, 0x80, 0xED, 0xCF, 0x08, 0x9B, 0xF2, + 0xA5, 0xFA, 0x63, 0xF9, 0x24, 0xEB, 0xAA, 0xF8, 0x0D, 0xE9, 0x63, 0xF6, + 0x82, 0xEB, 0x5D, 0xFA, 0xDF, 0xEF, 0x97, 0xF5, 0xEC, 0xF3, 0x31, 0xEA, + 0x08, 0xFA, 0x31, 0xED, 0xCC, 0xF8, 0x0D, 0xF7, 0xCC, 0xF0, 0x73, 0xFC, + 0xD3, 0xEE, 0xA2, 0xF8, 0x39, 0xF3, 0xE2, 0xE8, 0x9F, 0xF9, 0xBC, 0xDE, + 0xB8, 0xFD, 0x17, 0xE8, 0xB9, 0xF7, 0xE3, 0xF3, 0x03, 0xF0, 0xC2, 0xF0, + 0xA2, 0xEF, 0xBC, 0xE8, 0xBA, 0xF3, 0xA9, 0xEC, 0x1E, 0xFA, 0x79, 0xFC, + 0xF9, 0x00, 0x4B, 0x0A, 0x4E, 0x0E, 0xDE, 0x15, 0x29, 0x19, 0xD1, 0x18, + 0x04, 0x11, 0xC4, 0x17, 0x8A, 0xFB, 0xB3, 0x17, 0x79, 0xFA, 0xE9, 0x0F, + 0xDC, 0x06, 0x91, 0x09, 0x88, 0x00, 0xAD, 0x06, 0xB6, 0x02, 0x38, 0x08, + 0xDB, 0x0C, 0x3A, 0x10, 0xDA, 0x02, 0xF8, 0x13, 0xC6, 0xFE, 0xBA, 0x13, + 0x37, 0x0D, 0x40, 0x1E, 0x82, 0x1A, 0xFC, 0x29, 0xFF, 0x22, 0xB3, 0x2A, + 0xA0, 0x2A, 0xA2, 0x21, 0xB0, 0x2B, 0xDF, 0x0D, 0xB5, 0x16, 0x21, 0xF9, + 0x89, 0xF7, 0xAD, 0xE9, 0x59, 0xE6, 0xAC, 0xD6, 0x3C, 0xD7, 0x2B, 0xC6, + 0x41, 0xCC, 0x24, 0xBC, 0xE5, 0xD3, 0xC9, 0xB2, 0x6B, 0xE6, 0x4B, 0xBA, + 0x5C, 0x04, 0xC1, 0xD0, 0xAB, 0x21, 0xD6, 0xED, 0xDC, 0x35, 0x48, 0x12, + 0x70, 0x40, 0x12, 0x2C, 0xC9, 0x39, 0xD5, 0x3D, 0x1A, 0x3C, 0x41, 0x42, + 0xF4, 0x3E, 0x50, 0x30, 0x8A, 0x27, 0x08, 0x1D, 0x4C, 0x07, 0x58, 0x14, + 0xC3, 0xEA, 0x9B, 0x0A, 0x0A, 0xDB, 0x24, 0xF6, 0x20, 0xE3, 0x36, 0xE0, + 0xA9, 0xE7, 0xF6, 0xD8, 0xD9, 0xD5, 0xEA, 0xDB, 0x8B, 0xD4, 0x6A, 0xE3, + 0xA4, 0xE4, 0xBD, 0xF0, 0xCB, 0xEC, 0xE6, 0x01, 0xF4, 0xF4, 0xC3, 0x15, + 0xFB, 0xFF, 0x49, 0x24, 0xC5, 0x0A, 0xAF, 0x2C, 0xC4, 0x14, 0x34, 0x29, + 0xE3, 0x21, 0x71, 0x21, 0xA7, 0x2B, 0xB0, 0x2B, 0xC1, 0x28, 0x8C, 0x32, + 0xDF, 0x2C, 0x67, 0x23, 0xFE, 0x35, 0x6C, 0x0E, 0x97, 0x2C, 0x33, 0xFB, + 0x08, 0x18, 0x7B, 0xF4, 0x1F, 0x0A, 0x34, 0xFC, 0x75, 0x09, 0x95, 0x09, + 0xDE, 0x19, 0x50, 0x14, 0x34, 0x30, 0xD3, 0x15, 0x1C, 0x31, 0xC8, 0x19, + 0xF3, 0x1B, 0xC4, 0x1B, 0xC6, 0x0A, 0xE2, 0x17, 0x74, 0x0A, 0x0A, 0x17, + 0xB6, 0x0F, 0x7C, 0x0E, 0xB0, 0x0B, 0xC4, 0x07, 0x5E, 0xF4, 0xED, 0x01, + 0x8C, 0xE0, 0xF3, 0xFA, 0x16, 0xE4, 0x57, 0x03, 0xFB, 0xE5, 0x24, 0x0F, + 0x6B, 0xE3, 0xD3, 0x0F, 0x12, 0xEE, 0xF7, 0x09, 0xFC, 0x00, 0x49, 0xFF, + 0x27, 0x06, 0xEF, 0xEE, 0x7A, 0x02, 0x72, 0xED, 0x62, 0xFB, 0x01, 0x02, + 0xAC, 0xEB, 0x6A, 0x09, 0xA3, 0xE4, 0x6E, 0xFE, 0x14, 0xF4, 0x6F, 0xFB, + 0x91, 0x0C, 0xC1, 0xF6, 0x23, 0x08, 0x80, 0xE4, 0xA3, 0xF5, 0x4D, 0xD8, + 0x79, 0xFE, 0xE3, 0xE4, 0x3C, 0x11, 0x2C, 0xF6, 0xC9, 0x14, 0x4C, 0xF7, + 0xAA, 0x0E, 0x77, 0xFD, 0xA2, 0x0B, 0x1C, 0x10, 0x25, 0x14, 0xB7, 0x17, + 0xCF, 0x23, 0x4F, 0x1A, 0xFC, 0x29, 0xDD, 0x17, 0x4D, 0x1A, 0x94, 0x03, + 0x0D, 0xF7, 0x97, 0xF1, 0xAD, 0xD6, 0xBB, 0xE5, 0xF0, 0xC6, 0x57, 0xDE, + 0x1E, 0xC8, 0xBC, 0xDB, 0xAA, 0xD3, 0xE5, 0xD8, 0x42, 0xD8, 0x95, 0xE4, + 0x5A, 0xDE, 0x5C, 0xF1, 0xDE, 0xEB, 0x9F, 0xF7, 0xAF, 0xF4, 0xC7, 0x09, + 0x61, 0x05, 0x0A, 0x1E, 0x28, 0x1B, 0x6B, 0x25, 0xEE, 0x22, 0xDD, 0x27, + 0xA1, 0x27, 0x71, 0x2F, 0x6E, 0x28, 0xC1, 0x2B, 0xD0, 0x16, 0x8E, 0x15, + 0x21, 0xF3, 0xD2, 0xFC, 0xA3, 0xDE, 0x16, 0xE5, 0x4C, 0xE3, 0x0F, 0xC8, + 0x6C, 0xE2, 0x1E, 0xB0, 0x85, 0xDA, 0x07, 0xB3, 0x4C, 0xD2, 0xCE, 0xBF, + 0xDE, 0xD0, 0xC9, 0xC5, 0x9D, 0xDF, 0x48, 0xD5, 0xB2, 0xF4, 0xC7, 0xEF, + 0xAB, 0x05, 0x04, 0x0A, 0x27, 0x12, 0x18, 0x22, 0xD0, 0x1C, 0xCC, 0x35, + 0xC9, 0x2D, 0xE9, 0x33, 0x19, 0x39, 0x55, 0x27, 0x2A, 0x2E, 0x3D, 0x25, + 0xB9, 0x15, 0xAD, 0x2F, 0x27, 0x08, 0x41, 0x34, 0x5E, 0x11, 0x77, 0x27, + 0x89, 0x1A, 0x42, 0x19, 0x8E, 0x1A, 0x36, 0x0F, 0xDA, 0x18, 0x54, 0x08, + 0x44, 0x16, 0x49, 0x04, 0xD2, 0x1C, 0x03, 0x04, 0x2D, 0x2A, 0x46, 0x0D, + 0x3F, 0x2B, 0x7F, 0x17, 0x4B, 0x1F, 0x82, 0x14, 0x2A, 0x19, 0x1F, 0x0E, + 0xBC, 0x16, 0xC8, 0x0A, 0x63, 0x17, 0x12, 0x09, 0xB2, 0x1F, 0x0E, 0x0A, + 0x10, 0x1C, 0x97, 0x05, 0x3A, 0x15, 0xF5, 0xFF, 0x76, 0x16, 0x67, 0x07, + 0xF7, 0x0C, 0x21, 0x1A, 0x6F, 0x03, 0x94, 0x21, 0x1A, 0x0D, 0x9F, 0x20, + 0x01, 0x1A, 0x04, 0x23, 0xFE, 0x1E, 0x4F, 0x28, 0x0E, 0x1C, 0x3B, 0x38, + 0xC0, 0x18, 0xEF, 0x41, 0xF1, 0x22, 0x31, 0x3F, 0x4E, 0x31, 0x8E, 0x38, + 0xE5, 0x36, 0x14, 0x2F, 0xFE, 0x2D, 0x2C, 0x31, 0x4E, 0x17, 0x9A, 0x32, + 0xF7, 0x07, 0x05, 0x27, 0x23, 0x06, 0x4A, 0x23, 0x5F, 0x0A, 0xDD, 0x20, + 0x93, 0x0F, 0x50, 0x1E, 0xC5, 0x0F, 0x4D, 0x27, 0xCA, 0x16, 0x96, 0x2D, + 0x89, 0x1A, 0x4B, 0x2C, 0xB2, 0x0B, 0xE1, 0x29, 0x9F, 0xFF, 0xBA, 0x1E, + 0xCB, 0xF6, 0x5D, 0x0B, 0x77, 0xEF, 0x9B, 0xF1, 0x0C, 0xEE, 0x88, 0xDA, + 0xF6, 0xE3, 0x97, 0xD6, 0x86, 0xE0, 0x0D, 0xDC, 0xC2, 0xE7, 0xA2, 0xDC, + 0x14, 0xEF, 0x6D, 0xD9, 0x34, 0x03, 0x93, 0xE4, 0x18, 0x1B, 0xD0, 0x07, + 0xCD, 0x25, 0x39, 0x30, 0xD1, 0x2A, 0x9B, 0x4B, 0x97, 0x38, 0xDD, 0x51, + 0x34, 0x41, 0xBD, 0x45, 0xE8, 0x33, 0x0D, 0x31, 0x48, 0x17, 0x7B, 0x1E, + 0x9D, 0xFA, 0x14, 0x10, 0x3B, 0xE1, 0x51, 0x03, 0x1D, 0xCF, 0xD5, 0xF4, + 0x72, 0xD1, 0x6D, 0xDE, 0x4C, 0xD6, 0x9C, 0xCD, 0xA5, 0xD8, 0x05, 0xCF, + 0xD1, 0xEE, 0x14, 0xDD, 0x50, 0x0B, 0x46, 0xF2, 0x44, 0x20, 0x91, 0x0D, + 0x9B, 0x33, 0x73, 0x27, 0x7A, 0x3D, 0xF1, 0x2D, 0x03, 0x42, 0xED, 0x2C, + 0x76, 0x46, 0x0C, 0x3F, 0x0D, 0x4A, 0xE2, 0x4F, 0xF6, 0x4F, 0x0E, 0x4E, + 0xFA, 0x4C, 0xC3, 0x4F, 0xA3, 0x3A, 0x8D, 0x57, 0x95, 0x29, 0x6B, 0x52, + 0x40, 0x25, 0x44, 0x48, 0xC0, 0x2C, 0xC3, 0x49, 0xE7, 0x33, 0xFC, 0x4B, + 0xBD, 0x36, 0xDA, 0x4B, 0x33, 0x38, 0xEE, 0x52, 0x07, 0x36, 0x98, 0x57, + 0xEB, 0x32, 0xE8, 0x4E, 0xC1, 0x29, 0x87, 0x42, 0x70, 0x23, 0xFF, 0x38, + 0xE8, 0x30, 0x60, 0x2D, 0x2A, 0x3C, 0x85, 0x22, 0xD3, 0x29, 0x6D, 0x14, + 0x29, 0x09, 0xEA, 0x04, 0x8E, 0xF5, 0x03, 0x00, 0x03, 0xF2, 0x29, 0xFB, + 0x20, 0xF1, 0x7F, 0xF3, 0x42, 0xF9, 0xC4, 0xF6, 0xA2, 0x0A, 0xE6, 0xF8, + 0x68, 0x0E, 0x60, 0xF2, 0x9C, 0x07, 0x17, 0xEF, 0x3E, 0x08, 0xDE, 0xF3, + 0x04, 0x0C, 0xA8, 0xF4, 0x88, 0x0A, 0xDF, 0xF1, 0xD6, 0x09, 0x5D, 0xF9, + 0x23, 0x0E, 0xBF, 0xF5, 0xDB, 0x0A, 0xCC, 0xE1, 0x04, 0xF6, 0xBF, 0xDB, + 0x53, 0xD7, 0xD9, 0xE5, 0x08, 0xC2, 0x4D, 0xF1, 0xA9, 0xC6, 0x44, 0xFF, + 0x4E, 0xE3, 0x63, 0x0B, 0x0B, 0xFA, 0x73, 0x11, 0xE8, 0xF8, 0xE0, 0x15, + 0x02, 0xF4, 0x72, 0x12, 0x7A, 0xEC, 0x40, 0x04, 0x84, 0xD7, 0xB5, 0xF5, + 0x60, 0xBE, 0xF8, 0xEA, 0xC9, 0xA2, 0x33, 0xDB, 0xC1, 0x94, 0xB8, 0xC0, + 0xFE, 0x9A, 0xAB, 0xA9, 0xC9, 0x9F, 0x79, 0xA1, 0x24, 0xA9, 0x5E, 0xA9, + 0xB9, 0xBF, 0xBA, 0xBD, 0x64, 0xD5, 0x6C, 0xD3, 0xA6, 0xEC, 0x3A, 0xE8, + 0x5C, 0x07, 0x83, 0xFE, 0x57, 0x15, 0x1C, 0x0B, 0x66, 0x0C, 0xCF, 0x02, + 0xB5, 0xFE, 0x19, 0xF5, 0xD2, 0xFD, 0xED, 0xE2, 0x84, 0xF7, 0xF4, 0xCE, + 0x95, 0xDE, 0xC1, 0xC3, 0x7F, 0xC0, 0x63, 0xB5, 0xC5, 0xA5, 0xAE, 0xA7, + 0x3D, 0x9D, 0x29, 0xA1, 0x2E, 0xAC, 0xF8, 0x9F, 0xCB, 0xB3, 0x27, 0xAB, + 0xE9, 0xB5, 0x15, 0xBF, 0x1A, 0xC3, 0x32, 0xCF, 0x1B, 0xD6, 0x8E, 0xD7, + 0xDE, 0xEB, 0x56, 0xDE, 0x02, 0x00, 0xF6, 0xF1, 0xAA, 0x14, 0xF8, 0x04, + 0x00, 0x2B, 0x45, 0x04, 0x70, 0x2B, 0x24, 0x05, 0x5F, 0x13, 0x31, 0x0C, + 0x69, 0xFB, 0xCC, 0x09, 0xF4, 0xEE, 0x53, 0x01, 0x29, 0xF3, 0xA1, 0xF7, + 0xCA, 0x04, 0x38, 0xEF, 0x2F, 0x16, 0x56, 0xE9, 0x37, 0x1A, 0x86, 0xEC, + 0x02, 0x0B, 0xD6, 0xF9, 0x35, 0xFD, 0xE2, 0x02, 0x37, 0x01, 0x74, 0x08, + 0x92, 0x0F, 0xD7, 0x0C, 0xB0, 0x20, 0x78, 0x08, 0x62, 0x1E, 0xF4, 0xFD, + 0xF8, 0x03, 0xE0, 0xF9, 0x06, 0xF2, 0xF6, 0xFD, 0xD1, 0xEE, 0xA5, 0xFC, + 0x15, 0xE8, 0x6D, 0xF4, 0xFE, 0xE2, 0x13, 0xF5, 0x7E, 0xEB, 0x8A, 0xFB, + 0x71, 0xFA, 0xC0, 0xF6, 0x68, 0x02, 0x47, 0xF0, 0x39, 0x01, 0x36, 0xFB, + 0xA4, 0x04, 0x13, 0x0E, 0x01, 0x13, 0x3B, 0x15, 0x45, 0x16, 0x88, 0x14, + 0xBC, 0x0C, 0x8D, 0x13, 0x38, 0x05, 0x6F, 0x12, 0x71, 0xFC, 0x09, 0x0F, + 0x9C, 0xF4, 0xE3, 0x08, 0xAA, 0xF4, 0xD6, 0xFF, 0xFA, 0xF6, 0xD4, 0xF3, + 0x69, 0xF6, 0x67, 0xF5, 0x18, 0xFE, 0xDC, 0x04, 0x58, 0x0F, 0x66, 0x09, + 0x52, 0x22, 0xB0, 0x05, 0x05, 0x38, 0x36, 0x08, 0x2A, 0x3D, 0xB4, 0x11, + 0x4D, 0x27, 0xAA, 0x1B, 0x49, 0x12, 0xB9, 0x1D, 0x84, 0x09, 0x1C, 0x0E, + 0x16, 0xF8, 0x43, 0xF4, 0xDC, 0xDE, 0xE8, 0xE1, 0xCB, 0xD2, 0x3C, 0xD3, + 0x83, 0xD4, 0xCF, 0xC4, 0x74, 0xDF, 0xFF, 0xC5, 0xF0, 0xEF, 0xE6, 0xDA, + 0x24, 0xFB, 0x9A, 0xF2, 0xD1, 0x07, 0x0F, 0x07, 0x94, 0x1F, 0x83, 0x13, + 0x83, 0x30, 0xEF, 0x1C, 0xE3, 0x2E, 0x7E, 0x32, 0x76, 0x2D, 0xFA, 0x44, + 0x81, 0x30, 0xA3, 0x40, 0xCE, 0x2A, 0x2F, 0x29, 0x69, 0x1A, 0x8A, 0x0A, + 0xB0, 0xF8, 0x89, 0xEF, 0x82, 0xD3, 0xB3, 0xDC, 0x2A, 0xBE, 0x21, 0xD5, + 0x48, 0xB6, 0xD1, 0xCC, 0xEA, 0xC0, 0x2F, 0xB8, 0x62, 0xD5, 0x6C, 0xB3, + 0x32, 0xDD, 0x52, 0xC4, 0x82, 0xDD, 0xA2, 0xD9, 0xC6, 0xEB, 0xCB, 0xF4, + 0xCD, 0x0D, 0x36, 0x0A, 0x01, 0x25, 0x0A, 0x0F, 0x42, 0x1D, 0x52, 0x11, + 0xB7, 0x16, 0xDA, 0x18, 0x68, 0x17, 0x64, 0x11, 0x81, 0x0A, 0x55, 0xF9, + 0x2D, 0xF7, 0xB9, 0xEF, 0xD9, 0xEC, 0xD8, 0xF3, 0x9F, 0xF8, 0x90, 0xF1, + 0xBD, 0x0C, 0xC4, 0xF0, 0x14, 0x18, 0xA4, 0xF3, 0xD6, 0x1F, 0x95, 0xF2, + 0x0B, 0x20, 0xA6, 0xF3, 0x8D, 0x14, 0x2F, 0xF7, 0xD6, 0x0D, 0x60, 0xF0, + 0x4D, 0x0B, 0x60, 0xEB, 0x6B, 0x04, 0xD1, 0xF0, 0xE5, 0x03, 0xAA, 0xEE, + 0xED, 0xFF, 0xD1, 0xE8, 0xAF, 0xEB, 0xC0, 0xEF, 0x7B, 0xD7, 0x5C, 0xF5, + 0x62, 0xCD, 0x77, 0xE9, 0x0E, 0xC9, 0xA0, 0xE1, 0xB6, 0xD4, 0x3F, 0xDB, + 0x07, 0xEE, 0x63, 0xCE, 0x2B, 0x00, 0x64, 0xD3, 0xC2, 0xF3, 0x3A, 0xE5, + 0x21, 0xD4, 0x8B, 0xF4, 0x13, 0xD3, 0xA4, 0xFB, 0xDE, 0xE8, 0x84, 0xF0, + 0x62, 0xF0, 0xDA, 0xDA, 0xDA, 0xE9, 0xE2, 0xCE, 0x95, 0xE1, 0x7A, 0xD0, + 0xEB, 0xDD, 0x29, 0xCB, 0x2C, 0xD6, 0x8D, 0xC6, 0x23, 0xD4, 0x58, 0xD2, + 0x45, 0xE3, 0x15, 0xD7, 0xFE, 0xF1, 0x99, 0xD0, 0x3B, 0xFD, 0x8D, 0xD5, + 0x77, 0x08, 0x01, 0xE6, 0xAC, 0x0B, 0x7F, 0xEB, 0x9A, 0x07, 0x37, 0xE5, + 0xD0, 0x00, 0x36, 0xE4, 0xD4, 0xF5, 0x52, 0xE0, 0xA9, 0xE2, 0x15, 0xD6, + 0x7F, 0xCC, 0xCC, 0xC8, 0x97, 0xB9, 0x49, 0xBD, 0x7C, 0xA7, 0x93, 0xB5, + 0x41, 0x9F, 0x48, 0xAB, 0x9E, 0xAC, 0xB7, 0xAE, 0x4C, 0xC4, 0x8E, 0xBF, + 0x92, 0xD6, 0x15, 0xD6, 0xDE, 0xE2, 0x2B, 0xF8, 0x63, 0xFA, 0x12, 0x14, + 0xDD, 0x1A, 0x19, 0x22, 0xCB, 0x25, 0xD6, 0x2C, 0xAE, 0x1A, 0x19, 0x2A, + 0x4D, 0x09, 0xB3, 0x1E, 0x88, 0xF2, 0x91, 0x0D, 0xEA, 0xD7, 0xC2, 0xEA, + 0x49, 0xC0, 0x23, 0xC3, 0x83, 0xAA, 0xB3, 0xA6, 0xDB, 0x9D, 0x87, 0xA0, + 0x92, 0xA3, 0xEE, 0xA9, 0x10, 0xB1, 0x17, 0xB8, 0x83, 0xC4, 0xA5, 0xC9, + 0x79, 0xE0, 0xDC, 0xD3, 0x99, 0xF3, 0x02, 0xE1, 0x27, 0xF8, 0x45, 0xFB, + 0x87, 0x02, 0x13, 0x0C, 0xDD, 0x12, 0x7A, 0x0E, 0x28, 0x19, 0xFF, 0x12, + 0xC6, 0x1F, 0x7F, 0x14, 0xF9, 0x25, 0x83, 0x10, 0x31, 0x18, 0xB0, 0x0D, + 0x3E, 0x00, 0x61, 0x07, 0xFC, 0xF2, 0x19, 0x02, 0x70, 0xF5, 0x2B, 0x0A, + 0xF8, 0x0A, 0x4D, 0x12, 0x50, 0x23, 0x01, 0x11, 0x54, 0x29, 0x33, 0x10, + 0x5A, 0x22, 0x3E, 0x0E, 0xD4, 0x16, 0xEC, 0x0C, 0x8F, 0x15, 0x59, 0x0D, + 0x82, 0x1F, 0x2E, 0x07, 0xF9, 0x1F, 0x13, 0x02, 0xF0, 0x12, 0xA9, 0x03, + 0xD7, 0x06, 0x59, 0x04, 0xB8, 0x04, 0xB9, 0x08, 0xB9, 0x09, 0xAC, 0x0B, + 0x9A, 0x17, 0xB6, 0x09, 0x99, 0x2D, 0x5B, 0x0A, 0xE7, 0x3A, 0xC8, 0x11, + 0x6A, 0x38, 0xA7, 0x1B, 0xA9, 0x35, 0x41, 0x20, 0x81, 0x35, 0xA1, 0x25, + 0x6A, 0x2F, 0xDA, 0x2D, 0x22, 0x28, 0xBA, 0x2F, 0x36, 0x25, 0x1A, 0x2D, + 0x1E, 0x28, 0xC3, 0x2C, 0x85, 0x23, 0xC3, 0x2A, 0x4A, 0x0E, 0x5E, 0x22, + 0xDC, 0xFB, 0x0A, 0x18, 0x35, 0xFC, 0x5F, 0x14, 0x30, 0x05, 0xE9, 0x15, + 0x0B, 0x07, 0xD3, 0x12, 0xEC, 0x07, 0x90, 0x0F, 0x22, 0x0F, 0x35, 0x15, + 0xFF, 0x19, 0x57, 0x25, 0x97, 0x26, 0x4E, 0x3A, 0x8C, 0x2E, 0x1E, 0x43, + 0xD5, 0x2C, 0xC4, 0x3A, 0xAF, 0x18, 0xA4, 0x23, 0xF5, 0xF1, 0x63, 0x01, + 0x13, 0xD0, 0xCB, 0xE2, 0x75, 0xC6, 0x59, 0xC8, 0xDB, 0xCA, 0xBE, 0xB9, + 0xCD, 0xD0, 0xF7, 0xBF, 0x23, 0xDF, 0x7A, 0xCD, 0x77, 0xF9, 0xFF, 0xE2, + 0xAC, 0x1F, 0x00, 0xFD, 0xBB, 0x3F, 0x0D, 0x16, 0x94, 0x44, 0x53, 0x32, + 0xF5, 0x3D, 0x75, 0x48, 0x8A, 0x3F, 0xA7, 0x54, 0xC2, 0x3F, 0xDD, 0x55, + 0xF0, 0x32, 0xFB, 0x45, 0x52, 0x1F, 0xCE, 0x32, 0xAC, 0x04, 0x2A, 0x22, + 0x87, 0xE0, 0x5E, 0x0B, 0x74, 0xCD, 0x11, 0xF4, 0xA2, 0xD5, 0x60, 0xE1, + 0x48, 0xE0, 0x3F, 0xDC, 0xEC, 0xE8, 0xFF, 0xE8, 0xC1, 0xFD, 0x68, 0xF8, + 0x99, 0x13, 0xF0, 0x09, 0xCE, 0x1E, 0xB6, 0x1B, 0x3F, 0x27, 0x08, 0x2E, + 0x4C, 0x30, 0x76, 0x47, 0x97, 0x40, 0xBF, 0x54, 0x94, 0x4F, 0xB3, 0x4B, + 0x12, 0x45, 0xBE, 0x3E, 0xF8, 0x2F, 0x1F, 0x35, 0x0F, 0x2C, 0xD7, 0x2D, + 0x35, 0x33, 0x2A, 0x32, 0x10, 0x3F, 0xDC, 0x42, 0xB7, 0x49, 0x8C, 0x55, + 0xB7, 0x48, 0xBA, 0x5E, 0x9A, 0x41, 0xC7, 0x60, 0xE9, 0x3E, 0xA9, 0x5F, + 0x34, 0x43, 0xA3, 0x55, 0xC7, 0x44, 0xBB, 0x49, 0x60, 0x3C, 0x38, 0x43, + 0x18, 0x31, 0xC1, 0x3D, 0xF0, 0x27, 0xBC, 0x38, 0x6B, 0x21, 0x73, 0x30, + 0xDB, 0x19, 0xFE, 0x25, 0x22, 0x0E, 0x78, 0x1E, 0xFF, 0x05, 0x3A, 0x13, + 0x02, 0x05, 0x3B, 0x09, 0xD5, 0x05, 0x60, 0x05, 0x5C, 0x14, 0x58, 0xFA, + 0x88, 0x26, 0xAF, 0xF5, 0x05, 0x2A, 0xE1, 0x04, 0x28, 0x34, 0xD1, 0x10, + 0x1F, 0x40, 0x6E, 0x14, 0x06, 0x39, 0xCB, 0x15, 0x06, 0x27, 0xDD, 0x0D, + 0x4A, 0x15, 0x54, 0x01, 0xE7, 0x0C, 0x95, 0xF8, 0x78, 0x07, 0xBC, 0xF6, + 0x1A, 0xFB, 0xE9, 0xF4, 0xED, 0xF0, 0x1C, 0xF0, 0xB9, 0xF2, 0x8B, 0xF7, + 0x0A, 0xF9, 0x7C, 0x03, 0x65, 0xFB, 0x12, 0x03, 0x19, 0xFB, 0xFE, 0x02, + 0xF5, 0xF6, 0x6A, 0x0F, 0x59, 0xF2, 0x44, 0x1A, 0xDE, 0xF3, 0xFD, 0x1A, + 0xFA, 0xF3, 0x13, 0x1E, 0x91, 0xE5, 0x62, 0x20, 0x7B, 0xCE, 0x24, 0x10, + 0xEF, 0xB9, 0x28, 0xF5, 0x58, 0xA9, 0x02, 0xE2, 0xA0, 0x9E, 0x7A, 0xCD, + 0xF5, 0x9D, 0xC9, 0xB4, 0x2C, 0xAA, 0x9B, 0xAA, 0x98, 0xC4, 0xFB, 0xAF, + 0x2F, 0xDE, 0xD4, 0xBA, 0xE4, 0xE9, 0x1D, 0xCC, 0x3A, 0xFB, 0x62, 0xE3, + 0xA6, 0x1B, 0x5E, 0xF3, 0xA0, 0x32, 0x76, 0xFC, 0xA9, 0x32, 0xCE, 0x05, + 0xE4, 0x20, 0xD9, 0x08, 0x41, 0x02, 0x4F, 0xFD, 0x94, 0xE2, 0x12, 0xE7, + 0x09, 0xCF, 0x22, 0xD5, 0xBD, 0xC6, 0x40, 0xC9, 0x28, 0xC3, 0x34, 0xC0, + 0x88, 0xBF, 0x2D, 0xC4, 0xC9, 0xB6, 0xD6, 0xD0, 0x41, 0xB2, 0x8A, 0xDA, + 0x0C, 0xC7, 0x1B, 0xE1, 0xF8, 0xE8, 0xBB, 0xEB, 0x2A, 0x01, 0x5E, 0xF6, + 0x0A, 0x15, 0x12, 0x01, 0xF7, 0x1C, 0x27, 0x1C, 0xDC, 0x13, 0xB0, 0x34, + 0x80, 0x0D, 0x57, 0x35, 0xB3, 0x0C, 0x21, 0x28, 0x3D, 0x10, 0x9F, 0x15, + 0xDA, 0x14, 0x6F, 0x05, 0x79, 0x0C, 0xDC, 0x00, 0x88, 0xFA, 0xD8, 0x02, + 0x62, 0xF4, 0x69, 0x02, 0xCE, 0xFF, 0x25, 0xFF, 0x27, 0x0C, 0xB7, 0x04, + 0x39, 0x19, 0xB6, 0x10, 0x89, 0x25, 0x40, 0x12, 0xFE, 0x1F, 0x6E, 0x12, + 0xBB, 0x12, 0x7F, 0x1A, 0xE5, 0x13, 0x2F, 0x22, 0xB0, 0x16, 0x0A, 0x1F, + 0x74, 0x16, 0x0D, 0x0F, 0x06, 0x18, 0xA2, 0x03, 0xA3, 0x12, 0x4D, 0x01, + 0x3D, 0x0D, 0x5C, 0xFD, 0x63, 0x06, 0x0A, 0x00, 0x76, 0xFC, 0x49, 0x0A, + 0xDC, 0xF9, 0x67, 0x0D, 0xBD, 0xFE, 0xDD, 0x12, 0xE3, 0x09, 0xAE, 0x23, + 0x32, 0x18, 0xFD, 0x2D, 0x4D, 0x22, 0x7C, 0x2C, 0xCB, 0x21, 0x0D, 0x2E, + 0xBF, 0x1F, 0xDA, 0x34, 0x1F, 0x29, 0x59, 0x32, 0x00, 0x2F, 0x7E, 0x2A, + 0x81, 0x22, 0xB1, 0x27, 0xBC, 0x15, 0xCD, 0x1B, 0x32, 0x13, 0xAD, 0x03, + 0xA6, 0x11, 0xF4, 0xF3, 0x31, 0x0F, 0xAA, 0xF6, 0x76, 0x11, 0x64, 0xFE, + 0xAC, 0x1F, 0x22, 0x09, 0x88, 0x33, 0xDB, 0x1B, 0x64, 0x3A, 0xB2, 0x28, + 0xFD, 0x35, 0x77, 0x29, 0xDC, 0x2F, 0xA9, 0x23, 0xF5, 0x1E, 0xFD, 0x1B, + 0x70, 0x07, 0x77, 0x09, 0xA6, 0xF9, 0xCD, 0xEF, 0x84, 0xEA, 0xB8, 0xE5, + 0x35, 0xD4, 0xAF, 0xE5, 0x4C, 0xCA, 0x39, 0xDE, 0xEF, 0xCC, 0xEE, 0xDD, + 0x65, 0xDB, 0xF2, 0xEE, 0x21, 0xF6, 0x0F, 0x07, 0x1D, 0x10, 0xDF, 0x21, + 0x5A, 0x25, 0x59, 0x3A, 0x41, 0x39, 0x0B, 0x46, 0x0A, 0x41, 0x1C, 0x40, + 0x2A, 0x31, 0x4F, 0x36, 0x74, 0x16, 0xE3, 0x2F, 0xAC, 0xFF, 0xCA, 0x19, + 0x6C, 0xEE, 0x4F, 0xF2, 0x2D, 0xDC, 0x27, 0xCD, 0x53, 0xC4, 0xA1, 0xB9, + 0x62, 0xB0, 0xC6, 0xB1, 0xD7, 0xB0, 0x12, 0xAC, 0x90, 0xBD, 0xB0, 0xB4, + 0xCF, 0xC8, 0xFC, 0xCB, 0xF1, 0xDB, 0xE7, 0xE3, 0x38, 0xF6, 0x24, 0xF3, + 0x91, 0x08, 0x85, 0xF9, 0x92, 0x0F, 0xF4, 0xFD, 0xC5, 0x13, 0x36, 0x05, + 0xD0, 0x15, 0x17, 0x12, 0x46, 0x17, 0xA4, 0x18, 0x1C, 0x1B, 0x09, 0x0D, + 0x65, 0x13, 0xCF, 0x01, 0xA3, 0x06, 0xC6, 0xFE, 0x14, 0x01, 0x15, 0xFE, + 0xFB, 0xF6, 0xE4, 0x05, 0xE2, 0xEE, 0x33, 0x10, 0x5A, 0xF6, 0x39, 0x0E, + 0x10, 0x00, 0xB2, 0x02, 0x66, 0x02, 0xAB, 0xFD, 0x42, 0x00, 0xF3, 0x04, + 0x4B, 0xF9, 0x53, 0x0C, 0xEE, 0xEB, 0xE4, 0x0F, 0xD4, 0xDD, 0xFF, 0x0E, + 0x05, 0xDC, 0x7B, 0xFD, 0x9E, 0xE7, 0x29, 0xE3, 0x65, 0xEF, 0xB0, 0xD1, + 0x78, 0xE8, 0xF9, 0xCB, 0xE6, 0xD5, 0xCF, 0xCA, 0x8E, 0xCA, 0x61, 0xCF, + 0x40, 0xD6, 0x69, 0xD7, 0xE2, 0xE8, 0x85, 0xD7, 0xF7, 0xED, 0x52, 0xD3, + 0xB7, 0xEA, 0x0B, 0xD7, 0xF7, 0xEF, 0xCA, 0xDE, 0x21, 0xF7, 0xD5, 0xDD, + 0x0A, 0xEC, 0xA7, 0xE3, 0x9C, 0xDF, 0xF6, 0xF1, 0x7C, 0xE8, 0xC1, 0xED, + 0xFD, 0xEF, 0xE1, 0xDC, 0x8E, 0xEA, 0x26, 0xD8, 0x59, 0xEA, 0x1E, 0xD2, + 0x92, 0xE7, 0x1C, 0xC1, 0xD9, 0xDE, 0x97, 0xB9, 0x17, 0xE4, 0x97, 0xBF, + 0x20, 0xF1, 0xDA, 0xCB, 0x91, 0xF5, 0xA8, 0xD9, 0xEA, 0xF4, 0x6B, 0xEC, + 0x50, 0xF4, 0xCF, 0xFB, 0x6E, 0xED, 0x49, 0xFF, 0x30, 0xDF, 0x54, 0xFC, + 0xD1, 0xCC, 0x22, 0xF1, 0x50, 0xB8, 0x78, 0xD9, 0x4B, 0xAB, 0x1F, 0xBE, + 0x7B, 0xAB, 0x7B, 0xA7, 0xF9, 0xAD, 0x02, 0x9B, 0x53, 0xAA, 0x5B, 0x9A, + 0x50, 0xA7, 0x29, 0xA2, 0xCB, 0xAF, 0x5F, 0xB4, 0x05, 0xC6, 0x28, 0xD0, + 0x63, 0xDF, 0x8A, 0xF0, 0xEC, 0xF0, 0xD4, 0x0E, 0xCB, 0xFF, 0xDA, 0x22, + 0xF4, 0x10, 0x23, 0x21, 0x2C, 0x13, 0x5B, 0x13, 0x0E, 0x01, 0xEB, 0x0E, + 0x60, 0xE5, 0x48, 0x0F, 0xC2, 0xD0, 0x3D, 0xFB, 0x7B, 0xCA, 0x7A, 0xD2, + 0xC9, 0xBE, 0x3E, 0xB6, 0xD2, 0xAB, 0x55, 0xAB, 0xD8, 0xA5, 0x14, 0xA7, + 0x4B, 0xAC, 0x51, 0xAE, 0x0A, 0xB8, 0xEF, 0xBB, 0xE0, 0xC9, 0xFB, 0xC6, + 0x71, 0xDC, 0xAB, 0xD4, 0xDC, 0xE4, 0x5D, 0xE9, 0xEF, 0xEB, 0x89, 0xF8, + 0xAA, 0x01, 0xA5, 0xFD, 0xC9, 0x16, 0x1C, 0x07, 0x59, 0x24, 0xDB, 0x0E, + 0xF5, 0x30, 0x40, 0x03, 0x41, 0x31, 0xB5, 0xF0, 0x76, 0x2D, 0xAC, 0xE3, + 0x25, 0x2D, 0xE5, 0xDE, 0x4E, 0x21, 0xB3, 0xE6, 0x86, 0x0D, 0x2D, 0xF3, + 0xF3, 0x02, 0xDB, 0xFC, 0x81, 0x06, 0xDC, 0xFF, 0xA1, 0x0A, 0x1F, 0x01, + 0x80, 0x03, 0x7D, 0x0E, 0xB8, 0x00, 0x4F, 0x23, 0x86, 0x0F, 0x79, 0x30, + 0x2B, 0x22, 0xDB, 0x32, 0x2B, 0x23, 0xF9, 0x28, 0x6B, 0x13, 0xAF, 0x16, + 0xA8, 0x0A, 0xCD, 0x02, 0x9B, 0x06, 0xE3, 0xF4, 0xC4, 0xF9, 0x0F, 0xF6, + 0x78, 0xF7, 0x17, 0xFD, 0x64, 0x06, 0xC0, 0x02, 0x0C, 0x0E, 0xDB, 0x05, + 0xC1, 0x04, 0x90, 0x02, 0x5C, 0xF6, 0xFA, 0x01, 0x0B, 0xF2, 0x39, 0x0D, + 0x5F, 0xFB, 0xFF, 0x17, 0x70, 0x07, 0x82, 0x1E, 0x81, 0x12, 0xA1, 0x20, + 0x98, 0x20, 0xBD, 0x10, 0xA8, 0x1E, 0x60, 0xF6, 0x5E, 0x09, 0x58, 0xE4, + 0x48, 0xF9, 0x1A, 0xE1, 0x36, 0xF1, 0x34, 0xE8, 0xDE, 0xF0, 0xC1, 0xEB, + 0x3A, 0xF6, 0x28, 0xEA, 0x2E, 0xF2, 0x31, 0xF0, 0x00, 0xEC, 0x99, 0xF5, + 0x2C, 0xED, 0xC6, 0xFC, 0xF5, 0xF5, 0x9B, 0x0E, 0x25, 0x05, 0x9E, 0x20, + 0x16, 0x13, 0x62, 0x2B, 0xA3, 0x1B, 0xA5, 0x27, 0xAF, 0x15, 0x44, 0x11, + 0xDA, 0x00, 0x39, 0xEB, 0x22, 0xEC, 0xF6, 0xC5, 0xA7, 0xDE, 0xED, 0xB6, + 0x1E, 0xDB, 0x61, 0xBC, 0xF0, 0xD8, 0xFC, 0xC6, 0xBF, 0xD2, 0xF2, 0xD0, + 0xFB, 0xDF, 0xC7, 0xD4, 0x42, 0xF5, 0x3D, 0xDE, 0x17, 0xF5, 0x5D, 0xFC, + 0xE4, 0xFF, 0x23, 0x1C, 0xC1, 0x29, 0xD6, 0x2F, 0xEB, 0x46, 0xC9, 0x39, + 0x6F, 0x42, 0xF5, 0x36, 0xC1, 0x36, 0x20, 0x2C, 0x70, 0x2E, 0xE0, 0x1C, + 0xCF, 0x1E, 0x76, 0x04, 0x65, 0x0A, 0x14, 0xF2, 0x29, 0xF8, 0x69, 0xF1, + 0xBA, 0xE8, 0x44, 0xF4, 0x88, 0xDE, 0xDA, 0xEC, 0x37, 0xD9, 0x43, 0xE3, + 0x77, 0xDC, 0x6D, 0xE7, 0x46, 0xF4, 0xC3, 0xF9, 0x7C, 0x12, 0x5A, 0x1A, + 0xD6, 0x22, 0x53, 0x3B, 0x12, 0x2A, 0x25, 0x4A, 0xE6, 0x2C, 0xD0, 0x4F, + 0x4E, 0x32, 0xC5, 0x51, 0x55, 0x40, 0x39, 0x4C, 0x1D, 0x4B, 0xA7, 0x45, + 0xBE, 0x51, 0x83, 0x3D, 0x64, 0x57, 0x68, 0x33, 0x9D, 0x4C, 0x1A, 0x32, + 0x98, 0x35, 0x34, 0x38, 0xF4, 0x29, 0xF8, 0x37, 0xC6, 0x27, 0xBD, 0x2E, + 0x2C, 0x24, 0x67, 0x28, 0xE2, 0x22, 0x4C, 0x2F, 0x5A, 0x24, 0xC7, 0x37, + 0x61, 0x29, 0x9E, 0x2E, 0x7B, 0x2F, 0xA0, 0x17, 0xF2, 0x2C, 0xE3, 0x0A, + 0x84, 0x24, 0x66, 0x0A, 0x1C, 0x1F, 0x74, 0x09, 0xAD, 0x18, 0xA6, 0x06, + 0xDE, 0x0A, 0xDB, 0xFF, 0x57, 0xFE, 0xB3, 0xEE, 0xB8, 0xF8, 0xEE, 0xDE, + 0xC8, 0xF4, 0x34, 0xE3, 0x85, 0xF6, 0xCA, 0xEC, 0x67, 0xF6, 0x3B, 0xF4, + 0xE9, 0xF1, 0xE6, 0xFE, 0x46, 0xF8, 0x6F, 0x01, 0x79, 0xFC, 0x77, 0xFE, + 0x87, 0xF6, 0x71, 0xFA, 0x92, 0xF3, 0x32, 0xF3, 0x5D, 0xF4, 0x94, 0xF4, + 0x50, 0xF6, 0x4C, 0xF8, 0xD5, 0xF2, 0xA5, 0xF6, 0x22, 0xEB, 0xF9, 0xF1, + 0x5E, 0xE3, 0x95, 0xEB, 0x95, 0xD7, 0x4A, 0xE9, 0x15, 0xCC, 0x6B, 0xED, + 0x0D, 0xC7, 0x84, 0xF7, 0x00, 0xCC, 0x3C, 0xFF, 0xE5, 0xDB, 0xB5, 0xFF, + 0x4F, 0xE8, 0xF5, 0xFE, 0x7F, 0xEE, 0xDF, 0x01, 0x53, 0xFC, 0xBE, 0x00, + 0xE3, 0x06, 0xC6, 0xFC, 0x34, 0xFF, 0xB5, 0xF6, 0x69, 0xED, 0x10, 0xE4, + 0xBB, 0xD4, 0x6D, 0xCC, 0x1C, 0xBC, 0x7D, 0xB4, 0x48, 0xB3, 0x81, 0xA2, + 0xCE, 0xB8, 0xEA, 0xA0, 0x84, 0xCD, 0x69, 0xAB, 0x16, 0xE8, 0xD0, 0xBF, + 0x62, 0xF1, 0x6C, 0xDE, 0x60, 0xF0, 0x35, 0xFA, 0x4D, 0xFD, 0x55, 0x0C, + 0x19, 0x14, 0xB3, 0x1A, 0x5D, 0x21, 0x83, 0x26, 0xDB, 0x23, 0x8D, 0x2F, + 0xA9, 0x1E, 0xBA, 0x2E, 0x10, 0x0F, 0x21, 0x1B, 0x17, 0xF9, 0x1E, 0xFF, + 0xBA, 0xE1, 0xF3, 0xF0, 0x0B, 0xCF, 0x74, 0xEF, 0xE9, 0xCA, 0xB3, 0xEF, + 0xB5, 0xD4, 0x1B, 0xEE, 0x04, 0xD8, 0xBC, 0xE9, 0x11, 0xD6, 0x4A, 0xE5, + 0x66, 0xDA, 0x92, 0xE8, 0xA9, 0xE4, 0xC4, 0xFA, 0x15, 0xFB, 0x00, 0x0F, + 0x94, 0x13, 0x12, 0x1C, 0x56, 0x21, 0xCB, 0x21, 0x40, 0x22, 0x62, 0x20, + 0xE7, 0x19, 0xA5, 0x19, 0xD3, 0x16, 0xCF, 0x0A, 0x16, 0x1B, 0xE2, 0x05, + 0xC8, 0x1D, 0x8D, 0x14, 0x2A, 0x1C, 0xB0, 0x26, 0x95, 0x1F, 0x95, 0x2D, + 0x4C, 0x34, 0xB3, 0x25, 0x0C, 0x4C, 0x08, 0x1B, 0x6C, 0x4A, 0x22, 0x1C, + 0x2E, 0x35, 0xC2, 0x31, 0xDA, 0x26, 0xA1, 0x4C, 0xA1, 0x23, 0x32, 0x50, + 0x3E, 0x25, 0x58, 0x3E, 0xA1, 0x26, 0xC7, 0x2F, 0x25, 0x25, 0xC3, 0x29, + 0xC3, 0x22, 0x9D, 0x21, 0xF0, 0x1E, 0x24, 0x20, 0x64, 0x1B, 0xB6, 0x2A, + 0x12, 0x1F, 0x74, 0x32, 0xFB, 0x20, 0x3B, 0x35, 0xB5, 0x19, 0x5D, 0x35, + 0x3D, 0x11, 0x39, 0x2D, 0x2D, 0x0F, 0xD9, 0x21, 0x55, 0x10, 0x4B, 0x25, + 0x0A, 0x15, 0x94, 0x30, 0xB5, 0x1F, 0x22, 0x2D, 0x31, 0x29, 0x5D, 0x24, + 0x1E, 0x2D, 0xCD, 0x21, 0x05, 0x29, 0x72, 0x20, 0x7D, 0x26, 0xA0, 0x1E, + 0xBD, 0x36, 0xA2, 0x1A, 0x83, 0x49, 0xAD, 0x1A, 0xDC, 0x43, 0x63, 0x1E, + 0x27, 0x2E, 0x62, 0x1F, 0x5F, 0x1C, 0x9E, 0x24, 0x2A, 0x1C, 0x45, 0x2B, + 0x94, 0x28, 0x80, 0x31, 0x82, 0x2C, 0x8C, 0x41, 0x58, 0x2F, 0xA3, 0x53, + 0x2B, 0x36, 0x34, 0x53, 0xCA, 0x2D, 0x30, 0x42, 0x29, 0x1E, 0x21, 0x33, + 0x44, 0x17, 0x02, 0x2D, 0x2E, 0x11, 0xA6, 0x25, 0xF0, 0x0C, 0xD1, 0x16, + 0xB7, 0x0E, 0xF1, 0x0C, 0x1C, 0x0A, 0x77, 0x06, 0x27, 0xFD, 0x2B, 0xF9, + 0xF9, 0xEE, 0x80, 0xF5, 0x85, 0xEC, 0x34, 0xFE, 0x28, 0xFD, 0xDA, 0x03, + 0xD0, 0x13, 0x50, 0x09, 0x2B, 0x22, 0x78, 0x13, 0x66, 0x20, 0x0E, 0x22, + 0x12, 0x1F, 0xEF, 0x27, 0xA5, 0x28, 0xA9, 0x20, 0x74, 0x29, 0x98, 0x20, + 0x17, 0x25, 0x77, 0x1F, 0x0C, 0x20, 0x53, 0x14, 0xE5, 0x14, 0x68, 0x09, + 0x93, 0x0F, 0xF2, 0x01, 0x88, 0x0C, 0x6B, 0xF7, 0x46, 0xFC, 0xEC, 0xF0, + 0x92, 0xE8, 0xA1, 0xF5, 0x04, 0xDB, 0xD1, 0xFB, 0x82, 0xD7, 0x8A, 0x02, + 0xAB, 0xE8, 0xBC, 0x03, 0x67, 0x01, 0xBC, 0xFE, 0xAF, 0x0C, 0x20, 0xF9, + 0x33, 0x0D, 0x50, 0xF7, 0x3E, 0x0B, 0xCD, 0xFB, 0x6A, 0x06, 0x72, 0x02, + 0x69, 0x01, 0x8B, 0x11, 0xE6, 0x04, 0x17, 0x29, 0x6B, 0x11, 0xF3, 0x37, + 0xDB, 0x16, 0x95, 0x2C, 0x6E, 0x13, 0xBE, 0x10, 0x00, 0x07, 0x80, 0x01, + 0x96, 0xF3, 0x6A, 0x02, 0x2E, 0xF2, 0xC1, 0x07, 0xA5, 0xFE, 0xB2, 0x0F, + 0x4D, 0x05, 0x5B, 0x0F, 0xCC, 0x07, 0x67, 0xFC, 0x1E, 0x09, 0x44, 0xEC, + 0x34, 0x0D, 0x50, 0xEC, 0x14, 0x14, 0xB1, 0xEE, 0x27, 0x14, 0xE7, 0xED, + 0xFD, 0x09, 0x90, 0xEE, 0x30, 0xFD, 0x0E, 0xEE, 0xFD, 0xEE, 0xC7, 0xE9, + 0xD7, 0xE5, 0xDA, 0xE4, 0x1B, 0xEB, 0x37, 0xDA, 0x2F, 0xF2, 0x1D, 0xCE, + 0x08, 0xED, 0xB9, 0xCA, 0x63, 0xE8, 0x84, 0xCC, 0x10, 0xE7, 0x8E, 0xD0, + 0x16, 0xE0, 0x8C, 0xD2, 0x7D, 0xD5, 0xF7, 0xCF, 0x05, 0xD1, 0xEA, 0xD3, + 0xA5, 0xD9, 0x36, 0xDA, 0xC9, 0xE4, 0x7B, 0xD6, 0x6C, 0xDC, 0xBE, 0xD9, + 0x8D, 0xC6, 0x19, 0xE5, 0xA5, 0xBB, 0x8A, 0xE4, 0x84, 0xB3, 0xC8, 0xDB, + 0x11, 0xB5, 0xEA, 0xCD, 0x41, 0xC9, 0x71, 0xBF, 0x8D, 0xD2, 0xD4, 0xBD, + 0xDB, 0xC9, 0x7E, 0xCD, 0x71, 0xC7, 0x72, 0xE4, 0x05, 0xD2, 0xDC, 0xF2, + 0x45, 0xD8, 0x6A, 0xFA, 0xAA, 0xDB, 0x89, 0x01, 0x1E, 0xE8, 0x7A, 0x02, + 0x9A, 0xF1, 0xE5, 0xF6, 0x0B, 0xEF, 0x1A, 0xEA, 0x05, 0xE5, 0xD6, 0xDF, + 0x31, 0xCD, 0xDC, 0xD2, 0xA5, 0xAD, 0xF1, 0xCA, 0xA1, 0xA9, 0x74, 0xC4, + 0xDB, 0xBE, 0x5F, 0xC1, 0xBB, 0xCF, 0x8D, 0xC5, 0xF3, 0xD8, 0x42, 0xD0, + 0x2A, 0xD6, 0xB2, 0xDF, 0x0B, 0xD2, 0xC2, 0xE6, 0x1A, 0xDB, 0xDB, 0xE8, + 0xD1, 0xE3, 0x5C, 0xF3, 0xA3, 0xEE, 0x30, 0xFA, 0xE2, 0xFD, 0xAD, 0xF7, + 0xD5, 0x06, 0xC8, 0xF0, 0xC9, 0xFF, 0x29, 0xE6, 0xEF, 0xE8, 0x1F, 0xDD, + 0x92, 0xD7, 0x1D, 0xD4, 0xEB, 0xD9, 0xDF, 0xC9, 0x6D, 0xEC, 0xD8, 0xC1, + 0x15, 0xFD, 0x76, 0xC2, 0xC0, 0xFE, 0x6F, 0xCB, 0x84, 0xFA, 0x57, 0xD8, + 0x7F, 0xF8, 0x4A, 0xE1, 0x8F, 0xF4, 0x0C, 0xE3, 0x3F, 0xF4, 0xCA, 0xE3, + 0x4A, 0xFF, 0x78, 0xE7, 0x5A, 0x03, 0xD2, 0xEF, 0x7B, 0xFE, 0xDF, 0xFA, + 0xA6, 0x05, 0xB4, 0x06, 0x8C, 0x19, 0x58, 0x0D, 0xFE, 0x28, 0xC5, 0x0C, + 0x4C, 0x1D, 0xFD, 0x0F, 0xB7, 0x05, 0x5B, 0x19, 0xE9, 0x01, 0xBB, 0x21, + 0xCD, 0x09, 0x58, 0x26, 0x71, 0x0C, 0x8C, 0x27, 0xBC, 0x0D, 0xB4, 0x21, + 0xF6, 0x14, 0x61, 0x19, 0xBE, 0x19, 0x89, 0x1B, 0x61, 0x15, 0xB0, 0x23, + 0xA4, 0x0F, 0xA6, 0x24, 0x21, 0x12, 0x4E, 0x1D, 0xCB, 0x1D, 0xCC, 0x0D, + 0x71, 0x20, 0x02, 0xF5, 0x6B, 0x11, 0xC4, 0xDF, 0x64, 0x02, 0xC1, 0xDB, + 0xE2, 0xF9, 0xAC, 0xE4, 0x05, 0xEC, 0xD7, 0xEE, 0x49, 0xE6, 0x36, 0xF4, + 0xA9, 0xF5, 0xA4, 0xF4, 0xEB, 0xFE, 0xA3, 0xEE, 0xD6, 0xF4, 0x27, 0xE3, + 0xFD, 0xED, 0xA5, 0xDE, 0x49, 0xF4, 0x63, 0xDF, 0xBF, 0xFE, 0xFF, 0xDB, + 0xBD, 0xFD, 0xCD, 0xDF, 0xBC, 0xEE, 0xDC, 0xEA, 0xF8, 0xE4, 0xD2, 0xEF, + 0x23, 0xE5, 0x5C, 0xF3, 0xBF, 0xE8, 0xE0, 0xF4, 0x6E, 0xE7, 0x67, 0xF1, + 0x85, 0xDD, 0x04, 0xF0, 0x0F, 0xD6, 0xCA, 0xEE, 0x30, 0xD3, 0x38, 0xF1, + 0x30, 0xD9, 0x29, 0xFA, 0xA1, 0xEA, 0xF5, 0xFE, 0xE9, 0xFE, 0xF1, 0xFE, + 0xB9, 0x15, 0x3B, 0x01, 0x98, 0x1C, 0x29, 0x06, 0x02, 0x0D, 0xFA, 0x00, + 0x2D, 0xFE, 0x37, 0xF5, 0x1B, 0xF6, 0x08, 0xF2, 0x53, 0xEE, 0xE5, 0xEB, + 0xD1, 0xF3, 0x15, 0xE4, 0x2C, 0x0A, 0x69, 0xEB, 0x7E, 0x17, 0xFA, 0xFA, + 0xB1, 0x09, 0x11, 0x08, 0xD4, 0xF6, 0xF5, 0x11, 0x4F, 0xFC, 0x23, 0x0F, + 0xE9, 0x0F, 0x31, 0x04, 0xA7, 0x18, 0x88, 0x06, 0xFC, 0x13, 0x0B, 0x12, + 0x3B, 0x0F, 0x02, 0x1C, 0x73, 0x12, 0xE9, 0x28, 0x87, 0x12, 0x78, 0x36, + 0x50, 0x0C, 0x49, 0x35, 0xD4, 0x0A, 0xFA, 0x29, 0x05, 0x0A, 0xE4, 0x29, + 0xB6, 0x0C, 0xE1, 0x29, 0xCB, 0x16, 0xB6, 0x1C, 0x2D, 0x18, 0x65, 0x14, + 0x5C, 0x0D, 0x28, 0x15, 0xCF, 0x06, 0x61, 0x12, 0x71, 0x06, 0xBF, 0x0E, + 0xF9, 0x0A, 0x28, 0x10, 0x04, 0x1A, 0xDE, 0x11, 0x78, 0x21, 0xD4, 0x11, + 0x30, 0x17, 0x02, 0x0C, 0x55, 0x0C, 0xE0, 0x00, 0x33, 0x0B, 0xEA, 0xFA, + 0xCF, 0x0E, 0xAE, 0xF9, 0x9E, 0x0B, 0x06, 0x00, 0x4D, 0x08, 0xB4, 0x0B, + 0xA3, 0x10, 0x43, 0x0E, 0xF3, 0x1E, 0xDD, 0x03, 0x61, 0x29, 0xD9, 0xFB, + 0x55, 0x27, 0xBE, 0xFE, 0x60, 0x1F, 0xF0, 0x00, 0xD0, 0x1B, 0x86, 0xFF, + 0x19, 0x1B, 0x37, 0x01, 0x52, 0x17, 0x9D, 0x02, 0x8E, 0x06, 0xF6, 0x02, + 0xD7, 0xF8, 0xF5, 0x03, 0x7C, 0xFE, 0xF8, 0x04, 0x00, 0x02, 0xA1, 0x0A, + 0xED, 0xF6, 0x51, 0x12, 0xB0, 0xE5, 0x2C, 0x15, 0xB4, 0xD6, 0x93, 0x0B, + 0x55, 0xD2, 0xFE, 0xF1, 0xA5, 0xDC, 0xCA, 0xE1, 0xC6, 0xEC, 0x77, 0xE5, + 0xE3, 0xF2, 0x4F, 0xE9, 0x51, 0xE9, 0xED, 0xE0, 0x57, 0xDD, 0x12, 0xD1, + 0xA3, 0xDA, 0xEE, 0xBE, 0xF0, 0xDC, 0xC0, 0xAF, 0x03, 0xDC, 0xA5, 0xAD, + 0x42, 0xD5, 0x31, 0xB9, 0x00, 0xD6, 0x92, 0xC8, 0xDE, 0xE2, 0xE1, 0xCD, + 0x0E, 0xE2, 0x73, 0xD1, 0xBD, 0xCE, 0x34, 0xD2, 0x0F, 0xC4, 0xED, 0xC7, + 0xB6, 0xCA, 0xA4, 0xBF, 0xAA, 0xD8, 0x13, 0xBD, 0x9B, 0xDC, 0xF4, 0xC2, + 0x35, 0xD3, 0xAD, 0xD0, 0x32, 0xD3, 0x73, 0xD8, 0xF1, 0xDA, 0x72, 0xDD, + 0xCC, 0xD9, 0x13, 0xE6, 0x9A, 0xDA, 0x50, 0xF0, 0x4C, 0xE6, 0xC4, 0xFA, + 0x40, 0xF1, 0x8D, 0x02, 0xD5, 0xF2, 0x30, 0x02, 0x4C, 0xF1, 0xB4, 0xF9, + 0xA7, 0xEC, 0x1F, 0xF2, 0x7A, 0xDC, 0x9E, 0xEC, 0x21, 0xCC, 0x11, 0xE9, + 0xC7, 0xCB, 0x0B, 0xEC, 0xD6, 0xDB, 0x7A, 0xF0, 0xF7, 0xEB, 0xD4, 0xEF, + 0x16, 0xEF, 0x03, 0xF0, 0xA3, 0xEC, 0x79, 0xF3, 0x91, 0xEB, 0x7A, 0xF5, + 0x03, 0xED, 0xBF, 0xF7, 0x80, 0xF0, 0xAF, 0xFE, 0xE0, 0xF5, 0xB0, 0x04, + 0x3B, 0xFD, 0xE2, 0x01, 0x0D, 0x0A, 0x41, 0xFA, 0x2C, 0x15, 0x19, 0xF7, + 0x81, 0x13, 0x15, 0xFF, 0xEC, 0x17, 0xF6, 0x04, 0xB8, 0x27, 0x33, 0x01, + 0x7F, 0x2E, 0x92, 0xFA, 0x37, 0x27, 0x44, 0xF7, 0xCB, 0x16, 0xE2, 0x07, + 0x2D, 0x09, 0x93, 0x21, 0xB9, 0x05, 0xC5, 0x31, 0x37, 0x0B, 0x7F, 0x36, + 0x77, 0x13, 0x0F, 0x32, 0xFA, 0x15, 0x46, 0x2B, 0xFF, 0x14, 0x10, 0x29, + 0x9B, 0x18, 0x81, 0x30, 0x61, 0x22, 0x42, 0x3E, 0x3F, 0x30, 0x66, 0x45, + 0x5C, 0x38, 0xB0, 0x42, 0x45, 0x33, 0x7C, 0x43, 0x0E, 0x33, 0x4A, 0x3B, + 0xE7, 0x39, 0xFC, 0x28, 0xC6, 0x36, 0xF4, 0x27, 0x3D, 0x35, 0x48, 0x32, + 0x03, 0x39, 0xA6, 0x38, 0x3F, 0x40, 0x4E, 0x38, 0x02, 0x51, 0x1F, 0x39, + 0xB6, 0x51, 0x6E, 0x43, 0x18, 0x3F, 0x12, 0x4C, 0xD1, 0x39, 0xA3, 0x49, + 0x1D, 0x44, 0xB9, 0x43, 0xA8, 0x48, 0x34, 0x3E, 0xF5, 0x45, 0x5B, 0x38, + 0x65, 0x44, 0xDA, 0x3A, 0x4C, 0x42, 0x3D, 0x3D, 0xFD, 0x3E, 0x25, 0x32, + 0xF6, 0x38, 0xFE, 0x23, 0x70, 0x2D, 0xB8, 0x23, 0x17, 0x24, 0x3E, 0x2A, + 0x5D, 0x1D, 0xF2, 0x29, 0xC2, 0x1A, 0x3B, 0x25, 0xDE, 0x27, 0x89, 0x20, + 0x75, 0x32, 0x09, 0x1E, 0xC1, 0x24, 0x77, 0x19, 0xDC, 0x14, 0x60, 0x11, + 0x6E, 0x14, 0x5F, 0x0A, 0x02, 0x15, 0xEE, 0x03, 0xB8, 0x11, 0x20, 0xFB, + 0x1F, 0x0F, 0x30, 0xF3, 0x02, 0x05, 0xF5, 0xED, 0x7F, 0xF8, 0x42, 0xE6, + 0xB8, 0xF1, 0x03, 0xE6, 0x28, 0xE8, 0xD2, 0xF1, 0x46, 0xE5, 0x18, 0x00, + 0xBB, 0xF5, 0xDF, 0x0C, 0xAA, 0x0B, 0xC6, 0x14, 0x84, 0x15, 0x44, 0x17, + 0x16, 0x18, 0x84, 0x13, 0x19, 0x18, 0x12, 0x0A, 0xCF, 0x12, 0xC9, 0x00, + 0x8B, 0x0E, 0x56, 0xFF, 0x00, 0x09, 0x7E, 0x04, 0x33, 0xF8, 0x12, 0x0A, + 0x5E, 0xE0, 0x7D, 0x0B, 0x30, 0xCF, 0xDB, 0x06, 0x1E, 0xCD, 0x16, 0x02, + 0x9B, 0xD8, 0xBF, 0x00, 0x12, 0xE2, 0xB0, 0x02, 0x4A, 0xE6, 0xE7, 0x03, + 0xAF, 0xF3, 0x03, 0x07, 0xA1, 0x04, 0x86, 0x11, 0x8D, 0x14, 0xD9, 0x12, + 0x20, 0x1E, 0xDE, 0x0B, 0x64, 0x17, 0xFC, 0x09, 0x46, 0x08, 0x5F, 0x06, + 0x53, 0xFE, 0x46, 0xFE, 0x47, 0x00, 0x50, 0xF3, 0xF7, 0xFD, 0x04, 0xEA, + 0x73, 0xF6, 0xB7, 0xE7, 0xCE, 0xF8, 0x20, 0xEE, 0x2F, 0xF7, 0xB0, 0x00, + 0x57, 0xF6, 0x49, 0x10, 0x10, 0xFB, 0xE2, 0x14, 0xEB, 0xF7, 0xAF, 0x17, + 0xFF, 0xF8, 0x40, 0x10, 0x97, 0xFF, 0x48, 0x04, 0x34, 0x01, 0x87, 0x01, + 0x36, 0x08, 0x88, 0xFD, 0xA2, 0x10, 0x67, 0xF7, 0x78, 0x0A, 0x34, 0xF7, + 0x15, 0xFF, 0x64, 0xF6, 0x5F, 0xFB, 0xD7, 0xF3, 0x9E, 0xFD, 0xA3, 0xF7, + 0x56, 0x07, 0x45, 0x01, 0x8A, 0x17, 0x78, 0x06, 0xFB, 0x21, 0xCA, 0x03, + 0x1C, 0x20, 0xA3, 0xFF, 0x41, 0x12, 0x5F, 0x01, 0xD2, 0x00, 0x9C, 0x03, + 0xDE, 0xF7, 0xF0, 0x00, 0xE6, 0xFD, 0x44, 0xFE, 0x36, 0x07, 0x14, 0xF9, + 0x35, 0x00, 0x5B, 0xF3, 0x05, 0xEF, 0x56, 0xF1, 0xA6, 0xE3, 0x4D, 0xEE, + 0xDE, 0xE1, 0x33, 0xE9, 0x78, 0xEC, 0x52, 0xE6, 0x53, 0xF9, 0xA5, 0xEB, + 0xD8, 0xF8, 0x24, 0xFE, 0x0A, 0xF1, 0xB4, 0x15, 0x0D, 0xE6, 0x9B, 0x22, + 0x2F, 0xDD, 0xA6, 0x1E, 0x05, 0xE4, 0x70, 0x0C, 0xCE, 0xEB, 0x0A, 0xF9, + 0x0E, 0xEB, 0x96, 0xEF, 0xE7, 0xEE, 0x27, 0xEE, 0xE5, 0xF0, 0x1E, 0xEB, + 0xFC, 0xE2, 0x33, 0xE5, 0xE0, 0xCF, 0xDC, 0xDF, 0x73, 0xCA, 0xD9, 0xD6, + 0xFB, 0xD0, 0xE6, 0xCC, 0x80, 0xD9, 0x38, 0xD0, 0x9B, 0xDE, 0x53, 0xE6, + 0x92, 0xDD, 0x6C, 0xF9, 0xD9, 0xE2, 0xCB, 0xF5, 0x16, 0xF0, 0x49, 0xE9, + 0x3B, 0xF3, 0x41, 0xE3, 0x16, 0xF1, 0x79, 0xDF, 0x89, 0xEA, 0x93, 0xDF, + 0x82, 0xDB, 0x27, 0xE0, 0x84, 0xD7, 0x40, 0xD9, 0x0D, 0xE2, 0xC1, 0xD3, + 0xBB, 0xED, 0x3B, 0xD5, 0x09, 0xFA, 0xE4, 0xDF, 0xE2, 0x02, 0x8F, 0xF3, + 0x41, 0x07, 0x24, 0x01, 0xC0, 0x09, 0x30, 0x04, 0xED, 0x04, 0x06, 0xFF, + 0x67, 0xFB, 0xE5, 0xF2, 0xC4, 0xF4, 0xCB, 0xEC, 0x44, 0xF9, 0xE9, 0xEC, + 0xF9, 0x04, 0x2B, 0xED, 0xBE, 0x0B, 0xAF, 0xF0, 0x40, 0x0A, 0x3E, 0xFD, + 0x1C, 0x04, 0xCC, 0x0E, 0x64, 0x08, 0x4F, 0x16, 0x7C, 0x14, 0x66, 0x17, + 0x44, 0x19, 0x4D, 0x1F, 0xA6, 0x20, 0xA7, 0x2A, 0x82, 0x2C, 0xB8, 0x2E, + 0x27, 0x29, 0xE5, 0x31, 0x78, 0x1A, 0xBB, 0x31, 0x44, 0x0D, 0x82, 0x24, + 0xCD, 0x00, 0x3C, 0x1D, 0xA2, 0xFA, 0xB9, 0x22, 0x83, 0x02, 0x70, 0x20, + 0xBF, 0x14, 0x71, 0x0D, 0xF6, 0x1B, 0xE9, 0xFB, 0x2A, 0x0F, 0x02, 0xEF, + 0xAF, 0x06, 0x09, 0xE2, 0x1A, 0x10, 0x0A, 0xE6, 0x63, 0x1C, 0xAE, 0xFC, + 0xF9, 0x1E, 0x3E, 0x15, 0x8A, 0x12, 0x8B, 0x23, 0x2C, 0xFF, 0xFB, 0x23, + 0xDC, 0xF7, 0x1D, 0x15, 0xB2, 0xFC, 0xEC, 0xFE, 0x0E, 0x03, 0x95, 0xF1, + 0x1E, 0x08, 0x63, 0xF5, 0x00, 0x0A, 0xF9, 0x03, 0xE4, 0x09, 0xEE, 0x0A, + 0xEE, 0x05, 0xCE, 0x05, 0x87, 0xF9, 0x10, 0xFD, 0x54, 0xF1, 0xEF, 0xF3, + 0x0C, 0xF0, 0x32, 0xF3, 0x00, 0xF4, 0x05, 0xFF, 0xD6, 0x04, 0xDA, 0x05, + 0xE7, 0x08, 0x6D, 0x04, 0xE4, 0xF8, 0xEC, 0x02, 0x9B, 0xF2, 0x8D, 0x03, + 0x37, 0xF9, 0x35, 0x07, 0x43, 0xFD, 0xE9, 0x06, 0x43, 0xF6, 0x8D, 0x06, + 0xD5, 0xE7, 0x7F, 0x02, 0x0C, 0xE0, 0x57, 0xF4, 0x98, 0xE7, 0x9A, 0xE7, + 0x78, 0xF2, 0x89, 0xDE, 0x65, 0xF1, 0x65, 0xD8, 0xC9, 0xF7, 0x1E, 0xDE, + 0x70, 0x0B, 0xA3, 0xF1, 0x32, 0x10, 0xFA, 0xFF, 0x46, 0x00, 0x79, 0xFC, + 0xEA, 0xF1, 0x4A, 0xF9, 0xDA, 0xEE, 0x3F, 0xF5, 0xB2, 0xF6, 0x96, 0xE9, + 0x71, 0x08, 0xF3, 0xE1, 0x8D, 0x12, 0x97, 0xE0, 0x24, 0x0A, 0xD3, 0xE3, + 0x27, 0xF2, 0x1E, 0xF1, 0xD1, 0xE0, 0x97, 0x00, 0xB0, 0xEB, 0xC4, 0x06, + 0xA1, 0x01, 0xB4, 0x0F, 0xB3, 0x07, 0x62, 0x15, 0xD1, 0x02, 0x79, 0x13, + 0x0E, 0xFA, 0xCC, 0x11, 0x4F, 0xED, 0xFA, 0x0E, 0x2A, 0xE4, 0x86, 0x0B, + 0xC1, 0xE1, 0x25, 0x06, 0xEA, 0xF0, 0xCA, 0x0D, 0xA3, 0xFB, 0xE2, 0x0C, + 0xDE, 0x00, 0x0B, 0xFE, 0xB2, 0x04, 0xB0, 0xF7, 0x01, 0xF6, 0xB0, 0xEB, + 0xCE, 0xEE, 0x53, 0xE1, 0x4A, 0xFE, 0xC4, 0xEC, 0xE0, 0x1A, 0xE6, 0xFB, + 0xE2, 0x24, 0x19, 0xFC, 0x5D, 0x15, 0x7E, 0x00, 0x0C, 0xFF, 0x15, 0x05, + 0xD4, 0xE7, 0xA2, 0xFA, 0xB0, 0xE3, 0xA8, 0xF6, 0xCF, 0xEB, 0x4E, 0xF9, + 0x93, 0xFB, 0x04, 0xF2, 0xF1, 0x0E, 0x3B, 0xED, 0x6A, 0x0E, 0xD9, 0xF4, + 0x42, 0x08, 0xCE, 0xFA, 0x9F, 0x00, 0xC0, 0xEB, 0x22, 0x04, 0x2F, 0xDE, + 0xB5, 0x04, 0x02, 0xE1, 0xA3, 0xEF, 0x3C, 0xE3, 0x25, 0xF7, 0x8E, 0xEB, + 0x38, 0xF0, 0x1E, 0xF0, 0x55, 0xDD, 0x6B, 0xF0, 0x98, 0xE3, 0xE5, 0xEB, + 0x0F, 0xEC, 0x1C, 0xF1, 0x7B, 0xF5, 0x57, 0xFE, 0xEA, 0xE6, 0x64, 0xFD, + 0xA5, 0xE0, 0x38, 0xF9, 0xEE, 0xE4, 0x21, 0xF2, 0x66, 0xE1, 0xE2, 0xE1, + 0xFF, 0xF1, 0x68, 0xD6, 0xCC, 0xE8, 0x77, 0xD2, 0x2E, 0xE1, 0xA5, 0xD8, + 0x50, 0xFD, 0x41, 0xE1, 0xBF, 0x01, 0x3E, 0xE3, 0x4F, 0xF0, 0xA3, 0xE7, + 0x8D, 0xEE, 0x57, 0xEA, 0xFB, 0xF5, 0x61, 0xE7, 0x65, 0xEA, 0x30, 0xDC, + 0x0E, 0xE6, 0xE3, 0xE0, 0x67, 0xEE, 0xEE, 0xEB, 0x34, 0xF3, 0x19, 0xE9, + 0x1E, 0xF3, 0xE4, 0xE4, 0x9C, 0xF0, 0xA7, 0xEB, 0xB3, 0xEE, 0xF8, 0xF8, + 0xE2, 0xF6, 0x9F, 0xFC, 0x04, 0x09, 0x50, 0xFC, 0x46, 0x00, 0xF1, 0xF9, + 0xBE, 0xEB, 0xB2, 0xF4, 0x5C, 0xE0, 0xAC, 0xF4, 0xD1, 0xD7, 0x05, 0xFD, + 0x48, 0xD5, 0x03, 0x04, 0xBC, 0xD7, 0xED, 0x03, 0x27, 0xE7, 0x26, 0xFE, + 0x1D, 0xFE, 0x7F, 0xFB, 0x4C, 0x01, 0xE5, 0xFB, 0x02, 0xED, 0x8D, 0xF6, + 0x9D, 0xDC, 0x4E, 0xF4, 0x70, 0xDE, 0x12, 0xF2, 0xD9, 0xE2, 0xFD, 0xEB, + 0x47, 0xE0, 0x6B, 0xE1, 0xD2, 0xE9, 0x2F, 0xDB, 0xB9, 0xF4, 0x21, 0xE2, + 0xC3, 0xE0, 0x4B, 0xE5, 0x34, 0xD5, 0xFD, 0xE5, 0xE1, 0xF3, 0x05, 0xE5, + 0xA2, 0xFA, 0x3B, 0xD7, 0x57, 0xFA, 0x84, 0xD3, 0x30, 0x0C, 0x4F, 0xDD, + 0xA2, 0x07, 0x17, 0xDC, 0x27, 0x09, 0x3A, 0xDE, 0xDF, 0x09, 0x8D, 0xED, + 0x9C, 0xF4, 0x25, 0xF2, 0xD7, 0xE7, 0xC1, 0xF6, 0xE0, 0xF3, 0x88, 0xFD, + 0x20, 0x01, 0x97, 0xF7, 0xBA, 0x00, 0x55, 0xFA, 0x01, 0xFA, 0x89, 0x02, + 0x5A, 0xF6, 0xC3, 0x0A, 0xCB, 0xF8, 0xBD, 0x15, 0xBD, 0xFC, 0xE5, 0x1E, + 0xBD, 0x03, 0x42, 0x28, 0x18, 0x0F, 0xBF, 0x2A, 0xA5, 0x12, 0xD1, 0x1C, + 0xAF, 0xFB, 0x5B, 0x07, 0xDD, 0xF0, 0x83, 0x0A, 0xEA, 0xFB, 0x45, 0x11, + 0xA7, 0xF9, 0xD7, 0x05, 0x6A, 0x02, 0xCD, 0x08, 0x00, 0x18, 0xF5, 0x11, + 0xB9, 0x26, 0x36, 0x16, 0x02, 0x2B, 0x53, 0x1C, 0xD0, 0x28, 0x3E, 0x1F, + 0x80, 0x2C, 0x53, 0x21, 0xF7, 0x38, 0x45, 0x1A, 0x35, 0x3D, 0xFC, 0x17, + 0xA0, 0x3A, 0xB5, 0x22, 0x08, 0x30, 0x5E, 0x1C, 0x5F, 0x21, 0xCE, 0x1A, + 0x47, 0x25, 0xB6, 0x28, 0x8E, 0x24, 0x79, 0x25, 0xF7, 0x1B, 0x27, 0x18, + 0x7E, 0x23, 0xCF, 0x15, 0x3D, 0x18, 0x8D, 0x13, 0x74, 0x0B, 0x07, 0x12, + 0x22, 0x18, 0x42, 0x1C, 0x0F, 0x14, 0x02, 0x1D, 0xFA, 0x18, 0xA5, 0x1F, + 0xF4, 0x1E, 0xF5, 0x1F, 0x4F, 0x11, 0xD1, 0x18, 0x6D, 0x0E, 0x9B, 0x18, + 0x47, 0x15, 0x25, 0x1A, 0xDA, 0x1A, 0x84, 0x11, 0xD8, 0x15, 0x09, 0x04, + 0x50, 0x05, 0xC3, 0xFD, 0x4D, 0xFE, 0x44, 0x05, 0x78, 0xF9, 0xC2, 0x11, + 0x67, 0xF2, 0x6A, 0x13, 0xCA, 0x01, 0xBD, 0x0B, 0xAF, 0x21, 0x1D, 0x04, + 0x04, 0x38, 0x80, 0x0A, 0xE7, 0x38, 0xCC, 0x0F, 0x67, 0x34, 0xCC, 0x0E, + 0xE4, 0x1F, 0xB7, 0x10, 0x1D, 0x08, 0xF6, 0x1B, 0x1E, 0x01, 0x77, 0x22, + 0xA0, 0xFE, 0x95, 0x20, 0x80, 0xF6, 0x32, 0x1B, 0x4D, 0xE5, 0xD6, 0x15, + 0x5F, 0xD9, 0x04, 0x15, 0x58, 0xD8, 0x74, 0x19, 0x61, 0xE4, 0x9A, 0x1B, + 0xA9, 0xF8, 0x63, 0x11, 0xCC, 0x09, 0x02, 0x10, 0xBC, 0x0B, 0x72, 0x14, + 0x6D, 0xFE, 0xA2, 0x06, 0x6F, 0x0B, 0x71, 0xFB, 0x6F, 0x17, 0xFB, 0xF5, + 0x3E, 0x09, 0x99, 0xEB, 0x93, 0x0A, 0x8A, 0xE4, 0x48, 0x06, 0x8E, 0xDE, + 0x78, 0xFC, 0xDF, 0xDA, 0x23, 0xFB, 0x79, 0xDC, 0xC8, 0xF3, 0x7F, 0xE3, + 0x6B, 0xF6, 0x2F, 0xF1, 0x45, 0x01, 0xE6, 0xFC, 0xF9, 0x07, 0x45, 0x07, + 0x6C, 0x0A, 0x77, 0x0D, 0x44, 0x0D, 0xD1, 0x0C, 0x85, 0x0D, 0x5C, 0x07, + 0x73, 0x0F, 0x33, 0xFD, 0xB7, 0x09, 0x81, 0x03, 0xEB, 0xFA, 0x06, 0x08, + 0x40, 0xF9, 0xD6, 0x02, 0x68, 0xFC, 0xFA, 0x00, 0x3C, 0xFC, 0xD6, 0xF8, + 0x65, 0x08, 0x01, 0xFA, 0xDD, 0x0E, 0x48, 0xFC, 0x16, 0x09, 0xB9, 0xFC, + 0x38, 0x0E, 0x5D, 0x08, 0xD0, 0x07, 0xD3, 0x0A, 0x0F, 0xFD, 0x46, 0x00, + 0xBC, 0x00, 0x9B, 0xFF, 0x85, 0xF6, 0x9B, 0x02, 0x7A, 0xE8, 0x78, 0xFD, + 0xEE, 0xF3, 0xBC, 0x03, 0x28, 0x02, 0x4B, 0x0B, 0x90, 0x00, 0x02, 0x02, + 0x2A, 0xFA, 0xE3, 0xF4, 0xBD, 0xF8, 0x76, 0xE9, 0x93, 0xFA, 0xA9, 0xE7, + 0x2B, 0xFB, 0xFC, 0xF1, 0x48, 0xFA, 0x7F, 0x01, 0x79, 0x08, 0xDB, 0x17, + 0x86, 0x19, 0x44, 0x1B, 0xC1, 0x0F, 0x94, 0x12, 0x00, 0xF7, 0x05, 0x11, + 0x8A, 0xEE, 0x51, 0x0C, 0xF5, 0xF0, 0xB4, 0x06, 0x81, 0xF9, 0xF1, 0x05, + 0xCA, 0x02, 0x06, 0x07, 0xAF, 0xF7, 0x30, 0x03, 0x85, 0xE9, 0x64, 0x01, + 0x29, 0xE2, 0x9E, 0x02, 0x7C, 0xDA, 0x07, 0x04, 0x8A, 0xE4, 0x81, 0x09, + 0xCB, 0xF7, 0xF4, 0x0C, 0x9E, 0xFE, 0xA3, 0x09, 0x6B, 0xFC, 0x6E, 0xFA, + 0x66, 0xFD, 0x48, 0xEC, 0xA9, 0x00, 0x0C, 0xE9, 0x4A, 0x0A, 0x18, 0xF1, + 0xBC, 0x0B, 0xD0, 0xFC, 0x62, 0x0D, 0x97, 0x00, 0x30, 0x15, 0xE7, 0xF9, + 0xC3, 0x04, 0x4E, 0xE7, 0xFE, 0xFE, 0x3B, 0xE3, 0xF3, 0x08, 0xDB, 0xED, + 0x6E, 0x0F, 0x6B, 0xF4, 0x17, 0x1C, 0x88, 0xFE, 0x80, 0x17, 0x66, 0x09, + 0xCA, 0x08, 0x09, 0x0A, 0x98, 0xF8, 0x74, 0xFC, 0xE5, 0xE7, 0xCE, 0xE9, + 0x3C, 0xE1, 0xC0, 0xE1, 0x16, 0xE1, 0x9E, 0xE0, 0xDC, 0xEA, 0xE7, 0xE6, + 0xDB, 0xF1, 0xC0, 0xEE, 0x81, 0xF9, 0xE1, 0xF6, 0x88, 0x02, 0x08, 0x05, + 0xE8, 0x00, 0x46, 0x06, 0xEA, 0x02, 0x4D, 0x03, 0x1A, 0x01, 0xAC, 0x06, + 0x31, 0xF3, 0xFC, 0x06, 0x4C, 0xEC, 0x72, 0x01, 0x9C, 0xDF, 0x36, 0xF1, + 0xC2, 0xCF, 0x6F, 0xE2, 0x16, 0xD5, 0x26, 0xE6, 0xA2, 0xDF, 0x53, 0xF1, + 0xA6, 0xE5, 0x87, 0xEF, 0x07, 0xF8, 0x79, 0xE6, 0xEC, 0xFD, 0xC8, 0xD8, + 0x30, 0xF2, 0x83, 0xD0, 0xC7, 0xEB, 0xC9, 0xD5, 0xAF, 0xE1, 0x73, 0xDF, + 0xD3, 0xE7, 0x8A, 0xE7, 0x99, 0x06, 0xF1, 0xF4, 0x38, 0x0C, 0x62, 0xF9, + 0xF0, 0x0F, 0x84, 0xF1, 0xCF, 0x17, 0x1E, 0xEA, 0x98, 0xFC, 0xDD, 0xE7, + 0xF6, 0xDF, 0x58, 0xFB, 0x58, 0xDD, 0xB3, 0x0F, 0xBA, 0xEC, 0x06, 0x16, + 0xC6, 0xFC, 0xF6, 0x1D, 0x84, 0x03, 0x58, 0x19, 0xBE, 0xFE, 0x26, 0x0F, + 0x97, 0xF6, 0xA8, 0x17, 0xD9, 0xFC, 0xAE, 0x23, 0xEE, 0x09, 0x37, 0x23, + 0x50, 0x13, 0xF5, 0x19, 0x66, 0x13, 0x7B, 0x13, 0x29, 0x04, 0x59, 0x0A, + 0xDF, 0xF4, 0xA5, 0x02, 0xDD, 0xF2, 0xDF, 0x01, 0x07, 0xF7, 0xD3, 0x06, + 0x53, 0xFC, 0x55, 0x0D, 0x00, 0x00, 0xEF, 0x0A, 0xBF, 0x07, 0x60, 0x02, + 0x99, 0x17, 0x2B, 0xF6, 0x7E, 0x20, 0x2B, 0xEE, 0x22, 0x28, 0x84, 0xF7, + 0x94, 0x2E, 0x73, 0x05, 0xD6, 0x24, 0xA4, 0x0A, 0x85, 0x22, 0xCB, 0x13, + 0x69, 0x23, 0x4F, 0x14, 0xEE, 0x1B, 0xF7, 0x08, 0x61, 0x22, 0x16, 0x0B, + 0x37, 0x23, 0xFA, 0x0D, 0xE8, 0x15, 0xEF, 0x0D, 0x79, 0x14, 0x75, 0x1A, + 0x83, 0x13, 0x4D, 0x24, 0xB4, 0x0D, 0xAC, 0x2A, 0x1F, 0x25, 0xB2, 0x2F, + 0x4B, 0x40, 0x8E, 0x34, 0x98, 0x43, 0xAA, 0x37, 0xFA, 0x3B, 0xE7, 0x3E, + 0x9E, 0x22, 0xAD, 0x4E, 0x7C, 0x03, 0x8A, 0x44, 0x96, 0xFD, 0x91, 0x35, + 0x36, 0x06, 0xB0, 0x30, 0xEC, 0x07, 0xC9, 0x29, 0xF5, 0x0B, 0xAB, 0x26, + 0x89, 0x08, 0x6C, 0x19, 0x12, 0x00, 0x41, 0x12, 0x22, 0x05, 0xA1, 0x09, + 0x51, 0x1C, 0xE7, 0xFF, 0x82, 0x2F, 0x9B, 0x01, 0xA5, 0x2E, 0x9C, 0x01, + 0x99, 0x22, 0xB8, 0x08, 0x35, 0x19, 0x0A, 0x13, 0x0C, 0x0F, 0x2A, 0x10, + 0xC2, 0x02, 0x8F, 0x05, 0x6F, 0x02, 0x7F, 0xFD, 0x3C, 0x09, 0x99, 0xFB, + 0x69, 0x01, 0xFB, 0xFE, 0xF2, 0xF6, 0x4D, 0x0A, 0x0F, 0xF5, 0x35, 0x07, + 0x2A, 0xF2, 0x8C, 0xEF, 0x21, 0xF2, 0x86, 0xE1, 0xD8, 0xF6, 0x7F, 0xD9, + 0x04, 0xF6, 0xBB, 0xD8, 0x76, 0xE8, 0x05, 0xDE, 0xD3, 0xDD, 0xA3, 0xE3, + 0xD4, 0xE0, 0x7C, 0xED, 0x3A, 0xEE, 0x6B, 0xED, 0x94, 0xEC, 0x2C, 0xDE, + 0x9A, 0xEF, 0x45, 0xDE, 0x27, 0xF6, 0x1F, 0xEF, 0xE6, 0xE1, 0xEA, 0xF2, + 0xAC, 0xE2, 0x99, 0xF3, 0x86, 0xEA, 0xD6, 0xF0, 0x3A, 0xE6, 0xC4, 0xDD, + 0x5B, 0xF5, 0x64, 0xD3, 0xF8, 0x05, 0x86, 0xDB, 0x94, 0x0D, 0x26, 0xE7, + 0x25, 0x09, 0xF3, 0xEE, 0x8B, 0xF9, 0xC0, 0xFA, 0xAF, 0xEE, 0x59, 0x06, + 0x7C, 0xEB, 0xB2, 0xFF, 0x44, 0xF6, 0x87, 0xF3, 0xDF, 0x07, 0x56, 0xF1, + 0x66, 0x0C, 0xC5, 0xF4, 0x5B, 0x01, 0xD0, 0xFB, 0x5E, 0xF8, 0x3C, 0xFF, + 0x80, 0xF6, 0xC8, 0x07, 0x60, 0xE7, 0xB1, 0x01, 0x43, 0xEF, 0xC7, 0xFB, + 0xC3, 0x06, 0x2A, 0x08, 0xFB, 0x05, 0x67, 0x0B, 0x13, 0x01, 0xD0, 0x0B, + 0x17, 0xFB, 0x57, 0x05, 0x94, 0xE5, 0x26, 0x00, 0x5C, 0xDF, 0x5E, 0x02, + 0x15, 0xEA, 0x9B, 0xF7, 0x6E, 0xF9, 0x93, 0xF0, 0xA5, 0x06, 0xBC, 0xF7, + 0x08, 0x04, 0x67, 0xFD, 0x2F, 0xF1, 0xF7, 0xFE, 0xD3, 0xE6, 0x48, 0xF7, + 0xCE, 0xEC, 0x2F, 0xEC, 0x8A, 0xF0, 0xE9, 0xF0, 0x55, 0xFF, 0x7D, 0x07, + 0xE6, 0x0D, 0xB8, 0x0F, 0x94, 0x11, 0xCD, 0x05, 0x7F, 0x0F, 0x94, 0x04, + 0x0C, 0x01, 0xE5, 0x08, 0xE9, 0xEC, 0x4A, 0x0B, 0x9E, 0xE6, 0x6F, 0x04, + 0x40, 0xF2, 0x1F, 0xF0, 0x53, 0x02, 0x89, 0xDD, 0x0D, 0x08, 0xCE, 0xDD, + 0x96, 0x07, 0xB6, 0xE8, 0xB8, 0x05, 0x5C, 0xF5, 0xF7, 0xF3, 0xD3, 0xFD, + 0xE1, 0xE9, 0x3F, 0x00, 0x5E, 0xF6, 0x9B, 0xFF, 0x04, 0xF9, 0x7F, 0xFC, + 0xBC, 0xF8, 0xB9, 0xF6, 0xC8, 0x04, 0xA7, 0xEC, 0x38, 0x14, 0xF1, 0xEA, + 0x15, 0x10, 0xBB, 0xF5, 0x0E, 0xEC, 0x13, 0xFB, 0xEE, 0xD8, 0x0D, 0xFA, + 0xC9, 0xE2, 0x04, 0xFC, 0x11, 0xFB, 0xA8, 0x05, 0x71, 0xFE, 0xEF, 0x0A, + 0x34, 0xE1, 0x55, 0xFF, 0xA3, 0xD8, 0x90, 0xFA, 0x85, 0xD9, 0x7A, 0xFB, + 0x6D, 0xE2, 0x7E, 0xFE, 0x21, 0xF1, 0xA5, 0x07, 0x4E, 0xF1, 0x8B, 0x07, + 0x26, 0xF1, 0x11, 0x02, 0x3E, 0xF6, 0x3A, 0xFE, 0xA9, 0xFA, 0x15, 0xF4, + 0xE1, 0xF5, 0x99, 0xE2, 0x47, 0xE3, 0x4F, 0xD9, 0x01, 0xD5, 0x81, 0xDF, + 0xD2, 0xE5, 0x94, 0xEA, 0x74, 0x07, 0x2F, 0xF6, 0x4E, 0x19, 0xBE, 0xFE, + 0x67, 0x1E, 0xDE, 0x04, 0xBA, 0x1C, 0x1C, 0x08, 0x6D, 0x19, 0x24, 0x10, + 0x87, 0x15, 0xB3, 0x0D, 0x94, 0x0C, 0x4B, 0xFC, 0x91, 0xFD, 0xA0, 0xEF, + 0x67, 0xEE, 0x8F, 0xE1, 0x5A, 0xF3, 0x5B, 0xD2, 0x3B, 0xF8, 0xCC, 0xC3, + 0xC2, 0xEA, 0x84, 0xC6, 0x2F, 0xD8, 0x82, 0xD6, 0x8D, 0xD5, 0x6A, 0xDF, + 0x79, 0xDC, 0x21, 0xE8, 0x87, 0xE4, 0x64, 0xEB, 0x70, 0xFD, 0x5D, 0xF2, + 0x45, 0x06, 0xA3, 0xFA, 0x54, 0xFF, 0xB1, 0xFA, 0x45, 0xFA, 0x62, 0x00, + 0xDA, 0xEE, 0x43, 0x03, 0x80, 0xEE, 0x15, 0xFD, 0x14, 0xF1, 0x4F, 0xF0, + 0xFF, 0xE6, 0x63, 0xE0, 0xDF, 0xE3, 0x38, 0xD2, 0x23, 0xEE, 0xAE, 0xCD, + 0xBB, 0xF5, 0x3B, 0xDE, 0x6B, 0xEE, 0x4F, 0xF4, 0x2D, 0xE6, 0x18, 0x04, + 0xBF, 0xE4, 0x8E, 0x07, 0x5F, 0xE3, 0xE7, 0x02, 0x29, 0xE0, 0x62, 0x05, + 0xFC, 0xDE, 0x7F, 0x08, 0xDC, 0xF0, 0xD0, 0x06, 0x08, 0x06, 0x3D, 0x06, + 0xE8, 0x09, 0xE7, 0x03, 0xA6, 0xFC, 0x3E, 0xFF, 0x0D, 0xF2, 0x10, 0xFE, + 0xAA, 0xF6, 0xB9, 0xF7, 0xAF, 0xFC, 0x52, 0xF1, 0x37, 0xFA, 0x45, 0xEC, + 0x2F, 0xFB, 0xD5, 0xF5, 0xCD, 0xFB, 0xEB, 0x02, 0x14, 0xF3, 0xB9, 0xFF, + 0x00, 0xF0, 0xF1, 0xF8, 0x50, 0xFA, 0x67, 0xF2, 0xED, 0x0D, 0xED, 0xF3, + 0x99, 0x1C, 0x85, 0xFB, 0x47, 0x19, 0xC8, 0xFF, 0x7B, 0x0D, 0x30, 0xFE, + 0x33, 0xFF, 0x78, 0x02, 0x77, 0xEA, 0x69, 0x01, 0xD9, 0xDC, 0xF7, 0xF6, + 0xAB, 0xE0, 0x18, 0xF5, 0xCE, 0x00, 0x5A, 0xF6, 0x48, 0x13, 0xEB, 0xFC, + 0xAB, 0x09, 0x56, 0x09, 0xE2, 0x05, 0x47, 0x0A, 0x8B, 0x02, 0xAC, 0xFD, + 0x0E, 0xF7, 0x82, 0xEE, 0xA3, 0xEF, 0xEC, 0xE9, 0xC6, 0xF5, 0x7D, 0xED, + 0xA0, 0xF0, 0xA5, 0xEB, 0x61, 0xEB, 0x67, 0xEA, 0x62, 0xF8, 0x52, 0xE9, + 0x82, 0xEF, 0x65, 0xE6, 0x7B, 0xD6, 0x15, 0xE4, 0x4F, 0xCD, 0xE4, 0xE2, + 0x62, 0xC7, 0xB4, 0xE3, 0xC6, 0xD0, 0x1F, 0xE7, 0xAF, 0xEC, 0xCB, 0xEC, + 0xDF, 0xFA, 0x96, 0xED, 0xEF, 0xF8, 0x9C, 0xEB, 0x9E, 0x01, 0x59, 0xF0, + 0x4E, 0x07, 0x09, 0xF7, 0xF1, 0x00, 0x14, 0xFA, 0xDF, 0xFA, 0x66, 0xFD, + 0x53, 0x03, 0x22, 0x03, 0x96, 0x16, 0xCE, 0x09, 0x8D, 0x26, 0x37, 0x0E, + 0x9E, 0x30, 0xF2, 0x14, 0x1F, 0x23, 0x52, 0x18, 0xCF, 0x0D, 0xA2, 0x13, + 0xF5, 0x03, 0xE9, 0x0F, 0x0A, 0x02, 0x6E, 0x0D, 0x99, 0xF7, 0x30, 0x06, + 0xD9, 0xE7, 0x0B, 0xFC, 0x02, 0xEF, 0xAD, 0xFD, 0x23, 0xFA, 0x4C, 0x02, + 0xDF, 0xF4, 0x18, 0x09, 0xDF, 0xF7, 0xFC, 0x17, 0x01, 0x0E, 0x53, 0x21, + 0xFC, 0x22, 0x27, 0x30, 0xB8, 0x26, 0x1C, 0x3A, 0x49, 0x29, 0xD6, 0x39, + 0xE5, 0x2D, 0xDF, 0x2E, 0xCC, 0x29, 0x63, 0x18, 0xAA, 0x22, 0x9D, 0x0E, + 0x6A, 0x29, 0xEF, 0x14, 0xEE, 0x3D, 0x2D, 0x23, 0xC4, 0x3B, 0x0A, 0x23, + 0x22, 0x33, 0x9A, 0x26, 0x3C, 0x2D, 0xD4, 0x2C, 0xAA, 0x1D, 0x88, 0x21, + 0x93, 0x17, 0x72, 0x14, 0x92, 0x1A, 0x9A, 0x0A, 0xA8, 0x17, 0xFD, 0x08, + 0x89, 0x1C, 0x36, 0x0F, 0xA4, 0x30, 0x17, 0x1E, 0x4A, 0x41, 0x5F, 0x2B, + 0x37, 0x41, 0x66, 0x31, 0x6A, 0x39, 0x3E, 0x3E, 0x33, 0x37, 0xA9, 0x4B, + 0xE1, 0x31, 0xA9, 0x4C, 0x2C, 0x2C, 0xFD, 0x46, 0x81, 0x2B, 0x81, 0x39, + 0x8D, 0x2E, 0xE0, 0x30, 0x87, 0x31, 0x9D, 0x2F, 0x05, 0x29, 0xB4, 0x2B, + 0xD6, 0x1D, 0x85, 0x2E, 0x9F, 0x1E, 0x78, 0x37, 0x1A, 0x1A, 0x0C, 0x35, + 0x18, 0x14, 0x8C, 0x29, 0x49, 0x1D, 0x68, 0x15, 0x5C, 0x2E, 0xCF, 0x01, + 0x42, 0x37, 0x21, 0x01, 0x9B, 0x33, 0xAD, 0x0E, 0x0F, 0x25, 0x5D, 0x21, + 0x03, 0x1D, 0x2F, 0x23, 0xDB, 0x1E, 0xAB, 0x13, 0x45, 0x11, 0x34, 0x00, + 0xED, 0x00, 0xE2, 0xF2, 0xE7, 0xF0, 0x32, 0xEF, 0x21, 0xEB, 0xF4, 0xE9, + 0x47, 0xEF, 0x2D, 0xE1, 0xF4, 0xE3, 0x7C, 0xDB, 0xB1, 0xDA, 0x33, 0xE2, + 0x7B, 0xDC, 0x84, 0xE6, 0x6F, 0xDD, 0xF1, 0xED, 0x52, 0xE5, 0x9F, 0x01, + 0x04, 0xE7, 0x55, 0x07, 0x76, 0xDE, 0x26, 0xFF, 0xEB, 0xD4, 0xC8, 0xF0, + 0x5C, 0xCD, 0xB2, 0xE0, 0x38, 0xC2, 0xED, 0xD7, 0xF6, 0xBC, 0x61, 0xDB, + 0xC0, 0xC5, 0xDD, 0xDF, 0x99, 0xC1, 0x09, 0xE2, 0xB8, 0xBB, 0x0B, 0xE2, + 0x87, 0xC8, 0x37, 0xD7, 0x8B, 0xD3, 0xD9, 0xCC, 0x6F, 0xD6, 0xD0, 0xCB, + 0x2A, 0xDE, 0x7D, 0xCB, 0x40, 0xF7, 0xF6, 0xD2, 0x86, 0x13, 0x6A, 0xE5, + 0x54, 0x12, 0x31, 0xEC, 0x79, 0x04, 0x1D, 0xE1, 0x69, 0xFA, 0x53, 0xD0, + 0xFA, 0xE8, 0x1C, 0xC0, 0x49, 0xD3, 0x21, 0xB1, 0xF5, 0xC0, 0x70, 0xAB, + 0xCB, 0xB1, 0x9B, 0xAC, 0xDA, 0xB8, 0x21, 0xAA, 0xCF, 0xD1, 0x71, 0xAB, + 0x49, 0xE4, 0x45, 0xC0, 0x81, 0xF4, 0xB2, 0xE1, 0xF0, 0xF9, 0x8A, 0xFD, + 0x14, 0xF3, 0x35, 0x16, 0x54, 0xF2, 0xE7, 0x29, 0xFD, 0xF7, 0x08, 0x2E, + 0xAA, 0xFF, 0xEA, 0x2A, 0x32, 0x01, 0x17, 0x22, 0x34, 0xF4, 0x56, 0x10, + 0xA0, 0xE9, 0x99, 0x09, 0x22, 0xE1, 0x1B, 0x03, 0x9D, 0xD0, 0x9E, 0xF5, + 0x55, 0xC9, 0x30, 0xEE, 0xFD, 0xCD, 0x60, 0xDF, 0x60, 0xDE, 0x1E, 0xD9, + 0x48, 0xF3, 0x43, 0xE5, 0xFB, 0xEE, 0xAA, 0xEC, 0x23, 0xE8, 0x6A, 0xF5, + 0x1A, 0xF4, 0xDD, 0xF9, 0xFA, 0x03, 0xF9, 0xF7, 0xAE, 0x0E, 0xB0, 0xFC, + 0xE7, 0x19, 0xA0, 0x09, 0x72, 0x1E, 0x0C, 0x10, 0xD3, 0x16, 0x71, 0x0A, + 0xB5, 0x1A, 0xE2, 0x0A, 0x1B, 0x22, 0x68, 0x0D, 0xA3, 0x25, 0xED, 0x0B, + 0x83, 0x1D, 0x39, 0x0D, 0x14, 0x12, 0xFA, 0x12, 0x6E, 0x1C, 0x33, 0x15, + 0xF1, 0x26, 0x57, 0x14, 0x49, 0x21, 0x51, 0x1B, 0xA1, 0x07, 0xE9, 0x1E, + 0xEB, 0xF6, 0x16, 0x1A, 0x88, 0x00, 0x72, 0x11, 0x4C, 0x0E, 0xA1, 0x0B, + 0x49, 0x1A, 0x89, 0x10, 0x37, 0x1D, 0x0E, 0x18, 0xAA, 0x17, 0x3D, 0x24, + 0xEC, 0x0F, 0x6A, 0x23, 0xBB, 0x10, 0xA7, 0x14, 0x47, 0x15, 0xD7, 0x0E, + 0xB0, 0x0D, 0x9E, 0x0E, 0xD6, 0x0D, 0xE8, 0x0B, 0xFF, 0x19, 0x00, 0x07, + 0x4A, 0x17, 0x5D, 0x06, 0x44, 0x0A, 0xD6, 0x08, 0xA7, 0x0C, 0x7C, 0x08, + 0x25, 0x10, 0x48, 0x01, 0xD1, 0x0B, 0xF0, 0xF6, 0x43, 0x11, 0x54, 0xF8, + 0x67, 0x14, 0x16, 0x05, 0x7E, 0x0F, 0xA6, 0x10, 0xEE, 0x12, 0x86, 0x17, + 0xF5, 0x22, 0x68, 0x1C, 0x0F, 0x24, 0x11, 0x20, 0x5B, 0x0F, 0x90, 0x25, + 0xB0, 0x02, 0xBA, 0x34, 0x2C, 0x02, 0x59, 0x3B, 0x1E, 0x0B, 0x7B, 0x2F, + 0x0F, 0x0F, 0x5E, 0x20, 0xDE, 0x0C, 0x51, 0x1B, 0xEE, 0x0B, 0x4E, 0x19, + 0x61, 0x07, 0xC5, 0x12, 0x57, 0x10, 0xA2, 0x18, 0x4F, 0x27, 0xCD, 0x26, + 0xFA, 0x35, 0xA0, 0x2B, 0xFC, 0x39, 0xFA, 0x2F, 0x57, 0x3A, 0xF7, 0x31, + 0x18, 0x2F, 0xE7, 0x1E, 0x4D, 0x16, 0xB0, 0x05, 0x1B, 0x05, 0xFD, 0xFF, + 0xA9, 0xFC, 0x66, 0xFE, 0x84, 0xF5, 0xC1, 0xF1, 0xC0, 0xFD, 0x30, 0xEB, + 0x50, 0xFE, 0xF5, 0xEF, 0x72, 0xF2, 0x78, 0xF9, 0x47, 0xFD, 0x28, 0x00, + 0x7A, 0x1D, 0x47, 0x0C, 0x02, 0x34, 0x7E, 0x1A, 0xD7, 0x3B, 0xA6, 0x1E, + 0xEF, 0x41, 0x8D, 0x2C, 0xEA, 0x37, 0xDE, 0x3C, 0x47, 0x2E, 0xFD, 0x40, + 0x03, 0x2E, 0x92, 0x3D, 0x84, 0x22, 0x6B, 0x36, 0x0F, 0x0C, 0x21, 0x28, + 0x68, 0xF7, 0xF7, 0x05, 0x3D, 0xEE, 0x3F, 0xE0, 0x6C, 0xE4, 0xFB, 0xD1, + 0x4E, 0xDC, 0xBE, 0xD5, 0x95, 0xDE, 0x05, 0xE2, 0xA6, 0xE1, 0x54, 0xEC, + 0x60, 0xEA, 0xD2, 0xEF, 0xA1, 0xF5, 0xE6, 0xFA, 0xA6, 0xFF, 0x09, 0x0C, + 0x07, 0x12, 0x0F, 0x19, 0x6F, 0x24, 0xEF, 0x24, 0x24, 0x29, 0x3F, 0x2F, + 0x4D, 0x25, 0x4A, 0x36, 0xE1, 0x19, 0xAC, 0x33, 0x9A, 0x06, 0xA6, 0x22, + 0xDD, 0x00, 0x34, 0x10, 0x78, 0x06, 0xE7, 0x04, 0x91, 0x08, 0x29, 0xFD, + 0xB4, 0x0C, 0x6A, 0xF7, 0xD0, 0x0C, 0x77, 0xF6, 0xC4, 0x00, 0xA3, 0xF8, + 0x72, 0x04, 0xB3, 0x01, 0x88, 0x13, 0xC0, 0x0B, 0xBB, 0x0C, 0x5D, 0x12, + 0xFC, 0x03, 0xB3, 0x19, 0x1D, 0xFE, 0x28, 0x1A, 0x5C, 0xF9, 0x65, 0x19, + 0x5A, 0x03, 0xDE, 0x11, 0x7D, 0x08, 0x4A, 0xFD, 0x74, 0xFC, 0x44, 0xEA, + 0xA6, 0xEC, 0x21, 0xDD, 0x18, 0xE5, 0xC5, 0xD4, 0x95, 0xE0, 0x51, 0xD1, + 0x1A, 0xDD, 0xEF, 0xCF, 0x4D, 0xE2, 0xDE, 0xCD, 0xBC, 0xE5, 0xD9, 0xC7, + 0xEE, 0xDC, 0x97, 0xBB, 0xA0, 0xD6, 0x3A, 0xBB, 0xF8, 0xD6, 0x17, 0xC5, + 0xA0, 0xCA, 0x18, 0xC5, 0xA9, 0xBE, 0x5E, 0xC9, 0xE7, 0xCD, 0x55, 0xD3, + 0x54, 0xD8, 0xA2, 0xD1, 0xF1, 0xD3, 0xFD, 0xD3, 0x82, 0xD7, 0x0C, 0xD7, + 0x24, 0xDC, 0x38, 0xC8, 0x4E, 0xE1, 0xF8, 0xBB, 0x55, 0xDC, 0xBE, 0xC0, + 0x6A, 0xCB, 0xDA, 0xD2, 0x69, 0xC7, 0x3C, 0xE5, 0x95, 0xC7, 0xCB, 0xEE, + 0x79, 0xCE, 0xD9, 0xF3, 0xA6, 0xDB, 0x6B, 0xF3, 0x2E, 0xDA, 0x7E, 0xF3, + 0x5C, 0xD0, 0xA0, 0xF7, 0x53, 0xD8, 0x57, 0xFA, 0x93, 0xF0, 0x6C, 0xF7, + 0x83, 0xFD, 0xA8, 0xF4, 0xE9, 0xFA, 0x11, 0xF0, 0xB4, 0xE5, 0xCD, 0xD7, + 0x41, 0xCC, 0x66, 0xBE, 0x43, 0xBF, 0xE8, 0xB2, 0x91, 0xBD, 0xC1, 0xAD, + 0xEC, 0xC8, 0x37, 0xB4, 0xEE, 0xD9, 0x63, 0xBE, 0x0B, 0xEB, 0xD3, 0xC6, + 0x7A, 0xF9, 0x8B, 0xCF, 0x96, 0x02, 0x7B, 0xD7, 0xF9, 0x05, 0x62, 0xEB, + 0x72, 0x07, 0xAA, 0x0A, 0xD9, 0x12, 0x9D, 0x1F, 0x04, 0x21, 0x36, 0x22, + 0x2A, 0x2A, 0xA7, 0x23, 0x72, 0x29, 0xEB, 0x23, 0x59, 0x19, 0xA3, 0x18, + 0x34, 0x08, 0xF1, 0x08, 0xE4, 0xFC, 0xC7, 0xF5, 0x17, 0xF1, 0x25, 0xEB, + 0x09, 0xE2, 0xED, 0xF4, 0xF5, 0xD1, 0x57, 0xFF, 0x96, 0xCA, 0xC9, 0xF8, + 0xDB, 0xD4, 0x38, 0xEB, 0x1C, 0xE2, 0x54, 0xE8, 0x61, 0xED, 0xC7, 0xF2, + 0xC8, 0xF5, 0xC3, 0xFE, 0x72, 0xFD, 0x9E, 0x0A, 0xA8, 0x15, 0x6D, 0x13, + 0xDF, 0x2E, 0x01, 0x1C, 0x9D, 0x39, 0xA1, 0x22, 0x6A, 0x3C, 0x2C, 0x21, + 0xA8, 0x2D, 0xF9, 0x1E, 0xE0, 0x19, 0xAC, 0x1E, 0xCC, 0x19, 0xBF, 0x1E, + 0xE2, 0x0E, 0x91, 0x15, 0x3C, 0x04, 0x9C, 0x05, 0x09, 0x09, 0xF8, 0xF4, + 0x15, 0xFD, 0x07, 0xEE, 0xED, 0xF1, 0xCC, 0xF8, 0x21, 0xF8, 0xE9, 0x06, + 0x3F, 0x05, 0x6A, 0x0E, 0x13, 0x17, 0xEF, 0x0F, 0x87, 0x27, 0xDA, 0x19, + 0xA9, 0x28, 0x8B, 0x27, 0x9B, 0x17, 0xDE, 0x25, 0x99, 0x0D, 0x88, 0x21, + 0xFF, 0x0C, 0x3C, 0x22, 0xC7, 0x09, 0x41, 0x1F, 0x85, 0x00, 0xCE, 0x19, + 0xEB, 0xEA, 0xA2, 0x12, 0x89, 0xD2, 0x6D, 0x05, 0x46, 0xC5, 0x04, 0xF5, + 0xF1, 0xD3, 0x13, 0xEF, 0x30, 0xE6, 0x36, 0xEA, 0x64, 0xE8, 0x58, 0xDA, + 0xD0, 0xE8, 0xA4, 0xD1, 0x4A, 0xF0, 0xB0, 0xDE, 0x32, 0xFC, 0xE7, 0xED, + 0x5D, 0x06, 0x1D, 0xEF, 0x87, 0x13, 0x5E, 0xF0, 0x06, 0x1D, 0xB6, 0xF6, + 0x0F, 0x1B, 0xD0, 0x00, 0xF4, 0x06, 0x95, 0x08, 0xC1, 0xE8, 0x12, 0x01, + 0xF1, 0xDC, 0xF2, 0xF8, 0xE2, 0xE3, 0xBE, 0xF7, 0x09, 0xF6, 0x83, 0xF7, + 0xB5, 0x0C, 0xD9, 0xF5, 0x9C, 0x15, 0x7C, 0xF1, 0x24, 0x10, 0x4F, 0xF2, + 0x2B, 0x11, 0xC2, 0xF8, 0xB1, 0x1A, 0xB5, 0x08, 0x6F, 0x20, 0x90, 0x1E, + 0x4B, 0x24, 0x66, 0x2B, 0x80, 0x29, 0x6C, 0x34, 0x58, 0x27, 0x15, 0x32, + 0x75, 0x19, 0x4B, 0x21, 0x0A, 0x09, 0x15, 0x0C, 0x1B, 0xF4, 0x5D, 0xEC, + 0xE2, 0xD3, 0xEB, 0xD1, 0x56, 0xBB, 0x52, 0xCF, 0x7B, 0xC0, 0x52, 0xD1, + 0x8E, 0xDB, 0x3E, 0xD3, 0x08, 0xFC, 0x62, 0xE9, 0x38, 0x16, 0x75, 0x06, + 0xC1, 0x28, 0x09, 0x1E, 0x4D, 0x41, 0xF7, 0x33, 0x89, 0x5A, 0xD0, 0x43, + 0x08, 0x63, 0x7B, 0x48, 0xDA, 0x5D, 0x23, 0x4B, 0xFB, 0x4D, 0x9C, 0x50, + 0x10, 0x3C, 0xB7, 0x45, 0x50, 0x27, 0xC5, 0x2B, 0x0D, 0x0D, 0x2E, 0x10, + 0xB4, 0xFB, 0x77, 0xFC, 0x22, 0xF0, 0xC1, 0xF2, 0xFE, 0xE3, 0x67, 0xE7, + 0x7D, 0xDE, 0xF4, 0xDD, 0x11, 0xE2, 0x88, 0xE0, 0x2F, 0xE3, 0xA3, 0xE9, + 0x07, 0xE8, 0x41, 0xFE, 0xD5, 0xFB, 0x54, 0x21, 0xED, 0x1A, 0x72, 0x3C, + 0x0E, 0x31, 0x40, 0x4B, 0x23, 0x2F, 0x0C, 0x59, 0x66, 0x39, 0x25, 0x64, + 0x9E, 0x4F, 0x77, 0x60, 0xD8, 0x51, 0xA2, 0x4F, 0x3E, 0x3E, 0x64, 0x3E, + 0x75, 0x1A, 0x45, 0x34, 0x14, 0xFE, 0xAE, 0x25, 0x8F, 0x06, 0xA4, 0x0E, + 0x3D, 0x1A, 0x33, 0xFD, 0x70, 0x1A, 0x0F, 0xF6, 0xEF, 0x18, 0x5C, 0xF6, + 0xE2, 0x18, 0x52, 0xFA, 0xB4, 0x13, 0x40, 0x00, 0x5D, 0x0B, 0x83, 0x0B, + 0x42, 0x0D, 0x9D, 0x16, 0xD0, 0x16, 0x26, 0x19, 0xFB, 0x1A, 0x1D, 0x1D, + 0xE6, 0x19, 0xE4, 0x18, 0x45, 0x18, 0x63, 0x0D, 0xF5, 0x15, 0x75, 0x02, + 0xCC, 0x0E, 0x45, 0xF5, 0x4F, 0x06, 0x2D, 0xEB, 0xB6, 0x08, 0x4D, 0xE0, + 0x58, 0x11, 0xEA, 0xD8, 0xD8, 0x07, 0x73, 0xDE, 0xA7, 0xF1, 0x31, 0xEF, + 0x5B, 0xE4, 0x2C, 0xFA, 0xCC, 0xE6, 0x2E, 0xFF, 0x8C, 0xEB, 0x65, 0x03, + 0x7F, 0xE6, 0x38, 0x05, 0x1A, 0xE8, 0x08, 0x10, 0x82, 0xF0, 0x22, 0x18, + 0x47, 0xF0, 0x56, 0x0C, 0xD6, 0xE6, 0x32, 0xFB, 0xD9, 0xDA, 0xAA, 0xF8, + 0x52, 0xCF, 0x43, 0xF3, 0xF3, 0xC6, 0xF6, 0xE6, 0xFB, 0xC9, 0x44, 0xE5, + 0xBB, 0xD9, 0x34, 0xEA, 0x71, 0xE8, 0xDB, 0xEC, 0x6B, 0xE7, 0x49, 0xE6, + 0xD2, 0xE4, 0x69, 0xE6, 0xF3, 0xE3, 0xEA, 0xF0, 0x46, 0xE5, 0x22, 0xFA, + 0xFD, 0xF8, 0x4E, 0x00, 0xE7, 0x0C, 0x14, 0x06, 0x8F, 0x0D, 0x7F, 0x01, + 0x8C, 0x10, 0xD6, 0xEC, 0xC2, 0x09, 0xF3, 0xDB, 0x40, 0xE9, 0x3D, 0xD0, + 0x1B, 0xCF, 0x01, 0xC0, 0x6D, 0xC4, 0x99, 0xAF, 0xE2, 0xBC, 0x28, 0xA6, + 0x6F, 0xB3, 0xDE, 0xA0, 0x60, 0xAD, 0xE3, 0x9E, 0x5A, 0xB6, 0x7D, 0xAA, + 0xCD, 0xC7, 0xBE, 0xC0, 0x34, 0xDE, 0x4F, 0xD7, 0x3E, 0xFD, 0x1D, 0xF0, + 0x8D, 0x10, 0xB4, 0x04, 0x9E, 0x14, 0x5B, 0x11, 0xBF, 0x11, 0x1A, 0x18, + 0xD1, 0x09, 0x05, 0x11, 0xB0, 0x03, 0x83, 0x01, 0xB4, 0xFA, 0x45, 0xF3, + 0xD0, 0xEC, 0x48, 0xE2, 0xDD, 0xD9, 0x66, 0xD5, 0x28, 0xC9, 0xA1, 0xD2, + 0xAC, 0xBE, 0x10, 0xCB, 0x2B, 0xBA, 0x04, 0xC0, 0x10, 0xB7, 0x30, 0xB7, + 0x1D, 0xAD, 0xB1, 0xB9, 0x54, 0xB3, 0x3A, 0xC9, 0x63, 0xD1, 0x03, 0xD7, + 0x89, 0xE4, 0x09, 0xDF, 0xE4, 0xED, 0x4B, 0xEB, 0x9A, 0x06, 0xE9, 0x01, + 0x8A, 0x21, 0x64, 0x18, 0x51, 0x30, 0xA5, 0x2D, 0x13, 0x2F, 0xF8, 0x42, + 0xA5, 0x22, 0xC4, 0x4C, 0xC5, 0x1B, 0x2B, 0x3E, 0x1C, 0x16, 0x9E, 0x27, + 0x6E, 0x03, 0x36, 0x14, 0x04, 0xEF, 0xA8, 0xFF, 0xF4, 0xDD, 0x92, 0xF4, + 0x85, 0xD6, 0x61, 0xF6, 0xB8, 0xDB, 0x36, 0xF1, 0x25, 0xDC, 0xB8, 0xE3, + 0x90, 0xDB, 0xD9, 0xE7, 0xE6, 0xDF, 0x8D, 0xEF, 0xF0, 0xEA, 0x39, 0xF2, + 0xFF, 0x03, 0x75, 0xF9, 0x4F, 0x1C, 0x27, 0xFF, 0x9A, 0x20, 0x95, 0x04, + 0xEE, 0x19, 0x45, 0x08, 0x27, 0x10, 0x61, 0x0B, 0x08, 0x0D, 0x53, 0x12, + 0x33, 0x10, 0x04, 0x15, 0x36, 0x03, 0xFB, 0x0B, 0xD2, 0xF4, 0x09, 0xF7, + 0xB8, 0xF6, 0xED, 0xE2, 0x43, 0xF2, 0x3B, 0xD9, 0x64, 0xE8, 0x82, 0xD3, + 0x3F, 0xE9, 0x6F, 0xDB, 0xF7, 0xED, 0xBA, 0xEF, 0xC5, 0xFF, 0xCD, 0x00, + 0x22, 0x16, 0x1F, 0x0E, 0x01, 0x1A, 0x07, 0x18, 0x82, 0x13, 0xCF, 0x1A, + 0x2A, 0x12, 0xC2, 0x13, 0x79, 0x13, 0x65, 0x08, 0xB8, 0x0C, 0xA3, 0x07, + 0xB6, 0x01, 0xDB, 0x08, 0x5D, 0xFD, 0x8F, 0x06, 0x43, 0x02, 0x9C, 0x0A, + 0x4F, 0xFE, 0x4B, 0x0B, 0x63, 0xFC, 0x51, 0x0D, 0xC3, 0x10, 0xFE, 0x17, + 0x4B, 0x1D, 0xAB, 0x25, 0x4B, 0x1C, 0x3A, 0x33, 0x8D, 0x28, 0xB8, 0x3B, + 0x12, 0x41, 0x18, 0x46, 0xE8, 0x50, 0xE6, 0x4B, 0x66, 0x51, 0x06, 0x43, + 0x3F, 0x47, 0xE9, 0x36, 0xE3, 0x2B, 0x3A, 0x29, 0x81, 0x08, 0x1D, 0x12, + 0xAD, 0xF7, 0x53, 0xF5, 0x69, 0xF2, 0xAF, 0xD9, 0xA7, 0xF2, 0xDF, 0xCB, + 0x31, 0x01, 0xAA, 0xD8, 0x89, 0x13, 0xF6, 0xFA, 0x87, 0x21, 0xE2, 0x1E, + 0x7C, 0x2F, 0x4E, 0x33, 0x43, 0x45, 0x8B, 0x42, 0x69, 0x56, 0x21, 0x54, + 0xF1, 0x5D, 0x40, 0x5F, 0xCA, 0x63, 0xBC, 0x5F, 0x62, 0x5F, 0x09, 0x58, + 0x83, 0x51, 0x58, 0x4C, 0x44, 0x3A, 0xDC, 0x3B, 0xE5, 0x1E, 0x4C, 0x25, + 0x5B, 0x0E, 0x63, 0x0E, 0x2E, 0xFF, 0x99, 0xFA, 0x27, 0xEB, 0xEA, 0xE7, + 0x7D, 0xDF, 0x89, 0xD8, 0xF4, 0xDB, 0x89, 0xCC, 0x1B, 0xD7, 0x25, 0xC2, + 0x61, 0xD2, 0x7C, 0xCA, 0xCC, 0xDE, 0xA7, 0xF1, 0x6F, 0x03, 0x7C, 0x1D, + 0x13, 0x2C, 0xC8, 0x36, 0x36, 0x47, 0x39, 0x42, 0x5D, 0x4E, 0xA1, 0x3F, + 0xBA, 0x3F, 0x6F, 0x38, 0x8F, 0x2A, 0xC1, 0x3C, 0xDB, 0x23, 0x4B, 0x43, + 0x5A, 0x28, 0x4C, 0x3C, 0xE6, 0x29, 0x6E, 0x28, 0x84, 0x1E, 0x55, 0x1B, + 0x57, 0x03, 0xAA, 0x0F, 0x8C, 0xE7, 0x23, 0xF7, 0x05, 0xD4, 0x43, 0xE7, + 0xD8, 0xCA, 0x63, 0xE5, 0xE1, 0xC8, 0x97, 0xE6, 0x22, 0xCA, 0x89, 0xE9, + 0x20, 0xD9, 0x01, 0xEE, 0x93, 0xEA, 0x04, 0xF5, 0x9A, 0xF2, 0xC4, 0xF7, + 0x2E, 0xFF, 0xA5, 0xFC, 0xDD, 0x0C, 0xC6, 0x04, 0xEF, 0x10, 0x6C, 0xFF, + 0x46, 0x0C, 0x24, 0xF1, 0x95, 0xFB, 0x49, 0xE7, 0x23, 0xEA, 0x53, 0xD8, + 0x00, 0xE8, 0x7E, 0xC1, 0x49, 0xE9, 0xBB, 0xB6, 0xA5, 0xDF, 0x4F, 0xBC, + 0x96, 0xD5, 0x03, 0xC9, 0x16, 0xC9, 0x4C, 0xCE, 0xDF, 0xC3, 0x2E, 0xCC, + 0x9A, 0xD6, 0xB8, 0xCB, 0x88, 0xF0, 0x3B, 0xD0, 0x4C, 0x03, 0x5D, 0xDB, + 0xAC, 0x0A, 0x5A, 0xE9, 0x1B, 0x05, 0x5F, 0xF9, 0x32, 0xF4, 0xBB, 0x01, + 0xA5, 0xE4, 0x1A, 0x05, 0x03, 0xDC, 0x58, 0x07, 0x5E, 0xD1, 0xEB, 0xFE, + 0xC3, 0xD0, 0x64, 0xF1, 0x51, 0xD9, 0xBD, 0xEA, 0x44, 0xDC, 0x48, 0xE5, + 0x2E, 0xDD, 0x14, 0xDB, 0x9B, 0xE3, 0x7E, 0xDD, 0x15, 0xF0, 0xA0, 0xED, + 0x46, 0xFD, 0x03, 0xF9, 0x94, 0x0C, 0x5F, 0x00, 0x97, 0x16, 0xDC, 0x08, + 0x40, 0x13, 0x34, 0x03, 0xE9, 0x04, 0x84, 0xF2, 0x76, 0xF3, 0xC6, 0xE4, + 0x23, 0xE3, 0x49, 0xD8, 0xA2, 0xD0, 0x9E, 0xCA, 0xD5, 0xC5, 0xCD, 0xBC, + 0xC8, 0xC7, 0xF3, 0xAE, 0x76, 0xCD, 0xD1, 0xA9, 0xE2, 0xCB, 0xFC, 0xB1, + 0xE2, 0xCB, 0x78, 0xC1, 0x01, 0xE0, 0x1E, 0xDA, 0xC0, 0x00, 0x62, 0xFA, + 0xD6, 0x20, 0x5A, 0x16, 0x40, 0x3C, 0x66, 0x2D, 0x85, 0x4A, 0xEE, 0x48, + 0x34, 0x49, 0x9E, 0x5B, 0x82, 0x3E, 0xFE, 0x5D, 0xF0, 0x27, 0x21, 0x5A, + 0x23, 0x07, 0xD7, 0x43, 0x53, 0xE5, 0x57, 0x19, 0xE9, 0xD1, 0x8B, 0xF3, + 0x6E, 0xCA, 0x15, 0xDC, 0x04, 0xC5, 0x30, 0xCA, 0xD6, 0xC7, 0x6A, 0xBF, + 0xE9, 0xC8, 0xA8, 0xC4, 0xCA, 0xC6, 0xA5, 0xCF, 0x5E, 0xC9, 0x02, 0xD6, + 0x93, 0xD1, 0xB0, 0xDF, 0xD6, 0xE8, 0x7C, 0xF1, 0x2F, 0x08, 0x15, 0x05, + 0x63, 0x22, 0xE7, 0x17, 0xD6, 0x35, 0x78, 0x2A, 0x21, 0x37, 0xE4, 0x3A, + 0x1A, 0x2E, 0x43, 0x43, 0x05, 0x34, 0x04, 0x3D, 0x18, 0x41, 0x97, 0x30, + 0xC7, 0x47, 0x76, 0x21, 0x15, 0x4A, 0x04, 0x09, 0x82, 0x3A, 0xA4, 0xF4, + 0x37, 0x13, 0x98, 0xE9, 0x8C, 0xEF, 0xA1, 0xE0, 0xAE, 0xDE, 0x2B, 0xE4, + 0xFE, 0xDB, 0xD9, 0xF4, 0x14, 0xE4, 0xDE, 0x00, 0x9D, 0xEA, 0x76, 0x02, + 0x2D, 0xF0, 0xA3, 0xFD, 0x41, 0xF6, 0xFB, 0xF6, 0xBC, 0xF9, 0xF2, 0xEF, + 0x45, 0x01, 0x5A, 0xF1, 0x1A, 0x0D, 0x82, 0x02, 0xCA, 0x14, 0xB1, 0x10, + 0xE0, 0x1B, 0xDB, 0x11, 0x4F, 0x1C, 0xBB, 0x0E, 0xD4, 0x0E, 0x71, 0x03, + 0xD2, 0xF9, 0x4C, 0xF2, 0xB2, 0xE8, 0x4C, 0xE7, 0x2E, 0xEB, 0x60, 0xDF, + 0xE5, 0xF1, 0x64, 0xD7, 0x5B, 0xEE, 0x4D, 0xD5, 0xE4, 0xEB, 0x4D, 0xDC, + 0x27, 0xF4, 0xC5, 0xDF, 0xB6, 0xFF, 0xFC, 0xDE, 0xAA, 0x0C, 0xF8, 0xE9, + 0x50, 0x11, 0x74, 0x00, 0x2B, 0x07, 0xB4, 0x13, 0xAE, 0x07, 0x01, 0x18, + 0x26, 0x0D, 0x01, 0x10, 0x6C, 0x01, 0xB1, 0x04, 0xD3, 0xF6, 0x42, 0x03, + 0x6E, 0xF6, 0x4D, 0x10, 0x64, 0xF3, 0x95, 0x1A, 0xF2, 0xEC, 0xFD, 0x13, + 0xA9, 0xE6, 0xC9, 0x0F, 0x18, 0xE7, 0x54, 0x15, 0x93, 0xF0, 0x71, 0x0D, + 0x2B, 0x01, 0xB3, 0x07, 0x3E, 0x16, 0xA7, 0x18, 0xC7, 0x2A, 0x30, 0x2C, + 0xB1, 0x31, 0x71, 0x30, 0xD2, 0x1E, 0x8F, 0x25, 0x6C, 0x07, 0xBA, 0x0F, + 0xA3, 0xF2, 0x30, 0xF2, 0xF0, 0xE1, 0x5C, 0xD5, 0x0B, 0xDA, 0x63, 0xBF, + 0x17, 0xD2, 0x0B, 0xB5, 0x98, 0xCF, 0x34, 0xB0, 0x97, 0xD2, 0x80, 0xB4, + 0xF6, 0xE1, 0x6D, 0xCE, 0xA2, 0xFF, 0x4C, 0xF1, 0xB4, 0x20, 0xE0, 0x14, + 0xD4, 0x45, 0x3C, 0x35, 0xF6, 0x60, 0x57, 0x4E, 0xEE, 0x62, 0x08, 0x5B, + 0xD0, 0x54, 0xC8, 0x55, 0x9B, 0x40, 0xDD, 0x4A, 0x09, 0x2A, 0x8F, 0x3C, + 0x1C, 0x17, 0x77, 0x23, 0xC8, 0x04, 0x30, 0x08, 0xEC, 0xEE, 0x2A, 0xF0, + 0xF4, 0xD3, 0xF5, 0xD9, 0xCF, 0xB1, 0xBE, 0xCA, 0x78, 0x9A, 0x65, 0xC6, + 0x9A, 0x9F, 0xD3, 0xC8, 0xB4, 0xBD, 0xF4, 0xD2, 0x55, 0xDF, 0xFA, 0xE6, + 0xB5, 0xFE, 0xA5, 0x00, 0xAF, 0x14, 0xEB, 0x1B, 0x50, 0x19, 0x1B, 0x35, + 0x93, 0x1A, 0x26, 0x44, 0xCF, 0x21, 0x09, 0x49, 0x30, 0x2B, 0x75, 0x4A, + 0xC0, 0x2D, 0xB9, 0x3F, 0x6F, 0x27, 0x64, 0x31, 0x39, 0x16, 0x6E, 0x24, + 0x98, 0x01, 0x31, 0x0C, 0xB4, 0xF4, 0x56, 0xF2, 0x5E, 0xEE, 0x46, 0xE6, + 0xB1, 0xE8, 0x9B, 0xDF, 0x88, 0xE4, 0x16, 0xD6, 0xCB, 0xE1, 0x49, 0xD0, + 0x23, 0xE2, 0x45, 0xCA, 0x46, 0xDF, 0xC3, 0xC3, 0x32, 0xDB, 0xEB, 0xC5, + 0x8D, 0xE4, 0xA7, 0xD3, 0x1B, 0xF0, 0x52, 0xEA, 0xD4, 0xED, 0xC5, 0xF7, + 0x4B, 0xEE, 0xDC, 0xF1, 0x7E, 0xF7, 0x40, 0xE9, 0x10, 0xF6, 0x86, 0xE1, + 0x54, 0xED, 0x83, 0xDA, 0x40, 0xEB, 0x40, 0xDC, 0x95, 0xF1, 0xAF, 0xDA, + 0x98, 0xEB, 0x38, 0xCE, 0x36, 0xDE, 0x6F, 0xC5, 0xCD, 0xD4, 0x5C, 0xC3, + 0x25, 0xCD, 0x81, 0xC1, 0xC4, 0xD5, 0x69, 0xC3, 0x35, 0xE0, 0x23, 0xC5, + 0xC3, 0xE4, 0xA7, 0xC4, 0x08, 0xE1, 0xC5, 0xCA, 0x7D, 0xD7, 0xB7, 0xD6, + 0x1F, 0xD8, 0xA1, 0xDD, 0xD6, 0xD7, 0x10, 0xE2, 0xC2, 0xDE, 0x98, 0xF1, + 0x9E, 0xEF, 0xBF, 0x01, 0xB5, 0xFC, 0x3A, 0x03, 0x24, 0x01, 0xBF, 0xFC, + 0xF3, 0xF7, 0x40, 0xF9, 0x49, 0xEE, 0xE0, 0xF8, 0xAC, 0xEA, 0xC0, 0xFD, + 0x09, 0xF2, 0xEC, 0x0A, 0xCE, 0x05, 0xC5, 0x13, 0x5E, 0x11, 0x50, 0x18, + 0x13, 0x0D, 0x98, 0x22, 0xA9, 0x03, 0x73, 0x2A, 0xBB, 0xFC, 0xE6, 0x25, + 0x38, 0xFC, 0xE6, 0x10, 0x0E, 0xFE, 0x2C, 0xF8, 0xB4, 0xF8, 0x7F, 0xEE, + 0x4B, 0xE6, 0x73, 0xE8, 0x61, 0xD1, 0x0A, 0xDA, 0xA4, 0xC5, 0x6F, 0xD1, + 0x6F, 0xBD, 0x2F, 0xCD, 0x86, 0xC7, 0xEC, 0xC5, 0xCA, 0xE9, 0x17, 0xD3, + 0x09, 0x13, 0xD0, 0xF7, 0x38, 0x33, 0x8E, 0x17, 0xF9, 0x40, 0xF7, 0x32, + 0x20, 0x49, 0x94, 0x4B, 0xDC, 0x50, 0x8C, 0x56, 0x9D, 0x4E, 0x8F, 0x59, + 0xE7, 0x43, 0xC8, 0x58, 0xF0, 0x35, 0xC9, 0x4B, 0xCF, 0x21, 0x10, 0x2B, + 0xF8, 0x08, 0xB7, 0x06, 0x43, 0xF1, 0xA7, 0xED, 0xD4, 0xDA, 0xA7, 0xDD, + 0x85, 0xC6, 0xB3, 0xD1, 0xA5, 0xBB, 0xD0, 0xCD, 0x66, 0xB8, 0x6C, 0xD4, + 0x7F, 0xB9, 0x2C, 0xDA, 0x8F, 0xCC, 0xFF, 0xE0, 0x75, 0xEE, 0x18, 0xEF, + 0xAF, 0x04, 0x6D, 0x02, 0x11, 0x13, 0x0F, 0x16, 0xB8, 0x23, 0x91, 0x29, + 0x30, 0x2C, 0xB1, 0x3B, 0x19, 0x2D, 0xC3, 0x41, 0x3F, 0x30, 0x83, 0x3F, + 0xE7, 0x3A, 0x5C, 0x3C, 0xD8, 0x41, 0x6F, 0x35, 0x81, 0x38, 0xE2, 0x26, + 0x86, 0x25, 0x45, 0x0C, 0x54, 0x10, 0xF9, 0xF1, 0xDC, 0xF4, 0x0B, 0xE9, + 0x9D, 0xD6, 0xB4, 0xE7, 0x48, 0xC8, 0xF1, 0xE8, 0x92, 0xD1, 0x1B, 0xE8, + 0xDB, 0xDF, 0xC0, 0xE4, 0x96, 0xE9, 0xE5, 0xEB, 0xDE, 0xF2, 0xBF, 0xF6, + 0xC7, 0xFF, 0x8A, 0x03, 0x61, 0x10, 0x3D, 0x0F, 0xAC, 0x1E, 0xA2, 0x16, + 0x9B, 0x25, 0x7D, 0x1F, 0xC6, 0x24, 0x36, 0x26, 0x25, 0x22, 0x47, 0x24, + 0xA1, 0x16, 0x87, 0x15, 0xC4, 0x04, 0xB8, 0x04, 0x5D, 0xFB, 0x71, 0xFE, + 0xDF, 0xFD, 0xD4, 0xFF, 0x61, 0x07, 0x3D, 0xF5, 0xA4, 0x0F, 0x29, 0xE4, + 0xD7, 0x0A, 0xCB, 0xE4, 0xD7, 0xF5, 0xAC, 0xEE, 0x34, 0xE9, 0x20, 0xF6, + 0x93, 0xE8, 0x54, 0xF9, 0x6F, 0xEE, 0x6C, 0xF9, 0xC7, 0x00, 0x97, 0xFA, + 0x33, 0x0B, 0x53, 0xFE, 0x9E, 0x0A, 0x61, 0x02, 0xC1, 0x0C, 0x27, 0xFF, + 0x7D, 0x0B, 0xC4, 0xF8, 0x93, 0x07, 0xDB, 0xFE, 0x25, 0x04, 0x35, 0x0C, + 0xCB, 0x02, 0x72, 0x12, 0xF2, 0x0C, 0x00, 0x12, 0xAE, 0x1A, 0xFE, 0x10, + 0x58, 0x1F, 0xF4, 0x19, 0xB9, 0x24, 0x48, 0x2C, 0x09, 0x34, 0xD1, 0x38, + 0x1D, 0x42, 0x1A, 0x40, 0x7E, 0x3E, 0x56, 0x43, 0x1B, 0x28, 0x8F, 0x35, + 0x7F, 0x10, 0x72, 0x1D, 0x12, 0xFF, 0xF0, 0x06, 0x95, 0xEE, 0x1C, 0xF4, + 0x34, 0xDE, 0x50, 0xE4, 0x40, 0xD1, 0xCC, 0xDA, 0x3F, 0xD2, 0xC1, 0xDD, + 0xCA, 0xE0, 0x99, 0xE3, 0xF5, 0xF4, 0x87, 0xED, 0x36, 0x11, 0xB1, 0x06, + 0xAE, 0x32, 0x50, 0x27, 0xF1, 0x4E, 0x4D, 0x44, 0x5E, 0x5F, 0x54, 0x57, + 0x8F, 0x66, 0x85, 0x5D, 0x02, 0x63, 0x80, 0x5D, 0x8C, 0x54, 0x71, 0x56, + 0x45, 0x45, 0x26, 0x41, 0x39, 0x32, 0x54, 0x27, 0x82, 0x1C, 0xB0, 0x15, + 0xB2, 0x06, 0x98, 0x07, 0xB3, 0xEB, 0x20, 0xF6, 0x9F, 0xDA, 0x14, 0xE4, + 0x68, 0xDD, 0xD0, 0xDA, 0x15, 0xE7, 0xB6, 0xDE, 0x50, 0xEF, 0x13, 0xEB, + 0xC2, 0xF3, 0xB5, 0x00, 0x1D, 0xFC, 0x75, 0x1B, 0x8D, 0x09, 0x0B, 0x31, + 0x29, 0x14, 0xEE, 0x3E, 0xA4, 0x1C, 0xBB, 0x44, 0xE2, 0x20, 0x5C, 0x4B, + 0x07, 0x2C, 0x2B, 0x4F, 0x3E, 0x3E, 0xA5, 0x46, 0xDC, 0x4A, 0xF8, 0x3D, + 0x12, 0x4C, 0x53, 0x35, 0x6A, 0x37, 0x4B, 0x28, 0xE4, 0x1D, 0x11, 0x14, + 0x2E, 0x0E, 0x2F, 0xFC, 0xBD, 0xFE, 0xB9, 0xEE, 0x34, 0xF1, 0x70, 0xE1, + 0xA7, 0xE7, 0x59, 0xD2, 0xF4, 0xE0, 0x34, 0xCF, 0x44, 0xD6, 0x25, 0xCF, + 0x87, 0xCE, 0x4A, 0xCE, 0xFC, 0xD4, 0xE6, 0xCE, 0x20, 0xDD, 0x6A, 0xCF, + 0x02, 0xE4, 0x57, 0xD6, 0xC4, 0xED, 0xAD, 0xE4, 0x94, 0xF9, 0xF6, 0xF0, + 0x66, 0x04, 0xD6, 0xF1, 0x54, 0x0B, 0x10, 0xEE, 0x6C, 0x0C, 0x94, 0xEB, + 0x0A, 0x05, 0x63, 0xF0, 0x58, 0xF1, 0x71, 0xFC, 0xB9, 0xD7, 0x87, 0x00, + 0x81, 0xCD, 0xA1, 0xF9, 0x72, 0xD4, 0x60, 0xEC, 0x35, 0xDB, 0xD5, 0xDF, + 0x9C, 0xD5, 0xA1, 0xD4, 0x9C, 0xCA, 0xBD, 0xCC, 0x5A, 0xBE, 0x43, 0xCC, + 0x86, 0xB3, 0xF7, 0xD0, 0x9D, 0xB9, 0x9C, 0xD8, 0xE3, 0xCA, 0xC1, 0xDF, + 0xD9, 0xD8, 0x3E, 0xE0, 0xDE, 0xD8, 0x10, 0xD9, 0xFF, 0xCE, 0x51, 0xDB, + 0xBB, 0xCC, 0xCA, 0xE5, 0xE8, 0xCF, 0x24, 0xE4, 0xAC, 0xD5, 0xCF, 0xD8, + 0x48, 0xDB, 0xFD, 0xD7, 0x1D, 0xE0, 0xE2, 0xE8, 0xD1, 0xE9, 0x69, 0xF9, + 0x30, 0xF7, 0x52, 0xFF, 0x70, 0x07, 0x60, 0xFD, 0xB6, 0x15, 0x20, 0xFC, + 0xC6, 0x1F, 0x57, 0xFC, 0x25, 0x28, 0x31, 0xF4, 0x9B, 0x22, 0xCA, 0xEC, + 0x08, 0x07, 0x39, 0xE5, 0xE3, 0xE6, 0x55, 0xD6, 0xE4, 0xC9, 0xDF, 0xC7, + 0x13, 0xB3, 0x48, 0xBB, 0x28, 0xAD, 0x88, 0xB1, 0x04, 0xB7, 0xD5, 0xB2, + 0x2F, 0xC6, 0x44, 0xC0, 0x5A, 0xD9, 0xC3, 0xD7, 0x6E, 0xF8, 0xE5, 0xF3, + 0x09, 0x1D, 0xF7, 0x0E, 0x3F, 0x39, 0x64, 0x2A, 0x95, 0x45, 0xDD, 0x3D, + 0x36, 0x44, 0xDF, 0x48, 0xD6, 0x3E, 0x59, 0x49, 0xDA, 0x35, 0x46, 0x39, + 0x87, 0x24, 0x60, 0x20, 0xF6, 0x0B, 0x7D, 0x08, 0x6E, 0xF2, 0x03, 0xF5, + 0x12, 0xDE, 0x6D, 0xDE, 0x23, 0xD0, 0x92, 0xCB, 0x86, 0xC9, 0x65, 0xC5, + 0xEB, 0xC3, 0x4D, 0xC9, 0x26, 0xC2, 0xB5, 0xD3, 0x0E, 0xCD, 0x5E, 0xE1, + 0xFA, 0xE0, 0x11, 0xF1, 0xF9, 0xFD, 0x27, 0x01, 0x44, 0x19, 0x0B, 0x13, + 0xD9, 0x28, 0xF7, 0x1F, 0xF1, 0x33, 0xE7, 0x29, 0x28, 0x3D, 0x84, 0x38, + 0xE4, 0x42, 0xB8, 0x40, 0x89, 0x3F, 0x76, 0x40, 0x10, 0x34, 0x00, 0x3F, + 0x11, 0x29, 0xA5, 0x33, 0x11, 0x1D, 0x27, 0x20, 0xCC, 0x0A, 0x20, 0x16, + 0xC7, 0xF3, 0x7A, 0x10, 0x45, 0xE4, 0xDA, 0x06, 0x4D, 0xEA, 0x0D, 0xFD, + 0xFA, 0xF8, 0x45, 0xF6, 0xD1, 0xF6, 0xDD, 0xF1, 0xF0, 0xE6, 0xF0, 0xEB, + 0xF5, 0xDD, 0x71, 0xE6, 0x9E, 0xE5, 0xD8, 0xE6, 0xF6, 0xF3, 0x1D, 0xED, + 0xBC, 0x00, 0x40, 0xF2, 0x68, 0x0D, 0xD1, 0xF5, 0xE1, 0x0C, 0x92, 0xFB, + 0xAD, 0x02, 0xF0, 0x02, 0xCA, 0x04, 0x75, 0x01, 0x87, 0x11, 0x95, 0xFB, + 0x5C, 0x1E, 0x4B, 0xFD, 0xD3, 0x26, 0x59, 0xFD, 0x81, 0x2A, 0xFC, 0xF7, + 0x84, 0x27, 0x45, 0xF4, 0xD5, 0x19, 0x5D, 0xF7, 0x6B, 0x0B, 0x1F, 0xF8, + 0x7E, 0x07, 0xE7, 0xF6, 0x45, 0x06, 0xB9, 0xF8, 0xB5, 0xF9, 0xA3, 0xF6, + 0x4B, 0xE6, 0xC7, 0xF8, 0x63, 0xDA, 0x5B, 0x01, 0x0D, 0xD7, 0x0A, 0x0B, + 0x6B, 0xDF, 0xB5, 0x0E, 0xBA, 0xF0, 0xC3, 0x07, 0x89, 0xFD, 0x3C, 0x04, + 0x7D, 0xFE, 0xFD, 0x09, 0xD4, 0xF4, 0xA8, 0x0F, 0xAC, 0xF4, 0x44, 0x11, + 0xCC, 0x06, 0x8A, 0x18, 0x57, 0x15, 0x00, 0x23, 0xC6, 0x19, 0xCC, 0x27, + 0xB1, 0x1E, 0x8E, 0x2D, 0xB4, 0x2C, 0x19, 0x32, 0x3B, 0x38, 0x61, 0x30, + 0xEB, 0x2A, 0x52, 0x2C, 0xAE, 0x0F, 0x63, 0x29, 0x25, 0xFD, 0xA1, 0x1A, + 0xA2, 0xFA, 0x0A, 0xF2, 0x0D, 0xF6, 0xCC, 0xC4, 0x57, 0xE4, 0x08, 0xB2, + 0x36, 0xD2, 0xF7, 0xB6, 0x44, 0xCA, 0xB2, 0xC4, 0xDF, 0xDE, 0x2D, 0xD7, + 0xB9, 0x09, 0x8D, 0xEF, 0x22, 0x2F, 0xFC, 0x13, 0xDF, 0x48, 0x1C, 0x39, + 0x54, 0x58, 0x0A, 0x4D, 0x84, 0x60, 0x18, 0x4B, 0xC4, 0x5E, 0x5F, 0x3E, + 0xD5, 0x4A, 0xF1, 0x39, 0xAD, 0x2E, 0x25, 0x37, 0x2D, 0x1A, 0x71, 0x24, + 0x45, 0x0B, 0xA2, 0x07, 0x60, 0xFA, 0x6E, 0xEC, 0xAB, 0xDE, 0x63, 0xD6, + 0xCA, 0xBC, 0x5B, 0xCC, 0x05, 0xAE, 0xAB, 0xC7, 0xBD, 0xBA, 0x4E, 0xBD, + 0xB4, 0xCD, 0x5B, 0xBC, 0x42, 0xDA, 0xBC, 0xCF, 0x53, 0xE2, 0x30, 0xE9, + 0x07, 0xED, 0xE2, 0xFB, 0x9E, 0x04, 0x45, 0x09, 0x48, 0x1F, 0xE8, 0x16, + 0x9B, 0x30, 0x65, 0x26, 0xC2, 0x36, 0x54, 0x36, 0x1B, 0x37, 0xD4, 0x39, + 0xDB, 0x38, 0x1C, 0x2F, 0x99, 0x34, 0xAB, 0x27, 0x66, 0x23, 0x38, 0x28, + 0xAE, 0x12, 0x11, 0x2B, 0xAF, 0x05, 0x17, 0x29, 0xC5, 0xFA, 0xE3, 0x1D, + 0xBE, 0xF7, 0x1C, 0x0E, 0x1B, 0xEF, 0xE4, 0x04, 0x39, 0xE1, 0xF2, 0xF6, + 0x53, 0xD5, 0x7E, 0xDD, 0x3C, 0xCB, 0x1C, 0xCC, 0xD4, 0xC8, 0x6B, 0xC6, + 0x8B, 0xCA, 0x08, 0xCC, 0xE5, 0xCC, 0xC8, 0xD9, 0x9B, 0xD6, 0x99, 0xEA, + 0x96, 0xEA, 0x33, 0xF7, 0x61, 0xFA, 0x5E, 0xF3, 0x7D, 0xFC, 0x53, 0xEA, + 0x9B, 0xF7, 0x96, 0xE4, 0xDF, 0xFC, 0xF1, 0xE3, 0xEE, 0x0A, 0x52, 0xEC, + 0xB4, 0x11, 0x42, 0xF5, 0x61, 0x0C, 0x28, 0xF6, 0xBA, 0xFC, 0x95, 0xEB, + 0xC0, 0xEE, 0xF3, 0xE0, 0x4E, 0xE5, 0x5C, 0xDB, 0x40, 0xDC, 0x99, 0xD7, + 0x92, 0xD4, 0x8D, 0xDA, 0x2E, 0xCD, 0x0E, 0xDE, 0x4C, 0xC5, 0xBD, 0xE0, + 0x49, 0xC4, 0xBF, 0xE1, 0x87, 0xCE, 0xC3, 0xDE, 0xBB, 0xD8, 0xA4, 0xDD, + 0x24, 0xE1, 0xFE, 0xDE, 0x88, 0xE8, 0x13, 0xE2, 0x33, 0xE6, 0x52, 0xE7, + 0x89, 0xE0, 0x3B, 0xE7, 0xA9, 0xE7, 0x39, 0xE1, 0xC1, 0xF3, 0xB3, 0xE4, + 0xA7, 0xF8, 0x1A, 0xEF, 0x2A, 0x08, 0x9D, 0xF8, 0xF4, 0x1A, 0xB2, 0x04, + 0xC7, 0x1D, 0x4A, 0x14, 0xA8, 0x15, 0xDA, 0x1D, 0xAD, 0x09, 0xAF, 0x14, + 0xDB, 0x04, 0xF5, 0xFF, 0x4E, 0x01, 0xFA, 0xE9, 0xD4, 0xF1, 0x04, 0xD5, + 0x24, 0xDB, 0x16, 0xC5, 0xA2, 0xCA, 0xC9, 0xBE, 0x10, 0xCB, 0x89, 0xBD, + 0xC4, 0xD7, 0xE8, 0xBE, 0xE2, 0xE7, 0x11, 0xD1, 0x70, 0xF8, 0x76, 0xF3, + 0x4A, 0x08, 0x95, 0x12, 0x98, 0x20, 0xF9, 0x2C, 0x85, 0x41, 0x24, 0x48, + 0xA3, 0x53, 0x2A, 0x5D, 0x45, 0x53, 0xA3, 0x66, 0x64, 0x51, 0x14, 0x62, + 0xCE, 0x4D, 0x58, 0x50, 0x21, 0x45, 0x76, 0x39, 0x56, 0x2D, 0xD1, 0x29, + 0x3E, 0x03, 0x59, 0x19, 0xC5, 0xE0, 0x36, 0xF9, 0x17, 0xD0, 0xAD, 0xDD, + 0xBE, 0xC2, 0x92, 0xD9, 0xF4, 0xBC, 0x3F, 0xE2, 0x30, 0xC3, 0xC7, 0xED, + 0xBC, 0xD0, 0x55, 0xF4, 0x99, 0xE7, 0x10, 0xF1, 0x3C, 0xFB, 0xD6, 0xF0, + 0x65, 0x07, 0xB4, 0xFC, 0xDA, 0x19, 0xF7, 0x0C, 0x49, 0x34, 0xF7, 0x19, + 0xD7, 0x47, 0x9D, 0x21, 0x8D, 0x4A, 0xC6, 0x27, 0x93, 0x45, 0xFE, 0x32, + 0x92, 0x3D, 0x0F, 0x3C, 0x62, 0x2D, 0x67, 0x3A, 0x98, 0x1D, 0xD5, 0x31, + 0xAB, 0x15, 0x38, 0x27, 0x45, 0x09, 0x23, 0x1D, 0xE2, 0xF7, 0xF2, 0x0E, + 0x59, 0xEC, 0xDC, 0xFB, 0x4B, 0xEE, 0xA7, 0xED, 0xDF, 0xF6, 0x84, 0xE8, + 0x75, 0xF3, 0x7E, 0xEC, 0x0A, 0xE8, 0x2E, 0xF4, 0x1B, 0xDF, 0xBB, 0xF3, + 0x1A, 0xDA, 0xDC, 0xEE, 0x62, 0xDA, 0x39, 0xF0, 0x27, 0xE2, 0x4F, 0xF7, + 0x94, 0xEC, 0x96, 0xFE, 0xE1, 0xF8, 0xC2, 0x01, 0x1E, 0x0D, 0x3F, 0x03, + 0x31, 0x1C, 0xCE, 0x0A, 0x15, 0x14, 0x10, 0x0E, 0x1D, 0x0B, 0xD4, 0x07, + 0x6F, 0x13, 0x67, 0x00, 0x7C, 0x16, 0xE7, 0xF0, 0xC5, 0x10, 0x30, 0xE4, + 0x5E, 0x0A, 0x9C, 0xDF, 0x6B, 0x01, 0x43, 0xDD, 0x8B, 0xF7, 0xE4, 0xDD, + 0xBC, 0xED, 0xB2, 0xE0, 0x48, 0xEA, 0x14, 0xEC, 0x66, 0xEE, 0x5B, 0xF7, + 0x2F, 0xF0, 0x9C, 0xF9, 0x8A, 0xEC, 0x78, 0xF5, 0x17, 0xF1, 0x7E, 0xEF, + 0xCB, 0xFC, 0x51, 0xF0, 0xE7, 0xFB, 0x85, 0xF9, 0xA4, 0xF8, 0x9E, 0x09, + 0xC6, 0x04, 0x1A, 0x1D, 0xE4, 0x16, 0xF1, 0x29, 0x5D, 0x1D, 0xDD, 0x2D, + 0x6F, 0x16, 0xB5, 0x2E, 0x52, 0x0B, 0x32, 0x2C, 0xCF, 0x04, 0xE0, 0x2B, + 0x74, 0x09, 0x17, 0x2E, 0x34, 0x10, 0x7A, 0x26, 0x70, 0x13, 0x19, 0x12, + 0x78, 0x13, 0xC6, 0xF5, 0x6E, 0x03, 0xA7, 0xD9, 0xB4, 0xE3, 0x21, 0xBE, + 0x79, 0xC9, 0x51, 0xAC, 0x4B, 0xC4, 0x9D, 0xAE, 0x55, 0xD4, 0x9E, 0xB6, + 0xB6, 0xEE, 0xEC, 0xC2, 0x45, 0x05, 0xA6, 0xD9, 0xB1, 0x17, 0x47, 0xF1, + 0x76, 0x25, 0x28, 0x0F, 0xF9, 0x2A, 0xF0, 0x34, 0x91, 0x32, 0x78, 0x4A, + 0xA7, 0x41, 0x08, 0x4B, 0x0B, 0x4D, 0x33, 0x42, 0xAC, 0x3E, 0x03, 0x34, + 0x7B, 0x15, 0xA7, 0x25, 0x17, 0xF2, 0x7D, 0x17, 0x36, 0xE6, 0xE3, 0x07, + 0x15, 0xE2, 0x77, 0xF9, 0xBE, 0xD4, 0xBD, 0xEE, 0x46, 0xC6, 0xA4, 0xE7, + 0x57, 0xBD, 0x6F, 0xE1, 0x16, 0xB3, 0x81, 0xD9, 0xAD, 0xA9, 0x1C, 0xDA, + 0x08, 0xB2, 0x43, 0xE8, 0xB0, 0xCD, 0xA7, 0xFC, 0xB8, 0xEC, 0x44, 0x10, + 0x91, 0x07, 0x71, 0x18, 0x1B, 0x1A, 0x6B, 0x1E, 0x5D, 0x27, 0xD0, 0x25, + 0xE5, 0x31, 0x29, 0x1F, 0x97, 0x38, 0xA6, 0x14, 0x2A, 0x38, 0x50, 0x12, + 0xB3, 0x2E, 0x21, 0x13, 0xEF, 0x1C, 0x87, 0x12, 0xDC, 0x08, 0x7F, 0x0B, + 0x88, 0xF9, 0xDB, 0x03, 0x1B, 0xF2, 0x38, 0xFE, 0xA6, 0xF2, 0x39, 0xF5, + 0x29, 0xF1, 0xF2, 0xEE, 0x0A, 0xEE, 0xE8, 0xE6, 0xEC, 0xF0, 0xB5, 0xD9, + 0xBE, 0xF3, 0x67, 0xD2, 0xAE, 0xF3, 0xC1, 0xD4, 0xF7, 0xF2, 0x05, 0xE0, + 0xD5, 0xFD, 0xD0, 0xEC, 0x17, 0x13, 0xC6, 0xF3, 0x4C, 0x15, 0xC3, 0xF2, + 0x11, 0x01, 0xB8, 0xEE, 0xBA, 0xE8, 0x93, 0xEC, 0x00, 0xDF, 0x5D, 0xEF, + 0xA1, 0xE3, 0x03, 0xF3, 0x74, 0xE7, 0x6A, 0xF6, 0x45, 0xEF, 0x0C, 0xFA, + 0x29, 0xF6, 0x76, 0xF1, 0x39, 0xF2, 0xA4, 0xE4, 0xF7, 0xEC, 0xCE, 0xE0, + 0x96, 0xF2, 0x67, 0xE8, 0x92, 0xFA, 0x53, 0xF1, 0xFF, 0xF8, 0x2C, 0xEA, + 0x0B, 0xFB, 0x02, 0xDB, 0xFF, 0xFB, 0x26, 0xD4, 0xEC, 0xEB, 0xF8, 0xDA, + 0x15, 0xD1, 0xD4, 0xE5, 0x2E, 0xC4, 0xF8, 0xEF, 0x8F, 0xD4, 0x4F, 0xFD, + 0x98, 0xF1, 0xE7, 0x01, 0x2B, 0x01, 0x7E, 0xFF, 0x97, 0xFC, 0x69, 0x03, + 0x05, 0xFC, 0xA7, 0x0A, 0x93, 0x0E, 0x07, 0x10, 0x5F, 0x27, 0x6C, 0x1A, + 0x67, 0x33, 0x5E, 0x2A, 0xBE, 0x2D, 0xBA, 0x36, 0x41, 0x1C, 0xD2, 0x38, + 0x78, 0x0C, 0x8D, 0x27, 0x9E, 0x04, 0xD2, 0x0B, 0x38, 0xF4, 0x09, 0xF7, + 0xC4, 0xDD, 0x7E, 0xE7, 0x38, 0xCE, 0x06, 0xD7, 0xC4, 0xC4, 0xE5, 0xC6, + 0xD6, 0xC7, 0x1B, 0xC2, 0xEA, 0xD6, 0xB9, 0xC9, 0xD9, 0xE7, 0x30, 0xDE, + 0x09, 0xFE, 0x3C, 0xFA, 0x54, 0x1E, 0xED, 0x12, 0x4D, 0x3C, 0x86, 0x2B, + 0x0D, 0x48, 0x92, 0x42, 0xA9, 0x44, 0xD5, 0x4D, 0xEB, 0x3E, 0x09, 0x4D, + 0x22, 0x3E, 0x97, 0x44, 0x20, 0x3D, 0xF0, 0x33, 0x7F, 0x2D, 0x9C, 0x26, + 0xB0, 0x13, 0xE3, 0x18, 0x07, 0xFC, 0x9D, 0x05, 0xF8, 0xEC, 0x9B, 0xF9, + 0x75, 0xED, 0x20, 0xEE, 0x77, 0xF3, 0x94, 0xE3, 0xCB, 0xF4, 0x25, 0xE7, + 0xE8, 0xF4, 0x41, 0xF2, 0xD3, 0xF7, 0x16, 0xF9, 0x54, 0xFF, 0x83, 0xFC, + 0xBE, 0x02, 0xF0, 0x02, 0x5D, 0xFC, 0x3F, 0x12, 0xAE, 0xFA, 0x46, 0x22, + 0x3A, 0x0F, 0x9F, 0x25, 0xE9, 0x2D, 0x04, 0x22, 0x65, 0x3D, 0x2A, 0x23, + 0xFF, 0x38, 0x57, 0x2A, 0xB4, 0x2C, 0x19, 0x34, 0x0B, 0x25, 0x14, 0x40, + 0x3E, 0x28, 0xED, 0x47, 0x18, 0x2E, 0x3B, 0x44, 0x1F, 0x29, 0x7E, 0x35, + 0xD8, 0x19, 0xDC, 0x22, 0x6A, 0x08, 0x35, 0x11, 0x57, 0xFB, 0x4F, 0x00, + 0x18, 0xEB, 0x1B, 0xFB, 0x67, 0xD7, 0xE5, 0xFD, 0x8E, 0xD0, 0xC0, 0xF3, + 0x9A, 0xDB, 0xD5, 0xE0, 0x7B, 0xEE, 0x77, 0xD4, 0x28, 0xF5, 0x70, 0xD6, + 0x04, 0xF2, 0x44, 0xE9, 0x6F, 0x00, 0xE9, 0xFE, 0x4A, 0x1E, 0x58, 0x0C, + 0xF7, 0x30, 0xA3, 0x11, 0xE8, 0x31, 0x25, 0x12, 0xD8, 0x25, 0x21, 0x13, + 0xB2, 0x15, 0x47, 0x0E, 0x45, 0x0B, 0x50, 0xFD, 0xDB, 0x05, 0xD2, 0xED, + 0xCF, 0xFD, 0xFF, 0xE7, 0x67, 0xED, 0x02, 0xE0, 0x48, 0xDF, 0x3E, 0xDD, + 0x95, 0xDD, 0xEC, 0xE0, 0xAA, 0xE5, 0xC6, 0xDE, 0x5F, 0xF4, 0x57, 0xE3, + 0x0A, 0xF8, 0xA2, 0xEB, 0x41, 0xED, 0x2F, 0xE6, 0xFC, 0xE6, 0xD8, 0xDB, + 0xDA, 0xEE, 0x61, 0xDE, 0xB1, 0xFB, 0x0F, 0xEF, 0xD0, 0xFC, 0xB7, 0xFF, + 0xB5, 0xFD, 0x57, 0x03, 0xE5, 0x09, 0xB8, 0xFE, 0xDC, 0x16, 0x65, 0x04, + 0xDC, 0x13, 0x21, 0x19, 0xD2, 0x0B, 0x2D, 0x29, 0x69, 0x1A, 0x4E, 0x2C, + 0x9D, 0x33, 0xB2, 0x31, 0x39, 0x40, 0x0D, 0x39, 0xB6, 0x3C, 0x9B, 0x38, + 0xC0, 0x2B, 0xB9, 0x32, 0x12, 0x0E, 0x5B, 0x24, 0x95, 0xEE, 0x45, 0x08, + 0x57, 0xDE, 0x62, 0xE9, 0xCE, 0xD2, 0x82, 0xCF, 0x00, 0xC6, 0x0E, 0xBD, + 0xEF, 0xC7, 0x32, 0xB9, 0xDC, 0xD8, 0xB5, 0xC4, 0xCD, 0xED, 0x6B, 0xDF, + 0xA3, 0x02, 0x6F, 0x0B, 0xED, 0x11, 0x2D, 0x3B, 0xF0, 0x24, 0xE3, 0x52, + 0x7F, 0x43, 0x91, 0x57, 0x0A, 0x5B, 0x1D, 0x5A, 0xED, 0x5F, 0x6C, 0x50, + 0x9D, 0x53, 0xB9, 0x37, 0x67, 0x37, 0x0E, 0x1E, 0x1E, 0x13, 0x74, 0x0C, + 0x60, 0xF5, 0x32, 0xF8, 0xA2, 0xDF, 0x16, 0xE1, 0x41, 0xCC, 0xB0, 0xD3, + 0x4D, 0xBE, 0x52, 0xCA, 0x6E, 0xB6, 0xEF, 0xC5, 0x0C, 0xB4, 0x6E, 0xD2, + 0xD5, 0xBE, 0xEA, 0xE7, 0xB0, 0xD7, 0xF1, 0xFA, 0x10, 0xEF, 0x52, 0x0A, + 0x3B, 0x00, 0x70, 0x12, 0xE8, 0x0E, 0x2A, 0x14, 0x90, 0x13, 0xFB, 0x13, + 0x1E, 0x0D, 0x68, 0x12, 0x63, 0x0B, 0xFE, 0x0F, 0xA8, 0x16, 0xBF, 0x0C, + 0x07, 0x20, 0x1B, 0x05, 0x66, 0x1E, 0x5A, 0xF9, 0x0A, 0x13, 0x43, 0xF4, + 0x35, 0x03, 0xC5, 0xF6, 0x29, 0xF9, 0xA7, 0xF3, 0x5C, 0xF1, 0xD3, 0xEA, + 0xD7, 0xE2, 0xFC, 0xE0, 0x8C, 0xCE, 0x18, 0xD5, 0xBA, 0xBD, 0xC5, 0xCA, + 0x54, 0xBD, 0x92, 0xC5, 0xF0, 0xCC, 0x60, 0xC3, 0x73, 0xDB, 0x6C, 0xBF, + 0x94, 0xDF, 0x15, 0xC0, 0x16, 0xDE, 0x08, 0xC6, 0x7E, 0xDC, 0xF8, 0xC6, + 0x37, 0xDF, 0x58, 0xCB, 0x21, 0xE5, 0xB5, 0xE0, 0xFF, 0xEA, 0x0D, 0xF7, + 0x7C, 0xFA, 0xA2, 0xFE, 0xB0, 0x0B, 0x7A, 0x03, 0x8B, 0x06, 0x97, 0x0A, + 0x3F, 0xF6, 0x23, 0x0B, 0x98, 0xE6, 0x1E, 0x01, 0xB6, 0xDB, 0x99, 0xF5, + 0x30, 0xDD, 0x61, 0xE8, 0xF4, 0xE5, 0x78, 0xD9, 0x8D, 0xEB, 0xC5, 0xD2, + 0x32, 0xDE, 0x1B, 0xD2, 0xB2, 0xCC, 0x5A, 0xD6, 0xC6, 0xCC, 0xFF, 0xDB, + 0xA6, 0xD4, 0x7B, 0xDE, 0xA7, 0xD9, 0xEA, 0xE2, 0xA9, 0xD8, 0x6F, 0xEC, + 0x03, 0xDD, 0x1F, 0xF4, 0x39, 0xED, 0xE9, 0xF1, 0xAB, 0xFB, 0x0D, 0xEB, + 0x58, 0x06, 0x37, 0xE6, 0x50, 0x0A, 0xF7, 0xEE, 0x7B, 0x05, 0x6E, 0x02, + 0x44, 0x07, 0x2E, 0x0F, 0x82, 0x13, 0xDA, 0x15, 0x98, 0x1F, 0xA0, 0x1A, + 0x1C, 0x20, 0x2C, 0x19, 0x02, 0x11, 0x10, 0x0D, 0x47, 0x05, 0x96, 0x05, + 0x04, 0x03, 0x53, 0x04, 0x13, 0xF7, 0x4D, 0xF7, 0x48, 0xE7, 0x3B, 0xDD, + 0x0A, 0xE5, 0x92, 0xC6, 0xC2, 0xE2, 0x4A, 0xBB, 0x82, 0xD7, 0x34, 0xC0, + 0x73, 0xD5, 0xA8, 0xD9, 0xC0, 0xDE, 0x68, 0xF3, 0xBA, 0xF1, 0x3B, 0x07, + 0xBB, 0x15, 0x53, 0x1F, 0xB7, 0x3F, 0x65, 0x38, 0x0E, 0x4F, 0xF3, 0x44, + 0x72, 0x47, 0xEA, 0x4F, 0xD5, 0x47, 0x49, 0x5C, 0x32, 0x3E, 0x79, 0x4F, + 0x0D, 0x25, 0x5F, 0x37, 0x3D, 0x11, 0xA2, 0x24, 0xEF, 0x01, 0xB3, 0x10, + 0x2D, 0xED, 0x1A, 0xF9, 0x11, 0xDC, 0xE2, 0xE4, 0xEB, 0xE1, 0xE0, 0xD9, + 0x91, 0xE9, 0x92, 0xD1, 0x98, 0xE3, 0x4A, 0xD2, 0xC3, 0xE4, 0x7F, 0xE5, + 0xB5, 0xF3, 0x8D, 0xFD, 0xFB, 0x0A, 0xE3, 0x0C, 0x18, 0x22, 0xB3, 0x11, + 0x30, 0x34, 0x12, 0x10, 0x42, 0x41, 0x8B, 0x13, 0xF1, 0x46, 0xE2, 0x24, + 0x42, 0x40, 0xB7, 0x3C, 0xA5, 0x3C, 0x4B, 0x52, 0x3E, 0x38, 0x45, 0x54, + 0x1C, 0x2C, 0x0D, 0x49, 0xA6, 0x2C, 0x9C, 0x47, 0x0D, 0x25, 0x9A, 0x3C, + 0x2E, 0x0F, 0x7D, 0x2B, 0x4E, 0xFE, 0x81, 0x20, 0x1E, 0xED, 0xB6, 0x15, + 0xD6, 0xE1, 0xB3, 0x05, 0x26, 0xE8, 0x5E, 0xF4, 0xD1, 0xEB, 0x29, 0xED, + 0x6E, 0xE2, 0x1E, 0xE6, 0xE0, 0xDF, 0xCE, 0xDF, 0xF7, 0xEE, 0xBD, 0xE1, + 0x2A, 0xF8, 0x48, 0xD9, 0x79, 0xF8, 0x35, 0xD1, 0x83, 0xF8, 0x96, 0xD6, + 0x6D, 0xFD, 0x22, 0xE0, 0x8A, 0x0F, 0x9D, 0xEB, 0xF6, 0x19, 0xDC, 0xF0, + 0xDF, 0x15, 0xA7, 0xF7, 0x13, 0x09, 0xE4, 0xFD, 0xDB, 0xFF, 0xD0, 0xFA, + 0xDE, 0xFF, 0x2A, 0xF1, 0x8C, 0xFC, 0xD4, 0xEA, 0x67, 0xF5, 0x1C, 0xF0, + 0xC8, 0xF4, 0x53, 0xF6, 0x05, 0xF7, 0xD4, 0xFD, 0xD9, 0xE3, 0x33, 0xFE, + 0xE9, 0xCC, 0x40, 0xF9, 0xF8, 0xCE, 0xB1, 0xF7, 0x56, 0xD3, 0x0C, 0xF2, + 0x32, 0xD0, 0x8D, 0xEF, 0xA7, 0xD8, 0x64, 0xF2, 0x48, 0xE6, 0x44, 0xF9, + 0x27, 0xE9, 0xC8, 0x00, 0x0D, 0xE7, 0x3F, 0x07, 0xFD, 0xEF, 0x70, 0x0E, + 0x64, 0x00, 0x1C, 0x11, 0xD9, 0x06, 0xCC, 0x14, 0xC0, 0x0B, 0x40, 0x20, + 0x9D, 0x0E, 0xBC, 0x21, 0x34, 0x11, 0xAB, 0x1B, 0x5A, 0x21, 0xC6, 0x18, + 0x7C, 0x24, 0x47, 0x0D, 0x3D, 0x15, 0x9C, 0x05, 0x2D, 0x09, 0x0A, 0x04, + 0x3B, 0xFE, 0x21, 0xFB, 0xB0, 0xF0, 0xC1, 0xE8, 0x19, 0xE6, 0x06, 0xD0, + 0x6F, 0xEF, 0x87, 0xC9, 0x53, 0xFD, 0x42, 0xD0, 0x74, 0x02, 0x15, 0xD5, + 0x38, 0x13, 0x6A, 0xF1, 0xC9, 0x1D, 0x3C, 0x13, 0xDB, 0x1F, 0x79, 0x24, + 0x55, 0x2F, 0x40, 0x33, 0xA4, 0x41, 0x8E, 0x3F, 0xF9, 0x40, 0x8C, 0x45, + 0x0F, 0x2E, 0x0B, 0x42, 0x9A, 0x1F, 0xB1, 0x3C, 0x57, 0x0E, 0xA2, 0x2E, + 0x60, 0xF9, 0x8E, 0x10, 0xD3, 0xF7, 0x6A, 0xFB, 0xBE, 0xF8, 0x8F, 0xF4, + 0x06, 0xEC, 0x8D, 0xEC, 0x9A, 0xE3, 0xD0, 0xE0, 0xBD, 0xE6, 0x48, 0xD5, + 0xEF, 0xEA, 0x55, 0xDB, 0x4E, 0xE2, 0x57, 0xE3, 0xDF, 0xE3, 0x6E, 0xE4, + 0xAA, 0xFA, 0x26, 0xF4, 0x6A, 0x0E, 0xA4, 0x05, 0xA9, 0x1A, 0x06, 0x0E, + 0x43, 0x2A, 0x94, 0x18, 0x72, 0x30, 0xBB, 0x1D, 0xB4, 0x24, 0xDF, 0x1A, + 0x8D, 0x1F, 0xFA, 0x21, 0x1C, 0x22, 0xEF, 0x2A, 0xC2, 0x1E, 0x17, 0x25, + 0x17, 0x1F, 0x68, 0x17, 0xFD, 0x24, 0x96, 0x0F, 0x4F, 0x0C, 0x51, 0x05, + 0x12, 0xE2, 0xB1, 0xFD, 0x2E, 0xD1, 0xC6, 0xFF, 0x60, 0xCA, 0x54, 0xF6, + 0x8F, 0xC6, 0xA6, 0xE2, 0x45, 0xD6, 0x7C, 0xE1, 0x53, 0xE4, 0x36, 0xE7, + 0x1F, 0xEC, 0x08, 0xDE, 0xA8, 0xF2, 0xFB, 0xD2, 0x0F, 0xF6, 0xE3, 0xD5, + 0xCA, 0xFA, 0x6B, 0xDF, 0x2C, 0xF9, 0xD3, 0xE1, 0x2A, 0xFD, 0x86, 0xEB, + 0x9B, 0xFA, 0x80, 0xF6, 0x36, 0xEF, 0x2A, 0xF7, 0x83, 0xEA, 0x0D, 0xF3, + 0x10, 0xE4, 0x72, 0xEA, 0xD0, 0xDD, 0x30, 0xE2, 0xAE, 0xE5, 0x92, 0xE5, + 0xA6, 0xF3, 0xD0, 0xF1, 0x39, 0xF8, 0xC4, 0xF8, 0x49, 0xFD, 0xE9, 0xF6, + 0x40, 0x08, 0x2F, 0xEF, 0xF0, 0x05, 0x52, 0xE3, 0x33, 0xF9, 0x5F, 0xDD, + 0x56, 0xF4, 0xEF, 0xE5, 0xE1, 0xEC, 0x8F, 0xF2, 0x4A, 0xE6, 0x4D, 0xF9, + 0xE6, 0xE9, 0x87, 0xF7, 0xE1, 0xF1, 0xDD, 0xFA, 0x82, 0xED, 0x39, 0x01, + 0xD0, 0xE9, 0x69, 0x01, 0x3C, 0xF5, 0xCF, 0x05, 0x39, 0xFC, 0xF7, 0x09, + 0x6D, 0x02, 0x6B, 0x0C, 0xDE, 0x0E, 0xEC, 0x10, 0x3B, 0x19, 0xE2, 0x0F, + 0x0B, 0x1B, 0xCE, 0x12, 0x76, 0x16, 0xB5, 0x1C, 0x18, 0x15, 0x53, 0x21, + 0x2A, 0x13, 0xF9, 0x1D, 0xA2, 0x05, 0x95, 0x0A, 0x28, 0xF8, 0x66, 0xF2, + 0x50, 0xEB, 0x22, 0xE3, 0x1C, 0xE2, 0x99, 0xDC, 0x1D, 0xDF, 0x23, 0xE0, + 0x57, 0xDC, 0x68, 0xE9, 0xD1, 0xEB, 0xEE, 0xFB, 0x19, 0x05, 0xF9, 0x0F, + 0xAD, 0x14, 0x13, 0x1F, 0x6D, 0x1E, 0x76, 0x28, 0xA8, 0x30, 0x4D, 0x30, + 0xA0, 0x41, 0xD4, 0x3C, 0xC6, 0x3F, 0x0E, 0x45, 0xEE, 0x36, 0xDC, 0x49, + 0x71, 0x2B, 0xCB, 0x41, 0x42, 0x20, 0xF7, 0x30, 0xE9, 0x12, 0x12, 0x1F, + 0x36, 0x02, 0x37, 0x05, 0x0F, 0xFD, 0x62, 0xF1, 0x5F, 0xFF, 0xC0, 0xE8, + 0x90, 0xFA, 0x2D, 0xE5, 0x2A, 0xEA, 0x60, 0xE0, 0x0F, 0xDF, 0x96, 0xE0, + 0xD5, 0xE6, 0x6F, 0xE9, 0xDD, 0xF9, 0x04, 0xEE, 0x92, 0x0E, 0xFF, 0xF7, + 0x41, 0x15, 0x9E, 0x0C, 0x8C, 0x15, 0xDB, 0x12, 0x50, 0x1D, 0xCE, 0x08, + 0xD8, 0x17, 0x24, 0xFB, 0xC0, 0x0A, 0x0E, 0xF6, 0x65, 0x0C, 0x97, 0x00, + 0xC5, 0x1B, 0xC3, 0x13, 0xF8, 0x23, 0xE5, 0x1D, 0xE2, 0x26, 0x66, 0x1B, + 0x78, 0x2D, 0x2A, 0x19, 0x25, 0x21, 0x6D, 0x11, 0xCF, 0x0A, 0x3A, 0x06, + 0x8B, 0x00, 0x8A, 0x02, 0xDB, 0xFB, 0x67, 0x06, 0xBF, 0xF1, 0xD2, 0x03, + 0xC4, 0xEC, 0x84, 0xFA, 0x46, 0xE9, 0xB6, 0xF7, 0xE7, 0xE3, 0xED, 0xF8, + 0xB7, 0xE5, 0xFA, 0xF4, 0xB9, 0xE5, 0xA1, 0xF0, 0x9F, 0xE6, 0xBD, 0xF2, + 0x2F, 0xEC, 0xD9, 0xF1, 0x38, 0xF2, 0x45, 0xF0, 0x58, 0xF6, 0x78, 0xF6, + 0x5F, 0xF4, 0x19, 0xFD, 0x21, 0xF1, 0xA6, 0xFB, 0xB9, 0xF5, 0xE0, 0xF6, + 0x87, 0xFD, 0xEE, 0xF6, 0xA0, 0x02, 0x41, 0xF3, 0x1B, 0xFF, 0x62, 0xE7, + 0xD4, 0xFA, 0x8A, 0xE2, 0x8E, 0xEF, 0x27, 0xDE, 0x0A, 0xE6, 0x72, 0xDB, + 0xD1, 0xEA, 0x09, 0xDD, 0x6B, 0xF5, 0x39, 0xE4, 0x4D, 0xF4, 0x63, 0xEE, + 0xA3, 0xE8, 0x66, 0xFA, 0x85, 0xE6, 0xBD, 0x07, 0x71, 0xE5, 0x7A, 0x08, + 0x64, 0xE7, 0xCB, 0x09, 0xB7, 0xE7, 0x61, 0x0C, 0x81, 0xE0, 0x57, 0x08, + 0xE1, 0xDC, 0xD6, 0x07, 0x44, 0xE4, 0x4F, 0x07, 0xA1, 0xEE, 0xFE, 0xFC, + 0x35, 0xF6, 0xF0, 0xF9, 0xE5, 0xFE, 0x3A, 0x06, 0xFF, 0x0F, 0x82, 0x15, + 0x22, 0x17, 0x47, 0x14, 0x13, 0x13, 0x58, 0xFF, 0xAB, 0x12, 0xB9, 0xE9, + 0xFC, 0x04, 0x63, 0xDE, 0x46, 0xF1, 0x7D, 0xD8, 0x63, 0xEC, 0xC2, 0xD5, + 0x7B, 0xEB, 0xC6, 0xD7, 0x11, 0xE2, 0x06, 0xD2, 0xC7, 0xDB, 0x4E, 0xC8, + 0x9D, 0xDE, 0xC8, 0xC5, 0x66, 0xED, 0xB0, 0xD1, 0xB2, 0x03, 0x31, 0xE8, + 0xE1, 0x1D, 0x8A, 0x04, 0x8E, 0x35, 0x80, 0x21, 0x18, 0x42, 0x6E, 0x33, + 0xEB, 0x40, 0x25, 0x37, 0x6F, 0x39, 0xD3, 0x33, 0x4F, 0x31, 0x37, 0x34, + 0x3D, 0x1A, 0x37, 0x30, 0x09, 0x02, 0x04, 0x27, 0x29, 0xFA, 0xD6, 0x16, + 0x3F, 0xF8, 0x06, 0x04, 0x6F, 0xE9, 0x72, 0xF9, 0x13, 0xD9, 0x19, 0xF5, + 0x39, 0xD6, 0xA8, 0xF3, 0xC7, 0xD9, 0x83, 0xF5, 0xFB, 0xE0, 0x78, 0xFD, + 0xA3, 0xEA, 0x6A, 0x05, 0x38, 0xF7, 0xE4, 0x09, 0xC8, 0x02, 0xB6, 0x07, + 0x43, 0x0F, 0x2B, 0x05, 0xA7, 0x1D, 0xAD, 0x08, 0x2E, 0x23, 0x25, 0x0B, + 0x99, 0x2C, 0xE6, 0x12, 0x97, 0x37, 0xA9, 0x1B, 0x2B, 0x32, 0xE1, 0x1C, + 0xC7, 0x26, 0xE8, 0x16, 0xB1, 0x17, 0x1D, 0x0B, 0x29, 0x05, 0x1D, 0x02, + 0x8D, 0xFA, 0x20, 0xFB, 0x32, 0xF9, 0x24, 0xF3, 0x1F, 0xF9, 0xB9, 0xF2, + 0xE5, 0xF7, 0x2A, 0xFA, 0xD7, 0xF2, 0x2A, 0xFC, 0x67, 0xEF, 0x42, 0xF7, + 0x50, 0xED, 0x64, 0xEE, 0x4C, 0xE7, 0xD0, 0xE3, 0xC2, 0xE9, 0xA8, 0xE1, + 0xC8, 0xF3, 0xBD, 0xE3, 0x35, 0xF8, 0x67, 0xE3, 0xBF, 0xF5, 0x13, 0xEB, + 0x7E, 0xF0, 0x5E, 0xF9, 0xE3, 0xEE, 0x6B, 0xFF, 0xCB, 0xF7, 0xD4, 0xFC, + 0x57, 0xFE, 0x69, 0xF9, 0x7D, 0xF9, 0xA2, 0xF3, 0x17, 0xF4, 0x7B, 0xEF, + 0x99, 0xF5, 0x68, 0xF0, 0xF1, 0xF6, 0x50, 0xEE, 0x64, 0xF0, 0xAA, 0xED, + 0x84, 0xE9, 0x16, 0xF1, 0xCE, 0xEA, 0x60, 0xF6, 0x81, 0xE7, 0xA7, 0xF4, + 0x24, 0xE3, 0xCC, 0xF1, 0x79, 0xE7, 0x7E, 0xF4, 0xAB, 0xE8, 0xAE, 0xF2, + 0x69, 0xE6, 0x72, 0xEE, 0x41, 0xED, 0x7B, 0xF1, 0xF2, 0xFE, 0x39, 0xFF, + 0x8F, 0x0D, 0x4C, 0x07, 0x8E, 0x10, 0xE0, 0x06, 0xEE, 0x0D, 0x82, 0xFE, + 0x82, 0x11, 0xC7, 0xF6, 0x28, 0x18, 0xCC, 0xFA, 0x78, 0x13, 0x69, 0x07, + 0xE2, 0x0E, 0xF4, 0x18, 0x57, 0x18, 0xCD, 0x26, 0xF6, 0x1A, 0x27, 0x2A, + 0x45, 0x0F, 0xB2, 0x28, 0xF2, 0x03, 0xBB, 0x26, 0x87, 0xFA, 0x81, 0x1B, + 0x4E, 0xF1, 0x30, 0x09, 0xBE, 0xEE, 0xCE, 0xFA, 0xC9, 0xE6, 0x59, 0xF2, + 0x8D, 0xD8, 0x5B, 0xE9, 0xD2, 0xD6, 0xD1, 0xDB, 0x55, 0xE2, 0x84, 0xD7, + 0x0D, 0xF8, 0xCC, 0xE5, 0x32, 0x0F, 0x32, 0xFE, 0xF5, 0x25, 0x32, 0x1C, + 0xD7, 0x38, 0xF2, 0x2D, 0x03, 0x42, 0x52, 0x2A, 0x45, 0x3F, 0xBF, 0x25, + 0x9B, 0x2D, 0x1D, 0x21, 0x15, 0x1C, 0xE5, 0x17, 0xE9, 0x12, 0x70, 0x12, + 0xBC, 0x0B, 0x9D, 0x0D, 0x79, 0x06, 0xCA, 0x02, 0xC8, 0x02, 0x32, 0xF5, + 0xC8, 0xF1, 0xA4, 0xE4, 0x28, 0xE0, 0xF2, 0xD3, 0x88, 0xE1, 0x4D, 0xD0, + 0xCB, 0xE3, 0xD5, 0xDE, 0xFD, 0xDE, 0xE2, 0xF8, 0x3A, 0xE0, 0x82, 0x0F, + 0x22, 0xF0, 0x28, 0x1A, 0xEB, 0x07, 0x1D, 0x19, 0x59, 0x16, 0x3E, 0x13, + 0xCA, 0x24, 0xF0, 0x16, 0xA2, 0x2B, 0xAB, 0x15, 0xFD, 0x24, 0x37, 0x18, + 0x90, 0x1C, 0x77, 0x27, 0x94, 0x12, 0xB6, 0x2B, 0xE7, 0x0E, 0xCC, 0x2C, + 0xFD, 0x08, 0x03, 0x27, 0x88, 0x0B, 0xF8, 0x1D, 0xDF, 0x08, 0x52, 0x12, + 0x8D, 0xF7, 0xBC, 0x04, 0x93, 0xE9, 0x38, 0xFE, 0x5C, 0xE5, 0xE5, 0xF8, + 0xDD, 0xEB, 0x19, 0xF8, 0x8A, 0xF2, 0x16, 0xF5, 0x0E, 0xFB, 0x8C, 0xEE, + 0x73, 0xFC, 0xFD, 0xED, 0x75, 0xFA, 0x14, 0xF7, 0x5F, 0xFF, 0x54, 0xFA, + 0x79, 0x0B, 0x14, 0xF4, 0xF5, 0x14, 0x7F, 0xF1, 0x45, 0x1E, 0x13, 0xF7, + 0x59, 0x26, 0xF9, 0xFF, 0x32, 0x1F, 0xF7, 0x00, 0x2E, 0x0E, 0x23, 0xFF, + 0x00, 0xFC, 0xFB, 0x01, 0x5D, 0xF0, 0x50, 0x03, 0x07, 0xEB, 0x5E, 0x01, + 0xA1, 0xF4, 0x0E, 0x04, 0x26, 0xFE, 0xE4, 0x03, 0x07, 0xF1, 0x0D, 0xF4, + 0x20, 0xE2, 0x90, 0xE3, 0x6A, 0xE2, 0x65, 0xE0, 0x0E, 0xE1, 0x9B, 0xE3, + 0xE5, 0xE2, 0xB5, 0xEC, 0xB0, 0xF0, 0xEF, 0xF1, 0x1A, 0xFC, 0x9F, 0xF0, + 0x76, 0xF4, 0x8B, 0xEB, 0x25, 0xEA, 0xA7, 0xED, 0xE1, 0xEE, 0x42, 0xF2, + 0xFA, 0xEE, 0xCD, 0xE8, 0xD2, 0xF1, 0x8F, 0xE9, 0x86, 0x02, 0x36, 0xF9, + 0x4B, 0x10, 0xB0, 0x08, 0x48, 0x0B, 0x51, 0x0C, 0x4D, 0x07, 0x51, 0x0E, + 0x32, 0x14, 0xAC, 0x18, 0x21, 0x19, 0xFC, 0x19, 0x35, 0x1A, 0xB8, 0x19, + 0x3F, 0x1D, 0xA3, 0x17, 0x7C, 0x09, 0x98, 0x07, 0x46, 0xE4, 0x16, 0xF6, + 0x4E, 0xCB, 0xBF, 0xE4, 0x78, 0xC9, 0xAF, 0xD0, 0x2D, 0xC8, 0x35, 0xC3, + 0x6F, 0xC7, 0x44, 0xBF, 0x38, 0xD6, 0x12, 0xC7, 0x68, 0xEC, 0x3D, 0xD8, + 0xFC, 0x07, 0x9D, 0xE7, 0xF9, 0x2B, 0x18, 0xFA, 0x63, 0x49, 0xA0, 0x13, + 0xED, 0x49, 0x33, 0x23, 0x30, 0x38, 0x2D, 0x2F, 0xB0, 0x26, 0xDF, 0x37, + 0x38, 0x14, 0x49, 0x30, 0x72, 0xFA, 0x86, 0x21, 0xD6, 0xDF, 0x93, 0x11, + 0x6C, 0xDC, 0x5B, 0x04, 0x52, 0xE3, 0x7D, 0xF4, 0xC0, 0xE1, 0x88, 0xE5, + 0xCA, 0xD6, 0x1B, 0xDD, 0x5E, 0xCE, 0xA9, 0xD9, 0x7D, 0xD5, 0xBA, 0xDC, + 0xF0, 0xE2, 0xB5, 0xE3, 0xCB, 0xFC, 0x13, 0xF3, 0x85, 0x13, 0x38, 0x00, + 0x75, 0x21, 0x0E, 0x0A, 0x6C, 0x28, 0x61, 0x12, 0x47, 0x23, 0x87, 0x17, + 0x55, 0x23, 0x8E, 0x23, 0xD6, 0x22, 0x6E, 0x2D, 0xF4, 0x19, 0x87, 0x2F, + 0x41, 0x11, 0x32, 0x22, 0x45, 0x11, 0x21, 0x0E, 0x39, 0x0A, 0x71, 0x05, + 0x2A, 0xF8, 0xBE, 0xFB, 0xA8, 0xEE, 0x00, 0xF0, 0x7D, 0xF4, 0x72, 0xEF, + 0xFB, 0x01, 0xBA, 0xF7, 0x1E, 0x05, 0x6B, 0xF7, 0xBE, 0xFD, 0x01, 0xF2, + 0x9B, 0xEF, 0x3A, 0xF0, 0xC9, 0xE2, 0xCA, 0xE9, 0xFC, 0xE4, 0xC0, 0xE1, + 0x5A, 0xEA, 0xAD, 0xE6, 0x56, 0xE6, 0x45, 0xF7, 0x91, 0xE6, 0x2C, 0x01, + 0xC1, 0xF1, 0x85, 0x06, 0x06, 0xFA, 0xB8, 0x0C, 0xC4, 0xFD, 0xF3, 0x0F, + 0xA7, 0x02, 0xD6, 0x0F, 0x02, 0x07, 0x5D, 0x07, 0x17, 0x0C, 0x31, 0x00, + 0xFC, 0x05, 0x6C, 0xFA, 0x4C, 0xF5, 0xF6, 0xF2, 0xA5, 0xED, 0x45, 0xF7, + 0xA8, 0xEE, 0xE6, 0xFE, 0x55, 0xF6, 0x27, 0x08, 0x51, 0xF5, 0x34, 0x09, + 0x7B, 0xEA, 0x55, 0xFA, 0x4B, 0xE4, 0xFA, 0xEC, 0x2B, 0xDF, 0x56, 0xE3, + 0x73, 0xED, 0xE7, 0xE0, 0x31, 0x0A, 0xC9, 0xE6, 0xD9, 0x13, 0x7A, 0xF1, + 0x79, 0x0F, 0xCC, 0xFB, 0x12, 0x02, 0x19, 0xF4, 0x62, 0xF9, 0x0E, 0xED, + 0x16, 0xF9, 0x2A, 0xF3, 0x1B, 0xF8, 0x12, 0xF6, 0xD8, 0xFE, 0x7D, 0xF8, + 0x97, 0x05, 0x7F, 0xFB, 0x99, 0x09, 0x04, 0x01, 0xB8, 0x10, 0x50, 0x0A, + 0x71, 0x18, 0xB0, 0x0E, 0x55, 0x1B, 0x28, 0x11, 0xA7, 0x16, 0xEB, 0x14, + 0x45, 0x11, 0xB7, 0x0D, 0x81, 0x09, 0xFA, 0xF6, 0x34, 0xF9, 0xB5, 0xDA, + 0x91, 0xF2, 0x3D, 0xC8, 0x8A, 0xF3, 0x67, 0xC5, 0x3B, 0xEE, 0x42, 0xD4, + 0x64, 0xF4, 0x35, 0xED, 0x77, 0x04, 0xAC, 0x06, 0xFB, 0x0D, 0xAA, 0x23, + 0xEE, 0x12, 0xCE, 0x38, 0x97, 0x23, 0xE8, 0x45, 0x80, 0x3E, 0xEC, 0x4E, + 0x67, 0x43, 0x40, 0x4B, 0xDB, 0x31, 0xBA, 0x4A, 0x24, 0x20, 0x4A, 0x4A, + 0xAB, 0x13, 0xA6, 0x35, 0x64, 0x08, 0x50, 0x15, 0xC3, 0xFC, 0x17, 0xF5, + 0x11, 0xEF, 0xCC, 0xDE, 0x97, 0xDB, 0x1F, 0xD4, 0x7E, 0xCE, 0x60, 0xCF, + 0x0B, 0xD3, 0x75, 0xD0, 0xE4, 0xE3, 0xA5, 0xD8, 0x42, 0xF3, 0x76, 0xEB, + 0xC5, 0x04, 0x44, 0x07, 0xB0, 0x1F, 0x17, 0x1E, 0x71, 0x30, 0xD4, 0x29, + 0x76, 0x34, 0x90, 0x35, 0xCE, 0x32, 0x83, 0x39, 0x21, 0x2E, 0xE2, 0x3A, + 0xBD, 0x28, 0x8E, 0x3C, 0x4C, 0x26, 0xF6, 0x32, 0x0A, 0x2C, 0x97, 0x2F, + 0x5D, 0x27, 0xB0, 0x2E, 0xDB, 0x0E, 0xDE, 0x23, 0xFE, 0xF1, 0x7F, 0x14, + 0xE1, 0xDF, 0xBE, 0x00, 0xCF, 0xDE, 0x01, 0xF2, 0xBA, 0xEA, 0xD5, 0xF4, + 0x03, 0xF6, 0xFB, 0xFC, 0x4C, 0xFD, 0x7D, 0xF9, 0x8D, 0x05, 0x8F, 0xEF, + 0xC8, 0xFF, 0x1D, 0xEA, 0xB5, 0xEA, 0xAB, 0xE8, 0xBA, 0xE2, 0xEF, 0xE7, + 0xA6, 0xEE, 0x80, 0xE8, 0xB5, 0x05, 0x1F, 0xEA, 0xA2, 0x18, 0xF9, 0xE8, + 0xC0, 0x10, 0x62, 0xE5, 0xB3, 0xFE, 0x1B, 0xE4, 0xF0, 0xFC, 0x2F, 0xE6, + 0x29, 0x02, 0xAC, 0xED, 0x5F, 0x0B, 0xD5, 0xFE, 0x7F, 0x11, 0x41, 0x0B, + 0xC0, 0x09, 0x14, 0x08, 0xEF, 0xF9, 0xC1, 0xF8, 0x20, 0xED, 0xF2, 0xE7, + 0x61, 0xEB, 0xBE, 0xE5, 0x2A, 0xEC, 0x16, 0xF1, 0x00, 0xEE, 0x2D, 0x01, + 0xCF, 0xF7, 0x25, 0x11, 0x4E, 0xFC, 0x95, 0x1B, 0xBC, 0xE9, 0x79, 0x14, + 0x03, 0xD7, 0x3F, 0x09, 0xD6, 0xD8, 0xD3, 0x0B, 0x7C, 0xE5, 0xB3, 0x0D, + 0x7D, 0xF1, 0x8D, 0x05, 0xC9, 0xF6, 0x2D, 0x04, 0xBF, 0xF4, 0xEC, 0x07, + 0x9C, 0xF5, 0x99, 0x01, 0x09, 0x03, 0xAF, 0xFA, 0x35, 0x0F, 0xE8, 0xF9, + 0xCC, 0x15, 0x4A, 0x02, 0xF6, 0x1C, 0x87, 0x0E, 0x3E, 0x1F, 0xBD, 0x0E, + 0x47, 0x16, 0xCA, 0x01, 0x00, 0x07, 0x68, 0xF2, 0xFE, 0xFE, 0x2C, 0xE6, + 0x4A, 0xFA, 0x4C, 0xDD, 0x19, 0xE8, 0x8D, 0xDA, 0x36, 0xD9, 0x7E, 0xDD, + 0xB5, 0xDD, 0xF7, 0xD7, 0xF8, 0xE4, 0xC0, 0xCD, 0x82, 0xE9, 0x7B, 0xCF, + 0x4A, 0xF2, 0x9C, 0xDB, 0x5C, 0x06, 0xC5, 0xF2, 0x17, 0x24, 0x66, 0x09, + 0x88, 0x43, 0xB2, 0x22, 0x97, 0x49, 0xBD, 0x40, 0x93, 0x36, 0xC8, 0x4D, + 0x65, 0x25, 0xD6, 0x44, 0xF2, 0x15, 0xA2, 0x2F, 0xF8, 0x07, 0xCD, 0x15, + 0xFD, 0x01, 0x2C, 0x03, 0x63, 0xF9, 0x3B, 0xF4, 0xA9, 0xE9, 0xD3, 0xDB, + 0x5B, 0xD7, 0xBD, 0xC5, 0x0E, 0xC1, 0x43, 0xC3, 0x1B, 0xB1, 0x64, 0xD4, + 0xC8, 0xB5, 0x82, 0xE8, 0x12, 0xD1, 0xF3, 0xF0, 0xF2, 0xF2, 0x87, 0xEF, + 0xD5, 0x0E, 0xE0, 0xF4, 0x67, 0x17, 0xCB, 0xFE, 0x48, 0x1A, 0x6D, 0x11, + 0xF7, 0x2C, 0xE1, 0x26, 0xFB, 0x45, 0x00, 0x31, 0xE0, 0x51, 0x44, 0x39, + 0x26, 0x47, 0xF3, 0x38, 0xDA, 0x33, 0xF5, 0x2A, 0x3B, 0x1E, 0xA7, 0x12, + 0xED, 0x0C, 0x80, 0x01, 0xEF, 0x00, 0x25, 0x01, 0xFC, 0xF9, 0x2A, 0x04, + 0x62, 0xFB, 0x87, 0x07, 0xF0, 0xF9, 0xCD, 0x09, 0xCD, 0xFA, 0xE5, 0x05, + 0xB2, 0xF7, 0x6E, 0xFC, 0xC7, 0xEB, 0x41, 0xFC, 0x77, 0xE7, 0x3F, 0x03, + 0xA0, 0xE8, 0x1E, 0x01, 0xED, 0xEB, 0x88, 0xFE, 0xE7, 0xEE, 0xDF, 0x01, + 0x87, 0xEC, 0x99, 0x02, 0xC0, 0xF0, 0xBC, 0xFC, 0xC3, 0xFC, 0xCF, 0xF5, + 0x32, 0x05, 0x44, 0xF8, 0x57, 0x05, 0x59, 0x01, 0x37, 0xFB, 0x46, 0x02, + 0x72, 0xF4, 0xB5, 0xF6, 0x89, 0xFB, 0x6E, 0xE3, 0xC1, 0x08, 0xE9, 0xD7, + 0x45, 0x09, 0xE6, 0xD9, 0x17, 0xF6, 0x2A, 0xE4, 0x8F, 0xE7, 0xA7, 0xF3, + 0x52, 0xE5, 0xAC, 0xF5, 0xCC, 0xE7, 0xB9, 0xEF, 0x0E, 0xEE, 0x2F, 0xF0, + 0xFA, 0xEE, 0x96, 0xEA, 0xDA, 0xE9, 0x9D, 0xE6, 0xFA, 0xE8, 0xF7, 0xEC, + 0x86, 0xEC, 0x3C, 0xF2, 0xCF, 0xE7, 0x6B, 0xF6, 0x67, 0xE0, 0x43, 0xF9, + 0xAF, 0xE9, 0x10, 0xF2, 0xE9, 0xFB, 0x46, 0xE8, 0x5C, 0x06, 0x2B, 0xEE, + 0xB3, 0x0A, 0x19, 0x04, 0x68, 0x0C, 0x7C, 0x19, 0x4F, 0x0D, 0x8E, 0x25, + 0x2E, 0x0D, 0xDE, 0x27, 0xF5, 0x08, 0x2B, 0x25, 0xB9, 0xFF, 0xE1, 0x24, + 0x5D, 0xF8, 0x0F, 0x1E, 0xCD, 0xF5, 0x31, 0x03, 0xF6, 0xEA, 0x5F, 0xE0, + 0x3E, 0xD2, 0x35, 0xC7, 0xDA, 0xBC, 0xD9, 0xB7, 0x2D, 0xBC, 0xD4, 0xB0, + 0xFF, 0xD1, 0x3B, 0xBA, 0x7E, 0xF4, 0x16, 0xD7, 0x35, 0x1B, 0xDC, 0xF5, + 0x02, 0x3F, 0x07, 0x13, 0x2D, 0x49, 0x1D, 0x32, 0xE3, 0x41, 0x98, 0x49, + 0x48, 0x45, 0xAD, 0x55, 0x84, 0x4E, 0x7A, 0x59, 0xDD, 0x51, 0x70, 0x54, + 0x2A, 0x4A, 0x7C, 0x46, 0x2A, 0x32, 0x8D, 0x2E, 0x78, 0x0B, 0xA8, 0x0F, + 0x62, 0xE6, 0x7E, 0xF5, 0x00, 0xD4, 0x49, 0xE2, 0x67, 0xCE, 0x0E, 0xDD, + 0xB7, 0xC8, 0x8F, 0xE2, 0x1C, 0xCD, 0xAB, 0xE0, 0xA7, 0xD8, 0x0A, 0xDC, + 0x52, 0xE0, 0x76, 0xE1, 0x44, 0xF3, 0x94, 0xEF, 0x97, 0x0F, 0xF5, 0x02, + 0xC0, 0x23, 0x84, 0x17, 0x4A, 0x30, 0x16, 0x29, 0x16, 0x39, 0xDB, 0x36, + 0xD3, 0x36, 0xC5, 0x31, 0x35, 0x33, 0x9A, 0x1C, 0xC9, 0x33, 0xF6, 0x0C, + 0xC2, 0x2B, 0xB3, 0x07, 0x85, 0x1A, 0xBA, 0x0B, 0xC1, 0x09, 0x32, 0x17, + 0x6C, 0xFE, 0x68, 0x1C, 0x74, 0xFD, 0xE1, 0x11, 0xC4, 0x03, 0x72, 0x03, + 0x39, 0x00, 0xAA, 0xFC, 0xA0, 0xF6, 0x4A, 0xFC, 0xC6, 0xF2, 0x1A, 0xFB, + 0x79, 0xEE, 0x7C, 0x00, 0x96, 0xE7, 0x30, 0x09, 0x2D, 0xE5, 0xD6, 0x02, + 0xAD, 0xE7, 0x7C, 0xF7, 0xE2, 0xF4, 0x6E, 0xF9, 0x5D, 0x04, 0x99, 0xFD, + 0x71, 0x05, 0x02, 0xFB, 0x89, 0x04, 0xE8, 0xF4, 0xF6, 0x05, 0x15, 0xED, + 0xED, 0x00, 0x19, 0xE5, 0xCC, 0x02, 0x89, 0xE1, 0x34, 0x08, 0x9F, 0xEA, + 0x20, 0xFE, 0x5B, 0xF6, 0x4E, 0xF4, 0x09, 0xFB, 0x38, 0xF2, 0x0D, 0xF8, + 0xF2, 0xEC, 0xC9, 0xEF, 0xF9, 0xE5, 0xEF, 0xEF, 0x74, 0xDF, 0x3B, 0xF4, + 0x8B, 0xE3, 0xFF, 0xF1, 0xF8, 0xF1, 0x77, 0xF2, 0x79, 0xFA, 0xB1, 0xF5, + 0x6E, 0xF7, 0x03, 0xF6, 0xC9, 0xEA, 0x38, 0xF4, 0x86, 0xE6, 0xCA, 0xF5, + 0x0D, 0xF3, 0x41, 0xFB, 0x53, 0xFF, 0xA0, 0xFA, 0x1E, 0x08, 0xB9, 0xF9, + 0x33, 0x0A, 0xAA, 0x04, 0x06, 0xFF, 0xC6, 0x0B, 0x1E, 0xFD, 0xA0, 0x0A, + 0xE8, 0x0D, 0x66, 0x15, 0x06, 0x19, 0x12, 0x27, 0xDE, 0x1A, 0x40, 0x29, + 0x39, 0x19, 0x7D, 0x18, 0x48, 0x0D, 0x03, 0x02, 0x64, 0xF7, 0xDE, 0xEA, + 0x41, 0xDD, 0xA5, 0xD3, 0xD5, 0xC9, 0x0C, 0xC5, 0xA2, 0xCF, 0x5B, 0xC5, + 0xAB, 0xDF, 0x45, 0xC6, 0x25, 0xE9, 0xF5, 0xC5, 0x55, 0xF3, 0x7C, 0xD0, + 0x5A, 0x00, 0x3B, 0xE2, 0xF2, 0x16, 0xCF, 0xF1, 0x40, 0x36, 0x54, 0x01, + 0xBF, 0x47, 0xF9, 0x1F, 0xE7, 0x39, 0xBD, 0x42, 0xDF, 0x23, 0x44, 0x51, + 0xA1, 0x1B, 0x93, 0x4E, 0xE9, 0x16, 0xB6, 0x45, 0xA6, 0x14, 0xCC, 0x36, + 0xCC, 0x12, 0xC5, 0x22, 0xFE, 0xFE, 0x7F, 0x0D, 0xC1, 0xDF, 0x50, 0xFB, + 0x52, 0xC5, 0xF7, 0xED, 0xB2, 0xB4, 0x71, 0xE5, 0x93, 0xB2, 0xA0, 0xE3, + 0xBB, 0xC3, 0xEC, 0xE5, 0xFD, 0xE4, 0x00, 0xEB, 0xF1, 0x02, 0x41, 0xF9, + 0x3A, 0x15, 0xE7, 0x0A, 0xE7, 0x23, 0x20, 0x12, 0x1A, 0x27, 0xC0, 0x0F, + 0xAC, 0x26, 0xA6, 0x0D, 0x63, 0x30, 0xB8, 0x10, 0xA9, 0x35, 0x4E, 0x16, + 0x90, 0x33, 0xB0, 0x1D, 0x47, 0x2A, 0xDC, 0x21, 0x6F, 0x19, 0x28, 0x18, + 0x59, 0x10, 0x96, 0x06, 0xE8, 0x0A, 0xC4, 0xFD, 0xF0, 0xFD, 0xD1, 0xF9, + 0xD3, 0xF2, 0x49, 0xF0, 0xA5, 0xF2, 0x49, 0xE7, 0xC6, 0xF6, 0xB9, 0xDF, + 0x7F, 0xF2, 0x08, 0xD9, 0x42, 0xE2, 0x95, 0xDB, 0xED, 0xD4, 0x9F, 0xE7, + 0xD1, 0xDB, 0x24, 0xF2, 0xF0, 0xF3, 0xD7, 0xF6, 0xE4, 0x0A, 0x88, 0xF9, + 0x70, 0x12, 0xCC, 0xFC, 0xC7, 0x09, 0x16, 0x00, 0x5D, 0xFE, 0xF5, 0xFE, + 0xCB, 0x00, 0xD9, 0xFE, 0x9A, 0x06, 0x73, 0x06, 0x15, 0x02, 0x78, 0x0B, + 0x8D, 0xFA, 0x19, 0x03, 0x0B, 0xF8, 0x6A, 0xF7, 0xE8, 0xF1, 0x5E, 0xF1, + 0xAC, 0xE2, 0xAD, 0xEA, 0xB3, 0xD7, 0x3C, 0xE5, 0x76, 0xD3, 0xC0, 0xE7, + 0xAF, 0xCE, 0x43, 0xEA, 0x45, 0xD3, 0xB1, 0xEA, 0xC9, 0xE2, 0x37, 0xF5, + 0x75, 0xEB, 0x58, 0x02, 0x22, 0xE8, 0x32, 0x02, 0x52, 0xE6, 0xBE, 0xF5, + 0x04, 0xF3, 0x36, 0xE7, 0x4A, 0xFF, 0xB2, 0xDB, 0x22, 0xF9, 0xA0, 0xD8, + 0x93, 0xF0, 0x94, 0xE1, 0x3A, 0xF9, 0x41, 0xED, 0xF1, 0x07, 0x00, 0xF3, + 0x8F, 0x0A, 0x4D, 0xFE, 0x52, 0x08, 0x53, 0x1A, 0x27, 0x08, 0x83, 0x33, + 0x03, 0x0A, 0x82, 0x3D, 0xEF, 0x0F, 0x85, 0x3B, 0x0A, 0x0F, 0xDF, 0x2B, + 0xEA, 0xF9, 0x85, 0x10, 0xDE, 0xE2, 0xD9, 0xF9, 0x57, 0xD8, 0x0C, 0xE6, + 0x73, 0xD4, 0x24, 0xCB, 0x8E, 0xD3, 0xDC, 0xBA, 0x2A, 0xD2, 0xE4, 0xBE, + 0x87, 0xD5, 0xA2, 0xC8, 0x65, 0xE4, 0xF2, 0xCE, 0xE8, 0x01, 0x3C, 0xDD, + 0x4A, 0x21, 0x98, 0xF7, 0x71, 0x36, 0xD8, 0x15, 0xCC, 0x3F, 0x57, 0x2D, + 0x43, 0x46, 0x7B, 0x39, 0xE1, 0x4F, 0xEB, 0x39, 0x54, 0x48, 0x94, 0x30, + 0x33, 0x28, 0x08, 0x23, 0x5C, 0x0F, 0xE7, 0x0D, 0xDF, 0x08, 0xE3, 0xF0, + 0x8B, 0xFE, 0x08, 0xD9, 0xAB, 0xE9, 0x39, 0xCF, 0x35, 0xD1, 0xCE, 0xCF, + 0x78, 0xC4, 0x0C, 0xD5, 0x6C, 0xCD, 0x2A, 0xDB, 0x50, 0xE6, 0xC8, 0xE7, + 0x2E, 0x02, 0x6A, 0xFD, 0xDD, 0x0D, 0xE1, 0x15, 0x9E, 0x0D, 0x98, 0x2D, + 0xE5, 0x16, 0x96, 0x3B, 0x61, 0x28, 0x59, 0x40, 0xB8, 0x34, 0xB2, 0x48, + 0x62, 0x38, 0xCC, 0x4A, 0xDE, 0x38, 0xF2, 0x41, 0x4F, 0x2F, 0xC6, 0x38, + 0x4B, 0x18, 0xA0, 0x2D, 0xF4, 0x01, 0xE4, 0x1D, 0xBC, 0xF1, 0x89, 0x0E, + 0xC7, 0xE5, 0x58, 0x07, 0x95, 0xE5, 0xC9, 0x03, 0xB6, 0xFB, 0x3D, 0xFF, + 0xCB, 0x0F, 0xF4, 0xFA, 0xB8, 0x08, 0x54, 0xF8, 0x18, 0xF9, 0x8B, 0xF3, + 0x4A, 0xF6, 0x08, 0xED, 0x25, 0xF7, 0xE5, 0xE8, 0x9D, 0xF8, 0x98, 0xEE, + 0xCA, 0xFD, 0xE7, 0xFB, 0xEF, 0x04, 0x13, 0x03, 0x62, 0x0F, 0x06, 0xFF, + 0x9B, 0x14, 0x36, 0xF6, 0xF8, 0x0F, 0xD3, 0xF5, 0xB8, 0x01, 0x98, 0xFB, + 0xF8, 0xF6, 0xB3, 0xFF, 0x9D, 0xF9, 0x29, 0xFD, 0x61, 0x00, 0xA1, 0xF2, + 0x2D, 0xFF, 0xDE, 0xEC, 0xE2, 0xF3, 0x82, 0xF0, 0x75, 0xE8, 0x67, 0xF4, + 0xB8, 0xE5, 0xE8, 0xF5, 0x8D, 0xEF, 0x0E, 0xF1, 0x9E, 0xFE, 0x1A, 0xE8, + 0xE4, 0x00, 0x63, 0xE7, 0x1A, 0xF5, 0x86, 0xE9, 0x63, 0xEC, 0x46, 0xEA, + 0xDD, 0xEC, 0xD4, 0xED, 0x0F, 0xF1, 0x20, 0xF1, 0x3D, 0xEE, 0x3F, 0xF5, + 0x8D, 0xE3, 0xE5, 0xF9, 0x20, 0xE3, 0x22, 0xF9, 0xBA, 0xF0, 0xD0, 0xF7, + 0x9D, 0x02, 0x60, 0xFC, 0x24, 0x14, 0x53, 0x06, 0x5F, 0x21, 0x09, 0x17, + 0x65, 0x24, 0x52, 0x24, 0xBE, 0x23, 0x3B, 0x2A, 0xE4, 0x23, 0xF1, 0x2B, + 0x89, 0x1B, 0xC5, 0x27, 0x2E, 0x0C, 0x18, 0x19, 0x71, 0xFF, 0xE8, 0xFE, + 0x4F, 0xF5, 0x86, 0xE4, 0x39, 0xE9, 0xDD, 0xD5, 0x69, 0xD8, 0x9A, 0xD3, + 0xE9, 0xCB, 0x01, 0xDA, 0xBD, 0xD9, 0x62, 0xE5, 0x7A, 0x03, 0x36, 0xF0, + 0xC7, 0x2C, 0xB8, 0x01, 0xC7, 0x3E, 0x7E, 0x1F, 0x4B, 0x42, 0xE4, 0x37, + 0xC1, 0x45, 0x50, 0x41, 0xCD, 0x46, 0xBC, 0x44, 0x52, 0x42, 0xD0, 0x47, + 0xBF, 0x35, 0x35, 0x49, 0x3E, 0x1E, 0xF1, 0x43, 0xED, 0x05, 0xDE, 0x31, + 0x75, 0xF7, 0x4A, 0x18, 0x6F, 0xE9, 0x2D, 0xFA, 0xF3, 0xD2, 0xD5, 0xDC, + 0x15, 0xC6, 0xCB, 0xCE, 0xDC, 0xCF, 0xC1, 0xC8, 0x5F, 0xE0, 0xBE, 0xC9, + 0x1D, 0xED, 0xC1, 0xDB, 0x67, 0xFB, 0x99, 0xF5, 0xC5, 0x09, 0x2F, 0x08, + 0xD5, 0x15, 0x3A, 0x13, 0x67, 0x20, 0x2D, 0x1F, 0x57, 0x2F, 0x2A, 0x29, + 0x29, 0x3E, 0xCF, 0x29, 0xD3, 0x3A, 0xD3, 0x25, 0xF0, 0x2D, 0x34, 0x21, + 0xF7, 0x20, 0x9A, 0x19, 0xC2, 0x0B, 0xD3, 0x14, 0xE5, 0xF7, 0x13, 0x11, + 0x2B, 0xEF, 0xB8, 0x06, 0xDE, 0xED, 0xC6, 0xFA, 0xCD, 0xF5, 0xDF, 0xF2, + 0xFA, 0xFB, 0xEF, 0xF0, 0x30, 0xF9, 0x7B, 0xF2, 0x28, 0xF6, 0x67, 0xF2, + 0x64, 0xF2, 0x99, 0xF0, 0xA0, 0xF1, 0x5A, 0xF4, 0x40, 0xF2, 0xD8, 0xF6, + 0x76, 0xEF, 0x0A, 0xF5, 0xD7, 0xEA, 0xC2, 0xF9, 0x3F, 0xE5, 0x01, 0xFA, + 0xE1, 0xE8, 0xF3, 0xF2, 0x9E, 0xF0, 0x6C, 0xF2, 0xD1, 0xF1, 0xA2, 0xF5, + 0xC9, 0xF1, 0xB3, 0xF3, 0xEB, 0xF1, 0x66, 0xF1, 0x46, 0xF0, 0x2F, 0xF3, + 0x57, 0xF1, 0x0A, 0xF3, 0x18, 0xF9, 0x60, 0xF1, 0x47, 0x02, 0x1C, 0xF2, + 0xC0, 0x02, 0x52, 0xF4, 0x78, 0xFC, 0x1D, 0xF6, 0xC1, 0xF8, 0x40, 0xF5, + 0x51, 0xF8, 0xA9, 0xF0, 0xE0, 0xFD, 0xF1, 0xEF, 0x1E, 0x02, 0x2A, 0xF8, + 0xD9, 0xFD, 0x8E, 0x01, 0xAE, 0xF3, 0xC7, 0x06, 0x97, 0xE4, 0x50, 0x07, + 0xF0, 0xDA, 0xB2, 0xFF, 0x5E, 0xDE, 0x45, 0xEE, 0x1B, 0xE9, 0xC7, 0xDF, + 0x90, 0xF2, 0x0A, 0xDE, 0x93, 0xFA, 0x76, 0xE7, 0x17, 0x02, 0xBB, 0xFA, + 0x1C, 0x04, 0xA5, 0x0D, 0x4C, 0x04, 0xF4, 0x14, 0x34, 0x06, 0xD3, 0x0F, + 0x52, 0x03, 0x0F, 0x05, 0x52, 0xFB, 0x54, 0x01, 0x69, 0xEF, 0x00, 0xFD, + 0x3F, 0xE5, 0x44, 0xED, 0x98, 0xE3, 0xB2, 0xD8, 0x18, 0xE2, 0x5F, 0xC8, + 0xB2, 0xDD, 0x49, 0xC2, 0xAF, 0xDF, 0x8E, 0xC9, 0x26, 0xEA, 0x33, 0xDB, + 0x06, 0xF9, 0xB0, 0xED, 0x7F, 0x0B, 0x3C, 0x00, 0x1C, 0x20, 0xAC, 0x15, + 0x54, 0x33, 0xF4, 0x2B, 0xE1, 0x41, 0xBF, 0x3B, 0xCB, 0x44, 0x73, 0x42, + 0xD6, 0x37, 0x2C, 0x42, 0x7A, 0x26, 0x68, 0x39, 0x76, 0x16, 0x34, 0x29, + 0xC0, 0x01, 0xA5, 0x12, 0xDB, 0xEB, 0x4F, 0xF4, 0x7F, 0xDB, 0x03, 0xD5, + 0xCB, 0xD3, 0x11, 0xBF, 0x5D, 0xD3, 0xB2, 0xB5, 0xED, 0xD4, 0xA8, 0xC0, + 0xC6, 0xD4, 0xA3, 0xD9, 0x41, 0xDD, 0x03, 0xF1, 0x21, 0xF7, 0x95, 0x09, + 0x98, 0x14, 0x54, 0x1D, 0x9F, 0x25, 0x41, 0x24, 0xCF, 0x29, 0x61, 0x21, + 0xF4, 0x24, 0xD1, 0x1F, 0x61, 0x1C, 0x64, 0x28, 0x41, 0x20, 0x57, 0x2E, + 0x24, 0x29, 0xD3, 0x29, 0xFD, 0x23, 0xC6, 0x26, 0x30, 0x18, 0x1C, 0x1F, + 0x23, 0x0E, 0xAD, 0x0D, 0xD0, 0xFE, 0xCB, 0x00, 0x99, 0xF0, 0xBD, 0xFD, + 0xFC, 0xF0, 0x0B, 0x03, 0x8E, 0xFD, 0xC5, 0x08, 0xA1, 0x10, 0x96, 0x0D, + 0xD3, 0x17, 0xD9, 0x13, 0x7E, 0x08, 0xB4, 0x11, 0x22, 0xF0, 0x4C, 0x04, + 0xCE, 0xDE, 0x81, 0xF5, 0x73, 0xDD, 0xC7, 0xEA, 0x79, 0xE6, 0x35, 0xE2, + 0x88, 0xED, 0x41, 0xDB, 0x3A, 0xF1, 0x7C, 0xDC, 0xB8, 0xF7, 0x26, 0xE0, + 0x67, 0xFD, 0x3A, 0xE0, 0x6D, 0x00, 0x66, 0xE4, 0xD3, 0x05, 0x5A, 0xE6, + 0xCE, 0x08, 0x49, 0xE1, 0xAE, 0x02, 0xAC, 0xDE, 0x17, 0xF8, 0x98, 0xDE, + 0xF8, 0xF0, 0x65, 0xE0, 0x87, 0xEC, 0xB4, 0xE7, 0x5C, 0xE9, 0x7D, 0xF2, + 0x7D, 0xEA, 0x46, 0xFD, 0xE0, 0xEC, 0x26, 0x04, 0xD9, 0xEB, 0x10, 0x0B, + 0xF9, 0xE4, 0x0C, 0x0F, 0xA0, 0xDB, 0x5D, 0x07, 0x4F, 0xDA, 0x6F, 0xFF, + 0x72, 0xE4, 0xEA, 0xFE, 0x11, 0xEE, 0x06, 0x03, 0xDA, 0xF1, 0x66, 0x0A, + 0x74, 0xF7, 0x59, 0x0E, 0x19, 0xFE, 0x55, 0x0C, 0xD6, 0x04, 0x78, 0x0C, + 0x2A, 0x0C, 0xC0, 0x10, 0xC5, 0x0F, 0xB4, 0x12, 0xCD, 0x0C, 0x25, 0x12, + 0x74, 0x09, 0x6B, 0x0D, 0x19, 0x0F, 0xCB, 0x04, 0x83, 0x13, 0x5C, 0xFA, + 0xF9, 0x05, 0xE9, 0xF0, 0x17, 0xEB, 0x55, 0xEC, 0x4C, 0xD5, 0x86, 0xE3, + 0xDC, 0xCF, 0x8D, 0xD4, 0x3D, 0xD6, 0x0A, 0xCD, 0xBF, 0xE2, 0x46, 0xCB, + 0x7E, 0xF9, 0x03, 0xCD, 0x25, 0x13, 0x99, 0xDE, 0xC1, 0x24, 0x8B, 0xFC, + 0x6D, 0x37, 0x8F, 0x16, 0xA8, 0x4B, 0x25, 0x24, 0xB8, 0x54, 0x87, 0x27, + 0x8F, 0x50, 0x57, 0x28, 0x99, 0x41, 0x2B, 0x24, 0x7E, 0x29, 0x23, 0x1C, + 0xB0, 0x0E, 0x7F, 0x17, 0x6E, 0xF9, 0xDC, 0x0F, 0x67, 0xEB, 0xEC, 0x02, + 0xF9, 0xE2, 0x5E, 0xF6, 0x2A, 0xDF, 0x78, 0xF0, 0xA5, 0xD8, 0x72, 0xF0, + 0xE8, 0xCD, 0xDB, 0xED, 0x06, 0xCA, 0x0D, 0xEA, 0x3B, 0xD7, 0x51, 0xEF, + 0x0B, 0xF5, 0x40, 0x01, 0x0F, 0x14, 0x6F, 0x1A, 0xA1, 0x27, 0x4F, 0x31, + 0x0B, 0x2F, 0x6A, 0x3D, 0xC5, 0x2A, 0xFF, 0x3D, 0x87, 0x1F, 0xDE, 0x2F, + 0x2E, 0x15, 0xE2, 0x1C, 0x9B, 0x0B, 0x6E, 0x12, 0x18, 0x07, 0x59, 0x07, + 0x2A, 0x0A, 0x8A, 0xF8, 0x22, 0x13, 0xB3, 0xED, 0x15, 0x17, 0xBD, 0xE6, + 0x23, 0x08, 0x42, 0xE8, 0x54, 0xF3, 0xE9, 0xF8, 0x18, 0xEE, 0x24, 0x0E, + 0xA6, 0xF7, 0x0B, 0x1A, 0x75, 0x01, 0x5D, 0x1B, 0x16, 0x07, 0x0C, 0x18, + 0xDF, 0x0A, 0x48, 0x13, 0x3C, 0x07, 0x96, 0x0E, 0x7D, 0xF9, 0x23, 0x0D, + 0x5C, 0xED, 0xC6, 0x0B, 0xEF, 0xE9, 0xDF, 0x05, 0xDA, 0xEA, 0x70, 0xFA, + 0x9F, 0xE8, 0x00, 0xEA, 0x4E, 0xE2, 0xF0, 0xDB, 0x27, 0xDC, 0xAD, 0xD3, + 0x87, 0xD7, 0xEC, 0xCD, 0xBF, 0xDE, 0xF3, 0xCE, 0xDA, 0xF2, 0x78, 0xD9, + 0x2C, 0x05, 0x71, 0xEA, 0xEC, 0x0B, 0x6F, 0xFA, 0xCC, 0x06, 0x42, 0x01, + 0x4F, 0x01, 0xE5, 0xFC, 0x47, 0xFC, 0xE4, 0xEF, 0xEA, 0xF1, 0x26, 0xE1, + 0xD1, 0xEA, 0xB2, 0xD5, 0x10, 0xEB, 0x91, 0xD1, 0x27, 0xE9, 0x0A, 0xD3, + 0x0F, 0xEB, 0x31, 0xD5, 0x24, 0xFB, 0xE4, 0xDB, 0x7B, 0x07, 0x5A, 0xE6, + 0xB2, 0x06, 0x5C, 0xEF, 0x67, 0x07, 0x4D, 0xFB, 0x82, 0x0D, 0x2C, 0x09, + 0xBF, 0x15, 0x55, 0x15, 0xB1, 0x1D, 0x67, 0x25, 0xEA, 0x1E, 0x0D, 0x33, + 0xC0, 0x13, 0xD6, 0x33, 0x58, 0xFC, 0xE5, 0x2D, 0x6F, 0xDE, 0x94, 0x24, + 0x9D, 0xC1, 0x96, 0x10, 0xFD, 0xAB, 0x29, 0xF8, 0xB9, 0xA7, 0x30, 0xE5, + 0x09, 0xBC, 0xA9, 0xD7, 0x68, 0xD6, 0x49, 0xD6, 0x3A, 0xE5, 0xE6, 0xE5, + 0x4F, 0xF2, 0x18, 0xFC, 0x9B, 0x0A, 0xDF, 0x0A, 0xD9, 0x2C, 0x70, 0x17, + 0x9E, 0x4A, 0x6A, 0x29, 0xF5, 0x54, 0x47, 0x34, 0x09, 0x4D, 0xD8, 0x2D, + 0xB2, 0x3C, 0x6D, 0x1B, 0x8A, 0x2A, 0x6E, 0x04, 0xF4, 0x18, 0xDC, 0xF2, + 0x2B, 0x06, 0x1E, 0xEC, 0x83, 0xF5, 0xB7, 0xE7, 0x1D, 0xEA, 0xCE, 0xE5, + 0x3D, 0xE5, 0x1D, 0xE7, 0xAB, 0xE9, 0xE6, 0xE6, 0x4A, 0xEC, 0xA4, 0xEA, + 0xB7, 0xE6, 0x42, 0xF1, 0x52, 0xE6, 0x00, 0xFA, 0xBD, 0xF3, 0xD3, 0x08, + 0xF5, 0x08, 0x01, 0x18, 0xCE, 0x19, 0x88, 0x25, 0x91, 0x20, 0xD5, 0x2B, + 0xE9, 0x21, 0x7A, 0x26, 0x00, 0x20, 0x12, 0x1B, 0xD2, 0x19, 0xA0, 0x0C, + 0xD0, 0x10, 0xCF, 0xFF, 0x50, 0x0C, 0xFD, 0xF7, 0x11, 0x0D, 0x38, 0xF2, + 0xD5, 0x0C, 0xB0, 0xF3, 0x4B, 0x0D, 0xD1, 0x00, 0x07, 0x0B, 0x94, 0x0E, + 0xC3, 0x01, 0xC1, 0x13, 0xF7, 0xFB, 0x4C, 0x12, 0x95, 0xFE, 0xCA, 0x0D, + 0xA3, 0x00, 0x0E, 0x05, 0x0C, 0x02, 0x83, 0xFE, 0xBA, 0x02, 0xBD, 0xFC, + 0x08, 0x02, 0x8A, 0xFB, 0x99, 0x08, 0xD1, 0xFA, 0x81, 0x13, 0xF9, 0xF8, + 0xF9, 0x10, 0x43, 0xFC, 0xF7, 0x01, 0x95, 0x00, 0xC4, 0xF7, 0x31, 0xFD, + 0xF1, 0xF8, 0x77, 0xFA, 0xB0, 0xFF, 0x49, 0xF7, 0xB7, 0x02, 0x5D, 0xF2, + 0x90, 0x00, 0x28, 0xF3, 0x01, 0xFC, 0x9D, 0xF7, 0x38, 0xF7, 0x81, 0xFB, + 0x1C, 0xF4, 0x34, 0xFD, 0xE6, 0xEF, 0xAE, 0xFB, 0xEF, 0xEC, 0x36, 0xFC, + 0x8F, 0xF1, 0x0D, 0x01, 0xB3, 0xF6, 0xF0, 0x02, 0xA3, 0xF5, 0x50, 0x01, + 0xFA, 0xF0, 0x54, 0x01, 0xDB, 0xEC, 0x83, 0xFF, 0x3A, 0xEE, 0x68, 0xFA, + 0xBD, 0xF3, 0x32, 0xF8, 0x7B, 0xF6, 0xA8, 0xF6, 0xDB, 0xF6, 0x73, 0xF3, + 0x9D, 0xFB, 0xDA, 0xF1, 0xA6, 0x03, 0xE0, 0xF3, 0x80, 0x09, 0xBE, 0xF9, + 0x99, 0x10, 0xFD, 0x03, 0xB2, 0x16, 0xAF, 0x13, 0x1B, 0x13, 0xE1, 0x1C, + 0x32, 0x0B, 0xC1, 0x1B, 0xE0, 0x02, 0x14, 0x1B, 0xAD, 0xF7, 0x3C, 0x11, + 0x6F, 0xE6, 0x67, 0xF9, 0x64, 0xCC, 0x9E, 0xE3, 0x4B, 0xB9, 0xC3, 0xD6, + 0x06, 0xBB, 0xA8, 0xD2, 0x91, 0xC8, 0x51, 0xD8, 0xF0, 0xDC, 0xD8, 0xE5, + 0x0F, 0xF6, 0x73, 0xF4, 0xB6, 0x08, 0x54, 0x00, 0x68, 0x17, 0x52, 0x0A, + 0xB6, 0x2A, 0x9B, 0x13, 0xCF, 0x3B, 0x33, 0x1B, 0x88, 0x43, 0xBF, 0x20, + 0xCE, 0x43, 0x2E, 0x23, 0xB4, 0x3F, 0x04, 0x1B, 0xFB, 0x30, 0xB1, 0x08, + 0x9B, 0x10, 0x16, 0xF7, 0xAC, 0xEB, 0x9B, 0xE9, 0xA2, 0xD7, 0x7E, 0xDE, + 0x30, 0xD5, 0x8E, 0xD8, 0x72, 0xD9, 0xE3, 0xD8, 0x08, 0xDF, 0x58, 0xDF, + 0xBC, 0xE5, 0xAA, 0xEA, 0x03, 0xEF, 0xC4, 0xF7, 0x73, 0xFE, 0xD4, 0x0A, + 0x5E, 0x11, 0xD7, 0x1E, 0x08, 0x1F, 0x11, 0x2F, 0x14, 0x28, 0x8D, 0x42, + 0x7A, 0x2C, 0xFC, 0x4F, 0x6D, 0x2B, 0x81, 0x49, 0x61, 0x2B, 0xB5, 0x34, + 0x7A, 0x2C, 0x5E, 0x23, 0xDA, 0x24, 0xAE, 0x1C, 0x0C, 0x13, 0x84, 0x1A, + 0xE7, 0x03, 0x93, 0x19, 0xA2, 0x00, 0x4F, 0x15, 0xCD, 0x03, 0x6D, 0x08, + 0xAF, 0x07, 0xB9, 0xFB, 0xF1, 0x0E, 0x94, 0xFB, 0x0F, 0x13, 0x3A, 0x01, + 0xBF, 0x11, 0x09, 0x05, 0xAD, 0x10, 0xC6, 0x0B, 0x6A, 0x03, 0x85, 0x11, + 0xE8, 0xF0, 0x70, 0x0D, 0x31, 0xF0, 0x4A, 0xFE, 0xCB, 0xF6, 0x8C, 0xEE, + 0x23, 0xF7, 0xB5, 0xE5, 0x32, 0xF3, 0xB6, 0xDF, 0xB1, 0xED, 0x2A, 0xDB, + 0xA9, 0xED, 0x07, 0xDA, 0x17, 0xF3, 0xBA, 0xD9, 0xD4, 0xF7, 0xD4, 0xD9, + 0x4F, 0xFB, 0xC8, 0xE4, 0x0D, 0xFC, 0x11, 0xFA, 0x19, 0xFC, 0xE7, 0x09, + 0x3E, 0xFE, 0x1F, 0x0D, 0xF2, 0xFB, 0xA7, 0x0B, 0xC9, 0xF4, 0x04, 0x0E, + 0x54, 0xEF, 0x3A, 0x10, 0xCB, 0xF0, 0xB3, 0x0A, 0x2F, 0xFA, 0xF0, 0xFE, + 0x5B, 0x00, 0x1E, 0xF3, 0xC6, 0xF7, 0x4F, 0xED, 0x0F, 0xE8, 0x12, 0xE6, + 0x69, 0xE1, 0xF7, 0xD3, 0x31, 0xE7, 0x0E, 0xCA, 0x88, 0xF7, 0x87, 0xD1, + 0x68, 0x07, 0xE9, 0xDE, 0x81, 0x0E, 0x3D, 0xF3, 0xC8, 0x17, 0x3F, 0x0C, + 0x81, 0x1C, 0xCD, 0x1E, 0x88, 0x12, 0xBD, 0x25, 0x09, 0x0B, 0x37, 0x22, + 0x28, 0x10, 0x6F, 0x15, 0x79, 0x13, 0xD4, 0x04, 0x2D, 0x03, 0x1C, 0xF7, + 0xFE, 0xE4, 0xEA, 0xE8, 0xC8, 0xC6, 0xE2, 0xDA, 0x5A, 0xAB, 0xF4, 0xD4, + 0x4A, 0xA4, 0xA4, 0xDC, 0x8D, 0xC0, 0xC9, 0xEE, 0x46, 0xED, 0x65, 0xFF, + 0x9B, 0x10, 0xCD, 0x0E, 0x6F, 0x25, 0x9F, 0x21, 0x37, 0x33, 0x33, 0x31, + 0x1F, 0x3A, 0x51, 0x3C, 0xF1, 0x3B, 0x91, 0x44, 0x9D, 0x39, 0x27, 0x42, + 0xDC, 0x2C, 0xC2, 0x32, 0x6A, 0x1E, 0x1F, 0x18, 0x1B, 0x10, 0xBB, 0xF4, + 0x05, 0xF7, 0xF0, 0xD4, 0xC6, 0xDB, 0x1A, 0xC0, 0xB2, 0xC9, 0x0A, 0xBB, + 0xCD, 0xC5, 0x8E, 0xC0, 0x73, 0xD1, 0x64, 0xC6, 0xBB, 0xE4, 0x6E, 0xD1, + 0x46, 0xF7, 0x9E, 0xE2, 0x6F, 0x06, 0x13, 0xF3, 0xC1, 0x18, 0xEF, 0xFF, + 0x12, 0x2D, 0x4C, 0x0B, 0xC0, 0x37, 0x68, 0x18, 0xB4, 0x35, 0xDC, 0x20, + 0x27, 0x2C, 0x70, 0x1C, 0x35, 0x19, 0x0E, 0x15, 0x48, 0x00, 0x27, 0x17, + 0x02, 0xF1, 0xB9, 0x1B, 0x5D, 0xEF, 0xC8, 0x1D, 0x1D, 0xF1, 0xC2, 0x22, + 0xDD, 0xF3, 0xF7, 0x27, 0x6D, 0xFB, 0x71, 0x26, 0x4F, 0x00, 0xFE, 0x23, + 0x38, 0xFE, 0x80, 0x21, 0x5A, 0xFE, 0x40, 0x17, 0xCF, 0x04, 0x4A, 0x10, + 0x95, 0x09, 0xB9, 0x11, 0xE3, 0x07, 0x00, 0x0F, 0x04, 0xFC, 0x16, 0x06, + 0xF1, 0xEA, 0xC0, 0xFD, 0x36, 0xE7, 0x10, 0xF4, 0xE6, 0xEF, 0xE8, 0xE9, + 0x00, 0xF7, 0x84, 0xE2, 0x17, 0xFB, 0xB2, 0xDE, 0x0B, 0xF8, 0x45, 0xE6, + 0xAC, 0xEC, 0x79, 0xED, 0xEB, 0xE7, 0xE1, 0xEA, 0x8D, 0xF1, 0xBD, 0xEC, + 0x2D, 0x03, 0x49, 0xF4, 0x2E, 0x13, 0xF8, 0xF7, 0xD2, 0x1B, 0xB0, 0xF5, + 0xD2, 0x1A, 0x06, 0xF1, 0x89, 0x0A, 0xD1, 0xEA, 0xB6, 0xF1, 0xD6, 0xE3, + 0x26, 0xE7, 0x72, 0xE2, 0x8B, 0xEB, 0x93, 0xE8, 0xD7, 0xF4, 0x5F, 0xEF, + 0xC2, 0xFE, 0x74, 0xF1, 0x6F, 0x00, 0x20, 0xF1, 0xFC, 0xF7, 0xDA, 0xED, + 0xAF, 0xF0, 0x05, 0xEE, 0x70, 0xF7, 0x02, 0xF3, 0xDE, 0x05, 0xB4, 0xF3, + 0xED, 0x0E, 0x1A, 0xF5, 0xA9, 0x15, 0x82, 0xFC, 0xA5, 0x18, 0x10, 0x04, + 0x54, 0x0D, 0x33, 0x0C, 0x6E, 0xF9, 0x1C, 0x1A, 0x13, 0xEF, 0x45, 0x21, + 0x7B, 0xED, 0xDC, 0x16, 0x62, 0xE5, 0x4C, 0x03, 0x4B, 0xDA, 0x9E, 0xEF, + 0xAA, 0xCD, 0xAD, 0xDE, 0x44, 0xBE, 0x4A, 0xD5, 0x7A, 0xBE, 0x88, 0xD5, + 0x99, 0xCC, 0x9B, 0xDE, 0x4B, 0xDC, 0xB2, 0xEE, 0x4B, 0xF6, 0x68, 0xFD, + 0xC6, 0x17, 0x9D, 0x07, 0x5E, 0x30, 0xEC, 0x0F, 0x4D, 0x3A, 0x51, 0x18, + 0xC8, 0x34, 0x61, 0x23, 0xAC, 0x26, 0x93, 0x2B, 0xAB, 0x1A, 0xF3, 0x2C, + 0xC1, 0x0E, 0xEC, 0x29, 0x02, 0x03, 0x83, 0x1C, 0x21, 0xFB, 0x77, 0x02, + 0xA3, 0xEE, 0x26, 0xE7, 0xDB, 0xDF, 0xCA, 0xD5, 0x67, 0xDA, 0xEF, 0xD0, + 0x28, 0xDC, 0xFD, 0xD2, 0x27, 0xE0, 0x34, 0xD8, 0x93, 0xE9, 0x13, 0xE3, + 0xEE, 0xFE, 0x30, 0xEE, 0x80, 0x16, 0xDD, 0xF6, 0x04, 0x22, 0x55, 0x06, + 0xF4, 0x26, 0x22, 0x1A, 0xDF, 0x28, 0x97, 0x27, 0xD6, 0x22, 0xB0, 0x2C, + 0xF6, 0x19, 0x0B, 0x2B, 0x33, 0x14, 0xF2, 0x23, 0x8D, 0x0E, 0xA4, 0x1A, + 0x18, 0x09, 0x66, 0x10, 0x94, 0x03, 0x6F, 0x04, 0x03, 0xFD, 0x0C, 0xF5, + 0x35, 0xFB, 0x73, 0xE9, 0x74, 0xFB, 0x8A, 0xEC, 0x23, 0xFD, 0xFE, 0xF5, + 0x7A, 0x0B, 0x4A, 0xFC, 0xE0, 0x22, 0x7D, 0x00, 0x84, 0x31, 0xB0, 0x04, + 0x5C, 0x2F, 0x2D, 0x05, 0x22, 0x1F, 0x39, 0x03, 0x39, 0x0D, 0x86, 0x02, + 0xAB, 0x02, 0xEE, 0x03, 0xB7, 0xF6, 0x29, 0x08, 0x38, 0xE7, 0xB3, 0x06, + 0xB7, 0xD8, 0xDA, 0xFE, 0x05, 0xCA, 0xDA, 0xF9, 0xF9, 0xC3, 0xC2, 0xFB, + 0x1E, 0xCE, 0x0B, 0xFE, 0x0F, 0xDE, 0x43, 0xFF, 0xB7, 0xEB, 0xC6, 0x06, + 0x27, 0xFA, 0xA0, 0x0C, 0x8F, 0x07, 0x07, 0x0B, 0x09, 0x11, 0x77, 0x0D, + 0x96, 0x17, 0x10, 0x14, 0x34, 0x12, 0xA8, 0x17, 0x74, 0xFF, 0x56, 0x17, + 0xFA, 0xEE, 0xCF, 0x0F, 0x61, 0xE7, 0x3B, 0xFD, 0x17, 0xE5, 0xBE, 0xE4, + 0xC5, 0xE2, 0xEA, 0xD0, 0x63, 0xE7, 0x4B, 0xCB, 0x64, 0xF7, 0x65, 0xD5, + 0xB5, 0x06, 0x4F, 0xE8, 0x16, 0x11, 0x8B, 0xFB, 0x1A, 0x18, 0x76, 0x07, + 0x35, 0x1E, 0xD2, 0x10, 0xC9, 0x24, 0xB4, 0x19, 0xA3, 0x27, 0x9A, 0x1B, + 0x43, 0x22, 0xBB, 0x1A, 0xAC, 0x0C, 0xAD, 0x18, 0x46, 0xE8, 0xA9, 0x0B, + 0x1C, 0xCD, 0x73, 0xF3, 0xB2, 0xC9, 0x2A, 0xDE, 0xB2, 0xCE, 0x6E, 0xD0, + 0xBB, 0xCD, 0x3D, 0xCC, 0x48, 0xD6, 0x59, 0xD0, 0x67, 0xEE, 0x9E, 0xD5, + 0x76, 0x07, 0xDB, 0xDF, 0xDA, 0x1A, 0xEE, 0xF2, 0x60, 0x24, 0xB8, 0x0F, + 0x5F, 0x28, 0x2A, 0x31, 0x01, 0x2E, 0x0F, 0x45, 0x04, 0x32, 0xA2, 0x43, + 0xC0, 0x29, 0x73, 0x39, 0xFA, 0x11, 0x4C, 0x28, 0xB9, 0xF8, 0x8D, 0x09, + 0xD8, 0xE8, 0x6C, 0xE8, 0x60, 0xDF, 0x47, 0xD4, 0xD3, 0xDA, 0x27, 0xCC, + 0x9D, 0xDC, 0x71, 0xC9, 0xD9, 0xE6, 0xAF, 0xCB, 0x31, 0xF6, 0x78, 0xD4, + 0x2A, 0x04, 0x53, 0xE1, 0x84, 0x15, 0x99, 0xF3, 0xF5, 0x26, 0xBF, 0x0F, + 0xBA, 0x2F, 0x8B, 0x27, 0x01, 0x39, 0x12, 0x2B, 0xEE, 0x41, 0xB7, 0x25, + 0xF2, 0x3B, 0x4C, 0x23, 0x94, 0x26, 0xD5, 0x22, 0xFC, 0x0D, 0x3A, 0x24, + 0x5B, 0x03, 0xA9, 0x1E, 0x93, 0x04, 0xAF, 0x14, 0x06, 0x02, 0x51, 0x13, + 0xF4, 0xFD, 0x5E, 0x13, 0xDF, 0xFE, 0x52, 0x12, 0x14, 0x04, 0x7B, 0x15, + 0x7E, 0x09, 0xE4, 0x19, 0xA5, 0x0B, 0xAF, 0x20, 0xDC, 0x04, 0x84, 0x28, + 0x08, 0xF7, 0x14, 0x25, 0x0B, 0xF3, 0xCD, 0x12, 0xF9, 0xFE, 0x3E, 0xFE, + 0x7C, 0x0D, 0xBF, 0xF3, 0xDB, 0x0C, 0x79, 0xF2, 0x5C, 0xFE, 0x2E, 0xF3, + 0x95, 0xF4, 0xC9, 0xF2, 0x7D, 0xF1, 0xDB, 0xEC, 0xB2, 0xEA, 0xAA, 0xE7, + 0x02, 0xE6, 0x2F, 0xEB, 0xFD, 0xE9, 0x9F, 0xF0, 0x9D, 0xEF, 0x43, 0xF6, + 0x43, 0xF2, 0x4C, 0xF9, 0x49, 0xF0, 0x75, 0xF8, 0x45, 0xE8, 0xC4, 0xF9, + 0xB3, 0xE4, 0xC5, 0xFD, 0x32, 0xEE, 0xD6, 0xFF, 0xE1, 0xFE, 0x56, 0xFE, + 0x28, 0x08, 0x39, 0xFD, 0xFE, 0x01, 0x2A, 0xFB, 0x2D, 0xF5, 0x48, 0xF3, + 0x79, 0xEA, 0x06, 0xE4, 0x75, 0xE4, 0x4A, 0xD4, 0x04, 0xE4, 0x30, 0xD3, + 0x3A, 0xE4, 0x46, 0xE0, 0x2E, 0xEA, 0x94, 0xED, 0x2A, 0xFD, 0xA8, 0xF4, + 0x1C, 0x12, 0xBE, 0xF8, 0x27, 0x1F, 0xE5, 0xFE, 0xA7, 0x1E, 0xE2, 0x05, + 0x42, 0x0D, 0x3D, 0x0A, 0x9F, 0xFD, 0x3B, 0x07, 0x47, 0xFE, 0xFC, 0xF9, + 0x53, 0xFF, 0x3F, 0xE7, 0x60, 0xF5, 0xF8, 0xD7, 0x22, 0xE3, 0x2B, 0xD3, + 0x76, 0xCD, 0xDF, 0xD6, 0xC1, 0xC2, 0xA7, 0xE1, 0x4C, 0xCA, 0x4D, 0xF5, + 0xAA, 0xDB, 0x13, 0x0D, 0x82, 0xF2, 0xCB, 0x1E, 0x72, 0x11, 0xC8, 0x28, + 0x8E, 0x32, 0xF2, 0x31, 0x6A, 0x42, 0x0A, 0x3A, 0xE7, 0x39, 0x9A, 0x41, + 0x00, 0x2D, 0x06, 0x4A, 0x72, 0x2B, 0xCE, 0x44, 0x30, 0x2A, 0x45, 0x28, + 0x8B, 0x1A, 0xB7, 0x07, 0xCC, 0x01, 0x54, 0xEE, 0xFA, 0xE7, 0xCE, 0xD3, + 0xCB, 0xCE, 0xE9, 0xC3, 0xB7, 0xBF, 0xEA, 0xC7, 0x19, 0xC1, 0xAF, 0xD3, + 0xC4, 0xC9, 0x0C, 0xE4, 0x6F, 0xD4, 0x14, 0xF0, 0x95, 0xEC, 0x4A, 0xEE, + 0x22, 0x0E, 0xCF, 0xEA, 0xD4, 0x21, 0xCD, 0xEE, 0x50, 0x29, 0x08, 0xFA, + 0x75, 0x35, 0x01, 0x05, 0x9C, 0x40, 0xBE, 0x09, 0x63, 0x42, 0x8A, 0x0B, + 0x34, 0x3A, 0x9B, 0x0E, 0x7B, 0x26, 0xAC, 0x11, 0x6B, 0x11, 0x97, 0x10, + 0x43, 0x02, 0xB9, 0x10, 0xCE, 0xF6, 0x66, 0x17, 0x0B, 0xF2, 0x9F, 0x1B, + 0xF6, 0xF4, 0xFE, 0x19, 0x37, 0xFA, 0x65, 0x1A, 0x27, 0x01, 0x2E, 0x19, + 0xA9, 0x08, 0xF6, 0x14, 0xE7, 0x0A, 0x59, 0x16, 0x6B, 0x06, 0x16, 0x16, + 0xCC, 0xFD, 0x25, 0x09, 0x99, 0xF4, 0x34, 0xF7, 0x91, 0xF0, 0xC9, 0xE7, + 0x29, 0xEF, 0x19, 0xDA, 0xEA, 0xF0, 0x3F, 0xD7, 0x9F, 0xFB, 0x70, 0xE2, + 0x4E, 0x05, 0x50, 0xED, 0x97, 0x04, 0x78, 0xF4, 0x04, 0xFB, 0xA3, 0xF9, + 0x5E, 0xEF, 0x20, 0xF7, 0x78, 0xEA, 0x70, 0xF1, 0xAF, 0xF4, 0x51, 0xF1, + 0x9A, 0x0A, 0x78, 0xF7, 0x73, 0x18, 0x71, 0x03, 0xA4, 0x16, 0xA9, 0x0F, + 0xFD, 0x0A, 0x9F, 0x11, 0xCF, 0xFA, 0x96, 0x0E, 0xD1, 0xEC, 0x1B, 0x11, + 0x70, 0xE5, 0xA6, 0x14, 0xDB, 0xE4, 0x5D, 0x10, 0x91, 0xE8, 0x27, 0x08, + 0xA0, 0xEC, 0x55, 0x06, 0x1D, 0xE8, 0xD5, 0x0C, 0x37, 0xE3, 0xFD, 0x11, + 0xC2, 0xF3, 0x7D, 0x10, 0x75, 0x0E, 0xE2, 0x10, 0x26, 0x1F, 0x7C, 0x0F, + 0x3C, 0x24, 0x62, 0x04, 0x85, 0x1B, 0x89, 0xF5, 0x31, 0x05, 0x24, 0xE6, + 0xFC, 0xED, 0x6E, 0xD4, 0x72, 0xE2, 0x96, 0xC6, 0x83, 0xDD, 0x21, 0xC3, + 0xD0, 0xD7, 0x32, 0xC7, 0xCF, 0xD4, 0xA2, 0xCA, 0xA6, 0xD5, 0xF5, 0xCA, + 0xB3, 0xDE, 0x23, 0xD0, 0x3C, 0xF2, 0x38, 0xDB, 0x67, 0x04, 0x1A, 0xEC, + 0x8D, 0x13, 0xAD, 0x07, 0x3F, 0x29, 0x7A, 0x28, 0x6A, 0x3E, 0x0C, 0x3F, + 0xC9, 0x46, 0xAC, 0x43, 0x89, 0x3E, 0x6B, 0x3D, 0xA6, 0x23, 0xA0, 0x32, + 0x57, 0x01, 0xAF, 0x22, 0xE0, 0xE6, 0x15, 0x0F, 0xB2, 0xD2, 0x63, 0xFC, + 0x75, 0xC3, 0x0F, 0xEF, 0xFD, 0xBF, 0x8A, 0xE5, 0x40, 0xC3, 0x4B, 0xE1, + 0x2F, 0xC9, 0xD4, 0xE7, 0xC0, 0xD9, 0x73, 0xF4, 0xA0, 0xED, 0x1A, 0x02, + 0x73, 0xF7, 0x07, 0x0B, 0x91, 0x00, 0xBD, 0x0C, 0x58, 0x10, 0x4F, 0x0C, + 0xA6, 0x1C, 0x1A, 0x09, 0xA1, 0x25, 0x68, 0x06, 0x8C, 0x31, 0xD2, 0x0D, + 0xBC, 0x3B, 0xED, 0x14, 0xC7, 0x3C, 0x11, 0x12, 0x6F, 0x35, 0xA3, 0x0B, + 0x81, 0x2A, 0x32, 0x02, 0x30, 0x1D, 0x23, 0xFB, 0x65, 0x19, 0x7A, 0xF9, + 0x15, 0x26, 0x06, 0xF6, 0x22, 0x2E, 0x5F, 0xF3, 0x84, 0x21, 0x04, 0xFC, + 0x1D, 0x0C, 0x24, 0x0C, 0x4C, 0xFD, 0x05, 0x14, 0x1C, 0xF6, 0x6E, 0x14, + 0x1A, 0xF4, 0x71, 0x13, 0x89, 0xF7, 0x69, 0x0D, 0x72, 0xFE, 0x41, 0x02, + 0x5E, 0xFF, 0xFC, 0xF7, 0x74, 0xF8, 0xD8, 0xF4, 0xC1, 0xF1, 0x23, 0xF5, + 0x6D, 0xEF, 0xA8, 0xF4, 0xE6, 0xF3, 0xD4, 0xF6, 0x88, 0xFA, 0xB4, 0xFD, + 0xC0, 0xFA, 0xEF, 0x02, 0x3F, 0xF6, 0xFE, 0x02, 0x17, 0xEF, 0xFE, 0x01, + 0xB2, 0xE5, 0x17, 0x02, 0x54, 0xE6, 0x8C, 0x02, 0x04, 0xF7, 0xD9, 0x02, + 0x15, 0x06, 0x66, 0x06, 0x5F, 0x07, 0x12, 0x0B, 0x42, 0xFF, 0x23, 0x0D, + 0xA2, 0xF3, 0xDB, 0x08, 0xBA, 0xE8, 0x46, 0xF9, 0x96, 0xE0, 0x88, 0xE6, + 0x87, 0xDE, 0x77, 0xDC, 0xD5, 0xE6, 0xBA, 0xE0, 0x86, 0xF7, 0xFF, 0xEF, + 0xAE, 0x06, 0x73, 0x01, 0x1E, 0x0D, 0xA9, 0x15, 0xCA, 0x09, 0xCE, 0x25, + 0x69, 0x00, 0xB7, 0x24, 0x95, 0xFC, 0xD2, 0x17, 0x90, 0x03, 0xF2, 0x07, + 0x83, 0x07, 0xB3, 0xF8, 0x9F, 0xFB, 0x85, 0xEC, 0xE1, 0xE7, 0xF2, 0xDF, + 0xD9, 0xD7, 0xAD, 0xD7, 0x9D, 0xD0, 0x86, 0xD9, 0x51, 0xD6, 0xB9, 0xE1, + 0x2B, 0xE4, 0xE4, 0xEC, 0x26, 0xF2, 0x09, 0xF2, 0xE4, 0xFF, 0x03, 0xF4, + 0xBA, 0x0C, 0xB4, 0xFF, 0x03, 0x13, 0x80, 0x13, 0xCD, 0x16, 0xBD, 0x24, + 0x2F, 0x26, 0x3F, 0x2E, 0xAF, 0x39, 0xDA, 0x2C, 0xEA, 0x3A, 0x0F, 0x1C, + 0xDD, 0x24, 0xD3, 0x08, 0xCC, 0x04, 0x3E, 0xF9, 0xF1, 0xEA, 0x30, 0xE2, + 0x82, 0xDF, 0x0F, 0xC9, 0xFB, 0xDE, 0xA6, 0xBA, 0x9B, 0xDE, 0x66, 0xBB, + 0x2A, 0xDB, 0x7D, 0xC7, 0x42, 0xDC, 0xE7, 0xD8, 0xCF, 0xEB, 0xB5, 0xEE, + 0x92, 0x09, 0x99, 0x02, 0xFE, 0x28, 0x0F, 0x12, 0xD9, 0x3A, 0x42, 0x20, + 0x26, 0x36, 0x9B, 0x28, 0x6C, 0x23, 0xF2, 0x25, 0x04, 0x12, 0x9A, 0x22, + 0x4A, 0x07, 0xF6, 0x25, 0x23, 0x04, 0x70, 0x25, 0xA7, 0x05, 0x32, 0x20, + 0x15, 0x08, 0xAF, 0x1B, 0x8A, 0x0A, 0x9A, 0x13, 0x12, 0x06, 0x1C, 0x06, + 0x01, 0xFA, 0xBA, 0xF7, 0x2E, 0xF3, 0x4C, 0xF2, 0x39, 0xFD, 0x17, 0xFB, + 0x98, 0x11, 0xE5, 0x0B, 0x7E, 0x1B, 0x7E, 0x1E, 0xF4, 0x18, 0x41, 0x23, + 0xFC, 0x11, 0xE0, 0x13, 0xE6, 0x08, 0xF8, 0xFE, 0xE5, 0x01, 0x65, 0xEB, + 0x6F, 0xF8, 0xC6, 0xE0, 0xC6, 0xEC, 0xEE, 0xE5, 0xB9, 0xEB, 0x75, 0xF0, + 0xD5, 0xF5, 0x22, 0xF3, 0xAB, 0xF9, 0xD6, 0xF4, 0x91, 0xEF, 0x83, 0xFF, + 0x77, 0xE3, 0xE9, 0x0A, 0x95, 0xE2, 0x3C, 0x13, 0x89, 0xF1, 0x55, 0x18, + 0x98, 0x08, 0xC7, 0x19, 0x9B, 0x14, 0x51, 0x1B, 0x1F, 0x0F, 0x79, 0x18, + 0x49, 0x05, 0x62, 0x0B, 0x3B, 0x03, 0x4A, 0xFE, 0x9D, 0x09, 0x58, 0xFB, + 0x22, 0x09, 0x39, 0xF9, 0xE4, 0xF9, 0xAE, 0xEE, 0x7C, 0xEC, 0x39, 0xE0, + 0x1A, 0xE9, 0x2B, 0xD6, 0x06, 0xE8, 0x4F, 0xD8, 0x9F, 0xE9, 0x56, 0xEA, + 0xAB, 0xF5, 0xCF, 0x00, 0x33, 0x0C, 0x25, 0x0E, 0x12, 0x1B, 0x50, 0x11, + 0xA5, 0x16, 0x69, 0x0F, 0xE6, 0x04, 0xFD, 0x0C, 0xF5, 0xEF, 0x90, 0x02, + 0x1F, 0xE7, 0x1D, 0xEE, 0xFD, 0xEA, 0xE8, 0xDA, 0xE4, 0xEA, 0x24, 0xCC, + 0xF1, 0xDC, 0x92, 0xC7, 0x4B, 0xCB, 0x4F, 0xD2, 0xF5, 0xCA, 0x8A, 0xE6, + 0xA7, 0xE8, 0x7D, 0xFD, 0xC3, 0x17, 0xC0, 0x14, 0x73, 0x3C, 0x19, 0x2A, + 0x19, 0x47, 0xF4, 0x32, 0x41, 0x40, 0xD0, 0x2B, 0x45, 0x37, 0xDB, 0x1E, + 0xF8, 0x2D, 0x52, 0x16, 0x63, 0x20, 0x10, 0x13, 0xF7, 0x0D, 0xCF, 0x0F, + 0xCC, 0xFB, 0x04, 0x04, 0x24, 0xEA, 0xEE, 0xE7, 0x8F, 0xD4, 0x36, 0xCD, + 0xBF, 0xC0, 0xE5, 0xC3, 0x43, 0xBD, 0x67, 0xC6, 0xF3, 0xD0, 0x25, 0xD3, + 0x91, 0xEE, 0x68, 0xEB, 0x1A, 0x03, 0x56, 0x07, 0x29, 0x08, 0x67, 0x1D, + 0xC4, 0x08, 0x41, 0x26, 0xA1, 0x10, 0x78, 0x22, 0x33, 0x1D, 0xFB, 0x1F, + 0xFC, 0x25, 0xAF, 0x26, 0xDB, 0x28, 0xC0, 0x2F, 0x65, 0x29, 0xB3, 0x34, + 0x90, 0x23, 0xE9, 0x2F, 0x96, 0x14, 0x08, 0x20, 0x4F, 0x03, 0x7A, 0x10, + 0x8E, 0xF4, 0xA4, 0x0A, 0xD7, 0xE9, 0x8E, 0x0D, 0x8B, 0xEC, 0xD6, 0x11, + 0x0F, 0x00, 0x22, 0x0D, 0x2C, 0x10, 0x6C, 0x00, 0xE1, 0x0D, 0x3C, 0xF6, + 0x25, 0x03, 0x68, 0xEF, 0x06, 0x01, 0x6B, 0xEE, 0x1B, 0x09, 0xAD, 0xF5, + 0x8D, 0x10, 0xCB, 0xF8, 0xC5, 0x14, 0x3D, 0xEE, 0x6B, 0x10, 0x1F, 0xDF, + 0x22, 0xFF, 0x75, 0xD6, 0x9A, 0xF0, 0xBE, 0xD1, 0x36, 0xEF, 0x20, 0xD0, + 0x3E, 0xF2, 0xE5, 0xD9, 0x4E, 0xF4, 0xB8, 0xEA, 0xFD, 0xF7, 0x07, 0xF5, + 0xB0, 0xFA, 0x59, 0xF9, 0x4E, 0xF9, 0x9C, 0xFC, 0xBE, 0xF6, 0x0A, 0x02, + 0x12, 0xF6, 0x56, 0x0A, 0xAB, 0xFB, 0x3A, 0x0E, 0x46, 0x03, 0x8A, 0x0D, + 0x0E, 0x04, 0x96, 0x0E, 0x8C, 0xFC, 0xA9, 0x10, 0x20, 0xF0, 0x3D, 0x0F, + 0xED, 0xE8, 0x62, 0x0C, 0xF6, 0xF1, 0x27, 0x0D, 0x60, 0x00, 0xFA, 0x0D, + 0x61, 0x01, 0x62, 0x0F, 0xA6, 0xFB, 0xB1, 0x14, 0xAA, 0xFC, 0x60, 0x16, + 0x57, 0x05, 0xF4, 0x16, 0x82, 0x10, 0xD3, 0x1A, 0x1F, 0x18, 0x8C, 0x1B, + 0xD8, 0x15, 0x5D, 0x17, 0x87, 0x01, 0xB9, 0x0B, 0x2B, 0xE6, 0x6E, 0xF5, + 0x8E, 0xD4, 0x5D, 0xD9, 0x33, 0xC8, 0x99, 0xC8, 0x7F, 0xBF, 0x45, 0xCD, + 0x0A, 0xC0, 0x92, 0xDD, 0xFC, 0xCE, 0xB3, 0xF1, 0xD9, 0xE6, 0xE2, 0x03, + 0x7C, 0xF9, 0x06, 0x0F, 0x0B, 0x0E, 0x8B, 0x13, 0x42, 0x2A, 0x2D, 0x10, + 0x57, 0x3E, 0xA9, 0x0D, 0xD8, 0x46, 0x8B, 0x10, 0x99, 0x4C, 0x0D, 0x10, + 0x17, 0x48, 0x10, 0x0D, 0x19, 0x31, 0xF9, 0x02, 0x7A, 0x11, 0xB7, 0xE8, + 0x85, 0xED, 0xFE, 0xCE, 0x67, 0xC9, 0x91, 0xC6, 0x44, 0xB7, 0xF8, 0xC9, + 0x24, 0xBB, 0xFC, 0xCF, 0x31, 0xCC, 0xEB, 0xCD, 0x4B, 0xE2, 0x49, 0xCB, + 0x1B, 0xED, 0x5D, 0xDD, 0x2D, 0xEB, 0x73, 0xFE, 0xDE, 0xF5, 0x3C, 0x18, + 0x07, 0x15, 0xE1, 0x23, 0xB7, 0x31, 0x3A, 0x2C, 0x83, 0x3E, 0x60, 0x30, + 0xF0, 0x39, 0x1C, 0x2A, 0x85, 0x2B, 0x43, 0x1F, 0xB1, 0x1D, 0x36, 0x15, + 0x6C, 0x0F, 0x56, 0x0D, 0x2B, 0x03, 0xE9, 0x0A, 0xBF, 0xFE, 0xCC, 0x13, + 0x5C, 0x04, 0xB2, 0x17, 0xB9, 0x0B, 0x02, 0x10, 0xEC, 0x12, 0x33, 0x0A, + 0xC6, 0x16, 0x2B, 0x02, 0x48, 0x10, 0x9C, 0xFB, 0x4B, 0x0C, 0x8C, 0xFC, + 0xA5, 0x0C, 0x50, 0xFD, 0xFD, 0x0A, 0x01, 0x05, 0xAE, 0x0F, 0x21, 0x17, + 0x42, 0x10, 0x4C, 0x1A, 0xB7, 0x04, 0x5D, 0x0B, 0xF8, 0x05, 0x07, 0xFF, + 0x98, 0x0E, 0x78, 0xFA, 0xBE, 0x10, 0x9F, 0x0A, 0x44, 0x21, 0x1F, 0x2E, + 0x0A, 0x40, 0xB9, 0x4E, 0x36, 0x55, 0x3C, 0x62, 0xA1, 0x55, 0xB0, 0x60, + 0xB8, 0x56, 0x6B, 0x5E, 0xC8, 0x55, 0x86, 0x5F, 0xC1, 0x37, 0xBE, 0x48, + 0x0C, 0x43, 0x1C, 0x4E, 0x69, 0x5E, 0xA2, 0x58, 0xE6, 0x36, 0x23, 0x28, + 0x1E, 0x1D, 0xE9, 0x1A, 0x14, 0x38, 0x5F, 0x4D, 0x2F, 0x3A, 0x8E, 0x52, + 0xA4, 0x1C, 0xB5, 0x2B, 0xE6, 0x13, 0xA7, 0x18, 0xA0, 0x05, 0xFC, 0xFD, + 0xB7, 0xF2, 0x4B, 0xE3, 0xF5, 0xE9, 0x11, 0xD2, 0xB5, 0xE5, 0x26, 0xC2, + 0x50, 0xEC, 0x0F, 0xC8, 0x3A, 0xDC, 0xA5, 0xCA, 0x30, 0xCE, 0xEF, 0xCE, + 0x1D, 0xC8, 0xD2, 0xCD, 0x28, 0xAB, 0x1F, 0xB9, 0x81, 0x9E, 0x8E, 0xB6, + 0x43, 0xAC, 0xAC, 0xB1, 0x3C, 0xAB, 0x34, 0xA1, 0xA2, 0xA1, 0xA5, 0xAA, + 0xAA, 0xC6, 0x42, 0xD3, 0xEF, 0xE0, 0x0B, 0xEA, 0xA7, 0xCA, 0x4F, 0xDF, + 0xDA, 0xD0, 0x56, 0xE2, 0x3F, 0xE3, 0x73, 0xE6, 0xD5, 0xE9, 0x65, 0xE6, + 0xBC, 0xF5, 0x55, 0xF9, 0xD8, 0x04, 0xD2, 0x09, 0x79, 0x19, 0xE6, 0x1F, + 0x4C, 0x33, 0xD1, 0x39, 0x62, 0x24, 0x10, 0x21, 0xC4, 0x0D, 0xBA, 0x05, + 0x1E, 0x12, 0x99, 0x06, 0xE1, 0xFE, 0xBA, 0xF1, 0x30, 0xFD, 0xAE, 0xE9, + 0x34, 0x2B, 0x35, 0x0B, 0x7C, 0x44, 0x5D, 0x1A, 0x30, 0x3F, 0x5F, 0x0A, + 0x7E, 0x44, 0x6B, 0x18, 0xC8, 0x49, 0x3E, 0x3B, 0x33, 0x41, 0x6B, 0x38, + 0xA5, 0x41, 0x72, 0x38, 0x92, 0x4D, 0xB7, 0x4A, 0xCD, 0x36, 0x9F, 0x32, + 0x75, 0x1E, 0x38, 0x14, 0xF5, 0x26, 0xA6, 0x15, 0xB0, 0x25, 0x01, 0x19, + 0xE0, 0x10, 0x1B, 0xFD, 0x9F, 0xF4, 0xF5, 0xD9, 0x2B, 0xF5, 0xD2, 0xE0, + 0x26, 0xE8, 0x49, 0xD3, 0xE4, 0xB5, 0xBB, 0xA5, 0xE7, 0xA9, 0x11, 0xAB, + 0xDE, 0xB1, 0x21, 0xBA, 0xF9, 0xB4, 0xC8, 0xB2, 0x29, 0xBD, 0x83, 0xBF, + 0xD8, 0xB5, 0xA2, 0xC2, 0x86, 0xAA, 0x47, 0xAF, 0x53, 0xA9, 0x8B, 0xAB, + 0xCE, 0xAD, 0xF5, 0xB4, 0x4B, 0xB0, 0xA8, 0xBA, 0xB2, 0xBA, 0x8D, 0xC7, + 0x90, 0xD8, 0xE9, 0xDB, 0x99, 0xF3, 0x80, 0xEC, 0x90, 0x02, 0x70, 0xF8, + 0xAE, 0x0E, 0xD2, 0xFF, 0xD3, 0x18, 0x3F, 0x07, 0x4A, 0x14, 0x14, 0x09, + 0xC3, 0x0E, 0x40, 0x0C, 0xCB, 0x14, 0xC8, 0x1B, 0x54, 0x0B, 0x37, 0x1C, + 0xD8, 0x10, 0x7E, 0x1E, 0x76, 0x34, 0x04, 0x2F, 0x82, 0x40, 0xA9, 0x28, + 0xBE, 0x36, 0x91, 0x23, 0x5A, 0x25, 0x88, 0x27, 0x0B, 0x0D, 0x6A, 0x1A, + 0x22, 0xF2, 0x5F, 0x02, 0x45, 0xE4, 0x17, 0xF3, 0xD0, 0xEA, 0x46, 0xEE, + 0x87, 0xEE, 0xFB, 0xEB, 0xC2, 0xE3, 0xC8, 0xE1, 0x63, 0xC6, 0xB2, 0xC4, + 0x93, 0xAC, 0xF0, 0xAC, 0x52, 0xA9, 0xBF, 0xA7, 0x23, 0xA9, 0x45, 0xA4, + 0x67, 0xAB, 0x5F, 0xA9, 0x09, 0xB5, 0x06, 0xBA, 0xAF, 0xB9, 0xB0, 0xC3, + 0x56, 0xBB, 0x9F, 0xBD, 0x11, 0xB4, 0xC6, 0xAB, 0x65, 0xB1, 0xFA, 0xA5, + 0xB5, 0xCB, 0x0E, 0xBE, 0x2F, 0xEB, 0xBF, 0xE2, 0x73, 0xF6, 0x54, 0xFA, + 0xAA, 0xFA, 0x3C, 0xFE, 0x5F, 0x1A, 0x67, 0x0B, 0x41, 0x3E, 0xD2, 0x24, + 0xD1, 0x33, 0x15, 0x19, 0x03, 0x1D, 0x2D, 0x06, 0xB0, 0x15, 0xE5, 0x14, + 0x85, 0x06, 0xDA, 0x0D, 0x11, 0xF5, 0x7D, 0xF0, 0xDC, 0xF7, 0x0E, 0xF1, + 0x10, 0xFC, 0x31, 0x03, 0x01, 0xF2, 0x69, 0x11, 0x16, 0xEA, 0x1D, 0x16, + 0xB8, 0xEE, 0x74, 0x16, 0x33, 0x0E, 0x0E, 0x28, 0xC0, 0x29, 0x3C, 0x35, + 0xB6, 0x36, 0xB8, 0x3F, 0x7C, 0x49, 0x67, 0x53, 0x0E, 0x54, 0x84, 0x5B, + 0x3E, 0x52, 0x29, 0x58, 0x04, 0x4D, 0x08, 0x57, 0xF5, 0x3D, 0x34, 0x49, + 0x6A, 0x2F, 0xE5, 0x33, 0x39, 0x30, 0x15, 0x2A, 0x69, 0x35, 0x72, 0x20, + 0x5C, 0x3F, 0xA2, 0x1E, 0x19, 0x4A, 0x30, 0x28, 0xBA, 0x51, 0x2F, 0x39, + 0xEE, 0x53, 0xC2, 0x4B, 0x46, 0x54, 0x82, 0x58, 0x06, 0x54, 0xBE, 0x5D, + 0x6E, 0x52, 0x71, 0x5B, 0xFA, 0x4D, 0xC5, 0x4C, 0xB9, 0x4B, 0xF4, 0x44, + 0xD3, 0x53, 0x5E, 0x51, 0x43, 0x5B, 0x7F, 0x5C, 0x70, 0x57, 0xEF, 0x5C, + 0x62, 0x4E, 0xFC, 0x56, 0xD1, 0x4F, 0xAE, 0x54, 0x9E, 0x52, 0x14, 0x51, + 0x58, 0x4D, 0xBF, 0x47, 0xDB, 0x43, 0x95, 0x41, 0x1E, 0x41, 0xC4, 0x44, + 0xBE, 0x4A, 0xBE, 0x47, 0x4C, 0x59, 0xB2, 0x4A, 0xED, 0x62, 0x78, 0x4D, + 0xE5, 0x59, 0x0D, 0x3C, 0xC4, 0x51, 0x6D, 0x2E, 0xC0, 0x4F, 0xCD, 0x32, + 0x63, 0x44, 0xEA, 0x2B, 0x53, 0x39, 0x9B, 0x1F, 0x03, 0x2D, 0xA1, 0x19, + 0x7F, 0x23, 0xEE, 0x15, 0x88, 0x26, 0x2B, 0x14, 0x45, 0x26, 0x96, 0x0D, + 0x0E, 0x19, 0xE2, 0x0B, 0x9C, 0x14, 0x8F, 0x1C, 0xB7, 0x1F, 0x34, 0x2D, + 0x83, 0x2E, 0x94, 0x33, 0x0A, 0x37, 0xFC, 0x30, 0x16, 0x2B, 0xBC, 0x1C, + 0x51, 0x16, 0x4B, 0x04, 0x3D, 0x01, 0x6E, 0xF5, 0xB3, 0xD9, 0xF0, 0xDD, + 0x5A, 0xB3, 0xF5, 0xC6, 0x19, 0xA4, 0xF6, 0xC2, 0x43, 0xA5, 0x62, 0xC7, + 0xF6, 0xA8, 0x89, 0xC1, 0x19, 0xBD, 0xE1, 0xC2, 0xE6, 0xEB, 0x83, 0xE8, + 0x09, 0xFC, 0xFB, 0xFE, 0x1E, 0xF9, 0x33, 0x02, 0xF6, 0x05, 0x56, 0x10, + 0xD3, 0x0C, 0x2B, 0x13, 0x00, 0x10, 0x06, 0x0C, 0xF2, 0x0D, 0xAB, 0x05, + 0xF3, 0xEF, 0xF7, 0xED, 0xBB, 0xCD, 0x84, 0xCF, 0x93, 0xB7, 0x80, 0xBA, + 0xC1, 0xA9, 0x13, 0xAA, 0xE5, 0xA7, 0xBC, 0xA0, 0x9B, 0xA5, 0x67, 0x9C, + 0x9B, 0xA3, 0xE0, 0xA1, 0x61, 0xA2, 0xEE, 0xAB, 0xC0, 0xAA, 0xC3, 0xB8, + 0x7D, 0xB2, 0x73, 0xC2, 0xFF, 0xBC, 0xCD, 0xCC, 0x75, 0xCC, 0x59, 0xD7, + 0x95, 0xC7, 0x6C, 0xD3, 0x70, 0xC0, 0x06, 0xD3, 0xC7, 0xBD, 0xDF, 0xD0, + 0x92, 0xB7, 0xDE, 0xBE, 0x09, 0xBB, 0x9B, 0xB4, 0x51, 0xC6, 0x05, 0xB6, + 0x04, 0xD5, 0x0C, 0xBA, 0x6D, 0xE7, 0xEB, 0xC8, 0x5C, 0xED, 0x16, 0xD4, + 0x71, 0xF4, 0x99, 0xDC, 0xF7, 0x12, 0xAB, 0xF5, 0x88, 0x28, 0xB4, 0x05, + 0x20, 0x2A, 0xEA, 0x0F, 0x6F, 0x24, 0x4A, 0x1E, 0xCD, 0x11, 0x2B, 0x1D, + 0xBD, 0x0A, 0xAB, 0x1C, 0xAE, 0x1D, 0x3B, 0x28, 0xA5, 0x28, 0x74, 0x28, + 0xD9, 0x22, 0xF6, 0x1D, 0x94, 0x25, 0x3F, 0x23, 0x44, 0x27, 0xAE, 0x23, + 0xE6, 0x14, 0xF2, 0x05, 0x10, 0x10, 0x92, 0xFE, 0x21, 0x1C, 0x43, 0x1E, + 0xB2, 0x13, 0x97, 0x29, 0xA4, 0x08, 0xD3, 0x1E, 0x7C, 0x0D, 0xE2, 0x1D, + 0x48, 0x06, 0x1C, 0x1A, 0xA3, 0xF8, 0x85, 0x13, 0x4C, 0xF9, 0x86, 0x17, + 0x13, 0xF3, 0xC5, 0x11, 0x85, 0xEE, 0xDD, 0x03, 0x51, 0xFE, 0xE0, 0x04, + 0x2C, 0x0D, 0x9D, 0x0E, 0x98, 0x0C, 0x5A, 0x0F, 0xC4, 0x09, 0xC3, 0x07, + 0x47, 0x09, 0xC5, 0xFD, 0x1D, 0x13, 0x10, 0x04, 0xDA, 0x24, 0xBB, 0x1B, + 0x92, 0x25, 0x36, 0x22, 0x4E, 0x24, 0x05, 0x19, 0xCB, 0x30, 0x05, 0x15, + 0xC0, 0x3E, 0x05, 0x1F, 0xA3, 0x32, 0x22, 0x21, 0xE4, 0x16, 0x73, 0x12, + 0xD2, 0x06, 0x3D, 0xFD, 0x99, 0xF5, 0x36, 0xD8, 0x32, 0xE5, 0x9A, 0xBD, + 0xAB, 0xEB, 0xE9, 0xCC, 0xC6, 0xFA, 0x85, 0xEA, 0x32, 0x02, 0x14, 0xF7, + 0xE9, 0x09, 0x2E, 0x03, 0xB4, 0x16, 0x09, 0x21, 0xB1, 0x1B, 0x1F, 0x3A, + 0x5A, 0x1E, 0x07, 0x44, 0x8D, 0x21, 0xC1, 0x37, 0x81, 0x1D, 0xCE, 0x1F, + 0xD2, 0x1A, 0xBA, 0x13, 0x55, 0x07, 0xCF, 0x00, 0x77, 0xEB, 0x52, 0xEA, + 0xE9, 0xDA, 0xFD, 0xD7, 0xFC, 0xC9, 0x9F, 0xBF, 0x09, 0xBF, 0x0C, 0xAD, + 0x0E, 0xCB, 0x95, 0xB6, 0xCC, 0xD3, 0xF6, 0xC0, 0x15, 0xC5, 0x87, 0xAD, + 0x6C, 0xC0, 0xD5, 0xAA, 0x69, 0xD3, 0x80, 0xCC, 0xC1, 0xE2, 0x20, 0xED, + 0xD8, 0xE3, 0xB9, 0xF4, 0xE3, 0xEE, 0x8C, 0xEF, 0x71, 0x05, 0x80, 0xF7, + 0x09, 0x0A, 0x15, 0xF8, 0xB8, 0xF2, 0xD0, 0xE6, 0x8F, 0xE5, 0x23, 0xEC, + 0x77, 0xF4, 0xAB, 0x06, 0xB9, 0x07, 0x0F, 0x1B, 0xA7, 0x13, 0x1B, 0x24, + 0xBA, 0x20, 0x70, 0x2F, 0xA0, 0x25, 0xBA, 0x38, 0x6B, 0x15, 0x49, 0x27, + 0x3F, 0x14, 0x1E, 0x20, 0x9C, 0x18, 0x01, 0x25, 0x16, 0x09, 0x0C, 0x19, + 0xA4, 0xFC, 0x0A, 0x17, 0xD8, 0xFC, 0x4D, 0x1D, 0xEA, 0x01, 0x8A, 0x16, + 0x0F, 0xF9, 0x9E, 0xFD, 0xAA, 0xE5, 0x5F, 0xE6, 0xD4, 0xD0, 0xDE, 0xDB, + 0xC7, 0xBA, 0xDE, 0xD1, 0x43, 0xB5, 0xB8, 0xC8, 0x0C, 0xBA, 0x2C, 0xBF, + 0x4D, 0xBA, 0x39, 0xB8, 0xBA, 0xBB, 0x5B, 0xBA, 0xEA, 0xC5, 0xF2, 0xBE, + 0xD2, 0xD1, 0x57, 0xC2, 0x9C, 0xD6, 0x94, 0xC9, 0x9B, 0xD9, 0x87, 0xD1, + 0x67, 0xDD, 0x95, 0xD6, 0xB6, 0xE5, 0xF4, 0xDE, 0xB5, 0xE3, 0x6B, 0xDB, + 0x69, 0xD5, 0xCA, 0xCF, 0x8C, 0xCF, 0x61, 0xD9, 0x20, 0xC5, 0x9D, 0xE3, + 0x85, 0xBC, 0x6C, 0xEA, 0x32, 0xC5, 0x63, 0xFB, 0x72, 0xCE, 0xB1, 0x0C, + 0x50, 0xDA, 0x67, 0x20, 0x25, 0xE9, 0x51, 0x2C, 0x07, 0xFD, 0x3F, 0x31, + 0xD8, 0x10, 0x9E, 0x2B, 0x8F, 0x14, 0xA5, 0x16, 0xAD, 0x09, 0x88, 0x03, + 0x3D, 0xEF, 0xA6, 0xF0, 0x75, 0xCF, 0x66, 0xE3, 0x05, 0xB8, 0x61, 0xD6, + 0x83, 0xAF, 0x16, 0xC7, 0x69, 0xAC, 0xC8, 0xBC, 0x2B, 0xB0, 0xB6, 0xBB, + 0x98, 0xC6, 0x91, 0xCE, 0xAB, 0xE7, 0x7C, 0xE6, 0xC7, 0x06, 0x3E, 0xFA, + 0x95, 0x27, 0x9A, 0x15, 0x48, 0x3A, 0x15, 0x1F, 0x97, 0x36, 0x8E, 0x10, + 0xAA, 0x30, 0x86, 0x07, 0x89, 0x14, 0x30, 0xF2, 0x59, 0xE6, 0xD1, 0xD2, + 0x24, 0xC3, 0x3E, 0xBA, 0x4B, 0xAD, 0x12, 0xA6, 0x24, 0xA3, 0xE7, 0x9E, + 0xC8, 0xA1, 0xD2, 0xA3, 0x1C, 0xA2, 0x52, 0xA7, 0x40, 0xA2, 0xB5, 0xA5, + 0x3A, 0xA3, 0x68, 0xA2, 0x4B, 0xB2, 0x21, 0xA8, 0x0D, 0xCF, 0xD9, 0xBA, + 0x13, 0xE8, 0x12, 0xD4, 0x04, 0xF4, 0xB1, 0xE9, 0xBB, 0xF5, 0x6C, 0xEE, + 0xE9, 0xFE, 0xB9, 0xF3, 0x77, 0xFF, 0xCF, 0xF1, 0xF6, 0xED, 0xA2, 0xE1, + 0x60, 0xF1, 0xB0, 0xED, 0xDE, 0x04, 0x19, 0x0D, 0x79, 0x0C, 0x75, 0x1E, + 0x14, 0x1D, 0x1B, 0x2C, 0x7A, 0x3A, 0x64, 0x38, 0xCB, 0x46, 0xBE, 0x34, + 0x7F, 0x4F, 0xAE, 0x3B, 0xFC, 0x51, 0xBA, 0x47, 0xBA, 0x3B, 0x9F, 0x37, + 0x42, 0x35, 0xD2, 0x2B, 0xD3, 0x37, 0xEE, 0x26, 0xD4, 0x29, 0x82, 0x16, + 0x0E, 0x1E, 0xFE, 0x0F, 0xD8, 0x14, 0xA7, 0x09, 0xBA, 0x07, 0x1D, 0xFF, + 0x51, 0xED, 0x26, 0xF6, 0xCF, 0xDA, 0x21, 0xEE, 0x73, 0xDF, 0x9E, 0xE9, + 0x87, 0xE1, 0x81, 0xDE, 0xE7, 0xEF, 0x3F, 0xDE, 0x27, 0x0B, 0x6B, 0xF1, + 0x7C, 0x0C, 0xEC, 0xF5, 0x8B, 0x05, 0xBC, 0xF2, 0x43, 0x10, 0x72, 0x04, + 0xE9, 0x1B, 0x79, 0x13, 0xE6, 0x19, 0x01, 0x15, 0x2C, 0x1D, 0x6F, 0x20, + 0x42, 0x38, 0x45, 0x32, 0xA3, 0x46, 0x6E, 0x32, 0xBB, 0x31, 0xCB, 0x29, + 0x56, 0x28, 0x9C, 0x3A, 0xAF, 0x2F, 0x4A, 0x4E, 0xD6, 0x30, 0x01, 0x49, + 0x72, 0x40, 0x36, 0x50, 0x89, 0x59, 0x47, 0x66, 0x30, 0x5F, 0x2E, 0x61, + 0x3F, 0x5E, 0x2B, 0x5A, 0xF3, 0x5C, 0x62, 0x5C, 0x0A, 0x4F, 0xEB, 0x4A, + 0x83, 0x43, 0x14, 0x42, 0xF4, 0x2D, 0x1C, 0x37, 0x7D, 0x15, 0x14, 0x1B, + 0x00, 0x1B, 0xE1, 0x16, 0x4C, 0x2C, 0x6E, 0x1D, 0x64, 0x2A, 0x88, 0x10, + 0xA3, 0x2F, 0x77, 0x17, 0x5A, 0x44, 0x3D, 0x38, 0x79, 0x4E, 0xCB, 0x46, + 0x45, 0x5B, 0xD2, 0x4E, 0x2C, 0x61, 0xDD, 0x58, 0x86, 0x58, 0xD9, 0x53, + 0xAA, 0x4E, 0x07, 0x47, 0xDD, 0x3F, 0xE7, 0x3E, 0x4E, 0x2F, 0xB5, 0x36, + 0xB8, 0x1A, 0x60, 0x26, 0x93, 0x06, 0x25, 0x1A, 0xE8, 0xFB, 0x79, 0x0D, + 0x68, 0xE7, 0x85, 0xED, 0x70, 0xD9, 0xF9, 0xD5, 0xAD, 0xDC, 0xE1, 0xD8, + 0x69, 0xE2, 0x7B, 0xEE, 0xB7, 0xEB, 0x52, 0x05, 0x7D, 0xFA, 0xF9, 0x0B, + 0x18, 0x17, 0x06, 0x1B, 0xFF, 0x33, 0x58, 0x32, 0x3A, 0x3A, 0x75, 0x36, + 0x05, 0x2F, 0xC7, 0x2B, 0x39, 0x24, 0xD2, 0x22, 0x9E, 0x1E, 0x4B, 0x27, + 0xDA, 0x0A, 0x24, 0x2A, 0x21, 0xFA, 0x26, 0x2A, 0x3D, 0x0B, 0x7B, 0x35, + 0x1C, 0x20, 0x5F, 0x3D, 0xEB, 0x27, 0xD1, 0x3A, 0x80, 0x1F, 0x26, 0x29, + 0x95, 0x0F, 0x13, 0x14, 0x5D, 0x11, 0xE7, 0x0A, 0x5A, 0x25, 0xC8, 0x09, + 0x15, 0x33, 0x0F, 0x0B, 0xE4, 0x32, 0x8A, 0x0A, 0x6E, 0x1E, 0x44, 0xFA, + 0xA8, 0x07, 0xE8, 0xEC, 0x14, 0x09, 0x24, 0xF4, 0x73, 0x02, 0xF7, 0xEF, + 0xDA, 0xF7, 0xAD, 0xE3, 0x31, 0x10, 0xC3, 0xED, 0xDA, 0x24, 0xE0, 0xF2, + 0x8A, 0x17, 0x7A, 0xE5, 0xE4, 0x05, 0x87, 0xE0, 0xDE, 0xF8, 0x12, 0xE1, + 0xBD, 0xF8, 0x86, 0xDF, 0xB0, 0xF5, 0xB2, 0xD8, 0x1D, 0xEA, 0x2F, 0xD4, + 0x00, 0xE8, 0x86, 0xD1, 0x1D, 0xE4, 0xA1, 0xCB, 0x19, 0xEE, 0xCD, 0xDB, + 0xF9, 0x0B, 0xB6, 0xFA, 0x82, 0x0B, 0x2B, 0xFD, 0x93, 0xFA, 0x79, 0xF5, + 0x64, 0xFC, 0x59, 0x00, 0x53, 0xF6, 0x84, 0x05, 0xD5, 0xFC, 0xA6, 0x03, + 0x0F, 0x1D, 0x92, 0x12, 0xAB, 0x2C, 0xA1, 0x25, 0x79, 0x29, 0xA6, 0x23, + 0xB2, 0x2B, 0x74, 0x1C, 0x30, 0x24, 0xB5, 0x19, 0x70, 0x12, 0xCA, 0x12, + 0xEF, 0x07, 0x7D, 0x0C, 0x65, 0xF7, 0xFE, 0xFE, 0xFD, 0xE8, 0xE1, 0xF2, + 0x75, 0xE7, 0x56, 0xEB, 0xB0, 0xED, 0x3E, 0xE4, 0xAC, 0xED, 0x4A, 0xE1, + 0xBA, 0xE8, 0xE8, 0xE6, 0x04, 0xFD, 0xE0, 0x0B, 0xC9, 0x13, 0xB0, 0x2E, + 0xC2, 0x13, 0x25, 0x36, 0x27, 0x17, 0xB4, 0x45, 0xE4, 0x30, 0x38, 0x5A, + 0x0A, 0x44, 0x00, 0x51, 0xDE, 0x39, 0xDB, 0x3E, 0x49, 0x2A, 0xE8, 0x37, + 0x75, 0x12, 0xEA, 0x22, 0xA5, 0xF6, 0xD4, 0x0A, 0x7C, 0xED, 0x13, 0xF8, + 0x80, 0xEB, 0x17, 0xE5, 0x52, 0xE0, 0xC8, 0xDB, 0x62, 0xCE, 0x10, 0xD9, + 0xEF, 0xC7, 0xC7, 0xDF, 0x13, 0xD1, 0x32, 0xF0, 0x25, 0xDB, 0x2F, 0xFD, + 0x09, 0xF0, 0x0F, 0x12, 0x77, 0x14, 0xDB, 0x30, 0x9F, 0x22, 0x61, 0x3C, + 0x51, 0x24, 0x24, 0x3A, 0xBB, 0x30, 0xC4, 0x3D, 0x6E, 0x27, 0x24, 0x31, + 0x83, 0x0C, 0xB6, 0x0E, 0xE2, 0xFB, 0xF5, 0xEE, 0x9D, 0xF8, 0xB1, 0xE7, + 0x45, 0xF3, 0x22, 0xEB, 0xD8, 0xE4, 0x45, 0xE5, 0x72, 0xDA, 0x42, 0xE6, + 0xC2, 0xD6, 0xC8, 0xF1, 0x30, 0xD1, 0xA0, 0xEE, 0x8B, 0xD3, 0xC4, 0xE5, + 0x07, 0xE0, 0x04, 0xED, 0x2C, 0xE7, 0x1A, 0xF0, 0x73, 0xE8, 0x2B, 0xED, + 0x03, 0xE7, 0xB0, 0xEC, 0x4F, 0xE0, 0x65, 0xE8, 0xDC, 0xCB, 0xBE, 0xE0, + 0xCE, 0xB8, 0x9F, 0xE0, 0x5C, 0xB5, 0x82, 0xE6, 0x8C, 0xB2, 0xC9, 0xE3, + 0x13, 0xB7, 0x59, 0xE1, 0x79, 0xB9, 0xD4, 0xE4, 0xF7, 0xB8, 0xFA, 0xF2, + 0x68, 0xC5, 0xE2, 0x01, 0xDA, 0xD2, 0xE0, 0x07, 0xE9, 0xDF, 0x3E, 0x0E, + 0x1A, 0xE9, 0xF5, 0x0D, 0x3F, 0xEF, 0xF8, 0x08, 0xE9, 0xEE, 0x48, 0xFC, + 0x2D, 0xE4, 0x24, 0xE7, 0x58, 0xE3, 0xD1, 0xDF, 0x29, 0xE5, 0xFF, 0xDC, + 0x24, 0xD4, 0xAC, 0xD1, 0x51, 0xCD, 0x1A, 0xD3, 0x86, 0xD7, 0xCD, 0xD9, + 0x78, 0xCD, 0x66, 0xCB, 0x0F, 0xCC, 0x9B, 0xCD, 0x74, 0xDA, 0x29, 0xDF, + 0xF1, 0xDA, 0x25, 0xD2, 0x76, 0xD7, 0x19, 0xB9, 0xF0, 0xCF, 0x91, 0xAC, + 0x84, 0xBE, 0xA4, 0xA6, 0x53, 0xB1, 0x5C, 0xA5, 0x44, 0xA9, 0x9C, 0xA4, + 0x1A, 0xA3, 0x23, 0xA0, 0x92, 0xA7, 0xFA, 0xA2, 0x0D, 0xA9, 0x87, 0xA0, + 0x83, 0xA5, 0x90, 0x9E, 0xEF, 0xA1, 0xF9, 0xA7, 0x26, 0xA9, 0x55, 0xB7, + 0xC3, 0xCC, 0x35, 0xD7, 0xFD, 0xEA, 0xAC, 0xF5, 0x82, 0xE5, 0xFC, 0xF6, + 0xE2, 0xDC, 0xC3, 0xED, 0x8A, 0xE5, 0x35, 0xF4, 0x97, 0xE4, 0x1A, 0xF5, + 0x3E, 0xDD, 0x80, 0xE7, 0xD7, 0xDA, 0x4B, 0xD8, 0xCA, 0xCA, 0xD2, 0xC5, + 0xDB, 0xB5, 0xEE, 0xB6, 0x78, 0xA8, 0xCB, 0xAB, 0xBC, 0xA4, 0xC8, 0xA0, + 0xC1, 0xAD, 0x67, 0xA1, 0x5B, 0xB7, 0x28, 0xA8, 0x5E, 0xBE, 0xD5, 0xA7, + 0xD8, 0xD5, 0x56, 0xB4, 0xB0, 0xF7, 0xED, 0xD2, 0xAC, 0x08, 0x7E, 0xEB, + 0xAA, 0x0F, 0x11, 0xFD, 0xD5, 0x15, 0x40, 0x07, 0x60, 0x19, 0x75, 0x0A, + 0x67, 0x0F, 0xFA, 0x02, 0x2B, 0xFE, 0xF4, 0xF4, 0x5C, 0xFA, 0xAB, 0xF7, + 0xCD, 0xF1, 0xC6, 0xF3, 0x7E, 0xF0, 0x06, 0xF1, 0x58, 0xFE, 0xB5, 0x01, + 0x0E, 0xEF, 0xAD, 0xFC, 0xA0, 0xDD, 0x87, 0xF8, 0x1B, 0xE3, 0xF0, 0x06, + 0x8A, 0xE4, 0x47, 0x0B, 0x60, 0xE8, 0x24, 0x14, 0x1B, 0xE6, 0x81, 0x13, + 0x87, 0xDF, 0x2B, 0x03, 0xB0, 0xE2, 0xFF, 0xFA, 0x16, 0xE3, 0x96, 0xEF, + 0xF5, 0xE2, 0xC6, 0xE5, 0xBC, 0xE0, 0x87, 0xE1, 0x26, 0xD6, 0xFB, 0xDA, + 0x6A, 0xD0, 0x9A, 0xDA, 0xED, 0xD2, 0xDD, 0xD7, 0x0A, 0xDF, 0x07, 0xD1, + 0x81, 0xE3, 0x33, 0xC7, 0xEB, 0xE5, 0x0E, 0xC9, 0x06, 0xF2, 0x51, 0xDA, + 0x7D, 0xFB, 0x18, 0xE7, 0x06, 0x08, 0xBF, 0xF5, 0x5B, 0x0D, 0x99, 0x08, + 0xF7, 0xFC, 0xB1, 0x0F, 0x01, 0xF0, 0x97, 0x0C, 0x9D, 0xF8, 0xE1, 0x07, + 0xF6, 0xFA, 0x89, 0x02, 0xD2, 0xF6, 0xBC, 0x0C, 0x1C, 0xFB, 0x89, 0x19, + 0x2C, 0x09, 0x4C, 0x15, 0xB3, 0x1E, 0x8C, 0x13, 0x7B, 0x26, 0xFE, 0x18, + 0x63, 0x1B, 0x86, 0x1E, 0xDC, 0x00, 0xCA, 0x12, 0x44, 0xF4, 0x21, 0x04, + 0x13, 0xEF, 0x52, 0xEE, 0xC9, 0xD6, 0x1E, 0xC3, 0x61, 0xC8, 0x45, 0xAD, + 0xD5, 0xC1, 0xCB, 0xA5, 0x9B, 0xC7, 0xA1, 0xA4, 0xF5, 0xE7, 0x8F, 0xB8, + 0x43, 0x08, 0x30, 0xD2, 0xEF, 0x07, 0xB1, 0xDA, 0x04, 0x0D, 0xFB, 0xEE, + 0x7A, 0x33, 0xBB, 0x15, 0xA9, 0x49, 0xFF, 0x28, 0xC3, 0x58, 0xD9, 0x45, + 0x8D, 0x63, 0x49, 0x60, 0x51, 0x62, 0xB3, 0x5F, 0x3F, 0x5D, 0x50, 0x51, + 0xA7, 0x4E, 0xE5, 0x3E, 0x3C, 0x38, 0xC3, 0x30, 0x9F, 0x1B, 0x1A, 0x1D, + 0x89, 0x05, 0x34, 0x02, 0xFB, 0x06, 0xED, 0xF2, 0x06, 0x16, 0x01, 0xF1, + 0xE3, 0x0F, 0x47, 0xE7, 0x32, 0x08, 0x88, 0xEB, 0x5A, 0x0F, 0x79, 0x03, + 0xC6, 0x1D, 0xB0, 0x1A, 0x88, 0x35, 0xF6, 0x32, 0x98, 0x4B, 0x6A, 0x48, + 0xCD, 0x4B, 0xB8, 0x48, 0x1A, 0x45, 0xA6, 0x44, 0x48, 0x43, 0x22, 0x44, + 0x58, 0x3A, 0x4C, 0x30, 0xBE, 0x36, 0x06, 0x1A, 0x36, 0x3C, 0x6C, 0x17, + 0x65, 0x3B, 0x95, 0x1A, 0x75, 0x38, 0x90, 0x19, 0x79, 0x35, 0xF3, 0x0E, + 0xE9, 0x24, 0x27, 0xFA, 0x50, 0x1A, 0x07, 0xF7, 0x75, 0x1E, 0xD0, 0x02, + 0x14, 0x2C, 0xF5, 0x10, 0x1B, 0x3C, 0x09, 0x23, 0x71, 0x3F, 0x6E, 0x2E, + 0x3A, 0x2D, 0x26, 0x25, 0xB6, 0x14, 0xE6, 0x14, 0xD2, 0x0C, 0xAD, 0x16, + 0xC2, 0x06, 0x49, 0x18, 0xE6, 0xFC, 0x59, 0x0C, 0x6B, 0x08, 0x88, 0x0F, + 0x20, 0x13, 0xCD, 0x14, 0x30, 0x0F, 0xE2, 0x0E, 0xFA, 0x11, 0xBD, 0x0C, + 0xF1, 0x1B, 0x0F, 0x12, 0x0B, 0x27, 0xBE, 0x1F, 0xD1, 0x2E, 0xDD, 0x2D, + 0x75, 0x30, 0x17, 0x30, 0x9B, 0x28, 0xFE, 0x23, 0xCC, 0x23, 0xD5, 0x20, + 0x26, 0x1F, 0x3D, 0x27, 0xC7, 0x16, 0x78, 0x29, 0x8D, 0x12, 0x15, 0x25, + 0x41, 0x17, 0xFE, 0x21, 0x96, 0x1C, 0x03, 0x20, 0x78, 0x0F, 0x1E, 0x10, + 0xBA, 0x03, 0xE0, 0x03, 0x31, 0x15, 0x29, 0x13, 0x18, 0x2F, 0xE8, 0x23, + 0xCA, 0x3C, 0xE7, 0x21, 0xDC, 0x46, 0xA6, 0x1F, 0x1A, 0x40, 0x61, 0x1B, + 0x2A, 0x29, 0xA6, 0x12, 0xF9, 0x14, 0x33, 0x0A, 0x1A, 0x08, 0x13, 0xFF, + 0xC0, 0xF9, 0xA4, 0xEE, 0xC1, 0xEB, 0xA2, 0xDE, 0x97, 0xED, 0x39, 0xD9, + 0x08, 0xF2, 0xCF, 0xD6, 0x73, 0xF4, 0xE6, 0xDC, 0xE2, 0x07, 0xD2, 0xF9, + 0x3C, 0x1A, 0x79, 0x0E, 0x79, 0x2E, 0x6C, 0x1C, 0x89, 0x4E, 0x8D, 0x39, + 0x87, 0x47, 0x35, 0x3C, 0x2A, 0x2F, 0x62, 0x30, 0x4C, 0x29, 0xC7, 0x30, + 0x75, 0x15, 0xBD, 0x1B, 0xB4, 0xF9, 0xD1, 0xFA, 0x63, 0xE5, 0x69, 0xE5, + 0x39, 0xDA, 0x1B, 0xDC, 0xC2, 0xD7, 0x3A, 0xD5, 0x40, 0xDC, 0x64, 0xCE, + 0x58, 0xEE, 0x3D, 0xD7, 0xA0, 0xFA, 0x0E, 0xE5, 0x04, 0x00, 0x95, 0xF2, + 0x40, 0x10, 0x2A, 0x05, 0x10, 0x17, 0x6B, 0x0D, 0xA9, 0x16, 0x88, 0x16, + 0xA1, 0x17, 0x5B, 0x28, 0xAC, 0x17, 0x90, 0x34, 0x47, 0x11, 0xEE, 0x2E, + 0xE5, 0x05, 0xDE, 0x22, 0x1F, 0xFD, 0x30, 0x1D, 0x16, 0xF9, 0xAB, 0x15, + 0x9F, 0xFE, 0xCC, 0x11, 0xDE, 0x04, 0xF8, 0x0C, 0x12, 0x02, 0x8E, 0xFF, + 0xA9, 0xF4, 0xDF, 0xF0, 0x73, 0xE9, 0x6B, 0xE7, 0x96, 0xEE, 0xB5, 0xE2, + 0xBD, 0xFE, 0x24, 0xE4, 0xE1, 0x08, 0xB4, 0xEC, 0x03, 0x0B, 0xC0, 0xF7, + 0x8D, 0x04, 0x76, 0xF4, 0x44, 0xFA, 0x17, 0xE0, 0xF1, 0xFC, 0x65, 0xDA, + 0x7A, 0x04, 0x29, 0xE6, 0xE9, 0xF9, 0xAA, 0xE6, 0xA9, 0xF8, 0xB6, 0xF1, + 0x20, 0xFE, 0xE0, 0x03, 0xD5, 0xF0, 0x6B, 0xFD, 0xE1, 0xF8, 0x28, 0x03, + 0xE9, 0x0D, 0xB6, 0x11, 0xFF, 0x0D, 0xBF, 0x0F, 0x7A, 0x02, 0xA0, 0x0C, + 0xEF, 0xF0, 0xB9, 0x09, 0x2A, 0xEC, 0xEF, 0x14, 0x41, 0xFD, 0xCF, 0x2E, + 0xBE, 0x02, 0x12, 0x33, 0x87, 0xFB, 0x15, 0x27, 0xE7, 0xF1, 0xAD, 0x1A, + 0xB4, 0xE8, 0x30, 0x15, 0x25, 0xE6, 0x12, 0x1D, 0xBA, 0xE4, 0x61, 0x20, + 0xF2, 0xEA, 0x3C, 0x28, 0x92, 0xF6, 0x89, 0x33, 0xCD, 0xF4, 0x66, 0x25, + 0xE7, 0xEC, 0x83, 0x14, 0xAE, 0xDC, 0xB6, 0x09, 0xC7, 0xCC, 0x15, 0xF8, + 0xF1, 0xC9, 0xDA, 0xE1, 0xDD, 0xBE, 0x67, 0xC4, 0x65, 0xAC, 0xC6, 0xAF, + 0x1B, 0xA0, 0x57, 0xA8, 0x11, 0xA8, 0xA2, 0xAF, 0x9F, 0xBE, 0x3F, 0xC8, + 0xB1, 0xC9, 0xD7, 0xDC, 0xB5, 0xD3, 0xC2, 0xF4, 0x30, 0xEB, 0x2B, 0x1B, + 0xE9, 0xFB, 0x39, 0x37, 0x23, 0x00, 0x31, 0x45, 0x14, 0x08, 0x9A, 0x4F, + 0x38, 0x06, 0x7D, 0x43, 0x74, 0xF6, 0x41, 0x2B, 0x31, 0xE7, 0x2F, 0x1C, + 0x53, 0xCC, 0x1F, 0xFF, 0x02, 0xC0, 0x01, 0xE6, 0x76, 0xC2, 0xE0, 0xD4, + 0xC4, 0xB0, 0x13, 0xBA, 0x23, 0xAB, 0x35, 0xB3, 0x38, 0xAD, 0xBD, 0xAB, + 0x7A, 0xA8, 0x85, 0x9D, 0x18, 0xBC, 0x46, 0xB5, 0xA4, 0xCF, 0x8A, 0xD3, + 0x0D, 0xD9, 0xD0, 0xDF, 0x44, 0xF8, 0xC2, 0xF9, 0x32, 0x0A, 0x27, 0x09, + 0x55, 0x0A, 0x13, 0x09, 0xA9, 0x10, 0x6E, 0x10, 0xF3, 0x0E, 0x68, 0x0F, + 0x63, 0x19, 0x75, 0x0F, 0x4E, 0x1A, 0xB0, 0x07, 0xA9, 0x12, 0x4A, 0x06, + 0x51, 0x1E, 0x85, 0x17, 0xB9, 0x1C, 0x2F, 0x15, 0x2E, 0x1A, 0x54, 0x0C, + 0x0F, 0x14, 0xC6, 0xFB, 0xEB, 0x05, 0x2C, 0xF4, 0x7C, 0x00, 0x13, 0x0A, + 0x71, 0xF9, 0x17, 0x1B, 0x40, 0xF6, 0x70, 0x1D, 0x5F, 0x04, 0xD7, 0x22, + 0xA0, 0x14, 0xEE, 0x29, 0x1C, 0x11, 0xDE, 0x23, 0x91, 0xFF, 0x03, 0x12, + 0x2E, 0xF1, 0xC9, 0xFF, 0x8C, 0xF7, 0x64, 0xF8, 0x38, 0xF6, 0x56, 0xE9, + 0x65, 0xEC, 0xFE, 0xDE, 0x3C, 0xF7, 0x7C, 0xEE, 0x86, 0xFE, 0x77, 0xF5, + 0x49, 0xEF, 0x78, 0xE8, 0xBC, 0xE7, 0x66, 0xEB, 0x8C, 0xE7, 0xF0, 0xF4, + 0x1F, 0xDC, 0x47, 0xE0, 0xA8, 0xDB, 0xE0, 0xCB, 0xDD, 0xE9, 0xBB, 0xD6, + 0x16, 0xF5, 0x1E, 0xE9, 0xE4, 0xEC, 0x36, 0xE1, 0x7D, 0xE8, 0x5D, 0xDA, + 0x16, 0xF1, 0x79, 0xDD, 0x31, 0xF8, 0xD1, 0xE1, 0x8F, 0xFD, 0xB1, 0xF6, + 0xD9, 0xEB, 0xE6, 0xFB, 0xFF, 0xD2, 0xA6, 0xF4, 0xB8, 0xCC, 0x69, 0xF1, + 0xCB, 0xD5, 0xAB, 0xE7, 0xAB, 0xEB, 0x6E, 0xEE, 0x50, 0xE3, 0xFF, 0xEE, + 0x3C, 0xC3, 0x8E, 0xDB, 0xF9, 0xBF, 0x15, 0xD8, 0xF5, 0xC3, 0xE5, 0xD1, + 0x05, 0xBC, 0xEF, 0xC0, 0xF6, 0xB6, 0x36, 0xB6, 0x30, 0xC3, 0x48, 0xBB, + 0xFD, 0xDB, 0x93, 0xD6, 0xD0, 0xE4, 0xEC, 0xEA, 0x75, 0xE6, 0xD0, 0xF4, + 0x7A, 0xF3, 0xBC, 0x07, 0x92, 0x05, 0x9D, 0x17, 0xB7, 0x10, 0xA8, 0x16, + 0xDB, 0x1B, 0x12, 0x18, 0x7B, 0x1A, 0x9C, 0x16, 0x5D, 0x09, 0xAA, 0x11, + 0x37, 0xF6, 0x64, 0x05, 0x0A, 0xDE, 0x76, 0xE3, 0x9B, 0xD1, 0x52, 0xD1, + 0x3C, 0xD0, 0xEC, 0xD0, 0x15, 0xCC, 0x10, 0xC8, 0xD1, 0xD2, 0x4D, 0xC3, + 0xF5, 0xE2, 0x84, 0xC5, 0x4B, 0xE3, 0xF5, 0xC4, 0x46, 0xE3, 0xD3, 0xCE, + 0xE9, 0xF9, 0xED, 0xE5, 0xD1, 0x0E, 0x39, 0xF2, 0x77, 0x19, 0x03, 0xF1, + 0xA1, 0x2E, 0x12, 0xFA, 0x9D, 0x40, 0xD1, 0x0C, 0xEA, 0x2A, 0xCB, 0x0D, + 0x9F, 0xFE, 0xDC, 0x05, 0xD6, 0xF7, 0x0B, 0x14, 0xAF, 0x0A, 0xAE, 0x1D, + 0x34, 0x0F, 0xED, 0x0E, 0x77, 0x0E, 0x74, 0x0A, 0x18, 0x01, 0xF3, 0x0D, + 0xD2, 0xF3, 0xA9, 0x13, 0xCD, 0xF8, 0xD5, 0x1C, 0x8A, 0x03, 0x54, 0x1E, + 0x20, 0x1A, 0xF0, 0x24, 0x88, 0x29, 0x79, 0x26, 0x71, 0x24, 0xFD, 0x15, + 0x67, 0x22, 0xAB, 0x04, 0x84, 0x16, 0x2B, 0xF2, 0xC0, 0x03, 0xDB, 0xE4, + 0x92, 0x06, 0x7B, 0xE7, 0x44, 0x1E, 0x97, 0xF3, 0x91, 0x31, 0x1D, 0xFD, + 0x65, 0x28, 0x83, 0xFF, 0x72, 0x17, 0xD1, 0x08, 0x23, 0x12, 0x81, 0x08, + 0x02, 0x12, 0xC0, 0xF0, 0xFB, 0x1F, 0x77, 0xEA, 0x6F, 0x28, 0x54, 0xF2, + 0xBC, 0x1E, 0x1D, 0xEF, 0xFD, 0x21, 0x15, 0xF1, 0xEF, 0x2F, 0x87, 0xF7, + 0x54, 0x35, 0x03, 0xF5, 0xD1, 0x2A, 0x5B, 0xE8, 0xD3, 0x1F, 0x86, 0xE6, + 0x80, 0x1B, 0x02, 0xF4, 0xE5, 0x1B, 0x61, 0x06, 0xAE, 0x25, 0xCA, 0x1B, + 0xC4, 0x2F, 0x6F, 0x2A, 0x49, 0x32, 0x72, 0x33, 0x1F, 0x33, 0x5A, 0x3C, + 0x14, 0x39, 0xB5, 0x3A, 0xA9, 0x36, 0xBF, 0x26, 0xB3, 0x2A, 0x9C, 0x12, + 0x1A, 0x1C, 0x4C, 0x01, 0xC4, 0x0A, 0xA5, 0xE5, 0x87, 0xFF, 0xE9, 0xD1, + 0x35, 0x05, 0xB7, 0xDA, 0x52, 0x09, 0x24, 0xF0, 0xE8, 0x0C, 0x29, 0x07, + 0x58, 0x24, 0x1A, 0x27, 0x9C, 0x39, 0xDB, 0x3D, 0x56, 0x4F, 0x30, 0x52, + 0x59, 0x60, 0x67, 0x60, 0xB6, 0x5F, 0x8C, 0x5F, 0xC0, 0x5E, 0xCA, 0x57, + 0x41, 0x5B, 0x89, 0x42, 0xB6, 0x4F, 0x04, 0x2A, 0x03, 0x33, 0x4F, 0x0F, + 0x75, 0x0A, 0x0B, 0xF6, 0x7B, 0xF5, 0x16, 0xEA, 0x73, 0xEB, 0x26, 0xD2, + 0x7E, 0xE5, 0x33, 0xBC, 0x0A, 0xE9, 0x50, 0xCA, 0x17, 0xE2, 0x99, 0xE4, + 0x2C, 0xE4, 0x8A, 0x08, 0x56, 0xFA, 0xBA, 0x26, 0xEB, 0x02, 0x3E, 0x1A, + 0xBF, 0x23, 0x96, 0x1B, 0x73, 0x50, 0xA0, 0x32, 0x2B, 0x4E, 0x8A, 0x30, + 0x0A, 0x44, 0x06, 0x2E, 0xC7, 0x48, 0x2A, 0x38, 0xED, 0x40, 0xFE, 0x34, + 0x53, 0x34, 0xCB, 0x27, 0xAC, 0x34, 0x80, 0x1F, 0xE7, 0x36, 0x39, 0x1B, + 0xA7, 0x2D, 0x9D, 0x1C, 0xD4, 0x22, 0x94, 0x26, 0xEA, 0x24, 0x96, 0x2E, + 0xE5, 0x1C, 0xFA, 0x20, 0xFF, 0x09, 0x9D, 0x15, 0x0E, 0x01, 0x3C, 0x15, + 0x2B, 0x0A, 0x36, 0x1C, 0xFF, 0x15, 0x9E, 0x27, 0x8B, 0x10, 0x56, 0x21, + 0xC5, 0x11, 0x5E, 0x1B, 0x60, 0x18, 0x60, 0x17, 0xA5, 0x17, 0x17, 0x11, + 0xE0, 0x0F, 0xE0, 0x14, 0x5B, 0x07, 0x29, 0x24, 0x03, 0x0C, 0xDD, 0x34, + 0x71, 0x1B, 0x44, 0x3D, 0xDB, 0x23, 0xC5, 0x39, 0xCA, 0x1C, 0xAB, 0x27, + 0x6E, 0x17, 0xF6, 0x18, 0x51, 0x0F, 0xBF, 0x0A, 0xD3, 0x13, 0xFC, 0x09, + 0x51, 0x14, 0xCA, 0x09, 0xB5, 0x03, 0xF1, 0xFE, 0x0B, 0x0C, 0xC9, 0x0E, + 0x17, 0x1A, 0x1A, 0x22, 0x2B, 0x1F, 0x34, 0x25, 0x9D, 0x2B, 0xCA, 0x2E, + 0x4C, 0x2C, 0x98, 0x32, 0x98, 0x24, 0x27, 0x29, 0xDD, 0x36, 0x9B, 0x2E, + 0x9A, 0x48, 0x78, 0x36, 0x07, 0x3E, 0xB2, 0x31, 0x44, 0x2D, 0xD0, 0x28, + 0x12, 0x22, 0xF7, 0x1E, 0x13, 0x14, 0xFA, 0x12, 0x8E, 0x08, 0x15, 0x04, + 0xBF, 0x01, 0x97, 0xF7, 0xA7, 0xEB, 0xC9, 0xE0, 0x60, 0xDA, 0x49, 0xC0, + 0xB1, 0xE4, 0x38, 0xAF, 0xCF, 0xF9, 0xDE, 0xC0, 0xF0, 0x00, 0x00, 0xDD, + 0x9B, 0x10, 0x35, 0x08, 0xDE, 0x29, 0x07, 0x3F, 0x7B, 0x2B, 0xE6, 0x4B, + 0x6B, 0x2C, 0x9C, 0x47, 0xB1, 0x27, 0xAE, 0x42, 0x78, 0x13, 0xB5, 0x35, + 0xE6, 0x08, 0x05, 0x2C, 0x16, 0x00, 0x94, 0x1B, 0x37, 0xF5, 0x74, 0x04, + 0x8D, 0xEE, 0x9D, 0xEB, 0x35, 0xD6, 0x30, 0xC5, 0xD0, 0xBA, 0x2F, 0xA7, + 0x2D, 0xBC, 0x9E, 0xB6, 0x86, 0xBF, 0x57, 0xD4, 0xF0, 0xAE, 0xED, 0xD2, + 0xD2, 0xAB, 0xA7, 0xD0, 0x5F, 0xB9, 0xB6, 0xDD, 0x02, 0xC4, 0xD8, 0xE7, + 0xAC, 0xCF, 0xF7, 0xF2, 0x42, 0xDE, 0xBF, 0x02, 0x0F, 0xF2, 0x49, 0x18, + 0xCA, 0x00, 0x1A, 0x22, 0x4C, 0x0A, 0xEF, 0x1F, 0x18, 0x10, 0xD4, 0x1C, + 0xD2, 0x0A, 0x66, 0x18, 0xFD, 0x06, 0x3E, 0x16, 0xA4, 0x12, 0xD0, 0x22, + 0x6C, 0x1B, 0x92, 0x2F, 0x7F, 0x0A, 0x74, 0x25, 0xD9, 0xF7, 0xE1, 0x1C, + 0xE8, 0xEF, 0xC5, 0x1A, 0xEA, 0xE4, 0x20, 0x16, 0xBA, 0xEB, 0x27, 0x16, + 0x02, 0x01, 0xE7, 0x05, 0x85, 0x0C, 0x64, 0xEC, 0xD6, 0xFC, 0xA8, 0xCF, + 0x99, 0xED, 0x60, 0xC2, 0x6F, 0xEB, 0xDB, 0xCA, 0x93, 0xE2, 0x74, 0xCE, + 0x28, 0xDF, 0x0A, 0xD6, 0xA4, 0xDF, 0xD2, 0xDF, 0x33, 0xE4, 0x8F, 0xE7, + 0x16, 0xDF, 0x07, 0xE9, 0x78, 0xE0, 0xE6, 0xF1, 0x13, 0xE1, 0xC0, 0xED, + 0x6D, 0xD7, 0xB3, 0xDF, 0xAB, 0xDC, 0x5F, 0xF2, 0xE4, 0xD7, 0x8B, 0xFF, + 0xA9, 0xD2, 0x57, 0xF8, 0x7E, 0xDE, 0xAB, 0xF0, 0xE1, 0xDA, 0x73, 0xDC, + 0xC3, 0xCC, 0xD3, 0xCA, 0xD1, 0xCB, 0x20, 0xD1, 0xC0, 0xD1, 0x1F, 0xE6, + 0xC3, 0xD2, 0xB8, 0xF4, 0x7E, 0xCA, 0xDB, 0xF5, 0x4E, 0xCA, 0xB1, 0xFE, + 0x0C, 0xD7, 0x87, 0x0A, 0x06, 0xDF, 0xA4, 0x07, 0x90, 0xD9, 0x70, 0xFA, + 0x7D, 0xD7, 0x3C, 0xF9, 0x2F, 0xD4, 0xE9, 0xEA, 0x14, 0xC3, 0xA0, 0xBF, + 0x2E, 0xBA, 0xBF, 0xA5, 0xED, 0xB9, 0x4F, 0x9E, 0xE7, 0xB9, 0xF1, 0xA4, + 0xC1, 0xC4, 0x70, 0xBA, 0xB3, 0xD9, 0xD5, 0xD1, 0x8F, 0xEB, 0xC5, 0xEB, + 0x1D, 0xF7, 0x4B, 0x05, 0x33, 0x08, 0xC0, 0x1B, 0x8D, 0x19, 0xFB, 0x2F, + 0x41, 0x1D, 0xF9, 0x3D, 0x69, 0x1A, 0xC6, 0x44, 0x4F, 0x10, 0x9F, 0x3F, + 0xA3, 0xFE, 0xA9, 0x29, 0xD7, 0xEC, 0xC6, 0x0B, 0x65, 0xD9, 0x4C, 0xEB, + 0xD1, 0xD0, 0x0D, 0xE0, 0xBF, 0xC4, 0xA7, 0xDB, 0x68, 0xB0, 0xC6, 0xC1, + 0x33, 0xB7, 0xD1, 0xC2, 0x18, 0xC4, 0x47, 0xDC, 0x32, 0xB9, 0xFC, 0xDA, + 0xC7, 0xB7, 0x46, 0xDF, 0xE0, 0xD1, 0x63, 0xFD, 0x89, 0xE9, 0xF0, 0x09, + 0x41, 0x03, 0xB0, 0x0F, 0xE4, 0x27, 0xF4, 0x1E, 0xF9, 0x35, 0x6F, 0x1F, + 0xB0, 0x2C, 0x76, 0x14, 0x71, 0x2C, 0x88, 0x12, 0xE2, 0x30, 0xDC, 0x10, + 0x06, 0x30, 0xA0, 0x11, 0xDC, 0x2C, 0xA5, 0x10, 0x88, 0x23, 0xF3, 0xFA, + 0x06, 0x1E, 0xB8, 0xEA, 0x6C, 0x1D, 0x62, 0xF5, 0x5C, 0x15, 0xAA, 0x07, + 0x37, 0x1C, 0x5E, 0x20, 0x3F, 0x2D, 0x25, 0x3F, 0xCD, 0x1D, 0x26, 0x3E, + 0x70, 0x07, 0x05, 0x2E, 0x8E, 0xFE, 0x7A, 0x1E, 0xC5, 0xF5, 0xD3, 0x0A, + 0x65, 0xF5, 0x3E, 0x03, 0x76, 0xF6, 0x56, 0xFE, 0x67, 0xF4, 0x14, 0xFA, + 0xE6, 0xF3, 0x20, 0x01, 0x95, 0xF1, 0x74, 0x08, 0xCD, 0xEF, 0x83, 0x01, + 0xF8, 0xFC, 0xB6, 0xFC, 0x24, 0x13, 0xF9, 0x06, 0xF5, 0x18, 0x2A, 0x16, + 0x5E, 0x08, 0x1A, 0x0C, 0x5E, 0xF6, 0xC7, 0xF0, 0x2A, 0x01, 0xFD, 0xEB, + 0x38, 0x10, 0x1A, 0xEE, 0xED, 0x02, 0x99, 0xE0, 0x75, 0xFD, 0xAA, 0xDC, + 0x31, 0x02, 0xF2, 0xE3, 0x84, 0xF2, 0x24, 0xDD, 0x6E, 0xEA, 0x88, 0xE2, + 0x6C, 0xEB, 0xB1, 0xEE, 0x72, 0xE8, 0x3D, 0xF2, 0x48, 0x01, 0x8E, 0x02, + 0xDC, 0x13, 0x62, 0x07, 0x1D, 0x03, 0xD6, 0xF8, 0x83, 0xF0, 0x00, 0xEF, + 0x3F, 0xD2, 0xF1, 0xDA, 0xD2, 0xAD, 0x19, 0xB4, 0x33, 0xA6, 0xF8, 0x9D, + 0x9E, 0xAF, 0x4A, 0x9F, 0xEF, 0xB1, 0x3B, 0x9F, 0xA6, 0xBD, 0x60, 0xAA, + 0x76, 0xD0, 0xFF, 0xC4, 0x75, 0xCB, 0x8F, 0xD1, 0x82, 0xCC, 0x70, 0xE5, + 0x50, 0xF3, 0xA7, 0x0F, 0xE0, 0x0E, 0x21, 0x1B, 0x86, 0x11, 0x4C, 0x03, + 0x48, 0x20, 0x5B, 0xF6, 0x51, 0x23, 0xF7, 0xE9, 0x53, 0x08, 0xE2, 0xD4, + 0x53, 0xEA, 0x6C, 0xC8, 0x6D, 0xD4, 0xBF, 0xBB, 0x74, 0xCC, 0xA0, 0xAD, + 0x17, 0xCE, 0xF3, 0xA4, 0x95, 0xC4, 0x24, 0xA1, 0xA2, 0xB6, 0xBD, 0x9F, + 0xA1, 0xB7, 0x15, 0xA1, 0xF8, 0xC7, 0x1C, 0xA9, 0xDF, 0xDD, 0x03, 0xB8, + 0x6C, 0xF5, 0x31, 0xD1, 0x9E, 0x08, 0x9D, 0xEB, 0xF9, 0x14, 0xB4, 0xFE, + 0x89, 0x20, 0xD6, 0x0D, 0xAE, 0x16, 0x33, 0x0C, 0xBA, 0x00, 0x3B, 0xFF, + 0x60, 0x03, 0xBD, 0x00, 0xDE, 0x0B, 0xA9, 0x07, 0x9A, 0x0A, 0xB2, 0x02, + 0x2C, 0x16, 0x96, 0x08, 0xFC, 0x16, 0x57, 0x1A, 0x17, 0x02, 0xC3, 0x22, + 0xB7, 0xFC, 0xCB, 0x27, 0x73, 0x02, 0x9E, 0x2A, 0xCD, 0x0B, 0x99, 0x2D, + 0xF3, 0x0C, 0x08, 0x2C, 0x61, 0x0A, 0x63, 0x26, 0x15, 0x05, 0xAE, 0x0D, + 0x61, 0xFB, 0x88, 0xE4, 0x0D, 0xFE, 0x7E, 0xD9, 0x73, 0xFA, 0x26, 0xE1, + 0x10, 0xEB, 0x5D, 0xDF, 0x1D, 0xF1, 0x8C, 0xEA, 0x01, 0x00, 0xC4, 0xFE, + 0x62, 0xF3, 0x91, 0xF7, 0xB1, 0xF3, 0x02, 0xF6, 0x38, 0x02, 0xAC, 0x06, + 0x3F, 0x04, 0x1B, 0x06, 0x1A, 0x09, 0x74, 0xFF, 0xED, 0x0B, 0x6F, 0x07, + 0x95, 0x0D, 0x8C, 0x14, 0xD7, 0x0D, 0x1A, 0x16, 0x50, 0x0C, 0x8B, 0x0D, + 0xF1, 0x11, 0x05, 0x04, 0x48, 0x18, 0xC6, 0xFB, 0x42, 0x19, 0xB1, 0xFD, + 0x87, 0x0A, 0x17, 0xFC, 0xDD, 0xFC, 0x0F, 0xF6, 0xFC, 0x06, 0xD6, 0x07, + 0xE8, 0x12, 0x63, 0x20, 0x91, 0x1B, 0x69, 0x30, 0xF9, 0x24, 0xF7, 0x37, + 0xBC, 0x23, 0x84, 0x2B, 0xF2, 0x1C, 0x46, 0x12, 0xE6, 0x18, 0x01, 0x04, + 0xE8, 0x01, 0x17, 0xF4, 0xB4, 0xDA, 0x83, 0xD2, 0x99, 0xD0, 0x2C, 0xC2, + 0xE7, 0xE1, 0x98, 0xC7, 0x4A, 0xEB, 0x84, 0xCF, 0xC6, 0xEB, 0x85, 0xE1, + 0x79, 0xFA, 0x57, 0x07, 0x37, 0x0D, 0x38, 0x27, 0x7A, 0x20, 0xF7, 0x2F, + 0x71, 0x40, 0xAE, 0x36, 0x14, 0x53, 0xEF, 0x3C, 0x8F, 0x57, 0x95, 0x44, + 0x95, 0x56, 0x31, 0x4B, 0x6D, 0x42, 0xC2, 0x3D, 0x71, 0x1D, 0x16, 0x19, + 0x15, 0xF8, 0xD2, 0xF3, 0xD5, 0xDE, 0xA9, 0xD8, 0x65, 0xD4, 0x01, 0xC5, + 0xFB, 0xDE, 0x61, 0xC5, 0xBA, 0xEF, 0xFB, 0xD2, 0x4E, 0xF7, 0x2A, 0xE2, + 0xFB, 0xFF, 0xE0, 0xF1, 0x3A, 0x06, 0x09, 0xF8, 0x98, 0x0D, 0xD7, 0x00, + 0x7E, 0x1D, 0xE4, 0x10, 0x07, 0x32, 0x91, 0x1F, 0x6C, 0x3F, 0x66, 0x2A, + 0xDE, 0x3E, 0x9E, 0x26, 0xEF, 0x43, 0x3A, 0x21, 0x61, 0x43, 0xE8, 0x1D, + 0x37, 0x34, 0x8C, 0x14, 0xC5, 0x28, 0xA4, 0x10, 0xAE, 0x20, 0x13, 0x14, + 0x49, 0x1F, 0xD1, 0x15, 0x2B, 0x27, 0xB0, 0x17, 0xB9, 0x28, 0x06, 0x1F, + 0x37, 0x18, 0x21, 0x23, 0x55, 0x11, 0x09, 0x29, 0x5E, 0x17, 0x6C, 0x34, + 0xEE, 0x11, 0x08, 0x36, 0xC2, 0x14, 0xE3, 0x3B, 0xA2, 0x1A, 0x7C, 0x46, + 0x25, 0x0A, 0x19, 0x38, 0x87, 0xF9, 0x90, 0x1C, 0xE1, 0xF5, 0x3A, 0x09, + 0x5C, 0xFA, 0x28, 0x09, 0xCD, 0x02, 0xF7, 0x18, 0x65, 0x08, 0x62, 0x22, + 0xD8, 0x10, 0xB8, 0x24, 0x5C, 0x17, 0x55, 0x1A, 0x73, 0x1B, 0xFC, 0x0E, + 0xDB, 0x23, 0xC3, 0x11, 0xDB, 0x2A, 0xE2, 0x14, 0x48, 0x2F, 0x3E, 0x17, + 0xF5, 0x35, 0x33, 0x25, 0xA5, 0x36, 0x2F, 0x2F, 0x4A, 0x23, 0x4B, 0x20, + 0x9B, 0x15, 0xBB, 0x1F, 0x3A, 0x1C, 0xEE, 0x30, 0xF6, 0x22, 0x3E, 0x37, + 0xB2, 0x27, 0xDD, 0x41, 0xBA, 0x2B, 0x48, 0x4B, 0xFC, 0x37, 0x5C, 0x52, + 0xCF, 0x46, 0x55, 0x5B, 0xF7, 0x4E, 0xC7, 0x60, 0xD2, 0x48, 0xC1, 0x57, + 0xB7, 0x3A, 0x3E, 0x48, 0xFD, 0x2E, 0x7A, 0x33, 0x62, 0x1D, 0xAD, 0x12, + 0xC4, 0x07, 0xCD, 0xF9, 0x36, 0xEB, 0xA7, 0xE0, 0xA5, 0xD6, 0x12, 0xC9, + 0xFA, 0xDD, 0x35, 0xCD, 0xF7, 0xEE, 0x13, 0xE1, 0x43, 0x0C, 0x0B, 0x02, + 0xAC, 0x21, 0xA3, 0x24, 0xEF, 0x1C, 0xDA, 0x39, 0xE6, 0x21, 0xF9, 0x4E, + 0x76, 0x28, 0xC1, 0x53, 0x89, 0x26, 0xDE, 0x47, 0x44, 0x1F, 0x4F, 0x35, + 0x24, 0x0B, 0xEF, 0x1B, 0x7D, 0xF5, 0xD2, 0x07, 0x4A, 0xDB, 0x30, 0xE7, + 0x84, 0xBE, 0xB8, 0xC0, 0xF0, 0xAD, 0xC6, 0xB0, 0x8A, 0xA8, 0xC9, 0xB1, + 0x34, 0xB7, 0xA0, 0xC1, 0x89, 0xCE, 0x9A, 0xCF, 0x11, 0xE1, 0x89, 0xDE, + 0x16, 0xEF, 0xB1, 0xF6, 0x7E, 0xF3, 0x4D, 0x07, 0xFC, 0xF6, 0xD4, 0x11, + 0xEF, 0xF9, 0x6B, 0x1A, 0x63, 0xFF, 0x54, 0x24, 0xFD, 0x06, 0xF8, 0x2E, + 0x00, 0x03, 0xED, 0x2A, 0x88, 0xF6, 0x2E, 0x18, 0xE1, 0xF0, 0xA0, 0x0A, + 0x28, 0xF0, 0xFD, 0x00, 0x66, 0xF1, 0x6B, 0xFA, 0x2C, 0xFA, 0xE6, 0x01, + 0xB2, 0x04, 0xE8, 0x0C, 0x65, 0x08, 0xA8, 0x0A, 0xF0, 0x0E, 0x0B, 0x00, + 0x2E, 0x16, 0xCF, 0xF7, 0xFA, 0x17, 0xDC, 0xF5, 0xC6, 0x1B, 0x3C, 0xF9, + 0xFF, 0x16, 0xC1, 0xF2, 0xDF, 0x04, 0x44, 0xE2, 0x93, 0xF3, 0xEA, 0xD7, + 0x44, 0xE2, 0x64, 0xCF, 0x4A, 0xD6, 0x63, 0xD0, 0x31, 0xD2, 0x13, 0xD5, + 0xAD, 0xD8, 0x82, 0xD8, 0x92, 0xE6, 0x04, 0xE5, 0xC5, 0xE6, 0x75, 0xEB, + 0x87, 0xF0, 0x42, 0xF8, 0xC8, 0xFF, 0x07, 0x04, 0x37, 0xFF, 0xCF, 0xFF, + 0x6F, 0xFB, 0x83, 0xFD, 0x6C, 0xF9, 0x2E, 0x04, 0x35, 0xFA, 0x9C, 0x05, + 0xEF, 0xF8, 0x06, 0xFD, 0x09, 0xF3, 0x91, 0xF8, 0xFD, 0xEC, 0x9D, 0xF5, + 0xB6, 0xEA, 0x7C, 0xF6, 0x69, 0xF2, 0x57, 0x06, 0x6B, 0xFA, 0x09, 0x12, + 0xFB, 0x06, 0x46, 0x1F, 0xF2, 0x0A, 0xC3, 0x2A, 0x15, 0x05, 0x0A, 0x29, + 0xEE, 0x13, 0x84, 0x30, 0xE1, 0x14, 0xFE, 0x29, 0x07, 0xF9, 0xF1, 0x0A, + 0x36, 0xE2, 0xD6, 0xF4, 0x68, 0xCF, 0x68, 0xDF, 0x9D, 0xB8, 0x5D, 0xBF, + 0xF4, 0xAA, 0x3A, 0xAE, 0xEF, 0xA7, 0x20, 0xAE, 0x95, 0xB4, 0x3D, 0xBA, + 0x80, 0xDC, 0xEA, 0xDD, 0x15, 0xFF, 0xC4, 0xFD, 0x51, 0x13, 0x28, 0x0F, + 0x8C, 0x26, 0x15, 0x24, 0x87, 0x26, 0xBF, 0x31, 0x37, 0x1B, 0x5B, 0x3C, + 0xE8, 0x13, 0x16, 0x3F, 0xB1, 0x09, 0xC9, 0x2E, 0xD4, 0xF8, 0xBC, 0x18, + 0xEE, 0xE9, 0x7C, 0xFE, 0xEF, 0xE0, 0x35, 0xDE, 0x5B, 0xC3, 0x78, 0xB7, + 0x04, 0xA4, 0xB3, 0xA8, 0x1D, 0xA3, 0xA9, 0xBB, 0x21, 0xA8, 0xCC, 0xC7, + 0x3D, 0xB4, 0xC1, 0xD0, 0x8F, 0xD1, 0xD2, 0xE3, 0xC8, 0xE7, 0xE2, 0xF3, + 0xF4, 0xED, 0x90, 0xFB, 0x5E, 0xF0, 0x00, 0xFD, 0x7D, 0xFA, 0xBE, 0x00, + 0x8B, 0x06, 0x32, 0xFE, 0x75, 0x0E, 0xEA, 0xF2, 0x4B, 0x12, 0xEB, 0xEF, + 0x31, 0x0A, 0xA9, 0xEA, 0xCF, 0x0A, 0x31, 0xE7, 0x45, 0x0E, 0x50, 0xE8, + 0x39, 0x0E, 0x88, 0xEB, 0xFB, 0x1A, 0x12, 0xF7, 0xD1, 0x1F, 0xD4, 0xF9, + 0x5A, 0x1C, 0x47, 0xF7, 0xBA, 0x21, 0x5D, 0xFA, 0x07, 0x2B, 0xCA, 0x02, + 0x82, 0x1F, 0x53, 0x07, 0x29, 0x0B, 0x8A, 0x06, 0x8C, 0x06, 0x81, 0x07, + 0x2B, 0xFE, 0xB6, 0x01, 0x7A, 0xF4, 0x3B, 0xF9, 0xBA, 0xEB, 0xD5, 0xF3, + 0xB7, 0xE0, 0xA9, 0xEF, 0x64, 0xE5, 0x42, 0xF0, 0x65, 0xF0, 0x30, 0xF2, + 0x2A, 0xF6, 0x06, 0xF7, 0x87, 0xF5, 0xDC, 0xF7, 0xA4, 0xF0, 0x80, 0xEE, + 0x01, 0xF1, 0x23, 0xEA, 0x3A, 0xF5, 0xC5, 0xF3, 0x3F, 0xFD, 0xD9, 0x05, + 0xDF, 0xFD, 0x78, 0x03, 0xEF, 0xF4, 0xFE, 0xF2, 0xD2, 0xF5, 0x59, 0xF2, + 0x50, 0xF3, 0xBA, 0xEC, 0x42, 0xE8, 0x1F, 0xE6, 0x22, 0xED, 0xB9, 0xF6, + 0xF6, 0x04, 0xDE, 0x0D, 0x21, 0x19, 0x37, 0x1A, 0xF5, 0x16, 0x34, 0x22, + 0x33, 0x0D, 0xCC, 0x27, 0xFE, 0x06, 0x51, 0x1D, 0xEC, 0xF8, 0x89, 0x09, + 0x49, 0xE6, 0xA1, 0xFC, 0x76, 0xE2, 0xC9, 0xEF, 0xF8, 0xE7, 0x1C, 0xDB, + 0xE1, 0xDD, 0x74, 0xC4, 0x3D, 0xD0, 0xDD, 0xB6, 0x12, 0xC9, 0x59, 0xAC, + 0x76, 0xBF, 0xA1, 0xA7, 0x55, 0xBD, 0xAB, 0xB8, 0x30, 0xCF, 0x08, 0xD4, + 0xB1, 0xEA, 0xC1, 0xEC, 0x4A, 0xFA, 0x88, 0x02, 0x3D, 0x01, 0x69, 0x0F, + 0x2F, 0x05, 0x56, 0x12, 0xC5, 0x01, 0xEA, 0x0D, 0x09, 0xF8, 0x2B, 0x03, + 0x97, 0xF3, 0x58, 0xFD, 0xD8, 0xEC, 0xBC, 0xED, 0x4E, 0xD7, 0xDD, 0xCF, + 0xA3, 0xC5, 0xE3, 0xBF, 0xA5, 0xB5, 0xA9, 0xB1, 0x31, 0xA6, 0x9C, 0x9F, + 0x89, 0xAF, 0x11, 0x9F, 0xE4, 0xC9, 0x23, 0xA5, 0x4E, 0xD9, 0xDE, 0xA9, + 0x11, 0xE9, 0xBC, 0xBE, 0x84, 0x01, 0xA0, 0xD7, 0xD4, 0x0E, 0xF5, 0xE6, + 0x64, 0x0F, 0xE6, 0xF5, 0xB9, 0x08, 0xEA, 0xFE, 0xDB, 0x03, 0x58, 0x04, + 0x22, 0x06, 0x69, 0x09, 0x41, 0x0B, 0x08, 0x0C, 0x79, 0x0D, 0x57, 0x0F, + 0x9A, 0xFF, 0x88, 0x0D, 0x59, 0xF1, 0xDF, 0x0B, 0x27, 0xF1, 0xE2, 0x08, + 0x7C, 0xF4, 0x68, 0x02, 0x69, 0xF8, 0x7B, 0x03, 0x8F, 0xFF, 0x97, 0x0B, + 0x40, 0x01, 0x7F, 0x0C, 0x40, 0xFB, 0x6C, 0x09, 0x74, 0xF8, 0xE6, 0x09, + 0x0A, 0xFC, 0x1C, 0x02, 0x37, 0x08, 0x0B, 0x00, 0x9A, 0x0B, 0xF5, 0x02, + 0x9B, 0x04, 0x0C, 0xF8, 0xBA, 0xFF, 0xFF, 0xEF, 0xD1, 0xF6, 0xC3, 0xF3, + 0x60, 0xED, 0x9A, 0xF7, 0xE3, 0xE5, 0xBF, 0xF6, 0x65, 0xE7, 0xB5, 0xEF, + 0xF1, 0xF4, 0x4E, 0xE8, 0x0E, 0xF8, 0x3C, 0xE2, 0x1E, 0xF7, 0xAC, 0xE1, + 0xEB, 0x00, 0xCD, 0xE9, 0x47, 0x08, 0x65, 0xF0, 0x5D, 0x16, 0x1E, 0xF5, + 0x44, 0x21, 0xE6, 0xED, 0xAA, 0x1C, 0x7E, 0xE0, 0x87, 0x0F, 0xED, 0xD6, + 0xBB, 0x06, 0x22, 0xDA, 0xBC, 0x04, 0x5C, 0xE7, 0x9F, 0xFE, 0x6E, 0xEC, + 0x0D, 0x04, 0xA6, 0xFC, 0x82, 0x0D, 0x65, 0x11, 0x68, 0x09, 0x8C, 0x15, + 0xB5, 0x03, 0xBF, 0x13, 0x8B, 0x02, 0x47, 0x12, 0x75, 0xF9, 0x92, 0x08, + 0x87, 0xED, 0xF0, 0xF8, 0x6D, 0xEB, 0x52, 0xEE, 0xC2, 0xEC, 0xCD, 0xE4, + 0xD2, 0xEC, 0xDC, 0xDF, 0xD1, 0xE6, 0xB2, 0xE3, 0x6C, 0xDC, 0x62, 0xE3, + 0x8F, 0xE1, 0xAA, 0xE7, 0xDD, 0xF0, 0xCF, 0xF4, 0x7D, 0x05, 0x1F, 0x0E, + 0x19, 0x24, 0x90, 0x2C, 0xAB, 0x3B, 0xC1, 0x37, 0xA9, 0x49, 0x0D, 0x39, + 0xF6, 0x4C, 0xCF, 0x39, 0x3A, 0x3F, 0x81, 0x33, 0x09, 0x2C, 0x04, 0x25, + 0x18, 0x21, 0xE0, 0x1F, 0x49, 0x17, 0xA5, 0x21, 0xC2, 0x05, 0x83, 0x11, + 0x49, 0xF5, 0x4C, 0xF8, 0xAE, 0xEB, 0x91, 0xE8, 0x10, 0xE2, 0x1B, 0xE5, + 0x50, 0xDD, 0xDE, 0xF1, 0xD2, 0xEB, 0x77, 0x05, 0xBC, 0x02, 0x9F, 0x12, + 0x89, 0x11, 0xF1, 0x1A, 0x4C, 0x1D, 0x72, 0x1B, 0xC6, 0x25, 0xB0, 0x14, + 0xDF, 0x2B, 0xF1, 0x06, 0xE5, 0x36, 0x5A, 0x00, 0x26, 0x36, 0xC3, 0x08, + 0xD7, 0x2E, 0x31, 0x0F, 0x86, 0x36, 0x16, 0x10, 0x66, 0x33, 0xAE, 0x09, + 0xD0, 0x23, 0x34, 0x06, 0x5C, 0x21, 0x01, 0x0F, 0x36, 0x20, 0xBD, 0x16, + 0x6E, 0x19, 0xC0, 0x15, 0x05, 0x18, 0xDB, 0x13, 0x13, 0x1D, 0x31, 0x1B, + 0x45, 0x1C, 0x1C, 0x2B, 0xDE, 0x17, 0x92, 0x37, 0x6C, 0x1D, 0x79, 0x37, + 0xB7, 0x21, 0x2E, 0x2F, 0xFC, 0x17, 0x61, 0x20, 0x64, 0x0D, 0x10, 0x16, + 0x0A, 0x0B, 0xED, 0x19, 0x1B, 0x0C, 0x35, 0x20, 0xCA, 0x0F, 0xCD, 0x1C, + 0x73, 0x14, 0x09, 0x16, 0xE1, 0x10, 0xE1, 0x1A, 0x34, 0x13, 0x42, 0x2D, + 0x46, 0x25, 0xB4, 0x38, 0x38, 0x31, 0xB5, 0x35, 0xE6, 0x33, 0x70, 0x2F, + 0xD2, 0x32, 0x81, 0x2B, 0x38, 0x2C, 0xFF, 0x2C, 0xA3, 0x28, 0xDD, 0x25, + 0x17, 0x27, 0xD6, 0x16, 0x1E, 0x2A, 0x72, 0x17, 0x45, 0x2F, 0xC2, 0x1F, + 0x87, 0x2E, 0x72, 0x27, 0x4A, 0x24, 0x28, 0x27, 0x8C, 0x19, 0x92, 0x1E, + 0x7A, 0x22, 0x0C, 0x28, 0x17, 0x34, 0xE1, 0x3C, 0x04, 0x3D, 0xDE, 0x3D, + 0x9B, 0x41, 0x22, 0x33, 0xD0, 0x44, 0x08, 0x32, 0x2F, 0x3F, 0x21, 0x31, + 0x95, 0x2F, 0x95, 0x2A, 0x07, 0x28, 0x75, 0x2C, 0x71, 0x32, 0x83, 0x33, + 0xB8, 0x3C, 0x1C, 0x2E, 0xC9, 0x3A, 0x5A, 0x25, 0xB3, 0x29, 0x0A, 0x26, + 0xCF, 0x13, 0x25, 0x28, 0x54, 0x15, 0xB0, 0x27, 0xAC, 0x25, 0x1A, 0x2A, + 0x3A, 0x33, 0xAD, 0x38, 0xDE, 0x36, 0x06, 0x44, 0xF4, 0x29, 0xB7, 0x3C, + 0x9B, 0x21, 0x44, 0x32, 0x33, 0x1E, 0xD4, 0x24, 0xFB, 0x13, 0x69, 0x17, + 0x3B, 0x10, 0xCB, 0x11, 0xAA, 0x13, 0xE4, 0x0D, 0x42, 0x18, 0x50, 0x0C, + 0xA2, 0x1A, 0x49, 0x09, 0x74, 0x11, 0x62, 0x07, 0x5D, 0x04, 0x8D, 0x08, + 0xE4, 0x00, 0x57, 0x0A, 0x79, 0x03, 0x99, 0x16, 0x96, 0x08, 0x18, 0x29, + 0x58, 0x0D, 0xAC, 0x2E, 0x0C, 0x14, 0x51, 0x25, 0xEA, 0x19, 0xAA, 0x1B, + 0x26, 0x0E, 0x88, 0x17, 0x6E, 0xFB, 0x4E, 0x19, 0x4F, 0xED, 0x14, 0x1F, + 0x22, 0xE2, 0xF5, 0x1E, 0xD0, 0xDF, 0x9B, 0x16, 0xEC, 0xE4, 0x09, 0x11, + 0x67, 0xF1, 0x8E, 0x0E, 0x36, 0xFC, 0x02, 0x05, 0xD1, 0xFC, 0x8D, 0xFF, + 0x62, 0xFD, 0x6A, 0x05, 0xA6, 0xFD, 0x23, 0x06, 0xFE, 0x02, 0xF8, 0x00, + 0x6E, 0x0D, 0xF8, 0xF2, 0xD8, 0x07, 0x81, 0xDF, 0x56, 0xF8, 0x12, 0xD9, + 0x76, 0xF4, 0x30, 0xDA, 0x73, 0xFC, 0xEE, 0xDB, 0x5C, 0x00, 0x42, 0xDC, + 0x57, 0xFB, 0x48, 0xDF, 0xEA, 0xF5, 0x17, 0xEA, 0x89, 0xF9, 0x9F, 0xFC, + 0x9C, 0xFD, 0x26, 0x05, 0xC4, 0xFF, 0x30, 0xFD, 0xB9, 0x09, 0x99, 0xFC, + 0xF4, 0x0B, 0xF1, 0xFD, 0x2B, 0x06, 0x47, 0xFB, 0x34, 0x05, 0xA7, 0xFD, + 0xD2, 0x0C, 0xE2, 0x08, 0xA8, 0x12, 0xC4, 0x11, 0xB6, 0x0C, 0xFB, 0x0E, + 0xDE, 0x00, 0x39, 0x0E, 0xD4, 0xF0, 0xC5, 0x0D, 0xD0, 0xE0, 0xA3, 0x04, + 0xE5, 0xD8, 0x80, 0x05, 0x8B, 0xDC, 0x2A, 0x10, 0x9D, 0xE9, 0x0F, 0x10, + 0x27, 0xF6, 0x6C, 0x0D, 0x8C, 0xF6, 0x43, 0x0B, 0x78, 0xEF, 0xF7, 0x03, + 0xCE, 0xE2, 0x40, 0xF5, 0x91, 0xD4, 0x2B, 0xEA, 0x60, 0xD3, 0x90, 0xE6, + 0x19, 0xDE, 0xF9, 0xDE, 0xFB, 0xE6, 0x22, 0xD9, 0x51, 0xEC, 0x1E, 0xDC, + 0xE3, 0xF0, 0x7C, 0xE2, 0x86, 0xF7, 0xDD, 0xE6, 0x87, 0x02, 0x7C, 0xED, + 0xAD, 0x0B, 0x0C, 0xF8, 0x4E, 0x0D, 0xA6, 0xFA, 0x3B, 0x09, 0xFC, 0xF2, + 0x46, 0x08, 0x8B, 0xF4, 0xC5, 0x04, 0x96, 0xFC, 0x96, 0xFA, 0x0D, 0x01, + 0x4A, 0xF2, 0x0B, 0x09, 0x49, 0xF1, 0x13, 0x18, 0x51, 0xF0, 0xBB, 0x21, + 0xF9, 0xEE, 0x73, 0x1A, 0x26, 0xEF, 0x00, 0x0D, 0x57, 0xE9, 0x01, 0x07, + 0x37, 0xE8, 0x9C, 0x06, 0x02, 0xEF, 0xC6, 0x06, 0x04, 0xF2, 0xEC, 0x0B, + 0xB3, 0xF8, 0x58, 0x19, 0x45, 0xFC, 0x27, 0x1C, 0x1A, 0x00, 0xED, 0x13, + 0x3C, 0x0D, 0x14, 0x13, 0xE2, 0x0A, 0xAA, 0x10, 0x4C, 0x00, 0x3A, 0x08, + 0x59, 0xFF, 0x1D, 0x00, 0x31, 0x05, 0xD6, 0xFD, 0xC3, 0x17, 0xA3, 0x04, + 0xE7, 0x2A, 0xE7, 0x09, 0x07, 0x2E, 0xF4, 0x0C, 0x67, 0x2C, 0x1F, 0x13, + 0x11, 0x29, 0x2A, 0x14, 0xCC, 0x1E, 0x8C, 0x0B, 0xBB, 0x15, 0x09, 0x04, + 0x94, 0x11, 0x7C, 0x01, 0xB4, 0x0E, 0x86, 0x01, 0xBB, 0x06, 0xC1, 0x09, + 0x2A, 0x04, 0x58, 0x18, 0xF4, 0x0A, 0xAA, 0x1E, 0xE3, 0x11, 0xFC, 0x18, + 0x88, 0x13, 0xA8, 0x11, 0x5B, 0x0A, 0xB5, 0x0A, 0xC8, 0x01, 0xCD, 0x03, + 0xC0, 0x08, 0x97, 0x02, 0xA4, 0x13, 0xC6, 0xFF, 0xF6, 0x0F, 0xB0, 0xFB, + 0xAE, 0x06, 0xBB, 0xFC, 0x81, 0xFE, 0x02, 0xFE, 0x10, 0xF3, 0x61, 0xFE, + 0x37, 0xEE, 0xB2, 0x04, 0xB2, 0xEF, 0xC0, 0x0E, 0x1A, 0xF0, 0x32, 0x0C, + 0x24, 0xF1, 0x18, 0x01, 0xDD, 0xF3, 0xEE, 0xF9, 0xED, 0xF7, 0x5E, 0xFB, + 0xFE, 0xF4, 0xDB, 0xFC, 0xC0, 0xFA, 0xB2, 0x01, 0xA9, 0x04, 0x49, 0x02, + 0xE6, 0xFE, 0xF9, 0xF3, 0x35, 0xF4, 0xCC, 0xEC, 0x54, 0xE6, 0x17, 0xE7, + 0xCB, 0xE0, 0xE7, 0xDF, 0xFB, 0xE0, 0xA4, 0xE0, 0x4F, 0xE2, 0x17, 0xE7, + 0x05, 0xE5, 0xC8, 0xEB, 0xCA, 0xDB, 0x2F, 0xED, 0xC4, 0xD2, 0x2C, 0xF6, + 0x5B, 0xD2, 0x9B, 0xFA, 0x13, 0xDA, 0x33, 0xF3, 0x3D, 0xE2, 0x68, 0xED, + 0x66, 0xE4, 0x05, 0xE9, 0xFB, 0xE6, 0x8F, 0xE1, 0x42, 0xE0, 0x73, 0xD7, + 0x28, 0xD3, 0x90, 0xCC, 0x5C, 0xC9, 0xD6, 0xC0, 0x52, 0xC9, 0x10, 0xB6, + 0xBC, 0xD5, 0xAA, 0xB3, 0xEA, 0xD9, 0x06, 0xB6, 0x23, 0xD1, 0x2B, 0xBB, + 0xDE, 0xC4, 0x11, 0xBE, 0x31, 0xC6, 0x04, 0xBA, 0x1D, 0xD5, 0x5C, 0xB9, + 0x0F, 0xE3, 0x1B, 0xBF, 0xBB, 0xF4, 0xEB, 0xCB, 0x24, 0xFE, 0xFC, 0xDD, + 0x0A, 0xF5, 0x0E, 0xE4, 0xC1, 0xE3, 0x16, 0xDF, 0x73, 0xD9, 0xA4, 0xD8, + 0x85, 0xDA, 0x41, 0xD1, 0xCF, 0xD7, 0xF4, 0xCF, 0x97, 0xDE, 0x85, 0xDB, + 0x95, 0xEC, 0x7F, 0xEA, 0x1F, 0xE9, 0xD2, 0xEC, 0xEB, 0xE5, 0xB3, 0xEC, + 0xB9, 0xEB, 0x1E, 0xEF, 0x64, 0xF1, 0xBA, 0xEB, 0x32, 0xF9, 0x5A, 0xEA, + 0x05, 0xFE, 0x2C, 0xED, 0xF5, 0xF4, 0x51, 0xEB, 0x5F, 0xE4, 0xA1, 0xE1, + 0x7F, 0xE0, 0xCB, 0xD9, 0x9B, 0xDF, 0xA0, 0xD4, 0x56, 0xCE, 0x1B, 0xCB, + 0x20, 0xC0, 0x27, 0xD4, 0x88, 0xBD, 0x86, 0xE8, 0x30, 0xBA, 0x39, 0xDF, + 0xAC, 0xBF, 0xC3, 0xCB, 0x8F, 0xCE, 0x76, 0xCC, 0xE7, 0xD7, 0x61, 0xD7, + 0x00, 0xE2, 0xF5, 0xDF, 0x16, 0xEE, 0xBC, 0xE1, 0x8C, 0xF0, 0xCD, 0xDE, + 0x85, 0xE7, 0x23, 0xDB, 0xE8, 0xDF, 0x78, 0xDF, 0x97, 0xD7, 0x29, 0xE1, + 0xDE, 0xCD, 0x61, 0xD8, 0x5B, 0xD0, 0xAB, 0xD0, 0x44, 0xD7, 0x00, 0xD0, + 0xD4, 0xDA, 0x4A, 0xD0, 0x09, 0xDE, 0xE5, 0xC9, 0x54, 0xE6, 0xBC, 0xC7, + 0x5E, 0xF1, 0x44, 0xCF, 0x1C, 0xF0, 0xC0, 0xCA, 0x8B, 0xE9, 0x06, 0xC0, + 0x86, 0xE6, 0xEB, 0xC2, 0x0D, 0xDD, 0x9B, 0xC2, 0xC1, 0xD6, 0xBB, 0xC4, + 0x35, 0xD7, 0x02, 0xD2, 0xCA, 0xD7, 0xA0, 0xD7, 0xA2, 0xE6, 0xCA, 0xDC, + 0x54, 0xF3, 0x65, 0xDF, 0x05, 0xE9, 0xDB, 0xD9, 0xCA, 0xDE, 0x92, 0xE0, + 0xA4, 0xD9, 0xC5, 0xE7, 0x7D, 0xDB, 0x06, 0xE7, 0x7D, 0xF1, 0x36, 0xEB, + 0xDA, 0x03, 0x66, 0xF0, 0x59, 0x05, 0x7B, 0xF4, 0xF6, 0x01, 0x2F, 0xFC, + 0x9D, 0xF8, 0xF3, 0x03, 0x7A, 0xF1, 0xC8, 0x06, 0x01, 0xF6, 0xA5, 0x04, + 0x41, 0x02, 0x0B, 0x03, 0xEE, 0x07, 0xC1, 0x08, 0x5C, 0x03, 0x6B, 0x09, + 0x80, 0x00, 0xC5, 0x00, 0xE3, 0x01, 0x9A, 0xFB, 0x38, 0x07, 0x26, 0xFE, + 0xAD, 0x09, 0x73, 0x05, 0xDF, 0x0A, 0x67, 0x0D, 0xF5, 0x16, 0x2A, 0x1A, + 0x92, 0x1C, 0xCB, 0x1D, 0x81, 0x11, 0x83, 0x0E, 0xD8, 0x08, 0x36, 0x06, + 0xA2, 0x0A, 0x27, 0x0C, 0xE3, 0x0C, 0x97, 0x0A, 0xBF, 0x08, 0xA9, 0x00, + 0xED, 0x0B, 0xBA, 0x00, 0x6C, 0x13, 0x5C, 0x03, 0x4B, 0x11, 0xFD, 0xF9, + 0xBE, 0x13, 0xD5, 0xF0, 0x71, 0x1B, 0x10, 0xEF, 0xF5, 0x1B, 0xAE, 0xF3, + 0x9F, 0x17, 0xC7, 0xFE, 0x4C, 0x13, 0xE1, 0x08, 0x00, 0x13, 0x6C, 0x10, + 0xC8, 0x13, 0xFD, 0x0E, 0x46, 0x0F, 0x7E, 0x05, 0xB0, 0x0C, 0x89, 0x08, + 0xE6, 0x07, 0x2A, 0x10, 0x37, 0x04, 0x9F, 0x16, 0xB8, 0x06, 0xE5, 0x1B, + 0x15, 0x05, 0x06, 0x19, 0xDF, 0xFD, 0x1F, 0x1B, 0x14, 0xF5, 0xDB, 0x1D, + 0x5E, 0xFF, 0x1D, 0x1A, 0x4E, 0x11, 0xD5, 0x11, 0x0F, 0x10, 0xA3, 0x05, + 0x56, 0x09, 0xE1, 0xFE, 0x07, 0x05, 0x58, 0xFD, 0x5B, 0xFB, 0x4B, 0xF8, + 0x2E, 0xF6, 0xD5, 0xF6, 0x16, 0x03, 0x6D, 0xFE, 0x58, 0x12, 0xC2, 0x07, + 0x61, 0x16, 0x97, 0x12, 0x3A, 0x10, 0x47, 0x18, 0x6A, 0x02, 0x9D, 0x11, + 0xEC, 0xFB, 0x08, 0x0E, 0xCF, 0xFF, 0x26, 0x0F, 0xE5, 0x04, 0x0D, 0x05, + 0x82, 0x0E, 0x7A, 0xFB, 0xFC, 0x21, 0x92, 0xFE, 0x72, 0x2A, 0xBC, 0x07, + 0xC7, 0x15, 0x5E, 0x0E, 0xCB, 0x06, 0x81, 0x18, 0xAA, 0x15, 0x8E, 0x1E, + 0x7D, 0x2F, 0x3A, 0x19, 0xEF, 0x3B, 0xD5, 0x18, 0x13, 0x3A, 0xCC, 0x1F, + 0xFF, 0x3B, 0x83, 0x29, 0x52, 0x37, 0xAA, 0x27, 0xEA, 0x29, 0x08, 0x21, + 0xD8, 0x22, 0xD6, 0x22, 0x3C, 0x21, 0x58, 0x24, 0x06, 0x24, 0x12, 0x26, + 0x24, 0x27, 0x24, 0x2C, 0x7F, 0x24, 0x50, 0x2C, 0x6D, 0x22, 0x3F, 0x26, + 0x6A, 0x1E, 0x3F, 0x23, 0x23, 0x16, 0x49, 0x1E, 0x0B, 0x12, 0xED, 0x18, + 0xF3, 0x15, 0x56, 0x14, 0x9F, 0x1D, 0xD2, 0x07, 0xC4, 0x18, 0x17, 0xF9, + 0x8E, 0x0B, 0x83, 0xF3, 0x25, 0x08, 0x05, 0xF4, 0x89, 0x07, 0x9B, 0xF4, + 0x84, 0x05, 0x3C, 0xF9, 0x56, 0x08, 0xF4, 0x02, 0x54, 0x04, 0x4D, 0x08, + 0x41, 0xFA, 0x21, 0x08, 0x00, 0xF7, 0xD7, 0x06, 0x34, 0xF7, 0x83, 0x08, + 0xB5, 0xF8, 0xDB, 0x11, 0x51, 0xF8, 0xFE, 0x18, 0x71, 0xFD, 0x79, 0x1B, + 0x55, 0x04, 0xA6, 0x16, 0xCE, 0xFF, 0x55, 0x0A, 0xE7, 0xFB, 0xB6, 0xFF, + 0x81, 0xF9, 0x02, 0xFC, 0x08, 0xF3, 0xB1, 0xFA, 0xE9, 0xF0, 0x78, 0xF7, + 0x22, 0xF7, 0x27, 0xFF, 0xB8, 0xFD, 0xAC, 0x08, 0x11, 0xF6, 0x16, 0x05, + 0xF3, 0xF3, 0xBF, 0x07, 0x32, 0x06, 0xFA, 0x13, 0x9B, 0x0F, 0x02, 0x13, + 0xE6, 0x0F, 0xAD, 0x17, 0x99, 0x0E, 0x49, 0x28, 0xBE, 0x01, 0xF6, 0x20, + 0xB8, 0x03, 0x53, 0x14, 0x28, 0x0E, 0x15, 0x0D, 0x3F, 0x09, 0xDA, 0x02, + 0xB2, 0x0E, 0xA2, 0x05, 0x18, 0x1E, 0x99, 0x0C, 0xB0, 0x1F, 0x17, 0x0C, + 0xF3, 0x12, 0x4C, 0x08, 0x95, 0x0D, 0x32, 0x0C, 0x0E, 0x16, 0x63, 0x0B, + 0x39, 0x1D, 0x04, 0xFE, 0x59, 0x24, 0x60, 0xF8, 0x6F, 0x28, 0x79, 0xFE, + 0x2C, 0x1E, 0xC4, 0x05, 0xE2, 0x0B, 0xB7, 0x0B, 0xB4, 0xF7, 0x28, 0x0D, + 0xFE, 0xEB, 0xC4, 0x0A, 0xF4, 0xEF, 0xA4, 0x0C, 0x1D, 0xF9, 0xDF, 0x13, + 0xB8, 0xFA, 0x91, 0x13, 0xC7, 0xF4, 0xCE, 0x06, 0xAD, 0xF2, 0x7A, 0xFE, + 0x24, 0xEA, 0x5D, 0xF9, 0xFF, 0xD7, 0x78, 0xF3, 0x54, 0xD1, 0xD4, 0xF1, + 0x9F, 0xE1, 0x85, 0xF9, 0x7F, 0x02, 0x10, 0x05, 0x75, 0x15, 0xCD, 0x08, + 0xD5, 0x0C, 0xEB, 0x09, 0x9A, 0x01, 0x09, 0x0F, 0xEC, 0xF9, 0x71, 0x0D, + 0xBC, 0xF9, 0xD6, 0x06, 0xF7, 0x0A, 0x48, 0x0C, 0x86, 0x18, 0x14, 0x10, + 0x12, 0x13, 0xBC, 0x07, 0xA6, 0x0B, 0xE6, 0x01, 0x0F, 0x09, 0xBA, 0xFF, + 0xFB, 0x07, 0x40, 0x00, 0x75, 0x10, 0x12, 0x02, 0x2F, 0x1C, 0x3D, 0x03, + 0xB6, 0x29, 0x15, 0x0C, 0x00, 0x34, 0x9F, 0x1F, 0x6F, 0x27, 0x6E, 0x2B, + 0x3D, 0x13, 0xBA, 0x2D, 0x4B, 0x08, 0x29, 0x35, 0x1B, 0x08, 0xE7, 0x32, + 0x97, 0x0C, 0x0F, 0x29, 0xA9, 0x18, 0xE9, 0x2D, 0xF2, 0x1B, 0x64, 0x30, + 0xEB, 0x0B, 0x51, 0x26, 0x85, 0x0B, 0xCB, 0x27, 0x93, 0x0F, 0xAF, 0x30, + 0xEC, 0x09, 0xEE, 0x2A, 0x92, 0x05, 0xDD, 0x22, 0x80, 0x07, 0x48, 0x2D, + 0xD5, 0x12, 0xAB, 0x3A, 0xCD, 0x13, 0x1A, 0x36, 0x82, 0x14, 0xA0, 0x31, + 0xFD, 0x1B, 0xD5, 0x31, 0x83, 0x1F, 0x1A, 0x2B, 0x3B, 0x2A, 0x09, 0x28, + 0x13, 0x33, 0x2B, 0x27, 0xFA, 0x2D, 0x0C, 0x1E, 0xB9, 0x2D, 0xCF, 0x13, + 0xC3, 0x31, 0x7D, 0x0C, 0xB5, 0x34, 0x5C, 0x0E, 0x5D, 0x3A, 0x13, 0x19, + 0xB0, 0x3E, 0x5B, 0x20, 0xE4, 0x40, 0x77, 0x27, 0x65, 0x3B, 0x13, 0x30, + 0x59, 0x37, 0xE0, 0x36, 0x02, 0x37, 0x18, 0x32, 0x13, 0x2E, 0x8F, 0x26, + 0x1A, 0x26, 0x2B, 0x24, 0x48, 0x25, 0xEB, 0x1F, 0x33, 0x23, 0x3F, 0x16, + 0x7A, 0x1F, 0x2C, 0x13, 0x53, 0x18, 0x97, 0x18, 0xD4, 0x0F, 0x2A, 0x19, + 0x88, 0x0C, 0xB2, 0x13, 0x81, 0x0F, 0x21, 0x16, 0x66, 0x12, 0x72, 0x1D, + 0x1B, 0x11, 0xFB, 0x22, 0xB8, 0x0C, 0x52, 0x2A, 0xB1, 0x04, 0xBA, 0x33, + 0x93, 0xFE, 0xCC, 0x37, 0xEA, 0xFF, 0x58, 0x30, 0xBE, 0x07, 0x1E, 0x26, + 0x29, 0x08, 0x33, 0x1A, 0x24, 0xFF, 0x62, 0x0C, 0x78, 0xF8, 0x44, 0x03, + 0xEB, 0xEA, 0xBF, 0xF4, 0xD5, 0xDB, 0x84, 0xE4, 0xDC, 0xE6, 0x17, 0xE1, + 0xAA, 0xFE, 0x3A, 0xE9, 0x2C, 0x00, 0xCD, 0xED, 0x43, 0xF6, 0x30, 0xF3, + 0xA1, 0xF2, 0x1C, 0x03, 0x45, 0xED, 0x3E, 0x0B, 0x2A, 0xE3, 0xD7, 0x02, + 0xFD, 0xDD, 0x4A, 0xF9, 0xFF, 0xDC, 0x2B, 0xF4, 0x00, 0xDB, 0x71, 0xEE, + 0xFD, 0xDB, 0x86, 0xE9, 0x4E, 0xE1, 0xD6, 0xE5, 0x15, 0xE3, 0x55, 0xE0, + 0x5B, 0xDA, 0x8E, 0xD7, 0x99, 0xD0, 0x59, 0xCC, 0xC2, 0xCF, 0x4F, 0xCB, + 0x5C, 0xD2, 0x24, 0xD1, 0x8D, 0xDC, 0x10, 0xD2, 0xC2, 0xED, 0x76, 0xD8, + 0xEF, 0xF7, 0x19, 0xE1, 0x88, 0xFA, 0x95, 0xDF, 0x18, 0xF2, 0xD4, 0xD7, + 0xE1, 0xE5, 0x13, 0xD3, 0xCE, 0xE7, 0xBD, 0xD9, 0xD4, 0xEC, 0x96, 0xE5, + 0xE6, 0xEC, 0x5A, 0xEC, 0x8A, 0xEF, 0x1B, 0xEE, 0xE8, 0xEA, 0x72, 0xE8, + 0xA3, 0xE3, 0x03, 0xE2, 0x5C, 0xDD, 0x2E, 0xE1, 0xB3, 0xDB, 0x08, 0xE3, + 0x44, 0xDD, 0xC5, 0xDE, 0x46, 0xE6, 0xB4, 0xE1, 0x83, 0xF2, 0xA9, 0xEA, + 0x1E, 0xE9, 0x68, 0xE0, 0xCB, 0xDA, 0xEE, 0xCC, 0x6D, 0xDA, 0x6A, 0xC5, + 0x64, 0xE0, 0x96, 0xCD, 0xA6, 0xDB, 0xCA, 0xD9, 0xE1, 0xD5, 0x80, 0xE3, + 0x5E, 0xDE, 0x0B, 0xED, 0xD3, 0xDB, 0x20, 0xED, 0xF9, 0xCE, 0xED, 0xEA, + 0xFC, 0xBF, 0xC5, 0xE5, 0xAA, 0xB0, 0x16, 0xE1, 0xFB, 0xB5, 0x45, 0xE8, + 0x07, 0xC6, 0xA7, 0xE7, 0xAE, 0xD6, 0x96, 0xDD, 0xD7, 0xEF, 0x37, 0xDA, + 0xFB, 0xF6, 0x3E, 0xD5, 0x7B, 0xEA, 0x98, 0xCB, 0xA6, 0xE0, 0x68, 0xCE, + 0x7F, 0xE1, 0x8D, 0xE0, 0x9F, 0xE2, 0xF9, 0xE5, 0xCA, 0xE3, 0xC3, 0xDF, + 0xC2, 0xED, 0x8D, 0xDB, 0xD1, 0xF1, 0x70, 0xD7, 0xBA, 0xEB, 0xC0, 0xD9, + 0x56, 0xE2, 0x3A, 0xE0, 0x19, 0xDE, 0x97, 0xE3, 0xD2, 0xE7, 0x90, 0xE5, + 0x61, 0xEF, 0x16, 0xE5, 0xA8, 0xED, 0x6A, 0xE2, 0x7C, 0xEB, 0x3F, 0xE2, + 0x4F, 0xE4, 0x77, 0xE0, 0xBE, 0xDF, 0x99, 0xE0, 0x9C, 0xE5, 0xE6, 0xE1, + 0xF2, 0xF5, 0xF6, 0xE4, 0x0D, 0xF9, 0x86, 0xE7, 0x07, 0xEC, 0xE9, 0xE3, + 0x64, 0xEA, 0xAB, 0xE5, 0x8E, 0xEC, 0xE0, 0xE8, 0x16, 0xEE, 0x58, 0xE5, + 0x6D, 0xF2, 0x17, 0xDF, 0x75, 0xF2, 0xD4, 0xDF, 0x56, 0xEB, 0xB1, 0xEC, + 0x8E, 0xEA, 0x36, 0xFC, 0x3B, 0xF3, 0x29, 0x01, 0x94, 0xF7, 0xD0, 0xFC, + 0x16, 0x02, 0x10, 0x02, 0x6D, 0x0F, 0x4C, 0x08, 0x03, 0x09, 0x62, 0xFB, + 0xAC, 0xF8, 0x62, 0xF0, 0x1A, 0xF0, 0x8D, 0xF0, 0xD9, 0xE6, 0x0F, 0xE3, + 0xDC, 0xE5, 0xCF, 0xDD, 0x20, 0xED, 0x2B, 0xE7, 0x58, 0xED, 0xA2, 0xEA, + 0x94, 0xED, 0x72, 0xF5, 0xFC, 0xF0, 0xFA, 0x00, 0x1E, 0xF1, 0xA3, 0x00, + 0x54, 0xF4, 0x1E, 0xFF, 0xCA, 0xF9, 0x32, 0xFE, 0xEF, 0xFC, 0xAE, 0x01, + 0xA2, 0xFE, 0x40, 0x08, 0x8E, 0xF7, 0x3D, 0xFF, 0xD3, 0xEC, 0xA7, 0xE8, + 0x25, 0xE8, 0xC4, 0xD2, 0x44, 0xE8, 0xEF, 0xC8, 0x14, 0xEA, 0x27, 0xCA, + 0x68, 0xF0, 0x61, 0xCD, 0x66, 0xFE, 0x55, 0xD2, 0x7B, 0x06, 0x82, 0xD8, + 0x6A, 0x04, 0x2A, 0xDF, 0xB7, 0x02, 0xA7, 0xE7, 0x3A, 0xFE, 0xA0, 0xED, + 0xD6, 0xFF, 0xF9, 0xEC, 0xEF, 0x08, 0x25, 0xEB, 0xB2, 0x07, 0xD1, 0xEC, + 0x3B, 0x02, 0xA0, 0xF2, 0x1E, 0xF6, 0x67, 0xF1, 0x3B, 0xDE, 0x76, 0xE7, + 0x59, 0xCB, 0x96, 0xE1, 0xE5, 0xCA, 0xCD, 0xE7, 0x6A, 0xD2, 0xF1, 0xF6, + 0xB7, 0xD8, 0xF0, 0x01, 0x55, 0xEB, 0xAF, 0x09, 0x11, 0xF9, 0xCB, 0x07, + 0xC7, 0xFD, 0x71, 0x09, 0x65, 0x00, 0x7A, 0x11, 0xAD, 0xFC, 0x2F, 0x09, + 0xAC, 0x05, 0x67, 0xFD, 0x3D, 0x12, 0x7C, 0xFB, 0x9E, 0x0B, 0x74, 0xFC, + 0x15, 0xFC, 0xA2, 0xF8, 0xD0, 0xF2, 0x57, 0xF1, 0x48, 0xF9, 0xB9, 0xEE, + 0xD2, 0x0A, 0x54, 0xF4, 0x42, 0x13, 0xA2, 0xFB, 0x8D, 0x11, 0x70, 0xFF, + 0xFA, 0x11, 0x7C, 0x02, 0x0E, 0x1B, 0xAC, 0x02, 0xD3, 0x2F, 0xBF, 0x08, + 0x77, 0x48, 0x3B, 0x1D, 0xDA, 0x4D, 0x08, 0x26, 0xB5, 0x3D, 0xAE, 0x1A, + 0x35, 0x2A, 0xBD, 0x12, 0x45, 0x19, 0xD8, 0x0D, 0x73, 0x0F, 0x72, 0x08, + 0xE3, 0x12, 0xEA, 0x0C, 0xEC, 0x1A, 0x8C, 0x13, 0x2C, 0x20, 0x8E, 0x14, + 0x85, 0x26, 0x26, 0x1E, 0x67, 0x1E, 0xEA, 0x2A, 0xAF, 0x0C, 0x3F, 0x30, + 0x2B, 0x10, 0x8D, 0x37, 0xB6, 0x21, 0x21, 0x3C, 0xF9, 0x2A, 0xCB, 0x3A, + 0xBE, 0x26, 0x7D, 0x36, 0x92, 0x19, 0x92, 0x24, 0xBF, 0x06, 0x25, 0x03, + 0x33, 0xF8, 0xCB, 0xED, 0x81, 0xF9, 0xE2, 0xEF, 0xE2, 0xFA, 0xF2, 0xF2, + 0xAF, 0xFC, 0x2E, 0xF3, 0x31, 0x0C, 0xBB, 0xF5, 0xCA, 0x13, 0x4F, 0xF5, + 0xF3, 0x0B, 0xD4, 0xEE, 0xEF, 0xFE, 0x8F, 0xE8, 0x28, 0xF5, 0xBE, 0xEE, + 0x76, 0xF1, 0x3B, 0xFA, 0xC6, 0xFA, 0xD7, 0x00, 0x49, 0x06, 0x3D, 0x02, + 0xCD, 0xFB, 0xC7, 0x01, 0xE5, 0xE7, 0x64, 0x02, 0xE0, 0xDB, 0x9F, 0xFC, + 0x51, 0xDD, 0x0E, 0xF7, 0xE7, 0xED, 0x05, 0xFA, 0xFA, 0x02, 0x73, 0x02, + 0x6A, 0x02, 0x62, 0x04, 0x62, 0xF0, 0x8E, 0xFF, 0x83, 0xEC, 0xDB, 0x02, + 0x82, 0xF0, 0x86, 0x03, 0x57, 0xEA, 0x3F, 0xF8, 0x91, 0xED, 0xC4, 0xF2, + 0x53, 0xF6, 0xFF, 0xEC, 0xC1, 0xF9, 0x06, 0xE4, 0x1A, 0xFF, 0x7A, 0xE5, + 0xCF, 0xF3, 0x6A, 0xEB, 0x4E, 0xE8, 0x4A, 0xF8, 0x84, 0xE9, 0x8C, 0x01, + 0x39, 0xEE, 0x88, 0xFD, 0xF1, 0xF7, 0x6E, 0xFA, 0x3F, 0xFA, 0x74, 0xFB, + 0x24, 0xF9, 0x49, 0xFE, 0x6B, 0xFF, 0x45, 0x01, 0x3E, 0x0E, 0xC5, 0x03, + 0x93, 0x29, 0xC7, 0x04, 0xF3, 0x38, 0xA5, 0xFA, 0x29, 0x2F, 0x73, 0xED, + 0x75, 0x1B, 0xA7, 0xE7, 0x98, 0x0B, 0x57, 0xE4, 0xE7, 0x05, 0xBF, 0xE6, + 0xE3, 0xFA, 0xA8, 0xEE, 0x5A, 0xF1, 0x19, 0xFA, 0xA7, 0xF9, 0x0E, 0x0A, + 0xBD, 0xFE, 0x8B, 0x12, 0xBF, 0xFA, 0xDD, 0x0D, 0xFE, 0xFC, 0xA1, 0x0B, + 0x16, 0x00, 0xCC, 0x11, 0xED, 0x00, 0xE4, 0x13, 0x0F, 0x05, 0xE4, 0x09, + 0x9B, 0x08, 0x87, 0xFB, 0x0C, 0x03, 0x43, 0xF6, 0x42, 0xF7, 0xBD, 0xF4, + 0x51, 0xF5, 0x26, 0xEF, 0xA5, 0xFE, 0x10, 0xF1, 0xFD, 0x08, 0xAA, 0xFC, + 0x51, 0x11, 0x40, 0x08, 0x84, 0x11, 0x5A, 0x08, 0x11, 0x0E, 0xAB, 0x00, + 0x4F, 0x08, 0x51, 0xFA, 0x68, 0x09, 0xA2, 0xFD, 0x96, 0x0F, 0x54, 0x06, + 0x35, 0x0D, 0x87, 0x0C, 0x48, 0x0E, 0x28, 0x14, 0x73, 0x11, 0xF2, 0x12, + 0xAA, 0x06, 0x51, 0x01, 0xAC, 0xF9, 0x99, 0xF4, 0xB0, 0xF8, 0x37, 0xFA, + 0xBD, 0xFD, 0xB0, 0x07, 0x0B, 0x0C, 0x12, 0x1B, 0xC5, 0x11, 0xB5, 0x23, + 0x0E, 0x0D, 0xB4, 0x26, 0xCE, 0x16, 0x47, 0x38, 0x6C, 0x20, 0x84, 0x40, + 0x5A, 0x1E, 0xE7, 0x3A, 0xA9, 0x1C, 0x10, 0x39, 0x17, 0x1D, 0x95, 0x31, + 0x65, 0x1C, 0x13, 0x26, 0xF4, 0x1F, 0x3B, 0x29, 0x98, 0x22, 0x3E, 0x31, + 0x6E, 0x21, 0x72, 0x32, 0x09, 0x1F, 0xCA, 0x36, 0xB7, 0x12, 0x7D, 0x34, + 0x5A, 0x0A, 0xD6, 0x2A, 0x83, 0x0B, 0x04, 0x26, 0x40, 0x0E, 0x65, 0x28, + 0x34, 0x16, 0x84, 0x31, 0x58, 0x1E, 0x4C, 0x36, 0x32, 0x26, 0xD5, 0x36, + 0xBB, 0x2D, 0xE7, 0x32, 0x3E, 0x3D, 0x57, 0x2D, 0x9D, 0x4B, 0xFC, 0x2D, + 0x99, 0x40, 0x78, 0x2C, 0x25, 0x37, 0xA6, 0x32, 0xD1, 0x32, 0x46, 0x34, + 0x09, 0x29, 0x6D, 0x29, 0x39, 0x31, 0x5A, 0x2C, 0xC0, 0x3E, 0xC8, 0x2F, + 0xBC, 0x42, 0x47, 0x2C, 0x4C, 0x3D, 0xEA, 0x2B, 0xD0, 0x2D, 0xA6, 0x27, + 0xE3, 0x24, 0x93, 0x23, 0xA3, 0x22, 0xA8, 0x23, 0x32, 0x21, 0x62, 0x21, + 0x37, 0x20, 0xE6, 0x1A, 0x60, 0x1C, 0xE0, 0x11, 0xCA, 0x1F, 0x0C, 0x12, + 0xE4, 0x1C, 0x12, 0x18, 0xAB, 0x0E, 0xBE, 0x1A, 0x76, 0x0C, 0xAB, 0x1F, + 0x35, 0x15, 0x72, 0x23, 0x0B, 0x1D, 0x54, 0x29, 0xCE, 0x1B, 0x4D, 0x2E, + 0xB2, 0x11, 0xAA, 0x28, 0xA7, 0x07, 0x83, 0x1F, 0xE0, 0x01, 0x28, 0x19, + 0x58, 0x06, 0xED, 0x19, 0x18, 0x0A, 0xA9, 0x1C, 0x00, 0x09, 0x0D, 0x1F, + 0x6F, 0x12, 0x4C, 0x25, 0x9A, 0x1A, 0xE5, 0x25, 0xF8, 0x17, 0xB9, 0x22, + 0x7B, 0x0F, 0x36, 0x22, 0x5E, 0x06, 0x9A, 0x1F, 0xD2, 0x0A, 0xF6, 0x22, + 0xCF, 0x1B, 0x4B, 0x2D, 0x45, 0x20, 0x5B, 0x2A, 0x44, 0x1A, 0x59, 0x21, + 0x95, 0x17, 0x21, 0x24, 0x2B, 0x10, 0xDE, 0x1F, 0x39, 0x08, 0xA4, 0x0E, + 0xE9, 0x0B, 0x68, 0x07, 0x67, 0x10, 0x73, 0x09, 0x00, 0x0D, 0x2E, 0x09, + 0xA6, 0x0F, 0x7E, 0x0C, 0x86, 0x11, 0x08, 0x0B, 0x2F, 0x08, 0x25, 0xFD, + 0x7D, 0x00, 0x98, 0xF1, 0x2B, 0x07, 0x1D, 0xEE, 0x55, 0x0F, 0xEF, 0xEC, + 0x82, 0x0B, 0xAB, 0xED, 0x0F, 0x05, 0x38, 0xF4, 0xA9, 0x01, 0xB8, 0xF7, + 0xC4, 0xFE, 0xAB, 0xF1, 0x3F, 0x02, 0xE4, 0xF5, 0x0F, 0x07, 0xD5, 0x06, + 0x1C, 0xFE, 0xDB, 0x10, 0xA5, 0xF6, 0xFE, 0x14, 0x92, 0xFB, 0x82, 0x17, + 0xBA, 0xFC, 0x1B, 0x12, 0x69, 0xF7, 0xC7, 0x08, 0xE5, 0xF7, 0x8F, 0xFF, + 0xC1, 0xFA, 0xC4, 0xF3, 0x5F, 0xF4, 0x61, 0xE7, 0x4A, 0xED, 0xF1, 0xE1, + 0x82, 0xF6, 0x88, 0xE8, 0xBF, 0xFD, 0xC9, 0xE7, 0x4F, 0xF5, 0x69, 0xDF, + 0x81, 0xEE, 0x55, 0xE2, 0x08, 0xE8, 0x44, 0xE9, 0x24, 0xDC, 0xEE, 0xEC, + 0x99, 0xD3, 0xB5, 0xED, 0xBD, 0xD5, 0xE3, 0xF2, 0x98, 0xDA, 0xDA, 0xFB, + 0xA3, 0xD4, 0x44, 0xFB, 0x5D, 0xC9, 0x47, 0xF1, 0xBE, 0xC2, 0x95, 0xE2, + 0x44, 0xC8, 0x38, 0xD9, 0x61, 0xD7, 0x69, 0xDF, 0x85, 0xDD, 0xD8, 0xE5, + 0x62, 0xD9, 0xB1, 0xE2, 0x89, 0xDD, 0x1A, 0xE4, 0xDE, 0xE1, 0x04, 0xE2, + 0x92, 0xDB, 0xBE, 0xD9, 0x30, 0xD9, 0x12, 0xDE, 0x28, 0xDE, 0x86, 0xE4, + 0x07, 0xE7, 0xF1, 0xE3, 0x7D, 0xE8, 0xA4, 0xE1, 0x3A, 0xDD, 0xF3, 0xDE, + 0xEB, 0xDE, 0xE0, 0xE4, 0x08, 0xEA, 0x3F, 0xEC, 0x45, 0xEC, 0x4A, 0xEE, + 0x00, 0xEF, 0xB6, 0xF0, 0xB3, 0xED, 0x58, 0xEA, 0xF8, 0xE3, 0x65, 0xDE, + 0x69, 0xE1, 0x1E, 0xDB, 0xBA, 0xE7, 0x41, 0xD7, 0x52, 0xF3, 0xB8, 0xD2, + 0xB4, 0x00, 0x26, 0xDA, 0x8B, 0x04, 0xAA, 0xE1, 0x6F, 0xF9, 0x67, 0xDA, + 0x9C, 0xEC, 0x9B, 0xD2, 0xF4, 0xEA, 0x0E, 0xD6, 0x2E, 0xF2, 0x70, 0xDD, + 0x17, 0xF4, 0xB2, 0xE5, 0x88, 0xF0, 0xF4, 0xEF, 0x66, 0xF0, 0x8D, 0xF6, + 0xFB, 0xF0, 0xB2, 0xF9, 0x34, 0xF4, 0x96, 0x02, 0x2A, 0xFA, 0x76, 0x10, + 0x39, 0xFE, 0x1D, 0x17, 0x33, 0x00, 0xC6, 0x12, 0x9C, 0x06, 0x64, 0x0D, + 0x4A, 0x0B, 0x60, 0x08, 0x49, 0x07, 0x73, 0xFD, 0x9B, 0xFE, 0xA4, 0xEF, + 0x92, 0xF8, 0x7A, 0xE9, 0x92, 0xF4, 0xE2, 0xE9, 0x1A, 0xF7, 0x98, 0xF2, + 0x5D, 0x04, 0xFD, 0x01, 0x53, 0x0E, 0xA4, 0x07, 0x2A, 0x0A, 0x3A, 0x00, + 0x7A, 0xFE, 0x57, 0xF6, 0x8A, 0xF9, 0xD0, 0xF3, 0x2A, 0xF5, 0x58, 0xF5, + 0xF6, 0xEA, 0x29, 0xFA, 0x7C, 0xE3, 0x15, 0x00, 0x32, 0xE2, 0xB9, 0xFF, + 0x37, 0xDF, 0x0B, 0xF2, 0x81, 0xDF, 0x08, 0xE3, 0x8E, 0xDF, 0x84, 0xDB, + 0xD4, 0xD6, 0xC4, 0xD3, 0x93, 0xD9, 0xA5, 0xD3, 0x8A, 0xE7, 0x39, 0xD6, + 0x9E, 0xF5, 0x81, 0xD9, 0xC6, 0xFE, 0x42, 0xDF, 0xFD, 0xF5, 0xB6, 0xDD, + 0x94, 0xE9, 0x25, 0xDF, 0xB1, 0xE9, 0xB9, 0xE7, 0x9D, 0xE4, 0xFD, 0xE2, + 0x1C, 0xD6, 0x8F, 0xD6, 0xA0, 0xD4, 0x42, 0xDF, 0x90, 0xDF, 0xD8, 0xEB, + 0xDB, 0xEC, 0x66, 0xEE, 0x28, 0xF8, 0x9F, 0xFA, 0xAD, 0xF3, 0xF2, 0x06, + 0xDC, 0xE8, 0x8E, 0x07, 0xE2, 0xE5, 0xB1, 0x02, 0x97, 0xEB, 0xAF, 0xFD, + 0x9E, 0xF5, 0xC9, 0xF8, 0x6F, 0xFD, 0xFF, 0xF7, 0x52, 0x01, 0xF1, 0xFA, + 0x98, 0xFD, 0xEC, 0xF7, 0x5A, 0xF0, 0xE7, 0xEE, 0x40, 0xE3, 0x56, 0xE8, + 0x8C, 0xE4, 0x5C, 0xEA, 0x6F, 0xED, 0x95, 0xEE, 0xDD, 0xF7, 0x5E, 0xF0, + 0xCF, 0x03, 0x08, 0xF0, 0xB9, 0x00, 0x45, 0xE8, 0xB7, 0xF8, 0x3A, 0xE5, + 0x43, 0xFF, 0x47, 0xEA, 0x45, 0x0E, 0x78, 0xEC, 0xE6, 0x1D, 0x0E, 0xF0, + 0xCC, 0x22, 0x20, 0xF6, 0x7D, 0x1C, 0x20, 0xFC, 0x7F, 0x0B, 0x24, 0xF9, + 0x83, 0xFA, 0xE2, 0xEF, 0xFD, 0xFC, 0x79, 0xEE, 0x7E, 0x0A, 0x36, 0xF3, + 0xAC, 0x0E, 0x60, 0xF7, 0x4A, 0x09, 0x9D, 0xF9, 0xCB, 0x08, 0xFC, 0xFC, + 0x8F, 0x09, 0x55, 0x00, 0x80, 0x02, 0x49, 0x01, 0x6C, 0xFC, 0xAE, 0x06, + 0x94, 0xFC, 0xA2, 0x0D, 0x11, 0x06, 0xDF, 0x11, 0xC4, 0x10, 0xD2, 0x15, + 0x6C, 0x0F, 0x4B, 0x1A, 0x7E, 0x03, 0xC5, 0x19, 0xF7, 0xF4, 0xBE, 0x10, + 0x81, 0xF1, 0x05, 0x0D, 0x8A, 0xFA, 0x57, 0x0B, 0x43, 0x07, 0x04, 0x02, + 0x30, 0x12, 0x73, 0xFB, 0xA4, 0x16, 0xD8, 0xFA, 0xD4, 0x0E, 0xCC, 0xF6, + 0x63, 0x06, 0x50, 0xF3, 0x3F, 0x07, 0x6F, 0xF8, 0xE8, 0x07, 0x7B, 0xFD, + 0x0F, 0x02, 0xD6, 0xF8, 0x6B, 0xFF, 0xC1, 0xF2, 0xEE, 0xFC, 0x8F, 0xF0, + 0xA0, 0xF3, 0x6D, 0xED, 0x98, 0xF2, 0x7A, 0xEC, 0x8D, 0xFD, 0x1A, 0xF1, + 0x10, 0x0C, 0xB7, 0xF8, 0x27, 0x11, 0x2B, 0xFA, 0xE0, 0x08, 0x2F, 0xF7, + 0x91, 0xFB, 0x08, 0xF8, 0xF0, 0xEA, 0x7F, 0xF6, 0xC5, 0xD9, 0xCE, 0xF0, + 0x15, 0xD7, 0x82, 0xF0, 0x6F, 0xE5, 0x06, 0xF1, 0xCE, 0xEF, 0xBD, 0xE8, + 0xE3, 0xED, 0xAE, 0xE5, 0x06, 0xDE, 0xBB, 0xE7, 0xFB, 0xCB, 0x42, 0xE4, + 0x71, 0xCE, 0x84, 0xE6, 0xE1, 0xD7, 0xCD, 0xED, 0xE3, 0xE0, 0xFF, 0xF3, + 0x58, 0xEC, 0x3A, 0xF2, 0x8C, 0xF2, 0x91, 0xE9, 0xA2, 0xF4, 0x18, 0xEA, + 0xA1, 0xEF, 0x9F, 0xF2, 0x87, 0xED, 0xF6, 0xFF, 0x0F, 0xF9, 0xB3, 0x07, + 0x79, 0x07, 0xF9, 0xFC, 0x1A, 0x09, 0x13, 0xEB, 0xDF, 0x01, 0xAE, 0xDE, + 0x19, 0xFE, 0x48, 0xD6, 0x54, 0xF8, 0xB4, 0xCF, 0xEF, 0xF4, 0x53, 0xD3, + 0x7F, 0xF5, 0x11, 0xDC, 0xAD, 0xF0, 0xD6, 0xE1, 0x8C, 0xE9, 0xBB, 0xEA, + 0xB1, 0xE6, 0xC9, 0xF3, 0x85, 0xE6, 0x00, 0xF4, 0x7F, 0xE7, 0x15, 0xF3, + 0xCC, 0xEA, 0xB1, 0xF7, 0x1C, 0xE7, 0xB5, 0xF3, 0xBF, 0xDF, 0xB7, 0xE7, + 0x08, 0xDD, 0x54, 0xE0, 0x1B, 0xDD, 0xEC, 0xDC, 0x70, 0xE4, 0xDB, 0xE2, + 0x0F, 0xEE, 0x98, 0xEE, 0x8E, 0xED, 0x88, 0xF0, 0x83, 0xEE, 0xEF, 0xE5, + 0xF2, 0xF8, 0x01, 0xDA, 0x38, 0x03, 0x13, 0xD9, 0x99, 0x05, 0x1C, 0xE0, + 0x38, 0x05, 0xB5, 0xEC, 0x68, 0x04, 0xFB, 0xF7, 0x0F, 0xF9, 0xE2, 0xF9, + 0x51, 0xF0, 0x01, 0xFC, 0x9C, 0xF2, 0x2D, 0xFB, 0x15, 0xF2, 0x0C, 0xF4, + 0xBD, 0xF0, 0x49, 0xF5, 0xD2, 0xFD, 0xD6, 0x00, 0x17, 0x16, 0x1C, 0x0D, + 0xE3, 0x24, 0x41, 0x15, 0xE8, 0x23, 0x79, 0x18, 0x3A, 0x23, 0x93, 0x1E, + 0xFC, 0x25, 0xC7, 0x27, 0x62, 0x21, 0x6A, 0x2D, 0xFE, 0x1A, 0x68, 0x33, + 0x4C, 0x1F, 0x9A, 0x37, 0x93, 0x29, 0x7E, 0x32, 0x97, 0x29, 0xE9, 0x29, + 0x3E, 0x1F, 0x2E, 0x2A, 0x96, 0x17, 0x99, 0x32, 0x39, 0x16, 0x7B, 0x38, + 0x60, 0x17, 0x2F, 0x39, 0xFC, 0x17, 0xAD, 0x34, 0xF2, 0x13, 0x92, 0x29, + 0x62, 0x17, 0x92, 0x22, 0x23, 0x1E, 0x4B, 0x1E, 0xA5, 0x1C, 0x82, 0x19, + 0x06, 0x20, 0xB2, 0x20, 0x94, 0x2D, 0x67, 0x2C, 0x1C, 0x38, 0xE1, 0x2D, + 0x16, 0x3B, 0xB7, 0x2A, 0x3F, 0x3D, 0xE5, 0x23, 0x5C, 0x3B, 0x34, 0x18, + 0x06, 0x39, 0x7E, 0x14, 0xF7, 0x37, 0xAD, 0x18, 0x4B, 0x36, 0xB1, 0x1C, + 0xCD, 0x36, 0xCF, 0x1D, 0xEA, 0x34, 0xB3, 0x19, 0x41, 0x33, 0xA8, 0x15, + 0x62, 0x2F, 0xEF, 0x12, 0x4E, 0x23, 0xC6, 0x14, 0xBF, 0x14, 0xB6, 0x19, + 0x86, 0x08, 0x76, 0x1B, 0xD7, 0x00, 0x0F, 0x18, 0xAC, 0x03, 0xBA, 0x11, + 0xC8, 0x10, 0xF1, 0x10, 0xC7, 0x1E, 0xE7, 0x17, 0xA7, 0x26, 0x7F, 0x1B, + 0x98, 0x24, 0x17, 0x1E, 0xB0, 0x16, 0xE4, 0x24, 0x43, 0x0D, 0xC1, 0x2C, + 0xE4, 0x12, 0x68, 0x30, 0xD4, 0x19, 0x20, 0x29, 0x6B, 0x1E, 0x22, 0x24, + 0x34, 0x1E, 0x48, 0x28, 0xB6, 0x15, 0x60, 0x2C, 0x3C, 0x0C, 0x75, 0x2A, + 0xAD, 0x0E, 0xE3, 0x28, 0xF3, 0x16, 0xAA, 0x29, 0xB9, 0x16, 0xAB, 0x24, + 0x4A, 0x16, 0xEE, 0x1B, 0x3F, 0x13, 0x61, 0x12, 0x88, 0x0E, 0x48, 0x0F, + 0xA8, 0x0E, 0xB5, 0x16, 0x10, 0x14, 0x8F, 0x23, 0x7F, 0x1C, 0xFD, 0x29, + 0xF9, 0x20, 0xCE, 0x28, 0x1A, 0x1C, 0x99, 0x29, 0x43, 0x0D, 0xC5, 0x29, + 0x44, 0xFF, 0x28, 0x2A, 0x5B, 0xFD, 0x20, 0x28, 0x27, 0x03, 0xD1, 0x1E, + 0x3F, 0x07, 0x4D, 0x13, 0x59, 0x09, 0x02, 0x0D, 0x1A, 0x08, 0xA1, 0x0A, + 0x32, 0x06, 0xA4, 0x09, 0x11, 0x08, 0xA9, 0x07, 0xEA, 0x0E, 0x17, 0x01, + 0x88, 0x17, 0xAD, 0xFC, 0xD5, 0x17, 0x63, 0xFC, 0x7F, 0x0D, 0x20, 0xFC, + 0xFE, 0x0C, 0x77, 0xFB, 0x50, 0x19, 0xD7, 0xF7, 0x1D, 0x1E, 0xAC, 0xF5, + 0x44, 0x18, 0xE0, 0xF7, 0xD4, 0x12, 0xD9, 0xFC, 0x99, 0x11, 0xE3, 0x03, + 0xB5, 0x0C, 0x83, 0x08, 0xD3, 0x04, 0x9B, 0x09, 0xAB, 0xFF, 0x8D, 0x09, + 0xA8, 0x01, 0x7F, 0x0A, 0x02, 0x06, 0xA0, 0x0B, 0x82, 0x09, 0x59, 0x0D, + 0xC4, 0x0A, 0x89, 0x11, 0x61, 0x02, 0x26, 0x13, 0x07, 0xF9, 0xFF, 0x11, + 0xC8, 0xF1, 0x7B, 0x0E, 0x3D, 0xEC, 0x10, 0x03, 0x69, 0xEC, 0x14, 0xF6, + 0xA1, 0xF0, 0x89, 0xF1, 0x50, 0xF5, 0x26, 0xF2, 0x2E, 0xF5, 0x4D, 0xF2, + 0x8A, 0xF4, 0x3C, 0xF1, 0xF3, 0xF2, 0xDF, 0xF0, 0x8E, 0xED, 0x79, 0xF3, + 0xDD, 0xED, 0xF1, 0xF1, 0x6C, 0xF7, 0x7A, 0xEE, 0x6D, 0x05, 0x6D, 0xF0, + 0x2B, 0x0A, 0x33, 0xF4, 0xE8, 0xFE, 0xE5, 0xF7, 0xF7, 0xF1, 0x1A, 0xFB, + 0x3A, 0xEC, 0x8A, 0xFB, 0xD1, 0xED, 0xAF, 0xF9, 0x40, 0xF4, 0xBC, 0xF9, + 0x4A, 0xF7, 0x22, 0xF8, 0xE0, 0xF6, 0xA6, 0xF7, 0xBE, 0xF2, 0xC4, 0xFA, + 0x1E, 0xEC, 0x60, 0xFE, 0xFD, 0xE8, 0x59, 0x06, 0x7E, 0xEA, 0xBB, 0x10, + 0x49, 0xF1, 0x9A, 0x18, 0x46, 0xFD, 0x86, 0x1D, 0x51, 0x05, 0x6B, 0x20, + 0xE5, 0x02, 0xAE, 0x1D, 0x09, 0xFF, 0x20, 0x15, 0x9C, 0xFB, 0x36, 0x07, + 0x22, 0xF5, 0xC1, 0xF9, 0xF9, 0xF4, 0x05, 0xF6, 0x28, 0xFA, 0xFC, 0xF4, + 0x78, 0xFB, 0x2A, 0xF1, 0x8D, 0xFD, 0xF7, 0xED, 0xFD, 0xFE, 0x7F, 0xE4, + 0xA7, 0xFE, 0x1C, 0xD9, 0x2B, 0xFB, 0xC1, 0xDC, 0x39, 0xF5, 0x9D, 0xEA, + 0xF8, 0xF6, 0x95, 0xF4, 0x7D, 0x00, 0x77, 0xF9, 0x1B, 0x07, 0xA1, 0xFF, + 0x9A, 0x02, 0x63, 0x08, 0x82, 0xF5, 0xE8, 0x0E, 0x71, 0xEE, 0x5D, 0x13, + 0xC6, 0xF1, 0xF2, 0x14, 0x94, 0xF6, 0x13, 0x13, 0x99, 0xFC, 0xB9, 0x11, + 0xD9, 0x00, 0x3B, 0x0F, 0xEC, 0xFB, 0x93, 0x0B, 0x8E, 0xEE, 0xA0, 0x0D, + 0x3F, 0xE4, 0x96, 0x11, 0x33, 0xE5, 0xE4, 0x0D, 0x8D, 0xEF, 0x22, 0x08, + 0xBB, 0xFF, 0x3B, 0x04, 0x85, 0x0C, 0x3D, 0xFD, 0x74, 0x14, 0x01, 0xFB, + 0xB5, 0x16, 0x88, 0x00, 0x85, 0x11, 0x47, 0x05, 0x7C, 0x06, 0x80, 0x07, + 0xD2, 0xFA, 0x5A, 0x0C, 0x0D, 0xF6, 0x9E, 0x11, 0x05, 0xF2, 0x15, 0x0D, + 0x5D, 0xF5, 0xF7, 0x07, 0xF5, 0xFE, 0x1F, 0x05, 0xE7, 0x01, 0xDF, 0xFA, + 0xC8, 0x02, 0x3B, 0xF0, 0x04, 0x02, 0xB2, 0xEB, 0xFA, 0xFF, 0x3C, 0xED, + 0x24, 0x04, 0x3F, 0xF1, 0xFF, 0x0D, 0xC9, 0xF0, 0x9D, 0x0F, 0x05, 0xED, + 0x27, 0x08, 0xC9, 0xEE, 0x40, 0x03, 0x0D, 0xF5, 0x8F, 0xFA, 0xAF, 0xF7, + 0xA2, 0xEF, 0x8C, 0xFA, 0xC8, 0xEF, 0x99, 0x04, 0x53, 0xF5, 0x77, 0x09, + 0x67, 0xF6, 0xFE, 0x07, 0x1A, 0xF3, 0x25, 0x09, 0x42, 0xF1, 0x6A, 0x08, + 0x20, 0xF0, 0x99, 0x03, 0xB5, 0xF0, 0x15, 0xFB, 0x1A, 0xF3, 0xDE, 0xF2, + 0xBF, 0xF1, 0x53, 0xEB, 0x10, 0xF1, 0xF1, 0xE2, 0x5E, 0xF0, 0x43, 0xDE, + 0xF5, 0xEB, 0xCD, 0xDC, 0x77, 0xE5, 0x8C, 0xD9, 0xED, 0xE3, 0x38, 0xD4, + 0x05, 0xEC, 0x18, 0xD4, 0x37, 0xEF, 0x2B, 0xDB, 0xCB, 0xEA, 0x4F, 0xE3, + 0xED, 0xEE, 0x82, 0xE9, 0xCB, 0xF9, 0x25, 0xE8, 0x2B, 0x05, 0x54, 0xE5, + 0x96, 0x08, 0x9E, 0xE6, 0x03, 0x05, 0x2C, 0xEA, 0x1D, 0x06, 0xE9, 0xEF, + 0x9B, 0x05, 0x24, 0xF6, 0x42, 0x01, 0x67, 0xFA, 0xF1, 0x02, 0xC4, 0xFD, + 0xFF, 0x06, 0xC2, 0x02, 0x52, 0xFF, 0xBC, 0x02, 0xDF, 0xF6, 0x63, 0x06, + 0xED, 0xF8, 0xEC, 0x0D, 0x1E, 0xFE, 0x4F, 0x0D, 0xA4, 0x05, 0x52, 0x0C, + 0xF5, 0x07, 0x98, 0x0E, 0x3C, 0x03, 0x3B, 0x13, 0x3B, 0x01, 0xF9, 0x1B, + 0x1F, 0xFD, 0xC0, 0x1F, 0x27, 0xF9, 0xC5, 0x1E, 0x9A, 0xFD, 0xD1, 0x20, + 0xFA, 0xFF, 0xFF, 0x1C, 0xDC, 0xF9, 0x4E, 0x16, 0xC4, 0xF4, 0x27, 0x17, + 0x5F, 0xF5, 0x4F, 0x12, 0x65, 0xFC, 0xBF, 0x08, 0x00, 0x06, 0x00, 0x05, + 0x5A, 0x08, 0x32, 0xFD, 0xFD, 0x02, 0xB9, 0xF2, 0xC2, 0xF9, 0xBC, 0xEF, + 0x21, 0xF3, 0x5B, 0xF5, 0x3A, 0xF5, 0x91, 0xF9, 0x37, 0x01, 0xE0, 0xF4, + 0x29, 0x0A, 0xAC, 0xF0, 0x00, 0x06, 0x2D, 0xEF, 0xF5, 0xFB, 0x05, 0xEB, + 0xDC, 0xF6, 0x3D, 0xE8, 0xCD, 0xF5, 0x87, 0xEA, 0xDD, 0xF4, 0xB0, 0xF0, + 0x93, 0xF9, 0x43, 0xF5, 0x6E, 0xFE, 0x5C, 0xF3, 0x7C, 0x04, 0xF9, 0xF4, + 0x8A, 0x07, 0x8B, 0xF8, 0x52, 0xF9, 0x1A, 0xF6, 0x59, 0xE7, 0x92, 0xF3, + 0x18, 0xE3, 0xBC, 0xEF, 0x77, 0xE6, 0x6F, 0xE6, 0xE9, 0xE9, 0xA2, 0xDD, + 0xB3, 0xEB, 0x2A, 0xDD, 0xCC, 0xE5, 0xDC, 0xDE, 0xD2, 0xDD, 0xC0, 0xD9, + 0x58, 0xDA, 0x93, 0xCF, 0x41, 0xD8, 0x96, 0xCC, 0x0F, 0xD8, 0x8B, 0xD5, + 0xF6, 0xDA, 0x20, 0xDC, 0xE0, 0xDF, 0x8D, 0xD9, 0xEF, 0xE0, 0x26, 0xD8, + 0xBF, 0xD9, 0x40, 0xDD, 0x6E, 0xD3, 0x0F, 0xE3, 0xF6, 0xD1, 0x08, 0xE7, + 0xC8, 0xD9, 0x86, 0xE9, 0x2C, 0xEB, 0x50, 0xE2, 0xC6, 0xF5, 0x49, 0xD3, + 0x65, 0xF0, 0x9D, 0xC7, 0x6A, 0xDC, 0x92, 0xBD, 0xF9, 0xCC, 0xD1, 0xB6, + 0xD0, 0xCC, 0xB5, 0xB5, 0x2F, 0xD3, 0x7E, 0xB8, 0x9D, 0xD6, 0xA1, 0xBE, + 0x0F, 0xD5, 0xB1, 0xC1, 0x3C, 0xD2, 0xD4, 0xBF, 0x3B, 0xCE, 0x10, 0xBE, + 0x9A, 0xCC, 0x6F, 0xC0, 0x96, 0xD1, 0x9A, 0xC7, 0xAC, 0xD7, 0xBF, 0xCB, + 0xB8, 0xD5, 0xAB, 0xC8, 0x28, 0xD3, 0x79, 0xC4, 0xDA, 0xD9, 0x33, 0xC7, + 0xD8, 0xE0, 0xEC, 0xCF, 0x87, 0xE3, 0xC1, 0xD7, 0x9E, 0xEB, 0x7B, 0xDC, + 0xF5, 0xF6, 0xC7, 0xDB, 0x3B, 0xF8, 0x21, 0xD9, 0x15, 0xEC, 0x61, 0xDC, + 0x54, 0xDB, 0x2C, 0xE4, 0x05, 0xD5, 0x20, 0xE9, 0xCF, 0xDF, 0xBB, 0xE7, + 0xB3, 0xEC, 0x1E, 0xE2, 0xB5, 0xEB, 0x29, 0xE3, 0x91, 0xE1, 0x4B, 0xEE, + 0x09, 0xDC, 0x62, 0xF2, 0xDC, 0xDF, 0x3D, 0xED, 0xEA, 0xE9, 0x7B, 0xEF, + 0x04, 0xF4, 0x87, 0xF8, 0x60, 0xF8, 0xAF, 0xFF, 0x6B, 0xFB, 0xDA, 0x02, + 0x73, 0xFA, 0x23, 0x00, 0x25, 0xF6, 0x26, 0xFD, 0x8A, 0xF8, 0x37, 0xFE, + 0xBE, 0xFC, 0x9D, 0x02, 0x1C, 0x01, 0xF5, 0x06, 0x65, 0x0A, 0x44, 0x0B, + 0x9D, 0x10, 0xA6, 0x0D, 0x73, 0x0D, 0xFF, 0x06, 0xAC, 0x06, 0x05, 0x00, + 0x2D, 0x00, 0xE4, 0xFE, 0x19, 0x02, 0xC1, 0x01, 0x95, 0x0B, 0x44, 0x0A, + 0xFE, 0x0E, 0xFA, 0x12, 0x3F, 0x0B, 0xCE, 0x1A, 0x62, 0x00, 0xB8, 0x1D, + 0x29, 0xF4, 0x29, 0x18, 0x4E, 0xF3, 0x3E, 0x14, 0xA8, 0xF6, 0x27, 0x13, + 0x1A, 0xFB, 0xBD, 0x13, 0x72, 0x10, 0x69, 0x11, 0x7A, 0x2D, 0x76, 0x06, + 0x84, 0x3B, 0x87, 0xFD, 0x21, 0x39, 0x0B, 0x01, 0x6D, 0x2F, 0x81, 0x0B, + 0x11, 0x2E, 0x98, 0x12, 0x10, 0x37, 0x7E, 0x14, 0xD9, 0x39, 0xDB, 0x13, + 0x12, 0x34, 0x4C, 0x18, 0x29, 0x28, 0x59, 0x1C, 0xB2, 0x15, 0x3F, 0x15, + 0x58, 0x0C, 0x54, 0x0E, 0x1B, 0x0F, 0x95, 0x0C, 0xCD, 0x11, 0x1C, 0x0B, + 0xF6, 0x11, 0xEA, 0x0C, 0x42, 0x12, 0x3F, 0x11, 0x02, 0x18, 0xA5, 0x15, + 0xA6, 0x1E, 0x07, 0x1A, 0xFF, 0x1E, 0x27, 0x20, 0x41, 0x1E, 0xCE, 0x26, + 0x38, 0x20, 0xCC, 0x24, 0x26, 0x24, 0xB0, 0x1A, 0x1B, 0x1E, 0xA6, 0x17, + 0x93, 0x06, 0x34, 0x1F, 0x5C, 0xF3, 0x75, 0x23, 0x25, 0xF5, 0xD5, 0x1E, + 0xCA, 0xFF, 0xA7, 0x15, 0xE4, 0x06, 0x67, 0x0D, 0x85, 0x0A, 0x82, 0x0B, + 0x7D, 0x09, 0xFC, 0x0D, 0xEB, 0x08, 0xCA, 0x0D, 0x3F, 0x11, 0xFA, 0x09, + 0xF6, 0x1C, 0x84, 0x0C, 0x60, 0x24, 0x22, 0x19, 0x1B, 0x28, 0xDA, 0x24, + 0x64, 0x25, 0x8E, 0x26, 0xEE, 0x1F, 0x25, 0x24, 0x19, 0x21, 0xFB, 0x24, + 0xCA, 0x1E, 0x4E, 0x23, 0x0D, 0x16, 0x3A, 0x1E, 0x4C, 0x10, 0x4D, 0x1D, + 0x8B, 0x10, 0xE5, 0x1C, 0xC9, 0x11, 0x05, 0x1A, 0x56, 0x0C, 0x63, 0x1A, + 0xA0, 0x01, 0x98, 0x1A, 0xD6, 0xFE, 0xB3, 0x17, 0x85, 0x0A, 0x5D, 0x13, + 0x08, 0x18, 0x20, 0x11, 0x32, 0x20, 0x54, 0x0E, 0x11, 0x1C, 0xAE, 0x02, + 0x94, 0x0E, 0xE5, 0xF8, 0x23, 0x05, 0x93, 0xF8, 0x8A, 0xFD, 0x38, 0xFC, + 0xD7, 0xFA, 0x6A, 0x01, 0x51, 0x07, 0x2C, 0x06, 0x63, 0x16, 0xFA, 0x0B, + 0x6C, 0x14, 0x4E, 0x10, 0x1C, 0x0B, 0x3F, 0x14, 0x0A, 0x06, 0xC4, 0x15, + 0x7C, 0x06, 0xC3, 0x12, 0x6C, 0x0B, 0xB2, 0x13, 0xEF, 0x10, 0xED, 0x14, + 0xD5, 0x16, 0x96, 0x15, 0x24, 0x13, 0x27, 0x17, 0x0C, 0x05, 0x13, 0x14, + 0x40, 0xF8, 0x15, 0x0D, 0xFA, 0xEF, 0xDF, 0x03, 0xAF, 0xF0, 0xE3, 0xFA, + 0xEC, 0xF6, 0x44, 0xF8, 0x78, 0xF9, 0x87, 0xFE, 0xAD, 0xFE, 0xA3, 0x08, + 0x52, 0x0A, 0xD7, 0x0F, 0x4B, 0x0E, 0x8B, 0x0D, 0x5A, 0x0E, 0xCB, 0x08, + 0xB0, 0x14, 0x17, 0x07, 0x4A, 0x18, 0x71, 0x02, 0x5B, 0x17, 0x7D, 0x02, + 0x6B, 0x15, 0x69, 0x06, 0x25, 0x15, 0xB0, 0x03, 0x86, 0x14, 0xEE, 0xFF, + 0xA5, 0x0C, 0x13, 0x00, 0xA2, 0x01, 0x9F, 0xFF, 0x48, 0x02, 0x2D, 0x01, + 0xF2, 0x04, 0x5F, 0x04, 0x6D, 0xF9, 0x07, 0x08, 0x56, 0xEF, 0x1C, 0x0D, + 0xED, 0xEF, 0xB1, 0x0E, 0x6A, 0xF5, 0x9E, 0x0D, 0x9E, 0xF7, 0x5F, 0x0C, + 0xAF, 0xF4, 0x32, 0x0C, 0x04, 0xF7, 0x16, 0x0E, 0x45, 0x01, 0x34, 0x0D, + 0x3D, 0x08, 0x69, 0x07, 0x19, 0x03, 0xD5, 0x04, 0x00, 0xFA, 0x34, 0x05, + 0x5B, 0xF9, 0x08, 0xFD, 0xAA, 0xFE, 0xAF, 0xEF, 0x33, 0x02, 0x75, 0xE9, + 0xAD, 0x01, 0x55, 0xEB, 0x2D, 0xFE, 0xD0, 0xEF, 0x2E, 0xF6, 0x55, 0xF0, + 0xC4, 0xEB, 0x6E, 0xED, 0xD2, 0xE8, 0xD3, 0xEC, 0x0A, 0xF0, 0xD9, 0xEE, + 0x16, 0xFA, 0x5E, 0xEF, 0x39, 0xFD, 0x27, 0xED, 0xE3, 0xFC, 0xD0, 0xF0, + 0xB4, 0x00, 0x23, 0xF8, 0x71, 0x05, 0x99, 0xFC, 0xE0, 0x08, 0xC6, 0xFE, + 0x40, 0x0E, 0x61, 0x00, 0x05, 0x12, 0x70, 0x04, 0x2C, 0x0E, 0x56, 0x09, + 0x17, 0x06, 0x8A, 0x11, 0x9C, 0x00, 0x1F, 0x1E, 0xE0, 0x05, 0xB8, 0x27, + 0x4E, 0x11, 0xB0, 0x28, 0x1C, 0x14, 0x87, 0x26, 0x53, 0x0A, 0xC0, 0x26, + 0xC1, 0xFF, 0xBA, 0x21, 0x4C, 0x00, 0x32, 0x15, 0x84, 0x06, 0xB5, 0x0E, + 0xFE, 0x08, 0xF3, 0x13, 0xE6, 0x0B, 0x7E, 0x1D, 0x60, 0x13, 0x22, 0x27, + 0x99, 0x17, 0xD6, 0x2D, 0xFE, 0x17, 0x36, 0x30, 0x7F, 0x17, 0x70, 0x2C, + 0x8E, 0x13, 0x3A, 0x25, 0x28, 0x0F, 0x51, 0x21, 0xDE, 0x0B, 0x43, 0x1D, + 0x41, 0x09, 0x88, 0x19, 0x2C, 0x0A, 0x66, 0x18, 0x39, 0x0E, 0x61, 0x11, + 0xDC, 0x10, 0xAC, 0x07, 0x28, 0x10, 0x50, 0x05, 0x91, 0x13, 0xEF, 0x06, + 0x15, 0x1B, 0x01, 0x0A, 0xD4, 0x1A, 0x91, 0x0D, 0x41, 0x12, 0x36, 0x0C, + 0x53, 0x0D, 0x57, 0x07, 0x55, 0x10, 0xD0, 0x03, 0xDA, 0x0B, 0x65, 0x00, + 0xC9, 0xFF, 0x10, 0xFF, 0x77, 0xFF, 0xF8, 0x00, 0x1B, 0x04, 0x5A, 0x01, + 0xF9, 0x00, 0x57, 0x06, 0xF4, 0xFB, 0x00, 0x0F, 0x8F, 0xFC, 0x8E, 0x0F, + 0xD8, 0x01, 0x3A, 0x08, 0x47, 0x04, 0x9D, 0x00, 0x55, 0xFF, 0x54, 0xFC, + 0xC8, 0xF9, 0x36, 0xFD, 0x58, 0xF8, 0xCD, 0x00, 0x87, 0xF9, 0x83, 0xFE, + 0xB4, 0xFC, 0x99, 0xF7, 0x16, 0x01, 0x00, 0xF3, 0x8E, 0x04, 0x04, 0xF0, + 0xB9, 0xFE, 0xCA, 0xEB, 0x50, 0xF5, 0x65, 0xEB, 0x4C, 0xFA, 0xE8, 0xF3, + 0x74, 0x0A, 0x4D, 0x00, 0x6E, 0x17, 0x70, 0x06, 0x45, 0x1E, 0x4D, 0x04, + 0x06, 0x1C, 0xD8, 0xFC, 0xD4, 0x13, 0x8A, 0xF7, 0x6A, 0x0D, 0x80, 0xFA, + 0x2F, 0x04, 0xC4, 0xFD, 0x79, 0xFF, 0x71, 0x01, 0x70, 0x09, 0x9A, 0x0C, + 0x59, 0x16, 0x25, 0x15, 0x7F, 0x19, 0xAB, 0x16, 0x83, 0x10, 0x83, 0x1B, + 0x10, 0x02, 0x45, 0x23, 0x17, 0xFA, 0x40, 0x27, 0xB6, 0xFB, 0x26, 0x28, + 0xE3, 0x01, 0x2F, 0x29, 0x9A, 0x0B, 0x51, 0x2C, 0x0D, 0x0F, 0xFB, 0x2D, + 0x25, 0x09, 0xD9, 0x2A, 0x94, 0x09, 0x6C, 0x26, 0x75, 0x0F, 0x68, 0x20, + 0x7C, 0x0D, 0x89, 0x17, 0xFB, 0x04, 0x50, 0x10, 0x9E, 0x00, 0x7E, 0x07, + 0x4F, 0x06, 0x6F, 0xFE, 0xDE, 0x0F, 0x55, 0xFB, 0xA2, 0x14, 0x86, 0xFC, + 0xED, 0x15, 0x7A, 0x01, 0xDE, 0x17, 0x05, 0x05, 0x15, 0x1B, 0x67, 0x03, + 0x82, 0x19, 0x66, 0xFE, 0xB9, 0x10, 0x1E, 0xF9, 0x65, 0x05, 0x05, 0xF1, + 0x3F, 0xFF, 0x0A, 0xE9, 0xD5, 0xFE, 0x80, 0xE7, 0x0F, 0xF8, 0x71, 0xEC, + 0x70, 0xEC, 0x4E, 0xF7, 0xEF, 0xE5, 0x3F, 0xFF, 0x5B, 0xEA, 0x20, 0x04, + 0x6D, 0xF6, 0x3D, 0x06, 0x53, 0xFA, 0x7A, 0x02, 0x83, 0xF4, 0x13, 0x00, + 0x36, 0xF0, 0x12, 0xFB, 0x04, 0xED, 0x28, 0xED, 0xD2, 0xEA, 0xC6, 0xE3, + 0x23, 0xE5, 0x18, 0xE4, 0xAB, 0xD5, 0xE8, 0xE4, 0x4A, 0xC4, 0x9F, 0xE3, + 0x13, 0xBC, 0x67, 0xDD, 0x2E, 0xC0, 0xAA, 0xD0, 0x24, 0xC6, 0x91, 0xC4, + 0x5E, 0xC7, 0x14, 0xC5, 0x75, 0xC7, 0x26, 0xCD, 0x8C, 0xCD, 0x61, 0xD3, + 0xD0, 0xDE, 0xCD, 0xDC, 0x2E, 0xF0, 0xA3, 0xE6, 0x31, 0xF6, 0xF3, 0xED, + 0x3C, 0xF3, 0x66, 0xEB, 0x76, 0xEE, 0xF4, 0xDE, 0xDF, 0xE9, 0x8F, 0xD7, + 0xFB, 0xE0, 0xAD, 0xD2, 0xF2, 0xD8, 0x67, 0xCD, 0x37, 0xD9, 0x27, 0xCE, + 0x6B, 0xDB, 0x80, 0xD3, 0x6E, 0xD9, 0x92, 0xD8, 0xD3, 0xD3, 0x48, 0xDD, + 0x31, 0xCF, 0xA3, 0xE0, 0x16, 0xCF, 0x07, 0xDC, 0x6B, 0xD3, 0x74, 0xD1, + 0x0D, 0xDB, 0x4D, 0xC9, 0x18, 0xE2, 0x0A, 0xCB, 0x89, 0xE3, 0x0B, 0xD2, + 0x72, 0xE1, 0xE8, 0xD3, 0xD0, 0xDF, 0x47, 0xD2, 0xF5, 0xDC, 0x30, 0xD4, + 0xE3, 0xD7, 0xDD, 0xD9, 0xDD, 0xD1, 0xD0, 0xDE, 0xF8, 0xD1, 0x5C, 0xE0, + 0xEF, 0xDA, 0x52, 0xDA, 0x39, 0xE5, 0x0E, 0xD2, 0x86, 0xE9, 0x9C, 0xCD, + 0x1A, 0xE9, 0x04, 0xCC, 0x82, 0xEB, 0x61, 0xCD, 0x30, 0xEF, 0x37, 0xCF, + 0xFF, 0xEE, 0x09, 0xD5, 0x46, 0xE6, 0xC5, 0xDC, 0xB0, 0xD8, 0xF0, 0xE0, + 0xA3, 0xD1, 0xC8, 0xE0, 0x2F, 0xCF, 0x38, 0xE0, 0x52, 0xCD, 0xB8, 0xE7, + 0xF5, 0xD0, 0x1A, 0xF3, 0xE2, 0xDA, 0x4B, 0xFB, 0xBD, 0xE3, 0x0D, 0x00, + 0x07, 0xEA, 0x73, 0x01, 0xE3, 0xEF, 0xE3, 0xFF, 0x75, 0xF2, 0xAB, 0xFB, + 0xF5, 0xF2, 0xAE, 0xF4, 0x79, 0xF6, 0x64, 0xF0, 0xBF, 0xFF, 0x13, 0xF0, + 0xF7, 0x08, 0x8C, 0xEE, 0xAA, 0x0C, 0xDC, 0xEC, 0xEC, 0x0C, 0xC8, 0xEC, + 0xE6, 0x06, 0x88, 0xEA, 0x58, 0x02, 0x67, 0xEA, 0xC0, 0x00, 0x18, 0xEE, + 0x95, 0xF9, 0xE5, 0xF5, 0xCF, 0xF3, 0x44, 0x04, 0x93, 0xF8, 0x1E, 0x10, + 0xD0, 0x07, 0x0B, 0x15, 0x19, 0x15, 0x56, 0x16, 0x37, 0x1A, 0xC2, 0x15, + 0xDA, 0x18, 0x86, 0x11, 0xDA, 0x12, 0x71, 0x0C, 0x29, 0x0F, 0x96, 0x10, + 0x01, 0x11, 0xAE, 0x1A, 0xDD, 0x18, 0xB8, 0x21, 0x07, 0x20, 0xA5, 0x21, + 0x75, 0x21, 0xBD, 0x1D, 0x5F, 0x22, 0xC3, 0x1A, 0xB4, 0x24, 0x99, 0x17, + 0x6F, 0x26, 0xD9, 0x16, 0x18, 0x23, 0xE1, 0x14, 0x24, 0x1C, 0x80, 0x10, + 0x63, 0x17, 0xF1, 0x0D, 0x77, 0x14, 0xF9, 0x0A, 0x7B, 0x11, 0xCA, 0x08, + 0x0D, 0x0C, 0x1F, 0x09, 0xF2, 0x07, 0x6D, 0x0A, 0xD1, 0x0D, 0xB4, 0x0C, + 0x17, 0x16, 0x4F, 0x11, 0x86, 0x14, 0x47, 0x16, 0xE5, 0x10, 0xC4, 0x18, + 0x57, 0x11, 0x86, 0x19, 0xD0, 0x12, 0x64, 0x18, 0x05, 0x17, 0x37, 0x15, + 0xEA, 0x1A, 0x12, 0x12, 0x87, 0x19, 0x4E, 0x10, 0xF1, 0x13, 0xED, 0x0D, + 0xD7, 0x0E, 0xE8, 0x09, 0x75, 0x0D, 0xA0, 0x06, 0xEA, 0x0A, 0x06, 0x08, + 0x0B, 0x04, 0x57, 0x0C, 0x8D, 0xFC, 0xC8, 0x0D, 0x55, 0xF9, 0x16, 0x0E, + 0x66, 0xFD, 0x75, 0x0F, 0x32, 0x04, 0x61, 0x10, 0x6B, 0x0A, 0x5A, 0x13, + 0xAD, 0x12, 0x68, 0x17, 0xE9, 0x1C, 0xD2, 0x18, 0xD5, 0x22, 0xF1, 0x17, + 0xDF, 0x16, 0x33, 0x11, 0x53, 0x00, 0x4D, 0x07, 0x9A, 0xF7, 0xF0, 0x01, + 0x91, 0xFA, 0xB5, 0x00, 0x25, 0xFC, 0xD4, 0xFF, 0x4A, 0xF8, 0x00, 0xFB, + 0x6A, 0xF2, 0xD3, 0xF3, 0x0E, 0xF1, 0xD8, 0xE8, 0x13, 0xF4, 0xBE, 0xD9, + 0xC8, 0xF7, 0x4F, 0xD4, 0xBB, 0xFB, 0x04, 0xDE, 0x3B, 0xFF, 0x8D, 0xE7, + 0x62, 0x00, 0xC6, 0xE8, 0x3F, 0x01, 0xEF, 0xE9, 0x1F, 0x04, 0xA3, 0xEC, + 0x5A, 0x03, 0xA8, 0xEE, 0x44, 0xFC, 0x63, 0xF5, 0xB7, 0xF6, 0xA5, 0x00, + 0xBB, 0xF6, 0x40, 0x06, 0xE2, 0xF9, 0xFC, 0x03, 0xC7, 0xFB, 0xE8, 0xFB, + 0xAC, 0xF9, 0x65, 0xF1, 0xD5, 0xF7, 0xDD, 0xEF, 0x63, 0xF9, 0xC8, 0xF8, + 0x91, 0xFC, 0x9E, 0x01, 0xB8, 0xFD, 0x8A, 0x01, 0x31, 0xFD, 0xB7, 0xF9, + 0xA7, 0xFC, 0x5F, 0xF0, 0x25, 0xF8, 0x80, 0xE8, 0xE7, 0xF3, 0xF9, 0xE7, + 0xDC, 0xF5, 0xBA, 0xEC, 0xF4, 0xF8, 0x67, 0xEE, 0x3F, 0xFD, 0x71, 0xEE, + 0x71, 0x02, 0x5C, 0xED, 0xD6, 0x03, 0x52, 0xE8, 0xB3, 0x02, 0x9B, 0xE1, + 0x70, 0xFE, 0x29, 0xDE, 0xC2, 0xF6, 0x98, 0xDE, 0xB8, 0xF2, 0x17, 0xE0, + 0x1D, 0xF4, 0xA1, 0xDF, 0x0B, 0xF3, 0xEB, 0xDE, 0xD0, 0xEA, 0xCA, 0xE3, + 0x2A, 0xE5, 0x1D, 0xED, 0xE3, 0xEE, 0x08, 0xF4, 0xFE, 0xFA, 0x87, 0xF6, + 0x8F, 0xF8, 0x63, 0xF5, 0xA2, 0xED, 0x28, 0xF1, 0x45, 0xE5, 0xBB, 0xEE, + 0xD2, 0xE0, 0xFE, 0xF0, 0xC0, 0xDB, 0x10, 0xF9, 0x8A, 0xD6, 0x20, 0x04, + 0xA8, 0xD4, 0xEF, 0x0A, 0xDF, 0xD6, 0xBA, 0x0A, 0x53, 0xDD, 0x5A, 0x04, + 0xEF, 0xE4, 0x2F, 0xFB, 0xDA, 0xE9, 0xC2, 0xF5, 0x37, 0xED, 0xFE, 0xF6, + 0x56, 0xF3, 0x4D, 0xFB, 0xDD, 0xFB, 0x98, 0xFB, 0xFA, 0x02, 0x82, 0xF5, + 0xD2, 0x01, 0xBB, 0xEA, 0x56, 0xF3, 0x17, 0xDC, 0xE7, 0xE3, 0xAF, 0xD4, + 0x43, 0xE3, 0xF8, 0xD6, 0x7B, 0xF0, 0x37, 0xDA, 0xA6, 0xFD, 0x23, 0xE1, + 0x43, 0x02, 0x5D, 0xE9, 0x00, 0x02, 0x32, 0xEE, 0x5B, 0x01, 0x42, 0xF1, + 0xC8, 0x00, 0x7A, 0xF4, 0xBA, 0xFB, 0xC3, 0xF9, 0x18, 0xF7, 0xEB, 0x02, + 0xC9, 0xFD, 0x9B, 0x0A, 0x58, 0x0B, 0xF3, 0x0A, 0x72, 0x13, 0xB5, 0x0A, + 0x6B, 0x0F, 0x5F, 0x0D, 0xF4, 0x05, 0xC6, 0x12, 0xB4, 0x00, 0xE4, 0x1B, + 0x39, 0xFD, 0x87, 0x20, 0x1D, 0xFC, 0xBE, 0x1D, 0x3F, 0x03, 0x60, 0x18, + 0x6B, 0x0D, 0xC1, 0x11, 0xC7, 0x12, 0xAE, 0x0B, 0x19, 0x12, 0x3D, 0x0B, + 0x58, 0x10, 0xC2, 0x10, 0xA6, 0x0F, 0x45, 0x18, 0xD4, 0x0E, 0xB5, 0x1E, + 0xA9, 0x12, 0xB7, 0x21, 0x5F, 0x19, 0x69, 0x1F, 0x30, 0x1C, 0x3C, 0x17, + 0x72, 0x16, 0x1F, 0x10, 0x13, 0x0B, 0xAF, 0x10, 0x95, 0x07, 0x76, 0x17, + 0x9C, 0x0F, 0x9A, 0x1D, 0x40, 0x18, 0x7D, 0x20, 0x34, 0x18, 0x0D, 0x21, + 0xCE, 0x14, 0x16, 0x19, 0x92, 0x18, 0xB7, 0x0C, 0x1D, 0x1D, 0x16, 0x09, + 0xEC, 0x15, 0x56, 0x0F, 0xA4, 0x0B, 0xAC, 0x14, 0x67, 0x0C, 0x40, 0x0F, + 0x9F, 0x12, 0x23, 0x05, 0xBE, 0x13, 0x6F, 0xFF, 0x0F, 0x11, 0x25, 0xFD, + 0x3E, 0x0F, 0xE8, 0xFC, 0x86, 0x0C, 0xC0, 0xFC, 0x7B, 0x09, 0x70, 0xFD, + 0x1D, 0x0A, 0xF0, 0x03, 0xE6, 0x10, 0x7A, 0x08, 0x93, 0x1B, 0xA9, 0x04, + 0xEE, 0x1D, 0x86, 0x04, 0x58, 0x13, 0x97, 0x0C, 0x9E, 0x07, 0xEA, 0x10, + 0xA1, 0xFF, 0x22, 0x0C, 0x88, 0xF8, 0xD0, 0x03, 0x96, 0xF3, 0x05, 0xF9, + 0xC0, 0xF3, 0xF7, 0xF1, 0xDA, 0xF3, 0x5D, 0xF6, 0xCE, 0xEF, 0x7E, 0xFF, + 0x54, 0xEF, 0xE1, 0x02, 0x21, 0xF9, 0x16, 0x03, 0x7D, 0x08, 0xA2, 0x06, + 0xDB, 0x13, 0x58, 0x09, 0xFD, 0x18, 0xFC, 0x0A, 0xB7, 0x19, 0xE2, 0x0D, + 0x2F, 0x1A, 0xAA, 0x0E, 0xE6, 0x1C, 0x24, 0x10, 0x3F, 0x1D, 0xB9, 0x18, + 0xF8, 0x17, 0xB9, 0x25, 0xCC, 0x13, 0x56, 0x2D, 0x75, 0x14, 0x47, 0x2F, + 0xD4, 0x13, 0x84, 0x33, 0x5B, 0x0F, 0xF8, 0x37, 0x1C, 0x10, 0x95, 0x39, + 0xE4, 0x1B, 0x1D, 0x3A, 0x19, 0x29, 0x85, 0x39, 0x60, 0x2D, 0xE9, 0x39, + 0x05, 0x2A, 0x75, 0x3B, 0x52, 0x25, 0xD0, 0x37, 0x17, 0x23, 0x2A, 0x31, + 0xC4, 0x27, 0xDA, 0x30, 0x73, 0x32, 0x1C, 0x32, 0xC5, 0x37, 0x47, 0x33, + 0x20, 0x2E, 0xC6, 0x38, 0xAF, 0x1A, 0xF6, 0x40, 0x3F, 0x0E, 0x32, 0x43, + 0x0C, 0x11, 0xF8, 0x3A, 0x33, 0x1B, 0xAD, 0x32, 0xCA, 0x25, 0x16, 0x2A, + 0x44, 0x2E, 0xFF, 0x1C, 0x12, 0x30, 0x98, 0x12, 0xC4, 0x28, 0x55, 0x0D, + 0x7B, 0x1D, 0x41, 0x09, 0x7C, 0x1B, 0x4B, 0x05, 0x61, 0x24, 0x02, 0x02, + 0x77, 0x26, 0xB8, 0x00, 0x0F, 0x1A, 0x58, 0x05, 0x4D, 0x0C, 0x42, 0x0F, + 0xC8, 0x03, 0x36, 0x15, 0x7F, 0xFE, 0xA5, 0x11, 0x3D, 0x00, 0x75, 0x0D, + 0xFC, 0x0D, 0x9F, 0x0E, 0x7D, 0x20, 0x3F, 0x0F, 0x8E, 0x29, 0x0C, 0x0D, + 0xF9, 0x25, 0x08, 0x09, 0x0B, 0x19, 0x5D, 0x05, 0x05, 0x08, 0x96, 0x03, + 0xF8, 0xF3, 0x21, 0x01, 0xB9, 0xE1, 0x71, 0xFD, 0xD2, 0xDA, 0xE9, 0xFA, + 0xE0, 0xDD, 0x63, 0xF9, 0xC2, 0xE4, 0x23, 0xFA, 0x7F, 0xE6, 0xA0, 0xFE, + 0x53, 0xE3, 0xB5, 0x04, 0xB7, 0xE6, 0x9D, 0x07, 0x17, 0xEE, 0x9C, 0x01, + 0x30, 0xF4, 0xE0, 0xFA, 0xB6, 0xFE, 0x92, 0xFB, 0x36, 0x0A, 0x62, 0xFB, + 0xAD, 0x0E, 0x9A, 0xF5, 0xD4, 0x0D, 0x54, 0xEF, 0x19, 0x0A, 0x17, 0xEC, + 0x56, 0x03, 0xF7, 0xEB, 0xA7, 0xFA, 0xA6, 0xED, 0x59, 0xF3, 0xE5, 0xF0, + 0xBA, 0xF0, 0x76, 0xF4, 0x72, 0xF2, 0xB2, 0xF6, 0x04, 0xF4, 0x9E, 0xF6, + 0x69, 0xF2, 0xCC, 0xF2, 0x19, 0xEF, 0x11, 0xEB, 0x57, 0xEC, 0x1A, 0xE3, + 0x22, 0xED, 0x64, 0xE0, 0xAE, 0xEE, 0x9A, 0xE0, 0x2E, 0xEB, 0x08, 0xE1, + 0x68, 0xE8, 0x0B, 0xE3, 0x3F, 0xE6, 0x34, 0xE4, 0x9B, 0xDF, 0x71, 0xE4, + 0xEA, 0xD9, 0x7F, 0xE4, 0x6E, 0xD6, 0x55, 0xE6, 0x6F, 0xD7, 0x5A, 0xEA, + 0x9B, 0xE2, 0x39, 0xEE, 0x78, 0xF1, 0x20, 0xF3, 0x96, 0xF8, 0xF6, 0xF4, + 0x57, 0xF7, 0x0C, 0xEF, 0x95, 0xF1, 0xFF, 0xE8, 0xA0, 0xE8, 0x11, 0xE8, + 0xC8, 0xE1, 0x5A, 0xE8, 0xC4, 0xE3, 0xDF, 0xE6, 0x90, 0xE8, 0xEA, 0xE4, + 0x16, 0xE5, 0x11, 0xE8, 0x85, 0xD8, 0xFD, 0xED, 0xEC, 0xD2, 0xE0, 0xF3, + 0x5E, 0xDC, 0x74, 0xFA, 0x3D, 0xE2, 0x11, 0x00, 0xED, 0xE1, 0x00, 0x03, + 0x35, 0xEC, 0xA5, 0x00, 0xB0, 0xFB, 0xFD, 0xF8, 0x53, 0x03, 0x6B, 0xF2, + 0x75, 0x04, 0xBE, 0xF0, 0xDE, 0x02, 0x6F, 0xF4, 0x34, 0x02, 0x43, 0xFD, + 0x7F, 0x01, 0x60, 0x01, 0x3F, 0xFC, 0x1A, 0xFD, 0xC6, 0xF8, 0xBA, 0xF6, + 0x7D, 0xFA, 0xCC, 0xF2, 0xCE, 0xF6, 0xE7, 0xF0, 0xCC, 0xED, 0xD2, 0xEE, + 0x13, 0xEC, 0xED, 0xF0, 0xBE, 0xF5, 0xDB, 0xF8, 0xE2, 0x02, 0xAD, 0x03, + 0xB0, 0x0C, 0xC7, 0x0D, 0xB6, 0x17, 0x01, 0x13, 0xC3, 0x20, 0xB8, 0x12, + 0x15, 0x1D, 0xC2, 0x11, 0x6B, 0x11, 0xF1, 0x11, 0x67, 0x0D, 0x18, 0x12, + 0x3D, 0x15, 0x38, 0x13, 0x7F, 0x1D, 0xB6, 0x11, 0xA3, 0x1E, 0x8F, 0x0E, + 0xF9, 0x19, 0x21, 0x0F, 0xA9, 0x17, 0x81, 0x11, 0x3A, 0x1A, 0xF7, 0x10, + 0x81, 0x1D, 0x8B, 0x0E, 0x4B, 0x20, 0x37, 0x0E, 0xF5, 0x1E, 0xC5, 0x0F, + 0x82, 0x18, 0x04, 0x11, 0x70, 0x13, 0x98, 0x12, 0x88, 0x13, 0x48, 0x13, + 0xBF, 0x15, 0xF8, 0x13, 0x9E, 0x15, 0xE9, 0x16, 0x50, 0x10, 0x50, 0x19, + 0x50, 0x09, 0x7A, 0x17, 0xF3, 0x07, 0xAC, 0x0E, 0xF6, 0x07, 0xB4, 0x01, + 0x85, 0x06, 0xD3, 0xF8, 0xBE, 0x0A, 0xEA, 0xF4, 0xD0, 0x10, 0x1F, 0xF1, + 0x21, 0x12, 0xC0, 0xEE, 0x2D, 0x0C, 0x6E, 0xF0, 0xB1, 0xFF, 0xEB, 0xF6, + 0x2C, 0xF6, 0xE9, 0xFD, 0xEC, 0xFA, 0xE2, 0xFF, 0x7F, 0x09, 0xCF, 0x01, + 0x96, 0x0E, 0xB3, 0x04, 0xBA, 0x05, 0xEA, 0x04, 0x3E, 0xF9, 0xE5, 0x02, + 0xEA, 0xED, 0x12, 0xFD, 0xAA, 0xE7, 0x3D, 0xF7, 0xAC, 0xEA, 0x4B, 0xF9, + 0x2C, 0xF4, 0xD5, 0x00, 0x58, 0xFA, 0xD3, 0x02, 0x8C, 0xF9, 0x5A, 0x01, + 0xB7, 0xF7, 0x05, 0x03, 0x2F, 0xF5, 0x93, 0x02, 0x32, 0xF1, 0xC3, 0xFE, + 0x2D, 0xED, 0x8C, 0xFD, 0xDE, 0xE9, 0x4B, 0x00, 0x17, 0xEC, 0xB8, 0xFE, + 0xF8, 0xF1, 0xB4, 0xF5, 0x6C, 0xF2, 0xCC, 0xED, 0xD6, 0xED, 0x95, 0xEA, + 0xFB, 0xEB, 0x65, 0xE9, 0x29, 0xEF, 0x75, 0xEA, 0x1A, 0xF2, 0xCA, 0xEC, + 0x87, 0xF4, 0x15, 0xF0, 0xFA, 0xFB, 0x7E, 0xF5, 0x30, 0x02, 0xEC, 0xF8, + 0x7C, 0xFD, 0x40, 0xF9, 0x56, 0xF5, 0xB9, 0xF9, 0xDE, 0xF4, 0xD4, 0xFC, + 0x94, 0xFB, 0xCF, 0x00, 0x13, 0x02, 0xC1, 0xFE, 0x4E, 0x04, 0xC1, 0xF4, + 0x78, 0x03, 0xDE, 0xE9, 0xED, 0xFE, 0x1C, 0xE7, 0x15, 0xF9, 0x09, 0xEC, + 0xF3, 0xF4, 0xEE, 0xF0, 0xC5, 0xF2, 0x17, 0xF6, 0xF9, 0xF0, 0xBF, 0xFB, + 0xC1, 0xE6, 0x45, 0xFC, 0xA7, 0xDB, 0x1A, 0xFD, 0x48, 0xDE, 0x3B, 0x02, + 0xEE, 0xE6, 0x8D, 0x01, 0xDA, 0xF0, 0x4A, 0xF7, 0x82, 0xFB, 0x0C, 0xE9, + 0xB1, 0xFE, 0x7D, 0xDC, 0xB9, 0xFA, 0x05, 0xD3, 0x4A, 0xF7, 0xD0, 0xCC, + 0x21, 0xF4, 0x2D, 0xC8, 0xF4, 0xEF, 0xC0, 0xC6, 0x11, 0xEC, 0x43, 0xC8, + 0x7F, 0xE8, 0xB8, 0xC6, 0xB8, 0xE6, 0xF0, 0xC5, 0x3E, 0xE8, 0xFA, 0xCC, + 0x01, 0xEE, 0xCA, 0xD9, 0xD9, 0xF6, 0x30, 0xE6, 0x08, 0xFE, 0x22, 0xF0, + 0x54, 0x00, 0x4B, 0xF4, 0x73, 0xFC, 0x40, 0xF2, 0x16, 0xF0, 0xA3, 0xF3, + 0x20, 0xDD, 0x0F, 0xF9, 0x26, 0xCD, 0x98, 0xFA, 0xED, 0xC9, 0x05, 0xF9, + 0x95, 0xD2, 0x0A, 0xF7, 0x7C, 0xDA, 0xD3, 0xF4, 0x34, 0xD7, 0x9B, 0xF1, + 0xAA, 0xCD, 0xBA, 0xEC, 0x35, 0xC7, 0xE9, 0xE9, 0x35, 0xC7, 0x4F, 0xEC, + 0x41, 0xD0, 0xAF, 0xF2, 0x9C, 0xE1, 0x7B, 0xF5, 0x88, 0xF3, 0xC2, 0xED, + 0x9B, 0xFE, 0xA4, 0xDF, 0x0D, 0xFF, 0xFC, 0xD2, 0x91, 0xF4, 0xE8, 0xCB, + 0x20, 0xE8, 0x54, 0xCD, 0xEE, 0xE4, 0x02, 0xD3, 0x75, 0xEA, 0x84, 0xD3, + 0xD6, 0xF4, 0x28, 0xD0, 0xA6, 0xFD, 0xCB, 0xCD, 0x88, 0xFA, 0x09, 0xD0, + 0xFC, 0xEC, 0xE4, 0xD8, 0x0D, 0xE1, 0xE7, 0xE4, 0xEB, 0xE4, 0xED, 0xEE, + 0xDF, 0xF4, 0x8E, 0xF6, 0xCD, 0xFD, 0xF2, 0xFB, 0x80, 0x00, 0x01, 0xF8, + 0x16, 0x05, 0x26, 0xF2, 0x39, 0x04, 0x4F, 0xF8, 0xE1, 0xFC, 0xA4, 0x03, + 0xD8, 0xF9, 0x0B, 0x0A, 0x99, 0xFB, 0xFD, 0x0C, 0x34, 0xFC, 0x4F, 0x0D, + 0x2E, 0xFA, 0xDD, 0x0B, 0x16, 0xF4, 0x6A, 0x0E, 0x62, 0xEA, 0x0C, 0x16, + 0xDB, 0xE7, 0x30, 0x1F, 0xB5, 0xF2, 0x02, 0x23, 0x54, 0x03, 0xED, 0x1E, + 0x4A, 0x10, 0x47, 0x1A, 0x02, 0x13, 0x4D, 0x18, 0x9B, 0x0D, 0x27, 0x14, + 0x54, 0x0A, 0xF5, 0x0D, 0x86, 0x0E, 0x4B, 0x09, 0xB7, 0x11, 0xF1, 0x07, + 0x35, 0x0A, 0x5A, 0x08, 0xAE, 0x01, 0x02, 0x05, 0x50, 0x02, 0x16, 0xFF, + 0x25, 0x05, 0x75, 0xFF, 0xC3, 0x09, 0xDD, 0x07, 0xDA, 0x10, 0x2D, 0x12, + 0x73, 0x12, 0xE1, 0x19, 0x71, 0x10, 0x57, 0x1B, 0xFC, 0x0D, 0x28, 0x13, + 0xC3, 0x07, 0x01, 0x07, 0x55, 0x03, 0xFE, 0x02, 0x87, 0x09, 0x2C, 0x02, + 0x81, 0x11, 0x08, 0xFD, 0x2D, 0x10, 0xF7, 0xF9, 0x53, 0x08, 0x92, 0xF8, + 0xB6, 0x00, 0x18, 0xF5, 0x90, 0xFC, 0xFE, 0xF2, 0x6B, 0xF8, 0x10, 0xF6, + 0x65, 0xF6, 0x43, 0xFD, 0x69, 0xFD, 0xA2, 0x03, 0x32, 0x0A, 0xEA, 0x06, + 0xA2, 0x13, 0xAE, 0x04, 0xFE, 0x14, 0xF4, 0xF8, 0xD6, 0x0D, 0x68, 0xED, + 0x9D, 0x00, 0x93, 0xEB, 0xC2, 0xF2, 0x5B, 0xEF, 0xC9, 0xF0, 0x06, 0xF6, + 0x69, 0x03, 0x82, 0xFB, 0xF5, 0x14, 0x01, 0xFB, 0x74, 0x13, 0xDC, 0xFC, + 0x57, 0x0C, 0xAC, 0x04, 0x26, 0x0D, 0x69, 0x0C, 0xB8, 0x15, 0x05, 0x13, + 0x9A, 0x1F, 0xF0, 0x16, 0xA7, 0x28, 0xC9, 0x19, 0x30, 0x2F, 0xFA, 0x1C, + 0x1B, 0x2E, 0xDC, 0x1C, 0x0A, 0x22, 0xAC, 0x1C, 0xF1, 0x0F, 0x01, 0x25, + 0xEA, 0x04, 0x96, 0x31, 0xC0, 0x05, 0x01, 0x35, 0x02, 0x0C, 0x45, 0x2E, + 0xC2, 0x10, 0xAA, 0x27, 0xBD, 0x0D, 0xA7, 0x24, 0x8C, 0x06, 0x3D, 0x23, + 0x74, 0x06, 0x0D, 0x20, 0xBA, 0x12, 0xC5, 0x1B, 0x6C, 0x2A, 0x92, 0x1B, + 0x16, 0x40, 0x54, 0x1E, 0xFC, 0x43, 0xF7, 0x24, 0xAC, 0x38, 0xE6, 0x2D, + 0xC2, 0x2E, 0xCA, 0x2F, 0xAD, 0x2B, 0xAD, 0x28, 0xF4, 0x24, 0x3E, 0x22, + 0x60, 0x18, 0x8E, 0x1D, 0xB9, 0x11, 0x80, 0x16, 0x50, 0x17, 0xC5, 0x13, + 0xCD, 0x1B, 0x35, 0x18, 0x3C, 0x14, 0x75, 0x1F, 0x5B, 0x0E, 0x36, 0x23, + 0x52, 0x15, 0xCB, 0x1F, 0x15, 0x20, 0x2F, 0x18, 0x94, 0x25, 0x85, 0x13, + 0x49, 0x23, 0xD4, 0x14, 0xED, 0x1B, 0x9E, 0x17, 0xB8, 0x14, 0xF6, 0x17, + 0x84, 0x10, 0x09, 0x18, 0x27, 0x11, 0x23, 0x1B, 0x37, 0x12, 0x29, 0x20, + 0x8C, 0x0E, 0xCD, 0x21, 0x83, 0x0A, 0x37, 0x1B, 0xE8, 0x06, 0xC7, 0x11, + 0x6E, 0x02, 0xB0, 0x0E, 0xDE, 0xFE, 0x55, 0x0E, 0xC9, 0xFF, 0xB8, 0x0A, + 0xA2, 0x05, 0x9E, 0x07, 0x54, 0x06, 0x42, 0x06, 0xDB, 0xFE, 0x0D, 0x06, + 0x9F, 0xF3, 0x7E, 0x05, 0x59, 0xE8, 0x26, 0xFD, 0x8E, 0xE6, 0x65, 0xF2, + 0x18, 0xF1, 0xC2, 0xEE, 0x57, 0xFD, 0x54, 0xEF, 0xF9, 0xFC, 0xC3, 0xEF, + 0x56, 0xEF, 0x81, 0xEF, 0x95, 0xE5, 0xA8, 0xF2, 0x66, 0xEA, 0x88, 0xFB, + 0x2A, 0xF8, 0xAC, 0x07, 0xB9, 0x06, 0x8E, 0x10, 0x48, 0x0E, 0x4A, 0x11, + 0xC6, 0x0C, 0x40, 0x0D, 0x52, 0x06, 0xCB, 0x04, 0xFD, 0xFF, 0xE6, 0xF9, + 0x05, 0xFD, 0x41, 0xF0, 0xBE, 0xFB, 0x85, 0xE8, 0x93, 0xFA, 0x78, 0xE5, + 0xDD, 0xF6, 0x1D, 0xE5, 0xEA, 0xEF, 0x62, 0xE5, 0x05, 0xE5, 0x54, 0xE5, + 0x7A, 0xD7, 0x6E, 0xE2, 0xDA, 0xD3, 0x82, 0xDC, 0x04, 0xE0, 0x3F, 0xD7, + 0x8A, 0xF2, 0xD8, 0xD8, 0x4B, 0xFC, 0xEF, 0xE0, 0x82, 0xF9, 0x00, 0xE6, + 0xCD, 0xF6, 0x1D, 0xE5, 0x9B, 0xF8, 0x62, 0xE4, 0xEB, 0xF5, 0xCF, 0xE1, + 0xB1, 0xEC, 0x8F, 0xE1, 0x89, 0xE4, 0x1E, 0xE7, 0xCD, 0xE3, 0x69, 0xE9, + 0x01, 0xE8, 0x46, 0xE8, 0x89, 0xE9, 0x8F, 0xE8, 0x41, 0xE6, 0xE1, 0xEA, + 0x27, 0xE2, 0x32, 0xEC, 0xB0, 0xDF, 0x59, 0xEC, 0x07, 0xDD, 0xEF, 0xEF, + 0x32, 0xDB, 0xCC, 0xF7, 0x43, 0xDD, 0x65, 0x00, 0x1F, 0xE3, 0x38, 0x03, + 0xDB, 0xE7, 0x09, 0xFD, 0x5C, 0xEB, 0xF4, 0xF3, 0x03, 0xF5, 0x71, 0xEE, + 0x7E, 0xFE, 0x49, 0xED, 0x89, 0xFD, 0xE6, 0xF1, 0x45, 0xF7, 0x70, 0xF7, + 0xAD, 0xF4, 0xBC, 0xF9, 0x8F, 0xF6, 0x4E, 0xFE, 0xB1, 0xF9, 0x86, 0x04, + 0xC4, 0x00, 0x08, 0x06, 0x52, 0x0E, 0xE2, 0x02, 0x67, 0x19, 0x69, 0xFD, + 0x66, 0x18, 0xBD, 0xFA, 0x2D, 0x10, 0xEB, 0x01, 0xF6, 0x09, 0xC1, 0x0B, + 0x21, 0x0E, 0xF7, 0x0F, 0x7A, 0x1B, 0x76, 0x0E, 0xC2, 0x20, 0xFA, 0x0A, + 0x61, 0x19, 0xCA, 0x12, 0xF1, 0x10, 0x18, 0x23, 0x1A, 0x0F, 0x08, 0x2D, + 0x85, 0x13, 0x9B, 0x33, 0x5F, 0x1D, 0x46, 0x3C, 0x41, 0x27, 0xDB, 0x43, + 0xFB, 0x26, 0x0F, 0x47, 0xAC, 0x22, 0x4A, 0x48, 0x55, 0x26, 0x8D, 0x49, + 0x42, 0x30, 0x42, 0x47, 0xCE, 0x39, 0x8D, 0x42, 0xB7, 0x3B, 0x31, 0x3C, + 0x01, 0x37, 0xFC, 0x31, 0xE9, 0x32, 0xFF, 0x28, 0x6E, 0x2D, 0x02, 0x28, + 0xFA, 0x21, 0x10, 0x2A, 0x2F, 0x18, 0x45, 0x25, 0xF3, 0x1A, 0x35, 0x1F, + 0x46, 0x24, 0x4E, 0x23, 0x66, 0x29, 0x3D, 0x2D, 0xFA, 0x2E, 0x55, 0x33, + 0x3E, 0x38, 0x2B, 0x31, 0x19, 0x3D, 0x90, 0x26, 0xDD, 0x37, 0x79, 0x1C, + 0xCF, 0x2B, 0x98, 0x19, 0xDC, 0x22, 0xD4, 0x19, 0xF3, 0x1F, 0xC0, 0x18, + 0x1F, 0x1E, 0x7B, 0x16, 0xB8, 0x1A, 0xED, 0x15, 0xB8, 0x12, 0xBC, 0x16, + 0xE4, 0x09, 0xE7, 0x14, 0x5D, 0x05, 0xC1, 0x11, 0x99, 0x06, 0xAD, 0x12, + 0xC0, 0x10, 0x6C, 0x18, 0x10, 0x1E, 0xE1, 0x1D, 0x60, 0x22, 0x81, 0x1E, + 0x91, 0x1E, 0xF3, 0x1B, 0x7C, 0x1D, 0xFE, 0x18, 0x98, 0x1F, 0xDE, 0x17, + 0x6D, 0x1D, 0xF2, 0x18, 0x5A, 0x13, 0xEB, 0x17, 0x52, 0x07, 0x46, 0x14, + 0xAD, 0x03, 0x38, 0x0F, 0xDB, 0x04, 0xEB, 0x09, 0x90, 0x03, 0xC9, 0x08, + 0x62, 0x04, 0xAA, 0x09, 0xDC, 0x03, 0x2B, 0x05, 0x1E, 0xFF, 0x31, 0xFF, + 0xB9, 0xFF, 0x87, 0x00, 0x83, 0x04, 0x6A, 0x09, 0xDE, 0x07, 0x42, 0x0E, + 0xA9, 0x0A, 0xB2, 0x05, 0x15, 0x08, 0xEE, 0xF8, 0xED, 0xFE, 0x82, 0xF3, + 0x46, 0xF5, 0x68, 0xF7, 0x77, 0xEB, 0xE6, 0xFC, 0x0E, 0xE4, 0xC3, 0xFE, + 0xC0, 0xE9, 0xFB, 0x00, 0x41, 0xFA, 0x74, 0xFF, 0xBD, 0x02, 0xB2, 0xF6, + 0x38, 0xFE, 0x24, 0xEC, 0xEB, 0xF8, 0x10, 0xE4, 0x37, 0xFC, 0x91, 0xE2, + 0x64, 0x07, 0x2B, 0xE5, 0x22, 0x0F, 0x3E, 0xE8, 0x31, 0x0A, 0xE3, 0xED, + 0xD4, 0xFB, 0x2B, 0xF3, 0x07, 0xEB, 0x14, 0xF1, 0x41, 0xE0, 0x58, 0xE9, + 0xEF, 0xDC, 0x1F, 0xE8, 0x44, 0xDC, 0xDE, 0xED, 0x3F, 0xDF, 0x45, 0xF1, + 0x32, 0xE5, 0xF8, 0xF0, 0x7C, 0xE9, 0x2A, 0xED, 0x9B, 0xED, 0x80, 0xE7, + 0x20, 0xF0, 0xBF, 0xE0, 0x4A, 0xEF, 0xC5, 0xD8, 0x30, 0xF0, 0x16, 0xD3, + 0x0B, 0xF3, 0x02, 0xD2, 0xCB, 0xF3, 0xFD, 0xD2, 0x12, 0xED, 0x20, 0xD4, + 0x15, 0xE2, 0x59, 0xD5, 0x28, 0xE4, 0xE7, 0xD6, 0xBA, 0xED, 0xBC, 0xD9, + 0xB0, 0xE9, 0x36, 0xE0, 0x92, 0xD8, 0x70, 0xE8, 0x65, 0xCA, 0x0E, 0xEB, + 0x3E, 0xD1, 0x27, 0xE9, 0xD9, 0xDF, 0x46, 0xE6, 0xBB, 0xE2, 0x19, 0xEA, + 0xC5, 0xD5, 0xBA, 0xF3, 0x9F, 0xCA, 0xF0, 0xF8, 0x1F, 0xCE, 0xF8, 0xF2, + 0x66, 0xCF, 0xCF, 0xE4, 0x93, 0xCB, 0xA0, 0xDC, 0x52, 0xCA, 0x92, 0xDF, + 0x0F, 0xC8, 0x01, 0xE2, 0x0C, 0xC7, 0x0B, 0xE0, 0x21, 0xD5, 0x75, 0xE5, + 0x0E, 0xE0, 0x21, 0xEB, 0x46, 0xDB, 0x2D, 0xE9, 0x92, 0xD6, 0xD0, 0xE3, + 0x2D, 0xD4, 0x99, 0xDC, 0x27, 0xDA, 0x0D, 0xDC, 0xB8, 0xE6, 0x41, 0xE0, + 0x18, 0xEB, 0xB2, 0xD8, 0xF4, 0xEA, 0x46, 0xC9, 0xD2, 0xF0, 0x78, 0xC0, + 0xB8, 0xED, 0xB3, 0xBA, 0xC1, 0xE6, 0xF3, 0xC1, 0x45, 0xE8, 0x6F, 0xD5, + 0x5C, 0xE7, 0x53, 0xDB, 0xAE, 0xF4, 0x2D, 0xDC, 0x01, 0xFF, 0x2A, 0xDD, + 0xDF, 0xF1, 0x93, 0xD8, 0x88, 0xEB, 0xFB, 0xDA, 0x91, 0xF1, 0xD5, 0xE0, + 0xF6, 0xF8, 0x30, 0xE1, 0x21, 0x03, 0x29, 0xE8, 0x73, 0x06, 0x27, 0xF3, + 0xB9, 0xFC, 0xD8, 0xF7, 0x99, 0xF0, 0xEA, 0xF4, 0x22, 0xE5, 0x44, 0xF0, + 0x58, 0xE9, 0x48, 0xF6, 0x70, 0xF2, 0x57, 0xFA, 0xD6, 0xF6, 0x34, 0x0C, + 0xF2, 0xF9, 0xD1, 0x15, 0xD1, 0xF3, 0x8E, 0x0B, 0xCA, 0xF3, 0xFA, 0x0E, + 0x2B, 0xF3, 0x32, 0x0C, 0x28, 0xF0, 0x2F, 0x08, 0x9E, 0xEC, 0xC7, 0x00, + 0x46, 0xF5, 0xE7, 0xF9, 0x73, 0x08, 0x6D, 0x00, 0xF8, 0xFD, 0x81, 0xFF, + 0x69, 0xE9, 0x51, 0xF1, 0x9A, 0xF3, 0x5F, 0xF0, 0xB9, 0x04, 0x41, 0xF4, + 0xF4, 0x04, 0x9C, 0xEF, 0x71, 0x04, 0xDA, 0xFC, 0x3B, 0x09, 0x1A, 0x0C, + 0x52, 0x0A, 0xFA, 0x08, 0x6C, 0x07, 0x48, 0x01, 0xAB, 0xFF, 0x8F, 0xF8, + 0xCB, 0xF7, 0x5A, 0xEF, 0xEE, 0xFC, 0x28, 0xF5, 0x64, 0x04, 0x15, 0x01, + 0x49, 0x06, 0xBF, 0x00, 0x62, 0x0A, 0x86, 0xFD, 0xD3, 0x00, 0x9D, 0xEE, + 0xDE, 0xF4, 0x4B, 0xE4, 0x46, 0xF5, 0xB8, 0xEC, 0x2A, 0xF4, 0x8C, 0xED, + 0xAF, 0xFF, 0x00, 0xF0, 0x4E, 0x09, 0x5D, 0xF6, 0x8A, 0xFF, 0xF9, 0xF6, + 0xD9, 0xF4, 0xAF, 0xF4, 0xFF, 0xF0, 0xBD, 0xF2, 0xC4, 0xFB, 0x52, 0x00, + 0x38, 0xFD, 0x7F, 0x0B, 0x35, 0xF8, 0x25, 0x0A, 0x6E, 0xF8, 0x46, 0x08, + 0xAA, 0xF0, 0x88, 0x03, 0xC6, 0xED, 0x0A, 0x00, 0x98, 0xF1, 0x21, 0xFD, + 0x77, 0xFE, 0xB9, 0xFD, 0xD4, 0x0A, 0x90, 0xFD, 0x82, 0x19, 0x1F, 0xFF, + 0x3F, 0x24, 0x21, 0x03, 0x81, 0x1A, 0xC9, 0x00, 0x7C, 0x09, 0xE2, 0xFD, + 0x83, 0xFF, 0xF5, 0x00, 0x75, 0x01, 0x3C, 0x07, 0x85, 0x10, 0x20, 0x13, + 0x9F, 0x0B, 0x72, 0x14, 0xE0, 0x02, 0x1D, 0x18, 0x29, 0x06, 0x0A, 0x1F, + 0xC7, 0xFF, 0xA9, 0x15, 0xBE, 0x07, 0x38, 0x15, 0xEF, 0x0E, 0xB4, 0x18, + 0xA4, 0x13, 0x4A, 0x1F, 0xF0, 0x20, 0x10, 0x27, 0x9F, 0x27, 0xD3, 0x25, + 0xD4, 0x1F, 0xF2, 0x1B, 0x86, 0x18, 0x9D, 0x15, 0x24, 0x12, 0x09, 0x14, + 0x21, 0x0E, 0x62, 0x12, 0x71, 0x16, 0xAE, 0x14, 0x1E, 0x21, 0xDA, 0x1F, + 0xED, 0x21, 0x28, 0x25, 0xCE, 0x20, 0xAA, 0x18, 0xF1, 0x1B, 0xA4, 0x0D, + 0x23, 0x13, 0x88, 0x0B, 0x96, 0x14, 0x25, 0x11, 0x4D, 0x17, 0x3A, 0x11, + 0x19, 0x1A, 0x3D, 0x0C, 0x1A, 0x25, 0x04, 0x0A, 0xCA, 0x27, 0xA2, 0xFF, + 0x66, 0x1B, 0xFB, 0xF9, 0x73, 0x0F, 0x13, 0x01, 0x95, 0xFE, 0x26, 0x07, + 0x08, 0xF9, 0xA8, 0x13, 0x64, 0xFF, 0xD3, 0x1B, 0x8D, 0x04, 0x94, 0x19, + 0xB3, 0x07, 0x5F, 0x12, 0x13, 0x00, 0xE6, 0x01, 0x49, 0x00, 0x87, 0xFF, + 0x31, 0x04, 0x09, 0x02, 0xF7, 0x06, 0x85, 0xFE, 0x23, 0x04, 0x33, 0xFE, + 0x60, 0xFC, 0x2C, 0xFC, 0x64, 0xF6, 0x07, 0xF5, 0x4B, 0xEC, 0xBC, 0xED, + 0x33, 0xE5, 0x4B, 0xEC, 0xB2, 0xE3, 0x3A, 0xE9, 0x8A, 0xE5, 0x16, 0xE4, + 0xA7, 0xED, 0x3E, 0xE6, 0x5F, 0xF8, 0x7B, 0xEC, 0xDA, 0xF4, 0xA2, 0xF0, + 0x97, 0xEF, 0xCC, 0xF3, 0x60, 0xF2, 0x2B, 0xF3, 0x5E, 0xF7, 0xEC, 0xF8, + 0x41, 0xF6, 0x94, 0xFF, 0xE1, 0xF7, 0x9A, 0x04, 0x1A, 0xFA, 0x4C, 0x02, + 0xA8, 0xF8, 0x98, 0xF5, 0xE2, 0xFE, 0x78, 0xEC, 0x33, 0x07, 0x3F, 0xEE, + 0x8C, 0x01, 0x64, 0xF6, 0xE5, 0xF1, 0x0E, 0xF9, 0x32, 0xE3, 0xEF, 0xEE, + 0x9E, 0xE3, 0x39, 0xEA, 0xC7, 0xE6, 0x17, 0xEC, 0x63, 0xE0, 0x8E, 0xE7, + 0x96, 0xE4, 0x5D, 0xED, 0x85, 0xE6, 0xDF, 0xF4, 0xE2, 0xE5, 0x5C, 0xF4, + 0xBB, 0xEA, 0x0F, 0xF1, 0x62, 0xEC, 0x96, 0xEA, 0xC4, 0xE9, 0x84, 0xE6, + 0x63, 0xE3, 0x14, 0xE2, 0xF7, 0xEA, 0xA7, 0xE9, 0xD5, 0xEE, 0x09, 0xF0, + 0xF2, 0xE6, 0x45, 0xEB, 0xD8, 0xE7, 0x69, 0xE9, 0x05, 0xE6, 0xC8, 0xE3, + 0x89, 0xE8, 0x8B, 0xE1, 0xAE, 0xF3, 0xD5, 0xE2, 0xB3, 0xFB, 0x8A, 0xE6, + 0x81, 0xF6, 0x63, 0xE7, 0x7C, 0xEB, 0x2A, 0xE2, 0x20, 0xEE, 0x60, 0xE5, + 0x59, 0xF3, 0xD8, 0xEE, 0x3A, 0xED, 0xBC, 0xF5, 0xEC, 0xE7, 0x33, 0x00, + 0x81, 0xE7, 0xFA, 0x0A, 0xB1, 0xE8, 0x60, 0x0A, 0x2E, 0xEB, 0x09, 0x04, + 0x6F, 0xEA, 0x80, 0x00, 0xD7, 0xEC, 0xAA, 0x03, 0x78, 0xF6, 0xBE, 0x04, + 0xDB, 0xFD, 0x60, 0x00, 0xF1, 0xFF, 0xC3, 0xF9, 0x55, 0x05, 0x83, 0xEF, + 0x7E, 0x0F, 0x9A, 0xED, 0xF3, 0x16, 0x9D, 0xF4, 0xAC, 0x1C, 0x54, 0xFA, + 0x11, 0x25, 0x11, 0xFF, 0x5C, 0x20, 0x78, 0x01, 0x37, 0x19, 0x84, 0x09, + 0xAC, 0x13, 0xF0, 0x0B, 0xD6, 0x19, 0xE4, 0x0D, 0x34, 0x27, 0x93, 0x15, + 0x2D, 0x27, 0x4C, 0x1D, 0xB2, 0x20, 0xB5, 0x23, 0x65, 0x16, 0x15, 0x21, + 0x54, 0x12, 0x26, 0x22, 0x06, 0x18, 0x48, 0x2C, 0xC0, 0x1A, 0x69, 0x30, + 0x61, 0x15, 0x20, 0x2D, 0xAE, 0x2E, 0x5E, 0x3E, 0x6F, 0x3A, 0xB8, 0x3B, + 0x0C, 0x2D, 0xD8, 0x30, 0x48, 0x2B, 0xC7, 0x40, 0xFC, 0x1F, 0x48, 0x43, + 0x65, 0x10, 0x81, 0x3A, 0xD8, 0x1B, 0xB4, 0x3D, 0x9C, 0x36, 0xDC, 0x41, + 0x04, 0x34, 0xFC, 0x32, 0x65, 0x26, 0x70, 0x26, 0xD7, 0x19, 0x36, 0x1C, + 0x86, 0x09, 0xC5, 0x0B, 0xCD, 0x11, 0x2E, 0x0D, 0x1F, 0x24, 0x43, 0x11, + 0x81, 0x2F, 0xF4, 0x16, 0xD8, 0x3B, 0xB6, 0x20, 0x4B, 0x3D, 0x30, 0x17, + 0x55, 0x3F, 0xA1, 0x14, 0x36, 0x39, 0x28, 0x1D, 0xA3, 0x23, 0x2F, 0x1D, + 0x5D, 0x1B, 0xAF, 0x1F, 0x29, 0x20, 0x45, 0x23, 0xD3, 0x17, 0x65, 0x1A, + 0x79, 0x08, 0xD3, 0x10, 0x05, 0x02, 0x59, 0x0D, 0xD3, 0x04, 0x8E, 0x10, + 0x1B, 0x0A, 0x55, 0x17, 0x8B, 0x14, 0x9D, 0x20, 0x01, 0x1C, 0x07, 0x28, + 0xC8, 0x19, 0xDD, 0x24, 0xDD, 0x15, 0x0B, 0x19, 0x67, 0x15, 0x29, 0x15, + 0x81, 0x10, 0xF6, 0x1E, 0x9E, 0x0C, 0x75, 0x30, 0x57, 0x10, 0x69, 0x3C, + 0x81, 0x0E, 0xF5, 0x35, 0xF3, 0x09, 0x12, 0x26, 0xCF, 0x05, 0x12, 0x15, + 0xC3, 0xFF, 0xC3, 0x09, 0x58, 0xF4, 0x99, 0x01, 0x94, 0xF4, 0x5B, 0x04, + 0x8B, 0xFF, 0xDF, 0x06, 0x2F, 0x04, 0x46, 0xFE, 0xB3, 0x0F, 0xA7, 0xFD, + 0xC2, 0x0D, 0x8C, 0xF8, 0x50, 0x0A, 0x0E, 0xFB, 0x5B, 0x13, 0x97, 0x09, + 0x68, 0x17, 0xC2, 0x10, 0xD3, 0x17, 0x63, 0x1B, 0x99, 0x0B, 0x64, 0x19, + 0xDF, 0x03, 0x19, 0x06, 0x20, 0x08, 0x5E, 0xFA, 0xB4, 0x0C, 0x58, 0xF9, + 0x92, 0x0F, 0xDF, 0x00, 0x26, 0x0B, 0x1E, 0x05, 0x7B, 0x01, 0x56, 0x02, + 0x5C, 0xF9, 0x0B, 0xFA, 0x76, 0xFD, 0x33, 0xF8, 0x1B, 0x03, 0x3E, 0xFD, + 0x6E, 0x05, 0x0F, 0x01, 0x58, 0x09, 0xD4, 0x0A, 0xC5, 0x05, 0x29, 0x0E, + 0x9C, 0x00, 0xD7, 0x0A, 0x33, 0xF6, 0xC7, 0x03, 0x72, 0xEC, 0x33, 0xFB, + 0xE5, 0xE6, 0xE9, 0xF2, 0x68, 0xEC, 0xB8, 0xEF, 0x2F, 0xF9, 0x67, 0xE9, + 0xFB, 0x03, 0xB9, 0xE0, 0x7C, 0x02, 0x8F, 0xDC, 0x2F, 0xF8, 0xA9, 0xD4, + 0x4D, 0xFF, 0x52, 0xD7, 0x42, 0x01, 0xE5, 0xE0, 0x03, 0xFC, 0xB5, 0xEC, + 0x35, 0x02, 0x83, 0xF5, 0x73, 0x00, 0xCD, 0xED, 0x35, 0xF5, 0x77, 0xE2, + 0xB9, 0xEA, 0xC9, 0xDE, 0xE3, 0xE0, 0xB6, 0xE4, 0x40, 0xDA, 0x5B, 0xE9, + 0xE1, 0xD7, 0xFC, 0xEA, 0x62, 0xDF, 0x56, 0xFB, 0x24, 0xE0, 0x86, 0x06, + 0x2E, 0xE0, 0xF5, 0x05, 0x09, 0xE4, 0xA7, 0x02, 0x03, 0xE5, 0x00, 0x00, + 0x0C, 0xEA, 0x4E, 0x00, 0x6A, 0xEC, 0xEE, 0xFF, 0xCF, 0xF1, 0x0A, 0x09, + 0x16, 0xE2, 0x10, 0x00, 0x8D, 0xCB, 0x3F, 0xEB, 0xAD, 0xD5, 0xA1, 0xE8, + 0x91, 0xDD, 0x14, 0xE8, 0xF3, 0xDD, 0xD9, 0xE7, 0x3F, 0xE7, 0xF2, 0xEB, + 0x92, 0xEA, 0x73, 0xEA, 0xB0, 0xE9, 0x0E, 0xE2, 0xF7, 0xF1, 0x24, 0xDD, + 0xBB, 0xFC, 0x3C, 0xDF, 0xBF, 0xFA, 0x5B, 0xE4, 0xD7, 0xFF, 0xBD, 0xEC, + 0x67, 0x08, 0x06, 0xF1, 0x35, 0xFE, 0xEC, 0xEC, 0x4A, 0xF3, 0xF5, 0xE7, + 0x2B, 0xF3, 0x99, 0xE1, 0xE2, 0xF5, 0x13, 0xDE, 0x8C, 0xFC, 0xAC, 0xE5, + 0x29, 0xFD, 0x20, 0xEC, 0x48, 0xF4, 0x5A, 0xEC, 0x44, 0xEA, 0xBA, 0xEC, + 0x1A, 0xE0, 0x21, 0xEB, 0x7D, 0xE8, 0x6D, 0xF0, 0x16, 0xF4, 0x61, 0xFC, + 0xFF, 0xF6, 0x8E, 0x04, 0x31, 0xF7, 0x35, 0x0A, 0x25, 0xF5, 0xB9, 0x0F, + 0x21, 0xED, 0xBF, 0x0D, 0x84, 0xE0, 0xB6, 0x09, 0x14, 0xDD, 0x0E, 0x06, + 0xE5, 0xE6, 0xBE, 0x07, 0x03, 0xF7, 0xFF, 0x0A, 0xEA, 0x06, 0x20, 0x0A, + 0xA1, 0x0C, 0xB1, 0x04, 0x9A, 0x07, 0xC5, 0xFA, 0x3F, 0x04, 0x08, 0xF7, + 0x9E, 0x07, 0xA0, 0xF8, 0x9D, 0x09, 0x26, 0xFC, 0x3F, 0x03, 0xC4, 0x02, + 0x49, 0x04, 0x0F, 0x11, 0xE6, 0xFE, 0x3A, 0x16, 0xE5, 0xF1, 0x90, 0x0C, + 0x8E, 0xF5, 0xD9, 0x06, 0x88, 0x01, 0x07, 0x0B, 0xB2, 0x02, 0x0E, 0x0C, + 0x7F, 0x04, 0xBD, 0x0C, 0x94, 0x0E, 0xF7, 0x11, 0x77, 0x0B, 0x13, 0x09, + 0x78, 0x05, 0x65, 0xF8, 0x5C, 0x0C, 0x47, 0xF2, 0xD8, 0x12, 0x03, 0xF9, + 0x3B, 0x13, 0xBF, 0x03, 0x53, 0x12, 0xAD, 0x07, 0x7C, 0x0A, 0x97, 0x04, + 0x63, 0xFE, 0x1A, 0xF9, 0x19, 0xF7, 0x81, 0xE8, 0x44, 0xFE, 0x9F, 0xE2, + 0x46, 0x01, 0xD0, 0xE1, 0x4E, 0xFC, 0x1C, 0xE4, 0x56, 0xFB, 0x23, 0xEA, + 0x16, 0xF8, 0xB8, 0xEE, 0x8A, 0xF7, 0x7A, 0xEB, 0x57, 0xF5, 0x12, 0xE5, + 0xB6, 0xF5, 0x61, 0xE9, 0xCF, 0xF1, 0x16, 0xEF, 0x86, 0xED, 0x99, 0xF7, + 0xBB, 0xED, 0x0C, 0xFF, 0xBC, 0xE8, 0x88, 0xFE, 0x7D, 0xE6, 0xEE, 0xF9, + 0xE5, 0xEF, 0x12, 0xFE, 0x95, 0x03, 0xFF, 0x0A, 0x2F, 0x13, 0x01, 0x0F, + 0xC3, 0x13, 0xCA, 0x0A, 0x32, 0x10, 0xD7, 0x06, 0x78, 0x04, 0x9E, 0xFB, + 0x79, 0xF6, 0xDD, 0xED, 0x47, 0xF9, 0x83, 0xF0, 0x73, 0xFD, 0xE2, 0xF8, + 0x77, 0x02, 0x57, 0xFE, 0xEC, 0x00, 0x04, 0x03, 0xD3, 0xF9, 0xF6, 0x08, + 0x9B, 0xF3, 0x24, 0x0A, 0x4C, 0xF3, 0x45, 0x0B, 0x27, 0x02, 0x5D, 0x17, + 0x45, 0x0A, 0x1E, 0x1E, 0x41, 0x11, 0xCA, 0x1B, 0x98, 0x1C, 0x22, 0x19, + 0x58, 0x1C, 0x4A, 0x18, 0xCE, 0x0E, 0x9D, 0x12, 0x3D, 0x0A, 0x4B, 0x0A, + 0x25, 0x1C, 0x6C, 0x10, 0x93, 0x20, 0xEF, 0x12, 0xC0, 0x17, 0xE9, 0x0A, + 0x54, 0x19, 0xA7, 0x0A, 0x48, 0x14, 0x05, 0x09, 0xAE, 0x06, 0xB3, 0x06, + 0x0B, 0x03, 0x97, 0x08, 0xB5, 0x0C, 0xF1, 0x11, 0x75, 0x17, 0x84, 0x20, + 0x4D, 0x12, 0x59, 0x23, 0x1F, 0x0C, 0xA1, 0x1C, 0x95, 0x0E, 0x2C, 0x11, + 0x66, 0x08, 0xCF, 0x0A, 0x7D, 0xFA, 0x04, 0x0B, 0x5F, 0xF7, 0x1D, 0x0F, + 0xAF, 0xFD, 0x79, 0x10, 0xBA, 0xFF, 0x9F, 0x05, 0xD4, 0x05, 0x63, 0x01, + 0x8A, 0x07, 0x8C, 0xFF, 0x91, 0x07, 0xC5, 0xF7, 0x7D, 0x16, 0x92, 0xFB, + 0x91, 0x28, 0x2E, 0x09, 0x21, 0x29, 0x5E, 0x0E, 0x60, 0x13, 0x97, 0x04, + 0x4F, 0xFE, 0x10, 0xFA, 0x29, 0xF7, 0x77, 0xF7, 0xB4, 0xF3, 0xB6, 0xF2, + 0x3F, 0xF5, 0x2C, 0xF1, 0xB3, 0x00, 0xDE, 0xF6, 0x30, 0xF8, 0xD1, 0xF0, + 0x99, 0xDB, 0x73, 0xE3, 0x3F, 0xD3, 0xA3, 0xE2, 0xCF, 0xD8, 0xC6, 0xE8, + 0x32, 0xE2, 0x07, 0xEF, 0x44, 0xF3, 0xD4, 0xF5, 0x27, 0x00, 0xF9, 0xF6, + 0xFF, 0x02, 0x4B, 0xF2, 0xC7, 0xFD, 0xC0, 0xEF, 0x9C, 0xEF, 0x7E, 0xEB, + 0x2F, 0xEA, 0x8E, 0xED, 0xD9, 0xF2, 0x2C, 0xF5, 0x86, 0xF4, 0x84, 0xF1, + 0x43, 0xF4, 0xDA, 0xE7, 0x50, 0xF3, 0x42, 0xDE, 0xD2, 0xE4, 0x42, 0xD1, + 0x4B, 0xDB, 0x1D, 0xCF, 0xBC, 0xDB, 0x97, 0xDB, 0x80, 0xE1, 0xC4, 0xE7, + 0xA0, 0xEF, 0x89, 0xF2, 0x95, 0xF5, 0x11, 0xF5, 0x19, 0xEF, 0x34, 0xF0, + 0x87, 0xE4, 0xA5, 0xE8, 0x26, 0xDA, 0x0E, 0xDE, 0x64, 0xD2, 0x5D, 0xD5, + 0xF9, 0xCE, 0xE0, 0xD0, 0x1E, 0xCA, 0x73, 0xCD, 0xDE, 0xCD, 0x72, 0xD1, + 0x54, 0xD5, 0xA6, 0xD5, 0x13, 0xD0, 0xF3, 0xD0, 0x23, 0xCF, 0xC0, 0xD1, + 0xDC, 0xD8, 0x0E, 0xD8, 0x1A, 0xE5, 0xBF, 0xDA, 0xC8, 0xF0, 0x75, 0xD8, + 0x55, 0xEF, 0x4D, 0xD6, 0x27, 0xE4, 0xEC, 0xD7, 0xCA, 0xDD, 0x56, 0xDB, + 0xEA, 0xD6, 0x47, 0xDD, 0x0C, 0xD1, 0xFC, 0xE0, 0x13, 0xD3, 0xB0, 0xE9, + 0xFA, 0xD2, 0xD5, 0xEC, 0x38, 0xD0, 0xC3, 0xE7, 0xB2, 0xD9, 0xAB, 0xE7, + 0xB3, 0xE1, 0xDA, 0xE4, 0xEB, 0xE9, 0xFE, 0xDF, 0xA4, 0xFA, 0x0F, 0xE5, + 0x7F, 0x00, 0x62, 0xEC, 0xBE, 0x04, 0x08, 0xF8, 0xB1, 0x05, 0xAF, 0xFA, + 0x25, 0x07, 0x96, 0xFA, 0xC6, 0x15, 0x8A, 0x01, 0xA8, 0x22, 0xB3, 0x01, + 0x65, 0x24, 0xD0, 0x01, 0x0E, 0x1F, 0x9A, 0x03, 0x33, 0x12, 0xBE, 0x00, + 0xF4, 0xFD, 0x03, 0xFC, 0x0B, 0xF9, 0xE9, 0x03, 0xC6, 0x00, 0xDD, 0x11, + 0xC5, 0x09, 0xBD, 0x18, 0x8E, 0x1D, 0xB6, 0x20, 0xE4, 0x24, 0xA0, 0x26, + 0xBE, 0x14, 0x11, 0x23, 0xE5, 0x07, 0x11, 0x21, 0xDF, 0x05, 0x18, 0x25, + 0xD6, 0x0D, 0x1B, 0x23, 0x98, 0x17, 0x7C, 0x1C, 0xD3, 0x18, 0xA1, 0x18, + 0xEA, 0x17, 0x27, 0x1A, 0xE6, 0x0E, 0xF2, 0x1A, 0xD4, 0x05, 0x15, 0x1B, + 0x3F, 0x09, 0x38, 0x21, 0x32, 0x1A, 0xED, 0x2A, 0x19, 0x2C, 0xF3, 0x35, + 0xD7, 0x31, 0x1B, 0x38, 0xAF, 0x32, 0x67, 0x2F, 0x67, 0x2D, 0x0C, 0x2D, + 0x3E, 0x2E, 0x66, 0x35, 0xAC, 0x32, 0x42, 0x3B, 0x4A, 0x32, 0x64, 0x3C, + 0x83, 0x2F, 0x94, 0x2F, 0x39, 0x2F, 0xE2, 0x1A, 0xDD, 0x30, 0x1E, 0x10, + 0x1F, 0x2F, 0x17, 0x0D, 0x9B, 0x28, 0x43, 0x0B, 0xAA, 0x20, 0xC0, 0x11, + 0xD9, 0x24, 0x49, 0x1C, 0x31, 0x29, 0x00, 0x1B, 0xA1, 0x24, 0x1D, 0x17, + 0x16, 0x23, 0xE0, 0x17, 0x12, 0x21, 0x5C, 0x17, 0x0D, 0x1C, 0xD6, 0x17, + 0x06, 0x17, 0x69, 0x1A, 0x80, 0x16, 0x15, 0x1C, 0x00, 0x19, 0x39, 0x1B, + 0xDE, 0x15, 0x77, 0x13, 0x91, 0x11, 0xB4, 0x0C, 0xF4, 0x06, 0x7A, 0x0F, + 0xAB, 0xFB, 0x11, 0x1B, 0x93, 0x02, 0x4B, 0x27, 0xA7, 0x11, 0x2F, 0x2D, + 0xCE, 0x16, 0x54, 0x2E, 0xB0, 0x11, 0x58, 0x24, 0x53, 0x12, 0x73, 0x1E, + 0x87, 0x13, 0xDA, 0x25, 0x93, 0x11, 0x60, 0x2D, 0x34, 0x1A, 0x22, 0x31, + 0xED, 0x20, 0x0D, 0x2D, 0xC9, 0x15, 0x75, 0x20, 0x79, 0x02, 0xAF, 0x0C, + 0x5C, 0xFC, 0xF6, 0xFD, 0x18, 0x04, 0x15, 0x03, 0x33, 0x0F, 0x64, 0x13, + 0xD2, 0x21, 0x17, 0x22, 0xEB, 0x32, 0x7B, 0x26, 0xF5, 0x37, 0x67, 0x1D, + 0xC5, 0x2D, 0x4F, 0x0B, 0x80, 0x1D, 0xE7, 0x00, 0x55, 0x19, 0xF9, 0x01, + 0xEC, 0x1A, 0x00, 0x03, 0xF9, 0x14, 0xD1, 0x03, 0xAF, 0x08, 0x0E, 0x00, + 0xFA, 0xF9, 0x86, 0xF3, 0x04, 0xE9, 0x3C, 0xDD, 0x09, 0xDA, 0xF2, 0xD1, + 0xE7, 0xCD, 0xBA, 0xD9, 0x27, 0xCE, 0xB6, 0xDF, 0x1C, 0xDC, 0xE8, 0xDF, + 0x28, 0xE2, 0x42, 0xDC, 0x8B, 0xDF, 0x5B, 0xDA, 0x60, 0xDC, 0xBA, 0xDE, + 0x30, 0xDB, 0x15, 0xEA, 0x13, 0xDE, 0xC3, 0xF3, 0x31, 0xDF, 0xD0, 0xF3, + 0xAB, 0xE1, 0x5E, 0xF3, 0x51, 0xE6, 0x34, 0xF2, 0x64, 0xEB, 0xB7, 0xE8, + 0xD7, 0xEC, 0x9B, 0xDA, 0xAD, 0xEB, 0xAB, 0xD5, 0xEC, 0xF7, 0xAA, 0xE0, + 0xA7, 0x03, 0x96, 0xED, 0xC9, 0x05, 0xC4, 0xF4, 0xB5, 0x0B, 0x99, 0xF5, + 0x43, 0x0E, 0xE0, 0xF1, 0xB4, 0x07, 0xF7, 0xEF, 0x0D, 0xFA, 0x90, 0xE9, + 0x29, 0xEB, 0x6D, 0xE4, 0x50, 0xED, 0x18, 0xE8, 0x93, 0xF4, 0x3D, 0xEF, + 0xD6, 0xEE, 0xFB, 0xF8, 0x90, 0xE4, 0xA9, 0xFD, 0x42, 0xDC, 0x35, 0xFE, + 0x8F, 0xD7, 0xC0, 0xFF, 0x48, 0xD9, 0x40, 0x07, 0x25, 0xE1, 0xB4, 0x11, + 0x76, 0xE7, 0x28, 0x12, 0x54, 0xED, 0xBF, 0x0F, 0x89, 0xF0, 0x5E, 0x0E, + 0x1D, 0xEE, 0x4D, 0x09, 0xB3, 0xEE, 0x70, 0x08, 0x59, 0xF3, 0x93, 0x06, + 0xCE, 0xFE, 0xED, 0x00, 0x36, 0x05, 0x20, 0xFB, 0x1C, 0xFE, 0x4D, 0xF0, + 0xC3, 0xF8, 0x49, 0xE7, 0xF6, 0xF7, 0x56, 0xE6, 0xB4, 0xFE, 0x16, 0xEE, + 0x0A, 0x10, 0x06, 0xFB, 0xD1, 0x1F, 0x7E, 0x00, 0xC9, 0x1F, 0xA1, 0xF9, + 0x88, 0x14, 0xA3, 0xF3, 0x90, 0x0B, 0x3D, 0xF1, 0x0B, 0x0D, 0xAD, 0xF5, + 0x02, 0x18, 0x67, 0x03, 0x8F, 0x1F, 0xBE, 0x0C, 0xD5, 0x1D, 0x11, 0x0D, + 0xE7, 0x15, 0x58, 0x0B, 0x97, 0xFF, 0xBE, 0x04, 0x2B, 0xE4, 0x9A, 0xFD, + 0x96, 0xD9, 0xB8, 0xFE, 0xDF, 0xDD, 0x7B, 0x05, 0xEA, 0xE1, 0x1F, 0x05, + 0x46, 0xE6, 0x3B, 0x03, 0x4E, 0xE0, 0x22, 0x00, 0xC6, 0xD8, 0x18, 0xF2, + 0x93, 0xDB, 0x88, 0xE3, 0x19, 0xD0, 0xA6, 0xD7, 0xBB, 0xC7, 0x27, 0xD9, + 0xDC, 0xCB, 0x41, 0xD8, 0xA2, 0xCE, 0xF9, 0xCB, 0x9D, 0xD2, 0x44, 0xC8, + 0x0C, 0xD4, 0x34, 0xCA, 0x7A, 0xD7, 0x91, 0xD6, 0x7E, 0xDE, 0x43, 0xE6, + 0x10, 0xE4, 0xA8, 0xEF, 0x8B, 0xEA, 0xB3, 0xFB, 0xB6, 0xF5, 0x1B, 0x0B, + 0xFE, 0xFF, 0x87, 0x0B, 0xC3, 0x02, 0x37, 0xFC, 0x66, 0xFE, 0x49, 0xF3, + 0x00, 0xFB, 0x6B, 0xF8, 0x5A, 0xFF, 0x1A, 0x07, 0x9A, 0x0C, 0xD0, 0x13, + 0xA5, 0x16, 0xA7, 0x14, 0x24, 0x1B, 0x21, 0x10, 0xA5, 0x1D, 0x03, 0x0B, + 0x3B, 0x16, 0x5C, 0x06, 0xC6, 0x0B, 0x4C, 0x06, 0x53, 0x0C, 0xB8, 0x05, + 0xD0, 0x13, 0xDB, 0xFA, 0x6B, 0x15, 0x15, 0xF0, 0x38, 0x0E, 0xD5, 0xEE, + 0xB7, 0xFE, 0xB4, 0xEC, 0x3E, 0xF7, 0xD0, 0xEF, 0xD9, 0x03, 0x2C, 0xF8, + 0xA6, 0x12, 0x0C, 0xFE, 0x0A, 0x16, 0x1E, 0x06, 0x91, 0x0F, 0xF1, 0x0A, + 0xB3, 0x06, 0x0C, 0x0A, 0x51, 0xFB, 0xBB, 0x0A, 0x40, 0xF8, 0x5A, 0x12, + 0xC3, 0x0C, 0x88, 0x1D, 0x5B, 0x26, 0x22, 0x23, 0xA9, 0x31, 0x30, 0x20, + 0x95, 0x2B, 0xEE, 0x1B, 0xDC, 0x21, 0xBD, 0x18, 0x22, 0x20, 0xE8, 0x16, + 0xEE, 0x29, 0xC2, 0x1E, 0x30, 0x33, 0x87, 0x24, 0x86, 0x2F, 0xC7, 0x21, + 0xE8, 0x2A, 0xE7, 0x22, 0xC4, 0x21, 0x6A, 0x28, 0x51, 0x10, 0xC5, 0x29, + 0x4A, 0x07, 0xFE, 0x2B, 0xEF, 0x14, 0xAD, 0x34, 0xA9, 0x21, 0xE2, 0x36, + 0x9A, 0x1B, 0xD5, 0x30, 0xFC, 0x17, 0xDC, 0x29, 0x54, 0x1B, 0xB2, 0x1F, + 0x5F, 0x13, 0x1A, 0x0F, 0x60, 0x09, 0x2C, 0x0D, 0xE2, 0x08, 0x4D, 0x12, + 0xC6, 0x08, 0xFF, 0x0C, 0x46, 0x0B, 0x7E, 0x07, 0x49, 0x0A, 0x4C, 0xFD, + 0x4F, 0x02, 0xB4, 0xF4, 0x44, 0xF1, 0x4D, 0xE6, 0xBA, 0xE8, 0x71, 0xDB, + 0x82, 0xEB, 0xB7, 0xDC, 0xE9, 0xE5, 0x87, 0xDD, 0xC0, 0xE0, 0x62, 0xDE, + 0x6F, 0xDE, 0x91, 0xDF, 0x59, 0xD5, 0xEA, 0xE3, 0x9D, 0xCC, 0x06, 0xE9, + 0x61, 0xD3, 0xF0, 0xF1, 0x41, 0xE0, 0x2E, 0xF9, 0x42, 0xE8, 0xD5, 0x00, + 0x4E, 0xEF, 0xD3, 0x09, 0x99, 0xFE, 0x96, 0x14, 0xC6, 0x08, 0x73, 0x1B, + 0x39, 0x10, 0x09, 0x1F, 0xDC, 0x11, 0x8B, 0x1D, 0xA4, 0x0A, 0xDA, 0x14, + 0x40, 0x04, 0x31, 0x0B, 0x12, 0x05, 0xD9, 0x03, 0x7F, 0x0A, 0xE6, 0xFF, + 0x24, 0x09, 0x50, 0xF8, 0xB9, 0x07, 0xD9, 0xF1, 0x4A, 0x0F, 0xAC, 0xF3, + 0xCF, 0x19, 0xDE, 0xF2, 0x8B, 0x12, 0xD6, 0xE8, 0x40, 0x0B, 0x63, 0xE6, + 0x46, 0x03, 0xDE, 0xE4, 0x49, 0xF8, 0x42, 0xE2, 0x55, 0xFB, 0x46, 0xE6, + 0xF8, 0x02, 0x7E, 0xEE, 0x9B, 0x03, 0xD6, 0xF5, 0xFB, 0x00, 0x82, 0xF8, + 0xB2, 0x03, 0xE4, 0xF5, 0x6D, 0x05, 0xBD, 0xF2, 0x87, 0x08, 0x6F, 0xFB, + 0x33, 0x0D, 0x92, 0x0A, 0x19, 0x13, 0x28, 0x15, 0x61, 0x18, 0x3C, 0x15, + 0xB9, 0x14, 0xA4, 0x0D, 0xC5, 0x0A, 0xDF, 0x0C, 0x6A, 0xFC, 0x3F, 0x12, + 0x74, 0xF7, 0xBF, 0x11, 0x8E, 0x04, 0x73, 0x0F, 0x90, 0x0A, 0x16, 0x0B, + 0x3F, 0xFC, 0xEE, 0x02, 0xAB, 0xE9, 0xB8, 0xFC, 0x3F, 0xE5, 0xA9, 0xF6, + 0x60, 0xEA, 0x36, 0xF3, 0x84, 0xF2, 0xC6, 0xF9, 0xB3, 0x03, 0x95, 0x0A, + 0xAC, 0x0F, 0x20, 0x18, 0x91, 0x0C, 0xD6, 0x14, 0x77, 0x05, 0xE5, 0x02, + 0x1E, 0x00, 0x9A, 0xEE, 0x5F, 0xF5, 0x45, 0xE0, 0x97, 0xE4, 0x01, 0xD5, + 0xCE, 0xD2, 0xEF, 0xC8, 0x30, 0xC8, 0x43, 0xC1, 0xB7, 0xC2, 0x41, 0xB9, + 0x00, 0xBB, 0x58, 0xAC, 0x9E, 0xB1, 0x6C, 0xA3, 0x49, 0xA5, 0xC5, 0x9E, + 0xDE, 0xA4, 0x6D, 0xA0, 0x48, 0xA7, 0xF7, 0xAA, 0xAD, 0xA3, 0x46, 0xBB, + 0x15, 0xA4, 0x59, 0xC5, 0x7F, 0xA4, 0xE4, 0xC3, 0x10, 0xA8, 0xF6, 0xC4, + 0x9E, 0xA9, 0x39, 0xC9, 0xBF, 0xA9, 0x64, 0xCD, 0x45, 0xB3, 0x8E, 0xD2, + 0x90, 0xBD, 0x50, 0xCE, 0x10, 0xC3, 0x78, 0xC3, 0x78, 0xCA, 0xA7, 0xC2, + 0xB9, 0xD4, 0x98, 0xCF, 0x94, 0xE2, 0x76, 0xDF, 0xE9, 0xF5, 0x7A, 0xEB, + 0x8F, 0x09, 0x69, 0xF5, 0x18, 0x17, 0x55, 0xF8, 0x69, 0x1E, 0x81, 0xF7, + 0xC6, 0x1F, 0x98, 0xFA, 0x5F, 0x18, 0x78, 0xF6, 0xDD, 0x0E, 0xF8, 0xEE, + 0xD4, 0x09, 0xDE, 0xF0, 0x3F, 0x05, 0xAE, 0xF5, 0xA2, 0xFE, 0xE5, 0xF3, + 0xB0, 0xFB, 0x8D, 0xF1, 0xB5, 0xFE, 0x24, 0xFB, 0xA6, 0x03, 0x06, 0x0D, + 0x92, 0x0A, 0xDA, 0x1E, 0x29, 0x16, 0xF6, 0x2A, 0x5B, 0x26, 0x20, 0x32, + 0x09, 0x3C, 0xFF, 0x3F, 0x79, 0x45, 0xB1, 0x4F, 0x8B, 0x3C, 0xA6, 0x55, + 0x8C, 0x32, 0xE4, 0x4F, 0xEB, 0x2C, 0x2A, 0x49, 0xD8, 0x25, 0xA0, 0x44, + 0x3F, 0x1D, 0xB0, 0x3D, 0xD7, 0x1B, 0x84, 0x33, 0xE7, 0x2B, 0xF9, 0x2D, + 0xBB, 0x3E, 0x60, 0x2E, 0xC2, 0x44, 0xB4, 0x33, 0x60, 0x46, 0xF4, 0x3C, + 0xAE, 0x48, 0x52, 0x41, 0xF0, 0x4D, 0x25, 0x46, 0xD4, 0x55, 0x1D, 0x48, + 0x54, 0x5D, 0xEA, 0x40, 0x13, 0x5A, 0xC6, 0x2E, 0x1E, 0x4B, 0xC0, 0x1A, + 0x29, 0x39, 0xF3, 0x14, 0xE8, 0x29, 0xDA, 0x1B, 0xEB, 0x25, 0x16, 0x29, + 0x3F, 0x2A, 0xCC, 0x31, 0x60, 0x23, 0xF1, 0x25, 0xE6, 0x16, 0x68, 0x12, + 0xC8, 0x0F, 0x83, 0x07, 0xF7, 0x0A, 0x6B, 0x06, 0x97, 0x0B, 0xF6, 0x0C, + 0x9E, 0x0A, 0x84, 0x10, 0x3F, 0x07, 0x26, 0x0E, 0xED, 0xF6, 0x34, 0xFD, + 0xC7, 0xDD, 0x63, 0xE9, 0xA1, 0xCD, 0x1B, 0xE5, 0x7A, 0xBF, 0xD4, 0xE4, + 0x10, 0xB6, 0xF4, 0xE1, 0x24, 0xB8, 0x93, 0xDD, 0x7B, 0xC2, 0xDC, 0xD8, + 0x14, 0xCE, 0xF6, 0xD9, 0x8E, 0xDA, 0x45, 0xE3, 0xB5, 0xE8, 0x92, 0xF1, + 0xBC, 0xF3, 0xB4, 0xFB, 0xAD, 0xFF, 0xFB, 0x01, 0x79, 0x09, 0x7B, 0x0B, + 0xAB, 0x06, 0xDF, 0x10, 0x02, 0x01, 0x60, 0x15, 0x66, 0x03, 0x47, 0x18, + 0xBF, 0x07, 0x5C, 0x15, 0xDA, 0x02, 0x76, 0x14, 0x22, 0xF8, 0xD8, 0x13, + 0x93, 0xFB, 0x98, 0x14, 0x01, 0x0A, 0x68, 0x14, 0xCB, 0x13, 0xD2, 0x0A, + 0xED, 0x17, 0x37, 0xFA, 0x91, 0x1B, 0x82, 0xF3, 0x06, 0x1A, 0x3E, 0xF6, + 0x03, 0x13, 0xEF, 0xFB, 0x67, 0x0B, 0xB8, 0xFF, 0x13, 0x07, 0xEB, 0xFE, + 0x20, 0x01, 0x48, 0xFD, 0x15, 0xF9, 0x61, 0xF5, 0x84, 0xF9, 0xC6, 0xE9, + 0x49, 0xFF, 0x17, 0xE4, 0x71, 0x0A, 0x2D, 0xEE, 0xFA, 0x0E, 0x76, 0xFE, + 0x40, 0x0D, 0x03, 0x0D, 0x04, 0x13, 0x82, 0x18, 0x0F, 0x1C, 0x28, 0x1E, + 0xB9, 0x23, 0xA6, 0x27, 0xD1, 0x1F, 0x40, 0x2D, 0x81, 0x13, 0x2D, 0x23, + 0x60, 0x14, 0x17, 0x11, 0x40, 0x1D, 0xEB, 0x03, 0x97, 0x17, 0xDC, 0x03, + 0x36, 0x08, 0x31, 0x09, 0x40, 0x02, 0xBF, 0x09, 0x8B, 0x0B, 0x39, 0x08, + 0xE0, 0x15, 0xF3, 0x04, 0x2F, 0x17, 0x05, 0x01, 0x57, 0x0C, 0x13, 0xF6, + 0xEA, 0x00, 0xD4, 0xED, 0x62, 0xFD, 0x71, 0xF2, 0x7F, 0x02, 0x46, 0xFD, + 0x98, 0x0C, 0x81, 0x05, 0x63, 0x0E, 0x07, 0x06, 0x4A, 0x04, 0xDC, 0x01, + 0x20, 0xF6, 0x96, 0xFB, 0x69, 0xE4, 0x96, 0xEC, 0x9B, 0xD9, 0x63, 0xE0, + 0x8B, 0xD4, 0x25, 0xDB, 0x3F, 0xCB, 0x0A, 0xD2, 0xB4, 0xBF, 0x08, 0xC4, + 0xD2, 0xB1, 0x74, 0xB4, 0x19, 0xA5, 0x2A, 0xAD, 0x82, 0xA0, 0x79, 0xB1, + 0xF7, 0xA7, 0x83, 0xB9, 0x2A, 0xB1, 0xC5, 0xB9, 0xDD, 0xB6, 0x6E, 0xB6, + 0x76, 0xBB, 0xCF, 0xB7, 0x90, 0xC2, 0x79, 0xBE, 0xB8, 0xCB, 0xD6, 0xC5, + 0x0A, 0xD7, 0x7C, 0xD1, 0x58, 0xE0, 0x82, 0xE0, 0x6E, 0xE4, 0xE3, 0xEC, + 0x98, 0xE4, 0xE4, 0xF3, 0xD5, 0xE7, 0x82, 0xF5, 0x16, 0xF8, 0x45, 0xFA, + 0xEC, 0x08, 0xB7, 0x00, 0x0A, 0x0C, 0x69, 0xFF, 0xFB, 0x05, 0xA9, 0xFC, + 0xAC, 0xFA, 0xC0, 0xFC, 0xCF, 0xF8, 0xD2, 0x00, 0x98, 0x02, 0x96, 0x04, + 0x2B, 0x05, 0x4F, 0xFE, 0xD2, 0xF7, 0x19, 0xF1, 0x39, 0xE7, 0x15, 0xE9, + 0x02, 0xEB, 0x3F, 0xEC, 0x78, 0xF6, 0xA3, 0xF0, 0x12, 0xF3, 0x9F, 0xF2, + 0xF1, 0xEE, 0x31, 0xF7, 0x97, 0xF4, 0xF1, 0xFA, 0x4F, 0xF8, 0x50, 0xF9, + 0x89, 0xF7, 0x58, 0xFB, 0x94, 0xFB, 0x9E, 0x0B, 0xA3, 0x07, 0x5B, 0x20, + 0xD6, 0x14, 0xE7, 0x2C, 0x31, 0x21, 0x54, 0x36, 0x0E, 0x2D, 0x01, 0x3B, + 0xEB, 0x33, 0x8D, 0x39, 0x5B, 0x30, 0x35, 0x37, 0xDE, 0x25, 0x4F, 0x2E, + 0xF9, 0x1B, 0xCB, 0x1D, 0xEC, 0x1B, 0x91, 0x14, 0x39, 0x26, 0xE7, 0x18, + 0xB8, 0x28, 0x39, 0x1D, 0xC2, 0x1E, 0x95, 0x18, 0x6C, 0x15, 0x70, 0x11, + 0x6A, 0x15, 0x3D, 0x12, 0x41, 0x1B, 0x14, 0x1B, 0xB6, 0x1B, 0xD0, 0x24, + 0xE3, 0x16, 0xCB, 0x28, 0x7F, 0x16, 0xBB, 0x22, 0x72, 0x19, 0x3E, 0x1A, + 0x07, 0x1F, 0x17, 0x1C, 0xA1, 0x27, 0xD3, 0x20, 0x45, 0x31, 0xB1, 0x1D, + 0x3B, 0x38, 0xD1, 0x17, 0xC4, 0x30, 0x4A, 0x11, 0xAC, 0x16, 0xFB, 0x01, + 0xF4, 0xFC, 0x29, 0xEC, 0x2D, 0xEF, 0x65, 0xDA, 0x76, 0xE5, 0x0F, 0xD0, + 0xE5, 0xDB, 0x39, 0xCE, 0x02, 0xCE, 0xE8, 0xCB, 0xCC, 0xC5, 0xD6, 0xC9, + 0xC5, 0xC3, 0x1C, 0xCB, 0xFB, 0xC1, 0xF8, 0xC9, 0x26, 0xC3, 0xEB, 0xC9, + 0x8F, 0xC0, 0x46, 0xCE, 0x0E, 0xC2, 0x53, 0xD6, 0x5C, 0xD6, 0xFF, 0xDF, + 0xAA, 0xF2, 0x58, 0xE7, 0x18, 0x04, 0xED, 0xEF, 0x3A, 0x05, 0x9F, 0xFB, + 0xDD, 0xFE, 0xC3, 0x05, 0x1B, 0xFD, 0xE3, 0x07, 0xCD, 0x09, 0x19, 0x0A, + 0xD2, 0x19, 0xA2, 0x12, 0x27, 0x19, 0x02, 0x1B, 0x74, 0x0A, 0x4E, 0x18, + 0x71, 0xFE, 0x9E, 0x08, 0xFA, 0xFB, 0xC4, 0xFC, 0x70, 0x03, 0x33, 0xFE, + 0xE1, 0x15, 0x64, 0x07, 0xBF, 0x24, 0x2A, 0x08, 0x08, 0x23, 0x50, 0xFF, + 0x3B, 0x0E, 0x28, 0xF9, 0xA5, 0xFD, 0x25, 0x01, 0x22, 0xFA, 0x76, 0x0E, + 0xDE, 0xF0, 0x1A, 0x0B, 0xAD, 0xEA, 0x14, 0xFF, 0xA1, 0xF5, 0xD8, 0x01, + 0x32, 0x08, 0xB0, 0x10, 0xF9, 0x10, 0xA7, 0x18, 0x8B, 0x15, 0xE0, 0x1B, + 0xD3, 0x25, 0xC6, 0x28, 0x9F, 0x3A, 0x46, 0x3F, 0x1F, 0x45, 0x42, 0x50, + 0x3E, 0x45, 0xA2, 0x59, 0xD6, 0x41, 0xDD, 0x5A, 0x96, 0x40, 0xB5, 0x4E, + 0x2A, 0x3B, 0xAA, 0x3D, 0xA4, 0x29, 0xB1, 0x2C, 0xB0, 0x11, 0x4B, 0x23, + 0xCC, 0x0A, 0xD6, 0x25, 0x20, 0x1A, 0x70, 0x31, 0x56, 0x1C, 0x96, 0x34, + 0x2B, 0x16, 0x45, 0x27, 0x27, 0x13, 0x25, 0x1A, 0x71, 0x11, 0x6C, 0x15, + 0xCF, 0x16, 0xDD, 0x16, 0xB3, 0x20, 0xFB, 0x19, 0xD5, 0x2B, 0x68, 0x15, + 0x10, 0x2A, 0xA3, 0x0B, 0x5B, 0x27, 0xCD, 0x0B, 0xC9, 0x2F, 0xBB, 0x12, + 0x59, 0x2F, 0xF4, 0x15, 0xF2, 0x23, 0x9D, 0x11, 0xA3, 0x14, 0xB1, 0x06, + 0xD2, 0x00, 0xEE, 0xF6, 0xEA, 0xF2, 0x0C, 0xE7, 0xFB, 0xED, 0x24, 0xDF, + 0xB8, 0xEC, 0xCB, 0xE2, 0xD4, 0xE2, 0x40, 0xE5, 0x0D, 0xD7, 0x49, 0xDD, + 0x50, 0xD4, 0xE7, 0xCA, 0xBF, 0xD7, 0xE6, 0xBD, 0x50, 0xDC, 0x64, 0xC3, + 0xAD, 0xD8, 0x98, 0xCD, 0x6C, 0xD4, 0xC9, 0xD4, 0x8A, 0xC9, 0x97, 0xD0, + 0xFC, 0xC0, 0xC2, 0xD0, 0x67, 0xC2, 0x69, 0xDA, 0x6A, 0xC9, 0x67, 0xE5, + 0xBC, 0xD3, 0x9F, 0xF1, 0x26, 0xE0, 0xFA, 0xFF, 0xD9, 0xEE, 0x1E, 0x07, + 0x5C, 0xF9, 0xFD, 0xFD, 0xA7, 0xFD, 0x80, 0xF5, 0x73, 0xFC, 0x27, 0xFB, + 0x74, 0xFA, 0x3D, 0x07, 0x57, 0xF3, 0xF6, 0x06, 0xE8, 0xEE, 0x0E, 0x00, + 0x8F, 0xEA, 0xBC, 0xF3, 0xA2, 0xE1, 0x64, 0xE8, 0xE6, 0xDB, 0x41, 0xDD, + 0xA4, 0xD6, 0x3A, 0xCE, 0xD9, 0xC5, 0x55, 0xC1, 0xD8, 0xBB, 0x7F, 0xBF, + 0x49, 0xCD, 0xD4, 0xC8, 0x5D, 0xE1, 0x74, 0xC9, 0xF5, 0xE1, 0xDF, 0xBE, + 0x88, 0xDD, 0x94, 0xBC, 0xB0, 0xE5, 0x79, 0xCA, 0x99, 0xEF, 0x45, 0xD0, + 0x4D, 0xF3, 0x9C, 0xCD, 0x32, 0xF4, 0xD5, 0xD9, 0x4E, 0xF4, 0x23, 0xF2, + 0xBB, 0xF3, 0x30, 0x04, 0x23, 0xF1, 0xE3, 0x0B, 0xEB, 0xF1, 0xB4, 0x11, + 0xDC, 0xF0, 0x58, 0x0E, 0x78, 0xF3, 0x3C, 0x08, 0xAF, 0xF1, 0x39, 0x00, + 0x31, 0xE6, 0xF6, 0xF7, 0x89, 0xE1, 0x15, 0xF3, 0x4F, 0xEC, 0xF1, 0xF2, + 0x46, 0xF8, 0x90, 0xF4, 0x63, 0xF7, 0xF5, 0xEA, 0xA3, 0xFA, 0x92, 0xE4, + 0xA9, 0x06, 0xC7, 0xEA, 0x48, 0x16, 0x16, 0xF5, 0xF3, 0x16, 0x1D, 0xF9, + 0xF0, 0x02, 0x4B, 0xF6, 0xAE, 0xF1, 0x24, 0xF1, 0x73, 0xFC, 0x52, 0xFA, + 0x14, 0x1A, 0xE3, 0x12, 0x40, 0x35, 0xEA, 0x2E, 0x54, 0x40, 0x40, 0x37, + 0x2B, 0x3B, 0x07, 0x28, 0x87, 0x2C, 0xDB, 0x18, 0xA9, 0x19, 0x91, 0x10, + 0xEF, 0x0F, 0x82, 0x0D, 0x3A, 0x0D, 0x1E, 0x0A, 0x26, 0x0A, 0xE7, 0x05, + 0xC8, 0xFA, 0x12, 0xF9, 0xC6, 0xE6, 0xC7, 0xEE, 0x2D, 0xD8, 0xE2, 0xF0, + 0x6A, 0xD1, 0x1E, 0xFB, 0xF1, 0xD1, 0x1F, 0x0B, 0xA3, 0xDD, 0xAD, 0x17, + 0x26, 0xF3, 0x36, 0x16, 0xAD, 0x01, 0xA2, 0x0F, 0x16, 0x04, 0x63, 0x13, + 0xE7, 0x06, 0xDE, 0x23, 0xE5, 0x18, 0xB0, 0x30, 0x42, 0x2D, 0x30, 0x2D, + 0x53, 0x38, 0xAB, 0x2B, 0xB9, 0x38, 0x26, 0x29, 0xAA, 0x33, 0x21, 0x25, + 0x8B, 0x2C, 0xCE, 0x1F, 0xB9, 0x29, 0x28, 0x1D, 0x69, 0x1D, 0xB9, 0x14, + 0xAD, 0x14, 0xAB, 0x0B, 0x0F, 0x1C, 0x39, 0x08, 0x7D, 0x28, 0x8D, 0x08, + 0x8B, 0x35, 0x01, 0x15, 0x3C, 0x36, 0x12, 0x1C, 0xBA, 0x22, 0xD4, 0x0C, + 0x0C, 0x0A, 0xD4, 0xF4, 0x26, 0x0C, 0x8D, 0xF2, 0xB8, 0x19, 0x2B, 0x01, + 0xF7, 0x14, 0x96, 0x0A, 0x31, 0x01, 0xB1, 0x05, 0xCA, 0xF5, 0xEB, 0x07, + 0x0E, 0xF9, 0xCE, 0x12, 0xEB, 0xFF, 0x49, 0x17, 0x65, 0x03, 0x04, 0x1F, + 0x5B, 0x09, 0x2E, 0x31, 0x80, 0x17, 0xCE, 0x43, 0x41, 0x27, 0xBE, 0x45, + 0x66, 0x31, 0x21, 0x3F, 0x44, 0x2B, 0xB4, 0x33, 0xBB, 0x1A, 0x28, 0x23, + 0x92, 0x0D, 0xAB, 0x14, 0xB9, 0x08, 0xAE, 0x08, 0xC0, 0x07, 0x35, 0x00, + 0x8D, 0x08, 0x56, 0xFD, 0xA2, 0x07, 0x6B, 0xFD, 0xFF, 0x03, 0x5B, 0xFD, + 0xBE, 0x09, 0x3F, 0xFC, 0x1D, 0x17, 0x0C, 0x03, 0xD1, 0x25, 0x7D, 0x14, + 0x96, 0x2F, 0xF6, 0x1A, 0xCF, 0x30, 0xA6, 0x17, 0xDD, 0x26, 0xB2, 0x0F, + 0x6A, 0x1C, 0x89, 0x0C, 0x57, 0x1E, 0x6E, 0x17, 0x8F, 0x28, 0xB8, 0x22, + 0x3E, 0x2F, 0x53, 0x23, 0xB2, 0x26, 0x18, 0x1B, 0xA9, 0x12, 0x6A, 0x17, + 0xC3, 0xF5, 0x81, 0x0F, 0x64, 0xDF, 0x65, 0xFF, 0xFD, 0xDC, 0x2E, 0xF0, + 0x36, 0xEB, 0xA4, 0xE4, 0xFB, 0xF0, 0x72, 0xDA, 0x50, 0xE1, 0xAC, 0xCE, + 0xD1, 0xCE, 0x92, 0xCA, 0xAE, 0xC1, 0x27, 0xCE, 0xE5, 0xC5, 0x9A, 0xD6, + 0x25, 0xD2, 0x1A, 0xE2, 0xA8, 0xD4, 0x1D, 0xE6, 0xBC, 0xCF, 0xAD, 0xDA, + 0x98, 0xD1, 0x59, 0xD0, 0x15, 0xD5, 0xE1, 0xD6, 0xB8, 0xCF, 0x4B, 0xE0, + 0x54, 0xD2, 0x54, 0xE5, 0x7B, 0xE7, 0x60, 0xEE, 0x4F, 0xFC, 0xBF, 0xF1, + 0x96, 0x0B, 0x50, 0xF5, 0x6F, 0x11, 0x74, 0xFB, 0xA3, 0x09, 0xD2, 0xFD, + 0x74, 0xF8, 0xFA, 0xF3, 0x2E, 0xEA, 0x7E, 0xE5, 0xC0, 0xEC, 0xEF, 0xE1, + 0xC8, 0xF4, 0xE4, 0xE4, 0xA2, 0xFC, 0x3E, 0xED, 0xFE, 0xFC, 0x9D, 0xEE, + 0x26, 0xF0, 0xBE, 0xE4, 0xC9, 0xD9, 0x6E, 0xD5, 0xFE, 0xD1, 0x9D, 0xD7, + 0x05, 0xDB, 0xA9, 0xEB, 0x50, 0xDF, 0x58, 0xF4, 0xB4, 0xD3, 0x6A, 0xE5, + 0x3E, 0xD0, 0xCB, 0xDF, 0x38, 0xDB, 0x00, 0xE6, 0xE4, 0xDA, 0x6D, 0xE9, + 0xEB, 0xD9, 0x2F, 0xF1, 0xA2, 0xE6, 0x31, 0xFA, 0xFC, 0xFD, 0xDF, 0x04, + 0x81, 0x0E, 0x0A, 0x06, 0x1E, 0x11, 0x04, 0x05, 0xF2, 0x0C, 0x5E, 0x01, + 0xA5, 0x07, 0x5D, 0xF7, 0x8A, 0x04, 0x1F, 0xF3, 0x42, 0x04, 0x92, 0xF2, + 0x65, 0xFF, 0x70, 0xEB, 0xDF, 0xFC, 0x2E, 0xEC, 0x3D, 0x03, 0xF1, 0xF7, + 0x5F, 0x05, 0x8C, 0xFA, 0x08, 0xFB, 0xFB, 0xF1, 0x3F, 0xF5, 0x0D, 0xEE, + 0x2C, 0xFF, 0x20, 0xF2, 0xE7, 0x08, 0x6F, 0xF2, 0xBF, 0x0C, 0x5F, 0xFA, + 0x23, 0xFE, 0x67, 0x02, 0xD9, 0xE6, 0x47, 0x01, 0xA8, 0xE4, 0xE1, 0x01, + 0xED, 0xF9, 0x99, 0x07, 0xDD, 0x0F, 0x40, 0x0D, 0x8F, 0x12, 0x2D, 0x0E, + 0xEE, 0x05, 0x19, 0x09, 0xD4, 0xF4, 0xAD, 0xFA, 0x15, 0xE5, 0x35, 0xE4, + 0x8D, 0xE2, 0xE2, 0xDB, 0x97, 0xE9, 0x6B, 0xE7, 0xB1, 0xE9, 0x70, 0xEC, + 0xB1, 0xDE, 0x1C, 0xE2, 0x61, 0xCE, 0xBF, 0xD0, 0xF3, 0xC1, 0xED, 0xC2, + 0xCA, 0xBF, 0x19, 0xBF, 0x2A, 0xCC, 0x29, 0xC8, 0x7D, 0xDA, 0x26, 0xD2, + 0x6D, 0xE4, 0xB7, 0xD5, 0x04, 0xEE, 0x35, 0xDF, 0x57, 0xF0, 0xFA, 0xEC, + 0x42, 0xE6, 0xBB, 0xF3, 0x2A, 0xDE, 0x4D, 0xFB, 0x7C, 0xE8, 0xA3, 0x09, + 0xBC, 0xF2, 0xE3, 0x0F, 0xDC, 0xF9, 0xFA, 0x15, 0xF2, 0x01, 0xE4, 0x1A, + 0x88, 0x09, 0x10, 0x1E, 0x4C, 0x0A, 0x69, 0x1B, 0x9E, 0x00, 0xDD, 0x13, + 0x70, 0xFE, 0x9C, 0x15, 0x48, 0x04, 0xD3, 0x11, 0xA7, 0x10, 0x34, 0x0C, + 0x57, 0x18, 0x60, 0x07, 0x9B, 0x0E, 0x2C, 0xFB, 0x72, 0xF5, 0x31, 0xE8, + 0xE6, 0xE5, 0xC5, 0xE2, 0x56, 0xEC, 0xAA, 0xE8, 0xD8, 0xFB, 0xD9, 0xEB, + 0xD2, 0x02, 0x13, 0xE2, 0xBF, 0x02, 0x90, 0xD9, 0xB2, 0xFC, 0x9A, 0xDA, + 0x1B, 0xF6, 0x0B, 0xDD, 0x3A, 0xF8, 0x7A, 0xE8, 0xCB, 0xFD, 0x2D, 0xFC, + 0xFE, 0x0A, 0x77, 0x17, 0x5D, 0x1D, 0xCD, 0x29, 0xD8, 0x32, 0x01, 0x35, + 0x02, 0x3A, 0xDE, 0x3B, 0x62, 0x2D, 0x3F, 0x3B, 0x1C, 0x1B, 0x28, 0x33, + 0x70, 0x0B, 0x35, 0x1E, 0x34, 0x05, 0xDE, 0x05, 0x0A, 0x09, 0xE8, 0x00, + 0x63, 0x15, 0xE8, 0x0F, 0x47, 0x1B, 0xF2, 0x11, 0x15, 0x13, 0xB3, 0x01, + 0x76, 0x0C, 0x07, 0xF5, 0xDE, 0x11, 0x13, 0xF7, 0x4C, 0x1B, 0x74, 0x00, + 0xDA, 0x23, 0xB0, 0x0B, 0x64, 0x19, 0xB3, 0x0B, 0x01, 0x05, 0x42, 0x0A, + 0xB1, 0x07, 0x19, 0x17, 0x09, 0x1F, 0x48, 0x2A, 0x01, 0x36, 0x53, 0x3C, + 0xB1, 0x3C, 0xD9, 0x3F, 0x78, 0x35, 0x18, 0x34, 0x48, 0x21, 0x32, 0x1A, + 0x9F, 0x0D, 0x17, 0x00, 0xF0, 0x04, 0x5F, 0xF6, 0x1C, 0x04, 0xA4, 0xFA, + 0xD5, 0x04, 0x24, 0x01, 0x05, 0xFC, 0xE6, 0xFE, 0xB3, 0xEB, 0x09, 0xF6, + 0xA1, 0xDA, 0x45, 0xEA, 0xA5, 0xD5, 0xE2, 0xE7, 0x35, 0xDC, 0x50, 0xF8, + 0x97, 0xE3, 0xF8, 0x0B, 0xA7, 0xE8, 0xD3, 0x11, 0xEE, 0xF0, 0x53, 0x11, + 0xBB, 0xF3, 0xB7, 0x0F, 0xC5, 0xF3, 0x9C, 0x16, 0x99, 0xF8, 0x30, 0x23, + 0x04, 0x06, 0x28, 0x2F, 0xA1, 0x15, 0x40, 0x31, 0x9F, 0x18, 0xD7, 0x24, + 0x7F, 0x16, 0x6C, 0x16, 0x63, 0x17, 0x28, 0x0D, 0xA1, 0x1F, 0x33, 0x0E, + 0xBA, 0x1C, 0xF6, 0x07, 0x4E, 0x17, 0xE5, 0xFF, 0x05, 0x1D, 0x50, 0xFA, + 0x42, 0x2B, 0x16, 0xFA, 0xA8, 0x31, 0x70, 0xF9, 0x91, 0x25, 0xAF, 0xF0, + 0xFF, 0x07, 0xA6, 0xDD, 0xDB, 0xEE, 0x03, 0xD4, 0xAE, 0xEE, 0x0A, 0xE1, + 0xA6, 0xF7, 0x10, 0xF0, 0xD7, 0xF8, 0x0A, 0xF7, 0xEA, 0xF7, 0x10, 0xFE, + 0x86, 0xFA, 0x40, 0x09, 0x41, 0xF9, 0x15, 0x0C, 0x83, 0xFA, 0x71, 0x0B, + 0x26, 0xFF, 0x93, 0x0F, 0xE0, 0x0A, 0xF1, 0x20, 0x0D, 0x19, 0x4B, 0x33, + 0x52, 0x25, 0x64, 0x3D, 0x0A, 0x2C, 0x23, 0x3D, 0xF6, 0x22, 0x3B, 0x30, + 0x3A, 0x0E, 0x65, 0x21, 0x29, 0xF9, 0x94, 0x08, 0x6E, 0xEC, 0xB3, 0xE8, + 0xAF, 0xE8, 0x9E, 0xD8, 0xCE, 0xEA, 0xE1, 0xDE, 0x57, 0xE8, 0xFB, 0xE6, + 0x8A, 0xE3, 0x10, 0xE9, 0x60, 0xE9, 0xC4, 0xEF, 0x80, 0xF8, 0x92, 0xF9, + 0xA5, 0x02, 0xAC, 0x00, 0x5C, 0x08, 0x2B, 0x06, 0x8E, 0x0A, 0xA0, 0x00, + 0xBE, 0x04, 0xF7, 0xF1, 0xAC, 0xFA, 0x1B, 0xEE, 0xA3, 0xF6, 0x3D, 0xF9, + 0xC9, 0x02, 0x72, 0x06, 0x7C, 0x12, 0x7A, 0x06, 0x85, 0x10, 0x50, 0xFB, + 0x8E, 0xF6, 0xDA, 0xEB, 0x33, 0xD9, 0x57, 0xD8, 0x62, 0xCC, 0x55, 0xCA, + 0x73, 0xCB, 0xD3, 0xC6, 0x57, 0xCF, 0xF1, 0xC5, 0xBF, 0xCC, 0x18, 0xBC, + 0x3A, 0xBF, 0x22, 0xAD, 0x16, 0xB0, 0xEA, 0xA9, 0xAA, 0xA9, 0xD0, 0xB5, + 0x4C, 0xB0, 0xE8, 0xC9, 0x53, 0xB7, 0x29, 0xD6, 0x36, 0xB8, 0xB0, 0xD2, + 0xBD, 0xBB, 0x5D, 0xC9, 0x4D, 0xC5, 0x95, 0xC4, 0x66, 0xD0, 0x0C, 0xCA, + 0x9A, 0xD9, 0xB2, 0xDB, 0x36, 0xE6, 0x56, 0xF4, 0xA1, 0xF1, 0x1B, 0xFD, + 0x86, 0xFA, 0x84, 0xF7, 0xA8, 0x01, 0x6D, 0xF5, 0xE4, 0x04, 0xF3, 0xF9, + 0x0A, 0x06, 0x2F, 0xFE, 0xD4, 0x03, 0x98, 0xF9, 0xC9, 0x00, 0x9A, 0xF6, + 0x95, 0xF9, 0xE3, 0xF5, 0x8B, 0xFC, 0xE7, 0xFF, 0x80, 0x08, 0xF8, 0x0E, + 0xB5, 0x0D, 0x76, 0x13, 0x00, 0xFF, 0x98, 0x06, 0xF5, 0xF5, 0x80, 0xFB, + 0x50, 0x00, 0xA2, 0xF9, 0x88, 0x0A, 0x1F, 0xF8, 0x1C, 0x0B, 0x14, 0xF5, + 0xC4, 0x0E, 0x1E, 0xF9, 0xAB, 0x1A, 0xEF, 0x0B, 0x15, 0x1B, 0xC4, 0x1D, + 0xCB, 0x12, 0x1A, 0x2A, 0x73, 0x0E, 0x6D, 0x32, 0xD8, 0x1B, 0xB0, 0x3E, + 0xCF, 0x2D, 0xE5, 0x4C, 0x39, 0x3A, 0x9B, 0x55, 0xF4, 0x42, 0x5D, 0x56, + 0xDB, 0x4C, 0x0B, 0x57, 0x04, 0x4F, 0x45, 0x53, 0xB2, 0x3E, 0xC4, 0x3E, + 0xFD, 0x29, 0x36, 0x24, 0xA7, 0x1D, 0xA8, 0x13, 0x7A, 0x1F, 0x92, 0x12, + 0xC2, 0x1E, 0xF1, 0x10, 0x5C, 0x1F, 0x90, 0x0E, 0xAC, 0x2B, 0x53, 0x11, + 0x08, 0x3D, 0x16, 0x15, 0xD8, 0x42, 0xA0, 0x17, 0x39, 0x3B, 0x77, 0x1F, + 0xCC, 0x31, 0x94, 0x2B, 0x32, 0x2A, 0x53, 0x30, 0xE8, 0x2B, 0x17, 0x33, + 0x17, 0x38, 0x6A, 0x3A, 0x59, 0x45, 0x44, 0x3E, 0x9C, 0x45, 0x1A, 0x3D, + 0x6E, 0x34, 0x66, 0x38, 0x10, 0x1A, 0xA3, 0x2B, 0x06, 0x06, 0x00, 0x1D, + 0x53, 0xFE, 0x23, 0x12, 0x56, 0xFF, 0xEE, 0x09, 0x3D, 0xFC, 0xC4, 0xFD, + 0x94, 0xEF, 0x51, 0xEA, 0xAF, 0xE0, 0x6C, 0xD7, 0x4A, 0xD2, 0x0D, 0xCE, + 0xCE, 0xCD, 0x23, 0xD4, 0x51, 0xD9, 0x83, 0xE7, 0xE9, 0xE8, 0x05, 0xFB, + 0x85, 0xEF, 0x8E, 0xFE, 0x12, 0xEF, 0xA7, 0xFA, 0xBF, 0xE9, 0xC2, 0xFB, + 0x85, 0xE8, 0xA3, 0xFC, 0x49, 0xF0, 0x99, 0x00, 0x09, 0x00, 0xDE, 0x13, + 0xC2, 0x15, 0xB2, 0x26, 0x60, 0x27, 0x73, 0x28, 0xFC, 0x29, 0x38, 0x26, + 0xA7, 0x22, 0x90, 0x25, 0xBF, 0x22, 0xED, 0x22, 0xAD, 0x25, 0xB6, 0x14, + 0x07, 0x25, 0x08, 0x06, 0xE0, 0x13, 0x71, 0xFD, 0x62, 0x09, 0x81, 0xFE, + 0xAB, 0x0C, 0x95, 0x00, 0x6C, 0x07, 0x15, 0xFE, 0xC6, 0xEF, 0xBD, 0xF3, + 0x80, 0xDB, 0x9B, 0xE8, 0x1D, 0xE4, 0x5F, 0xED, 0x67, 0xF6, 0x30, 0xF1, + 0x83, 0xF9, 0x8D, 0xE9, 0x41, 0xEF, 0x29, 0xE2, 0x58, 0xF1, 0x2B, 0xEB, + 0xD6, 0xFA, 0x01, 0xFA, 0xD5, 0x00, 0x62, 0x04, 0xD8, 0x02, 0xC0, 0x10, + 0xCE, 0x0A, 0xFA, 0x23, 0x9F, 0x15, 0x69, 0x31, 0x9E, 0x18, 0xCE, 0x2F, + 0x73, 0x16, 0x00, 0x26, 0xF4, 0x12, 0xA2, 0x1C, 0xA5, 0x0E, 0xEB, 0x14, + 0x7A, 0x01, 0x50, 0x00, 0x91, 0xF2, 0x9B, 0xE3, 0x98, 0xEB, 0xD0, 0xD2, + 0x88, 0xF1, 0x07, 0xD8, 0x6E, 0xF5, 0x44, 0xE1, 0x6B, 0xF2, 0xFB, 0xDE, + 0xDB, 0xF8, 0x29, 0xDC, 0xDC, 0x09, 0xA5, 0xDF, 0xD1, 0x15, 0xA3, 0xE4, + 0x9D, 0x12, 0x0E, 0xEA, 0xEF, 0x03, 0xC7, 0xED, 0x2D, 0xF3, 0xC0, 0xED, + 0x63, 0xEC, 0x6D, 0xF1, 0x13, 0xF3, 0x5C, 0xF9, 0x53, 0x07, 0x4B, 0x04, + 0xF9, 0x1A, 0xB7, 0x0B, 0xCF, 0x1B, 0x52, 0x09, 0xF1, 0x03, 0x9A, 0xF9, + 0x79, 0xE3, 0x5B, 0xE4, 0x48, 0xD0, 0x2F, 0xDA, 0x17, 0xCD, 0x45, 0xD7, + 0x24, 0xCD, 0xFA, 0xD0, 0xBF, 0xC1, 0xD0, 0xC8, 0xCC, 0xAF, 0x67, 0xC2, + 0x80, 0xA0, 0x71, 0xB4, 0x96, 0x9B, 0xAC, 0xA9, 0xB4, 0xA4, 0x05, 0xB2, + 0x30, 0xBA, 0xF0, 0xC9, 0x01, 0xD0, 0xDF, 0xDE, 0xFE, 0xE2, 0xF5, 0xEA, + 0xE4, 0xEB, 0x21, 0xF1, 0xEE, 0xED, 0x6C, 0xF6, 0xA5, 0xF1, 0xD4, 0xFA, + 0xD2, 0xF7, 0xBC, 0x00, 0xCB, 0x04, 0xC2, 0x0C, 0x89, 0x0D, 0x1C, 0x0B, + 0xD0, 0x0C, 0xBF, 0xFE, 0xBA, 0x00, 0x6A, 0xF2, 0xB7, 0xF3, 0xB0, 0xF1, + 0x93, 0xDE, 0x40, 0xF0, 0x23, 0xD2, 0x25, 0xE7, 0xAE, 0xDA, 0xAD, 0xDF, + 0x45, 0xE6, 0xD7, 0xE0, 0xC2, 0xF5, 0x0B, 0xED, 0x98, 0x04, 0x56, 0xF5, + 0xC0, 0xFE, 0x7B, 0xED, 0xBA, 0xE9, 0xB0, 0xDF, 0x4C, 0xE5, 0x83, 0xE8, + 0x58, 0xF2, 0x2B, 0xFC, 0xCB, 0xF9, 0x8F, 0x00, 0x40, 0xEB, 0xA6, 0xF8, + 0x44, 0xE1, 0xEE, 0xF8, 0x36, 0xE5, 0x9B, 0xFC, 0x45, 0xEA, 0x39, 0xFC, + 0x3C, 0xF4, 0x12, 0xF8, 0x0D, 0x0B, 0x4C, 0xF7, 0x76, 0x28, 0x4B, 0x04, + 0x54, 0x3A, 0xB2, 0x18, 0x1F, 0x3C, 0xAE, 0x2E, 0x3D, 0x34, 0x85, 0x37, + 0x97, 0x2C, 0xC9, 0x2D, 0x6A, 0x1C, 0xBF, 0x16, 0x57, 0xFF, 0x78, 0xFC, + 0x7C, 0xE6, 0xE4, 0xEE, 0x1F, 0xE5, 0xDF, 0xF5, 0xCF, 0xF2, 0x06, 0x04, + 0xF5, 0xF1, 0x5F, 0x05, 0x81, 0xE9, 0x1C, 0x02, 0x20, 0xF3, 0x4D, 0x09, + 0x77, 0x0C, 0x1E, 0x12, 0x99, 0x27, 0x79, 0x14, 0x19, 0x37, 0x12, 0x18, + 0x8D, 0x31, 0x60, 0x17, 0x1C, 0x25, 0xF9, 0x14, 0x19, 0x1E, 0x89, 0x1A, + 0xB3, 0x1E, 0xA3, 0x25, 0x00, 0x1E, 0x01, 0x2A, 0xC4, 0x15, 0x8B, 0x21, + 0x4A, 0x06, 0x33, 0x0A, 0xF2, 0xED, 0xE3, 0xE4, 0x2D, 0xDB, 0xB0, 0xC3, + 0x85, 0xDA, 0x2F, 0xB7, 0x4F, 0xE2, 0x5D, 0xBF, 0xFA, 0xE5, 0x20, 0xC7, + 0x92, 0xE3, 0xBE, 0xC5, 0xAA, 0xDC, 0x48, 0xC7, 0x72, 0xD8, 0x88, 0xD1, + 0xF9, 0xD8, 0x54, 0xDF, 0x1B, 0xDE, 0xDD, 0xED, 0x93, 0xE6, 0x00, 0xF6, + 0x2D, 0xEA, 0xDF, 0xF0, 0x30, 0xE9, 0x3B, 0xEA, 0x0B, 0xEA, 0x76, 0xEB, + 0x2B, 0xF2, 0xCB, 0xF8, 0x52, 0xFC, 0x63, 0x08, 0xF2, 0x07, 0xA9, 0x12, + 0xB5, 0x0B, 0x1E, 0x0F, 0x3A, 0x04, 0x2D, 0x01, 0x31, 0xFF, 0x3A, 0xF7, + 0xA7, 0x07, 0x40, 0xFA, 0x3D, 0x0F, 0xD5, 0xFF, 0xC6, 0x0A, 0x5F, 0x03, + 0x18, 0xFF, 0x42, 0x08, 0x7D, 0xF5, 0xEB, 0x0B, 0xF4, 0xF5, 0x53, 0x14, + 0x88, 0xFC, 0xBC, 0x1E, 0xA3, 0xFD, 0x2A, 0x18, 0xA2, 0xF7, 0x10, 0xFE, + 0x48, 0xFF, 0x5D, 0xF2, 0x26, 0x11, 0x2C, 0xF9, 0xBF, 0x1B, 0x16, 0x00, + 0x96, 0x16, 0x1C, 0x01, 0x2C, 0x13, 0x18, 0x0B, 0xEB, 0x1D, 0x2D, 0x1D, + 0x76, 0x29, 0xD6, 0x26, 0x68, 0x28, 0x63, 0x24, 0xA4, 0x23, 0xA5, 0x21, + 0x53, 0x26, 0xDC, 0x30, 0x88, 0x28, 0x6E, 0x49, 0xB8, 0x28, 0x9A, 0x58, + 0x12, 0x2D, 0xD5, 0x5D, 0xB3, 0x32, 0x8D, 0x5E, 0x4F, 0x28, 0xCB, 0x50, + 0x70, 0x12, 0xE2, 0x34, 0x6F, 0x05, 0x24, 0x17, 0xD7, 0x0B, 0xF6, 0x0C, + 0x5A, 0x18, 0xCC, 0x13, 0x9C, 0x1D, 0x3F, 0x15, 0x04, 0x19, 0x7A, 0x0C, + 0x3D, 0x19, 0xF0, 0x04, 0x5F, 0x29, 0xA1, 0x08, 0x94, 0x33, 0x28, 0x0D, + 0x9B, 0x2F, 0x63, 0x0A, 0xEC, 0x24, 0xC4, 0xFF, 0x80, 0x1B, 0x4B, 0xF6, + 0x75, 0x1B, 0x42, 0xF8, 0xA2, 0x28, 0x45, 0x06, 0x25, 0x3C, 0xA4, 0x15, + 0xF1, 0x44, 0xF4, 0x1C, 0x41, 0x3A, 0x43, 0x1D, 0xD8, 0x1D, 0x1A, 0x14, + 0x12, 0xF9, 0x31, 0x08, 0xFE, 0xE2, 0x4B, 0xFF, 0xF4, 0xE2, 0xDA, 0xF2, + 0x5C, 0xE0, 0x32, 0xE6, 0x67, 0xCB, 0x2D, 0xDD, 0x62, 0xB2, 0xB1, 0xD5, + 0x55, 0xA7, 0x6A, 0xD5, 0x50, 0xA9, 0x95, 0xD8, 0x00, 0xB6, 0x24, 0xDB, + 0x02, 0xCC, 0x46, 0xDF, 0x33, 0xDB, 0x68, 0xDD, 0xDA, 0xDE, 0x34, 0xDD, + 0xAD, 0xDF, 0x48, 0xE6, 0xFD, 0xDF, 0xB1, 0xF3, 0xE5, 0xDE, 0xFB, 0xFD, + 0x47, 0xE5, 0x39, 0x07, 0xE7, 0xE9, 0x77, 0x07, 0x08, 0xE7, 0xB8, 0xFC, + 0xB7, 0xE9, 0x5B, 0xF5, 0x8B, 0xF0, 0x92, 0xEF, 0x3D, 0xF6, 0x79, 0xE6, + 0xE2, 0xF2, 0xC1, 0xDA, 0xA0, 0xE4, 0xF8, 0xCC, 0x3F, 0xD9, 0x93, 0xC1, + 0x53, 0xE2, 0x81, 0xCA, 0xF5, 0xF9, 0xD2, 0xDC, 0x09, 0x08, 0xB1, 0xDD, + 0xA4, 0xF8, 0xFC, 0xC8, 0x93, 0xE2, 0xDD, 0xB8, 0xAC, 0xDC, 0x33, 0xB9, + 0xC3, 0xDF, 0xF5, 0xC1, 0x1D, 0xDE, 0x0E, 0xC7, 0x8F, 0xDB, 0xFF, 0xCA, + 0x45, 0xDF, 0xF9, 0xD7, 0xC2, 0xE0, 0x0B, 0xE6, 0xA0, 0xDA, 0xD8, 0xEE, + 0xF3, 0xD3, 0x34, 0xF6, 0x6C, 0xE1, 0xEE, 0x07, 0x0E, 0xFB, 0xF3, 0x14, + 0xD6, 0x0F, 0xE1, 0x1A, 0x08, 0x18, 0xA4, 0x26, 0xEF, 0x11, 0x55, 0x2C, + 0x5E, 0x02, 0x7A, 0x1A, 0xEF, 0xEF, 0x0F, 0xFC, 0x4E, 0xE0, 0x87, 0xE3, + 0x4D, 0xDB, 0x3A, 0xD5, 0x61, 0xE5, 0xBE, 0xD4, 0x8B, 0xF1, 0xFE, 0xD7, + 0xD0, 0xF2, 0x95, 0xD3, 0x01, 0xF6, 0x2E, 0xD5, 0xD1, 0x07, 0x5E, 0xE4, + 0xEC, 0x1D, 0xED, 0xF6, 0x42, 0x2B, 0xAF, 0x0C, 0xCD, 0x2A, 0xAC, 0x20, + 0x11, 0x27, 0x85, 0x2E, 0xC8, 0x26, 0x62, 0x35, 0x71, 0x2B, 0x60, 0x38, + 0x33, 0x31, 0x7E, 0x39, 0xA2, 0x32, 0x6E, 0x35, 0xEB, 0x2B, 0xE6, 0x2B, + 0x2F, 0x18, 0xE0, 0x20, 0xDC, 0xF9, 0x3D, 0x17, 0x7F, 0xE8, 0xB6, 0x12, + 0x59, 0xEF, 0xDB, 0x0E, 0x3D, 0xF9, 0xF7, 0x07, 0x64, 0xF2, 0xC2, 0x01, + 0x9F, 0xE1, 0xB1, 0xFA, 0xDF, 0xDC, 0xE4, 0xF6, 0x2A, 0xE7, 0x33, 0xF9, + 0x1E, 0xF8, 0x8D, 0x03, 0x1C, 0x04, 0x3B, 0x11, 0xF6, 0x09, 0xD1, 0x18, + 0x4D, 0x07, 0x63, 0x16, 0xBC, 0x06, 0xDA, 0x19, 0xCC, 0x11, 0xFB, 0x24, + 0x9D, 0x20, 0xFC, 0x2B, 0x46, 0x2A, 0xF6, 0x29, 0x68, 0x30, 0xF0, 0x25, + 0x10, 0x30, 0x28, 0x23, 0x66, 0x2F, 0x97, 0x20, 0x46, 0x33, 0x38, 0x22, + 0x05, 0x32, 0xFB, 0x26, 0xFF, 0x2A, 0xE7, 0x22, 0x9B, 0x20, 0xC2, 0x12, + 0x05, 0x1C, 0xA5, 0x08, 0x48, 0x17, 0xC6, 0x09, 0xA1, 0x14, 0xEC, 0x19, + 0xDF, 0x1B, 0x4F, 0x27, 0xFA, 0x1C, 0x1F, 0x1C, 0x76, 0x0D, 0x4F, 0x0B, + 0x9E, 0x03, 0x47, 0x0E, 0x2D, 0x0A, 0x0E, 0x1B, 0x54, 0x0E, 0x66, 0x12, + 0x42, 0x0E, 0xA0, 0xF9, 0x4C, 0x0F, 0xDB, 0xF0, 0x19, 0x14, 0xCC, 0x00, + 0xAB, 0x15, 0xC2, 0x11, 0xE9, 0x10, 0x10, 0x13, 0x82, 0x11, 0x85, 0x0F, + 0xC4, 0x20, 0x76, 0x1C, 0xDB, 0x30, 0x46, 0x2D, 0xE1, 0x36, 0xB8, 0x31, + 0xEE, 0x38, 0x10, 0x31, 0x57, 0x3D, 0xAC, 0x2B, 0x71, 0x3A, 0x85, 0x1E, + 0x94, 0x21, 0x20, 0x0A, 0x07, 0x06, 0xB9, 0xFA, 0x0B, 0x00, 0xC9, 0xFF, + 0xBE, 0x0D, 0xDD, 0x12, 0xF1, 0x18, 0x5D, 0x1C, 0x5D, 0x16, 0x59, 0x16, + 0x77, 0x13, 0x53, 0x0D, 0x90, 0x17, 0x9C, 0x0C, 0xC4, 0x1B, 0x2E, 0x17, + 0x65, 0x18, 0xE8, 0x23, 0xB0, 0x14, 0x78, 0x32, 0x40, 0x18, 0x31, 0x3F, + 0x74, 0x1D, 0xBB, 0x3D, 0x9C, 0x21, 0xD0, 0x33, 0x80, 0x1F, 0x56, 0x28, + 0x6D, 0x13, 0x61, 0x1F, 0x9E, 0x01, 0x79, 0x13, 0x01, 0xF4, 0xE5, 0xFB, + 0x9E, 0xF1, 0xA4, 0xE5, 0x9D, 0xF2, 0x9F, 0xE2, 0x0D, 0xE8, 0x59, 0xEB, + 0x7D, 0xD7, 0x65, 0xEE, 0xAC, 0xCA, 0x9D, 0xE3, 0xFD, 0xC5, 0xAA, 0xD7, + 0x50, 0xC6, 0x39, 0xD2, 0x49, 0xC8, 0x9A, 0xD1, 0xBE, 0xCC, 0x95, 0xD5, + 0xBE, 0xD1, 0xB0, 0xDB, 0x64, 0xD5, 0xA8, 0xE4, 0xCE, 0xD7, 0x4C, 0xEB, + 0xD4, 0xDE, 0xB0, 0xF1, 0xF7, 0xE7, 0xFB, 0xFA, 0x32, 0xF4, 0x03, 0x01, + 0xA8, 0x05, 0xFE, 0x00, 0xCD, 0x0C, 0x34, 0xFA, 0x3F, 0x05, 0x97, 0xEE, + 0xE4, 0xFF, 0xEF, 0xE6, 0x68, 0x03, 0xA6, 0xE7, 0x4F, 0x0B, 0x9B, 0xF2, + 0x78, 0x00, 0x3F, 0xF5, 0xF2, 0xEB, 0xA5, 0xEB, 0x59, 0xE9, 0x06, 0xE0, + 0x02, 0xF6, 0x8F, 0xD8, 0x94, 0x03, 0x44, 0xDC, 0x53, 0x02, 0xF2, 0xE0, + 0x59, 0xEB, 0xE3, 0xD7, 0x07, 0xD8, 0xC2, 0xCD, 0x66, 0xDC, 0x05, 0xD2, + 0xF1, 0xE5, 0xEE, 0xDA, 0xDE, 0xE3, 0x1A, 0xDA, 0xCE, 0xDE, 0x36, 0xD9, + 0x56, 0xDF, 0x36, 0xE6, 0x63, 0xDF, 0xC7, 0xF1, 0x7E, 0xE2, 0xAB, 0xF2, + 0xA3, 0xE8, 0xA4, 0xEC, 0x1E, 0xFB, 0x61, 0xF8, 0x5D, 0x12, 0x33, 0x15, + 0x5D, 0x26, 0x52, 0x2D, 0xC6, 0x33, 0x04, 0x39, 0x41, 0x2C, 0x88, 0x35, + 0x52, 0x19, 0x9C, 0x24, 0x07, 0x00, 0x52, 0x03, 0xD8, 0xE7, 0xB6, 0xE5, + 0x0B, 0xD9, 0x78, 0xDB, 0xD5, 0xD7, 0xB5, 0xE2, 0xB7, 0xDD, 0x39, 0xE7, + 0xC8, 0xE2, 0x08, 0xDC, 0x1F, 0xE4, 0xC8, 0xCE, 0x41, 0xE9, 0x26, 0xD3, + 0x79, 0xF5, 0xE2, 0xE3, 0x12, 0x05, 0x9F, 0xF2, 0x8B, 0x0E, 0x2C, 0xFA, + 0x20, 0x0D, 0xC5, 0xFC, 0x6D, 0x08, 0xC7, 0xFF, 0xAD, 0x03, 0xA1, 0x04, + 0x0F, 0x06, 0x01, 0x0F, 0xED, 0x0B, 0xE6, 0x17, 0xF7, 0x11, 0xEE, 0x1D, + 0x06, 0x0A, 0x6C, 0x12, 0x3B, 0xF3, 0x76, 0xF7, 0x99, 0xDF, 0xC6, 0xE2, + 0xCF, 0xD7, 0x82, 0xD7, 0x6D, 0xD6, 0xD7, 0xD2, 0x65, 0xD0, 0xF0, 0xD1, + 0x26, 0xC2, 0xF0, 0xCB, 0xB1, 0xB8, 0xEE, 0xC5, 0x9F, 0xBB, 0xA7, 0xC9, + 0x02, 0xC4, 0xA2, 0xD2, 0x2C, 0xD0, 0xCF, 0xDD, 0x77, 0xDB, 0xAF, 0xEA, + 0x51, 0xE1, 0xC8, 0xFB, 0xD0, 0xE2, 0x86, 0x0C, 0xE7, 0xE7, 0xCE, 0x1C, + 0xBD, 0xF4, 0x0E, 0x2C, 0x7E, 0x05, 0xF8, 0x2F, 0x29, 0x15, 0x14, 0x27, + 0xF1, 0x1B, 0x4D, 0x14, 0x16, 0x1B, 0xC0, 0x05, 0x78, 0x16, 0x8E, 0x02, + 0x5E, 0x13, 0x56, 0x02, 0x98, 0x0D, 0xB0, 0xFE, 0x26, 0xFD, 0x2E, 0xF2, + 0xBD, 0xF4, 0x7D, 0xE9, 0x60, 0xFA, 0xB8, 0xED, 0xC5, 0x02, 0x27, 0xF7, + 0x76, 0x0B, 0x3D, 0xFC, 0x57, 0x10, 0x86, 0xF0, 0x20, 0x02, 0x86, 0xD3, + 0x73, 0xF4, 0xBE, 0xCA, 0xC5, 0xF8, 0x24, 0xE1, 0x62, 0x01, 0x2C, 0xF7, + 0x8F, 0x01, 0x98, 0xF4, 0xBC, 0x00, 0xD2, 0xF2, 0xAA, 0x04, 0xCA, 0x00, + 0x71, 0x06, 0xBF, 0x09, 0x7F, 0x0A, 0xC8, 0x07, 0x7B, 0x10, 0xAA, 0x04, + 0x69, 0x1E, 0x1D, 0x14, 0x6E, 0x32, 0xC8, 0x28, 0xBD, 0x42, 0x31, 0x37, + 0x8A, 0x44, 0xEC, 0x3C, 0x77, 0x3C, 0x50, 0x3B, 0x10, 0x2A, 0x37, 0x29, + 0x3E, 0x09, 0x9A, 0x03, 0x9F, 0xEA, 0xB5, 0xDD, 0x70, 0xDD, 0x4F, 0xCA, + 0x8B, 0xDD, 0x3B, 0xD0, 0xF7, 0xDF, 0x24, 0xDC, 0x0A, 0xE7, 0x2C, 0xE1, + 0xAF, 0xEE, 0x73, 0xEB, 0x8B, 0xFD, 0xFC, 0x07, 0xC0, 0x16, 0x28, 0x26, + 0x3F, 0x2D, 0xC3, 0x37, 0x5C, 0x33, 0x2D, 0x3B, 0x09, 0x2F, 0xDB, 0x3A, + 0xA9, 0x2B, 0xB1, 0x38, 0xA0, 0x2A, 0x30, 0x31, 0x7A, 0x29, 0x61, 0x30, + 0x10, 0x24, 0x08, 0x35, 0xD1, 0x16, 0xDB, 0x30, 0x91, 0xFB, 0x05, 0x1A, + 0x65, 0xE4, 0xC8, 0xFC, 0xFA, 0xE3, 0xB1, 0xEA, 0x80, 0xED, 0x5D, 0xEA, + 0x96, 0xEC, 0x2B, 0xF0, 0x45, 0xDC, 0xBC, 0xEE, 0x5B, 0xCA, 0x78, 0xED, + 0xEA, 0xCC, 0xE9, 0xFC, 0x29, 0xE1, 0xDE, 0x11, 0x16, 0xF7, 0xEA, 0x1A, + 0x0E, 0x07, 0x33, 0x1D, 0x6F, 0x0D, 0xD4, 0x16, 0x63, 0x0A, 0x92, 0x08, + 0xF4, 0x02, 0x6B, 0x04, 0x56, 0xFF, 0xD7, 0x0B, 0xCD, 0x0B, 0xAE, 0x14, + 0xBA, 0x20, 0x18, 0x13, 0xBF, 0x34, 0xB4, 0x10, 0x15, 0x35, 0xE4, 0x0D, + 0x7A, 0x24, 0x1B, 0x0C, 0xC8, 0x1B, 0x53, 0x0C, 0xEA, 0x1D, 0x0D, 0x06, + 0xCF, 0x22, 0x1C, 0xFC, 0xD1, 0x13, 0xFD, 0xEB, 0xE9, 0x06, 0x75, 0xE8, + 0x4D, 0x08, 0x73, 0xF1, 0xA0, 0x0C, 0xF9, 0x03, 0xB1, 0x0C, 0x76, 0x15, + 0x14, 0xFE, 0xD4, 0x11, 0x51, 0xE7, 0xAD, 0xF6, 0x9A, 0xE4, 0x1A, 0xEA, + 0x11, 0xF6, 0xDA, 0xF8, 0xCA, 0x05, 0x44, 0x07, 0x08, 0x04, 0xED, 0x01, + 0x87, 0x00, 0xFA, 0x00, 0x72, 0x03, 0x82, 0x0F, 0x69, 0xFE, 0x51, 0x13, + 0x66, 0xFF, 0x96, 0x11, 0xAC, 0x04, 0xB1, 0x10, 0x3F, 0x0D, 0xD8, 0x17, + 0xF4, 0x15, 0xFD, 0x1A, 0x12, 0x18, 0xA0, 0x13, 0x98, 0x19, 0xB5, 0x13, + 0x02, 0x0D, 0x29, 0x14, 0x20, 0xEC, 0x1F, 0x04, 0xA6, 0xD4, 0x1F, 0xEE, + 0xFD, 0xCF, 0x7D, 0xE0, 0xDF, 0xD6, 0xF5, 0xDA, 0x9E, 0xE6, 0x3D, 0xDB, + 0x8A, 0xE9, 0x2E, 0xD4, 0xA5, 0xDC, 0x25, 0xCB, 0xB9, 0xD0, 0x88, 0xC7, + 0xA5, 0xD9, 0xDC, 0xCE, 0x3C, 0xEF, 0x58, 0xE0, 0x5F, 0xF9, 0x95, 0xEB, + 0x33, 0xFB, 0xC5, 0xEA, 0x88, 0xFE, 0x6B, 0xE2, 0x84, 0x02, 0x5E, 0xDA, + 0xBE, 0x05, 0x5B, 0xDB, 0x7A, 0x08, 0x9F, 0xE9, 0x2E, 0x08, 0xAB, 0xF7, + 0xA6, 0xFD, 0x6B, 0xF4, 0xC4, 0xE3, 0xFE, 0xE2, 0x19, 0xC9, 0xB3, 0xD6, + 0x2A, 0xB3, 0x24, 0xD6, 0x09, 0xA5, 0xC4, 0xD7, 0x5F, 0xA3, 0x51, 0xD3, + 0x5E, 0x9F, 0x65, 0xC6, 0xC8, 0x9F, 0xEB, 0xBB, 0xFC, 0xB1, 0xE1, 0xB9, + 0xC4, 0xCA, 0x08, 0xC5, 0x3D, 0xD8, 0x05, 0xD6, 0x67, 0xDC, 0x75, 0xE9, + 0xE1, 0xE5, 0xE4, 0xF7, 0xA8, 0xEB, 0x1F, 0xF3, 0x04, 0xF0, 0x96, 0xEE, + 0x46, 0x00, 0xD6, 0xED, 0x34, 0x12, 0x60, 0xF6, 0xB9, 0x1A, 0xAA, 0x03, + 0xA8, 0x13, 0xCF, 0x08, 0xF4, 0x09, 0xFB, 0x03, 0x2A, 0x12, 0x88, 0x02, + 0x32, 0x16, 0xFE, 0x02, 0xB4, 0x17, 0xEC, 0x01, 0x49, 0x0F, 0x84, 0xF9, + 0x45, 0x00, 0x95, 0xED, 0x15, 0x07, 0xFB, 0xEF, 0x0E, 0x18, 0xAC, 0xFA, + 0x0C, 0x25, 0xD7, 0x0B, 0xBF, 0x1B, 0xE0, 0x16, 0xB9, 0x01, 0x98, 0x0E, + 0x1D, 0xF0, 0xF2, 0x02, 0x03, 0xEB, 0xD3, 0x06, 0x87, 0xF3, 0x43, 0x16, + 0x55, 0x00, 0x2C, 0x19, 0xAD, 0x02, 0xB7, 0x09, 0xFD, 0x0A, 0xDE, 0x0C, + 0xC2, 0x0F, 0x54, 0x1B, 0x40, 0x0F, 0x95, 0x29, 0x6E, 0x0D, 0x23, 0x34, + 0xCD, 0x1E, 0x23, 0x42, 0xBE, 0x48, 0x04, 0x5C, 0x8F, 0x5D, 0x82, 0x64, + 0x16, 0x57, 0x95, 0x5E, 0xEC, 0x4A, 0x0D, 0x54, 0x14, 0x3B, 0xE6, 0x3E, + 0x76, 0x23, 0x36, 0x21, 0x82, 0x0F, 0xB2, 0x08, 0x10, 0x09, 0xD0, 0x02, + 0x97, 0x13, 0xC3, 0x09, 0xE6, 0x23, 0x26, 0x0A, 0xCA, 0x24, 0xAB, 0xFA, + 0x21, 0x1A, 0x77, 0xF2, 0x88, 0x16, 0x2B, 0x04, 0x24, 0x22, 0xB8, 0x1D, + 0x24, 0x3B, 0x06, 0x39, 0xAB, 0x47, 0x8F, 0x49, 0xD4, 0x3D, 0x9F, 0x48, + 0x04, 0x30, 0x44, 0x42, 0xC5, 0x24, 0x79, 0x39, 0xE0, 0x19, 0xC5, 0x2C, + 0x40, 0x19, 0x8E, 0x20, 0x72, 0x1E, 0xAD, 0x1A, 0x27, 0x0E, 0xC4, 0x06, + 0x57, 0xF2, 0xEE, 0xF0, 0x68, 0xE1, 0x49, 0xE8, 0xFB, 0xD8, 0x20, 0xE6, + 0x08, 0xD4, 0x69, 0xE5, 0xA7, 0xCC, 0x51, 0xDA, 0xC3, 0xC5, 0xE7, 0xC8, + 0x90, 0xCB, 0xFB, 0xBE, 0xF1, 0xD7, 0x4E, 0xC4, 0x88, 0xDF, 0xD8, 0xD6, + 0xC7, 0xE2, 0x13, 0xEC, 0x89, 0xE6, 0x28, 0xF6, 0x89, 0xF2, 0xE3, 0xF6, + 0x90, 0x03, 0xA3, 0xF7, 0xC5, 0x0C, 0x6C, 0xFA, 0x6E, 0x10, 0xAA, 0x01, + 0xAA, 0x16, 0x46, 0x08, 0xDA, 0x18, 0xD9, 0x05, 0x25, 0x16, 0x53, 0x02, + 0x35, 0x11, 0x5E, 0x0D, 0x48, 0x07, 0x2F, 0x1A, 0x8A, 0xFA, 0xF5, 0x1C, + 0xD6, 0xF6, 0x8A, 0x21, 0x43, 0xEA, 0x1D, 0x12, 0x2E, 0xDE, 0x8E, 0xF9, + 0x4F, 0xE4, 0x23, 0xEF, 0xD3, 0xF7, 0x6F, 0xF4, 0xFE, 0xFF, 0x91, 0xF9, + 0xA9, 0xFC, 0xF2, 0xF7, 0x5F, 0xF8, 0x7D, 0xF5, 0x0A, 0xF4, 0x61, 0xEF, + 0xFA, 0x00, 0xB9, 0xF5, 0x00, 0x06, 0xA2, 0xFE, 0x12, 0x01, 0x44, 0xFC, + 0x8B, 0xF4, 0x34, 0xF0, 0x54, 0xE8, 0xBA, 0xE9, 0x59, 0xEB, 0x8B, 0xF3, + 0x90, 0xF2, 0x95, 0x01, 0x44, 0x01, 0x5C, 0x09, 0x70, 0x1B, 0xCE, 0x1A, + 0xEC, 0x33, 0x01, 0x2B, 0x54, 0x3B, 0x19, 0x22, 0xC9, 0x40, 0x1E, 0x1D, + 0x67, 0x3D, 0x13, 0x17, 0x60, 0x21, 0x3E, 0x01, 0x57, 0x09, 0x2E, 0xEF, + 0x91, 0xFC, 0x14, 0xE2, 0x96, 0xF1, 0x32, 0xE1, 0x2F, 0xF9, 0x19, 0xF5, + 0x88, 0x01, 0x05, 0x02, 0x7F, 0xF8, 0x3D, 0xFB, 0x12, 0xF3, 0x5F, 0xF7, + 0x24, 0xFD, 0x9F, 0x00, 0xA6, 0x21, 0x1F, 0x0E, 0xC7, 0x40, 0xAC, 0x17, + 0x8B, 0x3D, 0xEB, 0x1D, 0x54, 0x2C, 0xF7, 0x1E, 0xFD, 0x26, 0x82, 0x20, + 0xC8, 0x26, 0x31, 0x21, 0x0A, 0x17, 0xF1, 0x22, 0xEC, 0x00, 0x3B, 0x27, + 0xB1, 0xF2, 0x02, 0x1E, 0x71, 0xE1, 0xA2, 0x01, 0xA0, 0xD5, 0xCD, 0xE8, + 0x43, 0xD2, 0x42, 0xE2, 0x0D, 0xD4, 0xDA, 0xE4, 0x71, 0xE3, 0x16, 0xE7, + 0x00, 0xF2, 0x47, 0xE6, 0x1E, 0xF7, 0xDB, 0xEC, 0x3D, 0xF2, 0x70, 0xF5, + 0x74, 0xF1, 0x7B, 0xFB, 0x35, 0xFC, 0x23, 0x04, 0x2A, 0xFD, 0x55, 0x06, + 0xE9, 0xF7, 0xDA, 0x04, 0x08, 0xFD, 0xAC, 0x09, 0x06, 0xFA, 0xFB, 0x0F, + 0x40, 0xF5, 0xB8, 0x19, 0x1E, 0xFE, 0x7D, 0x1F, 0xBE, 0x06, 0xE5, 0x13, + 0x9E, 0x0B, 0x08, 0xFF, 0x07, 0x09, 0xB8, 0xEF, 0x5A, 0x01, 0x2A, 0xE5, + 0x8F, 0xFC, 0x95, 0xE1, 0xB9, 0xFA, 0xEE, 0xE8, 0x57, 0xF5, 0xD7, 0xED, + 0x84, 0xDD, 0x04, 0xE2, 0x53, 0xD3, 0x89, 0xDB, 0x36, 0xD7, 0xA7, 0xDA, + 0x19, 0xDA, 0x13, 0xE1, 0x0F, 0xE4, 0x1C, 0xF0, 0x0B, 0xDD, 0xEA, 0xE6, + 0xA8, 0xCF, 0x90, 0xCA, 0xBF, 0xD7, 0x12, 0xC0, 0x4B, 0xED, 0xF1, 0xCD, + 0x28, 0x01, 0x7A, 0xE1, 0x26, 0xFB, 0x14, 0xE9, 0x16, 0xE7, 0x0C, 0xE4, + 0xBB, 0xE5, 0x8A, 0xEA, 0xC4, 0xEA, 0xC4, 0xF3, 0x3A, 0xEB, 0x14, 0xFA, + 0xF5, 0xF3, 0xBB, 0x0C, 0x83, 0x07, 0xAC, 0x25, 0x75, 0x19, 0x35, 0x39, + 0x5C, 0x1B, 0xCA, 0x3C, 0x75, 0x11, 0xF0, 0x36, 0xB3, 0x03, 0x55, 0x2C, + 0x5A, 0xF4, 0x29, 0x15, 0x02, 0xEC, 0x49, 0xF6, 0x00, 0xEF, 0x59, 0xE1, + 0x6F, 0xFC, 0xE6, 0xE3, 0x5E, 0x10, 0x56, 0xFB, 0xFA, 0x0D, 0xAB, 0xFE, + 0x66, 0xFA, 0x4A, 0xEE, 0x51, 0xF0, 0xF8, 0xE9, 0x33, 0xFA, 0x1C, 0xF9, + 0xCF, 0x0E, 0xB3, 0x08, 0xB9, 0x20, 0xCC, 0x08, 0x7A, 0x2E, 0x89, 0x06, + 0xA1, 0x2A, 0xCB, 0xFD, 0xB3, 0x30, 0x1A, 0x03, 0xCB, 0x3A, 0xE3, 0x0E, + 0x59, 0x34, 0xF3, 0x11, 0x36, 0x34, 0x4A, 0x20, 0x05, 0x31, 0x9D, 0x28, + 0xE0, 0x17, 0xF7, 0x11, 0x28, 0xF2, 0x93, 0xF1, 0xEE, 0xD3, 0x08, 0xDD, + 0x9D, 0xCA, 0x7E, 0xDF, 0xC2, 0xCD, 0x20, 0xEA, 0x92, 0xCA, 0x41, 0xE4, + 0x64, 0xC3, 0xC9, 0xDC, 0x0A, 0xBC, 0x98, 0xD6, 0xC8, 0xC3, 0x75, 0xDC, + 0x88, 0xDD, 0x7C, 0xEB, 0x80, 0xF1, 0xDE, 0xF2, 0x02, 0xED, 0x38, 0xE9, + 0x65, 0xE9, 0x7A, 0xE1, 0x7C, 0xF7, 0xA3, 0xED, 0x38, 0x05, 0x6B, 0xFE, + 0x9E, 0x0D, 0x9D, 0x0A, 0xD9, 0x12, 0x22, 0x16, 0xFD, 0x0A, 0x49, 0x14, + 0x47, 0xF9, 0xAA, 0x07, 0xAB, 0xF6, 0x02, 0x04, 0xF3, 0xF3, 0x43, 0xFA, + 0xFC, 0xF2, 0x01, 0xF5, 0x40, 0x03, 0x82, 0x03, 0x65, 0x05, 0x7A, 0x07, + 0xEB, 0xF5, 0x89, 0xF7, 0x27, 0xEF, 0x15, 0xED, 0x60, 0xF4, 0xE7, 0xF3, + 0x83, 0xFA, 0x59, 0xFF, 0xA6, 0xFF, 0x1D, 0x00, 0x6B, 0xFB, 0xB8, 0xF0, + 0xF8, 0xEA, 0x96, 0xE4, 0xE2, 0xEA, 0x5B, 0xFE, 0xE2, 0xF7, 0x71, 0x20, + 0x7D, 0xF2, 0x52, 0x1A, 0x1D, 0xE5, 0xC9, 0x06, 0x9E, 0xEB, 0x3A, 0x0B, + 0xAA, 0xFB, 0x1F, 0x15, 0xB4, 0x00, 0x4B, 0x08, 0x52, 0x0C, 0xF7, 0xFF, + 0xC9, 0x20, 0x83, 0x0F, 0x44, 0x25, 0x4E, 0x19, 0x70, 0x1C, 0x90, 0x12, + 0xB7, 0x18, 0xF7, 0x0B, 0xF3, 0x10, 0x63, 0x01, 0x3F, 0x02, 0xA3, 0xF2, + 0xDD, 0xF1, 0x7B, 0xD7, 0x87, 0xD9, 0x5C, 0xAD, 0x9A, 0xD3, 0x13, 0x9E, + 0xE0, 0xE8, 0x52, 0xB2, 0x30, 0xF7, 0xFC, 0xC2, 0x94, 0xFB, 0x0F, 0xCD, + 0x33, 0x04, 0x0F, 0xE8, 0x89, 0x10, 0xA4, 0x0D, 0xBB, 0x2B, 0xEA, 0x34, + 0x5E, 0x3C, 0xAF, 0x43, 0x48, 0x34, 0xA1, 0x37, 0xF2, 0x27, 0x6F, 0x2C, + 0x33, 0x19, 0x97, 0x24, 0x5B, 0x11, 0xB5, 0x28, 0x04, 0x0B, 0xAD, 0x39, + 0xBD, 0xFC, 0x88, 0x3E, 0x87, 0xF5, 0x69, 0x2F, 0x4C, 0xF4, 0x16, 0x10, + 0x5A, 0xEC, 0xDF, 0xEE, 0x3A, 0xE1, 0x8B, 0xE0, 0xEC, 0xE1, 0xA5, 0xE4, + 0x95, 0xED, 0xFD, 0xE9, 0x68, 0xF0, 0x06, 0xE5, 0x6E, 0xED, 0xFD, 0xE4, + 0x4B, 0xE7, 0x45, 0xEC, 0x35, 0xE4, 0xF0, 0xF3, 0x5F, 0xF7, 0xA6, 0x05, + 0xBA, 0x0E, 0xA6, 0x12, 0xE2, 0x10, 0xC2, 0x07, 0x78, 0x11, 0x51, 0xFF, + 0x75, 0x1E, 0xA7, 0x0A, 0xA5, 0x22, 0x7E, 0x13, 0xD3, 0x23, 0x12, 0x1A, + 0x9C, 0x2D, 0x6E, 0x24, 0x1C, 0x2C, 0x2A, 0x1F, 0xF0, 0x20, 0xE2, 0x10, + 0xB9, 0x13, 0x11, 0x03, 0x1D, 0x0D, 0xD8, 0xFE, 0x67, 0x09, 0xCA, 0xFF, + 0x6B, 0x0C, 0x62, 0x07, 0xC0, 0x0C, 0x38, 0x0B, 0xFD, 0x00, 0x00, 0x04, + 0xE3, 0xFD, 0xA7, 0x09, 0xCA, 0x00, 0x60, 0x18, 0xE0, 0x05, 0x70, 0x26, + 0x4B, 0xFD, 0xD1, 0x1D, 0xD8, 0xF1, 0x0A, 0x08, 0x15, 0xF1, 0xA7, 0xF6, + 0x92, 0xFD, 0x3A, 0xF6, 0xB1, 0x07, 0x7D, 0xFD, 0x92, 0xFE, 0x75, 0xF9, + 0x35, 0xF0, 0x56, 0xF0, 0x11, 0xFA, 0x51, 0xFC, 0x38, 0x0E, 0xE6, 0x10, + 0x57, 0x09, 0x3C, 0x0A, 0x4B, 0x0E, 0x0A, 0x08, 0x9F, 0x27, 0x0A, 0x18, + 0x7A, 0x32, 0x57, 0x21, 0xC3, 0x28, 0x89, 0x1F, 0x59, 0x1E, 0x85, 0x1C, + 0x8B, 0x1E, 0x1A, 0x1C, 0x96, 0x20, 0xCE, 0x18, 0xF0, 0x17, 0xB3, 0x0A, + 0xCF, 0xFD, 0x1B, 0xED, 0x14, 0xE6, 0x96, 0xD5, 0xC9, 0xE2, 0x0B, 0xDA, + 0x33, 0xE5, 0x11, 0xE8, 0xE5, 0xE7, 0x42, 0xEF, 0x1C, 0xEF, 0x1D, 0xF2, + 0x4A, 0xFB, 0xAD, 0xFD, 0xB0, 0x0B, 0x52, 0x15, 0x89, 0x11, 0xDB, 0x1D, + 0xB2, 0x11, 0x27, 0x12, 0x88, 0x0A, 0x45, 0xF9, 0x59, 0x06, 0x98, 0xEF, + 0xD8, 0x05, 0x18, 0xFA, 0xF2, 0xFD, 0x7E, 0x02, 0xE8, 0xF9, 0xC8, 0x0A, + 0xDD, 0xE8, 0xE4, 0x01, 0x4F, 0xD5, 0xD6, 0xF2, 0x4E, 0xCA, 0xA4, 0xEA, + 0x36, 0xC5, 0x04, 0xE8, 0x62, 0xCB, 0xDD, 0xEE, 0xDE, 0xD0, 0x0C, 0xEF, + 0x17, 0xD6, 0x91, 0xE8, 0x00, 0xD4, 0xD7, 0xDA, 0x99, 0xCF, 0x4B, 0xD2, + 0xE3, 0xDB, 0x94, 0xDE, 0x66, 0xE6, 0x52, 0xE6, 0x39, 0xF5, 0x32, 0xF0, + 0x12, 0x07, 0xFF, 0xFD, 0x44, 0x03, 0xDB, 0xF6, 0x43, 0xFB, 0xC9, 0xE9, + 0x4C, 0x03, 0xE2, 0xEB, 0x86, 0x14, 0x75, 0xFC, 0xD2, 0x20, 0xB0, 0x10, + 0x6C, 0x1F, 0x8C, 0x18, 0x26, 0x14, 0x4B, 0x12, 0xC0, 0x0A, 0x18, 0x0A, + 0x74, 0x05, 0xA1, 0x04, 0x89, 0x06, 0xE0, 0x04, 0xA9, 0x04, 0xEE, 0xFD, + 0xDB, 0x00, 0x6A, 0xED, 0xED, 0xF4, 0xB7, 0xD6, 0xC2, 0xE7, 0xBB, 0xCC, + 0xCD, 0xE4, 0x15, 0xD8, 0xBB, 0xEC, 0xDC, 0xEB, 0x04, 0xF7, 0xD6, 0xF5, + 0xE1, 0xFE, 0xA4, 0xF5, 0xDA, 0xFC, 0x56, 0xEE, 0xF6, 0xF4, 0x36, 0xE3, + 0x78, 0x0D, 0xE6, 0xF3, 0xF3, 0x1F, 0xE3, 0x01, 0x3C, 0x09, 0x78, 0xF4, + 0x0F, 0xFB, 0x13, 0xF8, 0x6A, 0x13, 0x3D, 0x1C, 0xF8, 0x21, 0x0E, 0x2D, + 0x0C, 0x1E, 0xC9, 0x29, 0x38, 0x25, 0x0B, 0x35, 0x86, 0x31, 0xAA, 0x42, + 0xB3, 0x39, 0xCA, 0x46, 0x75, 0x3A, 0x3C, 0x47, 0x40, 0x35, 0xD6, 0x4A, + 0x92, 0x24, 0x66, 0x42, 0x0E, 0x0E, 0x4F, 0x29, 0xF7, 0xFA, 0xAB, 0x0C, + 0x73, 0xF2, 0xB0, 0xFB, 0x23, 0xF5, 0x6F, 0xFA, 0x07, 0x03, 0xD5, 0x09, + 0xE9, 0x06, 0xE9, 0x12, 0x19, 0xF7, 0xC9, 0x05, 0x07, 0xF4, 0x42, 0x00, + 0x74, 0x04, 0x84, 0x09, 0xB2, 0x15, 0x26, 0x13, 0xB0, 0x1D, 0x6B, 0x18, + 0x9C, 0x1E, 0x09, 0x1B, 0x99, 0x1A, 0x8A, 0x1C, 0xD0, 0x10, 0x75, 0x1F, + 0x3D, 0x0C, 0xC9, 0x24, 0x6F, 0x13, 0xE4, 0x26, 0x29, 0x0C, 0x4F, 0x16, + 0x2F, 0xF2, 0x57, 0xFE, 0xE6, 0xD2, 0x2B, 0xEB, 0xA6, 0xB7, 0x73, 0xD9, + 0x77, 0xAF, 0x74, 0xCB, 0x38, 0xB5, 0x4F, 0xBF, 0x09, 0xBF, 0x64, 0xBB, + 0x49, 0xC1, 0x4A, 0xB4, 0x80, 0xC3, 0x09, 0xAD, 0x5E, 0xCE, 0xDA, 0xB5, + 0xF0, 0xD6, 0x60, 0xC3, 0xE5, 0xE6, 0x0E, 0xD6, 0x7C, 0xF9, 0xE7, 0xE8, + 0x05, 0xFD, 0x8D, 0xE9, 0xA7, 0xFD, 0x27, 0xE4, 0xE6, 0x07, 0xAC, 0xE8, + 0xCC, 0x0E, 0x6F, 0xE7, 0xCF, 0x0B, 0x4D, 0xDD, 0xE9, 0x07, 0xCC, 0xDE, + 0x5D, 0xFF, 0x4C, 0xE5, 0xF5, 0xF7, 0xCA, 0xEC, 0x37, 0xEF, 0x73, 0xF0, + 0x5F, 0xE9, 0xBB, 0xEF, 0xCE, 0xEC, 0x27, 0xF2, 0xCB, 0xEF, 0x91, 0xF6, + 0x36, 0xE9, 0x1A, 0xF3, 0xFA, 0xDC, 0x4D, 0xE6, 0x71, 0xDF, 0xEF, 0xE5, + 0x3F, 0xF6, 0xE2, 0xF8, 0x89, 0x07, 0x5D, 0x07, 0x1B, 0xFF, 0x0B, 0xFE, + 0x5F, 0xF4, 0xBF, 0xF1, 0x1D, 0xF0, 0x2A, 0xEF, 0x3D, 0xFA, 0xA5, 0x03, + 0xD7, 0x03, 0x60, 0x17, 0xBB, 0xFA, 0x2E, 0x0C, 0x1C, 0xFC, 0x73, 0x03, + 0x84, 0x17, 0x23, 0x19, 0x81, 0x23, 0xD3, 0x26, 0x62, 0x10, 0x10, 0x15, + 0x6B, 0x0D, 0x96, 0x0E, 0x59, 0x22, 0xD9, 0x1D, 0x99, 0x31, 0x85, 0x27, + 0x29, 0x2E, 0x4E, 0x1B, 0x0F, 0x28, 0xD1, 0x09, 0xD7, 0x1E, 0x5D, 0xFE, + 0x8D, 0x04, 0x1F, 0xF3, 0x83, 0xE1, 0x04, 0xE5, 0x68, 0xC4, 0xED, 0xD5, + 0x46, 0xC4, 0x5D, 0xDD, 0xDB, 0xDD, 0x98, 0xF7, 0x10, 0xF3, 0x45, 0x03, + 0xA9, 0x02, 0x41, 0x03, 0x60, 0x11, 0x62, 0x06, 0x81, 0x13, 0xCD, 0x0A, + 0x01, 0x0B, 0xA1, 0x0E, 0x2E, 0x09, 0x66, 0x10, 0x93, 0x12, 0x04, 0x12, + 0x52, 0x17, 0xE4, 0x12, 0x5C, 0x10, 0x2B, 0x10, 0xDA, 0x07, 0xF0, 0x0D, + 0x28, 0x00, 0x7D, 0x0B, 0xCF, 0xF4, 0x4F, 0x04, 0x00, 0xEC, 0xFA, 0x03, + 0x0A, 0xDC, 0xAC, 0xFE, 0x5D, 0xC6, 0x53, 0xE9, 0xAA, 0xC5, 0x90, 0xE1, + 0x94, 0xD3, 0x2B, 0xEF, 0xA8, 0xD8, 0xEA, 0xFA, 0x39, 0xCD, 0x9F, 0xF2, + 0xAE, 0xC0, 0xF3, 0xDB, 0xEB, 0xCF, 0xD3, 0xD4, 0x1A, 0xEA, 0x3C, 0xDD, + 0x05, 0xF6, 0xD1, 0xE5, 0x5A, 0x02, 0x3C, 0xF8, 0x8F, 0x0C, 0xC3, 0x0C, + 0xEE, 0x09, 0xED, 0x10, 0x4F, 0x0A, 0xBE, 0x0A, 0x9F, 0x1E, 0xC0, 0x0C, + 0xEB, 0x35, 0xA0, 0x0F, 0x33, 0x43, 0x5C, 0x11, 0x5F, 0x3F, 0xD5, 0x0F, + 0x94, 0x2E, 0xC9, 0x07, 0x4D, 0x20, 0x10, 0x03, 0x37, 0x15, 0xD2, 0x01, + 0x69, 0x19, 0xD7, 0x0A, 0xF3, 0x1F, 0xAC, 0x11, 0xE6, 0x20, 0x8C, 0x16, + 0x12, 0x13, 0x25, 0x10, 0xC4, 0xFF, 0x3A, 0x02, 0xEA, 0x06, 0x58, 0x08, + 0xC9, 0x1D, 0x67, 0x1A, 0x59, 0x23, 0x4A, 0x22, 0xC3, 0x11, 0x8D, 0x18, + 0x66, 0x03, 0x11, 0x0A, 0xC5, 0x01, 0x18, 0x02, 0xB5, 0x19, 0xE0, 0x14, + 0xC1, 0x2E, 0x2E, 0x24, 0x01, 0x1D, 0x88, 0x0E, 0xAB, 0x08, 0xA6, 0xFD, + 0x3E, 0x0D, 0xBB, 0x0D, 0x79, 0x0B, 0x31, 0x1B, 0x86, 0x01, 0x45, 0x19, + 0xB9, 0x0D, 0xB8, 0x25, 0x2E, 0x1D, 0x2A, 0x3A, 0xB4, 0x1E, 0x82, 0x3F, + 0xEC, 0x21, 0xE2, 0x35, 0xA8, 0x27, 0xE2, 0x26, 0x6A, 0x26, 0x3B, 0x1B, + 0x28, 0x16, 0x03, 0x0C, 0xBC, 0xF6, 0x95, 0xEE, 0x11, 0xE5, 0xB9, 0xD9, + 0xC4, 0xEA, 0xDE, 0xDD, 0xE3, 0xFB, 0xAB, 0xF3, 0x37, 0x04, 0x7B, 0xFC, + 0x04, 0x04, 0xEF, 0xF7, 0x8E, 0x05, 0x08, 0x01, 0x22, 0x00, 0x5D, 0x0E, + 0x24, 0x02, 0x32, 0x17, 0x89, 0x1A, 0x6B, 0x24, 0x13, 0x2E, 0xD4, 0x30, + 0xFC, 0x28, 0xCC, 0x36, 0xE8, 0x1D, 0xD1, 0x39, 0xBB, 0x1A, 0xB4, 0x35, + 0x69, 0x17, 0x16, 0x2A, 0xE3, 0x0C, 0x5D, 0x21, 0x8C, 0xFC, 0xA1, 0x18, + 0x96, 0xE2, 0xD1, 0xF9, 0xBE, 0xCC, 0x72, 0xD7, 0x8E, 0xC7, 0x4E, 0xD3, + 0x78, 0xCA, 0x05, 0xDF, 0xE9, 0xCF, 0xDE, 0xDE, 0x2D, 0xD3, 0x8A, 0xCF, + 0x8B, 0xD5, 0x0B, 0xC2, 0x75, 0xE0, 0x22, 0xC4, 0xCE, 0xF3, 0x83, 0xCE, + 0xA2, 0x0D, 0xFA, 0xD8, 0x95, 0x24, 0x58, 0xE5, 0x3D, 0x23, 0x8F, 0xEA, + 0x63, 0x1C, 0x4E, 0xED, 0x07, 0x22, 0xBD, 0xF7, 0x98, 0x21, 0x3E, 0x06, + 0xEB, 0x1E, 0xD9, 0x1A, 0x83, 0x21, 0x2B, 0x2D, 0xCD, 0x18, 0xCE, 0x2B, + 0x16, 0x01, 0xB6, 0x17, 0xF1, 0xED, 0xE6, 0x09, 0x97, 0xE7, 0xBB, 0x0A, + 0xEB, 0xED, 0xA6, 0x0C, 0x47, 0xFA, 0xC8, 0x0D, 0x1E, 0x06, 0xCA, 0x18, + 0x80, 0xFD, 0x27, 0x11, 0xE3, 0xE9, 0x15, 0xF5, 0x2A, 0xF2, 0xA2, 0xF3, + 0x51, 0x05, 0xED, 0xFE, 0xFB, 0x08, 0x42, 0x00, 0x93, 0xFD, 0x19, 0xFE, + 0x68, 0xF0, 0x00, 0xFB, 0xC5, 0xE6, 0x56, 0xF5, 0xB2, 0xFB, 0xD7, 0x0A, + 0x24, 0x20, 0xA2, 0x2A, 0x10, 0x12, 0x5D, 0x18, 0xFB, 0xED, 0x48, 0xF6, + 0xF3, 0xF9, 0x42, 0xFD, 0x3D, 0x15, 0x7A, 0x0A, 0xAE, 0x12, 0x74, 0x01, + 0x35, 0x14, 0xA9, 0x05, 0xFF, 0x1B, 0xC4, 0x0F, 0xAB, 0x22, 0xA7, 0x12, + 0xC3, 0x28, 0xC4, 0x11, 0x15, 0x1D, 0xEA, 0x08, 0x4C, 0x0B, 0xAF, 0x06, + 0x2F, 0x00, 0x3F, 0x03, 0x1D, 0xF1, 0x86, 0xEA, 0xB5, 0xE2, 0xF6, 0xD3, + 0xC5, 0xE2, 0xAF, 0xDC, 0x6D, 0xEB, 0xC0, 0xFA, 0xEF, 0xF0, 0x9F, 0x12, + 0x8F, 0xED, 0xBE, 0x12, 0xEA, 0xE8, 0x58, 0x05, 0x72, 0xE6, 0xBF, 0xF9, + 0x3D, 0xEA, 0xEA, 0xF5, 0x36, 0xF9, 0xE3, 0xFB, 0xFF, 0x04, 0xB9, 0x03, + 0x10, 0xFF, 0x1E, 0x02, 0x80, 0xF3, 0x3B, 0xFD, 0xE8, 0xF1, 0x91, 0xFF, + 0x4C, 0xF9, 0x0C, 0x05, 0x86, 0x03, 0xF4, 0x03, 0x87, 0x04, 0xA0, 0xF8, + 0x4F, 0xEC, 0x35, 0xDB, 0x08, 0xCD, 0x85, 0xBA, 0x93, 0xC4, 0xD2, 0xB0, + 0xA2, 0xCF, 0x0F, 0xB6, 0x50, 0xE1, 0xB8, 0xBD, 0xB5, 0xEA, 0xB2, 0xC6, + 0x71, 0xDF, 0x9D, 0xC8, 0x7D, 0xD4, 0xEF, 0xC5, 0xD4, 0xDC, 0x73, 0xCC, + 0x59, 0xEE, 0x87, 0xDB, 0x22, 0xFF, 0x95, 0xED, 0x4B, 0x06, 0x7D, 0xF8, + 0x95, 0x0B, 0x6B, 0xFA, 0x84, 0x13, 0xD5, 0xF6, 0x3A, 0x14, 0x9B, 0xF7, + 0xD8, 0x13, 0x28, 0x0A, 0xCB, 0x0C, 0x2D, 0x13, 0x08, 0xFB, 0xBA, 0x03, + 0x2E, 0xF0, 0x17, 0xF4, 0xB9, 0xF4, 0x2B, 0xF8, 0xD9, 0xF4, 0xDC, 0x05, + 0x9F, 0xED, 0x81, 0x11, 0x50, 0xEC, 0x99, 0x18, 0x76, 0xF2, 0xCC, 0x1B, + 0xB2, 0xF7, 0x47, 0x18, 0x31, 0xF0, 0x33, 0x04, 0xBD, 0xF6, 0xE3, 0x01, + 0x37, 0x0C, 0x75, 0x11, 0xFB, 0x13, 0x82, 0x11, 0x34, 0x08, 0xE3, 0x01, + 0x2C, 0xF5, 0x1B, 0xF2, 0xD0, 0xEB, 0x92, 0xED, 0x1A, 0x00, 0x58, 0x02, + 0x60, 0x21, 0x17, 0x21, 0xE5, 0x1A, 0xBF, 0x1A, 0x44, 0xF5, 0x71, 0xFC, + 0xF0, 0xF4, 0xEC, 0x01, 0xCA, 0x12, 0xFC, 0x1C, 0x60, 0x17, 0xF7, 0x1C, + 0x23, 0x1C, 0x08, 0x22, 0xA6, 0x38, 0x18, 0x40, 0x29, 0x44, 0xC4, 0x47, + 0x1C, 0x33, 0x8D, 0x31, 0x9D, 0x24, 0x1F, 0x21, 0xEB, 0x19, 0xB8, 0x15, + 0x67, 0x08, 0xFE, 0xFF, 0x71, 0xF4, 0xE1, 0xE7, 0x25, 0xDC, 0xE2, 0xD2, + 0xB9, 0xD4, 0x40, 0xD7, 0x0D, 0xE3, 0xA4, 0xF1, 0x8C, 0xF3, 0x7C, 0x05, + 0x46, 0xF6, 0x36, 0x04, 0xF4, 0xF4, 0x2E, 0xF6, 0xB6, 0x05, 0xE8, 0xF1, + 0x66, 0x1F, 0xE5, 0xF9, 0xD7, 0x2D, 0x24, 0x07, 0xEB, 0x29, 0xF2, 0x10, + 0x98, 0x1D, 0x42, 0x16, 0x37, 0x16, 0x50, 0x19, 0xC6, 0x19, 0x15, 0x1E, + 0xB7, 0x20, 0x34, 0x28, 0x60, 0x22, 0x2E, 0x31, 0x7B, 0x18, 0xFA, 0x2E, + 0x09, 0xF9, 0x2A, 0x17, 0xD9, 0xCD, 0x73, 0xF1, 0x4D, 0xBD, 0xE2, 0xDE, + 0x89, 0xD2, 0x9F, 0xEC, 0x77, 0xE4, 0x77, 0xF5, 0xA1, 0xEA, 0x49, 0xF3, + 0x3D, 0xF1, 0x51, 0xF7, 0x28, 0xE9, 0x5C, 0xED, 0xA0, 0xDF, 0x75, 0xDE, + 0x83, 0xED, 0xEF, 0xE6, 0x36, 0x02, 0x21, 0xF8, 0x4C, 0x0C, 0x4E, 0xFD, + 0xA0, 0x14, 0x4A, 0x00, 0xF6, 0x16, 0xFA, 0xFE, 0xDD, 0x13, 0xD8, 0xFC, + 0xCC, 0x19, 0xD4, 0x0D, 0xC1, 0x1B, 0x0F, 0x1D, 0x8C, 0x13, 0xF4, 0x18, + 0xD8, 0x0F, 0x32, 0x0D, 0x9E, 0x11, 0xB9, 0x01, 0xC2, 0x11, 0x9C, 0xF9, + 0xBF, 0x09, 0x6F, 0xF6, 0xA3, 0x04, 0x9B, 0xFD, 0xB7, 0x03, 0xB9, 0x03, + 0xEC, 0x01, 0x12, 0x03, 0x63, 0xF6, 0x44, 0xF7, 0x6F, 0xEF, 0x66, 0xF2, + 0x32, 0x02, 0x09, 0x08, 0xC3, 0x11, 0x6F, 0x18, 0xDD, 0x0D, 0x78, 0x11, + 0x11, 0x03, 0xF1, 0x03, 0x84, 0xFA, 0xB6, 0xFA, 0xA5, 0x01, 0x4C, 0xFF, + 0x30, 0x24, 0x07, 0x1F, 0x71, 0x39, 0x5C, 0x32, 0x44, 0x20, 0x0D, 0x16, + 0x02, 0x0C, 0xE8, 0xFA, 0x09, 0x21, 0xB3, 0x08, 0x1A, 0x2A, 0x26, 0x0D, + 0xC0, 0x16, 0x06, 0xFE, 0xD9, 0x22, 0x2E, 0x18, 0xCB, 0x37, 0xA1, 0x38, + 0xD5, 0x31, 0xB7, 0x32, 0x07, 0x2F, 0xE2, 0x26, 0xB9, 0x2D, 0xEA, 0x1E, + 0xC6, 0x16, 0xB5, 0x0E, 0x6F, 0xF2, 0xF8, 0xFE, 0xA3, 0xD7, 0x72, 0xF2, + 0xD7, 0xCF, 0x36, 0xE5, 0x19, 0xE6, 0x85, 0xEA, 0xA1, 0x06, 0xB8, 0xFF, + 0x35, 0x0C, 0xE9, 0x0E, 0xB7, 0xFE, 0xB3, 0x1A, 0x8B, 0xF3, 0x28, 0x21, + 0x42, 0xF5, 0x4C, 0x21, 0x63, 0x06, 0x6D, 0x2A, 0x0E, 0x18, 0x13, 0x33, + 0xEC, 0x1B, 0xA8, 0x2A, 0x21, 0x17, 0xE6, 0x18, 0x93, 0x0D, 0x3B, 0x09, + 0x77, 0x02, 0x89, 0x05, 0xB7, 0xF8, 0xD4, 0x06, 0x13, 0xF1, 0xCC, 0xFB, + 0xC3, 0xE1, 0xA9, 0xDB, 0xCB, 0xC5, 0x14, 0xB5, 0x34, 0xB4, 0xBD, 0xA1, + 0x51, 0xB0, 0xD5, 0xA2, 0x7B, 0xAC, 0x48, 0xAE, 0x96, 0xAE, 0xEC, 0xC0, + 0x49, 0xB8, 0x4A, 0xCB, 0x14, 0xBE, 0xA3, 0xBE, 0xCF, 0xC7, 0x1E, 0xB3, + 0x2A, 0xD9, 0x26, 0xBD, 0x2F, 0xE1, 0x6E, 0xCB, 0x3B, 0xE6, 0xA4, 0xD1, + 0x3E, 0xF1, 0xC0, 0xD8, 0xEA, 0xEF, 0x16, 0xDC, 0x5F, 0xEC, 0x34, 0xE1, + 0x30, 0xF9, 0x2D, 0xF1, 0x65, 0x04, 0xD4, 0x01, 0xDF, 0xF7, 0xB4, 0x04, + 0x4C, 0xDD, 0x65, 0xF8, 0x78, 0xC6, 0x47, 0xE5, 0x08, 0xC1, 0xFA, 0xD7, + 0xFA, 0xC6, 0x4F, 0xD8, 0x59, 0xC6, 0x88, 0xE0, 0x49, 0xC2, 0xB9, 0xEA, + 0x4D, 0xBE, 0x67, 0xEB, 0x9D, 0xBE, 0x8A, 0xE2, 0xBF, 0xBF, 0xC6, 0xD0, + 0xA3, 0xCC, 0xEC, 0xCB, 0x6C, 0xE7, 0x83, 0xE3, 0xDD, 0xF4, 0xA6, 0xF1, + 0x12, 0xF0, 0xBC, 0xE2, 0x68, 0xEE, 0xC9, 0xD4, 0xF2, 0xEE, 0x23, 0xD5, + 0x20, 0xFA, 0x8E, 0xE8, 0xB8, 0x1A, 0x74, 0x0E, 0x8F, 0x1A, 0x85, 0x0B, + 0x5E, 0xF0, 0x71, 0xD9, 0x20, 0xE9, 0x03, 0xCE, 0x48, 0x07, 0x27, 0xE9, + 0x38, 0x07, 0x30, 0xE9, 0x4C, 0x00, 0x9D, 0xEB, 0xE4, 0x1F, 0x2E, 0x13, + 0xFE, 0x3B, 0x67, 0x29, 0xAD, 0x40, 0x3D, 0x26, 0x46, 0x39, 0xA6, 0x25, + 0x08, 0x25, 0xA2, 0x1E, 0xFC, 0x0F, 0x30, 0x13, 0xE8, 0xFD, 0x65, 0x06, + 0x62, 0xEB, 0x1E, 0xF9, 0xFE, 0xE6, 0xC9, 0xFA, 0x99, 0xF8, 0x29, 0x0D, + 0xE8, 0x09, 0x31, 0x1C, 0x95, 0x04, 0x1F, 0x1C, 0xD1, 0xF8, 0xEB, 0x14, + 0x08, 0xFE, 0x39, 0x0B, 0xD0, 0x14, 0xB5, 0x09, 0x00, 0x36, 0x93, 0x1D, + 0x56, 0x43, 0x3D, 0x2E, 0xF2, 0x32, 0x75, 0x2A, 0xF4, 0x1B, 0x59, 0x20, + 0x5B, 0x0E, 0x65, 0x19, 0x23, 0x0C, 0x9B, 0x18, 0x83, 0x0D, 0xDE, 0x1C, + 0x55, 0x07, 0xD8, 0x18, 0x58, 0xEE, 0x69, 0x00, 0x5B, 0xD8, 0x02, 0xE3, + 0x31, 0xDD, 0x81, 0xD8, 0x12, 0xE7, 0xF2, 0xDD, 0x51, 0xEC, 0x14, 0xEE, + 0x8B, 0xFA, 0xFE, 0x01, 0x62, 0x0A, 0x24, 0x09, 0xA3, 0x16, 0x73, 0x0B, + 0x50, 0x1D, 0xDE, 0x10, 0x3B, 0x1E, 0x4F, 0x16, 0x60, 0x24, 0x96, 0x1C, + 0x3E, 0x2B, 0x83, 0x20, 0x9E, 0x28, 0x73, 0x23, 0xD1, 0x1B, 0x87, 0x26, + 0xE0, 0x16, 0x7B, 0x29, 0xA5, 0x24, 0x28, 0x32, 0x32, 0x34, 0x77, 0x3C, + 0x53, 0x31, 0xCE, 0x36, 0xB0, 0x1B, 0x03, 0x22, 0xBF, 0x0E, 0x31, 0x18, + 0x0D, 0x14, 0x3A, 0x21, 0x17, 0x13, 0xC9, 0x25, 0x69, 0x15, 0x21, 0x2B, + 0x02, 0x22, 0x6B, 0x2F, 0x2D, 0x1E, 0x8B, 0x1F, 0xE1, 0x09, 0xDC, 0x07, + 0x25, 0xFA, 0x52, 0xF8, 0x57, 0x07, 0x2D, 0xFF, 0xF2, 0x26, 0x80, 0x15, + 0xCE, 0x34, 0x3D, 0x1F, 0xCE, 0x26, 0x89, 0x11, 0x68, 0x10, 0xB0, 0xFB, + 0x2B, 0x0F, 0xA7, 0xF4, 0x92, 0x2E, 0x07, 0x15, 0x55, 0x4E, 0x02, 0x42, + 0x03, 0x3C, 0xFD, 0x35, 0xCF, 0x17, 0x63, 0x0A, 0x4D, 0x1E, 0x01, 0x0C, + 0x4E, 0x26, 0x5E, 0x1D, 0x4C, 0x04, 0x5C, 0x0A, 0xD2, 0xF7, 0x8D, 0x09, + 0x45, 0x14, 0x7F, 0x2B, 0x0B, 0x13, 0x93, 0x2D, 0x47, 0x03, 0xEC, 0x1D, + 0xA8, 0x04, 0xE0, 0x16, 0xB6, 0xFE, 0xBB, 0x03, 0xCC, 0xF0, 0xE9, 0xEF, + 0x8F, 0xEF, 0x49, 0xEB, 0xCB, 0xE7, 0x82, 0xE0, 0x51, 0xDC, 0x66, 0xDD, + 0x52, 0xEF, 0xEF, 0xFA, 0xE1, 0x00, 0x4D, 0x0C, 0xC0, 0xFB, 0xC2, 0xFA, + 0xB1, 0xF7, 0x31, 0xED, 0xB6, 0xF9, 0xF7, 0xF2, 0x79, 0xF7, 0x3F, 0xFB, + 0x29, 0x02, 0x47, 0x0A, 0xDA, 0x0E, 0x92, 0x14, 0x77, 0x05, 0x9C, 0x0E, + 0x08, 0xFA, 0x68, 0x06, 0x7A, 0xFD, 0x5E, 0x02, 0x1B, 0x0A, 0x20, 0x05, + 0x97, 0x0F, 0x18, 0x08, 0xBE, 0x03, 0xE2, 0xFE, 0xD9, 0xE0, 0x5B, 0xE0, + 0xC2, 0xBB, 0x23, 0xB8, 0x56, 0xB8, 0x60, 0xAC, 0x65, 0xCB, 0xE0, 0xBE, + 0xF7, 0xD5, 0xCE, 0xD1, 0xC9, 0xD6, 0x2D, 0xDE, 0x5E, 0xD8, 0x28, 0xE5, + 0x3A, 0xD9, 0xEB, 0xE0, 0x53, 0xE0, 0x29, 0xDC, 0x92, 0xF3, 0xBB, 0xEA, + 0xE0, 0xFD, 0x5D, 0xFA, 0xE9, 0xF7, 0x51, 0xF5, 0xCC, 0xF7, 0x19, 0xF0, + 0xB0, 0x00, 0x13, 0xF2, 0x1D, 0xFD, 0x4E, 0xEC, 0xB7, 0xF8, 0x05, 0xF2, + 0x15, 0xFD, 0xA2, 0x00, 0x51, 0xF1, 0xF2, 0xF2, 0xC9, 0xDE, 0x2A, 0xD9, + 0x53, 0xDC, 0x6B, 0xD6, 0x4D, 0xE0, 0xCC, 0xE2, 0x32, 0xDE, 0x35, 0xE8, + 0x3D, 0xE9, 0xF6, 0xEE, 0x8E, 0xF9, 0x54, 0xF2, 0x41, 0xF9, 0x29, 0xEE, + 0xC0, 0xEB, 0x98, 0xEA, 0xCC, 0xE1, 0x96, 0xE7, 0xFC, 0xF2, 0x74, 0xF4, + 0xBE, 0x0B, 0xD2, 0x03, 0x0C, 0x0D, 0xB0, 0xF9, 0x4F, 0xF9, 0xE4, 0xE0, + 0x14, 0xE5, 0x09, 0xCB, 0x73, 0xDE, 0x9B, 0xC4, 0x22, 0xF4, 0xCC, 0xE5, + 0x72, 0x0F, 0xD6, 0x11, 0x10, 0xF8, 0x79, 0xFF, 0x99, 0xDB, 0x55, 0xD3, + 0x0C, 0xFA, 0xDA, 0xE0, 0x56, 0x12, 0x20, 0xFE, 0x3A, 0xEE, 0xC5, 0xF9, + 0xA7, 0xE2, 0xD5, 0x0F, 0x88, 0x06, 0x6D, 0x39, 0xF3, 0x10, 0x84, 0x36, + 0x24, 0x0F, 0xE9, 0x2B, 0x89, 0x12, 0xA3, 0x2D, 0x99, 0x00, 0xC4, 0x1C, + 0x3A, 0xE5, 0xD6, 0x05, 0xB2, 0xD7, 0x47, 0xFC, 0x1E, 0xCD, 0xEE, 0xF4, + 0x72, 0xD7, 0x68, 0xFA, 0x0C, 0xFE, 0x1E, 0x15, 0x7A, 0x0E, 0xFB, 0x1B, + 0x22, 0x06, 0x35, 0x0C, 0xA9, 0x03, 0x0B, 0xFF, 0x2C, 0x0C, 0x21, 0xFB, + 0xE3, 0x18, 0xD6, 0x04, 0xD5, 0x24, 0x14, 0x0E, 0xE4, 0x20, 0x91, 0x03, + 0x30, 0x14, 0x99, 0xF6, 0x22, 0x10, 0xAC, 0xFA, 0xCC, 0x07, 0x69, 0xFF, + 0x2A, 0x06, 0x78, 0x04, 0x20, 0x0F, 0x5F, 0x08, 0xEF, 0x04, 0x1B, 0xF9, + 0xEE, 0xE0, 0xD5, 0xD5, 0x04, 0xC5, 0xFB, 0xB7, 0x71, 0xC6, 0x7B, 0xB5, + 0x35, 0xD2, 0x06, 0xC4, 0xF0, 0xD9, 0x89, 0xD4, 0xF8, 0xDE, 0x09, 0xDD, + 0xC0, 0xE0, 0xCD, 0xD7, 0x95, 0xEA, 0x40, 0xD2, 0xE3, 0x05, 0xD8, 0xDE, + 0xB7, 0x20, 0xB9, 0xF7, 0x17, 0x30, 0xBD, 0x0B, 0x20, 0x39, 0x60, 0x1D, + 0x5C, 0x30, 0xC7, 0x22, 0x4F, 0x20, 0x8B, 0x1C, 0x9E, 0x1F, 0x77, 0x22, + 0x9A, 0x24, 0x61, 0x30, 0x52, 0x22, 0xC0, 0x38, 0xE3, 0x19, 0x78, 0x36, + 0x24, 0x16, 0x5E, 0x30, 0x96, 0x16, 0xC7, 0x2A, 0x8D, 0x17, 0xF0, 0x29, + 0x36, 0x0C, 0xDE, 0x25, 0x96, 0x03, 0x84, 0x20, 0xDC, 0x0B, 0xC7, 0x21, + 0x9C, 0x14, 0x1E, 0x27, 0xA6, 0x12, 0x74, 0x25, 0x30, 0x0E, 0xDB, 0x19, + 0x5E, 0x1F, 0x9B, 0x1C, 0x79, 0x34, 0x80, 0x24, 0xCE, 0x2E, 0xF8, 0x1F, + 0x1B, 0x16, 0xB5, 0x15, 0xF6, 0x05, 0xF2, 0x0E, 0x2A, 0x02, 0xBD, 0x0A, + 0xD8, 0x15, 0xB7, 0x1C, 0x7C, 0x32, 0x41, 0x3B, 0x71, 0x19, 0x4B, 0x22, + 0x46, 0xED, 0x0E, 0xF4, 0x94, 0x02, 0x1C, 0x07, 0xDD, 0x2C, 0x45, 0x2A, + 0x34, 0x2A, 0xFF, 0x20, 0xA3, 0x2E, 0xC8, 0x22, 0xEE, 0x3B, 0x76, 0x36, + 0xB2, 0x23, 0xF7, 0x2F, 0x30, 0x0F, 0x81, 0x25, 0xF2, 0x0F, 0xF8, 0x21, + 0x0C, 0x05, 0xC4, 0x10, 0x8B, 0xF4, 0xCD, 0xFB, 0xE6, 0xF3, 0x37, 0xF2, + 0x4D, 0xF4, 0x19, 0xE8, 0x85, 0xF2, 0x76, 0xE6, 0x57, 0x01, 0x46, 0x00, + 0x2D, 0x09, 0xFE, 0x11, 0xD1, 0x02, 0xD5, 0x05, 0xE5, 0x0A, 0xB6, 0xF8, + 0x50, 0x15, 0xA3, 0xF9, 0x2F, 0x18, 0x80, 0x07, 0x09, 0x1E, 0x25, 0x14, + 0x2D, 0x12, 0x91, 0x07, 0xAB, 0x02, 0xB8, 0xF8, 0x49, 0x01, 0x92, 0xF9, + 0x1D, 0xF9, 0x44, 0xF2, 0x1A, 0xF9, 0x65, 0xED, 0x44, 0x04, 0x6F, 0xF2, + 0x2F, 0xFE, 0x1D, 0xEA, 0x02, 0xE3, 0x62, 0xD3, 0xE3, 0xCD, 0x17, 0xBB, + 0x53, 0xD3, 0xF4, 0xB6, 0xB0, 0xE8, 0x15, 0xD0, 0x85, 0xF7, 0x90, 0xEB, + 0x7D, 0xF4, 0x2A, 0xF6, 0xF2, 0xE4, 0x6B, 0xF3, 0x5D, 0xD8, 0x97, 0xEB, + 0xC6, 0xE0, 0x13, 0xEC, 0xFD, 0xFC, 0xA1, 0xFB, 0xD5, 0x0F, 0x23, 0x05, + 0x30, 0x0B, 0x2C, 0x02, 0xEE, 0xF9, 0x6C, 0xFD, 0x38, 0xE7, 0x70, 0xF6, + 0x01, 0xE3, 0x47, 0xF2, 0xA5, 0xF1, 0xA9, 0xFB, 0x17, 0xFC, 0x19, 0x02, + 0xE9, 0xEE, 0x0E, 0xEA, 0xA4, 0xD9, 0x24, 0xCC, 0xFB, 0xCD, 0xEA, 0xC5, + 0x54, 0xC7, 0x43, 0xD2, 0x28, 0xBA, 0xC5, 0xDA, 0x1D, 0xB8, 0x9F, 0xDF, + 0x88, 0xC1, 0x49, 0xDD, 0xF0, 0xC4, 0xD0, 0xCC, 0x81, 0xCA, 0xFF, 0xC2, + 0xDC, 0xCC, 0x63, 0xBF, 0x5C, 0xD8, 0x3C, 0xC8, 0x2D, 0xF4, 0xCA, 0xE0, + 0x74, 0x04, 0x97, 0xEE, 0xBE, 0xF8, 0xB7, 0xE2, 0x79, 0xDF, 0xE7, 0xD0, + 0xC7, 0xD0, 0x99, 0xCF, 0x7F, 0xDD, 0xD7, 0xE9, 0x7C, 0xF8, 0x87, 0x09, + 0xF1, 0xEC, 0x31, 0xFB, 0x3B, 0xC3, 0xBC, 0xD1, 0x4E, 0xCD, 0x74, 0xDC, + 0x4F, 0xEF, 0x49, 0x03, 0x04, 0xD7, 0xB0, 0xFA, 0xA9, 0xC4, 0xC0, 0xF5, + 0xF3, 0xE7, 0x5A, 0x1A, 0x2F, 0xF5, 0x1E, 0x1D, 0x67, 0xF1, 0x85, 0x07, + 0x7D, 0x00, 0x12, 0x0C, 0x08, 0xFB, 0xFA, 0x0A, 0xFD, 0xE1, 0xF6, 0xF7, + 0x6B, 0xE2, 0xC3, 0xEC, 0x62, 0xE5, 0x8A, 0xE1, 0x74, 0xDD, 0x12, 0xD5, + 0x40, 0xF0, 0xB2, 0xE5, 0x8F, 0x0C, 0x3C, 0x04, 0x20, 0x03, 0xE1, 0xF7, + 0x75, 0xF7, 0xDC, 0xDC, 0xF7, 0x0E, 0x13, 0xE8, 0x59, 0x24, 0x61, 0xFC, + 0x6D, 0x33, 0xEB, 0x08, 0xC4, 0x3D, 0xAB, 0x11, 0x98, 0x34, 0xC4, 0x0D, + 0xB8, 0x26, 0x4A, 0x05, 0xB6, 0x21, 0x7A, 0x08, 0x65, 0x21, 0xB7, 0x18, + 0xA5, 0x22, 0x63, 0x21, 0x52, 0x1E, 0x1B, 0x16, 0x4D, 0x0B, 0xDF, 0x03, + 0xE5, 0xEB, 0x48, 0xEC, 0xD2, 0xD7, 0x10, 0xE5, 0xD7, 0xE1, 0xEE, 0xFC, + 0xE7, 0xF6, 0x9D, 0x0C, 0xD8, 0x03, 0xC8, 0x00, 0xEB, 0x0B, 0xA5, 0xF8, + 0x83, 0x08, 0xA2, 0xF8, 0x66, 0xF8, 0x23, 0xF0, 0xEF, 0xFB, 0x9F, 0xFD, + 0x2F, 0x12, 0x6F, 0x1E, 0x83, 0x15, 0x12, 0x24, 0xDE, 0x12, 0x63, 0x1D, + 0x20, 0x19, 0x24, 0x1B, 0x2D, 0x15, 0x32, 0x0A, 0xA6, 0x12, 0x90, 0x08, + 0xD1, 0x13, 0x72, 0x1B, 0x35, 0x08, 0x9F, 0x17, 0x2D, 0x05, 0x8F, 0x07, + 0xF7, 0x0D, 0x8D, 0xFF, 0x15, 0x15, 0x41, 0x03, 0x1E, 0x15, 0x69, 0x0D, + 0x31, 0x0A, 0x67, 0x0F, 0x7A, 0x04, 0x84, 0x0D, 0x4E, 0x03, 0xC0, 0x04, + 0x08, 0x05, 0xCE, 0xFE, 0xB9, 0xFF, 0x5B, 0xF8, 0xF0, 0xF6, 0x3C, 0xF1, + 0xDA, 0xFD, 0xD0, 0xFB, 0xE0, 0xFF, 0xA2, 0x01, 0x1D, 0xF5, 0xB8, 0xF6, + 0x76, 0xEA, 0x7C, 0xEA, 0xB6, 0xE0, 0xDE, 0xE7, 0x9A, 0xEA, 0x89, 0x00, + 0x07, 0x0D, 0x8A, 0x2A, 0xFB, 0x0B, 0x85, 0x2A, 0x96, 0xDF, 0x07, 0x03, + 0x99, 0xD6, 0x69, 0xFE, 0x89, 0xF4, 0x2F, 0x1D, 0x56, 0xF8, 0x63, 0x1D, + 0x66, 0xF4, 0x20, 0x0B, 0x6B, 0x10, 0xB0, 0x17, 0xCC, 0x1B, 0xDF, 0x1C, + 0x80, 0x11, 0xBF, 0x0B, 0x58, 0x22, 0x3E, 0x0E, 0x56, 0x2F, 0x03, 0x14, + 0x7E, 0x1B, 0x9C, 0xFF, 0xF6, 0x0E, 0x9D, 0xEE, 0xF0, 0x09, 0x52, 0xEC, + 0x36, 0x04, 0xBD, 0xEB, 0xC8, 0x11, 0x11, 0xFA, 0x07, 0x22, 0x0B, 0x13, + 0xEB, 0x1E, 0x08, 0x1E, 0x63, 0x1A, 0x73, 0x17, 0xAB, 0x25, 0x48, 0x19, + 0x9B, 0x36, 0x42, 0x2C, 0xB0, 0x39, 0x0E, 0x35, 0xB4, 0x27, 0xBB, 0x2E, + 0x5B, 0x1B, 0xB8, 0x2F, 0xF2, 0x1F, 0x46, 0x31, 0xB5, 0x20, 0xD4, 0x2A, + 0xF0, 0x22, 0x5E, 0x32, 0x87, 0x26, 0x79, 0x35, 0x54, 0x2F, 0x9C, 0x2E, + 0x30, 0x31, 0x3B, 0x28, 0xD5, 0x13, 0xFD, 0x09, 0xC2, 0xFF, 0x0E, 0xF1, + 0x83, 0x0E, 0x9F, 0xFF, 0xC6, 0x17, 0x74, 0x09, 0x82, 0x0A, 0x51, 0xFC, + 0xC5, 0xFE, 0xE6, 0xFB, 0xC3, 0xF8, 0xDC, 0x00, 0x5A, 0xFA, 0xD0, 0xFF, + 0x67, 0x11, 0xF9, 0x13, 0x5D, 0x31, 0x96, 0x35, 0xD4, 0x3B, 0x2E, 0x39, + 0x72, 0x31, 0x32, 0x28, 0xDD, 0x2A, 0x25, 0x2B, 0x4D, 0x2D, 0x14, 0x3A, + 0x82, 0x2D, 0x6C, 0x41, 0xD4, 0x27, 0x78, 0x3F, 0x70, 0x1E, 0xB0, 0x34, + 0x74, 0x0C, 0x81, 0x20, 0x58, 0xF9, 0xE5, 0x0A, 0x72, 0xFC, 0x52, 0x07, + 0xA2, 0x0B, 0xC2, 0x10, 0xDB, 0x00, 0x7E, 0x0C, 0x22, 0xFB, 0x89, 0x0E, + 0x68, 0x07, 0xE5, 0x0F, 0xA8, 0x08, 0x30, 0xFC, 0x55, 0x07, 0x7E, 0xEE, + 0xB2, 0x09, 0x1C, 0xF2, 0x69, 0x11, 0x22, 0x00, 0xF2, 0x11, 0x62, 0x08, + 0x04, 0x01, 0xDD, 0xF9, 0x18, 0xF1, 0xEF, 0xE3, 0x40, 0xE7, 0x82, 0xD6, + 0x08, 0xE8, 0xCE, 0xDA, 0xBC, 0xFC, 0x00, 0xF6, 0x32, 0x08, 0xF0, 0x07, + 0x9F, 0xE2, 0xB6, 0xE7, 0xC2, 0xC7, 0x2A, 0xC8, 0xB4, 0xF2, 0x76, 0xEA, + 0xCE, 0x0C, 0xFF, 0x01, 0xE0, 0xF9, 0x71, 0xE9, 0x5D, 0x05, 0x54, 0xF2, + 0x26, 0x11, 0x7B, 0x09, 0x1B, 0xF7, 0x3D, 0xF5, 0xE4, 0xED, 0xE7, 0xE0, + 0x80, 0xEE, 0x09, 0xDC, 0xBC, 0xD4, 0xE5, 0xCC, 0x7F, 0xBE, 0x8C, 0xC1, + 0xFE, 0xB8, 0xA3, 0xC3, 0x05, 0xB7, 0x76, 0xC2, 0x76, 0xB8, 0x10, 0xBA, + 0x93, 0xBB, 0x91, 0xBB, 0x06, 0xC2, 0xB6, 0xC3, 0x20, 0xCB, 0x42, 0xBF, + 0x47, 0xCC, 0x29, 0xB9, 0x96, 0xD8, 0x95, 0xCF, 0x1B, 0xF4, 0xFA, 0xEF, + 0xFD, 0x04, 0x4D, 0xFF, 0x1F, 0x01, 0xCB, 0x03, 0x48, 0xEE, 0xE1, 0xF7, + 0x13, 0xF1, 0x3D, 0xF6, 0x35, 0xFF, 0x7A, 0x02, 0x27, 0xFF, 0x5E, 0x04, + 0x52, 0xFC, 0x6D, 0x09, 0x23, 0xE7, 0x08, 0x05, 0xD0, 0xCC, 0x57, 0xEC, + 0x37, 0xC8, 0xBF, 0xD9, 0xD1, 0xDA, 0x81, 0xEC, 0xDF, 0xF5, 0xC8, 0x0F, + 0x2E, 0xFA, 0x88, 0x0C, 0x8F, 0xF6, 0x86, 0xFC, 0x84, 0xFA, 0xC1, 0xFD, + 0xB5, 0xEF, 0x5C, 0xF3, 0x99, 0xE9, 0x9F, 0xEC, 0x95, 0x05, 0x76, 0x06, + 0x40, 0x20, 0xFD, 0x1D, 0x75, 0x1C, 0x9B, 0x1C, 0x8C, 0x10, 0xD0, 0x16, + 0x39, 0x0E, 0x2C, 0x10, 0xE2, 0x17, 0x11, 0x12, 0xBD, 0x21, 0x63, 0x1D, + 0xBB, 0x21, 0xB3, 0x20, 0x7E, 0x1B, 0xB0, 0x16, 0x5E, 0x0B, 0x52, 0x02, + 0x1E, 0xFE, 0xC1, 0xF6, 0x77, 0x06, 0x2E, 0xFE, 0xEE, 0x06, 0x46, 0xF8, + 0x93, 0xFD, 0x9B, 0xE8, 0x29, 0x08, 0x32, 0xEC, 0x57, 0x17, 0x06, 0xF6, + 0x66, 0x13, 0xFA, 0xF6, 0xA0, 0x07, 0xEC, 0xF7, 0x75, 0x06, 0x81, 0x04, + 0xD2, 0x0F, 0x48, 0x1A, 0x7F, 0x1D, 0x1E, 0x2D, 0xC3, 0x1D, 0x03, 0x2C, + 0xAE, 0x0E, 0x33, 0x24, 0x83, 0xF8, 0x51, 0x1E, 0xDF, 0xF8, 0x9D, 0x21, + 0x14, 0x1C, 0xAB, 0x3A, 0x4B, 0x21, 0x52, 0x37, 0xBF, 0x01, 0xFC, 0x0F, + 0x0C, 0x12, 0x06, 0x1E, 0xA3, 0x31, 0x62, 0x45, 0xC3, 0x10, 0x26, 0x26, + 0x13, 0x08, 0x20, 0x0F, 0x98, 0x3D, 0xDB, 0x2F, 0x5C, 0x4C, 0xB5, 0x2E, + 0x0A, 0x3B, 0x69, 0x19, 0x8C, 0x37, 0x37, 0x24, 0x8A, 0x26, 0xE2, 0x25, + 0x7E, 0x0C, 0xE4, 0x08, 0x20, 0x06, 0x17, 0xFD, 0x11, 0xFD, 0xB6, 0xF7, + 0x1C, 0xF8, 0xAD, 0xEB, 0x64, 0x06, 0xD7, 0xF4, 0xE2, 0x06, 0x44, 0xFE, + 0x57, 0xF7, 0x22, 0xF3, 0xBC, 0xEB, 0x9F, 0xE1, 0x2F, 0xFD, 0x6A, 0xEA, + 0x42, 0x21, 0x96, 0x04, 0x0A, 0x32, 0x16, 0x19, 0x1F, 0x28, 0x06, 0x23, + 0x79, 0x14, 0xF6, 0x18, 0x97, 0x08, 0x4B, 0x0F, 0x63, 0xF7, 0xE7, 0x0C, + 0x60, 0xF5, 0x07, 0x15, 0x20, 0xFF, 0x7C, 0x12, 0xFD, 0xF6, 0xAF, 0xF8, + 0xD0, 0xEB, 0xA3, 0xEA, 0xDF, 0xD0, 0xE5, 0xDA, 0x92, 0xB6, 0x5A, 0xCC, + 0x92, 0xC5, 0xE4, 0xD6, 0x0A, 0xE2, 0xB0, 0xDD, 0x26, 0xE8, 0x9D, 0xD1, + 0xB0, 0xEE, 0xFF, 0xD1, 0x78, 0xF7, 0xD4, 0xDC, 0xF9, 0xEB, 0x49, 0xDE, + 0x49, 0xEF, 0x13, 0xF2, 0x0F, 0x15, 0x84, 0x17, 0xDC, 0x32, 0xD2, 0x1F, + 0x2E, 0x32, 0x36, 0x0A, 0x15, 0x23, 0xE6, 0xFB, 0x55, 0x12, 0x77, 0xFC, + 0x3A, 0x0E, 0xED, 0x07, 0x7D, 0x19, 0x52, 0x1E, 0x9A, 0x1B, 0x6A, 0x22, + 0x1F, 0x0B, 0x3E, 0x0C, 0xAD, 0xF7, 0x83, 0xFD, 0x97, 0xF1, 0x08, 0x05, + 0x50, 0xF7, 0xE2, 0x1B, 0x30, 0xEB, 0x4A, 0x20, 0xA8, 0xE3, 0x05, 0x11, + 0xE4, 0xEE, 0xB0, 0x02, 0xD5, 0xF3, 0xEE, 0xFA, 0x88, 0xE8, 0xF0, 0xF3, + 0x8D, 0xDE, 0x4E, 0xF1, 0x93, 0xEC, 0xCC, 0x00, 0x80, 0x04, 0x33, 0x16, + 0x47, 0x02, 0xEC, 0x07, 0x35, 0xED, 0xE7, 0xE5, 0x0A, 0xE3, 0xE7, 0xD9, + 0xB1, 0xE1, 0x8F, 0xD5, 0x1F, 0xF8, 0xCB, 0xE6, 0x59, 0x12, 0xA3, 0x00, + 0x73, 0xF2, 0x94, 0xE4, 0x58, 0xC9, 0xA5, 0xC6, 0x08, 0xEA, 0x7C, 0xF7, + 0xA6, 0x0B, 0x9A, 0x18, 0x14, 0xF6, 0x3F, 0xF2, 0x10, 0xFA, 0x22, 0xF2, + 0xD5, 0x10, 0x3C, 0x12, 0x80, 0x05, 0x7C, 0x08, 0xB4, 0xFE, 0xAE, 0xFA, + 0x84, 0x03, 0x05, 0x02, 0x04, 0xF6, 0x4F, 0xFF, 0x10, 0xDF, 0x37, 0xF0, + 0x3A, 0xD2, 0x54, 0xE1, 0x90, 0xC9, 0x96, 0xCB, 0x0F, 0xD0, 0xC4, 0xC8, + 0x4D, 0xE9, 0xC6, 0xE0, 0x48, 0xF2, 0xF3, 0xDD, 0x57, 0xED, 0x65, 0xC7, + 0xEC, 0xEA, 0xFF, 0xCB, 0x80, 0xEF, 0x49, 0xE2, 0x7B, 0x01, 0x53, 0xF9, + 0x54, 0x13, 0xE8, 0x0F, 0xEE, 0x09, 0xFB, 0x0C, 0xC7, 0xF4, 0x1C, 0xFD, + 0x0C, 0xEC, 0x57, 0xF8, 0x13, 0xEA, 0xE2, 0xF1, 0xF3, 0xED, 0x9F, 0xF3, + 0xF4, 0xF0, 0xF7, 0xFE, 0x26, 0xEC, 0xC1, 0xF8, 0x5A, 0xD8, 0x19, 0xD8, + 0x2A, 0xC2, 0xB3, 0xBB, 0x1F, 0xBE, 0x53, 0xBE, 0xA1, 0xCF, 0x4F, 0xD2, + 0xBD, 0xE6, 0x98, 0xD6, 0x55, 0xEE, 0x3C, 0xCA, 0x8D, 0xEE, 0xF9, 0xC6, + 0x30, 0xF6, 0x58, 0xD7, 0x94, 0x01, 0x24, 0xEF, 0x55, 0x13, 0x85, 0x0D, + 0x8F, 0x28, 0x17, 0x2F, 0xE7, 0x26, 0x7C, 0x34, 0xBF, 0x13, 0x47, 0x23, + 0xDC, 0x0C, 0x32, 0x1A, 0x69, 0x18, 0xEB, 0x20, 0x58, 0x29, 0xC2, 0x2F, + 0x47, 0x34, 0xE2, 0x37, 0xAC, 0x30, 0x6F, 0x33, 0xD9, 0x16, 0x8B, 0x25, + 0xBD, 0xF7, 0xD1, 0x0E, 0x96, 0x02, 0x29, 0x11, 0x38, 0x21, 0x92, 0x2A, + 0xF4, 0x16, 0xD1, 0x24, 0xFC, 0x08, 0x29, 0x16, 0x6F, 0x14, 0x71, 0x18, + 0x7C, 0x13, 0x0C, 0x13, 0x88, 0x02, 0xBB, 0x0A, 0xDD, 0x0E, 0x15, 0x23, + 0x15, 0x30, 0xD7, 0x44, 0x8A, 0x32, 0xCE, 0x38, 0xDF, 0x18, 0x2A, 0x14, + 0x37, 0x06, 0x47, 0x08, 0x66, 0x01, 0xB3, 0x09, 0x55, 0x06, 0x10, 0x06, + 0x67, 0x21, 0x81, 0x18, 0x4C, 0x2F, 0x49, 0x28, 0x2D, 0x12, 0xEA, 0x0D, + 0xD4, 0x09, 0x80, 0x09, 0x2A, 0x30, 0x5F, 0x35, 0x63, 0x31, 0x27, 0x34, + 0xE8, 0x1B, 0x07, 0x19, 0x22, 0x3E, 0x40, 0x32, 0xBC, 0x57, 0x8C, 0x3E, + 0x34, 0x45, 0xB6, 0x27, 0x3C, 0x37, 0x98, 0x24, 0x52, 0x23, 0x94, 0x21, + 0xFB, 0x02, 0x0D, 0x0C, 0xA8, 0xF3, 0x6F, 0xFB, 0x21, 0xED, 0x48, 0xED, + 0xE1, 0xEB, 0x57, 0xE4, 0x5F, 0xFF, 0x7B, 0xF9, 0x82, 0x0A, 0x77, 0x12, + 0x6B, 0x05, 0x74, 0x10, 0x1B, 0x01, 0x15, 0x0B, 0xDB, 0x03, 0x54, 0x13, + 0x56, 0x12, 0xE0, 0x1E, 0x6F, 0x2A, 0xA6, 0x34, 0x1B, 0x36, 0x76, 0x3F, + 0x61, 0x26, 0x25, 0x24, 0x2F, 0x15, 0x6D, 0x0A, 0x07, 0x07, 0x78, 0xFF, + 0x1F, 0x00, 0x1C, 0xF9, 0xBA, 0x07, 0xFF, 0xFD, 0x46, 0x0A, 0x5B, 0xFF, + 0x63, 0xFF, 0x63, 0xF5, 0x44, 0xDE, 0xAB, 0xD8, 0xC0, 0xC2, 0x72, 0xBD, + 0x47, 0xD8, 0x45, 0xC7, 0xA1, 0xF8, 0xD1, 0xD5, 0xF5, 0x02, 0xFA, 0xD9, + 0xE6, 0x08, 0x80, 0xE7, 0x9F, 0x01, 0x3B, 0xF0, 0xA2, 0xEC, 0x9D, 0xF1, + 0x32, 0xE5, 0x86, 0xFE, 0xF9, 0xF2, 0x87, 0x0F, 0x44, 0x08, 0x16, 0x14, + 0x00, 0x14, 0x14, 0x10, 0x9A, 0x11, 0xA8, 0x07, 0x98, 0x08, 0x25, 0xFF, + 0xA1, 0x02, 0x8F, 0xFF, 0x5B, 0x0D, 0x97, 0x0F, 0x55, 0x17, 0xBA, 0x19, + 0x0F, 0x0A, 0x13, 0x0E, 0x52, 0xFA, 0x63, 0x06, 0x45, 0xEA, 0x3C, 0x04, + 0x17, 0xE0, 0x78, 0x09, 0xF0, 0xDC, 0x09, 0x0B, 0x9F, 0xD7, 0x98, 0xF9, + 0xD8, 0xD7, 0x63, 0xE9, 0xD0, 0xD6, 0xF1, 0xE1, 0x08, 0xDD, 0x17, 0xE5, + 0x0E, 0xE5, 0x3C, 0xEA, 0x98, 0xEF, 0xF5, 0xF6, 0x29, 0x07, 0x45, 0x0B, + 0x95, 0x15, 0x8C, 0x10, 0xBA, 0x0A, 0x66, 0x00, 0x4F, 0xF7, 0x20, 0xF0, + 0x7E, 0xEC, 0xF8, 0xED, 0x34, 0xFD, 0xE1, 0xFF, 0x96, 0x1D, 0xB9, 0x1A, + 0xDA, 0x08, 0x46, 0x06, 0xBA, 0xD2, 0x25, 0xDA, 0xC2, 0xD7, 0x61, 0xE9, + 0xEA, 0xFE, 0x9D, 0x0C, 0x97, 0xFC, 0xA0, 0xFD, 0x7B, 0xF4, 0x79, 0xF0, + 0x9B, 0x0F, 0x13, 0x0A, 0x0F, 0x14, 0x23, 0x0A, 0x7C, 0x00, 0x3B, 0xFB, + 0xC6, 0x05, 0xE6, 0x0C, 0x66, 0xFF, 0xBA, 0x07, 0x40, 0xE6, 0xD3, 0xE0, + 0x08, 0xE5, 0xD6, 0xD1, 0xFB, 0xDF, 0x46, 0xC6, 0x31, 0xCC, 0xC6, 0xB3, + 0xBC, 0xE0, 0x96, 0xCC, 0xB9, 0x03, 0x78, 0xEA, 0x4F, 0xFA, 0x83, 0xE0, + 0x3F, 0xE8, 0x61, 0xD9, 0xE1, 0xF1, 0xF3, 0xE7, 0x3A, 0x04, 0x0E, 0xF9, + 0x7B, 0x13, 0x11, 0x06, 0x4B, 0x1D, 0x10, 0x0C, 0xDE, 0x15, 0xA7, 0x05, + 0x1C, 0x00, 0x31, 0xFB, 0xA5, 0xEA, 0x36, 0xF1, 0x24, 0xE5, 0x58, 0xF0, + 0x5D, 0xE9, 0xCA, 0xF6, 0x03, 0xE7, 0xC7, 0xF6, 0xBB, 0xD5, 0xE2, 0xE1, + 0x1B, 0xB4, 0x2F, 0xB8, 0x3F, 0xA4, 0x0D, 0xA2, 0x03, 0xB8, 0x24, 0xAE, + 0xD9, 0xCF, 0xAD, 0xC4, 0x5D, 0xD9, 0x5D, 0xD4, 0x5B, 0xE6, 0xFD, 0xE1, + 0xDB, 0xEA, 0x98, 0xE6, 0xEF, 0xDA, 0x5B, 0xE5, 0xA1, 0xDC, 0xA2, 0xF4, + 0xEF, 0xEF, 0x28, 0x04, 0x9F, 0xF8, 0xB4, 0x02, 0x2C, 0x01, 0x10, 0xFD, + 0xB4, 0x06, 0xFA, 0xFB, 0x7E, 0x01, 0x1D, 0x01, 0x01, 0x05, 0x11, 0x11, + 0x7F, 0x0C, 0x4E, 0x23, 0x7C, 0x05, 0x08, 0x27, 0x90, 0xF8, 0x60, 0x1B, + 0x1C, 0xF5, 0xA6, 0x13, 0x32, 0xF9, 0xBD, 0x12, 0xEE, 0x02, 0xC7, 0x0C, + 0x30, 0x03, 0xC1, 0xF7, 0x0A, 0xFA, 0x7D, 0xE5, 0x38, 0xEC, 0xE6, 0xE4, + 0x99, 0xDE, 0xE6, 0xE6, 0xBA, 0xE8, 0x91, 0xEC, 0x1A, 0xFA, 0xB0, 0xF0, + 0xD8, 0x07, 0x5F, 0xF5, 0x2B, 0x16, 0xAD, 0x02, 0x59, 0x15, 0x85, 0x07, + 0xD7, 0x05, 0xAE, 0xFA, 0x33, 0xFC, 0xA4, 0xEB, 0x4A, 0xFA, 0x48, 0xE4, + 0xD6, 0x07, 0x14, 0xF2, 0xFC, 0x1E, 0xC9, 0x11, 0x7D, 0x02, 0x04, 0x08, + 0x55, 0xD0, 0xB4, 0xDF, 0x1F, 0xE5, 0xCC, 0xEA, 0x25, 0x0D, 0xA7, 0x04, + 0x46, 0x04, 0x19, 0xEF, 0x22, 0x0D, 0xB4, 0xEC, 0xB2, 0x36, 0xD9, 0x11, + 0xCD, 0x34, 0x6F, 0x17, 0x88, 0x1E, 0x44, 0x18, 0xC8, 0x1F, 0x68, 0x31, + 0x63, 0x17, 0x21, 0x29, 0x62, 0xFE, 0xD3, 0x05, 0xDB, 0xF1, 0xEC, 0xFC, + 0x09, 0xE9, 0x21, 0x01, 0xA7, 0xDD, 0x80, 0xFB, 0x92, 0xF6, 0xB9, 0x04, + 0x26, 0x12, 0x18, 0x10, 0x9D, 0x0A, 0x62, 0x0F, 0x10, 0x02, 0xB6, 0x13, + 0x56, 0x0D, 0xBE, 0x1E, 0x1B, 0x1E, 0xEB, 0x28, 0x0B, 0x24, 0x4A, 0x2E, + 0x7A, 0x26, 0x51, 0x32, 0xDF, 0x1D, 0xAA, 0x2A, 0x3D, 0x13, 0x87, 0x1C, + 0x1A, 0x17, 0xE6, 0x19, 0x72, 0x1D, 0x3E, 0x20, 0x19, 0x16, 0x6A, 0x21, + 0x60, 0x06, 0xAD, 0x17, 0xB1, 0xF2, 0x0D, 0xFD, 0x4E, 0xE1, 0xFD, 0xDF, + 0xB8, 0xE6, 0xCA, 0xD8, 0x34, 0xFD, 0x78, 0xE3, 0xF2, 0x0B, 0x60, 0xEA, + 0x98, 0x0B, 0x25, 0xEB, 0x0E, 0x08, 0xA2, 0xF3, 0x4B, 0x05, 0x53, 0x02, + 0x44, 0x09, 0x48, 0x11, 0xCE, 0x15, 0x37, 0x1E, 0x14, 0x20, 0xD9, 0x2F, + 0x5B, 0x22, 0x14, 0x37, 0xD4, 0x1C, 0xD0, 0x2A, 0xF5, 0x15, 0x75, 0x23, + 0x38, 0x13, 0x50, 0x2A, 0x78, 0x1A, 0x24, 0x37, 0xFA, 0x26, 0xC3, 0x42, + 0xE3, 0x2B, 0x9A, 0x47, 0xAD, 0x1D, 0x20, 0x35, 0x3D, 0x10, 0x86, 0x1D, + 0xEF, 0x14, 0x80, 0x11, 0x4B, 0x1B, 0x76, 0x09, 0xC9, 0x18, 0xD7, 0x06, + 0xEC, 0x18, 0xBA, 0x0E, 0x2C, 0x1E, 0x6E, 0x11, 0x9B, 0x1C, 0x7F, 0x02, + 0xA8, 0x1D, 0x79, 0xF8, 0xCA, 0x24, 0xC1, 0xF1, 0x36, 0x33, 0x77, 0xF3, + 0xF5, 0x43, 0x1E, 0x03, 0xA1, 0x41, 0xE3, 0x0D, 0x94, 0x2B, 0x47, 0x0E, + 0x59, 0x15, 0x3D, 0x0E, 0xC6, 0x07, 0x7B, 0x0F, 0xF3, 0x12, 0x69, 0x21, + 0xA0, 0x28, 0x8B, 0x3C, 0xD0, 0x12, 0xDF, 0x26, 0xF8, 0xF2, 0x69, 0x00, + 0x2D, 0x06, 0x31, 0x0D, 0x83, 0x1C, 0x8B, 0x1F, 0x78, 0x0B, 0x1C, 0x0B, + 0xE5, 0x11, 0x12, 0x13, 0x68, 0x32, 0xB1, 0x38, 0xB5, 0x2A, 0x69, 0x32, + 0x91, 0x18, 0x57, 0x25, 0x11, 0x17, 0x61, 0x2D, 0x89, 0x02, 0xE6, 0x1A, + 0xC9, 0xE9, 0x52, 0xF5, 0x03, 0xE9, 0x28, 0xE4, 0xA5, 0xDD, 0x91, 0xD8, + 0x0B, 0xCC, 0xD4, 0xD5, 0xDF, 0xE0, 0x4A, 0xF1, 0x7B, 0xF8, 0xBA, 0x00, + 0x02, 0xEF, 0xDE, 0xF5, 0xA6, 0xE1, 0x19, 0xED, 0xA5, 0xEC, 0xDF, 0xEB, + 0x48, 0x07, 0x2D, 0xEF, 0xF2, 0x14, 0x66, 0xF7, 0xC7, 0x07, 0x9E, 0xFD, + 0x9A, 0xF0, 0x83, 0x00, 0x4D, 0xE5, 0x27, 0x02, 0xB8, 0xE1, 0xC0, 0xFA, + 0x79, 0xE1, 0xC1, 0xF1, 0xBD, 0xE9, 0xDA, 0xF2, 0x58, 0xE8, 0xC1, 0xEC, + 0x0D, 0xC9, 0x0C, 0xCD, 0x76, 0xA8, 0x05, 0xAC, 0xF0, 0xA2, 0x6F, 0xA0, + 0xD5, 0xAC, 0xEB, 0xA7, 0x79, 0xB6, 0xD0, 0xB5, 0xC4, 0xBB, 0xCA, 0xBA, + 0x5F, 0xC0, 0x83, 0xBA, 0x57, 0xC3, 0xAF, 0xBD, 0xBC, 0xC9, 0xA5, 0xCB, + 0x35, 0xD5, 0x38, 0xE1, 0x7D, 0xD8, 0x5D, 0xEC, 0xBB, 0xD7, 0x71, 0xEC, + 0x7D, 0xD4, 0xD5, 0xE9, 0xD9, 0xCF, 0x51, 0xE9, 0xA9, 0xD8, 0x72, 0xEE, + 0x18, 0xF1, 0x58, 0xF4, 0x74, 0x0A, 0xE8, 0xF4, 0x1B, 0x0D, 0x1B, 0xE7, + 0x50, 0xFD, 0x6E, 0xD5, 0x2A, 0xF4, 0xB1, 0xD5, 0x4C, 0xF7, 0x23, 0xDF, + 0x49, 0x01, 0x25, 0xEB, 0x79, 0x02, 0x06, 0xF4, 0xDF, 0xFB, 0x38, 0xF8, + 0x61, 0xF3, 0x5A, 0xF7, 0x36, 0xF1, 0xBF, 0xF7, 0x10, 0xF3, 0xAE, 0xF6, + 0x7F, 0xEE, 0x1F, 0xED, 0xF7, 0xFA, 0x5C, 0xFA, 0x1E, 0x0F, 0xB0, 0x0F, + 0xA3, 0x0B, 0xA7, 0x0B, 0x75, 0xFF, 0x9D, 0x03, 0x2E, 0xFD, 0xFE, 0x03, + 0xE1, 0xFB, 0x5D, 0xFA, 0xF0, 0x07, 0x2C, 0xFB, 0x6C, 0x1E, 0xCC, 0x13, + 0x51, 0x0B, 0xA4, 0x0A, 0xFC, 0xEB, 0xA5, 0xED, 0xC6, 0x03, 0x12, 0xFA, + 0x02, 0x1C, 0xE3, 0x06, 0x05, 0x0C, 0x41, 0xFB, 0x50, 0x0F, 0x45, 0x06, + 0x02, 0x26, 0x48, 0x1B, 0x4F, 0x22, 0xFC, 0x16, 0xD3, 0x18, 0xB1, 0x13, + 0x58, 0x18, 0x42, 0x14, 0xEF, 0x09, 0x69, 0x01, 0x79, 0xF7, 0xE8, 0xEE, + 0x19, 0xE9, 0x1C, 0xE8, 0x1A, 0xD8, 0x48, 0xE3, 0x4A, 0xDB, 0x4C, 0xEC, + 0x50, 0xF7, 0x3F, 0x02, 0x83, 0x08, 0x68, 0x09, 0x85, 0x0C, 0xC9, 0x07, + 0x7D, 0x14, 0x4A, 0x0A, 0xF1, 0x1A, 0x55, 0x0B, 0x99, 0x24, 0xD9, 0x17, + 0x01, 0x2E, 0x08, 0x2B, 0x77, 0x27, 0x05, 0x31, 0x49, 0x18, 0xF7, 0x2A, + 0xA5, 0x11, 0x1A, 0x26, 0xE4, 0x0C, 0xAC, 0x25, 0x3C, 0x05, 0xF3, 0x25, + 0x3D, 0x03, 0x25, 0x23, 0xCE, 0xFD, 0x08, 0x18, 0xCA, 0xEB, 0xFB, 0x05, + 0xBE, 0xDF, 0xF8, 0xF4, 0x2C, 0xE9, 0xC4, 0xEF, 0x9D, 0xFF, 0x2D, 0xF9, + 0x4B, 0x12, 0x64, 0x07, 0x29, 0x11, 0x7A, 0x0D, 0x42, 0x0A, 0xA0, 0x12, + 0x48, 0x09, 0xD0, 0x17, 0x70, 0x0C, 0x3E, 0x18, 0x2A, 0x1C, 0xD4, 0x1F, + 0xBE, 0x2C, 0xDE, 0x28, 0xF9, 0x29, 0xFE, 0x29, 0xB3, 0x1C, 0x28, 0x2B, + 0x92, 0x15, 0xD6, 0x28, 0x29, 0x15, 0x08, 0x1F, 0x4C, 0x1F, 0x73, 0x1C, + 0xCB, 0x2B, 0x7F, 0x21, 0x69, 0x24, 0x85, 0x1A, 0xAB, 0x10, 0x14, 0x10, + 0x12, 0x07, 0xE7, 0x0F, 0x6B, 0x09, 0xF7, 0x0D, 0xD3, 0x13, 0xF2, 0x0D, + 0xD9, 0x16, 0x26, 0x0E, 0x03, 0x07, 0xF7, 0x09, 0xD5, 0xF6, 0x2D, 0x07, + 0xB9, 0xF6, 0x81, 0x00, 0xCB, 0x02, 0x2D, 0xF3, 0x99, 0x0C, 0x52, 0xEA, + 0xB1, 0x13, 0x1D, 0xEE, 0x20, 0x1E, 0x92, 0xF7, 0x2C, 0x1F, 0x21, 0xFC, + 0xFA, 0x17, 0x2F, 0x01, 0xE3, 0x0D, 0xD0, 0x09, 0x9A, 0x04, 0x23, 0x0B, + 0xA5, 0x08, 0x70, 0x08, 0xAF, 0x0B, 0x97, 0x06, 0xDE, 0xF8, 0x30, 0x02, + 0x2E, 0xDD, 0x80, 0xFA, 0xAF, 0xDD, 0x75, 0xFC, 0xEE, 0xF0, 0x8D, 0x05, + 0x83, 0xF8, 0x23, 0x06, 0x65, 0xFF, 0xF8, 0x0B, 0xE7, 0x09, 0xCE, 0x16, + 0xEF, 0x05, 0x79, 0x14, 0x2E, 0xF8, 0xEE, 0x06, 0x03, 0xF8, 0xA7, 0xFD, + 0xC4, 0xF8, 0x33, 0xF5, 0x09, 0xEF, 0xE0, 0xEB, 0xD6, 0xE3, 0xA4, 0xE8, + 0x48, 0xD6, 0x00, 0xD8, 0x2C, 0xDB, 0xE6, 0xC7, 0x73, 0xED, 0xD8, 0xC9, + 0xC1, 0xE9, 0xC0, 0xCA, 0x4F, 0xE2, 0xC4, 0xCB, 0xD8, 0xEC, 0x25, 0xD1, + 0x88, 0xF9, 0xAB, 0xD6, 0x59, 0x01, 0xAA, 0xDD, 0x50, 0xFD, 0x1E, 0xE5, + 0x35, 0xF0, 0x18, 0xEB, 0x37, 0xE9, 0x97, 0xEC, 0x49, 0xE8, 0xA1, 0xE6, + 0x95, 0xE9, 0x89, 0xDD, 0x09, 0xE8, 0x12, 0xD6, 0x03, 0xDD, 0xB2, 0xCF, + 0xD9, 0xCD, 0xED, 0xCB, 0x87, 0xC6, 0x9C, 0xC9, 0x6D, 0xC6, 0x83, 0xCC, + 0x3A, 0xCF, 0xBF, 0xDB, 0x83, 0xDD, 0x58, 0xEB, 0x11, 0xE9, 0xED, 0xEE, + 0x59, 0xF2, 0x21, 0xED, 0x15, 0xF2, 0x29, 0xEC, 0x41, 0xE5, 0x9E, 0xEA, + 0x08, 0xDC, 0x56, 0xEC, 0x11, 0xE6, 0x4A, 0xF2, 0xC6, 0xF4, 0x1D, 0xF4, + 0xA7, 0xF4, 0x3C, 0xF4, 0xAD, 0xEB, 0x1D, 0xF7, 0x42, 0xE5, 0x70, 0xF5, + 0x2B, 0xEC, 0xAF, 0xF2, 0x11, 0xFF, 0x17, 0xF6, 0xE7, 0x0C, 0x64, 0xFC, + 0x42, 0x07, 0x24, 0x01, 0xDB, 0xFC, 0x1A, 0x08, 0x12, 0xFA, 0xB2, 0x0E, + 0xAC, 0xF5, 0xB0, 0x0B, 0x7C, 0xF8, 0x18, 0x07, 0xEE, 0x02, 0xE5, 0x06, + 0x58, 0x03, 0xBF, 0x02, 0xFA, 0xFA, 0xF7, 0xF8, 0x91, 0xF5, 0x02, 0xF4, + 0x21, 0xF5, 0x92, 0xF9, 0xD0, 0xF3, 0x21, 0xFD, 0x5A, 0xFA, 0xB6, 0x07, + 0xFE, 0x0C, 0x4A, 0x24, 0x52, 0x18, 0x09, 0x36, 0x2A, 0x1B, 0xF2, 0x33, + 0xC8, 0x1F, 0x08, 0x2D, 0x70, 0x1C, 0x75, 0x1F, 0x6E, 0x14, 0x17, 0x17, + 0xC2, 0x14, 0xC9, 0x1D, 0x0D, 0x10, 0x31, 0x20, 0x5F, 0x05, 0x9D, 0x1C, + 0xD9, 0x02, 0x17, 0x1A, 0x00, 0x0A, 0x5E, 0x12, 0xFE, 0x13, 0x7C, 0x06, + 0x6A, 0x1B, 0x8C, 0x04, 0x0E, 0x1D, 0x2E, 0x10, 0x29, 0x1E, 0xF7, 0x1D, + 0xB0, 0x28, 0x3F, 0x2A, 0x69, 0x33, 0xA8, 0x2D, 0x0B, 0x30, 0x2A, 0x22, + 0x43, 0x26, 0x31, 0x19, 0x2F, 0x1C, 0x6F, 0x16, 0x8E, 0x0F, 0x39, 0x0D, + 0xAA, 0x06, 0x0C, 0x02, 0x17, 0x0C, 0xB6, 0xFD, 0x70, 0x1A, 0xB1, 0xFF, + 0x8A, 0x1D, 0x3B, 0xFD, 0xA6, 0x19, 0xB1, 0xFB, 0xA4, 0x1E, 0x71, 0x0B, + 0x0C, 0x21, 0x55, 0x1D, 0x6B, 0x1E, 0xD6, 0x26, 0xE3, 0x1E, 0x1D, 0x2B, + 0x21, 0x1D, 0xD6, 0x24, 0xE3, 0x1D, 0x28, 0x21, 0xBC, 0x1C, 0xDC, 0x20, + 0x72, 0x11, 0xD9, 0x17, 0x61, 0x04, 0xC6, 0x0C, 0x8B, 0xFE, 0xA4, 0x06, + 0xDA, 0xFE, 0x77, 0x06, 0x0E, 0x02, 0x85, 0x08, 0x22, 0x09, 0x40, 0x05, + 0x5C, 0x11, 0x57, 0x00, 0x73, 0x16, 0xCD, 0x01, 0x1B, 0x15, 0xD0, 0x04, + 0x4C, 0x10, 0x69, 0x06, 0x73, 0x0E, 0xD1, 0x06, 0x6B, 0x12, 0x92, 0x0B, + 0x18, 0x14, 0x5E, 0x0F, 0xE1, 0x15, 0x88, 0x0F, 0xCC, 0x16, 0x73, 0x0E, + 0x33, 0x0D, 0x8E, 0x09, 0xA8, 0x03, 0x40, 0x0A, 0xDC, 0xFE, 0x11, 0x0C, + 0xE1, 0x04, 0x11, 0x0C, 0x6C, 0x0C, 0xE6, 0x0D, 0x9B, 0x12, 0xCA, 0x18, + 0xFE, 0x1A, 0x1C, 0x26, 0x72, 0x18, 0xA4, 0x25, 0x51, 0x18, 0x65, 0x25, + 0x31, 0x1E, 0x54, 0x2A, 0x1B, 0x1C, 0x85, 0x2B, 0xA7, 0x11, 0x3B, 0x21, + 0x7E, 0x0B, 0xCF, 0x15, 0x1B, 0x0C, 0x35, 0x12, 0xD9, 0x07, 0x78, 0x06, + 0xE1, 0xFF, 0x47, 0xF5, 0x0B, 0x03, 0xFF, 0xF8, 0x74, 0x10, 0x73, 0x0E, + 0x26, 0x18, 0x87, 0x1A, 0x56, 0x1E, 0xBB, 0x1F, 0xE4, 0x26, 0xA0, 0x26, + 0xBA, 0x26, 0x2A, 0x26, 0x71, 0x1A, 0x91, 0x1B, 0xFD, 0x13, 0x25, 0x14, + 0x39, 0x11, 0x16, 0x0E, 0xC5, 0x09, 0x43, 0x0B, 0xE7, 0x0E, 0xCF, 0x10, + 0x08, 0x21, 0xC4, 0x11, 0x1D, 0x2E, 0x23, 0x0B, 0xEF, 0x34, 0x1C, 0x09, + 0xCC, 0x3A, 0x51, 0x14, 0x04, 0x34, 0xC0, 0x1E, 0xCF, 0x33, 0x6A, 0x29, + 0xFA, 0x40, 0x6A, 0x37, 0xF5, 0x49, 0xF0, 0x43, 0x07, 0x4C, 0x16, 0x4C, + 0x72, 0x40, 0x97, 0x49, 0x49, 0x36, 0xDD, 0x48, 0xCA, 0x32, 0xA4, 0x41, + 0x54, 0x25, 0xCD, 0x27, 0xF6, 0x19, 0x8B, 0x14, 0x14, 0x15, 0xA2, 0x0C, + 0x04, 0xFD, 0xA3, 0xF5, 0x50, 0x01, 0x8A, 0xFD, 0x81, 0x23, 0xBD, 0x24, + 0x3E, 0x15, 0x08, 0x25, 0x25, 0x10, 0x33, 0x2A, 0x04, 0x28, 0xEE, 0x36, + 0x69, 0x16, 0xA8, 0x18, 0xF2, 0xF1, 0x54, 0xF4, 0xA0, 0xDA, 0x2E, 0xE6, + 0x44, 0xE9, 0x3A, 0xFF, 0xD7, 0xFA, 0x51, 0x0D, 0xB2, 0xDC, 0x90, 0xE8, + 0xA3, 0xDA, 0x29, 0xE7, 0xE4, 0xE4, 0x2D, 0xEA, 0x66, 0xBB, 0xD2, 0xB8, + 0x16, 0xA7, 0x01, 0xA3, 0x54, 0xBF, 0x18, 0xB5, 0xC5, 0xCA, 0x4C, 0xBC, + 0xCD, 0xC9, 0xA1, 0xB5, 0xAB, 0xD5, 0x38, 0xBB, 0x18, 0xD5, 0xE9, 0xC3, + 0x99, 0xBA, 0xFA, 0xB1, 0x39, 0xB4, 0x0D, 0xAD, 0x99, 0xB9, 0x04, 0xB8, + 0x77, 0xAA, 0x61, 0xAE, 0x53, 0xA3, 0xE3, 0xAA, 0xFE, 0xB6, 0x82, 0xBC, + 0xF8, 0xBC, 0xE0, 0xB7, 0x0B, 0xB0, 0xA0, 0xA5, 0xDD, 0xB1, 0x52, 0xAB, + 0xA6, 0xB5, 0x10, 0xB4, 0x8C, 0xAD, 0x35, 0xAE, 0xA6, 0xA2, 0xB7, 0xA5, + 0x3B, 0xAE, 0xCD, 0xB6, 0x2B, 0xB9, 0x8A, 0xC1, 0x2E, 0xAE, 0x5F, 0xAF, + 0x9B, 0xA4, 0x1C, 0xA1, 0x17, 0xA5, 0x58, 0xA2, 0xDD, 0xA8, 0x3A, 0xAC, + 0x4D, 0xAB, 0x6C, 0xB0, 0xD5, 0xB4, 0x8E, 0xB2, 0xAC, 0xBC, 0x7A, 0xB2, + 0x94, 0xC2, 0xD3, 0xB0, 0x61, 0xC9, 0x0B, 0xB6, 0x85, 0xC8, 0x86, 0xBE, + 0x7C, 0xCC, 0x49, 0xCA, 0x26, 0xD9, 0x9E, 0xDB, 0x5A, 0xDD, 0x87, 0xE5, + 0x55, 0xD6, 0xE2, 0xE1, 0x9A, 0xCA, 0x18, 0xD2, 0x7C, 0xC3, 0xA5, 0xC3, + 0xBA, 0xB9, 0xAE, 0xBC, 0x30, 0xB9, 0xBD, 0xC5, 0x52, 0xD1, 0x77, 0xE1, + 0xC3, 0xE3, 0x2C, 0xEE, 0xC2, 0xF3, 0xF3, 0xF1, 0xF3, 0x08, 0x24, 0xFE, + 0x29, 0x13, 0x57, 0x0B, 0xA4, 0x0A, 0xE2, 0x07, 0xB0, 0x02, 0xB6, 0xFE, + 0x0B, 0x08, 0x15, 0x02, 0x98, 0x09, 0xC8, 0x06, 0xA4, 0x0A, 0x8F, 0x0E, + 0x84, 0x10, 0x05, 0x11, 0x48, 0x16, 0x98, 0x0B, 0x01, 0x1B, 0xD2, 0x10, + 0x32, 0x12, 0xC2, 0x14, 0x6F, 0x0A, 0xF7, 0x17, 0xF8, 0x10, 0xEB, 0x1D, + 0x90, 0x10, 0xEC, 0x13, 0xEC, 0x16, 0xCA, 0x0F, 0x12, 0x23, 0xE1, 0x1C, + 0x94, 0x25, 0x2A, 0x28, 0x84, 0x2A, 0xC8, 0x2D, 0x77, 0x39, 0xCE, 0x37, + 0xC2, 0x3E, 0xF2, 0x39, 0x99, 0x38, 0x59, 0x30, 0x46, 0x3B, 0x55, 0x2D, + 0x77, 0x42, 0xFE, 0x30, 0xA5, 0x3C, 0xF7, 0x2A, 0x49, 0x34, 0xDA, 0x24, + 0xD8, 0x39, 0xE6, 0x31, 0xC0, 0x36, 0xF9, 0x39, 0x07, 0x2B, 0xE9, 0x35, + 0x12, 0x31, 0x00, 0x3D, 0x75, 0x3A, 0x9B, 0x4A, 0xC4, 0x3D, 0x0B, 0x57, + 0x88, 0x41, 0xB9, 0x5D, 0x0A, 0x4C, 0xD3, 0x5D, 0x39, 0x56, 0x52, 0x59, + 0xF9, 0x50, 0xC3, 0x50, 0x3F, 0x49, 0x03, 0x4F, 0xF7, 0x3B, 0x85, 0x4D, + 0x9A, 0x38, 0x0E, 0x52, 0xD2, 0x46, 0x2B, 0x56, 0x9A, 0x52, 0x01, 0x51, + 0x37, 0x58, 0x90, 0x4D, 0x76, 0x50, 0x77, 0x43, 0xEB, 0x50, 0xBB, 0x46, + 0x82, 0x5B, 0xEB, 0x55, 0x51, 0x5C, 0xF1, 0x54, 0x34, 0x5B, 0x36, 0x50, + 0x5E, 0x54, 0x15, 0x4E, 0x9B, 0x4D, 0x5B, 0x52, 0xF6, 0x4C, 0x14, 0x55, + 0xEE, 0x4A, 0x4A, 0x4B, 0x26, 0x48, 0x79, 0x46, 0xBB, 0x45, 0x78, 0x4C, + 0x4B, 0x4A, 0xFB, 0x53, 0x29, 0x5B, 0x38, 0x5B, 0x50, 0x5E, 0xE8, 0x59, + 0x30, 0x49, 0x92, 0x4F, 0x0C, 0x36, 0x21, 0x44, 0x17, 0x3B, 0x0E, 0x42, + 0xDF, 0x3E, 0x2A, 0x3E, 0x30, 0x33, 0x3E, 0x33, 0x4A, 0x30, 0x44, 0x37, + 0x03, 0x38, 0x7D, 0x3F, 0x6C, 0x3C, 0xF0, 0x3A, 0xE9, 0x3F, 0xEF, 0x3C, + 0x01, 0x43, 0x36, 0x47, 0x33, 0x3D, 0x0C, 0x48, 0x91, 0x35, 0x53, 0x42, + 0x54, 0x31, 0xF4, 0x3B, 0x3C, 0x24, 0x63, 0x2A, 0xE3, 0x14, 0xF4, 0x17, + 0x00, 0x13, 0x5A, 0x17, 0x09, 0x10, 0x6B, 0x1D, 0x49, 0x12, 0x71, 0x2B, + 0xB6, 0x16, 0x30, 0x35, 0x58, 0x0E, 0xB8, 0x2C, 0x72, 0x0D, 0x0C, 0x28, + 0xA5, 0x0C, 0xBD, 0x28, 0xB6, 0x0C, 0xC0, 0x2A, 0xBF, 0x13, 0x50, 0x27, + 0x30, 0x15, 0x6E, 0x1C, 0x8C, 0x21, 0xD3, 0x22, 0x9A, 0x29, 0xF4, 0x27, + 0x80, 0x14, 0xDE, 0x12, 0x61, 0xFF, 0xAF, 0x00, 0xCE, 0xFC, 0x55, 0xFF, + 0x76, 0x00, 0x3B, 0xFC, 0x24, 0x06, 0x5E, 0xF3, 0x2D, 0x0E, 0x1C, 0xF4, + 0x37, 0x13, 0x03, 0x06, 0x06, 0x09, 0x40, 0x0B, 0xC9, 0xF9, 0x5F, 0x00, + 0x22, 0xF7, 0x1C, 0xFC, 0xB1, 0xF5, 0x03, 0xF1, 0xBD, 0xFB, 0x80, 0xE9, + 0x37, 0x01, 0xEE, 0xE8, 0x9C, 0xF1, 0x81, 0xDC, 0x59, 0xE9, 0x12, 0xD6, + 0x28, 0xF1, 0x8F, 0xDE, 0x46, 0xF3, 0xC1, 0xDF, 0x5A, 0xF5, 0xDB, 0xE2, + 0xF3, 0xFD, 0x1C, 0xF4, 0x02, 0xFC, 0x9C, 0xF9, 0xA1, 0xEC, 0x32, 0xEE, + 0xB1, 0xDD, 0xEE, 0xE1, 0x11, 0xD3, 0x84, 0xD9, 0x49, 0xCF, 0x41, 0xD5, + 0x4A, 0xD7, 0x82, 0xDC, 0x72, 0xE1, 0xC6, 0xE3, 0x9D, 0xDD, 0xB2, 0xDC, + 0xB0, 0xD3, 0x88, 0xD4, 0x42, 0xCE, 0x48, 0xCF, 0x2A, 0xCC, 0x62, 0xC8, + 0x7A, 0xCD, 0x10, 0xC7, 0x49, 0xCE, 0x2A, 0xC9, 0x96, 0xCF, 0x5D, 0xC7, + 0xBA, 0xD7, 0xD1, 0xC5, 0x10, 0xDC, 0x04, 0xC0, 0x57, 0xD1, 0x65, 0xB6, + 0xFD, 0xCB, 0xB5, 0xBD, 0xD0, 0xD1, 0x87, 0xCD, 0xD4, 0xD8, 0x7A, 0xD5, + 0xCD, 0xE0, 0x09, 0xDB, 0x74, 0xDE, 0xB2, 0xCF, 0xD8, 0xDF, 0x12, 0xC5, + 0x6A, 0xE6, 0xB3, 0xCB, 0x68, 0xE1, 0x81, 0xD1, 0xB4, 0xE5, 0x0C, 0xE1, + 0xF9, 0xE7, 0xC5, 0xEB, 0xB9, 0xE2, 0x7C, 0xEA, 0xF3, 0xEC, 0xE0, 0xEE, + 0x47, 0xF5, 0xFD, 0xF2, 0x43, 0xEC, 0x37, 0xF0, 0x56, 0xDE, 0x12, 0xEB, + 0xE0, 0xDE, 0x54, 0xF0, 0x5A, 0xEC, 0xA2, 0xFF, 0xA6, 0xF3, 0x5F, 0x08, + 0x75, 0xF4, 0x2A, 0x06, 0x24, 0xF5, 0x25, 0xFF, 0xC3, 0xFE, 0x26, 0x03, + 0x72, 0x09, 0x6D, 0x0C, 0x29, 0x0A, 0x65, 0x0A, 0xD5, 0x0B, 0xEF, 0x08, + 0x5C, 0x05, 0x41, 0x03, 0x74, 0x02, 0x9F, 0xF8, 0x8D, 0x14, 0xE0, 0xF8, + 0x32, 0x1E, 0x70, 0xFD, 0x39, 0x1A, 0xEE, 0x04, 0x11, 0x16, 0x94, 0x0B, + 0xB9, 0x14, 0xBD, 0x0B, 0x56, 0x1A, 0x77, 0x0F, 0x95, 0x1F, 0x33, 0x11, + 0xBB, 0x20, 0xCD, 0x10, 0x92, 0x24, 0x85, 0x13, 0xAE, 0x2A, 0x83, 0x15, + 0x78, 0x30, 0xB6, 0x21, 0x9F, 0x27, 0xE8, 0x2D, 0xE7, 0x14, 0x25, 0x2F, + 0xAC, 0x0C, 0xE2, 0x27, 0x88, 0x0B, 0x56, 0x1C, 0x93, 0x12, 0x7D, 0x1B, + 0xB7, 0x16, 0xCD, 0x1F, 0xB8, 0x1A, 0xE8, 0x26, 0x63, 0x1D, 0x6C, 0x2A, + 0x7A, 0x1C, 0x89, 0x27, 0x93, 0x26, 0xF2, 0x28, 0x3B, 0x29, 0x4E, 0x26, + 0x7B, 0x1F, 0x30, 0x21, 0x15, 0x19, 0x10, 0x1F, 0x61, 0x15, 0x11, 0x14, + 0x78, 0x15, 0x76, 0x11, 0x2F, 0x15, 0x35, 0x1A, 0x03, 0x15, 0x41, 0x1E, + 0xE7, 0x11, 0x24, 0x18, 0x13, 0x12, 0x73, 0x14, 0x93, 0x1A, 0x05, 0x1C, + 0x39, 0x19, 0xBD, 0x1B, 0x60, 0x12, 0x4A, 0x16, 0xFD, 0x07, 0x80, 0x0A, + 0x67, 0x02, 0x1D, 0x04, 0x76, 0x02, 0xE3, 0x0A, 0xAA, 0x00, 0xE1, 0x0E, + 0x6B, 0xFC, 0xA7, 0x0A, 0xF4, 0xF4, 0xB1, 0x06, 0x59, 0xED, 0xB1, 0x0A, + 0x45, 0xE4, 0xA2, 0x0F, 0x7C, 0xE2, 0x0B, 0x0E, 0x36, 0xE0, 0x9E, 0x02, + 0xA3, 0xDE, 0x18, 0xFB, 0x7F, 0xE1, 0x66, 0xF7, 0x0D, 0xE6, 0xDE, 0xF0, + 0x36, 0xE8, 0x71, 0xEE, 0xD8, 0xD5, 0x63, 0xE7, 0x05, 0xC5, 0x01, 0xDF, + 0x21, 0xCC, 0x3B, 0xE0, 0xC6, 0xD5, 0x72, 0xDC, 0xEB, 0xD3, 0xF0, 0xCC, + 0x9B, 0xC9, 0x13, 0xBD, 0x5E, 0xD1, 0x3D, 0xC6, 0x42, 0xDD, 0xA2, 0xD5, + 0xC4, 0xD8, 0x9D, 0xD6, 0x33, 0xD7, 0xBF, 0xD7, 0x32, 0xE0, 0x6D, 0xDA, + 0xA6, 0xEF, 0x41, 0xD9, 0xAA, 0xEF, 0x44, 0xC8, 0x96, 0xE8, 0x77, 0xB8, + 0x07, 0xE0, 0x39, 0xB2, 0xBB, 0xD2, 0x71, 0xB1, 0x4D, 0xD9, 0xFC, 0xC1, + 0x55, 0xDE, 0x2E, 0xD1, 0x75, 0xCD, 0x75, 0xCF, 0x6E, 0xC2, 0x98, 0xD3, + 0x9E, 0xBC, 0xC1, 0xD6, 0x01, 0xB1, 0x8B, 0xCA, 0x17, 0xB4, 0xCB, 0xC7, + 0x71, 0xBF, 0x79, 0xCD, 0xBA, 0xC0, 0xD5, 0xCE, 0xCC, 0xC1, 0xE7, 0xD4, + 0x33, 0xC6, 0x36, 0xDF, 0x5E, 0xC5, 0x57, 0xE1, 0x39, 0xC1, 0xF5, 0xDA, + 0x3E, 0xC2, 0xD6, 0xD6, 0x4A, 0xC4, 0xC6, 0xCF, 0x3E, 0xCD, 0xAF, 0xC7, + 0x5E, 0xD6, 0x38, 0xC4, 0x1C, 0xCB, 0xE2, 0xBD, 0x8F, 0xBE, 0xD6, 0xBE, + 0xD4, 0xB2, 0x85, 0xC0, 0x62, 0xAE, 0xE8, 0xC3, 0x3A, 0xBB, 0x11, 0xD1, + 0x34, 0xC8, 0x70, 0xD6, 0x71, 0xD2, 0x6F, 0xD3, 0x7B, 0xD7, 0x5B, 0xCC, + 0xF2, 0xD2, 0xC2, 0xC0, 0x8F, 0xC3, 0xFC, 0xB8, 0xA1, 0xBB, 0xF5, 0xBE, + 0xDD, 0xC8, 0xBC, 0xD2, 0xF8, 0xD5, 0x63, 0xDC, 0x3A, 0xDD, 0xBA, 0xD9, + 0xD1, 0xE4, 0x00, 0xDF, 0x7E, 0xDF, 0x01, 0xDD, 0x6B, 0xD7, 0x73, 0xD7, + 0x40, 0xDE, 0x85, 0xDE, 0x03, 0xE8, 0x98, 0xE3, 0xC4, 0xED, 0x06, 0xDF, + 0x28, 0x00, 0xFC, 0xE2, 0x7B, 0x09, 0x84, 0xEA, 0xD0, 0xF9, 0xD9, 0xE7, + 0xF9, 0xE9, 0x80, 0xE7, 0x18, 0xE7, 0x87, 0xEC, 0x4B, 0xE9, 0x49, 0xE9, + 0x2D, 0xF1, 0xFE, 0xE7, 0x80, 0xFF, 0xD0, 0xF2, 0xA6, 0xFE, 0x84, 0xF5, + 0x2A, 0xF6, 0x2E, 0xF7, 0x64, 0xFB, 0x3C, 0x04, 0xFC, 0x07, 0x3F, 0x0E, + 0x9D, 0x0C, 0x18, 0x07, 0xC9, 0x13, 0xBE, 0x01, 0x1D, 0x1E, 0x6F, 0x04, + 0x5C, 0x21, 0xEB, 0x02, 0x40, 0x21, 0xFC, 0x08, 0x72, 0x28, 0xF8, 0x1E, + 0x0D, 0x2B, 0x56, 0x30, 0xE2, 0x22, 0xF4, 0x33, 0x41, 0x23, 0xD1, 0x37, + 0x1F, 0x2B, 0x5E, 0x3D, 0x05, 0x2F, 0x5E, 0x38, 0xCC, 0x2B, 0xED, 0x2C, + 0x82, 0x2B, 0x8F, 0x2C, 0x4A, 0x2A, 0x51, 0x2F, 0x0E, 0x2C, 0xE7, 0x2F, + 0xD9, 0x3A, 0xA7, 0x30, 0x52, 0x47, 0x6F, 0x2C, 0x2D, 0x47, 0x3D, 0x27, + 0x21, 0x44, 0x16, 0x2C, 0x08, 0x43, 0x04, 0x36, 0x6C, 0x40, 0x42, 0x32, + 0x1C, 0x3F, 0xC1, 0x2C, 0x99, 0x45, 0xE8, 0x36, 0x0E, 0x45, 0x26, 0x37, + 0xE4, 0x3E, 0x55, 0x28, 0x85, 0x48, 0xD5, 0x28, 0x1C, 0x4A, 0x1B, 0x31, + 0x06, 0x42, 0xC0, 0x34, 0x84, 0x45, 0xE2, 0x3A, 0x80, 0x4A, 0x57, 0x39, + 0xBC, 0x44, 0x29, 0x2D, 0xAC, 0x3E, 0x86, 0x2C, 0x03, 0x42, 0x89, 0x3A, + 0x8B, 0x40, 0xDA, 0x42, 0x7A, 0x3C, 0x32, 0x45, 0x10, 0x38, 0xC5, 0x44, + 0xC5, 0x2D, 0x1B, 0x3D, 0x70, 0x2A, 0x89, 0x38, 0x00, 0x2F, 0xD1, 0x38, + 0x06, 0x32, 0xE6, 0x33, 0x78, 0x32, 0xC8, 0x2B, 0x55, 0x35, 0xE9, 0x2A, + 0x83, 0x3D, 0xEB, 0x35, 0x5E, 0x42, 0xE3, 0x3F, 0x8E, 0x45, 0xCC, 0x41, + 0xE2, 0x4D, 0x7B, 0x48, 0x01, 0x4B, 0x89, 0x4D, 0x03, 0x40, 0xA3, 0x4C, + 0xBA, 0x3A, 0x37, 0x45, 0xA4, 0x35, 0xD2, 0x33, 0xE2, 0x31, 0xBD, 0x29, + 0x88, 0x31, 0x9B, 0x2D, 0x20, 0x2E, 0x1D, 0x30, 0xF1, 0x33, 0xE5, 0x3A, + 0x33, 0x38, 0x63, 0x44, 0xEB, 0x29, 0x52, 0x3A, 0xA9, 0x2D, 0x1C, 0x38, + 0xFB, 0x3E, 0x93, 0x3C, 0x84, 0x44, 0x29, 0x3B, 0x5B, 0x44, 0x68, 0x3C, + 0x81, 0x45, 0xE8, 0x40, 0x6B, 0x4B, 0x90, 0x44, 0x80, 0x47, 0x91, 0x3F, + 0xA9, 0x3D, 0x80, 0x36, 0xDC, 0x3D, 0x10, 0x36, 0x16, 0x39, 0x83, 0x2F, + 0xAD, 0x2E, 0xE6, 0x23, 0xC5, 0x2F, 0x1A, 0x24, 0x55, 0x38, 0x5B, 0x23, + 0x1F, 0x37, 0x46, 0x18, 0x33, 0x35, 0xAA, 0x16, 0x8B, 0x35, 0x2F, 0x1F, + 0x64, 0x33, 0xB3, 0x21, 0x42, 0x3E, 0xDE, 0x29, 0x66, 0x44, 0x1F, 0x2F, + 0xAD, 0x36, 0x4F, 0x22, 0x61, 0x2B, 0x29, 0x16, 0xB9, 0x23, 0x47, 0x0F, + 0x14, 0x15, 0xC9, 0x06, 0xDF, 0x0D, 0x59, 0x07, 0xA1, 0x19, 0xEC, 0x12, + 0x7C, 0x22, 0xC2, 0x18, 0x64, 0x21, 0xD1, 0x1C, 0xA6, 0x15, 0x27, 0x1B, + 0x1B, 0x02, 0x69, 0x0B, 0x2F, 0xFE, 0x31, 0x03, 0x59, 0x01, 0x0B, 0x05, + 0x3A, 0x04, 0x16, 0x0D, 0x4C, 0x0A, 0x0D, 0x17, 0x8F, 0x0C, 0x54, 0x19, + 0x6E, 0x0B, 0x03, 0x16, 0x55, 0x07, 0x74, 0x0E, 0x5B, 0x03, 0x83, 0x06, + 0x36, 0x02, 0x55, 0x00, 0x19, 0x01, 0xB3, 0xFA, 0x3B, 0x0A, 0x48, 0xFD, + 0xBE, 0x17, 0xED, 0x05, 0xF6, 0x18, 0xD0, 0x0B, 0x8F, 0x11, 0x6D, 0x13, + 0x1C, 0x08, 0x3A, 0x1A, 0xE0, 0xFD, 0xC5, 0x14, 0xED, 0xFE, 0xC3, 0x10, + 0x71, 0x0B, 0xB3, 0x16, 0x77, 0x15, 0xD2, 0x16, 0x9E, 0x17, 0xB2, 0x0B, + 0xAB, 0x0D, 0x30, 0xF9, 0x68, 0x00, 0xAF, 0xF0, 0xE2, 0xF9, 0xAE, 0xF9, + 0xCC, 0xF9, 0x10, 0x05, 0x80, 0x00, 0x9C, 0x06, 0x81, 0x0C, 0xC6, 0x00, + 0x24, 0x12, 0x53, 0xFC, 0x24, 0x09, 0xD8, 0xF7, 0x55, 0xFC, 0xF0, 0xF7, + 0x5C, 0xF7, 0xB3, 0x03, 0xC4, 0xF8, 0xF1, 0x12, 0xA6, 0xF6, 0xDD, 0x16, + 0x1C, 0xF7, 0xBB, 0x12, 0xCB, 0xFB, 0x05, 0x0D, 0xA0, 0xEC, 0x36, 0xFB, + 0xAC, 0xD5, 0xF9, 0xEB, 0xCE, 0xD2, 0xEE, 0xEE, 0x1B, 0xD8, 0x5E, 0xEE, + 0x9A, 0xD6, 0x0D, 0xE3, 0x09, 0xD6, 0x12, 0xE5, 0x13, 0xD8, 0xB1, 0xEE, + 0xBF, 0xD2, 0xEF, 0xE9, 0xAF, 0xD1, 0xCD, 0xE5, 0x08, 0xD3, 0x7B, 0xE8, + 0xBA, 0xCE, 0xD7, 0xE4, 0x42, 0xD5, 0xF1, 0xDD, 0x5C, 0xDF, 0x0D, 0xD7, + 0xDE, 0xE0, 0x9F, 0xCD, 0x89, 0xD7, 0xFB, 0xC6, 0x46, 0xC6, 0xFA, 0xC3, + 0xED, 0xBB, 0x37, 0xC8, 0x65, 0xB5, 0xE8, 0xD2, 0xD4, 0xAC, 0x5A, 0xD4, + 0x70, 0xB0, 0x54, 0xD0, 0x26, 0xC3, 0x71, 0xD0, 0x46, 0xC5, 0x22, 0xC9, + 0x9C, 0xBA, 0x60, 0xC4, 0x87, 0xBA, 0x74, 0xCC, 0x89, 0xB7, 0x35, 0xD1, + 0xA4, 0xB1, 0x70, 0xD4, 0x24, 0xAD, 0x4B, 0xD3, 0xBC, 0xAC, 0x66, 0xC6, + 0xB8, 0xB0, 0xDC, 0xB4, 0x85, 0xB4, 0xF2, 0xAE, 0x27, 0xB3, 0x7E, 0xB5, + 0x94, 0xAC, 0x0C, 0xBA, 0x9A, 0xAD, 0xCA, 0xBE, 0xAF, 0xB5, 0xCA, 0xC5, + 0x3C, 0xB7, 0xBC, 0xCD, 0xAF, 0xB4, 0x8A, 0xD4, 0x73, 0xB0, 0xBD, 0xD3, + 0xF1, 0xAE, 0x5B, 0xCF, 0xE9, 0xB1, 0x6A, 0xCA, 0xE2, 0xB3, 0x13, 0xC5, + 0x7D, 0xB3, 0xCD, 0xBC, 0x17, 0xB0, 0x84, 0xB4, 0x7F, 0xAC, 0x58, 0xB4, + 0xE3, 0xA4, 0xE1, 0xB4, 0x6C, 0xA2, 0x6B, 0xB3, 0xB8, 0xA7, 0x0D, 0xAD, + 0xBF, 0xA9, 0xB7, 0xA3, 0x4C, 0xAA, 0x6D, 0xA1, 0xA3, 0xB0, 0xB9, 0xA7, + 0xC8, 0xB8, 0x95, 0xAF, 0xC7, 0xB8, 0xFC, 0xAD, 0x11, 0xB6, 0x2F, 0xAC, + 0x7B, 0xBC, 0xDE, 0xB6, 0xCD, 0xC0, 0xAB, 0xBF, 0x12, 0xBF, 0x01, 0xC4, + 0xBE, 0xBD, 0x24, 0xC9, 0x95, 0xB7, 0xFB, 0xC1, 0x60, 0xB0, 0x30, 0xB1, + 0xFD, 0xAA, 0x64, 0xA7, 0xD2, 0xA4, 0x34, 0xA6, 0x6F, 0xA3, 0x24, 0xA7, + 0xD1, 0xAB, 0xC5, 0xA8, 0xFF, 0xB2, 0xFD, 0xAC, 0x51, 0xB5, 0xD6, 0xB5, + 0x0B, 0xB3, 0xB2, 0xBB, 0x3A, 0xAA, 0xE4, 0xB6, 0xF8, 0xA6, 0xDF, 0xB4, + 0xD5, 0xA9, 0x6E, 0xBA, 0x56, 0xAD, 0x5C, 0xBB, 0xB6, 0xB9, 0x68, 0xBB, + 0x31, 0xC4, 0x7B, 0xBD, 0x30, 0xBC, 0xD3, 0xBD, 0x92, 0xAF, 0x2A, 0xBC, + 0x1A, 0xB4, 0x76, 0xB9, 0xCC, 0xC8, 0x0F, 0xBB, 0x0D, 0xD7, 0x1A, 0xBC, + 0xA1, 0xDC, 0xDB, 0xC1, 0x79, 0xDE, 0x47, 0xCE, 0xFC, 0xD5, 0xE4, 0xD1, + 0xD8, 0xCB, 0xCA, 0xD1, 0x5F, 0xCD, 0xEA, 0xD9, 0x02, 0xCF, 0xF2, 0xDE, + 0xD8, 0xCB, 0xFE, 0xDC, 0x08, 0xCD, 0xC0, 0xDC, 0xDF, 0xD0, 0x29, 0xDB, + 0xC4, 0xD5, 0xEF, 0xD6, 0xE3, 0xD3, 0x4A, 0xD3, 0x04, 0xCE, 0xCB, 0xD2, + 0xF2, 0xCF, 0x28, 0xD7, 0x4B, 0xD9, 0x1F, 0xDE, 0x16, 0xE2, 0x42, 0xE7, + 0x0C, 0xE1, 0x26, 0xEF, 0x85, 0xDE, 0x1F, 0xF1, 0xE2, 0xE8, 0x12, 0xEB, + 0x63, 0xF3, 0xE4, 0xD9, 0x2E, 0xFC, 0x94, 0xD2, 0xC3, 0x01, 0x55, 0xDD, + 0xBF, 0x03, 0x45, 0xE9, 0xC1, 0x0B, 0xC6, 0xF0, 0x74, 0x0B, 0x62, 0xEF, + 0x48, 0x03, 0x4B, 0xE5, 0xF2, 0xFE, 0x31, 0xDB, 0x2C, 0xFE, 0xC1, 0xD7, + 0xE1, 0x03, 0xE7, 0xDB, 0xA6, 0x11, 0x1C, 0xE6, 0x4D, 0x1D, 0x63, 0xF5, + 0x4D, 0x1E, 0xB6, 0x04, 0x0A, 0x19, 0xEA, 0x0B, 0xA7, 0x10, 0x1A, 0x0A, + 0x9C, 0x0C, 0x0E, 0x06, 0xC3, 0x0E, 0x83, 0x06, 0xA5, 0x0A, 0xFD, 0x07, + 0x04, 0x06, 0x65, 0x0A, 0xDA, 0x0C, 0xB0, 0x0D, 0x85, 0x1A, 0x1F, 0x0E, + 0x83, 0x25, 0x44, 0x12, 0xDB, 0x24, 0x5A, 0x1C, 0x35, 0x1E, 0x6F, 0x27, + 0x83, 0x1D, 0x29, 0x30, 0xA4, 0x24, 0xE9, 0x32, 0xF5, 0x2C, 0xA6, 0x2C, + 0xA1, 0x2E, 0x47, 0x22, 0x71, 0x29, 0x7F, 0x1A, 0xA6, 0x23, 0xCA, 0x13, + 0xA2, 0x1D, 0x28, 0x11, 0xB8, 0x12, 0x83, 0x17, 0x2B, 0x0A, 0x27, 0x1B, + 0x7F, 0x0F, 0x8C, 0x17, 0x89, 0x1B, 0x94, 0x14, 0xD3, 0x20, 0xDA, 0x0E, + 0x3E, 0x22, 0x48, 0x0E, 0x0D, 0x20, 0xD5, 0x15, 0x57, 0x1F, 0x1D, 0x17, + 0xFD, 0x28, 0x74, 0x15, 0x92, 0x30, 0x20, 0x15, 0xEE, 0x32, 0xAE, 0x16, + 0xC2, 0x31, 0x4D, 0x16, 0x8C, 0x28, 0x8A, 0x0D, 0x33, 0x23, 0x8A, 0x05, + 0xE2, 0x22, 0x30, 0xFF, 0x57, 0x21, 0x8D, 0xF9, 0x27, 0x26, 0xD6, 0x00, + 0x5D, 0x2C, 0xFD, 0x0D, 0x8D, 0x29, 0x37, 0x16, 0xD4, 0x23, 0xEE, 0x24, + 0x2A, 0x1D, 0xD6, 0x34, 0x41, 0x11, 0x05, 0x35, 0x4F, 0x0A, 0xC8, 0x2B, + 0x76, 0x11, 0x64, 0x22, 0x6C, 0x1B, 0xB5, 0x17, 0xFF, 0x1F, 0xD7, 0x15, + 0x88, 0x1E, 0x99, 0x1A, 0x2E, 0x1D, 0x47, 0x1A, 0xC1, 0x24, 0x16, 0x16, + 0xB8, 0x29, 0x67, 0x0C, 0x72, 0x29, 0x0F, 0x03, 0xA1, 0x33, 0xCF, 0x07, + 0x54, 0x3F, 0x83, 0x13, 0x52, 0x40, 0xF8, 0x1D, 0x99, 0x40, 0x79, 0x2A, + 0xE6, 0x40, 0xF6, 0x34, 0xFB, 0x3E, 0xC8, 0x3D, 0x01, 0x3E, 0xF3, 0x43, + 0x8F, 0x3A, 0x53, 0x44, 0x4E, 0x31, 0x19, 0x41, 0xCB, 0x2A, 0x2A, 0x3E, + 0xCA, 0x28, 0xD3, 0x38, 0x57, 0x27, 0x47, 0x2F, 0x0D, 0x2C, 0x61, 0x23, + 0x13, 0x36, 0xD2, 0x1E, 0xF2, 0x3A, 0x92, 0x2A, 0xE0, 0x39, 0x30, 0x3A, + 0xFA, 0x39, 0x20, 0x3D, 0x2D, 0x37, 0x38, 0x31, 0xCE, 0x31, 0xE3, 0x20, + 0x4F, 0x35, 0xA7, 0x18, 0x52, 0x3F, 0x54, 0x18, 0x79, 0x44, 0x75, 0x18, + 0x0B, 0x44, 0xF7, 0x1B, 0xA9, 0x3A, 0x6E, 0x1D, 0x87, 0x2E, 0xFB, 0x1B, + 0x10, 0x28, 0xEB, 0x16, 0xA1, 0x29, 0x52, 0x0F, 0x9B, 0x31, 0x4E, 0x12, + 0x9E, 0x2F, 0xFA, 0x17, 0xD2, 0x27, 0x56, 0x17, 0x1B, 0x24, 0x11, 0x19, + 0x4D, 0x1B, 0x07, 0x19, 0xB7, 0x14, 0x56, 0x17, 0xB1, 0x18, 0xA6, 0x1C, + 0x5E, 0x15, 0x16, 0x20, 0x0F, 0x0E, 0xAA, 0x1F, 0x34, 0x11, 0xAE, 0x19, + 0x7B, 0x1F, 0xD5, 0x11, 0xBF, 0x25, 0x5A, 0x0D, 0x25, 0x1C, 0x1C, 0x0E, + 0x75, 0x1A, 0xD8, 0x18, 0xDE, 0x21, 0xE1, 0x22, 0xAE, 0x25, 0xD9, 0x22, + 0x9B, 0x28, 0xF5, 0x21, 0xC3, 0x24, 0xF1, 0x1D, 0xA3, 0x17, 0xC6, 0x0F, + 0xB6, 0x11, 0x7D, 0x03, 0x1C, 0x15, 0x4C, 0xFE, 0x3B, 0x18, 0x82, 0xFE, + 0x49, 0x19, 0xE6, 0x06, 0xD6, 0x1D, 0x57, 0x16, 0x53, 0x1C, 0x48, 0x1D, + 0x60, 0x15, 0x8B, 0x1C, 0xBA, 0x12, 0xBC, 0x1C, 0xE9, 0x11, 0x4F, 0x19, + 0xEF, 0x12, 0xCB, 0x15, 0x0B, 0x1B, 0x66, 0x1A, 0x75, 0x2C, 0x9A, 0x23, + 0x67, 0x38, 0x3D, 0x28, 0xA4, 0x30, 0x70, 0x27, 0x93, 0x25, 0x19, 0x27, + 0x8E, 0x24, 0x81, 0x27, 0xAB, 0x21, 0x66, 0x27, 0xB8, 0x22, 0x1F, 0x2D, + 0xD2, 0x28, 0xE1, 0x2E, 0x56, 0x2C, 0x5B, 0x28, 0x0B, 0x2E, 0xA5, 0x23, + 0x7D, 0x2F, 0x8C, 0x25, 0x5D, 0x2B, 0x53, 0x2F, 0x6A, 0x22, 0x0C, 0x3D, + 0x6F, 0x1D, 0x22, 0x41, 0x14, 0x1F, 0x4A, 0x3D, 0xDA, 0x1E, 0xBC, 0x39, + 0x9A, 0x15, 0xC0, 0x2E, 0x58, 0x11, 0xCC, 0x22, 0x5B, 0x12, 0x6E, 0x1F, + 0x4D, 0x0D, 0xCE, 0x1F, 0x02, 0x10, 0x0C, 0x27, 0x12, 0x1D, 0x56, 0x33, + 0x8D, 0x22, 0x54, 0x35, 0xCE, 0x27, 0x2E, 0x32, 0xD0, 0x2C, 0xCA, 0x2C, + 0x23, 0x27, 0xC3, 0x25, 0xC9, 0x17, 0x46, 0x27, 0x25, 0x0C, 0xBF, 0x2D, + 0xBA, 0x08, 0x80, 0x33, 0xE7, 0x03, 0x9C, 0x35, 0x45, 0x01, 0x45, 0x33, + 0xF8, 0xFD, 0x7A, 0x2D, 0xDB, 0xEF, 0x2E, 0x24, 0x36, 0xE1, 0x36, 0x19, + 0xFC, 0xE1, 0xEE, 0x0F, 0x4A, 0xEC, 0xEB, 0x09, 0x93, 0xF4, 0x45, 0x0B, + 0xA1, 0xFB, 0x4C, 0x11, 0x75, 0x03, 0xD5, 0x17, 0xD2, 0xFD, 0x14, 0x1C, + 0x2A, 0xF2, 0xED, 0x1B, 0xB6, 0xF3, 0xAB, 0x1D, 0x07, 0xF4, 0x9C, 0x18, + 0x3A, 0xEC, 0x12, 0x06, 0x33, 0xE8, 0x6F, 0xF1, 0x8D, 0xE9, 0x6C, 0xE5, + 0xF3, 0xE9, 0x7C, 0xE1, 0xA9, 0xEE, 0x82, 0xE1, 0x60, 0xFD, 0xDD, 0xE8, + 0x3B, 0x08, 0x97, 0xEF, 0xA8, 0x05, 0x9A, 0xEA, 0x3B, 0xFC, 0x0B, 0xE5, + 0x7C, 0xF1, 0xA2, 0xE6, 0xD1, 0xE8, 0xDB, 0xE6, 0xEA, 0xE5, 0xEC, 0xEB, + 0xBB, 0xE1, 0x93, 0xF6, 0x5F, 0xDB, 0xEF, 0xFC, 0x46, 0xD4, 0x6D, 0xFC, + 0x57, 0xCB, 0x01, 0xF9, 0x1E, 0xC7, 0xCF, 0xF4, 0x14, 0xC5, 0x32, 0xED, + 0x2D, 0xC5, 0xA4, 0xE8, 0x57, 0xC3, 0x2C, 0xE4, 0xDE, 0xC2, 0xA1, 0xDB, + 0x88, 0xC9, 0xF9, 0xD4, 0x69, 0xCC, 0xA6, 0xCE, 0x57, 0xCB, 0x13, 0xCB, + 0xBD, 0xC7, 0xC2, 0xCF, 0xD8, 0xBF, 0x60, 0xD0, 0x75, 0xBC, 0xC9, 0xC9, + 0x77, 0xBD, 0x0D, 0xC3, 0x28, 0xB9, 0x3D, 0xB6, 0x98, 0xB0, 0x73, 0xA7, + 0x0A, 0xAA, 0x5D, 0xA1, 0xEB, 0xA7, 0x10, 0xA4, 0x17, 0xAD, 0x41, 0xAB, + 0x53, 0xBA, 0xA6, 0xB5, 0x59, 0xC0, 0xD2, 0xBD, 0x90, 0xB9, 0x01, 0xBE, + 0x22, 0xB5, 0xDB, 0xB8, 0x59, 0xB1, 0x8D, 0xB2, 0xC4, 0xA7, 0x25, 0xB0, + 0x69, 0xA0, 0x2E, 0xB4, 0x74, 0xA2, 0x45, 0xBA, 0x6A, 0xA9, 0xA3, 0xC0, + 0xCD, 0xA7, 0xE6, 0xC3, 0x2F, 0xA0, 0x55, 0xBF, 0xDB, 0x9B, 0x80, 0xBB, + 0x50, 0xA1, 0x72, 0xBC, 0xF4, 0xAD, 0xAE, 0xB8, 0xDA, 0xBC, 0xB6, 0xB9, + 0x15, 0xC9, 0xD2, 0xC5, 0x87, 0xC6, 0xDA, 0xD0, 0x31, 0xC2, 0x48, 0xDB, + 0xBE, 0xC4, 0x59, 0xE3, 0xCC, 0xC2, 0xC6, 0xE1, 0xB1, 0xBA, 0x9A, 0xDD, + 0x59, 0xAD, 0x31, 0xD8, 0x73, 0xA3, 0xC6, 0xCD, 0xC1, 0xA5, 0x35, 0xC7, + 0xB4, 0xB0, 0xFE, 0xC8, 0x1D, 0xC4, 0x28, 0xCF, 0x6B, 0xD6, 0xEA, 0xD1, + 0xA3, 0xE2, 0x9E, 0xD2, 0x97, 0xED, 0xF1, 0xD7, 0x82, 0xF2, 0x34, 0xDF, + 0xD0, 0xEE, 0x94, 0xE2, 0x10, 0xEC, 0x21, 0xDE, 0xEF, 0xF2, 0xA2, 0xD8, + 0xB2, 0xF6, 0xC9, 0xD9, 0xF1, 0xEE, 0xB0, 0xDE, 0xAB, 0xE8, 0x52, 0xE6, + 0xC9, 0xE6, 0xC9, 0xEC, 0x41, 0xE3, 0x6F, 0xEE, 0x0F, 0xE5, 0x49, 0xF2, + 0x6F, 0xEC, 0x1C, 0xF6, 0x24, 0xF1, 0x3F, 0xF4, 0x42, 0xF1, 0x1F, 0xF2, + 0x53, 0xF7, 0x29, 0xF3, 0x92, 0x0B, 0xB2, 0xF6, 0x62, 0x1A, 0x23, 0xF9, + 0x57, 0x15, 0x47, 0x00, 0x4A, 0x08, 0xD3, 0x0B, 0x68, 0x02, 0x96, 0x0A, + 0xC2, 0x02, 0x96, 0xFF, 0x0F, 0x01, 0xA9, 0xF5, 0xCF, 0xF8, 0x95, 0xEB, + 0x93, 0xF2, 0x21, 0xE7, 0xE1, 0xF6, 0x58, 0xEE, 0x19, 0x05, 0xE6, 0xFF, + 0xDC, 0x17, 0xD1, 0x15, 0x79, 0x24, 0x57, 0x24, 0xC3, 0x2C, 0xA6, 0x24, + 0x0B, 0x2E, 0x5E, 0x19, 0xB5, 0x22, 0x65, 0x0E, 0x5A, 0x13, 0xA7, 0x0D, + 0xB8, 0x09, 0x42, 0x0F, 0xFA, 0x05, 0xA4, 0x0E, 0xAF, 0x01, 0x98, 0x0F, + 0x46, 0xFF, 0x4C, 0x12, 0xB6, 0xFB, 0x8B, 0x13, 0x31, 0xF3, 0x4E, 0x0F, + 0xA6, 0xF3, 0x3D, 0x08, 0xC7, 0x02, 0xDB, 0xFD, 0x17, 0x17, 0x77, 0xF5, + 0x98, 0x1F, 0x1D, 0xF8, 0x25, 0x1A, 0xA2, 0x02, 0x18, 0x0F, 0x71, 0x0C, + 0x22, 0x0A, 0x2B, 0x15, 0x91, 0x11, 0x6C, 0x17, 0x80, 0x12, 0xBB, 0x0F, + 0x72, 0x08, 0x94, 0x08, 0x4B, 0x03, 0x48, 0x00, 0x24, 0x07, 0x12, 0xEF, + 0xE2, 0x0B, 0x22, 0xDD, 0xEF, 0x0A, 0x76, 0xDA, 0xB6, 0x07, 0x75, 0xE1, + 0xDE, 0x0E, 0x16, 0xEC, 0x3A, 0x1C, 0x09, 0xF9, 0x20, 0x2B, 0x6A, 0x02, + 0xAB, 0x31, 0xB8, 0x01, 0xA0, 0x2D, 0xC4, 0xFA, 0x69, 0x2C, 0xCC, 0xF3, + 0x1C, 0x27, 0xD5, 0xEC, 0xFD, 0x1D, 0xFE, 0xEE, 0x6C, 0x15, 0x6C, 0xFF, + 0xB4, 0x0F, 0x3F, 0x0E, 0xDB, 0x0E, 0xB5, 0x0C, 0xF5, 0x12, 0x4A, 0x07, + 0x05, 0x1E, 0xFC, 0x06, 0xA8, 0x21, 0x44, 0x07, 0xCA, 0x1C, 0x3D, 0x06, + 0xE9, 0x1F, 0xD3, 0x02, 0x63, 0x29, 0xC7, 0xFB, 0xA6, 0x2C, 0xF4, 0xF9, + 0x1C, 0x24, 0x42, 0x07, 0x47, 0x18, 0x33, 0x18, 0xF7, 0x14, 0x5C, 0x1C, + 0x70, 0x1B, 0xE1, 0x16, 0x86, 0x21, 0xBE, 0x0F, 0x0B, 0x1C, 0x85, 0x05, + 0xCD, 0x0F, 0x72, 0xFC, 0x10, 0x0C, 0x19, 0xFD, 0x6E, 0x11, 0xB5, 0x07, + 0xD3, 0x18, 0x98, 0x14, 0x60, 0x1F, 0xD5, 0x1B, 0xAA, 0x24, 0x69, 0x1D, + 0x05, 0x26, 0xBF, 0x18, 0xC1, 0x21, 0xE4, 0x0E, 0xF6, 0x1C, 0xA4, 0x0A, + 0xA1, 0x17, 0x05, 0x0E, 0x0B, 0x11, 0xA7, 0x10, 0x6C, 0x0A, 0xC8, 0x0E, + 0x1F, 0x06, 0x00, 0x0C, 0xD3, 0x05, 0x86, 0x09, 0xB4, 0x06, 0x8A, 0x05, + 0x7F, 0x07, 0xA3, 0x00, 0x74, 0x0C, 0xEC, 0xF9, 0xA7, 0x16, 0x37, 0xF2, + 0xC9, 0x1C, 0xD9, 0xEF, 0x50, 0x1C, 0x85, 0xF5, 0x55, 0x1C, 0x83, 0xFE, + 0xF7, 0x1D, 0x90, 0x04, 0x78, 0x1F, 0xF2, 0x07, 0xF5, 0x1A, 0xB1, 0x0C, + 0x22, 0x0E, 0xF5, 0x0B, 0xF1, 0x00, 0x5F, 0x05, 0x97, 0xF9, 0xC1, 0x01, + 0xA3, 0xF8, 0xC0, 0xFF, 0xDF, 0xFB, 0xDD, 0x00, 0xC9, 0x02, 0x9C, 0x06, + 0x7A, 0x04, 0xE7, 0x0B, 0x94, 0x05, 0xAF, 0x13, 0xF6, 0x10, 0xC3, 0x1A, + 0x5A, 0x1F, 0x63, 0x15, 0x7C, 0x29, 0x52, 0x0A, 0x39, 0x23, 0xA5, 0x06, + 0xBB, 0x15, 0xEB, 0x0A, 0x74, 0x10, 0x90, 0x0A, 0x5F, 0x12, 0x78, 0x06, + 0x78, 0x16, 0xD2, 0x0E, 0x93, 0x15, 0x33, 0x1C, 0x5A, 0x18, 0x7E, 0x22, + 0x1D, 0x1F, 0x32, 0x25, 0x9C, 0x1F, 0x3F, 0x25, 0x86, 0x1D, 0xB1, 0x24, + 0xBE, 0x1D, 0xAF, 0x25, 0xFD, 0x1F, 0xBD, 0x21, 0x3B, 0x24, 0xC4, 0x1B, + 0xC8, 0x26, 0xC8, 0x1C, 0xCA, 0x2C, 0x98, 0x23, 0x59, 0x37, 0xA3, 0x25, + 0xF0, 0x3C, 0x6E, 0x20, 0x83, 0x38, 0xAB, 0x1C, 0x04, 0x31, 0xEF, 0x18, + 0x9A, 0x2E, 0x56, 0x10, 0xF8, 0x2A, 0x65, 0x0D, 0x7A, 0x25, 0xEA, 0x16, + 0xBC, 0x25, 0xAD, 0x20, 0xC9, 0x2C, 0x13, 0x25, 0x0D, 0x2E, 0xF1, 0x2B, + 0x99, 0x23, 0x11, 0x35, 0x2B, 0x1D, 0xFE, 0x37, 0x5E, 0x25, 0x5F, 0x35, + 0x68, 0x32, 0x34, 0x30, 0xF2, 0x36, 0x27, 0x2A, 0x57, 0x2E, 0x4E, 0x27, + 0xC6, 0x21, 0x06, 0x25, 0xA7, 0x1A, 0xE3, 0x24, 0x87, 0x13, 0xDC, 0x26, + 0x02, 0x09, 0x53, 0x27, 0xC1, 0x08, 0x54, 0x27, 0x33, 0x15, 0xF2, 0x1F, + 0x44, 0x1C, 0x4D, 0x16, 0x6A, 0x1A, 0x17, 0x18, 0x8B, 0x16, 0xF1, 0x1E, + 0x18, 0x14, 0x25, 0x26, 0x78, 0x10, 0x74, 0x2C, 0xA7, 0x13, 0x00, 0x2F, + 0xC3, 0x1E, 0x62, 0x2F, 0x80, 0x25, 0x8D, 0x2F, 0x45, 0x21, 0x18, 0x2C, + 0xF9, 0x11, 0x9A, 0x20, 0xDB, 0x04, 0xA1, 0x13, 0x7D, 0xFE, 0x44, 0x0B, + 0x7E, 0xFB, 0x1E, 0x07, 0x36, 0xFD, 0x16, 0x09, 0x24, 0x04, 0x30, 0x10, + 0x81, 0x0F, 0x43, 0x1B, 0xD4, 0x14, 0x88, 0x25, 0x0A, 0x0F, 0xF2, 0x24, + 0x54, 0x09, 0x1A, 0x1C, 0x18, 0x0D, 0x14, 0x17, 0x2C, 0x1A, 0x87, 0x1A, + 0xAC, 0x22, 0xD4, 0x20, 0xBA, 0x1E, 0xD5, 0x28, 0x55, 0x16, 0x30, 0x2F, + 0xA2, 0x0B, 0x1A, 0x2B, 0xF6, 0x03, 0x07, 0x23, 0x97, 0x02, 0xC6, 0x1B, + 0x2F, 0x05, 0x72, 0x14, 0x5A, 0x0C, 0xDA, 0x11, 0x34, 0x0F, 0x82, 0x0F, + 0x42, 0x0D, 0xE3, 0x0B, 0xC6, 0x05, 0xA4, 0x0C, 0x23, 0xFD, 0xA6, 0x10, + 0x8A, 0xFA, 0xCF, 0x10, 0x62, 0xFB, 0x7C, 0x0F, 0xDE, 0xFF, 0xF1, 0x0C, + 0xC1, 0xFA, 0xFF, 0x03, 0xA7, 0xEE, 0x55, 0xFD, 0x95, 0xE8, 0xA6, 0xF9, + 0x3C, 0xE5, 0x50, 0xF4, 0x43, 0xE9, 0x78, 0xF4, 0x94, 0xF2, 0xB0, 0xFB, + 0x45, 0xF4, 0xF7, 0xFF, 0xC7, 0xF1, 0x9E, 0xFE, 0x2E, 0xF4, 0x6A, 0xFB, + 0xE8, 0xF7, 0x1A, 0xF7, 0xC6, 0xF2, 0x75, 0xF2, 0xB1, 0xEB, 0x95, 0xF4, + 0xAE, 0xE7, 0xA0, 0xFD, 0x0E, 0xE3, 0xD9, 0x04, 0x4E, 0xDF, 0xA5, 0x06, + 0x9E, 0xD9, 0xB6, 0xFE, 0xE0, 0xCE, 0x5A, 0xED, 0x77, 0xC7, 0xDA, 0xDC, + 0x4D, 0xCA, 0xD7, 0xD5, 0x59, 0xD1, 0x56, 0xD8, 0x35, 0xDA, 0x80, 0xDC, + 0x29, 0xE1, 0xFB, 0xDD, 0x4D, 0xE2, 0xE5, 0xE4, 0x45, 0xDE, 0x4B, 0xF0, + 0x16, 0xDF, 0xBB, 0xF9, 0xE7, 0xE1, 0x17, 0x02, 0x5E, 0xDE, 0x2D, 0x05, + 0xAF, 0xDE, 0x61, 0x00, 0x3D, 0xE2, 0x78, 0xF6, 0x1C, 0xDF, 0x52, 0xE8, + 0x84, 0xD7, 0x88, 0xDD, 0x48, 0xD3, 0x62, 0xE0, 0x9F, 0xD6, 0x7B, 0xE9, + 0xAD, 0xDC, 0x0E, 0xED, 0x33, 0xE2, 0x73, 0xEB, 0x32, 0xE5, 0x27, 0xE5, + 0x8E, 0xDD, 0x1C, 0xDA, 0x31, 0xD7, 0xD6, 0xD4, 0x4C, 0xDB, 0xC8, 0xD8, + 0x31, 0xE1, 0xF0, 0xE1, 0x6E, 0xE2, 0x59, 0xEF, 0x4D, 0xDE, 0xDD, 0xF9, + 0xFB, 0xD4, 0x57, 0xFA, 0x18, 0xCB, 0x11, 0xF4, 0xF4, 0xC6, 0x88, 0xEB, + 0x6E, 0xC5, 0xBC, 0xE2, 0x0B, 0xC7, 0x54, 0xDD, 0xEA, 0xCA, 0xB2, 0xDB, + 0xD6, 0xCD, 0x67, 0xDE, 0xE7, 0xCF, 0x04, 0xE3, 0x5E, 0xCB, 0x7B, 0xE5, + 0xA5, 0xBF, 0xC0, 0xE1, 0x87, 0xB9, 0x49, 0xD7, 0x1D, 0xC1, 0x65, 0xD2, + 0x8F, 0xCE, 0xAD, 0xD2, 0xC8, 0xD3, 0x55, 0xCD, 0x07, 0xCF, 0x3A, 0xC5, + 0x2A, 0xC7, 0x31, 0xBD, 0xBD, 0xC7, 0x0E, 0xBA, 0xB3, 0xCB, 0x5A, 0xBD, + 0xC8, 0xC9, 0xD5, 0xC2, 0x33, 0xC9, 0xCF, 0xC8, 0x96, 0xCF, 0x66, 0xCA, + 0x09, 0xDA, 0xB6, 0xC5, 0x0E, 0xDA, 0xE2, 0xBC, 0x50, 0xD0, 0xE9, 0xB6, + 0x44, 0xCB, 0x0A, 0xBC, 0x5B, 0xCA, 0x23, 0xC7, 0x3C, 0xC9, 0xF8, 0xCE, + 0x3B, 0xCA, 0x23, 0xD4, 0x11, 0xCA, 0x4C, 0xD8, 0x43, 0xC3, 0xA3, 0xD4, + 0x3E, 0xC0, 0xDF, 0xCA, 0x71, 0xC9, 0x1E, 0xC8, 0x0C, 0xD2, 0x78, 0xCB, + 0x4B, 0xD6, 0x91, 0xD3, 0x09, 0xD7, 0x54, 0xDC, 0xF6, 0xD2, 0xB9, 0xDD, + 0x94, 0xCE, 0x04, 0xDF, 0xE2, 0xCC, 0x0A, 0xE8, 0x75, 0xCE, 0x10, 0xEC, + 0x7D, 0xD2, 0x47, 0xE4, 0x7A, 0xD7, 0x81, 0xDC, 0x04, 0xD9, 0x7A, 0xD9, + 0x34, 0xDA, 0x1F, 0xDA, 0x4A, 0xE0, 0x24, 0xD8, 0xCB, 0xE7, 0x5E, 0xD3, + 0x72, 0xF3, 0x63, 0xD0, 0xB8, 0xFE, 0x65, 0xCF, 0xA0, 0x00, 0x53, 0xD3, + 0x2B, 0xFA, 0xFF, 0xD7, 0x20, 0xF3, 0xE1, 0xD5, 0x28, 0xF5, 0xB7, 0xD3, + 0xA9, 0xFB, 0x7F, 0xD6, 0x50, 0x03, 0x82, 0xDD, 0xD4, 0x06, 0xD2, 0xEA, + 0x43, 0x00, 0x5A, 0xF8, 0x64, 0xF9, 0xFF, 0xFC, 0x82, 0xFC, 0x55, 0xFA, + 0x95, 0x05, 0x7E, 0xF4, 0x4B, 0x08, 0x62, 0xEC, 0x27, 0x09, 0x7B, 0xE9, + 0x68, 0x0D, 0x63, 0xEC, 0x62, 0x09, 0x7C, 0xF0, 0x88, 0xFE, 0xC5, 0xF8, + 0xAF, 0xFC, 0x58, 0x00, 0xB1, 0x02, 0x7E, 0x02, 0xE8, 0x06, 0xAB, 0xFE, + 0xE8, 0x08, 0x83, 0xF8, 0xB8, 0x07, 0xC6, 0xF9, 0x65, 0x01, 0x45, 0xFD, + 0x6D, 0xFE, 0x51, 0xFA, 0x1C, 0x02, 0x39, 0xF7, 0xCB, 0x07, 0x28, 0xF8, + 0x24, 0x0C, 0x00, 0xFA, 0x04, 0x0C, 0x8B, 0xFD, 0x9C, 0x06, 0xCF, 0xFF, + 0x9E, 0x01, 0xA4, 0xF9, 0xF8, 0xFF, 0x07, 0xF5, 0x78, 0xFD, 0x97, 0xF7, + 0x2E, 0xFB, 0x62, 0xFB, 0x71, 0xFE, 0x9C, 0x01, 0xE4, 0x08, 0x1D, 0x0A, + 0x88, 0x0E, 0x96, 0x10, 0x59, 0x08, 0x26, 0x0D, 0xBC, 0xFD, 0xEF, 0xFE, + 0x4E, 0xF7, 0xD5, 0xF1, 0x43, 0xF6, 0x8E, 0xEB, 0x40, 0xF7, 0x81, 0xE6, + 0x24, 0xF7, 0xBD, 0xE1, 0x67, 0xF5, 0x33, 0xE5, 0x77, 0xF0, 0xAA, 0xEF, + 0xD0, 0xE7, 0x9D, 0xF7, 0x19, 0xE6, 0xE7, 0xFD, 0x74, 0xEB, 0x29, 0x06, + 0xC5, 0xF0, 0x11, 0x08, 0xF1, 0xF4, 0xC7, 0xFF, 0x36, 0xF9, 0x07, 0xF5, + 0x1C, 0xFE, 0x46, 0xEA, 0x53, 0x03, 0x0C, 0xE3, 0x56, 0x08, 0x99, 0xE3, + 0xAC, 0x0D, 0xA9, 0xE6, 0xF2, 0x12, 0xE2, 0xE3, 0x31, 0x15, 0xAD, 0xDF, + 0xA7, 0x10, 0x43, 0xDC, 0xB0, 0x08, 0x00, 0xD8, 0xD8, 0x05, 0x52, 0xD8, + 0x0F, 0x0B, 0x33, 0xDF, 0x3D, 0x15, 0x04, 0xEA, 0xC0, 0x1A, 0x6D, 0xF8, + 0x75, 0x16, 0xA6, 0x09, 0xA7, 0x0B, 0x0F, 0x15, 0xC9, 0x05, 0x42, 0x18, + 0xE7, 0x06, 0x76, 0x13, 0x17, 0x05, 0xD8, 0x08, 0x52, 0x04, 0xEC, 0x01, + 0x16, 0x04, 0xFC, 0xFE, 0x66, 0xFF, 0x4C, 0xFB, 0x42, 0x00, 0x31, 0xFE, + 0x5C, 0x05, 0xD9, 0x08, 0x18, 0x06, 0xCA, 0x0D, 0xD2, 0x06, 0xFB, 0x07, + 0x38, 0x0F, 0x5B, 0x02, 0x0A, 0x19, 0x0F, 0x04, 0xB2, 0x18, 0x10, 0x09, + 0x81, 0x17, 0xB9, 0x0F, 0x01, 0x1C, 0x07, 0x13, 0xE1, 0x21, 0x13, 0x13, + 0x52, 0x27, 0xCB, 0x14, 0xCF, 0x2A, 0xED, 0x19, 0xBE, 0x29, 0x0A, 0x22, + 0x2F, 0x1D, 0x51, 0x21, 0x9E, 0x0F, 0xF3, 0x15, 0xEC, 0x0B, 0xCB, 0x0D, + 0x38, 0x0E, 0x15, 0x0C, 0x13, 0x15, 0x92, 0x13, 0x8E, 0x1B, 0x3F, 0x1E, + 0xC5, 0x1F, 0xD1, 0x21, 0xB6, 0x23, 0x00, 0x27, 0x57, 0x23, 0xAA, 0x2A, + 0x94, 0x1F, 0xAA, 0x26, 0x3A, 0x1D, 0x03, 0x1F, 0x53, 0x1E, 0x26, 0x19, + 0x8E, 0x22, 0x0B, 0x1A, 0x22, 0x27, 0xA2, 0x1F, 0xE3, 0x2C, 0xB3, 0x24, + 0x50, 0x31, 0x3C, 0x28, 0xA1, 0x31, 0x46, 0x2C, 0x7C, 0x2F, 0x29, 0x2C, + 0x67, 0x26, 0x0F, 0x26, 0x02, 0x1A, 0x82, 0x1E, 0xD4, 0x14, 0x9A, 0x17, + 0x89, 0x19, 0xEA, 0x15, 0x5B, 0x24, 0x10, 0x1D, 0x8D, 0x2B, 0xC2, 0x25, + 0x29, 0x2C, 0xA2, 0x2D, 0xB4, 0x2A, 0xCF, 0x30, 0x2B, 0x2A, 0x6B, 0x2B, + 0x65, 0x29, 0x0D, 0x2A, 0x3C, 0x26, 0x2E, 0x2D, 0xF9, 0x27, 0x58, 0x2B, + 0xEF, 0x31, 0x7C, 0x28, 0xFE, 0x38, 0x26, 0x2B, 0xA9, 0x36, 0x9E, 0x33, + 0xDC, 0x2D, 0x1E, 0x3F, 0xAB, 0x2C, 0x6E, 0x46, 0xBD, 0x33, 0x3F, 0x46, + 0xE9, 0x37, 0x39, 0x43, 0x5E, 0x39, 0xB0, 0x3D, 0xC9, 0x36, 0x22, 0x38, + 0x7A, 0x2D, 0x2E, 0x37, 0x04, 0x20, 0x57, 0x3B, 0x2B, 0x1B, 0x78, 0x41, + 0x26, 0x29, 0x19, 0x43, 0x77, 0x3B, 0x9B, 0x40, 0x8A, 0x40, 0x0C, 0x3E, + 0x66, 0x3E, 0xA8, 0x38, 0x77, 0x3A, 0x3C, 0x2E, 0x23, 0x30, 0xA4, 0x23, + 0x7A, 0x27, 0x4D, 0x1C, 0x79, 0x2B, 0xBA, 0x18, 0xCF, 0x34, 0x08, 0x1A, + 0xA2, 0x3B, 0x9D, 0x22, 0xA5, 0x3C, 0xCB, 0x2D, 0xCC, 0x33, 0x5A, 0x35, + 0xB0, 0x24, 0xFA, 0x32, 0x43, 0x1A, 0x1A, 0x25, 0xE9, 0x19, 0x55, 0x17, + 0xE2, 0x1F, 0x94, 0x15, 0xCA, 0x23, 0xC5, 0x1B, 0x24, 0x23, 0x08, 0x22, + 0x1E, 0x1F, 0xF8, 0x29, 0xDB, 0x13, 0x8B, 0x2E, 0x16, 0x08, 0x0F, 0x2D, + 0x55, 0x03, 0xC4, 0x26, 0xBA, 0xFF, 0xD8, 0x19, 0xF9, 0xFA, 0xB0, 0x0B, + 0x27, 0xF8, 0x74, 0x02, 0x85, 0xF3, 0xE4, 0xFA, 0xF3, 0xEC, 0x18, 0xF5, + 0x10, 0xEA, 0x6C, 0xF8, 0x09, 0xEF, 0x3C, 0x03, 0xF1, 0xFC, 0x2D, 0x0D, + 0x54, 0x0A, 0x0E, 0x11, 0x40, 0x0C, 0xB3, 0x0C, 0x69, 0x05, 0xBA, 0x01, + 0xE7, 0x01, 0x7D, 0xF7, 0x95, 0x05, 0x56, 0xF2, 0x5B, 0x09, 0x31, 0xF5, + 0x75, 0x07, 0xE5, 0xFB, 0x5E, 0x01, 0x73, 0xFE, 0xC4, 0xF9, 0x0F, 0xFC, + 0xD7, 0xF4, 0x79, 0xF5, 0x7D, 0xF3, 0xC2, 0xEE, 0xC7, 0xEF, 0xA8, 0xEA, + 0xA0, 0xEB, 0x7D, 0xEB, 0xE7, 0xEB, 0x13, 0xF2, 0xD4, 0xEC, 0x62, 0xFD, + 0x15, 0xEC, 0x71, 0x0B, 0x0B, 0xF0, 0x22, 0x18, 0xCC, 0xF7, 0x1F, 0x20, + 0xF6, 0xFB, 0x1E, 0x23, 0x98, 0xFE, 0x81, 0x21, 0x39, 0x04, 0xE9, 0x1A, + 0xC8, 0x00, 0xD6, 0x0F, 0x78, 0xF0, 0xEC, 0x03, 0x28, 0xE7, 0x5C, 0xFC, + 0xB6, 0xEB, 0x05, 0xFA, 0xBB, 0xF1, 0xDB, 0xF9, 0x6F, 0xF5, 0xE8, 0xFA, + 0xD9, 0xF7, 0xD6, 0xFD, 0x7F, 0xF5, 0x4D, 0xFC, 0xA5, 0xF0, 0xEA, 0xF3, + 0xA9, 0xE9, 0x36, 0xEE, 0x25, 0xE4, 0xA6, 0xEE, 0xA7, 0xE8, 0xD4, 0xF2, + 0x81, 0xF5, 0xE5, 0xFE, 0x00, 0xFD, 0x9A, 0x10, 0xE2, 0xF9, 0x61, 0x18, + 0x88, 0xF2, 0x22, 0x10, 0x57, 0xED, 0x00, 0x00, 0x6E, 0xEC, 0xEC, 0xF0, + 0x5C, 0xEC, 0x92, 0xEC, 0x62, 0xEB, 0x8D, 0xF2, 0x41, 0xEA, 0x97, 0xF9, + 0x1F, 0xE7, 0x40, 0xFF, 0x95, 0xE4, 0x63, 0x03, 0x17, 0xE7, 0x99, 0x04, + 0xD6, 0xED, 0x80, 0x03, 0xE5, 0xEF, 0x01, 0xFF, 0x52, 0xEC, 0xBA, 0xF7, + 0x6B, 0xE9, 0xA8, 0xF1, 0x92, 0xE4, 0xEA, 0xEE, 0xFC, 0xDE, 0xA7, 0xEB, + 0x42, 0xDE, 0x5F, 0xE9, 0x9A, 0xE5, 0x5D, 0xEF, 0x39, 0xED, 0xEC, 0xF5, + 0x09, 0xF0, 0xFB, 0xF7, 0xFD, 0xF0, 0xE4, 0xFB, 0x26, 0xF1, 0x08, 0xFC, + 0xF6, 0xF4, 0xC0, 0xF2, 0x02, 0xFA, 0xF1, 0xE9, 0x0D, 0xF9, 0xD4, 0xE7, + 0x5E, 0xF5, 0x3C, 0xEB, 0x08, 0xF8, 0x63, 0xF3, 0x61, 0x00, 0xFC, 0xFA, + 0xF8, 0x03, 0x35, 0xFF, 0x96, 0xFF, 0x4F, 0x00, 0x97, 0xFC, 0xA4, 0xF7, + 0xDF, 0xFC, 0x0A, 0xEA, 0x0F, 0xFA, 0x06, 0xE7, 0xC8, 0xF3, 0x15, 0xEF, + 0xC0, 0xF0, 0xB0, 0xFA, 0x38, 0xF5, 0xFA, 0x03, 0x5D, 0xFA, 0xF7, 0x06, + 0x15, 0xFB, 0x53, 0x04, 0xB6, 0xF9, 0x9D, 0x03, 0x5D, 0xF9, 0x38, 0x05, + 0x0A, 0xF5, 0x49, 0x01, 0xDE, 0xED, 0xE7, 0xFA, 0x72, 0xED, 0xF5, 0xF7, + 0xC1, 0xF1, 0x15, 0xF6, 0xD8, 0xF3, 0x9A, 0xF4, 0x14, 0xF2, 0x00, 0xF4, + 0x81, 0xF1, 0xAB, 0xEE, 0x43, 0xF3, 0x10, 0xE7, 0x75, 0xF0, 0x85, 0xDF, + 0x70, 0xE6, 0xF0, 0xD3, 0x16, 0xDE, 0xD0, 0xCD, 0x04, 0xE1, 0x37, 0xD1, + 0x98, 0xEE, 0x94, 0xD7, 0x6D, 0xFA, 0xCE, 0xE3, 0x9D, 0xFC, 0x74, 0xF0, + 0x00, 0xFB, 0x38, 0xF5, 0x77, 0xF5, 0x59, 0xF6, 0x00, 0xE8, 0xB4, 0xF4, + 0xF5, 0xDC, 0x4E, 0xEE, 0x33, 0xDE, 0x31, 0xE5, 0xBA, 0xE2, 0xF6, 0xDD, + 0x50, 0xE0, 0x08, 0xD9, 0x5A, 0xDA, 0x06, 0xD9, 0x84, 0xD7, 0xBF, 0xE0, + 0x33, 0xD5, 0xDA, 0xE8, 0x0E, 0xD3, 0xE9, 0xEA, 0x3A, 0xD8, 0xD8, 0xE6, + 0x1A, 0xE2, 0xDA, 0xE2, 0x48, 0xE7, 0x9A, 0xE3, 0xAC, 0xE4, 0xE0, 0xE5, + 0x98, 0xDF, 0xE4, 0xE8, 0xA7, 0xE0, 0x86, 0xEB, 0x42, 0xE5, 0x10, 0xEF, + 0x5A, 0xE6, 0x3E, 0xF6, 0xF3, 0xE6, 0xD3, 0xFA, 0x4A, 0xE5, 0x18, 0xF9, + 0x97, 0xDD, 0x90, 0xF1, 0x8F, 0xD6, 0xA8, 0xE4, 0x56, 0xD5, 0x91, 0xDA, + 0xDB, 0xDA, 0xC8, 0xD8, 0x6E, 0xE8, 0xFB, 0xDC, 0x96, 0xF6, 0xD0, 0xE6, + 0xDD, 0xFE, 0x18, 0xF1, 0xFE, 0x05, 0x5D, 0xF3, 0xA0, 0x05, 0xB0, 0xEE, + 0x17, 0xFA, 0x6F, 0xE4, 0x20, 0xF0, 0x78, 0xDB, 0xD3, 0xEC, 0x80, 0xDD, + 0x6E, 0xEC, 0x66, 0xE1, 0xDB, 0xEA, 0x4E, 0xE1, 0x59, 0xE8, 0x6D, 0xE3, + 0x84, 0xE8, 0xF7, 0xE6, 0x03, 0xED, 0xF6, 0xEA, 0x5C, 0xF7, 0x77, 0xF0, + 0x98, 0x02, 0xB5, 0xF0, 0x1D, 0x08, 0xF1, 0xEB, 0x30, 0x08, 0x98, 0xE7, + 0x0A, 0x06, 0x34, 0xE3, 0xC8, 0x01, 0x76, 0xE4, 0xBE, 0xFA, 0x4F, 0xEF, + 0x65, 0xF6, 0x18, 0xF9, 0xD5, 0xF3, 0x81, 0xF7, 0x15, 0xF0, 0xDE, 0xF0, + 0x7A, 0xEB, 0xFE, 0xEA, 0xFF, 0xE5, 0x75, 0xE4, 0x0A, 0xE3, 0xE7, 0xDF, + 0x03, 0xE4, 0x23, 0xE0, 0x44, 0xE9, 0x2B, 0xE7, 0x06, 0xF3, 0xCF, 0xF1, + 0xF4, 0xF7, 0x85, 0xFB, 0x59, 0xF6, 0x1E, 0x00, 0xD3, 0xF5, 0xB6, 0xFE, + 0x0D, 0xF6, 0x19, 0xFC, 0xEF, 0xF5, 0x82, 0xF5, 0x82, 0xF6, 0xCC, 0xEB, + 0xF8, 0xF4, 0xD4, 0xE6, 0xAE, 0xEE, 0x06, 0xE8, 0x84, 0xE9, 0xDE, 0xEE, + 0x6A, 0xE7, 0xB9, 0xF9, 0x85, 0xE9, 0xF7, 0xFF, 0xFA, 0xEE, 0x44, 0xFC, + 0xC2, 0xF2, 0xD1, 0xF3, 0xB3, 0xF9, 0x36, 0xEB, 0xA9, 0x02, 0x2A, 0xE6, + 0x5B, 0x03, 0x16, 0xE8, 0x8D, 0xF7, 0xF1, 0xEE, 0x65, 0xE8, 0x47, 0xF3, + 0xB2, 0xE0, 0xBA, 0xF0, 0x74, 0xDF, 0xB1, 0xEF, 0xAC, 0xE0, 0x34, 0xF0, + 0xC5, 0xE1, 0xAF, 0xE9, 0xBE, 0xDF, 0x89, 0xE0, 0x63, 0xDC, 0xB4, 0xD8, + 0xC6, 0xDD, 0xDA, 0xD3, 0x56, 0xE4, 0x0F, 0xD7, 0x19, 0xEC, 0x44, 0xE1, + 0x93, 0xF4, 0xAC, 0xEB, 0x13, 0xFF, 0x78, 0xEF, 0xC6, 0x08, 0x5C, 0xED, + 0xBA, 0x0D, 0x8C, 0xE6, 0x87, 0x09, 0x03, 0xD9, 0x83, 0xFE, 0xA0, 0xCB, + 0xD8, 0xF2, 0x7D, 0xC6, 0xA0, 0xEA, 0x8E, 0xCA, 0x6E, 0xE8, 0x98, 0xD4, + 0x4F, 0xE6, 0xF0, 0xDE, 0xDB, 0xE3, 0x88, 0xE4, 0xDB, 0xE4, 0x32, 0xE3, + 0x0D, 0xE5, 0xA8, 0xDE, 0xC5, 0xE4, 0x95, 0xDA, 0x74, 0xEC, 0xE6, 0xD9, + 0x23, 0xF7, 0xF2, 0xDC, 0xCB, 0xF9, 0x21, 0xE2, 0x83, 0xF6, 0x34, 0xEA, + 0x52, 0xEE, 0xC7, 0xED, 0x1B, 0xE3, 0x6E, 0xE6, 0x51, 0xDA, 0x80, 0xD8, + 0x42, 0xD8, 0x67, 0xD0, 0x47, 0xDE, 0x8E, 0xD3, 0x4F, 0xEA, 0x03, 0xDF, + 0x13, 0xF3, 0xE9, 0xE8, 0x06, 0xF4, 0x51, 0xED, 0xC8, 0xF4, 0xF1, 0xF2, + 0x4D, 0xF7, 0xA9, 0xF6, 0x7D, 0xFB, 0x29, 0xFD, 0x3B, 0x02, 0x67, 0x08, + 0x5E, 0x08, 0x2B, 0x0B, 0x9F, 0x08, 0x30, 0x06, 0xE3, 0xFD, 0x7A, 0xFC, + 0x95, 0xED, 0x3D, 0xEE, 0xC7, 0xE0, 0xBB, 0xE5, 0x0D, 0xDC, 0xFC, 0xE7, + 0x27, 0xE2, 0x9A, 0xF2, 0xFE, 0xF1, 0xC0, 0xFE, 0x55, 0x03, 0x34, 0x01, + 0x67, 0x0E, 0x3F, 0xFC, 0x9A, 0x10, 0xBE, 0xF8, 0x9C, 0x0F, 0x70, 0xF8, + 0x5A, 0x14, 0xD3, 0xFD, 0xD3, 0x19, 0xDA, 0x07, 0x9E, 0x18, 0xAB, 0x10, + 0xBD, 0x14, 0x56, 0x16, 0x7B, 0x10, 0x4D, 0x18, 0x65, 0x0A, 0x90, 0x17, + 0x24, 0x04, 0xB8, 0x16, 0xA0, 0x01, 0x2D, 0x13, 0xD9, 0x04, 0x80, 0x0E, + 0x26, 0x0B, 0x01, 0x0C, 0xAF, 0x10, 0x84, 0x0D, 0x21, 0x17, 0xD2, 0x13, + 0xC7, 0x21, 0x0A, 0x1A, 0xC2, 0x2A, 0x97, 0x1D, 0x55, 0x2E, 0x8E, 0x20, + 0x4D, 0x2E, 0x33, 0x21, 0x39, 0x2F, 0x3D, 0x1C, 0x64, 0x34, 0x13, 0x1A, + 0xC2, 0x34, 0xE9, 0x1C, 0x4A, 0x2C, 0x3D, 0x21, 0xAC, 0x23, 0xBA, 0x29, + 0x2C, 0x23, 0x7C, 0x2F, 0xED, 0x26, 0x93, 0x2F, 0x8C, 0x2C, 0xFD, 0x30, + 0x36, 0x39, 0x45, 0x33, 0x93, 0x43, 0x3E, 0x34, 0x35, 0x42, 0xE0, 0x31, + 0x01, 0x3C, 0xA3, 0x2B, 0xED, 0x36, 0x17, 0x28, 0x95, 0x31, 0xD3, 0x29, + 0x79, 0x2D, 0x5E, 0x2C, 0x22, 0x2D, 0xD3, 0x2B, 0x10, 0x2E, 0x14, 0x29, + 0xF7, 0x29, 0x2A, 0x29, 0x1D, 0x24, 0x55, 0x2D, 0x8A, 0x26, 0xB6, 0x2F, + 0xF6, 0x31, 0xBE, 0x2D, 0x33, 0x3F, 0x4C, 0x2D, 0x4D, 0x47, 0x8C, 0x31, + 0xA3, 0x47, 0xB8, 0x39, 0xB2, 0x42, 0x40, 0x40, 0xC7, 0x3F, 0x9C, 0x42, + 0xFC, 0x3F, 0x59, 0x42, 0x78, 0x3C, 0xB1, 0x3B, 0x17, 0x36, 0xB5, 0x30, + 0x4D, 0x31, 0x17, 0x29, 0xB5, 0x2A, 0x74, 0x24, 0x17, 0x24, 0xF0, 0x24, + 0xB5, 0x20, 0xA8, 0x2D, 0x3E, 0x1C, 0x73, 0x37, 0x5C, 0x17, 0xE6, 0x3C, + 0xC0, 0x19, 0xEA, 0x3B, 0x87, 0x20, 0xEE, 0x32, 0x70, 0x22, 0x83, 0x29, + 0xE0, 0x1E, 0xE8, 0x24, 0xDF, 0x18, 0xAE, 0x20, 0xE5, 0x15, 0x99, 0x1D, + 0x6E, 0x17, 0x08, 0x1E, 0xB8, 0x16, 0xD1, 0x22, 0x2F, 0x13, 0x58, 0x2B, + 0x73, 0x12, 0xEE, 0x2F, 0x60, 0x14, 0x5B, 0x2B, 0xDD, 0x15, 0x5E, 0x22, + 0xCB, 0x16, 0x46, 0x1C, 0x94, 0x17, 0x6B, 0x1E, 0x32, 0x1D, 0x47, 0x26, + 0x3A, 0x29, 0x48, 0x28, 0xA6, 0x2E, 0xA6, 0x22, 0x4F, 0x27, 0x91, 0x1A, + 0xF8, 0x19, 0x07, 0x12, 0xAE, 0x0E, 0x18, 0x0D, 0x5F, 0x0C, 0x79, 0x0E, + 0x09, 0x12, 0xE2, 0x13, 0xE1, 0x18, 0x36, 0x1B, 0xDF, 0x19, 0xA2, 0x22, + 0x6C, 0x14, 0x16, 0x28, 0xBA, 0x16, 0x4E, 0x2E, 0xBF, 0x22, 0x7A, 0x37, + 0x19, 0x2C, 0xD6, 0x42, 0xA4, 0x30, 0x82, 0x48, 0x57, 0x30, 0x71, 0x46, + 0xA4, 0x2C, 0xCA, 0x42, 0xCD, 0x27, 0x25, 0x3C, 0x74, 0x24, 0x58, 0x34, + 0xF1, 0x22, 0xA6, 0x30, 0x3A, 0x1F, 0x1B, 0x31, 0x7F, 0x1A, 0x48, 0x31, + 0xF6, 0x14, 0x48, 0x2D, 0x3A, 0x0F, 0x80, 0x23, 0x4D, 0x0B, 0xB2, 0x17, + 0xF6, 0x0E, 0x54, 0x10, 0xB4, 0x1D, 0x0A, 0x0C, 0x5F, 0x2A, 0x8F, 0x0B, + 0x4C, 0x2E, 0xA5, 0x16, 0xE7, 0x2C, 0xF1, 0x24, 0xD9, 0x2A, 0xC7, 0x28, + 0xE7, 0x2C, 0xA7, 0x25, 0x97, 0x2E, 0x41, 0x20, 0x02, 0x2B, 0x88, 0x1B, + 0xB3, 0x23, 0xA7, 0x1B, 0x75, 0x1C, 0x1F, 0x1F, 0x00, 0x1A, 0xD6, 0x20, + 0xB9, 0x1B, 0x40, 0x22, 0x82, 0x1C, 0x78, 0x26, 0xB4, 0x1B, 0xC9, 0x28, + 0x79, 0x1B, 0x14, 0x27, 0x22, 0x1A, 0x35, 0x22, 0x16, 0x16, 0x92, 0x19, + 0x9F, 0x0F, 0x5D, 0x15, 0x54, 0x07, 0xE4, 0x15, 0xE3, 0x02, 0x70, 0x16, + 0xD9, 0x03, 0xEC, 0x1A, 0xC0, 0x08, 0x83, 0x22, 0x27, 0x0E, 0x9B, 0x28, + 0xD1, 0x0D, 0x23, 0x2B, 0x4E, 0x0B, 0x18, 0x28, 0xF3, 0x0C, 0x03, 0x22, + 0xF4, 0x0E, 0xC4, 0x1C, 0xAF, 0x11, 0x4C, 0x18, 0xB0, 0x1A, 0x01, 0x16, + 0x33, 0x24, 0xBA, 0x11, 0x22, 0x26, 0x9B, 0x0B, 0x01, 0x1D, 0x4D, 0x0C, + 0xC9, 0x10, 0x75, 0x10, 0x57, 0x0D, 0xA3, 0x0E, 0x12, 0x0F, 0x9A, 0x09, + 0xC7, 0x11, 0xE7, 0x07, 0x7E, 0x13, 0xCA, 0x08, 0x71, 0x0F, 0xD9, 0x0E, + 0xA5, 0x07, 0xB0, 0x1A, 0x99, 0x01, 0xDE, 0x23, 0xD3, 0x01, 0xB5, 0x26, + 0x49, 0x05, 0xB3, 0x25, 0x6E, 0x05, 0x99, 0x1F, 0xD3, 0x00, 0xD5, 0x12, + 0x6C, 0xFA, 0x71, 0x05, 0xE2, 0xFA, 0x74, 0xFF, 0x01, 0xFD, 0x3D, 0xFF, + 0x98, 0xF9, 0x52, 0xFF, 0xF3, 0xF6, 0x10, 0x00, 0xAB, 0xF5, 0x2A, 0x00, + 0x66, 0xEF, 0x5D, 0xFE, 0x89, 0xE3, 0x3C, 0xFA, 0x14, 0xDF, 0xA9, 0xEF, + 0x43, 0xE6, 0x26, 0xE6, 0xBB, 0xE9, 0xAF, 0xE3, 0xBA, 0xE7, 0x28, 0xDE, + 0xCB, 0xE9, 0x88, 0xD7, 0x4A, 0xEA, 0xE0, 0xD5, 0xB1, 0xE4, 0xE1, 0xD3, + 0x92, 0xDD, 0x3C, 0xD1, 0x91, 0xDB, 0xEF, 0xCF, 0x9E, 0xDC, 0xE9, 0xCC, + 0x07, 0xD8, 0x8D, 0xC6, 0xEB, 0xD1, 0xD2, 0xC1, 0x33, 0xD0, 0xCB, 0xC6, + 0x1E, 0xD2, 0x8C, 0xD1, 0xA2, 0xD1, 0x22, 0xD9, 0x3F, 0xCB, 0x71, 0xDD, + 0x85, 0xC5, 0x0D, 0xDD, 0x81, 0xC6, 0x86, 0xD6, 0x86, 0xCA, 0x28, 0xCE, + 0x1B, 0xC6, 0x0C, 0xC3, 0xC1, 0xBA, 0x2F, 0xB8, 0xF8, 0xB2, 0xD1, 0xB8, + 0x1A, 0xB4, 0xD9, 0xC1, 0x1A, 0xBB, 0xAC, 0xC9, 0x44, 0xBF, 0x18, 0xD0, + 0xA0, 0xC3, 0x27, 0xD7, 0x22, 0xC9, 0x3B, 0xDC, 0x54, 0xC6, 0xEE, 0xDB, + 0xD6, 0xC2, 0xFB, 0xDA, 0x24, 0xC8, 0x63, 0xDA, 0xBF, 0xCE, 0x64, 0xD6, + 0xFA, 0xD2, 0x49, 0xD0, 0x68, 0xD6, 0xDA, 0xC9, 0xD8, 0xD8, 0x94, 0xC3, + 0x90, 0xD7, 0x19, 0xBD, 0x7E, 0xD3, 0x41, 0xB7, 0x92, 0xCF, 0xBC, 0xB1, + 0xA3, 0xCF, 0x6E, 0xAE, 0xA3, 0xD2, 0xAC, 0xB1, 0x8B, 0xD3, 0x0B, 0xBA, + 0x3E, 0xD3, 0xDD, 0xC4, 0x78, 0xCF, 0xC5, 0xD3, 0x16, 0xCC, 0x1B, 0xE3, + 0x98, 0xD3, 0x8E, 0xE8, 0xF1, 0xDE, 0xDA, 0xE2, 0x66, 0xE3, 0x18, 0xDA, + 0xEF, 0xE0, 0xD0, 0xD3, 0xFF, 0xD8, 0x33, 0xCE, 0xE7, 0xD1, 0xB2, 0xC8, + 0x36, 0xCE, 0xF4, 0xC7, 0x6A, 0xCC, 0x94, 0xCB, 0x78, 0xCD, 0x45, 0xD2, + 0x1D, 0xD4, 0xD7, 0xD8, 0x76, 0xDA, 0x82, 0xD9, 0xBF, 0xD7, 0xA5, 0xD8, + 0xD8, 0xCD, 0x22, 0xD5, 0xA6, 0xC7, 0xB9, 0xCD, 0x8C, 0xCC, 0xD7, 0xC8, + 0xA2, 0xD7, 0x0A, 0xCB, 0x1C, 0xE2, 0xFC, 0xD5, 0x47, 0xE6, 0x93, 0xDE, + 0x25, 0xE4, 0x5D, 0xE0, 0x31, 0xDE, 0xD5, 0xDF, 0x6D, 0xDA, 0x80, 0xDB, + 0x6B, 0xDB, 0xA3, 0xD7, 0x8D, 0xD8, 0x46, 0xD9, 0x2A, 0xD2, 0xE8, 0xDC, + 0x25, 0xD2, 0x15, 0xE0, 0x0E, 0xDB, 0x28, 0xE5, 0x3F, 0xE4, 0x2A, 0xEB, + 0x49, 0xE4, 0xA7, 0xEE, 0xD0, 0xE0, 0xD7, 0xF1, 0xD6, 0xE3, 0x75, 0xEE, + 0x53, 0xE9, 0x02, 0xE1, 0x0A, 0xE7, 0x2B, 0xD4, 0xF2, 0xE0, 0xDF, 0xCC, + 0x59, 0xE0, 0xB4, 0xCC, 0x3C, 0xE3, 0x95, 0xD1, 0x37, 0xE8, 0x7A, 0xD8, + 0x23, 0xEA, 0x19, 0xE0, 0x1A, 0xE4, 0xBC, 0xE3, 0x36, 0xDF, 0x5D, 0xE4, + 0x76, 0xDF, 0xC0, 0xE5, 0xD5, 0xDF, 0x45, 0xE8, 0x60, 0xE5, 0xA4, 0xE8, + 0x16, 0xF0, 0x86, 0xE7, 0x90, 0xF4, 0x6F, 0xE6, 0xBC, 0xF5, 0x1A, 0xE4, + 0x98, 0xFD, 0xB0, 0xE5, 0x7D, 0x08, 0x53, 0xEB, 0xCC, 0x0C, 0xE1, 0xF0, + 0xC3, 0x09, 0xE0, 0xF1, 0xCF, 0x05, 0x06, 0xEC, 0x4E, 0x03, 0xE5, 0xE5, + 0xAC, 0xFB, 0x04, 0xE7, 0x6A, 0xF2, 0xC2, 0xEE, 0xC2, 0xF4, 0xD5, 0xF7, + 0x8E, 0xFF, 0x5E, 0xFE, 0x20, 0x06, 0x4A, 0x01, 0xDE, 0x02, 0xA8, 0x00, + 0x28, 0xFA, 0xAD, 0xF9, 0xE3, 0xF4, 0x14, 0xF0, 0xB4, 0xF7, 0x7A, 0xE8, + 0xA0, 0x01, 0x9D, 0xE5, 0xC2, 0x0B, 0x67, 0xEC, 0x35, 0x0F, 0x45, 0xF9, + 0xD3, 0x0C, 0x5B, 0x03, 0x0B, 0x06, 0x87, 0x05, 0x89, 0xFC, 0x0E, 0x01, + 0xD3, 0xF8, 0x78, 0xF9, 0x03, 0xFA, 0x62, 0xF2, 0x56, 0xFB, 0xF4, 0xEE, + 0x01, 0x03, 0x56, 0xEF, 0xF1, 0x0F, 0x56, 0xF4, 0x76, 0x18, 0xF9, 0xFC, + 0x29, 0x18, 0x7F, 0x02, 0xF7, 0x15, 0x17, 0x03, 0x02, 0x16, 0x56, 0x01, + 0xA9, 0x12, 0x10, 0x00, 0x9D, 0x08, 0x02, 0x03, 0x9A, 0xFD, 0x59, 0x08, + 0xFF, 0xF6, 0x45, 0x0B, 0xE0, 0xF0, 0xDD, 0x0E, 0xF7, 0xED, 0xFF, 0x16, + 0x73, 0xF6, 0x90, 0x1F, 0x85, 0x04, 0x74, 0x22, 0x4F, 0x0D, 0x9B, 0x1E, + 0xB5, 0x0E, 0xD2, 0x13, 0xBA, 0x09, 0x5A, 0x02, 0xFF, 0x01, 0x22, 0xF7, + 0xB4, 0xFC, 0xB2, 0xF5, 0x36, 0xFF, 0xF4, 0xF6, 0x4E, 0x0C, 0xA3, 0xFC, + 0x8C, 0x1A, 0xA5, 0x03, 0xBB, 0x1A, 0xB0, 0x08, 0xDF, 0x0D, 0x57, 0x0C, + 0xD4, 0x01, 0xB5, 0x0A, 0xA6, 0xFF, 0xFC, 0x04, 0xC8, 0x01, 0x54, 0x01, + 0x22, 0x01, 0x3E, 0xFE, 0xBC, 0x02, 0xF6, 0xFA, 0x6C, 0x09, 0xD3, 0xFD, + 0x19, 0x14, 0xEF, 0x06, 0x3B, 0x1A, 0x6F, 0x0E, 0xEE, 0x17, 0x92, 0x13, + 0x5E, 0x15, 0x05, 0x14, 0x88, 0x18, 0x29, 0x0A, 0xDA, 0x1A, 0xE8, 0xFE, + 0x33, 0x15, 0x75, 0xFF, 0x4A, 0x0C, 0xD0, 0x0D, 0x7B, 0x03, 0x73, 0x1E, + 0xCD, 0x02, 0xF8, 0x27, 0xB1, 0x0C, 0xFA, 0x27, 0x3F, 0x15, 0x01, 0x22, + 0x30, 0x14, 0xEC, 0x1D, 0xFA, 0x0F, 0xB8, 0x19, 0x31, 0x0F, 0xAB, 0x0E, + 0xFE, 0x0F, 0xE4, 0x02, 0xB6, 0x12, 0x9F, 0x01, 0x08, 0x19, 0x1A, 0x06, + 0xE4, 0x1D, 0xA8, 0x0A, 0x10, 0x1F, 0x17, 0x11, 0x93, 0x1E, 0x6F, 0x14, + 0x06, 0x1B, 0x18, 0x14, 0x68, 0x17, 0x09, 0x10, 0x9A, 0x12, 0x8A, 0x07, + 0x61, 0x0D, 0x09, 0x02, 0xDC, 0x0F, 0x5A, 0x01, 0x2D, 0x17, 0xA1, 0x07, + 0x66, 0x19, 0xB9, 0x13, 0xB9, 0x16, 0x28, 0x1C, 0xB9, 0x15, 0xA6, 0x1D, + 0x6B, 0x18, 0x33, 0x18, 0x15, 0x1A, 0x93, 0x0D, 0x8C, 0x16, 0x12, 0x03, + 0xA2, 0x0F, 0x58, 0xFB, 0xA6, 0x08, 0xB1, 0xF5, 0x32, 0x03, 0x08, 0xF4, + 0xD7, 0xFA, 0xCB, 0xFA, 0x49, 0xF0, 0xFD, 0x05, 0xF0, 0xEA, 0x8B, 0x09, + 0x0F, 0xEE, 0x2D, 0x02, 0x10, 0xF6, 0x25, 0xF7, 0x3D, 0xF9, 0x91, 0xEF, + 0x11, 0xF6, 0x14, 0xED, 0xD3, 0xF2, 0x30, 0xEB, 0xEB, 0xF1, 0x6B, 0xE8, + 0x58, 0xF5, 0x0E, 0xEB, 0x32, 0xF9, 0x71, 0xF5, 0xB1, 0xF9, 0xC6, 0xFF, + 0xE0, 0xFA, 0xEA, 0xFE, 0x35, 0xFF, 0x12, 0xF3, 0x37, 0x02, 0xCF, 0xE5, + 0x13, 0xFB, 0x1E, 0xDD, 0x12, 0xF0, 0x9C, 0xD9, 0x6F, 0xED, 0xD6, 0xD9, + 0x72, 0xF1, 0x28, 0xE2, 0x09, 0xFA, 0x62, 0xEF, 0x13, 0x02, 0x66, 0xF5, + 0x9D, 0x03, 0x16, 0xF4, 0x28, 0x01, 0x9B, 0xF0, 0x83, 0xFF, 0xBC, 0xEE, + 0x2D, 0xFF, 0x69, 0xF5, 0x0A, 0xFE, 0x07, 0x04, 0x9D, 0xFE, 0x78, 0x0F, + 0x6E, 0x01, 0x57, 0x14, 0xBE, 0x02, 0x6B, 0x19, 0x1B, 0x02, 0xC3, 0x1F, + 0x88, 0x02, 0x12, 0x22, 0x84, 0x07, 0xB2, 0x21, 0xA4, 0x0E, 0xF6, 0x1F, + 0x39, 0x17, 0xE9, 0x20, 0x89, 0x20, 0x89, 0x25, 0x3D, 0x24, 0xC6, 0x2A, + 0xFB, 0x1F, 0x1F, 0x30, 0xD7, 0x19, 0x19, 0x33, 0x81, 0x18, 0x10, 0x34, + 0x2B, 0x1B, 0xC6, 0x31, 0x8D, 0x1C, 0x72, 0x29, 0xBE, 0x19, 0x63, 0x1C, + 0x3E, 0x16, 0xF9, 0x10, 0x43, 0x15, 0x0E, 0x0B, 0xC2, 0x15, 0xE1, 0x0D, + 0x6A, 0x18, 0x31, 0x1C, 0x22, 0x1E, 0xEC, 0x2E, 0x52, 0x27, 0xDC, 0x3B, + 0xDA, 0x35, 0x0D, 0x41, 0x0C, 0x40, 0x97, 0x3D, 0x0F, 0x3F, 0xA2, 0x34, + 0x12, 0x39, 0x21, 0x2F, 0x4A, 0x2C, 0x92, 0x2F, 0x78, 0x25, 0x94, 0x34, + 0x8E, 0x2C, 0x14, 0x37, 0x93, 0x2B, 0xBA, 0x30, 0xE7, 0x23, 0xD8, 0x29, + 0x00, 0x1F, 0x64, 0x23, 0x21, 0x19, 0x1C, 0x17, 0x47, 0x14, 0x58, 0x10, + 0xDD, 0x10, 0x37, 0x15, 0x83, 0x0D, 0x7C, 0x1A, 0x2E, 0x0B, 0x6E, 0x1C, + 0xB8, 0x0C, 0x51, 0x1F, 0x5E, 0x11, 0xDB, 0x20, 0xC6, 0x15, 0x03, 0x23, + 0x47, 0x16, 0xB4, 0x28, 0x98, 0x13, 0x82, 0x2C, 0x86, 0x12, 0xC6, 0x2B, + 0x4C, 0x12, 0xF5, 0x23, 0x11, 0x11, 0xA0, 0x17, 0xCC, 0x0E, 0xF6, 0x12, + 0x15, 0x0A, 0xB9, 0x17, 0x14, 0x0B, 0x83, 0x1E, 0xE5, 0x1D, 0x15, 0x26, + 0x53, 0x31, 0x99, 0x2B, 0xC3, 0x31, 0x05, 0x2C, 0x4C, 0x2B, 0x7A, 0x25, + 0x4D, 0x2B, 0xF0, 0x1D, 0xE9, 0x2F, 0x3D, 0x1C, 0xEF, 0x34, 0x7A, 0x21, + 0x48, 0x2D, 0x32, 0x29, 0x9E, 0x27, 0xA0, 0x2E, 0xC4, 0x29, 0x29, 0x2D, + 0x5F, 0x24, 0x1D, 0x2F, 0x57, 0x1D, 0xC3, 0x2D, 0x3F, 0x18, 0x6C, 0x23, + 0x65, 0x15, 0x92, 0x21, 0x38, 0x1E, 0x14, 0x21, 0xCF, 0x2D, 0xB2, 0x1F, + 0xC5, 0x32, 0x33, 0x22, 0x9A, 0x29, 0x9C, 0x24, 0xA6, 0x1D, 0xB1, 0x24, + 0x83, 0x18, 0xAC, 0x26, 0xF8, 0x18, 0x1E, 0x2A, 0x8F, 0x1A, 0x7B, 0x28, + 0xDA, 0x14, 0x56, 0x25, 0xF9, 0x10, 0x3B, 0x22, 0xFA, 0x12, 0xAD, 0x17, + 0xD3, 0x13, 0xC6, 0x11, 0xA5, 0x13, 0xB4, 0x17, 0x09, 0x12, 0x24, 0x22, + 0x03, 0x14, 0xFA, 0x2B, 0x0E, 0x1B, 0xC2, 0x2D, 0x35, 0x21, 0x5B, 0x2A, + 0xA7, 0x1E, 0x51, 0x21, 0x92, 0x1A, 0x6F, 0x17, 0x3E, 0x18, 0x51, 0x17, + 0xFE, 0x13, 0x4B, 0x1B, 0xA4, 0x10, 0xD3, 0x1C, 0x19, 0x0A, 0x16, 0x1B, + 0xE6, 0x06, 0xF0, 0x16, 0xCD, 0x09, 0xE1, 0x14, 0xAC, 0x0A, 0x3D, 0x15, + 0xB8, 0x09, 0x8B, 0x16, 0x6C, 0x04, 0x7F, 0x17, 0xD0, 0x01, 0x91, 0x16, + 0x31, 0x05, 0x68, 0x15, 0x85, 0x0D, 0x1B, 0x17, 0xC4, 0x16, 0x06, 0x1C, + 0x4F, 0x13, 0x49, 0x21, 0x36, 0x09, 0x54, 0x27, 0xA2, 0x01, 0x6B, 0x25, + 0x50, 0x00, 0x13, 0x1B, 0x66, 0x05, 0xBF, 0x14, 0xF9, 0x0C, 0x1E, 0x12, + 0xD0, 0x10, 0x96, 0x11, 0xAB, 0x12, 0x2F, 0x16, 0x84, 0x15, 0x8D, 0x19, + 0xC3, 0x15, 0x39, 0x18, 0x4B, 0x14, 0x75, 0x15, 0x47, 0x11, 0xD2, 0x11, + 0x1B, 0x11, 0x95, 0x0E, 0x39, 0x0F, 0xB5, 0x06, 0x86, 0x0A, 0x97, 0xFD, + 0x47, 0x0C, 0x30, 0xFE, 0x8E, 0x08, 0x6F, 0xFD, 0xB7, 0xFF, 0x7D, 0xFC, + 0xCC, 0xF7, 0x72, 0x00, 0x7C, 0xF4, 0x9A, 0xFD, 0x18, 0xFB, 0x3A, 0xF6, + 0x36, 0x03, 0x8D, 0xEF, 0xE1, 0x09, 0x2F, 0xEC, 0x75, 0x07, 0x28, 0xEC, + 0xB4, 0xFE, 0x38, 0xF2, 0x28, 0xF7, 0xA3, 0xFB, 0x20, 0xEA, 0x5A, 0xFB, + 0x1C, 0xDF, 0xE1, 0xF4, 0xD6, 0xDE, 0x33, 0xEF, 0x50, 0xDC, 0xC0, 0xE2, + 0xBC, 0xD2, 0x5F, 0xD4, 0x44, 0xCA, 0xF7, 0xCC, 0x39, 0xCC, 0xEB, 0xCC, + 0x46, 0xD8, 0x84, 0xD2, 0xF1, 0xE2, 0x1A, 0xDE, 0xE1, 0xE8, 0x11, 0xED, + 0x37, 0xEA, 0x6F, 0xF5, 0x79, 0xEA, 0x5D, 0xF7, 0xC9, 0xEB, 0x4E, 0xF1, + 0xB7, 0xE9, 0x08, 0xE9, 0x31, 0xE0, 0xF1, 0xE0, 0x42, 0xDE, 0xC4, 0xDC, + 0xE4, 0xE2, 0x9D, 0xE0, 0xDF, 0xDF, 0xF6, 0xE2, 0x43, 0xDD, 0x0E, 0xE4, + 0x2B, 0xDC, 0x8E, 0xE4, 0x49, 0xD2, 0xE9, 0xDB, 0x32, 0xCE, 0xEF, 0xD4, + 0x9E, 0xD9, 0x6B, 0xD6, 0x0E, 0xE1, 0xC9, 0xD3, 0xBA, 0xDF, 0xC9, 0xD0, + 0x48, 0xE4, 0xA5, 0xD9, 0x29, 0xEB, 0x8D, 0xE9, 0x11, 0xE9, 0xE7, 0xF2, + 0x4C, 0xDC, 0xD2, 0xF2, 0x15, 0xCE, 0x83, 0xEE, 0x4E, 0xCB, 0x25, 0xEA, + 0xC9, 0xD1, 0xBB, 0xE7, 0x16, 0xDA, 0x9A, 0xE1, 0x09, 0xD5, 0x9F, 0xD9, + 0x2E, 0xCF, 0xB2, 0xDD, 0x03, 0xD4, 0x6A, 0xDF, 0xED, 0xE1, 0x22, 0xDB, + 0x5F, 0xF4, 0x94, 0xE0, 0xC7, 0xF8, 0x85, 0xE6, 0xE5, 0xF8, 0x30, 0xE7, + 0x26, 0xFA, 0x96, 0xE4, 0x16, 0xFD, 0x2E, 0xE2, 0xFF, 0xFB, 0x53, 0xE1, + 0x0A, 0xF0, 0x88, 0xE0, 0x3A, 0xEA, 0x6B, 0xE3, 0x5C, 0xE9, 0x61, 0xE6, + 0xE6, 0xE8, 0x4C, 0xE9, 0x60, 0xE5, 0x98, 0xED, 0x85, 0xD8, 0x10, 0xEA, + 0xA5, 0xD5, 0x5D, 0xE1, 0x94, 0xDC, 0x34, 0xDC, 0xDB, 0xE8, 0xB6, 0xDC, + 0x43, 0xFC, 0x87, 0xE4, 0x8D, 0xFC, 0xA2, 0xE8, 0xF0, 0xEA, 0x64, 0xE4, + 0xC2, 0xDC, 0x16, 0xDE, 0xF9, 0xDB, 0x72, 0xDB, 0x6E, 0xE1, 0xF9, 0xDD, + 0xCA, 0xE2, 0xFD, 0xE0, 0x3E, 0xE6, 0x18, 0xDE, 0x94, 0xEE, 0x25, 0xD8, + 0x00, 0xEE, 0xF5, 0xD0, 0xE9, 0xEA, 0xD6, 0xD0, 0x3A, 0xEE, 0x0B, 0xD9, + 0xAB, 0xF1, 0x2F, 0xE0, 0x07, 0xF9, 0x02, 0xE7, 0x29, 0xFF, 0xA9, 0xE6, + 0xF0, 0xFB, 0x92, 0xDF, 0xF2, 0xE9, 0x2F, 0xDA, 0x03, 0xD7, 0x68, 0xD9, + 0xDE, 0xCA, 0x54, 0xD8, 0x8D, 0xC6, 0x5B, 0xD7, 0x13, 0xCE, 0xBA, 0xDC, + 0xB7, 0xD0, 0xAA, 0xDB, 0xE5, 0xC6, 0xDB, 0xD0, 0xBC, 0xC0, 0xD6, 0xCB, + 0x42, 0xC0, 0x0B, 0xC6, 0x02, 0xC3, 0x1A, 0xC8, 0x77, 0xCB, 0x01, 0xD8, + 0x69, 0xD3, 0xC1, 0xDB, 0xBD, 0xDD, 0xA7, 0xD8, 0xA2, 0xE1, 0xC3, 0xD6, + 0x22, 0xD0, 0xB5, 0xC8, 0x5B, 0xC1, 0x38, 0xC1, 0xC1, 0xBD, 0x57, 0xC1, + 0xA1, 0xB9, 0x71, 0xBA, 0x91, 0xC4, 0x99, 0xBD, 0x77, 0xD5, 0x0E, 0xC4, + 0x26, 0xDD, 0xF0, 0xC6, 0xFA, 0xE4, 0x84, 0xCF, 0xDE, 0xE5, 0x9D, 0xD2, + 0xA2, 0xE4, 0x20, 0xD4, 0x2D, 0xE5, 0xEE, 0xDA, 0xE2, 0xE8, 0x4C, 0xE2, + 0xCC, 0xF3, 0xB4, 0xE3, 0x7D, 0xF1, 0x13, 0xD8, 0xB7, 0xEA, 0xC1, 0xCF, + 0x5D, 0xEE, 0xF1, 0xD3, 0xDF, 0xF2, 0xF8, 0xDB, 0x5C, 0xF4, 0x40, 0xE4, + 0xC0, 0xF7, 0x50, 0xF0, 0x1E, 0xF2, 0xDB, 0xF4, 0x46, 0xEA, 0x24, 0xF1, + 0x93, 0xEE, 0xB2, 0xF1, 0x4D, 0xF5, 0xBB, 0xF3, 0x27, 0xFF, 0xD6, 0xFC, + 0x20, 0x04, 0xCA, 0x05, 0xF9, 0x0A, 0x03, 0x0F, 0x76, 0x16, 0x2A, 0x1F, + 0x24, 0x10, 0xF0, 0x1F, 0x75, 0x00, 0x8E, 0x0D, 0x7E, 0xFD, 0x72, 0x04, + 0xD8, 0xFE, 0xDB, 0x00, 0x86, 0x01, 0x4B, 0xFF, 0x0C, 0x05, 0xA5, 0x01, + 0x8B, 0x05, 0x5D, 0xFC, 0x12, 0x0A, 0xD1, 0xF8, 0x45, 0x15, 0x44, 0x01, + 0x06, 0x21, 0x0B, 0x0D, 0x8E, 0x23, 0x92, 0x10, 0x2F, 0x20, 0xB9, 0x11, + 0xE7, 0x18, 0x4A, 0x10, 0x92, 0x18, 0x49, 0x13, 0x49, 0x19, 0x89, 0x15, + 0xA8, 0x0F, 0x6B, 0x09, 0x04, 0x03, 0x6A, 0xFC, 0x44, 0x01, 0x7B, 0xFA, + 0xA4, 0x0B, 0xD1, 0xFD, 0xDD, 0x0D, 0xFB, 0xFF, 0xDA, 0x08, 0x8A, 0x08, + 0xB3, 0x00, 0xFE, 0x0B, 0xD2, 0xFA, 0x38, 0x06, 0x31, 0x01, 0x98, 0x07, + 0x2C, 0x0A, 0x6D, 0x0D, 0xD8, 0x0D, 0x1C, 0x10, 0x97, 0x11, 0xAE, 0x0F, + 0xD8, 0x0F, 0x92, 0x0C, 0xDB, 0x05, 0xAC, 0x06, 0xCA, 0xF9, 0x54, 0x01, + 0x85, 0xF4, 0x0C, 0xFF, 0xA7, 0xFD, 0x4C, 0xFA, 0x12, 0x0F, 0x96, 0xF6, + 0x97, 0x1B, 0x5D, 0xF7, 0xE5, 0x1B, 0x14, 0xF6, 0x89, 0x1D, 0xF4, 0xF7, + 0xB1, 0x1F, 0x49, 0xFF, 0x12, 0x1B, 0xDF, 0x05, 0xDC, 0x18, 0x59, 0x06, + 0x37, 0x18, 0x99, 0x00, 0xB1, 0x11, 0x41, 0xFA, 0xB9, 0x02, 0x0F, 0xF7, + 0x73, 0xF0, 0x87, 0xF4, 0x4B, 0xEF, 0x22, 0xFE, 0xE9, 0xF4, 0x57, 0x0B, + 0x80, 0xF1, 0x32, 0x0A, 0x30, 0xFB, 0x97, 0x0E, 0x12, 0x04, 0x5B, 0x10, + 0xA7, 0x09, 0x30, 0x10, 0x67, 0x0A, 0xC1, 0x11, 0x97, 0xFC, 0x8C, 0x0C, + 0xFB, 0xFA, 0x44, 0x0E, 0x5C, 0x0A, 0xAD, 0x15, 0x3F, 0x0E, 0xA6, 0x10, + 0x46, 0x04, 0x4B, 0x05, 0xAC, 0x03, 0xC3, 0x08, 0x45, 0x06, 0x5C, 0x0D, + 0x89, 0x08, 0x12, 0x0B, 0xE4, 0x0C, 0x4E, 0x04, 0x02, 0x16, 0xD2, 0x00, + 0xEF, 0x18, 0x80, 0xFE, 0x1F, 0x13, 0x00, 0xFC, 0x64, 0x1A, 0x7B, 0x05, + 0x9C, 0x20, 0x80, 0x0E, 0x2D, 0x1E, 0x39, 0x15, 0xFF, 0x20, 0x59, 0x1B, + 0xCD, 0x22, 0x57, 0x19, 0x29, 0x23, 0x40, 0x17, 0x37, 0x1F, 0x8C, 0x14, + 0x44, 0x19, 0x2A, 0x13, 0x79, 0x18, 0x60, 0x15, 0x96, 0x1A, 0x2F, 0x19, + 0x6F, 0x22, 0xCC, 0x20, 0x0B, 0x26, 0xAE, 0x20, 0x44, 0x20, 0x05, 0x19, + 0x69, 0x14, 0xB1, 0x12, 0xE7, 0x0B, 0xA3, 0x11, 0x11, 0x02, 0xB2, 0x0C, + 0xA2, 0x03, 0x39, 0x0F, 0xC8, 0x10, 0xEB, 0x17, 0x8B, 0x0D, 0x3E, 0x14, + 0x9B, 0x07, 0xCE, 0x11, 0x03, 0x06, 0x44, 0x11, 0x22, 0x00, 0x1A, 0x0D, + 0x3C, 0xFB, 0x11, 0x0C, 0x30, 0xFB, 0xAA, 0x0C, 0x17, 0x00, 0xE2, 0x09, + 0x74, 0x0A, 0x5D, 0x06, 0xE9, 0x16, 0xA2, 0x07, 0xF0, 0x1C, 0x50, 0x0E, + 0xBC, 0x1D, 0xD0, 0x17, 0x4F, 0x20, 0x72, 0x25, 0x49, 0x20, 0x91, 0x2B, + 0x17, 0x22, 0x35, 0x29, 0x8B, 0x22, 0x18, 0x22, 0x0D, 0x20, 0x38, 0x16, + 0x39, 0x1F, 0xE4, 0x0D, 0xE2, 0x19, 0xD1, 0x0B, 0x9F, 0x0F, 0x51, 0x0F, + 0xF4, 0x12, 0xD9, 0x21, 0xCE, 0x1D, 0xC5, 0x34, 0x4A, 0x26, 0x29, 0x3A, + 0xD3, 0x2F, 0x2B, 0x3C, 0x55, 0x27, 0x80, 0x33, 0x67, 0x1C, 0x63, 0x2D, + 0x1A, 0x1D, 0xB5, 0x2F, 0xEA, 0x19, 0xEB, 0x23, 0x86, 0x15, 0x05, 0x16, + 0xBB, 0x16, 0x41, 0x19, 0xC8, 0x1C, 0xE1, 0x21, 0x12, 0x24, 0xD7, 0x27, + 0xB5, 0x23, 0x81, 0x2A, 0xD9, 0x14, 0x83, 0x1F, 0xCB, 0x0A, 0x33, 0x10, + 0xCE, 0x10, 0x55, 0x0C, 0x26, 0x14, 0xEF, 0x06, 0xF2, 0x15, 0x67, 0x02, + 0xE1, 0x19, 0x33, 0x07, 0x89, 0x16, 0xD9, 0x0F, 0x2E, 0x0F, 0x2F, 0x19, + 0x23, 0x0C, 0x2D, 0x19, 0x47, 0x08, 0xCE, 0x10, 0xD6, 0xFD, 0x73, 0x09, + 0x7B, 0xFE, 0x62, 0x0D, 0xC2, 0x02, 0xA4, 0x10, 0x0C, 0x03, 0x11, 0x12, + 0xD2, 0x01, 0xF1, 0x13, 0xB0, 0xF8, 0x79, 0x0C, 0x19, 0xF9, 0x35, 0x0E, + 0x24, 0x03, 0x7F, 0x13, 0xFB, 0x0C, 0x9A, 0x11, 0x25, 0x14, 0xB9, 0x0D, + 0x53, 0x0E, 0xA6, 0x06, 0xD5, 0xFF, 0xA8, 0x00, 0x00, 0xF7, 0xC8, 0xFD, + 0x66, 0xF8, 0x52, 0x01, 0x16, 0x01, 0x18, 0x0A, 0x40, 0x09, 0xD3, 0x11, + 0x41, 0x11, 0xB3, 0x1F, 0xCB, 0x18, 0x65, 0x2B, 0xFC, 0x17, 0xC4, 0x1F, + 0x1A, 0x13, 0x17, 0x0D, 0xAD, 0x0D, 0xD1, 0x08, 0x6B, 0x0C, 0xC0, 0x10, + 0x48, 0x17, 0x9E, 0x21, 0xB8, 0x20, 0x81, 0x28, 0x45, 0x1E, 0xC6, 0x1E, + 0x0E, 0x1A, 0x80, 0x17, 0x82, 0x15, 0x86, 0x15, 0xA0, 0x10, 0xC8, 0x15, + 0x0F, 0x10, 0x42, 0x13, 0xE1, 0x13, 0xED, 0x13, 0x71, 0x16, 0xDD, 0x20, + 0xC0, 0x10, 0x76, 0x29, 0x91, 0x08, 0x41, 0x23, 0xC6, 0x03, 0x10, 0x1C, + 0x9E, 0xFF, 0xB6, 0x18, 0x1F, 0x0C, 0xE4, 0x20, 0x98, 0x1A, 0xF3, 0x25, + 0xFC, 0x10, 0xAB, 0x0F, 0xD0, 0x0C, 0x40, 0x02, 0x7A, 0x10, 0xFE, 0x05, + 0x02, 0x06, 0xB1, 0x03, 0x96, 0x03, 0x90, 0x0A, 0x6E, 0x0F, 0x13, 0x15, + 0xB3, 0x16, 0xE6, 0x15, 0x2F, 0x16, 0xAE, 0x16, 0x11, 0x0B, 0xF5, 0x11, + 0xC8, 0xFB, 0xAA, 0x06, 0x21, 0xF0, 0xC8, 0xFF, 0x8D, 0xEF, 0xFF, 0x00, + 0x3E, 0xF9, 0x1E, 0x08, 0x95, 0xFC, 0x4D, 0x09, 0x97, 0xFD, 0x00, 0x04, + 0xC2, 0x04, 0x4D, 0x05, 0x46, 0x04, 0x25, 0x08, 0xD7, 0xFA, 0x97, 0x09, + 0xB5, 0xF6, 0xD8, 0x0B, 0x12, 0xFF, 0x8B, 0x0B, 0xD2, 0x02, 0xB8, 0x00, + 0xF7, 0xFD, 0x7A, 0xF7, 0x98, 0xFD, 0xCD, 0xFD, 0x92, 0xF5, 0x89, 0x00, + 0xEA, 0xEA, 0xF2, 0xFE, 0xB9, 0xEC, 0xB2, 0xFF, 0x94, 0xEF, 0xA5, 0xF8, + 0x86, 0xEF, 0x98, 0xEA, 0x9B, 0xF8, 0x4F, 0xE6, 0x21, 0xFF, 0x65, 0xEE, + 0x56, 0xF2, 0x5D, 0xEC, 0xA4, 0xE9, 0xC1, 0xE8, 0xC5, 0xEF, 0x61, 0xF4, + 0x7E, 0xEE, 0xAC, 0xFD, 0x8D, 0xE8, 0x30, 0xFA, 0x5C, 0xEB, 0x60, 0xF1, + 0xAD, 0xEC, 0xFD, 0xEC, 0xEC, 0xDD, 0xDC, 0xEA, 0x48, 0xD0, 0xE0, 0xE9, + 0x1C, 0xD8, 0x98, 0xEC, 0xC7, 0xE1, 0x31, 0xEF, 0x2A, 0xE8, 0xE2, 0xF4, + 0xB1, 0xF4, 0x59, 0xFE, 0x99, 0xF9, 0x0C, 0x00, 0x82, 0xF8, 0x51, 0xF8, + 0x81, 0xF7, 0x99, 0xF0, 0x03, 0xED, 0x3C, 0xEB, 0xE9, 0xE2, 0xED, 0xEB, + 0xEA, 0xE9, 0x3B, 0xF0, 0x41, 0xFE, 0xCB, 0xF6, 0xCD, 0x09, 0x89, 0xFA, + 0x7B, 0x04, 0xB2, 0xF8, 0x9A, 0x01, 0x15, 0xFC, 0xAA, 0xFF, 0x35, 0xFC, + 0xA8, 0xFB, 0x26, 0xF7, 0x21, 0x01, 0x55, 0xF3, 0x9A, 0x05, 0x0C, 0xF1, + 0x1E, 0x00, 0xE1, 0xF3, 0x2E, 0xFB, 0x07, 0xF5, 0x99, 0xFD, 0x5B, 0xF2, + 0x76, 0xFF, 0x5A, 0xF1, 0x8A, 0xFB, 0xCB, 0xEF, 0xD3, 0xFD, 0x7C, 0xF4, + 0xD5, 0x01, 0x93, 0xF9, 0x50, 0xF9, 0xEE, 0xED, 0x9A, 0xF4, 0xFD, 0xE4, + 0xFC, 0xF9, 0xF2, 0xEA, 0x5B, 0xFC, 0xEA, 0xEF, 0xEF, 0xFE, 0xE4, 0xF2, + 0x93, 0x02, 0x4C, 0xF6, 0x14, 0x03, 0xFA, 0xFF, 0x0C, 0x04, 0x97, 0x0E, + 0x78, 0x05, 0xE1, 0x0F, 0x76, 0xFF, 0x04, 0x05, 0xA6, 0xF3, 0xDD, 0xFA, + 0x4D, 0xEF, 0x60, 0xF9, 0x98, 0xEC, 0x59, 0xFB, 0x89, 0xE8, 0xFF, 0xFE, + 0xD8, 0xE4, 0x27, 0xFD, 0xD2, 0xE8, 0xD4, 0xFB, 0xC9, 0xF6, 0xF1, 0x01, + 0x27, 0xF9, 0x48, 0xFC, 0xDF, 0xF5, 0x92, 0xF7, 0x66, 0xF5, 0xD4, 0xF8, + 0x36, 0xEF, 0x24, 0xF5, 0x08, 0xE8, 0xD2, 0xEF, 0x08, 0xE5, 0x2F, 0xEC, + 0xBC, 0xE4, 0xCF, 0xEA, 0x72, 0xE5, 0xEC, 0xE5, 0x75, 0xE5, 0x0B, 0xDE, + 0x3D, 0xE2, 0x6E, 0xD8, 0xDF, 0xDF, 0xD6, 0xD4, 0x40, 0xE1, 0x31, 0xD1, + 0xFC, 0xE7, 0x26, 0xD7, 0x82, 0xEC, 0xA2, 0xDC, 0x7B, 0xE8, 0x24, 0xDA, + 0x18, 0xE6, 0x64, 0xDF, 0x0B, 0xE8, 0xD3, 0xE7, 0x7E, 0xEA, 0xE5, 0xED, + 0x50, 0xE7, 0xA7, 0xEE, 0x45, 0xE3, 0x9F, 0xE8, 0xAC, 0xE7, 0x1C, 0xE3, + 0x9B, 0xEC, 0x07, 0xDF, 0x7B, 0xE4, 0x83, 0xD9, 0xE4, 0xDB, 0x16, 0xDB, + 0xD0, 0xE1, 0xCB, 0xE4, 0x94, 0xE6, 0x84, 0xE9, 0xAD, 0xE6, 0xC4, 0xEB, + 0x89, 0xE9, 0x6E, 0xEB, 0xE5, 0xEE, 0xAA, 0xE9, 0xCD, 0xF3, 0x6C, 0xE9, + 0x3C, 0xF8, 0xEF, 0xE5, 0xFF, 0xFA, 0xBF, 0xE8, 0x39, 0xF3, 0xFE, 0xEE, + 0x41, 0xE9, 0xE6, 0xF2, 0xAB, 0xE6, 0xC0, 0xF6, 0x5E, 0xE1, 0x47, 0xF1, + 0x47, 0xDB, 0x79, 0xE7, 0xFB, 0xDC, 0xA8, 0xE1, 0xA7, 0xE2, 0xF3, 0xDE, + 0xE7, 0xE6, 0x4C, 0xE0, 0x8C, 0xE8, 0x9E, 0xE3, 0xEA, 0xEB, 0xA4, 0xE4, + 0x51, 0xEC, 0x99, 0xE4, 0xB2, 0xE9, 0xE2, 0xE5, 0xBD, 0xEF, 0x0C, 0xEA, + 0xF9, 0xF9, 0xC4, 0xEF, 0xA3, 0xFB, 0xF5, 0xEC, 0x87, 0xF8, 0x21, 0xE8, + 0x87, 0xF3, 0x6A, 0xE3, 0xB5, 0xED, 0x3A, 0xD8, 0xFB, 0xEA, 0xE1, 0xCF, + 0x2B, 0xE6, 0xB2, 0xD1, 0xC4, 0xE0, 0x7C, 0xD8, 0x79, 0xDA, 0xCB, 0xD8, + 0x32, 0xD9, 0x4E, 0xD7, 0xDE, 0xDE, 0xC3, 0xD5, 0xEA, 0xDD, 0xAB, 0xCD, + 0x5A, 0xDD, 0x47, 0xC9, 0xBE, 0xDE, 0xE8, 0xCA, 0x20, 0xDB, 0x5D, 0xCF, + 0x9D, 0xD4, 0xB5, 0xD3, 0x3A, 0xCD, 0x6B, 0xD4, 0x44, 0xD1, 0x08, 0xD8, + 0x74, 0xDB, 0x7B, 0xD4, 0x83, 0xDF, 0x86, 0xC8, 0x89, 0xE5, 0x90, 0xC4, + 0x19, 0xEC, 0x87, 0xC6, 0xA4, 0xEC, 0x1D, 0xCE, 0x07, 0xEC, 0xE8, 0xDA, + 0xAB, 0xF3, 0x0F, 0xE3, 0x2C, 0xF8, 0x63, 0xE2, 0x58, 0xF0, 0x59, 0xDE, + 0x22, 0xEB, 0x85, 0xDF, 0x6E, 0xE4, 0x89, 0xDB, 0x15, 0xDB, 0xF8, 0xD2, + 0xBF, 0xD6, 0x07, 0xD5, 0xA9, 0xD6, 0x8E, 0xD9, 0xA7, 0xDF, 0xDD, 0xDD, + 0x90, 0xEB, 0x37, 0xE6, 0xB5, 0xED, 0xBA, 0xED, 0xC9, 0xEA, 0xDE, 0xF3, + 0x2B, 0xEB, 0xA1, 0xFB, 0x91, 0xF1, 0x0C, 0x02, 0xB2, 0xF7, 0x8E, 0x00, + 0x8F, 0xF3, 0xE1, 0xFC, 0x0B, 0xF0, 0x34, 0xFF, 0x0C, 0xF3, 0x29, 0x05, + 0x3A, 0xEF, 0xFD, 0x04, 0xAB, 0xEE, 0x33, 0x08, 0x2B, 0xF6, 0x8B, 0x0E, + 0x52, 0xF8, 0x9A, 0x08, 0xF1, 0xFC, 0x79, 0x00, 0x14, 0x03, 0x08, 0xFA, + 0x83, 0x02, 0x69, 0xF2, 0xF2, 0x00, 0xBC, 0xF1, 0x66, 0xFE, 0x82, 0xFA, + 0xB1, 0xFA, 0x5F, 0x02, 0x32, 0xFC, 0x43, 0x03, 0x7C, 0x06, 0xA9, 0x02, + 0xDD, 0x16, 0xF1, 0x07, 0x16, 0x1D, 0x66, 0x0F, 0xFB, 0x10, 0x29, 0x0B, + 0xBB, 0x0B, 0x30, 0x05, 0x29, 0x0E, 0x5E, 0x04, 0x3C, 0x0C, 0x52, 0x01, + 0x8D, 0x0F, 0xFA, 0xFD, 0x46, 0x1A, 0xE8, 0x01, 0x5F, 0x1D, 0x1D, 0x07, + 0x5E, 0x16, 0x12, 0x07, 0x45, 0x0F, 0xC7, 0x0B, 0xC9, 0x03, 0x8D, 0x0D, + 0x17, 0xFE, 0x10, 0x0B, 0xE1, 0x07, 0x31, 0x10, 0xCB, 0x0D, 0xE9, 0x12, + 0xFC, 0x05, 0x6B, 0x13, 0xB2, 0xFA, 0xC8, 0x12, 0xF0, 0xF0, 0xFF, 0x09, + 0x17, 0xF1, 0x9E, 0x06, 0x0D, 0xFC, 0xC3, 0x08, 0x7F, 0x05, 0xAC, 0x04, + 0x22, 0x0C, 0xC9, 0x04, 0x66, 0x11, 0x8B, 0x08, 0xE2, 0x15, 0x0C, 0x07, + 0x70, 0x16, 0x51, 0x07, 0xAD, 0x14, 0x88, 0x09, 0x09, 0x19, 0xD4, 0x0C, + 0x58, 0x22, 0x07, 0x10, 0x60, 0x25, 0x8A, 0x0E, 0x98, 0x28, 0xFD, 0x13, + 0xAC, 0x27, 0xE3, 0x16, 0xE5, 0x19, 0x20, 0x0E, 0x40, 0x16, 0x29, 0x0F, + 0x2F, 0x24, 0xF8, 0x18, 0x20, 0x30, 0xBE, 0x1A, 0xCC, 0x2D, 0x5A, 0x19, + 0xA6, 0x29, 0x99, 0x1F, 0x2D, 0x24, 0x34, 0x26, 0x5C, 0x1D, 0xE4, 0x27, + 0xE6, 0x20, 0x18, 0x26, 0xDB, 0x28, 0x27, 0x24, 0x92, 0x30, 0x2B, 0x28, + 0x1A, 0x31, 0x16, 0x29, 0x0E, 0x2B, 0xD0, 0x26, 0xF3, 0x24, 0x97, 0x2A, + 0x7A, 0x1A, 0x81, 0x2F, 0x9C, 0x10, 0xC8, 0x2E, 0x69, 0x0F, 0x7E, 0x24, + 0x47, 0x16, 0xE9, 0x17, 0x75, 0x21, 0xD7, 0x16, 0xDE, 0x25, 0x64, 0x1D, + 0xEC, 0x20, 0x83, 0x20, 0xF0, 0x1B, 0xDA, 0x1D, 0xF0, 0x1F, 0x24, 0x19, + 0x85, 0x24, 0x24, 0x17, 0x98, 0x23, 0x77, 0x1B, 0xBB, 0x23, 0x26, 0x24, + 0x51, 0x1D, 0x9D, 0x25, 0xB0, 0x15, 0x18, 0x21, 0xB3, 0x13, 0x6B, 0x1C, + 0x2D, 0x13, 0xF1, 0x1B, 0x83, 0x14, 0x4C, 0x1E, 0xD6, 0x17, 0x2F, 0x19, + 0x49, 0x1A, 0xCD, 0x15, 0x9E, 0x16, 0x5D, 0x17, 0xFF, 0x0B, 0x0A, 0x13, + 0x48, 0x06, 0x31, 0x0E, 0xC1, 0x08, 0xD4, 0x0B, 0x7E, 0x0B, 0x65, 0x0B, + 0x8C, 0x11, 0xF6, 0x11, 0x0E, 0x16, 0xFC, 0x19, 0x28, 0x12, 0x34, 0x1D, + 0x52, 0x0E, 0xD7, 0x1B, 0x0A, 0x0D, 0x30, 0x12, 0x46, 0x0A, 0x4A, 0x08, + 0xDC, 0x08, 0x1F, 0x06, 0x0C, 0x12, 0xF6, 0x0C, 0x6D, 0x1E, 0x28, 0x15, + 0xD7, 0x25, 0x99, 0x15, 0xA7, 0x2B, 0xBF, 0x18, 0x64, 0x27, 0x94, 0x20, + 0x31, 0x17, 0x4F, 0x1F, 0x12, 0x0F, 0xE8, 0x17, 0x65, 0x19, 0xE2, 0x13, + 0xD8, 0x20, 0x54, 0x11, 0x3B, 0x1D, 0xCB, 0x13, 0x89, 0x19, 0x78, 0x18, + 0x35, 0x14, 0x8B, 0x18, 0x85, 0x0E, 0x3E, 0x19, 0x96, 0x0D, 0xE4, 0x1C, + 0x9E, 0x0E, 0xD4, 0x22, 0x1B, 0x0D, 0xC7, 0x23, 0x88, 0x0D, 0xA7, 0x1B, + 0xA4, 0x12, 0x7D, 0x13, 0x51, 0x15, 0xBD, 0x0F, 0x30, 0x0D, 0x9A, 0x0E, + 0xBB, 0x08, 0x78, 0x13, 0xE4, 0x0E, 0x9E, 0x16, 0x96, 0x15, 0x1E, 0x15, + 0x2F, 0x1A, 0xE2, 0x18, 0x8C, 0x14, 0x3D, 0x19, 0x4C, 0x09, 0x7E, 0x0F, + 0xF4, 0x04, 0xBC, 0x04, 0xAE, 0x07, 0xA3, 0x00, 0xE4, 0x08, 0xB1, 0x04, + 0x6B, 0x08, 0x50, 0x0A, 0x89, 0x0D, 0x86, 0x0E, 0xD0, 0x13, 0x82, 0x10, + 0xB3, 0x14, 0xA3, 0x0E, 0xDD, 0x0D, 0x90, 0x0D, 0x87, 0x05, 0xD9, 0x10, + 0xC0, 0xFF, 0xDD, 0x10, 0xF3, 0xFF, 0x8E, 0x0B, 0x0A, 0x07, 0xC1, 0x09, + 0x74, 0x0A, 0x34, 0x0C, 0xB5, 0x04, 0xE5, 0x0E, 0xF8, 0xF7, 0xA7, 0x0C, + 0xAD, 0xEE, 0x9A, 0x06, 0x00, 0xF2, 0xCE, 0x04, 0x6E, 0xF8, 0x0B, 0x04, + 0x46, 0x00, 0x83, 0x02, 0x78, 0x09, 0x93, 0x02, 0x25, 0x0D, 0x9A, 0x06, + 0xB9, 0x0B, 0xC1, 0x0D, 0x82, 0x05, 0x2B, 0x13, 0xD0, 0xFD, 0x08, 0x14, + 0xCA, 0xFA, 0xCC, 0x12, 0xCA, 0xFC, 0x02, 0x11, 0x94, 0xF9, 0x0F, 0x09, + 0x20, 0xFA, 0x39, 0x06, 0x26, 0xFF, 0xE3, 0x05, 0xA7, 0x01, 0x40, 0x03, + 0xB8, 0x08, 0x17, 0x0A, 0x74, 0x11, 0x25, 0x11, 0x2C, 0x16, 0x8F, 0x12, + 0x50, 0x10, 0x06, 0x15, 0xBA, 0x08, 0xDD, 0x17, 0x7F, 0x0A, 0x7E, 0x18, + 0x39, 0x10, 0xB2, 0x18, 0x6C, 0x14, 0xDB, 0x1A, 0xFD, 0x15, 0x76, 0x1E, + 0xCC, 0x14, 0x27, 0x22, 0x2B, 0x14, 0x0B, 0x24, 0x84, 0x14, 0x07, 0x22, + 0x77, 0x16, 0x6E, 0x1C, 0x55, 0x1A, 0xE1, 0x13, 0xAF, 0x18, 0xAE, 0x0C, + 0xF3, 0x0F, 0x7B, 0x07, 0x74, 0x08, 0xF6, 0x06, 0xDF, 0x05, 0x1C, 0x0C, + 0xAE, 0x07, 0x0E, 0x0B, 0x34, 0x0D, 0x47, 0x08, 0x22, 0x0E, 0x57, 0x0A, + 0x03, 0x07, 0x3F, 0x08, 0xD1, 0x01, 0x19, 0x05, 0x23, 0xFF, 0xFC, 0x01, + 0xC3, 0xF7, 0x78, 0xF7, 0x3C, 0xFA, 0xD6, 0xED, 0x62, 0x08, 0x70, 0xEC, + 0x39, 0x13, 0x19, 0xEF, 0xF2, 0x12, 0x45, 0xF2, 0xBF, 0x0E, 0x59, 0xF8, + 0x66, 0x0A, 0x16, 0xFC, 0xB5, 0x02, 0xDC, 0xFD, 0x8D, 0x00, 0x80, 0x00, + 0x8F, 0xFF, 0x83, 0x00, 0x28, 0xF8, 0x28, 0x00, 0xF7, 0xF3, 0xF7, 0x02, + 0x9A, 0xF2, 0xA7, 0x06, 0x7F, 0xEA, 0xD1, 0x09, 0xD6, 0xE1, 0x13, 0x0E, + 0xBD, 0xE0, 0xA1, 0x0F, 0x65, 0xE5, 0x12, 0x0B, 0x56, 0xE9, 0x64, 0x01, + 0x4F, 0xEA, 0x69, 0xFB, 0x5E, 0xEA, 0x9F, 0xFA, 0xA0, 0xE8, 0x0C, 0xF8, + 0x3D, 0xE6, 0xC3, 0xF8, 0x6B, 0xE7, 0x4A, 0xFE, 0x89, 0xEB, 0xFD, 0x00, + 0x2D, 0xEB, 0x26, 0xFC, 0x70, 0xEA, 0x40, 0xEF, 0x05, 0xED, 0xA7, 0xE3, + 0xE9, 0xE9, 0xAB, 0xDF, 0x30, 0xE4, 0xED, 0xDE, 0xFE, 0xE5, 0xF6, 0xDC, + 0x65, 0xEB, 0xDB, 0xD7, 0x44, 0xEF, 0x08, 0xD3, 0x3D, 0xF4, 0x9A, 0xD4, + 0xF1, 0xF6, 0x3D, 0xD9, 0xF1, 0xF3, 0x50, 0xDC, 0x3D, 0xF0, 0xEC, 0xDF, + 0x44, 0xEC, 0x3C, 0xE0, 0x4B, 0xE4, 0x38, 0xDD, 0x9D, 0xDC, 0x99, 0xDF, + 0x0F, 0xDB, 0x1F, 0xE3, 0x47, 0xDD, 0x84, 0xE3, 0x3B, 0xE3, 0x21, 0xEB, + 0x31, 0xEA, 0x32, 0xF7, 0x2C, 0xEA, 0xB2, 0xFB, 0x01, 0xE7, 0x77, 0xFA, + 0xD9, 0xE4, 0xD2, 0xF5, 0xE7, 0xE7, 0x77, 0xEB, 0x29, 0xEA, 0x0C, 0xE3, + 0x59, 0xE5, 0x6E, 0xE4, 0xA7, 0xE4, 0xCA, 0xEA, 0x81, 0xE5, 0x8B, 0xED, + 0x27, 0xE6, 0x79, 0xEF, 0x77, 0xE9, 0x72, 0xF2, 0xCE, 0xEA, 0xC3, 0xEF, + 0xBB, 0xE8, 0xA5, 0xEA, 0xEC, 0xE7, 0x2B, 0xEA, 0x0B, 0xED, 0xC6, 0xF0, + 0x4F, 0xF0, 0x54, 0xF5, 0x87, 0xF4, 0x9B, 0xF4, 0x7A, 0xFB, 0x72, 0xF4, + 0x01, 0xFD, 0xFA, 0xF5, 0xA9, 0xF9, 0x63, 0xF7, 0x55, 0xF5, 0x3B, 0xF8, + 0x7F, 0xF3, 0x50, 0xF8, 0x51, 0xEF, 0xD7, 0xF6, 0xCC, 0xED, 0x96, 0xF1, + 0xF0, 0xF7, 0x93, 0xEA, 0xC1, 0xFC, 0xF2, 0xEB, 0x68, 0xF5, 0xC8, 0xF3, + 0x14, 0xEF, 0x32, 0xF6, 0x63, 0xF0, 0x8C, 0xF0, 0xB5, 0xF4, 0x76, 0xEC, + 0x3B, 0xF4, 0xD7, 0xEB, 0xE9, 0xEC, 0x2B, 0xEC, 0x6F, 0xE3, 0x37, 0xED, + 0x79, 0xDD, 0x95, 0xEB, 0xF4, 0xDA, 0xEF, 0xEA, 0x81, 0xDD, 0x08, 0xEC, + 0xF8, 0xE1, 0x85, 0xEA, 0x49, 0xE3, 0x78, 0xE7, 0xDF, 0xE4, 0x8D, 0xE4, + 0x55, 0xEA, 0x80, 0xE2, 0xF2, 0xEE, 0xB0, 0xDE, 0x9E, 0xF0, 0xCC, 0xDA, + 0x9E, 0xF1, 0xF5, 0xDD, 0xCD, 0xF5, 0x74, 0xE5, 0x82, 0x02, 0x97, 0xEE, + 0x00, 0x0E, 0xBB, 0xF7, 0x25, 0x0C, 0x5B, 0xFC, 0xF7, 0xFD, 0x79, 0xF9, + 0xB0, 0xEF, 0x5E, 0xF2, 0x20, 0xE5, 0xA2, 0xEC, 0x02, 0xDE, 0xD5, 0xE7, + 0x8D, 0xE2, 0xCB, 0xE8, 0x39, 0xEE, 0x94, 0xED, 0xF0, 0xF7, 0x31, 0xF1, + 0xF7, 0xFC, 0xF6, 0xF3, 0xE5, 0xFF, 0xC0, 0xF7, 0x20, 0xFD, 0x3C, 0xFE, + 0x7D, 0xF8, 0xDD, 0x03, 0xF7, 0xFC, 0x7C, 0x04, 0xB0, 0x03, 0xF5, 0xFF, + 0x9D, 0x05, 0x6B, 0xFF, 0x9C, 0x00, 0x64, 0x04, 0x5C, 0xF5, 0xD6, 0x05, + 0x4C, 0xF0, 0x69, 0x03, 0x54, 0xF8, 0x2A, 0x00, 0xED, 0x05, 0x96, 0xFF, + 0xFB, 0x0A, 0x88, 0xFC, 0xC4, 0x06, 0x13, 0xF5, 0x65, 0x01, 0x41, 0xED, + 0x8D, 0xFD, 0x05, 0xE4, 0xB5, 0xFB, 0xC1, 0xE1, 0x30, 0xF9, 0x93, 0xEC, + 0xF0, 0xFA, 0x18, 0xFA, 0x9C, 0xFE, 0x24, 0xFE, 0xB7, 0xFF, 0xD6, 0xFC, + 0xAB, 0xFC, 0x4B, 0xFA, 0x92, 0xF5, 0xEE, 0xF4, 0x24, 0xF4, 0x76, 0xEF, + 0xAA, 0xF8, 0x80, 0xED, 0x82, 0xFA, 0x8C, 0xEF, 0x17, 0xF8, 0x68, 0xEF, + 0x1F, 0xF5, 0xAA, 0xEE, 0x05, 0xF6, 0x78, 0xF0, 0x3A, 0xFA, 0x00, 0xEF, + 0xEE, 0xFC, 0xAF, 0xEE, 0x77, 0xFC, 0x6B, 0xF4, 0x9F, 0xF7, 0x99, 0xF4, + 0x91, 0xEF, 0x9A, 0xEA, 0x11, 0xE8, 0x77, 0xE3, 0xA3, 0xE3, 0x99, 0xE6, + 0x09, 0xE0, 0x43, 0xED, 0x6C, 0xDE, 0x8A, 0xF1, 0x31, 0xE2, 0xBD, 0xF3, + 0x9B, 0xE7, 0xAB, 0xF2, 0xB8, 0xEA, 0x83, 0xEA, 0x29, 0xEB, 0xCF, 0xE2, + 0xFA, 0xE9, 0x1B, 0xE0, 0xE8, 0xEC, 0x06, 0xE0, 0x89, 0xF4, 0xEA, 0xE1, + 0x20, 0xF9, 0x97, 0xE5, 0x11, 0xF8, 0x03, 0xF0, 0x4A, 0xF2, 0xCF, 0xF8, + 0x50, 0xF0, 0xBB, 0xF8, 0xEB, 0xF3, 0x17, 0xF2, 0x9C, 0xF4, 0x6F, 0xE9, + 0x52, 0xF3, 0xD6, 0xE7, 0x05, 0xF1, 0x84, 0xEA, 0xB2, 0xF3, 0xD6, 0xE9, + 0x06, 0xFE, 0xE6, 0xE7, 0x8D, 0x02, 0xB4, 0xEC, 0x0D, 0xFE, 0xFF, 0xF3, + 0xFC, 0xF8, 0x89, 0xF4, 0x95, 0xF9, 0xF6, 0xF1, 0xF6, 0xFE, 0xF5, 0xED, + 0x80, 0x01, 0x7E, 0xE7, 0xF8, 0xFD, 0xA9, 0xE3, 0x25, 0xF7, 0xBE, 0xE1, + 0xFF, 0xF2, 0x9D, 0xDF, 0xD8, 0xF3, 0xCF, 0xE4, 0x03, 0xF4, 0x7E, 0xED, + 0x4B, 0xF3, 0xE8, 0xF1, 0x32, 0xF5, 0x91, 0xF3, 0x1B, 0xF8, 0x07, 0xF0, + 0x27, 0xFA, 0x83, 0xE9, 0xBD, 0xF5, 0x98, 0xE7, 0x19, 0xEB, 0x91, 0xEB, + 0xE0, 0xE1, 0xE5, 0xEF, 0x49, 0xDD, 0xFD, 0xEE, 0x57, 0xE0, 0x00, 0xED, + 0x33, 0xE7, 0x16, 0xED, 0xAE, 0xEA, 0xDB, 0xED, 0xDE, 0xED, 0x76, 0xEE, + 0x2E, 0xF0, 0x28, 0xEB, 0x5C, 0xF0, 0xB4, 0xE8, 0xF1, 0xED, 0x48, 0xEC, + 0x19, 0xE7, 0x6A, 0xEC, 0x3B, 0xE8, 0x9D, 0xE8, 0x9B, 0xF2, 0x3F, 0xE8, + 0x87, 0xF8, 0x6C, 0xE9, 0x3B, 0xF7, 0x76, 0xE9, 0xBA, 0xEF, 0x18, 0xE7, + 0x13, 0xE1, 0x9C, 0xE1, 0x10, 0xD3, 0x88, 0xDC, 0xF9, 0xD1, 0x45, 0xDB, + 0x59, 0xDB, 0x81, 0xDC, 0x50, 0xE3, 0x49, 0xDF, 0xB7, 0xE7, 0xFB, 0xE4, + 0xC3, 0xEE, 0xFA, 0xE9, 0xAA, 0xF6, 0x68, 0xEB, 0x8B, 0xF6, 0x6E, 0xE9, + 0x52, 0xF3, 0x60, 0xEA, 0xF1, 0xF6, 0xF1, 0xF0, 0x35, 0x00, 0xC4, 0xF7, + 0x31, 0x07, 0xEC, 0xFF, 0x2C, 0x05, 0xE5, 0x07, 0x63, 0xFE, 0xB5, 0x0C, + 0x2D, 0xFA, 0xEC, 0x10, 0x0E, 0xFB, 0xFF, 0x15, 0xF2, 0xFE, 0x58, 0x15, + 0x91, 0x06, 0x04, 0x13, 0xCA, 0x10, 0x4C, 0x15, 0x34, 0x15, 0x56, 0x17, + 0x76, 0x13, 0xAB, 0x19, 0x8D, 0x11, 0x60, 0x1C, 0x3A, 0x0F, 0xC5, 0x1F, + 0x17, 0x0D, 0x51, 0x23, 0xBF, 0x10, 0x8C, 0x24, 0xC6, 0x18, 0x95, 0x21, + 0x15, 0x1F, 0xF5, 0x1B, 0xA0, 0x1D, 0x8F, 0x19, 0x2A, 0x13, 0x71, 0x19, + 0xB1, 0x0A, 0x35, 0x19, 0x13, 0x10, 0x9A, 0x18, 0x24, 0x1D, 0xF5, 0x18, + 0xD2, 0x29, 0xCD, 0x1B, 0x91, 0x32, 0xA6, 0x1B, 0xB2, 0x32, 0x8E, 0x19, + 0x75, 0x2A, 0x7F, 0x18, 0x47, 0x1F, 0xFA, 0x16, 0xDF, 0x18, 0xDC, 0x16, + 0x9A, 0x14, 0xFD, 0x15, 0x2E, 0x12, 0x2F, 0x16, 0xAD, 0x12, 0x9F, 0x17, + 0x5F, 0x14, 0x39, 0x17, 0x62, 0x15, 0x92, 0x1A, 0x2A, 0x12, 0xF4, 0x1B, + 0x0E, 0x11, 0xAB, 0x18, 0x52, 0x12, 0xA6, 0x17, 0xA7, 0x16, 0xD4, 0x16, + 0x95, 0x1C, 0x8F, 0x16, 0x8E, 0x1C, 0x03, 0x17, 0xAB, 0x1D, 0xF7, 0x16, + 0xBA, 0x1F, 0x12, 0x16, 0xBC, 0x1D, 0x5F, 0x15, 0xB8, 0x1B, 0x61, 0x17, + 0x87, 0x18, 0x50, 0x18, 0xDC, 0x14, 0xCC, 0x18, 0x10, 0x16, 0xAC, 0x19, + 0x06, 0x1D, 0x13, 0x1B, 0x88, 0x21, 0xE9, 0x20, 0x8A, 0x1D, 0xA3, 0x27, + 0x38, 0x19, 0xBE, 0x2C, 0x51, 0x1C, 0x20, 0x31, 0x53, 0x1F, 0xEA, 0x32, + 0x3A, 0x1A, 0x1C, 0x2F, 0xD4, 0x13, 0xC5, 0x27, 0x8F, 0x0F, 0xF3, 0x1F, + 0x15, 0x0C, 0x18, 0x19, 0x48, 0x0D, 0x6C, 0x17, 0xB0, 0x0F, 0x4C, 0x1A, + 0x2C, 0x0F, 0x24, 0x1D, 0x36, 0x12, 0x57, 0x20, 0xC1, 0x16, 0x73, 0x22, + 0x47, 0x1B, 0x9F, 0x23, 0x55, 0x23, 0x04, 0x27, 0xF8, 0x29, 0x29, 0x2A, + 0x76, 0x2D, 0x86, 0x29, 0xD3, 0x2E, 0xD0, 0x28, 0xF1, 0x2F, 0x55, 0x2B, + 0xBF, 0x2F, 0xC6, 0x29, 0x29, 0x29, 0xBC, 0x22, 0x65, 0x22, 0x1E, 0x1D, + 0xC3, 0x20, 0x6A, 0x19, 0xED, 0x1D, 0xFD, 0x16, 0x96, 0x16, 0x7C, 0x17, + 0xDB, 0x0E, 0xFC, 0x15, 0xF0, 0x0A, 0xEF, 0x11, 0x50, 0x0E, 0x31, 0x0F, + 0xAE, 0x18, 0x38, 0x0E, 0x64, 0x21, 0x63, 0x13, 0x20, 0x22, 0xC6, 0x1E, + 0xA3, 0x1F, 0x71, 0x28, 0x73, 0x1C, 0xA7, 0x26, 0x12, 0x1A, 0xAE, 0x1B, + 0x05, 0x19, 0x7D, 0x11, 0x5F, 0x15, 0x37, 0x0D, 0x89, 0x12, 0x2E, 0x0F, + 0xC8, 0x15, 0x30, 0x15, 0x7C, 0x1F, 0x0E, 0x1B, 0x29, 0x28, 0x2A, 0x1A, + 0xAB, 0x26, 0x16, 0x15, 0xB4, 0x20, 0x31, 0x12, 0x6D, 0x1F, 0xD3, 0x13, + 0x2B, 0x21, 0x90, 0x1B, 0xC9, 0x1F, 0xBC, 0x27, 0x64, 0x17, 0xE6, 0x30, + 0x8C, 0x0B, 0xBD, 0x2F, 0x57, 0x01, 0xA7, 0x26, 0xCD, 0xFC, 0x59, 0x1E, + 0xA4, 0xFC, 0x85, 0x18, 0xC8, 0xFB, 0x53, 0x15, 0xB3, 0xFE, 0x9D, 0x18, + 0x23, 0x09, 0xC9, 0x1B, 0x1C, 0x13, 0xF2, 0x18, 0x94, 0x14, 0x94, 0x16, + 0xC1, 0x10, 0x60, 0x14, 0x97, 0x0E, 0xAA, 0x13, 0xFA, 0x0D, 0x91, 0x17, + 0x56, 0x0F, 0xBD, 0x19, 0x4F, 0x12, 0xF3, 0x14, 0x78, 0x0F, 0x8F, 0x0A, + 0xD5, 0x09, 0x7E, 0x01, 0x48, 0x09, 0xC2, 0xF8, 0x61, 0x0A, 0x15, 0xF4, + 0x4C, 0x07, 0x7E, 0xF8, 0x17, 0x00, 0xC7, 0xFE, 0x74, 0xFD, 0x73, 0x02, + 0xC7, 0x04, 0x42, 0x04, 0x09, 0x10, 0x25, 0x05, 0xAE, 0x16, 0x5D, 0x05, + 0x3A, 0x13, 0x73, 0x06, 0x7D, 0x0A, 0xAA, 0x08, 0xC7, 0x06, 0xDD, 0x0F, + 0x4C, 0x06, 0x23, 0x1A, 0x09, 0x03, 0x73, 0x1C, 0xC1, 0x00, 0xB2, 0x17, + 0x9C, 0x01, 0xD0, 0x10, 0x42, 0x01, 0x24, 0x07, 0x8F, 0xFF, 0x0A, 0xFE, + 0x46, 0xFE, 0x47, 0xFE, 0xAC, 0xFB, 0x0B, 0x05, 0x95, 0xF9, 0xED, 0x08, + 0x6D, 0xFB, 0x09, 0x0A, 0xFB, 0xFE, 0x90, 0x09, 0x7D, 0xFD, 0x73, 0x09, + 0x59, 0xF4, 0x33, 0x08, 0x3E, 0xEE, 0x0D, 0x06, 0x1E, 0xF2, 0x85, 0x06, + 0x59, 0xF5, 0x8B, 0x03, 0x13, 0xF5, 0xD7, 0xFD, 0xDF, 0xF6, 0xB1, 0xF9, + 0x0E, 0xFA, 0xC1, 0xF5, 0x64, 0xFA, 0x4C, 0xF6, 0x21, 0xF7, 0xAA, 0xFA, + 0x7C, 0xF8, 0x4C, 0xFC, 0xDF, 0xFF, 0xE7, 0xF9, 0xCB, 0x07, 0xDB, 0xF4, + 0x0C, 0x0E, 0x3B, 0xF2, 0x4A, 0x0D, 0x7E, 0xF2, 0x6E, 0x06, 0x9E, 0xF4, + 0x5F, 0xFF, 0x52, 0xF8, 0xF6, 0xF9, 0xD8, 0xF5, 0x0B, 0xF8, 0x3D, 0xF0, + 0x28, 0xF7, 0x82, 0xEC, 0x54, 0xF5, 0x77, 0xEA, 0x0F, 0xF1, 0xCE, 0xE9, + 0x8D, 0xEC, 0x89, 0xEC, 0x65, 0xEB, 0xDE, 0xF3, 0xE2, 0xE9, 0x03, 0xFA, + 0x97, 0xE7, 0x10, 0xFF, 0x59, 0xE8, 0xDC, 0xFB, 0x07, 0xED, 0x36, 0xF0, + 0x7F, 0xEE, 0x12, 0xEA, 0x8E, 0xED, 0x41, 0xE9, 0xBE, 0xF3, 0x29, 0xE8, + 0x46, 0xFB, 0xC9, 0xE6, 0x25, 0xFF, 0x58, 0xE8, 0xB5, 0x01, 0xEA, 0xE8, + 0x51, 0x01, 0x55, 0xE7, 0xF8, 0xFE, 0x04, 0xE8, 0x66, 0xFC, 0xBB, 0xEA, + 0xCB, 0xF9, 0xB8, 0xED, 0x50, 0xF9, 0xEC, 0xF0, 0x82, 0xF8, 0x28, 0xF4, + 0x83, 0xF3, 0x4B, 0xF3, 0x1E, 0xEC, 0xAC, 0xF0, 0x28, 0xE9, 0xE4, 0xF2, + 0x3D, 0xED, 0xDB, 0xF7, 0xF0, 0xED, 0x53, 0xFC, 0x4E, 0xE9, 0xDA, 0xFD, + 0x9C, 0xEA, 0x52, 0xF6, 0x3A, 0xF0, 0xE0, 0xEC, 0x43, 0xF3, 0x02, 0xEF, + 0xFA, 0xEF, 0x99, 0xF7, 0x45, 0xEA, 0x63, 0xFE, 0xB2, 0xED, 0x76, 0x03, + 0xA5, 0xF4, 0xCE, 0x02, 0xAD, 0xF6, 0xFB, 0xFC, 0x5D, 0xF4, 0x6D, 0xF7, + 0xE9, 0xEF, 0xEE, 0xF2, 0xA2, 0xED, 0xAD, 0xF0, 0x0B, 0xEE, 0xE2, 0xF2, + 0xA8, 0xEE, 0x23, 0xF6, 0x6D, 0xF3, 0x96, 0xF8, 0xC7, 0xF9, 0x32, 0xF7, + 0xBD, 0xFD, 0x68, 0xF3, 0xEB, 0x00, 0x78, 0xF4, 0x7F, 0xFC, 0x9F, 0xF3, + 0x69, 0xF4, 0xA5, 0xF1, 0x90, 0xEE, 0x1D, 0xF1, 0x99, 0xEF, 0x00, 0xF2, + 0xA8, 0xF2, 0xAD, 0xF0, 0x52, 0xF6, 0x74, 0xF2, 0xEE, 0xF8, 0x01, 0xFA, + 0x45, 0xF0, 0xEB, 0xF7, 0x34, 0xEB, 0xDE, 0xF2, 0xD3, 0xEB, 0x76, 0xEC, + 0x65, 0xE9, 0xFA, 0xE4, 0x9A, 0xE8, 0x4F, 0xE8, 0xF9, 0xE8, 0x4D, 0xEE, + 0x11, 0xEA, 0x41, 0xEE, 0x4E, 0xEE, 0x66, 0xEE, 0xBA, 0xEE, 0x04, 0xED, + 0x21, 0xE7, 0x00, 0xE9, 0x94, 0xE2, 0x13, 0xEC, 0xF8, 0xD7, 0x10, 0xE7, + 0xBF, 0xCE, 0xD1, 0xDF, 0xDD, 0xD2, 0x7E, 0xE0, 0x9A, 0xD5, 0x85, 0xDB, + 0xB2, 0xD9, 0x70, 0xD7, 0x26, 0xE3, 0xD6, 0xD7, 0x25, 0xEC, 0xB1, 0xD8, + 0x54, 0xF2, 0xC9, 0xD8, 0x17, 0xF8, 0xD3, 0xDB, 0x6F, 0xF8, 0xD7, 0xDC, + 0x5D, 0xF3, 0xE0, 0xDA, 0x14, 0xEE, 0x22, 0xDF, 0xD0, 0xE8, 0x6C, 0xE4, + 0x37, 0xE6, 0x8C, 0xE4, 0x6E, 0xE9, 0xC6, 0xE5, 0xA7, 0xEF, 0x8C, 0xEA, + 0x78, 0xF2, 0x31, 0xEF, 0x99, 0xF9, 0x82, 0xF7, 0xD3, 0xFF, 0xB7, 0xFC, + 0x8D, 0x00, 0x46, 0xFE, 0xCE, 0x00, 0xF3, 0xFD, 0x0E, 0xFD, 0xB0, 0xF8, + 0x9B, 0xFB, 0x47, 0xF8, 0x74, 0xF8, 0x8F, 0xF8, 0x73, 0xF6, 0x3E, 0xFA, + 0xF4, 0xFD, 0xE9, 0xFD, 0x1D, 0x00, 0xF6, 0xF7, 0x4B, 0xFC, 0xF6, 0xF3, + 0x8B, 0xF3, 0x8D, 0xF4, 0xC0, 0xEA, 0x31, 0xF6, 0x13, 0xE3, 0x1E, 0xEF, + 0x1C, 0xE8, 0xEB, 0xED, 0xD6, 0xF7, 0x62, 0xF7, 0x49, 0x01, 0x74, 0xF9, + 0x89, 0x03, 0x4C, 0xF9, 0xF5, 0xFF, 0xAF, 0xFC, 0x1B, 0xF3, 0xFB, 0xFC, + 0x5A, 0xE5, 0x9D, 0xF7, 0xE8, 0xEA, 0x35, 0xF6, 0xA4, 0xEF, 0xFD, 0xF0, + 0x2B, 0xF1, 0xE9, 0xF0, 0x6F, 0xF4, 0xDB, 0xF4, 0xCC, 0xF7, 0x89, 0xF8, + 0x38, 0xF7, 0xBA, 0xFB, 0x4A, 0xF2, 0xD2, 0xFE, 0x16, 0xF2, 0xAB, 0xFF, + 0xEF, 0xEE, 0x3B, 0xF3, 0xC7, 0xF5, 0x06, 0xF1, 0x48, 0xF8, 0x7C, 0xED, + 0xE3, 0xEE, 0x6D, 0xE7, 0x11, 0xEA, 0xC3, 0xEF, 0x84, 0xE0, 0x34, 0xEE, + 0x1A, 0xE1, 0xFD, 0xED, 0x33, 0xEA, 0x57, 0xEF, 0x7F, 0xF4, 0x70, 0xED, + 0x8C, 0xF9, 0x19, 0xE9, 0x40, 0xF5, 0xC9, 0xE1, 0xDE, 0xF8, 0x32, 0xE6, + 0x99, 0xF8, 0x66, 0xE1, 0xCC, 0x00, 0xD9, 0xE2, 0xD4, 0x09, 0x8B, 0xEA, + 0xD5, 0x16, 0xBD, 0xF4, 0x9A, 0x1F, 0x32, 0xFF, 0xDB, 0x0F, 0x50, 0x00, + 0xC2, 0x0A, 0x07, 0x0F, 0x1B, 0xFF, 0xAA, 0x0B, 0x1D, 0xF4, 0x48, 0x00, + 0x74, 0xFC, 0x9B, 0x09, 0x0A, 0xF5, 0x5C, 0x03, 0xDC, 0xF2, 0x66, 0xFF, + 0x55, 0x06, 0x4F, 0x13, 0x3C, 0x05, 0x64, 0x14, 0xF4, 0xF8, 0x97, 0x08, + 0xFD, 0xFF, 0xD7, 0x0B, 0x7C, 0x05, 0xBA, 0x09, 0x14, 0x03, 0x79, 0x00, + 0x8A, 0x04, 0x91, 0xFA, 0xF5, 0x06, 0x54, 0xF8, 0xDF, 0x08, 0x41, 0xFD, + 0x95, 0x06, 0xC6, 0xFF, 0x91, 0x02, 0x56, 0xFD, 0x7A, 0x09, 0x09, 0x00, + 0x7B, 0x0F, 0x23, 0xFE, 0x3F, 0x0C, 0xBF, 0xF4, 0x04, 0x0A, 0x00, 0xED, + 0xF8, 0x04, 0x03, 0xE4, 0xD4, 0x00, 0xFE, 0xE0, 0xA8, 0x0C, 0xA3, 0xF1, + 0x87, 0x14, 0xA0, 0xFE, 0x4C, 0x0C, 0x5E, 0xFB, 0x75, 0x08, 0xD6, 0xFE, + 0x76, 0x04, 0x0C, 0x02, 0xA5, 0xF5, 0x90, 0xF8, 0x06, 0xF2, 0xBB, 0xFB, + 0x11, 0xF5, 0xC6, 0xFF, 0x5D, 0xF4, 0x40, 0xF6, 0xB7, 0xFE, 0x28, 0xFC, + 0x19, 0x00, 0xA1, 0x01, 0xCA, 0xFD, 0x21, 0x02, 0x65, 0xFA, 0x0B, 0xFF, + 0x86, 0xFB, 0x88, 0xFD, 0x93, 0x02, 0x56, 0xFD, 0x4C, 0xFE, 0xC7, 0xF7, + 0xC5, 0xF8, 0xE4, 0xF7, 0xAB, 0xF8, 0xC6, 0xF4, 0xC7, 0xF8, 0x17, 0xF0, + 0xFB, 0xFA, 0xCA, 0xF7, 0x62, 0xFD, 0x62, 0x00, 0xFF, 0xFE, 0x01, 0x04, + 0x2F, 0x04, 0x66, 0x08, 0xEE, 0xFD, 0x39, 0x02, 0x4A, 0xFC, 0x94, 0x02, + 0x78, 0xF9, 0xB8, 0xFB, 0x94, 0xF3, 0x7F, 0xEC, 0xDA, 0xF8, 0xE5, 0xEC, + 0xE6, 0xF9, 0xFD, 0xF1, 0xA7, 0xFC, 0x7B, 0xFE, 0x91, 0xFE, 0x84, 0x0A, + 0x81, 0xFA, 0x7A, 0x0C, 0x3E, 0xF7, 0x56, 0x08, 0xC5, 0xFA, 0x8A, 0x06, + 0xF9, 0x01, 0xEA, 0x05, 0x54, 0x04, 0xE1, 0x05, 0xE3, 0x04, 0xCD, 0x0B, + 0xD0, 0x08, 0xF9, 0x11, 0x7C, 0x0C, 0x46, 0x14, 0x14, 0x15, 0x58, 0x18, + 0x5A, 0x14, 0xEE, 0x11, 0x44, 0x10, 0x53, 0x0C, 0x97, 0x10, 0xFA, 0x0C, + 0x3C, 0x04, 0x92, 0x05, 0xEE, 0xFB, 0x65, 0x06, 0xE3, 0xFD, 0x22, 0x09, + 0x27, 0x00, 0x09, 0xFF, 0x3A, 0x0C, 0x70, 0xFC, 0x91, 0x11, 0xAD, 0x00, + 0x71, 0x0A, 0xFE, 0xFE, 0x9C, 0x0D, 0xD0, 0xFF, 0x4F, 0x0B, 0xF5, 0xF6, + 0x9B, 0x0B, 0x0D, 0xF5, 0xEB, 0x0A, 0x42, 0xF9, 0x01, 0x0A, 0x38, 0xFB, + 0x1D, 0x0B, 0x21, 0x00, 0x7A, 0x03, 0xB6, 0x01, 0x70, 0xFB, 0xB5, 0x04, + 0x16, 0xF7, 0xA1, 0x09, 0x9F, 0x02, 0x56, 0x0F, 0x17, 0x0E, 0xE8, 0x0D, + 0x11, 0x0E, 0xD3, 0x06, 0x6D, 0x13, 0x6F, 0x03, 0x8D, 0x0E, 0xEC, 0xF8, + 0xCB, 0x02, 0xB8, 0xF5, 0xDE, 0xFE, 0x71, 0x06, 0x5F, 0xF7, 0xE5, 0x0B, + 0x59, 0xFC, 0xC9, 0x10, 0x82, 0xFE, 0xDF, 0x12, 0x98, 0xF1, 0x1F, 0x06, + 0x0C, 0xF3, 0xAA, 0x07, 0x66, 0xF1, 0x8C, 0x04, 0x12, 0xF2, 0x05, 0x05, + 0xD8, 0xFC, 0x21, 0x10, 0x24, 0x06, 0x1F, 0x14, 0x1C, 0x11, 0x67, 0x16, + 0x36, 0x19, 0x07, 0x14, 0x4F, 0x15, 0xA7, 0x09, 0x3A, 0x0D, 0x72, 0x02, + 0x76, 0x0C, 0xE1, 0x01, 0x8A, 0x0B, 0xD3, 0xFD, 0xDC, 0x07, 0x8E, 0xF5, + 0x2F, 0x0A, 0x36, 0xF5, 0xBE, 0x08, 0x7D, 0xF6, 0xCC, 0x07, 0xA4, 0xFD, + 0x75, 0x06, 0xF0, 0x06, 0x9F, 0x05, 0x27, 0x0A, 0x2B, 0x0B, 0x12, 0x0F, + 0x99, 0x0A, 0x02, 0x0A, 0x29, 0x14, 0xCD, 0x0B, 0x0A, 0x1C, 0xA4, 0x0E, + 0x72, 0x13, 0x25, 0x0A, 0x6C, 0x0F, 0x7D, 0x12, 0xD2, 0x07, 0xC8, 0x13, + 0x2C, 0x07, 0x37, 0x15, 0x8B, 0x0B, 0x44, 0x17, 0x63, 0x0C, 0x1D, 0x17, + 0x1E, 0x11, 0xA2, 0x1A, 0xCA, 0x08, 0x9C, 0x13, 0xA7, 0x00, 0x29, 0x11, + 0x3C, 0x02, 0x05, 0x17, 0x37, 0x03, 0x70, 0x13, 0x97, 0x0F, 0x05, 0x11, + 0x4D, 0x22, 0x95, 0x19, 0x47, 0x21, 0x0E, 0x1B, 0x72, 0x10, 0x37, 0x13, + 0x36, 0x05, 0xC6, 0x0C, 0x52, 0xFA, 0x50, 0x04, 0x07, 0xF5, 0x80, 0x05, + 0x94, 0xF9, 0x58, 0x0E, 0x6C, 0xFF, 0x5A, 0x13, 0x36, 0x05, 0xEE, 0x19, + 0xBE, 0x0B, 0x63, 0x23, 0xEB, 0x11, 0x2A, 0x2A, 0xF8, 0x18, 0x7E, 0x2E, + 0x31, 0x1C, 0x68, 0x2C, 0x99, 0x20, 0xC9, 0x23, 0x21, 0x31, 0xC8, 0x22, + 0xFF, 0x2C, 0x64, 0x17, 0x85, 0x20, 0x98, 0x0E, 0xFA, 0x21, 0x47, 0x17, + 0x8B, 0x17, 0x80, 0x12, 0xFA, 0x10, 0xC1, 0x0D, 0x72, 0x13, 0xAE, 0x0F, + 0x53, 0x0B, 0x7B, 0x09, 0xFE, 0x07, 0x3C, 0x0B, 0x81, 0x05, 0xC3, 0x0A, + 0x35, 0x03, 0xFE, 0x0A, 0x12, 0x0A, 0xCA, 0x17, 0xB4, 0x13, 0xA4, 0x1E, + 0xBF, 0x22, 0x87, 0x20, 0x6A, 0x22, 0xD1, 0x18, 0x14, 0x18, 0xE7, 0x12, + 0xDA, 0x10, 0x01, 0x11, 0x1D, 0x07, 0xF1, 0x08, 0x56, 0xFF, 0xDA, 0x00, + 0xF0, 0xFD, 0x5B, 0xFC, 0xDE, 0x00, 0xE3, 0xFD, 0xB7, 0x07, 0xA7, 0x09, + 0x04, 0x0E, 0xBF, 0x14, 0x87, 0x0F, 0xC5, 0x14, 0xE7, 0x0F, 0xD9, 0x12, + 0xD5, 0x0F, 0xCE, 0x0F, 0x34, 0x12, 0x62, 0x0C, 0xA0, 0x16, 0x41, 0x0A, + 0x25, 0x1B, 0xE1, 0x0B, 0x90, 0x18, 0x4F, 0x0D, 0xCC, 0x09, 0x6B, 0x0A, + 0x45, 0xFB, 0x68, 0x0A, 0x02, 0x00, 0x1A, 0x12, 0x4F, 0x08, 0x5E, 0x12, + 0xE6, 0x0B, 0xD0, 0x0D, 0x3C, 0x11, 0x7A, 0x0E, 0xA3, 0x10, 0xB3, 0x0B, + 0x40, 0x0D, 0xB9, 0x09, 0xA4, 0x0C, 0xA5, 0x0D, 0x5D, 0x15, 0x2D, 0x18, + 0x6C, 0x1A, 0x11, 0x1B, 0x22, 0x21, 0x6A, 0x20, 0x19, 0x23, 0x80, 0x23, + 0x2C, 0x18, 0xDC, 0x1B, 0x8B, 0x12, 0x4E, 0x1B, 0xDC, 0x08, 0xD1, 0x18, + 0xE0, 0x02, 0x50, 0x1A, 0x21, 0x05, 0x3C, 0x1F, 0xCE, 0x09, 0x71, 0x1E, + 0x4B, 0x0C, 0xBB, 0x1B, 0x3A, 0x09, 0xB8, 0x1B, 0x65, 0x09, 0x01, 0x21, + 0x0E, 0x0C, 0x20, 0x20, 0x79, 0x13, 0x42, 0x19, 0x65, 0x1F, 0x23, 0x16, + 0x42, 0x1F, 0x4C, 0x0F, 0x28, 0x1C, 0x67, 0x11, 0x30, 0x12, 0x82, 0x10, + 0x0C, 0x0F, 0xD9, 0x13, 0xA2, 0x0B, 0x0F, 0x17, 0xD2, 0xFB, 0x79, 0x0E, + 0xEE, 0xFA, 0x79, 0x10, 0x4C, 0xFE, 0xBC, 0x0B, 0x25, 0x01, 0xBD, 0x00, + 0x49, 0x00, 0x68, 0xF7, 0xEF, 0x05, 0x48, 0xFE, 0xF2, 0x04, 0x82, 0x06, + 0xC4, 0xFB, 0xCB, 0x08, 0x9A, 0xF7, 0xC7, 0x0C, 0x72, 0xF2, 0x3A, 0x08, + 0x59, 0xF4, 0xB4, 0x02, 0xF4, 0xFB, 0xF6, 0x04, 0x65, 0xFA, 0xB1, 0x00, + 0x7B, 0xFF, 0x44, 0xFF, 0x72, 0xFF, 0x83, 0xFA, 0xA8, 0xF6, 0x7E, 0xF3, + 0x5A, 0xF2, 0xFC, 0xF3, 0x22, 0xEA, 0xFD, 0xEC, 0x07, 0xF0, 0xC8, 0xF1, + 0xDC, 0xF7, 0xBC, 0xF1, 0xB1, 0xFC, 0xD5, 0xEA, 0x5F, 0x02, 0xD8, 0xEC, + 0xD1, 0x04, 0xBB, 0xF5, 0xD4, 0x01, 0x8F, 0xF9, 0x77, 0x00, 0x31, 0xF7, + 0xF6, 0xFF, 0x34, 0xF7, 0xBB, 0xFC, 0xEB, 0xF8, 0x5E, 0x00, 0xD8, 0xFD, + 0xFB, 0x08, 0xA5, 0x00, 0x3B, 0x00, 0x6E, 0xF6, 0xC0, 0xF6, 0xB3, 0xF5, + 0x70, 0xF3, 0x76, 0xFA, 0x2B, 0xEE, 0xBB, 0xF1, 0xA9, 0xF0, 0x63, 0xE9, + 0x71, 0xF4, 0xE3, 0xE8, 0x77, 0xF2, 0x1E, 0xE8, 0x0A, 0xF0, 0xC5, 0xE6, + 0x2C, 0xF0, 0x0A, 0xE7, 0x84, 0xF3, 0x58, 0xE9, 0xEC, 0xF3, 0x14, 0xEA, + 0xB1, 0xF5, 0x65, 0xEC, 0x55, 0xF5, 0xD4, 0xEF, 0x67, 0xF0, 0x8C, 0xF3, + 0x91, 0xE8, 0x19, 0xF2, 0xEC, 0xE2, 0x94, 0xF1, 0x9A, 0xE1, 0x17, 0xF5, + 0x0D, 0xDB, 0x95, 0xF0, 0x23, 0xD9, 0x9F, 0xE9, 0x07, 0xE2, 0x43, 0xE5, + 0xE5, 0xE6, 0xCE, 0xDC, 0xE5, 0xEA, 0x9D, 0xD9, 0xDB, 0xF1, 0x74, 0xE3, + 0xAD, 0xEF, 0x80, 0xE6, 0x2A, 0xED, 0x1A, 0xE9, 0x2F, 0xEA, 0x9E, 0xE9, + 0x95, 0xE8, 0xF2, 0xE2, 0x95, 0xE6, 0x5F, 0xDA, 0x77, 0xE6, 0x95, 0xD4, + 0xEC, 0xE8, 0x76, 0xD6, 0x40, 0xDE, 0x7C, 0xD7, 0x6E, 0xD4, 0xB4, 0xDE, + 0x95, 0xCE, 0x48, 0xE3, 0xC7, 0xCD, 0xCB, 0xDD, 0x22, 0xD3, 0x42, 0xD7, + 0xC8, 0xD9, 0xA4, 0xD2, 0x32, 0xE7, 0x7D, 0xD5, 0x58, 0xE6, 0xDE, 0xD3, + 0x9D, 0xE5, 0x47, 0xD6, 0x1A, 0xEE, 0x80, 0xDD, 0x74, 0xEC, 0xA3, 0xDA, + 0x8E, 0xEA, 0x88, 0xDD, 0x87, 0xE6, 0x5E, 0xDF, 0x2C, 0xE8, 0x9F, 0xE1, + 0xDF, 0xEB, 0x37, 0xE6, 0xF8, 0xEA, 0x5E, 0xEA, 0x65, 0xEA, 0xF7, 0xF1, + 0x0A, 0xE5, 0xFD, 0xF0, 0xC5, 0xEC, 0x08, 0xF4, 0xD0, 0xF2, 0xC7, 0xFA, + 0xE4, 0xEA, 0x5F, 0xFB, 0x6E, 0xEC, 0xF3, 0x02, 0x4C, 0xF1, 0x10, 0x08, + 0x46, 0xF6, 0x7D, 0x06, 0x30, 0xFA, 0x42, 0x03, 0xC4, 0xFB, 0xB2, 0x00, + 0x79, 0xFA, 0xA6, 0xFC, 0x1A, 0xF5, 0xBE, 0xF6, 0xA9, 0xF6, 0xA6, 0xF6, + 0x66, 0xF5, 0xE7, 0xF6, 0x47, 0xEB, 0x90, 0xF1, 0xF5, 0xEC, 0x67, 0xF2, + 0xCA, 0xF1, 0x21, 0xEF, 0xD4, 0xF9, 0xAC, 0xEB, 0x35, 0xFF, 0xEE, 0xEB, + 0x6A, 0x06, 0xDA, 0xF1, 0x02, 0x08, 0x48, 0xF5, 0xE7, 0x04, 0x14, 0xF6, + 0x44, 0x09, 0x49, 0xFE, 0x1F, 0x06, 0xF6, 0xFB, 0x3A, 0xFB, 0x14, 0xEF, + 0xCE, 0xF8, 0x5B, 0xED, 0x81, 0xF5, 0x14, 0xE9, 0x29, 0xF4, 0x9A, 0xE5, + 0xA4, 0xF5, 0x2D, 0xE9, 0x51, 0xF9, 0xCC, 0xEE, 0x1F, 0xFF, 0x0A, 0xF7, + 0x19, 0xF7, 0x05, 0xF3, 0x10, 0xF8, 0xFE, 0xF3, 0x32, 0xF4, 0x14, 0xF1, + 0xE7, 0xEA, 0xF1, 0xEC, 0xB5, 0xEA, 0x89, 0xF5, 0xDD, 0xEE, 0x95, 0x01, + 0xB8, 0xF1, 0xF5, 0x02, 0xD1, 0xF3, 0x86, 0xFC, 0xCF, 0xF2, 0xBA, 0xF7, + 0xDB, 0xEC, 0x05, 0xF6, 0x84, 0xE5, 0xB9, 0xEF, 0x8B, 0xE8, 0xE0, 0xEC, + 0x3C, 0xF6, 0x75, 0xF0, 0xEC, 0xFC, 0x13, 0xF0, 0xB3, 0xFF, 0x35, 0xF2, + 0x36, 0xFD, 0xBF, 0xF0, 0x2A, 0xFD, 0x13, 0xF1, 0x62, 0xFF, 0x40, 0xF4, + 0xE3, 0xFD, 0xF3, 0xF9, 0x11, 0xFC, 0x55, 0x02, 0x69, 0xF3, 0xA5, 0xFE, + 0x0E, 0xF5, 0x02, 0xFD, 0x93, 0xF6, 0xAB, 0xF6, 0x59, 0xF0, 0x44, 0xEC, + 0xAE, 0xF0, 0x0D, 0xF3, 0xB4, 0xF0, 0x7B, 0xF8, 0x71, 0xF8, 0xF5, 0xF9, + 0xAA, 0x05, 0x70, 0xFF, 0x74, 0x11, 0x9B, 0x07, 0xE5, 0x10, 0x0B, 0x06, + 0x36, 0x09, 0x73, 0x01, 0xFE, 0x0B, 0xF9, 0x06, 0x5B, 0x05, 0xE9, 0x04, + 0xA4, 0xFF, 0xD2, 0x09, 0x19, 0x00, 0x89, 0x11, 0xB4, 0xFA, 0x0B, 0x09, + 0x64, 0xFF, 0x05, 0x04, 0x59, 0xFF, 0x74, 0xF8, 0x6E, 0xFC, 0x4D, 0xEF, + 0x6C, 0xF7, 0xE4, 0xEC, 0x5A, 0xEF, 0x41, 0xEB, 0xA5, 0xF5, 0x2A, 0xF3, + 0xEC, 0xFC, 0x8E, 0xF4, 0x32, 0x02, 0x47, 0xF2, 0x5F, 0x04, 0x0C, 0xF3, + 0x49, 0x06, 0x28, 0xFB, 0xE2, 0x06, 0xE5, 0x05, 0x28, 0x02, 0x60, 0x0A, + 0x6C, 0x03, 0x8B, 0x0F, 0x63, 0x00, 0x92, 0x0A, 0x94, 0xFF, 0x22, 0xFA, + 0xEA, 0x06, 0x5C, 0xEC, 0xDA, 0x0C, 0x89, 0xE9, 0x10, 0x0A, 0x2A, 0xEE, + 0xD1, 0x07, 0xEE, 0xF7, 0xD6, 0x03, 0x68, 0xFD, 0xAB, 0xFF, 0xB5, 0xFD, + 0x3D, 0xFF, 0xAC, 0x03, 0x52, 0xFD, 0x53, 0x0A, 0x37, 0xF5, 0x13, 0x08, + 0xE5, 0xF3, 0x7D, 0x0A, 0x58, 0xF7, 0x65, 0x0C, 0x82, 0xF9, 0x2C, 0x0B, + 0x78, 0xFB, 0x0F, 0x11, 0xD5, 0xF9, 0x05, 0x15, 0x97, 0xFC, 0xA4, 0x14, + 0x8F, 0xFD, 0xF9, 0x0E, 0x40, 0xFC, 0xFB, 0x06, 0xC6, 0xFD, 0xAB, 0x02, + 0xE4, 0xFC, 0x04, 0xFA, 0xEC, 0xFD, 0xA7, 0xEC, 0xAE, 0x0A, 0x1B, 0xEC, + 0xB3, 0x11, 0xE2, 0xF0, 0x26, 0x0B, 0xB8, 0xF0, 0x71, 0x06, 0x00, 0xF3, + 0x18, 0x07, 0xC4, 0xF9, 0x60, 0x01, 0xA9, 0xF7, 0x6D, 0x04, 0x3E, 0xF8, + 0x25, 0x0A, 0x52, 0xF8, 0xC6, 0x05, 0x8F, 0xF5, 0x68, 0x00, 0x2F, 0xF7, + 0xAC, 0xFD, 0x21, 0xFC, 0x25, 0x00, 0xEC, 0x09, 0x3F, 0xF5, 0x5A, 0x09, + 0x2C, 0xF9, 0x2F, 0x12, 0xFF, 0xF6, 0x35, 0x0F, 0xB4, 0xF1, 0x70, 0x02, + 0x9D, 0xFB, 0x14, 0x05, 0x27, 0xF8, 0x0B, 0x03, 0x4E, 0xFB, 0xF5, 0x04, + 0xE0, 0x02, 0x49, 0x02, 0x61, 0x0C, 0xF9, 0x03, 0x2F, 0x0B, 0xCA, 0x01, + 0x4C, 0xFF, 0x56, 0xFA, 0x3B, 0xFF, 0x93, 0xFE, 0xD5, 0xF5, 0xFC, 0xF1, + 0xC1, 0xF6, 0xB2, 0xEB, 0x8E, 0xFB, 0x3D, 0xED, 0xA7, 0xF7, 0x14, 0xEE, + 0x19, 0xFA, 0xD7, 0xFD, 0xE0, 0xFA, 0x9F, 0x0A, 0x0D, 0x00, 0x49, 0x14, + 0x05, 0xFF, 0xAE, 0x13, 0x1C, 0x01, 0xA9, 0x15, 0x19, 0x02, 0xFB, 0x12, + 0x69, 0x05, 0xA4, 0x07, 0x39, 0x14, 0xC3, 0x03, 0x33, 0x1B, 0x81, 0x04, + 0x25, 0x19, 0x79, 0x07, 0xA3, 0x12, 0xD2, 0x05, 0x0F, 0x11, 0x77, 0x06, + 0x82, 0x11, 0x4D, 0x09, 0x29, 0x08, 0x75, 0x02, 0x9C, 0x04, 0x7A, 0xFE, + 0x41, 0x07, 0x3D, 0xFE, 0x23, 0xFE, 0x09, 0xF9, 0xFB, 0xFD, 0xFA, 0xFF, + 0xAC, 0xFF, 0x14, 0x09, 0x0A, 0x00, 0x5A, 0x11, 0xC0, 0xFF, 0x27, 0x12, + 0x6D, 0x0C, 0x32, 0x13, 0xE5, 0x16, 0xFD, 0x0D, 0xAE, 0x14, 0xFD, 0x00, + 0x92, 0x15, 0xC6, 0x01, 0x71, 0x08, 0xBF, 0xFF, 0xA0, 0x03, 0xD3, 0x02, + 0xE1, 0x02, 0x23, 0x02, 0x55, 0x04, 0xC8, 0x05, 0x29, 0x0E, 0xC6, 0x12, + 0x53, 0x10, 0x4A, 0x16, 0xF0, 0x16, 0xE7, 0x1C, 0x0C, 0x12, 0xEC, 0x13, + 0xE6, 0x0C, 0x78, 0x0B, 0xC8, 0x08, 0x3E, 0x06, 0xE8, 0x02, 0xE3, 0x01, + 0x1A, 0x0D, 0x0C, 0x0C, 0xE5, 0x13, 0x96, 0x12, 0xA3, 0x17, 0x0A, 0x1E, + 0x0D, 0x14, 0x00, 0x21, 0x32, 0x0A, 0xCB, 0x18, 0x1A, 0x0A, 0x4E, 0x18, + 0x58, 0x04, 0xA1, 0x0E, 0xFD, 0x06, 0x66, 0x0D, 0x7F, 0x10, 0xF1, 0x14, + 0x8F, 0x12, 0x75, 0x17, 0x88, 0x13, 0xB3, 0x18, 0x81, 0x0F, 0x65, 0x13, + 0x2C, 0x11, 0x46, 0x12, 0x30, 0x10, 0x9B, 0x0D, 0x87, 0x10, 0x55, 0x0B, + 0x69, 0x15, 0x6F, 0x06, 0x18, 0x18, 0x29, 0x02, 0x62, 0x11, 0xE6, 0x04, + 0xA1, 0x05, 0x0F, 0x09, 0x7F, 0x02, 0x39, 0x14, 0x86, 0x01, 0xC1, 0x1B, + 0xB5, 0x09, 0xC1, 0x26, 0x6C, 0x13, 0x1C, 0x30, 0xEE, 0x13, 0xA0, 0x28, + 0x1E, 0x15, 0xFA, 0x21, 0x59, 0x13, 0x23, 0x1D, 0x79, 0x06, 0x62, 0x11, + 0xA3, 0x06, 0xBA, 0x12, 0xEA, 0x0A, 0x16, 0x10, 0x7E, 0x0D, 0xD2, 0x0A, + 0x13, 0x19, 0xAD, 0x13, 0xE1, 0x16, 0xAD, 0x12, 0x4C, 0x11, 0x63, 0x0E, + 0xEF, 0x07, 0x3A, 0x0B, 0x53, 0xF9, 0xD6, 0x05, 0x4E, 0xF6, 0x1A, 0x05, + 0xC8, 0xFF, 0x71, 0x08, 0xDB, 0x08, 0xE1, 0x0B, 0x99, 0x0E, 0xFF, 0x0E, + 0x0B, 0x12, 0xFD, 0x10, 0xE1, 0x08, 0x43, 0x08, 0xBB, 0x07, 0x0D, 0x09, + 0x7F, 0x01, 0x78, 0xFF, 0xF7, 0x01, 0xF2, 0xF7, 0x42, 0x0A, 0xAE, 0xF8, + 0x8B, 0x06, 0x15, 0xEB, 0x79, 0x0B, 0x44, 0xED, 0x14, 0x07, 0x78, 0xF4, + 0xE7, 0xFF, 0x52, 0xF9, 0x63, 0x02, 0x10, 0x03, 0x34, 0xFF, 0xE6, 0x07, + 0x06, 0xFF, 0xCB, 0x08, 0xA0, 0xFE, 0x3D, 0x04, 0xED, 0x01, 0x23, 0x09, + 0x75, 0xFC, 0x90, 0x05, 0x51, 0xFC, 0x24, 0x04, 0x78, 0x09, 0x71, 0x11, + 0xB6, 0x03, 0x62, 0x12, 0x3D, 0x0B, 0xD3, 0x18, 0xD3, 0x0D, 0xE4, 0x10, + 0x54, 0x0D, 0xA5, 0x0D, 0x04, 0x0A, 0x52, 0x0C, 0xFD, 0x04, 0x3C, 0x0C, + 0x0A, 0x0A, 0x34, 0x17, 0x3A, 0x07, 0x7B, 0x14, 0x1F, 0x0D, 0x5A, 0x14, + 0xBE, 0x0E, 0xE2, 0x0F, 0xAC, 0x10, 0x92, 0x0F, 0x74, 0x0B, 0x04, 0x06, + 0xC7, 0x0E, 0x0B, 0x04, 0x5C, 0x11, 0x56, 0x06, 0x32, 0x04, 0xC4, 0xF7, + 0xF8, 0x08, 0x58, 0x00, 0x3A, 0x08, 0x8B, 0x07, 0xE2, 0x05, 0x10, 0x0D, + 0x72, 0x0F, 0x40, 0x1F, 0x45, 0x0F, 0x25, 0x27, 0x4F, 0x07, 0x59, 0x2A, + 0xC3, 0x04, 0x11, 0x25, 0x77, 0x06, 0xE5, 0x19, 0xC3, 0x01, 0x63, 0x0B, + 0xEF, 0x01, 0x14, 0x03, 0x15, 0x04, 0xDA, 0x05, 0x0D, 0x03, 0x86, 0x0B, + 0x54, 0x02, 0xAF, 0x0E, 0x43, 0x08, 0x48, 0x10, 0xBB, 0x10, 0xC9, 0x0E, + 0xD6, 0x09, 0xF8, 0x02, 0x3F, 0xFF, 0xCB, 0xF6, 0x2E, 0x00, 0x1D, 0xFA, + 0x7E, 0xF5, 0x5A, 0xF3, 0x88, 0xF4, 0xFF, 0xF3, 0x66, 0xFB, 0x18, 0x03, + 0x99, 0xF5, 0x21, 0x03, 0xCA, 0xFA, 0x73, 0x02, 0x3E, 0x07, 0xD3, 0x01, + 0xB5, 0x03, 0xAD, 0xF5, 0x65, 0xFE, 0x36, 0xF1, 0xC8, 0xFB, 0x23, 0xEB, + 0x60, 0xFD, 0xD2, 0xE6, 0x38, 0x08, 0x5A, 0xED, 0x39, 0x05, 0x54, 0xEF, + 0xEE, 0x0A, 0x42, 0x02, 0x7C, 0x0B, 0x0A, 0x08, 0x97, 0x08, 0x89, 0x02, + 0xD3, 0x07, 0xAC, 0x02, 0xB8, 0xFF, 0x44, 0xFF, 0x8B, 0xFC, 0x57, 0x01, + 0xA1, 0xF6, 0xAF, 0xFF, 0x70, 0xFF, 0xF3, 0x08, 0x20, 0x05, 0x42, 0x0B, + 0x7A, 0x0A, 0x3B, 0x0F, 0xE1, 0x0D, 0x21, 0x1B, 0x91, 0x01, 0xE2, 0x19, + 0xEF, 0xFF, 0x0C, 0x1D, 0x87, 0x04, 0x05, 0x1D, 0x3D, 0x0C, 0x0D, 0x18, + 0x61, 0x0D, 0xCB, 0x0B, 0xDC, 0x02, 0xC5, 0xFC, 0xA5, 0x04, 0x09, 0x00, + 0x28, 0x00, 0x8D, 0xFF, 0x3B, 0xF9, 0xCB, 0xFE, 0xC2, 0xFD, 0xFF, 0x03, + 0xE3, 0xFF, 0x45, 0xFA, 0xAE, 0x06, 0x0A, 0xEC, 0x70, 0x0E, 0xD5, 0xE9, + 0x91, 0x07, 0x1E, 0xE5, 0xCE, 0x02, 0x3C, 0xEB, 0x55, 0x07, 0x6E, 0xFF, + 0xD3, 0x07, 0x1A, 0x0A, 0xE1, 0x11, 0x7D, 0x18, 0xEB, 0x10, 0x29, 0x18, + 0x19, 0x08, 0x79, 0x10, 0x7E, 0xFF, 0xBD, 0x07, 0x1E, 0xED, 0x39, 0xF2, + 0x67, 0xE9, 0x28, 0xF0, 0x8E, 0xEC, 0xEC, 0xF0, 0xFF, 0xEA, 0x61, 0xEA, + 0xE2, 0xF5, 0xBB, 0xF3, 0xFA, 0xF7, 0x5B, 0xF1, 0x02, 0xFA, 0xED, 0xF1, + 0x94, 0xFD, 0x90, 0xF8, 0x09, 0xF5, 0xD4, 0xF9, 0x1F, 0xF1, 0x44, 0xFE, + 0x4D, 0xF2, 0x34, 0xFE, 0xD4, 0xF4, 0xC2, 0xFE, 0x62, 0xF5, 0xC4, 0xF7, + 0xA9, 0xF4, 0x39, 0xF4, 0x3E, 0xF1, 0xB6, 0xF6, 0x45, 0xED, 0xD8, 0xF7, + 0xE3, 0xF3, 0x48, 0xFD, 0x4E, 0xF8, 0x35, 0xF5, 0xF2, 0x00, 0x48, 0xF1, + 0x17, 0x01, 0x7A, 0xE7, 0xB7, 0xF7, 0x6C, 0xD9, 0xD2, 0xFE, 0x2C, 0xEC, + 0xBC, 0xF5, 0x08, 0xF5, 0xF0, 0xE7, 0xAD, 0xF7, 0xC1, 0xF1, 0xD7, 0x07, + 0x6C, 0xEE, 0xB1, 0xFC, 0x27, 0xEB, 0x79, 0xF1, 0x46, 0xF1, 0x0B, 0xF2, + 0x66, 0xED, 0x22, 0xF1, 0x8A, 0xF0, 0x71, 0xF6, 0x70, 0xF3, 0x57, 0xF5, + 0xF1, 0xF7, 0x2D, 0xF6, 0xB7, 0xFA, 0x7A, 0xF7, 0xB4, 0xF6, 0x22, 0xF3, + 0xCE, 0xFF, 0xB1, 0xFA, 0xD2, 0x02, 0x1D, 0xFC, 0x83, 0x00, 0x92, 0xF4, + 0xF7, 0x0A, 0xA5, 0xF6, 0xBA, 0x0B, 0x8B, 0xF7, 0x01, 0xFB, 0x82, 0xEB, + 0x51, 0xF9, 0xAC, 0xEB, 0xE6, 0xFB, 0xDE, 0xF6, 0xDF, 0xE9, 0xF3, 0xF2, + 0x2F, 0xE1, 0x34, 0xF2, 0xC1, 0xE9, 0x4F, 0xF6, 0x7A, 0xE5, 0x0A, 0xE9, + 0x02, 0xE6, 0xDC, 0xE2, 0x93, 0xE9, 0x77, 0xE3, 0xAA, 0xDC, 0xFA, 0xDB, + 0xA0, 0xE4, 0x0D, 0xEE, 0x9B, 0xE8, 0x5E, 0xF9, 0x50, 0xED, 0x49, 0x01, + 0x65, 0xFB, 0x1B, 0x0B, 0x5E, 0xFB, 0x85, 0xF9, 0x88, 0xFC, 0x61, 0xE9, + 0xE2, 0xF2, 0x9E, 0xD9, 0x99, 0xEF, 0x95, 0xD9, 0xEE, 0xFD, 0xA0, 0xEB, + 0x73, 0xF7, 0xEA, 0xE9, 0xEF, 0xF1, 0x1E, 0xEA, 0x46, 0xF6, 0x51, 0xE7, + 0xB0, 0xF0, 0x1A, 0xDC, 0x14, 0xF3, 0x2B, 0xE4, 0x19, 0xF2, 0x0C, 0xED, + 0x80, 0xE8, 0x9A, 0xEF, 0xF1, 0xEC, 0x0D, 0xF7, 0x4E, 0xF0, 0x8D, 0xF6, + 0x1B, 0xEB, 0xA8, 0xED, 0x8D, 0xE7, 0x47, 0xEC, 0xD4, 0xEE, 0xC9, 0xFC, + 0x1D, 0xFE, 0x4F, 0x0C, 0xA6, 0xFD, 0x3F, 0x07, 0x97, 0xF5, 0x20, 0xFC, + 0xE4, 0xF2, 0x05, 0xF1, 0xBC, 0xEF, 0xCB, 0xE9, 0x87, 0xF0, 0x8B, 0xE6, + 0x7B, 0xF6, 0x55, 0xF0, 0xBF, 0xFA, 0x47, 0xF9, 0x78, 0xF4, 0x2E, 0xEF, + 0x96, 0xF8, 0x78, 0xEF, 0xAF, 0xFC, 0xE7, 0xE9, 0x79, 0xFA, 0xDF, 0xE8, + 0xCA, 0xF9, 0x34, 0xEC, 0xFA, 0xFE, 0xA1, 0xEE, 0x28, 0x09, 0x01, 0xFB, + 0xB5, 0xFC, 0xFA, 0xF3, 0xCF, 0xF9, 0x82, 0xFB, 0xE5, 0xFE, 0xF7, 0x07, + 0x17, 0xF5, 0x06, 0x07, 0xFB, 0xF2, 0x18, 0x0E, 0xBD, 0xFA, 0x7C, 0x10, + 0x9D, 0xF8, 0x30, 0x02, 0x1E, 0xF6, 0x8A, 0xF6, 0x97, 0x00, 0xB0, 0xFF, + 0x16, 0xFC, 0x93, 0xFF, 0x7E, 0xF7, 0x25, 0xFA, 0x1D, 0x02, 0xEF, 0xFE, + 0xC3, 0x07, 0xB1, 0xFB, 0x65, 0x02, 0xC7, 0xEF, 0x78, 0xFB, 0x94, 0xEE, + 0xC5, 0xF9, 0x9B, 0xF3, 0x20, 0xED, 0x7A, 0xEF, 0x51, 0xE3, 0x8E, 0xF1, + 0x8E, 0xE7, 0x00, 0xFD, 0xF9, 0xEC, 0xB2, 0x0A, 0x43, 0xF2, 0x59, 0x12, + 0x57, 0xFB, 0x44, 0x16, 0x6B, 0xF9, 0xC1, 0x12, 0x9F, 0xF4, 0xE1, 0x02, + 0x85, 0xFD, 0x51, 0xFA, 0xDB, 0x0C, 0xC7, 0xFE, 0x43, 0x0E, 0x3A, 0xF9, + 0x7F, 0x15, 0xDF, 0xFC, 0x82, 0x1B, 0x53, 0x03, 0xD6, 0x0E, 0x57, 0xFC, + 0x41, 0x0B, 0xD7, 0xF9, 0x1D, 0x07, 0xF4, 0xF4, 0x92, 0xFB, 0x87, 0xF2, + 0xC0, 0x02, 0xC7, 0xFE, 0xAD, 0x05, 0xB0, 0x05, 0x0D, 0xF9, 0x36, 0x02, + 0x07, 0xF8, 0x50, 0x01, 0xFB, 0xF6, 0x93, 0xFD, 0x59, 0xF3, 0xAE, 0xFA, + 0x07, 0xF4, 0x95, 0x02, 0x3B, 0xFB, 0x0B, 0x04, 0x5B, 0x03, 0xF7, 0xFF, + 0x46, 0x03, 0x6E, 0x03, 0x9D, 0xFC, 0xCB, 0xF9, 0x72, 0xF6, 0x8E, 0xEF, + 0xB0, 0xF9, 0x1D, 0xF5, 0xA2, 0xFF, 0xD8, 0xF9, 0x86, 0x01, 0x04, 0x01, + 0xBB, 0xFC, 0x97, 0xFE, 0xBE, 0xF5, 0xDC, 0xF6, 0xDD, 0xFC, 0xAC, 0xF9, + 0xF9, 0xFF, 0xE7, 0xEF, 0xC4, 0xFD, 0x4F, 0xED, 0x06, 0x02, 0x63, 0xF1, + 0x07, 0x04, 0xAD, 0xEE, 0x29, 0x0E, 0xEF, 0xFA, 0xED, 0x0B, 0x8C, 0x01, + 0x74, 0x00, 0x3F, 0x03, 0x4C, 0xF7, 0xF4, 0x01, 0x45, 0xEB, 0xD8, 0xF8, + 0x8E, 0xF4, 0x72, 0xF9, 0x08, 0xF8, 0xB0, 0xF3, 0x17, 0xF9, 0xDA, 0xF2, + 0xC3, 0x02, 0x3E, 0xFA, 0xA3, 0x04, 0x75, 0xF6, 0x1A, 0x06, 0x24, 0xFC, + 0xF5, 0xF7, 0x45, 0xF7, 0x1C, 0xF4, 0x64, 0xF6, 0x69, 0xF9, 0x1E, 0xFB, + 0xF9, 0xFE, 0x35, 0xF8, 0x76, 0x0A, 0x47, 0xFF, 0xA9, 0x08, 0x95, 0xFD, + 0xE8, 0x03, 0xFB, 0x02, 0x7E, 0x04, 0xF3, 0x0C, 0x66, 0x02, 0xBE, 0x10, + 0x39, 0xFB, 0xAA, 0x17, 0xD4, 0xFC, 0x22, 0x1C, 0x7D, 0x05, 0x42, 0x1E, + 0x39, 0xFC, 0x64, 0x0F, 0xE0, 0xF5, 0xA5, 0x05, 0x76, 0x04, 0x1D, 0x0C, + 0xB6, 0x08, 0x8A, 0x0A, 0x90, 0x0C, 0x72, 0x13, 0x6D, 0x10, 0xE0, 0x19, + 0xBD, 0x08, 0x5D, 0x0D, 0x06, 0x03, 0x63, 0x06, 0x47, 0x02, 0x30, 0x03, + 0x1E, 0x01, 0x6D, 0x01, 0x2A, 0xFD, 0xE6, 0x03, 0x33, 0xF9, 0xA1, 0x01, + 0x7F, 0x04, 0x8E, 0x08, 0xB2, 0x0C, 0xA1, 0x0A, 0x43, 0x06, 0x91, 0x05, + 0x2E, 0xFF, 0x6C, 0x0A, 0xEB, 0xFF, 0x9F, 0x11, 0x37, 0x02, 0x9D, 0x11, + 0x45, 0x08, 0xE9, 0x0F, 0x87, 0x09, 0x9F, 0x08, 0xDF, 0x07, 0xDA, 0xFD, + 0x01, 0x0B, 0x51, 0xF5, 0xBE, 0x0D, 0x35, 0xF4, 0x00, 0x10, 0xC2, 0xFB, + 0x05, 0x06, 0xFB, 0xFA, 0xFD, 0xFF, 0x39, 0xFB, 0xF0, 0xFC, 0xE7, 0xF7, + 0x5A, 0xFE, 0xB8, 0xF0, 0x4F, 0x04, 0xEE, 0xED, 0x84, 0x09, 0x65, 0xF3, + 0xED, 0x0D, 0x33, 0x00, 0x96, 0x10, 0xFE, 0x0A, 0x30, 0x13, 0xC8, 0x17, + 0x66, 0x18, 0xB0, 0x22, 0x56, 0x1B, 0x57, 0x26, 0x08, 0x14, 0x98, 0x21, + 0x29, 0x0C, 0xAE, 0x19, 0xBD, 0x0D, 0xF0, 0x13, 0xD0, 0x0C, 0x19, 0x12, + 0x39, 0x05, 0x11, 0x17, 0xC3, 0x03, 0x67, 0x10, 0x1D, 0x05, 0x59, 0x07, + 0x4C, 0x0B, 0xC7, 0x0E, 0x49, 0x0F, 0xBF, 0x0D, 0x30, 0x0C, 0xF9, 0x06, + 0x93, 0x06, 0x74, 0xFE, 0x5B, 0x08, 0xAE, 0xF7, 0x6B, 0x16, 0xFC, 0x03, + 0x8A, 0x1D, 0x00, 0x0A, 0x9A, 0x1E, 0x9F, 0x0C, 0xF5, 0x1B, 0x81, 0x17, + 0xCC, 0x13, 0xDF, 0x18, 0x5C, 0x0F, 0x23, 0x19, 0xAA, 0x0E, 0x67, 0x15, + 0x82, 0x0A, 0x65, 0x0F, 0x45, 0x07, 0xF9, 0x07, 0x3B, 0x06, 0x1D, 0x01, + 0xAC, 0x0A, 0xEE, 0x06, 0x27, 0x08, 0xAB, 0x05, 0x21, 0x0A, 0xFB, 0x04, + 0x59, 0x14, 0x8C, 0x11, 0xB2, 0x0E, 0xE8, 0x16, 0x1C, 0x01, 0xA1, 0x0F, + 0xE8, 0x05, 0x19, 0x0E, 0xA3, 0x14, 0x88, 0x0E, 0x79, 0x0A, 0x80, 0x02, + 0x9B, 0x00, 0x68, 0xFF, 0x1D, 0x03, 0x91, 0x05, 0xE0, 0x05, 0x80, 0x0B, + 0x77, 0xFF, 0x8E, 0x0D, 0x5E, 0xF8, 0x79, 0x0C, 0x08, 0xF8, 0xB7, 0x0B, + 0x07, 0xF6, 0xB1, 0xFF, 0x7F, 0x06, 0x1B, 0xFB, 0x2A, 0x0E, 0x5C, 0xFC, + 0xEB, 0x06, 0x42, 0xF6, 0x80, 0x0A, 0x81, 0xF7, 0x75, 0x18, 0x3C, 0x03, + 0x1E, 0x18, 0xA0, 0x0A, 0xF6, 0xFE, 0x4D, 0x04, 0xD4, 0xF8, 0x11, 0xFF, + 0x2C, 0xFF, 0xB6, 0xFB, 0x36, 0xFB, 0x0F, 0xF8, 0x8C, 0xF7, 0x1F, 0xFF, + 0x96, 0xFB, 0x23, 0x09, 0x15, 0x0C, 0xDA, 0x11, 0xC7, 0x17, 0x71, 0x1B, + 0xEE, 0x0F, 0x61, 0x25, 0x80, 0x0E, 0x40, 0x2E, 0x73, 0x0D, 0xC2, 0x25, + 0x2E, 0x03, 0x22, 0x19, 0xB2, 0x06, 0x09, 0x1A, 0x79, 0x09, 0x47, 0x19, + 0x9B, 0x03, 0xDF, 0x14, 0x6F, 0x12, 0xB4, 0x13, 0xEF, 0x1B, 0x1F, 0x14, + 0x70, 0x01, 0x19, 0x10, 0x8E, 0xF9, 0xF0, 0x10, 0xD1, 0xFC, 0xC4, 0x07, + 0x68, 0xFC, 0x9F, 0xF1, 0xCE, 0x01, 0xCE, 0xEB, 0xA5, 0x08, 0xA4, 0xEF, + 0xCE, 0x1A, 0x02, 0xF3, 0x56, 0x30, 0xA1, 0x00, 0x3C, 0x29, 0xFD, 0x0B, + 0x2B, 0x0F, 0x89, 0x12, 0x61, 0x10, 0x15, 0x1A, 0xC8, 0x17, 0x25, 0x17, + 0xA9, 0x10, 0xB9, 0x15, 0x7A, 0x09, 0x03, 0x13, 0xEB, 0xFD, 0x12, 0x03, + 0x0A, 0xF6, 0xA7, 0xF9, 0x79, 0xF9, 0xC2, 0xFA, 0x1A, 0xFA, 0x92, 0x02, + 0xA7, 0xF7, 0x40, 0x0A, 0x1D, 0xF9, 0x35, 0x0A, 0x1A, 0xFD, 0xEA, 0x03, + 0x35, 0x00, 0x06, 0xFC, 0xB0, 0xFF, 0xCC, 0xF8, 0x18, 0xF3, 0x79, 0xFE, + 0xA2, 0xFD, 0x67, 0x07, 0xE3, 0x05, 0x53, 0x06, 0xC7, 0xF1, 0xA4, 0x0E, + 0xCA, 0x00, 0x63, 0x16, 0xF5, 0x08, 0x13, 0x07, 0x8E, 0xF9, 0xBB, 0xFC, + 0xBB, 0xF7, 0x5C, 0xFD, 0x63, 0xF6, 0x07, 0xF6, 0xFA, 0x03, 0x63, 0xF7, + 0x68, 0x17, 0x26, 0xFF, 0xC8, 0x14, 0xA8, 0xF4, 0x09, 0x09, 0x48, 0xF5, + 0xA3, 0xFB, 0xC3, 0xFD, 0x10, 0xF7, 0x02, 0x01, 0x0D, 0xFF, 0xF2, 0x05, + 0x67, 0xFC, 0x15, 0x01, 0x47, 0xF9, 0x24, 0x00, 0xAE, 0x01, 0xCB, 0xF8, + 0x96, 0x02, 0x32, 0xF5, 0xC7, 0xF2, 0x00, 0x06, 0x15, 0xF1, 0x78, 0x0C, + 0xD2, 0xFD, 0x81, 0x08, 0xE1, 0x0C, 0xA0, 0x0D, 0x3F, 0x18, 0x1C, 0x14, + 0xB7, 0x0B, 0xA5, 0x0F, 0x12, 0xFB, 0x40, 0x08, 0x1C, 0xFD, 0xE8, 0x0C, + 0x86, 0x05, 0x71, 0x0A, 0xB4, 0x0A, 0x6D, 0x01, 0xDB, 0xFC, 0x30, 0xFB, + 0xE1, 0xED, 0xAC, 0xF4, 0x98, 0xEE, 0xD7, 0xF1, 0x6C, 0xF7, 0x8C, 0xF4, + 0x0A, 0xFC, 0x94, 0xF7, 0x0E, 0xF0, 0x54, 0xED, 0x8E, 0xDE, 0xDD, 0xE1, + 0xA1, 0xDA, 0x62, 0xEB, 0x94, 0xEB, 0x76, 0xF1, 0xB0, 0xFD, 0xCE, 0xEB, + 0x66, 0x08, 0x56, 0xF9, 0xDE, 0x0A, 0x38, 0x00, 0xC7, 0xFA, 0xDE, 0xFD, + 0x95, 0xED, 0xF3, 0x01, 0x2C, 0xF7, 0x95, 0x00, 0x44, 0xFB, 0xA0, 0xF7, + 0x11, 0xEB, 0x30, 0xF0, 0xDC, 0xDD, 0xB8, 0xEF, 0x1F, 0xDD, 0x20, 0xEB, + 0x1B, 0xE0, 0x4D, 0xDE, 0x2A, 0xF3, 0x08, 0xE2, 0x53, 0x07, 0xFF, 0xF1, + 0x25, 0x00, 0x1E, 0xEC, 0x2F, 0xF3, 0x0B, 0xEA, 0xFB, 0xE6, 0x63, 0xF0, + 0xCC, 0xDC, 0xAD, 0xE9, 0xAC, 0xDA, 0x24, 0xE6, 0x09, 0xE7, 0xC8, 0xEE, + 0x63, 0xFF, 0x1D, 0xF5, 0x82, 0x06, 0x1A, 0xF4, 0x54, 0xFF, 0x21, 0xF1, + 0xBA, 0xF7, 0xAD, 0xF7, 0xE5, 0xEF, 0x2B, 0x01, 0x8C, 0xF8, 0x92, 0xFE, + 0xD7, 0x0D, 0x01, 0xFB, 0x11, 0x10, 0x57, 0xF3, 0x38, 0xFF, 0x37, 0xF0, + 0x94, 0x02, 0x1D, 0x00, 0x3D, 0x0C, 0xFF, 0x0A, 0x85, 0x06, 0x4B, 0x11, + 0x7A, 0x0A, 0xDC, 0x19, 0x11, 0x08, 0x95, 0x0F, 0x6E, 0xFD, 0x6E, 0x01, + 0x86, 0xFF, 0x9D, 0xF7, 0xE0, 0x01, 0xFA, 0xEE, 0x2A, 0x00, 0x85, 0xEF, + 0xB1, 0x04, 0x94, 0xFD, 0xEF, 0x03, 0x29, 0x0F, 0xBC, 0xFB, 0x97, 0x1A, + 0x0F, 0xF2, 0xD0, 0x22, 0xC7, 0xFA, 0xFD, 0x1C, 0xA8, 0x14, 0xEC, 0x0D, + 0x44, 0x1E, 0x6C, 0xFE, 0xA3, 0x08, 0xD6, 0xFA, 0x5C, 0xF1, 0x9B, 0x00, + 0x8A, 0xF4, 0x51, 0xFC, 0x37, 0x02, 0x55, 0xFE, 0xA5, 0x13, 0xE7, 0x09, + 0xA4, 0x15, 0x6D, 0x06, 0xB9, 0x0B, 0x11, 0xFE, 0xA4, 0x08, 0x08, 0xF3, + 0xBC, 0xFD, 0xDA, 0xE4, 0xF9, 0xF4, 0x97, 0xF2, 0xBF, 0xFC, 0x71, 0x06, + 0xDD, 0x10, 0x1F, 0x0B, 0x6E, 0x1C, 0xCD, 0x17, 0xD2, 0x12, 0xEF, 0x2B, + 0xBB, 0x01, 0x48, 0x35, 0x99, 0xF8, 0x9F, 0x30, 0x70, 0x02, 0xEB, 0x1A, + 0x5F, 0x0F, 0x6F, 0x07, 0xBE, 0x0F, 0xC8, 0x01, 0x46, 0x14, 0x8D, 0xFE, + 0xC7, 0x13, 0xCD, 0x02, 0x1A, 0x0D, 0xD1, 0x09, 0xBA, 0x0A, 0xC4, 0x11, + 0xAD, 0x02, 0x2B, 0x1A, 0xEB, 0x0C, 0x9F, 0x10, 0xA0, 0x1D, 0x1D, 0xFB, + 0xE7, 0x15, 0x33, 0xFD, 0x9D, 0x0C, 0xF0, 0xFC, 0xEA, 0x08, 0x53, 0xED, + 0x52, 0x0B, 0x81, 0xF4, 0x36, 0x0E, 0x8A, 0x00, 0x48, 0xFE, 0x16, 0x0D, + 0x4C, 0xF1, 0x95, 0x18, 0x40, 0xF8, 0x10, 0x09, 0x3D, 0x05, 0x1D, 0xF7, + 0x43, 0x10, 0xAF, 0xF2, 0x74, 0x11, 0x66, 0xEC, 0x96, 0x07, 0x83, 0xF1, + 0x47, 0xFE, 0x75, 0xF4, 0x13, 0xF9, 0xB1, 0xF9, 0xB7, 0xFB, 0xA8, 0x13, + 0x29, 0xFD, 0xFE, 0x11, 0xA2, 0x07, 0xF4, 0xFB, 0x70, 0x0E, 0xF1, 0xF2, + 0x85, 0x04, 0x98, 0xE3, 0x58, 0xFB, 0xA9, 0xD7, 0xAD, 0xED, 0x3D, 0xD9, + 0xF3, 0xDF, 0xAD, 0xE4, 0x15, 0xD2, 0xEA, 0xEC, 0x0B, 0xD2, 0x83, 0xEE, + 0x03, 0xD6, 0x29, 0xEF, 0x72, 0xD5, 0x98, 0xF3, 0x1D, 0xE0, 0x74, 0xF2, + 0x06, 0xEB, 0xD9, 0xF0, 0xCD, 0xE4, 0x92, 0xEA, 0x49, 0xEC, 0xA0, 0xE2, + 0x8D, 0xFE, 0x87, 0xEE, 0x2A, 0xF3, 0x57, 0xF9, 0x16, 0xE9, 0x31, 0xF8, + 0x2E, 0xF6, 0x60, 0xF1, 0x02, 0xF7, 0x88, 0xEE, 0xC3, 0xE4, 0x36, 0xE8, + 0x97, 0xE5, 0x24, 0xE1, 0xD2, 0xDB, 0xAB, 0xD5, 0x72, 0xCB, 0x76, 0xD6, + 0x00, 0xD2, 0xAE, 0xEE, 0xAD, 0xD6, 0x21, 0x01, 0xDE, 0xD5, 0x05, 0xFF, + 0x69, 0xDE, 0x5B, 0xFE, 0x35, 0xF5, 0x94, 0x04, 0x1D, 0x08, 0x8F, 0x03, + 0xDE, 0xFD, 0x4B, 0xFE, 0x78, 0xF0, 0xCE, 0xF3, 0x4C, 0xE9, 0x29, 0xEB, + 0xD1, 0xD9, 0x21, 0xE9, 0xD3, 0xE2, 0x08, 0xE6, 0x73, 0xF2, 0x4F, 0xDE, + 0xBD, 0xEB, 0x46, 0xDC, 0xF9, 0xF6, 0x77, 0xEB, 0x8D, 0x04, 0xBA, 0xE8, + 0x9B, 0xF2, 0xAA, 0xD1, 0x74, 0xDF, 0x54, 0xD2, 0xD6, 0xD8, 0x10, 0xDD, + 0x08, 0xD9, 0x7A, 0xDB, 0xB4, 0xEA, 0xB7, 0xDE, 0x4B, 0x06, 0xF8, 0xE0, + 0xF2, 0x0A, 0x52, 0xDC, 0x81, 0x03, 0x24, 0xE4, 0x74, 0xF4, 0x02, 0xE3, + 0x2C, 0xEA, 0xE3, 0xD4, 0x40, 0xEB, 0xF9, 0xCD, 0x91, 0xEF, 0x28, 0xD2, + 0x4A, 0xF1, 0x2C, 0xDD, 0x73, 0xE8, 0x43, 0xE0, 0xE0, 0xE0, 0xB6, 0xDE, + 0xC7, 0xEB, 0x0B, 0xF1, 0xBF, 0xF9, 0x3F, 0x01, 0x7C, 0xFD, 0x4F, 0xF0, + 0xF8, 0xF9, 0x0A, 0xE4, 0xED, 0xE6, 0x65, 0xEA, 0x9A, 0xD7, 0x49, 0xEC, + 0x98, 0xD7, 0xBB, 0xEE, 0xAE, 0xE0, 0xD8, 0xF5, 0x74, 0xEA, 0x99, 0x01, + 0xAD, 0xFD, 0xBB, 0x11, 0x0C, 0x13, 0x0B, 0x17, 0xBB, 0x08, 0x09, 0x16, + 0xC2, 0xEF, 0x2E, 0x15, 0xF1, 0xE8, 0xCD, 0x12, 0x73, 0xEE, 0x30, 0x12, + 0x96, 0xF6, 0xDB, 0x08, 0xFC, 0xF7, 0x88, 0xFC, 0x70, 0x02, 0x1E, 0x07, + 0x02, 0x16, 0xC6, 0x15, 0x60, 0x21, 0xA1, 0x17, 0xB9, 0x2D, 0xDE, 0x12, + 0x74, 0x28, 0x71, 0x07, 0xA4, 0x14, 0x67, 0x05, 0x7C, 0x09, 0x77, 0x08, + 0xF1, 0x05, 0xCE, 0x05, 0x92, 0xFF, 0xC5, 0x0A, 0x1D, 0x0E, 0x3F, 0x1E, + 0xF5, 0x33, 0xE6, 0x2E, 0xC2, 0x39, 0xE5, 0x32, 0x20, 0x1C, 0xDA, 0x29, + 0x84, 0x0D, 0xAA, 0x25, 0xA4, 0x07, 0xFF, 0x1B, 0x55, 0x10, 0x79, 0x0A, + 0x01, 0x1F, 0x13, 0xFE, 0xCD, 0x08, 0x82, 0xF7, 0x81, 0xF8, 0x78, 0x02, + 0x36, 0xFC, 0x9A, 0x0F, 0x7B, 0x05, 0xFA, 0x12, 0x6E, 0x0C, 0xC5, 0x0E, + 0x0D, 0x09, 0xC8, 0x07, 0xC9, 0x0B, 0xD5, 0xFF, 0x62, 0x0E, 0x10, 0xFD, + 0xC5, 0x01, 0x49, 0x02, 0x01, 0x02, 0x59, 0x0D, 0xE2, 0x06, 0x17, 0x14, + 0x2B, 0x05, 0xA8, 0x13, 0x25, 0x12, 0x06, 0x19, 0xE7, 0x0F, 0x07, 0x16, + 0xEC, 0xFA, 0xE7, 0x03, 0xF8, 0xF7, 0xFB, 0xFD, 0x41, 0x06, 0x19, 0x03, + 0xDE, 0x0B, 0x46, 0xFE, 0x63, 0x14, 0x13, 0x08, 0x3D, 0x19, 0x72, 0x17, + 0xF7, 0x11, 0x1C, 0x13, 0xA4, 0x0C, 0x0C, 0x0E, 0x95, 0x09, 0x01, 0x15, + 0xD6, 0x13, 0x62, 0x0E, 0x5B, 0x21, 0x35, 0xFD, 0x61, 0x24, 0x11, 0x01, + 0xC4, 0x22, 0x16, 0x0E, 0x46, 0x23, 0x6C, 0x20, 0xCC, 0x1E, 0x6C, 0x26, + 0x8D, 0x22, 0x09, 0x21, 0x7A, 0x26, 0xE2, 0x27, 0x3E, 0x15, 0x4B, 0x2E, + 0x0B, 0x0C, 0x30, 0x2D, 0x30, 0x15, 0x3C, 0x24, 0xC4, 0x1A, 0x91, 0x09, + 0x1A, 0x20, 0x17, 0xF8, 0xAD, 0x25, 0x30, 0xFF, 0x4D, 0x25, 0xCD, 0x09, + 0xD3, 0x1D, 0xAC, 0x13, 0x8C, 0x13, 0x89, 0x18, 0x2D, 0x08, 0x3F, 0x10, + 0x16, 0xFD, 0xF4, 0x06, 0x97, 0xF6, 0x63, 0xF6, 0x4A, 0x01, 0xB1, 0xED, + 0x13, 0x11, 0x98, 0xF9, 0x3E, 0xFD, 0xF2, 0x01, 0xA4, 0xF0, 0x13, 0x0A, + 0x6D, 0x01, 0x00, 0x15, 0xA0, 0xF3, 0x12, 0x0F, 0xD6, 0xE8, 0x4B, 0x07, + 0xFF, 0xF9, 0x24, 0x07, 0x60, 0xFD, 0xD6, 0xF6, 0x0D, 0xFF, 0x84, 0xF2, + 0x2C, 0xFC, 0xBB, 0xF4, 0xBB, 0xF2, 0x65, 0xE7, 0x12, 0xEB, 0xFB, 0xE9, + 0x60, 0xEB, 0xE9, 0xF5, 0xE6, 0xE9, 0x16, 0xF6, 0x15, 0xE2, 0x92, 0xFA, + 0x71, 0xDE, 0xEE, 0xF8, 0xBE, 0xDA, 0xEE, 0xE1, 0x18, 0xE3, 0xC2, 0xDC, + 0xE5, 0xE8, 0x56, 0xE9, 0x67, 0xE1, 0x21, 0xED, 0x6E, 0xEE, 0xEB, 0xFC, + 0xE0, 0xFF, 0xCA, 0x10, 0x06, 0x0A, 0x8D, 0x1F, 0x22, 0x0E, 0xA9, 0x23, + 0x1F, 0x04, 0x42, 0x17, 0x77, 0x09, 0x95, 0x0F, 0x65, 0x0F, 0x25, 0x0A, + 0xDE, 0x04, 0x3D, 0x06, 0x6E, 0xF7, 0xA8, 0x07, 0xC0, 0xEF, 0x40, 0x0C, + 0xC5, 0xE8, 0x52, 0x06, 0xFB, 0xE8, 0x2C, 0xFA, 0xAB, 0xF6, 0x06, 0xF9, + 0x3F, 0xFF, 0xF8, 0xF1, 0xCF, 0x07, 0xD9, 0xE6, 0xAE, 0x0B, 0xF7, 0xE0, + 0x95, 0xFB, 0x43, 0xE1, 0x52, 0xF4, 0x61, 0xEF, 0xB9, 0xF6, 0x0F, 0x02, + 0x60, 0xED, 0xD7, 0x14, 0x59, 0xF9, 0xE8, 0x1D, 0xF2, 0x06, 0x37, 0x0E, + 0x4B, 0x0C, 0x88, 0x01, 0xB3, 0x11, 0xB6, 0xFE, 0xEA, 0xFB, 0x4E, 0xEF, + 0x5E, 0xEF, 0x1C, 0xE4, 0x19, 0xFE, 0x57, 0xED, 0x09, 0x08, 0x46, 0xFC, + 0x0F, 0x09, 0x75, 0x02, 0x02, 0x07, 0x9E, 0x03, 0xA7, 0x04, 0xA7, 0x01, + 0x50, 0x0C, 0x14, 0xFF, 0xC9, 0x18, 0xD0, 0xF7, 0x6B, 0x12, 0x43, 0xEF, + 0xDC, 0xF9, 0xE9, 0xF2, 0xAA, 0xE4, 0x8F, 0xF7, 0x96, 0xE3, 0xCB, 0xFF, + 0xC5, 0xF6, 0xC0, 0x0E, 0x71, 0xFF, 0xDE, 0x15, 0x3D, 0x06, 0x7B, 0x0B, + 0x1A, 0x26, 0x20, 0x09, 0x73, 0x2C, 0xCF, 0x0D, 0xC2, 0x07, 0x8A, 0xFE, + 0x89, 0xFF, 0xF7, 0x03, 0x44, 0x0F, 0xBF, 0x1C, 0x08, 0x11, 0x77, 0x20, + 0x19, 0x20, 0xD4, 0x24, 0x70, 0x1F, 0x1B, 0x24, 0xCC, 0x0D, 0xDA, 0x11, + 0x50, 0x16, 0xA3, 0x0E, 0xFF, 0x1C, 0x7C, 0x0F, 0x54, 0x0A, 0x33, 0x05, + 0x0B, 0xFB, 0x4B, 0x08, 0x72, 0xF4, 0xE0, 0x04, 0x23, 0xEF, 0x95, 0x05, + 0x49, 0xEA, 0x1D, 0x11, 0x10, 0xEC, 0x33, 0x0A, 0x74, 0x07, 0xC4, 0x08, + 0x17, 0x2F, 0x7A, 0x17, 0xB2, 0x2D, 0xA1, 0x13, 0x0C, 0x15, 0xDD, 0x0F, + 0xCA, 0x03, 0xB6, 0x13, 0x8F, 0xF9, 0x13, 0x09, 0x7E, 0x04, 0x68, 0x06, + 0x78, 0x04, 0xDD, 0x07, 0x8B, 0xF6, 0x20, 0xFC, 0xF6, 0xF0, 0xBB, 0xF6, + 0x42, 0xED, 0xD8, 0xE9, 0x1F, 0xF2, 0x35, 0xDC, 0x29, 0x03, 0xFC, 0xE1, + 0xA5, 0xFC, 0x6D, 0xDA, 0x29, 0xF4, 0x52, 0xE5, 0xF3, 0xF9, 0x75, 0x05, + 0x5C, 0xF4, 0xE9, 0x0F, 0x77, 0xF3, 0x3C, 0x15, 0x19, 0xFD, 0xC9, 0x0D, + 0x2B, 0x0A, 0x2D, 0xF4, 0x85, 0x15, 0x71, 0xEC, 0x97, 0x08, 0xA5, 0xEE, + 0xB8, 0xEB, 0xC9, 0xEF, 0x90, 0xE1, 0xD6, 0xFC, 0xFA, 0xE8, 0xDF, 0x01, + 0x58, 0xEC, 0x3E, 0xF0, 0x4B, 0xF7, 0xDF, 0xEB, 0x29, 0x07, 0x96, 0xEF, + 0xCB, 0xF8, 0x8E, 0xE6, 0xB2, 0xF0, 0x32, 0xED, 0x05, 0xF0, 0x61, 0xEF, + 0x00, 0xDD, 0x27, 0xE6, 0xCD, 0xDA, 0xF9, 0xED, 0xAA, 0xE0, 0xBE, 0xF9, + 0xC4, 0xD3, 0xA0, 0x00, 0xA3, 0xD4, 0x09, 0x0A, 0x18, 0xF2, 0x15, 0x08, + 0x09, 0x02, 0xFF, 0xF9, 0xB8, 0xEE, 0x91, 0xE6, 0x99, 0xE1, 0x0A, 0xE0, + 0xC8, 0xE2, 0x82, 0xF5, 0x28, 0xE5, 0x08, 0x04, 0x00, 0xFC, 0xF9, 0x04, + 0x09, 0x0E, 0xD0, 0x05, 0x70, 0x11, 0xE7, 0x05, 0x79, 0xFC, 0xE8, 0x01, + 0x20, 0xF5, 0xD8, 0x04, 0x9A, 0x0B, 0x42, 0x08, 0x60, 0x08, 0x6B, 0xFB, + 0x7C, 0x12, 0xFB, 0xF2, 0xD6, 0x2D, 0x02, 0xF3, 0xB1, 0x28, 0x8E, 0xF3, + 0x7B, 0x1C, 0x21, 0xFF, 0x7D, 0x1E, 0x9F, 0x0B, 0x86, 0x1A, 0x8D, 0x10, + 0xC8, 0x13, 0xB4, 0x10, 0x0F, 0x15, 0x02, 0x0A, 0x51, 0x17, 0xD3, 0x0B, + 0x81, 0x1B, 0x9D, 0x0E, 0x49, 0x1D, 0xDA, 0x0A, 0xAE, 0x13, 0x90, 0x11, + 0x8D, 0x12, 0x58, 0x16, 0x73, 0x1A, 0x63, 0x16, 0x77, 0x1A, 0x89, 0x1B, + 0x77, 0x1F, 0xD9, 0x1A, 0x36, 0x17, 0x73, 0x0C, 0x46, 0x05, 0x58, 0xF7, + 0x2F, 0x0D, 0xF8, 0xF5, 0x91, 0x0E, 0xA7, 0xFB, 0x5B, 0x0D, 0x7A, 0x06, + 0x95, 0x22, 0x3F, 0x23, 0x52, 0x1C, 0x72, 0x26, 0x44, 0x15, 0xE7, 0x24, + 0x71, 0x19, 0x1E, 0x2B, 0x11, 0x08, 0x73, 0x23, 0x20, 0xF8, 0xCD, 0x14, + 0xD0, 0xFA, 0xED, 0x0C, 0x48, 0xF3, 0x85, 0x04, 0x37, 0xEA, 0xB0, 0xF7, + 0x23, 0xFD, 0xF6, 0xFC, 0x25, 0x10, 0xE4, 0x09, 0xA9, 0x19, 0x7D, 0x10, + 0x97, 0x23, 0xB6, 0x1F, 0x22, 0x22, 0xBA, 0x29, 0xF2, 0x19, 0x42, 0x22, + 0xF1, 0x17, 0x54, 0x1D, 0x53, 0x1A, 0x00, 0x24, 0x51, 0x24, 0x71, 0x29, + 0x15, 0x18, 0xE3, 0x1C, 0x46, 0x0E, 0xEB, 0x1C, 0x41, 0x17, 0x4C, 0x2D, + 0x64, 0x0D, 0x73, 0x28, 0xE5, 0x0C, 0xC4, 0x17, 0xF2, 0x1A, 0x93, 0x11, + 0xCA, 0x16, 0x51, 0x11, 0xD5, 0x07, 0xC7, 0x13, 0x14, 0x07, 0xC2, 0x1A, + 0x5A, 0x15, 0xD6, 0x28, 0xE6, 0x19, 0xD9, 0x2C, 0xA9, 0x30, 0x47, 0x2E, + 0x9C, 0x3A, 0x79, 0x2F, 0x24, 0x1D, 0x4A, 0x1D, 0x5F, 0x05, 0x95, 0x02, + 0x66, 0xFA, 0x6D, 0xF1, 0xCC, 0x01, 0xE1, 0xEA, 0x04, 0xFA, 0x54, 0xDF, + 0x8B, 0xE2, 0xCA, 0xD7, 0x08, 0xE6, 0xF2, 0xE8, 0xF8, 0xF5, 0x22, 0xF6, + 0xE3, 0xF6, 0xC9, 0xEA, 0xD8, 0xF5, 0xE4, 0xDF, 0xFF, 0xF1, 0x67, 0xD8, + 0x0E, 0xE2, 0x89, 0xCA, 0x42, 0xE0, 0x25, 0xCC, 0xE7, 0xD4, 0x7C, 0xCF, + 0xDD, 0xBB, 0x23, 0xC4, 0x4C, 0xCA, 0xB0, 0xC2, 0x15, 0xE0, 0x4F, 0xCC, + 0x0C, 0xDB, 0xCD, 0xCB, 0x07, 0xD3, 0x50, 0xC0, 0xB1, 0xB7, 0xFA, 0xB5, + 0xD8, 0xAA, 0x81, 0xBA, 0x7C, 0xBA, 0x43, 0xC3, 0x40, 0xBA, 0x96, 0xC8, + 0x88, 0xC1, 0x63, 0xD1, 0x9D, 0xD3, 0x63, 0xD9, 0x1F, 0xDA, 0xEF, 0xE5, + 0x25, 0xDF, 0x26, 0xF7, 0x79, 0xDC, 0x51, 0xFB, 0xCB, 0xD3, 0xFC, 0xEC, + 0xB5, 0xE2, 0x0A, 0xE5, 0x39, 0xEC, 0xB1, 0xEA, 0x47, 0xCE, 0x3D, 0xE8, + 0xB9, 0xC5, 0x81, 0xE5, 0xFB, 0xD6, 0x58, 0xEA, 0x98, 0xDE, 0x57, 0xE5, + 0x76, 0xF7, 0x97, 0xE7, 0xC6, 0xF8, 0x0F, 0xEC, 0x8B, 0xDB, 0xCD, 0xDB, + 0x78, 0xE0, 0x58, 0xD0, 0x3F, 0xF7, 0xBE, 0xDC, 0xE9, 0xF5, 0x55, 0xE0, + 0xE9, 0xF6, 0x94, 0xDE, 0xCA, 0x01, 0x07, 0xED, 0x22, 0x01, 0xE6, 0xF4, + 0x88, 0xFB, 0xC1, 0xFB, 0x13, 0xF8, 0x59, 0x04, 0x41, 0x03, 0x63, 0xF5, + 0xB3, 0x0B, 0x05, 0xE1, 0xD5, 0xFF, 0x9C, 0xD9, 0xF8, 0xF1, 0x4D, 0xD9, + 0x91, 0xDA, 0xB7, 0xDC, 0x27, 0xD0, 0x90, 0xDD, 0x82, 0xEB, 0x64, 0xE2, + 0xED, 0xF4, 0x7C, 0xE4, 0x3F, 0xE1, 0x37, 0xD8, 0x32, 0xEB, 0xD0, 0xD2, + 0x25, 0xF6, 0xA6, 0xDC, 0xB1, 0xD9, 0x3E, 0xDD, 0x22, 0xCA, 0x26, 0xDC, + 0xB2, 0xD3, 0x93, 0xE4, 0x22, 0xDA, 0x9E, 0xED, 0x63, 0xE2, 0xB6, 0xFE, + 0xC0, 0xE2, 0x0B, 0x0E, 0x58, 0xDA, 0xE5, 0x07, 0x74, 0xE7, 0x2E, 0xF7, + 0xEB, 0xEF, 0xD9, 0xE2, 0xEE, 0xE7, 0xDF, 0xD4, 0x7B, 0xE2, 0xEC, 0xE2, + 0x74, 0xDE, 0x00, 0xF7, 0xFE, 0xEB, 0xEA, 0xFB, 0xA5, 0xF8, 0x2B, 0xFF, + 0xD1, 0xF2, 0xCD, 0xF8, 0xBC, 0xF0, 0xF3, 0xF2, 0xCC, 0xF2, 0xED, 0xF6, + 0x81, 0xEA, 0x85, 0xF7, 0x13, 0xEC, 0x94, 0xFB, 0x29, 0xF8, 0x26, 0xFD, + 0x3E, 0xFE, 0xBB, 0xF9, 0x0F, 0x16, 0x8D, 0x0E, 0xAC, 0x19, 0xE8, 0x23, + 0xBA, 0xF7, 0x87, 0x22, 0xE5, 0xF6, 0xA3, 0x2A, 0x88, 0x0D, 0x02, 0x2F, + 0x41, 0x0C, 0x91, 0x14, 0x13, 0x19, 0xDC, 0xFC, 0xAB, 0x1F, 0x6E, 0xF2, + 0xD9, 0x19, 0xD0, 0xEF, 0x89, 0x20, 0x06, 0xF9, 0x64, 0x17, 0xCD, 0x00, + 0x00, 0x0D, 0xB8, 0xFD, 0xF8, 0x13, 0x9C, 0xF5, 0x48, 0x14, 0xF2, 0xF0, + 0xE2, 0x09, 0xBB, 0xEA, 0xD5, 0x07, 0x9D, 0xE9, 0x03, 0x04, 0x62, 0xEC, + 0x27, 0xFD, 0x1D, 0xEF, 0x04, 0x08, 0x20, 0x01, 0xA0, 0x0E, 0x86, 0x14, + 0x66, 0x0C, 0xDB, 0x1F, 0xB6, 0x12, 0xA6, 0x2C, 0xC2, 0x11, 0xEE, 0x2D, + 0x35, 0x13, 0xE4, 0x1B, 0x0F, 0x0B, 0x2A, 0x03, 0xF8, 0x08, 0x12, 0x00, + 0xAB, 0x22, 0x2F, 0x10, 0x60, 0x20, 0x9B, 0x14, 0xE2, 0x0A, 0x81, 0x13, + 0xB6, 0x0D, 0x5A, 0x13, 0x4C, 0x0C, 0x2C, 0x15, 0x05, 0x0E, 0x12, 0x1B, + 0xC4, 0x18, 0x16, 0x16, 0x30, 0x0A, 0xA9, 0x06, 0xA7, 0x01, 0xC5, 0xFD, + 0xF8, 0x10, 0xC9, 0x0C, 0x57, 0x18, 0xCE, 0x1B, 0x51, 0x15, 0x8A, 0x18, + 0x92, 0x17, 0x29, 0x1F, 0x6E, 0x29, 0xE0, 0x38, 0x08, 0x38, 0x37, 0x46, + 0x40, 0x30, 0x2C, 0x39, 0xBC, 0x21, 0xB5, 0x26, 0xE2, 0x26, 0xBE, 0x1E, + 0x0B, 0x2C, 0x35, 0x27, 0xE4, 0x1D, 0x34, 0x35, 0x59, 0x18, 0x91, 0x38, + 0xBB, 0x1A, 0xFD, 0x37, 0xF4, 0x27, 0x6A, 0x36, 0xFA, 0x3C, 0x93, 0x30, + 0x7B, 0x2C, 0xF5, 0x1D, 0xE4, 0x07, 0x36, 0x02, 0xE6, 0xFC, 0x75, 0x02, + 0xAD, 0x05, 0xF0, 0x13, 0xC6, 0x0A, 0x40, 0x13, 0xAD, 0x10, 0xE2, 0x19, + 0xAF, 0x19, 0x39, 0x2B, 0xC1, 0x18, 0x16, 0x27, 0xDA, 0x19, 0xBF, 0x28, + 0x5F, 0x1A, 0xBD, 0x2B, 0x85, 0x10, 0xBE, 0x15, 0x62, 0x19, 0x2F, 0x10, + 0x33, 0x1B, 0xC1, 0x14, 0x81, 0x0A, 0x3E, 0x08, 0x22, 0x04, 0xE8, 0x06, + 0xF0, 0x07, 0xD5, 0x0F, 0xF7, 0x12, 0xA6, 0x0C, 0x9B, 0x1C, 0x22, 0xFC, + 0xE3, 0x17, 0xCC, 0xE7, 0x58, 0x01, 0x5D, 0xDF, 0x54, 0xF6, 0x0B, 0xDF, + 0x08, 0xFE, 0xFF, 0xE5, 0x02, 0xFF, 0x60, 0xF2, 0x83, 0xFE, 0x80, 0xF7, + 0xDB, 0x0A, 0x6A, 0xFB, 0x6C, 0x13, 0xFB, 0x05, 0xF7, 0x09, 0x1F, 0x0B, + 0xA9, 0xFC, 0x62, 0x0A, 0xA2, 0xF8, 0xE5, 0x09, 0x9E, 0xF1, 0x1E, 0xF9, + 0xC4, 0xEE, 0x17, 0xE4, 0xFA, 0xF0, 0xE0, 0xE6, 0x0D, 0xDB, 0x97, 0xED, + 0x88, 0xCA, 0x61, 0xE9, 0xB6, 0xE9, 0xF3, 0xE6, 0x5C, 0xFA, 0xE5, 0xD5, + 0x65, 0xED, 0x5E, 0xCF, 0xDC, 0xF1, 0x1D, 0xDD, 0x23, 0xE9, 0x49, 0xDD, + 0x89, 0xD2, 0xCB, 0xD9, 0x65, 0xCD, 0x73, 0xDA, 0xB3, 0xD1, 0xC6, 0xD7, + 0x6C, 0xDF, 0x44, 0xE3, 0x57, 0xEB, 0xCF, 0xEC, 0xCD, 0xE1, 0x8D, 0xED, + 0xC8, 0xCB, 0xCA, 0xF0, 0xF1, 0xC7, 0xFE, 0xEB, 0x91, 0xDF, 0x6D, 0xE4, + 0xCE, 0xF3, 0x66, 0xDD, 0xE4, 0xEF, 0x55, 0xE2, 0xEE, 0xDD, 0x76, 0xF2, + 0x4A, 0xEB, 0x6B, 0x06, 0x66, 0x09, 0x10, 0x18, 0xD8, 0x1E, 0x1F, 0x1F, + 0x82, 0x27, 0x82, 0x0F, 0xCC, 0x1F, 0x8F, 0xFE, 0x2C, 0x17, 0x50, 0x02, + 0x26, 0x00, 0xB6, 0xFF, 0x25, 0xEB, 0x63, 0xFD, 0xA3, 0xF0, 0x54, 0x08, + 0xFE, 0xFE, 0x38, 0x09, 0x11, 0x05, 0x8A, 0x03, 0x1D, 0x03, 0x44, 0x0B, + 0x54, 0x04, 0xEB, 0x16, 0x07, 0x0D, 0xFB, 0x16, 0xF9, 0x1D, 0x24, 0x10, + 0xCD, 0x2A, 0xD3, 0x10, 0x7E, 0x26, 0xCE, 0x1E, 0x23, 0x1B, 0xC1, 0x2C, + 0x22, 0x14, 0xDB, 0x2D, 0x88, 0x18, 0x1B, 0x25, 0x28, 0x1B, 0x16, 0x0F, + 0x00, 0x14, 0xD3, 0xF9, 0x16, 0x07, 0x4B, 0xF5, 0xF8, 0xF8, 0x92, 0xF8, + 0xB5, 0xF1, 0x0E, 0xFF, 0xC8, 0xF2, 0xDC, 0x02, 0x0D, 0xF6, 0x24, 0x03, + 0xDB, 0xF5, 0xE6, 0x02, 0xB6, 0xF9, 0x46, 0x07, 0x55, 0xF8, 0xD9, 0x10, + 0xC5, 0xF2, 0xFE, 0x15, 0x3C, 0xF8, 0xB6, 0x13, 0xA6, 0xF9, 0x17, 0x05, + 0x85, 0xFC, 0x2D, 0xF2, 0x40, 0x02, 0x96, 0xEA, 0xCA, 0xFB, 0x25, 0xED, + 0xFC, 0xF5, 0xD7, 0xFA, 0x48, 0xEA, 0x8C, 0x06, 0x80, 0xE2, 0x76, 0x03, + 0x00, 0xF0, 0xE4, 0xF7, 0x71, 0xFA, 0x96, 0xEB, 0x38, 0x0A, 0xDF, 0xE8, + 0x1C, 0x15, 0x46, 0xE8, 0xD8, 0x0C, 0x5E, 0xE8, 0x49, 0x05, 0xF1, 0xEC, + 0x72, 0x05, 0xD6, 0xF3, 0x27, 0x07, 0x3C, 0xF8, 0x31, 0x07, 0x05, 0xF4, + 0x64, 0x06, 0xA9, 0xEB, 0x8E, 0x03, 0x06, 0xE8, 0x00, 0xFB, 0xE1, 0xE3, + 0x2F, 0xF6, 0x9D, 0xE2, 0x2D, 0xEF, 0x74, 0xE0, 0x30, 0xED, 0x7B, 0xDD, + 0xEA, 0xF1, 0x31, 0xEB, 0x5C, 0xEF, 0xFF, 0xF7, 0x81, 0xED, 0x01, 0xF2, + 0x26, 0xE1, 0xFF, 0xF0, 0xD0, 0xD2, 0x87, 0xF3, 0x0F, 0xD3, 0x71, 0xE8, + 0xCC, 0xC8, 0x8D, 0xD5, 0x86, 0xBF, 0x3B, 0xC6, 0x09, 0xCC, 0x65, 0xCA, + 0x64, 0xD0, 0xCB, 0xD4, 0x5A, 0xD2, 0xCF, 0xDA, 0xA5, 0xCE, 0xCD, 0xDA, + 0xB6, 0xCB, 0xFA, 0xD7, 0xC9, 0xC9, 0x40, 0xD5, 0x60, 0xCC, 0x7D, 0xE1, + 0x14, 0xD3, 0x44, 0xE6, 0x46, 0xC9, 0x6B, 0xD1, 0xD1, 0xCA, 0x58, 0xCF, + 0xBD, 0xDA, 0x84, 0xDD, 0x88, 0xEA, 0x4B, 0xE5, 0x0C, 0xE4, 0x05, 0xEB, + 0x26, 0xDD, 0xC5, 0xF3, 0xBD, 0xFA, 0x6E, 0xFB, 0xA0, 0xFF, 0xEE, 0xF4, + 0x4B, 0xF2, 0x5A, 0xF7, 0xDA, 0xFF, 0x08, 0x0F, 0xAD, 0x03, 0x0A, 0x18, + 0x78, 0x05, 0x5F, 0x16, 0x50, 0x1C, 0x6D, 0x27, 0x2D, 0x25, 0xBB, 0x32, + 0xC9, 0x0F, 0x86, 0x27, 0xA2, 0x09, 0x2F, 0x2B, 0x57, 0x1C, 0x09, 0x34, + 0x9E, 0x17, 0x63, 0x23, 0x5B, 0x13, 0x97, 0x21, 0x68, 0x2A, 0x84, 0x2E, + 0xC8, 0x35, 0xD1, 0x28, 0x91, 0x26, 0x6F, 0x28, 0x5E, 0x1E, 0x6B, 0x36, + 0xC8, 0x2D, 0x1A, 0x3E, 0x65, 0x3B, 0x8B, 0x3A, 0x5D, 0x3F, 0x34, 0x34, + 0x81, 0x44, 0x99, 0x32, 0xAC, 0x34, 0x38, 0x25, 0xC8, 0x20, 0x09, 0x1D, + 0x78, 0x2E, 0x7A, 0x2D, 0x4B, 0x3D, 0x0E, 0x35, 0xC4, 0x35, 0x17, 0x29, + 0x68, 0x3F, 0x1D, 0x2C, 0xC8, 0x4A, 0x8A, 0x2B, 0x4F, 0x2A, 0xED, 0x11, + 0x86, 0x07, 0xDE, 0x08, 0xE0, 0x10, 0xFB, 0x08, 0x07, 0x2B, 0x90, 0x04, + 0xB5, 0x34, 0x8A, 0x0A, 0xC6, 0x33, 0xBB, 0x1B, 0x83, 0x24, 0x01, 0x23, + 0xAF, 0x18, 0xC2, 0x18, 0xCA, 0x21, 0x60, 0x11, 0x79, 0x31, 0x83, 0x0E, + 0x84, 0x26, 0xF0, 0x05, 0x67, 0x10, 0x89, 0x09, 0xF5, 0x13, 0xD0, 0x1A, + 0x51, 0x1D, 0xA9, 0x23, 0x5A, 0x10, 0x8F, 0x1A, 0x92, 0x10, 0xA2, 0x1F, + 0x77, 0x24, 0x63, 0x2C, 0x0C, 0x20, 0xCB, 0x29, 0x02, 0x12, 0x47, 0x37, + 0x22, 0x10, 0x01, 0x3D, 0xB5, 0x0B, 0x85, 0x2A, 0xF7, 0x0B, 0x46, 0x1E, + 0x5B, 0x1A, 0x47, 0x20, 0x10, 0x11, 0xA4, 0x22, 0xEC, 0xFE, 0x21, 0x28, + 0x71, 0x07, 0x53, 0x31, 0xC0, 0x10, 0x8D, 0x22, 0xE8, 0x0A, 0x50, 0x02, + 0xF3, 0x10, 0x01, 0xFD, 0xA7, 0x10, 0xD3, 0xFC, 0x03, 0x05, 0x0B, 0xF7, + 0xC2, 0xF9, 0x7D, 0x07, 0x53, 0xEC, 0x5A, 0x14, 0x17, 0xEE, 0xE6, 0x0B, + 0xB7, 0xF6, 0x58, 0xF9, 0xC2, 0x06, 0xDA, 0xF0, 0xD1, 0x09, 0xA7, 0xE9, + 0x0B, 0xFC, 0x2D, 0xE7, 0xEE, 0xEE, 0xE5, 0xEB, 0x84, 0xE8, 0x17, 0xDE, + 0x24, 0xE7, 0x32, 0xCE, 0x4B, 0xD9, 0x6E, 0xCE, 0x28, 0xD2, 0x3B, 0xD5, + 0xB6, 0xD8, 0xF7, 0xD1, 0x92, 0xD8, 0x41, 0xC1, 0x14, 0xDD, 0x4D, 0xB5, + 0xB5, 0xDF, 0x61, 0xB9, 0x7B, 0xD3, 0x56, 0xC8, 0xAD, 0xCC, 0xDB, 0xDE, + 0x05, 0xCE, 0x8E, 0xEC, 0x85, 0xD6, 0xEF, 0xEC, 0xA7, 0xE2, 0xCE, 0xEF, + 0x75, 0xF1, 0x9D, 0xF7, 0x7D, 0xF8, 0xB5, 0xF6, 0x55, 0xDC, 0xDF, 0xE2, + 0x61, 0xC3, 0x90, 0xD9, 0xDE, 0xD3, 0x88, 0xE2, 0xD9, 0xE1, 0x1F, 0xDD, + 0x84, 0xE2, 0x70, 0xD7, 0x58, 0xE5, 0x15, 0xE2, 0x99, 0xE3, 0x23, 0xEB, + 0xC7, 0xDA, 0x40, 0xF3, 0x85, 0xE0, 0xBC, 0xFB, 0x88, 0xE3, 0xFE, 0xE6, + 0x21, 0xD7, 0x97, 0xCD, 0xC8, 0xEE, 0x24, 0xDA, 0x7F, 0x0D, 0x96, 0xEA, + 0x79, 0x05, 0x1D, 0xF2, 0x96, 0x00, 0x21, 0x08, 0x79, 0x00, 0xEE, 0x14, + 0x8F, 0xF9, 0x6B, 0x0B, 0x43, 0x03, 0xD1, 0x04, 0x39, 0x02, 0x54, 0xFC, + 0x5A, 0x00, 0x3F, 0xF2, 0x50, 0x0B, 0x26, 0xF0, 0x40, 0x0F, 0xF4, 0xF5, + 0xA9, 0xFF, 0x59, 0xE9, 0xCA, 0xEF, 0x41, 0xDB, 0xFF, 0xF7, 0x2A, 0xEA, + 0x8D, 0x01, 0x05, 0xED, 0xAE, 0x00, 0x88, 0xDB, 0x7C, 0xFB, 0xB8, 0xDC, + 0x3D, 0xF5, 0x2D, 0xE3, 0x04, 0xFB, 0xE7, 0xDB, 0x0A, 0xF9, 0xE1, 0xE2, + 0xA4, 0xEC, 0xA8, 0xEC, 0x98, 0xE5, 0x9A, 0xE9, 0x10, 0xEC, 0x40, 0xFA, + 0x9E, 0x01, 0x36, 0x10, 0xBB, 0xF3, 0xBA, 0x06, 0xE9, 0xDB, 0xC2, 0xFA, + 0x81, 0xE0, 0x24, 0xFA, 0x34, 0xE1, 0x9A, 0xF3, 0x54, 0xE7, 0xCB, 0xEF, + 0xD4, 0xED, 0xB9, 0xEB, 0x35, 0xE4, 0x1F, 0xE8, 0x3C, 0xE9, 0x0C, 0xEE, + 0x41, 0xF2, 0x62, 0xF2, 0x8A, 0xE2, 0x28, 0xF9, 0x2A, 0xD7, 0xEF, 0xFE, + 0xC2, 0xE3, 0xF4, 0xF5, 0x3F, 0xED, 0xE7, 0xEC, 0x42, 0xEE, 0x67, 0xE7, + 0xD1, 0xF2, 0xC6, 0xED, 0xB9, 0xDF, 0xBC, 0xEF, 0x0E, 0xDB, 0xC1, 0xF2, + 0x69, 0xF5, 0xCF, 0x01, 0x50, 0xF4, 0xEC, 0xF7, 0xE3, 0xF1, 0xFF, 0xEF, + 0x6F, 0xF8, 0xE2, 0xF3, 0x6D, 0xF4, 0x5F, 0xED, 0xB4, 0xEB, 0x4E, 0xE0, + 0x32, 0xEA, 0xD5, 0xE8, 0xAF, 0xFF, 0x8A, 0xF6, 0x56, 0x0C, 0x70, 0xF0, + 0x8D, 0x08, 0x39, 0xF6, 0x02, 0x04, 0xF8, 0xF8, 0x01, 0xF1, 0xE3, 0xE6, + 0x67, 0xE4, 0xB9, 0xDF, 0x16, 0xF0, 0xF2, 0xEA, 0x52, 0xF8, 0x90, 0xEB, + 0x35, 0xE5, 0xEC, 0xE3, 0xDA, 0xE4, 0xD8, 0xEB, 0x7E, 0xFF, 0x34, 0xFE, + 0xF7, 0xFD, 0xC2, 0x0D, 0xEE, 0xF2, 0x34, 0x13, 0x4A, 0x07, 0x1B, 0x1B, + 0x1E, 0x14, 0x5A, 0x15, 0xB9, 0x17, 0x57, 0x0F, 0xE3, 0x16, 0xD5, 0x21, + 0x9F, 0x0C, 0x26, 0x27, 0x12, 0x08, 0x75, 0x18, 0x32, 0x17, 0x8E, 0x12, + 0xDD, 0x2F, 0xF6, 0x13, 0xEA, 0x1F, 0x4A, 0x0F, 0x4B, 0x03, 0x9C, 0x0F, + 0x81, 0x09, 0x0E, 0x15, 0xEF, 0x19, 0x9F, 0x0D, 0x93, 0x17, 0xCF, 0x04, + 0x9C, 0x18, 0x97, 0x09, 0x9E, 0x29, 0x2E, 0x13, 0x2E, 0x2F, 0x84, 0x1D, + 0x96, 0x27, 0xA8, 0x24, 0xDA, 0x33, 0x59, 0x2F, 0x64, 0x37, 0x59, 0x32, + 0x96, 0x29, 0x2E, 0x2C, 0xA0, 0x2D, 0xEF, 0x31, 0xB1, 0x26, 0x8E, 0x2C, + 0x12, 0x17, 0xDB, 0x21, 0x98, 0x21, 0xC5, 0x2A, 0x57, 0x37, 0x87, 0x29, + 0x8B, 0x37, 0xF8, 0x1C, 0x85, 0x22, 0x20, 0x20, 0x25, 0x1C, 0xB0, 0x29, + 0x7D, 0x1E, 0xC7, 0x24, 0x87, 0x12, 0x71, 0x17, 0x4D, 0x08, 0x92, 0x0A, + 0x63, 0x07, 0xFB, 0x04, 0x95, 0x09, 0xF9, 0x0D, 0xDF, 0x0F, 0x82, 0x1D, + 0x58, 0x15, 0x20, 0x2D, 0x61, 0x0D, 0xDE, 0x31, 0x3C, 0x06, 0xF8, 0x27, + 0xE5, 0x16, 0x2C, 0x1B, 0xC3, 0x1C, 0x29, 0x0F, 0xF4, 0x02, 0xFA, 0x0A, + 0x45, 0xF5, 0x17, 0x11, 0xA1, 0xFD, 0x42, 0x19, 0x97, 0x08, 0x6C, 0x17, + 0x98, 0x16, 0xAC, 0x11, 0xF2, 0x12, 0x81, 0x0E, 0xAE, 0x0E, 0x3C, 0x0E, + 0x53, 0x15, 0xCA, 0x0D, 0x16, 0x18, 0x58, 0xFF, 0x21, 0x1A, 0x5C, 0xEF, + 0x48, 0x16, 0xD7, 0xF1, 0xB0, 0x09, 0x74, 0x00, 0x88, 0x01, 0x88, 0x14, + 0x6E, 0xFC, 0xAC, 0x17, 0x06, 0x00, 0x82, 0x08, 0x78, 0x0A, 0xA7, 0xFB, + 0x6E, 0x10, 0x20, 0xF5, 0x9A, 0x05, 0x00, 0xEE, 0x16, 0xF3, 0xEA, 0xEC, + 0xFB, 0xED, 0xD6, 0xF9, 0x12, 0xEC, 0x33, 0xF9, 0x89, 0xF2, 0xC3, 0xEC, + 0xD2, 0xF4, 0x94, 0xE6, 0xC8, 0xEB, 0xE5, 0xE4, 0xE4, 0xE4, 0x4D, 0xE3, + 0x39, 0xE1, 0x28, 0xE0, 0x41, 0xD5, 0x87, 0xD3, 0x09, 0xD9, 0x1E, 0xCF, + 0x2E, 0xE1, 0xC7, 0xC6, 0xF0, 0xE7, 0x70, 0xC7, 0xB3, 0xDD, 0x9B, 0xDB, + 0x9F, 0xC3, 0x89, 0xE4, 0xD6, 0xC1, 0xBE, 0xEF, 0x3B, 0xCA, 0x3B, 0xFD, + 0x2C, 0xD2, 0x37, 0xF3, 0x3F, 0xD5, 0x5F, 0xDE, 0x1A, 0xDE, 0x59, 0xE3, + 0xCF, 0xE0, 0xEC, 0xE8, 0x31, 0xE3, 0xD1, 0xEF, 0x36, 0xEB, 0x07, 0x03, + 0xE1, 0xE1, 0x9C, 0x07, 0x07, 0xF1, 0x34, 0x1B, 0xC0, 0x16, 0x2E, 0x32, + 0x46, 0x15, 0x55, 0x1F, 0xD6, 0x07, 0xF8, 0x08, 0x57, 0x04, 0xB1, 0xF7, + 0xA5, 0x04, 0x09, 0xF1, 0xB9, 0x12, 0x00, 0x02, 0x8F, 0x16, 0x39, 0x04, + 0x3C, 0x1B, 0xC2, 0x0A, 0x4D, 0x28, 0xDE, 0x1B, 0xE1, 0x30, 0x7A, 0x1B, + 0xA9, 0x31, 0xB4, 0x13, 0x64, 0x30, 0xFB, 0x0B, 0x29, 0x2A, 0xD3, 0x01, + 0x98, 0x2C, 0x43, 0x0E, 0x98, 0x3C, 0x0A, 0x20, 0x90, 0x3C, 0x87, 0x18, + 0x21, 0x2F, 0xDF, 0x17, 0x66, 0x31, 0xBC, 0x23, 0x61, 0x2C, 0x82, 0x23, + 0xF8, 0x17, 0xD2, 0x21, 0xCE, 0x0F, 0x03, 0x1C, 0x65, 0x07, 0x16, 0x07, + 0x4A, 0x05, 0xE6, 0x03, 0x98, 0x0A, 0xF1, 0x04, 0xE7, 0x0E, 0x85, 0x02, + 0x9F, 0x04, 0xB2, 0x0D, 0x5B, 0xF9, 0x9E, 0x14, 0xCE, 0x02, 0x24, 0x15, + 0xAB, 0x08, 0x93, 0x10, 0xF1, 0x02, 0xA0, 0xFE, 0x79, 0xFE, 0x1F, 0xF4, + 0xF8, 0xF1, 0xED, 0xF0, 0x09, 0xE0, 0xC7, 0xE6, 0x3A, 0xDA, 0x6D, 0xEB, + 0xD6, 0xE4, 0xAD, 0xF6, 0xAD, 0xF4, 0xE8, 0xF4, 0xA9, 0x00, 0x2F, 0xF5, + 0x69, 0xFD, 0x1A, 0xF8, 0x40, 0xEF, 0xA5, 0xF9, 0x22, 0xE7, 0x7F, 0xFB, + 0xDA, 0xE9, 0xD7, 0xF5, 0x78, 0xF6, 0x24, 0xF2, 0xB8, 0xF9, 0x0B, 0xF8, + 0xF7, 0xEE, 0xD4, 0xFA, 0x41, 0xF0, 0x32, 0x00, 0xF7, 0xF9, 0x4E, 0x10, + 0xAF, 0xF7, 0xBA, 0x10, 0xBC, 0xF3, 0x2F, 0x03, 0x6F, 0xEE, 0x60, 0xFD, + 0x46, 0xE6, 0xDC, 0xF1, 0x94, 0xE4, 0xA7, 0xE7, 0x0C, 0xEB, 0x78, 0xF4, + 0xA5, 0xEA, 0x5E, 0x05, 0x8B, 0xF2, 0x7F, 0x0D, 0x9D, 0x0A, 0x2D, 0x06, + 0x28, 0x06, 0x6D, 0xF5, 0x5C, 0xDF, 0xD2, 0xE5, 0x0D, 0xC9, 0x95, 0xD8, + 0x5E, 0xD1, 0x1E, 0xD8, 0x10, 0xD1, 0x7A, 0xD0, 0x6F, 0xDE, 0x89, 0xCD, + 0x14, 0xF1, 0xDB, 0xD8, 0x89, 0xEE, 0xB3, 0xE1, 0xB7, 0xEE, 0x29, 0xE7, + 0x14, 0xEE, 0x47, 0xDF, 0xBD, 0xE2, 0x01, 0xD8, 0x20, 0xDB, 0x0B, 0xDA, + 0x93, 0xED, 0x96, 0xDB, 0x33, 0xF5, 0x35, 0xD7, 0x26, 0xDA, 0xC9, 0xCF, + 0x11, 0xCE, 0x4E, 0xCB, 0xE2, 0xE8, 0x30, 0xD0, 0x6B, 0x00, 0x2B, 0xD5, + 0x9A, 0x01, 0x24, 0xDC, 0x32, 0xF2, 0xF9, 0xE1, 0x4A, 0xE6, 0xCB, 0xEA, + 0x3B, 0xE9, 0xB2, 0xF3, 0x13, 0x04, 0x3C, 0xFD, 0x80, 0x16, 0x48, 0x08, + 0x48, 0x07, 0xF6, 0x0A, 0xA3, 0x10, 0x81, 0x1D, 0x67, 0x20, 0x6A, 0x2A, + 0x32, 0x10, 0xA2, 0x26, 0x20, 0x09, 0x12, 0x29, 0x1F, 0x18, 0x8B, 0x1B, + 0xA6, 0x22, 0xE8, 0x07, 0x4F, 0x21, 0xBF, 0x12, 0x5B, 0x13, 0x87, 0x23, + 0xF5, 0x0A, 0x2C, 0x2E, 0xEC, 0x16, 0x52, 0x38, 0xB5, 0x2A, 0x08, 0x30, + 0x0D, 0x42, 0xAF, 0x2F, 0x3F, 0x50, 0xD5, 0x3B, 0x22, 0x3D, 0xFD, 0x32, + 0x9D, 0x31, 0xF8, 0x33, 0xB9, 0x3A, 0xAA, 0x38, 0x8A, 0x32, 0xD3, 0x2A, + 0xA1, 0x31, 0xB6, 0x2E, 0x90, 0x39, 0xCE, 0x41, 0xBA, 0x25, 0xFC, 0x43, + 0x33, 0x25, 0x02, 0x45, 0x65, 0x3C, 0x9A, 0x45, 0x4A, 0x41, 0x1A, 0x35, + 0xED, 0x39, 0x85, 0x21, 0x48, 0x31, 0xC0, 0x27, 0x0C, 0x27, 0x72, 0x3B, + 0xEA, 0x2B, 0x19, 0x40, 0xD9, 0x3E, 0x20, 0x3B, 0xE2, 0x3D, 0xDC, 0x30, + 0x7A, 0x2E, 0xBB, 0x20, 0x3B, 0x28, 0x75, 0x15, 0x7C, 0x27, 0x19, 0x1B, + 0x03, 0x16, 0x04, 0x1B, 0xAD, 0x07, 0x52, 0x16, 0x6C, 0x15, 0xCD, 0x19, + 0x8A, 0x25, 0xD8, 0x15, 0xA9, 0x26, 0x2A, 0x1D, 0xD4, 0x1D, 0x80, 0x29, + 0xAF, 0x0F, 0x2E, 0x2A, 0x12, 0x07, 0xC3, 0x2C, 0x2B, 0x12, 0x2F, 0x22, + 0x1D, 0x26, 0xA1, 0x13, 0x53, 0x27, 0xA1, 0x0E, 0xB4, 0x21, 0xE9, 0x11, + 0x8C, 0x13, 0xE8, 0x0F, 0xC7, 0x03, 0x72, 0x0F, 0x1E, 0x06, 0xB0, 0x14, + 0xA9, 0xFA, 0xBC, 0x03, 0xF1, 0xF1, 0x80, 0xFE, 0x41, 0xFB, 0xD0, 0x02, + 0x07, 0xFE, 0x92, 0xF2, 0x47, 0xF8, 0x7D, 0xE2, 0x15, 0xF4, 0x22, 0xE5, + 0x5D, 0xEE, 0x6E, 0xF5, 0x54, 0xE6, 0xB0, 0xFE, 0x6D, 0xE9, 0x90, 0x05, + 0xC4, 0xE7, 0xC4, 0x07, 0x23, 0xD9, 0xEF, 0xF4, 0xDC, 0xDB, 0xF2, 0xE5, + 0xB2, 0xEC, 0x33, 0xE3, 0x6B, 0xEA, 0x0B, 0xDA, 0x06, 0xDE, 0xF9, 0xD0, + 0x7C, 0xDA, 0xA0, 0xD9, 0x70, 0xE3, 0x86, 0xE0, 0x07, 0xEA, 0xEC, 0xD9, + 0x36, 0xF2, 0x6C, 0xDC, 0xC3, 0xF2, 0xDE, 0xD4, 0x5B, 0xE8, 0xBC, 0xC4, + 0x0A, 0xE3, 0x8E, 0xC2, 0x2B, 0xE3, 0x96, 0xCE, 0xEC, 0xD9, 0xC7, 0xD0, + 0x28, 0xD7, 0x2D, 0xCB, 0x00, 0xE2, 0x7A, 0xD1, 0x2B, 0xE4, 0x7B, 0xD9, + 0xDD, 0xE1, 0x83, 0xE8, 0xB6, 0xE4, 0x44, 0xFD, 0x5B, 0xEE, 0x35, 0x02, + 0xFC, 0xF2, 0x13, 0xF3, 0x2F, 0xE8, 0x56, 0xE3, 0x5D, 0xDB, 0xC2, 0xDD, + 0xF2, 0xDF, 0xEE, 0xE0, 0x92, 0xD9, 0x02, 0xDF, 0x18, 0xCD, 0xEB, 0xE0, + 0x54, 0xD6, 0xE8, 0xEB, 0x2C, 0xE7, 0xAC, 0xED, 0x76, 0xEE, 0xCF, 0xE2, + 0x4F, 0xEB, 0xCC, 0xDF, 0xEE, 0xD1, 0xD7, 0xD4, 0xE9, 0xC4, 0x72, 0xCB, + 0x83, 0xDD, 0x50, 0xDC, 0x78, 0xF5, 0x4D, 0xE8, 0x40, 0xF8, 0x35, 0xF1, + 0x6D, 0xEC, 0x63, 0xFC, 0x7D, 0xF1, 0x7E, 0xFF, 0x85, 0x04, 0xE5, 0xFE, + 0x31, 0x06, 0x8E, 0xFA, 0x8A, 0xFE, 0x74, 0xFA, 0xDB, 0xF7, 0x07, 0xFB, + 0xA0, 0xF6, 0x54, 0xFA, 0xF2, 0xF6, 0x06, 0x00, 0x91, 0xE9, 0x23, 0x01, + 0x43, 0xDF, 0xB1, 0xF9, 0x80, 0xF5, 0x92, 0xF9, 0x27, 0x0B, 0x7F, 0xF8, + 0x55, 0xFC, 0xCA, 0xEC, 0x40, 0xE3, 0x67, 0xED, 0xA8, 0xDC, 0x80, 0xF7, + 0x0F, 0xEB, 0xA5, 0xF6, 0x8E, 0x01, 0x8B, 0xFD, 0x29, 0x06, 0x82, 0x08, + 0x03, 0xFE, 0xD9, 0x02, 0x21, 0x01, 0xF0, 0x01, 0xF9, 0x06, 0x35, 0x0A, + 0x48, 0xF8, 0x29, 0x05, 0x1C, 0xEA, 0x1D, 0xFE, 0xA4, 0xF3, 0xDC, 0xF9, + 0x43, 0x01, 0xD1, 0xF6, 0x07, 0xF8, 0xCA, 0xF2, 0x25, 0xEE, 0xC6, 0xEF, + 0x6F, 0xEE, 0x8A, 0xF4, 0x4F, 0xF7, 0xEB, 0xF3, 0x9C, 0x0F, 0x8B, 0xF5, + 0x7A, 0x08, 0xC1, 0xF9, 0x43, 0xEA, 0x2F, 0xF6, 0x35, 0xE3, 0x03, 0xEB, + 0x4B, 0xF8, 0xAB, 0xE6, 0x6F, 0x02, 0x5D, 0xE3, 0x14, 0xFB, 0x4F, 0xE2, + 0xFE, 0xF6, 0x6E, 0xE9, 0x0E, 0xF3, 0xEF, 0xEB, 0x37, 0xEB, 0x71, 0xF2, + 0x15, 0xDE, 0x18, 0xFA, 0xBE, 0xDC, 0xAB, 0xF0, 0x3F, 0xF1, 0xA2, 0xE4, + 0x3A, 0x00, 0x49, 0xDD, 0x49, 0xFB, 0x2D, 0xDA, 0x9A, 0xF0, 0x82, 0xE7, + 0xED, 0xE6, 0xF9, 0xF7, 0x37, 0xE1, 0x10, 0xF0, 0x6A, 0xEE, 0x6D, 0xE2, + 0x42, 0xFD, 0x1F, 0xD7, 0x7E, 0xFA, 0x17, 0xD9, 0x5F, 0xEC, 0x86, 0xF1, + 0xFF, 0xDE, 0xEF, 0xF8, 0x10, 0xDC, 0xB5, 0xF5, 0xDA, 0xDB, 0x40, 0xF7, + 0xB9, 0xF2, 0xE0, 0xF6, 0xBD, 0x0F, 0x6E, 0x05, 0x1F, 0x04, 0xCF, 0x0D, + 0xCC, 0xF0, 0xDC, 0x04, 0xA5, 0xFD, 0x07, 0x08, 0xDB, 0x0B, 0xC6, 0x0D, + 0xCF, 0x0A, 0xC4, 0x11, 0x1F, 0x13, 0x7B, 0x23, 0x35, 0x19, 0x0C, 0x2E, + 0xD6, 0x1E, 0x5E, 0x2B, 0x3C, 0x32, 0x9D, 0x2F, 0xBC, 0x2E, 0xCF, 0x1D, + 0xD4, 0x1B, 0x48, 0x0B, 0x8F, 0x18, 0xA5, 0x19, 0xE7, 0x1B, 0xD0, 0x23, + 0x30, 0x2A, 0xB0, 0x2C, 0xBC, 0x30, 0xA5, 0x35, 0x7F, 0x2B, 0x18, 0x2D, + 0x35, 0x30, 0x13, 0x26, 0xCF, 0x31, 0x52, 0x25, 0x39, 0x32, 0x36, 0x27, + 0x0A, 0x36, 0x46, 0x33, 0xBB, 0x35, 0x37, 0x3A, 0x48, 0x44, 0x35, 0x32, + 0x03, 0x50, 0xFC, 0x2E, 0xCD, 0x3C, 0x2E, 0x2C, 0x18, 0x2E, 0xD9, 0x2E, + 0x43, 0x2E, 0x0E, 0x3B, 0x60, 0x27, 0x6D, 0x32, 0x59, 0x1A, 0xB8, 0x1D, + 0x51, 0x1B, 0x40, 0x17, 0x45, 0x1F, 0x28, 0x12, 0x15, 0x22, 0x9C, 0x0D, + 0x5A, 0x27, 0xDE, 0x11, 0xA8, 0x1E, 0xCF, 0x18, 0x29, 0x14, 0xFA, 0x25, + 0xDC, 0x0F, 0xC5, 0x33, 0x36, 0x0C, 0xEA, 0x32, 0xF0, 0x09, 0xFC, 0x24, + 0x49, 0xFB, 0x47, 0x18, 0xF3, 0xF7, 0xC0, 0x11, 0xBC, 0x0B, 0xF2, 0x0B, + 0xD1, 0x0A, 0xA6, 0x03, 0x78, 0xFE, 0x03, 0x06, 0xD4, 0xFA, 0xB2, 0x12, + 0xC2, 0xF5, 0xB5, 0x12, 0x3C, 0xF3, 0xF2, 0x0F, 0xD4, 0xF7, 0x4D, 0x12, + 0x68, 0x02, 0x6A, 0x06, 0xD7, 0x0E, 0x9C, 0xFC, 0x6B, 0x12, 0x20, 0xFD, + 0x20, 0x09, 0xFC, 0xF7, 0x26, 0xFD, 0xE3, 0xF3, 0x04, 0x02, 0x2E, 0xFD, + 0x64, 0x0B, 0xDA, 0x01, 0xC0, 0x14, 0x20, 0xFF, 0xE0, 0x06, 0x1D, 0xF6, + 0xD8, 0xF5, 0xA0, 0xF0, 0x38, 0x04, 0x78, 0xE6, 0xA7, 0x05, 0x72, 0xD2, + 0xF5, 0xF9, 0xF1, 0xCF, 0x06, 0xF9, 0x6A, 0xD5, 0xC3, 0xF8, 0xD1, 0xD6, + 0x1D, 0xF9, 0xEC, 0xD9, 0xD4, 0xF6, 0xC6, 0xDC, 0x16, 0xE2, 0x01, 0xD4, + 0x33, 0xCD, 0x9A, 0xCF, 0xC8, 0xCD, 0xAF, 0xD8, 0x5B, 0xD6, 0x88, 0xD5, + 0x38, 0xCB, 0x10, 0xCE, 0xC4, 0xB7, 0x01, 0xCE, 0xC3, 0xC4, 0xCE, 0xD0, + 0x4F, 0xD5, 0x2C, 0xD2, 0xCA, 0xDA, 0xF9, 0xDD, 0xD2, 0xD9, 0xC6, 0xED, + 0x06, 0xD0, 0xF8, 0xE4, 0x04, 0xD1, 0x9D, 0xDC, 0xFD, 0xD3, 0x30, 0xE1, + 0x5A, 0xD3, 0x0D, 0xE2, 0xEE, 0xC9, 0x8A, 0xDD, 0x17, 0xCB, 0xED, 0xDE, + 0x06, 0xDE, 0xB7, 0xE4, 0x7A, 0xE2, 0x8E, 0xE3, 0x32, 0xDE, 0xA2, 0xEB, + 0xF7, 0xE7, 0xF6, 0xFC, 0x57, 0x00, 0xC1, 0xFB, 0xCC, 0x0C, 0xFC, 0xF5, + 0xB6, 0x0B, 0x1A, 0x05, 0x5E, 0x09, 0xD2, 0x0D, 0xFD, 0x03, 0x18, 0x0E, + 0x6C, 0x0C, 0xC8, 0x1C, 0x2A, 0x17, 0x68, 0x24, 0x86, 0x19, 0x3C, 0x21, + 0xB5, 0x15, 0x37, 0x1F, 0x2F, 0x11, 0x02, 0x1C, 0x65, 0x0B, 0xFB, 0x18, + 0xF4, 0x0B, 0x86, 0x1C, 0x73, 0x13, 0xC7, 0x22, 0x6D, 0x25, 0x4F, 0x2A, + 0xC2, 0x3C, 0xC8, 0x2C, 0xBB, 0x39, 0x5F, 0x2B, 0xEB, 0x25, 0x1A, 0x2F, + 0x78, 0x22, 0x3E, 0x2B, 0xE8, 0x25, 0xA5, 0x1D, 0xA0, 0x1F, 0xBF, 0x18, + 0x70, 0x12, 0x08, 0x12, 0xEC, 0x07, 0xA6, 0x0F, 0xE3, 0x05, 0xDD, 0x11, + 0x84, 0x13, 0xC5, 0x13, 0x6A, 0x16, 0x8F, 0x15, 0x6B, 0x15, 0x43, 0x11, + 0xD3, 0x25, 0x89, 0x0D, 0x35, 0x19, 0x7F, 0x07, 0xC9, 0x05, 0xBB, 0x04, + 0xBD, 0x07, 0x13, 0x05, 0x3E, 0x0B, 0xF0, 0x04, 0x9C, 0x12, 0x29, 0xFB, + 0xFF, 0x1B, 0x8C, 0xE8, 0xD8, 0x15, 0x9F, 0xEA, 0x5F, 0xFC, 0x82, 0xF7, + 0x55, 0xE1, 0xEF, 0xF7, 0x91, 0xE2, 0x1D, 0xF5, 0xD5, 0xF2, 0x38, 0xE2, + 0x2D, 0xED, 0xA0, 0xD0, 0x10, 0xF5, 0x2E, 0xE1, 0x25, 0x02, 0x5B, 0xF1, + 0xDD, 0xEA, 0x40, 0xF3, 0xF4, 0xE1, 0xE0, 0xF8, 0x99, 0xF4, 0xE5, 0xF4, + 0xA4, 0xF8, 0xEB, 0xEB, 0x8B, 0xF6, 0x06, 0xEC, 0xAA, 0xF8, 0xDB, 0xED, + 0x3D, 0xE2, 0xE1, 0xE8, 0xF6, 0xCC, 0xB2, 0xE9, 0x79, 0xD5, 0xC3, 0xEF, + 0x55, 0xD1, 0x5B, 0xEB, 0xCC, 0xC4, 0x12, 0xE5, 0x51, 0xCA, 0xB5, 0xE4, + 0x65, 0xD4, 0x84, 0xE5, 0xB0, 0xDF, 0x00, 0xD7, 0xA1, 0xE2, 0x2E, 0xC8, + 0x30, 0xD9, 0x0F, 0xCE, 0x34, 0xCF, 0xD6, 0xD5, 0x5D, 0xCA, 0x93, 0xDE, + 0x24, 0xD0, 0xAE, 0xE6, 0xCE, 0xDA, 0xDF, 0xE2, 0xC1, 0xD5, 0x20, 0xD7, + 0x73, 0xD8, 0x4F, 0xD0, 0x00, 0xE3, 0xE1, 0xD1, 0x9A, 0xD7, 0xA4, 0xD9, + 0xC9, 0xCA, 0xBD, 0xE4, 0x22, 0xDB, 0xEC, 0xF4, 0x32, 0xEC, 0xFC, 0xF3, + 0xC1, 0xF5, 0xAB, 0xE4, 0x36, 0x03, 0x1E, 0xE1, 0xB1, 0xFD, 0x98, 0xE5, + 0xB2, 0xF4, 0x62, 0xEE, 0x64, 0xEF, 0x5D, 0xEE, 0xAC, 0xF2, 0xD7, 0xE9, + 0x9A, 0x01, 0x44, 0xEA, 0xD8, 0x02, 0xD9, 0xED, 0xC5, 0x08, 0x4C, 0xFD, + 0xF3, 0x12, 0xBE, 0x0C, 0x3D, 0x04, 0xA0, 0x13, 0x0D, 0xFF, 0x6E, 0x22, + 0xB6, 0x13, 0x3E, 0x2D, 0x57, 0x19, 0x1B, 0x20, 0x23, 0x18, 0x79, 0x13, + 0xC3, 0x2A, 0x9D, 0x18, 0xDC, 0x36, 0xC6, 0x15, 0xF8, 0x30, 0xF6, 0x19, + 0x10, 0x2C, 0x64, 0x2E, 0xC5, 0x22, 0x5C, 0x35, 0xED, 0x17, 0xD5, 0x32, + 0xFC, 0x27, 0x1C, 0x3E, 0x6A, 0x31, 0x49, 0x36, 0xF0, 0x28, 0xD9, 0x20, + 0xDF, 0x29, 0x10, 0x22, 0xF6, 0x2F, 0xA0, 0x29, 0x73, 0x3D, 0x79, 0x31, + 0xF7, 0x3A, 0xD1, 0x3D, 0x2F, 0x33, 0xD6, 0x4C, 0xEC, 0x3A, 0x15, 0x51, + 0x0E, 0x3D, 0xED, 0x4C, 0x36, 0x3D, 0x26, 0x51, 0x1E, 0x3C, 0x8D, 0x51, + 0x4E, 0x35, 0x3C, 0x45, 0x49, 0x33, 0x30, 0x43, 0x51, 0x42, 0xF7, 0x42, + 0xA0, 0x4F, 0xC8, 0x35, 0x2D, 0x46, 0x7C, 0x33, 0xD2, 0x3F, 0x4D, 0x3B, + 0xCE, 0x46, 0x7C, 0x35, 0xC8, 0x49, 0xAB, 0x2F, 0xCA, 0x43, 0x3E, 0x2F, + 0x51, 0x3D, 0xA7, 0x21, 0x44, 0x47, 0x66, 0x1B, 0xFD, 0x46, 0xB2, 0x23, + 0x21, 0x2F, 0xAE, 0x26, 0x83, 0x1F, 0x13, 0x26, 0xE4, 0x24, 0xBB, 0x26, + 0xC4, 0x31, 0x7D, 0x29, 0x94, 0x2E, 0x7F, 0x2A, 0xA3, 0x18, 0x73, 0x1E, + 0x0F, 0x05, 0xEE, 0x18, 0x0A, 0x01, 0x91, 0x16, 0x95, 0x09, 0x07, 0x07, + 0x89, 0x11, 0x96, 0x06, 0x14, 0x0F, 0x64, 0x0C, 0x59, 0x10, 0xD2, 0x0A, + 0xD8, 0x08, 0xDD, 0x0A, 0x6A, 0xFB, 0x0D, 0x0E, 0x05, 0xE7, 0x6B, 0x02, + 0xF9, 0xD4, 0x95, 0xED, 0x9D, 0xDC, 0x70, 0xE7, 0x49, 0xDF, 0x3A, 0xE2, + 0x8F, 0xD6, 0x32, 0xD8, 0xD2, 0xCD, 0x36, 0xD8, 0x3C, 0xCD, 0x95, 0xDD, + 0x27, 0xD9, 0x9B, 0xDD, 0xA9, 0xDE, 0x5A, 0xD8, 0x8D, 0xE1, 0x87, 0xDC, + 0x2C, 0xDE, 0x9A, 0xDE, 0x5A, 0xDC, 0x1D, 0xDB, 0xCD, 0xE1, 0x56, 0xE0, + 0x94, 0xD6, 0x3A, 0xE1, 0x9D, 0xD5, 0x00, 0xE0, 0x17, 0xEB, 0x69, 0xE7, + 0x40, 0xEE, 0x76, 0xE7, 0x0F, 0xDD, 0xF4, 0xE6, 0x86, 0xCD, 0xF2, 0xE0, + 0xE6, 0xCB, 0x9A, 0xD0, 0xFF, 0xD2, 0x3D, 0xCF, 0x1D, 0xD3, 0x17, 0xCE, + 0x7E, 0xD8, 0x56, 0xD3, 0xB4, 0xDF, 0xDC, 0xE3, 0x2C, 0xE5, 0xEF, 0xEB, + 0x1C, 0xED, 0x26, 0xED, 0x9D, 0xF2, 0x32, 0xF2, 0x8B, 0xF0, 0xAE, 0xF4, + 0x4F, 0xEC, 0xD7, 0xF4, 0x01, 0xED, 0x48, 0xF8, 0xD1, 0xE3, 0x25, 0xF1, + 0x12, 0xDA, 0x8D, 0xE9, 0x43, 0xE2, 0x65, 0xE9, 0x04, 0xF8, 0xCF, 0xDF, + 0x43, 0x09, 0x81, 0xDE, 0x24, 0x00, 0xDB, 0xE4, 0x4C, 0xEE, 0xBF, 0xE4, + 0x5B, 0xE9, 0x0F, 0xF1, 0x1E, 0xEF, 0xDB, 0xF1, 0x1F, 0xFA, 0xCD, 0xDA, + 0x0F, 0xF8, 0xC7, 0xCF, 0xF4, 0xF1, 0x11, 0xD4, 0x30, 0xF4, 0x33, 0xE2, + 0x86, 0xED, 0xEF, 0xF3, 0x86, 0xE5, 0x52, 0xF5, 0xA6, 0xE9, 0xDF, 0xED, + 0x8D, 0xF1, 0x6A, 0xE7, 0x33, 0xF2, 0xB6, 0xDE, 0x19, 0xED, 0x55, 0xDE, + 0xC3, 0xE6, 0x28, 0xE6, 0x1C, 0xE3, 0xDF, 0xE8, 0x2C, 0xEE, 0x35, 0xF2, + 0x28, 0xF9, 0x6E, 0xFD, 0x29, 0xF0, 0x41, 0xF0, 0xE8, 0xED, 0x7D, 0xEB, + 0x11, 0xF1, 0x3F, 0xED, 0xDF, 0xED, 0x4E, 0xE1, 0x78, 0xE4, 0xE4, 0xE2, + 0x07, 0xD4, 0xD9, 0xE8, 0xC1, 0xD4, 0x47, 0xEB, 0x7E, 0xDF, 0x0C, 0xF5, + 0x32, 0xE0, 0x91, 0xF3, 0x2B, 0xE1, 0x83, 0xE8, 0xB2, 0xED, 0xE7, 0xE8, + 0x63, 0xF4, 0x94, 0xED, 0x18, 0xE9, 0xB9, 0xEF, 0x8E, 0xDA, 0xB0, 0xF4, + 0x18, 0xDB, 0xB6, 0xFE, 0xCA, 0xDF, 0x1B, 0x00, 0xCA, 0xE4, 0x6F, 0xF7, + 0xEA, 0xF6, 0x39, 0xEF, 0xED, 0xFE, 0x50, 0xED, 0x86, 0xF1, 0x4D, 0xEF, + 0x21, 0xF6, 0xA6, 0xF6, 0xD2, 0xF9, 0x01, 0xFC, 0xD1, 0xEA, 0xB5, 0xF5, + 0xCE, 0xF0, 0xFB, 0xF2, 0x09, 0x04, 0xFB, 0xFB, 0x02, 0x01, 0xBF, 0xFB, + 0xDC, 0xE9, 0x48, 0xF4, 0x3E, 0xE0, 0xA2, 0xF4, 0xAE, 0xEC, 0x9E, 0xF0, + 0x52, 0xF6, 0xBA, 0xE9, 0x3C, 0xFD, 0x49, 0xE8, 0xEE, 0xFE, 0xCA, 0xE2, + 0x68, 0xEF, 0x42, 0xDB, 0xCB, 0xE9, 0x7A, 0xE0, 0x88, 0xF3, 0x68, 0xEA, + 0xC5, 0xF0, 0xAE, 0xF1, 0xE5, 0xE4, 0x5B, 0xF9, 0xBB, 0xF3, 0xB7, 0xF8, + 0xE8, 0x10, 0x77, 0xF1, 0xFB, 0x09, 0x59, 0xE8, 0x11, 0xFF, 0x48, 0xE4, + 0xF1, 0x0A, 0x80, 0xF3, 0x8A, 0x07, 0xC8, 0x03, 0xA5, 0xFA, 0xA1, 0x0B, + 0x93, 0xFA, 0x75, 0x16, 0x1C, 0xFE, 0x5A, 0x20, 0x1C, 0xF7, 0x28, 0x17, + 0x7E, 0x03, 0x54, 0x0C, 0xE9, 0x14, 0x73, 0x06, 0xE4, 0xFD, 0x3A, 0xFB, + 0x82, 0xF3, 0x8D, 0x04, 0xF8, 0x0E, 0x9D, 0x1B, 0x32, 0x1C, 0x9F, 0x26, + 0x7F, 0x0C, 0x31, 0x27, 0xCC, 0x12, 0xCF, 0x27, 0x0A, 0x2B, 0x56, 0x29, + 0xAE, 0x25, 0x69, 0x2B, 0x04, 0x1C, 0xC2, 0x2D, 0xC8, 0x1E, 0x09, 0x2A, + 0x31, 0x28, 0x47, 0x25, 0x74, 0x40, 0xA9, 0x27, 0x9C, 0x4F, 0xC4, 0x2E, + 0xFE, 0x39, 0x76, 0x2C, 0x93, 0x26, 0x0E, 0x2F, 0x12, 0x35, 0xF3, 0x36, + 0x36, 0x4B, 0x07, 0x31, 0xFD, 0x46, 0xC3, 0x23, 0x06, 0x46, 0x1B, 0x22, + 0xBF, 0x4C, 0x97, 0x1D, 0x0D, 0x42, 0x92, 0x10, 0xBF, 0x42, 0x69, 0x19, + 0xE9, 0x44, 0x32, 0x2C, 0x69, 0x38, 0xA4, 0x35, 0x7F, 0x34, 0xE9, 0x3C, + 0xC7, 0x38, 0x3A, 0x37, 0x3E, 0x26, 0x5A, 0x27, 0x47, 0x07, 0x39, 0x22, + 0x86, 0x0D, 0xAD, 0x23, 0x11, 0x22, 0x43, 0x21, 0xC1, 0x1B, 0x57, 0x16, + 0xB4, 0x19, 0xC6, 0x19, 0xA3, 0x1F, 0xCD, 0x29, 0x3B, 0x1F, 0x4F, 0x27, + 0xA1, 0x18, 0x67, 0x1C, 0x88, 0x0B, 0xE9, 0x1C, 0x1A, 0x02, 0x53, 0x16, + 0x4E, 0xFE, 0xA4, 0x06, 0x12, 0xF9, 0x0D, 0x03, 0xEC, 0xED, 0x2F, 0xFE, + 0x0D, 0xE7, 0xD5, 0xF3, 0x1C, 0xF9, 0xFD, 0xFB, 0x8F, 0x0E, 0x1D, 0xFD, + 0x49, 0x00, 0x81, 0xF0, 0x17, 0xE3, 0xF0, 0xF1, 0x5F, 0xE4, 0xCE, 0xF4, + 0xF1, 0xF4, 0xC3, 0xF3, 0x1E, 0xF7, 0x47, 0xF6, 0xC9, 0xF9, 0xBF, 0xF5, + 0x4D, 0xF9, 0x13, 0x00, 0xF9, 0xEF, 0x5B, 0x09, 0x32, 0xF2, 0x6C, 0x05, + 0x23, 0xF1, 0xE7, 0x03, 0x0C, 0xDD, 0x41, 0xFD, 0xC8, 0xD2, 0x17, 0xF1, + 0x60, 0xE0, 0x7A, 0xED, 0x2D, 0xE3, 0x04, 0xEC, 0xA3, 0xD5, 0xDC, 0xE6, + 0xFE, 0xDB, 0x35, 0xEC, 0x66, 0xEE, 0xEC, 0xF1, 0x7E, 0xF9, 0x16, 0xEA, + 0x54, 0xF6, 0x50, 0xE5, 0x64, 0xE3, 0xA2, 0xE3, 0x12, 0xD8, 0x75, 0xE9, + 0x79, 0xDC, 0xF4, 0xF1, 0x3B, 0xE6, 0x68, 0xEB, 0xF4, 0xE7, 0xE0, 0xE0, + 0xD8, 0xED, 0xD9, 0xDE, 0xA4, 0xFD, 0x69, 0xE9, 0xC6, 0xF6, 0x7F, 0xF9, + 0xDC, 0xE5, 0x8E, 0xFC, 0x97, 0xEF, 0xA2, 0xF5, 0xE0, 0xFF, 0x48, 0xEE, + 0x7C, 0x03, 0x7B, 0xE3, 0x1D, 0x09, 0x55, 0xDF, 0x2A, 0x03, 0x11, 0xE2, + 0x9F, 0xF0, 0x9F, 0xE6, 0xAE, 0xF7, 0x03, 0xF0, 0x64, 0x13, 0xC5, 0xF9, + 0x1E, 0x0D, 0x46, 0xF6, 0x80, 0xF8, 0xC7, 0xEF, 0xEC, 0x02, 0x3A, 0xF7, + 0x6E, 0x0A, 0x20, 0xFC, 0x24, 0xF3, 0xB0, 0xF4, 0x7E, 0xF9, 0x7F, 0xFC, + 0xE5, 0x14, 0xDB, 0x05, 0xF1, 0x0C, 0x80, 0x06, 0x92, 0x0F, 0xE4, 0x12, + 0xB6, 0x1E, 0x43, 0x15, 0x4E, 0x17, 0x75, 0x0A, 0xD7, 0x14, 0x55, 0x0D, + 0x2F, 0x14, 0xC6, 0x0F, 0x88, 0x05, 0xAC, 0x0C, 0x6A, 0xF3, 0xF6, 0x14, + 0x18, 0xF5, 0x73, 0x24, 0x86, 0x09, 0xFA, 0x25, 0x19, 0x0D, 0x98, 0x14, + 0x12, 0x0A, 0x8B, 0x03, 0x68, 0x0D, 0x2F, 0xFE, 0x87, 0x0E, 0xB2, 0x07, + 0xCF, 0x02, 0xAF, 0x13, 0x62, 0xF8, 0x23, 0x16, 0x20, 0xFE, 0x3F, 0x0F, + 0x77, 0x00, 0x46, 0x08, 0x13, 0x05, 0x6A, 0x10, 0x35, 0x05, 0x01, 0x16, + 0x00, 0xF4, 0x57, 0x11, 0xC7, 0xEF, 0x36, 0x11, 0x06, 0x07, 0x26, 0x12, + 0x84, 0x1C, 0x03, 0x0F, 0x7F, 0x17, 0xA2, 0x08, 0x3F, 0x0B, 0x28, 0x03, + 0x79, 0x12, 0xCC, 0x02, 0xB5, 0x0D, 0xBB, 0xFB, 0x53, 0xF5, 0x37, 0xEF, + 0xE4, 0xF0, 0x5F, 0xEC, 0x6D, 0xF2, 0xF8, 0xE4, 0x1E, 0xF9, 0xFA, 0xDB, + 0x65, 0xFF, 0xFE, 0xD5, 0x25, 0xF6, 0x41, 0xD2, 0xB6, 0xE6, 0x58, 0xE0, + 0xFC, 0xDF, 0x2D, 0xF4, 0x73, 0xEC, 0x53, 0xF5, 0x62, 0xF3, 0xF9, 0xED, + 0x9A, 0xEE, 0x57, 0xE9, 0x22, 0xEB, 0x83, 0xE2, 0x07, 0xE8, 0x0F, 0xDB, + 0x6D, 0xEB, 0xB7, 0xDD, 0x1E, 0xE6, 0x5D, 0xDA, 0xA2, 0xD7, 0x84, 0xD4, + 0x03, 0xD5, 0x5C, 0xE1, 0xF7, 0xD9, 0x0C, 0xE8, 0x9D, 0xD9, 0x03, 0xE7, + 0x3A, 0xD0, 0x7E, 0xE3, 0x9E, 0xCB, 0xC6, 0xD7, 0xA0, 0xD4, 0x0A, 0xD5, + 0x83, 0xD5, 0x8E, 0xD1, 0x34, 0xD2, 0x5A, 0xCF, 0x3E, 0xD4, 0x66, 0xDA, + 0xE4, 0xDE, 0x29, 0xE1, 0x5A, 0xEB, 0xDF, 0xE3, 0x53, 0xE3, 0x41, 0xEE, + 0x14, 0xD2, 0x66, 0xF2, 0xB2, 0xC8, 0x8E, 0xEF, 0x56, 0xD3, 0xD9, 0xEE, + 0xEB, 0xE2, 0x63, 0xE7, 0xE3, 0xEC, 0x8D, 0xE9, 0xD8, 0xF3, 0xD7, 0xFA, + 0x9A, 0xF7, 0x27, 0xFF, 0xB8, 0x00, 0x75, 0xFF, 0xD5, 0x03, 0x70, 0x08, + 0x2F, 0xF8, 0x9B, 0x04, 0xC1, 0x03, 0xC8, 0x02, 0xF5, 0x1B, 0x7D, 0xF7, + 0xBA, 0x19, 0x2F, 0xE0, 0xD0, 0x08, 0x97, 0xE6, 0xBE, 0x09, 0x77, 0xFB, + 0xF2, 0x13, 0x8F, 0x03, 0x9E, 0x12, 0xE2, 0x04, 0x1F, 0x17, 0x78, 0x06, + 0x5F, 0x1B, 0x9B, 0x12, 0x37, 0x19, 0x01, 0x1C, 0x1D, 0x1E, 0x83, 0x15, + 0x57, 0x1D, 0xC9, 0x19, 0x0E, 0x12, 0x74, 0x20, 0xBD, 0x16, 0xBE, 0x15, + 0x83, 0x29, 0xD0, 0x16, 0xBE, 0x24, 0xF6, 0x1E, 0xA3, 0x13, 0xD3, 0x18, + 0x73, 0x1B, 0x0D, 0x23, 0xAE, 0x27, 0xC6, 0x2A, 0x15, 0x20, 0x53, 0x17, + 0x2E, 0x13, 0x6C, 0x15, 0x08, 0x09, 0x2A, 0x20, 0xB1, 0x02, 0x8F, 0x1C, + 0x74, 0x08, 0x6E, 0x19, 0xAF, 0x25, 0xC7, 0x1E, 0x88, 0x32, 0x55, 0x25, + 0x52, 0x18, 0x4D, 0x27, 0xB0, 0x16, 0x2C, 0x26, 0xDE, 0x23, 0xD9, 0x26, + 0x74, 0x19, 0x24, 0x24, 0xF0, 0x1B, 0x03, 0x22, 0x2D, 0x2F, 0xBD, 0x2A, + 0xD6, 0x36, 0x17, 0x31, 0xD9, 0x35, 0x3B, 0x2B, 0x19, 0x35, 0x45, 0x2D, + 0x28, 0x2E, 0xFF, 0x39, 0x48, 0x2A, 0x59, 0x33, 0x4F, 0x2B, 0xE6, 0x2B, + 0x99, 0x22, 0x8A, 0x2D, 0x53, 0x19, 0x4C, 0x23, 0xB2, 0x12, 0x18, 0x24, + 0x91, 0x16, 0x88, 0x34, 0x7B, 0x2A, 0x5A, 0x3A, 0xA5, 0x39, 0x45, 0x34, + 0xA9, 0x2E, 0xBE, 0x28, 0xB1, 0x27, 0xDE, 0x2B, 0x03, 0x21, 0x59, 0x31, + 0xA5, 0x12, 0xBD, 0x25, 0x42, 0x13, 0x20, 0x1E, 0x8A, 0x20, 0xF9, 0x19, + 0x8F, 0x2D, 0x13, 0x13, 0x6D, 0x26, 0x79, 0x11, 0x86, 0x0D, 0x1C, 0x17, + 0x3E, 0xFD, 0x62, 0x15, 0x2D, 0x0A, 0x25, 0x15, 0x67, 0x14, 0x4F, 0x18, + 0x6A, 0x0B, 0x6D, 0x01, 0xD5, 0x0C, 0x35, 0xF4, 0x1C, 0x09, 0xC9, 0xFD, + 0x71, 0xFC, 0x74, 0xFB, 0x97, 0xFE, 0x17, 0xF5, 0xE3, 0xFD, 0x95, 0xF0, + 0x8B, 0xF6, 0x00, 0xF2, 0xB1, 0xFA, 0x00, 0xF5, 0xE1, 0xFF, 0x55, 0xED, + 0x6B, 0xF2, 0x10, 0xEB, 0x4D, 0xE3, 0x36, 0xEE, 0x13, 0xEA, 0xF1, 0xE9, + 0x3C, 0xF1, 0xF0, 0xEA, 0xBD, 0xE1, 0xC3, 0xEA, 0x13, 0xE4, 0x98, 0xEB, + 0xD0, 0xFF, 0xB2, 0xF5, 0xDF, 0xFD, 0x97, 0xEB, 0x06, 0xF4, 0x86, 0xD0, + 0xF4, 0xF1, 0xDA, 0xC9, 0x70, 0xDA, 0xDE, 0xD7, 0xEC, 0xCE, 0x09, 0xE7, + 0x72, 0xD8, 0x0D, 0xF3, 0xFA, 0xD8, 0x78, 0xF5, 0x80, 0xD7, 0xDF, 0xE6, + 0xF1, 0xE6, 0x9C, 0xDA, 0x3C, 0xF3, 0x88, 0xD5, 0xA6, 0xE3, 0x0F, 0xD7, + 0xC1, 0xCF, 0xCA, 0xE4, 0x6F, 0xD4, 0xCE, 0xF0, 0x4D, 0xDE, 0xD2, 0xF0, + 0x80, 0xE1, 0x5D, 0xEA, 0xC2, 0xEA, 0x5C, 0xE5, 0xA2, 0xEC, 0xDD, 0xE7, + 0xD7, 0xDE, 0x2F, 0xE2, 0xB0, 0xDF, 0x4A, 0xD8, 0x9F, 0xE6, 0x7F, 0xDA, + 0x39, 0xDB, 0xEC, 0xDF, 0x9F, 0xE0, 0x99, 0xE4, 0x57, 0xF0, 0x70, 0xE8, + 0x0D, 0xEE, 0x8D, 0xEA, 0x02, 0xED, 0x7D, 0xEE, 0xC6, 0xE5, 0xB6, 0xF4, + 0x61, 0xE2, 0x49, 0xF3, 0x54, 0xEE, 0x51, 0xEE, 0xC5, 0xF2, 0x69, 0xE9, + 0x2F, 0xED, 0xEC, 0xD8, 0x72, 0xED, 0x41, 0xCE, 0xD5, 0xFC, 0x81, 0xDA, + 0x82, 0xF9, 0xBA, 0xDE, 0xA9, 0xDE, 0x10, 0xE1, 0x80, 0xD4, 0xCB, 0xF1, + 0x4F, 0xDF, 0x1F, 0xF4, 0xB7, 0xE8, 0x2E, 0xF0, 0x00, 0xE9, 0x50, 0xE8, + 0xC9, 0xED, 0xBC, 0xD6, 0xA9, 0xF4, 0x0C, 0xCE, 0xF9, 0xF3, 0x85, 0xCE, + 0x73, 0xF6, 0xC3, 0xD8, 0xB0, 0xEA, 0xD4, 0xEA, 0xB9, 0xDE, 0xAB, 0xF6, + 0x1B, 0xF0, 0x12, 0xF7, 0x95, 0xF7, 0x89, 0xF6, 0x11, 0xE1, 0x66, 0xEE, + 0x31, 0xCE, 0x0E, 0xE9, 0x79, 0xD7, 0xAF, 0xF0, 0x2C, 0xEB, 0x79, 0xF1, + 0x21, 0xEC, 0xCB, 0xF2, 0x3E, 0xE3, 0x95, 0xFA, 0x11, 0xE1, 0x6F, 0xF8, + 0xD7, 0xE9, 0xA5, 0xF7, 0xB4, 0xEF, 0x8F, 0xFA, 0xBE, 0xE2, 0xA2, 0xF6, + 0x36, 0xDE, 0x66, 0x02, 0x14, 0xE7, 0x2C, 0x06, 0x71, 0xF6, 0xFA, 0xF8, + 0xDE, 0xF8, 0xCF, 0xF8, 0x31, 0xE4, 0xD5, 0xF7, 0x5B, 0xED, 0x81, 0xFB, + 0x42, 0x08, 0x39, 0x0C, 0xA1, 0x0A, 0xF5, 0x11, 0xBF, 0x02, 0x65, 0x09, + 0x14, 0x01, 0x3E, 0x00, 0xDD, 0x07, 0x35, 0xF5, 0x49, 0x0D, 0x6A, 0xE8, + 0x8E, 0x19, 0xC4, 0xEA, 0x8F, 0x23, 0xE9, 0xF5, 0x0A, 0x1E, 0x74, 0xF8, + 0x9C, 0x22, 0xC4, 0x02, 0x7E, 0x1C, 0xCB, 0x0C, 0xBD, 0x02, 0xFD, 0x09, + 0x1A, 0x05, 0x8B, 0x09, 0xEE, 0x18, 0x9A, 0x09, 0xDC, 0x18, 0x49, 0x05, + 0xCB, 0x08, 0x6F, 0x05, 0xCB, 0x00, 0x80, 0x10, 0x2D, 0xFD, 0x82, 0x17, + 0xEE, 0x02, 0xC6, 0x12, 0x10, 0x1D, 0x6D, 0x15, 0x8A, 0x1E, 0x02, 0x16, + 0x7C, 0x0E, 0x03, 0x10, 0x8C, 0x10, 0x5C, 0x10, 0x38, 0x0B, 0xCE, 0x0D, + 0x76, 0x02, 0xD6, 0x0E, 0x45, 0x07, 0xEF, 0x13, 0xE4, 0x16, 0x12, 0x14, + 0x43, 0x1B, 0x3D, 0x11, 0x6A, 0x0A, 0x87, 0x0A, 0x88, 0x01, 0x66, 0x0A, + 0x4B, 0xF9, 0xBA, 0x05, 0x0E, 0xFE, 0x84, 0xFE, 0x71, 0x17, 0x2C, 0x03, + 0x30, 0x1C, 0x1C, 0x00, 0xC1, 0x13, 0xE3, 0x06, 0x60, 0x1C, 0xC7, 0x24, + 0x2E, 0x2C, 0xE9, 0x38, 0xA2, 0x2A, 0x8B, 0x31, 0x56, 0x25, 0x70, 0x26, + 0x0A, 0x29, 0xEF, 0x21, 0xDF, 0x1B, 0xC3, 0x1D, 0x24, 0x02, 0x6C, 0x20, + 0xB4, 0xF6, 0x04, 0x28, 0xC0, 0xFC, 0xFE, 0x22, 0x47, 0x0F, 0xB4, 0x18, + 0x84, 0x1F, 0xCB, 0x14, 0xC5, 0x23, 0x61, 0x13, 0xD7, 0x1C, 0x2B, 0x1D, + 0x30, 0x16, 0x81, 0x29, 0x21, 0x21, 0x99, 0x2C, 0xB6, 0x23, 0x7A, 0x1C, + 0xEA, 0x18, 0x14, 0x0F, 0xEA, 0x1D, 0x54, 0x20, 0xCD, 0x25, 0x0F, 0x2E, + 0x3E, 0x1F, 0x79, 0x27, 0xB7, 0x18, 0xBD, 0x23, 0x1C, 0x14, 0xCB, 0x1A, + 0x60, 0x16, 0x87, 0x12, 0x12, 0x1C, 0x97, 0x0C, 0x15, 0x14, 0x0B, 0x02, + 0x4A, 0x0A, 0xFD, 0xFA, 0x7B, 0x18, 0x60, 0x00, 0xB8, 0x22, 0x10, 0x06, + 0x5A, 0x1B, 0xAB, 0x00, 0xFF, 0x17, 0x4C, 0xFF, 0xDF, 0x10, 0x58, 0x01, + 0x68, 0x14, 0xD7, 0x02, 0xF5, 0x20, 0x32, 0x00, 0xE0, 0x14, 0xE7, 0xF4, + 0x1E, 0xFE, 0x02, 0xF2, 0x94, 0xF1, 0x32, 0xFA, 0xB1, 0xE5, 0x3E, 0x00, + 0xBA, 0xE5, 0x34, 0x08, 0x20, 0xEF, 0x0E, 0x02, 0xE1, 0xFB, 0xBC, 0xF4, + 0xA4, 0x0E, 0x8B, 0xF1, 0x6F, 0x06, 0x40, 0xEA, 0xA9, 0xE8, 0xB6, 0xEE, + 0x14, 0xD9, 0x91, 0xFE, 0xBE, 0xD5, 0xF9, 0x06, 0xCD, 0xE3, 0x27, 0x09, + 0xEF, 0xF4, 0xFB, 0xFC, 0x41, 0xF0, 0x57, 0xF7, 0x21, 0xE5, 0x05, 0xF4, + 0x98, 0xE9, 0x95, 0xE5, 0x41, 0xF2, 0x28, 0xE9, 0x7A, 0xEE, 0x92, 0xF9, + 0x99, 0xE2, 0x18, 0xF7, 0x25, 0xE5, 0x20, 0xF5, 0xEF, 0xFA, 0x59, 0x01, + 0x5A, 0xFC, 0x97, 0xFE, 0xB1, 0xE9, 0x5C, 0xFC, 0xA7, 0xEB, 0xE2, 0x0A, + 0x1C, 0xF4, 0x54, 0x09, 0x01, 0xF9, 0xBF, 0x09, 0x7A, 0x06, 0x2D, 0x11, + 0x44, 0x09, 0x43, 0x0A, 0xFE, 0x0D, 0x84, 0x0A, 0x14, 0x1B, 0xDD, 0x0A, + 0x6E, 0x0D, 0xFD, 0x06, 0x6D, 0xFD, 0x25, 0x0C, 0xD1, 0x05, 0xD0, 0x02, + 0xEE, 0x14, 0x3B, 0xF7, 0x62, 0x1A, 0x8E, 0xF0, 0x01, 0x18, 0xD3, 0xE6, + 0x04, 0x13, 0xE0, 0xED, 0xC4, 0x0E, 0x0E, 0xFA, 0x18, 0x16, 0x27, 0x06, + 0xBD, 0x0C, 0x3B, 0x11, 0xCA, 0xF4, 0x3A, 0x0E, 0xDA, 0x03, 0x3A, 0x0D, + 0x2A, 0x1C, 0xBE, 0x0D, 0x76, 0x1E, 0xE8, 0x04, 0xC0, 0x13, 0x14, 0xFF, + 0xE6, 0x06, 0xBA, 0x04, 0xEB, 0x0A, 0x5E, 0xFE, 0xE0, 0x11, 0x85, 0xF3, + 0x09, 0x10, 0xE8, 0x00, 0xB5, 0x05, 0x7C, 0x0B, 0x2B, 0x00, 0xE9, 0x0F, + 0x6B, 0xFE, 0xF1, 0x0D, 0x3C, 0xF2, 0x5D, 0x00, 0x85, 0xE7, 0xA7, 0xFE, + 0xAF, 0xF0, 0x2E, 0x00, 0x75, 0xFF, 0xED, 0xF5, 0x66, 0x04, 0x1A, 0xF7, + 0xE9, 0xF6, 0x34, 0xF8, 0x04, 0xED, 0xFA, 0xF9, 0x6C, 0xF1, 0x9B, 0x0A, + 0xD7, 0xF6, 0xAD, 0x0C, 0x43, 0xF7, 0xFA, 0xFA, 0x78, 0xED, 0x73, 0xF1, + 0xAB, 0xF0, 0xBC, 0xF5, 0xC9, 0xF5, 0x6C, 0xF4, 0x77, 0xF1, 0x89, 0xF5, + 0xAF, 0xF3, 0xA8, 0xFE, 0x81, 0xF1, 0xF5, 0xFB, 0xA4, 0xF5, 0xCE, 0xF8, + 0x75, 0xFF, 0x3F, 0xF7, 0x88, 0xF6, 0xC0, 0xEE, 0xA1, 0xEE, 0x78, 0xE8, + 0x91, 0xEA, 0x40, 0xDE, 0x93, 0xEC, 0x7A, 0xD4, 0x26, 0xF9, 0xAD, 0xD2, + 0x7C, 0xFB, 0xBE, 0xDA, 0xB1, 0xEE, 0xD0, 0xEA, 0x2E, 0xEC, 0xD9, 0xF5, + 0xED, 0xFD, 0x0A, 0xFE, 0xCD, 0xFA, 0xEC, 0xFB, 0x1C, 0xE6, 0xF8, 0xF0, + 0x78, 0xE5, 0x32, 0xEF, 0x9E, 0xE0, 0xC6, 0xED, 0xFF, 0xCD, 0xCB, 0xE3, + 0xCF, 0xD4, 0xD6, 0xE6, 0x57, 0xE9, 0x41, 0xF0, 0x0A, 0xEB, 0xD0, 0xE4, + 0x44, 0xE9, 0x94, 0xD9, 0x99, 0xEB, 0x40, 0xDB, 0xEB, 0xD7, 0x37, 0xD8, + 0xE5, 0xC9, 0xCF, 0xDC, 0xFA, 0xE2, 0x8E, 0xED, 0x7C, 0xEA, 0x2E, 0xE7, + 0xE6, 0xD9, 0x82, 0xD7, 0xBC, 0xD6, 0xD2, 0xDC, 0x97, 0xD6, 0x04, 0xE9, + 0xEC, 0xD4, 0x02, 0xEB, 0xA0, 0xDE, 0x98, 0xE6, 0xA8, 0xF7, 0x6A, 0xE7, + 0x3C, 0x01, 0x7D, 0xE8, 0xE9, 0xF4, 0x91, 0xE5, 0x70, 0xF0, 0x43, 0xE9, + 0x0E, 0xF4, 0xAD, 0xF6, 0xB3, 0xFB, 0x61, 0xFD, 0x01, 0x0E, 0xDD, 0xFF, + 0xFE, 0x1F, 0x6E, 0x08, 0x49, 0x0F, 0x4E, 0x0A, 0x14, 0xEF, 0xFE, 0x0D, + 0x3B, 0xF5, 0x68, 0x16, 0x41, 0x05, 0x71, 0x10, 0x99, 0xFC, 0x33, 0x01, + 0x50, 0x01, 0xCB, 0x03, 0xAF, 0x13, 0x55, 0x15, 0x1C, 0x0F, 0x16, 0x1E, + 0x11, 0x08, 0xC2, 0x20, 0x09, 0x17, 0x63, 0x23, 0x37, 0x1D, 0xA1, 0x23, + 0x25, 0x18, 0x83, 0x19, 0xC6, 0x25, 0x4F, 0x0F, 0x03, 0x2B, 0x70, 0x17, + 0xC1, 0x1F, 0x0D, 0x21, 0xFD, 0x26, 0xE8, 0x26, 0x25, 0x31, 0x78, 0x2F, + 0xFF, 0x21, 0x80, 0x23, 0x79, 0x14, 0xE8, 0x16, 0xE3, 0x1E, 0x09, 0x20, + 0x70, 0x25, 0xFE, 0x1F, 0x30, 0x24, 0xD0, 0x15, 0x39, 0x27, 0x27, 0x13, + 0x6B, 0x22, 0x91, 0x12, 0x07, 0x1E, 0xF9, 0x1B, 0xE7, 0x25, 0x95, 0x25, + 0xCC, 0x2F, 0xDA, 0x21, 0x8D, 0x2E, 0xD4, 0x1F, 0xF5, 0x2C, 0xF2, 0x1A, + 0x91, 0x36, 0x59, 0x12, 0x34, 0x2D, 0xDE, 0x1A, 0x1C, 0x0D, 0x82, 0x27, + 0x2F, 0xF9, 0x33, 0x25, 0x9D, 0xFE, 0xBE, 0x21, 0xBB, 0x1A, 0xEB, 0x1A, + 0x0B, 0x30, 0x69, 0x0F, 0x4F, 0x2B, 0x1A, 0x12, 0x30, 0x1C, 0xB2, 0x10, + 0x2C, 0x1C, 0xCF, 0x0E, 0xDE, 0x1E, 0xB2, 0x16, 0x4C, 0x18, 0xAB, 0x19, + 0x9E, 0x12, 0x32, 0x1E, 0x0B, 0x11, 0xD3, 0x1D, 0x5A, 0x0A, 0x93, 0x10, + 0x11, 0x00, 0x05, 0x0E, 0xF0, 0xFD, 0xA3, 0x11, 0xA3, 0x04, 0x88, 0x11, + 0x13, 0x0B, 0xCB, 0x18, 0x3E, 0x11, 0x58, 0x1F, 0x92, 0x13, 0x68, 0x20, + 0xB0, 0xFE, 0x2F, 0x19, 0x02, 0xFD, 0x6F, 0x12, 0xB5, 0x0D, 0x60, 0x0E, + 0x8D, 0xFC, 0x18, 0x0C, 0x41, 0xF0, 0x5A, 0x0A, 0x48, 0x0A, 0x73, 0x0E, + 0x19, 0x15, 0x2F, 0x12, 0x74, 0x0E, 0x6E, 0x0C, 0x1A, 0x0C, 0xBF, 0x0B, + 0x9A, 0x02, 0xE2, 0x0C, 0x62, 0xF8, 0x10, 0x03, 0xA3, 0x02, 0x83, 0x07, + 0x5A, 0x07, 0x18, 0x0E, 0x5F, 0xFE, 0xE7, 0x04, 0xEC, 0x0A, 0x12, 0xFA, + 0xC7, 0x1B, 0x10, 0xED, 0xDC, 0x12, 0x5D, 0xE1, 0x7C, 0xFE, 0xFD, 0xE5, + 0x26, 0xFA, 0x1F, 0xF4, 0x79, 0x02, 0xFC, 0xF8, 0xA7, 0xFD, 0xDE, 0xF6, + 0xED, 0xF1, 0x99, 0xF5, 0xDD, 0xEC, 0xF3, 0xEE, 0x13, 0xE7, 0x49, 0xE3, + 0x4C, 0xF0, 0xB7, 0xDF, 0xC1, 0xF7, 0x14, 0xDE, 0xC9, 0xEF, 0x28, 0xDC, + 0x70, 0xED, 0x7A, 0xE3, 0xFD, 0xF5, 0x67, 0xEB, 0x8E, 0xF6, 0xCF, 0xE8, + 0x2C, 0xE5, 0x7F, 0xE6, 0xA7, 0xD9, 0x6B, 0xEA, 0x7E, 0xDC, 0x60, 0xEC, + 0xC7, 0xE1, 0xF4, 0xEE, 0xF9, 0xE2, 0xBD, 0xF0, 0xFD, 0xDA, 0xDC, 0xE7, + 0x8D, 0xCD, 0x89, 0xD9, 0x5A, 0xC5, 0x79, 0xD0, 0x6F, 0xCA, 0x70, 0xD2, + 0xBE, 0xD1, 0x23, 0xDE, 0x0C, 0xD2, 0x1C, 0xE5, 0x11, 0xE0, 0x37, 0xE4, + 0x5B, 0xEC, 0x52, 0xE3, 0x31, 0xD5, 0x44, 0xDC, 0x24, 0xC4, 0x65, 0xD9, + 0xC4, 0xD7, 0xBE, 0xDB, 0x6D, 0xE7, 0xFE, 0xDD, 0xF2, 0xE0, 0x48, 0xE7, + 0x1B, 0xD9, 0x4E, 0xEF, 0x16, 0xD5, 0x69, 0xF0, 0xEE, 0xD9, 0x53, 0xEB, + 0x8D, 0xEA, 0xE4, 0xDE, 0xA7, 0xF5, 0x86, 0xD4, 0x70, 0xE9, 0xD9, 0xCA, + 0xE7, 0xE0, 0x27, 0xC8, 0x81, 0xF2, 0x28, 0xD2, 0x53, 0x02, 0xD8, 0xD9, + 0x1A, 0xFD, 0x96, 0xDA, 0x2C, 0xFA, 0x32, 0xE0, 0x6F, 0x01, 0x5E, 0xE3, + 0xFB, 0xF5, 0xD6, 0xDB, 0xFF, 0xDD, 0x35, 0xDD, 0x3E, 0xDD, 0x8C, 0xE4, + 0xD4, 0xE2, 0x86, 0xE7, 0xC6, 0xDA, 0x80, 0xE9, 0x38, 0xDF, 0x8C, 0xE3, + 0x4E, 0xEA, 0x7D, 0xDB, 0x4F, 0xE8, 0xBD, 0xE2, 0x7A, 0xE5, 0xB4, 0xF1, + 0x55, 0xE6, 0x12, 0xF6, 0xB7, 0xE1, 0xF0, 0xF1, 0x69, 0xE4, 0x25, 0xEC, + 0x60, 0xFB, 0x73, 0xED, 0x55, 0xFC, 0x77, 0xF0, 0x33, 0xE0, 0x45, 0xF0, + 0x06, 0xD6, 0xAC, 0xF1, 0xC9, 0xDE, 0x46, 0xEF, 0xF5, 0xE6, 0x77, 0xEE, + 0x41, 0xE2, 0xD8, 0xE9, 0x0B, 0xDC, 0x9B, 0xE2, 0xCB, 0xDF, 0x3E, 0xEB, + 0xF5, 0xE6, 0x4A, 0xF5, 0x00, 0xF2, 0x35, 0xEF, 0x39, 0xFF, 0x7D, 0xEE, + 0x16, 0x05, 0x2E, 0xFB, 0x99, 0x01, 0xEA, 0x06, 0x11, 0x00, 0x59, 0x12, + 0xCD, 0x03, 0x38, 0x1E, 0x81, 0xFC, 0x5E, 0x1D, 0x42, 0xFE, 0x99, 0x14, + 0xAC, 0x14, 0x6E, 0x0F, 0x97, 0x0B, 0xC1, 0x03, 0x83, 0xF1, 0xB2, 0xFE, + 0x10, 0xFE, 0x1E, 0x10, 0x8F, 0x0D, 0x47, 0x22, 0xB5, 0x0B, 0x7C, 0x20, + 0xAB, 0x11, 0x89, 0x11, 0xE8, 0x11, 0x0F, 0x0D, 0x2C, 0x02, 0xFC, 0x0E, + 0x55, 0x12, 0x21, 0x16, 0x17, 0x2E, 0xE1, 0x1E, 0x0B, 0x1B, 0xC6, 0x1C, + 0x22, 0x08, 0x5F, 0x1F, 0x09, 0x13, 0xA9, 0x2B, 0x3B, 0x12, 0x39, 0x2E, + 0xFB, 0x15, 0x33, 0x2A, 0xDA, 0x24, 0x8A, 0x20, 0xFB, 0x29, 0xF7, 0x12, + 0x36, 0x24, 0xD3, 0x0C, 0x62, 0x23, 0xC1, 0x14, 0x9D, 0x23, 0xB9, 0x1E, + 0x52, 0x18, 0x9D, 0x1F, 0x5A, 0x26, 0xF7, 0x17, 0xC0, 0x3C, 0xF9, 0x07, + 0xD3, 0x36, 0xC2, 0x01, 0x74, 0x25, 0x6A, 0x05, 0xCE, 0x1A, 0x49, 0x0C, + 0x17, 0x16, 0xC2, 0x13, 0x7E, 0x16, 0x55, 0x16, 0xAC, 0x18, 0x99, 0x12, + 0x29, 0x24, 0x40, 0x16, 0x5F, 0x2D, 0xE2, 0x17, 0xEB, 0x2B, 0xA5, 0x10, + 0x2B, 0x1E, 0x15, 0x0C, 0xB4, 0x14, 0x4C, 0x0B, 0x27, 0x17, 0xD3, 0x0C, + 0x49, 0x17, 0xFA, 0x11, 0xDD, 0x1C, 0xF0, 0x18, 0xC4, 0x14, 0x64, 0x15, + 0xD1, 0x07, 0x6D, 0x0E, 0xA4, 0x0D, 0x09, 0x12, 0xD9, 0x05, 0xAD, 0x11, + 0x5B, 0xF3, 0x73, 0x0B, 0xFF, 0xF3, 0x5B, 0x0B, 0x66, 0x07, 0x83, 0x12, + 0xBA, 0x15, 0xDA, 0x12, 0xDA, 0x0E, 0xA9, 0x0C, 0x08, 0x06, 0xF1, 0x15, + 0x91, 0xFC, 0x98, 0x1D, 0xBC, 0xF9, 0x44, 0x12, 0x5E, 0x03, 0xB3, 0x10, + 0xDC, 0xFF, 0xD4, 0x15, 0xDF, 0xFD, 0x60, 0x0F, 0x82, 0x0E, 0xDB, 0x0C, + 0x63, 0x19, 0x2E, 0x11, 0x34, 0x0B, 0xA0, 0x0F, 0x1B, 0xF5, 0x0F, 0x0F, + 0x4F, 0xF1, 0x8A, 0x17, 0xBC, 0x00, 0xB9, 0x15, 0x3E, 0x14, 0x24, 0x05, + 0x00, 0x17, 0x3C, 0xF7, 0x1E, 0x0E, 0x26, 0xED, 0x49, 0x12, 0x2E, 0xE9, + 0x4E, 0x11, 0x25, 0xEA, 0x79, 0x05, 0xBB, 0xF3, 0x14, 0xFE, 0xE3, 0x05, + 0x64, 0xF5, 0xAD, 0x0A, 0xCE, 0xFC, 0x8D, 0x0B, 0x45, 0x04, 0x92, 0x07, + 0x88, 0xFA, 0x46, 0xF9, 0xAE, 0xF9, 0x1B, 0xF2, 0x03, 0xFD, 0x44, 0xEC, + 0xE5, 0xFE, 0xB8, 0xEA, 0xDB, 0xFD, 0x4B, 0xF5, 0x6D, 0xF4, 0x90, 0xF6, + 0xC7, 0xF8, 0xAB, 0xF4, 0xFD, 0x03, 0xA6, 0xFA, 0x85, 0xFB, 0x6B, 0xFA, + 0x0F, 0xEC, 0x10, 0xF6, 0xAF, 0xF6, 0x37, 0xF6, 0x88, 0x03, 0x09, 0xF1, + 0x0F, 0xFB, 0x7E, 0xED, 0x9D, 0xF3, 0xEE, 0xF9, 0x98, 0xF2, 0x7C, 0x07, + 0x6D, 0xF5, 0x87, 0x0B, 0xB5, 0x01, 0x23, 0x12, 0xE7, 0x07, 0xA0, 0x15, + 0xD6, 0xFB, 0x7C, 0x0C, 0xD7, 0xEA, 0x5C, 0x02, 0x45, 0xED, 0xED, 0xFD, + 0xEE, 0xFD, 0x02, 0x03, 0xDF, 0xFC, 0xBD, 0x00, 0x03, 0x04, 0xD3, 0x02, + 0xCC, 0x11, 0x89, 0x15, 0xF1, 0x07, 0xC2, 0x18, 0x49, 0x01, 0x2F, 0x17, + 0x59, 0x0A, 0x45, 0x1A, 0xD1, 0x0E, 0xC1, 0x0D, 0xD6, 0x0A, 0x44, 0x03, + 0x25, 0x06, 0x76, 0xFB, 0x61, 0x04, 0x0C, 0xF1, 0x05, 0x0F, 0x48, 0xF8, + 0x42, 0x1D, 0x16, 0x08, 0xA1, 0x23, 0x2B, 0x10, 0x0C, 0x2A, 0x23, 0x13, + 0x50, 0x25, 0x20, 0x0F, 0x28, 0x15, 0xDA, 0x06, 0x5E, 0x0C, 0x22, 0x0B, + 0x56, 0xFC, 0xE9, 0x07, 0x52, 0xF4, 0x30, 0xF5, 0x27, 0x10, 0xD8, 0xF8, + 0xB2, 0x20, 0x21, 0x03, 0xF7, 0x07, 0x60, 0xFD, 0xCB, 0xFB, 0x00, 0x02, + 0xCF, 0x00, 0x4F, 0x00, 0x39, 0xF5, 0x53, 0xEE, 0x0A, 0xF8, 0xC6, 0xE6, + 0xFF, 0x02, 0x68, 0xE4, 0xC9, 0xED, 0x77, 0xEA, 0xF0, 0xDB, 0x66, 0xFC, + 0x6C, 0xF2, 0xF3, 0x02, 0x5C, 0xFA, 0x1A, 0xF6, 0x3B, 0xED, 0x31, 0xED, + 0xD6, 0xE9, 0x89, 0xEE, 0xCF, 0xE2, 0xC7, 0xF2, 0x67, 0xD9, 0xD5, 0xF5, + 0xF3, 0xDE, 0xDC, 0xEF, 0x23, 0xE6, 0x59, 0xE3, 0x10, 0xE8, 0x4A, 0xDC, + 0xDC, 0xF2, 0x80, 0xDD, 0x35, 0xFC, 0x8F, 0xE4, 0xC0, 0xF1, 0xE1, 0xEC, + 0xCA, 0xE4, 0x99, 0xF9, 0xBC, 0xEB, 0x5D, 0x04, 0x44, 0xF6, 0xB1, 0xF8, + 0xF6, 0xEE, 0x2B, 0xE3, 0xFB, 0xDC, 0x4D, 0xDD, 0x5A, 0xD8, 0x24, 0xE6, + 0xA8, 0xE1, 0xAA, 0xF3, 0x85, 0xED, 0xD4, 0xFF, 0x3C, 0xEC, 0x01, 0x04, + 0xCA, 0xDD, 0x34, 0x03, 0xE0, 0xD5, 0x82, 0xFC, 0xD7, 0xE0, 0xB4, 0xF3, + 0xD0, 0xE8, 0xD6, 0xEC, 0x94, 0xEB, 0x46, 0xE6, 0x7C, 0xF0, 0xB9, 0xE1, + 0xAF, 0xFB, 0x05, 0xEB, 0x04, 0xFC, 0xCF, 0xF6, 0x58, 0xE9, 0xA7, 0xF9, + 0xF1, 0xE3, 0xD9, 0xFA, 0x5F, 0xF2, 0xBC, 0xEF, 0x68, 0xFB, 0x6B, 0xDB, + 0xC1, 0xED, 0x05, 0xD5, 0xED, 0xD9, 0x1D, 0xDC, 0xEF, 0xDA, 0xDF, 0xE8, + 0x5A, 0xEB, 0xFC, 0xF4, 0x14, 0xFA, 0x5A, 0xFC, 0x3D, 0x06, 0xF1, 0xF9, + 0x2E, 0x0C, 0xA4, 0xF1, 0xE0, 0x0D, 0x2E, 0xF2, 0x87, 0x01, 0x20, 0xF3, + 0x48, 0xE5, 0x6B, 0xED, 0xFB, 0xD2, 0x72, 0xEE, 0x8E, 0xE4, 0xC3, 0xF9, + 0x24, 0x01, 0x8D, 0x00, 0x4F, 0xFC, 0xDC, 0xF7, 0xDC, 0xEB, 0xF9, 0xEE, + 0xDE, 0xF5, 0x2A, 0xF3, 0x7E, 0x04, 0xAD, 0xEF, 0x84, 0x01, 0x3C, 0xEE, + 0x3E, 0xFB, 0xD6, 0xFB, 0x62, 0xF8, 0x2E, 0xFE, 0xA4, 0x02, 0xE1, 0xF6, + 0x23, 0x14, 0xFD, 0xFE, 0xF2, 0x13, 0xD6, 0x0F, 0x04, 0xFE, 0xD4, 0x0C, + 0x90, 0xF7, 0x3E, 0x07, 0xD9, 0x0B, 0xD4, 0x0B, 0x34, 0x15, 0xD8, 0x0A, + 0xAC, 0x13, 0xD9, 0x0E, 0x4C, 0x16, 0x3D, 0x0F, 0xF8, 0x1B, 0xA5, 0x0A, + 0x79, 0x1D, 0x43, 0x10, 0x17, 0x13, 0x72, 0x1A, 0xF9, 0x06, 0x6F, 0x22, + 0x90, 0x0D, 0xDB, 0x24, 0x34, 0x15, 0x1E, 0x1A, 0x03, 0x1A, 0xB1, 0x10, + 0x77, 0x21, 0x6E, 0x11, 0x9B, 0x26, 0xA9, 0x19, 0x40, 0x29, 0x9E, 0x28, + 0xC7, 0x27, 0xBB, 0x36, 0xA1, 0x20, 0x16, 0x3D, 0xCA, 0x19, 0x40, 0x3D, + 0x79, 0x26, 0x53, 0x3A, 0x32, 0x3F, 0xBA, 0x32, 0x0A, 0x39, 0x64, 0x21, + 0xE3, 0x22, 0x65, 0x10, 0x4C, 0x2C, 0xC3, 0x12, 0xE8, 0x3B, 0x2A, 0x1F, + 0xD4, 0x30, 0x14, 0x29, 0xE6, 0x29, 0xA9, 0x33, 0x64, 0x30, 0x67, 0x34, + 0xB2, 0x24, 0x85, 0x28, 0x89, 0x26, 0xEF, 0x28, 0x5D, 0x30, 0x63, 0x29, + 0xB7, 0x1D, 0x38, 0x11, 0x5C, 0x16, 0x1E, 0x02, 0xB7, 0x2A, 0x96, 0x0D, + 0x2F, 0x2D, 0xD1, 0x10, 0x9E, 0x1F, 0x66, 0x17, 0x07, 0x1D, 0x0B, 0x29, + 0x60, 0x1C, 0x66, 0x2D, 0xCF, 0x20, 0x59, 0x2B, 0x15, 0x22, 0x91, 0x29, + 0x40, 0x12, 0xC4, 0x20, 0xC5, 0x0C, 0x8A, 0x18, 0x33, 0x10, 0x36, 0x1C, + 0xBB, 0x0B, 0x8D, 0x18, 0x77, 0x08, 0x42, 0x0D, 0x5F, 0x08, 0x51, 0x17, + 0x9E, 0x07, 0x65, 0x20, 0x5C, 0xFD, 0xD9, 0x11, 0x1C, 0xF5, 0x16, 0x05, + 0x4D, 0xF6, 0xC7, 0x02, 0x8B, 0xF9, 0xF3, 0xFD, 0x7E, 0xFE, 0x87, 0xFA, + 0x70, 0x00, 0x47, 0x00, 0x4D, 0xF6, 0xF5, 0x09, 0x83, 0xF5, 0xB9, 0x17, + 0xF3, 0x08, 0x62, 0x24, 0x2A, 0x0E, 0x46, 0x24, 0xEA, 0x02, 0xA3, 0x0B, + 0x83, 0x02, 0x79, 0xF4, 0x0F, 0x03, 0xFB, 0xF6, 0xA5, 0xF9, 0x39, 0xF4, + 0x32, 0x04, 0xFB, 0xE8, 0x70, 0x10, 0x8A, 0xEB, 0x24, 0x14, 0xBC, 0xF5, + 0x03, 0x20, 0x99, 0xF1, 0x40, 0x18, 0xB9, 0xED, 0xA0, 0xF9, 0xB2, 0xF2, + 0xCE, 0xEA, 0x45, 0xF0, 0x39, 0xF8, 0x6D, 0xEB, 0xE3, 0x0B, 0xBA, 0xEA, + 0x40, 0x01, 0x1A, 0xE6, 0x23, 0xE4, 0x87, 0xE5, 0x00, 0xE0, 0x2F, 0xF1, + 0x4D, 0xEA, 0x97, 0xF8, 0xCC, 0xEC, 0xEA, 0xEB, 0x47, 0xE7, 0xFD, 0xDB, + 0xF3, 0xE3, 0xCA, 0xDE, 0xA9, 0xE1, 0x34, 0xDF, 0x5E, 0xDE, 0x00, 0xDD, + 0xED, 0xD9, 0x64, 0xE4, 0xD8, 0xD6, 0x10, 0xE2, 0x42, 0xE0, 0xB7, 0xDA, + 0x80, 0xE9, 0xC8, 0xDB, 0xA0, 0xDA, 0x5E, 0xD8, 0x9B, 0xC7, 0x74, 0xD6, + 0x1C, 0xBC, 0xB7, 0xD4, 0xD7, 0xC1, 0x59, 0xCB, 0x35, 0xD5, 0x1C, 0xC2, + 0xE9, 0xD1, 0xAC, 0xBC, 0xA9, 0xC8, 0x55, 0xBD, 0x03, 0xD4, 0xB8, 0xCE, + 0x30, 0xE2, 0xEF, 0xE3, 0x51, 0xDD, 0x3F, 0xE8, 0xFF, 0xD2, 0xFD, 0xEA, + 0x2F, 0xDA, 0x0E, 0xEF, 0xEB, 0xE5, 0x50, 0xEB, 0xC7, 0xE3, 0x69, 0xE8, + 0xE4, 0xD1, 0x39, 0xE5, 0xB8, 0xC6, 0x62, 0xDF, 0xEF, 0xDA, 0x07, 0xE1, + 0xB2, 0xE6, 0x91, 0xE4, 0x14, 0xD4, 0x7D, 0xE7, 0xFE, 0xCE, 0x70, 0xF0, + 0xD6, 0xDD, 0xC9, 0xEC, 0x89, 0xEB, 0x86, 0xD9, 0x56, 0xF2, 0xA2, 0xD2, + 0x2E, 0xE9, 0x8B, 0xDA, 0x80, 0xD5, 0xE7, 0xE5, 0xC3, 0xDE, 0x4F, 0xF5, + 0x0D, 0xFC, 0xEC, 0x06, 0x51, 0xF6, 0xDD, 0x02, 0xDA, 0xE7, 0x1D, 0xF1, + 0xE2, 0xF4, 0xFD, 0xF1, 0xEE, 0xF8, 0x92, 0xF1, 0xD8, 0xE9, 0x8C, 0xE3, + 0x6E, 0xE0, 0x6C, 0xE6, 0xD2, 0xE7, 0x07, 0xF5, 0xBD, 0xF6, 0x42, 0xF5, + 0x61, 0x08, 0xF1, 0xF2, 0x47, 0x0E, 0x28, 0xF3, 0xF4, 0xFC, 0x33, 0xE7, + 0x92, 0xFB, 0x5C, 0xDE, 0x70, 0x08, 0x15, 0xE8, 0xCC, 0xFB, 0xF3, 0xED, + 0xD0, 0xEA, 0x53, 0xF1, 0xF6, 0xF5, 0x5F, 0xF9, 0x9C, 0x01, 0xF9, 0xF4, + 0x45, 0x01, 0xC9, 0xF5, 0x3A, 0x04, 0xE5, 0xFD, 0x4F, 0xFD, 0xA6, 0xFC, + 0x3D, 0xF7, 0xFE, 0xF9, 0x6C, 0x07, 0xDF, 0xFD, 0x74, 0x08, 0x32, 0xFD, + 0x87, 0x02, 0x94, 0xFB, 0xEC, 0x13, 0xDB, 0x00, 0x8C, 0x16, 0x85, 0x00, + 0x72, 0x04, 0xEF, 0x04, 0xC3, 0xF5, 0x58, 0x10, 0x2D, 0xF0, 0x3B, 0x0E, + 0x39, 0xFC, 0x19, 0x0E, 0xCD, 0x0C, 0x43, 0x0E, 0x59, 0x0C, 0xE4, 0x07, + 0x07, 0x06, 0x5D, 0x0E, 0x99, 0xFC, 0xD9, 0x13, 0x43, 0xF9, 0x37, 0x17, + 0xA3, 0xFD, 0x1A, 0x25, 0x9B, 0xF8, 0x2B, 0x2A, 0x29, 0xFC, 0xBD, 0x1E, + 0x72, 0x19, 0x32, 0x22, 0xE9, 0x26, 0xBA, 0x26, 0xD4, 0x14, 0x83, 0x1F, + 0x5D, 0x12, 0x6C, 0x24, 0x17, 0x16, 0xE3, 0x2B, 0xDB, 0x09, 0x27, 0x2F, + 0x7B, 0x12, 0xAE, 0x31, 0xEB, 0x1D, 0x59, 0x29, 0x8F, 0x19, 0xD5, 0x1A, + 0x9C, 0x22, 0x3C, 0x10, 0x7C, 0x2F, 0xCA, 0x06, 0x06, 0x2F, 0x37, 0x07, + 0x49, 0x25, 0x74, 0x0D, 0xCF, 0x2B, 0x9C, 0x0E, 0x48, 0x35, 0x42, 0x16, + 0x4B, 0x24, 0x32, 0x19, 0xD9, 0x15, 0xC2, 0x1B, 0xE3, 0x18, 0x9B, 0x2B, + 0x34, 0x20, 0x70, 0x2B, 0x38, 0x27, 0xF9, 0x16, 0x95, 0x2B, 0x01, 0x07, + 0xA0, 0x29, 0x00, 0x06, 0x42, 0x22, 0x84, 0x12, 0x5A, 0x22, 0x45, 0x1A, + 0x5D, 0x22, 0x38, 0x14, 0x55, 0x1A, 0x50, 0x14, 0x1F, 0x1B, 0xD3, 0x1A, + 0xF6, 0x18, 0xD3, 0x11, 0x17, 0x0B, 0x50, 0x06, 0x92, 0x04, 0x6C, 0x03, + 0x5C, 0x0B, 0x3D, 0xFF, 0xB3, 0x17, 0xE3, 0x0A, 0xC8, 0x1A, 0x33, 0x17, + 0xD7, 0x0B, 0xC0, 0x0F, 0x34, 0xFD, 0xD7, 0x12, 0x45, 0x02, 0x36, 0x1F, + 0x92, 0x0F, 0x1B, 0x1C, 0xC2, 0x0E, 0x4E, 0x09, 0x98, 0x03, 0xD6, 0xF9, + 0xD8, 0xFF, 0xA7, 0xFA, 0xAD, 0x05, 0x42, 0x00, 0xAF, 0x09, 0x61, 0x02, + 0xAF, 0xF8, 0x5B, 0x04, 0xFD, 0xED, 0xF9, 0x06, 0xDB, 0xFC, 0x02, 0x07, + 0x9E, 0x05, 0xF8, 0x02, 0x8F, 0xFE, 0x0A, 0x04, 0x8E, 0xF2, 0x79, 0x05, + 0x9C, 0xEA, 0x78, 0x00, 0xD0, 0xFF, 0xC5, 0xFB, 0x9A, 0x19, 0xCF, 0xF0, + 0x6D, 0x12, 0x87, 0xEB, 0x96, 0x04, 0x10, 0xFA, 0x86, 0x00, 0xA6, 0x08, + 0x29, 0xFC, 0xB3, 0x01, 0x64, 0xFF, 0xF7, 0xF8, 0x4C, 0x0A, 0x35, 0xF9, + 0xD6, 0x06, 0xBC, 0xF0, 0x40, 0x00, 0x4F, 0xEE, 0x17, 0x00, 0x60, 0xFB, + 0x92, 0xF5, 0x5A, 0xFD, 0x09, 0xEE, 0x7D, 0xF3, 0x04, 0xFD, 0x31, 0xF1, + 0xD6, 0x0B, 0x22, 0xEE, 0x44, 0xFB, 0x67, 0xEA, 0xFE, 0xE6, 0x89, 0xF0, + 0xA3, 0xF6, 0xD2, 0xFD, 0xDE, 0xFF, 0xB7, 0xFF, 0xC1, 0xF2, 0x1D, 0xF9, + 0x52, 0xF5, 0x98, 0xFA, 0xDD, 0xF2, 0x0E, 0xFC, 0x0A, 0xE9, 0xDB, 0xFE, + 0x13, 0xEE, 0xD5, 0x0C, 0xD2, 0xE8, 0xCD, 0x0E, 0xF2, 0xDB, 0xAC, 0xFC, + 0x1B, 0xEB, 0x6E, 0xF3, 0xD1, 0x04, 0x3C, 0xF4, 0xA3, 0x05, 0x9E, 0xF7, + 0x7A, 0xFD, 0x04, 0x04, 0x5F, 0x05, 0x5D, 0x0A, 0xE3, 0x0F, 0xDC, 0x05, + 0x3A, 0x0E, 0x13, 0x09, 0xB6, 0x01, 0xF1, 0x0D, 0x07, 0xF7, 0xA3, 0x0B, + 0x24, 0xFC, 0xDB, 0x08, 0xD1, 0x0D, 0xF0, 0x05, 0xE5, 0x19, 0x52, 0x05, + 0x0B, 0x05, 0xD2, 0x0D, 0x38, 0xF2, 0xF6, 0x1C, 0xD1, 0x08, 0x91, 0x29, + 0x58, 0x12, 0x52, 0x28, 0x15, 0x08, 0xDF, 0x14, 0xAB, 0x10, 0x52, 0x07, + 0xC8, 0x16, 0x9D, 0x03, 0xB7, 0x0B, 0x79, 0xFC, 0xCF, 0x02, 0x43, 0x05, + 0xFA, 0x03, 0x8A, 0x13, 0xAB, 0x00, 0x43, 0x0C, 0xF4, 0x0B, 0xCE, 0x03, + 0x58, 0x1D, 0xFB, 0x04, 0x6E, 0x0C, 0x4D, 0xF9, 0xED, 0xFC, 0x53, 0xF1, + 0x47, 0x07, 0x28, 0xFF, 0xEA, 0x07, 0x7D, 0x07, 0xA8, 0xFB, 0xCE, 0x07, + 0x36, 0xFB, 0xDE, 0x0A, 0xDD, 0x01, 0x8B, 0x00, 0x1F, 0x03, 0xB0, 0xED, + 0x2F, 0x02, 0x18, 0xEC, 0xF9, 0xFD, 0xC4, 0xEB, 0xA6, 0xF3, 0x7B, 0xE9, + 0xDC, 0xEC, 0xD6, 0xF2, 0xC4, 0xEB, 0xF0, 0xEE, 0xC5, 0xE8, 0xFE, 0xE5, + 0xB0, 0xE0, 0xDD, 0xE5, 0x15, 0xDE, 0x24, 0xE4, 0x63, 0xE9, 0x0A, 0xE4, + 0x82, 0xE9, 0xC8, 0xE1, 0x7C, 0xDB, 0xB5, 0xDD, 0xA3, 0xE2, 0x4E, 0xDB, + 0x86, 0xF0, 0x1C, 0xD3, 0x21, 0xEF, 0x60, 0xCF, 0x98, 0xE4, 0x13, 0xD4, + 0x74, 0xDB, 0xB2, 0xDC, 0x0D, 0xD8, 0xC2, 0xE2, 0xF7, 0xCB, 0x1D, 0xE6, + 0x42, 0xD0, 0xDD, 0xE9, 0x5E, 0xE1, 0x1D, 0xE5, 0xD7, 0xE1, 0xCF, 0xDF, + 0x50, 0xEA, 0x9B, 0xE0, 0xCC, 0xF1, 0xC6, 0xE4, 0x2B, 0xDB, 0x45, 0xE4, + 0x0F, 0xCD, 0xE0, 0xE1, 0x6D, 0xD5, 0x47, 0xE5, 0xB4, 0xD6, 0xC2, 0xE8, + 0x36, 0xD8, 0xB4, 0xE5, 0xD6, 0xE1, 0x74, 0xDF, 0x21, 0xE6, 0x41, 0xD7, + 0x07, 0xF3, 0x0A, 0xD9, 0x25, 0xF5, 0x2A, 0xE6, 0x0D, 0xE2, 0x80, 0xF5, + 0xFE, 0xE4, 0xD9, 0x0A, 0x77, 0xF6, 0x0E, 0x18, 0x13, 0xFB, 0x5B, 0x10, + 0x61, 0xF5, 0x8D, 0x04, 0x76, 0xEE, 0xD5, 0x02, 0xB7, 0xEF, 0xFB, 0xFC, + 0x22, 0xFE, 0xB3, 0xF3, 0xA8, 0x05, 0x72, 0xF1, 0x7C, 0x05, 0xEB, 0xF4, + 0x40, 0x04, 0xDB, 0xF7, 0x4B, 0xFC, 0xCB, 0xFC, 0x1A, 0xF9, 0xFE, 0x04, + 0x75, 0xF6, 0xFD, 0x04, 0xEC, 0xF4, 0x41, 0x01, 0xB4, 0x07, 0xEB, 0x04, + 0xAB, 0x1B, 0xB9, 0x08, 0xB0, 0x19, 0x3C, 0x01, 0x1C, 0x15, 0x5B, 0xFA, + 0x43, 0x13, 0xD9, 0xFD, 0x54, 0x18, 0x64, 0x03, 0x67, 0x1B, 0xC6, 0x08, + 0x37, 0x0D, 0x90, 0x11, 0x49, 0x04, 0x19, 0x16, 0xD9, 0x12, 0xB0, 0x15, + 0xA1, 0x1F, 0xE5, 0x10, 0x5F, 0x1A, 0x39, 0x0A, 0x2A, 0x13, 0x93, 0x05, + 0xF1, 0x13, 0x81, 0x07, 0x14, 0x1C, 0x9B, 0x12, 0x17, 0x1F, 0xC9, 0x1D, + 0xB0, 0x17, 0x7E, 0x24, 0x40, 0x09, 0x04, 0x1C, 0xD6, 0x03, 0x3E, 0x0B, + 0x1F, 0x0A, 0x0B, 0xFF, 0xA3, 0x0F, 0x19, 0x04, 0x39, 0x09, 0x23, 0x16, + 0xE7, 0x05, 0xB1, 0x27, 0x69, 0x11, 0xA2, 0x2B, 0xEE, 0x20, 0x97, 0x29, + 0x0C, 0x26, 0xDA, 0x2B, 0x6A, 0x1C, 0x92, 0x2D, 0x1A, 0x16, 0xED, 0x36, + 0x29, 0x1A, 0xB8, 0x3B, 0x29, 0x1F, 0x1A, 0x33, 0xA8, 0x2B, 0x2E, 0x2A, + 0x46, 0x38, 0x69, 0x1F, 0xDF, 0x38, 0xB5, 0x15, 0x0C, 0x38, 0x9F, 0x17, + 0x2D, 0x34, 0xF4, 0x18, 0x81, 0x30, 0xEF, 0x12, 0x4B, 0x31, 0x82, 0x0E, + 0xF4, 0x33, 0x86, 0x0D, 0xCE, 0x30, 0x13, 0x11, 0xBF, 0x22, 0x6E, 0x1D, + 0xE9, 0x22, 0x65, 0x25, 0x3D, 0x39, 0x4F, 0x2C, 0xAB, 0x38, 0x8B, 0x2D, + 0x36, 0x1D, 0x00, 0x1C, 0x9C, 0x1F, 0x42, 0x1B, 0x5D, 0x29, 0x6C, 0x21, + 0xF9, 0x17, 0x3A, 0x1E, 0x28, 0x10, 0x4D, 0x20, 0xE4, 0x11, 0xDD, 0x17, + 0x4D, 0x0C, 0xDA, 0x04, 0x9B, 0x0E, 0xDD, 0x03, 0xE5, 0x11, 0x17, 0x13, + 0xDF, 0x00, 0xF9, 0x13, 0xF2, 0xEF, 0x72, 0x0E, 0xAD, 0xFB, 0x24, 0x0B, + 0xCB, 0x03, 0xA3, 0xFC, 0x4E, 0xF1, 0x80, 0xF0, 0x3B, 0xE7, 0x02, 0xF1, + 0x86, 0xF4, 0xD2, 0xF0, 0xEB, 0x06, 0x9C, 0xF6, 0x2B, 0x03, 0x93, 0xF7, + 0x3E, 0xF2, 0x93, 0xF8, 0xC7, 0xEE, 0x7E, 0x06, 0x00, 0xF7, 0x46, 0x08, + 0x80, 0xFC, 0xE7, 0x02, 0x80, 0xF9, 0x69, 0xF9, 0x9A, 0xF6, 0xE6, 0xED, + 0x99, 0xF5, 0xA8, 0xF7, 0xD4, 0xEC, 0x5B, 0x01, 0x6D, 0xE5, 0x27, 0x01, + 0x6E, 0xE2, 0x2D, 0x05, 0x9F, 0xE1, 0xBF, 0xFE, 0xFE, 0xF0, 0x51, 0xF3, + 0x1B, 0xF1, 0x3E, 0xED, 0x89, 0xD4, 0x16, 0xE1, 0xFD, 0xC9, 0x75, 0xD9, + 0x39, 0xDB, 0x5D, 0xEB, 0x27, 0xE6, 0xCA, 0xFD, 0x27, 0xE6, 0xE9, 0xFD, + 0xCA, 0xEE, 0x75, 0x00, 0x54, 0xFB, 0x52, 0xFD, 0xA6, 0x02, 0x27, 0xF8, + 0xA7, 0xF3, 0x9F, 0xF7, 0x61, 0xD7, 0xEA, 0xEE, 0x49, 0xD4, 0x72, 0xEC, + 0x6E, 0xEB, 0x81, 0xED, 0xCD, 0xF7, 0x99, 0xE2, 0x78, 0xEE, 0x22, 0xDC, + 0x41, 0xEB, 0xB5, 0xD9, 0x1B, 0xEC, 0x40, 0xCE, 0x45, 0xE9, 0xB4, 0xC7, + 0x01, 0xEB, 0x09, 0xC8, 0xEA, 0xE8, 0x68, 0xC9, 0xD9, 0xE5, 0x60, 0xCF, + 0xF4, 0xE9, 0x1D, 0xCE, 0x73, 0xE9, 0x19, 0xCB, 0x3B, 0xDE, 0xA0, 0xD5, + 0xA5, 0xD2, 0x66, 0xD9, 0xE5, 0xDA, 0xDB, 0xD9, 0x9E, 0xE6, 0x36, 0xE0, + 0x1E, 0xD8, 0xDC, 0xD2, 0xA8, 0xD0, 0x09, 0xC2, 0x9A, 0xE8, 0x52, 0xC8, + 0x5E, 0xEE, 0x7C, 0xCA, 0xDA, 0xD1, 0x9D, 0xC7, 0x40, 0xC3, 0x7E, 0xD2, + 0xEC, 0xCA, 0x28, 0xDA, 0x52, 0xD7, 0x21, 0xE0, 0x1D, 0xDD, 0xB8, 0xDC, + 0x8D, 0xDD, 0x48, 0xD0, 0xA7, 0xD4, 0xF8, 0xCC, 0xAF, 0xD0, 0xA0, 0xD1, + 0xAF, 0xD9, 0x07, 0xDB, 0x61, 0xD0, 0xAB, 0xE3, 0xD2, 0xBE, 0x50, 0xEE, + 0x8F, 0xC8, 0xF1, 0xFB, 0x8E, 0xE5, 0x93, 0xFD, 0x6D, 0xE4, 0xBB, 0xEB, + 0x46, 0xCF, 0x40, 0xDB, 0x44, 0xD1, 0x8E, 0xDF, 0x73, 0xD5, 0x37, 0xEC, + 0xDA, 0xD8, 0x3F, 0xFC, 0xBB, 0xE7, 0x5D, 0x08, 0xFC, 0xED, 0x91, 0x05, + 0x82, 0xF0, 0x54, 0x0C, 0xC1, 0xF6, 0x5C, 0x13, 0xAC, 0xF6, 0xE5, 0x07, + 0x98, 0xEE, 0x67, 0xF4, 0xED, 0xEE, 0xA9, 0xE4, 0x1F, 0x00, 0xB4, 0xE1, + 0xBE, 0x09, 0x67, 0xE4, 0x92, 0x00, 0xD8, 0xE6, 0x05, 0xF5, 0xFF, 0xEB, + 0x3B, 0xFC, 0x0C, 0xFE, 0xEA, 0x0B, 0x62, 0x0F, 0x4D, 0x0C, 0xD6, 0x0F, + 0x45, 0x0F, 0x2C, 0x08, 0x4E, 0x1B, 0x58, 0x02, 0x26, 0x22, 0x87, 0x01, + 0xFE, 0x23, 0x3F, 0xFF, 0xF6, 0x1D, 0x28, 0xFD, 0xFA, 0x15, 0x02, 0x02, + 0x70, 0x17, 0x6F, 0x0F, 0xA4, 0x19, 0x78, 0x15, 0x8B, 0x14, 0xD9, 0x10, + 0x23, 0x0A, 0xF2, 0x0B, 0xD5, 0x09, 0x69, 0x06, 0x15, 0x16, 0x5B, 0xFD, + 0xEA, 0x18, 0x97, 0xFB, 0x83, 0x0B, 0xB5, 0x0B, 0xAC, 0x02, 0x5B, 0x23, + 0x7D, 0x0E, 0x93, 0x32, 0x1F, 0x27, 0xC7, 0x37, 0x52, 0x29, 0x27, 0x2E, + 0x41, 0x14, 0xB4, 0x1D, 0x9A, 0x0A, 0xBA, 0x1A, 0x1D, 0x0D, 0x9B, 0x1D, + 0xD6, 0x0A, 0x67, 0x16, 0x64, 0x0B, 0x5F, 0x08, 0x78, 0x17, 0x1D, 0x08, + 0xCE, 0x1F, 0xD0, 0x16, 0x56, 0x20, 0x8D, 0x1F, 0x84, 0x18, 0x7A, 0x26, + 0xF6, 0x08, 0x38, 0x30, 0x23, 0x0B, 0x03, 0x25, 0x64, 0x22, 0x78, 0x0E, + 0xBB, 0x1F, 0x74, 0xFE, 0xA9, 0x0C, 0x1F, 0x01, 0x59, 0x19, 0x53, 0x1B, + 0x21, 0x2E, 0x73, 0x29, 0x40, 0x36, 0x74, 0x2B, 0x82, 0x35, 0x5E, 0x25, + 0x28, 0x2B, 0x41, 0x19, 0xE3, 0x1F, 0x98, 0x15, 0xBC, 0x23, 0x24, 0x17, + 0xC9, 0x27, 0x9B, 0x19, 0x8C, 0x17, 0xB5, 0x18, 0xCB, 0x16, 0x7F, 0x1A, + 0x8D, 0x30, 0x65, 0x19, 0x37, 0x33, 0x76, 0x11, 0x8E, 0x18, 0x7B, 0x0E, + 0xEA, 0x0D, 0x6C, 0x14, 0xFC, 0x13, 0xD6, 0x16, 0x7D, 0x0F, 0x4D, 0x0A, + 0xFA, 0x0B, 0xD7, 0x02, 0xA4, 0x0A, 0x81, 0x06, 0x46, 0x00, 0x4A, 0x06, + 0x6B, 0x0C, 0x7E, 0x11, 0x73, 0x17, 0x54, 0x1A, 0xDD, 0x06, 0xCF, 0x14, + 0xE6, 0xF6, 0xD1, 0x18, 0x54, 0xFB, 0xB8, 0x20, 0xAA, 0x04, 0x33, 0x15, + 0x67, 0xF4, 0xF3, 0xF7, 0x59, 0xF0, 0x7A, 0xE7, 0xA5, 0x05, 0xA0, 0xEC, + 0x4A, 0x0B, 0x1C, 0xF6, 0x25, 0xFF, 0x25, 0x03, 0x2C, 0xF9, 0xA1, 0x11, + 0x27, 0xFE, 0xC2, 0x0F, 0x1A, 0x01, 0x91, 0xFE, 0xF4, 0x06, 0x5D, 0xF4, + 0x8B, 0x02, 0x51, 0xF2, 0xA3, 0xEA, 0x0D, 0xF3, 0x01, 0xE6, 0xBB, 0x01, + 0x4F, 0xFC, 0x02, 0x15, 0x38, 0x02, 0x1B, 0x17, 0x05, 0xFC, 0xC3, 0x14, + 0x8F, 0x06, 0x64, 0x15, 0x0D, 0x0E, 0x1C, 0x09, 0x42, 0xFB, 0x17, 0xF7, + 0x99, 0xE6, 0x2E, 0xF2, 0xE9, 0xEB, 0x74, 0xFF, 0x7F, 0xFA, 0xE5, 0x08, + 0x47, 0x02, 0x40, 0xFF, 0x8A, 0x0C, 0xA6, 0xFA, 0xFD, 0x12, 0x85, 0xFC, + 0xE4, 0x10, 0x3F, 0xFB, 0xCB, 0x0A, 0x62, 0xFD, 0xF6, 0xF9, 0x58, 0xF8, + 0x69, 0xEE, 0xA7, 0xF8, 0x24, 0xF5, 0x79, 0x05, 0x5F, 0x0D, 0x84, 0x0F, + 0x50, 0x1D, 0x30, 0x14, 0xFE, 0x13, 0x84, 0x0D, 0x95, 0x0B, 0x89, 0x08, + 0x90, 0x0E, 0x46, 0x10, 0xAA, 0x0B, 0xEF, 0x0F, 0x7D, 0x00, 0x64, 0x08, + 0xBC, 0xF9, 0xC8, 0x02, 0x00, 0xFF, 0x8C, 0x01, 0xE2, 0x09, 0x53, 0x06, + 0x0A, 0x07, 0x54, 0x06, 0x05, 0xF3, 0x70, 0xFE, 0xDE, 0xEF, 0xBF, 0x02, + 0x52, 0x05, 0xB4, 0x0C, 0x81, 0x0F, 0x82, 0xFB, 0x33, 0x11, 0xA5, 0xED, + 0x02, 0x0D, 0x37, 0xF0, 0x49, 0x03, 0x5F, 0xEA, 0x37, 0x03, 0xF4, 0xEF, + 0x5D, 0xFE, 0xE9, 0xFC, 0x4A, 0xF8, 0xC7, 0xFE, 0x8B, 0x03, 0xB1, 0x08, + 0x11, 0x10, 0x45, 0x0F, 0x98, 0x11, 0xA7, 0x03, 0xE0, 0x0C, 0x92, 0xF2, + 0x0F, 0x06, 0x1A, 0xE9, 0x99, 0xF9, 0x3C, 0xF2, 0xF3, 0xEE, 0x66, 0xFF, + 0xBE, 0xF4, 0xAF, 0x02, 0x48, 0xFF, 0x66, 0x08, 0x1D, 0xFD, 0x17, 0x0A, + 0xE4, 0xF3, 0xEB, 0xFF, 0x77, 0xEE, 0x8A, 0xF9, 0x48, 0xE7, 0xDD, 0xEE, + 0x18, 0xEA, 0x34, 0xE4, 0x94, 0x00, 0x03, 0xF3, 0xFF, 0x02, 0x61, 0x00, + 0x85, 0xF4, 0xD6, 0x06, 0x22, 0xE9, 0xC1, 0x0F, 0xC9, 0xE7, 0x2F, 0x17, + 0xE1, 0xF4, 0x03, 0x1B, 0x28, 0xF4, 0x8F, 0x09, 0x86, 0xEE, 0x43, 0xF2, + 0x11, 0xF5, 0xC5, 0xEA, 0x3C, 0xF3, 0xA0, 0xE7, 0x03, 0xED, 0xF7, 0xDF, + 0xD4, 0xF3, 0x27, 0xEB, 0x2B, 0xEE, 0x02, 0xF5, 0xE3, 0xE4, 0x5F, 0xEF, + 0xF4, 0xF8, 0xCF, 0xF8, 0x69, 0xF7, 0xBF, 0xEB, 0x20, 0xDA, 0x32, 0xCF, + 0xEC, 0xE9, 0x9F, 0xE2, 0x0E, 0xF7, 0x8B, 0xE3, 0xA3, 0xEB, 0xE6, 0xC9, + 0x88, 0xF6, 0xD6, 0xD4, 0xE5, 0xF6, 0x81, 0xEC, 0x5A, 0xE5, 0x52, 0xFB, + 0x14, 0xDD, 0x33, 0xF9, 0xE8, 0xEE, 0xDD, 0xF5, 0x58, 0xF6, 0xFC, 0xEE, + 0xAF, 0xDB, 0x4B, 0xD8, 0x17, 0xD7, 0x7F, 0xD1, 0xA6, 0xE8, 0x30, 0xDA, + 0xE8, 0xE9, 0xCD, 0xDB, 0xCE, 0xE1, 0xE8, 0xD9, 0xAF, 0xF2, 0xEE, 0xEA, + 0xB9, 0xF4, 0x8D, 0xEB, 0x50, 0xDE, 0xD0, 0xDB, 0x73, 0xD5, 0x66, 0xDF, + 0xCD, 0xCF, 0x43, 0xD9, 0xB1, 0xD0, 0x3D, 0xC8, 0xD1, 0xDD, 0x69, 0xCE, + 0xC3, 0xEA, 0xDA, 0xEA, 0xD6, 0xDC, 0x34, 0xF6, 0x3A, 0xD9, 0x23, 0x05, + 0x9E, 0xF5, 0x09, 0x1E, 0x1E, 0xF2, 0x26, 0x07, 0xA9, 0xED, 0x5F, 0xF8, + 0x49, 0xFD, 0xF4, 0x08, 0x46, 0xF7, 0xCC, 0xFA, 0x0F, 0xF8, 0xAB, 0xF7, + 0x4C, 0xFA, 0xA4, 0x07, 0x49, 0xF6, 0x7A, 0x01, 0xE0, 0x02, 0x22, 0xF8, + 0x2B, 0x1A, 0xF5, 0xFB, 0x16, 0x21, 0x56, 0xFC, 0x9E, 0x0E, 0x96, 0xF9, + 0xCF, 0x12, 0xF6, 0x0A, 0x35, 0x20, 0x83, 0x0C, 0x8F, 0x21, 0x7B, 0xFF, + 0x33, 0x27, 0x92, 0x0D, 0x28, 0x1B, 0x69, 0x10, 0x98, 0x15, 0x56, 0x0F, + 0xE9, 0x2A, 0xA6, 0x1F, 0xBE, 0x2A, 0x73, 0x1D, 0xCB, 0x0E, 0x02, 0x09, + 0x2D, 0x07, 0xE8, 0x02, 0xC1, 0x1B, 0x0A, 0x12, 0x13, 0x29, 0xB1, 0x17, + 0x4C, 0x26, 0xE6, 0x11, 0xED, 0x2A, 0xD3, 0x1F, 0x51, 0x27, 0xE4, 0x24, + 0xB6, 0x18, 0xE8, 0x1B, 0xF2, 0x0F, 0x49, 0x22, 0x55, 0x03, 0x69, 0x1F, + 0x45, 0x0A, 0x32, 0x1C, 0x29, 0x1C, 0x26, 0x18, 0xEF, 0x20, 0x1D, 0x0B, + 0x5F, 0x14, 0x81, 0x08, 0x00, 0x07, 0xD4, 0x16, 0xE6, 0x10, 0x6B, 0x25, + 0x41, 0x14, 0x4F, 0x26, 0x4C, 0x0B, 0x24, 0x24, 0x89, 0x25, 0xF7, 0x32, + 0xA3, 0x2D, 0xED, 0x2C, 0x04, 0x14, 0xD7, 0x13, 0x70, 0x21, 0xAD, 0x25, + 0xCB, 0x1A, 0xF1, 0x32, 0x82, 0xFF, 0x00, 0x2B, 0x0A, 0x1A, 0xD1, 0x36, + 0xCF, 0x37, 0x78, 0x39, 0xFD, 0x1E, 0xC3, 0x16, 0xB8, 0x11, 0x56, 0x0E, + 0x85, 0x16, 0xF3, 0x1E, 0xC4, 0x04, 0x33, 0x15, 0xF6, 0x07, 0x6C, 0x22, + 0x8A, 0x16, 0xAA, 0x31, 0x10, 0x17, 0x7C, 0x1E, 0x29, 0x28, 0xD8, 0x23, + 0xE0, 0x3E, 0x78, 0x33, 0xDA, 0x3E, 0x83, 0x2E, 0xA4, 0x27, 0x29, 0x2A, + 0x75, 0x0F, 0x32, 0x29, 0x3E, 0x19, 0xBF, 0x2F, 0x01, 0x1E, 0x37, 0x31, + 0x40, 0x0D, 0xB9, 0x24, 0x4A, 0x14, 0xCB, 0x18, 0x1C, 0x1C, 0x18, 0x0F, + 0x9C, 0x1B, 0x21, 0x0C, 0xFE, 0x22, 0xF8, 0x11, 0x21, 0x1C, 0xEE, 0x0C, + 0x63, 0x0F, 0x62, 0xF8, 0xCE, 0x13, 0xD1, 0xEC, 0x4C, 0x26, 0xFE, 0xF4, + 0x2F, 0x20, 0xDE, 0xF2, 0x9A, 0x08, 0xF9, 0xF4, 0xF6, 0x04, 0x3E, 0x03, + 0x99, 0x06, 0x34, 0x05, 0x05, 0x07, 0x02, 0x0B, 0xC4, 0x06, 0x1E, 0x09, + 0x26, 0x09, 0x7D, 0xFA, 0xEF, 0x0F, 0xFF, 0xEF, 0xF9, 0x0C, 0x94, 0xE5, + 0x6B, 0x00, 0xDC, 0xE7, 0xD1, 0xEB, 0x07, 0xF5, 0x90, 0xE5, 0x59, 0xF6, + 0xB1, 0xF1, 0x5E, 0xEF, 0x7C, 0xF0, 0x9E, 0xE4, 0x8E, 0xEA, 0x73, 0xD8, + 0xE3, 0xF1, 0xF2, 0xD7, 0x51, 0xEA, 0x57, 0xDE, 0x0C, 0xD6, 0x8B, 0xDF, + 0x12, 0xCF, 0x55, 0xE9, 0x19, 0xD3, 0x12, 0xFC, 0x7A, 0xDF, 0xFF, 0x02, + 0xF9, 0xE0, 0x52, 0xFA, 0xDA, 0xD2, 0x5F, 0xEB, 0xAC, 0xC8, 0x53, 0xDF, + 0xE2, 0xD3, 0x70, 0xDF, 0xF7, 0xE4, 0xA4, 0xE1, 0x6F, 0xDA, 0xA9, 0xDF, + 0x89, 0xCA, 0xA1, 0xE5, 0xC8, 0xCE, 0x72, 0xEA, 0xBD, 0xD8, 0xEC, 0xEB, + 0x09, 0xD4, 0x2F, 0xEE, 0x80, 0xC8, 0x64, 0xEC, 0xCD, 0xC6, 0xAF, 0xE2, + 0x28, 0xCB, 0xF3, 0xCF, 0x83, 0xDC, 0x95, 0xC8, 0xE1, 0xE3, 0x60, 0xC7, + 0x28, 0xDD, 0xEA, 0xC6, 0xF0, 0xEA, 0xA2, 0xD2, 0x8A, 0xF6, 0xAD, 0xDB, + 0xD5, 0xEA, 0xBA, 0xE1, 0x97, 0xD8, 0x50, 0xE9, 0x9D, 0xD5, 0xCC, 0xEC, + 0xB7, 0xE6, 0x41, 0xE6, 0x99, 0xF4, 0x29, 0xD9, 0xBC, 0xF1, 0xB3, 0xD2, + 0xCE, 0xEE, 0xEA, 0xD3, 0xE6, 0xEE, 0x38, 0xD6, 0x7A, 0xEB, 0x8D, 0xDD, + 0xE5, 0xE9, 0x56, 0xE5, 0xFE, 0xE4, 0x51, 0xE1, 0x12, 0xE9, 0x15, 0xDD, + 0xF0, 0xF4, 0xD8, 0xD8, 0x5D, 0xE9, 0x8F, 0xD0, 0xF7, 0xD7, 0x3C, 0xD7, + 0x09, 0xCB, 0xA8, 0xD2, 0xFD, 0xE0, 0x32, 0xDA, 0xA1, 0x04, 0x64, 0xF3, + 0x1D, 0xF1, 0x80, 0xEE, 0x61, 0xDC, 0xE7, 0xF2, 0xFC, 0xE4, 0xA7, 0x08, + 0x6A, 0xD8, 0xEE, 0xF4, 0xA8, 0xD8, 0xD4, 0xE7, 0xD0, 0xEA, 0x8B, 0xEF, + 0x74, 0xE3, 0x2B, 0xDA, 0x4E, 0xE9, 0xAA, 0xDE, 0xE7, 0x03, 0xAA, 0x04, + 0xD4, 0xF4, 0x88, 0x04, 0x80, 0xD2, 0x94, 0xF5, 0xF1, 0xDD, 0x1B, 0xFA, + 0xB3, 0xEE, 0xA4, 0xF3, 0xA6, 0xE0, 0x37, 0xE7, 0xA4, 0xD4, 0xAF, 0xEE, + 0xF2, 0xE0, 0x80, 0xFC, 0xC5, 0xF6, 0x46, 0x00, 0x38, 0xF8, 0x41, 0xF7, + 0x6D, 0xFD, 0x5D, 0xF9, 0xC4, 0x06, 0x4B, 0x02, 0x27, 0xFA, 0x41, 0xF7, + 0xAC, 0x06, 0x06, 0xFD, 0xFA, 0x1A, 0x63, 0x05, 0x9D, 0x0D, 0x9F, 0xF6, + 0x41, 0x0A, 0x10, 0xF8, 0xA6, 0x1E, 0x75, 0x0F, 0xB3, 0x19, 0x26, 0x0E, + 0x9F, 0x10, 0x90, 0x0F, 0xD4, 0x16, 0x10, 0x17, 0x1D, 0x13, 0x9C, 0x03, + 0xD0, 0x10, 0xF9, 0x00, 0x26, 0x08, 0x5C, 0x00, 0x15, 0xFF, 0x1F, 0xF5, + 0x98, 0x16, 0xB6, 0xFF, 0x8C, 0x28, 0xC1, 0x05, 0xFB, 0x1B, 0xA5, 0x02, + 0x53, 0x1D, 0x9E, 0x1E, 0x0B, 0x11, 0x08, 0x2E, 0xF4, 0xFC, 0xDC, 0x23, + 0x7D, 0x05, 0x52, 0x25, 0x50, 0x08, 0x50, 0x1F, 0x09, 0x03, 0xCB, 0x12, + 0xA3, 0x02, 0x3E, 0x0A, 0xA4, 0x0B, 0x51, 0x08, 0x66, 0x0F, 0xB5, 0x10, + 0x82, 0x05, 0x2D, 0x16, 0x52, 0x0E, 0xEA, 0x16, 0x5C, 0x28, 0xB7, 0x1C, + 0x6D, 0x32, 0x24, 0x15, 0xB7, 0x20, 0xFC, 0xF9, 0x3F, 0x18, 0xA7, 0x01, + 0x3F, 0x14, 0x02, 0x19, 0xAF, 0x07, 0x5A, 0x17, 0x54, 0x17, 0xC5, 0x2A, + 0xE4, 0x16, 0x53, 0x30, 0x17, 0x0E, 0x05, 0x1B, 0x90, 0x27, 0x63, 0x24, + 0x19, 0x28, 0xE1, 0x2A, 0x61, 0x12, 0x30, 0x20, 0x5B, 0x0F, 0xC4, 0x29, + 0xDE, 0x0D, 0xC7, 0x2A, 0x79, 0x16, 0x9E, 0x1C, 0xD2, 0x20, 0x7A, 0x15, + 0xF0, 0x20, 0x4B, 0x17, 0xBC, 0x29, 0xBD, 0x1F, 0xF0, 0x2B, 0x24, 0x1D, + 0x3B, 0x1C, 0x45, 0x10, 0x5C, 0x13, 0x05, 0x13, 0x22, 0x0E, 0x3E, 0x17, + 0xC2, 0x07, 0x89, 0x12, 0x2A, 0x12, 0x1E, 0x15, 0x8D, 0x12, 0xD8, 0x11, + 0x02, 0x02, 0x48, 0x0E, 0x97, 0x0D, 0xB3, 0x1D, 0xE5, 0x21, 0x15, 0x23, + 0x9E, 0x17, 0x96, 0x0C, 0x1E, 0x09, 0xED, 0xFF, 0x76, 0x15, 0x5E, 0x05, + 0x4A, 0x20, 0xDD, 0x02, 0xFD, 0x16, 0xCF, 0x02, 0x16, 0x0A, 0x96, 0x06, + 0x56, 0xF0, 0x93, 0x06, 0xEE, 0xE5, 0x41, 0x13, 0xE4, 0xF2, 0xB6, 0x0F, + 0xFB, 0xF4, 0x61, 0xF0, 0x2F, 0xF7, 0x7F, 0xE3, 0x47, 0xFF, 0x49, 0xDA, + 0x81, 0x03, 0x47, 0xD8, 0x61, 0xFA, 0x41, 0xEC, 0xC3, 0xE3, 0x7E, 0xF1, + 0x6C, 0xE6, 0xD2, 0xF7, 0x83, 0xFB, 0xC5, 0x02, 0x2B, 0x06, 0xA2, 0xF9, + 0xC9, 0xFE, 0xF5, 0xE8, 0x79, 0xF1, 0x2C, 0xEE, 0x85, 0xF4, 0xD1, 0xF1, + 0x3C, 0x00, 0x18, 0xED, 0xCD, 0xFF, 0x91, 0xF4, 0xBE, 0xF8, 0xBF, 0xFF, + 0x04, 0xF1, 0x99, 0xFF, 0x5E, 0xFB, 0x9D, 0x03, 0x54, 0xFE, 0xC1, 0xFC, + 0x64, 0xF4, 0x3A, 0xE9, 0x73, 0xF6, 0x33, 0xEA, 0xC8, 0xFD, 0x16, 0xF6, + 0x36, 0xFF, 0xD1, 0xF0, 0xE1, 0xF7, 0xBA, 0xED, 0x6F, 0xF8, 0xBA, 0x0C, + 0xB6, 0xF8, 0x41, 0x1F, 0x8E, 0xFA, 0xFD, 0x16, 0x25, 0x0A, 0xD9, 0x26, + 0x76, 0x05, 0x59, 0x2A, 0xE4, 0xFA, 0xF1, 0x15, 0x95, 0x05, 0x9F, 0x15, + 0x18, 0x0F, 0xBD, 0x16, 0x0F, 0x16, 0xE1, 0x0A, 0x21, 0x14, 0xD3, 0x07, + 0xAB, 0x0E, 0x66, 0x12, 0x45, 0x16, 0xD0, 0x19, 0xE7, 0x0C, 0x9A, 0x13, + 0x2A, 0xFD, 0x2E, 0x0E, 0x9F, 0x02, 0x39, 0x08, 0x54, 0x0C, 0x77, 0xF9, + 0xB5, 0x16, 0x34, 0xFB, 0x75, 0x12, 0xD2, 0x03, 0xF4, 0x07, 0x43, 0x07, + 0xDC, 0x12, 0x16, 0x10, 0xE1, 0x28, 0x59, 0x1A, 0xF8, 0x2C, 0xBE, 0x17, + 0x97, 0x1E, 0x3C, 0x0C, 0x7C, 0x0F, 0xD8, 0x0A, 0xB7, 0xFE, 0xC9, 0x03, + 0x94, 0x04, 0xEB, 0xFF, 0x45, 0x13, 0x7F, 0x00, 0x8F, 0x0E, 0x1F, 0xFA, + 0x77, 0x12, 0x02, 0xFA, 0xF8, 0x18, 0x1C, 0x08, 0x6C, 0x06, 0x18, 0x10, + 0x69, 0xF3, 0xCF, 0x0A, 0x7C, 0xEF, 0xDD, 0xFD, 0x41, 0xF3, 0xFC, 0xED, + 0xD4, 0xF2, 0x0A, 0xDF, 0xF8, 0xE6, 0xB1, 0xD8, 0xF7, 0xE5, 0x39, 0xEA, + 0x52, 0xEB, 0xC6, 0xFD, 0x5D, 0xEF, 0x4D, 0x07, 0x6F, 0xF3, 0xEA, 0x03, + 0xCC, 0xF7, 0x0E, 0x04, 0xA5, 0xF4, 0x32, 0x09, 0x01, 0xE6, 0x50, 0x02, + 0xDE, 0xEA, 0x61, 0x07, 0x3C, 0xE5, 0x48, 0x01, 0x53, 0xD4, 0xD7, 0xE9, + 0x96, 0xE9, 0x6F, 0xEC, 0x1E, 0xF4, 0x96, 0xF3, 0xDB, 0xEA, 0xF4, 0xEB, + 0x2C, 0xEE, 0xB8, 0xE4, 0x7F, 0xF3, 0x0D, 0xDD, 0x11, 0xFE, 0x37, 0xE0, + 0xCC, 0xFB, 0x74, 0xDF, 0xA9, 0xF1, 0x48, 0xD8, 0x12, 0xFA, 0xE3, 0xE7, + 0xF6, 0xFB, 0x4F, 0xED, 0x39, 0x05, 0x32, 0xEF, 0xC0, 0x0B, 0xA0, 0xFE, + 0x75, 0xF5, 0x4C, 0x00, 0xC4, 0xE5, 0x42, 0xF2, 0x12, 0xED, 0xF2, 0xEC, + 0x60, 0xEE, 0xFB, 0xE8, 0xA3, 0xE4, 0x31, 0xD5, 0x1A, 0xED, 0x5F, 0xD2, + 0x9B, 0xF0, 0x68, 0xDB, 0x12, 0xED, 0x77, 0xDC, 0x2B, 0xFB, 0xF0, 0xEC, + 0x3B, 0xF1, 0x21, 0xFC, 0xAD, 0xE5, 0x14, 0xFA, 0x20, 0xED, 0x99, 0xEC, + 0x55, 0xE5, 0x88, 0xD9, 0x52, 0xDD, 0x4F, 0xD0, 0xFE, 0xDF, 0x3E, 0xDD, + 0x4B, 0xD5, 0x72, 0xE5, 0x17, 0xD2, 0x57, 0xED, 0xE3, 0xE6, 0x91, 0xFC, + 0xC5, 0xE9, 0xB8, 0xF4, 0x32, 0xEF, 0xF1, 0xF3, 0x90, 0xFC, 0x45, 0xF9, + 0xDB, 0xE8, 0x49, 0xE9, 0x18, 0xE4, 0xB0, 0xF1, 0xBB, 0xF6, 0x3D, 0x08, + 0xD6, 0xF7, 0xF2, 0x05, 0x38, 0xFC, 0x9D, 0x05, 0xF0, 0xF3, 0xF5, 0xFF, + 0xA8, 0xF6, 0xAF, 0x06, 0x53, 0xFE, 0xE9, 0x0D, 0x4C, 0xF2, 0xFA, 0x01, + 0x01, 0xF1, 0xDA, 0xFD, 0x2B, 0xE7, 0x95, 0xF8, 0xD8, 0xEA, 0x94, 0xFE, + 0xC3, 0x04, 0x07, 0x0A, 0x00, 0x12, 0xDF, 0x0E, 0x73, 0x11, 0x87, 0x0F, + 0xAA, 0x14, 0x66, 0x13, 0xB3, 0x29, 0x9A, 0x25, 0x63, 0x2A, 0x3D, 0x22, + 0x14, 0x1D, 0x1C, 0x1A, 0xFD, 0x18, 0xB8, 0x22, 0x96, 0x13, 0x03, 0x24, + 0xF3, 0x19, 0x3C, 0x21, 0x80, 0x1B, 0x76, 0x18, 0x1D, 0x1C, 0x9F, 0x18, + 0xCC, 0x2D, 0x6E, 0x29, 0x3A, 0x2A, 0x6B, 0x28, 0x32, 0x2D, 0xFA, 0x1F, + 0x50, 0x38, 0x5F, 0x18, 0xC7, 0x2B, 0x99, 0x0B, 0x23, 0x2D, 0x0A, 0x0E, + 0xA1, 0x25, 0xF7, 0x0D, 0x55, 0x20, 0x3F, 0x21, 0x08, 0x25, 0x38, 0x36, + 0x6F, 0x25, 0x84, 0x2B, 0xD4, 0x3E, 0x8D, 0x2F, 0x67, 0x40, 0x42, 0x24, + 0xD3, 0x29, 0x65, 0x0A, 0x66, 0x20, 0xB0, 0x0E, 0x48, 0x19, 0x24, 0x18, + 0x2D, 0x0F, 0xB7, 0x0C, 0xB9, 0x14, 0x74, 0x10, 0x5E, 0x20, 0xC5, 0x1E, + 0x28, 0x20, 0x5C, 0x19, 0xC4, 0x21, 0x09, 0x0D, 0x78, 0x20, 0x83, 0x02, + 0x19, 0x23, 0xB9, 0x0A, 0x35, 0x22, 0xCD, 0x0E, 0x51, 0x12, 0x7D, 0x04, + 0x38, 0x0D, 0x46, 0x11, 0x64, 0x03, 0xA1, 0x1B, 0x57, 0xF6, 0x9F, 0x20, + 0x74, 0xF7, 0xBA, 0x28, 0xC8, 0xFF, 0x57, 0x24, 0xE3, 0x0A, 0xBB, 0x1C, + 0x4B, 0x07, 0xF8, 0x12, 0xF8, 0xFB, 0x59, 0x0F, 0xD8, 0xFE, 0x16, 0x16, + 0xBD, 0x00, 0x54, 0x16, 0xDE, 0xFF, 0xCB, 0x15, 0xE1, 0xF8, 0xA5, 0x13, + 0xA7, 0xF0, 0x25, 0x12, 0x03, 0xF8, 0x66, 0x1A, 0xC4, 0xFC, 0x59, 0x1F, + 0xB5, 0xF8, 0x4E, 0x0A, 0xD5, 0x06, 0x1D, 0xF6, 0x9F, 0x13, 0x46, 0xF2, + 0x6A, 0x04, 0x54, 0xE8, 0xFC, 0xFF, 0x7A, 0xF5, 0x10, 0x00, 0x14, 0x0F, + 0x67, 0xFA, 0xEA, 0x0F, 0x4B, 0x15, 0xC2, 0x11, 0x38, 0x22, 0xAD, 0x0B, + 0x2D, 0x0C, 0x13, 0xFC, 0xCB, 0x02, 0xC0, 0xF8, 0x76, 0xFC, 0x83, 0xF2, + 0x0F, 0xFA, 0x12, 0xF1, 0x75, 0xFA, 0xF9, 0xE8, 0x7E, 0x05, 0x95, 0xE9, + 0x6C, 0x13, 0xA5, 0xFA, 0x95, 0x0C, 0x58, 0xFC, 0xDA, 0x01, 0x03, 0xF8, + 0x44, 0xFD, 0xB3, 0xF8, 0x62, 0xF5, 0x9F, 0xF0, 0x5B, 0xF3, 0x45, 0xE1, + 0x8B, 0xF1, 0x1C, 0xD8, 0x8D, 0xE7, 0xFD, 0xE2, 0x91, 0xE0, 0x1C, 0xF6, + 0x93, 0xDF, 0xE8, 0xFB, 0x81, 0xEA, 0x79, 0xFD, 0x0A, 0xF0, 0xA0, 0xF1, + 0xD0, 0xEF, 0x3E, 0xE0, 0x7B, 0xEA, 0x0A, 0xDA, 0x8D, 0xEB, 0xA4, 0xE6, + 0x27, 0xEC, 0xA1, 0xEA, 0xD5, 0xDC, 0xA5, 0xD8, 0x1E, 0xE9, 0x80, 0xE3, + 0x41, 0xF0, 0x2F, 0xE7, 0xE7, 0xDF, 0x7E, 0xD8, 0x40, 0xDF, 0x4F, 0xE7, + 0x02, 0xCC, 0x70, 0xE2, 0xC5, 0xBD, 0x2D, 0xD0, 0xB6, 0xCE, 0x03, 0xD2, + 0xE6, 0xD7, 0xCC, 0xD4, 0x30, 0xD7, 0xAE, 0xD8, 0xE0, 0xCE, 0x5A, 0xD7, + 0xC8, 0xD3, 0x64, 0xE1, 0x85, 0xE9, 0x44, 0xF4, 0xC9, 0xEC, 0x39, 0xF0, + 0x1C, 0xE5, 0x2A, 0xE7, 0xDA, 0xE8, 0x37, 0xEA, 0x55, 0xF3, 0xB8, 0xEB, + 0xAD, 0xE8, 0xFE, 0xDB, 0xEE, 0xE0, 0x78, 0xDA, 0xF6, 0xEB, 0xA7, 0xE7, + 0xA5, 0xDA, 0xD2, 0xD0, 0xEE, 0xDC, 0xFB, 0xD3, 0x1B, 0xE9, 0xBC, 0xE6, + 0x7F, 0xD9, 0x03, 0xD8, 0x0D, 0xDB, 0xBB, 0xD1, 0x3F, 0xE8, 0xBD, 0xD0, + 0x7A, 0xE5, 0x39, 0xC3, 0xAA, 0xDE, 0xC2, 0xC5, 0x79, 0xE6, 0x50, 0xE8, + 0x02, 0xF0, 0x83, 0x04, 0x9F, 0xF1, 0xD0, 0x06, 0xED, 0xF0, 0x02, 0x00, + 0xFE, 0xE9, 0xF1, 0xEE, 0xBC, 0xEB, 0x24, 0xE5, 0xAA, 0xDE, 0x7E, 0xDB, + 0xA0, 0xC9, 0xED, 0xD8, 0xC7, 0xCE, 0x7E, 0xE9, 0x9F, 0xD9, 0x15, 0xF0, + 0x00, 0xE9, 0x56, 0xF3, 0x5E, 0xFC, 0x19, 0xF9, 0x02, 0xFD, 0x17, 0xF4, + 0xEB, 0xF7, 0x3E, 0xF6, 0xF7, 0xF5, 0x9B, 0xFA, 0xC9, 0xFC, 0x7A, 0x00, + 0x17, 0xF7, 0xEE, 0xFF, 0x02, 0xF6, 0xAF, 0x06, 0x5C, 0x24, 0xBC, 0x2D, + 0x0B, 0x3F, 0x02, 0x39, 0x66, 0x42, 0xAD, 0x38, 0x3F, 0x54, 0xEA, 0x51, + 0xDF, 0x64, 0x9B, 0x6A, 0x0D, 0x56, 0x70, 0x60, 0x03, 0x40, 0x25, 0x48, + 0xE1, 0x45, 0x6D, 0x48, 0x6F, 0x37, 0xC7, 0x3A, 0x18, 0x1A, 0x7D, 0x1F, + 0x01, 0x17, 0xBF, 0x16, 0x3A, 0x10, 0x91, 0x0C, 0xFC, 0x06, 0x0A, 0x0B, + 0x3D, 0x06, 0x8A, 0x0F, 0xB6, 0x0A, 0x0C, 0x0D, 0xFC, 0x09, 0xF2, 0x03, + 0x56, 0xFD, 0xA6, 0xF3, 0x17, 0xE9, 0xDB, 0xDF, 0xA3, 0xDD, 0x82, 0xDD, + 0xC6, 0xD4, 0xB7, 0xE3, 0x40, 0xBD, 0x34, 0xD4, 0xC7, 0xD1, 0x6F, 0xE2, + 0x06, 0xFC, 0xF0, 0xFC, 0xA7, 0x0B, 0x33, 0xFA, 0x7A, 0x1E, 0x77, 0x05, + 0x83, 0x11, 0x76, 0x08, 0xBB, 0xE8, 0x49, 0xF6, 0x4B, 0xE8, 0xBA, 0xFA, + 0x04, 0x05, 0xDB, 0x0D, 0xA4, 0x10, 0x90, 0x10, 0x82, 0x18, 0xF5, 0x0D, + 0x29, 0x2C, 0x74, 0x10, 0x94, 0x37, 0x1F, 0x14, 0x46, 0x35, 0x0F, 0x1A, + 0xDB, 0x39, 0x46, 0x2A, 0x5A, 0x4F, 0x50, 0x47, 0x1C, 0x3A, 0x6F, 0x33, + 0xD6, 0x24, 0xAE, 0x1C, 0x3F, 0x4C, 0xC4, 0x46, 0x22, 0x58, 0x37, 0x5B, + 0x87, 0x24, 0xAD, 0x26, 0x44, 0x16, 0x76, 0x06, 0x92, 0x36, 0x6C, 0x1B, + 0xD7, 0x20, 0xB5, 0x0A, 0xCE, 0x00, 0x17, 0xF4, 0x40, 0x0E, 0x46, 0x09, + 0x3A, 0xFD, 0xCC, 0xFD, 0xDD, 0xCF, 0x36, 0xD4, 0x26, 0xC9, 0x7A, 0xD0, + 0xC6, 0xCA, 0x75, 0xD7, 0x71, 0xBB, 0xDD, 0xC3, 0x79, 0xC7, 0x5F, 0xC0, + 0x24, 0xEB, 0x41, 0xE0, 0x2D, 0xDB, 0xFE, 0xD4, 0x43, 0xD6, 0x6B, 0xD2, + 0xD8, 0xF4, 0xFB, 0xFC, 0x65, 0xDA, 0xA3, 0xFC, 0x98, 0xC7, 0xDC, 0xF7, + 0x05, 0xF4, 0x0F, 0x15, 0x3F, 0x19, 0xBC, 0x26, 0xAF, 0x11, 0x0D, 0x12, + 0x9D, 0xEE, 0x2B, 0xE7, 0x9A, 0xF3, 0x94, 0xF4, 0x64, 0x0F, 0x3A, 0x1D, + 0x4F, 0xFF, 0xC7, 0x0D, 0x8C, 0xF5, 0x62, 0xFC, 0xAE, 0xFC, 0xEC, 0x00, + 0x13, 0xF8, 0x05, 0xF8, 0x55, 0xEF, 0x98, 0xE6, 0xDA, 0xDC, 0xC8, 0xDB, + 0xE7, 0xC9, 0xF4, 0xD2, 0x80, 0xCF, 0x66, 0xD1, 0x73, 0xDC, 0x83, 0xD1, + 0xEE, 0xD3, 0xF9, 0xC5, 0xB8, 0xC4, 0x76, 0xC3, 0x51, 0xB4, 0x22, 0xC3, + 0xAC, 0xAA, 0x88, 0xC0, 0x1A, 0xAE, 0x00, 0xB9, 0x0D, 0xAB, 0x24, 0xA7, + 0xE4, 0xA2, 0xE5, 0x9F, 0x04, 0xAB, 0x44, 0xA4, 0xE8, 0xB8, 0xC8, 0xA8, + 0x60, 0xC2, 0x26, 0xB5, 0x85, 0xCA, 0x20, 0xC4, 0x7A, 0xD0, 0x9F, 0xC4, + 0x01, 0xE5, 0xBB, 0xCE, 0xDF, 0xEF, 0x40, 0xE2, 0x8D, 0xD7, 0x7F, 0xD6, + 0x96, 0xC1, 0xBF, 0xC1, 0xBF, 0xB5, 0xBE, 0xB4, 0x0A, 0xB4, 0xA3, 0xAD, + 0x30, 0xCD, 0x56, 0xC7, 0xE6, 0xDE, 0xCF, 0xE4, 0x50, 0xE6, 0x96, 0xFA, + 0xB4, 0xF8, 0xFE, 0x0F, 0xED, 0x07, 0x54, 0x18, 0x61, 0x0B, 0x50, 0x1F, + 0x47, 0x07, 0x00, 0x1D, 0xA9, 0xFE, 0xFF, 0x0B, 0x9D, 0x07, 0xF1, 0x0C, + 0x06, 0x16, 0x17, 0x1B, 0x47, 0x15, 0x60, 0x23, 0xDC, 0x22, 0xD7, 0x2F, + 0x69, 0x3F, 0x13, 0x42, 0xD2, 0x38, 0x61, 0x32, 0x02, 0x27, 0xBF, 0x18, + 0x38, 0x37, 0x66, 0x21, 0x7D, 0x3D, 0xE4, 0x1B, 0x90, 0x2B, 0xB0, 0x0A, + 0xF0, 0x1F, 0xC0, 0x0A, 0xBB, 0x1F, 0xF4, 0x12, 0x68, 0x1F, 0x7F, 0x19, + 0xB4, 0x14, 0xAA, 0x11, 0xA2, 0x09, 0xE8, 0x07, 0xDA, 0x0F, 0x91, 0x03, + 0x8E, 0x11, 0x44, 0xF3, 0xDC, 0x11, 0x54, 0xEF, 0xC6, 0x25, 0x4C, 0x0E, + 0xB5, 0x32, 0xEE, 0x31, 0x9F, 0x31, 0xEE, 0x41, 0x6F, 0x37, 0x3E, 0x4C, + 0xF5, 0x3C, 0xF0, 0x47, 0xEF, 0x3E, 0x15, 0x37, 0xC8, 0x38, 0x6A, 0x31, + 0x8B, 0x28, 0xB2, 0x2B, 0xE3, 0x2C, 0x6C, 0x30, 0x01, 0x36, 0x00, 0x37, + 0xC7, 0x2D, 0x08, 0x38, 0xC6, 0x37, 0xDD, 0x4E, 0x98, 0x50, 0xD6, 0x5C, + 0x9D, 0x57, 0x82, 0x52, 0x4A, 0x58, 0xCF, 0x4D, 0xFA, 0x56, 0xA4, 0x4F, + 0x7E, 0x44, 0x1E, 0x4C, 0xF0, 0x36, 0x7A, 0x4A, 0x2E, 0x3E, 0x1F, 0x4F, + 0x0D, 0x57, 0xE5, 0x5A, 0xC8, 0x58, 0xE2, 0x57, 0x04, 0x4A, 0x6F, 0x51, + 0xCC, 0x50, 0x8F, 0x5D, 0xE9, 0x35, 0xA4, 0x49, 0x0E, 0x1E, 0x0D, 0x33, + 0x11, 0x29, 0x76, 0x37, 0xB3, 0x28, 0x36, 0x36, 0x96, 0x27, 0xE6, 0x33, + 0x85, 0x2E, 0x82, 0x35, 0x35, 0x47, 0xD5, 0x47, 0xDD, 0x5A, 0x26, 0x5C, + 0x3F, 0x59, 0xC8, 0x5C, 0x74, 0x5A, 0x9B, 0x5E, 0x82, 0x57, 0x2D, 0x60, + 0x94, 0x52, 0x0B, 0x4F, 0x7F, 0x58, 0xB5, 0x44, 0xF8, 0x47, 0xDB, 0x42, + 0xF9, 0x29, 0xE3, 0x41, 0x04, 0x25, 0x8B, 0x41, 0x7A, 0x2B, 0xB6, 0x34, + 0x6F, 0x2B, 0xAD, 0x2C, 0x25, 0x28, 0x8E, 0x2A, 0xA8, 0x23, 0xEB, 0x1E, + 0xDC, 0x20, 0x52, 0x11, 0xB4, 0x2D, 0x61, 0x13, 0xB3, 0x29, 0xCC, 0x15, + 0x40, 0x10, 0xA8, 0x14, 0x42, 0x0E, 0x28, 0x20, 0x9E, 0x13, 0x09, 0x1B, + 0x51, 0x07, 0x70, 0xFF, 0x1D, 0xF0, 0xBB, 0xE6, 0x94, 0xE9, 0x52, 0xDD, + 0xEF, 0xF5, 0x77, 0xE0, 0xF3, 0xE4, 0xBB, 0xC8, 0x23, 0xC8, 0x74, 0xA9, + 0xA7, 0xC2, 0x32, 0xB0, 0x99, 0xC7, 0x25, 0xC5, 0x37, 0xD1, 0x5E, 0xCC, + 0x79, 0xD7, 0x1D, 0xC6, 0xBF, 0xC8, 0x6A, 0xB6, 0xCA, 0xB3, 0xCF, 0xA4, + 0xE4, 0xB3, 0x99, 0x9D, 0xDF, 0xB4, 0x22, 0xA2, 0xFC, 0xA8, 0x3F, 0xA9, + 0x65, 0xAA, 0xBF, 0xB3, 0x45, 0xBA, 0x1C, 0xC4, 0xE7, 0xBA, 0xDE, 0xC6, + 0x30, 0xAC, 0x48, 0xB8, 0xE7, 0xAC, 0x9F, 0xB8, 0xA5, 0xA5, 0x4B, 0xB5, + 0x41, 0xA6, 0xF4, 0xB1, 0xAB, 0xBD, 0xA9, 0xBB, 0x1E, 0xBB, 0xAA, 0xB9, + 0xC9, 0xB0, 0xCD, 0xBD, 0x1F, 0xC3, 0xDC, 0xDC, 0x19, 0xC9, 0x5A, 0xF1, + 0x63, 0xB6, 0xBD, 0xE7, 0xC8, 0xC0, 0x51, 0xE5, 0x61, 0xD5, 0x78, 0xE3, + 0x2F, 0xD2, 0x19, 0xD4, 0x91, 0xD9, 0x3C, 0xD6, 0xEE, 0xE8, 0xBF, 0xE6, + 0x51, 0xEB, 0x6A, 0xF0, 0x5D, 0xFD, 0xBE, 0xFA, 0xB4, 0x18, 0x87, 0x03, + 0x05, 0x19, 0x96, 0x09, 0x71, 0x09, 0xAE, 0x0F, 0x94, 0x01, 0x45, 0x08, + 0xA8, 0x07, 0x93, 0x01, 0x08, 0x0A, 0xF8, 0xFB, 0x07, 0x05, 0x51, 0xEB, + 0x28, 0x06, 0x0F, 0xE3, 0x50, 0x07, 0xB3, 0xEB, 0xF4, 0x08, 0xC0, 0xF6, + 0x66, 0x0A, 0x0F, 0xF6, 0xE7, 0xFF, 0x44, 0xEC, 0xDD, 0xF8, 0xBE, 0xE3, + 0x9E, 0x03, 0x33, 0xE2, 0x7D, 0x0A, 0xD2, 0xEB, 0xA9, 0x0D, 0xCD, 0x02, + 0x99, 0x19, 0x7B, 0x15, 0x0B, 0x19, 0x1F, 0x0F, 0x9B, 0x23, 0x99, 0x1F, + 0x73, 0x36, 0x10, 0x40, 0xAC, 0x39, 0xDF, 0x47, 0xBD, 0x37, 0xAE, 0x49, + 0x2F, 0x2D, 0xDC, 0x3D, 0x4E, 0x2D, 0xEF, 0x32, 0x40, 0x36, 0xDB, 0x37, + 0xBC, 0x38, 0x22, 0x3A, 0x06, 0x36, 0x59, 0x31, 0x4E, 0x34, 0x85, 0x2D, + 0x92, 0x30, 0x3E, 0x34, 0x13, 0x2C, 0x63, 0x32, 0x62, 0x1F, 0xE3, 0x19, + 0x40, 0x0C, 0xD3, 0x07, 0x5E, 0xFB, 0x0F, 0xFE, 0xE1, 0xEE, 0x29, 0xEC, + 0x85, 0x01, 0x5C, 0xF8, 0x33, 0x13, 0xE1, 0x0A, 0xFF, 0xF4, 0x42, 0xF1, + 0x6C, 0xD8, 0x4D, 0xDB, 0x68, 0xD9, 0x71, 0xEC, 0xA4, 0xD5, 0xD7, 0xEE, + 0x5F, 0xCF, 0x6B, 0xD4, 0xF6, 0xD8, 0x4F, 0xC9, 0x06, 0xE3, 0xA7, 0xC8, + 0xCC, 0xDB, 0x7D, 0xBB, 0xEA, 0xD0, 0xD7, 0xAF, 0x8D, 0xD6, 0x0D, 0xC3, + 0x8B, 0xDF, 0x58, 0xE1, 0x1A, 0xE6, 0x68, 0xEB, 0x5D, 0xFA, 0x2A, 0xF8, + 0x0A, 0x06, 0x66, 0xFD, 0xA7, 0xF3, 0x50, 0xE6, 0xEB, 0xF7, 0xF6, 0xE9, + 0x95, 0x0E, 0xA3, 0x01, 0x82, 0xFD, 0xEB, 0xF8, 0x13, 0xFE, 0xB5, 0x03, + 0x55, 0x0F, 0x89, 0x1E, 0x87, 0x07, 0xAE, 0x1A, 0xBA, 0x16, 0xED, 0x1E, + 0xD5, 0x21, 0xBA, 0x22, 0xC4, 0x0A, 0xD4, 0x0C, 0xE4, 0xFF, 0xE5, 0x07, + 0xA2, 0xFC, 0xB2, 0x0B, 0x09, 0xEF, 0xE8, 0xFD, 0xF1, 0xEB, 0x07, 0xF2, + 0x3D, 0xF0, 0x95, 0xE7, 0xFC, 0xE6, 0xB4, 0xDD, 0xDE, 0xE0, 0x1C, 0xDD, + 0x1D, 0xDC, 0x76, 0xD3, 0x5B, 0xD2, 0xA4, 0xCD, 0x10, 0xD7, 0xAC, 0xD8, + 0xBB, 0xE4, 0xFC, 0xDB, 0x38, 0xF0, 0x57, 0xD9, 0x79, 0xED, 0x94, 0xE0, + 0x84, 0xE0, 0x8D, 0xE5, 0xDD, 0xE8, 0xF3, 0xE5, 0xC5, 0xD9, 0x63, 0xD9, + 0x7C, 0xB6, 0xE6, 0xD1, 0xAD, 0xB6, 0x07, 0xE1, 0x5B, 0xBB, 0xFB, 0xD7, + 0xE9, 0xC2, 0x9D, 0xC6, 0x07, 0xCF, 0xFA, 0xC9, 0xA3, 0xC4, 0x22, 0xCC, + 0x67, 0xB1, 0x70, 0xD3, 0xC0, 0xB1, 0x06, 0xDD, 0xC0, 0xBA, 0x44, 0xCF, + 0x33, 0xC6, 0x79, 0xCE, 0x3C, 0xD7, 0xA7, 0xE4, 0xFD, 0xD5, 0x0A, 0xE4, + 0x21, 0xCE, 0x45, 0xDD, 0x01, 0xCE, 0xBC, 0xE8, 0x0E, 0xD3, 0x5F, 0xFD, + 0x9D, 0xE6, 0x96, 0x0E, 0xE1, 0xF9, 0x4A, 0x11, 0xCF, 0xFE, 0xDF, 0xFA, + 0x50, 0xFC, 0xB5, 0xE8, 0xF8, 0xE8, 0x6F, 0xE9, 0x4C, 0xCE, 0x4D, 0xDC, + 0xED, 0xC5, 0x8A, 0xC5, 0x19, 0xC5, 0xA5, 0xC1, 0x51, 0xBF, 0xF3, 0xD2, + 0x56, 0xBA, 0x12, 0xD9, 0x33, 0xBF, 0x3D, 0xD2, 0x0D, 0xC5, 0xF6, 0xDA, + 0x2B, 0xC5, 0xD8, 0xDC, 0x93, 0xC4, 0x6C, 0xC7, 0xA1, 0xBB, 0xDD, 0xAE, + 0x6D, 0xBA, 0x01, 0xAA, 0x08, 0xC3, 0x80, 0xB7, 0x71, 0xC5, 0x35, 0xC9, + 0xE8, 0xCA, 0x73, 0xDE, 0x4E, 0xDE, 0x0E, 0xE4, 0x52, 0xE8, 0xC8, 0xD0, + 0x14, 0xE6, 0x0A, 0xD1, 0x30, 0xE5, 0xC7, 0xDD, 0x02, 0xDE, 0xA0, 0xD4, + 0x8A, 0xD4, 0x06, 0xC9, 0x8F, 0xDF, 0x7E, 0xD9, 0x37, 0xF7, 0x8A, 0xFA, + 0x0C, 0xF1, 0x9D, 0x02, 0xEF, 0xE4, 0x43, 0x06, 0xCB, 0xF1, 0xEC, 0x0E, + 0x51, 0xF4, 0xFE, 0x00, 0x1C, 0xED, 0xF0, 0xF3, 0x2E, 0xFD, 0x34, 0xEE, + 0x06, 0x0A, 0x76, 0xD8, 0x42, 0x0E, 0x83, 0xD6, 0x66, 0x10, 0x5A, 0xF4, + 0xE9, 0x04, 0xA2, 0x03, 0x31, 0xF7, 0xEB, 0x04, 0x1D, 0xEE, 0xD1, 0x0D, + 0x79, 0xEA, 0x52, 0x0C, 0xB8, 0xDF, 0x66, 0xED, 0x04, 0xD5, 0x6B, 0xD0, + 0x04, 0xE2, 0xF5, 0xD0, 0xE2, 0xE6, 0x66, 0xCD, 0xE9, 0xD9, 0xF1, 0xC1, + 0xC1, 0xE5, 0xEB, 0xD8, 0xB2, 0xE9, 0x00, 0xE3, 0xE9, 0xE9, 0xD8, 0xE0, + 0x2C, 0x02, 0x24, 0xFB, 0x01, 0x00, 0x5C, 0xF3, 0xE6, 0xFF, 0x8A, 0xE4, + 0x65, 0x11, 0xFD, 0xEE, 0xF2, 0x04, 0x87, 0xE9, 0x4E, 0xFB, 0xB6, 0xEE, + 0xE5, 0x0D, 0x7D, 0x0B, 0x21, 0x1B, 0x59, 0x19, 0xD2, 0x1B, 0xC6, 0x11, + 0x0A, 0x18, 0x4B, 0x0D, 0xA0, 0x12, 0x8F, 0x16, 0xA3, 0x12, 0x92, 0x1C, + 0x98, 0x1C, 0xE5, 0x1C, 0x1A, 0x2B, 0x99, 0x25, 0xBD, 0x35, 0x76, 0x31, + 0x97, 0x46, 0xB3, 0x3D, 0x73, 0x50, 0x2D, 0x42, 0xA6, 0x4C, 0xBC, 0x4A, + 0xB6, 0x50, 0x09, 0x5D, 0x08, 0x52, 0x2A, 0x5D, 0x18, 0x54, 0xD1, 0x59, + 0xE2, 0x59, 0x38, 0x5B, 0xC2, 0x4C, 0x64, 0x46, 0x79, 0x45, 0x91, 0x39, + 0x72, 0x54, 0x7C, 0x50, 0xA4, 0x5D, 0x52, 0x63, 0x01, 0x58, 0x86, 0x5F, + 0xA4, 0x4D, 0x3A, 0x58, 0xC9, 0x45, 0xDB, 0x51, 0x7C, 0x38, 0x50, 0x39, + 0xBC, 0x31, 0x8F, 0x23, 0xE6, 0x37, 0x31, 0x24, 0x75, 0x2F, 0x55, 0x21, + 0x68, 0x26, 0xB8, 0x24, 0x0A, 0x1E, 0x85, 0x2F, 0x5D, 0x0E, 0x27, 0x2D, + 0x3B, 0x13, 0x2D, 0x2B, 0xCE, 0x26, 0x41, 0x27, 0x20, 0x33, 0x22, 0x18, + 0x18, 0x3D, 0x87, 0x10, 0x9C, 0x3D, 0xA7, 0x0C, 0x90, 0x3D, 0xBB, 0x13, + 0xC8, 0x44, 0xD9, 0x2B, 0x98, 0x3C, 0x07, 0x39, 0x9A, 0x38, 0x3E, 0x3D, + 0x40, 0x40, 0x33, 0x39, 0x2A, 0x47, 0x89, 0x2F, 0x44, 0x4E, 0xDF, 0x2D, + 0x70, 0x54, 0xFE, 0x2F, 0x5F, 0x51, 0xE7, 0x31, 0xE9, 0x43, 0x27, 0x2F, + 0xFD, 0x44, 0xD2, 0x30, 0x0B, 0x4E, 0x8B, 0x36, 0x40, 0x40, 0x89, 0x35, + 0xF7, 0x37, 0xBC, 0x3B, 0x8B, 0x3C, 0xDD, 0x3A, 0x90, 0x30, 0xA3, 0x30, + 0x07, 0x1B, 0x68, 0x38, 0x7E, 0x0C, 0x0D, 0x40, 0x07, 0x16, 0x3C, 0x3B, + 0xB4, 0x1E, 0xF0, 0x2A, 0x54, 0x1F, 0xFC, 0x22, 0xA0, 0x1F, 0x2E, 0x28, + 0x1F, 0x0D, 0xFF, 0x17, 0xE6, 0x02, 0x27, 0x06, 0x38, 0x09, 0xB0, 0x02, + 0x9C, 0x01, 0x91, 0xFF, 0x5F, 0xFC, 0x3D, 0x04, 0x61, 0x0D, 0x52, 0x0E, + 0x58, 0x1C, 0x6D, 0x10, 0xE9, 0x0A, 0x7B, 0x07, 0xB1, 0xF1, 0x35, 0x05, + 0x6B, 0xEA, 0x42, 0x07, 0x8A, 0xF3, 0x47, 0x03, 0xEF, 0x0C, 0x6C, 0x04, + 0xB2, 0x17, 0xDB, 0x04, 0xC9, 0x05, 0xED, 0x02, 0xB1, 0xFA, 0xCC, 0x04, + 0x74, 0x0C, 0xD0, 0x02, 0xD7, 0x1A, 0x19, 0xFE, 0xF1, 0x13, 0x24, 0x09, + 0xAF, 0x18, 0x71, 0x20, 0xBC, 0x29, 0x68, 0x1C, 0x92, 0x32, 0x84, 0x0B, + 0xA5, 0x2C, 0x53, 0x10, 0xEA, 0x17, 0x3E, 0x14, 0x60, 0x10, 0x9F, 0x14, + 0x30, 0x21, 0x54, 0x20, 0x4F, 0x2F, 0x6E, 0x28, 0xCA, 0x2F, 0x55, 0x27, + 0xE0, 0x27, 0x1C, 0x24, 0xF6, 0x28, 0xB0, 0x21, 0x6C, 0x36, 0x79, 0x1A, + 0x88, 0x37, 0x78, 0x06, 0xFF, 0x32, 0x0F, 0xF8, 0x79, 0x32, 0x32, 0xED, + 0x6C, 0x2F, 0x70, 0xEA, 0xE9, 0x1A, 0xE7, 0xF5, 0xC0, 0xFA, 0x1A, 0xFE, + 0xBE, 0xF6, 0x30, 0x02, 0xD9, 0x00, 0xA5, 0xF6, 0x8A, 0x02, 0x93, 0xE1, + 0x26, 0x02, 0xB0, 0xD9, 0x9A, 0xFA, 0x05, 0xE2, 0xA3, 0xF0, 0x8B, 0xF1, + 0x50, 0xF4, 0x79, 0xF8, 0xCF, 0xFB, 0x5D, 0xEE, 0x49, 0xF1, 0x37, 0xE4, + 0x07, 0xED, 0xC5, 0xEE, 0x20, 0xF7, 0x0D, 0xF6, 0xB8, 0xFD, 0x58, 0xED, + 0x7C, 0xFD, 0x35, 0xEB, 0xBD, 0xF9, 0x32, 0xED, 0xB6, 0xF3, 0xEC, 0xE8, + 0x94, 0xE9, 0xB3, 0xEC, 0xE8, 0xDE, 0x53, 0xFD, 0x08, 0xD3, 0xEA, 0x04, + 0x7A, 0xCF, 0xAC, 0x00, 0xD5, 0xDC, 0xAB, 0xFD, 0x47, 0xEC, 0x63, 0xFD, + 0x2E, 0xEA, 0xE0, 0xFA, 0xFA, 0xE0, 0x03, 0xFD, 0xC8, 0xE2, 0x04, 0x06, + 0x26, 0xEB, 0xF6, 0x0D, 0x90, 0xED, 0x39, 0x11, 0xAD, 0xEE, 0x60, 0x0F, + 0xC4, 0xEB, 0xC8, 0x0A, 0x8B, 0xEB, 0x6A, 0x13, 0x73, 0xEE, 0x5C, 0x1F, + 0xF6, 0xE7, 0x3B, 0x17, 0x61, 0xDF, 0xB8, 0x07, 0xE9, 0xE6, 0x0D, 0x07, + 0xE6, 0xFF, 0xF6, 0x14, 0x78, 0x00, 0x27, 0x19, 0x82, 0xEC, 0xCA, 0x1D, + 0xDB, 0xDF, 0xB1, 0x1F, 0x33, 0xD5, 0x46, 0x06, 0xAF, 0xD0, 0x79, 0xEA, + 0xC6, 0xD2, 0xA9, 0xD8, 0x7E, 0xDF, 0xF6, 0xD8, 0x6C, 0xF5, 0x08, 0xED, + 0x7F, 0xF3, 0xD3, 0xEE, 0x0B, 0xE6, 0xC8, 0xE2, 0x08, 0xDF, 0x1B, 0xE5, + 0xEA, 0xCD, 0x12, 0xE8, 0x04, 0xD1, 0xBE, 0xEB, 0xE4, 0xE5, 0x7A, 0xE7, + 0x7D, 0xDF, 0x13, 0xCC, 0xFA, 0xDA, 0x9C, 0xBE, 0xC7, 0xE8, 0x43, 0xCB, + 0x47, 0xE9, 0x35, 0xD8, 0x34, 0xE3, 0x94, 0xE6, 0x55, 0xE9, 0xB6, 0xF5, + 0x36, 0xF5, 0x72, 0xFB, 0x9B, 0xF2, 0x41, 0xF9, 0x2C, 0xE5, 0xC1, 0xEB, + 0x5F, 0xD3, 0x68, 0xD1, 0x33, 0xC7, 0xC6, 0xBB, 0xCA, 0xCD, 0xD4, 0xBD, + 0x35, 0xD8, 0x99, 0xCC, 0x3A, 0xDE, 0x0C, 0xD7, 0x85, 0xDF, 0x90, 0xD6, + 0x91, 0xD9, 0x25, 0xCF, 0x07, 0xD3, 0xC3, 0xD7, 0x9D, 0xC8, 0xA6, 0xE6, + 0xCF, 0xBE, 0x2D, 0xE4, 0xFD, 0xC3, 0x40, 0xE2, 0x62, 0xC5, 0xD4, 0xDE, + 0x27, 0xBF, 0x1D, 0xD1, 0xF6, 0xC5, 0x77, 0xD3, 0xEF, 0xD1, 0x9F, 0xE8, + 0x1E, 0xCD, 0x84, 0xEF, 0xAA, 0xC9, 0xF5, 0xE9, 0xD8, 0xC8, 0xED, 0xE3, + 0xE1, 0xC0, 0x20, 0xD9, 0xD2, 0xC9, 0xF5, 0xCB, 0x70, 0xD8, 0xD0, 0xC2, + 0x18, 0xD7, 0x83, 0xD0, 0x32, 0xC5, 0x6E, 0xDF, 0x30, 0xCC, 0x63, 0xE9, + 0x1D, 0xE0, 0x2D, 0xE6, 0xAE, 0xCF, 0xCE, 0xCA, 0x45, 0xBF, 0xF7, 0xBF, + 0xEB, 0xC6, 0xA7, 0xC5, 0x0A, 0xD3, 0xDC, 0xCC, 0x64, 0xDC, 0x2C, 0xD6, + 0xD0, 0xE2, 0x0E, 0xE3, 0x17, 0xE9, 0xCD, 0xF1, 0x13, 0xE7, 0x70, 0xE9, + 0x2C, 0xEA, 0x30, 0xDD, 0xC9, 0xF1, 0x68, 0xE0, 0x1B, 0xDD, 0x90, 0xDF, + 0x0D, 0xCA, 0x7D, 0xDB, 0x17, 0xDB, 0xB8, 0xDE, 0x0A, 0xF1, 0x59, 0xE8, + 0xCE, 0xE6, 0x01, 0xE8, 0xD4, 0xD5, 0xEC, 0xE7, 0x6B, 0xCB, 0x8C, 0xE1, + 0x42, 0xCB, 0x1C, 0xDC, 0xE4, 0xDF, 0x10, 0xF0, 0x3C, 0xF5, 0x8E, 0x02, + 0x5F, 0xFD, 0x3E, 0xFD, 0x35, 0x06, 0x0D, 0xE7, 0xE6, 0x13, 0xE0, 0xD6, + 0xC6, 0x0A, 0x74, 0xD8, 0x2B, 0xEB, 0x8B, 0xDF, 0x7E, 0xDC, 0xCB, 0xDF, + 0x6D, 0xF4, 0x5E, 0xE5, 0x09, 0x01, 0xAB, 0xE9, 0xB8, 0xEC, 0x7A, 0xE8, + 0x9E, 0xE8, 0xB7, 0xF1, 0x3C, 0xE8, 0x87, 0xED, 0x14, 0xD2, 0xA9, 0xD2, + 0xEE, 0xC5, 0x72, 0xCC, 0x9A, 0xC0, 0xCA, 0xDA, 0xE6, 0xB7, 0x2E, 0xE1, + 0x03, 0xC2, 0xC2, 0xE2, 0x1B, 0xD5, 0xEA, 0xE1, 0x05, 0xD4, 0x36, 0xD7, + 0x5B, 0xC7, 0x39, 0xC7, 0x4C, 0xC1, 0xBF, 0xB7, 0x16, 0xB9, 0xC2, 0xB1, + 0x30, 0xAF, 0xA7, 0xBB, 0x09, 0xA7, 0x16, 0xBC, 0x75, 0xAA, 0x8A, 0xBC, + 0xD5, 0xB3, 0x2D, 0xC7, 0x86, 0xB1, 0x08, 0xCE, 0xE9, 0xB1, 0x12, 0xD7, + 0x6D, 0xB8, 0x36, 0xD6, 0x02, 0xD4, 0xD6, 0xD5, 0x96, 0xF9, 0xB5, 0xDB, + 0xD8, 0xF6, 0x15, 0xDE, 0xA3, 0xE4, 0x36, 0xEA, 0x25, 0xE7, 0xC3, 0xF5, + 0xB3, 0xE7, 0x39, 0xEC, 0x8C, 0xE0, 0xD4, 0xDB, 0xCA, 0xDE, 0xE4, 0xD2, + 0x7B, 0xEA, 0x57, 0xD6, 0xE3, 0xF5, 0xCC, 0xE1, 0x93, 0xFE, 0x1F, 0xED, + 0xBE, 0x13, 0xEB, 0xFF, 0x28, 0x21, 0xE5, 0x18, 0xD5, 0x19, 0xC3, 0x22, + 0xEE, 0x0F, 0x68, 0x17, 0xF0, 0x13, 0x95, 0x13, 0xE0, 0x0E, 0x20, 0x10, + 0x46, 0x09, 0xE7, 0xFD, 0x06, 0x22, 0x80, 0xF2, 0x72, 0x2B, 0x17, 0xE2, + 0x5A, 0x1C, 0xBE, 0xD6, 0x5B, 0x17, 0x23, 0xE9, 0x0D, 0x11, 0x1E, 0x06, + 0x0E, 0x0B, 0x77, 0x1C, 0x41, 0x15, 0xE4, 0x1B, 0x6C, 0x27, 0x7E, 0x09, + 0xA5, 0x34, 0xDF, 0xFB, 0xF4, 0x31, 0xE9, 0xF0, 0x00, 0x2D, 0xEE, 0xEF, + 0xB0, 0x1A, 0x73, 0xE9, 0x72, 0x07, 0xBC, 0xDC, 0x46, 0x16, 0xD1, 0xE5, + 0x3D, 0x18, 0xAE, 0xEE, 0x81, 0x09, 0xBB, 0xF7, 0x12, 0x02, 0x5B, 0xFA, + 0xE4, 0xFE, 0x23, 0xF1, 0x70, 0x0B, 0xA9, 0xFD, 0x21, 0x02, 0xEE, 0xF3, + 0x68, 0xFD, 0xA0, 0xE6, 0x2A, 0x19, 0x2D, 0x03, 0xFE, 0x12, 0x8E, 0x0C, + 0x9D, 0x10, 0xF7, 0x0E, 0xC5, 0x18, 0x6A, 0x17, 0xF2, 0x00, 0xCA, 0x0F, + 0xEC, 0xF8, 0x7B, 0x16, 0x4F, 0x00, 0x7D, 0x19, 0x2C, 0x02, 0x63, 0x11, + 0x29, 0x0C, 0xF0, 0x14, 0x94, 0x25, 0xD0, 0x1B, 0x38, 0x35, 0xBC, 0x22, + 0xBF, 0x31, 0xEB, 0x34, 0x33, 0x31, 0x99, 0x45, 0x2B, 0x3E, 0x24, 0x3F, + 0x61, 0x50, 0xB0, 0x37, 0xB6, 0x56, 0x00, 0x41, 0x26, 0x4F, 0x6F, 0x42, + 0x8E, 0x4A, 0xC3, 0x3F, 0xD4, 0x42, 0xB8, 0x3A, 0x3A, 0x33, 0xDB, 0x2E, + 0xE7, 0x3A, 0xD8, 0x37, 0x36, 0x39, 0x56, 0x3E, 0x71, 0x2B, 0x13, 0x37, + 0x50, 0x2C, 0x80, 0x29, 0x64, 0x27, 0x51, 0x17, 0xE8, 0x1B, 0x88, 0x10, + 0x06, 0x15, 0x05, 0x0B, 0x1F, 0x28, 0x9E, 0x10, 0x48, 0x3D, 0x0B, 0x1E, + 0x4C, 0x30, 0xCE, 0x1A, 0x71, 0x1D, 0x5D, 0x15, 0x6F, 0x12, 0x59, 0x12, + 0x64, 0x0D, 0x52, 0x0B, 0xC0, 0x14, 0xBA, 0x06, 0x57, 0x1C, 0xD5, 0x04, + 0x88, 0x20, 0x5D, 0x05, 0x6A, 0x25, 0xAE, 0x05, 0xEB, 0x1F, 0x9C, 0x08, + 0x36, 0x18, 0x7B, 0x23, 0x30, 0x18, 0x6B, 0x42, 0x8A, 0x1B, 0x13, 0x3B, + 0xBA, 0x2A, 0x35, 0x22, 0x96, 0x36, 0xF4, 0x0A, 0x7A, 0x34, 0x42, 0xF8, + 0xBE, 0x2C, 0x81, 0xF9, 0x39, 0x25, 0x8B, 0x08, 0xF6, 0x30, 0x16, 0x1D, + 0x00, 0x4E, 0x88, 0x3A, 0x17, 0x5B, 0x45, 0x4C, 0x6C, 0x53, 0x23, 0x40, + 0x70, 0x49, 0x1A, 0x27, 0xFA, 0x38, 0xD3, 0x17, 0x5B, 0x23, 0x56, 0x15, + 0xA0, 0x1E, 0xE1, 0x17, 0x3F, 0x24, 0x9A, 0x16, 0x70, 0x2A, 0x02, 0x14, + 0x43, 0x36, 0x56, 0x19, 0xF0, 0x2C, 0x47, 0x17, 0xE0, 0x1A, 0x73, 0x0B, + 0x3C, 0x13, 0xBF, 0xFC, 0x41, 0x0C, 0x41, 0xF0, 0xFD, 0x00, 0xE6, 0xF3, + 0xF9, 0xF8, 0x01, 0x00, 0xE8, 0x02, 0x9B, 0x04, 0xBD, 0x19, 0xFA, 0x15, + 0x80, 0x23, 0xA6, 0x27, 0xBA, 0x17, 0xC5, 0x28, 0xF3, 0x18, 0x8E, 0x35, + 0xD8, 0x1D, 0x5C, 0x38, 0x93, 0x1D, 0x45, 0x35, 0xC2, 0x26, 0xF6, 0x39, + 0x6F, 0x39, 0xDA, 0x3E, 0x87, 0x3F, 0x3F, 0x3A, 0x55, 0x36, 0x4B, 0x2A, + 0x9C, 0x2F, 0xAA, 0x26, 0x4E, 0x19, 0x4F, 0x25, 0xA7, 0x08, 0x67, 0x21, + 0x96, 0x15, 0x38, 0x26, 0xB2, 0x28, 0xEE, 0x23, 0x8E, 0x2B, 0x31, 0x1C, + 0xE5, 0x28, 0x49, 0x28, 0x62, 0x1F, 0x89, 0x2F, 0x96, 0x09, 0x4A, 0x23, + 0xF7, 0xFB, 0x3C, 0x1D, 0x02, 0xFC, 0x4B, 0x23, 0x67, 0x00, 0xC3, 0x1D, + 0x7A, 0x08, 0x61, 0x0E, 0x18, 0x0F, 0x89, 0x08, 0xE2, 0x07, 0x85, 0xFC, + 0x36, 0x01, 0x69, 0xF6, 0x44, 0xF7, 0x33, 0xFD, 0xDA, 0xE5, 0x5F, 0x02, + 0xAE, 0xDF, 0x4F, 0x0D, 0x85, 0xDB, 0xAF, 0x0F, 0x69, 0xD2, 0x1A, 0x06, + 0x0C, 0xE1, 0x99, 0x05, 0x47, 0xFF, 0x71, 0x02, 0xA9, 0xF8, 0x37, 0xF1, + 0xB3, 0xEE, 0xE9, 0xF7, 0x3E, 0xF0, 0x98, 0x08, 0x30, 0xE7, 0x1B, 0x00, + 0x5E, 0xEE, 0x38, 0x02, 0x66, 0xF9, 0xC6, 0x0F, 0x4D, 0xF9, 0x92, 0x10, + 0x49, 0xF1, 0x1C, 0x09, 0xD7, 0xE7, 0x48, 0x01, 0x0F, 0xE4, 0x49, 0xFF, + 0xBA, 0xE2, 0xFD, 0xFE, 0x6F, 0xE5, 0x76, 0xFB, 0x9A, 0xE4, 0x11, 0xF5, + 0xD5, 0xDA, 0x77, 0xEA, 0xAD, 0xD7, 0x8A, 0xEB, 0x55, 0xE1, 0x8A, 0x0A, + 0xD6, 0xD0, 0xF1, 0x09, 0x59, 0xC0, 0xF2, 0xE9, 0x19, 0xCC, 0x52, 0xE0, + 0x8B, 0xD3, 0xD5, 0xDC, 0x8E, 0xDA, 0xA5, 0xE9, 0x88, 0xD8, 0x91, 0xFA, + 0xB5, 0xCC, 0x13, 0xF6, 0x6C, 0xD7, 0x8A, 0xF5, 0x33, 0xEF, 0x64, 0x01, + 0x7A, 0xED, 0x95, 0x05, 0x9B, 0xDB, 0xB7, 0xFD, 0x94, 0xD5, 0x80, 0xFA, + 0xEB, 0xD4, 0xA3, 0xF5, 0xF3, 0xDE, 0x7A, 0xF2, 0x48, 0xDF, 0xDE, 0xED, + 0xB9, 0xD3, 0xC5, 0xEF, 0x38, 0xD7, 0x87, 0x09, 0x43, 0xD4, 0x6F, 0x13, + 0x26, 0xD8, 0xFF, 0x13, 0x2D, 0xE2, 0x72, 0x14, 0xF5, 0xDB, 0x98, 0xFF, + 0x43, 0xE1, 0x65, 0xF5, 0xFD, 0xE6, 0xD4, 0xFC, 0x27, 0xDA, 0xA2, 0xF5, + 0x9B, 0xD7, 0x0B, 0xEB, 0x49, 0xEB, 0x18, 0xF9, 0x45, 0xED, 0x61, 0x02, + 0xA3, 0xDE, 0xE1, 0xFB, 0xEF, 0xDA, 0xF8, 0xF1, 0x77, 0xD7, 0x08, 0xDB, + 0x45, 0xEC, 0x21, 0xD7, 0x8A, 0x00, 0x07, 0xE4, 0x42, 0xF3, 0x87, 0xEC, + 0x7F, 0xEA, 0xA5, 0xFC, 0x25, 0xFB, 0x3B, 0x0C, 0xAB, 0x05, 0xA6, 0xFC, + 0x16, 0x05, 0xDD, 0xE5, 0xB3, 0x0D, 0xE8, 0xED, 0xC7, 0x05, 0x9C, 0xED, + 0x16, 0xFE, 0x30, 0xE8, 0x0F, 0x02, 0xED, 0xE8, 0x5C, 0x07, 0x88, 0xE3, + 0x86, 0x04, 0x5F, 0xE6, 0x83, 0xFC, 0x99, 0xE7, 0xC4, 0xF8, 0xDB, 0xDA, + 0xED, 0xE6, 0x3B, 0xD6, 0xCD, 0xDA, 0x2F, 0xE5, 0x7A, 0xD5, 0xE5, 0xE9, + 0x3F, 0xCA, 0x9E, 0xDC, 0xD7, 0xC6, 0x3B, 0xCA, 0xAB, 0xBE, 0x6D, 0xB7, + 0xDB, 0xB0, 0xB6, 0xB4, 0x16, 0xAF, 0x30, 0xB8, 0x25, 0xAF, 0x12, 0xB1, + 0x12, 0xA2, 0x32, 0xA5, 0x77, 0xA8, 0xCA, 0xB1, 0xD2, 0xC1, 0xC4, 0xC5, + 0xAF, 0xC4, 0x1F, 0xB9, 0xB5, 0xBA, 0x80, 0xB1, 0x7C, 0xB5, 0x87, 0xBC, + 0xA6, 0xB1, 0xC8, 0xCB, 0x7C, 0xA9, 0xBA, 0xD8, 0x99, 0xAB, 0xF1, 0xE0, + 0x27, 0xB9, 0x2B, 0xED, 0x41, 0xB1, 0x1D, 0xE4, 0xC8, 0xBD, 0x0D, 0xE1, + 0xB0, 0xE7, 0xFF, 0xEE, 0xCB, 0xE6, 0xF9, 0xE0, 0x93, 0xDB, 0xCD, 0xE3, + 0x9B, 0xDD, 0x1D, 0xF8, 0x32, 0xDC, 0xD0, 0xF1, 0x02, 0xE9, 0xED, 0xEA, + 0xE6, 0xF8, 0x4F, 0xF3, 0x02, 0xFF, 0xAA, 0xFC, 0xE1, 0x06, 0x40, 0xFD, + 0x7B, 0x12, 0x3C, 0x00, 0xE8, 0x01, 0x42, 0xF6, 0xD8, 0xF6, 0xBF, 0xEE, + 0x15, 0xF6, 0x43, 0xF2, 0x46, 0xEB, 0xF1, 0xF3, 0x86, 0xF8, 0xAA, 0xFB, + 0x87, 0x06, 0xF8, 0xF5, 0x86, 0x06, 0x12, 0xEF, 0x9C, 0x0C, 0x31, 0xF5, + 0xF6, 0x10, 0x1C, 0xF3, 0x65, 0x02, 0xC1, 0xE9, 0x3B, 0xF3, 0x7A, 0xF0, + 0x39, 0xFA, 0x8D, 0x0A, 0x94, 0xF8, 0x24, 0x09, 0x5D, 0xFA, 0x7A, 0xFC, + 0x99, 0x00, 0xB7, 0xFE, 0x86, 0xED, 0x6F, 0xF0, 0x95, 0xE6, 0xF2, 0xE5, + 0x2D, 0xF6, 0x2C, 0xF5, 0x91, 0xFF, 0xAE, 0xFB, 0xBF, 0x0D, 0xE2, 0xF3, + 0xE2, 0x10, 0xF1, 0xF2, 0x37, 0x03, 0x34, 0xF6, 0x55, 0x04, 0x87, 0xF6, + 0x4A, 0x14, 0xEA, 0x01, 0x29, 0x21, 0xD2, 0x14, 0x95, 0x2C, 0xE5, 0x1D, + 0x94, 0x3F, 0x58, 0x1C, 0xB9, 0x3F, 0x8A, 0x0B, 0x8D, 0x38, 0xF3, 0x0B, + 0xBB, 0x39, 0x63, 0x1C, 0xAC, 0x27, 0x0A, 0x1A, 0xDA, 0x14, 0x1E, 0x24, + 0x73, 0x20, 0x97, 0x39, 0xBD, 0x33, 0xA0, 0x39, 0xBF, 0x3C, 0xFD, 0x3A, + 0x5A, 0x47, 0x8F, 0x3F, 0x65, 0x49, 0x98, 0x36, 0x2F, 0x4A, 0xE6, 0x33, + 0x56, 0x57, 0x96, 0x3C, 0xE9, 0x59, 0x44, 0x47, 0x3E, 0x4C, 0x3D, 0x4A, + 0x90, 0x47, 0x7E, 0x45, 0xE7, 0x4D, 0x88, 0x41, 0x61, 0x58, 0x74, 0x3D, + 0x8C, 0x59, 0x1E, 0x33, 0x44, 0x4F, 0x8A, 0x32, 0x45, 0x48, 0xF0, 0x38, + 0x29, 0x4F, 0x46, 0x3F, 0xF5, 0x5A, 0x03, 0x46, 0xBF, 0x4E, 0x07, 0x3C, + 0x27, 0x33, 0x68, 0x27, 0x95, 0x34, 0x7A, 0x23, 0x7D, 0x44, 0xC0, 0x29, + 0x3F, 0x40, 0x06, 0x26, 0xDD, 0x31, 0x3B, 0x13, 0x3B, 0x2D, 0x40, 0xFC, + 0xF3, 0x25, 0xCD, 0xF1, 0xCD, 0x1C, 0x46, 0x01, 0xB7, 0x22, 0xD9, 0x1D, + 0xDB, 0x21, 0xBC, 0x1E, 0x1B, 0x23, 0xEC, 0x09, 0xC6, 0x32, 0xEF, 0xF1, + 0x9C, 0x30, 0xA2, 0xD6, 0x44, 0x09, 0x23, 0xC7, 0x76, 0xE7, 0x97, 0xD0, + 0x2B, 0xEA, 0xF5, 0xDF, 0x84, 0xF7, 0x80, 0xE7, 0xC5, 0xFE, 0xA1, 0xED, + 0xD6, 0xFE, 0x4E, 0xED, 0x2D, 0x03, 0xC5, 0xF2, 0x68, 0x08, 0x37, 0xF8, + 0x73, 0x00, 0x6B, 0xEA, 0xB3, 0x03, 0x01, 0xE4, 0x83, 0x11, 0x0A, 0xE8, + 0x7D, 0x0F, 0xF6, 0xE7, 0x1B, 0x11, 0xA3, 0xEA, 0x85, 0x12, 0x61, 0xEA, + 0xDE, 0x01, 0x75, 0xEE, 0xEA, 0xFE, 0x9B, 0xFD, 0x33, 0xFD, 0xB8, 0xFA, + 0xF5, 0xE3, 0x47, 0xE7, 0x28, 0xDC, 0x3F, 0xEE, 0x90, 0xE5, 0xA4, 0xF5, + 0xD3, 0xEC, 0x64, 0xED, 0xBF, 0xF7, 0xD1, 0xF6, 0x3B, 0xF3, 0x58, 0xFA, + 0x7F, 0xF0, 0xEA, 0xFC, 0x59, 0xFF, 0x76, 0x0B, 0x27, 0x0A, 0xEB, 0x08, + 0x4C, 0x03, 0xE7, 0xFB, 0x52, 0xF2, 0x4C, 0xF7, 0xDF, 0xEF, 0xBB, 0xF6, + 0xA1, 0xEF, 0x9D, 0xEB, 0x54, 0xEC, 0x3C, 0xE7, 0xC3, 0xEA, 0x44, 0xF8, + 0x21, 0xF2, 0x96, 0x15, 0x86, 0x09, 0x13, 0x28, 0xDC, 0x14, 0xE6, 0x1C, + 0x68, 0x0F, 0xFD, 0x0C, 0xBC, 0x09, 0x37, 0x10, 0x14, 0x07, 0x38, 0x12, + 0xCA, 0x0D, 0xA3, 0x12, 0x00, 0x1B, 0xA4, 0x1B, 0xA9, 0x2B, 0xC0, 0x23, + 0x44, 0x39, 0x7C, 0x2D, 0x7C, 0x3C, 0x33, 0x2C, 0x5B, 0x42, 0x5D, 0x1C, + 0xB4, 0x3F, 0x8C, 0x12, 0x18, 0x43, 0x9F, 0x24, 0xEA, 0x48, 0xF8, 0x32, + 0xB7, 0x36, 0xA5, 0x29, 0x3C, 0x22, 0x0E, 0x26, 0x34, 0x12, 0xA4, 0x24, + 0x89, 0x11, 0xF6, 0x1E, 0xE9, 0x1E, 0xC0, 0x18, 0x08, 0x23, 0x71, 0x17, + 0x5A, 0x28, 0xE3, 0x16, 0xB3, 0x2D, 0xF5, 0x14, 0x61, 0x28, 0xF6, 0x1E, + 0x02, 0x15, 0xD0, 0x1B, 0x7A, 0x0F, 0xBE, 0x19, 0x2D, 0x05, 0x8C, 0x18, + 0x55, 0xE9, 0x1C, 0x0C, 0x29, 0xE6, 0x82, 0x05, 0x9A, 0xE8, 0xF3, 0xF4, + 0x33, 0xF3, 0xE3, 0xFD, 0xD6, 0x02, 0x0B, 0x11, 0x35, 0x09, 0xF0, 0x0A, + 0xA1, 0x04, 0xEE, 0x03, 0xE7, 0x05, 0xAE, 0x0C, 0xDA, 0x10, 0x64, 0x15, + 0xE4, 0x0A, 0xDB, 0x0C, 0x3F, 0x0E, 0xB3, 0x12, 0xF5, 0x21, 0xF1, 0x24, + 0xBD, 0x29, 0x1A, 0x1D, 0x7B, 0x22, 0xE4, 0x06, 0x1B, 0x1E, 0xE2, 0xFF, + 0x4D, 0x17, 0xB6, 0xF8, 0xDC, 0x0B, 0x75, 0xF2, 0xAA, 0x0C, 0xA6, 0xFD, + 0x43, 0x1B, 0x7A, 0x0F, 0x4D, 0x1F, 0x2F, 0x0D, 0xFD, 0x0D, 0x41, 0x04, + 0xA2, 0xFE, 0xC1, 0x0E, 0xE7, 0xFE, 0xBE, 0x11, 0xE9, 0x07, 0x35, 0x0C, + 0x84, 0x0E, 0x1F, 0x10, 0xCE, 0x0F, 0xD1, 0x0E, 0x68, 0x0B, 0x82, 0x09, + 0x1B, 0x0B, 0x1F, 0x0F, 0x9F, 0x07, 0x0F, 0x17, 0x26, 0xF7, 0xEF, 0x19, + 0x5C, 0xEE, 0xB6, 0x13, 0xE1, 0xF0, 0xC9, 0x08, 0x49, 0xFD, 0x28, 0x0F, + 0xFF, 0x04, 0x74, 0x19, 0x58, 0xFC, 0x59, 0x17, 0xDB, 0xEC, 0xA1, 0x10, + 0xC6, 0xDC, 0xDD, 0x05, 0x78, 0xE5, 0xD7, 0x02, 0xF9, 0xEA, 0xC8, 0xFE, + 0x62, 0xD1, 0x41, 0xE9, 0x7C, 0xD0, 0x53, 0xDD, 0xA9, 0xE4, 0xF4, 0xE5, + 0x94, 0xE2, 0x6E, 0xF4, 0x4B, 0xD1, 0x25, 0xFD, 0x08, 0xCE, 0xD6, 0xFE, + 0xFA, 0xDD, 0xDE, 0x00, 0x34, 0xED, 0x85, 0x04, 0xB5, 0xF4, 0x3D, 0xFB, + 0xE8, 0xF9, 0x1E, 0xEC, 0x26, 0xF5, 0x05, 0xE4, 0xD2, 0xF0, 0x6D, 0xE5, + 0xB9, 0xF5, 0xD2, 0xF9, 0x5F, 0xEE, 0x95, 0x0A, 0x0A, 0xDE, 0x1F, 0x0B, + 0x43, 0xE5, 0x0A, 0x0D, 0xB5, 0xF6, 0xC3, 0x08, 0xEE, 0xE8, 0x8E, 0xFB, + 0x68, 0xDE, 0x52, 0xF5, 0x85, 0xED, 0xD9, 0xF5, 0xB4, 0xF5, 0x69, 0xFD, + 0x0B, 0xF3, 0xCA, 0xFE, 0x19, 0xF5, 0xE1, 0xFD, 0x8F, 0xF8, 0xF0, 0xFE, + 0xA9, 0xFB, 0x33, 0x01, 0x16, 0xFE, 0x4A, 0x09, 0x3A, 0xF8, 0x98, 0x0A, + 0x17, 0xF0, 0x2F, 0x0C, 0x0F, 0xF6, 0x6D, 0x0D, 0xBE, 0x05, 0x70, 0x05, + 0x92, 0xFD, 0x37, 0x03, 0xD7, 0xF6, 0xAA, 0x1A, 0x0A, 0xFC, 0x3E, 0x2A, + 0xD9, 0xFF, 0x35, 0x20, 0xD5, 0x01, 0x16, 0x16, 0xE1, 0xF6, 0x91, 0x0E, + 0xFA, 0xFF, 0x9D, 0x10, 0x48, 0x0E, 0x83, 0x11, 0x6D, 0x11, 0xAE, 0x0C, + 0x66, 0x17, 0xCD, 0x00, 0x2B, 0x0D, 0xC3, 0xF6, 0x64, 0x01, 0x7A, 0x02, + 0xFE, 0x00, 0xE8, 0x0E, 0x41, 0x0A, 0x99, 0x1A, 0x5A, 0x05, 0x41, 0x1F, + 0x5F, 0xEF, 0x73, 0x13, 0xC1, 0xF8, 0x1F, 0x10, 0x5F, 0x13, 0x69, 0x16, + 0xD8, 0x03, 0xD1, 0x08, 0x07, 0xE6, 0x46, 0xF0, 0x59, 0xEE, 0x2B, 0xF7, + 0xAF, 0xF9, 0xD5, 0x05, 0xA2, 0xF9, 0x3E, 0x08, 0x17, 0x05, 0x4C, 0x0F, + 0xD0, 0x07, 0x45, 0x0E, 0xA5, 0xF3, 0x02, 0xFF, 0x1F, 0xE0, 0x3B, 0xEE, + 0x62, 0xDC, 0x15, 0xEF, 0xAD, 0xD5, 0x9D, 0x03, 0x14, 0xCE, 0x8F, 0x0B, + 0x11, 0xDA, 0x3B, 0x00, 0xC9, 0xE9, 0xB2, 0xFC, 0x0E, 0xEB, 0xCD, 0x03, + 0x39, 0xE2, 0xB0, 0xFC, 0x3C, 0xE0, 0x18, 0xF1, 0x98, 0xDF, 0x69, 0xF0, + 0x67, 0xDA, 0x3B, 0xF5, 0xF2, 0xD6, 0xBF, 0xEF, 0xD8, 0xCA, 0x0D, 0xD9, + 0x1E, 0xC1, 0xE8, 0xC5, 0xE8, 0xC5, 0x4B, 0xB9, 0x86, 0xD4, 0x52, 0xBF, + 0xC2, 0xD1, 0x81, 0xCC, 0x40, 0xC2, 0x1C, 0xCE, 0xE4, 0xBA, 0xD8, 0xC5, + 0x6F, 0xB8, 0x2F, 0xB2, 0x44, 0xCC, 0x4D, 0xB4, 0x19, 0xE2, 0x2D, 0xC2, + 0xCE, 0xE8, 0x97, 0xCE, 0x57, 0xEC, 0xC0, 0xE3, 0x71, 0xE1, 0x3E, 0xDE, + 0xE0, 0xE0, 0xA2, 0xD2, 0xD9, 0xE9, 0xEB, 0xD2, 0x1F, 0xEA, 0xC7, 0xCF, + 0x9A, 0xF9, 0xB0, 0xDC, 0xFB, 0x0A, 0xF2, 0xE4, 0x75, 0x09, 0x76, 0xDF, + 0xF7, 0xFB, 0x16, 0xE3, 0x6B, 0xE6, 0x9A, 0xE6, 0x1E, 0xDF, 0x77, 0xED, + 0x61, 0xF9, 0xFE, 0xFF, 0x0A, 0x05, 0xF7, 0xF5, 0x83, 0xFA, 0xF5, 0xD8, + 0xD1, 0x05, 0xF0, 0xDD, 0x9E, 0x0B, 0x39, 0xEC, 0x92, 0xF9, 0x39, 0xE8, + 0x55, 0xF5, 0x39, 0xF2, 0x8F, 0xF1, 0x4D, 0xF9, 0x15, 0xE2, 0xDB, 0xE7, + 0xAC, 0xF0, 0xC6, 0xE6, 0x1C, 0x01, 0xCB, 0xED, 0x8A, 0xEF, 0x19, 0xED, + 0x04, 0xD9, 0x36, 0xE6, 0xAD, 0xD5, 0x6F, 0xDF, 0xA1, 0xD7, 0x51, 0xE4, + 0x9C, 0xD1, 0x75, 0xE4, 0x64, 0xD1, 0x12, 0xDE, 0x98, 0xDA, 0x45, 0xD8, + 0x71, 0xEB, 0x58, 0xD8, 0x11, 0xFA, 0xD2, 0xE0, 0xDD, 0xF4, 0x7F, 0xEA, + 0xD0, 0xE3, 0xF6, 0xF3, 0xD8, 0xEA, 0x26, 0xFC, 0xA7, 0x03, 0x30, 0xF8, + 0x67, 0x0D, 0x3C, 0xEE, 0xB8, 0x06, 0xE5, 0xDF, 0x10, 0x08, 0x33, 0xD3, + 0xB8, 0x11, 0x48, 0xCE, 0x1E, 0x14, 0x9C, 0xD7, 0xAA, 0x15, 0x91, 0xF5, + 0x05, 0x0C, 0x83, 0xFA, 0x40, 0x07, 0x9B, 0xF1, 0x69, 0x10, 0x2E, 0xF5, + 0xEF, 0x0E, 0x15, 0xF2, 0x98, 0x08, 0xC1, 0xF7, 0xB2, 0xFF, 0x6D, 0xF8, + 0xDD, 0x08, 0x06, 0xF7, 0x4C, 0x18, 0x77, 0xF9, 0x63, 0x0E, 0xFA, 0xED, + 0x22, 0x00, 0x3C, 0xE3, 0x1E, 0x01, 0x1A, 0xDF, 0xC7, 0x09, 0x5A, 0xE9, + 0xAC, 0xFF, 0x86, 0xF0, 0x1E, 0xF6, 0x94, 0xEF, 0x8F, 0xFC, 0xBB, 0xF3, + 0xE7, 0xFF, 0x71, 0xF0, 0x41, 0xFB, 0x4E, 0xF1, 0x35, 0xF2, 0x35, 0xFC, + 0x0D, 0xF6, 0x53, 0x0A, 0x4A, 0xF6, 0x09, 0x09, 0x65, 0xEF, 0x41, 0xFD, + 0xFB, 0xF2, 0xEA, 0x01, 0x66, 0xED, 0x91, 0x0C, 0xD3, 0xE0, 0x8C, 0x0A, + 0x35, 0xEC, 0xF1, 0xFE, 0xAE, 0x00, 0xC0, 0xF2, 0x47, 0xFF, 0x9A, 0xE5, + 0xEA, 0xFB, 0xA6, 0xE3, 0x47, 0x06, 0x82, 0xEE, 0x3D, 0x03, 0xCA, 0xEF, + 0x37, 0xEF, 0x94, 0xE9, 0xD1, 0xF0, 0xC1, 0xF4, 0x27, 0x0D, 0x85, 0x0E, + 0x98, 0x1A, 0xEE, 0x10, 0x9E, 0x09, 0x10, 0xF9, 0x42, 0xFE, 0xD9, 0xF1, + 0x9C, 0xFE, 0x52, 0xF2, 0x01, 0xFC, 0x6C, 0xE8, 0x5D, 0x08, 0x52, 0xF1, + 0x81, 0x10, 0xCF, 0xFF, 0x08, 0xFC, 0x82, 0xFC, 0xED, 0xF5, 0x05, 0xF7, + 0xFB, 0x07, 0x72, 0xEC, 0x37, 0x12, 0x93, 0xE2, 0x9F, 0x0A, 0x8C, 0xE3, + 0xE4, 0x08, 0x8A, 0xFB, 0xB7, 0x12, 0xC2, 0x1B, 0xD6, 0x13, 0x3C, 0x1C, + 0xEB, 0x11, 0xC9, 0x0D, 0x08, 0x16, 0x3C, 0x07, 0xE6, 0x1A, 0x26, 0x03, + 0x35, 0x1C, 0xB2, 0x03, 0xB1, 0x1C, 0x1E, 0x09, 0xED, 0x12, 0x90, 0x05, + 0xAB, 0x06, 0xEB, 0xFB, 0x43, 0x07, 0xCE, 0xF7, 0x33, 0x00, 0x1E, 0xEA, + 0x12, 0x01, 0xAD, 0xE4, 0x5C, 0x11, 0x5F, 0xFE, 0x8D, 0x12, 0xDE, 0x15, + 0x11, 0x10, 0x82, 0x1B, 0x80, 0x0D, 0xAC, 0x1B, 0xF6, 0x0F, 0x3B, 0x16, + 0x76, 0x1D, 0x45, 0x05, 0xDA, 0x1C, 0xA6, 0xF6, 0x59, 0x16, 0xE9, 0xFD, + 0x48, 0x16, 0x5A, 0x0F, 0xD5, 0x1A, 0x01, 0x23, 0xC1, 0x1A, 0x03, 0x2E, + 0x9B, 0x19, 0xFC, 0x2B, 0x65, 0x24, 0xE9, 0x28, 0x4F, 0x32, 0x48, 0x2D, + 0xEC, 0x38, 0xC5, 0x37, 0x93, 0x3A, 0xF6, 0x39, 0xE0, 0x3A, 0x85, 0x33, + 0xE5, 0x31, 0x31, 0x30, 0xE9, 0x2F, 0x78, 0x37, 0xDF, 0x49, 0x1C, 0x4A, + 0x75, 0x58, 0xEC, 0x57, 0xA0, 0x51, 0xBF, 0x59, 0xF1, 0x5A, 0xE6, 0x58, + 0xA1, 0x5F, 0xC7, 0x55, 0x40, 0x4F, 0xE4, 0x53, 0x5F, 0x44, 0xD8, 0x52, + 0x97, 0x45, 0x48, 0x4D, 0xAD, 0x4D, 0x6B, 0x50, 0xCD, 0x5C, 0x83, 0x5A, + 0x95, 0x5E, 0xB7, 0x55, 0x08, 0x4D, 0xD0, 0x4C, 0x61, 0x3A, 0x18, 0x40, + 0xC3, 0x35, 0xA3, 0x2E, 0xC5, 0x3C, 0x0C, 0x34, 0x5B, 0x2A, 0xE1, 0x36, + 0x0F, 0x0E, 0x11, 0x25, 0x13, 0x0B, 0x2A, 0x08, 0xBB, 0x0B, 0xA3, 0xF2, + 0x29, 0x01, 0x73, 0xF7, 0x4D, 0xF9, 0x71, 0x06, 0x5C, 0xF4, 0x02, 0x0C, + 0x3A, 0xEF, 0x61, 0x06, 0x41, 0xF0, 0x7C, 0x04, 0xE6, 0xEF, 0x72, 0xFB, + 0x4B, 0xE8, 0xED, 0xEA, 0x61, 0xE6, 0xA5, 0xE6, 0xAC, 0xE7, 0x41, 0xDF, + 0xFA, 0xE2, 0x45, 0xDB, 0xC6, 0xE4, 0xD7, 0xE3, 0x18, 0xEE, 0x6A, 0xE8, + 0x6C, 0xED, 0x66, 0xDF, 0xC6, 0xE9, 0x58, 0xE2, 0x8C, 0xEA, 0x55, 0xF8, + 0xC9, 0xE6, 0x37, 0x02, 0xED, 0xE8, 0x75, 0xFD, 0x9F, 0xF3, 0xDD, 0x01, + 0xA7, 0xF5, 0x9A, 0x0B, 0xD4, 0xF1, 0x15, 0x06, 0xC8, 0xEF, 0x04, 0xF5, + 0x9D, 0xFA, 0x86, 0xF6, 0x7C, 0xFD, 0x49, 0x00, 0xC3, 0xED, 0xA3, 0xFD, + 0x93, 0xE7, 0x26, 0xFC, 0xCB, 0xF2, 0x3F, 0xF4, 0x29, 0xFF, 0x8D, 0xE4, + 0x88, 0xF5, 0x8F, 0xE5, 0xFC, 0xE4, 0xE6, 0xF5, 0xE3, 0xE6, 0x63, 0x00, + 0x89, 0xF2, 0x79, 0x02, 0x02, 0xF6, 0xD1, 0x05, 0x95, 0xF2, 0xBC, 0x0C, + 0xD2, 0xF2, 0x87, 0x0A, 0xAC, 0xF4, 0xE2, 0xFB, 0xE3, 0xF5, 0xE3, 0xF0, + 0xFB, 0xFE, 0x98, 0xF4, 0xC3, 0xFC, 0xA0, 0xF6, 0x2B, 0xF8, 0xC2, 0xFA, + 0xEE, 0x06, 0xE7, 0x00, 0xE8, 0x11, 0x79, 0xF7, 0x0F, 0x04, 0x36, 0xEF, + 0x67, 0xF6, 0xF6, 0xF4, 0xD8, 0x00, 0x13, 0x07, 0x8A, 0xFD, 0x87, 0x14, + 0x9E, 0xF2, 0xDF, 0x11, 0xC7, 0xFF, 0x0E, 0x13, 0xD9, 0x15, 0xDF, 0x18, + 0x2D, 0x1A, 0x03, 0x13, 0xF2, 0x09, 0x31, 0x13, 0x4F, 0xFF, 0x53, 0x1D, + 0x0E, 0xF0, 0xC0, 0x18, 0xE9, 0xEC, 0x4A, 0x0D, 0xDC, 0x0C, 0x07, 0x0A, + 0xFB, 0x1B, 0xB8, 0x05, 0x6F, 0x14, 0x12, 0x03, 0xAB, 0x16, 0xDE, 0x0E, + 0x44, 0x19, 0xB0, 0x18, 0x70, 0x18, 0xA8, 0x20, 0xB6, 0x0D, 0xB3, 0x20, + 0x56, 0xFD, 0x2F, 0x16, 0x26, 0xFE, 0xC9, 0x18, 0x76, 0x05, 0x8E, 0x19, + 0x83, 0x09, 0xED, 0x15, 0xD2, 0x12, 0x41, 0x1F, 0x51, 0x11, 0x67, 0x24, + 0xEA, 0x0F, 0xE3, 0x24, 0x8D, 0x0C, 0xC7, 0x17, 0x39, 0x00, 0xBC, 0x03, + 0xC1, 0xFC, 0x8C, 0x03, 0x00, 0xFC, 0x9C, 0x0D, 0x30, 0x04, 0x12, 0x1B, + 0x10, 0x0D, 0x24, 0x20, 0xBF, 0x0B, 0x00, 0x23, 0x2C, 0x04, 0x30, 0x1E, + 0x99, 0xFD, 0x2D, 0x08, 0x8E, 0x05, 0xC4, 0x00, 0x71, 0x06, 0x86, 0x04, + 0x1A, 0xF9, 0x07, 0x0C, 0xFD, 0xF1, 0x41, 0x1B, 0x05, 0xEB, 0x64, 0x1C, + 0xDA, 0xE5, 0x9A, 0x0D, 0x59, 0xF8, 0x76, 0x07, 0x10, 0x07, 0x97, 0x00, + 0xA0, 0x04, 0x5D, 0xF7, 0xFA, 0x0E, 0x29, 0xFD, 0x82, 0x10, 0x29, 0x00, + 0x09, 0x08, 0xA8, 0x07, 0x53, 0x01, 0x04, 0x11, 0x19, 0xF7, 0x97, 0x06, + 0x11, 0xF5, 0xA8, 0x00, 0x49, 0xF6, 0x66, 0x03, 0xAF, 0x07, 0x56, 0x0A, + 0x74, 0x0F, 0x92, 0x0E, 0xEC, 0xFB, 0xBB, 0x01, 0x3E, 0xFB, 0xD4, 0xF6, + 0x8B, 0x00, 0xCF, 0xE5, 0x54, 0xFB, 0xAC, 0xD8, 0x6F, 0xFD, 0x82, 0xE7, + 0xAF, 0xFF, 0x48, 0xEE, 0xB4, 0x05, 0x96, 0xEB, 0x9A, 0x07, 0x4F, 0xF3, + 0x06, 0x02, 0xB2, 0xFB, 0x83, 0xFC, 0x41, 0xFC, 0xF4, 0xE6, 0xE0, 0xEE, + 0x29, 0xD3, 0x27, 0xE1, 0x2D, 0xD5, 0x0B, 0xDD, 0x05, 0xD7, 0xB3, 0xD7, + 0x00, 0xD6, 0x68, 0xDC, 0x60, 0xDA, 0x22, 0xE0, 0xFD, 0xDB, 0xC6, 0xE1, + 0x67, 0xCA, 0xFD, 0xE4, 0xBA, 0xB4, 0x32, 0xDB, 0x8C, 0xAF, 0xFD, 0xCB, + 0x33, 0xAC, 0x5B, 0xBB, 0xDB, 0xA7, 0xDD, 0xB7, 0xBD, 0xA8, 0xF1, 0xBB, + 0xAC, 0xB7, 0xA9, 0xC0, 0xE4, 0xC2, 0xD5, 0xBF, 0x1F, 0xBF, 0x16, 0xBA, + 0xEE, 0xBC, 0xF7, 0xC0, 0x74, 0xB1, 0x5E, 0xCA, 0xFC, 0xAF, 0x6B, 0xD8, + 0x7F, 0xC8, 0x48, 0xE1, 0xE3, 0xD2, 0xD5, 0xD9, 0x0F, 0xCF, 0x88, 0xDB, + 0x53, 0xD7, 0x97, 0xD7, 0x42, 0xF0, 0x57, 0xD1, 0x82, 0xFD, 0x93, 0xD8, + 0x85, 0xFE, 0x8E, 0xEE, 0xB2, 0x07, 0x37, 0x0D, 0x76, 0x0E, 0x98, 0x0D, + 0x1A, 0x19, 0xFE, 0xF8, 0x49, 0x26, 0xC2, 0xEB, 0x24, 0x24, 0x53, 0xE4, + 0x10, 0x0E, 0x8D, 0xE2, 0xCB, 0x02, 0x24, 0xE9, 0x1D, 0x0E, 0x24, 0xFE, + 0xB0, 0x09, 0xAC, 0x0F, 0xD0, 0x06, 0xED, 0x15, 0xCC, 0x10, 0xB6, 0x0E, + 0xC7, 0x16, 0x3C, 0x02, 0xD3, 0x07, 0xF7, 0xF8, 0xEB, 0xF2, 0xD2, 0xF7, + 0xD3, 0xF4, 0xBD, 0x02, 0xDF, 0xF5, 0x0F, 0xFF, 0x27, 0x08, 0xAA, 0xFF, + 0xAF, 0x1A, 0x91, 0x02, 0xBF, 0x00, 0x25, 0xE8, 0x52, 0xF7, 0x51, 0xE1, + 0xFA, 0xFF, 0x93, 0xE9, 0x1E, 0xEA, 0x13, 0xED, 0x80, 0xDD, 0x4D, 0xFF, + 0xC2, 0xE9, 0xD9, 0x02, 0x34, 0xFA, 0xC5, 0xF9, 0x06, 0x08, 0x82, 0xFE, + 0xEA, 0xFF, 0x87, 0xFF, 0x61, 0xF4, 0x08, 0x0B, 0x7C, 0xED, 0x7F, 0x1A, + 0xAD, 0xE4, 0x1E, 0x0E, 0xB8, 0xF7, 0x60, 0x05, 0xFC, 0x0A, 0x91, 0x01, + 0x94, 0xFA, 0xCB, 0xEC, 0x1D, 0xF6, 0x81, 0xE0, 0x67, 0xFF, 0x6A, 0xDD, + 0xAF, 0xF4, 0xD7, 0xDC, 0x4E, 0xF2, 0x10, 0xF1, 0x08, 0xF3, 0xB1, 0xFB, + 0xBF, 0xE5, 0x93, 0xEB, 0xBF, 0xEF, 0x93, 0xE1, 0xA2, 0x02, 0x44, 0xD9, + 0x04, 0xF6, 0x38, 0xD2, 0x7A, 0xE5, 0x04, 0xE1, 0x26, 0xDF, 0xD2, 0xEA, + 0x18, 0xDD, 0x2F, 0xE3, 0x71, 0xE3, 0x28, 0xE1, 0x88, 0xF3, 0xE0, 0xE8, + 0x13, 0xF6, 0xFB, 0xE7, 0xF1, 0xE3, 0x84, 0xDE, 0x1F, 0xD8, 0xFC, 0xDE, + 0xEF, 0xD1, 0x5A, 0xDE, 0xDE, 0xD1, 0x30, 0xD9, 0xFA, 0xD5, 0x5D, 0xD4, + 0x3F, 0xE7, 0x98, 0xD9, 0x01, 0xF3, 0xA2, 0xE4, 0x73, 0xE5, 0x5E, 0xE9, + 0x5E, 0xE2, 0x0C, 0xEF, 0xF3, 0xE1, 0xD0, 0xEB, 0x4C, 0xDC, 0x87, 0xE6, + 0xA1, 0xE0, 0xD1, 0xED, 0x3D, 0xE2, 0x1A, 0xE8, 0x66, 0xE5, 0x41, 0xDD, + 0x29, 0xF1, 0x4F, 0xDF, 0x6F, 0xFF, 0xA8, 0xD9, 0xA1, 0x07, 0x53, 0xD7, + 0xA9, 0xFA, 0x01, 0xDD, 0x1A, 0xEA, 0x73, 0xDE, 0x05, 0xEC, 0x1A, 0xE3, + 0x7E, 0xE8, 0xC6, 0xE3, 0x6C, 0xE5, 0xF3, 0xE8, 0x05, 0xF0, 0x3D, 0xF1, + 0xF9, 0xF3, 0x06, 0xED, 0xD6, 0xEF, 0xC0, 0xEA, 0xB9, 0xF1, 0x7E, 0xF2, + 0xBE, 0xF3, 0x40, 0xEF, 0x87, 0xF4, 0x3E, 0xEA, 0x1E, 0xFC, 0x9B, 0xEC, + 0xB3, 0x03, 0x35, 0xEA, 0x9C, 0x06, 0xF4, 0xF4, 0xE0, 0x05, 0x19, 0xFE, + 0x4F, 0x0A, 0xA7, 0xFB, 0x5E, 0x11, 0xCC, 0xFB, 0xCA, 0x10, 0x11, 0xFF, + 0x5E, 0x10, 0x51, 0x09, 0x18, 0x17, 0x84, 0x0F, 0x41, 0x19, 0x88, 0x14, + 0xCE, 0x12, 0x1C, 0x17, 0xF6, 0x0F, 0x75, 0x0B, 0xE2, 0x0D, 0xC7, 0x02, + 0x8F, 0xFF, 0xDD, 0x00, 0xE2, 0xF1, 0xCE, 0xF6, 0x9E, 0xF3, 0xCC, 0xF1, + 0x48, 0xF6, 0xDE, 0xFD, 0xE4, 0xF1, 0x67, 0x00, 0x6F, 0xF1, 0xF3, 0xF0, + 0x71, 0xFC, 0xA6, 0xE9, 0x84, 0xFD, 0xA0, 0xF0, 0x49, 0xF0, 0xA1, 0xF7, + 0x7D, 0xEB, 0x2E, 0xF4, 0xEA, 0xF4, 0xA0, 0xFA, 0x29, 0xFF, 0xF0, 0x06, + 0xF6, 0xFB, 0xF2, 0xFE, 0x06, 0xF6, 0x75, 0xFB, 0xEF, 0xFA, 0xF1, 0xFE, + 0x49, 0x04, 0x3D, 0xF6, 0x11, 0x09, 0xC2, 0xF7, 0xB8, 0xFF, 0xF8, 0x06, + 0x70, 0xF4, 0x73, 0x0F, 0x0B, 0x01, 0xD6, 0x0B, 0xF9, 0x0E, 0xC8, 0x01, + 0x89, 0x11, 0x6D, 0x00, 0xB3, 0x1B, 0x74, 0x02, 0x57, 0x29, 0x85, 0xFD, + 0x07, 0x34, 0xC2, 0x02, 0x1C, 0x32, 0x23, 0x10, 0x59, 0x2C, 0x3A, 0x1F, + 0x5F, 0x32, 0x1D, 0x2F, 0xE6, 0x3C, 0xF1, 0x31, 0xC6, 0x3B, 0x8B, 0x2B, + 0x92, 0x27, 0x10, 0x27, 0x11, 0x16, 0xDF, 0x24, 0x44, 0x19, 0x4A, 0x25, + 0xC6, 0x29, 0xF3, 0x30, 0x93, 0x31, 0x50, 0x38, 0x54, 0x2F, 0x52, 0x31, + 0x0F, 0x30, 0x2E, 0x28, 0xEF, 0x2C, 0xC7, 0x17, 0xDB, 0x23, 0x37, 0x0A, + 0xFE, 0x11, 0x77, 0x0B, 0x29, 0xF8, 0xA4, 0x10, 0xBE, 0xF3, 0x31, 0x15, + 0x22, 0x08, 0x17, 0x0B, 0x18, 0x0E, 0xC2, 0xF9, 0x13, 0x05, 0xCB, 0xF8, + 0x13, 0xFB, 0xA0, 0x01, 0xA1, 0xF4, 0xF2, 0x0F, 0xAF, 0xFA, 0xC4, 0x1E, + 0xB3, 0x05, 0x32, 0x1F, 0x58, 0x12, 0xF5, 0x18, 0xD6, 0x1B, 0xBE, 0x11, + 0x7A, 0x26, 0x36, 0x00, 0xB0, 0x2E, 0xD8, 0xF2, 0x58, 0x27, 0xE2, 0xFF, + 0x35, 0x1C, 0x0C, 0x17, 0xA3, 0x1B, 0x78, 0x21, 0xB3, 0x1C, 0x67, 0x20, + 0x77, 0x20, 0x1B, 0x18, 0x45, 0x26, 0xB6, 0x09, 0xA2, 0x26, 0x40, 0x08, + 0x98, 0x26, 0x09, 0x1B, 0xAE, 0x28, 0xA7, 0x2F, 0xE8, 0x25, 0xBE, 0x36, + 0x34, 0x25, 0xD4, 0x3B, 0x4B, 0x2D, 0xA1, 0x37, 0x1B, 0x34, 0x6B, 0x1D, + 0x47, 0x29, 0x01, 0x10, 0x54, 0x0D, 0xBB, 0x18, 0x2C, 0xF8, 0xA0, 0x17, + 0x0D, 0xFB, 0xD7, 0x15, 0xC6, 0x04, 0x98, 0x1E, 0x20, 0x10, 0xF5, 0x1E, + 0x28, 0x20, 0x79, 0x21, 0x9E, 0x22, 0x6F, 0x29, 0x38, 0x17, 0x2F, 0x26, + 0xA3, 0x10, 0x54, 0x22, 0xDF, 0x13, 0x1A, 0x2F, 0x36, 0x15, 0xC6, 0x44, + 0xC1, 0x18, 0x90, 0x48, 0x20, 0x2A, 0xE6, 0x38, 0xCC, 0x39, 0x22, 0x30, + 0x3A, 0x44, 0x4D, 0x35, 0x38, 0x4C, 0x65, 0x41, 0x5C, 0x47, 0x75, 0x4A, + 0x33, 0x49, 0x77, 0x4F, 0xA6, 0x59, 0xD9, 0x51, 0x8E, 0x5C, 0xC2, 0x48, + 0x13, 0x53, 0x60, 0x45, 0x5E, 0x4D, 0xE7, 0x47, 0x46, 0x56, 0xC6, 0x4A, + 0xE1, 0x5C, 0x83, 0x4E, 0x91, 0x54, 0xBF, 0x4E, 0x17, 0x4E, 0x09, 0x44, + 0x40, 0x47, 0xD6, 0x30, 0x51, 0x3B, 0x89, 0x29, 0x25, 0x3D, 0x43, 0x2E, + 0xEF, 0x44, 0xE8, 0x2C, 0x81, 0x3E, 0x30, 0x25, 0x2E, 0x3C, 0x62, 0x2A, + 0xD2, 0x41, 0xE2, 0x32, 0xF2, 0x33, 0xC5, 0x32, 0xC0, 0x1F, 0x72, 0x37, + 0x21, 0x19, 0x97, 0x33, 0x46, 0x0D, 0x46, 0x1B, 0x4D, 0xFB, 0x8E, 0x09, + 0x15, 0xF4, 0x24, 0x0D, 0x15, 0xF0, 0x5B, 0x07, 0x6E, 0xEA, 0x39, 0xFE, + 0x66, 0xE7, 0xB0, 0x05, 0x10, 0xE0, 0xF2, 0xFD, 0xD7, 0xDB, 0xCA, 0xEF, + 0x3A, 0xCF, 0x37, 0xE9, 0xBC, 0xC5, 0x42, 0xE5, 0x03, 0xD2, 0xBF, 0xEA, + 0xE6, 0xD6, 0x9A, 0xF0, 0xD5, 0xD3, 0xDC, 0xEC, 0xF4, 0xD7, 0xB2, 0xE2, + 0xCE, 0xD6, 0xA3, 0xDA, 0xEA, 0xC7, 0x06, 0xDC, 0x32, 0xC1, 0x49, 0xE8, + 0xA8, 0xC9, 0xCA, 0xEE, 0x1C, 0xD6, 0x53, 0xE3, 0x95, 0xDE, 0xCC, 0xD7, + 0x80, 0xD8, 0x9D, 0xD8, 0x73, 0xD0, 0x09, 0xE5, 0x70, 0xD0, 0x5E, 0xEA, + 0x98, 0xDC, 0x86, 0xEC, 0x11, 0xEA, 0x23, 0xF7, 0xE7, 0xE5, 0xF8, 0xF6, + 0x2D, 0xE6, 0x45, 0xED, 0xDC, 0xF3, 0x3B, 0xE7, 0x9B, 0xF8, 0x30, 0xE6, + 0x27, 0xFE, 0xDE, 0xF1, 0x75, 0x09, 0x72, 0x07, 0xEA, 0x09, 0xFB, 0x14, + 0x3A, 0x0A, 0x06, 0x17, 0xDB, 0x0D, 0xD5, 0x19, 0x58, 0x04, 0xAF, 0x1D, + 0x70, 0x01, 0x07, 0x1A, 0xE5, 0x11, 0xC7, 0x14, 0x61, 0x18, 0x75, 0x17, + 0xAC, 0x0B, 0x32, 0x1E, 0xE5, 0x08, 0xA8, 0x22, 0xBF, 0x11, 0x73, 0x19, + 0xC9, 0x13, 0xEE, 0x0B, 0x9B, 0x18, 0x25, 0x0E, 0x86, 0x13, 0x8E, 0x0D, + 0x09, 0xF7, 0x9C, 0xFF, 0x7C, 0xE6, 0xAD, 0xEB, 0xA0, 0xFA, 0xD7, 0xE0, + 0xA4, 0x01, 0x1F, 0xDA, 0xB8, 0xF1, 0xE8, 0xD0, 0xD6, 0xF6, 0x8E, 0xD7, + 0x0F, 0xF9, 0x71, 0xDE, 0x45, 0xE3, 0x26, 0xE4, 0x6A, 0xD4, 0x59, 0xFB, + 0x62, 0xD1, 0x77, 0x02, 0x01, 0xD3, 0x74, 0xF3, 0x53, 0xE0, 0x8C, 0xE7, + 0x71, 0xED, 0x66, 0xD5, 0xFC, 0xEC, 0x88, 0xCF, 0xCC, 0xEB, 0x4F, 0xE4, + 0x17, 0xF4, 0xC1, 0xF5, 0x9E, 0xF4, 0x5C, 0xF7, 0xA9, 0xEB, 0x3E, 0xFE, + 0xC7, 0xE9, 0x2C, 0x05, 0x79, 0xF3, 0xA0, 0xFD, 0xAD, 0x02, 0xE3, 0x05, + 0xC7, 0x06, 0x79, 0x1C, 0x03, 0x04, 0xCB, 0x2D, 0x57, 0x0C, 0xBC, 0x37, + 0x5B, 0x18, 0x27, 0x36, 0x24, 0x1B, 0xF9, 0x28, 0x22, 0x19, 0x3B, 0x1C, + 0x1F, 0x0E, 0xB6, 0x1E, 0x1B, 0xF6, 0x26, 0x23, 0x79, 0xF5, 0x98, 0x23, + 0xA0, 0x06, 0xDA, 0x1E, 0x88, 0x01, 0xA2, 0x0F, 0x6E, 0x03, 0xC0, 0x06, + 0x2F, 0x0F, 0x05, 0x06, 0xFE, 0x0A, 0x9C, 0x04, 0x0D, 0x03, 0xEA, 0x0A, + 0xAD, 0x02, 0x48, 0x12, 0xE7, 0xFE, 0x78, 0x10, 0xE4, 0xF7, 0x3C, 0x09, + 0x8B, 0xFA, 0xA2, 0xFA, 0xC2, 0xF5, 0x78, 0xE9, 0x1A, 0xF5, 0x2B, 0xEB, + 0x12, 0x01, 0x63, 0xF7, 0x39, 0x07, 0x70, 0xF2, 0x6E, 0x02, 0x8F, 0xE8, + 0xA9, 0x01, 0x59, 0xEC, 0x5A, 0x0A, 0x33, 0xEB, 0x58, 0x0C, 0x98, 0xE7, + 0xC9, 0x05, 0x6C, 0xF3, 0x3C, 0x00, 0x5F, 0xFC, 0x9C, 0x07, 0xB0, 0x01, + 0x47, 0x11, 0x04, 0x0E, 0x1D, 0x18, 0x38, 0x11, 0xF6, 0x16, 0xD9, 0x04, + 0x3B, 0x0D, 0x27, 0xFC, 0xA9, 0x0C, 0x3F, 0xFD, 0xF8, 0x0A, 0x22, 0xF0, + 0x1B, 0x01, 0x02, 0xDA, 0xFC, 0x05, 0x7C, 0xE4, 0x3F, 0x0F, 0x07, 0xF8, + 0x9A, 0x06, 0x2C, 0xEF, 0x0A, 0xF6, 0x0C, 0xE6, 0x65, 0xE8, 0x30, 0xE8, + 0x2B, 0xD7, 0x42, 0xE9, 0xA8, 0xC0, 0xC6, 0xE7, 0x15, 0xB1, 0x95, 0xE0, + 0x2C, 0xAD, 0xA6, 0xD1, 0x3C, 0xAA, 0xDF, 0xB9, 0x46, 0xAD, 0x95, 0xB6, + 0x8C, 0xB5, 0x69, 0xC5, 0x41, 0xAD, 0xFA, 0xC5, 0x27, 0xA4, 0x81, 0xC5, + 0x0D, 0xAA, 0x82, 0xCD, 0xF8, 0xB4, 0x8F, 0xDA, 0x62, 0xBD, 0xBE, 0xDA, + 0x00, 0xC3, 0x21, 0xCD, 0x7D, 0xCE, 0x4A, 0xC5, 0x78, 0xCD, 0x92, 0xBD, + 0x75, 0xC5, 0xBE, 0xC2, 0xA1, 0xCA, 0x71, 0xCD, 0x37, 0xD6, 0x0D, 0xCE, + 0x45, 0xDC, 0x2E, 0xCD, 0x16, 0xD9, 0xE4, 0xC9, 0x98, 0xDE, 0x62, 0xCB, + 0x5E, 0xE2, 0x70, 0xCE, 0xFD, 0xE2, 0x60, 0xCF, 0x28, 0xE9, 0x29, 0xCD, + 0xBA, 0xE3, 0x0B, 0xD1, 0x56, 0xE2, 0x31, 0xEA, 0x39, 0xF6, 0x33, 0xFD, + 0x1A, 0x0A, 0xE5, 0xF7, 0x52, 0x0B, 0xAE, 0xEC, 0x8D, 0xFC, 0x7C, 0xE2, + 0xF3, 0xF8, 0x9F, 0xE2, 0xD2, 0x00, 0x3A, 0xF6, 0xB3, 0xFD, 0xD8, 0x08, + 0xDA, 0x02, 0x22, 0x0D, 0xBF, 0x0D, 0xC0, 0x0A, 0xB1, 0x10, 0x9D, 0x06, + 0x23, 0x1A, 0x16, 0x05, 0xED, 0x1E, 0xBB, 0x10, 0xBA, 0x10, 0xE0, 0x23, + 0x24, 0x09, 0x1E, 0x27, 0xB5, 0x20, 0xE4, 0x17, 0x3A, 0x37, 0x98, 0x0E, + 0x7F, 0x27, 0xE7, 0x0C, 0xA8, 0x13, 0xBC, 0x08, 0x8A, 0x12, 0xDB, 0x0C, + 0x74, 0x12, 0x32, 0x13, 0x5C, 0x12, 0x14, 0x08, 0x08, 0x13, 0xB5, 0xFB, + 0xE8, 0x0D, 0xAD, 0xF7, 0x8F, 0x07, 0x6E, 0xED, 0xDE, 0x04, 0x02, 0xDE, + 0x93, 0xFE, 0xEC, 0xDC, 0x39, 0xEE, 0x58, 0xEF, 0x56, 0xD9, 0xAC, 0xF4, + 0x27, 0xCF, 0xA8, 0xE5, 0xE4, 0xCE, 0xF0, 0xD9, 0xC7, 0xCE, 0x6E, 0xD1, + 0x2E, 0xD5, 0xCE, 0xC0, 0x48, 0xE2, 0x36, 0xBD, 0x2B, 0xDF, 0x5E, 0xC9, + 0x0C, 0xCC, 0xBD, 0xC8, 0x5E, 0xBD, 0xD6, 0xC4, 0xDB, 0xBD, 0x04, 0xCD, + 0x37, 0xC7, 0x5C, 0xCE, 0xFB, 0xD4, 0x4A, 0xCB, 0xDA, 0xDB, 0xFD, 0xD5, + 0x50, 0xD4, 0xB0, 0xDE, 0x60, 0xD5, 0x0A, 0xDB, 0x2A, 0xE1, 0x9E, 0xDA, + 0x5F, 0xEA, 0x96, 0xE5, 0xE6, 0xF1, 0x97, 0xF1, 0x46, 0xF5, 0x1B, 0xF2, + 0xD5, 0xF1, 0xF3, 0xF1, 0x6B, 0xE9, 0xDC, 0xED, 0xFA, 0xDF, 0xC4, 0xE4, + 0x4B, 0xE2, 0x58, 0xE9, 0x0B, 0xEF, 0xC9, 0xEE, 0xB5, 0xF7, 0x1D, 0xE3, + 0xCA, 0xF8, 0x05, 0xD3, 0xD4, 0xF8, 0xEB, 0xDA, 0x84, 0xFE, 0xFD, 0xEC, + 0x20, 0x01, 0x93, 0xF0, 0xB6, 0xFA, 0x37, 0xF4, 0x92, 0xE9, 0xB0, 0xED, + 0x7A, 0xD6, 0x5F, 0xDB, 0x15, 0xD3, 0x02, 0xD6, 0x26, 0xD9, 0x82, 0xD6, + 0xF0, 0xDD, 0x3E, 0xD1, 0xC1, 0xE9, 0xFF, 0xD2, 0x83, 0xEF, 0xD7, 0xD2, + 0x49, 0xE5, 0xC3, 0xC6, 0xA3, 0xDD, 0x73, 0xBE, 0x70, 0xDB, 0x01, 0xC4, + 0x96, 0xD6, 0x5E, 0xD3, 0x23, 0xD6, 0x00, 0xDA, 0xB7, 0xDF, 0x41, 0xD8, + 0xEE, 0xED, 0xAC, 0xDE, 0x2D, 0xF9, 0x6A, 0xE7, 0x13, 0xFE, 0xAC, 0xF2, + 0xEA, 0x01, 0x4E, 0x05, 0x1F, 0xF9, 0x0A, 0x06, 0xA7, 0xF0, 0xC2, 0xFA, + 0xE9, 0xFF, 0x9D, 0xFD, 0xF9, 0x15, 0xC7, 0x03, 0x5E, 0x1E, 0x3B, 0xFD, + 0x20, 0x1D, 0x42, 0xF7, 0xE3, 0x1F, 0xAB, 0x06, 0xB8, 0x1A, 0xB4, 0x19, + 0x8F, 0x0C, 0x87, 0x27, 0x5F, 0x07, 0x8E, 0x30, 0x63, 0x0D, 0x77, 0x29, + 0xD4, 0x10, 0xC9, 0x16, 0xDD, 0x0B, 0xF4, 0x08, 0x45, 0x01, 0xA7, 0x00, + 0xD3, 0xF7, 0x50, 0xF8, 0x45, 0xF1, 0x5A, 0x05, 0x8E, 0xF3, 0x45, 0x1F, + 0xF4, 0xFD, 0x6D, 0x26, 0xEC, 0xFE, 0x65, 0x1F, 0x06, 0x05, 0x82, 0x1A, + 0x64, 0x12, 0xB0, 0x13, 0xAD, 0x13, 0xEE, 0x08, 0x81, 0x0D, 0x8D, 0x08, + 0x87, 0x0C, 0x6A, 0x0D, 0xAC, 0x12, 0x77, 0x11, 0x23, 0x16, 0xD2, 0x1B, + 0x37, 0x17, 0x35, 0x20, 0x25, 0x21, 0x93, 0x14, 0xDE, 0x27, 0xF8, 0x0C, + 0xE7, 0x1B, 0x54, 0x0F, 0x7A, 0x14, 0xA3, 0x12, 0x22, 0x1C, 0x02, 0x20, + 0xA2, 0x1F, 0x94, 0x27, 0x86, 0x2E, 0xCD, 0x23, 0xAF, 0x4F, 0x2A, 0x29, + 0xEA, 0x52, 0x08, 0x2C, 0x14, 0x3B, 0x8B, 0x2B, 0x90, 0x3A, 0x3E, 0x2F, + 0x80, 0x4B, 0x82, 0x37, 0xEB, 0x3E, 0x79, 0x37, 0x0B, 0x2B, 0x2D, 0x2E, + 0x5D, 0x34, 0xB5, 0x2B, 0xC3, 0x3D, 0xDE, 0x2A, 0x9D, 0x32, 0x12, 0x29, + 0x9B, 0x23, 0xF3, 0x28, 0x27, 0x1A, 0xA6, 0x32, 0x65, 0x16, 0x7C, 0x43, + 0xE1, 0x2F, 0xF9, 0x4C, 0xFF, 0x49, 0x5B, 0x44, 0xEF, 0x42, 0xE3, 0x39, + 0x6F, 0x3A, 0x4F, 0x39, 0x5F, 0x3F, 0x92, 0x30, 0xA4, 0x3F, 0x63, 0x25, + 0xB2, 0x30, 0xC1, 0x26, 0xA0, 0x2B, 0x74, 0x32, 0x80, 0x39, 0xCA, 0x37, + 0xF2, 0x39, 0x77, 0x21, 0x4C, 0x39, 0xBF, 0x07, 0x54, 0x3E, 0x61, 0xFE, + 0xCB, 0x2A, 0x8C, 0xF8, 0x5F, 0x13, 0x1B, 0x09, 0xBF, 0x10, 0xC4, 0x21, + 0x15, 0x0E, 0xC2, 0x19, 0xDC, 0x0A, 0x83, 0x09, 0x1E, 0x0E, 0x97, 0xFD, + 0xE1, 0x0D, 0x78, 0xF0, 0xF5, 0x06, 0x9D, 0xF0, 0x06, 0xF2, 0x15, 0xF9, + 0xCA, 0xDE, 0x68, 0xFE, 0x23, 0xDA, 0xB6, 0xEF, 0x77, 0xD7, 0x46, 0xDC, + 0xD9, 0xD7, 0xB6, 0xD4, 0xFE, 0xD6, 0x2B, 0xCE, 0x33, 0xD3, 0xA5, 0xDA, + 0x83, 0xE0, 0x86, 0xF0, 0x10, 0xF3, 0xE5, 0xF5, 0xE3, 0xFD, 0x6B, 0x03, + 0x0B, 0x00, 0xF2, 0x13, 0x0E, 0xF6, 0x57, 0x0E, 0xDD, 0xF3, 0xD9, 0x0B, + 0xBE, 0xFA, 0x6F, 0x1B, 0x9D, 0x00, 0x5D, 0x2C, 0xAE, 0x0A, 0x51, 0x3C, + 0x8A, 0x17, 0xD4, 0x42, 0xE6, 0x1C, 0xA4, 0x3C, 0xE8, 0x1F, 0xD4, 0x37, + 0xC8, 0x24, 0x26, 0x2E, 0x35, 0x27, 0xC9, 0x28, 0x60, 0x2D, 0xBC, 0x2E, + 0x99, 0x30, 0xA9, 0x33, 0x3C, 0x2A, 0xD9, 0x39, 0xE0, 0x2A, 0xCA, 0x39, + 0xE5, 0x2C, 0x10, 0x31, 0x6C, 0x27, 0xD0, 0x2F, 0x19, 0x23, 0xF7, 0x30, + 0x09, 0x25, 0x7A, 0x2D, 0x2E, 0x27, 0xC4, 0x28, 0xD3, 0x25, 0x6F, 0x22, + 0xB0, 0x23, 0x66, 0x1C, 0x74, 0x1B, 0x3B, 0x18, 0xDA, 0x19, 0x33, 0x15, + 0x88, 0x19, 0xB9, 0x08, 0xB0, 0x12, 0x1F, 0xFE, 0xDE, 0x14, 0xD3, 0x05, + 0x08, 0x16, 0x15, 0x0C, 0x87, 0x16, 0xEC, 0x11, 0x91, 0x13, 0x15, 0x1B, + 0x9F, 0x03, 0x53, 0x17, 0x9D, 0xFB, 0xC4, 0x12, 0x09, 0xFD, 0xD2, 0x14, + 0x16, 0x01, 0x15, 0x13, 0xF0, 0x0C, 0xF1, 0x03, 0xAF, 0x17, 0xF3, 0xF3, + 0x66, 0x1B, 0x81, 0xF4, 0x7A, 0x1D, 0x0A, 0xFB, 0x14, 0x1B, 0x27, 0x01, + 0x04, 0x18, 0xE0, 0x0B, 0x42, 0x16, 0x4E, 0x1B, 0x16, 0x0D, 0x52, 0x1E, + 0x2A, 0x05, 0x4D, 0x10, 0x58, 0xFB, 0xD6, 0x03, 0x02, 0xFC, 0xCF, 0xFA, + 0xEC, 0x08, 0xAF, 0xFD, 0x32, 0xFE, 0x0F, 0x0D, 0xFC, 0xF7, 0xA3, 0x17, + 0x9F, 0xFC, 0x10, 0x15, 0xD8, 0xF0, 0xBB, 0x0C, 0xA0, 0xEF, 0x48, 0x0D, + 0x86, 0xEA, 0xE3, 0x00, 0x82, 0xD2, 0xEE, 0xF0, 0xFD, 0xC8, 0x12, 0xF2, + 0x9B, 0xCE, 0x29, 0xEC, 0x93, 0xD2, 0x91, 0xEA, 0x30, 0xCD, 0x22, 0xF4, + 0x8F, 0xC7, 0xC1, 0xF0, 0x41, 0xCE, 0x30, 0xED, 0xD3, 0xCE, 0xF0, 0xF7, + 0x58, 0xC3, 0x3D, 0xFE, 0xD5, 0xBE, 0x1F, 0xF6, 0x0B, 0xC9, 0x62, 0xED, + 0xBC, 0xD8, 0xC0, 0xF2, 0x1F, 0xE0, 0x67, 0xF3, 0xCA, 0xE0, 0xE2, 0xE7, + 0xAB, 0xE0, 0x1E, 0xE8, 0x5F, 0xF2, 0xC0, 0xF6, 0x3D, 0x02, 0xC8, 0xF3, + 0xB1, 0x08, 0xAA, 0xF1, 0xEC, 0x17, 0x3F, 0x09, 0x62, 0x24, 0x40, 0x0D, + 0x77, 0x34, 0x7C, 0x00, 0x08, 0x37, 0x82, 0xFD, 0x75, 0x26, 0xA6, 0x02, + 0xB6, 0x1F, 0xEB, 0x0D, 0xB9, 0x21, 0xC0, 0x17, 0xC5, 0x23, 0x54, 0x22, + 0xCD, 0x29, 0x27, 0x29, 0xC0, 0x2A, 0x49, 0x1E, 0xA8, 0x24, 0x2C, 0x16, + 0xFD, 0x1A, 0x8C, 0x12, 0xE9, 0x10, 0x1F, 0x06, 0x5A, 0x05, 0x8B, 0x03, + 0x3D, 0xFB, 0x60, 0x0D, 0x57, 0x00, 0x92, 0x0D, 0x0E, 0x0A, 0x34, 0x04, + 0xB4, 0x01, 0x3F, 0xFA, 0x66, 0xF5, 0xF0, 0xF1, 0xE1, 0x01, 0xB3, 0xF6, + 0x48, 0x13, 0x05, 0x04, 0x8E, 0x11, 0x4D, 0x0F, 0xBD, 0x04, 0x46, 0x0F, + 0x67, 0xF3, 0x65, 0x03, 0x49, 0xE7, 0xDC, 0xFE, 0x3E, 0xEC, 0x2C, 0x00, + 0x5A, 0xED, 0xF1, 0xFE, 0x21, 0xE6, 0xD1, 0x02, 0x92, 0xE7, 0xA3, 0x07, + 0xFE, 0xEC, 0x3D, 0x00, 0x2A, 0xF4, 0x0F, 0xF7, 0x60, 0xF5, 0x2F, 0xF8, + 0xC2, 0xEF, 0x3B, 0xFE, 0x61, 0xEA, 0x8F, 0xFD, 0x15, 0xEA, 0xDD, 0xFB, + 0x17, 0xEF, 0x62, 0x09, 0x86, 0xEE, 0xB5, 0x11, 0xDE, 0xE8, 0x7B, 0x0D, + 0x35, 0xE7, 0x83, 0x05, 0xC9, 0xE6, 0x63, 0xEF, 0x27, 0xE9, 0xC5, 0xE6, + 0xB9, 0xF0, 0x72, 0xFD, 0xE1, 0xF3, 0x76, 0x14, 0x00, 0xF9, 0xF3, 0x20, + 0xC2, 0x04, 0xAC, 0x21, 0x84, 0x08, 0x4B, 0x12, 0x46, 0x03, 0x25, 0x00, + 0x14, 0x05, 0x99, 0xF9, 0x0B, 0x05, 0xBA, 0xFB, 0xDD, 0xFF, 0xF0, 0x02, + 0x29, 0x12, 0x72, 0x14, 0xDD, 0x22, 0x16, 0x12, 0xF1, 0x1A, 0x1B, 0xFE, + 0x4B, 0x15, 0xAD, 0x01, 0xD3, 0x0E, 0x88, 0x0E, 0xB8, 0x03, 0x18, 0x0A, + 0x84, 0x0A, 0x12, 0x08, 0x65, 0x16, 0x93, 0x0D, 0xFF, 0x10, 0x4B, 0xFD, + 0x4F, 0x0A, 0x50, 0xEE, 0x4A, 0x06, 0xEE, 0xF6, 0x0A, 0x01, 0x49, 0xF6, + 0x15, 0xFF, 0xEF, 0xE6, 0xAB, 0xFF, 0x81, 0xE3, 0xF7, 0xFF, 0xDA, 0xE3, + 0x0F, 0xFA, 0x7A, 0xD4, 0x86, 0xEB, 0x60, 0xC7, 0xB6, 0xD2, 0xD6, 0xC6, + 0xD6, 0xC2, 0xDE, 0xC6, 0x5D, 0xC1, 0x74, 0xCB, 0x63, 0xBA, 0x5C, 0xCD, + 0xEA, 0xB6, 0x53, 0xC0, 0x81, 0xCD, 0x10, 0xBE, 0x2F, 0xE6, 0xE9, 0xC6, + 0x41, 0xE5, 0xEC, 0xC2, 0x9C, 0xDE, 0x95, 0xBB, 0x22, 0xDC, 0xF0, 0xC2, + 0x6F, 0xD1, 0xD0, 0xD2, 0xCA, 0xCC, 0x42, 0xE0, 0xB9, 0xD3, 0x0A, 0xE5, + 0x99, 0xCF, 0x5C, 0xDE, 0xA2, 0xD3, 0x39, 0xD6, 0x45, 0xE8, 0x48, 0xD5, + 0x8E, 0xE3, 0x3F, 0xD2, 0xD9, 0xD3, 0xF9, 0xD5, 0xF7, 0xD7, 0xC2, 0xEC, + 0x50, 0xE5, 0x2C, 0xFD, 0x5C, 0xE8, 0x21, 0x01, 0x3E, 0xE5, 0x30, 0x03, + 0x9B, 0xF0, 0x1D, 0x00, 0x30, 0xF7, 0x1F, 0x00, 0xE1, 0xEE, 0x07, 0x00, + 0x3D, 0xEE, 0xAD, 0xF6, 0xA9, 0xEF, 0xE7, 0xEF, 0xF0, 0xF4, 0x63, 0xFA, + 0x33, 0x02, 0xE3, 0x09, 0x41, 0x07, 0xDE, 0x11, 0xEB, 0xF9, 0x16, 0x11, + 0x47, 0xEC, 0xBB, 0x0B, 0xC7, 0xEF, 0xA9, 0x07, 0x66, 0xF0, 0xE9, 0x01, + 0x56, 0xEA, 0x86, 0x03, 0x44, 0xEA, 0xE9, 0xFE, 0x9C, 0xF9, 0x5C, 0xEF, + 0x60, 0x0F, 0x2E, 0xF2, 0x71, 0x0E, 0x38, 0xFA, 0xF2, 0xFD, 0xFD, 0xF6, + 0xA8, 0xF3, 0xE0, 0xF5, 0xF4, 0xF5, 0x1B, 0xEF, 0x89, 0x09, 0xF5, 0xE4, + 0x9A, 0x1E, 0x36, 0xE9, 0x9F, 0x1A, 0xE2, 0xED, 0x5F, 0x16, 0x17, 0xF7, + 0xAB, 0x2A, 0xB6, 0x09, 0x07, 0x34, 0x89, 0x0F, 0x82, 0x28, 0xCE, 0x15, + 0x61, 0x1F, 0xD4, 0x1F, 0x57, 0x1A, 0x9E, 0x17, 0x94, 0x1B, 0x0D, 0x0C, + 0xB8, 0x1E, 0xDB, 0x04, 0x87, 0x17, 0x1B, 0xFC, 0x9B, 0x10, 0x39, 0x00, + 0x12, 0x11, 0xDA, 0x0C, 0x48, 0x10, 0x54, 0x10, 0xCE, 0x04, 0x92, 0x0A, + 0x80, 0xF5, 0x98, 0x01, 0x19, 0xF2, 0x76, 0xF1, 0x2D, 0xF3, 0x34, 0xDD, + 0xE2, 0xED, 0x91, 0xD2, 0xB9, 0xDA, 0x87, 0xCF, 0xE0, 0xC6, 0xBD, 0xD3, + 0x49, 0xC1, 0x9A, 0xDA, 0x1F, 0xBF, 0xD6, 0xDB, 0x13, 0xC5, 0x4E, 0xE5, + 0x4B, 0xCC, 0xE7, 0xEF, 0x31, 0xC9, 0x0C, 0xE7, 0x59, 0xC8, 0x8A, 0xD3, + 0x96, 0xCC, 0xA2, 0xC9, 0x89, 0xD5, 0x64, 0xCD, 0x43, 0xE1, 0x07, 0xD2, + 0x6D, 0xEA, 0x48, 0xD7, 0xA9, 0xEB, 0xD1, 0xD6, 0x92, 0xED, 0xBF, 0xD7, + 0x7A, 0xFD, 0xC2, 0xED, 0x43, 0x04, 0x4D, 0xF9, 0xB1, 0xF6, 0xD1, 0xE9, + 0xEE, 0xF3, 0x31, 0xE3, 0xF6, 0xF9, 0xA3, 0xE8, 0xD8, 0xFF, 0x9A, 0xED, + 0x29, 0x0C, 0x34, 0xF4, 0x17, 0x0E, 0x52, 0xFA, 0x2A, 0x06, 0xE8, 0x01, + 0x94, 0x0D, 0xF4, 0x0D, 0x6F, 0x04, 0x0C, 0xFF, 0x91, 0xE5, 0x53, 0xE3, + 0xF9, 0xD9, 0xA8, 0xD8, 0x7D, 0xDF, 0xBD, 0xCA, 0x02, 0xEE, 0xD0, 0xC5, + 0x84, 0xF6, 0x1C, 0xC5, 0x9D, 0xEF, 0x77, 0xBB, 0xE3, 0xDE, 0x4C, 0xC0, + 0xF5, 0xCD, 0xC8, 0xD0, 0x75, 0xCB, 0x40, 0xD6, 0x59, 0xD9, 0x67, 0xD7, + 0xE4, 0xE2, 0x48, 0xDF, 0x29, 0xDD, 0x1F, 0xE2, 0x85, 0xE5, 0x65, 0xE6, + 0x23, 0xF4, 0x37, 0xEA, 0x5D, 0xF0, 0xDE, 0xE4, 0x7A, 0xF4, 0x42, 0xEB, + 0x40, 0x04, 0x07, 0xFB, 0xD7, 0xFD, 0xD8, 0xFF, 0x66, 0xF6, 0xB4, 0xFF, + 0xB8, 0x04, 0x7E, 0xF7, 0xD3, 0x08, 0xD2, 0xEB, 0xF7, 0x04, 0x91, 0xF0, + 0xFC, 0x0A, 0x72, 0xFB, 0x9C, 0x05, 0x4B, 0xFF, 0xC5, 0xFA, 0xB7, 0x08, + 0x26, 0x03, 0xC0, 0x10, 0xBD, 0x0E, 0xC6, 0x01, 0xE9, 0x10, 0xE3, 0xED, + 0x35, 0x0A, 0xAD, 0xE3, 0x7A, 0x09, 0xFD, 0xE3, 0x42, 0x0E, 0x17, 0xF1, + 0x85, 0x03, 0x2C, 0x00, 0x3B, 0x02, 0x4B, 0x0C, 0xC7, 0x18, 0xEC, 0x1A, + 0x41, 0x1C, 0x54, 0x1D, 0x32, 0x0D, 0xB4, 0x12, 0xDC, 0x0D, 0xD8, 0x0F, + 0x2B, 0x17, 0xD7, 0x18, 0xDD, 0x17, 0x56, 0x28, 0x42, 0x0D, 0x06, 0x2D, + 0x50, 0x0C, 0x7D, 0x33, 0xEA, 0x0F, 0x0C, 0x42, 0xB8, 0x17, 0x5F, 0x4A, + 0x0F, 0x2B, 0x8B, 0x4A, 0x4F, 0x2E, 0x83, 0x43, 0x19, 0x23, 0x59, 0x3B, + 0x05, 0x21, 0xB1, 0x30, 0x08, 0x2B, 0xA9, 0x2B, 0x89, 0x2C, 0xAA, 0x31, + 0xAC, 0x2D, 0xD1, 0x3E, 0xD1, 0x2F, 0xC7, 0x39, 0xF8, 0x2E, 0xE8, 0x2D, + 0xCD, 0x30, 0x8C, 0x30, 0x63, 0x24, 0x5C, 0x2A, 0xA5, 0x13, 0xE8, 0x2B, + 0x97, 0x0E, 0x23, 0x33, 0x47, 0x22, 0x68, 0x2D, 0xD0, 0x34, 0xBF, 0x1D, + 0x36, 0x27, 0x1E, 0x0F, 0x3A, 0x10, 0x77, 0x0D, 0xB5, 0x04, 0x11, 0x0E, + 0x14, 0x12, 0xCC, 0x13, 0xE8, 0x23, 0x5A, 0x19, 0x19, 0x29, 0x8C, 0x16, + 0x26, 0x2C, 0x3B, 0x0D, 0xA7, 0x36, 0xD0, 0x09, 0xC7, 0x3D, 0xF5, 0x0B, + 0x45, 0x32, 0xEA, 0x0B, 0x2E, 0x23, 0xB1, 0x1B, 0x9D, 0x1E, 0xCF, 0x34, + 0xF5, 0x24, 0x7A, 0x3F, 0xD9, 0x30, 0x94, 0x3F, 0xD5, 0x34, 0xEB, 0x36, + 0x06, 0x30, 0xE6, 0x1E, 0x92, 0x3F, 0x3B, 0x19, 0x21, 0x48, 0xAE, 0x1D, + 0x53, 0x35, 0x24, 0x1D, 0x69, 0x26, 0x14, 0x29, 0x87, 0x24, 0x9D, 0x30, + 0x6F, 0x28, 0xDA, 0x22, 0x7F, 0x35, 0x54, 0x1D, 0xBA, 0x2F, 0x2D, 0x18, + 0x99, 0x12, 0x4A, 0x02, 0xE3, 0x0E, 0xE4, 0xFE, 0x14, 0x13, 0x4C, 0x01, + 0x5D, 0xFD, 0x35, 0xF1, 0x7C, 0xE5, 0xD1, 0xE4, 0x1D, 0xDB, 0xE8, 0xE2, + 0xC8, 0xDA, 0x1E, 0xE2, 0xD4, 0xE0, 0xAF, 0xE3, 0x70, 0xE3, 0xAD, 0xED, + 0x1E, 0xE0, 0xE3, 0xFA, 0xC5, 0xD6, 0x8F, 0xF1, 0x6E, 0xCC, 0x40, 0xD4, + 0xB8, 0xD8, 0xD6, 0xD3, 0x06, 0xED, 0x86, 0xEA, 0x2A, 0xE9, 0x98, 0xE8, + 0xBC, 0xE9, 0x90, 0xE9, 0x6F, 0xEB, 0xE9, 0xF6, 0xD7, 0xE5, 0xE1, 0xFE, + 0xC9, 0xEF, 0x1E, 0x0C, 0xF1, 0xF9, 0x95, 0x10, 0x3A, 0xFD, 0x49, 0x03, + 0x7E, 0x0F, 0xBB, 0x04, 0x6C, 0x1F, 0xFB, 0x17, 0x26, 0x1C, 0xBC, 0x28, + 0x7B, 0x1B, 0x3B, 0x3A, 0x40, 0x1B, 0x1C, 0x46, 0xBD, 0x18, 0xEF, 0x52, + 0xFF, 0x1E, 0x0B, 0x5C, 0x66, 0x29, 0xB9, 0x46, 0xD8, 0x23, 0xAC, 0x20, + 0x70, 0x1A, 0x6E, 0x12, 0xF1, 0x22, 0x17, 0x23, 0x63, 0x1E, 0x3D, 0x34, + 0xE4, 0x14, 0x49, 0x42, 0x66, 0x10, 0x28, 0x3E, 0xCC, 0x0A, 0x92, 0x2A, + 0xDA, 0x16, 0x1E, 0x27, 0xA0, 0x1F, 0xAE, 0x1F, 0x9B, 0x1D, 0x82, 0x0F, + 0x57, 0x13, 0x35, 0x07, 0x00, 0x03, 0x17, 0x0E, 0xFD, 0x00, 0x8B, 0x17, + 0x8C, 0x14, 0xFA, 0x17, 0xE7, 0x20, 0x63, 0x11, 0x75, 0x1B, 0x63, 0x05, + 0xF0, 0x13, 0xBB, 0xF6, 0x3F, 0x11, 0xD7, 0xF5, 0x6E, 0x17, 0x9D, 0x04, + 0x8A, 0x16, 0xED, 0x02, 0x34, 0x12, 0x41, 0xFF, 0x0F, 0x0D, 0x4C, 0x08, + 0x39, 0x0B, 0x3B, 0x0D, 0x37, 0x1C, 0x83, 0x11, 0x1B, 0x1C, 0x3F, 0x0C, + 0x5C, 0x07, 0xFA, 0xFA, 0xEE, 0x06, 0xD5, 0xF0, 0x61, 0x0D, 0x0E, 0xEF, + 0x7F, 0x0A, 0x83, 0xF4, 0x4E, 0x05, 0x3C, 0xF8, 0xC1, 0x02, 0x4B, 0xF8, + 0xB4, 0x03, 0x9A, 0xFF, 0xD4, 0x03, 0x1C, 0x06, 0xB9, 0xFC, 0xE5, 0x01, + 0xA1, 0xE8, 0x5C, 0xF9, 0x00, 0xD4, 0x6A, 0xFB, 0xBB, 0xD6, 0x41, 0x05, + 0x8F, 0xDD, 0x1C, 0xFD, 0xC3, 0xD3, 0xAB, 0xEA, 0x04, 0xD8, 0x72, 0xF3, + 0xD1, 0xE1, 0xF8, 0x03, 0x64, 0xDD, 0xFA, 0x04, 0xD8, 0xE0, 0x80, 0x0B, + 0x00, 0xF1, 0x98, 0x11, 0x4A, 0xF4, 0xF6, 0x08, 0x4D, 0xE9, 0xE2, 0x02, + 0x4A, 0xED, 0xEA, 0x01, 0x0A, 0x00, 0xC8, 0xFC, 0xFB, 0x11, 0x43, 0x05, + 0x2B, 0x13, 0xA7, 0x0F, 0xC0, 0x0A, 0x1A, 0x0B, 0xEF, 0x0B, 0x7F, 0x09, + 0x26, 0x05, 0x39, 0x02, 0x7E, 0xFB, 0xE4, 0xF7, 0xF7, 0xF7, 0xE7, 0xF5, + 0xEF, 0xF0, 0xE2, 0xED, 0xC1, 0xF5, 0xDD, 0xE9, 0xDF, 0x02, 0x43, 0xEC, + 0xED, 0xFC, 0x60, 0xE7, 0x9E, 0xEE, 0xCA, 0xE4, 0x64, 0xEF, 0x06, 0xE3, + 0x49, 0xF8, 0x17, 0xD9, 0x0B, 0x02, 0xC1, 0xD5, 0xCD, 0xFC, 0xE6, 0xD6, + 0x42, 0xEE, 0x94, 0xD4, 0x12, 0xEB, 0x1D, 0xDF, 0xF9, 0xEA, 0x79, 0xF9, + 0x03, 0xE6, 0xDD, 0x0E, 0x73, 0xDE, 0x9A, 0x0D, 0x06, 0xF4, 0x40, 0x09, + 0x56, 0x21, 0x89, 0x10, 0xE0, 0x2F, 0xD1, 0x13, 0x27, 0x22, 0xBB, 0x18, + 0x8D, 0x14, 0x82, 0x27, 0x55, 0x11, 0xC1, 0x2B, 0x8E, 0x1A, 0x90, 0x21, + 0x69, 0x21, 0x86, 0x1B, 0x6F, 0x1C, 0xFA, 0x1A, 0x74, 0x18, 0x66, 0x1C, + 0x24, 0x25, 0xC1, 0x1C, 0x67, 0x2C, 0x88, 0x16, 0xB8, 0x1C, 0xD4, 0x13, + 0xCA, 0x11, 0xE0, 0x1B, 0xBC, 0x11, 0xD5, 0x1E, 0xCF, 0x0B, 0xC6, 0x1B, + 0x50, 0x01, 0xAC, 0x1A, 0xE2, 0x01, 0x30, 0x21, 0x52, 0x07, 0xB9, 0x2F, + 0x47, 0x07, 0xAA, 0x31, 0xA9, 0x04, 0x95, 0x21, 0xEC, 0x02, 0x93, 0x12, + 0x2F, 0xFD, 0x11, 0x07, 0x45, 0xF8, 0xA4, 0xFF, 0xCE, 0xFA, 0x82, 0xFD, + 0xC0, 0xF0, 0xCB, 0x01, 0xA7, 0xDE, 0x90, 0x0D, 0x83, 0xDF, 0x84, 0x0C, + 0xD5, 0xEE, 0xDC, 0x00, 0x89, 0xFA, 0xF2, 0xFC, 0x6A, 0xFB, 0xF6, 0xF6, + 0x2C, 0x06, 0xF8, 0xFA, 0x03, 0x14, 0x6A, 0x07, 0x3B, 0x0E, 0x06, 0x02, + 0x67, 0x07, 0x72, 0x07, 0xC6, 0xFE, 0xF3, 0x1B, 0x92, 0xF2, 0x95, 0x1F, + 0xAD, 0xFD, 0x82, 0x19, 0xF3, 0x18, 0x0E, 0x12, 0x88, 0x23, 0xC2, 0x0C, + 0x48, 0x26, 0xE9, 0x10, 0x4B, 0x31, 0x9C, 0x12, 0x7C, 0x2A, 0x11, 0x04, + 0x04, 0x18, 0xB8, 0xFF, 0xC3, 0x14, 0x25, 0x0C, 0x13, 0x16, 0xE8, 0x0B, + 0x9A, 0x0E, 0x9F, 0xFD, 0x70, 0x00, 0xF3, 0xE7, 0xDF, 0xF5, 0xE0, 0xDB, + 0xA5, 0xEC, 0xFF, 0xDD, 0xD5, 0xDD, 0x1A, 0xD2, 0x5C, 0xE2, 0x6D, 0xC3, + 0x36, 0xF2, 0xDE, 0xC3, 0x80, 0xE8, 0x38, 0xC0, 0xF6, 0xD4, 0x83, 0xB9, + 0xD0, 0xD1, 0x75, 0xBA, 0x8E, 0xD3, 0xD5, 0xB5, 0x18, 0xCA, 0x36, 0xAA, + 0xCF, 0xC2, 0xD7, 0xA2, 0x35, 0xC1, 0x8B, 0xA1, 0x0D, 0xBB, 0x01, 0xA9, + 0xC1, 0xB4, 0xDD, 0xAD, 0x16, 0xAC, 0x89, 0xAC, 0xEA, 0xA3, 0x39, 0xAD, + 0xD6, 0xAA, 0x9F, 0xAB, 0x7B, 0xB8, 0x47, 0xA4, 0xB2, 0xBA, 0x77, 0x9C, + 0x75, 0xC1, 0x1E, 0xA8, 0xB3, 0xC7, 0x80, 0xB9, 0x49, 0xC6, 0xD5, 0xC4, + 0xC7, 0xD5, 0xD5, 0xDD, 0x5E, 0xE4, 0x66, 0xF1, 0x1B, 0xE2, 0x35, 0xF4, + 0xC9, 0xE1, 0x8A, 0xF5, 0x92, 0xE8, 0xA9, 0xF9, 0x39, 0xE8, 0x12, 0xF6, + 0x34, 0xE8, 0x7D, 0xFC, 0xB7, 0xEF, 0x5D, 0x18, 0x77, 0xF9, 0x0C, 0x27, + 0xB1, 0x09, 0xAC, 0x24, 0x8B, 0x13, 0xF3, 0x1F, 0x43, 0x10, 0xEE, 0x19, + 0x88, 0xFF, 0x39, 0x12, 0x00, 0xEC, 0x97, 0x13, 0x2C, 0xF0, 0x5C, 0x19, + 0xDA, 0xFD, 0xA2, 0x0A, 0xE3, 0x08, 0x0A, 0xFE, 0x4F, 0x11, 0x94, 0x04, + 0xA1, 0x0D, 0xA2, 0x09, 0x10, 0x0A, 0xAB, 0x0C, 0x37, 0x0B, 0xCA, 0x1A, + 0xE9, 0x05, 0x0D, 0x27, 0xCD, 0x00, 0xC5, 0x1F, 0xAA, 0x0C, 0xF8, 0x16, + 0xD3, 0x18, 0x24, 0x0C, 0x65, 0x13, 0xA8, 0xFD, 0x02, 0x06, 0xB4, 0xFA, + 0x4D, 0x02, 0xF7, 0xF7, 0x13, 0x0E, 0x09, 0xF3, 0x5C, 0x12, 0x3E, 0xEB, + 0xC2, 0x0C, 0xD2, 0xE5, 0xF8, 0x0A, 0x67, 0xE8, 0x90, 0x07, 0x15, 0xE3, + 0x75, 0xFB, 0x15, 0xD1, 0x36, 0xE7, 0x85, 0xC9, 0x50, 0xD5, 0xA2, 0xD9, + 0x56, 0xC7, 0x6F, 0xE3, 0xAB, 0xC8, 0x23, 0xE1, 0xC7, 0xE0, 0x6D, 0xE6, + 0x22, 0xEF, 0x60, 0xEF, 0x25, 0xE4, 0x6E, 0xEC, 0xCE, 0xDC, 0x25, 0xE6, + 0xBC, 0xDF, 0x5A, 0xEF, 0xC8, 0xD1, 0xA0, 0xF2, 0x4B, 0xCF, 0xC2, 0xF1, + 0x49, 0xE9, 0xB2, 0xF9, 0x29, 0xF9, 0x11, 0xF5, 0x3E, 0xFC, 0xB2, 0xE9, + 0xC4, 0xFE, 0xFC, 0xE7, 0xDF, 0x00, 0x25, 0xF0, 0x5F, 0xFE, 0x98, 0xF1, + 0x98, 0x01, 0xBC, 0xE7, 0xB5, 0x06, 0xED, 0xE3, 0xB2, 0xF7, 0xDA, 0xE2, + 0xB7, 0xEE, 0x99, 0xE0, 0x4B, 0xFD, 0x9B, 0xE5, 0x81, 0xFF, 0x73, 0xEE, + 0xC5, 0xEE, 0x41, 0xF0, 0x84, 0xEF, 0x58, 0xEF, 0xEA, 0xFF, 0x04, 0xE7, + 0xE4, 0xFC, 0xE9, 0xCF, 0xE9, 0xF0, 0xF7, 0xC1, 0xC2, 0xE2, 0x6E, 0xC6, + 0x7C, 0xC7, 0xAC, 0xCD, 0x77, 0xBE, 0xAA, 0xCC, 0x14, 0xC5, 0xC8, 0xC1, + 0x34, 0xBB, 0x90, 0xB9, 0x82, 0xA8, 0x00, 0xB5, 0x8F, 0xAD, 0x8E, 0xAD, + 0x54, 0xCD, 0x17, 0xA9, 0x5F, 0xD8, 0xCC, 0xA9, 0x0B, 0xC7, 0x06, 0xB4, + 0xBA, 0xBE, 0x50, 0xC8, 0xD8, 0xBF, 0xD6, 0xD8, 0x08, 0xBF, 0xE9, 0xDC, + 0x95, 0xC7, 0x92, 0xDE, 0xE0, 0xDF, 0x47, 0xEB, 0x1C, 0xF2, 0xA9, 0xF6, + 0x93, 0xFD, 0x59, 0xFA, 0x6C, 0x14, 0xDF, 0x01, 0xBB, 0x1B, 0x14, 0x07, + 0xC7, 0x10, 0x08, 0x0E, 0x90, 0x18, 0x27, 0x19, 0x1F, 0x24, 0x60, 0x16, + 0xEA, 0x1C, 0xB8, 0x0F, 0x9D, 0x1A, 0xE2, 0x11, 0xE5, 0x26, 0x30, 0x11, + 0xF8, 0x2B, 0x73, 0x0C, 0x07, 0x2A, 0x81, 0x0E, 0x56, 0x27, 0x64, 0x14, + 0xE3, 0x1D, 0x2B, 0x16, 0xA1, 0x22, 0x0F, 0x23, 0xD2, 0x34, 0x32, 0x39, + 0xBF, 0x33, 0x74, 0x36, 0x63, 0x2D, 0x65, 0x2B, 0x51, 0x2E, 0x4B, 0x2E, + 0x2E, 0x26, 0x76, 0x21, 0xF4, 0x21, 0xBD, 0x13, 0x99, 0x26, 0x4C, 0x25, + 0x38, 0x1E, 0x89, 0x35, 0xCC, 0x0F, 0x7E, 0x2C, 0x56, 0x10, 0xF2, 0x25, + 0xFF, 0x14, 0x65, 0x21, 0x1C, 0x08, 0xF5, 0x0D, 0x61, 0xFE, 0xAF, 0x0D, + 0x8C, 0x06, 0x1A, 0x1E, 0x73, 0x0D, 0x3A, 0x20, 0x6F, 0x13, 0x45, 0x1D, + 0x62, 0x1D, 0x0A, 0x1F, 0xBF, 0x22, 0x0D, 0x22, 0x5C, 0x23, 0x85, 0x1A, + 0x8E, 0x2D, 0x11, 0x17, 0x2E, 0x36, 0x95, 0x26, 0xFC, 0x2C, 0xD8, 0x38, + 0xC0, 0x1B, 0x69, 0x3C, 0x05, 0x22, 0xCA, 0x42, 0x01, 0x43, 0xCB, 0x4C, + 0xF4, 0x4C, 0x99, 0x41, 0xC6, 0x46, 0x9A, 0x3F, 0xD6, 0x46, 0xD9, 0x4F, + 0xF3, 0x3E, 0x6E, 0x5B, 0xA1, 0x33, 0xD6, 0x58, 0xA7, 0x35, 0xFC, 0x4C, + 0x2D, 0x3E, 0x39, 0x45, 0x95, 0x3A, 0x5A, 0x32, 0x28, 0x34, 0x0A, 0x1A, + 0xD7, 0x28, 0x85, 0x0D, 0x6B, 0x11, 0x45, 0x0C, 0xC8, 0x00, 0x16, 0x1C, + 0x1D, 0x00, 0x98, 0x2B, 0xD3, 0x02, 0xD0, 0x29, 0xBE, 0x03, 0xF7, 0x1F, + 0x45, 0x04, 0xD6, 0x11, 0x42, 0xFE, 0x58, 0x03, 0xEE, 0xF4, 0xBE, 0xFA, + 0x0E, 0xF1, 0x8C, 0xF8, 0xE4, 0xEA, 0xAC, 0xF8, 0x23, 0xE6, 0x49, 0xF9, + 0xBE, 0xF5, 0x16, 0xF2, 0xA3, 0x12, 0x30, 0xDE, 0x44, 0x1F, 0x58, 0xCE, + 0x87, 0x0C, 0x3E, 0xCC, 0x97, 0xEF, 0x23, 0xD3, 0x09, 0xEC, 0xD3, 0xE4, + 0xA9, 0xF8, 0xB5, 0xED, 0x97, 0x04, 0x06, 0xEA, 0x52, 0x15, 0x4E, 0xF2, + 0x46, 0x1A, 0xB0, 0xF8, 0x42, 0x11, 0xBA, 0xF3, 0xED, 0x0F, 0x8B, 0xFA, + 0x3D, 0x13, 0x33, 0x0B, 0xC2, 0x08, 0x43, 0x0F, 0xA0, 0x02, 0x9E, 0xFE, + 0x9B, 0x0D, 0xC0, 0xEB, 0xDD, 0x10, 0x73, 0xF0, 0x95, 0x0B, 0xC7, 0xFE, + 0xDF, 0x07, 0xD4, 0xFF, 0x97, 0x08, 0x4E, 0xFF, 0x94, 0x11, 0xEE, 0x06, + 0xE7, 0x0A, 0x6C, 0x05, 0x8C, 0xF8, 0x95, 0x00, 0x88, 0xF6, 0x7F, 0xFE, + 0x50, 0xFB, 0xEF, 0xF5, 0xEE, 0xFC, 0xCF, 0xF4, 0xB6, 0xF9, 0x65, 0x05, + 0xD2, 0xF6, 0x85, 0x13, 0xDF, 0x08, 0x3A, 0x18, 0xFA, 0x18, 0xBC, 0x1A, + 0xDC, 0x13, 0x9B, 0x1A, 0xFD, 0x14, 0x93, 0x19, 0x3B, 0x19, 0xF6, 0x10, + 0x4D, 0x11, 0xA0, 0x10, 0x5D, 0x01, 0x3C, 0x1B, 0x73, 0xF5, 0x49, 0x20, + 0xEC, 0xF0, 0x27, 0x21, 0xFB, 0xF4, 0xC4, 0x20, 0x03, 0xFD, 0x12, 0x1A, + 0x5E, 0x01, 0x2D, 0x0E, 0xBC, 0xFE, 0x7F, 0x0B, 0x1F, 0xFE, 0x83, 0x15, + 0x3F, 0x02, 0xC7, 0x14, 0xD3, 0xF8, 0xF2, 0x10, 0xC8, 0xEE, 0xDF, 0x1C, + 0xD6, 0xF1, 0x2C, 0x1D, 0xC5, 0xF6, 0xCB, 0x0F, 0x20, 0x00, 0xE1, 0x10, + 0xA1, 0x04, 0x3B, 0x13, 0xC1, 0x00, 0xF0, 0x07, 0x56, 0x03, 0x3F, 0x02, + 0x33, 0x09, 0xE0, 0x06, 0x20, 0x09, 0x36, 0x07, 0x12, 0x09, 0xDD, 0x07, + 0xCA, 0x0F, 0xF4, 0x13, 0x28, 0x1D, 0x47, 0x19, 0xDF, 0x2A, 0x85, 0x0D, + 0x53, 0x28, 0xFD, 0x04, 0xC6, 0x18, 0x43, 0x06, 0x81, 0x1B, 0xAB, 0x0D, + 0x91, 0x29, 0x40, 0x17, 0xD2, 0x24, 0xDB, 0x1C, 0xD9, 0x19, 0x5F, 0x20, + 0x23, 0x13, 0x39, 0x20, 0xE3, 0x0E, 0x60, 0x19, 0xBB, 0x12, 0x62, 0x12, + 0x8D, 0x18, 0xD9, 0x0E, 0x9C, 0x18, 0x54, 0x0D, 0xBD, 0x0B, 0xA4, 0x0A, + 0x0F, 0xF6, 0x12, 0xFA, 0x75, 0xF2, 0xBA, 0xEC, 0x2D, 0xF6, 0x1A, 0xED, + 0xBE, 0xEE, 0x15, 0xE9, 0xDC, 0xE7, 0xCB, 0xE7, 0x58, 0xE7, 0xA2, 0xEC, + 0x23, 0xDF, 0xBE, 0xE3, 0x14, 0xCD, 0x7E, 0xD3, 0x4A, 0xCC, 0x5C, 0xD3, + 0xFA, 0xD6, 0x64, 0xDD, 0x99, 0xDB, 0xFD, 0xDE, 0xA3, 0xE2, 0x0E, 0xDF, + 0x1B, 0xE4, 0xCB, 0xE0, 0x0F, 0xE3, 0xDF, 0xE7, 0x65, 0xE2, 0x6F, 0xF7, + 0xB6, 0xDF, 0x83, 0x04, 0xDE, 0xE7, 0x98, 0x08, 0x86, 0xF7, 0x63, 0x06, + 0xF5, 0x01, 0x57, 0x04, 0xE8, 0xFC, 0xB3, 0x03, 0x0C, 0xF6, 0x51, 0x0F, + 0x81, 0xF9, 0x82, 0x25, 0x6D, 0xF6, 0x8E, 0x30, 0x16, 0xFD, 0xB6, 0x2F, + 0x2E, 0x14, 0x20, 0x2B, 0xC1, 0x1D, 0x8B, 0x1B, 0xCB, 0x19, 0xE2, 0x03, + 0x46, 0x15, 0xDB, 0xFE, 0xC4, 0x14, 0x72, 0x0B, 0xBA, 0x1B, 0xF2, 0x18, + 0x9A, 0x1C, 0xAA, 0x23, 0xF3, 0x18, 0x85, 0x2A, 0x95, 0x1A, 0xE0, 0x2C, + 0x65, 0x13, 0x0F, 0x1F, 0x1D, 0x05, 0x81, 0x09, 0x73, 0xFB, 0x7C, 0x07, + 0x5B, 0xF0, 0x38, 0x0F, 0xCD, 0xEB, 0x81, 0x0B, 0x11, 0xF6, 0x04, 0xFC, + 0xE2, 0x07, 0x2F, 0xEE, 0xE3, 0x17, 0x27, 0xE9, 0xA1, 0x11, 0x1E, 0xE5, + 0xC4, 0x04, 0xD5, 0xE8, 0x48, 0xFD, 0x9D, 0xED, 0x1D, 0xF4, 0xD3, 0xF0, + 0xF1, 0xF3, 0x76, 0xF6, 0x78, 0xF6, 0xA6, 0xF0, 0xF8, 0x02, 0x5F, 0xF3, + 0x8D, 0x15, 0x23, 0x04, 0x40, 0x1F, 0x45, 0x13, 0x14, 0x26, 0x30, 0x29, + 0x04, 0x27, 0x4E, 0x3C, 0x7F, 0x26, 0x92, 0x3D, 0xB7, 0x2B, 0xE4, 0x2D, + 0x3B, 0x2D, 0xDE, 0x1A, 0xC4, 0x25, 0x79, 0x10, 0x98, 0x1F, 0xD8, 0x0C, + 0x30, 0x22, 0xE8, 0x19, 0x38, 0x24, 0x19, 0x35, 0xB3, 0x20, 0x83, 0x40, + 0x0D, 0x1E, 0xE8, 0x2D, 0x25, 0x22, 0x03, 0x1B, 0xFA, 0x15, 0x9C, 0x0F, + 0x3F, 0xFB, 0x30, 0x09, 0xF2, 0xED, 0x9E, 0x13, 0x36, 0xE6, 0x70, 0x1D, + 0xE4, 0xDF, 0x8B, 0x17, 0x40, 0xE8, 0x77, 0x0E, 0xE6, 0xF3, 0xDA, 0x0C, + 0xD4, 0xED, 0xCB, 0x07, 0x52, 0xE9, 0x2F, 0xFD, 0x33, 0xEB, 0xB5, 0xFD, + 0x36, 0xE2, 0xF8, 0x0A, 0x3F, 0xD2, 0xA7, 0x02, 0xDD, 0xD2, 0x62, 0xEC, + 0x06, 0xE4, 0x5C, 0xE9, 0x25, 0xE8, 0x41, 0xED, 0x01, 0xED, 0xE7, 0xF4, + 0xE6, 0xFC, 0x9B, 0xFA, 0x13, 0x09, 0x2C, 0xF3, 0xC6, 0x0E, 0x60, 0xEA, + 0x2F, 0x06, 0x8A, 0xE2, 0xFC, 0xF2, 0xC2, 0xE2, 0x4D, 0xE7, 0xDC, 0xE8, + 0x3F, 0xF0, 0xC8, 0xE6, 0xC7, 0xF8, 0x4C, 0xE0, 0x69, 0xF2, 0x4D, 0xE4, + 0xB9, 0xEF, 0x34, 0xEE, 0x74, 0xF2, 0x3E, 0xE9, 0xBC, 0xF3, 0x26, 0xE2, + 0xCC, 0xEC, 0xF4, 0xDB, 0x80, 0xE1, 0x81, 0xCC, 0x70, 0xDD, 0x1B, 0xC1, + 0x81, 0xDF, 0x83, 0xC1, 0xDC, 0xE2, 0xCC, 0xC6, 0xE2, 0xE9, 0x5C, 0xD1, + 0x78, 0xF0, 0xC1, 0xD8, 0x28, 0xF0, 0x00, 0xCF, 0x33, 0xEC, 0x22, 0xC5, + 0x95, 0xE2, 0x54, 0xC7, 0x9D, 0xD5, 0x5C, 0xD0, 0xFA, 0xCE, 0x19, 0xD7, + 0x4A, 0xDA, 0xE9, 0xD8, 0x6A, 0xF6, 0x3A, 0xE5, 0x2A, 0x05, 0x3C, 0xEB, + 0x42, 0x03, 0x8D, 0xE9, 0xC0, 0x04, 0x59, 0xF9, 0x44, 0x06, 0xAE, 0x05, + 0x19, 0xFF, 0xD1, 0x07, 0xB1, 0xF5, 0xEF, 0x05, 0x46, 0xF7, 0x9A, 0x01, + 0x2C, 0xF9, 0x2C, 0xFD, 0xD0, 0xFB, 0x73, 0xF6, 0x5C, 0x00, 0xCB, 0xF6, + 0x04, 0xFE, 0x80, 0xFC, 0x1D, 0x00, 0x57, 0x04, 0xCE, 0x02, 0xA1, 0x07, + 0x45, 0x00, 0x6C, 0x00, 0x73, 0xFB, 0x03, 0xF4, 0x65, 0xF0, 0x36, 0xE3, + 0xCA, 0xEF, 0xA4, 0xDC, 0x10, 0xF6, 0xCC, 0xE5, 0x1D, 0xEF, 0x1E, 0xF1, + 0x3E, 0xEA, 0x0C, 0xFA, 0x91, 0xEF, 0x4F, 0xFE, 0xF3, 0xFA, 0x22, 0x01, + 0x0D, 0x0B, 0xFD, 0x06, 0x62, 0x13, 0x10, 0x10, 0x6E, 0x08, 0xE0, 0x1B, + 0x1F, 0xF8, 0x42, 0x23, 0x5F, 0xF3, 0x56, 0x25, 0x71, 0x01, 0xB5, 0x2D, + 0x51, 0x12, 0x2D, 0x2D, 0x92, 0x15, 0x51, 0x1E, 0x2E, 0x1E, 0xB1, 0x13, + 0xA3, 0x29, 0x3B, 0x09, 0x74, 0x23, 0x43, 0x01, 0x5D, 0x1B, 0xBC, 0x07, + 0x6E, 0x16, 0x1B, 0x19, 0x25, 0x04, 0x57, 0x19, 0xBD, 0xF6, 0x13, 0x03, + 0x77, 0xF7, 0xA8, 0xF7, 0x36, 0xF4, 0xBD, 0xF9, 0x0E, 0xEB, 0x15, 0xF8, + 0x24, 0xE5, 0xBE, 0xF7, 0xD9, 0xDB, 0x5E, 0xF2, 0x84, 0xD3, 0xDA, 0xDF, + 0x38, 0xDC, 0xFF, 0xD1, 0x71, 0xE8, 0x0E, 0xCE, 0x3A, 0xE7, 0xBF, 0xCD, + 0x60, 0xDD, 0x0D, 0xCD, 0xB1, 0xD9, 0x67, 0xCD, 0x3F, 0xD3, 0x47, 0xCC, + 0x90, 0xC5, 0x17, 0xBF, 0x30, 0xC2, 0x69, 0xAD, 0x7E, 0xC6, 0x0C, 0xAB, + 0xC9, 0xC6, 0x84, 0xB2, 0x02, 0xC9, 0xFD, 0xB9, 0x7A, 0xD0, 0x7F, 0xCD, + 0xDC, 0xD0, 0x0A, 0xE7, 0xFF, 0xC9, 0x98, 0xEC, 0xFD, 0xD3, 0xB4, 0xE4, + 0xAA, 0xE1, 0x59, 0xD5, 0x6A, 0xDF, 0x12, 0xC7, 0x40, 0xE0, 0x06, 0xC5, + 0x5E, 0xE8, 0x75, 0xCC, 0x80, 0xF0, 0xD8, 0xDC, 0x56, 0xFD, 0x41, 0xE4, + 0xBA, 0x0A, 0x4B, 0xE1, 0x81, 0x0B, 0xA9, 0xE9, 0x4D, 0xFD, 0xBA, 0xF1, + 0x8F, 0xED, 0x28, 0xE8, 0xD1, 0xEA, 0x15, 0xE1, 0xEF, 0xE7, 0xE2, 0xDE, + 0x61, 0xE1, 0x6D, 0xD9, 0x07, 0xE2, 0x3F, 0xD8, 0x14, 0xE7, 0x03, 0xDC, + 0x8C, 0xEB, 0x1C, 0xE1, 0x4F, 0xED, 0xA7, 0xE4, 0x74, 0xE6, 0x71, 0xE2, + 0x76, 0xD9, 0x30, 0xDE, 0x84, 0xD1, 0x8A, 0xD8, 0x95, 0xCB, 0x37, 0xC8, + 0x1B, 0xCA, 0xFC, 0xBF, 0xFF, 0xC8, 0xC3, 0xC9, 0xDE, 0xC9, 0x63, 0xCB, + 0xFA, 0xDE, 0xCC, 0xCF, 0x7F, 0xF2, 0x6F, 0xDC, 0x1B, 0xF1, 0x24, 0xDB, + 0xB8, 0xEA, 0x99, 0xD1, 0x81, 0xEE, 0x30, 0xCA, 0x2A, 0xF1, 0x5D, 0xCB, + 0x68, 0xE6, 0xD7, 0xD6, 0x5F, 0xDE, 0x96, 0xE6, 0xE7, 0xE8, 0x8F, 0xFA, + 0xA8, 0x07, 0xC4, 0x0E, 0x13, 0x1E, 0x98, 0x16, 0x63, 0x17, 0x89, 0x11, + 0xE5, 0x09, 0x3A, 0x0C, 0x54, 0x04, 0x2E, 0x0A, 0xB5, 0x02, 0x68, 0x0D, + 0xCE, 0x09, 0xFE, 0x1D, 0xD4, 0x18, 0xC0, 0x30, 0x55, 0x22, 0x10, 0x31, + 0x5B, 0x2D, 0x7E, 0x2A, 0x29, 0x2D, 0x20, 0x2C, 0xF1, 0x20, 0x6B, 0x37, + 0xFC, 0x1B, 0xAE, 0x41, 0x40, 0x18, 0x7D, 0x3B, 0xBD, 0x1D, 0x2E, 0x2D, + 0x36, 0x2A, 0xF8, 0x21, 0x00, 0x30, 0xF8, 0x1C, 0x73, 0x31, 0xA7, 0x1F, + 0xAC, 0x2A, 0xE5, 0x1F, 0x96, 0x21, 0xEE, 0x17, 0x75, 0x23, 0xD7, 0x19, + 0xE0, 0x20, 0x87, 0x24, 0x34, 0x1B, 0x29, 0x28, 0x3E, 0x21, 0x61, 0x22, + 0x3B, 0x2A, 0xF3, 0x19, 0x97, 0x2B, 0xC5, 0x0E, 0x4A, 0x2D, 0xB3, 0x0D, + 0xF7, 0x32, 0xCE, 0x24, 0x5E, 0x27, 0x2A, 0x32, 0xB0, 0x1C, 0x63, 0x30, + 0xA1, 0x27, 0x15, 0x2B, 0x03, 0x2B, 0xD5, 0x18, 0x8C, 0x1F, 0xB5, 0x04, + 0x06, 0x17, 0xDA, 0xF9, 0x9C, 0x11, 0xC6, 0x00, 0x0C, 0x0B, 0xD9, 0x13, + 0x95, 0x0C, 0x72, 0x18, 0x97, 0x1A, 0xF7, 0x17, 0xC2, 0x1E, 0xF9, 0x17, + 0xAB, 0x16, 0xCA, 0x0E, 0x94, 0x11, 0x0B, 0x13, 0xB8, 0x07, 0xE8, 0x1E, + 0x23, 0xF0, 0x73, 0x1A, 0x02, 0xE3, 0xDC, 0x18, 0xE0, 0xEB, 0xF1, 0x1D, + 0xE4, 0xEB, 0xA7, 0x12, 0x88, 0xEA, 0x67, 0xFC, 0x5A, 0xF8, 0x23, 0xF4, + 0x15, 0xFE, 0x13, 0xFC, 0xB3, 0xFC, 0x9E, 0x03, 0x6F, 0xFE, 0x83, 0x06, + 0xED, 0xFE, 0xEE, 0x0B, 0x78, 0xFA, 0x46, 0x0C, 0x2F, 0x02, 0xDE, 0x0D, + 0x4B, 0x14, 0x55, 0x18, 0xB0, 0x13, 0xB3, 0x1C, 0xE0, 0x06, 0xD5, 0x1B, + 0xCA, 0xFA, 0x42, 0x12, 0x59, 0xF7, 0x8C, 0x06, 0xA1, 0xF9, 0x4F, 0xFD, + 0x84, 0x04, 0x7E, 0xEF, 0x04, 0x1B, 0xEA, 0xEE, 0xAC, 0x15, 0x73, 0xF3, + 0x38, 0x08, 0xDB, 0xEF, 0x93, 0x0E, 0xF4, 0xEB, 0xC5, 0x0F, 0x92, 0xE7, + 0x57, 0x0E, 0xC5, 0xE3, 0xF1, 0x0D, 0xA1, 0xDF, 0xB0, 0x02, 0xBF, 0xD9, + 0x6E, 0xF6, 0xE1, 0xDD, 0x77, 0xF6, 0x5C, 0xEB, 0xF1, 0xF3, 0x2D, 0xF4, + 0x3C, 0xE9, 0x6C, 0x04, 0x15, 0xE1, 0xB4, 0x0D, 0x75, 0xEB, 0x32, 0x05, + 0xA8, 0xFE, 0xF8, 0x04, 0xBF, 0xFE, 0x1C, 0x07, 0x24, 0xFD, 0xB1, 0x07, + 0xE9, 0x0C, 0x60, 0x13, 0x64, 0x22, 0xA4, 0x26, 0x28, 0x33, 0x86, 0x31, + 0x8E, 0x3B, 0xC9, 0x30, 0x52, 0x38, 0x53, 0x2C, 0xF4, 0x33, 0xDF, 0x2D, + 0xDC, 0x34, 0x9A, 0x2F, 0xAB, 0x2D, 0x18, 0x27, 0x91, 0x1F, 0xE8, 0x25, + 0xE3, 0x16, 0x09, 0x28, 0xB6, 0x18, 0xFD, 0x26, 0x35, 0x21, 0x9B, 0x2E, + 0xB9, 0x26, 0xFB, 0x36, 0xC7, 0x20, 0xFD, 0x34, 0xA4, 0x1B, 0x5A, 0x2E, + 0xAC, 0x1F, 0xE0, 0x2B, 0xA7, 0x19, 0x4E, 0x21, 0xBF, 0x08, 0x23, 0x10, + 0x8D, 0x00, 0x7B, 0x0E, 0x9F, 0xFD, 0x91, 0x0F, 0x62, 0xF8, 0x61, 0x0C, + 0xD2, 0xF3, 0xE4, 0x0E, 0xDD, 0xEE, 0x50, 0x0B, 0x19, 0xF7, 0x21, 0x0A, + 0x43, 0x00, 0x78, 0x09, 0x58, 0xF6, 0x53, 0xFE, 0xD4, 0xE9, 0xF1, 0xFD, + 0xE1, 0xE1, 0xCC, 0x02, 0xB0, 0xE4, 0xDB, 0xFA, 0xBC, 0xF9, 0xA3, 0xFD, + 0xA4, 0x08, 0x23, 0x0D, 0x3D, 0x01, 0x67, 0x0A, 0xCE, 0xF7, 0xDD, 0x03, + 0xD4, 0xF5, 0xEB, 0x01, 0xE6, 0xEF, 0x84, 0xFA, 0x53, 0xED, 0xC6, 0xFC, + 0x0F, 0xF5, 0x74, 0x04, 0xB2, 0x04, 0xAD, 0x07, 0x4E, 0x1E, 0x85, 0x06, + 0xA4, 0x2E, 0x35, 0x01, 0xFC, 0x25, 0xDD, 0x09, 0xE3, 0x13, 0x0D, 0x1B, + 0x35, 0x0E, 0x16, 0x20, 0xD0, 0x0F, 0x80, 0x18, 0x77, 0x11, 0x11, 0x0D, + 0xA9, 0x17, 0x83, 0xFE, 0xE1, 0x1E, 0x52, 0xEF, 0xE9, 0x1A, 0xC0, 0xE8, + 0x11, 0x0D, 0x02, 0xED, 0xA6, 0x0A, 0x02, 0xFF, 0x10, 0x09, 0x97, 0x14, + 0x87, 0xF9, 0xFA, 0x1A, 0x7B, 0xF6, 0x35, 0x0D, 0xCE, 0xFD, 0x71, 0xF2, + 0x5E, 0xEF, 0x0E, 0xD7, 0xDE, 0xDE, 0x70, 0xCE, 0x2E, 0xDE, 0x81, 0xD5, + 0xF0, 0xDD, 0xC0, 0xE5, 0x5C, 0xDD, 0xAB, 0xF9, 0x4C, 0xE4, 0x19, 0xF7, + 0xDB, 0xEF, 0x74, 0xE9, 0x15, 0xF1, 0x81, 0xE2, 0xFB, 0xED, 0x38, 0xDD, + 0x98, 0xEF, 0x0D, 0xE1, 0xCF, 0xEC, 0x3A, 0xEC, 0x5B, 0xEB, 0xEA, 0xF3, + 0x63, 0xF6, 0xAF, 0xF9, 0x4C, 0x06, 0xAE, 0x07, 0x2E, 0x0A, 0x8D, 0x16, + 0x54, 0x04, 0x5C, 0x15, 0xC2, 0xFD, 0xB4, 0x08, 0x5C, 0xF8, 0x69, 0x0B, + 0x60, 0xFE, 0x1A, 0x25, 0xAA, 0x07, 0xC2, 0x34, 0xD1, 0x09, 0x5E, 0x35, + 0x8B, 0x11, 0xD7, 0x36, 0x26, 0x1E, 0xD0, 0x2D, 0xF8, 0x22, 0x6D, 0x22, + 0x28, 0x22, 0x87, 0x2F, 0x1C, 0x1E, 0x27, 0x3E, 0x4A, 0x17, 0xAD, 0x35, + 0x21, 0x1E, 0x0F, 0x2D, 0x7D, 0x2C, 0xF6, 0x26, 0x57, 0x32, 0x62, 0x1E, + 0x59, 0x32, 0x0F, 0x22, 0x9E, 0x24, 0x92, 0x2E, 0x47, 0x14, 0x45, 0x3B, + 0xEE, 0x13, 0xE6, 0x3D, 0x39, 0x16, 0x02, 0x32, 0x2D, 0x19, 0x0E, 0x25, + 0x5A, 0x20, 0x4D, 0x17, 0x1F, 0x23, 0xA8, 0x0C, 0xAC, 0x22, 0x63, 0x0C, + 0x73, 0x26, 0x44, 0x0F, 0xDB, 0x2B, 0x03, 0x11, 0x61, 0x2C, 0xAA, 0x0D, + 0xFA, 0x28, 0xCF, 0x06, 0xDC, 0x20, 0xA4, 0xFB, 0x01, 0x1E, 0xF3, 0xF1, + 0xC1, 0x20, 0x1E, 0xF8, 0x50, 0x18, 0xF0, 0x00, 0x8A, 0x0B, 0xC3, 0x02, + 0x59, 0x03, 0x5A, 0x07, 0x16, 0xFE, 0xAA, 0x0D, 0x94, 0xF7, 0xC7, 0x0D, + 0xDC, 0xEA, 0x2F, 0x0A, 0x55, 0xE0, 0x7A, 0x08, 0xA9, 0xDC, 0xA7, 0x04, + 0xDF, 0xDF, 0x49, 0x02, 0xD8, 0xE2, 0x67, 0xFF, 0xFB, 0xE0, 0x9D, 0xFA, + 0x26, 0xE3, 0x9F, 0xF8, 0x21, 0xEF, 0x74, 0xFA, 0x3B, 0xFE, 0xE6, 0xFF, + 0xED, 0xFE, 0x74, 0xFD, 0xBB, 0xF6, 0x46, 0xF6, 0xA0, 0xFB, 0xEE, 0xF7, + 0xA6, 0x04, 0xCF, 0xFD, 0x50, 0xFE, 0x1B, 0xFF, 0x3B, 0xF8, 0xAD, 0x03, + 0x04, 0xFF, 0xD3, 0x08, 0x22, 0x0D, 0x2B, 0x07, 0x06, 0x1E, 0x6D, 0x03, + 0xF4, 0x24, 0x7E, 0x02, 0x12, 0x18, 0x4C, 0x00, 0x8E, 0x07, 0x05, 0xF4, + 0x34, 0x03, 0xF8, 0xE6, 0x4A, 0x04, 0x1B, 0xE5, 0xED, 0xF4, 0xDF, 0xE1, + 0x30, 0xE3, 0x7D, 0xDA, 0xEE, 0xF2, 0xFC, 0xE5, 0xCC, 0xF9, 0xC1, 0xED, + 0x1B, 0xE4, 0xB7, 0xDF, 0x82, 0xD3, 0x21, 0xD6, 0xF3, 0xC4, 0xDD, 0xCD, + 0xB9, 0xBF, 0x43, 0xC5, 0x8E, 0xC9, 0x18, 0xC8, 0x6C, 0xCF, 0x49, 0xD3, + 0x8C, 0xC4, 0x46, 0xDA, 0xC0, 0xBE, 0x21, 0xD4, 0x21, 0xD1, 0x6E, 0xCB, + 0x96, 0xDD, 0x7A, 0xCF, 0x2E, 0xD8, 0x99, 0xDC, 0x48, 0xD7, 0xEA, 0xE1, + 0xD3, 0xDE, 0x7A, 0xDD, 0x32, 0xE6, 0xA7, 0xD9, 0x40, 0xF2, 0xCB, 0xE0, + 0x4D, 0xFF, 0xAF, 0xF0, 0x5D, 0x04, 0x18, 0x04, 0xA0, 0x02, 0xB8, 0x10, + 0xA3, 0x06, 0xEC, 0x0F, 0x19, 0x0B, 0xC6, 0x0A, 0x4D, 0x06, 0xA6, 0x04, + 0x2F, 0x0E, 0x4D, 0xFA, 0x7F, 0x22, 0x43, 0xEF, 0xEA, 0x32, 0xC2, 0xF9, + 0x5F, 0x37, 0xFA, 0x0F, 0x56, 0x33, 0x4B, 0x1B, 0xAD, 0x2F, 0x07, 0x2C, + 0xCE, 0x24, 0xDF, 0x3B, 0x43, 0x1B, 0x37, 0x3E, 0xA3, 0x1B, 0x55, 0x39, + 0x0D, 0x1B, 0xA2, 0x2A, 0x5B, 0x13, 0x98, 0x13, 0x77, 0x06, 0x5B, 0xFF, + 0xF9, 0xFB, 0xDB, 0xFE, 0x70, 0xF6, 0x44, 0x09, 0xD4, 0xFD, 0xD7, 0x0B, + 0xDD, 0x05, 0x2D, 0x07, 0xB4, 0x00, 0x9B, 0x08, 0x73, 0xF7, 0xA5, 0x05, + 0xE4, 0xE9, 0x7A, 0xF0, 0x4C, 0xDD, 0x54, 0xE2, 0xEC, 0xDC, 0x32, 0xE1, + 0xF6, 0xE4, 0xA2, 0xE3, 0xF2, 0xE4, 0xA9, 0xE7, 0xEB, 0xDE, 0x08, 0xE7, + 0xFF, 0xDD, 0x39, 0xE1, 0x90, 0xDC, 0xB4, 0xDA, 0xC1, 0xDE, 0x3D, 0xDF, + 0x55, 0xE3, 0xEF, 0xE9, 0xC8, 0xE1, 0x68, 0xE7, 0x14, 0xE0, 0xF1, 0xE1, + 0xC7, 0xE0, 0x14, 0xE9, 0x1E, 0xEA, 0x5A, 0xF3, 0x13, 0xF3, 0xFE, 0xFA, + 0xF8, 0xF5, 0xDD, 0x05, 0xFE, 0xFC, 0x41, 0x0A, 0x1E, 0x00, 0xCB, 0x00, + 0x37, 0x00, 0x1B, 0xF2, 0xA9, 0xFE, 0x60, 0xE3, 0x41, 0xF7, 0xD4, 0xDB, + 0xC1, 0xF1, 0xF9, 0xE0, 0x19, 0xE9, 0x5F, 0xE6, 0x29, 0xDF, 0x92, 0xE7, + 0xFC, 0xD7, 0x0A, 0xE9, 0x52, 0xD0, 0x0D, 0xE9, 0xEE, 0xC7, 0x71, 0xE2, + 0x6C, 0xBE, 0x53, 0xD3, 0xEE, 0xBC, 0xDA, 0xC2, 0x45, 0xC2, 0xBB, 0xB6, + 0xB1, 0xC1, 0xBB, 0xB3, 0x01, 0xB6, 0x0E, 0xB5, 0x99, 0xAD, 0x74, 0xB8, + 0x7F, 0xAF, 0xA1, 0xB3, 0xAE, 0xAE, 0xFD, 0xA0, 0x96, 0xAD, 0xD4, 0x9B, + 0x7D, 0xAF, 0x04, 0xA4, 0x11, 0xB1, 0xFF, 0xAA, 0xEA, 0xB8, 0xE1, 0xB3, + 0x9B, 0xCB, 0xDE, 0xBC, 0xCD, 0xD8, 0x3B, 0xC3, 0x70, 0xD3, 0xA2, 0xCB, + 0x20, 0xCB, 0xF6, 0xD6, 0xB7, 0xD1, 0x24, 0xE4, 0xBC, 0xDB, 0x87, 0xEC, + 0x43, 0xDE, 0xEB, 0xE6, 0xA6, 0xE8, 0xA7, 0xE2, 0x7C, 0xF9, 0x0F, 0xDE, + 0x3E, 0x01, 0x34, 0xD3, 0x6F, 0xFF, 0x50, 0xD6, 0x95, 0xFC, 0x5A, 0xE5, + 0xDA, 0xFB, 0x94, 0xF3, 0x9B, 0x00, 0xD5, 0xFB, 0xB3, 0x07, 0x62, 0xFA, + 0x8A, 0x03, 0x2F, 0xF9, 0xA7, 0xF9, 0x93, 0xFD, 0x3E, 0xF6, 0x5F, 0xFF, + 0x63, 0x01, 0x29, 0x06, 0xDA, 0x15, 0x93, 0x12, 0x6A, 0x1D, 0x3E, 0x14, + 0x7C, 0x20, 0x8E, 0x13, 0x51, 0x2F, 0x01, 0x20, 0xF3, 0x32, 0x56, 0x26, + 0x99, 0x29, 0x5E, 0x23, 0x36, 0x21, 0xCA, 0x27, 0xF0, 0x1F, 0x08, 0x28, + 0x45, 0x2D, 0x0C, 0x20, 0x10, 0x37, 0xE0, 0x1D, 0x3A, 0x30, 0x14, 0x25, + 0x30, 0x26, 0xFE, 0x2B, 0x41, 0x2A, 0xBA, 0x2E, 0x20, 0x2C, 0xE7, 0x2D, + 0x26, 0x1C, 0xAE, 0x27, 0xF9, 0x0B, 0xCA, 0x1F, 0xC9, 0x04, 0xA4, 0x1B, + 0xBB, 0x05, 0xD3, 0x18, 0x17, 0x10, 0x61, 0x18, 0x88, 0x19, 0x1A, 0x1D, + 0x14, 0x12, 0x36, 0x21, 0x7F, 0x09, 0xD4, 0x21, 0xF2, 0x0C, 0xEA, 0x15, + 0x3B, 0x0F, 0x5D, 0x0D, 0xF6, 0x08, 0x95, 0x12, 0x1E, 0x03, 0x3E, 0x0C, + 0x3C, 0x0A, 0x8E, 0x04, 0xD5, 0x0D, 0xDA, 0x04, 0x18, 0x09, 0x88, 0x06, + 0x07, 0x12, 0xF5, 0x15, 0xFF, 0x1F, 0x17, 0x28, 0xDC, 0x27, 0x2A, 0x2A, + 0x53, 0x33, 0xFE, 0x1E, 0xBB, 0x3E, 0x36, 0x14, 0xA3, 0x3B, 0xA6, 0x0D, + 0x74, 0x38, 0x06, 0x0B, 0xE6, 0x3D, 0x95, 0x12, 0xA3, 0x38, 0x55, 0x26, + 0x0E, 0x2A, 0xC5, 0x3A, 0xD0, 0x2B, 0x23, 0x42, 0x6B, 0x40, 0x72, 0x43, + 0xF8, 0x40, 0x30, 0x35, 0x89, 0x33, 0xB6, 0x1F, 0x4B, 0x2A, 0x81, 0x16, + 0x8D, 0x16, 0x37, 0x0D, 0xC2, 0x03, 0xE0, 0x04, 0x66, 0x07, 0xE4, 0x03, + 0x94, 0x0E, 0xB4, 0x03, 0xA3, 0x01, 0x5E, 0xFD, 0xBB, 0xF7, 0x33, 0xEC, + 0x3B, 0xF7, 0xC1, 0xD8, 0x74, 0xE9, 0x5F, 0xCE, 0x9E, 0xD4, 0x9E, 0xC7, + 0x19, 0xCA, 0xE4, 0xC3, 0xBF, 0xC7, 0x6A, 0xC8, 0x6F, 0xC7, 0x4F, 0xD1, + 0x5F, 0xCA, 0xC7, 0xD7, 0x98, 0xD6, 0x95, 0xDD, 0x50, 0xDB, 0xEB, 0xE1, + 0x9E, 0xCD, 0x81, 0xDE, 0x87, 0xC1, 0x2E, 0xD9, 0x95, 0xC5, 0x10, 0xDE, + 0x87, 0xCF, 0x15, 0xDF, 0x11, 0xD5, 0x7C, 0xD8, 0x84, 0xDD, 0x29, 0xDF, + 0x7D, 0xE2, 0xE8, 0xF0, 0x41, 0xE3, 0x29, 0x02, 0xC6, 0xE8, 0xD8, 0x08, + 0x29, 0xF2, 0xA7, 0x05, 0xC6, 0xFE, 0x23, 0xFF, 0x44, 0x0B, 0x60, 0xF9, + 0x80, 0x15, 0xB9, 0xFB, 0x8C, 0x18, 0x2E, 0xFF, 0x3B, 0x11, 0x2D, 0x07, + 0xB7, 0x07, 0x28, 0x1A, 0x86, 0x07, 0x6C, 0x27, 0x65, 0x0A, 0xDB, 0x27, + 0x75, 0x05, 0x71, 0x1E, 0x7F, 0x0A, 0x36, 0x14, 0x61, 0x17, 0xC8, 0x12, + 0xF0, 0x16, 0x56, 0x13, 0xAC, 0x16, 0x01, 0x13, 0x97, 0x18, 0xAF, 0x0F, + 0x41, 0x13, 0x15, 0x08, 0x3F, 0x0B, 0x7F, 0x03, 0x0B, 0x05, 0x07, 0x03, + 0x84, 0x06, 0x42, 0xFD, 0x36, 0x0B, 0x39, 0xF2, 0x60, 0x07, 0x6D, 0xE9, + 0xAD, 0xFA, 0x7F, 0xDF, 0xB2, 0xEE, 0x4C, 0xDF, 0x5A, 0xE8, 0xA4, 0xED, + 0x26, 0xED, 0x71, 0xFA, 0x6F, 0xF2, 0xA5, 0xFE, 0x58, 0xF3, 0x14, 0x02, + 0xD8, 0xFE, 0x9F, 0x09, 0xA2, 0x08, 0x94, 0x06, 0x64, 0x06, 0x63, 0xFC, + 0xD1, 0x02, 0x82, 0xF7, 0xFF, 0x09, 0xA4, 0xF8, 0xAD, 0x18, 0x5F, 0xFF, + 0xA8, 0x1E, 0x99, 0x07, 0x02, 0x17, 0xCB, 0x0C, 0xC9, 0x08, 0x61, 0x0A, + 0x75, 0xFF, 0x2A, 0x08, 0x3B, 0x04, 0xB8, 0x0C, 0x21, 0x06, 0xFE, 0x0C, + 0x4A, 0xF9, 0x1D, 0x0E, 0x25, 0xF1, 0xAE, 0x16, 0x80, 0xFC, 0x95, 0x19, + 0x42, 0x11, 0xD8, 0x16, 0x1E, 0x0F, 0x19, 0x14, 0xA1, 0xF4, 0x38, 0x12, + 0xA7, 0xE3, 0x74, 0x12, 0xF4, 0xE1, 0xC7, 0x0E, 0x6B, 0xE3, 0x7A, 0x0A, + 0xB4, 0xE8, 0x4F, 0x07, 0xC2, 0xED, 0xEB, 0x01, 0xA8, 0xE5, 0xC9, 0xF6, + 0x29, 0xE5, 0x54, 0xEC, 0x41, 0xF1, 0x74, 0xED, 0x87, 0xE7, 0x31, 0xF3, + 0x9E, 0xD6, 0x7C, 0xF6, 0x81, 0xE3, 0xE5, 0xF7, 0x2E, 0xFB, 0xC4, 0xF2, + 0x50, 0xFC, 0xDB, 0xE6, 0x6E, 0xF0, 0xB0, 0xE4, 0x5D, 0xEE, 0x05, 0xEC, + 0x04, 0xF2, 0x81, 0xEF, 0xC1, 0xEF, 0x22, 0xEE, 0x9A, 0xF5, 0x55, 0xEE, + 0xFF, 0xF5, 0x8E, 0xEE, 0x37, 0xEC, 0xAC, 0xED, 0x9A, 0xF6, 0xBD, 0xEA, + 0x7F, 0xF9, 0x58, 0xDF, 0x10, 0xEB, 0x10, 0xDD, 0x44, 0xE5, 0xBD, 0xDF, + 0x7E, 0xE8, 0x21, 0xDF, 0x54, 0xEB, 0x97, 0xE9, 0x6E, 0xEB, 0x75, 0xF7, + 0x7B, 0xF2, 0x14, 0xF7, 0x01, 0x01, 0x02, 0xEC, 0xB7, 0x0B, 0xB1, 0xE1, + 0xDA, 0x0D, 0xD0, 0xD9, 0x57, 0x0D, 0x07, 0xDF, 0xF9, 0x09, 0xD2, 0xF2, + 0x79, 0x0B, 0x2A, 0x07, 0xA3, 0x1A, 0x07, 0x15, 0x24, 0x2A, 0x6E, 0x21, + 0xFF, 0x27, 0xC3, 0x29, 0x1B, 0x1F, 0x9A, 0x23, 0x76, 0x20, 0x6E, 0x18, + 0x2B, 0x1D, 0x81, 0x1A, 0xFF, 0x16, 0x28, 0x2C, 0x38, 0x1C, 0x14, 0x3E, + 0xA4, 0x22, 0xED, 0x40, 0x5A, 0x26, 0x81, 0x3A, 0x1F, 0x31, 0xBA, 0x36, + 0xE1, 0x40, 0x70, 0x37, 0x99, 0x44, 0xDA, 0x38, 0xBB, 0x37, 0xE6, 0x31, + 0x3E, 0x29, 0xA6, 0x28, 0xEB, 0x1A, 0x30, 0x23, 0xC0, 0x11, 0xBC, 0x1F, + 0x8D, 0x1D, 0xBE, 0x1F, 0xF0, 0x2B, 0x3F, 0x24, 0xC2, 0x22, 0x2C, 0x2A, + 0x09, 0x0E, 0xDC, 0x29, 0x91, 0x0C, 0x03, 0x2A, 0xE0, 0x19, 0xD5, 0x26, + 0x97, 0x1E, 0x73, 0x1C, 0xED, 0x1C, 0x66, 0x1C, 0xEA, 0x18, 0xC5, 0x22, + 0xB7, 0x13, 0xFF, 0x23, 0x9F, 0x12, 0x49, 0x28, 0x3E, 0x14, 0x39, 0x30, + 0x2D, 0x1A, 0x87, 0x37, 0x78, 0x26, 0x3C, 0x35, 0x5C, 0x2D, 0x8A, 0x22, + 0xD2, 0x2B, 0xB7, 0x16, 0xD7, 0x2E, 0x3E, 0x1F, 0x35, 0x29, 0x4A, 0x2B, + 0x25, 0x18, 0x86, 0x36, 0xB8, 0x19, 0xA0, 0x44, 0xA4, 0x24, 0x03, 0x4A, + 0x39, 0x22, 0xD4, 0x40, 0xE6, 0x28, 0x40, 0x38, 0x77, 0x36, 0x29, 0x2F, + 0x1E, 0x2F, 0x9C, 0x1D, 0x82, 0x1F, 0xCC, 0x13, 0x48, 0x15, 0x4B, 0x13, + 0xC9, 0x0A, 0xA2, 0x0E, 0x4E, 0x01, 0xF0, 0x06, 0xE5, 0xFB, 0x0D, 0xFF, + 0x9A, 0xFB, 0x8A, 0xF7, 0x95, 0xFC, 0xEB, 0xF4, 0xB9, 0xFB, 0xDF, 0xF5, + 0xC7, 0xF5, 0x61, 0xE6, 0xC6, 0xF0, 0xE0, 0xD3, 0x1D, 0xEE, 0x2F, 0xD7, + 0xB0, 0xE7, 0xB6, 0xDE, 0xA4, 0xE6, 0xFA, 0xE7, 0xEB, 0xE5, 0x41, 0xF4, + 0x06, 0xE3, 0x21, 0xF6, 0xCB, 0xE0, 0xFB, 0xF5, 0x7B, 0xD6, 0x23, 0xF6, + 0xAA, 0xCF, 0x3E, 0xE9, 0x94, 0xDB, 0x37, 0xD6, 0x02, 0xEB, 0x8D, 0xCE, + 0xEE, 0xE5, 0x12, 0xCF, 0xE4, 0xDF, 0x35, 0xD1, 0x13, 0xED, 0x93, 0xDA, + 0xB9, 0xF2, 0x97, 0xE9, 0x21, 0xE7, 0xF1, 0xF4, 0x05, 0xE0, 0x55, 0xFB, + 0x62, 0xE5, 0x93, 0xFE, 0xD3, 0xFC, 0x19, 0xFD, 0xB5, 0x16, 0x92, 0xF7, + 0x45, 0x13, 0xD7, 0xF8, 0x34, 0xFF, 0x24, 0x09, 0x4A, 0xF7, 0x60, 0x15, + 0x17, 0x02, 0xC4, 0x13, 0x1F, 0x0D, 0xD9, 0x11, 0x0B, 0x08, 0x6B, 0x0B, + 0x15, 0x05, 0xDA, 0x01, 0x98, 0x08, 0xAB, 0xFD, 0xB5, 0x05, 0x6D, 0xFB, + 0x95, 0x05, 0xA7, 0xF9, 0x24, 0x0A, 0x16, 0xFD, 0x6F, 0x07, 0xB6, 0x04, + 0x36, 0x06, 0x50, 0x05, 0xFA, 0x0A, 0xE4, 0xFE, 0xF2, 0xFF, 0x79, 0xF6, + 0x4E, 0xEC, 0x34, 0xED, 0xBD, 0xEE, 0xD2, 0xE3, 0x15, 0xFD, 0x96, 0xE2, + 0xAE, 0xF9, 0x1D, 0xEE, 0xE8, 0xF4, 0xDF, 0xFB, 0xD7, 0x02, 0xF3, 0xFE, + 0x52, 0x0F, 0x71, 0xFC, 0x92, 0x10, 0x43, 0x00, 0xF6, 0x0A, 0xD1, 0xFD, + 0x36, 0x03, 0x83, 0xF5, 0x2C, 0xFF, 0x7C, 0xF6, 0xB4, 0x04, 0x88, 0xFE, + 0xFD, 0x08, 0x2A, 0x06, 0xCF, 0xFA, 0xFF, 0x13, 0xB3, 0xEA, 0x6C, 0x1D, + 0x49, 0xF0, 0xBB, 0x0F, 0x70, 0xFE, 0xE3, 0x02, 0xFD, 0xF9, 0x1F, 0xFE, + 0x39, 0xF3, 0xC1, 0xF7, 0x9E, 0xFA, 0x32, 0xF3, 0x5B, 0xFF, 0x7C, 0xEE, + 0x86, 0xFD, 0xCB, 0xF4, 0xE2, 0x02, 0x40, 0x0A, 0xDC, 0x08, 0xF3, 0x16, + 0xD2, 0x04, 0xF5, 0x13, 0x65, 0xFF, 0xD0, 0x05, 0x9F, 0xFB, 0x0A, 0xF5, + 0x16, 0xF7, 0xFD, 0xF0, 0xAA, 0xF5, 0xAF, 0xF4, 0x6D, 0xF7, 0x3C, 0xF4, + 0x43, 0xF6, 0xE5, 0xEF, 0x12, 0xF7, 0x96, 0xEF, 0x0C, 0xFE, 0xE3, 0xEE, + 0x8F, 0x03, 0x3B, 0xE8, 0x21, 0xFD, 0x7D, 0xE1, 0xE2, 0xED, 0x6A, 0xE1, + 0x9A, 0xE6, 0x16, 0xE4, 0x9E, 0xE3, 0xE1, 0xD6, 0x4C, 0xE6, 0xAE, 0xC6, + 0xE9, 0xE4, 0x5E, 0xC2, 0x9D, 0xD5, 0xAD, 0xC4, 0x41, 0xCE, 0x99, 0xCF, + 0x52, 0xCD, 0x81, 0xD4, 0xB6, 0xCA, 0x89, 0xCD, 0xDA, 0xCA, 0xCE, 0xC7, + 0x45, 0xCB, 0x34, 0xC5, 0xBE, 0xC8, 0xA0, 0xC2, 0x31, 0xC4, 0x55, 0xBD, + 0xC4, 0xC1, 0x3F, 0xBF, 0x63, 0xBA, 0xF5, 0xCA, 0x95, 0xA8, 0xB4, 0xCC, + 0xAA, 0xA1, 0xAE, 0xC1, 0x4A, 0xAC, 0xC4, 0xB1, 0xBA, 0xB2, 0x82, 0xA2, + 0x65, 0xB0, 0x50, 0x9F, 0xC2, 0xAC, 0xE5, 0xAB, 0x09, 0xA9, 0xCC, 0xBC, + 0x8F, 0xA5, 0xB0, 0xC4, 0xD6, 0xAB, 0x7E, 0xCC, 0x21, 0xBB, 0x08, 0xDE, + 0xF7, 0xC5, 0x26, 0xEA, 0xE7, 0xD1, 0x8B, 0xEA, 0x13, 0xE3, 0x1A, 0xEF, + 0xCD, 0xEA, 0x1E, 0xF4, 0xB1, 0xEA, 0x01, 0xEE, 0xAD, 0xF3, 0x11, 0xE9, + 0x0A, 0x00, 0x8F, 0xED, 0x36, 0x01, 0x4E, 0xF0, 0x33, 0x02, 0xEE, 0xED, + 0x70, 0x0B, 0x2C, 0xF1, 0x13, 0x12, 0xC1, 0xF5, 0x59, 0x17, 0x61, 0xF2, + 0x7C, 0x1F, 0x3F, 0xE9, 0x42, 0x1F, 0xE6, 0xE3, 0x6F, 0x17, 0x4F, 0xE9, + 0x59, 0x12, 0x65, 0xEF, 0x39, 0x12, 0xFB, 0xFC, 0x23, 0x0D, 0x46, 0x12, + 0x34, 0x01, 0xEB, 0x19, 0xF7, 0x02, 0xEA, 0x17, 0x23, 0x09, 0x40, 0x15, + 0x8D, 0x05, 0x6E, 0x0E, 0x37, 0x08, 0x22, 0x07, 0x18, 0x0F, 0x52, 0x08, + 0x2C, 0x11, 0x81, 0x0D, 0xB2, 0x1E, 0x20, 0x16, 0x20, 0x2E, 0xBB, 0x21, + 0xE4, 0x23, 0xF6, 0x28, 0xFD, 0x19, 0x7E, 0x2B, 0xB5, 0x1E, 0x54, 0x23, + 0x63, 0x23, 0x50, 0x17, 0xC5, 0x20, 0x61, 0x15, 0xA2, 0x16, 0xDA, 0x15, + 0xEB, 0x18, 0x77, 0x15, 0xC1, 0x26, 0xCB, 0x1C, 0x17, 0x32, 0xFE, 0x27, + 0x3B, 0x35, 0x3D, 0x33, 0x92, 0x2D, 0xF8, 0x44, 0x79, 0x2A, 0xB1, 0x4D, + 0xAE, 0x31, 0x12, 0x41, 0x0C, 0x35, 0x19, 0x31, 0xD7, 0x33, 0xE3, 0x28, + 0x8B, 0x32, 0x7D, 0x1F, 0x7E, 0x35, 0x24, 0x1C, 0x53, 0x36, 0x86, 0x29, + 0xB4, 0x2A, 0x59, 0x3A, 0x26, 0x1A, 0xC9, 0x3C, 0xF0, 0x0D, 0x19, 0x34, + 0x3C, 0x07, 0xEF, 0x27, 0xAE, 0x05, 0x99, 0x18, 0x77, 0x05, 0xD7, 0x10, + 0xF2, 0x01, 0x22, 0x0C, 0x48, 0x06, 0x35, 0x04, 0x6C, 0x11, 0xE6, 0x01, + 0xD2, 0x0A, 0x1B, 0x08, 0xF2, 0xF7, 0x60, 0x10, 0xF6, 0xF1, 0xFD, 0x0B, + 0xE5, 0xF8, 0xF7, 0xF8, 0x13, 0xFB, 0x66, 0xE6, 0xA7, 0xF2, 0xF4, 0xDC, + 0x22, 0xE8, 0xC1, 0xDE, 0x9A, 0xDF, 0x2B, 0xE8, 0x77, 0xE2, 0x3C, 0xF2, + 0xC5, 0xEE, 0x17, 0xF5, 0xFC, 0xF7, 0x44, 0xF0, 0x92, 0x01, 0x4B, 0xE9, + 0xA3, 0x03, 0xA7, 0xDA, 0xD9, 0xF5, 0xC8, 0xCA, 0x23, 0xEA, 0xB0, 0xCB, + 0xC4, 0xEC, 0xD5, 0xD6, 0x4D, 0xF8, 0x03, 0xDD, 0x75, 0x01, 0x92, 0xE0, + 0xEF, 0xFE, 0x8A, 0xE9, 0x28, 0xF9, 0xC5, 0xF5, 0x2E, 0xF7, 0x36, 0xFA, + 0xAE, 0xF8, 0x0A, 0xFA, 0xE3, 0xF5, 0x5B, 0xF9, 0xC0, 0xE8, 0x5B, 0xF3, + 0xBC, 0xE9, 0x67, 0xEE, 0xDF, 0xFC, 0x9C, 0xE7, 0xF6, 0x08, 0x08, 0xDF, + 0x70, 0x02, 0x3B, 0xE3, 0xC5, 0xEF, 0xF3, 0xED, 0x55, 0xE0, 0x74, 0xEC, + 0x8B, 0xD9, 0x77, 0xDE, 0xDA, 0xD9, 0xED, 0xCF, 0x29, 0xDD, 0x3E, 0xCE, + 0xEE, 0xE0, 0xB1, 0xD4, 0xEF, 0xE5, 0x5B, 0xD5, 0x8A, 0xEC, 0xEC, 0xD7, + 0xBB, 0xEB, 0xB1, 0xE7, 0xCF, 0xDF, 0x7A, 0xF8, 0xCB, 0xDC, 0x9A, 0xFF, + 0x27, 0xEB, 0x4E, 0x02, 0x2C, 0xF3, 0x08, 0xFC, 0x7C, 0xF2, 0x46, 0xF7, + 0xEF, 0xF1, 0x5B, 0x00, 0xAC, 0xEA, 0xCF, 0x0E, 0x41, 0xE9, 0x1E, 0x1B, + 0x18, 0xF1, 0x13, 0x1E, 0xDD, 0xF9, 0xEF, 0x1E, 0xF0, 0xFF, 0x95, 0x1E, + 0x08, 0x06, 0x45, 0x15, 0x18, 0x10, 0x7F, 0x0F, 0xC1, 0x09, 0xAE, 0x0D, + 0x64, 0xF6, 0x1F, 0x09, 0x1D, 0xF7, 0x08, 0x09, 0x1B, 0x00, 0x27, 0x0E, + 0x21, 0x01, 0x42, 0x15, 0x54, 0x07, 0x54, 0x1A, 0x50, 0x0C, 0xDA, 0x1C, + 0xDC, 0x0C, 0x73, 0x20, 0x1C, 0x13, 0x5C, 0x1F, 0x43, 0x1A, 0x5F, 0x18, + 0x01, 0x16, 0xE0, 0x10, 0xD0, 0x09, 0x7B, 0x09, 0x67, 0x0F, 0xC8, 0x04, + 0x3E, 0x23, 0xA5, 0x05, 0xE3, 0x26, 0xAD, 0x08, 0x7F, 0x22, 0x88, 0x07, + 0x99, 0x26, 0x46, 0x00, 0x9E, 0x26, 0x20, 0xF5, 0x33, 0x25, 0x77, 0xEF, + 0x73, 0x25, 0xBB, 0xF4, 0x6E, 0x1A, 0xC2, 0xFE, 0x02, 0x0A, 0x5E, 0x08, + 0xB0, 0x03, 0x88, 0x0A, 0xBC, 0x03, 0x37, 0x05, 0xAC, 0xFD, 0x7C, 0x04, + 0x80, 0xF3, 0x95, 0x02, 0x3F, 0xF0, 0x69, 0xF9, 0x95, 0xF1, 0xB5, 0xEF, + 0x6E, 0xF1, 0xC1, 0xE4, 0x13, 0xF0, 0x72, 0xE1, 0xF6, 0xE0, 0x0C, 0xEA, + 0x9E, 0xCE, 0x3E, 0xF3, 0x5D, 0xD0, 0xA8, 0xF2, 0xB7, 0xD9, 0x22, 0xEC, + 0x4A, 0xD5, 0x7F, 0xE7, 0xC2, 0xCA, 0x9F, 0xE1, 0xC3, 0xCD, 0x58, 0xD8, + 0x2D, 0xDD, 0xB4, 0xD7, 0x15, 0xE5, 0xD7, 0xE3, 0x0E, 0xE2, 0x5C, 0xEF, + 0x64, 0xE0, 0xB9, 0xF6, 0x5E, 0xDE, 0x35, 0xFF, 0x20, 0xE2, 0x60, 0x02, + 0xD8, 0xEF, 0xC0, 0xFC, 0xE6, 0xF9, 0x5D, 0xF6, 0x69, 0x02, 0xB0, 0xEC, + 0x39, 0x11, 0xF2, 0xE4, 0x3B, 0x18, 0x1A, 0xE8, 0x90, 0x11, 0x62, 0xF4, + 0x9C, 0x0E, 0x3C, 0x03, 0x13, 0x0E, 0x63, 0x09, 0xC1, 0x0D, 0xA8, 0x14, + 0x86, 0x0E, 0x03, 0x1F, 0xFF, 0x09, 0x27, 0x11, 0x57, 0x0C, 0xF7, 0xFD, + 0xCC, 0x0F, 0x84, 0xF3, 0x11, 0x01, 0x61, 0xF1, 0x08, 0xF0, 0xA8, 0xFD, + 0xBD, 0xE9, 0x80, 0x0C, 0xFF, 0xF0, 0xFA, 0x0F, 0x2C, 0x00, 0x5C, 0x0A, + 0xD0, 0x02, 0xA4, 0xFD, 0xB5, 0x02, 0x2F, 0xF3, 0xD5, 0x03, 0xC3, 0xF2, + 0x73, 0xF9, 0x8F, 0xF3, 0x11, 0xF6, 0x11, 0x00, 0x4C, 0x00, 0xEE, 0x19, + 0x6E, 0x07, 0xB2, 0x21, 0x87, 0x0D, 0xA9, 0x1B, 0x85, 0x12, 0x01, 0x15, + 0xB2, 0x0A, 0x90, 0x08, 0xA8, 0x05, 0xB0, 0x04, 0xDA, 0x17, 0x6E, 0x0B, + 0xEC, 0x28, 0xE3, 0x09, 0xA7, 0x2D, 0x08, 0x0E, 0x16, 0x35, 0xE5, 0x19, + 0xC6, 0x3E, 0x13, 0x1F, 0xBD, 0x45, 0xC3, 0x28, 0x97, 0x46, 0x87, 0x37, + 0x2B, 0x3E, 0x4B, 0x4B, 0x7E, 0x31, 0x03, 0x5F, 0x7A, 0x2B, 0x72, 0x5C, + 0xF0, 0x35, 0x42, 0x43, 0xBE, 0x49, 0xAC, 0x2E, 0xF4, 0x4A, 0x03, 0x2A, + 0x71, 0x3D, 0x53, 0x30, 0x45, 0x38, 0xA0, 0x3E, 0x3B, 0x31, 0xF3, 0x45, + 0x24, 0x21, 0x44, 0x40, 0xB4, 0x1F, 0x6A, 0x34, 0x89, 0x29, 0xC1, 0x22, + 0xAC, 0x28, 0x23, 0x15, 0xC1, 0x21, 0x0C, 0x12, 0xCF, 0x15, 0x8F, 0x19, + 0x1A, 0x06, 0xF8, 0x27, 0x83, 0x00, 0xA4, 0x2A, 0x80, 0x05, 0x59, 0x1A, + 0x6B, 0x0A, 0xF7, 0x0F, 0x80, 0x04, 0x81, 0x11, 0x24, 0xFB, 0x66, 0x0A, + 0x1D, 0xF8, 0x7C, 0x02, 0x98, 0xEE, 0xEA, 0x00, 0xD3, 0xE1, 0x99, 0xFB, + 0xC5, 0xE2, 0xB3, 0xF5, 0xC1, 0xEC, 0xB5, 0xF4, 0x21, 0xF8, 0x9E, 0xF9, + 0x2E, 0x03, 0xE4, 0xFA, 0xAA, 0x03, 0x54, 0xF6, 0x6B, 0xF8, 0xA7, 0xF5, + 0x79, 0xF0, 0xD4, 0xF1, 0x62, 0xF4, 0x83, 0xEC, 0x4C, 0xF9, 0xD1, 0xEF, + 0xDC, 0xF6, 0x82, 0xF4, 0x15, 0xF9, 0x04, 0xF4, 0xF6, 0x04, 0x4A, 0xF8, + 0xB8, 0x06, 0xE7, 0xFE, 0x0D, 0xFD, 0x34, 0xFF, 0x5E, 0xFB, 0x2E, 0xFD, + 0x08, 0xFB, 0x70, 0xFC, 0xD5, 0xF8, 0xFB, 0xF8, 0x0A, 0xFE, 0xB6, 0xF1, + 0x0A, 0xF9, 0xE1, 0xEC, 0x42, 0xE8, 0xA3, 0xF0, 0x8C, 0xE2, 0xF7, 0xF3, + 0x7A, 0xEA, 0x0C, 0xF1, 0xE9, 0xF5, 0x01, 0xF1, 0x09, 0xFB, 0x33, 0xEF, + 0x78, 0xF6, 0xB9, 0xED, 0x6E, 0xF0, 0x92, 0xF2, 0x2C, 0xF0, 0xE0, 0xF9, + 0x77, 0xF5, 0x47, 0xFF, 0x27, 0xF9, 0x3D, 0x06, 0xF0, 0xF9, 0x36, 0x15, + 0x31, 0x00, 0xC8, 0x1C, 0x04, 0x10, 0xF1, 0x18, 0x96, 0x1E, 0x56, 0x18, + 0xFD, 0x21, 0x2E, 0x1B, 0x03, 0x23, 0xDA, 0x1C, 0xDB, 0x28, 0x47, 0x1B, + 0x91, 0x2B, 0xEF, 0x16, 0x3A, 0x28, 0x3D, 0x15, 0x95, 0x22, 0xAD, 0x14, + 0x23, 0x1B, 0x46, 0x16, 0x2B, 0x1B, 0x3D, 0x1C, 0xBF, 0x21, 0xED, 0x1E, + 0x99, 0x23, 0xAC, 0x19, 0x60, 0x21, 0x7B, 0x14, 0x85, 0x1C, 0xDD, 0x12, + 0xD5, 0x17, 0xF6, 0x15, 0x18, 0x12, 0xD9, 0x20, 0xF3, 0x06, 0xEB, 0x26, + 0x2E, 0x05, 0xC6, 0x25, 0xBF, 0x14, 0x98, 0x23, 0x2D, 0x2A, 0x99, 0x1E, + 0x78, 0x34, 0xA7, 0x18, 0x53, 0x2F, 0xC3, 0x18, 0xF1, 0x2A, 0x58, 0x17, + 0xE9, 0x27, 0x6A, 0x15, 0x49, 0x22, 0xD5, 0x21, 0xEF, 0x18, 0x06, 0x2C, + 0x00, 0x19, 0xB8, 0x2A, 0x04, 0x22, 0x8F, 0x1E, 0x42, 0x23, 0xD9, 0x0D, + 0x1D, 0x1B, 0x84, 0x0A, 0x0F, 0x0B, 0x23, 0x10, 0xF0, 0xF6, 0x09, 0x12, + 0x7E, 0xEF, 0xD3, 0x11, 0x2B, 0xF2, 0x1C, 0x0E, 0x1C, 0xF1, 0x2E, 0x09, + 0xF5, 0xF4, 0x5A, 0x04, 0xA7, 0xF8, 0xF7, 0xF8, 0x15, 0xF2, 0xE0, 0xF0, + 0xE7, 0xE7, 0x1D, 0xF2, 0xCB, 0xE1, 0x71, 0xF4, 0x4E, 0xDD, 0x8B, 0xF2, + 0xD1, 0xD3, 0x9C, 0xEC, 0x4B, 0xC9, 0xD7, 0xE4, 0x57, 0xC6, 0x74, 0xDD, + 0x2B, 0xC9, 0x6C, 0xD3, 0xE0, 0xCA, 0x26, 0xC8, 0x95, 0xD1, 0x67, 0xC5, + 0x8F, 0xDC, 0x66, 0xC3, 0x58, 0xE3, 0xB7, 0xBF, 0x21, 0xEC, 0xE0, 0xBD, + 0x83, 0xF3, 0xB5, 0xB8, 0xD7, 0xF0, 0xEF, 0xC2, 0xE7, 0xE7, 0x10, 0xDD, + 0xBF, 0xE1, 0x29, 0xEC, 0xFD, 0xE5, 0x08, 0xEE, 0xB0, 0xEE, 0x9A, 0xE5, + 0xD5, 0xF7, 0x1D, 0xDC, 0xDC, 0xFE, 0xFF, 0xE2, 0x86, 0xFD, 0x6B, 0xEB, + 0x90, 0xFA, 0x52, 0xE9, 0x20, 0xF7, 0x3A, 0xEE, 0x53, 0xEE, 0xB7, 0xF6, + 0x07, 0xE6, 0x13, 0xEF, 0x80, 0xE8, 0x9E, 0xDD, 0xB5, 0xF3, 0x1E, 0xD2, + 0xD6, 0xF1, 0xDA, 0xCD, 0x35, 0xE3, 0xAC, 0xCA, 0x3B, 0xDF, 0x8A, 0xCD, + 0xBE, 0xD6, 0xA4, 0xD1, 0x0E, 0xC7, 0xCB, 0xCF, 0x08, 0xC7, 0x0F, 0xD2, + 0x26, 0xC5, 0xC6, 0xD8, 0xBB, 0xBD, 0x36, 0xD6, 0xDE, 0xC0, 0xFE, 0xCE, + 0x52, 0xC5, 0x23, 0xD1, 0x54, 0xBD, 0xCB, 0xD3, 0x8C, 0xB6, 0xA4, 0xD2, + 0xFD, 0xC1, 0x85, 0xCB, 0x9E, 0xD7, 0xFF, 0xC8, 0xE5, 0xDC, 0x1C, 0xCE, + 0xA3, 0xDA, 0xAF, 0xD9, 0x62, 0xDF, 0x45, 0xED, 0x7D, 0xD7, 0xBB, 0xF4, + 0xBE, 0xD5, 0xB2, 0xED, 0x23, 0xE5, 0x8C, 0xE3, 0x36, 0xE8, 0xAC, 0xDD, + 0x59, 0xE7, 0xEA, 0xE2, 0xE2, 0xEF, 0x4F, 0xF3, 0xB3, 0xEE, 0xC4, 0x03, + 0x80, 0xEC, 0x23, 0x0F, 0x63, 0xF7, 0x4B, 0x12, 0x8B, 0xFE, 0xCD, 0x07, + 0x58, 0x0D, 0x59, 0x06, 0xAA, 0x1C, 0x2C, 0x0F, 0xE3, 0x1A, 0xCE, 0x12, + 0x5C, 0x1B, 0x5D, 0x1E, 0x4F, 0x13, 0x05, 0x26, 0x54, 0x14, 0x91, 0x1F, + 0xC5, 0x28, 0x22, 0x1C, 0x27, 0x2D, 0x5B, 0x1E, 0x63, 0x2D, 0xFC, 0x1E, + 0x2B, 0x32, 0xCB, 0x17, 0x33, 0x2F, 0x09, 0x0C, 0x7A, 0x1F, 0xB4, 0x02, + 0x0D, 0x10, 0xE4, 0x05, 0x9F, 0x08, 0xFE, 0x12, 0xC0, 0x08, 0x6D, 0x14, + 0xD9, 0x0E, 0x39, 0x14, 0xFD, 0x15, 0x7E, 0x14, 0x12, 0x1A, 0x32, 0x0A, + 0x11, 0x17, 0x76, 0x0F, 0x87, 0x19, 0x72, 0x12, 0x07, 0x1D, 0x26, 0x0B, + 0x4E, 0x1E, 0x93, 0x0D, 0xBC, 0x1F, 0x28, 0x0F, 0xB6, 0x1B, 0xB4, 0x07, + 0x43, 0x0F, 0x55, 0x05, 0x23, 0x05, 0x91, 0x0B, 0x46, 0xFF, 0xC8, 0x0B, + 0xD6, 0x08, 0x8F, 0x10, 0xAA, 0x1D, 0x37, 0x0B, 0x7D, 0x22, 0xD2, 0x01, + 0x6A, 0x1C, 0xDD, 0x0A, 0x1A, 0x0F, 0x51, 0x11, 0xF5, 0x04, 0x4A, 0x17, + 0x83, 0x05, 0xDA, 0x24, 0xC6, 0x05, 0xAA, 0x26, 0x44, 0x07, 0xAF, 0x1B, + 0x67, 0x05, 0x97, 0x0C, 0x83, 0xFA, 0x0D, 0xF7, 0x14, 0xF7, 0xC6, 0xF2, + 0x89, 0xF9, 0xA5, 0xFF, 0xA3, 0xE9, 0x94, 0x02, 0xCC, 0xE1, 0x1F, 0x08, + 0x69, 0xEC, 0x26, 0x08, 0x43, 0xF0, 0x90, 0xFC, 0x6A, 0xF9, 0x82, 0xFA, + 0xD3, 0x01, 0x72, 0xFD, 0x93, 0xFA, 0xA9, 0xFE, 0x01, 0xEB, 0x4B, 0xFF, + 0x7A, 0xE4, 0x5E, 0xFD, 0xF7, 0xF0, 0xBF, 0xFC, 0x34, 0xF7, 0xC6, 0xEF, + 0x0B, 0x03, 0xF2, 0xE7, 0x8E, 0x08, 0xAC, 0xE8, 0xF6, 0xFC, 0xC6, 0xE7, + 0xC1, 0xFA, 0x59, 0xF0, 0x0D, 0xF9, 0xE8, 0xF1, 0x05, 0xF5, 0x0B, 0xF7, + 0xA7, 0xEA, 0xE2, 0xFB, 0x4B, 0xEC, 0xC2, 0xF4, 0x9E, 0xF5, 0x03, 0xEA, + 0xB0, 0xF2, 0x71, 0xDC, 0xFF, 0xEB, 0xF6, 0xD8, 0xAC, 0xE9, 0xA6, 0xDB, + 0x70, 0xEA, 0x51, 0xD9, 0xC3, 0xF7, 0x54, 0xD7, 0x23, 0xFC, 0xBD, 0xC2, + 0xE4, 0xFE, 0x09, 0xBD, 0x5C, 0xFE, 0x61, 0xD1, 0xAC, 0xEE, 0x3B, 0xD8, + 0x6B, 0xF1, 0x30, 0xDD, 0x05, 0xF1, 0x33, 0xE8, 0x02, 0xEF, 0x2E, 0xED, + 0x2F, 0xFE, 0xF9, 0xE9, 0xFF, 0x0A, 0x1E, 0xEE, 0xFE, 0x04, 0xE7, 0xED, + 0x6A, 0xFE, 0x75, 0xEC, 0x09, 0xFC, 0x82, 0xFD, 0x66, 0xF4, 0x00, 0x11, + 0x6A, 0xF5, 0x81, 0x14, 0xD2, 0x09, 0x0E, 0x15, 0xB2, 0x18, 0x79, 0x13, + 0xCE, 0x13, 0xE2, 0x0E, 0x4E, 0x17, 0x06, 0x15, 0x77, 0x25, 0xFB, 0x1F, + 0x35, 0x1D, 0xD9, 0x27, 0x97, 0x08, 0x59, 0x21, 0x5A, 0x10, 0xFD, 0x1B, + 0x7E, 0x1A, 0x1D, 0x20, 0xFC, 0x0C, 0x0F, 0x1D, 0x43, 0x0B, 0x2F, 0x1E, + 0xCD, 0x0D, 0xC2, 0x23, 0x6E, 0xFB, 0x8D, 0x19, 0x3D, 0xFF, 0x1E, 0x10, + 0xF9, 0x0B, 0x71, 0x09, 0xC3, 0x04, 0x9C, 0x02, 0xE3, 0xFF, 0xB3, 0x04, + 0x85, 0xFF, 0x74, 0x05, 0x1B, 0x09, 0x5A, 0x09, 0x20, 0x0C, 0xD7, 0x13, + 0x3C, 0x01, 0xBF, 0x12, 0xD2, 0xFB, 0x32, 0x00, 0x91, 0x00, 0xD2, 0xF9, + 0x5A, 0xFF, 0x8B, 0x01, 0xD4, 0xFB, 0xDF, 0x03, 0x1A, 0xF8, 0x22, 0x09, + 0xEA, 0xF2, 0xFB, 0x15, 0xD4, 0xF4, 0x71, 0x16, 0x41, 0x02, 0xAD, 0x0F, + 0x64, 0x09, 0xCF, 0x0E, 0x70, 0xFD, 0x7A, 0x09, 0x16, 0xF8, 0xC9, 0xF9, + 0x92, 0xF5, 0x64, 0xEA, 0x15, 0xF4, 0x79, 0xEE, 0xE3, 0xF6, 0xBD, 0xF7, + 0x91, 0xF6, 0xA7, 0xF3, 0xE2, 0xF8, 0x4A, 0xEF, 0x65, 0x04, 0x1C, 0xEE, + 0x0E, 0x08, 0xA3, 0xE6, 0x1B, 0x01, 0xEC, 0xE9, 0x8A, 0xFA, 0x79, 0xF7, + 0x82, 0xF3, 0xB9, 0xF0, 0xA8, 0xEF, 0xA7, 0xE0, 0xBD, 0xFA, 0x07, 0xE6, + 0x18, 0xF6, 0x92, 0xED, 0xBC, 0xDA, 0xAC, 0xED, 0x94, 0xD8, 0xCF, 0xF6, + 0xE0, 0xE4, 0xF4, 0xFB, 0xDB, 0xE4, 0xDD, 0xF4, 0xBF, 0xE9, 0x05, 0xE9, + 0xA1, 0xF2, 0x3F, 0xDF, 0x8A, 0xE7, 0x2C, 0xD9, 0x1F, 0xDA, 0x82, 0xDD, + 0xDC, 0xDD, 0x5C, 0xF1, 0xFC, 0xD9, 0x45, 0xF6, 0xC1, 0xD9, 0xE0, 0xED, + 0x13, 0xEE, 0xF2, 0xEA, 0xE8, 0xF6, 0xB2, 0xE0, 0xB7, 0xEC, 0x6D, 0xD7, + 0x2C, 0xDF, 0xE1, 0xD4, 0xE4, 0xDB, 0x57, 0xD9, 0x32, 0xE2, 0x2A, 0xE9, + 0x7F, 0xE7, 0xFE, 0xFF, 0x0D, 0xEE, 0x07, 0x10, 0x66, 0xFC, 0x41, 0x0C, + 0x4E, 0x06, 0xA0, 0xFC, 0x74, 0x0E, 0x7E, 0xF2, 0xE8, 0x11, 0x9F, 0xEE, + 0x38, 0x05, 0xA4, 0xF5, 0x77, 0xF5, 0x51, 0xFF, 0x73, 0xF9, 0x79, 0x05, + 0xEF, 0x0E, 0x43, 0x09, 0x12, 0x1C, 0x5C, 0x08, 0x9A, 0x1D, 0x42, 0x06, + 0x9D, 0x19, 0x0C, 0x09, 0x17, 0x11, 0xAA, 0x19, 0xAB, 0x01, 0xA1, 0x21, + 0x70, 0x08, 0xF1, 0x1D, 0xEC, 0x1C, 0xD9, 0x16, 0x0E, 0x25, 0x2D, 0x0F, + 0x76, 0x22, 0x3B, 0x05, 0x21, 0x1E, 0x92, 0x03, 0x5C, 0x1E, 0x42, 0x11, + 0x01, 0x17, 0xE5, 0x14, 0x02, 0x1E, 0xAE, 0x1A, 0x2A, 0x20, 0xA8, 0x21, + 0xE6, 0x12, 0xF0, 0x1A, 0xFE, 0x16, 0x9F, 0x0E, 0x30, 0x1C, 0xDF, 0x0A, + 0x86, 0x19, 0x13, 0x1A, 0x44, 0x0E, 0xC2, 0x25, 0x69, 0x06, 0x99, 0x2A, + 0x8A, 0x13, 0x73, 0x2E, 0x1A, 0x16, 0xF2, 0x1A, 0x50, 0x19, 0x0F, 0x0E, + 0x66, 0x23, 0x2B, 0x13, 0x0F, 0x23, 0xF4, 0x1A, 0x79, 0x1F, 0xEA, 0x28, + 0x2C, 0x15, 0x3C, 0x30, 0x92, 0x13, 0x7E, 0x3B, 0xFC, 0x14, 0x69, 0x40, + 0xCA, 0x20, 0xC5, 0x36, 0x91, 0x33, 0xD0, 0x33, 0x20, 0x27, 0xBC, 0x35, + 0x0E, 0x16, 0xC2, 0x2F, 0x4D, 0x1A, 0x9C, 0x27, 0xDB, 0x20, 0x7B, 0x2B, + 0x4F, 0x20, 0xC3, 0x28, 0xED, 0x1D, 0x3C, 0x1A, 0xCA, 0x25, 0xF4, 0x1E, + 0xCB, 0x33, 0x1A, 0x27, 0x82, 0x34, 0xAB, 0x1F, 0x0D, 0x34, 0x83, 0x20, + 0x86, 0x29, 0xAB, 0x22, 0x84, 0x19, 0x8C, 0x17, 0x17, 0x23, 0x15, 0x0A, + 0x53, 0x29, 0xD2, 0x0A, 0xA1, 0x21, 0x1F, 0x1D, 0x83, 0x18, 0xF3, 0x22, + 0x3B, 0x19, 0x49, 0x1E, 0x55, 0x1A, 0xD6, 0x20, 0xAB, 0x0E, 0x62, 0x15, + 0x5A, 0x04, 0x60, 0x02, 0xE6, 0xF5, 0x6D, 0xFF, 0xC4, 0xED, 0x01, 0x02, + 0x23, 0xF7, 0xF9, 0xFF, 0x32, 0x00, 0x68, 0x03, 0x36, 0x02, 0xC4, 0x0A, + 0xC9, 0xFC, 0x7F, 0xFF, 0x16, 0xEF, 0x6A, 0xE8, 0x52, 0xE8, 0x5E, 0xDD, + 0x13, 0xDC, 0x63, 0xD9, 0xFB, 0xCD, 0xA1, 0xDE, 0x38, 0xC4, 0xB8, 0xE3, + 0x2E, 0xB8, 0x9F, 0xE0, 0x3D, 0xC4, 0xAB, 0xE6, 0x9B, 0xCB, 0x7C, 0xE9, + 0x16, 0xCC, 0x6F, 0xE9, 0x2B, 0xD4, 0xDD, 0xEA, 0x1B, 0xDD, 0x63, 0xE8, + 0x23, 0xEB, 0xCD, 0xEA, 0xE6, 0xED, 0xC7, 0xEB, 0x35, 0xEB, 0x71, 0xE9, + 0x54, 0xF1, 0x27, 0xE9, 0x08, 0xFC, 0x93, 0xEE, 0x10, 0x07, 0xF5, 0xF6, + 0x61, 0x0F, 0x3D, 0xFE, 0xD9, 0x1C, 0x86, 0x07, 0x6E, 0x26, 0xA2, 0xFF, + 0x45, 0x27, 0x94, 0xF5, 0x44, 0x23, 0x59, 0xFA, 0x18, 0x17, 0xCB, 0x02, + 0x56, 0x15, 0x64, 0x0E, 0x04, 0x1F, 0xAA, 0x19, 0x06, 0x29, 0x44, 0x24, + 0xDF, 0x31, 0xFB, 0x2A, 0xEB, 0x34, 0x8F, 0x26, 0x9A, 0x2D, 0x52, 0x1C, + 0x4F, 0x2C, 0xD7, 0x1F, 0x5A, 0x22, 0xB8, 0x21, 0x4D, 0x12, 0x28, 0x19, + 0x59, 0x11, 0xA0, 0x16, 0xC5, 0x0F, 0x92, 0x19, 0x96, 0x0E, 0xD2, 0x1F, + 0xBA, 0x0D, 0xF6, 0x20, 0xE4, 0x16, 0xE6, 0x16, 0x26, 0x1D, 0x81, 0x0B, + 0x57, 0x15, 0xB8, 0x03, 0x86, 0x10, 0x1A, 0x08, 0x68, 0x02, 0x91, 0x12, + 0x95, 0xFB, 0xE9, 0x19, 0xD9, 0x07, 0x21, 0x11, 0xD6, 0x12, 0xDF, 0x0B, + 0xA9, 0x11, 0xDC, 0x18, 0x19, 0x02, 0xCD, 0x17, 0x60, 0xFF, 0x1C, 0x1A, + 0x89, 0x01, 0x4B, 0x1B, 0xE3, 0x02, 0x30, 0x0E, 0xE8, 0x11, 0x5B, 0xFF, + 0x10, 0x1C, 0xDE, 0xFA, 0xD8, 0x1C, 0xC0, 0x0A, 0xB3, 0x16, 0x29, 0x17, + 0x0D, 0x16, 0xDA, 0x1B, 0x3F, 0x20, 0x54, 0x25, 0x9B, 0x1B, 0x19, 0x2B, + 0x9F, 0x12, 0xC6, 0x26, 0x94, 0x15, 0x90, 0x29, 0xDD, 0x0B, 0xAF, 0x2B, + 0xEB, 0xFC, 0xDC, 0x19, 0x46, 0xFE, 0x3F, 0x04, 0x0A, 0xFE, 0x85, 0x00, + 0xC8, 0xF7, 0xF0, 0x0C, 0xCB, 0xFB, 0x52, 0x1A, 0x51, 0xFE, 0x3F, 0x1A, + 0x84, 0xF7, 0xC3, 0x0E, 0xBE, 0xF6, 0x6B, 0x00, 0xD2, 0xF5, 0x3A, 0xF3, + 0x96, 0xE8, 0x3D, 0xF6, 0x03, 0xE4, 0x32, 0xFE, 0x12, 0xE7, 0x0A, 0xF6, + 0xC3, 0xED, 0x5D, 0xF2, 0xF0, 0xF8, 0xDF, 0xEE, 0x2D, 0xF7, 0x65, 0xDA, + 0x18, 0xEF, 0x10, 0xCE, 0x10, 0xE0, 0xB2, 0xCB, 0x5E, 0xCF, 0x04, 0xCC, + 0x45, 0xD2, 0x66, 0xDA, 0xA7, 0xE1, 0x32, 0xEB, 0x57, 0xE2, 0x6F, 0xDE, + 0xBF, 0xE1, 0xEC, 0xCD, 0xDF, 0xE5, 0x68, 0xD5, 0x2F, 0xEA, 0x33, 0xE1, + 0x5F, 0xFA, 0xA0, 0xE4, 0x62, 0x06, 0xE3, 0xE6, 0x1D, 0xF5, 0x49, 0xE7, + 0x11, 0xD9, 0x27, 0xD7, 0x1B, 0xDC, 0xC0, 0xCB, 0x02, 0xF0, 0x48, 0xD9, + 0x12, 0xF5, 0xF0, 0xE2, 0x6E, 0xED, 0x23, 0xDE, 0x68, 0xEA, 0xBD, 0xE2, + 0x61, 0xED, 0xAD, 0xDF, 0x04, 0xF9, 0xBD, 0xD2, 0xF9, 0x07, 0x17, 0xD4, + 0x02, 0x04, 0x34, 0xE0, 0x07, 0xEE, 0x55, 0xE9, 0xC8, 0xED, 0xA8, 0xF0, + 0x3B, 0xF8, 0x3B, 0xF5, 0x00, 0xF0, 0x59, 0xF9, 0x74, 0xE7, 0xCA, 0xFA, + 0x00, 0xDD, 0x1C, 0xEE, 0xE5, 0xD2, 0xFC, 0xE5, 0x6D, 0xD0, 0x65, 0xE9, + 0x6B, 0xC9, 0xFB, 0xE8, 0x17, 0xC7, 0xDF, 0xEE, 0x96, 0xCF, 0xA9, 0xF7, + 0x1F, 0xD5, 0xED, 0xF1, 0xF8, 0xDF, 0xBE, 0xED, 0xB4, 0xE3, 0xCF, 0xEB, + 0x87, 0xD9, 0x71, 0xE9, 0x50, 0xD5, 0x04, 0xE6, 0x98, 0xDB, 0x32, 0xE4, + 0x72, 0xDC, 0x54, 0xE9, 0x04, 0xD3, 0x1D, 0xED, 0x41, 0xD2, 0xFD, 0xED, + 0xD2, 0xDA, 0x37, 0xEB, 0x65, 0xEA, 0x03, 0xE5, 0x98, 0xF3, 0xEC, 0xE0, + 0xF0, 0xF1, 0xE2, 0xE4, 0x6E, 0xF0, 0x40, 0xE8, 0xB8, 0xE9, 0xD3, 0xE9, + 0xE3, 0xE8, 0x7D, 0xED, 0xD3, 0xF0, 0x22, 0xEC, 0xF4, 0xFA, 0x10, 0xE9, + 0xA3, 0x09, 0x5A, 0xEC, 0x91, 0x16, 0xD7, 0xEA, 0x5D, 0x22, 0xF0, 0xF0, + 0x23, 0x1E, 0xAE, 0xF7, 0xC6, 0x08, 0x13, 0xF2, 0x5F, 0x03, 0x67, 0xEE, + 0x1C, 0x09, 0xDF, 0xF2, 0x79, 0x0C, 0x39, 0x06, 0xC0, 0x0F, 0xFA, 0x14, + 0x7E, 0x17, 0xCE, 0x1B, 0xE1, 0x1B, 0xF9, 0x1C, 0xBA, 0x1C, 0x80, 0x0B, + 0xAA, 0x27, 0xC5, 0xFC, 0xE4, 0x2B, 0xB5, 0xFD, 0x21, 0x21, 0x7B, 0xFF, + 0x95, 0x09, 0x5A, 0x00, 0xB7, 0xF0, 0x1E, 0x08, 0xB8, 0xEE, 0x1E, 0x10, + 0xA4, 0xEE, 0x3A, 0x04, 0xBB, 0xE5, 0x73, 0xED, 0x24, 0xEA, 0xB3, 0xE6, + 0x47, 0xEC, 0x28, 0xEB, 0x5A, 0xE4, 0x76, 0xE9, 0xB1, 0xE1, 0x40, 0xE5, + 0x50, 0xDC, 0xAC, 0xEC, 0x29, 0xD3, 0x0A, 0xF2, 0x1D, 0xCF, 0x23, 0xF3, + 0x8D, 0xD4, 0x25, 0xFE, 0xED, 0xDF, 0x0C, 0xFF, 0xFD, 0xE1, 0xC4, 0xEE, + 0xBA, 0xD7, 0x24, 0xE5, 0xD4, 0xDD, 0x10, 0xEA, 0x90, 0xF1, 0x81, 0xEE, + 0x0B, 0xFC, 0xDD, 0xF5, 0xA2, 0x03, 0x4F, 0xFF, 0x52, 0x0A, 0x48, 0xF7, + 0x21, 0x19, 0x64, 0xF0, 0x33, 0x21, 0xB4, 0xFA, 0xDD, 0x1A, 0xF1, 0x0A, + 0x1B, 0x14, 0x82, 0x18, 0x86, 0x04, 0x46, 0x17, 0x01, 0xFE, 0x47, 0x05, + 0x65, 0x13, 0x5A, 0xEF, 0x49, 0x1C, 0x27, 0xEB, 0x09, 0x06, 0x68, 0xFD, + 0x6E, 0xFB, 0xF4, 0x0F, 0x1F, 0x0A, 0x87, 0x1C, 0x64, 0x16, 0x61, 0x21, + 0x92, 0x17, 0xAC, 0x1C, 0x57, 0x14, 0xE2, 0x16, 0xCE, 0x14, 0xF8, 0x19, + 0x44, 0x1D, 0x3E, 0x22, 0x7B, 0x21, 0x64, 0x1D, 0x5B, 0x1D, 0x00, 0x12, + 0xAA, 0x0C, 0x90, 0x0D, 0xB8, 0xF6, 0x56, 0x09, 0x13, 0xF7, 0x89, 0x00, + 0xF6, 0x07, 0x98, 0xFF, 0x31, 0x0D, 0x6E, 0xFD, 0x48, 0x11, 0xF5, 0xF8, + 0x6A, 0x1E, 0x94, 0xFD, 0x37, 0x17, 0x9F, 0xFE, 0x30, 0x09, 0x30, 0x05, + 0xF0, 0x0E, 0x5B, 0x11, 0x4D, 0x1C, 0x02, 0x12, 0x78, 0x29, 0xB3, 0x13, + 0xD8, 0x31, 0xB9, 0x15, 0x84, 0x33, 0x18, 0x16, 0x52, 0x26, 0x87, 0x1F, + 0x94, 0x14, 0x4B, 0x1F, 0x9F, 0x14, 0x39, 0x1D, 0x99, 0x19, 0x7D, 0x2B, + 0x0C, 0x17, 0x45, 0x33, 0x42, 0x19, 0x44, 0x2B, 0xA4, 0x1F, 0xA8, 0x27, + 0xF5, 0x25, 0x1C, 0x24, 0x91, 0x27, 0x0A, 0x1D, 0x64, 0x1F, 0xCE, 0x19, + 0x53, 0x20, 0x90, 0x18, 0x77, 0x2B, 0xE2, 0x20, 0xDC, 0x26, 0x22, 0x2B, + 0xA4, 0x21, 0xA7, 0x33, 0xDA, 0x28, 0x22, 0x39, 0xC6, 0x24, 0x1F, 0x29, + 0xA8, 0x12, 0xF5, 0x0E, 0xD9, 0xFE, 0x83, 0x0C, 0x76, 0xEE, 0x2F, 0x14, + 0xDE, 0xE7, 0x06, 0x10, 0xBF, 0xEB, 0x16, 0x0D, 0x81, 0xEB, 0x37, 0x03, + 0x44, 0xE8, 0x74, 0xF6, 0xD5, 0xE4, 0x72, 0xEB, 0x40, 0xE4, 0xA5, 0xDD, + 0xA2, 0xE8, 0xC2, 0xD8, 0x40, 0xD6, 0x97, 0xD1, 0x4E, 0xBE, 0x9C, 0xCC, + 0xD8, 0xBF, 0x28, 0xD3, 0xBE, 0xC9, 0x13, 0xCE, 0xF2, 0xCC, 0xFA, 0xC6, + 0xE9, 0xC5, 0x16, 0xD3, 0x57, 0xB2, 0x8A, 0xD5, 0xAC, 0xAB, 0xB5, 0xD1, + 0xE6, 0xB8, 0x35, 0xCF, 0x2B, 0xC2, 0xBF, 0xBC, 0xA6, 0xC3, 0x03, 0xAD, + 0xAE, 0xC7, 0xE5, 0xB5, 0x92, 0xCC, 0xBB, 0xBF, 0xBF, 0xCC, 0x70, 0xC2, + 0x0A, 0xD3, 0x9D, 0xCC, 0x51, 0xD9, 0x0C, 0xD1, 0x8D, 0xE4, 0x01, 0xD8, + 0x43, 0xF2, 0x3F, 0xDA, 0x46, 0xF2, 0xC1, 0xCF, 0x97, 0xE1, 0x8E, 0xCC, + 0xCD, 0xC5, 0xB8, 0xCC, 0x26, 0xB5, 0x74, 0xC6, 0x76, 0xB8, 0x01, 0xC2, + 0x89, 0xC9, 0x17, 0xCC, 0x5C, 0xCC, 0x55, 0xCF, 0xEC, 0xC9, 0x7E, 0xC7, + 0x33, 0xDE, 0x89, 0xD3, 0x41, 0xF6, 0x6B, 0xEF, 0xA5, 0x04, 0xDF, 0xFF, + 0xA0, 0x06, 0x97, 0x04, 0x69, 0x01, 0x3B, 0x10, 0x90, 0x04, 0x44, 0x18, + 0x00, 0x15, 0x74, 0x13, 0x54, 0x27, 0xCF, 0x15, 0x73, 0x24, 0x22, 0x0F, + 0x94, 0x17, 0x2D, 0x00, 0x9E, 0x17, 0x30, 0x05, 0xE9, 0x11, 0xCE, 0x0E, + 0x2F, 0x0B, 0xAE, 0x16, 0xD3, 0x0F, 0x27, 0x15, 0x1E, 0x12, 0x48, 0x0A, + 0xC1, 0x06, 0x0D, 0x08, 0xD1, 0xFB, 0x25, 0x0E, 0x95, 0xF8, 0x4A, 0x07, + 0x17, 0xF5, 0xEA, 0xFB, 0x54, 0xF9, 0x89, 0xFE, 0xDA, 0x05, 0x83, 0x07, + 0xA9, 0x1A, 0x13, 0x16, 0xBC, 0x22, 0x1C, 0x15, 0xED, 0x25, 0x87, 0x0C, + 0xF9, 0x2C, 0x55, 0x12, 0xFE, 0x29, 0xE2, 0x22, 0x68, 0x2A, 0x43, 0x39, + 0xF9, 0x2A, 0x75, 0x38, 0x3F, 0x35, 0x9C, 0x2A, 0x3A, 0x3A, 0xF0, 0x1B, + 0x41, 0x2C, 0x94, 0x11, 0x4C, 0x25, 0xA4, 0x1D, 0x70, 0x2B, 0xAE, 0x2D, + 0xA5, 0x2F, 0x41, 0x34, 0xA1, 0x24, 0xCE, 0x3A, 0xC2, 0x1B, 0x02, 0x47, + 0xCE, 0x28, 0xAC, 0x4F, 0xFB, 0x3D, 0x0A, 0x4A, 0x2B, 0x42, 0x33, 0x3C, + 0x88, 0x33, 0xBB, 0x38, 0x4F, 0x1E, 0x72, 0x3C, 0x1C, 0x0E, 0x80, 0x38, + 0x64, 0x0B, 0x34, 0x35, 0xF3, 0x0D, 0x19, 0x2E, 0x6B, 0x04, 0xD5, 0x16, + 0xB2, 0xF3, 0x03, 0x05, 0xD4, 0xEB, 0xEA, 0xF8, 0x60, 0xED, 0xF2, 0xE6, + 0x5E, 0xED, 0xE5, 0xDD, 0x56, 0xE7, 0x44, 0xDF, 0xF9, 0xEC, 0x4D, 0xE1, + 0x41, 0xFE, 0x44, 0xE2, 0x70, 0x08, 0xBB, 0xE0, 0x84, 0x00, 0x3C, 0xE4, + 0x05, 0xF7, 0x40, 0xEF, 0x47, 0xF7, 0x5A, 0xEE, 0xE0, 0xF7, 0x4D, 0xE3, + 0xE5, 0xF7, 0x2F, 0xE3, 0x7B, 0xF3, 0x14, 0xE8, 0x17, 0xED, 0xF4, 0xF4, + 0x44, 0xEA, 0xEE, 0xFE, 0x8C, 0xF4, 0x67, 0xFC, 0xA2, 0xFC, 0xE8, 0xFE, + 0x42, 0xF3, 0x79, 0x05, 0xCD, 0xE8, 0xCD, 0x01, 0x65, 0xEF, 0xEA, 0xF9, + 0xBB, 0x09, 0x4E, 0xFB, 0xD8, 0x20, 0xB0, 0x02, 0x85, 0x21, 0x75, 0x10, + 0x9C, 0x14, 0xB8, 0x1C, 0x3C, 0x06, 0x86, 0x1C, 0xD1, 0xF3, 0xD0, 0x10, + 0x76, 0xE0, 0xFF, 0xFF, 0x0B, 0xD0, 0x5C, 0xEF, 0x72, 0xC7, 0x01, 0xE3, + 0xEC, 0xCB, 0x4C, 0xDC, 0x9F, 0xD7, 0x23, 0xE1, 0x81, 0xE5, 0xBF, 0xEF, + 0x71, 0xF8, 0xF6, 0xFE, 0x12, 0x0D, 0x5B, 0x0C, 0x91, 0x1C, 0x47, 0x1A, + 0xCB, 0x26, 0xD8, 0x28, 0x5C, 0x22, 0xFF, 0x27, 0xA8, 0x20, 0x77, 0x1C, + 0x49, 0x26, 0x97, 0x1C, 0x64, 0x18, 0x03, 0x1D, 0x9D, 0x0B, 0x80, 0x15, + 0xC8, 0x0C, 0xB9, 0x08, 0x52, 0x04, 0xCB, 0xFD, 0xCA, 0xFC, 0xC2, 0xFC, + 0x2F, 0x03, 0x46, 0xFF, 0xE4, 0x0A, 0xDD, 0x00, 0x11, 0x0B, 0xEF, 0x00, + 0xAD, 0x04, 0x6D, 0x02, 0xA3, 0xFE, 0x74, 0x0B, 0x58, 0x03, 0x9A, 0x16, + 0x82, 0x1D, 0xF7, 0x1E, 0x7A, 0x3C, 0xE3, 0x21, 0x35, 0x50, 0x71, 0x29, + 0x26, 0x56, 0xF9, 0x37, 0xCE, 0x4E, 0x19, 0x3B, 0x84, 0x49, 0x4C, 0x39, + 0xD9, 0x43, 0xB1, 0x37, 0xFB, 0x3F, 0x70, 0x3C, 0x68, 0x42, 0x6E, 0x48, + 0x4B, 0x3B, 0x27, 0x47, 0x11, 0x3B, 0xFA, 0x42, 0x7C, 0x3F, 0x66, 0x3D, + 0x8D, 0x32, 0xD2, 0x2F, 0x67, 0x28, 0x27, 0x30, 0xCF, 0x2A, 0x2F, 0x35, + 0x13, 0x30, 0x28, 0x35, 0xD5, 0x37, 0x2E, 0x3D, 0x7E, 0x3B, 0x8E, 0x40, + 0x02, 0x39, 0x25, 0x3A, 0x6A, 0x30, 0x4C, 0x38, 0xC9, 0x24, 0x73, 0x30, + 0x5A, 0x22, 0x00, 0x1F, 0x53, 0x1C, 0x4D, 0x0E, 0x7B, 0x07, 0x28, 0x03, + 0x97, 0xFC, 0x63, 0xFC, 0x85, 0xFF, 0x54, 0xF3, 0xEF, 0xF7, 0xDF, 0xEE, + 0xD3, 0xD9, 0x99, 0xE9, 0xEB, 0xC5, 0xA4, 0xDA, 0x8B, 0xCB, 0xE6, 0xCA, + 0x5C, 0xD0, 0x26, 0xC5, 0x21, 0xD5, 0xE9, 0xCC, 0x40, 0xD5, 0xEE, 0xCF, + 0x91, 0xCB, 0x34, 0xCB, 0x2A, 0xC5, 0x67, 0xC5, 0x48, 0xC5, 0xC1, 0xBF, + 0x47, 0xC6, 0xAC, 0xC0, 0xBE, 0xC0, 0xF4, 0xC4, 0x16, 0xB8, 0x7A, 0xCD, + 0x98, 0xB9, 0x91, 0xD4, 0x67, 0xBB, 0x69, 0xCC, 0xCC, 0xAE, 0x33, 0xBF, + 0xCC, 0xA3, 0x85, 0xB4, 0x7B, 0xB3, 0x37, 0xB2, 0x5F, 0xC8, 0x94, 0xBE, + 0xE2, 0xC9, 0x95, 0xC8, 0xE9, 0xCB, 0x30, 0xD0, 0x96, 0xD9, 0x25, 0xDB, + 0x6D, 0xEC, 0xB7, 0xDE, 0x52, 0xFD, 0xF2, 0xDB, 0xCA, 0x0C, 0x34, 0xE6, + 0xC0, 0x0A, 0xDE, 0xEB, 0x7A, 0xF0, 0xA6, 0xE6, 0x29, 0xD7, 0xB4, 0xE6, + 0x99, 0xC5, 0xCD, 0xDD, 0x29, 0xC0, 0x99, 0xD0, 0x93, 0xD2, 0xA6, 0xD0, + 0x9D, 0xEE, 0x3A, 0xD9, 0x79, 0xFB, 0x08, 0xE8, 0x5D, 0xFD, 0x38, 0xF8, + 0x25, 0x05, 0xDA, 0x04, 0x6B, 0x18, 0xCB, 0x12, 0xEE, 0x29, 0x08, 0x19, + 0xEF, 0x30, 0xC7, 0x24, 0x63, 0x2A, 0x6D, 0x34, 0xFF, 0x1F, 0xB2, 0x27, + 0xB5, 0x20, 0x40, 0x12, 0xAC, 0x1A, 0x41, 0x06, 0xC5, 0x06, 0x5A, 0xF5, + 0x1D, 0xFC, 0xE8, 0xED, 0x81, 0xFC, 0xF4, 0xE8, 0x6D, 0xF9, 0xB1, 0xD3, + 0xE0, 0xEF, 0x93, 0xC9, 0xF7, 0xE3, 0x31, 0xDD, 0x60, 0xDE, 0x76, 0xF1, + 0xFE, 0xE4, 0x18, 0xEF, 0x9C, 0xF5, 0xE1, 0xE9, 0x11, 0x03, 0x79, 0xF0, + 0xF9, 0x0D, 0xA7, 0xF9, 0x47, 0x23, 0xA2, 0x06, 0x42, 0x38, 0x7E, 0x1A, + 0xDE, 0x38, 0x38, 0x2B, 0xFE, 0x2D, 0xDE, 0x33, 0x32, 0x27, 0xAD, 0x3A, + 0xB1, 0x26, 0x89, 0x39, 0x64, 0x26, 0xE9, 0x30, 0x5B, 0x24, 0x92, 0x32, + 0xD1, 0x1A, 0xE7, 0x35, 0xF5, 0x0B, 0xCC, 0x30, 0xE3, 0x0B, 0xCE, 0x2B, + 0xB7, 0x15, 0x10, 0x25, 0xCD, 0x1B, 0x71, 0x25, 0x00, 0x1F, 0x09, 0x2D, + 0xD5, 0x24, 0x1D, 0x31, 0x7E, 0x2C, 0x4F, 0x30, 0xE8, 0x29, 0x7B, 0x2C, + 0x9F, 0x19, 0x16, 0x2B, 0x0D, 0x0F, 0x0A, 0x2E, 0x50, 0x10, 0x1A, 0x2A, + 0xDA, 0x10, 0xA5, 0x20, 0xFE, 0x09, 0x68, 0x17, 0x9F, 0xFE, 0xB7, 0x0E, + 0x34, 0xE8, 0xEB, 0x04, 0xEF, 0xCF, 0x3A, 0xFF, 0xA7, 0xCC, 0x22, 0x06, + 0xE4, 0xD5, 0xDB, 0x01, 0xAA, 0xE4, 0xC4, 0xEF, 0x93, 0xE8, 0x2F, 0xE1, + 0xD6, 0xE7, 0x8D, 0xDC, 0xD7, 0xF6, 0x46, 0xDF, 0xD9, 0x00, 0x7A, 0xEA, + 0xF4, 0x05, 0xAE, 0xF6, 0x23, 0x0F, 0xFD, 0xF9, 0xB6, 0x09, 0x4C, 0xF9, + 0x4F, 0xFC, 0xA1, 0xF2, 0x33, 0xF8, 0xAD, 0xE5, 0xA2, 0xF6, 0xA5, 0xE1, + 0xA2, 0xF2, 0xC2, 0xEC, 0xB2, 0xE9, 0x4C, 0xF3, 0x39, 0xEA, 0xCF, 0xF0, + 0x9D, 0xFE, 0x1E, 0xEF, 0xB1, 0x15, 0xEF, 0xF3, 0xC1, 0x1B, 0x7F, 0x04, + 0x41, 0x20, 0x81, 0x1A, 0x1B, 0x32, 0x7C, 0x2F, 0x59, 0x3B, 0xD1, 0x35, + 0xEF, 0x38, 0xBC, 0x30, 0x24, 0x31, 0x99, 0x31, 0xFB, 0x25, 0x4C, 0x2E, + 0xFC, 0x18, 0x67, 0x19, 0xF4, 0x04, 0x38, 0xFC, 0x37, 0xEC, 0x15, 0xE3, + 0x98, 0xD2, 0x62, 0xD3, 0xEF, 0xBA, 0x62, 0xC9, 0x3A, 0xBC, 0x51, 0xCE, + 0xF9, 0xDA, 0x85, 0xE4, 0x5D, 0xFB, 0xD3, 0xF4, 0x0F, 0x12, 0x97, 0x06, + 0xC4, 0x1A, 0x62, 0x24, 0x26, 0x29, 0x46, 0x3F, 0x5C, 0x42, 0xFF, 0x40, + 0xDE, 0x45, 0x95, 0x33, 0xB9, 0x32, 0xB3, 0x28, 0xEC, 0x1A, 0x5A, 0x16, + 0x68, 0x06, 0x9B, 0xFF, 0x30, 0x00, 0x38, 0xED, 0x0F, 0xFE, 0x32, 0xE0, + 0xD3, 0xE2, 0x6B, 0xDC, 0x8B, 0xC6, 0x05, 0xDF, 0xE5, 0xBF, 0x20, 0xD5, + 0xF4, 0xC5, 0x2B, 0xC3, 0xB0, 0xCB, 0x39, 0xBF, 0x93, 0xCB, 0x1D, 0xCC, + 0xF1, 0xD0, 0x5A, 0xE4, 0xAE, 0xE5, 0xFD, 0xFF, 0x62, 0x00, 0x7C, 0x10, + 0xF1, 0x08, 0x10, 0x12, 0xB4, 0x0D, 0x7D, 0x18, 0xF8, 0x20, 0xF7, 0x22, + 0xA4, 0x33, 0x9A, 0x21, 0x40, 0x30, 0x28, 0x19, 0x37, 0x0F, 0x63, 0x12, + 0xFF, 0xEC, 0xC7, 0x03, 0x25, 0xE2, 0xB5, 0xEE, 0xAA, 0xEB, 0x24, 0xE2, + 0x7C, 0xF0, 0xF6, 0xDC, 0x62, 0xE3, 0xA0, 0xDD, 0x0C, 0xE1, 0x06, 0xDE, + 0xD0, 0xE9, 0x3D, 0xDC, 0xEB, 0xEF, 0x92, 0xE0, 0x84, 0xF4, 0x5B, 0xE5, + 0x6B, 0xEE, 0xFF, 0xE8, 0x39, 0xE7, 0x9D, 0xED, 0xFA, 0xE3, 0xC0, 0xE7, + 0xB6, 0xDE, 0xA6, 0xE0, 0xB7, 0xE0, 0x4E, 0xE2, 0xD4, 0xE2, 0xE0, 0xE2, + 0xB4, 0xDA, 0x23, 0xDE, 0x55, 0xD6, 0x9D, 0xD6, 0xE3, 0xD5, 0x55, 0xD1, + 0x74, 0xC7, 0xF0, 0xCD, 0xB3, 0xB8, 0xF8, 0xC8, 0x77, 0xB5, 0x30, 0xC1, + 0xA5, 0xB3, 0x85, 0xB6, 0x65, 0xB6, 0xA6, 0xB3, 0xD1, 0xC1, 0x8B, 0xB7, + 0xA5, 0xD5, 0x5E, 0xB7, 0x2D, 0xE5, 0xAE, 0xBD, 0x83, 0xE2, 0xE7, 0xCE, + 0xCA, 0xEA, 0x75, 0xDB, 0xEA, 0xFA, 0x17, 0xE3, 0x03, 0xEA, 0x1A, 0xE3, + 0x69, 0xCD, 0x55, 0xDE, 0xCA, 0xC3, 0xA3, 0xE6, 0x20, 0xC4, 0xA7, 0xEC, + 0xFA, 0xCA, 0x21, 0xE5, 0x7B, 0xD3, 0xB6, 0xE0, 0x6D, 0xDB, 0x6F, 0xEC, + 0xA4, 0xEA, 0xE5, 0xFF, 0xE3, 0xFA, 0xFE, 0x0B, 0x84, 0x0F, 0xDA, 0x16, + 0xEB, 0x29, 0x25, 0x27, 0x62, 0x34, 0xCC, 0x39, 0x2C, 0x38, 0x82, 0x3E, + 0x1F, 0x43, 0xCA, 0x2E, 0xC5, 0x3B, 0x58, 0x17, 0xDD, 0x1A, 0x23, 0xF8, + 0x03, 0xF3, 0xC3, 0xE0, 0x99, 0xCE, 0x79, 0xD2, 0x4F, 0xB6, 0x2A, 0xC4, + 0x9B, 0xAC, 0xAE, 0xC0, 0xBB, 0xB0, 0x69, 0xD0, 0xEF, 0xC7, 0xB3, 0xF0, + 0xE1, 0xEF, 0xBF, 0x0C, 0xD1, 0x18, 0x78, 0x1E, 0x08, 0x31, 0x75, 0x34, + 0x9C, 0x3C, 0xA5, 0x48, 0x30, 0x44, 0x03, 0x4F, 0xE5, 0x47, 0x05, 0x4D, + 0x43, 0x42, 0x3D, 0x3F, 0x24, 0x32, 0x09, 0x26, 0x77, 0x16, 0x44, 0x0C, + 0x4A, 0xF6, 0x57, 0xF3, 0x8C, 0xE4, 0x20, 0xDB, 0x5C, 0xDA, 0x3F, 0xCA, + 0x7D, 0xD0, 0xBB, 0xCA, 0x6B, 0xCF, 0x8A, 0xCF, 0x92, 0xD9, 0x50, 0xD1, + 0x70, 0xEF, 0xA8, 0xD8, 0x9C, 0x0B, 0xCB, 0xE6, 0x3A, 0x22, 0x82, 0xFC, + 0x4B, 0x2E, 0x55, 0x1A, 0x4F, 0x37, 0x0C, 0x3A, 0xD3, 0x47, 0x8D, 0x4D, + 0x84, 0x5A, 0xC0, 0x52, 0xF3, 0x62, 0xAF, 0x51, 0x71, 0x5E, 0x68, 0x4B, + 0xC4, 0x55, 0x77, 0x40, 0x45, 0x4C, 0x90, 0x3E, 0xBD, 0x3B, 0x59, 0x42, + 0x06, 0x28, 0xFA, 0x39, 0x55, 0x16, 0x67, 0x29, 0x67, 0x0C, 0x22, 0x18, + 0x9E, 0x05, 0xEF, 0x09, 0xD1, 0xFE, 0xCC, 0x03, 0xA5, 0xF6, 0x49, 0x01, + 0x42, 0xE7, 0x4A, 0x0C, 0xF2, 0xE0, 0xB7, 0x16, 0x3E, 0xEB, 0x64, 0x10, + 0xD3, 0xF6, 0x50, 0x0A, 0xDF, 0xFD, 0x7C, 0x05, 0x3D, 0x01, 0x13, 0xFD, + 0x7E, 0xFB, 0xE8, 0xEF, 0x3F, 0xF6, 0xEC, 0xE9, 0xA9, 0xEB, 0xB4, 0xEA, + 0xC5, 0xE3, 0xDE, 0xE8, 0x67, 0xEC, 0x5B, 0xE6, 0x77, 0xEC, 0x2C, 0xE3, + 0x67, 0xE1, 0x8C, 0xD8, 0x43, 0xE1, 0x5B, 0xC8, 0x2F, 0xE4, 0x2F, 0xC9, + 0x52, 0xD8, 0x2C, 0xD4, 0x94, 0xD1, 0x88, 0xDA, 0x57, 0xDD, 0x0F, 0xE3, + 0x02, 0xF1, 0xC3, 0xE8, 0x3E, 0x0A, 0xA7, 0xEC, 0xF4, 0x21, 0xEE, 0xFB, + 0x1E, 0x28, 0xC1, 0x10, 0x97, 0x14, 0xAA, 0x1E, 0xC4, 0x01, 0xA1, 0x1D, + 0xDC, 0x09, 0x36, 0x16, 0x4F, 0x0A, 0x1D, 0x19, 0x6F, 0xF6, 0xAC, 0x1B, + 0x4E, 0xF0, 0x67, 0x14, 0xAC, 0x01, 0x51, 0x10, 0x4B, 0x16, 0x90, 0x12, + 0x30, 0x22, 0xB7, 0x1D, 0x90, 0x2B, 0x9C, 0x36, 0x7C, 0x37, 0x01, 0x47, + 0x05, 0x49, 0x55, 0x47, 0x45, 0x5E, 0xF5, 0x45, 0x4E, 0x64, 0x75, 0x41, + 0x55, 0x49, 0x40, 0x3A, 0x98, 0x1D, 0x87, 0x28, 0xCB, 0xFC, 0x96, 0x08, + 0xE0, 0xE4, 0x75, 0xED, 0xA0, 0xD3, 0x1E, 0xDE, 0x32, 0xD6, 0xC0, 0xDF, + 0xE8, 0xEB, 0xE9, 0xEE, 0x3E, 0x04, 0xE0, 0x03, 0x92, 0x15, 0x12, 0x23, + 0x85, 0x21, 0x97, 0x42, 0x5A, 0x33, 0x24, 0x58, 0x48, 0x4C, 0xE2, 0x5E, + 0x5C, 0x5E, 0x56, 0x5A, 0x34, 0x61, 0x81, 0x4F, 0xA8, 0x5A, 0xD1, 0x3B, + 0xFA, 0x4E, 0x8C, 0x25, 0x3A, 0x33, 0xC5, 0x09, 0x66, 0x0F, 0x8B, 0xE9, + 0x54, 0xF1, 0x54, 0xD2, 0xEE, 0xD9, 0x2B, 0xC6, 0xD3, 0xC3, 0x68, 0xBB, + 0xDF, 0xB8, 0xF8, 0xB4, 0x15, 0xC0, 0x25, 0xBD, 0xB5, 0xBE, 0xD9, 0xC9, + 0x1E, 0xBD, 0x70, 0xD6, 0xCF, 0xD2, 0x96, 0xE7, 0xA7, 0xED, 0x98, 0xFC, + 0x0D, 0xFE, 0xF0, 0x0E, 0xCD, 0x0D, 0x15, 0x20, 0x55, 0x1D, 0xEF, 0x2E, + 0x1A, 0x1C, 0x07, 0x35, 0x1D, 0x17, 0xF6, 0x32, 0x2A, 0x17, 0x8C, 0x23, + 0x3A, 0x09, 0x33, 0x0F, 0x32, 0xED, 0x8E, 0x03, 0x4D, 0xD5, 0x8E, 0xF8, + 0xF5, 0xC6, 0xBC, 0xE9, 0xF2, 0xBE, 0x22, 0xDC, 0xCB, 0xB9, 0x6F, 0xCD, + 0x7B, 0xB3, 0x47, 0xC6, 0x17, 0xB2, 0x12, 0xC9, 0x8C, 0xBC, 0x9B, 0xC8, + 0x79, 0xD0, 0x60, 0xC7, 0x66, 0xDE, 0x67, 0xC8, 0xD4, 0xE0, 0xB7, 0xD2, + 0xBF, 0xDE, 0xC2, 0xDC, 0x7E, 0xE6, 0xCA, 0xD9, 0x86, 0xF5, 0x8E, 0xD2, + 0x0D, 0xF1, 0xF8, 0xCC, 0xAD, 0xD6, 0x96, 0xC7, 0xC1, 0xBF, 0x52, 0xC3, + 0xAF, 0xBA, 0xD8, 0xC0, 0x8E, 0xC1, 0x42, 0xC0, 0xD4, 0xC7, 0xC2, 0xC3, + 0x10, 0xC8, 0x2C, 0xC2, 0xE3, 0xC8, 0x49, 0xC4, 0x7A, 0xCB, 0xA0, 0xD0, + 0x93, 0xD4, 0x80, 0xD7, 0xC1, 0xE5, 0xE7, 0xE0, 0x5B, 0xEF, 0x56, 0xEE, + 0x21, 0x01, 0x6C, 0xF1, 0x98, 0x1D, 0x6F, 0xF2, 0xCC, 0x22, 0x4D, 0xF4, + 0x36, 0x16, 0xE8, 0xF6, 0x95, 0x01, 0xB6, 0xFA, 0xF3, 0xF6, 0x12, 0x06, + 0x9F, 0xFB, 0xF3, 0x0F, 0x99, 0xF6, 0x68, 0x0C, 0x5B, 0xF2, 0x91, 0x03, + 0xBF, 0xF3, 0xCD, 0xFF, 0xEF, 0xF4, 0x16, 0x06, 0x91, 0xFE, 0xC5, 0x0D, + 0x7C, 0x11, 0x49, 0x1A, 0x7B, 0x22, 0xAD, 0x2C, 0x24, 0x2E, 0xCB, 0x39, + 0xCB, 0x35, 0x0A, 0x3A, 0xAE, 0x36, 0xEF, 0x28, 0xA4, 0x29, 0xCD, 0x0C, + 0x2C, 0x07, 0xCF, 0xF5, 0x11, 0xDC, 0x5D, 0xE8, 0x21, 0xBD, 0x9A, 0xE0, + 0x8B, 0xB6, 0x5E, 0xDB, 0xC3, 0xC2, 0x41, 0xD9, 0xCF, 0xD7, 0x90, 0xE4, + 0x64, 0xF3, 0x39, 0xFE, 0x1D, 0x12, 0x66, 0x1F, 0x11, 0x2B, 0x51, 0x40, + 0x89, 0x40, 0x9F, 0x58, 0xE4, 0x57, 0x31, 0x61, 0xE6, 0x63, 0x14, 0x5C, + 0x94, 0x65, 0x9E, 0x58, 0xA5, 0x65, 0x0A, 0x56, 0x19, 0x59, 0xC3, 0x52, + 0x93, 0x36, 0x0D, 0x4C, 0x8A, 0x11, 0xFB, 0x38, 0x9D, 0x05, 0xF8, 0x1D, + 0xFF, 0x03, 0x72, 0x03, 0x02, 0xF4, 0x6E, 0xF4, 0x04, 0xE1, 0xD7, 0xED, + 0xC9, 0xE2, 0x87, 0xED, 0x32, 0xEE, 0xE5, 0xFA, 0xB6, 0xF2, 0x4E, 0x0D, + 0x5E, 0x04, 0x1B, 0x20, 0x5C, 0x24, 0x48, 0x35, 0xDE, 0x3D, 0x9B, 0x46, + 0xBA, 0x50, 0x0D, 0x4B, 0xF9, 0x60, 0xF3, 0x4D, 0x32, 0x62, 0x38, 0x56, + 0x11, 0x56, 0x9E, 0x5B, 0x37, 0x52, 0x1A, 0x59, 0xA4, 0x4E, 0xAE, 0x49, + 0x1E, 0x3E, 0x13, 0x36, 0x52, 0x31, 0xE1, 0x20, 0xB3, 0x29, 0x50, 0x09, + 0xC0, 0x15, 0x9C, 0xFE, 0x93, 0xFC, 0xA4, 0xF8, 0x09, 0xF6, 0x9B, 0xED, + 0xB4, 0xF6, 0x9E, 0xEC, 0xDD, 0xEE, 0x6C, 0xF3, 0x96, 0xE8, 0xC8, 0xF5, + 0x61, 0xEB, 0x76, 0xF5, 0xE8, 0xF7, 0x8B, 0xF5, 0x73, 0x04, 0xDE, 0xF3, + 0x89, 0x08, 0x9B, 0xF7, 0x77, 0x00, 0xDF, 0xF5, 0x68, 0xF3, 0x2F, 0xEE, + 0xBC, 0xF0, 0xC6, 0xE9, 0x54, 0xF4, 0x1A, 0xE0, 0xD5, 0xED, 0x69, 0xDF, + 0x95, 0xDB, 0x02, 0xE9, 0x4F, 0xCD, 0x35, 0xED, 0x26, 0xC4, 0x11, 0xE6, + 0x62, 0xC6, 0x7F, 0xD9, 0x66, 0xD1, 0x5A, 0xD9, 0xC3, 0xD8, 0xEC, 0xDD, + 0x31, 0xEA, 0xA4, 0xE2, 0x41, 0xF7, 0xD6, 0xEE, 0xAD, 0xF7, 0x67, 0xF8, + 0x33, 0x01, 0xA3, 0xFB, 0x08, 0x09, 0x68, 0xFE, 0x6C, 0x00, 0x1D, 0xFB, + 0xC7, 0xEF, 0xC0, 0xF1, 0x63, 0xE1, 0x38, 0xEF, 0xC6, 0xD6, 0x0D, 0xEF, + 0xE4, 0xCE, 0xB6, 0xF2, 0xAE, 0xCA, 0x76, 0xFA, 0x12, 0xCF, 0x71, 0xFE, + 0x34, 0xD4, 0x80, 0x02, 0x88, 0xD8, 0x40, 0x05, 0x72, 0xEA, 0x11, 0x05, + 0x3B, 0x01, 0xD9, 0x08, 0x12, 0x19, 0x01, 0x0F, 0x7B, 0x29, 0x72, 0x0B, + 0x36, 0x27, 0xA9, 0xF8, 0x70, 0x1B, 0xD0, 0xDD, 0x6C, 0x00, 0xEF, 0xC4, + 0xE4, 0xDF, 0xAF, 0xB7, 0x4A, 0xC7, 0x46, 0xA9, 0x4F, 0xB4, 0x56, 0x9E, + 0x37, 0xA7, 0x83, 0xA5, 0x79, 0xA2, 0x2C, 0xB1, 0x3A, 0xBA, 0xC8, 0xC3, + 0x76, 0xE8, 0xB1, 0xDF, 0xC7, 0x0D, 0xF5, 0xFB, 0x13, 0x25, 0x31, 0x1A, + 0x70, 0x39, 0xFE, 0x33, 0x64, 0x48, 0x29, 0x41, 0x8C, 0x46, 0x5B, 0x42, + 0x88, 0x3C, 0xA9, 0x33, 0x3B, 0x31, 0x07, 0x1B, 0xE1, 0x18, 0x5A, 0x02, + 0xD1, 0xFC, 0x1C, 0xEA, 0x1B, 0xE6, 0x7A, 0xD4, 0x01, 0xCE, 0x04, 0xC6, + 0xB8, 0xB7, 0x68, 0xBD, 0x7E, 0xAE, 0x32, 0xB6, 0xD3, 0xBC, 0x8B, 0xB6, + 0x4F, 0xD1, 0x8B, 0xBE, 0x92, 0xD8, 0x42, 0xCF, 0xE0, 0xE4, 0x7E, 0xEC, + 0x1C, 0x04, 0x8F, 0x10, 0x14, 0x1F, 0x38, 0x36, 0xD9, 0x2F, 0x04, 0x4F, + 0xEC, 0x3F, 0x34, 0x59, 0x91, 0x3D, 0xD2, 0x5E, 0x0B, 0x2E, 0x7C, 0x56, + 0xF4, 0x2D, 0xDF, 0x40, 0x16, 0x30, 0x60, 0x2B, 0x88, 0x21, 0x27, 0x1A, + 0xAC, 0x02, 0x34, 0x08, 0xDC, 0xEA, 0xA8, 0xF0, 0x62, 0xE5, 0xC3, 0xDF, + 0xF1, 0xDC, 0x91, 0xDC, 0x53, 0xD5, 0x24, 0xDD, 0x5D, 0xD7, 0x78, 0xDA, + 0x1C, 0xD6, 0x8F, 0xD5, 0x7C, 0xD9, 0xF4, 0xCA, 0x4A, 0xEA, 0x7C, 0xC2, + 0xE9, 0xF4, 0xCC, 0xC7, 0xFB, 0xF7, 0x1B, 0xD6, 0xE4, 0xFD, 0xE1, 0xE4, + 0xC4, 0x02, 0x26, 0xF0, 0x79, 0x00, 0x66, 0xFD, 0xF9, 0xEF, 0xB0, 0x05, + 0x38, 0xE1, 0xFA, 0xFA, 0x6C, 0xE7, 0x85, 0xE9, 0x92, 0xF0, 0x42, 0xDF, + 0xE8, 0xF1, 0x27, 0xDF, 0x8E, 0xE0, 0x26, 0xE5, 0xB9, 0xCC, 0x8F, 0xEA, + 0xC2, 0xD1, 0xC3, 0xED, 0x01, 0xE2, 0xDE, 0xEF, 0x5A, 0xF1, 0x02, 0xED, + 0x7C, 0xF9, 0xA4, 0xEB, 0xB9, 0xF3, 0x8E, 0xF5, 0x25, 0xF0, 0xC1, 0xFF, + 0x55, 0x00, 0xF4, 0x03, 0x74, 0x11, 0x82, 0x05, 0x6E, 0x13, 0xA8, 0x04, + 0x47, 0x11, 0xCA, 0x02, 0x66, 0x0B, 0x89, 0x05, 0xC4, 0xFA, 0xB8, 0x0C, + 0xB8, 0xE7, 0x27, 0x0D, 0x3C, 0xE9, 0xEE, 0x03, 0x4D, 0xFF, 0x8F, 0x02, + 0xA2, 0x0B, 0x8A, 0x0A, 0x7E, 0x0F, 0xE7, 0x0C, 0x86, 0x1F, 0xAE, 0x11, + 0xD7, 0x33, 0xA6, 0x21, 0xC7, 0x3F, 0x6C, 0x2B, 0xC1, 0x41, 0xF0, 0x27, + 0x4A, 0x38, 0xBC, 0x16, 0x7E, 0x1C, 0x6C, 0xF8, 0xE6, 0xF4, 0x47, 0xDA, + 0x45, 0xD7, 0x4B, 0xC5, 0x99, 0xCA, 0x8B, 0xC0, 0x4C, 0xC6, 0x27, 0xCF, + 0x35, 0xC7, 0xF3, 0xE8, 0xEF, 0xD0, 0xFF, 0x04, 0xE4, 0xE5, 0x9F, 0x25, + 0xD6, 0x08, 0x33, 0x44, 0x23, 0x35, 0x76, 0x52, 0x2E, 0x59, 0x80, 0x5C, + 0x29, 0x5C, 0x87, 0x63, 0x5D, 0x48, 0x1B, 0x5D, 0x42, 0x40, 0x2E, 0x54, + 0x7C, 0x40, 0x47, 0x45, 0xCE, 0x31, 0x06, 0x2A, 0x00, 0x19, 0x81, 0x0A, + 0xD4, 0x00, 0xD0, 0xEC, 0xEB, 0xE8, 0xF4, 0xD5, 0x1C, 0xD1, 0xD4, 0xC4, + 0x34, 0xC4, 0xE4, 0xC0, 0x93, 0xC3, 0xEF, 0xCD, 0x30, 0xC4, 0x45, 0xD8, + 0x43, 0xD2, 0xD9, 0xE0, 0xEA, 0xF3, 0x62, 0xF2, 0xAE, 0x10, 0x46, 0x0C, + 0x5C, 0x1C, 0xC2, 0x31, 0x2F, 0x2A, 0x85, 0x54, 0xFE, 0x46, 0xCB, 0x61, + 0xA5, 0x5C, 0xED, 0x61, 0x32, 0x5D, 0x0A, 0x59, 0x6E, 0x57, 0x27, 0x4C, + 0x63, 0x51, 0x64, 0x46, 0xCE, 0x44, 0xFA, 0x38, 0xA1, 0x2D, 0x9F, 0x24, + 0xAF, 0x10, 0xB8, 0x15, 0xA9, 0xFC, 0xA7, 0x01, 0x36, 0xF2, 0xB1, 0xE8, + 0x93, 0xF4, 0xD0, 0xD7, 0x35, 0x01, 0xB3, 0xCE, 0x08, 0xFE, 0x17, 0xDB, + 0x1A, 0xEC, 0xA0, 0xF8, 0xBF, 0xE5, 0xA4, 0x08, 0x45, 0xED, 0x4A, 0x13, + 0xCF, 0xFB, 0x07, 0x1C, 0x45, 0x0F, 0x63, 0x1A, 0xB9, 0x1A, 0x93, 0x18, + 0x77, 0x22, 0xFE, 0x15, 0x98, 0x20, 0x4F, 0x14, 0x2A, 0x0E, 0xBA, 0x15, + 0x19, 0x00, 0x54, 0x11, 0x78, 0xF8, 0xC6, 0x05, 0xE9, 0xFB, 0x50, 0xF6, + 0x66, 0x04, 0xA9, 0xE0, 0x79, 0xFA, 0xF4, 0xD0, 0x32, 0xE7, 0x5A, 0xCC, + 0x2A, 0xD8, 0xC2, 0xCB, 0xBB, 0xD5, 0xCE, 0xD2, 0xFD, 0xE3, 0xF4, 0xDC, + 0x1B, 0xF3, 0x91, 0xE6, 0x80, 0xF4, 0x3A, 0xEC, 0xAA, 0xF8, 0xCD, 0xE9, + 0x7A, 0x02, 0xA1, 0xE7, 0xC8, 0xF8, 0x8C, 0xE6, 0xE7, 0xEF, 0xA9, 0xE4, + 0x8F, 0xF2, 0xAD, 0xE0, 0x3E, 0xE7, 0x57, 0xDC, 0x7B, 0xD3, 0x7F, 0xDE, + 0x3B, 0xC5, 0xA6, 0xE6, 0xAB, 0xC2, 0xF5, 0xEE, 0x3B, 0xC5, 0xE4, 0xF6, + 0x59, 0xCE, 0x0D, 0xFE, 0x60, 0xE7, 0xD5, 0xFF, 0x51, 0xFB, 0x9E, 0x02, + 0xF0, 0xFF, 0x39, 0x02, 0x06, 0x04, 0x2E, 0xF4, 0x87, 0x01, 0x0F, 0xE3, + 0x1F, 0xE7, 0xAE, 0xD5, 0x34, 0xC5, 0x1A, 0xCA, 0x74, 0xAE, 0x32, 0xB8, + 0xC9, 0xA1, 0xB4, 0xA2, 0xF5, 0x9E, 0xEA, 0x9C, 0x88, 0xA8, 0x24, 0xA9, + 0x74, 0xBF, 0xF3, 0xBF, 0xF1, 0xD8, 0xCE, 0xE0, 0xB0, 0xEC, 0xCA, 0x09, + 0xE0, 0x09, 0xDB, 0x28, 0xA0, 0x2F, 0xC0, 0x3B, 0xE4, 0x48, 0xEE, 0x47, + 0x35, 0x55, 0xFF, 0x41, 0x92, 0x57, 0xE4, 0x31, 0x2E, 0x4B, 0xCC, 0x22, + 0x90, 0x30, 0x91, 0x0C, 0x0A, 0x17, 0xCE, 0xF2, 0xE2, 0x08, 0x84, 0xDF, + 0x24, 0xF0, 0xAB, 0xD3, 0x18, 0xC8, 0x4D, 0xCD, 0x84, 0xB6, 0x45, 0xCB, + 0xCB, 0xBD, 0x82, 0xCB, 0x08, 0xCB, 0x61, 0xCE, 0xFA, 0xDF, 0xE7, 0xD7, + 0x01, 0xF6, 0x24, 0xEE, 0x3D, 0x0A, 0x8B, 0x07, 0x6A, 0x1F, 0xA9, 0x18, + 0xC2, 0x2E, 0x03, 0x29, 0x4C, 0x3C, 0xBA, 0x3B, 0x9A, 0x4A, 0x93, 0x49, + 0xC1, 0x4D, 0xD2, 0x48, 0x4A, 0x4C, 0xEA, 0x37, 0xE6, 0x49, 0x78, 0x22, + 0xBE, 0x35, 0x86, 0x11, 0xEA, 0x13, 0x45, 0x01, 0x38, 0xFC, 0xA5, 0xF6, + 0x8D, 0xF0, 0x11, 0xEC, 0xCF, 0xE4, 0x9E, 0xDA, 0x16, 0xDB, 0xAB, 0xD3, + 0x3F, 0xD3, 0x54, 0xD7, 0x21, 0xCE, 0x29, 0xDC, 0x68, 0xCF, 0x49, 0xE8, + 0xDA, 0xD8, 0x6A, 0xF7, 0x94, 0xEA, 0xB3, 0x02, 0xFA, 0xFB, 0xED, 0x0F, + 0x42, 0x0C, 0x64, 0x1B, 0xE6, 0x16, 0x6E, 0x20, 0x98, 0x15, 0x7F, 0x20, + 0x47, 0x17, 0x49, 0x1F, 0x2F, 0x16, 0xC7, 0x1C, 0x18, 0x12, 0x5C, 0x16, + 0x22, 0x18, 0xFD, 0x14, 0x51, 0x1F, 0xD1, 0x16, 0x52, 0x1C, 0xB9, 0x0F, + 0xB1, 0x0D, 0xD5, 0x07, 0xCC, 0xF9, 0x46, 0x0B, 0x14, 0xE6, 0x18, 0x11, + 0x5B, 0xDD, 0x3A, 0x1A, 0xBD, 0xE6, 0xDD, 0x24, 0x0D, 0xFE, 0x66, 0x21, + 0xD1, 0x16, 0x80, 0x1B, 0x22, 0x25, 0x5A, 0x17, 0x5F, 0x29, 0xF6, 0x0F, + 0x5C, 0x1B, 0x5A, 0x0A, 0x17, 0x0A, 0x37, 0x0C, 0x88, 0x11, 0x3A, 0x19, + 0x07, 0x1E, 0x89, 0x25, 0x51, 0x21, 0xB2, 0x23, 0x4B, 0x1D, 0xC6, 0x1A, + 0xB5, 0x14, 0x81, 0x17, 0x85, 0x11, 0x85, 0x19, 0xEB, 0x1D, 0x63, 0x24, + 0xCD, 0x39, 0x1D, 0x33, 0x78, 0x50, 0x48, 0x3D, 0x03, 0x4D, 0xE2, 0x40, + 0x13, 0x46, 0x5A, 0x32, 0x19, 0x4B, 0x84, 0x17, 0x40, 0x45, 0x8D, 0xFB, + 0x9F, 0x2C, 0x6E, 0xE3, 0xD8, 0x0B, 0x70, 0xD8, 0xCA, 0xEB, 0x82, 0xDA, + 0x3A, 0xD9, 0x1E, 0xE1, 0xF1, 0xE0, 0x66, 0xEC, 0xAD, 0xF9, 0x2E, 0x02, + 0x33, 0x15, 0x5C, 0x1B, 0xA0, 0x2C, 0x5F, 0x34, 0x96, 0x44, 0x08, 0x4C, + 0x27, 0x5B, 0x16, 0x5D, 0x55, 0x60, 0x50, 0x63, 0x60, 0x5D, 0x82, 0x5E, + 0x4C, 0x61, 0x2E, 0x51, 0x85, 0x5C, 0xA7, 0x3C, 0x66, 0x3F, 0x66, 0x29, + 0x78, 0x18, 0xF1, 0x15, 0xE0, 0xF8, 0x2A, 0xFD, 0x1D, 0xE4, 0x72, 0xE2, + 0xB4, 0xD9, 0x3C, 0xC6, 0xBC, 0xD0, 0x8D, 0xB4, 0x71, 0xC1, 0xDE, 0xB5, + 0xB6, 0xB4, 0x81, 0xC4, 0x3D, 0xBC, 0x79, 0xD6, 0x25, 0xD8, 0x90, 0xEC, + 0xB8, 0xF3, 0x12, 0x06, 0x76, 0x06, 0x28, 0x15, 0xD1, 0x1C, 0xE8, 0x1E, + 0xCD, 0x35, 0x83, 0x2B, 0x7E, 0x4D, 0xF9, 0x30, 0x7F, 0x5B, 0xE4, 0x35, + 0xF7, 0x53, 0x2E, 0x3F, 0x7A, 0x3B, 0x33, 0x3D, 0xCB, 0x1D, 0x76, 0x2F, + 0x68, 0x05, 0x0A, 0x18, 0x04, 0xF1, 0x74, 0xF7, 0xD0, 0xE1, 0x21, 0xDE, + 0x80, 0xDA, 0x2C, 0xD3, 0x6A, 0xD0, 0x23, 0xCC, 0x86, 0xC3, 0x67, 0xC5, + 0xB8, 0xBF, 0x03, 0xBF, 0xF8, 0xC1, 0x4F, 0xB8, 0xBD, 0xC5, 0xEA, 0xBD, + 0x92, 0xD9, 0x44, 0xCC, 0x87, 0xF1, 0xF8, 0xD9, 0xA2, 0xFA, 0xE7, 0xE7, + 0x51, 0x00, 0x80, 0xEF, 0x80, 0x02, 0x81, 0xF3, 0xAA, 0xFE, 0x22, 0xF5, + 0x1A, 0xF6, 0xD4, 0xEB, 0xC5, 0xE9, 0x72, 0xDF, 0x74, 0xE0, 0x25, 0xD6, + 0x72, 0xDA, 0x62, 0xD1, 0xA2, 0xD6, 0xA4, 0xCA, 0x91, 0xD9, 0x51, 0xBF, + 0xB5, 0xDC, 0xEE, 0xC0, 0x83, 0xD3, 0x46, 0xC5, 0x9C, 0xC9, 0x4C, 0xCA, + 0x3A, 0xCB, 0x8E, 0xD5, 0x15, 0xD0, 0xB1, 0xDB, 0xD3, 0xD6, 0xE9, 0xDA, + 0x54, 0xDA, 0xFA, 0xD6, 0x59, 0xDE, 0x82, 0xD3, 0x24, 0xE7, 0xD4, 0xCB, + 0xC1, 0xEC, 0x2F, 0xC6, 0x28, 0xF1, 0x7B, 0xCB, 0x47, 0xEE, 0x34, 0xD4, + 0x1F, 0xDB, 0x96, 0xDA, 0xA3, 0xCE, 0xFA, 0xE2, 0x45, 0xD3, 0x48, 0xF4, + 0xCD, 0xD0, 0xD4, 0x05, 0x3E, 0xCE, 0xA1, 0x11, 0xEE, 0xE2, 0x87, 0x19, + 0xBE, 0x0C, 0xB9, 0x1C, 0xDE, 0x28, 0x2F, 0x1B, 0x45, 0x22, 0xF0, 0x11, + 0xB0, 0x0B, 0xCA, 0x01, 0x45, 0xEE, 0xBC, 0xEF, 0x16, 0xD4, 0xA3, 0xDB, + 0x93, 0xC6, 0xE7, 0xC8, 0xC9, 0xBE, 0x11, 0xBE, 0xBD, 0xB9, 0x19, 0xC2, + 0x05, 0xC2, 0xDD, 0xD0, 0xC4, 0xE4, 0xFB, 0xE4, 0x06, 0x13, 0x8B, 0x00, + 0x81, 0x2F, 0xBD, 0x22, 0x54, 0x3D, 0xA5, 0x46, 0x4F, 0x4D, 0x7E, 0x5E, + 0x4E, 0x53, 0xAB, 0x64, 0x0E, 0x4E, 0xC7, 0x5F, 0x6C, 0x4E, 0x1C, 0x4F, + 0xE8, 0x4B, 0xFA, 0x32, 0x05, 0x37, 0x8B, 0x16, 0x86, 0x1A, 0x03, 0xFD, + 0xCA, 0xFF, 0xDD, 0xE4, 0xFD, 0xE4, 0xBA, 0xCF, 0xE9, 0xCE, 0x07, 0xBF, + 0xD9, 0xC5, 0xFB, 0xB6, 0x04, 0xC4, 0xC0, 0xB8, 0x9B, 0xBB, 0xF9, 0xC3, + 0x21, 0xB8, 0xD2, 0xD4, 0xDB, 0xCA, 0xA8, 0xE6, 0xF3, 0xE8, 0xA8, 0xFA, + 0xC1, 0x04, 0x1E, 0x0E, 0x79, 0x1D, 0x52, 0x24, 0xCD, 0x32, 0x7F, 0x38, + 0x02, 0x40, 0x63, 0x41, 0x55, 0x48, 0xF6, 0x41, 0x7B, 0x49, 0x7A, 0x40, + 0x52, 0x42, 0xD8, 0x33, 0x11, 0x39, 0xEE, 0x1A, 0x51, 0x2B, 0xA3, 0x0B, + 0xE9, 0x1E, 0x4A, 0x02, 0x19, 0x18, 0xE5, 0xF1, 0x2E, 0x0B, 0x98, 0xE4, + 0x6C, 0xF7, 0x3A, 0xDE, 0xA5, 0xE8, 0x47, 0xDE, 0x49, 0xE2, 0xBD, 0xE5, + 0x91, 0xE3, 0x22, 0xEA, 0x85, 0xEA, 0xFC, 0xEB, 0xEC, 0xFA, 0x24, 0xF0, + 0x85, 0x06, 0x61, 0xFA, 0x57, 0xF7, 0xFB, 0x0B, 0xF6, 0xEB, 0xBC, 0x18, + 0xED, 0xFD, 0xEE, 0x18, 0x28, 0x09, 0xD0, 0x15, 0x92, 0x00, 0x50, 0x11, + 0x52, 0xF9, 0x8E, 0x09, 0xBA, 0xF1, 0x6C, 0x02, 0x68, 0xE5, 0x34, 0xFC, + 0x91, 0xD8, 0x48, 0xF4, 0x84, 0xCD, 0x7B, 0xEF, 0xFD, 0xC6, 0x06, 0xF2, + 0x74, 0xC4, 0xFC, 0xF0, 0xBE, 0xD1, 0xB6, 0xE3, 0x97, 0xE9, 0x0C, 0xD9, + 0xF7, 0xF1, 0x1E, 0xDB, 0x90, 0xF5, 0xBB, 0xDD, 0xDD, 0xFD, 0x8C, 0xE1, + 0x2A, 0xFD, 0x3E, 0xEA, 0x44, 0xF9, 0x96, 0xEC, 0x2A, 0xF7, 0xCF, 0xEA, + 0x9F, 0xF7, 0xB3, 0xE7, 0x46, 0xFD, 0x1F, 0xE7, 0x5F, 0xF7, 0x2C, 0xF1, + 0x3A, 0xEB, 0xA8, 0x01, 0xB1, 0xEB, 0xAB, 0x12, 0x79, 0xF6, 0xD4, 0x1B, + 0x19, 0x0E, 0xE2, 0x19, 0xB0, 0x29, 0xC9, 0x19, 0x1B, 0x35, 0xCC, 0x25, + 0xFB, 0x31, 0xA5, 0x2C, 0xBE, 0x2E, 0x10, 0x24, 0xF5, 0x2E, 0x47, 0x15, + 0x8D, 0x2B, 0xD0, 0x06, 0x15, 0x1F, 0x15, 0xFB, 0x95, 0x0C, 0x58, 0xF0, + 0xBA, 0x01, 0xAB, 0xE8, 0xD2, 0xF8, 0x1D, 0xEB, 0x72, 0xF2, 0xE4, 0xF7, + 0xBE, 0xFA, 0x32, 0x0E, 0x62, 0x0A, 0x7B, 0x2A, 0x32, 0x23, 0x38, 0x42, + 0xAA, 0x46, 0x08, 0x53, 0x86, 0x5E, 0xEF, 0x5E, 0x92, 0x5E, 0xF2, 0x60, + 0x65, 0x56, 0x2A, 0x5D, 0x28, 0x4F, 0x9E, 0x56, 0x60, 0x43, 0xC2, 0x47, + 0x4A, 0x36, 0x32, 0x33, 0x39, 0x2D, 0x3F, 0x1C, 0x1A, 0x1F, 0x54, 0x03, + 0xFF, 0x07, 0xE4, 0xEB, 0xC2, 0xF7, 0xCA, 0xD8, 0x20, 0xF3, 0x5B, 0xCB, + 0x5C, 0xEE, 0x82, 0xC7, 0x83, 0xE6, 0xFF, 0xCE, 0xEC, 0xE0, 0x36, 0xDE, + 0xE6, 0xE2, 0x57, 0xF2, 0x05, 0xF3, 0xD1, 0x00, 0x42, 0x0B, 0x89, 0x09, + 0x78, 0x1D, 0x04, 0x17, 0xC9, 0x29, 0xC5, 0x24, 0x5E, 0x2B, 0xB3, 0x2F, + 0x92, 0x24, 0x1A, 0x2D, 0x4A, 0x1E, 0xC6, 0x21, 0x7E, 0x10, 0x2B, 0x1A, + 0x58, 0xFC, 0x89, 0x0D, 0xA0, 0xF1, 0xD8, 0xFD, 0xD2, 0xED, 0x9F, 0xF3, + 0x1B, 0xE5, 0x9F, 0xE9, 0x5B, 0xD6, 0xDC, 0xE0, 0xCC, 0xC6, 0x48, 0xDE, + 0x67, 0xBD, 0xFB, 0xD9, 0xF0, 0xB9, 0xFD, 0xD4, 0xF7, 0xB0, 0x15, 0xD5, + 0xC5, 0xA6, 0x7F, 0xD8, 0x96, 0xAB, 0x0B, 0xE2, 0x72, 0xC2, 0xBC, 0xE7, + 0x4B, 0xD4, 0x4C, 0xE3, 0x4B, 0xD1, 0x5B, 0xDC, 0x3E, 0xD3, 0x3C, 0xD3, + 0x64, 0xDE, 0xD2, 0xCB, 0x43, 0xE4, 0x29, 0xC6, 0xA3, 0xE9, 0xA0, 0xC2, + 0x7D, 0xE1, 0x1C, 0xCB, 0x1B, 0xC9, 0xC7, 0xD3, 0x81, 0xBF, 0x53, 0xCA, + 0xE1, 0xCA, 0x6F, 0xB9, 0x9D, 0xD8, 0x29, 0xAD, 0x9F, 0xDA, 0x4A, 0xA8, + 0x74, 0xD2, 0xEB, 0xAD, 0x6D, 0xD3, 0xFD, 0xB8, 0x64, 0xD9, 0xA3, 0xC4, + 0x73, 0xD5, 0x3A, 0xCE, 0x39, 0xD7, 0x73, 0xD3, 0xC0, 0xDF, 0x03, 0xD9, + 0x3F, 0xE3, 0x81, 0xDB, 0x54, 0xEB, 0xCD, 0xD7, 0xE1, 0xF0, 0xD7, 0xD9, + 0x4B, 0xE9, 0x84, 0xE2, 0xB9, 0xE4, 0x6A, 0xE4, 0x44, 0xE9, 0xF1, 0xE4, + 0x32, 0xF1, 0x8B, 0xEA, 0xDA, 0xF5, 0x43, 0xF5, 0x52, 0xFA, 0x56, 0x00, + 0x92, 0x03, 0x95, 0x06, 0x56, 0x0F, 0x6A, 0x0B, 0x11, 0x18, 0xE6, 0x0D, + 0x0B, 0x16, 0x16, 0x0D, 0x61, 0x0A, 0x81, 0x09, 0x1B, 0x01, 0x44, 0xFE, + 0xC2, 0xFF, 0x81, 0xEF, 0x5F, 0xFE, 0x77, 0xEC, 0x92, 0xF8, 0x25, 0xF0, + 0xCC, 0xEF, 0x1A, 0xF5, 0xAC, 0xEA, 0xBA, 0x03, 0x0E, 0xF2, 0x23, 0x12, + 0x2F, 0x04, 0x96, 0x1C, 0xF7, 0x14, 0xDD, 0x2B, 0x94, 0x20, 0x27, 0x3C, + 0x94, 0x29, 0x8E, 0x4A, 0x8D, 0x2E, 0xD1, 0x52, 0x56, 0x2D, 0xF2, 0x4F, + 0x59, 0x2D, 0xE9, 0x47, 0x3F, 0x33, 0x18, 0x3C, 0xED, 0x37, 0x7C, 0x2A, + 0x6A, 0x3B, 0xA4, 0x1A, 0xC6, 0x3A, 0x0A, 0x0E, 0xC4, 0x2C, 0x52, 0x00, + 0xA2, 0x13, 0x1A, 0xFD, 0x9F, 0x02, 0x30, 0x0D, 0x95, 0x04, 0xA8, 0x1E, + 0x9D, 0x10, 0xDD, 0x28, 0x28, 0x22, 0xC3, 0x30, 0xFB, 0x29, 0x3D, 0x38, + 0x5F, 0x24, 0xA5, 0x38, 0x50, 0x25, 0xFA, 0x34, 0x05, 0x30, 0xCD, 0x39, + 0x78, 0x39, 0xD5, 0x3D, 0xEA, 0x3E, 0xC2, 0x3F, 0x19, 0x44, 0xFF, 0x46, + 0xE6, 0x49, 0xF5, 0x47, 0xA8, 0x4C, 0x5D, 0x3B, 0x52, 0x48, 0xF6, 0x2B, + 0xBB, 0x3B, 0x1A, 0x23, 0x4D, 0x28, 0x70, 0x20, 0x33, 0x19, 0x22, 0x22, + 0x47, 0x18, 0x2E, 0x1D, 0x53, 0x1B, 0xEE, 0x14, 0x83, 0x1C, 0x4E, 0x12, + 0xAF, 0x25, 0x0C, 0x0E, 0x69, 0x29, 0x43, 0x0A, 0x60, 0x1B, 0x8C, 0x09, + 0x37, 0x0B, 0xDA, 0x06, 0x98, 0x02, 0x0E, 0x04, 0x2B, 0x03, 0xF0, 0xFF, + 0xBB, 0x0C, 0x0D, 0xFB, 0x61, 0x18, 0x47, 0xFA, 0xBA, 0x16, 0xF7, 0xF9, + 0x5D, 0x04, 0x36, 0xFD, 0xDE, 0xFB, 0x65, 0xFE, 0x97, 0x05, 0x4A, 0xFB, + 0xE9, 0x02, 0xD9, 0xFB, 0x14, 0xEE, 0xC5, 0xF9, 0xA8, 0xE1, 0x53, 0xF4, + 0xB2, 0xDA, 0x16, 0xEE, 0xF6, 0xD5, 0x38, 0xE6, 0x3D, 0xDE, 0xEE, 0xE3, + 0x6B, 0xE7, 0x61, 0xEB, 0x96, 0xE4, 0x9E, 0xF3, 0x2D, 0xDF, 0x28, 0xF4, + 0x29, 0xE3, 0xE3, 0xEF, 0xEC, 0xED, 0x83, 0xEA, 0x79, 0xF0, 0xB9, 0xEC, + 0x99, 0xEE, 0x9F, 0xF3, 0xBF, 0xEC, 0xD3, 0xF9, 0x35, 0xE5, 0x24, 0x02, + 0x83, 0xE8, 0xB8, 0x03, 0xBB, 0xF8, 0x36, 0xFF, 0xCA, 0x03, 0x3C, 0xFC, + 0x48, 0x07, 0xAB, 0xFB, 0xD3, 0x01, 0xA6, 0xFD, 0x9F, 0xF5, 0x1D, 0x03, + 0x80, 0xED, 0x07, 0x0B, 0xB4, 0xED, 0xFD, 0x13, 0xC3, 0xF6, 0xBC, 0x17, + 0xD2, 0x00, 0x7E, 0x12, 0x0D, 0x07, 0x44, 0x09, 0x5D, 0x0C, 0x0F, 0x00, + 0x66, 0x07, 0x6D, 0xFC, 0x93, 0xF8, 0xD3, 0xFC, 0x98, 0xF1, 0x3D, 0xFA, + 0x3D, 0xF4, 0x72, 0xF7, 0xF5, 0xF8, 0xE4, 0xF7, 0x48, 0x01, 0x59, 0xF9, + 0xC3, 0x0A, 0x27, 0xFC, 0xA8, 0x10, 0xCC, 0x01, 0x2E, 0x19, 0x5E, 0x01, + 0xE2, 0x1D, 0x30, 0x03, 0xC8, 0x10, 0x99, 0x0D, 0xD9, 0xFF, 0x1E, 0x11, + 0x30, 0xFF, 0x48, 0x07, 0x32, 0x06, 0x37, 0xF5, 0xA9, 0x08, 0x7C, 0xE6, + 0x0E, 0x03, 0xE5, 0xE3, 0x40, 0xF5, 0x13, 0xE9, 0xAA, 0xE8, 0xF4, 0xEF, + 0xB2, 0xE9, 0x9F, 0xF4, 0x5D, 0xF7, 0x8F, 0xF0, 0x1A, 0xFE, 0x7A, 0xEB, + 0x86, 0xF8, 0xF2, 0xEE, 0x95, 0xF3, 0x5D, 0xF3, 0x78, 0xEC, 0xC9, 0xF3, + 0xAC, 0xE5, 0x87, 0xF6, 0x43, 0xEB, 0xFC, 0xFC, 0xD9, 0xFA, 0x97, 0xFA, + 0x8A, 0x0A, 0x85, 0xF0, 0x4A, 0x0F, 0x90, 0xEC, 0xCB, 0x05, 0xC4, 0xEE, + 0x40, 0xF4, 0xCD, 0xEF, 0xE1, 0xE3, 0x8F, 0xF2, 0x92, 0xDF, 0x28, 0xF8, + 0x01, 0xEC, 0x6D, 0xF7, 0x07, 0xF6, 0x66, 0xF8, 0xC2, 0xEF, 0x48, 0xFC, + 0x68, 0xEA, 0x4F, 0xF9, 0x7B, 0xEC, 0x28, 0xF7, 0x56, 0xED, 0x92, 0xF8, + 0x0E, 0xE8, 0x8D, 0xFD, 0x78, 0xDC, 0x48, 0x01, 0x8A, 0xD7, 0x94, 0xFD, + 0xA5, 0xD8, 0xFC, 0xFB, 0x38, 0xDF, 0xD5, 0xF5, 0xF5, 0xEC, 0x25, 0xE6, + 0x92, 0xF7, 0xA8, 0xD9, 0x01, 0xF8, 0xAF, 0xD4, 0x7B, 0xEC, 0x8D, 0xD3, + 0x16, 0xDF, 0xA6, 0xD8, 0x03, 0xDF, 0x6C, 0xDD, 0x24, 0xE2, 0xC3, 0xDE, + 0x56, 0xDE, 0x15, 0xE1, 0xBE, 0xE2, 0xD0, 0xE1, 0x24, 0xE4, 0x48, 0xE3, + 0x7B, 0xD2, 0x0E, 0xE3, 0x95, 0xCD, 0xC9, 0xDC, 0x3D, 0xDD, 0x14, 0xD9, + 0xFE, 0xE7, 0x12, 0xDB, 0xB7, 0xF1, 0xAC, 0xDA, 0x97, 0xF8, 0xE4, 0xDE, + 0x52, 0xF6, 0x03, 0xE9, 0x66, 0xF1, 0x1A, 0xF2, 0xBF, 0xF2, 0x6D, 0xF9, + 0x09, 0xFC, 0xBA, 0xF8, 0x40, 0xFC, 0x42, 0xFA, 0x5A, 0xF0, 0x04, 0xFF, + 0x26, 0xEE, 0xCD, 0xFC, 0x9D, 0xF9, 0x55, 0xFE, 0xC0, 0x0C, 0xBB, 0x05, + 0xFB, 0x1D, 0xF3, 0x0F, 0x57, 0x19, 0xCA, 0x1A, 0x28, 0x09, 0xA4, 0x20, + 0x0A, 0x08, 0xAC, 0x1A, 0x60, 0x13, 0x3A, 0x0B, 0x6E, 0x19, 0xC4, 0xFB, + 0xD0, 0x17, 0x78, 0xF5, 0x1E, 0x17, 0x7D, 0xFB, 0x5E, 0x1A, 0xF0, 0x04, + 0x79, 0x22, 0x59, 0x09, 0x3D, 0x29, 0xD2, 0x0A, 0x9F, 0x29, 0x19, 0x0A, + 0x2B, 0x26, 0x2E, 0x0A, 0x7A, 0x27, 0x7B, 0x0A, 0xBA, 0x2C, 0xD1, 0x0B, + 0xD5, 0x23, 0x1B, 0x17, 0xBE, 0x13, 0xF3, 0x22, 0xAC, 0x14, 0xA9, 0x27, + 0x30, 0x22, 0xF8, 0x29, 0x76, 0x28, 0xF1, 0x2A, 0x55, 0x23, 0x8A, 0x2A, + 0x89, 0x1E, 0xB9, 0x2A, 0x6F, 0x14, 0x58, 0x2B, 0xF7, 0x06, 0x6E, 0x26, + 0xD3, 0xFC, 0x78, 0x1D, 0x45, 0xEF, 0x0F, 0x18, 0x3A, 0xE8, 0x45, 0x1A, + 0x96, 0xF7, 0x86, 0x19, 0xB2, 0x14, 0x2D, 0x14, 0x42, 0x21, 0x32, 0x17, + 0x5F, 0x19, 0xF2, 0x19, 0xB0, 0x0F, 0x2F, 0x13, 0xBB, 0x06, 0x79, 0x0D, + 0xD2, 0xFD, 0x58, 0x10, 0x51, 0xFD, 0x8F, 0x13, 0x83, 0xFF, 0x68, 0x14, + 0x9E, 0x02, 0x7A, 0x10, 0x27, 0x0A, 0x22, 0x0A, 0x69, 0x10, 0x9C, 0x06, + 0xFC, 0x0F, 0x95, 0x04, 0x0B, 0x08, 0xDE, 0x06, 0x3F, 0x07, 0xA5, 0x07, + 0x09, 0x12, 0x5F, 0x05, 0x38, 0x13, 0xEF, 0x0A, 0x0E, 0x0B, 0x74, 0x10, + 0xE1, 0x01, 0x8E, 0x0F, 0x9F, 0xF9, 0xB5, 0x0D, 0xBB, 0xF9, 0x11, 0x08, + 0xB4, 0x02, 0xED, 0x03, 0x66, 0x0D, 0x70, 0x03, 0x2E, 0x10, 0x58, 0xFD, + 0x6F, 0x08, 0xD8, 0xF4, 0xC6, 0x03, 0x6B, 0xF1, 0x89, 0x08, 0xFD, 0xF4, + 0xAC, 0x0A, 0xDA, 0xFA, 0x8B, 0x06, 0xE4, 0xFD, 0x48, 0x00, 0xB2, 0x04, + 0xA5, 0xFC, 0xDD, 0x0D, 0x86, 0x00, 0x81, 0x0C, 0xC1, 0x05, 0x45, 0x04, + 0xFF, 0x06, 0xAA, 0x02, 0x0C, 0x0A, 0x8D, 0x04, 0x42, 0x06, 0xFE, 0x04, + 0x74, 0xFD, 0x42, 0x05, 0x48, 0xFE, 0xAE, 0x04, 0xE5, 0xFF, 0x86, 0x03, + 0x9C, 0x03, 0x05, 0x00, 0x1C, 0x0F, 0xBA, 0xFB, 0x8E, 0x13, 0x15, 0xF6, + 0x6D, 0x09, 0x72, 0xEF, 0xEC, 0xF8, 0xB9, 0xF3, 0x63, 0xEF, 0x9B, 0xFD, + 0x0D, 0xF3, 0x61, 0xFF, 0x2E, 0xFF, 0xC4, 0xF7, 0x6E, 0x08, 0x10, 0xF2, + 0xB6, 0x07, 0x18, 0xF7, 0x7D, 0xFE, 0x73, 0x02, 0x4C, 0xF9, 0x7C, 0x09, + 0xCE, 0xFA, 0x9A, 0x04, 0xE7, 0xF8, 0xD8, 0xF6, 0x8A, 0xF6, 0x30, 0xEC, + 0x80, 0xF3, 0xBE, 0xEA, 0x31, 0xE9, 0x92, 0xEB, 0x02, 0xE9, 0x27, 0xE9, + 0xEB, 0xF1, 0x75, 0xE7, 0x58, 0xEB, 0xB3, 0xE8, 0xE6, 0xDF, 0x2F, 0xEB, + 0x8B, 0xE1, 0xC0, 0xEE, 0x59, 0xE8, 0xBA, 0xF2, 0xDA, 0xE7, 0x79, 0xF2, + 0x8D, 0xE1, 0xDB, 0xF4, 0x64, 0xDD, 0xAD, 0xFC, 0x3E, 0xDA, 0x35, 0xFC, + 0xCB, 0xDA, 0xD9, 0xF3, 0x42, 0xDE, 0x9F, 0xE7, 0x6C, 0xDD, 0x01, 0xDD, + 0x19, 0xDD, 0x1F, 0xD9, 0xA5, 0xDE, 0x91, 0xD6, 0x3F, 0xDF, 0xEA, 0xD5, + 0x0E, 0xDA, 0xA5, 0xDD, 0xC0, 0xD4, 0x1D, 0xE3, 0x33, 0xDE, 0x0C, 0xE0, + 0x7F, 0xEF, 0x10, 0xDC, 0xC7, 0xF6, 0xB0, 0xD8, 0x0C, 0xF6, 0x88, 0xD4, + 0x65, 0xF5, 0x80, 0xD7, 0x10, 0xF5, 0x76, 0xE5, 0xA5, 0xF7, 0x8E, 0xF0, + 0x45, 0x00, 0x66, 0xF0, 0x8E, 0x05, 0xC0, 0xF1, 0xFD, 0x01, 0xC2, 0xF3, + 0xBD, 0x02, 0x96, 0xEC, 0x4C, 0x06, 0x3B, 0xEB, 0x68, 0xFB, 0x9E, 0xF5, + 0x9D, 0xF2, 0x50, 0xFF, 0xED, 0xF9, 0xB4, 0x03, 0x5C, 0x01, 0xE8, 0xFE, + 0x01, 0x06, 0x9B, 0xF5, 0xAE, 0x08, 0xB5, 0xF3, 0xBB, 0x06, 0x3F, 0xF4, + 0xCB, 0xFE, 0xDC, 0xF0, 0x00, 0xF3, 0x1E, 0xED, 0x58, 0xEC, 0xED, 0xEA, + 0x51, 0xE8, 0x4F, 0xED, 0xD6, 0xE2, 0x06, 0xEE, 0x93, 0xE1, 0xF0, 0xE7, + 0x59, 0xE1, 0x1A, 0xE8, 0x85, 0xDD, 0xCF, 0xEC, 0x63, 0xDC, 0x56, 0xEE, + 0x62, 0xE1, 0x0D, 0xF1, 0xFE, 0xE6, 0x66, 0xF3, 0xBD, 0xE6, 0x01, 0xF4, + 0x1E, 0xE4, 0x27, 0xF5, 0x11, 0xEA, 0x0B, 0xF4, 0x1E, 0xEE, 0xFC, 0xF3, + 0x8C, 0xE6, 0xF2, 0xF9, 0x3A, 0xE0, 0x1C, 0x03, 0x00, 0xE4, 0xC5, 0x0B, + 0x37, 0xF8, 0x86, 0x0C, 0x96, 0x0F, 0x52, 0x00, 0x94, 0x0C, 0xBF, 0xFA, + 0xD5, 0x00, 0x03, 0xFF, 0x09, 0x01, 0x81, 0x00, 0x2F, 0x04, 0x6B, 0x07, + 0x87, 0x0F, 0x2D, 0x15, 0x3C, 0x1F, 0x64, 0x1F, 0x12, 0x22, 0x3C, 0x22, + 0xED, 0x1A, 0x38, 0x1E, 0xB4, 0x1A, 0x95, 0x17, 0x09, 0x23, 0x17, 0x1A, + 0x97, 0x23, 0xD6, 0x26, 0x35, 0x1F, 0x61, 0x2E, 0xCB, 0x23, 0xFF, 0x2B, + 0xF9, 0x2A, 0x1C, 0x28, 0x48, 0x2A, 0xBB, 0x26, 0xF3, 0x29, 0x83, 0x29, + 0x20, 0x32, 0x43, 0x2E, 0x87, 0x38, 0xD2, 0x2E, 0x9F, 0x37, 0xF7, 0x29, + 0x46, 0x34, 0x24, 0x26, 0xF4, 0x31, 0xC7, 0x27, 0x3A, 0x32, 0xD6, 0x2A, + 0x2A, 0x2F, 0x92, 0x2A, 0x20, 0x2D, 0xB3, 0x27, 0x6C, 0x33, 0xCE, 0x27, + 0xDA, 0x2D, 0x9A, 0x2D, 0xFD, 0x1E, 0xB7, 0x2C, 0x1D, 0x27, 0x64, 0x26, + 0xC5, 0x38, 0x32, 0x20, 0x6D, 0x3B, 0x9A, 0x16, 0xA9, 0x39, 0x8D, 0x0C, + 0xA0, 0x31, 0x71, 0x0D, 0x2E, 0x21, 0x5F, 0x12, 0xFC, 0x19, 0x6A, 0x11, + 0x63, 0x1B, 0xB1, 0x10, 0x37, 0x11, 0x4D, 0x0B, 0xB7, 0xFF, 0x40, 0x07, + 0xC0, 0xF2, 0xDC, 0x06, 0x52, 0xEE, 0xFC, 0xFF, 0x47, 0xED, 0xE5, 0xFA, + 0x2F, 0xE8, 0x1A, 0xF9, 0x85, 0xE9, 0xE1, 0xFB, 0xC4, 0xF4, 0xA8, 0x01, + 0x77, 0xFF, 0x31, 0x07, 0xB9, 0x03, 0x3C, 0x11, 0x5B, 0x03, 0xE8, 0x15, + 0xD9, 0x04, 0x91, 0x11, 0x22, 0x09, 0x5C, 0x10, 0xFF, 0x0C, 0x0F, 0x11, + 0x57, 0x0B, 0x17, 0x0D, 0x12, 0xFC, 0xC3, 0x08, 0xD4, 0xF5, 0x99, 0x05, + 0x88, 0x07, 0xAE, 0x01, 0xDA, 0x12, 0xFC, 0xF9, 0x6D, 0x0E, 0x80, 0xF3, + 0x03, 0x0D, 0xB5, 0xF5, 0xEE, 0x09, 0xAF, 0xF8, 0xAA, 0x05, 0x5D, 0xFD, + 0xB5, 0x05, 0x89, 0x04, 0xC3, 0x01, 0x3E, 0x10, 0x3E, 0xFB, 0x0D, 0x1B, + 0x65, 0xF3, 0xF4, 0x13, 0x05, 0xF3, 0x2B, 0x09, 0x66, 0xF8, 0x1A, 0x04, + 0x24, 0xF1, 0x02, 0xFE, 0x7F, 0xE1, 0xA5, 0xF5, 0xE7, 0xDB, 0x4D, 0xF6, + 0x40, 0xE5, 0x0C, 0xF8, 0xDB, 0xF4, 0x98, 0xEB, 0xAB, 0xFC, 0xEF, 0xE3, + 0x09, 0xFB, 0x4B, 0xEC, 0xB3, 0xF2, 0x9A, 0xF1, 0x8D, 0xED, 0x06, 0xF0, + 0x2A, 0xF5, 0x01, 0xEF, 0xA3, 0xFA, 0x4B, 0xEC, 0xCB, 0xF2, 0x91, 0xEA, + 0x7C, 0xE7, 0xF7, 0xE3, 0xF9, 0xEA, 0x50, 0xDD, 0x6B, 0xEF, 0xA5, 0xDD, + 0xFD, 0xE8, 0xC9, 0xDC, 0x61, 0xDD, 0x70, 0xDF, 0x94, 0xDB, 0x6B, 0xE7, + 0xC3, 0xEE, 0xB0, 0xE4, 0xC1, 0xFD, 0x27, 0xDD, 0xF2, 0xF7, 0x87, 0xE2, + 0xC9, 0xEF, 0x67, 0xF0, 0x63, 0xF5, 0x2B, 0xFC, 0x30, 0xFB, 0x1C, 0x01, + 0x50, 0xF6, 0x5D, 0xFE, 0xD1, 0xF5, 0x20, 0xF7, 0x9E, 0xFC, 0xE5, 0xEC, + 0x16, 0xFB, 0x66, 0xE0, 0xE2, 0xF9, 0x38, 0xD8, 0x7A, 0xFA, 0xE5, 0xD9, + 0x65, 0xF5, 0xF5, 0xE8, 0x55, 0xEC, 0xC4, 0xF8, 0x29, 0xED, 0x9A, 0x01, + 0x2B, 0xF6, 0xEF, 0x06, 0xDC, 0xFA, 0x71, 0x05, 0xE2, 0xFB, 0x26, 0xFE, + 0x3E, 0xFF, 0xA8, 0xFA, 0x33, 0x02, 0xA6, 0x01, 0x43, 0xF3, 0x80, 0x07, + 0x60, 0xE3, 0x69, 0x0C, 0x55, 0xE4, 0x48, 0x0E, 0x08, 0xF4, 0x76, 0x09, + 0x5A, 0xFF, 0x0C, 0x01, 0x4E, 0x00, 0xA5, 0xF7, 0x57, 0x05, 0x59, 0xF7, + 0xF9, 0xFC, 0x61, 0xFB, 0xAF, 0xE8, 0xC0, 0xF9, 0xC6, 0xE2, 0x39, 0xF9, + 0xDE, 0xE8, 0xA8, 0xF9, 0x3A, 0xF4, 0xEA, 0xF3, 0xEB, 0xFC, 0xF9, 0xEB, + 0xE7, 0xF5, 0x49, 0xE7, 0x7A, 0xE6, 0x90, 0xEC, 0xF4, 0xDE, 0x61, 0xF6, + 0x66, 0xE5, 0xC2, 0xF9, 0x1D, 0xE8, 0xC1, 0xF0, 0x99, 0xEA, 0x62, 0xE5, + 0x03, 0xF8, 0xBA, 0xDE, 0x95, 0x00, 0xD3, 0xD6, 0x5B, 0xFC, 0x76, 0xD4, + 0x6E, 0xEF, 0xC8, 0xDF, 0xEC, 0xE4, 0xAC, 0xEC, 0xDD, 0xE8, 0x6B, 0xF2, + 0x63, 0xF9, 0x63, 0xF8, 0x45, 0xFF, 0x76, 0xF4, 0x41, 0xF9, 0x02, 0xE7, + 0xF0, 0xED, 0x98, 0xE4, 0xF5, 0xDC, 0x76, 0xE9, 0x17, 0xD7, 0x9D, 0xEE, + 0x19, 0xDE, 0x68, 0xFA, 0xB0, 0xE6, 0xA2, 0x06, 0xDA, 0xF1, 0x20, 0x07, + 0x48, 0xFE, 0x9B, 0xFB, 0xD1, 0x04, 0xD0, 0xED, 0x45, 0xFB, 0xAD, 0xE8, + 0xB7, 0xED, 0x0E, 0xED, 0xA9, 0xF0, 0x33, 0xF0, 0x4D, 0xF8, 0x82, 0xEA, + 0xBB, 0x00, 0x60, 0xE1, 0x68, 0x06, 0x98, 0xDE, 0x39, 0x06, 0x99, 0xEA, + 0xDE, 0x02, 0x10, 0xF5, 0x37, 0xFE, 0x60, 0xF4, 0xD3, 0xFD, 0x9F, 0xF5, + 0x4D, 0xFE, 0x61, 0xF8, 0xAC, 0xFF, 0x79, 0xFC, 0xDA, 0x05, 0x1E, 0x0A, + 0x66, 0x0A, 0xEC, 0x0E, 0xB7, 0x08, 0x82, 0x0C, 0xFB, 0x07, 0xCA, 0x15, + 0xB4, 0x04, 0x51, 0x1D, 0x63, 0xFA, 0xEE, 0x20, 0xC2, 0xF7, 0xCD, 0x26, + 0xDF, 0xF7, 0x39, 0x23, 0x98, 0xF0, 0x1A, 0x1A, 0xB5, 0xF7, 0x3C, 0x15, + 0x84, 0x0C, 0x66, 0x13, 0x9A, 0x11, 0xC1, 0x15, 0x27, 0x10, 0x94, 0x15, + 0x69, 0x17, 0x39, 0x15, 0xF7, 0x18, 0xF2, 0x12, 0xEC, 0x16, 0xF4, 0x0D, + 0x71, 0x1A, 0x42, 0x0E, 0x68, 0x1B, 0x67, 0x0F, 0xE9, 0x0F, 0xFC, 0x0E, + 0xB3, 0xFA, 0x29, 0x0C, 0x89, 0xFA, 0xC1, 0x0A, 0xDC, 0x09, 0x8A, 0x0E, + 0x5B, 0x09, 0x4B, 0x0D, 0x9B, 0x12, 0x07, 0x0B, 0xDF, 0x27, 0x7D, 0x0D, + 0x87, 0x28, 0x92, 0x0D, 0x86, 0x21, 0x36, 0x14, 0x39, 0x1E, 0x55, 0x1E, + 0xB4, 0x1D, 0xE3, 0x22, 0x1C, 0x21, 0x34, 0x22, 0xF6, 0x1E, 0x4C, 0x18, + 0x98, 0x1F, 0xE5, 0x0D, 0x04, 0x1E, 0x73, 0x07, 0xA7, 0x18, 0x2B, 0x05, + 0xF1, 0x1E, 0x7B, 0x09, 0x18, 0x27, 0x08, 0x0C, 0x61, 0x24, 0x81, 0x0E, + 0x4A, 0x1D, 0xF4, 0x10, 0xF8, 0x20, 0xA2, 0x14, 0x0E, 0x21, 0x8C, 0x1A, + 0x1C, 0x17, 0x72, 0x1B, 0xA6, 0x15, 0x23, 0x1B, 0x60, 0x16, 0xBE, 0x13, + 0x15, 0x15, 0xC4, 0x07, 0x94, 0x0A, 0x83, 0x02, 0x57, 0xF5, 0xD4, 0x01, + 0x2F, 0xF3, 0xC4, 0x06, 0x5A, 0x0B, 0x31, 0x0A, 0x53, 0x1C, 0x7A, 0x04, + 0xFC, 0x1C, 0xD2, 0xFD, 0x20, 0x11, 0xD0, 0xFB, 0x13, 0xFF, 0x31, 0xF3, + 0x22, 0x01, 0x66, 0xEC, 0x23, 0x06, 0x6C, 0xEE, 0x17, 0xF5, 0xBE, 0xED, + 0x79, 0xE9, 0x72, 0xF7, 0x1B, 0xF3, 0xC4, 0xFE, 0x3F, 0x03, 0x9D, 0xF8, + 0x67, 0x05, 0x70, 0xFF, 0x32, 0xF1, 0x45, 0x04, 0xE1, 0xDD, 0x97, 0xFC, + 0x76, 0xD8, 0xAF, 0xF7, 0xFF, 0xE0, 0x23, 0xF4, 0x1E, 0xF1, 0x6A, 0xF1, + 0xBC, 0xF5, 0x9D, 0xF1, 0xD0, 0xEF, 0x43, 0xF2, 0x3E, 0xED, 0x9A, 0xF3, + 0xE0, 0xF0, 0x04, 0xFD, 0xCA, 0xEF, 0xF4, 0x08, 0xBF, 0xDE, 0x00, 0x04, + 0x04, 0xCB, 0x1D, 0xF0, 0x3D, 0xC7, 0x76, 0xDF, 0x5C, 0xCA, 0x92, 0xD7, + 0xEC, 0xCA, 0x94, 0xDC, 0x76, 0xCC, 0x01, 0xF1, 0x7D, 0xC9, 0x04, 0xFD, + 0xC4, 0xD6, 0x9E, 0xFD, 0x96, 0xEF, 0x1C, 0x03, 0x58, 0xF1, 0x3E, 0xF7, + 0x02, 0xEA, 0x85, 0xE1, 0x36, 0xEC, 0xED, 0xE1, 0x12, 0xEE, 0x95, 0xED, + 0xD5, 0xED, 0x2E, 0xF2, 0x37, 0xED, 0xC6, 0xEF, 0xA3, 0xF2, 0x86, 0xE9, + 0x90, 0xF9, 0xFB, 0xDF, 0xFC, 0x00, 0xE6, 0xDA, 0xD7, 0x05, 0xF9, 0xD4, + 0x90, 0xFB, 0x76, 0xD1, 0xF3, 0xED, 0x21, 0xD9, 0x0E, 0xEC, 0x0A, 0xE2, + 0xF1, 0xF9, 0xF3, 0xF8, 0xE1, 0x04, 0x13, 0x09, 0x13, 0x08, 0x46, 0x00, + 0x99, 0x06, 0x0F, 0xF7, 0xBF, 0xFC, 0xEA, 0xF6, 0xB5, 0xED, 0x2F, 0xFA, + 0xD6, 0xE6, 0xC8, 0xFC, 0xEC, 0xEA, 0xA5, 0xF9, 0x3A, 0xE6, 0xBD, 0xE6, + 0x40, 0xF2, 0x22, 0xE0, 0xFD, 0x0D, 0x42, 0xEF, 0x90, 0x06, 0xA0, 0xF8, + 0x0C, 0xF4, 0x7F, 0x00, 0x4D, 0xF6, 0xD8, 0x0C, 0xC2, 0xF3, 0xE0, 0x05, + 0x2B, 0xF3, 0x4A, 0xF0, 0xE2, 0xFB, 0xF1, 0xDF, 0xA6, 0xFD, 0x6C, 0xDE, + 0xC7, 0xF7, 0xDF, 0xEC, 0x2D, 0xF1, 0xD3, 0xFD, 0xA4, 0xF2, 0x40, 0x06, + 0x60, 0xFD, 0x18, 0x0A, 0x66, 0x08, 0x81, 0x0B, 0xF5, 0x06, 0xCF, 0x04, + 0xC9, 0xFB, 0x1E, 0xFB, 0x61, 0xF0, 0xC1, 0xF5, 0x62, 0xF1, 0xC8, 0xFC, + 0xBE, 0xF1, 0x46, 0x07, 0xFA, 0xE7, 0x08, 0x08, 0x3F, 0xE6, 0xB6, 0x05, + 0xFB, 0xF7, 0xEC, 0x03, 0x8A, 0x04, 0x9F, 0xF7, 0xC6, 0x01, 0xF2, 0xE9, + 0xF1, 0x04, 0x9C, 0xE9, 0x99, 0x0A, 0xD0, 0xF0, 0x04, 0x0B, 0x1F, 0xF4, + 0x0F, 0x09, 0xF5, 0xF4, 0xFC, 0x08, 0xFE, 0xF9, 0x05, 0x0B, 0x2E, 0x01, + 0x5E, 0x14, 0xC4, 0x08, 0xDD, 0x20, 0x48, 0x04, 0x5E, 0x25, 0x17, 0x04, + 0x67, 0x11, 0x77, 0x14, 0x5D, 0xFA, 0x52, 0x1E, 0xA7, 0x06, 0xB5, 0x26, + 0xCC, 0x18, 0x09, 0x2A, 0xA1, 0x2B, 0x16, 0x26, 0x7E, 0x3C, 0x56, 0x28, + 0xA3, 0x2D, 0x1B, 0x2C, 0x94, 0x20, 0x1D, 0x2F, 0xAF, 0x27, 0x20, 0x2F, + 0x55, 0x32, 0xB2, 0x2B, 0xF6, 0x35, 0x7E, 0x29, 0x2D, 0x32, 0xC3, 0x27, + 0x92, 0x35, 0x09, 0x29, 0x60, 0x2F, 0x7D, 0x27, 0x9A, 0x20, 0xBF, 0x2E, + 0x1B, 0x25, 0x81, 0x38, 0xB8, 0x2E, 0x9B, 0x36, 0x1D, 0x2F, 0x80, 0x30, + 0x68, 0x2C, 0x35, 0x24, 0x70, 0x23, 0x1E, 0x19, 0xC4, 0x20, 0x1B, 0x15, + 0xA2, 0x25, 0x1C, 0x0D, 0xAD, 0x24, 0x68, 0x0A, 0x18, 0x25, 0x99, 0x12, + 0x2D, 0x26, 0x92, 0x17, 0x53, 0x1D, 0xE2, 0x1A, 0x15, 0x18, 0x57, 0x18, + 0x05, 0x18, 0x13, 0x0E, 0x1E, 0x0D, 0x0F, 0x0D, 0x18, 0x01, 0x69, 0x11, + 0x41, 0xF9, 0x6B, 0x08, 0xA5, 0xF7, 0x1B, 0x02, 0x85, 0xFF, 0xE1, 0x0B, + 0xB0, 0x04, 0xE3, 0x12, 0xE3, 0x06, 0x3D, 0x12, 0x62, 0x0A, 0x4A, 0x19, + 0x9F, 0xFE, 0xC4, 0x1D, 0xE9, 0xF3, 0x8B, 0x1B, 0x05, 0xF8, 0x1A, 0x13, + 0xC7, 0xFB, 0x28, 0x06, 0x35, 0xFE, 0xFB, 0xFD, 0x1C, 0xFB, 0xFC, 0xFA, + 0x82, 0xED, 0x98, 0xF6, 0xB1, 0xE2, 0xDB, 0xF3, 0x48, 0xF0, 0x5A, 0xFD, + 0xF5, 0x02, 0x95, 0x03, 0xC8, 0x05, 0xCC, 0x07, 0x72, 0xF7, 0x0B, 0x05, + 0xF6, 0xE8, 0xFE, 0xF5, 0x53, 0xF4, 0x30, 0xFC, 0x79, 0x04, 0x27, 0x0D, + 0xEA, 0x04, 0x83, 0x09, 0xB5, 0x0B, 0xD5, 0x05, 0xD2, 0x13, 0x2F, 0x0C, + 0x60, 0x01, 0xAB, 0x08, 0xB1, 0xEF, 0x59, 0x07, 0xFA, 0xEF, 0x2B, 0x0B, + 0xE2, 0xEC, 0xD0, 0xFB, 0xF7, 0xF6, 0x0E, 0xEE, 0x66, 0x02, 0x05, 0xEC, + 0xEC, 0xF8, 0x3F, 0xE9, 0x94, 0xEF, 0x4D, 0xE3, 0x61, 0xEB, 0x82, 0xDC, + 0x89, 0xF4, 0x6A, 0xE1, 0x6E, 0x04, 0x66, 0xE9, 0x76, 0xFD, 0x4B, 0xE7, + 0xD9, 0xE6, 0x8C, 0xE3, 0x6C, 0xDB, 0xE0, 0xE0, 0xB7, 0xE3, 0xF1, 0xE3, + 0x40, 0xF1, 0x7C, 0xE8, 0x1F, 0x01, 0xA8, 0xEC, 0x2F, 0x06, 0x50, 0xE9, + 0xA1, 0xF9, 0xF6, 0xDC, 0x3F, 0xFA, 0x6E, 0xDB, 0xE8, 0x01, 0xCE, 0xDA, + 0x9C, 0x00, 0x17, 0xDF, 0x9F, 0xFC, 0xE0, 0xED, 0x7D, 0xED, 0xE3, 0xF9, + 0x7E, 0xD6, 0xB5, 0xFF, 0x5E, 0xD7, 0x28, 0xFA, 0x2D, 0xE6, 0xA2, 0xEE, + 0x00, 0xE8, 0x7C, 0xDF, 0x40, 0xE1, 0x37, 0xC6, 0x87, 0xE4, 0xE2, 0xC7, + 0x65, 0xE8, 0xBE, 0xE5, 0xAB, 0xDB, 0x1B, 0xE9, 0xA0, 0xD5, 0xCE, 0xE3, + 0x61, 0xE5, 0x47, 0xF0, 0xC4, 0xFE, 0xF5, 0xF7, 0x3A, 0x10, 0xAD, 0xF7, + 0xF5, 0x08, 0x67, 0xF4, 0x45, 0xE9, 0xC0, 0xF4, 0x2B, 0xD7, 0x83, 0xFB, + 0x9A, 0xDF, 0x0D, 0x00, 0x22, 0xEA, 0xC0, 0x01, 0xBE, 0xEE, 0x6D, 0xF9, + 0x23, 0xF3, 0x88, 0xF3, 0x59, 0xED, 0x2B, 0x00, 0xF0, 0xE2, 0x11, 0x02, + 0x37, 0xE7, 0xB4, 0xF3, 0x3C, 0xF1, 0xD8, 0xEC, 0x22, 0x00, 0x7A, 0xEF, + 0x1F, 0x0E, 0x87, 0xFA, 0x59, 0x06, 0x66, 0x00, 0xB4, 0xFA, 0x21, 0xFB, + 0x03, 0xFF, 0x7E, 0xFF, 0x33, 0xFE, 0x45, 0x07, 0xBF, 0xF6, 0xD9, 0x07, + 0xAF, 0xFB, 0xF4, 0x08, 0x3A, 0xFE, 0xCD, 0xFF, 0x67, 0xFA, 0xF5, 0xEE, + 0x35, 0xFD, 0xA2, 0xED, 0xA5, 0x00, 0xA7, 0xEF, 0xA2, 0x00, 0xCE, 0xEE, + 0xAE, 0x02, 0xEF, 0x00, 0x3B, 0x05, 0x7F, 0x15, 0x15, 0xFF, 0x72, 0x11, + 0x56, 0xFB, 0x07, 0x02, 0xBC, 0x06, 0xC5, 0xFA, 0xF4, 0x0D, 0x31, 0xF9, + 0x4A, 0xFA, 0x77, 0xFA, 0xC0, 0xE3, 0x60, 0x06, 0x05, 0xE5, 0xCD, 0x12, + 0x1B, 0xFA, 0x90, 0x15, 0x55, 0x09, 0xBD, 0x13, 0x88, 0x08, 0x4F, 0x12, + 0x09, 0x02, 0xEE, 0x09, 0xF5, 0xFD, 0xB8, 0xFC, 0x7C, 0x05, 0x21, 0xFB, + 0x60, 0x14, 0xF2, 0xFC, 0xDB, 0x19, 0x81, 0xF9, 0xA2, 0x16, 0xA1, 0xF6, + 0x7C, 0x20, 0x71, 0xF7, 0xBC, 0x25, 0x3D, 0xF5, 0xEF, 0x12, 0xCE, 0xF0, + 0xB9, 0x02, 0x9C, 0xF2, 0x03, 0x00, 0xD1, 0xF6, 0xF7, 0x00, 0x60, 0xF2, + 0x9F, 0x00, 0x32, 0xEA, 0x80, 0xFB, 0x89, 0xED, 0xA3, 0xF7, 0x98, 0xF5, + 0x93, 0x00, 0x53, 0xFA, 0x8F, 0x0F, 0x72, 0x06, 0x9D, 0x0F, 0x04, 0x16, + 0x1E, 0x01, 0xE2, 0x1F, 0x1E, 0xF7, 0xCD, 0x26, 0x5D, 0xF1, 0x47, 0x1E, + 0xE4, 0xF4, 0x84, 0x0E, 0xDA, 0x0B, 0xE4, 0x0C, 0x60, 0x1B, 0x28, 0x0D, + 0xAD, 0x08, 0xCA, 0x0D, 0x3E, 0xED, 0x95, 0x12, 0x29, 0xE9, 0x6A, 0x17, + 0xAD, 0xF1, 0x55, 0x19, 0xF9, 0xFC, 0x19, 0x0E, 0x9D, 0x05, 0xB7, 0x02, + 0xB6, 0x02, 0xBD, 0x03, 0xE0, 0xF6, 0x28, 0x06, 0xEE, 0xEA, 0xBB, 0x08, + 0xC3, 0xEF, 0x5F, 0x11, 0x47, 0x01, 0x56, 0x13, 0x2F, 0x08, 0x9A, 0x0F, + 0x07, 0x0D, 0x38, 0x0A, 0x51, 0x17, 0x58, 0xFC, 0x8B, 0x18, 0xDA, 0xF7, + 0xD6, 0x14, 0x36, 0x01, 0xFA, 0x1B, 0xA6, 0x0B, 0x1C, 0x21, 0x67, 0x10, + 0x46, 0x19, 0x3D, 0x0C, 0x2D, 0x17, 0xF6, 0x0C, 0xF5, 0x1A, 0x86, 0x0F, + 0x43, 0x17, 0xDD, 0x0A, 0x4E, 0x15, 0xD0, 0x06, 0x76, 0x1A, 0x43, 0xFB, + 0x5A, 0x1A, 0x4E, 0xF8, 0x45, 0x0E, 0x0C, 0x0D, 0xC0, 0x0C, 0x12, 0x20, + 0x05, 0x1B, 0x28, 0x27, 0xD1, 0x26, 0x00, 0x27, 0x17, 0x32, 0xCF, 0x24, + 0x7E, 0x32, 0xE9, 0x22, 0x34, 0x22, 0xB9, 0x19, 0xFF, 0x15, 0x1A, 0x0C, + 0x37, 0x1D, 0xE8, 0x0D, 0xE0, 0x24, 0xC5, 0x18, 0x19, 0x22, 0x7B, 0x1C, + 0x08, 0x22, 0xD0, 0x23, 0x55, 0x22, 0x5F, 0x2B, 0x0B, 0x19, 0x2B, 0x24, + 0x08, 0x0D, 0xF7, 0x18, 0x36, 0x08, 0xE9, 0x12, 0x75, 0x05, 0xFA, 0x08, + 0x36, 0x04, 0xC4, 0xFD, 0x9F, 0x03, 0x3D, 0xFD, 0x16, 0xFC, 0x36, 0x04, + 0x9A, 0xF1, 0xD9, 0x06, 0x51, 0xF0, 0x95, 0x02, 0x94, 0x01, 0x23, 0x02, + 0x83, 0x01, 0x75, 0x01, 0xA8, 0xE9, 0x39, 0x03, 0x22, 0xE4, 0x4D, 0x05, + 0xBD, 0xE7, 0x6D, 0xF6, 0xC9, 0xED, 0x59, 0xEA, 0x28, 0xF7, 0x43, 0xE6, + 0x1D, 0xF5, 0x57, 0xE6, 0x18, 0xEF, 0x49, 0xF0, 0xD4, 0xEB, 0x02, 0xEC, + 0xA2, 0xEC, 0x13, 0xD8, 0x31, 0xF6, 0xE6, 0xD7, 0x9A, 0xFA, 0x79, 0xE1, + 0xE1, 0xEE, 0xAD, 0xE1, 0x84, 0xE1, 0xDD, 0xE9, 0x16, 0xD4, 0xDD, 0xF6, + 0x66, 0xD0, 0x2D, 0x02, 0xE7, 0xDC, 0x71, 0x08, 0x80, 0xE0, 0xAA, 0xFD, + 0x24, 0xDE, 0x66, 0xEF, 0xE4, 0xE3, 0x84, 0xE6, 0xE9, 0xE5, 0x7E, 0xE0, + 0x5C, 0xE0, 0x91, 0xE2, 0x58, 0xD9, 0xB0, 0xE3, 0x38, 0xD8, 0x6E, 0xE3, + 0x9B, 0xE1, 0x16, 0xE6, 0x68, 0xE9, 0xD0, 0xE7, 0x5A, 0xF0, 0x0C, 0xE4, + 0xE9, 0xFE, 0x1D, 0xD9, 0x81, 0x09, 0x80, 0xD1, 0xA0, 0xFE, 0xF4, 0xCD, + 0x19, 0xF3, 0xA5, 0xCD, 0x63, 0xF5, 0xE1, 0xD3, 0x0E, 0xEF, 0xD2, 0xDD, + 0x6E, 0xEC, 0x43, 0xE7, 0x0E, 0xFA, 0x67, 0xEF, 0x68, 0xFC, 0x67, 0xF3, + 0x69, 0xEB, 0x95, 0xEE, 0x2E, 0xDA, 0x00, 0xEE, 0xA9, 0xD5, 0x10, 0xF2, + 0x3F, 0xE1, 0x8C, 0xF0, 0x5F, 0xF2, 0xE6, 0xE8, 0x7C, 0x02, 0xBF, 0xE3, + 0x34, 0x09, 0x2F, 0xE2, 0x1A, 0xFE, 0x28, 0xEB, 0x6B, 0xF1, 0x2D, 0xF9, + 0x11, 0xF2, 0x03, 0xF5, 0x66, 0xFC, 0xC5, 0xEE, 0x31, 0xFE, 0x8A, 0xEC, + 0xFE, 0xF9, 0x7E, 0xE7, 0x96, 0xFB, 0xD2, 0xE9, 0xA3, 0xF6, 0xD6, 0xEE, + 0x4E, 0xE8, 0x1E, 0xF5, 0x4C, 0xE3, 0xA7, 0x04, 0x9D, 0xE3, 0x4E, 0x0F, + 0xC2, 0xDE, 0x51, 0x10, 0xDE, 0xEA, 0x8E, 0x0F, 0xA6, 0xFE, 0x53, 0x05, + 0x15, 0xFC, 0x83, 0xF9, 0xEA, 0xFB, 0x73, 0xF8, 0x28, 0x0A, 0xAA, 0xFF, + 0xBA, 0x05, 0x3E, 0x0A, 0x6B, 0xF4, 0x99, 0x16, 0xAB, 0xEF, 0xCA, 0x1D, + 0x93, 0xF1, 0xCD, 0x18, 0xBC, 0xF6, 0x39, 0x0C, 0xAA, 0xFF, 0x01, 0xFE, + 0xB2, 0xFF, 0x8D, 0xF7, 0x76, 0xF6, 0xDB, 0xF9, 0x1A, 0xF3, 0x3A, 0x02, + 0x0D, 0x00, 0x6D, 0x0B, 0x4A, 0x14, 0x73, 0x13, 0xE7, 0x1B, 0x5B, 0x14, + 0xED, 0x1D, 0x9E, 0x13, 0x58, 0x1F, 0xFB, 0x17, 0x89, 0x18, 0x61, 0x18, + 0x5A, 0x17, 0xDE, 0x1B, 0x6A, 0x19, 0x1B, 0x22, 0x70, 0x19, 0x62, 0x1E, + 0x33, 0x1E, 0xAA, 0x1B, 0x6D, 0x21, 0x4F, 0x1B, 0x6B, 0x25, 0xB3, 0x1C, + 0x94, 0x2B, 0xD7, 0x24, 0x67, 0x26, 0xD4, 0x23, 0x4E, 0x25, 0x2B, 0x1E, + 0x2F, 0x2D, 0x45, 0x1C, 0x90, 0x2E, 0xA3, 0x1B, 0xE3, 0x32, 0x65, 0x22, + 0x2B, 0x38, 0x14, 0x31, 0xE9, 0x32, 0x5C, 0x3B, 0x1C, 0x2F, 0x64, 0x40, + 0x3C, 0x30, 0xEA, 0x3E, 0x2E, 0x28, 0xA6, 0x31, 0x38, 0x20, 0xE7, 0x21, + 0xE8, 0x26, 0x32, 0x19, 0xD3, 0x2B, 0x5B, 0x10, 0x5F, 0x2B, 0xBD, 0x0B, + 0xCF, 0x31, 0xEC, 0x12, 0x45, 0x2C, 0x1C, 0x1A, 0x5B, 0x1D, 0x37, 0x1E, + 0x40, 0x1F, 0x21, 0x1E, 0x59, 0x29, 0xF9, 0x18, 0xA4, 0x2B, 0x8F, 0x15, + 0xDB, 0x1E, 0xAD, 0x10, 0xC2, 0x0C, 0x8E, 0x0A, 0x98, 0x10, 0xEB, 0x0D, + 0xAF, 0x16, 0xD1, 0x0F, 0x50, 0x0B, 0x19, 0x0C, 0x26, 0xFF, 0x4B, 0x12, + 0x09, 0xFB, 0x58, 0x16, 0xB0, 0xF5, 0x4F, 0x0C, 0x80, 0xEF, 0x44, 0x02, + 0xAB, 0xF0, 0x6F, 0xFF, 0xF6, 0xF1, 0x43, 0x00, 0x3C, 0xEF, 0x40, 0x04, + 0x41, 0xEF, 0x0A, 0x06, 0x23, 0xF8, 0x03, 0x04, 0xC9, 0xF7, 0xBD, 0xFB, + 0x4D, 0xF3, 0x7F, 0xEF, 0x31, 0x05, 0x21, 0xEF, 0x8F, 0x16, 0x2C, 0xF0, + 0xAA, 0x10, 0xB3, 0xEB, 0xAD, 0xF8, 0x20, 0xEE, 0xEA, 0xE8, 0x73, 0xF5, + 0x48, 0xF4, 0xE8, 0xF8, 0x22, 0x07, 0x4F, 0xFF, 0x69, 0x0E, 0x7B, 0x06, + 0x6F, 0x07, 0xFE, 0x08, 0x0F, 0xFE, 0x6B, 0x11, 0xC9, 0xF5, 0x68, 0x0F, + 0x16, 0xF3, 0x8A, 0x04, 0x53, 0xF5, 0x0B, 0x04, 0xC3, 0xEA, 0x93, 0x01, + 0x8D, 0xDC, 0xF7, 0xFD, 0x64, 0xDE, 0x77, 0xF9, 0x16, 0xE4, 0x78, 0xEF, + 0x61, 0xE9, 0x30, 0xEE, 0x4F, 0xF5, 0x11, 0xEF, 0x7F, 0x02, 0x19, 0xE9, + 0x19, 0x05, 0x6E, 0xE6, 0x5D, 0x04, 0x87, 0xE5, 0xDB, 0x02, 0x00, 0xE7, + 0x0A, 0xF9, 0x93, 0xF1, 0xD1, 0xEE, 0xE5, 0xF7, 0x8E, 0xE8, 0x48, 0xF5, + 0x68, 0xE4, 0x9D, 0xF2, 0xAA, 0xDD, 0x27, 0xEB, 0x62, 0xDD, 0x66, 0xE0, + 0x12, 0xEB, 0x50, 0xD4, 0xE3, 0xF3, 0x33, 0xCA, 0x4A, 0xF5, 0x4C, 0xCE, + 0x48, 0xF2, 0x82, 0xD9, 0x09, 0xE2, 0x07, 0xE4, 0x07, 0xD4, 0x35, 0xEB, + 0x01, 0xD2, 0xFB, 0xE9, 0xB4, 0xD6, 0x73, 0xE1, 0xA1, 0xE0, 0xED, 0xD4, + 0x18, 0xE7, 0x17, 0xC5, 0x1A, 0xE5, 0xE9, 0xC2, 0xD0, 0xE0, 0x87, 0xCC, + 0x27, 0xDD, 0xA1, 0xCE, 0xB5, 0xD4, 0xBA, 0xCF, 0x5E, 0xD0, 0x1A, 0xDC, + 0x35, 0xD8, 0x7F, 0xEA, 0x3F, 0xDF, 0x59, 0xE9, 0xC9, 0xE4, 0x70, 0xE2, + 0xCF, 0xF1, 0x07, 0xE9, 0xF1, 0xF8, 0xDE, 0xF1, 0x57, 0xEF, 0x0B, 0xF3, + 0x83, 0xEB, 0x9D, 0xFC, 0x84, 0xEF, 0x97, 0x07, 0xDD, 0xEC, 0x51, 0x07, + 0x57, 0xEB, 0xDD, 0x09, 0xCD, 0xE3, 0xE6, 0x09, 0x2E, 0xD9, 0x0E, 0xFC, + 0x42, 0xDD, 0x8A, 0xED, 0xEA, 0xE2, 0x53, 0xEA, 0xF1, 0xE4, 0x3F, 0xEC, + 0xAE, 0xF0, 0x8A, 0xF0, 0x88, 0x00, 0x81, 0xF7, 0x70, 0x05, 0x47, 0xFF, + 0x26, 0x01, 0x80, 0x05, 0xA4, 0xFF, 0x53, 0x05, 0x6B, 0xFE, 0xD7, 0x06, + 0x97, 0xFC, 0x9D, 0x02, 0xB5, 0x05, 0x74, 0xF5, 0x22, 0x0E, 0xD3, 0xEE, + 0xA7, 0x05, 0x63, 0xEF, 0x37, 0xFE, 0x19, 0xF5, 0x96, 0x01, 0xFA, 0xFD, + 0x0C, 0x05, 0x44, 0x00, 0x9A, 0x03, 0x56, 0xFB, 0x9A, 0xFD, 0xA8, 0xF4, + 0x66, 0xFF, 0xD1, 0xEE, 0x2F, 0x06, 0xF9, 0xEE, 0x1D, 0x00, 0x8F, 0xF6, + 0xF4, 0xF7, 0xDF, 0x02, 0xA2, 0xF3, 0x65, 0x12, 0x6B, 0xF6, 0xB4, 0x1C, + 0x4E, 0x03, 0xC2, 0x1A, 0x35, 0x02, 0x09, 0x10, 0xB1, 0xF9, 0xFD, 0x02, + 0x76, 0xFA, 0x59, 0xF8, 0x47, 0xFC, 0x76, 0xF3, 0xB4, 0x00, 0xB4, 0xF0, + 0x27, 0x01, 0xF4, 0xF6, 0x0F, 0xFA, 0xF8, 0x03, 0xC6, 0xF6, 0x41, 0x05, + 0x58, 0xFF, 0xA1, 0xFF, 0x6E, 0x0B, 0xFF, 0xF9, 0xD8, 0x09, 0x1B, 0xF3, + 0x77, 0xFC, 0x3D, 0xEE, 0x18, 0xF8, 0x86, 0xED, 0x92, 0xFF, 0xEB, 0xF2, + 0xE1, 0x07, 0x72, 0xFB, 0x0E, 0x15, 0xBE, 0xFA, 0x53, 0x1E, 0x14, 0xFA, + 0xD8, 0x16, 0x75, 0x00, 0xCC, 0x0E, 0xD8, 0x07, 0x39, 0x0A, 0x9D, 0x11, + 0x71, 0x05, 0xFE, 0x17, 0x87, 0x09, 0x32, 0x17, 0xBD, 0x04, 0x5D, 0x0D, + 0x56, 0xF8, 0x45, 0x02, 0xFC, 0xED, 0xD0, 0x00, 0xB2, 0xE4, 0x5F, 0x02, + 0xD1, 0xE8, 0xF7, 0x01, 0x89, 0xF4, 0x7D, 0x05, 0x2C, 0xF9, 0xE4, 0x08, + 0x09, 0xFA, 0x8F, 0x06, 0x61, 0xFF, 0xDC, 0x00, 0x7C, 0x03, 0xC1, 0xFC, + 0xEA, 0xFE, 0x73, 0xFF, 0x2B, 0xF7, 0x65, 0x05, 0xE3, 0xF2, 0xF6, 0x07, + 0x13, 0xF2, 0x9F, 0x06, 0x5E, 0xF4, 0x45, 0x06, 0xA2, 0xFB, 0xAB, 0x05, + 0xB0, 0x04, 0x19, 0x02, 0xDA, 0x0E, 0x7F, 0xF9, 0xB7, 0x1A, 0xC9, 0xF0, + 0x04, 0x1C, 0x7E, 0xF4, 0x67, 0x0D, 0x96, 0x04, 0x6A, 0x02, 0x23, 0x14, + 0x63, 0x09, 0xEC, 0x1A, 0xD5, 0x18, 0x31, 0x16, 0xD0, 0x20, 0x99, 0x0A, + 0x9E, 0x22, 0x5E, 0x07, 0x43, 0x1F, 0xAF, 0x08, 0x4A, 0x18, 0xCD, 0x01, + 0xFC, 0x19, 0xBD, 0x02, 0xC9, 0x1B, 0xA5, 0x0E, 0x9B, 0x16, 0xA9, 0x12, + 0xE7, 0x0C, 0xA3, 0x13, 0xCB, 0x0B, 0x42, 0x17, 0x11, 0x19, 0x80, 0x1A, + 0x1D, 0x25, 0x97, 0x1D, 0x1B, 0x2B, 0x26, 0x1E, 0x4E, 0x30, 0x46, 0x1D, + 0xB5, 0x31, 0x5C, 0x18, 0x37, 0x2C, 0xBA, 0x0F, 0xCB, 0x20, 0x47, 0x0F, + 0x9A, 0x1B, 0x85, 0x17, 0x1B, 0x1F, 0xBF, 0x1C, 0x55, 0x1F, 0xD2, 0x1F, + 0xF1, 0x1D, 0xF9, 0x1E, 0xBD, 0x20, 0xE2, 0x1A, 0xD6, 0x20, 0xD9, 0x18, + 0x9F, 0x1C, 0x35, 0x10, 0x2B, 0x1E, 0xA0, 0x0E, 0x81, 0x19, 0x2C, 0x16, + 0xA3, 0x09, 0x0A, 0x18, 0x6F, 0xFD, 0x98, 0x1C, 0xC2, 0xFB, 0xBD, 0x20, + 0x76, 0x07, 0x99, 0x1B, 0x68, 0x0F, 0xD4, 0x10, 0xF7, 0x10, 0x70, 0x05, + 0x09, 0x0A, 0x96, 0xFE, 0x23, 0xFA, 0xB4, 0x00, 0x19, 0xF7, 0xF5, 0x03, + 0x47, 0xF8, 0x98, 0x06, 0xAE, 0xF3, 0xCE, 0x06, 0xCA, 0xEF, 0x0C, 0xF8, + 0x2B, 0xEB, 0x46, 0xE9, 0x27, 0xE5, 0x5B, 0xE9, 0x04, 0xDF, 0xF4, 0xEB, + 0x74, 0xD8, 0x7B, 0xF1, 0xE4, 0xD1, 0x52, 0xFA, 0xED, 0xC9, 0xD1, 0xFB, + 0x2B, 0xC9, 0x8A, 0xF8, 0x3A, 0xD2, 0x67, 0xF8, 0x3C, 0xD6, 0xB7, 0xF7, + 0x82, 0xDB, 0x9C, 0xF0, 0xE4, 0xE7, 0xF9, 0xE5, 0xBC, 0xE8, 0xF3, 0xE1, + 0x3F, 0xE1, 0xD5, 0xDF, 0xC3, 0xD9, 0x91, 0xDC, 0xCF, 0xCE, 0xC7, 0xDF, + 0x43, 0xCF, 0xCB, 0xDD, 0x90, 0xDF, 0x94, 0xCE, 0xEE, 0xE7, 0xFA, 0xBE, + 0x47, 0xE5, 0xF4, 0xBA, 0x3B, 0xDE, 0x13, 0xC1, 0x95, 0xD6, 0xAD, 0xC9, + 0x59, 0xDB, 0x35, 0xD0, 0x1F, 0xEC, 0x4D, 0xD2, 0x7C, 0xF5, 0x75, 0xD3, + 0xE2, 0xEB, 0xB0, 0xD9, 0xDB, 0xDD, 0x86, 0xE2, 0xEC, 0xDC, 0x0B, 0xE7, + 0x0C, 0xE9, 0x83, 0xE6, 0x59, 0xF3, 0x79, 0xE2, 0xA2, 0xF5, 0xB3, 0xE0, + 0x44, 0xEF, 0x06, 0xE0, 0xB5, 0xE9, 0x01, 0xDC, 0x15, 0xEB, 0xAA, 0xDA, + 0x24, 0xE5, 0x4A, 0xE2, 0xF9, 0xDD, 0xA1, 0xF0, 0xF6, 0xE5, 0x6F, 0xF6, + 0x78, 0xF5, 0xA3, 0xF3, 0xDC, 0xFB, 0x3F, 0xEE, 0x2D, 0xF8, 0x50, 0xE7, + 0xCD, 0xF3, 0xEF, 0xE5, 0xF6, 0xEE, 0x56, 0xEB, 0x6C, 0xEC, 0x10, 0xF5, + 0x86, 0xE8, 0xA6, 0x00, 0x38, 0xE0, 0xAF, 0x07, 0xAB, 0xE0, 0x44, 0x07, + 0xC9, 0xEC, 0xAA, 0x02, 0xD5, 0xFC, 0xFA, 0xF6, 0xFD, 0x04, 0x1B, 0xEA, + 0xCB, 0xFB, 0xAB, 0xEA, 0x5C, 0xEF, 0xF5, 0xF0, 0x42, 0xED, 0x29, 0xF7, + 0xF6, 0xF2, 0xDB, 0x00, 0xDF, 0xFE, 0x24, 0x0A, 0xE4, 0x09, 0x61, 0x0F, + 0x23, 0x0B, 0x7A, 0x0E, 0x3F, 0x07, 0x96, 0x09, 0xCE, 0x08, 0xA9, 0x08, + 0x8E, 0x0D, 0x4F, 0x08, 0x20, 0x05, 0x0B, 0x06, 0x63, 0xFD, 0x3F, 0x08, + 0xAC, 0x0A, 0x63, 0x0D, 0xC7, 0x14, 0x13, 0x12, 0xEB, 0x13, 0xDC, 0x17, + 0x40, 0x19, 0x23, 0x1A, 0xEE, 0x25, 0x92, 0x1B, 0xF6, 0x2C, 0xFC, 0x21, + 0x06, 0x29, 0x14, 0x27, 0x3A, 0x20, 0x27, 0x2D, 0x27, 0x1F, 0xEE, 0x2F, + 0xE4, 0x26, 0xC1, 0x2D, 0xFF, 0x2E, 0x43, 0x2C, 0x86, 0x30, 0x1B, 0x26, + 0x77, 0x2C, 0x21, 0x23, 0xE2, 0x2D, 0x9D, 0x26, 0x93, 0x30, 0xE9, 0x26, + 0x00, 0x2F, 0x84, 0x29, 0xE6, 0x34, 0xAD, 0x2D, 0xBB, 0x36, 0xA6, 0x2D, + 0x60, 0x25, 0xEB, 0x2F, 0x66, 0x16, 0xC4, 0x35, 0xED, 0x15, 0xE5, 0x36, + 0x2A, 0x1F, 0x8A, 0x35, 0x2B, 0x2B, 0x73, 0x33, 0x8D, 0x34, 0x42, 0x2C, + 0x06, 0x3B, 0x3A, 0x22, 0xF8, 0x35, 0xD6, 0x18, 0xA3, 0x2C, 0x81, 0x12, + 0xDC, 0x2C, 0x7E, 0x0D, 0x1C, 0x2C, 0xFE, 0x0B, 0x44, 0x24, 0x28, 0x0F, + 0xC8, 0x26, 0xDE, 0x0B, 0xE6, 0x2D, 0x70, 0x02, 0xE7, 0x28, 0xC3, 0xFE, + 0x5D, 0x1F, 0xF1, 0x00, 0xBF, 0x17, 0xD4, 0x08, 0xD0, 0x10, 0xEB, 0x16, + 0x1B, 0x07, 0xAA, 0x21, 0x12, 0xFC, 0x7E, 0x23, 0x40, 0xF5, 0xBB, 0x21, + 0x3C, 0xF9, 0x26, 0x1F, 0x7C, 0x05, 0x19, 0x16, 0x4E, 0x0F, 0xAB, 0x0C, + 0xA8, 0x0C, 0x4B, 0x10, 0x4F, 0xFD, 0x0A, 0x18, 0x75, 0xF2, 0xF7, 0x1D, + 0x77, 0xF3, 0xE9, 0x1A, 0x09, 0xFA, 0x8B, 0x0D, 0x59, 0x05, 0x2A, 0x07, + 0xA5, 0x0C, 0x78, 0x07, 0xD0, 0x05, 0x40, 0x05, 0x51, 0xF8, 0x56, 0x01, + 0x9E, 0xF5, 0xD1, 0xFE, 0xE3, 0xFC, 0xE2, 0xFC, 0xE2, 0x05, 0x38, 0xFE, + 0xE6, 0x0B, 0xC3, 0x03, 0xA4, 0x08, 0x83, 0x08, 0xAF, 0xFF, 0x9A, 0x06, + 0xBD, 0xF8, 0x65, 0x04, 0xDA, 0xF8, 0xBF, 0x07, 0x0C, 0x05, 0xA1, 0x09, + 0x04, 0x0E, 0xBF, 0x08, 0xE5, 0x04, 0x9C, 0x03, 0xA7, 0xF7, 0xF6, 0xFF, + 0x59, 0xF2, 0x9F, 0xFD, 0xE9, 0xF1, 0xF4, 0xF2, 0x8D, 0xF3, 0xB3, 0xEC, + 0x22, 0xF8, 0xCE, 0xEA, 0xC9, 0x02, 0xDB, 0xE6, 0xAD, 0x0A, 0x87, 0xE8, + 0x57, 0x0A, 0xF0, 0xEC, 0x75, 0x0C, 0x56, 0xF0, 0xF4, 0x08, 0x84, 0xF5, + 0x65, 0xF9, 0x44, 0xFC, 0x4E, 0xE9, 0x34, 0x01, 0xF6, 0xE2, 0x1E, 0xFF, + 0x06, 0xE9, 0xBA, 0xF7, 0x9D, 0xFA, 0x95, 0xF1, 0xFF, 0x08, 0x02, 0xE7, + 0xDF, 0x0D, 0x4D, 0xDF, 0x6D, 0x05, 0x09, 0xE5, 0x45, 0xF3, 0x2E, 0xED, + 0x3F, 0xED, 0xBC, 0xF6, 0x5B, 0xF1, 0xCD, 0x03, 0xDC, 0xF2, 0xDE, 0x05, + 0x6D, 0xF0, 0x83, 0xFF, 0xD8, 0xEE, 0xF3, 0xF9, 0x85, 0xF1, 0x3B, 0xEF, + 0x0B, 0xF3, 0x86, 0xE8, 0xEA, 0xEE, 0x7C, 0xE6, 0xC8, 0xE4, 0x48, 0xE4, + 0xF9, 0xDB, 0xB2, 0xE8, 0xD9, 0xD8, 0xAF, 0xE8, 0xC9, 0xD4, 0xE1, 0xE6, + 0x94, 0xD2, 0xF7, 0xEF, 0xCE, 0xD4, 0xE5, 0xF2, 0x0D, 0xD4, 0x51, 0xE8, + 0x0F, 0xD7, 0x95, 0xDF, 0x0A, 0xDB, 0x7A, 0xDA, 0x68, 0xCE, 0xA8, 0xD8, + 0x65, 0xC3, 0xE8, 0xDB, 0xCB, 0xCB, 0x47, 0xD9, 0x49, 0xDB, 0xCE, 0xD6, + 0xA4, 0xE2, 0x79, 0xDB, 0xAF, 0xDB, 0xB5, 0xDB, 0xAC, 0xD6, 0x03, 0xDA, + 0x82, 0xDC, 0x40, 0xD5, 0x1E, 0xDF, 0x3A, 0xD0, 0x6F, 0xE4, 0xED, 0xD1, + 0xDA, 0xE8, 0x9A, 0xD5, 0xD1, 0xE2, 0xB1, 0xE0, 0x3E, 0xE7, 0x1F, 0xF0, + 0x22, 0xF7, 0x6B, 0xF6, 0xA2, 0xFB, 0x51, 0xF6, 0x4D, 0xF8, 0x53, 0xF6, + 0x24, 0xF8, 0xB0, 0xF3, 0xB9, 0xF6, 0xBF, 0xF0, 0x95, 0xF1, 0xBE, 0xF2, + 0x67, 0xEF, 0xCF, 0xF5, 0x8F, 0xF2, 0x1E, 0xF7, 0xDE, 0xF9, 0xB5, 0xFC, + 0x52, 0x07, 0x6F, 0x00, 0x10, 0x13, 0x18, 0xFA, 0x42, 0x11, 0x59, 0xF6, + 0x52, 0x0C, 0x93, 0xF8, 0x92, 0x0F, 0x58, 0xF6, 0x60, 0x11, 0xF9, 0xF3, + 0x21, 0x06, 0xFF, 0xF6, 0xB9, 0xF4, 0x42, 0xFD, 0xD7, 0xE9, 0x23, 0x09, + 0xF8, 0xEA, 0x21, 0x14, 0x58, 0xFB, 0x84, 0x18, 0xAA, 0x0C, 0xDD, 0x12, + 0x65, 0x18, 0x1B, 0x0D, 0x7C, 0x15, 0x2D, 0x0E, 0x12, 0x00, 0x5F, 0x0B, + 0x83, 0xF6, 0xC7, 0x11, 0xA8, 0x04, 0xE2, 0x1A, 0x77, 0x16, 0x9B, 0x10, + 0x76, 0x23, 0xB5, 0x01, 0x50, 0x29, 0xF5, 0xFB, 0x83, 0x21, 0xF7, 0xF6, + 0x4A, 0x17, 0x65, 0xF0, 0x8C, 0x15, 0x73, 0xEF, 0xEE, 0x12, 0xBE, 0xF6, + 0x6C, 0x12, 0x64, 0x00, 0x25, 0x16, 0xC5, 0x07, 0x22, 0x16, 0xC6, 0x10, + 0x75, 0x13, 0x63, 0x14, 0x4B, 0x11, 0xDA, 0x0C, 0xA5, 0x15, 0xA3, 0x0C, + 0x87, 0x1F, 0xE9, 0x16, 0xB3, 0x23, 0x7E, 0x1D, 0x5B, 0x1C, 0x36, 0x24, + 0xF0, 0x11, 0x59, 0x2A, 0x60, 0x0A, 0xD6, 0x28, 0xF7, 0x07, 0x85, 0x23, + 0x99, 0x0A, 0xC6, 0x21, 0xAE, 0x05, 0xA1, 0x2A, 0x4B, 0xF9, 0x9E, 0x2E, + 0x61, 0xF8, 0x4E, 0x2A, 0xBA, 0x0A, 0xA1, 0x26, 0xAF, 0x1D, 0xBF, 0x1A, + 0x27, 0x1A, 0x34, 0x15, 0x52, 0x09, 0x27, 0x1E, 0xE7, 0xFD, 0xF1, 0x27, + 0x87, 0xFA, 0x6C, 0x2B, 0x31, 0x06, 0xFD, 0x21, 0xEA, 0x14, 0xDF, 0x15, + 0x4B, 0x12, 0xF8, 0x0C, 0xB9, 0x0E, 0x43, 0x01, 0xB7, 0x12, 0x4F, 0xFE, + 0x45, 0x0B, 0x83, 0x05, 0xC5, 0xFE, 0x68, 0x09, 0x85, 0xFC, 0x8D, 0x07, + 0x7C, 0x00, 0x6D, 0xFD, 0x39, 0x0A, 0xA6, 0xEC, 0x1F, 0x0C, 0x3D, 0xE5, + 0x20, 0x04, 0x57, 0xE6, 0x89, 0x00, 0x72, 0xEA, 0x05, 0xFC, 0xED, 0xF0, + 0x15, 0xFB, 0xB0, 0xF3, 0xE0, 0xFB, 0x0A, 0xF4, 0x0E, 0xF2, 0x4E, 0xF6, + 0x03, 0xEC, 0xF0, 0xF6, 0xC8, 0xF8, 0x30, 0xF0, 0xD6, 0x0F, 0x2D, 0xEA, + 0xA7, 0x15, 0x3C, 0xEC, 0x7F, 0x05, 0x9E, 0xF0, 0xB2, 0xF8, 0xE5, 0xEC, + 0xE7, 0xF3, 0x01, 0xE9, 0xCA, 0xEE, 0x8D, 0xF1, 0xB9, 0xF2, 0x1C, 0xFC, + 0xEA, 0xFF, 0xA4, 0x05, 0x31, 0x05, 0xB3, 0x13, 0x75, 0x01, 0x78, 0x19, + 0xFE, 0x00, 0x04, 0x13, 0x39, 0xFE, 0xEB, 0x07, 0x36, 0xF8, 0xE9, 0xFC, + 0xCB, 0xFC, 0x76, 0xF8, 0x0B, 0x05, 0x9E, 0xF9, 0x04, 0x04, 0x04, 0x02, + 0x4D, 0xFE, 0x8F, 0x0C, 0xF4, 0xF8, 0x9F, 0x08, 0x75, 0xF4, 0x87, 0xFC, + 0x1A, 0xF5, 0x49, 0xF2, 0xEB, 0xF7, 0xF1, 0xE9, 0x7F, 0xF8, 0x10, 0xEA, + 0xFB, 0xF0, 0x6C, 0xEF, 0xE7, 0xE4, 0x99, 0xF4, 0xB6, 0xE8, 0xD2, 0xFA, + 0xE9, 0xFD, 0x05, 0x01, 0x0C, 0x0A, 0xCF, 0xFF, 0x4F, 0x08, 0xDD, 0xF8, + 0x7E, 0x03, 0xC3, 0xF2, 0xA0, 0xFD, 0x35, 0xEA, 0x6A, 0xFA, 0x04, 0xE8, + 0xAA, 0xF8, 0x05, 0xF2, 0x22, 0xE9, 0x6E, 0xF3, 0x96, 0xDE, 0xE2, 0xFC, + 0x8E, 0xE9, 0xB1, 0x0D, 0x0F, 0xF8, 0xFE, 0x0A, 0x2D, 0x07, 0x15, 0x09, + 0xEF, 0x0E, 0x25, 0x0C, 0xE1, 0x00, 0x1C, 0x09, 0x50, 0xED, 0x4B, 0x09, + 0xCC, 0xEB, 0xD7, 0x0C, 0xC7, 0xF7, 0x6F, 0x0E, 0x8F, 0xFE, 0xB2, 0x0B, + 0x8F, 0x01, 0x0B, 0x03, 0x61, 0x03, 0x4C, 0xF9, 0x2F, 0xFE, 0x41, 0xF3, + 0x3F, 0xFB, 0xC4, 0xF0, 0x57, 0xFC, 0x60, 0xF0, 0x7A, 0x00, 0x35, 0xEF, + 0x2B, 0x08, 0x16, 0xEA, 0x51, 0x0F, 0xD4, 0xE9, 0xC7, 0x12, 0x63, 0xF3, + 0xD6, 0x09, 0x2E, 0xFF, 0x0C, 0x02, 0x55, 0x09, 0x21, 0x0E, 0x9A, 0x0F, + 0x47, 0x1C, 0x39, 0x0E, 0xEA, 0x1E, 0x0B, 0x01, 0x45, 0x15, 0x03, 0xF9, + 0x74, 0x02, 0x10, 0xFC, 0x9F, 0x00, 0x2D, 0x01, 0x1E, 0x08, 0xC7, 0x02, + 0xC2, 0x07, 0x4E, 0x04, 0x7D, 0x0A, 0x11, 0x04, 0x15, 0x07, 0xB4, 0xF9, + 0x30, 0x01, 0x82, 0xF1, 0x68, 0x06, 0xFC, 0xEA, 0xBE, 0x05, 0xE4, 0xE7, + 0x7E, 0xF7, 0x3F, 0xEC, 0x0A, 0xEC, 0x42, 0xF4, 0x6C, 0xED, 0xF0, 0x00, + 0x39, 0xEC, 0xA4, 0x03, 0x57, 0xE4, 0x82, 0xFF, 0xD3, 0xE7, 0xA4, 0xFF, + 0x5C, 0xEB, 0x96, 0xF3, 0x21, 0xEC, 0xFE, 0xE7, 0xD1, 0xEA, 0xC9, 0xE5, + 0x1F, 0xDE, 0xC6, 0xDA, 0x90, 0xDB, 0x5B, 0xD7, 0x9B, 0xE2, 0x29, 0xE3, + 0xF7, 0xDC, 0x34, 0xEF, 0xA4, 0xDC, 0x91, 0xFD, 0x98, 0xE3, 0x15, 0x02, + 0x3D, 0xDA, 0x08, 0xFA, 0xB4, 0xD0, 0x7E, 0xF5, 0xF4, 0xD0, 0x40, 0xF0, + 0xEE, 0xCE, 0x25, 0xEF, 0x28, 0xCF, 0xEE, 0xF7, 0x78, 0xDC, 0x4B, 0xFC, + 0x46, 0xEE, 0x1F, 0x00, 0xD0, 0xF8, 0x34, 0x06, 0xF2, 0xFD, 0x68, 0x04, + 0xAC, 0x09, 0xB6, 0xFF, 0x6F, 0x11, 0xC3, 0xFB, 0xE8, 0x0F, 0xDD, 0xFE, + 0x59, 0x12, 0x82, 0x02, 0x0C, 0x13, 0xC5, 0xFD, 0x92, 0x19, 0x89, 0xFC, + 0x8F, 0x22, 0xBB, 0xFC, 0x5B, 0x28, 0xC1, 0x07, 0x31, 0x2F, 0x51, 0x1A, + 0x9E, 0x29, 0xA0, 0x19, 0x7F, 0x1A, 0x89, 0x10, 0x1E, 0x12, 0x74, 0x12, + 0xCE, 0x16, 0x39, 0x1C, 0x31, 0x21, 0xEE, 0x20, 0xF6, 0x27, 0x02, 0x22, + 0xBD, 0x24, 0xEE, 0x20, 0x6B, 0x28, 0x60, 0x2A, 0x45, 0x37, 0x4C, 0x3F, + 0x3E, 0x3A, 0x92, 0x3C, 0x40, 0x39, 0x93, 0x2D, 0xE1, 0x39, 0xEA, 0x2C, + 0xB4, 0x31, 0x8B, 0x2C, 0xB7, 0x28, 0x47, 0x28, 0xD4, 0x23, 0x8C, 0x1F, + 0xFE, 0x26, 0xEE, 0x1A, 0x89, 0x2F, 0x9E, 0x25, 0x82, 0x28, 0xA3, 0x29, + 0xDF, 0x1C, 0xEF, 0x19, 0x52, 0x1D, 0x52, 0x0C, 0x7F, 0x21, 0x93, 0x07, + 0x75, 0x25, 0x70, 0x0B, 0x38, 0x24, 0xDC, 0x20, 0x60, 0x15, 0x80, 0x2F, + 0x19, 0x05, 0x2E, 0x2A, 0x4A, 0x02, 0xB5, 0x22, 0x4B, 0x0B, 0x8D, 0x21, + 0x11, 0x0B, 0x79, 0x1D, 0x7B, 0x01, 0xB5, 0x13, 0xCD, 0xFE, 0x83, 0x11, + 0xF6, 0xF3, 0x79, 0x0F, 0x8F, 0xF2, 0x7B, 0x12, 0x7A, 0xFE, 0x91, 0x1A, + 0xBD, 0x02, 0x63, 0x18, 0x86, 0x16, 0x70, 0x17, 0xA5, 0x24, 0x11, 0x14, + 0x4A, 0x11, 0x93, 0x05, 0x2F, 0xFC, 0xC1, 0xF9, 0x26, 0xF0, 0x11, 0xF6, + 0xB5, 0xEF, 0x64, 0xF2, 0x98, 0xFF, 0xAD, 0xED, 0x43, 0x08, 0x75, 0xEF, + 0x01, 0xFE, 0xA3, 0xEE, 0x5E, 0xFA, 0x2D, 0xF1, 0x59, 0xFF, 0x76, 0xF9, + 0xFD, 0x05, 0x21, 0xFC, 0x70, 0x08, 0xD7, 0xFD, 0x60, 0xFD, 0x6C, 0xFD, + 0x93, 0xFB, 0xFB, 0x01, 0x67, 0x00, 0x42, 0x01, 0x36, 0xF9, 0x6A, 0xF0, + 0x61, 0xF4, 0xBE, 0xEB, 0xAC, 0xF3, 0x22, 0xF8, 0x7E, 0xEB, 0x79, 0xF2, + 0xE5, 0xE6, 0xBB, 0xE0, 0xFB, 0xED, 0xB1, 0xD5, 0x43, 0xF4, 0x9E, 0xC7, + 0x91, 0xF2, 0x3C, 0xC5, 0x46, 0xE4, 0x67, 0xCF, 0x0D, 0xD0, 0x64, 0xDA, + 0x13, 0xCA, 0x7E, 0xF0, 0x71, 0xD5, 0x94, 0x00, 0x2E, 0xDD, 0x3C, 0xF6, + 0x30, 0xE2, 0x06, 0xEA, 0x72, 0xF0, 0x39, 0xE4, 0xFD, 0xFC, 0xF6, 0xDB, + 0x82, 0xFE, 0xBE, 0xDD, 0xF7, 0xEF, 0xE5, 0xE5, 0x01, 0xEB, 0x1D, 0xF2, + 0x4C, 0xF4, 0xE6, 0xF7, 0xCE, 0xF7, 0x48, 0xEF, 0x3D, 0xFE, 0xAC, 0xE5, + 0x2D, 0x01, 0x5C, 0xDE, 0x0C, 0xFC, 0x46, 0xE1, 0x58, 0xFB, 0xBF, 0xEC, + 0x3D, 0xFF, 0x50, 0xF6, 0x05, 0xFC, 0x29, 0xF9, 0x26, 0xEE, 0x4C, 0xF6, + 0x70, 0xEA, 0xCD, 0xF8, 0xB3, 0xF0, 0xF2, 0xFC, 0x53, 0xF6, 0x5D, 0x01, + 0x51, 0xF0, 0x11, 0x06, 0xDD, 0xDF, 0x5B, 0x05, 0x60, 0xDD, 0xF4, 0xFD, + 0x76, 0xF1, 0x30, 0xF2, 0x56, 0x01, 0x06, 0xEC, 0xE9, 0xF7, 0x96, 0xED, + 0x84, 0xED, 0x1B, 0xF9, 0xD7, 0xEC, 0xA5, 0x06, 0x76, 0xEE, 0xBE, 0x0D, + 0x39, 0xF2, 0x4B, 0x0B, 0x11, 0xEE, 0x74, 0xFF, 0x74, 0xE9, 0x34, 0xFA, + 0x35, 0xEE, 0x86, 0xF8, 0xEC, 0xEE, 0x73, 0xF0, 0x1A, 0xE7, 0x52, 0xED, + 0xCC, 0xE1, 0x92, 0xF8, 0xD5, 0xE9, 0x2D, 0x09, 0xBD, 0xF7, 0x46, 0x07, + 0xF5, 0x07, 0x84, 0x05, 0xAB, 0x08, 0x73, 0x09, 0x83, 0xFD, 0x64, 0x06, + 0x39, 0xFB, 0xC0, 0x04, 0xFE, 0xFD, 0x8E, 0xFC, 0x5F, 0x06, 0x8E, 0xF3, + 0x41, 0x0C, 0xBC, 0xEE, 0x32, 0x06, 0xF5, 0xE5, 0x20, 0x03, 0xDC, 0xEB, + 0x4F, 0x0A, 0x65, 0xFE, 0x3A, 0x13, 0xC1, 0x01, 0x18, 0x1B, 0x77, 0x01, + 0x20, 0x13, 0xCB, 0xFB, 0x49, 0x02, 0xA2, 0xF0, 0xF1, 0xFB, 0xFF, 0xF9, + 0xFE, 0xF4, 0xCE, 0x05, 0x6A, 0xF0, 0x3A, 0xFF, 0xCA, 0xF9, 0x44, 0xFB, + 0x3E, 0x08, 0x3C, 0xFD, 0xE3, 0x09, 0xCB, 0xFF, 0xD5, 0x04, 0xAC, 0x0A, + 0x8E, 0x01, 0xB3, 0x11, 0x72, 0xF2, 0xF9, 0x0C, 0xBF, 0xEE, 0x8C, 0x11, + 0xEF, 0xF9, 0x8E, 0x15, 0xDE, 0xFC, 0x2A, 0x0B, 0x5C, 0xFC, 0xE2, 0xFC, + 0x63, 0xF7, 0xA5, 0xF0, 0x05, 0xFC, 0xB9, 0xF5, 0x9A, 0x03, 0x5E, 0xF8, + 0x75, 0xFF, 0xFF, 0xE8, 0x3F, 0xFC, 0x0D, 0xE1, 0x7D, 0xF7, 0xF4, 0xE4, + 0xC7, 0xF2, 0xB5, 0xEA, 0x53, 0xF6, 0x13, 0xEE, 0x53, 0x05, 0xCB, 0xF2, + 0xA2, 0x03, 0x39, 0xEC, 0xFA, 0xF3, 0x92, 0xE7, 0x76, 0xF2, 0x48, 0xF8, + 0x79, 0xF2, 0x9C, 0x03, 0xC0, 0xF6, 0x23, 0x04, 0x24, 0xFE, 0x8B, 0x00, + 0xEA, 0xFD, 0x61, 0xFC, 0xA8, 0xFC, 0xD3, 0xFB, 0x5B, 0xFA, 0x07, 0x00, + 0x3A, 0xF2, 0x0F, 0x06, 0x47, 0xE9, 0xB5, 0x04, 0xFD, 0xEB, 0xC4, 0xFE, + 0x72, 0xFF, 0x59, 0x06, 0x5F, 0x0D, 0xF9, 0x0A, 0x06, 0x09, 0x46, 0xFD, + 0x87, 0xFF, 0x1A, 0xF9, 0xF9, 0xF7, 0xDE, 0x02, 0x96, 0xF9, 0x02, 0x0D, + 0x0F, 0x02, 0x71, 0x14, 0x5B, 0x02, 0x86, 0x0E, 0x82, 0xF5, 0xCF, 0xFC, + 0x04, 0xF0, 0x12, 0xF7, 0x4E, 0xFA, 0xBA, 0xFF, 0x8E, 0xFF, 0x48, 0x05, + 0xEB, 0xFB, 0xEA, 0x07, 0x75, 0x00, 0xAA, 0x12, 0x39, 0x0D, 0xBF, 0x1C, + 0x19, 0x17, 0xD7, 0x14, 0xEB, 0x1F, 0x70, 0x00, 0xDD, 0x28, 0x8C, 0xF1, + 0x63, 0x2D, 0x64, 0xF5, 0xD5, 0x24, 0x94, 0x0B, 0xFC, 0x0B, 0xF6, 0x15, + 0x3E, 0xFF, 0xF5, 0x0F, 0x03, 0x11, 0x79, 0x15, 0x2D, 0x23, 0xA0, 0x16, + 0x0E, 0x28, 0xCC, 0x0C, 0x5B, 0x2C, 0x11, 0x10, 0x23, 0x2B, 0x0D, 0x14, + 0xA0, 0x23, 0x4E, 0x15, 0xE7, 0x23, 0xE4, 0x1D, 0x1F, 0x28, 0xA0, 0x21, + 0x96, 0x25, 0xB2, 0x1B, 0xA8, 0x2A, 0x5C, 0x19, 0x19, 0x32, 0xBB, 0x19, + 0x73, 0x31, 0xBC, 0x1B, 0xA1, 0x2E, 0x53, 0x1E, 0xFE, 0x29, 0x3A, 0x23, + 0x18, 0x26, 0xF4, 0x23, 0x54, 0x21, 0xBB, 0x18, 0x93, 0x1B, 0x4F, 0x14, + 0x6A, 0x17, 0x96, 0x19, 0x10, 0x13, 0x50, 0x22, 0x57, 0x09, 0xE8, 0x2A, + 0x72, 0x04, 0x7B, 0x27, 0x42, 0x0A, 0xD9, 0x1A, 0x5B, 0x0F, 0x32, 0x14, + 0x8B, 0x11, 0x43, 0x0F, 0x14, 0x12, 0x3A, 0x09, 0x74, 0x0F, 0x99, 0x07, + 0x7D, 0x0C, 0x03, 0x09, 0x8D, 0x09, 0xBA, 0x16, 0x77, 0xF8, 0x29, 0x1C, + 0xE3, 0xE5, 0xB5, 0x0D, 0xD9, 0xEA, 0x1B, 0x02, 0x1D, 0x02, 0xC6, 0xF8, + 0x23, 0x0A, 0x51, 0xEE, 0xC5, 0xF5, 0x23, 0xEB, 0x2B, 0xE1, 0xDC, 0xF2, + 0x4E, 0xD8, 0xDE, 0xFA, 0xA4, 0xD9, 0xAD, 0xFE, 0xF9, 0xDC, 0x45, 0xFD, + 0xCB, 0xD7, 0x85, 0xF5, 0xE0, 0xD7, 0xFA, 0xF0, 0x5E, 0xE0, 0x38, 0xF1, + 0xF0, 0xD8, 0xA4, 0xEA, 0x63, 0xCC, 0xFB, 0xE6, 0x9C, 0xD3, 0x99, 0xEB, + 0x28, 0xDC, 0x6F, 0xE5, 0x0F, 0xDE, 0x64, 0xD8, 0x13, 0xD8, 0x58, 0xD3, + 0xD0, 0xC7, 0xF9, 0xD7, 0xE8, 0xC3, 0x09, 0xE3, 0x70, 0xCD, 0x25, 0xE2, + 0xE1, 0xDB, 0x2B, 0xD8, 0x5E, 0xE6, 0xC1, 0xD6, 0xE7, 0xDD, 0x8D, 0xD2, + 0x83, 0xDC, 0xC7, 0xCE, 0xC7, 0xF1, 0x7D, 0xD2, 0xAD, 0x00, 0xCD, 0xD3, + 0x4D, 0xFE, 0xDF, 0xD5, 0xEE, 0xF8, 0x34, 0xD4, 0x63, 0xF9, 0x39, 0xCF, + 0xC0, 0xF8, 0xA5, 0xCF, 0xCE, 0xFB, 0x9B, 0xD1, 0xE6, 0x06, 0xE4, 0xDC, + 0x83, 0x01, 0xCF, 0xE9, 0xF0, 0xE9, 0x1D, 0xEC, 0xD0, 0xE2, 0xE9, 0xF3, + 0x09, 0xEF, 0x76, 0x01, 0x3A, 0xF4, 0x0F, 0x04, 0xBB, 0xEF, 0xF3, 0xF9, + 0xD0, 0xF0, 0x0F, 0xEC, 0xE5, 0xF8, 0x8A, 0xE5, 0x00, 0x01, 0x74, 0xEA, + 0xBA, 0x03, 0x7D, 0xF7, 0x85, 0xFF, 0xF6, 0x03, 0x1D, 0xFC, 0xD6, 0x0C, + 0x74, 0xFE, 0x2E, 0x13, 0xF2, 0xFE, 0xFF, 0x16, 0xF5, 0xF0, 0xEE, 0x09, + 0x74, 0xDC, 0xB4, 0xF0, 0x25, 0xDB, 0x96, 0xEA, 0x8F, 0xE9, 0xB5, 0xEC, + 0xD8, 0xF5, 0xD3, 0xEA, 0x20, 0xFB, 0x22, 0xF1, 0xB6, 0xF5, 0x03, 0xF6, + 0xE7, 0xEB, 0x11, 0xF2, 0x04, 0xEB, 0x0D, 0xEA, 0x21, 0xF3, 0xBE, 0xEC, + 0x2B, 0xF4, 0x67, 0xF5, 0x31, 0xEE, 0x4C, 0xF6, 0xA6, 0xE9, 0xAD, 0xF9, + 0x02, 0xED, 0x5F, 0xFF, 0x73, 0xF2, 0xF6, 0xFC, 0x0E, 0xF2, 0x51, 0xFC, + 0xC9, 0xF8, 0xE7, 0x07, 0x2B, 0xFE, 0xE4, 0x0D, 0xE8, 0xFE, 0x8C, 0x0B, + 0x25, 0x02, 0x91, 0x03, 0x64, 0x00, 0x4F, 0xFC, 0x17, 0x01, 0xFA, 0x01, + 0x64, 0x04, 0x20, 0x03, 0x7B, 0x05, 0xAE, 0x03, 0x74, 0x11, 0x23, 0x11, + 0xF3, 0x1D, 0x0E, 0x0E, 0x1D, 0x1D, 0xB7, 0x04, 0x0D, 0x24, 0x19, 0x0D, + 0x82, 0x2D, 0xDB, 0x11, 0xE5, 0x27, 0x56, 0x11, 0x6A, 0x21, 0x79, 0x16, + 0x60, 0x1F, 0x2C, 0x20, 0x2A, 0x25, 0x58, 0x2D, 0x35, 0x34, 0x18, 0x32, + 0x36, 0x3F, 0x33, 0x31, 0x37, 0x41, 0x63, 0x31, 0xE1, 0x37, 0x88, 0x30, + 0x25, 0x2F, 0x4A, 0x36, 0xD1, 0x35, 0x81, 0x3C, 0xF7, 0x36, 0xA3, 0x33, + 0x58, 0x2D, 0x86, 0x29, 0xFA, 0x27, 0xAD, 0x23, 0xDE, 0x24, 0x5B, 0x1C, + 0x1A, 0x24, 0x8E, 0x1B, 0x9C, 0x2C, 0x02, 0x1A, 0x94, 0x31, 0x1B, 0x11, + 0x98, 0x29, 0x5A, 0x06, 0xCE, 0x28, 0x36, 0x02, 0x6D, 0x29, 0xD5, 0x06, + 0xE0, 0x15, 0x64, 0x0C, 0xFB, 0xFE, 0x88, 0x16, 0xFD, 0xFC, 0x48, 0x28, + 0x40, 0x07, 0xD1, 0x2A, 0xAF, 0x0F, 0xB6, 0x1F, 0xA5, 0x12, 0xA6, 0x19, + 0x8C, 0x0D, 0x55, 0x1B, 0x96, 0x02, 0xDA, 0x1A, 0x93, 0xFB, 0x00, 0x14, + 0xFF, 0x01, 0x55, 0x11, 0xF3, 0x07, 0x33, 0x13, 0x91, 0xFE, 0x70, 0x17, + 0x6A, 0xF2, 0x8B, 0x18, 0xC4, 0xF6, 0xD0, 0x10, 0x79, 0x04, 0x35, 0x0E, + 0x8A, 0x01, 0x85, 0x0D, 0x6F, 0xFA, 0xE7, 0x0E, 0x1E, 0xFF, 0xC9, 0x14, + 0xDD, 0xF7, 0x1E, 0x0F, 0xAB, 0xEE, 0x44, 0x08, 0x9D, 0xF9, 0xE2, 0x04, + 0x77, 0x09, 0x70, 0x01, 0x9A, 0x0C, 0x7E, 0x06, 0x28, 0x0B, 0x36, 0x11, + 0x64, 0x0C, 0x08, 0x16, 0x5F, 0x0E, 0xFF, 0x0F, 0x87, 0x17, 0x8A, 0x02, + 0x83, 0x1E, 0x85, 0xF4, 0xFC, 0x11, 0xD9, 0xEE, 0x29, 0xFF, 0xB2, 0xF3, + 0x59, 0xF2, 0x15, 0xF9, 0xF4, 0xEB, 0x2A, 0xFA, 0x93, 0xEF, 0x3A, 0xF5, + 0x3B, 0xF7, 0x30, 0xEC, 0x6A, 0xFE, 0x30, 0xE3, 0x5C, 0xFE, 0x40, 0xDE, + 0xD3, 0xF7, 0x69, 0xE2, 0x81, 0xF2, 0x09, 0xEB, 0xEF, 0xEF, 0xC3, 0xF6, + 0xF7, 0xF2, 0xE9, 0xFC, 0xFE, 0xFF, 0xAE, 0xFF, 0x4E, 0x08, 0x2A, 0x07, + 0x29, 0x05, 0x99, 0x03, 0x45, 0x0B, 0x50, 0xFE, 0x2C, 0x11, 0xEB, 0xFB, + 0x12, 0x0A, 0x9B, 0xF3, 0x71, 0x01, 0x6A, 0xF6, 0x25, 0xF4, 0xD2, 0x00, + 0xBB, 0xEA, 0x1F, 0x01, 0x81, 0xEE, 0x60, 0xFB, 0x58, 0xF4, 0x3A, 0xF0, + 0x01, 0xF6, 0x95, 0xE7, 0xCA, 0xEF, 0x3A, 0xEC, 0xA0, 0xEB, 0x7C, 0xED, + 0x35, 0xF6, 0xC5, 0xEE, 0x7B, 0xFD, 0x35, 0xF5, 0xB0, 0xFC, 0x9F, 0xF1, + 0x45, 0xFB, 0xFE, 0xEF, 0x10, 0xEE, 0x97, 0xF2, 0x74, 0xD8, 0x1B, 0xEE, + 0x28, 0xCA, 0xD6, 0xEE, 0xCB, 0xCC, 0x68, 0xF5, 0x75, 0xD6, 0xA6, 0xED, + 0xCF, 0xE6, 0x92, 0xE1, 0xCE, 0xF7, 0xE0, 0xDC, 0x76, 0xF0, 0x2A, 0xD7, + 0x05, 0xE1, 0xEF, 0xDA, 0x0D, 0xE1, 0x9E, 0xE6, 0x44, 0xE3, 0xB5, 0xEA, + 0xCF, 0xE5, 0x2C, 0xE9, 0xE5, 0xEA, 0x7C, 0xE1, 0x9F, 0xE2, 0x82, 0xD8, + 0xFD, 0xD0, 0x4E, 0xD6, 0x11, 0xCB, 0x30, 0xD5, 0x67, 0xD3, 0xD6, 0xDB, + 0xF1, 0xE1, 0x8F, 0xE7, 0xDE, 0xED, 0x84, 0xEE, 0x69, 0xEA, 0x58, 0xF2, + 0xAE, 0xDE, 0x94, 0xF2, 0x30, 0xE0, 0xAC, 0xEF, 0xA0, 0xEE, 0x0B, 0xEE, + 0x12, 0xFA, 0x6A, 0xF1, 0x1E, 0xFC, 0x35, 0xF9, 0x9B, 0xF9, 0xAD, 0xFE, + 0x9E, 0xF6, 0xE1, 0xFD, 0xEC, 0xF7, 0x30, 0xF6, 0x50, 0x07, 0xD5, 0xF1, + 0xF0, 0x16, 0x27, 0xF1, 0x20, 0x11, 0x51, 0xEA, 0xFE, 0xFF, 0x95, 0xE6, + 0xFB, 0xF8, 0x5F, 0xEE, 0x72, 0xF6, 0x78, 0xF9, 0xF8, 0xF2, 0xFF, 0x00, + 0x4A, 0x00, 0x77, 0x02, 0x0A, 0x19, 0xA3, 0xFF, 0xE3, 0x20, 0x75, 0x03, + 0x51, 0x0A, 0x4A, 0x0D, 0x7D, 0xF3, 0x94, 0x19, 0x90, 0xF3, 0xDE, 0x1C, + 0x00, 0xFC, 0x99, 0x14, 0xB3, 0x03, 0x86, 0x0E, 0x84, 0x06, 0x60, 0x09, + 0xBD, 0xFD, 0x8C, 0x05, 0xE9, 0xF5, 0xBE, 0x0B, 0x08, 0xFE, 0xA3, 0x07, + 0x50, 0x10, 0xD8, 0xF7, 0xC1, 0x1D, 0x60, 0xF4, 0x44, 0x18, 0xCF, 0xF5, + 0xC3, 0x06, 0x50, 0xF6, 0xFC, 0xFE, 0xDA, 0xF7, 0xBB, 0xFD, 0xE4, 0xF0, + 0xB4, 0xFA, 0x86, 0xE9, 0x57, 0xFE, 0xF4, 0xED, 0x34, 0x05, 0x57, 0xF8, + 0x5E, 0x0B, 0x18, 0x02, 0xBE, 0x0A, 0x46, 0x01, 0x6B, 0x08, 0x56, 0xFC, + 0xAE, 0x11, 0x1B, 0xFD, 0xA0, 0x1A, 0x25, 0xFB, 0x10, 0x18, 0xE7, 0xFC, + 0x3C, 0x10, 0xD0, 0x07, 0x6C, 0x03, 0xAB, 0x15, 0x8F, 0xF2, 0xC0, 0x1B, + 0xD7, 0xF3, 0xC7, 0x16, 0x2F, 0xFF, 0x90, 0x11, 0x9D, 0xFC, 0xA7, 0x12, + 0x0A, 0xF1, 0x20, 0x13, 0x52, 0xE9, 0x8D, 0x0C, 0x9C, 0xED, 0x00, 0x06, + 0xB9, 0xF7, 0xC7, 0x0D, 0x3F, 0xF9, 0x85, 0x1D, 0x22, 0xF2, 0x92, 0x1F, + 0x64, 0xF3, 0xC0, 0x1E, 0xF6, 0x03, 0xAF, 0x22, 0x44, 0x14, 0x8F, 0x19, + 0x20, 0x13, 0x05, 0x08, 0xBE, 0x07, 0x63, 0x03, 0x99, 0x01, 0x61, 0x04, + 0xAB, 0x01, 0x95, 0x02, 0xBA, 0x06, 0x49, 0x08, 0xE0, 0x0C, 0x91, 0x09, + 0xE0, 0x15, 0x2B, 0x04, 0xD8, 0x1B, 0x68, 0x01, 0x96, 0x18, 0x0B, 0x02, + 0x11, 0x0E, 0x48, 0x05, 0x7B, 0xFF, 0x49, 0x03, 0x17, 0xFA, 0xD7, 0x00, + 0xE3, 0x05, 0x18, 0x01, 0xF9, 0x15, 0x8D, 0x00, 0x88, 0x18, 0x30, 0x02, + 0xDF, 0x16, 0xFE, 0x05, 0x87, 0x1B, 0x5F, 0x0C, 0x16, 0x1D, 0x88, 0x14, + 0xD3, 0x21, 0x60, 0x1A, 0x4A, 0x2D, 0x93, 0x1C, 0xD6, 0x2D, 0x8F, 0x1D, + 0x07, 0x1F, 0x28, 0x1F, 0x9A, 0x14, 0x03, 0x21, 0xF0, 0x1B, 0x94, 0x25, + 0xDC, 0x26, 0x0F, 0x26, 0xD7, 0x2D, 0x3E, 0x20, 0xD2, 0x2D, 0xE4, 0x1E, + 0x34, 0x22, 0x96, 0x1F, 0xA0, 0x1B, 0x55, 0x20, 0x8B, 0x1E, 0x10, 0x22, + 0x74, 0x1E, 0x78, 0x20, 0x83, 0x18, 0x21, 0x24, 0x53, 0x0E, 0xC8, 0x2C, + 0x1F, 0x0B, 0xB0, 0x2F, 0xF2, 0x0E, 0x32, 0x27, 0x43, 0x10, 0xEE, 0x10, + 0xE4, 0x12, 0x54, 0x01, 0xB1, 0x10, 0x82, 0x02, 0x63, 0x06, 0x48, 0x07, + 0x21, 0x02, 0x57, 0x0B, 0x9F, 0xFF, 0x95, 0x0E, 0x98, 0xF9, 0x46, 0x0E, + 0x7B, 0xFD, 0xB8, 0x08, 0xBD, 0x10, 0xE7, 0xFD, 0x67, 0x1A, 0x3A, 0xED, + 0xAB, 0x09, 0x77, 0xE8, 0x99, 0xF0, 0xCC, 0xF1, 0xE1, 0xE6, 0x0C, 0xF6, + 0x1A, 0xF0, 0xAB, 0xF7, 0x77, 0xFC, 0x52, 0xF2, 0x2B, 0xFF, 0xEB, 0xEB, + 0x02, 0xF7, 0xDB, 0xF3, 0xFE, 0xEE, 0xCD, 0xFF, 0x7A, 0xEA, 0x96, 0x02, + 0xFC, 0xE2, 0xA8, 0xFA, 0xD8, 0xE2, 0xF6, 0xF4, 0xD3, 0xE8, 0x89, 0xF9, + 0x63, 0xE8, 0x12, 0xFB, 0x8D, 0xE9, 0x73, 0xF4, 0xFF, 0xF0, 0x66, 0xF2, + 0x82, 0xF3, 0xC2, 0xF0, 0xE2, 0xEC, 0x1F, 0xEB, 0xAF, 0xE8, 0xB6, 0xEA, + 0x4C, 0xE8, 0x69, 0xEB, 0xCC, 0xE1, 0x82, 0xE9, 0x56, 0xDB, 0xEB, 0xE2, + 0xBD, 0xE0, 0x06, 0xD5, 0x75, 0xED, 0x77, 0xCD, 0xB7, 0xF5, 0x3D, 0xD0, + 0x88, 0xF5, 0x69, 0xD5, 0x9B, 0xEF, 0x5B, 0xDC, 0xE3, 0xEB, 0x66, 0xDF, + 0x64, 0xF0, 0x2F, 0xD8, 0xD5, 0xF6, 0x8D, 0xCB, 0xDF, 0xF7, 0xF6, 0xC3, + 0xFA, 0xF2, 0x0F, 0xCA, 0xCB, 0xEE, 0x64, 0xD6, 0xC7, 0xEF, 0xA5, 0xDC, + 0xE1, 0xEA, 0x26, 0xDD, 0x66, 0xE4, 0x34, 0xDC, 0xBF, 0xE4, 0x94, 0xD5, + 0x8C, 0xDE, 0x20, 0xCD, 0xE1, 0xD8, 0xC0, 0xCD, 0xF1, 0xDC, 0x66, 0xD1, + 0xCC, 0xDF, 0x17, 0xD7, 0x58, 0xDB, 0xFA, 0xE1, 0xCA, 0xD8, 0x7A, 0xEE, + 0x85, 0xDF, 0x30, 0xF7, 0xC8, 0xE5, 0xFD, 0xFA, 0xC5, 0xE7, 0x44, 0xFD, + 0x4E, 0xEB, 0xE3, 0xFA, 0x48, 0xE9, 0xC6, 0xF3, 0xB0, 0xDE, 0x74, 0xEE, + 0xD0, 0xD9, 0xEC, 0xEB, 0x05, 0xDF, 0x1D, 0xEC, 0xE4, 0xE5, 0xBF, 0xED, + 0x46, 0xEC, 0x9D, 0xF2, 0x2A, 0xEE, 0x50, 0xFB, 0x16, 0xEC, 0xE8, 0x04, + 0xDA, 0xEB, 0x46, 0x08, 0x4D, 0xED, 0xE6, 0x0A, 0x38, 0xEA, 0x88, 0x12, + 0x09, 0xE2, 0xA8, 0x14, 0xD5, 0xE3, 0x7B, 0x10, 0x3F, 0xF1, 0xDE, 0x0F, + 0x24, 0xFD, 0x46, 0x15, 0x94, 0xFE, 0x10, 0x1A, 0x4A, 0xF7, 0x46, 0x16, + 0xD9, 0xF9, 0x0B, 0x0D, 0x45, 0x08, 0xFB, 0x03, 0x42, 0x14, 0x1A, 0x00, + 0x8E, 0x16, 0x2B, 0xFF, 0x2E, 0x16, 0x30, 0xFF, 0xBE, 0x1D, 0xE3, 0x03, + 0x76, 0x21, 0xC7, 0x09, 0xB8, 0x1C, 0x53, 0x11, 0x08, 0x1B, 0x52, 0x1A, + 0x34, 0x1B, 0xBC, 0x20, 0x5E, 0x1A, 0x80, 0x1F, 0x80, 0x1F, 0x86, 0x19, + 0x21, 0x2D, 0xB0, 0x19, 0x83, 0x37, 0x69, 0x1C, 0xFD, 0x39, 0x18, 0x23, + 0xBC, 0x39, 0xCF, 0x2B, 0x4C, 0x39, 0xB4, 0x2B, 0x82, 0x36, 0xCB, 0x2B, + 0x71, 0x34, 0x5E, 0x30, 0x92, 0x3A, 0x3C, 0x32, 0x3C, 0x3F, 0x32, 0x35, + 0x9E, 0x38, 0x4A, 0x3C, 0x34, 0x2F, 0x6E, 0x41, 0x30, 0x2A, 0x07, 0x40, + 0x66, 0x2D, 0xB6, 0x34, 0xE9, 0x36, 0x32, 0x28, 0x46, 0x3C, 0x50, 0x21, + 0xC3, 0x3E, 0xA3, 0x1A, 0xF7, 0x3D, 0x51, 0x15, 0x31, 0x2F, 0x4E, 0x14, + 0x59, 0x1D, 0xF7, 0x15, 0x63, 0x19, 0xDB, 0x1E, 0x2D, 0x1B, 0xF4, 0x27, + 0xA2, 0x18, 0x98, 0x27, 0xAB, 0x13, 0x20, 0x28, 0x9D, 0x14, 0x94, 0x29, + 0x9F, 0x17, 0xAB, 0x25, 0x3E, 0x13, 0xB6, 0x20, 0x36, 0x0C, 0x0D, 0x11, + 0xFD, 0x03, 0x55, 0x02, 0x46, 0xFF, 0x9E, 0x08, 0x4B, 0x05, 0x40, 0x13, + 0x0E, 0x0E, 0xA3, 0x15, 0x56, 0x0E, 0x64, 0x0E, 0x46, 0x04, 0xD3, 0x05, + 0x95, 0xF9, 0x40, 0x06, 0x3D, 0xF3, 0xDB, 0x01, 0x70, 0xF1, 0x2E, 0xF9, + 0xA9, 0xF5, 0xBA, 0xFC, 0xFE, 0xFB, 0xA7, 0xFC, 0x75, 0x04, 0x52, 0xF5, + 0x41, 0x09, 0xC4, 0xFB, 0x45, 0x03, 0xFE, 0x01, 0x67, 0xFA, 0x7C, 0xFC, + 0x74, 0xF7, 0x14, 0xF9, 0x6D, 0x00, 0x4C, 0xF7, 0x63, 0x0D, 0xBE, 0xF2, + 0xF7, 0x0E, 0x03, 0xEE, 0x3E, 0x04, 0x74, 0xF2, 0xB0, 0xFC, 0xDB, 0xFD, + 0xC7, 0x02, 0x2A, 0x04, 0xB2, 0x07, 0xE3, 0x06, 0x7A, 0xFE, 0xAC, 0x05, + 0x20, 0xF5, 0x9D, 0xFF, 0x59, 0xF7, 0x09, 0xF6, 0xDB, 0x01, 0xC8, 0xE8, + 0xD8, 0x08, 0x87, 0xE3, 0x12, 0x04, 0xBD, 0xEF, 0x9C, 0xFA, 0x34, 0x04, + 0x7D, 0xFA, 0x6B, 0x15, 0x00, 0x03, 0xCD, 0x1D, 0x70, 0x08, 0x7B, 0x1A, + 0x01, 0x04, 0xB8, 0x0C, 0x25, 0xF8, 0xDF, 0x00, 0x7D, 0xF0, 0xE2, 0xFB, + 0xD7, 0xF1, 0xC3, 0xF1, 0xE7, 0xF8, 0x15, 0xEA, 0x4B, 0xF7, 0x72, 0xE8, + 0x32, 0xF0, 0x5F, 0xE3, 0x51, 0xF0, 0xC4, 0xDE, 0x95, 0xF2, 0xDF, 0xDB, + 0x48, 0xF1, 0x19, 0xDD, 0xB7, 0xEC, 0x8E, 0xE4, 0x7F, 0xE6, 0x61, 0xE7, + 0xA1, 0xE1, 0xAD, 0xE2, 0x9B, 0xE3, 0x35, 0xDE, 0xB6, 0xE0, 0x5B, 0xDB, + 0x43, 0xD5, 0x44, 0xDE, 0x1B, 0xCF, 0x64, 0xE4, 0x75, 0xD3, 0xDD, 0xEC, + 0x51, 0xDC, 0x3D, 0xF3, 0x3D, 0xDA, 0xBF, 0xEB, 0x4F, 0xD2, 0x2A, 0xE2, + 0x38, 0xD5, 0x1E, 0xE2, 0x4C, 0xDE, 0x48, 0xE4, 0x96, 0xE0, 0x79, 0xE3, + 0xE3, 0xE1, 0xD0, 0xE5, 0x39, 0xE4, 0xE4, 0xE9, 0xDF, 0xDD, 0x4C, 0xF0, + 0x1F, 0xD6, 0x56, 0xF6, 0x6C, 0xD4, 0xDE, 0xEC, 0xC8, 0xD4, 0x41, 0xE1, + 0x9D, 0xD6, 0xA1, 0xDE, 0x0D, 0xD8, 0x03, 0xE4, 0xE9, 0xDE, 0xDA, 0xF3, + 0x91, 0xEB, 0xF3, 0x03, 0x8C, 0xEC, 0x22, 0x0C, 0xBC, 0xE8, 0xB9, 0x04, + 0x1D, 0xF5, 0xA9, 0xF7, 0x79, 0x00, 0xBF, 0xF2, 0xE8, 0xFF, 0x6E, 0xF0, + 0xD0, 0xFB, 0xD5, 0xEC, 0xCD, 0xF1, 0x65, 0xEA, 0x59, 0xED, 0x6D, 0xEA, + 0x91, 0xF2, 0xD4, 0xE9, 0x17, 0xFF, 0x66, 0xE5, 0x10, 0x0C, 0x05, 0xDE, + 0x84, 0x09, 0x37, 0xDC, 0x08, 0xFA, 0x9B, 0xDD, 0x79, 0xF0, 0x60, 0xDA, + 0x57, 0xF5, 0x54, 0xDD, 0xC0, 0x00, 0x33, 0xE4, 0x9B, 0x04, 0x3D, 0xE7, + 0x74, 0x01, 0x23, 0xE9, 0x84, 0x05, 0xE5, 0xEA, 0x0E, 0x0B, 0xA0, 0xED, + 0xD0, 0x07, 0x8A, 0xF2, 0xC8, 0xFF, 0x5F, 0xF6, 0xAD, 0xF6, 0x9F, 0xFD, + 0xF0, 0xF2, 0xF5, 0x0A, 0xDA, 0xF8, 0x80, 0x0D, 0x31, 0xFE, 0x35, 0x0A, + 0x56, 0xFB, 0x31, 0x0B, 0x65, 0xF7, 0x95, 0x06, 0xB5, 0xFB, 0x26, 0x03, + 0x4C, 0xFE, 0x3B, 0x02, 0x2C, 0xFD, 0x3C, 0x05, 0x41, 0x02, 0xA9, 0x0A, + 0x82, 0x06, 0x12, 0x05, 0xA7, 0x0A, 0xEE, 0xFF, 0xBE, 0x0C, 0x2B, 0x02, + 0xD7, 0x04, 0x3F, 0x0B, 0x60, 0x01, 0xD2, 0x18, 0x24, 0x09, 0x3B, 0x1A, + 0xE2, 0x0F, 0x88, 0x0C, 0xB3, 0x14, 0x07, 0xFE, 0xFD, 0x11, 0xB7, 0xF4, + 0x47, 0x11, 0x76, 0xF6, 0x7E, 0x1D, 0xC5, 0x05, 0xAA, 0x28, 0x66, 0x18, + 0x8B, 0x2C, 0x77, 0x26, 0x61, 0x28, 0x9E, 0x32, 0xA0, 0x1F, 0xCE, 0x34, + 0xD5, 0x15, 0x5C, 0x27, 0xD6, 0x0D, 0xB8, 0x19, 0x48, 0x0E, 0x10, 0x13, + 0x6D, 0x19, 0xD2, 0x11, 0x7A, 0x1E, 0xF7, 0x15, 0x5F, 0x21, 0xCF, 0x24, + 0xE6, 0x29, 0x2C, 0x3C, 0x73, 0x28, 0x3E, 0x4A, 0x95, 0x2A, 0x48, 0x4E, + 0x6F, 0x37, 0xA5, 0x4F, 0xFF, 0x36, 0x7F, 0x49, 0xA1, 0x31, 0x32, 0x48, + 0x1B, 0x3E, 0x77, 0x58, 0xBA, 0x4E, 0xA4, 0x63, 0xF4, 0x52, 0xB9, 0x57, + 0xE5, 0x4E, 0x08, 0x46, 0x77, 0x4E, 0xC9, 0x47, 0x22, 0x45, 0x43, 0x48, + 0x9A, 0x37, 0x15, 0x3B, 0x8F, 0x30, 0xC7, 0x2E, 0x62, 0x29, 0x90, 0x25, + 0x77, 0x36, 0x27, 0x2B, 0xEC, 0x47, 0xA7, 0x2C, 0xE5, 0x3B, 0x01, 0x22, + 0xCF, 0x36, 0x14, 0x2F, 0xCD, 0x3E, 0x6C, 0x40, 0xC3, 0x35, 0x8E, 0x39, + 0x6A, 0x27, 0xBF, 0x26, 0xE4, 0x1D, 0x0F, 0x16, 0x97, 0x34, 0x71, 0x2B, + 0x7D, 0x3F, 0x1B, 0x37, 0xE1, 0x10, 0x6A, 0x07, 0xB6, 0x17, 0xA3, 0xFC, + 0x1E, 0x2E, 0xD1, 0x02, 0x6B, 0xF6, 0x1B, 0xD7, 0xFC, 0xD8, 0xAF, 0xC8, + 0x25, 0xE8, 0x9B, 0xD9, 0xD6, 0xD8, 0x8E, 0xC9, 0x11, 0xC4, 0xED, 0xB7, + 0xDB, 0xCF, 0x1A, 0xC6, 0x6F, 0xCF, 0xF7, 0xC3, 0xB0, 0xBD, 0xD6, 0xB1, + 0x97, 0xC6, 0x11, 0xC5, 0x91, 0xD4, 0x0B, 0xE3, 0x37, 0xC6, 0xE5, 0xDD, + 0x06, 0xBE, 0xCA, 0xD3, 0x9E, 0xD7, 0x21, 0xD6, 0x4A, 0xD7, 0xC6, 0xBF, + 0xDB, 0xB8, 0x6A, 0xA1, 0xF5, 0xAB, 0x3C, 0xA3, 0x40, 0xAF, 0x67, 0xB6, + 0x93, 0xA7, 0x5F, 0xAD, 0x2C, 0x9E, 0xF7, 0x9B, 0x43, 0xAE, 0xC3, 0xB0, + 0x10, 0xB1, 0x2B, 0xBB, 0x4B, 0xA2, 0x51, 0xAA, 0xCB, 0x9C, 0xE9, 0x9E, + 0xB1, 0xA8, 0xFE, 0x9E, 0x3A, 0xC2, 0x43, 0xAF, 0x6B, 0xD1, 0x9D, 0xC0, + 0xFA, 0xCB, 0x44, 0xC2, 0x06, 0xC0, 0x3A, 0xBA, 0x31, 0xB3, 0x83, 0xAD, + 0x79, 0xA2, 0xA1, 0xA3, 0x47, 0x9C, 0x42, 0xA5, 0x69, 0xA2, 0x64, 0xA8, + 0x44, 0xAD, 0x90, 0xAB, 0xDC, 0xBB, 0x5F, 0xB4, 0xCA, 0xBD, 0x2C, 0xB7, + 0x6E, 0xB4, 0xBF, 0xAF, 0xED, 0xB7, 0xDE, 0xAE, 0xEA, 0xB7, 0x5B, 0xB4, + 0x07, 0xC8, 0x7B, 0xCE, 0x8E, 0xEB, 0xB2, 0xF8, 0x40, 0xF4, 0xF3, 0x06, + 0xB5, 0xE9, 0x93, 0xF9, 0x87, 0xDF, 0xBF, 0xE8, 0x49, 0xD1, 0x9B, 0xD4, + 0x57, 0xC4, 0x52, 0xC2, 0x4D, 0xCD, 0x33, 0xC6, 0xB3, 0xE4, 0x3F, 0xD8, + 0xB3, 0x04, 0x6F, 0xF0, 0x9E, 0x18, 0x47, 0xFF, 0xE3, 0x13, 0xDD, 0xF8, + 0x4B, 0x14, 0x08, 0xF9, 0x83, 0x21, 0x15, 0x08, 0x81, 0x39, 0xD8, 0x1F, + 0xD9, 0x4F, 0xCD, 0x36, 0x1F, 0x57, 0xDA, 0x47, 0x07, 0x47, 0x3D, 0x4A, + 0x61, 0x20, 0x75, 0x35, 0x8F, 0x09, 0x69, 0x1F, 0x3A, 0x0B, 0x37, 0x12, + 0x20, 0x1C, 0xCC, 0x1A, 0x53, 0x33, 0x88, 0x2F, 0xFF, 0x37, 0xB3, 0x39, + 0x05, 0x31, 0x5E, 0x42, 0xD1, 0x31, 0x16, 0x4F, 0x5D, 0x3B, 0xC9, 0x57, + 0x68, 0x30, 0xF7, 0x4A, 0x31, 0x2F, 0xE4, 0x44, 0x6D, 0x51, 0x8B, 0x59, + 0xFF, 0x5F, 0xC3, 0x5E, 0x5A, 0x50, 0xDA, 0x56, 0x76, 0x3B, 0xA0, 0x52, + 0xBA, 0x27, 0xB8, 0x43, 0x0A, 0x22, 0x73, 0x34, 0x79, 0x32, 0x06, 0x37, + 0xCE, 0x46, 0xD6, 0x4B, 0x32, 0x51, 0x87, 0x60, 0x62, 0x4C, 0x2C, 0x5D, + 0xB9, 0x3D, 0x61, 0x4A, 0x61, 0x39, 0xC2, 0x3C, 0x3E, 0x3C, 0x4E, 0x39, + 0x6C, 0x44, 0xF9, 0x43, 0xFE, 0x57, 0xFB, 0x5B, 0x6C, 0x64, 0x14, 0x67, + 0xE9, 0x65, 0x3F, 0x64, 0x35, 0x59, 0x74, 0x60, 0xFA, 0x34, 0x7D, 0x4A, + 0x21, 0x13, 0x1C, 0x28, 0x17, 0x0E, 0x1E, 0x10, 0x43, 0x22, 0x91, 0x15, + 0x27, 0x3F, 0x0C, 0x31, 0xF9, 0x53, 0xCB, 0x47, 0xDA, 0x52, 0x6C, 0x4C, + 0x64, 0x44, 0x3E, 0x48, 0xAA, 0x39, 0x93, 0x44, 0x9F, 0x3F, 0x44, 0x4A, + 0x48, 0x58, 0x4F, 0x5B, 0x41, 0x63, 0x1F, 0x5F, 0xD0, 0x5E, 0x8C, 0x5B, + 0x12, 0x58, 0xF5, 0x4D, 0x0D, 0x3F, 0x42, 0x37, 0xD7, 0x1F, 0xD8, 0x2A, + 0x34, 0x0F, 0x85, 0x1B, 0xED, 0x1B, 0x42, 0x17, 0xF7, 0x3B, 0x80, 0x2A, + 0xDE, 0x4F, 0xCC, 0x3D, 0xF9, 0x56, 0xC9, 0x4A, 0x02, 0x4A, 0xAB, 0x48, + 0x40, 0x37, 0xC0, 0x3C, 0x2F, 0x3A, 0x55, 0x36, 0x4A, 0x4A, 0xA1, 0x39, + 0xC4, 0x4E, 0x34, 0x3D, 0xDA, 0x4D, 0x58, 0x38, 0xF7, 0x47, 0x56, 0x30, + 0x18, 0x2D, 0x3A, 0x1C, 0x66, 0x0F, 0xC4, 0x02, 0xDD, 0xFD, 0x5D, 0xF7, + 0x61, 0xF5, 0x6B, 0xFC, 0xAD, 0xF1, 0xB3, 0x0B, 0x90, 0x02, 0xA2, 0x20, + 0x95, 0x10, 0x6A, 0x2B, 0x6E, 0x0A, 0x94, 0x1F, 0x8E, 0x0A, 0xAB, 0x11, + 0x55, 0x0D, 0x35, 0x11, 0xD8, 0x09, 0x58, 0x16, 0xBA, 0x0C, 0x73, 0x18, + 0xD4, 0x11, 0xF3, 0x1F, 0xE0, 0x0E, 0x95, 0x23, 0x0A, 0xFE, 0x69, 0x10, + 0xC7, 0xE2, 0x68, 0xFA, 0x97, 0xC4, 0xC0, 0xF0, 0xB1, 0xBB, 0xE9, 0xF4, + 0xE8, 0xCC, 0xBE, 0xF7, 0x42, 0xDA, 0xAD, 0xEE, 0x72, 0xE1, 0x02, 0xEF, + 0xF8, 0xE7, 0xCF, 0xFB, 0x81, 0xE3, 0xBA, 0xFF, 0x9B, 0xD8, 0x98, 0xFA, + 0x8A, 0xDB, 0x83, 0xFB, 0xB1, 0xEF, 0x41, 0xFD, 0xE7, 0xFD, 0xF2, 0xF6, + 0xFE, 0xF8, 0xDC, 0xE5, 0xE6, 0xFB, 0x4B, 0xD8, 0x91, 0xF9, 0x9C, 0xCA, + 0x7E, 0xE4, 0x6B, 0xB9, 0x7D, 0xD7, 0x3B, 0xBB, 0x3F, 0xC2, 0x60, 0xBC, + 0x92, 0xBD, 0x7B, 0xCB, 0x9A, 0xCA, 0xCA, 0xE0, 0x3D, 0xD3, 0xFD, 0xE0, + 0xD5, 0xE0, 0x88, 0xDD, 0xA1, 0xDC, 0x9C, 0xD3, 0x1B, 0xDA, 0xC0, 0xC5, + 0x7C, 0xE7, 0xC9, 0xC1, 0x81, 0xF0, 0x14, 0xCF, 0x83, 0xF0, 0x32, 0xDD, + 0xE3, 0xF2, 0x79, 0xE5, 0xF0, 0xF2, 0x1A, 0xDC, 0xF2, 0xE9, 0xF2, 0xCA, + 0x53, 0xDA, 0xC3, 0xC4, 0xFA, 0xC3, 0xF1, 0xBA, 0xEE, 0xB8, 0xDC, 0xB3, + 0xDC, 0xC8, 0x42, 0xBD, 0x55, 0xE0, 0x0B, 0xD0, 0x87, 0xEE, 0x30, 0xE2, + 0x67, 0xFD, 0xA6, 0xF0, 0x54, 0xFF, 0x72, 0xF4, 0xE4, 0xF5, 0xE3, 0xF2, + 0x4D, 0xFE, 0x80, 0xF0, 0x46, 0x14, 0x15, 0xEC, 0x2C, 0x15, 0x37, 0xED, + 0x1E, 0xFB, 0xE8, 0xEF, 0xCB, 0xEC, 0x89, 0xEA, 0xDA, 0xF5, 0x15, 0xE9, + 0xEB, 0xEC, 0x8B, 0xE4, 0x64, 0xD3, 0xCF, 0xE0, 0x0C, 0xD5, 0x7A, 0xE9, + 0x08, 0xEF, 0x56, 0xF4, 0x0D, 0x02, 0xAF, 0x03, 0xA8, 0x05, 0x2F, 0x0E, + 0xD6, 0x12, 0xD7, 0x08, 0x2F, 0x26, 0xE7, 0xFD, 0xA1, 0x24, 0x82, 0x02, + 0xEA, 0x07, 0xAD, 0x06, 0x95, 0xFB, 0xB4, 0xFF, 0xD8, 0x0B, 0xDF, 0x02, + 0x5E, 0xFE, 0x8B, 0x0B, 0xF1, 0xFF, 0x44, 0x0C, 0xDA, 0x1B, 0x1E, 0xFD, + 0xAF, 0x12, 0x67, 0xF6, 0x66, 0xFB, 0x4A, 0x04, 0xF5, 0xF3, 0x38, 0x10, + 0x69, 0x0D, 0x93, 0x1C, 0x35, 0x24, 0xCA, 0x38, 0xD7, 0x20, 0x5C, 0x49, + 0xA2, 0x31, 0x6F, 0x3D, 0x50, 0x36, 0xCC, 0x36, 0x9C, 0x25, 0x45, 0x33, + 0x46, 0x27, 0x87, 0x2D, 0x7E, 0x30, 0xDD, 0x31, 0x36, 0x35, 0x7F, 0x2D, + 0xB2, 0x28, 0x36, 0x21, 0xBF, 0x15, 0x69, 0x1B, 0x40, 0x12, 0xA6, 0x08, + 0xBA, 0x0B, 0x8E, 0xF2, 0xB5, 0x02, 0x54, 0xFB, 0x15, 0x14, 0x9D, 0x11, + 0xD2, 0x26, 0x5C, 0x2A, 0x15, 0x33, 0x9F, 0x30, 0x09, 0x3B, 0x8B, 0x20, + 0xD5, 0x27, 0xA9, 0x1F, 0xE7, 0x11, 0x0F, 0x19, 0x74, 0x0D, 0xD7, 0x17, + 0xD4, 0x12, 0x82, 0x25, 0x36, 0x0F, 0x2C, 0x29, 0x86, 0x06, 0xDD, 0x1C, + 0x67, 0xFA, 0xB7, 0x04, 0x5A, 0xF1, 0x04, 0xF6, 0xDA, 0xFB, 0xC3, 0xF1, + 0xB1, 0x01, 0xCD, 0xEF, 0x93, 0xF0, 0xF9, 0xF6, 0xB1, 0xE0, 0x65, 0x17, + 0x53, 0xF1, 0x7B, 0x21, 0xAB, 0x07, 0xC0, 0x01, 0x78, 0x07, 0x11, 0xF0, + 0x0A, 0xFA, 0x4C, 0xEF, 0x01, 0xDE, 0xB5, 0xED, 0xA1, 0xCF, 0x90, 0xEF, + 0xF6, 0xD4, 0xD3, 0xF6, 0x00, 0xD0, 0x21, 0xF1, 0xB2, 0xBD, 0xAC, 0xE4, + 0xCE, 0xB6, 0x08, 0xD9, 0x6B, 0xBE, 0x5D, 0xCE, 0x0A, 0xC6, 0x70, 0xC0, + 0xE6, 0xD4, 0x2A, 0xAB, 0xF3, 0xD1, 0xED, 0xB4, 0x21, 0xCD, 0x87, 0xD3, + 0x77, 0xD1, 0x13, 0xE2, 0x7E, 0xC2, 0xF2, 0xE8, 0xE9, 0xBB, 0x19, 0xD7, + 0x8B, 0xD2, 0x2F, 0xC3, 0x08, 0xDF, 0x81, 0xC6, 0xA8, 0xDA, 0x9B, 0xBD, + 0xB3, 0xE3, 0x43, 0xBB, 0x38, 0xD5, 0xE7, 0xCA, 0xD1, 0xAF, 0x14, 0xCF, + 0x4D, 0xA5, 0x4B, 0xCF, 0x50, 0xAC, 0x1C, 0xC9, 0x07, 0xB7, 0x38, 0xBF, + 0x68, 0xC3, 0x30, 0xCC, 0x49, 0xCD, 0x78, 0xE0, 0x99, 0xC9, 0x7D, 0xD6, + 0x3B, 0xB6, 0x04, 0xB7, 0xD0, 0xB7, 0xE5, 0xA9, 0x13, 0xD3, 0x92, 0xB6, + 0xBC, 0xDF, 0x17, 0xC5, 0x58, 0xC8, 0x8B, 0xDB, 0xB8, 0xAC, 0xFF, 0xDA, + 0x60, 0xC1, 0x5C, 0xC0, 0x39, 0xDA, 0xC6, 0xC1, 0x29, 0xB7, 0xE8, 0xC0, + 0xF1, 0x9E, 0x12, 0xB0, 0x5E, 0xC2, 0x25, 0xB7, 0xFA, 0xD9, 0x8F, 0xCD, + 0x8C, 0xCA, 0xFA, 0xD2, 0xC2, 0xC0, 0x44, 0xC4, 0x7E, 0xCC, 0x75, 0xB9, + 0x4E, 0xC8, 0xCA, 0xAE, 0x7E, 0xB6, 0x19, 0xAC, 0x82, 0xB7, 0x03, 0xC1, + 0xD6, 0xCD, 0x98, 0xC9, 0xDA, 0xDE, 0x5C, 0xC6, 0xEC, 0xD1, 0xA9, 0xCB, + 0x2D, 0xCF, 0x64, 0xC6, 0x3A, 0xD1, 0xF8, 0xBE, 0x47, 0xC3, 0x67, 0xB6, + 0xB6, 0xB9, 0x37, 0xAE, 0x1A, 0xC0, 0x9D, 0xB7, 0x35, 0xE1, 0x13, 0xC4, + 0x0B, 0xF1, 0xA8, 0xD5, 0xAB, 0xE8, 0xBC, 0xE4, 0xF8, 0xE1, 0x37, 0xEB, + 0xFE, 0xD5, 0xAD, 0xEA, 0xD7, 0xD9, 0x2A, 0xE3, 0xD0, 0xF5, 0x75, 0xE5, + 0x10, 0x06, 0x04, 0xEE, 0xF7, 0xF7, 0x32, 0xF8, 0xE8, 0xE9, 0x3D, 0x08, + 0x0C, 0xEF, 0x86, 0x00, 0x2D, 0xED, 0xBA, 0xE3, 0xD7, 0xDE, 0xF8, 0xE1, + 0xFE, 0xD7, 0x34, 0xED, 0x71, 0xE1, 0x63, 0xFA, 0x1A, 0xF3, 0x6A, 0x04, + 0xA4, 0xFD, 0xE0, 0xFC, 0x7A, 0xF3, 0xBF, 0xF8, 0x54, 0xEC, 0xBA, 0xF6, + 0xCC, 0x00, 0x02, 0xF5, 0xEB, 0x20, 0x17, 0xF9, 0x00, 0x35, 0xB8, 0x03, + 0xA5, 0x3B, 0x1E, 0x05, 0x53, 0x29, 0xA6, 0x07, 0xAA, 0xFB, 0xFE, 0x1C, + 0xDD, 0xEA, 0xB9, 0x22, 0x73, 0xF5, 0x88, 0x0E, 0x72, 0x02, 0xF9, 0x0E, + 0x56, 0x13, 0x58, 0x20, 0x92, 0x1D, 0x8E, 0x22, 0x39, 0x28, 0x81, 0x23, + 0x65, 0x2F, 0xA1, 0x2C, 0xFA, 0x24, 0x4D, 0x34, 0x71, 0x1E, 0xFE, 0x34, + 0x5E, 0x20, 0x89, 0x3E, 0xC3, 0x37, 0x67, 0x55, 0x44, 0x5B, 0xCF, 0x5B, + 0x14, 0x5D, 0x06, 0x55, 0xF6, 0x52, 0xE8, 0x4B, 0x20, 0x52, 0xC5, 0x3D, + 0x2E, 0x40, 0x0C, 0x3D, 0xE2, 0x29, 0x81, 0x45, 0xAF, 0x2C, 0x66, 0x4B, + 0x15, 0x40, 0x8A, 0x4F, 0x6D, 0x53, 0x68, 0x46, 0xA9, 0x5E, 0x3E, 0x33, + 0x8E, 0x65, 0x09, 0x39, 0x89, 0x54, 0x10, 0x46, 0x3C, 0x2F, 0x9E, 0x41, + 0x86, 0x2B, 0xF5, 0x41, 0xEF, 0x46, 0x80, 0x4C, 0xA3, 0x5F, 0xC0, 0x53, + 0x00, 0x63, 0x5C, 0x55, 0x94, 0x5F, 0x0A, 0x59, 0x3A, 0x60, 0x3D, 0x4E, + 0x66, 0x4F, 0x37, 0x36, 0x09, 0x47, 0x08, 0x30, 0x8C, 0x49, 0x10, 0x34, + 0x7D, 0x47, 0xE7, 0x3D, 0x0E, 0x53, 0xF4, 0x54, 0x60, 0x4D, 0x1C, 0x62, + 0xF3, 0x44, 0x27, 0x5C, 0x8D, 0x50, 0xD7, 0x59, 0x30, 0x53, 0x95, 0x56, + 0xA8, 0x4F, 0xA5, 0x46, 0x5E, 0x48, 0x8A, 0x52, 0x23, 0x55, 0x08, 0x5F, + 0x8C, 0x60, 0x54, 0x44, 0x83, 0x4A, 0xE3, 0x34, 0x5F, 0x30, 0x79, 0x3F, + 0xEC, 0x1C, 0x11, 0x43, 0xE0, 0x1B, 0x05, 0x40, 0xF8, 0x24, 0x61, 0x47, + 0x0C, 0x32, 0xE9, 0x4A, 0xF7, 0x4C, 0x48, 0x4D, 0x1B, 0x54, 0x25, 0x4E, + 0x54, 0x42, 0x41, 0x52, 0x41, 0x38, 0x39, 0x59, 0x0F, 0x38, 0x12, 0x46, + 0x27, 0x3D, 0x7D, 0x3E, 0x23, 0x52, 0x65, 0x45, 0xF7, 0x57, 0x39, 0x44, + 0x3E, 0x36, 0xDD, 0x43, 0xF0, 0x18, 0x1A, 0x42, 0x1E, 0x18, 0xDB, 0x37, + 0x0B, 0x1C, 0x30, 0x1F, 0x1F, 0x20, 0x50, 0x0C, 0xEF, 0x25, 0xB0, 0x11, + 0xB9, 0x25, 0x2B, 0x25, 0xD8, 0x27, 0x20, 0x29, 0x60, 0x25, 0x45, 0x1B, + 0xD8, 0x22, 0x16, 0x10, 0x60, 0x23, 0x53, 0x06, 0x1B, 0x21, 0x32, 0x01, + 0x30, 0x1D, 0x65, 0x07, 0x74, 0x1E, 0x8D, 0x13, 0x31, 0x2F, 0xDA, 0x0B, + 0xAC, 0x2B, 0x3E, 0xF7, 0x14, 0x0C, 0xC5, 0xFE, 0xCF, 0xF8, 0xB5, 0x09, + 0x90, 0x03, 0xF9, 0xF8, 0xAB, 0x17, 0xA4, 0xEB, 0x2E, 0x1B, 0xE6, 0xFA, + 0x3A, 0x0E, 0x94, 0x04, 0x63, 0xFA, 0xB2, 0x02, 0x4F, 0xF1, 0xFA, 0x07, + 0x7D, 0xF2, 0x9A, 0x0A, 0x81, 0xE9, 0x8B, 0x08, 0x92, 0xE9, 0x75, 0x01, + 0xC0, 0x05, 0x03, 0xF8, 0xD6, 0x21, 0x72, 0xF0, 0xE2, 0x1B, 0x0F, 0xE5, + 0x93, 0xFB, 0x5C, 0xE6, 0x41, 0xE4, 0x13, 0xF1, 0x83, 0xE6, 0x68, 0xF5, + 0xFB, 0xF6, 0x98, 0xF8, 0x6F, 0x01, 0x95, 0x02, 0xF0, 0x00, 0xC4, 0x12, + 0xD9, 0xF9, 0x9C, 0x0E, 0xAE, 0xFA, 0x09, 0xEC, 0x06, 0xF4, 0xC1, 0xD8, + 0xE5, 0xE1, 0x47, 0xDA, 0x86, 0xDB, 0x80, 0xD9, 0xBA, 0xD4, 0x9D, 0xEF, + 0x03, 0xD5, 0xF9, 0x07, 0xB7, 0xE6, 0x2A, 0x03, 0x3C, 0xEF, 0x68, 0xED, + 0xD0, 0xE8, 0x28, 0xDC, 0xE4, 0xED, 0xE9, 0xDF, 0xAF, 0xF8, 0x7A, 0xEF, + 0xB9, 0xFA, 0xBC, 0xFC, 0x0E, 0xFC, 0x0E, 0x02, 0x86, 0xFA, 0x0C, 0x07, + 0xA9, 0xEC, 0xF2, 0x00, 0xE4, 0xE1, 0xA7, 0xE3, 0x96, 0xF2, 0x7B, 0xCF, + 0x6B, 0xFC, 0xCE, 0xD1, 0x2B, 0xEE, 0xD8, 0xD3, 0x2B, 0xD7, 0x6F, 0xD5, + 0x12, 0xC1, 0x9E, 0xDC, 0x69, 0xC3, 0x80, 0xDC, 0x01, 0xD1, 0xFE, 0xD1, + 0x8E, 0xDF, 0xA7, 0xCF, 0x13, 0xE5, 0x78, 0xE2, 0xA9, 0xEB, 0xD2, 0xEC, + 0xE9, 0xFD, 0xFE, 0xF6, 0x0F, 0xF6, 0x14, 0x02, 0xCA, 0xF1, 0x62, 0xF3, + 0xE5, 0xF8, 0x2D, 0xF0, 0x27, 0xEF, 0x6D, 0xFF, 0xE1, 0xEB, 0x95, 0x08, + 0x4D, 0xF6, 0x20, 0x13, 0xA3, 0x04, 0x6A, 0x15, 0x31, 0xFA, 0x3E, 0x12, + 0x12, 0xEC, 0xF0, 0x1A, 0xCF, 0xEF, 0x99, 0x1D, 0x5C, 0xF0, 0x70, 0x09, + 0xC6, 0xFF, 0x54, 0xF2, 0x17, 0x03, 0x77, 0xF4, 0x9E, 0xF3, 0xC8, 0x02, + 0xDC, 0xFE, 0x7B, 0xFE, 0xF7, 0xFF, 0xFC, 0xEF, 0x2F, 0xE4, 0x2D, 0xF5, + 0xC1, 0xD0, 0x6E, 0xFA, 0xCE, 0xD0, 0xC2, 0xF0, 0x19, 0xCE, 0xB5, 0xF0, + 0x68, 0xD0, 0x99, 0xE1, 0xFE, 0xE3, 0x1F, 0xC6, 0x04, 0xD4, 0x92, 0xC8, + 0x88, 0xC2, 0xAD, 0xDF, 0x43, 0xDB, 0x01, 0xE4, 0x60, 0xDD, 0xB2, 0xD4, + 0x13, 0xC9, 0x7E, 0xD2, 0xEE, 0xC8, 0xCC, 0xD7, 0x4B, 0xCB, 0x3F, 0xDC, + 0xB0, 0xD9, 0x1F, 0xE1, 0x5B, 0xE9, 0xE3, 0xD6, 0x7F, 0xD9, 0x31, 0xC4, + 0x0F, 0xBD, 0x0C, 0xBE, 0x65, 0xAF, 0xCE, 0xC2, 0x5A, 0xAA, 0xD5, 0xC8, + 0xCF, 0xA7, 0x72, 0xCF, 0xAC, 0xAA, 0x8A, 0xCA, 0x39, 0xA7, 0x51, 0xC4, + 0xC6, 0xA3, 0x6E, 0xD0, 0x53, 0xAB, 0x56, 0xD3, 0x76, 0xB1, 0x31, 0xD0, + 0x3F, 0xBB, 0xC4, 0xDD, 0x7D, 0xC6, 0xB9, 0xE7, 0x30, 0xC5, 0x57, 0xE9, + 0xC2, 0xCF, 0x89, 0xE1, 0xBA, 0xE0, 0x01, 0xC9, 0x66, 0xDF, 0x58, 0xB0, + 0x15, 0xD1, 0xD0, 0xAD, 0x6F, 0xB8, 0x81, 0xB6, 0xCC, 0xA3, 0xE7, 0xB7, + 0x4C, 0xA4, 0x33, 0xBD, 0xDC, 0xA8, 0x54, 0xB8, 0xEA, 0xA3, 0x0D, 0xB2, + 0x67, 0xA1, 0x14, 0xB5, 0x7B, 0xB2, 0x05, 0xB3, 0xE9, 0xC1, 0x7F, 0xA9, + 0x01, 0xBD, 0xF6, 0xA5, 0x89, 0xC4, 0x82, 0xB5, 0x23, 0xDC, 0x5A, 0xC7, + 0xC6, 0xE1, 0x1E, 0xCD, 0xC5, 0xD8, 0x13, 0xD2, 0x24, 0xD0, 0x16, 0xD8, + 0xFC, 0xC3, 0x68, 0xBA, 0x1D, 0xBC, 0x93, 0x9E, 0xB4, 0xBA, 0x7A, 0xA6, + 0x3E, 0xB8, 0x00, 0xAB, 0x48, 0xB2, 0x14, 0xA4, 0xB6, 0xAF, 0x7B, 0x9E, + 0xDE, 0xB3, 0xAB, 0xAD, 0xF3, 0xB9, 0x32, 0xB6, 0x0E, 0xBE, 0x5F, 0xA7, + 0xA3, 0xB8, 0x1D, 0xA8, 0x43, 0xBA, 0x39, 0xB0, 0x82, 0xBD, 0x99, 0xB6, + 0xC9, 0xB0, 0xDD, 0xBA, 0xAF, 0xB2, 0x9C, 0xB2, 0x1D, 0xBE, 0x91, 0xA2, + 0x5A, 0xB1, 0x69, 0xA2, 0xD6, 0xA8, 0x45, 0xC1, 0x33, 0xBA, 0xC3, 0xDA, + 0xE8, 0xD7, 0xEF, 0xE2, 0x99, 0xE5, 0x0C, 0xDD, 0x30, 0xEA, 0x41, 0xDA, + 0x85, 0xE7, 0x9D, 0xE7, 0x7E, 0xDE, 0xA2, 0xF1, 0x55, 0xE9, 0x87, 0xFB, + 0x85, 0xEC, 0x04, 0xF6, 0xDF, 0xE8, 0xB9, 0xEB, 0x74, 0xE1, 0xE8, 0xE8, + 0x60, 0xDA, 0xC5, 0xE1, 0x4C, 0xE1, 0xB4, 0xD7, 0xC4, 0xDD, 0xB9, 0xCC, + 0x2C, 0xD0, 0xD8, 0xD1, 0x8F, 0xBC, 0x9B, 0xDD, 0xC4, 0xAF, 0xBD, 0xE2, + 0x92, 0xC7, 0x6E, 0xE4, 0x16, 0xD7, 0x9D, 0xE4, 0x78, 0xD9, 0x67, 0xEC, + 0x02, 0xE9, 0xC6, 0xF8, 0xE6, 0xEF, 0xC6, 0x05, 0x26, 0xE9, 0x14, 0xFE, + 0x30, 0xE9, 0x1D, 0xDB, 0xC8, 0xFC, 0x6B, 0xC7, 0x09, 0x08, 0xFE, 0xCB, + 0x3E, 0x0D, 0x85, 0xC7, 0xBA, 0x11, 0x76, 0xC2, 0x7E, 0xFF, 0x5B, 0xC7, + 0xBF, 0xE6, 0x8D, 0xCC, 0xC9, 0xE4, 0x4E, 0xD9, 0x3D, 0xF3, 0xD9, 0xDC, + 0x8E, 0xFC, 0xF6, 0xD8, 0x63, 0x02, 0x37, 0xEB, 0x3E, 0x0B, 0x13, 0x10, + 0xD7, 0x0F, 0xE2, 0x18, 0x40, 0x0E, 0x64, 0x0A, 0xF4, 0x0F, 0xDF, 0x07, + 0xC0, 0x0C, 0xAD, 0x04, 0x0C, 0x00, 0x6E, 0x03, 0x9D, 0xFD, 0x02, 0x0D, + 0xC1, 0x0F, 0x01, 0x14, 0xF9, 0x2A, 0x6F, 0x12, 0x50, 0x33, 0x6F, 0x14, + 0x6D, 0x2B, 0x3F, 0x22, 0x7A, 0x1A, 0x26, 0x1D, 0x0F, 0x07, 0x62, 0x10, + 0x28, 0x0C, 0x7A, 0x10, 0x89, 0x19, 0x78, 0x0E, 0x1B, 0x17, 0x62, 0x14, + 0x47, 0x14, 0x9F, 0x18, 0x8F, 0x15, 0xC4, 0x14, 0xC4, 0x09, 0x79, 0x16, + 0xB0, 0xFC, 0xAD, 0x1A, 0x87, 0x06, 0x9C, 0x1C, 0x22, 0x19, 0x19, 0x1D, + 0x2E, 0x2E, 0x92, 0x1A, 0x49, 0x3B, 0xCD, 0x1F, 0x65, 0x39, 0x06, 0x22, + 0x70, 0x42, 0x2A, 0x16, 0x77, 0x4D, 0x3B, 0x15, 0xFB, 0x4C, 0xD7, 0x1F, + 0x72, 0x46, 0xF6, 0x29, 0x01, 0x3D, 0x25, 0x38, 0x49, 0x40, 0xFE, 0x3B, + 0xB4, 0x3F, 0x29, 0x2E, 0xD7, 0x31, 0xE5, 0x1B, 0x08, 0x29, 0x25, 0x0C, + 0xB7, 0x29, 0x60, 0x09, 0xEC, 0x26, 0xB7, 0x0D, 0x3C, 0x25, 0x12, 0x0C, + 0x4A, 0x25, 0x70, 0x11, 0x11, 0x1F, 0x03, 0x10, 0x3E, 0x1D, 0xB8, 0x05, + 0x09, 0x16, 0x44, 0x0B, 0x0D, 0x1B, 0xC1, 0x17, 0x90, 0x32, 0x12, 0x2A, + 0x55, 0x3F, 0x3B, 0x33, 0xE2, 0x42, 0xB0, 0x32, 0x58, 0x4D, 0x85, 0x46, + 0x5C, 0x5C, 0x08, 0x4F, 0x84, 0x65, 0xE7, 0x3B, 0x35, 0x59, 0x8A, 0x3D, + 0xE1, 0x43, 0x10, 0x47, 0xE0, 0x3D, 0x55, 0x30, 0x84, 0x35, 0x1B, 0x27, + 0xC0, 0x27, 0x2A, 0x36, 0x19, 0x24, 0xCD, 0x33, 0xB2, 0x1E, 0x11, 0x22, + 0x15, 0x18, 0xCF, 0x17, 0xB5, 0x24, 0xD4, 0x22, 0x74, 0x3F, 0x62, 0x36, + 0xB6, 0x4E, 0x11, 0x36, 0x8F, 0x4D, 0xB5, 0x2D, 0x8D, 0x3F, 0x9A, 0x2D, + 0x29, 0x36, 0xBF, 0x27, 0xD4, 0x3A, 0x79, 0x23, 0x99, 0x34, 0x5E, 0x28, + 0x9B, 0x2D, 0xB5, 0x2F, 0xD4, 0x33, 0xA3, 0x21, 0xE4, 0x31, 0xF6, 0x0C, + 0x79, 0x28, 0x06, 0x06, 0x23, 0x23, 0x82, 0xFE, 0x8C, 0x17, 0x74, 0xFA, + 0x16, 0x12, 0xA0, 0x02, 0xA3, 0x32, 0x68, 0x0D, 0x88, 0x51, 0xEE, 0x09, + 0xC3, 0x44, 0xD3, 0x03, 0xA5, 0x28, 0x94, 0x0C, 0x84, 0x13, 0x01, 0x21, + 0xE2, 0x0B, 0xE3, 0x30, 0x7F, 0x10, 0x4A, 0x22, 0x37, 0x1B, 0x59, 0x0D, + 0x3A, 0x1E, 0x3B, 0x15, 0xF6, 0x14, 0x38, 0x1E, 0xE8, 0x14, 0xAD, 0x14, + 0x0F, 0x14, 0xF6, 0x09, 0x67, 0x0A, 0x2E, 0x06, 0x7E, 0x0C, 0xCC, 0x04, + 0xF5, 0x13, 0x7D, 0x0F, 0x3B, 0x27, 0xD7, 0x26, 0x2A, 0x43, 0xE2, 0x31, + 0x8A, 0x4F, 0x8D, 0x33, 0xD4, 0x3E, 0xDA, 0x31, 0xB4, 0x23, 0xB6, 0x27, + 0x01, 0x14, 0xC1, 0x1A, 0xFC, 0x09, 0x48, 0x0B, 0x48, 0xFF, 0x15, 0x0A, + 0xBD, 0xF1, 0x75, 0x19, 0x4E, 0xEA, 0x94, 0x21, 0xF8, 0xE9, 0xEC, 0x13, + 0xD5, 0xF5, 0xEE, 0x09, 0x23, 0x08, 0xB5, 0x14, 0x23, 0x14, 0xF0, 0x2D, + 0xCB, 0x26, 0xD0, 0x49, 0x00, 0x3F, 0x9A, 0x5B, 0x9D, 0x4F, 0x6D, 0x59, + 0x5B, 0x59, 0xA8, 0x43, 0x9B, 0x53, 0xD8, 0x32, 0x13, 0x43, 0x65, 0x2A, + 0x96, 0x35, 0xF4, 0x21, 0x42, 0x27, 0x1E, 0x14, 0x15, 0x1C, 0xB7, 0x12, + 0x52, 0x10, 0x74, 0x1C, 0x60, 0x05, 0x1C, 0x1F, 0x5B, 0x00, 0x09, 0x1E, + 0xDD, 0xFC, 0x17, 0x25, 0x70, 0x00, 0x18, 0x2B, 0x04, 0x13, 0xF3, 0x13, + 0x23, 0x2E, 0x65, 0x0A, 0x8E, 0x3F, 0xC5, 0x18, 0x75, 0x40, 0x76, 0x26, + 0xE9, 0x32, 0xD0, 0x36, 0xCD, 0x25, 0x4F, 0x38, 0x6E, 0x21, 0x3D, 0x2F, + 0xA5, 0x1E, 0x37, 0x29, 0x5E, 0x23, 0x97, 0x26, 0xB2, 0x30, 0xAC, 0x27, + 0xC4, 0x2E, 0x4D, 0x2F, 0x72, 0x22, 0xC2, 0x33, 0xF1, 0x13, 0x5F, 0x2E, + 0xBF, 0xFB, 0xCF, 0x25, 0x98, 0xF1, 0x8A, 0x1D, 0x28, 0xFE, 0x02, 0x12, + 0x24, 0x0F, 0xE5, 0x0A, 0x6F, 0x0B, 0x63, 0x13, 0xBA, 0xEF, 0x99, 0x18, + 0x6E, 0xD8, 0x0C, 0x0C, 0x74, 0xC2, 0x2D, 0xFB, 0x60, 0xB6, 0x5B, 0xF2, + 0x8B, 0xC3, 0xFF, 0xF0, 0x61, 0xD7, 0x93, 0xF4, 0x92, 0xE3, 0x3C, 0xF6, + 0x7F, 0xDC, 0x5E, 0xE6, 0xDC, 0xBF, 0x34, 0xD5, 0x4A, 0xAB, 0xAD, 0xCF, + 0xDB, 0xB9, 0x1B, 0xCA, 0x7C, 0xCD, 0xE1, 0xD0, 0x8D, 0xCE, 0x9E, 0xE1, + 0xF8, 0xD0, 0x12, 0xEC, 0x4E, 0xD6, 0x6E, 0xEA, 0x71, 0xCE, 0xFD, 0xD6, + 0x29, 0xC4, 0x1A, 0xC2, 0x0A, 0xBB, 0x1E, 0xB4, 0xC6, 0xB6, 0x9A, 0xB4, + 0x18, 0xBD, 0x7E, 0xC3, 0x55, 0xB8, 0x03, 0xCC, 0x07, 0xB0, 0xB4, 0xD1, + 0x26, 0xBA, 0x18, 0xD3, 0x4B, 0xBE, 0xC8, 0xD0, 0x00, 0xAD, 0xD7, 0xDC, + 0x76, 0x9D, 0xF8, 0xE9, 0xC8, 0xA2, 0x0A, 0xDC, 0xBC, 0xB6, 0xC5, 0xD4, + 0xD3, 0xCB, 0xB0, 0xDD, 0x9E, 0xE4, 0x82, 0xDC, 0x1F, 0xEF, 0x71, 0xD7, + 0xE4, 0xE2, 0x70, 0xD7, 0x31, 0xD0, 0x5D, 0xDE, 0x88, 0xC4, 0x6C, 0xDE, + 0xEA, 0xCC, 0x91, 0xD5, 0x74, 0xD7, 0xF2, 0xC9, 0xCD, 0xCF, 0x21, 0xC6, + 0x77, 0xBB, 0x27, 0xC7, 0xED, 0xA7, 0x14, 0xC4, 0x06, 0xA2, 0xA6, 0xBC, + 0x4C, 0xAE, 0x54, 0xAF, 0x7B, 0xBC, 0x6F, 0xAF, 0x39, 0xC9, 0x71, 0xC3, + 0x42, 0xDE, 0xFB, 0xDD, 0x5F, 0xF6, 0x13, 0xF1, 0xD0, 0x00, 0xAF, 0xF0, + 0x3F, 0xF9, 0xCD, 0xED, 0x69, 0xF4, 0xED, 0xED, 0xF9, 0xFC, 0xFB, 0xDE, + 0x62, 0xFC, 0xC6, 0xD1, 0x5F, 0xE3, 0xE5, 0xD7, 0x81, 0xCE, 0x63, 0xE3, + 0x2B, 0xC5, 0x25, 0xDD, 0x47, 0xBE, 0x7B, 0xC6, 0x6C, 0xC4, 0x90, 0xBF, + 0x38, 0xC6, 0x08, 0xC6, 0xBB, 0xBE, 0xC4, 0xD1, 0xDA, 0xC3, 0x30, 0xE9, + 0x90, 0xD6, 0xAD, 0xF2, 0x32, 0xE7, 0xD1, 0xEA, 0x37, 0xDA, 0xBE, 0xED, + 0x68, 0xC8, 0x1B, 0xF6, 0xA1, 0xD4, 0x70, 0xF0, 0x17, 0xE1, 0xBF, 0xE2, + 0xC2, 0xE6, 0x4B, 0xDF, 0x22, 0xE8, 0x31, 0xE2, 0xA2, 0xE2, 0x25, 0xE9, + 0x70, 0xEA, 0x03, 0xF0, 0x2A, 0xF1, 0xB6, 0xF2, 0x66, 0xEF, 0x8C, 0x0C, + 0x94, 0xF0, 0xB5, 0x26, 0xCF, 0xED, 0x90, 0x22, 0x64, 0xED, 0x53, 0x1A, + 0x64, 0x01, 0xEA, 0x0C, 0x6C, 0x1A, 0xF6, 0xF0, 0x34, 0x11, 0xD2, 0xE1, + 0x6F, 0xF1, 0x1A, 0xED, 0xDC, 0xE1, 0x28, 0xFA, 0xE7, 0xDB, 0x29, 0xF3, + 0xDE, 0xDF, 0x0F, 0xEF, 0xC9, 0xEF, 0xE1, 0xF2, 0x13, 0xF6, 0x56, 0xF2, + 0x23, 0xF4, 0x21, 0xF6, 0xBB, 0xEE, 0x8D, 0xF8, 0x03, 0xEE, 0x1F, 0xFD, + 0x09, 0xF0, 0x80, 0xFE, 0xF4, 0xEF, 0x96, 0xF2, 0x17, 0xFB, 0xDA, 0xEC, + 0xFC, 0x11, 0x01, 0xF4, 0x37, 0x1F, 0x49, 0xF6, 0xB3, 0x14, 0xC1, 0xEF, + 0x95, 0xF7, 0x16, 0xE5, 0x26, 0xE6, 0x0E, 0xDB, 0xED, 0xF3, 0xF1, 0xD6, + 0x47, 0xFF, 0x5B, 0xD8, 0xD0, 0xFE, 0x97, 0xE5, 0x1A, 0x03, 0xFB, 0xEC, + 0x13, 0x04, 0x9D, 0xE4, 0x47, 0xFE, 0xA1, 0xE4, 0x30, 0xFE, 0x8A, 0xEF, + 0x01, 0x01, 0x91, 0xF6, 0xC2, 0xFE, 0x06, 0xFB, 0x50, 0x04, 0xC0, 0x05, + 0xF6, 0x0D, 0x46, 0x07, 0x84, 0x0C, 0xDA, 0xF8, 0x64, 0x05, 0x2E, 0xF4, + 0x7B, 0xFE, 0x26, 0xFD, 0x56, 0x00, 0x0C, 0x14, 0x97, 0x0B, 0xEC, 0x29, + 0xC8, 0x28, 0x4F, 0x24, 0xF3, 0x42, 0x54, 0x0A, 0x0F, 0x32, 0x31, 0xF8, + 0x4A, 0x0E, 0x4F, 0xF5, 0xDB, 0xF3, 0x91, 0xF3, 0x1B, 0xED, 0x4E, 0xFB, + 0x26, 0xF2, 0xFE, 0x01, 0x2F, 0xEB, 0xDA, 0xFF, 0x0F, 0xE6, 0x83, 0x03, + 0x5A, 0x00, 0xBE, 0x07, 0x6D, 0x24, 0x9D, 0x01, 0x46, 0x31, 0x86, 0x01, + 0x27, 0x31, 0xD3, 0x17, 0x81, 0x3B, 0x96, 0x2C, 0xDF, 0x4D, 0x9E, 0x30, + 0xB9, 0x4A, 0x39, 0x30, 0x9D, 0x3A, 0xEA, 0x30, 0xC4, 0x2C, 0x36, 0x2B, + 0x2C, 0x1B, 0x76, 0x20, 0x2F, 0x1C, 0xF6, 0x09, 0x4E, 0x2C, 0x39, 0xF3, + 0xBF, 0x2D, 0x5D, 0xFA, 0xC4, 0x22, 0xCD, 0x00, 0x9B, 0x1B, 0x76, 0x00, + 0xFD, 0x1D, 0x40, 0x0E, 0x32, 0x26, 0x9F, 0x0D, 0x41, 0x32, 0x83, 0x08, + 0x24, 0x33, 0x8E, 0x0D, 0x99, 0x2B, 0xC2, 0x12, 0x39, 0x28, 0x8A, 0x12, + 0x76, 0x27, 0x19, 0x09, 0x30, 0x23, 0x21, 0x0C, 0xBA, 0x0F, 0x92, 0x1A, + 0x69, 0x0B, 0xCE, 0x1F, 0x45, 0x29, 0x75, 0x21, 0x77, 0x4D, 0x48, 0x24, + 0xB6, 0x59, 0xA7, 0x23, 0x31, 0x46, 0xD4, 0x2C, 0x55, 0x39, 0x97, 0x38, + 0xC3, 0x41, 0xDE, 0x30, 0xB4, 0x3A, 0x26, 0x29, 0x40, 0x30, 0x5F, 0x31, + 0xD2, 0x3A, 0xBF, 0x35, 0x5A, 0x33, 0x51, 0x27, 0x81, 0x1A, 0x61, 0x17, + 0x61, 0x0C, 0x28, 0x09, 0x7E, 0x02, 0xCE, 0xFA, 0x9F, 0x02, 0x9D, 0xFC, + 0x01, 0x0B, 0x2B, 0x02, 0xDD, 0x1B, 0x37, 0x0A, 0xB3, 0x30, 0x0D, 0x1A, + 0xC4, 0x37, 0x98, 0x1F, 0x1A, 0x2A, 0xB7, 0x10, 0x9A, 0x1A, 0x7D, 0x07, + 0x91, 0x1C, 0xA5, 0x0B, 0x60, 0x26, 0x9D, 0x09, 0x2B, 0x2C, 0x24, 0x08, + 0xEA, 0x25, 0xB3, 0xFE, 0x3C, 0x19, 0x1E, 0xEF, 0x92, 0x03, 0x78, 0xDB, + 0xD3, 0xED, 0xF9, 0xC7, 0x3F, 0xEE, 0xC7, 0xCA, 0x72, 0xF7, 0xEA, 0xDA, + 0x37, 0xFE, 0x26, 0xEB, 0x6B, 0x0E, 0xBD, 0xFB, 0x77, 0x27, 0xE6, 0x0A, + 0x64, 0x23, 0x37, 0x0C, 0xF1, 0x01, 0x98, 0xFE, 0x84, 0xF3, 0x2E, 0xF8, + 0x5C, 0xF7, 0xF2, 0x00, 0x73, 0xF9, 0xFE, 0xFD, 0xDA, 0xF9, 0xE5, 0xF2, + 0xC3, 0xFA, 0x86, 0xF8, 0x9F, 0xF1, 0x77, 0x00, 0xF1, 0xE0, 0x49, 0x03, + 0x9A, 0xE5, 0x9B, 0x07, 0x56, 0xFC, 0xFF, 0x12, 0xCB, 0x16, 0x07, 0x23, + 0xB9, 0x36, 0x79, 0x28, 0x90, 0x4B, 0x1F, 0x30, 0x43, 0x3D, 0x39, 0x31, + 0xBE, 0x15, 0xC3, 0x16, 0x0F, 0xF1, 0xCA, 0x01, 0x8C, 0xE0, 0xA7, 0x01, + 0x29, 0xF0, 0x1A, 0xFE, 0xCE, 0x08, 0xCC, 0xF9, 0x3E, 0x0F, 0x7D, 0x05, + 0xA7, 0x07, 0x71, 0x22, 0x22, 0xFF, 0xB0, 0x3F, 0xC8, 0x12, 0x0F, 0x4E, + 0x6D, 0x3A, 0x0B, 0x4B, 0x8E, 0x55, 0x6E, 0x47, 0x28, 0x60, 0x43, 0x4F, + 0xB1, 0x61, 0x14, 0x50, 0x58, 0x60, 0x33, 0x40, 0x5F, 0x56, 0x2A, 0x33, + 0x70, 0x3C, 0x54, 0x2B, 0xF0, 0x26, 0xC7, 0x24, 0x08, 0x24, 0x67, 0x32, + 0x82, 0x22, 0x16, 0x3C, 0xDD, 0x2E, 0xD4, 0x30, 0xE5, 0x3D, 0xD3, 0x29, + 0xB8, 0x33, 0x73, 0x28, 0xE0, 0x26, 0x50, 0x1B, 0xB1, 0x20, 0x2E, 0x1A, + 0xFF, 0x1B, 0xFD, 0x29, 0x0C, 0x1A, 0xC7, 0x2F, 0x2C, 0x17, 0x34, 0x3D, + 0x36, 0x2A, 0xBB, 0x4A, 0xC6, 0x49, 0x03, 0x45, 0x40, 0x4D, 0x50, 0x39, + 0x87, 0x40, 0x2B, 0x31, 0x94, 0x2D, 0x04, 0x34, 0x46, 0x24, 0xB8, 0x3A, + 0xE6, 0x30, 0xAF, 0x37, 0xB6, 0x39, 0x00, 0x39, 0xAD, 0x36, 0x75, 0x3E, + 0x7A, 0x2F, 0xB9, 0x38, 0x91, 0x21, 0xA7, 0x28, 0x3A, 0x13, 0xCA, 0x19, + 0x13, 0x06, 0xC9, 0x14, 0xEB, 0xFF, 0x8F, 0x14, 0xAE, 0x06, 0xB7, 0x16, + 0x7C, 0x02, 0xC8, 0x17, 0x8B, 0xFF, 0x02, 0x1C, 0x9F, 0x09, 0xD1, 0x15, + 0x7B, 0x05, 0x68, 0x01, 0x78, 0xF0, 0xB5, 0xF2, 0x3E, 0xE0, 0x19, 0xEB, + 0xFD, 0xE5, 0x03, 0xEA, 0x8B, 0xF9, 0x6B, 0xF1, 0x7A, 0xFA, 0xDE, 0xFF, + 0x79, 0xE8, 0xBF, 0x07, 0xF0, 0xE5, 0x87, 0x01, 0x97, 0xEE, 0x32, 0xF0, + 0x6E, 0xE9, 0xF0, 0xE8, 0x3B, 0xDE, 0xDB, 0xE6, 0xDE, 0xD8, 0xD1, 0xDC, + 0x2F, 0xD7, 0x6D, 0xDF, 0x60, 0xE3, 0x7F, 0xE4, 0x1C, 0xED, 0x1E, 0xE1, + 0x5D, 0xDF, 0xA1, 0xDB, 0xEF, 0xC9, 0x71, 0xDB, 0x1E, 0xB7, 0x60, 0xEB, + 0x93, 0xAB, 0x1A, 0xF7, 0xC6, 0xA7, 0xA9, 0xF8, 0xDD, 0xB4, 0x15, 0xFA, + 0x7B, 0xCC, 0x77, 0xEF, 0xF6, 0xD4, 0xC3, 0xDA, 0x71, 0xD5, 0x2D, 0xDF, + 0x18, 0xD4, 0x6F, 0xF7, 0xDF, 0xD3, 0x38, 0x01, 0x99, 0xE4, 0x4B, 0x00, + 0x0A, 0xFD, 0xB8, 0x04, 0x9E, 0x0F, 0x45, 0x0C, 0xCF, 0x14, 0x54, 0x05, + 0x78, 0x02, 0x10, 0xFD, 0x5B, 0xDA, 0x4F, 0xF7, 0x62, 0xBB, 0xDF, 0xE8, + 0xC9, 0xBA, 0xDC, 0xD4, 0x4A, 0xBE, 0x34, 0xC2, 0x12, 0xBA, 0x14, 0xC4, + 0xF0, 0xB2, 0x18, 0xD4, 0x72, 0xB6, 0x32, 0xE7, 0xBB, 0xD1, 0x4A, 0xFB, + 0xEE, 0xED, 0x2B, 0x07, 0x12, 0x00, 0xD4, 0x0F, 0x5D, 0x0C, 0x7B, 0x12, + 0xC8, 0x10, 0x42, 0x15, 0xE2, 0x11, 0xEF, 0x12, 0xA0, 0x09, 0x78, 0xFE, + 0x77, 0xEC, 0x05, 0xEA, 0x80, 0xCB, 0x35, 0xDF, 0x35, 0xC8, 0x4B, 0xE1, + 0xE6, 0xD4, 0xB6, 0xDE, 0x6B, 0xE7, 0x1F, 0xD5, 0x85, 0xF6, 0x65, 0xD7, + 0x2B, 0xE5, 0xD8, 0xDF, 0xEA, 0xCB, 0x0B, 0xF1, 0xDA, 0xC2, 0x6B, 0x03, + 0x6D, 0xCE, 0xAC, 0x08, 0x4F, 0xE3, 0x83, 0xFF, 0xD0, 0xEA, 0xED, 0xF3, + 0xC1, 0xE8, 0x70, 0xEA, 0xFE, 0xDA, 0x8B, 0xDD, 0x00, 0xD0, 0xDD, 0xD1, + 0xB8, 0xCE, 0xFD, 0xD0, 0xFB, 0xD3, 0xD5, 0xDF, 0x6E, 0xE6, 0x2B, 0xF4, + 0xB3, 0xF4, 0x0B, 0x03, 0x2B, 0xF2, 0x1B, 0x0C, 0x51, 0xE6, 0x49, 0x16, + 0x2A, 0xE9, 0x68, 0x12, 0x95, 0xF6, 0x9C, 0xFA, 0x6A, 0xFC, 0x33, 0xE9, + 0xEB, 0xF4, 0x7A, 0xED, 0x57, 0xD8, 0x4A, 0xFB, 0xF0, 0xC1, 0xA2, 0xF1, + 0xE1, 0xBF, 0x79, 0xDA, 0xB5, 0xBF, 0xA4, 0xCB, 0x55, 0xC2, 0x15, 0xC6, + 0x4F, 0xC7, 0x22, 0xD3, 0xC8, 0xC0, 0xF5, 0xE7, 0x25, 0xC0, 0x9A, 0xF1, + 0xC6, 0xCD, 0x22, 0xE6, 0xAB, 0xD6, 0x48, 0xD5, 0xFA, 0xDA, 0xD3, 0xCA, + 0xDB, 0xD5, 0xB9, 0xC9, 0xF0, 0xD3, 0x91, 0xCC, 0x25, 0xDD, 0x5F, 0xC6, + 0x86, 0xE6, 0x01, 0xCA, 0x9F, 0xE7, 0x21, 0xC8, 0x09, 0xD8, 0xF1, 0xB0, + 0xA6, 0xC8, 0x34, 0xA8, 0x81, 0xC3, 0xA4, 0xAC, 0xD5, 0xC5, 0xF8, 0xAF, + 0xC5, 0xD3, 0x56, 0xB9, 0xC6, 0xE2, 0x22, 0xC9, 0x9D, 0xEA, 0x4E, 0xD4, + 0x16, 0xEA, 0xCE, 0xDA, 0xEB, 0xD5, 0xA2, 0xE8, 0x68, 0xC2, 0x46, 0xF2, + 0x6F, 0xD0, 0x41, 0xEB, 0xCC, 0xE2, 0xCA, 0xE2, 0x36, 0xDE, 0x38, 0xE7, + 0x6A, 0xDE, 0x60, 0xEC, 0x48, 0xD8, 0xDC, 0xEE, 0x56, 0xC6, 0x81, 0xED, + 0x2A, 0xC8, 0xFB, 0xE2, 0x25, 0xDC, 0x6D, 0xE1, 0x29, 0xFD, 0x29, 0xE9, + 0x59, 0x14, 0xEF, 0xF2, 0xCE, 0x0E, 0xD0, 0x04, 0xD2, 0x04, 0x53, 0x0D, + 0x38, 0xF4, 0x43, 0xFA, 0x35, 0xD5, 0xF3, 0xDD, 0xC2, 0xBD, 0x7F, 0xCA, + 0x30, 0xBA, 0x91, 0xC1, 0xEE, 0xC4, 0xA7, 0xCC, 0x74, 0xDA, 0x5E, 0xE3, + 0x24, 0xF4, 0xC0, 0xED, 0xDD, 0x04, 0xE8, 0xEE, 0x52, 0x0E, 0x7F, 0xFC, + 0x24, 0x19, 0x3C, 0x09, 0x90, 0x20, 0x9D, 0x07, 0xAF, 0x20, 0x48, 0x0E, + 0x18, 0x20, 0xBC, 0x11, 0x3B, 0x2B, 0x9A, 0x02, 0x5E, 0x2B, 0xAC, 0xF5, + 0xBA, 0x12, 0x29, 0xEC, 0x6F, 0x01, 0x40, 0xDE, 0x21, 0xF7, 0xB1, 0xD6, + 0x18, 0xEF, 0x1B, 0xD5, 0x42, 0xF4, 0x39, 0xE1, 0xF2, 0xFF, 0x7B, 0xF5, + 0xB0, 0x05, 0x4B, 0xF0, 0x93, 0xFD, 0x76, 0xE6, 0x9C, 0xEA, 0xB6, 0xED, + 0x1A, 0xE7, 0x8D, 0xEC, 0xCC, 0xF1, 0xA1, 0xE1, 0xA1, 0xF3, 0x82, 0xE5, + 0x32, 0xF9, 0xB0, 0xF9, 0x0E, 0x08, 0xA5, 0x0C, 0x16, 0x0E, 0x5F, 0x0D, + 0x8F, 0x10, 0xFF, 0x08, 0x51, 0x13, 0x7E, 0x03, 0xD4, 0x0C, 0x24, 0xFC, + 0xFF, 0x06, 0x9B, 0x09, 0x04, 0x0C, 0x52, 0x16, 0x8E, 0x10, 0x1F, 0x15, + 0xC3, 0x05, 0x66, 0x10, 0x1D, 0xF7, 0x9D, 0x08, 0x82, 0xF4, 0x90, 0xFF, + 0x8E, 0xF9, 0x4B, 0xF1, 0x70, 0xFB, 0xCB, 0xE1, 0xD2, 0xEF, 0x0E, 0xE7, + 0x0E, 0xEC, 0xE0, 0xFB, 0xA6, 0x01, 0x6A, 0x0C, 0x42, 0x17, 0xE8, 0x14, + 0x82, 0x17, 0x9D, 0x12, 0xA5, 0x0C, 0x6E, 0x09, 0xDC, 0x08, 0xC9, 0xFF, + 0x37, 0x04, 0x24, 0xFC, 0xE3, 0x05, 0x7D, 0xFA, 0x79, 0x0F, 0x9D, 0xF8, + 0x36, 0x0A, 0x2F, 0xF1, 0x50, 0x00, 0x30, 0xDC, 0xD4, 0xFF, 0xC1, 0xD6, + 0xF3, 0x04, 0x1E, 0xE1, 0x31, 0x09, 0x78, 0xE2, 0xCE, 0x0A, 0x1B, 0xE4, + 0x82, 0x0F, 0xE0, 0xEE, 0x81, 0x18, 0xB4, 0xF4, 0x0B, 0x1F, 0x8E, 0xEF, + 0xEE, 0x19, 0x5B, 0xF4, 0x1A, 0x0D, 0x5C, 0xFE, 0x31, 0x00, 0x9F, 0xFD, + 0xFD, 0xF5, 0xE3, 0xF2, 0x8C, 0xF4, 0xFC, 0xE6, 0xA0, 0x05, 0x0B, 0xE6, + 0xC9, 0x10, 0xC7, 0xE5, 0xEE, 0x03, 0xB9, 0xE6, 0x23, 0xFA, 0x2E, 0xF0, + 0x72, 0xFA, 0x68, 0x04, 0x10, 0xFD, 0x0C, 0x14, 0xC5, 0x0F, 0x61, 0x09, + 0x83, 0x32, 0xEE, 0x06, 0xD5, 0x48, 0xD6, 0x13, 0x04, 0x48, 0x47, 0x1E, + 0x1B, 0x37, 0xFB, 0x26, 0x8A, 0x14, 0xBE, 0x23, 0x09, 0xF6, 0x9D, 0x0A, + 0xAA, 0xE6, 0x8A, 0xE5, 0xF4, 0xDC, 0x98, 0xD9, 0x58, 0xE1, 0x6B, 0xE1, + 0x8E, 0xE3, 0x4F, 0xF2, 0xB3, 0xE4, 0x64, 0x0A, 0xAC, 0xF9, 0x24, 0x20, + 0x28, 0x12, 0xF8, 0x38, 0x0F, 0x24, 0x69, 0x4B, 0x0F, 0x35, 0x4A, 0x57, + 0x46, 0x4A, 0x47, 0x58, 0x9B, 0x61, 0xD6, 0x49, 0xCA, 0x5C, 0xFC, 0x39, + 0xBD, 0x39, 0x15, 0x2B, 0xED, 0x1B, 0x31, 0x1F, 0x19, 0x05, 0x8F, 0x17, + 0x48, 0x00, 0x53, 0x07, 0x38, 0x17, 0x69, 0x00, 0xF1, 0x26, 0x9F, 0x11, + 0x22, 0x27, 0x0A, 0x13, 0xC3, 0x20, 0xE2, 0x07, 0x21, 0x1F, 0xA5, 0x0C, + 0x08, 0x25, 0xD1, 0x18, 0x2A, 0x26, 0x2A, 0x23, 0x1F, 0x29, 0x12, 0x28, + 0x20, 0x2E, 0xF1, 0x2A, 0xB5, 0x34, 0x48, 0x26, 0xA9, 0x3E, 0xB0, 0x1A, + 0xC7, 0x42, 0x76, 0x11, 0x38, 0x34, 0x22, 0x0F, 0x11, 0x1F, 0x5C, 0x19, + 0x06, 0x21, 0xC5, 0x23, 0x5B, 0x35, 0xE2, 0x2B, 0xB9, 0x47, 0xE9, 0x31, + 0xD3, 0x4D, 0xCC, 0x31, 0x87, 0x43, 0xB9, 0x2A, 0xB2, 0x2B, 0x31, 0x22, + 0xB3, 0x0F, 0xDF, 0x23, 0x95, 0xFA, 0xE7, 0x1F, 0x5D, 0xFB, 0x8F, 0x19, + 0x28, 0x08, 0xB3, 0x1E, 0x5C, 0x0B, 0xEC, 0x1F, 0xA0, 0x0A, 0x7C, 0x18, + 0xAB, 0x06, 0xB3, 0x18, 0xA2, 0x01, 0x37, 0x17, 0xD5, 0x03, 0x6D, 0x08, + 0xF6, 0x0F, 0x43, 0xFC, 0xDC, 0x19, 0x62, 0xF9, 0xDF, 0x0C, 0x9C, 0x03, + 0x49, 0xF3, 0xBB, 0x0F, 0x5F, 0xE9, 0x03, 0x12, 0xE5, 0xF9, 0x42, 0x0C, + 0x46, 0x13, 0x8C, 0xFE, 0xE2, 0x14, 0xFF, 0xF4, 0x0A, 0x06, 0xB7, 0xF4, + 0x87, 0xF7, 0x46, 0xF8, 0xA6, 0xF5, 0x30, 0xF9, 0x7F, 0x05, 0x94, 0xF4, + 0x35, 0x14, 0x39, 0xF6, 0xF3, 0x10, 0xA0, 0x06, 0xC1, 0x00, 0x0C, 0x13, + 0x2D, 0xFE, 0x49, 0x13, 0xAC, 0x03, 0xFD, 0x13, 0xB6, 0xFB, 0x99, 0x12, + 0xB2, 0xEC, 0xFA, 0x0E, 0xA6, 0xE7, 0xF5, 0x14, 0xFC, 0xF2, 0x7A, 0x1E, + 0x5D, 0xFF, 0xE8, 0x22, 0xEC, 0x01, 0x78, 0x2D, 0x3D, 0x0E, 0x60, 0x39, + 0x8E, 0x22, 0x28, 0x32, 0xC5, 0x2B, 0xDF, 0x24, 0x9F, 0x35, 0x46, 0x27, + 0xBF, 0x42, 0x2F, 0x3A, 0x52, 0x40, 0x42, 0x4E, 0x12, 0x2F, 0x40, 0x4B, + 0x5F, 0x1B, 0xA4, 0x35, 0x13, 0x0D, 0xD5, 0x17, 0x55, 0xFB, 0x7C, 0x02, + 0x85, 0xE3, 0xB0, 0x02, 0xAB, 0xE3, 0x71, 0x05, 0x0E, 0xFE, 0xD0, 0x0B, + 0x1E, 0x18, 0x00, 0x20, 0xB0, 0x2E, 0x8E, 0x39, 0xC3, 0x44, 0x78, 0x51, + 0x4A, 0x57, 0x89, 0x5E, 0x45, 0x65, 0x3B, 0x5A, 0x19, 0x63, 0xB5, 0x51, + 0x9E, 0x52, 0x61, 0x4C, 0xFA, 0x3D, 0xEE, 0x3D, 0xA3, 0x24, 0x1D, 0x29, + 0x1F, 0x23, 0xCF, 0x11, 0x4A, 0x2D, 0x3F, 0x03, 0x3B, 0x1A, 0x45, 0x0C, + 0x47, 0x05, 0x31, 0x1C, 0x8E, 0x06, 0xE8, 0x2B, 0xC2, 0x10, 0xA3, 0x37, + 0xCA, 0x1B, 0x9A, 0x34, 0xD1, 0x22, 0x72, 0x30, 0x40, 0x1C, 0xFB, 0x2F, + 0x69, 0x12, 0x5A, 0x27, 0x23, 0x15, 0xB9, 0x1B, 0x52, 0x19, 0x04, 0x15, + 0x7E, 0x1B, 0x36, 0x14, 0x4D, 0x16, 0x4E, 0x1F, 0x9B, 0x16, 0xEE, 0x28, + 0x19, 0x21, 0xA2, 0x28, 0x7D, 0x24, 0xE1, 0x27, 0x4F, 0x28, 0xAC, 0x1E, + 0x24, 0x26, 0x49, 0x13, 0xA5, 0x21, 0x46, 0x10, 0x44, 0x20, 0xF6, 0x16, + 0xC6, 0x19, 0x67, 0x1D, 0x97, 0x11, 0x91, 0x19, 0x3E, 0x00, 0xBC, 0x18, + 0xB6, 0xE9, 0x34, 0x13, 0x80, 0xE1, 0xB6, 0x01, 0x24, 0xE9, 0x72, 0xF6, + 0x2B, 0xF4, 0x7C, 0xFC, 0x7D, 0xF2, 0x24, 0x08, 0x0A, 0xEA, 0x6B, 0x0F, + 0x1F, 0xDB, 0x10, 0x11, 0x24, 0xD5, 0x70, 0x03, 0xF0, 0xDB, 0x18, 0xF2, + 0xBC, 0xD3, 0xA9, 0xE6, 0x09, 0xC9, 0x1F, 0xE0, 0xAA, 0xD0, 0x97, 0xE1, + 0xA8, 0xDE, 0x26, 0xD6, 0x11, 0xD5, 0x9A, 0xC1, 0x5E, 0xC3, 0x5F, 0xC3, + 0x5A, 0xC5, 0x12, 0xD2, 0xB9, 0xD0, 0xDD, 0xCE, 0x0A, 0xD2, 0x8F, 0xC6, + 0xE5, 0xCA, 0x91, 0xCD, 0x0F, 0xCB, 0xD9, 0xCB, 0x96, 0xD3, 0xB9, 0xC3, + 0x08, 0xDB, 0x92, 0xC3, 0xC0, 0xD4, 0xD8, 0xC5, 0xEE, 0xC7, 0x42, 0xC1, + 0xB0, 0xBB, 0xB9, 0xC5, 0xDE, 0xB5, 0xA9, 0xD5, 0xA1, 0xC1, 0x62, 0xD1, + 0x22, 0xD2, 0xD8, 0xC7, 0xA3, 0xD5, 0x57, 0xCA, 0x77, 0xC8, 0x98, 0xD1, + 0x97, 0xBD, 0xFF, 0xD0, 0xDB, 0xC5, 0x49, 0xCD, 0xBF, 0xE3, 0x62, 0xCE, + 0xA7, 0x03, 0x58, 0xD9, 0xAF, 0x0A, 0xF9, 0xF1, 0xC5, 0x06, 0x31, 0xFF, + 0x31, 0x02, 0xA8, 0xFB, 0xE5, 0xFA, 0xAA, 0xEA, 0x89, 0xE0, 0x63, 0xCD, + 0xE8, 0xB2, 0x2C, 0xBB, 0x1B, 0x9B, 0x36, 0xB0, 0xDC, 0x9D, 0xD7, 0xA1, + 0xAE, 0xB1, 0x46, 0xA1, 0x9D, 0xCF, 0xD0, 0xB6, 0x18, 0xDF, 0x8E, 0xD8, + 0x44, 0xEB, 0x60, 0xF8, 0x33, 0x07, 0x66, 0x10, 0x13, 0x19, 0x72, 0x23, + 0xB1, 0x17, 0x40, 0x20, 0xB2, 0x18, 0x1E, 0x06, 0x8A, 0x12, 0x20, 0xF0, + 0x1C, 0xF8, 0xBE, 0xDD, 0xAC, 0xDB, 0x0A, 0xCB, 0x9C, 0xC8, 0xCB, 0xC0, + 0x10, 0xC3, 0xB0, 0xBC, 0xEC, 0xC6, 0xD6, 0xC2, 0x17, 0xD3, 0xF4, 0xCD, + 0x87, 0xE2, 0xE0, 0xD5, 0xEA, 0xE2, 0x73, 0xDD, 0x2F, 0xDE, 0xC1, 0xDE, + 0xC4, 0xDE, 0x11, 0xDC, 0x23, 0xDC, 0xCC, 0xE2, 0xEC, 0xD9, 0x46, 0xF1, + 0xEA, 0xDE, 0x97, 0xF9, 0x8C, 0xE0, 0xEE, 0xFA, 0x80, 0xE8, 0x72, 0xF1, + 0xE5, 0xF7, 0x6D, 0xEA, 0xE8, 0xFB, 0x10, 0xED, 0x84, 0xF9, 0xCC, 0xE7, + 0x97, 0xF1, 0xF4, 0xE8, 0xDE, 0xEB, 0xD5, 0xF4, 0x89, 0xFA, 0x8D, 0xFE, + 0x99, 0x04, 0x58, 0x02, 0x1A, 0xF5, 0x74, 0x04, 0x5E, 0xEA, 0x2E, 0x03, + 0x88, 0xED, 0x41, 0xF3, 0x52, 0xED, 0x6E, 0xE4, 0x0F, 0xEA, 0x24, 0xEB, + 0x0F, 0xEB, 0x2D, 0xFA, 0x75, 0xE9, 0x7A, 0x05, 0xC1, 0xE2, 0x7F, 0x11, + 0xED, 0xEA, 0x20, 0x17, 0x5C, 0xFC, 0xEC, 0x0F, 0xAD, 0xFE, 0x73, 0xFC, + 0xC3, 0xF5, 0xF9, 0xE9, 0xB7, 0xF3, 0xB5, 0xDF, 0x6F, 0xF6, 0x99, 0xDB, + 0x4D, 0xF1, 0xE4, 0xD9, 0xB4, 0xF2, 0x38, 0xE2, 0xA8, 0xFD, 0x31, 0xF0, + 0x4F, 0x04, 0x19, 0xEC, 0x18, 0x06, 0xA0, 0xE2, 0xA8, 0x08, 0xB6, 0xE4, + 0x4B, 0x0D, 0x31, 0xDE, 0x2B, 0x0A, 0x87, 0xD0, 0xF9, 0x06, 0x89, 0xD7, + 0xC9, 0x0C, 0x61, 0xE6, 0x33, 0x06, 0xDB, 0xE8, 0xD9, 0xE9, 0x90, 0xED, + 0xF4, 0xDC, 0x1B, 0xF5, 0xFA, 0xEF, 0x7A, 0xE9, 0xD5, 0x01, 0xDB, 0xD8, + 0x3E, 0x05, 0xA3, 0xD5, 0x40, 0x09, 0x5F, 0xE1, 0xAD, 0x08, 0x9B, 0xF1, + 0xA0, 0xFC, 0xC3, 0xFB, 0x1C, 0xF7, 0x83, 0x00, 0x0D, 0x03, 0x3D, 0xFD, + 0x8A, 0x0A, 0x2F, 0x03, 0xD3, 0x01, 0x08, 0x10, 0xE7, 0x05, 0x12, 0x16, + 0x22, 0x1C, 0x07, 0x19, 0x93, 0x25, 0xC1, 0x0F, 0xEB, 0x0C, 0xE6, 0xFD, + 0x48, 0xE8, 0x05, 0xF1, 0x4D, 0xD5, 0x6F, 0xE4, 0x1B, 0xCE, 0x5C, 0xD6, + 0x04, 0xC8, 0x81, 0xD4, 0xB6, 0xC9, 0xE3, 0xDF, 0x98, 0xDA, 0xF8, 0xF6, + 0x4A, 0xF4, 0xD0, 0x15, 0x8D, 0x12, 0xAC, 0x2A, 0x86, 0x2D, 0x4B, 0x3C, + 0xB5, 0x3E, 0xC1, 0x4E, 0x8D, 0x3F, 0xDA, 0x4D, 0x8E, 0x2B, 0x48, 0x39, + 0x1C, 0x19, 0x05, 0x18, 0xEB, 0x0B, 0x2D, 0x00, 0x79, 0xF2, 0xF1, 0xFA, + 0x8F, 0xE1, 0x91, 0xF3, 0x9E, 0xEA, 0x89, 0xF4, 0x3E, 0xFE, 0x9F, 0xF8, + 0x01, 0x11, 0x8D, 0xF5, 0x99, 0x18, 0xEA, 0xFB, 0x76, 0x0D, 0xE7, 0x06, + 0x0B, 0xFD, 0x54, 0x0E, 0x21, 0xF6, 0xB3, 0x14, 0x1A, 0xFC, 0x23, 0x18, + 0x6B, 0x04, 0xAE, 0x15, 0xD8, 0x07, 0x93, 0x0F, 0x3C, 0x1B, 0x6D, 0x04, + 0x0B, 0x2F, 0x0A, 0xFD, 0x70, 0x24, 0x97, 0xFE, 0xEC, 0x0D, 0x09, 0x06, + 0x6B, 0x06, 0x35, 0x0A, 0x81, 0x1C, 0xB8, 0x01, 0x6C, 0x3C, 0xC8, 0xFE, + 0x00, 0x45, 0x9C, 0x07, 0x0E, 0x3A, 0xED, 0x0F, 0x10, 0x29, 0x6E, 0x0C, + 0x24, 0x19, 0xFC, 0x02, 0x88, 0x15, 0x5F, 0xF7, 0x3D, 0x17, 0x2D, 0xF0, + 0x42, 0x09, 0x35, 0xF3, 0xBC, 0xF0, 0xC4, 0xF7, 0x6D, 0xE2, 0xBC, 0x00, + 0x0E, 0xEB, 0xC8, 0x04, 0x64, 0x01, 0x3E, 0xFD, 0x89, 0x10, 0x38, 0xF3, + 0x98, 0x18, 0x0D, 0xE9, 0xFE, 0x19, 0x2A, 0xE3, 0x70, 0x0E, 0x2A, 0xE9, + 0x6C, 0xFB, 0x8B, 0xF0, 0x19, 0xF1, 0x81, 0xEA, 0xAB, 0xEE, 0xD5, 0xE2, + 0xCF, 0xEC, 0xE6, 0xE3, 0xFD, 0xF2, 0x4F, 0xE4, 0xEB, 0xF6, 0x1A, 0xE3, + 0xBC, 0xDD, 0x89, 0xDB, 0x93, 0xC4, 0x6F, 0xD6, 0xF3, 0xD4, 0x52, 0xD4, + 0xB4, 0xEF, 0x77, 0xCE, 0x0D, 0xFA, 0x6B, 0xD3, 0xBF, 0xFC, 0x8C, 0xE2, + 0x3F, 0xFF, 0x17, 0xF0, 0x5F, 0xF4, 0xC4, 0xF0, 0xD1, 0xE2, 0xDC, 0xEC, + 0xA8, 0xE9, 0x6A, 0xE8, 0xAC, 0xF4, 0x18, 0xE4, 0xE5, 0xED, 0xF2, 0xE9, + 0x59, 0xE5, 0x6E, 0xF5, 0x3B, 0xEA, 0x92, 0xF6, 0x0C, 0xF2, 0x4C, 0xE8, + 0xBD, 0xE8, 0x9D, 0xE2, 0xB4, 0xE7, 0xF8, 0xEA, 0x62, 0xFE, 0xC0, 0xFA, + 0x27, 0x18, 0x60, 0x10, 0xC5, 0x2B, 0xAA, 0x1B, 0xFF, 0x33, 0x3F, 0x20, + 0x4A, 0x24, 0x94, 0x20, 0x1F, 0x02, 0xAA, 0x11, 0xA0, 0xEA, 0x53, 0xF7, + 0xB6, 0xDB, 0x9F, 0xE7, 0xFE, 0xCF, 0xCE, 0xE1, 0x86, 0xD2, 0xDF, 0xE4, + 0xC3, 0xE9, 0x80, 0xF7, 0x4D, 0x0D, 0x68, 0x09, 0xA1, 0x28, 0x7D, 0x27, + 0x4B, 0x40, 0xC4, 0x46, 0xC4, 0x57, 0x6C, 0x52, 0x23, 0x66, 0x2E, 0x55, + 0x87, 0x64, 0xE6, 0x4D, 0x63, 0x53, 0x4F, 0x3B, 0x32, 0x42, 0x7E, 0x24, + 0x1A, 0x30, 0xF0, 0x19, 0xDC, 0x1B, 0x51, 0x15, 0xC2, 0x16, 0xEB, 0x0F, + 0x15, 0x1F, 0x72, 0x18, 0x3C, 0x1F, 0x07, 0x30, 0x45, 0x1B, 0x20, 0x38, + 0xFC, 0x24, 0x77, 0x29, 0xA3, 0x33, 0xD8, 0x24, 0x12, 0x3F, 0xE5, 0x23, + 0x96, 0x34, 0xA0, 0x24, 0xFC, 0x1C, 0x84, 0x2E, 0x72, 0x24, 0x02, 0x33, + 0xBB, 0x3D, 0x0A, 0x37, 0x31, 0x49, 0x1D, 0x34, 0x6A, 0x48, 0x47, 0x33, + 0xD1, 0x48, 0xAF, 0x43, 0x8D, 0x46, 0xD9, 0x47, 0xF0, 0x3B, 0x0D, 0x3A, + 0x14, 0x31, 0x3D, 0x3B, 0x5C, 0x2E, 0x3D, 0x49, 0x65, 0x34, 0x75, 0x49, + 0x7C, 0x37, 0x5B, 0x4A, 0xBC, 0x36, 0x3D, 0x58, 0xFC, 0x31, 0x37, 0x5B, + 0x4F, 0x2D, 0x23, 0x48, 0x66, 0x2D, 0x42, 0x34, 0x1A, 0x2B, 0xB0, 0x2F, + 0x31, 0x2B, 0x3C, 0x31, 0x82, 0x21, 0x9E, 0x3A, 0xF1, 0x10, 0xD5, 0x48, + 0x3C, 0x0F, 0x4A, 0x49, 0xCF, 0x07, 0xE1, 0x43, 0x63, 0x00, 0xBD, 0x3F, + 0x93, 0x09, 0x2E, 0x34, 0xC9, 0x0D, 0x72, 0x25, 0x5B, 0x07, 0xD1, 0x1B, + 0x2C, 0x0C, 0x48, 0x15, 0x0D, 0x1D, 0x15, 0x14, 0xE3, 0x1E, 0xDE, 0x14, + 0x52, 0x16, 0x70, 0x12, 0x49, 0x16, 0xD5, 0x11, 0xCB, 0x1C, 0x79, 0x12, + 0x6A, 0x1C, 0xE5, 0x10, 0x6E, 0x17, 0x28, 0x0C, 0xCD, 0x20, 0x49, 0x07, + 0x8E, 0x28, 0x5F, 0x07, 0xEC, 0x1C, 0x67, 0x13, 0x33, 0x0C, 0x5B, 0x23, + 0xE6, 0x02, 0x34, 0x27, 0xB5, 0x07, 0x77, 0x23, 0xBA, 0x17, 0x6E, 0x22, + 0x07, 0x28, 0x52, 0x25, 0x9F, 0x28, 0xE4, 0x26, 0xD0, 0x1D, 0x26, 0x23, + 0xA6, 0x14, 0x18, 0x1D, 0xC6, 0x10, 0x5A, 0x1E, 0x1C, 0x17, 0x72, 0x27, + 0x73, 0x29, 0xA6, 0x3A, 0x7B, 0x3C, 0x22, 0x49, 0x6C, 0x41, 0x86, 0x4C, + 0xD2, 0x41, 0x65, 0x56, 0xC3, 0x42, 0x93, 0x59, 0xBB, 0x37, 0xCF, 0x48, + 0x3C, 0x20, 0xAF, 0x2E, 0xBF, 0x02, 0xA0, 0x18, 0xED, 0xEE, 0x1A, 0x07, + 0x82, 0xF5, 0x1E, 0xFD, 0xCF, 0x06, 0xC2, 0x03, 0xBB, 0x16, 0xDB, 0x18, + 0x71, 0x2E, 0x70, 0x2D, 0x91, 0x4B, 0x20, 0x43, 0xA6, 0x5C, 0x59, 0x5E, + 0xBE, 0x5E, 0xE6, 0x61, 0x13, 0x53, 0xFE, 0x4E, 0xC5, 0x3C, 0x16, 0x38, + 0xB6, 0x2F, 0x64, 0x21, 0xA0, 0x24, 0xEE, 0x1B, 0xE0, 0x11, 0xDA, 0x1D, + 0xCC, 0xFF, 0x19, 0x1E, 0x4A, 0xF6, 0xF6, 0x26, 0x66, 0x02, 0x6C, 0x26, + 0xDA, 0x16, 0x4D, 0x19, 0x19, 0x17, 0xF7, 0x0E, 0x6A, 0x0D, 0x26, 0x07, + 0xE2, 0x03, 0xD3, 0x03, 0x93, 0xF7, 0x57, 0x0A, 0x09, 0xF6, 0x98, 0x13, + 0x81, 0xF9, 0xBD, 0x17, 0x62, 0xF2, 0x7E, 0x19, 0x37, 0xEB, 0xE9, 0x19, + 0x2A, 0xEC, 0x4F, 0x12, 0xB7, 0xFC, 0xED, 0x03, 0x6E, 0x0D, 0xBD, 0x00, + 0xA5, 0x04, 0x53, 0x0B, 0xDA, 0xF7, 0xD3, 0x0C, 0x9B, 0xF1, 0x49, 0x08, + 0x19, 0xFA, 0xE4, 0x07, 0xC3, 0x07, 0x4F, 0x05, 0x68, 0xFF, 0x42, 0x05, + 0x67, 0xF5, 0x55, 0x03, 0x53, 0xF3, 0xAF, 0xF6, 0xA7, 0xE9, 0x20, 0xE6, + 0xE7, 0xDD, 0xC2, 0xDF, 0xE8, 0xD5, 0x8A, 0xEA, 0xE6, 0xD3, 0x71, 0xF8, + 0x5D, 0xDF, 0x2C, 0x00, 0x43, 0xEF, 0xBA, 0x09, 0x82, 0xF6, 0x08, 0x0E, + 0x89, 0xF3, 0xD6, 0x02, 0xBD, 0xDF, 0xB2, 0xEB, 0x43, 0xCC, 0x0F, 0xDC, + 0xAC, 0xCC, 0xB8, 0xD5, 0xF3, 0xCF, 0xFF, 0xD4, 0x28, 0xCD, 0xB7, 0xD9, + 0x6F, 0xCA, 0xEE, 0xD6, 0x50, 0xD1, 0x81, 0xD1, 0x17, 0xDC, 0x66, 0xC8, + 0xB7, 0xDF, 0x0A, 0xC4, 0x51, 0xDB, 0x71, 0xC9, 0x61, 0xD4, 0x7F, 0xCC, + 0x3A, 0xDC, 0x40, 0xCC, 0x1E, 0xEB, 0xBA, 0xD3, 0x88, 0xE8, 0x30, 0xE1, + 0x02, 0xDD, 0xAA, 0xDF, 0x08, 0xD9, 0xDB, 0xC9, 0xD1, 0xD5, 0x89, 0xAE, + 0xE4, 0xC4, 0xD1, 0xA5, 0xA2, 0xBC, 0x15, 0xB3, 0xE0, 0xC7, 0x73, 0xC1, + 0xBB, 0xCC, 0x73, 0xC2, 0x9A, 0xCC, 0x34, 0xC0, 0x1B, 0xD4, 0x22, 0xCC, + 0xDE, 0xDA, 0xAC, 0xDA, 0xBF, 0xDA, 0x6A, 0xE2, 0xD5, 0xE0, 0xCD, 0xEB, + 0x2F, 0xF0, 0xB6, 0xFB, 0x04, 0x00, 0x43, 0x05, 0xBB, 0xFE, 0x7D, 0x00, + 0x3C, 0xDF, 0x3C, 0xF7, 0xE0, 0xB6, 0xD4, 0xDF, 0xED, 0x9F, 0x19, 0xC2, + 0xEB, 0xA1, 0x7F, 0xB0, 0xF1, 0xB1, 0x53, 0xAC, 0x75, 0xC2, 0x11, 0xBE, + 0xB6, 0xCF, 0xED, 0xE4, 0xEA, 0xE4, 0xF8, 0x12, 0xA5, 0x06, 0x2F, 0x30, + 0x13, 0x18, 0xB7, 0x39, 0x7C, 0x0F, 0x12, 0x39, 0xB1, 0x04, 0x98, 0x26, + 0x89, 0xFB, 0xF6, 0x0A, 0x30, 0xE9, 0x7A, 0xF5, 0x90, 0xE0, 0x50, 0xE7, + 0x88, 0xEC, 0xBC, 0xDE, 0x7E, 0xEA, 0x1D, 0xDC, 0x26, 0xDB, 0xE6, 0xDB, + 0xEC, 0xD8, 0x3B, 0xE2, 0x10, 0xE5, 0xCB, 0xE7, 0x98, 0xFC, 0x8A, 0xDB, + 0x6A, 0x01, 0x60, 0xDB, 0x44, 0xF6, 0xE2, 0xE9, 0x4C, 0xF7, 0x35, 0xEF, + 0x03, 0xF6, 0x74, 0xF7, 0xCA, 0xF3, 0x40, 0xFF, 0xC8, 0x06, 0xD8, 0xFE, + 0xE1, 0x1A, 0x8F, 0x00, 0xF9, 0x1D, 0x3B, 0x05, 0x0A, 0x1B, 0x78, 0x01, + 0x15, 0x10, 0x98, 0xFC, 0x25, 0x01, 0x47, 0xFD, 0xAB, 0xFE, 0x49, 0xF7, + 0x29, 0x15, 0x53, 0xEC, 0x67, 0x24, 0x1C, 0xF1, 0x9E, 0x17, 0x1F, 0x01, + 0xE8, 0x12, 0x18, 0x03, 0xF2, 0x16, 0x50, 0xF8, 0x5C, 0x0E, 0xE5, 0xED, + 0xE4, 0xFC, 0x3C, 0xEF, 0x53, 0xEE, 0xE3, 0xF6, 0xD7, 0xE5, 0x78, 0xF6, + 0x70, 0xE4, 0xBD, 0xEC, 0x47, 0xEA, 0xE0, 0xE4, 0xF1, 0xEE, 0xF9, 0xE1, + 0x67, 0xEE, 0x49, 0xDE, 0xFA, 0xE1, 0x00, 0xE0, 0x0E, 0xD5, 0x11, 0xE3, + 0xFB, 0xD2, 0x1C, 0xDD, 0x09, 0xD0, 0x73, 0xD3, 0x18, 0xD2, 0x17, 0xCD, + 0x69, 0xDC, 0xC8, 0xC4, 0x7D, 0xE1, 0x27, 0xBE, 0x97, 0xD8, 0x35, 0xC5, + 0xB5, 0xCC, 0x87, 0xD8, 0xC3, 0xC9, 0x9C, 0xE5, 0xA7, 0xCF, 0x4B, 0xDF, + 0x58, 0xE1, 0xB8, 0xD2, 0xBA, 0xEF, 0x7D, 0xCE, 0xDC, 0xED, 0x0A, 0xC7, + 0xD0, 0xE1, 0xCC, 0xC0, 0x7D, 0xD5, 0x9C, 0xC0, 0x5F, 0xD0, 0x03, 0xB5, + 0xE8, 0xCA, 0x85, 0xB1, 0xD9, 0xBE, 0x63, 0xC8, 0x72, 0xB7, 0xA8, 0xDD, + 0x09, 0xBF, 0xEF, 0xDE, 0x7A, 0xCC, 0x09, 0xDC, 0xB9, 0xD5, 0xFF, 0xDE, + 0xDB, 0xDB, 0xF8, 0xE1, 0x63, 0xE4, 0xAF, 0xEC, 0xD0, 0xF0, 0xCC, 0xF8, + 0x5C, 0xFA, 0x12, 0xFE, 0xA0, 0xFD, 0x50, 0x00, 0xD7, 0xEF, 0x23, 0xF7, + 0xC0, 0xCF, 0x89, 0xE0, 0x49, 0xB4, 0x0A, 0xC4, 0xC9, 0xA8, 0x1F, 0xAC, + 0xEF, 0xA6, 0x41, 0x9F, 0x54, 0xA7, 0x4E, 0xA5, 0x3B, 0xB4, 0x00, 0xC0, + 0xA8, 0xDA, 0x9F, 0xDE, 0x14, 0x11, 0x76, 0xFF, 0x5C, 0x33, 0xF7, 0x20, + 0x28, 0x33, 0x70, 0x26, 0x54, 0x24, 0x54, 0x15, 0x65, 0x0B, 0xB6, 0x02, + 0xA5, 0xEF, 0xD5, 0xE7, 0x96, 0xE3, 0xE4, 0xCB, 0x66, 0xE7, 0xF5, 0xBE, + 0x37, 0xEA, 0x1F, 0xC3, 0x25, 0xE7, 0xFB, 0xCF, 0xC5, 0xF1, 0x50, 0xDC, + 0x29, 0xFF, 0xEF, 0xE8, 0x73, 0xF9, 0x2B, 0xEA, 0x50, 0xEF, 0x82, 0xDF, + 0x9D, 0xE8, 0xFA, 0xDE, 0x8E, 0xEC, 0x22, 0xE1, 0x88, 0xF6, 0xC4, 0xE2, + 0x5A, 0xF7, 0x1A, 0xEA, 0x7E, 0xF4, 0x4B, 0xF1, 0xB1, 0xEC, 0x6C, 0xFE, + 0x69, 0xEA, 0xD4, 0x05, 0xA1, 0x00, 0xAB, 0xFF, 0x17, 0x17, 0x69, 0xF9, + 0x64, 0x11, 0x98, 0xF9, 0xD1, 0x0C, 0x61, 0xF9, 0x52, 0x1C, 0xDF, 0xF6, + 0xE6, 0x21, 0xDC, 0xF4, 0x6D, 0x0E, 0x73, 0xF4, 0xCD, 0xFF, 0xB0, 0x00, + 0xF6, 0x0E, 0x75, 0x0D, 0x21, 0x1D, 0x8D, 0x0D, 0xDD, 0x0E, 0xB9, 0x06, + 0x85, 0xF8, 0x70, 0x00, 0xAA, 0xE8, 0x72, 0xF9, 0x27, 0xE3, 0x51, 0xEF, + 0xD6, 0xF0, 0x95, 0xEE, 0x19, 0x06, 0xA4, 0xF5, 0x84, 0x10, 0x75, 0xFF, + 0xAD, 0x08, 0x6C, 0x0C, 0x03, 0xFA, 0x62, 0x14, 0x92, 0xF3, 0x53, 0x13, + 0xD8, 0xEF, 0x42, 0x0C, 0xB1, 0xE1, 0x4B, 0x09, 0x4C, 0xD4, 0x4E, 0x04, + 0xBD, 0xD7, 0x2E, 0xF6, 0x3A, 0xE7, 0xD7, 0xED, 0xBA, 0xF1, 0xF2, 0xF0, + 0x10, 0xEF, 0x1F, 0xF9, 0xD8, 0xE8, 0xD6, 0xFF, 0xA0, 0xED, 0x64, 0x02, + 0x9A, 0x00, 0x9D, 0xFD, 0xD4, 0x1B, 0x81, 0xF0, 0x6D, 0x26, 0x3A, 0xE8, + 0x4B, 0x15, 0xF1, 0xEE, 0xA8, 0x05, 0xB5, 0xF1, 0xFD, 0xFD, 0x1B, 0xEC, + 0x0D, 0xF3, 0xE8, 0xF3, 0x98, 0xEF, 0xC5, 0xFE, 0x72, 0xF9, 0x5A, 0x02, + 0x17, 0x0B, 0x63, 0x04, 0xA6, 0x19, 0x82, 0xFF, 0xD2, 0x20, 0x95, 0xFD, + 0x47, 0x23, 0x93, 0x09, 0x98, 0x22, 0x16, 0x1D, 0xA9, 0x2C, 0x6E, 0x2F, + 0xEC, 0x43, 0xBA, 0x43, 0xE8, 0x52, 0x3D, 0x4A, 0xAF, 0x47, 0x10, 0x37, + 0x08, 0x25, 0x8B, 0x14, 0x5E, 0xFD, 0x1A, 0xED, 0xAA, 0xDE, 0x47, 0xD7, + 0xD6, 0xD4, 0xB2, 0xDD, 0x95, 0xE8, 0xA8, 0xFA, 0x1D, 0x03, 0x10, 0x21, + 0x31, 0x1A, 0xFC, 0x47, 0x8D, 0x3E, 0x5E, 0x62, 0x95, 0x5F, 0xC9, 0x64, + 0xB6, 0x65, 0x3B, 0x5C, 0x77, 0x56, 0x8D, 0x4C, 0x0F, 0x44, 0x4E, 0x2F, + 0x96, 0x31, 0xF5, 0x11, 0x78, 0x1A, 0x13, 0x0B, 0x28, 0x06, 0x3A, 0x0C, + 0x27, 0xFB, 0x71, 0x11, 0x18, 0x08, 0x91, 0x1C, 0x37, 0x20, 0x5C, 0x19, + 0xB3, 0x24, 0x81, 0x19, 0xD3, 0x1D, 0xBC, 0x21, 0x95, 0x19, 0x47, 0x1E, + 0xA2, 0x17, 0x38, 0x18, 0x6D, 0x22, 0x19, 0x15, 0x1C, 0x3C, 0x87, 0x14, + 0xCA, 0x40, 0x72, 0x1C, 0xC0, 0x2C, 0xFB, 0x27, 0x62, 0x23, 0xEC, 0x34, + 0x24, 0x26, 0x3D, 0x3D, 0x8D, 0x2E, 0x8D, 0x34, 0x92, 0x30, 0x18, 0x28, + 0xE0, 0x2A, 0x8B, 0x24, 0xF7, 0x29, 0x36, 0x28, 0xD4, 0x26, 0xA7, 0x2F, + 0x5C, 0x23, 0x11, 0x2D, 0xF1, 0x22, 0xCB, 0x2A, 0x72, 0x29, 0x06, 0x31, + 0xFA, 0x2A, 0xCD, 0x2F, 0xF7, 0x26, 0x29, 0x22, 0xE2, 0x2D, 0x3B, 0x14, + 0xC8, 0x31, 0x98, 0x13, 0xDE, 0x24, 0xE0, 0x1A, 0x60, 0x17, 0x88, 0x20, + 0xBB, 0x18, 0xF4, 0x1E, 0xF2, 0x16, 0x94, 0x21, 0x7E, 0x10, 0x73, 0x2D, + 0x2A, 0x18, 0xB1, 0x31, 0x5B, 0x23, 0x8C, 0x31, 0x0B, 0x22, 0x30, 0x26, + 0xC5, 0x17, 0x3D, 0x16, 0x12, 0x07, 0x1B, 0x14, 0x92, 0xF5, 0x97, 0x17, + 0xAA, 0xF3, 0x08, 0x17, 0xF1, 0x02, 0x94, 0x11, 0x48, 0x19, 0xF8, 0x0C, + 0x21, 0x1F, 0x79, 0x12, 0xE4, 0x0E, 0x82, 0x23, 0x73, 0x0A, 0xBE, 0x23, + 0xF0, 0x0F, 0xE4, 0x0C, 0x46, 0x10, 0x45, 0xF7, 0x93, 0x11, 0x3C, 0xEF, + 0xC0, 0x0B, 0x4E, 0xF7, 0xA6, 0xFF, 0x45, 0x00, 0x33, 0xF6, 0xC7, 0xFE, + 0xBE, 0xF7, 0x05, 0xFF, 0xC0, 0xFB, 0x56, 0x06, 0x71, 0xF4, 0x0B, 0x0D, + 0xC6, 0xF1, 0x79, 0x09, 0x4C, 0xFF, 0xD5, 0xFE, 0xC0, 0x13, 0x86, 0xFD, + 0x50, 0x1D, 0xA0, 0x07, 0xE1, 0x1B, 0x2E, 0x14, 0x72, 0x12, 0x91, 0x1F, + 0xB3, 0xFC, 0x22, 0x1D, 0xD3, 0xEB, 0xF7, 0x06, 0xF9, 0xDD, 0xF9, 0xE7, + 0x06, 0xC6, 0x36, 0xC5, 0x13, 0xB3, 0xC9, 0xB3, 0xA9, 0xB3, 0xCA, 0xC7, + 0xAD, 0xC7, 0x0B, 0xEA, 0x44, 0xE7, 0x5D, 0x11, 0xA9, 0x11, 0x87, 0x43, + 0x2D, 0x3F, 0x7D, 0x65, 0x84, 0x59, 0x78, 0x65, 0x96, 0x52, 0x1A, 0x52, + 0x2F, 0x38, 0xFE, 0x32, 0xD8, 0x16, 0x7C, 0x0D, 0xA5, 0xF0, 0x8C, 0xF3, + 0xED, 0xD6, 0xB2, 0xE8, 0x34, 0xC9, 0xD7, 0xED, 0x74, 0xCF, 0x75, 0x03, + 0x19, 0xE6, 0xC2, 0x14, 0x83, 0xFB, 0x92, 0x1A, 0x52, 0x16, 0x13, 0x1A, + 0x47, 0x1D, 0x46, 0x18, 0xFF, 0x05, 0xC4, 0x15, 0x88, 0xF8, 0x24, 0x18, + 0x09, 0x01, 0xBE, 0x1B, 0xD1, 0x10, 0x9A, 0x13, 0xEA, 0x1C, 0xD9, 0x0F, + 0xA6, 0x27, 0x93, 0x15, 0x09, 0x2A, 0x62, 0x18, 0xF8, 0x1C, 0xAD, 0x1C, + 0x0E, 0x14, 0x52, 0x25, 0xE7, 0x1E, 0x0D, 0x24, 0x29, 0x27, 0x23, 0x1F, + 0x07, 0x21, 0xF2, 0x21, 0x37, 0x26, 0x30, 0x24, 0xC1, 0x2C, 0xC2, 0x21, + 0x84, 0x26, 0xA2, 0x1F, 0xB0, 0x1A, 0xFA, 0x1C, 0xC4, 0x13, 0x23, 0x16, + 0x7F, 0x14, 0xF4, 0x0A, 0xE0, 0x13, 0xB7, 0xFC, 0x9A, 0x11, 0xF9, 0xF0, + 0x86, 0x10, 0xB2, 0xEE, 0x20, 0x15, 0xCA, 0xF6, 0xAD, 0x1A, 0x5A, 0x09, + 0x63, 0x20, 0x37, 0x16, 0x80, 0x24, 0x5B, 0x11, 0x64, 0x1E, 0x5C, 0x11, + 0xCC, 0x07, 0x5A, 0x0E, 0xDF, 0xF2, 0x21, 0x00, 0xBF, 0xEF, 0xA9, 0xF3, + 0xC3, 0xF5, 0xC9, 0xF0, 0x77, 0xF5, 0xDE, 0xF5, 0xE6, 0xE7, 0x59, 0xFE, + 0xD4, 0xDE, 0x44, 0x0B, 0xB2, 0xDE, 0x60, 0x08, 0xC7, 0xE7, 0x60, 0xF4, + 0x20, 0xF6, 0x49, 0xE5, 0x09, 0xFD, 0x86, 0xE7, 0x7D, 0xF9, 0xD2, 0xEF, + 0xEB, 0xEB, 0x40, 0xF5, 0x97, 0xD9, 0x91, 0xF2, 0x54, 0xCF, 0x1C, 0xED, + 0x87, 0xC9, 0x33, 0xEC, 0x1E, 0xD2, 0x36, 0xE7, 0x22, 0xF3, 0xCD, 0xEA, + 0x38, 0x07, 0xD8, 0xEF, 0xD3, 0xF7, 0x15, 0xEA, 0x37, 0xE6, 0xCE, 0xE7, + 0x24, 0xE3, 0x81, 0xEB, 0x2D, 0xE4, 0xEE, 0xF1, 0x35, 0xEC, 0xBA, 0xFA, + 0xA2, 0xF5, 0xEC, 0x03, 0x21, 0xF3, 0xF7, 0x00, 0x14, 0xDE, 0x5F, 0xEF, + 0x59, 0xC9, 0x17, 0xDA, 0x2A, 0xB7, 0xA2, 0xB8, 0x2B, 0xA3, 0xD2, 0x9B, + 0xF1, 0xA0, 0x52, 0xA0, 0x27, 0xB5, 0x04, 0xBB, 0x36, 0xDC, 0xE9, 0xDE, + 0x37, 0x03, 0x59, 0x0A, 0xE7, 0x1E, 0x66, 0x2E, 0x98, 0x30, 0xF9, 0x3B, + 0x18, 0x33, 0x7F, 0x35, 0xFC, 0x1A, 0x62, 0x1F, 0x57, 0xF3, 0x30, 0xFE, + 0x90, 0xD8, 0x02, 0xDC, 0x1F, 0xCA, 0x16, 0xCC, 0x3A, 0xCA, 0x66, 0xCB, + 0x08, 0xD7, 0xDB, 0xCC, 0x42, 0xDD, 0xEE, 0xD5, 0x4E, 0xDF, 0xEC, 0xDC, + 0xC6, 0xE7, 0xC3, 0xE1, 0xDF, 0xF0, 0xAB, 0xE6, 0x74, 0xF2, 0x4E, 0xE4, + 0xBF, 0xF1, 0x47, 0xEB, 0xA0, 0xFB, 0xEB, 0xF2, 0x79, 0x07, 0x00, 0xEE, + 0xB5, 0x09, 0x6E, 0xEF, 0xB2, 0x07, 0xC8, 0xF9, 0x9A, 0x0E, 0x51, 0x04, + 0xA7, 0x13, 0xCE, 0x04, 0x39, 0x12, 0x36, 0x01, 0x80, 0x1C, 0xFE, 0x0A, + 0x8D, 0x23, 0x67, 0x15, 0xB8, 0x19, 0x16, 0x16, 0x51, 0x0F, 0xB0, 0x1D, + 0x09, 0x0C, 0xE7, 0x1C, 0xD8, 0x0A, 0xDE, 0x11, 0xD5, 0x0D, 0xBC, 0x10, + 0x69, 0x0E, 0xE9, 0x05, 0xD1, 0x03, 0x00, 0xF3, 0x62, 0x01, 0xA2, 0xE8, + 0xCD, 0x03, 0x09, 0xE7, 0x6B, 0xFA, 0xF8, 0xE8, 0xD4, 0xFC, 0x0E, 0xF2, + 0xD2, 0x0C, 0x05, 0x03, 0x21, 0x11, 0xD9, 0x10, 0xF1, 0x13, 0x33, 0x16, + 0xAF, 0x21, 0x2C, 0x13, 0x10, 0x21, 0x63, 0x0B, 0xD5, 0x0B, 0x7A, 0xFD, + 0x47, 0xF6, 0x3E, 0xEF, 0x77, 0xE7, 0xF1, 0xEC, 0x2A, 0xDD, 0x8B, 0xEE, + 0xE7, 0xD5, 0xD0, 0xE7, 0x19, 0xD9, 0x55, 0xE7, 0xE4, 0xE3, 0xA0, 0xF7, + 0x32, 0xE3, 0xE4, 0x06, 0xF5, 0xDD, 0xD4, 0x08, 0xF4, 0xE1, 0x89, 0x02, + 0xDB, 0xDF, 0xC0, 0xF1, 0xA0, 0xD6, 0x67, 0xE3, 0x68, 0xDC, 0x14, 0xE3, + 0xC3, 0xEA, 0x75, 0xE8, 0xC4, 0xE6, 0xD8, 0xF0, 0xE1, 0xD7, 0x5A, 0xF5, + 0x7C, 0xDD, 0xDB, 0xED, 0x48, 0xEE, 0x31, 0xDC, 0x97, 0xF4, 0x5B, 0xCF, + 0xF2, 0xFD, 0xAB, 0xCE, 0x00, 0x07, 0x66, 0xD8, 0xF5, 0x06, 0x36, 0xE7, + 0xCE, 0x00, 0x7E, 0xED, 0x9E, 0xF4, 0x02, 0xEE, 0xC0, 0xE3, 0x48, 0xE5, + 0x57, 0xC8, 0xA2, 0xCE, 0x6D, 0xAC, 0x32, 0xB2, 0x0C, 0xA1, 0xAE, 0x9D, + 0x13, 0xA4, 0x8C, 0x9B, 0x56, 0xA7, 0x51, 0xAB, 0x33, 0xB3, 0x0F, 0xCA, + 0xC5, 0xDC, 0xF4, 0xF3, 0x09, 0x0F, 0xBB, 0x15, 0xF9, 0x2E, 0x11, 0x20, + 0xC7, 0x3B, 0xB6, 0x1F, 0x9B, 0x27, 0x93, 0x0D, 0x63, 0xF6, 0x38, 0xE7, + 0x05, 0xD8, 0xBE, 0xC6, 0x0E, 0xC8, 0xAB, 0xB6, 0xCB, 0xB0, 0x46, 0xB0, + 0x9B, 0xAE, 0xBC, 0xB9, 0x55, 0xC0, 0x29, 0xD5, 0xB2, 0xD5, 0x4A, 0xE6, + 0x11, 0xEB, 0x8B, 0xEB, 0x3E, 0xE5, 0x34, 0xE9, 0xBF, 0xD2, 0x43, 0xD7, + 0xFB, 0xD0, 0xB3, 0xC6, 0x23, 0xD3, 0x68, 0xC2, 0xDF, 0xD6, 0xE0, 0xC8, + 0x70, 0xE3, 0x61, 0xD6, 0x2C, 0xF3, 0x7A, 0xDD, 0x29, 0xFC, 0x40, 0xDC, + 0x40, 0xFE, 0x5E, 0xE2, 0x93, 0x02, 0x05, 0xF0, 0xB5, 0x01, 0x3B, 0xF7, + 0x80, 0xF7, 0x3A, 0xF7, 0xD9, 0xFD, 0x00, 0xF7, 0x06, 0x10, 0x2B, 0xFA, + 0xF6, 0x15, 0xA1, 0xFE, 0xD2, 0x0E, 0xC2, 0xFE, 0x10, 0xF9, 0x80, 0xF7, + 0x79, 0xF1, 0xD7, 0xE3, 0x43, 0xFE, 0x7E, 0xDC, 0x30, 0xF3, 0x9C, 0xE8, + 0x3A, 0xD9, 0xD4, 0xE7, 0x56, 0xD5, 0x94, 0xE4, 0xEA, 0xE0, 0xF9, 0xEE, + 0xEF, 0xF0, 0xB8, 0xF9, 0x3B, 0x00, 0x84, 0xFB, 0x5B, 0x01, 0x9B, 0xFB, + 0x5C, 0x06, 0xDC, 0xFB, 0x98, 0x12, 0x87, 0xFA, 0x73, 0x11, 0x96, 0xF8, + 0x61, 0x06, 0xF6, 0xF0, 0xCF, 0xFB, 0xED, 0xE8, 0x94, 0xFB, 0x0F, 0xE5, + 0xC6, 0xFA, 0x3F, 0xE8, 0x64, 0xF1, 0xB5, 0xF2, 0x63, 0xF3, 0x22, 0xFE, + 0x39, 0xFC, 0xDD, 0x03, 0x0E, 0xF9, 0x73, 0x02, 0x80, 0xEE, 0xCA, 0x08, + 0xA5, 0xE7, 0x5D, 0x0D, 0x72, 0xF2, 0xBD, 0x08, 0xA3, 0xF6, 0x09, 0xFC, + 0x08, 0xEE, 0xDE, 0xF7, 0x66, 0xF5, 0x80, 0xFC, 0x81, 0x03, 0xD0, 0xFD, + 0x50, 0x0D, 0x6C, 0x15, 0x01, 0x0E, 0x6F, 0x2C, 0x90, 0x06, 0x54, 0x28, + 0xFC, 0x11, 0x6A, 0x20, 0x92, 0x2F, 0xC7, 0x1C, 0x79, 0x3C, 0xFB, 0x1D, + 0xA5, 0x38, 0xA8, 0x23, 0xAD, 0x32, 0x01, 0x26, 0xBC, 0x21, 0x9C, 0x13, + 0x8B, 0x03, 0x80, 0xF2, 0x9B, 0xE2, 0xF6, 0xDA, 0xE9, 0xC0, 0x8F, 0xC7, + 0x6C, 0xAC, 0xA5, 0xBE, 0x88, 0xBB, 0x61, 0xCA, 0x97, 0xEA, 0xB3, 0xEB, + 0x98, 0x1F, 0xA7, 0x18, 0x4F, 0x46, 0x61, 0x3B, 0x14, 0x5D, 0x5C, 0x4A, + 0x0F, 0x65, 0x3A, 0x50, 0xD0, 0x53, 0x7A, 0x3C, 0xC2, 0x2E, 0xD4, 0x03, + 0x97, 0x08, 0x76, 0xD2, 0x74, 0xE9, 0xFA, 0xBF, 0xB2, 0xD0, 0x03, 0xC3, + 0x46, 0xC6, 0x64, 0xD0, 0x45, 0xDA, 0x35, 0xE4, 0x23, 0xF8, 0x92, 0xFA, + 0xEB, 0x04, 0x29, 0x09, 0x36, 0x05, 0xA0, 0x08, 0xE9, 0x0C, 0xEF, 0xFC, + 0xCC, 0x11, 0x95, 0xFD, 0xDF, 0x04, 0x71, 0x0A, 0x39, 0x03, 0xCF, 0x16, + 0xCB, 0x0B, 0x0F, 0x23, 0xE4, 0x0C, 0xB9, 0x2A, 0x15, 0x0C, 0x75, 0x2F, + 0xA5, 0x07, 0x6A, 0x34, 0x53, 0x0C, 0xFE, 0x33, 0x17, 0x22, 0xB8, 0x2B, + 0xCB, 0x32, 0x0C, 0x2C, 0xB0, 0x36, 0x2D, 0x36, 0x52, 0x39, 0xC9, 0x3B, + 0xF5, 0x3C, 0xE1, 0x40, 0x2F, 0x3D, 0x31, 0x37, 0x23, 0x3A, 0x48, 0x26, + 0x21, 0x36, 0xB0, 0x25, 0x27, 0x2C, 0x3B, 0x23, 0x89, 0x16, 0x1A, 0x16, + 0x70, 0x07, 0x5A, 0x0C, 0x5D, 0x04, 0xCA, 0x0F, 0xB6, 0x09, 0x1C, 0x1C, + 0xEB, 0x13, 0xDF, 0x24, 0xA4, 0x1A, 0x6E, 0x25, 0x83, 0x25, 0xAF, 0x23, + 0x78, 0x2C, 0x93, 0x21, 0x6A, 0x1B, 0x3D, 0x1B, 0x2D, 0x0C, 0x0E, 0x14, + 0x82, 0x16, 0x37, 0x04, 0x75, 0x1D, 0xAE, 0xF3, 0x76, 0x18, 0xF0, 0xF5, + 0xC0, 0x0C, 0xD5, 0xF7, 0x86, 0x01, 0x84, 0xFD, 0x2D, 0x0A, 0x0A, 0x02, + 0xA7, 0x23, 0x37, 0xFF, 0x11, 0x2E, 0x4F, 0x02, 0x9A, 0x1C, 0x21, 0x05, + 0x1E, 0xFA, 0x47, 0xFD, 0xFC, 0xE0, 0xB8, 0xF6, 0x6D, 0xE4, 0x13, 0xF9, + 0x3A, 0xE8, 0xEF, 0xF6, 0x8E, 0xE2, 0xD9, 0xFB, 0xC9, 0xEF, 0x8D, 0x0A, + 0x79, 0xFC, 0xC1, 0x12, 0xD7, 0xF0, 0xF1, 0x08, 0x93, 0xF9, 0x7C, 0x02, + 0xAB, 0x18, 0xE1, 0x0F, 0x80, 0x22, 0x18, 0x19, 0xF4, 0x1A, 0xAE, 0x1A, + 0xE0, 0x1B, 0xF6, 0x18, 0x60, 0x23, 0xD4, 0x19, 0x37, 0x0A, 0xEA, 0x16, + 0x5F, 0xD7, 0xC8, 0xFA, 0xE6, 0xB9, 0x20, 0xCF, 0xCA, 0xB3, 0xCE, 0xA9, + 0x8E, 0xB1, 0x41, 0xA6, 0xCB, 0xBE, 0xBD, 0xCD, 0x69, 0xEE, 0x24, 0x07, + 0x95, 0x23, 0x10, 0x2F, 0x9E, 0x49, 0x84, 0x4D, 0x50, 0x5F, 0x04, 0x61, + 0xAB, 0x5A, 0x15, 0x4F, 0xD8, 0x37, 0x76, 0x2C, 0x12, 0x08, 0x0B, 0x0C, + 0x5A, 0xEE, 0x42, 0xF1, 0x46, 0xEA, 0x01, 0xE3, 0x90, 0xE3, 0xCF, 0xDE, + 0x79, 0xD3, 0xDC, 0xE6, 0x2A, 0xC7, 0x78, 0xF8, 0x9E, 0xD5, 0x78, 0x0F, + 0x07, 0xF9, 0x03, 0x1B, 0xE7, 0x13, 0x0E, 0x1C, 0xDE, 0x16, 0x2D, 0x1A, + 0xDE, 0x06, 0x56, 0x0B, 0xCF, 0xFD, 0x71, 0x08, 0x87, 0x05, 0xF4, 0x0E, + 0x54, 0x0D, 0x94, 0x1C, 0x59, 0x0F, 0x43, 0x39, 0x55, 0x14, 0xF3, 0x43, + 0x2C, 0x26, 0xFB, 0x39, 0x44, 0x33, 0xAE, 0x30, 0xFF, 0x27, 0x06, 0x2E, + 0xD5, 0x1F, 0x07, 0x2D, 0x86, 0x27, 0xDE, 0x25, 0x3E, 0x31, 0x82, 0x27, + 0xB7, 0x3B, 0x9E, 0x39, 0x0B, 0x3D, 0xC4, 0x3F, 0xD9, 0x32, 0xD0, 0x34, + 0x6B, 0x2F, 0x49, 0x29, 0xF6, 0x38, 0x04, 0x1A, 0x35, 0x3B, 0x4D, 0x13, + 0x4B, 0x32, 0x01, 0x14, 0xE2, 0x20, 0xDB, 0x14, 0xA2, 0x10, 0xAF, 0x27, + 0x0C, 0x1D, 0x29, 0x3D, 0xEE, 0x34, 0x2D, 0x43, 0xF7, 0x38, 0xFE, 0x43, + 0x4D, 0x34, 0xD6, 0x3E, 0x2F, 0x30, 0x54, 0x30, 0x6B, 0x24, 0xA3, 0x22, + 0xD6, 0x15, 0x88, 0x17, 0x7A, 0x0A, 0xC3, 0x14, 0xDF, 0xFE, 0xE6, 0x1A, + 0x98, 0x0B, 0x6A, 0x17, 0x80, 0x28, 0x29, 0x08, 0x1E, 0x37, 0x9C, 0x05, + 0x47, 0x31, 0x32, 0x15, 0xB9, 0x19, 0x21, 0x1C, 0xF8, 0x09, 0xC3, 0x11, + 0x22, 0x08, 0xF0, 0x04, 0xFD, 0x10, 0x33, 0xFE, 0xB7, 0x15, 0xCC, 0xFD, + 0x58, 0x0C, 0x70, 0x04, 0x10, 0x03, 0x08, 0x0B, 0xB1, 0x06, 0xAC, 0x12, + 0x28, 0x0E, 0x91, 0x1C, 0x03, 0x0C, 0xBE, 0x1A, 0x4E, 0x15, 0x0B, 0x1A, + 0x9F, 0x22, 0x5B, 0x27, 0x35, 0x26, 0x85, 0x2F, 0x5D, 0x29, 0x51, 0x33, + 0xE2, 0x16, 0xF6, 0x36, 0x14, 0xF1, 0xC2, 0x27, 0xE9, 0xD1, 0x1D, 0x05, + 0x90, 0xC1, 0xBA, 0xE0, 0xFD, 0xB5, 0x40, 0xC0, 0x84, 0xAC, 0x44, 0xAF, + 0xC3, 0xB7, 0x84, 0xC7, 0xD0, 0xDD, 0xF7, 0xF5, 0x46, 0x0E, 0x80, 0x1E, + 0xAD, 0x3A, 0xC0, 0x44, 0x91, 0x56, 0x17, 0x55, 0x22, 0x51, 0x22, 0x45, + 0xF9, 0x35, 0x29, 0x28, 0xF0, 0x0E, 0x58, 0x02, 0x1A, 0xDD, 0x8B, 0xD7, + 0x3B, 0xB9, 0xA1, 0xB9, 0x7B, 0xB1, 0xCC, 0xAF, 0x2B, 0xC1, 0x7B, 0xB2, + 0xCF, 0xD8, 0x84, 0xC4, 0x44, 0xEE, 0x0D, 0xE6, 0x74, 0x00, 0x8F, 0x01, + 0xAB, 0x0A, 0xF2, 0x03, 0xA7, 0x0C, 0xF1, 0xF9, 0x18, 0x06, 0x95, 0xF1, + 0x27, 0xFE, 0xE7, 0xE2, 0x46, 0xFA, 0x0E, 0xE3, 0x73, 0xEA, 0x4A, 0xF3, + 0x3A, 0xDC, 0xD0, 0xFB, 0x15, 0xF0, 0xA8, 0x01, 0xB1, 0x0D, 0xFE, 0x08, + 0xBC, 0x08, 0x44, 0x10, 0x6D, 0xF1, 0x1C, 0x1B, 0x87, 0xF5, 0x74, 0x25, + 0x73, 0x0E, 0xDF, 0x27, 0xF7, 0x1A, 0xA2, 0x1B, 0x7F, 0x1A, 0xB0, 0x06, + 0xED, 0x0E, 0x4D, 0x02, 0x5C, 0xF4, 0x4E, 0x02, 0x65, 0xE5, 0xCC, 0xF7, + 0x10, 0xEA, 0xA3, 0xF4, 0x18, 0xF0, 0xE5, 0xEC, 0x63, 0xF4, 0xD8, 0xE3, + 0xD8, 0xF6, 0x41, 0xE8, 0x95, 0xF9, 0xE0, 0xE8, 0xA2, 0xFC, 0xD4, 0xEA, + 0xEB, 0x00, 0x2C, 0xF8, 0x9E, 0x08, 0x13, 0x09, 0x8A, 0x04, 0x22, 0x0C, + 0x17, 0xF7, 0x30, 0xFB, 0xBD, 0xF0, 0x67, 0xE9, 0x6D, 0xEE, 0x24, 0xDD, + 0xD0, 0xF0, 0xE1, 0xD5, 0x9C, 0xF0, 0x26, 0xCA, 0xB6, 0xED, 0x24, 0xB9, + 0xBB, 0xEE, 0xAB, 0xBE, 0x4B, 0xE7, 0xE5, 0xE0, 0xC6, 0xDD, 0xBA, 0xFA, + 0xFA, 0xE1, 0xCA, 0xF7, 0xD4, 0xE5, 0xDC, 0xE4, 0xBA, 0xE1, 0x96, 0xCE, + 0x0C, 0xE1, 0x39, 0xC9, 0xD1, 0xD3, 0xD9, 0xCB, 0x21, 0xB9, 0x50, 0xC0, + 0x84, 0xBE, 0x15, 0xC6, 0x3F, 0xDD, 0x26, 0xE7, 0xCD, 0xE8, 0xAF, 0xF1, + 0x0B, 0xE5, 0x04, 0xE4, 0xD8, 0xEF, 0x1B, 0xED, 0x41, 0xF6, 0x75, 0xF7, + 0x43, 0xEA, 0x94, 0xEC, 0x3F, 0xE6, 0xFB, 0xE8, 0x0F, 0xE2, 0xC3, 0xE8, + 0x4A, 0xCB, 0x43, 0xDC, 0xC1, 0xB1, 0x32, 0xC5, 0xCC, 0xA5, 0x0B, 0xAC, + 0x3A, 0x9E, 0xA0, 0x9B, 0x11, 0x9C, 0x00, 0x9F, 0xB3, 0xAF, 0x9C, 0xBF, + 0x2F, 0xCF, 0x0F, 0xE5, 0xD3, 0xEC, 0x7A, 0xFF, 0x99, 0x14, 0x0A, 0x1B, + 0x48, 0x33, 0xBD, 0x21, 0xFB, 0x31, 0xF2, 0x0D, 0xCF, 0x17, 0xA8, 0xE9, + 0x0E, 0xE8, 0x5B, 0xC1, 0x25, 0xB9, 0x2C, 0xAF, 0xE6, 0xA4, 0xAE, 0xA7, + 0x61, 0xAB, 0x32, 0xA0, 0xDF, 0xB7, 0xA2, 0xA7, 0x77, 0xC2, 0x67, 0xC4, + 0x1D, 0xCF, 0xB2, 0xE1, 0x08, 0xDB, 0xBE, 0xEB, 0xB7, 0xE2, 0x31, 0xE6, + 0x14, 0xE4, 0xEF, 0xDD, 0x6D, 0xE3, 0x2C, 0xD8, 0x11, 0xE5, 0x24, 0xD2, + 0x22, 0xEC, 0x82, 0xCD, 0xD3, 0xEF, 0x23, 0xCF, 0xDA, 0xF4, 0x4B, 0xD7, + 0xB0, 0xFE, 0xA5, 0xDD, 0xCF, 0xF6, 0x34, 0xE4, 0xCA, 0xED, 0x0E, 0xEE, + 0x4B, 0xFD, 0xA6, 0xF6, 0xBC, 0x08, 0x4C, 0xFC, 0x82, 0x03, 0x95, 0xFD, + 0x34, 0xFA, 0x75, 0xF8, 0xD9, 0xEF, 0xCB, 0xF7, 0xC3, 0xE7, 0x91, 0xFC, + 0x3B, 0xEF, 0x95, 0xF8, 0x55, 0xFB, 0x23, 0xEC, 0x01, 0xEF, 0x36, 0xE6, + 0x04, 0xE1, 0xE4, 0xE7, 0x04, 0xEF, 0x10, 0xEF, 0xCD, 0xFE, 0xF8, 0xF8, + 0x03, 0xFA, 0x5F, 0xFC, 0xCC, 0xF7, 0x0F, 0x04, 0x56, 0xF9, 0xA4, 0x0B, + 0x67, 0xF9, 0x42, 0x09, 0x85, 0xF5, 0x6B, 0xFC, 0x2A, 0xEC, 0x92, 0xF7, + 0x75, 0xDF, 0xB9, 0xF2, 0xC9, 0xCF, 0x13, 0xEE, 0x2F, 0xCD, 0xDA, 0xF7, + 0xA4, 0xD8, 0x11, 0xEA, 0x24, 0xF1, 0x0B, 0xD6, 0x3E, 0xFF, 0x8D, 0xE1, + 0xE9, 0xFC, 0x5F, 0xF8, 0xB8, 0xFF, 0x70, 0xFF, 0x83, 0xFD, 0xAC, 0xFB, + 0x45, 0xF0, 0xB3, 0xF0, 0xA7, 0xE8, 0x81, 0xEF, 0x08, 0xE9, 0x96, 0xF6, + 0x87, 0xDE, 0xD6, 0xEB, 0x1F, 0xDB, 0xE3, 0xE3, 0x18, 0xF8, 0x0D, 0xED, + 0x5E, 0x08, 0x79, 0xF1, 0x10, 0xFB, 0x4E, 0xE6, 0xD2, 0x03, 0x35, 0xEC, + 0x06, 0x19, 0x6E, 0x00, 0x07, 0x1E, 0x7C, 0x03, 0x85, 0x22, 0xA4, 0xFF, + 0xE7, 0x2D, 0xE7, 0xFB, 0xA3, 0x32, 0x8F, 0xE5, 0x3B, 0x1E, 0x0A, 0xC7, + 0x7B, 0xF7, 0xA8, 0xBB, 0xDD, 0xC7, 0xE9, 0xAC, 0x65, 0xA0, 0x81, 0xA3, + 0xDB, 0xAB, 0x40, 0xC6, 0x31, 0xE5, 0x4E, 0xF9, 0xB4, 0x1E, 0xF5, 0x21, + 0x2E, 0x48, 0x8B, 0x42, 0xB3, 0x5E, 0x33, 0x55, 0x71, 0x59, 0xB9, 0x52, + 0x9D, 0x47, 0xE9, 0x3A, 0x08, 0x2C, 0xF6, 0x13, 0xD8, 0xFE, 0xF0, 0xEB, + 0x98, 0xE0, 0xDE, 0xD8, 0xE0, 0xDF, 0x3B, 0xD9, 0xE4, 0xE1, 0x0D, 0xE5, + 0xE5, 0xEB, 0x0E, 0x00, 0x9C, 0xFE, 0x66, 0x1A, 0x0F, 0x0A, 0xF2, 0x29, + 0x74, 0x15, 0x5D, 0x2A, 0x00, 0x1B, 0xC5, 0x21, 0xAD, 0x1D, 0xD8, 0x1A, + 0xEB, 0x1E, 0xC5, 0x16, 0x44, 0x1C, 0x79, 0x19, 0x92, 0x1E, 0xCF, 0x25, + 0x62, 0x1B, 0x93, 0x32, 0x40, 0x18, 0x0F, 0x33, 0x12, 0x25, 0x71, 0x2C, + 0x78, 0x3A, 0x48, 0x2A, 0x3D, 0x49, 0x05, 0x2D, 0xAA, 0x46, 0x5C, 0x2D, + 0x2F, 0x39, 0xEA, 0x36, 0x1E, 0x2C, 0xF7, 0x3E, 0x32, 0x1B, 0xFE, 0x36, + 0x75, 0x11, 0x26, 0x33, 0x30, 0x1F, 0x05, 0x2F, 0xC9, 0x32, 0x37, 0x23, + 0xDC, 0x2C, 0x1D, 0x17, 0xBF, 0x11, 0x34, 0x12, 0x2B, 0x06, 0x25, 0x1C, + 0x99, 0x04, 0x61, 0x30, 0x03, 0x00, 0xA2, 0x3F, 0x4F, 0x0B, 0xA4, 0x45, + 0xF2, 0x23, 0x67, 0x45, 0xA8, 0x34, 0x70, 0x31, 0x8D, 0x30, 0x63, 0x15, + 0xB3, 0x1D, 0x1E, 0x0C, 0x80, 0x08, 0xBF, 0xFF, 0xA4, 0xFD, 0x3A, 0xF2, + 0x08, 0x00, 0x82, 0xFA, 0xE1, 0x06, 0x98, 0x01, 0xA9, 0x07, 0x01, 0x03, + 0xFE, 0x01, 0xE0, 0x02, 0x4A, 0x0A, 0x91, 0x08, 0x5E, 0x1B, 0xF6, 0x0B, + 0xD0, 0x1E, 0x96, 0xFD, 0x65, 0x0D, 0x9E, 0xEA, 0xC6, 0x05, 0x5B, 0xEC, + 0xC4, 0x0E, 0x16, 0xFE, 0x0A, 0x06, 0xA2, 0x03, 0x8E, 0x03, 0xCB, 0x00, + 0x0E, 0x1B, 0x0C, 0x06, 0xE7, 0x25, 0xC7, 0x12, 0x8C, 0x12, 0x0D, 0x0D, + 0xB6, 0x04, 0xE4, 0x06, 0xD4, 0x0B, 0x54, 0x11, 0x3A, 0x13, 0xE8, 0x0D, + 0x03, 0x16, 0x4B, 0x05, 0x83, 0x17, 0x2B, 0x00, 0xA5, 0x11, 0xA6, 0xEB, + 0x5D, 0xF9, 0x42, 0xD2, 0xA1, 0xD7, 0x79, 0xC4, 0x6A, 0xB9, 0x69, 0xAF, + 0x45, 0xA0, 0xAB, 0x9D, 0xB4, 0xA7, 0x3C, 0xB5, 0x64, 0xD4, 0x0B, 0xE2, + 0xD2, 0x06, 0x82, 0x11, 0xA8, 0x2B, 0x0E, 0x42, 0x79, 0x43, 0x6E, 0x55, + 0xF1, 0x52, 0x26, 0x47, 0x6A, 0x44, 0x30, 0x26, 0x18, 0x16, 0x02, 0xFC, + 0xD2, 0xED, 0x96, 0xD4, 0xC8, 0xD3, 0x71, 0xB2, 0xCA, 0xC0, 0xCE, 0xAD, + 0x43, 0xB8, 0x73, 0xC5, 0x3D, 0xB5, 0x23, 0xE2, 0x58, 0xC2, 0x34, 0x00, + 0x35, 0xDA, 0x95, 0x10, 0xC1, 0xEA, 0x76, 0x0F, 0xD5, 0xFA, 0x1A, 0x07, + 0x0D, 0xFF, 0x19, 0xFF, 0x1D, 0xE9, 0x94, 0xFE, 0x89, 0xD8, 0xD4, 0xFF, + 0x28, 0xE6, 0x34, 0xFD, 0xD5, 0xF3, 0x47, 0x03, 0xC5, 0xF5, 0xDB, 0x0C, + 0x87, 0x01, 0x75, 0x0F, 0xC3, 0x0D, 0xFB, 0x11, 0x63, 0x0D, 0xBB, 0x15, + 0x66, 0x12, 0x8E, 0x1B, 0x2F, 0x20, 0x9C, 0x1C, 0x98, 0x1E, 0x77, 0x12, + 0x01, 0x13, 0xBA, 0x04, 0xFC, 0x0D, 0x45, 0x03, 0xFD, 0x0C, 0x96, 0x09, + 0x5D, 0x13, 0xBC, 0x0A, 0x52, 0x15, 0x32, 0x0E, 0xD3, 0x0E, 0x61, 0x14, + 0x97, 0x11, 0xD2, 0x1F, 0xE6, 0x15, 0xA5, 0x2E, 0xB4, 0x15, 0xDA, 0x32, + 0x92, 0x21, 0xBB, 0x2C, 0x03, 0x32, 0xD5, 0x27, 0x7E, 0x39, 0x31, 0x29, + 0x45, 0x30, 0x8D, 0x29, 0x6B, 0x1A, 0x34, 0x2A, 0xB1, 0x12, 0xAB, 0x2D, + 0x82, 0x1F, 0x4A, 0x2D, 0x6E, 0x2A, 0xE7, 0x21, 0x86, 0x2B, 0xE7, 0x19, + 0xA0, 0x2B, 0x94, 0x25, 0x74, 0x23, 0x08, 0x2E, 0x7E, 0x17, 0x2D, 0x36, + 0xA2, 0x18, 0xD1, 0x39, 0xFD, 0x1F, 0x2A, 0x29, 0xD6, 0x12, 0x5B, 0x10, + 0x44, 0x0F, 0xD7, 0x05, 0xB7, 0x1E, 0xB9, 0x09, 0x4F, 0x0F, 0x33, 0x08, + 0x81, 0xFC, 0x54, 0x0B, 0xAB, 0x0D, 0x59, 0x24, 0xBF, 0x1E, 0x7E, 0x37, + 0x3E, 0x1B, 0x7F, 0x2A, 0xEE, 0x1F, 0x03, 0x28, 0x86, 0x34, 0x82, 0x37, + 0xB6, 0x3F, 0x2B, 0x33, 0x04, 0x32, 0xC0, 0x22, 0x6F, 0x2B, 0x26, 0x17, + 0x6C, 0x2C, 0x16, 0x09, 0x3F, 0x0B, 0xA9, 0xF0, 0xD0, 0xDB, 0x83, 0xDA, + 0x6C, 0xB8, 0xD2, 0xCA, 0xCD, 0xB1, 0x93, 0xBF, 0xF8, 0xCD, 0x0D, 0xCE, + 0x54, 0xF1, 0x35, 0xF9, 0x5E, 0x14, 0xB0, 0x26, 0xAE, 0x3A, 0x1A, 0x4B, + 0xD2, 0x56, 0xAB, 0x5F, 0xB8, 0x63, 0x1D, 0x56, 0xED, 0x57, 0xAC, 0x3D, + 0x2B, 0x2B, 0x6F, 0x20, 0xE2, 0xFC, 0x52, 0xFA, 0xA4, 0xE0, 0xA1, 0xDD, + 0x8E, 0xD2, 0x08, 0xD2, 0x89, 0xD7, 0x3C, 0xD7, 0xBB, 0xE8, 0x76, 0xEA, + 0xA9, 0xFC, 0x54, 0xFF, 0x7F, 0x08, 0x6C, 0x13, 0x7D, 0x09, 0x36, 0x21, + 0x7A, 0x0E, 0x66, 0x23, 0x26, 0x0D, 0x75, 0x1E, 0x67, 0xF9, 0xDA, 0x17, + 0x26, 0xF5, 0xD6, 0x12, 0x56, 0x07, 0xF5, 0x13, 0xF6, 0x10, 0xE3, 0x17, + 0x0E, 0x12, 0x18, 0x22, 0xFE, 0x11, 0x0A, 0x32, 0x4D, 0x14, 0x39, 0x35, + 0xA9, 0x1A, 0xE3, 0x31, 0x5C, 0x1D, 0xF7, 0x2B, 0x13, 0x14, 0xF4, 0x19, + 0x84, 0x07, 0xB0, 0x09, 0xA2, 0x0C, 0xF7, 0x05, 0x5C, 0x1E, 0x7E, 0x03, + 0xE1, 0x1E, 0xE9, 0x06, 0xA1, 0x0D, 0x29, 0x14, 0x07, 0x01, 0x09, 0x19, + 0x28, 0xFD, 0x58, 0x10, 0xD2, 0xFE, 0xAB, 0x05, 0x1E, 0x01, 0x2F, 0xFE, + 0xED, 0x09, 0x3E, 0xF7, 0x09, 0x11, 0xE3, 0xEE, 0xAA, 0x0B, 0x18, 0xED, + 0x29, 0x0A, 0xE9, 0xF1, 0xEA, 0x06, 0x8A, 0xF0, 0x4A, 0xFB, 0xA3, 0xE9, + 0x09, 0xF0, 0x7A, 0xEA, 0x6B, 0xED, 0x44, 0xF1, 0x5D, 0xEF, 0x0D, 0xEC, + 0xC2, 0xF5, 0x47, 0xF2, 0x7B, 0xFB, 0xE6, 0x04, 0xEA, 0xF8, 0xF5, 0x02, + 0x23, 0xF3, 0xFD, 0xFF, 0x6E, 0xF0, 0x36, 0x05, 0x95, 0xE9, 0xD3, 0xF7, + 0xB7, 0xDF, 0x53, 0xE5, 0xA4, 0xE8, 0x0D, 0xE7, 0x5C, 0xEA, 0x97, 0xE8, + 0xD5, 0xD2, 0xEF, 0xE0, 0xF2, 0xCD, 0xA0, 0xED, 0x23, 0xE1, 0xFA, 0x0A, + 0xD5, 0xEB, 0xFB, 0x06, 0x23, 0xF6, 0x8C, 0xF5, 0x4A, 0x05, 0xFB, 0x08, + 0xC0, 0x08, 0x9B, 0x1E, 0x95, 0xFE, 0x91, 0x1E, 0x5B, 0xF3, 0xD8, 0x0E, + 0xC3, 0xF7, 0xF6, 0xF5, 0x3F, 0xF7, 0x4F, 0xDB, 0x50, 0xDE, 0xA4, 0xBA, + 0x15, 0xBA, 0x76, 0xA1, 0xFF, 0x9B, 0x33, 0x9F, 0xF1, 0x9D, 0xB5, 0xA9, + 0xDB, 0xBB, 0x7A, 0xC3, 0x8F, 0xE3, 0x62, 0xF7, 0xC4, 0x16, 0x65, 0x25, + 0xBC, 0x41, 0x9D, 0x3C, 0xF3, 0x4F, 0x99, 0x43, 0x6A, 0x49, 0x82, 0x30, + 0xC2, 0x27, 0x0C, 0x0B, 0x6F, 0xF1, 0x3E, 0xE4, 0xAD, 0xC0, 0x9D, 0xC6, + 0x9B, 0xA3, 0xCE, 0xB2, 0x4F, 0xA1, 0xCE, 0xA9, 0x88, 0xB4, 0x7C, 0xB6, + 0xFE, 0xD7, 0x25, 0xD8, 0x20, 0xFF, 0x96, 0xEB, 0xBB, 0x11, 0xD5, 0xE4, + 0xC3, 0x0F, 0xC2, 0xE8, 0x2A, 0x09, 0x7E, 0xF7, 0xA4, 0x00, 0x19, 0xF8, + 0xFD, 0x01, 0x7A, 0xF0, 0xFE, 0x11, 0x41, 0xF3, 0x18, 0x1D, 0x99, 0xFA, + 0x5E, 0x1C, 0x42, 0x00, 0x96, 0x0B, 0xFC, 0x0F, 0xEA, 0xF4, 0x04, 0x1E, + 0x05, 0xF6, 0x5E, 0x1A, 0x1E, 0x05, 0x6C, 0x12, 0x37, 0x0F, 0x88, 0x0D, + 0x3E, 0x10, 0x88, 0x00, 0x73, 0x09, 0x50, 0xF5, 0xE9, 0x03, 0xBC, 0xEE, + 0x97, 0x00, 0x98, 0xF0, 0xC0, 0xF8, 0x04, 0x01, 0x54, 0xF3, 0x5B, 0x0E, + 0xD4, 0xF8, 0x6C, 0x1A, 0x4B, 0xFE, 0x24, 0x1F, 0xAE, 0xFE, 0x59, 0x14, + 0xFF, 0xFE, 0x29, 0x0A, 0xA6, 0x06, 0xD0, 0x0E, 0x56, 0x15, 0x10, 0x14, + 0x33, 0x18, 0x10, 0x09, 0x3D, 0x0E, 0x45, 0xFC, 0x58, 0x05, 0x37, 0xF9, + 0xEA, 0xFB, 0xEF, 0xF3, 0x3C, 0xF4, 0x5F, 0xEF, 0x1F, 0xEF, 0xE8, 0xEB, + 0x20, 0xF7, 0xDC, 0xEC, 0xB0, 0xFF, 0x7E, 0xFE, 0x84, 0xFD, 0xF8, 0x17, + 0xCB, 0xFD, 0xE0, 0x21, 0x64, 0x01, 0x22, 0x13, 0xDC, 0x03, 0x7C, 0xF6, + 0xDD, 0xFB, 0x85, 0xE8, 0x7C, 0xF3, 0xD2, 0xF8, 0xEA, 0xEC, 0x3B, 0x01, + 0x66, 0xE5, 0x0E, 0xF5, 0x73, 0xEF, 0x38, 0xF8, 0xBA, 0x05, 0x42, 0x11, + 0x47, 0x03, 0x5D, 0x0F, 0xA1, 0xF8, 0x48, 0xF5, 0xA4, 0x0D, 0x19, 0xFB, + 0xB3, 0x27, 0x1C, 0x11, 0x3A, 0x27, 0x41, 0x1A, 0x8F, 0x1A, 0x59, 0x21, + 0xC4, 0x15, 0xD8, 0x16, 0x0D, 0x03, 0x0B, 0xEB, 0x5C, 0xD9, 0x75, 0xBC, + 0xBD, 0xB4, 0xFF, 0xA1, 0xE5, 0x9E, 0xC7, 0x9B, 0x35, 0xA2, 0xAB, 0xA9, + 0x19, 0xCB, 0x32, 0xCD, 0xA3, 0xFC, 0x96, 0x01, 0x2C, 0x27, 0xF5, 0x2E, + 0x6B, 0x51, 0xB9, 0x4F, 0x71, 0x65, 0x27, 0x59, 0xE2, 0x5A, 0x57, 0x3C, + 0x8D, 0x3F, 0x5F, 0x0B, 0xD2, 0x14, 0x9C, 0xDA, 0x7F, 0xDF, 0x90, 0xB9, + 0x88, 0xB6, 0x33, 0xAE, 0xC6, 0xAC, 0xB6, 0xB2, 0x7A, 0xBC, 0x6F, 0xBF, + 0xC7, 0xD2, 0xD9, 0xD5, 0xCC, 0xEA, 0xFD, 0xF0, 0x7F, 0xF7, 0x69, 0xF7, + 0x09, 0xF4, 0xE6, 0xE4, 0x22, 0xEF, 0x51, 0xCB, 0x8A, 0xE1, 0x71, 0xBB, + 0x55, 0xCE, 0xDA, 0xBC, 0x80, 0xCB, 0xC8, 0xD0, 0xCA, 0xDF, 0x62, 0xEC, + 0xBF, 0xFC, 0x37, 0x00, 0x4B, 0x11, 0x19, 0x03, 0xEF, 0x13, 0xC4, 0xF9, + 0x18, 0x0E, 0xEF, 0xF0, 0xB1, 0x0A, 0xA5, 0xDF, 0x20, 0x02, 0x8D, 0xD1, + 0xC5, 0xFE, 0x09, 0xD5, 0x5A, 0xFD, 0x2B, 0xDF, 0xE3, 0xED, 0x7A, 0xE6, + 0x3A, 0xDB, 0xFE, 0xEB, 0x97, 0xCF, 0xE6, 0xF2, 0x31, 0xC7, 0x4E, 0xF1, + 0x94, 0xC8, 0x55, 0xEC, 0x64, 0xD9, 0x0A, 0xED, 0x63, 0xEA, 0x3E, 0xED, + 0x3C, 0xEF, 0x32, 0xEE, 0xC2, 0xE5, 0xFA, 0xF4, 0xFA, 0xDF, 0x5A, 0x01, + 0x7A, 0xE3, 0x8A, 0x01, 0xE0, 0xE4, 0x3E, 0xEF, 0x52, 0xEC, 0x7D, 0xE1, + 0x0C, 0xEC, 0x0E, 0xE3, 0xAB, 0xDC, 0x78, 0xE6, 0xD3, 0xCA, 0xAD, 0xDB, + 0x25, 0xCB, 0x01, 0xD7, 0x03, 0xE5, 0xE9, 0xD9, 0x7C, 0xFC, 0x7B, 0xDB, + 0x8B, 0xFA, 0xE1, 0xE5, 0x0D, 0xEB, 0x52, 0xF0, 0xF3, 0xDE, 0x4B, 0xE7, + 0x7F, 0xDA, 0x6B, 0xD1, 0x52, 0xDF, 0xED, 0xCF, 0x52, 0xE0, 0x7E, 0xD1, + 0xBD, 0xD9, 0xDC, 0xCC, 0x56, 0xE5, 0x44, 0xDE, 0x94, 0xFD, 0x94, 0xFA, + 0x2D, 0xF7, 0x4C, 0x04, 0xB3, 0xE9, 0xDD, 0xFC, 0x69, 0xFF, 0x7C, 0x01, + 0x84, 0x14, 0xC6, 0x05, 0xB4, 0x13, 0x1A, 0xFA, 0x98, 0x13, 0xD1, 0xF8, + 0xFA, 0x0B, 0x2A, 0xFD, 0xDC, 0xF7, 0xF2, 0xE4, 0xB1, 0xE3, 0x06, 0xBC, + 0x64, 0xC7, 0x89, 0xA0, 0xF9, 0xA4, 0x37, 0x9E, 0x5C, 0x9A, 0xFB, 0xBA, + 0x79, 0xB8, 0xA5, 0xE5, 0xCF, 0xED, 0xAA, 0x11, 0x68, 0x21, 0xF9, 0x2F, + 0x82, 0x49, 0xB0, 0x39, 0x08, 0x50, 0xA7, 0x35, 0xAD, 0x34, 0xB3, 0x1D, + 0x51, 0x15, 0x6E, 0xFA, 0x18, 0xF4, 0xC5, 0xD7, 0x85, 0xD4, 0x75, 0xBA, + 0x23, 0xBD, 0x81, 0xB1, 0xE6, 0xAC, 0xDE, 0xBF, 0x77, 0xB5, 0xE2, 0xCD, + 0x9C, 0xD4, 0xCF, 0xDC, 0x6D, 0xF4, 0x96, 0xEE, 0x1D, 0x0E, 0xBD, 0xF2, + 0x5F, 0x15, 0xE3, 0xF2, 0xA9, 0x0A, 0x82, 0xF6, 0x8E, 0xFD, 0xA9, 0xF1, + 0x46, 0xF0, 0xBA, 0xE9, 0xCC, 0xEE, 0x3A, 0xF2, 0x51, 0xFC, 0x87, 0x01, + 0xC4, 0x0A, 0x08, 0x09, 0x77, 0x0D, 0xDC, 0x0C, 0x3A, 0x07, 0x39, 0x16, + 0xCD, 0xFE, 0xB9, 0x1E, 0xE5, 0xF9, 0xA4, 0x1F, 0xEC, 0x07, 0x28, 0x1F, + 0x4C, 0x1A, 0xE7, 0x1F, 0x2C, 0x1A, 0x29, 0x1B, 0xBA, 0x13, 0x83, 0x15, + 0x33, 0x16, 0x7C, 0x1A, 0x6C, 0x15, 0xA2, 0x18, 0x9E, 0x0D, 0x8B, 0x0D, + 0x19, 0x12, 0x13, 0x0C, 0xAA, 0x18, 0x52, 0x17, 0xA4, 0x10, 0x16, 0x1F, + 0x9F, 0x10, 0x60, 0x1F, 0x00, 0x19, 0x4A, 0x2A, 0x68, 0x17, 0x2F, 0x2E, + 0x9C, 0x0F, 0xDB, 0x1B, 0x15, 0x13, 0x58, 0x15, 0x97, 0x1C, 0xC4, 0x1E, + 0xBB, 0x1A, 0x2F, 0x25, 0xA4, 0x10, 0xB9, 0x28, 0x8F, 0x10, 0xF5, 0x2A, + 0xB7, 0x1D, 0xDF, 0x29, 0x8C, 0x1F, 0xB9, 0x24, 0xE1, 0x18, 0x8B, 0x1B, + 0x52, 0x17, 0x53, 0x12, 0x0C, 0x14, 0xE9, 0x13, 0xB2, 0x11, 0x8B, 0x12, + 0xF3, 0x1C, 0x29, 0x15, 0x92, 0x26, 0x33, 0x1D, 0x74, 0x18, 0x76, 0x14, + 0x68, 0x07, 0x94, 0x09, 0xC9, 0x18, 0x8B, 0x18, 0xDA, 0x2C, 0x99, 0x28, + 0x04, 0x25, 0x95, 0x1B, 0x68, 0x21, 0x9B, 0x1B, 0xAC, 0x25, 0x7E, 0x2B, + 0x02, 0x25, 0x4E, 0x25, 0xDB, 0x2F, 0x85, 0x18, 0x59, 0x46, 0xD7, 0x15, + 0xD8, 0x3E, 0x9F, 0x0C, 0x98, 0x12, 0x9D, 0xEF, 0x6C, 0xEF, 0x6A, 0xD0, + 0x11, 0xDB, 0x4D, 0xB9, 0x36, 0xC7, 0x5D, 0xB4, 0x5C, 0xCA, 0xF8, 0xDC, + 0x8B, 0xF6, 0x62, 0x1D, 0xBE, 0x2F, 0xB3, 0x48, 0x43, 0x55, 0xEE, 0x5D, + 0x9E, 0x63, 0x85, 0x64, 0x9B, 0x5E, 0x8A, 0x55, 0x5C, 0x4A, 0x1A, 0x3A, + 0x99, 0x2C, 0x96, 0x1A, 0xB1, 0x07, 0x3E, 0xFF, 0x6E, 0xDD, 0xC5, 0xED, + 0xBE, 0xC2, 0x49, 0xE6, 0x3E, 0xC4, 0xEB, 0xF5, 0x51, 0xDA, 0x78, 0x13, + 0xF4, 0xFC, 0xDC, 0x27, 0x79, 0x16, 0x9D, 0x30, 0x0B, 0x1F, 0x95, 0x2D, + 0xB6, 0x21, 0x44, 0x21, 0x80, 0x23, 0x12, 0x1D, 0xE0, 0x28, 0xC0, 0x21, + 0xFF, 0x2B, 0x13, 0x28, 0x2F, 0x23, 0x83, 0x37, 0x5B, 0x1A, 0x23, 0x49, + 0x93, 0x1D, 0xBE, 0x4D, 0x28, 0x28, 0x7B, 0x42, 0xBE, 0x30, 0x90, 0x33, + 0xB8, 0x2B, 0x67, 0x29, 0x03, 0x23, 0x28, 0x1C, 0xD7, 0x28, 0xD5, 0x16, + 0x6C, 0x33, 0xEA, 0x1E, 0x02, 0x2E, 0x60, 0x27, 0xB4, 0x1E, 0x56, 0x2D, + 0x77, 0x1A, 0xE1, 0x2E, 0xDD, 0x21, 0xA7, 0x29, 0xBC, 0x23, 0x78, 0x23, + 0x3D, 0x26, 0x2B, 0x24, 0x70, 0x33, 0x39, 0x23, 0x8B, 0x39, 0xEB, 0x1D, + 0x83, 0x36, 0x74, 0x1A, 0x8D, 0x34, 0x9A, 0x19, 0x8A, 0x2E, 0x37, 0x1B, + 0x47, 0x29, 0x9F, 0x18, 0x83, 0x26, 0xFA, 0x10, 0x7A, 0x26, 0xD1, 0x0A, + 0x68, 0x2E, 0x6B, 0x0D, 0x75, 0x23, 0x17, 0x09, 0x4D, 0x06, 0xAB, 0x02, + 0x79, 0xF9, 0x67, 0x13, 0x08, 0x02, 0x18, 0x27, 0xBB, 0x09, 0xA7, 0x24, + 0xF3, 0x0B, 0xC5, 0x17, 0xE3, 0xFD, 0x59, 0x06, 0x99, 0xE5, 0x43, 0xF2, + 0x25, 0xE4, 0x9B, 0xEA, 0x80, 0xEE, 0xA8, 0xED, 0x5F, 0xEC, 0x2B, 0xED, + 0x22, 0xE8, 0x86, 0xFB, 0xB7, 0xF3, 0xF3, 0x1B, 0x60, 0xFA, 0xDF, 0x22, + 0x88, 0xF7, 0x56, 0x16, 0xB8, 0x03, 0x15, 0x14, 0xB6, 0x10, 0x38, 0x12, + 0x9D, 0x11, 0x17, 0x03, 0x92, 0x0E, 0x7E, 0xF9, 0x6D, 0x01, 0xE3, 0xF3, + 0x38, 0xE3, 0xAE, 0xDD, 0x62, 0xBF, 0x7A, 0xBF, 0xD7, 0xA6, 0x9D, 0xA6, + 0xB7, 0x9B, 0x41, 0x9D, 0x90, 0x9E, 0xC1, 0xA5, 0xFA, 0xB7, 0x37, 0xC9, + 0x5D, 0xE3, 0x5F, 0x02, 0xD4, 0x11, 0xB4, 0x2F, 0xBC, 0x3E, 0x91, 0x48, + 0x7D, 0x5B, 0x95, 0x48, 0xA1, 0x51, 0x9C, 0x2D, 0xAD, 0x1E, 0x63, 0x04, + 0x9D, 0xDF, 0x44, 0xDF, 0xB1, 0xB8, 0xBC, 0xC9, 0x7E, 0xAE, 0xE3, 0xBC, + 0x86, 0xAD, 0x81, 0xB9, 0x60, 0xB0, 0x91, 0xC3, 0x0D, 0xBF, 0xC6, 0xDA, + 0xC5, 0xD4, 0x09, 0xF1, 0x88, 0xE0, 0xE7, 0xF8, 0xC3, 0xDC, 0x16, 0xF8, + 0x8C, 0xDB, 0xE2, 0xF6, 0x4A, 0xDD, 0xE9, 0xEE, 0x76, 0xD9, 0x96, 0xE4, + 0x4D, 0xDD, 0x77, 0xEE, 0xAF, 0xEB, 0xAB, 0x02, 0x44, 0xFD, 0x3C, 0x00, + 0x4F, 0x0F, 0x43, 0xF3, 0x50, 0x1B, 0x81, 0xF8, 0xEF, 0x18, 0x79, 0x02, + 0x85, 0x0C, 0x14, 0x03, 0xCB, 0x04, 0x52, 0x06, 0xDF, 0x0D, 0xDF, 0x0A, + 0xE6, 0x1C, 0xDA, 0x06, 0x38, 0x21, 0x20, 0x01, 0x3F, 0x19, 0x71, 0x03, + 0x2D, 0x09, 0x25, 0x08, 0xD3, 0xFA, 0xDB, 0x05, 0xB5, 0xFA, 0x6C, 0x08, + 0x40, 0x06, 0x8C, 0x15, 0x1E, 0x0C, 0xE5, 0x1B, 0x71, 0x0E, 0x1E, 0x18, + 0x1D, 0x1C, 0x50, 0x18, 0xE3, 0x30, 0x0D, 0x19, 0x70, 0x2F, 0xCB, 0x09, + 0xB8, 0x1F, 0x99, 0xFE, 0xB0, 0x17, 0x85, 0x01, 0xDD, 0x12, 0xBF, 0x08, + 0x71, 0x0E, 0x52, 0x0E, 0xE5, 0x09, 0x00, 0x0F, 0x1D, 0x09, 0xDA, 0x14, + 0x1F, 0x0D, 0x1D, 0x16, 0xB8, 0x13, 0xD0, 0x11, 0x22, 0x1A, 0xCF, 0x0A, + 0x1B, 0x1F, 0x69, 0x05, 0xDC, 0x14, 0x66, 0xFD, 0xE0, 0xFF, 0x4B, 0xF7, + 0x6C, 0xF1, 0x44, 0x02, 0x13, 0xE8, 0xEF, 0x08, 0xC9, 0xE6, 0xF4, 0xFF, + 0x01, 0xF7, 0xC5, 0x09, 0xF0, 0x08, 0xC0, 0x24, 0xDE, 0x05, 0x5E, 0x22, + 0x2C, 0x02, 0x83, 0x17, 0x38, 0x09, 0xF0, 0x26, 0x62, 0x0A, 0x5F, 0x2D, + 0xB6, 0x07, 0x8C, 0x1E, 0xD7, 0x12, 0x40, 0x13, 0x44, 0x1E, 0xF2, 0x03, + 0x46, 0x05, 0x7D, 0xE6, 0x6B, 0xD4, 0xED, 0xCC, 0x62, 0xAE, 0x4C, 0xB9, + 0x8E, 0xA0, 0xEB, 0xAC, 0x33, 0xAD, 0xC0, 0xBF, 0x8E, 0xD3, 0xCA, 0xEF, + 0x6E, 0x0A, 0x27, 0x24, 0x08, 0x3A, 0x82, 0x48, 0x8E, 0x53, 0xDF, 0x51, + 0xA3, 0x56, 0xEA, 0x3D, 0x9C, 0x41, 0xA5, 0x13, 0x8D, 0x14, 0x7E, 0xE2, + 0xF6, 0xDE, 0x28, 0xC2, 0x5F, 0xB8, 0xD8, 0xBB, 0xB4, 0xB1, 0x97, 0xC3, + 0xF5, 0xC7, 0x1D, 0xCD, 0x19, 0xE1, 0x5C, 0xDA, 0x2C, 0xF3, 0xF7, 0xEB, + 0x40, 0x08, 0x14, 0xF1, 0x0A, 0x17, 0xCE, 0xE9, 0x21, 0x11, 0xA1, 0xE9, + 0xF0, 0x05, 0xEB, 0xED, 0xFA, 0xF7, 0x00, 0xEB, 0x87, 0xEA, 0x71, 0xE5, + 0xA0, 0xEF, 0x19, 0xE9, 0x05, 0xFA, 0x73, 0xFB, 0xBB, 0xF6, 0xFE, 0x0A, + 0x4F, 0xF2, 0xB4, 0x11, 0xF0, 0xF9, 0xCC, 0x16, 0x48, 0x02, 0x6C, 0x0F, + 0x4D, 0x00, 0x3A, 0x03, 0xEB, 0xF1, 0xFB, 0x01, 0x91, 0xE6, 0x4D, 0xFE, + 0xE3, 0xEB, 0x02, 0xED, 0x58, 0xF8, 0x24, 0xE0, 0x11, 0x02, 0x66, 0xDB, + 0x5E, 0xFB, 0x0B, 0xD5, 0xA1, 0xE0, 0xA5, 0xD4, 0xEC, 0xC8, 0x84, 0xDD, + 0x4B, 0xC3, 0xC8, 0xE7, 0xBF, 0xD3, 0xB5, 0xEB, 0x10, 0xEC, 0xF2, 0xF1, + 0x98, 0xFB, 0x83, 0xF8, 0x6B, 0x02, 0x63, 0xF0, 0xDA, 0xFE, 0x28, 0xE3, + 0x39, 0xF5, 0x75, 0xDF, 0x09, 0xE6, 0xE1, 0xDA, 0x6F, 0xE0, 0x78, 0xD5, + 0x4D, 0xEB, 0x8F, 0xCF, 0x2A, 0xF1, 0x7C, 0xCC, 0x85, 0xE4, 0xE9, 0xD9, + 0xD6, 0xD4, 0x84, 0xEE, 0xDC, 0xD0, 0xC6, 0xF1, 0xE2, 0xD0, 0x0B, 0xE8, + 0x93, 0xDB, 0xA3, 0xDC, 0x20, 0xEA, 0x71, 0xD2, 0xFF, 0xED, 0xBE, 0xD6, + 0x40, 0xE9, 0xB9, 0xDC, 0x7A, 0xDB, 0x44, 0xD7, 0xE2, 0xD3, 0x73, 0xD9, + 0xFA, 0xE3, 0xFA, 0xF1, 0x2C, 0xEE, 0x62, 0xFD, 0x02, 0xE2, 0x5E, 0xE9, + 0x8C, 0xE4, 0x4C, 0xE6, 0xDE, 0xF6, 0xB3, 0xF7, 0x2C, 0xFB, 0xFA, 0xF6, + 0x17, 0xF7, 0xF7, 0xEB, 0x05, 0xF4, 0x87, 0xE8, 0xCC, 0xE5, 0x87, 0xDB, + 0x3D, 0xCC, 0xD7, 0xC3, 0xE1, 0xB3, 0x56, 0xB6, 0xA2, 0xA2, 0x2F, 0xAF, + 0x07, 0x9F, 0xDB, 0xB5, 0x7B, 0xB7, 0xE3, 0xD5, 0x13, 0xE8, 0x36, 0xFE, + 0x2A, 0x15, 0xF8, 0x21, 0x4C, 0x33, 0xF2, 0x3E, 0xFC, 0x46, 0x90, 0x47, + 0xE4, 0x41, 0x64, 0x32, 0x2B, 0x22, 0x01, 0x0F, 0x69, 0xF8, 0x33, 0xEA, + 0xAE, 0xD0, 0xA2, 0xCB, 0x65, 0xB3, 0x58, 0xBB, 0x01, 0xAB, 0xFD, 0xBA, + 0xEC, 0xB8, 0x29, 0xCB, 0x92, 0xD0, 0xF2, 0xE2, 0xA2, 0xEE, 0x92, 0xFA, + 0xFB, 0x08, 0xA4, 0x04, 0x7F, 0x10, 0x7B, 0xF9, 0xA6, 0x0E, 0x0B, 0xED, + 0x35, 0x10, 0x88, 0xEB, 0x26, 0x0A, 0x9D, 0xE7, 0x63, 0xFE, 0x29, 0xE6, + 0x28, 0x0B, 0xC4, 0xEE, 0x63, 0x22, 0x08, 0xF5, 0xFD, 0x1D, 0xFD, 0xFD, + 0x85, 0x0E, 0x28, 0x0B, 0x25, 0x08, 0xBA, 0x13, 0x5F, 0x06, 0x9D, 0x0E, + 0xDA, 0x0B, 0xD6, 0x00, 0x93, 0x12, 0xD1, 0x09, 0x61, 0x11, 0xDF, 0x21, + 0x63, 0x10, 0x0D, 0x29, 0x35, 0x12, 0x95, 0x24, 0x6C, 0x13, 0xD9, 0x1E, + 0x13, 0x15, 0x4B, 0x19, 0xAE, 0x10, 0x6C, 0x18, 0xBE, 0x0A, 0xD8, 0x1C, + 0x91, 0x07, 0x29, 0x1E, 0xE8, 0x04, 0x6A, 0x1D, 0x1B, 0x0B, 0x30, 0x18, + 0x5A, 0x15, 0xAA, 0x16, 0x11, 0x14, 0x0A, 0x16, 0xBE, 0x0B, 0xDA, 0x0A, + 0x11, 0x0F, 0x07, 0x0E, 0xC9, 0x1B, 0x0D, 0x20, 0x3C, 0x1D, 0x59, 0x2E, + 0x73, 0x10, 0xDA, 0x2A, 0xBE, 0x16, 0xDC, 0x1B, 0x7C, 0x28, 0x5F, 0x0E, + 0x76, 0x29, 0x3B, 0x03, 0x53, 0x20, 0x76, 0x07, 0xEB, 0x12, 0x8F, 0x11, + 0x4E, 0x06, 0x26, 0x09, 0x09, 0x03, 0x7E, 0xFD, 0x11, 0x06, 0xDF, 0x08, + 0x01, 0x03, 0x2D, 0x10, 0xE9, 0xFD, 0xC0, 0xFE, 0xAC, 0x0A, 0x26, 0x01, + 0x34, 0x27, 0xB7, 0x1C, 0x0A, 0x30, 0x37, 0x26, 0x8E, 0x22, 0xFA, 0x1F, + 0x02, 0x2B, 0xB0, 0x22, 0xE9, 0x41, 0xFB, 0x21, 0x25, 0x3D, 0xFE, 0x0F, + 0x18, 0x30, 0x23, 0x07, 0x0E, 0x30, 0x28, 0x09, 0x5B, 0x1D, 0xD5, 0xF3, + 0x14, 0xEC, 0x6A, 0xCB, 0xF2, 0xC2, 0x21, 0xB1, 0x67, 0xAE, 0x37, 0xAD, + 0x27, 0xA9, 0x45, 0xC2, 0x12, 0xC9, 0xA0, 0xF4, 0x23, 0x0C, 0x2F, 0x28, + 0xB5, 0x47, 0x65, 0x49, 0x2B, 0x60, 0x0E, 0x5E, 0x97, 0x5C, 0xCB, 0x5A, + 0xA6, 0x49, 0x25, 0x2F, 0x50, 0x2E, 0x9F, 0xEF, 0x3C, 0x09, 0x77, 0xC0, + 0xB0, 0xD8, 0xAF, 0xB2, 0x36, 0xAF, 0xE7, 0xBD, 0x33, 0xA4, 0xE4, 0xCD, + 0x85, 0xB3, 0xC6, 0xDD, 0xC9, 0xCD, 0x93, 0xF2, 0x20, 0xE8, 0xD8, 0xFE, + 0xC3, 0xF1, 0x2B, 0x00, 0x3C, 0xE9, 0x32, 0x07, 0x89, 0xE0, 0xC0, 0x0E, + 0x97, 0xDB, 0xEA, 0x0E, 0xDD, 0xDA, 0x91, 0x0D, 0x78, 0xEE, 0x9F, 0x09, + 0x8B, 0x0B, 0x70, 0xFC, 0xE2, 0x1A, 0x39, 0xEA, 0x4A, 0x1A, 0x2B, 0xE3, + 0x8B, 0x0A, 0x1C, 0xEE, 0xF3, 0xF8, 0x58, 0xFC, 0xAF, 0xF1, 0xA1, 0x08, + 0x02, 0xF6, 0xBB, 0x0E, 0x63, 0xFE, 0x50, 0x04, 0x03, 0xFC, 0xB7, 0xFC, + 0xD2, 0xF4, 0x65, 0x05, 0x24, 0xF1, 0xDD, 0x0E, 0x4E, 0xF3, 0x9A, 0x09, + 0x76, 0xFE, 0x17, 0xF8, 0xA6, 0xFD, 0xC8, 0xFA, 0x12, 0xED, 0x21, 0x0E, + 0x2E, 0xEB, 0xE4, 0x0E, 0x16, 0xF9, 0xD9, 0x0A, 0x2C, 0x07, 0x76, 0x0B, + 0xEA, 0x14, 0x05, 0x00, 0x5B, 0x0E, 0xC3, 0xF3, 0x9C, 0xFA, 0x1D, 0xF7, + 0x7D, 0xEE, 0xAB, 0xFA, 0x4D, 0xE9, 0xB1, 0xFA, 0x87, 0xF0, 0x4B, 0xFC, + 0x08, 0xFA, 0x65, 0xFF, 0xE8, 0x00, 0x8D, 0x06, 0x7B, 0x0B, 0x7A, 0x07, + 0x3B, 0x13, 0x9A, 0x08, 0xFE, 0x0F, 0xE9, 0x08, 0x56, 0x04, 0x12, 0x01, + 0x3A, 0xF8, 0x47, 0xF7, 0xCB, 0xFD, 0xD9, 0xF6, 0x28, 0x0B, 0xB1, 0xFD, + 0x6C, 0x04, 0xD0, 0xF5, 0xA1, 0xF5, 0xE0, 0xF0, 0x96, 0xFA, 0x24, 0x0E, + 0x16, 0x0D, 0x0D, 0x26, 0x4E, 0x0E, 0x62, 0x17, 0x7E, 0x04, 0x68, 0x16, + 0x29, 0x0C, 0x00, 0x2B, 0xDD, 0x19, 0x6B, 0x22, 0x55, 0x21, 0x9D, 0x0B, + 0x32, 0x2D, 0x42, 0x04, 0x80, 0x23, 0x96, 0xF9, 0x37, 0xF2, 0xD1, 0xDE, + 0xB2, 0xC8, 0x6C, 0xBE, 0x1F, 0xB5, 0xA5, 0xA3, 0x1D, 0xA7, 0xCB, 0x98, + 0xC4, 0xB6, 0x36, 0xB1, 0xBD, 0xE5, 0xFE, 0xED, 0x65, 0x12, 0x2D, 0x2B, + 0xA6, 0x39, 0xF0, 0x50, 0x29, 0x5D, 0x8B, 0x61, 0x09, 0x5E, 0x3B, 0x53, + 0xCC, 0x33, 0xA2, 0x29, 0x68, 0x02, 0x5D, 0xFC, 0xEB, 0xDB, 0xB1, 0xD3, + 0x49, 0xBE, 0x1B, 0xB5, 0xF1, 0xB5, 0x19, 0xAA, 0xDA, 0xC2, 0x08, 0xBA, + 0xCF, 0xD6, 0x6D, 0xDB, 0x01, 0xF4, 0xC7, 0xF6, 0x7C, 0x0A, 0xCE, 0x09, + 0x1C, 0x05, 0xFE, 0x17, 0x66, 0xF5, 0xD9, 0x18, 0x5F, 0xEB, 0x4E, 0x11, + 0xE0, 0xE6, 0x39, 0x0B, 0xB4, 0xE4, 0x6D, 0x0A, 0xC5, 0xE1, 0xB3, 0x14, + 0x5D, 0xE6, 0x2E, 0x21, 0xC2, 0xFA, 0x92, 0x23, 0xA3, 0x16, 0xAD, 0x1F, + 0x52, 0x25, 0xE5, 0x1B, 0x7D, 0x22, 0xC3, 0x1C, 0x35, 0x21, 0xDA, 0x19, + 0x7B, 0x26, 0x0F, 0x10, 0xB1, 0x22, 0xF0, 0x07, 0x75, 0x19, 0x31, 0x06, + 0xF5, 0x12, 0xA3, 0x0C, 0xFD, 0x08, 0x35, 0x17, 0x47, 0x00, 0x3F, 0x23, + 0xF2, 0x03, 0x11, 0x29, 0xDF, 0x14, 0x45, 0x1F, 0xE8, 0x1F, 0xF3, 0x14, + 0x2D, 0x1E, 0x88, 0x17, 0x68, 0x1A, 0x4F, 0x16, 0x1B, 0x1A, 0x13, 0x0F, + 0x7C, 0x22, 0x17, 0x12, 0x9A, 0x28, 0x51, 0x15, 0x1D, 0x26, 0xDB, 0x14, + 0xC3, 0x23, 0x59, 0x1D, 0x53, 0x1F, 0x39, 0x2F, 0xF4, 0x0B, 0x6B, 0x30, + 0xD3, 0xFC, 0x8A, 0x29, 0xB5, 0x05, 0x46, 0x32, 0x87, 0x1B, 0xC4, 0x35, + 0xA1, 0x28, 0xD6, 0x2A, 0x85, 0x1E, 0x7D, 0x27, 0x27, 0x07, 0x7D, 0x28, + 0x44, 0xF5, 0xD7, 0x1B, 0x18, 0xFB, 0xF4, 0x0D, 0xA8, 0x0B, 0x3A, 0x00, + 0x70, 0x11, 0x08, 0xEF, 0xFB, 0x12, 0xA6, 0xEF, 0x8C, 0x17, 0x77, 0x0E, + 0x5E, 0x16, 0x60, 0x29, 0xED, 0x15, 0xD5, 0x27, 0x73, 0x28, 0x0D, 0x26, + 0x38, 0x40, 0x4A, 0x2C, 0x55, 0x44, 0xBA, 0x28, 0xD1, 0x35, 0x65, 0x22, + 0x6C, 0x2A, 0xA5, 0x1F, 0xB2, 0x1D, 0x1F, 0x0E, 0x05, 0xFB, 0x01, 0xEF, + 0x45, 0xD2, 0x44, 0xD4, 0x76, 0xC1, 0xCE, 0xC2, 0x86, 0xCE, 0x5C, 0xC8, + 0x43, 0xF1, 0xE4, 0xEE, 0x1E, 0x1B, 0xCA, 0x26, 0x7E, 0x3F, 0x3F, 0x54, + 0xE0, 0x5D, 0xB9, 0x64, 0x14, 0x68, 0x90, 0x59, 0xFC, 0x4D, 0x56, 0x3E, + 0xAC, 0x21, 0xF0, 0x1F, 0x71, 0xF7, 0xE5, 0x06, 0xF3, 0xDA, 0x6C, 0xF6, + 0x59, 0xD8, 0x2E, 0xF2, 0x9D, 0xE4, 0x7D, 0xFB, 0x8E, 0xEB, 0xD6, 0x09, + 0xA5, 0xF6, 0x51, 0x15, 0x26, 0x17, 0x9F, 0x18, 0xE7, 0x37, 0x94, 0x0A, + 0x6D, 0x3E, 0x0D, 0xFD, 0xFF, 0x2C, 0xE3, 0x01, 0x93, 0x0D, 0xA4, 0x0E, + 0x26, 0xEE, 0x77, 0x1A, 0x5D, 0xED, 0xC9, 0x21, 0x11, 0x09, 0x78, 0x24, + 0x97, 0x1D, 0x6B, 0x25, 0x7F, 0x2A, 0x60, 0x2A, 0x8E, 0x36, 0x04, 0x33, + 0x71, 0x36, 0xFC, 0x35, 0xC0, 0x2B, 0xEA, 0x30, 0x99, 0x1F, 0x4A, 0x2C, + 0x8B, 0x1B, 0xC5, 0x26, 0x69, 0x1D, 0x86, 0x17, 0x45, 0x1B, 0xE7, 0x08, + 0x4A, 0x16, 0xA3, 0x09, 0x55, 0x13, 0x87, 0x16, 0xAB, 0x12, 0x39, 0x23, + 0xFE, 0x13, 0x3E, 0x2B, 0xEE, 0x15, 0x9D, 0x2E, 0x87, 0x13, 0xE2, 0x22, + 0xF4, 0x0C, 0x97, 0x0F, 0xEE, 0x09, 0x02, 0x05, 0x13, 0x12, 0x5F, 0x06, + 0x67, 0x16, 0x82, 0x01, 0xB4, 0x0B, 0xB2, 0xF0, 0xC3, 0xFF, 0x4E, 0xE4, + 0x25, 0xFB, 0xBB, 0xDE, 0x17, 0xFA, 0x07, 0xDE, 0xC4, 0xFA, 0x2A, 0xE1, + 0x7E, 0x06, 0xC7, 0xE9, 0x38, 0x0C, 0xF9, 0xF3, 0x6D, 0x04, 0x5F, 0xF8, + 0x5F, 0xFF, 0x4A, 0xF0, 0x53, 0xF9, 0x2D, 0xDD, 0x28, 0xE7, 0x80, 0xC8, + 0x39, 0xD9, 0x91, 0xC6, 0x18, 0xDD, 0x62, 0xD8, 0x2B, 0xDD, 0x82, 0xE2, + 0x6D, 0xD4, 0x49, 0xE5, 0x37, 0xDD, 0x00, 0xF2, 0xA1, 0xEE, 0xEF, 0xF9, + 0xC9, 0xE3, 0x24, 0xEB, 0x57, 0xDB, 0xA6, 0xDD, 0x2E, 0xF1, 0xCD, 0xE5, + 0xB5, 0xFA, 0x54, 0xF1, 0x3D, 0xEC, 0xFF, 0xEF, 0xEC, 0xE6, 0xE4, 0xEE, + 0xB3, 0xE0, 0x99, 0xE7, 0x0B, 0xC3, 0x31, 0xC9, 0x1C, 0xA6, 0x01, 0xAE, + 0x67, 0x9C, 0xB1, 0xA4, 0xD4, 0x9A, 0x8E, 0xA3, 0x47, 0xAA, 0x84, 0xB9, + 0xB1, 0xD9, 0x40, 0xE2, 0x0D, 0x08, 0xEE, 0x00, 0x99, 0x19, 0x82, 0x13, + 0xB9, 0x25, 0x4A, 0x20, 0x6A, 0x28, 0x42, 0x17, 0xAF, 0x0E, 0x91, 0xF1, + 0x91, 0xEB, 0x9F, 0xCA, 0xEC, 0xC8, 0x62, 0xB4, 0xE3, 0xA8, 0xB3, 0xAA, + 0x08, 0x9E, 0x33, 0xA6, 0x64, 0xAA, 0x75, 0xA9, 0x51, 0xBF, 0xC1, 0xB2, + 0x34, 0xD9, 0x5C, 0xBF, 0x7D, 0xED, 0x1B, 0xD4, 0x5F, 0xF0, 0xF3, 0xE3, + 0x3C, 0xEB, 0xB7, 0xE7, 0x14, 0xE7, 0xA0, 0xE1, 0x9A, 0xDF, 0x15, 0xD2, + 0xA2, 0xD9, 0x9F, 0xC2, 0xFD, 0xE6, 0x00, 0xBD, 0x53, 0xFE, 0x0C, 0xC7, + 0x8C, 0x02, 0x9B, 0xDD, 0x3B, 0xF8, 0x59, 0xF2, 0x9F, 0xF4, 0xC3, 0xFD, + 0x3E, 0xF5, 0x76, 0x03, 0xA5, 0xF5, 0xFF, 0xFF, 0x4A, 0xFC, 0x57, 0xF8, + 0x2D, 0x04, 0x44, 0xF6, 0x97, 0x08, 0x03, 0xF4, 0x3A, 0x0F, 0x1D, 0xF0, + 0x0F, 0x17, 0x60, 0xEF, 0xC1, 0x0C, 0xE8, 0xF5, 0x22, 0xEC, 0x26, 0x02, + 0xD3, 0xD9, 0x42, 0x11, 0x56, 0xE4, 0xDB, 0x18, 0x24, 0xF8, 0xAC, 0x12, + 0xB6, 0x06, 0x29, 0x05, 0x05, 0x07, 0x3D, 0xFE, 0x2D, 0x00, 0xB4, 0x01, + 0x00, 0xF6, 0x50, 0x04, 0x00, 0xF2, 0x61, 0x09, 0xAE, 0xFE, 0x8B, 0x09, + 0x22, 0x17, 0x0C, 0x06, 0xD3, 0x1F, 0x56, 0xFC, 0x62, 0x1A, 0xE3, 0xF4, + 0xE9, 0x1B, 0x72, 0x00, 0x5F, 0x16, 0xD4, 0x0D, 0xCE, 0x07, 0xEA, 0x0D, + 0x03, 0x05, 0x5D, 0x05, 0xAB, 0x06, 0xB1, 0x01, 0x06, 0xF5, 0x7F, 0x04, + 0x45, 0xE9, 0xDD, 0x0B, 0x3F, 0xED, 0x14, 0x0B, 0x98, 0xEB, 0xC4, 0xFB, + 0x01, 0xF3, 0xF1, 0xF7, 0x59, 0x0B, 0xF2, 0x0A, 0x1D, 0x0D, 0x9E, 0x14, + 0x79, 0xFA, 0xAA, 0x0F, 0xE6, 0x03, 0xA9, 0x1A, 0x64, 0x1F, 0x81, 0x27, + 0x23, 0x33, 0xF3, 0x20, 0xFA, 0x3C, 0x3E, 0x14, 0xE6, 0x2F, 0xB2, 0x08, + 0x2C, 0x02, 0xE2, 0xF4, 0xCB, 0xCD, 0x1A, 0xDB, 0xC5, 0xAE, 0xA2, 0xC9, + 0xBE, 0x9F, 0x02, 0xC1, 0x1D, 0xA9, 0x0B, 0xC2, 0xA2, 0xD6, 0x19, 0xDD, + 0x88, 0x10, 0x15, 0x06, 0xB9, 0x3F, 0xCC, 0x23, 0xBE, 0x5D, 0x49, 0x3A, + 0xF8, 0x61, 0xCE, 0x41, 0xA3, 0x4D, 0x07, 0x28, 0x37, 0x2E, 0x6C, 0x03, + 0x8A, 0x0B, 0x37, 0xEB, 0xB7, 0xE1, 0x5D, 0xD8, 0xD9, 0xBD, 0xE8, 0xCD, + 0x93, 0xBE, 0xA2, 0xD0, 0xEB, 0xD7, 0xC2, 0xDC, 0xD5, 0xF1, 0x16, 0xF2, + 0xAA, 0x0B, 0x2E, 0x07, 0x82, 0x1A, 0x3C, 0x0D, 0x3A, 0x19, 0xA0, 0x03, + 0xF0, 0x10, 0x91, 0xFD, 0xA4, 0x00, 0x13, 0xFE, 0xCA, 0xEB, 0x39, 0xF4, + 0x4F, 0xE5, 0x3C, 0xEC, 0xA1, 0xEE, 0x1A, 0xF3, 0xEE, 0xF8, 0x49, 0xF6, + 0xAF, 0x00, 0x95, 0xF2, 0xA5, 0x02, 0xF9, 0xF8, 0x0C, 0xFA, 0xEB, 0x00, + 0xBD, 0xEE, 0x85, 0xFF, 0x0D, 0xED, 0x7A, 0xFC, 0x61, 0xF7, 0x70, 0xFD, + 0x8F, 0x02, 0x2E, 0xFC, 0x1E, 0x0A, 0xB7, 0xF0, 0x59, 0x0E, 0xA5, 0xE4, + 0x2A, 0x0D, 0x09, 0xE1, 0x43, 0x09, 0x2F, 0xDF, 0x9C, 0xF8, 0x67, 0xE3, + 0x40, 0xE5, 0x28, 0xF0, 0xAD, 0xE3, 0xF6, 0xF5, 0x10, 0xF1, 0x0E, 0xEF, + 0x9B, 0xFD, 0xB6, 0xE9, 0xE8, 0xFA, 0x54, 0xF5, 0x63, 0xE8, 0xE6, 0xF7, + 0x36, 0xDB, 0x3E, 0xEA, 0xD7, 0xDE, 0xB8, 0xEB, 0xF2, 0xE1, 0x46, 0xF9, + 0x6E, 0xDC, 0x99, 0xFC, 0x95, 0xD2, 0x95, 0xF8, 0xB1, 0xD5, 0x02, 0xFC, + 0xB2, 0xE7, 0xE1, 0x00, 0x12, 0xF7, 0x2A, 0x02, 0xFE, 0xF9, 0xE6, 0x01, + 0xD1, 0xF6, 0xD1, 0xFC, 0x55, 0xF2, 0xD7, 0xE5, 0x53, 0xF3, 0x6E, 0xD4, + 0xD8, 0xF7, 0xB2, 0xE0, 0xAA, 0xE9, 0xCA, 0xEC, 0x77, 0xCE, 0x23, 0xEF, + 0xA0, 0xCD, 0x1C, 0xFA, 0x82, 0xEB, 0x55, 0x02, 0x3F, 0xFB, 0xC9, 0xF1, + 0x86, 0x00, 0x55, 0xE5, 0x25, 0x15, 0x1D, 0xF1, 0x27, 0x21, 0x2A, 0xFB, + 0x4A, 0x21, 0x25, 0xF7, 0x58, 0x2A, 0x83, 0xF0, 0xB0, 0x27, 0x8C, 0xEB, + 0x8D, 0x02, 0xD8, 0xDB, 0x08, 0xD7, 0x2E, 0xC5, 0xBC, 0xBC, 0x03, 0xB6, + 0xA6, 0xAC, 0xAC, 0xB8, 0x2E, 0xB1, 0xD1, 0xD4, 0xFB, 0xDE, 0x87, 0xFF, + 0x1C, 0x1F, 0xA3, 0x2A, 0x98, 0x4C, 0x41, 0x4B, 0x0B, 0x5F, 0x76, 0x58, + 0x2D, 0x4C, 0xEF, 0x4F, 0x16, 0x1F, 0x04, 0x2E, 0x19, 0xF4, 0x2F, 0xFD, + 0x5F, 0xD4, 0xFC, 0xD3, 0x3B, 0xC2, 0x76, 0xC0, 0xE1, 0xB9, 0xD5, 0xC5, + 0x53, 0xC0, 0x55, 0xD9, 0x9C, 0xD9, 0x8F, 0xF0, 0x96, 0xFD, 0x3E, 0x07, + 0xD7, 0x1B, 0xEA, 0x11, 0x65, 0x1E, 0x50, 0x11, 0x8E, 0x0E, 0x12, 0x0F, + 0x5C, 0x00, 0x6E, 0x0E, 0x0F, 0xF6, 0xA2, 0x08, 0x7F, 0xF6, 0x38, 0x01, + 0x38, 0x0B, 0x83, 0x00, 0x67, 0x20, 0x3D, 0x03, 0xCA, 0x26, 0x17, 0x0C, + 0x0A, 0x2A, 0x4B, 0x19, 0x86, 0x26, 0x85, 0x25, 0x43, 0x1C, 0x21, 0x29, + 0x03, 0x14, 0xE1, 0x25, 0x17, 0x0D, 0x6A, 0x1E, 0xD6, 0x0D, 0x71, 0x0E, + 0x89, 0x11, 0xB1, 0x0D, 0xA1, 0x10, 0x8E, 0x20, 0x17, 0x11, 0x2E, 0x2C, + 0x39, 0x15, 0xC8, 0x2A, 0x76, 0x1C, 0xAF, 0x27, 0x6B, 0x22, 0x61, 0x28, + 0x6F, 0x1F, 0x5C, 0x27, 0x67, 0x1F, 0xA1, 0x26, 0xD2, 0x2C, 0x3B, 0x26, + 0x6F, 0x3D, 0x87, 0x29, 0x91, 0x3D, 0xB5, 0x29, 0x90, 0x24, 0x4B, 0x22, + 0x7E, 0x0D, 0x69, 0x23, 0x92, 0x02, 0x36, 0x1E, 0x8A, 0x06, 0xE7, 0x16, + 0x14, 0x18, 0x34, 0x1D, 0x42, 0x22, 0x6F, 0x25, 0xEF, 0x25, 0x21, 0x29, + 0xB2, 0x30, 0x94, 0x2E, 0x5B, 0x2C, 0xCD, 0x38, 0xE0, 0x17, 0x3D, 0x35, + 0xB5, 0x13, 0x3E, 0x24, 0x29, 0x15, 0x0B, 0x1D, 0xC6, 0x19, 0x79, 0x1E, + 0x25, 0x27, 0xAA, 0x16, 0x17, 0x27, 0xAE, 0x0F, 0x50, 0x1E, 0xAB, 0x1B, + 0x87, 0x26, 0x07, 0x36, 0xE4, 0x28, 0x99, 0x3D, 0xC0, 0x1F, 0x50, 0x2F, + 0x57, 0x2F, 0x4A, 0x32, 0x11, 0x42, 0x31, 0x3F, 0x76, 0x33, 0x7C, 0x36, + 0x2E, 0x27, 0xA7, 0x1E, 0xDB, 0x36, 0x48, 0x07, 0x3B, 0x2C, 0xDF, 0xEC, + 0xED, 0xFE, 0x21, 0xD3, 0x21, 0xDD, 0x08, 0xC6, 0x45, 0xC6, 0x27, 0xC0, + 0x1B, 0xC3, 0x78, 0xC2, 0xBA, 0xE4, 0x5F, 0xDE, 0x08, 0x0D, 0x50, 0x0D, + 0x8D, 0x2B, 0xD7, 0x2F, 0xAF, 0x4C, 0x13, 0x3D, 0x9C, 0x65, 0x83, 0x3F, + 0x8B, 0x5C, 0x0C, 0x39, 0x71, 0x31, 0x81, 0x23, 0xD2, 0xFE, 0x58, 0xFE, + 0x4F, 0xD6, 0xE0, 0xDD, 0x68, 0xBD, 0xEB, 0xCA, 0x9D, 0xBA, 0xB6, 0xCA, + 0xA7, 0xD0, 0xAD, 0xDD, 0x0B, 0xF3, 0x87, 0xF0, 0x2B, 0x0B, 0xA9, 0xFF, + 0x90, 0x08, 0x69, 0x0B, 0xD3, 0xF0, 0xE1, 0x0D, 0xB6, 0xD5, 0xE5, 0x0D, + 0xC7, 0xC5, 0x15, 0x08, 0x2E, 0xC9, 0x32, 0xF8, 0x2D, 0xDB, 0xF3, 0xEE, + 0x1D, 0xEE, 0xA6, 0xEE, 0x15, 0xF6, 0xE6, 0xF5, 0x91, 0xF5, 0x59, 0x02, + 0xD8, 0x00, 0x45, 0x10, 0xFC, 0x12, 0xDD, 0x23, 0x4D, 0x14, 0x32, 0x30, + 0x94, 0x0E, 0x91, 0x26, 0xBE, 0x07, 0x5F, 0x0E, 0xEF, 0xF8, 0x53, 0xF4, + 0xEC, 0xE9, 0xCC, 0xDD, 0x2E, 0xDE, 0xB8, 0xD7, 0xA0, 0xD8, 0x9D, 0xE8, + 0x4F, 0xDD, 0x75, 0x00, 0xAE, 0xED, 0xD8, 0x0D, 0x0F, 0x00, 0xA7, 0x0F, + 0x48, 0x03, 0x2A, 0x0E, 0xB8, 0xFF, 0x2B, 0x0A, 0x70, 0x04, 0x8E, 0x02, + 0x25, 0x0B, 0x74, 0xFE, 0x8B, 0x08, 0x6B, 0xFA, 0x36, 0x09, 0xBD, 0xF4, + 0xAC, 0x0A, 0x86, 0xEF, 0xAD, 0x0A, 0xFA, 0xE8, 0x58, 0x07, 0x1B, 0xE5, + 0x44, 0xFA, 0x32, 0xE7, 0x9E, 0xFB, 0x99, 0xF0, 0x6A, 0x08, 0x1C, 0xFE, + 0x2A, 0x0E, 0x41, 0x08, 0xF1, 0x11, 0x8E, 0x01, 0x33, 0x10, 0x8C, 0xF3, + 0x60, 0xFB, 0x1E, 0xEC, 0x1B, 0xEE, 0xD6, 0xEF, 0xC1, 0xF7, 0x5B, 0xF8, + 0xDF, 0xFF, 0x85, 0xF3, 0xC8, 0xFF, 0x08, 0xF5, 0xFA, 0xFC, 0x07, 0x05, + 0x26, 0xF5, 0xB2, 0x0D, 0xC7, 0xE5, 0x61, 0x0B, 0xB0, 0xE6, 0x84, 0x05, + 0x7C, 0xFF, 0x39, 0x05, 0xFE, 0x0C, 0x15, 0x0E, 0xFF, 0x07, 0x6F, 0x1C, + 0xBB, 0x06, 0x40, 0x24, 0xA7, 0x02, 0x4A, 0x15, 0xBC, 0xED, 0x67, 0xEC, + 0xBD, 0xD1, 0xD7, 0xC6, 0x7F, 0xBA, 0xEB, 0xB4, 0xCF, 0xAF, 0xAF, 0xB3, + 0x5F, 0xC3, 0x14, 0xCD, 0x19, 0xF1, 0x7C, 0xF1, 0x77, 0x15, 0x2B, 0x12, + 0x19, 0x28, 0xFB, 0x2A, 0x5A, 0x31, 0x8F, 0x36, 0x5A, 0x2A, 0x2D, 0x33, + 0xB6, 0x17, 0xE8, 0x1A, 0x65, 0x02, 0xFF, 0xFC, 0xA4, 0xE0, 0x4C, 0xE3, + 0xE3, 0xC3, 0x45, 0xC9, 0xEA, 0xC3, 0x0B, 0xB8, 0x03, 0xD4, 0x9E, 0xBB, + 0x0F, 0xE1, 0x50, 0xDD, 0xE5, 0xEE, 0x2D, 0x0A, 0x0A, 0x0A, 0x71, 0x1A, + 0x72, 0x1E, 0x96, 0x0D, 0x72, 0x18, 0x45, 0xF6, 0x7C, 0xFD, 0x1A, 0xDE, + 0x2D, 0xDC, 0xA9, 0xD5, 0xEC, 0xCA, 0x1A, 0xE0, 0x8B, 0xD7, 0x3B, 0xF1, + 0xD8, 0xF7, 0x8C, 0x0A, 0xFE, 0x14, 0x2B, 0x25, 0x67, 0x21, 0x65, 0x33, + 0x52, 0x20, 0xFC, 0x2F, 0x14, 0x1D, 0xFD, 0x1F, 0x45, 0x17, 0xA0, 0x15, + 0x48, 0x11, 0xF9, 0x14, 0xB5, 0x09, 0xDC, 0x19, 0xD6, 0xFF, 0xFE, 0x15, + 0x58, 0x03, 0x41, 0x03, 0x42, 0x08, 0x65, 0xF4, 0xFF, 0x05, 0xB1, 0xEE, + 0xB5, 0x0C, 0x95, 0xEE, 0x98, 0x1B, 0xD4, 0x01, 0x7A, 0x26, 0x0E, 0x1B, + 0x9A, 0x29, 0x5C, 0x23, 0xF1, 0x20, 0x62, 0x2C, 0xFF, 0x11, 0x28, 0x34, + 0x90, 0x07, 0xCA, 0x25, 0xBE, 0x04, 0x30, 0x0C, 0x3A, 0x08, 0x63, 0x04, + 0xE9, 0x05, 0x97, 0x08, 0xF0, 0x01, 0xF2, 0x00, 0xAB, 0x01, 0x9D, 0xF2, + 0x67, 0x01, 0x3D, 0xF2, 0xAE, 0x03, 0xCE, 0xF9, 0x3F, 0x09, 0x7C, 0xFC, + 0xF1, 0x09, 0x00, 0x01, 0xFA, 0x01, 0x22, 0x02, 0x18, 0xF0, 0x23, 0xFB, + 0x6C, 0xE1, 0xF8, 0xF3, 0x17, 0xED, 0xDF, 0xF4, 0xD5, 0xF9, 0x5F, 0xF2, + 0x28, 0xF7, 0x65, 0xE9, 0xE9, 0x04, 0x1C, 0xF0, 0xD1, 0x1D, 0x64, 0x04, + 0xAC, 0x18, 0x80, 0x0B, 0xF6, 0xFD, 0x95, 0x00, 0x3C, 0xFD, 0x4C, 0xFE, + 0x39, 0x11, 0xB9, 0x01, 0x37, 0x10, 0xF3, 0xFC, 0xAC, 0x04, 0x3F, 0xFE, + 0x6B, 0xFF, 0x09, 0x08, 0xE9, 0xE7, 0xF7, 0x05, 0x8E, 0xC8, 0x59, 0xF0, + 0x27, 0xB4, 0xED, 0xCE, 0x27, 0xA5, 0x2F, 0xB9, 0x31, 0xB0, 0x3C, 0xC3, + 0xED, 0xE6, 0x7B, 0xE1, 0x07, 0x20, 0x5D, 0x0A, 0x82, 0x38, 0x27, 0x31, + 0xAF, 0x47, 0xA0, 0x48, 0x06, 0x53, 0x35, 0x50, 0x70, 0x44, 0xB7, 0x41, + 0xEC, 0x19, 0x8B, 0x18, 0x7D, 0xE7, 0x7D, 0xF4, 0x46, 0xBB, 0xE5, 0xE6, + 0x98, 0xA2, 0xF8, 0xD9, 0x98, 0xA9, 0xD5, 0xD3, 0x53, 0xCF, 0xAC, 0xD7, + 0xD5, 0x04, 0xFE, 0xDF, 0x81, 0x24, 0x10, 0xF2, 0x34, 0x20, 0xC3, 0x0A, + 0xA3, 0x12, 0xCC, 0x15, 0x70, 0x11, 0x45, 0x07, 0x81, 0x10, 0xA5, 0xED, + 0x6A, 0x06, 0x63, 0xE2, 0x3D, 0x07, 0x1B, 0xEC, 0x52, 0x14, 0xC1, 0xF8, + 0xC2, 0x1F, 0xA5, 0x0A, 0xAA, 0x22, 0xAD, 0x19, 0xA2, 0x26, 0x09, 0x28, + 0x7A, 0x29, 0xE3, 0x39, 0x12, 0x1F, 0x6E, 0x3F, 0x9D, 0x14, 0x2C, 0x3D, + 0x4C, 0x03, 0xA7, 0x33, 0x48, 0xEF, 0x5A, 0x24, 0xE7, 0xE7, 0x14, 0x0C, + 0x8F, 0xF6, 0x64, 0xF0, 0x31, 0x0C, 0xE4, 0xDC, 0xE7, 0x0D, 0xC2, 0xDF, + 0xA3, 0x0C, 0xE1, 0xF7, 0x9A, 0x0A, 0xFD, 0x07, 0x35, 0x0E, 0xA2, 0x0D, + 0x63, 0x22, 0x94, 0x0D, 0x6F, 0x26, 0x28, 0x01, 0x0F, 0x12, 0xD7, 0x01, + 0x4E, 0xF6, 0x63, 0x09, 0xD2, 0xE8, 0x8F, 0x08, 0x13, 0xEF, 0xE4, 0x04, + 0xBE, 0xFF, 0xD1, 0xF6, 0xC3, 0x0E, 0x94, 0xF3, 0x05, 0xF9, 0x2A, 0xF0, + 0x3C, 0xF4, 0xDD, 0xEF, 0xBE, 0x01, 0x0A, 0xF0, 0xE6, 0xF2, 0x30, 0xEA, + 0xE0, 0xEE, 0xC5, 0xE2, 0x06, 0xF2, 0x2A, 0xD4, 0xBD, 0xE7, 0x06, 0xD2, + 0x1A, 0xD6, 0x3C, 0xD7, 0xAD, 0xD3, 0x57, 0xE6, 0x57, 0xDB, 0xD2, 0xF5, + 0xB5, 0xDD, 0x90, 0xF5, 0xA6, 0xFB, 0x0B, 0x01, 0xE0, 0x10, 0x9F, 0x0B, + 0x41, 0xF2, 0x37, 0xF7, 0x2E, 0xE6, 0x02, 0xF2, 0xD0, 0xF1, 0x41, 0x00, + 0x72, 0xEE, 0xC2, 0xFD, 0xE7, 0xF7, 0xDF, 0xF3, 0xB1, 0x12, 0x1F, 0xF4, + 0x1F, 0x06, 0x01, 0xE5, 0xCA, 0xD9, 0x9E, 0xC0, 0xC4, 0xBD, 0x5E, 0xAC, + 0xBE, 0xAA, 0x2E, 0x9E, 0x61, 0x9E, 0xB1, 0x99, 0xEC, 0xAA, 0xB2, 0xB0, + 0x5F, 0xD5, 0xEA, 0xDC, 0xBC, 0x03, 0x84, 0x0C, 0xFB, 0x36, 0xFC, 0x2F, + 0x0D, 0x51, 0xA4, 0x39, 0xB1, 0x36, 0x76, 0x29, 0xE3, 0x12, 0x93, 0x0B, + 0xBC, 0xF0, 0x34, 0xE7, 0x95, 0xCA, 0x71, 0xC9, 0x14, 0xAF, 0x18, 0xB4, + 0x3B, 0xAB, 0xE8, 0xA4, 0x7B, 0xBF, 0x16, 0xAC, 0x11, 0xD7, 0x37, 0xD5, + 0x77, 0xE1, 0x4F, 0xFD, 0xE6, 0xE2, 0x18, 0x0A, 0x32, 0xE7, 0x92, 0x0B, + 0x17, 0xEB, 0x1F, 0x05, 0x97, 0xE3, 0xCF, 0xE6, 0x2E, 0xD3, 0x64, 0xC5, + 0x85, 0xD2, 0x1B, 0xBD, 0x07, 0xDC, 0x2C, 0xC6, 0x1C, 0xDC, 0x78, 0xDF, + 0xF7, 0xFC, 0x83, 0xFC, 0xE4, 0x23, 0x3D, 0x04, 0xC8, 0x2F, 0x42, 0xFD, + 0x1C, 0x37, 0xDB, 0xFB, 0x80, 0x24, 0xC4, 0xF8, 0x3A, 0x0A, 0xA7, 0xF0, + 0x9D, 0x02, 0xC6, 0xF2, 0xD9, 0xF2, 0x8B, 0xF5, 0x07, 0xD5, 0xC1, 0xF3, + 0xF8, 0xCD, 0x1E, 0xFA, 0xC6, 0xE2, 0x68, 0xFA, 0x3B, 0xFC, 0x50, 0xF0, + 0x65, 0x12, 0x26, 0xF1, 0x94, 0x18, 0x9F, 0xFB, 0x59, 0x16, 0x92, 0x06, + 0x2D, 0x15, 0x42, 0x0F, 0xC1, 0x13, 0x2D, 0x20, 0x2E, 0x0C, 0x99, 0x2D, + 0x19, 0x06, 0x46, 0x27, 0x9E, 0x05, 0x00, 0x18, 0x9E, 0x07, 0xF6, 0x15, + 0x3B, 0x17, 0x30, 0x26, 0x3F, 0x09, 0xD4, 0x18, 0x04, 0xFA, 0xDC, 0x0B, + 0xF2, 0x0B, 0x7A, 0x1F, 0xD7, 0x11, 0x1E, 0x25, 0xD5, 0x18, 0x6C, 0x20, + 0x3E, 0x15, 0x50, 0x20, 0x30, 0xFC, 0x53, 0x20, 0xC0, 0xEF, 0xC5, 0x14, + 0xA4, 0xF5, 0xA6, 0x01, 0xB9, 0x06, 0xC4, 0xFD, 0x7B, 0x09, 0x8D, 0x00, + 0x86, 0x05, 0x65, 0x0C, 0xC2, 0x17, 0xBF, 0x2C, 0x29, 0x23, 0x1F, 0x35, + 0x99, 0x1C, 0x04, 0x21, 0x91, 0x26, 0xD3, 0x1F, 0xAA, 0x2F, 0xE2, 0x2A, + 0x77, 0x18, 0x85, 0x1B, 0x15, 0x1A, 0xAF, 0x08, 0x90, 0x29, 0xCB, 0x06, + 0x29, 0x1E, 0xFE, 0x00, 0x6E, 0x07, 0x24, 0xEC, 0x72, 0xE0, 0x00, 0xCD, + 0x3A, 0xC5, 0x54, 0xBE, 0xC4, 0xCE, 0x39, 0xC7, 0x69, 0xF9, 0x61, 0xE4, + 0x84, 0x2F, 0x38, 0x01, 0xBA, 0x51, 0x3C, 0x18, 0x2E, 0x61, 0x06, 0x3D, + 0xE1, 0x59, 0xEF, 0x5E, 0x58, 0x33, 0xA3, 0x5A, 0xD2, 0x0F, 0x13, 0x36, + 0xCE, 0xF4, 0x69, 0xFC, 0x7F, 0xE4, 0x06, 0xCE, 0x29, 0xDD, 0xD0, 0xBF, + 0xC6, 0xDE, 0x52, 0xC4, 0x73, 0xE4, 0xC5, 0xD9, 0x89, 0xEB, 0x3A, 0xF6, + 0xD7, 0x05, 0x57, 0x12, 0x4C, 0x18, 0x69, 0x1C, 0x31, 0x0D, 0x06, 0x0E, + 0x9E, 0xEE, 0x63, 0xFF, 0xC4, 0xD0, 0x80, 0xF1, 0x4F, 0xC3, 0xC4, 0xE2, + 0x09, 0xCC, 0x09, 0xE5, 0x87, 0xE8, 0x5E, 0xF1, 0x40, 0x07, 0x76, 0x05, + 0x65, 0x18, 0x72, 0x1E, 0x39, 0x24, 0xDD, 0x26, 0x92, 0x33, 0xB8, 0x24, + 0x73, 0x34, 0x9C, 0x1E, 0xDF, 0x15, 0xFE, 0x0A, 0x10, 0xF3, 0x0F, 0xF8, + 0xA6, 0xDB, 0x45, 0xEB, 0xA4, 0xCA, 0x49, 0xDB, 0x85, 0xD5, 0x1B, 0xDC, + 0x80, 0xF3, 0xBB, 0xE6, 0xD6, 0x07, 0x5D, 0xEB, 0xE0, 0x0D, 0x18, 0xF5, + 0x68, 0x0A, 0x76, 0x03, 0x4F, 0x03, 0xB5, 0x10, 0x8D, 0xFB, 0x1E, 0x0F, + 0xD5, 0xFF, 0xB8, 0x04, 0xE1, 0x0D, 0x69, 0xF8, 0x4F, 0x10, 0xDA, 0xF1, + 0x7C, 0x08, 0x9D, 0xF6, 0x21, 0xFB, 0x15, 0x00, 0xB2, 0xEB, 0xEF, 0x0E, + 0x50, 0xE2, 0x50, 0x0F, 0x41, 0xE8, 0x3F, 0x06, 0x25, 0xFD, 0xBF, 0x0C, + 0xB7, 0x05, 0x5D, 0x05, 0xAA, 0x07, 0xC4, 0xFE, 0x77, 0xFF, 0xB6, 0x01, + 0x17, 0xF2, 0xC9, 0xF1, 0xC1, 0xF7, 0xC0, 0xEA, 0xFB, 0xF4, 0x3C, 0xFB, + 0xF5, 0xEE, 0x2A, 0x05, 0x03, 0xF7, 0x94, 0xFC, 0x9A, 0x04, 0x95, 0xFB, + 0x4A, 0x1E, 0xCB, 0x0A, 0xC3, 0x26, 0x91, 0x12, 0x90, 0x10, 0xC3, 0x04, + 0x62, 0x09, 0xD3, 0xFA, 0xF7, 0x17, 0xE5, 0x0D, 0x45, 0x11, 0xFF, 0x23, + 0xF8, 0x03, 0x4F, 0x30, 0x0D, 0x16, 0x1D, 0x36, 0x25, 0x24, 0xC4, 0x27, + 0x97, 0x02, 0x3A, 0x0C, 0xF5, 0xD6, 0x67, 0xEE, 0xC6, 0xBE, 0x99, 0xD0, + 0xDD, 0xB7, 0x00, 0xBC, 0xE0, 0xD8, 0xBF, 0xBD, 0x70, 0x09, 0xA1, 0xDA, + 0x6B, 0x27, 0x25, 0x08, 0xF3, 0x38, 0xA6, 0x34, 0x73, 0x42, 0x82, 0x4E, + 0x96, 0x3C, 0xEA, 0x4A, 0xDD, 0x2B, 0xD5, 0x37, 0x3C, 0x17, 0x56, 0x27, + 0x09, 0xF0, 0x7D, 0x05, 0xC5, 0xD8, 0x78, 0xDD, 0xB0, 0xDC, 0x22, 0xCE, + 0x79, 0xE9, 0x47, 0xD0, 0x44, 0xFB, 0xE3, 0xDE, 0x8F, 0x04, 0x17, 0xF4, + 0x68, 0x0F, 0xC5, 0x06, 0x25, 0x08, 0xE6, 0x01, 0x13, 0xFA, 0x9F, 0xF2, + 0x9D, 0xFA, 0xE0, 0xF2, 0x92, 0xF1, 0x48, 0xEB, 0x31, 0xF2, 0x15, 0xE3, + 0x52, 0x05, 0x37, 0xF6, 0x1F, 0x12, 0x44, 0x17, 0x35, 0x1B, 0x01, 0x33, + 0xD8, 0x27, 0x1C, 0x45, 0xB9, 0x36, 0x67, 0x4F, 0xF9, 0x34, 0x46, 0x49, + 0x2A, 0x1A, 0xA4, 0x33, 0x7D, 0xF5, 0xF6, 0x1D, 0x31, 0xE4, 0x3D, 0x12, + 0xD6, 0xE3, 0x51, 0x0D, 0xDB, 0xE7, 0x8A, 0x09, 0x14, 0xF8, 0x65, 0x0E, + 0xBB, 0x12, 0xA9, 0x15, 0xAF, 0x23, 0xFB, 0x16, 0xF7, 0x27, 0x54, 0x18, + 0x2F, 0x2E, 0xC1, 0x1E, 0x33, 0x28, 0xF2, 0x1E, 0x09, 0x22, 0xA1, 0x19, + 0x5B, 0x1F, 0x3F, 0x22, 0x8F, 0x1B, 0xFB, 0x2A, 0x59, 0x22, 0x40, 0x21, + 0xF3, 0x26, 0x3E, 0x15, 0x5E, 0x31, 0xB3, 0x14, 0x0A, 0x3A, 0x6C, 0x14, + 0xAA, 0x2A, 0xDB, 0x0E, 0x9F, 0x16, 0xDF, 0x05, 0x4E, 0x22, 0xCE, 0x07, + 0x48, 0x24, 0xF1, 0x0B, 0x7D, 0x0D, 0x2D, 0x06, 0x59, 0x0D, 0xB2, 0x04, + 0xBB, 0x09, 0x16, 0x0C, 0x6D, 0xF9, 0x47, 0x16, 0x15, 0x04, 0x02, 0x29, + 0xED, 0x22, 0xF9, 0x35, 0x47, 0x30, 0x4D, 0x2C, 0xCE, 0x28, 0x55, 0x21, + 0xD7, 0x24, 0x19, 0x21, 0x16, 0x17, 0x33, 0x22, 0x5C, 0xF9, 0x46, 0x1A, + 0xB5, 0xFD, 0x74, 0x15, 0xFF, 0x1C, 0xE3, 0x17, 0x1F, 0x2C, 0x2E, 0x12, + 0x2F, 0x20, 0xA3, 0x04, 0x65, 0x0C, 0xC4, 0x07, 0xCD, 0xF8, 0x9D, 0x0A, + 0x87, 0xD8, 0x14, 0xF6, 0x73, 0xC1, 0x01, 0xE2, 0x7F, 0xC2, 0x4A, 0xD0, + 0x74, 0xC9, 0xCD, 0xC4, 0x89, 0xD7, 0x8F, 0xCE, 0x70, 0xFD, 0x85, 0xE3, + 0x98, 0x32, 0x1F, 0x02, 0x88, 0x56, 0x17, 0x28, 0xD5, 0x58, 0xD2, 0x43, + 0x1C, 0x4B, 0x67, 0x4A, 0x9E, 0x38, 0x6C, 0x37, 0xEC, 0x07, 0x8A, 0x11, + 0x26, 0xCF, 0xF5, 0xE9, 0x6D, 0xC2, 0x13, 0xCE, 0x7A, 0xC0, 0x53, 0xB2, + 0x8F, 0xBE, 0x3A, 0xB4, 0x6F, 0xD4, 0xAD, 0xE1, 0x5F, 0xE7, 0x0E, 0x0D, + 0x90, 0xED, 0xA6, 0x1A, 0xA3, 0xF2, 0x1F, 0x0B, 0x8B, 0xF3, 0xE9, 0xF4, + 0x86, 0xE8, 0x22, 0xDC, 0xE6, 0xD3, 0x2A, 0xD7, 0x1B, 0xC4, 0x26, 0xE6, + 0x9C, 0xD0, 0x9A, 0xF1, 0x64, 0xFF, 0x2E, 0xFE, 0x16, 0x25, 0xA2, 0x0A, + 0x98, 0x2C, 0x07, 0x17, 0xBE, 0x1C, 0x73, 0x19, 0xD7, 0x0F, 0x6B, 0x10, + 0x6B, 0x03, 0xFE, 0x04, 0x0C, 0xEC, 0x62, 0xFE, 0xD2, 0xD9, 0x3A, 0xF7, + 0xE8, 0xD3, 0xE0, 0xE4, 0xAB, 0xD8, 0x85, 0xDB, 0x1C, 0xDF, 0x30, 0xE7, + 0x2B, 0xF5, 0xD2, 0xF4, 0xE9, 0x0B, 0xC8, 0xF8, 0xD9, 0x0E, 0xCC, 0xF5, + 0xF8, 0x07, 0x17, 0xF3, 0x15, 0xF0, 0x86, 0xF4, 0x9C, 0xDA, 0x09, 0xFE, + 0xF5, 0xE8, 0x3E, 0x05, 0xEC, 0xFF, 0xDB, 0xFE, 0xEA, 0x0F, 0x62, 0xFB, + 0x51, 0x22, 0x33, 0x05, 0xDC, 0x1D, 0x3B, 0x10, 0x05, 0x03, 0xBE, 0x0D, + 0x5A, 0xF1, 0x89, 0xFA, 0x53, 0xEF, 0xE9, 0xDC, 0x36, 0x02, 0x44, 0xCE, + 0x30, 0x07, 0xDF, 0xC5, 0xC9, 0xEC, 0x3C, 0xC0, 0xDB, 0xDD, 0x6D, 0xD3, + 0x89, 0xD2, 0x56, 0xDE, 0x4A, 0xCD, 0xC6, 0xD9, 0xEC, 0xE0, 0x11, 0xE8, + 0x95, 0xEF, 0x2B, 0xF7, 0xB0, 0xF7, 0xD8, 0xF1, 0x52, 0x05, 0x63, 0xEB, + 0x11, 0x13, 0x9E, 0xF9, 0x09, 0x11, 0xEB, 0x05, 0xD2, 0xF7, 0x5D, 0xF9, + 0x91, 0xF5, 0x8D, 0xFC, 0xCB, 0x05, 0x30, 0x10, 0x39, 0x03, 0x47, 0x0E, + 0xA7, 0x06, 0xD4, 0xFF, 0xE9, 0x07, 0x58, 0x00, 0x08, 0xF4, 0xC9, 0x00, + 0xF8, 0xCC, 0x2B, 0xD5, 0x28, 0xAC, 0xC4, 0xAE, 0xB7, 0x9E, 0xE5, 0xA9, + 0xF4, 0x9D, 0x8C, 0xA5, 0x1A, 0xBB, 0x89, 0xBB, 0xE1, 0xE9, 0xF3, 0xE9, + 0x49, 0x1A, 0x32, 0x17, 0x5C, 0x3B, 0xEC, 0x3B, 0xF2, 0x39, 0xCD, 0x4E, + 0x1D, 0x2F, 0x52, 0x4C, 0x27, 0x1F, 0x77, 0x28, 0x2A, 0xFB, 0x43, 0xF2, + 0x54, 0xD5, 0x3C, 0xD6, 0xB5, 0xB4, 0xED, 0xCB, 0x2D, 0xA1, 0xD5, 0xC7, + 0x2E, 0xB1, 0xAF, 0xD0, 0x78, 0xE0, 0x24, 0xD9, 0xD2, 0xFF, 0xCA, 0xE5, + 0x85, 0x03, 0x79, 0xF6, 0x88, 0xFE, 0x55, 0xF9, 0x12, 0xE7, 0x40, 0xE9, + 0x3F, 0xD2, 0xA9, 0xD4, 0xAA, 0xD9, 0xBE, 0xD0, 0x6A, 0xE1, 0x4B, 0xE2, + 0x52, 0xF1, 0x75, 0xFE, 0x28, 0x1E, 0xA0, 0x12, 0xE4, 0x43, 0x30, 0x13, + 0x0C, 0x4D, 0x72, 0x10, 0xCC, 0x3B, 0x46, 0x14, 0x8C, 0x19, 0x0A, 0x11, + 0x2A, 0xFB, 0x77, 0x06, 0xB0, 0xE3, 0xC7, 0x02, 0x51, 0xD5, 0xB7, 0x03, + 0x17, 0xD7, 0x02, 0xFB, 0x6F, 0xED, 0xA7, 0xF3, 0x62, 0x0B, 0xA9, 0xEE, + 0x7F, 0x1D, 0x1C, 0xE5, 0x1F, 0x27, 0xE0, 0xEA, 0x5A, 0x23, 0x49, 0xFB, + 0x8F, 0x19, 0x97, 0xFF, 0x0F, 0x13, 0xA3, 0xF6, 0xCE, 0x06, 0x71, 0xEC, + 0x76, 0xF6, 0x7F, 0xF1, 0x40, 0xDD, 0x07, 0x02, 0x4D, 0xD2, 0x2A, 0x13, + 0xF0, 0xE5, 0x78, 0x18, 0x67, 0xF3, 0x7D, 0x11, 0x9E, 0xFA, 0x7F, 0x1C, + 0xF5, 0xFF, 0x4F, 0x22, 0x7C, 0xF0, 0x09, 0x02, 0x79, 0xF2, 0xD2, 0xF0, + 0xAB, 0xFD, 0xE2, 0xF0, 0x6E, 0xF9, 0x55, 0xEE, 0x20, 0xF7, 0xEC, 0xF3, + 0x1F, 0xF3, 0x1F, 0xF6, 0xF5, 0xEF, 0xEF, 0xEE, 0xAC, 0xF5, 0xE8, 0xE5, + 0x4B, 0xF9, 0x56, 0xE7, 0x24, 0xF6, 0xA8, 0xE8, 0xF5, 0xFA, 0x53, 0xE7, + 0xD7, 0x08, 0x9A, 0xFD, 0x59, 0x08, 0x7A, 0x15, 0x86, 0xF4, 0x81, 0x0A, + 0x5D, 0xF3, 0x59, 0x00, 0x2E, 0x08, 0x63, 0x02, 0x75, 0x21, 0xA7, 0x01, + 0x02, 0x2E, 0x5D, 0xFF, 0xFB, 0x24, 0x6C, 0x00, 0xB0, 0x13, 0xD8, 0x03, + 0x0A, 0xF9, 0x8F, 0xF4, 0xC5, 0xD7, 0xC2, 0xD6, 0x4C, 0xBD, 0x4B, 0xB1, + 0xCA, 0xC6, 0x5D, 0xA7, 0xEA, 0xE3, 0x24, 0xCD, 0x08, 0xF8, 0x30, 0xF8, + 0x7F, 0x1E, 0xDF, 0x24, 0x75, 0x45, 0x44, 0x52, 0x51, 0x54, 0x1E, 0x5F, + 0x9E, 0x48, 0xC3, 0x49, 0xA1, 0x26, 0x0B, 0x38, 0xE4, 0x09, 0xB1, 0x26, + 0x21, 0xFB, 0x5B, 0xFF, 0x21, 0xFB, 0x2C, 0xE4, 0xA6, 0xFA, 0x21, 0xE1, + 0xBE, 0xF0, 0x6B, 0xEA, 0xF2, 0xF1, 0xA3, 0xFE, 0x62, 0xFE, 0xFE, 0x12, + 0xB6, 0x02, 0xD3, 0x1E, 0x36, 0x08, 0x07, 0x22, 0x5C, 0x16, 0x8E, 0x22, + 0x65, 0x16, 0x74, 0x19, 0x72, 0x0D, 0xBF, 0x0D, 0xEB, 0x0E, 0x72, 0x11, + 0x36, 0x1E, 0x20, 0x1E, 0x58, 0x39, 0x0E, 0x2B, 0xC2, 0x53, 0x25, 0x3C, + 0x63, 0x5C, 0x9F, 0x41, 0x5E, 0x4A, 0x93, 0x38, 0x61, 0x23, 0xB7, 0x31, + 0x07, 0xF5, 0xE9, 0x20, 0x25, 0xD6, 0xA6, 0x0C, 0x9C, 0xC9, 0x3B, 0xF9, + 0x3C, 0xDF, 0x3A, 0xF6, 0xFC, 0x03, 0x61, 0x12, 0xE5, 0x14, 0x88, 0x25, + 0x56, 0x29, 0x93, 0x20, 0xE5, 0x38, 0x35, 0x1A, 0x6D, 0x2F, 0xF2, 0x0F, + 0xC6, 0x21, 0xDA, 0xFC, 0xC6, 0x16, 0x67, 0xF7, 0xB9, 0x0D, 0x3F, 0xFD, + 0xC4, 0x10, 0xF6, 0xFC, 0xF7, 0x13, 0xD9, 0x02, 0xF4, 0x0B, 0xB7, 0x12, + 0xE0, 0x06, 0x36, 0x16, 0x71, 0x07, 0x7C, 0x0B, 0x01, 0xFD, 0x2C, 0x02, + 0x30, 0xF7, 0xBC, 0x02, 0x8F, 0xE3, 0x8E, 0xF7, 0xD7, 0xCA, 0x20, 0xEB, + 0xCD, 0xD8, 0xE3, 0xEC, 0xE1, 0xED, 0x87, 0xF2, 0xBF, 0xE7, 0x9E, 0xFD, + 0x25, 0xE9, 0x14, 0x06, 0x62, 0xF8, 0xCE, 0x03, 0xFA, 0xF9, 0x7D, 0xF8, + 0xD3, 0xFE, 0xD4, 0xF3, 0x74, 0xFA, 0xAE, 0xED, 0x79, 0xE2, 0xD6, 0xE1, + 0xF3, 0xEA, 0x2A, 0xE8, 0xB8, 0x0B, 0xE6, 0xF6, 0x6B, 0x03, 0x10, 0xF5, + 0xBB, 0xE2, 0x90, 0xF1, 0xFB, 0xE2, 0xA7, 0xFC, 0x64, 0xF9, 0x5F, 0xFF, + 0xB0, 0x01, 0xCE, 0xEC, 0xD8, 0x02, 0x41, 0xE9, 0x88, 0xFD, 0xF2, 0xF2, + 0x2E, 0xEE, 0x11, 0xE6, 0x15, 0xD5, 0xF8, 0xCC, 0xA3, 0xBA, 0xAD, 0xBA, + 0xCA, 0xB2, 0x5E, 0xAA, 0xBA, 0xBD, 0xDD, 0xA6, 0xE8, 0xDC, 0x79, 0xC8, + 0xCD, 0x0B, 0x91, 0xF5, 0xD9, 0x34, 0xCA, 0x1B, 0x2A, 0x43, 0xC9, 0x3C, + 0xAB, 0x37, 0x9C, 0x42, 0x95, 0x2A, 0xA6, 0x33, 0xF1, 0x15, 0xC4, 0x16, + 0x04, 0xF1, 0xEB, 0xEC, 0x9D, 0xD7, 0x35, 0xDB, 0xA4, 0xC4, 0x23, 0xD4, + 0x69, 0xBA, 0xCE, 0xC6, 0xD6, 0xC5, 0xB6, 0xC7, 0x40, 0xE0, 0x79, 0xD6, + 0x60, 0xE9, 0xB3, 0xDC, 0x30, 0xD5, 0xEB, 0xD4, 0x33, 0xC9, 0x27, 0xDF, + 0xF9, 0xC1, 0x3E, 0xEC, 0xDF, 0xC7, 0x15, 0xE7, 0x05, 0xE6, 0x49, 0xEB, + 0xEF, 0x00, 0x6D, 0xFE, 0xB2, 0x1B, 0x3A, 0x05, 0x7E, 0x39, 0xB0, 0x0E, + 0x26, 0x41, 0x55, 0x23, 0x7C, 0x2F, 0x4B, 0x23, 0x44, 0x0D, 0x62, 0x1A, + 0xA0, 0xEF, 0xF6, 0x1C, 0xBD, 0xE5, 0x9A, 0x19, 0xCB, 0xE4, 0x35, 0x0D, + 0xCB, 0xE7, 0x54, 0x00, 0xBD, 0xF1, 0xD1, 0xF3, 0x92, 0x00, 0x72, 0xF8, + 0x70, 0x01, 0x62, 0x06, 0x72, 0xFA, 0xE3, 0x17, 0x5C, 0xFF, 0x64, 0x2C, + 0x82, 0x06, 0xD6, 0x2E, 0xE8, 0x12, 0x8D, 0x27, 0xEA, 0x22, 0x5D, 0x1E, + 0x06, 0x27, 0x1D, 0x10, 0x1F, 0x26, 0xF0, 0x11, 0x72, 0x24, 0x3F, 0x26, + 0xF1, 0x1D, 0xFE, 0x2C, 0xA4, 0x1D, 0xAE, 0x21, 0x8F, 0x2C, 0xED, 0x13, + 0xF6, 0x30, 0x64, 0x05, 0xD6, 0x1F, 0xA3, 0xFD, 0x33, 0x03, 0x62, 0xFF, + 0x5B, 0xF9, 0x37, 0x0C, 0xC9, 0x0A, 0xF7, 0x10, 0x3D, 0x1A, 0xB6, 0x0B, + 0xD1, 0x18, 0x34, 0x18, 0xC2, 0x16, 0xDF, 0x22, 0x59, 0x10, 0xDB, 0x12, + 0x7B, 0x0C, 0x48, 0x0B, 0xF2, 0x1B, 0xCF, 0x1A, 0xFD, 0x18, 0xEA, 0x1E, + 0x4E, 0x02, 0x47, 0x17, 0x87, 0x0C, 0xD3, 0x2A, 0x21, 0x20, 0x31, 0x3B, + 0x8F, 0x1C, 0x09, 0x25, 0x4C, 0x21, 0xFC, 0x16, 0x8E, 0x2E, 0x04, 0x29, + 0xFD, 0x2C, 0x78, 0x33, 0xCD, 0x24, 0xD7, 0x28, 0x53, 0x27, 0xE1, 0x22, + 0xF2, 0x18, 0xD0, 0x1A, 0x10, 0xF9, 0x16, 0xFA, 0x1C, 0xDF, 0x22, 0xC9, + 0xB3, 0xD2, 0xF5, 0xAE, 0x37, 0xCC, 0x77, 0xAE, 0x4C, 0xD7, 0xAB, 0xC1, + 0x02, 0xFA, 0xAA, 0xE7, 0xC3, 0x22, 0x10, 0x12, 0x22, 0x49, 0xE7, 0x31, + 0x2C, 0x5B, 0xEF, 0x3A, 0x78, 0x45, 0xDF, 0x36, 0xB9, 0x22, 0x02, 0x2E, + 0xE5, 0x0F, 0x03, 0x0D, 0xDF, 0xFF, 0xD7, 0xE0, 0x73, 0xF9, 0xD0, 0xD1, + 0x56, 0xEC, 0xBC, 0xCF, 0x38, 0xD6, 0xAF, 0xC9, 0x2B, 0xDA, 0x1F, 0xD5, + 0xBC, 0xE6, 0xFC, 0xEE, 0xD4, 0xE1, 0xCA, 0xFE, 0xA4, 0xDE, 0x91, 0x00, + 0xDA, 0xDD, 0xD7, 0x03, 0xAC, 0xD5, 0xCB, 0x01, 0x3E, 0xD7, 0x00, 0xF3, + 0xBB, 0xE8, 0x87, 0xF3, 0x38, 0xFA, 0x23, 0x07, 0x35, 0x0B, 0xCF, 0x17, + 0xA7, 0x14, 0xE2, 0x25, 0x74, 0x17, 0xFA, 0x3C, 0xE4, 0x0C, 0x26, 0x3E, + 0x44, 0xF0, 0xDF, 0x21, 0xC0, 0xE2, 0x5B, 0x04, 0x7A, 0xE3, 0x0F, 0xEE, + 0x27, 0xE2, 0xED, 0xEC, 0x16, 0xEB, 0x39, 0xFB, 0x3C, 0xF9, 0x19, 0x06, + 0x4A, 0xF9, 0x6E, 0x04, 0xEF, 0x02, 0x57, 0x02, 0xDB, 0x10, 0x98, 0xFD, + 0x52, 0x0E, 0x6C, 0xEF, 0xD2, 0x03, 0xF8, 0xEF, 0x27, 0xF9, 0xDC, 0x01, + 0xFB, 0xFB, 0xFE, 0x0C, 0x06, 0x06, 0x1A, 0x13, 0x07, 0x0B, 0x54, 0x13, + 0xE3, 0x0C, 0x47, 0x0A, 0x45, 0x00, 0xC6, 0xFB, 0xAA, 0xF5, 0x76, 0xEE, + 0xA0, 0xFA, 0x3C, 0xEB, 0x66, 0xFA, 0x4C, 0xF1, 0xB8, 0xF7, 0x91, 0xF9, + 0xB2, 0xF2, 0xC3, 0xFC, 0x1C, 0xF7, 0x6B, 0x02, 0xAF, 0x04, 0x99, 0x00, + 0x42, 0x0E, 0xC5, 0xFA, 0xFC, 0x14, 0xBE, 0x00, 0x4D, 0x15, 0xA8, 0x00, + 0x28, 0x14, 0xFD, 0xF5, 0xA8, 0x0B, 0xFF, 0xED, 0x1A, 0xFF, 0x21, 0xF2, + 0xE3, 0xF1, 0x41, 0xF5, 0x18, 0xDC, 0x44, 0xE6, 0x0D, 0xE4, 0x2F, 0xEF, + 0x8B, 0x01, 0x8A, 0x0B, 0xD3, 0x03, 0xF8, 0x07, 0x83, 0xFF, 0x8E, 0xFD, + 0x25, 0x11, 0x2D, 0x0E, 0x77, 0x1D, 0x5E, 0x13, 0x5B, 0x18, 0x32, 0x02, + 0x2C, 0x18, 0xDF, 0xFD, 0x1D, 0x12, 0x8D, 0x07, 0xC1, 0xEF, 0x12, 0x03, + 0x32, 0xD0, 0xF3, 0xE8, 0xB0, 0xC4, 0x87, 0xC7, 0xAA, 0xBC, 0x4A, 0xAE, + 0xC2, 0xC3, 0x77, 0xB3, 0x21, 0xDB, 0x9D, 0xD8, 0xAA, 0xFA, 0x5E, 0x0A, + 0xA0, 0x1F, 0x54, 0x35, 0x1D, 0x3D, 0xC3, 0x50, 0x34, 0x38, 0x35, 0x52, + 0x4F, 0x1B, 0x32, 0x3A, 0xA1, 0x06, 0xC1, 0x0F, 0xC8, 0xF0, 0x42, 0xE1, + 0x13, 0xE2, 0xBC, 0xD0, 0x58, 0xE3, 0xC9, 0xD6, 0x88, 0xDD, 0x28, 0xD9, + 0xC1, 0xE8, 0x90, 0xE5, 0xB7, 0xFE, 0xC9, 0xF8, 0x1B, 0xF2, 0x36, 0xF6, + 0xDF, 0xE5, 0xC8, 0xE8, 0xB2, 0xF4, 0xC2, 0xE3, 0x87, 0xFE, 0xA6, 0xE0, + 0x19, 0xFA, 0x5C, 0xDF, 0x4C, 0x05, 0xF4, 0xFC, 0x2B, 0x19, 0x7A, 0x22, + 0xA5, 0x27, 0xC6, 0x34, 0xD2, 0x3B, 0xC2, 0x44, 0x6B, 0x45, 0x44, 0x53, + 0x84, 0x2F, 0xA1, 0x51, 0x2E, 0x0D, 0x87, 0x3B, 0x41, 0xFA, 0x9E, 0x23, + 0x42, 0xF8, 0xC0, 0x0B, 0xD2, 0x07, 0xB9, 0xF3, 0x84, 0x1C, 0x15, 0xED, + 0x3B, 0x20, 0xC9, 0xF2, 0x5C, 0x19, 0x85, 0xF9, 0x93, 0x17, 0x6A, 0x0D, + 0x8A, 0x1A, 0x31, 0x2A, 0xC7, 0x22, 0xD8, 0x3D, 0x75, 0x32, 0xF9, 0x48, + 0x68, 0x3D, 0x3D, 0x4B, 0xC5, 0x3C, 0x7E, 0x41, 0x6A, 0x34, 0x63, 0x39, + 0x86, 0x1F, 0x07, 0x2E, 0x10, 0x13, 0x4F, 0x24, 0x69, 0x18, 0x5A, 0x25, + 0x4B, 0x19, 0x0C, 0x1C, 0x20, 0x1B, 0xAC, 0x17, 0xB9, 0x18, 0x9A, 0x1D, + 0x1E, 0x0C, 0xD0, 0x15, 0x6C, 0xFD, 0x2D, 0x02, 0xD0, 0xFE, 0x95, 0xFD, + 0xCE, 0x08, 0xA8, 0x04, 0xD0, 0x0A, 0xF6, 0x07, 0x45, 0x16, 0xD1, 0x10, + 0x4F, 0x1E, 0x33, 0x19, 0x7B, 0x21, 0x84, 0x16, 0x68, 0x28, 0xC9, 0x08, + 0x15, 0x1F, 0x29, 0x00, 0xB1, 0x05, 0x6C, 0xF7, 0x0F, 0xF3, 0xDC, 0xEA, + 0x30, 0xF6, 0x02, 0xF2, 0x50, 0x0D, 0x4E, 0x05, 0x9C, 0x16, 0x74, 0x03, + 0xC0, 0x0B, 0xF6, 0xEB, 0x8A, 0x14, 0xE6, 0xE6, 0x49, 0x1B, 0x44, 0xF2, + 0x38, 0x0F, 0xDA, 0xFA, 0x6F, 0x04, 0xB9, 0x04, 0xC2, 0xF4, 0xE9, 0x0A, + 0x5A, 0xE8, 0x14, 0x08, 0xCF, 0xD6, 0xBC, 0xEA, 0x7D, 0xBC, 0x4E, 0xC4, + 0x9F, 0xAE, 0xE4, 0xB9, 0x33, 0xB6, 0x85, 0xC3, 0x42, 0xD5, 0xC5, 0xDA, + 0xD5, 0xFB, 0x36, 0xFE, 0x78, 0x1B, 0xF5, 0x22, 0xB8, 0x2E, 0xE7, 0x3D, + 0xD5, 0x28, 0x37, 0x3F, 0x92, 0x12, 0xC7, 0x27, 0xCA, 0xFF, 0x9B, 0x04, + 0xD3, 0xEB, 0x69, 0xDE, 0x91, 0xD3, 0xE9, 0xC9, 0x36, 0xC1, 0x7F, 0xCC, + 0xB7, 0xBC, 0x18, 0xD2, 0x78, 0xC4, 0x10, 0xD1, 0x2B, 0xD3, 0x99, 0xD3, + 0x36, 0xCF, 0xC3, 0xCC, 0xB0, 0xC2, 0x28, 0xB7, 0xDB, 0xCB, 0x2D, 0xB1, + 0x13, 0xDE, 0x36, 0xB7, 0x68, 0xF1, 0x5B, 0xB8, 0x7C, 0x08, 0xF4, 0xC5, + 0x98, 0x12, 0x80, 0xE4, 0xEA, 0x10, 0x35, 0x01, 0x7D, 0x0F, 0x40, 0x13, + 0x66, 0x0B, 0x32, 0x19, 0xE3, 0xFE, 0xE4, 0x19, 0xF6, 0xF3, 0x6F, 0x19, + 0x42, 0xEE, 0x60, 0x0C, 0xA6, 0xE9, 0xD3, 0xF3, 0x42, 0xEC, 0x52, 0xE4, + 0x7E, 0xE4, 0xFA, 0xDB, 0xF2, 0xD4, 0x52, 0xD4, 0x68, 0xD5, 0x08, 0xD5, + 0xEA, 0xDE, 0xC0, 0xDE, 0xF6, 0xE9, 0xE7, 0xF0, 0xC3, 0xEB, 0xA9, 0x05, + 0x9E, 0xE4, 0xE8, 0x0E, 0x6C, 0xEE, 0x8F, 0x05, 0xFE, 0xF7, 0x7D, 0xF3, + 0x33, 0xF9, 0x63, 0xEE, 0x6F, 0xFD, 0x5A, 0xF2, 0xE8, 0xFC, 0x30, 0xED, + 0x8E, 0x09, 0xBA, 0xEE, 0x79, 0x13, 0xE6, 0xF3, 0xC4, 0x02, 0x3D, 0xF4, + 0x78, 0xEC, 0x8E, 0xF6, 0xEB, 0xD9, 0xCF, 0xF9, 0x2F, 0xCE, 0x66, 0xF4, + 0x2E, 0xD4, 0x12, 0xE3, 0xA2, 0xEE, 0x86, 0xDF, 0xF8, 0x03, 0x89, 0xE2, + 0xE8, 0x0C, 0xFC, 0xE5, 0x33, 0xFF, 0x71, 0xF1, 0x3F, 0xDF, 0xC7, 0x00, + 0xF7, 0xC5, 0x00, 0x06, 0xA1, 0xC4, 0x13, 0x08, 0x4D, 0xDD, 0xC9, 0x0E, + 0xF0, 0xE9, 0x15, 0x03, 0xB8, 0xE9, 0x6E, 0xF7, 0x70, 0xF8, 0xDF, 0xFE, + 0x3E, 0x03, 0x4A, 0x03, 0x37, 0xF3, 0x65, 0xEC, 0x69, 0xF5, 0x6F, 0xD8, + 0x90, 0x12, 0x2B, 0xE6, 0xCF, 0x0E, 0x8B, 0xF6, 0xD9, 0xFE, 0x4A, 0x0A, + 0x14, 0xFD, 0xE1, 0x1A, 0xD5, 0xF7, 0xCE, 0x0B, 0x6E, 0xEC, 0x97, 0xEB, + 0x2A, 0xD4, 0x03, 0xC6, 0xFD, 0xB3, 0x0D, 0xA8, 0x3F, 0xA8, 0xA9, 0xA7, + 0x8B, 0xC7, 0xBE, 0xC6, 0x1C, 0xFA, 0x3C, 0xEF, 0xB4, 0x20, 0x18, 0x0E, + 0x4F, 0x38, 0x89, 0x1D, 0x31, 0x3D, 0xEC, 0x1A, 0xB2, 0x33, 0x96, 0x0C, + 0xE1, 0x25, 0x3D, 0x02, 0xE0, 0x13, 0x6E, 0x01, 0xA5, 0x02, 0x32, 0x01, + 0x1E, 0xFE, 0x52, 0x07, 0xF7, 0xFB, 0x66, 0x0C, 0xA4, 0xEB, 0xFE, 0x00, + 0x50, 0xDF, 0x4C, 0xF3, 0xC6, 0xE2, 0x3B, 0xEB, 0xBC, 0xE0, 0xB4, 0xE0, + 0x96, 0xD9, 0x67, 0xD6, 0xCA, 0xDE, 0x9E, 0xCF, 0xAF, 0xE3, 0x6D, 0xCD, + 0x11, 0xE8, 0xEE, 0xD5, 0x1B, 0xFC, 0x40, 0xEB, 0xE8, 0x10, 0x30, 0x03, + 0x22, 0x20, 0xF4, 0x15, 0xCF, 0x2B, 0xCA, 0x25, 0xFE, 0x26, 0x15, 0x33, + 0xCF, 0x20, 0x35, 0x30, 0x84, 0x28, 0x1A, 0x15, 0x4E, 0x2D, 0x65, 0xF7, + 0xF3, 0x21, 0x62, 0xDF, 0x76, 0x07, 0x5F, 0xCC, 0x97, 0xEB, 0x68, 0xD2, + 0xA2, 0xDE, 0xFC, 0xE6, 0x9A, 0xE0, 0x12, 0xF3, 0x8A, 0xE9, 0xF1, 0xFF, + 0xA5, 0xF5, 0x47, 0x0F, 0xA4, 0xFD, 0xE7, 0x13, 0x1F, 0x01, 0xE0, 0x11, + 0xE1, 0x05, 0x4F, 0x0B, 0x5D, 0x09, 0xC9, 0x04, 0xD3, 0x08, 0xF6, 0x12, + 0xDF, 0x06, 0x52, 0x28, 0x46, 0x06, 0xB9, 0x26, 0xA0, 0x07, 0xB4, 0x21, + 0xD8, 0xFC, 0xB6, 0x1B, 0x86, 0xED, 0x89, 0x0B, 0xD2, 0xEB, 0x82, 0x05, + 0x2B, 0xF4, 0xBD, 0x04, 0xB7, 0xFF, 0xBC, 0x03, 0x25, 0xF1, 0x82, 0xFB, + 0x90, 0xE4, 0x0E, 0xF9, 0x97, 0xF6, 0xA7, 0x01, 0xC8, 0x02, 0xB0, 0x07, + 0x0A, 0x01, 0x37, 0x0F, 0x6E, 0xFE, 0x3F, 0x1E, 0x4A, 0xF5, 0x37, 0x25, + 0xB7, 0xF4, 0x2C, 0x23, 0x0C, 0x10, 0x9F, 0x27, 0x73, 0x1B, 0x7F, 0x16, + 0x96, 0x13, 0xC5, 0xF8, 0xA3, 0x1F, 0x7B, 0xF5, 0x0E, 0x28, 0xA3, 0xF5, + 0x77, 0x0E, 0xC6, 0xE1, 0xB3, 0x09, 0xA2, 0xE1, 0xFE, 0x2B, 0xA9, 0x01, + 0x7C, 0x37, 0xEF, 0x19, 0x05, 0x35, 0xA5, 0x2A, 0xE5, 0x3A, 0x1F, 0x3B, + 0xFE, 0x2D, 0x69, 0x3A, 0xC2, 0x0D, 0x65, 0x1D, 0xBB, 0xEF, 0x22, 0xFA, + 0x5E, 0xDE, 0x74, 0xE7, 0xB6, 0xDF, 0xB7, 0xDA, 0xBC, 0xF1, 0x5B, 0xE1, + 0x76, 0x09, 0xC2, 0x05, 0xDC, 0x22, 0x77, 0x24, 0xBB, 0x43, 0xD7, 0x33, + 0xCB, 0x5B, 0x94, 0x3C, 0xB7, 0x57, 0x6E, 0x35, 0x81, 0x45, 0x4A, 0x2B, + 0x60, 0x2F, 0xB7, 0x23, 0x7D, 0x20, 0x95, 0x19, 0x50, 0x25, 0x95, 0x1C, + 0xEF, 0x1F, 0xB8, 0x2A, 0xD2, 0x03, 0x8F, 0x2C, 0x69, 0xF2, 0xCF, 0x28, + 0x58, 0xF4, 0x63, 0x2B, 0x0B, 0xF0, 0x26, 0x18, 0xE8, 0xEC, 0xC8, 0xFD, + 0xFA, 0xED, 0x40, 0xFA, 0x6B, 0xE9, 0x69, 0xFC, 0xDF, 0xEB, 0xB9, 0x00, + 0x04, 0xFB, 0xD0, 0x14, 0x6D, 0x15, 0x59, 0x2A, 0xA0, 0x2C, 0x57, 0x31, + 0x17, 0x3A, 0x60, 0x34, 0xC8, 0x47, 0x6E, 0x34, 0x72, 0x49, 0x10, 0x2C, + 0xA0, 0x37, 0x7D, 0x1F, 0x4C, 0x29, 0xB7, 0x16, 0xDB, 0x1C, 0x64, 0x0E, + 0x7C, 0x10, 0x8B, 0x0B, 0xAE, 0x0A, 0x4C, 0x0E, 0x30, 0x05, 0x9D, 0x08, + 0x24, 0x02, 0x4F, 0x00, 0xF6, 0xFC, 0x75, 0xF7, 0xC6, 0xEE, 0x71, 0xE3, + 0x1D, 0xE5, 0x24, 0xD4, 0x92, 0xEA, 0x25, 0xDC, 0xB5, 0xF2, 0x09, 0xEC, + 0x3F, 0xFD, 0x59, 0xFF, 0x6A, 0x0F, 0xC1, 0x16, 0xDD, 0x20, 0xB9, 0x24, + 0x4C, 0x21, 0xEE, 0x22, 0xCF, 0x13, 0x41, 0x1C, 0xDF, 0x02, 0x39, 0x12, + 0x9F, 0xF2, 0x8D, 0x05, 0x54, 0xF6, 0x1A, 0x02, 0x0C, 0x09, 0x8C, 0xF8, + 0x07, 0x0E, 0xF9, 0xE7, 0xF7, 0xEF, 0xED, 0xD7, 0xAC, 0xD5, 0x23, 0xDA, + 0x66, 0xDB, 0xCB, 0xEC, 0x8D, 0xE5, 0x1A, 0xF5, 0x45, 0xEC, 0x93, 0xF8, + 0xF3, 0xF7, 0x47, 0x01, 0x9C, 0xF9, 0x77, 0xFF, 0x74, 0xF4, 0x8F, 0xF5, + 0x18, 0xFB, 0x5D, 0x00, 0x60, 0xF3, 0x3B, 0x0D, 0xFE, 0xD9, 0x02, 0xFD, + 0xAA, 0xE7, 0xFC, 0xED, 0x4E, 0x13, 0x11, 0xF5, 0x88, 0x19, 0x47, 0xE5, + 0x46, 0x02, 0xF1, 0xC9, 0xB5, 0xFA, 0x28, 0xDB, 0x2F, 0x00, 0x3D, 0xFB, + 0x8B, 0xF7, 0x85, 0xFE, 0xDF, 0xEF, 0xDB, 0x06, 0x2A, 0xE9, 0x30, 0x16, + 0x66, 0xCD, 0xC0, 0x02, 0xB0, 0xB8, 0x4A, 0xD8, 0x50, 0xB7, 0x84, 0xB2, + 0xA0, 0xB5, 0xDF, 0x9B, 0x51, 0xC2, 0xF6, 0xA6, 0x96, 0xDA, 0x0A, 0xCC, + 0x76, 0xEC, 0x60, 0xF3, 0x6F, 0x03, 0xDE, 0x15, 0x6D, 0x11, 0x04, 0x1F, + 0x3F, 0x0B, 0x8F, 0x0A, 0xD5, 0x09, 0x23, 0xF6, 0xCC, 0x06, 0xA5, 0xE9, + 0x85, 0xF8, 0x8D, 0xD9, 0xBB, 0xF5, 0xF0, 0xD9, 0x00, 0xF5, 0xC0, 0xEC, + 0x9B, 0xED, 0xA7, 0xEE, 0x48, 0xED, 0x8D, 0xE9, 0x7A, 0xEA, 0xF7, 0xF8, + 0x1D, 0xD9, 0x9E, 0x01, 0x3F, 0xC6, 0x43, 0xF1, 0x3F, 0xC6, 0x87, 0xE0, + 0x00, 0xCB, 0xD2, 0xDD, 0x97, 0xCF, 0x06, 0xE6, 0x75, 0xDE, 0x07, 0xF4, + 0x54, 0xF2, 0x94, 0x09, 0x49, 0xFF, 0x92, 0x16, 0xCF, 0x0D, 0x31, 0x1C, + 0xF3, 0x2D, 0x7C, 0x27, 0xAA, 0x3A, 0xAD, 0x2B, 0xBF, 0x25, 0xF1, 0x2D, + 0x00, 0x12, 0xE3, 0x30, 0x6C, 0x09, 0xCE, 0x2B, 0xDE, 0x08, 0x07, 0x23, + 0x82, 0x12, 0x4D, 0x19, 0x28, 0x18, 0x2E, 0x0B, 0x49, 0x11, 0x31, 0x00, + 0xB7, 0x0C, 0xCD, 0xFE, 0xFF, 0x10, 0x57, 0xFF, 0xF6, 0x10, 0x93, 0xF8, + 0xA4, 0x11, 0x7B, 0xEE, 0x93, 0x1A, 0x87, 0xEF, 0x49, 0x21, 0xA1, 0xFC, + 0x6B, 0x24, 0x85, 0x0C, 0x32, 0x22, 0x39, 0x1A, 0x13, 0x26, 0x87, 0x28, + 0x36, 0x32, 0xB4, 0x30, 0x73, 0x34, 0x1C, 0x35, 0x53, 0x27, 0x8B, 0x34, + 0xCF, 0x16, 0xC6, 0x27, 0x21, 0x13, 0x67, 0x1D, 0xC2, 0x0F, 0xEA, 0x1F, + 0x85, 0x04, 0xA7, 0x1A, 0x2B, 0x03, 0xC5, 0x09, 0xD6, 0x0E, 0x5C, 0x0A, + 0xBC, 0x0D, 0x47, 0x0E, 0x60, 0x03, 0xEB, 0x04, 0xD4, 0x02, 0x96, 0xF9, + 0x9C, 0x00, 0x05, 0xEF, 0x6C, 0xF5, 0x10, 0xE8, 0x08, 0xEF, 0x59, 0xF8, + 0xAD, 0xF7, 0xCF, 0x14, 0xED, 0xFE, 0xD1, 0x0B, 0xFA, 0x06, 0x03, 0xF1, + 0xAF, 0x20, 0x86, 0xF8, 0x39, 0x28, 0x41, 0x08, 0x0A, 0x05, 0xFE, 0x03, + 0x11, 0xF2, 0xBC, 0x0A, 0x40, 0x0A, 0x50, 0x1A, 0x2A, 0x1A, 0x04, 0x18, + 0x7C, 0x15, 0x58, 0x1B, 0x18, 0x0E, 0xEC, 0x27, 0x81, 0xF7, 0xFD, 0x16, + 0xE8, 0xD7, 0xCC, 0xF0, 0x37, 0xC4, 0x2B, 0xD5, 0x89, 0xB5, 0x91, 0xBD, + 0x5F, 0xAE, 0xD7, 0xB7, 0x12, 0xC9, 0x67, 0xD1, 0x55, 0xF8, 0xEE, 0xF2, + 0x36, 0x12, 0x7C, 0x09, 0xA5, 0x1A, 0x46, 0x13, 0x7B, 0x1B, 0xC9, 0x14, + 0xDE, 0x15, 0x82, 0x10, 0xE4, 0x1D, 0xF2, 0x08, 0x48, 0x1F, 0x86, 0x03, + 0xA1, 0x09, 0x0C, 0x00, 0x7C, 0xF8, 0x5F, 0xF6, 0x6E, 0xF0, 0x74, 0xEA, + 0x6B, 0xDF, 0x74, 0xE1, 0xB0, 0xCF, 0x3D, 0xEA, 0xF6, 0xCC, 0x06, 0xFB, + 0xE3, 0xCC, 0xA8, 0xF7, 0xCB, 0xD2, 0xE2, 0xE4, 0xD1, 0xDD, 0xD0, 0xD1, + 0xA0, 0xE5, 0xC6, 0xBE, 0xD2, 0xEC, 0x45, 0xAF, 0xF2, 0xF7, 0xC1, 0xBB, + 0xB9, 0xFE, 0x55, 0xD6, 0x25, 0x02, 0x9C, 0xF2, 0x5D, 0x0A, 0xC7, 0x1A, + 0x93, 0x0A, 0xA8, 0x32, 0x63, 0x07, 0xAF, 0x2B, 0xEF, 0x0F, 0x94, 0x21, + 0x28, 0x0C, 0x91, 0x1E, 0x5A, 0x01, 0xB6, 0x13, 0xA9, 0x00, 0x2D, 0x05, + 0x2A, 0xF5, 0xB2, 0xF8, 0xFA, 0xE8, 0x59, 0xF4, 0xEA, 0xE6, 0x34, 0xF4, + 0x93, 0xE6, 0x9E, 0xED, 0xB2, 0xE8, 0xCF, 0xE5, 0x7B, 0xF1, 0x49, 0xDF, + 0x3A, 0xFE, 0x3F, 0xD8, 0x94, 0x03, 0x8D, 0xD4, 0x0F, 0xFF, 0xA7, 0xD0, + 0xA0, 0xF7, 0xF0, 0xD4, 0x88, 0xF7, 0x18, 0xE1, 0x94, 0x00, 0x28, 0xE8, + 0x9B, 0x05, 0x38, 0xF6, 0xFE, 0x08, 0xEF, 0x04, 0xB7, 0x03, 0xDE, 0xFE, + 0x79, 0xF4, 0x39, 0xF8, 0x3B, 0xEE, 0xE2, 0xFE, 0xA7, 0xF8, 0x04, 0x00, + 0x3B, 0x03, 0xB0, 0xF7, 0x7A, 0xF9, 0xB6, 0xF0, 0xFE, 0xF8, 0x3B, 0xF8, + 0x12, 0xFE, 0xB3, 0x06, 0x60, 0xF5, 0xD4, 0x0C, 0x66, 0xF0, 0x75, 0x02, + 0x36, 0xEC, 0xE9, 0xEF, 0x51, 0xE0, 0x3A, 0xE4, 0x5D, 0xDE, 0xAB, 0xE7, + 0x01, 0xF0, 0xAA, 0xF5, 0x6F, 0xF1, 0x10, 0xF9, 0xE9, 0xE9, 0x7D, 0xFB, + 0xFD, 0xFE, 0x4F, 0x16, 0xB2, 0x0A, 0xDA, 0x27, 0x14, 0xF3, 0xB5, 0x15, + 0xC3, 0xE6, 0x34, 0x08, 0xFC, 0xF2, 0x5A, 0x14, 0xB1, 0x01, 0xD9, 0x1F, + 0x28, 0x13, 0x1F, 0x25, 0xCA, 0x1D, 0x71, 0x28, 0x16, 0x12, 0x95, 0x15, + 0x43, 0xFD, 0xBB, 0xF2, 0xD2, 0xEB, 0x04, 0xDA, 0x15, 0xDF, 0xF1, 0xC8, + 0xC4, 0xE4, 0x7A, 0xC0, 0xE5, 0xFD, 0xD5, 0xD4, 0x37, 0x11, 0x1E, 0xFB, + 0xAA, 0x0F, 0xCD, 0x16, 0x3A, 0x08, 0x4F, 0x20, 0x48, 0x11, 0x6A, 0x20, + 0x92, 0x24, 0x3A, 0x21, 0x80, 0x32, 0x4A, 0x26, 0x8A, 0x32, 0xF9, 0x2C, + 0x74, 0x2E, 0x50, 0x2D, 0x26, 0x36, 0x9E, 0x27, 0x1C, 0x34, 0x85, 0x25, + 0x7B, 0x17, 0x8D, 0x1E, 0xEB, 0x05, 0x23, 0x12, 0xA4, 0x0F, 0xF2, 0x0A, + 0x88, 0x14, 0xB6, 0x01, 0x6D, 0x0B, 0x30, 0xFA, 0x10, 0xFE, 0x67, 0xFB, + 0xDA, 0xFF, 0x75, 0xF8, 0x64, 0x0A, 0x55, 0xEE, 0xC8, 0x0F, 0xDA, 0xEC, + 0x73, 0x12, 0x5A, 0xFA, 0x09, 0x1A, 0x28, 0x11, 0x42, 0x26, 0x17, 0x21, + 0x99, 0x32, 0x6B, 0x2A, 0x3B, 0x43, 0x57, 0x3C, 0x4D, 0x40, 0xEF, 0x46, + 0x76, 0x31, 0x2E, 0x3F, 0x23, 0x2E, 0x6E, 0x2F, 0x27, 0x24, 0x0E, 0x1E, + 0xEA, 0x14, 0x3A, 0x11, 0x9D, 0x09, 0x43, 0x11, 0xA3, 0x04, 0xE5, 0x1E, + 0xA1, 0x03, 0xDF, 0x1F, 0x14, 0x03, 0x5F, 0x12, 0xD9, 0x07, 0xE1, 0x0E, + 0x81, 0x0B, 0x0F, 0x0A, 0x11, 0x09, 0xF7, 0xFB, 0x60, 0x06, 0xC4, 0xF4, + 0xAA, 0x08, 0x20, 0xFA, 0x9B, 0x0B, 0x0A, 0x04, 0xCA, 0x03, 0x45, 0x11, + 0x14, 0xFA, 0x80, 0x1B, 0x83, 0xFA, 0xCF, 0x1A, 0xE9, 0xFD, 0x0A, 0x12, + 0xF1, 0x08, 0x3E, 0x07, 0xA6, 0x17, 0xBF, 0x04, 0x62, 0x1A, 0x49, 0x02, + 0x79, 0x0C, 0xC8, 0xF3, 0x66, 0xFC, 0xFE, 0xDF, 0xB7, 0xF4, 0xB9, 0xDF, + 0xFA, 0xED, 0x0A, 0xEA, 0x22, 0xF6, 0x50, 0xEB, 0xFC, 0x07, 0xC1, 0xF1, + 0xC9, 0x0E, 0x0D, 0xF9, 0x68, 0x05, 0x39, 0xF0, 0x9A, 0xF9, 0xDC, 0xEF, + 0x54, 0xED, 0xF9, 0xFE, 0x41, 0xD6, 0xCD, 0xF4, 0xE3, 0xD0, 0x80, 0xE1, + 0x35, 0xE7, 0x07, 0xEA, 0x34, 0x01, 0x52, 0xF5, 0xBB, 0xFE, 0xAD, 0xEA, + 0xA3, 0xEF, 0x7E, 0xEC, 0xF1, 0xF1, 0x2B, 0x08, 0x21, 0xF1, 0x5F, 0x14, + 0xD4, 0xF5, 0xD7, 0x0F, 0x4D, 0x0B, 0xF4, 0x0B, 0x00, 0x0B, 0xFB, 0x00, + 0xED, 0xF0, 0x28, 0xEF, 0x8E, 0xD9, 0xFD, 0xDF, 0xE5, 0xC2, 0x93, 0xD1, + 0x1D, 0xAC, 0xA9, 0xC9, 0x86, 0xAB, 0xEF, 0xCF, 0x39, 0xCC, 0xCE, 0xDF, + 0xF9, 0xED, 0xB5, 0xF4, 0x9C, 0x01, 0xCD, 0x02, 0xB3, 0x10, 0x5D, 0x06, + 0xB9, 0x17, 0xB7, 0x0C, 0x91, 0x11, 0xD2, 0x13, 0xAE, 0x00, 0x52, 0x0F, + 0xC1, 0xED, 0x25, 0x08, 0xCE, 0xE4, 0xC7, 0x03, 0x03, 0xE8, 0x1A, 0xF7, + 0x57, 0xF0, 0xF1, 0xE1, 0x37, 0xFC, 0xE9, 0xD5, 0xC8, 0xF5, 0x72, 0xDD, + 0x5A, 0xD6, 0xF9, 0xE9, 0xBF, 0xC1, 0x2D, 0xE5, 0xE4, 0xC7, 0xF5, 0xD2, + 0x33, 0xD5, 0xDA, 0xBE, 0xAC, 0xE1, 0x8D, 0xB3, 0xC1, 0xF2, 0xAE, 0xBF, + 0x50, 0xFD, 0xFE, 0xD3, 0x35, 0x02, 0x44, 0xDF, 0x6F, 0x05, 0x82, 0xE6, + 0x41, 0x03, 0x60, 0xEF, 0x34, 0x03, 0x83, 0xFA, 0xE6, 0x0B, 0xEC, 0x09, + 0x2B, 0x15, 0xBE, 0x16, 0x1B, 0x15, 0x30, 0x19, 0xFE, 0x0B, 0x14, 0x19, + 0x5F, 0xF5, 0x2E, 0x11, 0xCC, 0xE7, 0x30, 0x05, 0xE4, 0xEB, 0x9C, 0x00, + 0xCA, 0xE9, 0x65, 0x01, 0x8E, 0xF0, 0xCB, 0x0B, 0x24, 0xFD, 0xB0, 0x16, + 0x58, 0xF5, 0x94, 0x0C, 0xAA, 0xE5, 0x2E, 0xF7, 0xA3, 0xDF, 0x87, 0xEC, + 0xC2, 0xDA, 0x11, 0xE8, 0xAA, 0xD5, 0x2D, 0xE8, 0xED, 0xE6, 0xAC, 0xF3, + 0x05, 0x02, 0xA3, 0x01, 0x9E, 0x0C, 0xEB, 0x0C, 0x53, 0x02, 0x8D, 0x10, + 0xCC, 0xEF, 0x71, 0x07, 0x58, 0xF2, 0x02, 0xF8, 0xE8, 0x06, 0x29, 0xE3, + 0xC1, 0x18, 0xA8, 0xDD, 0x8F, 0x1D, 0x98, 0xE5, 0x43, 0x14, 0xF8, 0xE4, + 0xAA, 0x09, 0xC2, 0xE8, 0x88, 0x00, 0xE7, 0xF5, 0xDA, 0xFA, 0x78, 0xF9, + 0x4E, 0xFB, 0xCA, 0xED, 0x47, 0xF3, 0x23, 0xE0, 0xC8, 0xE8, 0x00, 0xDE, + 0x5F, 0xED, 0x95, 0xEF, 0x39, 0xEE, 0x4D, 0xF8, 0x3D, 0xE1, 0x3C, 0xE7, + 0xA8, 0xE6, 0xDC, 0xE8, 0x04, 0x03, 0xD8, 0x02, 0xC8, 0x0B, 0x3A, 0x0E, + 0x85, 0x01, 0x8B, 0x05, 0x86, 0x0A, 0x9F, 0x03, 0x08, 0x18, 0x69, 0x05, + 0x74, 0x14, 0x5B, 0x03, 0xBC, 0x09, 0xB1, 0x09, 0x9A, 0xF7, 0xA3, 0x06, + 0x97, 0xE2, 0x0C, 0xF4, 0xF6, 0xD7, 0xE6, 0xE5, 0x8B, 0xD9, 0x42, 0xE4, + 0xF1, 0xDA, 0xC8, 0xDE, 0x54, 0xCE, 0x74, 0xD6, 0x6B, 0xC9, 0x89, 0xE4, + 0x96, 0xDE, 0x63, 0xF9, 0xB0, 0xF7, 0x71, 0x00, 0x37, 0x0A, 0xD4, 0xFE, + 0xB1, 0x1F, 0x35, 0x00, 0xCC, 0x35, 0x33, 0x0A, 0x68, 0x39, 0xDE, 0x0B, + 0x80, 0x21, 0xF3, 0x0A, 0x71, 0x04, 0x71, 0x10, 0xCD, 0xF7, 0x76, 0x0C, + 0x4F, 0xF8, 0x65, 0x04, 0x51, 0xFE, 0x29, 0x0D, 0xBC, 0xFA, 0xDA, 0x1F, + 0xB6, 0xE4, 0xCE, 0x1E, 0x65, 0xCC, 0x1F, 0x0D, 0x33, 0xC4, 0x66, 0xFF, + 0x11, 0xC7, 0xCF, 0xEE, 0x96, 0xCE, 0x60, 0xE5, 0x7E, 0xE2, 0x60, 0xEF, + 0x84, 0xF3, 0x6D, 0xF9, 0x8F, 0xF9, 0x30, 0xFA, 0xF4, 0xFF, 0xB0, 0xFB, + 0x3D, 0x0D, 0xFA, 0x02, 0x7D, 0x20, 0x76, 0x08, 0x5A, 0x2D, 0x93, 0x0F, + 0x48, 0x2C, 0x34, 0x1E, 0x61, 0x23, 0xA1, 0x2F, 0x38, 0x1C, 0x05, 0x31, + 0x01, 0x1C, 0x93, 0x1C, 0x9B, 0x1E, 0xC8, 0x0E, 0xF9, 0x18, 0x2C, 0x14, + 0x1F, 0x16, 0xC8, 0x20, 0x1C, 0x1D, 0xA7, 0x1F, 0xF9, 0x1D, 0xF7, 0x14, + 0xFF, 0x18, 0x2B, 0x09, 0x7E, 0x10, 0xF1, 0xFA, 0xDF, 0x0C, 0x4E, 0xF9, + 0x92, 0x1B, 0x0B, 0x00, 0x70, 0x28, 0x6C, 0x05, 0x74, 0x1F, 0x27, 0x0E, + 0x1A, 0x0F, 0x0E, 0x20, 0x28, 0x07, 0x96, 0x2B, 0x43, 0x0D, 0x79, 0x29, + 0x83, 0x1D, 0x41, 0x21, 0x13, 0x2B, 0xA1, 0x1F, 0x9C, 0x33, 0xCB, 0x2C, + 0x18, 0x41, 0x46, 0x2E, 0x52, 0x44, 0xCF, 0x1C, 0x11, 0x28, 0x67, 0x10, + 0x23, 0x08, 0x1E, 0x14, 0xAF, 0xFA, 0xB6, 0x1D, 0xB5, 0x00, 0xD1, 0x1C, + 0x1C, 0x16, 0x67, 0x19, 0x79, 0x20, 0x88, 0x17, 0x22, 0x0D, 0x60, 0x0C, + 0x55, 0xFC, 0xB8, 0x06, 0x7B, 0x0D, 0x79, 0x03, 0x7F, 0x1A, 0x1D, 0xED, + 0x27, 0x1B, 0xCF, 0xDE, 0x63, 0x2F, 0x57, 0xFD, 0x4C, 0x3C, 0xE1, 0x26, + 0x5B, 0x2C, 0xD5, 0x28, 0xEB, 0x20, 0xF5, 0x1B, 0x38, 0x28, 0x38, 0x22, + 0x3A, 0x2A, 0xF3, 0x28, 0xB9, 0x2B, 0x61, 0x2A, 0xF3, 0x2A, 0xD2, 0x30, + 0x82, 0x16, 0x51, 0x34, 0x9D, 0x00, 0x4C, 0x2D, 0xCF, 0xEB, 0x81, 0x25, + 0xD8, 0xD2, 0x52, 0x18, 0x2C, 0xCC, 0x3B, 0x00, 0x4B, 0xD9, 0x66, 0xF5, + 0x3E, 0xEE, 0xA4, 0xFB, 0xF5, 0x06, 0xCB, 0x06, 0x6B, 0x18, 0x1B, 0x0E, + 0x62, 0x20, 0x8A, 0x09, 0xE0, 0x28, 0xFD, 0x0D, 0x92, 0x2C, 0x59, 0x23, + 0x20, 0x1C, 0xAD, 0x2D, 0x72, 0x0D, 0x2E, 0x29, 0x80, 0x11, 0xDB, 0x25, + 0x7E, 0x15, 0x34, 0x23, 0xB9, 0x19, 0x21, 0x1D, 0xDA, 0x15, 0xB5, 0x16, + 0x81, 0xFD, 0x39, 0x0E, 0xC0, 0xE7, 0x5A, 0xFC, 0x05, 0xE0, 0xEF, 0xED, + 0x3D, 0xDF, 0x9E, 0xE3, 0xE9, 0xDF, 0x4C, 0xD0, 0x0B, 0xE5, 0x06, 0xCC, + 0x89, 0xE9, 0x35, 0xD9, 0x30, 0xED, 0x79, 0xDE, 0x44, 0x00, 0x5E, 0xDD, + 0xE3, 0x16, 0xEC, 0xDD, 0xC1, 0x21, 0x2B, 0xE7, 0x07, 0x2A, 0x72, 0xFD, + 0xBF, 0x2A, 0x45, 0x16, 0x8D, 0x21, 0x5F, 0x23, 0x64, 0x17, 0xE5, 0x22, + 0x28, 0x05, 0xCA, 0x1A, 0xA6, 0xF6, 0x1D, 0x10, 0xE4, 0xFE, 0xA8, 0x0A, + 0x93, 0x0D, 0x0D, 0x09, 0x7F, 0x0D, 0x19, 0xFF, 0x74, 0x03, 0xA7, 0xF1, + 0x53, 0xF5, 0x13, 0xEC, 0x4B, 0xE7, 0xBA, 0xE1, 0xE3, 0xDF, 0x11, 0xD4, + 0x27, 0xDB, 0x48, 0xD3, 0x30, 0xDA, 0xCA, 0xDC, 0xB8, 0xDD, 0xA5, 0xE3, + 0x06, 0xE3, 0x9A, 0xE6, 0x61, 0xED, 0x46, 0xE9, 0x45, 0xF4, 0xB9, 0xE9, + 0x21, 0xEF, 0xA0, 0xF6, 0xFA, 0xEA, 0x96, 0x06, 0xDD, 0xEF, 0xC3, 0x03, + 0x1A, 0xF8, 0x69, 0xF4, 0xDB, 0xFA, 0x89, 0xE8, 0x26, 0xEA, 0xAC, 0xE4, + 0xB0, 0xD0, 0x4A, 0xE3, 0xDA, 0xC8, 0xA8, 0xE5, 0x69, 0xD4, 0x86, 0xE7, + 0x38, 0xDE, 0xFD, 0xE9, 0xBC, 0xE0, 0x16, 0xEB, 0xF8, 0xE4, 0x14, 0xDA, + 0x6D, 0xE3, 0x3A, 0xC1, 0xF4, 0xE1, 0x74, 0xC0, 0x8E, 0xE2, 0x90, 0xD0, + 0xDA, 0xD0, 0xF8, 0xCF, 0x97, 0xC9, 0x90, 0xC7, 0x8C, 0xE7, 0x8F, 0xCE, + 0x00, 0xFC, 0xA2, 0xD8, 0xB4, 0xEF, 0x92, 0xDB, 0xF4, 0xE5, 0x35, 0xE4, + 0xC1, 0xF1, 0x40, 0xF0, 0x02, 0xFF, 0xFD, 0xF5, 0xD5, 0x07, 0xA4, 0x09, + 0x73, 0x07, 0x3D, 0x23, 0x91, 0xF5, 0x1D, 0x25, 0xC1, 0xE8, 0xE7, 0x13, + 0x5B, 0xE9, 0x74, 0xFA, 0xBC, 0xE4, 0x33, 0xE3, 0x74, 0xDA, 0x98, 0xDA, + 0x61, 0xD6, 0x94, 0xDF, 0x17, 0xDF, 0x03, 0xE6, 0xBC, 0xF2, 0x3C, 0xEB, + 0x82, 0x02, 0x67, 0xEE, 0x13, 0x06, 0xF7, 0xF1, 0x14, 0x10, 0x16, 0x05, + 0x2E, 0x26, 0xC9, 0x22, 0x41, 0x2C, 0x83, 0x32, 0x0C, 0x2A, 0xAC, 0x2D, + 0xE0, 0x2E, 0x53, 0x28, 0x8A, 0x2B, 0x36, 0x22, 0x5C, 0x23, 0x7B, 0x19, + 0xF9, 0x16, 0x7F, 0x24, 0x8F, 0x05, 0x7B, 0x33, 0x80, 0xF9, 0x5A, 0x2D, + 0x42, 0xFE, 0xA8, 0x1E, 0x86, 0x0A, 0xF6, 0x0B, 0xC2, 0x0A, 0x48, 0xFA, + 0x90, 0x07, 0xD6, 0xF5, 0x19, 0x03, 0xFA, 0xF7, 0xE0, 0xF9, 0xB0, 0xF9, + 0xE7, 0xFA, 0xAA, 0xF9, 0xF4, 0x06, 0x55, 0xFF, 0x8C, 0x0C, 0xA1, 0x14, + 0xCF, 0x0F, 0xE7, 0x2A, 0x82, 0x12, 0xF6, 0x30, 0xEA, 0x11, 0x53, 0x2D, + 0x82, 0x19, 0x2A, 0x2B, 0x1F, 0x23, 0xA7, 0x27, 0x19, 0x28, 0x45, 0x1F, + 0x43, 0x33, 0x96, 0x19, 0x13, 0x3B, 0xEF, 0x18, 0xA0, 0x32, 0x89, 0x11, + 0x52, 0x22, 0x71, 0x00, 0x6F, 0x11, 0x59, 0xF4, 0x2B, 0x02, 0x96, 0xF1, + 0x65, 0xF6, 0x45, 0xF0, 0x80, 0xF5, 0x89, 0xF2, 0xAF, 0xFD, 0xB1, 0xF4, + 0x1E, 0x05, 0x4E, 0xEB, 0x2E, 0x06, 0xAD, 0xDF, 0xBB, 0xFB, 0xBD, 0xE9, + 0xCE, 0xEC, 0x95, 0x02, 0xF2, 0xE7, 0x37, 0x0F, 0x01, 0xF2, 0x78, 0x0D, + 0x04, 0x01, 0xD0, 0x0A, 0xF4, 0x03, 0x09, 0x0B, 0x2F, 0x03, 0xB6, 0x07, + 0x37, 0x03, 0x2D, 0x01, 0x5C, 0xF3, 0x68, 0x01, 0x88, 0xDF, 0x19, 0x06, + 0xB4, 0xE1, 0x14, 0x06, 0x85, 0xF3, 0x89, 0x02, 0xB8, 0xF6, 0xC4, 0xFD, + 0x0E, 0xE6, 0x57, 0xF3, 0x31, 0xCE, 0x1B, 0xE4, 0x12, 0xC8, 0xE8, 0xDE, + 0x5A, 0xE2, 0xE2, 0xE1, 0xC0, 0xF4, 0xD1, 0xD7, 0x03, 0xEB, 0x16, 0xCC, + 0x21, 0xEB, 0xB1, 0xE1, 0x84, 0x04, 0x06, 0xFA, 0x75, 0x10, 0xD0, 0xED, + 0xEA, 0x02, 0x19, 0xE4, 0xCC, 0xFB, 0x3C, 0xF0, 0xDA, 0xF8, 0x61, 0xF7, + 0x49, 0xFB, 0xC9, 0xF7, 0xC3, 0x05, 0x56, 0xF6, 0xD8, 0xFD, 0xF7, 0xF5, + 0x74, 0xEC, 0x2A, 0xF4, 0x25, 0xEA, 0xB7, 0xEE, 0x7F, 0xF0, 0x6F, 0xE6, + 0x40, 0xF5, 0xE0, 0xD4, 0x4D, 0xF3, 0xC0, 0xC6, 0x23, 0xEA, 0x2F, 0xCC, + 0x6C, 0xE2, 0xF6, 0xD8, 0x8C, 0xE4, 0xCF, 0xDD, 0x8D, 0xE5, 0xA2, 0xDD, + 0x7D, 0xDF, 0x95, 0xE5, 0x1F, 0xDE, 0xDF, 0xFB, 0xF2, 0xDF, 0x13, 0x0A, + 0x16, 0xE3, 0xA4, 0xFE, 0x9D, 0xEF, 0x1C, 0xF4, 0xB5, 0xFA, 0x1D, 0xFA, + 0x95, 0xF1, 0x1C, 0x03, 0x47, 0xEC, 0x6D, 0x07, 0x33, 0xFF, 0x43, 0x04, + 0xC9, 0x0A, 0x71, 0xFD, 0x2E, 0x0C, 0x44, 0xF8, 0xDB, 0x0A, 0x81, 0xF8, + 0x22, 0xF9, 0x74, 0xF3, 0xC7, 0xEC, 0x01, 0xE7, 0x48, 0xEB, 0x8E, 0xE4, + 0x80, 0xDB, 0xA4, 0xE6, 0xE7, 0xCD, 0x6C, 0xE9, 0xCE, 0xD0, 0xDD, 0xF0, + 0x95, 0xD4, 0x67, 0xFC, 0xAB, 0xE3, 0x9D, 0x0C, 0xA7, 0xFE, 0x38, 0x1F, + 0x13, 0x11, 0x39, 0x24, 0xC3, 0x20, 0x04, 0x0F, 0xCB, 0x30, 0x8B, 0xFD, + 0x7E, 0x37, 0x2B, 0x01, 0x80, 0x30, 0x0F, 0x10, 0x6F, 0x22, 0xB8, 0x20, + 0xEA, 0x1B, 0x81, 0x26, 0xBC, 0x23, 0x23, 0x20, 0xB9, 0x2A, 0x1A, 0x12, + 0xD9, 0x11, 0x91, 0x06, 0xF5, 0xEC, 0x38, 0xFE, 0x52, 0xDD, 0xF0, 0xF7, + 0xAC, 0xDB, 0x8E, 0xFC, 0x22, 0xE9, 0xEE, 0x03, 0x37, 0xFD, 0x7A, 0x04, + 0xB0, 0x04, 0xE1, 0x01, 0x29, 0x02, 0xB3, 0x00, 0xF0, 0x01, 0x4C, 0x00, + 0x90, 0x09, 0x47, 0xFF, 0x97, 0x13, 0xA4, 0xF8, 0xD0, 0x20, 0x7D, 0xF4, + 0x0C, 0x29, 0xD7, 0xFB, 0xF6, 0x26, 0x44, 0x08, 0xC8, 0x1F, 0xC2, 0x15, + 0x05, 0x0C, 0x76, 0x17, 0xF8, 0xF5, 0xE3, 0x13, 0x99, 0xED, 0xB3, 0x1C, + 0x25, 0xEE, 0xDF, 0x27, 0xEE, 0xF7, 0x5E, 0x27, 0x9F, 0x0B, 0xF1, 0x16, + 0xBF, 0x15, 0xB6, 0x03, 0x89, 0x12, 0x0B, 0xFD, 0x42, 0x15, 0xBC, 0x02, + 0x60, 0x0E, 0x5B, 0x02, 0x42, 0xF8, 0x94, 0xF6, 0x66, 0xFD, 0x4E, 0xF9, + 0x6F, 0x11, 0x3E, 0x08, 0x38, 0x13, 0xF4, 0x09, 0xD6, 0x14, 0x16, 0xFF, + 0x1D, 0x1C, 0xC3, 0xFC, 0xEA, 0x18, 0x73, 0x02, 0x07, 0x14, 0x39, 0x0F, + 0x5E, 0x12, 0x73, 0x1E, 0x0A, 0x12, 0xCB, 0x18, 0x5D, 0x18, 0x4D, 0x0C, + 0x51, 0x19, 0xC9, 0x0C, 0xF4, 0x08, 0xBE, 0x08, 0xFB, 0xFC, 0xAD, 0xF9, + 0x94, 0x05, 0xB6, 0xEF, 0xB1, 0x0A, 0x15, 0xF0, 0x71, 0x02, 0x0D, 0xFD, + 0xAB, 0xF9, 0xC6, 0x14, 0xE5, 0xF0, 0x92, 0x24, 0xC5, 0xF8, 0x09, 0x24, + 0x27, 0x0F, 0x77, 0x23, 0x02, 0x0C, 0xCB, 0x22, 0x80, 0xFA, 0x47, 0x11, + 0xE4, 0x00, 0xED, 0x00, 0x45, 0x0F, 0x65, 0x07, 0x9B, 0x16, 0x6E, 0x1B, + 0xEC, 0x24, 0x2E, 0x34, 0x9B, 0x2B, 0x02, 0x3F, 0x75, 0x23, 0xEE, 0x2E, + 0xEA, 0x19, 0xCD, 0x16, 0xBF, 0x09, 0xAB, 0x06, 0x11, 0xF5, 0xB9, 0xFF, + 0x4F, 0xEB, 0x63, 0x00, 0xC3, 0xED, 0x39, 0xFD, 0xAE, 0xEE, 0xCB, 0xF3, + 0xD4, 0xF2, 0x5D, 0xF6, 0x4B, 0xFB, 0x82, 0xFC, 0x66, 0x00, 0xFB, 0xF7, + 0x21, 0x0C, 0x7E, 0xF9, 0xAC, 0x19, 0x53, 0x06, 0x37, 0x1B, 0x5E, 0x0E, + 0x22, 0x19, 0x8A, 0x0C, 0x81, 0x20, 0x8D, 0x0C, 0x7E, 0x2B, 0x34, 0x0D, + 0x81, 0x33, 0x84, 0x0E, 0x2D, 0x32, 0xA1, 0x1A, 0x62, 0x29, 0x7C, 0x2A, + 0x0F, 0x1F, 0xE7, 0x2D, 0x56, 0x12, 0xF9, 0x27, 0xEA, 0x08, 0xA9, 0x21, + 0xD9, 0x02, 0x0B, 0x14, 0x19, 0xF9, 0x07, 0xFD, 0x10, 0xEF, 0xE9, 0xE6, + 0x0C, 0xEF, 0xBD, 0xDF, 0x7E, 0xF5, 0xDD, 0xEA, 0x82, 0xF4, 0xAB, 0xF0, + 0x99, 0xF5, 0x27, 0xE5, 0x4B, 0x08, 0xBD, 0xD6, 0xBF, 0x12, 0xE8, 0xCF, + 0x49, 0x01, 0x23, 0xD3, 0x12, 0xEA, 0xBD, 0xDC, 0x20, 0xDF, 0x07, 0xEC, + 0x78, 0xDD, 0xFF, 0xF5, 0xAE, 0xE4, 0xEE, 0xF8, 0x8D, 0xE8, 0xB8, 0xF6, + 0xE8, 0xE3, 0xD1, 0xEC, 0x0C, 0xE3, 0xEC, 0xE8, 0xB1, 0xE0, 0x7B, 0xEE, + 0x51, 0xD9, 0x0C, 0xF1, 0x3A, 0xDA, 0x45, 0xEA, 0x59, 0xDB, 0xA1, 0xDE, + 0xBF, 0xD7, 0x4B, 0xDE, 0xF0, 0xDB, 0x63, 0xEE, 0x25, 0xDC, 0x9A, 0xF5, + 0x86, 0xD2, 0x6C, 0xEA, 0xB8, 0xD6, 0x18, 0xE3, 0xE4, 0xE6, 0xF7, 0xE3, + 0x29, 0xE4, 0x1F, 0xE2, 0x2A, 0xD7, 0x49, 0xE1, 0x1E, 0xD6, 0xE8, 0xE2, + 0xEB, 0xDD, 0xE6, 0xE1, 0x55, 0xF4, 0xD5, 0xE2, 0xFA, 0x0B, 0x21, 0xEB, + 0x3A, 0x0A, 0x45, 0xEF, 0x16, 0xFD, 0x56, 0xE7, 0xF7, 0xF6, 0x8C, 0xDE, + 0x04, 0xEE, 0x34, 0xD7, 0x9F, 0xE2, 0x03, 0xCF, 0x99, 0xE0, 0xBD, 0xCE, + 0xE4, 0xE4, 0x58, 0xD3, 0x5A, 0xE7, 0x33, 0xD9, 0x36, 0xE2, 0x38, 0xEB, + 0xCE, 0xDB, 0x78, 0xFD, 0xB7, 0xE3, 0x14, 0xFE, 0xF6, 0xF6, 0x37, 0xFB, + 0xB0, 0x02, 0x60, 0x01, 0x3F, 0xFF, 0x36, 0x05, 0xFF, 0xFB, 0x53, 0x06, + 0x0C, 0xFD, 0x08, 0x08, 0x78, 0xFE, 0x7B, 0x07, 0x5C, 0x03, 0x51, 0x13, + 0xBA, 0x03, 0x82, 0x26, 0xC0, 0x01, 0x8B, 0x27, 0xFE, 0x09, 0xC6, 0x17, + 0xD1, 0x0E, 0x58, 0x09, 0x92, 0x01, 0x8B, 0x04, 0xD7, 0xF2, 0x16, 0x08, + 0x05, 0xED, 0x13, 0x12, 0xB1, 0xEA, 0x39, 0x0F, 0x6D, 0xF1, 0x0E, 0x02, + 0x97, 0x05, 0x4F, 0x01, 0x90, 0x17, 0x56, 0x00, 0xF3, 0x1B, 0x02, 0xF9, + 0x99, 0x18, 0x30, 0xF7, 0x08, 0x0B, 0x71, 0xFE, 0xB2, 0xFB, 0xD9, 0x0A, + 0x6F, 0xF9, 0x1C, 0x13, 0xD7, 0x03, 0xC2, 0x18, 0xF8, 0x17, 0xE8, 0x21, + 0x92, 0x28, 0x37, 0x25, 0xB9, 0x24, 0x68, 0x1E, 0xC4, 0x15, 0x58, 0x17, + 0x32, 0x11, 0x7C, 0x0F, 0x91, 0x14, 0x23, 0x03, 0xBA, 0x18, 0x21, 0xFE, + 0x0C, 0x18, 0xA8, 0x02, 0xBF, 0x13, 0x4A, 0xFC, 0x35, 0x17, 0x1D, 0xEA, + 0xDC, 0x17, 0x52, 0xE4, 0x87, 0x08, 0xFE, 0xEA, 0x2E, 0xF0, 0xDD, 0xED, + 0xB5, 0xE3, 0x53, 0xF4, 0xC9, 0xED, 0x8B, 0xFC, 0xB0, 0x03, 0xD0, 0xFA, + 0xA2, 0x12, 0x74, 0xF7, 0xAB, 0x10, 0x5A, 0xF6, 0x1F, 0x01, 0x27, 0xF7, + 0x9D, 0xEC, 0x47, 0xF8, 0xC1, 0xDD, 0x86, 0xFA, 0xB6, 0xD4, 0x9B, 0xFB, + 0xE3, 0xD3, 0x73, 0xF8, 0x84, 0xE7, 0xC8, 0xF1, 0x85, 0x00, 0x57, 0xEE, + 0x2D, 0x05, 0x70, 0xF5, 0xCE, 0xFC, 0xE7, 0xF7, 0xA4, 0xEE, 0x12, 0xF1, + 0xA0, 0xE4, 0x21, 0xFA, 0x96, 0xEB, 0xC7, 0x11, 0xD9, 0xF5, 0xF5, 0x11, + 0x9C, 0xF2, 0xC9, 0xFE, 0x68, 0xEA, 0x3A, 0xF8, 0xB6, 0xE8, 0x6C, 0xF5, + 0x2B, 0xDF, 0xDA, 0xF1, 0xD8, 0xD3, 0x99, 0xEE, 0x35, 0xDA, 0xAF, 0xEC, + 0x9D, 0xE9, 0x10, 0xF5, 0x6F, 0xFE, 0xD0, 0xFF, 0x2E, 0x12, 0xAE, 0x01, + 0x06, 0x19, 0x80, 0xFA, 0x28, 0x16, 0x0D, 0xF1, 0xC5, 0x0E, 0xCD, 0xE8, + 0x8D, 0x01, 0x79, 0xE3, 0x4D, 0xF9, 0xA4, 0xE9, 0xFC, 0xFD, 0x9B, 0xF5, + 0x68, 0xFE, 0x01, 0xFE, 0x82, 0xF9, 0xC3, 0x04, 0x71, 0xF8, 0x3E, 0x09, + 0xD5, 0xF4, 0xB2, 0x0B, 0x3E, 0xF7, 0x85, 0x0E, 0x21, 0x0A, 0xDC, 0x10, + 0x8D, 0x1C, 0xCB, 0x0B, 0x0C, 0x1D, 0x82, 0x03, 0x90, 0x18, 0x1A, 0x04, + 0x86, 0x12, 0x14, 0x0D, 0x9D, 0x09, 0x88, 0x19, 0xCF, 0x10, 0x70, 0x24, + 0x3E, 0x1F, 0x7A, 0x2B, 0xA5, 0x29, 0xA7, 0x2A, 0x0B, 0x37, 0x7D, 0x1F, + 0xE1, 0x39, 0xA9, 0x0F, 0xBF, 0x23, 0x86, 0x0A, 0xFB, 0x08, 0xE8, 0x14, + 0x79, 0xFD, 0x74, 0x1A, 0x09, 0xFE, 0x57, 0x14, 0x70, 0x06, 0xF7, 0x14, + 0xD8, 0x0D, 0xD3, 0x1D, 0x27, 0x0E, 0x3E, 0x1E, 0x21, 0x12, 0x1C, 0x1C, + 0x21, 0x22, 0xE2, 0x1C, 0xC2, 0x2C, 0xBF, 0x1A, 0xEA, 0x2C, 0xBA, 0x22, + 0xCB, 0x2C, 0xED, 0x37, 0xE5, 0x28, 0x35, 0x42, 0xFD, 0x27, 0x67, 0x3B, + 0x9C, 0x2B, 0x35, 0x35, 0x62, 0x26, 0xF8, 0x32, 0x5C, 0x1D, 0x26, 0x32, + 0x38, 0x20, 0x71, 0x34, 0x9A, 0x23, 0x8F, 0x3B, 0xCF, 0x20, 0xD6, 0x45, + 0x25, 0x20, 0x0B, 0x46, 0xD4, 0x1E, 0x30, 0x39, 0x32, 0x21, 0x2D, 0x2A, + 0x0C, 0x28, 0x6D, 0x1E, 0xA9, 0x21, 0xEF, 0x15, 0xFF, 0x11, 0x7E, 0x10, + 0x62, 0x0F, 0x4D, 0x0C, 0x61, 0x0E, 0x4F, 0x06, 0x51, 0x07, 0xA4, 0x00, + 0x49, 0x04, 0xB2, 0xFE, 0xCD, 0x00, 0xF7, 0xFB, 0x9F, 0x02, 0xD3, 0xF1, + 0x14, 0x11, 0xEE, 0xE9, 0x19, 0x17, 0xBE, 0xE8, 0x07, 0x0C, 0x19, 0xE9, + 0x98, 0x05, 0x14, 0xEF, 0x4A, 0x0C, 0x89, 0xF4, 0x6D, 0x10, 0x17, 0xF3, + 0x7A, 0x10, 0x13, 0xF8, 0xAB, 0x0E, 0x18, 0xFE, 0xFA, 0xF7, 0x9C, 0xF9, + 0x1D, 0xDB, 0xCD, 0xFD, 0x7C, 0xD8, 0x3B, 0x08, 0xDA, 0xE2, 0x1E, 0x02, + 0x42, 0xE4, 0x05, 0xF9, 0x86, 0xE7, 0x4A, 0xFA, 0x5D, 0xF3, 0xDB, 0xF7, + 0xC0, 0xFA, 0x88, 0xE7, 0x46, 0xF4, 0xCA, 0xD8, 0x87, 0xE0, 0x01, 0xDC, + 0xFA, 0xDA, 0x97, 0xE0, 0x67, 0xF3, 0x9F, 0xE1, 0x43, 0x05, 0xFC, 0xE7, + 0x1F, 0x00, 0xB5, 0xEA, 0x81, 0xF6, 0x3D, 0xE9, 0x02, 0xE6, 0xE7, 0xED, + 0x08, 0xD4, 0x72, 0xF3, 0x5C, 0xD7, 0xB2, 0xEF, 0xE0, 0xE4, 0x62, 0xE0, + 0x8D, 0xE6, 0x75, 0xCF, 0xB3, 0xE6, 0x6B, 0xC9, 0xCF, 0xED, 0x54, 0xC3, + 0x68, 0xE8, 0x88, 0xBD, 0x59, 0xDF, 0x71, 0xC4, 0x09, 0xE3, 0xB2, 0xD1, + 0xF3, 0xE4, 0xFF, 0xDB, 0xAD, 0xE9, 0x58, 0xE3, 0x0C, 0xF8, 0xB1, 0xEE, + 0x14, 0x06, 0xC4, 0xF5, 0xDC, 0x0F, 0xEC, 0xF2, 0x7F, 0x10, 0x44, 0xF1, + 0xD2, 0xFC, 0xA1, 0xF7, 0xE1, 0xE3, 0x01, 0x04, 0x71, 0xDB, 0x6C, 0x0D, + 0x2C, 0xD8, 0x6F, 0x12, 0x3D, 0xD8, 0x77, 0x11, 0x36, 0xDC, 0x7C, 0x06, + 0xD4, 0xD3, 0x49, 0xF2, 0x20, 0xCB, 0xCE, 0xDF, 0x8D, 0xD3, 0xF9, 0xDB, + 0x1A, 0xDB, 0x6A, 0xE0, 0x03, 0xDC, 0x8D, 0xE1, 0x4B, 0xE8, 0x57, 0xE9, + 0x95, 0xF6, 0x3E, 0xF2, 0xAF, 0xF9, 0xE2, 0xEC, 0x15, 0xFD, 0x67, 0xF2, + 0xBE, 0xFD, 0xEC, 0x02, 0x62, 0xFC, 0xCD, 0x07, 0x15, 0x05, 0x45, 0x07, + 0xAC, 0x0B, 0xEA, 0x0B, 0x40, 0x06, 0xF6, 0x10, 0x6E, 0x04, 0x2C, 0x0F, + 0xB5, 0x0E, 0x70, 0x07, 0x25, 0x16, 0x3C, 0xFD, 0x7A, 0x16, 0x78, 0xFA, + 0x95, 0x0F, 0x50, 0xFF, 0x20, 0x02, 0xC5, 0x06, 0xAF, 0xFE, 0x83, 0x0D, + 0xF6, 0x02, 0x11, 0x0B, 0x13, 0x06, 0x8C, 0x06, 0x81, 0x07, 0x67, 0x0F, + 0x74, 0x02, 0x72, 0x1A, 0x28, 0xFF, 0x04, 0x19, 0xCF, 0x06, 0x21, 0x16, + 0xDF, 0x0C, 0x9B, 0x0E, 0x56, 0x11, 0x6A, 0xF8, 0x20, 0x1B, 0x91, 0xE4, + 0x21, 0x1E, 0x1E, 0xDF, 0xA4, 0x0F, 0x8A, 0xE0, 0xFD, 0xF9, 0xF4, 0xEB, + 0x95, 0xF2, 0x2D, 0x04, 0xDD, 0xFA, 0x28, 0x10, 0x8F, 0x08, 0x95, 0x0C, + 0x26, 0x13, 0xB6, 0x10, 0x4C, 0x0A, 0xC3, 0x17, 0x98, 0xF5, 0xD2, 0x13, + 0x92, 0xF2, 0x2A, 0x0F, 0x42, 0xFB, 0x4B, 0x0F, 0x41, 0xFD, 0x4F, 0x05, + 0x73, 0xF4, 0xC5, 0xFA, 0x4B, 0xEC, 0xCC, 0xFC, 0x21, 0xF5, 0x71, 0x00, + 0x36, 0x03, 0xF0, 0xFF, 0x93, 0x08, 0x5E, 0xFD, 0xA7, 0x09, 0x42, 0x01, + 0xF7, 0x0A, 0xA8, 0x0A, 0x0A, 0x0C, 0xDE, 0x0C, 0x72, 0x0F, 0x9B, 0x06, + 0x33, 0x14, 0xCD, 0x05, 0x7D, 0x11, 0xF1, 0x09, 0x41, 0x02, 0xEA, 0x05, + 0x11, 0xF5, 0x09, 0x07, 0xCB, 0xF2, 0x37, 0x10, 0xD0, 0xEE, 0x92, 0x08, + 0x90, 0xE9, 0x7A, 0xEF, 0x51, 0xF1, 0x32, 0xDC, 0x5E, 0x06, 0x10, 0xD2, + 0x1A, 0x0E, 0xDF, 0xC9, 0x52, 0x07, 0x3D, 0xDD, 0xFC, 0x04, 0xCF, 0xFF, + 0x79, 0x06, 0x0C, 0x0D, 0x1C, 0x0D, 0xB3, 0x0F, 0x8F, 0x1C, 0x16, 0x15, + 0xFF, 0x22, 0x38, 0x16, 0xA1, 0x11, 0x58, 0x13, 0xAE, 0x02, 0x35, 0x15, + 0x6F, 0xFC, 0xB8, 0x0C, 0x84, 0xF4, 0xDB, 0x05, 0x7A, 0xF7, 0x68, 0x0A, + 0xCF, 0x03, 0xCE, 0x05, 0xFA, 0x0C, 0x3A, 0xF8, 0x62, 0x0E, 0x53, 0xE9, + 0x1E, 0x0C, 0xF8, 0xE3, 0x8E, 0x02, 0xE6, 0xE8, 0x00, 0xF3, 0x89, 0xF3, + 0xE5, 0xEA, 0xC1, 0x02, 0xA2, 0xEE, 0x23, 0x11, 0x5E, 0x01, 0x1A, 0x1E, + 0x07, 0x10, 0x21, 0x20, 0x25, 0x15, 0x6B, 0x13, 0x2D, 0x1E, 0x1B, 0x0D, + 0x40, 0x18, 0x5E, 0x0A, 0x93, 0x03, 0x61, 0x02, 0x0B, 0xFB, 0x7A, 0x06, + 0xB5, 0xFF, 0xD7, 0x09, 0x11, 0xFA, 0xC5, 0xFE, 0x04, 0xFA, 0x75, 0x05, + 0xEF, 0x02, 0xB5, 0x0D, 0xEA, 0xFA, 0xD6, 0x01, 0x6D, 0xF2, 0x2C, 0xFC, + 0x02, 0xE9, 0x93, 0xFC, 0xBE, 0xDB, 0xDD, 0xF5, 0x85, 0xE8, 0x16, 0xF1, + 0xC3, 0xFC, 0x4E, 0xEF, 0x99, 0xFB, 0x18, 0xEA, 0xD9, 0xF2, 0x64, 0xF1, + 0x59, 0xF6, 0x70, 0xF9, 0x30, 0x00, 0x53, 0xE7, 0xC1, 0xFB, 0x4E, 0xD1, + 0x80, 0xED, 0x11, 0xCE, 0x90, 0xD8, 0x23, 0xD2, 0x58, 0xD2, 0xFC, 0xDB, + 0xEC, 0xDE, 0x0A, 0xE4, 0x37, 0xEA, 0x67, 0xE3, 0xD0, 0xF1, 0x7C, 0xE3, + 0x17, 0xF3, 0x44, 0xE5, 0xB2, 0xF1, 0xEA, 0xE0, 0x94, 0xE7, 0x9D, 0xD8, + 0x49, 0xDA, 0xCA, 0xD3, 0xE3, 0xD4, 0x1E, 0xD5, 0xE7, 0xD0, 0xDF, 0xE0, + 0xD1, 0xD6, 0xCE, 0xF0, 0xDA, 0xE3, 0x19, 0xF4, 0x2C, 0xE3, 0x18, 0xEE, + 0x93, 0xD7, 0x1A, 0xF3, 0xF6, 0xD4, 0xB9, 0xF8, 0x96, 0xDF, 0x72, 0xF4, + 0xA7, 0xE4, 0x05, 0xEF, 0xCB, 0xE7, 0x32, 0xF4, 0xBE, 0xEF, 0xF9, 0x0B, + 0x12, 0xF3, 0x26, 0x1B, 0x50, 0x02, 0xAF, 0x18, 0x26, 0x10, 0x02, 0x12, + 0x19, 0x0E, 0xCA, 0x06, 0x84, 0x07, 0x52, 0xF9, 0x49, 0xF6, 0x49, 0xEF, + 0xEE, 0xEE, 0x55, 0xEC, 0x3C, 0xFA, 0x45, 0xE4, 0x49, 0x03, 0x7B, 0xE2, + 0xA1, 0x03, 0xF8, 0xF2, 0x9B, 0xFF, 0xAF, 0x03, 0x29, 0xFF, 0x57, 0x0C, + 0x92, 0x02, 0x77, 0x0A, 0xD8, 0x13, 0xF7, 0x0E, 0x40, 0x28, 0x40, 0x15, + 0xF3, 0x1E, 0x46, 0x06, 0xD9, 0x1E, 0x25, 0xFF, 0x81, 0x32, 0xB9, 0x09, + 0xAD, 0x2E, 0x4B, 0x0D, 0xA4, 0x27, 0xC5, 0x0E, 0x6D, 0x2B, 0xEB, 0x12, + 0x08, 0x25, 0x08, 0x18, 0xD5, 0x10, 0x69, 0x1A, 0xC7, 0x0A, 0xF7, 0x1F, + 0x4D, 0x0F, 0x8C, 0x2A, 0xC8, 0x03, 0x03, 0x1F, 0x51, 0x07, 0x99, 0x0C, + 0x77, 0x16, 0x39, 0x10, 0x06, 0x12, 0x33, 0x1C, 0xF9, 0x10, 0xB9, 0x28, + 0x01, 0x1C, 0x21, 0x2F, 0x38, 0x2C, 0x76, 0x2C, 0x3D, 0x30, 0x16, 0x27, + 0x8D, 0x22, 0xBE, 0x1C, 0x40, 0x1C, 0xA0, 0x16, 0xFE, 0x17, 0x1F, 0x18, + 0x19, 0x14, 0x6D, 0x1B, 0x2C, 0x23, 0xF1, 0x22, 0xF1, 0x36, 0x1D, 0x2D, + 0x71, 0x31, 0xD8, 0x29, 0x3D, 0x22, 0x0C, 0x23, 0x13, 0x1C, 0x43, 0x29, + 0x6A, 0x17, 0x37, 0x29, 0xEB, 0x12, 0x41, 0x1F, 0x70, 0x24, 0xE6, 0x1F, + 0xB9, 0x33, 0xB9, 0x24, 0x6F, 0x1B, 0x7A, 0x22, 0x6E, 0x0A, 0x3D, 0x26, + 0x55, 0x0F, 0x81, 0x2C, 0xC3, 0x08, 0x2E, 0x1E, 0x52, 0x07, 0x83, 0x12, + 0x68, 0x13, 0xD1, 0x1C, 0x03, 0x1B, 0x02, 0x18, 0xD7, 0x1C, 0x24, 0x02, + 0xF2, 0x14, 0xFD, 0xF8, 0x89, 0x0E, 0x5F, 0xFE, 0x31, 0x04, 0xF6, 0xF9, + 0x7C, 0xFD, 0x83, 0xFD, 0xC9, 0x02, 0xAF, 0x0A, 0xE7, 0xFD, 0x5B, 0x08, + 0xE8, 0xF0, 0x8A, 0x0A, 0xD4, 0xE8, 0x7E, 0x07, 0x7C, 0xE8, 0xEF, 0xEC, + 0x64, 0xED, 0x3D, 0xD7, 0xAC, 0xF6, 0x2D, 0xDB, 0xB9, 0xFD, 0xE1, 0xE9, + 0x8F, 0x05, 0xC8, 0xF5, 0x22, 0x0F, 0x3E, 0xF8, 0xC7, 0x06, 0xFE, 0xEB, + 0x93, 0xEE, 0xC4, 0xE5, 0xE3, 0xE9, 0x5F, 0xF5, 0x28, 0xF2, 0x88, 0xFD, + 0x04, 0xF4, 0x92, 0xFB, 0xA7, 0x02, 0x11, 0x04, 0x9F, 0x19, 0xF0, 0x07, + 0x39, 0x1D, 0xEF, 0x04, 0x62, 0x0F, 0xDC, 0x04, 0x73, 0x06, 0xD3, 0x05, + 0x53, 0xF5, 0xAE, 0xFE, 0x41, 0xE1, 0x5E, 0xF9, 0x79, 0xEA, 0x6D, 0xFB, + 0x77, 0xF8, 0xCC, 0xF1, 0x57, 0xF2, 0x42, 0xEA, 0x94, 0xEA, 0x4D, 0xF4, + 0x86, 0xE4, 0x16, 0xFB, 0x1A, 0xE2, 0x36, 0xF5, 0x0C, 0xE4, 0xC8, 0xE7, + 0x37, 0xED, 0x11, 0xDC, 0x14, 0xFC, 0xA8, 0xD5, 0x30, 0xFF, 0x37, 0xD7, + 0x16, 0xF9, 0x65, 0xE2, 0x85, 0xEA, 0xDE, 0xE7, 0xF2, 0xE5, 0xBD, 0xED, + 0x71, 0xEF, 0x68, 0xF7, 0x31, 0xFB, 0x75, 0x01, 0x1B, 0x06, 0x39, 0x05, + 0x6F, 0x0B, 0x7C, 0xFC, 0x5E, 0x11, 0x3B, 0xF8, 0x9A, 0x0A, 0xD0, 0xF9, + 0xA3, 0xF4, 0x69, 0xFE, 0x2B, 0xDD, 0x9B, 0x00, 0xA2, 0xD4, 0xDB, 0x04, + 0xE5, 0xDA, 0x2B, 0x11, 0xB9, 0xDB, 0x30, 0x13, 0xCC, 0xE6, 0xC0, 0x0C, + 0x18, 0xFD, 0xEA, 0x02, 0x19, 0x02, 0x6B, 0xF6, 0x57, 0xF5, 0x37, 0xEF, + 0x15, 0xE5, 0xA0, 0xF1, 0xB1, 0xE9, 0xA8, 0xF8, 0xC7, 0xFE, 0xCF, 0xF6, + 0x13, 0x0B, 0x98, 0xF1, 0xB2, 0x0C, 0x66, 0xF5, 0x66, 0xFC, 0xBA, 0xFA, + 0x69, 0xF1, 0x46, 0xF8, 0x9A, 0xF9, 0x9F, 0xF3, 0xE5, 0xFD, 0xC3, 0xF1, + 0xCB, 0xFD, 0xF5, 0xF7, 0x8F, 0xFF, 0xB2, 0x09, 0x31, 0x05, 0x34, 0x1A, + 0x2A, 0x07, 0x9A, 0x1A, 0x7E, 0x0B, 0x23, 0x15, 0x42, 0x10, 0xB3, 0x0C, + 0x6F, 0x0F, 0x94, 0xFC, 0xC9, 0x0A, 0x1B, 0xEE, 0xDB, 0x03, 0x34, 0xEB, + 0x95, 0xFD, 0x2C, 0xF4, 0xBD, 0xF9, 0xF0, 0xFC, 0x48, 0xF8, 0xBB, 0x02, + 0xF6, 0xF8, 0x15, 0x0A, 0x08, 0xF8, 0xF7, 0x0B, 0x38, 0xF0, 0xDF, 0x06, + 0xF6, 0xF5, 0x96, 0x00, 0xE7, 0x00, 0x27, 0xEC, 0x2F, 0x05, 0xA2, 0xD5, + 0x1E, 0x03, 0x07, 0xDA, 0x8F, 0xF6, 0x04, 0xF0, 0x56, 0xE8, 0x77, 0xF4, + 0x7F, 0xE4, 0x71, 0xED, 0xA4, 0xE8, 0xE1, 0xEA, 0x94, 0xED, 0x24, 0xE3, + 0xBF, 0xF2, 0xC6, 0xDB, 0xB8, 0xF4, 0x82, 0xD8, 0x9B, 0xE8, 0x4E, 0xD5, + 0x3C, 0xDB, 0xA1, 0xD5, 0xF0, 0xE3, 0xC3, 0xD8, 0x37, 0xF9, 0x04, 0xE2, + 0xF9, 0xFF, 0x09, 0xEC, 0x69, 0xF3, 0x18, 0xF3, 0x70, 0xEC, 0xC4, 0x07, + 0x60, 0xE1, 0x86, 0x16, 0xBE, 0xE1, 0xA5, 0x0C, 0x6B, 0xF8, 0x3B, 0xFB, + 0x9D, 0xFE, 0xA3, 0xF5, 0x23, 0xF6, 0xEF, 0xF4, 0xCA, 0xF4, 0xDA, 0xF1, + 0x0C, 0xF2, 0xE0, 0xF0, 0x17, 0xE4, 0x2A, 0xF2, 0xA0, 0xD9, 0x19, 0xF3, + 0x2C, 0xDB, 0x5B, 0xF2, 0x34, 0xE2, 0xC8, 0xF5, 0x92, 0xED, 0xC7, 0xEF, + 0xA0, 0xFE, 0x3E, 0xE7, 0x0D, 0x08, 0xAB, 0xEA, 0x62, 0x05, 0xFA, 0xEF, + 0x70, 0x00, 0x11, 0xEE, 0x75, 0x02, 0xAB, 0xE9, 0x00, 0x02, 0x04, 0xEB, + 0x68, 0xFB, 0x1F, 0xEF, 0xC0, 0xF3, 0x90, 0xF3, 0x17, 0xFA, 0xD0, 0xFA, + 0x48, 0x07, 0xD0, 0x00, 0xFD, 0x12, 0x62, 0x09, 0x0C, 0x19, 0x02, 0x14, + 0xB6, 0x09, 0x2A, 0x16, 0x1E, 0xFC, 0xBD, 0x0D, 0xE5, 0xF8, 0xFE, 0x01, + 0x66, 0xFB, 0xBE, 0x03, 0x68, 0xFB, 0xDF, 0x09, 0xE1, 0xF4, 0x81, 0x05, + 0x0D, 0xF8, 0x08, 0xFD, 0xCE, 0x06, 0xBF, 0xF7, 0xB7, 0x0C, 0x8F, 0xF9, + 0xDB, 0x01, 0x22, 0x03, 0x2A, 0xFD, 0x09, 0x10, 0x45, 0x01, 0xCA, 0x1B, + 0x68, 0xFD, 0x0F, 0x24, 0x68, 0xF5, 0x3E, 0x28, 0x7A, 0xF8, 0x01, 0x29, + 0xE3, 0x07, 0xF5, 0x1C, 0x81, 0x18, 0xDE, 0x0E, 0x90, 0x21, 0xFF, 0x13, + 0xAD, 0x1A, 0x93, 0x17, 0xB8, 0x10, 0x16, 0x11, 0x69, 0x18, 0x0B, 0x11, + 0x23, 0x20, 0xD1, 0x12, 0x26, 0x1B, 0xA1, 0x0B, 0x6A, 0x18, 0x50, 0x0B, + 0x4B, 0x15, 0x9A, 0x16, 0xDA, 0x0F, 0xB9, 0x13, 0x9B, 0x0C, 0x00, 0x08, + 0x9E, 0x06, 0x04, 0x0C, 0xB8, 0x04, 0x9C, 0x18, 0xF4, 0x05, 0x34, 0x13, + 0x82, 0x0D, 0xBE, 0x07, 0x1C, 0x19, 0xB7, 0x02, 0x37, 0x1D, 0x09, 0xFA, + 0x8D, 0x1B, 0x33, 0xF8, 0x2D, 0x13, 0x21, 0xF9, 0x75, 0x06, 0x0B, 0xF2, + 0x00, 0x01, 0x48, 0xF4, 0x9B, 0x02, 0x17, 0x00, 0x1E, 0x09, 0x7A, 0x09, + 0xFA, 0x0F, 0x86, 0x08, 0x57, 0x0E, 0xD2, 0xFD, 0x5A, 0x0E, 0xE4, 0xFA, + 0x7E, 0x0A, 0x2D, 0x06, 0xCB, 0x00, 0xE5, 0x10, 0x94, 0xFA, 0xBE, 0x0A, + 0x5D, 0xF6, 0x39, 0x03, 0x2C, 0xF7, 0x33, 0x0B, 0x79, 0x04, 0xF9, 0x14, + 0x8F, 0x11, 0x7E, 0x12, 0x36, 0x16, 0x90, 0x0A, 0xDB, 0x1F, 0xFB, 0x0C, + 0x90, 0x22, 0xBB, 0x15, 0x9E, 0x1F, 0x47, 0x1D, 0x2A, 0x15, 0x56, 0x21, + 0xC3, 0x09, 0x69, 0x27, 0x99, 0x0A, 0xDD, 0x2E, 0x74, 0x0C, 0x04, 0x30, + 0xA1, 0x0C, 0xE9, 0x2C, 0x6E, 0x04, 0x8E, 0x24, 0xE9, 0xFB, 0xDD, 0x18, + 0xF8, 0xF4, 0x46, 0x0E, 0x4E, 0xFB, 0xAC, 0x02, 0xD6, 0x1A, 0xD7, 0xF6, + 0x62, 0x2B, 0xA4, 0xF1, 0xDF, 0x24, 0x62, 0xFE, 0x1F, 0x1B, 0x20, 0x14, + 0x52, 0x0F, 0x58, 0x1A, 0x26, 0x09, 0xDA, 0x1A, 0x26, 0x13, 0xEC, 0x1C, + 0x62, 0x21, 0x81, 0x18, 0xB8, 0x1B, 0x94, 0x11, 0xFA, 0x13, 0x8D, 0x0B, + 0x08, 0x19, 0xE8, 0x07, 0x14, 0x18, 0xA1, 0x05, 0xAC, 0x15, 0xB2, 0x04, + 0x93, 0x14, 0x7A, 0x0A, 0xC9, 0x14, 0x38, 0x09, 0x8B, 0x1E, 0xD1, 0xFC, + 0x5D, 0x21, 0xA7, 0xFB, 0x97, 0x12, 0x94, 0x00, 0x6E, 0xFC, 0xF6, 0xF8, + 0x5F, 0xF3, 0x84, 0xF5, 0xB3, 0xF5, 0x16, 0x01, 0xC2, 0xEE, 0xA2, 0x04, + 0xF5, 0xED, 0x8F, 0x04, 0xC9, 0xF7, 0xB2, 0x07, 0x7C, 0xFD, 0xD0, 0xFC, + 0x5A, 0xFC, 0x10, 0xED, 0x2F, 0xED, 0x78, 0xE7, 0x5F, 0xE5, 0x72, 0xEF, + 0x27, 0xF2, 0x5A, 0xF4, 0xDE, 0xFA, 0x2D, 0xEF, 0x47, 0x04, 0xF5, 0xF4, + 0x17, 0x09, 0x52, 0xFC, 0xB8, 0x00, 0x5A, 0xF9, 0x78, 0xF7, 0x4E, 0xF2, + 0xDB, 0xEF, 0x57, 0xF1, 0x3A, 0xF2, 0xAD, 0x00, 0x90, 0xEE, 0x9C, 0x0D, + 0xCB, 0xED, 0x04, 0x15, 0xD3, 0xEF, 0x81, 0x11, 0x88, 0xE9, 0x23, 0xFD, + 0x47, 0xE6, 0xFA, 0xF3, 0x72, 0xDD, 0xD0, 0xF5, 0xF9, 0xDD, 0x8D, 0xF4, + 0x4D, 0xEC, 0x28, 0xEC, 0x98, 0xF9, 0x6A, 0xE2, 0x18, 0xF9, 0xFD, 0xE2, + 0xD8, 0xE8, 0x1D, 0xE8, 0xDB, 0xD5, 0x31, 0xEA, 0xF6, 0xCC, 0x6A, 0xE7, + 0x2C, 0xDA, 0x52, 0xE5, 0x0A, 0xEF, 0xFB, 0xEB, 0xDB, 0xE8, 0x31, 0xF1, + 0x09, 0xD2, 0xBC, 0xE8, 0x31, 0xD4, 0xB4, 0xD4, 0x18, 0xDB, 0xAD, 0xBE, + 0x18, 0xDC, 0xD1, 0xBB, 0x94, 0xE0, 0x79, 0xC8, 0xE6, 0xE5, 0x64, 0xD2, + 0xE3, 0xE4, 0xD2, 0xCC, 0x0A, 0xE1, 0x13, 0xC3, 0x9E, 0xEB, 0x62, 0xC7, + 0xB6, 0xEC, 0x2C, 0xCA, 0xA7, 0xDC, 0x88, 0xC8, 0xEF, 0xDB, 0x56, 0xD7, + 0x6D, 0xE8, 0x2B, 0xF3, 0x22, 0xF5, 0x5D, 0x0C, 0x82, 0x02, 0xA9, 0x1C, + 0x9D, 0x0C, 0x5D, 0x1B, 0x69, 0x0C, 0x51, 0x10, 0xBD, 0xF9, 0x35, 0x07, + 0xCF, 0xF0, 0x18, 0x05, 0x48, 0xEF, 0x9A, 0x02, 0xBC, 0xEB, 0x6D, 0xFE, + 0x51, 0xEE, 0x54, 0xFB, 0x35, 0xF1, 0x17, 0xFD, 0xA5, 0xF4, 0x79, 0x03, + 0xA6, 0xF0, 0x55, 0x06, 0x37, 0xEE, 0x04, 0x0E, 0x22, 0xF3, 0x74, 0x10, + 0xD9, 0xFF, 0xBF, 0x04, 0x9F, 0x17, 0x65, 0xFC, 0xFC, 0x22, 0x4C, 0xFB, + 0xFF, 0x1B, 0x12, 0xFD, 0x74, 0x18, 0xC3, 0xFD, 0x16, 0x24, 0x27, 0xFA, + 0x39, 0x2F, 0xD0, 0xFC, 0x03, 0x25, 0x8A, 0xFE, 0x4B, 0x19, 0x9F, 0xFD, + 0x08, 0x18, 0xA2, 0x0A, 0x84, 0x14, 0xB2, 0x0F, 0xB1, 0x19, 0xCC, 0x05, + 0xC1, 0x23, 0x6E, 0x08, 0xBE, 0x1B, 0x94, 0x12, 0xF1, 0x07, 0x39, 0x17, + 0x21, 0x01, 0xA8, 0x23, 0xEF, 0x09, 0xF2, 0x2F, 0x21, 0x09, 0x21, 0x2F, + 0x04, 0xF9, 0x33, 0x2C, 0xC0, 0xF7, 0xAB, 0x29, 0x7E, 0x06, 0x13, 0x21, + 0x5C, 0x12, 0xFE, 0x11, 0xAA, 0x11, 0x42, 0x08, 0xE4, 0x04, 0xD9, 0x05, + 0xD6, 0xFA, 0x33, 0x08, 0x28, 0xF7, 0x45, 0x13, 0x68, 0x03, 0x65, 0x1C, + 0x9B, 0x0F, 0x47, 0x19, 0x1D, 0x16, 0xE4, 0x13, 0x9C, 0x24, 0x34, 0x13, + 0xB9, 0x28, 0xAD, 0x11, 0x17, 0x22, 0xB2, 0x12, 0x78, 0x18, 0x66, 0x19, + 0x01, 0x10, 0x56, 0x21, 0x83, 0x0E, 0x7A, 0x1A, 0x3E, 0x19, 0xA5, 0x05, + 0xA1, 0x20, 0xEF, 0xF9, 0x2A, 0x12, 0x19, 0xFB, 0xBD, 0xF8, 0x71, 0xF6, + 0x31, 0xEF, 0xB2, 0xF2, 0xFC, 0xFD, 0xCE, 0xFD, 0xAE, 0x0B, 0xCF, 0x06, + 0x18, 0x10, 0x27, 0x0A, 0xBF, 0x0F, 0x0F, 0x0C, 0x53, 0x08, 0x76, 0x07, + 0xC6, 0x03, 0xC2, 0xFB, 0xF0, 0x02, 0xC9, 0xF2, 0x45, 0xFA, 0x23, 0xF3, + 0x8F, 0xEF, 0x34, 0xF4, 0x8E, 0xEB, 0xF0, 0xF1, 0x73, 0xEB, 0x2D, 0xEE, + 0x3B, 0xEA, 0x3F, 0xEA, 0x56, 0xED, 0x35, 0xE9, 0x78, 0xF0, 0x75, 0xE4, + 0x44, 0xF1, 0xB0, 0xDD, 0x7A, 0xE6, 0x75, 0xDB, 0xD4, 0xD0, 0xE2, 0xE1, + 0xDB, 0xD2, 0x78, 0xF1, 0x64, 0xE5, 0x84, 0xF5, 0x9B, 0xF1, 0xA2, 0xED, + 0xD3, 0xF8, 0xB2, 0xE7, 0xFF, 0xF9, 0x22, 0xE3, 0x4B, 0xF6, 0xF9, 0xE9, + 0x6A, 0xED, 0x19, 0xF2, 0xD2, 0xE8, 0x13, 0xEE, 0x8E, 0xF3, 0x52, 0xE9, + 0x97, 0xF3, 0x22, 0xEA, 0x3B, 0xE7, 0xD8, 0xEF, 0x48, 0xDE, 0x6B, 0xED, + 0x05, 0xD3, 0x73, 0xE7, 0xDF, 0xD0, 0x63, 0xEF, 0xA8, 0xD5, 0xFD, 0xF0, + 0xBC, 0xDF, 0xD8, 0xEA, 0x22, 0xEB, 0x32, 0xEE, 0xEE, 0xE9, 0x0C, 0xEF, + 0x73, 0xE7, 0x60, 0xEE, 0xC9, 0xE8, 0x4B, 0xF3, 0xE8, 0xEA, 0x38, 0xFA, + 0x1D, 0xEE, 0xC2, 0xFE, 0x46, 0xF1, 0xC2, 0xFC, 0xCC, 0xF5, 0x26, 0xF4, + 0x5D, 0xF2, 0xAF, 0xE7, 0x32, 0xF2, 0x72, 0xDC, 0x0F, 0xFD, 0x6A, 0xD6, + 0x92, 0xFD, 0x09, 0xDD, 0x89, 0x01, 0xF2, 0xEE, 0x7C, 0x0E, 0x30, 0xFC, + 0x2A, 0x0B, 0xAF, 0x06, 0xA9, 0xFD, 0x17, 0x14, 0xDF, 0xFD, 0x96, 0x14, + 0x5A, 0x09, 0xAE, 0x0B, 0x17, 0x0A, 0x21, 0x06, 0x42, 0xFF, 0x90, 0x04, + 0xB2, 0xFD, 0xFA, 0x0B, 0x22, 0x06, 0xEA, 0x0D, 0xBE, 0x12, 0xE8, 0x01, + 0x1B, 0x1E, 0xCA, 0xF3, 0x4F, 0x1F, 0x8E, 0xF0, 0xEA, 0x1A, 0x13, 0xFB, + 0xAF, 0x0E, 0x36, 0x05, 0x06, 0x03, 0x15, 0x0D, 0x1B, 0x0D, 0xC7, 0x17, + 0x72, 0x1C, 0x2D, 0x1C, 0x29, 0x20, 0x5E, 0x22, 0xB2, 0x27, 0xB5, 0x27, + 0xAC, 0x2A, 0x2B, 0x1E, 0x8D, 0x22, 0x49, 0x1C, 0x48, 0x1B, 0x9C, 0x29, + 0x7D, 0x12, 0xDF, 0x31, 0xE6, 0x0D, 0xB4, 0x2F, 0xB8, 0x0E, 0xCE, 0x23, + 0x74, 0x12, 0xFE, 0x14, 0xBE, 0x18, 0xFD, 0x11, 0x86, 0x16, 0xE9, 0x19, + 0x0C, 0x0B, 0x48, 0x1E, 0xAD, 0x02, 0xEA, 0x1B, 0xB9, 0x02, 0x4D, 0x16, + 0x64, 0x0C, 0x88, 0x12, 0xDF, 0x11, 0x6A, 0x0D, 0xD9, 0x15, 0xD3, 0x03, + 0xD2, 0x21, 0xEC, 0xF9, 0x64, 0x26, 0xDF, 0xFC, 0x1D, 0x10, 0x40, 0x05, + 0xE8, 0xF7, 0x83, 0x06, 0xF1, 0xF7, 0xF9, 0x07, 0x97, 0xFE, 0xC3, 0xFE, + 0xA6, 0x02, 0x97, 0xEE, 0xDC, 0xFC, 0x23, 0xEB, 0x0F, 0xF2, 0x9A, 0xF1, + 0xC4, 0xF8, 0x75, 0xFF, 0xC4, 0x07, 0x56, 0x0D, 0x78, 0x09, 0x94, 0x10, + 0x01, 0x06, 0x17, 0x0D, 0x95, 0x09, 0x7B, 0x0E, 0x02, 0x10, 0x57, 0x12, + 0xE1, 0x11, 0x73, 0x09, 0xC3, 0x0C, 0xAC, 0xFB, 0xAE, 0x02, 0x6F, 0xFA, + 0x45, 0xFA, 0x1F, 0xFF, 0xC3, 0xF8, 0x86, 0x03, 0x22, 0xF7, 0x6E, 0x13, + 0x36, 0xF6, 0x9D, 0x24, 0x41, 0x00, 0x9B, 0x2A, 0x2B, 0x12, 0x2C, 0x2F, + 0xF6, 0x18, 0x63, 0x30, 0x68, 0x0A, 0x7A, 0x29, 0xA5, 0xF7, 0x67, 0x23, + 0xF2, 0xEF, 0x06, 0x20, 0x09, 0xEF, 0xC6, 0x13, 0x6B, 0x03, 0xC7, 0x0D, + 0xA0, 0x1A, 0x31, 0x11, 0x8B, 0x18, 0x8C, 0x0F, 0x32, 0x12, 0x5F, 0x08, + 0xF9, 0x0F, 0x2C, 0xFA, 0x01, 0x10, 0xE8, 0xEE, 0x1D, 0x12, 0x25, 0xED, + 0xC3, 0x1D, 0x8D, 0xF1, 0xE6, 0x2A, 0x7D, 0xF5, 0xA3, 0x2B, 0xF3, 0xFD, + 0xE6, 0x1F, 0x65, 0x0F, 0x36, 0x17, 0xF0, 0x1B, 0x92, 0x1B, 0x03, 0x19, + 0x79, 0x1C, 0x9E, 0x0E, 0x17, 0x18, 0xEA, 0x03, 0xE3, 0x17, 0x8C, 0xFF, + 0x50, 0x1B, 0x96, 0x05, 0x86, 0x1F, 0xAF, 0x06, 0x70, 0x1F, 0x2F, 0xFD, + 0x42, 0x14, 0x54, 0xF8, 0x8D, 0x07, 0xF6, 0xFA, 0x3F, 0x05, 0x8F, 0x02, + 0xC3, 0xFF, 0x33, 0x08, 0xE8, 0xFD, 0xCF, 0x05, 0xE7, 0x0A, 0xA4, 0x05, + 0x22, 0x0F, 0xA0, 0x00, 0xC9, 0x09, 0x0D, 0xFD, 0x5D, 0x00, 0x18, 0x00, + 0x3C, 0xF0, 0x54, 0x02, 0x02, 0xE4, 0x38, 0x08, 0xC0, 0xF0, 0xA7, 0x0D, + 0x0E, 0x06, 0xD3, 0x04, 0xBC, 0x0A, 0xB9, 0xF8, 0xAB, 0x02, 0x36, 0xF3, + 0x29, 0xF6, 0x2F, 0xF0, 0x17, 0xEE, 0x61, 0xF1, 0x06, 0xED, 0x0D, 0xF2, + 0x63, 0xF6, 0x75, 0xF9, 0x0A, 0xFA, 0x63, 0x00, 0x93, 0xF2, 0x68, 0x05, + 0x2D, 0xEB, 0xB6, 0x09, 0x6C, 0xE6, 0x30, 0x01, 0x7C, 0xE6, 0x62, 0xF2, + 0x51, 0xE9, 0x70, 0xE8, 0x21, 0xF1, 0xDF, 0xEA, 0x3D, 0xF2, 0xB4, 0xE8, + 0xC4, 0xE6, 0x0E, 0xE0, 0x8B, 0xDA, 0x8F, 0xE4, 0xFD, 0xD0, 0x28, 0xEA, + 0x53, 0xCB, 0x74, 0xE7, 0xA5, 0xC5, 0x02, 0xE6, 0x0D, 0xC4, 0x3F, 0xED, + 0xB4, 0xCB, 0xA5, 0xF8, 0x6E, 0xCE, 0x7B, 0xF9, 0x2E, 0xCB, 0x28, 0xED, + 0x62, 0xCE, 0x82, 0xDC, 0x8B, 0xCF, 0x08, 0xD0, 0x43, 0xC8, 0x07, 0xCE, + 0xF7, 0xC5, 0x50, 0xD1, 0x32, 0xCB, 0xC3, 0xC7, 0x4D, 0xE0, 0x17, 0xBB, + 0x2C, 0x05, 0x5E, 0xC0, 0xE8, 0x14, 0x3D, 0xC6, 0xAB, 0x01, 0x3E, 0xC4, + 0xF5, 0xE8, 0x55, 0xC7, 0x39, 0xDE, 0x99, 0xD6, 0xA6, 0xDE, 0x8C, 0xEA, + 0x6E, 0xEB, 0x83, 0xFA, 0x2B, 0xF7, 0x46, 0x07, 0x25, 0xF4, 0xEF, 0x0D, + 0xFE, 0xEC, 0x85, 0x0C, 0xE0, 0xE5, 0x0D, 0x04, 0xCB, 0xE1, 0x9D, 0xFE, + 0x5A, 0xEC, 0xED, 0x00, 0x50, 0xFB, 0x64, 0xFD, 0xC3, 0x06, 0x07, 0xF7, + 0x41, 0x09, 0x84, 0xFB, 0x2E, 0x01, 0xBC, 0x01, 0x07, 0xF8, 0x80, 0xF9, + 0x9F, 0xF2, 0xAE, 0xEF, 0x32, 0xEF, 0xFA, 0xF0, 0x36, 0xE8, 0x06, 0xF9, + 0xBF, 0xE4, 0x2C, 0x07, 0xAA, 0xEF, 0xEF, 0x0D, 0xA6, 0x04, 0x26, 0x00, + 0xB6, 0x14, 0x09, 0xF1, 0x15, 0x1A, 0xD4, 0xEF, 0x6F, 0x16, 0xC0, 0xF2, + 0xF1, 0x08, 0x56, 0xF1, 0x8C, 0x03, 0xD6, 0xF2, 0xC8, 0x0C, 0x3D, 0xF9, + 0x98, 0x14, 0x21, 0xFB, 0xDF, 0x20, 0xA6, 0x01, 0x88, 0x27, 0x28, 0x0B, + 0xE2, 0x16, 0x52, 0x08, 0x35, 0x06, 0xAA, 0x08, 0x14, 0xFF, 0xC4, 0x11, + 0xB5, 0xF7, 0x15, 0x10, 0xD5, 0xFB, 0x7C, 0x06, 0x83, 0x0F, 0xEF, 0x05, + 0x17, 0x19, 0xC2, 0x08, 0x40, 0x14, 0xD6, 0x02, 0xFC, 0x0F, 0x46, 0xF8, + 0xD3, 0x05, 0x24, 0xF7, 0x46, 0xF6, 0x25, 0x02, 0x4E, 0xF3, 0x02, 0x09, + 0x4F, 0xFD, 0x97, 0x07, 0x7D, 0x02, 0x1D, 0x04, 0xB5, 0x0A, 0x38, 0x03, + 0x1F, 0x11, 0xED, 0x02, 0x4C, 0x02, 0x08, 0x09, 0x0A, 0xEE, 0xBE, 0x17, + 0xBD, 0xEE, 0xC9, 0x23, 0xAF, 0xFE, 0x93, 0x21, 0xA7, 0x0F, 0x9B, 0x10, + 0xFC, 0x23, 0x00, 0x07, 0xFD, 0x2B, 0x48, 0x02, 0xEC, 0x19, 0x05, 0xF8, + 0x38, 0xFF, 0x3C, 0xF7, 0xB3, 0xF4, 0x9A, 0x01, 0x06, 0xFB, 0x5D, 0x04, + 0x00, 0x08, 0xEB, 0x00, 0x88, 0x07, 0x68, 0xFE, 0xDA, 0xF9, 0x62, 0xFC, + 0xAF, 0xF1, 0x73, 0xF7, 0x34, 0xEA, 0x86, 0xF0, 0x2E, 0xE1, 0x0B, 0xEF, + 0xFA, 0xDF, 0x56, 0xF1, 0x76, 0xE6, 0xA6, 0xF7, 0x70, 0xF1, 0xAA, 0xFE, + 0x68, 0xFE, 0x98, 0xFA, 0x7A, 0xFF, 0x43, 0xEC, 0x2E, 0xF4, 0xB2, 0xDE, + 0x64, 0xEA, 0x4A, 0xD9, 0x45, 0xE3, 0x3F, 0xDA, 0xBF, 0xDD, 0x9C, 0xD8, + 0xF0, 0xD9, 0xF3, 0xD6, 0xF3, 0xD8, 0x62, 0xDE, 0x3C, 0xE1, 0xC2, 0xED, + 0x80, 0xE5, 0x5C, 0xF2, 0xD5, 0xDF, 0xC8, 0xE9, 0x04, 0xDF, 0x9D, 0xE4, + 0xE8, 0xE4, 0x17, 0xE9, 0xC8, 0xE8, 0x5B, 0xED, 0xEC, 0xF0, 0xB4, 0xEF, + 0xC2, 0x01, 0x66, 0xF6, 0x6E, 0x0F, 0xE1, 0x05, 0x0A, 0x08, 0x6E, 0x1A, + 0xD1, 0xEE, 0xCF, 0x23, 0x8D, 0xE9, 0x5A, 0x22, 0xCE, 0xFA, 0x48, 0x18, + 0xA9, 0x05, 0xCD, 0x04, 0xC2, 0x0F, 0xEB, 0xFB, 0x9B, 0x18, 0xB8, 0x02, + 0x29, 0x0E, 0x9A, 0x05, 0x64, 0x01, 0x25, 0x07, 0xA1, 0x06, 0x02, 0x13, + 0x7F, 0x13, 0x04, 0x1F, 0x89, 0x1B, 0xEB, 0x18, 0xDF, 0x23, 0x54, 0x0A, + 0x85, 0x25, 0x73, 0x05, 0x11, 0x16, 0xCC, 0x03, 0x4B, 0x0B, 0x1E, 0x05, + 0x49, 0x13, 0xCE, 0x0E, 0x75, 0x1F, 0xC1, 0x16, 0xCD, 0x29, 0x17, 0x1F, + 0x66, 0x32, 0x4D, 0x30, 0x0F, 0x34, 0x26, 0x3A, 0x56, 0x34, 0x81, 0x31, + 0xF6, 0x35, 0x60, 0x23, 0x14, 0x32, 0x94, 0x23, 0x36, 0x22, 0xE1, 0x2F, + 0x56, 0x14, 0xEE, 0x34, 0xA5, 0x18, 0x0F, 0x2D, 0xA8, 0x27, 0x6E, 0x26, + 0xF0, 0x36, 0x67, 0x29, 0x59, 0x3F, 0xBA, 0x2A, 0x29, 0x3A, 0xA2, 0x23, + 0xF6, 0x29, 0xEA, 0x1E, 0x50, 0x17, 0x67, 0x26, 0x4C, 0x09, 0x12, 0x30, + 0xBD, 0x0B, 0x2B, 0x37, 0xF5, 0x1A, 0xD2, 0x3B, 0xCB, 0x26, 0x08, 0x37, + 0xD2, 0x29, 0xFA, 0x34, 0x45, 0x22, 0xB9, 0x3B, 0xB3, 0x20, 0x59, 0x3B, + 0xCF, 0x2B, 0x6F, 0x2F, 0x5E, 0x36, 0xAC, 0x24, 0x8E, 0x41, 0x6C, 0x21, + 0x88, 0x43, 0xB4, 0x1A, 0x53, 0x38, 0x52, 0x12, 0x3F, 0x28, 0x42, 0x11, + 0x2E, 0x13, 0x19, 0x12, 0x40, 0x05, 0x0A, 0x0D, 0x3B, 0x02, 0x1D, 0x05, + 0x91, 0xF9, 0xFC, 0x03, 0x2D, 0xEC, 0xAD, 0xFE, 0x22, 0xF1, 0x09, 0xF4, + 0x8D, 0xFE, 0x5A, 0xF0, 0x3C, 0x01, 0xE6, 0xEE, 0xE8, 0xFB, 0x7B, 0xE9, + 0xAB, 0xF1, 0x0E, 0xE9, 0xA4, 0xE7, 0x20, 0xED, 0x55, 0xE4, 0xD0, 0xE6, + 0x5B, 0xF1, 0x04, 0xE2, 0x33, 0xFB, 0xA1, 0xE0, 0xA5, 0xED, 0xE5, 0xD7, + 0xE4, 0xDB, 0xFC, 0xD1, 0x03, 0xD1, 0x99, 0xCD, 0x92, 0xCC, 0xF5, 0xCB, + 0xE5, 0xCC, 0x1D, 0xD3, 0x04, 0xCC, 0xFE, 0xD6, 0xC8, 0xCA, 0x79, 0xCF, + 0xBC, 0xD0, 0x1A, 0xCB, 0xCD, 0xDD, 0x6D, 0xD1, 0xA1, 0xE0, 0x36, 0xCE, + 0x4E, 0xD5, 0x46, 0xC8, 0x85, 0xC7, 0xDE, 0xCF, 0x8E, 0xC8, 0x87, 0xDC, + 0x78, 0xD8, 0x27, 0xE6, 0x16, 0xE4, 0xCF, 0xEB, 0x60, 0xE5, 0x53, 0xEF, + 0x84, 0xE2, 0xD3, 0xED, 0xFB, 0xE7, 0xEE, 0xEA, 0x15, 0xEF, 0x9E, 0xEA, + 0x65, 0xEA, 0x52, 0xF0, 0x98, 0xE3, 0xC4, 0xF9, 0xEA, 0xE4, 0x68, 0xF5, + 0x4F, 0xE8, 0xAD, 0xE8, 0x0F, 0xE4, 0xC8, 0xE5, 0x10, 0xE6, 0xD6, 0xF0, + 0xBF, 0xED, 0x8E, 0xF9, 0xE4, 0xEE, 0x18, 0xF6, 0x2B, 0xF1, 0xB4, 0xF1, + 0x82, 0xF5, 0x32, 0xED, 0x75, 0xF8, 0xB4, 0xE6, 0x31, 0xFA, 0x9B, 0xEB, + 0xA4, 0xFA, 0xE7, 0xF9, 0xB1, 0xFA, 0x6D, 0xFA, 0xB5, 0xFD, 0x3A, 0xF5, + 0x34, 0xFD, 0x1C, 0xF9, 0x3C, 0xFA, 0x26, 0xFB, 0xB7, 0x00, 0xD2, 0xF4, + 0x6B, 0x10, 0x0D, 0xF2, 0x08, 0x1F, 0x12, 0xFA, 0xC6, 0x25, 0xAF, 0x00, + 0xBD, 0x23, 0xAE, 0x01, 0x54, 0x1B, 0x8E, 0x01, 0xBB, 0x17, 0xB9, 0xFE, + 0x65, 0x0F, 0xA7, 0xFA, 0x26, 0xF8, 0x4F, 0x02, 0xEF, 0xE6, 0x8A, 0x0D, + 0x67, 0xEC, 0xC1, 0x09, 0x72, 0xFB, 0x77, 0x00, 0xD3, 0x03, 0x3F, 0x04, + 0xF5, 0x00, 0xD0, 0x12, 0xFA, 0xFB, 0x8B, 0x1C, 0x70, 0x06, 0x72, 0x1B, + 0x07, 0x11, 0x0F, 0x13, 0x70, 0x13, 0x0D, 0x11, 0xD1, 0x12, 0xAC, 0x11, + 0xF5, 0x0C, 0x5F, 0x14, 0xE8, 0x08, 0x2C, 0x17, 0xC0, 0x10, 0xC0, 0x12, + 0x62, 0x21, 0x86, 0x14, 0xEC, 0x28, 0xB6, 0x17, 0x13, 0x26, 0x41, 0x16, + 0x39, 0x1D, 0xAF, 0x19, 0x98, 0x0D, 0x61, 0x1D, 0xBD, 0x05, 0xFB, 0x1D, + 0x39, 0x09, 0xAA, 0x1D, 0x17, 0x06, 0xAC, 0x1B, 0x9A, 0xFA, 0x0A, 0x1D, + 0x98, 0xF7, 0x7D, 0x21, 0xAB, 0xFC, 0x02, 0x21, 0x4D, 0xFD, 0x13, 0x1B, + 0x7C, 0xFD, 0xF0, 0x12, 0xE8, 0x02, 0xD8, 0x0A, 0xA3, 0x07, 0x7E, 0x02, + 0xE5, 0x06, 0x20, 0xFC, 0x39, 0x04, 0xB6, 0xFC, 0x6E, 0x03, 0xC1, 0xFE, + 0xC7, 0x02, 0x8C, 0xFE, 0x89, 0xFC, 0x33, 0xFC, 0x58, 0xEF, 0x43, 0xF7, + 0xAC, 0xDD, 0xD3, 0xF2, 0x98, 0xD3, 0x21, 0xF0, 0xB7, 0xE1, 0xB9, 0xE9, + 0x21, 0xFD, 0x0C, 0xDE, 0x20, 0x0A, 0xC4, 0xD1, 0xED, 0x07, 0xBF, 0xD0, + 0x07, 0xFE, 0xCD, 0xE0, 0x3F, 0xEE, 0xE5, 0xEF, 0x31, 0xE8, 0x8B, 0xEE, + 0xE0, 0xF2, 0x8C, 0xE6, 0x53, 0x05, 0xF4, 0xE9, 0x2B, 0x0E, 0xFB, 0xF1, + 0x40, 0x08, 0x04, 0xFB, 0xB9, 0xFF, 0x7D, 0x0A, 0xE1, 0xFD, 0x03, 0x12, + 0xEB, 0x01, 0xDA, 0x14, 0x42, 0x04, 0x23, 0x1A, 0xA0, 0x04, 0x8F, 0x15, + 0x7D, 0x07, 0x9F, 0x0B, 0xC5, 0x05, 0x6C, 0xFF, 0x30, 0x02, 0xC4, 0xF7, + 0x7E, 0xFE, 0xBA, 0xFF, 0x28, 0xF3, 0xC6, 0x07, 0x9C, 0xEF, 0x57, 0x03, + 0xB4, 0xFC, 0x35, 0xFD, 0x3B, 0x05, 0xAF, 0xFF, 0x32, 0xFB, 0x14, 0xFE, + 0xEB, 0xF3, 0x51, 0xF5, 0x07, 0xFC, 0x36, 0xEE, 0xB1, 0x05, 0x88, 0xE9, + 0x2D, 0x0E, 0xC4, 0xE9, 0x25, 0x13, 0x5B, 0xEC, 0x60, 0x0F, 0xA7, 0xEE, + 0x4A, 0x10, 0x16, 0xF1, 0xBA, 0x19, 0xAD, 0xF5, 0x29, 0x18, 0x39, 0xFF, + 0x95, 0x0C, 0x6F, 0x08, 0x6B, 0x05, 0x21, 0x0A, 0x29, 0x03, 0x00, 0x06, + 0x99, 0xFF, 0x24, 0xFF, 0x83, 0xF4, 0xA1, 0x02, 0x00, 0xEA, 0xA2, 0x0F, + 0x85, 0xE9, 0x48, 0x0E, 0xFB, 0xEC, 0x1E, 0x05, 0xDE, 0xEB, 0xAF, 0xFF, + 0xC9, 0xEA, 0x8A, 0xF9, 0x44, 0xEE, 0x45, 0xF2, 0x38, 0xF3, 0xD4, 0xF1, + 0x22, 0xF5, 0x87, 0xF7, 0xEE, 0xF9, 0x64, 0xFB, 0x9B, 0xFE, 0x05, 0x04, + 0x4B, 0xFB, 0xEA, 0x0B, 0x2A, 0xFA, 0x2B, 0x07, 0x73, 0xF7, 0xE2, 0xFB, + 0xFF, 0xED, 0xC4, 0xF7, 0xDD, 0xE7, 0x0F, 0xFD, 0x7D, 0xE8, 0x9F, 0x05, + 0x02, 0xEB, 0xE3, 0x0C, 0xAF, 0xF1, 0x98, 0x0C, 0xF9, 0xFE, 0x92, 0x08, + 0xE9, 0x06, 0x46, 0x03, 0x60, 0x05, 0x8C, 0xF6, 0xB2, 0xFD, 0xF9, 0xE7, + 0x9C, 0xF8, 0x28, 0xE7, 0x6B, 0xFD, 0xCC, 0xF1, 0xEC, 0x01, 0x8F, 0xF6, + 0xDB, 0x01, 0x95, 0xF8, 0x91, 0xFB, 0x8A, 0xFA, 0x88, 0xF4, 0xB7, 0xFB, + 0xE3, 0xEE, 0x32, 0xFE, 0xF2, 0xE8, 0xA5, 0xFF, 0x18, 0xEC, 0xFC, 0x00, + 0x6B, 0xF6, 0xE4, 0x02, 0x12, 0x01, 0x59, 0x06, 0x06, 0x08, 0xCE, 0x01, + 0x55, 0x06, 0x25, 0xF8, 0xA1, 0xFF, 0x49, 0xEF, 0x64, 0xF7, 0x47, 0xE2, + 0xD0, 0xE9, 0x1C, 0xE0, 0xC7, 0xE3, 0x66, 0xE8, 0x06, 0xEB, 0x4E, 0xE9, + 0x77, 0xE9, 0xC0, 0xE5, 0xB2, 0xE4, 0x92, 0xE9, 0x2C, 0xED, 0x91, 0xEF, + 0xD4, 0xF2, 0x73, 0xE9, 0x13, 0xEE, 0xD0, 0xE3, 0xCE, 0xF2, 0x72, 0xE6, + 0x71, 0x06, 0xA9, 0xEB, 0x99, 0x14, 0x77, 0xF4, 0xB8, 0x1B, 0xB5, 0x05, + 0x22, 0x19, 0x82, 0x1A, 0xE1, 0x0E, 0x7C, 0x20, 0xDA, 0x10, 0xF3, 0x17, + 0x3B, 0x1C, 0x0D, 0x0F, 0xB5, 0x1F, 0xFE, 0x05, 0x80, 0x0F, 0x4B, 0xFE, + 0x78, 0xF4, 0x28, 0x05, 0xD2, 0xE7, 0x09, 0x17, 0x87, 0xF1, 0x9C, 0x1B, + 0x1C, 0x03, 0xF8, 0x15, 0xD0, 0x0C, 0x57, 0x15, 0x5A, 0x12, 0x19, 0x18, + 0x07, 0x13, 0xD0, 0x1A, 0x3C, 0x0E, 0xF1, 0x1B, 0x48, 0x15, 0x03, 0x1F, + 0x33, 0x28, 0x9D, 0x25, 0x63, 0x2E, 0x53, 0x28, 0xDD, 0x28, 0x04, 0x25, + 0xA1, 0x2A, 0x69, 0x21, 0x0B, 0x2C, 0xE2, 0x1E, 0x6E, 0x28, 0x6C, 0x1C, + 0xCF, 0x28, 0x62, 0x1B, 0xF9, 0x2C, 0x29, 0x1D, 0x88, 0x2A, 0x21, 0x1A, + 0x90, 0x21, 0x95, 0x1A, 0xAC, 0x12, 0xC4, 0x26, 0x82, 0x05, 0x51, 0x2C, + 0x43, 0x0E, 0x4E, 0x25, 0xAA, 0x22, 0x13, 0x1B, 0x10, 0x33, 0xBB, 0x10, + 0x88, 0x34, 0xFC, 0x0A, 0x62, 0x26, 0x3D, 0x0E, 0x4B, 0x1F, 0x6D, 0x0E, + 0x63, 0x20, 0xC2, 0x0C, 0x6A, 0x19, 0xF2, 0x15, 0x22, 0x0C, 0xA9, 0x22, + 0x4A, 0x0B, 0x29, 0x2F, 0xC8, 0x13, 0xA1, 0x32, 0x8D, 0x17, 0x91, 0x28, + 0x11, 0x1B, 0x32, 0x1F, 0x0A, 0x1A, 0xE1, 0x1B, 0xF5, 0x0F, 0x1D, 0x17, + 0x53, 0x10, 0xA4, 0x0D, 0x2B, 0x1B, 0xE1, 0x09, 0xB1, 0x1C, 0x52, 0x16, + 0x2A, 0x15, 0xF5, 0x22, 0xF6, 0x0A, 0x0D, 0x1C, 0xBA, 0xFC, 0x10, 0x0B, + 0x6E, 0xEE, 0x64, 0xFD, 0x43, 0xE6, 0xC1, 0xFC, 0xD1, 0xE5, 0x95, 0x03, + 0x51, 0xF4, 0x6E, 0x02, 0x90, 0x09, 0xAD, 0xFB, 0xAD, 0x17, 0x02, 0xF7, + 0x2B, 0x16, 0xA4, 0xEE, 0x71, 0x01, 0x8E, 0xE4, 0xA2, 0xEC, 0x4D, 0xDC, + 0x73, 0xE8, 0x7B, 0xD5, 0x6D, 0xEB, 0x66, 0xD7, 0xF0, 0xEE, 0xEE, 0xE2, + 0x30, 0xF9, 0x2D, 0xED, 0xCC, 0xFB, 0x1E, 0xEC, 0xB6, 0xE7, 0x69, 0xE3, + 0x41, 0xD1, 0x22, 0xD9, 0xA1, 0xCD, 0x1B, 0xCE, 0xAE, 0xD5, 0xBF, 0xC6, + 0xE1, 0xDB, 0x0C, 0xCE, 0xC6, 0xDE, 0x3D, 0xDB, 0x81, 0xDD, 0xCC, 0xD6, + 0x90, 0xD0, 0x67, 0xCF, 0xAE, 0xC6, 0xF5, 0xD6, 0xC0, 0xC8, 0x81, 0xD5, + 0x23, 0xCC, 0xE5, 0xCC, 0xD4, 0xD2, 0xF7, 0xD5, 0x1B, 0xE3, 0x2D, 0xE8, + 0xE8, 0xF4, 0x85, 0xF1, 0x63, 0xF9, 0x83, 0xF3, 0x6C, 0xF2, 0x7B, 0xF2, + 0xBB, 0xE9, 0x33, 0xF2, 0xBE, 0xDE, 0x47, 0xF7, 0xD8, 0xD3, 0xF4, 0x02, + 0x87, 0xD2, 0x70, 0x12, 0x74, 0xDB, 0x3B, 0x15, 0x9E, 0xE5, 0xD6, 0x06, + 0x3D, 0xE3, 0x72, 0xF7, 0xA1, 0xDC, 0xBE, 0xEE, 0x05, 0xE5, 0xA8, 0xE9, + 0xB9, 0xF3, 0x9D, 0xE8, 0x81, 0xFF, 0x24, 0xF3, 0x54, 0x0A, 0x75, 0x01, + 0x16, 0x0F, 0xA7, 0x01, 0x22, 0x06, 0x56, 0xFC, 0x0C, 0xFA, 0x3A, 0xFB, + 0xAA, 0xFC, 0x5A, 0xF1, 0x23, 0x08, 0x15, 0xE6, 0x0C, 0x11, 0x48, 0xEE, + 0xA6, 0x16, 0x0E, 0xFB, 0xA4, 0x18, 0x0E, 0xF8, 0xE4, 0x18, 0xD8, 0xEE, + 0xAE, 0x18, 0xD4, 0xE7, 0x2D, 0x14, 0x19, 0xE5, 0x01, 0x0E, 0x55, 0xEC, + 0x7C, 0x0A, 0x77, 0xFC, 0x6B, 0x0A, 0x4F, 0x11, 0x43, 0x09, 0x48, 0x1F, + 0x7A, 0x00, 0x72, 0x1D, 0x20, 0xF7, 0x6C, 0x16, 0xFE, 0xF1, 0xBB, 0x11, + 0x25, 0xF5, 0xA3, 0x0B, 0xD2, 0xFD, 0xDB, 0x07, 0x95, 0x01, 0xCB, 0x08, + 0x68, 0x00, 0xC6, 0x06, 0x82, 0x02, 0xD9, 0xFD, 0x35, 0x05, 0xF4, 0xF1, + 0x3B, 0xFD, 0x36, 0xF1, 0xB2, 0xF1, 0x1F, 0xF7, 0xE5, 0xF1, 0xAF, 0xF9, + 0x80, 0x00, 0xAB, 0xFF, 0x38, 0x10, 0x71, 0x02, 0xD9, 0x0E, 0x95, 0x01, + 0x1C, 0x04, 0xFC, 0x04, 0x01, 0xFE, 0x8E, 0x06, 0x45, 0xFF, 0xCB, 0xFF, + 0x69, 0x06, 0x42, 0xF7, 0xFF, 0x07, 0xB6, 0xFA, 0x32, 0xFE, 0xA0, 0x06, + 0xE7, 0xEF, 0xFD, 0x0E, 0x20, 0xED, 0x17, 0x0A, 0x5C, 0xF3, 0xD6, 0xFA, + 0x2A, 0xF3, 0x9D, 0xF2, 0xB0, 0xF0, 0x26, 0xF4, 0x8D, 0xF1, 0xA5, 0xF3, + 0xC3, 0xF0, 0xEE, 0xF0, 0x99, 0xEA, 0x5F, 0xF7, 0xB3, 0xE8, 0x2F, 0xFD, + 0x14, 0xF0, 0xAA, 0xF8, 0x89, 0xF0, 0x98, 0xF0, 0x90, 0xE4, 0x60, 0xEB, + 0x58, 0xD8, 0x2A, 0xEB, 0xBC, 0xCE, 0xA4, 0xE7, 0x78, 0xCC, 0x88, 0xE1, + 0xB9, 0xDA, 0xA5, 0xD8, 0x31, 0xEC, 0xCF, 0xD0, 0xD6, 0xF3, 0x42, 0xD1, + 0xFA, 0xF2, 0x22, 0xD6, 0x83, 0xED, 0x49, 0xD5, 0xF0, 0xEA, 0x9B, 0xCA, + 0x9B, 0xF1, 0xD6, 0xC9, 0x76, 0xFD, 0x22, 0xD3, 0x45, 0xFF, 0xAC, 0xD6, + 0x1F, 0xF2, 0x7D, 0xDA, 0xF5, 0xE2, 0x0A, 0xE7, 0x98, 0xDF, 0x9C, 0xF6, + 0xBB, 0xEE, 0x1F, 0x05, 0xB4, 0x02, 0x67, 0x0E, 0x69, 0x0E, 0x76, 0x0E, + 0x5D, 0x12, 0xD6, 0x0B, 0x70, 0x0B, 0x94, 0x06, 0x7D, 0xFC, 0x78, 0x00, + 0xBD, 0xF0, 0xE7, 0x01, 0x38, 0xEE, 0xAE, 0x05, 0x03, 0xF2, 0xE7, 0x07, + 0xF4, 0xF2, 0x73, 0x10, 0x67, 0xF1, 0x44, 0x1A, 0xCA, 0xF1, 0x1D, 0x1B, + 0xA3, 0xF4, 0x47, 0x15, 0xCD, 0xFA, 0x7C, 0x0B, 0x99, 0x00, 0xCC, 0xFE, + 0xBE, 0xFF, 0x4A, 0xF2, 0x5A, 0xFA, 0x64, 0xEE, 0x75, 0xF8, 0xB2, 0xF5, + 0xE4, 0xFE, 0xB4, 0xFF, 0x54, 0x0C, 0xA3, 0x0D, 0x80, 0x18, 0x70, 0x19, + 0x32, 0x1D, 0xC0, 0x16, 0x7B, 0x19, 0xD1, 0x0D, 0x95, 0x15, 0x72, 0x03, + 0xD3, 0x16, 0x41, 0xF6, 0x61, 0x16, 0xAD, 0xF5, 0x59, 0x15, 0xDD, 0x04, + 0xC0, 0x13, 0xA8, 0x17, 0x07, 0x0D, 0xEA, 0x28, 0xAA, 0x0B, 0xF2, 0x2B, + 0x0C, 0x11, 0xE1, 0x1C, 0x5C, 0x0F, 0xCE, 0x0B, 0x4F, 0x0C, 0x3F, 0x03, + 0x3A, 0x0C, 0x2C, 0x03, 0x9B, 0x0C, 0xB5, 0x08, 0x5F, 0x11, 0x09, 0x14, + 0x10, 0x17, 0x57, 0x21, 0x1F, 0x1F, 0x2B, 0x23, 0x67, 0x28, 0xA4, 0x16, + 0x98, 0x2A, 0x10, 0x0C, 0x1D, 0x21, 0xA9, 0x0F, 0x90, 0x15, 0xA2, 0x1C, + 0x13, 0x11, 0x1C, 0x25, 0x2F, 0x10, 0xFA, 0x28, 0xA5, 0x18, 0x06, 0x2C, + 0x73, 0x26, 0x79, 0x25, 0xD6, 0x22, 0x74, 0x1E, 0x18, 0x12, 0x0F, 0x21, + 0xCB, 0x0F, 0xEC, 0x26, 0xBB, 0x1C, 0xF3, 0x27, 0xCC, 0x29, 0xFC, 0x21, + 0xD5, 0x2F, 0x51, 0x1D, 0x2A, 0x2C, 0x7A, 0x1C, 0x3B, 0x2A, 0x23, 0x1B, + 0xBE, 0x32, 0x77, 0x1C, 0x32, 0x32, 0x5C, 0x22, 0x32, 0x20, 0xE6, 0x25, + 0x06, 0x09, 0x47, 0x27, 0x96, 0xFE, 0xAA, 0x26, 0x8D, 0x08, 0x22, 0x19, + 0x68, 0x16, 0x75, 0x07, 0xAF, 0x1B, 0x43, 0x05, 0x3B, 0x15, 0x94, 0x09, + 0xF3, 0x0F, 0xBC, 0x04, 0x4F, 0x0D, 0x2B, 0xFE, 0x7D, 0x01, 0xA6, 0x00, + 0xCE, 0xF5, 0x49, 0x06, 0x78, 0xF8, 0x91, 0x0A, 0xFF, 0x03, 0xC1, 0x06, + 0xAE, 0x04, 0x85, 0xFD, 0x7B, 0xFB, 0xA7, 0xFB, 0xE9, 0xF8, 0x86, 0xFD, + 0x76, 0xFC, 0xF7, 0xF5, 0x10, 0xFB, 0x1D, 0xE8, 0xFC, 0xF3, 0x08, 0xE4, + 0x70, 0xEF, 0x94, 0xEC, 0x39, 0xEF, 0x92, 0xF8, 0x70, 0xF8, 0xA0, 0x00, + 0x8D, 0x08, 0xCA, 0x04, 0x6A, 0x11, 0xA8, 0x09, 0xC0, 0x10, 0x63, 0x0F, + 0x74, 0x06, 0xCF, 0x0F, 0xAF, 0xF4, 0x2A, 0x08, 0x35, 0xED, 0xCB, 0x00, + 0x49, 0xF6, 0xA1, 0xFC, 0x35, 0xFA, 0x76, 0xF6, 0xBE, 0xEC, 0x9C, 0xF4, + 0x87, 0xDD, 0xD9, 0xF8, 0x7E, 0xD7, 0x93, 0xFC, 0xA6, 0xDA, 0xC3, 0xFD, + 0x33, 0xEE, 0x24, 0xFE, 0x3A, 0x08, 0xFA, 0xFA, 0xA8, 0x12, 0x83, 0xF1, + 0x02, 0x13, 0x60, 0xEA, 0x30, 0x10, 0x5D, 0xE9, 0xFF, 0x03, 0xDC, 0xEC, + 0x1E, 0xFA, 0x60, 0xF1, 0x32, 0xFC, 0xAD, 0xF3, 0x87, 0xFF, 0x5A, 0xF4, + 0x3D, 0xFF, 0x30, 0xFA, 0xA5, 0xF4, 0x54, 0x06, 0x1A, 0xE0, 0xDC, 0x0B, + 0x98, 0xD5, 0x0F, 0x05, 0x6E, 0xDE, 0x1D, 0xF8, 0x47, 0xF4, 0xB6, 0xED, + 0xF7, 0x08, 0x9C, 0xE8, 0x71, 0x11, 0x97, 0xE8, 0x5D, 0x0D, 0xC2, 0xEC, + 0xB1, 0x05, 0xF0, 0xF2, 0x12, 0x01, 0x20, 0xF9, 0x5B, 0xFB, 0xCA, 0xFC, + 0x9D, 0xF6, 0x8E, 0x03, 0x20, 0xFA, 0x2D, 0x0B, 0x1F, 0xFE, 0xEE, 0x09, + 0x69, 0xFB, 0x62, 0x02, 0xE0, 0xF8, 0xC2, 0xF9, 0x6D, 0xF7, 0x92, 0xF3, + 0x97, 0xF0, 0xAC, 0xF2, 0xB9, 0xEE, 0x2A, 0xF7, 0x28, 0xFE, 0x03, 0xFE, + 0x47, 0x0C, 0xD7, 0xFF, 0x9A, 0x0C, 0xEF, 0xFA, 0xC7, 0x08, 0x70, 0xF4, + 0x0C, 0xFE, 0x14, 0xEF, 0x02, 0xF0, 0xF1, 0xED, 0xB7, 0xE9, 0x28, 0xF4, + 0xE3, 0xE7, 0x61, 0xFE, 0x6A, 0xEC, 0xA1, 0x02, 0x4C, 0xFC, 0xB1, 0xFB, + 0xA1, 0x09, 0xAD, 0xF1, 0x9E, 0x02, 0x37, 0xEA, 0x29, 0xEF, 0xEC, 0xE4, + 0xFD, 0xDF, 0xC8, 0xE3, 0xFF, 0xE1, 0x93, 0xE7, 0x91, 0xF5, 0xFF, 0xEB, + 0xF1, 0x04, 0x8C, 0xF0, 0x72, 0x00, 0xCE, 0xFD, 0x1B, 0xEF, 0xAA, 0x08, + 0xB7, 0xE4, 0x1B, 0x01, 0x9C, 0xE3, 0x8E, 0xF3, 0x19, 0xE3, 0xFE, 0xEC, + 0xED, 0xE5, 0x1D, 0xEF, 0xD8, 0xE8, 0xF2, 0xF3, 0xFF, 0xE9, 0x61, 0xF2, + 0x28, 0xF2, 0x1B, 0xEE, 0x15, 0xF6, 0xA3, 0xEB, 0x05, 0xE9, 0xFE, 0xE9, + 0xA7, 0xDF, 0xBC, 0xE8, 0x64, 0xE9, 0x05, 0xE8, 0x9F, 0xFC, 0x66, 0xE6, + 0xC9, 0x0A, 0x0D, 0xE5, 0xD4, 0x10, 0xAB, 0xE6, 0x3E, 0x15, 0x41, 0xE6, + 0xB2, 0x16, 0x80, 0xE8, 0x2E, 0x0D, 0x48, 0xFA, 0xF4, 0xF7, 0x23, 0x17, + 0xB1, 0xEA, 0x0F, 0x31, 0x4B, 0xEF, 0x8A, 0x3A, 0x4D, 0xFE, 0xAE, 0x35, + 0x54, 0x08, 0x96, 0x2D, 0x5C, 0x03, 0xF9, 0x23, 0xA8, 0xF8, 0x7D, 0x16, + 0x87, 0xF1, 0x74, 0x0A, 0x23, 0xF6, 0xF1, 0x04, 0xFE, 0x04, 0xB5, 0x08, + 0x20, 0x13, 0xAA, 0x12, 0x68, 0x16, 0x88, 0x18, 0x2C, 0x11, 0x18, 0x19, + 0xC1, 0x14, 0x43, 0x15, 0x31, 0x1C, 0xE2, 0x0F, 0x3D, 0x1C, 0xA5, 0x0F, + 0x75, 0x1A, 0x50, 0x16, 0x0F, 0x18, 0xED, 0x1C, 0x7E, 0x19, 0x06, 0x18, + 0x44, 0x21, 0xF1, 0x0A, 0x40, 0x28, 0x67, 0xFF, 0x0C, 0x28, 0x77, 0xF5, + 0x5B, 0x1F, 0xA1, 0xF3, 0x9B, 0x12, 0xE6, 0xFC, 0x59, 0x10, 0x69, 0x01, + 0xB1, 0x15, 0x8F, 0x03, 0x83, 0x11, 0x29, 0x0F, 0xCE, 0x0E, 0x99, 0x10, + 0x41, 0x14, 0xC8, 0x05, 0xF7, 0x17, 0xB8, 0x03, 0x44, 0x12, 0xB7, 0x07, + 0x9C, 0x06, 0x4F, 0x0A, 0x00, 0x03, 0xC4, 0x07, 0xE1, 0x01, 0x4E, 0x01, + 0xE5, 0xFC, 0x9C, 0xFE, 0xAB, 0xF5, 0x8D, 0xFC, 0x9F, 0xEF, 0x14, 0xF8, + 0xC0, 0xF1, 0x91, 0xF5, 0x88, 0xF5, 0x6D, 0xF7, 0x4F, 0xF9, 0x5F, 0xF9, + 0x54, 0xFC, 0xFA, 0xF9, 0x88, 0xFD, 0x63, 0xFD, 0xFB, 0x00, 0x62, 0xFC, + 0x55, 0x05, 0x9D, 0xF6, 0x87, 0x03, 0x8B, 0xF9, 0xEC, 0xFC, 0xDE, 0x05, + 0x6B, 0xF6, 0x8A, 0x11, 0x71, 0xE9, 0x9E, 0x1A, 0x5B, 0xE1, 0x1B, 0x1A, + 0xD2, 0xE8, 0xEB, 0x0B, 0x24, 0xF2, 0xDB, 0xF8, 0xB9, 0xF7, 0xE1, 0xE7, + 0xF8, 0xF7, 0xD8, 0xE5, 0xBB, 0xF2, 0x9F, 0xEC, 0x49, 0xEF, 0x22, 0xEB, + 0xB2, 0xF1, 0xA7, 0xEA, 0x30, 0xF2, 0xE3, 0xEE, 0xC9, 0xED, 0x4F, 0xEF, + 0xC1, 0xEA, 0x60, 0xEB, 0x41, 0xE3, 0x74, 0xEA, 0xE1, 0xD7, 0x2C, 0xEE, + 0xB4, 0xCF, 0x21, 0xEF, 0xB9, 0xCE, 0x65, 0xEB, 0xA9, 0xD6, 0x24, 0xE0, + 0x3A, 0xE2, 0xF9, 0xCF, 0xB0, 0xE3, 0xFB, 0xC3, 0xDD, 0xDA, 0xE2, 0xC1, + 0x03, 0xD8, 0xB3, 0xC7, 0xE1, 0xDA, 0x3F, 0xCA, 0x15, 0xE4, 0xF3, 0xCB, + 0x72, 0xF3, 0x06, 0xD7, 0x2E, 0xF4, 0x94, 0xE6, 0x5D, 0xE8, 0xD8, 0xEB, + 0xE2, 0xE8, 0x49, 0xE9, 0x88, 0xEE, 0xBF, 0xED, 0x90, 0xE9, 0x32, 0xFA, + 0xEF, 0xE7, 0x28, 0x07, 0x1A, 0xF1, 0x1E, 0x0C, 0x4F, 0xF8, 0xBA, 0x04, + 0xFB, 0xFA, 0xC8, 0xF5, 0xF9, 0xFC, 0xEE, 0xEB, 0x1C, 0xF8, 0xEE, 0xEE, + 0xD6, 0xEF, 0xE7, 0xF7, 0x6E, 0xEB, 0x36, 0x00, 0x10, 0xEB, 0x1B, 0x0B, + 0x47, 0xF4, 0xC5, 0x16, 0x3B, 0x08, 0x87, 0x1B, 0x82, 0x1C, 0xA7, 0x13, + 0x4A, 0x26, 0xC4, 0x04, 0x81, 0x22, 0xEC, 0xFE, 0x4D, 0x13, 0x5A, 0x00, + 0x76, 0x05, 0x06, 0x00, 0x2A, 0x03, 0x89, 0x02, 0x12, 0x0A, 0xA7, 0x03, + 0xB0, 0x16, 0xAA, 0xFB, 0xFC, 0x1C, 0x3E, 0xF3, 0xEE, 0x15, 0xF3, 0xF2, + 0xD0, 0x0C, 0x68, 0xF7, 0x26, 0x10, 0x36, 0x01, 0x03, 0x1C, 0x78, 0x0F, + 0xA5, 0x1E, 0xB7, 0x1D, 0x08, 0x1B, 0xEA, 0x27, 0x43, 0x1D, 0xFF, 0x28, + 0x21, 0x1D, 0x8C, 0x25, 0x22, 0x19, 0xB1, 0x20, 0x99, 0x1A, 0x41, 0x1D, + 0x37, 0x16, 0x39, 0x21, 0xB7, 0x09, 0x83, 0x24, 0x62, 0x02, 0xCA, 0x1F, + 0x3D, 0x03, 0x28, 0x17, 0x89, 0x0B, 0xE5, 0x09, 0xC3, 0x16, 0x8D, 0xFE, + 0x6B, 0x19, 0x50, 0xFD, 0x9D, 0x16, 0x06, 0x03, 0x38, 0x13, 0x09, 0x13, + 0xDB, 0x05, 0xB4, 0x2A, 0x27, 0xFE, 0x3C, 0x36, 0xBF, 0x09, 0x06, 0x33, + 0xE2, 0x18, 0x41, 0x30, 0xA8, 0x24, 0x4D, 0x31, 0xE7, 0x2E, 0x06, 0x30, + 0x92, 0x32, 0xFC, 0x27, 0x5A, 0x2A, 0x48, 0x1E, 0x51, 0x1E, 0x30, 0x11, + 0xF0, 0x16, 0x9D, 0x00, 0x8A, 0x10, 0x1E, 0xFE, 0x6E, 0x0D, 0xCA, 0x0C, + 0xA5, 0x11, 0xDC, 0x1D, 0xFD, 0x14, 0x15, 0x29, 0xA4, 0x10, 0x79, 0x2F, + 0x2E, 0x0F, 0xD1, 0x2F, 0x89, 0x0E, 0x30, 0x27, 0x22, 0x0B, 0x68, 0x1A, + 0xB7, 0x11, 0x80, 0x11, 0xA8, 0x1B, 0x63, 0x11, 0xA1, 0x18, 0xA4, 0x14, + 0xDB, 0x0A, 0xF6, 0x15, 0x51, 0xFA, 0x73, 0x11, 0xC0, 0xEC, 0x7A, 0x02, + 0x46, 0xEE, 0xC8, 0xF3, 0x03, 0xF7, 0xBB, 0xF0, 0x78, 0xF8, 0x9B, 0xF4, + 0x89, 0xFC, 0x8F, 0xF4, 0x39, 0x08, 0xC9, 0xF6, 0xE7, 0x0C, 0x9C, 0xFB, + 0x5C, 0x00, 0x67, 0xF6, 0x12, 0xF0, 0x3D, 0xEC, 0x5F, 0xEE, 0x83, 0xE7, + 0x43, 0xF6, 0xD2, 0xE7, 0x3C, 0xF8, 0x1D, 0xE5, 0xBD, 0xF5, 0xA2, 0xE0, + 0xA7, 0xF2, 0xBC, 0xDF, 0xD5, 0xEB, 0xD8, 0xDD, 0x0C, 0xEA, 0xE0, 0xDB, + 0x34, 0xEC, 0xE8, 0xE0, 0xFE, 0xED, 0x62, 0xEC, 0x59, 0xF6, 0x4C, 0xFB, + 0xF6, 0x04, 0xE0, 0x07, 0x18, 0x0F, 0x68, 0x07, 0xF0, 0x09, 0x85, 0xFF, + 0x87, 0xFB, 0xA8, 0xFE, 0xE6, 0xF0, 0xDB, 0x04, 0x49, 0xF3, 0x1D, 0x09, + 0x7F, 0x02, 0x18, 0x09, 0xBE, 0x0A, 0x49, 0x0B, 0x25, 0x04, 0xEF, 0x0D, + 0x7D, 0xFA, 0x41, 0x06, 0xD8, 0xEF, 0xC1, 0xF5, 0x1D, 0xEB, 0xB0, 0xE9, + 0x14, 0xF4, 0x94, 0xE4, 0x2E, 0xFD, 0xD0, 0xE6, 0xB1, 0x04, 0x77, 0xED, + 0xDD, 0x0F, 0x75, 0xF3, 0x7A, 0x0E, 0xF2, 0xF9, 0xAE, 0xFF, 0x01, 0xFD, + 0xB6, 0xF5, 0xB9, 0x05, 0x25, 0xF7, 0x9C, 0x10, 0xCF, 0x06, 0x92, 0x08, + 0x22, 0x1A, 0xC9, 0xF7, 0x79, 0x1E, 0x4A, 0xEF, 0x51, 0x0F, 0x6A, 0xE6, + 0x61, 0xF5, 0x21, 0xDD, 0x92, 0xE5, 0x75, 0xDD, 0x36, 0xEA, 0xF4, 0xE2, + 0x1E, 0xF5, 0xD3, 0xEE, 0xE2, 0xF6, 0xF7, 0x00, 0xDD, 0xF1, 0xEB, 0x0F, + 0xA5, 0xED, 0x54, 0x13, 0xD3, 0xEA, 0xAA, 0x0A, 0x22, 0xEA, 0xCF, 0x04, + 0xDF, 0xF0, 0xEF, 0x08, 0x57, 0xFA, 0xC0, 0x0E, 0x25, 0xFE, 0xFD, 0x0F, + 0x42, 0x01, 0xBC, 0x0B, 0xFD, 0x02, 0x51, 0x02, 0x9E, 0xF9, 0xC5, 0xF6, + 0x27, 0xE9, 0x56, 0xED, 0xAB, 0xE2, 0x82, 0xEE, 0x28, 0xEB, 0xBF, 0xF8, + 0x6C, 0xF6, 0xC1, 0xFE, 0xB8, 0xFD, 0xCC, 0x00, 0x30, 0x03, 0xCD, 0xFD, + 0xA0, 0x07, 0xD0, 0xF4, 0x5D, 0x04, 0x2D, 0xEE, 0x50, 0xF7, 0xD9, 0xEB, + 0xD9, 0xE9, 0xED, 0xEE, 0xF3, 0xE6, 0x66, 0xF7, 0x0A, 0xF0, 0x73, 0xFD, + 0x73, 0xF7, 0x30, 0xF9, 0xDC, 0xF8, 0xCD, 0xF2, 0x08, 0xF5, 0xCD, 0xEE, + 0x0E, 0xF0, 0xF7, 0xE9, 0x05, 0xEE, 0x71, 0xE1, 0x7D, 0xEA, 0x6E, 0xD4, + 0x8A, 0xE5, 0x75, 0xD2, 0x01, 0xDE, 0x2A, 0xE0, 0x08, 0xD9, 0xE8, 0xEE, + 0x3B, 0xDF, 0x50, 0xF7, 0x87, 0xEE, 0x74, 0xFB, 0xCA, 0xF9, 0x94, 0xFA, + 0xC9, 0xF9, 0x9C, 0xF9, 0x37, 0xEB, 0xE1, 0xF6, 0x81, 0xD1, 0x5F, 0xEA, + 0xEE, 0xC7, 0x42, 0xD9, 0x89, 0xD6, 0x12, 0xCC, 0xF7, 0xE8, 0xCF, 0xC7, + 0x25, 0xF1, 0x22, 0xCF, 0x2B, 0xED, 0x68, 0xE2, 0x44, 0xE6, 0xFB, 0xF6, + 0x8E, 0xE4, 0x97, 0x02, 0xF0, 0xE8, 0xD5, 0x08, 0x67, 0xEF, 0x77, 0x0C, + 0x32, 0xFA, 0x37, 0x0C, 0x25, 0x09, 0xB1, 0x0C, 0x72, 0x10, 0x3C, 0x0F, + 0xD2, 0x0C, 0x32, 0x09, 0xC0, 0x00, 0x2D, 0x04, 0x45, 0xF2, 0x02, 0x04, + 0xE7, 0xEE, 0x4C, 0xFA, 0x6E, 0xFB, 0xA8, 0xF1, 0x61, 0x0B, 0xC7, 0xF1, + 0x86, 0x12, 0x59, 0xF2, 0xFE, 0x13, 0x3E, 0xF2, 0xA4, 0x0D, 0x16, 0xF7, + 0xDB, 0x00, 0x51, 0xFF, 0xEF, 0xF9, 0xCB, 0x0A, 0x9D, 0x02, 0x28, 0x13, + 0x04, 0x1D, 0xEF, 0x0A, 0x50, 0x33, 0x95, 0xFD, 0x23, 0x36, 0xD2, 0xF9, + 0xEC, 0x2B, 0xAD, 0xFB, 0xB3, 0x1D, 0xCC, 0xF8, 0x90, 0x13, 0x39, 0xF5, + 0x1D, 0x10, 0x83, 0xFC, 0x6A, 0x0D, 0xD9, 0x07, 0x98, 0x04, 0x6E, 0x10, + 0x9D, 0xFE, 0xE8, 0x16, 0x36, 0xFD, 0x46, 0x18, 0x0B, 0xFE, 0x4C, 0x14, + 0x3C, 0x04, 0x07, 0x0F, 0x7E, 0x0A, 0x26, 0x08, 0x15, 0x11, 0x83, 0x02, + 0x0B, 0x14, 0xD3, 0x02, 0xA8, 0x0F, 0xB2, 0x04, 0x20, 0x09, 0xD6, 0x0A, + 0xE5, 0xFE, 0xC1, 0x0F, 0xF2, 0xF1, 0x33, 0x06, 0xC7, 0xEF, 0xCE, 0xF6, + 0xE7, 0xFA, 0x88, 0xEC, 0xA1, 0xFE, 0xCB, 0xE5, 0x5E, 0xF6, 0xB1, 0xE3, + 0xA9, 0xF1, 0xBB, 0xEB, 0xE8, 0xF4, 0x5C, 0xFB, 0x62, 0xFC, 0x50, 0x0B, + 0xF6, 0x01, 0x04, 0x17, 0x1E, 0x02, 0x5D, 0x1E, 0xC5, 0xFF, 0xCD, 0x1D, + 0x1E, 0x02, 0xC3, 0x14, 0x7C, 0x05, 0x45, 0x10, 0x62, 0xFE, 0x03, 0x12, + 0x58, 0xF2, 0x75, 0x10, 0x27, 0xEE, 0x17, 0x08, 0x91, 0xF0, 0xFF, 0xFE, + 0x13, 0xF1, 0xEF, 0xFC, 0x75, 0xEE, 0x29, 0xFF, 0x04, 0xEA, 0xFE, 0xFB, + 0x1D, 0xE8, 0x50, 0xF9, 0x1D, 0xED, 0x5D, 0x00, 0xAC, 0xF3, 0x3F, 0x0B, + 0xE3, 0xFA, 0x65, 0x15, 0x3F, 0x07, 0xF5, 0x1B, 0xAF, 0x14, 0xEE, 0x16, + 0xBE, 0x18, 0x88, 0x07, 0xBA, 0x12, 0xF6, 0xF8, 0xCA, 0x05, 0x68, 0xEC, + 0x0B, 0xF8, 0x70, 0xE2, 0x68, 0xF2, 0xF6, 0xDC, 0xE9, 0xF9, 0x49, 0xDB, + 0x36, 0x07, 0xC5, 0xDF, 0x6F, 0x07, 0x6A, 0xE8, 0x67, 0xFB, 0x65, 0xED, + 0xC8, 0xF7, 0x1E, 0xF1, 0xEF, 0x07, 0xF0, 0xF8, 0xE6, 0x1A, 0x6F, 0xFB, + 0xEA, 0x1D, 0x56, 0xFB, 0xAE, 0x18, 0xF5, 0x03, 0x2C, 0x18, 0xA2, 0x0F, + 0xF6, 0x1C, 0x94, 0x16, 0xC3, 0x23, 0x88, 0x1A, 0xDC, 0x27, 0x8D, 0x1F, + 0x71, 0x1F, 0x1E, 0x24, 0x1C, 0x0D, 0xFA, 0x28, 0x8D, 0xFF, 0x59, 0x2E, + 0xE0, 0xFB, 0x69, 0x32, 0xD3, 0xFF, 0x3C, 0x2C, 0xFF, 0x0E, 0xB7, 0x18, + 0x93, 0x22, 0x3C, 0x10, 0x41, 0x2A, 0x9A, 0x1B, 0xC9, 0x26, 0xEF, 0x25, + 0x69, 0x21, 0xFD, 0x28, 0xDA, 0x16, 0x4D, 0x31, 0xD0, 0x0E, 0xE0, 0x35, + 0x6F, 0x16, 0xF1, 0x2A, 0xE5, 0x1E, 0x02, 0x20, 0x28, 0x20, 0xE6, 0x19, + 0x3A, 0x20, 0xCF, 0x14, 0xE3, 0x23, 0xA0, 0x0F, 0x29, 0x2C, 0x11, 0x0C, + 0x48, 0x30, 0xD5, 0x0C, 0x84, 0x29, 0xA4, 0x10, 0x32, 0x22, 0x67, 0x19, + 0x8E, 0x27, 0xE0, 0x20, 0x75, 0x30, 0x7B, 0x1C, 0x3B, 0x32, 0xDC, 0x12, + 0xD6, 0x26, 0x27, 0x13, 0xC3, 0x11, 0xE6, 0x18, 0xA8, 0x03, 0x45, 0x16, + 0x1C, 0x04, 0xEB, 0x0C, 0xFA, 0x05, 0x86, 0x07, 0x34, 0xFE, 0x20, 0x0C, + 0x1D, 0xFB, 0x7B, 0x0C, 0x1B, 0xFD, 0x02, 0x01, 0xCA, 0xF5, 0xC9, 0xF9, + 0x20, 0xED, 0xFE, 0xF9, 0x21, 0xEE, 0x4D, 0xFF, 0x49, 0xF4, 0x12, 0x09, + 0x83, 0xFF, 0x51, 0x11, 0xD1, 0x10, 0xAD, 0x15, 0x0C, 0x19, 0x3E, 0x18, + 0x07, 0x12, 0xB0, 0x14, 0x60, 0x03, 0xDA, 0x06, 0x55, 0xF6, 0xCE, 0xF4, + 0x1D, 0xF5, 0x74, 0xE7, 0x97, 0xF5, 0xE5, 0xE6, 0x12, 0xEC, 0x61, 0xEF, + 0xA3, 0xE1, 0xD4, 0xF9, 0xB5, 0xDF, 0xD7, 0xFF, 0x0C, 0xE1, 0x56, 0xFC, + 0xCB, 0xE2, 0xF1, 0xF2, 0xE7, 0xE9, 0xB9, 0xE9, 0x85, 0xF1, 0x7B, 0xE8, + 0x58, 0xFC, 0x5D, 0xED, 0x12, 0x0B, 0xB1, 0xEE, 0x02, 0x10, 0xD0, 0xEE, + 0x9A, 0x06, 0x29, 0xF3, 0xD2, 0xF9, 0x97, 0xF2, 0x38, 0xF4, 0x9D, 0xE5, + 0x10, 0xF3, 0x67, 0xD6, 0xF9, 0xEE, 0xA7, 0xD2, 0x7E, 0xDE, 0x18, 0xDB, + 0xCA, 0xCC, 0xA3, 0xE4, 0xDC, 0xC7, 0xD8, 0xE6, 0x91, 0xCA, 0x84, 0xE4, + 0x83, 0xCF, 0xBD, 0xE0, 0x7C, 0xD4, 0xE4, 0xDB, 0xCA, 0xD8, 0x4F, 0xD3, + 0x9C, 0xD6, 0x82, 0xC4, 0xEB, 0xD1, 0xFE, 0xBA, 0xA9, 0xD1, 0xF4, 0xC1, + 0xBE, 0xD1, 0x48, 0xD1, 0x20, 0xD3, 0xC7, 0xDB, 0x02, 0xDD, 0x0A, 0xDB, + 0x8E, 0xEC, 0xAE, 0xD2, 0xA6, 0xF1, 0x59, 0xD0, 0x1E, 0xEB, 0x3E, 0xD6, + 0xBD, 0xE3, 0xCC, 0xD9, 0xDE, 0xE0, 0x0F, 0xDD, 0xEE, 0xE5, 0xC5, 0xDF, + 0x1D, 0xF0, 0x48, 0xE2, 0x94, 0xF3, 0x84, 0xED, 0x03, 0xEB, 0x5C, 0xFC, + 0x34, 0xE2, 0x7A, 0x08, 0x28, 0xE8, 0xBA, 0x0E, 0x96, 0xF9, 0x3A, 0x0F, + 0x00, 0x06, 0x1A, 0x0C, 0x15, 0x03, 0x15, 0x07, 0x51, 0xF5, 0x5E, 0x05, + 0x2B, 0xEA, 0x01, 0x07, 0xED, 0xEB, 0x14, 0x09, 0xAA, 0xF9, 0xFC, 0x08, + 0xE4, 0x04, 0x9D, 0x0B, 0x26, 0x07, 0x3B, 0x11, 0x80, 0x0E, 0xF1, 0x14, + 0x1E, 0x1F, 0x1C, 0x16, 0x2F, 0x26, 0x6A, 0x12, 0x80, 0x24, 0x26, 0x0D, + 0xC5, 0x2D, 0x5E, 0x0D, 0xE2, 0x39, 0x11, 0x10, 0xEF, 0x35, 0x68, 0x14, + 0xFD, 0x20, 0x77, 0x1E, 0x68, 0x0E, 0x66, 0x25, 0x12, 0x0B, 0x79, 0x1F, + 0xC7, 0x0E, 0xAC, 0x14, 0xD6, 0x11, 0xE2, 0x13, 0xB9, 0x12, 0xCF, 0x1C, + 0x8E, 0x15, 0xBC, 0x23, 0xE4, 0x1E, 0xFE, 0x26, 0xF8, 0x2D, 0x5F, 0x27, + 0x46, 0x34, 0xE4, 0x25, 0xF6, 0x26, 0xCF, 0x28, 0xFE, 0x16, 0x82, 0x2C, + 0x44, 0x17, 0x92, 0x26, 0xC6, 0x23, 0xF9, 0x18, 0x13, 0x2E, 0x70, 0x0F, + 0xA1, 0x2D, 0x78, 0x0E, 0xA1, 0x1D, 0xA5, 0x11, 0x6D, 0x03, 0x1D, 0x12, + 0x19, 0xF2, 0x0E, 0x15, 0x5E, 0xF4, 0x2C, 0x1B, 0xE5, 0x02, 0x76, 0x1A, + 0x64, 0x10, 0xBE, 0x17, 0x80, 0x18, 0xE7, 0x15, 0xFA, 0x15, 0xA7, 0x10, + 0x7C, 0x09, 0xA6, 0x09, 0x54, 0xFD, 0x1B, 0x05, 0xCD, 0xF8, 0x5C, 0x03, + 0x06, 0x05, 0xE3, 0xFF, 0x17, 0x14, 0xAD, 0xFE, 0x88, 0x0E, 0x30, 0x03, + 0x28, 0xFC, 0xE5, 0x03, 0xAD, 0xF2, 0xE4, 0xFA, 0x58, 0xF3, 0x3E, 0xF1, + 0xF2, 0xF5, 0x1B, 0xE8, 0xFE, 0xF7, 0x1F, 0xDF, 0x79, 0xF3, 0xBC, 0xE2, + 0xA5, 0xEE, 0xF2, 0xEB, 0xE9, 0xED, 0xF3, 0xEE, 0xA2, 0xF1, 0x53, 0xEF, + 0xF9, 0xF2, 0x01, 0xEF, 0x20, 0xE7, 0xC0, 0xED, 0x4A, 0xD5, 0x70, 0xE7, + 0x75, 0xCD, 0x57, 0xDB, 0xF1, 0xD7, 0xFF, 0xCE, 0xB5, 0xE2, 0xCC, 0xC6, + 0x52, 0xE1, 0x8A, 0xC3, 0x34, 0xE3, 0xF0, 0xC6, 0xE3, 0xEE, 0x78, 0xCC, + 0x18, 0xF0, 0x31, 0xCE, 0x05, 0xDD, 0x3D, 0xD3, 0x8E, 0xD0, 0x37, 0xE1, + 0x9E, 0xD7, 0xAC, 0xF1, 0x05, 0xE4, 0x1A, 0xFD, 0xDB, 0xEF, 0xDA, 0x01, + 0x24, 0xF4, 0x40, 0x01, 0xA6, 0xE9, 0x25, 0xFE, 0xD3, 0xDF, 0x37, 0xF8, + 0xB3, 0xDE, 0x18, 0xF0, 0x2E, 0xD9, 0xD5, 0xEA, 0x49, 0xD1, 0xD2, 0xE5, + 0x2E, 0xD5, 0x00, 0xE6, 0x79, 0xE2, 0xD5, 0xEB, 0x0F, 0xF1, 0x1C, 0xED, + 0xD8, 0xFB, 0xAB, 0xEE, 0xF8, 0xFC, 0x68, 0xF8, 0xD8, 0xF9, 0x60, 0x05, + 0x90, 0xF8, 0xE8, 0x0A, 0xCD, 0xF7, 0x4E, 0x0A, 0x9C, 0x03, 0x12, 0x04, + 0x52, 0x17, 0x69, 0xF5, 0x40, 0x17, 0xEB, 0xE9, 0xF4, 0x07, 0xA0, 0xEA, + 0x2D, 0xFE, 0x75, 0xF3, 0x01, 0xFF, 0xF8, 0xF9, 0x0A, 0x08, 0x0E, 0xFC, + 0x35, 0x10, 0xC1, 0x02, 0xFC, 0x13, 0x38, 0x08, 0xE2, 0x16, 0x3A, 0x04, + 0x2D, 0x15, 0x81, 0xFC, 0xB5, 0x0B, 0xFE, 0xF4, 0x65, 0x00, 0xA1, 0xF5, + 0x3E, 0xFC, 0xA0, 0xFE, 0x39, 0xFF, 0x80, 0x0A, 0x2C, 0x03, 0x19, 0x18, + 0x8E, 0x04, 0xCD, 0x1F, 0x81, 0x02, 0x81, 0x1D, 0x46, 0x00, 0x31, 0x15, + 0x74, 0x03, 0xCC, 0x04, 0xA7, 0x0C, 0x3C, 0xF2, 0xA5, 0x13, 0xA4, 0xF1, + 0x8A, 0x13, 0x40, 0x04, 0xD2, 0x11, 0xEB, 0x1B, 0x8C, 0x14, 0x76, 0x24, + 0x0F, 0x1B, 0x2C, 0x1F, 0x89, 0x1B, 0x3A, 0x1B, 0x16, 0x0E, 0x8D, 0x14, + 0x33, 0xFF, 0xB1, 0x0C, 0xCC, 0xFF, 0x1F, 0x09, 0xC1, 0x04, 0x1F, 0x0B, + 0xA8, 0x04, 0xEE, 0x13, 0xE1, 0x02, 0x3C, 0x1D, 0xCD, 0xFE, 0xBF, 0x20, + 0xF7, 0xFE, 0x2D, 0x1B, 0x13, 0x07, 0x2D, 0x0F, 0x89, 0x13, 0xB1, 0x07, + 0xD5, 0x1D, 0xB0, 0x0C, 0x11, 0x1F, 0x68, 0x14, 0xE5, 0x13, 0xEB, 0x15, + 0x4D, 0x05, 0xC7, 0x19, 0xA6, 0xFE, 0x73, 0x1D, 0xA9, 0xFC, 0xDD, 0x19, + 0x73, 0xFF, 0x25, 0x11, 0x1E, 0x05, 0xCD, 0x07, 0x69, 0x03, 0x41, 0x00, + 0x75, 0xFD, 0xB8, 0xF5, 0xD1, 0xF7, 0x26, 0xEF, 0x5D, 0xF3, 0xAD, 0xEF, + 0xB8, 0xF3, 0x2C, 0xEE, 0x4F, 0xF5, 0xDC, 0xED, 0xE0, 0xF9, 0xC8, 0xF7, + 0x9D, 0x00, 0x62, 0x05, 0x82, 0x03, 0xE2, 0x05, 0x43, 0x0D, 0x9F, 0xF9, + 0x63, 0x1C, 0x62, 0xF0, 0xA8, 0x1B, 0x03, 0xF4, 0x22, 0x09, 0xB0, 0xFD, + 0xD3, 0xFD, 0x3D, 0x06, 0x6F, 0x09, 0xE8, 0x0D, 0x0E, 0x1B, 0x3D, 0x12, + 0x23, 0x20, 0x74, 0x13, 0x1C, 0x1A, 0x90, 0x0F, 0x39, 0x0E, 0x63, 0x03, + 0x25, 0x02, 0x01, 0xFA, 0xFE, 0xFE, 0x04, 0xFE, 0xC7, 0x04, 0x0B, 0x08, + 0x4C, 0x09, 0x58, 0x13, 0xB9, 0x0B, 0xB0, 0x19, 0x53, 0x0C, 0x99, 0x14, + 0xB0, 0x07, 0x57, 0x0F, 0x1B, 0x03, 0xBC, 0x0E, 0x6A, 0x04, 0x6D, 0x0F, + 0xBE, 0x0E, 0x60, 0x12, 0xA2, 0x1D, 0x31, 0x19, 0x8E, 0x1E, 0x80, 0x20, + 0x86, 0x1C, 0x87, 0x28, 0xE8, 0x26, 0x97, 0x28, 0x7D, 0x26, 0x14, 0x10, + 0xAC, 0x23, 0x68, 0xF7, 0x6C, 0x2B, 0x7C, 0xF4, 0xAF, 0x2C, 0x52, 0x02, + 0x20, 0x2C, 0x49, 0x1E, 0x72, 0x38, 0x62, 0x3E, 0xA7, 0x51, 0x9C, 0x57, + 0x2A, 0x5D, 0x2B, 0x5E, 0xED, 0x54, 0x38, 0x57, 0x4F, 0x58, 0x60, 0x5A, + 0x18, 0x4C, 0x77, 0x5A, 0x91, 0x3D, 0xFC, 0x58, 0xF7, 0x53, 0x6F, 0x60, + 0x6B, 0x49, 0x32, 0x3E, 0xCB, 0x29, 0xC3, 0x14, 0x1C, 0x3B, 0xED, 0x32, + 0xB5, 0x54, 0x98, 0x58, 0x12, 0x42, 0x38, 0x43, 0x38, 0x29, 0x7E, 0x2A, + 0x9C, 0x18, 0x64, 0x1F, 0xD5, 0xFF, 0x6B, 0x0A, 0x38, 0xEC, 0xF0, 0xF0, + 0x9D, 0xD1, 0x2A, 0xCC, 0x46, 0xBF, 0xBB, 0xB8, 0x72, 0xB6, 0xE8, 0xB6, + 0xA2, 0xA8, 0x07, 0xB3, 0x7D, 0xAC, 0x01, 0xB3, 0x80, 0xB2, 0xD7, 0xA7, + 0x59, 0xAB, 0x19, 0xA6, 0xCB, 0xA7, 0xD5, 0xB9, 0x41, 0xA4, 0x0B, 0xBA, + 0xFA, 0x9B, 0xB9, 0xA2, 0xF7, 0xAC, 0x80, 0xA8, 0x60, 0xCC, 0x7A, 0xC9, + 0x2F, 0xC0, 0x7F, 0xCC, 0x79, 0xB4, 0x6D, 0xC7, 0xEC, 0xC5, 0x67, 0xD0, + 0x0B, 0xCF, 0xD9, 0xD0, 0xF1, 0xD4, 0x53, 0xD9, 0x5D, 0xE0, 0xDA, 0xE8, + 0xA1, 0xED, 0xAE, 0xF2, 0x2A, 0x0A, 0x7E, 0x16, 0xFB, 0x18, 0x35, 0x2D, + 0x0C, 0x04, 0xFE, 0x1A, 0xFE, 0x05, 0xE3, 0x1D, 0x2A, 0x06, 0xC6, 0x1D, + 0x04, 0xF7, 0x6F, 0x05, 0xB8, 0x0E, 0xA8, 0x0E, 0x82, 0x2D, 0x54, 0x32, + 0x37, 0x26, 0x98, 0x30, 0xAF, 0x20, 0x71, 0x1B, 0xEE, 0x26, 0x43, 0x20, + 0xAD, 0x15, 0xE5, 0x14, 0x2F, 0xFC, 0xA2, 0xEE, 0x5B, 0x06, 0x76, 0xEA, + 0x5B, 0x12, 0xCF, 0xE8, 0xDE, 0xFB, 0x1A, 0xCF, 0x30, 0xF3, 0x69, 0xC9, + 0x0F, 0xEF, 0xF4, 0xD6, 0x8E, 0xD4, 0x93, 0xD2, 0x36, 0xB3, 0x87, 0xAD, + 0x29, 0xB2, 0xB5, 0xA7, 0x0B, 0xC6, 0x10, 0xC2, 0xEB, 0xB2, 0x74, 0xB0, + 0x89, 0xA3, 0x42, 0xA8, 0x48, 0xAC, 0xB8, 0xC0, 0x3D, 0xA8, 0x4A, 0xBA, + 0x5D, 0xAB, 0xF9, 0xB5, 0x3D, 0xB2, 0xAD, 0xC1, 0xC8, 0xAB, 0x75, 0xB4, + 0xEE, 0xA8, 0x3B, 0xA7, 0xAD, 0xB0, 0x6F, 0xB1, 0xE9, 0xB4, 0x8F, 0xBA, + 0xE2, 0xB7, 0xB7, 0xC4, 0x04, 0xCF, 0xDC, 0xDF, 0x93, 0xED, 0x66, 0xF8, + 0xC4, 0x05, 0xB4, 0x03, 0x63, 0x19, 0x77, 0x09, 0x2A, 0x28, 0xF7, 0x14, + 0x26, 0x25, 0x9D, 0x1B, 0xC9, 0x16, 0x41, 0x17, 0x5B, 0x1A, 0xBD, 0x1E, + 0x8B, 0x1C, 0xDF, 0x21, 0x53, 0x19, 0xFC, 0x17, 0x6F, 0x34, 0xFB, 0x23, + 0xAD, 0x47, 0x45, 0x2B, 0x74, 0x3F, 0x0C, 0x1F, 0xC8, 0x34, 0xD6, 0x21, + 0xC7, 0x22, 0xB3, 0x22, 0x27, 0x09, 0x8B, 0x0E, 0x18, 0xF9, 0xAC, 0x00, + 0xC9, 0xF8, 0x24, 0xFB, 0xCF, 0xF4, 0x0A, 0xF4, 0xCF, 0xEC, 0x32, 0xF5, + 0xA2, 0xDD, 0xEF, 0xE6, 0xBC, 0xC5, 0x23, 0xC7, 0xC6, 0xBD, 0xA2, 0xB5, + 0xFB, 0xC5, 0xCC, 0xB5, 0x40, 0xC7, 0xD8, 0xBD, 0xFB, 0xC6, 0xBF, 0xCC, + 0xDB, 0xD0, 0xA4, 0xE1, 0xB7, 0xDE, 0xD3, 0xEB, 0x5C, 0xE0, 0xF5, 0xDE, + 0x91, 0xDB, 0x30, 0xCE, 0x10, 0xE1, 0xB2, 0xD4, 0xF3, 0xE7, 0x6D, 0xE5, + 0xAE, 0xEB, 0xA9, 0xEA, 0x78, 0xE6, 0x4F, 0xE5, 0x92, 0xEC, 0x7F, 0xED, + 0x1B, 0x0E, 0x91, 0x0E, 0x5C, 0x17, 0xB2, 0x1A, 0x3C, 0x09, 0x74, 0x0C, + 0x43, 0x14, 0xC4, 0x10, 0xD3, 0x15, 0x66, 0x17, 0xC5, 0x03, 0xF8, 0x0A, + 0x1A, 0x07, 0xD1, 0x05, 0x1C, 0x20, 0xB9, 0x11, 0xF4, 0x2D, 0x8B, 0x1E, + 0xE8, 0x1E, 0xA5, 0x26, 0x7E, 0x07, 0xFB, 0x24, 0x37, 0x07, 0xE7, 0x24, + 0xE5, 0x17, 0x04, 0x2A, 0xE7, 0x1D, 0x9C, 0x26, 0xD6, 0x20, 0xB0, 0x25, + 0xF6, 0x20, 0xA3, 0x27, 0x47, 0x14, 0xAB, 0x24, 0x50, 0x0A, 0xD0, 0x22, + 0xEC, 0x08, 0x7C, 0x20, 0xF3, 0x00, 0x86, 0x0F, 0xC5, 0xFD, 0x38, 0x00, + 0x0D, 0x05, 0xF3, 0xFA, 0xE1, 0x11, 0x37, 0x05, 0x63, 0x1B, 0x0C, 0x21, + 0x10, 0x25, 0x36, 0x39, 0x97, 0x35, 0xE0, 0x45, 0xD4, 0x3D, 0x8B, 0x4D, + 0x79, 0x4A, 0x7B, 0x58, 0x89, 0x5B, 0x7D, 0x5F, 0x8D, 0x54, 0xCC, 0x5B, + 0xBC, 0x48, 0xDD, 0x55, 0x4A, 0x53, 0xAD, 0x55, 0x1F, 0x5B, 0xA4, 0x57, + 0xF9, 0x58, 0x4E, 0x5C, 0xAE, 0x5D, 0xF8, 0x5B, 0xC4, 0x5E, 0x43, 0x5D, + 0x77, 0x58, 0xA2, 0x5D, 0xF6, 0x5A, 0x24, 0x54, 0xE1, 0x5D, 0x97, 0x54, + 0x72, 0x54, 0x15, 0x5A, 0x2D, 0x47, 0x5A, 0x56, 0xFE, 0x49, 0x12, 0x54, + 0x73, 0x5C, 0x6F, 0x57, 0x43, 0x60, 0x69, 0x4D, 0xD4, 0x5D, 0xB8, 0x3F, + 0xE8, 0x60, 0x1E, 0x3B, 0x99, 0x54, 0x28, 0x2B, 0xE0, 0x46, 0x9A, 0x23, + 0xD5, 0x41, 0x7F, 0x32, 0x54, 0x3F, 0xF6, 0x3C, 0x34, 0x48, 0x1C, 0x4B, + 0xE6, 0x4F, 0x50, 0x4F, 0x11, 0x3D, 0xE4, 0x34, 0xBD, 0x1F, 0xC4, 0x20, + 0x30, 0x17, 0xFC, 0x23, 0x90, 0x1D, 0x6D, 0x2A, 0x14, 0x26, 0x9F, 0x2B, + 0x15, 0x2D, 0x50, 0x2E, 0x2D, 0x2F, 0xB9, 0x30, 0xF9, 0x2B, 0x4D, 0x2A, + 0x25, 0x1C, 0x97, 0x15, 0x1E, 0x06, 0x07, 0xFD, 0x89, 0xF6, 0x3E, 0xF2, + 0x0A, 0xEC, 0xD1, 0xF2, 0x23, 0xE6, 0x50, 0xF3, 0x70, 0xDE, 0x4D, 0xED, + 0x32, 0xF3, 0x9C, 0xF2, 0x19, 0x09, 0x75, 0xF9, 0x26, 0xF2, 0x85, 0xEF, + 0xEB, 0xE5, 0x6B, 0xF4, 0xCE, 0xE7, 0x29, 0x03, 0x70, 0xE8, 0x8A, 0x0F, + 0x8E, 0xF9, 0x33, 0x1D, 0xCF, 0x00, 0xF7, 0x19, 0x14, 0xF4, 0x3D, 0x0A, + 0x5D, 0xE5, 0x0A, 0xF7, 0xC4, 0xD6, 0xA6, 0xDD, 0xB7, 0xCA, 0xFB, 0xCE, + 0x30, 0xBC, 0x13, 0xC9, 0x95, 0xB1, 0x1F, 0xC8, 0x9A, 0xAB, 0x66, 0xC4, + 0xDE, 0xAF, 0xC9, 0xBB, 0x42, 0xB1, 0x83, 0xB2, 0x57, 0xAF, 0x51, 0xAC, + 0x6D, 0xBA, 0x2C, 0xB9, 0x03, 0xB3, 0xE9, 0xBE, 0xB8, 0xA5, 0x01, 0xB4, + 0x68, 0xA7, 0x8A, 0xAD, 0x37, 0xA2, 0x1A, 0xA5, 0x10, 0x9F, 0xE6, 0xA1, + 0x8E, 0xA5, 0x68, 0xAA, 0x91, 0xB1, 0xF4, 0xB1, 0xAC, 0xC6, 0x9D, 0xBC, + 0x52, 0xD6, 0x33, 0xC3, 0xE7, 0xD7, 0x37, 0xBE, 0xA4, 0xE9, 0x6E, 0xCB, + 0xBC, 0x06, 0xA7, 0xE0, 0x2D, 0x08, 0x57, 0xE3, 0xC9, 0xFD, 0xDF, 0xEA, + 0x9D, 0xF0, 0xAD, 0xFC, 0xF9, 0xE9, 0x85, 0x0D, 0x13, 0x01, 0x2A, 0x1C, + 0x2E, 0x1B, 0x82, 0x1F, 0xF8, 0x21, 0xF3, 0x1A, 0x0F, 0x27, 0x63, 0x1E, + 0xA7, 0x35, 0xE5, 0x2A, 0x1F, 0x2F, 0x31, 0x25, 0xDD, 0x13, 0xD4, 0x11, + 0x61, 0x15, 0x3E, 0x16, 0x85, 0x16, 0x41, 0x23, 0x4C, 0x05, 0xD2, 0x1F, + 0x24, 0x0D, 0xA1, 0x16, 0x55, 0x15, 0x00, 0x09, 0x43, 0x0F, 0xCF, 0xFC, + 0x00, 0x14, 0x18, 0x01, 0xAD, 0x0E, 0x6F, 0x00, 0x6C, 0xFB, 0x10, 0xF8, + 0xCD, 0xFF, 0x98, 0x00, 0xD6, 0x15, 0x98, 0x11, 0x29, 0x1C, 0xA9, 0x16, + 0x1F, 0x18, 0x0D, 0x0F, 0x86, 0x16, 0xF2, 0xFF, 0x2D, 0x18, 0x38, 0xF4, + 0xCF, 0x22, 0x3C, 0xFB, 0x5B, 0x23, 0xCA, 0x05, 0x9F, 0x21, 0xC1, 0x0A, + 0xBE, 0x2F, 0x4C, 0x10, 0xFA, 0x45, 0xAE, 0x1D, 0xAC, 0x4A, 0xAF, 0x2C, + 0x8E, 0x37, 0xBB, 0x37, 0x27, 0x29, 0xA2, 0x3F, 0x92, 0x22, 0xCF, 0x35, + 0xCC, 0x20, 0x82, 0x1C, 0xD5, 0x26, 0x9A, 0x09, 0xA8, 0x28, 0x9B, 0x04, + 0x3A, 0x18, 0x06, 0x00, 0xEB, 0x06, 0x3D, 0xFC, 0xC6, 0x00, 0x00, 0x03, + 0x2A, 0xFE, 0x18, 0x12, 0xD4, 0x03, 0x9D, 0x1F, 0x23, 0x0B, 0xDF, 0x19, + 0x61, 0xFD, 0xDE, 0x05, 0x6A, 0xEE, 0x42, 0xFD, 0xDA, 0xEC, 0xFB, 0xFD, + 0xFC, 0xE4, 0x20, 0xFF, 0xA2, 0xE8, 0x4F, 0x07, 0x33, 0xF3, 0x35, 0x0B, + 0x40, 0xEC, 0x42, 0x00, 0x6E, 0xED, 0x19, 0xFC, 0x9C, 0xF8, 0x37, 0xF9, + 0x20, 0xF1, 0xB5, 0xDB, 0xDD, 0xE5, 0x39, 0xC4, 0x63, 0xEB, 0xBE, 0xCF, + 0xE8, 0xF2, 0xCC, 0xE2, 0x85, 0xE0, 0x2C, 0xE7, 0x17, 0xC7, 0x7F, 0xE0, + 0xC9, 0xC4, 0x67, 0xD7, 0x5A, 0xD3, 0x49, 0xD3, 0xB2, 0xD7, 0x18, 0xCF, + 0xF4, 0xCD, 0xF2, 0xCB, 0xD2, 0xCF, 0xCA, 0xDD, 0xD5, 0xDE, 0x55, 0xFC, + 0x37, 0xED, 0x1C, 0x0C, 0x6E, 0xEB, 0xDF, 0x06, 0xE6, 0xE9, 0x10, 0x06, + 0x44, 0xE8, 0x47, 0xFC, 0x93, 0xED, 0x03, 0xF6, 0x53, 0xFA, 0x3B, 0x08, + 0x4B, 0xF2, 0x2F, 0x07, 0x94, 0xE0, 0x5F, 0xF7, 0x4E, 0xD4, 0xCB, 0xF1, + 0x49, 0xD9, 0x20, 0xF0, 0x25, 0xDD, 0xC9, 0xDF, 0x8F, 0xD6, 0xD5, 0xD1, + 0x29, 0xD8, 0xEB, 0xD3, 0x10, 0xD2, 0x87, 0xC9, 0xD5, 0xBC, 0xCC, 0xB5, + 0xBF, 0xAE, 0x2C, 0xAB, 0x81, 0xAE, 0xCA, 0xA4, 0xD9, 0xAD, 0x0B, 0xA0, + 0x57, 0xB5, 0x19, 0xA7, 0x69, 0xC9, 0xEE, 0xB6, 0x8F, 0xD6, 0xD5, 0xC1, + 0xBC, 0xDA, 0xCA, 0xCC, 0xCE, 0xD9, 0xB5, 0xDA, 0x6A, 0xD9, 0x08, 0xE1, + 0xED, 0xD6, 0x2D, 0xE5, 0x00, 0xD1, 0xB0, 0xE9, 0x2B, 0xD1, 0x3C, 0xF2, + 0x7E, 0xD2, 0x69, 0xFA, 0xEC, 0xD0, 0x48, 0xF5, 0xD7, 0xD2, 0xF7, 0xF0, + 0x5A, 0xD5, 0x4F, 0xF0, 0x7A, 0xD2, 0x19, 0xF1, 0x47, 0xD0, 0x68, 0xF3, + 0x67, 0xDF, 0x5A, 0xF4, 0xEE, 0x04, 0x0B, 0x00, 0xD9, 0x1C, 0x42, 0x08, + 0xB2, 0x18, 0x72, 0x0D, 0x5B, 0x0F, 0xAA, 0x16, 0x8A, 0x0B, 0x83, 0x1F, + 0x13, 0x02, 0x93, 0x1D, 0x3C, 0xFE, 0xC1, 0x0C, 0xF5, 0x0E, 0x7D, 0x09, + 0x65, 0x13, 0xA4, 0x05, 0xBE, 0x02, 0xAF, 0xFA, 0x89, 0x01, 0x5C, 0xFE, + 0x46, 0x03, 0x56, 0xFC, 0x74, 0xF9, 0x1E, 0xFB, 0x0D, 0x01, 0x80, 0x00, + 0xF9, 0x07, 0x99, 0xF4, 0x68, 0x07, 0xBE, 0xEE, 0xC8, 0x09, 0x52, 0xF1, + 0x1B, 0xF9, 0x0A, 0xED, 0xB1, 0xDC, 0xA3, 0xE6, 0x83, 0xCB, 0xBC, 0xD1, + 0xFD, 0xC6, 0x22, 0xBB, 0x18, 0xC8, 0x34, 0xB3, 0xF6, 0xC6, 0x95, 0xB4, + 0xC3, 0xC4, 0x3C, 0xBF, 0x1F, 0xC0, 0x71, 0xBF, 0xC7, 0xBD, 0xD4, 0xB4, + 0x5A, 0xC4, 0xCC, 0xB5, 0x6C, 0xD0, 0x40, 0xC2, 0xBA, 0xDB, 0x74, 0xD2, + 0x27, 0xE2, 0xA2, 0xDC, 0x81, 0xF3, 0xB5, 0xEA, 0xA5, 0x01, 0xAA, 0xFE, + 0x09, 0xEE, 0x81, 0xFA, 0x87, 0xDE, 0x55, 0xF3, 0xB7, 0xED, 0xE0, 0x05, + 0x2A, 0xFE, 0x07, 0x12, 0x23, 0x0B, 0x2B, 0x16, 0xF2, 0x23, 0xCF, 0x29, + 0xDF, 0x39, 0xC2, 0x2F, 0xB7, 0x34, 0xA5, 0x1A, 0x10, 0x34, 0xAB, 0x1A, + 0x78, 0x27, 0x51, 0x1D, 0x9B, 0x0D, 0x6E, 0x12, 0xC8, 0x14, 0x75, 0x12, + 0x7D, 0x17, 0x75, 0x02, 0x86, 0x1E, 0x27, 0xF2, 0xB9, 0x27, 0xC6, 0xF3, + 0x96, 0x10, 0xF7, 0xF5, 0x88, 0xF1, 0x5B, 0xF8, 0x67, 0xD9, 0xFA, 0xF2, + 0xB5, 0xD8, 0xE8, 0xE8, 0x0C, 0xDD, 0x8C, 0xD7, 0x57, 0xDB, 0x03, 0xC5, + 0x0C, 0xEC, 0xDB, 0xC8, 0xEF, 0xFF, 0xE2, 0xD6, 0xBD, 0x06, 0x3F, 0xDB, + 0x0A, 0x0C, 0x70, 0xE4, 0xE3, 0x0C, 0xCA, 0xED, 0x8E, 0x08, 0x64, 0xFA, + 0xF8, 0x0D, 0x91, 0x12, 0x7D, 0x23, 0x5B, 0x2B, 0x88, 0x39, 0x1C, 0x45, + 0xB4, 0x3C, 0x87, 0x54, 0x6A, 0x33, 0xD7, 0x5C, 0x75, 0x37, 0x69, 0x67, + 0x46, 0x3B, 0x1C, 0x61, 0xEB, 0x35, 0x82, 0x54, 0xA9, 0x40, 0x44, 0x5A, + 0xE7, 0x53, 0x3F, 0x5A, 0x64, 0x5B, 0x0B, 0x4A, 0xC5, 0x5B, 0xE0, 0x49, + 0x67, 0x4F, 0xC9, 0x46, 0x6A, 0x3F, 0x50, 0x44, 0x81, 0x36, 0x54, 0x51, + 0xE8, 0x28, 0x61, 0x42, 0xFE, 0x32, 0xAF, 0x35, 0x95, 0x51, 0x55, 0x4B, + 0xD1, 0x4A, 0x2D, 0x50, 0x77, 0x35, 0xD6, 0x44, 0xF9, 0x39, 0x22, 0x45, + 0xC6, 0x45, 0xDA, 0x41, 0xF6, 0x53, 0x51, 0x38, 0x44, 0x5D, 0xAE, 0x3B, + 0x64, 0x5C, 0x77, 0x45, 0x5A, 0x5B, 0x80, 0x47, 0x80, 0x54, 0xA6, 0x45, + 0x37, 0x49, 0xC0, 0x44, 0x87, 0x44, 0xB9, 0x48, 0x6B, 0x41, 0xAF, 0x4A, + 0x52, 0x3C, 0xA4, 0x44, 0x5C, 0x2A, 0x1B, 0x2B, 0x4D, 0x1B, 0xE3, 0x0F, + 0xDB, 0x0E, 0x18, 0x04, 0x0F, 0xF3, 0x6B, 0x07, 0xE4, 0xF0, 0xCF, 0x1B, + 0x48, 0xFB, 0x77, 0x1D, 0xF3, 0xF9, 0x64, 0x17, 0x1D, 0x06, 0xC1, 0x24, + 0xD0, 0x0F, 0xCF, 0x23, 0x66, 0x0A, 0xCF, 0x13, 0x41, 0x0A, 0x05, 0x0B, + 0x35, 0x17, 0x1E, 0x0F, 0x78, 0x18, 0xEA, 0x17, 0x71, 0x03, 0xF1, 0x12, + 0x3E, 0x0B, 0xE6, 0x1C, 0xD3, 0x25, 0xCD, 0x2E, 0xFD, 0x28, 0x11, 0x32, + 0x87, 0x19, 0xD5, 0x2F, 0xC8, 0x06, 0x2F, 0x24, 0x4A, 0x03, 0xAA, 0x17, + 0x9C, 0x12, 0x5C, 0x0F, 0x08, 0x20, 0xE1, 0x06, 0x1C, 0x1D, 0x42, 0x04, + 0x24, 0x1B, 0x9C, 0xFB, 0x4C, 0x0C, 0xD4, 0xE4, 0x03, 0xFE, 0xE4, 0xE5, + 0x49, 0xF7, 0x8E, 0xE8, 0x05, 0xE4, 0xE1, 0xD4, 0x07, 0xEB, 0xB0, 0xDF, + 0xD7, 0xFB, 0x6C, 0xEE, 0x54, 0xF2, 0x75, 0xD9, 0x6E, 0xEA, 0x55, 0xD0, + 0x6E, 0xEB, 0xE3, 0xD7, 0xE6, 0xEA, 0x24, 0xDC, 0xC4, 0xEA, 0x40, 0xDB, + 0xCD, 0xE8, 0xF0, 0xC9, 0x79, 0xE9, 0x07, 0xC0, 0xE9, 0xE0, 0x24, 0xB8, + 0xA8, 0xDA, 0xE9, 0xB2, 0x5E, 0xEF, 0x37, 0xCD, 0x4B, 0xF0, 0xC4, 0xDA, + 0x46, 0xDE, 0x9B, 0xDB, 0xA9, 0xF0, 0x86, 0xF7, 0x73, 0xFA, 0xD5, 0x06, + 0x2F, 0xF2, 0xD4, 0xFA, 0x01, 0x0A, 0x8A, 0xFB, 0x7E, 0x25, 0x84, 0x0F, + 0x03, 0x25, 0x9E, 0x11, 0x06, 0x1D, 0xBA, 0x02, 0xC4, 0x26, 0x87, 0x08, + 0x5F, 0x2E, 0x5A, 0x15, 0xDB, 0x36, 0x03, 0x1C, 0x80, 0x43, 0xC5, 0x22, + 0xED, 0x34, 0x0A, 0x23, 0xD5, 0x1D, 0x70, 0x1E, 0x4F, 0x1D, 0x27, 0x1E, + 0x0D, 0x1C, 0xF2, 0x1C, 0xF1, 0xFB, 0x3B, 0x0B, 0xFC, 0xEA, 0x77, 0x0D, + 0xBF, 0xF7, 0xA8, 0x26, 0xFD, 0xEF, 0x8A, 0x1E, 0x90, 0xE5, 0xDB, 0x0D, + 0xFD, 0xF0, 0x71, 0x19, 0xFF, 0xFB, 0x0C, 0x1B, 0x5E, 0x01, 0x0F, 0x0D, + 0x98, 0x0E, 0xA0, 0x13, 0xF0, 0x14, 0x69, 0x15, 0xC7, 0x0D, 0x7E, 0x08, + 0x58, 0x17, 0xE8, 0x07, 0x71, 0x2E, 0xC4, 0x0C, 0xF4, 0x40, 0xA5, 0x18, + 0x4C, 0x42, 0xC7, 0x28, 0xCB, 0x29, 0x25, 0x2D, 0x58, 0x12, 0xDA, 0x2A, + 0x39, 0x03, 0x86, 0x1D, 0x73, 0xF7, 0xD6, 0x10, 0x93, 0x00, 0x66, 0x1A, + 0x7E, 0x09, 0x2F, 0x21, 0x70, 0xFB, 0x11, 0x18, 0xE7, 0xF6, 0x59, 0x17, + 0x2D, 0xF5, 0x5C, 0x0E, 0x22, 0xE5, 0x4C, 0xEB, 0xA7, 0xD1, 0xAF, 0xCC, + 0x93, 0xC4, 0x35, 0xCE, 0xE1, 0xC6, 0x31, 0xE5, 0xBA, 0xC5, 0x30, 0xEC, + 0xB1, 0xCC, 0x76, 0xEF, 0xFE, 0xD6, 0x90, 0xFF, 0x5A, 0xC5, 0xDF, 0x01, + 0xAF, 0xB8, 0x80, 0xF4, 0x97, 0xC6, 0xA8, 0xF0, 0x01, 0xD1, 0x86, 0xF2, + 0x66, 0xD9, 0xF8, 0xEB, 0x8C, 0xEC, 0x51, 0xDF, 0x7D, 0xEC, 0x44, 0xD3, + 0x39, 0xCE, 0x58, 0xD1, 0xAC, 0xAB, 0x84, 0xD2, 0x58, 0xA2, 0xA5, 0xDE, + 0x08, 0xB1, 0x03, 0xEE, 0xD2, 0xC4, 0x4B, 0xEB, 0x10, 0xD7, 0xF3, 0xE3, + 0xF3, 0xD8, 0x9F, 0xE7, 0xA9, 0xCF, 0x32, 0xEE, 0x88, 0xC9, 0xB5, 0xE7, + 0xE0, 0xCF, 0xC7, 0xE1, 0x74, 0xDC, 0x00, 0xDC, 0x56, 0xE1, 0x6B, 0xD9, + 0x56, 0xE5, 0x5B, 0xDE, 0xFE, 0xD6, 0xE5, 0xCD, 0xF9, 0xBA, 0xE3, 0xB8, + 0x60, 0xBA, 0x8D, 0xB8, 0xE4, 0xBA, 0x90, 0xB1, 0x8A, 0xB1, 0xE7, 0xA7, + 0x29, 0xC1, 0x58, 0xB7, 0x19, 0xCE, 0xE9, 0xC7, 0xC6, 0xBF, 0x5B, 0xBF, + 0x68, 0xBB, 0x70, 0xC0, 0xE8, 0xBC, 0xA7, 0xC2, 0x35, 0xBA, 0xCB, 0xB0, + 0xE3, 0xC6, 0x46, 0xA5, 0x17, 0xCB, 0x9B, 0xA2, 0xBD, 0xBA, 0x62, 0xA0, + 0x5C, 0xB9, 0x0F, 0xA4, 0xB1, 0xC3, 0x10, 0xAA, 0x05, 0xC0, 0xD5, 0xAD, + 0x2E, 0xAB, 0x1D, 0xA8, 0x1A, 0xA4, 0xEE, 0xAA, 0x2A, 0xAC, 0x7E, 0xBE, + 0x93, 0xAD, 0xBB, 0xC8, 0xC8, 0xBE, 0x6F, 0xD2, 0x34, 0xD4, 0x67, 0xE1, + 0x33, 0xC9, 0x4F, 0xDC, 0x68, 0xAF, 0xB8, 0xC8, 0x4E, 0xAC, 0x20, 0xC7, + 0x15, 0xB7, 0x1E, 0xCD, 0xD5, 0xB7, 0xF8, 0xC1, 0xA6, 0xC6, 0x16, 0xC3, + 0xA9, 0xD7, 0xFD, 0xD2, 0xFA, 0xCE, 0xA1, 0xD4, 0x65, 0xC0, 0x4B, 0xC7, + 0xC4, 0xB5, 0x85, 0xB9, 0x8C, 0xB8, 0x25, 0xC2, 0x7A, 0xC8, 0x7A, 0xD8, + 0x75, 0xDD, 0x1F, 0xE3, 0xA0, 0xF8, 0x95, 0xE6, 0x99, 0x15, 0xDF, 0xFA, + 0xA7, 0x17, 0x0F, 0x0C, 0x1A, 0x00, 0x80, 0x06, 0xE0, 0xF2, 0x64, 0x02, + 0x5B, 0xF3, 0x4F, 0x00, 0x21, 0xF9, 0x48, 0xFB, 0xD5, 0xF3, 0x74, 0xE9, + 0x8A, 0xF2, 0x60, 0xDC, 0xE8, 0xF0, 0xF3, 0xDA, 0x74, 0xD2, 0x24, 0xCA, + 0xB4, 0xC2, 0x02, 0xD1, 0x6B, 0xBB, 0x5C, 0xE6, 0xEB, 0xA9, 0xCA, 0xE2, + 0x22, 0xC0, 0x72, 0xE9, 0x6E, 0xE2, 0xC9, 0xF1, 0x53, 0xF6, 0xF8, 0xF5, + 0xA9, 0xFF, 0xD1, 0xFA, 0xFB, 0xF0, 0xC5, 0xF1, 0x47, 0xE6, 0x8C, 0xF1, + 0xF0, 0xEB, 0xFC, 0xF9, 0xD2, 0xF6, 0xD4, 0xFC, 0x7C, 0x08, 0xC9, 0x05, + 0x16, 0x08, 0x62, 0x09, 0x30, 0xF3, 0xA5, 0x03, 0xAC, 0xE2, 0x5B, 0xFE, + 0xD2, 0xDE, 0x88, 0xF6, 0x69, 0xDF, 0xB1, 0xEB, 0x9E, 0xDD, 0x3E, 0xE5, + 0xCF, 0xF2, 0xDB, 0xF1, 0x32, 0x06, 0x3B, 0xF7, 0x04, 0xFD, 0xC3, 0xE9, + 0x59, 0xFB, 0xCC, 0xEF, 0xAA, 0xF7, 0x7A, 0xF7, 0x47, 0xEC, 0x04, 0xEF, + 0xB5, 0xF5, 0x1D, 0xF1, 0xB0, 0xF6, 0xB1, 0xE9, 0x7B, 0xEC, 0xF5, 0xE1, + 0x52, 0xED, 0x90, 0xEB, 0x95, 0xEC, 0xC7, 0xE3, 0x46, 0xFC, 0x10, 0xE0, + 0x94, 0x06, 0x22, 0xE6, 0x45, 0xFA, 0xD4, 0xEE, 0xA1, 0xF0, 0x10, 0xFD, + 0xE6, 0xEE, 0x13, 0xFA, 0x7A, 0xFB, 0x4B, 0xF1, 0x36, 0xF9, 0x0C, 0xE3, + 0x71, 0xEF, 0xD4, 0xE0, 0x6A, 0xF0, 0x11, 0xE7, 0x22, 0xF9, 0x50, 0xE5, + 0x2B, 0x0C, 0x90, 0xE7, 0x13, 0x1B, 0xA2, 0xF0, 0xA5, 0x1C, 0x1D, 0x00, + 0x14, 0x19, 0x69, 0x0F, 0x90, 0x23, 0x7B, 0x1F, 0x59, 0x30, 0xA6, 0x25, + 0x16, 0x3E, 0xE8, 0x2C, 0x39, 0x4F, 0xE4, 0x3A, 0x0B, 0x52, 0xA4, 0x39, + 0x5E, 0x4D, 0xD7, 0x33, 0x59, 0x52, 0x02, 0x41, 0x88, 0x56, 0xEF, 0x52, + 0x72, 0x55, 0x88, 0x5A, 0x36, 0x59, 0x16, 0x5B, 0x8D, 0x53, 0xE1, 0x47, + 0xAF, 0x51, 0x51, 0x37, 0x32, 0x42, 0xE4, 0x24, 0x16, 0x1E, 0x2C, 0x0F, + 0xC0, 0x0B, 0x02, 0x11, 0x8F, 0x0F, 0x1B, 0x1D, 0x5E, 0x21, 0x23, 0x2B, + 0x31, 0x39, 0xD9, 0x3E, 0x1B, 0x3F, 0xDB, 0x41, 0xCF, 0x32, 0xED, 0x2B, + 0xA5, 0x3F, 0x7D, 0x27, 0x75, 0x4F, 0xF2, 0x27, 0xF0, 0x4B, 0x0A, 0x1E, + 0xB2, 0x4F, 0xCA, 0x23, 0x5B, 0x55, 0x3D, 0x2F, 0xBA, 0x50, 0x96, 0x2D, + 0xF2, 0x50, 0x8B, 0x2B, 0x7E, 0x49, 0xBC, 0x25, 0xC7, 0x35, 0x08, 0x1E, + 0x21, 0x24, 0x26, 0x18, 0xD3, 0x13, 0x07, 0x08, 0x96, 0x0E, 0x24, 0xFD, + 0xF9, 0x12, 0xFD, 0x00, 0xB5, 0x08, 0xDE, 0xFA, 0x1D, 0xFF, 0x94, 0xF1, + 0x71, 0x09, 0xEB, 0xF7, 0x39, 0x09, 0xD0, 0xF8, 0xFA, 0xF9, 0x6A, 0xEF, + 0x0F, 0xF5, 0x97, 0xEE, 0x7B, 0x03, 0x8C, 0xFE, 0x14, 0x17, 0xFC, 0x09, + 0x03, 0x29, 0x92, 0x09, 0xE3, 0x37, 0xC2, 0x11, 0x35, 0x40, 0x5C, 0x26, + 0x6B, 0x38, 0x50, 0x2E, 0x14, 0x2B, 0xA8, 0x27, 0xCF, 0x27, 0xD4, 0x25, + 0xA7, 0x1C, 0x90, 0x28, 0xD3, 0x06, 0x37, 0x2C, 0x68, 0xF9, 0x9A, 0x2C, + 0xFD, 0xEE, 0xAC, 0x1D, 0x32, 0xE6, 0x79, 0x09, 0xEE, 0xEB, 0xFD, 0xFD, + 0xA0, 0xE7, 0x86, 0xE7, 0x8A, 0xD8, 0x21, 0xCE, 0xD4, 0xDF, 0x2E, 0xCE, + 0xF4, 0xF0, 0x7F, 0xDA, 0x8B, 0xF1, 0x33, 0xDB, 0xA4, 0xE9, 0x30, 0xD6, + 0x80, 0xE7, 0xC6, 0xD6, 0xF7, 0xE2, 0x4E, 0xD3, 0x27, 0xE6, 0xD0, 0xD8, + 0xE7, 0xF2, 0x04, 0xEC, 0x77, 0xF2, 0x54, 0xF2, 0xCE, 0xEC, 0xBA, 0xEC, + 0x20, 0xEC, 0xD5, 0xE4, 0xD8, 0xE6, 0x08, 0xD8, 0xBA, 0xE0, 0xE3, 0xCE, + 0x4B, 0xE7, 0x7D, 0xDD, 0xCB, 0xEB, 0x1C, 0xEC, 0x62, 0xF2, 0xFA, 0xED, + 0xCB, 0x17, 0x8A, 0x03, 0x55, 0x26, 0x7E, 0x0D, 0xBD, 0x05, 0x5A, 0xFA, + 0x1E, 0xF9, 0x7C, 0xF7, 0x05, 0x06, 0x2E, 0xFF, 0x43, 0x10, 0x53, 0xFB, + 0x75, 0x15, 0x09, 0xF9, 0xE1, 0x1C, 0x74, 0x03, 0xF0, 0x26, 0x99, 0x12, + 0x4C, 0x27, 0x38, 0x14, 0x74, 0x27, 0xB0, 0x11, 0xB4, 0x2F, 0x90, 0x1D, + 0x70, 0x32, 0x57, 0x2D, 0x28, 0x3D, 0x28, 0x3E, 0x0C, 0x48, 0x91, 0x46, + 0x5E, 0x43, 0x54, 0x40, 0x23, 0x34, 0x1A, 0x39, 0x09, 0x1E, 0x28, 0x2F, + 0xE0, 0x07, 0x61, 0x1D, 0x04, 0xEB, 0xBB, 0x01, 0x84, 0xDF, 0x3D, 0xF9, + 0xB6, 0xEA, 0xB3, 0xFE, 0xD8, 0xFB, 0x56, 0x01, 0x79, 0x0E, 0x94, 0x10, + 0xC1, 0x16, 0x78, 0x16, 0x79, 0x09, 0xD4, 0x05, 0x29, 0xFC, 0x79, 0xFB, + 0xD3, 0x04, 0x9D, 0xFF, 0x7E, 0x1A, 0x17, 0x07, 0x70, 0x34, 0xA0, 0x0C, + 0xBC, 0x48, 0x1C, 0x18, 0x70, 0x43, 0xC0, 0x28, 0x3C, 0x2D, 0xC4, 0x27, + 0x20, 0x20, 0x20, 0x1F, 0xAE, 0x1D, 0xC6, 0x21, 0x05, 0x17, 0x38, 0x20, + 0xA7, 0x0D, 0xC2, 0x19, 0xEE, 0x07, 0xDB, 0x20, 0x9C, 0xF3, 0x29, 0x17, + 0xBF, 0xE3, 0x2E, 0xFF, 0x71, 0xED, 0x66, 0xF7, 0x6B, 0xFB, 0x3D, 0xF8, + 0x81, 0xF9, 0xC0, 0x03, 0x36, 0xF0, 0xCD, 0x0E, 0xF5, 0xF5, 0x27, 0x15, + 0x45, 0x05, 0xE4, 0x26, 0x2A, 0x16, 0xA4, 0x42, 0x39, 0x24, 0x45, 0x57, + 0xBD, 0x1D, 0x51, 0x56, 0xE6, 0x13, 0x4E, 0x51, 0x05, 0x14, 0x2D, 0x48, + 0xB2, 0x0E, 0x34, 0x34, 0x56, 0x0C, 0x58, 0x2E, 0x7F, 0x12, 0x4C, 0x2F, + 0x26, 0x09, 0x46, 0x1D, 0x8D, 0xF4, 0x7A, 0xFF, 0x35, 0xE7, 0x65, 0xF1, + 0x09, 0xD5, 0x0E, 0xEE, 0x09, 0xD4, 0x41, 0xEA, 0xBF, 0xDB, 0x03, 0xE5, + 0xAB, 0xCE, 0xC4, 0xE1, 0x5A, 0xC3, 0xE0, 0xE6, 0xF1, 0xC9, 0x82, 0xF0, + 0xB5, 0xDB, 0x24, 0x04, 0xB1, 0xE6, 0xAE, 0x0C, 0x16, 0xE0, 0x7D, 0xFE, + 0xE7, 0xD5, 0x75, 0xF5, 0x01, 0xCF, 0x9B, 0xF2, 0x75, 0xBF, 0x1F, 0xEE, + 0xD4, 0xC0, 0xCA, 0xF1, 0x02, 0xD7, 0xD2, 0xF5, 0xC9, 0xD2, 0x54, 0xEF, + 0xA6, 0xD1, 0xC5, 0xF5, 0x77, 0xCD, 0x9E, 0xF1, 0xAD, 0xBA, 0x9E, 0xE5, + 0x30, 0xBF, 0xC6, 0xE8, 0x29, 0xCA, 0x7B, 0xE3, 0x8A, 0xDB, 0xDD, 0xE0, + 0x28, 0xE5, 0x73, 0xDC, 0xCD, 0xD4, 0xA8, 0xC3, 0xF9, 0xC8, 0x64, 0xBA, + 0x37, 0xCE, 0x75, 0xCF, 0xB3, 0xC1, 0x15, 0xDE, 0x5B, 0xB9, 0x42, 0xE0, + 0xE9, 0xCC, 0x18, 0xD4, 0xA7, 0xE1, 0xD6, 0xC4, 0xCF, 0xEC, 0xC9, 0xC9, + 0xE0, 0xDE, 0x28, 0xCB, 0x0D, 0xD9, 0x7B, 0xD8, 0xC9, 0xE4, 0x26, 0xF5, + 0x70, 0xE5, 0xA3, 0x06, 0xD5, 0xF9, 0xD0, 0x23, 0x70, 0x08, 0x58, 0x34, + 0x72, 0x00, 0x76, 0x29, 0x50, 0xF3, 0xB8, 0x07, 0x87, 0xD8, 0x74, 0xD7, + 0x5B, 0xC5, 0xE0, 0xC4, 0x44, 0xAE, 0x13, 0xC1, 0x7C, 0xA4, 0x76, 0xBA, + 0xED, 0xBF, 0x24, 0xC5, 0x5C, 0xE7, 0xF5, 0xE3, 0xB4, 0xFA, 0xD6, 0xFF, + 0xCD, 0xF6, 0xAC, 0x05, 0xD7, 0xEE, 0x40, 0xF9, 0xE0, 0xEF, 0xC2, 0xF4, + 0xBC, 0xF1, 0x60, 0xF4, 0x25, 0xF1, 0x9F, 0xEB, 0xD1, 0x06, 0x02, 0xF7, + 0x92, 0x23, 0x48, 0x10, 0x20, 0x24, 0xC8, 0x0D, 0xE1, 0x15, 0xC5, 0xF8, + 0xD2, 0x09, 0x04, 0xF5, 0x4A, 0xE3, 0x5F, 0xDB, 0x80, 0xBD, 0xF2, 0xAB, + 0xA7, 0xB8, 0xAD, 0x9E, 0x48, 0xBE, 0x21, 0xAB, 0x43, 0xBE, 0xB9, 0xB7, + 0x9D, 0xB9, 0x24, 0xC2, 0x30, 0xC1, 0xC2, 0xCD, 0x56, 0xCE, 0xDE, 0xD3, + 0x53, 0xDA, 0x09, 0xDB, 0xD8, 0xE1, 0x05, 0xDD, 0x02, 0xD8, 0xFB, 0xD4, + 0x01, 0xD2, 0x3B, 0xE0, 0x1D, 0xE4, 0x19, 0xE9, 0x62, 0x03, 0x9E, 0xEE, + 0xE3, 0x14, 0xBA, 0x08, 0xD8, 0x03, 0xEF, 0x10, 0x07, 0xF1, 0xD2, 0x0E, + 0x1B, 0xF6, 0x39, 0x18, 0xBE, 0xFF, 0xBE, 0x18, 0x5F, 0xF5, 0x0E, 0x0A, + 0x82, 0xDD, 0x13, 0xFA, 0xF9, 0xDB, 0xA7, 0x00, 0xAE, 0xD7, 0xED, 0x02, + 0x34, 0xCE, 0x10, 0xF7, 0xF5, 0xD7, 0x15, 0xF1, 0xB2, 0xE3, 0x2A, 0xEE, + 0x65, 0xE5, 0x63, 0xE6, 0x6E, 0xE8, 0xB2, 0xD9, 0x80, 0xEA, 0xBF, 0xD7, + 0xE7, 0xDD, 0xFD, 0xDF, 0x13, 0xE1, 0x7A, 0xF4, 0x36, 0xEE, 0x3B, 0xFB, + 0x2F, 0xF6, 0x26, 0xF5, 0x2E, 0x01, 0x1B, 0xF7, 0xB7, 0x00, 0xAE, 0xF3, + 0xD6, 0xF7, 0x07, 0xF1, 0xF0, 0xF0, 0x27, 0xF4, 0x34, 0xEE, 0xEC, 0xFF, + 0x9A, 0xE9, 0x26, 0x05, 0xD1, 0xF5, 0x68, 0x0C, 0xD0, 0x05, 0xDF, 0x10, + 0x1C, 0xFE, 0x1D, 0xF6, 0xBD, 0x0C, 0x93, 0xE5, 0x5D, 0x25, 0x26, 0xEC, + 0x5C, 0x0D, 0x83, 0xE1, 0x16, 0xE1, 0xEF, 0xCF, 0xD1, 0xDC, 0x8B, 0xDD, + 0xA5, 0xFB, 0x2F, 0xFE, 0x30, 0x06, 0xDC, 0xFD, 0x8E, 0x06, 0xA9, 0xF5, + 0xC8, 0x0F, 0x89, 0x0E, 0x62, 0x07, 0x1F, 0x1F, 0xAF, 0x02, 0x31, 0x22, + 0x8B, 0x0D, 0x64, 0x22, 0x0D, 0x29, 0xE6, 0x27, 0x1C, 0x4B, 0x00, 0x3E, + 0x6C, 0x57, 0x75, 0x48, 0x0A, 0x5D, 0xBB, 0x3C, 0xAF, 0x53, 0xE6, 0x29, + 0x3B, 0x27, 0x7B, 0x12, 0xA5, 0x02, 0xDA, 0x00, 0xB7, 0xFA, 0x6E, 0xFA, + 0x86, 0xFB, 0xE5, 0xEB, 0x35, 0x05, 0x02, 0xDB, 0xF9, 0x17, 0x29, 0xE0, + 0x9B, 0x2B, 0x84, 0xF8, 0xE4, 0x40, 0x17, 0x0B, 0xCB, 0x56, 0xC6, 0x18, + 0x12, 0x66, 0xB5, 0x21, 0xDC, 0x5B, 0x2F, 0x1E, 0xF9, 0x4A, 0x9E, 0x21, + 0x67, 0x4A, 0x92, 0x2B, 0x3F, 0x52, 0x3B, 0x30, 0x1F, 0x57, 0x89, 0x2D, + 0x0B, 0x4D, 0x78, 0x26, 0x90, 0x42, 0x78, 0x20, 0x1E, 0x43, 0x3D, 0x1E, + 0xC8, 0x36, 0x2E, 0x14, 0x4C, 0x21, 0x91, 0xFF, 0xC1, 0x1A, 0xA0, 0xF3, + 0x74, 0x13, 0x85, 0xEC, 0x28, 0x0E, 0xE3, 0xE6, 0xD7, 0x12, 0x3A, 0xEA, + 0x43, 0x15, 0x67, 0xEF, 0x75, 0x1E, 0x38, 0xFF, 0xAA, 0x2D, 0xE1, 0x0F, + 0x39, 0x27, 0xBE, 0x12, 0x52, 0x1F, 0x82, 0x17, 0xA8, 0x25, 0xA7, 0x24, + 0xDF, 0x23, 0xEB, 0x30, 0x14, 0x27, 0xED, 0x3C, 0x81, 0x32, 0x94, 0x41, + 0xEE, 0x34, 0x8C, 0x41, 0xC9, 0x37, 0xCF, 0x48, 0x32, 0x3B, 0xB0, 0x45, + 0x7C, 0x31, 0xE8, 0x3D, 0xFD, 0x28, 0xE0, 0x31, 0x38, 0x22, 0xFC, 0x15, + 0x65, 0x0D, 0x13, 0xFC, 0x67, 0xF9, 0x71, 0xEE, 0x76, 0xEF, 0xE1, 0xEA, + 0xAA, 0xEB, 0x5F, 0xE9, 0xC0, 0xED, 0x2F, 0xD7, 0x21, 0xF4, 0x5D, 0xCA, + 0x1F, 0xF6, 0x2D, 0xD5, 0x83, 0xEB, 0xC9, 0xE1, 0x42, 0xEB, 0xC0, 0xF5, + 0xA4, 0xE5, 0x17, 0xF6, 0x0B, 0xDC, 0x32, 0xE9, 0x17, 0xFD, 0x3C, 0x01, + 0x22, 0x19, 0x33, 0x11, 0x8B, 0x10, 0xB3, 0x02, 0x01, 0x0C, 0x5B, 0x03, + 0x7E, 0x06, 0x61, 0x05, 0x31, 0xFB, 0x56, 0x03, 0x6C, 0xFB, 0x8B, 0x09, + 0x20, 0xFD, 0x33, 0x06, 0xD0, 0x00, 0xBC, 0x07, 0x7F, 0x01, 0xB8, 0x0A, + 0x99, 0x04, 0x57, 0x10, 0x7D, 0x08, 0x66, 0x0D, 0x0F, 0xFB, 0x4B, 0xEE, + 0x87, 0xEA, 0x5D, 0xDA, 0x08, 0xEF, 0xA1, 0xE3, 0xA4, 0x0C, 0xB6, 0xFC, + 0x25, 0x1B, 0x55, 0x05, 0xE2, 0x19, 0x94, 0xF9, 0x5B, 0x23, 0xB4, 0x05, + 0x90, 0x28, 0xFA, 0x18, 0x5E, 0x18, 0x04, 0x1B, 0x16, 0x04, 0x09, 0x21, + 0xC0, 0x0B, 0xF0, 0x2E, 0x8B, 0x24, 0x3C, 0x3B, 0xBF, 0x3A, 0x69, 0x48, + 0x52, 0x3D, 0x82, 0x4A, 0xD1, 0x29, 0x87, 0x40, 0x9C, 0x0C, 0x31, 0x29, + 0x69, 0xF9, 0xA6, 0x0A, 0x77, 0xEF, 0x9D, 0xF6, 0x62, 0xD6, 0x2D, 0xD9, + 0x47, 0xCA, 0x8B, 0xCD, 0x5B, 0xD4, 0x9A, 0xE3, 0x26, 0xEB, 0x51, 0xF8, + 0x57, 0x07, 0x30, 0x0D, 0xA9, 0x1D, 0x61, 0x26, 0xA3, 0x29, 0x71, 0x29, + 0x2E, 0x36, 0x86, 0x1E, 0xFC, 0x48, 0x7F, 0x1E, 0xE2, 0x3D, 0xD6, 0x16, + 0xF7, 0x26, 0x7F, 0x0A, 0xC2, 0x22, 0x34, 0x0E, 0x82, 0x2E, 0xA4, 0x20, + 0x60, 0x3F, 0x18, 0x2D, 0x11, 0x49, 0x31, 0x3D, 0xD8, 0x39, 0x74, 0x43, + 0x4E, 0x16, 0x63, 0x1A, 0x66, 0x03, 0x66, 0xE9, 0xF3, 0xFD, 0x1E, 0xD3, + 0x51, 0xEB, 0x73, 0xC9, 0xA5, 0xD9, 0xC5, 0xCC, 0xCE, 0xE7, 0x33, 0xF4, + 0x58, 0xFA, 0x69, 0x11, 0x3D, 0x09, 0x42, 0x17, 0xE4, 0x17, 0x34, 0x20, + 0x13, 0x0F, 0x59, 0x19, 0xFF, 0x01, 0x92, 0x14, 0xC2, 0x05, 0x13, 0x1F, + 0xBA, 0x11, 0x49, 0x2F, 0x4E, 0x26, 0x7A, 0x42, 0x1A, 0x35, 0xC4, 0x4F, + 0x9E, 0x2B, 0x2B, 0x45, 0x81, 0x30, 0x25, 0x35, 0x50, 0x40, 0x87, 0x40, + 0x09, 0x1D, 0xF2, 0x37, 0xFD, 0xE8, 0x2A, 0x12, 0x2D, 0xD1, 0x98, 0x03, + 0xEC, 0xBE, 0x30, 0xF7, 0xD5, 0xC1, 0xE0, 0xE6, 0x48, 0xD0, 0xB4, 0xE3, + 0x7E, 0xD6, 0xA7, 0xEF, 0xC4, 0xDF, 0x95, 0xFB, 0xC0, 0xE8, 0x3D, 0xFC, + 0xF6, 0xF9, 0xC2, 0x04, 0x7B, 0x00, 0xA1, 0x0E, 0x9A, 0xF0, 0x58, 0x10, + 0x8B, 0xF6, 0xE3, 0x1B, 0xFD, 0x13, 0x6F, 0x30, 0x92, 0x25, 0x01, 0x36, + 0x5C, 0x1E, 0xC3, 0x2F, 0xE9, 0x0C, 0x39, 0x2C, 0x3F, 0xF3, 0x3A, 0x21, + 0x66, 0xE4, 0x5C, 0x19, 0x26, 0xF3, 0x22, 0x10, 0x03, 0xFE, 0xCF, 0xFC, + 0x8A, 0xF4, 0x61, 0xE8, 0x41, 0xEB, 0xFA, 0xDD, 0x3E, 0xF9, 0x1F, 0xF3, + 0x0A, 0xF7, 0xE2, 0xFF, 0xD8, 0xE4, 0xA9, 0xFF, 0x08, 0xDE, 0xF0, 0xF7, + 0x13, 0xF2, 0xE3, 0xF3, 0xA1, 0x08, 0xD1, 0xEE, 0xE2, 0x0A, 0x68, 0xE6, + 0x49, 0x04, 0xCB, 0xE7, 0xB8, 0xE3, 0xB3, 0xD7, 0x94, 0xDA, 0x57, 0xE0, + 0x8E, 0xDF, 0x68, 0xEC, 0xAE, 0xD9, 0x3F, 0xE4, 0xC4, 0xE6, 0xAC, 0xF4, + 0x64, 0xEC, 0xE1, 0x06, 0x21, 0xEC, 0x79, 0x07, 0x35, 0xF6, 0xEC, 0x0C, + 0x93, 0xF9, 0xC1, 0x15, 0xC1, 0xF7, 0x17, 0x1B, 0xD5, 0xE7, 0x6B, 0x09, + 0x32, 0xCA, 0xE7, 0xE3, 0xCA, 0xB8, 0x0C, 0xCD, 0x92, 0xAE, 0x44, 0xB1, + 0x12, 0xA1, 0x0F, 0x98, 0x64, 0xA9, 0xB8, 0xAC, 0x03, 0xC3, 0x75, 0xD7, + 0xCC, 0xD3, 0x97, 0xEA, 0x04, 0xEC, 0x91, 0xF1, 0xEF, 0x07, 0x44, 0x00, + 0x58, 0x0D, 0x52, 0x0F, 0x3C, 0xFB, 0x33, 0x10, 0xC1, 0xED, 0x52, 0x0B, + 0xEF, 0xFC, 0xC9, 0x17, 0xF2, 0x0E, 0x5F, 0x23, 0x12, 0x10, 0x62, 0x1A, + 0x88, 0x17, 0xFD, 0x16, 0xB3, 0x12, 0x16, 0x0E, 0x3B, 0xF3, 0x97, 0xEF, + 0xF1, 0xD0, 0xDD, 0xD6, 0x6D, 0xAC, 0x71, 0xC6, 0x6D, 0x9F, 0x6B, 0xC3, + 0x45, 0xA9, 0xED, 0xB9, 0xB1, 0xB4, 0xCC, 0xAB, 0x94, 0xC5, 0x44, 0xC5, + 0x68, 0xC3, 0x7E, 0xDD, 0xBE, 0xD0, 0x64, 0xE9, 0xFF, 0xFB, 0x48, 0x0F, + 0x3A, 0x05, 0x28, 0x27, 0xE2, 0xF1, 0x44, 0x1D, 0x8C, 0xEE, 0xB5, 0x1A, + 0xA6, 0xEF, 0x4D, 0x10, 0x37, 0xED, 0xA2, 0xF6, 0xF7, 0x02, 0x67, 0xF7, + 0xAF, 0x18, 0x79, 0x06, 0xEE, 0x0E, 0x02, 0x08, 0x45, 0xFF, 0xC8, 0x05, + 0xED, 0xF6, 0x95, 0xFA, 0xA9, 0xEF, 0x87, 0xE6, 0x63, 0xE4, 0x0E, 0xDB, + 0xB3, 0xD0, 0x70, 0xCA, 0xC2, 0xC0, 0x37, 0xB8, 0xCE, 0xC1, 0xF3, 0xC5, + 0xF5, 0xCB, 0x07, 0xDD, 0x66, 0xD7, 0xAC, 0xE1, 0x02, 0xE9, 0x02, 0xF1, + 0xFD, 0xEC, 0xA4, 0xF1, 0xEC, 0xE5, 0xC1, 0xD8, 0x3B, 0xEE, 0xF5, 0xD4, + 0x4E, 0xEC, 0xE1, 0xD7, 0x84, 0xE6, 0x04, 0xE1, 0x29, 0xE6, 0xCE, 0xEC, + 0x1E, 0xDE, 0x02, 0xEA, 0x14, 0xDD, 0x5D, 0xEA, 0xC2, 0xE7, 0x8D, 0xF8, + 0x26, 0xF2, 0xF2, 0x03, 0x5F, 0xF8, 0xC6, 0xFE, 0xF3, 0x0D, 0xE0, 0xFC, + 0x59, 0x21, 0xB8, 0x02, 0x67, 0x13, 0xA8, 0xFF, 0x79, 0xF1, 0x7E, 0xF0, + 0xF2, 0xEB, 0x04, 0xEC, 0xE4, 0x00, 0xED, 0xF0, 0xED, 0x02, 0x31, 0xE8, + 0x95, 0x01, 0x50, 0xE1, 0x62, 0x09, 0x38, 0xF1, 0xA9, 0xF1, 0x9A, 0xEB, + 0xE9, 0xD9, 0xF6, 0xE2, 0xFD, 0xE4, 0x2E, 0xF8, 0xE2, 0xEC, 0x3B, 0xFC, + 0x8F, 0xF8, 0x7D, 0xFA, 0x40, 0x14, 0x02, 0xFC, 0x6E, 0x25, 0x76, 0xF6, + 0x97, 0x29, 0xE9, 0xFE, 0xDD, 0x23, 0xE7, 0x06, 0xB8, 0x18, 0xBA, 0xFC, + 0x1B, 0x11, 0x1A, 0xF0, 0x93, 0x08, 0x5D, 0xEA, 0xAD, 0xF7, 0xA2, 0xDC, + 0x91, 0xDD, 0xDF, 0xC9, 0xA6, 0xCE, 0x01, 0xD1, 0x54, 0xC3, 0xB1, 0xD5, + 0xD3, 0xB8, 0x73, 0xC8, 0x15, 0xCF, 0xD0, 0xDB, 0x67, 0xF9, 0xFB, 0x03, + 0x56, 0x0F, 0x80, 0x08, 0xF2, 0x1B, 0xE4, 0xFF, 0x38, 0x33, 0x07, 0x0A, + 0x86, 0x38, 0x44, 0x04, 0x76, 0x26, 0xE7, 0xF1, 0xBE, 0x0D, 0x2D, 0xF2, + 0x74, 0xFD, 0xA2, 0xF4, 0x98, 0x07, 0xC5, 0xE9, 0xC5, 0x18, 0x57, 0xE5, + 0xE6, 0x22, 0x89, 0xE7, 0xE1, 0x14, 0x2B, 0xD5, 0x4C, 0xEF, 0xE0, 0xBC, + 0x3C, 0xD2, 0xA3, 0xB1, 0xEF, 0xB6, 0x21, 0xA2, 0xCB, 0xA5, 0xEF, 0x98, + 0x7E, 0xA8, 0xB6, 0x9E, 0x7F, 0xC2, 0xC9, 0xAF, 0x98, 0xE2, 0x00, 0xC8, + 0x6C, 0xE9, 0xDE, 0xD3, 0x3C, 0xE9, 0x39, 0xDE, 0x4C, 0xF6, 0xAB, 0xFE, + 0x0A, 0x08, 0xB1, 0x13, 0x6E, 0x1C, 0x7F, 0x13, 0x71, 0x25, 0x33, 0x1D, + 0xB7, 0x11, 0x92, 0x20, 0xDA, 0x01, 0xD3, 0x1D, 0xA6, 0x01, 0x6E, 0x1E, + 0x46, 0x0D, 0xC3, 0x1E, 0x62, 0x0F, 0x8A, 0x17, 0xE6, 0xFD, 0x0F, 0x0D, + 0x4F, 0xEE, 0x84, 0x01, 0x72, 0xD7, 0xEA, 0xD8, 0xAB, 0xC8, 0x42, 0xB5, + 0x98, 0xC4, 0x90, 0xB4, 0xD0, 0xBC, 0x17, 0xC0, 0xA6, 0xB8, 0xFF, 0xD2, + 0xF6, 0xCB, 0x9E, 0xF0, 0x3E, 0xE1, 0xA0, 0xF9, 0xCB, 0xE4, 0x60, 0xF0, + 0xBB, 0xEB, 0xEC, 0xF3, 0xB6, 0xED, 0x04, 0xF1, 0x8D, 0xEC, 0xAC, 0xE5, + 0x0D, 0xF0, 0x36, 0xDF, 0xB3, 0xF3, 0x1D, 0xE0, 0x7F, 0xFD, 0x06, 0xE9, + 0xD6, 0x03, 0x96, 0xEE, 0x00, 0x00, 0xAD, 0xEF, 0xC4, 0x01, 0x03, 0xF3, + 0x6A, 0x04, 0x53, 0xF7, 0xBB, 0xFB, 0x42, 0xF5, 0x8B, 0xF0, 0x32, 0xF1, + 0x39, 0xF8, 0xFA, 0xF6, 0x8A, 0x04, 0x44, 0xF7, 0xDA, 0x00, 0x6E, 0xF2, + 0x85, 0xFA, 0x52, 0xF4, 0x4D, 0xFE, 0x14, 0xF9, 0x63, 0x0A, 0x2A, 0xF9, + 0xB6, 0x1A, 0x12, 0xF8, 0x1A, 0x26, 0x5C, 0xFC, 0x0C, 0x1A, 0xEE, 0xFD, + 0x78, 0x0F, 0xC1, 0x08, 0xE1, 0x14, 0xD4, 0x0D, 0x5F, 0x18, 0x1C, 0x07, + 0xE5, 0x19, 0x4A, 0x15, 0x40, 0x22, 0xC5, 0x32, 0x51, 0x30, 0xAA, 0x46, + 0xD2, 0x38, 0x2B, 0x4A, 0x91, 0x44, 0xAF, 0x44, 0x23, 0x40, 0x50, 0x2F, + 0x0D, 0x21, 0xB0, 0x17, 0xA1, 0x08, 0x90, 0x0D, 0x98, 0xF4, 0x93, 0xFC, + 0x0D, 0xDF, 0x44, 0xE6, 0x3F, 0xCF, 0xDF, 0xD5, 0xF5, 0xD2, 0x50, 0xD2, + 0xC4, 0xEB, 0xEC, 0xDA, 0xFF, 0x0B, 0x6D, 0xEA, 0xF6, 0x36, 0x4D, 0x08, + 0xAA, 0x59, 0x03, 0x30, 0x95, 0x60, 0x77, 0x45, 0x2D, 0x51, 0x8D, 0x40, + 0xB0, 0x3F, 0x88, 0x3A, 0x32, 0x38, 0xC0, 0x38, 0xBC, 0x30, 0xE8, 0x2D, + 0x56, 0x38, 0x15, 0x29, 0xE4, 0x40, 0xE7, 0x30, 0x21, 0x40, 0x16, 0x38, + 0x02, 0x3B, 0xE5, 0x34, 0xBC, 0x21, 0xF1, 0x20, 0xF5, 0x02, 0x36, 0x0E, + 0x31, 0xE4, 0x90, 0xFB, 0x7E, 0xCE, 0x66, 0xE0, 0x5E, 0xCF, 0x40, 0xD4, + 0x43, 0xE3, 0x50, 0xDF, 0x02, 0xF0, 0x4A, 0xF8, 0x66, 0xF7, 0x02, 0x20, + 0xB1, 0x07, 0xE4, 0x3D, 0x33, 0x19, 0x1D, 0x44, 0xE7, 0x37, 0x3A, 0x4B, + 0x3F, 0x5A, 0x58, 0x5B, 0xD3, 0x5B, 0xC3, 0x52, 0x61, 0x4C, 0x21, 0x3E, + 0x99, 0x46, 0xAB, 0x3C, 0x1A, 0x34, 0x95, 0x38, 0xB9, 0x21, 0x97, 0x3A, + 0x0D, 0x20, 0xB7, 0x3B, 0x86, 0x25, 0xE8, 0x2E, 0x81, 0x29, 0x4D, 0x20, + 0x94, 0x1D, 0x48, 0x17, 0x1B, 0x05, 0x58, 0x12, 0xA5, 0xF0, 0xA9, 0x01, + 0x47, 0xE6, 0x6F, 0xE9, 0xAA, 0xEB, 0x46, 0xE3, 0xE8, 0xFF, 0x86, 0xF6, + 0xE7, 0x0A, 0xED, 0x0B, 0x61, 0x13, 0x76, 0x25, 0x57, 0x30, 0x4E, 0x42, + 0x8E, 0x3E, 0x52, 0x3D, 0xB1, 0x2F, 0x94, 0x28, 0x68, 0x18, 0x0D, 0x1F, + 0xDC, 0x02, 0x72, 0x1D, 0x47, 0xFA, 0xF7, 0x1E, 0x87, 0x05, 0x08, 0x25, + 0xCF, 0x14, 0x4D, 0x2E, 0x29, 0x0C, 0xC7, 0x2C, 0x57, 0xFE, 0xD1, 0x24, + 0x0B, 0x01, 0xD8, 0x1B, 0x6D, 0x01, 0x78, 0x14, 0x0B, 0xFF, 0xDC, 0x0D, + 0x2E, 0x07, 0x6F, 0x08, 0xE7, 0x16, 0xE2, 0x0C, 0xB1, 0x14, 0x8E, 0x03, + 0x4C, 0x10, 0x88, 0xFB, 0x5F, 0x17, 0xCC, 0x08, 0x5E, 0x04, 0xFA, 0x02, + 0x10, 0xF3, 0xB6, 0xF5, 0x96, 0x06, 0x31, 0x02, 0x1C, 0x1C, 0xAC, 0x14, + 0x96, 0x0F, 0x23, 0x0C, 0x63, 0xF6, 0xD9, 0x02, 0x4E, 0xFB, 0xEA, 0x19, + 0x0A, 0x0D, 0x26, 0x26, 0x08, 0x11, 0x2C, 0x1D, 0x0B, 0x1D, 0xEF, 0x28, + 0x5B, 0x27, 0x72, 0x39, 0x31, 0x1E, 0x30, 0x37, 0xD6, 0x11, 0x25, 0x28, + 0x11, 0xFE, 0xB2, 0x07, 0xE1, 0xDE, 0xF1, 0xE3, 0xAC, 0xB7, 0x97, 0xCD, + 0xE1, 0xA7, 0x17, 0xCA, 0x32, 0xBA, 0xFC, 0xD6, 0x62, 0xCD, 0x4B, 0xEE, + 0x9B, 0xE8, 0xF2, 0x10, 0x4D, 0x0B, 0x7E, 0x32, 0x1F, 0x1C, 0xDF, 0x3D, + 0xE1, 0x26, 0xF2, 0x39, 0x92, 0x38, 0xF4, 0x36, 0x7C, 0x42, 0x6A, 0x30, + 0x88, 0x3A, 0x61, 0x1F, 0xA7, 0x31, 0xF9, 0x0F, 0x3A, 0x23, 0x9B, 0x08, + 0x7F, 0x16, 0x04, 0x10, 0xF1, 0x18, 0x8C, 0x1B, 0x0A, 0x06, 0x40, 0x09, + 0x85, 0xE1, 0x17, 0xE9, 0x81, 0xCA, 0x54, 0xD5, 0x17, 0xC1, 0x6D, 0xC5, + 0x7E, 0xBD, 0x83, 0xB8, 0x4B, 0xB1, 0x7D, 0xB1, 0x4A, 0xA9, 0x59, 0xB7, + 0x3D, 0xC0, 0x16, 0xD0, 0x13, 0xEE, 0x3A, 0xF2, 0x01, 0x1D, 0xE3, 0x14, + 0x81, 0x2C, 0x20, 0x1D, 0xB4, 0x2F, 0xBA, 0x1C, 0x15, 0x3F, 0x93, 0x2B, + 0xD5, 0x37, 0xED, 0x29, 0x6F, 0x1B, 0xCE, 0x1E, 0x71, 0x0B, 0xA7, 0x25, + 0x4E, 0x08, 0x1D, 0x25, 0x5B, 0x06, 0xA7, 0x11, 0x42, 0x05, 0xBC, 0x0A, + 0x87, 0x04, 0x54, 0x0D, 0x89, 0xF8, 0x88, 0x01, 0xEA, 0xE3, 0x1A, 0xF5, + 0x0E, 0xD7, 0x58, 0xEF, 0x9B, 0xD7, 0x93, 0xEA, 0x15, 0xDE, 0xE1, 0xF0, + 0xA1, 0xDC, 0xF9, 0xF5, 0xCD, 0xE2, 0xE4, 0xEE, 0x0C, 0xFB, 0x19, 0xEC, + 0xB5, 0x08, 0xC4, 0xF0, 0x0B, 0x09, 0xEE, 0xF7, 0x59, 0x05, 0x86, 0xFC, + 0x80, 0xFD, 0xC1, 0xF9, 0xDF, 0xF9, 0xFD, 0xF6, 0xCB, 0xF1, 0xDC, 0xF7, + 0x02, 0xE5, 0x05, 0xFA, 0x8A, 0xE5, 0x98, 0x01, 0x52, 0xEC, 0xE2, 0x05, + 0x46, 0xE7, 0xBA, 0xF8, 0x2F, 0xEC, 0x0E, 0xF3, 0xF0, 0xE8, 0x63, 0xF2, + 0x4E, 0xCD, 0xC9, 0xF0, 0x21, 0xD4, 0xB6, 0xF8, 0xEF, 0xF1, 0x1C, 0xF5, + 0x22, 0xF7, 0x29, 0xEF, 0x97, 0xEE, 0x53, 0xF5, 0xBC, 0xEE, 0xD2, 0x02, + 0xF8, 0xE5, 0x1F, 0xFF, 0x75, 0xCF, 0xF2, 0xEB, 0xB1, 0xDB, 0x59, 0xF0, + 0x04, 0xFA, 0x6D, 0xFD, 0xFF, 0x01, 0xEB, 0x03, 0x06, 0x0A, 0xD3, 0x0C, + 0x32, 0x16, 0xA3, 0x0F, 0x88, 0x15, 0xD2, 0x04, 0x1A, 0x0A, 0x1E, 0xFB, + 0x54, 0x04, 0x77, 0xFD, 0x10, 0x0E, 0xED, 0xFE, 0xA2, 0x12, 0x20, 0xF6, + 0x23, 0x06, 0x25, 0xF1, 0x18, 0xE8, 0x45, 0xEA, 0xFA, 0xCA, 0x36, 0xD2, + 0xAD, 0xBF, 0x65, 0xBD, 0xA4, 0xB3, 0xDF, 0xAE, 0x0C, 0xB3, 0x07, 0xAB, + 0x02, 0xBE, 0x64, 0xB9, 0x8C, 0xC6, 0xB2, 0xCF, 0x65, 0xE4, 0x99, 0xEA, + 0xE7, 0x14, 0x27, 0xFF, 0xE3, 0x32, 0x91, 0x09, 0x9A, 0x2C, 0xC3, 0x0A, + 0x2A, 0x1E, 0xC0, 0x10, 0xCE, 0x17, 0x5B, 0x18, 0x69, 0x0C, 0x66, 0x09, + 0x09, 0xFD, 0xC4, 0xF2, 0x20, 0xF4, 0x74, 0xE8, 0xDC, 0xF0, 0x39, 0xE9, + 0x60, 0xE8, 0x1A, 0xE8, 0xBB, 0xE1, 0xC3, 0xE4, 0x3A, 0xDE, 0x26, 0xDC, + 0x9E, 0xC8, 0x51, 0xC2, 0x53, 0xA9, 0x5A, 0xAA, 0xC2, 0x9B, 0xE3, 0x9F, + 0xF2, 0xA4, 0x2B, 0xA5, 0xDD, 0xB6, 0x4B, 0xAD, 0xE4, 0xC6, 0x11, 0xAC, + 0xFE, 0xD9, 0x96, 0xB9, 0x55, 0xF0, 0x5B, 0xD6, 0x5B, 0x01, 0x65, 0xEF, + 0x50, 0x0E, 0x51, 0x04, 0xF0, 0x18, 0xD5, 0x15, 0x80, 0x21, 0x09, 0x1E, + 0xEC, 0x1E, 0x81, 0x1C, 0x06, 0x09, 0x77, 0x10, 0xA8, 0xFA, 0x34, 0xFC, + 0xDF, 0xEA, 0x44, 0xDF, 0xC6, 0xD1, 0x7E, 0xCA, 0x5C, 0xD1, 0x19, 0xCA, + 0x40, 0xE1, 0x56, 0xCB, 0x82, 0xDF, 0x68, 0xC1, 0x40, 0xD9, 0x26, 0xBF, + 0x4A, 0xD9, 0xD7, 0xC8, 0x1F, 0xC7, 0xB2, 0xC0, 0xED, 0xB5, 0x0C, 0xB3, + 0xDC, 0xBC, 0x87, 0xB9, 0xFD, 0xD0, 0x53, 0xD4, 0x47, 0xDE, 0x14, 0xF0, + 0x2F, 0xE2, 0x48, 0xFC, 0x07, 0xEA, 0xD4, 0x00, 0x89, 0xF4, 0x6A, 0xFD, + 0xBC, 0xEE, 0x5C, 0xEB, 0x53, 0xDD, 0x72, 0xDE, 0x90, 0xDC, 0xD4, 0xE0, + 0x6F, 0xE1, 0x2B, 0xD7, 0x33, 0xE4, 0x68, 0xCE, 0x4F, 0xD8, 0x9F, 0xD1, + 0x26, 0xC8, 0xDB, 0xD1, 0x79, 0xD5, 0xFC, 0xD5, 0xB7, 0xED, 0xFB, 0xDE, + 0xC0, 0xF6, 0xA6, 0xDF, 0x35, 0xF5, 0xBA, 0xDD, 0xAD, 0xF5, 0x44, 0xE4, + 0x46, 0xFF, 0x45, 0xF2, 0xBD, 0x0E, 0x92, 0xFA, 0x54, 0x12, 0x9E, 0xF3, + 0x11, 0x09, 0xD0, 0xEF, 0x52, 0x0E, 0x64, 0xFF, 0x0B, 0x17, 0x31, 0x0E, + 0xD3, 0x15, 0x62, 0x16, 0x23, 0x13, 0x7B, 0x21, 0xD7, 0x0F, 0xC8, 0x2A, + 0x2C, 0x10, 0x59, 0x2C, 0x03, 0x16, 0x25, 0x26, 0xE0, 0x24, 0x28, 0x27, + 0xA5, 0x31, 0xB0, 0x31, 0x0C, 0x2A, 0x92, 0x33, 0x9B, 0x0D, 0x6A, 0x2A, + 0x3E, 0xF0, 0xCA, 0x1C, 0x4D, 0xD6, 0x2B, 0xFB, 0x8F, 0xCB, 0x40, 0xDC, + 0xE5, 0xCF, 0x0F, 0xD6, 0xB2, 0xD2, 0x54, 0xD7, 0xA0, 0xE8, 0xEA, 0xE7, + 0xA0, 0x11, 0x02, 0x09, 0xCC, 0x36, 0x18, 0x29, 0x07, 0x45, 0x14, 0x3E, + 0x99, 0x3D, 0xC5, 0x3B, 0xCC, 0x40, 0xCC, 0x2B, 0xD1, 0x44, 0xA8, 0x1C, + 0x4C, 0x33, 0x5F, 0x0A, 0x7D, 0x27, 0x82, 0x05, 0x45, 0x26, 0xAA, 0x0A, + 0x29, 0x2C, 0xE0, 0x0C, 0x6E, 0x31, 0x12, 0x0A, 0x1C, 0x24, 0x5D, 0xFC, + 0xF1, 0x0F, 0xED, 0xEF, 0x5C, 0x00, 0x34, 0xE8, 0xFB, 0xF8, 0xD3, 0xE2, + 0x83, 0xED, 0xCC, 0xD2, 0x56, 0xE2, 0xDA, 0xC8, 0x0C, 0xDC, 0x71, 0xD5, + 0x38, 0xD3, 0x28, 0xE3, 0xEC, 0xD9, 0xE0, 0xF1, 0xE5, 0xF7, 0x84, 0x09, + 0xE6, 0x17, 0x4D, 0x22, 0xF4, 0x2F, 0x6C, 0x35, 0xF6, 0x3F, 0xB0, 0x43, + 0x96, 0x3C, 0x72, 0x42, 0x34, 0x31, 0xD9, 0x29, 0x36, 0x31, 0xF1, 0x13, + 0x32, 0x29, 0xC4, 0x0B, 0x0E, 0x15, 0x43, 0x0B, 0x70, 0xFD, 0xE5, 0x10, + 0x3B, 0xEE, 0x32, 0x19, 0x0D, 0xF9, 0x6A, 0x23, 0x0E, 0x01, 0xF7, 0x1B, + 0x7C, 0xFF, 0x7B, 0x08, 0x54, 0x03, 0x95, 0xFF, 0xC2, 0x00, 0xB3, 0xFD, + 0xA5, 0xF7, 0xF4, 0xF8, 0xEE, 0xFA, 0xE0, 0xFD, 0x32, 0x08, 0x51, 0x0B, + 0x01, 0x0D, 0xFC, 0x09, 0x44, 0x0F, 0x37, 0x01, 0xB5, 0x12, 0xE4, 0xFC, + 0x33, 0x0F, 0x51, 0xFE, 0xDB, 0x09, 0xB5, 0x06, 0xBB, 0x07, 0xF6, 0x07, + 0xD4, 0x07, 0x22, 0x01, 0x43, 0x08, 0x65, 0xFE, 0x08, 0x04, 0x64, 0xFC, + 0x90, 0xF7, 0x63, 0xF2, 0x38, 0xEF, 0x72, 0xE5, 0xCF, 0xF4, 0x95, 0xE1, + 0x55, 0xFD, 0x7C, 0xE9, 0x4A, 0xFA, 0x4D, 0xF3, 0xEF, 0xF2, 0x9B, 0xFC, + 0x74, 0xEC, 0x95, 0xF8, 0xB6, 0xEC, 0xF1, 0xE7, 0x48, 0x07, 0x6E, 0xEB, + 0x36, 0x22, 0x25, 0xF4, 0x1B, 0x1E, 0x2E, 0xEA, 0xBC, 0x0F, 0x82, 0xE1, + 0x0E, 0x0E, 0xBB, 0xEB, 0xAF, 0x09, 0xEF, 0xFC, 0x24, 0x04, 0x79, 0x0D, + 0x19, 0x10, 0x78, 0x21, 0x91, 0x21, 0x57, 0x2F, 0xE2, 0x22, 0x64, 0x28, + 0xA9, 0x1B, 0x30, 0x24, 0x79, 0x14, 0xE8, 0x2D, 0xE0, 0x08, 0xA8, 0x26, + 0xB9, 0x05, 0x74, 0x14, 0x6A, 0x0A, 0x86, 0x06, 0x71, 0x00, 0x26, 0xF2, + 0x45, 0xE6, 0x72, 0xDD, 0xAD, 0xD6, 0x57, 0xD8, 0x56, 0xD8, 0x16, 0xDF, + 0x69, 0xE8, 0x80, 0xF4, 0xF4, 0x07, 0xBC, 0x18, 0xBE, 0x26, 0x68, 0x39, + 0xBB, 0x3B, 0x8A, 0x4C, 0xB4, 0x47, 0x9C, 0x4D, 0xB8, 0x4C, 0x8E, 0x48, + 0x0E, 0x42, 0x63, 0x3F, 0xE1, 0x2D, 0x16, 0x32, 0xE7, 0x1F, 0x38, 0x28, + 0xA1, 0x10, 0xEE, 0x16, 0x9D, 0x0E, 0x15, 0x12, 0xF9, 0x1A, 0xE9, 0x20, + 0xF4, 0x1A, 0x54, 0x25, 0xCC, 0x0E, 0xBF, 0x1A, 0x29, 0x0B, 0xDC, 0x0E, + 0x5C, 0x0A, 0x64, 0x00, 0xAA, 0xF5, 0x5B, 0xEC, 0x55, 0xDD, 0xD0, 0xE0, + 0xBF, 0xE3, 0xAE, 0xE8, 0x62, 0x01, 0xF0, 0xF6, 0xAC, 0x19, 0x27, 0x01, + 0x35, 0x22, 0x63, 0x14, 0x98, 0x26, 0xFD, 0x32, 0x54, 0x39, 0x07, 0x4A, + 0x93, 0x4E, 0x4D, 0x52, 0xDC, 0x5C, 0xB0, 0x5C, 0x30, 0x5F, 0x7E, 0x61, + 0x91, 0x42, 0xBE, 0x4D, 0xB6, 0x2B, 0xA3, 0x3F, 0x8F, 0x31, 0x4C, 0x3E, + 0x52, 0x32, 0x6E, 0x37, 0x98, 0x2A, 0xAA, 0x32, 0x9F, 0x23, 0xAB, 0x2E, + 0x9D, 0x20, 0xAB, 0x31, 0x59, 0x21, 0x64, 0x3A, 0x9F, 0x11, 0xD9, 0x33, + 0x95, 0xFD, 0xF2, 0x2D, 0x32, 0xFA, 0xF2, 0x25, 0x0C, 0x08, 0x71, 0x1B, + 0x11, 0x26, 0x8F, 0x2B, 0x80, 0x3C, 0xD7, 0x3B, 0x46, 0x47, 0xB3, 0x38, + 0xF5, 0x47, 0x9F, 0x2D, 0xD9, 0x35, 0x9D, 0x22, 0xE3, 0x23, 0xE7, 0x25, + 0x9A, 0x20, 0x78, 0x33, 0xDF, 0x1D, 0x8B, 0x3A, 0xB1, 0x0C, 0x02, 0x32, + 0x82, 0xFE, 0x30, 0x25, 0x19, 0xFE, 0x9B, 0x1A, 0xF1, 0x01, 0xE6, 0x12, + 0x07, 0x04, 0x1B, 0x16, 0x99, 0x06, 0x74, 0x23, 0x8C, 0x0D, 0x6E, 0x2A, + 0x17, 0x1A, 0x2D, 0x2A, 0x32, 0x24, 0x82, 0x24, 0xB5, 0x1F, 0x17, 0x12, + 0x2C, 0x08, 0x1A, 0x03, 0x31, 0xF2, 0x64, 0x01, 0x0F, 0xF6, 0x43, 0xFD, + 0x11, 0x09, 0x04, 0xF9, 0x45, 0x16, 0x92, 0x08, 0x92, 0x12, 0xB4, 0x16, + 0xC5, 0x0F, 0x42, 0x18, 0xA6, 0x1B, 0xD9, 0x1E, 0xC7, 0x1E, 0x6C, 0x1D, + 0xC9, 0x1E, 0x1F, 0x1C, 0x80, 0x24, 0x10, 0x29, 0x0A, 0x22, 0xDE, 0x30, + 0x0B, 0x18, 0x68, 0x29, 0xA1, 0x0E, 0xD1, 0x1B, 0xAC, 0x04, 0x33, 0x0B, + 0x78, 0xEB, 0x1E, 0xEF, 0x51, 0xCE, 0x33, 0xDB, 0x94, 0xC7, 0xF7, 0xDA, + 0x81, 0xCB, 0xC3, 0xD8, 0x87, 0xCB, 0xEE, 0xDC, 0x0F, 0xD8, 0x85, 0xF7, + 0x34, 0xF9, 0x2C, 0x14, 0xEB, 0x1A, 0xDF, 0x1F, 0x26, 0x26, 0xB3, 0x22, + 0xFB, 0x21, 0xFD, 0x24, 0x91, 0x18, 0xB4, 0x1B, 0x10, 0x09, 0xDF, 0x05, + 0x49, 0xFF, 0x24, 0xF3, 0x37, 0xFB, 0x83, 0xE7, 0xAC, 0xF1, 0x40, 0xE0, + 0xC1, 0xE7, 0xFC, 0xDC, 0xFE, 0xE7, 0xD6, 0xDE, 0x54, 0xED, 0xDF, 0xDF, + 0x40, 0xEF, 0x4C, 0xDC, 0xD8, 0xE1, 0x85, 0xD4, 0x38, 0xC4, 0x8B, 0xC6, + 0xCA, 0xAA, 0xCA, 0xB3, 0x22, 0xA7, 0xAA, 0xAD, 0x09, 0xB6, 0x53, 0xB8, + 0x12, 0xCA, 0x11, 0xC5, 0x3B, 0xD9, 0x63, 0xD2, 0x21, 0xEB, 0xEE, 0xEC, + 0x34, 0x03, 0xC1, 0x0F, 0x19, 0x17, 0x13, 0x21, 0x24, 0x20, 0x82, 0x21, + 0x6F, 0x16, 0xD6, 0x1A, 0xD9, 0x07, 0x11, 0x0B, 0x79, 0x08, 0x0B, 0xFF, + 0x59, 0x00, 0x87, 0xFA, 0x9B, 0xE7, 0x6E, 0xFB, 0x04, 0xD1, 0xFF, 0xFA, + 0xFD, 0xC3, 0x8A, 0xEE, 0xBC, 0xCF, 0x3E, 0xE3, 0x90, 0xDF, 0x0A, 0xDD, + 0x0C, 0xD9, 0x7C, 0xD6, 0x10, 0xD0, 0x17, 0xCF, 0xD9, 0xCD, 0xE2, 0xC8, + 0xFB, 0xCF, 0x01, 0xD0, 0xE2, 0xD8, 0xBD, 0xDD, 0xD4, 0xDA, 0x1A, 0xE4, + 0xA8, 0xCF, 0xA5, 0xEC, 0xEC, 0xCD, 0x79, 0xF9, 0xAB, 0xDF, 0x43, 0xFB, + 0xC5, 0xEF, 0xA8, 0xF7, 0xA2, 0xF1, 0xC2, 0xF2, 0xCA, 0xEE, 0xB3, 0xE9, + 0x2E, 0xE4, 0xBB, 0xE2, 0xD9, 0xD1, 0x32, 0xE2, 0xD9, 0xC9, 0x1D, 0xE2, + 0x4F, 0xD4, 0xE6, 0xDF, 0x6B, 0xE6, 0xEE, 0xE7, 0xDD, 0xE8, 0xC9, 0xEE, + 0x33, 0xE5, 0x50, 0xED, 0xDD, 0xEC, 0x59, 0xF0, 0xC0, 0xEF, 0x4C, 0xF4, + 0xEF, 0xEC, 0xCB, 0xF4, 0xF5, 0xF4, 0x19, 0xF4, 0x18, 0x01, 0xDE, 0xED, + 0x8F, 0x05, 0x11, 0xE4, 0x23, 0x05, 0x2D, 0xE6, 0x19, 0x05, 0x87, 0xF5, + 0x71, 0xFD, 0xC7, 0xF9, 0x13, 0xF4, 0x86, 0xF5, 0x4F, 0xFC, 0x3D, 0xF9, + 0xF8, 0x12, 0x78, 0x0A, 0x6A, 0x1F, 0xA3, 0x1F, 0xC5, 0x1E, 0x68, 0x29, + 0xE2, 0x24, 0x7C, 0x2A, 0x7F, 0x21, 0x81, 0x19, 0xB7, 0x12, 0x18, 0x07, + 0x3F, 0x00, 0x04, 0x01, 0xF8, 0xE4, 0x7D, 0xF5, 0x5F, 0xCC, 0xD0, 0xE0, + 0x1D, 0xB8, 0xDE, 0xCB, 0x8A, 0xAD, 0x5B, 0xC7, 0x18, 0xB1, 0xBF, 0xD0, + 0x1C, 0xC2, 0x8C, 0xE3, 0xCF, 0xDE, 0x81, 0xF7, 0x64, 0x04, 0xC0, 0x03, + 0x0C, 0x2B, 0x92, 0x0F, 0x3C, 0x40, 0x88, 0x19, 0xB9, 0x43, 0xD6, 0x1C, + 0x5D, 0x37, 0x7A, 0x15, 0xAF, 0x16, 0x63, 0x09, 0xC9, 0xF5, 0xDE, 0x05, + 0xE3, 0xE6, 0xC8, 0x04, 0xF6, 0xEC, 0x2E, 0xFD, 0xE9, 0xFA, 0xA9, 0xEF, + 0x87, 0x00, 0x7D, 0xE7, 0x98, 0xF9, 0xA3, 0xE4, 0xCC, 0xE6, 0xDD, 0xD8, + 0xA1, 0xD5, 0x69, 0xCA, 0xD4, 0xCA, 0xB0, 0xBE, 0xA0, 0xC8, 0xA9, 0xB7, + 0x55, 0xCE, 0xDF, 0xBD, 0xC1, 0xCE, 0x54, 0xCA, 0xF0, 0xD6, 0x4D, 0xDD, + 0x4F, 0xF1, 0x91, 0xFD, 0xE8, 0x0C, 0x93, 0x1C, 0x0A, 0x1E, 0x07, 0x2F, + 0xD9, 0x2A, 0x75, 0x3A, 0x22, 0x39, 0xB2, 0x3B, 0x26, 0x3B, 0x25, 0x29, + 0xCD, 0x31, 0x7A, 0x17, 0x6B, 0x1E, 0x8E, 0x0E, 0xAA, 0xF8, 0x96, 0xF9, + 0x71, 0xD8, 0x4D, 0xE4, 0x3C, 0xD6, 0x1E, 0xDB, 0x22, 0xE2, 0xBE, 0xD3, + 0xE2, 0xE5, 0x42, 0xD1, 0x12, 0xE2, 0x79, 0xD2, 0x04, 0xE0, 0x71, 0xD3, + 0x1E, 0xD5, 0x03, 0xD0, 0x1D, 0xC3, 0xA7, 0xCF, 0x45, 0xC2, 0x64, 0xDC, + 0xEE, 0xCB, 0xEC, 0xE0, 0x17, 0xD5, 0x1B, 0xD7, 0x6C, 0xE9, 0x2E, 0xD7, + 0x47, 0xF6, 0xD3, 0xDE, 0x12, 0xE9, 0x5F, 0xE0, 0xCF, 0xD4, 0x7C, 0xDD, + 0xDE, 0xCC, 0xEA, 0xD6, 0xC4, 0xD1, 0xB1, 0xD2, 0x95, 0xD9, 0xFE, 0xD6, + 0x8E, 0xE3, 0x4F, 0xDE, 0xC3, 0xE9, 0x09, 0xDB, 0x3D, 0xEA, 0x4A, 0xCF, + 0x9E, 0xE5, 0x49, 0xC8, 0x0F, 0xDC, 0x86, 0xC9, 0x2B, 0xD5, 0x98, 0xCB, + 0x69, 0xD6, 0xD5, 0xCD, 0x14, 0xE0, 0x93, 0xD4, 0xC8, 0xE7, 0x64, 0xD1, + 0x0C, 0xE4, 0x91, 0xBA, 0x57, 0xE1, 0x54, 0xAE, 0x64, 0xE4, 0xAF, 0xB3, + 0xD7, 0xE2, 0x16, 0xB3, 0x83, 0xE4, 0x15, 0xBA, 0x5C, 0xEF, 0x04, 0xCD, + 0xB7, 0x02, 0xA0, 0xE4, 0x43, 0x0F, 0x9A, 0xF8, 0x66, 0x05, 0x1B, 0xFC, + 0x14, 0x02, 0xED, 0x06, 0x18, 0x06, 0x22, 0x16, 0x2B, 0xFA, 0x10, 0x0F, + 0x50, 0xF0, 0x4D, 0xFF, 0xF4, 0xED, 0x46, 0xEE, 0x39, 0xE6, 0x32, 0xCE, + 0xF5, 0xD6, 0x0C, 0xAF, 0x98, 0xBF, 0x96, 0xA9, 0x26, 0xAF, 0x4E, 0xB9, + 0x3C, 0xB4, 0x42, 0xCE, 0xCE, 0xCE, 0x22, 0xE6, 0xBC, 0xF3, 0xD1, 0x07, + 0xC5, 0x0E, 0xEA, 0x28, 0xC4, 0x16, 0x1B, 0x3A, 0x01, 0x18, 0xD2, 0x3C, + 0xE5, 0x1C, 0xC0, 0x33, 0xF3, 0x1F, 0x70, 0x24, 0x1A, 0x1B, 0x5D, 0x1B, + 0xF0, 0x12, 0xC3, 0x1B, 0x5A, 0x14, 0x28, 0x1A, 0xBE, 0x15, 0xEB, 0x0A, + 0xDE, 0x0C, 0x5B, 0xFD, 0x9F, 0x03, 0x33, 0xFA, 0x35, 0xF9, 0x98, 0xF2, + 0xCE, 0xEA, 0x6B, 0xE1, 0x23, 0xE9, 0x21, 0xD7, 0x20, 0xF9, 0x5D, 0xDF, + 0x79, 0x00, 0xBD, 0xE5, 0xF6, 0x01, 0x41, 0xE6, 0x1F, 0x13, 0xA5, 0xF1, + 0xF9, 0x21, 0x30, 0x07, 0x1D, 0x27, 0x3C, 0x20, 0x03, 0x2F, 0x05, 0x3A, + 0x38, 0x3A, 0x26, 0x51, 0x0E, 0x4D, 0xDD, 0x5F, 0x4A, 0x60, 0x8B, 0x5E, + 0x01, 0x66, 0xD9, 0x54, 0xB7, 0x55, 0x62, 0x4A, 0x2B, 0x39, 0xFC, 0x3D, + 0xD6, 0x2B, 0xF7, 0x35, 0x81, 0x2F, 0x18, 0x30, 0x99, 0x34, 0x0F, 0x2F, + 0xAD, 0x29, 0xF0, 0x2D, 0x36, 0x19, 0x64, 0x2A, 0x66, 0x18, 0x1D, 0x2F, + 0x66, 0x18, 0x94, 0x2E, 0x27, 0x10, 0x0B, 0x24, 0xED, 0x08, 0x94, 0x20, + 0x8F, 0x05, 0x7C, 0x1F, 0x11, 0x0A, 0x13, 0x17, 0x2A, 0x18, 0xDF, 0x0F, + 0xE1, 0x1D, 0x79, 0x07, 0x44, 0x15, 0xEE, 0xFD, 0x06, 0x13, 0x65, 0x01, + 0x82, 0x12, 0xFE, 0x07, 0x7E, 0x0F, 0x8D, 0x0B, 0x76, 0x16, 0xE4, 0x14, + 0x59, 0x1B, 0x66, 0x18, 0x1E, 0x15, 0x7C, 0x0F, 0x0B, 0x12, 0xAD, 0x07, + 0x73, 0x16, 0x0F, 0x0C, 0x9A, 0x0F, 0xB4, 0x12, 0xD5, 0xFC, 0xC8, 0x14, + 0xB6, 0xF7, 0xAB, 0x1A, 0x10, 0x04, 0x7F, 0x19, 0x4A, 0x0E, 0x51, 0x08, + 0xA4, 0x09, 0x52, 0xF4, 0xA5, 0x03, 0x13, 0xED, 0x44, 0x08, 0x0B, 0xEE, + 0x02, 0x06, 0xE4, 0xEC, 0xAC, 0x01, 0x42, 0xF1, 0x35, 0x08, 0x3E, 0xFF, + 0x79, 0x11, 0x93, 0x12, 0x20, 0x20, 0x60, 0x2A, 0x1F, 0x31, 0xC3, 0x37, + 0x07, 0x36, 0xBD, 0x30, 0xAE, 0x2E, 0x3B, 0x25, 0xF3, 0x21, 0xC5, 0x19, + 0x07, 0x0E, 0x6B, 0x04, 0xD7, 0xF4, 0x94, 0xE6, 0x29, 0xE1, 0x02, 0xCC, + 0x2E, 0xCE, 0xF5, 0xBB, 0x5C, 0xC2, 0xBD, 0xB9, 0x74, 0xC8, 0x0E, 0xC2, + 0x70, 0xD1, 0x17, 0xD0, 0x14, 0xDD, 0x88, 0xE3, 0xC4, 0xF8, 0x8C, 0xF8, + 0xAC, 0x18, 0x4C, 0x10, 0xDE, 0x26, 0x3F, 0x2B, 0x62, 0x29, 0x0E, 0x39, + 0x2F, 0x2B, 0x58, 0x33, 0x84, 0x25, 0x65, 0x28, 0x80, 0x11, 0x4F, 0x1B, + 0xED, 0xFC, 0x84, 0x13, 0xC6, 0xFC, 0x35, 0x12, 0x5D, 0xFE, 0x9B, 0x02, + 0x66, 0xF9, 0x9A, 0xE9, 0x35, 0xFE, 0xFA, 0xDE, 0x00, 0x00, 0x94, 0xDE, + 0x6A, 0xF5, 0x6F, 0xDD, 0x85, 0xEB, 0xE3, 0xE2, 0xFA, 0xE0, 0xA4, 0xE9, + 0xD0, 0xD0, 0x62, 0xED, 0xB9, 0xCD, 0x72, 0xF8, 0x6E, 0xE4, 0xB2, 0x05, + 0x76, 0xFC, 0x11, 0x03, 0xB1, 0x04, 0xF6, 0xFF, 0x62, 0x0A, 0xC9, 0x16, + 0xD9, 0x14, 0x1E, 0x2F, 0x71, 0x26, 0xD7, 0x37, 0xED, 0x3B, 0x74, 0x41, + 0x3A, 0x44, 0x97, 0x42, 0x07, 0x44, 0xBC, 0x3E, 0x97, 0x48, 0xFB, 0x41, + 0x1D, 0x40, 0x33, 0x40, 0x3B, 0x23, 0xCD, 0x30, 0xD3, 0x0E, 0xC7, 0x22, + 0xA3, 0x0B, 0xAE, 0x1F, 0x10, 0x0C, 0x66, 0x1A, 0xD0, 0x0B, 0x9E, 0x0E, + 0x67, 0x0A, 0xB5, 0xFD, 0x31, 0x00, 0x1A, 0xEF, 0x55, 0xEC, 0xF2, 0xEA, + 0x27, 0xE4, 0x41, 0xF0, 0x44, 0xEB, 0x12, 0xF7, 0xA8, 0xF3, 0xB6, 0xFF, + 0x0A, 0xFD, 0x5A, 0x0E, 0x04, 0x02, 0x60, 0x11, 0xEA, 0xFC, 0x49, 0x08, + 0x8A, 0xFD, 0xF5, 0x08, 0x10, 0x05, 0xAC, 0x07, 0x96, 0x06, 0xF3, 0x00, + 0x0C, 0x00, 0x26, 0x04, 0xE9, 0xFB, 0xDE, 0x0E, 0x05, 0x04, 0x32, 0x13, + 0xF0, 0x12, 0xCF, 0x0F, 0x93, 0x10, 0xFF, 0x0C, 0x56, 0x01, 0x60, 0x0A, + 0xAD, 0xFE, 0xAA, 0x0C, 0xE5, 0xFD, 0xCD, 0x09, 0x80, 0xF6, 0x4E, 0xFD, + 0xB5, 0xF4, 0x4B, 0xF6, 0xDC, 0xFB, 0x80, 0xF5, 0x02, 0x05, 0x5E, 0xF5, + 0x0C, 0x13, 0xE2, 0xFC, 0xDE, 0x25, 0x47, 0x13, 0xFC, 0x34, 0xB9, 0x2D, + 0x68, 0x3E, 0x1F, 0x3C, 0x5F, 0x4D, 0x80, 0x41, 0x59, 0x5B, 0x4D, 0x45, + 0x58, 0x48, 0x12, 0x3F, 0x0D, 0x23, 0x1E, 0x38, 0xF1, 0x0D, 0xDB, 0x38, + 0x86, 0x0C, 0x46, 0x36, 0xF0, 0x08, 0x30, 0x1D, 0x0F, 0xF4, 0x87, 0xF7, + 0xDA, 0xE3, 0x24, 0xE0, 0x27, 0xDC, 0xAF, 0xD1, 0x25, 0xDF, 0x95, 0xDB, + 0xC4, 0xF7, 0x2F, 0x08, 0xBC, 0x11, 0x17, 0x32, 0x03, 0x20, 0x7C, 0x48, + 0xEE, 0x23, 0x40, 0x58, 0x68, 0x27, 0x05, 0x61, 0xF2, 0x2A, 0x57, 0x55, + 0xA0, 0x22, 0x56, 0x3B, 0x06, 0x1C, 0xE4, 0x2C, 0x34, 0x1D, 0x36, 0x26, + 0x5D, 0x1D, 0x96, 0x19, 0xA2, 0x16, 0x6F, 0x0D, 0x9C, 0x0C, 0x21, 0x04, + 0xD1, 0x07, 0xA2, 0xFA, 0x41, 0x06, 0x5A, 0xF3, 0x10, 0x0A, 0x8B, 0xF9, + 0xA4, 0x15, 0x63, 0x0A, 0x54, 0x1B, 0x1A, 0x0C, 0xD7, 0x14, 0x02, 0x00, + 0x15, 0x03, 0xAC, 0xF2, 0x56, 0xF9, 0xD3, 0xE2, 0xE2, 0x00, 0x6B, 0xDE, + 0x82, 0x08, 0x77, 0xEA, 0x27, 0x10, 0x48, 0x04, 0x84, 0x1A, 0x88, 0x25, + 0x92, 0x1E, 0x07, 0x3B, 0xA0, 0x1E, 0x98, 0x41, 0xE5, 0x25, 0xE1, 0x44, + 0xB5, 0x2E, 0xF4, 0x43, 0xBA, 0x33, 0xB2, 0x39, 0xC6, 0x37, 0x0C, 0x34, + 0x72, 0x32, 0xB2, 0x31, 0x92, 0x1A, 0x59, 0x1C, 0xFD, 0xFF, 0xB8, 0x05, + 0x98, 0xE7, 0xEC, 0xF8, 0x94, 0xD8, 0xF5, 0xEA, 0x4D, 0xE2, 0x5B, 0xDF, + 0x97, 0xEF, 0x35, 0xDC, 0x1C, 0xF1, 0x97, 0xE8, 0x07, 0xED, 0x79, 0xF3, + 0x69, 0xEA, 0x33, 0xF7, 0x51, 0xE2, 0x8D, 0xF3, 0x43, 0xD8, 0xD0, 0xEB, + 0x03, 0xD9, 0xBC, 0xEF, 0x27, 0xE4, 0xD2, 0xF7, 0x4C, 0xEB, 0xBF, 0xF8, + 0xE8, 0xE6, 0xA1, 0xEE, 0x97, 0xE2, 0xB7, 0xE2, 0x0C, 0xDD, 0xCC, 0xDD, + 0x02, 0xD1, 0xD8, 0xDB, 0xBB, 0xCF, 0x4D, 0xD6, 0xDB, 0xDE, 0x4A, 0xCC, + 0x5C, 0xE7, 0x22, 0xC6, 0xA6, 0xE8, 0x36, 0xC8, 0xFD, 0xE2, 0xE6, 0xC6, + 0x3C, 0xD2, 0xBC, 0xBF, 0xA4, 0xC3, 0x8E, 0xB9, 0x94, 0xB9, 0x0E, 0xB4, + 0x79, 0xB0, 0x4E, 0xB6, 0x4C, 0xB3, 0x1B, 0xCA, 0x2C, 0xC1, 0x0C, 0xDE, + 0xF8, 0xD0, 0xB7, 0xE7, 0x32, 0xE3, 0x06, 0xF6, 0xF0, 0xF4, 0x56, 0x01, + 0x22, 0xF8, 0x79, 0x01, 0x43, 0xF1, 0xB4, 0xF7, 0x28, 0xF7, 0x81, 0xE7, + 0x7E, 0x03, 0xA1, 0xE3, 0x0C, 0xFF, 0xAF, 0xE9, 0x02, 0xE9, 0xA3, 0xE3, + 0x61, 0xCB, 0x01, 0xC7, 0x1D, 0xB4, 0xE7, 0xAD, 0x3D, 0xAA, 0xEA, 0xA7, + 0x5A, 0xA6, 0x24, 0xA9, 0x83, 0xB7, 0xAF, 0xB8, 0x70, 0xDE, 0x80, 0xD1, + 0x50, 0x05, 0xF4, 0xEF, 0x53, 0x11, 0x58, 0x05, 0x2E, 0x08, 0x1A, 0x0E, + 0x9F, 0x0B, 0xBF, 0x1C, 0xD6, 0x13, 0xAF, 0x1D, 0x3F, 0x0D, 0x8B, 0x09, + 0xEB, 0xFA, 0x02, 0xFB, 0x55, 0xEF, 0x8C, 0x04, 0x0E, 0xEA, 0x8F, 0x0C, + 0xAB, 0xE5, 0xE2, 0x05, 0x30, 0xE4, 0x71, 0x01, 0x9C, 0xDA, 0x24, 0xF0, + 0xFB, 0xDD, 0xD6, 0xEE, 0x51, 0xEF, 0xF0, 0x07, 0x29, 0xF1, 0xC8, 0x07, + 0x95, 0xF9, 0x0A, 0xFD, 0x1F, 0x09, 0x6A, 0xFC, 0xDF, 0x00, 0x05, 0xEE, + 0x14, 0xF9, 0xA6, 0xE3, 0x75, 0xFF, 0xA7, 0xF4, 0x94, 0x0A, 0x4E, 0x07, + 0x53, 0x1A, 0x1F, 0x12, 0xC4, 0x25, 0x0B, 0x20, 0xA8, 0x29, 0xFC, 0x29, + 0x17, 0x2F, 0x38, 0x30, 0xA9, 0x33, 0xD9, 0x35, 0xC1, 0x33, 0xCA, 0x37, + 0x1C, 0x35, 0x51, 0x31, 0xD6, 0x38, 0x2D, 0x27, 0x74, 0x35, 0x37, 0x21, + 0x6A, 0x2F, 0x3A, 0x1B, 0x95, 0x1D, 0xD4, 0x09, 0xA2, 0xFF, 0x9D, 0xF6, + 0x09, 0xF4, 0xF1, 0xEE, 0x8A, 0xFD, 0xE9, 0xE9, 0xAE, 0x0A, 0xEA, 0xE5, + 0xB0, 0x09, 0x2F, 0xE6, 0x2C, 0x04, 0x20, 0xF1, 0x51, 0x06, 0xC0, 0x03, + 0xD4, 0x03, 0xEE, 0x0D, 0x64, 0xFB, 0x4F, 0x0B, 0x9E, 0xF6, 0xB0, 0x03, + 0xF5, 0xEE, 0x99, 0xFE, 0xF7, 0xE0, 0xCA, 0x02, 0x6B, 0xE1, 0xAF, 0x05, + 0xB5, 0xEC, 0x82, 0xF2, 0x55, 0xF0, 0x30, 0xDB, 0xFD, 0xF6, 0x84, 0xDE, + 0x6E, 0xFC, 0x9B, 0xE5, 0x75, 0xF5, 0x8F, 0xDE, 0xDD, 0xF0, 0xC5, 0xDF, + 0x93, 0xE7, 0xAE, 0xDD, 0x0D, 0xD5, 0xDE, 0xCF, 0xE0, 0xCE, 0xBA, 0xD1, + 0x52, 0xD1, 0x10, 0xDB, 0xB1, 0xCE, 0xA6, 0xDB, 0xC7, 0xCA, 0xFF, 0xDA, + 0x5B, 0xCC, 0x49, 0xDC, 0xD9, 0xD2, 0x6D, 0xD9, 0x52, 0xDE, 0x11, 0xD5, + 0x9B, 0xEB, 0x05, 0xD3, 0xED, 0xF3, 0xA0, 0xD1, 0x9B, 0xEF, 0x04, 0xDB, + 0x7B, 0xE1, 0xC6, 0xE6, 0x81, 0xD4, 0x41, 0xE3, 0x8C, 0xD0, 0x00, 0xD8, + 0xD8, 0xCD, 0x36, 0xC4, 0xB3, 0xC5, 0x63, 0xAC, 0x77, 0xBF, 0x0A, 0xA0, + 0xCA, 0xBD, 0xD4, 0x9F, 0x42, 0xC0, 0xBA, 0xA4, 0x21, 0xC8, 0x62, 0xAE, + 0x49, 0xCC, 0xB5, 0xC4, 0x5A, 0xCB, 0x1A, 0xDC, 0xC7, 0xDD, 0x7F, 0xEC, + 0x9D, 0x00, 0x8F, 0xFA, 0xF5, 0x13, 0x3E, 0x02, 0xA3, 0x11, 0xD9, 0x07, + 0x25, 0x02, 0x62, 0x03, 0xF0, 0xEA, 0xB0, 0xEE, 0x26, 0xD4, 0x5C, 0xDA, + 0x9E, 0xC0, 0x7B, 0xD3, 0xF8, 0xB1, 0x75, 0xD6, 0xC4, 0xB9, 0xBA, 0xE0, + 0x7E, 0xD4, 0x28, 0xEB, 0x4F, 0xE5, 0x7B, 0xED, 0xB9, 0xE9, 0x3E, 0xF5, + 0xE7, 0xEC, 0xB1, 0xFA, 0xB2, 0xF1, 0x1C, 0xF2, 0xAD, 0xF9, 0xA7, 0xE7, + 0x3B, 0x05, 0x5C, 0xE7, 0xA8, 0x0F, 0x19, 0xED, 0x8E, 0x0E, 0xB4, 0xEF, + 0xF7, 0x0A, 0xEF, 0xF7, 0x65, 0x17, 0x42, 0x04, 0x16, 0x28, 0x3E, 0x06, + 0xC2, 0x2A, 0x70, 0x01, 0x11, 0x27, 0x50, 0x06, 0x94, 0x28, 0x4D, 0x13, + 0x96, 0x2D, 0x0C, 0x1E, 0x7C, 0x39, 0x3B, 0x2E, 0x77, 0x43, 0x89, 0x37, + 0xF3, 0x31, 0x27, 0x20, 0xBC, 0x0F, 0x99, 0xFD, 0xCD, 0xFE, 0xF4, 0xEA, + 0x38, 0xFE, 0x8D, 0xDF, 0x59, 0x03, 0xC2, 0xDB, 0x2F, 0x08, 0x6B, 0xE6, + 0x0A, 0x05, 0xE3, 0xF2, 0x1D, 0x02, 0x00, 0xF8, 0x61, 0x02, 0xFA, 0xFE, + 0x13, 0xF8, 0xD2, 0x05, 0xE3, 0xF2, 0x0B, 0x0E, 0xE2, 0x00, 0xC7, 0x19, + 0xE6, 0x08, 0x31, 0x18, 0xC4, 0x00, 0xD8, 0x08, 0x13, 0xF7, 0x30, 0xF8, + 0x69, 0xEC, 0x28, 0xE3, 0x88, 0xE1, 0x11, 0xD1, 0x56, 0xE8, 0xD4, 0xD7, + 0x02, 0xF7, 0xF7, 0xEB, 0xE0, 0xF5, 0x6C, 0xF7, 0xDD, 0xF2, 0xC4, 0x01, + 0x07, 0xFD, 0xC0, 0x10, 0x71, 0x03, 0x72, 0x0C, 0x24, 0xFD, 0xB4, 0xF5, + 0x39, 0xF5, 0x13, 0xEF, 0xB9, 0xEB, 0x3F, 0xF8, 0xCE, 0xE1, 0x03, 0xFB, + 0x17, 0xE4, 0x4E, 0xF7, 0x8C, 0xF3, 0x01, 0xFA, 0x33, 0x03, 0xBA, 0xFF, + 0x35, 0x07, 0x87, 0x00, 0xEC, 0x07, 0x9F, 0x05, 0x51, 0x0F, 0x7E, 0x0F, + 0xEE, 0x1C, 0xFA, 0x19, 0x6D, 0x26, 0x0F, 0x25, 0x78, 0x19, 0x56, 0x25, + 0xB6, 0x03, 0x71, 0x19, 0x7E, 0xF3, 0xE1, 0x04, 0x4B, 0xDE, 0xF9, 0xE5, + 0x50, 0xCD, 0x55, 0xCD, 0x93, 0xD5, 0x86, 0xC8, 0xB0, 0xE7, 0x90, 0xCC, + 0xB2, 0xFC, 0xE1, 0xE2, 0x53, 0x16, 0xD0, 0x07, 0xED, 0x2D, 0x12, 0x28, + 0x7C, 0x49, 0x40, 0x47, 0xA6, 0x57, 0x2F, 0x51, 0xF2, 0x5B, 0x9A, 0x45, + 0xAA, 0x63, 0xEE, 0x43, 0xDA, 0x57, 0x9E, 0x47, 0xEA, 0x35, 0xED, 0x3F, + 0x0C, 0x14, 0x20, 0x2E, 0xB2, 0x07, 0x16, 0x1F, 0xA5, 0x0A, 0x2F, 0x11, + 0x2F, 0x04, 0xA0, 0x01, 0x26, 0xF9, 0xFA, 0x00, 0xB0, 0xF2, 0xBF, 0x07, + 0xB6, 0xF4, 0xE5, 0x08, 0xC1, 0xFB, 0x8A, 0x06, 0xB8, 0x00, 0x71, 0x01, + 0xEF, 0x0B, 0xE6, 0x04, 0xC5, 0x1F, 0xCE, 0x15, 0xC6, 0x2C, 0xE0, 0x19, + 0xB6, 0x30, 0x34, 0x11, 0x97, 0x3A, 0x29, 0x1D, 0x76, 0x3E, 0x2A, 0x2D, + 0x1B, 0x3B, 0x27, 0x2A, 0x8E, 0x3B, 0x9A, 0x26, 0x27, 0x35, 0xC8, 0x2A, + 0x0B, 0x2E, 0xD1, 0x32, 0xED, 0x2E, 0x67, 0x36, 0x6E, 0x2B, 0xC0, 0x2B, + 0xD0, 0x22, 0xB2, 0x1C, 0xF4, 0x1F, 0xC3, 0x11, 0xAA, 0x1B, 0x64, 0x0A, + 0xFD, 0x11, 0x70, 0x0B, 0x6A, 0x08, 0x79, 0x0B, 0x66, 0xFE, 0xC7, 0xFB, + 0x3E, 0xFE, 0x52, 0xF2, 0x5F, 0xFB, 0x12, 0xF5, 0x0A, 0xF7, 0xB3, 0xF6, + 0x11, 0xFF, 0xCA, 0xFA, 0x06, 0x07, 0x29, 0xFF, 0xA5, 0x06, 0x14, 0xF9, + 0xAA, 0x01, 0x96, 0xEC, 0xCB, 0xF9, 0x07, 0xE6, 0x3C, 0xF4, 0xC3, 0xF1, + 0x59, 0xF4, 0xDC, 0x03, 0x57, 0xEE, 0xAF, 0x03, 0x36, 0xEF, 0xA6, 0x03, + 0xC8, 0xF6, 0xCC, 0x09, 0x40, 0xEE, 0x26, 0x06, 0xDD, 0xE4, 0xF9, 0x00, + 0x70, 0xE4, 0x9A, 0xFC, 0x33, 0xE0, 0xDD, 0xF6, 0xB8, 0xE3, 0xE9, 0xFE, + 0x1B, 0xFA, 0x16, 0x13, 0xB5, 0x07, 0x37, 0x18, 0x39, 0xFD, 0x00, 0x0D, + 0xD1, 0xF0, 0x8D, 0x07, 0x7E, 0xEA, 0x73, 0x07, 0x67, 0xEC, 0x98, 0x0A, + 0xF4, 0xFA, 0x6D, 0x11, 0xB9, 0x0F, 0x4D, 0x17, 0xA3, 0x20, 0x08, 0x20, + 0x75, 0x24, 0xAA, 0x27, 0x72, 0x24, 0x14, 0x22, 0xF6, 0x21, 0xD7, 0x0B, + 0x75, 0x19, 0x26, 0xF8, 0xC4, 0x06, 0x8E, 0xF4, 0xD8, 0xE9, 0xB9, 0xF8, + 0xDF, 0xDC, 0xE9, 0xFF, 0x3E, 0xD7, 0xA3, 0xF6, 0x11, 0xD8, 0xA1, 0xE5, + 0xAC, 0xEB, 0x2F, 0xE9, 0x4C, 0x01, 0xBD, 0xF8, 0x28, 0x1C, 0xA4, 0x13, + 0x90, 0x3A, 0xEA, 0x34, 0xF4, 0x4F, 0x63, 0x45, 0x5B, 0x5E, 0x39, 0x4A, + 0x06, 0x61, 0xCD, 0x50, 0x5A, 0x56, 0x08, 0x50, 0x08, 0x47, 0x2F, 0x41, + 0x2F, 0x3E, 0x37, 0x2F, 0x81, 0x39, 0xDE, 0x28, 0xFB, 0x20, 0xDA, 0x21, + 0x41, 0x03, 0x51, 0x16, 0x97, 0xF2, 0xBC, 0x0C, 0x22, 0xEA, 0xEC, 0x02, + 0x7E, 0xEE, 0x56, 0x00, 0x4D, 0xF8, 0x74, 0x02, 0xCD, 0x01, 0x01, 0x0A, + 0x42, 0x10, 0x1A, 0x1D, 0xE9, 0x1F, 0xD7, 0x34, 0x02, 0x25, 0x4B, 0x49, + 0xD9, 0x24, 0xFE, 0x5A, 0x9F, 0x2F, 0x7F, 0x63, 0x1A, 0x45, 0x5E, 0x5F, + 0x34, 0x53, 0x8C, 0x58, 0xED, 0x4D, 0x07, 0x55, 0xEA, 0x3E, 0xFD, 0x51, + 0xD7, 0x31, 0x04, 0x47, 0xFF, 0x31, 0x5B, 0x3D, 0x23, 0x3B, 0x40, 0x3C, + 0x03, 0x36, 0xA9, 0x32, 0x27, 0x2D, 0x9A, 0x28, 0x7F, 0x2B, 0x28, 0x26, + 0x2D, 0x28, 0x05, 0x1B, 0x8C, 0x24, 0x96, 0x0F, 0x28, 0x20, 0x01, 0x0D, + 0x7C, 0x13, 0xFE, 0x07, 0x3D, 0x0C, 0x9D, 0xFF, 0x82, 0x17, 0x70, 0xFE, + 0x29, 0x19, 0x5D, 0x00, 0xCB, 0x10, 0x86, 0x00, 0x84, 0x14, 0x69, 0x07, + 0xA2, 0x13, 0x40, 0x0F, 0x3C, 0x04, 0xB9, 0x0B, 0x60, 0xF7, 0x98, 0x00, + 0x05, 0xF7, 0xDA, 0xFB, 0x74, 0xF8, 0x2E, 0xF8, 0xC2, 0xFE, 0x1D, 0xF4, + 0x7D, 0x10, 0xC8, 0xFD, 0xC7, 0x10, 0xE7, 0x07, 0x61, 0xFC, 0x1E, 0x03, + 0x84, 0xEE, 0x26, 0xFB, 0x0C, 0xE8, 0x31, 0xF1, 0x35, 0xE2, 0x7F, 0xE3, + 0x5F, 0xE3, 0xC8, 0xE5, 0x82, 0xE2, 0x4F, 0xF0, 0x1D, 0xD2, 0xD4, 0xEA, + 0xFE, 0xBF, 0x54, 0xDC, 0x78, 0xBC, 0xF7, 0xD5, 0x1F, 0xCD, 0xCE, 0xD9, + 0x17, 0xE4, 0xB7, 0xDE, 0x89, 0xF6, 0xF4, 0xEA, 0x4B, 0x02, 0x17, 0xF9, + 0x71, 0x03, 0xC3, 0xFA, 0x4D, 0xF9, 0x78, 0xEF, 0x2E, 0xE5, 0x10, 0xDE, + 0x48, 0xD4, 0x23, 0xDB, 0xCE, 0xC5, 0x6B, 0xD9, 0x62, 0xB5, 0x57, 0xCB, + 0xA4, 0xA9, 0x82, 0xBF, 0x0F, 0x9F, 0x13, 0xB4, 0x24, 0x9C, 0xC9, 0xAA, + 0xC5, 0xA7, 0x33, 0xAE, 0x51, 0xB8, 0x6B, 0xBB, 0xCA, 0xD4, 0x9A, 0xD3, + 0xC9, 0xF7, 0x4F, 0xFA, 0xF9, 0x0A, 0x03, 0x1A, 0xE3, 0x12, 0xC0, 0x26, + 0xE9, 0x16, 0xE0, 0x24, 0x5C, 0x0F, 0x1E, 0x15, 0xF3, 0xFF, 0xD9, 0x02, + 0x63, 0xF5, 0x08, 0xF5, 0xD2, 0xEF, 0x67, 0xE8, 0x35, 0xEB, 0x61, 0xD9, + 0xD2, 0xE0, 0xC3, 0xCB, 0x00, 0xCD, 0xFA, 0xC3, 0xDC, 0xBD, 0xE4, 0xBD, + 0x70, 0xB7, 0x96, 0xB4, 0x29, 0xC1, 0x2C, 0xB3, 0xA0, 0xE3, 0x98, 0xC4, + 0xE2, 0x06, 0x60, 0xD5, 0xDF, 0x1C, 0x98, 0xE4, 0x9F, 0x23, 0x19, 0xF9, + 0x1D, 0x20, 0xDD, 0x07, 0x4F, 0x17, 0xBA, 0x14, 0x6A, 0x0F, 0xDD, 0x1F, + 0xF3, 0x14, 0xEC, 0x26, 0x5A, 0x23, 0x46, 0x2E, 0x1F, 0x2A, 0x92, 0x2F, + 0x9A, 0x1C, 0x8B, 0x25, 0xC8, 0x00, 0x68, 0x14, 0x6E, 0xED, 0xB3, 0x05, + 0x3F, 0xF4, 0x69, 0x03, 0x20, 0x07, 0x4D, 0x0C, 0x86, 0x11, 0xA7, 0x10, + 0xBA, 0x18, 0x0C, 0x10, 0x9A, 0x19, 0x52, 0x0F, 0x01, 0x0E, 0x2F, 0x02, + 0xCE, 0xFD, 0x74, 0xE8, 0x2C, 0xED, 0xD4, 0xD8, 0x9C, 0xE5, 0x9B, 0xE5, + 0xDE, 0xE5, 0x25, 0xFB, 0x54, 0xEB, 0x6F, 0x04, 0xBD, 0xF5, 0x18, 0xFE, + 0xF5, 0xF8, 0x11, 0xEE, 0x26, 0xE8, 0xBB, 0xDE, 0xE7, 0xD0, 0xC3, 0xD2, + 0xAB, 0xD0, 0x2B, 0xCD, 0xCF, 0xE3, 0x06, 0xD1, 0xB4, 0xF5, 0x28, 0xE0, + 0x78, 0x00, 0x19, 0xF3, 0x76, 0x02, 0x58, 0xF8, 0x89, 0xF9, 0xE0, 0xE5, + 0x76, 0xEF, 0x1A, 0xD1, 0x0E, 0xE6, 0xF6, 0xD0, 0x04, 0xDB, 0x4A, 0xDC, + 0x6D, 0xD5, 0x01, 0xE1, 0x59, 0xD0, 0xF4, 0xD7, 0xA4, 0xC7, 0xA9, 0xCF, + 0xF3, 0xC4, 0x09, 0xD1, 0x82, 0xC8, 0xB0, 0xD0, 0x05, 0xD9, 0xD4, 0xD7, + 0xA2, 0xF2, 0x11, 0xE8, 0x76, 0xFB, 0xE9, 0xEE, 0x15, 0xF9, 0x3B, 0xF5, + 0x40, 0xF9, 0xDF, 0xFD, 0xC8, 0xF7, 0x23, 0xFC, 0x8C, 0xF4, 0x50, 0xF7, + 0x8B, 0xEA, 0xF1, 0xED, 0x46, 0xDA, 0xB9, 0xDD, 0x85, 0xCC, 0xEF, 0xD2, + 0x31, 0xC1, 0xD3, 0xD0, 0x3C, 0xBD, 0x8B, 0xD5, 0x37, 0xC4, 0xB6, 0xD6, + 0x02, 0xD2, 0xB4, 0xD8, 0x2F, 0xE1, 0x63, 0xE8, 0x60, 0xF3, 0xCE, 0xF8, + 0xD2, 0x07, 0xC8, 0x05, 0xDD, 0x1D, 0x66, 0x15, 0xB1, 0x2D, 0x25, 0x24, + 0x54, 0x28, 0xDE, 0x2B, 0x90, 0x1C, 0x81, 0x24, 0x61, 0x12, 0x88, 0x0C, + 0x93, 0xFF, 0xBD, 0xE9, 0xC0, 0xF0, 0x21, 0xCB, 0xDC, 0xEA, 0xEE, 0xB7, + 0xF5, 0xE0, 0xF9, 0xB3, 0x54, 0xD3, 0x6B, 0xBA, 0x1B, 0xCB, 0x8C, 0xC0, + 0xC9, 0xCB, 0x87, 0xC9, 0xF8, 0xD2, 0x2A, 0xD1, 0xB0, 0xE6, 0xBD, 0xDB, + 0x0F, 0x00, 0xEA, 0xEB, 0x33, 0x0E, 0x2E, 0xF8, 0x70, 0x10, 0xE5, 0xFF, + 0xB5, 0x0F, 0x41, 0x07, 0xB8, 0x10, 0x1D, 0x0B, 0x0F, 0x11, 0xC4, 0x06, + 0xEF, 0x12, 0xA1, 0xFC, 0x2C, 0x0A, 0xFF, 0xF1, 0x8F, 0xEB, 0x77, 0xEE, + 0x2A, 0xD5, 0xF9, 0xF8, 0x7D, 0xD2, 0xCF, 0xFE, 0x4D, 0xD5, 0x4B, 0xF7, + 0xCC, 0xDB, 0xB4, 0xEC, 0x7F, 0xE0, 0x6A, 0xE3, 0x0F, 0xE6, 0xD1, 0xE2, + 0x3B, 0xF5, 0x36, 0xEA, 0x22, 0x00, 0x04, 0xF3, 0xD9, 0xF8, 0x90, 0xF2, + 0x68, 0xED, 0x23, 0xE8, 0x81, 0xEB, 0xF9, 0xDB, 0x4D, 0xEA, 0xB6, 0xD2, + 0x2E, 0xE2, 0xC6, 0xCE, 0x27, 0xD6, 0x4D, 0xCA, 0xCF, 0xC7, 0x14, 0xC7, + 0x29, 0xC2, 0xC9, 0xCE, 0x00, 0xCF, 0x92, 0xD5, 0x61, 0xE6, 0xED, 0xD2, + 0x26, 0xF3, 0xB9, 0xD1, 0x5D, 0xF1, 0x1E, 0xD7, 0xAE, 0xF0, 0x67, 0xE1, + 0xFB, 0xF0, 0x74, 0xEA, 0xFC, 0xF4, 0x7D, 0xF2, 0x71, 0xF9, 0x3B, 0xFA, + 0x84, 0xF2, 0x6C, 0xFE, 0xFC, 0xE7, 0x05, 0xFA, 0x99, 0xE9, 0x75, 0xEC, + 0x5F, 0xF0, 0xE3, 0xD7, 0x9F, 0xEF, 0xAC, 0xCE, 0xED, 0xED, 0x1C, 0xE5, + 0x81, 0xEF, 0x9D, 0xFF, 0x9E, 0x01, 0x6B, 0x0E, 0x2B, 0x20, 0xF0, 0x1D, + 0x02, 0x32, 0xE1, 0x2C, 0xFC, 0x37, 0xE6, 0x36, 0xE2, 0x37, 0x10, 0x36, + 0x5C, 0x2D, 0x4E, 0x2E, 0xCE, 0x16, 0x46, 0x26, 0x26, 0xFD, 0x3F, 0x19, + 0x88, 0xEC, 0x91, 0x0D, 0x15, 0xE5, 0x21, 0x07, 0x70, 0xE9, 0x3F, 0xFD, + 0x61, 0xFA, 0x76, 0xFA, 0xEA, 0x10, 0x97, 0x08, 0x65, 0x23, 0x97, 0x1B, + 0x55, 0x31, 0xF7, 0x2D, 0x13, 0x42, 0x3A, 0x41, 0x9E, 0x4F, 0xE1, 0x50, + 0x4B, 0x56, 0x0A, 0x5A, 0x47, 0x5C, 0x81, 0x62, 0xB6, 0x5D, 0x33, 0x5D, + 0x95, 0x51, 0x11, 0x47, 0x3B, 0x3E, 0x4B, 0x35, 0x5E, 0x24, 0xB4, 0x20, + 0xD9, 0xFE, 0xFB, 0x04, 0xC1, 0xE1, 0xC4, 0xF6, 0x76, 0xD9, 0xF3, 0xF2, + 0xC9, 0xE1, 0x23, 0xF4, 0xEB, 0xF0, 0xF1, 0x05, 0x65, 0xFA, 0xFB, 0x15, + 0x43, 0x03, 0xB2, 0x14, 0x7F, 0x11, 0x1F, 0x10, 0x30, 0x25, 0x39, 0x12, + 0xC4, 0x3B, 0xF3, 0x18, 0x7D, 0x4A, 0x7A, 0x1C, 0x10, 0x52, 0x9A, 0x20, + 0xD3, 0x50, 0x00, 0x28, 0xC6, 0x40, 0x60, 0x29, 0x54, 0x30, 0x94, 0x22, + 0x2F, 0x22, 0x19, 0x17, 0x81, 0x15, 0x78, 0x13, 0x67, 0x1A, 0x6E, 0x18, + 0x80, 0x2E, 0x4A, 0x1C, 0x66, 0x3F, 0x7B, 0x21, 0xAE, 0x3F, 0x33, 0x20, + 0xA5, 0x30, 0x8C, 0x19, 0x50, 0x25, 0x1A, 0x1C, 0xC5, 0x1F, 0x3A, 0x25, + 0x25, 0x1D, 0x7D, 0x2D, 0x94, 0x1D, 0xCA, 0x31, 0xA5, 0x18, 0xEC, 0x30, + 0x9B, 0x0E, 0x73, 0x29, 0xFD, 0xFE, 0x1B, 0x1C, 0x19, 0xEC, 0xB9, 0x0D, + 0xC7, 0xDE, 0x44, 0x01, 0x5C, 0xDC, 0x2B, 0xF5, 0x66, 0xE9, 0x43, 0xF1, + 0xF0, 0xFB, 0xAC, 0xF7, 0xB4, 0x00, 0x87, 0x00, 0xC6, 0xFF, 0xBA, 0x08, + 0x48, 0x02, 0xD3, 0x04, 0x89, 0x05, 0x19, 0xFE, 0xFD, 0x0A, 0x2B, 0xFE, + 0xD5, 0x0E, 0x7E, 0xF9, 0x42, 0x0C, 0x3D, 0xF4, 0x6F, 0x03, 0xA0, 0xF5, + 0x4F, 0xF2, 0x68, 0xED, 0xF6, 0xDF, 0x4A, 0xDD, 0x27, 0xD7, 0x11, 0xD8, + 0x52, 0xD4, 0x3D, 0xD7, 0x9E, 0xDA, 0xB0, 0xD8, 0xB5, 0xED, 0xDD, 0xDF, + 0x82, 0x04, 0xC1, 0xEB, 0xB4, 0x12, 0x9B, 0xF8, 0x2C, 0x14, 0x52, 0xFF, + 0x51, 0x0E, 0x89, 0xFE, 0x9A, 0x02, 0x81, 0xF7, 0x1F, 0xF2, 0xCD, 0xF0, + 0x44, 0xE1, 0x74, 0xE8, 0x34, 0xD1, 0x25, 0xDD, 0x1C, 0xC2, 0xB9, 0xD6, + 0xC4, 0xBB, 0x75, 0xD2, 0xD9, 0xBB, 0x08, 0xCE, 0x9C, 0xBA, 0x2A, 0xD6, + 0x9D, 0xBB, 0xFA, 0xE9, 0x6E, 0xD1, 0x31, 0x00, 0x9A, 0xF8, 0xF3, 0x12, + 0x57, 0x17, 0xA3, 0x21, 0x74, 0x29, 0x5B, 0x31, 0xBA, 0x31, 0xBD, 0x3C, + 0xEF, 0x30, 0x05, 0x38, 0x46, 0x2B, 0x90, 0x23, 0x2B, 0x26, 0x58, 0x14, + 0xC8, 0x18, 0x54, 0x09, 0x12, 0x06, 0xD8, 0xF9, 0xB2, 0xF7, 0x89, 0xF0, + 0x69, 0xDE, 0x60, 0xE6, 0x7E, 0xC4, 0x1D, 0xDA, 0xAD, 0xBA, 0xB9, 0xD9, + 0x95, 0xC2, 0xB8, 0xE5, 0xFC, 0xDD, 0xD7, 0xF3, 0xF8, 0x01, 0x09, 0x02, + 0xAB, 0x1A, 0x0E, 0x13, 0xAE, 0x21, 0xA3, 0x24, 0xC1, 0x27, 0xAE, 0x2F, + 0x73, 0x30, 0x3D, 0x2F, 0x17, 0x2E, 0xB8, 0x26, 0xA2, 0x25, 0xA1, 0x21, + 0xC7, 0x1F, 0x33, 0x21, 0x07, 0x1A, 0x82, 0x1B, 0x8D, 0x1B, 0x0B, 0x17, + 0xAE, 0x23, 0xCD, 0x14, 0x31, 0x24, 0xCD, 0x0E, 0x57, 0x18, 0x28, 0x0C, + 0xCC, 0x0B, 0xE9, 0x11, 0x19, 0x12, 0x47, 0x1E, 0x02, 0x25, 0x6F, 0x25, + 0x05, 0x33, 0xDE, 0x23, 0x18, 0x35, 0x36, 0x21, 0x15, 0x26, 0xF8, 0x1A, + 0x02, 0x14, 0x30, 0x11, 0x24, 0x0B, 0xFD, 0x07, 0x7B, 0x05, 0xF8, 0x07, + 0x72, 0xFD, 0x00, 0x0C, 0x8C, 0xF6, 0xCB, 0x0B, 0x7C, 0xF1, 0xD9, 0x0B, + 0x88, 0xE8, 0x87, 0x05, 0xFB, 0xE8, 0xFB, 0xFE, 0x42, 0xF1, 0xD7, 0xFF, + 0x40, 0xF3, 0xDB, 0x07, 0xEB, 0xFE, 0xD8, 0x19, 0xB0, 0x12, 0x17, 0x26, + 0xD7, 0x17, 0x77, 0x20, 0xD8, 0x0E, 0x9B, 0x10, 0xC4, 0x0D, 0x17, 0x02, + 0xAD, 0x17, 0x71, 0xF9, 0x3E, 0x1B, 0x15, 0xF8, 0x4D, 0x0F, 0xA2, 0xFA, + 0x4B, 0xFB, 0xE9, 0xFD, 0x57, 0xF1, 0x8B, 0x02, 0x57, 0xEE, 0xF8, 0x01, + 0xDD, 0xF1, 0x67, 0x00, 0x79, 0x00, 0x2A, 0x01, 0x1B, 0x0D, 0x65, 0x04, + 0x03, 0x14, 0xC9, 0x0F, 0xE3, 0x16, 0x82, 0x16, 0x8D, 0x16, 0xE4, 0x11, + 0x3F, 0x0F, 0xDF, 0x07, 0x2B, 0xFC, 0xED, 0xF6, 0xF7, 0xEA, 0xF7, 0xE3, + 0xB1, 0xE5, 0x08, 0xD9, 0x9C, 0xE3, 0x3E, 0xD8, 0x8D, 0xE1, 0xDA, 0xE3, + 0x63, 0xDC, 0x3D, 0xF5, 0x73, 0xD2, 0xFD, 0x03, 0x27, 0xDB, 0x7C, 0x16, + 0xD5, 0x01, 0x7A, 0x29, 0x34, 0x29, 0xD9, 0x31, 0x83, 0x3B, 0xE3, 0x32, + 0x55, 0x40, 0xBC, 0x35, 0x61, 0x3C, 0xB3, 0x2E, 0x40, 0x31, 0x40, 0x1C, + 0xD9, 0x21, 0x17, 0x0D, 0x4D, 0x0B, 0xDB, 0xFA, 0x4D, 0xF6, 0x95, 0xE9, + 0x5F, 0xEA, 0x95, 0xE3, 0x19, 0xE2, 0xCB, 0xE0, 0x22, 0xD6, 0xFE, 0xDE, + 0x28, 0xC4, 0x77, 0xE3, 0xBD, 0xBD, 0x40, 0xEC, 0xF9, 0xD0, 0xFD, 0xF3, + 0xB2, 0xF0, 0x09, 0xFC, 0x8C, 0x08, 0xBB, 0x07, 0x66, 0x11, 0x15, 0x17, + 0x08, 0x15, 0x30, 0x26, 0x41, 0x1C, 0x20, 0x29, 0x9F, 0x1E, 0x8F, 0x19, + 0xBE, 0x14, 0x0B, 0x09, 0x5D, 0x03, 0x59, 0x03, 0x47, 0xF8, 0x30, 0x00, + 0x74, 0xF4, 0xB8, 0xFE, 0x24, 0xF0, 0x4D, 0x02, 0x98, 0xEB, 0xDA, 0x00, + 0x35, 0xE5, 0x3C, 0xF8, 0xED, 0xE3, 0x4B, 0xF5, 0x46, 0xEC, 0x2F, 0xF3, + 0x18, 0xF7, 0x65, 0xEE, 0x44, 0x00, 0x0A, 0xF5, 0xB4, 0x05, 0xBB, 0x00, + 0x6F, 0x07, 0x4A, 0x06, 0x44, 0x04, 0xBE, 0x04, 0xE2, 0x03, 0x78, 0x05, + 0xAB, 0xF9, 0x14, 0xFF, 0x30, 0xE1, 0x3C, 0xEB, 0x64, 0xD8, 0x5A, 0xDF, + 0xB4, 0xDE, 0x44, 0xD8, 0x63, 0xE6, 0x40, 0xD7, 0xA4, 0xE8, 0xB7, 0xDE, + 0x4A, 0xE0, 0xDD, 0xE2, 0x31, 0xD2, 0x64, 0xE6, 0x25, 0xCD, 0x0C, 0xEB, + 0x44, 0xDE, 0x44, 0xEF, 0x15, 0xF5, 0x8E, 0xF6, 0x13, 0xFF, 0xF8, 0x03, + 0x04, 0x02, 0xFC, 0x10, 0x8F, 0xFC, 0xB8, 0x0D, 0xEA, 0xF6, 0x5C, 0xFF, + 0x15, 0x00, 0xED, 0xF6, 0xF3, 0x07, 0xCB, 0xF6, 0x15, 0x08, 0xA5, 0xFF, + 0xF4, 0x0A, 0xE8, 0x10, 0xEA, 0x0F, 0x07, 0x24, 0x02, 0x12, 0x58, 0x2C, + 0x68, 0x13, 0x5A, 0x26, 0x2D, 0x14, 0xF1, 0x18, 0xAF, 0x11, 0x12, 0x0C, + 0x83, 0x10, 0xE1, 0xFF, 0x64, 0x0F, 0x69, 0xF1, 0x35, 0x04, 0x09, 0xDF, + 0x4F, 0xF3, 0x85, 0xCC, 0x21, 0xE8, 0x2C, 0xC6, 0x7B, 0xE3, 0xBB, 0xD1, + 0xE8, 0xE1, 0x2A, 0xE5, 0xB8, 0xEB, 0xF6, 0xFA, 0xAC, 0x05, 0x6D, 0x11, + 0x07, 0x24, 0x12, 0x1D, 0x92, 0x3C, 0xDB, 0x25, 0x1A, 0x43, 0x1A, 0x31, + 0xFA, 0x39, 0xF5, 0x32, 0x49, 0x2F, 0xF0, 0x2F, 0xFF, 0x25, 0x5F, 0x2C, + 0x0F, 0x1F, 0xE2, 0x23, 0x67, 0x1C, 0x26, 0x19, 0x0E, 0x13, 0x7F, 0x0A, + 0x0E, 0xFC, 0x00, 0xF7, 0xFB, 0xE5, 0x28, 0xE6, 0x5E, 0xD7, 0xB9, 0xDA, + 0x71, 0xD3, 0xB6, 0xD8, 0x8E, 0xDB, 0x9A, 0xE2, 0xFF, 0xE5, 0x0A, 0xF0, + 0x0D, 0xF6, 0xDE, 0x01, 0xDA, 0x07, 0x15, 0x16, 0x97, 0x0D, 0xBB, 0x21, + 0x4E, 0x0F, 0x03, 0x27, 0x49, 0x13, 0x39, 0x26, 0x4D, 0x17, 0xA8, 0x22, + 0xEE, 0x22, 0x98, 0x20, 0x6F, 0x2F, 0x50, 0x1C, 0xAE, 0x2A, 0x58, 0x1A, + 0x3E, 0x1C, 0x32, 0x1D, 0x50, 0x12, 0x14, 0x18, 0xB6, 0x0D, 0x20, 0x0A, + 0x86, 0x07, 0xD8, 0x01, 0x54, 0x02, 0x51, 0x03, 0x40, 0x0C, 0x70, 0x07, + 0x9A, 0x17, 0x10, 0x04, 0xF4, 0x0E, 0xEC, 0xFC, 0xD2, 0xF1, 0xA1, 0xF6, + 0x38, 0xD8, 0x47, 0xF0, 0xA2, 0xD3, 0xC5, 0xE8, 0x72, 0xDD, 0x53, 0xE0, + 0x47, 0xEB, 0x3F, 0xD6, 0xF9, 0xF6, 0x51, 0xD0, 0x3C, 0xFE, 0xF4, 0xD6, + 0x89, 0xFE, 0x46, 0xDC, 0xDA, 0x01, 0x37, 0xDB, 0x40, 0x02, 0x1B, 0xDB, + 0x57, 0xF8, 0x92, 0xDE, 0x76, 0xF2, 0x13, 0xE8, 0x1C, 0xF6, 0x39, 0xF1, + 0x15, 0xFA, 0x78, 0xF0, 0x18, 0xF2, 0x9F, 0xE6, 0x6D, 0xE1, 0x3C, 0xDC, + 0xC2, 0xD8, 0x0F, 0xD9, 0x54, 0xD9, 0x96, 0xDA, 0x90, 0xD6, 0x18, 0xD6, + 0x42, 0xD3, 0x7B, 0xD0, 0x6B, 0xD2, 0x48, 0xD4, 0xD1, 0xD0, 0xA1, 0xE0, + 0x0A, 0xD0, 0x1E, 0xF0, 0xBF, 0xD4, 0x12, 0xFD, 0x09, 0xDD, 0x64, 0x05, + 0x90, 0xE1, 0xCD, 0x09, 0x81, 0xE2, 0x3A, 0x07, 0x15, 0xE3, 0xB4, 0xF9, + 0x3A, 0xE2, 0xB9, 0xE4, 0x67, 0xDC, 0xCB, 0xD1, 0x75, 0xC8, 0x98, 0xBE, + 0xDD, 0xAC, 0x4D, 0xAB, 0x6E, 0x9E, 0x4A, 0x9E, 0x29, 0xA7, 0x43, 0x9E, + 0x71, 0xC0, 0x9B, 0xAD, 0xAC, 0xD5, 0xF2, 0xBD, 0x6D, 0xDC, 0xE5, 0xCA, + 0x9C, 0xDF, 0x21, 0xDC, 0x53, 0xEC, 0xB8, 0xEC, 0x24, 0xFE, 0xA0, 0xF3, + 0x02, 0x0F, 0xAD, 0xF8, 0x43, 0x1A, 0xB0, 0x00, 0x45, 0x1B, 0x0C, 0x02, + 0x62, 0x10, 0x7A, 0xFA, 0x26, 0xF7, 0x4C, 0xE9, 0x23, 0xDB, 0x30, 0xD0, + 0x13, 0xCF, 0x1A, 0xBF, 0x53, 0xD6, 0x45, 0xBF, 0xAA, 0xE3, 0x5D, 0xC5, + 0x32, 0xEB, 0x33, 0xC5, 0x86, 0xEA, 0x67, 0xC6, 0xEE, 0xE8, 0x19, 0xCF, + 0x10, 0xF0, 0xDA, 0xDF, 0x32, 0xFE, 0x6D, 0xF5, 0xF9, 0x0A, 0xB7, 0x05, + 0xEC, 0x10, 0x3F, 0x15, 0x4D, 0x0D, 0x6A, 0x21, 0x83, 0x03, 0x3E, 0x1E, + 0x3A, 0xFD, 0x74, 0x12, 0x75, 0xFE, 0xC9, 0x0C, 0xBB, 0xFE, 0x2E, 0x07, + 0xD1, 0x00, 0x2B, 0x02, 0x4E, 0x0B, 0x06, 0x09, 0xBD, 0x18, 0x48, 0x10, + 0x6F, 0x26, 0x90, 0x0E, 0xBE, 0x28, 0xF5, 0x07, 0x58, 0x1C, 0xD0, 0x04, + 0x21, 0x11, 0xC7, 0x08, 0x3E, 0x0D, 0xBC, 0x12, 0x3C, 0x07, 0x99, 0x17, + 0x3F, 0x00, 0x4E, 0x0E, 0x2B, 0xF7, 0x62, 0x00, 0x8D, 0xEA, 0xF3, 0xF6, + 0xAE, 0xE4, 0xE3, 0xF0, 0x21, 0xE1, 0x8A, 0xEB, 0x93, 0xE3, 0xB8, 0xE9, + 0xE2, 0xEE, 0x3F, 0xED, 0x34, 0xEF, 0x8E, 0xEE, 0xB7, 0xE7, 0xDD, 0xEC, + 0x2B, 0xE5, 0x64, 0xE9, 0x35, 0xE1, 0xF2, 0xE9, 0x2E, 0xE2, 0xCD, 0xF4, + 0x74, 0xF3, 0x9E, 0xFA, 0xB8, 0x07, 0xC0, 0xF3, 0x7C, 0x0E, 0x88, 0xEC, + 0x45, 0x07, 0xD6, 0xEB, 0xF7, 0xF5, 0x54, 0xEA, 0x31, 0xE7, 0x19, 0xE6, + 0x7D, 0xE8, 0x39, 0xE2, 0xC2, 0xF8, 0x6C, 0xE5, 0xB6, 0x08, 0x8B, 0xEE, + 0x44, 0x0B, 0xDD, 0xEF, 0x20, 0x09, 0x79, 0xEF, 0xE1, 0x0A, 0x3B, 0xF8, + 0x09, 0x07, 0xD0, 0xFE, 0x77, 0xFB, 0xB6, 0x00, 0xBD, 0xF1, 0x99, 0x04, + 0xE2, 0xEE, 0x1F, 0xFF, 0x13, 0xEF, 0x85, 0xF1, 0xDE, 0xE0, 0x03, 0xE6, + 0x07, 0xC8, 0xC2, 0xDE, 0x06, 0xB9, 0x60, 0xD9, 0x9C, 0xB7, 0x2A, 0xD9, + 0x00, 0xC7, 0x36, 0xE4, 0xF9, 0xE1, 0x29, 0xF3, 0x5F, 0xFA, 0x5B, 0x01, + 0x39, 0x0D, 0xE1, 0x0A, 0x4D, 0x23, 0xEC, 0x14, 0x71, 0x39, 0xC4, 0x21, + 0x47, 0x42, 0xF7, 0x28, 0x88, 0x3D, 0x16, 0x30, 0x11, 0x2C, 0xDC, 0x30, + 0xCD, 0x12, 0x47, 0x1C, 0x4A, 0x05, 0x97, 0x00, 0xB0, 0xFD, 0x53, 0xEB, + 0x60, 0xE8, 0x0C, 0xDB, 0xFF, 0xD1, 0x89, 0xD3, 0xEE, 0xC8, 0x13, 0xD5, + 0x61, 0xD0, 0x75, 0xDC, 0x47, 0xE7, 0x41, 0xE5, 0x4D, 0x01, 0xEC, 0xE9, + 0xF3, 0x16, 0x74, 0xEF, 0x8F, 0x2C, 0x93, 0xFB, 0x54, 0x3A, 0x71, 0x04, + 0x9E, 0x39, 0xEB, 0x09, 0xAD, 0x30, 0xA1, 0x13, 0x10, 0x21, 0xB0, 0x1D, + 0x84, 0x1C, 0xED, 0x24, 0x38, 0x28, 0xA3, 0x29, 0x47, 0x30, 0x42, 0x2A, + 0x39, 0x28, 0xBD, 0x21, 0xD6, 0x11, 0x47, 0x14, 0xB9, 0x02, 0xF8, 0x0C, + 0xCF, 0x01, 0x56, 0x0A, 0x2C, 0x04, 0xA7, 0x0A, 0x55, 0x06, 0x1F, 0x0F, + 0xEE, 0x0A, 0xEB, 0x16, 0x04, 0x0D, 0xD1, 0x1F, 0x98, 0x0A, 0x59, 0x24, + 0xE1, 0x0C, 0x4F, 0x26, 0x8C, 0x0C, 0x96, 0x25, 0x81, 0x07, 0x26, 0x1F, + 0x2F, 0x00, 0x18, 0x11, 0xD2, 0xF7, 0x27, 0x04, 0xE8, 0xF8, 0xFD, 0x04, + 0x2C, 0xFB, 0xFC, 0x09, 0x15, 0xF6, 0xD5, 0x09, 0xEB, 0xF2, 0x9E, 0x09, + 0x2E, 0xF7, 0x30, 0x07, 0x8C, 0x01, 0x3E, 0x04, 0x61, 0x0E, 0xEA, 0x07, + 0x08, 0x15, 0x4D, 0x0A, 0xB9, 0x16, 0x93, 0x0D, 0x6F, 0x1D, 0xE5, 0x16, + 0xC9, 0x27, 0x67, 0x1F, 0x25, 0x2E, 0xD5, 0x25, 0x97, 0x22, 0xD1, 0x27, + 0x6E, 0x0F, 0xB9, 0x27, 0x9A, 0x12, 0x5B, 0x2C, 0x03, 0x29, 0x8E, 0x36, + 0x02, 0x42, 0xC4, 0x42, 0x92, 0x53, 0xB3, 0x4D, 0x4C, 0x59, 0x64, 0x52, + 0x1A, 0x5B, 0xFD, 0x4E, 0xFC, 0x55, 0x1E, 0x48, 0x6F, 0x43, 0x27, 0x41, + 0xFE, 0x33, 0x75, 0x3A, 0xAD, 0x29, 0x32, 0x2C, 0x65, 0x16, 0x0F, 0x19, + 0xEB, 0xFC, 0x01, 0x0B, 0xA3, 0xE9, 0xFE, 0x02, 0xBE, 0xE7, 0x50, 0x04, + 0x5B, 0xF9, 0x15, 0x10, 0xFB, 0x11, 0x6A, 0x20, 0xB6, 0x23, 0xA8, 0x34, + 0xE4, 0x30, 0x19, 0x4F, 0x06, 0x3F, 0xB2, 0x61, 0x62, 0x4B, 0x3C, 0x5F, + 0x7D, 0x51, 0xAC, 0x4F, 0xCB, 0x56, 0xB9, 0x40, 0x24, 0x59, 0x85, 0x38, + 0xAB, 0x4D, 0x21, 0x32, 0x1D, 0x34, 0x62, 0x22, 0x9A, 0x10, 0x61, 0x0A, + 0xBE, 0xEF, 0x62, 0xF3, 0xC8, 0xDE, 0x4F, 0xE4, 0xF5, 0xDB, 0x69, 0xDE, + 0x2D, 0xE4, 0x40, 0xE2, 0xEC, 0xF9, 0xD3, 0xF1, 0x1A, 0x10, 0xFD, 0x00, + 0xE7, 0x18, 0xCB, 0x06, 0x4D, 0x1E, 0xCA, 0x09, 0x14, 0x2D, 0x9B, 0x11, + 0x48, 0x3C, 0x6B, 0x1D, 0xB8, 0x3F, 0xB9, 0x29, 0x5F, 0x3B, 0x1B, 0x34, + 0xC1, 0x35, 0xEB, 0x39, 0x57, 0x33, 0x1B, 0x3D, 0x47, 0x32, 0xFD, 0x3A, + 0xE5, 0x28, 0x32, 0x34, 0x0F, 0x1C, 0x60, 0x30, 0xFB, 0x1D, 0x0D, 0x2E, + 0x84, 0x2B, 0x09, 0x2C, 0x56, 0x33, 0x93, 0x2B, 0x53, 0x2E, 0xE9, 0x27, + 0x01, 0x23, 0x18, 0x25, 0x7C, 0x11, 0xA3, 0x25, 0x32, 0xFD, 0x8D, 0x21, + 0x97, 0xF6, 0x4A, 0x19, 0xDB, 0xFC, 0x8E, 0x15, 0x07, 0x04, 0x13, 0x14, + 0x5F, 0x01, 0xB5, 0x0D, 0x60, 0xF6, 0x25, 0x01, 0x9F, 0xEF, 0x17, 0xF3, + 0x8F, 0xEE, 0x1D, 0xED, 0xE9, 0xEF, 0x68, 0xF1, 0x1D, 0xFA, 0xF9, 0xFC, + 0x01, 0x0A, 0x5D, 0x04, 0xA4, 0x12, 0xD6, 0x04, 0x31, 0x0F, 0x67, 0x05, + 0xCD, 0x01, 0x56, 0x04, 0xE1, 0xF3, 0x25, 0x02, 0x56, 0xF1, 0xD0, 0xFD, + 0xC9, 0xF7, 0x11, 0xF6, 0x5D, 0xF2, 0x0D, 0xEC, 0x6B, 0xE2, 0xE9, 0xE5, + 0xD5, 0xD9, 0x30, 0xE8, 0x83, 0xD9, 0x56, 0xF2, 0xF1, 0xDD, 0xB2, 0x02, + 0xBF, 0xE7, 0xE8, 0x10, 0x80, 0xF4, 0x22, 0x18, 0x92, 0xFC, 0x24, 0x19, + 0x1F, 0xF9, 0x99, 0x10, 0xAB, 0xEF, 0xC1, 0xFB, 0x5D, 0xED, 0x0C, 0xE5, + 0xC3, 0xEC, 0xDB, 0xD2, 0xDA, 0xE6, 0x2D, 0xC4, 0x63, 0xDF, 0x29, 0xBC, + 0x44, 0xD5, 0x3E, 0xB5, 0xBF, 0xC8, 0x3D, 0xAF, 0x98, 0xBF, 0x44, 0xB2, + 0x48, 0xBE, 0x7D, 0xC0, 0xB8, 0xC9, 0x84, 0xD9, 0x9F, 0xE2, 0x4B, 0xF3, + 0x28, 0x06, 0x7F, 0x06, 0xEE, 0x21, 0xB4, 0x12, 0x42, 0x23, 0x8E, 0x13, + 0x24, 0x1C, 0xEF, 0x09, 0x2D, 0x14, 0x89, 0xFB, 0x51, 0xFF, 0x7C, 0xEC, + 0xFF, 0xE6, 0x67, 0xE4, 0x15, 0xD7, 0x50, 0xE1, 0x14, 0xCC, 0x99, 0xD8, + 0x75, 0xBF, 0x8F, 0xCB, 0x04, 0xB2, 0x33, 0xC2, 0x77, 0xAC, 0xBE, 0xC2, + 0x4B, 0xB4, 0xDC, 0xCD, 0x2D, 0xC4, 0x5B, 0xE1, 0xC3, 0xD6, 0xD8, 0xF5, + 0x25, 0xEB, 0x3C, 0x05, 0x77, 0xFB, 0x3A, 0x0F, 0xFC, 0x05, 0xB6, 0x13, + 0x70, 0x0D, 0x90, 0x13, 0x02, 0x0E, 0x30, 0x11, 0xEC, 0x04, 0xCC, 0x11, + 0x0C, 0xFA, 0x89, 0x13, 0x4F, 0xF8, 0x34, 0x0F, 0xA0, 0x04, 0x72, 0x09, + 0x11, 0x16, 0x1A, 0x03, 0x9D, 0x1E, 0xD6, 0xFB, 0xC4, 0x1C, 0x5D, 0xFA, + 0x7A, 0x18, 0x21, 0xFF, 0x98, 0x1C, 0x7F, 0x07, 0x3B, 0x27, 0x37, 0x11, + 0x89, 0x2C, 0x7B, 0x19, 0x55, 0x28, 0x69, 0x19, 0xA7, 0x1C, 0x21, 0x11, + 0xEE, 0x0E, 0x95, 0x06, 0xC3, 0x02, 0xD1, 0xFE, 0x98, 0xF8, 0xC6, 0xF7, + 0x2C, 0xF6, 0x4D, 0xF2, 0x2B, 0xFB, 0xE2, 0xF3, 0x25, 0x00, 0xC3, 0xF6, + 0x1F, 0x00, 0xA8, 0xF8, 0xFF, 0xF8, 0x0E, 0xFD, 0x98, 0xEC, 0x09, 0x00, + 0xBC, 0xE1, 0x0A, 0xFC, 0x2A, 0xE5, 0xC6, 0xF9, 0x40, 0xF2, 0x2C, 0xFE, + 0xA2, 0xF5, 0x33, 0x00, 0x3C, 0xEE, 0xC6, 0xFB, 0x18, 0xE8, 0x95, 0xF4, + 0xE5, 0xE8, 0x82, 0xEC, 0x8A, 0xEA, 0x83, 0xDF, 0x48, 0xED, 0xED, 0xDA, + 0xA4, 0xF0, 0x38, 0xE6, 0x97, 0xF1, 0xDF, 0xF5, 0x4E, 0xF9, 0xFB, 0x03, + 0x60, 0x04, 0x17, 0x0D, 0x5D, 0x05, 0x00, 0x13, 0x17, 0xFE, 0x2E, 0x16, + 0x07, 0xFB, 0x3A, 0x14, 0x24, 0x00, 0xCB, 0x08, 0x9D, 0xFE, 0xC6, 0xF2, + 0x0E, 0xEE, 0xB5, 0xD9, 0x52, 0xD6, 0xE1, 0xBF, 0x39, 0xBB, 0xC9, 0xA9, + 0xCD, 0xA5, 0x2B, 0xA4, 0xAF, 0xA2, 0x13, 0xB2, 0xF5, 0xB1, 0xC6, 0xC6, + 0x89, 0xC7, 0x12, 0xD7, 0x94, 0xE0, 0xF9, 0xE5, 0x37, 0xFE, 0xB8, 0xF7, + 0x75, 0x18, 0x75, 0x0A, 0x32, 0x29, 0xDB, 0x17, 0x41, 0x2B, 0xF3, 0x1C, + 0x0D, 0x24, 0x61, 0x1B, 0xA7, 0x1B, 0xC8, 0x11, 0xD7, 0x0E, 0xB0, 0xFF, + 0x09, 0xFD, 0xEE, 0xE9, 0xF7, 0xE2, 0xD1, 0xD2, 0x68, 0xC3, 0x51, 0xBE, + 0x3D, 0xB0, 0x65, 0xB4, 0x78, 0xAF, 0x85, 0xB1, 0xE7, 0xB7, 0xF1, 0xAC, + 0x8A, 0xBF, 0x68, 0xAB, 0x5B, 0xC9, 0xDC, 0xB9, 0xBE, 0xD8, 0x7C, 0xD1, + 0x26, 0xE6, 0xC0, 0xE2, 0xAF, 0xF1, 0xD4, 0xF0, 0xE9, 0xFB, 0x5B, 0x01, + 0x3C, 0x02, 0x7C, 0x0D, 0xCF, 0x06, 0xFE, 0x0D, 0x5D, 0x0C, 0xA7, 0x06, + 0xD5, 0x0E, 0x58, 0xFF, 0x8B, 0x0B, 0x74, 0xFB, 0xD8, 0x06, 0xE7, 0xF6, + 0x97, 0x00, 0x04, 0xF2, 0x41, 0xFA, 0x4A, 0xF1, 0x46, 0xF7, 0xA1, 0xF4, + 0x81, 0xF3, 0x07, 0xFA, 0x31, 0xF0, 0xE5, 0xFB, 0x23, 0xF2, 0x54, 0xF5, + 0x58, 0xF9, 0x30, 0xEE, 0xC0, 0xFC, 0x96, 0xEB, 0x7F, 0xF6, 0x33, 0xEB, + 0x6B, 0xEB, 0x0B, 0xEC, 0x76, 0xDE, 0x75, 0xE9, 0x92, 0xD6, 0xBC, 0xE3, + 0xFE, 0xD6, 0xC6, 0xDE, 0x9E, 0xDA, 0x97, 0xDE, 0x38, 0xE3, 0x3F, 0xE2, + 0xD9, 0xED, 0xF2, 0xE1, 0xFE, 0xEF, 0xEF, 0xE1, 0xF6, 0xEA, 0x2E, 0xE3, + 0x4B, 0xEE, 0xD0, 0xE6, 0x9C, 0xF9, 0xB9, 0xF4, 0x6F, 0x00, 0x5F, 0x02, + 0xE9, 0x03, 0xFB, 0x02, 0xF1, 0x06, 0x3E, 0xFD, 0x1C, 0x0C, 0xD8, 0xFE, + 0x92, 0x0C, 0x8F, 0xFF, 0xF0, 0x02, 0x96, 0xF6, 0x69, 0xF9, 0x28, 0xF4, + 0x6C, 0xF4, 0x90, 0x00, 0x7E, 0xF7, 0xF7, 0x11, 0x52, 0x04, 0x9C, 0x1C, + 0xB8, 0x15, 0x7C, 0x21, 0xAD, 0x28, 0x21, 0x2A, 0x82, 0x31, 0x99, 0x33, + 0xD5, 0x2B, 0x1D, 0x34, 0xF7, 0x24, 0x54, 0x2D, 0x56, 0x1E, 0x0B, 0x27, + 0x2D, 0x13, 0xB8, 0x1D, 0x0B, 0x05, 0x07, 0x0F, 0x38, 0xF7, 0x44, 0xFE, + 0xB0, 0xEF, 0xCD, 0xEE, 0x69, 0xF0, 0x8A, 0xE8, 0xBA, 0xF3, 0x74, 0xF4, + 0xCE, 0xF4, 0xE7, 0x0C, 0xF6, 0xFE, 0xC7, 0x23, 0x8F, 0x1B, 0xCF, 0x37, + 0x99, 0x3D, 0xFD, 0x46, 0xD4, 0x51, 0xD9, 0x4E, 0x64, 0x55, 0x1F, 0x51, + 0x88, 0x4D, 0x9D, 0x4F, 0xA1, 0x3B, 0x9B, 0x4B, 0x9E, 0x27, 0x4E, 0x3E, + 0x0B, 0x19, 0xBE, 0x27, 0x5B, 0x0F, 0x3D, 0x11, 0x19, 0x09, 0xC4, 0x02, + 0x74, 0x07, 0x65, 0xFA, 0x85, 0x03, 0xD0, 0xED, 0x70, 0xFA, 0xA6, 0xE1, + 0x3E, 0xFD, 0xDD, 0xDF, 0x2F, 0x0D, 0x3F, 0xE7, 0xB9, 0x1C, 0x0D, 0xF4, + 0xD0, 0x2A, 0x4F, 0x02, 0x30, 0x36, 0x38, 0x11, 0xB7, 0x38, 0x3E, 0x1D, + 0xED, 0x32, 0xA0, 0x21, 0x4A, 0x2D, 0x4A, 0x20, 0x72, 0x27, 0xF1, 0x1F, + 0xEC, 0x1C, 0x78, 0x20, 0x31, 0x11, 0xBF, 0x19, 0x48, 0x0B, 0xE5, 0x0E, + 0x12, 0x0E, 0x1A, 0x03, 0x32, 0x10, 0xB4, 0xFA, 0xD0, 0x0D, 0x7B, 0xFE, + 0xAA, 0x0A, 0x8B, 0x09, 0x10, 0x06, 0x47, 0x11, 0xFC, 0x02, 0x33, 0x13, + 0x2C, 0x07, 0x72, 0x12, 0x70, 0x0F, 0x4E, 0x0B, 0x92, 0x0E, 0x63, 0x00, + 0xAF, 0x01, 0x0C, 0x00, 0x79, 0xF5, 0xC1, 0x06, 0x48, 0xF2, 0xA2, 0x02, + 0x66, 0xF6, 0xFC, 0xF2, 0xCC, 0xF9, 0xA0, 0xE3, 0x7C, 0xF5, 0x98, 0xD7, + 0x11, 0xEE, 0xC3, 0xD0, 0x51, 0xEC, 0x7A, 0xD2, 0x8F, 0xEE, 0x79, 0xD8, + 0x7E, 0xF2, 0x24, 0xE1, 0x6F, 0xFD, 0x3B, 0xF0, 0x8F, 0x08, 0xB9, 0xFC, + 0xE2, 0x0A, 0x53, 0xFB, 0x87, 0x02, 0x98, 0xEF, 0x00, 0xF0, 0x23, 0xE7, + 0xB9, 0xDE, 0xA5, 0xE7, 0x1C, 0xDD, 0x5B, 0xE9, 0xCC, 0xE6, 0x6F, 0xE9, + 0xF1, 0xE9, 0x69, 0xEC, 0x9F, 0xE2, 0x16, 0xF1, 0xF2, 0xDC, 0xE8, 0xF2, + 0x03, 0xDF, 0xAA, 0xF4, 0x72, 0xE5, 0x9D, 0xFA, 0x67, 0xEA, 0x68, 0xFE, + 0x2E, 0xE8, 0xEF, 0xFA, 0x55, 0xE1, 0xEF, 0xF4, 0x56, 0xD8, 0x3D, 0xEE, + 0x24, 0xCC, 0x2D, 0xE2, 0x45, 0xC1, 0x1A, 0xD1, 0x64, 0xB9, 0xF5, 0xC1, + 0x59, 0xB4, 0x17, 0xBD, 0x5D, 0xBB, 0x38, 0xC8, 0x4C, 0xCF, 0x91, 0xDF, + 0xC7, 0xE2, 0x7E, 0xF6, 0x7D, 0xF4, 0xDD, 0x04, 0x5A, 0x0B, 0x44, 0x0C, + 0xEA, 0x1E, 0x6A, 0x0E, 0xED, 0x26, 0x5A, 0x10, 0x5C, 0x27, 0x12, 0x14, + 0x3C, 0x1E, 0xCB, 0x13, 0x98, 0x0D, 0xF2, 0x09, 0xCE, 0xFF, 0x98, 0xF4, + 0x5B, 0xF5, 0x3E, 0xDF, 0x51, 0xE3, 0x40, 0xD2, 0x77, 0xC8, 0x1B, 0xCC, + 0x4B, 0xB3, 0xE8, 0xCC, 0xA9, 0xB0, 0x89, 0xD2, 0x94, 0xBE, 0x3C, 0xDB, + 0xF3, 0xD2, 0xD8, 0xE3, 0x7D, 0xEA, 0x5D, 0xEB, 0xD4, 0x01, 0xA8, 0xF2, + 0x2D, 0x1A, 0x68, 0xF9, 0xE4, 0x2E, 0x49, 0x01, 0xE8, 0x2F, 0xF2, 0x08, + 0x25, 0x22, 0xED, 0x13, 0x82, 0x17, 0x6E, 0x20, 0xB2, 0x15, 0xC2, 0x26, + 0x16, 0x1A, 0x69, 0x29, 0xC7, 0x1B, 0xE2, 0x29, 0x44, 0x17, 0xC3, 0x25, + 0x34, 0x11, 0x4E, 0x1D, 0x65, 0x0D, 0xB0, 0x16, 0x90, 0x10, 0x3B, 0x16, + 0xAC, 0x13, 0x09, 0x1B, 0x4B, 0x11, 0x6C, 0x1D, 0x66, 0x11, 0xF3, 0x19, + 0xCA, 0x13, 0x49, 0x19, 0xC1, 0x13, 0x99, 0x1C, 0x1D, 0x10, 0x18, 0x1F, + 0xE2, 0x07, 0x7E, 0x21, 0x09, 0xFD, 0xB8, 0x1E, 0xD0, 0xF7, 0x80, 0x14, + 0xC9, 0xFA, 0x83, 0x0F, 0xFE, 0x00, 0x06, 0x0F, 0xFB, 0x07, 0x54, 0x0C, + 0x78, 0x09, 0xB0, 0x0B, 0x65, 0x06, 0x92, 0x0F, 0xEB, 0x04, 0x5E, 0x12, + 0xBE, 0x05, 0x1E, 0x10, 0xC1, 0x07, 0x21, 0x0B, 0xE0, 0x06, 0x33, 0x03, + 0x67, 0x05, 0x23, 0xFA, 0x17, 0x0B, 0x21, 0xF4, 0x7E, 0x12, 0x66, 0xF2, + 0xC5, 0x0B, 0xB9, 0xF2, 0x15, 0xFE, 0x56, 0xF9, 0x69, 0xFE, 0x5C, 0x03, + 0xDA, 0x0C, 0xBE, 0x07, 0x7E, 0x1D, 0xB0, 0x0F, 0xC6, 0x23, 0xC6, 0x18, + 0x96, 0x1E, 0x2A, 0x1B, 0x6D, 0x1A, 0xBB, 0x1D, 0x97, 0x1C, 0xB1, 0x19, + 0x79, 0x1D, 0x3F, 0x08, 0x9D, 0x10, 0x85, 0xF5, 0xED, 0xF6, 0x5D, 0xEA, + 0x14, 0xD9, 0x78, 0xE0, 0x16, 0xBE, 0x2C, 0xD4, 0x9F, 0xB0, 0xDE, 0xCA, + 0x0D, 0xB5, 0x68, 0xCD, 0x0A, 0xC7, 0x26, 0xDC, 0xFD, 0xDF, 0xB9, 0xEF, + 0x64, 0xF9, 0x7E, 0x03, 0x80, 0x0E, 0xE9, 0x12, 0x98, 0x1D, 0xE0, 0x20, + 0xC3, 0x2A, 0x70, 0x2D, 0xDA, 0x38, 0x36, 0x30, 0x1F, 0x40, 0xCF, 0x26, + 0x6C, 0x39, 0xA1, 0x17, 0x7D, 0x26, 0x9A, 0x09, 0xA9, 0x0C, 0xB4, 0xFA, + 0x18, 0xF2, 0x57, 0xE9, 0x84, 0xDC, 0xD6, 0xDB, 0xC5, 0xCC, 0x3C, 0xDA, + 0x34, 0xC1, 0xA3, 0xE4, 0xA0, 0xBE, 0x18, 0xF2, 0xB1, 0xC7, 0xAC, 0xFA, + 0x96, 0xD9, 0x69, 0xFC, 0xF6, 0xED, 0xDE, 0xFC, 0x5A, 0xFE, 0x55, 0x01, + 0x53, 0x0C, 0x8E, 0x0A, 0x2F, 0x19, 0xDD, 0x19, 0x85, 0x21, 0xBA, 0x27, + 0xCD, 0x23, 0x57, 0x2A, 0xB4, 0x20, 0xCC, 0x20, 0x51, 0x1B, 0xB0, 0x13, + 0x37, 0x18, 0x4B, 0x0B, 0x4A, 0x13, 0xFD, 0x08, 0x54, 0x0C, 0xD3, 0x0A, + 0xB8, 0x0C, 0x63, 0x0C, 0xF9, 0x10, 0xBC, 0x0D, 0x31, 0x14, 0xC1, 0x09, + 0x44, 0x15, 0x4B, 0x02, 0x07, 0x0F, 0x5E, 0x03, 0x5F, 0x03, 0x8D, 0x0A, + 0xFD, 0xF9, 0x66, 0x0D, 0x31, 0xF8, 0x8E, 0x0A, 0x3D, 0xFA, 0xF8, 0x04, + 0x76, 0xFA, 0xD3, 0xFD, 0x91, 0xF7, 0x2A, 0xFA, 0xC8, 0xF2, 0x33, 0xF8, + 0x5D, 0xF1, 0xA9, 0xEE, 0x16, 0xF5, 0xB8, 0xE3, 0xD5, 0xF5, 0x72, 0xE7, + 0x43, 0xF7, 0x0C, 0xF7, 0xED, 0xFF, 0xEE, 0x04, 0xD8, 0x04, 0x28, 0x14, + 0xF0, 0x06, 0x37, 0x28, 0x1D, 0x0F, 0x30, 0x32, 0xD3, 0x1C, 0x37, 0x2E, + 0x82, 0x2C, 0xBD, 0x28, 0xAF, 0x36, 0xE1, 0x28, 0x2B, 0x32, 0xFD, 0x2B, + 0x4C, 0x22, 0xFA, 0x28, 0x85, 0x17, 0x23, 0x24, 0x59, 0x17, 0x1A, 0x26, + 0x79, 0x1C, 0xCD, 0x2C, 0xC0, 0x23, 0x37, 0x38, 0x7B, 0x2C, 0x77, 0x47, + 0x47, 0x35, 0xF0, 0x4C, 0xEB, 0x3A, 0x95, 0x45, 0xC6, 0x3A, 0x4C, 0x3D, + 0x42, 0x35, 0xBD, 0x33, 0x39, 0x2F, 0x31, 0x26, 0x36, 0x27, 0xDE, 0x13, + 0xEE, 0x18, 0xC0, 0x01, 0x9D, 0x0C, 0x7F, 0xF5, 0x5E, 0x07, 0xD2, 0xEA, + 0xF6, 0x02, 0xB5, 0xE7, 0x07, 0xFD, 0x96, 0xF6, 0xE5, 0xFB, 0xB7, 0x12, + 0xB7, 0x0A, 0x95, 0x30, 0x12, 0x2A, 0x3E, 0x48, 0x0E, 0x49, 0xB5, 0x56, + 0xC5, 0x59, 0xEE, 0x5B, 0xC9, 0x5E, 0xF5, 0x57, 0x3D, 0x58, 0xA4, 0x4E, + 0x91, 0x42, 0xC0, 0x3E, 0xD3, 0x26, 0x62, 0x27, 0xF2, 0x0F, 0x81, 0x12, + 0xC4, 0x02, 0x99, 0x01, 0x8A, 0xFF, 0x9B, 0xEF, 0xD9, 0xFD, 0x4C, 0xDE, + 0x69, 0xF2, 0x1A, 0xD5, 0x55, 0xE1, 0x7B, 0xDD, 0x94, 0xDA, 0x58, 0xF2, + 0x4D, 0xE4, 0x71, 0x04, 0x00, 0xF9, 0x4B, 0x12, 0x9D, 0x0C, 0x4A, 0x1F, + 0xA5, 0x18, 0x24, 0x29, 0xBF, 0x24, 0x76, 0x2E, 0x41, 0x2E, 0xFF, 0x2D, + 0x2C, 0x2C, 0x61, 0x26, 0x7A, 0x26, 0x67, 0x1C, 0xCB, 0x26, 0xA4, 0x18, + 0xB1, 0x2B, 0x22, 0x19, 0x55, 0x30, 0x81, 0x17, 0x97, 0x2D, 0x8B, 0x11, + 0x27, 0x1E, 0xAF, 0x0C, 0xE6, 0x02, 0x45, 0x09, 0xA7, 0xED, 0xF5, 0x03, + 0x4E, 0xEF, 0x28, 0x02, 0x4C, 0xFE, 0x6A, 0x05, 0x0B, 0x08, 0xBE, 0x06, + 0x65, 0x04, 0x0E, 0x01, 0x9C, 0xF7, 0x76, 0xF8, 0x3E, 0xED, 0xF3, 0xEF, + 0x61, 0xEA, 0x37, 0xE7, 0x53, 0xE7, 0x20, 0xDD, 0xB8, 0xE6, 0x2C, 0xD7, + 0x32, 0xED, 0x2D, 0xDC, 0xAB, 0xEE, 0x80, 0xE1, 0x42, 0xE7, 0xC8, 0xE0, + 0x70, 0xDB, 0x84, 0xDE, 0x22, 0xCF, 0xEE, 0xDB, 0x93, 0xCD, 0x5B, 0xDB, + 0x3F, 0xD9, 0x35, 0xE0, 0x8B, 0xE3, 0x4D, 0xE5, 0x9D, 0xE3, 0x72, 0xE2, + 0xE5, 0xDB, 0x20, 0xD8, 0x2C, 0xD7, 0xE2, 0xCE, 0x96, 0xDA, 0xCF, 0xCC, + 0xB4, 0xDA, 0x9B, 0xCF, 0x89, 0xD6, 0x34, 0xD7, 0xA6, 0xD7, 0x0E, 0xDF, + 0xE5, 0xDD, 0x4A, 0xE1, 0x97, 0xE3, 0x11, 0xE3, 0x75, 0xE3, 0xA2, 0xE7, + 0x9C, 0xDC, 0x3B, 0xE9, 0xF6, 0xD4, 0x2E, 0xE8, 0x0B, 0xD5, 0x8D, 0xEB, + 0xA2, 0xDC, 0xDE, 0xEC, 0x17, 0xDC, 0x92, 0xE1, 0x76, 0xCF, 0x95, 0xCB, + 0x9F, 0xBD, 0xCF, 0xB1, 0xEB, 0xA8, 0x56, 0x9F, 0xC1, 0x9D, 0x67, 0x9D, + 0x40, 0xA7, 0x00, 0xAC, 0x5B, 0xBF, 0x51, 0xC2, 0xAF, 0xDB, 0xE1, 0xD4, + 0xE3, 0xF6, 0x70, 0xE5, 0x56, 0x06, 0xFD, 0xF6, 0x9C, 0x04, 0xB1, 0x02, + 0xC8, 0xFF, 0xB8, 0x08, 0x53, 0xFF, 0xEA, 0x09, 0x74, 0xFE, 0xDF, 0x01, + 0xE9, 0xFC, 0xCF, 0xF4, 0x16, 0xF7, 0x80, 0xEA, 0x9B, 0xE4, 0xED, 0xDD, + 0xFE, 0xCA, 0x31, 0xCB, 0x9A, 0xBA, 0x04, 0xBC, 0x5B, 0xBA, 0x4A, 0xB6, + 0xB8, 0xC4, 0xA0, 0xB4, 0xA6, 0xD0, 0xD0, 0xB6, 0x8A, 0xD5, 0xCC, 0xC0, + 0xCB, 0xD6, 0x5D, 0xCF, 0xD4, 0xE0, 0x18, 0xDE, 0xB9, 0xEF, 0x24, 0xEB, + 0x95, 0xF8, 0x58, 0xFB, 0x0B, 0xFF, 0x87, 0x0F, 0xE2, 0x07, 0x76, 0x1F, + 0x1D, 0x0F, 0xF3, 0x23, 0x28, 0x14, 0x97, 0x1D, 0x43, 0x19, 0xE4, 0x16, + 0xD6, 0x1A, 0x7F, 0x14, 0x2D, 0x16, 0x0B, 0x13, 0x62, 0x12, 0x44, 0x12, + 0xA0, 0x11, 0x5A, 0x13, 0xFF, 0x13, 0x30, 0x18, 0xFC, 0x1A, 0xAE, 0x1D, + 0x6E, 0x1F, 0xE4, 0x1A, 0x8B, 0x1C, 0x6B, 0x11, 0xE5, 0x13, 0x4D, 0x0C, + 0x3C, 0x07, 0x88, 0x0F, 0x06, 0xF6, 0x8B, 0x13, 0x14, 0xE9, 0x42, 0x10, + 0xE9, 0xE5, 0x8D, 0x06, 0xDA, 0xE4, 0xD8, 0xF9, 0x2E, 0xE5, 0xEC, 0xEF, + 0x4F, 0xEB, 0x80, 0xED, 0x52, 0xF1, 0x09, 0xED, 0xB7, 0xF4, 0x02, 0xEC, + 0xC1, 0xFC, 0x8A, 0xEB, 0x69, 0x04, 0x5C, 0xEB, 0xD4, 0x08, 0x85, 0xEE, + 0x2E, 0x0E, 0x28, 0xF3, 0xE5, 0x10, 0x82, 0xF3, 0xEB, 0x0D, 0x42, 0xF1, + 0xAF, 0x05, 0x8E, 0xF0, 0xFD, 0xFA, 0x93, 0xEB, 0x2C, 0xF1, 0xFF, 0xE4, + 0x46, 0xED, 0x34, 0xE6, 0x46, 0xF3, 0x52, 0xE9, 0xEC, 0xFC, 0x6A, 0xED, + 0xF1, 0x04, 0x52, 0xF5, 0xFD, 0x0C, 0xE2, 0xFD, 0x94, 0x12, 0xA5, 0x05, + 0xDD, 0x0F, 0xD8, 0x09, 0x0C, 0x04, 0x89, 0x08, 0x03, 0xF2, 0x48, 0x00, + 0xFD, 0xDE, 0xB4, 0xF2, 0xED, 0xCE, 0x8F, 0xE2, 0xEF, 0xBB, 0xAF, 0xD1, + 0xD7, 0xA8, 0x98, 0xC5, 0x36, 0x9F, 0x11, 0xC2, 0x4F, 0x9E, 0x97, 0xC5, + 0xFD, 0xAA, 0xC9, 0xCF, 0x6A, 0xC7, 0xF1, 0xDF, 0xF8, 0xE8, 0x98, 0xF5, + 0xF2, 0x06, 0xD9, 0x0D, 0x44, 0x1F, 0xE9, 0x1C, 0xBB, 0x2C, 0xF3, 0x1B, + 0x0A, 0x29, 0xAB, 0x10, 0x00, 0x1D, 0x93, 0x02, 0xBE, 0x10, 0x2D, 0xF2, + 0x50, 0xFF, 0xC6, 0xDD, 0xD8, 0xE9, 0x91, 0xC7, 0x06, 0xD5, 0xB3, 0xB3, + 0x37, 0xBF, 0xC8, 0xA8, 0x13, 0xB0, 0x07, 0xAB, 0x18, 0xB3, 0x98, 0xB5, + 0x74, 0xC4, 0xE6, 0xC1, 0xD5, 0xDA, 0xFA, 0xCD, 0x85, 0xEE, 0x1C, 0xDA, + 0x63, 0xFD, 0xC4, 0xE4, 0xE4, 0x0B, 0x26, 0xF1, 0xA4, 0x18, 0x7E, 0x04, + 0x8A, 0x1D, 0x68, 0x14, 0x94, 0x19, 0xC9, 0x14, 0xD4, 0x0E, 0x78, 0x0E, + 0x98, 0x00, 0x73, 0x0D, 0xFE, 0xF5, 0xE2, 0x0E, 0xD6, 0xF0, 0xDE, 0x0C, + 0xE0, 0xED, 0x13, 0x07, 0x95, 0xEE, 0x66, 0x05, 0xE5, 0xF4, 0xF9, 0x0A, + 0x30, 0x00, 0xC6, 0x0D, 0x0A, 0x0D, 0xD5, 0x08, 0x95, 0x14, 0x05, 0x05, + 0xC4, 0x15, 0xD8, 0x09, 0x63, 0x15, 0x90, 0x10, 0x8C, 0x13, 0x63, 0x14, + 0x85, 0x07, 0x67, 0x16, 0x8F, 0xF4, 0x39, 0x16, 0xC0, 0xE7, 0xAC, 0x11, + 0x89, 0xE2, 0x45, 0x06, 0x87, 0xE3, 0xFC, 0xF3, 0xF8, 0xE8, 0xEB, 0xE1, + 0x83, 0xED, 0xC4, 0xD9, 0x80, 0xF0, 0x9B, 0xDE, 0xAB, 0xF7, 0xD0, 0xEC, + 0xDB, 0x02, 0x85, 0xFB, 0xE4, 0x0A, 0x95, 0x05, 0xE6, 0x0F, 0x43, 0x0B, + 0xF3, 0x15, 0x49, 0x0C, 0xD9, 0x1C, 0xC0, 0x0B, 0xB9, 0x20, 0xD6, 0x0F, + 0xED, 0x1A, 0xC2, 0x17, 0xA1, 0x0E, 0x25, 0x1A, 0x35, 0x0B, 0x1B, 0x18, + 0x2B, 0x14, 0x2E, 0x1A, 0x16, 0x1E, 0x7A, 0x1B, 0x56, 0x25, 0xE3, 0x1B, + 0x7D, 0x2B, 0x73, 0x22, 0x68, 0x32, 0x42, 0x2E, 0x66, 0x3C, 0x5D, 0x37, + 0x8D, 0x41, 0x46, 0x37, 0x0A, 0x3B, 0x7A, 0x30, 0x7F, 0x2A, 0x65, 0x23, + 0x1E, 0x16, 0x33, 0x10, 0xE4, 0x07, 0x9E, 0xFE, 0x9C, 0x03, 0x69, 0xF3, + 0x54, 0x00, 0xEF, 0xEE, 0xEC, 0xF8, 0x16, 0xF5, 0x7B, 0xF3, 0x5A, 0x02, + 0xE1, 0xF7, 0xE2, 0x11, 0x35, 0x0E, 0x85, 0x25, 0xA8, 0x32, 0xF9, 0x3C, + 0x1F, 0x53, 0xAC, 0x50, 0x91, 0x60, 0x16, 0x5C, 0xB9, 0x5F, 0x30, 0x62, + 0xC4, 0x5D, 0x24, 0x62, 0x65, 0x53, 0x19, 0x5A, 0xC2, 0x3D, 0x21, 0x46, + 0x81, 0x2A, 0x75, 0x29, 0xB9, 0x1E, 0x29, 0x14, 0xEA, 0x12, 0xCD, 0x09, + 0x52, 0xFE, 0xB6, 0xFF, 0x1B, 0xE9, 0x67, 0xF7, 0xA0, 0xDF, 0xC9, 0xF5, + 0x25, 0xE5, 0x93, 0xF6, 0x6E, 0xF5, 0x02, 0xFA, 0xDF, 0x06, 0x23, 0x03, + 0x9D, 0x18, 0x3D, 0x10, 0x65, 0x2C, 0x65, 0x1D, 0xCD, 0x3D, 0xA3, 0x25, + 0x1A, 0x46, 0xF0, 0x26, 0xBD, 0x40, 0x5B, 0x25, 0x95, 0x33, 0x8F, 0x23, + 0x58, 0x2B, 0x6E, 0x22, 0x66, 0x2C, 0xDC, 0x22, 0xEF, 0x2F, 0x7F, 0x26, + 0xBB, 0x30, 0x79, 0x2A, 0x52, 0x2C, 0xD3, 0x25, 0xCB, 0x22, 0xC7, 0x1A, + 0xB5, 0x1A, 0x89, 0x12, 0xBC, 0x18, 0xD8, 0x10, 0x36, 0x19, 0x0B, 0x15, + 0x3A, 0x14, 0xA8, 0x13, 0x72, 0x0C, 0x3B, 0x09, 0x94, 0x09, 0x11, 0x03, + 0x90, 0x09, 0x38, 0x05, 0x82, 0x08, 0xCD, 0x06, 0x09, 0x04, 0x47, 0x01, + 0x49, 0xFD, 0x78, 0xFC, 0xDF, 0xF7, 0x59, 0x01, 0x45, 0xF4, 0xBD, 0x0B, + 0xA7, 0xF2, 0xBE, 0x10, 0xBF, 0xF0, 0xB3, 0x0E, 0xD1, 0xEC, 0x56, 0x0C, + 0x57, 0xEC, 0xE3, 0x09, 0x99, 0xEE, 0xD1, 0x03, 0xA7, 0xEF, 0x16, 0xFC, + 0x92, 0xF1, 0x0B, 0xF5, 0x6F, 0xF5, 0xBB, 0xEE, 0xAD, 0xFB, 0xE7, 0xEC, + 0x7E, 0xFC, 0xF9, 0xEB, 0x44, 0xEF, 0xD4, 0xE7, 0x31, 0xE1, 0x6D, 0xEA, + 0x4D, 0xDF, 0x43, 0xFB, 0x4E, 0xE1, 0x2B, 0x0F, 0xDC, 0xE4, 0xF3, 0x18, + 0xD3, 0xF1, 0x8B, 0x1D, 0xAD, 0x01, 0x18, 0x1D, 0x00, 0x09, 0x1F, 0x11, + 0x26, 0x0A, 0xAB, 0xFF, 0xE9, 0x06, 0x0D, 0xED, 0xF7, 0xFA, 0x9B, 0xD9, + 0x76, 0xE8, 0xC0, 0xC8, 0xA9, 0xD7, 0xD7, 0xBA, 0x13, 0xCE, 0xFD, 0xB0, + 0x46, 0xC8, 0x37, 0xAF, 0x9F, 0xC8, 0x9B, 0xB7, 0x5B, 0xD1, 0xB2, 0xCD, + 0xAB, 0xDD, 0x43, 0xEA, 0xE2, 0xF0, 0x82, 0x00, 0x2B, 0x04, 0xC4, 0x11, + 0x87, 0x0C, 0xEB, 0x1C, 0xD8, 0x13, 0x05, 0x1D, 0xC8, 0x1A, 0xFD, 0x17, + 0xCD, 0x0F, 0x13, 0x0D, 0x39, 0xFA, 0x3A, 0xF8, 0xEE, 0xEA, 0x2E, 0xE6, + 0x68, 0xDD, 0x22, 0xD9, 0x59, 0xD5, 0x32, 0xC9, 0x9B, 0xD8, 0x89, 0xBC, + 0xE3, 0xDA, 0x85, 0xBB, 0x49, 0xD7, 0x48, 0xC8, 0x1F, 0xD6, 0x44, 0xDB, + 0x51, 0xD9, 0x22, 0xEA, 0x77, 0xE0, 0xCB, 0xF5, 0x43, 0xEF, 0x0D, 0x02, + 0xE3, 0x00, 0x61, 0x0D, 0x82, 0x0B, 0xA8, 0x17, 0x82, 0x0E, 0x6F, 0x1E, + 0x59, 0x11, 0x4C, 0x1B, 0x3A, 0x16, 0x62, 0x0F, 0x73, 0x19, 0x1F, 0x02, + 0xF7, 0x17, 0xD5, 0xF9, 0xDD, 0x0F, 0x62, 0xF6, 0xAD, 0x08, 0x54, 0xF9, + 0xA4, 0x06, 0x94, 0x06, 0x0A, 0x08, 0x6C, 0x15, 0x78, 0x0E, 0xDE, 0x18, + 0x45, 0x18, 0x82, 0x12, 0x5D, 0x1D, 0x03, 0x0C, 0x8C, 0x1D, 0x7B, 0x0C, + 0xB3, 0x18, 0x29, 0x16, 0x9F, 0x0C, 0x0C, 0x21, 0xFB, 0x03, 0x52, 0x21, + 0xB0, 0x03, 0xC9, 0x17, 0x65, 0x02, 0xE7, 0x0B, 0x99, 0xF8, 0xAE, 0x03, + 0xA8, 0xF1, 0xC2, 0x01, 0x9A, 0xF4, 0x44, 0x02, 0x52, 0xF7, 0x90, 0x04, + 0x4C, 0xF4, 0x9C, 0x0A, 0x4E, 0xED, 0x11, 0x0D, 0x0E, 0xEA, 0x33, 0x0B, + 0x21, 0xF2, 0xC8, 0x0E, 0x55, 0x01, 0x73, 0x13, 0x4E, 0x0B, 0xFE, 0x13, + 0xD3, 0x0F, 0x21, 0x15, 0xA6, 0x14, 0x47, 0x16, 0x81, 0x17, 0xCE, 0x13, + 0x99, 0x13, 0x4D, 0x0C, 0x8A, 0x0B, 0x1E, 0x03, 0x41, 0x08, 0x10, 0xFF, + 0x52, 0x0B, 0xA6, 0xFE, 0x35, 0x10, 0x4F, 0x01, 0x6F, 0x14, 0xB8, 0x0E, + 0x6F, 0x17, 0x3A, 0x1E, 0x85, 0x18, 0x88, 0x1F, 0xE9, 0x12, 0x2B, 0x12, + 0x34, 0x02, 0x9F, 0x00, 0x9B, 0xED, 0x82, 0xF0, 0x14, 0xDD, 0xEA, 0xE0, + 0xF3, 0xCD, 0xDC, 0xD5, 0x6F, 0xC0, 0xB0, 0xCC, 0x00, 0xBE, 0x46, 0xC3, + 0x46, 0xC5, 0x12, 0xBF, 0x2C, 0xD1, 0x50, 0xC3, 0xB7, 0xE1, 0xCD, 0xCF, + 0xE1, 0xF1, 0x4C, 0xE4, 0x13, 0x07, 0xE6, 0x03, 0xF1, 0x27, 0x54, 0x26, + 0x59, 0x3E, 0x8E, 0x35, 0x5F, 0x38, 0x7D, 0x2C, 0x06, 0x29, 0x10, 0x20, + 0xEF, 0x17, 0x35, 0x14, 0xEE, 0x01, 0xA5, 0x00, 0x7C, 0xEC, 0x1C, 0xEA, + 0xDE, 0xD6, 0xCF, 0xD6, 0x75, 0xCA, 0x96, 0xC5, 0xF3, 0xCA, 0xEC, 0xB6, + 0xCF, 0xCC, 0xF2, 0xAF, 0xF9, 0xCB, 0x03, 0xB1, 0xC0, 0xCC, 0xE6, 0xBB, + 0x8C, 0xD4, 0xF6, 0xD0, 0x26, 0xE6, 0xE4, 0xEE, 0x82, 0x00, 0xC8, 0x0E, + 0x49, 0x19, 0x1A, 0x25, 0xDD, 0x25, 0x8A, 0x2A, 0xFB, 0x25, 0x2B, 0x24, + 0x4D, 0x1B, 0xED, 0x1D, 0x11, 0x0D, 0x7C, 0x17, 0xB2, 0x02, 0x7D, 0x11, + 0x3C, 0xFA, 0xD9, 0x0D, 0xA2, 0xF4, 0xAD, 0x07, 0x09, 0xF5, 0xCE, 0xFE, + 0xA9, 0xF7, 0x3E, 0xF7, 0x73, 0xF5, 0x76, 0xF1, 0x5F, 0xED, 0xFD, 0xEA, + 0x92, 0xE6, 0x19, 0xE9, 0xC0, 0xEC, 0xC4, 0xEE, 0xE0, 0xFF, 0xE3, 0xF1, + 0xF2, 0x0D, 0xD3, 0xF2, 0x41, 0x0C, 0x61, 0xF6, 0x82, 0xFF, 0xCA, 0xF6, + 0x57, 0xF3, 0xE1, 0xF3, 0x29, 0xEF, 0x9C, 0xEF, 0x3C, 0xF2, 0xAA, 0xED, + 0xAE, 0xF6, 0x3D, 0xF2, 0x2D, 0xFA, 0xBC, 0xF4, 0x60, 0xFE, 0x69, 0xF2, + 0x86, 0xFF, 0xDA, 0xF2, 0x0C, 0x00, 0x8F, 0xF2, 0xB1, 0x03, 0xEE, 0xF0, + 0x9B, 0x06, 0xD8, 0xF3, 0x8F, 0x08, 0x38, 0xFA, 0x07, 0x09, 0x22, 0xFF, + 0xC4, 0x03, 0x85, 0x05, 0xCC, 0xFA, 0x4C, 0x0C, 0xDB, 0xF7, 0x16, 0x0A, + 0xF5, 0xFB, 0x1A, 0x03, 0x09, 0x08, 0xE5, 0x01, 0xD9, 0x16, 0x6A, 0x0A, + 0xB4, 0x1B, 0x91, 0x14, 0xCB, 0x1F, 0x36, 0x1F, 0x5B, 0x26, 0x93, 0x2A, + 0xE0, 0x2F, 0x32, 0x34, 0x7F, 0x2E, 0x9B, 0x3B, 0xFB, 0x1E, 0x39, 0x3C, + 0xA1, 0x14, 0x4F, 0x33, 0x07, 0x08, 0x94, 0x1E, 0x26, 0xF8, 0x5B, 0x07, + 0x2F, 0xEE, 0xD6, 0xF7, 0xBB, 0xE0, 0xCF, 0xE6, 0x59, 0xCF, 0x25, 0xD5, + 0x68, 0xD5, 0x84, 0xD7, 0xAA, 0xEB, 0x45, 0xED, 0x9E, 0x01, 0x3A, 0x0A, + 0xC8, 0x23, 0x77, 0x28, 0xC1, 0x44, 0x25, 0x42, 0xEB, 0x52, 0xB9, 0x55, + 0x2D, 0x53, 0xF1, 0x5E, 0xEB, 0x49, 0x52, 0x58, 0x89, 0x3E, 0xE1, 0x43, + 0x61, 0x30, 0x80, 0x2B, 0x69, 0x11, 0x55, 0x0E, 0xAB, 0xF7, 0x8A, 0xF7, + 0xA9, 0xEF, 0x71, 0xEA, 0xD4, 0xDE, 0x32, 0xD2, 0x3A, 0xD6, 0x0B, 0xC5, + 0x74, 0xDC, 0xFE, 0xC8, 0xB9, 0xE1, 0x8D, 0xCD, 0xAD, 0xF1, 0xF2, 0xDB, + 0x76, 0x02, 0xC6, 0xEF, 0x90, 0x15, 0xF1, 0x02, 0x89, 0x2A, 0x37, 0x11, + 0x38, 0x3A, 0x1E, 0x1B, 0x3A, 0x40, 0xEE, 0x1D, 0x9A, 0x36, 0xC3, 0x1F, + 0xD1, 0x25, 0xC9, 0x2B, 0xF2, 0x13, 0x46, 0x2D, 0x34, 0x0D, 0xF0, 0x20, + 0xA3, 0x0D, 0x75, 0x1F, 0xF0, 0x08, 0x96, 0x16, 0xC7, 0x06, 0x14, 0x0A, + 0x23, 0x0C, 0xEF, 0x10, 0xAB, 0x0D, 0xAC, 0x0E, 0x08, 0x16, 0x6C, 0x0E, + 0x33, 0x1D, 0xF4, 0x17, 0x46, 0x1B, 0x35, 0x1D, 0x7E, 0x17, 0x25, 0x1A, + 0x0F, 0x0A, 0x0B, 0x0F, 0xCF, 0xF8, 0x20, 0xFF, 0xD1, 0xF2, 0x02, 0xF5, + 0xC4, 0xF1, 0xF7, 0xF3, 0xCA, 0xE8, 0x86, 0xEB, 0x60, 0xE5, 0xA8, 0xE8, + 0xAD, 0xE5, 0xBE, 0xE9, 0x9A, 0xE3, 0x67, 0xE0, 0x1B, 0xEC, 0xCB, 0xE0, + 0x9C, 0xFA, 0xBC, 0xE8, 0x96, 0x00, 0x20, 0xE3, 0xAD, 0x05, 0xB9, 0xE0, + 0x93, 0x05, 0x73, 0xE3, 0x6F, 0xF8, 0x1C, 0xDC, 0xC1, 0xF1, 0xD2, 0xD9, + 0xD4, 0xEA, 0x53, 0xD8, 0x46, 0xE4, 0x7C, 0xDA, 0x90, 0xE1, 0x6A, 0xE5, + 0xC9, 0xD0, 0xE5, 0xE4, 0x6E, 0xCB, 0x46, 0xE7, 0xBD, 0xD9, 0xD1, 0xED, + 0xA5, 0xE4, 0x55, 0xED, 0xB5, 0xEF, 0x16, 0xF3, 0x42, 0xF8, 0x6C, 0xFC, + 0xA5, 0x02, 0xBD, 0x05, 0xC8, 0x07, 0x40, 0x04, 0x11, 0x03, 0xF9, 0xF8, + 0x3D, 0xF6, 0xCD, 0xEC, 0x2C, 0xD8, 0xBA, 0xD6, 0x47, 0xBF, 0x88, 0xC0, + 0x91, 0xAE, 0xD6, 0xB2, 0xB7, 0xA1, 0x3F, 0xAF, 0xEE, 0xA1, 0x5D, 0xB2, + 0x2A, 0xB7, 0x6E, 0xC1, 0x3A, 0xD3, 0xDD, 0xD4, 0x84, 0xE8, 0x6C, 0xE4, + 0x33, 0xFB, 0x17, 0xFF, 0xCE, 0x0C, 0x75, 0x1F, 0x12, 0x1E, 0x6F, 0x2E, + 0xE7, 0x2D, 0x96, 0x30, 0x6E, 0x26, 0x14, 0x1F, 0xD3, 0x15, 0x06, 0x01, + 0xDA, 0x07, 0x9D, 0xEB, 0xE6, 0xE1, 0x9C, 0xD2, 0x53, 0xC3, 0x85, 0xC0, + 0xEA, 0xB1, 0xDD, 0xB3, 0xEB, 0xA5, 0x5B, 0xAE, 0xBB, 0xAD, 0xBF, 0xAF, + 0x43, 0xC1, 0x68, 0xB4, 0x45, 0xD0, 0xF1, 0xBF, 0xCF, 0xE5, 0x52, 0xD9, + 0xF7, 0xFC, 0xF6, 0xF6, 0x65, 0x0B, 0xE7, 0x09, 0x0E, 0x1C, 0xDD, 0x18, + 0x73, 0x2F, 0xE2, 0x27, 0xCE, 0x3C, 0xCA, 0x2E, 0xD3, 0x41, 0x9E, 0x24, + 0x36, 0x38, 0x90, 0x16, 0xB5, 0x1A, 0xC8, 0x11, 0x8A, 0xFC, 0x1E, 0x12, + 0x67, 0xE8, 0x28, 0x11, 0xBE, 0xE3, 0x63, 0x0B, 0xAA, 0xF2, 0xB5, 0x08, + 0x52, 0x04, 0x10, 0x06, 0x8E, 0x0E, 0xA6, 0x01, 0x5A, 0x14, 0xB1, 0x05, + 0xF4, 0x08, 0x40, 0x01, 0xCF, 0x03, 0x73, 0xFF, 0x4B, 0x0E, 0x88, 0x07, + 0x61, 0x15, 0xA0, 0x07, 0xB5, 0x22, 0x8D, 0x02, 0x24, 0x26, 0xB3, 0xFA, + 0x66, 0x19, 0x9B, 0xFD, 0xCF, 0x04, 0xD6, 0x03, 0xDE, 0xF5, 0xE1, 0x08, + 0x88, 0xEC, 0xD5, 0x0A, 0x48, 0xE2, 0x48, 0x08, 0x38, 0xDD, 0x81, 0x0E, + 0x50, 0xD9, 0x38, 0x10, 0xEC, 0xE1, 0x26, 0x0A, 0xD7, 0xF2, 0xF2, 0x01, + 0xB4, 0xFB, 0x80, 0xF4, 0xD8, 0xFF, 0xCF, 0xE9, 0xAA, 0x07, 0x2C, 0xEE, + 0xD8, 0x11, 0xED, 0xF7, 0xB8, 0x17, 0x58, 0xFA, 0xFF, 0x0F, 0xF2, 0xF0, + 0xCB, 0x08, 0x9E, 0xED, 0xDA, 0x04, 0xDF, 0xF8, 0x74, 0x03, 0x4D, 0x0B, + 0xEA, 0x05, 0xC3, 0x19, 0xF2, 0x06, 0xED, 0x1F, 0x34, 0x0C, 0xF4, 0x22, + 0x38, 0x14, 0xDE, 0x1D, 0xDE, 0x0F, 0x9B, 0x10, 0x4F, 0xFE, 0x7E, 0x02, + 0xC6, 0xE6, 0x6C, 0xEA, 0xBD, 0xD7, 0xBD, 0xD7, 0x13, 0xD1, 0x65, 0xCE, + 0xC9, 0xC9, 0x50, 0xBE, 0x93, 0xCB, 0x13, 0xBB, 0xC5, 0xCA, 0x4A, 0xC4, + 0xC5, 0xC6, 0x97, 0xD1, 0x33, 0xD0, 0x75, 0xE4, 0x77, 0xED, 0x22, 0xFE, + 0x18, 0x18, 0x5B, 0x1E, 0x73, 0x36, 0x85, 0x34, 0xC4, 0x46, 0x00, 0x44, + 0xF3, 0x41, 0xB2, 0x46, 0x37, 0x29, 0xB4, 0x35, 0xCF, 0x16, 0xC6, 0x1E, + 0x49, 0x01, 0x5B, 0xFD, 0x00, 0xEE, 0x15, 0xDF, 0xBC, 0xE4, 0xF8, 0xCA, + 0x15, 0xDB, 0xAD, 0xBC, 0x82, 0xD1, 0x4D, 0xB6, 0x09, 0xCA, 0x09, 0xB5, + 0xDB, 0xC7, 0xF8, 0xC3, 0xD4, 0xCA, 0x7E, 0xE2, 0x7A, 0xD5, 0x1B, 0x00, + 0xBD, 0xEC, 0x73, 0x1E, 0xC9, 0x06, 0x33, 0x38, 0x57, 0x1A, 0x10, 0x3B, + 0x0F, 0x2E, 0xD4, 0x2E, 0x59, 0x3B, 0xF3, 0x1D, 0x1C, 0x3B, 0x02, 0x0E, + 0xC1, 0x31, 0xDD, 0x05, 0xB7, 0x20, 0xA8, 0x02, 0x74, 0x0D, 0x23, 0x00, + 0x52, 0x06, 0x2E, 0xFE, 0xED, 0x08, 0x3F, 0xF5, 0x2D, 0x0C, 0xE8, 0xF0, + 0xEC, 0x08, 0xA6, 0xF8, 0x1F, 0x03, 0x84, 0xFF, 0x7E, 0xFE, 0x31, 0x04, + 0xA3, 0xF8, 0x9F, 0x0E, 0xB7, 0xFB, 0xA3, 0x19, 0xB6, 0x00, 0x6F, 0x10, + 0x03, 0x04, 0x9C, 0x01, 0x48, 0x03, 0xBF, 0xF9, 0xF6, 0xFE, 0x41, 0xF3, + 0xBA, 0x01, 0x9A, 0xF3, 0x67, 0x03, 0xE1, 0xF6, 0x24, 0xFE, 0xEF, 0xFB, + 0x6F, 0xF7, 0xF7, 0x00, 0xD3, 0xF5, 0x75, 0x03, 0x63, 0xFC, 0xA6, 0x0D, + 0x0E, 0xFA, 0x85, 0x14, 0xAA, 0xF8, 0x51, 0x1B, 0xA5, 0x01, 0x90, 0x27, + 0xA6, 0x07, 0x1B, 0x2D, 0xAA, 0x09, 0x94, 0x2B, 0xB7, 0x08, 0x2E, 0x22, + 0x1D, 0x12, 0x29, 0x1D, 0x9A, 0x14, 0xA4, 0x11, 0x0A, 0x0B, 0x73, 0x00, + 0x64, 0x0E, 0x41, 0x00, 0xAC, 0x12, 0x51, 0x07, 0xEE, 0x11, 0x90, 0x11, + 0x44, 0x20, 0x4C, 0x22, 0xB7, 0x3A, 0xE7, 0x32, 0x91, 0x45, 0xC5, 0x3B, + 0x90, 0x43, 0x3F, 0x3C, 0x7E, 0x46, 0x47, 0x38, 0xF9, 0x42, 0x23, 0x2E, + 0x61, 0x2F, 0xE0, 0x19, 0x73, 0x1D, 0x92, 0x06, 0x06, 0x0C, 0xAA, 0xF4, + 0x9E, 0xF4, 0xCA, 0xE3, 0x00, 0xEA, 0x1C, 0xE1, 0x11, 0xF3, 0xD6, 0xEA, + 0x00, 0x11, 0x8E, 0x03, 0x40, 0x2E, 0xC8, 0x21, 0xB9, 0x41, 0xB6, 0x42, + 0x4A, 0x55, 0x95, 0x5E, 0xAD, 0x58, 0x1E, 0x5F, 0xB2, 0x54, 0x48, 0x5A, + 0x1E, 0x4F, 0x62, 0x5B, 0x4E, 0x42, 0xF9, 0x58, 0xD3, 0x32, 0x93, 0x4D, + 0x48, 0x1C, 0xCF, 0x33, 0xC0, 0x02, 0xD4, 0x12, 0xB0, 0xEA, 0xB5, 0xEC, + 0xD8, 0xD8, 0x01, 0xCB, 0x37, 0xDC, 0xF9, 0xC3, 0xA8, 0xEA, 0xD3, 0xCE, + 0x55, 0xF8, 0x3E, 0xE6, 0xBA, 0x05, 0xCB, 0x06, 0x8D, 0x14, 0xA1, 0x1D, + 0xBE, 0x2D, 0xAD, 0x32, 0xE3, 0x3C, 0x75, 0x41, 0xFA, 0x44, 0xCD, 0x4A, + 0x3A, 0x4A, 0x67, 0x50, 0x2E, 0x48, 0x3F, 0x4B, 0x32, 0x49, 0x3F, 0x3E, + 0x7B, 0x3D, 0x39, 0x28, 0x8F, 0x26, 0x93, 0x11, 0x34, 0x13, 0x59, 0x01, + 0x0D, 0x03, 0xA1, 0xFA, 0x86, 0x00, 0x24, 0xFF, 0x6A, 0x0C, 0xE4, 0x05, + 0x1C, 0x13, 0x6D, 0x0E, 0xFF, 0x0E, 0x16, 0x17, 0x8D, 0x0F, 0x88, 0x1B, + 0xAD, 0x14, 0x2B, 0x1C, 0xA4, 0x16, 0x78, 0x1C, 0x65, 0x1B, 0xB9, 0x1D, + 0xF0, 0x1D, 0xA8, 0x16, 0x6C, 0x1A, 0xF2, 0x0B, 0x56, 0x0B, 0x6A, 0xFE, + 0x9D, 0xF3, 0x6B, 0xF2, 0xF4, 0xDD, 0x95, 0xE9, 0xDA, 0xD6, 0x0D, 0xE6, + 0x1B, 0xDF, 0x49, 0xDE, 0xAD, 0xF2, 0x1D, 0xD6, 0x07, 0x03, 0x68, 0xDA, + 0x0A, 0xFE, 0xC4, 0xDC, 0x3F, 0xFB, 0xF9, 0xE2, 0xD8, 0xFA, 0x95, 0xEB, + 0x3F, 0xF8, 0x40, 0xF6, 0x38, 0xFB, 0x7D, 0x02, 0xCF, 0xFB, 0x48, 0x01, + 0x38, 0xFC, 0x25, 0xF6, 0xCD, 0xEF, 0x36, 0xE6, 0x8E, 0xDC, 0x2C, 0xDC, + 0x69, 0xD7, 0xB0, 0xE0, 0x98, 0xD3, 0xF3, 0xE2, 0x88, 0xD9, 0xF7, 0xEE, + 0xAD, 0xE8, 0x76, 0x02, 0x33, 0xFA, 0xB4, 0x12, 0x28, 0x03, 0x04, 0x19, + 0xA1, 0xFF, 0x91, 0x12, 0xA9, 0xF5, 0x20, 0x0D, 0x8A, 0xDE, 0xF2, 0xFD, + 0x29, 0xD1, 0xAA, 0xEC, 0xCD, 0xC1, 0xA8, 0xD8, 0x2B, 0xA9, 0x4B, 0xBE, + 0x0F, 0xA8, 0x6B, 0xAE, 0x5B, 0xAE, 0xC1, 0xA6, 0x1C, 0xB5, 0x3E, 0xA9, + 0x9B, 0xCD, 0x82, 0xBB, 0xB7, 0xE6, 0xE0, 0xD4, 0x0E, 0xFB, 0x60, 0xF3, + 0x27, 0x1D, 0x3B, 0x12, 0x4B, 0x3A, 0x23, 0x29, 0x5C, 0x33, 0x57, 0x2F, + 0x17, 0x24, 0xFE, 0x24, 0xC7, 0x17, 0x64, 0x15, 0x54, 0xFA, 0xEA, 0x02, + 0x00, 0xD8, 0x8F, 0xE8, 0xB6, 0xC3, 0x35, 0xCB, 0x2E, 0xB3, 0xD7, 0xAF, + 0x8E, 0xA9, 0xEA, 0xA0, 0x4E, 0xAE, 0x8D, 0xA3, 0xEF, 0xB5, 0x07, 0xAA, + 0xD7, 0xC6, 0x3A, 0xB8, 0x1B, 0xDC, 0xD2, 0xCB, 0x7A, 0xF7, 0xF2, 0xE6, + 0x9C, 0x13, 0x55, 0x0A, 0xE9, 0x25, 0x2A, 0x27, 0xCB, 0x30, 0x60, 0x37, + 0x63, 0x36, 0x97, 0x3F, 0xB5, 0x28, 0x86, 0x3C, 0x96, 0x0F, 0x6C, 0x33, + 0xB0, 0xFD, 0x81, 0x2B, 0xA5, 0xEE, 0x72, 0x1F, 0x77, 0xDF, 0xEF, 0x11, + 0x5B, 0xD5, 0x54, 0x07, 0x92, 0xDC, 0x81, 0xFB, 0x1A, 0xEE, 0x99, 0xF1, + 0x0E, 0xF9, 0xEC, 0xF3, 0xC4, 0x06, 0x42, 0xFD, 0x04, 0x19, 0x08, 0x05, + 0xBD, 0x1D, 0x98, 0x0D, 0x2F, 0x25, 0x93, 0x1A, 0xDA, 0x2C, 0xE8, 0x1E, + 0x59, 0x20, 0x9D, 0x16, 0x88, 0x11, 0x88, 0x10, 0xC9, 0x0B, 0x9A, 0x0D, + 0x7F, 0xFF, 0xEB, 0x01, 0x0C, 0xF3, 0x6A, 0xFB, 0x01, 0xEB, 0x66, 0xFE, + 0xFA, 0xDB, 0x3B, 0xF9, 0xF9, 0xDE, 0x3B, 0xF4, 0xED, 0xF8, 0x94, 0xF4, + 0xCF, 0x0B, 0x0E, 0xF5, 0x65, 0x10, 0x19, 0xF5, 0xA7, 0x12, 0x3B, 0xF8, + 0x72, 0x11, 0xF6, 0xFC, 0xD5, 0x0F, 0x3E, 0xFF, 0xB8, 0x0D, 0xEA, 0xFD, + 0xC2, 0x0A, 0x60, 0xFC, 0xD9, 0xFD, 0xC0, 0xF1, 0xB5, 0xF1, 0x95, 0xE3, + 0xA9, 0xF7, 0x09, 0xE6, 0x90, 0xFC, 0x21, 0xF1, 0x87, 0xFF, 0xD1, 0xF4, + 0xEA, 0x01, 0xD1, 0xF3, 0x3E, 0x07, 0x33, 0xF8, 0x4C, 0x09, 0xA2, 0xFA, + 0xBB, 0x04, 0x07, 0x00, 0x03, 0x00, 0xCA, 0x01, 0xC9, 0xF4, 0x7A, 0xF3, + 0x20, 0xE1, 0x3B, 0xE1, 0xE5, 0xCA, 0x04, 0xD5, 0xCA, 0xBB, 0x9F, 0xCC, + 0xC1, 0xAB, 0x86, 0xBD, 0x7C, 0xA0, 0xC9, 0xB0, 0x13, 0xAF, 0xC2, 0xB8, + 0x34, 0xC9, 0x19, 0xCD, 0xA7, 0xE7, 0x64, 0xE3, 0xE8, 0x12, 0xEE, 0x02, + 0x0E, 0x31, 0xFB, 0x1D, 0x4E, 0x39, 0xE5, 0x20, 0x63, 0x3D, 0x2B, 0x19, + 0xCD, 0x3B, 0xC2, 0x10, 0xE4, 0x22, 0xAB, 0xFB, 0x3F, 0xFD, 0xF7, 0xE5, + 0xEB, 0xE1, 0x73, 0xD8, 0xC8, 0xC8, 0x04, 0xC4, 0x12, 0xB3, 0xA8, 0xAE, + 0xD7, 0xA7, 0x86, 0xA0, 0xD2, 0xA6, 0xA4, 0xA5, 0x6C, 0xA4, 0x00, 0xB9, + 0x2F, 0xA9, 0x90, 0xCC, 0x83, 0xCA, 0x32, 0xE8, 0xB2, 0xEB, 0x6B, 0xFD, + 0x2D, 0x04, 0x13, 0x06, 0x81, 0x24, 0x21, 0x13, 0xCB, 0x36, 0xD2, 0x1D, + 0xD3, 0x33, 0xB8, 0x1F, 0x3D, 0x25, 0xCC, 0x1F, 0x2C, 0x0F, 0xAE, 0x1B, + 0x6C, 0xFD, 0xC4, 0x10, 0xE4, 0xEE, 0xD5, 0xFC, 0xB9, 0xED, 0xCF, 0xEC, + 0x82, 0xEF, 0xA0, 0xE6, 0xD7, 0xE4, 0xD1, 0xE5, 0xA7, 0xD8, 0x87, 0xE5, + 0x19, 0xDA, 0xD4, 0xEA, 0x7F, 0xE4, 0x5E, 0xF5, 0xBA, 0xEF, 0x8C, 0xF8, + 0xE7, 0x0C, 0xF4, 0x00, 0x1C, 0x1F, 0x78, 0x05, 0x1E, 0x17, 0xA2, 0x00, + 0x0F, 0x10, 0x22, 0x02, 0xD0, 0x0D, 0x50, 0x02, 0x5D, 0x09, 0xC2, 0xFC, + 0x9E, 0xFA, 0xD4, 0xF9, 0x02, 0xEF, 0x2F, 0xFD, 0xF3, 0xEF, 0xFA, 0x02, + 0x61, 0xEC, 0xF3, 0xFF, 0xC4, 0xE6, 0x0C, 0xFA, 0xD2, 0xE8, 0x8C, 0xF9, + 0x61, 0xEC, 0x20, 0xF6, 0xA1, 0xF2, 0x57, 0xF6, 0x02, 0xFF, 0xDA, 0x00, + 0xAE, 0x06, 0xAA, 0x04, 0x8B, 0x11, 0x51, 0x03, 0x9C, 0x25, 0xD8, 0x0B, + 0x8C, 0x27, 0xFA, 0x0E, 0x32, 0x1C, 0x1D, 0x0E, 0xDF, 0x15, 0x75, 0x15, + 0x2E, 0x11, 0xEF, 0x19, 0xB5, 0x11, 0xCD, 0x1A, 0xDF, 0x1C, 0x03, 0x24, + 0x5B, 0x2B, 0x48, 0x31, 0x4F, 0x36, 0x7D, 0x39, 0x4C, 0x42, 0xF8, 0x3D, + 0x94, 0x43, 0xEC, 0x30, 0x01, 0x37, 0xE2, 0x1C, 0x63, 0x28, 0x90, 0x10, + 0x74, 0x1A, 0x48, 0xFF, 0x26, 0x0D, 0x3B, 0xEF, 0x1A, 0xFC, 0x12, 0xE8, + 0xE6, 0xED, 0xB9, 0xE7, 0x2B, 0xEB, 0x25, 0xEC, 0x14, 0xF4, 0xD8, 0xF6, + 0x0E, 0x06, 0xD7, 0x0B, 0xD4, 0x1E, 0xBB, 0x2B, 0x00, 0x32, 0x9A, 0x49, + 0xEB, 0x44, 0x0B, 0x5E, 0xD0, 0x56, 0x97, 0x66, 0xB6, 0x57, 0x8F, 0x5F, + 0xBB, 0x48, 0xF5, 0x4B, 0x37, 0x2D, 0x96, 0x32, 0x11, 0x0F, 0xE8, 0x14, + 0xC5, 0xFC, 0x24, 0xF4, 0xFC, 0xF4, 0x43, 0xD7, 0x7C, 0xED, 0xB9, 0xC4, + 0x0F, 0xE3, 0x92, 0xC0, 0x82, 0xD6, 0x9D, 0xC5, 0x00, 0xD6, 0x79, 0xD5, + 0xA1, 0xED, 0x31, 0xF1, 0xAA, 0x0C, 0xEE, 0x0D, 0xE1, 0x24, 0x95, 0x25, + 0x0F, 0x40, 0x52, 0x37, 0xB8, 0x4F, 0x47, 0x39, 0x88, 0x52, 0x67, 0x32, + 0x7B, 0x56, 0x98, 0x2E, 0x5C, 0x4D, 0xFF, 0x26, 0xEF, 0x3E, 0x80, 0x1B, + 0x4C, 0x2D, 0x49, 0x11, 0xDC, 0x15, 0xD8, 0x0E, 0x15, 0x09, 0x11, 0x10, + 0x6C, 0x03, 0x9E, 0x0A, 0xB8, 0xFA, 0xFE, 0x02, 0xC3, 0xF5, 0xC2, 0x08, + 0x17, 0xF9, 0xFE, 0x15, 0xFB, 0xFF, 0x42, 0x17, 0xB3, 0x0B, 0x3B, 0x0E, + 0xE7, 0x14, 0x56, 0x02, 0x09, 0x13, 0xBF, 0xF6, 0x35, 0x14, 0xD2, 0xF0, + 0x28, 0x0E, 0x10, 0xF1, 0x08, 0xF7, 0xCC, 0xF2, 0x58, 0xEB, 0x4F, 0xF5, + 0xCE, 0xE3, 0xB3, 0xF6, 0xF3, 0xDF, 0x6F, 0xFC, 0x1D, 0xE2, 0xDA, 0xFD, + 0x20, 0xD8, 0x12, 0xF4, 0xFD, 0xD3, 0x63, 0xF3, 0x49, 0xDB, 0xAD, 0xFC, + 0x75, 0xE1, 0xC3, 0x00, 0xA3, 0xF0, 0x55, 0x04, 0x20, 0x08, 0xDF, 0x03, + 0x56, 0x0A, 0xE2, 0xF3, 0xD9, 0xFE, 0x9E, 0xE2, 0x22, 0xFE, 0xD9, 0xDA, + 0x49, 0xF1, 0xD5, 0xD3, 0x43, 0xDF, 0xA0, 0xD0, 0x26, 0xD8, 0xAC, 0xD5, + 0xC8, 0xD2, 0xD2, 0xE3, 0x60, 0xD4, 0xB0, 0xF0, 0x71, 0xDC, 0xF0, 0xF2, + 0x7C, 0xE6, 0xA2, 0xF7, 0x36, 0xF3, 0xF3, 0x02, 0x1F, 0xFD, 0x47, 0x0B, + 0x1A, 0x07, 0x60, 0x0F, 0x44, 0x0A, 0x48, 0x0C, 0x9F, 0xFF, 0xCC, 0xFF, + 0xBD, 0xE8, 0xEC, 0xE3, 0x78, 0xCF, 0x26, 0xC3, 0xB0, 0xBA, 0xBC, 0xAB, + 0x4D, 0xA9, 0xE3, 0x9C, 0x86, 0xA6, 0xC8, 0x9B, 0x6A, 0xB5, 0x76, 0xAC, + 0x24, 0xCF, 0xB0, 0xCB, 0xDB, 0xE9, 0xFE, 0xE7, 0xC9, 0x04, 0xFE, 0x01, + 0x0F, 0x1A, 0x8D, 0x20, 0xF2, 0x20, 0x0C, 0x39, 0x84, 0x28, 0xB9, 0x43, + 0xDA, 0x31, 0x68, 0x43, 0x10, 0x2B, 0x61, 0x38, 0x6C, 0x11, 0x57, 0x15, + 0xA7, 0xF0, 0x56, 0xEA, 0x52, 0xD2, 0xA6, 0xCC, 0x9C, 0xBC, 0x4A, 0xB1, + 0x51, 0xB7, 0x36, 0xA5, 0x58, 0xBF, 0xB8, 0xB1, 0x75, 0xCB, 0xAF, 0xC9, + 0x0A, 0xD7, 0xE2, 0xE3, 0xE0, 0xE8, 0x98, 0xFA, 0x03, 0xFD, 0x0B, 0x11, + 0x46, 0x0A, 0xDE, 0x24, 0xA8, 0x1E, 0xE4, 0x2C, 0x9D, 0x3B, 0x20, 0x2C, + 0x3C, 0x50, 0xF5, 0x2D, 0x53, 0x4C, 0x02, 0x2A, 0xC2, 0x32, 0x6A, 0x1C, + 0x19, 0x16, 0xF3, 0x0E, 0x7E, 0xFB, 0x9C, 0xFB, 0xD4, 0xED, 0xC5, 0xED, + 0x6F, 0xED, 0xBB, 0xF2, 0xA0, 0xF4, 0xA2, 0x01, 0x44, 0x02, 0x27, 0x0E, + 0x15, 0x0A, 0xB2, 0x10, 0xF4, 0x10, 0x01, 0x11, 0x2E, 0x19, 0x4D, 0x11, + 0x37, 0x1F, 0xA4, 0x0D, 0x5D, 0x22, 0x47, 0x10, 0xDC, 0x21, 0x26, 0x18, + 0x60, 0x24, 0x32, 0x1B, 0x67, 0x1C, 0x6E, 0x13, 0x05, 0x0F, 0xE3, 0x06, + 0x98, 0xFB, 0x5E, 0xFB, 0x81, 0xE0, 0x50, 0xF1, 0x15, 0xDB, 0x4D, 0xF1, + 0x86, 0xEA, 0xB2, 0xF7, 0xFA, 0xF7, 0xCE, 0xFC, 0x4B, 0xFC, 0x40, 0x07, + 0x99, 0xF8, 0x7A, 0x13, 0x8C, 0xEB, 0x06, 0x12, 0xFF, 0xE9, 0xF4, 0x0B, + 0x07, 0xF9, 0x16, 0x0B, 0xBA, 0x03, 0xCB, 0x07, 0x50, 0x10, 0x55, 0x08, + 0x24, 0x22, 0x8F, 0x0F, 0x94, 0x1D, 0xE3, 0x07, 0x92, 0x0A, 0xE8, 0xF3, + 0xEC, 0xF8, 0xC2, 0xE7, 0x11, 0xEA, 0x31, 0xE7, 0xE1, 0xEC, 0x42, 0xF1, + 0xF0, 0xFB, 0xD9, 0x06, 0x42, 0x09, 0xD5, 0x1E, 0xE4, 0x0E, 0xF3, 0x2B, + 0xA5, 0x0A, 0x86, 0x2A, 0xFC, 0xFB, 0xE0, 0x1D, 0x5F, 0xF2, 0x78, 0x0E, + 0x4A, 0xED, 0x6A, 0xFA, 0x4E, 0xE2, 0xC3, 0xE8, 0x34, 0xD6, 0x7D, 0xE0, + 0xA3, 0xC8, 0xB7, 0xCF, 0xA3, 0xBE, 0xBE, 0xB9, 0xD8, 0xBF, 0x99, 0xB2, + 0x80, 0xCC, 0xC2, 0xBF, 0xA7, 0xE7, 0xBE, 0xDF, 0x28, 0x09, 0xF6, 0x08, + 0x17, 0x27, 0x49, 0x2D, 0xA6, 0x3F, 0x74, 0x40, 0xAB, 0x43, 0x78, 0x40, + 0x01, 0x31, 0xD3, 0x30, 0xE8, 0x16, 0x57, 0x15, 0x1E, 0x03, 0x31, 0xF5, + 0x6D, 0xF6, 0xF6, 0xD4, 0x6A, 0xE7, 0x22, 0xBD, 0x52, 0xD2, 0x10, 0xAD, + 0x84, 0xBF, 0x7D, 0xA1, 0x23, 0xB8, 0x73, 0xA2, 0xAC, 0xB9, 0xDF, 0xAB, + 0xA4, 0xC4, 0x1A, 0xBE, 0x06, 0xDE, 0xA5, 0xDE, 0x76, 0xF5, 0x2F, 0x00, + 0x82, 0x08, 0x3A, 0x1B, 0x57, 0x1B, 0x34, 0x30, 0xD0, 0x19, 0xC4, 0x36, + 0x4D, 0x13, 0xCC, 0x31, 0xB3, 0x13, 0x8A, 0x27, 0xED, 0x0A, 0xE2, 0x15, + 0xC0, 0x04, 0x47, 0x09, 0xAF, 0x02, 0x88, 0x00, 0xD8, 0xFA, 0x75, 0xF5, + 0xF5, 0xF4, 0xA7, 0xF1, 0x35, 0xF2, 0xB1, 0xF3, 0xC0, 0xF0, 0x1A, 0xFC, + 0xA0, 0xFB, 0x0B, 0x07, 0xE2, 0x0D, 0xA3, 0x0D, 0x84, 0x14, 0x83, 0x0F, + 0x21, 0x16, 0xD7, 0x0F, 0x0D, 0x14, 0xE4, 0x0B, 0x88, 0x0B, 0x1D, 0x01, + 0x56, 0x01, 0x71, 0xF6, 0x55, 0xF8, 0xC7, 0xF3, 0xC1, 0xF1, 0x00, 0xF8, + 0x89, 0xF5, 0xE8, 0xFB, 0x2F, 0xFD, 0x2D, 0xF7, 0xB3, 0xFE, 0x14, 0xF4, + 0xB8, 0xFD, 0x9A, 0xFC, 0x87, 0xF7, 0xAC, 0x04, 0x77, 0xF4, 0xEC, 0x06, + 0x60, 0xFD, 0xB2, 0x0C, 0xD4, 0x0A, 0xD7, 0x0E, 0x11, 0x14, 0x6A, 0x0D, + 0xD1, 0x18, 0x4C, 0x13, 0x42, 0x13, 0xDA, 0x10, 0x74, 0x06, 0xFA, 0x08, + 0x24, 0x06, 0x66, 0x08, 0x29, 0x15, 0xFB, 0x0D, 0xBE, 0x1D, 0xDD, 0x0F, + 0x84, 0x22, 0x94, 0x13, 0x39, 0x25, 0x9A, 0x21, 0xDD, 0x21, 0x8F, 0x34, + 0x8E, 0x23, 0x4A, 0x44, 0x44, 0x35, 0x7B, 0x51, 0x1E, 0x46, 0xE3, 0x5E, + 0xA4, 0x4B, 0x08, 0x64, 0x27, 0x4F, 0xB9, 0x61, 0xFF, 0x45, 0x13, 0x53, + 0x07, 0x34, 0x6E, 0x37, 0xD7, 0x22, 0x90, 0x1A, 0x37, 0x10, 0xB4, 0xFF, + 0x9D, 0xFA, 0x09, 0xED, 0x41, 0xEC, 0x82, 0xE3, 0x38, 0xE6, 0xA1, 0xDE, + 0xB6, 0xE3, 0xB4, 0xE2, 0xCB, 0xF1, 0xF2, 0xF8, 0x53, 0x16, 0xB8, 0x1C, + 0x46, 0x3D, 0x63, 0x3F, 0x92, 0x53, 0xB6, 0x57, 0xD9, 0x59, 0x17, 0x61, + 0xFF, 0x58, 0xCC, 0x62, 0xD1, 0x4E, 0x41, 0x5A, 0x4F, 0x3E, 0x68, 0x48, + 0x64, 0x2E, 0x7D, 0x2E, 0xD5, 0x17, 0x2A, 0x08, 0x8E, 0x01, 0x58, 0xE4, + 0xBB, 0xF1, 0x0C, 0xC9, 0xAA, 0xE9, 0xD3, 0xBB, 0xCC, 0xE4, 0x5D, 0xB9, + 0x0B, 0xE8, 0x7E, 0xC0, 0xDD, 0xF5, 0x1F, 0xD8, 0x76, 0x03, 0x03, 0xF7, + 0x7E, 0x16, 0xD5, 0x15, 0xB6, 0x2A, 0x48, 0x30, 0x56, 0x32, 0xE5, 0x3B, + 0xE9, 0x31, 0x3C, 0x3E, 0x29, 0x2E, 0x29, 0x40, 0xC3, 0x26, 0xDC, 0x3A, + 0x9F, 0x17, 0x67, 0x2C, 0xE6, 0x09, 0xA3, 0x1E, 0xEC, 0x08, 0x66, 0x17, + 0x9B, 0x04, 0x4D, 0x13, 0xA8, 0xFE, 0x0E, 0x11, 0x1F, 0xFF, 0x64, 0x0B, + 0xB9, 0x01, 0x04, 0x02, 0x91, 0xFF, 0xF1, 0xFC, 0xD4, 0x01, 0x77, 0xFF, + 0x16, 0x0D, 0x55, 0x00, 0x97, 0x15, 0x63, 0xFE, 0xDC, 0x13, 0xF9, 0xF9, + 0x86, 0x10, 0x97, 0xF6, 0xD5, 0x0A, 0xD0, 0xEF, 0x05, 0xF8, 0xFC, 0xE4, + 0x9A, 0xE8, 0xC4, 0xDC, 0x81, 0xE5, 0xE7, 0xD8, 0xAA, 0xE2, 0x8A, 0xD8, + 0xDE, 0xE1, 0x09, 0xD4, 0x07, 0xEC, 0x7A, 0xD8, 0x58, 0xED, 0x76, 0xDA, + 0x02, 0xE8, 0x4C, 0xD7, 0xC4, 0xEB, 0x6C, 0xDB, 0x20, 0xEC, 0x09, 0xDF, + 0xF0, 0xED, 0x0A, 0xE5, 0xA6, 0xF3, 0xEC, 0xF0, 0xDB, 0xF1, 0x54, 0xFC, + 0xBE, 0xE8, 0x5F, 0xFA, 0x13, 0xDB, 0xE0, 0xF0, 0x18, 0xD3, 0x71, 0xEE, + 0x7B, 0xC9, 0xF0, 0xE7, 0xCF, 0xBF, 0xF9, 0xD6, 0x47, 0xC9, 0x10, 0xCF, + 0x86, 0xD8, 0x6E, 0xD4, 0x96, 0xDA, 0x03, 0xDC, 0xFC, 0xD9, 0x1E, 0xEB, + 0x51, 0xE5, 0x9F, 0xFE, 0x48, 0xEF, 0x3B, 0x09, 0x21, 0xF8, 0x04, 0x0B, + 0x32, 0x07, 0x72, 0x0A, 0xD6, 0x07, 0xEB, 0x02, 0xE7, 0xF4, 0x4E, 0xEC, + 0xDA, 0xDA, 0xD5, 0xCD, 0x9A, 0xC0, 0x6B, 0xB3, 0xC1, 0xA6, 0x52, 0xA3, + 0x3D, 0x9B, 0xB3, 0xA3, 0x5F, 0xA4, 0x7C, 0xAF, 0xC4, 0xB7, 0xC1, 0xC4, + 0x52, 0xD0, 0x62, 0xE0, 0xBB, 0xF1, 0x52, 0xFB, 0xEE, 0x12, 0x09, 0x15, + 0xB0, 0x1F, 0x4F, 0x28, 0xF7, 0x24, 0xC5, 0x33, 0x72, 0x28, 0x81, 0x32, + 0x40, 0x21, 0x63, 0x22, 0x4F, 0x14, 0x9B, 0x0A, 0x0B, 0xF9, 0x6B, 0xED, + 0x9D, 0xDB, 0x5A, 0xD7, 0x35, 0xC6, 0xF1, 0xC5, 0x45, 0xB5, 0x4A, 0xB9, + 0xA5, 0xB4, 0xDF, 0xB8, 0x3E, 0xC1, 0x7D, 0xB9, 0xB2, 0xD0, 0xB8, 0xBB, + 0xE9, 0xE8, 0xB2, 0xCA, 0x58, 0x04, 0x9E, 0xE1, 0xAD, 0x12, 0x3B, 0xF6, + 0xBF, 0x16, 0xB1, 0x06, 0x34, 0x18, 0xA5, 0x12, 0x04, 0x18, 0x31, 0x14, + 0xD9, 0x17, 0x44, 0x10, 0x01, 0x19, 0xB3, 0x11, 0x3C, 0x13, 0x4C, 0x0E, + 0xF7, 0x07, 0xD3, 0x09, 0x56, 0x00, 0x22, 0x09, 0x15, 0xFF, 0xCB, 0x03, + 0xA2, 0x01, 0xC7, 0xFC, 0xC3, 0x08, 0x4D, 0xFC, 0x91, 0x12, 0x33, 0x02, + 0x08, 0x1B, 0xC0, 0x0D, 0xE8, 0x25, 0x26, 0x16, 0xD3, 0x2E, 0x74, 0x19, + 0xE5, 0x24, 0x15, 0x1E, 0x5C, 0x0F, 0x06, 0x21, 0xEF, 0xFE, 0x0A, 0x20, + 0x54, 0xF2, 0x11, 0x1A, 0xAB, 0xEB, 0x58, 0x14, 0x70, 0xE5, 0xF9, 0x09, + 0x23, 0xDF, 0xAA, 0xFD, 0xE4, 0xD9, 0x18, 0xF0, 0x95, 0xDA, 0xD5, 0xE1, + 0x45, 0xE7, 0x8D, 0xD8, 0x4E, 0xF4, 0x4C, 0xD1, 0xF7, 0xFB, 0x1E, 0xD4, + 0x1C, 0x04, 0x08, 0xDF, 0x7E, 0x0A, 0x96, 0xE5, 0x7E, 0x0F, 0x0E, 0xE8, + 0x4F, 0x10, 0x5C, 0xE7, 0x05, 0x09, 0xD5, 0xE7, 0xD9, 0xFD, 0x8A, 0xE6, + 0x2A, 0xF8, 0xD0, 0xE8, 0x53, 0xF6, 0xA5, 0xF0, 0xA9, 0xEC, 0xFE, 0xF0, + 0xD3, 0xE6, 0xAF, 0xED, 0x42, 0xE7, 0x3A, 0xEE, 0xD6, 0xE0, 0x5F, 0xEC, + 0xAD, 0xDF, 0xEA, 0xEB, 0x02, 0xEA, 0x8C, 0xF5, 0x4F, 0xF5, 0x3C, 0x01, + 0x75, 0xFF, 0x76, 0x05, 0x0F, 0x09, 0xE2, 0x00, 0xB6, 0x0C, 0x81, 0xF8, + 0xF7, 0x04, 0x69, 0xE9, 0xFC, 0xF1, 0x19, 0xD5, 0x88, 0xD7, 0x4A, 0xC7, + 0xC6, 0xBA, 0x32, 0xC3, 0x1F, 0xAA, 0x39, 0xC9, 0x7C, 0xB2, 0x22, 0xD5, + 0xEE, 0xC6, 0x9E, 0xE3, 0xF6, 0xD5, 0xE1, 0xF4, 0x84, 0xE6, 0xCA, 0x08, + 0xD5, 0xFF, 0x35, 0x1D, 0x5A, 0x15, 0x4A, 0x25, 0xF4, 0x24, 0x62, 0x25, + 0xD4, 0x2E, 0xFF, 0x25, 0x7A, 0x2C, 0x23, 0x20, 0xDB, 0x1A, 0xE3, 0x0C, + 0xF6, 0xFC, 0xD6, 0xF1, 0xF5, 0xE1, 0x80, 0xDB, 0xBA, 0xCE, 0xB3, 0xCD, + 0xAA, 0xBF, 0x4B, 0xC9, 0x3A, 0xBF, 0x08, 0xCC, 0x87, 0xCA, 0x11, 0xD1, + 0x14, 0xD5, 0x47, 0xD3, 0xAA, 0xE2, 0x33, 0xD9, 0x3C, 0xF7, 0xAD, 0xE4, + 0xAF, 0x05, 0xCB, 0xEA, 0x91, 0x0E, 0xAE, 0xF2, 0x1B, 0x1B, 0x97, 0x00, + 0x84, 0x22, 0xEC, 0x0D, 0x97, 0x19, 0xCE, 0x13, 0x4F, 0x0E, 0x06, 0x13, + 0xB7, 0x0F, 0x0C, 0x0F, 0xFC, 0x0D, 0x36, 0x08, 0xF7, 0x09, 0x4B, 0x03, + 0x79, 0x09, 0x0C, 0x02, 0xD5, 0x03, 0x81, 0x03, 0x74, 0xFF, 0xA2, 0x00, + 0x37, 0x04, 0x6F, 0xFD, 0xBA, 0x0E, 0x36, 0x02, 0x79, 0x12, 0xD1, 0x03, + 0xF1, 0x0E, 0xF9, 0x00, 0xB6, 0x0E, 0xE3, 0x02, 0x0E, 0x0E, 0x01, 0x04, + 0x36, 0x0E, 0xD6, 0x05, 0xB8, 0x0E, 0x46, 0x0C, 0x4F, 0x08, 0xCB, 0x11, + 0xD0, 0xFA, 0x04, 0x15, 0xCB, 0xF2, 0xEA, 0x14, 0xC8, 0xF6, 0x19, 0x14, + 0xDB, 0xF6, 0x8E, 0x0A, 0x5B, 0xF9, 0x57, 0xFF, 0x83, 0xFF, 0x40, 0xFB, + 0xE6, 0x02, 0x16, 0xF4, 0x25, 0x0B, 0x15, 0xF0, 0x73, 0x17, 0x21, 0xF4, + 0x64, 0x21, 0x5F, 0xFA, 0xE6, 0x2F, 0x04, 0x09, 0x5C, 0x36, 0xE6, 0x18, + 0xD4, 0x31, 0x67, 0x23, 0x4A, 0x2D, 0x6D, 0x27, 0xDE, 0x26, 0x54, 0x29, + 0x97, 0x1B, 0x90, 0x2A, 0x8F, 0x0C, 0x8E, 0x2A, 0x51, 0x05, 0x50, 0x2C, + 0x45, 0x0B, 0x2F, 0x30, 0x47, 0x12, 0x39, 0x33, 0x07, 0x14, 0x46, 0x31, + 0x1F, 0x1D, 0xFC, 0x32, 0xFC, 0x2D, 0xB3, 0x38, 0x35, 0x3B, 0x21, 0x3B, + 0xE0, 0x42, 0xA0, 0x37, 0x91, 0x40, 0xAC, 0x30, 0xE7, 0x32, 0xBF, 0x26, + 0x8E, 0x1E, 0xB3, 0x14, 0xB4, 0x03, 0x3E, 0x01, 0xD3, 0xE7, 0xEA, 0xF3, + 0x50, 0xD8, 0xB4, 0xF2, 0x2D, 0xDF, 0xA2, 0xFE, 0x95, 0xF5, 0xBA, 0x0F, + 0x8E, 0x0D, 0x5A, 0x23, 0x18, 0x20, 0x64, 0x38, 0x25, 0x33, 0xF9, 0x48, + 0x4C, 0x4B, 0x93, 0x53, 0x5E, 0x5D, 0x22, 0x5A, 0x9F, 0x63, 0xEF, 0x56, + 0xEE, 0x5E, 0xDE, 0x49, 0x7B, 0x4A, 0x7D, 0x36, 0xCF, 0x26, 0x37, 0x1D, + 0xFA, 0x06, 0xC0, 0x07, 0x8A, 0xF3, 0x18, 0xFB, 0x82, 0xE8, 0x36, 0xF3, + 0x9E, 0xEA, 0xF3, 0xEF, 0x17, 0xF0, 0x82, 0xF0, 0x9F, 0xED, 0x9C, 0xF6, + 0x6E, 0xEB, 0x42, 0x00, 0x80, 0xF4, 0xB5, 0x07, 0xBC, 0xFE, 0xA0, 0x0A, + 0xE2, 0x0B, 0xD6, 0x10, 0xA0, 0x24, 0x05, 0x20, 0x91, 0x36, 0xA5, 0x31, + 0x0E, 0x3A, 0xFD, 0x39, 0xB5, 0x32, 0xE0, 0x32, 0xEC, 0x23, 0x5A, 0x24, + 0x16, 0x16, 0x02, 0x17, 0xA1, 0x0E, 0xEC, 0x0C, 0x11, 0x11, 0x34, 0x08, + 0x29, 0x18, 0x6E, 0x09, 0x05, 0x1A, 0x16, 0x0A, 0xBF, 0x18, 0xCD, 0x08, + 0x37, 0x18, 0xF7, 0x07, 0xE4, 0x0F, 0x91, 0x03, 0x82, 0x0D, 0x8D, 0x00, + 0x38, 0x15, 0x02, 0x02, 0x6A, 0x19, 0x1F, 0x04, 0x7D, 0x20, 0xE5, 0x08, + 0x86, 0x1A, 0x09, 0x07, 0x7B, 0x05, 0x8A, 0xFA, 0x16, 0xF1, 0x28, 0xEB, + 0x7E, 0xDF, 0x9B, 0xDF, 0xA6, 0xD5, 0x5F, 0xDD, 0xC6, 0xCE, 0xF5, 0xDB, + 0xB7, 0xD3, 0x41, 0xDF, 0xF0, 0xE3, 0x0E, 0xE8, 0x0C, 0xEC, 0xEB, 0xE7, + 0xA1, 0xEC, 0x3E, 0xE7, 0x7B, 0xEA, 0x75, 0xEB, 0x41, 0xE1, 0x32, 0xEC, + 0x55, 0xDC, 0x60, 0xF1, 0x10, 0xDD, 0xDE, 0xF8, 0x71, 0xDD, 0x89, 0xFE, + 0x18, 0xE1, 0x7C, 0x00, 0x02, 0xE6, 0x51, 0xFC, 0x37, 0xE1, 0x46, 0xF0, + 0xA4, 0xD4, 0xD5, 0xDF, 0x68, 0xD3, 0x2B, 0xD6, 0x90, 0xDA, 0x68, 0xD6, + 0xD0, 0xE1, 0xF4, 0xDC, 0xE9, 0xEC, 0x9B, 0xE4, 0x3D, 0xFA, 0x91, 0xEB, + 0x12, 0x0B, 0x3B, 0xF1, 0x0F, 0x16, 0xAE, 0xF2, 0x1C, 0x12, 0x4A, 0xEF, + 0x5A, 0x06, 0xAD, 0xE9, 0x06, 0xF9, 0x64, 0xE4, 0xB7, 0xE8, 0x65, 0xDD, + 0xB9, 0xD4, 0x48, 0xD5, 0xA9, 0xC1, 0x69, 0xCF, 0x9D, 0xB2, 0xC0, 0xCC, + 0x7D, 0xAE, 0x7E, 0xCE, 0x20, 0xBA, 0xA7, 0xD6, 0x44, 0xD3, 0x2A, 0xE7, + 0x8D, 0xF1, 0xE4, 0xFC, 0x07, 0x11, 0xE5, 0x0E, 0xC2, 0x2F, 0xAC, 0x19, + 0x6B, 0x3C, 0x10, 0x1C, 0xF8, 0x35, 0x55, 0x19, 0xC7, 0x23, 0xB3, 0x12, + 0x94, 0x09, 0x25, 0x09, 0x31, 0xEF, 0x98, 0x02, 0xCA, 0xDA, 0x85, 0xFD, + 0x56, 0xD3, 0xB4, 0xF9, 0x37, 0xD0, 0x34, 0xF6, 0xB9, 0xCA, 0xCC, 0xED, + 0x35, 0xC5, 0x15, 0xE1, 0x28, 0xC6, 0x8D, 0xD8, 0x49, 0xD4, 0xF2, 0xDF, + 0xAC, 0xE3, 0x1E, 0xF0, 0xA5, 0xF6, 0xA6, 0xFC, 0x1B, 0x10, 0x5D, 0x03, + 0x3E, 0x1E, 0x86, 0x06, 0xD0, 0x18, 0xB8, 0x09, 0xBA, 0x0C, 0x4D, 0x08, + 0x4D, 0x0B, 0x2A, 0x05, 0x6D, 0x0F, 0xD0, 0x08, 0x52, 0x14, 0xA9, 0x0E, + 0x66, 0x1F, 0x0F, 0x0E, 0x4D, 0x22, 0x6E, 0x0E, 0xB2, 0x18, 0x85, 0x17, + 0xFC, 0x12, 0x5E, 0x1D, 0x74, 0x0F, 0xA4, 0x1E, 0xEC, 0x0E, 0xF3, 0x23, + 0x4A, 0x12, 0x54, 0x24, 0xA2, 0x12, 0x80, 0x1D, 0xC1, 0x0A, 0xE2, 0x14, + 0x7E, 0xFE, 0xD0, 0x0A, 0x61, 0xF6, 0x7D, 0xF8, 0xF0, 0xF4, 0x0E, 0xE5, + 0xF6, 0xF4, 0x00, 0xDE, 0x30, 0xF4, 0x8D, 0xE2, 0x9D, 0xF7, 0x0B, 0xE5, + 0x90, 0xFD, 0x45, 0xE3, 0xDF, 0xFA, 0x4A, 0xE0, 0xB6, 0xF7, 0x54, 0xE3, + 0xD4, 0xFF, 0x99, 0xEC, 0xD7, 0x04, 0xDC, 0xEE, 0xE4, 0xFE, 0x5B, 0xF3, + 0x86, 0xFC, 0x35, 0xFF, 0x65, 0xFD, 0x9A, 0x06, 0x47, 0xFA, 0xFB, 0x07, + 0xB9, 0xF8, 0x74, 0x0A, 0x40, 0xF4, 0xD9, 0x09, 0x28, 0xED, 0x82, 0x06, + 0xAA, 0xE6, 0xF0, 0x06, 0x49, 0xE5, 0xF8, 0x03, 0x5D, 0xE2, 0xDB, 0xF8, + 0xCA, 0xDB, 0xBC, 0xEB, 0xB2, 0xE3, 0x7F, 0xE7, 0x4C, 0xF2, 0xA8, 0xEA, + 0xFA, 0xF9, 0x32, 0xED, 0x8A, 0xFD, 0xD1, 0xEE, 0x8F, 0x03, 0x1F, 0xF3, + 0x5C, 0x0A, 0xD0, 0xF3, 0xCC, 0x0B, 0x9F, 0xEC, 0x36, 0x0A, 0x78, 0xEA, + 0x22, 0x01, 0x98, 0xE5, 0xA4, 0xEF, 0x60, 0xD4, 0xAB, 0xD9, 0xA3, 0xC2, + 0x06, 0xC3, 0x7A, 0xBB, 0x94, 0xB1, 0x87, 0xBC, 0x94, 0xAC, 0xC2, 0xC1, + 0xED, 0xB9, 0x89, 0xCD, 0xAE, 0xD5, 0xAB, 0xDF, 0x95, 0xF6, 0xD4, 0xF2, + 0xAA, 0x11, 0xAD, 0x04, 0x4A, 0x1C, 0x38, 0x13, 0xDC, 0x1B, 0xDD, 0x18, + 0xC9, 0x19, 0x1C, 0x16, 0x4D, 0x14, 0x5C, 0x0D, 0x65, 0x0A, 0x15, 0x00, + 0x40, 0x02, 0xCB, 0xF1, 0x1B, 0xF8, 0x11, 0xDF, 0x5E, 0xE7, 0x25, 0xD0, + 0x23, 0xD5, 0x57, 0xCB, 0x78, 0xC8, 0xD4, 0xCC, 0x86, 0xC3, 0xBD, 0xD3, + 0xA6, 0xC5, 0xB8, 0xE0, 0x9E, 0xD2, 0x33, 0xEE, 0x85, 0xE1, 0xE1, 0xF1, + 0x00, 0xEC, 0x42, 0xF4, 0xAB, 0xF4, 0x61, 0xF7, 0xD5, 0xF7, 0x66, 0xF7, + 0x33, 0xF8, 0x32, 0xF9, 0x75, 0xFB, 0x5A, 0xFB, 0xA8, 0xFE, 0xE9, 0xF9, + 0xDF, 0x04, 0x90, 0xF8, 0x32, 0x07, 0xF3, 0xFB, 0x4C, 0x05, 0xFB, 0x08, + 0x2B, 0x06, 0x1E, 0x18, 0x67, 0x0A, 0xA2, 0x22, 0x18, 0x0C, 0xA4, 0x29, + 0x35, 0x08, 0x0E, 0x2E, 0xA8, 0x0C, 0xEC, 0x32, 0x41, 0x1C, 0x70, 0x34, + 0xCE, 0x2D, 0x68, 0x33, 0x24, 0x36, 0xFB, 0x30, 0x77, 0x31, 0x69, 0x27, + 0xDB, 0x26, 0xC2, 0x15, 0x08, 0x1E, 0xCF, 0x06, 0x3C, 0x19, 0x25, 0xFF, + 0x15, 0x18, 0x0E, 0xFD, 0xF3, 0x1B, 0x0E, 0x02, 0xBD, 0x1E, 0x64, 0x09, + 0x21, 0x1C, 0xA1, 0x0F, 0xDE, 0x14, 0xAC, 0x11, 0xE7, 0x15, 0x6C, 0x11, + 0xF3, 0x1D, 0xA2, 0x0F, 0x85, 0x1F, 0xD9, 0x10, 0x3D, 0x23, 0x3C, 0x1C, + 0x0B, 0x2D, 0x54, 0x2B, 0x84, 0x32, 0x7F, 0x31, 0x94, 0x31, 0x3C, 0x2A, + 0x1D, 0x30, 0x15, 0x20, 0xF5, 0x28, 0x64, 0x1B, 0xD6, 0x1D, 0xCC, 0x1B, + 0x0C, 0x19, 0xE4, 0x1F, 0xDB, 0x19, 0x99, 0x28, 0xC4, 0x17, 0x64, 0x2F, + 0xB6, 0x15, 0xEC, 0x31, 0x89, 0x1A, 0x42, 0x37, 0xE4, 0x1B, 0x37, 0x39, + 0x7D, 0x1A, 0x8C, 0x38, 0x2A, 0x20, 0xA2, 0x3E, 0x7C, 0x2A, 0x96, 0x45, + 0xDD, 0x31, 0x65, 0x44, 0x15, 0x33, 0x7C, 0x3D, 0x60, 0x2C, 0x23, 0x2E, + 0x19, 0x22, 0x3F, 0x18, 0xB9, 0x19, 0x5A, 0x05, 0x14, 0x0D, 0x40, 0xF9, + 0x92, 0x00, 0x4F, 0xF6, 0x0D, 0xF9, 0xDB, 0xF5, 0x2D, 0xF1, 0x47, 0xF5, + 0x02, 0xF2, 0xCA, 0xFC, 0x04, 0x03, 0x68, 0x07, 0x6F, 0x16, 0x61, 0x0F, + 0x79, 0x24, 0xFE, 0x15, 0x82, 0x32, 0x42, 0x1C, 0x86, 0x3C, 0x8C, 0x25, + 0x02, 0x3A, 0xE7, 0x2A, 0x4D, 0x2D, 0xCA, 0x23, 0x8B, 0x1C, 0x5D, 0x15, + 0x76, 0x08, 0x1C, 0x07, 0x61, 0xF6, 0x36, 0xF9, 0x22, 0xEE, 0xEA, 0xF0, + 0x1F, 0xEB, 0x29, 0xEF, 0xEA, 0xEC, 0xB2, 0xE8, 0xE9, 0xF2, 0xEB, 0xE1, + 0x07, 0xF7, 0x00, 0xE2, 0x55, 0xF5, 0xE7, 0xE4, 0x8B, 0xF0, 0xEE, 0xEA, + 0xA8, 0xF6, 0x44, 0xF4, 0xC9, 0x04, 0xB9, 0xFD, 0x19, 0x0C, 0x7C, 0x03, + 0x24, 0x09, 0x35, 0x03, 0xEA, 0x03, 0xCB, 0x04, 0x92, 0xFF, 0x5F, 0x09, + 0xEE, 0xF8, 0x8F, 0x09, 0x13, 0xF7, 0x79, 0x0C, 0xB2, 0x02, 0xC2, 0x13, + 0x9C, 0x13, 0x90, 0x16, 0x9E, 0x19, 0xCA, 0x14, 0xDC, 0x13, 0x32, 0x0F, + 0xF5, 0x08, 0x99, 0x06, 0x93, 0xFF, 0x28, 0xFF, 0x17, 0xFC, 0xD1, 0xF8, + 0x8B, 0xFF, 0x10, 0xF6, 0xD9, 0x07, 0x8D, 0xF2, 0x52, 0x0E, 0xC3, 0xEC, + 0x58, 0x0D, 0xE3, 0xE5, 0x08, 0x06, 0xBC, 0xE1, 0xF9, 0xF5, 0xA3, 0xE3, + 0xDD, 0xDF, 0x11, 0xE5, 0x6A, 0xD1, 0x46, 0xE9, 0xCC, 0xCD, 0xA9, 0xED, + 0x6B, 0xCE, 0x7A, 0xEE, 0x3A, 0xCD, 0xB9, 0xED, 0x55, 0xD1, 0x41, 0xEC, + 0x3F, 0xD5, 0xFD, 0xE6, 0xA1, 0xD2, 0xCE, 0xDD, 0x5B, 0xD0, 0x06, 0xD8, + 0x56, 0xD3, 0xA1, 0xD7, 0x05, 0xDC, 0x2A, 0xD5, 0x6E, 0xE4, 0x9D, 0xD3, + 0xEF, 0xEE, 0x91, 0xDC, 0x9D, 0xF5, 0x47, 0xE3, 0xD4, 0xF0, 0xF0, 0xE2, + 0x0C, 0xEB, 0xD8, 0xE5, 0x3E, 0xE8, 0xD6, 0xE9, 0x79, 0xE3, 0xF5, 0xE8, + 0x88, 0xDB, 0xE2, 0xE6, 0x4E, 0xD6, 0xFE, 0xE9, 0x2D, 0xD3, 0x2F, 0xEF, + 0x9E, 0xD0, 0x67, 0xF3, 0x63, 0xD9, 0x70, 0xFA, 0x78, 0xEA, 0x06, 0x01, + 0x2F, 0xFB, 0x17, 0x01, 0x44, 0x05, 0x16, 0xFB, 0xF9, 0x04, 0xCC, 0xF3, + 0xC1, 0xFE, 0x6F, 0xEB, 0xCC, 0xF4, 0xB9, 0xDE, 0x3D, 0xED, 0x69, 0xD5, + 0xD1, 0xE8, 0xF7, 0xD4, 0x49, 0xE1, 0xF1, 0xD4, 0xBF, 0xD9, 0xF0, 0xD3, + 0x6B, 0xD7, 0x23, 0xD4, 0x2F, 0xD6, 0x79, 0xD7, 0xCC, 0xD7, 0xDE, 0xE0, + 0x58, 0xE4, 0x8A, 0xEC, 0x9E, 0xF9, 0x3B, 0xFB, 0xE7, 0x09, 0xA5, 0x07, + 0xAF, 0x0C, 0x03, 0x0A, 0x91, 0x0A, 0x87, 0x0B, 0xE7, 0x0A, 0x0D, 0x10, + 0x13, 0x11, 0x6D, 0x0E, 0x17, 0x13, 0xF2, 0x08, 0x8E, 0x09, 0x73, 0x08, + 0xE9, 0x02, 0x8E, 0x08, 0x28, 0xFF, 0xB6, 0xFF, 0x38, 0xF5, 0x3A, 0xF4, + 0xD2, 0xEA, 0x5B, 0xEB, 0x30, 0xE8, 0x1A, 0xE4, 0x70, 0xED, 0x4D, 0xE9, + 0x92, 0xF6, 0xEA, 0xF8, 0xB9, 0x00, 0xB6, 0x04, 0x5A, 0x07, 0xEB, 0x05, + 0x59, 0x09, 0xE4, 0x02, 0x15, 0x09, 0x7F, 0x08, 0x25, 0x01, 0x32, 0x11, + 0x18, 0xF8, 0xB1, 0x19, 0xA4, 0xF9, 0x15, 0x20, 0xE0, 0xFF, 0xCE, 0x1E, + 0xF4, 0x04, 0x04, 0x1B, 0x01, 0x03, 0xC6, 0x16, 0xD5, 0xFE, 0x1B, 0x11, + 0x72, 0x04, 0x41, 0x08, 0x15, 0x15, 0x6C, 0xFD, 0xCD, 0x25, 0xF7, 0xF4, + 0x68, 0x30, 0x43, 0xF9, 0xE5, 0x36, 0x4F, 0x00, 0xE8, 0x32, 0x09, 0x03, + 0xA9, 0x1F, 0x54, 0x0C, 0xFE, 0x07, 0x42, 0x17, 0x80, 0xFA, 0x20, 0x1C, + 0x40, 0xF4, 0xB5, 0x17, 0xAD, 0xF1, 0xE3, 0x10, 0x24, 0xED, 0x9A, 0x05, + 0x1C, 0xE4, 0xDF, 0xF7, 0x71, 0xDA, 0x27, 0xF0, 0x5A, 0xD6, 0x9B, 0xEC, + 0x7C, 0xD7, 0x29, 0xE9, 0xA4, 0xDE, 0xDC, 0xE8, 0x2D, 0xF0, 0x90, 0xE8, + 0x95, 0xFA, 0xC2, 0xE5, 0xFB, 0xF8, 0xD6, 0xE0, 0x4C, 0xFA, 0x62, 0xDB, + 0x5E, 0xFD, 0x6D, 0xDE, 0x00, 0x00, 0x49, 0xE2, 0xE1, 0xFF, 0xC7, 0xDF, + 0x93, 0xFB, 0x47, 0xDF, 0xF3, 0xF6, 0x53, 0xE0, 0x84, 0xEA, 0xA7, 0xDA, + 0x9C, 0xDC, 0x3D, 0xD5, 0x82, 0xD9, 0x35, 0xD9, 0xA2, 0xDA, 0xDC, 0xE2, + 0x3D, 0xDF, 0xE6, 0xEB, 0x04, 0xEE, 0xA2, 0xF2, 0x05, 0xFF, 0x60, 0xF5, + 0x04, 0x0D, 0xA2, 0xF5, 0x82, 0x17, 0xF5, 0xFA, 0x3B, 0x19, 0x67, 0x05, + 0x7C, 0x0D, 0x78, 0x0B, 0x07, 0xFB, 0x97, 0x0D, 0xE2, 0xEB, 0x25, 0x0A, + 0x0B, 0xDE, 0xE0, 0x00, 0xE4, 0xD1, 0x40, 0xF6, 0x55, 0xC9, 0x08, 0xE3, + 0x6B, 0xC3, 0x9C, 0xD5, 0x2A, 0xC4, 0xFA, 0xDA, 0x0B, 0xCC, 0xCC, 0xE5, + 0x93, 0xD6, 0x6C, 0xEB, 0x46, 0xE2, 0x5F, 0xEA, 0xB7, 0xEE, 0x27, 0xE8, + 0xC8, 0xFA, 0xC7, 0xE7, 0xD0, 0x03, 0x79, 0xEA, 0x9D, 0x0D, 0xC9, 0xED, + 0x09, 0x10, 0x65, 0xEF, 0xFA, 0x05, 0xC4, 0xEE, 0x9F, 0xFC, 0x81, 0xEC, + 0x92, 0xF4, 0x88, 0xE9, 0xD0, 0xEE, 0xAD, 0xE3, 0x5A, 0xEB, 0xB7, 0xDD, + 0x4E, 0xEE, 0xD2, 0xDF, 0xC4, 0xF6, 0x5B, 0xEA, 0x78, 0xFC, 0xF2, 0xF7, + 0x2B, 0xFE, 0xA2, 0x03, 0x28, 0xF8, 0x3E, 0x0B, 0x82, 0xF4, 0x36, 0x11, + 0x5D, 0xFE, 0xF8, 0x10, 0xF3, 0x0A, 0xA5, 0x0B, 0x51, 0x13, 0x80, 0x0D, + 0xFD, 0x18, 0xFD, 0x12, 0x91, 0x1B, 0x7A, 0x16, 0x5F, 0x1A, 0x0D, 0x1C, + 0x9F, 0x18, 0x4C, 0x22, 0xF1, 0x1B, 0xD6, 0x26, 0x0E, 0x24, 0xF4, 0x29, + 0x75, 0x2F, 0xF9, 0x2E, 0xF9, 0x38, 0x9F, 0x3C, 0x53, 0x3F, 0xD9, 0x47, + 0x4F, 0x42, 0x19, 0x46, 0xE6, 0x3A, 0x35, 0x46, 0x9F, 0x2F, 0x45, 0x49, + 0x22, 0x2F, 0xAA, 0x49, 0x28, 0x35, 0x0C, 0x4D, 0x37, 0x3D, 0x11, 0x52, + 0x70, 0x46, 0x4F, 0x4F, 0x66, 0x46, 0x3F, 0x42, 0x36, 0x36, 0x19, 0x35, + 0xEE, 0x22, 0x0E, 0x2B, 0xFC, 0x19, 0x77, 0x24, 0x4A, 0x17, 0x1E, 0x22, + 0xB1, 0x1E, 0x27, 0x27, 0xC6, 0x2D, 0x24, 0x30, 0x4F, 0x39, 0x1F, 0x34, + 0x33, 0x3A, 0xB6, 0x32, 0x12, 0x32, 0x18, 0x2F, 0x3E, 0x2B, 0xD9, 0x2A, + 0x37, 0x2B, 0xDB, 0x29, 0x30, 0x2F, 0xF5, 0x30, 0x8A, 0x33, 0x45, 0x3C, + 0xFE, 0x35, 0x1A, 0x40, 0x76, 0x32, 0x5E, 0x3A, 0x2F, 0x26, 0xF3, 0x33, + 0xF7, 0x14, 0xDF, 0x28, 0xE3, 0x09, 0xCF, 0x14, 0x02, 0x09, 0x81, 0x09, + 0xEE, 0x0E, 0x9F, 0x0A, 0x6E, 0x1C, 0x25, 0x0C, 0x82, 0x2C, 0x06, 0x0C, + 0x46, 0x33, 0x01, 0x0A, 0xEA, 0x2F, 0x8D, 0x09, 0x01, 0x2B, 0xE0, 0x0A, + 0x31, 0x28, 0xB9, 0x0C, 0x0E, 0x24, 0x68, 0x10, 0xEF, 0x1C, 0xC1, 0x15, + 0xEB, 0x14, 0xEA, 0x18, 0x5A, 0x0A, 0x22, 0x13, 0x59, 0xFC, 0x2B, 0x04, + 0x7F, 0xED, 0x32, 0xF8, 0xC7, 0xE3, 0xBB, 0xF6, 0x6E, 0xE7, 0x41, 0xF9, + 0xAD, 0xF3, 0x78, 0xFB, 0xA0, 0xFC, 0x31, 0xFB, 0x1B, 0x02, 0xE2, 0xF7, + 0x0A, 0x07, 0xF0, 0xF3, 0x35, 0x08, 0x28, 0xEE, 0xC1, 0x0A, 0x4E, 0xE8, + 0x3C, 0x0F, 0x9E, 0xE8, 0x8B, 0x0B, 0x6B, 0xF1, 0xF3, 0x00, 0x52, 0xF9, + 0xC2, 0xF8, 0xB4, 0xF8, 0xDC, 0xEF, 0x72, 0xF5, 0xD1, 0xE4, 0x92, 0xF4, + 0xC6, 0xE1, 0xDC, 0xF4, 0x63, 0xE6, 0xEB, 0xF3, 0x87, 0xE6, 0xD5, 0xF1, + 0xA1, 0xDE, 0x67, 0xF0, 0x7D, 0xDE, 0x1E, 0xEF, 0x08, 0xE5, 0x53, 0xEA, + 0x51, 0xEA, 0xD7, 0xE3, 0x59, 0xF0, 0xF4, 0xE2, 0x76, 0xF5, 0xF5, 0xE5, + 0xB5, 0xFB, 0x78, 0xE6, 0x27, 0xFD, 0xD3, 0xE4, 0x6B, 0xF6, 0x25, 0xE4, + 0x4F, 0xEE, 0x90, 0xE3, 0xF1, 0xE8, 0x3B, 0xE5, 0x2B, 0xE9, 0x3E, 0xEC, + 0x31, 0xEB, 0xBB, 0xF4, 0xC7, 0xEB, 0x28, 0xFE, 0x66, 0xEC, 0xB2, 0x06, + 0xDE, 0xF0, 0x87, 0x0A, 0x91, 0xF9, 0xF5, 0x09, 0x9F, 0xFC, 0xA9, 0x05, + 0x94, 0xF9, 0x23, 0x04, 0x6A, 0xF7, 0xE5, 0x07, 0xDE, 0xF4, 0x1D, 0x0A, + 0x78, 0xF5, 0xFF, 0x07, 0xC6, 0xF9, 0x51, 0x03, 0x67, 0xFC, 0x30, 0xFD, + 0xF2, 0xF9, 0x3C, 0xF7, 0x84, 0xEF, 0x1F, 0xF5, 0x3E, 0xE4, 0xC7, 0xF3, + 0xCE, 0xE0, 0x15, 0xF0, 0x2F, 0xDE, 0xFE, 0xEC, 0x18, 0xD6, 0x70, 0xEB, + 0xDC, 0xD3, 0x38, 0xEC, 0x2C, 0xDC, 0xDF, 0xED, 0xE5, 0xE6, 0xA2, 0xEC, + 0xA9, 0xEE, 0x1E, 0xEB, 0xF4, 0xF1, 0x3D, 0xED, 0x81, 0xEF, 0xE9, 0xF0, + 0xC4, 0xE9, 0x58, 0xF4, 0x7F, 0xE9, 0x72, 0xF4, 0xFB, 0xF1, 0xDC, 0xF0, + 0xCA, 0xF9, 0xD7, 0xEC, 0xD0, 0xFD, 0x36, 0xEA, 0x0A, 0xFF, 0xF5, 0xE9, + 0x82, 0x01, 0x25, 0xE9, 0xDB, 0x02, 0x67, 0xE1, 0x84, 0xFC, 0xE3, 0xDB, + 0xFA, 0xF8, 0x86, 0xE0, 0x3F, 0xFC, 0x7E, 0xE4, 0xF3, 0xFB, 0x06, 0xE9, + 0x1C, 0xF6, 0x7F, 0xF2, 0x3C, 0xF1, 0x83, 0xFC, 0xA2, 0xED, 0x14, 0x03, + 0x47, 0xEB, 0x61, 0x00, 0x87, 0xEE, 0x85, 0xF5, 0x1B, 0xF5, 0xC9, 0xEA, + 0x6B, 0xF7, 0xC0, 0xE8, 0xF5, 0xF6, 0xD4, 0xEF, 0x2E, 0xF7, 0x99, 0xF6, + 0xED, 0xF6, 0xFF, 0xF7, 0x7A, 0xF9, 0xC2, 0xF7, 0xB5, 0xFE, 0x7F, 0xF6, + 0x4A, 0x01, 0xE7, 0xF2, 0x88, 0xFD, 0x0A, 0xF5, 0xB9, 0xF6, 0x06, 0xFD, + 0xA1, 0xEF, 0xE3, 0x01, 0x4E, 0xE9, 0xC5, 0x01, 0x76, 0xE8, 0x11, 0xFF, + 0x4E, 0xE8, 0xB2, 0xFB, 0x29, 0xE8, 0xD5, 0xF8, 0xA0, 0xEC, 0x04, 0xF4, + 0x6E, 0xF1, 0xB8, 0xEF, 0x22, 0xF3, 0x7C, 0xF1, 0x2C, 0xF4, 0x8E, 0xF6, + 0xB0, 0xF8, 0x40, 0xF5, 0x74, 0x00, 0x42, 0xE9, 0x13, 0x0A, 0x51, 0xD8, + 0xAF, 0x10, 0x50, 0xCE, 0x34, 0x13, 0x1F, 0xD4, 0x0B, 0x14, 0xB2, 0xE3, + 0x77, 0x11, 0xF3, 0xF5, 0xB1, 0x0E, 0x37, 0x06, 0xA6, 0x0C, 0x34, 0x10, + 0x49, 0x08, 0x34, 0x15, 0x4B, 0x02, 0x00, 0x18, 0x99, 0xFB, 0x74, 0x19, + 0x02, 0xF5, 0xE6, 0x14, 0x08, 0xF1, 0x87, 0x0E, 0xF8, 0xF0, 0x07, 0x0B, + 0x1E, 0xF6, 0x1C, 0x05, 0x4D, 0xF9, 0xB4, 0xFE, 0x73, 0xF6, 0x77, 0xF8, + 0x08, 0xF5, 0xDB, 0xF3, 0x24, 0xF5, 0x8B, 0xF9, 0x2E, 0xF5, 0xC7, 0x05, + 0x08, 0xF8, 0xBF, 0x0D, 0xF8, 0xFC, 0xCA, 0x11, 0x9B, 0x03, 0xEF, 0x12, + 0x66, 0x05, 0x54, 0x0E, 0xEF, 0xFD, 0xD2, 0x06, 0xC3, 0xF4, 0xFC, 0xFE, + 0x75, 0xF0, 0x33, 0xF7, 0xCD, 0xEE, 0x97, 0xEF, 0x8C, 0xEF, 0xDB, 0xEA, + 0x85, 0xF1, 0x07, 0xE5, 0x6D, 0xEA, 0x57, 0xDC, 0x0B, 0xE4, 0xAE, 0xDA, + 0x3F, 0xE7, 0x33, 0xDC, 0x77, 0xE8, 0xDA, 0xDD, 0xB2, 0xE9, 0x19, 0xE7, + 0x0A, 0xEC, 0x68, 0xF3, 0xA6, 0xED, 0x32, 0xFB, 0x07, 0xF1, 0x97, 0xFC, + 0x00, 0xF2, 0x3B, 0xF6, 0x02, 0xF0, 0x8B, 0xED, 0x8F, 0xED, 0x2E, 0xE6, + 0xA8, 0xE7, 0xCC, 0xDC, 0x60, 0xE1, 0x22, 0xD3, 0x96, 0xDF, 0x3D, 0xD0, + 0xB9, 0xDD, 0x88, 0xD4, 0xD0, 0xDB, 0x6C, 0xD9, 0xA1, 0xDA, 0x3A, 0xDD, + 0x86, 0xD9, 0xA0, 0xE0, 0x38, 0xDB, 0xCC, 0xE1, 0xAF, 0xDF, 0xB7, 0xE1, + 0xA5, 0xE8, 0x64, 0xE2, 0x19, 0xF4, 0x01, 0xE5, 0xBE, 0xF8, 0x87, 0xE7, + 0xB5, 0xF6, 0x22, 0xE7, 0xC7, 0xF4, 0x88, 0xE5, 0xA0, 0xF0, 0x39, 0xE2, + 0xEF, 0xEC, 0x22, 0xE1, 0x8D, 0xF0, 0xA8, 0xE4, 0xFE, 0xF9, 0xA3, 0xE9, + 0x4F, 0x06, 0xA2, 0xF1, 0x48, 0x0C, 0x28, 0xFD, 0x57, 0x08, 0xEE, 0x0A, + 0x04, 0x05, 0x21, 0x18, 0x02, 0x03, 0xB8, 0x1F, 0xA0, 0xFE, 0x92, 0x23, + 0xE5, 0xF9, 0xB8, 0x24, 0x04, 0xFA, 0xFA, 0x20, 0xDF, 0xFB, 0x35, 0x1D, + 0x24, 0xFD, 0x6A, 0x16, 0x2D, 0x05, 0x14, 0x08, 0x06, 0x0E, 0x4C, 0xFA, + 0x99, 0x16, 0x42, 0xF3, 0x6C, 0x24, 0x38, 0xF1, 0xAC, 0x2F, 0x40, 0xF6, + 0x0E, 0x33, 0x39, 0x07, 0xB2, 0x35, 0xB0, 0x1C, 0x2A, 0x36, 0x5D, 0x2E, + 0x00, 0x2E, 0xE7, 0x39, 0x97, 0x22, 0x6F, 0x3F, 0xFB, 0x1D, 0x9F, 0x43, + 0x7F, 0x26, 0x8E, 0x45, 0x88, 0x34, 0x46, 0x45, 0x3C, 0x3B, 0xCE, 0x45, + 0x10, 0x3D, 0x4C, 0x40, 0xB5, 0x3D, 0xFB, 0x33, 0x01, 0x3A, 0x69, 0x2C, + 0xE4, 0x3B, 0xB7, 0x29, 0xB0, 0x43, 0x0E, 0x2A, 0x8C, 0x42, 0x82, 0x33, + 0x83, 0x3E, 0x4B, 0x3C, 0x1C, 0x43, 0x91, 0x3B, 0x8A, 0x43, 0xA9, 0x36, + 0xFE, 0x37, 0x8C, 0x38, 0x5C, 0x31, 0x96, 0x41, 0x7B, 0x31, 0xFE, 0x48, + 0x20, 0x2F, 0xDF, 0x4F, 0xB3, 0x2D, 0x7A, 0x55, 0x2F, 0x2D, 0x20, 0x51, + 0x3B, 0x2B, 0x97, 0x43, 0x3A, 0x24, 0x9B, 0x36, 0xA9, 0x1C, 0xFB, 0x2A, + 0x62, 0x1B, 0xEB, 0x21, 0x93, 0x1A, 0xF2, 0x1D, 0x66, 0x1B, 0x4E, 0x1A, + 0xF0, 0x1E, 0x62, 0x12, 0x6F, 0x1B, 0xCC, 0x0B, 0xA3, 0x0F, 0xCC, 0x0D, + 0x3E, 0x09, 0x61, 0x10, 0x7B, 0x09, 0x0E, 0x0F, 0x4C, 0x05, 0x90, 0x0E, + 0x20, 0x02, 0xD8, 0x12, 0x24, 0x05, 0x93, 0x15, 0x92, 0x07, 0xA8, 0x10, + 0xA3, 0x03, 0x8C, 0x09, 0xF7, 0xFC, 0xC6, 0xFF, 0xAE, 0xFC, 0x0D, 0xF5, + 0x67, 0xFE, 0x58, 0xF1, 0x06, 0xFE, 0x76, 0xF6, 0x6B, 0xFE, 0xA3, 0xFC, + 0xA9, 0xFB, 0x38, 0xFD, 0x8C, 0xF5, 0x8B, 0xF8, 0x8E, 0xF3, 0x6F, 0xEE, + 0x3A, 0xF6, 0xA2, 0xE2, 0x9E, 0xF9, 0x47, 0xDA, 0xF3, 0xF9, 0x77, 0xD9, + 0x23, 0xF6, 0xBE, 0xE1, 0xED, 0xF6, 0x68, 0xE9, 0x79, 0xF8, 0xBA, 0xE8, + 0x97, 0xF9, 0x8E, 0xE0, 0x1C, 0x01, 0x7A, 0xD7, 0xB4, 0x03, 0x0F, 0xD6, + 0x81, 0xF9, 0x86, 0xD9, 0xB6, 0xED, 0xAB, 0xE1, 0xD3, 0xE7, 0xF2, 0xEA, + 0x2A, 0xE3, 0xB4, 0xEC, 0x1D, 0xDE, 0xB8, 0xEC, 0xB8, 0xDB, 0xE5, 0xEC, + 0xBD, 0xDF, 0xBD, 0xEA, 0xC3, 0xEB, 0xD6, 0xEB, 0xEA, 0xF7, 0xF5, 0xF0, + 0x8E, 0xFB, 0xE2, 0xF3, 0x04, 0xF6, 0x1A, 0xF3, 0xD1, 0xED, 0x7A, 0xF0, + 0xBF, 0xEA, 0xAC, 0xEE, 0x0F, 0xEB, 0x4B, 0xF4, 0xD7, 0xE6, 0x03, 0xFB, + 0x22, 0xE0, 0x98, 0xFC, 0x95, 0xDD, 0x62, 0x02, 0x7A, 0xDD, 0x40, 0x05, + 0xDE, 0xDD, 0x24, 0xFE, 0x57, 0xE2, 0xC8, 0xF7, 0x6C, 0xEA, 0x22, 0xF7, + 0x2A, 0xF5, 0x16, 0xF8, 0x8E, 0x01, 0x61, 0xF9, 0x8F, 0x08, 0x51, 0xF9, + 0x50, 0x07, 0xA2, 0xF7, 0x19, 0x03, 0xD2, 0xF7, 0xE4, 0xFF, 0x4B, 0xF7, + 0x29, 0xFD, 0xD8, 0xEF, 0xB5, 0xFA, 0x40, 0xE7, 0x6E, 0xF7, 0x87, 0xE5, + 0x0D, 0xF4, 0x04, 0xEA, 0x66, 0xEF, 0xC4, 0xF0, 0x5A, 0xEA, 0xEC, 0xF6, + 0xC8, 0xE9, 0x45, 0xFB, 0x50, 0xED, 0xBE, 0xFE, 0x75, 0xEF, 0xAF, 0x01, + 0x2D, 0xF1, 0xF2, 0x02, 0x65, 0xF6, 0x72, 0x05, 0x27, 0xFF, 0xE0, 0x09, + 0x6A, 0x0A, 0xDC, 0x0A, 0xB6, 0x15, 0xAA, 0x07, 0xC1, 0x1A, 0x60, 0x08, + 0xC8, 0x16, 0x20, 0x0B, 0x6D, 0x10, 0xC7, 0x06, 0x47, 0x07, 0x0B, 0xFF, + 0x7F, 0xFB, 0x96, 0xFB, 0xB5, 0xF3, 0xD9, 0xFD, 0xD6, 0xF1, 0x7C, 0x00, + 0x03, 0xF1, 0xFD, 0xFA, 0x84, 0xEE, 0x57, 0xF3, 0x3C, 0xF1, 0x76, 0xF2, + 0xA9, 0xF3, 0x51, 0xF5, 0xE1, 0xF3, 0xE6, 0xF8, 0x5A, 0xF5, 0xAA, 0xF9, + 0x4C, 0xF3, 0x1B, 0xF6, 0xD5, 0xEE, 0x9B, 0xF3, 0xE4, 0xEC, 0xB5, 0xF2, + 0x7F, 0xEE, 0x2F, 0xEF, 0x87, 0xF0, 0xE1, 0xE9, 0x4B, 0xF1, 0xAC, 0xE6, + 0xA8, 0xEF, 0x38, 0xE8, 0x75, 0xEE, 0x51, 0xED, 0x53, 0xEE, 0xE9, 0xEF, + 0xCA, 0xEC, 0x6F, 0xEF, 0xC9, 0xED, 0x22, 0xEF, 0x20, 0xF1, 0x9F, 0xF0, + 0xA5, 0xF1, 0x8F, 0xF5, 0xBB, 0xEE, 0x5B, 0xFB, 0x2A, 0xEA, 0xBF, 0xFE, + 0xEA, 0xEA, 0x6F, 0xFF, 0x77, 0xF0, 0x8F, 0xFD, 0xAB, 0xF4, 0x95, 0xFB, + 0x92, 0xF6, 0x8D, 0xF9, 0xB6, 0xF4, 0x30, 0xF4, 0x9E, 0xF1, 0x04, 0xEB, + 0x1F, 0xF4, 0x59, 0xE3, 0x40, 0xFD, 0xCA, 0xE0, 0x05, 0x06, 0x41, 0xE0, + 0x32, 0x08, 0x1E, 0xE1, 0x98, 0x07, 0x7F, 0xE6, 0xC9, 0x0B, 0x1F, 0xEF, + 0x80, 0x0F, 0x2C, 0xF7, 0x00, 0x0E, 0xF6, 0x01, 0x08, 0x0D, 0xB5, 0x0E, + 0x52, 0x09, 0xE8, 0x14, 0x92, 0xFE, 0xFD, 0x13, 0xDD, 0xF3, 0xE6, 0x0E, + 0x23, 0xEE, 0x54, 0x09, 0x49, 0xEC, 0xD0, 0x06, 0xEF, 0xED, 0x3B, 0x05, + 0x1E, 0xED, 0x3C, 0x04, 0xE5, 0xE8, 0xDA, 0x00, 0x67, 0xEB, 0x81, 0xF8, + 0x73, 0xF3, 0xEB, 0xEF, 0x79, 0xFC, 0xF4, 0xEA, 0x04, 0x07, 0x42, 0xEE, + 0x15, 0x10, 0x89, 0xF7, 0xC1, 0x15, 0x31, 0x00, 0x90, 0x12, 0xE9, 0x03, + 0xE6, 0x06, 0xFD, 0x01, 0x0D, 0xFD, 0x59, 0xFD, 0xE0, 0xF7, 0x9E, 0xF7, + 0x55, 0xF8, 0xB7, 0xF2, 0x3C, 0xFB, 0x61, 0xF1, 0x9D, 0xFB, 0x0E, 0xF6, + 0x8D, 0xFB, 0x19, 0xFC, 0x28, 0xFA, 0x13, 0x00, 0xF0, 0xF4, 0x6A, 0x02, + 0x7A, 0xED, 0xA9, 0x02, 0xBD, 0xED, 0xA0, 0x03, 0xA3, 0xF7, 0x91, 0x05, + 0xCD, 0x03, 0x45, 0x05, 0x26, 0x0E, 0x90, 0x01, 0x7B, 0x11, 0xFB, 0xFF, + 0xC9, 0x0B, 0xE6, 0xF8, 0xEF, 0x01, 0x12, 0xEB, 0x84, 0xF5, 0x15, 0xE6, + 0xD8, 0xEB, 0x5D, 0xE9, 0x8C, 0xEC, 0x2A, 0xF0, 0xC6, 0xEF, 0x2B, 0xF7, + 0x7A, 0xEE, 0xDD, 0xF9, 0x44, 0xE9, 0xF9, 0xF5, 0xCE, 0xDF, 0x2B, 0xEB, + 0x0C, 0xD7, 0xAD, 0xDD, 0xDD, 0xD8, 0xAF, 0xD9, 0xA1, 0xE2, 0xC7, 0xE1, + 0xA1, 0xE8, 0x35, 0xEC, 0x3E, 0xEC, 0x68, 0xF4, 0x9C, 0xF0, 0x7C, 0xF1, + 0xBF, 0xF0, 0x48, 0xE4, 0x78, 0xEC, 0x98, 0xDB, 0x70, 0xE7, 0x6A, 0xDD, + 0x8A, 0xE7, 0x61, 0xE7, 0x8A, 0xEF, 0x1C, 0xF4, 0xF5, 0xF6, 0xA4, 0x00, + 0x72, 0xF7, 0x7F, 0x08, 0xBC, 0xF6, 0xA0, 0x04, 0xD3, 0xF2, 0xA6, 0xFB, + 0x5D, 0xEA, 0xAA, 0xFB, 0xC4, 0xEC, 0x74, 0x04, 0x9C, 0xF3, 0xA5, 0x0D, + 0x3C, 0xFA, 0xD7, 0x12, 0xCB, 0x07, 0xF9, 0x0C, 0xEB, 0x0E, 0x69, 0xFB, + 0x07, 0x0C, 0x80, 0xEA, 0xC0, 0x08, 0x93, 0xE2, 0xB5, 0x0C, 0x74, 0xE6, + 0xCD, 0x18, 0xE2, 0xF1, 0xB6, 0x23, 0x9D, 0x01, 0x67, 0x2A, 0xE2, 0x11, + 0x29, 0x32, 0xEF, 0x1A, 0x28, 0x37, 0x58, 0x22, 0xB9, 0x2F, 0x0A, 0x2D, + 0xF8, 0x24, 0x67, 0x34, 0x91, 0x25, 0x06, 0x39, 0xB3, 0x2C, 0x78, 0x3D, + 0xF7, 0x32, 0xF6, 0x3E, 0x97, 0x33, 0xA1, 0x3B, 0x88, 0x30, 0x5B, 0x36, + 0xBA, 0x2E, 0x48, 0x34, 0x0E, 0x2D, 0x8C, 0x37, 0x8D, 0x33, 0x40, 0x41, + 0x9B, 0x3C, 0x7E, 0x4D, 0x97, 0x3E, 0xE6, 0x55, 0xDC, 0x41, 0xC5, 0x56, + 0x8A, 0x42, 0xEE, 0x4F, 0x5C, 0x3A, 0xCE, 0x48, 0xF9, 0x2E, 0xCF, 0x44, + 0x46, 0x23, 0x81, 0x43, 0xE8, 0x1A, 0x4C, 0x43, 0x7B, 0x1A, 0xDF, 0x40, + 0x98, 0x21, 0xE2, 0x38, 0x2D, 0x2C, 0x1C, 0x28, 0x65, 0x30, 0x38, 0x15, + 0x5D, 0x29, 0x0D, 0x0C, 0xA6, 0x21, 0x48, 0x0E, 0x8C, 0x22, 0x18, 0x19, + 0x8E, 0x28, 0x0A, 0x25, 0x6A, 0x30, 0x10, 0x28, 0xD8, 0x32, 0x93, 0x24, + 0xA5, 0x2D, 0xF0, 0x1D, 0x2F, 0x2A, 0x00, 0x16, 0xFD, 0x24, 0xE4, 0x12, + 0x54, 0x1D, 0xA5, 0x13, 0x34, 0x19, 0x58, 0x14, 0x6A, 0x16, 0x66, 0x14, + 0x29, 0x13, 0xEE, 0x10, 0x29, 0x13, 0x59, 0x0A, 0x76, 0x16, 0x63, 0x07, + 0xD1, 0x14, 0x59, 0x08, 0xB2, 0x0E, 0xA3, 0x0A, 0x44, 0x0D, 0xAF, 0x0D, + 0x80, 0x10, 0xBE, 0x11, 0x74, 0x0D, 0x00, 0x15, 0x8A, 0x04, 0x95, 0x0F, + 0xAE, 0xFC, 0x21, 0x06, 0xC3, 0xF4, 0x4A, 0x02, 0xF7, 0xEA, 0xB0, 0x02, + 0x87, 0xDD, 0xF2, 0x01, 0xEE, 0xD4, 0x24, 0xFF, 0x6F, 0xDD, 0x86, 0xF9, + 0x78, 0xF3, 0xC3, 0xEF, 0xE0, 0x09, 0x4B, 0xE4, 0x18, 0x13, 0x8C, 0xDA, + 0xD1, 0x0A, 0x50, 0xD5, 0x82, 0xFA, 0xD3, 0xD5, 0x66, 0xEC, 0x86, 0xDF, + 0xDF, 0xE2, 0xB6, 0xF0, 0x74, 0xDE, 0xA9, 0xFC, 0x5F, 0xDE, 0x7C, 0xFF, + 0x74, 0xDE, 0x46, 0xFE, 0xE0, 0xDD, 0x11, 0xF6, 0xB7, 0xDC, 0x92, 0xE7, + 0x5F, 0xDC, 0xD7, 0xD5, 0xCE, 0xE1, 0xD7, 0xC7, 0xB5, 0xE7, 0xDD, 0xC8, + 0x58, 0xEA, 0x66, 0xD1, 0xAB, 0xF0, 0xDB, 0xD6, 0x3A, 0xF3, 0xD7, 0xD9, + 0x88, 0xE9, 0x5F, 0xDB, 0xC7, 0xDD, 0x6B, 0xE0, 0xD3, 0xD6, 0xA4, 0xEB, + 0x4B, 0xD6, 0x39, 0xF6, 0x42, 0xD8, 0xEC, 0xFB, 0x93, 0xD7, 0xA2, 0xFD, + 0x3E, 0xDA, 0x6E, 0xFA, 0xBF, 0xE2, 0xFE, 0xF0, 0x31, 0xEC, 0x33, 0xE5, + 0xEF, 0xEE, 0xFE, 0xDB, 0x08, 0xEC, 0x84, 0xDA, 0xD9, 0xE9, 0xA5, 0xDB, + 0x1D, 0xED, 0xDF, 0xD5, 0x5B, 0xF2, 0x7A, 0xD0, 0x43, 0xF7, 0x91, 0xD0, + 0x2A, 0xFF, 0xAF, 0xD5, 0x1D, 0x01, 0xFF, 0xE2, 0xF8, 0xFA, 0x76, 0xF5, + 0xD9, 0xF2, 0xA0, 0x03, 0xF3, 0xEC, 0x04, 0x07, 0xA0, 0xEF, 0xDA, 0x03, + 0x77, 0xF3, 0x5B, 0x01, 0x54, 0xF1, 0xC1, 0x00, 0x4C, 0xF0, 0x21, 0x01, + 0xC1, 0xEF, 0x18, 0x00, 0xAE, 0xF3, 0xE9, 0xFA, 0xA2, 0xFC, 0xC4, 0xF3, + 0x4F, 0x03, 0x24, 0xF0, 0xC8, 0x06, 0x5D, 0xF0, 0x1F, 0x03, 0x08, 0xF1, + 0xE9, 0xFC, 0x48, 0xF4, 0xD4, 0xFA, 0x85, 0xFC, 0xB2, 0xFC, 0x4F, 0x07, + 0x47, 0x00, 0x34, 0x10, 0x94, 0x02, 0x4E, 0x15, 0xC8, 0x01, 0x37, 0x17, + 0xC3, 0xFF, 0xFD, 0x14, 0x39, 0x00, 0xAD, 0x0C, 0xDB, 0xFF, 0x2C, 0x03, + 0x2A, 0xFE, 0x9C, 0xFB, 0x00, 0x00, 0x60, 0xF6, 0x82, 0x02, 0xD3, 0xF4, + 0x16, 0x02, 0xEA, 0xF1, 0xB9, 0x01, 0x2D, 0xEF, 0x0A, 0x00, 0xE2, 0xED, + 0x6F, 0xF7, 0xD0, 0xED, 0x73, 0xEC, 0xDC, 0xF3, 0xD0, 0xE7, 0x72, 0xFB, + 0x7F, 0xEC, 0x36, 0xFD, 0xC1, 0xF7, 0x6E, 0xFB, 0x9B, 0x03, 0xCA, 0xFB, + 0x55, 0x0A, 0x3F, 0xFE, 0xD1, 0x0B, 0xC7, 0xFF, 0x08, 0x0A, 0x6D, 0x01, + 0xC0, 0x04, 0x40, 0x02, 0x44, 0xFD, 0x13, 0x03, 0x31, 0xFB, 0x30, 0x02, + 0xF0, 0x00, 0x98, 0xFD, 0x2F, 0x01, 0x73, 0xFC, 0x27, 0xF7, 0x8D, 0x01, + 0xA3, 0xE8, 0x3D, 0x06, 0xA3, 0xDB, 0x82, 0x04, 0x09, 0xDE, 0x88, 0x00, + 0x1B, 0xEA, 0x84, 0xFB, 0xF1, 0xF6, 0x25, 0xF6, 0x56, 0x04, 0xF6, 0xEF, + 0x7B, 0x09, 0x39, 0xE9, 0xF1, 0x05, 0x48, 0xE9, 0x80, 0xF7, 0x77, 0xEB, + 0xCD, 0xE9, 0x94, 0xEB, 0x44, 0xE5, 0x5D, 0xEA, 0xB9, 0xDA, 0xBC, 0xE4, + 0x6D, 0xD8, 0x0A, 0xE6, 0x32, 0xE2, 0x54, 0xEE, 0xFE, 0xE0, 0x3A, 0xEF, + 0xA5, 0xD8, 0x48, 0xEC, 0x92, 0xD0, 0xA1, 0xE9, 0x52, 0xD0, 0xB4, 0xE8, + 0x7B, 0xD7, 0x81, 0xE1, 0x70, 0xDE, 0x9A, 0xD4, 0x0E, 0xE7, 0x0B, 0xD2, + 0xE6, 0xEA, 0x0B, 0xD1, 0x07, 0xEC, 0x37, 0xCE, 0xF4, 0xF0, 0x98, 0xCE, + 0xD0, 0xF5, 0x1E, 0xCB, 0xF2, 0xF6, 0x78, 0xC9, 0xF7, 0xF3, 0x04, 0xCE, + 0x01, 0xF2, 0xDE, 0xD7, 0x6A, 0xF0, 0x32, 0xE1, 0xD2, 0xEE, 0x84, 0xE8, + 0x04, 0xF3, 0x12, 0xF6, 0x4C, 0xF8, 0x9C, 0x02, 0xE9, 0xF6, 0x25, 0x05, + 0xD5, 0xF4, 0xB6, 0x03, 0xCD, 0xF7, 0x25, 0x05, 0x7B, 0xFA, 0x48, 0x07, + 0x86, 0xFA, 0xC7, 0x02, 0xE3, 0xFB, 0xA3, 0xFE, 0xCF, 0xFB, 0x81, 0xFE, + 0x64, 0xF9, 0xE7, 0xF6, 0x59, 0xFB, 0xCF, 0xF3, 0x72, 0xF9, 0x20, 0xF2, + 0x24, 0xEF, 0x00, 0xF4, 0x89, 0xF0, 0x03, 0xFF, 0xF7, 0xFA, 0xD9, 0x03, + 0x8C, 0x02, 0x01, 0x0A, 0xBD, 0x0C, 0x04, 0x0A, 0x60, 0x17, 0x4A, 0x03, + 0x28, 0x1C, 0x98, 0x00, 0x06, 0x16, 0x02, 0x02, 0x58, 0x12, 0x2C, 0x05, + 0x0F, 0x17, 0x7D, 0x02, 0x09, 0x1A, 0xEE, 0x01, 0x5E, 0x1C, 0x47, 0x07, + 0x65, 0x19, 0x8E, 0x05, 0x25, 0x17, 0xED, 0x01, 0x4D, 0x13, 0x90, 0x02, + 0x5D, 0x03, 0x45, 0x06, 0xD9, 0xF6, 0x10, 0x0D, 0x15, 0xF2, 0x4D, 0x14, + 0x06, 0xF1, 0x40, 0x16, 0x46, 0xFF, 0x8F, 0x18, 0x7A, 0x0D, 0x94, 0x1C, + 0x3B, 0x15, 0x37, 0x1E, 0x09, 0x15, 0x77, 0x1A, 0x4E, 0x0D, 0xB3, 0x14, + 0x9A, 0x09, 0xF4, 0x13, 0xBD, 0x0A, 0xB1, 0x16, 0xAB, 0x17, 0x68, 0x22, + 0xE8, 0x1E, 0xF0, 0x2A, 0xBD, 0x16, 0xCB, 0x23, 0x95, 0x0E, 0xB8, 0x1F, + 0x21, 0x08, 0x49, 0x1D, 0xB0, 0x02, 0x4A, 0x14, 0x41, 0x03, 0x94, 0x0A, + 0x28, 0x0B, 0x46, 0x05, 0x6D, 0x1A, 0x1B, 0x08, 0x0D, 0x27, 0x54, 0x0A, + 0x25, 0x25, 0xC6, 0x05, 0x0C, 0x17, 0x92, 0x00, 0xE0, 0x10, 0x5A, 0x07, + 0x6C, 0x15, 0xD9, 0x14, 0x3D, 0x1C, 0x97, 0x20, 0x55, 0x22, 0x29, 0x2D, + 0xED, 0x1A, 0x85, 0x31, 0xAA, 0x11, 0x0C, 0x2C, 0x52, 0x10, 0xE4, 0x26, + 0xC0, 0x0C, 0xE5, 0x23, 0xDE, 0x06, 0x38, 0x1E, 0x23, 0x08, 0x50, 0x1C, + 0x91, 0x0A, 0x99, 0x19, 0xF3, 0x08, 0xF8, 0x11, 0x25, 0x0A, 0x8C, 0x0B, + 0xE7, 0x05, 0x7A, 0x02, 0x73, 0xFB, 0x7D, 0xFD, 0x6D, 0xF9, 0x83, 0xFE, + 0xB8, 0x01, 0x8C, 0xFF, 0x82, 0x0D, 0xCE, 0xFC, 0x31, 0x16, 0x6E, 0xF9, + 0x1A, 0x0F, 0x4F, 0xFB, 0xDB, 0xFF, 0x44, 0xFF, 0x20, 0xF5, 0xEF, 0x04, + 0x10, 0xF3, 0x93, 0x0C, 0xE7, 0xF8, 0x2B, 0x0E, 0x23, 0x01, 0xA6, 0x07, + 0x21, 0x05, 0x67, 0xFC, 0xD2, 0x09, 0xC6, 0xF3, 0xBA, 0x12, 0xBC, 0xF2, + 0x32, 0x17, 0x6D, 0xF3, 0x80, 0x1B, 0x66, 0xFC, 0xB4, 0x20, 0x39, 0x0E, + 0x34, 0x22, 0xAD, 0x17, 0x85, 0x20, 0x3A, 0x1B, 0x5B, 0x1C, 0xA5, 0x1B, + 0x5E, 0x17, 0xFF, 0x19, 0x93, 0x11, 0x97, 0x1B, 0x38, 0x0F, 0xEF, 0x22, + 0xFB, 0x11, 0x18, 0x2A, 0x9F, 0x10, 0xDF, 0x22, 0xD6, 0x11, 0x45, 0x1F, + 0x57, 0x0C, 0xCE, 0x1D, 0x1A, 0x0F, 0xC5, 0x13, 0x6A, 0x16, 0x88, 0x06, + 0x38, 0x16, 0xB8, 0x03, 0xDA, 0x19, 0xF2, 0x0A, 0x78, 0x10, 0xF5, 0x0A, + 0x97, 0x09, 0xB5, 0x0D, 0x99, 0x0E, 0xC7, 0x12, 0x4F, 0x10, 0x98, 0x0F, + 0x3A, 0x0F, 0x0C, 0x05, 0x00, 0x11, 0x2B, 0xFF, 0xBA, 0x11, 0xE1, 0xFE, + 0x7B, 0x12, 0x36, 0x05, 0x23, 0x1C, 0x5F, 0x16, 0x84, 0x1C, 0xA1, 0x16, + 0x2A, 0x1A, 0xED, 0x10, 0xC8, 0x22, 0x08, 0x12, 0xAB, 0x22, 0x20, 0x0D, + 0x3B, 0x1C, 0x4F, 0x0B, 0x1B, 0x22, 0x58, 0x10, 0x8D, 0x21, 0x72, 0x10, + 0xCA, 0x17, 0x5C, 0x11, 0x5C, 0x11, 0x9C, 0x15, 0xE2, 0x11, 0x72, 0x12, + 0x30, 0x17, 0x57, 0x0C, 0xCB, 0x12, 0x2E, 0x0D, 0x0B, 0x04, 0xAE, 0x0E, + 0xBF, 0xF7, 0x6A, 0x0E, 0x8D, 0xEE, 0xF0, 0x0D, 0xE0, 0xE0, 0x5D, 0x07, + 0x90, 0xD3, 0x7C, 0xFD, 0xA9, 0xD8, 0xE0, 0xF8, 0xFD, 0xE5, 0x26, 0xF8, + 0xAE, 0xE9, 0x53, 0xF5, 0x38, 0xEB, 0x3D, 0xF3, 0x5A, 0xE4, 0xF3, 0xEF, + 0xB7, 0xDC, 0xD6, 0xEB, 0xAD, 0xE0, 0x2F, 0xED, 0xF8, 0xEA, 0xB4, 0xF4, + 0xC1, 0xEF, 0x09, 0xFD, 0xBC, 0xEC, 0xCF, 0xFF, 0x04, 0xF1, 0x5D, 0x05, + 0x02, 0xF0, 0xAF, 0x07, 0x04, 0xE0, 0x7A, 0xF7, 0x05, 0xDB, 0x86, 0xE5, + 0xC0, 0xDD, 0xFF, 0xD9, 0xFE, 0xDB, 0xF9, 0xD5, 0xEF, 0xE1, 0x09, 0xDE, + 0x46, 0xE9, 0x4D, 0xDE, 0x36, 0xEA, 0x8E, 0xD6, 0x14, 0xEF, 0x02, 0xD8, + 0x29, 0xF8, 0x46, 0xDB, 0x3A, 0xF3, 0xD7, 0xD4, 0x99, 0xE8, 0x71, 0xD2, + 0xBC, 0xE8, 0x09, 0xD9, 0x8F, 0xE2, 0xA4, 0xD7, 0xD9, 0xDC, 0x40, 0xD4, + 0x61, 0xDC, 0x8F, 0xCC, 0x0D, 0xD7, 0xEB, 0xBC, 0x15, 0xD6, 0x3A, 0xBE, + 0xF3, 0xD7, 0xD3, 0xC8, 0xEC, 0xD2, 0x90, 0xC7, 0x91, 0xD4, 0x55, 0xCF, + 0x0C, 0xD4, 0x9E, 0xD9, 0x35, 0xC9, 0xA3, 0xD3, 0x13, 0xCE, 0xF2, 0xD1, + 0x61, 0xD6, 0x43, 0xD4, 0xB9, 0xE0, 0xCC, 0xD6, 0xA6, 0xF4, 0x5C, 0xE3, + 0xAE, 0xFA, 0x4F, 0xF0, 0xCD, 0xF5, 0x9F, 0xFC, 0x61, 0xED, 0x5A, 0x07, + 0x18, 0xE5, 0xF7, 0x05, 0x2F, 0xE6, 0xBF, 0xFB, 0x74, 0xE9, 0x60, 0xF2, + 0xF2, 0xF0, 0x29, 0xF3, 0x15, 0xF5, 0xA2, 0xF6, 0x8B, 0xF0, 0x40, 0xF8, + 0xA9, 0xF0, 0x86, 0xFB, 0x18, 0xF4, 0x52, 0xFB, 0xFE, 0xFE, 0x90, 0x07, + 0x1F, 0x0B, 0xD2, 0x17, 0x67, 0x0A, 0xBC, 0x10, 0xF6, 0x03, 0x67, 0x08, + 0xE0, 0xFF, 0xB7, 0x0D, 0x39, 0x03, 0x81, 0x13, 0x21, 0x05, 0x63, 0x12, + 0xD1, 0x09, 0x70, 0x0F, 0x9C, 0x12, 0x4E, 0x0A, 0xE5, 0x23, 0x35, 0x0A, + 0x20, 0x36, 0x58, 0x0D, 0x6D, 0x2E, 0xF9, 0x05, 0xCF, 0x23, 0x66, 0x03, + 0x24, 0x22, 0xF3, 0x09, 0x13, 0x1E, 0xCD, 0x11, 0xAE, 0x1C, 0x15, 0x1B, + 0xC1, 0x14, 0x77, 0x1B, 0xA3, 0x0A, 0xE5, 0x17, 0x59, 0x0B, 0x4E, 0x1C, + 0xC3, 0x09, 0x97, 0x1D, 0x11, 0x03, 0xF6, 0x19, 0xE8, 0xF9, 0x34, 0x19, + 0xDA, 0xF3, 0xE6, 0x16, 0x22, 0xFD, 0xD1, 0x13, 0xD9, 0x0E, 0x43, 0x13, + 0x35, 0x0F, 0xE8, 0x0C, 0x72, 0x02, 0x09, 0x00, 0x59, 0x02, 0xBB, 0xFC, + 0xBB, 0x06, 0xFB, 0x00, 0x29, 0x07, 0x31, 0x00, 0xC4, 0x09, 0xF0, 0xFD, + 0xC8, 0x09, 0xBC, 0xFB, 0x85, 0xFC, 0xA8, 0xF0, 0x2B, 0xFC, 0x8A, 0xF4, + 0x74, 0x05, 0xC0, 0xFE, 0xF5, 0x07, 0x9C, 0xFE, 0xA9, 0x13, 0x7B, 0x0D, + 0x08, 0x15, 0xE4, 0x15, 0xD0, 0x02, 0x1B, 0x06, 0x55, 0xF2, 0x6C, 0xF6, + 0xE7, 0xE9, 0xC5, 0xED, 0x5C, 0xE7, 0x5B, 0xE8, 0x05, 0xEE, 0x6F, 0xEF, + 0x14, 0xFB, 0xA4, 0xFE, 0x30, 0x01, 0x67, 0x02, 0x21, 0xFC, 0x8F, 0xFC, + 0x60, 0xFF, 0x21, 0xFF, 0x88, 0xFD, 0x53, 0xFE, 0xD0, 0xF8, 0x45, 0xF7, + 0x02, 0xFD, 0x25, 0xF5, 0x9B, 0xFF, 0xAE, 0xF8, 0x14, 0x01, 0x87, 0xFC, + 0x54, 0xF9, 0xD2, 0xF0, 0x12, 0xF4, 0xAE, 0xE7, 0xD8, 0xEE, 0x16, 0xE7, + 0x13, 0xE5, 0xE6, 0xE0, 0x90, 0xE6, 0x71, 0xDD, 0x5A, 0xEC, 0xDF, 0xE1, + 0x76, 0xED, 0x55, 0xE9, 0x4E, 0xF6, 0x34, 0xED, 0x26, 0xF9, 0x4F, 0xE1, + 0xB3, 0xED, 0xD4, 0xD0, 0x9D, 0xE8, 0xC7, 0xD6, 0x17, 0xE8, 0x92, 0xE6, + 0x79, 0xDE, 0x63, 0xEB, 0x80, 0xE1, 0x9B, 0xF0, 0x42, 0xF2, 0x31, 0xF8, + 0xD9, 0xF7, 0xC0, 0xF8, 0xA7, 0xFA, 0x90, 0xF2, 0x98, 0xF7, 0xC3, 0xE8, + 0xAA, 0xF5, 0xBC, 0xEC, 0x24, 0xF1, 0xEC, 0xF6, 0xA4, 0xEA, 0x07, 0x01, + 0xDD, 0xF3, 0xAA, 0x0C, 0x07, 0xF8, 0x2F, 0x0C, 0xCF, 0xF2, 0x5E, 0x0B, + 0xB8, 0xFB, 0x71, 0x11, 0x3F, 0x12, 0xD0, 0x17, 0x64, 0x1E, 0xAD, 0x18, + 0xB1, 0x1C, 0x77, 0x19, 0x9F, 0x1C, 0xFF, 0x1D, 0x35, 0x20, 0xEB, 0x1B, + 0xC2, 0x28, 0x08, 0x19, 0x1D, 0x2E, 0x73, 0x17, 0xFD, 0x22, 0xEF, 0x13, + 0xAF, 0x1B, 0xDF, 0x13, 0x07, 0x22, 0x6C, 0x1B, 0x14, 0x21, 0xF9, 0x22, + 0x89, 0x16, 0xAF, 0x21, 0x09, 0x17, 0xD8, 0x23, 0x06, 0x1F, 0xA2, 0x27, + 0x15, 0x1A, 0x07, 0x23, 0x22, 0x13, 0xFC, 0x23, 0x48, 0x0C, 0xB1, 0x22, + 0xC1, 0x02, 0x35, 0x19, 0x24, 0x00, 0x72, 0x0F, 0x99, 0x02, 0xC8, 0x02, + 0xBE, 0x03, 0x0A, 0xFC, 0xB3, 0x02, 0x25, 0xFE, 0x46, 0x03, 0x56, 0x07, + 0xB8, 0x01, 0xF2, 0x0D, 0x23, 0x02, 0xFB, 0x0E, 0x15, 0x02, 0xA8, 0x09, + 0x43, 0x02, 0xEE, 0x05, 0xF8, 0xFE, 0xE2, 0x05, 0x96, 0xF4, 0xA2, 0x03, + 0x97, 0xF4, 0x7B, 0x05, 0x14, 0xFC, 0x03, 0x04, 0x6B, 0xF9, 0xCE, 0xFB, + 0x92, 0xFB, 0xA7, 0xF8, 0xF8, 0x09, 0x5B, 0xFC, 0x85, 0x0D, 0x8F, 0x00, + 0x9C, 0x0E, 0x18, 0x0B, 0xD2, 0x0B, 0x30, 0x08, 0xA5, 0x02, 0x25, 0xFA, + 0x49, 0x04, 0x5D, 0xFE, 0x0C, 0xFF, 0x48, 0x01, 0xD1, 0xF0, 0xF0, 0xF6, + 0x39, 0xE9, 0xC0, 0xE9, 0x57, 0xEA, 0x91, 0xE2, 0x5B, 0xF3, 0x93, 0xEB, + 0x41, 0x02, 0x45, 0xFE, 0x1F, 0x0B, 0x34, 0x07, 0xBD, 0x01, 0x4B, 0xFC, + 0xBF, 0xFC, 0x03, 0xF4, 0x5C, 0xF6, 0xEC, 0xEE, 0x01, 0xEF, 0x46, 0xE6, + 0x9D, 0xF9, 0x90, 0xE5, 0xDB, 0xFD, 0x95, 0xE9, 0x99, 0xFD, 0x9F, 0xF5, + 0xC6, 0xF8, 0x43, 0xF9, 0x48, 0xED, 0x31, 0xEB, 0xE0, 0xDF, 0x23, 0xDA, + 0x00, 0xD5, 0xFF, 0xD1, 0xB3, 0xDD, 0xCB, 0xD8, 0x04, 0xE6, 0xCC, 0xE1, + 0x18, 0xF0, 0x88, 0xED, 0xD4, 0xF7, 0xB9, 0xEB, 0x54, 0xF6, 0x52, 0xDF, + 0x21, 0xFE, 0x3E, 0xE1, 0xF2, 0x0A, 0x29, 0xE9, 0x92, 0x12, 0xF6, 0xF7, + 0xC1, 0x0E, 0xF3, 0x0A, 0x43, 0x04, 0x47, 0x12, 0x10, 0xFF, 0x07, 0x12, + 0x58, 0xF8, 0x08, 0x10, 0x3F, 0xF2, 0xD1, 0x0F, 0xEB, 0xEE, 0xA7, 0x0E, + 0x30, 0xE8, 0x16, 0x08, 0x51, 0xF4, 0x18, 0x10, 0x1B, 0x01, 0xD5, 0x17, + 0xD9, 0x01, 0xFB, 0x0A, 0x45, 0x09, 0xE2, 0xFC, 0x35, 0x0D, 0x48, 0xF8, + 0x8B, 0x12, 0x96, 0x01, 0xD1, 0x1D, 0x41, 0x15, 0x32, 0x19, 0x49, 0x21, + 0x46, 0x0F, 0x83, 0x21, 0x48, 0x10, 0xAF, 0x1F, 0x61, 0x10, 0x60, 0x1B, + 0x03, 0x0C, 0x5F, 0x0F, 0x86, 0x07, 0x3C, 0x01, 0x5A, 0x05, 0xF0, 0xFE, + 0x45, 0x04, 0x3A, 0x07, 0x62, 0x02, 0x7F, 0x09, 0x13, 0xFF, 0x08, 0x02, + 0x87, 0xFD, 0x48, 0xF9, 0x44, 0x05, 0xBD, 0xF7, 0xA7, 0x11, 0x7A, 0xFD, + 0x1F, 0x08, 0xFE, 0xF8, 0x71, 0xF9, 0xCD, 0xF6, 0xE3, 0xFB, 0x7B, 0x03, + 0xA4, 0xFA, 0xB2, 0x07, 0x2D, 0xF7, 0xE6, 0x06, 0x84, 0xFE, 0x24, 0x11, + 0x5D, 0x03, 0x8A, 0x17, 0xB4, 0xFE, 0x16, 0x11, 0xDD, 0x00, 0x2A, 0x0E, + 0x2C, 0x01, 0x2F, 0x0A, 0x50, 0xF8, 0x99, 0xFD, 0x92, 0xFB, 0xA1, 0xFA, + 0xF6, 0x0A, 0xFB, 0xFC, 0x45, 0x16, 0x72, 0xF6, 0xA4, 0x15, 0x9A, 0xF0, + 0x6A, 0x10, 0xA7, 0xF8, 0x43, 0x0F, 0x07, 0x04, 0xCE, 0x04, 0x4F, 0x00, + 0xF7, 0xF5, 0xE1, 0xFA, 0x59, 0xF1, 0xD6, 0x01, 0xC0, 0xEB, 0x9F, 0x04, + 0xCD, 0xE8, 0x19, 0xFD, 0xAE, 0xEB, 0xFE, 0xF7, 0xC2, 0xEB, 0x8D, 0xF5, + 0x9B, 0xEA, 0x91, 0xEB, 0x58, 0xEA, 0xFD, 0xE2, 0x20, 0xE9, 0xE5, 0xE8, + 0x58, 0xE9, 0x50, 0xF1, 0x2E, 0xF3, 0x2D, 0xF5, 0x0A, 0x0B, 0x15, 0x03, + 0x34, 0x15, 0xC8, 0x0B, 0xE9, 0x09, 0x11, 0x06, 0xB9, 0x00, 0xC9, 0x09, + 0xA0, 0xF6, 0xDF, 0x12, 0xA5, 0xE6, 0xEC, 0x0B, 0x7A, 0xE2, 0xB0, 0x00, + 0x67, 0xEE, 0x6D, 0x04, 0x73, 0xF3, 0x3A, 0x03, 0xF0, 0xF2, 0x8E, 0xF0, + 0x0F, 0xFA, 0x6D, 0xE1, 0x76, 0xFB, 0x5B, 0xDA, 0x93, 0xFD, 0x3C, 0xDB, + 0x91, 0x0E, 0xEC, 0xEA, 0x66, 0x16, 0x4F, 0xF8, 0x58, 0x10, 0x2D, 0xFC, + 0xB8, 0x10, 0xEF, 0x01, 0xE0, 0x0D, 0xCF, 0xFB, 0x39, 0x01, 0xBB, 0xED, + 0x55, 0xFD, 0x98, 0xF2, 0x87, 0x08, 0x71, 0x00, 0x15, 0x1A, 0x20, 0x0F, + 0x34, 0x21, 0x6B, 0x1D, 0x45, 0x1F, 0xA5, 0x1E, 0x47, 0x1F, 0xE7, 0x15, + 0xBA, 0x1A, 0xB4, 0x0C, 0x8D, 0x16, 0x5B, 0x0D, 0xCC, 0x16, 0x76, 0x1C, + 0xBA, 0x12, 0x98, 0x2A, 0xFA, 0x0F, 0x80, 0x32, 0x23, 0x18, 0x7B, 0x36, + 0x17, 0x19, 0xB5, 0x2D, 0x1C, 0x14, 0x77, 0x23, 0x81, 0x17, 0x81, 0x28, + 0xF6, 0x19, 0x5C, 0x34, 0x16, 0x13, 0xD5, 0x34, 0x64, 0x0C, 0x23, 0x2C, + 0x15, 0x15, 0xF7, 0x27, 0x2E, 0x1E, 0x82, 0x21, 0x62, 0x1A, 0x69, 0x0B, + 0xAF, 0x0E, 0x35, 0xF1, 0xD0, 0xFF, 0x7C, 0xE2, 0x03, 0xFD, 0xD6, 0xE2, + 0xFC, 0x05, 0x9B, 0xED, 0x3C, 0x06, 0x04, 0xEF, 0x3B, 0xFE, 0xB8, 0xE9, + 0x6C, 0xF5, 0x56, 0xE7, 0x2C, 0xEC, 0xCC, 0xE6, 0xB6, 0xE5, 0xEF, 0xEC, + 0xAD, 0xDF, 0xFB, 0xED, 0x7A, 0xDC, 0xB9, 0xE9, 0xCF, 0xEB, 0x4A, 0xEF, + 0x98, 0xFA, 0xD0, 0xEE, 0x69, 0xF9, 0x3B, 0xE0, 0x6F, 0xFA, 0x87, 0xD7, + 0xE1, 0xF3, 0x8A, 0xD7, 0x93, 0xDE, 0x1A, 0xD6, 0xE7, 0xCC, 0xE2, 0xD0, + 0x2C, 0xD4, 0x9A, 0xD2, 0x45, 0xDF, 0x89, 0xDA, 0x89, 0xDB, 0x8E, 0xE0, + 0x4D, 0xDD, 0x5A, 0xE6, 0x1F, 0xE6, 0x68, 0xE9, 0x6B, 0xE6, 0x18, 0xE5, + 0x83, 0xE6, 0x5C, 0xE5, 0x4F, 0xED, 0x4C, 0xEE, 0x95, 0xE5, 0x10, 0xED, + 0x3D, 0xD9, 0xA3, 0xDF, 0xEC, 0xD5, 0x78, 0xD2, 0x95, 0xC9, 0xD0, 0xCA, + 0x6C, 0xB3, 0x98, 0xC6, 0xA6, 0xA2, 0xC0, 0xBF, 0xFA, 0xA9, 0xFD, 0xC7, + 0xA2, 0xC4, 0x5E, 0xDF, 0x9A, 0xD5, 0x2B, 0xE7, 0x07, 0xDC, 0xA9, 0xE7, + 0xC0, 0xE4, 0x5C, 0xF2, 0x13, 0xEC, 0x81, 0xFD, 0x62, 0xEC, 0xF1, 0xFD, + 0xE4, 0xEF, 0x30, 0xFA, 0x4F, 0xF7, 0x3F, 0xF8, 0x34, 0xFF, 0x1A, 0xF6, + 0xDC, 0x06, 0xE8, 0xF0, 0xB4, 0x02, 0x9C, 0xE4, 0xCE, 0xFA, 0xB3, 0xD9, + 0x8D, 0xF9, 0x07, 0xDB, 0x7A, 0xFC, 0xB1, 0xE8, 0x39, 0xFD, 0x8E, 0xF1, + 0xB6, 0xFF, 0x38, 0xED, 0x39, 0x06, 0x6E, 0xEE, 0x86, 0x0A, 0xF1, 0xF8, + 0x9F, 0x0D, 0x6F, 0x04, 0x16, 0x11, 0x7E, 0x10, 0x38, 0x17, 0x46, 0x1B, + 0x64, 0x0F, 0xEC, 0x1B, 0xBD, 0x09, 0x70, 0x1B, 0x49, 0x15, 0x13, 0x23, + 0x4C, 0x1A, 0x8B, 0x25, 0x0E, 0x22, 0x0F, 0x25, 0xCF, 0x2E, 0xF9, 0x28, + 0xDB, 0x33, 0xB0, 0x2D, 0xA4, 0x2B, 0xC5, 0x2B, 0xEE, 0x1A, 0x2C, 0x24, + 0x63, 0x19, 0xC3, 0x25, 0x12, 0x1E, 0x35, 0x2D, 0xC2, 0x19, 0x55, 0x2D, + 0xD0, 0x16, 0x8E, 0x2E, 0x19, 0x1A, 0x49, 0x33, 0x9B, 0x1F, 0x2B, 0x31, + 0xFA, 0x1F, 0xAA, 0x28, 0xA9, 0x20, 0x38, 0x26, 0xA5, 0x21, 0x49, 0x2A, + 0xE8, 0x24, 0xE4, 0x2D, 0x1D, 0x28, 0x2A, 0x2B, 0xAB, 0x2F, 0x8E, 0x25, + 0xD3, 0x39, 0xCF, 0x24, 0x2C, 0x31, 0x21, 0x1E, 0xA1, 0x22, 0x24, 0x16, + 0xEE, 0x1A, 0x1B, 0x14, 0x0E, 0x16, 0x5A, 0x0F, 0xF2, 0x12, 0x1C, 0x0E, + 0x1B, 0x13, 0x90, 0x16, 0x68, 0x10, 0x01, 0x1B, 0xB4, 0x09, 0x08, 0x17, + 0xBE, 0x04, 0x0C, 0x0F, 0x8D, 0x03, 0x7F, 0x03, 0x8E, 0x09, 0x8A, 0x02, + 0x94, 0x13, 0x35, 0x13, 0x5F, 0x1B, 0xED, 0x1D, 0x75, 0x1F, 0x54, 0x16, + 0x6B, 0x19, 0xDB, 0x0C, 0x64, 0x0A, 0xF3, 0x09, 0xF1, 0x01, 0x67, 0x08, + 0x62, 0xFB, 0xCC, 0x02, 0xBA, 0xFA, 0xA0, 0xFE, 0xA2, 0x02, 0xD5, 0xFB, + 0x71, 0x06, 0x40, 0xFB, 0xD9, 0x09, 0xEF, 0xFC, 0xFC, 0x17, 0x1F, 0x03, + 0xDD, 0x1D, 0x2E, 0x07, 0x3F, 0x16, 0x41, 0x08, 0x41, 0x1A, 0xBD, 0x14, + 0x3C, 0x1F, 0xB0, 0x1D, 0x33, 0x17, 0x98, 0x16, 0x33, 0x13, 0x15, 0x0F, + 0x5F, 0x0F, 0x05, 0x0C, 0x88, 0xFF, 0x8B, 0x02, 0x54, 0xF0, 0xA5, 0xF4, + 0x44, 0xEC, 0xD4, 0xF0, 0x8F, 0xF3, 0x04, 0xFC, 0xC2, 0xFD, 0x4E, 0x0B, + 0x45, 0x0F, 0xDF, 0x1C, 0x4E, 0x22, 0xEF, 0x30, 0x1A, 0x27, 0xE0, 0x3A, + 0x25, 0x26, 0xAA, 0x38, 0x7B, 0x24, 0x76, 0x33, 0x11, 0x1F, 0x6D, 0x26, + 0xC7, 0x17, 0x1F, 0x10, 0x03, 0x10, 0xEA, 0xFF, 0x79, 0x07, 0xEA, 0xF7, + 0x9F, 0xF9, 0xA4, 0xEF, 0x33, 0xF0, 0x0C, 0xF0, 0x1A, 0xF2, 0x28, 0xF4, + 0x6C, 0xEE, 0x55, 0xEC, 0xAE, 0xE8, 0xF9, 0xE3, 0xD1, 0xE9, 0x3E, 0xE5, + 0x31, 0xE5, 0x93, 0xE9, 0x39, 0xE0, 0xCD, 0xEF, 0x60, 0xE0, 0xF7, 0xF2, + 0x49, 0xE6, 0xB7, 0xF3, 0x8C, 0xFC, 0xB8, 0xFC, 0xAB, 0x13, 0xB2, 0x04, + 0x78, 0x1B, 0x1D, 0x06, 0x43, 0x1B, 0x5D, 0x07, 0x4C, 0x14, 0xCF, 0x06, + 0xAF, 0x0A, 0xA0, 0x00, 0xB8, 0x02, 0xE4, 0xF9, 0x5B, 0xF9, 0x58, 0xF7, + 0x4A, 0xF3, 0x7D, 0xF6, 0x81, 0xE8, 0xEF, 0xF6, 0xC8, 0xDA, 0x57, 0xFD, + 0x1B, 0xD8, 0x0D, 0x06, 0xD0, 0xDB, 0xF0, 0x06, 0xE1, 0xE3, 0x35, 0x02, + 0x29, 0xF3, 0x9C, 0x00, 0xF0, 0x00, 0x0A, 0x01, 0x24, 0x05, 0xFC, 0xFD, + 0x89, 0xFE, 0xC7, 0xF7, 0xCA, 0xFB, 0x62, 0xF5, 0xF0, 0x01, 0x27, 0xF4, + 0x42, 0x03, 0xAD, 0xF2, 0x22, 0x01, 0x41, 0xF3, 0x54, 0xFF, 0x9C, 0xEB, + 0x7C, 0xF7, 0x2C, 0xDB, 0x88, 0xE7, 0x14, 0xCD, 0x8C, 0xDC, 0x07, 0xC8, + 0x50, 0xDD, 0xDB, 0xCD, 0x87, 0xDE, 0x47, 0xD7, 0xD7, 0xE0, 0x97, 0xDD, + 0xD5, 0xEB, 0xA3, 0xE0, 0x8E, 0xF1, 0x9B, 0xDC, 0xDA, 0xF6, 0xFD, 0xE2, + 0x4F, 0xFB, 0xFA, 0xF1, 0x72, 0xFE, 0xE8, 0xFA, 0x8E, 0x0A, 0x9A, 0x00, + 0x0C, 0x11, 0x38, 0x01, 0xC1, 0x0C, 0xAE, 0xFF, 0x7D, 0x04, 0xA2, 0xFD, + 0x94, 0xF7, 0xF8, 0xF8, 0x6F, 0xE7, 0x0C, 0xF3, 0xEA, 0xDB, 0xA7, 0xF3, + 0x58, 0xD8, 0x98, 0x02, 0xBC, 0xDB, 0x4B, 0x13, 0xAA, 0xEA, 0x5A, 0x18, + 0x93, 0x05, 0xB2, 0x18, 0x62, 0x21, 0xED, 0x1B, 0x0B, 0x2F, 0xE6, 0x1F, + 0x88, 0x29, 0xEA, 0x22, 0xC6, 0x1A, 0x55, 0x22, 0x68, 0x0C, 0x14, 0x1C, + 0xB2, 0xFD, 0x27, 0x10, 0xBE, 0xED, 0xB4, 0xFC, 0x29, 0xDF, 0xCD, 0xE9, + 0xEF, 0xD2, 0x48, 0xDE, 0x0A, 0xC7, 0x28, 0xD8, 0x3B, 0xC7, 0x08, 0xDB, + 0x5B, 0xD9, 0x29, 0xE2, 0x09, 0xFC, 0x30, 0xF3, 0xD3, 0x23, 0x0C, 0x0B, + 0x66, 0x38, 0xFE, 0x18, 0x75, 0x3C, 0x36, 0x25, 0xE9, 0x3C, 0x74, 0x2F, + 0xCE, 0x34, 0xE7, 0x2E, 0xF3, 0x20, 0xC5, 0x24, 0xE0, 0x14, 0x80, 0x17, + 0x37, 0x0C, 0x90, 0x07, 0x46, 0xFB, 0xB9, 0xF4, 0x0C, 0xEE, 0xAE, 0xE8, + 0xCA, 0xD2, 0x85, 0xDB, 0xBC, 0xB6, 0xD2, 0xD0, 0xFC, 0xB4, 0xB8, 0xCC, + 0x38, 0xC1, 0xE6, 0xC9, 0xE4, 0xD2, 0x49, 0xCA, 0xF4, 0xE2, 0x8C, 0xCC, + 0x9F, 0xEF, 0xB4, 0xD2, 0x1F, 0x00, 0x65, 0xDA, 0x03, 0x0E, 0x18, 0xE4, + 0xB2, 0x16, 0x76, 0xF4, 0xA8, 0x1A, 0xEE, 0x03, 0xEB, 0x13, 0xB8, 0x0D, + 0x3B, 0x0D, 0x76, 0x16, 0xBA, 0x05, 0x97, 0x15, 0x08, 0x00, 0xC7, 0x0D, + 0xD7, 0xFC, 0xD6, 0x03, 0xA4, 0xF3, 0x56, 0xFC, 0x64, 0xEA, 0xCF, 0xF9, + 0x60, 0xE7, 0xDB, 0xF6, 0x79, 0xE9, 0xE7, 0xF8, 0xD3, 0xED, 0x2A, 0xFD, + 0xB6, 0xF4, 0xBA, 0xFC, 0xA3, 0xFD, 0xD1, 0xFD, 0x8D, 0x04, 0xB1, 0x01, + 0xBB, 0x06, 0x9A, 0x03, 0x7C, 0x04, 0x55, 0x02, 0x88, 0x01, 0x3E, 0x00, + 0xA1, 0xFC, 0x90, 0xFC, 0x08, 0xFA, 0x73, 0xF5, 0x84, 0xFB, 0x4C, 0xEF, + 0xF9, 0xEB, 0x55, 0xE6, 0xC2, 0xD6, 0x08, 0xDC, 0xFE, 0xD1, 0xCC, 0xD1, + 0x99, 0xD3, 0x5F, 0xC4, 0x33, 0xD9, 0xD1, 0xBD, 0x20, 0xE1, 0xC5, 0xC1, + 0xED, 0xE2, 0x74, 0xCB, 0x69, 0xDE, 0x30, 0xD5, 0xD5, 0xDC, 0x0D, 0xDF, + 0xA5, 0xE2, 0x91, 0xE8, 0x80, 0xEA, 0x96, 0xED, 0x26, 0xEE, 0x95, 0xF2, + 0xBF, 0xEE, 0x1B, 0xFE, 0x57, 0xEE, 0xE7, 0x08, 0x12, 0xEB, 0x8A, 0x07, + 0x06, 0xEA, 0xE1, 0x00, 0xDF, 0xED, 0x0A, 0xF8, 0x95, 0xF4, 0x02, 0xED, + 0xFC, 0xF9, 0x68, 0xE9, 0x67, 0xFC, 0xC2, 0xED, 0xC9, 0x05, 0x77, 0xFA, + 0xC5, 0x15, 0x0B, 0x0D, 0x2B, 0x23, 0xFD, 0x1D, 0x40, 0x2D, 0xB2, 0x2E, + 0xAC, 0x38, 0x13, 0x40, 0x00, 0x41, 0xA2, 0x44, 0x1A, 0x41, 0x3E, 0x3D, + 0x65, 0x3B, 0x97, 0x36, 0x12, 0x2F, 0x1D, 0x2C, 0xE8, 0x1C, 0x86, 0x19, + 0x73, 0x08, 0x18, 0x03, 0xF4, 0xF2, 0xB6, 0xEF, 0x15, 0xE0, 0x7D, 0xE6, + 0x81, 0xDA, 0x91, 0xEC, 0x84, 0xED, 0x18, 0x04, 0x82, 0x14, 0xF2, 0x1F, + 0x51, 0x3B, 0xA1, 0x37, 0x2F, 0x4E, 0xEC, 0x4C, 0xBF, 0x51, 0x2F, 0x5B, + 0xBB, 0x53, 0x97, 0x61, 0x00, 0x51, 0xF9, 0x5E, 0x80, 0x4C, 0xB2, 0x57, + 0xB3, 0x46, 0x7E, 0x50, 0x63, 0x3F, 0x73, 0x43, 0xE9, 0x34, 0x61, 0x2B, + 0x23, 0x20, 0x44, 0x12, 0x5F, 0x08, 0xFF, 0xFB, 0x34, 0xF8, 0x0F, 0xE9, + 0x2E, 0xF0, 0x6F, 0xE4, 0x8C, 0xF3, 0xBB, 0xE8, 0xB5, 0x03, 0x33, 0xF0, + 0xE0, 0x15, 0xE4, 0x00, 0x88, 0x23, 0xDD, 0x14, 0xAD, 0x2F, 0x63, 0x28, + 0x4C, 0x36, 0xBD, 0x37, 0x13, 0x37, 0x59, 0x41, 0xC1, 0x38, 0x7E, 0x4A, + 0x99, 0x3E, 0x62, 0x49, 0x00, 0x49, 0x9B, 0x3E, 0xD3, 0x46, 0x0A, 0x32, + 0x36, 0x32, 0xC4, 0x21, 0x70, 0x1B, 0xE8, 0x0E, 0x91, 0x09, 0x06, 0xFC, + 0x93, 0xFF, 0xF8, 0xF0, 0x63, 0xFA, 0x4E, 0xEF, 0x5A, 0xFB, 0x9D, 0xF6, + 0x92, 0xFD, 0xAF, 0x02, 0x77, 0xF6, 0x06, 0x07, 0x3D, 0xF2, 0xBC, 0x05, + 0x6B, 0xF4, 0x1B, 0x0B, 0xB6, 0xF3, 0x40, 0x16, 0x56, 0xF3, 0xC1, 0x18, + 0x33, 0xF7, 0xE8, 0x13, 0x45, 0xF8, 0xC1, 0x0A, 0x5F, 0xF2, 0xC4, 0xF8, + 0x8B, 0xEB, 0xEA, 0xE7, 0x51, 0xE2, 0xF4, 0xD5, 0x94, 0xD8, 0x87, 0xC4, + 0xD7, 0xDA, 0x5C, 0xC3, 0x0F, 0xDF, 0x23, 0xC3, 0x26, 0xDC, 0x60, 0xC2, + 0x78, 0xD9, 0xA7, 0xCF, 0xB5, 0xD3, 0x7D, 0xD8, 0xEF, 0xD1, 0xA8, 0xDA, + 0x27, 0xD7, 0xD7, 0xDE, 0x60, 0xD9, 0xD0, 0xDB, 0x54, 0xDB, 0x59, 0xD6, + 0x86, 0xDC, 0x57, 0xD5, 0xD3, 0xDE, 0x13, 0xD6, 0x9E, 0xE4, 0x68, 0xD7, + 0x83, 0xE1, 0x0D, 0xD3, 0xA4, 0xD4, 0xD3, 0xC8, 0xF1, 0xCE, 0x47, 0xC5, + 0x11, 0xD4, 0xD3, 0xCA, 0x2D, 0xD3, 0x8F, 0xCF, 0x90, 0xC9, 0x55, 0xD2, + 0x79, 0xC5, 0xD5, 0xD7, 0x3A, 0xCD, 0xB5, 0xDD, 0x92, 0xDB, 0x52, 0xE2, + 0x18, 0xE9, 0xFD, 0xE8, 0x15, 0xFA, 0x9E, 0xF3, 0x56, 0x06, 0x98, 0xFA, + 0x82, 0x01, 0x6E, 0xF9, 0xBC, 0xF4, 0xDC, 0xF4, 0x7E, 0xE3, 0x66, 0xE8, + 0x8F, 0xD2, 0x54, 0xD3, 0x64, 0xC7, 0x9D, 0xC0, 0xC9, 0xBA, 0x95, 0xB7, + 0x9F, 0xAB, 0xBD, 0xB6, 0x7A, 0xA3, 0x01, 0xBA, 0x83, 0xA6, 0x26, 0xBC, + 0x59, 0xB4, 0x71, 0xC2, 0xE0, 0xC9, 0xF5, 0xD7, 0x3A, 0xE3, 0x8A, 0xF4, + 0xFF, 0xFF, 0xAD, 0x0A, 0x81, 0x1D, 0x1A, 0x1D, 0x8F, 0x2D, 0x34, 0x28, + 0xD3, 0x24, 0xFC, 0x22, 0x35, 0x18, 0x13, 0x14, 0xD8, 0x11, 0xA4, 0xFB, + 0x65, 0x05, 0x94, 0xE0, 0xC6, 0xF8, 0x77, 0xD1, 0x19, 0xEF, 0xA5, 0xCC, + 0x97, 0xE3, 0x95, 0xD0, 0x15, 0xD6, 0xB4, 0xD1, 0xF9, 0xC9, 0xA4, 0xCB, + 0x0E, 0xC2, 0xB8, 0xCD, 0x7F, 0xC2, 0x5F, 0xD6, 0x39, 0xD6, 0x14, 0xE4, + 0x50, 0xF0, 0x0E, 0xF4, 0x50, 0x05, 0xC3, 0xFE, 0x98, 0x18, 0x15, 0x07, + 0xD5, 0x21, 0x3A, 0x0D, 0x52, 0x20, 0xBB, 0x12, 0x42, 0x1E, 0xD1, 0x1B, + 0x8B, 0x21, 0x92, 0x22, 0xA5, 0x28, 0xC6, 0x26, 0x50, 0x2B, 0xA1, 0x2C, + 0x9E, 0x1E, 0xBE, 0x29, 0x93, 0x0B, 0x07, 0x20, 0x6B, 0x00, 0x2B, 0x16, + 0x15, 0xF8, 0xC7, 0x0A, 0xE3, 0xF4, 0xCD, 0x07, 0x74, 0xFE, 0xC3, 0x0C, + 0x1B, 0x08, 0x43, 0x0F, 0x8A, 0x06, 0xD8, 0x13, 0x92, 0x04, 0xAC, 0x1A, + 0xF4, 0x05, 0x57, 0x1A, 0xA8, 0x02, 0xD5, 0x12, 0x5F, 0x01, 0x9C, 0x0C, + 0xA8, 0x03, 0x1A, 0x0E, 0xE2, 0x01, 0x5F, 0x10, 0xF3, 0x01, 0x6E, 0x0E, + 0xD7, 0x03, 0xEF, 0x0B, 0x3A, 0x02, 0xB7, 0x08, 0x23, 0xFF, 0xD0, 0x05, + 0x74, 0xFD, 0xA3, 0x02, 0x38, 0x01, 0xFD, 0xFD, 0x83, 0x09, 0xCD, 0xFC, + 0xBB, 0x0D, 0xE0, 0xFC, 0xFB, 0x0C, 0x22, 0xFA, 0x23, 0x0C, 0xF4, 0xF8, + 0xB5, 0x07, 0x67, 0xF8, 0xAF, 0x06, 0xA1, 0xFC, 0x1B, 0x10, 0xCD, 0x0B, + 0xE5, 0x19, 0x5E, 0x19, 0xFA, 0x21, 0x6A, 0x1D, 0x1B, 0x29, 0xB4, 0x1F, + 0x60, 0x28, 0x0F, 0x20, 0x8C, 0x23, 0x72, 0x1D, 0x4D, 0x1F, 0xB6, 0x20, + 0x5F, 0x17, 0xD2, 0x28, 0x05, 0x11, 0xEB, 0x2A, 0x9C, 0x13, 0xED, 0x2A, + 0xB1, 0x19, 0x14, 0x31, 0xD7, 0x1B, 0x4B, 0x34, 0xC4, 0x1E, 0x60, 0x2E, + 0xB3, 0x2A, 0xD5, 0x27, 0x19, 0x3B, 0xD1, 0x29, 0x82, 0x45, 0x98, 0x2E, + 0x8A, 0x47, 0x89, 0x2E, 0xE4, 0x42, 0xB9, 0x2A, 0x1C, 0x39, 0x4E, 0x23, + 0xA4, 0x2A, 0xC6, 0x18, 0x9D, 0x18, 0x98, 0x0D, 0x2C, 0x01, 0x3E, 0x04, + 0x6D, 0xEE, 0x33, 0xFF, 0x3E, 0xEF, 0xFC, 0xFF, 0x4A, 0xFF, 0xF3, 0x08, + 0x9C, 0x1A, 0x96, 0x1B, 0x1B, 0x3B, 0x8B, 0x34, 0x3D, 0x51, 0x7B, 0x47, + 0x46, 0x59, 0x3E, 0x52, 0x6E, 0x5D, 0xFD, 0x5A, 0x15, 0x5F, 0x7B, 0x58, + 0xF6, 0x55, 0xB9, 0x4B, 0x0F, 0x49, 0xEE, 0x3E, 0xB8, 0x3F, 0x0D, 0x33, + 0x08, 0x33, 0x79, 0x24, 0x42, 0x26, 0xA9, 0x12, 0x83, 0x18, 0xA5, 0xFE, + 0xC4, 0x06, 0xAF, 0xEA, 0x58, 0xF7, 0xB2, 0xDE, 0xF9, 0xEC, 0x1E, 0xDD, + 0x55, 0xEB, 0xCA, 0xE0, 0x8B, 0xEF, 0xC6, 0xE2, 0x1F, 0xF6, 0x8F, 0xE9, + 0x73, 0xFE, 0x49, 0xFA, 0x39, 0x04, 0xA3, 0x05, 0x42, 0x0A, 0xDE, 0x08, + 0x80, 0x14, 0xC5, 0x0C, 0x51, 0x19, 0xF3, 0x0F, 0x3D, 0x17, 0xB1, 0x11, + 0xF1, 0x17, 0x41, 0x0D, 0x19, 0x15, 0x20, 0x00, 0xA7, 0x09, 0x49, 0xF5, + 0xEE, 0xF5, 0xC9, 0xF0, 0x56, 0xD6, 0x9B, 0xEA, 0x77, 0xC0, 0x8B, 0xE6, + 0x31, 0xBD, 0x4A, 0xE4, 0x6B, 0xBB, 0x02, 0xE2, 0x04, 0xBD, 0x7E, 0xE6, + 0xC5, 0xC4, 0x84, 0xE9, 0x60, 0xC9, 0xE0, 0xE6, 0xBF, 0xC9, 0xA7, 0xE5, + 0xF5, 0xCA, 0x59, 0xE8, 0xC9, 0xCF, 0x5A, 0xF0, 0xAC, 0xD7, 0x62, 0xF9, + 0xD6, 0xDA, 0x1D, 0xFF, 0x99, 0xD8, 0xD8, 0xFD, 0x95, 0xDA, 0xC5, 0xEE, + 0x03, 0xDD, 0x78, 0xD4, 0x95, 0xDA, 0xC6, 0xBB, 0xBF, 0xD1, 0xD4, 0xAB, + 0xAF, 0xC6, 0xD0, 0xA7, 0x71, 0xBD, 0xB3, 0xA7, 0xCB, 0xB7, 0x83, 0xA9, + 0x49, 0xBB, 0xD2, 0xB2, 0xAC, 0xC7, 0xA6, 0xBA, 0xA1, 0xD6, 0x90, 0xC0, + 0x1A, 0xDF, 0x19, 0xCB, 0xC5, 0xE1, 0x69, 0xD7, 0x9A, 0xE1, 0x0C, 0xE4, + 0x2E, 0xDB, 0x01, 0xEE, 0x39, 0xDD, 0x66, 0xF1, 0xA2, 0xE5, 0x36, 0xEC, + 0x76, 0xE4, 0xD3, 0xE7, 0x17, 0xE4, 0x5B, 0xE8, 0x9E, 0xE4, 0x4C, 0xE1, + 0x55, 0xDD, 0xB9, 0xD7, 0x85, 0xDC, 0xBA, 0xDA, 0xDF, 0xE8, 0x6E, 0xE4, + 0x7B, 0xF4, 0x74, 0xED, 0x7F, 0xFD, 0x19, 0x02, 0x6C, 0x09, 0x74, 0x1F, + 0x63, 0x19, 0x85, 0x30, 0x1A, 0x29, 0x04, 0x32, 0x01, 0x34, 0x37, 0x2F, + 0x3D, 0x37, 0x1B, 0x2B, 0x37, 0x2C, 0x32, 0x22, 0xE8, 0x13, 0x7E, 0x12, + 0xCA, 0xF5, 0xA9, 0xFD, 0xA3, 0xD9, 0x75, 0xE9, 0xD0, 0xCA, 0xAA, 0xDD, + 0xCD, 0xCB, 0x29, 0xDD, 0x4F, 0xDE, 0x11, 0xEB, 0x43, 0xFC, 0xDA, 0x02, + 0x69, 0x18, 0x90, 0x17, 0xB8, 0x2F, 0xC2, 0x26, 0xDD, 0x3B, 0xD6, 0x2D, + 0xF5, 0x3E, 0x0D, 0x2E, 0x9A, 0x39, 0x03, 0x2A, 0x43, 0x34, 0x8C, 0x24, + 0x96, 0x38, 0x99, 0x20, 0x36, 0x31, 0x4C, 0x14, 0x95, 0x1B, 0x57, 0x04, + 0x35, 0x03, 0x75, 0xF8, 0xF7, 0xE6, 0xD9, 0xE5, 0xC9, 0xCE, 0x39, 0xD2, + 0xFA, 0xC6, 0xC8, 0xC9, 0xEC, 0xD0, 0x4A, 0xC7, 0xE4, 0xE1, 0x3D, 0xCC, + 0x68, 0xEF, 0x58, 0xDC, 0xEE, 0xF3, 0x01, 0xF2, 0x30, 0xF5, 0x11, 0x06, + 0xCC, 0xFB, 0x20, 0x11, 0x85, 0x08, 0xF7, 0x18, 0xE7, 0x1A, 0xE5, 0x25, + 0x1F, 0x2B, 0x74, 0x2D, 0xD3, 0x34, 0x63, 0x25, 0x0B, 0x36, 0x5B, 0x18, + 0x6B, 0x23, 0xA2, 0x0F, 0x0C, 0x07, 0x2F, 0x09, 0x57, 0xF6, 0x1F, 0x00, + 0x97, 0xF2, 0xD9, 0xF2, 0x75, 0xF3, 0xB5, 0xEC, 0x9F, 0xF1, 0xFF, 0xF1, + 0x29, 0xED, 0xCF, 0xFD, 0x3B, 0xE7, 0xC7, 0x05, 0x1E, 0xE2, 0x9B, 0x02, + 0x32, 0xE7, 0x4F, 0x02, 0xD3, 0xF4, 0x32, 0x07, 0x4C, 0x04, 0x83, 0x09, + 0x73, 0x14, 0xCC, 0x0A, 0x72, 0x1C, 0xEB, 0x07, 0xA9, 0x11, 0x18, 0xFD, + 0xEB, 0xFD, 0xEC, 0xEF, 0x49, 0xEE, 0x22, 0xE1, 0x51, 0xE6, 0xB4, 0xD4, + 0x7F, 0xE2, 0x13, 0xD4, 0xA4, 0xE2, 0xA2, 0xDC, 0x7F, 0xEA, 0x78, 0xEA, + 0x72, 0xE9, 0xC8, 0xF5, 0x60, 0xE0, 0x16, 0xFA, 0x11, 0xDE, 0xC4, 0xF7, + 0xAC, 0xE6, 0x8D, 0xF4, 0xE3, 0xF2, 0xB2, 0xF6, 0x02, 0xF8, 0x02, 0xFD, + 0x33, 0xFA, 0x04, 0x02, 0x16, 0xFD, 0x49, 0x00, 0x11, 0xFC, 0x3B, 0xF7, + 0xFA, 0xF1, 0x2B, 0xEA, 0x67, 0xE5, 0xD7, 0xDB, 0x9A, 0xDF, 0x4C, 0xD2, + 0x44, 0xDE, 0xE9, 0xD6, 0x53, 0xDF, 0x46, 0xE3, 0x2F, 0xE3, 0xD5, 0xE7, + 0xE4, 0xEC, 0xEF, 0xEF, 0xBE, 0xF5, 0x64, 0xFE, 0xB9, 0xFE, 0x63, 0x02, + 0x34, 0x12, 0x37, 0x07, 0x05, 0x2E, 0x68, 0x1A, 0x73, 0x45, 0x79, 0x29, + 0xD7, 0x4D, 0x2F, 0x2C, 0xE5, 0x40, 0xD1, 0x27, 0x8B, 0x24, 0x44, 0x12, + 0x64, 0x0A, 0xD8, 0xF1, 0x35, 0xEF, 0x8A, 0xDA, 0xFB, 0xD8, 0xBC, 0xD5, + 0x31, 0xD2, 0xE9, 0xDB, 0x85, 0xD6, 0x67, 0xE7, 0xED, 0xE2, 0xCC, 0xFA, + 0x55, 0xF4, 0xBE, 0x14, 0xEC, 0x08, 0xD9, 0x2E, 0x17, 0x21, 0x41, 0x44, + 0xC2, 0x39, 0x0E, 0x55, 0x6E, 0x4F, 0x3A, 0x60, 0xD4, 0x5C, 0x4B, 0x64, + 0x8B, 0x57, 0xDD, 0x5B, 0x30, 0x3E, 0x6D, 0x44, 0x60, 0x28, 0xF8, 0x2A, + 0x9C, 0x24, 0x52, 0x17, 0x28, 0x22, 0x56, 0x0A, 0xE7, 0x15, 0x8E, 0x05, + 0x0F, 0x03, 0x94, 0x09, 0xB3, 0xEC, 0xC7, 0x0D, 0x61, 0xE7, 0x01, 0x11, + 0x0E, 0xF7, 0x10, 0x10, 0x58, 0x02, 0xAE, 0x08, 0x69, 0x13, 0x77, 0x16, + 0x15, 0x29, 0x90, 0x28, 0x39, 0x35, 0xBC, 0x2C, 0x76, 0x3F, 0x5C, 0x38, + 0xC1, 0x42, 0x14, 0x40, 0x2B, 0x3F, 0xB3, 0x34, 0x2D, 0x41, 0xED, 0x28, + 0xD4, 0x47, 0x61, 0x2B, 0x77, 0x45, 0xCA, 0x33, 0xFA, 0x35, 0x16, 0x34, + 0x55, 0x26, 0x0E, 0x30, 0x6B, 0x19, 0x6F, 0x2A, 0x39, 0x11, 0x43, 0x22, + 0xC1, 0x0E, 0x1F, 0x1F, 0x3A, 0x12, 0x44, 0x22, 0xF6, 0x16, 0xEB, 0x20, + 0x6A, 0x10, 0xA5, 0x18, 0x14, 0x07, 0xF3, 0x18, 0x22, 0xFF, 0x40, 0x14, + 0x74, 0xF8, 0x80, 0xFF, 0xA0, 0xF7, 0x35, 0xF3, 0xDB, 0xF7, 0x28, 0xF7, + 0x44, 0xF6, 0xC5, 0xFB, 0x7D, 0xF4, 0x5D, 0xF7, 0xE0, 0xEF, 0x78, 0xEA, + 0x3E, 0xEA, 0x6A, 0xDE, 0x82, 0xEA, 0xDE, 0xD9, 0xFA, 0xEA, 0x41, 0xD4, + 0xB1, 0xEC, 0x84, 0xCF, 0x8B, 0xEF, 0xA8, 0xCB, 0x50, 0xED, 0xFF, 0xC7, + 0x3E, 0xED, 0xF4, 0xCE, 0xA4, 0xEB, 0xB2, 0xD9, 0xED, 0xE4, 0x68, 0xD9, + 0x2E, 0xE4, 0xA9, 0xCF, 0xF5, 0xEA, 0xAD, 0xCA, 0xDA, 0xF0, 0x95, 0xCE, + 0x74, 0xEE, 0x40, 0xD2, 0xE9, 0xEA, 0x43, 0xD7, 0xD1, 0xE0, 0xC1, 0xD8, + 0x42, 0xCF, 0xEB, 0xD1, 0x8A, 0xCA, 0x56, 0xD4, 0xE7, 0xC7, 0x19, 0xD8, + 0xF0, 0xC3, 0x9D, 0xD5, 0x40, 0xCF, 0x52, 0xE0, 0x4F, 0xDB, 0x02, 0xEA, + 0x8A, 0xDF, 0x29, 0xEB, 0xED, 0xE4, 0x6B, 0xF0, 0xD0, 0xE4, 0xAB, 0xEB, + 0x7F, 0xE4, 0x3C, 0xE2, 0xB0, 0xEB, 0x62, 0xE3, 0xF8, 0xEC, 0x44, 0xE4, + 0x55, 0xE3, 0xD4, 0xDB, 0x6B, 0xD4, 0xC6, 0xD0, 0xDF, 0xC1, 0xC8, 0xC6, + 0xDE, 0xB2, 0x14, 0xBB, 0xD2, 0xAA, 0x29, 0xAE, 0x06, 0xAA, 0xBD, 0xAA, + 0xFB, 0xAE, 0xAE, 0xB9, 0x56, 0xC2, 0x0E, 0xD6, 0xD5, 0xE6, 0x65, 0xF3, + 0x94, 0xFF, 0xB2, 0x02, 0x00, 0x0A, 0x62, 0x09, 0xBE, 0x16, 0x63, 0x16, + 0x90, 0x21, 0xA0, 0x25, 0x44, 0x24, 0xC7, 0x2E, 0x3B, 0x1A, 0xF1, 0x2A, + 0x0B, 0x03, 0x4B, 0x16, 0x6D, 0xEE, 0x37, 0xFF, 0x18, 0xE4, 0x43, 0xEF, + 0xC8, 0xD7, 0xF1, 0xE0, 0x72, 0xD1, 0x6F, 0xD9, 0xD6, 0xD6, 0x13, 0xD7, + 0x3B, 0xE0, 0xD2, 0xDA, 0xAF, 0xF0, 0x31, 0xF1, 0x4B, 0xF9, 0x2B, 0x03, + 0xBC, 0xF6, 0xAF, 0xFD, 0x4C, 0x01, 0x47, 0x01, 0x8A, 0x0E, 0x20, 0x0F, + 0xBB, 0x0E, 0x86, 0x14, 0x34, 0x0A, 0xFD, 0x18, 0x7F, 0x07, 0x2F, 0x15, + 0xD5, 0x10, 0xCC, 0x0F, 0x87, 0x1B, 0xEC, 0x0D, 0xCC, 0x1B, 0x1B, 0x0A, + 0x51, 0x19, 0x31, 0x05, 0xF2, 0x12, 0xFA, 0xFD, 0x15, 0x0A, 0x12, 0xFC, + 0xAE, 0x0B, 0x03, 0x09, 0xC1, 0x11, 0x46, 0x1C, 0x9C, 0x08, 0x2F, 0x1B, + 0x5D, 0xF7, 0xBB, 0x0F, 0x69, 0xEF, 0x80, 0x11, 0x47, 0xF1, 0x65, 0x13, + 0x26, 0xF5, 0xFE, 0x08, 0x75, 0xFD, 0x9D, 0x00, 0x62, 0xFF, 0xA4, 0xFA, + 0x65, 0xF7, 0x03, 0xF5, 0x5B, 0xF8, 0x33, 0xFE, 0x08, 0xF7, 0x87, 0x08, + 0xBC, 0xEF, 0xF9, 0x06, 0x87, 0xF6, 0xD5, 0x05, 0x54, 0x02, 0xEF, 0x00, + 0xB0, 0x09, 0xAD, 0xF8, 0x75, 0x07, 0x23, 0xF0, 0xDC, 0xFA, 0x56, 0xE7, + 0xFB, 0xED, 0xB6, 0xE5, 0x0C, 0xED, 0x04, 0xEB, 0x80, 0xF4, 0x1C, 0xEF, + 0x7D, 0xFA, 0xDD, 0xEB, 0xDE, 0x06, 0x37, 0xED, 0x7A, 0x0C, 0x5B, 0xF3, + 0x3E, 0x0A, 0xA3, 0xFE, 0xED, 0x03, 0xF8, 0x06, 0xC5, 0x00, 0x6C, 0x01, + 0x3B, 0x08, 0x1F, 0xFB, 0x2F, 0x08, 0x33, 0xF4, 0xED, 0x03, 0x3B, 0xED, + 0x21, 0x0B, 0x4C, 0xEF, 0x10, 0x0F, 0x92, 0xEF, 0xF7, 0x06, 0xC3, 0xEE, + 0x73, 0x02, 0xE6, 0xF9, 0x53, 0x01, 0x68, 0x05, 0x90, 0x0B, 0x44, 0x0C, + 0xBA, 0x1A, 0xFA, 0x0E, 0x7C, 0x16, 0xA9, 0x08, 0x44, 0x11, 0x55, 0x05, + 0xF1, 0x16, 0xA5, 0x08, 0xC1, 0x12, 0x1D, 0x05, 0x1B, 0x01, 0x38, 0xF6, + 0xA2, 0xF8, 0x86, 0xF2, 0x10, 0xF4, 0x9D, 0xF6, 0x0F, 0xF0, 0x17, 0xFC, + 0x54, 0xF3, 0x44, 0x09, 0xBB, 0xF9, 0x0A, 0x18, 0xBC, 0x0A, 0x4D, 0x28, + 0xCE, 0x1E, 0x91, 0x2E, 0x8C, 0x31, 0x98, 0x36, 0x9C, 0x40, 0x55, 0x47, + 0xA6, 0x40, 0x6A, 0x4D, 0x32, 0x3E, 0x07, 0x4D, 0xB0, 0x40, 0x28, 0x50, + 0xCD, 0x42, 0x53, 0x55, 0x38, 0x3E, 0x8B, 0x4E, 0xF4, 0x34, 0x37, 0x3C, + 0x77, 0x33, 0x26, 0x2D, 0xBE, 0x2D, 0x14, 0x1F, 0xEE, 0x1E, 0xEF, 0x12, + 0xAE, 0x10, 0x4D, 0x0E, 0x70, 0x07, 0xC6, 0x0E, 0xB3, 0x09, 0x94, 0x0E, + 0x58, 0x16, 0xA3, 0x0E, 0x36, 0x1B, 0xDD, 0x0A, 0x4F, 0x1E, 0x89, 0x0D, + 0x57, 0x22, 0xC9, 0x17, 0xB9, 0x15, 0x0E, 0x1A, 0x1B, 0x0E, 0xD5, 0x1F, + 0x47, 0x16, 0x79, 0x27, 0x68, 0x18, 0x2D, 0x26, 0x69, 0x16, 0xA6, 0x24, + 0x34, 0x13, 0x96, 0x1A, 0x40, 0x09, 0x1A, 0x03, 0x3A, 0x05, 0x44, 0xF4, + 0x5A, 0x0B, 0xBE, 0xF8, 0xD3, 0x0A, 0xC5, 0xFC, 0xA9, 0x06, 0xCD, 0xF8, + 0x7F, 0x04, 0x52, 0xFB, 0x14, 0xF6, 0x0C, 0x01, 0xAC, 0xE5, 0x0C, 0x06, + 0x17, 0xDA, 0x22, 0x07, 0xB3, 0xCF, 0x52, 0x07, 0x9B, 0xD0, 0xF0, 0x04, + 0x26, 0xDC, 0x8E, 0xFA, 0x77, 0xE5, 0xC1, 0xF2, 0x1D, 0xF2, 0x25, 0xF7, + 0x5A, 0xFF, 0xC4, 0xF8, 0x05, 0x05, 0xAC, 0xF1, 0xF6, 0x03, 0x15, 0xEA, + 0xEE, 0xF6, 0x07, 0xDB, 0xAA, 0xEF, 0x70, 0xD1, 0x46, 0xFB, 0x58, 0xD9, + 0xDB, 0xFD, 0x2D, 0xDA, 0xF5, 0xF0, 0xE8, 0xD3, 0x3F, 0xE7, 0x12, 0xD9, + 0x51, 0xE0, 0x94, 0xE0, 0x4D, 0xDF, 0x4B, 0xE3, 0x71, 0xEC, 0x36, 0xEB, + 0x39, 0xF9, 0x24, 0xF1, 0x63, 0x01, 0x9B, 0xF1, 0x98, 0x0A, 0x3A, 0xF7, + 0xA4, 0x04, 0xA3, 0xF1, 0x87, 0xF7, 0x9A, 0xE4, 0x01, 0xED, 0x1D, 0xDE, + 0x35, 0xE8, 0x1E, 0xDD, 0x54, 0xF0, 0x3E, 0xE3, 0x03, 0xF1, 0x5F, 0xE9, + 0x05, 0xE8, 0x0D, 0xF2, 0x59, 0xE0, 0x0E, 0xFB, 0xEC, 0xE2, 0x78, 0x02, + 0x5D, 0xE9, 0x02, 0x06, 0x1E, 0xEE, 0xE6, 0x0C, 0x85, 0xFC, 0xAF, 0x1A, + 0xC1, 0x01, 0x7E, 0x11, 0x93, 0x09, 0x72, 0x08, 0x70, 0x10, 0x44, 0x08, + 0x3A, 0xFF, 0xC5, 0xF8, 0x68, 0xED, 0x81, 0xE5, 0x19, 0xE7, 0x7E, 0xD4, + 0x2E, 0xE4, 0xA3, 0xCB, 0xDF, 0xE7, 0xA1, 0xD5, 0x38, 0xF4, 0x29, 0xEF, + 0x9E, 0xF6, 0xA6, 0x06, 0xBB, 0xF2, 0xD5, 0x10, 0x82, 0x01, 0x9B, 0x1E, + 0x4D, 0x1D, 0x64, 0x3A, 0xBC, 0x2B, 0x9F, 0x47, 0x36, 0x2E, 0x86, 0x3F, + 0xC0, 0x2C, 0xB9, 0x35, 0xFD, 0x24, 0x06, 0x28, 0xFF, 0x1D, 0xD4, 0x15, + 0xBF, 0x16, 0x2B, 0x03, 0xF9, 0x05, 0xD8, 0xEB, 0x08, 0xF4, 0x7F, 0xDB, + 0xE2, 0xEB, 0x4D, 0xDA, 0x97, 0xE7, 0x9A, 0xE1, 0x0C, 0xDA, 0xD6, 0xE5, + 0x2C, 0xD1, 0x14, 0xE9, 0x18, 0xDD, 0xE1, 0xF0, 0x07, 0xE9, 0x0C, 0xF7, + 0x77, 0xED, 0x4A, 0xFF, 0xF0, 0xF0, 0xD9, 0x06, 0x2E, 0xEF, 0x76, 0x06, + 0xC8, 0xF4, 0x4E, 0x08, 0xCC, 0xFE, 0x00, 0x06, 0xFC, 0xF9, 0x83, 0xEE, + 0x83, 0xF8, 0x29, 0xDD, 0x97, 0x01, 0x08, 0xDE, 0xF1, 0x00, 0x96, 0xD9, + 0xC4, 0xFB, 0xDA, 0xD9, 0x94, 0xF9, 0x3E, 0xE6, 0xE6, 0xF1, 0xB0, 0xEB, + 0x1C, 0xF0, 0xF6, 0xF3, 0x3C, 0xF8, 0xFA, 0x04, 0x06, 0xFB, 0xB9, 0x09, + 0x93, 0xFE, 0x46, 0x0B, 0x88, 0x05, 0xB6, 0x0E, 0x77, 0x04, 0x50, 0x09, + 0x27, 0xFF, 0x9A, 0x04, 0xFF, 0xF3, 0x6C, 0xFC, 0x8A, 0xEB, 0xF2, 0xF2, + 0xBF, 0xE9, 0x0E, 0xEF, 0xA6, 0xE6, 0x54, 0xE9, 0x04, 0xE5, 0xB8, 0xE1, + 0x73, 0xE3, 0x85, 0xDC, 0xED, 0xDA, 0x38, 0xD5, 0xE8, 0xD3, 0xE6, 0xCC, + 0xD0, 0xDA, 0xEA, 0xCA, 0xA5, 0xE2, 0x83, 0xCC, 0xD9, 0xEB, 0xEB, 0xD5, + 0xB8, 0xF5, 0x9E, 0xE1, 0x8F, 0xF2, 0xD3, 0xE1, 0x70, 0xEC, 0x76, 0xDC, + 0x7C, 0xEB, 0xDA, 0xDC, 0x1F, 0xEB, 0xAB, 0xE1, 0x9B, 0xE7, 0x40, 0xDD, + 0x6B, 0xEC, 0x3E, 0xD7, 0xB3, 0xF6, 0xED, 0xDF, 0xA0, 0xF0, 0x9C, 0xE9, + 0xEE, 0xE2, 0x73, 0xEC, 0xCA, 0xE0, 0xA9, 0xF2, 0x0B, 0xE8, 0xA2, 0xFA, + 0x43, 0xF1, 0x4A, 0x02, 0x80, 0xFB, 0xA5, 0x10, 0x9A, 0x02, 0x25, 0x1C, + 0xEA, 0x03, 0x04, 0x1A, 0x63, 0x04, 0x44, 0x19, 0x74, 0x03, 0x79, 0x17, + 0x81, 0xFF, 0x62, 0x07, 0x94, 0x07, 0x27, 0xFE, 0xA7, 0x14, 0x70, 0xFF, + 0x25, 0x0E, 0x60, 0xF9, 0x6C, 0xFD, 0x52, 0xF4, 0xCC, 0xF0, 0x37, 0xF2, + 0xFA, 0xEE, 0x99, 0xF3, 0x81, 0xFB, 0xF9, 0x00, 0x98, 0x09, 0xBD, 0x13, + 0xAD, 0x17, 0x69, 0x2A, 0x26, 0x29, 0x04, 0x3B, 0xF7, 0x34, 0x8A, 0x3D, + 0x8B, 0x3D, 0xDA, 0x42, 0x01, 0x40, 0xBB, 0x42, 0x0D, 0x3A, 0xF0, 0x37, + 0xF5, 0x38, 0xC7, 0x35, 0xC8, 0x3A, 0xF6, 0x37, 0xD8, 0x38, 0x05, 0x37, + 0x65, 0x35, 0x77, 0x3A, 0xBC, 0x34, 0x3D, 0x41, 0xA0, 0x33, 0xDA, 0x3F, + 0x66, 0x30, 0x87, 0x32, 0x5B, 0x31, 0x5D, 0x28, 0xCD, 0x32, 0xD5, 0x2B, + 0xFE, 0x2F, 0xB7, 0x31, 0xA0, 0x28, 0x88, 0x2E, 0xF6, 0x20, 0x13, 0x28, + 0x83, 0x25, 0x32, 0x2A, 0x28, 0x34, 0x07, 0x31, 0x4E, 0x3F, 0x14, 0x34, + 0xCA, 0x41, 0x6B, 0x31, 0x15, 0x3A, 0x0C, 0x2D, 0xBD, 0x2F, 0x5E, 0x2D, + 0xCC, 0x25, 0x90, 0x2C, 0x39, 0x1C, 0xB8, 0x28, 0xEB, 0x15, 0x82, 0x1D, + 0x9F, 0x18, 0x9A, 0x12, 0x92, 0x27, 0xA9, 0x19, 0xF9, 0x32, 0xEE, 0x21, + 0xA8, 0x33, 0x23, 0x21, 0x45, 0x32, 0x20, 0x24, 0x04, 0x2C, 0x75, 0x22, + 0x5D, 0x19, 0x0E, 0x13, 0x27, 0x09, 0x77, 0x09, 0x75, 0x02, 0x60, 0x0B, + 0x66, 0xFC, 0xEF, 0x0F, 0xED, 0xF9, 0xAD, 0x13, 0xB9, 0xF5, 0x8D, 0x0F, + 0x70, 0xEE, 0xB9, 0x08, 0xA0, 0xE2, 0xEC, 0xFC, 0x85, 0xDB, 0xC1, 0xF0, + 0x6A, 0xDC, 0xB6, 0xE8, 0x06, 0xDB, 0x22, 0xDD, 0xF1, 0xDE, 0xFC, 0xD7, + 0xD1, 0xE2, 0x80, 0xD4, 0xFF, 0xE1, 0x4C, 0xCF, 0x40, 0xD9, 0x63, 0xCA, + 0xD0, 0xCD, 0x1C, 0xC2, 0x42, 0xD6, 0xF2, 0xBF, 0xC6, 0xE6, 0x1E, 0xC4, + 0xAF, 0xE5, 0xE2, 0xC7, 0x30, 0xDF, 0xF2, 0xCF, 0x6A, 0xDD, 0x61, 0xD7, + 0x2C, 0xD6, 0xB5, 0xD1, 0x94, 0xD0, 0x30, 0xCA, 0xB5, 0xD0, 0x69, 0xCD, + 0x81, 0xD2, 0x1A, 0xD6, 0xA2, 0xDA, 0x1C, 0xDE, 0x85, 0xE1, 0x76, 0xDB, + 0x30, 0xE3, 0x32, 0xD3, 0x89, 0xE1, 0x5E, 0xD0, 0x68, 0xDC, 0xEA, 0xCF, + 0x24, 0xE3, 0xEC, 0xD6, 0x01, 0xF0, 0xAE, 0xE2, 0xB9, 0xF2, 0xF1, 0xED, + 0x86, 0xF0, 0xFB, 0xFB, 0x75, 0xE9, 0xF2, 0x00, 0x3D, 0xDD, 0x1C, 0xF5, + 0x86, 0xD1, 0x76, 0xE6, 0xB0, 0xCB, 0xC7, 0xDD, 0x60, 0xCE, 0xFE, 0xD6, + 0xD3, 0xDC, 0xF9, 0xD7, 0xFF, 0xEB, 0xB7, 0xDF, 0x12, 0xF3, 0xA0, 0xE6, + 0x27, 0xF3, 0xBE, 0xEB, 0xE4, 0xED, 0xC0, 0xF2, 0x89, 0xE8, 0x8C, 0xFC, + 0xE3, 0xE1, 0x21, 0xFC, 0x9B, 0xE2, 0x24, 0xF9, 0x61, 0xEA, 0x60, 0xFF, + 0xA5, 0xF1, 0x76, 0x04, 0x45, 0xF0, 0x5E, 0xFD, 0x77, 0xE4, 0xD2, 0xF1, + 0x5F, 0xDA, 0x48, 0xEC, 0x64, 0xDA, 0x1D, 0xE8, 0x90, 0xE7, 0x4D, 0xE5, + 0x48, 0xF4, 0x4E, 0xE2, 0xA2, 0xF6, 0x04, 0xE0, 0xF6, 0xF2, 0xBA, 0xE1, + 0x04, 0xEB, 0x9D, 0xE0, 0xB1, 0xE8, 0xB7, 0xE6, 0x55, 0xEC, 0x42, 0xF2, + 0xED, 0xF1, 0x3A, 0xF7, 0xAD, 0x00, 0x76, 0xFF, 0xDB, 0x0F, 0xAA, 0x08, + 0x99, 0x13, 0xBA, 0x05, 0xA9, 0x0E, 0x15, 0x00, 0xEE, 0x04, 0x0E, 0x03, + 0x3D, 0xF8, 0xAA, 0x01, 0x8A, 0xF4, 0xBD, 0xFB, 0x53, 0x02, 0x26, 0xFC, + 0x30, 0x12, 0xB8, 0xFB, 0x11, 0x18, 0x01, 0xF8, 0x46, 0x14, 0xD1, 0xF3, + 0x7D, 0x03, 0x0D, 0xEB, 0x70, 0xF5, 0x0E, 0xEA, 0x3E, 0xF6, 0x16, 0xF4, + 0xB3, 0xFE, 0x5F, 0x01, 0x07, 0x0B, 0xEE, 0x0D, 0x1C, 0x10, 0x48, 0x0B, + 0x55, 0x07, 0xE2, 0x00, 0xC4, 0xF4, 0x47, 0xFA, 0x7B, 0xE0, 0x6A, 0xF4, + 0x8D, 0xD4, 0xA0, 0xF0, 0xD9, 0xDA, 0xDF, 0xF0, 0xB3, 0xE9, 0x9B, 0xED, + 0x9E, 0xF6, 0x26, 0xED, 0x4A, 0x00, 0x0C, 0xF8, 0xFB, 0xF6, 0xCB, 0xFA, + 0x87, 0xE7, 0x25, 0xF9, 0x1A, 0xE8, 0x54, 0xFF, 0xF9, 0xEE, 0xC3, 0x01, + 0x99, 0xF9, 0xA5, 0xFF, 0x02, 0x06, 0x19, 0x00, 0xB9, 0x05, 0xB1, 0xFF, + 0xFF, 0xFA, 0x8D, 0xFE, 0x38, 0xEE, 0xC0, 0xFE, 0x57, 0xEA, 0xB9, 0x01, + 0xBA, 0xF5, 0x86, 0x04, 0x8F, 0x02, 0xF2, 0x03, 0xD9, 0x0A, 0xB4, 0x07, + 0xA1, 0x13, 0xDC, 0x0C, 0x71, 0x12, 0x98, 0x09, 0x29, 0x06, 0x95, 0x03, + 0x65, 0x06, 0x8F, 0x0A, 0x1C, 0x0C, 0x36, 0x17, 0xFE, 0x09, 0x44, 0x1C, + 0xD1, 0x11, 0x82, 0x1D, 0xB1, 0x1D, 0x03, 0x15, 0x46, 0x20, 0x59, 0x06, + 0x90, 0x22, 0x30, 0x03, 0x23, 0x20, 0xE6, 0x07, 0xCB, 0x16, 0x2D, 0x09, + 0x8F, 0x13, 0xE0, 0x0C, 0x22, 0x0F, 0xE3, 0x0F, 0x48, 0x09, 0x1C, 0x12, + 0x20, 0x0B, 0xAE, 0x18, 0xD8, 0x11, 0x71, 0x1F, 0x43, 0x1B, 0x83, 0x26, + 0xC6, 0x22, 0x0B, 0x2D, 0xB7, 0x26, 0x86, 0x2D, 0x05, 0x28, 0x46, 0x22, + 0x5E, 0x27, 0x4F, 0x12, 0x53, 0x27, 0xDC, 0x08, 0x64, 0x26, 0x9C, 0x0D, + 0x6E, 0x23, 0x45, 0x1B, 0xDA, 0x22, 0x39, 0x25, 0x34, 0x22, 0x3D, 0x2A, + 0x66, 0x16, 0x98, 0x27, 0xB3, 0x10, 0x00, 0x27, 0x81, 0x1C, 0x2A, 0x33, + 0x3D, 0x24, 0x49, 0x39, 0xF4, 0x27, 0xB9, 0x35, 0x00, 0x31, 0x53, 0x37, + 0xBB, 0x3D, 0x19, 0x3E, 0xBF, 0x3C, 0x69, 0x3A, 0x40, 0x2F, 0x5C, 0x2E, + 0x21, 0x26, 0xD2, 0x25, 0xF9, 0x20, 0x56, 0x21, 0x8F, 0x20, 0x50, 0x1E, + 0x71, 0x27, 0xDE, 0x1B, 0xFF, 0x29, 0xA7, 0x1B, 0xA2, 0x20, 0xC9, 0x17, + 0x8F, 0x13, 0xB9, 0x10, 0x77, 0x08, 0xE2, 0x0E, 0x5D, 0x05, 0x74, 0x0B, + 0xD0, 0x0B, 0xAE, 0x06, 0x3A, 0x17, 0x76, 0x0E, 0xB8, 0x1D, 0x51, 0x10, + 0xCF, 0x1F, 0x50, 0x04, 0x42, 0x23, 0xBC, 0xFD, 0x39, 0x1C, 0xB7, 0xF8, + 0x52, 0x0E, 0x29, 0xF5, 0x74, 0x07, 0xD2, 0xFA, 0xB6, 0xFE, 0x27, 0xFB, + 0xC1, 0xF6, 0xEF, 0xF9, 0x22, 0xF2, 0x37, 0xFD, 0x3D, 0xE8, 0xF7, 0xFC, + 0xCE, 0xE0, 0x2B, 0xFE, 0x90, 0xDB, 0x51, 0xFA, 0x44, 0xD7, 0x10, 0xF5, + 0xB4, 0xD7, 0x7E, 0xF4, 0xAC, 0xD5, 0xDF, 0xEE, 0x86, 0xD3, 0x42, 0xE6, + 0xBA, 0xD5, 0x20, 0xDF, 0xB4, 0xD1, 0x76, 0xD5, 0xF2, 0xC7, 0xFC, 0xCC, + 0x87, 0xC6, 0x1C, 0xC9, 0xB1, 0xCC, 0x3D, 0xC7, 0xE3, 0xD1, 0x1D, 0xC9, + 0x3B, 0xDA, 0x67, 0xCB, 0x60, 0xE5, 0x97, 0xCA, 0xBE, 0xE5, 0x58, 0xCA, + 0xEF, 0xE1, 0x3C, 0xD2, 0xC0, 0xE1, 0x67, 0xD8, 0x6E, 0xE4, 0xBE, 0xD5, + 0xC4, 0xEF, 0xA3, 0xD7, 0xED, 0xF8, 0x5C, 0xDD, 0x05, 0xF4, 0x6C, 0xDC, + 0x2F, 0xED, 0xC6, 0xDD, 0x50, 0xEC, 0x75, 0xE7, 0x8F, 0xE9, 0xDF, 0xEC, + 0xE7, 0xE9, 0x43, 0xEE, 0x2C, 0xF0, 0x4B, 0xF1, 0x84, 0xF5, 0x59, 0xF3, + 0xB5, 0xF9, 0x39, 0xFC, 0xA4, 0xF8, 0x4C, 0x0C, 0xDC, 0xF5, 0x69, 0x1A, + 0xAF, 0xF2, 0x49, 0x1F, 0x28, 0xF3, 0x97, 0x1C, 0xFA, 0xFA, 0x31, 0x1B, + 0x44, 0x05, 0x5D, 0x1B, 0xCC, 0x10, 0xC8, 0x15, 0xAB, 0x1B, 0x7F, 0x0D, + 0x8A, 0x1D, 0x89, 0x0B, 0x82, 0x14, 0x77, 0x0E, 0x48, 0x0C, 0x31, 0x11, + 0xAD, 0x06, 0x13, 0x0E, 0x81, 0x03, 0x50, 0x09, 0xF1, 0x01, 0xB7, 0x0C, + 0xBB, 0x04, 0x1C, 0x17, 0x9D, 0x11, 0x22, 0x23, 0x0C, 0x1D, 0x01, 0x25, + 0xB3, 0x1E, 0x07, 0x1D, 0xA7, 0x1A, 0x8C, 0x19, 0xCF, 0x16, 0x46, 0x15, + 0xC2, 0x16, 0x09, 0x0E, 0x97, 0x1A, 0xF5, 0x0E, 0x77, 0x20, 0xBC, 0x13, + 0xD0, 0x23, 0xAA, 0x15, 0x0A, 0x1E, 0xF8, 0x14, 0xFE, 0x12, 0xE1, 0x0B, + 0x8A, 0x0B, 0x8E, 0xFD, 0xD4, 0x00, 0xA4, 0xF6, 0x6B, 0xF3, 0xF9, 0xFB, + 0x76, 0xF1, 0x6D, 0x09, 0x46, 0xF9, 0x07, 0x0F, 0xD1, 0xFE, 0x07, 0x09, + 0xF6, 0xFD, 0xD2, 0x04, 0x1E, 0xF9, 0x1E, 0x01, 0xB4, 0xF0, 0x66, 0xF6, + 0x71, 0xEC, 0x28, 0xF0, 0xB5, 0xEC, 0x9B, 0xF3, 0xE8, 0xF0, 0x97, 0xF5, + 0xD4, 0xF9, 0xE8, 0xF4, 0xC8, 0xFB, 0xE6, 0xEF, 0x79, 0xFC, 0xE7, 0xE7, + 0xD2, 0xFF, 0xB5, 0xE1, 0x1C, 0xFF, 0x2B, 0xE1, 0xDF, 0xFF, 0x8D, 0xE8, + 0x45, 0x06, 0xB5, 0xF2, 0x5F, 0x05, 0x8D, 0xF8, 0xF2, 0xF5, 0xDE, 0xF1, + 0xA7, 0xE6, 0x56, 0xE4, 0x99, 0xDF, 0x2E, 0xD7, 0xEC, 0xDD, 0x6E, 0xCF, + 0xF0, 0xDB, 0x9B, 0xD1, 0xA5, 0xD8, 0xCC, 0xDC, 0x34, 0xD8, 0xEA, 0xE7, + 0xC3, 0xDA, 0xD2, 0xEB, 0x0B, 0xDD, 0xCF, 0xF0, 0x36, 0xD9, 0xB9, 0xF3, + 0xBB, 0xD9, 0x44, 0xF2, 0x73, 0xDB, 0x68, 0xEF, 0xED, 0xD6, 0xD8, 0xEA, + 0x45, 0xD9, 0x3F, 0xE8, 0xE9, 0xDC, 0x1C, 0xE3, 0x41, 0xD9, 0xDD, 0xD6, + 0xA0, 0xD4, 0x23, 0xC9, 0xB8, 0xD4, 0x72, 0xC1, 0x47, 0xD9, 0x08, 0xC3, + 0xA3, 0xE1, 0xFD, 0xCB, 0x18, 0xE5, 0x5B, 0xD7, 0x62, 0xE2, 0xE5, 0xDC, + 0xAC, 0xE3, 0x8B, 0xDF, 0x63, 0xE4, 0x13, 0xE6, 0x14, 0xDC, 0x4C, 0xEA, + 0x9C, 0xD3, 0xEC, 0xEB, 0xB9, 0xD7, 0xB9, 0xF1, 0xBD, 0xE3, 0xD4, 0xF3, + 0x7B, 0xF4, 0xD0, 0xEF, 0xFF, 0x03, 0xA6, 0xEE, 0xAB, 0x07, 0x66, 0xEA, + 0xB5, 0x07, 0x86, 0xE5, 0xD4, 0x0E, 0xE8, 0xEB, 0x09, 0x1B, 0x20, 0xFB, + 0x33, 0x25, 0xCA, 0x0B, 0xD7, 0x2C, 0xA4, 0x18, 0xE5, 0x2F, 0xED, 0x22, + 0x30, 0x2A, 0x87, 0x2C, 0xCE, 0x20, 0xF1, 0x35, 0x38, 0x1A, 0x77, 0x3C, + 0x55, 0x1B, 0xD1, 0x3A, 0xB8, 0x25, 0x25, 0x34, 0x0D, 0x33, 0x86, 0x31, + 0x1D, 0x3B, 0x13, 0x31, 0x36, 0x40, 0xA5, 0x31, 0x56, 0x3D, 0x8D, 0x34, + 0xF2, 0x31, 0xAA, 0x32, 0xEF, 0x2E, 0xAF, 0x34, 0x7F, 0x2C, 0x8C, 0x3B, + 0x75, 0x28, 0x36, 0x3F, 0xEE, 0x30, 0x73, 0x43, 0x31, 0x3A, 0x6B, 0x43, + 0x94, 0x3B, 0x50, 0x41, 0xAA, 0x33, 0x00, 0x3E, 0x89, 0x28, 0xB3, 0x3A, + 0xCA, 0x25, 0x16, 0x39, 0x67, 0x24, 0xB4, 0x36, 0x04, 0x21, 0xA6, 0x36, + 0x48, 0x22, 0x78, 0x30, 0xCD, 0x28, 0x61, 0x26, 0x0B, 0x2B, 0xC2, 0x1C, + 0x7E, 0x28, 0x2F, 0x14, 0x66, 0x28, 0x63, 0x17, 0x89, 0x27, 0xA6, 0x20, + 0xB2, 0x26, 0x66, 0x25, 0x46, 0x27, 0xB8, 0x29, 0xB4, 0x22, 0xD8, 0x2F, + 0x3E, 0x19, 0x44, 0x36, 0xDF, 0x14, 0x61, 0x36, 0xB6, 0x19, 0x41, 0x2A, + 0xCE, 0x1E, 0xCC, 0x1D, 0x58, 0x21, 0xC0, 0x17, 0x92, 0x26, 0x6C, 0x12, + 0x43, 0x26, 0xD4, 0x0C, 0x87, 0x1E, 0x36, 0x06, 0x19, 0x16, 0x6B, 0x01, + 0xC8, 0x0D, 0xEA, 0xFF, 0xD6, 0x0D, 0xEA, 0x01, 0xF3, 0x0D, 0x44, 0x06, + 0x06, 0x05, 0x44, 0x0B, 0xA9, 0xFB, 0x48, 0x0F, 0x07, 0xF2, 0x43, 0x0E, + 0xEC, 0xE9, 0x72, 0x0A, 0x3B, 0xE7, 0x6C, 0x02, 0xEA, 0xE9, 0x64, 0xFB, + 0x89, 0xEF, 0x1C, 0xFA, 0x3B, 0xF3, 0x44, 0xF5, 0x66, 0xF1, 0xB2, 0xEB, + 0xA2, 0xE8, 0x06, 0xE3, 0x2A, 0xDF, 0x2E, 0xDD, 0x2D, 0xD9, 0xBC, 0xD2, + 0xFC, 0xDB, 0x31, 0xCF, 0x73, 0xE6, 0xC3, 0xD4, 0x64, 0xEB, 0xEE, 0xD2, + 0xEB, 0xEA, 0x17, 0xD1, 0x78, 0xE1, 0x18, 0xD1, 0xC2, 0xD3, 0x86, 0xCF, + 0x86, 0xD0, 0xCE, 0xCC, 0x84, 0xD5, 0x85, 0xC9, 0x13, 0xDE, 0x5F, 0xCC, + 0x3B, 0xE7, 0x5B, 0xD3, 0x52, 0xEA, 0x54, 0xD6, 0x71, 0xE9, 0x5A, 0xD5, + 0xB3, 0xE4, 0x6F, 0xD2, 0x2E, 0xD9, 0xED, 0xCD, 0x00, 0xD4, 0x32, 0xCE, + 0xE0, 0xD7, 0x50, 0xD3, 0x04, 0xE0, 0xC1, 0xD9, 0xC8, 0xEB, 0x0E, 0xE3, + 0x91, 0xEF, 0x6A, 0xF0, 0x7C, 0xEB, 0x34, 0xFB, 0x42, 0xE8, 0x68, 0xF6, + 0xE0, 0xEA, 0x51, 0xF0, 0x48, 0xF2, 0x01, 0xF5, 0x73, 0xF6, 0xFA, 0xF8, + 0xCC, 0xFA, 0x1C, 0xF8, 0x28, 0xFD, 0xC8, 0xF0, 0x9F, 0xF4, 0x1B, 0xE7, + 0x90, 0xEB, 0x3E, 0xE0, 0xAA, 0xE6, 0xE7, 0xD7, 0xD6, 0xE5, 0xF0, 0xD3, + 0x10, 0xED, 0x48, 0xD9, 0x04, 0xF3, 0x74, 0xDE, 0x28, 0xF3, 0x94, 0xE4, + 0x2E, 0xEC, 0xFC, 0xE8, 0x9B, 0xE0, 0xDF, 0xEA, 0x9E, 0xDB, 0x22, 0xF2, + 0x55, 0xE0, 0xC7, 0xFC, 0x22, 0xE8, 0xA1, 0x05, 0x6A, 0xEE, 0xB4, 0x05, + 0x9A, 0xF4, 0x05, 0xFE, 0xEC, 0xF4, 0x0B, 0xF1, 0xE0, 0xE7, 0xE9, 0xE0, + 0xC5, 0xD4, 0x18, 0xD2, 0xD7, 0xC9, 0x08, 0xCD, 0x1A, 0xC9, 0xDA, 0xD1, + 0x51, 0xCC, 0x2D, 0xD9, 0xAF, 0xCE, 0x00, 0xE3, 0x29, 0xCE, 0x98, 0xEB, + 0x0A, 0xCE, 0x4B, 0xED, 0x9E, 0xCF, 0xF4, 0xEB, 0x6E, 0xD0, 0x0E, 0xEB, + 0x24, 0xD5, 0xBE, 0xEE, 0x03, 0xDB, 0xD1, 0xF1, 0xB8, 0xE4, 0xEA, 0xEE, + 0x40, 0xF0, 0xE4, 0xEB, 0x81, 0xF3, 0xE5, 0xE7, 0xA9, 0xF3, 0x04, 0xE3, + 0x2B, 0xF7, 0x1E, 0xDC, 0x27, 0xFF, 0x8E, 0xD4, 0x0B, 0x00, 0xD9, 0xD2, + 0x04, 0xF6, 0x32, 0xDB, 0x16, 0xEF, 0xAA, 0xE5, 0xD3, 0xEF, 0x7A, 0xEC, + 0xCF, 0xF3, 0xA0, 0xF4, 0xD4, 0xF4, 0xC9, 0xFA, 0x6C, 0xF4, 0x07, 0x04, + 0x1A, 0xF5, 0x55, 0x0D, 0xCF, 0xEE, 0x15, 0x0E, 0x35, 0xE6, 0x15, 0x0B, + 0x35, 0xE6, 0xA6, 0x05, 0xB4, 0xEE, 0x79, 0x01, 0x9C, 0xF2, 0x09, 0xFE, + 0x47, 0xEF, 0xC8, 0xF7, 0x40, 0xF3, 0x22, 0xF9, 0x41, 0xFA, 0xE9, 0xFB, + 0x91, 0xFD, 0xD3, 0xF7, 0x0C, 0xFF, 0xAD, 0xF3, 0x0C, 0x00, 0x8A, 0xF0, + 0xCB, 0x01, 0xBC, 0xEF, 0xB0, 0x03, 0x55, 0xF3, 0x28, 0x03, 0xC9, 0xFA, + 0xAA, 0x07, 0x98, 0x07, 0xD2, 0x10, 0x1B, 0x12, 0x0A, 0x19, 0xF4, 0x11, + 0xDA, 0x1F, 0x76, 0x11, 0x87, 0x1F, 0xC5, 0x15, 0x8E, 0x18, 0xF2, 0x11, + 0x3E, 0x10, 0x49, 0x07, 0xEF, 0x0E, 0x83, 0x09, 0x7B, 0x14, 0x94, 0x11, + 0x3B, 0x1E, 0x0B, 0x13, 0x27, 0x2A, 0x90, 0x16, 0x32, 0x32, 0xCA, 0x1D, + 0x4C, 0x30, 0x45, 0x25, 0x71, 0x2B, 0xAB, 0x27, 0x87, 0x2A, 0x9E, 0x27, + 0xF2, 0x28, 0xD1, 0x28, 0x1B, 0x2C, 0xC6, 0x28, 0x8A, 0x32, 0x25, 0x26, + 0xDC, 0x30, 0x67, 0x21, 0x79, 0x2F, 0x44, 0x20, 0x97, 0x2D, 0x36, 0x20, + 0x2E, 0x25, 0xC7, 0x20, 0x94, 0x20, 0xF6, 0x26, 0x8D, 0x1E, 0x88, 0x2D, + 0xFC, 0x22, 0x47, 0x33, 0x6F, 0x2C, 0x28, 0x3C, 0xED, 0x2B, 0x25, 0x3C, + 0x22, 0x2B, 0xCD, 0x36, 0x84, 0x30, 0x85, 0x35, 0xA2, 0x30, 0x45, 0x33, + 0x30, 0x37, 0x9C, 0x36, 0x2A, 0x48, 0xE6, 0x3F, 0x11, 0x4C, 0x5F, 0x41, + 0xFE, 0x47, 0x36, 0x3C, 0x59, 0x4A, 0x2C, 0x35, 0xBD, 0x4E, 0x25, 0x33, + 0x2B, 0x43, 0x77, 0x35, 0x68, 0x33, 0x75, 0x39, 0x88, 0x30, 0xAE, 0x42, + 0x54, 0x37, 0x64, 0x4C, 0x03, 0x3D, 0x6B, 0x52, 0xAF, 0x3D, 0x48, 0x55, + 0xF1, 0x42, 0x67, 0x56, 0x13, 0x50, 0xC6, 0x55, 0x21, 0x5B, 0x72, 0x55, + 0xEE, 0x5A, 0x33, 0x53, 0x8A, 0x60, 0xA0, 0x59, 0x3D, 0x62, 0xE9, 0x5C, + 0x50, 0x60, 0xB7, 0x5A, 0x2C, 0x5E, 0xE6, 0x59, 0xFE, 0x4D, 0x67, 0x4F, + 0x3B, 0x48, 0x60, 0x47, 0xCD, 0x4E, 0x44, 0x3A, 0x0B, 0x48, 0xD0, 0x28, + 0x37, 0x3A, 0x0E, 0x27, 0xCD, 0x25, 0x31, 0x26, 0xBA, 0x0A, 0xB6, 0x21, + 0xB8, 0x15, 0x8A, 0x3D, 0x3D, 0x25, 0xCA, 0x4F, 0xD3, 0x13, 0x67, 0x36, + 0x36, 0x20, 0x33, 0x35, 0x7A, 0x2D, 0x49, 0x38, 0x79, 0x09, 0x6B, 0x12, + 0xF3, 0xE7, 0x7A, 0xEF, 0xC9, 0xDC, 0xDC, 0xE8, 0x38, 0xF9, 0x42, 0x07, + 0x09, 0x05, 0x88, 0x08, 0x54, 0xDE, 0x16, 0xDD, 0xEE, 0xE3, 0xC6, 0xE7, + 0x6E, 0xE4, 0x7F, 0xEF, 0xFE, 0xB2, 0x1B, 0xC1, 0x72, 0xAD, 0xE2, 0xB3, + 0xDD, 0xD6, 0x0C, 0xCE, 0x3E, 0xDE, 0xBE, 0xC8, 0x4C, 0xD2, 0xDB, 0xB1, + 0x19, 0xD8, 0xA5, 0xBD, 0xAF, 0xC8, 0xCE, 0xBD, 0xB6, 0xAD, 0x97, 0xA4, + 0x63, 0xB2, 0x08, 0xA5, 0x69, 0xBA, 0xF0, 0xAF, 0x17, 0xAE, 0x6E, 0xA4, + 0x21, 0xA8, 0x60, 0xA3, 0x0E, 0xB5, 0x62, 0xBA, 0x76, 0xB1, 0x2F, 0xB4, + 0x6D, 0xA6, 0x1E, 0xA3, 0x1D, 0xAF, 0xE5, 0xA8, 0x7B, 0xB9, 0xC9, 0xB0, + 0xE6, 0xAE, 0x19, 0xAA, 0xB3, 0x9F, 0x87, 0xA1, 0xC8, 0xAB, 0x2C, 0xAF, + 0x2A, 0xB0, 0x8E, 0xB6, 0x9A, 0xA5, 0x57, 0xA7, 0x70, 0xA0, 0x40, 0x9B, + 0xAD, 0xA5, 0x62, 0xA5, 0xEA, 0xB0, 0x0E, 0xB6, 0xAE, 0xAF, 0x5E, 0xB7, + 0x3A, 0xA8, 0x6E, 0xB5, 0xA0, 0xA4, 0x03, 0xB6, 0x26, 0xA6, 0x85, 0xB7, + 0x61, 0xAA, 0x55, 0xBB, 0xF3, 0xB4, 0x70, 0xC6, 0x73, 0xC2, 0x78, 0xD1, + 0x92, 0xCE, 0xC2, 0xD0, 0x53, 0xD0, 0xB7, 0xC7, 0xC3, 0xC4, 0x90, 0xBD, + 0xF4, 0xB8, 0x8C, 0xB4, 0xA4, 0xB3, 0x0F, 0xB1, 0x42, 0xB3, 0x70, 0xB7, + 0xE7, 0xC8, 0x5D, 0xD3, 0xEB, 0xE6, 0x28, 0xED, 0x49, 0xF2, 0xBA, 0xF0, + 0x13, 0xFB, 0x09, 0xFA, 0x7D, 0x02, 0x1A, 0x0D, 0x1E, 0x03, 0x48, 0x14, + 0x9A, 0x01, 0x7E, 0x0A, 0x79, 0x09, 0x9F, 0x09, 0x3A, 0x0F, 0xDF, 0x10, + 0x8D, 0x11, 0x3A, 0x14, 0x94, 0x14, 0xE2, 0x14, 0x04, 0x0F, 0x0F, 0x0E, + 0x6F, 0x14, 0x94, 0x10, 0xCB, 0x22, 0x7C, 0x1F, 0xE1, 0x22, 0xBD, 0x22, + 0x9A, 0x25, 0x32, 0x24, 0x1E, 0x29, 0x05, 0x26, 0xD2, 0x1A, 0x5D, 0x21, + 0xE0, 0x11, 0x6F, 0x27, 0x8A, 0x13, 0xEB, 0x2E, 0x62, 0x22, 0x51, 0x34, + 0xA4, 0x41, 0x9A, 0x42, 0xBF, 0x57, 0x4F, 0x4C, 0x1A, 0x4F, 0x0C, 0x3B, + 0x60, 0x45, 0xA3, 0x24, 0xDF, 0x4B, 0xD2, 0x24, 0x1D, 0x49, 0x94, 0x2A, + 0xB1, 0x3C, 0x98, 0x24, 0xA5, 0x36, 0x6F, 0x22, 0xB6, 0x31, 0xB3, 0x29, + 0x1F, 0x25, 0x8C, 0x2D, 0x6B, 0x18, 0x1C, 0x31, 0x1E, 0x14, 0x3B, 0x38, + 0x01, 0x1B, 0x79, 0x3E, 0xF6, 0x28, 0x69, 0x42, 0xA1, 0x3B, 0x0C, 0x47, + 0x2B, 0x52, 0xD2, 0x53, 0x15, 0x59, 0x7A, 0x5A, 0x42, 0x4F, 0x2D, 0x4F, + 0x3D, 0x47, 0x6F, 0x47, 0x43, 0x3E, 0x40, 0x48, 0x76, 0x3D, 0x4A, 0x4C, + 0xEC, 0x41, 0xA7, 0x45, 0xDC, 0x4A, 0x60, 0x3F, 0x65, 0x51, 0x43, 0x3F, + 0x79, 0x41, 0xF8, 0x33, 0xB8, 0x39, 0x7B, 0x35, 0x92, 0x35, 0xD2, 0x38, + 0x17, 0x29, 0x8F, 0x32, 0x2C, 0x2B, 0xA1, 0x32, 0x9D, 0x37, 0x42, 0x38, + 0x35, 0x3F, 0xDE, 0x41, 0x05, 0x3C, 0xCA, 0x41, 0xD2, 0x3C, 0x75, 0x3B, + 0xA7, 0x3D, 0xE9, 0x37, 0x35, 0x3C, 0xA9, 0x37, 0xD7, 0x48, 0x58, 0x44, + 0xED, 0x54, 0x0B, 0x4F, 0x64, 0x52, 0x98, 0x4B, 0xBD, 0x42, 0x69, 0x43, + 0x97, 0x26, 0x4B, 0x36, 0x26, 0x17, 0x20, 0x30, 0xA6, 0x10, 0x0C, 0x2C, + 0x2B, 0x0F, 0xEC, 0x24, 0x88, 0x1F, 0x21, 0x26, 0x7C, 0x34, 0x0C, 0x31, + 0x00, 0x3E, 0x00, 0x3B, 0x49, 0x44, 0x5C, 0x44, 0x34, 0x43, 0xC5, 0x47, + 0x2A, 0x37, 0x4E, 0x3E, 0x82, 0x32, 0xBC, 0x38, 0x63, 0x39, 0x22, 0x3C, + 0xD7, 0x34, 0xFD, 0x31, 0x25, 0x28, 0x3C, 0x25, 0xC6, 0x24, 0x09, 0x2C, + 0x9C, 0x1D, 0x6E, 0x33, 0xCE, 0x17, 0xE0, 0x3B, 0xC1, 0x19, 0x37, 0x44, + 0x7C, 0x20, 0xD8, 0x43, 0x28, 0x33, 0x91, 0x47, 0x40, 0x47, 0x64, 0x48, + 0x61, 0x4C, 0x8E, 0x3E, 0xF5, 0x3F, 0xF6, 0x31, 0x91, 0x2A, 0x30, 0x27, + 0xED, 0x20, 0x79, 0x27, 0x6F, 0x1B, 0x09, 0x25, 0x11, 0x0C, 0x60, 0x13, + 0x74, 0x03, 0x7A, 0x0D, 0x61, 0x04, 0x80, 0x13, 0x33, 0xFF, 0xD9, 0x0A, + 0x79, 0xF7, 0xE0, 0xFC, 0x82, 0xFD, 0x48, 0x01, 0x7F, 0x0B, 0xD9, 0x12, + 0x30, 0x09, 0xE3, 0x10, 0xA7, 0x06, 0x30, 0x01, 0x49, 0x0F, 0x3D, 0xF6, + 0x00, 0x0D, 0xCA, 0xEB, 0xFD, 0x07, 0x03, 0xEB, 0x36, 0xF9, 0x41, 0xEA, + 0x94, 0xE0, 0x92, 0xE1, 0xA4, 0xDD, 0xD5, 0xE4, 0x87, 0xE6, 0x25, 0xEB, + 0xF2, 0xE2, 0xD5, 0xE1, 0xB4, 0xDE, 0x1A, 0xDC, 0x12, 0xDE, 0xB6, 0xE0, + 0x97, 0xDC, 0xB8, 0xE1, 0xAE, 0xDA, 0xAE, 0xDE, 0x37, 0xD4, 0x49, 0xDD, + 0xF0, 0xD1, 0x5D, 0xDC, 0xF3, 0xD3, 0x76, 0xD5, 0xCD, 0xD3, 0xB7, 0xCB, + 0xEC, 0xC7, 0x89, 0xBF, 0x13, 0xBB, 0x35, 0xBA, 0x3D, 0xB5, 0x33, 0xB4, + 0x71, 0xB3, 0xCD, 0xA5, 0xAA, 0xB8, 0xDA, 0xA1, 0x69, 0xBA, 0xA1, 0xA4, + 0xF5, 0xB6, 0xD0, 0xA5, 0x6B, 0xB6, 0x1D, 0xAA, 0xCF, 0xBE, 0x8B, 0xB0, + 0xF8, 0xC3, 0xA2, 0xB0, 0xC0, 0xC3, 0xCE, 0xAF, 0x7E, 0xCC, 0x98, 0xBA, + 0x64, 0xD0, 0xCA, 0xBE, 0xF6, 0xCF, 0x3C, 0xBA, 0x1C, 0xD3, 0x73, 0xB7, + 0xC8, 0xD1, 0x3B, 0xB5, 0x61, 0xD8, 0x1B, 0xBA, 0xB9, 0xE0, 0xD5, 0xBE, + 0xD4, 0xD9, 0xDA, 0xC1, 0xFB, 0xD2, 0x47, 0xCC, 0x25, 0xD0, 0x43, 0xD3, + 0x60, 0xD1, 0x63, 0xD1, 0x4B, 0xE2, 0xC9, 0xD9, 0x1E, 0xF6, 0x33, 0xEE, + 0x83, 0xF9, 0x4E, 0xFB, 0x3E, 0xF0, 0x5C, 0xFC, 0xFA, 0xF0, 0xD3, 0x03, + 0x1D, 0xFC, 0xB6, 0x0D, 0x7B, 0x03, 0x2F, 0x09, 0x00, 0x0C, 0xF7, 0x03, + 0x0A, 0x0B, 0x1F, 0xFA, 0x78, 0x0C, 0x35, 0xF8, 0xF4, 0x15, 0xA5, 0x05, + 0x70, 0x11, 0x52, 0x0A, 0x24, 0x07, 0xBA, 0x09, 0x64, 0xFF, 0xEF, 0x08, + 0xC0, 0x07, 0x8A, 0x0E, 0xEA, 0x1C, 0x19, 0x1B, 0x15, 0x2E, 0xED, 0x27, + 0xF8, 0x33, 0x8D, 0x2F, 0x06, 0x2B, 0x46, 0x31, 0x37, 0x26, 0xA7, 0x31, + 0xCF, 0x2A, 0xCD, 0x31, 0xB8, 0x2E, 0x05, 0x36, 0x95, 0x31, 0x80, 0x3C, + 0x47, 0x34, 0xD6, 0x3E, 0x39, 0x36, 0xD1, 0x3A, 0xC0, 0x37, 0xBA, 0x37, + 0x96, 0x2F, 0xA2, 0x33, 0x3C, 0x23, 0xCF, 0x2E, 0xA8, 0x19, 0x1F, 0x29, + 0x14, 0x13, 0xE7, 0x25, 0xF7, 0x18, 0x2D, 0x2E, 0x44, 0x1F, 0x64, 0x2F, + 0xC6, 0x25, 0x37, 0x2C, 0x5E, 0x29, 0xB2, 0x2D, 0x84, 0x25, 0x2C, 0x2E, + 0x13, 0x23, 0x9C, 0x31, 0x1E, 0x1E, 0x1B, 0x2B, 0x45, 0x1B, 0xE9, 0x20, + 0x71, 0x1D, 0x57, 0x1C, 0xF8, 0x1C, 0x77, 0x14, 0x0B, 0x16, 0xB8, 0x09, + 0x02, 0x13, 0x72, 0x03, 0xDD, 0x15, 0x3B, 0x03, 0x3C, 0x0C, 0x01, 0xFD, + 0x0A, 0x01, 0x52, 0xF8, 0xD1, 0xFE, 0xA6, 0xFA, 0x00, 0x00, 0x89, 0xFE, + 0x0E, 0x02, 0xE5, 0xFB, 0x20, 0xFD, 0xC8, 0xEF, 0x8F, 0xF5, 0x30, 0xEB, + 0xC8, 0xEB, 0x12, 0xEB, 0x86, 0xE1, 0xDF, 0xE6, 0xA9, 0xD9, 0xB8, 0xE0, + 0x66, 0xDD, 0x9A, 0xE3, 0x5B, 0xDF, 0x92, 0xEB, 0x1F, 0xD8, 0xB2, 0xF0, + 0xD4, 0xD1, 0x5B, 0xEC, 0x9F, 0xC9, 0x55, 0xE2, 0x09, 0xC7, 0x7C, 0xE3, + 0x4D, 0xC6, 0x0F, 0xE8, 0x80, 0xC7, 0x62, 0xEB, 0x71, 0xCC, 0xB1, 0xEB, + 0x62, 0xCB, 0x31, 0xDF, 0x0E, 0xCD, 0x78, 0xD3, 0xAF, 0xCF, 0xB6, 0xCD, + 0xBE, 0xC8, 0xEE, 0xC0, 0xE8, 0xC3, 0x66, 0xB3, 0x97, 0xC1, 0x37, 0xAF, + 0xD8, 0xC4, 0x88, 0xBF, 0x91, 0xC0, 0x8E, 0xD0, 0x7A, 0xB4, 0x0D, 0xD0, + 0x79, 0xAF, 0xDC, 0xC8, 0x20, 0xB5, 0xD6, 0xC7, 0x70, 0xC3, 0x02, 0xCD, + 0x49, 0xCE, 0xE9, 0xCD, 0x89, 0xDE, 0x69, 0xCF, 0x6B, 0xE9, 0xDB, 0xD2, + 0x90, 0xEB, 0x6A, 0xD6, 0xA6, 0xF8, 0x91, 0xDF, 0xF3, 0xF1, 0x4B, 0xDC, + 0xA1, 0xD7, 0x61, 0xD0, 0x24, 0xD5, 0x1E, 0xDB, 0x4F, 0xD9, 0x8A, 0xE7, + 0x45, 0xD3, 0x9E, 0xE3, 0x3D, 0xD6, 0xEC, 0xE0, 0xC0, 0xD5, 0xCF, 0xDC, + 0x25, 0xCD, 0xC4, 0xDA, 0xD1, 0xD0, 0x43, 0xE8, 0x1A, 0xDB, 0xCC, 0xF7, + 0x73, 0xE4, 0xF4, 0xFE, 0x1C, 0xEE, 0x09, 0x03, 0x67, 0xEE, 0x4D, 0x03, + 0x91, 0xE5, 0xD4, 0xF9, 0x12, 0xE2, 0x01, 0xF1, 0x2D, 0xDE, 0xE4, 0xE9, + 0xBA, 0xD2, 0x3E, 0xDC, 0x8F, 0xD4, 0x73, 0xD9, 0x96, 0xD9, 0x0D, 0xDB, + 0xAC, 0xD7, 0xD7, 0xDA, 0x50, 0xDB, 0xAD, 0xDE, 0x06, 0xE2, 0x2C, 0xE0, + 0x1D, 0xDE, 0x28, 0xE0, 0xA4, 0xD8, 0xDD, 0xE1, 0x24, 0xDA, 0x31, 0xE2, + 0xE0, 0xDC, 0xED, 0xDC, 0xEF, 0xE2, 0x3E, 0xDC, 0xA0, 0xEE, 0xB0, 0xE3, + 0x2D, 0xEE, 0x09, 0xDF, 0xF1, 0xE5, 0x81, 0xD3, 0xA7, 0xE4, 0x93, 0xCE, + 0xDC, 0xE0, 0x8A, 0xCA, 0xF2, 0xDE, 0xEC, 0xCA, 0x91, 0xE4, 0x7D, 0xD8, + 0x70, 0xE2, 0x5B, 0xE3, 0xC8, 0xE1, 0x5C, 0xDF, 0xD5, 0xED, 0x7E, 0xDD, + 0x3C, 0xEE, 0xFC, 0xDA, 0x44, 0xE7, 0x1C, 0xD7, 0x91, 0xE4, 0xED, 0xD4, + 0xA5, 0xEC, 0x4F, 0xD2, 0xEA, 0xF6, 0xE7, 0xD4, 0xD5, 0xFC, 0x95, 0xDA, + 0x5F, 0x00, 0x3A, 0xDE, 0x51, 0xF5, 0x44, 0xDA, 0xF4, 0xEE, 0x97, 0xDA, + 0x9D, 0xF7, 0x36, 0xE8, 0x9D, 0xF9, 0x03, 0xEF, 0x53, 0xEE, 0x8B, 0xED, + 0xE1, 0xE6, 0x77, 0xF3, 0x30, 0xE5, 0x1F, 0xF9, 0xFC, 0xE3, 0x70, 0xF9, + 0x5F, 0xE9, 0x2F, 0xFA, 0x6E, 0xFA, 0xAF, 0x02, 0x01, 0x06, 0x61, 0x03, + 0x3D, 0x06, 0xD4, 0xFC, 0x67, 0x04, 0xC3, 0xFF, 0x04, 0x04, 0xF2, 0x01, + 0xE4, 0x03, 0x55, 0xFE, 0x26, 0x01, 0xC6, 0xFE, 0x5D, 0x09, 0x08, 0x09, + 0xDF, 0x12, 0x8C, 0x10, 0x20, 0x1F, 0xC3, 0x16, 0x3A, 0x2A, 0xBE, 0x21, + 0x60, 0x26, 0xA1, 0x27, 0x6A, 0x28, 0xBD, 0x27, 0x18, 0x31, 0xC3, 0x26, + 0x48, 0x3B, 0x4F, 0x26, 0xDF, 0x42, 0x9D, 0x2B, 0x7A, 0x43, 0xB4, 0x3A, + 0x58, 0x45, 0x8F, 0x4D, 0x87, 0x47, 0x68, 0x54, 0x63, 0x4F, 0x07, 0x54, + 0x0D, 0x5E, 0x97, 0x55, 0x63, 0x5E, 0x49, 0x4E, 0xDB, 0x57, 0x4F, 0x49, + 0x78, 0x58, 0x3A, 0x4C, 0xCD, 0x56, 0xBC, 0x50, 0x01, 0x4C, 0x43, 0x57, + 0x39, 0x49, 0x34, 0x60, 0xFE, 0x52, 0x8D, 0x65, 0x1E, 0x54, 0x68, 0x61, + 0xFE, 0x5A, 0xB7, 0x61, 0xD8, 0x64, 0x7C, 0x64, 0x2C, 0x5F, 0xF8, 0x5B, + 0x4B, 0x5C, 0x12, 0x56, 0xF9, 0x5D, 0xC3, 0x53, 0x02, 0x5C, 0x67, 0x4B, + 0xAE, 0x5B, 0x5B, 0x42, 0x39, 0x5D, 0xA0, 0x43, 0x3B, 0x5E, 0x42, 0x52, + 0x06, 0x59, 0x09, 0x5E, 0xEB, 0x4D, 0x8A, 0x65, 0xA8, 0x40, 0xD3, 0x66, + 0x87, 0x35, 0x1F, 0x5E, 0xD9, 0x39, 0x76, 0x55, 0x43, 0x40, 0xF1, 0x4B, + 0x91, 0x44, 0xE2, 0x44, 0x5C, 0x52, 0x8D, 0x49, 0xE4, 0x58, 0x9E, 0x50, + 0xB0, 0x50, 0xBE, 0x4E, 0x3A, 0x48, 0x75, 0x4A, 0xC7, 0x3A, 0x07, 0x3F, + 0x5B, 0x2B, 0x6E, 0x2D, 0x29, 0x2A, 0x77, 0x27, 0x35, 0x2B, 0xAE, 0x28, + 0xCF, 0x29, 0x7B, 0x2A, 0x6F, 0x25, 0x0F, 0x2E, 0xD7, 0x15, 0xF2, 0x29, + 0x70, 0x08, 0xD2, 0x1B, 0x15, 0x06, 0x95, 0x0C, 0x92, 0x0D, 0xBC, 0x06, + 0x9B, 0x18, 0x36, 0x07, 0x5E, 0x1C, 0x68, 0x02, 0xF7, 0x19, 0x6D, 0xFC, + 0xC8, 0x1E, 0xB9, 0xFC, 0x44, 0x1F, 0xBA, 0xF6, 0x6F, 0x12, 0x0E, 0xE7, + 0x24, 0x0F, 0x77, 0xE2, 0x41, 0x0F, 0x99, 0xEA, 0x52, 0x0D, 0x21, 0xF4, + 0xC6, 0x0C, 0xC7, 0xFA, 0x71, 0x00, 0x49, 0xF7, 0xCA, 0xEE, 0x53, 0xEB, + 0xB4, 0xE9, 0x9E, 0xE1, 0x1F, 0xEB, 0x6D, 0xDA, 0x24, 0xEF, 0x86, 0xDB, + 0x41, 0xFA, 0x21, 0xED, 0x40, 0xFE, 0xE7, 0xFC, 0x0A, 0xFB, 0xE8, 0xFE, + 0x81, 0xF9, 0xBE, 0xFB, 0x3B, 0xEF, 0xE8, 0xED, 0xF5, 0xE7, 0xB9, 0xE2, + 0xAC, 0xE8, 0xA2, 0xE5, 0xD3, 0xE6, 0x85, 0xEB, 0x1A, 0xEC, 0xAC, 0xF1, + 0x6F, 0xF6, 0xC2, 0xF5, 0x25, 0x00, 0x6F, 0xF8, 0x1D, 0x03, 0xCC, 0xF7, + 0xDC, 0x02, 0x14, 0xF8, 0x99, 0x03, 0x73, 0xFB, 0x10, 0x0B, 0x62, 0xFF, + 0x49, 0x1F, 0x20, 0x08, 0xFA, 0x33, 0x58, 0x13, 0x91, 0x39, 0xEF, 0x1B, + 0xCE, 0x2D, 0xD1, 0x1E, 0x52, 0x21, 0xEC, 0x1B, 0xEC, 0x1C, 0x6B, 0x1C, + 0x46, 0x17, 0x3E, 0x1F, 0xBD, 0x15, 0x47, 0x27, 0x75, 0x1D, 0x81, 0x32, + 0x0F, 0x29, 0xF3, 0x37, 0x21, 0x31, 0x6E, 0x35, 0x2B, 0x2B, 0x8F, 0x2C, + 0x1F, 0x25, 0x0C, 0x27, 0x05, 0x2E, 0x92, 0x28, 0x44, 0x36, 0xC3, 0x28, + 0x06, 0x38, 0x9F, 0x23, 0x8B, 0x3C, 0x21, 0x27, 0xB1, 0x37, 0x3B, 0x2C, + 0xE1, 0x25, 0x7D, 0x28, 0xAE, 0x18, 0x3C, 0x27, 0x5E, 0x12, 0x20, 0x2A, + 0x0D, 0x10, 0x60, 0x2D, 0x04, 0x0C, 0x28, 0x2B, 0x35, 0x09, 0xAC, 0x25, + 0x73, 0x0F, 0x3E, 0x20, 0x5D, 0x11, 0x0B, 0x14, 0x96, 0x12, 0x4C, 0x0B, + 0xC1, 0x16, 0x6B, 0x0A, 0x64, 0x0D, 0xA7, 0x06, 0x7F, 0x00, 0x82, 0x02, + 0x72, 0x02, 0x94, 0x01, 0xD9, 0x06, 0x71, 0xFF, 0xB2, 0x01, 0x0D, 0xFA, + 0xAA, 0xF6, 0xA4, 0xF6, 0xBB, 0xE3, 0xDF, 0xF1, 0x52, 0xD5, 0x2E, 0xEC, + 0xA0, 0xD5, 0xFE, 0xEE, 0x22, 0xD3, 0xFA, 0xED, 0x46, 0xD6, 0xF5, 0xE8, + 0xD3, 0xDD, 0x91, 0xE7, 0xFE, 0xD7, 0xE5, 0xE0, 0x79, 0xD2, 0xE3, 0xDB, + 0x8E, 0xCC, 0x48, 0xD7, 0x13, 0xC1, 0xA1, 0xCA, 0x0C, 0xBB, 0x75, 0xC1, + 0xB2, 0xBF, 0xDE, 0xC1, 0xF0, 0xBD, 0xEF, 0xBC, 0x5C, 0xB7, 0xEE, 0xB5, + 0xB6, 0xB4, 0x51, 0xB7, 0x44, 0xAB, 0xE9, 0xB6, 0x6D, 0xA0, 0xD3, 0xB1, + 0x80, 0x9C, 0xCF, 0xAF, 0x1D, 0xA0, 0x8F, 0xAF, 0xCE, 0xA4, 0xE6, 0xAE, + 0x63, 0xAA, 0xD1, 0xB5, 0x9C, 0xB0, 0x5A, 0xC0, 0xB6, 0xAF, 0x34, 0xC0, + 0xF8, 0xAD, 0xFE, 0xBA, 0xB7, 0xB5, 0xBE, 0xBB, 0x1B, 0xB7, 0x1E, 0xB9, + 0x9F, 0xB2, 0xC1, 0xB4, 0xF4, 0xAF, 0xAE, 0xB4, 0x5C, 0xB0, 0xAA, 0xB7, + 0x1E, 0xB2, 0x60, 0xBA, 0x18, 0xAD, 0xDE, 0xBD, 0x57, 0xA5, 0x4D, 0xBF, + 0xC6, 0xA1, 0xB9, 0xC0, 0x66, 0xA8, 0x24, 0xC7, 0x19, 0xB5, 0x9A, 0xCB, + 0x0F, 0xBD, 0xAD, 0xD1, 0x21, 0xBF, 0x75, 0xD6, 0xA2, 0xC2, 0x68, 0xD4, + 0xAF, 0xC7, 0x77, 0xCD, 0xB2, 0xCB, 0x7A, 0xC5, 0xCF, 0xCC, 0xB8, 0xC0, + 0xE8, 0xC6, 0x86, 0xBF, 0x17, 0xC0, 0xCF, 0xC2, 0x5D, 0xBC, 0xDF, 0xC4, + 0xBC, 0xB6, 0x80, 0xC1, 0xD2, 0xB3, 0x19, 0xBF, 0xF1, 0xB3, 0x9A, 0xBB, + 0x3F, 0xB2, 0x2E, 0xB4, 0x92, 0xB1, 0x5F, 0xAD, 0xEF, 0xB4, 0xDC, 0xAE, + 0x62, 0xB9, 0xBA, 0xB4, 0x96, 0xBE, 0x23, 0xB6, 0x96, 0xC0, 0x65, 0xB7, + 0xFF, 0xBD, 0xEC, 0xBA, 0x3A, 0xC2, 0xA2, 0xC1, 0x94, 0xC6, 0x6F, 0xC6, + 0x5F, 0xC1, 0x3E, 0xC6, 0x26, 0xB8, 0xE8, 0xC8, 0xFB, 0xAA, 0xB9, 0xCA, + 0x7C, 0xA1, 0xFB, 0xC2, 0xD5, 0xA3, 0x5E, 0xBA, 0xB2, 0xAA, 0xD8, 0xB8, + 0xAE, 0xAC, 0x9C, 0xB5, 0x49, 0xAB, 0xF0, 0xB1, 0xAC, 0xAF, 0x9A, 0xB4, + 0x58, 0xB7, 0x82, 0xB4, 0x8D, 0xB8, 0xC7, 0xAC, 0x69, 0xB4, 0x1C, 0xAB, + 0xA5, 0xAE, 0x09, 0xAF, 0x9F, 0xA7, 0x1F, 0xAD, 0x47, 0xA6, 0xE4, 0xAB, + 0x24, 0xAB, 0x7A, 0xB0, 0xCE, 0xA8, 0x01, 0xB0, 0x1C, 0xA3, 0x36, 0xAB, + 0xB3, 0xA0, 0xC8, 0xA8, 0x62, 0xA3, 0x34, 0xA9, 0xAC, 0xA6, 0xC6, 0xAB, + 0xF7, 0xA4, 0x0C, 0xAE, 0x6C, 0xA7, 0xB1, 0xB5, 0x02, 0xAF, 0x87, 0xBD, + 0xAE, 0xB3, 0xF1, 0xBA, 0x77, 0xBA, 0x76, 0xB6, 0x25, 0xC1, 0x43, 0xB4, + 0x2D, 0xBE, 0x14, 0xAF, 0xC3, 0xB7, 0xA5, 0xA7, 0xEE, 0xB2, 0xCE, 0xA4, + 0xC3, 0xB2, 0x28, 0xAC, 0xAD, 0xAF, 0xED, 0xB5, 0x89, 0xAB, 0xB9, 0xBE, + 0x72, 0xB0, 0x14, 0xC8, 0x80, 0xB6, 0x1C, 0xCD, 0x72, 0xBD, 0x2F, 0xD0, + 0xB9, 0xCE, 0xCB, 0xD1, 0xA9, 0xE4, 0x22, 0xCF, 0xD0, 0xF5, 0x11, 0xCF, + 0x2D, 0x03, 0x0D, 0xD3, 0x7F, 0x0B, 0x5C, 0xD9, 0x50, 0x0E, 0x19, 0xE4, + 0x40, 0x0E, 0xBC, 0xEC, 0xBC, 0x0D, 0xA3, 0xF1, 0xC3, 0x0E, 0x74, 0xFB, + 0x8C, 0x0D, 0xD7, 0x05, 0xA9, 0x08, 0xAD, 0x07, 0x4A, 0x06, 0xEE, 0x07, + 0x98, 0x06, 0x65, 0x0C, 0x67, 0x08, 0x43, 0x11, 0xFF, 0x12, 0x19, 0x1A, + 0xE6, 0x24, 0xF3, 0x29, 0x2C, 0x34, 0x12, 0x3A, 0x26, 0x41, 0xF2, 0x44, + 0x56, 0x4B, 0xBB, 0x48, 0xD6, 0x4D, 0xF4, 0x44, 0xF2, 0x4B, 0x68, 0x3F, + 0x6F, 0x4B, 0x87, 0x3C, 0xBE, 0x48, 0xEB, 0x39, 0xD9, 0x42, 0x5E, 0x3D, + 0x45, 0x3E, 0x00, 0x41, 0xF5, 0x40, 0x0F, 0x3E, 0xB0, 0x48, 0xD5, 0x3E, + 0x43, 0x47, 0x88, 0x40, 0x3B, 0x46, 0xDF, 0x41, 0xB5, 0x4D, 0xB0, 0x47, + 0x12, 0x52, 0xA5, 0x49, 0x9D, 0x55, 0xAF, 0x46, 0x9C, 0x57, 0x3C, 0x43, + 0x57, 0x50, 0xFB, 0x3A, 0xE0, 0x4B, 0x3C, 0x38, 0xCC, 0x48, 0x8C, 0x39, + 0x3B, 0x41, 0xB1, 0x35, 0x1C, 0x3D, 0x0C, 0x36, 0x69, 0x34, 0x8F, 0x31, + 0xC2, 0x2C, 0xB3, 0x24, 0x2D, 0x2C, 0x2A, 0x1A, 0xCC, 0x2A, 0x3D, 0x16, + 0x43, 0x2C, 0xA3, 0x15, 0x35, 0x37, 0xCC, 0x18, 0x9E, 0x40, 0x42, 0x1E, + 0x49, 0x3E, 0xD1, 0x1E, 0x83, 0x37, 0x53, 0x21, 0xCB, 0x2D, 0x9A, 0x21, + 0x75, 0x25, 0xE9, 0x1C, 0xD8, 0x24, 0xC7, 0x19, 0x28, 0x21, 0xDA, 0x13, + 0x7D, 0x1B, 0x87, 0x0F, 0x3A, 0x18, 0x07, 0x11, 0x7C, 0x10, 0x32, 0x10, + 0x5A, 0x08, 0x98, 0x0D, 0x38, 0x04, 0x7E, 0x0F, 0xFA, 0x02, 0x46, 0x12, + 0x46, 0x09, 0xCC, 0x11, 0x6A, 0x1B, 0x39, 0x0F, 0x22, 0x2C, 0x4D, 0x10, + 0xD1, 0x2E, 0x31, 0x12, 0xFE, 0x2D, 0xBC, 0x0F, 0xCA, 0x2A, 0x44, 0x06, + 0x01, 0x21, 0x01, 0xF9, 0x31, 0x1A, 0x0A, 0xF7, 0xC9, 0x11, 0x93, 0x00, + 0x3A, 0x08, 0xD9, 0x0B, 0xF5, 0x05, 0x40, 0x0D, 0xC9, 0x0B, 0xFF, 0x09, + 0x5E, 0x0F, 0xE6, 0x06, 0xE5, 0x10, 0xE4, 0x03, 0xBD, 0x18, 0x3E, 0x06, + 0xC7, 0x21, 0x8E, 0x08, 0xCD, 0x26, 0x50, 0x0A, 0x1D, 0x2E, 0x52, 0x12, + 0x7A, 0x36, 0x6D, 0x17, 0x2A, 0x37, 0x7C, 0x12, 0x4A, 0x35, 0xEC, 0x10, + 0xF0, 0x32, 0x47, 0x11, 0xE9, 0x32, 0x19, 0x10, 0x91, 0x36, 0x87, 0x14, + 0xDC, 0x3A, 0xE0, 0x1F, 0xE6, 0x35, 0x46, 0x27, 0x7C, 0x2E, 0x4C, 0x26, + 0x94, 0x2F, 0xF8, 0x24, 0x55, 0x2B, 0xD2, 0x23, 0xEF, 0x21, 0x40, 0x27, + 0xA4, 0x23, 0xCB, 0x30, 0xC1, 0x2C, 0xE3, 0x34, 0x12, 0x32, 0x8C, 0x33, + 0x8A, 0x34, 0xDF, 0x2F, 0xA9, 0x39, 0xB6, 0x2B, 0xDE, 0x3D, 0x24, 0x29, + 0x07, 0x39, 0x3A, 0x24, 0x0D, 0x32, 0x28, 0x1E, 0xD4, 0x28, 0xC7, 0x1C, + 0x51, 0x1D, 0x63, 0x22, 0xD7, 0x1D, 0x98, 0x28, 0x8A, 0x29, 0x02, 0x2D, + 0xDB, 0x2A, 0xE9, 0x2C, 0x15, 0x24, 0x6F, 0x23, 0x2A, 0x27, 0x8D, 0x1C, + 0x55, 0x2C, 0xD4, 0x1A, 0xB3, 0x25, 0xC9, 0x14, 0x9A, 0x21, 0x4A, 0x13, + 0xF9, 0x29, 0x30, 0x16, 0x24, 0x2D, 0x11, 0x14, 0x8A, 0x26, 0xB0, 0x14, + 0xE8, 0x1C, 0xF9, 0x15, 0xD6, 0x1B, 0x09, 0x12, 0x36, 0x1C, 0x4E, 0x12, + 0x83, 0x14, 0x8B, 0x16, 0xF8, 0x11, 0xB1, 0x1D, 0x9D, 0x0E, 0x2E, 0x1F, + 0xC3, 0x05, 0xAE, 0x19, 0x95, 0x08, 0x7A, 0x1B, 0x5C, 0x11, 0xBF, 0x1F, + 0x0A, 0x14, 0xD0, 0x1F, 0xBA, 0x16, 0xBA, 0x1C, 0x41, 0x19, 0x45, 0x18, + 0x68, 0x17, 0x38, 0x0E, 0x3C, 0x12, 0x1C, 0x04, 0x7F, 0x08, 0x79, 0x00, + 0xCD, 0xF6, 0x0C, 0xFE, 0x17, 0xEC, 0xD2, 0x00, 0x0F, 0xEB, 0x21, 0x07, + 0xA2, 0xE7, 0xB3, 0x07, 0xFA, 0xE1, 0xAA, 0xFF, 0x41, 0xDB, 0xCB, 0xF5, + 0xFC, 0xDA, 0xB9, 0xF2, 0x5F, 0xE2, 0xD0, 0xF4, 0x1E, 0xE8, 0xC4, 0xF6, + 0xFB, 0xEC, 0xD2, 0xFA, 0x95, 0xF2, 0x4E, 0xFC, 0x8A, 0xF4, 0x51, 0xF8, + 0x3D, 0xF4, 0x56, 0xF7, 0x21, 0xF2, 0x1A, 0xF8, 0xC3, 0xEE, 0xDE, 0xFB, + 0x76, 0xEC, 0x47, 0x01, 0xE0, 0xF2, 0x4E, 0x09, 0x71, 0xF8, 0x88, 0x15, + 0xCE, 0xF5, 0x0F, 0x19, 0xE6, 0xF6, 0x0D, 0x12, 0x70, 0xF8, 0x56, 0x0C, + 0x0C, 0xF5, 0xCF, 0x0E, 0xCF, 0xF4, 0x9A, 0x16, 0x14, 0xFD, 0xC2, 0x1D, + 0xC3, 0x02, 0xBA, 0x1D, 0x69, 0x06, 0x8D, 0x1D, 0x43, 0x05, 0x7E, 0x1D, + 0x2A, 0x02, 0x3E, 0x1D, 0x1E, 0xFE, 0x9F, 0x16, 0x76, 0xFB, 0x60, 0x0E, + 0x43, 0xF9, 0xAB, 0x0B, 0x60, 0xF0, 0xCD, 0x07, 0xF6, 0xEE, 0xE2, 0x06, + 0xA3, 0xF0, 0x67, 0x00, 0xFF, 0xEF, 0x63, 0xF7, 0xBC, 0xF8, 0xEF, 0xF7, + 0x1C, 0x02, 0xB6, 0xFB, 0x41, 0x05, 0xB1, 0x01, 0xA3, 0x03, 0x74, 0x04, + 0x85, 0xFD, 0x26, 0xFD, 0xB9, 0xF6, 0x4B, 0xF4, 0x70, 0xF0, 0x31, 0xEF, + 0xF0, 0xEB, 0xF9, 0xF2, 0x34, 0xEE, 0x33, 0x01, 0x13, 0xF1, 0x50, 0x0A, + 0xA8, 0xF0, 0x2F, 0x0D, 0x5D, 0xEB, 0xC5, 0x0C, 0xF5, 0xDE, 0x06, 0x0A, + 0x06, 0xCF, 0x7E, 0x05, 0xF4, 0xC6, 0xA4, 0xFF, 0x89, 0xCF, 0xBA, 0xFF, + 0xA0, 0xD7, 0x3F, 0x01, 0x9E, 0xE0, 0x54, 0xFE, 0x25, 0xEC, 0x1A, 0xF6, + 0x3D, 0xE6, 0xCB, 0xE5, 0x49, 0xD8, 0x12, 0xD6, 0x9F, 0xCE, 0xAE, 0xCD, + 0xC8, 0xC7, 0x49, 0xC9, 0x4A, 0xC5, 0x98, 0xC7, 0x81, 0xC9, 0x74, 0xC9, + 0x6D, 0xCE, 0xDB, 0xC8, 0x17, 0xD0, 0xEE, 0xC3, 0xBA, 0xCD, 0xF4, 0xC1, + 0xC3, 0xC2, 0x88, 0xC1, 0xD6, 0xB9, 0x82, 0xC0, 0x9A, 0xBB, 0x66, 0xC0, + 0xB9, 0xBD, 0xA1, 0xBF, 0x4F, 0xC3, 0xA4, 0xC1, 0x63, 0xCB, 0x48, 0xC4, + 0x92, 0xC7, 0x63, 0xBF, 0xDB, 0xC0, 0xD0, 0xBA, 0xEA, 0xBF, 0xB4, 0xBC, + 0x1D, 0xC1, 0xE9, 0xBF, 0x29, 0xC0, 0xA2, 0xC3, 0x90, 0xBB, 0x5C, 0xC8, + 0xFB, 0xB3, 0x52, 0xCC, 0x26, 0xAD, 0x57, 0xCF, 0x12, 0xAE, 0xD7, 0xD6, + 0x75, 0xAF, 0xA4, 0xDB, 0xB5, 0xB3, 0xAC, 0xDC, 0xB5, 0xBD, 0x26, 0xE2, + 0xE2, 0xC2, 0x5E, 0xE5, 0xB4, 0xC9, 0x8E, 0xE4, 0x3E, 0xCC, 0xC1, 0xE3, + 0x03, 0xC5, 0x03, 0xE3, 0xC9, 0xC4, 0x54, 0xE2, 0x13, 0xD2, 0x10, 0xE3, + 0x4A, 0xDF, 0x46, 0xE6, 0x1B, 0xE6, 0x9D, 0xEB, 0xF4, 0xEC, 0x40, 0xF2, + 0xD8, 0xF6, 0x21, 0xF8, 0x72, 0x00, 0x62, 0xF9, 0x91, 0xFF, 0x74, 0xFC, + 0xC0, 0xFB, 0xB6, 0x04, 0x97, 0xFE, 0xEA, 0x08, 0xAE, 0x02, 0x6E, 0x08, + 0x5A, 0x05, 0x1A, 0x0C, 0x97, 0x08, 0xBD, 0x14, 0x0F, 0x08, 0xBE, 0x15, + 0x6E, 0x05, 0x29, 0x0C, 0xFC, 0x02, 0xA5, 0x02, 0x6D, 0xFC, 0x0E, 0xFD, + 0xFA, 0xF8, 0x29, 0xFA, 0x70, 0x02, 0xF9, 0xFE, 0x82, 0x0C, 0x48, 0x08, + 0x88, 0x0C, 0x4F, 0x0E, 0xC8, 0x06, 0xD8, 0x0D, 0x1C, 0x01, 0x5A, 0x0B, + 0xC8, 0x01, 0xED, 0x09, 0x83, 0x07, 0xFA, 0x05, 0x8E, 0x0C, 0xD3, 0x03, + 0x31, 0x10, 0xB4, 0x06, 0x26, 0x13, 0xF8, 0x08, 0x8A, 0x12, 0xD0, 0x07, + 0x63, 0x0A, 0x0C, 0x04, 0x8A, 0xFA, 0x83, 0xFE, 0x4B, 0xEE, 0x45, 0xF8, + 0xCD, 0xE9, 0xED, 0xF4, 0x4F, 0xEC, 0xCC, 0xF8, 0x09, 0xF7, 0x67, 0xFD, + 0x51, 0x00, 0x51, 0xFD, 0xF3, 0xFE, 0xBB, 0xFA, 0x9B, 0xF3, 0x17, 0xF5, + 0xC4, 0xEF, 0xD8, 0xE9, 0x88, 0xF8, 0xA5, 0xDE, 0x81, 0x02, 0x1F, 0xE0, + 0xEF, 0x04, 0x5F, 0xEB, 0x11, 0x03, 0x65, 0xF5, 0xA7, 0x03, 0xBD, 0xF6, + 0xC6, 0xFC, 0x3C, 0xEC, 0x41, 0xF3, 0x84, 0xDD, 0x2F, 0xED, 0x00, 0xD4, + 0x9C, 0xEA, 0x84, 0xD1, 0x19, 0xED, 0xFC, 0xD1, 0x37, 0xEE, 0x23, 0xD5, + 0x96, 0xEC, 0x2C, 0xD9, 0x1F, 0xE6, 0xEB, 0xD6, 0x04, 0xE1, 0x3D, 0xD2, + 0x69, 0xE0, 0x37, 0xD2, 0x87, 0xE1, 0x8B, 0xD4, 0xC9, 0xE7, 0x32, 0xD6, + 0xA2, 0xEC, 0xAD, 0xD2, 0x9D, 0xED, 0x14, 0xCD, 0x0B, 0xEC, 0x18, 0xCD, + 0x7D, 0xE9, 0x5C, 0xCB, 0xD6, 0xEA, 0x01, 0xCA, 0x7D, 0xEB, 0xA6, 0xCE, + 0xED, 0xE6, 0xF3, 0xD2, 0x82, 0xEB, 0x26, 0xDA, 0x79, 0xF8, 0xC0, 0xDF, + 0x45, 0x06, 0x14, 0xE2, 0xD6, 0x0D, 0x24, 0xE2, 0xEA, 0x0A, 0x2F, 0xE3, + 0x59, 0x06, 0x87, 0xE7, 0x93, 0x05, 0x00, 0xEC, 0xE2, 0x0E, 0xFC, 0xF2, + 0xA6, 0x17, 0x24, 0xFA, 0xBE, 0x1F, 0x25, 0x03, 0xFB, 0x26, 0xA0, 0x08, + 0x24, 0x23, 0x3C, 0x09, 0x08, 0x1A, 0xFA, 0x07, 0xE1, 0x18, 0xE3, 0x0A, + 0xEB, 0x1C, 0x48, 0x12, 0xC0, 0x1E, 0x72, 0x1B, 0xE6, 0x21, 0x03, 0x29, + 0x1A, 0x2D, 0x71, 0x35, 0x13, 0x39, 0x0B, 0x36, 0x0D, 0x3B, 0xBD, 0x2E, + 0xED, 0x35, 0xD4, 0x2D, 0x1D, 0x31, 0xC4, 0x2C, 0xE2, 0x30, 0xF5, 0x29, + 0xB9, 0x33, 0xB4, 0x2C, 0xB3, 0x36, 0x0D, 0x30, 0x07, 0x32, 0x24, 0x2F, + 0x8B, 0x27, 0xD3, 0x26, 0x14, 0x1F, 0x64, 0x1D, 0xF4, 0x18, 0xB6, 0x18, + 0x12, 0x16, 0x4E, 0x18, 0xCA, 0x1C, 0x3B, 0x21, 0x10, 0x2B, 0x4A, 0x2C, + 0x63, 0x37, 0x50, 0x2B, 0x6C, 0x41, 0x0D, 0x21, 0x29, 0x42, 0x6F, 0x17, + 0x79, 0x3B, 0x2C, 0x14, 0xAB, 0x35, 0xD3, 0x14, 0xB2, 0x32, 0xD4, 0x17, + 0xE7, 0x32, 0x7C, 0x1B, 0x46, 0x34, 0xBC, 0x1A, 0x3F, 0x35, 0x36, 0x15, + 0xC7, 0x31, 0x02, 0x11, 0xF9, 0x2A, 0xF4, 0x10, 0xF9, 0x25, 0x75, 0x14, + 0x6F, 0x21, 0x51, 0x19, 0x05, 0x1F, 0x10, 0x1C, 0x22, 0x22, 0x1A, 0x1A, + 0x14, 0x25, 0xB3, 0x17, 0xDD, 0x25, 0xC1, 0x19, 0x81, 0x26, 0xDB, 0x1D, + 0x65, 0x27, 0x4C, 0x22, 0x36, 0x29, 0xDA, 0x21, 0x90, 0x26, 0x22, 0x20, + 0x1C, 0x21, 0x5C, 0x25, 0x09, 0x1B, 0x8E, 0x24, 0x0C, 0x15, 0x90, 0x18, + 0x36, 0x10, 0x79, 0x0F, 0x94, 0x08, 0x88, 0x10, 0x7E, 0x03, 0x52, 0x15, + 0xBD, 0x03, 0x25, 0x13, 0x8B, 0x09, 0x51, 0x0E, 0xDC, 0x13, 0x6D, 0x11, + 0x3D, 0x1E, 0xC6, 0x13, 0xCD, 0x25, 0x3B, 0x11, 0xFD, 0x22, 0x4F, 0x0D, + 0x5B, 0x1E, 0x26, 0x0B, 0x16, 0x22, 0xE0, 0x12, 0xEE, 0x24, 0x33, 0x1E, + 0xF0, 0x22, 0xAB, 0x23, 0xC9, 0x1F, 0x3E, 0x21, 0x2A, 0x1E, 0xCE, 0x1F, + 0x14, 0x21, 0xD5, 0x26, 0x29, 0x27, 0xA2, 0x2F, 0xD5, 0x2C, 0x04, 0x33, + 0x1F, 0x32, 0x8D, 0x32, 0x22, 0x3B, 0x59, 0x33, 0xAA, 0x4B, 0xAF, 0x38, + 0xA3, 0x5A, 0x93, 0x41, 0xB6, 0x5D, 0x71, 0x48, 0xBE, 0x55, 0x4E, 0x4A, + 0x5E, 0x4C, 0x6B, 0x48, 0xE9, 0x49, 0x4F, 0x4B, 0x12, 0x49, 0x64, 0x54, + 0xA3, 0x44, 0x27, 0x59, 0x1D, 0x3F, 0xDA, 0x55, 0xA5, 0x3C, 0x11, 0x51, + 0x5C, 0x37, 0xFD, 0x4F, 0x4E, 0x31, 0xD3, 0x4F, 0xD1, 0x2C, 0xB4, 0x4B, + 0xE2, 0x29, 0x9E, 0x46, 0x94, 0x2C, 0x84, 0x43, 0x2D, 0x33, 0x24, 0x40, + 0x14, 0x3F, 0x4C, 0x3A, 0x24, 0x49, 0x88, 0x32, 0xA6, 0x49, 0x50, 0x2A, + 0xC4, 0x42, 0x32, 0x24, 0x23, 0x39, 0x18, 0x25, 0xBE, 0x32, 0x56, 0x2F, + 0x29, 0x2F, 0x44, 0x3C, 0xC3, 0x2D, 0xEF, 0x41, 0x2A, 0x2C, 0x0E, 0x3E, + 0x78, 0x28, 0x50, 0x34, 0x1E, 0x21, 0x60, 0x28, 0xCB, 0x15, 0xAE, 0x1F, + 0x29, 0x08, 0x65, 0x1A, 0x35, 0xFC, 0x16, 0x16, 0x89, 0xFD, 0x73, 0x15, + 0x73, 0x0C, 0x78, 0x1D, 0x07, 0x18, 0x7D, 0x21, 0x19, 0x17, 0xA6, 0x19, + 0xAA, 0x0A, 0xD3, 0x0D, 0xC7, 0xFA, 0x16, 0x04, 0xC0, 0xF4, 0xD8, 0x02, + 0xAD, 0xF7, 0x06, 0x04, 0x6B, 0xF9, 0x44, 0x01, 0x2B, 0xF4, 0x61, 0xFA, + 0x8A, 0xEF, 0x22, 0xF8, 0x85, 0xF3, 0x39, 0xFB, 0x0C, 0xF1, 0x76, 0xF7, + 0x0D, 0xE9, 0xF9, 0xF4, 0x43, 0xEA, 0xB3, 0xF4, 0x5F, 0xEE, 0xDD, 0xEC, + 0x59, 0xEC, 0xC3, 0xE1, 0x36, 0xE4, 0xB6, 0xD9, 0x1F, 0xDF, 0x72, 0xD7, + 0x8F, 0xDC, 0xE0, 0xD9, 0x52, 0xDE, 0xA4, 0xDE, 0x8A, 0xDE, 0x56, 0xE1, + 0xA0, 0xD4, 0xEA, 0xE6, 0xF8, 0xC8, 0x5F, 0xEB, 0x40, 0xC1, 0x81, 0xE8, + 0xA2, 0xBB, 0xB5, 0xE3, 0x51, 0xB6, 0x87, 0xE4, 0x4F, 0xB9, 0x7E, 0xEC, + 0x77, 0xC5, 0xE6, 0xF1, 0x72, 0xD6, 0x79, 0xF2, 0xE0, 0xDF, 0x1C, 0xED, + 0xD6, 0xDB, 0x69, 0xE4, 0xBF, 0xD8, 0xBF, 0xDD, 0x4A, 0xDA, 0x26, 0xDD, + 0x3E, 0xDA, 0xDE, 0xE1, 0x26, 0xD8, 0xC6, 0xE7, 0x2A, 0xD5, 0x75, 0xED, + 0x4C, 0xD4, 0x70, 0xF0, 0xCD, 0xD8, 0x82, 0xEE, 0xFA, 0xE1, 0xF6, 0xED, + 0x25, 0xE9, 0x7C, 0xF2, 0x33, 0xEE, 0xA1, 0xF7, 0x5A, 0xF6, 0x2C, 0x00, + 0x0D, 0xFE, 0x65, 0x08, 0xA1, 0x06, 0x07, 0x0A, 0xBA, 0x10, 0x6C, 0x07, + 0x18, 0x18, 0x88, 0x09, 0x7E, 0x13, 0x8E, 0x0E, 0x43, 0x07, 0xEA, 0x16, + 0xB8, 0xFC, 0xE3, 0x1F, 0xAE, 0xF1, 0x0C, 0x1D, 0xF0, 0xE6, 0xCF, 0x12, + 0x18, 0xE2, 0x48, 0x0B, 0xE6, 0xE4, 0x03, 0x04, 0xB1, 0xEB, 0x1D, 0x00, + 0x0E, 0xF1, 0xDA, 0x05, 0x1E, 0xF2, 0x9D, 0x0F, 0xFB, 0xEF, 0x88, 0x12, + 0xDF, 0xF1, 0x26, 0x0C, 0x45, 0xFA, 0x39, 0x03, 0xBD, 0xFC, 0xA9, 0xFC, + 0x4E, 0xF6, 0x13, 0xFC, 0x7D, 0xEE, 0x74, 0xFE, 0x0B, 0xE3, 0x8B, 0xFC, + 0x74, 0xD5, 0x1E, 0xF3, 0xC4, 0xCD, 0x09, 0xEA, 0x86, 0xC7, 0x3C, 0xE6, + 0xDB, 0xC3, 0xDF, 0xE6, 0x66, 0xC7, 0xC9, 0xEA, 0x5D, 0xCB, 0xA5, 0xEC, + 0x69, 0xCD, 0x76, 0xE8, 0xFE, 0xCF, 0x84, 0xDE, 0xB1, 0xCE, 0xE2, 0xD4, + 0x0D, 0xC9, 0x3B, 0xCF, 0xC0, 0xC5, 0x45, 0xCA, 0x66, 0xCA, 0x82, 0xC5, + 0x2F, 0xD3, 0x1B, 0xC4, 0x5C, 0xD7, 0xBE, 0xC7, 0x3E, 0xD4, 0x10, 0xCC, + 0xA7, 0xCA, 0x7C, 0xCA, 0x0F, 0xC3, 0x73, 0xC6, 0x62, 0xC2, 0xFB, 0xC5, + 0x0F, 0xC3, 0x89, 0xC9, 0x91, 0xC0, 0xB7, 0xCB, 0x98, 0xC0, 0xAC, 0xCA, + 0xFE, 0xC3, 0x03, 0xC6, 0x39, 0xC9, 0xFC, 0xBC, 0x35, 0xCD, 0x2E, 0xB3, + 0x3C, 0xCA, 0x6A, 0xAD, 0x7B, 0xC7, 0x8E, 0xAB, 0x61, 0xCB, 0x05, 0xAC, + 0x20, 0xCC, 0x90, 0xAE, 0x77, 0xC1, 0xDE, 0xAE, 0xE8, 0xB4, 0x6A, 0xB0, + 0x42, 0xAB, 0x1C, 0xB5, 0xFF, 0xA9, 0xE7, 0xB8, 0xF3, 0xB7, 0xE8, 0xBE, + 0x9B, 0xCA, 0x2F, 0xCA, 0x37, 0xD4, 0x9F, 0xD6, 0x7C, 0xDB, 0x45, 0xE2, + 0x85, 0xE6, 0xE4, 0xE8, 0x77, 0xEB, 0x0A, 0xE7, 0x2A, 0xED, 0x36, 0xEA, + 0x97, 0xED, 0x42, 0xF3, 0xBF, 0xEE, 0xE9, 0xF9, 0x22, 0xF2, 0x89, 0xFD, + 0xF5, 0xF4, 0x29, 0xFE, 0x14, 0xF8, 0x59, 0xFD, 0x45, 0xFC, 0xEA, 0xF8, + 0x09, 0x04, 0x51, 0xF5, 0x03, 0x0B, 0x7D, 0xF7, 0x32, 0x15, 0x48, 0x01, + 0xA2, 0x1F, 0xF6, 0x0C, 0xE4, 0x23, 0x66, 0x17, 0x87, 0x25, 0xF2, 0x1D, + 0xC7, 0x25, 0x14, 0x1C, 0x04, 0x23, 0xAE, 0x18, 0x27, 0x1E, 0x0C, 0x17, + 0xC7, 0x1D, 0x72, 0x18, 0x8B, 0x20, 0xBD, 0x1C, 0xB6, 0x21, 0xC9, 0x1E, + 0x15, 0x1E, 0x6B, 0x1A, 0xBD, 0x1A, 0xC8, 0x11, 0x6B, 0x1A, 0x8F, 0x0A, + 0xF1, 0x15, 0x8E, 0x08, 0x1D, 0x18, 0xF4, 0x0D, 0xD6, 0x22, 0xF0, 0x14, + 0x1B, 0x24, 0x4F, 0x17, 0x88, 0x20, 0x3F, 0x15, 0xF2, 0x20, 0xF4, 0x0E, + 0xFF, 0x20, 0xB9, 0x09, 0x62, 0x1E, 0xE9, 0x05, 0x7E, 0x1C, 0x16, 0x02, + 0x69, 0x1C, 0x0E, 0x04, 0x67, 0x1D, 0x0D, 0x0A, 0xC1, 0x1C, 0xAB, 0x11, + 0xCB, 0x14, 0x3F, 0x17, 0x94, 0x0B, 0xA3, 0x13, 0xAA, 0x07, 0x03, 0x0D, + 0xF2, 0x04, 0x35, 0x0A, 0x33, 0x04, 0x15, 0x06, 0x87, 0x06, 0x33, 0xFD, + 0x57, 0x0B, 0xBC, 0xF6, 0x07, 0x11, 0x71, 0xF1, 0xED, 0x11, 0x41, 0xEB, + 0x5D, 0x0E, 0x34, 0xEA, 0xD1, 0x0A, 0x53, 0xED, 0x14, 0x08, 0xBE, 0xEE, + 0x0F, 0x09, 0x60, 0xEE, 0xDA, 0x09, 0xBC, 0xEE, 0x3F, 0xFF, 0xDA, 0xE8, + 0xDE, 0xEB, 0xC9, 0xDB, 0x55, 0xDB, 0x83, 0xD1, 0xA7, 0xD1, 0xFB, 0xCC, + 0xE2, 0xCE, 0x10, 0xCB, 0x08, 0xCF, 0xCD, 0xC9, 0x19, 0xD2, 0x4C, 0xCB, + 0xCE, 0xDA, 0x0C, 0xD0, 0x96, 0xE2, 0xF9, 0xD1, 0x03, 0xE6, 0xA9, 0xCC, + 0x98, 0xE2, 0x35, 0xC5, 0x6C, 0xDE, 0x91, 0xC4, 0x4A, 0xE2, 0x8F, 0xCA, + 0x75, 0xEC, 0xBC, 0xD4, 0x7A, 0xF6, 0xEF, 0xDF, 0xD1, 0xF9, 0xCB, 0xE6, + 0x08, 0xF5, 0xD2, 0xE9, 0xC1, 0xEC, 0x53, 0xEC, 0xBF, 0xE9, 0x21, 0xF2, + 0x71, 0xEC, 0xB7, 0xF3, 0xA6, 0xF3, 0xDD, 0xED, 0x58, 0x01, 0xFE, 0xEC, + 0x0D, 0x0D, 0xB9, 0xF4, 0x6E, 0x12, 0x8C, 0x01, 0x9B, 0x10, 0x31, 0x09, + 0x5E, 0x0E, 0xF7, 0x09, 0x83, 0x15, 0x7B, 0x0A, 0x02, 0x22, 0x73, 0x11, + 0x40, 0x2C, 0x8C, 0x1D, 0x57, 0x32, 0x37, 0x24, 0xC4, 0x2C, 0xAA, 0x1F, + 0xD3, 0x1B, 0x5C, 0x17, 0xA6, 0x0F, 0xD9, 0x15, 0x2E, 0x08, 0xBC, 0x12, + 0x02, 0x00, 0x43, 0x07, 0x44, 0x03, 0x0D, 0x04, 0xAC, 0x0D, 0x07, 0x0F, + 0xBA, 0x0F, 0x28, 0x18, 0xF7, 0x0F, 0xE2, 0x18, 0x98, 0x18, 0x32, 0x17, + 0x00, 0x21, 0xA9, 0x12, 0x8E, 0x25, 0x8A, 0x10, 0x33, 0x2A, 0x4D, 0x18, + 0x6D, 0x2B, 0xA3, 0x22, 0x1E, 0x25, 0x5C, 0x26, 0x8A, 0x19, 0x29, 0x23, + 0xCF, 0x0E, 0xBA, 0x1C, 0x8B, 0x07, 0x67, 0x10, 0xB4, 0x08, 0x1C, 0x04, + 0x52, 0x10, 0xCF, 0xFF, 0xE0, 0x16, 0x50, 0xFD, 0x70, 0x1B, 0x18, 0x00, + 0x11, 0x1D, 0xA9, 0x0A, 0xE6, 0x1C, 0x0F, 0x12, 0xFC, 0x1A, 0x83, 0x14, + 0xFB, 0x16, 0xA4, 0x17, 0xE0, 0x11, 0xCF, 0x18, 0xD3, 0x0E, 0xF9, 0x1A, + 0x4E, 0x10, 0x9E, 0x1F, 0xC7, 0x10, 0x75, 0x1C, 0xD3, 0x09, 0xD7, 0x0F, + 0x74, 0xFF, 0x07, 0x03, 0xDE, 0xFB, 0x72, 0xFA, 0x8B, 0xFC, 0xB5, 0xF2, + 0x87, 0xFD, 0xA4, 0xEE, 0x3E, 0x02, 0x3C, 0xEE, 0x2A, 0x09, 0xFC, 0xF0, + 0xA7, 0x0A, 0x71, 0xF4, 0xCC, 0x06, 0x2E, 0xF1, 0xCE, 0x02, 0xC2, 0xEC, + 0x33, 0xFB, 0xB1, 0xEA, 0xCF, 0xF7, 0xD5, 0xEE, 0x0F, 0xFD, 0x21, 0xFC, + 0xD8, 0xFE, 0xBB, 0x09, 0xC1, 0xFD, 0x2A, 0x10, 0xC3, 0xFE, 0x5C, 0x0F, + 0x60, 0xFE, 0x1C, 0x0B, 0xE0, 0xF8, 0xC8, 0x02, 0x1D, 0xEF, 0xB0, 0xF8, + 0xA5, 0xE6, 0xD5, 0xF2, 0x0A, 0xE5, 0x4A, 0xF5, 0x48, 0xEC, 0x98, 0x00, + 0xC4, 0xF8, 0x73, 0x0E, 0xBF, 0x04, 0xF4, 0x16, 0xE1, 0x10, 0x7E, 0x1A, + 0x20, 0x19, 0xDD, 0x1D, 0xBF, 0x17, 0x3B, 0x1F, 0x56, 0x15, 0x9B, 0x1F, + 0x56, 0x19, 0x61, 0x22, 0xDF, 0x24, 0x09, 0x26, 0xAD, 0x2D, 0x8C, 0x27, + 0x84, 0x2D, 0x60, 0x26, 0x46, 0x2A, 0xDD, 0x1F, 0xE0, 0x28, 0x79, 0x1B, + 0x40, 0x27, 0x3A, 0x21, 0x09, 0x25, 0xAB, 0x28, 0x3B, 0x29, 0x26, 0x2C, + 0xFA, 0x34, 0xDF, 0x30, 0x2A, 0x42, 0x7B, 0x38, 0x5C, 0x4A, 0xF5, 0x3B, + 0xF6, 0x4A, 0xCD, 0x3B, 0x7C, 0x46, 0x2B, 0x40, 0xDA, 0x41, 0x0D, 0x4C, + 0x19, 0x3B, 0x0C, 0x57, 0x74, 0x33, 0x6C, 0x5C, 0x3D, 0x30, 0x5F, 0x5F, + 0x74, 0x2C, 0xCF, 0x5A, 0xE1, 0x25, 0xC7, 0x52, 0x58, 0x1F, 0x11, 0x50, + 0x5E, 0x1E, 0x60, 0x4C, 0xA4, 0x29, 0x0C, 0x45, 0x6C, 0x3A, 0xCF, 0x41, + 0xD8, 0x3E, 0xE4, 0x40, 0x34, 0x38, 0x65, 0x3A, 0xCB, 0x34, 0x04, 0x30, + 0x97, 0x33, 0x35, 0x28, 0x85, 0x2A, 0x78, 0x24, 0x2D, 0x22, 0xCA, 0x25, + 0x28, 0x25, 0xDA, 0x2A, 0x0D, 0x2C, 0xA4, 0x2D, 0x32, 0x30, 0x5B, 0x2B, + 0x1C, 0x2A, 0xD3, 0x24, 0x63, 0x19, 0xAC, 0x1D, 0xBB, 0x0A, 0x76, 0x13, + 0xAB, 0x05, 0xE1, 0x0B, 0xBD, 0x08, 0x6F, 0x0D, 0x09, 0x0F, 0xFE, 0x11, + 0x0A, 0x15, 0x7D, 0x1A, 0x6B, 0x1C, 0x5B, 0x24, 0xEB, 0x23, 0x42, 0x28, + 0x2C, 0x25, 0xAF, 0x26, 0xDB, 0x20, 0xBF, 0x25, 0x64, 0x18, 0xA0, 0x25, + 0xAE, 0x0C, 0x43, 0x22, 0x51, 0x01, 0x3E, 0x1A, 0xD7, 0xF6, 0xE2, 0x0D, + 0xF5, 0xE9, 0x50, 0xFE, 0xE4, 0xDB, 0x4E, 0xEF, 0x99, 0xCF, 0xEC, 0xE6, + 0x29, 0xCA, 0x3B, 0xE6, 0x2F, 0xD0, 0x4E, 0xE8, 0xBC, 0xDD, 0x1C, 0xEC, + 0x81, 0xE8, 0xA2, 0xF0, 0x8A, 0xED, 0x0B, 0xF1, 0x79, 0xF1, 0xD5, 0xEF, + 0x88, 0xF4, 0x02, 0xEF, 0x45, 0xF4, 0x8E, 0xEF, 0x68, 0xF3, 0x99, 0xF1, + 0xA4, 0xF6, 0xB8, 0xF7, 0xA1, 0xF7, 0xEF, 0xFD, 0x31, 0xF5, 0x2D, 0x00, + 0x5D, 0xF3, 0x32, 0xFF, 0xB6, 0xF1, 0x27, 0xFC, 0x9F, 0xF3, 0x8A, 0xFA, + 0xBC, 0xFB, 0x7B, 0xFA, 0x4B, 0x06, 0x93, 0xFC, 0xEF, 0x0D, 0xE7, 0xFF, + 0x49, 0x13, 0x44, 0x08, 0xF9, 0x12, 0xFC, 0x14, 0x61, 0x11, 0xFF, 0x21, + 0x39, 0x15, 0xAF, 0x2D, 0x43, 0x18, 0x42, 0x34, 0xDE, 0x18, 0xE5, 0x35, + 0xF5, 0x14, 0x9D, 0x31, 0x63, 0x0F, 0x72, 0x27, 0x9D, 0x08, 0xA3, 0x1B, + 0x3C, 0x00, 0x4D, 0x12, 0xB6, 0x01, 0x74, 0x0E, 0x7C, 0x0C, 0xBD, 0x11, + 0x87, 0x11, 0xA7, 0x16, 0xC0, 0x0F, 0xA8, 0x17, 0xB9, 0x0F, 0x78, 0x18, + 0x53, 0x11, 0x2C, 0x19, 0xB0, 0x12, 0x3D, 0x1A, 0x78, 0x13, 0x49, 0x1D, + 0x54, 0x10, 0x7E, 0x1E, 0x5C, 0x0A, 0x65, 0x1C, 0x7F, 0x09, 0xD5, 0x1B, + 0xF9, 0x06, 0xB1, 0x14, 0x4E, 0xF9, 0x2E, 0x04, 0x05, 0xE8, 0x11, 0xF6, + 0x16, 0xDF, 0x2E, 0xEB, 0x09, 0xDE, 0x98, 0xE4, 0x19, 0xDD, 0x49, 0xE8, + 0xD7, 0xDB, 0x11, 0xF1, 0xE4, 0xDD, 0xA7, 0xF4, 0x41, 0xE5, 0xE0, 0xF4, + 0xA1, 0xEC, 0xAD, 0xF5, 0x8E, 0xEF, 0x6D, 0xF4, 0x19, 0xF2, 0x5F, 0xF0, + 0x87, 0xF6, 0xFB, 0xF1, 0x0F, 0xF7, 0x67, 0xF4, 0xEC, 0xED, 0xBD, 0xEC, + 0xD8, 0xE0, 0xA1, 0xE0, 0xAD, 0xD3, 0x5E, 0xD5, 0x94, 0xC9, 0xD1, 0xCA, + 0x29, 0xC7, 0xA1, 0xC7, 0x0C, 0xC8, 0x07, 0xCB, 0xBA, 0xC8, 0xCC, 0xCB, + 0x4F, 0xC7, 0xA0, 0xC8, 0x6F, 0xC3, 0x41, 0xC1, 0xB0, 0xBD, 0x7F, 0xB4, + 0x36, 0xBA, 0x41, 0xA7, 0x20, 0xC1, 0x00, 0x9F, 0x6B, 0xCA, 0x88, 0x9D, + 0x51, 0xC9, 0x59, 0xA4, 0xAB, 0xC0, 0x31, 0xAD, 0x9C, 0xB3, 0x8E, 0xAF, + 0x92, 0xA5, 0x5B, 0xAA, 0x76, 0x9E, 0x21, 0xA2, 0xAE, 0xA1, 0x23, 0x9E, + 0xB7, 0xA8, 0xB3, 0x9F, 0x86, 0xAE, 0x48, 0xA2, 0x5F, 0xB3, 0x9F, 0xA6, + 0xBC, 0xB7, 0xF4, 0xAA, 0x23, 0xBA, 0xF1, 0xAB, 0xDC, 0xB8, 0x2D, 0xB1, + 0xBA, 0xB6, 0x67, 0xBA, 0xC8, 0xBC, 0x2F, 0xC6, 0x67, 0xC7, 0xAA, 0xD3, + 0x81, 0xCF, 0x5C, 0xE0, 0x04, 0xD1, 0xF9, 0xE4, 0x47, 0xCD, 0xDB, 0xDD, + 0xDF, 0xCD, 0x13, 0xD6, 0xF3, 0xD1, 0xE0, 0xD6, 0xE1, 0xD8, 0xDE, 0xE0, + 0xF2, 0xDF, 0x63, 0xEC, 0x70, 0xE0, 0x4E, 0xF2, 0xE2, 0xDD, 0x25, 0xF2, + 0x71, 0xDE, 0x0C, 0xF2, 0x58, 0xDF, 0xC1, 0xF2, 0x8F, 0xE1, 0xD1, 0xEF, + 0x57, 0xE8, 0x03, 0xEF, 0x56, 0xEC, 0x91, 0xEF, 0x87, 0xF0, 0xAC, 0xED, + 0x31, 0xF5, 0xE4, 0xEC, 0x97, 0xF3, 0xAC, 0xED, 0xC1, 0xF0, 0xDA, 0xEB, + 0xDD, 0xEC, 0x72, 0xEC, 0x5E, 0xEB, 0x07, 0xF6, 0x9E, 0xF1, 0xB1, 0xFE, + 0x29, 0xFA, 0x91, 0x04, 0xBC, 0x02, 0xB5, 0x09, 0xBB, 0x0F, 0x22, 0x0A, + 0xD3, 0x1A, 0x2B, 0x06, 0xAB, 0x1A, 0x54, 0xFE, 0x3E, 0x0F, 0xF1, 0xF6, + 0x05, 0x00, 0xE2, 0xF3, 0xCB, 0xF7, 0x2F, 0xF0, 0x0C, 0xF8, 0x63, 0xEE, + 0xDB, 0xF7, 0xB0, 0xF5, 0x14, 0xF9, 0xC7, 0xFD, 0xDF, 0x00, 0x91, 0x01, + 0x5F, 0x05, 0x37, 0x04, 0x96, 0x06, 0x26, 0x06, 0x9B, 0x06, 0xF4, 0x05, + 0x50, 0x06, 0x84, 0x06, 0x98, 0x0A, 0xA8, 0x0B, 0x6C, 0x0E, 0xD1, 0x11, + 0x2F, 0x11, 0xD1, 0x16, 0x9D, 0x14, 0xE5, 0x19, 0x05, 0x17, 0x97, 0x19, + 0xA9, 0x13, 0xA9, 0x15, 0x13, 0x07, 0x59, 0x0D, 0xE1, 0xF8, 0xB1, 0x02, + 0x5B, 0xF1, 0xDE, 0xF9, 0x31, 0xF2, 0xAA, 0xF4, 0x71, 0xF9, 0x42, 0xF0, + 0x3B, 0x02, 0x49, 0xEB, 0xA4, 0x04, 0xAF, 0xE5, 0xEF, 0x03, 0xC4, 0xE1, + 0xAF, 0x03, 0x27, 0xE2, 0x77, 0x01, 0x8E, 0xE3, 0x14, 0x05, 0x0F, 0xE4, + 0x41, 0x0C, 0x56, 0xE7, 0xCA, 0x0D, 0xAF, 0xEF, 0x5E, 0x08, 0x04, 0xF7, + 0xB1, 0xFF, 0xA8, 0xFB, 0x1A, 0xFF, 0xCA, 0x00, 0xE2, 0x07, 0x5C, 0x05, + 0x5C, 0x10, 0x83, 0x08, 0x68, 0x17, 0xFE, 0x08, 0x58, 0x1B, 0x36, 0x02, + 0x30, 0x19, 0xF8, 0xFB, 0x31, 0x13, 0x89, 0xFB, 0x8B, 0x11, 0xA5, 0x02, + 0x9D, 0x13, 0x5C, 0x0F, 0xB5, 0x16, 0x26, 0x1A, 0xEA, 0x1E, 0xB5, 0x26, + 0x4C, 0x25, 0xFE, 0x2F, 0x12, 0x25, 0x5B, 0x2F, 0x4B, 0x1C, 0x8C, 0x27, + 0xC2, 0x0B, 0x84, 0x17, 0xF0, 0x03, 0x98, 0x04, 0x9A, 0x0A, 0xC6, 0xFA, + 0x74, 0x12, 0xE7, 0xFB, 0x26, 0x12, 0x4E, 0x01, 0xEE, 0x10, 0x30, 0x09, + 0x3D, 0x16, 0x93, 0x0D, 0x12, 0x1B, 0xD8, 0x06, 0x92, 0x1C, 0x0D, 0x02, + 0x26, 0x1E, 0x11, 0x0A, 0xD6, 0x20, 0x5E, 0x17, 0x72, 0x26, 0x63, 0x1F, + 0x3B, 0x2F, 0x7E, 0x25, 0xED, 0x2F, 0xF9, 0x2A, 0xA8, 0x23, 0x22, 0x29, + 0x4E, 0x14, 0x5C, 0x24, 0xC8, 0x07, 0xDA, 0x22, 0xE1, 0xFF, 0x29, 0x21, + 0xF7, 0xFE, 0x10, 0x1B, 0xE1, 0xFF, 0xD7, 0x0F, 0xDE, 0xFC, 0xEA, 0xFE, + 0xC1, 0xF9, 0x1F, 0xF0, 0x6A, 0xF8, 0x8A, 0xED, 0x37, 0xF7, 0x3E, 0xF6, + 0x00, 0xF8, 0xF3, 0x03, 0x69, 0xFC, 0xAF, 0x0F, 0x78, 0x03, 0x15, 0x16, + 0xDD, 0x09, 0x66, 0x14, 0xAE, 0x08, 0x77, 0x08, 0x59, 0xFE, 0xE1, 0xFB, + 0xCE, 0xF3, 0x80, 0xF4, 0x11, 0xF0, 0x96, 0xEC, 0x7C, 0xF5, 0x33, 0xE5, + 0x01, 0xFC, 0x38, 0xDF, 0x7E, 0xF8, 0xB6, 0xD5, 0xEA, 0xF0, 0x12, 0xCD, + 0xD7, 0xEB, 0x8A, 0xC8, 0x05, 0xE6, 0x38, 0xC6, 0x6B, 0xDE, 0xDF, 0xC8, + 0x24, 0xDA, 0xE5, 0xD1, 0xFF, 0xD9, 0x64, 0xDE, 0x5D, 0xDA, 0xFA, 0xE6, + 0xC0, 0xDA, 0xD6, 0xE6, 0x9B, 0xD8, 0x83, 0xE1, 0xD6, 0xD5, 0xD2, 0xDA, + 0xA9, 0xD3, 0xBC, 0xD4, 0x65, 0xCE, 0x61, 0xD0, 0xFE, 0xCA, 0xE7, 0xC9, + 0x68, 0xCE, 0x05, 0xC2, 0x91, 0xD5, 0x34, 0xBF, 0xA9, 0xDC, 0x1C, 0xC0, + 0x92, 0xE1, 0xCE, 0xC5, 0xA6, 0xE2, 0x37, 0xD3, 0x73, 0xE5, 0x85, 0xE0, + 0x20, 0xED, 0xA5, 0xEB, 0x74, 0xF2, 0x0B, 0xF3, 0x72, 0xFA, 0x7A, 0xF5, + 0xA6, 0x05, 0x89, 0xF6, 0xC7, 0x0C, 0x08, 0xF6, 0x9A, 0x10, 0xD7, 0xF4, + 0xF3, 0x11, 0x3A, 0xF6, 0xFF, 0x14, 0xB9, 0xF8, 0xD2, 0x1B, 0x48, 0xFC, + 0x49, 0x20, 0xAB, 0x03, 0x87, 0x24, 0x5A, 0x0A, 0x65, 0x2B, 0x18, 0x0E, + 0x12, 0x2B, 0x07, 0x15, 0xF9, 0x28, 0x3C, 0x21, 0x2A, 0x2C, 0x68, 0x2A, + 0xBB, 0x2E, 0xED, 0x2D, 0x17, 0x33, 0xC3, 0x32, 0xED, 0x35, 0x0D, 0x3A, + 0xBD, 0x33, 0x39, 0x3F, 0x4E, 0x31, 0x81, 0x3E, 0x2F, 0x30, 0xFC, 0x3E, + 0x02, 0x2F, 0xC0, 0x43, 0x5F, 0x2F, 0xE1, 0x43, 0x68, 0x35, 0x1A, 0x44, + 0xFD, 0x39, 0xC6, 0x48, 0x27, 0x3C, 0x38, 0x4E, 0x9D, 0x40, 0xDD, 0x53, + 0xA7, 0x43, 0xF9, 0x55, 0xC3, 0x42, 0x63, 0x4E, 0x8A, 0x40, 0x79, 0x43, + 0x7E, 0x3E, 0x6B, 0x41, 0x83, 0x3B, 0xDA, 0x44, 0xC2, 0x39, 0x02, 0x45, + 0x13, 0x37, 0x1C, 0x46, 0x16, 0x2F, 0x9E, 0x4C, 0x6D, 0x28, 0xFF, 0x51, + 0x2D, 0x2A, 0xFC, 0x50, 0x92, 0x2E, 0x57, 0x49, 0x49, 0x30, 0x53, 0x42, + 0xE1, 0x33, 0x38, 0x43, 0xF1, 0x37, 0x65, 0x45, 0x2C, 0x34, 0x0F, 0x42, + 0x86, 0x2C, 0xE7, 0x3D, 0x03, 0x2B, 0xA5, 0x3C, 0xBD, 0x2D, 0x53, 0x3D, + 0xF2, 0x30, 0x1C, 0x40, 0x69, 0x37, 0xC0, 0x40, 0x88, 0x3A, 0xB0, 0x3B, + 0xBD, 0x38, 0xE3, 0x38, 0x85, 0x38, 0x01, 0x38, 0x4E, 0x33, 0x4B, 0x2F, + 0xC6, 0x27, 0x9E, 0x21, 0xC6, 0x20, 0x42, 0x16, 0x63, 0x1D, 0x2F, 0x0D, + 0x21, 0x16, 0xAB, 0x09, 0xD5, 0x0B, 0x91, 0x0C, 0xE6, 0x04, 0x4D, 0x0E, + 0x1E, 0x04, 0xFD, 0x09, 0x50, 0x05, 0x93, 0x04, 0x65, 0x09, 0x9B, 0x08, + 0xA2, 0x14, 0x1F, 0x14, 0x99, 0x1F, 0xB5, 0x1E, 0x2E, 0x24, 0xB7, 0x25, + 0x7C, 0x25, 0x45, 0x28, 0x66, 0x2B, 0xA6, 0x2E, 0x99, 0x31, 0x6A, 0x34, + 0x4B, 0x28, 0x72, 0x2E, 0x0F, 0x19, 0x68, 0x28, 0x17, 0x16, 0xDD, 0x2A, + 0x6D, 0x1B, 0x25, 0x30, 0xAA, 0x1D, 0x83, 0x2E, 0xF4, 0x22, 0xB6, 0x27, + 0x36, 0x2E, 0x6E, 0x24, 0x4B, 0x35, 0x3B, 0x26, 0x9A, 0x38, 0x1B, 0x2C, + 0x42, 0x32, 0xE8, 0x32, 0xCB, 0x23, 0xD8, 0x39, 0xA8, 0x26, 0xD8, 0x42, + 0xFE, 0x39, 0x60, 0x49, 0xA0, 0x43, 0xB1, 0x45, 0xC5, 0x37, 0x5E, 0x37, + 0xF0, 0x22, 0x9E, 0x26, 0x61, 0x16, 0x84, 0x1B, 0x8B, 0x14, 0xDD, 0x1B, + 0x2C, 0x18, 0xD4, 0x24, 0x44, 0x1E, 0x4B, 0x26, 0x3B, 0x24, 0x5C, 0x1D, + 0x21, 0x26, 0x8F, 0x1D, 0xAA, 0x27, 0x2B, 0x30, 0x16, 0x2A, 0x30, 0x44, + 0x6C, 0x2A, 0xB9, 0x4A, 0xD8, 0x2F, 0x25, 0x4B, 0x3F, 0x37, 0x0A, 0x49, + 0xC8, 0x35, 0x20, 0x3E, 0x65, 0x2E, 0xD9, 0x30, 0x4E, 0x21, 0x5C, 0x23, + 0x24, 0x0B, 0x5D, 0x11, 0x23, 0xF9, 0x08, 0x07, 0x12, 0xF8, 0xD6, 0x09, + 0x34, 0x00, 0x0F, 0x0E, 0x64, 0x08, 0xB1, 0x14, 0x2D, 0x12, 0x9C, 0x20, + 0xE1, 0x1A, 0xC8, 0x28, 0x1E, 0x1B, 0x2A, 0x2B, 0x50, 0x19, 0x6E, 0x2B, + 0x4A, 0x17, 0x2D, 0x2A, 0x37, 0x10, 0x8E, 0x25, 0x34, 0x13, 0x5E, 0x1E, + 0x9E, 0x1D, 0xCC, 0x17, 0x9C, 0x1A, 0xE8, 0x11, 0x33, 0x0D, 0xB4, 0x08, + 0x1F, 0xFE, 0x67, 0xFA, 0x9C, 0xEE, 0x8E, 0xED, 0x5B, 0xE5, 0x04, 0xED, + 0x97, 0xE2, 0xC4, 0xF6, 0x90, 0xDE, 0xCE, 0xF8, 0x99, 0xDE, 0x6A, 0xF0, + 0xC0, 0xE3, 0x79, 0xEE, 0xD0, 0xE5, 0x3B, 0xF2, 0x29, 0xE7, 0x8A, 0xF0, + 0x64, 0xEA, 0xDE, 0xEC, 0xC5, 0xE9, 0x34, 0xE5, 0xAA, 0xE3, 0xED, 0xD8, + 0x6B, 0xDC, 0x5A, 0xD5, 0x03, 0xD7, 0x89, 0xD9, 0xBC, 0xD4, 0xC8, 0xDE, + 0x0B, 0xD6, 0x34, 0xE3, 0x70, 0xE1, 0x5B, 0xE6, 0xE6, 0xF4, 0x2B, 0xE9, + 0xFC, 0x00, 0xA2, 0xE7, 0xA0, 0x01, 0x7D, 0xE2, 0x9C, 0xFB, 0xAA, 0xE0, + 0xA0, 0xF4, 0x6E, 0xE2, 0x22, 0xF0, 0x2C, 0xE5, 0xCD, 0xF0, 0xFA, 0xEC, + 0xA8, 0xF4, 0xE1, 0xF2, 0x26, 0xFC, 0x34, 0xF1, 0x2E, 0x04, 0xA9, 0xED, + 0x63, 0x02, 0x76, 0xEB, 0x07, 0xF6, 0x4D, 0xEF, 0x74, 0xE9, 0xBD, 0xF3, + 0x6B, 0xE7, 0x40, 0xEF, 0xDE, 0xEC, 0x2C, 0xEA, 0x75, 0xF0, 0x8D, 0xEA, + 0x9D, 0xED, 0x54, 0xED, 0x9E, 0xDF, 0x34, 0xF3, 0x70, 0xCF, 0x74, 0xFB, + 0xC9, 0xC4, 0xE4, 0xF8, 0x9C, 0xC2, 0x66, 0xEA, 0x10, 0xCB, 0xFD, 0xDF, + 0x4E, 0xD6, 0x14, 0xE0, 0x37, 0xDE, 0x97, 0xE2, 0x39, 0xE6, 0xF4, 0xE3, + 0xC0, 0xED, 0x5F, 0xEA, 0xE2, 0xE8, 0xD6, 0xEF, 0x1B, 0xE1, 0x3E, 0xF2, + 0x9D, 0xE3, 0x93, 0xF7, 0xE1, 0xE6, 0x93, 0xF8, 0x1A, 0xE6, 0x63, 0xF0, + 0xC4, 0xE1, 0xFC, 0xE7, 0x75, 0xD5, 0xD3, 0xDF, 0x9C, 0xC4, 0xEA, 0xCF, + 0xBF, 0xBF, 0x00, 0xC2, 0x35, 0xC9, 0x66, 0xBD, 0x56, 0xD3, 0x5F, 0xC2, + 0x6F, 0xDA, 0xE3, 0xD0, 0x38, 0xE2, 0x71, 0xDE, 0x4C, 0xE5, 0xD0, 0xE5, + 0x8A, 0xE0, 0x92, 0xE8, 0xF4, 0xDF, 0x0B, 0xE9, 0xDB, 0xE3, 0xBC, 0xE7, + 0xE8, 0xE3, 0x5E, 0xE6, 0xA9, 0xE0, 0xBD, 0xE5, 0x73, 0xDB, 0xC7, 0xDE, + 0x5B, 0xD3, 0x1B, 0xD2, 0x34, 0xC7, 0xC3, 0xC7, 0x66, 0xBB, 0xC5, 0xC1, + 0x82, 0xB4, 0x24, 0xB9, 0x4B, 0xB6, 0x46, 0xB1, 0x4A, 0xC0, 0x18, 0xB3, + 0x6F, 0xCA, 0xAA, 0xB8, 0x55, 0xCF, 0x20, 0xBD, 0x05, 0xD0, 0xAB, 0xC0, + 0x69, 0xD0, 0x65, 0xC4, 0xD6, 0xCD, 0x79, 0xC5, 0xE0, 0xC9, 0x17, 0xC5, + 0x33, 0xC8, 0xB1, 0xC6, 0x71, 0xC7, 0x8F, 0xC5, 0x4B, 0xC6, 0x85, 0xC4, + 0xE1, 0xC2, 0x6C, 0xCA, 0x6A, 0xBF, 0xEB, 0xD1, 0xE1, 0xBF, 0xF0, 0xD2, + 0x5D, 0xC6, 0x38, 0xD3, 0x58, 0xD0, 0xB9, 0xD7, 0x75, 0xDF, 0x41, 0xE0, + 0x2F, 0xEF, 0xBD, 0xEB, 0x97, 0xF8, 0xDC, 0xF4, 0xB6, 0xFE, 0xA0, 0xF7, + 0x92, 0x02, 0x54, 0xF2, 0xCD, 0x05, 0x61, 0xE8, 0x58, 0x07, 0x72, 0xE0, + 0x37, 0x07, 0x77, 0xE0, 0xB9, 0x07, 0xAA, 0xE5, 0xCA, 0x06, 0xC6, 0xEA, + 0xA0, 0x04, 0x99, 0xF3, 0x85, 0x00, 0xD2, 0xFA, 0xEC, 0xFA, 0x21, 0xF9, + 0x9D, 0xFA, 0xA0, 0xF5, 0x87, 0x02, 0x40, 0xF5, 0xC8, 0x0E, 0xE4, 0xF8, + 0xB9, 0x19, 0xD7, 0xFB, 0x82, 0x21, 0x2B, 0xFB, 0xEE, 0x21, 0x76, 0xF8, + 0x23, 0x1A, 0xD3, 0xF7, 0x8C, 0x10, 0x56, 0xFE, 0x8A, 0x0C, 0x01, 0x0A, + 0x79, 0x0E, 0xD4, 0x15, 0xFE, 0x12, 0x4D, 0x21, 0x3B, 0x19, 0xDB, 0x29, + 0x81, 0x1D, 0xF3, 0x2B, 0x96, 0x1D, 0x91, 0x29, 0x8A, 0x1C, 0x4E, 0x26, + 0x45, 0x1A, 0xAA, 0x23, 0x3B, 0x15, 0x7F, 0x1E, 0x7F, 0x12, 0xED, 0x16, + 0x76, 0x10, 0xA3, 0x0D, 0xEC, 0x0B, 0x56, 0x04, 0x68, 0x09, 0xB2, 0xFD, + 0x5B, 0x08, 0xFC, 0xF7, 0x88, 0x05, 0xDC, 0xF5, 0x4D, 0x03, 0xE7, 0xFA, + 0x71, 0x01, 0x23, 0x00, 0x19, 0x00, 0xE4, 0xFE, 0xFA, 0x04, 0x64, 0xFC, + 0xFC, 0x08, 0x25, 0x00, 0x1F, 0x04, 0x05, 0x01, 0x67, 0xFE, 0x8D, 0xF7, + 0x04, 0xFC, 0x68, 0xEC, 0x86, 0xF6, 0x6D, 0xE3, 0x32, 0xF0, 0x39, 0xDC, + 0xF1, 0xF0, 0xF6, 0xD7, 0xA2, 0xF3, 0x82, 0xD5, 0x50, 0xF1, 0xDE, 0xD4, + 0x0D, 0xE9, 0x0F, 0xD7, 0x67, 0xDB, 0x5B, 0xD9, 0x00, 0xCE, 0x9B, 0xD9, + 0xEE, 0xC5, 0x85, 0xDA, 0xF6, 0xC2, 0xA6, 0xDA, 0xF6, 0xC2, 0xBB, 0xD8, + 0xF1, 0xC3, 0xD7, 0xD5, 0xA7, 0xC4, 0x2D, 0xD5, 0xDA, 0xC5, 0x3F, 0xD7, + 0x1B, 0xC9, 0xEC, 0xD5, 0xAA, 0xCD, 0x5D, 0xCE, 0x98, 0xD5, 0x5A, 0xC4, + 0xB9, 0xDE, 0xDB, 0xC1, 0x36, 0xE2, 0xF5, 0xC9, 0x32, 0xE3, 0xC1, 0xD2, + 0xAD, 0xE4, 0x42, 0xD7, 0x37, 0xE6, 0xFA, 0xDA, 0x8D, 0xE9, 0x1B, 0xDD, + 0x53, 0xEF, 0x98, 0xDD, 0x7E, 0xF2, 0x14, 0xDF, 0x9A, 0xEE, 0xE9, 0xE0, + 0xCD, 0xEB, 0xC8, 0xE6, 0x4D, 0xEE, 0x7F, 0xED, 0x81, 0xF4, 0xBC, 0xEC, + 0xAD, 0xFB, 0xF4, 0xE4, 0x91, 0xFF, 0x9E, 0xDC, 0x53, 0x06, 0xBE, 0xDE, + 0x5D, 0x0F, 0x66, 0xEA, 0xC0, 0x11, 0xB3, 0xF7, 0xE9, 0x0E, 0x4F, 0x04, + 0xD4, 0x07, 0x8F, 0x0A, 0xB5, 0xFE, 0xCD, 0x04, 0x08, 0xFC, 0x60, 0xFE, + 0x74, 0x00, 0xD8, 0x00, 0x0A, 0x03, 0xA5, 0x03, 0xA5, 0x03, 0xED, 0x04, + 0x56, 0x06, 0xC2, 0x05, 0x0F, 0x09, 0x44, 0x07, 0x09, 0x0B, 0x9D, 0x0A, + 0x09, 0x0F, 0x11, 0x0D, 0x65, 0x11, 0x92, 0x0F, 0x53, 0x0E, 0xB7, 0x14, + 0x07, 0x0E, 0x44, 0x1D, 0x59, 0x13, 0xE0, 0x21, 0x75, 0x15, 0xB2, 0x1D, + 0x00, 0x12, 0xA5, 0x13, 0x1D, 0x0A, 0xE2, 0x08, 0x41, 0x01, 0x56, 0x00, + 0xDC, 0xFD, 0x79, 0xF8, 0xCF, 0xFB, 0x5A, 0xF1, 0x98, 0xF8, 0xF1, 0xEC, + 0x56, 0xFA, 0x15, 0xF0, 0x27, 0x02, 0x00, 0xFB, 0x83, 0x0C, 0xD5, 0x06, + 0x87, 0x0E, 0x05, 0x11, 0xEC, 0x02, 0x0E, 0x16, 0x48, 0xF9, 0x34, 0x14, + 0x43, 0xFA, 0xC1, 0x0D, 0x74, 0xFE, 0x2A, 0x0A, 0x43, 0xFE, 0x4F, 0x0A, + 0x4F, 0xFA, 0x4A, 0x05, 0x09, 0xF6, 0xF7, 0xFA, 0x98, 0xF4, 0xB3, 0xF4, + 0x42, 0xF9, 0x90, 0xF7, 0x75, 0x00, 0x1A, 0xFA, 0x30, 0x02, 0x61, 0xF7, + 0x4F, 0xF9, 0x19, 0xF3, 0xB3, 0xED, 0x33, 0xED, 0xB1, 0xEA, 0x86, 0xE6, + 0x9F, 0xEC, 0xA7, 0xE3, 0xF6, 0xED, 0xC3, 0xE3, 0xF0, 0xEC, 0x23, 0xE4, + 0xF1, 0xEB, 0xF4, 0xE4, 0x4A, 0xEF, 0x33, 0xE2, 0x6F, 0xF4, 0x67, 0xDC, + 0x25, 0xF7, 0x54, 0xD9, 0x57, 0xF7, 0x52, 0xDA, 0xED, 0xF9, 0x1F, 0xE0, + 0x2C, 0x03, 0xB3, 0xEB, 0xE1, 0x0E, 0xB0, 0xF6, 0xE7, 0x13, 0x36, 0xFC, + 0xB0, 0x12, 0x95, 0xFD, 0xB8, 0x12, 0x16, 0xFA, 0x1C, 0x16, 0x8E, 0xF7, + 0x74, 0x17, 0xCF, 0x00, 0x37, 0x15, 0x56, 0x13, 0xAF, 0x17, 0xB0, 0x26, + 0x21, 0x1F, 0x32, 0x33, 0xE5, 0x29, 0xD9, 0x35, 0x07, 0x3A, 0x10, 0x33, + 0xEF, 0x46, 0xA3, 0x33, 0xEA, 0x46, 0x37, 0x39, 0xE1, 0x3B, 0xC5, 0x3B, + 0x89, 0x31, 0x7B, 0x3A, 0x3F, 0x33, 0xF6, 0x39, 0x09, 0x3B, 0x20, 0x3B, + 0xBC, 0x3D, 0xD3, 0x3F, 0x9D, 0x3C, 0x3E, 0x48, 0x15, 0x3C, 0xC9, 0x50, + 0x39, 0x3D, 0xAB, 0x59, 0xB2, 0x3D, 0x40, 0x5C, 0x5E, 0x3C, 0x8D, 0x56, + 0x13, 0x3B, 0xF0, 0x4F, 0x11, 0x3F, 0xB0, 0x49, 0x4C, 0x48, 0x4B, 0x48, + 0x08, 0x4D, 0x25, 0x4C, 0x81, 0x4B, 0x9F, 0x4E, 0x9B, 0x46, 0x8A, 0x50, + 0x2D, 0x3F, 0x8D, 0x53, 0xB7, 0x38, 0x20, 0x53, 0x67, 0x35, 0x9C, 0x4E, + 0x30, 0x31, 0x84, 0x48, 0x87, 0x2D, 0xE9, 0x43, 0xBE, 0x30, 0x04, 0x42, + 0x9F, 0x33, 0xF3, 0x3D, 0x65, 0x34, 0x1D, 0x3E, 0x88, 0x2F, 0xFA, 0x43, + 0xA6, 0x21, 0x70, 0x45, 0xFA, 0x1F, 0xAD, 0x46, 0xE8, 0x29, 0x64, 0x42, + 0x0A, 0x32, 0xDE, 0x34, 0x26, 0x33, 0x80, 0x2D, 0xA3, 0x2A, 0xBD, 0x2A, + 0x64, 0x20, 0xDE, 0x25, 0x3E, 0x18, 0xB9, 0x22, 0xC8, 0x13, 0xF9, 0x1E, + 0xE8, 0x12, 0xCC, 0x1C, 0x6D, 0x13, 0xFC, 0x20, 0x9D, 0x14, 0xDD, 0x26, + 0xBE, 0x11, 0x91, 0x2A, 0xA4, 0x0B, 0xE2, 0x2D, 0x66, 0x06, 0xF2, 0x2D, + 0x9A, 0x05, 0x3C, 0x28, 0x7E, 0x08, 0x7F, 0x24, 0x94, 0x0A, 0xB0, 0x24, + 0x6A, 0x10, 0x0D, 0x26, 0x45, 0x18, 0x55, 0x26, 0x7D, 0x19, 0xF1, 0x1F, + 0x18, 0x13, 0x3F, 0x13, 0x5A, 0x13, 0x05, 0x0A, 0x1C, 0x1C, 0x73, 0x03, + 0x68, 0x25, 0xB2, 0x02, 0x37, 0x30, 0x44, 0x0D, 0x57, 0x35, 0x39, 0x1B, + 0xC9, 0x35, 0x6E, 0x29, 0x98, 0x2C, 0x7E, 0x2E, 0x04, 0x23, 0x18, 0x32, + 0x46, 0x23, 0x82, 0x34, 0x55, 0x27, 0x2D, 0x31, 0xF8, 0x2E, 0x39, 0x32, + 0x55, 0x35, 0xCF, 0x2C, 0x2A, 0x3A, 0xF5, 0x25, 0x5D, 0x39, 0x8A, 0x23, + 0x20, 0x30, 0x70, 0x21, 0x84, 0x2B, 0x8F, 0x27, 0x1D, 0x2F, 0xB7, 0x34, + 0xF4, 0x33, 0xFA, 0x3F, 0x0A, 0x34, 0x9F, 0x3E, 0xE7, 0x33, 0xF8, 0x38, + 0x3E, 0x34, 0x7C, 0x33, 0x5A, 0x2C, 0xC7, 0x2C, 0xCB, 0x27, 0x4F, 0x2B, + 0x85, 0x2A, 0x0E, 0x27, 0x87, 0x2E, 0x6F, 0x24, 0x7D, 0x30, 0x9B, 0x21, + 0x64, 0x2B, 0x32, 0x1A, 0xCB, 0x22, 0x25, 0x15, 0x03, 0x1B, 0x7A, 0x13, + 0x55, 0x13, 0xA7, 0x15, 0x6A, 0x12, 0xFE, 0x17, 0xEC, 0x16, 0xCC, 0x15, + 0xD4, 0x17, 0x1D, 0x13, 0x7C, 0x18, 0xEF, 0x11, 0xDE, 0x1A, 0x6D, 0x10, + 0xF3, 0x16, 0xB3, 0x13, 0x48, 0x06, 0x86, 0x1A, 0xB2, 0xF8, 0xF4, 0x1D, + 0x4A, 0xF2, 0xB0, 0x18, 0xC7, 0xF1, 0x5F, 0x10, 0xE6, 0xF4, 0x63, 0x0B, + 0x65, 0xF6, 0x9C, 0x06, 0xD5, 0xF8, 0x93, 0x03, 0xDA, 0xF5, 0xC3, 0x05, + 0x06, 0xEC, 0x88, 0x06, 0xD8, 0xE2, 0x88, 0x01, 0x50, 0xDA, 0x3D, 0x00, + 0x82, 0xD4, 0xFA, 0x02, 0x47, 0xD3, 0x18, 0xFE, 0xCB, 0xD0, 0xB4, 0xF5, + 0x4C, 0xCF, 0x68, 0xF1, 0x98, 0xCC, 0x10, 0xEA, 0x5C, 0xCC, 0x08, 0xE2, + 0x8D, 0xD1, 0xDD, 0xDD, 0xB0, 0xD6, 0x84, 0xD8, 0xEC, 0xD8, 0x00, 0xD0, + 0xA2, 0xD5, 0xE0, 0xC4, 0xEB, 0xCE, 0x47, 0xC0, 0x49, 0xC7, 0x20, 0xC0, + 0x84, 0xC0, 0xDA, 0xB6, 0x5B, 0xBE, 0xA7, 0xB0, 0x71, 0xBD, 0xF1, 0xB3, + 0x9F, 0xBA, 0x99, 0xB6, 0x14, 0xB9, 0x92, 0xB9, 0xB5, 0xB7, 0x07, 0xBC, + 0xBC, 0xB5, 0xBF, 0xBE, 0x4C, 0xB3, 0xA6, 0xC1, 0x22, 0xB3, 0x03, 0xC5, + 0x0C, 0xB4, 0x42, 0xC6, 0xE6, 0xB1, 0x5F, 0xC1, 0x8A, 0xB3, 0x5B, 0xC1, + 0x28, 0xB5, 0xAD, 0xC3, 0x31, 0xB0, 0x1C, 0xC0, 0xC3, 0xB2, 0x8E, 0xBF, + 0x1D, 0xBB, 0x2F, 0xC2, 0x1D, 0xC5, 0xD4, 0xC5, 0x8D, 0xD2, 0x99, 0xCF, + 0xF9, 0xDD, 0x44, 0xDB, 0x63, 0xE4, 0x68, 0xDF, 0x72, 0xE5, 0x62, 0xDF, + 0x6C, 0xE8, 0x39, 0xDF, 0x5F, 0xF1, 0x92, 0xDD, 0xEE, 0xF8, 0xD8, 0xDC, + 0x08, 0xFC, 0xB8, 0xDD, 0x28, 0xFD, 0x0D, 0xE0, 0xBD, 0xF6, 0x41, 0xE4, + 0xCA, 0xF3, 0x12, 0xEE, 0x32, 0xFD, 0x3B, 0xF6, 0x4A, 0x06, 0x71, 0xF1, + 0xBB, 0x0D, 0x68, 0xEB, 0xE1, 0x13, 0xB6, 0xEA, 0x79, 0x12, 0xE8, 0xEB, + 0x9E, 0x0D, 0x76, 0xF1, 0xBE, 0x10, 0x06, 0xFC, 0x68, 0x1A, 0x81, 0x06, + 0x71, 0x21, 0xF5, 0x0F, 0xC9, 0x1A, 0x3A, 0x18, 0x00, 0x10, 0xF3, 0x1C, + 0x68, 0x10, 0xF9, 0x21, 0xE4, 0x15, 0xB7, 0x2A, 0x03, 0x18, 0xF0, 0x28, + 0xFE, 0x12, 0x39, 0x1A, 0x51, 0x10, 0x09, 0x15, 0xFD, 0x0E, 0x47, 0x13, + 0xD2, 0x04, 0xF0, 0x0F, 0x1A, 0x01, 0xEA, 0x17, 0x45, 0x04, 0xBB, 0x1F, + 0x45, 0x02, 0x2C, 0x1D, 0x7D, 0x05, 0xBA, 0x1D, 0x43, 0x10, 0x5D, 0x23, + 0x5A, 0x15, 0xB8, 0x23, 0x09, 0x0F, 0x48, 0x24, 0x96, 0x07, 0xE5, 0x24, + 0xFF, 0xFF, 0xAC, 0x1D, 0x3C, 0xFC, 0xBE, 0x16, 0x0A, 0xFA, 0x5D, 0x0E, + 0xBF, 0xF2, 0xDD, 0x02, 0x39, 0xF2, 0xBA, 0xFA, 0xBB, 0xF8, 0x50, 0xF6, + 0xEE, 0x00, 0x3E, 0xF8, 0x9D, 0x05, 0x2B, 0xF9, 0x7F, 0xFC, 0x69, 0xF6, + 0x59, 0xF2, 0xEA, 0xF6, 0x9E, 0xF5, 0xA7, 0xFB, 0x54, 0xFC, 0x6B, 0x00, + 0x7D, 0x01, 0x19, 0x01, 0xF9, 0x00, 0xFE, 0x00, 0xDE, 0xF6, 0x39, 0xFE, + 0x6F, 0xF2, 0x6E, 0xF8, 0x4C, 0xF6, 0x15, 0xF3, 0xCA, 0xF1, 0x60, 0xE9, + 0x8F, 0xEB, 0xB6, 0xE1, 0xA2, 0xEE, 0x8F, 0xE1, 0x5B, 0xF3, 0x1F, 0xE6, + 0xDB, 0xF9, 0xFF, 0xEB, 0xFF, 0xF8, 0xE2, 0xE9, 0x06, 0xEA, 0x9C, 0xE2, + 0x57, 0xE2, 0x52, 0xDE, 0x82, 0xE1, 0x4C, 0xD7, 0x17, 0xE1, 0xA9, 0xCC, + 0x49, 0xE5, 0xBA, 0xC8, 0x07, 0xE4, 0xC4, 0xCA, 0x6E, 0xDB, 0xBB, 0xCB, + 0x85, 0xD8, 0x04, 0xCC, 0xE8, 0xDA, 0x91, 0xC8, 0xED, 0xE0, 0xF5, 0xC4, + 0x3E, 0xEA, 0x70, 0xCB, 0x30, 0xE6, 0x02, 0xD2, 0xE5, 0xDC, 0xFC, 0xD2, + 0x0B, 0xDE, 0x9B, 0xD8, 0xE1, 0xDB, 0xD8, 0xD4, 0xF1, 0xDC, 0xBE, 0xD0, + 0x28, 0xE5, 0x9D, 0xD9, 0xDD, 0xE7, 0x3D, 0xDA, 0x48, 0xEF, 0x07, 0xD9, + 0xF9, 0xFB, 0x7A, 0xDD, 0x1C, 0xFD, 0xC0, 0xDF, 0xB1, 0xF9, 0x4A, 0xE2, + 0xA2, 0xF5, 0xE5, 0xDC, 0x33, 0xEC, 0x3F, 0xD0, 0x42, 0xE7, 0xEF, 0xCA, + 0x0A, 0xEA, 0xEC, 0xD2, 0x35, 0xEF, 0x88, 0xE2, 0xB9, 0xED, 0xC8, 0xE9, + 0x8B, 0xEC, 0x91, 0xE7, 0x0F, 0xF3, 0xEE, 0xE6, 0x4B, 0xF5, 0xB1, 0xEA, + 0xB6, 0xF7, 0xA9, 0xF2, 0x56, 0xF9, 0x29, 0xF4, 0x93, 0xF0, 0xE3, 0xE9, + 0x20, 0xEA, 0xA0, 0xDF, 0x50, 0xEA, 0x39, 0xDC, 0x17, 0xEA, 0x9B, 0xDE, + 0x83, 0xEA, 0x88, 0xE2, 0xBD, 0xE7, 0x12, 0xE5, 0x09, 0xE9, 0x88, 0xE6, + 0xD3, 0xF2, 0x96, 0xEF, 0xB8, 0xF1, 0x04, 0xF9, 0x5E, 0xE7, 0x98, 0xF5, + 0x7B, 0xE7, 0x0B, 0xF9, 0x4F, 0xEA, 0xB7, 0x02, 0x9A, 0xE3, 0x1D, 0xFF, + 0x14, 0xDE, 0x0A, 0xF5, 0x83, 0xD8, 0x21, 0xED, 0x19, 0xD1, 0x55, 0xE6, + 0x1B, 0xDA, 0x71, 0xE3, 0xD0, 0xEA, 0x54, 0xE1, 0xC3, 0xEF, 0x77, 0xDC, + 0x83, 0xEC, 0xC3, 0xDE, 0xC3, 0xE5, 0x31, 0xE3, 0x83, 0xE6, 0x40, 0xED, + 0xB8, 0xE4, 0xCE, 0xF8, 0xCF, 0xDE, 0x7B, 0xF5, 0x57, 0xDE, 0x9A, 0xEB, + 0xBD, 0xDA, 0xB0, 0xE3, 0x09, 0xDA, 0x33, 0xE1, 0x5F, 0xDA, 0x53, 0xDE, + 0x6A, 0xDD, 0x99, 0xE0, 0x31, 0xDD, 0x1C, 0xE4, 0xE1, 0xDE, 0xA5, 0xE2, + 0xDE, 0xF1, 0xDC, 0xEC, 0xB4, 0xFC, 0x1D, 0xF3, 0xAC, 0xF9, 0x06, 0xF3, + 0xFA, 0x02, 0x21, 0xF6, 0xE0, 0x05, 0xD5, 0xEE, 0x68, 0xF9, 0xFB, 0xE7, + 0xF9, 0xF6, 0x46, 0xE7, 0xCA, 0x02, 0xD4, 0xEA, 0xEA, 0x11, 0xD6, 0xF0, + 0x8D, 0x1D, 0xAF, 0xF9, 0x31, 0x22, 0xE5, 0x00, 0x8A, 0x15, 0xB4, 0xFB, + 0xD8, 0x11, 0xA8, 0xFA, 0xC3, 0x16, 0x2C, 0xFC, 0xC7, 0x15, 0x5B, 0xF6, + 0x85, 0x19, 0x2E, 0xEF, 0x5B, 0x1D, 0xE1, 0xF1, 0xE6, 0x1A, 0x0C, 0xF8, + 0xC4, 0x0C, 0x73, 0xF5, 0xEA, 0x00, 0x98, 0xF6, 0x70, 0x03, 0x3E, 0x06, + 0x58, 0x0A, 0xCA, 0x16, 0x96, 0x0B, 0x8D, 0x1A, 0xE5, 0x08, 0x7C, 0x1A, + 0xD5, 0x0B, 0xD1, 0x1B, 0xEF, 0x0C, 0x2A, 0x1A, 0x3D, 0x07, 0x38, 0x12, + 0x68, 0xFD, 0x57, 0x03, 0x01, 0xFA, 0x3A, 0xFA, 0xE7, 0x08, 0xF5, 0xFC, + 0x62, 0x12, 0xDD, 0xFD, 0x17, 0x0E, 0x2A, 0xF8, 0x92, 0x0B, 0xAD, 0xF9, + 0x92, 0x0B, 0xB9, 0x00, 0xAD, 0x0F, 0x3B, 0x07, 0x12, 0x13, 0x2E, 0x10, + 0x95, 0x19, 0xBB, 0x1A, 0x88, 0x1E, 0x22, 0x24, 0xC7, 0x17, 0x45, 0x23, + 0xD4, 0x13, 0x56, 0x1F, 0xDE, 0x11, 0x78, 0x1E, 0xE3, 0x0D, 0xA5, 0x1A, + 0x7C, 0x0D, 0x8A, 0x17, 0xAB, 0x17, 0x46, 0x17, 0x2B, 0x2D, 0xD0, 0x18, + 0x74, 0x36, 0x7B, 0x13, 0xCE, 0x2D, 0x74, 0x0F, 0xFE, 0x23, 0x42, 0x15, + 0xB3, 0x1F, 0x6A, 0x1B, 0xE5, 0x1C, 0xDD, 0x20, 0xC9, 0x18, 0xD1, 0x24, + 0xD5, 0x14, 0x0A, 0x2A, 0x69, 0x0D, 0xB5, 0x2A, 0xE9, 0x0A, 0x1B, 0x27, + 0x07, 0x09, 0x19, 0x20, 0x3D, 0x02, 0x80, 0x19, 0x56, 0x03, 0xD6, 0x17, + 0xDB, 0x07, 0x86, 0x11, 0x63, 0x0D, 0x85, 0x0F, 0x69, 0x12, 0x5D, 0x0F, + 0xDE, 0x13, 0xC3, 0x0B, 0xFF, 0x1A, 0xBB, 0x0F, 0xD5, 0x1F, 0x8F, 0x12, + 0xC6, 0x19, 0xF2, 0x0E, 0xD5, 0x19, 0xC2, 0x15, 0xDC, 0x20, 0xC9, 0x26, + 0x2C, 0x21, 0x36, 0x31, 0x12, 0x25, 0x07, 0x39, 0xD2, 0x1E, 0x38, 0x3C, + 0x8B, 0x10, 0xF1, 0x34, 0x1B, 0x11, 0x8F, 0x2E, 0x42, 0x11, 0x34, 0x29, + 0xA5, 0x0E, 0x9A, 0x1F, 0xAD, 0x13, 0x61, 0x19, 0x97, 0x1D, 0xD9, 0x14, + 0xE5, 0x1F, 0x92, 0x0E, 0x46, 0x28, 0x4A, 0x17, 0x82, 0x32, 0x80, 0x27, + 0x22, 0x32, 0xCB, 0x34, 0x52, 0x2F, 0x06, 0x3C, 0x53, 0x23, 0x4E, 0x37, + 0x9C, 0x21, 0x5F, 0x36, 0xB0, 0x31, 0x26, 0x3D, 0x54, 0x33, 0xE1, 0x31, + 0x2B, 0x2C, 0xD2, 0x1A, 0x0C, 0x2A, 0xFC, 0x14, 0x21, 0x27, 0x59, 0x15, + 0xC6, 0x2B, 0x3D, 0x15, 0xC7, 0x39, 0x76, 0x1E, 0x58, 0x3B, 0x08, 0x1F, + 0x84, 0x2F, 0x36, 0x16, 0xC8, 0x30, 0x21, 0x1D, 0x86, 0x2D, 0xC2, 0x21, + 0xB9, 0x1F, 0x84, 0x1E, 0x67, 0x17, 0x2B, 0x1E, 0x4F, 0x16, 0x1D, 0x1F, + 0x1B, 0x19, 0xEF, 0x22, 0x21, 0x17, 0x00, 0x20, 0x7A, 0x12, 0xDB, 0x1C, + 0xA7, 0x09, 0xA0, 0x19, 0x19, 0x05, 0x3A, 0x1D, 0x8A, 0x06, 0x3B, 0x21, + 0x89, 0x11, 0x56, 0x1E, 0x67, 0x1C, 0xA5, 0x1A, 0x14, 0x1B, 0x1A, 0x0D, + 0x44, 0x1C, 0x2F, 0x08, 0x88, 0x17, 0x6D, 0x0E, 0x41, 0x07, 0xFB, 0x13, + 0xB5, 0xFA, 0xBF, 0x18, 0x9B, 0xEE, 0x3E, 0x12, 0x9A, 0xDF, 0x17, 0x07, + 0xDB, 0xDD, 0xBA, 0x00, 0x10, 0xEB, 0xF6, 0x00, 0x5F, 0xF2, 0x70, 0x01, + 0xB6, 0xED, 0x20, 0xF7, 0x5A, 0xED, 0x65, 0xF6, 0xCA, 0xF8, 0x7E, 0x03, + 0xEC, 0xFE, 0xCF, 0x04, 0x6E, 0xF9, 0x6A, 0xFA, 0x52, 0xFA, 0x96, 0xF8, + 0x6F, 0xFF, 0xF7, 0x00, 0x63, 0xFC, 0x0C, 0x07, 0xE0, 0xF1, 0x03, 0x07, + 0x14, 0xEA, 0x38, 0x00, 0x1C, 0xE8, 0x3C, 0xF7, 0xFB, 0xE3, 0x70, 0xF0, + 0x48, 0xE2, 0xC9, 0xF4, 0x6B, 0xDF, 0x26, 0xF6, 0x2A, 0xE1, 0x50, 0xF0, + 0xF3, 0xEB, 0x88, 0xF7, 0x62, 0xF0, 0x73, 0x03, 0xE5, 0xE6, 0xD5, 0x01, + 0x2A, 0xE1, 0xCC, 0xF9, 0xFE, 0xE9, 0xB1, 0xF4, 0x5D, 0xF8, 0xFA, 0xF0, + 0xD4, 0xFE, 0x85, 0xF1, 0x89, 0xF4, 0x7D, 0xF2, 0x8A, 0xEF, 0x03, 0xF9, + 0x10, 0xF3, 0x2E, 0xFF, 0x6E, 0xF6, 0x1E, 0xFF, 0x49, 0xFE, 0x1C, 0x02, + 0x14, 0x01, 0xC7, 0xFE, 0x12, 0x05, 0x07, 0x01, 0x79, 0x05, 0x0D, 0x07, + 0x56, 0xFD, 0x35, 0x03, 0x5C, 0xFA, 0x46, 0xFB, 0x3C, 0xFA, 0x48, 0xF1, + 0xDB, 0x05, 0x20, 0xF4, 0xC6, 0x10, 0x42, 0xF7, 0xFF, 0x17, 0x5E, 0xFA, + 0x24, 0x1B, 0x9C, 0xFF, 0x65, 0x15, 0x99, 0x0A, 0x86, 0x09, 0xD7, 0x13, + 0xAF, 0xFF, 0x9A, 0x0F, 0x19, 0x07, 0xFB, 0x0F, 0xD6, 0x11, 0x14, 0x15, + 0x54, 0x17, 0x59, 0x1E, 0x87, 0x1B, 0x13, 0x27, 0x63, 0x1F, 0x6B, 0x2A, + 0x9D, 0x1B, 0xC0, 0x22, 0xEB, 0x1D, 0x43, 0x20, 0x73, 0x1E, 0xBB, 0x1C, + 0x25, 0x17, 0x82, 0x0E, 0xBF, 0x1A, 0x92, 0x0C, 0xAE, 0x18, 0x7A, 0x0D, + 0x7D, 0x14, 0x68, 0x11, 0xB7, 0x0C, 0x94, 0x0E, 0xC9, 0x03, 0xA2, 0x06, + 0x9F, 0x07, 0x39, 0x0B, 0xF3, 0x0A, 0x23, 0x0C, 0x23, 0x0E, 0xF6, 0x0A, + 0x7F, 0x10, 0x4F, 0x08, 0xF6, 0x10, 0x88, 0x06, 0x29, 0x0F, 0xA1, 0x0A, + 0x0B, 0x0D, 0x74, 0x0D, 0xB6, 0x0D, 0x4C, 0x0E, 0x83, 0x0B, 0x44, 0x0E, + 0x4B, 0x0A, 0xE0, 0x13, 0x1E, 0x0D, 0xFB, 0x1B, 0x93, 0x07, 0xF9, 0x1A, + 0x72, 0xFD, 0xF1, 0x15, 0x1A, 0xFB, 0xFE, 0x17, 0xB3, 0xF4, 0x0B, 0x15, + 0xD4, 0xF4, 0x79, 0x0C, 0x77, 0x04, 0x7C, 0x10, 0xA6, 0x10, 0x4B, 0x19, + 0xC1, 0x12, 0xAB, 0x1B, 0xDE, 0x06, 0x68, 0x12, 0xF0, 0xFB, 0x69, 0x08, + 0x34, 0xFD, 0x31, 0x07, 0x7A, 0xF9, 0x2D, 0x00, 0xB3, 0xFB, 0x84, 0xFB, + 0x42, 0x08, 0x71, 0xFC, 0xF4, 0x0D, 0x71, 0xFC, 0x19, 0x11, 0x6B, 0x01, + 0x89, 0x11, 0x1C, 0x04, 0x72, 0x0B, 0x8F, 0x00, 0x8D, 0xFE, 0x29, 0xF6, + 0x69, 0xFE, 0x5A, 0xF3, 0x00, 0x07, 0xA8, 0xF7, 0xDA, 0x02, 0xB9, 0xF1, + 0x55, 0xFB, 0x17, 0xEB, 0xB2, 0xF8, 0x4D, 0xEB, 0x87, 0xFD, 0x27, 0xED, + 0x3D, 0xF7, 0x3F, 0xE4, 0xCA, 0xEE, 0x8D, 0xE0, 0xC6, 0xEE, 0xBA, 0xE6, + 0xDB, 0xF4, 0x82, 0xF1, 0x37, 0xFF, 0xE6, 0xFC, 0x29, 0xFC, 0x49, 0xFD, + 0xF2, 0xEC, 0x30, 0xF9, 0xD0, 0xE3, 0x64, 0xFC, 0x7E, 0xE4, 0x55, 0x00, + 0x8D, 0xE3, 0xC0, 0xF4, 0x24, 0xE8, 0x32, 0xEB, 0x70, 0xEC, 0xFD, 0xE4, + 0xDD, 0xFC, 0x9F, 0xEC, 0xA7, 0x0A, 0x76, 0xF2, 0xEF, 0xFA, 0x38, 0xE4, + 0x9F, 0xEF, 0x1C, 0xE5, 0xCA, 0xDF, 0x7E, 0xE0, 0xC9, 0xD2, 0xDD, 0xDC, + 0x98, 0xD3, 0xDD, 0xE5, 0xFD, 0xCD, 0xC1, 0xE3, 0x40, 0xCE, 0xB9, 0xE3, + 0x33, 0xD0, 0x32, 0xE3, 0x4A, 0xCD, 0x26, 0xDF, 0x67, 0xC3, 0x0E, 0xD9, + 0x25, 0xC5, 0x6E, 0xD7, 0xF7, 0xCF, 0x3D, 0xD4, 0x36, 0xD5, 0x6A, 0xD0, + 0xA2, 0xDC, 0x13, 0xD7, 0xB6, 0xDB, 0xDA, 0xD8, 0x77, 0xD3, 0x43, 0xD1, + 0x2E, 0xD1, 0xA6, 0xCE, 0xB3, 0xC6, 0x43, 0xC8, 0x7D, 0xBB, 0x17, 0xC3, + 0xCF, 0xBF, 0x31, 0xC9, 0x2F, 0xC9, 0x8E, 0xCC, 0x6B, 0xD2, 0xE3, 0xCD, + 0x78, 0xD0, 0x66, 0xCA, 0x6D, 0xC9, 0xC7, 0xCC, 0xBC, 0xC3, 0x29, 0xD0, + 0x43, 0xC3, 0xE5, 0xCD, 0x3F, 0xC9, 0x82, 0xCD, 0x3A, 0xCC, 0x95, 0xC6, + 0x75, 0xDD, 0x5C, 0xCE, 0x34, 0xD8, 0xB9, 0xC8, 0x7D, 0xCB, 0xE8, 0xC6, + 0x65, 0xC7, 0x4F, 0xCE, 0xA2, 0xBD, 0x6E, 0xC8, 0x2C, 0xCC, 0xA2, 0xD8, + 0xF5, 0xCC, 0x6B, 0xDB, 0x7D, 0xD0, 0x33, 0xDD, 0x10, 0xD8, 0xBE, 0xDD, + 0x59, 0xCC, 0xDA, 0xCF, 0xAD, 0xC4, 0x73, 0xCB, 0x45, 0xC4, 0xEB, 0xCA, + 0x27, 0xCA, 0x4D, 0xC7, 0xA4, 0xC8, 0x76, 0xB6, 0x93, 0xD3, 0xC4, 0xB9, + 0x76, 0xD8, 0xAB, 0xBD, 0xA7, 0xCE, 0xB7, 0xB4, 0x83, 0xD1, 0xD2, 0xBB, + 0x7E, 0xD4, 0x00, 0xC4, 0x90, 0xD3, 0xAC, 0xC2, 0x8A, 0xD6, 0x5F, 0xC1, + 0xE3, 0xDC, 0x55, 0xC6, 0x6C, 0xDB, 0xFC, 0xC9, 0x35, 0xD7, 0x54, 0xD5, + 0xBF, 0xD2, 0xAD, 0xDB, 0xD8, 0xD7, 0xA2, 0xD8, 0x25, 0xE3, 0x4E, 0xD0, + 0x46, 0xF2, 0x33, 0xD1, 0x5A, 0xF8, 0xC6, 0xD7, 0xA3, 0xEB, 0xE1, 0xCF, + 0xEB, 0xE9, 0x7A, 0xD1, 0x54, 0xDE, 0x24, 0xCC, 0x10, 0xD6, 0x44, 0xCB, + 0x06, 0xDC, 0x72, 0xD0, 0x3A, 0xDD, 0x77, 0xCE, 0xCE, 0xDF, 0xB5, 0xD7, + 0x18, 0xDD, 0x93, 0xDF, 0x93, 0xE4, 0x65, 0xED, 0xB8, 0xE9, 0x76, 0xF0, + 0x0B, 0xE4, 0xCB, 0xE1, 0xFE, 0xF0, 0xD8, 0xE2, 0x23, 0x00, 0x67, 0xE7, + 0x5D, 0xFE, 0x54, 0xDF, 0x89, 0xFD, 0x2C, 0xDE, 0x9E, 0xFE, 0xB0, 0xE3, + 0x58, 0xF8, 0x1B, 0xDF, 0xEA, 0xFB, 0xDE, 0xDF, 0x8F, 0x05, 0x5E, 0xE7, + 0x3D, 0x05, 0xE7, 0xEE, 0xDD, 0x01, 0x91, 0xFB, 0x64, 0xFF, 0x52, 0x06, + 0xAA, 0x01, 0x11, 0x0A, 0xB7, 0x04, 0x00, 0x08, 0x95, 0x02, 0xC3, 0x08, + 0x5B, 0x00, 0x07, 0x10, 0xCB, 0xF9, 0x9C, 0x11, 0x52, 0xEE, 0xA0, 0x08, + 0xB3, 0xEF, 0x70, 0x08, 0x64, 0xF8, 0xD9, 0x0F, 0x88, 0x02, 0xD4, 0x1A, + 0x30, 0x07, 0x27, 0x22, 0x41, 0x09, 0xAE, 0x1D, 0xDA, 0x13, 0x2E, 0x19, + 0xA6, 0x14, 0x41, 0x0F, 0x61, 0x13, 0xEC, 0x11, 0xAD, 0x07, 0x23, 0x14, + 0x7A, 0x02, 0x17, 0x16, 0xD1, 0xFD, 0xEE, 0x12, 0x56, 0xFD, 0xBB, 0x11, + 0xD7, 0x04, 0xBE, 0x15, 0xDF, 0x01, 0x65, 0x09, 0x31, 0x12, 0x37, 0x0E, + 0x4B, 0x13, 0x78, 0x07, 0x0D, 0x12, 0x33, 0x04, 0x69, 0x10, 0xCB, 0x08, + 0x02, 0x07, 0x4E, 0x03, 0x9F, 0x0A, 0x70, 0x01, 0x2D, 0x12, 0xE1, 0x02, + 0x64, 0x1B, 0x80, 0x0C, 0x26, 0x1B, 0x7E, 0x14, 0x24, 0x14, 0xE0, 0x1A, + 0x92, 0x10, 0x5F, 0x21, 0xD2, 0x06, 0xE1, 0x18, 0xB5, 0x08, 0xF3, 0x14, + 0xED, 0x0D, 0x00, 0x14, 0xCE, 0x05, 0xDD, 0x0D, 0x36, 0x0C, 0xB4, 0x1A, + 0x38, 0x07, 0x9F, 0x11, 0x96, 0x0C, 0x34, 0x0B, 0x9A, 0x14, 0x45, 0x11, + 0xC9, 0x12, 0xB7, 0x15, 0x46, 0x16, 0xDC, 0x1A, 0x49, 0x15, 0xEF, 0x16, + 0x09, 0x17, 0xBC, 0x14, 0xB3, 0x15, 0x97, 0x13, 0x2C, 0x0F, 0x9A, 0x0B, + 0xE7, 0x11, 0xC4, 0x08, 0x68, 0x1A, 0xF3, 0x0C, 0x03, 0x19, 0x44, 0x07, + 0xA5, 0x19, 0x61, 0x07, 0x21, 0x1D, 0x90, 0x0A, 0x41, 0x11, 0xB6, 0xF9, + 0xC4, 0x13, 0xBF, 0xF3, 0x53, 0x2A, 0x7A, 0x04, 0x4A, 0x2D, 0xB1, 0x06, + 0x87, 0x33, 0xF9, 0x0E, 0x45, 0x3A, 0x1D, 0x1D, 0x06, 0x32, 0xC8, 0x1A, + 0x44, 0x30, 0xA5, 0x1B, 0x11, 0x2C, 0xFC, 0x17, 0xB8, 0x26, 0xD3, 0x13, + 0xB3, 0x20, 0x0C, 0x17, 0x73, 0x1B, 0xAC, 0x19, 0xD4, 0x20, 0xE4, 0x21, + 0xA1, 0x1F, 0xED, 0x24, 0x00, 0x1D, 0x67, 0x2A, 0xC2, 0x1B, 0x5F, 0x30, + 0xE4, 0x1D, 0xD4, 0x2F, 0x9D, 0x1C, 0x8E, 0x27, 0xE1, 0x20, 0x0A, 0x2A, + 0xAF, 0x26, 0xB5, 0x2E, 0x6F, 0x14, 0xE7, 0x17, 0xAA, 0x12, 0xCB, 0x14, + 0xC8, 0x15, 0x5D, 0x19, 0xE1, 0x08, 0xF5, 0x0D, 0x8F, 0x0B, 0x16, 0x19, + 0xC1, 0x0C, 0x0E, 0x25, 0x47, 0x02, 0xC5, 0x1C, 0xAA, 0xFF, 0x47, 0x17, + 0x16, 0xFC, 0xDF, 0x0A, 0xC5, 0xFF, 0x7A, 0x01, 0xE3, 0x09, 0x61, 0x01, + 0x83, 0x12, 0xCE, 0x00, 0x46, 0x1B, 0xB9, 0x08, 0x4A, 0x17, 0xAA, 0x0C, + 0x79, 0x08, 0x45, 0x07, 0xF7, 0xFD, 0xEC, 0x06, 0xF1, 0xF6, 0x80, 0x05, + 0x0C, 0xEC, 0x06, 0xFB, 0x37, 0xF2, 0x5F, 0x00, 0x60, 0xF4, 0x59, 0x01, + 0xD3, 0xF2, 0xD3, 0xFA, 0x03, 0xF9, 0x7B, 0xFC, 0x6D, 0xF3, 0x8D, 0xF8, + 0x82, 0xEE, 0x95, 0xF5, 0x98, 0xEB, 0x25, 0xF6, 0x1D, 0xF0, 0x20, 0xFA, + 0x0F, 0xF1, 0x94, 0xFC, 0xC9, 0xE7, 0x58, 0xFC, 0x2A, 0xE6, 0xAD, 0xFE, + 0x9E, 0xEA, 0x99, 0xFF, 0x8F, 0xEC, 0x3B, 0xF6, 0x22, 0xED, 0xA0, 0xE9, + 0xAC, 0xF7, 0x1A, 0xEA, 0x3C, 0xFD, 0xB3, 0xE7, 0x28, 0xF5, 0xBE, 0xDE, + 0x74, 0xF2, 0xF9, 0xE3, 0x3C, 0xEC, 0xBB, 0xE5, 0x3E, 0xE5, 0x4F, 0xE0, + 0x21, 0xED, 0x02, 0xE8, 0xD9, 0xF5, 0x86, 0xF1, 0x60, 0xF7, 0xEE, 0xF1, + 0x79, 0xFC, 0x61, 0xF9, 0x60, 0x02, 0xD3, 0x00, 0xD7, 0xF6, 0x83, 0xF7, + 0xC1, 0xF4, 0xB5, 0xF7, 0x8B, 0xF8, 0x41, 0xF5, 0xCE, 0xFF, 0x71, 0xF3, + 0xD9, 0x05, 0x06, 0xF6, 0x56, 0x02, 0x29, 0xF8, 0xF9, 0x07, 0x0A, 0x08, + 0xF4, 0xFF, 0xBB, 0x01, 0x0F, 0xFE, 0x4A, 0xFB, 0xA0, 0x07, 0x84, 0x02, + 0x80, 0x08, 0x74, 0x01, 0xFD, 0x0B, 0x0C, 0x04, 0x57, 0x17, 0xA2, 0x10, + 0xC6, 0x11, 0xBE, 0x0E, 0xE3, 0x0D, 0x87, 0x0E, 0x70, 0x0D, 0x65, 0x14, + 0xE1, 0x07, 0x4A, 0x0F, 0xE6, 0x0C, 0x70, 0x10, 0x38, 0x14, 0xE7, 0x17, + 0x39, 0x19, 0x52, 0x1C, 0x12, 0x16, 0xEE, 0x1C, 0xBD, 0x12, 0xD7, 0x21, + 0xB5, 0x02, 0x1E, 0x17, 0xDD, 0x00, 0x21, 0x15, 0x34, 0x07, 0xF0, 0x12, + 0x85, 0x0C, 0xAD, 0x11, 0xA8, 0x1A, 0xFD, 0x20, 0xD6, 0x18, 0x49, 0x23, + 0x53, 0x16, 0xA3, 0x25, 0x2F, 0x14, 0x6C, 0x29, 0xF6, 0x12, 0x84, 0x2C, + 0x11, 0x12, 0xE4, 0x28, 0x28, 0x1F, 0xBF, 0x33, 0x0C, 0x22, 0x97, 0x35, + 0x27, 0x1A, 0x50, 0x2E, 0xB6, 0x22, 0x80, 0x3A, 0xE7, 0x1D, 0x1F, 0x31, + 0xE4, 0x1B, 0xB0, 0x26, 0x83, 0x27, 0x93, 0x2D, 0x50, 0x23, 0x36, 0x2C, + 0xC7, 0x1F, 0xF9, 0x34, 0xDB, 0x1F, 0x09, 0x41, 0x03, 0x18, 0x65, 0x40, + 0x56, 0x19, 0x5E, 0x40, 0x0B, 0x20, 0x4C, 0x3D, 0xAB, 0x2E, 0x75, 0x41, + 0x23, 0x2C, 0xA3, 0x39, 0x77, 0x31, 0xBF, 0x3E, 0xA1, 0x32, 0x3F, 0x41, + 0x63, 0x2B, 0xDC, 0x39, 0x80, 0x2A, 0xB8, 0x31, 0x3F, 0x31, 0xDC, 0x2D, + 0x1B, 0x36, 0x6D, 0x2E, 0x5A, 0x2A, 0x27, 0x20, 0x37, 0x2B, 0x2B, 0x28, + 0x16, 0x1F, 0xB9, 0x26, 0xEF, 0x1C, 0xB1, 0x22, 0x28, 0x32, 0x80, 0x2B, + 0x05, 0x37, 0x7F, 0x21, 0x4D, 0x41, 0x53, 0x25, 0x21, 0x43, 0x9C, 0x2A, + 0x2F, 0x34, 0x87, 0x23, 0x86, 0x31, 0x7E, 0x27, 0xCC, 0x28, 0x16, 0x20, + 0xA1, 0x25, 0xC9, 0x17, 0xF2, 0x2B, 0x0B, 0x14, 0x85, 0x2D, 0x85, 0x0C, + 0xD8, 0x2C, 0x52, 0x07, 0xF1, 0x29, 0x8C, 0x04, 0xA0, 0x22, 0xAF, 0x06, + 0xB6, 0x18, 0xA2, 0x05, 0x37, 0x1B, 0x0E, 0x12, 0x22, 0x0F, 0x9C, 0x11, + 0x64, 0x0D, 0x94, 0x1C, 0xC3, 0x08, 0xCC, 0x27, 0x32, 0xF4, 0x2A, 0x1B, + 0xC3, 0xF9, 0x39, 0x20, 0xBC, 0xFC, 0x1D, 0x1F, 0x6C, 0xFF, 0x2B, 0x19, + 0xD1, 0xFC, 0x83, 0x0D, 0xC0, 0xF9, 0x1D, 0x04, 0x43, 0xF8, 0xCB, 0xF7, + 0x2D, 0xF3, 0xC4, 0xE4, 0xC0, 0xFA, 0x4E, 0xE8, 0x13, 0xFA, 0xD1, 0xEE, + 0xC2, 0xEC, 0xAD, 0xEA, 0x53, 0xF3, 0x43, 0xFA, 0xB2, 0xF2, 0x2E, 0xFA, + 0x79, 0xEF, 0x74, 0xF9, 0x01, 0xF0, 0x7B, 0x01, 0x78, 0xE7, 0x32, 0xFA, + 0x32, 0xE9, 0x4A, 0xF5, 0xC2, 0xEF, 0x6E, 0xED, 0x20, 0xFF, 0x13, 0xF0, + 0x08, 0xFB, 0x24, 0xE7, 0x84, 0xEF, 0x1A, 0xE0, 0x8F, 0xE7, 0x5C, 0xE3, + 0x8B, 0xDE, 0x44, 0xE0, 0x2C, 0xD1, 0x84, 0xD5, 0xAE, 0xC7, 0x76, 0xD7, + 0xFD, 0xC4, 0x22, 0xE1, 0x99, 0xC9, 0xB3, 0xE6, 0xFC, 0xD9, 0x73, 0xEC, + 0xAD, 0xDD, 0xA6, 0xE5, 0x7F, 0xDD, 0xAA, 0xDF, 0xAA, 0xD7, 0xA8, 0xE3, + 0xEA, 0xC4, 0x9C, 0xE0, 0x9F, 0xC8, 0xDF, 0xE1, 0xD0, 0xD8, 0xAF, 0xE4, + 0x28, 0xD5, 0xC3, 0xD6, 0x70, 0xDD, 0xAB, 0xDB, 0x3F, 0xD9, 0x84, 0xD6, + 0x4E, 0xCF, 0xA2, 0xCB, 0xCF, 0xD0, 0x6A, 0xCE, 0x73, 0xC9, 0x56, 0xD1, + 0x20, 0xCD, 0xA6, 0xE1, 0xEA, 0xD2, 0x02, 0xED, 0x18, 0xDA, 0xF7, 0xF2, + 0x4B, 0xE9, 0xC3, 0xFC, 0xA4, 0xEC, 0x76, 0xF5, 0x54, 0xEB, 0x94, 0xEC, + 0xA9, 0xED, 0x61, 0xE7, 0xA5, 0xEA, 0x0F, 0xE0, 0xBD, 0xEE, 0xE9, 0xE0, + 0x45, 0xEE, 0xCA, 0xDC, 0xBB, 0xE6, 0x6A, 0xDD, 0xA4, 0xDC, 0xBD, 0xD7, + 0xD7, 0xDB, 0xDA, 0xD4, 0xDC, 0xE0, 0xF5, 0xD9, 0x63, 0xD9, 0x83, 0xD1, + 0x64, 0xE2, 0xA5, 0xE0, 0xF1, 0xDF, 0x44, 0xEE, 0x1D, 0xD8, 0xFB, 0xEA, + 0x6C, 0xE2, 0xE5, 0xEA, 0x85, 0xEF, 0x84, 0xE6, 0x34, 0xEF, 0xE1, 0xD6, + 0xED, 0xF3, 0xBD, 0xD6, 0x63, 0xFF, 0x52, 0xE2, 0x73, 0xFA, 0x3A, 0xDA, + 0x9C, 0xFA, 0x0D, 0xDA, 0xF1, 0xF2, 0x25, 0xD4, 0xE5, 0xE7, 0x14, 0xC8, + 0x3D, 0xE0, 0x39, 0xC5, 0xC2, 0xD9, 0x46, 0xC7, 0xF5, 0xDC, 0x6A, 0xD6, + 0x51, 0xE6, 0x45, 0xE6, 0x87, 0xE7, 0xD8, 0xE6, 0x1D, 0xF9, 0x76, 0xF8, + 0xAA, 0xF7, 0x01, 0xF1, 0x1B, 0xF3, 0xB7, 0xE5, 0x1D, 0x05, 0x5B, 0xF6, + 0x23, 0xF6, 0x2C, 0xE5, 0x43, 0xF6, 0x22, 0xE4, 0x07, 0xFB, 0x7F, 0xEF, + 0xCD, 0xEC, 0xF1, 0xEA, 0x67, 0xE7, 0x6F, 0xED, 0x5F, 0xE4, 0xCC, 0xF4, + 0x79, 0xE5, 0xB6, 0x01, 0x9E, 0xE7, 0xF7, 0x03, 0x35, 0xEF, 0xAC, 0x04, + 0x30, 0xFB, 0x37, 0x05, 0x55, 0x01, 0x1E, 0xFD, 0x44, 0x04, 0x11, 0xFA, + 0x75, 0xFC, 0x19, 0xF1, 0x1F, 0xF6, 0xD6, 0xEF, 0x20, 0xF3, 0x66, 0xF7, + 0x65, 0xE6, 0x9E, 0xF4, 0x9D, 0xE9, 0xAC, 0xFB, 0x43, 0xEC, 0x60, 0xFC, + 0xDA, 0xEA, 0xAD, 0xF1, 0xD4, 0xF9, 0xC2, 0xF6, 0x1E, 0xFD, 0x88, 0xF1, + 0xB7, 0xFF, 0xFB, 0xED, 0x01, 0x08, 0x79, 0xF7, 0xC9, 0x04, 0x6A, 0xF8, + 0xC8, 0x09, 0x3E, 0x06, 0x51, 0x02, 0xD1, 0x09, 0xDC, 0x01, 0xC8, 0x04, + 0x71, 0x07, 0x4F, 0x01, 0xA4, 0xFA, 0x32, 0xF5, 0x30, 0xFC, 0x10, 0xF7, + 0x93, 0xF8, 0x4D, 0xF9, 0x58, 0xF3, 0x96, 0xF7, 0xCF, 0xF5, 0xB4, 0xF7, + 0x0A, 0xFB, 0x69, 0xFE, 0xAA, 0xF1, 0xD2, 0xF7, 0xB3, 0xEF, 0x1A, 0xFA, + 0xDF, 0xFA, 0x34, 0x08, 0x14, 0xF3, 0xE5, 0xFD, 0xE7, 0xF9, 0x1E, 0x03, + 0x2B, 0x06, 0xAC, 0x08, 0x5B, 0x06, 0xCE, 0xF9, 0xC4, 0x0C, 0x1D, 0xF4, + 0x3C, 0x0F, 0xA4, 0xF4, 0xDA, 0x05, 0xA1, 0xF1, 0x80, 0xF9, 0x8F, 0xEB, + 0xF8, 0xFD, 0x7C, 0xED, 0xDB, 0x02, 0x74, 0xEE, 0x0F, 0xFC, 0x4F, 0xE4, + 0x36, 0x0B, 0x79, 0xEF, 0xFF, 0x0A, 0x1D, 0xF3, 0x1B, 0x06, 0x02, 0xF6, + 0x98, 0x11, 0xB2, 0x04, 0xCA, 0x11, 0x1A, 0x07, 0x93, 0x13, 0x83, 0x0B, + 0x0B, 0x13, 0xC4, 0x0D, 0x96, 0x12, 0xA5, 0x0C, 0xD0, 0x0C, 0x1A, 0x04, + 0xA3, 0x08, 0x98, 0xFF, 0xBE, 0x08, 0xA3, 0xFA, 0xAB, 0x08, 0x65, 0xF7, + 0xE1, 0x08, 0x49, 0xF5, 0xC1, 0x13, 0xD3, 0xF9, 0x6E, 0x1E, 0x9F, 0x01, + 0x78, 0x19, 0xE9, 0x01, 0x0F, 0x1E, 0x85, 0x13, 0x07, 0x14, 0x5E, 0x14, + 0xB1, 0x0C, 0x64, 0x09, 0xF1, 0x1C, 0xA2, 0x10, 0xB1, 0x14, 0xC0, 0x02, + 0xA4, 0x0E, 0x94, 0xF7, 0x8A, 0x17, 0x6B, 0x00, 0x1D, 0x0D, 0x60, 0xFC, + 0x27, 0xFD, 0xDA, 0xF9, 0xEB, 0xFB, 0x4A, 0x06, 0xB2, 0xFC, 0xB6, 0x0D, + 0x76, 0xFA, 0xC5, 0x0E, 0x94, 0x00, 0x96, 0x17, 0x03, 0x06, 0xEA, 0x1B, + 0x7C, 0x02, 0xF7, 0x1A, 0xF4, 0x02, 0x2D, 0x1E, 0x71, 0x06, 0xC7, 0x1C, + 0xF1, 0x03, 0x4F, 0x14, 0xB2, 0xFC, 0xF4, 0x08, 0xE7, 0xFE, 0x09, 0x09, + 0x3D, 0xFC, 0x15, 0x04, 0x65, 0xF2, 0x95, 0xFA, 0xFE, 0xEC, 0x55, 0xFC, + 0x49, 0xE2, 0xEB, 0xF3, 0xBE, 0xEA, 0x85, 0xF3, 0xEE, 0xEC, 0x2E, 0xE9, + 0x57, 0xF9, 0x03, 0xED, 0xB5, 0x03, 0x68, 0xF8, 0x6F, 0xF6, 0xB6, 0xF2, + 0xE7, 0xF3, 0xC1, 0xF9, 0x78, 0xE6, 0xAD, 0xF2, 0x17, 0xEA, 0xCB, 0xEE, + 0xF5, 0xED, 0x6D, 0xE6, 0x8D, 0xEB, 0x13, 0xDC, 0x05, 0xF1, 0xD5, 0xDC, + 0x28, 0xE7, 0x7D, 0xD4, 0xFF, 0xE7, 0x18, 0xD8, 0x91, 0xE8, 0xCA, 0xD7, + 0x30, 0xE5, 0x93, 0xD1, 0x22, 0xE5, 0xF7, 0xCC, 0x84, 0xE2, 0x6E, 0xCE, + 0x1B, 0xEB, 0xB3, 0xE3, 0xF9, 0xE4, 0x11, 0xE5, 0x54, 0xE7, 0x3D, 0xEF, + 0x0D, 0xE6, 0xA0, 0xF5, 0x80, 0xDF, 0x9E, 0xEF, 0xE6, 0xEC, 0x0D, 0xFB, + 0xD6, 0xED, 0x9A, 0xF5, 0x4E, 0xEF, 0x62, 0xF1, 0xB7, 0xEF, 0xD7, 0xEE, + 0x0D, 0xF4, 0xC3, 0xE6, 0xE0, 0xFB, 0xF6, 0xE0, 0x6B, 0x00, 0x00, 0xE1, + 0x2F, 0xFE, 0x41, 0xE3, 0xBE, 0xF6, 0x8E, 0xEE, 0xF9, 0xEF, 0xCA, 0xFA, + 0x12, 0xF2, 0x7C, 0x01, 0x51, 0x01, 0xE2, 0x0D, 0xF9, 0x04, 0xB9, 0x0B, + 0x29, 0x02, 0x43, 0x06, 0x9B, 0x02, 0x34, 0x06, 0xAA, 0x00, 0xEF, 0xFB, + 0xEC, 0x07, 0x59, 0xFA, 0x83, 0x06, 0x0B, 0xF8, 0xC9, 0x09, 0x04, 0xFD, + 0x52, 0x0A, 0xD8, 0x00, 0x13, 0x08, 0x05, 0x02, 0x3D, 0x08, 0x0D, 0x08, + 0x59, 0xF7, 0x0D, 0x04, 0x50, 0xF1, 0x6C, 0x0B, 0x2E, 0xED, 0xC3, 0x0C, + 0x3A, 0xF8, 0x1C, 0x11, 0x37, 0x08, 0x2A, 0x11, 0xF0, 0x13, 0x19, 0x0F, + 0xD7, 0x20, 0xFC, 0x1A, 0x53, 0x19, 0xC3, 0x17, 0x57, 0x1A, 0xAB, 0x16, + 0xAF, 0x22, 0x0F, 0x1A, 0xEA, 0x20, 0x7A, 0x18, 0x17, 0x25, 0x8D, 0x25, + 0xF2, 0x1D, 0xC6, 0x26, 0x21, 0x23, 0xFF, 0x27, 0x09, 0x25, 0x2B, 0x21, + 0xC1, 0x24, 0x17, 0x21, 0x0D, 0x23, 0x37, 0x2B, 0xF1, 0x0D, 0x0B, 0x2B, + 0xE7, 0x0D, 0x2E, 0x38, 0x69, 0x1A, 0xD2, 0x3D, 0xC1, 0x2D, 0xF5, 0x43, + 0x64, 0x33, 0x01, 0x42, 0x9E, 0x2E, 0x25, 0x3A, 0x92, 0x37, 0x83, 0x40, + 0x1B, 0x38, 0xF6, 0x39, 0x8D, 0x36, 0x0A, 0x32, 0x37, 0x38, 0xBA, 0x32, + 0x14, 0x33, 0x76, 0x29, 0x66, 0x38, 0x36, 0x2E, 0xBD, 0x2E, 0x3D, 0x2A, + 0xFF, 0x2B, 0x02, 0x2C, 0x95, 0x29, 0x12, 0x31, 0x9F, 0x20, 0xDA, 0x2F, + 0x3D, 0x2C, 0x7D, 0x3D, 0x47, 0x2C, 0xEB, 0x38, 0x8C, 0x2B, 0xAE, 0x30, + 0xD0, 0x33, 0x69, 0x3A, 0x3A, 0x33, 0x3D, 0x3F, 0xCB, 0x2D, 0x58, 0x34, + 0xBC, 0x38, 0x70, 0x35, 0x3B, 0x3E, 0x2B, 0x30, 0x9E, 0x40, 0xE2, 0x28, + 0x82, 0x3F, 0xFE, 0x25, 0x12, 0x35, 0x97, 0x25, 0xFE, 0x27, 0x7A, 0x28, + 0x1D, 0x19, 0xAF, 0x23, 0xD0, 0x1C, 0xF2, 0x25, 0xA0, 0x22, 0x2E, 0x26, + 0x79, 0x2B, 0x85, 0x2A, 0x48, 0x34, 0xB2, 0x2A, 0x1A, 0x40, 0xE2, 0x30, + 0xB1, 0x3A, 0x5A, 0x2C, 0x2D, 0x33, 0xB9, 0x25, 0xA6, 0x35, 0x69, 0x29, + 0x73, 0x23, 0x66, 0x1C, 0x99, 0x26, 0xAE, 0x25, 0xA1, 0x27, 0x89, 0x28, + 0xF9, 0x1D, 0x53, 0x1F, 0x5E, 0x22, 0x01, 0x26, 0x97, 0x22, 0x77, 0x23, + 0xE1, 0x1F, 0xE0, 0x16, 0xC7, 0x27, 0x37, 0x19, 0x8E, 0x21, 0x33, 0x17, + 0x1D, 0x23, 0xD5, 0x1F, 0x16, 0x25, 0xC9, 0x25, 0x56, 0x23, 0x7F, 0x2B, + 0x02, 0x23, 0xB9, 0x36, 0x6E, 0x20, 0xCE, 0x36, 0xE1, 0x22, 0x30, 0x34, + 0x20, 0x1D, 0xB9, 0x2C, 0x65, 0x14, 0x98, 0x26, 0x69, 0x0D, 0xAE, 0x1D, + 0x2B, 0x09, 0x42, 0x13, 0xEE, 0xFF, 0xA4, 0x07, 0x97, 0x01, 0x7B, 0x0B, + 0x8A, 0x03, 0xBA, 0x12, 0x3A, 0xFD, 0x70, 0x18, 0xB5, 0xFA, 0x77, 0x20, + 0xEA, 0xFC, 0x44, 0x24, 0x37, 0xFA, 0xE9, 0x1C, 0x20, 0x06, 0x30, 0x1E, + 0x03, 0x0C, 0xE7, 0x15, 0x34, 0x12, 0x2E, 0x0A, 0xC9, 0x19, 0x37, 0x05, + 0x01, 0x0F, 0x34, 0xFA, 0x8C, 0x0A, 0xD6, 0xFE, 0x16, 0xFA, 0xA2, 0xF7, + 0x9B, 0xF0, 0xA5, 0xF8, 0x0F, 0xF2, 0x83, 0xFF, 0xA6, 0xF0, 0x9B, 0xF6, + 0x33, 0xFE, 0x8A, 0xFB, 0x35, 0xFB, 0x03, 0xFC, 0x36, 0xF0, 0x8E, 0xF6, + 0x1D, 0xF7, 0x08, 0xF9, 0x40, 0xFF, 0x17, 0xF9, 0xAE, 0x02, 0x27, 0xFB, + 0x77, 0x02, 0x16, 0x01, 0x7D, 0x03, 0xC4, 0x04, 0xBC, 0xFE, 0x76, 0xFE, + 0x13, 0xFB, 0x3A, 0xF9, 0xAC, 0xF3, 0xD9, 0xF5, 0x11, 0xEB, 0xF0, 0xF1, + 0x77, 0xE9, 0x6D, 0xF3, 0x3E, 0xE2, 0xA5, 0xED, 0x15, 0xED, 0x1E, 0xF6, + 0x9B, 0xEA, 0xCC, 0xF6, 0x77, 0xDE, 0xC3, 0xF5, 0x40, 0xDD, 0x2A, 0xF8, + 0xFF, 0xD3, 0x30, 0xE5, 0x94, 0xDA, 0x6C, 0xDC, 0x91, 0xE0, 0xA8, 0xD3, + 0x50, 0xE8, 0x4A, 0xD5, 0xED, 0xE8, 0xB7, 0xD4, 0x69, 0xE1, 0xE0, 0xCC, + 0x14, 0xE6, 0x2A, 0xD2, 0xF6, 0xE1, 0xB3, 0xCC, 0x17, 0xE3, 0x2A, 0xD0, + 0xC3, 0xE1, 0x86, 0xD3, 0xC1, 0xE8, 0xAA, 0xD9, 0xE0, 0xF2, 0x75, 0xE0, + 0x07, 0xE9, 0x44, 0xD8, 0xB1, 0xEB, 0x9C, 0xDE, 0x17, 0xE5, 0xDB, 0xDA, + 0x3C, 0xE2, 0x37, 0xD7, 0xAB, 0xEA, 0xF7, 0xDE, 0x34, 0xE6, 0x06, 0xE3, + 0x57, 0xF0, 0x41, 0xF2, 0x3F, 0xEF, 0x20, 0xEF, 0xE7, 0xEA, 0x69, 0xEF, + 0x1E, 0xEC, 0x0D, 0xF4, 0xF0, 0xE0, 0x46, 0xEB, 0x2B, 0xE2, 0x58, 0xF2, + 0x61, 0xE5, 0xEE, 0xF2, 0x1B, 0xE6, 0x7C, 0xF6, 0x49, 0xE8, 0x44, 0xFD, + 0x48, 0xF0, 0x0B, 0x04, 0xB7, 0xF3, 0xEE, 0x08, 0xEB, 0xF0, 0x78, 0x06, + 0xCC, 0xF6, 0xEC, 0x02, 0x1D, 0xFF, 0xF8, 0xFC, 0x8B, 0x03, 0x21, 0xF2, + 0x49, 0x0A, 0x49, 0xEF, 0xE3, 0x07, 0x25, 0xF3, 0x68, 0xFE, 0x29, 0xF3, + 0x2E, 0xFA, 0x09, 0xF5, 0x87, 0xEF, 0x80, 0xF1, 0xC7, 0xEE, 0x10, 0xF8, + 0x1E, 0xED, 0xF6, 0xFC, 0x33, 0xF1, 0x06, 0x06, 0xBC, 0xFD, 0xC2, 0x0F, + 0x18, 0xF7, 0x58, 0x08, 0xFD, 0xFF, 0x1A, 0x0E, 0x5C, 0x02, 0xDB, 0x08, + 0x98, 0x01, 0xBE, 0x02, 0x52, 0x07, 0x60, 0x07, 0xA6, 0xF3, 0xCF, 0xFC, + 0x11, 0xF4, 0xE8, 0x05, 0x7F, 0xFA, 0x32, 0x0B, 0x47, 0xF4, 0xFE, 0xFE, + 0x44, 0xFB, 0x43, 0x01, 0x73, 0xF9, 0x57, 0xFC, 0x1F, 0xFE, 0x7F, 0xFF, + 0x9F, 0xFC, 0x3B, 0x00, 0x5C, 0xFA, 0x39, 0x01, 0x43, 0x03, 0xE0, 0x09, + 0x90, 0xFC, 0x44, 0xFF, 0xBA, 0x07, 0xA0, 0xFF, 0xF1, 0xFD, 0x25, 0xEE, + 0x39, 0xF8, 0x9E, 0xE6, 0xD8, 0xF1, 0x9F, 0xDF, 0xD5, 0xE8, 0xC7, 0xD9, + 0x2B, 0xF6, 0x69, 0xE8, 0x6B, 0xF0, 0x35, 0xDC, 0x0C, 0x01, 0x44, 0xE7, + 0x33, 0x06, 0xA8, 0xF0, 0xDC, 0xFB, 0x05, 0xEF, 0xF0, 0xFC, 0x5D, 0xFA, + 0x63, 0xF1, 0xE7, 0xF0, 0x19, 0x06, 0x14, 0xFC, 0xA8, 0x0C, 0x3A, 0xFB, + 0x04, 0x04, 0xE6, 0xF3, 0xD9, 0x07, 0x87, 0xFE, 0x85, 0xF8, 0x44, 0xF6, + 0x20, 0xF1, 0x50, 0xEF, 0x02, 0xED, 0xA3, 0xE6, 0x7C, 0xED, 0x44, 0xE7, + 0x89, 0xE8, 0xB1, 0xE2, 0x80, 0xEB, 0x6A, 0xE2, 0x30, 0xFA, 0x5F, 0xED, + 0xD2, 0xF3, 0x42, 0xE6, 0xA6, 0xF7, 0x97, 0xF1, 0x46, 0xF6, 0x6F, 0xF7, + 0x0D, 0xF8, 0x6B, 0xFB, 0xA1, 0x08, 0x4A, 0x05, 0x27, 0x0D, 0xF4, 0x00, + 0x81, 0x13, 0x8F, 0x0B, 0x4E, 0xFF, 0x92, 0x00, 0x57, 0xF4, 0xAA, 0xF7, + 0x7A, 0xF6, 0xA6, 0xF0, 0x80, 0xF1, 0xE1, 0xDF, 0x85, 0xF9, 0x22, 0xE6, + 0xFC, 0xFC, 0xD7, 0xEE, 0xAC, 0xFE, 0x0B, 0xF2, 0xD3, 0xFF, 0xBE, 0xF4, + 0xA3, 0xFF, 0x11, 0x00, 0x15, 0xF9, 0xEE, 0x08, 0x05, 0xF6, 0xFA, 0x10, + 0x4C, 0x03, 0x39, 0x20, 0xBB, 0x07, 0x57, 0x1D, 0x11, 0x0B, 0x59, 0x17, + 0x15, 0x0E, 0x62, 0x11, 0x6F, 0x04, 0x54, 0x04, 0x71, 0xFF, 0x84, 0xFF, + 0x2B, 0xFC, 0x86, 0xFD, 0x3E, 0xFB, 0xE2, 0xFF, 0xB3, 0xFB, 0xB6, 0x02, + 0x4D, 0x04, 0xAA, 0x0B, 0xFE, 0x0A, 0x69, 0x14, 0x4E, 0x0B, 0x7F, 0x13, + 0xC0, 0x10, 0x56, 0x14, 0xCE, 0x0E, 0x07, 0x16, 0x35, 0x06, 0xAC, 0x12, + 0x08, 0xFC, 0xFC, 0x0E, 0x4D, 0xF6, 0x53, 0x0C, 0x2B, 0xFC, 0xFC, 0x07, + 0x7A, 0xF5, 0x4E, 0xFC, 0x8A, 0xF5, 0xF8, 0xFD, 0x44, 0xF2, 0x2E, 0xF6, + 0xD1, 0xE8, 0xCE, 0xE4, 0x04, 0xF1, 0x80, 0xE5, 0x3B, 0xF2, 0x0E, 0xE2, + 0x34, 0xF7, 0x58, 0xE6, 0xD4, 0xF7, 0xC6, 0xE9, 0x5E, 0xFC, 0x0F, 0xED, + 0x2A, 0xFF, 0xEB, 0xEC, 0x3D, 0x02, 0x60, 0xEB, 0xB7, 0x05, 0x40, 0xE8, + 0x1D, 0xFE, 0x25, 0xE2, 0x91, 0xF9, 0xBD, 0xE3, 0x15, 0xEC, 0x05, 0xDD, + 0xD1, 0xDF, 0x2A, 0xD7, 0x83, 0xDD, 0xFD, 0xD4, 0x94, 0xD7, 0x1E, 0xCD, + 0xD8, 0xDD, 0xC6, 0xCC, 0x65, 0xDA, 0x27, 0xC2, 0xF0, 0xDB, 0xE8, 0xC7, + 0xB0, 0xDB, 0x3B, 0xD0, 0x84, 0xD4, 0x3A, 0xD3, 0x7B, 0xE2, 0xD0, 0xE5, + 0x61, 0xDB, 0xCB, 0xDF, 0x0A, 0xDF, 0xD7, 0xE5, 0x75, 0xE0, 0xA6, 0xE8, + 0x4D, 0xDA, 0x44, 0xE3, 0x37, 0xDB, 0x4D, 0xDE, 0x95, 0xD2, 0xE9, 0xD4, + 0x7D, 0xCE, 0x83, 0xD1, 0xC0, 0xC5, 0x26, 0xC6, 0x5F, 0xCA, 0x39, 0xC9, + 0x7B, 0xC8, 0xFB, 0xBD, 0x7A, 0xC4, 0x40, 0xB9, 0xF0, 0xCC, 0x1A, 0xC6, + 0x2F, 0xCD, 0x6F, 0xC7, 0xE2, 0xD3, 0x3F, 0xD3, 0x97, 0xDC, 0x00, 0xDF, + 0x0C, 0xE2, 0xFD, 0xE5, 0x1B, 0xE2, 0xA3, 0xE1, 0xE4, 0xDB, 0x70, 0xD6, + 0xCE, 0xE2, 0xA5, 0xD7, 0x73, 0xE2, 0xB9, 0xD1, 0x10, 0xE6, 0xF7, 0xD3, + 0xFE, 0xF3, 0x7A, 0xDF, 0x36, 0xEB, 0x8D, 0xDF, 0xFF, 0xEC, 0x45, 0xE4, + 0xFE, 0xEA, 0x27, 0xDC, 0x58, 0xEB, 0xCA, 0xDD, 0xCE, 0xE8, 0xC5, 0xE1, + 0x01, 0xE0, 0x29, 0xE3, 0xE2, 0xED, 0x29, 0xF2, 0x4C, 0xF1, 0x0D, 0xF3, + 0xEF, 0xEF, 0xB9, 0xF2, 0x43, 0xF2, 0xFE, 0xF9, 0xF2, 0xED, 0xEE, 0xFE, + 0xBF, 0xF0, 0xE5, 0x01, 0xAD, 0x04, 0xD8, 0x0E, 0xBD, 0x07, 0x0E, 0x0F, + 0xA4, 0x05, 0xDE, 0x0B, 0xEE, 0x10, 0xC7, 0x0F, 0x5F, 0x0D, 0xE6, 0x02, + 0xC8, 0x08, 0x47, 0xFB, 0xA6, 0x10, 0xA8, 0x06, 0x17, 0x0B, 0x6A, 0x0A, + 0x88, 0x12, 0x6B, 0x18, 0xE6, 0x1D, 0x33, 0x24, 0xA8, 0x21, 0x68, 0x27, + 0x37, 0x26, 0x1A, 0x27, 0xF4, 0x1D, 0xF9, 0x1A, 0xE5, 0x1F, 0x58, 0x20, + 0xB5, 0x22, 0xF8, 0x26, 0xA1, 0x26, 0x1E, 0x28, 0x6A, 0x34, 0xAD, 0x2C, + 0x59, 0x37, 0x10, 0x2B, 0x13, 0x2D, 0xB8, 0x20, 0x0B, 0x27, 0x24, 0x1A, + 0x24, 0x27, 0x26, 0x1B, 0xD0, 0x28, 0x65, 0x1D, 0xC4, 0x2E, 0x68, 0x25, + 0x53, 0x34, 0xEB, 0x33, 0x2B, 0x36, 0xF1, 0x3B, 0x46, 0x39, 0xB4, 0x3F, + 0xD0, 0x2F, 0x07, 0x3A, 0xAB, 0x30, 0x26, 0x3C, 0x87, 0x35, 0x5D, 0x3E, + 0xD0, 0x28, 0xF3, 0x2E, 0xEE, 0x31, 0x4B, 0x32, 0xF4, 0x30, 0xA3, 0x2B, + 0xC5, 0x23, 0x00, 0x19, 0x1B, 0x23, 0xAB, 0x13, 0xF8, 0x1D, 0x43, 0x12, + 0xBE, 0x1B, 0x8A, 0x14, 0x74, 0x26, 0x50, 0x20, 0x91, 0x30, 0xFB, 0x26, + 0xDF, 0x34, 0x23, 0x25, 0x3B, 0x35, 0x87, 0x1F, 0xAD, 0x39, 0x92, 0x23, + 0x7D, 0x35, 0xBE, 0x23, 0x17, 0x25, 0x94, 0x16, 0x2E, 0x2B, 0xC7, 0x23, + 0xE5, 0x34, 0x80, 0x2F, 0x0E, 0x29, 0xEA, 0x22, 0xE7, 0x27, 0xF8, 0x21, + 0x34, 0x1F, 0x15, 0x1F, 0x5A, 0x0C, 0x12, 0x17, 0xFC, 0x0D, 0x1C, 0x1A, + 0x8A, 0x1C, 0x51, 0x28, 0xC4, 0x12, 0x19, 0x1B, 0xFD, 0x14, 0xCB, 0x18, + 0x2A, 0x20, 0x77, 0x24, 0xA3, 0x0B, 0x43, 0x11, 0x20, 0x05, 0x4A, 0x13, + 0x0B, 0x07, 0xEE, 0x1E, 0xFD, 0xFB, 0x7C, 0x17, 0xAF, 0x00, 0xD5, 0x18, + 0xD7, 0x10, 0x82, 0x20, 0x3E, 0x0D, 0x39, 0x14, 0x46, 0x07, 0x4A, 0x04, + 0x52, 0x0B, 0x29, 0x08, 0xEF, 0x07, 0xBD, 0x06, 0x32, 0x00, 0xF2, 0xFB, + 0x2A, 0x10, 0x5A, 0x0A, 0xD8, 0x15, 0xC4, 0x11, 0xF2, 0x0A, 0x46, 0x0F, + 0x2B, 0x07, 0x96, 0x13, 0x1B, 0xF8, 0xE0, 0x0E, 0x5F, 0xEB, 0x5F, 0x02, + 0xB6, 0xF6, 0x10, 0x05, 0x27, 0xFA, 0x99, 0x07, 0x14, 0xFC, 0x7F, 0x03, + 0x56, 0x04, 0x84, 0x04, 0xE2, 0x05, 0x26, 0x0A, 0x97, 0xFE, 0x00, 0x0C, + 0x6F, 0xEC, 0x12, 0x01, 0xAC, 0xF3, 0x8E, 0x04, 0xF1, 0xFC, 0x1A, 0x02, + 0xCE, 0xFE, 0x17, 0xFE, 0x7F, 0xFE, 0xEC, 0x03, 0x52, 0xF9, 0x5C, 0x07, + 0x4D, 0xF3, 0x64, 0x01, 0xA8, 0xF0, 0x0C, 0xFA, 0x48, 0xF7, 0x42, 0xFA, + 0xDB, 0xEF, 0xF3, 0xF2, 0x75, 0xED, 0xF3, 0xF3, 0x24, 0xF4, 0x21, 0xF8, + 0x00, 0xEE, 0x95, 0xE9, 0x72, 0xEE, 0x85, 0xDC, 0x91, 0xF2, 0x47, 0xDB, + 0x4F, 0xEB, 0xCF, 0xD5, 0xA8, 0xE8, 0x25, 0xD8, 0x92, 0xF1, 0x52, 0xE9, + 0x4C, 0xF8, 0x91, 0xF3, 0x00, 0xF0, 0x24, 0xF0, 0x60, 0xF0, 0x5D, 0xF9, + 0xA5, 0xEB, 0x47, 0xF5, 0x6A, 0xE4, 0x34, 0xE6, 0xFC, 0xF5, 0xCC, 0xEF, + 0x23, 0xFA, 0xB6, 0xF3, 0x08, 0xF4, 0x06, 0xF2, 0xDB, 0xF8, 0x6C, 0xF5, + 0xA2, 0xF6, 0xB0, 0xEB, 0x42, 0xFC, 0xA0, 0xEC, 0x39, 0xFD, 0x22, 0xEE, + 0xF5, 0xF4, 0xB8, 0xE8, 0x12, 0xF8, 0x7C, 0xF1, 0x64, 0xF4, 0xED, 0xED, + 0xFA, 0xF7, 0x90, 0xEF, 0xCA, 0x04, 0x4D, 0x01, 0xFA, 0xF5, 0x07, 0xF8, + 0xB2, 0xF4, 0xFC, 0xF9, 0x03, 0xF9, 0x34, 0xFF, 0x8D, 0xF3, 0xB8, 0xF5, + 0x85, 0xFC, 0x18, 0xF8, 0xDA, 0x01, 0xFA, 0xFB, 0x58, 0x01, 0xA3, 0xFF, + 0x7E, 0xFF, 0xCE, 0xFE, 0xFE, 0x05, 0xEE, 0xFE, 0x02, 0x02, 0x85, 0xF8, + 0xDB, 0x02, 0xC7, 0xFC, 0xB4, 0x04, 0xC3, 0x04, 0xC9, 0xF6, 0x7A, 0x02, + 0xAF, 0xFB, 0x49, 0x13, 0xFF, 0xEC, 0xDB, 0x0F, 0x00, 0xE3, 0xC8, 0x0F, + 0x52, 0xEB, 0x6A, 0x14, 0xD5, 0xF2, 0x05, 0x0C, 0x35, 0x02, 0x79, 0x0E, + 0x46, 0x02, 0x54, 0x07, 0xC1, 0x09, 0x93, 0x0F, 0xB2, 0xFD, 0xB0, 0x0A, + 0xFD, 0xF0, 0x27, 0xFF, 0x7D, 0xFF, 0x32, 0x09, 0x56, 0xF7, 0x7F, 0x01, + 0xC5, 0x02, 0x38, 0x0F, 0xA6, 0x0D, 0x71, 0x1A, 0x5F, 0x10, 0x59, 0x1D, + 0xB0, 0x19, 0x2B, 0x23, 0x7D, 0x11, 0xAD, 0x10, 0x97, 0x17, 0x6F, 0x0F, + 0x98, 0x05, 0x31, 0x02, 0xE0, 0xFE, 0x7A, 0xFF, 0x21, 0x0B, 0x4E, 0x0B, + 0x79, 0x02, 0x2E, 0x04, 0xF6, 0x0B, 0x9F, 0x0D, 0x6E, 0x09, 0x4C, 0x04, + 0x46, 0x08, 0x56, 0xFC, 0x6E, 0x11, 0x69, 0x02, 0x90, 0x0D, 0x9F, 0x03, + 0xD4, 0x12, 0x70, 0x18, 0x7E, 0x12, 0xDB, 0x22, 0xF6, 0x17, 0x65, 0x29, + 0xAA, 0x1A, 0xCC, 0x27, 0x00, 0x19, 0xEC, 0x1F, 0x1D, 0x1C, 0xD8, 0x1E, + 0xDB, 0x17, 0x3C, 0x15, 0x71, 0x13, 0xB8, 0x09, 0x16, 0x0E, 0x86, 0x01, + 0xE5, 0x0C, 0x4A, 0x02, 0x1F, 0x06, 0x9A, 0xFE, 0x12, 0x04, 0x09, 0xFD, + 0xE3, 0x0B, 0xD7, 0x05, 0x29, 0x06, 0xD2, 0x01, 0x87, 0x0C, 0x85, 0x0D, + 0x67, 0x0F, 0x2E, 0x1C, 0xD3, 0xFF, 0xFE, 0x15, 0x9A, 0x0A, 0xCE, 0x24, + 0xF8, 0x04, 0x66, 0x18, 0x80, 0x02, 0xD0, 0x0B, 0x2E, 0x0B, 0x2F, 0x0F, + 0xAA, 0x05, 0x0C, 0x03, 0x00, 0x11, 0x2F, 0x09, 0xAB, 0x10, 0xE2, 0x07, + 0x8A, 0x09, 0x2B, 0x07, 0x7E, 0x00, 0x1A, 0x06, 0x18, 0xF3, 0xC5, 0xF7, + 0xB2, 0xFF, 0x08, 0x01, 0x42, 0xFE, 0x67, 0xF8, 0xC1, 0x05, 0xC1, 0xFE, + 0x11, 0x15, 0x62, 0x14, 0x46, 0x17, 0xFA, 0x15, 0xF3, 0x1F, 0xA1, 0x21, + 0x4A, 0x17, 0x6D, 0x20, 0x32, 0x11, 0xF5, 0x1E, 0x21, 0x0C, 0x65, 0x16, + 0x46, 0x09, 0x79, 0x0F, 0xC3, 0x0B, 0x25, 0x0F, 0x98, 0x0E, 0xBC, 0x07, + 0x95, 0x12, 0x8C, 0x09, 0x63, 0x11, 0x59, 0x08, 0xE8, 0x0E, 0x43, 0x08, + 0xEA, 0x0C, 0x51, 0x0D, 0x36, 0x10, 0x92, 0x10, 0xFF, 0x19, 0x9F, 0x19, + 0xC5, 0x20, 0x94, 0x1F, 0x48, 0x20, 0x5D, 0x21, 0x1F, 0x14, 0xD2, 0x15, + 0x5D, 0x0B, 0x79, 0x0A, 0xDA, 0x03, 0x49, 0x07, 0x19, 0xF4, 0x06, 0xFD, + 0xF3, 0xF5, 0x95, 0x04, 0x8A, 0xFB, 0x9E, 0x05, 0x3F, 0xFA, 0x93, 0xF9, + 0x66, 0xFD, 0xD6, 0xFC, 0xE9, 0xF8, 0x34, 0xFC, 0xFA, 0xFA, 0x59, 0xFE, + 0xFA, 0x01, 0xB3, 0xFE, 0x2E, 0x05, 0xCE, 0x01, 0x4D, 0x0E, 0xF6, 0x0B, + 0xC0, 0x0A, 0xBE, 0x0A, 0x90, 0x02, 0xC6, 0x09, 0x3C, 0xFD, 0x51, 0x04, + 0x29, 0xF1, 0xEE, 0xF6, 0x7D, 0xF0, 0xAA, 0xEE, 0x8E, 0xF0, 0x26, 0xE7, + 0x4E, 0xF0, 0x11, 0xE8, 0x62, 0xF7, 0x30, 0xED, 0x49, 0xF5, 0x17, 0xEB, + 0xCB, 0xF5, 0x1E, 0xEB, 0x58, 0xEF, 0x65, 0xE2, 0x9E, 0xED, 0x49, 0xE0, + 0x62, 0xF2, 0x50, 0xE4, 0x77, 0xEC, 0x0B, 0xE0, 0xC1, 0xF2, 0x94, 0xE5, + 0x9C, 0xEA, 0x4F, 0xDF, 0xE1, 0xEB, 0x6A, 0xE0, 0x49, 0xE9, 0x3F, 0xDA, + 0x58, 0xD5, 0x57, 0xC8, 0x8D, 0xD8, 0x04, 0xCC, 0x85, 0xD3, 0xA8, 0xC5, + 0x20, 0xD4, 0x5D, 0xC4, 0xF3, 0xD3, 0xA2, 0xC3, 0x3F, 0xD0, 0x92, 0xBF, + 0x21, 0xC8, 0x30, 0xB5, 0x1A, 0xB8, 0x5F, 0xAF, 0xE5, 0xC3, 0x6C, 0xC3, + 0x99, 0xBD, 0x63, 0xC0, 0x38, 0xCB, 0x35, 0xD4, 0xCB, 0xD9, 0xD6, 0xDF, + 0xD7, 0xCF, 0x9C, 0xD8, 0xD1, 0xCF, 0x32, 0xDD, 0x7F, 0xC4, 0xB7, 0xCE, + 0x87, 0xC6, 0x24, 0xD3, 0x85, 0xBE, 0xAC, 0xC6, 0x01, 0xC5, 0x75, 0xC5, + 0x11, 0xD6, 0xDD, 0xCE, 0x4D, 0xCF, 0xEB, 0xC1, 0x56, 0xD4, 0xDF, 0xCA, + 0x91, 0xCF, 0x13, 0xD0, 0xE0, 0xC2, 0xB6, 0xD1, 0xF4, 0xC8, 0xBF, 0xD8, + 0x47, 0xD8, 0x45, 0xDF, 0x2A, 0xDD, 0xFA, 0xE3, 0x2A, 0xD6, 0x7B, 0xE4, + 0x97, 0xD9, 0x9F, 0xEC, 0x42, 0xCE, 0x6E, 0xDA, 0x1E, 0xD0, 0x27, 0xD7, + 0x06, 0xDB, 0x1C, 0xDD, 0xC9, 0xDE, 0x88, 0xDA, 0xAB, 0xE4, 0x3C, 0xE1, + 0x3A, 0xE6, 0x46, 0xDF, 0x70, 0xEE, 0x68, 0xE9, 0x94, 0xE7, 0xA7, 0xE4, + 0x4A, 0xED, 0xC6, 0xE3, 0x0B, 0xF3, 0x2F, 0xE5, 0x2A, 0xF4, 0x37, 0xE0, + 0x56, 0x03, 0x67, 0xF2, 0xA6, 0xFD, 0xB8, 0xF8, 0xC7, 0xFE, 0x7F, 0x02, + 0x1B, 0xF9, 0x74, 0x01, 0x42, 0xF0, 0x4B, 0xF3, 0x5D, 0xFF, 0xD5, 0xF8, + 0x3D, 0xF9, 0x7E, 0xF3, 0x68, 0xFB, 0x8C, 0xFE, 0x61, 0xFC, 0x29, 0x0D, + 0x06, 0xF4, 0x77, 0x0E, 0xDC, 0xFE, 0x19, 0x14, 0x50, 0x05, 0x6E, 0x11, + 0x47, 0x02, 0x8E, 0x0F, 0xC4, 0xFE, 0x5F, 0x10, 0xC7, 0x01, 0xA1, 0x13, + 0x46, 0x05, 0xA4, 0x15, 0xB0, 0x0D, 0xF2, 0x16, 0x5B, 0x12, 0xF2, 0x13, + 0xA5, 0x0C, 0x9F, 0x0A, 0xF2, 0x15, 0xED, 0x0A, 0xE6, 0x12, 0xF0, 0x00, + 0xC9, 0x15, 0x77, 0x04, 0x19, 0x1A, 0x22, 0x0D, 0x5D, 0x10, 0x8E, 0x05, + 0xA0, 0x1C, 0x53, 0x0C, 0xBC, 0x18, 0x98, 0x01, 0x9E, 0x16, 0x14, 0xF7, + 0x2C, 0x1A, 0x67, 0x00, 0x6F, 0x11, 0x9E, 0x0A, 0x67, 0x12, 0x21, 0x14, + 0xC6, 0x1E, 0x9A, 0x20, 0xFA, 0x21, 0x89, 0x1F, 0xB6, 0x21, 0x3B, 0x19, + 0x07, 0x28, 0xEF, 0x19, 0x7C, 0x1F, 0xB5, 0x10, 0xDB, 0x1E, 0x9D, 0x11, + 0xC6, 0x21, 0xF3, 0x13, 0x49, 0x1D, 0x73, 0x16, 0xC2, 0x26, 0xDD, 0x23, + 0x76, 0x21, 0xE1, 0x23, 0x08, 0x1E, 0x1F, 0x24, 0x66, 0x22, 0x41, 0x23, + 0x42, 0x16, 0x4C, 0x1B, 0x07, 0x15, 0x2A, 0x22, 0x6E, 0x18, 0x8B, 0x26, + 0xE2, 0x21, 0x9F, 0x27, 0x7F, 0x23, 0x7E, 0x22, 0xC2, 0x28, 0x06, 0x22, + 0xFA, 0x23, 0x67, 0x14, 0x47, 0x1B, 0x3C, 0x10, 0x0B, 0x1F, 0x2A, 0x1B, + 0x89, 0x14, 0xF8, 0x11, 0x18, 0x1E, 0x54, 0x1A, 0x87, 0x1E, 0x3C, 0x16, + 0x11, 0x18, 0x1E, 0x0D, 0x8E, 0x24, 0x50, 0x0F, 0x02, 0x22, 0x0C, 0x05, + 0xA5, 0x24, 0x85, 0x10, 0x95, 0x19, 0xC5, 0x17, 0x72, 0x11, 0x78, 0x21, + 0x7A, 0x0D, 0x8D, 0x27, 0x4C, 0x01, 0x83, 0x1D, 0x69, 0x00, 0xEA, 0x1D, + 0x9E, 0x01, 0x08, 0x1D, 0x33, 0x03, 0xBE, 0x19, 0x95, 0x03, 0xC8, 0x17, + 0x3A, 0x0D, 0x62, 0x1B, 0x95, 0x02, 0xF0, 0x0E, 0xA3, 0xF8, 0xC5, 0x05, + 0x0C, 0xFE, 0x4B, 0x08, 0x1D, 0xF6, 0xBB, 0x02, 0x0D, 0xF9, 0x5B, 0x09, + 0xE7, 0xFE, 0xE6, 0x13, 0xA1, 0xFD, 0x24, 0x12, 0x25, 0x00, 0x2E, 0x0A, + 0x5D, 0xFE, 0x7E, 0xFB, 0xCC, 0xFA, 0x52, 0xEF, 0x0E, 0xF9, 0xF5, 0xE9, + 0x1C, 0xF7, 0x3A, 0xE2, 0xC1, 0xF4, 0x46, 0xE5, 0x71, 0xF3, 0xE7, 0xE5, + 0x6E, 0xF5, 0x7D, 0xE4, 0x90, 0xF4, 0xE6, 0xE5, 0x98, 0xF3, 0x93, 0xDC, + 0x45, 0xF4, 0x8C, 0xDE, 0xEB, 0xF2, 0xAB, 0xE2, 0x10, 0xEE, 0x0E, 0xDF, + 0xCD, 0xEF, 0xDE, 0xEC, 0xD6, 0xED, 0x81, 0xF0, 0x95, 0xE3, 0x4D, 0xEA, + 0x1B, 0xE8, 0x02, 0xEF, 0xC3, 0xED, 0x1F, 0xF0, 0x8F, 0xEE, 0x2E, 0xEE, + 0xE5, 0xF4, 0x6E, 0xEB, 0xE0, 0xF4, 0x0D, 0xE4, 0x0A, 0xF0, 0xA4, 0xDC, + 0x11, 0xE9, 0xA0, 0xD7, 0xC4, 0xE2, 0xC6, 0xD6, 0x62, 0xE5, 0xF7, 0xE0, + 0x31, 0xE8, 0x1B, 0xE7, 0x51, 0xE3, 0x1F, 0xE2, 0x3A, 0xE4, 0x38, 0xEB, + 0x61, 0xE4, 0x4A, 0xF3, 0xF9, 0xE1, 0xF1, 0xF7, 0xED, 0xE0, 0x61, 0xF7, + 0x30, 0xDE, 0x07, 0xEA, 0xBD, 0xE3, 0x81, 0xE8, 0x9E, 0xE5, 0x50, 0xDE, + 0x06, 0xF6, 0x37, 0xE1, 0xB7, 0xFF, 0x34, 0xE8, 0xE5, 0xFA, 0x2F, 0xDE, + 0x82, 0xFD, 0xA6, 0xDE, 0x46, 0xF7, 0x05, 0xE6, 0xC9, 0xE9, 0x1B, 0xE4, + 0x1A, 0xE7, 0xAB, 0xE8, 0xEE, 0xE9, 0x5A, 0xF1, 0x5D, 0xF0, 0xFD, 0xF6, + 0x1A, 0xF1, 0xCE, 0xFC, 0x28, 0xF6, 0xA1, 0x08, 0xDE, 0xEF, 0x7C, 0x04, + 0x44, 0xEF, 0xEB, 0x08, 0xD9, 0xF3, 0x9A, 0x0A, 0xF2, 0xF4, 0x6C, 0xFF, + 0x6E, 0x08, 0xE9, 0x07, 0xB6, 0x02, 0xE5, 0xFC, 0x21, 0x03, 0x32, 0xFD, + 0x9E, 0x01, 0x8F, 0xFE, 0x1D, 0xFA, 0x90, 0x03, 0xD5, 0xFA, 0x9D, 0x12, + 0x85, 0xF4, 0x77, 0x0D, 0x6C, 0x02, 0x3A, 0x18, 0x6A, 0x01, 0xA5, 0x14, + 0xA4, 0xFB, 0x63, 0x07, 0xCD, 0x0B, 0xC4, 0x10, 0xBC, 0x06, 0xED, 0x08, + 0xBE, 0x08, 0xCC, 0x03, 0xF4, 0x09, 0x92, 0x01, 0x9E, 0x05, 0x05, 0x00, + 0xFE, 0x02, 0xCA, 0xFC, 0x34, 0xFA, 0x36, 0xFA, 0x63, 0xFF, 0x80, 0x05, + 0x47, 0xF6, 0x4F, 0xF9, 0xE6, 0x02, 0x48, 0x03, 0x90, 0x0B, 0xF3, 0x06, + 0x72, 0x0C, 0xE9, 0x00, 0xBA, 0x1D, 0x6A, 0x0F, 0x47, 0x1A, 0x0D, 0x0C, + 0xE5, 0x1B, 0xEF, 0x10, 0xDB, 0x15, 0xDC, 0x12, 0xC6, 0x10, 0x2F, 0x12, + 0x05, 0x15, 0x8B, 0x12, 0x1E, 0x0C, 0xC9, 0x04, 0x6B, 0x0F, 0x37, 0x05, + 0xEA, 0x09, 0x3B, 0xFE, 0x1D, 0x0B, 0x3F, 0x00, 0xA4, 0x0C, 0x33, 0x06, + 0x1E, 0x05, 0x9E, 0x05, 0x3E, 0x07, 0xC5, 0x0E, 0xF9, 0x05, 0x97, 0x13, + 0x83, 0x0E, 0x9D, 0x1A, 0xAD, 0x13, 0xC6, 0x15, 0xEF, 0x14, 0x61, 0x16, + 0xC4, 0x0B, 0x7B, 0x13, 0xBB, 0x09, 0x84, 0x10, 0x14, 0x0F, 0xA1, 0x10, + 0x36, 0x0C, 0xA3, 0x09, 0x29, 0x11, 0xB2, 0x08, 0x17, 0x14, 0x20, 0x01, + 0x60, 0x09, 0x80, 0xF2, 0x5F, 0x04, 0x39, 0xF2, 0x21, 0xFF, 0x6D, 0xF9, + 0x25, 0xF4, 0x34, 0xFF, 0xA9, 0xF3, 0x30, 0x06, 0x35, 0xFE, 0xB2, 0x0F, + 0x26, 0x05, 0xAE, 0x0D, 0x65, 0x11, 0xD0, 0x14, 0x97, 0x0E, 0x1E, 0x14, + 0xA8, 0x09, 0x86, 0x0E, 0xDC, 0x09, 0xC3, 0x11, 0x58, 0x08, 0xC7, 0x0E, + 0x85, 0x14, 0x6C, 0x15, 0x64, 0x0B, 0x5A, 0x0B, 0x14, 0x06, 0xB1, 0x04, + 0xE8, 0x04, 0xDF, 0x04, 0x0D, 0xFC, 0x7B, 0xFD, 0xE6, 0x02, 0x0C, 0x04, + 0x62, 0x04, 0xB1, 0x07, 0x65, 0x09, 0x45, 0x0F, 0x6C, 0x12, 0xFD, 0x18, + 0x70, 0x17, 0x48, 0x1C, 0x10, 0x16, 0xA4, 0x20, 0xD1, 0x0B, 0x81, 0x1C, + 0xF8, 0x0E, 0xC4, 0x20, 0xD7, 0x02, 0x6A, 0x13, 0x00, 0x11, 0xBA, 0x15, + 0x50, 0x15, 0x8B, 0x12, 0x2A, 0x0B, 0xE8, 0x07, 0x66, 0x11, 0x3B, 0x13, + 0x42, 0x00, 0x0A, 0x06, 0x32, 0x0D, 0x1C, 0x08, 0xC1, 0x1D, 0x91, 0x12, + 0x49, 0x25, 0xDB, 0x19, 0x70, 0x30, 0xC2, 0x26, 0xCA, 0x31, 0xE8, 0x2B, + 0x9E, 0x3A, 0xD0, 0x36, 0x65, 0x2D, 0x88, 0x2C, 0x53, 0x2A, 0x06, 0x29, + 0x78, 0x28, 0x14, 0x28, 0x1A, 0x1C, 0xB8, 0x1C, 0x03, 0x24, 0x75, 0x26, + 0x79, 0x1D, 0x9C, 0x21, 0x4D, 0x18, 0x69, 0x20, 0x69, 0x0D, 0xDF, 0x1D, + 0xD9, 0x0D, 0x05, 0x1F, 0x39, 0x16, 0xA6, 0x28, 0x63, 0x16, 0x77, 0x2C, + 0xFB, 0x1E, 0x73, 0x37, 0x41, 0x1E, 0xDA, 0x39, 0x34, 0x1C, 0x80, 0x37, + 0x4F, 0x12, 0x48, 0x2B, 0xAD, 0x0D, 0x05, 0x1D, 0xB3, 0x0F, 0x23, 0x12, + 0x60, 0x0B, 0xF8, 0x09, 0xA4, 0x10, 0x73, 0x0F, 0x51, 0x10, 0xEC, 0x0A, + 0x92, 0x0F, 0x9A, 0x00, 0x9E, 0x0E, 0xB3, 0xFA, 0xAF, 0x03, 0x36, 0xF1, + 0x38, 0x00, 0x88, 0xF1, 0x13, 0xFF, 0x78, 0xF1, 0xF4, 0x03, 0xF3, 0xF6, + 0x4E, 0x05, 0xF8, 0xFD, 0x85, 0xFF, 0xD2, 0xF8, 0x33, 0x00, 0x3E, 0xF8, + 0x02, 0xFF, 0xA4, 0xF2, 0x24, 0xFD, 0x75, 0xE6, 0x0C, 0xFF, 0xFB, 0xE4, + 0x6F, 0xF8, 0x2F, 0xE1, 0xCC, 0xEF, 0x3C, 0xDB, 0xA6, 0xEE, 0x0B, 0xDA, + 0x0F, 0xEA, 0x70, 0xDA, 0x1C, 0xE5, 0xE0, 0xDF, 0x96, 0xE3, 0x7B, 0xEA, + 0x38, 0xE0, 0x08, 0xF0, 0x29, 0xE2, 0xC8, 0xF0, 0xE3, 0xE0, 0x50, 0xF1, + 0xA8, 0xDE, 0x66, 0xF2, 0x13, 0xDF, 0x5F, 0xF3, 0x40, 0xDB, 0xD5, 0xEC, + 0xC9, 0xDA, 0xFF, 0xE9, 0x3D, 0xDC, 0x9C, 0xE3, 0xD2, 0xD9, 0xB1, 0xD4, + 0xF0, 0xDA, 0x5F, 0xD7, 0xCD, 0xD4, 0xCC, 0xD2, 0x77, 0xCE, 0x82, 0xCC, + 0x9D, 0xD4, 0x91, 0xD8, 0xA5, 0xCE, 0x7F, 0xD4, 0x4F, 0xD7, 0xB0, 0xD8, + 0x0F, 0xE4, 0xEA, 0xDD, 0x15, 0xE5, 0xAA, 0xDC, 0x66, 0xEE, 0xDB, 0xE3, + 0x85, 0xF4, 0x73, 0xEA, 0x61, 0xEE, 0xB8, 0xE4, 0x20, 0xED, 0xDB, 0xDE, + 0x88, 0xEF, 0x50, 0xE7, 0xAC, 0xE9, 0xD9, 0xE9, 0x02, 0xE7, 0x9C, 0xEE, + 0x3B, 0xE3, 0x05, 0xF2, 0x8C, 0xE1, 0x2A, 0xEE, 0xD6, 0xE8, 0xAA, 0xEC, + 0xFC, 0xEA, 0xF8, 0xE9, 0xE5, 0xE8, 0x4E, 0xF0, 0x0F, 0xE6, 0x86, 0xF8, + 0xE5, 0xE0, 0xFB, 0xFC, 0x1E, 0xE3, 0x38, 0x04, 0x8D, 0xEA, 0x6B, 0x02, + 0x30, 0xF6, 0xB6, 0x03, 0x02, 0x01, 0x11, 0x03, 0x9D, 0x07, 0x77, 0x00, + 0xFC, 0x0C, 0x11, 0x00, 0x77, 0x0F, 0x59, 0xFD, 0x37, 0x0A, 0x5E, 0xFD, + 0xA9, 0xFA, 0x3B, 0xF5, 0x71, 0xF4, 0x0C, 0xF1, 0x59, 0xFE, 0x58, 0xF7, + 0xBB, 0xF8, 0xC5, 0xF7, 0x2D, 0xFC, 0x4D, 0x04, 0x50, 0x02, 0xD2, 0x0A, + 0xAC, 0xFE, 0x0F, 0x08, 0x26, 0x0C, 0x1B, 0x12, 0x05, 0x0C, 0x14, 0x0C, + 0x1E, 0x11, 0x79, 0x09, 0x6E, 0x1A, 0x20, 0x0D, 0xC5, 0x1E, 0x22, 0x0E, + 0xDD, 0x28, 0x54, 0x15, 0x70, 0x1C, 0x76, 0x0C, 0x84, 0x1B, 0x8B, 0x0D, + 0xED, 0x1B, 0x51, 0x11, 0xE7, 0x0B, 0xB1, 0xFE, 0xA3, 0x10, 0xF0, 0xFE, + 0x41, 0x18, 0xD6, 0x0B, 0x5F, 0x10, 0x3C, 0x09, 0x21, 0x0F, 0xEC, 0x10, + 0xCF, 0x12, 0xD8, 0x1A, 0xDA, 0x0D, 0xBB, 0x0F, 0x4A, 0x15, 0xB5, 0x08, + 0xCE, 0x1F, 0xFC, 0x0E, 0x23, 0x11, 0x23, 0x09, 0x0F, 0x07, 0x05, 0x02, + 0xB3, 0x07, 0x3D, 0x04, 0x1F, 0x03, 0xB6, 0x00, 0xD7, 0x00, 0x4D, 0xFC, + 0x9C, 0x00, 0xA0, 0xFC, 0xF6, 0x05, 0x35, 0xFE, 0xD8, 0x05, 0x11, 0x00, + 0xF6, 0x09, 0x6A, 0x07, 0x49, 0x16, 0xBF, 0x16, 0x95, 0x0D, 0xB7, 0x16, + 0xD1, 0x13, 0x22, 0x1A, 0x7F, 0x19, 0x9E, 0x16, 0x4E, 0x10, 0x0E, 0x08, + 0x69, 0x04, 0x8B, 0x03, 0xEF, 0x00, 0x08, 0x0B, 0x6C, 0x05, 0xDE, 0x14, + 0x8D, 0xFD, 0x5C, 0x17, 0x03, 0x02, 0x63, 0x19, 0x47, 0xFE, 0x4C, 0x0A, + 0xC2, 0xF1, 0xD2, 0xFB, 0x04, 0xF8, 0x18, 0x02, 0x0D, 0xF9, 0xCC, 0xFC, + 0x71, 0xFF, 0xDE, 0xFC, 0xFF, 0x0A, 0xEE, 0x0F, 0xF1, 0x15, 0x81, 0x1C, + 0xC9, 0x11, 0x7C, 0x19, 0x6F, 0x03, 0x98, 0x10, 0x9D, 0x08, 0xC6, 0x0B, + 0xD4, 0xFE, 0xFB, 0xFD, 0x17, 0xFC, 0x5D, 0xF7, 0x14, 0x04, 0x7A, 0xEF, + 0x0B, 0x05, 0x7F, 0xEC, 0x55, 0xFC, 0x64, 0xE6, 0xDB, 0xED, 0xAB, 0xDE, + 0xA8, 0xE6, 0xD4, 0xE2, 0x60, 0xE0, 0xEB, 0xE4, 0x5F, 0xE0, 0x05, 0xE9, + 0x3F, 0xEC, 0x70, 0xF7, 0x8D, 0xEB, 0x96, 0xFB, 0xDF, 0xEF, 0x7F, 0xFA, + 0xD8, 0xFF, 0x36, 0x04, 0x15, 0xFE, 0xD8, 0xF5, 0x5F, 0x03, 0xB1, 0xED, + 0x87, 0x01, 0x3E, 0xF1, 0x5D, 0xF4, 0x53, 0xE7, 0x5C, 0xF7, 0x1E, 0xF1, + 0xBC, 0xF7, 0xDD, 0xF6, 0xA8, 0xEA, 0x85, 0xE7, 0x51, 0xED, 0x28, 0xED, + 0x2D, 0xEC, 0xF7, 0xE9, 0x13, 0xE1, 0x09, 0xE2, 0x20, 0xEC, 0xBB, 0xF1, + 0x42, 0xF3, 0x09, 0xFC, 0x84, 0xF0, 0x3F, 0xFC, 0x73, 0xF6, 0x19, 0xFB, + 0x06, 0xFB, 0x6B, 0xF6, 0x1C, 0xFA, 0x43, 0xEE, 0x6E, 0xE6, 0x93, 0xDC, + 0xB3, 0xE3, 0xE5, 0xDF, 0xEF, 0xEB, 0x4D, 0xE9, 0x0F, 0xE8, 0x33, 0xDF, + 0xD0, 0xEF, 0xB3, 0xDC, 0x88, 0xF2, 0xD3, 0xDB, 0xB5, 0xEB, 0x96, 0xD1, + 0xEB, 0xEC, 0x96, 0xD8, 0xCD, 0xEB, 0xC3, 0xE7, 0x95, 0xE2, 0x78, 0xE2, + 0x49, 0xEE, 0x0E, 0xF1, 0x88, 0xF6, 0x25, 0xF9, 0xA2, 0xF6, 0x47, 0xF1, + 0x79, 0xF6, 0x90, 0xF1, 0x68, 0xEC, 0x62, 0xE8, 0xAF, 0xEE, 0x04, 0xEA, + 0x75, 0xEE, 0x6A, 0xF2, 0xD6, 0xE6, 0xB3, 0xEE, 0x33, 0xE8, 0xAD, 0xE6, + 0x46, 0xE9, 0x0A, 0xE1, 0xF5, 0xEE, 0xBE, 0xE8, 0x70, 0xE2, 0xF4, 0xE5, + 0xA4, 0xE1, 0xD7, 0xE8, 0x6D, 0xEC, 0xA9, 0xEA, 0x78, 0xF5, 0x9C, 0xEE, + 0x95, 0x01, 0xC1, 0xF8, 0x24, 0x02, 0x02, 0xFC, 0x9C, 0xFA, 0xE6, 0x04, + 0x5A, 0xE4, 0xE3, 0xF9, 0x43, 0xF4, 0x7D, 0x00, 0x28, 0xFA, 0x92, 0xFD, + 0x23, 0xEA, 0x22, 0xEC, 0xC9, 0xF7, 0xFC, 0xF3, 0x57, 0xE8, 0x47, 0xE9, + 0xEA, 0xDB, 0x29, 0xE5, 0xAD, 0xE3, 0x23, 0xF3, 0x84, 0xDB, 0xF6, 0xEE, + 0x4C, 0xDF, 0xCD, 0xF2, 0x79, 0xE6, 0x28, 0xFF, 0x99, 0xF0, 0xEB, 0xFD, + 0xF7, 0x00, 0x4C, 0x05, 0x71, 0xFD, 0xC8, 0x0A, 0xC9, 0xF8, 0xC8, 0xFF, + 0x20, 0x0E, 0xB3, 0x05, 0xBB, 0x12, 0x65, 0x00, 0x49, 0x0D, 0x69, 0xF4, + 0x90, 0x16, 0x53, 0x02, 0x0A, 0xFD, 0xD0, 0xFF, 0x38, 0xE7, 0x45, 0xF8, + 0x3A, 0xEE, 0x3A, 0xF7, 0x1D, 0xEC, 0x1C, 0xF2, 0x79, 0xED, 0xE8, 0xED, + 0x8E, 0xF3, 0x0A, 0xEF, 0x03, 0xFE, 0xD5, 0xF9, 0x3A, 0x04, 0x17, 0xFD, + 0x20, 0x04, 0x14, 0x02, 0x4E, 0x05, 0x86, 0x00, 0x03, 0x08, 0x3A, 0x00, + 0xAD, 0xFD, 0xFB, 0xFA, 0x98, 0x01, 0x96, 0xFA, 0x5E, 0x08, 0xB4, 0x03, + 0x6F, 0xF7, 0x42, 0xFE, 0xB3, 0xED, 0xF8, 0xF7, 0xDC, 0xF1, 0x4C, 0xF3, + 0x80, 0xF2, 0xB3, 0xED, 0xD0, 0xF6, 0xD1, 0xF0, 0xB6, 0x02, 0x92, 0xF6, + 0xD7, 0x04, 0xAF, 0xFA, 0x69, 0x01, 0x40, 0xFB, 0x2F, 0x00, 0x1E, 0xFC, + 0xF8, 0xFC, 0x51, 0x00, 0x69, 0x02, 0x30, 0x0C, 0x0F, 0x02, 0x41, 0x0B, + 0xF6, 0x02, 0x1F, 0x04, 0x15, 0x0A, 0x30, 0x06, 0xA9, 0x02, 0x96, 0xFB, + 0xB2, 0xFC, 0xCA, 0xF4, 0xBC, 0xF6, 0xB3, 0xF7, 0x55, 0xF2, 0x87, 0xF9, + 0x9B, 0xEF, 0xD9, 0xF7, 0xC8, 0xF8, 0x08, 0x03, 0x79, 0x04, 0x0B, 0x0F, + 0x85, 0xFF, 0x64, 0x08, 0x58, 0x0B, 0x0A, 0x11, 0x33, 0x08, 0x8D, 0x12, + 0xDD, 0xFA, 0x80, 0x0C, 0x57, 0x06, 0x2F, 0x0E, 0x96, 0x05, 0xDD, 0x02, + 0x37, 0x05, 0x50, 0xFF, 0x42, 0x0E, 0xBD, 0xFB, 0xF0, 0x0C, 0x74, 0xF9, + 0xF9, 0x02, 0x45, 0xFD, 0xD5, 0xF5, 0x7C, 0xF4, 0xAD, 0xF7, 0xAC, 0xF9, + 0x42, 0xFA, 0x12, 0xFF, 0xBD, 0xFA, 0x55, 0xFA, 0xF6, 0x01, 0xC2, 0xFF, + 0x1C, 0x06, 0xA5, 0x06, 0xC1, 0x07, 0x06, 0x06, 0x25, 0x15, 0x05, 0x0E, + 0x72, 0x20, 0x9C, 0x12, 0x5F, 0x1E, 0x91, 0x0E, 0x90, 0x19, 0x4B, 0x10, + 0xAB, 0x18, 0x7B, 0x0C, 0x55, 0x14, 0xF3, 0x11, 0x73, 0x01, 0xA3, 0x18, + 0x6D, 0x01, 0x7C, 0x17, 0x6E, 0x06, 0xF1, 0x1E, 0x25, 0x01, 0x71, 0x20, + 0x9E, 0x02, 0xF4, 0x14, 0x1B, 0x00, 0x3F, 0x13, 0x97, 0xFE, 0x29, 0x18, + 0x06, 0xFD, 0x2B, 0x18, 0x2E, 0xFE, 0x4D, 0x1D, 0xFC, 0x09, 0xF8, 0x22, + 0x40, 0x07, 0x09, 0x15, 0xFF, 0x04, 0x02, 0x10, 0x93, 0x07, 0x46, 0x0E, + 0x3C, 0x0B, 0x57, 0x08, 0x5D, 0x08, 0x12, 0x07, 0x4F, 0x09, 0x5C, 0x03, + 0xE8, 0x12, 0x79, 0x0A, 0xFD, 0x08, 0x2E, 0x09, 0xB7, 0x10, 0x54, 0x05, + 0x42, 0x14, 0x16, 0x08, 0xDB, 0x0E, 0xEE, 0x08, 0x88, 0x15, 0xB7, 0x08, + 0x87, 0x12, 0x92, 0x0E, 0xA7, 0x15, 0x8A, 0x13, 0xD6, 0x16, 0xB8, 0x0D, + 0x8F, 0x12, 0x71, 0x0B, 0x3E, 0x1A, 0xAA, 0x0F, 0x5A, 0x1B, 0xA6, 0x0D, + 0x2E, 0x11, 0xD6, 0x0B, 0x5B, 0x16, 0x46, 0x12, 0x2F, 0x29, 0x8F, 0x19, + 0x91, 0x27, 0x92, 0x1F, 0xC6, 0x1D, 0xEC, 0x21, 0x07, 0x1A, 0x88, 0x1E, + 0x93, 0x13, 0xCD, 0x17, 0xEF, 0x18, 0x6B, 0x13, 0x56, 0x1C, 0xCF, 0x19, + 0x4E, 0x1B, 0x08, 0x1E, 0x86, 0x22, 0xCF, 0x15, 0xBA, 0x29, 0xA5, 0x12, + 0x77, 0x28, 0xB3, 0x0C, 0x3B, 0x16, 0xD7, 0xFC, 0x35, 0x0D, 0x17, 0xFB, + 0x93, 0x18, 0xCF, 0x03, 0xA3, 0x1D, 0x65, 0x09, 0x0C, 0x0F, 0x50, 0x0C, + 0xE2, 0x08, 0x09, 0x19, 0x5A, 0x0B, 0xB6, 0x1E, 0xE4, 0x01, 0x96, 0x1B, + 0xAD, 0xFE, 0x4C, 0x21, 0x1C, 0x00, 0xF8, 0x1F, 0x77, 0x0E, 0xA0, 0x1F, + 0x89, 0x2D, 0xF1, 0x22, 0xA1, 0x2C, 0x90, 0x1A, 0xC5, 0x14, 0x92, 0x17, + 0xE6, 0x07, 0xA9, 0x15, 0x1C, 0x04, 0x8D, 0x11, 0x6F, 0x05, 0xB9, 0x1B, + 0x4F, 0x00, 0xF3, 0x21, 0xEF, 0x06, 0x2E, 0x25, 0x82, 0x19, 0xB1, 0x29, + 0xB9, 0x20, 0xF8, 0x24, 0x5E, 0x19, 0x11, 0x20, 0xF5, 0x06, 0x1D, 0x1E, + 0x81, 0x00, 0xD1, 0x19, 0xF6, 0xFE, 0x1A, 0x12, 0x35, 0xFC, 0x53, 0x0E, + 0x77, 0xFE, 0xB7, 0x0A, 0xD9, 0x08, 0x0F, 0x08, 0x89, 0x20, 0xED, 0x07, + 0x7C, 0x1F, 0x8D, 0xFE, 0x7D, 0x06, 0x53, 0x04, 0x5D, 0xFD, 0xE7, 0x0A, + 0xE4, 0x05, 0xEB, 0xFC, 0x43, 0x0E, 0xA0, 0x00, 0xAB, 0x03, 0xEF, 0x01, + 0xBE, 0xFC, 0xCA, 0xF9, 0x53, 0x07, 0xDB, 0x06, 0x50, 0x04, 0x88, 0x0D, + 0x44, 0xFA, 0x72, 0x0A, 0x07, 0xED, 0x35, 0x0B, 0x11, 0xE6, 0x0C, 0x06, + 0xE6, 0xF5, 0xAE, 0xFD, 0x88, 0x06, 0x53, 0xF8, 0x20, 0x08, 0xB0, 0xFC, + 0xCE, 0xFF, 0x87, 0x09, 0x54, 0xF9, 0x39, 0x0C, 0xB2, 0xF8, 0x0E, 0xFF, + 0xE1, 0xF4, 0x24, 0x04, 0xB0, 0xF2, 0xBD, 0x08, 0xF7, 0x03, 0x88, 0xFA, + 0xBA, 0x0A, 0x78, 0x04, 0x05, 0xFE, 0x02, 0x0B, 0xAC, 0xF5, 0x34, 0xFD, + 0xC5, 0xF9, 0x67, 0x02, 0x13, 0x04, 0x39, 0x06, 0x89, 0x06, 0x5F, 0xFB, + 0xE6, 0x03, 0x8A, 0xF5, 0xFB, 0xF9, 0x48, 0xEE, 0x36, 0xF4, 0xB4, 0xE8, + 0x4A, 0xF7, 0xCA, 0xE2, 0x54, 0xF7, 0xAD, 0xDB, 0xD6, 0xF8, 0xAD, 0xE1, + 0xD3, 0x09, 0x76, 0xEF, 0x55, 0x1B, 0x43, 0xF8, 0xA5, 0x10, 0x1F, 0x0A, + 0xBC, 0xFC, 0x13, 0x12, 0x71, 0x07, 0x2E, 0x01, 0xDE, 0x11, 0xA5, 0xFC, + 0x0B, 0x13, 0xC0, 0xFF, 0x8F, 0x16, 0xC3, 0xFB, 0x73, 0x06, 0x71, 0xFB, + 0x84, 0x02, 0xE1, 0x07, 0x12, 0x0F, 0x2A, 0x0F, 0xEE, 0x10, 0xE8, 0x01, + 0xEC, 0x06, 0xC9, 0xFF, 0x64, 0xF7, 0xB2, 0x07, 0x73, 0xF5, 0xE6, 0x05, + 0xF5, 0x02, 0xE0, 0x09, 0x0B, 0x07, 0x74, 0x0F, 0x32, 0x05, 0xA0, 0x0D, + 0x7E, 0x00, 0x19, 0x07, 0xDA, 0xF5, 0x9B, 0x09, 0x24, 0xED, 0xC5, 0x07, + 0x6F, 0xF2, 0xA1, 0xF2, 0x26, 0xFF, 0xCA, 0xEF, 0x58, 0x01, 0xFE, 0xFA, + 0x7A, 0x01, 0x4A, 0xFC, 0x47, 0xF8, 0xE2, 0xF6, 0x46, 0xEE, 0x97, 0xEF, + 0x11, 0xF2, 0xBF, 0xEE, 0x57, 0xED, 0xE4, 0xEB, 0xFD, 0xDC, 0x10, 0xEF, + 0xDC, 0xD7, 0xBE, 0xF2, 0x36, 0xDA, 0x5B, 0xEA, 0x17, 0xEB, 0xC4, 0xE8, + 0x8B, 0x01, 0xF3, 0xEC, 0x60, 0xF8, 0x0C, 0xED, 0x63, 0xE4, 0x36, 0xEC, + 0x00, 0xDF, 0xDC, 0xF7, 0x42, 0xDF, 0x59, 0x01, 0x8A, 0xE1, 0xCC, 0xF8, + 0xE1, 0xE9, 0x14, 0xEC, 0x70, 0xF8, 0xE7, 0xE4, 0x5C, 0x00, 0xF5, 0xE1, + 0xE6, 0xF8, 0x7D, 0xDD, 0x51, 0xEC, 0x3F, 0xE1, 0xDD, 0xEA, 0x66, 0xF9, + 0x68, 0xF0, 0x60, 0x03, 0x16, 0xF7, 0x4A, 0xFF, 0xB6, 0x05, 0x42, 0x06, + 0xB5, 0xFC, 0xE9, 0x03, 0xA9, 0xE3, 0xDA, 0xF6, 0xD0, 0xE9, 0x05, 0xF1, + 0xDA, 0xF2, 0xFE, 0xF1, 0x11, 0xE9, 0x5B, 0xF5, 0x71, 0xEB, 0x21, 0xFA, + 0x71, 0xEB, 0x67, 0xF4, 0x9A, 0xE0, 0x14, 0xE9, 0x4B, 0xE1, 0x7B, 0xD9, + 0x21, 0xE5, 0xC8, 0xD0, 0x36, 0xEA, 0x5B, 0xDD, 0xD8, 0xED, 0x99, 0xEB, + 0xF1, 0xE8, 0x02, 0xF5, 0x9C, 0xDF, 0xE5, 0xFD, 0x13, 0xD7, 0x3E, 0xF8, + 0x86, 0xE7, 0xDB, 0xE7, 0x55, 0x02, 0xC9, 0xD9, 0xA5, 0xFF, 0x3B, 0xD9, + 0xD4, 0xEE, 0xBD, 0xE1, 0xB9, 0xE8, 0xF1, 0xE0, 0x4A, 0xE8, 0x50, 0xDD, + 0x21, 0xEA, 0xC1, 0xE1, 0xE7, 0xFA, 0x0E, 0xEC, 0x71, 0xF8, 0x63, 0xF1, + 0xA1, 0xE3, 0x89, 0xF4, 0x72, 0xE5, 0xF3, 0xEE, 0x38, 0xEA, 0x58, 0xF0, + 0x81, 0xF1, 0x7F, 0xFB, 0x61, 0x09, 0xE4, 0xF9, 0x75, 0x15, 0xD8, 0xF7, + 0xC9, 0x13, 0x92, 0x02, 0xFF, 0x0A, 0x30, 0x14, 0x2B, 0x03, 0xB3, 0x18, + 0xFC, 0x0D, 0xC7, 0x11, 0x43, 0x16, 0x2C, 0x08, 0x33, 0x1B, 0x5B, 0x06, + 0x32, 0x20, 0x60, 0x06, 0xFF, 0x1D, 0x51, 0xFE, 0x97, 0x16, 0x5D, 0xFC, + 0xD4, 0x0F, 0xBB, 0x00, 0x91, 0x01, 0xF5, 0x09, 0xB4, 0xFF, 0xE6, 0x10, + 0x44, 0x1A, 0x61, 0x06, 0x93, 0x1A, 0xE2, 0x03, 0x82, 0x11, 0x9E, 0x0D, + 0xEE, 0x1C, 0xCA, 0x09, 0x46, 0x29, 0xDD, 0x08, 0xA9, 0x30, 0x8E, 0x12, + 0x13, 0x26, 0x13, 0x24, 0x18, 0x16, 0x3F, 0x31, 0x39, 0x0C, 0xC8, 0x2B, + 0x90, 0x13, 0x8D, 0x22, 0x85, 0x24, 0x2B, 0x1A, 0x61, 0x21, 0x0F, 0x14, + 0x9A, 0x11, 0xCF, 0x18, 0xCB, 0x03, 0xF9, 0x1F, 0xF2, 0x0C, 0x8B, 0x20, + 0xC4, 0x0F, 0xC5, 0x24, 0x01, 0x07, 0x6E, 0x29, 0x06, 0x13, 0x2E, 0x1D, + 0xAC, 0x11, 0x42, 0x0F, 0x1A, 0x06, 0x3E, 0x0B, 0xB9, 0x11, 0x6B, 0x0A, + 0x59, 0x17, 0xC6, 0x07, 0x2A, 0x07, 0xE3, 0x05, 0x7A, 0xFD, 0xD0, 0x07, + 0x70, 0xFE, 0xBA, 0x04, 0xA1, 0xF0, 0x04, 0xFB, 0x25, 0xE2, 0x51, 0xF3, + 0x90, 0xF2, 0x88, 0xF7, 0x74, 0xFE, 0x72, 0xFC, 0x77, 0xFB, 0xD5, 0xFD, + 0xB9, 0x02, 0xBC, 0xFB, 0x32, 0x10, 0x7C, 0xFB, 0xEA, 0x0E, 0x30, 0x06, + 0x7A, 0x04, 0x71, 0x04, 0x64, 0x0E, 0x02, 0xFD, 0x61, 0x0B, 0xA0, 0xFF, + 0x48, 0xF3, 0xB6, 0x00, 0x42, 0xF1, 0x2D, 0xFF, 0x81, 0xF3, 0x3C, 0xF6, + 0xEF, 0xE0, 0xB5, 0xF2, 0x49, 0xD8, 0xBB, 0xF9, 0x8A, 0xD9, 0x6E, 0xF8, + 0x6A, 0xD5, 0x03, 0xF3, 0xDA, 0xD7, 0xBF, 0xEB, 0x96, 0xE7, 0x59, 0xE3, + 0xCA, 0xF6, 0x88, 0xE8, 0xBE, 0xF8, 0x78, 0xEE, 0xDF, 0xF2, 0x1B, 0xE6, + 0x05, 0xEA, 0xDF, 0xDF, 0x44, 0xE6, 0xC2, 0xE6, 0x53, 0xE7, 0x9A, 0xE5, + 0x79, 0xEC, 0x7B, 0xD6, 0x6C, 0xEF, 0x2C, 0xCC, 0x4F, 0xEC, 0x9D, 0xCE, + 0xF6, 0xEE, 0xDE, 0xCF, 0x25, 0xEB, 0x4F, 0xC3, 0x9B, 0xD1, 0xC1, 0xC0, + 0x38, 0xC3, 0x28, 0xCA, 0x26, 0xD6, 0x7C, 0xD7, 0xCE, 0xF1, 0x95, 0xE4, + 0x7A, 0x04, 0xBC, 0xDF, 0x2C, 0x0A, 0x71, 0xD0, 0x59, 0x08, 0xF5, 0xD1, + 0x15, 0xFD, 0xB5, 0xDC, 0x63, 0xE9, 0x25, 0xD7, 0x5F, 0xDA, 0xD5, 0xCF, + 0xD1, 0xD9, 0xF3, 0xD2, 0x6C, 0xE2, 0x9C, 0xDA, 0x86, 0xE2, 0x24, 0xE0, + 0x9B, 0xD8, 0xD7, 0xD7, 0x3C, 0xD1, 0x37, 0xDD, 0x1E, 0xDD, 0xDB, 0xF2, + 0xBB, 0xE9, 0x8E, 0xF1, 0x3C, 0xEC, 0xCF, 0xED, 0x02, 0xEA, 0xB4, 0xF6, + 0xD4, 0xDD, 0xBB, 0xF9, 0xF1, 0xD9, 0x45, 0xFD, 0x0D, 0xE2, 0x10, 0xFB, + 0xC1, 0xE3, 0x31, 0xF4, 0xE5, 0xE3, 0x65, 0xF4, 0xCD, 0xED, 0xBF, 0xF4, + 0xEA, 0xED, 0x6F, 0xF1, 0x8A, 0xD6, 0x8E, 0xEF, 0x15, 0xCA, 0xB1, 0xF5, + 0x58, 0xE4, 0x9A, 0xFE, 0x54, 0xF9, 0x16, 0xFE, 0xE5, 0xEF, 0x2F, 0xEF, + 0x53, 0xE6, 0xBC, 0xEA, 0xDE, 0xE8, 0x07, 0xF4, 0x47, 0xFA, 0xCF, 0xF8, + 0x6A, 0x10, 0x9E, 0xF8, 0xB1, 0x0D, 0x5C, 0xF3, 0x1E, 0xFC, 0x4A, 0xF4, + 0x87, 0xF2, 0x94, 0xFB, 0x04, 0xEE, 0x9C, 0xF9, 0x94, 0xE8, 0x0C, 0xF3, + 0xB5, 0xE7, 0x9F, 0xF4, 0x11, 0xF9, 0xBE, 0xF6, 0xAD, 0x0F, 0x34, 0xFC, + 0x6E, 0x0A, 0x5E, 0x00, 0x40, 0xF1, 0x54, 0x01, 0x36, 0xEC, 0x5B, 0x05, + 0x4B, 0xF7, 0x2C, 0x01, 0x50, 0x00, 0xF4, 0xEF, 0x7E, 0xFE, 0x55, 0xE2, + 0x21, 0xED, 0xDD, 0xE2, 0x1F, 0xE3, 0xC7, 0xE6, 0x11, 0xEA, 0x3C, 0xEA, + 0x3C, 0xF0, 0x92, 0xEA, 0xB8, 0xEA, 0x99, 0xE7, 0xC9, 0xEE, 0x56, 0xE7, + 0x52, 0xF3, 0xC0, 0xE2, 0x0E, 0xEB, 0xB3, 0xE3, 0x0D, 0xE9, 0x14, 0xF2, + 0x1C, 0xF4, 0xF2, 0xF8, 0x2B, 0x0B, 0x46, 0xFE, 0xA4, 0x1A, 0xD1, 0x02, + 0xE6, 0x16, 0x39, 0x03, 0xDC, 0x05, 0x82, 0x0A, 0xC3, 0xFC, 0xB3, 0x0B, + 0x3D, 0x0F, 0x9D, 0x0A, 0x79, 0x20, 0x98, 0x0A, 0x9A, 0x17, 0x7C, 0x0A, + 0x2A, 0x14, 0x89, 0x18, 0x5F, 0x1C, 0xE1, 0x27, 0xA4, 0x1E, 0xB8, 0x29, + 0xEF, 0x17, 0x1D, 0x33, 0x5E, 0x1B, 0x61, 0x3A, 0x0B, 0x30, 0x47, 0x34, + 0x43, 0x3D, 0x91, 0x3B, 0x66, 0x48, 0xFD, 0x47, 0x1C, 0x48, 0x8A, 0x48, + 0xD2, 0x42, 0xFB, 0x47, 0x0E, 0x4C, 0x59, 0x41, 0x5C, 0x44, 0x23, 0x30, + 0x6A, 0x33, 0xDA, 0x2D, 0x6A, 0x2C, 0x2A, 0x36, 0x22, 0x2E, 0xC2, 0x39, + 0xD2, 0x47, 0x12, 0x30, 0x5E, 0x54, 0x3C, 0x23, 0x16, 0x4D, 0x21, 0x2A, + 0x6A, 0x4D, 0xB9, 0x2C, 0xEE, 0x47, 0x05, 0x30, 0xFD, 0x3F, 0xE2, 0x41, + 0x61, 0x3E, 0x85, 0x4A, 0x65, 0x37, 0xAA, 0x46, 0x01, 0x2E, 0x9F, 0x40, + 0xDC, 0x32, 0xDD, 0x38, 0xDA, 0x35, 0x20, 0x32, 0xC6, 0x2A, 0xBE, 0x31, + 0x7D, 0x27, 0x39, 0x38, 0x7C, 0x2B, 0xC1, 0x35, 0x94, 0x26, 0x6C, 0x30, + 0x12, 0x1D, 0xDF, 0x36, 0x56, 0x16, 0x01, 0x38, 0x49, 0x1B, 0xF8, 0x2C, + 0x21, 0x1F, 0x67, 0x1F, 0xD9, 0x1A, 0xFD, 0x19, 0x94, 0x1A, 0x9C, 0x0F, + 0x39, 0x18, 0xA4, 0x0F, 0x36, 0x13, 0x73, 0x1B, 0x77, 0x0B, 0x02, 0x1D, + 0xEE, 0xFE, 0x8E, 0x17, 0xBA, 0xF3, 0x25, 0x0C, 0x9A, 0xF6, 0x47, 0xFF, + 0x66, 0xFF, 0xED, 0xF6, 0x5E, 0xF7, 0xDA, 0xF9, 0xDC, 0xEF, 0xA7, 0xFE, + 0x5B, 0xF6, 0xE2, 0x00, 0xD1, 0xF9, 0xCE, 0x08, 0x58, 0xF8, 0xED, 0x0B, + 0x7A, 0xF5, 0xF8, 0x07, 0xB5, 0xF2, 0x03, 0x07, 0x3B, 0xF3, 0x7E, 0x02, + 0x13, 0xFA, 0x2A, 0x02, 0xDC, 0xF9, 0x39, 0xFF, 0x41, 0xEE, 0x2C, 0xFD, + 0x4B, 0xE7, 0x2C, 0xFD, 0x56, 0xE3, 0xD6, 0xEF, 0x51, 0xDE, 0x07, 0xE5, + 0x0A, 0xD8, 0x63, 0xDF, 0x04, 0xE0, 0x6B, 0xDC, 0x0B, 0xF6, 0x2D, 0xE0, + 0x84, 0xFF, 0x01, 0xE7, 0xB2, 0xF6, 0x78, 0xE2, 0x6B, 0xEB, 0x41, 0xE5, + 0x76, 0xE3, 0xF8, 0xF4, 0x63, 0xE3, 0xFD, 0xFC, 0x14, 0xF0, 0x7D, 0x00, + 0xCE, 0xF7, 0x82, 0xF6, 0xD9, 0xFD, 0xB6, 0xE4, 0xF2, 0x02, 0xC3, 0xDD, + 0x33, 0xF4, 0xBF, 0xD8, 0x17, 0xDC, 0x0A, 0xCD, 0x84, 0xDC, 0x78, 0xD3, + 0x1B, 0xEA, 0x75, 0xE5, 0xB7, 0xEC, 0x9E, 0xEF, 0xFB, 0xE9, 0xAB, 0xEE, + 0x35, 0xE9, 0xB3, 0xE5, 0x65, 0xED, 0x00, 0xE0, 0xCD, 0xF9, 0x76, 0xDA, + 0x28, 0xFF, 0x30, 0xD4, 0x1C, 0xF2, 0xCF, 0xD6, 0x36, 0xE2, 0xCA, 0xE0, + 0xCB, 0xDA, 0x27, 0xE5, 0x22, 0xDD, 0x4B, 0xE6, 0xCB, 0xD9, 0x5C, 0xE4, + 0x59, 0xDF, 0x54, 0xDD, 0x4B, 0xF2, 0x44, 0xD9, 0xDF, 0xF8, 0x18, 0xDF, + 0x3B, 0xED, 0x73, 0xE0, 0x8B, 0xE2, 0xAF, 0xE8, 0xDA, 0xE1, 0x5E, 0xF7, + 0xDC, 0xE2, 0xD5, 0xFC, 0xEA, 0xEB, 0xB7, 0xFC, 0x8C, 0xEB, 0x5A, 0xF3, + 0xA6, 0xE4, 0x7E, 0xEF, 0xE2, 0xF0, 0xA7, 0xF2, 0xA4, 0xFF, 0xFC, 0xFB, + 0x9F, 0xFC, 0x76, 0xFD, 0xF9, 0xED, 0xCF, 0xF4, 0xC0, 0xE0, 0x58, 0xEF, + 0x92, 0xD9, 0x16, 0xEB, 0x57, 0xD2, 0x3A, 0xF1, 0x9E, 0xD4, 0x27, 0xF1, + 0xC9, 0xE8, 0x2E, 0xE6, 0x01, 0xFE, 0x9D, 0xE7, 0x79, 0x08, 0xEE, 0xEB, + 0xD8, 0xFB, 0x06, 0xF1, 0x9F, 0xE4, 0x89, 0xF7, 0x55, 0xE0, 0xAC, 0xF8, + 0x82, 0xF7, 0xBA, 0xFA, 0xDD, 0x03, 0x97, 0xFE, 0xB4, 0x03, 0x39, 0x01, + 0x8D, 0x05, 0x92, 0xFD, 0x3A, 0x00, 0x57, 0xF6, 0x31, 0xFF, 0x53, 0xE9, + 0xF9, 0x03, 0x7B, 0xE5, 0xCA, 0x04, 0x21, 0xEA, 0x65, 0xFA, 0x06, 0xE9, + 0x0C, 0xEF, 0xB3, 0xF9, 0xD7, 0xE8, 0x16, 0x0A, 0x94, 0xDE, 0x40, 0x03, + 0x89, 0xE0, 0xED, 0xFA, 0xC6, 0x04, 0x76, 0xF3, 0x87, 0x20, 0x3F, 0xF2, + 0xA2, 0x10, 0xCB, 0xFD, 0xF7, 0xFD, 0x1D, 0x0C, 0x6E, 0xF7, 0x60, 0x14, + 0x52, 0xF1, 0x93, 0x15, 0xAA, 0xFC, 0x3B, 0x10, 0x24, 0x09, 0x2F, 0x07, + 0x2D, 0x07, 0x90, 0xFD, 0x0C, 0x12, 0x1D, 0x02, 0x73, 0x20, 0x41, 0x13, + 0x8B, 0x1D, 0x6F, 0x16, 0xE2, 0x12, 0xC6, 0x13, 0xF8, 0x11, 0xAE, 0x1B, + 0x21, 0x18, 0x7A, 0x24, 0x1E, 0x1A, 0x28, 0x2C, 0x8A, 0x1A, 0x17, 0x3E, + 0x0D, 0x2A, 0xEE, 0x41, 0xC4, 0x41, 0x85, 0x35, 0xDA, 0x3F, 0xA7, 0x36, + 0x33, 0x3C, 0xFB, 0x3D, 0x09, 0x3C, 0x4C, 0x4B, 0xA1, 0x38, 0xF8, 0x56, + 0xE4, 0x4D, 0x26, 0x55, 0xF7, 0x5D, 0x8F, 0x4B, 0xB7, 0x50, 0x34, 0x3E, + 0x9A, 0x41, 0xB8, 0x3E, 0x3E, 0x41, 0x23, 0x49, 0x43, 0x3B, 0xC7, 0x40, + 0xB3, 0x36, 0x36, 0x34, 0x8F, 0x44, 0x87, 0x34, 0xD9, 0x50, 0x9F, 0x2F, + 0x0C, 0x4C, 0xC0, 0x23, 0x22, 0x36, 0x54, 0x26, 0x44, 0x27, 0x9E, 0x23, + 0x43, 0x30, 0x6A, 0x1C, 0xEA, 0x32, 0xD0, 0x1D, 0x92, 0x33, 0xD6, 0x10, + 0x43, 0x32, 0xFC, 0x0F, 0xAB, 0x20, 0xF6, 0x11, 0xF1, 0x14, 0x46, 0x0E, + 0x09, 0x06, 0x8A, 0x10, 0x94, 0xF5, 0x5F, 0x07, 0x6C, 0xF4, 0xDE, 0xFB, + 0x34, 0x03, 0xBF, 0xF9, 0x16, 0x08, 0xA9, 0xFD, 0x1F, 0xFE, 0x7F, 0x00, + 0xD4, 0xF4, 0xEE, 0xFE, 0x2F, 0xED, 0x6C, 0xF3, 0xA1, 0xEC, 0x37, 0xE4, + 0x4F, 0xEE, 0x65, 0xE0, 0xCB, 0xEA, 0x52, 0xDF, 0x9A, 0xE9, 0xA6, 0xE2, + 0xA2, 0xE9, 0xA3, 0xEC, 0xE6, 0xE1, 0x3F, 0xEB, 0xB5, 0xD3, 0x53, 0xE8, + 0xA3, 0xC4, 0x5A, 0xE1, 0xB4, 0xBE, 0x1F, 0xDA, 0xA8, 0xC5, 0x64, 0xDB, + 0x8C, 0xCE, 0xF9, 0xDA, 0xF6, 0xD0, 0xA1, 0xD6, 0xC7, 0xDD, 0x96, 0xD8, + 0xFA, 0xE8, 0x1D, 0xDF, 0x91, 0xE6, 0x78, 0xDB, 0x33, 0xE5, 0x8C, 0xDF, + 0xBD, 0xDF, 0xDF, 0xE5, 0x3F, 0xDB, 0x85, 0xE0, 0x6A, 0xDE, 0x0C, 0xE0, + 0xF7, 0xDA, 0xFB, 0xDF, 0x12, 0xCF, 0xF8, 0xD4, 0xFF, 0xC7, 0x70, 0xCE, + 0x0A, 0xC7, 0x6C, 0xD9, 0x0D, 0xC7, 0x1F, 0xDB, 0x18, 0xCA, 0x8C, 0xD4, + 0x2F, 0xD7, 0x8B, 0xD3, 0x1A, 0xE6, 0x88, 0xD8, 0x5D, 0xE4, 0x33, 0xE3, + 0x59, 0xE0, 0x51, 0xE6, 0x83, 0xE2, 0xF5, 0xEE, 0x85, 0xE7, 0x7A, 0xFB, + 0x6A, 0xF7, 0xA6, 0xFA, 0xB4, 0x08, 0xE7, 0xF8, 0xDC, 0x01, 0x3B, 0xFA, + 0x14, 0xED, 0xAD, 0xF1, 0xB7, 0xED, 0x34, 0xED, 0xD7, 0xFA, 0x1A, 0xF9, + 0xA9, 0xF8, 0x26, 0xF6, 0x9C, 0xEF, 0x5F, 0xE8, 0x89, 0xF3, 0xA4, 0xF4, + 0x33, 0xFC, 0x3C, 0xFC, 0xCD, 0xFE, 0x06, 0xFB, 0x83, 0x04, 0xEC, 0xFD, + 0x87, 0x05, 0x2E, 0xF9, 0x86, 0xFE, 0x3C, 0xF3, 0x6B, 0xFF, 0xF7, 0xEA, + 0x93, 0xF4, 0x5F, 0xE5, 0xFA, 0xE0, 0xAA, 0xE4, 0x4D, 0xDE, 0x22, 0xDE, + 0x21, 0xF0, 0x5D, 0xD8, 0xBB, 0x00, 0xFF, 0xE2, 0x7C, 0xF3, 0xA0, 0xDE, + 0xF2, 0xE0, 0x3D, 0xD1, 0x4F, 0xE0, 0xE5, 0xE3, 0x25, 0xE8, 0xBE, 0xF4, + 0x9F, 0xE7, 0xF8, 0xF5, 0x37, 0xE8, 0x93, 0xF7, 0x6F, 0xF1, 0xD3, 0xF2, + 0xD4, 0xEF, 0x7A, 0xF5, 0x98, 0xE4, 0x75, 0xF8, 0x2E, 0xD8, 0xF3, 0xF1, + 0x2D, 0xD9, 0xE5, 0xF4, 0xE4, 0xE9, 0xF7, 0xF0, 0x03, 0xE6, 0x8A, 0xE2, + 0xDE, 0xCF, 0x65, 0xEC, 0x73, 0xCA, 0xB2, 0xFA, 0xCB, 0xD6, 0x3F, 0xF0, + 0xB2, 0xEC, 0xF9, 0xEE, 0xD6, 0x00, 0x6C, 0xF3, 0x60, 0x00, 0x3D, 0xEC, + 0xA6, 0xF2, 0xF6, 0xEC, 0xB0, 0xFB, 0xA4, 0xF2, 0x8C, 0x0B, 0xD9, 0xF8, + 0x55, 0x07, 0x8B, 0xF8, 0xDC, 0x04, 0x81, 0xF6, 0x85, 0x09, 0x73, 0xF7, + 0x6F, 0x0A, 0xC8, 0xF1, 0x20, 0x03, 0xEF, 0xF6, 0x06, 0x01, 0xE0, 0xFF, + 0xC8, 0x0C, 0x20, 0xF9, 0xE6, 0x19, 0xDE, 0xEB, 0x91, 0x1C, 0x83, 0xEE, + 0xC0, 0x14, 0x1A, 0xF8, 0xB9, 0x02, 0x8F, 0xFC, 0x76, 0xFA, 0x77, 0x06, + 0xEC, 0x0E, 0xB1, 0x08, 0xE0, 0x1A, 0xD1, 0x00, 0xA8, 0x14, 0xBD, 0xFF, + 0x7A, 0x15, 0x60, 0x00, 0x2A, 0x18, 0x80, 0x07, 0xE3, 0x0D, 0xD3, 0x12, + 0xD9, 0x06, 0x2D, 0x16, 0xA8, 0x10, 0x2B, 0x16, 0x6C, 0x19, 0x36, 0x15, + 0x1F, 0x16, 0x34, 0x1B, 0xE9, 0x0F, 0x85, 0x27, 0xE9, 0x03, 0x2E, 0x28, + 0xCD, 0x00, 0x77, 0x1E, 0xD0, 0x13, 0x7D, 0x18, 0x18, 0x1D, 0x80, 0x12, + 0xAF, 0x15, 0x26, 0x1D, 0xF0, 0x0E, 0x66, 0x35, 0xE8, 0x1B, 0xE6, 0x39, + 0x93, 0x28, 0xD4, 0x2F, 0x52, 0x25, 0xEE, 0x29, 0x31, 0x25, 0x21, 0x29, + 0x6B, 0x29, 0x4D, 0x2F, 0xDC, 0x22, 0x37, 0x35, 0x65, 0x21, 0x01, 0x3D, + 0xD5, 0x2C, 0x7C, 0x3E, 0xEA, 0x34, 0x7E, 0x2F, 0x99, 0x3D, 0x75, 0x2D, + 0x54, 0x3E, 0xE2, 0x35, 0xDE, 0x2F, 0x68, 0x34, 0x96, 0x1F, 0x46, 0x38, + 0xBC, 0x1E, 0x1D, 0x3C, 0xFA, 0x1F, 0xA9, 0x29, 0x79, 0x1C, 0x91, 0x12, + 0x48, 0x25, 0x85, 0x10, 0xC5, 0x36, 0x53, 0x15, 0x7E, 0x39, 0xE1, 0x18, + 0x72, 0x26, 0xDB, 0x1A, 0x1F, 0x1A, 0x5A, 0x0D, 0x3A, 0x1C, 0x54, 0x03, + 0x44, 0x14, 0xE6, 0x01, 0xC8, 0x0B, 0x4F, 0x01, 0xE5, 0x0E, 0x67, 0x04, + 0xCD, 0x0A, 0x9A, 0xFB, 0xBD, 0x02, 0x0D, 0xED, 0x41, 0x00, 0xC7, 0xE9, + 0x82, 0xF7, 0xF8, 0xEF, 0x4D, 0xE2, 0x69, 0xEE, 0xB5, 0xD5, 0xAC, 0xE5, + 0x53, 0xD6, 0x07, 0xE8, 0xEB, 0xD7, 0x93, 0xE8, 0x31, 0xD5, 0x48, 0xDC, + 0x8D, 0xC9, 0x62, 0xD1, 0xD7, 0xC6, 0xD3, 0xCB, 0x1A, 0xC5, 0x16, 0xCD, + 0xA3, 0xB8, 0xC8, 0xC8, 0x68, 0xB6, 0xDE, 0xC0, 0xF5, 0xC6, 0xC0, 0xC1, + 0xD2, 0xCF, 0x2D, 0xC5, 0x77, 0xC4, 0xD5, 0xC7, 0xF8, 0xBE, 0xBA, 0xC2, + 0xBA, 0xBC, 0x47, 0xB7, 0x64, 0xBE, 0x3A, 0xBA, 0x9F, 0xC5, 0xC8, 0xC4, + 0x1C, 0xC9, 0x91, 0xC2, 0x70, 0xCC, 0x41, 0xBF, 0x3D, 0xD1, 0x17, 0xD5, + 0x41, 0xD8, 0xBF, 0xE9, 0x7D, 0xD4, 0x7E, 0xE3, 0xAC, 0xCB, 0xA4, 0xDB, + 0xC1, 0xCC, 0xFF, 0xD4, 0x5D, 0xD8, 0xBB, 0xD9, 0x4E, 0xE2, 0x90, 0xE6, + 0xD9, 0xD5, 0x61, 0xE6, 0x35, 0xC6, 0xAE, 0xE4, 0x91, 0xD2, 0xFC, 0xE1, + 0x23, 0xE2, 0x4B, 0xD9, 0xDE, 0xE3, 0xD5, 0xD4, 0x74, 0xE2, 0x4F, 0xD3, + 0xAE, 0xE6, 0x2A, 0xDB, 0x27, 0xF3, 0x3F, 0xF4, 0xDD, 0x03, 0xA7, 0x02, + 0xD2, 0x0C, 0x11, 0x00, 0xF2, 0x04, 0xB5, 0x08, 0x85, 0x01, 0x03, 0x0D, + 0x1D, 0x0C, 0xFA, 0x0A, 0x53, 0x17, 0xEF, 0x12, 0xD5, 0x18, 0xA1, 0x10, + 0x7A, 0x1E, 0x56, 0x14, 0x2B, 0x28, 0x00, 0x22, 0x35, 0x26, 0x03, 0x20, + 0xAE, 0x19, 0xE4, 0x20, 0x0A, 0x13, 0x43, 0x29, 0x91, 0x26, 0x65, 0x32, + 0x8D, 0x45, 0x84, 0x41, 0x46, 0x4C, 0xFB, 0x3E, 0x86, 0x3C, 0x1D, 0x36, + 0x5B, 0x33, 0xAC, 0x3A, 0xE8, 0x2F, 0x4B, 0x37, 0x8F, 0x2D, 0xD2, 0x34, + 0x24, 0x30, 0x8A, 0x39, 0xD8, 0x31, 0xD0, 0x2F, 0x02, 0x35, 0xB7, 0x25, + 0x94, 0x3A, 0x2F, 0x2A, 0x27, 0x37, 0x23, 0x2C, 0xE7, 0x23, 0x37, 0x26, + 0x43, 0x1C, 0x60, 0x21, 0xE3, 0x2D, 0xE7, 0x20, 0x6B, 0x30, 0x8A, 0x2A, + 0x90, 0x1C, 0xD2, 0x33, 0xC7, 0x14, 0x8B, 0x37, 0x38, 0x21, 0x8E, 0x30, + 0x57, 0x31, 0xC6, 0x18, 0x4C, 0x28, 0xA7, 0x12, 0x5D, 0x12, 0x46, 0x1C, + 0x50, 0x0F, 0x3B, 0x22, 0x50, 0x10, 0x56, 0x24, 0xA0, 0x10, 0x76, 0x1A, + 0x00, 0x17, 0xDF, 0x0E, 0xFB, 0x16, 0x9B, 0x08, 0x52, 0x09, 0x9F, 0x01, + 0x71, 0xFF, 0x9E, 0xFE, 0x27, 0xF9, 0xD2, 0x09, 0x76, 0xEE, 0xB5, 0x11, + 0x03, 0xFF, 0x1B, 0x0D, 0x37, 0x1A, 0xAC, 0x0D, 0x51, 0x0E, 0xF5, 0x04, + 0x79, 0xED, 0xC1, 0xFF, 0x04, 0xE6, 0x67, 0x0B, 0x28, 0xF0, 0x50, 0x08, + 0x31, 0xF6, 0xF5, 0xFC, 0xD6, 0x02, 0x1D, 0xF2, 0x84, 0x0E, 0xBD, 0xE4, + 0x76, 0x03, 0x50, 0xD9, 0x76, 0xEF, 0x6A, 0xD9, 0x90, 0xDF, 0x87, 0xE2, + 0xF5, 0xD5, 0x26, 0xDF, 0x67, 0xD7, 0xD9, 0xD3, 0xFD, 0xEF, 0x29, 0xCF, + 0x2F, 0x02, 0x01, 0xD1, 0x31, 0xF0, 0x2C, 0xD5, 0xBA, 0xDF, 0xFF, 0xDB, + 0x44, 0xE4, 0x4E, 0xDA, 0x1F, 0xEA, 0xF5, 0xCE, 0xCD, 0xDE, 0x57, 0xD3, + 0x2A, 0xD7, 0x94, 0xE5, 0x41, 0xDC, 0x2C, 0xF0, 0xD4, 0xE1, 0xE8, 0xF0, + 0xE0, 0xEA, 0x9F, 0xE6, 0x78, 0xEA, 0xA8, 0xD7, 0xD3, 0xE3, 0x4A, 0xDA, + 0x55, 0xE6, 0xEE, 0xED, 0x96, 0xE9, 0xB5, 0xFD, 0x70, 0xEC, 0xE5, 0x0A, + 0x6D, 0xF4, 0x33, 0x11, 0xF2, 0xFD, 0x8E, 0x0A, 0xAE, 0xFE, 0xC4, 0x0A, + 0x5C, 0xFA, 0xCD, 0x14, 0x3C, 0xF5, 0xE4, 0x1B, 0xB7, 0xFA, 0x06, 0x20, + 0xA3, 0x0D, 0x71, 0x21, 0xCC, 0x1B, 0x91, 0x19, 0x10, 0x26, 0xFD, 0x16, + 0xFE, 0x20, 0x81, 0x21, 0xE9, 0x13, 0x78, 0x27, 0x59, 0x14, 0xC9, 0x2D, + 0xB9, 0x15, 0x5A, 0x2E, 0x6E, 0x16, 0xE4, 0x21, 0x5D, 0x21, 0xAA, 0x1D, + 0x67, 0x2D, 0x5B, 0x1F, 0x5D, 0x2B, 0xF1, 0x17, 0x6E, 0x27, 0x9F, 0x10, + 0xAB, 0x26, 0x84, 0x13, 0x3E, 0x24, 0xB5, 0x0B, 0xDA, 0x25, 0x85, 0xFF, + 0x2B, 0x24, 0xBB, 0x04, 0x83, 0x20, 0x99, 0x0B, 0x4E, 0x1D, 0x7A, 0x0E, + 0x1A, 0x18, 0xF6, 0x0D, 0xDB, 0x12, 0xFA, 0x0A, 0xB5, 0x03, 0xF2, 0x02, + 0xC5, 0xF9, 0xBF, 0xF7, 0x31, 0xF9, 0x74, 0x01, 0x6B, 0xF0, 0xF5, 0x0C, + 0x3C, 0xE9, 0x0B, 0x07, 0xDB, 0xE3, 0x4D, 0x01, 0xC3, 0xD8, 0x7A, 0xFE, + 0x07, 0xD6, 0xBB, 0xF6, 0xB1, 0xDF, 0xAB, 0xE9, 0x6B, 0xDA, 0x7B, 0xDC, + 0x6F, 0xD6, 0x71, 0xD2, 0xFD, 0xE3, 0x30, 0xD3, 0x77, 0xE5, 0x79, 0xD4, + 0xCE, 0xD4, 0x5B, 0xCC, 0xAA, 0xC7, 0xF6, 0xCE, 0xBC, 0xCA, 0x22, 0xD0, + 0x98, 0xCB, 0x60, 0xCC, 0x33, 0xCC, 0x30, 0xD4, 0x78, 0xCF, 0x06, 0xCD, + 0x9A, 0xC7, 0x56, 0xBF, 0xDE, 0xC7, 0x99, 0xC3, 0x55, 0xD2, 0xF2, 0xCB, + 0xC5, 0xCE, 0x66, 0xCE, 0xA1, 0xD0, 0x8B, 0xD5, 0xC4, 0xE7, 0x99, 0xE2, + 0x18, 0xF5, 0x2F, 0xE9, 0xEF, 0xE7, 0x5F, 0xE7, 0xF4, 0xD2, 0x85, 0xE6, + 0xA9, 0xC5, 0x55, 0xE7, 0x34, 0xCA, 0x9C, 0xE5, 0xEC, 0xDA, 0x24, 0xE9, + 0xB3, 0xE7, 0x4A, 0xF2, 0x3A, 0xEF, 0x85, 0xF2, 0xA7, 0xEA, 0xD4, 0xF4, + 0xEC, 0xE9, 0xAF, 0xFE, 0x3D, 0xE9, 0xFB, 0xFA, 0x55, 0xE4, 0xE0, 0xF9, + 0x47, 0xF6, 0x2F, 0x00, 0x2E, 0x13, 0x0A, 0x02, 0xFA, 0x1A, 0x94, 0x0D, + 0xCA, 0x0B, 0xEF, 0x17, 0xED, 0x09, 0x54, 0x1D, 0x74, 0x1A, 0x12, 0x22, + 0xE9, 0x1D, 0x1D, 0x1B, 0x41, 0x1A, 0xA2, 0x16, 0x5A, 0x1B, 0x95, 0x17, + 0x5A, 0x1D, 0xF2, 0x1B, 0x28, 0x25, 0x1D, 0x27, 0xC7, 0x35, 0x8E, 0x36, + 0xC7, 0x3C, 0x6D, 0x37, 0x92, 0x3E, 0x77, 0x30, 0x14, 0x50, 0x1F, 0x37, + 0xC6, 0x5C, 0x24, 0x3E, 0x30, 0x4E, 0xBA, 0x41, 0x6F, 0x3F, 0xB7, 0x42, + 0x0F, 0x4E, 0xD8, 0x40, 0xC4, 0x59, 0xE2, 0x3C, 0xB0, 0x49, 0x53, 0x3A, + 0x01, 0x3A, 0xFE, 0x42, 0xED, 0x33, 0x83, 0x41, 0xF1, 0x34, 0x34, 0x34, + 0x56, 0x46, 0x93, 0x38, 0x7E, 0x47, 0x55, 0x37, 0x1A, 0x29, 0x42, 0x2A, + 0x32, 0x1B, 0xE2, 0x31, 0x1F, 0x26, 0xBF, 0x3B, 0xC0, 0x2A, 0x6E, 0x2D, + 0x9E, 0x2C, 0xBE, 0x2B, 0xF2, 0x3C, 0x64, 0x39, 0x5A, 0x45, 0xEE, 0x2C, + 0x1B, 0x26, 0xD7, 0x23, 0x03, 0x02, 0x50, 0x25, 0xFF, 0xFF, 0x20, 0x18, + 0x4F, 0x0A, 0x70, 0x0D, 0x79, 0x08, 0x3B, 0x07, 0x88, 0xFA, 0x29, 0xFB, + 0xB9, 0xEA, 0xDF, 0xF3, 0x2A, 0xDF, 0xF8, 0xFB, 0xCD, 0xE1, 0x4C, 0x01, + 0xF8, 0xEC, 0xDE, 0xEF, 0x8B, 0xEE, 0x2D, 0xE0, 0x10, 0xEB, 0x20, 0xE2, + 0xD0, 0xEC, 0x36, 0xE5, 0x43, 0xEC, 0xA9, 0xE8, 0x7E, 0xDA, 0x44, 0xF0, + 0x26, 0xCD, 0x2F, 0xE7, 0x89, 0xDF, 0xE1, 0xD3, 0x86, 0xF1, 0x8D, 0xD4, + 0xC5, 0xEB, 0x82, 0xD2, 0xAF, 0xDE, 0xE4, 0xCB, 0xDD, 0xD3, 0x3F, 0xCE, + 0xF4, 0xCC, 0xCF, 0xC3, 0x0D, 0xC7, 0xAE, 0xB5, 0x1D, 0xC1, 0x25, 0xB8, + 0x93, 0xB9, 0xC0, 0xC2, 0x4C, 0xBB, 0x93, 0xC6, 0xF3, 0xC9, 0x05, 0xC1, + 0x6C, 0xD1, 0x87, 0xB2, 0x88, 0xC9, 0x6F, 0xA8, 0x70, 0xC0, 0xEF, 0xB0, + 0x34, 0xBB, 0xF5, 0xBF, 0x91, 0xB7, 0x22, 0xCD, 0xB0, 0xB7, 0xF1, 0xD3, + 0xE3, 0xBC, 0x1D, 0xCE, 0x53, 0xC1, 0x3B, 0xC6, 0xDE, 0xC0, 0x99, 0xBE, + 0x70, 0xC0, 0xE3, 0xBB, 0x68, 0xBF, 0xA9, 0xC2, 0x39, 0xC5, 0x7C, 0xD1, + 0x35, 0xD3, 0xC5, 0xDD, 0x72, 0xE0, 0xFC, 0xDD, 0x4F, 0xE8, 0xE8, 0xE2, + 0xDB, 0xE4, 0xE7, 0xEB, 0x54, 0xE6, 0x9C, 0xF4, 0x98, 0xEB, 0x0F, 0x00, + 0xDA, 0xEB, 0x4C, 0x03, 0xAD, 0xEE, 0x82, 0xFD, 0x23, 0xFD, 0xB8, 0x02, + 0x05, 0x0D, 0x7E, 0x09, 0x9A, 0x0E, 0xFA, 0x0A, 0xAC, 0x09, 0xAE, 0x17, + 0x93, 0x0B, 0x32, 0x20, 0xD4, 0x15, 0x1A, 0x20, 0xFC, 0x1B, 0xDC, 0x20, + 0xA3, 0x1A, 0xD1, 0x20, 0x36, 0x25, 0x20, 0x21, 0x35, 0x39, 0x18, 0x26, + 0x4B, 0x3F, 0x4D, 0x25, 0x06, 0x38, 0x75, 0x16, 0xAF, 0x2B, 0x35, 0x0C, + 0x94, 0x29, 0x03, 0x17, 0xE9, 0x33, 0xE5, 0x1E, 0x57, 0x35, 0xF1, 0x06, + 0x3C, 0x27, 0x53, 0xFC, 0x02, 0x1B, 0x70, 0x05, 0x48, 0x18, 0xE0, 0xFD, + 0xCC, 0x19, 0xC0, 0x03, 0x0D, 0x15, 0xDD, 0x0D, 0x21, 0x0B, 0xA3, 0x03, + 0xD8, 0x0D, 0xC0, 0x0A, 0xEA, 0x1D, 0xE4, 0x16, 0x1A, 0x20, 0x95, 0x12, + 0x01, 0x13, 0x5C, 0x10, 0x10, 0x0A, 0x1C, 0x12, 0x9F, 0x02, 0x56, 0x0F, + 0x54, 0xFE, 0x89, 0x0F, 0x71, 0xF6, 0x4B, 0x0B, 0x72, 0xE8, 0x45, 0x00, + 0xA9, 0xE6, 0xAB, 0x01, 0xFC, 0xED, 0xFE, 0xFC, 0x75, 0xE4, 0x6E, 0xF5, + 0x1B, 0xD6, 0xC8, 0xF7, 0xE1, 0xDE, 0x9C, 0xF5, 0x2E, 0xE9, 0xD6, 0xF3, + 0x85, 0xEA, 0x11, 0xEC, 0xB3, 0xED, 0x0E, 0xE8, 0xF3, 0xE9, 0x41, 0xF2, + 0xD1, 0xE7, 0x79, 0xF4, 0x29, 0xF7, 0x19, 0xFA, 0x96, 0x03, 0x2D, 0xFF, + 0xCD, 0xFA, 0x01, 0xF4, 0xDB, 0xF4, 0x6A, 0xF6, 0x64, 0xF7, 0xB9, 0x03, + 0xBC, 0xF0, 0xAD, 0x00, 0x85, 0xE7, 0xAE, 0x00, 0x08, 0xEF, 0x57, 0x0B, + 0xE9, 0xFE, 0xD3, 0x01, 0xCF, 0x01, 0x5A, 0xFC, 0x91, 0x03, 0xDC, 0x03, + 0x2A, 0x04, 0xAD, 0xF7, 0x23, 0xFC, 0x64, 0xF5, 0x1F, 0x02, 0xC0, 0xFF, + 0x12, 0x11, 0x18, 0x05, 0x2F, 0x0E, 0xAF, 0x09, 0x2C, 0x05, 0x3B, 0x09, + 0xDF, 0x0C, 0x98, 0x10, 0x03, 0x14, 0xCB, 0x18, 0x40, 0x0D, 0x47, 0x1A, + 0x2E, 0x08, 0x93, 0x1C, 0x94, 0x0A, 0x85, 0x16, 0x30, 0x13, 0x77, 0x0E, + 0x12, 0x10, 0x3E, 0x16, 0x88, 0x0A, 0x3C, 0x1E, 0xF4, 0x12, 0x3E, 0x15, + 0x7F, 0x22, 0xDC, 0x10, 0x44, 0x37, 0x3D, 0x15, 0x16, 0x39, 0x81, 0x16, + 0x56, 0x21, 0xE4, 0x1F, 0xC1, 0x10, 0xE1, 0x22, 0xC6, 0x20, 0x8E, 0x1F, + 0x3B, 0x2F, 0x9C, 0x1C, 0xF8, 0x21, 0x88, 0x14, 0x7D, 0x19, 0x1E, 0x10, + 0xF4, 0x1A, 0x9D, 0x0E, 0x52, 0x1A, 0x9F, 0x0E, 0x38, 0x1D, 0xBB, 0x10, + 0xB7, 0x29, 0x90, 0x11, 0xE7, 0x30, 0xD0, 0x06, 0xDC, 0x21, 0x43, 0x01, + 0xA7, 0x18, 0x4E, 0x0B, 0x6E, 0x17, 0x6A, 0x0E, 0x02, 0x0C, 0xE9, 0x0A, + 0x80, 0x10, 0x54, 0x0A, 0x5A, 0x24, 0x7F, 0x04, 0x18, 0x16, 0x47, 0xFD, + 0xA5, 0xF3, 0x40, 0x04, 0x0A, 0xF1, 0x70, 0x10, 0xC8, 0xF4, 0x9F, 0x0C, + 0x6A, 0xEA, 0x00, 0xFE, 0xF5, 0xEA, 0xCA, 0xF2, 0xBC, 0xED, 0xE2, 0xEB, + 0x5F, 0xED, 0x0A, 0xED, 0x42, 0xF2, 0x5F, 0xF4, 0x64, 0xE8, 0x8B, 0xF3, + 0x97, 0xDD, 0x52, 0xEA, 0x3A, 0xED, 0x8E, 0xE4, 0x2B, 0xF9, 0x1E, 0xDC, + 0x2E, 0xE6, 0x2F, 0xD3, 0xC5, 0xD0, 0x32, 0xE2, 0x93, 0xCB, 0x67, 0xF4, + 0xFE, 0xCE, 0xB9, 0xEA, 0x7C, 0xDC, 0xA2, 0xE1, 0x13, 0xE3, 0xBA, 0xE3, + 0x71, 0xDC, 0x0D, 0xDF, 0x2D, 0xD8, 0x47, 0xD6, 0x7D, 0xE0, 0x33, 0xD7, + 0x9F, 0xED, 0x94, 0xD1, 0x1E, 0xEC, 0xFD, 0xC9, 0x05, 0xE6, 0x09, 0xDC, + 0xE9, 0xDD, 0x75, 0xE8, 0x24, 0xCD, 0x55, 0xDD, 0x30, 0xCB, 0xD1, 0xD1, + 0x82, 0xD9, 0x93, 0xCA, 0xEB, 0xDB, 0xCA, 0xC5, 0xF1, 0xD4, 0xCA, 0xC8, + 0x4D, 0xD0, 0xB3, 0xD1, 0xA5, 0xCA, 0xE0, 0xE1, 0x04, 0xCF, 0xE7, 0xF3, + 0x35, 0xDA, 0xF9, 0xED, 0xB7, 0xD2, 0x58, 0xD6, 0x87, 0xC6, 0x94, 0xC9, + 0xE6, 0xC5, 0x53, 0xCB, 0xBC, 0xC9, 0xC4, 0xD7, 0x26, 0xD0, 0x24, 0xDD, + 0x71, 0xCF, 0x58, 0xD9, 0x03, 0xD8, 0x0B, 0xD3, 0x24, 0xE6, 0xBE, 0xCD, + 0x01, 0xE5, 0xC3, 0xDF, 0x10, 0xDE, 0x20, 0xF4, 0x23, 0xD9, 0x12, 0xFA, + 0xCB, 0xDC, 0x69, 0x0A, 0x4A, 0xE6, 0x2C, 0x15, 0xE0, 0xF0, 0x4B, 0x02, + 0x7C, 0xF5, 0x77, 0xF8, 0x49, 0xFE, 0x34, 0x08, 0x68, 0x12, 0x8F, 0x16, + 0xDD, 0x19, 0xFE, 0x23, 0x21, 0x14, 0xC7, 0x25, 0xC7, 0x12, 0x0A, 0x27, + 0x49, 0x19, 0x3E, 0x35, 0xC6, 0x20, 0x4C, 0x32, 0x55, 0x22, 0x3A, 0x2A, + 0x57, 0x28, 0xA3, 0x29, 0x52, 0x33, 0x47, 0x28, 0xB1, 0x3E, 0x9A, 0x36, + 0xDB, 0x4D, 0xD2, 0x45, 0xC4, 0x4A, 0xDF, 0x32, 0x0A, 0x39, 0x89, 0x1C, + 0x6F, 0x3D, 0x14, 0x1D, 0x4F, 0x4F, 0x4E, 0x1F, 0x72, 0x49, 0x9A, 0x19, + 0x80, 0x3D, 0x77, 0x15, 0xBB, 0x46, 0xB5, 0x1D, 0xE2, 0x44, 0xDF, 0x22, + 0x8B, 0x3A, 0xAA, 0x1A, 0x92, 0x3A, 0x01, 0x22, 0x65, 0x34, 0x3A, 0x2C, + 0xA0, 0x2B, 0x56, 0x22, 0x4E, 0x2C, 0x56, 0x29, 0xA2, 0x29, 0xF9, 0x35, + 0xF4, 0x1F, 0xAD, 0x29, 0x13, 0x1E, 0xA0, 0x27, 0x9B, 0x23, 0xCF, 0x26, + 0x72, 0x1F, 0xF2, 0x0D, 0x75, 0x12, 0x91, 0x0C, 0x81, 0x0D, 0xC6, 0x1A, + 0x79, 0x0C, 0x5D, 0x1A, 0xC0, 0x0D, 0x9C, 0x1B, 0xF9, 0x0E, 0xD6, 0x16, + 0xEB, 0x06, 0x4A, 0x09, 0xE3, 0xF7, 0x9B, 0x05, 0xAD, 0xF3, 0x62, 0x0C, + 0x51, 0xF8, 0x8D, 0x0F, 0xA0, 0xF4, 0xF0, 0x0A, 0x7C, 0xFA, 0x6C, 0x03, + 0x1C, 0x12, 0x8F, 0x08, 0x78, 0x1D, 0xDC, 0x0D, 0xE7, 0x0F, 0x6F, 0x05, + 0x64, 0xFB, 0xB6, 0x05, 0x4F, 0xF1, 0xAD, 0x09, 0x30, 0xF5, 0xCB, 0x02, + 0xAD, 0xF8, 0x57, 0x02, 0x0E, 0xF3, 0x58, 0x01, 0xAD, 0xEC, 0xB1, 0xF9, + 0xFC, 0xE9, 0x3F, 0xF5, 0x4C, 0xE8, 0xE2, 0xF4, 0x14, 0xE7, 0xA9, 0xF8, + 0x22, 0xE1, 0xB6, 0xF4, 0xA3, 0xDB, 0x6F, 0xED, 0x4A, 0xE6, 0x5E, 0xF1, + 0x05, 0xF5, 0xB4, 0xF9, 0xA9, 0xF2, 0x96, 0xFC, 0x5A, 0xF1, 0x26, 0xFB, + 0xA1, 0xFC, 0x3F, 0xF5, 0x02, 0x00, 0xF0, 0xEF, 0x6C, 0xED, 0x0C, 0xEF, + 0xEE, 0xD9, 0xC9, 0xEC, 0x43, 0xDA, 0x31, 0xEE, 0x02, 0xE3, 0xAE, 0xF6, + 0x4C, 0xEA, 0xAA, 0xF2, 0x9D, 0xEA, 0xF6, 0xEC, 0x4C, 0xEA, 0x92, 0xF8, + 0xD7, 0xF5, 0x78, 0x03, 0x23, 0x05, 0x4D, 0x02, 0x90, 0x0A, 0x62, 0xFC, + 0x99, 0x0A, 0x39, 0xFB, 0x69, 0x0A, 0x72, 0xF8, 0x05, 0x04, 0x19, 0xF3, + 0x7F, 0xF6, 0x4A, 0xF3, 0x2A, 0xF3, 0x3D, 0xF6, 0xCD, 0xFE, 0x18, 0xF4, + 0x7D, 0x13, 0xB7, 0xF0, 0xC1, 0x19, 0x3E, 0xF0, 0x9C, 0x03, 0x6B, 0xEE, + 0x1B, 0xEF, 0x6C, 0xF5, 0xFA, 0xEF, 0xC3, 0xFF, 0xBF, 0xF7, 0x3C, 0xF4, + 0x33, 0xF9, 0x0E, 0xE6, 0x44, 0x03, 0x56, 0xED, 0x71, 0x0B, 0xFB, 0xF3, + 0x0C, 0x03, 0x3C, 0xED, 0xAF, 0xF4, 0x24, 0xF0, 0x70, 0xE6, 0x50, 0xFC, + 0x73, 0xE2, 0xAE, 0xF2, 0xDC, 0xEF, 0x0A, 0xE6, 0x82, 0xFA, 0x36, 0xEF, + 0x16, 0xEB, 0x74, 0xF3, 0xCB, 0xD3, 0x48, 0xF3, 0x22, 0xD9, 0x28, 0xFE, + 0xC1, 0xEB, 0x6F, 0xF7, 0x58, 0xF2, 0xCC, 0xE1, 0x2F, 0xF2, 0x6D, 0xDB, + 0x5A, 0xEC, 0x13, 0xDB, 0xC7, 0xE6, 0x2F, 0xE0, 0xA6, 0xE6, 0x24, 0xE7, + 0xB3, 0xE6, 0xD0, 0xDE, 0x7D, 0xE3, 0xA6, 0xD8, 0x47, 0xE2, 0xF5, 0xDD, + 0x87, 0xDC, 0x8B, 0xDD, 0xDF, 0xD2, 0x28, 0xD7, 0xE1, 0xDB, 0xF8, 0xD4, + 0x0F, 0xF1, 0x33, 0xD9, 0xF9, 0xF6, 0x5A, 0xD8, 0xDC, 0xEC, 0xD9, 0xD3, + 0x9E, 0xE2, 0x64, 0xE5, 0x3D, 0xE6, 0x39, 0xF9, 0x3B, 0xF4, 0xB4, 0xF5, + 0xB3, 0xFF, 0x50, 0xEE, 0x59, 0x00, 0x4D, 0xE1, 0xB5, 0xFB, 0xCD, 0xD3, + 0x7E, 0xF6, 0x3F, 0xE2, 0x22, 0xEC, 0x81, 0xF8, 0x51, 0xE9, 0xB4, 0xFE, + 0xFC, 0xF0, 0xD9, 0xFA, 0x24, 0xF7, 0x99, 0xF6, 0x55, 0xFA, 0x76, 0xFC, + 0xFA, 0xF8, 0xD5, 0x05, 0x03, 0xEB, 0x4B, 0x0B, 0x81, 0xDF, 0x5E, 0x12, + 0x26, 0xE9, 0x4A, 0x13, 0xE8, 0xFC, 0x21, 0x06, 0x73, 0x06, 0x4F, 0x01, + 0x9D, 0x0C, 0x13, 0x0B, 0x57, 0x14, 0x51, 0x1B, 0x6B, 0x0F, 0x99, 0x2D, + 0x2C, 0x07, 0xD6, 0x29, 0xCF, 0x05, 0x36, 0x1C, 0x10, 0x07, 0xD3, 0x20, + 0x4F, 0x13, 0xC5, 0x29, 0x2B, 0x26, 0x1C, 0x2F, 0x92, 0x2D, 0xF6, 0x2F, + 0x7A, 0x2E, 0x19, 0x30, 0x54, 0x31, 0xF4, 0x38, 0x6B, 0x30, 0x01, 0x42, + 0x6B, 0x2C, 0xBC, 0x45, 0xE2, 0x30, 0xF3, 0x4D, 0x06, 0x36, 0xB2, 0x52, + 0xBF, 0x3E, 0xF9, 0x48, 0xB4, 0x4E, 0xEA, 0x47, 0xCA, 0x53, 0x32, 0x4B, + 0x23, 0x4C, 0x0D, 0x41, 0x7F, 0x44, 0xF7, 0x43, 0xD5, 0x4B, 0x82, 0x4A, + 0xF2, 0x59, 0x7C, 0x42, 0xA3, 0x5D, 0x46, 0x3F, 0xE2, 0x5A, 0xAF, 0x3A, + 0x54, 0x50, 0x6B, 0x2D, 0xB6, 0x44, 0xD3, 0x24, 0x25, 0x3C, 0xD0, 0x27, + 0x85, 0x2D, 0xBB, 0x24, 0x81, 0x22, 0x56, 0x17, 0x43, 0x23, 0x0C, 0x15, + 0x64, 0x23, 0x0E, 0x17, 0xCF, 0x0F, 0x1B, 0x12, 0xA3, 0x01, 0xB8, 0x10, + 0x5D, 0x05, 0x59, 0x12, 0x12, 0x05, 0x00, 0x03, 0xEE, 0xFE, 0xEE, 0xED, + 0xFA, 0xF3, 0xFA, 0xEE, 0xE1, 0xF4, 0x34, 0xF4, 0xDE, 0xFD, 0x27, 0xF2, + 0xC2, 0xF4, 0xFA, 0xF0, 0xD6, 0xE1, 0xD4, 0xE3, 0x00, 0xE1, 0x21, 0xD7, + 0xAE, 0xEE, 0x96, 0xDD, 0xA0, 0xEA, 0x77, 0xE0, 0xBA, 0xD7, 0x0F, 0xD2, + 0xEB, 0xCE, 0xAF, 0xCB, 0xAB, 0xD1, 0x3C, 0xCC, 0x47, 0xDA, 0xF0, 0xC7, + 0x90, 0xDE, 0x35, 0xC9, 0xDD, 0xD3, 0x9B, 0xC8, 0xD3, 0xC7, 0x21, 0xC5, + 0x3E, 0xD7, 0xE5, 0xC9, 0xAC, 0xE8, 0x6B, 0xD9, 0x8E, 0xDA, 0x8F, 0xE5, + 0x83, 0xCD, 0xD4, 0xE4, 0x54, 0xCF, 0x6D, 0xE3, 0xD9, 0xD0, 0x3A, 0xE7, + 0x23, 0xCD, 0x97, 0xE8, 0xD9, 0xCC, 0xF2, 0xEA, 0xB3, 0xDB, 0x15, 0xF0, + 0xC8, 0xF0, 0xA1, 0xEC, 0xAA, 0xF4, 0xC8, 0xE3, 0xB5, 0xDA, 0x10, 0xDA, + 0xFD, 0xBF, 0xC3, 0xD2, 0xF6, 0xC3, 0x06, 0xD4, 0xFE, 0xD6, 0xA7, 0xD2, + 0xCA, 0xE0, 0xC7, 0xD0, 0x42, 0xE5, 0x7A, 0xDA, 0x88, 0xEB, 0x47, 0xE4, + 0x5A, 0xE5, 0x27, 0xE8, 0xEA, 0xD2, 0xAD, 0xEA, 0xE6, 0xCB, 0x77, 0xEB, + 0xED, 0xD5, 0x86, 0xEB, 0x9A, 0xE8, 0xA6, 0xEC, 0x0F, 0xF4, 0xC9, 0xF6, + 0x32, 0xF0, 0x5E, 0x04, 0xF7, 0xEC, 0xA1, 0x06, 0xFC, 0xFA, 0x95, 0x06, + 0x4A, 0x12, 0x49, 0x03, 0x22, 0x12, 0x71, 0xFB, 0x45, 0xFE, 0x6B, 0x02, + 0x2A, 0xFC, 0xDA, 0x0E, 0xC3, 0x09, 0x01, 0x15, 0xBD, 0x17, 0x94, 0x17, + 0xAD, 0x1C, 0xDE, 0x0C, 0x6F, 0x1C, 0x67, 0x06, 0x07, 0x26, 0x81, 0x0E, + 0xC0, 0x27, 0x2B, 0x1A, 0x80, 0x14, 0x83, 0x20, 0xA5, 0x0A, 0x4F, 0x1F, + 0xC7, 0x15, 0x98, 0x17, 0x7F, 0x23, 0x04, 0x06, 0x6D, 0x28, 0x8C, 0xFA, + 0x47, 0x1D, 0x1A, 0x00, 0xD8, 0x08, 0x80, 0x04, 0xE0, 0x08, 0x85, 0x05, + 0x2D, 0x18, 0x0F, 0x09, 0x63, 0x15, 0xB2, 0xFC, 0xB7, 0x0B, 0xF8, 0xEC, + 0x0D, 0x06, 0xE0, 0x01, 0x22, 0xF9, 0x91, 0x14, 0xD6, 0xED, 0xD8, 0x06, + 0x25, 0xF7, 0x99, 0x07, 0xFE, 0x0C, 0x28, 0x09, 0xC7, 0x0A, 0x3F, 0xFC, + 0x28, 0xFA, 0x8F, 0xF7, 0x49, 0xF1, 0xAB, 0xFC, 0x00, 0xE9, 0xB3, 0xFC, + 0x95, 0xEA, 0x9B, 0xF1, 0x32, 0xEF, 0x10, 0xF1, 0xC1, 0xE3, 0x0A, 0xF6, + 0xC8, 0xD8, 0xC8, 0xFB, 0x3D, 0xE5, 0x4A, 0x08, 0xA0, 0xF2, 0x80, 0x0D, + 0x54, 0xFA, 0xD0, 0xFE, 0xD0, 0x08, 0xDA, 0xEA, 0x9B, 0x06, 0x1C, 0xF0, + 0xBC, 0x00, 0x18, 0xFE, 0x02, 0x08, 0x1E, 0x09, 0x51, 0x02, 0x91, 0x0E, + 0xE7, 0xF6, 0x34, 0xFC, 0xDC, 0xFF, 0xBC, 0xE9, 0x34, 0x0F, 0xF8, 0xE4, + 0x3F, 0x0C, 0xC3, 0xE4, 0xE2, 0x03, 0xCB, 0xE8, 0xA2, 0xFE, 0xD4, 0xF4, + 0x94, 0xFD, 0x45, 0xFF, 0x45, 0x09, 0x66, 0xFF, 0x63, 0x10, 0x5D, 0x00, + 0x2A, 0x0E, 0xC8, 0x02, 0x64, 0x0A, 0x85, 0x10, 0xBC, 0x08, 0xC8, 0x1D, + 0x95, 0x04, 0xDC, 0x14, 0x3D, 0xFD, 0x8B, 0x0E, 0x72, 0x04, 0xFD, 0x09, + 0xCA, 0x12, 0x37, 0x03, 0x94, 0x17, 0xDD, 0x04, 0x15, 0x14, 0xFA, 0x08, + 0x4C, 0x07, 0x13, 0x10, 0x0C, 0xF8, 0xFD, 0x17, 0xBF, 0xF8, 0x64, 0x22, + 0x32, 0x01, 0x46, 0x24, 0x16, 0xFD, 0x0A, 0x1E, 0x7B, 0x00, 0x3D, 0x1E, + 0x35, 0x1A, 0x6E, 0x24, 0x3E, 0x28, 0x58, 0x28, 0x0A, 0x1E, 0xE4, 0x25, + 0xD4, 0x13, 0x1B, 0x2D, 0x10, 0x17, 0xF5, 0x38, 0xF7, 0x1E, 0xED, 0x36, + 0xA3, 0x21, 0x4C, 0x35, 0x27, 0x25, 0x4D, 0x38, 0x7C, 0x2A, 0xC3, 0x33, + 0x05, 0x2E, 0xF7, 0x2E, 0x7B, 0x31, 0xED, 0x2C, 0xDC, 0x30, 0xEA, 0x27, + 0x56, 0x2D, 0x32, 0x2A, 0xB1, 0x37, 0x24, 0x33, 0xB3, 0x49, 0x90, 0x27, + 0x7A, 0x48, 0x37, 0x17, 0x01, 0x33, 0xD6, 0x11, 0xB6, 0x25, 0x2A, 0x0E, + 0xE4, 0x2B, 0x50, 0x0C, 0x6F, 0x22, 0x08, 0x07, 0xB1, 0x0C, 0x28, 0xF6, + 0xA9, 0x0D, 0xBD, 0xED, 0x98, 0x14, 0xCF, 0xF8, 0xDB, 0x04, 0x9B, 0xFA, + 0x23, 0xED, 0xB8, 0xF3, 0x41, 0xE5, 0xB2, 0xF2, 0xE0, 0xE0, 0xBF, 0xEF, + 0xF1, 0xE3, 0x05, 0xE6, 0xCF, 0xEE, 0xFF, 0xE2, 0xFA, 0xE0, 0x16, 0xE3, + 0x05, 0xCB, 0xE0, 0xD3, 0xE7, 0xD3, 0x56, 0xC9, 0x0F, 0xE3, 0x38, 0xCF, + 0x23, 0xD5, 0xA3, 0xCF, 0x73, 0xC4, 0x31, 0xC7, 0xBC, 0xC3, 0xDE, 0xBD, + 0x5B, 0xBA, 0x6B, 0xBD, 0x28, 0xB1, 0x94, 0xC1, 0x2D, 0xAE, 0xF1, 0xBC, + 0xFB, 0xA8, 0x4C, 0xB4, 0xFA, 0xB0, 0xD0, 0xAB, 0x3F, 0xBB, 0xB8, 0xAB, + 0xCB, 0xB3, 0xF9, 0xAE, 0x66, 0xB2, 0x86, 0xB0, 0x3D, 0xCA, 0x44, 0xBB, + 0x6D, 0xD7, 0xBC, 0xBF, 0x9F, 0xC8, 0x1E, 0xBD, 0x86, 0xBC, 0x26, 0xCA, + 0x8E, 0xC2, 0x65, 0xD7, 0xAE, 0xCB, 0x55, 0xD7, 0xBB, 0xD2, 0x11, 0xD9, + 0xA1, 0xD7, 0x1D, 0xD9, 0x35, 0xD3, 0x9C, 0xD1, 0x34, 0xCB, 0x3E, 0xD0, + 0x47, 0xC2, 0x33, 0xD1, 0xD9, 0xB7, 0x70, 0xCE, 0x62, 0xBD, 0xEF, 0xD2, + 0x3D, 0xDA, 0x3D, 0xD8, 0xED, 0xF2, 0xE6, 0xDE, 0x18, 0xEF, 0x8F, 0xE1, + 0x9D, 0xDB, 0x14, 0xE2, 0xED, 0xD1, 0xEE, 0xE4, 0xF0, 0xD8, 0xE1, 0xDB, + 0xF6, 0xE2, 0x34, 0xD8, 0x39, 0xE3, 0x91, 0xE0, 0xB1, 0xDE, 0x99, 0xE4, + 0xDC, 0xE0, 0xB5, 0xEC, 0x32, 0xED, 0x4D, 0xF7, 0xA8, 0xF8, 0x56, 0xF7, + 0x93, 0xF6, 0x5D, 0xF5, 0x3B, 0xFE, 0xC1, 0xF7, 0xB5, 0x0F, 0x7E, 0xFC, + 0x55, 0x10, 0x0B, 0x08, 0x8B, 0x0C, 0xAA, 0x16, 0xB1, 0x18, 0x93, 0x1F, + 0x68, 0x27, 0xDD, 0x1E, 0xD8, 0x29, 0x07, 0x13, 0x37, 0x2D, 0xEE, 0x12, + 0x1C, 0x28, 0xA9, 0x24, 0x4A, 0x1C, 0x06, 0x38, 0x21, 0x1E, 0x3D, 0x43, + 0x1B, 0x2C, 0xB9, 0x3D, 0x9B, 0x39, 0x85, 0x30, 0xAD, 0x39, 0x2E, 0x32, + 0x7D, 0x35, 0x4F, 0x39, 0xB7, 0x36, 0x07, 0x40, 0xE5, 0x34, 0x75, 0x48, + 0x54, 0x3C, 0x74, 0x40, 0xE7, 0x4E, 0x8E, 0x37, 0x9C, 0x4F, 0xE0, 0x3B, + 0xB0, 0x36, 0xB1, 0x33, 0x68, 0x23, 0x61, 0x2C, 0x99, 0x1F, 0xC6, 0x3C, + 0x0D, 0x1B, 0xAC, 0x3F, 0x11, 0x1A, 0x39, 0x30, 0x02, 0x19, 0xB6, 0x2E, + 0x8E, 0x17, 0x83, 0x30, 0x17, 0x1D, 0xC3, 0x2A, 0x66, 0x2A, 0x50, 0x27, + 0xDC, 0x35, 0x10, 0x1A, 0xF8, 0x2C, 0xD7, 0x0E, 0x9D, 0x22, 0xA5, 0x11, + 0x00, 0x26, 0xDE, 0x1C, 0xEC, 0x23, 0x2E, 0x2C, 0xE0, 0x1D, 0x07, 0x24, + 0x7A, 0x18, 0x9C, 0x0D, 0x0A, 0x16, 0x11, 0x08, 0x15, 0x1E, 0x0D, 0x0A, + 0x8C, 0x1D, 0x0B, 0x0A, 0x00, 0x12, 0x8C, 0x0E, 0xB9, 0x13, 0xB4, 0x1B, + 0xC1, 0x1D, 0x2A, 0x20, 0x46, 0x15, 0xA4, 0x0E, 0x15, 0x0B, 0x04, 0xFC, + 0x0A, 0x0D, 0xAF, 0xFB, 0xBD, 0x00, 0x7A, 0xFF, 0x6A, 0xF7, 0xB1, 0xF4, + 0xE0, 0xFD, 0xD3, 0xF0, 0xE7, 0x02, 0x51, 0xF2, 0xD6, 0x01, 0xD1, 0xEF, + 0xB1, 0x04, 0x27, 0xFC, 0x1D, 0x04, 0x4E, 0x01, 0xDE, 0xEB, 0x43, 0xF8, + 0x22, 0xDC, 0xF2, 0xF9, 0xCF, 0xE8, 0xFA, 0xFB, 0xB5, 0xEB, 0x3A, 0xF1, + 0xD4, 0xE2, 0x00, 0xE5, 0x41, 0xE9, 0xC9, 0xE6, 0x50, 0xF6, 0x40, 0xEB, + 0x63, 0xF6, 0x3B, 0xE6, 0xB0, 0xEA, 0x25, 0xE3, 0x97, 0xD9, 0xB8, 0xE2, + 0x59, 0xCB, 0x0D, 0xE4, 0x1A, 0xD0, 0x81, 0xE3, 0x2F, 0xDF, 0x28, 0xE8, + 0x9C, 0xE1, 0x66, 0xEE, 0xAA, 0xDB, 0x07, 0xEC, 0xF4, 0xE1, 0x97, 0xF3, + 0x13, 0xF2, 0xA2, 0xF8, 0x7B, 0xF0, 0x6A, 0xF8, 0xCB, 0xE4, 0x5E, 0x04, + 0xBA, 0xEE, 0xCB, 0x11, 0x9D, 0x04, 0x82, 0x16, 0x66, 0x0F, 0x2F, 0x11, + 0x14, 0x0E, 0x0E, 0x0F, 0xC1, 0x09, 0xEB, 0x10, 0x99, 0x08, 0xC5, 0x11, + 0xEB, 0x0F, 0x45, 0x1A, 0x34, 0x1C, 0xCC, 0x1F, 0x0D, 0x1F, 0xF9, 0x1C, + 0x3C, 0x1E, 0xA9, 0x16, 0x2C, 0x2B, 0xBD, 0x14, 0xA7, 0x33, 0xBE, 0x15, + 0x63, 0x27, 0xF0, 0x13, 0xC1, 0x20, 0x11, 0x10, 0x44, 0x2D, 0x54, 0x08, + 0xB6, 0x32, 0xB7, 0x09, 0x84, 0x27, 0x78, 0x0D, 0xBD, 0x1C, 0xEF, 0x0A, + 0xDB, 0x15, 0x16, 0x09, 0x49, 0x14, 0xE9, 0x04, 0xB2, 0x18, 0x3A, 0x07, + 0x5E, 0x13, 0xAD, 0x0B, 0x56, 0x02, 0xD2, 0x04, 0xD0, 0xF9, 0x27, 0xFD, + 0x63, 0xF9, 0x21, 0xFB, 0x3A, 0xEF, 0xC6, 0xF9, 0xA8, 0xE4, 0xF2, 0xF5, + 0x82, 0xEF, 0xF5, 0xF3, 0x6C, 0xFE, 0xD9, 0xF5, 0x3A, 0xF7, 0x22, 0xF3, + 0x3B, 0xE6, 0xA6, 0xF2, 0xB3, 0xDE, 0x1D, 0xF7, 0x8A, 0xDF, 0x43, 0xF3, + 0xBD, 0xE0, 0x25, 0xE3, 0x7A, 0xDB, 0x2B, 0xD1, 0x47, 0xD0, 0xA4, 0xC8, + 0xCE, 0xCF, 0x8A, 0xCE, 0x85, 0xDB, 0xFC, 0xD5, 0x8A, 0xDF, 0x7E, 0xCC, + 0x9D, 0xD9, 0xA6, 0xC8, 0x51, 0xD8, 0x09, 0xD0, 0x16, 0xD7, 0x7E, 0xD0, + 0x4F, 0xD1, 0x17, 0xD8, 0x38, 0xCF, 0xA7, 0xE5, 0x99, 0xD6, 0x0E, 0xEB, + 0x75, 0xE7, 0x96, 0xED, 0x13, 0xF3, 0xB0, 0xEC, 0x7B, 0xE8, 0x99, 0xE7, + 0x93, 0xCF, 0x02, 0xE7, 0x74, 0xC8, 0x1E, 0xE5, 0x4E, 0xD6, 0x4B, 0xE7, + 0x1C, 0xE1, 0x23, 0xED, 0x81, 0xE4, 0xE6, 0xEA, 0x6C, 0xE5, 0x6A, 0xEF, + 0xC5, 0xE8, 0xD0, 0xF3, 0x00, 0xF2, 0x5A, 0xF0, 0xD9, 0xF5, 0x75, 0xF7, + 0xF1, 0xF4, 0x71, 0xFF, 0x0F, 0xF6, 0x68, 0xFF, 0x21, 0xF8, 0xFF, 0x04, + 0x0A, 0xF8, 0xAC, 0x04, 0x01, 0xF4, 0xF3, 0xFF, 0x75, 0xF4, 0xC3, 0x06, + 0x42, 0x01, 0x3F, 0x04, 0xF5, 0x11, 0xB0, 0xFC, 0x83, 0x15, 0x69, 0x05, + 0x5A, 0x10, 0xE8, 0x0F, 0x24, 0x10, 0x58, 0x1F, 0x6B, 0x14, 0x02, 0x29, + 0xC1, 0x1F, 0x2F, 0x1A, 0xC6, 0x29, 0x80, 0x11, 0x13, 0x2F, 0x1B, 0x1B, + 0xC2, 0x3B, 0xCE, 0x29, 0xC6, 0x3D, 0x53, 0x3B, 0x25, 0x3A, 0xAA, 0x43, + 0xC9, 0x42, 0x2F, 0x3C, 0x59, 0x4E, 0x21, 0x3C, 0x55, 0x4F, 0x8C, 0x3A, + 0x6A, 0x45, 0x13, 0x32, 0x5A, 0x3E, 0x7F, 0x3B, 0x19, 0x41, 0xBA, 0x46, + 0xEF, 0x4E, 0xE3, 0x4A, 0x39, 0x56, 0xA3, 0x51, 0x39, 0x4D, 0x38, 0x4C, + 0xD2, 0x41, 0x60, 0x40, 0x86, 0x3E, 0x84, 0x43, 0x6F, 0x45, 0xC2, 0x45, + 0xD0, 0x43, 0xEF, 0x40, 0x05, 0x35, 0x65, 0x43, 0xBB, 0x29, 0xD4, 0x42, + 0x89, 0x24, 0x0F, 0x40, 0xA7, 0x21, 0xB1, 0x3A, 0xCC, 0x1C, 0x2D, 0x24, + 0x62, 0x1E, 0xC5, 0x11, 0x35, 0x23, 0x82, 0x0D, 0x44, 0x19, 0x34, 0x08, + 0x32, 0x0D, 0x91, 0x0D, 0xDB, 0x0B, 0x72, 0x18, 0xB9, 0x08, 0x21, 0x19, + 0x06, 0x03, 0xCF, 0x10, 0x53, 0x05, 0x10, 0x01, 0x6C, 0x04, 0x39, 0xF2, + 0x0F, 0xFA, 0x20, 0xF6, 0x45, 0xFA, 0x79, 0x00, 0x36, 0xFB, 0x1A, 0xF7, + 0x5D, 0xEC, 0xD6, 0xE7, 0x25, 0xE7, 0x44, 0xE0, 0x3A, 0xEF, 0xDE, 0xD9, + 0xFC, 0xE8, 0xF5, 0xD2, 0x91, 0xD7, 0x6D, 0xD2, 0xD8, 0xD1, 0xEA, 0xD2, + 0x9D, 0xD4, 0x1B, 0xCC, 0xA0, 0xD9, 0xAB, 0xC6, 0x18, 0xDA, 0x3D, 0xC2, + 0x02, 0xD3, 0xA8, 0xB8, 0x9D, 0xCC, 0xFE, 0xB8, 0x3F, 0xCD, 0xA2, 0xC6, + 0x92, 0xD1, 0xE0, 0xCB, 0x03, 0xC8, 0x8B, 0xCA, 0xEF, 0xB4, 0x0C, 0xCC, + 0xA8, 0xAF, 0xFA, 0xC6, 0xDD, 0xBA, 0x94, 0xB3, 0xA3, 0xC0, 0xE3, 0xA3, + 0x92, 0xB7, 0x52, 0xA5, 0x50, 0xB5, 0x6D, 0xAC, 0xB0, 0xB7, 0x0A, 0xBD, + 0x3A, 0xB4, 0xF1, 0xCC, 0xDA, 0xB3, 0x8A, 0xCF, 0x1E, 0xAE, 0xA2, 0xD0, + 0xA6, 0xAA, 0xF9, 0xCE, 0xF1, 0xB8, 0xCE, 0xC9, 0x18, 0xCA, 0x64, 0xC4, + 0x3E, 0xCA, 0xAE, 0xC4, 0xC0, 0xC3, 0xD3, 0xCB, 0x8E, 0xCB, 0xAA, 0xD2, + 0xE5, 0xD1, 0x32, 0xD6, 0x5D, 0xCD, 0x4C, 0xDA, 0xAE, 0xC8, 0xB9, 0xE0, + 0xDE, 0xCE, 0xD8, 0xE1, 0xBB, 0xDC, 0xE4, 0xEB, 0x7B, 0xE1, 0x7E, 0xFB, + 0xD7, 0xE0, 0xE4, 0xF8, 0xA7, 0xE5, 0x4B, 0xF9, 0xD4, 0xF8, 0xDE, 0x00, + 0x31, 0x0D, 0x67, 0xFE, 0x3B, 0x0E, 0x71, 0x02, 0xEC, 0x0B, 0x68, 0x09, + 0xB5, 0x17, 0x0D, 0x08, 0xBD, 0x27, 0x0A, 0x03, 0x71, 0x29, 0xF0, 0xF6, + 0x35, 0x1F, 0xEF, 0xF2, 0xA2, 0x1B, 0xA5, 0xF5, 0xBF, 0x21, 0x64, 0xF0, + 0xCF, 0x27, 0xBA, 0xF6, 0x70, 0x23, 0x9E, 0x06, 0x2C, 0x1D, 0xC2, 0x0E, + 0xF1, 0x20, 0x38, 0x17, 0xF6, 0x22, 0x68, 0x17, 0x04, 0x17, 0x8F, 0x0B, + 0xA6, 0x01, 0x5B, 0x10, 0x7D, 0xFD, 0x70, 0x16, 0xE6, 0x10, 0x0C, 0x0E, + 0xEB, 0x1E, 0xCA, 0x09, 0xFC, 0x19, 0xA2, 0xFF, 0x53, 0x0E, 0x96, 0xFD, + 0x2A, 0x0F, 0xFC, 0x07, 0xC6, 0x12, 0x5E, 0x05, 0x9B, 0x0B, 0x8F, 0x07, + 0x7F, 0xFF, 0x29, 0x10, 0x5E, 0xFA, 0x7C, 0x10, 0xF6, 0xFD, 0xA6, 0x14, + 0xD1, 0xFA, 0xB5, 0x16, 0xE6, 0xF6, 0xE8, 0x0B, 0xAE, 0xFE, 0xE8, 0x05, + 0xFC, 0x0B, 0x2E, 0x02, 0x58, 0x0D, 0x99, 0xF8, 0xE8, 0xFC, 0x34, 0x00, + 0x07, 0xF0, 0xEE, 0x07, 0xE3, 0xF0, 0x93, 0x06, 0x6E, 0xFB, 0xBE, 0x10, + 0x0A, 0x07, 0x1B, 0x11, 0xAF, 0x06, 0x9B, 0x12, 0x00, 0x01, 0xD7, 0x1E, + 0x40, 0x02, 0x94, 0x20, 0xA8, 0x04, 0x3A, 0x1F, 0x7D, 0xFD, 0x20, 0x1E, + 0xFB, 0xF6, 0x91, 0x19, 0x85, 0xFC, 0x1E, 0x18, 0x21, 0x01, 0x05, 0x14, + 0x5A, 0x04, 0xEA, 0x0E, 0xE9, 0x07, 0x0F, 0x13, 0x77, 0x0F, 0xCD, 0x15, + 0xAB, 0x21, 0x02, 0x11, 0xE0, 0x26, 0x17, 0x0D, 0x16, 0x14, 0x43, 0x09, + 0xEA, 0x00, 0x98, 0x0D, 0x5E, 0xFC, 0xE3, 0x20, 0xC1, 0xFE, 0x6D, 0x22, + 0xF4, 0x03, 0x84, 0x12, 0x3B, 0x0D, 0x31, 0x11, 0x93, 0x1A, 0xEA, 0x12, + 0x65, 0x16, 0x95, 0x11, 0x1A, 0x06, 0xF9, 0x19, 0x7E, 0x0A, 0x48, 0x1A, + 0x89, 0x12, 0xBC, 0x0C, 0x07, 0x19, 0x63, 0x05, 0xE6, 0x21, 0x51, 0x05, + 0x4D, 0x23, 0x76, 0x06, 0x06, 0x17, 0x98, 0x05, 0xE1, 0x10, 0x60, 0x05, + 0x1C, 0x1F, 0x47, 0x0A, 0x87, 0x1B, 0xDD, 0x06, 0x0F, 0x0A, 0x26, 0x00, + 0xAB, 0x0A, 0x45, 0x0A, 0x3E, 0x17, 0xB6, 0x12, 0x81, 0x19, 0xD7, 0x0A, + 0x7E, 0x0C, 0xE5, 0x08, 0x65, 0x13, 0x83, 0x09, 0x1B, 0x1E, 0x11, 0x07, + 0x1A, 0x1B, 0x7D, 0x09, 0x16, 0x21, 0x96, 0x07, 0x1E, 0x2B, 0xE1, 0x06, + 0x0E, 0x26, 0x72, 0x03, 0x37, 0x1B, 0xAB, 0x02, 0xDD, 0x1D, 0x39, 0x10, + 0xAD, 0x09, 0x25, 0x18, 0xF2, 0xF5, 0x9A, 0x21, 0xBE, 0x05, 0xA2, 0x28, + 0x0F, 0x12, 0xD9, 0x16, 0xA3, 0x0E, 0xCC, 0xFD, 0xDB, 0x08, 0x83, 0xF9, + 0xA3, 0x01, 0x96, 0x00, 0x4D, 0xF7, 0x90, 0x07, 0x89, 0xF3, 0xBC, 0x0E, + 0x23, 0xFD, 0x67, 0x09, 0x8C, 0x01, 0x56, 0xFB, 0xA0, 0x00, 0xE2, 0xF5, + 0x3A, 0x00, 0x6A, 0xF5, 0xB5, 0xF2, 0x93, 0xF0, 0x64, 0xE3, 0xFB, 0xF2, + 0x40, 0xE5, 0x75, 0xFA, 0x9F, 0xF7, 0x0E, 0xF7, 0xA0, 0xFF, 0xD8, 0xEF, + 0x3D, 0xF8, 0x41, 0xEE, 0xBD, 0xF4, 0x2F, 0xEB, 0xD0, 0xF0, 0xDA, 0xE9, + 0x54, 0xE6, 0xE0, 0xE8, 0x4A, 0xE1, 0x52, 0xE4, 0xE8, 0xE4, 0x06, 0xE1, + 0xB7, 0xE6, 0x8C, 0xD7, 0xF7, 0xEE, 0x5B, 0xD2, 0xC7, 0xF3, 0x45, 0xD4, + 0x66, 0xE0, 0x08, 0xD5, 0xBB, 0xC3, 0x2C, 0xDE, 0x44, 0xC2, 0x85, 0xEB, + 0xFE, 0xCF, 0x37, 0xEA, 0xA8, 0xD0, 0xDF, 0xE7, 0x88, 0xD2, 0xC6, 0xEA, + 0xFD, 0xDC, 0x83, 0xE4, 0x8F, 0xE6, 0xF5, 0xDE, 0xB8, 0xE3, 0x2A, 0xDD, + 0xA3, 0xDC, 0x6C, 0xDE, 0xEE, 0xD9, 0xC9, 0xE8, 0x47, 0xDB, 0x87, 0xF4, + 0xE9, 0xE1, 0x8B, 0xF4, 0xCD, 0xDE, 0x47, 0xEC, 0x72, 0xD4, 0x63, 0xE0, + 0x54, 0xD9, 0x78, 0xDC, 0xCC, 0xE5, 0xAD, 0xE2, 0x02, 0xE7, 0x46, 0xE3, + 0x4D, 0xDE, 0xFB, 0xE8, 0x9D, 0xE9, 0xC5, 0xF3, 0x21, 0xFD, 0xB2, 0xEE, + 0xDD, 0xF1, 0xF4, 0xEB, 0x6E, 0xE4, 0xD8, 0xF1, 0xE5, 0xDC, 0x7D, 0xF3, + 0xCC, 0xE1, 0xBF, 0xF7, 0x47, 0xF9, 0xEF, 0xFD, 0xBB, 0x03, 0xE0, 0x04, + 0x0C, 0x03, 0x93, 0x0C, 0x24, 0x02, 0x66, 0x0D, 0x3C, 0x10, 0x02, 0x10, + 0xB7, 0x1C, 0x2D, 0x14, 0x0E, 0x12, 0x0B, 0x11, 0x22, 0x13, 0x2A, 0x17, + 0xF4, 0x21, 0xE3, 0x18, 0x44, 0x2A, 0x10, 0x08, 0x8A, 0x23, 0x66, 0x02, + 0xC6, 0x15, 0x89, 0x06, 0xAB, 0x1E, 0x71, 0x0B, 0x82, 0x29, 0xF9, 0x12, + 0x22, 0x2D, 0x34, 0x14, 0x9E, 0x2C, 0xCF, 0x1C, 0xA3, 0x28, 0xDA, 0x29, + 0xB2, 0x2B, 0x47, 0x28, 0xD6, 0x2B, 0x18, 0x29, 0xA7, 0x21, 0x56, 0x2A, + 0xA1, 0x19, 0x6A, 0x1D, 0xD5, 0x26, 0x86, 0x1B, 0x52, 0x32, 0x4A, 0x25, + 0x78, 0x25, 0xD1, 0x21, 0x5C, 0x1B, 0x24, 0x1C, 0x45, 0x2D, 0x1A, 0x23, + 0x80, 0x38, 0x61, 0x22, 0xD3, 0x29, 0x0D, 0x1B, 0x26, 0x1B, 0x8B, 0x20, + 0xA4, 0x13, 0x77, 0x25, 0xAD, 0x14, 0x57, 0x1F, 0x4B, 0x24, 0xB8, 0x1C, + 0x3D, 0x28, 0x0E, 0x1D, 0x26, 0x18, 0xD7, 0x1C, 0x14, 0x0E, 0x32, 0x15, + 0x91, 0x12, 0x1F, 0x0E, 0x36, 0x13, 0x91, 0x15, 0xCC, 0x07, 0xC8, 0x16, + 0xA2, 0x08, 0xA9, 0x1D, 0xF8, 0x16, 0x3B, 0x2B, 0xDD, 0x1D, 0x5D, 0x27, + 0x22, 0x18, 0xBF, 0x21, 0x6D, 0x10, 0x7B, 0x24, 0x28, 0x0F, 0xF7, 0x20, + 0x93, 0x14, 0xF9, 0x1B, 0x54, 0x10, 0xBF, 0x1A, 0x3E, 0xFE, 0xA4, 0x14, + 0xEB, 0xF7, 0x61, 0x15, 0x55, 0xFA, 0xE8, 0x1C, 0xDB, 0xFA, 0xF9, 0x15, + 0x3E, 0xFF, 0x4F, 0xFF, 0x0C, 0x0A, 0x13, 0xF2, 0xEE, 0x05, 0xDD, 0xF3, + 0x9D, 0xF8, 0x24, 0x00, 0x3D, 0xF2, 0xB6, 0x07, 0x37, 0xEF, 0x6B, 0x04, + 0x2C, 0xFC, 0x7C, 0x02, 0x9C, 0x0E, 0xF3, 0xFE, 0x6B, 0x0F, 0xBE, 0xF9, + 0xF7, 0xF9, 0xE2, 0xF3, 0x13, 0xEF, 0x2C, 0xF7, 0xA4, 0xF9, 0x7E, 0x02, + 0xDB, 0xF6, 0xE7, 0xFA, 0x7F, 0xF4, 0x01, 0xEE, 0xA3, 0xF6, 0x60, 0xEA, + 0x66, 0xED, 0x48, 0xE4, 0x98, 0xE2, 0xF3, 0xE3, 0x9F, 0xDC, 0xC2, 0xDF, + 0x76, 0xE1, 0xA9, 0xD5, 0xF0, 0xE5, 0xAF, 0xD5, 0xF1, 0xF3, 0xDF, 0xDD, + 0x3E, 0xFD, 0x6C, 0xDE, 0xF0, 0xEC, 0xF9, 0xD4, 0x33, 0xE6, 0xA2, 0xD2, + 0xC8, 0xEB, 0x28, 0xDA, 0x91, 0xED, 0x21, 0xE1, 0x56, 0xDF, 0x78, 0xDC, + 0xD3, 0xD5, 0xAB, 0xDD, 0xB9, 0xE3, 0xCD, 0xE2, 0xF8, 0xEF, 0x3B, 0xD9, + 0xB4, 0xF7, 0x4E, 0xCD, 0x6D, 0xF2, 0x97, 0xC3, 0x02, 0xE0, 0x21, 0xC8, + 0x22, 0xD1, 0x0A, 0xDE, 0xCD, 0xD1, 0x61, 0xED, 0xC7, 0xDB, 0x18, 0xF0, + 0x83, 0xDB, 0x25, 0xE9, 0x1E, 0xE4, 0x8E, 0xDC, 0xDA, 0xF2, 0x31, 0xD5, + 0xC9, 0xEA, 0x07, 0xD0, 0xAE, 0xDD, 0x84, 0xD8, 0x5D, 0xD9, 0x3F, 0xE9, + 0x29, 0xDA, 0x32, 0xEE, 0x79, 0xE3, 0xC6, 0xED, 0x00, 0xE6, 0xB2, 0xEC, + 0x73, 0xE1, 0x5E, 0xEC, 0x65, 0xD9, 0x40, 0xEB, 0xF3, 0xDA, 0xC0, 0xE5, + 0x99, 0xE9, 0xBB, 0xE0, 0x28, 0xF7, 0x3A, 0xEE, 0xDA, 0xF7, 0x4C, 0xF7, + 0x37, 0x01, 0xB1, 0xF4, 0xF2, 0x0F, 0x3E, 0xF6, 0xCA, 0x00, 0x6E, 0xED, + 0x4D, 0xEA, 0xE0, 0xE9, 0x47, 0xE4, 0xC2, 0xEF, 0xB4, 0xE5, 0xAC, 0xEB, + 0x2B, 0xE6, 0x1C, 0xE6, 0xAF, 0xEE, 0xB2, 0xE0, 0x55, 0xF8, 0xE5, 0xDF, + 0x84, 0x03, 0x8F, 0xEE, 0x31, 0x03, 0x06, 0xF3, 0x8E, 0xF2, 0x0E, 0xF5, + 0xE2, 0xE5, 0xF3, 0x03, 0x08, 0xEB, 0x77, 0x07, 0xEF, 0x01, 0x6D, 0x02, + 0xA9, 0x0C, 0x7C, 0x04, 0xF9, 0x02, 0xDD, 0xFB, 0x20, 0xFF, 0x2D, 0xEE, + 0xBB, 0x0A, 0x71, 0xF7, 0x24, 0x05, 0x0B, 0xFE, 0x7D, 0xF0, 0x7F, 0x05, + 0x9A, 0xE4, 0xB4, 0x14, 0xCD, 0xEE, 0xEE, 0x1A, 0x3C, 0xFB, 0xDC, 0x1A, + 0xB0, 0xF6, 0x4D, 0x13, 0x17, 0xEC, 0xBA, 0x0E, 0xF5, 0xF2, 0x80, 0x18, + 0x0F, 0x03, 0x70, 0x18, 0xAB, 0x10, 0x9A, 0x15, 0x15, 0x1A, 0x62, 0x22, + 0x2F, 0x0E, 0x5E, 0x1E, 0x57, 0x05, 0x4E, 0x16, 0xD6, 0x09, 0xB9, 0x17, + 0xD8, 0x08, 0xDB, 0x16, 0xD8, 0xFD, 0x44, 0x20, 0xC9, 0x00, 0x25, 0x2A, + 0x63, 0x15, 0xE8, 0x27, 0x4D, 0x1D, 0xF9, 0x24, 0x29, 0x14, 0xDC, 0x24, + 0x98, 0x1A, 0x63, 0x25, 0x43, 0x2B, 0xDA, 0x24, 0x64, 0x31, 0x65, 0x22, + 0x32, 0x38, 0xE5, 0x1E, 0x91, 0x3B, 0x02, 0x1F, 0xA5, 0x3B, 0xEE, 0x17, + 0x6A, 0x3A, 0xB2, 0x07, 0x7F, 0x3C, 0x9F, 0x05, 0x02, 0x3D, 0x3D, 0x03, + 0x66, 0x39, 0xE9, 0x03, 0x12, 0x3A, 0x40, 0x0F, 0x3D, 0x38, 0xB9, 0x1A, + 0x9B, 0x29, 0xE5, 0x22, 0x85, 0x23, 0x87, 0x29, 0xE4, 0x28, 0x8B, 0x28, + 0x8F, 0x2A, 0x00, 0x1B, 0x76, 0x26, 0x6E, 0x16, 0x6B, 0x15, 0x27, 0x1A, + 0xFD, 0x0D, 0xFF, 0x1C, 0xC4, 0x13, 0x73, 0x19, 0x8E, 0x1E, 0x4C, 0x0D, + 0x04, 0x20, 0xB3, 0x09, 0x2C, 0x15, 0xF9, 0x09, 0x80, 0x0D, 0x10, 0x0B, + 0xB7, 0x07, 0x32, 0x12, 0x11, 0xFC, 0xEE, 0x0F, 0xAC, 0xF3, 0xB4, 0x0E, + 0x83, 0xFE, 0x73, 0x11, 0xEB, 0x02, 0x4C, 0x04, 0xDE, 0x01, 0x9F, 0xFD, + 0xFF, 0xFE, 0xC7, 0xFE, 0x74, 0xEF, 0x35, 0xEE, 0xDD, 0xF1, 0xD8, 0xF0, + 0xDB, 0xF6, 0x31, 0xF4, 0x22, 0x00, 0xCF, 0xED, 0x8A, 0x0B, 0xDC, 0xF7, + 0x19, 0xFD, 0x2B, 0xFC, 0xB3, 0xFE, 0x50, 0x07, 0x99, 0x04, 0xF2, 0x05, + 0x71, 0xFB, 0xAE, 0xF9, 0x51, 0xF7, 0xFB, 0xFA, 0x9A, 0xED, 0xC3, 0xFB, + 0xF1, 0xDF, 0x0A, 0x00, 0x31, 0xD3, 0x31, 0x09, 0xC0, 0xD8, 0x64, 0x08, + 0xD5, 0xF2, 0xC6, 0x01, 0x3F, 0xFE, 0xDB, 0xF6, 0x73, 0xFF, 0x1D, 0xEF, + 0x5B, 0x04, 0xE7, 0xF7, 0x62, 0xF7, 0xA5, 0xFC, 0x94, 0xF0, 0x4A, 0xFD, + 0x34, 0xFD, 0xA2, 0xF8, 0xC9, 0xF3, 0x68, 0xE6, 0xD7, 0xE7, 0xC7, 0xE5, + 0xC8, 0xE5, 0xFF, 0xF2, 0x44, 0xE7, 0xF1, 0xF7, 0x33, 0xE1, 0x4E, 0xF4, + 0xDF, 0xDA, 0x06, 0xEE, 0x4F, 0xE6, 0xC4, 0xEC, 0xAD, 0xEC, 0xA1, 0xE6, + 0xFB, 0xF0, 0x47, 0xE4, 0x6A, 0xEC, 0x40, 0xE0, 0x7A, 0xE8, 0xED, 0xDF, + 0xA2, 0xEF, 0x6C, 0xEA, 0xB5, 0xF3, 0x9E, 0xE7, 0x7D, 0xED, 0xBC, 0xDC, + 0x2F, 0xE7, 0xB5, 0xE0, 0x5E, 0xE7, 0x24, 0xE8, 0xF4, 0xEC, 0x99, 0xDF, + 0x3B, 0xFC, 0xAD, 0xDB, 0xA3, 0xF1, 0x51, 0xDE, 0x5A, 0xDA, 0xE6, 0xE3, + 0x47, 0xD5, 0xEB, 0xF1, 0x6C, 0xD7, 0xF5, 0xF9, 0xE7, 0xE4, 0x9F, 0xF3, + 0x0B, 0xEB, 0x20, 0xDE, 0x75, 0xF8, 0x9D, 0xD7, 0xB6, 0x03, 0x58, 0xDC, + 0xD7, 0xF3, 0xE4, 0xDC, 0xDC, 0xE9, 0x50, 0xEB, 0xB1, 0xE0, 0x49, 0xF2, + 0xAE, 0xE2, 0xBD, 0xF1, 0x8C, 0xEE, 0xC8, 0xEC, 0x74, 0xEE, 0x9A, 0xE9, + 0x40, 0xE7, 0x62, 0xF2, 0x5C, 0xE1, 0xA0, 0xE8, 0x81, 0xEE, 0x95, 0xE6, + 0xA8, 0xF3, 0x5D, 0xF5, 0xE0, 0xEF, 0xD1, 0xF9, 0x58, 0xEF, 0xD3, 0xF8, + 0x55, 0xF7, 0x10, 0xFE, 0x6E, 0x03, 0x45, 0xF9, 0x10, 0xFC, 0x5A, 0xF3, + 0x46, 0xF5, 0x02, 0x00, 0x9B, 0xF6, 0xA7, 0xFE, 0x0B, 0xFD, 0x7D, 0xFB, + 0xCA, 0x01, 0x00, 0x01, 0x79, 0xFC, 0x7D, 0xF9, 0x86, 0x05, 0x28, 0x00, + 0xBA, 0x18, 0x24, 0x16, 0x32, 0x10, 0x69, 0x14, 0x74, 0xFD, 0xC5, 0x13, + 0xC4, 0xFD, 0x7F, 0x19, 0xDD, 0x04, 0x3A, 0x0F, 0x6D, 0x1A, 0xB3, 0x0E, + 0xC1, 0x25, 0x71, 0x07, 0x52, 0x20, 0x99, 0x04, 0xBF, 0x1C, 0x6B, 0x0E, + 0xD5, 0x16, 0x44, 0x09, 0x23, 0x1C, 0x55, 0x1C, 0x22, 0x0B, 0x91, 0x24, + 0x7A, 0x02, 0x60, 0x14, 0xC0, 0x1D, 0x5A, 0x17, 0xDD, 0x2D, 0xE7, 0x19, + 0x16, 0x2C, 0x9B, 0x10, 0x3B, 0x1E, 0xEA, 0x15, 0x1D, 0x1D, 0xCE, 0x29, + 0x3D, 0x1F, 0x68, 0x24, 0x2D, 0x20, 0x84, 0x26, 0xC7, 0x23, 0x60, 0x37, + 0x14, 0x1A, 0x60, 0x34, 0xC1, 0x15, 0x12, 0x2C, 0x99, 0x20, 0x0A, 0x2C, + 0x51, 0x1B, 0x60, 0x27, 0x4D, 0x14, 0x5B, 0x26, 0x55, 0x19, 0x19, 0x22, + 0x10, 0x26, 0x01, 0x24, 0x78, 0x2F, 0xB7, 0x2F, 0x72, 0x21, 0x90, 0x26, + 0x55, 0x17, 0xD6, 0x25, 0xE7, 0x18, 0xD3, 0x2E, 0xDB, 0x1A, 0x03, 0x2C, + 0x09, 0x0B, 0x3C, 0x22, 0xFE, 0x02, 0x7D, 0x24, 0x55, 0x0E, 0x05, 0x26, + 0x6F, 0x03, 0x81, 0x15, 0x29, 0x0D, 0x2C, 0x25, 0x1C, 0x13, 0x45, 0x27, + 0xE0, 0x12, 0x71, 0x19, 0x2C, 0x19, 0xC9, 0x12, 0xC4, 0x18, 0x91, 0x08, + 0xC1, 0x10, 0xEE, 0x02, 0xBE, 0x01, 0x28, 0xF4, 0xE5, 0x0D, 0x11, 0xEE, + 0x68, 0x25, 0x6C, 0xEB, 0xF8, 0x23, 0xE2, 0xE6, 0x98, 0x09, 0x81, 0xEB, + 0xED, 0x03, 0x65, 0xF9, 0xBB, 0x0F, 0x1E, 0x00, 0x65, 0x04, 0x08, 0xF5, + 0x61, 0xF5, 0x37, 0xEB, 0x4F, 0xF9, 0xB7, 0xE9, 0x4E, 0xF0, 0x5E, 0xE7, + 0xBF, 0xE1, 0xA4, 0xE0, 0xF7, 0xEB, 0x3D, 0xE4, 0x96, 0xE4, 0x9F, 0xE0, + 0xB3, 0xE0, 0x5B, 0xDC, 0x16, 0xF2, 0x27, 0xE1, 0x0A, 0xF4, 0x85, 0xDE, + 0x5E, 0xDB, 0x6C, 0xD3, 0xAD, 0xC8, 0x2E, 0xD3, 0xAA, 0xE4, 0x15, 0xEE, + 0x23, 0xE3, 0xC1, 0xE1, 0xEB, 0xD1, 0x70, 0xCC, 0x81, 0xE3, 0xEE, 0xDB, + 0x36, 0xE0, 0xE9, 0xD8, 0xF1, 0xD8, 0x0D, 0xD3, 0xB5, 0xD0, 0x2B, 0xCA, + 0x14, 0xD3, 0x6B, 0xBF, 0xCB, 0xD1, 0x90, 0xB9, 0x32, 0xCC, 0x7D, 0xC1, + 0x8D, 0xDC, 0x6F, 0xDB, 0xA7, 0xCF, 0xC5, 0xDD, 0x67, 0xC8, 0xA1, 0xDD, + 0x15, 0xE4, 0xB4, 0xEA, 0x2A, 0xF0, 0x7D, 0xE5, 0x3C, 0xDC, 0x1E, 0xDD, + 0x15, 0xC3, 0xB3, 0xEB, 0xF0, 0xC0, 0x26, 0xFC, 0x38, 0xCD, 0xC7, 0xF6, + 0x77, 0xDA, 0x08, 0xE9, 0xA0, 0xE1, 0xA7, 0xE2, 0x3A, 0xEA, 0x75, 0xE6, + 0x8A, 0xE9, 0x04, 0xE4, 0xD6, 0xE7, 0x92, 0xEC, 0x72, 0xEA, 0xDC, 0xF1, + 0xC9, 0xE3, 0x8B, 0xE9, 0xF9, 0xE1, 0x51, 0xEC, 0x1E, 0xF1, 0x80, 0xEC, + 0x4C, 0xF6, 0xBA, 0xE9, 0x39, 0xDF, 0x2C, 0xE7, 0x69, 0xDC, 0xC7, 0xED, + 0x4D, 0xF2, 0x46, 0xFF, 0xAE, 0xEE, 0x2B, 0xF9, 0xEF, 0xD9, 0x12, 0xE7, + 0x4E, 0xE0, 0x53, 0xF0, 0x19, 0xF5, 0xD0, 0xF0, 0xE6, 0xFD, 0x21, 0xDF, + 0x10, 0x00, 0x35, 0xE1, 0x3C, 0xF8, 0x38, 0xE8, 0xE7, 0xE8, 0x69, 0xE1, + 0x8A, 0xF0, 0x6F, 0xEF, 0xC4, 0x08, 0x65, 0xFD, 0x2F, 0x08, 0x04, 0xEB, + 0x1B, 0x0A, 0x04, 0xEE, 0xD6, 0x13, 0x3B, 0xEC, 0x52, 0x04, 0xDB, 0xDF, + 0xC0, 0xF5, 0x3B, 0x00, 0xB6, 0xE6, 0x7A, 0x0F, 0x25, 0xE9, 0x2E, 0x0A, + 0xC1, 0x0D, 0x06, 0x0C, 0x0D, 0x18, 0x12, 0xF3, 0xAA, 0x0C, 0xFD, 0xEB, + 0x7E, 0x07, 0x7D, 0xF8, 0x5B, 0x02, 0x98, 0xF7, 0x72, 0x11, 0x4D, 0x10, + 0x9D, 0x14, 0x39, 0x1D, 0x4F, 0x0D, 0x6E, 0x1D, 0x9B, 0x10, 0xBD, 0x25, + 0xFA, 0x1A, 0x2F, 0x22, 0xF5, 0x21, 0x22, 0x1D, 0x80, 0x0E, 0x97, 0x17, + 0x41, 0x08, 0xE4, 0x17, 0x54, 0x15, 0x3F, 0x1B, 0x58, 0x1A, 0x3F, 0x28, + 0x77, 0x1F, 0x70, 0x2D, 0xE1, 0x0F, 0xF9, 0x23, 0xE1, 0x0B, 0x7A, 0x2C, + 0xFF, 0x14, 0xD5, 0x26, 0xF6, 0x0F, 0x5F, 0x28, 0xC9, 0x0F, 0x29, 0x31, + 0x98, 0x13, 0xE6, 0x23, 0xAC, 0x29, 0x8B, 0x2E, 0x6D, 0x43, 0x61, 0x3D, + 0x32, 0x34, 0xAD, 0x2F, 0x83, 0x22, 0x76, 0x2F, 0xFA, 0x2F, 0x2C, 0x3B, + 0x9E, 0x28, 0x57, 0x2B, 0xFF, 0x25, 0xA8, 0x2C, 0x9F, 0x2C, 0x02, 0x33, + 0x99, 0x29, 0xA1, 0x1E, 0xFF, 0x3C, 0xB2, 0x14, 0x71, 0x42, 0x92, 0x06, + 0x23, 0x31, 0xF9, 0x05, 0xE3, 0x1A, 0xDB, 0x14, 0x14, 0x1C, 0x26, 0x20, + 0xD2, 0x20, 0x54, 0x29, 0x80, 0x14, 0xAB, 0x2E, 0xDF, 0x11, 0xAA, 0x27, + 0x15, 0x0B, 0xA5, 0x19, 0x7E, 0x18, 0x77, 0x17, 0x45, 0x1E, 0x1F, 0x07, + 0x9A, 0x10, 0x49, 0x09, 0x85, 0x0C, 0xE8, 0x0F, 0xA7, 0x14, 0x68, 0x0E, + 0xFC, 0x15, 0x2A, 0x09, 0xA9, 0x09, 0x9D, 0xFF, 0x6F, 0xF6, 0xA7, 0xFE, + 0x14, 0xF6, 0xBE, 0xFD, 0x3B, 0x10, 0x21, 0x08, 0x35, 0x01, 0x96, 0xFD, + 0xCD, 0xFB, 0xF7, 0x03, 0x60, 0x03, 0xA5, 0x05, 0x93, 0xF7, 0xBE, 0xF1, + 0x29, 0x02, 0xEF, 0xFF, 0x83, 0xF9, 0x9B, 0xFE, 0xA6, 0xE8, 0xD4, 0xF9, + 0xF0, 0xE3, 0xE2, 0xF8, 0x5F, 0xF6, 0x23, 0xFA, 0xBD, 0xF2, 0x11, 0xF8, + 0xAD, 0xD7, 0x8A, 0xF6, 0x47, 0xDD, 0x32, 0xF9, 0xEF, 0xF0, 0x9C, 0xF6, + 0x0D, 0xFD, 0x1E, 0xF4, 0x13, 0xF9, 0x61, 0xF5, 0x4B, 0xF8, 0xEF, 0x03, + 0x93, 0xF3, 0xDF, 0xFD, 0xB9, 0xF5, 0x63, 0xFA, 0x0F, 0x01, 0xB6, 0xFA, + 0xBE, 0x03, 0x3F, 0xEA, 0x69, 0xF7, 0xCB, 0xD6, 0xF3, 0x02, 0x92, 0xDF, + 0xD6, 0x12, 0xAB, 0xE7, 0x52, 0xF6, 0x79, 0xD0, 0x2D, 0xF4, 0xDC, 0xDD, + 0x4C, 0x07, 0x9E, 0xED, 0xF4, 0x05, 0x96, 0xE6, 0x04, 0xF2, 0x22, 0xE8, + 0x83, 0xE3, 0xB7, 0xE8, 0xA9, 0xE8, 0xA5, 0xF2, 0x7D, 0xEA, 0x75, 0xF8, + 0x84, 0xF5, 0xB4, 0xF8, 0xED, 0xFA, 0x6C, 0xEF, 0xAE, 0xEB, 0xA0, 0xDD, + 0xC8, 0xF3, 0x4B, 0xEF, 0xC2, 0xF7, 0x59, 0xFC, 0xD1, 0xF5, 0xD5, 0xFA, + 0x6F, 0xF0, 0x8A, 0xF0, 0x67, 0xED, 0xF3, 0xF0, 0xA2, 0xFC, 0x20, 0x02, + 0x3F, 0xE8, 0x31, 0xF5, 0xCD, 0xD3, 0x6A, 0xF9, 0xD4, 0xE2, 0x72, 0xFD, + 0x11, 0xED, 0x78, 0xED, 0x5B, 0xE9, 0x51, 0xED, 0xCF, 0xE2, 0xDF, 0xEA, + 0xBC, 0xDA, 0x64, 0xEF, 0x0E, 0xE0, 0x54, 0xFF, 0x78, 0xED, 0x53, 0xFB, + 0x69, 0xFF, 0xA3, 0xF3, 0xB8, 0x04, 0x38, 0xF2, 0x76, 0xFE, 0x0F, 0xF6, + 0x90, 0x00, 0x13, 0x03, 0x54, 0xFA, 0xFE, 0x06, 0x09, 0xF2, 0xFF, 0xFE, + 0x11, 0xEC, 0x06, 0xF4, 0xAD, 0xFA, 0x9D, 0xF5, 0xFB, 0xF4, 0x69, 0xE6, + 0x3D, 0xEC, 0xDE, 0xF6, 0x93, 0xE5, 0xF6, 0xFE, 0x0D, 0xE7, 0x7C, 0xF9, + 0x59, 0x00, 0xBA, 0x11, 0x2E, 0xFB, 0x52, 0xF8, 0xB5, 0xFF, 0x84, 0xF4, + 0xA6, 0xFB, 0x78, 0xFE, 0x50, 0xFB, 0xE6, 0xFB, 0x93, 0x0A, 0xD1, 0x05, + 0x1D, 0x00, 0x15, 0x04, 0xDA, 0xFD, 0x8C, 0x0A, 0x40, 0xF8, 0xF3, 0x05, + 0xD8, 0xF7, 0x62, 0x04, 0x77, 0x01, 0xDD, 0x0B, 0xD4, 0xF7, 0xDE, 0x03, + 0x68, 0x04, 0x71, 0x06, 0x3E, 0x0D, 0x07, 0xFF, 0x26, 0x0D, 0xA3, 0x09, + 0xB1, 0x06, 0xF8, 0x0E, 0x87, 0xF9, 0x15, 0x01, 0x59, 0x0D, 0x2C, 0x09, + 0x10, 0x1C, 0xCF, 0xF7, 0x95, 0x23, 0xB9, 0xF1, 0x5C, 0x1A, 0xB4, 0xFB, + 0xC6, 0x0B, 0x3B, 0x04, 0x45, 0x11, 0xE9, 0x12, 0x42, 0x12, 0x4A, 0x16, + 0xB7, 0x11, 0x87, 0x12, 0x4E, 0x0D, 0xAC, 0x04, 0xCC, 0x1B, 0x64, 0x06, + 0x0B, 0x2B, 0xB0, 0x06, 0xE3, 0x26, 0x22, 0x08, 0x44, 0x23, 0x9B, 0x14, + 0xAD, 0x24, 0x4B, 0x1B, 0x97, 0x2C, 0xA9, 0x24, 0x05, 0x29, 0xF8, 0x20, + 0x83, 0x25, 0x7F, 0x21, 0x40, 0x20, 0xFF, 0x24, 0x92, 0x1B, 0x82, 0x24, + 0x34, 0x27, 0x64, 0x36, 0x71, 0x1C, 0x96, 0x32, 0xBB, 0x0A, 0xF0, 0x22, + 0x31, 0x0F, 0x3D, 0x24, 0x57, 0x1F, 0x9F, 0x2B, 0x75, 0x1D, 0x27, 0x2B, + 0x58, 0x0E, 0x59, 0x2B, 0xF4, 0x0E, 0x89, 0x37, 0x9F, 0x0E, 0xF6, 0x2C, + 0x5D, 0x18, 0x7B, 0x25, 0xCB, 0x1F, 0x11, 0x2B, 0x6B, 0x1B, 0xEB, 0x24, + 0x6B, 0x26, 0x3E, 0x20, 0x5E, 0x31, 0x47, 0x1D, 0xD0, 0x2D, 0xDD, 0x20, + 0xCB, 0x15, 0xEB, 0x1C, 0xEB, 0x08, 0x38, 0x1E, 0xC3, 0x12, 0xA4, 0x23, + 0x87, 0x17, 0x06, 0x0E, 0x88, 0x1C, 0x98, 0x03, 0xCB, 0x16, 0x0E, 0xFC, + 0xBE, 0x11, 0x61, 0xF3, 0x57, 0x12, 0x94, 0xF5, 0x98, 0x07, 0x43, 0xF8, + 0x73, 0xFC, 0xEB, 0x0B, 0xD9, 0xF5, 0x02, 0x11, 0xB0, 0xFE, 0x25, 0x0C, + 0x36, 0x00, 0xB3, 0xFC, 0x04, 0xF7, 0x6D, 0xEC, 0xAE, 0xF7, 0xC4, 0xED, + 0x4A, 0xF0, 0x45, 0xE5, 0x1B, 0xF4, 0xAE, 0xEA, 0xC7, 0xF2, 0x90, 0xE8, + 0xA2, 0xE5, 0xE7, 0xE1, 0xFE, 0xE3, 0x7E, 0xE0, 0xE0, 0xE8, 0xA1, 0xD9, + 0xDF, 0xE0, 0x91, 0xD9, 0x4D, 0xCF, 0xF3, 0xD8, 0xA9, 0xCE, 0x08, 0xD8, + 0x4B, 0xDB, 0xB3, 0xD6, 0x28, 0xE1, 0xCB, 0xD4, 0x21, 0xD7, 0xD7, 0xD7, + 0xDD, 0xCB, 0xAE, 0xD9, 0x05, 0xCE, 0xD5, 0xD8, 0x33, 0xD4, 0x98, 0xD0, + 0x21, 0xD6, 0x0D, 0xC7, 0xCB, 0xD2, 0x25, 0xCD, 0x69, 0xBE, 0x29, 0xCC, + 0x4D, 0xC1, 0x80, 0xD2, 0x28, 0xCB, 0xCB, 0xCD, 0x43, 0xC6, 0x3D, 0xC9, + 0xA1, 0xC0, 0x37, 0xCC, 0x9D, 0xC5, 0xD7, 0xCD, 0x97, 0xD2, 0x50, 0xDD, + 0x12, 0xD0, 0x6C, 0xE0, 0x2D, 0xD5, 0x69, 0xE6, 0x4C, 0xE3, 0x59, 0xEA, + 0x3F, 0xDF, 0x41, 0xDB, 0x78, 0xD8, 0x98, 0xCD, 0xA6, 0xDC, 0x51, 0xC6, + 0xA5, 0xD9, 0x1A, 0xC1, 0x1F, 0xE2, 0xE3, 0xCA, 0xB7, 0xF4, 0x82, 0xD4, + 0x55, 0xF6, 0x36, 0xCF, 0x58, 0xF0, 0x22, 0xD1, 0x9F, 0xED, 0xEB, 0xDB, + 0x2B, 0xE7, 0x2A, 0xDF, 0x98, 0xE0, 0x30, 0xE4, 0x9B, 0xE5, 0x25, 0xEA, + 0x9C, 0xF1, 0x78, 0xE2, 0xEE, 0xFE, 0xFE, 0xE0, 0xB7, 0xFE, 0x2D, 0xE7, + 0x57, 0xEC, 0xA8, 0xEC, 0xCE, 0xE1, 0x89, 0xF0, 0x66, 0xE6, 0x63, 0xF1, + 0x47, 0xF8, 0x58, 0xF6, 0x1D, 0xFE, 0xBA, 0xED, 0x89, 0xF4, 0x72, 0xF0, + 0xE1, 0xEB, 0xAC, 0x04, 0x80, 0xEE, 0x71, 0x0C, 0x82, 0xF6, 0xC2, 0x03, + 0x20, 0xFB, 0x29, 0xFD, 0x73, 0xFF, 0x33, 0x00, 0xAA, 0xF6, 0x24, 0x00, + 0x48, 0xF7, 0x33, 0x10, 0x46, 0x00, 0x88, 0x1E, 0xB8, 0x01, 0x10, 0x17, + 0xAC, 0x11, 0x93, 0x15, 0x9A, 0x20, 0x00, 0x15, 0xB8, 0x1F, 0x4A, 0x11, + 0xEB, 0x1B, 0x3B, 0x17, 0x73, 0x13, 0xD4, 0x24, 0x87, 0x10, 0xCD, 0x31, + 0xB6, 0x19, 0xD6, 0x34, 0x6E, 0x18, 0x90, 0x2D, 0x7D, 0x0D, 0x7F, 0x2F, + 0x42, 0x0A, 0x42, 0x34, 0x5F, 0x14, 0x27, 0x35, 0x98, 0x1E, 0x1C, 0x3A, + 0xA6, 0x25, 0x03, 0x3F, 0x1B, 0x20, 0xD9, 0x35, 0x51, 0x22, 0x9B, 0x33, + 0xA7, 0x2D, 0x32, 0x31, 0x4A, 0x2C, 0xF2, 0x24, 0x66, 0x2C, 0xDE, 0x20, + 0x04, 0x2D, 0xBF, 0x1B, 0xAD, 0x34, 0xD5, 0x1E, 0x3B, 0x37, 0x4F, 0x22, + 0xBB, 0x29, 0xDB, 0x26, 0x76, 0x1F, 0xDF, 0x2E, 0x88, 0x24, 0x59, 0x29, + 0xBD, 0x36, 0x34, 0x1A, 0xFD, 0x38, 0x67, 0x12, 0x49, 0x20, 0x7C, 0x14, + 0xD2, 0x12, 0x28, 0x1E, 0xB7, 0x1C, 0x54, 0x2C, 0x0D, 0x26, 0x13, 0x27, + 0x77, 0x22, 0x81, 0x10, 0xE5, 0x21, 0x8D, 0x02, 0xCB, 0x24, 0x3B, 0xFA, + 0x19, 0x1C, 0x0E, 0xF7, 0x24, 0x12, 0xF7, 0xFF, 0xB8, 0x09, 0x62, 0x0A, + 0xDA, 0x08, 0xFA, 0x11, 0x34, 0x0F, 0xDE, 0x12, 0xE1, 0x13, 0x6C, 0x0F, + 0x49, 0x03, 0x66, 0xFA, 0xB1, 0xFE, 0xAD, 0xF3, 0x7E, 0x10, 0x91, 0xFB, + 0x85, 0x0F, 0x1F, 0xF8, 0x98, 0x03, 0xF6, 0x01, 0x6E, 0xF5, 0xDA, 0xFD, + 0x67, 0xFA, 0xAA, 0xF4, 0x32, 0x05, 0x0D, 0xEE, 0x71, 0xFF, 0x8F, 0xEC, + 0xBC, 0xF4, 0x47, 0xF7, 0x58, 0xEF, 0x5D, 0xF7, 0x2A, 0xF2, 0xF8, 0xF4, + 0x21, 0xFA, 0x74, 0xF7, 0x12, 0xF4, 0xB8, 0xF6, 0x5A, 0xEE, 0x20, 0xF6, + 0xA6, 0xFE, 0xE7, 0xFF, 0x95, 0xFF, 0x5B, 0x01, 0x9B, 0xF0, 0xDA, 0x01, + 0x09, 0xE2, 0x1E, 0x0A, 0xAD, 0xE2, 0x63, 0x0A, 0x81, 0xE9, 0x95, 0xFA, + 0xC3, 0xF0, 0xD1, 0xF0, 0x64, 0xF3, 0xF1, 0xE9, 0x3E, 0xF8, 0x15, 0xF1, + 0xCF, 0xFB, 0xA8, 0xFE, 0x64, 0xF1, 0xFC, 0x02, 0x53, 0xEC, 0xFD, 0x11, + 0x54, 0xE5, 0x8F, 0x12, 0x5A, 0xED, 0x23, 0x0F, 0xC3, 0xFD, 0xB1, 0x03, + 0x18, 0x01, 0x46, 0xF3, 0x93, 0xF6, 0xA4, 0xE4, 0xF9, 0xFA, 0xF8, 0xE5, + 0x64, 0x06, 0x01, 0xF2, 0x70, 0xFB, 0xDA, 0xEF, 0x92, 0xFC, 0x37, 0xFC, + 0xAA, 0xFD, 0x76, 0xF6, 0xB5, 0xF7, 0x90, 0xE5, 0x08, 0xF8, 0xB9, 0xE9, + 0x41, 0xF9, 0x7D, 0xEF, 0xCF, 0xF4, 0x97, 0xED, 0x40, 0xF6, 0x71, 0xEF, + 0x38, 0xFB, 0x44, 0xF0, 0x1D, 0x00, 0xCF, 0xF1, 0xC9, 0xF5, 0xE5, 0xF0, + 0x94, 0xEB, 0x52, 0xFA, 0x5D, 0xEC, 0x36, 0xFF, 0x25, 0xF2, 0xF8, 0xF9, + 0xC5, 0xEF, 0xCE, 0xF5, 0xD1, 0xE4, 0xB1, 0xED, 0x42, 0xE6, 0x24, 0xEC, + 0xA4, 0xE5, 0x05, 0xEF, 0x1B, 0xEF, 0x37, 0xF9, 0x40, 0xF5, 0x5F, 0xF2, + 0x44, 0xFC, 0xA1, 0xF6, 0x7D, 0xF7, 0x0E, 0xFE, 0x75, 0xE7, 0x74, 0xF3, + 0xD8, 0xEB, 0x0F, 0xF7, 0xA8, 0xE6, 0x99, 0xEF, 0x4E, 0xEB, 0x82, 0xEF, + 0x83, 0xF7, 0xFD, 0xF6, 0x76, 0xEE, 0xD3, 0xEC, 0xE1, 0xE5, 0x1F, 0xEF, + 0x94, 0xDA, 0x11, 0xF1, 0x17, 0xE2, 0x72, 0xF4, 0xA9, 0xF0, 0xB6, 0xF6, + 0xD1, 0xEC, 0xE4, 0xE8, 0x07, 0xF2, 0xFE, 0xE1, 0xF7, 0xF3, 0xE1, 0xE5, + 0x98, 0xFA, 0x96, 0xEE, 0xF4, 0x02, 0x31, 0xEA, 0x9A, 0x0C, 0x3E, 0xEB, + 0x9B, 0x15, 0x93, 0xEA, 0x8F, 0x1A, 0xD6, 0xE3, 0xA5, 0x24, 0x2A, 0xF2, + 0x4D, 0x0A, 0xF6, 0xF2, 0x12, 0x00, 0x82, 0x02, 0x74, 0x05, 0xA9, 0x0C, + 0x09, 0x04, 0x6A, 0xFC, 0x3C, 0x07, 0xE5, 0xF2, 0xDD, 0xF7, 0xFD, 0xF0, + 0xF1, 0xF2, 0x3D, 0xFF, 0xEA, 0xFA, 0xDB, 0x0D, 0x87, 0x06, 0x6A, 0x0D, + 0x35, 0x0F, 0xD6, 0x07, 0xD2, 0x07, 0xD1, 0x07, 0xF9, 0x06, 0x36, 0x0F, + 0x39, 0x0D, 0xCF, 0x18, 0xDB, 0x08, 0xDD, 0x21, 0xEF, 0x0E, 0x0D, 0x29, + 0xFF, 0x1B, 0xDA, 0x23, 0x2A, 0x25, 0x11, 0x1D, 0x1C, 0x1E, 0x96, 0x14, + 0x50, 0x0F, 0xC2, 0x17, 0xC6, 0x00, 0x55, 0x1D, 0xB5, 0x01, 0xB7, 0x17, + 0x47, 0x1A, 0xDD, 0x14, 0xA8, 0x27, 0xCE, 0x19, 0x69, 0x21, 0x84, 0x1A, + 0xB0, 0x29, 0x1A, 0x23, 0x8F, 0x3E, 0x53, 0x37, 0xBD, 0x3A, 0xB1, 0x3B, + 0xF9, 0x2D, 0xC5, 0x40, 0x90, 0x27, 0x06, 0x42, 0xA6, 0x2B, 0x97, 0x3E, + 0x2C, 0x34, 0x17, 0x44, 0x07, 0x2C, 0xC6, 0x41, 0xF4, 0x1B, 0x25, 0x3D, + 0x66, 0x20, 0x49, 0x3E, 0xB3, 0x21, 0xBA, 0x2E, 0x61, 0x1C, 0xA0, 0x2D, + 0xB6, 0x18, 0x27, 0x37, 0x32, 0x1D, 0xDC, 0x36, 0x44, 0x35, 0x0F, 0x2D, + 0x85, 0x45, 0xC8, 0x23, 0xCD, 0x37, 0xF1, 0x21, 0x97, 0x1E, 0x72, 0x20, + 0xA6, 0x16, 0xDD, 0x26, 0x25, 0x1F, 0xF7, 0x2D, 0x18, 0x17, 0x8E, 0x21, + 0x0A, 0x10, 0x4C, 0x13, 0xAC, 0x0E, 0xAA, 0x0A, 0x1F, 0x08, 0x35, 0x00, + 0x8C, 0x02, 0x9B, 0xF9, 0xB2, 0xEF, 0x9A, 0xF7, 0xFC, 0xF0, 0x74, 0xFD, + 0x84, 0x01, 0xA6, 0xF8, 0xA6, 0x0F, 0xE8, 0xF4, 0xB4, 0x17, 0x55, 0xF5, + 0x92, 0x06, 0xDC, 0xE6, 0xEA, 0x04, 0x6C, 0xE3, 0xD6, 0x06, 0x4C, 0xE5, + 0xA0, 0xF4, 0x1E, 0xE4, 0x47, 0xE6, 0x9E, 0xE6, 0xB3, 0xDF, 0xA8, 0xE5, + 0xB2, 0xE4, 0x2E, 0xDC, 0x83, 0xE3, 0x12, 0xCC, 0x1C, 0xDE, 0x27, 0xC9, + 0x66, 0xCC, 0x8C, 0xBF, 0xCF, 0xCF, 0xC5, 0xC1, 0x10, 0xE2, 0x6C, 0xCC, + 0x58, 0xDA, 0x55, 0xCE, 0x7C, 0xDF, 0x61, 0xD6, 0x06, 0xE9, 0x91, 0xDA, + 0xD5, 0xE4, 0xE0, 0xD4, 0x2C, 0xE1, 0x22, 0xD0, 0x7E, 0xD0, 0xA1, 0xD3, + 0x4E, 0xCC, 0xB7, 0xDD, 0x5B, 0xCF, 0xF0, 0xD9, 0x75, 0xCE, 0x84, 0xCB, + 0xB4, 0xE1, 0x97, 0xD3, 0x9A, 0xD4, 0x56, 0xCA, 0x88, 0xC8, 0xB7, 0xC8, + 0x1F, 0xCD, 0x55, 0xDA, 0xFB, 0xC2, 0x3D, 0xD9, 0x60, 0xBA, 0x9B, 0xD8, + 0xD4, 0xC2, 0x27, 0xD9, 0x70, 0xDA, 0xD4, 0xD9, 0xC7, 0xE2, 0x32, 0xDC, + 0x16, 0xE2, 0x3B, 0xE1, 0x28, 0xDD, 0x83, 0xEA, 0xF8, 0xD5, 0x52, 0xF2, + 0x02, 0xD3, 0xDB, 0xFA, 0xBB, 0xD7, 0x51, 0x05, 0x18, 0xD8, 0xFA, 0xF9, + 0x36, 0xDA, 0xA0, 0xE7, 0x70, 0xE3, 0xB1, 0xD8, 0x7B, 0xF0, 0x7E, 0xCF, + 0xA5, 0xF3, 0x8D, 0xD7, 0xB0, 0xEA, 0x7E, 0xDD, 0x87, 0xF5, 0xFE, 0xE9, + 0x23, 0x01, 0x99, 0xF3, 0x0B, 0xFA, 0xCA, 0xF2, 0x1E, 0xF2, 0x19, 0xF4, + 0x2E, 0xEA, 0x44, 0xF6, 0xA4, 0xEC, 0x17, 0xFE, 0x68, 0xF3, 0x79, 0xF7, + 0x41, 0xF9, 0xCE, 0xF0, 0x94, 0xFF, 0x35, 0xF4, 0x17, 0xF5, 0xA8, 0xEB, + 0xF2, 0xF6, 0x62, 0xEF, 0xDB, 0xFB, 0x0B, 0xEF, 0x3A, 0xF8, 0xD3, 0xEB, + 0x74, 0xF9, 0x91, 0xF3, 0xB8, 0x04, 0xDF, 0xFE, 0x97, 0x03, 0xEE, 0x01, + 0x6A, 0xFB, 0xD6, 0xFD, 0xE1, 0x0A, 0x86, 0x0C, 0x3D, 0x11, 0x6B, 0x12, + 0x34, 0x14, 0x0D, 0x13, 0xE0, 0x19, 0x67, 0x17, 0x01, 0x10, 0x74, 0x15, + 0x5E, 0x07, 0x2E, 0x1C, 0x27, 0x0D, 0x47, 0x25, 0x5A, 0x0A, 0xFE, 0x1A, + 0x27, 0xFB, 0x54, 0x04, 0x69, 0xFC, 0x7E, 0x05, 0x45, 0x05, 0x2E, 0x11, + 0xC9, 0x03, 0xBD, 0x13, 0xB7, 0x0F, 0x43, 0x2C, 0x81, 0x19, 0x19, 0x3A, + 0x71, 0x19, 0xE1, 0x2F, 0x56, 0x25, 0x53, 0x33, 0x54, 0x23, 0x48, 0x2D, + 0x0E, 0x17, 0xA0, 0x28, 0x5F, 0x0D, 0xF9, 0x2A, 0x21, 0x1E, 0x12, 0x28, + 0x03, 0x32, 0x1E, 0x14, 0x63, 0x33, 0x35, 0x04, 0xCF, 0x31, 0x8D, 0x07, + 0xD2, 0x2D, 0x2A, 0x0F, 0xA7, 0x2B, 0x20, 0x14, 0x08, 0x2F, 0xAD, 0x17, + 0xAB, 0x35, 0xE2, 0x1B, 0x52, 0x2A, 0xE4, 0x16, 0x11, 0x2B, 0x1A, 0x1D, + 0xC7, 0x2A, 0x3C, 0x21, 0xE2, 0x1B, 0x55, 0x1D, 0xC3, 0x22, 0x59, 0x25, + 0x03, 0x27, 0xB6, 0x19, 0x01, 0x2A, 0x20, 0x09, 0xA3, 0x29, 0x44, 0x11, + 0xC2, 0x13, 0x36, 0x17, 0xB0, 0x05, 0x43, 0x17, 0x51, 0x0F, 0xA0, 0x1C, + 0xC1, 0x19, 0x13, 0x1B, 0x35, 0x10, 0xE1, 0x09, 0x8B, 0x08, 0x95, 0x08, + 0x77, 0x0A, 0x33, 0x11, 0x6C, 0x06, 0xEE, 0x0D, 0xA5, 0x02, 0xFD, 0x12, + 0x78, 0xF8, 0xCB, 0x12, 0xA1, 0xF3, 0x4F, 0x08, 0x55, 0xF8, 0xA8, 0xFA, + 0xC5, 0x05, 0x78, 0x01, 0x7E, 0x02, 0xEF, 0x06, 0xDB, 0xEF, 0x6B, 0xF7, + 0x90, 0x03, 0xE9, 0x00, 0xF3, 0x00, 0x12, 0xFB, 0x7F, 0xF7, 0xF9, 0x00, + 0xB8, 0xF6, 0x16, 0x0B, 0x8F, 0xF1, 0x21, 0x01, 0xD0, 0x0A, 0xFE, 0x0A, + 0x7D, 0x09, 0x94, 0xFE, 0xD5, 0xFB, 0x1D, 0x01, 0x43, 0xEF, 0x01, 0x0A, + 0x02, 0xEE, 0xA6, 0x0C, 0xBC, 0xFF, 0x7C, 0x16, 0x88, 0xFC, 0x67, 0x0A, + 0x18, 0x03, 0xBC, 0x04, 0xEF, 0x06, 0xAB, 0xF9, 0x2E, 0xFC, 0x09, 0xF3, + 0x08, 0xF4, 0xA5, 0xFB, 0xE0, 0xE3, 0x4B, 0xF8, 0x78, 0xE9, 0xC8, 0xF8, + 0x29, 0xF8, 0xDC, 0xF2, 0xD7, 0x0D, 0xC1, 0xF8, 0x8F, 0x09, 0x5D, 0xF4, + 0x2B, 0xF9, 0xFA, 0xF2, 0xF4, 0xFF, 0x6F, 0x00, 0x14, 0xF7, 0xEC, 0xFA, + 0xE2, 0xF2, 0x20, 0x03, 0x1D, 0xEB, 0x1A, 0xF9, 0xDE, 0xF4, 0xB8, 0xEC, + 0x1A, 0x09, 0x9F, 0xE3, 0xE4, 0x0A, 0xCC, 0xD6, 0x11, 0x00, 0xE2, 0xD8, + 0x25, 0xEF, 0x0F, 0xDB, 0x41, 0xE6, 0x8A, 0xDE, 0x02, 0xE8, 0x8C, 0xE2, + 0xAB, 0xE8, 0xEE, 0xE2, 0xF0, 0xE2, 0xA6, 0xE0, 0x3C, 0xE9, 0x36, 0xE6, + 0x46, 0xF0, 0x84, 0xE4, 0xC1, 0xEF, 0x0D, 0xE0, 0xF2, 0xEF, 0xD0, 0xE5, + 0x52, 0xEE, 0x21, 0xE8, 0x98, 0xF7, 0x70, 0xF1, 0x61, 0xFB, 0xE5, 0xEE, + 0xFA, 0xEE, 0xB8, 0xE3, 0xE5, 0xED, 0xA4, 0xEC, 0x13, 0xE4, 0x03, 0xE5, + 0x4A, 0xE0, 0x5A, 0xEB, 0x7F, 0xDD, 0x8C, 0xF0, 0x61, 0xE2, 0x90, 0xEA, + 0xB0, 0xEB, 0xDD, 0xED, 0xDF, 0xF5, 0xC8, 0xEE, 0xF3, 0x01, 0x58, 0xF2, + 0xB8, 0xEF, 0xEA, 0xF1, 0x45, 0xDF, 0xA1, 0xF9, 0x19, 0xDA, 0xBD, 0xFA, + 0xE0, 0xD9, 0x2F, 0xF7, 0x1A, 0xE5, 0x4B, 0xF9, 0x85, 0xE1, 0x66, 0xE5, + 0x86, 0xEF, 0xA5, 0xE0, 0x7B, 0xF9, 0x6B, 0xDB, 0xB3, 0xF6, 0x0A, 0xE0, + 0xC5, 0xF0, 0x89, 0xF6, 0x77, 0xE3, 0x64, 0xFF, 0x27, 0xF2, 0x2F, 0x0F, + 0xA3, 0xF7, 0xA1, 0x05, 0xEF, 0xFE, 0xC6, 0xFF, 0xEF, 0xFD, 0xBA, 0xFF, + 0xF5, 0xF4, 0xBF, 0x01, 0x73, 0x00, 0xCE, 0x05, 0x20, 0x02, 0x97, 0xFA, + 0xA3, 0x04, 0x8C, 0xFA, 0xCA, 0x0D, 0x0B, 0xFF, 0xE3, 0x06, 0x32, 0x03, + 0x65, 0x00, 0x9A, 0x0B, 0xBF, 0xF6, 0x45, 0x06, 0x2F, 0xFA, 0xBD, 0x0B, + 0xBA, 0x01, 0xAC, 0x12, 0xC9, 0x0E, 0xA1, 0x14, 0xEB, 0x17, 0xBA, 0x17, + 0xF9, 0x0E, 0x90, 0x0E, 0xA4, 0x1D, 0xD0, 0x18, 0x4A, 0x22, 0xA3, 0x1C, + 0xC2, 0x1C, 0xE8, 0x11, 0xCD, 0x15, 0x00, 0x13, 0x2E, 0x0C, 0x8B, 0x19, + 0xB2, 0x0A, 0xBE, 0x10, 0xC3, 0x17, 0x9D, 0x15, 0xBB, 0x1D, 0x54, 0x15, + 0x49, 0x1C, 0x2E, 0x08, 0xA0, 0x1E, 0xBE, 0x0C, 0x4A, 0x23, 0x1C, 0x14, + 0xFE, 0x2A, 0xA5, 0x23, 0x89, 0x1D, 0xF5, 0x26, 0xAF, 0x1B, 0xF6, 0x2E, + 0x8D, 0x29, 0xD2, 0x31, 0x41, 0x2E, 0x65, 0x25, 0x13, 0x23, 0xD3, 0x20, + 0x3A, 0x1A, 0xC2, 0x2B, 0xDF, 0x19, 0x63, 0x3B, 0xCB, 0x16, 0x80, 0x32, + 0x87, 0x2E, 0x72, 0x37, 0x2C, 0x2A, 0x5B, 0x2E, 0x7B, 0x1C, 0x9F, 0x2C, + 0xA5, 0x20, 0x9E, 0x3A, 0x00, 0x15, 0x1E, 0x2A, 0xB0, 0x1C, 0xA4, 0x29, + 0xC1, 0x25, 0xE7, 0x27, 0x4B, 0x20, 0x6E, 0x13, 0x17, 0x33, 0xD7, 0x1A, + 0x41, 0x35, 0x88, 0x12, 0x3A, 0x2C, 0xA2, 0x0C, 0x83, 0x32, 0xCB, 0x13, + 0xD8, 0x32, 0xD6, 0x0B, 0xAD, 0x2E, 0x93, 0x08, 0xFD, 0x1F, 0x64, 0x03, + 0x5E, 0x12, 0xE6, 0x08, 0x4A, 0x0F, 0xC8, 0x07, 0x4D, 0x1C, 0xD0, 0xFD, + 0x76, 0x1F, 0x7D, 0xF3, 0xE2, 0x16, 0x28, 0xF3, 0xF5, 0x03, 0x39, 0xEF, + 0x04, 0xFD, 0xE8, 0xEF, 0x1B, 0x02, 0x3D, 0xFF, 0x20, 0xFA, 0xC9, 0x01, + 0xE7, 0xF2, 0x1A, 0xF8, 0xEA, 0xFC, 0x1C, 0xF8, 0x0D, 0xFC, 0x28, 0xF4, + 0x44, 0xF0, 0xFA, 0xF6, 0x18, 0xE4, 0x46, 0xFB, 0x0C, 0xD3, 0xD8, 0xF3, + 0xAF, 0xD3, 0x71, 0xEF, 0x2B, 0xD5, 0xC3, 0xDE, 0xA5, 0xCE, 0x84, 0xD6, + 0xF0, 0xC8, 0x74, 0xDB, 0x97, 0xD0, 0x0D, 0xDC, 0xAB, 0xE3, 0x85, 0xDE, + 0xE5, 0xE4, 0xE7, 0xD8, 0x2C, 0xDF, 0x92, 0xD7, 0xCE, 0xDF, 0xE6, 0xE0, + 0x7D, 0xDC, 0xE6, 0xE0, 0x50, 0xDE, 0x1B, 0xE4, 0xE4, 0xDA, 0xAB, 0xE4, + 0x82, 0xCE, 0x55, 0xD9, 0x0D, 0xCA, 0x22, 0xD6, 0xF7, 0xC8, 0xBA, 0xDE, + 0xD6, 0xBD, 0x69, 0xDD, 0xD2, 0xB8, 0x64, 0xE0, 0xEB, 0xC2, 0x56, 0xE0, + 0x5F, 0xDB, 0x71, 0xDA, 0xB6, 0xE8, 0x07, 0xDF, 0x47, 0xD3, 0x10, 0xD4, + 0x6D, 0xD6, 0x51, 0xD9, 0x0B, 0xDF, 0xB3, 0xE5, 0x32, 0xD6, 0x37, 0xE1, + 0x77, 0xE6, 0x39, 0xED, 0x60, 0xE7, 0x67, 0xE9, 0x91, 0xE6, 0xBA, 0xE0, + 0x01, 0xED, 0xE8, 0xDE, 0xAC, 0xE7, 0x89, 0xDC, 0x64, 0xDA, 0x74, 0xE2, + 0xE3, 0xC4, 0xDB, 0xDF, 0x17, 0xD2, 0xF8, 0xE5, 0xD8, 0xE7, 0x46, 0xE3, + 0x45, 0xEB, 0xD7, 0xDC, 0x89, 0xED, 0x0E, 0xE3, 0xBB, 0xF6, 0xCF, 0xDF, + 0x09, 0x00, 0x6E, 0xE0, 0xDF, 0xEC, 0x48, 0xD9, 0xBA, 0xEE, 0xF0, 0xDB, + 0xAC, 0xF7, 0x87, 0xE4, 0xAB, 0xEE, 0xC3, 0xE6, 0xCE, 0xF7, 0x02, 0xEE, + 0x08, 0xE9, 0xE4, 0xE1, 0xBB, 0xE5, 0xD4, 0xE3, 0x6B, 0xEE, 0x0C, 0xE2, + 0x04, 0xEE, 0xC2, 0xD7, 0xCC, 0xFD, 0xBF, 0xE4, 0x89, 0xF8, 0xF9, 0xE1, + 0x54, 0x01, 0x1A, 0xEB, 0xB9, 0x10, 0x3D, 0xF4, 0xA7, 0x09, 0x3A, 0xF2, + 0x45, 0xFA, 0xA2, 0xFC, 0xF0, 0xF1, 0x47, 0xFC, 0xED, 0xFE, 0x8E, 0x08, + 0x3E, 0x02, 0xF5, 0x0E, 0x29, 0x03, 0x31, 0x07, 0x52, 0x0A, 0xF1, 0x11, + 0x3A, 0x09, 0x71, 0x18, 0xB1, 0x08, 0xB3, 0x15, 0x98, 0x09, 0xA5, 0x22, + 0xBF, 0xFE, 0x3A, 0x29, 0xC8, 0xFE, 0x6F, 0x30, 0xDB, 0x0E, 0x14, 0x2E, + 0xA1, 0x1B, 0xFF, 0x20, 0xA4, 0x1C, 0xD5, 0x1A, 0x4C, 0x17, 0x78, 0x15, + 0x61, 0x19, 0xFB, 0x25, 0xC5, 0x12, 0xF2, 0x2E, 0x4B, 0x17, 0x2B, 0x36, + 0x7A, 0x17, 0x41, 0x38, 0x39, 0x11, 0x70, 0x34, 0x8F, 0x1C, 0xD1, 0x3D, + 0x85, 0x15, 0x1B, 0x29, 0xEF, 0x1B, 0x41, 0x1B, 0xD5, 0x30, 0x26, 0x23, + 0x51, 0x31, 0x0B, 0x1C, 0xC1, 0x3B, 0xB2, 0x1F, 0x89, 0x35, 0x33, 0x21, + 0x51, 0x2B, 0xB5, 0x24, 0xE9, 0x33, 0xAC, 0x29, 0xA9, 0x2D, 0xF7, 0x22, + 0x0D, 0x30, 0x59, 0x29, 0xB2, 0x23, 0x5B, 0x1B, 0x11, 0x22, 0x0B, 0x1F, + 0xF2, 0x28, 0xE6, 0x1F, 0xA6, 0x2D, 0x40, 0x1B, 0xDB, 0x33, 0xC0, 0x23, + 0x5F, 0x27, 0x97, 0x1A, 0xC9, 0x2D, 0x77, 0x26, 0x8D, 0x21, 0xBE, 0x19, + 0x4D, 0x14, 0x67, 0x16, 0xD8, 0x13, 0x27, 0x24, 0x6D, 0x06, 0x99, 0x13, + 0x34, 0x1A, 0x93, 0x15, 0xD3, 0x1C, 0xFB, 0x04, 0x50, 0x10, 0xCD, 0xFF, + 0xD0, 0x10, 0x8E, 0x17, 0xFA, 0x04, 0xE7, 0x16, 0x93, 0x12, 0xD8, 0x1A, + 0x3F, 0x1D, 0x43, 0x11, 0x0D, 0x13, 0xF1, 0x03, 0x7C, 0x02, 0x15, 0x00, + 0x99, 0x00, 0x51, 0x01, 0x0F, 0x02, 0xD8, 0xFC, 0x71, 0xF9, 0xBD, 0xF2, + 0x4C, 0x04, 0x7D, 0xFA, 0xF6, 0x00, 0x00, 0xF7, 0x44, 0xFA, 0x30, 0xF8, + 0xE1, 0xF5, 0x76, 0x01, 0xBE, 0xDF, 0xFF, 0xFE, 0x41, 0xE2, 0x2F, 0x02, + 0x43, 0xEF, 0x0D, 0xF6, 0x60, 0xFF, 0xA8, 0xF7, 0x53, 0xFC, 0x54, 0xF7, + 0xDF, 0xF5, 0x64, 0xF4, 0xDC, 0x03, 0xCF, 0xF8, 0xFD, 0x09, 0x31, 0xEC, + 0xD8, 0x0A, 0xC9, 0xE7, 0xFD, 0x06, 0x36, 0xE6, 0xAC, 0x02, 0x96, 0xE9, + 0xE6, 0xFC, 0x94, 0xF4, 0xA0, 0x00, 0x72, 0xFE, 0x8D, 0xFD, 0x95, 0xF8, + 0xE0, 0xF3, 0x17, 0xE9, 0xF6, 0xFB, 0x87, 0xE1, 0xFD, 0xFC, 0x67, 0xDC, + 0x84, 0xEB, 0xBC, 0xDA, 0x73, 0xDD, 0x0E, 0xEA, 0xB3, 0xD9, 0x65, 0xF1, + 0xF9, 0xE7, 0xE5, 0xE7, 0x1D, 0xF4, 0x95, 0xE0, 0x33, 0xF4, 0x39, 0xE6, + 0xC9, 0xEA, 0x3A, 0xE8, 0x51, 0xEC, 0x9D, 0xEE, 0x39, 0xF5, 0x51, 0xF5, + 0x49, 0xEC, 0x92, 0xEA, 0x76, 0xE1, 0xAC, 0xE9, 0x60, 0xD9, 0x3C, 0xEB, + 0xB6, 0xD8, 0x50, 0xE7, 0x97, 0xDC, 0xE6, 0xE8, 0x50, 0xD9, 0xF8, 0xE4, + 0x57, 0xE4, 0x12, 0xE5, 0x40, 0xED, 0x19, 0xEA, 0x49, 0xEC, 0x19, 0xF3, + 0xFA, 0xE7, 0x75, 0xFE, 0x5A, 0xDB, 0xE1, 0xF9, 0x72, 0xE7, 0x24, 0xFD, + 0x24, 0xEA, 0x7C, 0xFC, 0x05, 0xE8, 0x3F, 0xFE, 0x04, 0xE3, 0xAD, 0x02, + 0x09, 0xD9, 0xE5, 0x01, 0xD1, 0xE2, 0x03, 0x07, 0x85, 0xEE, 0x59, 0x06, + 0x93, 0xF0, 0x90, 0x06, 0x7A, 0xEA, 0x6A, 0x03, 0xB0, 0xF4, 0x6E, 0xFC, + 0x32, 0xFF, 0x2E, 0xF7, 0xCB, 0xF1, 0x6D, 0xF5, 0x88, 0xEF, 0xD2, 0x01, + 0xCE, 0xEE, 0x2C, 0x01, 0xCB, 0xFC, 0x09, 0xFC, 0x2B, 0x08, 0x2D, 0xF0, + 0x7F, 0x07, 0xF5, 0xE4, 0xD9, 0x10, 0x24, 0xEB, 0x6D, 0x00, 0xDA, 0xE7, + 0xCE, 0x01, 0xB3, 0xF9, 0x82, 0xF7, 0x56, 0x00, 0x21, 0xEB, 0xEF, 0xFE, + 0xB7, 0xFA, 0xE0, 0x04, 0x33, 0x04, 0x3C, 0xFD, 0xED, 0x0D, 0x56, 0xFC, + 0xCE, 0x06, 0x2C, 0xF9, 0x7B, 0x02, 0x47, 0xF4, 0x8E, 0x06, 0x9C, 0xF5, + 0x1C, 0x0B, 0xBD, 0xFE, 0x73, 0x0D, 0x13, 0x03, 0xAD, 0x0A, 0x61, 0x04, + 0xB3, 0x14, 0x61, 0x0B, 0x89, 0x14, 0xC3, 0x0B, 0xE4, 0x07, 0x22, 0x06, + 0xB1, 0xFC, 0x30, 0x00, 0x33, 0xFF, 0x20, 0x02, 0xCD, 0x11, 0x2B, 0x00, + 0x4E, 0x1B, 0xB4, 0xFC, 0xF7, 0x1C, 0x73, 0x04, 0x44, 0x16, 0xBE, 0x07, + 0x6C, 0x0C, 0x07, 0x05, 0x15, 0x0E, 0x89, 0x0C, 0xE1, 0x08, 0xA9, 0x0E, + 0x24, 0x0E, 0xC4, 0x13, 0xD3, 0x17, 0x48, 0x17, 0xDF, 0x2A, 0xE3, 0x16, + 0x25, 0x3E, 0xBD, 0x15, 0xD2, 0x34, 0xF2, 0x0D, 0xD6, 0x2C, 0xDD, 0x1A, + 0xF4, 0x1E, 0xB6, 0x2A, 0x9D, 0x14, 0x4C, 0x2C, 0xC3, 0x1D, 0x6F, 0x2E, + 0xEB, 0x26, 0xF3, 0x32, 0xE1, 0x1F, 0x27, 0x28, 0x28, 0x1E, 0x67, 0x27, + 0x90, 0x16, 0x97, 0x25, 0xF6, 0x0B, 0xDE, 0x19, 0x02, 0x12, 0xF8, 0x24, + 0x64, 0x17, 0xB2, 0x34, 0x2D, 0x11, 0xFA, 0x39, 0x77, 0x12, 0x9E, 0x43, + 0xE2, 0x0B, 0xF4, 0x3F, 0xBD, 0x0A, 0x4E, 0x35, 0x73, 0x1B, 0x39, 0x30, + 0xEE, 0x1E, 0xD1, 0x23, 0x0D, 0x24, 0x3C, 0x1F, 0x7D, 0x21, 0x48, 0x1A, + 0xC8, 0x25, 0xC1, 0x17, 0x0C, 0x29, 0x07, 0x15, 0xA5, 0x16, 0x17, 0x0B, + 0xAE, 0x09, 0xB5, 0x09, 0x73, 0x01, 0x5E, 0x08, 0xF8, 0xFD, 0xBA, 0x00, + 0x6A, 0x00, 0xE9, 0x01, 0xD2, 0xFF, 0x53, 0x05, 0x7F, 0x06, 0xB9, 0x06, + 0x76, 0x0D, 0xB9, 0xFB, 0xC1, 0x11, 0xE2, 0xEF, 0x17, 0x06, 0x8B, 0xF3, + 0x45, 0xF5, 0x4C, 0xFB, 0xAD, 0xF3, 0xCB, 0x00, 0x79, 0xFF, 0xE7, 0xFA, + 0xC1, 0x0A, 0xA8, 0xF1, 0xDD, 0xF3, 0xBE, 0xDE, 0x1F, 0xE7, 0xC1, 0xDE, + 0x48, 0xEB, 0xE1, 0xEA, 0xDB, 0xE6, 0x35, 0xE5, 0x9E, 0xED, 0xDF, 0xE8, + 0x94, 0xF8, 0x7B, 0xED, 0xB8, 0xF8, 0xB4, 0xE1, 0x88, 0xF6, 0x49, 0xE1, + 0x3C, 0xE2, 0xC2, 0xE3, 0x92, 0xC8, 0x65, 0xDE, 0x4F, 0xC6, 0x23, 0xD4, + 0x8C, 0xDA, 0xA4, 0xD2, 0x7C, 0xEB, 0x99, 0xD7, 0x03, 0xD8, 0x26, 0xD0, + 0x42, 0xC9, 0x59, 0xD9, 0x16, 0xD6, 0x2C, 0xEC, 0x4E, 0xD7, 0xEF, 0xE6, + 0xF5, 0xCF, 0xD6, 0xDD, 0xCE, 0xCA, 0xD4, 0xD9, 0xC1, 0xCA, 0x65, 0xD6, + 0xB6, 0xD2, 0x7D, 0xD2, 0xD2, 0xE1, 0xB1, 0xDB, 0xF0, 0xDB, 0xE8, 0xD6, + 0x27, 0xDC, 0x3E, 0xC5, 0x2E, 0xF8, 0xE5, 0xCB, 0xEB, 0xF4, 0x82, 0xC4, + 0xF8, 0xE9, 0x0E, 0xC8, 0x4E, 0xE8, 0xAD, 0xDB, 0xCB, 0xE3, 0x4B, 0xDD, + 0xD7, 0xE6, 0xCB, 0xD5, 0xDE, 0xEE, 0x21, 0xD9, 0x82, 0xE0, 0x2B, 0xD7, + 0x47, 0xCE, 0xE2, 0xCD, 0x50, 0xE0, 0xFE, 0xDC, 0x76, 0xEA, 0xCF, 0xE2, + 0x0F, 0xD5, 0x80, 0xD1, 0x20, 0xDA, 0x03, 0xDA, 0x39, 0xEA, 0x4E, 0xE3, + 0x57, 0xEA, 0xC4, 0xE3, 0x4F, 0xEF, 0x35, 0xEC, 0x0C, 0xF4, 0xAC, 0xEA, + 0x93, 0xF0, 0x5C, 0xE4, 0x9D, 0xF2, 0x9C, 0xEA, 0x29, 0xF0, 0x4B, 0xF8, + 0x7F, 0xD8, 0xDA, 0xF3, 0xE3, 0xCC, 0x2D, 0xEE, 0x7C, 0xD8, 0x14, 0xEB, + 0x08, 0xE9, 0x84, 0xE6, 0x92, 0xDF, 0x46, 0xDB, 0x52, 0xDC, 0x10, 0xE0, + 0x01, 0xE9, 0xD4, 0xF2, 0xD3, 0xE7, 0x75, 0xF4, 0xD3, 0xF0, 0x6F, 0xFE, + 0x9D, 0x00, 0xD9, 0x0B, 0x41, 0x03, 0xA3, 0x05, 0x47, 0x08, 0x48, 0x07, + 0x9C, 0x08, 0xE6, 0x0F, 0xB4, 0xFD, 0x2F, 0x14, 0x82, 0xF6, 0xAF, 0x20, + 0xE1, 0xFF, 0x70, 0x2C, 0x23, 0x11, 0x70, 0x29, 0x74, 0x13, 0x63, 0x18, + 0x3D, 0x11, 0x8B, 0x16, 0x71, 0x0F, 0xAE, 0x20, 0xA5, 0x09, 0xAA, 0x24, + 0xDD, 0x07, 0x16, 0x2C, 0xC8, 0x11, 0xFB, 0x34, 0x0A, 0x18, 0x07, 0x2C, + 0x86, 0x29, 0x48, 0x27, 0x98, 0x3B, 0xEC, 0x2A, 0x89, 0x2E, 0x6E, 0x21, + 0xAB, 0x24, 0x7B, 0x25, 0x4F, 0x22, 0xE0, 0x34, 0x12, 0x18, 0xFB, 0x33, + 0x26, 0x1F, 0xDE, 0x35, 0x45, 0x20, 0xA5, 0x2E, 0xF5, 0x27, 0xD4, 0x24, + 0x5D, 0x3E, 0x51, 0x24, 0x99, 0x3B, 0x27, 0x19, 0xE9, 0x39, 0xCB, 0x19, + 0x58, 0x32, 0x89, 0x18, 0xBF, 0x27, 0xCB, 0x0F, 0x9C, 0x3E, 0xDC, 0x22, + 0x4C, 0x3D, 0x01, 0x20, 0xA2, 0x2C, 0xDF, 0x11, 0xBC, 0x2A, 0x8C, 0x1D, + 0xAE, 0x1E, 0xBA, 0x1B, 0xBF, 0x14, 0x2E, 0x14, 0xF9, 0x13, 0x28, 0x10, + 0x33, 0x1B, 0x4A, 0x11, 0x6C, 0x1C, 0x07, 0x08, 0x0D, 0x25, 0xB0, 0x04, + 0xEC, 0x28, 0x64, 0x08, 0x65, 0x18, 0x09, 0x05, 0xBA, 0x10, 0xB1, 0x13, + 0xD7, 0x04, 0xBD, 0x10, 0x4C, 0x0B, 0x45, 0x0D, 0x72, 0x16, 0xE7, 0x08, + 0x0D, 0x14, 0xDD, 0xF8, 0xC6, 0x17, 0x02, 0xFE, 0xF2, 0x0C, 0x9D, 0x02, + 0x64, 0xFC, 0xC9, 0x04, 0xBB, 0xE9, 0x0F, 0x03, 0xD9, 0xEC, 0x4A, 0x09, + 0x88, 0xFA, 0x28, 0x10, 0x51, 0xEF, 0xB8, 0xFE, 0x4E, 0xEE, 0x05, 0xFA, + 0x45, 0xE9, 0xC6, 0xF1, 0xF6, 0xE5, 0xC6, 0xEB, 0x20, 0xF4, 0x99, 0xEF, + 0xCE, 0xF1, 0xD3, 0xEB, 0xE4, 0xF1, 0x98, 0xF7, 0xEA, 0xED, 0x0B, 0x00, + 0x7C, 0xF8, 0xD8, 0x0F, 0xCE, 0xF9, 0xF6, 0x10, 0x15, 0xE9, 0x93, 0x09, + 0xFD, 0xEE, 0xC1, 0x10, 0x63, 0xEC, 0x70, 0xFB, 0x69, 0xFA, 0x9B, 0xF3, + 0x72, 0xFE, 0xDA, 0xF2, 0x7A, 0xF1, 0xC9, 0xEC, 0xF1, 0xFA, 0x1A, 0xFB, + 0x43, 0xFC, 0xB9, 0xF5, 0x2B, 0x00, 0x88, 0xF4, 0x05, 0xF2, 0xCE, 0xF7, + 0x24, 0xE4, 0xAC, 0xFC, 0xB2, 0xEC, 0xE4, 0xFE, 0xB7, 0xF3, 0x00, 0xF2, + 0xA0, 0x00, 0x0E, 0xF3, 0xC6, 0xFF, 0x30, 0xF0, 0x25, 0xFE, 0x41, 0xEE, + 0x43, 0xFF, 0xF6, 0xF2, 0x4D, 0xFD, 0x5E, 0xF6, 0x93, 0xFC, 0xE3, 0xF6, + 0x55, 0xFA, 0x0D, 0xED, 0xF7, 0x04, 0x52, 0xF0, 0xA2, 0xFD, 0xBF, 0xE9, + 0x63, 0xE9, 0x10, 0xE0, 0xE5, 0xEC, 0xB9, 0xEF, 0x55, 0xEC, 0xB0, 0xE7, + 0x64, 0x05, 0xB1, 0xEE, 0x3C, 0x0C, 0x5B, 0xF5, 0x9A, 0xF2, 0x42, 0xF5, + 0xF3, 0xF3, 0xAF, 0x09, 0x74, 0xF4, 0x2A, 0x05, 0xC5, 0xF5, 0x6F, 0xFE, + 0x66, 0xEF, 0x73, 0xF4, 0x8C, 0xE7, 0x0C, 0xEB, 0x75, 0xEB, 0x6F, 0xEC, + 0x0F, 0xE8, 0x6D, 0xEB, 0xDC, 0xF0, 0x46, 0x03, 0x4D, 0xED, 0xD6, 0x05, + 0x55, 0xE9, 0x5C, 0xFD, 0x03, 0xFE, 0x92, 0x05, 0xF0, 0xF6, 0xB3, 0xF6, + 0x58, 0xEA, 0x57, 0xFD, 0x7E, 0xE5, 0x69, 0x01, 0x32, 0xEE, 0xCA, 0xF7, + 0x76, 0xFC, 0x5F, 0xF3, 0xCE, 0xF8, 0xAC, 0xE2, 0xDD, 0xF8, 0x05, 0xDE, + 0x06, 0xF9, 0x40, 0xDF, 0x11, 0xFB, 0x90, 0xE7, 0x00, 0xFD, 0xCC, 0xEA, + 0x4D, 0xFD, 0x1C, 0xE7, 0x60, 0xFF, 0x09, 0xE7, 0x52, 0x02, 0x39, 0xE6, + 0xBC, 0x09, 0xC6, 0xEF, 0xA1, 0x0C, 0x64, 0xF1, 0x4D, 0x06, 0x4A, 0xF1, + 0x4B, 0x04, 0x2F, 0xF3, 0xA8, 0x00, 0xED, 0xEF, 0x36, 0xF8, 0xD8, 0xF9, + 0x27, 0xEF, 0x2F, 0xF7, 0x61, 0xF9, 0x4B, 0xFA, 0x7D, 0x0F, 0xB6, 0x05, + 0x46, 0x09, 0xCF, 0xFB, 0xA0, 0xFF, 0x77, 0x04, 0x57, 0xF6, 0x3A, 0x0D, + 0xA9, 0xE6, 0x07, 0x0C, 0xC1, 0xE9, 0x23, 0x12, 0x60, 0xF2, 0xEF, 0x12, + 0xF3, 0xF5, 0xF7, 0x11, 0xE1, 0xF9, 0xB2, 0x0E, 0x66, 0xFE, 0x6B, 0x0E, + 0xF4, 0xFE, 0x2E, 0x0A, 0xD8, 0xFC, 0x24, 0x0D, 0x1C, 0x04, 0x24, 0x15, + 0x49, 0x12, 0x51, 0x11, 0xA4, 0x1E, 0x87, 0x11, 0x6D, 0x23, 0x1C, 0x12, + 0x11, 0x17, 0x9B, 0x0D, 0xF6, 0x0A, 0xEF, 0x18, 0x96, 0x06, 0xF9, 0x25, + 0x30, 0x05, 0x64, 0x26, 0xE7, 0x13, 0x3E, 0x2E, 0x31, 0x1F, 0xF4, 0x2C, + 0xE8, 0x2D, 0x61, 0x2A, 0x6B, 0x33, 0x1D, 0x2B, 0xF5, 0x29, 0x84, 0x30, + 0x5F, 0x22, 0x39, 0x3C, 0xBC, 0x18, 0x7C, 0x3F, 0x3B, 0x22, 0xF7, 0x40, + 0x30, 0x2B, 0x4E, 0x3A, 0x73, 0x2A, 0xAC, 0x2D, 0x61, 0x2E, 0x51, 0x23, + 0x7E, 0x35, 0xD6, 0x23, 0x36, 0x33, 0x9E, 0x20, 0x11, 0x27, 0x70, 0x18, + 0xB8, 0x2D, 0x6A, 0x2F, 0xBF, 0x2B, 0xE0, 0x33, 0xFD, 0x30, 0x7D, 0x31, + 0x36, 0x3D, 0x10, 0x37, 0x28, 0x2D, 0xB9, 0x24, 0x54, 0x28, 0xF2, 0x23, + 0x15, 0x23, 0x74, 0x16, 0xD3, 0x22, 0xA6, 0x07, 0xAD, 0x1D, 0xE8, 0xFD, + 0x94, 0x18, 0x57, 0xFB, 0x8F, 0x21, 0x5D, 0x03, 0x28, 0x1B, 0x6D, 0xF9, + 0x78, 0x10, 0xCB, 0xF6, 0xE3, 0xFF, 0x7D, 0xF7, 0x8D, 0xF0, 0x1E, 0xF8, + 0x15, 0xF2, 0x42, 0xFA, 0x36, 0xFE, 0x00, 0xF2, 0x2B, 0x0A, 0x37, 0xED, + 0x12, 0x0E, 0x9E, 0xE8, 0xEF, 0x14, 0x2A, 0xF1, 0x19, 0x03, 0xD7, 0xF5, + 0x41, 0xE9, 0xBC, 0xF3, 0xB3, 0xE5, 0x31, 0xF8, 0x28, 0xE8, 0x5C, 0xF0, + 0x03, 0xEE, 0x17, 0xE4, 0x2D, 0xE5, 0x45, 0xD0, 0x21, 0xDE, 0xD4, 0xD3, + 0x33, 0xD5, 0xD1, 0xD9, 0x50, 0xDA, 0x00, 0xE0, 0x4C, 0xE5, 0x6F, 0xEE, + 0x61, 0xDE, 0x96, 0xEE, 0xAC, 0xDB, 0x23, 0xF2, 0xFE, 0xD2, 0xFF, 0xEA, + 0xB4, 0xDC, 0x4E, 0xE6, 0x8E, 0xDC, 0xBD, 0xDE, 0xB7, 0xC8, 0x01, 0xD0, + 0xA5, 0xD2, 0x1B, 0xD7, 0x5F, 0xD2, 0xAF, 0xCA, 0xB5, 0xD6, 0xD4, 0xC7, + 0x35, 0xD4, 0x7A, 0xD6, 0x60, 0xC4, 0xB3, 0xE0, 0x8E, 0xC9, 0x2C, 0xEA, + 0x6D, 0xCA, 0x68, 0xE4, 0x86, 0xC7, 0xE2, 0xE3, 0x06, 0xC1, 0x19, 0xE2, + 0x10, 0xC5, 0x9B, 0xE1, 0x56, 0xD1, 0xE7, 0xE1, 0x14, 0xE0, 0x05, 0xE2, + 0xC1, 0xE4, 0xF5, 0xDE, 0x8D, 0xD5, 0x35, 0xD5, 0x0A, 0xDB, 0x61, 0xDF, + 0x89, 0xDB, 0x5F, 0xE5, 0x2F, 0xCF, 0x35, 0xDF, 0xF3, 0xD3, 0x99, 0xDF, + 0xDE, 0xD7, 0xEC, 0xD3, 0x1F, 0xEB, 0x33, 0xD7, 0x4C, 0xF0, 0xB8, 0xDB, + 0x77, 0xDF, 0x68, 0xDE, 0x7A, 0xE8, 0x80, 0xF2, 0x57, 0xF7, 0xB5, 0xF3, + 0x99, 0xFF, 0x9D, 0xEA, 0x3B, 0x02, 0x15, 0xEA, 0x8E, 0xF0, 0xE1, 0xE1, + 0xEF, 0xE0, 0xC2, 0xE1, 0x23, 0xF0, 0x91, 0xEC, 0xC5, 0xF7, 0x1B, 0xE6, + 0xB8, 0xF2, 0x6A, 0xE4, 0x3A, 0xF5, 0x63, 0xE4, 0x01, 0xFC, 0xF9, 0xE2, + 0x36, 0x03, 0x9F, 0xF0, 0x4D, 0xFD, 0x00, 0xFB, 0x70, 0xFC, 0x60, 0xFF, + 0x31, 0x0C, 0x13, 0x04, 0x26, 0x12, 0x42, 0xFD, 0xBA, 0x0B, 0x17, 0xF9, + 0x1D, 0x08, 0x1D, 0x01, 0x31, 0x0C, 0x49, 0x10, 0x55, 0x0B, 0xC9, 0x12, + 0xB5, 0x14, 0x25, 0x14, 0xFE, 0x10, 0x80, 0x11, 0xD2, 0xFE, 0x9F, 0x12, + 0x60, 0x05, 0x3E, 0x21, 0xFE, 0xFE, 0x58, 0x1C, 0xCD, 0x01, 0x62, 0x1F, + 0x3D, 0x07, 0xE5, 0x1D, 0x88, 0x04, 0x37, 0x17, 0x90, 0x17, 0x70, 0x24, + 0x45, 0x1D, 0xE5, 0x25, 0xAB, 0x23, 0x49, 0x25, 0x4E, 0x29, 0x77, 0x21, + 0x19, 0x2F, 0x1B, 0x1F, 0xF1, 0x33, 0x32, 0x1F, 0x7B, 0x2C, 0xA3, 0x1D, + 0xDC, 0x29, 0x29, 0x24, 0x78, 0x29, 0x1A, 0x20, 0x39, 0x33, 0x92, 0x16, + 0x3F, 0x2F, 0x68, 0x0B, 0x38, 0x26, 0xC1, 0x13, 0x05, 0x18, 0xE3, 0x14, + 0x6B, 0x0B, 0xD6, 0x11, 0x1E, 0x18, 0x89, 0x20, 0xB5, 0x19, 0x82, 0x1C, + 0x80, 0x1F, 0x65, 0x19, 0xAF, 0x26, 0x3C, 0x1B, 0x9E, 0x24, 0xDA, 0x1C, + 0xDE, 0x25, 0xD7, 0x21, 0x01, 0x1A, 0xA9, 0x23, 0x5F, 0x12, 0x7D, 0x27, + 0x10, 0x1C, 0x6C, 0x26, 0x78, 0x1E, 0x8C, 0x17, 0x5C, 0x11, 0x50, 0x08, + 0x2F, 0x05, 0x61, 0x09, 0x46, 0xFB, 0x07, 0x0D, 0x46, 0xF6, 0xA3, 0x13, + 0xBB, 0xFB, 0x04, 0x15, 0xA8, 0x03, 0x28, 0x0A, 0xDF, 0x13, 0x00, 0x0F, + 0xFA, 0x1C, 0xA3, 0x12, 0xCA, 0x15, 0x21, 0x13, 0x82, 0x07, 0xD0, 0x15, + 0x0F, 0xF3, 0x9C, 0x0F, 0x9B, 0xEF, 0x55, 0x0E, 0x4D, 0xFB, 0x66, 0x0D, + 0x79, 0xFF, 0x78, 0x07, 0x8E, 0xFF, 0x57, 0x04, 0x05, 0x01, 0xA4, 0x00, + 0xF1, 0xFA, 0x38, 0xFA, 0x09, 0xF1, 0x57, 0xFD, 0x78, 0xED, 0xA8, 0x03, + 0x71, 0xF1, 0x65, 0x07, 0xE4, 0x06, 0xE0, 0x13, 0xC8, 0x12, 0x13, 0x07, + 0xBE, 0x0E, 0x8E, 0xF4, 0xE3, 0x0F, 0xFC, 0xF8, 0x7A, 0x0B, 0xEF, 0xFA, + 0xC9, 0x06, 0x8D, 0xFF, 0xBC, 0xFE, 0xDD, 0xFA, 0x97, 0xFC, 0xA5, 0x01, + 0xD0, 0xF4, 0xC6, 0x00, 0xC0, 0xF9, 0x88, 0xFD, 0x52, 0xFE, 0xB2, 0xFD, + 0xDC, 0xE9, 0x8A, 0xEB, 0xC1, 0xED, 0xC5, 0xEA, 0x44, 0xFC, 0x56, 0xF5, + 0xC6, 0x01, 0x3E, 0xF9, 0x20, 0x0A, 0xAD, 0xF8, 0x73, 0x0B, 0xC7, 0xF7, + 0x12, 0x0E, 0x7D, 0xFB, 0x63, 0x08, 0x3B, 0xF2, 0x4A, 0xF9, 0x87, 0xED, + 0x69, 0xEC, 0x67, 0xEB, 0xF6, 0xE9, 0x57, 0xE1, 0xF9, 0xFE, 0xD0, 0xE0, + 0x55, 0x01, 0x3E, 0xCE, 0x68, 0xFD, 0x18, 0xD1, 0x49, 0xEC, 0x88, 0xD6, + 0x79, 0xE0, 0xD0, 0xDB, 0x7D, 0xE8, 0x27, 0xEB, 0xD9, 0xEB, 0x5F, 0xED, + 0xB1, 0xF3, 0x01, 0xF3, 0x93, 0xE8, 0x9E, 0xE7, 0x88, 0xEE, 0x77, 0xE1, + 0xE2, 0x01, 0x22, 0xE3, 0x33, 0xF6, 0x17, 0xDD, 0x0A, 0xF4, 0xD1, 0xEE, + 0xD6, 0xF3, 0x67, 0xFB, 0x50, 0xED, 0x54, 0xFC, 0x41, 0xE8, 0x91, 0xFD, + 0x3D, 0xE1, 0x6A, 0x00, 0xC7, 0xDF, 0xA6, 0x02, 0x69, 0xDD, 0xF6, 0xF4, + 0x16, 0xEE, 0xF7, 0xF9, 0x3C, 0xE9, 0x7D, 0xEF, 0x25, 0xE7, 0x37, 0xF1, + 0x85, 0xF1, 0xB5, 0x05, 0x45, 0xEA, 0x03, 0x03, 0x1E, 0xEE, 0xA1, 0x0B, + 0xA5, 0xE0, 0xF8, 0x0A, 0x81, 0xD8, 0x11, 0x05, 0x2B, 0xDE, 0x05, 0x04, + 0xD4, 0xDF, 0x7A, 0x01, 0x8A, 0xE8, 0xB5, 0xFD, 0x2D, 0xEC, 0xD4, 0xE9, + 0xC0, 0xFF, 0x25, 0xE3, 0x43, 0x08, 0xB9, 0xDC, 0x0E, 0xFE, 0x5D, 0xDC, + 0x60, 0xFD, 0x37, 0xF0, 0xDA, 0xF3, 0xAC, 0xF2, 0xBE, 0xFC, 0x71, 0xF6, + 0xA9, 0x05, 0xEC, 0xF2, 0xA9, 0xFA, 0x59, 0xF0, 0x55, 0xE9, 0x3D, 0xF1, + 0x66, 0xEE, 0x05, 0xF6, 0x0E, 0xFA, 0xEE, 0xFA, 0x7A, 0x01, 0x74, 0xFD, + 0x1F, 0x0A, 0x73, 0xFC, 0x92, 0x07, 0x80, 0xF9, 0x3B, 0x05, 0x00, 0xFF, + 0x50, 0xFE, 0x4C, 0x02, 0x4E, 0xF0, 0xB4, 0x00, 0x6C, 0xF3, 0x99, 0x03, + 0xB7, 0x01, 0xC7, 0x02, 0xE0, 0x0F, 0x4D, 0x03, 0x79, 0x18, 0x7E, 0x0A, + 0x11, 0x15, 0xCA, 0x17, 0xC8, 0x13, 0x64, 0x20, 0x64, 0x20, 0xAC, 0x22, + 0x6F, 0x22, 0x11, 0x1C, 0x1F, 0x1A, 0x14, 0x0D, 0xB8, 0x20, 0x51, 0x0F, + 0x9B, 0x18, 0x31, 0x11, 0x2C, 0x1F, 0x33, 0x1E, 0x19, 0x1E, 0x79, 0x16, + 0x42, 0x18, 0x43, 0x0B, 0xF0, 0x29, 0x5D, 0x19, 0x2B, 0x25, 0x19, 0x1A, + 0x1A, 0x1E, 0x16, 0x26, 0xF2, 0x19, 0x2F, 0x34, 0xC1, 0x14, 0x91, 0x34, + 0x54, 0x1C, 0x9B, 0x34, 0x52, 0x22, 0x5C, 0x33, 0x49, 0x22, 0x4D, 0x37, + 0xAF, 0x1F, 0x07, 0x2E, 0x16, 0x33, 0xBA, 0x30, 0x21, 0x35, 0xC0, 0x2A, + 0x25, 0x33, 0x65, 0x24, 0x90, 0x33, 0xB4, 0x28, 0x9E, 0x1C, 0x0C, 0x1F, + 0x42, 0x29, 0xC4, 0x29, 0x01, 0x2D, 0x1D, 0x22, 0xB6, 0x2B, 0xDD, 0x1C, + 0xA7, 0x35, 0xB2, 0x26, 0x12, 0x2B, 0x24, 0x23, 0x41, 0x27, 0xF1, 0x2B, + 0x19, 0x19, 0x88, 0x2A, 0x2A, 0x13, 0x43, 0x2A, 0x13, 0x15, 0x6F, 0x20, + 0xB3, 0x13, 0xE2, 0x0C, 0x13, 0x1C, 0x59, 0x09, 0xD7, 0x13, 0xE7, 0xF6, + 0x74, 0x13, 0xC3, 0xFD, 0xA7, 0x10, 0x57, 0x0D, 0x3F, 0x0F, 0x38, 0x0F, + 0xD9, 0x0D, 0x68, 0x0A, 0xEA, 0x00, 0xC8, 0xFC, 0x7E, 0x01, 0x61, 0xFA, + 0xAF, 0xEF, 0xAC, 0xF1, 0x16, 0xDD, 0x29, 0xF0, 0xDA, 0xD9, 0x48, 0xF6, + 0x37, 0xDC, 0x36, 0xF6, 0xE6, 0xE4, 0x1A, 0xF1, 0x1C, 0xED, 0x8B, 0xEC, + 0x5A, 0xF3, 0x41, 0xEA, 0x52, 0xF2, 0x44, 0xE3, 0x1D, 0xEB, 0x89, 0xE3, + 0x66, 0xE5, 0xCE, 0xEB, 0xAE, 0xDF, 0xAF, 0xEC, 0x9B, 0xD7, 0xC7, 0xEE, + 0x0C, 0xF6, 0xB7, 0x0D, 0xE4, 0x1A, 0x3F, 0x21, 0xC4, 0x1C, 0xD8, 0x17, + 0x8A, 0x36, 0x6D, 0x30, 0x77, 0x5D, 0x12, 0x59, 0xE4, 0x5E, 0xEF, 0x61, + 0x3C, 0x47, 0x36, 0x4E, 0x63, 0x2F, 0x95, 0x38, 0x48, 0x1A, 0x1D, 0x23, + 0xFB, 0x07, 0x0A, 0x0A, 0x9C, 0xF8, 0x61, 0xF2, 0x6E, 0xE5, 0x30, 0xD5, + 0x48, 0xDC, 0xF5, 0xC6, 0xD9, 0xDB, 0xB3, 0xCD, 0x5C, 0xDD, 0x13, 0xD4, + 0x15, 0xE1, 0x08, 0xDB, 0xD3, 0xD3, 0x1A, 0xDD, 0xF8, 0xC4, 0x78, 0xD1, + 0x1C, 0xC0, 0x8B, 0xC1, 0xD0, 0xBA, 0x10, 0xB8, 0xB4, 0xB1, 0xA3, 0xAE, + 0xF9, 0xAA, 0xC0, 0xA5, 0xD5, 0xC8, 0x02, 0xBC, 0xD1, 0xE6, 0xCB, 0xCB, + 0xAE, 0xE9, 0x97, 0xCA, 0x68, 0xEE, 0x07, 0xD9, 0x27, 0xE1, 0x7C, 0xDE, + 0x7E, 0xCD, 0xF6, 0xD5, 0x75, 0xDD, 0x29, 0xDF, 0x78, 0xEB, 0xB4, 0xE8, + 0x05, 0xE5, 0xEA, 0xE8, 0x1F, 0xF8, 0xD2, 0xF4, 0xA1, 0x0B, 0xE5, 0xFA, + 0xEA, 0x0D, 0x2C, 0x02, 0x12, 0x1B, 0x43, 0x19, 0xF2, 0x2B, 0x7A, 0x31, + 0xF9, 0x2B, 0x71, 0x30, 0x90, 0x13, 0x0B, 0x11, 0x6F, 0x0A, 0xB9, 0x09, + 0xF4, 0x2F, 0x70, 0x31, 0x62, 0x2D, 0xDB, 0x26, 0xB2, 0xFF, 0xB5, 0xEA, + 0x99, 0x0C, 0x10, 0xEE, 0x91, 0x16, 0x6B, 0x03, 0xC3, 0xF2, 0x5E, 0xF3, + 0x6F, 0xEB, 0x37, 0xF5, 0x97, 0xF5, 0xDF, 0x02, 0x9A, 0xD5, 0x8F, 0xE7, + 0x81, 0xB5, 0x19, 0xC5, 0xC8, 0xB6, 0x32, 0xC6, 0x44, 0xB3, 0x4E, 0xC1, + 0xCB, 0xAC, 0xD5, 0xB3, 0x57, 0xC2, 0x50, 0xCC, 0x91, 0xD7, 0xDE, 0xDD, + 0xAC, 0xD0, 0x2E, 0xCA, 0x8F, 0xDE, 0x37, 0xD9, 0x32, 0xE6, 0x10, 0xFA, + 0x7C, 0xC7, 0x28, 0xF9, 0xAC, 0xC8, 0x35, 0xFC, 0x9E, 0x03, 0x34, 0x20, + 0x0E, 0x22, 0x3A, 0x2A, 0xB8, 0xF9, 0xFC, 0xF6, 0x95, 0xF6, 0x72, 0xF0, + 0x56, 0x1E, 0xCA, 0x1E, 0x20, 0x1E, 0x3D, 0x21, 0x3F, 0x0C, 0x1F, 0x05, + 0xBA, 0x04, 0x41, 0xFB, 0x90, 0x05, 0x40, 0xFA, 0x8C, 0xFB, 0x9A, 0xF0, + 0xD2, 0xE9, 0x8A, 0xEC, 0x77, 0xE0, 0x1C, 0xF0, 0x34, 0xD3, 0xCC, 0xE0, + 0x6A, 0xDC, 0x39, 0xD4, 0x52, 0xF0, 0xBF, 0xD9, 0xB5, 0xE0, 0xCC, 0xD3, + 0x72, 0xC7, 0x4A, 0xC7, 0xE1, 0xBC, 0x31, 0xBD, 0x9E, 0xB7, 0xA0, 0xB5, + 0x09, 0xAC, 0xFF, 0xAB, 0x3B, 0xA7, 0x3D, 0xA8, 0xA2, 0xA8, 0xEA, 0xA8, + 0xCC, 0xAD, 0x67, 0xA7, 0x36, 0xC1, 0x87, 0xB9, 0x05, 0xC9, 0x13, 0xC7, + 0x55, 0xCB, 0x83, 0xC1, 0xB9, 0xDE, 0xF8, 0xCE, 0x5F, 0xF4, 0x97, 0xEB, + 0x4F, 0xF5, 0x4A, 0xFA, 0x4C, 0xDB, 0x90, 0xE8, 0xB3, 0xCC, 0x53, 0xD1, + 0xC3, 0xC4, 0x5A, 0xBE, 0x42, 0xCA, 0x0F, 0xC4, 0x90, 0xD9, 0xFE, 0xDF, + 0xFE, 0xE1, 0x24, 0xF2, 0x13, 0xF6, 0x2A, 0x02, 0x44, 0x0E, 0xB6, 0x10, + 0xDB, 0x12, 0x69, 0x1B, 0x82, 0x07, 0xDA, 0x1F, 0x86, 0x06, 0xD9, 0x1B, + 0x54, 0x02, 0x46, 0x0F, 0x56, 0x0A, 0x12, 0x14, 0xD5, 0x1F, 0x1F, 0x23, + 0x7E, 0x29, 0xEF, 0x26, 0xD5, 0x39, 0x37, 0x34, 0xE7, 0x3D, 0x7C, 0x3C, + 0xD0, 0x33, 0x73, 0x2F, 0x2B, 0x38, 0xA1, 0x26, 0x0C, 0x41, 0x1A, 0x26, + 0xE5, 0x3B, 0xAD, 0x1C, 0x71, 0x23, 0x6E, 0x02, 0x88, 0x18, 0x5E, 0xFC, + 0xB0, 0x11, 0xA6, 0x03, 0x7F, 0x08, 0xB8, 0x03, 0x3C, 0x04, 0x6D, 0x02, + 0x95, 0x06, 0x57, 0xFF, 0x65, 0x11, 0x5D, 0xFD, 0x21, 0x14, 0xB7, 0xFC, + 0x38, 0x18, 0xAE, 0x06, 0x08, 0x2B, 0xD2, 0x28, 0x33, 0x33, 0xED, 0x3B, + 0xC5, 0x30, 0xDE, 0x34, 0xD2, 0x47, 0x4D, 0x43, 0x0D, 0x46, 0xA9, 0x3D, + 0xD9, 0x31, 0x24, 0x2E, 0x84, 0x2D, 0x15, 0x32, 0x52, 0x29, 0xE8, 0x35, + 0x81, 0x2B, 0x4C, 0x3E, 0x36, 0x30, 0x20, 0x47, 0x08, 0x34, 0xC4, 0x49, + 0xB8, 0x47, 0x9D, 0x53, 0xE0, 0x55, 0xFC, 0x55, 0x0F, 0x55, 0x25, 0x46, + 0x65, 0x55, 0x1C, 0x43, 0x2F, 0x4E, 0xBA, 0x49, 0x3B, 0x43, 0x5C, 0x4A, + 0x54, 0x4A, 0xDA, 0x52, 0xB1, 0x57, 0xE7, 0x5A, 0xA5, 0x57, 0xD4, 0x59, + 0x15, 0x56, 0x2D, 0x58, 0x6D, 0x54, 0x7D, 0x55, 0x71, 0x48, 0x8B, 0x51, + 0x1C, 0x33, 0x39, 0x4B, 0xBB, 0x2D, 0x25, 0x4D, 0x07, 0x37, 0x55, 0x52, + 0x13, 0x35, 0x99, 0x4B, 0xEB, 0x30, 0x73, 0x40, 0x81, 0x47, 0x1D, 0x4B, + 0xD5, 0x56, 0x66, 0x50, 0x70, 0x5A, 0xD1, 0x50, 0x25, 0x5E, 0x7A, 0x5D, + 0x3E, 0x54, 0x60, 0x5B, 0x61, 0x53, 0xCA, 0x54, 0xF8, 0x57, 0xCC, 0x4B, + 0xD9, 0x4C, 0x53, 0x3D, 0xFD, 0x3A, 0x83, 0x3C, 0xA0, 0x2C, 0x10, 0x3E, + 0x07, 0x2B, 0x9E, 0x37, 0x2E, 0x33, 0xD8, 0x2D, 0x13, 0x3D, 0x20, 0x2E, + 0x0A, 0x32, 0xCB, 0x22, 0xE2, 0x2B, 0x7B, 0x1B, 0x33, 0x41, 0xDB, 0x2F, + 0x49, 0x33, 0xEC, 0x2B, 0x53, 0x15, 0x0B, 0x22, 0x31, 0x0F, 0xE8, 0x24, + 0xB9, 0x1B, 0x55, 0x22, 0x1B, 0x13, 0xDB, 0x04, 0x3F, 0xFF, 0x0D, 0xEA, + 0x97, 0xF0, 0x24, 0xE3, 0x55, 0xE8, 0xB4, 0xE1, 0x54, 0xEF, 0x57, 0xE9, + 0xB9, 0xDD, 0xAD, 0xD9, 0xD6, 0xC4, 0x10, 0xC7, 0x6A, 0xCE, 0x7D, 0xD7, + 0xCF, 0xD7, 0x3C, 0xE2, 0xD5, 0xCA, 0xA0, 0xD0, 0x01, 0xC0, 0x40, 0xBE, + 0x67, 0xB2, 0xDF, 0xA8, 0x11, 0xB0, 0xB7, 0xA0, 0xE3, 0xB8, 0xE2, 0xAD, + 0x4D, 0xAE, 0x20, 0xB1, 0xFF, 0xA4, 0x66, 0xB3, 0x17, 0xB6, 0x45, 0xC0, + 0x82, 0xBD, 0xEE, 0xBA, 0xC5, 0xB6, 0x06, 0xAF, 0x9E, 0xB2, 0x96, 0xB1, + 0x56, 0xAD, 0x3F, 0xB3, 0xDC, 0xB5, 0x63, 0xB5, 0x05, 0xC9, 0xA7, 0xB9, + 0x01, 0xCF, 0x6D, 0xBC, 0x7A, 0xBF, 0xB2, 0xBD, 0xF1, 0xB8, 0x8A, 0xD0, + 0x54, 0xBE, 0xFF, 0xE6, 0xDE, 0xB5, 0xB0, 0xE1, 0xD3, 0xAD, 0xCB, 0xCF, + 0xB7, 0xC6, 0x96, 0xD6, 0x48, 0xD5, 0xFD, 0xD5, 0xB1, 0xCE, 0x71, 0xCB, + 0x89, 0xDD, 0xCA, 0xE3, 0xFC, 0xE8, 0x46, 0xF6, 0x18, 0xF2, 0xBC, 0xF7, + 0xA9, 0x05, 0x64, 0xF8, 0x42, 0x0A, 0x0C, 0xF3, 0x00, 0x03, 0x0B, 0xF1, + 0x42, 0xFA, 0x8C, 0xF4, 0xBE, 0xF9, 0x43, 0xFE, 0xEE, 0xFB, 0x4B, 0xFF, + 0xFE, 0xF1, 0xC5, 0xE9, 0x48, 0xE7, 0x18, 0xD0, 0x91, 0xF0, 0xA9, 0xD0, + 0xBB, 0xF2, 0x1D, 0xD6, 0x2D, 0xE9, 0x29, 0xD3, 0x30, 0xEE, 0x23, 0xDC, + 0xF8, 0xEE, 0x5E, 0xD7, 0x25, 0xEF, 0x4D, 0xCC, 0x80, 0xFE, 0x6F, 0xDC, + 0x09, 0x06, 0x5E, 0xF1, 0xBE, 0x03, 0xE3, 0xF8, 0x79, 0x09, 0x56, 0xFC, + 0x38, 0x11, 0xBC, 0x02, 0x03, 0x10, 0x2C, 0x0B, 0xD0, 0x20, 0x4C, 0x2B, + 0x1B, 0x30, 0xE3, 0x3E, 0x5E, 0x1F, 0x0D, 0x29, 0x6C, 0x29, 0x1E, 0x2A, + 0xEE, 0x3F, 0x12, 0x38, 0x7A, 0x3B, 0x49, 0x36, 0x9D, 0x33, 0x46, 0x35, + 0x7C, 0x35, 0x35, 0x38, 0x0E, 0x3A, 0x0C, 0x36, 0x46, 0x34, 0x8A, 0x29, + 0xFE, 0x2B, 0x7E, 0x22, 0xBC, 0x24, 0x4D, 0x24, 0xA0, 0x08, 0xF2, 0x16, + 0x22, 0xF1, 0x4E, 0x04, 0x86, 0xFB, 0xE8, 0x0A, 0xC5, 0x00, 0x1B, 0x09, + 0xA2, 0xF8, 0xA7, 0xF3, 0x4D, 0xF0, 0x13, 0xE8, 0x4F, 0xE0, 0xBB, 0xDA, + 0x34, 0xDC, 0x61, 0xD8, 0xF9, 0xE3, 0x72, 0xDB, 0x34, 0xE6, 0x4A, 0xD4, + 0x93, 0xE4, 0x78, 0xCB, 0x88, 0xED, 0xFD, 0xC5, 0x34, 0xF3, 0x91, 0xC3, + 0x30, 0xE3, 0x8B, 0xC0, 0x80, 0xDC, 0x60, 0xCA, 0xC6, 0xE0, 0xD3, 0xD7, + 0x5F, 0xEC, 0x6F, 0xE8, 0x1D, 0xFC, 0x17, 0xF6, 0x1C, 0x00, 0x9D, 0xF5, + 0x5E, 0xFF, 0xF4, 0xFF, 0xB2, 0x03, 0x48, 0x14, 0x21, 0x04, 0x1A, 0x1A, + 0xF3, 0xFB, 0x5C, 0x0D, 0x20, 0xFB, 0xED, 0x05, 0x29, 0x07, 0xE7, 0x12, + 0x31, 0x16, 0x46, 0x1C, 0x85, 0x23, 0x24, 0x20, 0x90, 0x20, 0xD1, 0x20, + 0x72, 0x0F, 0x92, 0x1A, 0xFF, 0x05, 0x45, 0x15, 0xAE, 0xFE, 0x61, 0x08, + 0x38, 0xF3, 0x9E, 0xF4, 0x9B, 0xEE, 0xF5, 0xE7, 0xA9, 0xF0, 0xF7, 0xE4, + 0xF4, 0xF0, 0xF2, 0xE1, 0xA1, 0xE5, 0x51, 0xDA, 0x30, 0xE0, 0xAD, 0xE2, + 0x27, 0xE4, 0x06, 0xEF, 0xE8, 0xE4, 0x61, 0xEC, 0xBD, 0xEA, 0x57, 0xE9, + 0x34, 0xF0, 0x0F, 0xE9, 0x4F, 0xEC, 0x2B, 0xE5, 0x07, 0xED, 0x74, 0xE5, + 0xA9, 0xE9, 0x72, 0xE3, 0xE3, 0xD1, 0x55, 0xDB, 0x4C, 0xC9, 0x2D, 0xEB, + 0x60, 0xCC, 0xD4, 0x00, 0x41, 0xCE, 0x2D, 0x02, 0x36, 0xDE, 0x6D, 0xF5, + 0xD2, 0xDD, 0xF3, 0xEE, 0x24, 0xCC, 0xB4, 0xF9, 0x0A, 0xC8, 0x00, 0xFC, + 0xD4, 0xCE, 0xF6, 0xF2, 0x79, 0xDD, 0x83, 0xEE, 0x74, 0xF6, 0xB8, 0xFE, + 0x0A, 0x07, 0x17, 0x0F, 0x88, 0x03, 0x7A, 0x0D, 0x5C, 0xFB, 0x1C, 0x15, + 0x86, 0xF8, 0x9C, 0x1F, 0x29, 0xF7, 0xAD, 0x1E, 0xAF, 0x05, 0x8A, 0x1F, + 0x5A, 0x11, 0x0A, 0x16, 0xEA, 0x08, 0xE3, 0x00, 0x9A, 0x00, 0xC2, 0xFC, + 0x59, 0xF0, 0xCB, 0x01, 0xD9, 0xD4, 0xC3, 0xF2, 0xBC, 0xBC, 0x81, 0xDD, + 0x60, 0xBC, 0x60, 0xDB, 0xE5, 0xC8, 0x8C, 0xDB, 0x99, 0xC9, 0xDA, 0xD1, + 0x02, 0xD8, 0xA2, 0xD4, 0xE5, 0xE8, 0x52, 0xE1, 0x9E, 0xE5, 0xC7, 0xDD, + 0x25, 0xD7, 0xBC, 0xC4, 0x2B, 0xCB, 0xE8, 0xB4, 0x8D, 0xC3, 0x7C, 0xBB, + 0x1F, 0xBB, 0x97, 0xC6, 0xB7, 0xC0, 0x02, 0xD2, 0x7E, 0xCE, 0x2B, 0xD9, + 0x20, 0xCE, 0x0C, 0xCD, 0xFA, 0xC0, 0xDB, 0xBF, 0xF7, 0xBF, 0xAF, 0xC6, + 0x90, 0xC8, 0x11, 0xCE, 0x4E, 0xC5, 0x07, 0xD5, 0x0D, 0xC5, 0x1B, 0xDA, + 0x0D, 0xD6, 0xCD, 0xDF, 0x41, 0xE0, 0xB6, 0xE8, 0xFC, 0xE0, 0xC4, 0xEB, + 0x9E, 0xE8, 0x75, 0xEE, 0x57, 0xF9, 0x27, 0xED, 0x61, 0xFA, 0xB7, 0xDD, + 0x4B, 0xF3, 0x83, 0xCF, 0xA3, 0xF3, 0x2E, 0xC9, 0x98, 0xE2, 0x96, 0xC4, + 0x11, 0xCE, 0xD9, 0xCE, 0xDE, 0xC6, 0x33, 0xD9, 0x8D, 0xC3, 0x75, 0xD3, + 0x70, 0xC1, 0xA8, 0xC7, 0xAC, 0xCC, 0x26, 0xBF, 0x2D, 0xD2, 0x31, 0xB3, + 0x91, 0xBE, 0xD6, 0xA5, 0xF7, 0xBB, 0x71, 0xB4, 0x01, 0xC7, 0x43, 0xC4, + 0x7D, 0xC0, 0x2D, 0xAF, 0xFD, 0xCF, 0xA1, 0xA8, 0x0B, 0xE5, 0xF1, 0xB1, + 0xCB, 0xDA, 0x64, 0xB2, 0xB0, 0xDA, 0xC0, 0xC7, 0x6A, 0xDD, 0x19, 0xD9, + 0x7F, 0xDA, 0xC6, 0xD7, 0xCF, 0xE9, 0xBA, 0xD7, 0x15, 0xEE, 0x6B, 0xDA, + 0x1F, 0xE2, 0x98, 0xDA, 0x55, 0xE6, 0xFC, 0xE1, 0x2F, 0xF9, 0x44, 0xF4, + 0xB0, 0x03, 0xDA, 0xF5, 0x40, 0xFA, 0xA1, 0xED, 0xE8, 0xFB, 0x2B, 0xF5, + 0x76, 0x10, 0xB5, 0x03, 0x6F, 0x16, 0x8F, 0x09, 0xCA, 0x18, 0x95, 0x13, + 0x2A, 0x21, 0xDC, 0x26, 0x94, 0x30, 0xA8, 0x31, 0x02, 0x45, 0xDD, 0x37, + 0x51, 0x50, 0x48, 0x40, 0x6B, 0x5B, 0xE7, 0x4B, 0x9D, 0x60, 0x03, 0x57, + 0x4C, 0x57, 0xBA, 0x56, 0xED, 0x5A, 0xDF, 0x5D, 0xD5, 0x5D, 0xBF, 0x56, + 0xB5, 0x4D, 0x0D, 0x45, 0x57, 0x51, 0x63, 0x52, 0xB9, 0x68, 0x10, 0x61, + 0x26, 0x6A, 0x01, 0x61, 0x46, 0x50, 0x28, 0x56, 0x02, 0x3E, 0x46, 0x51, + 0xC7, 0x37, 0xA9, 0x4E, 0xD8, 0x2C, 0xD5, 0x43, 0x88, 0x31, 0x83, 0x4C, + 0x61, 0x33, 0x63, 0x47, 0x53, 0x21, 0x58, 0x35, 0x15, 0x1A, 0x80, 0x30, + 0xFD, 0x19, 0xB5, 0x28, 0x3C, 0x22, 0x26, 0x2A, 0xD9, 0x38, 0x27, 0x34, + 0x31, 0x45, 0x54, 0x3A, 0x37, 0x4B, 0x2C, 0x39, 0xF1, 0x46, 0x55, 0x31, + 0xFD, 0x3A, 0xA1, 0x2B, 0x4B, 0x41, 0x3C, 0x30, 0x1F, 0x42, 0x04, 0x32, + 0xEC, 0x42, 0x29, 0x31, 0xE2, 0x48, 0x86, 0x37, 0x4A, 0x47, 0x7F, 0x35, + 0x21, 0x4A, 0x89, 0x2E, 0x7A, 0x4E, 0x8F, 0x38, 0x9D, 0x43, 0xEB, 0x41, + 0x25, 0x30, 0x29, 0x43, 0x61, 0x36, 0xE0, 0x4A, 0xFD, 0x4B, 0xA5, 0x4B, + 0xF8, 0x4E, 0x99, 0x3D, 0xCA, 0x53, 0xDC, 0x3D, 0x79, 0x5D, 0x4C, 0x4C, + 0xF1, 0x4C, 0x6D, 0x4A, 0xD8, 0x33, 0xC8, 0x46, 0x04, 0x23, 0x93, 0x3E, + 0x00, 0x28, 0x24, 0x34, 0xEA, 0x36, 0xFE, 0x2D, 0xC3, 0x32, 0x8C, 0x27, + 0x6D, 0x22, 0xFE, 0x22, 0xE6, 0x09, 0x99, 0x16, 0x03, 0xF5, 0x94, 0x0A, + 0x5F, 0xFB, 0x5D, 0x03, 0x92, 0x03, 0x6B, 0xFE, 0x54, 0xFB, 0x24, 0x03, + 0xB1, 0xFD, 0x6A, 0x0D, 0x40, 0x09, 0x26, 0x0F, 0xA6, 0x01, 0x17, 0xFC, + 0x3F, 0xEB, 0x46, 0xE7, 0x38, 0xE9, 0xB1, 0xE6, 0xAC, 0xF4, 0x31, 0xED, + 0xC1, 0x00, 0xB9, 0xF7, 0xBA, 0x0D, 0x74, 0x04, 0xD1, 0x0A, 0xD2, 0x04, + 0xC2, 0xF9, 0xD7, 0xF6, 0x27, 0xEC, 0xBC, 0xEF, 0x75, 0xE7, 0x34, 0xEC, + 0x3E, 0xE7, 0xEF, 0xE3, 0x05, 0xF8, 0x9D, 0xEA, 0x80, 0x16, 0x97, 0xF3, + 0x5B, 0x26, 0xE1, 0xF6, 0x29, 0x23, 0x39, 0xFE, 0x61, 0x0C, 0x16, 0x02, + 0x48, 0xF7, 0xF4, 0x05, 0xAB, 0x05, 0x1E, 0x15, 0xD0, 0x1D, 0x80, 0x1F, + 0x2F, 0x27, 0x69, 0x15, 0x7D, 0x2B, 0x08, 0x09, 0x99, 0x2F, 0xD4, 0xFF, + 0x67, 0x2B, 0x3B, 0x01, 0x27, 0x19, 0x83, 0x0D, 0xB4, 0x07, 0xEC, 0x0F, + 0x61, 0x07, 0x54, 0x0F, 0xC3, 0x14, 0x1E, 0x05, 0xFB, 0x0F, 0xC7, 0xF5, + 0x17, 0xF5, 0x39, 0xE8, 0x72, 0xED, 0xCA, 0xDC, 0x82, 0xEC, 0x5E, 0xD7, + 0x35, 0xEA, 0x6F, 0xCF, 0xD3, 0xEF, 0x5A, 0xCF, 0xBF, 0xE8, 0x69, 0xDA, + 0x2D, 0xE2, 0x16, 0xE7, 0xFD, 0xE9, 0x35, 0xEF, 0xB1, 0xF1, 0x06, 0xEA, + 0x7F, 0xDE, 0x3C, 0xD5, 0x84, 0xD1, 0x71, 0xCB, 0xE5, 0xE5, 0xAA, 0xD4, + 0xE8, 0xF7, 0x36, 0xDE, 0x7B, 0xFF, 0xBD, 0xED, 0xF5, 0xF7, 0x87, 0xF7, + 0x58, 0xEC, 0x9D, 0xF3, 0xCA, 0xE4, 0xFD, 0xF3, 0x1E, 0xE6, 0x9C, 0xFE, + 0x9E, 0xE8, 0x11, 0x07, 0x33, 0xD8, 0x64, 0x00, 0x68, 0xDB, 0x2C, 0xFE, + 0x87, 0xED, 0x43, 0x00, 0x8C, 0xEC, 0xD1, 0xF4, 0x76, 0xE5, 0x0E, 0xEC, + 0x97, 0xE0, 0xFA, 0xFA, 0x67, 0xD8, 0x2B, 0x15, 0x83, 0xD8, 0x54, 0x23, + 0xA7, 0xEC, 0x55, 0x23, 0xC7, 0xFA, 0x69, 0x16, 0x75, 0x00, 0x24, 0x0B, + 0xBF, 0x06, 0x91, 0x18, 0xCF, 0xFB, 0xEE, 0x25, 0x95, 0xEF, 0x7A, 0x1D, + 0xB7, 0xF3, 0x25, 0x13, 0x9C, 0x0F, 0x9D, 0x1B, 0x74, 0x1C, 0x0E, 0x26, + 0xA0, 0x07, 0x27, 0x23, 0x73, 0xFD, 0x8F, 0x18, 0x3E, 0xF6, 0x9C, 0x02, + 0x87, 0xE9, 0x79, 0xEC, 0x6E, 0xE7, 0x1E, 0xE2, 0x7F, 0xED, 0xEA, 0xE0, + 0x88, 0xFB, 0xC9, 0xEB, 0x35, 0x02, 0xBA, 0xF6, 0xE5, 0xF2, 0x3A, 0xF2, + 0x1D, 0xED, 0x9C, 0xF3, 0x53, 0xED, 0xF9, 0xF9, 0x1C, 0xEC, 0x52, 0xFB, + 0xF6, 0xF7, 0x0D, 0xFD, 0xA0, 0xEF, 0x89, 0xF5, 0xB2, 0xDD, 0x67, 0xEC, + 0x24, 0xDE, 0x43, 0xE3, 0x8D, 0xE3, 0x48, 0xDD, 0x1F, 0xE8, 0x6E, 0xE8, + 0x74, 0xEB, 0xD3, 0xF6, 0x67, 0xF3, 0x31, 0x00, 0x11, 0xF9, 0x40, 0x06, + 0x51, 0xF7, 0x0B, 0x03, 0x8D, 0xE9, 0xCD, 0xF5, 0x32, 0xD1, 0x75, 0xE4, + 0x37, 0xCA, 0xE8, 0xDC, 0x60, 0xCB, 0x25, 0xDE, 0x48, 0xCE, 0x44, 0xDE, + 0xE0, 0xD8, 0xBE, 0xE0, 0xF4, 0xDE, 0xAE, 0xE3, 0x18, 0xE0, 0x53, 0xE5, + 0x8A, 0xDC, 0xF8, 0xF2, 0xD2, 0xDB, 0xA2, 0xFE, 0x85, 0xE5, 0xC6, 0x00, + 0x71, 0xED, 0x53, 0x02, 0x0A, 0xE2, 0x5D, 0xF7, 0xF1, 0xD7, 0xFA, 0xF5, + 0x32, 0xE0, 0x94, 0x04, 0x2D, 0xDE, 0xE4, 0xFE, 0xC2, 0xD9, 0x47, 0xEF, + 0x6B, 0xDE, 0x53, 0xEE, 0x2A, 0xD5, 0xB5, 0xE8, 0x85, 0xD1, 0xBB, 0xDF, + 0x13, 0xD6, 0xF9, 0xD6, 0x67, 0xD5, 0x30, 0xD2, 0x05, 0xD3, 0xA9, 0xDD, + 0xC7, 0xDA, 0x40, 0xE9, 0x8A, 0xEE, 0xB0, 0xEB, 0x39, 0xE8, 0xC8, 0xE3, + 0x61, 0xD2, 0xD5, 0xD2, 0x64, 0xCA, 0x79, 0xC7, 0x55, 0xCB, 0x9F, 0xCD, + 0x06, 0xD1, 0x27, 0xDB, 0x74, 0xCF, 0xFC, 0xDD, 0x12, 0xC9, 0x5C, 0xDC, + 0x0B, 0xC1, 0x1C, 0xD3, 0x0C, 0xBE, 0x81, 0xB6, 0x81, 0xCD, 0x02, 0xA8, + 0xE6, 0xD1, 0x03, 0xB2, 0xB7, 0xBD, 0x74, 0xB9, 0x19, 0xBA, 0x74, 0xC0, + 0xE0, 0xCE, 0x78, 0xCF, 0x03, 0xD6, 0xFA, 0xCD, 0x7F, 0xCF, 0xA5, 0xC2, + 0x61, 0xC8, 0xF2, 0xBD, 0xB7, 0xC2, 0x50, 0xB0, 0x86, 0xCB, 0x1D, 0xA8, + 0x44, 0xDE, 0x01, 0xBE, 0x78, 0xDB, 0x9B, 0xD6, 0x53, 0xCB, 0x1C, 0xD5, + 0xBE, 0xCC, 0x42, 0xD1, 0x56, 0xCC, 0xB3, 0xCD, 0x03, 0xC2, 0x19, 0xC1, + 0x8F, 0xBC, 0xE5, 0xB8, 0x70, 0xBE, 0x26, 0xBD, 0xC9, 0xBA, 0x65, 0xC0, + 0x02, 0xAD, 0x10, 0xBF, 0x87, 0xB9, 0xD7, 0xCB, 0x86, 0xD0, 0x92, 0xDC, + 0x4B, 0xCA, 0x2D, 0xDC, 0x03, 0xB1, 0xE0, 0xD2, 0xAE, 0x9D, 0x28, 0xD0, + 0xB0, 0x9F, 0xA5, 0xCE, 0x04, 0xAD, 0x1B, 0xCD, 0xE6, 0xBB, 0x28, 0xCE, + 0x08, 0xC3, 0xA8, 0xC9, 0x00, 0xC0, 0x84, 0xC1, 0x54, 0xC2, 0x62, 0xBA, + 0x0C, 0xC7, 0x9E, 0xBA, 0x8F, 0xC3, 0x3B, 0xCC, 0xCC, 0xB7, 0xE8, 0xD3, + 0xC1, 0xBC, 0xB5, 0xD2, 0x7B, 0xD7, 0x37, 0xD7, 0x21, 0xE0, 0xB7, 0xCA, + 0x7A, 0xE2, 0x47, 0xC4, 0x66, 0xE9, 0x43, 0xCE, 0x54, 0xF8, 0xC5, 0xDA, + 0x19, 0x14, 0xC9, 0xE4, 0xCA, 0x17, 0xBB, 0xEA, 0x76, 0x04, 0xBC, 0xF0, + 0x4B, 0x04, 0xAD, 0xF6, 0x28, 0x15, 0x34, 0xF6, 0x93, 0x19, 0x9C, 0xF2, + 0x44, 0x0F, 0x3D, 0xF8, 0xE2, 0x05, 0xF1, 0xFF, 0x6B, 0x07, 0x9C, 0x07, + 0x66, 0x12, 0xE4, 0x15, 0xA1, 0x2C, 0x1F, 0x26, 0x31, 0x3E, 0x7E, 0x2C, + 0x89, 0x3B, 0xDC, 0x2A, 0x22, 0x31, 0xBE, 0x1F, 0x39, 0x29, 0x54, 0x1D, + 0x34, 0x2A, 0xD5, 0x25, 0xEA, 0x26, 0xE1, 0x1F, 0x16, 0x2F, 0x37, 0x18, + 0xCC, 0x38, 0x83, 0x13, 0x79, 0x2A, 0x88, 0x09, 0x4A, 0x1C, 0x8B, 0x0C, + 0xCB, 0x1E, 0x36, 0x1D, 0x31, 0x1F, 0x88, 0x22, 0x1E, 0x26, 0xD9, 0x27, + 0xA4, 0x37, 0x58, 0x2E, 0xA9, 0x44, 0xA2, 0x29, 0xB4, 0x4A, 0x76, 0x26, + 0x12, 0x41, 0x8A, 0x22, 0xAC, 0x29, 0x63, 0x20, 0xE7, 0x13, 0xBB, 0x19, + 0x94, 0x19, 0xDB, 0x13, 0x37, 0x1F, 0x00, 0x0E, 0xE0, 0x0A, 0xBF, 0x00, + 0xFE, 0xFC, 0x34, 0xFE, 0x8B, 0x00, 0x67, 0xFE, 0x99, 0x14, 0xC9, 0x09, + 0xF6, 0x19, 0x53, 0x0F, 0xE9, 0xFE, 0xE0, 0xFB, 0x28, 0x05, 0x8F, 0x07, + 0xC7, 0x1A, 0x00, 0x1B, 0xD7, 0x20, 0x1F, 0x13, 0x96, 0x3B, 0x42, 0x1B, + 0xFD, 0x3B, 0x46, 0x22, 0xF6, 0x21, 0x69, 0x19, 0x83, 0x21, 0xEE, 0x18, + 0xA6, 0x26, 0x58, 0x1D, 0x8F, 0x20, 0x63, 0x1C, 0xE5, 0x28, 0xD2, 0x27, + 0x03, 0x3E, 0x3C, 0x33, 0xBE, 0x45, 0xE0, 0x2D, 0x2D, 0x47, 0xF5, 0x30, + 0x30, 0x3F, 0x93, 0x2E, 0x16, 0x3E, 0x76, 0x2B, 0xC2, 0x51, 0xE1, 0x33, + 0xB1, 0x5A, 0xE0, 0x36, 0x3B, 0x5C, 0x61, 0x3C, 0x87, 0x5B, 0xFC, 0x3C, + 0xAC, 0x40, 0xB2, 0x28, 0x9D, 0x33, 0xD4, 0x1D, 0x54, 0x40, 0x93, 0x20, + 0x97, 0x46, 0x82, 0x1F, 0x42, 0x3F, 0x91, 0x24, 0x1F, 0x2C, 0x7D, 0x2B, + 0x15, 0x1E, 0x94, 0x2B, 0x4D, 0x18, 0x6E, 0x26, 0xD6, 0x2A, 0xE5, 0x24, + 0x9B, 0x42, 0xB7, 0x24, 0xF1, 0x34, 0xD2, 0x1F, 0xA1, 0x1E, 0x83, 0x1D, + 0xD7, 0x13, 0xCB, 0x1C, 0x57, 0x11, 0xB2, 0x1A, 0x55, 0x1A, 0x1A, 0x1B, + 0x3C, 0x1C, 0x5D, 0x1C, 0x1A, 0x15, 0xFD, 0x1C, 0x62, 0x12, 0xE1, 0x1F, + 0xB1, 0x18, 0xFB, 0x1C, 0xF0, 0x1B, 0x0F, 0x1A, 0xC4, 0x1F, 0x96, 0x27, + 0xB0, 0x24, 0xD9, 0x2A, 0xEA, 0x1E, 0x60, 0x1C, 0x39, 0x19, 0x67, 0x11, + 0x89, 0x13, 0xE9, 0x04, 0x3A, 0x15, 0x3F, 0x02, 0xD7, 0x21, 0xEB, 0x0D, + 0x8D, 0x2F, 0x72, 0x1A, 0xA1, 0x3D, 0x89, 0x20, 0x3D, 0x3D, 0x76, 0x21, + 0xC9, 0x2C, 0x52, 0x14, 0xEE, 0x23, 0x67, 0xFB, 0x35, 0x25, 0xAA, 0xF1, + 0xA7, 0x15, 0xB5, 0xEF, 0x63, 0xFC, 0x31, 0xE9, 0x75, 0xFC, 0xD8, 0xED, + 0x66, 0xFB, 0x2A, 0xE5, 0x92, 0xF6, 0x51, 0xDA, 0xEC, 0x01, 0x82, 0xE1, + 0x6E, 0xFA, 0x12, 0xD8, 0x9B, 0xE9, 0x2E, 0xCF, 0x10, 0xDB, 0xEA, 0xD9, + 0xB4, 0xCD, 0xD3, 0xE4, 0x9C, 0xCE, 0x21, 0xE8, 0x3F, 0xD2, 0x14, 0xE0, + 0x96, 0xE6, 0x8F, 0xE4, 0x20, 0xFB, 0x79, 0xF4, 0xDB, 0xF7, 0x25, 0xF1, + 0x7D, 0xFC, 0x2E, 0xFA, 0x28, 0x01, 0x67, 0x09, 0x22, 0xFC, 0xBC, 0x0C, + 0x11, 0x03, 0x91, 0x1A, 0x2C, 0x14, 0x73, 0x2C, 0x9D, 0x28, 0xE8, 0x33, + 0x87, 0x23, 0xB8, 0x26, 0x02, 0x0B, 0x55, 0x18, 0x5F, 0x02, 0x71, 0x18, + 0xBA, 0x06, 0x43, 0x1A, 0x3B, 0x14, 0xE0, 0x1E, 0x57, 0x2F, 0xC3, 0x2C, + 0xBB, 0x2C, 0x7A, 0x35, 0xDD, 0x24, 0x7A, 0x3A, 0x7D, 0x3A, 0x78, 0x46, + 0xC0, 0x32, 0x95, 0x4A, 0xA0, 0x1C, 0x65, 0x40, 0xE9, 0x1B, 0x50, 0x35, + 0x4C, 0x23, 0xA0, 0x27, 0x01, 0x2A, 0xD2, 0x15, 0x08, 0x30, 0x27, 0x0E, + 0x8D, 0x2C, 0x06, 0x16, 0x5E, 0x16, 0x42, 0x20, 0x9E, 0x0A, 0x3F, 0x21, + 0x6B, 0x0D, 0xBD, 0x17, 0xAB, 0x0F, 0x23, 0x0B, 0x97, 0x0D, 0x6D, 0x0D, + 0x56, 0xFA, 0x36, 0x0C, 0xA0, 0xF9, 0x71, 0xFD, 0x9A, 0x13, 0xC8, 0x04, + 0x55, 0x0D, 0xEE, 0x0A, 0x51, 0xFB, 0x2A, 0x0A, 0x2A, 0x02, 0xAE, 0x1D, + 0xE5, 0xF5, 0xF3, 0x1B, 0x0F, 0xE9, 0xA0, 0x12, 0x0D, 0xF6, 0x66, 0x17, + 0xD7, 0xF7, 0x8D, 0x15, 0x42, 0xF0, 0x35, 0x0C, 0xE4, 0xEB, 0xF4, 0xFF, + 0x29, 0xE7, 0x51, 0xFF, 0x92, 0xE2, 0xFD, 0xFF, 0x5E, 0xD9, 0x54, 0xFF, + 0x3F, 0xD5, 0x23, 0x00, 0xDF, 0xD6, 0x20, 0xF8, 0xE3, 0xD4, 0x5E, 0xE6, + 0xA0, 0xE5, 0x6F, 0xEA, 0x36, 0xE5, 0x01, 0xF2, 0x41, 0xC8, 0x91, 0xE6, + 0xD8, 0xC3, 0x85, 0xE6, 0x8E, 0xD2, 0xD2, 0xEB, 0x4B, 0xE8, 0xD9, 0xFB, + 0xAB, 0xEE, 0xF1, 0x0B, 0xF4, 0xDE, 0x02, 0x0E, 0xFC, 0xD4, 0xA3, 0x0E, + 0xAD, 0xDD, 0xC0, 0x0B, 0x49, 0xE9, 0xEC, 0x03, 0x71, 0xE1, 0xB2, 0xF9, + 0x2A, 0xD7, 0x4C, 0xF7, 0x0F, 0xDB, 0x44, 0xFF, 0x30, 0xE7, 0x6A, 0x07, + 0xC1, 0xE7, 0x24, 0x04, 0x28, 0xD9, 0x34, 0xF3, 0x3F, 0xD2, 0x76, 0xF4, + 0x4E, 0xD1, 0xBB, 0xF8, 0x55, 0xDE, 0x94, 0xF9, 0xE7, 0xEB, 0xD1, 0x06, + 0xD2, 0xDC, 0x2B, 0x00, 0x5D, 0xCF, 0xD1, 0xF5, 0xB7, 0xCE, 0xDC, 0xF2, + 0xD0, 0xCA, 0x2A, 0xE8, 0x6B, 0xC3, 0xA0, 0xDD, 0x58, 0xC7, 0x27, 0xDD, + 0x48, 0xD1, 0x8D, 0xDD, 0xAC, 0xCA, 0xDD, 0xD2, 0xC7, 0xC8, 0x4B, 0xC9, + 0xF5, 0xC9, 0x59, 0xB9, 0x2B, 0xC3, 0xC5, 0xB4, 0xD5, 0xC5, 0x9F, 0xC6, + 0x5C, 0xCB, 0xAE, 0xCC, 0x16, 0xD2, 0x05, 0xC8, 0x43, 0xE7, 0xEF, 0xCE, + 0x23, 0xEA, 0x20, 0xD4, 0xD3, 0xCC, 0x4B, 0xC1, 0xDC, 0xC4, 0xB9, 0xC1, + 0xA3, 0xC6, 0xA7, 0xD0, 0xBB, 0xC6, 0xCB, 0xD0, 0x4E, 0xD3, 0x8B, 0xD2, + 0x3F, 0xD4, 0xF6, 0xC9, 0xB4, 0xD6, 0x8B, 0xC4, 0x14, 0xEA, 0xCB, 0xD2, + 0x20, 0xEA, 0xAF, 0xD0, 0xCB, 0xD8, 0x04, 0xBF, 0x9B, 0xD1, 0xFC, 0xCC, + 0x92, 0xCC, 0x07, 0xE6, 0x59, 0xD4, 0x40, 0xE3, 0x52, 0xDC, 0x08, 0xDC, + 0x75, 0xD0, 0x63, 0xD7, 0xFF, 0xBD, 0x09, 0xCA, 0x63, 0xB2, 0xA7, 0xC5, + 0x69, 0xB4, 0x69, 0xC1, 0x96, 0xAA, 0xC1, 0xB7, 0xA0, 0xAE, 0xCC, 0xC2, + 0x2E, 0xD4, 0x9E, 0xDF, 0x08, 0xE0, 0x8D, 0xEB, 0x5C, 0xD8, 0x57, 0xF0, + 0x1C, 0xD2, 0xD8, 0xF4, 0x72, 0xCC, 0x15, 0xF6, 0xFB, 0xCD, 0xD7, 0x05, + 0xB7, 0xD9, 0xB7, 0x07, 0x53, 0xF8, 0xE7, 0x07, 0x99, 0xFE, 0x8A, 0x09, + 0x03, 0xF3, 0xE1, 0xFA, 0xBE, 0x08, 0x18, 0x05, 0x05, 0x14, 0x36, 0x0E, + 0xB2, 0x05, 0x4A, 0x0A, 0x15, 0x03, 0x15, 0x14, 0x33, 0x0E, 0x00, 0x0E, + 0x9D, 0x16, 0x17, 0x04, 0x4E, 0x22, 0xF1, 0x0A, 0x02, 0x2F, 0x95, 0x17, + 0x7B, 0x27, 0x05, 0x15, 0x79, 0x1E, 0xCD, 0x13, 0xE5, 0x11, 0x99, 0x16, + 0xB3, 0x05, 0x53, 0x14, 0x00, 0x04, 0xED, 0x16, 0xE7, 0x06, 0xA7, 0x0D, + 0x30, 0x0B, 0x9A, 0x03, 0x1A, 0x08, 0x4B, 0xF9, 0xD5, 0x0A, 0x3C, 0xF0, + 0x23, 0x0D, 0x75, 0xF6, 0x82, 0x10, 0x61, 0x00, 0x67, 0x07, 0xCC, 0x01, + 0xDD, 0xEF, 0x51, 0x02, 0x3E, 0x00, 0x91, 0x0C, 0x4E, 0x14, 0x6D, 0x06, + 0x7A, 0x0E, 0x5C, 0xF1, 0xC4, 0x0A, 0x01, 0xF7, 0x98, 0xF5, 0xB1, 0xFE, + 0x14, 0xE1, 0xFA, 0xF5, 0x4C, 0xEC, 0x0A, 0xF7, 0x52, 0xFA, 0x2A, 0xFE, + 0xF0, 0x00, 0xB8, 0xFD, 0x07, 0x03, 0x91, 0xEE, 0x06, 0xFB, 0xAA, 0xE3, + 0x28, 0xF6, 0xB2, 0xE6, 0xDC, 0xF4, 0xB7, 0xED, 0xBC, 0xF0, 0xE1, 0xF1, + 0x35, 0xF2, 0x89, 0xEC, 0x53, 0x04, 0x9F, 0xF7, 0xF7, 0x11, 0x31, 0x06, + 0xA5, 0x05, 0x3B, 0x0B, 0x60, 0xF1, 0xF6, 0x15, 0xE7, 0xE9, 0x60, 0x0C, + 0xEB, 0xED, 0x18, 0xF8, 0x5F, 0xF8, 0x13, 0xFA, 0x97, 0x04, 0x24, 0xFB, + 0x04, 0x0B, 0x44, 0xF6, 0xB4, 0x10, 0x29, 0xFC, 0x38, 0x18, 0xD6, 0x02, + 0x6E, 0x12, 0x14, 0x03, 0x4B, 0x0C, 0x87, 0x00, 0xED, 0x15, 0xA1, 0x09, + 0x3E, 0x0F, 0x0D, 0x0E, 0x15, 0x0A, 0x79, 0x01, 0x0E, 0x1B, 0x73, 0xF0, + 0x98, 0x2A, 0xC4, 0xEE, 0xB3, 0x32, 0x29, 0xFB, 0x92, 0x2D, 0xAF, 0x03, + 0xA0, 0x21, 0xA3, 0xFF, 0xF4, 0x2B, 0x21, 0xFC, 0x55, 0x49, 0x66, 0x09, + 0x84, 0x4E, 0x7D, 0x09, 0x93, 0x40, 0x37, 0xF3, 0x89, 0x3B, 0xC7, 0xF4, + 0x9C, 0x40, 0x02, 0x04, 0xD2, 0x3F, 0x5D, 0x00, 0xA1, 0x2C, 0xB2, 0xF7, + 0x6D, 0x1E, 0xE0, 0xF7, 0x07, 0x1C, 0x12, 0xF8, 0x02, 0x18, 0x81, 0xF1, + 0x1C, 0x25, 0x97, 0x01, 0x4C, 0x29, 0x19, 0x11, 0x53, 0x1A, 0xA9, 0x0C, + 0x85, 0x22, 0x58, 0x0A, 0xD2, 0x2D, 0x2E, 0x04, 0xB4, 0x1C, 0x63, 0xFC, + 0x98, 0x0F, 0x25, 0xFA, 0x53, 0x0F, 0xB5, 0x04, 0x06, 0x01, 0x01, 0x0E, + 0x69, 0xFD, 0x80, 0x07, 0x95, 0x02, 0xD4, 0x07, 0x66, 0x00, 0x64, 0x11, + 0xDC, 0x0B, 0x45, 0x1D, 0xF6, 0x1C, 0x89, 0x1E, 0xE4, 0x25, 0xAA, 0x1D, + 0x40, 0x24, 0x32, 0x27, 0x46, 0x15, 0xB2, 0x27, 0x57, 0x12, 0xE9, 0x28, + 0x19, 0x1A, 0xCA, 0x24, 0x80, 0x17, 0xD5, 0x15, 0xB1, 0x1C, 0x1F, 0x18, + 0x2D, 0x23, 0xFE, 0x19, 0xD1, 0x07, 0xC4, 0x01, 0x9A, 0xF6, 0xE5, 0xF6, + 0xE0, 0xFF, 0x87, 0x00, 0xB5, 0x03, 0x0C, 0x00, 0x62, 0x0F, 0x2F, 0x0A, + 0x09, 0x1C, 0x97, 0x16, 0xA5, 0x27, 0xDB, 0x11, 0x1E, 0x39, 0x1B, 0x20, + 0xEB, 0x3B, 0x00, 0x30, 0xA6, 0x26, 0xD9, 0x24, 0x97, 0x18, 0xB9, 0x25, + 0x6E, 0x1A, 0x43, 0x2C, 0x73, 0x1A, 0xE6, 0x24, 0x87, 0x15, 0x41, 0x24, + 0x03, 0x0E, 0xE3, 0x22, 0xAE, 0x10, 0xCE, 0x26, 0x3A, 0x28, 0x9A, 0x32, + 0x96, 0x40, 0x94, 0x2F, 0x73, 0x3E, 0x61, 0x2E, 0x27, 0x2A, 0xFA, 0x33, + 0xD3, 0x23, 0x99, 0x2E, 0x54, 0x2F, 0x5D, 0x2C, 0x4D, 0x41, 0xD7, 0x33, + 0x2E, 0x50, 0x74, 0x38, 0x7B, 0x57, 0x9D, 0x39, 0xAC, 0x5B, 0x9A, 0x36, + 0xA1, 0x57, 0x59, 0x35, 0xEC, 0x48, 0xBB, 0x31, 0xA2, 0x42, 0x85, 0x27, + 0x50, 0x46, 0xDB, 0x27, 0x48, 0x40, 0x33, 0x25, 0xE1, 0x3B, 0xF1, 0x18, + 0xDF, 0x33, 0x2D, 0x10, 0x6A, 0x1F, 0x76, 0x06, 0xEE, 0x0F, 0xCF, 0xFD, + 0xF7, 0x03, 0xEB, 0xFC, 0x93, 0x0A, 0xAA, 0x06, 0x22, 0x16, 0x80, 0x13, + 0x99, 0x13, 0xA0, 0x15, 0x68, 0x0E, 0x91, 0x0F, 0xA2, 0x03, 0xDD, 0x14, + 0xF6, 0xEE, 0xA4, 0x1A, 0xFF, 0xD8, 0xD5, 0x07, 0x4A, 0xD5, 0x18, 0xFA, + 0x16, 0xD3, 0xB1, 0xF0, 0x80, 0xD8, 0x95, 0xF1, 0xAC, 0xEE, 0xE3, 0x02, + 0x45, 0xF6, 0x2C, 0x01, 0xBA, 0xED, 0x47, 0xFC, 0x53, 0xEE, 0xAD, 0x0C, + 0x67, 0xFF, 0xBA, 0x18, 0xCC, 0x05, 0x2A, 0x08, 0xAA, 0x0D, 0x0B, 0x03, + 0x20, 0x28, 0x83, 0x12, 0x15, 0x2E, 0xF8, 0x21, 0x82, 0x1D, 0xF7, 0x25, + 0x8F, 0x12, 0xBA, 0x16, 0xD2, 0x0E, 0x67, 0x08, 0x11, 0x12, 0xF0, 0xFB, + 0xB5, 0x18, 0x7C, 0xF8, 0x36, 0x23, 0x11, 0x0C, 0x1A, 0x32, 0x00, 0x16, + 0x75, 0x34, 0x7D, 0x0B, 0xBF, 0x28, 0x37, 0x11, 0x7B, 0x1C, 0x5C, 0x27, + 0x36, 0x1B, 0x14, 0x35, 0xCA, 0x1C, 0xBF, 0x3A, 0x63, 0x18, 0xF8, 0x33, + 0x7B, 0x18, 0xA6, 0x26, 0xBA, 0x17, 0x6E, 0x28, 0x35, 0x17, 0x2F, 0x2B, + 0xC1, 0x0E, 0xB8, 0x2D, 0xA0, 0x00, 0x2A, 0x2E, 0x02, 0xFA, 0x16, 0x1D, + 0xF1, 0xFD, 0xB1, 0x1D, 0x75, 0x02, 0x93, 0x23, 0x0B, 0xFC, 0xA2, 0x1F, + 0xC0, 0xEE, 0xF7, 0x20, 0xC0, 0xD6, 0xE5, 0x10, 0x5A, 0xD2, 0x01, 0x02, + 0xD9, 0xEC, 0xF4, 0xFC, 0x40, 0xF4, 0xB1, 0xE6, 0x46, 0xE8, 0xED, 0xDE, + 0x95, 0xE6, 0x62, 0xF5, 0xA6, 0xE2, 0xF2, 0x03, 0xB1, 0xD8, 0xE2, 0x02, + 0x7C, 0xD5, 0xEA, 0xF8, 0xAC, 0xDE, 0x41, 0xEF, 0x65, 0xE8, 0x64, 0xF0, + 0x11, 0xED, 0xD4, 0xEF, 0x58, 0xF2, 0x19, 0xE5, 0x24, 0xFC, 0xCE, 0xE3, + 0xDB, 0xF7, 0x11, 0xDF, 0x8D, 0xE5, 0xAC, 0xDE, 0x89, 0xE3, 0xCD, 0xF1, + 0xC6, 0xE5, 0x6F, 0xF1, 0xC3, 0xE9, 0xE7, 0xF1, 0x8C, 0xF7, 0x05, 0xFB, + 0xDF, 0xF7, 0xE1, 0xF0, 0xA0, 0xDC, 0x87, 0xE5, 0xED, 0xD5, 0x66, 0xE3, + 0xE9, 0xE0, 0xC9, 0xE8, 0x13, 0xD1, 0x81, 0xEE, 0x2E, 0xC8, 0x1D, 0xF3, + 0x7C, 0xC2, 0xD3, 0xED, 0x45, 0xB6, 0x53, 0xDA, 0x9B, 0xB9, 0x4F, 0xD6, + 0x68, 0xBD, 0xD8, 0xDB, 0x8F, 0xBA, 0x17, 0xDA, 0xB0, 0xB5, 0x45, 0xD2, + 0x6A, 0xC0, 0x1C, 0xCE, 0xF8, 0xC7, 0x12, 0xC7, 0x4B, 0xC3, 0xB4, 0xC5, + 0x86, 0xC5, 0xED, 0xDA, 0x9D, 0xBD, 0x17, 0xE3, 0x7F, 0xB6, 0x66, 0xD8, + 0x7B, 0xB8, 0x16, 0xC5, 0x4E, 0xC7, 0x9A, 0xB9, 0x5A, 0xCF, 0x39, 0xCA, + 0x3D, 0xCB, 0xD8, 0xD5, 0x98, 0xDD, 0x44, 0xDE, 0x5C, 0xDF, 0x1E, 0xE7, + 0x76, 0xD9, 0x1D, 0xE1, 0xB1, 0xE6, 0x2F, 0xDF, 0xA8, 0xEB, 0x53, 0xEA, + 0x57, 0xEB, 0x20, 0xF8, 0x15, 0xE6, 0x9A, 0xFD, 0xD9, 0xE1, 0xAD, 0xFE, + 0x74, 0xE3, 0x41, 0x06, 0xD6, 0xE8, 0x72, 0x12, 0x4B, 0xE7, 0x59, 0x0E, + 0xF9, 0xE9, 0xCA, 0x07, 0xB9, 0xEE, 0xC8, 0x0D, 0xB0, 0xE4, 0xEC, 0x0F, + 0xF7, 0xEF, 0xF8, 0x18, 0x95, 0x06, 0xBE, 0x25, 0x5A, 0x0A, 0x6C, 0x20, + 0x0E, 0x06, 0x1C, 0x17, 0x43, 0xFE, 0x9B, 0x18, 0x94, 0xFA, 0xB1, 0x19, + 0x20, 0x03, 0x45, 0x21, 0x24, 0x16, 0x00, 0x25, 0xB1, 0x25, 0xD0, 0x17, + 0x6E, 0x24, 0x40, 0x1D, 0xE7, 0x14, 0x22, 0x23, 0xFB, 0x06, 0xCE, 0x10, + 0x4C, 0x09, 0x38, 0x04, 0xAD, 0x06, 0xA2, 0xFA, 0xAB, 0xFE, 0x62, 0xEF, + 0x11, 0xF5, 0xE1, 0xE4, 0x4F, 0xEE, 0x1C, 0xDC, 0xC0, 0xF1, 0x38, 0xD5, + 0x1C, 0xF7, 0x94, 0xD4, 0x87, 0xFC, 0x1B, 0xD9, 0xD3, 0xF2, 0xD1, 0xD4, + 0x66, 0xE2, 0x49, 0xDD, 0xB9, 0xD2, 0x5C, 0xDD, 0x72, 0xD0, 0xD6, 0xD5, + 0x5E, 0xE2, 0xC6, 0xD5, 0x77, 0xEA, 0x26, 0xC9, 0x2B, 0xF3, 0x8B, 0xD4, + 0x40, 0xF0, 0x66, 0xDC, 0x08, 0xDD, 0x8E, 0xD6, 0xB4, 0xD9, 0xD0, 0xE9, + 0x09, 0xE2, 0x2A, 0xF1, 0xAE, 0xF5, 0xE2, 0xF8, 0x2A, 0x0B, 0x8A, 0x06, + 0xF4, 0x10, 0x76, 0x04, 0xEC, 0x0C, 0xD3, 0x0B, 0x7A, 0xF7, 0x5D, 0x0F, + 0xB6, 0xE1, 0xC6, 0x05, 0xFE, 0xF9, 0x52, 0x0A, 0xEB, 0x1D, 0xB9, 0x0A, + 0x76, 0x18, 0x16, 0xFE, 0x12, 0x0D, 0x6C, 0x04, 0xF2, 0x0C, 0xEC, 0x0A, + 0xE4, 0xFB, 0xB7, 0x00, 0xF9, 0xF0, 0xE3, 0x0A, 0x17, 0xFA, 0x99, 0x10, + 0x36, 0xF8, 0x69, 0xFB, 0x02, 0xF3, 0x62, 0xEC, 0xE3, 0xFE, 0x02, 0xDD, + 0xC9, 0xF2, 0xE9, 0xCF, 0x47, 0xD2, 0x57, 0xCC, 0x68, 0xC2, 0xD9, 0xC9, + 0xF0, 0xBE, 0x08, 0xC3, 0xDC, 0xC1, 0x26, 0xB9, 0xF7, 0xC0, 0x53, 0xB3, + 0x44, 0xB8, 0x8F, 0xA7, 0xBA, 0xC2, 0x3E, 0x9F, 0xF1, 0xD6, 0x36, 0xA8, + 0xA5, 0xD3, 0x45, 0xAE, 0x65, 0xC0, 0x11, 0xAF, 0x73, 0xBA, 0x83, 0xB7, + 0xD2, 0xBE, 0xC2, 0xB7, 0x24, 0xC7, 0x02, 0xB5, 0xFC, 0xD9, 0xE4, 0xB4, + 0x18, 0xDE, 0xC7, 0xA4, 0xD8, 0xCD, 0x4D, 0x9E, 0xB4, 0xBB, 0x3A, 0xA8, + 0xE1, 0xC1, 0x3C, 0xB6, 0x0B, 0xCD, 0x79, 0xC0, 0xA8, 0xCE, 0xF4, 0xBF, + 0xBE, 0xE5, 0x9E, 0xC6, 0x65, 0xEB, 0x96, 0xBF, 0xC4, 0xD8, 0x65, 0xBE, + 0x69, 0xD4, 0x08, 0xD2, 0x4D, 0xD9, 0xCB, 0xD9, 0x6C, 0xEE, 0x5D, 0xDF, + 0x81, 0x00, 0x56, 0xE8, 0xFB, 0xF5, 0xB6, 0xED, 0x50, 0xE9, 0xF5, 0xE7, + 0xD8, 0xEF, 0x66, 0xF2, 0x3F, 0xF6, 0x8E, 0x03, 0x0F, 0xF8, 0x9E, 0xFD, + 0x06, 0x0E, 0xAB, 0x01, 0x21, 0x20, 0xA5, 0x0A, 0xC2, 0x10, 0x5A, 0x0E, + 0x27, 0x06, 0xA4, 0x19, 0xDF, 0x11, 0xF7, 0x29, 0x1F, 0x23, 0x80, 0x3C, + 0x61, 0x24, 0xBF, 0x42, 0x56, 0x1B, 0x9E, 0x43, 0xD6, 0x19, 0xDC, 0x46, + 0x73, 0x17, 0xD9, 0x47, 0x77, 0x1E, 0xC5, 0x3F, 0x79, 0x3A, 0x0C, 0x34, + 0x7D, 0x4C, 0x22, 0x2F, 0xA1, 0x40, 0x98, 0x2A, 0xAF, 0x34, 0x59, 0x36, + 0x8D, 0x39, 0x18, 0x42, 0x94, 0x3C, 0xCD, 0x31, 0x10, 0x3D, 0xB4, 0x25, + 0x94, 0x4E, 0x33, 0x33, 0x17, 0x5E, 0xB7, 0x3A, 0x3F, 0x47, 0xC0, 0x2A, + 0xC9, 0x2C, 0xF3, 0x23, 0x15, 0x34, 0x41, 0x1F, 0x49, 0x3B, 0x8C, 0x11, + 0xAF, 0x3C, 0x6E, 0x15, 0x28, 0x47, 0x8A, 0x22, 0xD6, 0x49, 0x7D, 0x1B, + 0xE8, 0x40, 0x03, 0x10, 0x1E, 0x2E, 0xFC, 0x14, 0x1D, 0x29, 0x61, 0x14, + 0xF5, 0x33, 0x8C, 0x0D, 0xB1, 0x34, 0xF5, 0x12, 0xFD, 0x3A, 0xA0, 0x25, + 0x7D, 0x3F, 0xB0, 0x2F, 0x9A, 0x30, 0x8B, 0x2A, 0x6D, 0x24, 0xC0, 0x1E, + 0x66, 0x25, 0xEE, 0x12, 0xE7, 0x21, 0xEB, 0x11, 0x1D, 0x1D, 0x57, 0x15, + 0x17, 0x1A, 0xE2, 0x08, 0xC6, 0x13, 0x3B, 0xF2, 0x1E, 0x17, 0x64, 0xEB, + 0x7B, 0x09, 0x92, 0xF1, 0xCA, 0xE3, 0xDF, 0xED, 0x36, 0xD5, 0xEC, 0xEE, + 0xC3, 0xD9, 0xE7, 0xFB, 0x71, 0xDC, 0x9B, 0xF6, 0x98, 0xE0, 0xF6, 0xF1, + 0x44, 0xE2, 0x5A, 0xF3, 0x01, 0xE3, 0x03, 0xE8, 0x84, 0xDC, 0x26, 0xDC, + 0xD9, 0xCF, 0x85, 0xD7, 0x50, 0xCB, 0x83, 0xDE, 0x79, 0xC8, 0x46, 0xE4, + 0xA4, 0xD8, 0x94, 0xE5, 0x75, 0xF2, 0xC8, 0xE6, 0x5C, 0xE7, 0x16, 0xDF, + 0x75, 0xCF, 0xB6, 0xDE, 0xF0, 0xCD, 0x87, 0xE9, 0x2B, 0xDB, 0x61, 0xF4, + 0x7E, 0xE7, 0xA8, 0xF4, 0x42, 0xEE, 0x71, 0xF5, 0x1C, 0xF0, 0x70, 0xFD, + 0x4D, 0xF6, 0xBF, 0x03, 0x2B, 0x0D, 0xDE, 0x18, 0xA8, 0x22, 0x5D, 0x1F, + 0x03, 0x37, 0xAF, 0x1D, 0xF1, 0x41, 0x64, 0x2B, 0x0F, 0x33, 0x3A, 0x30, + 0x09, 0x2B, 0xC0, 0x35, 0xCC, 0x33, 0x6D, 0x3B, 0x34, 0x41, 0xA5, 0x3A, + 0x23, 0x4C, 0x2E, 0x3A, 0x40, 0x53, 0x3C, 0x3C, 0x61, 0x48, 0x46, 0x3B, + 0x09, 0x2C, 0x23, 0x2E, 0x03, 0x20, 0x86, 0x22, 0xAE, 0x33, 0xC5, 0x28, + 0xB8, 0x3D, 0x83, 0x2D, 0x6B, 0x2F, 0x0F, 0x24, 0x77, 0x2D, 0xD8, 0x1D, + 0x12, 0x24, 0xE1, 0x0E, 0x73, 0x11, 0x36, 0xFF, 0x1D, 0x0A, 0xF9, 0x0A, + 0x8E, 0x10, 0x4D, 0x1D, 0xA6, 0x1A, 0xD7, 0x14, 0x59, 0x15, 0x95, 0x03, + 0xBF, 0x0C, 0x3A, 0x06, 0x52, 0x0D, 0x80, 0x09, 0x8A, 0x11, 0x18, 0x05, + 0xB9, 0x19, 0x89, 0x08, 0xF0, 0x17, 0xC1, 0x03, 0xFE, 0x0C, 0x50, 0xFB, + 0xCC, 0x07, 0x70, 0x04, 0xF8, 0x07, 0x8C, 0x06, 0xBE, 0x17, 0x52, 0x0B, + 0x42, 0x27, 0x52, 0x23, 0xA2, 0x20, 0x03, 0x3A, 0x09, 0x0E, 0x3A, 0x48, + 0xD1, 0x07, 0x82, 0x49, 0xBA, 0x16, 0x2B, 0x42, 0x3C, 0x20, 0x48, 0x39, + 0xF1, 0x16, 0x17, 0x2C, 0x11, 0x11, 0x60, 0x30, 0xF0, 0x16, 0x45, 0x40, + 0xED, 0x14, 0xD8, 0x3D, 0xBB, 0x0C, 0xEF, 0x35, 0xF4, 0x19, 0x89, 0x36, + 0x3F, 0x2E, 0x24, 0x36, 0x98, 0x24, 0xAE, 0x29, 0x73, 0x1F, 0x86, 0x1B, + 0x05, 0x28, 0xA6, 0x1A, 0xDE, 0x1C, 0x75, 0x1D, 0x13, 0x0D, 0x8F, 0x1E, + 0x24, 0x0D, 0xF7, 0x25, 0x08, 0x15, 0x69, 0x24, 0x99, 0x13, 0xF0, 0x0A, + 0x27, 0x14, 0x1C, 0xF8, 0x05, 0x1B, 0x8D, 0xFB, 0x14, 0x0D, 0x3F, 0xF8, + 0x49, 0xF8, 0x66, 0xF1, 0x00, 0xFE, 0x2E, 0xFD, 0x1A, 0x0B, 0xFA, 0x0D, + 0x9A, 0x03, 0xC9, 0x0E, 0xF5, 0xF9, 0x84, 0x00, 0xF8, 0xFD, 0xEF, 0xFA, + 0xB8, 0xF4, 0xB7, 0xFF, 0x9F, 0xE2, 0x63, 0xFB, 0x6A, 0xD7, 0x07, 0xF3, + 0x16, 0xE3, 0xCB, 0xEF, 0xE8, 0xFD, 0x01, 0xF3, 0x65, 0xFB, 0x13, 0xF2, + 0xE5, 0xEF, 0xD9, 0xF0, 0xC2, 0xDF, 0x43, 0xF7, 0x0E, 0xCF, 0x99, 0xFC, + 0x2D, 0xDB, 0x55, 0xFF, 0x5A, 0xE3, 0xFB, 0xFF, 0x42, 0xDD, 0x09, 0xF9, + 0xC0, 0xE4, 0xEE, 0xF4, 0x0B, 0xF8, 0x3D, 0xF3, 0x2A, 0xFE, 0x48, 0xF0, + 0x0A, 0xF0, 0xD6, 0xF5, 0x94, 0xDA, 0x35, 0xFD, 0xDF, 0xD6, 0x78, 0x05, + 0x3A, 0xEE, 0xB0, 0x11, 0xA8, 0xFD, 0xCB, 0x12, 0x33, 0x05, 0xC1, 0x04, + 0xC6, 0x08, 0x42, 0xF4, 0x26, 0x01, 0xC2, 0xEE, 0xB4, 0xFD, 0x43, 0xF3, + 0xA1, 0xF8, 0x33, 0xF3, 0x7D, 0xF8, 0x7C, 0xF7, 0xAC, 0xF3, 0xCB, 0xFD, + 0x66, 0xF2, 0x20, 0x02, 0xD9, 0x02, 0x1C, 0x02, 0xF5, 0x0F, 0x87, 0xFF, + 0x25, 0x16, 0x16, 0x04, 0xCD, 0x08, 0x9B, 0xFB, 0x2A, 0xF9, 0x4F, 0xF4, + 0x79, 0xF2, 0x2D, 0xFA, 0x43, 0xF4, 0xD5, 0x03, 0x51, 0xFF, 0x1A, 0x0F, + 0x83, 0x00, 0x4C, 0x12, 0xD4, 0xFB, 0xCC, 0x0B, 0x26, 0xF6, 0x65, 0x09, + 0x89, 0xF4, 0x37, 0x08, 0xE9, 0xEF, 0x57, 0xFE, 0x21, 0xEE, 0x1C, 0x03, + 0xB7, 0xF8, 0x36, 0x0E, 0xF0, 0x06, 0x87, 0x0B, 0xD1, 0x0B, 0x41, 0x04, + 0xB9, 0xF8, 0xF9, 0x05, 0x08, 0xE8, 0x8D, 0x0B, 0x88, 0xE5, 0x43, 0x05, + 0x50, 0xF6, 0x9E, 0xFF, 0x92, 0x0D, 0xB2, 0x02, 0xB6, 0x07, 0xB3, 0x00, + 0x99, 0xFD, 0x79, 0x00, 0xBB, 0xFA, 0x68, 0xFF, 0x4E, 0xFB, 0x1A, 0xF8, + 0x8E, 0x0E, 0xE3, 0xFB, 0xB3, 0x19, 0x56, 0x05, 0xB2, 0x0D, 0xE0, 0x00, + 0xC0, 0x06, 0x40, 0x01, 0x52, 0x0D, 0xD5, 0x03, 0x4E, 0x12, 0x21, 0xF9, + 0x4C, 0x0A, 0x18, 0xF3, 0x72, 0xF6, 0x01, 0xF1, 0x4E, 0xE5, 0x6D, 0xEE, + 0xED, 0xDD, 0xF5, 0xEE, 0xC9, 0xDA, 0x79, 0xF0, 0xFB, 0xE2, 0x42, 0xEB, + 0xA1, 0xE4, 0xB5, 0xE4, 0x0A, 0xD1, 0xD8, 0xDE, 0x01, 0xC0, 0x3E, 0xD7, + 0xEC, 0xB3, 0xE2, 0xCC, 0x39, 0xA6, 0x5E, 0xB6, 0x90, 0xA4, 0x3D, 0xB0, + 0x09, 0xA0, 0x4B, 0xB1, 0x65, 0xA5, 0xAF, 0xAE, 0x9E, 0xBE, 0xC0, 0xB8, + 0x2C, 0xBE, 0x39, 0xAD, 0xFD, 0xAD, 0x82, 0xA4, 0x1B, 0xA7, 0x24, 0xB1, + 0xB7, 0xA8, 0xFD, 0xBB, 0x10, 0xB7, 0xDF, 0xC2, 0xBB, 0xBB, 0x54, 0xB8, + 0x7B, 0xC3, 0xAA, 0xBB, 0x45, 0xCE, 0x33, 0xC2, 0xA3, 0xD6, 0xEF, 0xBB, + 0xCB, 0xE8, 0x0B, 0xC3, 0x17, 0xED, 0xD9, 0xD5, 0x9D, 0xEA, 0xAB, 0xF0, + 0x92, 0xF0, 0xCF, 0xF8, 0xE6, 0xFF, 0x8B, 0xF5, 0x46, 0x0E, 0x6E, 0xF2, + 0xF2, 0x0F, 0xBF, 0xE9, 0x06, 0xFC, 0xFA, 0xE1, 0x01, 0xEC, 0x09, 0xDD, + 0x19, 0x00, 0xB1, 0xF0, 0xA7, 0x11, 0x6C, 0x03, 0xEA, 0x11, 0xEC, 0x06, + 0xB4, 0x15, 0x56, 0x0D, 0x11, 0x1B, 0x45, 0x0B, 0xFD, 0x17, 0x09, 0xFF, + 0x10, 0x02, 0x46, 0xFC, 0x0C, 0xF4, 0xDD, 0x12, 0xBD, 0xEC, 0x31, 0x16, + 0x15, 0xF5, 0xF3, 0x08, 0xC5, 0x17, 0x51, 0x11, 0xDD, 0x18, 0x80, 0x07, + 0x72, 0x00, 0x05, 0xF7, 0x53, 0x00, 0xC0, 0x07, 0xE2, 0xFF, 0x75, 0x1C, + 0x3C, 0xFA, 0xBD, 0x25, 0x25, 0x0C, 0x9B, 0x28, 0x70, 0x1C, 0xF4, 0x21, + 0xC0, 0x1B, 0x30, 0x1F, 0x54, 0x16, 0x6E, 0x15, 0x7E, 0x14, 0x2F, 0x0E, + 0xFD, 0x1B, 0x10, 0x1A, 0xF9, 0x14, 0xCF, 0x15, 0x6E, 0x10, 0x8F, 0x13, + 0xF9, 0x24, 0x6E, 0x21, 0x82, 0x27, 0xC0, 0x13, 0x55, 0x22, 0xE2, 0xFA, + 0x8E, 0x33, 0xE5, 0xF0, 0x8F, 0x31, 0x90, 0xEA, 0x45, 0x19, 0x26, 0xF5, + 0x17, 0x14, 0x1E, 0x0B, 0xBE, 0x12, 0xB8, 0x0B, 0xA7, 0x08, 0xF0, 0x02, + 0x55, 0x0A, 0xB3, 0x03, 0x68, 0x16, 0xE4, 0xFB, 0x88, 0x14, 0x1D, 0xEE, + 0x51, 0xFD, 0x0A, 0xEC, 0xBA, 0xE7, 0x0B, 0xEE, 0x87, 0xE4, 0x2B, 0xEE, + 0xC9, 0xF3, 0x3A, 0xF9, 0x83, 0x07, 0xBD, 0x00, 0x92, 0x0A, 0x6C, 0xF6, + 0xE7, 0x00, 0x1E, 0xF7, 0xCB, 0xF2, 0x5D, 0xFA, 0x85, 0xE7, 0xCE, 0xF0, + 0x33, 0xDD, 0xD4, 0xE6, 0x66, 0xDB, 0x0F, 0xE2, 0x9B, 0xE4, 0xDB, 0xE5, + 0xE5, 0xDA, 0xBA, 0xE4, 0x3B, 0xD4, 0xF4, 0xE7, 0x25, 0xDD, 0x3B, 0xE9, + 0xB0, 0xD3, 0x36, 0xD9, 0xDA, 0xC6, 0x58, 0xCF, 0x73, 0xC7, 0x95, 0xCC, + 0xD2, 0xD0, 0xBC, 0xC8, 0x44, 0xDD, 0xBE, 0xC6, 0xED, 0xEB, 0x85, 0xC8, + 0xF0, 0xF9, 0x91, 0xD1, 0xE9, 0xEA, 0xC3, 0xD5, 0x6B, 0xC8, 0xE4, 0xD9, + 0x48, 0xC8, 0xC4, 0xEA, 0x4A, 0xD9, 0x87, 0xF5, 0x44, 0xD2, 0xBB, 0xEA, + 0x56, 0xCC, 0x18, 0xE0, 0xB9, 0xD3, 0xE4, 0xE1, 0xF1, 0xD5, 0x0C, 0xDD, + 0x9E, 0xD5, 0x1F, 0xDF, 0xD5, 0xDB, 0xEF, 0xEC, 0xC2, 0xE5, 0xB4, 0xF4, + 0xCD, 0xF1, 0x3B, 0xFF, 0x7F, 0xF3, 0xAE, 0x01, 0x12, 0xFA, 0x5A, 0xFE, + 0xB1, 0x05, 0xD4, 0xFC, 0xC2, 0x06, 0xB6, 0xFC, 0x08, 0x13, 0xA2, 0x05, + 0x69, 0x20, 0x69, 0x03, 0xA9, 0x1D, 0x8E, 0x01, 0xDA, 0x19, 0xE3, 0x04, + 0x18, 0x1C, 0xB7, 0x02, 0x83, 0x24, 0x8E, 0xFA, 0x1D, 0x2A, 0xEE, 0xEA, + 0xB5, 0x22, 0x06, 0xE5, 0x38, 0x18, 0x2E, 0xEA, 0xA0, 0x0B, 0x3C, 0xE8, + 0xB3, 0x08, 0x66, 0xE2, 0x63, 0x17, 0x2B, 0xE0, 0x03, 0x1C, 0xA1, 0xE6, + 0x48, 0x0C, 0xD8, 0xEB, 0x26, 0xFD, 0xF4, 0xF0, 0xD6, 0xF6, 0x20, 0xF3, + 0xD2, 0xF7, 0x25, 0xEF, 0x2F, 0xF6, 0xF1, 0xEE, 0xFF, 0xF6, 0xD1, 0xF2, + 0xAF, 0x05, 0xC9, 0xFA, 0x30, 0x0D, 0xC7, 0xF7, 0xCD, 0x00, 0xDE, 0xF4, + 0xDB, 0xF8, 0x08, 0x01, 0x1A, 0xFA, 0x57, 0x0B, 0x82, 0xF3, 0x4C, 0x0E, + 0xA4, 0xF2, 0x33, 0x11, 0x5F, 0xFC, 0x3B, 0x14, 0xF1, 0x03, 0x42, 0x17, + 0x5D, 0x04, 0x40, 0x18, 0xDE, 0x01, 0x13, 0x21, 0xD8, 0x09, 0xD6, 0x2D, + 0x69, 0x17, 0xD0, 0x2F, 0xC2, 0x27, 0x26, 0x37, 0xFE, 0x30, 0xA1, 0x3D, + 0xB9, 0x32, 0x28, 0x3C, 0x1E, 0x42, 0xDC, 0x41, 0x18, 0x57, 0x09, 0x40, + 0xC5, 0x62, 0x5D, 0x38, 0x51, 0x53, 0x18, 0x38, 0x72, 0x33, 0xE2, 0x37, + 0x8C, 0x26, 0xA3, 0x37, 0xF7, 0x32, 0x9C, 0x3E, 0xA3, 0x45, 0x68, 0x3B, + 0x79, 0x43, 0xAE, 0x30, 0xBC, 0x3E, 0x9C, 0x30, 0xE1, 0x44, 0x07, 0x2C, + 0xC6, 0x35, 0xF3, 0x22, 0xF9, 0x19, 0x60, 0x21, 0xC1, 0x0E, 0x40, 0x20, + 0xDF, 0x08, 0xEA, 0x19, 0xBD, 0x0A, 0x6C, 0x0D, 0xDE, 0x08, 0xA5, 0xF6, + 0x9E, 0xF8, 0xD2, 0xEC, 0x8B, 0xEF, 0xA0, 0xF3, 0xCA, 0xED, 0x60, 0xFC, + 0xAE, 0xEE, 0xD9, 0x06, 0x71, 0xF5, 0x01, 0x04, 0xD1, 0xFD, 0x61, 0xFB, + 0x8C, 0x02, 0x08, 0xFB, 0x53, 0x08, 0xFD, 0xF6, 0x92, 0x08, 0x93, 0xED, + 0x5B, 0x02, 0x4E, 0xE6, 0x35, 0xFB, 0x4F, 0xE9, 0x4E, 0xF5, 0x61, 0xED, + 0xA7, 0xF6, 0xD0, 0xE3, 0x0C, 0xFB, 0xF6, 0xDF, 0xC1, 0x04, 0x83, 0xE2, + 0x4E, 0x0D, 0xB2, 0xDE, 0x93, 0x02, 0x04, 0xE6, 0xE9, 0xF8, 0x3D, 0xFA, + 0x87, 0xFD, 0xAF, 0x00, 0xF5, 0x06, 0x40, 0xFB, 0x7D, 0x1C, 0xDB, 0xFF, + 0xB1, 0x29, 0x15, 0x06, 0x6B, 0x17, 0x05, 0x05, 0xDC, 0x09, 0x92, 0x0D, + 0x3E, 0x02, 0x94, 0x10, 0x0B, 0xF8, 0xD2, 0x03, 0xD3, 0x00, 0x8F, 0x07, + 0x41, 0x02, 0x46, 0x11, 0x57, 0xFB, 0x2A, 0x11, 0x53, 0x01, 0x53, 0x0E, + 0x48, 0xFD, 0xDC, 0x10, 0x3C, 0xE9, 0xF0, 0x11, 0xD5, 0xDA, 0x79, 0x16, + 0x7B, 0xE5, 0xF6, 0x2B, 0xF1, 0xF8, 0xF3, 0x33, 0x09, 0x06, 0x0A, 0x30, + 0x3B, 0x14, 0x3D, 0x2C, 0xB1, 0x21, 0xA2, 0x24, 0xBA, 0x31, 0x7D, 0x25, + 0x53, 0x38, 0x72, 0x2C, 0x3D, 0x2E, 0x69, 0x38, 0xA5, 0x2E, 0xCD, 0x46, + 0x1A, 0x38, 0x61, 0x41, 0x2A, 0x40, 0x73, 0x2C, 0x10, 0x48, 0x6A, 0x18, + 0xE4, 0x48, 0x02, 0x17, 0x36, 0x43, 0x78, 0x21, 0x04, 0x36, 0x1A, 0x25, + 0x63, 0x31, 0x1A, 0x22, 0xF7, 0x3D, 0xDE, 0x26, 0xE6, 0x43, 0x86, 0x32, + 0xA1, 0x41, 0x3B, 0x34, 0xFC, 0x42, 0xF5, 0x37, 0xE5, 0x31, 0x92, 0x2E, + 0xDF, 0x1E, 0x40, 0x20, 0xAB, 0x2B, 0x9E, 0x26, 0x4C, 0x2F, 0x2A, 0x22, + 0x65, 0x2A, 0x72, 0x1F, 0xDD, 0x3E, 0x8C, 0x33, 0x1C, 0x41, 0xE3, 0x37, + 0xAD, 0x25, 0x77, 0x28, 0x21, 0x0E, 0x14, 0x2B, 0xCB, 0x05, 0xAD, 0x39, + 0x63, 0x0B, 0x22, 0x3B, 0x6A, 0x1B, 0xA5, 0x3E, 0x31, 0x21, 0x36, 0x36, + 0x3D, 0x17, 0xBB, 0x1F, 0xF5, 0x09, 0xF0, 0x11, 0xB6, 0xFD, 0x69, 0x0B, + 0x9B, 0x03, 0x39, 0x19, 0x35, 0x0C, 0x46, 0x29, 0x8C, 0x0A, 0xD0, 0x2F, + 0x06, 0x03, 0x03, 0x2D, 0xD5, 0x06, 0x79, 0x22, 0x95, 0x0A, 0xB7, 0x13, + 0x5F, 0xFB, 0xF2, 0x00, 0xD4, 0xFF, 0x7F, 0x06, 0x82, 0x0D, 0xC4, 0x17, + 0xC6, 0x0B, 0x93, 0x1B, 0x47, 0x08, 0xB1, 0x18, 0x87, 0x01, 0x1E, 0x1A, + 0x88, 0xFD, 0xED, 0x10, 0xC7, 0x04, 0x55, 0x00, 0xB4, 0x0C, 0x29, 0xFE, + 0x23, 0x0A, 0xA9, 0xFF, 0xB4, 0xFB, 0xA1, 0xFE, 0x64, 0xF9, 0xBD, 0x09, + 0x16, 0x06, 0x2E, 0x18, 0x4A, 0x0D, 0x6F, 0x1D, 0x2B, 0x14, 0xEE, 0x21, + 0x12, 0x13, 0x84, 0x29, 0x84, 0xFF, 0xFE, 0x28, 0x16, 0x00, 0x19, 0x28, + 0x37, 0x19, 0x9C, 0x32, 0x63, 0x1B, 0xE1, 0x33, 0xD7, 0x18, 0x6F, 0x27, + 0xD2, 0x20, 0x3B, 0x1B, 0x45, 0x18, 0x1C, 0x1C, 0x1F, 0x13, 0x11, 0x1C, + 0xC6, 0x1F, 0xA6, 0x18, 0x05, 0x25, 0xE8, 0x16, 0x26, 0x1D, 0xD3, 0x11, + 0x35, 0x13, 0x2E, 0x12, 0x64, 0x10, 0xF0, 0x04, 0xB5, 0x13, 0x6A, 0xEB, + 0x2F, 0x14, 0xEC, 0xE5, 0xDE, 0x01, 0x4D, 0xE7, 0x04, 0xE9, 0x68, 0xE4, + 0x60, 0xEC, 0x1B, 0xE8, 0x0F, 0xF8, 0x10, 0xE6, 0x8A, 0xF0, 0xBC, 0xCE, + 0x6E, 0xE7, 0x4B, 0xCB, 0x7A, 0xEC, 0xEA, 0xDE, 0x51, 0xEE, 0x42, 0xD9, + 0x88, 0xF1, 0xA5, 0xDB, 0x62, 0xF2, 0x56, 0xEE, 0x7C, 0xE1, 0xF6, 0xF3, + 0x07, 0xE5, 0xED, 0xF5, 0xD4, 0xFD, 0x75, 0xF8, 0x36, 0x02, 0x17, 0xFD, + 0x33, 0xEE, 0xE0, 0xFC, 0x0C, 0xDF, 0x63, 0x01, 0x37, 0xE1, 0x01, 0x0D, + 0xD2, 0xEA, 0x6D, 0x1A, 0xEC, 0xF5, 0x55, 0x29, 0x8E, 0xF7, 0xD9, 0x2F, + 0xCC, 0xF8, 0xA1, 0x2A, 0x0E, 0x04, 0xBE, 0x1F, 0x29, 0x0A, 0x89, 0x15, + 0xE4, 0x05, 0xE8, 0x06, 0x7D, 0xFE, 0xE3, 0x0D, 0x4D, 0xED, 0x69, 0x1D, + 0x38, 0xE5, 0x05, 0x16, 0xB4, 0xFB, 0x74, 0x12, 0x36, 0x05, 0xA6, 0x08, + 0x66, 0xFE, 0xD1, 0xF0, 0x02, 0x04, 0x17, 0xF0, 0x54, 0x02, 0x84, 0xF8, + 0x94, 0xFA, 0xBD, 0xF8, 0x73, 0xFD, 0x98, 0xFD, 0x24, 0xFD, 0x71, 0xF9, + 0x92, 0xF9, 0x96, 0xEF, 0x02, 0xFD, 0x95, 0xF1, 0x63, 0xF5, 0xAB, 0xEB, + 0x34, 0xE5, 0x0E, 0xE1, 0xEA, 0xDD, 0x56, 0xE2, 0x9A, 0xDA, 0x15, 0xE4, + 0x67, 0xDC, 0x03, 0xDA, 0x87, 0xEB, 0x09, 0xD0, 0x1B, 0xFB, 0x8A, 0xD4, + 0xBC, 0xF2, 0x3D, 0xDD, 0x83, 0xE2, 0x8C, 0xEA, 0xC1, 0xDB, 0xBA, 0xF4, + 0x5B, 0xE2, 0xD9, 0xF8, 0xC3, 0xF5, 0x14, 0xFB, 0xC5, 0xFF, 0x33, 0xF6, + 0x06, 0xF0, 0xA4, 0xE8, 0x19, 0xE5, 0x75, 0xDC, 0x68, 0xF5, 0xB5, 0xDC, + 0x7F, 0x01, 0xEE, 0xDD, 0x45, 0xE9, 0x5D, 0xD6, 0x01, 0xD5, 0x89, 0xE0, + 0x9F, 0xE0, 0x7E, 0xF7, 0x99, 0xE1, 0x2B, 0xF2, 0xF6, 0xD3, 0xB3, 0xD6, + 0x48, 0xD3, 0xC8, 0xCA, 0xB4, 0xD7, 0xAE, 0xCD, 0x44, 0xCA, 0xEC, 0xCB, + 0x53, 0xB1, 0xCD, 0xD2, 0x91, 0xA4, 0xFC, 0xD3, 0xC9, 0xA2, 0xB9, 0xBD, + 0xC5, 0x9D, 0xE8, 0xAA, 0x2F, 0xB1, 0x05, 0xAB, 0x1F, 0xC8, 0x39, 0xAC, + 0xB5, 0xC6, 0x76, 0xAF, 0xAD, 0xBF, 0x45, 0xBA, 0xCE, 0xC5, 0xF1, 0xC0, + 0x46, 0xDA, 0xF0, 0xCB, 0xE9, 0xE0, 0x09, 0xD1, 0xF3, 0xE1, 0xBF, 0xCC, + 0x41, 0xE2, 0x3D, 0xD0, 0x38, 0xDA, 0x68, 0xD4, 0xA5, 0xCE, 0xBC, 0xD3, + 0x80, 0xCD, 0x08, 0xD0, 0x5E, 0xE2, 0x25, 0xD0, 0xB9, 0xE3, 0x9F, 0xD1, + 0xF2, 0xD7, 0x3C, 0xD3, 0x2E, 0xDD, 0x2A, 0xD9, 0x7A, 0xED, 0xA8, 0xD9, + 0xC1, 0x02, 0x7B, 0xD5, 0x4F, 0xFB, 0x2B, 0xD3, 0xDC, 0xE4, 0x0D, 0xDA, + 0x78, 0xEA, 0x82, 0xEF, 0xFC, 0xF9, 0x41, 0xFC, 0xCD, 0x04, 0xBE, 0xF8, + 0x7E, 0x08, 0xDE, 0xF3, 0x20, 0xFE, 0x13, 0xF4, 0xF6, 0xF3, 0x6D, 0x06, + 0x5C, 0xEF, 0xC9, 0x0B, 0x21, 0xEE, 0x2A, 0xFD, 0xF5, 0xF1, 0x9E, 0xF5, + 0x3B, 0x00, 0x35, 0xEB, 0x7A, 0x10, 0x90, 0xE2, 0x5B, 0x19, 0xA2, 0xE8, + 0xEF, 0x10, 0xD8, 0xF9, 0xDA, 0x02, 0x83, 0x0B, 0xE6, 0x04, 0x89, 0x0F, + 0xB3, 0x10, 0x34, 0x0F, 0x91, 0x13, 0xF6, 0x14, 0xCE, 0x06, 0x6A, 0x10, + 0xEC, 0x01, 0xBE, 0x0A, 0x35, 0x07, 0xA4, 0x10, 0xED, 0x07, 0x79, 0x10, + 0xBC, 0x0F, 0x4A, 0x08, 0xAE, 0x11, 0xD6, 0x08, 0x00, 0x00, 0x3D, 0x04, + 0xC1, 0xF1, 0x18, 0xF5, 0xD3, 0xEE, 0x39, 0xE6, 0xA2, 0xF1, 0xC1, 0xDB, + 0xC1, 0xF2, 0xB0, 0xD7, 0xA3, 0xEE, 0x27, 0xCF, 0xF9, 0xDF, 0x58, 0xC9, + 0x9E, 0xCC, 0x13, 0xD2, 0x39, 0xCC, 0xDD, 0xDA, 0x01, 0xD9, 0x73, 0xE0, + 0xC5, 0xDA, 0x09, 0xDB, 0xFE, 0xCD, 0xC7, 0xC4, 0xE2, 0xC1, 0x0F, 0xB1, + 0x35, 0xC1, 0x0E, 0xAC, 0xD4, 0xC9, 0x16, 0xB1, 0x1D, 0xCD, 0x40, 0xB6, + 0x2D, 0xCF, 0xDB, 0xBA, 0xFD, 0xDF, 0x8F, 0xBE, 0xA9, 0xEA, 0x3B, 0xBF, + 0x92, 0xDD, 0x80, 0xC4, 0xC0, 0xC5, 0x16, 0xCD, 0xA9, 0xB9, 0xC8, 0xD2, + 0x2A, 0xCA, 0x29, 0xD5, 0xAD, 0xE5, 0xFF, 0xD1, 0x9C, 0xEA, 0xFB, 0xC5, + 0xE3, 0xD7, 0x88, 0xBB, 0xE5, 0xC6, 0x02, 0xC2, 0x18, 0xCF, 0xCF, 0xC7, + 0x92, 0xE5, 0xA6, 0xD1, 0xC9, 0xE8, 0x99, 0xD4, 0x18, 0xDB, 0x94, 0xCD, + 0x57, 0xDF, 0x88, 0xD9, 0xE9, 0xE6, 0x6C, 0xDD, 0x1C, 0xE5, 0x97, 0xD8, + 0x5E, 0xE5, 0xEB, 0xE0, 0x86, 0xDE, 0xA3, 0xE2, 0xA0, 0xDB, 0xA1, 0xE1, + 0x54, 0xDD, 0x23, 0xEC, 0x77, 0xDC, 0x2A, 0xF2, 0xB6, 0xDF, 0xEB, 0xEE, + 0x8D, 0xE6, 0x30, 0xEB, 0xB9, 0xE9, 0xCD, 0xDE, 0x43, 0xE6, 0x55, 0xD1, + 0x17, 0xE4, 0xFB, 0xD3, 0x09, 0xDD, 0xC3, 0xE2, 0x6E, 0xD3, 0x0C, 0xEE, + 0xF2, 0xDC, 0x62, 0xF1, 0x98, 0xF4, 0xAB, 0xF5, 0x29, 0x07, 0x0D, 0xFA, + 0xF2, 0x13, 0x1D, 0x00, 0xD5, 0x24, 0x49, 0x16, 0x20, 0x29, 0x77, 0x29, + 0x8C, 0x1C, 0xFD, 0x24, 0x8E, 0x25, 0xE9, 0x27, 0x53, 0x3F, 0xC3, 0x2D, + 0x61, 0x40, 0xD5, 0x26, 0xA7, 0x2E, 0x02, 0x26, 0x69, 0x2F, 0x96, 0x2E, + 0x52, 0x42, 0x0B, 0x36, 0x17, 0x42, 0x15, 0x39, 0xF4, 0x2F, 0x2E, 0x3A, + 0x9F, 0x2A, 0x20, 0x3A, 0x6A, 0x2A, 0xE7, 0x31, 0xC0, 0x28, 0x81, 0x27, + 0x6F, 0x29, 0x8D, 0x20, 0x39, 0x1F, 0xFC, 0x1E, 0xD7, 0x14, 0x8D, 0x29, + 0x57, 0x1E, 0xC3, 0x34, 0x34, 0x33, 0x72, 0x2F, 0x26, 0x2B, 0x3D, 0x1B, + 0x13, 0x1C, 0xAE, 0x10, 0xF0, 0x27, 0xBC, 0x18, 0x2C, 0x2D, 0x05, 0x18, + 0x7A, 0x28, 0x13, 0x1B, 0x0E, 0x22, 0x46, 0x24, 0x22, 0x1B, 0x15, 0x1B, + 0xBC, 0x21, 0xBB, 0x17, 0xBA, 0x32, 0xDC, 0x1A, 0x8B, 0x3D, 0x87, 0x18, + 0xB4, 0x3C, 0x39, 0x17, 0x5B, 0x35, 0x49, 0x22, 0xDA, 0x29, 0x58, 0x30, + 0xB2, 0x2B, 0x7C, 0x39, 0xB3, 0x3E, 0xF0, 0x42, 0x18, 0x46, 0x6B, 0x3F, + 0xC2, 0x49, 0xCC, 0x3A, 0x14, 0x4D, 0x95, 0x3C, 0x3F, 0x42, 0x65, 0x41, + 0xEF, 0x33, 0x10, 0x4B, 0x0B, 0x33, 0x5D, 0x59, 0xA3, 0x2A, 0x45, 0x56, + 0xE5, 0x16, 0xF7, 0x38, 0x25, 0x1C, 0x94, 0x2F, 0x39, 0x28, 0x02, 0x31, + 0xAD, 0x28, 0x70, 0x28, 0x8D, 0x1D, 0x87, 0x1E, 0x11, 0x0D, 0x7F, 0x19, + 0x82, 0x05, 0xD9, 0x1B, 0x95, 0x04, 0xF4, 0x1D, 0xCE, 0x02, 0x8C, 0x18, + 0x0F, 0xFA, 0xDE, 0x0A, 0x3C, 0xF7, 0x31, 0xFF, 0x73, 0xFD, 0x03, 0xF1, + 0xFC, 0x00, 0xC6, 0xE7, 0x8C, 0xFE, 0x63, 0xE7, 0x7C, 0xF9, 0x47, 0xE5, + 0x20, 0x04, 0xAB, 0xF2, 0x77, 0x18, 0x71, 0xF5, 0x69, 0x1F, 0x7F, 0xE5, + 0x3E, 0x14, 0x7E, 0xE6, 0x2C, 0xF1, 0xBA, 0xE3, 0xC9, 0xDB, 0x28, 0xE0, + 0x36, 0xE9, 0x78, 0xE6, 0x76, 0xFA, 0xDE, 0xE0, 0xB9, 0x00, 0x62, 0xD2, + 0x3A, 0xFF, 0x66, 0xCC, 0xEB, 0xFB, 0xEE, 0xCC, 0x4F, 0xEF, 0xA0, 0xD8, + 0xC1, 0xDF, 0x30, 0xE8, 0xAA, 0xDE, 0x70, 0xF2, 0xC5, 0xE6, 0xC8, 0xF3, + 0xCF, 0xE1, 0xD9, 0xE6, 0x0F, 0xDB, 0x96, 0xE2, 0xBC, 0xDC, 0x60, 0xEA, + 0x84, 0xE2, 0x06, 0xF2, 0x45, 0xFB, 0x19, 0x00, 0x66, 0x14, 0xE9, 0x13, + 0x01, 0x1A, 0x8B, 0x25, 0x1A, 0x14, 0x7B, 0x33, 0x8E, 0x08, 0x92, 0x31, + 0x0A, 0x03, 0xCF, 0x2D, 0x9C, 0x0F, 0x4F, 0x3A, 0x6A, 0x26, 0x78, 0x41, + 0xE6, 0x32, 0x8E, 0x41, 0x9F, 0x39, 0x97, 0x48, 0x59, 0x3A, 0x83, 0x50, + 0x39, 0x36, 0x93, 0x56, 0xB2, 0x39, 0x7A, 0x5B, 0x2D, 0x41, 0x23, 0x56, + 0x68, 0x43, 0xF0, 0x4D, 0x33, 0x37, 0xC2, 0x4D, 0x53, 0x2B, 0x8B, 0x4B, + 0x79, 0x38, 0x53, 0x40, 0xB4, 0x44, 0x1B, 0x36, 0xF6, 0x3B, 0xA8, 0x33, + 0xA2, 0x34, 0x44, 0x33, 0x13, 0x32, 0x44, 0x33, 0x20, 0x32, 0x61, 0x2C, + 0xCC, 0x30, 0x47, 0x23, 0xA2, 0x28, 0x02, 0x21, 0xF4, 0x15, 0x9E, 0x1A, + 0x6B, 0x12, 0x39, 0x15, 0x1E, 0x19, 0x98, 0x12, 0xE1, 0x0A, 0x88, 0x09, + 0x27, 0x01, 0x3B, 0x0A, 0xC0, 0xFB, 0xDD, 0x0D, 0xC2, 0xF9, 0x7E, 0x00, + 0x06, 0x05, 0x8E, 0xFA, 0x01, 0xFA, 0x4A, 0xFA, 0xAD, 0xE0, 0x43, 0xF2, + 0x5A, 0xE3, 0x8B, 0xF3, 0xE6, 0xF2, 0xD2, 0xF4, 0xD0, 0xF8, 0x1F, 0xF3, + 0xD0, 0xFC, 0xFA, 0xF3, 0x7B, 0x01, 0x09, 0xF4, 0x87, 0xFF, 0x5D, 0xF7, + 0x5E, 0x01, 0xCC, 0xF3, 0x5F, 0x0E, 0xE6, 0xF0, 0x20, 0x19, 0xBE, 0xFC, + 0x28, 0x18, 0x55, 0x00, 0xE7, 0x0A, 0xDA, 0xF4, 0xBA, 0xF9, 0x84, 0xE8, + 0x45, 0xEE, 0x20, 0xED, 0x40, 0xF4, 0xCA, 0xFE, 0x10, 0xFB, 0xAF, 0x03, + 0x01, 0xFA, 0xE4, 0xFB, 0xB1, 0xFE, 0x75, 0xF5, 0x90, 0xFB, 0x55, 0xF0, + 0x44, 0xF6, 0x24, 0xF5, 0x55, 0xEE, 0x28, 0xFE, 0x78, 0xCE, 0x52, 0xF6, + 0x9F, 0xBB, 0xD4, 0xFE, 0xE0, 0xC6, 0xA6, 0x08, 0x98, 0xD0, 0x2E, 0xFB, + 0x6F, 0xDA, 0xC5, 0xFE, 0xB8, 0xDF, 0xCC, 0x04, 0x43, 0xD9, 0x81, 0xFC, + 0x2A, 0xD4, 0x88, 0x00, 0x4C, 0xD5, 0x32, 0x07, 0x91, 0xD9, 0x39, 0x0C, + 0x37, 0xD5, 0x24, 0x0C, 0x2D, 0xDD, 0x62, 0x03, 0x37, 0xFE, 0x16, 0x06, + 0x15, 0x06, 0x10, 0x06, 0x91, 0xF6, 0x0B, 0x05, 0xB5, 0xFA, 0x3D, 0x17, + 0x2E, 0x14, 0xAB, 0x23, 0x39, 0x2A, 0xAA, 0x1C, 0xAD, 0x3D, 0xAB, 0x21, + 0xFC, 0x47, 0x2E, 0x2F, 0x81, 0x43, 0xDE, 0x36, 0xBB, 0x40, 0x90, 0x3D, + 0xEB, 0x3C, 0x0A, 0x3A, 0x2D, 0x40, 0x16, 0x36, 0x35, 0x48, 0x4E, 0x2F, + 0x88, 0x4C, 0x8F, 0x24, 0x60, 0x52, 0x4F, 0x21, 0xC2, 0x52, 0x37, 0x1C, + 0xCC, 0x4A, 0x3A, 0x19, 0xBF, 0x40, 0xEB, 0x22, 0xC0, 0x2D, 0xD4, 0x2A, + 0x7A, 0x17, 0x74, 0x24, 0xC2, 0x0D, 0x25, 0x20, 0x51, 0x15, 0x5D, 0x19, + 0x1B, 0x1C, 0x0A, 0x0C, 0xF7, 0x17, 0x20, 0x0B, 0x2A, 0x0D, 0x7F, 0x0C, + 0x3E, 0xFF, 0xF0, 0x0E, 0xF2, 0xFA, 0x3E, 0x1B, 0xDE, 0xFE, 0xC2, 0x1B, + 0x6C, 0x05, 0xDA, 0x0F, 0x2D, 0x10, 0xCE, 0x05, 0x8A, 0x14, 0x32, 0xFF, + 0x9D, 0x0F, 0x94, 0xFE, 0x74, 0xFC, 0x96, 0x06, 0x88, 0xE1, 0x9C, 0x07, + 0xBC, 0xDF, 0xD3, 0x03, 0x89, 0xE9, 0x63, 0xFD, 0xD8, 0xE9, 0x47, 0xEF, + 0x5D, 0xE4, 0x21, 0xEE, 0xA5, 0xDA, 0x6F, 0xEB, 0xD8, 0xD4, 0x62, 0xE2, + 0x29, 0xD6, 0x19, 0xDC, 0x88, 0xDB, 0x15, 0xD8, 0xE7, 0xD7, 0xF1, 0xDA, + 0xF6, 0xCD, 0xC6, 0xD6, 0xF3, 0xD0, 0x46, 0xD1, 0x70, 0xD7, 0x6A, 0xCB, + 0x7B, 0xD2, 0x38, 0xC1, 0xA3, 0xC9, 0xD9, 0xC8, 0xCF, 0xC3, 0x50, 0xD8, + 0xF4, 0xC8, 0x53, 0xDF, 0x6D, 0xD7, 0xBF, 0xE7, 0x1E, 0xDC, 0xB5, 0xE5, + 0x42, 0xDA, 0x9D, 0xD5, 0xD8, 0xD9, 0x5B, 0xD7, 0x64, 0xD1, 0x14, 0xE1, + 0xC8, 0xC7, 0x7C, 0xE0, 0x40, 0xD0, 0xCA, 0xE4, 0xDF, 0xE2, 0x95, 0xE1, + 0x53, 0xEB, 0x43, 0xD0, 0x99, 0xEE, 0x8C, 0xCE, 0xA0, 0xF2, 0x1B, 0xDC, + 0xA6, 0xEA, 0x55, 0xE9, 0x1B, 0xDD, 0x67, 0xF1, 0xF1, 0xE0, 0xA9, 0xF7, + 0x6D, 0xE4, 0x0C, 0xF3, 0x6A, 0xDA, 0x79, 0xD8, 0x41, 0xDB, 0x9D, 0xC8, + 0xA5, 0xDE, 0x82, 0xC8, 0xE9, 0xE0, 0xE8, 0xC5, 0x96, 0xEA, 0x89, 0xCC, + 0xF8, 0xF2, 0x30, 0xD6, 0x98, 0xF4, 0x23, 0xCF, 0xF4, 0xDC, 0x3B, 0xC9, + 0x67, 0xC3, 0xC2, 0xCC, 0x82, 0xC8, 0x4B, 0xC9, 0x82, 0xCE, 0xB2, 0xC5, + 0xD0, 0xC8, 0x8D, 0xCF, 0xBC, 0xC2, 0xDA, 0xDE, 0x8E, 0xC1, 0x02, 0xEE, + 0x33, 0xD4, 0x0A, 0xFF, 0x1E, 0xE7, 0x47, 0x06, 0x3D, 0xEA, 0x08, 0x06, + 0x09, 0xF1, 0xB3, 0x05, 0x43, 0xFD, 0x70, 0x05, 0x97, 0x06, 0x91, 0x07, + 0xCE, 0x10, 0x37, 0x0B, 0x30, 0x08, 0xE2, 0x0B, 0x24, 0xF9, 0xF2, 0x0D, + 0xBF, 0x12, 0xDD, 0x1A, 0xFA, 0x2B, 0xCA, 0x25, 0x4E, 0x24, 0x4A, 0x21, + 0x24, 0x15, 0x92, 0x21, 0xC7, 0x0B, 0xD3, 0x23, 0xF2, 0x11, 0x71, 0x1B, + 0xCD, 0x17, 0x81, 0x16, 0xE4, 0x22, 0x9E, 0x13, 0xA5, 0x38, 0x29, 0x11, + 0xB7, 0x3F, 0x56, 0x15, 0x75, 0x37, 0x53, 0x1A, 0xA6, 0x26, 0x10, 0x15, + 0xB6, 0x1A, 0x67, 0x12, 0xC8, 0x14, 0xA4, 0x13, 0xBC, 0x0E, 0xE6, 0x0C, + 0x14, 0x0C, 0x83, 0x08, 0x01, 0x08, 0x16, 0x02, 0x80, 0x0D, 0xA8, 0xF8, + 0xA9, 0x0A, 0x84, 0xF2, 0x02, 0x01, 0xA3, 0xEC, 0x0A, 0x06, 0xF8, 0xEF, + 0xF1, 0xFE, 0xF2, 0xF4, 0x43, 0xF7, 0x0A, 0xF2, 0x7C, 0xFC, 0x57, 0xF1, + 0xBB, 0xFB, 0x37, 0xEC, 0xD5, 0xF0, 0x73, 0xE1, 0x52, 0xE8, 0x30, 0xDA, + 0xBE, 0xE4, 0xEB, 0xD3, 0xFB, 0xDD, 0x21, 0xDE, 0xE9, 0xDB, 0x7C, 0xF2, + 0x34, 0xE0, 0x15, 0xF4, 0x61, 0xFB, 0xC6, 0xF7, 0xBB, 0x1D, 0xB0, 0xFD, + 0x96, 0x1B, 0x3B, 0xF2, 0x0D, 0x08, 0xCF, 0xEE, 0x05, 0xFC, 0x2D, 0xF8, + 0x37, 0xF9, 0x30, 0xF1, 0x55, 0x00, 0xA3, 0xEA, 0x22, 0x00, 0x3E, 0xEB, + 0x71, 0xF2, 0x22, 0xE4, 0xE8, 0xE9, 0x21, 0xE3, 0x05, 0xE9, 0x81, 0xE0, + 0x96, 0xE9, 0x33, 0xD4, 0x5D, 0xDB, 0xDB, 0xD5, 0xBF, 0xC5, 0xF1, 0xDC, + 0xFB, 0xC0, 0xE6, 0xD8, 0x65, 0xC7, 0x18, 0xD2, 0x25, 0xC9, 0x09, 0xC6, + 0x1D, 0xC5, 0xE8, 0xC2, 0xBF, 0xC6, 0x38, 0xCA, 0xD2, 0xC3, 0x6C, 0xCC, + 0x3E, 0xBB, 0xC3, 0xCF, 0xBA, 0xC0, 0x2D, 0xD7, 0x7B, 0xC9, 0x42, 0xD9, + 0x33, 0xC6, 0xCD, 0xD4, 0x44, 0xC0, 0x28, 0xCB, 0xA6, 0xBD, 0x60, 0xC4, + 0x0B, 0xC3, 0x39, 0xCC, 0x39, 0xCC, 0x4C, 0xD4, 0xF5, 0xD5, 0x68, 0xDD, + 0x20, 0xE0, 0xB1, 0xE2, 0x39, 0xF3, 0xC1, 0xDF, 0xB3, 0x06, 0x7F, 0xF0, + 0x60, 0x01, 0x0D, 0xF6, 0xCF, 0xF4, 0x56, 0xED, 0x7C, 0xF8, 0xC6, 0xFB, + 0xE3, 0x05, 0x91, 0x0D, 0x50, 0x17, 0xCC, 0x11, 0x76, 0x1F, 0xEC, 0x09, + 0xAA, 0x1A, 0xA5, 0xFC, 0x7A, 0x20, 0xB0, 0xFA, 0x99, 0x2D, 0x2D, 0xFE, + 0x26, 0x26, 0x4D, 0xF5, 0xAF, 0x16, 0x54, 0xFA, 0xAB, 0x0F, 0x5C, 0x0B, + 0x1D, 0x14, 0x16, 0x0E, 0x1B, 0x23, 0x99, 0x13, 0x40, 0x28, 0xDA, 0x10, + 0x75, 0x1C, 0xF8, 0x01, 0x0E, 0x08, 0xC7, 0x01, 0xE8, 0xFF, 0x64, 0x10, + 0xD9, 0xFE, 0xB8, 0x1D, 0x38, 0xFC, 0x70, 0x27, 0x4E, 0xFB, 0xA3, 0x2B, + 0xBF, 0xF5, 0x94, 0x27, 0x77, 0x02, 0xB0, 0x29, 0x22, 0x12, 0x9A, 0x21, + 0x46, 0x0A, 0x27, 0x0F, 0xD6, 0x0B, 0x2A, 0x19, 0xD3, 0x14, 0xA8, 0x2E, + 0x24, 0x14, 0x0C, 0x29, 0xF9, 0x13, 0xAA, 0x1A, 0x19, 0x15, 0x03, 0x0F, + 0xFA, 0x09, 0x9A, 0xFE, 0xFA, 0xF9, 0x15, 0xF6, 0x5A, 0xF2, 0xDC, 0xF3, + 0x3F, 0xEE, 0x7D, 0xEC, 0x82, 0x03, 0xB6, 0xE3, 0x03, 0x17, 0x7E, 0xD7, + 0x46, 0x06, 0xB4, 0xC9, 0x3F, 0xF5, 0xAB, 0xC5, 0xD8, 0xEA, 0x64, 0xCB, + 0x9C, 0xE7, 0x71, 0xD8, 0x1D, 0xF3, 0x21, 0xE6, 0x71, 0xF4, 0xE8, 0xE4, + 0xC2, 0xF4, 0x94, 0xE4, 0x95, 0xFA, 0x80, 0xE4, 0x51, 0xF1, 0x51, 0xD1, + 0xA9, 0xEF, 0x60, 0xCA, 0x65, 0xFA, 0xF0, 0xD6, 0x05, 0xFD, 0x11, 0xE8, + 0xAC, 0x00, 0x98, 0xF5, 0xB3, 0xFD, 0xA6, 0xFD, 0x12, 0xF0, 0x5F, 0x07, + 0x65, 0xEA, 0xC9, 0x03, 0xA6, 0xF7, 0x8D, 0x00, 0xC9, 0x0A, 0x9F, 0x00, + 0x26, 0x09, 0x01, 0xFC, 0x7F, 0xF7, 0xC9, 0x05, 0xEA, 0xEF, 0xA9, 0x11, + 0x51, 0xFC, 0x93, 0x1A, 0x7A, 0x0C, 0xD3, 0x23, 0x6C, 0x17, 0xEA, 0x21, + 0x65, 0x10, 0x05, 0x17, 0x24, 0x02, 0x05, 0x15, 0x9E, 0xFF, 0xC9, 0x13, + 0x49, 0x05, 0x47, 0x10, 0x31, 0x0D, 0x52, 0x15, 0xD2, 0x10, 0x3D, 0x16, + 0xAD, 0x11, 0xD2, 0x17, 0x77, 0x0B, 0xDD, 0x16, 0x19, 0xFE, 0x15, 0x0A, + 0x68, 0xF3, 0x15, 0x00, 0x2E, 0xFA, 0x41, 0xFC, 0x7D, 0x07, 0x1F, 0x02, + 0xA1, 0x06, 0x87, 0x0C, 0x46, 0x0D, 0xA6, 0x0D, 0x66, 0x19, 0xF7, 0x14, + 0x68, 0x1F, 0x04, 0x1E, 0x68, 0x21, 0x2C, 0x1A, 0x71, 0x1A, 0x92, 0x1D, + 0x7D, 0x19, 0xE0, 0x23, 0x28, 0x1C, 0x7B, 0x2B, 0xB5, 0x20, 0xA0, 0x35, + 0x10, 0x2B, 0x37, 0x36, 0xC5, 0x28, 0xD0, 0x26, 0xF9, 0x29, 0xBA, 0x1D, + 0xA3, 0x38, 0xE2, 0x2B, 0xED, 0x31, 0xE2, 0x2C, 0xD2, 0x21, 0xBF, 0x22, + 0x65, 0x2F, 0xEE, 0x2C, 0x2E, 0x41, 0xEB, 0x32, 0xED, 0x36, 0xA7, 0x26, + 0x5C, 0x2E, 0x6F, 0x24, 0x33, 0x1B, 0xC6, 0x1C, 0x10, 0x0C, 0x93, 0x0F, + 0x10, 0x1F, 0x02, 0x16, 0x30, 0x20, 0x04, 0x15, 0x4D, 0x09, 0x42, 0x00, + 0xF1, 0xF9, 0x7C, 0xF2, 0x91, 0xF4, 0x4C, 0xE9, 0x67, 0xFB, 0x56, 0xDE, + 0x70, 0x03, 0x32, 0xE4, 0xE4, 0x01, 0xDF, 0xF3, 0x2A, 0xFD, 0x0A, 0x04, + 0xBA, 0xED, 0x3A, 0x08, 0x3E, 0xEC, 0xA4, 0x00, 0x93, 0x05, 0x87, 0x0A, + 0xD2, 0x0E, 0xF0, 0x0C, 0x67, 0x08, 0x9E, 0x01, 0x3E, 0x0D, 0x58, 0x01, + 0xF4, 0x07, 0xAC, 0x05, 0xB0, 0xF2, 0x93, 0x14, 0xB7, 0xEB, 0xBD, 0x2D, + 0xB4, 0xF3, 0x07, 0x33, 0xE3, 0x03, 0x4C, 0x22, 0xEA, 0x19, 0x18, 0x20, + 0x0E, 0x22, 0xE4, 0x2A, 0xEC, 0x20, 0x38, 0x33, 0x83, 0x1A, 0xDF, 0x44, + 0x29, 0x1B, 0xC1, 0x52, 0xB8, 0x39, 0x8F, 0x57, 0x9A, 0x51, 0x31, 0x58, + 0x1F, 0x3F, 0xC9, 0x43, 0xA4, 0x17, 0xA7, 0x25, 0xA3, 0x0B, 0xE1, 0x20, + 0x64, 0x18, 0x15, 0x25, 0xAC, 0x17, 0x6C, 0x1B, 0x4F, 0x21, 0xB6, 0x1A, + 0xDB, 0x1F, 0x48, 0x0A, 0x14, 0x09, 0xE2, 0xFA, 0x80, 0x0C, 0x64, 0x04, + 0x8A, 0x13, 0x3F, 0x01, 0x77, 0x0B, 0x9A, 0x02, 0x28, 0x02, 0x92, 0x0E, + 0x89, 0xFE, 0x58, 0x14, 0x9B, 0x00, 0xA5, 0x0F, 0xDC, 0x0B, 0x3C, 0x06, + 0xB3, 0x10, 0x3B, 0xFE, 0xCE, 0x0A, 0xAA, 0xE9, 0x56, 0x0A, 0x43, 0xD4, + 0x68, 0x0E, 0xE2, 0xE6, 0x80, 0x09, 0x84, 0x08, 0xBE, 0xFC, 0xD6, 0x04, + 0xD1, 0x01, 0xEF, 0x02, 0x1A, 0x0C, 0xBF, 0x03, 0x62, 0x1A, 0x8F, 0xFE, + 0x66, 0x21, 0xC8, 0x04, 0xF2, 0x0D, 0x6B, 0x0C, 0x97, 0xFE, 0x61, 0x1C, + 0x52, 0xFE, 0x75, 0x1E, 0xE4, 0x08, 0x21, 0x15, 0xF8, 0x0B, 0xDB, 0x14, + 0x8D, 0x04, 0x2F, 0x0A, 0x0C, 0x04, 0x1A, 0x01, 0xEB, 0x00, 0x2C, 0x0F, + 0x5A, 0x01, 0x77, 0x1D, 0xAC, 0x00, 0xDA, 0x1A, 0xDC, 0xF1, 0x4E, 0x18, + 0xB4, 0xEA, 0x16, 0x20, 0x5F, 0xF1, 0x94, 0x28, 0x19, 0xF2, 0xAC, 0x17, + 0x54, 0xF4, 0xB5, 0x02, 0x1C, 0x03, 0x71, 0x12, 0xBC, 0xFE, 0xB0, 0x1D, + 0xDD, 0xFA, 0x0E, 0x1B, 0x24, 0x11, 0x1A, 0x26, 0xF4, 0x1E, 0xC7, 0x26, + 0x95, 0x1B, 0xA5, 0x1A, 0xAA, 0x19, 0xDC, 0x18, 0x6D, 0x1B, 0x25, 0x1A, + 0x33, 0x1A, 0x1B, 0x1E, 0xC4, 0x20, 0x65, 0x2D, 0xF8, 0x22, 0xA0, 0x2E, + 0x36, 0x27, 0xBE, 0x28, 0xE7, 0x30, 0xC0, 0x23, 0xF2, 0x2B, 0xBF, 0x18, + 0x98, 0x20, 0x8D, 0x1B, 0x58, 0x0E, 0x3D, 0x1C, 0x82, 0x07, 0xA3, 0x14, + 0x4B, 0x1B, 0x61, 0x14, 0x97, 0x28, 0x19, 0x0D, 0x4F, 0x1E, 0xCB, 0xFB, + 0x63, 0x09, 0x88, 0xEA, 0x0D, 0xFF, 0xBE, 0xE0, 0xF1, 0xFB, 0xD0, 0xE4, + 0x4D, 0xF8, 0x18, 0xEF, 0xEC, 0xF7, 0x29, 0xF4, 0xB1, 0xEF, 0x70, 0xF4, + 0x00, 0xDF, 0x00, 0xED, 0x8E, 0xE1, 0x6A, 0xEB, 0x88, 0xF3, 0x49, 0xF1, + 0x73, 0xF6, 0xAC, 0xE9, 0x5F, 0x00, 0x62, 0xEA, 0xEA, 0x15, 0x10, 0xFB, + 0x30, 0x16, 0x64, 0xFD, 0x2B, 0x0A, 0xF7, 0xFB, 0x13, 0x05, 0xBE, 0x05, + 0xF7, 0x0A, 0x80, 0x0A, 0xD6, 0x14, 0xD6, 0x05, 0x04, 0x18, 0xE5, 0x02, + 0xEE, 0x0E, 0x92, 0x07, 0xAF, 0xFB, 0x99, 0x0A, 0x27, 0xEF, 0xA0, 0x0E, + 0x10, 0xE6, 0xF4, 0x10, 0x85, 0xE8, 0xC2, 0x0E, 0x89, 0xFC, 0xC9, 0x0F, + 0x96, 0x04, 0x97, 0x0D, 0x5E, 0xF0, 0x00, 0x09, 0xDA, 0xDC, 0x90, 0x05, + 0xEC, 0xDC, 0x43, 0x0A, 0x59, 0xE8, 0x1E, 0x0D, 0x32, 0xF6, 0x7C, 0x04, + 0x32, 0xF5, 0xE9, 0x02, 0x7C, 0xEA, 0x57, 0x08, 0xDB, 0xDE, 0xD7, 0x07, + 0xDC, 0xD5, 0x6B, 0x01, 0xA5, 0xD9, 0x3A, 0xF7, 0x60, 0xE1, 0x17, 0xF1, + 0x02, 0xE2, 0xEE, 0xEC, 0x70, 0xE9, 0xCA, 0xE4, 0xEF, 0xF6, 0x1B, 0xE5, + 0xC7, 0xF7, 0xE9, 0xEA, 0x12, 0xF3, 0x27, 0xE9, 0x72, 0x04, 0x29, 0xF3, + 0xF6, 0x0C, 0xAC, 0xF9, 0xE6, 0xFA, 0xDF, 0xF7, 0x63, 0xF2, 0x52, 0x02, + 0xF7, 0xF5, 0xA2, 0x01, 0xBF, 0x01, 0x41, 0xFB, 0x46, 0x15, 0x35, 0xF8, + 0x1F, 0x24, 0x89, 0xF2, 0xD8, 0x19, 0x20, 0xFC, 0xFC, 0x08, 0x40, 0x14, + 0xB4, 0x11, 0x6F, 0x19, 0x09, 0x18, 0x3E, 0x06, 0xA5, 0x1D, 0xB5, 0xF7, + 0xE0, 0x29, 0x35, 0xF3, 0x38, 0x1B, 0x54, 0xEF, 0x67, 0x00, 0x1B, 0xEB, + 0xA9, 0xE8, 0x9B, 0xE3, 0x6B, 0xD9, 0xA2, 0xE6, 0xB6, 0xDC, 0x04, 0xEB, + 0xC3, 0xDB, 0xEE, 0xDE, 0x8B, 0xDD, 0xE9, 0xDC, 0x8E, 0xE5, 0xBD, 0xDE, + 0x57, 0xDE, 0x32, 0xD2, 0xA9, 0xCE, 0xDA, 0xCA, 0x69, 0xC6, 0xF5, 0xCE, + 0xE6, 0xC3, 0xA7, 0xCE, 0x9C, 0xC3, 0x78, 0xC5, 0x39, 0xC5, 0x09, 0xC1, + 0xCD, 0xC0, 0x9E, 0xC6, 0x97, 0xBA, 0x42, 0xC9, 0xF1, 0xB6, 0x02, 0xC4, + 0x6E, 0xB5, 0x2F, 0xC4, 0x24, 0xBC, 0x23, 0xCA, 0x60, 0xC3, 0x65, 0xD1, + 0x05, 0xBC, 0xF7, 0xCE, 0x9A, 0xC3, 0x14, 0xC8, 0xF8, 0xDD, 0x5B, 0xD0, + 0x0C, 0xD9, 0x5F, 0xCE, 0xB5, 0xC9, 0xB9, 0xCE, 0x43, 0xCE, 0x36, 0xE5, + 0xBA, 0xD9, 0xE7, 0xF2, 0xC1, 0xE4, 0xFE, 0xEA, 0x58, 0xF0, 0x02, 0xE8, + 0xB1, 0xF6, 0x7A, 0xF0, 0xDC, 0xEB, 0x7D, 0xEE, 0x36, 0xE3, 0x44, 0xF6, + 0xF0, 0xE5, 0x3C, 0x01, 0x0B, 0xF5, 0x82, 0x02, 0x52, 0x02, 0x62, 0x03, + 0x59, 0xFD, 0x43, 0xF3, 0xA2, 0xFD, 0xEF, 0xE1, 0x64, 0xF8, 0xAC, 0xD6, + 0x89, 0xEA, 0xEC, 0xD3, 0xEF, 0xDC, 0x17, 0xD7, 0x42, 0xD4, 0xFB, 0xD9, + 0x2C, 0xE7, 0x04, 0xE0, 0xE0, 0xF5, 0xC3, 0xDB, 0xFD, 0xEF, 0x07, 0xD4, + 0x36, 0xED, 0x59, 0xCE, 0x7C, 0xF0, 0x80, 0xCE, 0x3C, 0xF7, 0x86, 0xD2, + 0x79, 0xFE, 0xB1, 0xDC, 0x58, 0x03, 0x9A, 0xE9, 0x4B, 0xF9, 0xB8, 0xE4, + 0x54, 0xEF, 0xDC, 0xE4, 0xD1, 0xFB, 0x62, 0xE5, 0x32, 0x12, 0x85, 0xD7, + 0x42, 0x1B, 0x7C, 0xD3, 0x5F, 0x0A, 0x05, 0xDE, 0x95, 0xEF, 0xC9, 0xEE, + 0xAD, 0xE7, 0xFF, 0xFF, 0x91, 0xEF, 0x4C, 0x04, 0x35, 0xE9, 0x87, 0xE8, + 0x70, 0xDB, 0x12, 0xD7, 0x87, 0xD8, 0xD9, 0xE4, 0x81, 0xCD, 0x15, 0xEB, + 0xA1, 0xC8, 0x9F, 0xEF, 0xC7, 0xD5, 0x06, 0xF1, 0x86, 0xD9, 0xB9, 0xE6, + 0x10, 0xDA, 0xA6, 0xE5, 0x4D, 0xE4, 0x7D, 0xF0, 0x3D, 0xE1, 0x3A, 0xF7, + 0xF2, 0xD2, 0x84, 0xF3, 0xF5, 0xD1, 0xE5, 0xF5, 0x67, 0xE1, 0xFF, 0xF9, + 0x9D, 0xF0, 0xC5, 0xF1, 0x91, 0xF4, 0x60, 0xEE, 0xA3, 0xF9, 0x11, 0xED, + 0x09, 0x07, 0xD2, 0xED, 0x23, 0x0E, 0x12, 0xF3, 0x4E, 0x13, 0x72, 0xF7, + 0x39, 0x15, 0x09, 0xFC, 0x61, 0x06, 0x54, 0xFD, 0xA1, 0xFF, 0x1E, 0xFE, + 0x22, 0x07, 0x43, 0xFC, 0x0A, 0x09, 0x1A, 0xF2, 0x4B, 0x17, 0x28, 0xE7, + 0x02, 0x2A, 0xE8, 0xE5, 0x6D, 0x21, 0x21, 0xEB, 0x23, 0x0B, 0x0F, 0xEF, + 0xA0, 0xFB, 0xAA, 0xF7, 0x91, 0xF2, 0x3B, 0xFD, 0xFD, 0xF2, 0x18, 0xF2, + 0x65, 0xF6, 0xBC, 0xE1, 0x2B, 0xEB, 0x94, 0xDA, 0x3E, 0xDF, 0x1E, 0xE0, + 0x3F, 0xDC, 0x66, 0xE2, 0x9E, 0xEA, 0x63, 0xE7, 0x9A, 0xFA, 0xA2, 0xFA, + 0x05, 0xF2, 0xA4, 0x00, 0x4D, 0xEF, 0xD1, 0xFB, 0x79, 0xFB, 0x4D, 0x04, + 0xCE, 0x00, 0x18, 0x0B, 0x9A, 0x01, 0xAE, 0x07, 0xF3, 0x05, 0xE7, 0x13, + 0xC2, 0x0E, 0x26, 0x27, 0xCA, 0x1C, 0x2E, 0x32, 0xDC, 0x2D, 0xB3, 0x41, + 0xD9, 0x2E, 0xE6, 0x45, 0x1A, 0x29, 0x93, 0x3F, 0x0C, 0x37, 0x27, 0x45, + 0x45, 0x45, 0xB7, 0x43, 0xC6, 0x41, 0x5F, 0x36, 0x68, 0x36, 0x38, 0x30, + 0x62, 0x35, 0x7A, 0x28, 0xFE, 0x40, 0x08, 0x1E, 0x16, 0x48, 0x70, 0x1F, + 0x24, 0x48, 0xA3, 0x29, 0x57, 0x3E, 0xD2, 0x2C, 0x67, 0x30, 0x72, 0x28, + 0xE6, 0x2D, 0xAD, 0x25, 0x89, 0x26, 0xA9, 0x21, 0x35, 0x1A, 0xD8, 0x16, + 0x75, 0x1A, 0xF2, 0x16, 0x4D, 0x12, 0x00, 0x16, 0x71, 0x01, 0x09, 0x04, + 0x17, 0xFE, 0x64, 0x05, 0xFD, 0xFD, 0x86, 0x0F, 0x33, 0xED, 0x7B, 0x00, + 0xED, 0xE2, 0x56, 0xF1, 0xA0, 0xF3, 0x2E, 0xF1, 0x28, 0xF6, 0x0A, 0xEE, + 0x6B, 0xE8, 0x49, 0xEA, 0x46, 0xEC, 0xB4, 0xF5, 0x95, 0xF0, 0x8F, 0xFE, + 0x05, 0xE9, 0x0D, 0xFE, 0x78, 0xEE, 0x0E, 0x00, 0xA7, 0xFD, 0xE6, 0xFE, + 0xEF, 0x01, 0xEF, 0xF4, 0xC6, 0x03, 0xF4, 0xE8, 0x68, 0x0E, 0x30, 0xED, + 0x33, 0x18, 0x88, 0xFA, 0xB8, 0x12, 0xF9, 0x01, 0x0D, 0xFF, 0x35, 0x09, + 0x5F, 0x09, 0x4B, 0x19, 0x41, 0x29, 0x3F, 0x1E, 0x0B, 0x39, 0x83, 0x15, + 0x93, 0x3F, 0x7D, 0x10, 0xC9, 0x36, 0xA9, 0x16, 0x48, 0x23, 0xA6, 0x22, + 0x9D, 0x10, 0x6F, 0x21, 0x2B, 0x10, 0xAB, 0x1E, 0xEF, 0x1B, 0x9E, 0x1C, + 0x34, 0x15, 0x21, 0x16, 0xAC, 0xFF, 0x91, 0x0F, 0x0A, 0xEE, 0x38, 0x00, + 0xDB, 0xE3, 0x1C, 0xF8, 0x7E, 0xDE, 0x0D, 0x01, 0x73, 0xE5, 0x58, 0x06, + 0x31, 0xEB, 0x36, 0x02, 0x93, 0xEC, 0x92, 0x00, 0x6A, 0xF2, 0x11, 0x00, + 0x57, 0xEC, 0xB6, 0xFD, 0xE4, 0xDF, 0x58, 0xFD, 0x46, 0xD6, 0xA0, 0xF9, + 0x12, 0xD2, 0x66, 0xF2, 0x9B, 0xDD, 0x1B, 0xF3, 0x66, 0xF0, 0xAE, 0xEF, + 0x5C, 0xF9, 0x6F, 0xE4, 0x77, 0xFF, 0x28, 0xDE, 0x52, 0xFF, 0x12, 0xD6, + 0xCC, 0xFC, 0x5D, 0xDE, 0x09, 0x04, 0xA0, 0xFA, 0xF8, 0x01, 0x37, 0x03, + 0x0C, 0xFE, 0xEA, 0xFB, 0x96, 0x09, 0xF2, 0xF3, 0x51, 0x13, 0x9B, 0xE7, + 0xD7, 0x17, 0x5B, 0xDF, 0xAE, 0x14, 0x9A, 0xE7, 0xAC, 0x05, 0x64, 0xF8, + 0x00, 0x04, 0xF4, 0xFC, 0x02, 0x0C, 0x7A, 0xF7, 0xAA, 0x07, 0x2B, 0xF6, + 0x30, 0xFD, 0x00, 0xFC, 0x9C, 0xF9, 0x41, 0xFC, 0x50, 0xFC, 0x98, 0xF4, + 0x46, 0x05, 0x1B, 0xF5, 0x73, 0x0B, 0x6D, 0x01, 0x3E, 0xFF, 0xE5, 0x0B, + 0xCF, 0xF7, 0x2A, 0x0C, 0xFF, 0x01, 0xA8, 0x08, 0x33, 0x0B, 0x54, 0x04, + 0x8C, 0x0D, 0xDA, 0x00, 0x5F, 0x0C, 0x3E, 0x0A, 0xBA, 0x0D, 0xD9, 0x19, + 0x34, 0x15, 0xB0, 0x23, 0x0A, 0x1A, 0x31, 0x2B, 0x14, 0x15, 0xCB, 0x2C, + 0x0F, 0x13, 0x0B, 0x2C, 0xCB, 0x1A, 0x55, 0x2F, 0x16, 0x18, 0xED, 0x2B, + 0xDA, 0x0A, 0x5F, 0x2F, 0xDE, 0x09, 0x89, 0x38, 0x7F, 0x12, 0x7E, 0x32, + 0x5B, 0x17, 0xE5, 0x28, 0x7D, 0x16, 0x0C, 0x20, 0xE8, 0x1A, 0x52, 0x18, + 0x2B, 0x1D, 0xF0, 0x1C, 0xCE, 0x1B, 0x9F, 0x29, 0x1E, 0x17, 0xAD, 0x2C, + 0x1F, 0x14, 0x30, 0x24, 0x97, 0x18, 0xC8, 0x18, 0x6A, 0x13, 0xD9, 0x0E, + 0x75, 0x10, 0x1C, 0x0E, 0xF9, 0x16, 0xA9, 0x17, 0x82, 0x19, 0x6A, 0x23, + 0xC6, 0x1D, 0x8B, 0x29, 0xEA, 0x24, 0x4D, 0x2E, 0x1B, 0x22, 0x64, 0x33, + 0x30, 0x1B, 0x59, 0x2E, 0x84, 0x21, 0xAC, 0x27, 0xA3, 0x2F, 0x8F, 0x24, + 0x6B, 0x39, 0xC4, 0x1E, 0x86, 0x36, 0xFF, 0x20, 0x4D, 0x2A, 0x67, 0x2B, + 0x0C, 0x2B, 0x8C, 0x2F, 0x11, 0x37, 0x6D, 0x3A, 0x2F, 0x34, 0xE0, 0x42, + 0x36, 0x24, 0xF3, 0x3A, 0x0F, 0x24, 0x99, 0x30, 0xEB, 0x33, 0xDB, 0x25, + 0x65, 0x35, 0xFD, 0x15, 0x35, 0x28, 0xB1, 0x11, 0x49, 0x1F, 0xFF, 0x19, + 0xCA, 0x15, 0x46, 0x1F, 0xB2, 0x0E, 0x96, 0x12, 0xBD, 0x12, 0x3F, 0xFE, + 0x7C, 0x14, 0x34, 0xFE, 0xF7, 0x01, 0x1E, 0xFD, 0x12, 0xF1, 0x5A, 0xF5, + 0xF7, 0xF0, 0x99, 0xFE, 0x6E, 0xEC, 0x92, 0x04, 0x0D, 0xE7, 0x06, 0x00, + 0x47, 0xEC, 0x4F, 0x06, 0xF4, 0xF0, 0x05, 0x0F, 0x77, 0xF3, 0xC8, 0x11, + 0x28, 0xF7, 0x93, 0x14, 0x1F, 0xF8, 0x5C, 0x14, 0x02, 0xFF, 0x89, 0x16, + 0x14, 0x06, 0x20, 0x1C, 0x44, 0x0B, 0x65, 0x1E, 0xD0, 0x11, 0xA7, 0x22, + 0xAC, 0x13, 0x74, 0x29, 0x3E, 0x17, 0x47, 0x2F, 0x35, 0x19, 0x3D, 0x35, + 0x9F, 0x14, 0x33, 0x36, 0x17, 0x15, 0x1D, 0x38, 0x9E, 0x16, 0x63, 0x3E, + 0x81, 0x0F, 0xC8, 0x2F, 0xBF, 0x17, 0xF5, 0x1D, 0x11, 0x31, 0xB7, 0x19, + 0x87, 0x3A, 0x61, 0x0F, 0xB3, 0x33, 0xBC, 0x0E, 0xC4, 0x24, 0x45, 0x1F, + 0xC6, 0x1B, 0x8C, 0x29, 0x77, 0x1D, 0x65, 0x20, 0xC2, 0x1F, 0x35, 0x0E, + 0xA1, 0x24, 0x3A, 0x03, 0x8D, 0x18, 0x11, 0xFB, 0x10, 0xFD, 0x11, 0xEE, + 0xD0, 0xF2, 0x81, 0xE8, 0xA8, 0xF5, 0x72, 0xF1, 0x2F, 0xF2, 0xDB, 0xF5, + 0xD8, 0xEC, 0x23, 0xEA, 0x52, 0xEC, 0x42, 0xD9, 0xEE, 0xEF, 0xE9, 0xCB, + 0x38, 0xED, 0x67, 0xC9, 0xDB, 0xDD, 0x9E, 0xCE, 0x0D, 0xCC, 0xDA, 0xD3, + 0x97, 0xC0, 0xBF, 0xD9, 0xE9, 0xC4, 0x41, 0xDE, 0x54, 0xCF, 0xCF, 0xDC, + 0x7F, 0xD2, 0xB7, 0xDD, 0xA5, 0xE0, 0xAE, 0xE2, 0x78, 0xF6, 0x7F, 0xEA, + 0x39, 0xF6, 0xE2, 0xF3, 0x94, 0xEB, 0x4C, 0xF9, 0x2E, 0xF1, 0xB6, 0x03, + 0x34, 0xFB, 0x58, 0x06, 0xBA, 0x03, 0x94, 0xFB, 0xB4, 0x0C, 0xAB, 0xFA, + 0x0C, 0x08, 0xE9, 0xFC, 0x5E, 0xF4, 0xD0, 0x00, 0xDE, 0xE1, 0xF3, 0x0B, + 0x12, 0xE1, 0x14, 0x11, 0x81, 0xE9, 0xCA, 0x05, 0xC4, 0xF1, 0x28, 0xF8, + 0xEF, 0xF5, 0x23, 0xEE, 0x60, 0xDF, 0x67, 0xE0, 0x9B, 0xCB, 0xB3, 0xE1, + 0xCD, 0xD5, 0xBB, 0xEB, 0xBA, 0xD6, 0xA0, 0xE9, 0xCC, 0xD4, 0x7B, 0xE2, + 0xF2, 0xDE, 0xAE, 0xDC, 0xED, 0xD5, 0xBF, 0xD0, 0x00, 0xCB, 0xEB, 0xC9, + 0x3B, 0xCD, 0x04, 0xD7, 0xF9, 0xC4, 0xBB, 0xEB, 0x11, 0xB7, 0x92, 0xF0, + 0x7B, 0xB4, 0x82, 0xE2, 0xC3, 0xC8, 0xC5, 0xDD, 0x3D, 0xD9, 0x8E, 0xDF, + 0xF9, 0xD4, 0x27, 0xDA, 0x50, 0xDE, 0x15, 0xD9, 0x97, 0xEF, 0xB0, 0xD8, + 0x7F, 0xF2, 0x21, 0xDD, 0xC2, 0xEF, 0x16, 0xE8, 0xF0, 0xE9, 0xE8, 0xEA, + 0x3C, 0xE9, 0x2D, 0xED, 0x70, 0xFD, 0xB8, 0xE7, 0x55, 0x13, 0x38, 0xD7, + 0x6B, 0x11, 0xFE, 0xD2, 0xC7, 0x03, 0x6F, 0xDE, 0x18, 0xF5, 0x62, 0xE8, + 0xCE, 0xEE, 0xD6, 0xEB, 0xED, 0xFA, 0x7C, 0xEF, 0x98, 0x0E, 0x43, 0xEA, + 0x1B, 0x17, 0xDB, 0xDC, 0xD9, 0x09, 0x56, 0xD6, 0x15, 0xF8, 0xD3, 0xDE, + 0x75, 0xF2, 0xAC, 0xE6, 0xA3, 0x01, 0xE2, 0xEF, 0x64, 0x0D, 0x6F, 0xF6, + 0x4D, 0x03, 0xF7, 0xF5, 0x25, 0xFB, 0x2D, 0x01, 0xD2, 0xF0, 0x02, 0x0D, + 0xC6, 0xE4, 0x91, 0x0E, 0xDF, 0xE5, 0xD2, 0x0F, 0x2A, 0xF0, 0xA7, 0x17, + 0x53, 0xFE, 0x20, 0x1D, 0xD1, 0x04, 0x2A, 0x16, 0xC2, 0x09, 0xC3, 0x15, + 0xB5, 0x10, 0x15, 0x1D, 0x7B, 0x0F, 0xFA, 0x1F, 0x38, 0x0B, 0xA4, 0x1F, + 0x12, 0x0F, 0xEA, 0x1D, 0x0E, 0x0F, 0x99, 0x1B, 0xC7, 0x00, 0x58, 0x19, + 0xA0, 0xF5, 0x49, 0x18, 0x0B, 0xF7, 0x95, 0x0A, 0xFA, 0x08, 0xF3, 0xF4, + 0x3D, 0x1D, 0xDA, 0xEE, 0x9D, 0x10, 0xA3, 0xF2, 0x44, 0xF4, 0x48, 0xF6, + 0xD7, 0xE7, 0x47, 0xF6, 0xF1, 0xE8, 0xE8, 0xE8, 0xED, 0xF8, 0xFC, 0xE1, + 0x44, 0x02, 0x12, 0xDF, 0x16, 0xFA, 0x90, 0xD1, 0xB0, 0xF4, 0xBF, 0xC8, + 0xE5, 0xF8, 0xDB, 0xD0, 0x12, 0x09, 0x46, 0xE1, 0xD1, 0x13, 0x6C, 0xF3, + 0x5C, 0x0E, 0xFB, 0x03, 0xCA, 0x09, 0x1C, 0x08, 0x23, 0x02, 0x4D, 0x01, + 0x12, 0xF8, 0x53, 0xFF, 0x05, 0x03, 0x02, 0x07, 0x91, 0x11, 0x81, 0x08, + 0x33, 0x11, 0x72, 0x03, 0x98, 0x0C, 0x03, 0x0D, 0xBC, 0x04, 0xE8, 0x18, + 0xA2, 0x01, 0xA8, 0x0D, 0x65, 0x0B, 0x32, 0x07, 0x01, 0x0F, 0x8E, 0x05, + 0x31, 0x07, 0xD2, 0xF8, 0x2F, 0xF8, 0x12, 0xF2, 0x2B, 0xE4, 0x4D, 0xED, + 0xB3, 0xDC, 0xFB, 0xEB, 0x1E, 0xE7, 0xAA, 0xF3, 0x3D, 0xFB, 0xA0, 0xF6, + 0xA0, 0xFC, 0x2E, 0xEF, 0xC0, 0xE5, 0xFE, 0xE8, 0x11, 0xD5, 0xE5, 0xE3, + 0x98, 0xCE, 0x39, 0xDB, 0x38, 0xC7, 0xD3, 0xD6, 0xCC, 0xC3, 0xC8, 0xCE, + 0xB8, 0xC8, 0xB3, 0xC5, 0x6B, 0xCD, 0x46, 0xC3, 0x3E, 0xCA, 0xE2, 0xBD, + 0x1C, 0xCA, 0x8F, 0xB9, 0xAE, 0xD0, 0x7C, 0xBC, 0x77, 0xCB, 0x9C, 0xC3, + 0xF5, 0xC3, 0x85, 0xCC, 0xCE, 0xD1, 0x1A, 0xD2, 0x15, 0xDB, 0xAA, 0xD4, + 0xD7, 0xDA, 0x0C, 0xD8, 0xE5, 0xE2, 0x02, 0xDD, 0x67, 0xE8, 0xBF, 0xE0, + 0x02, 0xE8, 0xF7, 0xE5, 0xD7, 0xE5, 0x2D, 0xEB, 0xF9, 0xE4, 0x9E, 0xEA, + 0x13, 0xEE, 0x4B, 0xEB, 0x7D, 0x03, 0x76, 0xEE, 0x8A, 0x15, 0x9A, 0xEE, + 0xEB, 0x12, 0xDB, 0xF3, 0x67, 0xF8, 0xFD, 0xFE, 0x59, 0xE0, 0x1D, 0x0A, + 0x45, 0xE1, 0x5C, 0x0B, 0xE1, 0xF2, 0xAE, 0xFC, 0x43, 0x09, 0xFB, 0xEB, + 0x0E, 0x0F, 0xF9, 0xDC, 0x65, 0x01, 0x6A, 0xD4, 0xEC, 0xEF, 0x4B, 0xD6, + 0xA0, 0xDD, 0xE4, 0xD9, 0x40, 0xDC, 0x87, 0xDB, 0x49, 0xEC, 0x18, 0xDA, + 0x28, 0xF0, 0xF7, 0xCF, 0xAC, 0xEC, 0x71, 0xC9, 0xE0, 0xEF, 0xD2, 0xCE, + 0x55, 0xED, 0x59, 0xCD, 0x5C, 0xE7, 0x08, 0xCF, 0xC8, 0xE8, 0xE1, 0xDE, + 0x9D, 0xF1, 0xF6, 0xEA, 0x9F, 0xF4, 0x9F, 0xEA, 0x12, 0xF1, 0xDD, 0xE4, + 0xE3, 0xEC, 0xEB, 0xE8, 0xDA, 0xDD, 0xCD, 0xEE, 0x1C, 0xD5, 0xBF, 0xF4, + 0x06, 0xE1, 0x71, 0xFF, 0x0C, 0xF8, 0xC6, 0x0A, 0x1F, 0x08, 0xED, 0x11, + 0x25, 0x01, 0xC9, 0x0C, 0xBD, 0x01, 0x83, 0x0B, 0xBE, 0x15, 0x94, 0x17, + 0xC7, 0x1A, 0x87, 0x20, 0xE0, 0x08, 0xD5, 0x24, 0x7B, 0xF6, 0xC1, 0x2F, + 0x98, 0xF4, 0x7F, 0x2F, 0x5E, 0x02, 0x92, 0x18, 0x32, 0x15, 0x81, 0x0C, + 0x36, 0x16, 0x0D, 0x0E, 0xD9, 0x10, 0x0C, 0x13, 0x2A, 0x12, 0x40, 0x1D, + 0xE6, 0x0D, 0x69, 0x1D, 0x1D, 0x0D, 0x3B, 0x1A, 0x81, 0x0D, 0x4E, 0x19, + 0x43, 0x0E, 0xA8, 0x0E, 0xE6, 0x15, 0x2D, 0x05, 0x6D, 0x14, 0xE4, 0xFA, + 0x5B, 0x0B, 0xB3, 0xF2, 0x30, 0x02, 0x9B, 0xF8, 0x49, 0x02, 0x88, 0xFB, + 0x98, 0x0A, 0x63, 0xFC, 0x4B, 0x0A, 0x98, 0xFF, 0xE1, 0x0C, 0x43, 0xFB, + 0x31, 0x14, 0x13, 0xF8, 0x5C, 0x1F, 0xD3, 0x06, 0x80, 0x23, 0x24, 0x14, + 0xE9, 0x19, 0xB0, 0x14, 0x5C, 0x1A, 0x5D, 0x15, 0x9C, 0x19, 0x94, 0x13, + 0x42, 0x0D, 0x72, 0x13, 0x22, 0x05, 0xB3, 0x14, 0x43, 0x0E, 0x3F, 0x0E, + 0xB5, 0x16, 0x49, 0x08, 0x5E, 0x0D, 0x97, 0x06, 0x6E, 0x06, 0x44, 0x0A, + 0xF9, 0x0B, 0xB0, 0x0F, 0x67, 0x15, 0x68, 0x0D, 0xA7, 0x1A, 0xD6, 0x10, + 0x6E, 0x25, 0x08, 0x21, 0x4C, 0x20, 0x20, 0x29, 0x75, 0x04, 0x34, 0x27, + 0x21, 0x09, 0x21, 0x25, 0x71, 0x18, 0x72, 0x1A, 0xD2, 0x0D, 0x26, 0x0C, + 0x64, 0x0B, 0x47, 0x0D, 0xC2, 0x11, 0x5E, 0x13, 0xA4, 0x13, 0xBD, 0x15, + 0x8B, 0x13, 0x8F, 0x1D, 0xC6, 0x11, 0xA4, 0x20, 0xD9, 0x15, 0x14, 0x24, + 0xC8, 0x1E, 0xE4, 0x28, 0x2A, 0x28, 0x49, 0x24, 0x39, 0x2B, 0xCB, 0x20, + 0x5F, 0x28, 0x81, 0x23, 0xC7, 0x28, 0xCD, 0x29, 0xB7, 0x2D, 0xF0, 0x2C, + 0xE8, 0x33, 0xFC, 0x2F, 0xDC, 0x29, 0x40, 0x30, 0xA0, 0x13, 0xB2, 0x29, + 0x2D, 0x03, 0x4E, 0x24, 0x3D, 0x00, 0x34, 0x0E, 0x76, 0x0B, 0x63, 0xF5, + 0x81, 0x13, 0x06, 0xED, 0xAF, 0x11, 0xBA, 0xEC, 0x13, 0x08, 0x6B, 0xF5, + 0x6B, 0xF1, 0x02, 0xFD, 0x91, 0xE1, 0xEC, 0x01, 0xDA, 0xF2, 0x95, 0x01, + 0x2E, 0x03, 0x88, 0xF4, 0x1B, 0xFA, 0x1B, 0xED, 0xC2, 0xED, 0xBC, 0xE9, + 0x3F, 0xE6, 0xE5, 0xE5, 0xA7, 0xE7, 0x91, 0xEC, 0x35, 0xED, 0x91, 0xF2, + 0xAD, 0xF5, 0x0C, 0xF3, 0x1B, 0x06, 0xB4, 0xF3, 0x5B, 0x14, 0xA0, 0xFC, + 0xDE, 0x14, 0x93, 0xFE, 0x0E, 0x12, 0x9E, 0xFB, 0x96, 0x12, 0x2A, 0x02, + 0x27, 0x13, 0x54, 0x0B, 0x71, 0x1F, 0x0D, 0x1C, 0x24, 0x24, 0x02, 0x28, + 0x31, 0x19, 0x64, 0x2D, 0x5A, 0x0E, 0x76, 0x33, 0x4F, 0x0A, 0xE2, 0x33, + 0x99, 0x15, 0x9F, 0x2C, 0xBB, 0x1E, 0x80, 0x25, 0x62, 0x12, 0x40, 0x27, + 0xD7, 0x01, 0x0A, 0x24, 0xDC, 0x03, 0xC4, 0x1B, 0xA3, 0x14, 0xEB, 0x14, + 0x7D, 0x1A, 0x85, 0x0E, 0x79, 0x0F, 0xE9, 0x12, 0xA5, 0xFF, 0xEE, 0x19, + 0xDD, 0xF0, 0xAA, 0x1C, 0xE5, 0xEC, 0x38, 0x1E, 0xEB, 0xF2, 0xCB, 0x14, + 0x8D, 0xFC, 0xAD, 0x0B, 0x50, 0x08, 0x63, 0x06, 0x76, 0x0C, 0x56, 0xF9, + 0x98, 0x01, 0xCA, 0xF8, 0x03, 0xF3, 0xF2, 0x07, 0x04, 0xEC, 0xD0, 0x05, + 0x41, 0xEC, 0x75, 0xF2, 0x2A, 0xF4, 0xD2, 0xE8, 0xE7, 0xF5, 0x26, 0xE5, + 0xE8, 0xF0, 0x01, 0xE7, 0x8A, 0xF8, 0xEC, 0xF3, 0x08, 0xF9, 0x5B, 0xFC, + 0x12, 0xF8, 0x0E, 0x03, 0xFC, 0x04, 0x44, 0x0C, 0x13, 0x12, 0x11, 0x0C, + 0x2E, 0x20, 0x9C, 0x0D, 0x2C, 0x24, 0x1E, 0x11, 0xFD, 0x24, 0xB1, 0x09, + 0x18, 0x33, 0x5E, 0x05, 0xF1, 0x34, 0xEE, 0x0F, 0x25, 0x1D, 0x96, 0x1C, + 0xB9, 0x0B, 0x1D, 0x1A, 0x4C, 0x15, 0xB4, 0x18, 0x3E, 0x21, 0x6A, 0x21, + 0x23, 0x21, 0xF3, 0x1D, 0x24, 0x16, 0x6F, 0x14, 0x4A, 0x08, 0xA2, 0x1B, + 0x88, 0x07, 0xE9, 0x27, 0xA9, 0x14, 0x96, 0x27, 0x6B, 0x24, 0x13, 0x29, + 0x7E, 0x25, 0xC4, 0x2A, 0x7C, 0x16, 0x1B, 0x18, 0x5D, 0x0B, 0x15, 0x07, + 0xAA, 0x08, 0xE5, 0x0B, 0xB4, 0xFC, 0x8E, 0x0F, 0xFB, 0xF6, 0x9F, 0x10, + 0x7D, 0x03, 0x72, 0x0E, 0xA0, 0x0B, 0xEA, 0x07, 0x3F, 0x0A, 0x7D, 0x0C, + 0x9E, 0x05, 0xF4, 0x14, 0xAC, 0x02, 0xF8, 0x1C, 0x00, 0x04, 0x54, 0x1C, + 0xC3, 0x0D, 0x73, 0x19, 0x1A, 0x1B, 0x53, 0x1B, 0xF4, 0x1A, 0x31, 0x15, + 0x23, 0x18, 0xCC, 0x14, 0x99, 0x20, 0xBE, 0x18, 0x93, 0x28, 0x85, 0x16, + 0xFC, 0x22, 0xEB, 0x17, 0x5E, 0x1B, 0xFB, 0x25, 0xC8, 0x15, 0xD3, 0x35, + 0xF7, 0x06, 0xF7, 0x33, 0x77, 0x08, 0x21, 0x2B, 0xE0, 0x24, 0x43, 0x21, + 0xB6, 0x33, 0x6D, 0x10, 0x46, 0x29, 0xA9, 0x09, 0x80, 0x1A, 0x4D, 0x1E, + 0x02, 0x0B, 0x31, 0x2F, 0x80, 0x08, 0x3B, 0x28, 0x66, 0x17, 0x0F, 0x22, + 0x61, 0x1F, 0x4D, 0x19, 0x7E, 0x1A, 0x83, 0x0A, 0x86, 0x12, 0x8A, 0x02, + 0x8E, 0x06, 0x80, 0xF9, 0x67, 0xF8, 0x9F, 0xF5, 0x16, 0xEF, 0x9B, 0xF6, + 0xF2, 0xF4, 0xAA, 0xF6, 0x45, 0x07, 0xBE, 0xF9, 0xD6, 0x10, 0x35, 0xF5, + 0xF5, 0x09, 0xC1, 0xED, 0x7E, 0xFB, 0xB4, 0xEE, 0xB5, 0xFA, 0xFE, 0xF2, + 0x45, 0x0B, 0xA5, 0xF1, 0x33, 0x1E, 0x34, 0xEB, 0x01, 0x1D, 0x60, 0xE7, + 0x24, 0x06, 0x87, 0xF3, 0xDF, 0xF9, 0x22, 0x08, 0xBA, 0xF5, 0x06, 0x06, + 0x8C, 0xE8, 0x54, 0xF2, 0x0A, 0xD7, 0x5D, 0xE7, 0x37, 0xC6, 0xDB, 0xE4, + 0x85, 0xB8, 0xDC, 0xE4, 0xE5, 0xBA, 0xCF, 0xDF, 0x22, 0xC7, 0x85, 0xD5, + 0x96, 0xCA, 0xEF, 0xD6, 0x9A, 0xC9, 0x69, 0xE4, 0x5A, 0xC8, 0x85, 0xF3, + 0xB4, 0xC4, 0x03, 0xFB, 0xCE, 0xBC, 0x6C, 0xF6, 0x0F, 0xBD, 0x66, 0xF3, + 0x30, 0xCF, 0x77, 0xEF, 0x66, 0xE2, 0xE5, 0xE4, 0xA1, 0xE7, 0xDF, 0xD7, + 0x81, 0xE5, 0x47, 0xD3, 0x75, 0xEE, 0x65, 0xE3, 0x89, 0xF4, 0xD4, 0xF2, + 0x7F, 0xEF, 0x37, 0xF8, 0x55, 0xF2, 0x60, 0xFB, 0x63, 0x00, 0x6B, 0xF5, + 0x7E, 0x10, 0x71, 0xEE, 0x36, 0x18, 0x36, 0xF4, 0xDA, 0x18, 0x56, 0xFC, + 0xF6, 0x1C, 0xC6, 0xF9, 0xDE, 0x1E, 0x6D, 0xF7, 0x24, 0x15, 0x25, 0xF7, + 0xA6, 0x0B, 0xC5, 0xF2, 0x90, 0xFF, 0x72, 0xEC, 0x81, 0xF7, 0x05, 0xE8, + 0x0F, 0xFF, 0x65, 0xE3, 0x98, 0xFC, 0xA4, 0xD5, 0xC7, 0xEC, 0x46, 0xD7, + 0xC9, 0xDD, 0x6C, 0xE2, 0x86, 0xD7, 0xBB, 0xDC, 0x61, 0xDD, 0x00, 0xD7, + 0x9E, 0xDD, 0xC1, 0xD8, 0xFB, 0xCC, 0x7C, 0xD9, 0x71, 0xC2, 0x9A, 0xD4, + 0x7D, 0xCC, 0x4A, 0xD2, 0x3E, 0xD2, 0x49, 0xD5, 0xDE, 0xD1, 0x71, 0xD8, + 0xC1, 0xD8, 0xA8, 0xE1, 0xB6, 0xE3, 0x84, 0xE7, 0xCA, 0xEA, 0x00, 0xE4, + 0xA3, 0xEE, 0xE9, 0xE4, 0x87, 0xF2, 0xBA, 0xF0, 0xFA, 0xF4, 0xCB, 0x01, + 0x46, 0xFA, 0x90, 0x0B, 0xC4, 0x03, 0xD9, 0x09, 0xAC, 0x0B, 0xD7, 0x05, + 0x13, 0x0A, 0x8C, 0x01, 0x3C, 0x11, 0x1E, 0x02, 0xDE, 0x1A, 0x7D, 0x06, + 0xD1, 0x15, 0x8E, 0x0B, 0x7F, 0x17, 0xD8, 0x15, 0xD6, 0x16, 0xE2, 0x17, + 0xF5, 0x0F, 0x77, 0x10, 0xB9, 0x0C, 0x85, 0x06, 0x8B, 0x08, 0x02, 0xFD, + 0xD6, 0x0A, 0x94, 0xFF, 0xE5, 0x08, 0xBB, 0x0C, 0x7F, 0xF9, 0x0F, 0x1B, + 0x47, 0xE9, 0x06, 0x22, 0x0A, 0xEB, 0x2D, 0x1A, 0x86, 0xFE, 0x67, 0x08, + 0xD0, 0x09, 0x36, 0xFD, 0x21, 0x04, 0xCE, 0xFD, 0x94, 0xF9, 0xC3, 0xFD, + 0xD5, 0xF0, 0xE1, 0x03, 0x63, 0xE5, 0xF9, 0x0A, 0x46, 0xDE, 0x16, 0x06, + 0xEE, 0xE3, 0x0E, 0xFD, 0x27, 0xEE, 0x0E, 0xF3, 0x9C, 0xF6, 0xE2, 0xE5, + 0x40, 0xF2, 0xCD, 0xD9, 0x4D, 0xE3, 0xB4, 0xD6, 0xBA, 0xD9, 0xF3, 0xDC, + 0x5D, 0xE1, 0xFB, 0xE5, 0x7E, 0xFB, 0xB9, 0xE9, 0x14, 0x0B, 0x9C, 0xE7, + 0x16, 0x09, 0xAC, 0xE7, 0xF9, 0x08, 0x52, 0xEB, 0x01, 0x0E, 0x8F, 0xF2, + 0xBB, 0x16, 0xC5, 0xFA, 0xFF, 0x1D, 0x4E, 0xFE, 0x70, 0x26, 0x43, 0x01, + 0x05, 0x2C, 0x6D, 0x02, 0x4C, 0x26, 0xD5, 0x00, 0x2D, 0x1B, 0x6F, 0xFF, + 0x45, 0x10, 0xED, 0x00, 0x4C, 0x03, 0x35, 0x0A, 0xF3, 0xF9, 0xE7, 0x13, + 0x0F, 0xFB, 0x75, 0x0D, 0xBD, 0xFE, 0xCB, 0x02, 0x63, 0x02, 0x9E, 0xFE, + 0x68, 0x00, 0x3E, 0xF9, 0xC9, 0xF7, 0x27, 0xF7, 0x9F, 0xF3, 0x0C, 0x00, + 0xAE, 0xEB, 0x6A, 0x0A, 0x88, 0xDD, 0xCF, 0x09, 0x04, 0xD6, 0x4D, 0x03, + 0xD2, 0xD1, 0xFD, 0xFA, 0xEA, 0xCE, 0x7B, 0xF1, 0x95, 0xD6, 0xBA, 0xE2, + 0x45, 0xE8, 0x60, 0xD8, 0xF4, 0xE9, 0xA5, 0xE0, 0x10, 0xDD, 0xB5, 0xEC, + 0x58, 0xDF, 0x8E, 0xF2, 0xDF, 0xF0, 0x65, 0xF6, 0x11, 0xF9, 0xA9, 0xF3, + 0xDC, 0xF5, 0x9D, 0xEB, 0x01, 0xEE, 0xAC, 0xE6, 0x4C, 0xEA, 0xDE, 0xE6, + 0xC6, 0xF7, 0x70, 0xE7, 0x80, 0xFD, 0x52, 0xE2, 0x12, 0xF5, 0xBE, 0xDE, + 0x26, 0xF0, 0x8E, 0xDF, 0x30, 0xF4, 0xB1, 0xDD, 0x8C, 0x00, 0x49, 0xD6, + 0x76, 0x03, 0xDE, 0xD2, 0x93, 0xF6, 0x98, 0xD8, 0x01, 0xEC, 0x91, 0xDE, + 0x2C, 0xF2, 0xCF, 0xDF, 0xD7, 0xFF, 0xB1, 0xDC, 0x02, 0x04, 0x95, 0xE4, + 0x41, 0xF9, 0x68, 0xEC, 0xAD, 0xF0, 0x5E, 0xED, 0x66, 0xF6, 0x5D, 0xF4, + 0x75, 0xF8, 0x2E, 0xF1, 0x6D, 0xF0, 0x32, 0xE3, 0xE0, 0xED, 0x57, 0xE2, + 0x11, 0xF3, 0x72, 0xED, 0x12, 0xFB, 0xA0, 0xF2, 0x88, 0x03, 0x79, 0xFC, + 0x11, 0x05, 0xEE, 0x09, 0x5A, 0x01, 0x59, 0x0C, 0x59, 0xFE, 0x13, 0x0F, + 0x60, 0xFE, 0xF6, 0x0E, 0xB7, 0x01, 0x89, 0x07, 0x84, 0x0D, 0xC2, 0x08, + 0x3D, 0x0C, 0xB1, 0x0A, 0x7B, 0xFC, 0x5D, 0x05, 0x70, 0xF4, 0x2C, 0xFD, + 0x28, 0xED, 0xA8, 0xF6, 0xD6, 0xEC, 0x0C, 0xF1, 0x32, 0xED, 0x71, 0xF0, + 0x5D, 0xE4, 0x1E, 0xFC, 0x26, 0xE0, 0x3D, 0xF7, 0xD0, 0xEB, 0xDD, 0xE4, + 0x4C, 0xF8, 0x12, 0xD9, 0x3E, 0xF1, 0xF8, 0xD2, 0x37, 0xE3, 0xBD, 0xDE, + 0xFD, 0xD2, 0x9D, 0xF2, 0x12, 0xCD, 0x66, 0xFB, 0x29, 0xDF, 0xBB, 0xFB, + 0x23, 0xE9, 0x61, 0xF0, 0x59, 0xEC, 0x98, 0xE6, 0x06, 0xF8, 0x7F, 0xED, + 0x28, 0x02, 0xB9, 0xF2, 0x23, 0x07, 0x9D, 0xF4, 0x69, 0x07, 0x77, 0xFF, + 0x25, 0x0C, 0x51, 0x0E, 0x2E, 0x15, 0x77, 0x19, 0xBD, 0x1F, 0x32, 0x1B, + 0x74, 0x23, 0x9A, 0x14, 0xFF, 0x17, 0x30, 0x11, 0x06, 0x0A, 0x29, 0x0C, + 0xEB, 0x0C, 0x1B, 0x0E, 0x89, 0x1C, 0xBF, 0x11, 0x04, 0x22, 0xE4, 0x08, + 0x81, 0x1F, 0x4B, 0x09, 0xBF, 0x19, 0x2D, 0x0C, 0x7F, 0x11, 0xF2, 0xFB, + 0xA9, 0x14, 0x1C, 0xEF, 0x8F, 0x14, 0xD3, 0xF0, 0x30, 0x08, 0x7C, 0xEF, + 0x4E, 0x04, 0x6F, 0xF1, 0x69, 0x08, 0x40, 0xFB, 0x31, 0x0B, 0x14, 0xFD, + 0x9C, 0x02, 0xE0, 0xF3, 0xFF, 0xF5, 0x33, 0xEF, 0x01, 0xF3, 0x72, 0xFC, + 0x16, 0xF1, 0x35, 0x0D, 0xDC, 0xED, 0x59, 0x12, 0xB3, 0xFC, 0x5C, 0x13, + 0x1D, 0x15, 0xBA, 0x0E, 0x7D, 0x0E, 0x45, 0x05, 0x39, 0xFF, 0xAF, 0x00, + 0x62, 0x02, 0x77, 0x09, 0x61, 0x04, 0x94, 0x1D, 0x74, 0x00, 0x80, 0x2D, + 0x59, 0x04, 0x9C, 0x33, 0x57, 0x0E, 0xA9, 0x32, 0x5C, 0x17, 0xAD, 0x2E, + 0xAE, 0x1C, 0xC1, 0x28, 0x5D, 0x1D, 0xD6, 0x25, 0x03, 0x25, 0x98, 0x2A, + 0xE0, 0x33, 0xEB, 0x2F, 0x3E, 0x3F, 0x50, 0x33, 0x71, 0x46, 0x9E, 0x32, + 0xD7, 0x45, 0xAC, 0x2C, 0x64, 0x42, 0xDF, 0x28, 0xCA, 0x45, 0x11, 0x25, + 0xA3, 0x44, 0x4A, 0x1E, 0x0A, 0x31, 0xE3, 0x1E, 0xDE, 0x17, 0xF2, 0x25, + 0x45, 0x14, 0x95, 0x2A, 0x8A, 0x1D, 0x88, 0x27, 0xC5, 0x25, 0x67, 0x1F, + 0x57, 0x2A, 0xC4, 0x16, 0xDA, 0x20, 0xAA, 0x0A, 0x87, 0x11, 0xDD, 0x05, + 0x00, 0x09, 0x3E, 0x0B, 0x5A, 0x06, 0x96, 0x0A, 0xE1, 0x08, 0xED, 0xFD, + 0x61, 0x0B, 0x9B, 0xF3, 0x22, 0xFE, 0x7F, 0xED, 0x16, 0xE6, 0x1D, 0xE8, + 0x3F, 0xD5, 0xBF, 0xE9, 0x2B, 0xD3, 0xE8, 0xEE, 0x1E, 0xDC, 0x49, 0xF3, + 0x33, 0xE5, 0x15, 0xEF, 0x4D, 0xF4, 0xEB, 0xEC, 0x82, 0xFF, 0xE0, 0xF6, + 0xCE, 0xF7, 0xAC, 0xFB, 0x21, 0xF1, 0xD2, 0xFD, 0xE8, 0xF5, 0x42, 0x05, + 0x97, 0xFC, 0xEE, 0x08, 0x0E, 0x09, 0xC4, 0x04, 0x06, 0x0B, 0x67, 0x00, + 0x59, 0xFA, 0xEA, 0xFF, 0xA1, 0xEE, 0x43, 0xFD, 0xD7, 0xF5, 0xFC, 0xFD, + 0xD3, 0x02, 0x25, 0x03, 0xD5, 0xFB, 0xF5, 0x04, 0x63, 0xEB, 0x03, 0x0C, + 0xD2, 0xE6, 0xA4, 0x14, 0x3A, 0xF4, 0x3B, 0x10, 0x8E, 0x07, 0x2D, 0x00, + 0x3A, 0x0B, 0x34, 0xEF, 0xC8, 0xFD, 0x98, 0xED, 0x44, 0xE9, 0x2E, 0xF8, + 0x27, 0xDE, 0x4C, 0x02, 0x1D, 0xE2, 0x3C, 0x0A, 0x79, 0xE8, 0xAB, 0x0C, + 0x78, 0xE7, 0x7A, 0x05, 0xAC, 0xE2, 0x66, 0xF7, 0x0A, 0xE4, 0xB6, 0xEC, + 0xFB, 0xDE, 0xE6, 0xE6, 0x9D, 0xD2, 0x4C, 0xE6, 0xE6, 0xD8, 0x27, 0xF3, + 0xEB, 0xF0, 0x76, 0x04, 0xAC, 0x03, 0xFC, 0x05, 0x57, 0x0B, 0xC8, 0x00, + 0x7D, 0x08, 0xE7, 0x01, 0xCA, 0xFD, 0x06, 0xFC, 0xB0, 0xFC, 0xAA, 0xF0, + 0xCA, 0x06, 0xF9, 0xEA, 0x9C, 0x0E, 0x8F, 0xE5, 0x8B, 0x07, 0xB2, 0xDE, + 0xAF, 0xFB, 0x57, 0xE6, 0x68, 0xF4, 0x53, 0xEB, 0x0E, 0xF2, 0xBA, 0xDE, + 0x0A, 0xF8, 0xF7, 0xD9, 0x4A, 0xF9, 0x08, 0xDA, 0x0A, 0xFB, 0xAC, 0xD8, + 0xEF, 0x01, 0x9A, 0xDE, 0x9A, 0x04, 0xFC, 0xE6, 0x8C, 0x0E, 0xC9, 0xF0, + 0x94, 0x1D, 0xEF, 0xFA, 0x4C, 0x15, 0x41, 0x00, 0x0A, 0xFF, 0xE0, 0x03, + 0x7A, 0xF5, 0x8B, 0x09, 0x12, 0xF9, 0xFC, 0x0C, 0xAE, 0x02, 0xC1, 0x11, + 0xA0, 0x07, 0x83, 0x16, 0xC3, 0x08, 0xCE, 0x15, 0x78, 0x0D, 0x4E, 0x13, + 0xC4, 0x11, 0xDA, 0x18, 0xA3, 0x0E, 0xFB, 0x2C, 0x23, 0x0A, 0x56, 0x43, + 0x2B, 0x0B, 0xE3, 0x51, 0x80, 0x0E, 0xCB, 0x55, 0xFD, 0x14, 0xC3, 0x4B, + 0xC1, 0x1A, 0x31, 0x3D, 0x57, 0x1C, 0x53, 0x37, 0x61, 0x22, 0x77, 0x37, + 0xCD, 0x2B, 0xAB, 0x2C, 0xC7, 0x28, 0xA5, 0x21, 0x1C, 0x1A, 0xE1, 0x26, + 0x71, 0x07, 0x68, 0x25, 0xE2, 0x00, 0xC6, 0x1C, 0x25, 0x11, 0xBD, 0x14, + 0x30, 0x1D, 0x99, 0x0B, 0x7B, 0x15, 0xE0, 0xFE, 0x88, 0x10, 0x49, 0xFD, + 0xA0, 0x17, 0x8D, 0x0D, 0xE5, 0x19, 0xAB, 0x14, 0x36, 0x1B, 0xFD, 0x0E, + 0xA0, 0x1E, 0xC1, 0x08, 0x77, 0x1C, 0x57, 0x04, 0x19, 0x1A, 0xE4, 0x02, + 0x6D, 0x17, 0x92, 0x06, 0xFA, 0x14, 0xB4, 0x0E, 0xF1, 0x18, 0x01, 0x1C, + 0xA1, 0x20, 0xD7, 0x23, 0x53, 0x24, 0x77, 0x1F, 0x50, 0x23, 0x92, 0x20, + 0x60, 0x27, 0x87, 0x25, 0x28, 0x2A, 0x12, 0x25, 0xA9, 0x23, 0x3E, 0x2B, + 0xB3, 0x26, 0x2F, 0x37, 0x71, 0x30, 0x5D, 0x3A, 0x5B, 0x32, 0xDF, 0x32, + 0x66, 0x30, 0x93, 0x2E, 0xB6, 0x27, 0x31, 0x2D, 0xA8, 0x1D, 0xE5, 0x27, + 0xEC, 0x21, 0x10, 0x26, 0xDC, 0x21, 0x32, 0x28, 0x00, 0x15, 0x30, 0x25, + 0xD7, 0x08, 0x10, 0x1F, 0xD1, 0xFE, 0xD6, 0x12, 0x75, 0x06, 0x30, 0x05, + 0x2A, 0x16, 0xA2, 0x06, 0xA7, 0x0C, 0x70, 0x07, 0x19, 0xF5, 0xFC, 0xFE, + 0xF2, 0xED, 0x9F, 0x01, 0xAD, 0xF8, 0x2C, 0x03, 0xF6, 0x07, 0xA3, 0xF5, + 0xB3, 0x0D, 0x76, 0xEB, 0x7D, 0x0A, 0xA7, 0xEC, 0xA4, 0x05, 0x42, 0xF2, + 0x91, 0xF7, 0x72, 0xFB, 0x90, 0xE5, 0x99, 0x01, 0xB5, 0xDB, 0x75, 0xFB, + 0x8B, 0xE3, 0x59, 0xF8, 0xE6, 0xEE, 0xEB, 0xF2, 0xEB, 0xEC, 0x30, 0xE4, + 0xE9, 0xE9, 0x5C, 0xE1, 0x04, 0xE1, 0x6E, 0xE9, 0x11, 0xD8, 0x1F, 0xF8, + 0x2D, 0xE1, 0xE1, 0x0A, 0xDA, 0xF6, 0x75, 0x16, 0x9A, 0x0C, 0x69, 0x18, + 0xB4, 0x0F, 0x7F, 0x12, 0x42, 0xFE, 0x42, 0x06, 0x9A, 0xF8, 0x93, 0xFD, + 0xB4, 0x03, 0x1D, 0x00, 0xD5, 0x06, 0x00, 0xFF, 0x2E, 0x09, 0x8E, 0xF8, + 0xF1, 0x0B, 0xD7, 0xF3, 0xC9, 0x01, 0x92, 0xEE, 0x51, 0xF8, 0x18, 0xEA, + 0x2A, 0xF9, 0x9E, 0xE2, 0x53, 0xFB, 0xC6, 0xE1, 0x77, 0xF5, 0xE1, 0xE7, + 0xD4, 0xF1, 0x1E, 0xE3, 0xBD, 0xFB, 0x0F, 0xDF, 0x1A, 0x02, 0x86, 0xDC, + 0xC3, 0xF6, 0xA7, 0xD1, 0xAA, 0xE6, 0xC4, 0xCB, 0x69, 0xE2, 0xB7, 0xCE, + 0x26, 0xE1, 0xBD, 0xD7, 0xEF, 0xD2, 0x00, 0xDE, 0xC0, 0xC5, 0x88, 0xDA, + 0xA7, 0xCB, 0x21, 0xD5, 0x11, 0xDE, 0x2C, 0xD0, 0x3B, 0xEE, 0xFA, 0xCD, + 0xAD, 0xED, 0xA4, 0xD1, 0x14, 0xDA, 0x72, 0xDE, 0x63, 0xCC, 0x29, 0xF4, + 0x45, 0xD4, 0x9E, 0x03, 0xF6, 0xE4, 0x5C, 0x05, 0x3F, 0xE9, 0x18, 0x01, + 0x8F, 0xDB, 0xC0, 0xFD, 0xB3, 0xCE, 0xD8, 0xF1, 0x1D, 0xD1, 0x47, 0xED, + 0x33, 0xD6, 0xAA, 0xF2, 0xF3, 0xD7, 0x03, 0xE9, 0xD3, 0xD8, 0x79, 0xE8, + 0x16, 0xD7, 0x76, 0xED, 0xEA, 0xD9, 0x50, 0xE9, 0x2D, 0xE5, 0x5D, 0xEE, + 0x28, 0xF4, 0x71, 0xF0, 0x63, 0xF7, 0xD6, 0xEF, 0x7C, 0xF1, 0x02, 0xF1, + 0xEF, 0xF0, 0x45, 0xE8, 0x06, 0xF0, 0x05, 0xE2, 0x82, 0xEA, 0xFF, 0xE3, + 0x8A, 0xEC, 0x2B, 0xE7, 0x05, 0xF1, 0x70, 0xE7, 0xFF, 0xED, 0x77, 0xE3, + 0x85, 0xED, 0x2B, 0xDD, 0x2B, 0xEC, 0xC5, 0xD9, 0xEC, 0xEA, 0xB5, 0xD6, + 0xFA, 0xEF, 0xB3, 0xD5, 0x00, 0xFB, 0xAA, 0xE4, 0xDC, 0x04, 0x77, 0xED, + 0xC2, 0x01, 0x1E, 0xEB, 0x96, 0xF4, 0x35, 0xF0, 0x9B, 0xE7, 0xC2, 0xEE, + 0xBA, 0xEB, 0x58, 0xE9, 0xEE, 0xFA, 0xDB, 0xE3, 0x7C, 0x00, 0x8F, 0xDB, + 0x01, 0xFB, 0x7F, 0xE0, 0xB4, 0xF3, 0x84, 0xE8, 0x1E, 0xF7, 0xDC, 0xEA, + 0xDE, 0x03, 0x11, 0xEE, 0x4A, 0x0A, 0xCD, 0xEE, 0x93, 0x02, 0x8C, 0xF2, + 0x65, 0xED, 0x7A, 0xF8, 0x64, 0xE5, 0x39, 0xF8, 0x06, 0xF2, 0x36, 0xEE, + 0x53, 0xFB, 0x65, 0xE7, 0xFF, 0xFA, 0xAE, 0xF3, 0xEB, 0xF7, 0x51, 0x07, + 0x92, 0xF5, 0xA9, 0x13, 0x4F, 0xEE, 0x72, 0x16, 0x0D, 0xEF, 0x9F, 0x12, + 0x34, 0xFF, 0x16, 0x14, 0xFA, 0x12, 0xEC, 0x14, 0x04, 0x22, 0x32, 0x13, + 0xA3, 0x28, 0x9C, 0x14, 0xE6, 0x26, 0x3C, 0x1B, 0xE1, 0x1E, 0xC3, 0x27, + 0x6B, 0x1C, 0x63, 0x2F, 0x1E, 0x2A, 0xB1, 0x33, 0x99, 0x38, 0x17, 0x32, + 0xCE, 0x30, 0x8C, 0x27, 0xFF, 0x1B, 0xEB, 0x20, 0x27, 0x12, 0xB5, 0x1C, + 0x0E, 0x15, 0xDF, 0x16, 0x8E, 0x19, 0xF3, 0x10, 0xEC, 0x1B, 0xF0, 0x0C, + 0x0D, 0x19, 0x61, 0x0E, 0x87, 0x09, 0x2D, 0x11, 0x69, 0xFA, 0x02, 0x0C, + 0x25, 0x00, 0x1D, 0xFE, 0x28, 0x07, 0x1A, 0xF4, 0x41, 0x00, 0x38, 0xF2, + 0x5D, 0xF1, 0x44, 0xF4, 0x27, 0xE6, 0x1A, 0xF2, 0x8B, 0xEB, 0xFF, 0xE9, + 0x87, 0xF1, 0xCF, 0xE4, 0x4D, 0xF2, 0xCD, 0xDF, 0x35, 0xF3, 0x0C, 0xDD, + 0xFF, 0xF4, 0x20, 0xE6, 0xE2, 0xEF, 0x33, 0xE7, 0x5E, 0xEA, 0x49, 0xE2, + 0x64, 0xF0, 0x6A, 0xE2, 0xDA, 0xF5, 0x07, 0xDC, 0x4D, 0xFC, 0xE3, 0xDA, + 0x61, 0xF8, 0x88, 0xE3, 0x55, 0xE8, 0xAD, 0xEE, 0xAA, 0xDF, 0xB5, 0xFC, + 0x52, 0xE8, 0x29, 0x07, 0x92, 0xF8, 0x04, 0x03, 0x7E, 0xFE, 0xCC, 0xF6, + 0xD0, 0x04, 0x30, 0xF5, 0x27, 0x06, 0x64, 0xFB, 0x89, 0xFB, 0x42, 0x01, + 0x36, 0x01, 0x0E, 0x08, 0xE1, 0x08, 0xDA, 0x0E, 0x30, 0x00, 0xEA, 0x0F, + 0x86, 0xF6, 0x7D, 0x0B, 0x47, 0xE6, 0x08, 0x0B, 0x06, 0xDA, 0x05, 0x04, + 0x78, 0xDD, 0x07, 0xF7, 0xE4, 0xE2, 0xD7, 0xF3, 0x19, 0xDD, 0xB0, 0xF2, + 0x76, 0xD7, 0x6C, 0xF3, 0x22, 0xDB, 0xFB, 0xF1, 0x8C, 0xE1, 0xE3, 0xE6, + 0xE5, 0xE9, 0xE2, 0xD9, 0x82, 0xEA, 0x34, 0xD2, 0xD1, 0xE2, 0x91, 0xCF, + 0xED, 0xDA, 0x95, 0xD2, 0x87, 0xDA, 0xB8, 0xDC, 0x0F, 0xDB, 0x2D, 0xD9, + 0x34, 0xD4, 0xF3, 0xC8, 0x8D, 0xD8, 0xDA, 0xC7, 0xF0, 0xDD, 0x09, 0xCA, + 0x90, 0xDC, 0xC7, 0xC6, 0x5B, 0xE1, 0x39, 0xCB, 0xB2, 0xDE, 0x83, 0xCF, + 0xA9, 0xE2, 0x11, 0xCE, 0xCB, 0xF4, 0x26, 0xC9, 0x6D, 0xFA, 0xA0, 0xC7, + 0x61, 0xF0, 0x83, 0xCE, 0xCE, 0xE2, 0x80, 0xD8, 0x7B, 0xDD, 0xE6, 0xDD, + 0xDE, 0xE7, 0xF1, 0xE1, 0x44, 0xF7, 0x70, 0xE7, 0x37, 0xF8, 0x24, 0xE8, + 0x22, 0xEC, 0x76, 0xEA, 0x21, 0xE7, 0x74, 0xF2, 0x10, 0xF7, 0x5E, 0xF8, + 0xFB, 0x06, 0x32, 0xFA, 0x31, 0x04, 0x58, 0x00, 0x24, 0x01, 0x89, 0x0B, + 0xF4, 0x01, 0x53, 0x0F, 0xB0, 0xFC, 0xDA, 0x07, 0x25, 0xF9, 0xC8, 0xFB, + 0xBC, 0xFC, 0xF5, 0xF1, 0xCD, 0x00, 0xC6, 0xF1, 0x6A, 0xF9, 0x37, 0xFC, + 0x12, 0xE8, 0x44, 0x05, 0x95, 0xE0, 0x9B, 0x0D, 0x0E, 0xE4, 0xF7, 0x10, + 0x00, 0xE5, 0x01, 0x08, 0xA4, 0xEF, 0x5B, 0x00, 0x0C, 0x02, 0x6E, 0xF5, + 0x2D, 0x06, 0x48, 0xEF, 0x17, 0xFE, 0xE2, 0xF9, 0xD2, 0xF5, 0x0D, 0x03, + 0x4D, 0xFE, 0x9D, 0x0B, 0x6D, 0x14, 0x83, 0x17, 0x39, 0x1B, 0x7D, 0x1A, + 0xF5, 0x15, 0x14, 0x1D, 0x44, 0x0E, 0x98, 0x23, 0x5F, 0x04, 0x5A, 0x25, + 0x85, 0x02, 0xAD, 0x20, 0x2F, 0x0B, 0x98, 0x14, 0x4D, 0x13, 0x8D, 0x12, + 0xCD, 0x0A, 0x57, 0x1E, 0xAB, 0xFE, 0xAC, 0x21, 0xE9, 0x02, 0xBF, 0x1C, + 0x2E, 0x10, 0x1F, 0x18, 0xA8, 0x15, 0x2A, 0x10, 0xBD, 0x16, 0xFE, 0x0C, + 0x0B, 0x1D, 0xE6, 0x10, 0x82, 0x23, 0xF2, 0x14, 0x9C, 0x23, 0x14, 0x1D, + 0xB4, 0x23, 0x52, 0x20, 0x01, 0x24, 0x23, 0x1E, 0x01, 0x25, 0xC4, 0x1A, + 0xC4, 0x2D, 0xA7, 0x13, 0xE5, 0x34, 0x9A, 0x12, 0x8A, 0x34, 0x24, 0x15, + 0x28, 0x34, 0x67, 0x16, 0xA7, 0x36, 0xE0, 0x15, 0x81, 0x3D, 0x13, 0x0B, + 0x96, 0x41, 0x51, 0x06, 0xFD, 0x35, 0x1A, 0x18, 0xA6, 0x25, 0xFD, 0x29, + 0xB2, 0x1D, 0xFC, 0x2C, 0xD3, 0x16, 0x25, 0x2A, 0x82, 0x12, 0xF0, 0x1E, + 0xC1, 0x0F, 0x5B, 0x0D, 0xF5, 0x07, 0xCD, 0x04, 0x7E, 0x03, 0x69, 0x02, + 0xAC, 0x03, 0xA7, 0x05, 0x3A, 0x01, 0x36, 0x0A, 0x2B, 0xF8, 0xA1, 0x10, + 0x32, 0xE8, 0x56, 0x18, 0x45, 0xE0, 0x8D, 0x19, 0xC0, 0xE4, 0x1B, 0x12, + 0x02, 0xEC, 0xF9, 0x06, 0x93, 0xF1, 0xA3, 0x01, 0xF9, 0xEB, 0x42, 0xFD, + 0x18, 0xE8, 0x41, 0xFE, 0x91, 0xEE, 0x3A, 0x08, 0x5B, 0xF5, 0x51, 0x12, + 0x18, 0xF8, 0x05, 0x14, 0xD0, 0xF8, 0xA3, 0x0E, 0x7A, 0xFB, 0xE2, 0x07, + 0x4A, 0x09, 0x8B, 0x01, 0x0F, 0x1A, 0x77, 0xFD, 0x62, 0x21, 0xBB, 0x04, + 0x7B, 0x27, 0x09, 0x15, 0x6D, 0x2E, 0x67, 0x19, 0xB3, 0x37, 0x34, 0x12, + 0x29, 0x3E, 0x89, 0x10, 0xB3, 0x3A, 0x0C, 0x17, 0xD7, 0x31, 0xE8, 0x1A, + 0x73, 0x2A, 0x57, 0x1A, 0x1A, 0x2B, 0x64, 0x1F, 0x8E, 0x2C, 0x5C, 0x1A, + 0xF9, 0x27, 0xC3, 0x08, 0x18, 0x20, 0x47, 0x02, 0xFA, 0x0F, 0xA2, 0x01, + 0x4E, 0x03, 0x05, 0xFF, 0x8A, 0xFE, 0x8A, 0xFD, 0xB7, 0xF4, 0xEF, 0xFB, + 0x21, 0xEB, 0xCD, 0xFB, 0xDE, 0xE4, 0xF9, 0xF7, 0xE1, 0xDF, 0x69, 0xEA, + 0x13, 0xEB, 0x25, 0xE7, 0xC2, 0xFB, 0x63, 0xF1, 0x80, 0xF9, 0xDE, 0xF8, + 0x92, 0xF0, 0xE2, 0x06, 0x45, 0xED, 0x9E, 0x0B, 0xF4, 0xEF, 0x17, 0xFB, + 0xA5, 0xF3, 0xEF, 0xF2, 0xBC, 0xEE, 0x75, 0xF2, 0x3B, 0xED, 0x00, 0xEE, + 0xC3, 0xF5, 0x85, 0xF3, 0x52, 0xF3, 0x0A, 0xFC, 0x89, 0xE1, 0x8E, 0xFE, + 0x8D, 0xE5, 0x73, 0x03, 0x8D, 0xFC, 0x1B, 0xF9, 0xDF, 0x0C, 0xBB, 0xED, + 0xC9, 0x0F, 0xDF, 0xF0, 0x29, 0x07, 0x09, 0xF8, 0xE7, 0xFA, 0x07, 0x0D, + 0x5D, 0xF3, 0xC8, 0x1E, 0xE3, 0x00, 0x9E, 0x1A, 0x5E, 0x16, 0x7F, 0x11, + 0x10, 0x1E, 0xA0, 0x0B, 0x59, 0x15, 0x8E, 0x05, 0xE0, 0x09, 0x6A, 0x06, + 0xD4, 0x05, 0x77, 0x0A, 0x3E, 0xFE, 0xE6, 0x0A, 0x96, 0xF6, 0x0F, 0x0A, + 0x43, 0xFA, 0xDE, 0x04, 0x6F, 0xF9, 0x41, 0x05, 0x20, 0xF4, 0x4F, 0x0C, + 0x70, 0xEE, 0x05, 0x0F, 0xD5, 0xE3, 0x8A, 0x10, 0xC3, 0xE5, 0x48, 0x0B, + 0x5D, 0xF2, 0x2D, 0x00, 0xFB, 0xF3, 0xB1, 0xF6, 0x29, 0xEF, 0x39, 0xEF, + 0xCE, 0xEB, 0x6B, 0xED, 0xAB, 0xE7, 0x91, 0xEA, 0xF1, 0xE7, 0xBB, 0xDD, + 0xBA, 0xEC, 0x84, 0xDA, 0xF9, 0xEC, 0x08, 0xE6, 0x20, 0xF0, 0x20, 0xE4, + 0x9B, 0xFA, 0x21, 0xDC, 0x30, 0x09, 0xB2, 0xDE, 0x16, 0x16, 0x2C, 0xE0, + 0x42, 0x1A, 0x06, 0xE2, 0xF0, 0x17, 0xC2, 0xE8, 0x10, 0x10, 0xAA, 0xF3, + 0x2D, 0x0D, 0x6D, 0x03, 0xE2, 0x0F, 0xBD, 0x0C, 0xDC, 0x12, 0x5B, 0x08, + 0x47, 0x12, 0xD7, 0x03, 0x90, 0x0D, 0x7F, 0x06, 0x83, 0x0C, 0xE5, 0x09, + 0xB4, 0x13, 0x0E, 0x10, 0xF7, 0x1B, 0x0B, 0x1E, 0xF6, 0x1E, 0xBA, 0x30, + 0xC6, 0x1C, 0x91, 0x3E, 0xED, 0x17, 0xDD, 0x42, 0x3B, 0x17, 0xDB, 0x46, + 0xC3, 0x15, 0x3F, 0x49, 0x9E, 0x14, 0x59, 0x42, 0x38, 0x16, 0xFE, 0x41, + 0x49, 0x18, 0xB6, 0x42, 0xDF, 0x1C, 0xA1, 0x38, 0xCD, 0x18, 0x18, 0x35, + 0x7F, 0x0F, 0xC1, 0x3B, 0xD7, 0x0E, 0xCB, 0x3F, 0x46, 0x15, 0x4D, 0x38, + 0x2F, 0x22, 0x4C, 0x30, 0x4C, 0x2A, 0x7E, 0x2B, 0x6F, 0x27, 0xFB, 0x2D, + 0x6F, 0x28, 0x3B, 0x33, 0xFC, 0x2E, 0x5A, 0x33, 0x4C, 0x31, 0x4B, 0x32, + 0x83, 0x33, 0xF5, 0x2A, 0x2D, 0x30, 0x1E, 0x23, 0x2B, 0x26, 0xF0, 0x18, + 0xC3, 0x2E, 0x0C, 0x10, 0x84, 0x38, 0x79, 0x07, 0xF1, 0x2F, 0x06, 0xFE, + 0xEE, 0x22, 0xDC, 0xFE, 0xFB, 0x13, 0xC4, 0xFF, 0x11, 0x0E, 0xF1, 0xFA, + 0x37, 0x0E, 0xA3, 0xF9, 0xA4, 0x0C, 0x03, 0xFB, 0xEE, 0x0B, 0x17, 0xFD, + 0xE6, 0xFB, 0xED, 0xFC, 0xCC, 0xED, 0x52, 0xF8, 0xDF, 0xF8, 0x4E, 0xF5, + 0x0E, 0x05, 0xEB, 0xF3, 0x95, 0x06, 0xD0, 0xF6, 0x20, 0x09, 0xA6, 0x01, + 0x48, 0x0E, 0x27, 0x07, 0xA8, 0x0C, 0xCD, 0x08, 0x37, 0x05, 0x01, 0x10, + 0x30, 0xFC, 0x0C, 0x0F, 0xC7, 0x03, 0xBC, 0x04, 0x7B, 0x16, 0x55, 0xFE, + 0xD1, 0x19, 0x54, 0xF9, 0xEE, 0x0B, 0x2A, 0xFC, 0xDD, 0xF2, 0x3D, 0x09, + 0x99, 0xE1, 0x49, 0x0E, 0xD4, 0xDE, 0xB8, 0x05, 0xCF, 0xE7, 0x02, 0xF4, + 0x58, 0xF2, 0x8E, 0xE7, 0x29, 0xED, 0xB3, 0xE6, 0xC4, 0xE4, 0x08, 0xE2, + 0xE8, 0xE2, 0x7D, 0xDC, 0x20, 0xDF, 0x68, 0xDB, 0xB6, 0xD8, 0xE1, 0xD9, + 0x5C, 0xCD, 0xD5, 0xDB, 0xCF, 0xC3, 0xB7, 0xD9, 0x78, 0xC1, 0xF5, 0xD3, + 0xF8, 0xBF, 0xA3, 0xCF, 0xFA, 0xC1, 0x15, 0xCC, 0x57, 0xC2, 0x2F, 0xC8, + 0xE3, 0xB8, 0xDA, 0xC6, 0x57, 0xBA, 0xAD, 0xC8, 0x31, 0xCB, 0x50, 0xC5, + 0xCA, 0xD6, 0x6A, 0xC4, 0x69, 0xD8, 0x20, 0xC6, 0xFD, 0xD4, 0x6A, 0xC5, + 0x31, 0xD8, 0x9D, 0xCC, 0x15, 0xDB, 0xD9, 0xD7, 0x3B, 0xDB, 0xBA, 0xE3, + 0x49, 0xE0, 0x99, 0xE5, 0x57, 0xDF, 0x56, 0xDC, 0x76, 0xE9, 0xAB, 0xE2, + 0x6C, 0xFA, 0x5A, 0xEA, 0xAE, 0xF8, 0xA4, 0xE8, 0x39, 0xF5, 0x8E, 0xF0, + 0x1C, 0xFB, 0xDD, 0xF5, 0xE7, 0x05, 0xA4, 0xE9, 0x46, 0x0E, 0xDF, 0xD8, + 0x6B, 0x0B, 0xE5, 0xD2, 0x64, 0x03, 0x1C, 0xD9, 0x65, 0xF9, 0xE9, 0xDF, + 0x92, 0xF8, 0xB0, 0xE5, 0xE1, 0xF8, 0x68, 0xEA, 0x2C, 0xEB, 0xA2, 0xF1, + 0xCA, 0xD9, 0xC3, 0xF5, 0x5A, 0xD3, 0x5C, 0xF3, 0xEF, 0xDF, 0x1D, 0xF4, + 0x8A, 0xE8, 0xAA, 0xE6, 0x84, 0xEB, 0x7D, 0xDF, 0x29, 0xE2, 0xAF, 0xEA, + 0x6C, 0xD0, 0x64, 0xEA, 0x3D, 0xD5, 0x9C, 0xEE, 0xB7, 0xE7, 0x84, 0xFD, + 0x42, 0xEF, 0xB0, 0xFC, 0xE7, 0xE2, 0x10, 0xF5, 0x54, 0xE2, 0xA8, 0x00, + 0x90, 0xE9, 0xBC, 0x09, 0x78, 0xDA, 0xB7, 0xFF, 0xE0, 0xD8, 0x08, 0xFB, + 0x51, 0xED, 0x6B, 0xFE, 0xA7, 0xFE, 0x05, 0x00, 0x65, 0x0B, 0x73, 0x07, + 0x1F, 0x0D, 0x25, 0x0D, 0x69, 0x05, 0x91, 0x06, 0x36, 0x05, 0xA5, 0xFF, + 0x8B, 0xFD, 0xE6, 0xF5, 0x69, 0xF7, 0x8A, 0xEE, 0xDC, 0x07, 0x94, 0xFA, + 0xF6, 0x07, 0x83, 0x07, 0xB3, 0x07, 0x0B, 0x10, 0x60, 0x13, 0xF4, 0x1B, + 0x88, 0x0D, 0x24, 0x17, 0x9D, 0x15, 0xA7, 0x0C, 0xCA, 0x27, 0x9A, 0x0E, + 0xE5, 0x24, 0x06, 0x0F, 0x9F, 0x16, 0xA4, 0x0A, 0xA5, 0x14, 0x8E, 0x09, + 0x3A, 0x18, 0xEE, 0xFA, 0xF4, 0x12, 0x5E, 0xF2, 0xF5, 0x09, 0x1C, 0xFE, + 0x52, 0xFA, 0xBC, 0xFE, 0x80, 0xF6, 0xB8, 0xF9, 0xB8, 0xF9, 0xB7, 0xFE, + 0x37, 0xEE, 0x09, 0xF5, 0xBD, 0xE5, 0x53, 0xE4, 0x85, 0xF1, 0x90, 0xF2, + 0x76, 0xF1, 0x97, 0xFA, 0xC0, 0xEC, 0x55, 0xFD, 0x7D, 0xFC, 0x20, 0x08, + 0xCC, 0x05, 0x73, 0x06, 0x48, 0x0A, 0x68, 0xFE, 0x5C, 0x12, 0x5A, 0xF6, + 0x09, 0x0E, 0xF9, 0xF3, 0xB9, 0x08, 0xF6, 0xFA, 0xC6, 0x04, 0x6C, 0x0B, + 0x1A, 0xFB, 0x33, 0x0C, 0x60, 0x01, 0x3F, 0x08, 0xAD, 0x0E, 0x65, 0x0F, + 0x5D, 0x10, 0xE2, 0x0B, 0x07, 0x10, 0xCB, 0x06, 0x26, 0x12, 0xE7, 0x06, + 0xFE, 0x0F, 0x61, 0xFF, 0x7B, 0x0E, 0xCB, 0xFC, 0x1C, 0x04, 0x08, 0x03, + 0xFB, 0xF6, 0x0C, 0x09, 0x7A, 0x01, 0xB9, 0x17, 0xB4, 0x0B, 0x5F, 0x1C, + 0xAA, 0x06, 0x7C, 0x0D, 0x53, 0x05, 0x2E, 0x0C, 0xE7, 0xFD, 0x11, 0x0F, + 0x6E, 0xFA, 0xC2, 0x0B, 0x48, 0x04, 0x20, 0x13, 0xFC, 0x08, 0x93, 0x20, + 0x0C, 0x07, 0x83, 0x29, 0x5B, 0x02, 0xB4, 0x20, 0x72, 0x05, 0x6C, 0x18, + 0x50, 0x09, 0x16, 0x18, 0xB5, 0x0F, 0x41, 0x13, 0x07, 0x1A, 0x54, 0x14, + 0x21, 0x14, 0xB1, 0x14, 0x7E, 0x13, 0xD5, 0x15, 0x83, 0x11, 0xA6, 0x0D, + 0x7C, 0x05, 0xFF, 0xFC, 0x22, 0xF3, 0xE0, 0xF5, 0x6E, 0xE9, 0x08, 0xFC, + 0xE2, 0xF6, 0x2A, 0x00, 0xFD, 0xFF, 0xC5, 0xEF, 0x7A, 0x00, 0x80, 0xDC, + 0x0F, 0x08, 0xD6, 0xD4, 0x7E, 0x0B, 0x8D, 0xD0, 0xAE, 0x0D, 0xF8, 0xD7, + 0x3F, 0x13, 0xBA, 0xDC, 0x52, 0x0E, 0x24, 0xD6, 0x25, 0x06, 0x95, 0xE2, + 0x4B, 0xF2, 0x22, 0xED, 0xB1, 0xE9, 0xDF, 0xE9, 0xAC, 0xEB, 0xC6, 0xDD, + 0x9A, 0xEA, 0xD3, 0xD4, 0x63, 0xF1, 0x47, 0xD4, 0x2A, 0xFA, 0xB8, 0xE0, + 0xA3, 0xED, 0x40, 0xF0, 0xD0, 0xE3, 0xE9, 0xF7, 0xBE, 0xE8, 0x70, 0x04, + 0xA6, 0xE4, 0xF3, 0x15, 0x7C, 0xE9, 0xD2, 0x1F, 0x5C, 0xF5, 0x5F, 0x1F, + 0xA3, 0x03, 0x21, 0x25, 0xD9, 0x0E, 0x60, 0x24, 0xD0, 0x0A, 0xBD, 0x20, + 0x17, 0x04, 0x3F, 0x24, 0xED, 0x08, 0xDB, 0x24, 0x1B, 0x0F, 0xEA, 0x20, + 0x24, 0x10, 0x86, 0x1D, 0xB8, 0x0E, 0x7F, 0x1B, 0x58, 0x01, 0x76, 0x11, + 0x51, 0xF9, 0x92, 0x06, 0xE4, 0x08, 0xF2, 0x04, 0xDA, 0x0B, 0xE5, 0xF5, + 0xE9, 0x02, 0x8C, 0xE8, 0x36, 0x00, 0xCA, 0xF2, 0xC4, 0xF7, 0x1F, 0xF3, + 0xAF, 0x01, 0xD3, 0xEF, 0x99, 0x11, 0xF8, 0xF1, 0x22, 0x0E, 0xC4, 0xEF, + 0x9F, 0xFF, 0x4D, 0xF0, 0x80, 0xF6, 0x0E, 0xEF, 0xF9, 0xF8, 0xAE, 0xE5, + 0xB1, 0xFB, 0xF9, 0xE2, 0x23, 0x01, 0x2F, 0xF1, 0x23, 0x05, 0x9E, 0xFD, + 0x14, 0x03, 0xC5, 0x00, 0x60, 0xFB, 0x4F, 0xFF, 0xFB, 0xF3, 0xD7, 0xFB, + 0xE1, 0xEE, 0x3F, 0xF9, 0x8C, 0xF7, 0x87, 0xFB, 0xAC, 0x05, 0x31, 0xF8, + 0x92, 0x09, 0x0B, 0xF7, 0x0C, 0x03, 0x67, 0xFD, 0x1D, 0xFA, 0xCA, 0x0B, + 0x96, 0xF4, 0xCE, 0x15, 0x81, 0x00, 0x27, 0x15, 0xB4, 0x14, 0x52, 0x10, + 0x21, 0x1B, 0x52, 0x09, 0xD2, 0x16, 0x95, 0x0B, 0x6B, 0x0D, 0x44, 0x15, + 0x35, 0x07, 0x97, 0x24, 0xE1, 0x0B, 0x62, 0x2D, 0x23, 0x15, 0x11, 0x22, + 0xBC, 0x1D, 0x96, 0x0F, 0x06, 0x26, 0x1D, 0x0F, 0x92, 0x18, 0xFE, 0x10, + 0x10, 0x0A, 0x29, 0x0C, 0xE1, 0x0C, 0x45, 0x11, 0xCF, 0x02, 0x3B, 0x0E, + 0xD6, 0x00, 0x5B, 0x0F, 0xD3, 0xFE, 0xA9, 0x10, 0x0D, 0xFD, 0x1E, 0x12, + 0x28, 0x01, 0x67, 0x15, 0x0D, 0x00, 0x08, 0x11, 0x37, 0x02, 0x08, 0x0F, + 0x8A, 0x02, 0xBB, 0x0B, 0x25, 0x02, 0x6C, 0x0C, 0x6F, 0xFA, 0xF7, 0x04, + 0xD4, 0x02, 0x83, 0x08, 0x9C, 0x02, 0xA5, 0x0C, 0x88, 0xFE, 0xFA, 0x0A, + 0x2A, 0x12, 0x57, 0x1B, 0x73, 0x12, 0xC2, 0x20, 0x22, 0x03, 0xCA, 0x19, + 0x5C, 0x0E, 0x93, 0x21, 0xFD, 0x1A, 0xF8, 0x17, 0x8A, 0x19, 0x69, 0x01, + 0x7C, 0x1F, 0x18, 0x03, 0x08, 0x14, 0xC4, 0x03, 0x4B, 0xFE, 0xEE, 0x05, + 0x56, 0xFE, 0xB4, 0x0E, 0x7E, 0x0B, 0x2D, 0x0A, 0x7B, 0x18, 0x16, 0x04, + 0xAD, 0x21, 0x20, 0x05, 0xAC, 0x27, 0x83, 0x02, 0x81, 0x2D, 0x73, 0x0A, + 0x02, 0x2D, 0x12, 0x11, 0xF4, 0x25, 0x44, 0x0B, 0x02, 0x1E, 0x72, 0x10, + 0x70, 0x13, 0x73, 0x10, 0xA5, 0x05, 0x0D, 0x01, 0xB2, 0xFD, 0x76, 0xFA, + 0xA5, 0xFD, 0x2A, 0xFA, 0xAC, 0xFC, 0x24, 0xF2, 0x90, 0x01, 0x3A, 0xF0, + 0x79, 0x0A, 0xF1, 0xF7, 0xE5, 0x06, 0x75, 0xFD, 0x33, 0xFA, 0x34, 0x04, + 0x2A, 0xED, 0x2D, 0x09, 0xF1, 0xE9, 0xD6, 0x0D, 0x95, 0xEC, 0x84, 0x0B, + 0x5F, 0xF2, 0x6B, 0x0C, 0xBE, 0xF6, 0x14, 0x1A, 0xEF, 0xF0, 0xA2, 0x15, + 0xFE, 0xEA, 0x78, 0x0B, 0xF1, 0xED, 0x37, 0x0F, 0x0C, 0xF5, 0xC4, 0x0A, + 0x7D, 0xFB, 0x07, 0x05, 0xEB, 0xF4, 0xDE, 0x08, 0xC9, 0xE8, 0x73, 0x0D, + 0xF9, 0xEA, 0xC3, 0x05, 0xD5, 0xFE, 0x67, 0xFA, 0x83, 0x0E, 0xC5, 0xFC, + 0x5D, 0x01, 0x30, 0x00, 0xE9, 0xF0, 0x55, 0x01, 0xEB, 0xF2, 0x4F, 0x03, + 0x89, 0xFF, 0x03, 0x08, 0x89, 0x07, 0x41, 0x08, 0x3A, 0xFF, 0x03, 0x01, + 0xAD, 0xF8, 0x9D, 0xF4, 0xBF, 0x07, 0x58, 0xEE, 0x6C, 0x0B, 0x81, 0xEE, + 0xFB, 0x07, 0xB8, 0xF3, 0x83, 0x15, 0xC5, 0x00, 0x6E, 0x1B, 0x51, 0x06, + 0xC3, 0x1E, 0xED, 0x0A, 0x09, 0x1F, 0xE9, 0x0C, 0xC1, 0x13, 0xF3, 0x0C, + 0xB9, 0x0C, 0xDD, 0x0D, 0xEF, 0x0D, 0xB0, 0x00, 0xFA, 0x16, 0x7C, 0xF7, + 0x76, 0x1F, 0x9C, 0xF8, 0x02, 0x18, 0x96, 0xFC, 0x94, 0x08, 0x2D, 0x04, + 0x16, 0x00, 0x02, 0x0A, 0x1F, 0xFE, 0xE7, 0x0E, 0x13, 0x02, 0xD6, 0x05, + 0x55, 0x05, 0x28, 0xF3, 0x26, 0x00, 0xD8, 0xEB, 0x06, 0xF3, 0xEE, 0xE8, + 0x2C, 0xE9, 0x60, 0xE6, 0xD9, 0xE8, 0x7E, 0xED, 0xB7, 0xEE, 0x8D, 0xFB, + 0x80, 0xEA, 0xDF, 0x06, 0xCB, 0xD1, 0xA9, 0x01, 0x4F, 0xD6, 0x49, 0xFB, + 0x57, 0xEB, 0x18, 0xF5, 0x02, 0xEA, 0xCB, 0xE9, 0xEF, 0xE8, 0xC5, 0xE4, + 0x66, 0xE9, 0xF8, 0xE5, 0x5F, 0xF0, 0x3A, 0xF2, 0xD7, 0xF5, 0x09, 0xFC, + 0x71, 0xF6, 0x31, 0xF7, 0x41, 0xF9, 0x02, 0xFD, 0x9D, 0xF5, 0x64, 0x0A, + 0xE1, 0xF8, 0x9D, 0x0C, 0x14, 0x00, 0x80, 0x0D, 0x9B, 0xFC, 0x47, 0x18, + 0x9B, 0xFA, 0xDE, 0x1A, 0xCF, 0x05, 0x5A, 0x10, 0x36, 0x1B, 0x81, 0x16, + 0xDF, 0x2A, 0x55, 0x1A, 0x41, 0x2D, 0x79, 0x1D, 0xA6, 0x1F, 0xA3, 0x29, + 0xA3, 0x17, 0xBE, 0x2A, 0x74, 0x19, 0x5D, 0x27, 0xD3, 0x1A, 0x36, 0x21, + 0xC4, 0x1E, 0xBE, 0x0E, 0x10, 0x1B, 0x31, 0x05, 0xF4, 0x0E, 0xFA, 0x0F, + 0xB7, 0x01, 0x3C, 0x0E, 0xF0, 0xFF, 0xA4, 0x08, 0x95, 0xFF, 0x76, 0x0B, + 0xC7, 0x04, 0xED, 0x0A, 0x70, 0x05, 0x52, 0x04, 0xCD, 0x06, 0xFB, 0x00, + 0x98, 0x19, 0x52, 0xFF, 0x52, 0x24, 0x7B, 0xF3, 0xC2, 0x18, 0x8F, 0xEE, + 0x3F, 0x08, 0x5D, 0xFA, 0x6B, 0x06, 0x8A, 0x06, 0x1A, 0x07, 0xE2, 0x0B, + 0xD5, 0xFD, 0xB2, 0x02, 0x35, 0x00, 0xFA, 0xF6, 0x24, 0x06, 0xB1, 0xF3, + 0x5A, 0x05, 0x21, 0xF9, 0x8A, 0x08, 0x90, 0xFD, 0x9A, 0x09, 0x76, 0xFA, + 0x9E, 0x0A, 0x2C, 0xFF, 0x0F, 0x09, 0x41, 0x03, 0xD3, 0x0A, 0xEF, 0x0D, + 0x7B, 0x0C, 0xBD, 0x13, 0xD1, 0x07, 0x3F, 0x0C, 0x75, 0xFE, 0xA8, 0x17, + 0xE4, 0xEC, 0xA7, 0x23, 0x76, 0xEA, 0x82, 0x15, 0x85, 0x08, 0x4E, 0x0D, + 0x4B, 0x19, 0xFA, 0x17, 0x77, 0x01, 0x00, 0x19, 0x33, 0xEE, 0xF7, 0x12, + 0xA6, 0xF8, 0x6F, 0x0E, 0x46, 0x06, 0xDA, 0xFE, 0x60, 0x0D, 0x7E, 0xF6, + 0xF8, 0x0B, 0xB0, 0xFF, 0x5F, 0xFC, 0x24, 0x00, 0xA2, 0xF6, 0xC0, 0xF2, + 0x50, 0xF6, 0x7F, 0xE5, 0x6B, 0xEE, 0x9E, 0xEA, 0xEE, 0xE6, 0xC2, 0xF7, + 0x9E, 0xE7, 0xD2, 0xF0, 0xC1, 0xEE, 0x2E, 0xE4, 0x9E, 0xF6, 0x93, 0xE7, + 0xB2, 0xEE, 0xEE, 0xE3, 0x2B, 0xE4, 0xEC, 0xD8, 0x1F, 0xEB, 0x0B, 0xD4, + 0x92, 0xF0, 0x49, 0xD6, 0x58, 0xE8, 0xF9, 0xDE, 0x9F, 0xE5, 0x7C, 0xE8, + 0xD5, 0xE6, 0x33, 0xE6, 0xA4, 0xDA, 0xD9, 0xD5, 0x18, 0xD9, 0xCF, 0xCF, + 0x69, 0xE4, 0xA8, 0xD0, 0x02, 0xEE, 0x1A, 0xD1, 0x7A, 0xEE, 0xC6, 0xD8, + 0xA4, 0xE6, 0xA6, 0xEF, 0xD4, 0xE2, 0x59, 0xFE, 0x57, 0xEC, 0xAA, 0xF7, + 0xAD, 0x02, 0x16, 0xF4, 0x44, 0x12, 0x62, 0xF4, 0x2F, 0x07, 0xF6, 0xF1, + 0x07, 0x04, 0x51, 0xFB, 0xE8, 0x0C, 0xEB, 0x00, 0x70, 0x07, 0x24, 0xFD, + 0x1F, 0xFC, 0x7D, 0x06, 0xE8, 0xF4, 0x4E, 0x16, 0x3A, 0xEF, 0x8D, 0x19, + 0x99, 0xED, 0x3A, 0x08, 0xCE, 0xFD, 0xB2, 0xF5, 0x57, 0x01, 0xBD, 0xEC, + 0xF3, 0xF7, 0xA4, 0xF0, 0x21, 0xFA, 0xCA, 0x00, 0x0B, 0x00, 0xBA, 0x0D, + 0x9C, 0xFF, 0xAE, 0x13, 0x57, 0x02, 0xD6, 0x0D, 0x11, 0x0A, 0x03, 0xFC, + 0xA4, 0x05, 0x07, 0xFB, 0xDD, 0xF3, 0x4E, 0x00, 0xB9, 0xEE, 0xFE, 0xF9, + 0x80, 0xEF, 0x53, 0xF8, 0xB2, 0xE3, 0x0F, 0x02, 0x13, 0xE7, 0xBD, 0x0D, + 0x46, 0xF7, 0xB0, 0x0C, 0xAD, 0xFF, 0xA6, 0x11, 0xFC, 0xFC, 0x96, 0x11, + 0x88, 0xFF, 0xEE, 0x0B, 0x47, 0x03, 0x06, 0x0C, 0x21, 0xFF, 0xDF, 0x07, + 0x40, 0x05, 0xA0, 0x04, 0x45, 0x07, 0xFA, 0x00, 0x9F, 0x01, 0xA6, 0x00, + 0x1B, 0x00, 0x03, 0xFA, 0x1C, 0xFC, 0x36, 0xF6, 0xA5, 0xF3, 0xA9, 0xFA, + 0xCF, 0xE8, 0x27, 0xF8, 0x9C, 0xEF, 0x41, 0xF6, 0x5B, 0x03, 0x75, 0xF0, + 0x2F, 0x11, 0xB8, 0xE1, 0x5A, 0x1D, 0xBE, 0xE4, 0x41, 0x1E, 0x2C, 0xF6, + 0x44, 0x19, 0xD0, 0xFF, 0xDF, 0x17, 0x96, 0x08, 0xED, 0x1D, 0x22, 0x18, + 0xA1, 0x25, 0x2F, 0x19, 0xFD, 0x25, 0x20, 0x14, 0x77, 0x24, 0x45, 0x1B, + 0xE5, 0x2C, 0xAC, 0x15, 0x9F, 0x39, 0x5B, 0x01, 0x16, 0x2A, 0xDA, 0xFB, + 0x12, 0x10, 0x6E, 0x08, 0x6E, 0x07, 0x09, 0x0C, 0x91, 0x08, 0x8F, 0x03, + 0x08, 0x0F, 0xCD, 0x0B, 0xD5, 0xFE, 0x23, 0x19, 0x57, 0xDB, 0xA3, 0x15, + 0x55, 0xDB, 0x23, 0x15, 0x8F, 0xF6, 0x63, 0x10, 0x4C, 0xF8, 0xED, 0x01, + 0xF0, 0xEF, 0x04, 0x01, 0xD7, 0xF0, 0xAD, 0x01, 0x17, 0xEF, 0x41, 0xF9, + 0x6C, 0xE6, 0x83, 0xF5, 0xAD, 0xE1, 0x34, 0x00, 0x6A, 0xE6, 0x98, 0x08, + 0xBB, 0xE6, 0x48, 0x00, 0x36, 0xE2, 0x99, 0xF1, 0x4A, 0xE8, 0xAB, 0xE9, + 0x82, 0xFA, 0x2E, 0xED, 0x74, 0xFF, 0x4B, 0xF2, 0x0C, 0x09, 0x33, 0xF9, + 0xE9, 0x1B, 0x9D, 0xFE, 0xA7, 0x15, 0xF4, 0x01, 0xDD, 0x0B, 0xA5, 0x02, + 0x39, 0x13, 0x45, 0x00, 0xAE, 0x14, 0x0D, 0x00, 0xE5, 0x0C, 0x26, 0xFC, + 0x8F, 0x0F, 0xF8, 0xF2, 0x4A, 0x19, 0xD8, 0xF2, 0x87, 0x10, 0x3B, 0xFF, + 0xA8, 0xF4, 0x09, 0xFE, 0xDB, 0xF1, 0x2C, 0xFC, 0xFA, 0x05, 0xB1, 0xFC, + 0xC2, 0x0A, 0xC8, 0xEA, 0x17, 0x04, 0x01, 0xDC, 0xD7, 0xF0, 0x8A, 0xDB, + 0x02, 0xDA, 0xA2, 0xDD, 0x74, 0xD2, 0x30, 0xE2, 0x26, 0xD7, 0xC9, 0xE6, + 0x18, 0xE7, 0x95, 0xD9, 0x09, 0xF1, 0x11, 0xD0, 0x47, 0xE6, 0xD5, 0xDB, + 0xB5, 0xD7, 0x3D, 0xE5, 0x30, 0xD6, 0xAA, 0xE3, 0xFB, 0xD9, 0x29, 0xDE, + 0x7F, 0xDA, 0x9F, 0xDB, 0x46, 0xDE, 0xB7, 0xE2, 0x66, 0xDC, 0x71, 0xE9, + 0xE0, 0xD8, 0x9C, 0xF0, 0x64, 0xDF, 0x48, 0xF6, 0x98, 0xEA, 0xD6, 0xF2, + 0x63, 0xF2, 0x5E, 0xEC, 0x6C, 0xF6, 0x20, 0xE0, 0x43, 0xFB, 0xA1, 0xDC, + 0x53, 0xF6, 0x70, 0xEA, 0xFE, 0xEB, 0xA6, 0xF4, 0xF5, 0xE9, 0x9C, 0xFB, + 0x87, 0xF6, 0xA2, 0x05, 0xF7, 0xFE, 0xC4, 0xFB, 0xC1, 0x01, 0x01, 0xF4, + 0x2D, 0x08, 0xB8, 0x01, 0x15, 0x01, 0x25, 0x07, 0x6C, 0xF7, 0x70, 0xFC, + 0xA2, 0xFE, 0xC7, 0xF4, 0x9E, 0x09, 0x5F, 0xF9, 0xF4, 0x0A, 0x11, 0x06, + 0xBC, 0xFE, 0xDA, 0x15, 0xDF, 0xE8, 0x76, 0x1D, 0xA1, 0xE3, 0x42, 0x11, + 0xBC, 0xF1, 0x24, 0xF8, 0xE3, 0xF5, 0xC1, 0xE9, 0xA2, 0xF2, 0x80, 0xED, + 0xF0, 0xF1, 0x77, 0xF6, 0x7A, 0xE9, 0xA8, 0xF5, 0xCF, 0xE2, 0x6C, 0xF1, + 0xDF, 0xDB, 0x9E, 0xE5, 0x36, 0xD1, 0xFE, 0xCE, 0x0B, 0xCD, 0xC9, 0xC2, + 0x02, 0xD4, 0xC0, 0xB9, 0xD9, 0xE6, 0x39, 0xBD, 0x0E, 0xEC, 0x3F, 0xCE, + 0xE6, 0xE3, 0xC7, 0xCF, 0x9E, 0xEB, 0x9F, 0xCE, 0x02, 0xEE, 0xDB, 0xD4, + 0x55, 0xE6, 0x3D, 0xDC, 0x37, 0xF5, 0x44, 0xE6, 0x32, 0x09, 0xD3, 0xEE, + 0x58, 0x0B, 0x17, 0xF0, 0xC7, 0x08, 0x14, 0xF3, 0x82, 0x02, 0x0D, 0xF1, + 0x25, 0x00, 0x0F, 0xEE, 0x05, 0x12, 0x72, 0xFD, 0x37, 0x18, 0xEE, 0x0F, + 0x48, 0x05, 0xEE, 0x1D, 0xFB, 0x07, 0xF9, 0x1F, 0x61, 0x19, 0x7B, 0x1B, + 0xF5, 0x15, 0x40, 0x22, 0x29, 0x0E, 0x09, 0x2B, 0xD3, 0x04, 0x22, 0x2B, + 0xF6, 0xF7, 0xCC, 0x2F, 0x22, 0xF7, 0x24, 0x2F, 0x21, 0xFA, 0x31, 0x26, + 0x2C, 0xF9, 0x63, 0x2B, 0x25, 0xFE, 0x92, 0x2C, 0x03, 0x00, 0xAA, 0x1D, + 0xB9, 0x02, 0x54, 0x18, 0x27, 0x0A, 0x37, 0x21, 0x50, 0x0A, 0x2F, 0x28, + 0x11, 0x0E, 0x19, 0x2F, 0x1C, 0x1C, 0xFD, 0x32, 0x91, 0x32, 0x31, 0x29, + 0x86, 0x40, 0x25, 0x1D, 0xA0, 0x3A, 0xBA, 0x22, 0x72, 0x2E, 0xD4, 0x2F, + 0x32, 0x29, 0xB9, 0x2D, 0x28, 0x27, 0x28, 0x1D, 0x63, 0x37, 0x3E, 0x12, + 0x8B, 0x4A, 0x69, 0x10, 0xE5, 0x42, 0x55, 0x19, 0x44, 0x2C, 0xC0, 0x1B, + 0xFF, 0x1C, 0xC5, 0x10, 0xEE, 0x17, 0x2B, 0x0A, 0xC0, 0x15, 0x0C, 0x04, + 0x47, 0x18, 0xC0, 0xFF, 0x36, 0x0F, 0x99, 0xFB, 0x2D, 0x05, 0xEF, 0xF9, + 0xBA, 0x07, 0xC3, 0xFD, 0xE3, 0x08, 0x44, 0x03, 0xB6, 0xFD, 0xC2, 0x02, + 0xD2, 0xF1, 0x25, 0xFF, 0x14, 0xFB, 0x1C, 0x06, 0xD2, 0x0D, 0x97, 0x0F, + 0xBB, 0x14, 0xE8, 0x12, 0xC3, 0x0B, 0xFE, 0x07, 0x81, 0x04, 0xD5, 0xF9, + 0xE7, 0x09, 0x15, 0xF7, 0x2A, 0x07, 0xF7, 0xF5, 0x54, 0xF6, 0x5C, 0x04, + 0xBE, 0xE6, 0x7F, 0x14, 0x31, 0xE9, 0xB2, 0x0B, 0x3E, 0xF8, 0xC7, 0xFB, + 0xEF, 0xFA, 0xDD, 0xF0, 0x00, 0xF4, 0x2E, 0xEC, 0x38, 0xE9, 0xF5, 0xF0, + 0xAF, 0xE2, 0x88, 0xF9, 0xB1, 0xE8, 0xF0, 0xF3, 0x13, 0xF4, 0x95, 0xEE, + 0xB5, 0xFB, 0xD2, 0xF3, 0x0F, 0xFC, 0x32, 0xF8, 0xEF, 0x01, 0x24, 0x03, + 0x1A, 0xFE, 0x27, 0x0B, 0xC2, 0xF3, 0x59, 0x08, 0x1F, 0xFC, 0x9F, 0x00, + 0x31, 0x07, 0xA1, 0xFA, 0xCC, 0x03, 0xA0, 0xFD, 0xC1, 0xFF, 0xA5, 0x03, + 0xE2, 0x0E, 0xD9, 0x09, 0x30, 0x16, 0xB0, 0x14, 0x5D, 0x0F, 0xD2, 0x20, + 0xCA, 0x0E, 0x20, 0x26, 0xB6, 0x19, 0xE3, 0x2C, 0x0D, 0x2D, 0x20, 0x2E, + 0x51, 0x36, 0x15, 0x1D, 0x46, 0x30, 0xAF, 0x1A, 0xDC, 0x24, 0xBD, 0x2D, + 0x8C, 0x1D, 0x21, 0x35, 0xD9, 0x1C, 0x5F, 0x37, 0x4E, 0x23, 0x7B, 0x34, + 0x1D, 0x24, 0x25, 0x29, 0xBE, 0x1F, 0xDD, 0x28, 0x08, 0x27, 0x2B, 0x25, + 0x9B, 0x31, 0x66, 0x10, 0xEC, 0x30, 0x67, 0x07, 0x4C, 0x26, 0x1D, 0x15, + 0xB1, 0x1E, 0x13, 0x21, 0xA8, 0x1E, 0x2C, 0x1E, 0x52, 0x1F, 0xA5, 0x1B, + 0xAD, 0x15, 0xB6, 0x1C, 0xDE, 0x0C, 0x2B, 0x19, 0x24, 0x0A, 0x8F, 0x1F, + 0x69, 0x0E, 0xB7, 0x26, 0xFD, 0x21, 0x73, 0x19, 0x9D, 0x2B, 0x34, 0x16, + 0xBF, 0x1A, 0xCB, 0x25, 0xEB, 0x0A, 0x87, 0x2A, 0x2D, 0x0B, 0xD3, 0x1C, + 0xDE, 0x0D, 0xD4, 0x03, 0xE7, 0x0F, 0x34, 0xF8, 0xA4, 0x01, 0x46, 0x02, + 0x3C, 0xE8, 0xA4, 0x04, 0x07, 0xE3, 0xF6, 0xFE, 0x32, 0xDE, 0x49, 0xF4, + 0x18, 0xD4, 0x31, 0xE6, 0xDA, 0xD7, 0x45, 0xE2, 0x17, 0xD7, 0x26, 0xDB, + 0x68, 0xD1, 0x1E, 0xD7, 0x9D, 0xD1, 0xE8, 0xD3, 0x74, 0xD7, 0x25, 0xCA, + 0x3C, 0xDE, 0xAB, 0xC4, 0xC0, 0xE2, 0xD0, 0xC8, 0xB6, 0xE5, 0xF2, 0xCE, + 0x9A, 0xE0, 0x51, 0xD5, 0xE3, 0xDD, 0x7B, 0xE1, 0x13, 0xD8, 0x00, 0xDC, + 0xD1, 0xCB, 0x43, 0xD0, 0x20, 0xC9, 0xE8, 0xCC, 0xD4, 0xD3, 0x39, 0xC3, + 0x1F, 0xDC, 0xCA, 0xBA, 0x20, 0xCA, 0xA0, 0xBC, 0xF1, 0xB6, 0xC4, 0xC1, + 0x2E, 0xBF, 0xE5, 0xC8, 0x5E, 0xC6, 0xF5, 0xC9, 0x36, 0xC2, 0x1D, 0xC5, + 0xCD, 0xC1, 0x7F, 0xC3, 0x06, 0xC4, 0x8A, 0xC0, 0x08, 0xCF, 0x2D, 0xBE, + 0x6F, 0xDD, 0x29, 0xC0, 0x66, 0xD7, 0x25, 0xC8, 0x43, 0xD3, 0x7F, 0xDD, + 0xDC, 0xD7, 0xAC, 0xF1, 0xA8, 0xDB, 0x43, 0xFC, 0xF8, 0xE8, 0x43, 0x05, + 0x84, 0xFA, 0xF5, 0x01, 0xFB, 0x0E, 0xB9, 0xF9, 0x01, 0x1E, 0x31, 0xFF, + 0xAB, 0x26, 0x3E, 0x10, 0x95, 0x27, 0x44, 0x1D, 0x48, 0x1E, 0x53, 0x27, + 0x4E, 0x1D, 0x58, 0x33, 0x38, 0x25, 0xF9, 0x2C, 0x93, 0x20, 0xEA, 0x1E, + 0x97, 0x19, 0x39, 0x16, 0x49, 0x19, 0xD8, 0x04, 0xA3, 0x16, 0x74, 0x06, + 0xE3, 0x0C, 0x53, 0x16, 0x9F, 0x08, 0x38, 0x14, 0xF3, 0x1C, 0xDB, 0x13, + 0x59, 0x29, 0xA3, 0x13, 0x08, 0x1C, 0xC0, 0x0C, 0x41, 0x12, 0x2D, 0x12, + 0xC5, 0x15, 0xD8, 0x15, 0xD4, 0x13, 0x7C, 0x0C, 0x0C, 0x09, 0x17, 0x08, + 0xC9, 0xFF, 0x76, 0x10, 0x4F, 0xF9, 0xD1, 0x18, 0x24, 0xFF, 0x94, 0x17, + 0x37, 0x0D, 0x64, 0x1C, 0x02, 0x14, 0xA0, 0x28, 0x85, 0x19, 0xAB, 0x34, + 0xCA, 0x1A, 0x5A, 0x42, 0x85, 0x14, 0xBC, 0x4B, 0x71, 0x14, 0x39, 0x3E, + 0x46, 0x21, 0xC5, 0x30, 0xB8, 0x2D, 0x08, 0x39, 0x6F, 0x2F, 0x6C, 0x3C, + 0xF7, 0x33, 0x2D, 0x3B, 0x99, 0x34, 0x3A, 0x34, 0xA8, 0x20, 0xBA, 0x29, + 0x05, 0x0A, 0x49, 0x2C, 0x00, 0x08, 0x68, 0x2D, 0x5F, 0x19, 0x30, 0x1D, + 0xB8, 0x2B, 0x84, 0x05, 0x55, 0x35, 0xA6, 0xF9, 0x63, 0x2B, 0xCE, 0xF7, + 0xB3, 0x16, 0x82, 0xF4, 0xFD, 0x0F, 0x5F, 0xF4, 0x5A, 0x16, 0x3E, 0xFA, + 0x3C, 0x17, 0x57, 0xF6, 0x83, 0x1B, 0x03, 0xF8, 0x05, 0x27, 0xDB, 0xFF, + 0xE8, 0x1B, 0x0F, 0xF0, 0x02, 0x0C, 0x29, 0xE0, 0xA9, 0x09, 0xA1, 0xE6, + 0xC3, 0x05, 0xBD, 0xEB, 0x31, 0xFE, 0xCE, 0xE2, 0xF8, 0xF1, 0xF1, 0xDD, + 0xE1, 0xE6, 0x80, 0xE5, 0xF2, 0xDD, 0x17, 0xE6, 0x41, 0xDD, 0x63, 0xE5, + 0x7D, 0xE9, 0x79, 0xF5, 0xCA, 0xF3, 0x13, 0xFD, 0x53, 0xF3, 0xF8, 0xF4, + 0xC0, 0xEC, 0xA6, 0xF6, 0x78, 0xE5, 0x39, 0x01, 0x96, 0xE8, 0x54, 0x0A, + 0x4D, 0xFB, 0x4F, 0x12, 0x76, 0x11, 0x9E, 0x19, 0xD1, 0x11, 0xD0, 0x1E, + 0x5C, 0x04, 0x28, 0x2E, 0xA2, 0x06, 0xA8, 0x3B, 0x48, 0x1C, 0xF8, 0x36, + 0x02, 0x3C, 0x2D, 0x2E, 0x9E, 0x4C, 0xA2, 0x2E, 0xC1, 0x4B, 0xCD, 0x37, + 0xFA, 0x42, 0xD8, 0x42, 0xCD, 0x38, 0xEC, 0x4C, 0xE2, 0x3A, 0x44, 0x48, + 0xCD, 0x3B, 0xB9, 0x34, 0x17, 0x32, 0xF0, 0x21, 0xEB, 0x2F, 0xEE, 0x17, + 0xFC, 0x34, 0x2F, 0x14, 0xBA, 0x27, 0x56, 0x17, 0x05, 0x13, 0x84, 0x19, + 0x70, 0x06, 0x69, 0x0F, 0x42, 0xFC, 0x57, 0x06, 0x14, 0xF3, 0x6D, 0xF4, + 0x7D, 0xF2, 0xE8, 0xE4, 0x14, 0xEC, 0x25, 0xE0, 0x24, 0xDD, 0x54, 0xDB, + 0x32, 0xD9, 0x38, 0xD8, 0x1D, 0xDC, 0xE6, 0xD3, 0x8F, 0xE1, 0x9F, 0xD2, + 0xE0, 0xDF, 0xDF, 0xD1, 0xB1, 0xDC, 0x5D, 0xD7, 0x5B, 0xE5, 0x60, 0xE1, + 0x32, 0xF4, 0x95, 0xDE, 0x51, 0xFE, 0x15, 0xDA, 0xC1, 0xFC, 0x6F, 0xE9, + 0x1B, 0xF1, 0xA9, 0xF5, 0x57, 0xE9, 0xFB, 0xFA, 0x49, 0xE8, 0x3C, 0xFC, + 0x58, 0xEA, 0x22, 0xEF, 0xE4, 0xEA, 0x66, 0xE1, 0x53, 0xE4, 0x54, 0xDC, + 0x45, 0xDD, 0x72, 0xDE, 0xB1, 0xD5, 0xCA, 0xDD, 0x07, 0xD4, 0x2B, 0xDA, + 0x99, 0xCD, 0x6E, 0xD1, 0xBF, 0xBB, 0xB6, 0xD0, 0xA0, 0xB1, 0xB3, 0xDD, + 0x16, 0xB2, 0x0B, 0xE5, 0x39, 0xBF, 0x0B, 0xDA, 0x88, 0xD2, 0xC9, 0xC9, + 0xA9, 0xCF, 0x20, 0xC7, 0x80, 0xBC, 0x22, 0xCA, 0xEA, 0xAE, 0xC7, 0xCC, + 0x45, 0xB0, 0xF0, 0xCB, 0xE1, 0xC3, 0x61, 0xCE, 0xA2, 0xCA, 0x20, 0xDA, + 0x98, 0xC7, 0xBC, 0xE5, 0x10, 0xCC, 0xFF, 0xDC, 0x0D, 0xC6, 0x4F, 0xC3, + 0x68, 0xBC, 0x4F, 0xB9, 0xF0, 0xB6, 0x39, 0xB5, 0x4A, 0xBA, 0xBA, 0xAC, + 0x3C, 0xC6, 0xE6, 0xA9, 0x48, 0xCB, 0xE1, 0xAD, 0x96, 0xC1, 0xC4, 0xB9, + 0xD7, 0xB4, 0x7F, 0xBD, 0xC8, 0xAF, 0x5A, 0xB0, 0x51, 0xB8, 0xC0, 0xA2, + 0x2D, 0xCD, 0xB7, 0x9F, 0x5D, 0xDA, 0x0C, 0xAD, 0xFF, 0xE0, 0x52, 0xC6, + 0x84, 0xEC, 0xA0, 0xDD, 0x2E, 0x03, 0x31, 0xE8, 0x24, 0x21, 0x87, 0xED, + 0x24, 0x30, 0xF7, 0xFE, 0xAF, 0x25, 0x6A, 0x0F, 0x96, 0x19, 0x97, 0x1A, + 0x2F, 0x24, 0x9C, 0x23, 0xFD, 0x36, 0xB9, 0x24, 0x81, 0x38, 0x83, 0x25, + 0xE8, 0x2D, 0xA2, 0x2A, 0x1F, 0x21, 0x25, 0x2F, 0x68, 0x17, 0xB0, 0x33, + 0xFF, 0x18, 0xFD, 0x34, 0x29, 0x21, 0xFB, 0x33, 0xEB, 0x27, 0x4D, 0x34, + 0xEE, 0x29, 0xFE, 0x2F, 0x3A, 0x24, 0xC2, 0x27, 0xF6, 0x15, 0x84, 0x27, + 0xA3, 0x01, 0x11, 0x2D, 0x4E, 0xF5, 0x45, 0x28, 0x22, 0xF4, 0x18, 0x1D, + 0x2F, 0xF9, 0x7D, 0x11, 0x73, 0xFF, 0x0B, 0x09, 0x26, 0x04, 0x96, 0x0F, + 0x75, 0xFF, 0x75, 0x19, 0x92, 0xEF, 0xE1, 0x18, 0x50, 0xF3, 0xAC, 0x15, + 0x7B, 0x07, 0x55, 0x15, 0xE5, 0x13, 0x6F, 0x14, 0xD0, 0x12, 0x23, 0x12, + 0x93, 0x0D, 0x9D, 0x1B, 0xC4, 0x0E, 0x8F, 0x23, 0x01, 0x15, 0xF6, 0x16, + 0xC4, 0x21, 0x79, 0x0F, 0x6B, 0x26, 0x1E, 0x0D, 0x15, 0x26, 0x41, 0x03, + 0x7C, 0x25, 0xAF, 0xFD, 0xF6, 0x19, 0xAF, 0xF6, 0x66, 0x0D, 0x16, 0xED, + 0x40, 0x06, 0x95, 0xEF, 0xDC, 0x00, 0x23, 0xF6, 0x80, 0xFB, 0x74, 0xED, + 0xB1, 0xF5, 0x5D, 0xDD, 0xEF, 0xF5, 0x8E, 0xD7, 0x5B, 0xFA, 0x82, 0xD7, + 0x18, 0xF5, 0xCC, 0xDA, 0x32, 0xED, 0x52, 0xE7, 0x30, 0xEE, 0xA7, 0xF0, + 0x4B, 0xF1, 0x7D, 0xEF, 0xEF, 0xF1, 0xC6, 0xF5, 0x46, 0xEF, 0xB9, 0x00, + 0xD8, 0xF0, 0x91, 0xFF, 0x2E, 0xFE, 0xBB, 0xF9, 0x4A, 0x0D, 0xBC, 0xF7, + 0x0B, 0x07, 0x18, 0xF2, 0x99, 0xF2, 0x2C, 0xF1, 0x59, 0xE8, 0x6C, 0xFB, + 0x31, 0xE0, 0x79, 0xFB, 0x5E, 0xD6, 0xBA, 0xEF, 0xE4, 0xCF, 0x88, 0xE6, + 0xBE, 0xCA, 0x2F, 0xDE, 0xA1, 0xC8, 0xB6, 0xD1, 0x87, 0xC8, 0x4A, 0xCA, + 0xC7, 0xCC, 0x5A, 0xCB, 0x5C, 0xD5, 0x0F, 0xCC, 0x09, 0xD9, 0xC6, 0xCC, + 0x8B, 0xDF, 0x2F, 0xCF, 0x09, 0xF8, 0xC1, 0xDE, 0xD1, 0x0C, 0xC7, 0xFC, + 0xD9, 0x13, 0xC0, 0x1D, 0x82, 0x1A, 0x30, 0x2E, 0x80, 0x26, 0x25, 0x28, + 0x8F, 0x34, 0xCB, 0x20, 0x2C, 0x41, 0x85, 0x22, 0x10, 0x49, 0x83, 0x32, + 0xDE, 0x47, 0xD5, 0x4D, 0x6D, 0x4F, 0xF7, 0x5D, 0x13, 0x61, 0xB0, 0x59, + 0x48, 0x63, 0x53, 0x4F, 0x8A, 0x57, 0x02, 0x4A, 0x3B, 0x4A, 0xE4, 0x47, + 0xA8, 0x43, 0x44, 0x47, 0xF1, 0x43, 0x60, 0x45, 0xD3, 0x3C, 0x5B, 0x41, + 0xBC, 0x2F, 0xED, 0x43, 0x9E, 0x1E, 0x3C, 0x47, 0xE5, 0x11, 0x90, 0x45, + 0x05, 0x13, 0x46, 0x44, 0xC0, 0x15, 0xA2, 0x3D, 0xF6, 0x14, 0x25, 0x24, + 0x5B, 0x1C, 0x74, 0x09, 0x94, 0x25, 0x31, 0x07, 0x31, 0x24, 0x2C, 0x0C, + 0x21, 0x1B, 0x38, 0x09, 0x0D, 0x0C, 0x1D, 0x0A, 0x6E, 0xFB, 0x41, 0x05, + 0x5A, 0xF0, 0xBE, 0xF4, 0x56, 0xF1, 0x89, 0xF4, 0xEB, 0xFF, 0x58, 0x03, + 0xC6, 0x10, 0xFC, 0x0A, 0xBC, 0x14, 0xCF, 0x0B, 0x20, 0x13, 0xFF, 0x10, + 0x5C, 0x0F, 0x0B, 0x0F, 0xB6, 0x02, 0x80, 0x03, 0xA4, 0xF8, 0x4E, 0xFD, + 0x47, 0xF3, 0xBE, 0xF0, 0xC4, 0xF0, 0x45, 0xDD, 0x1F, 0xEB, 0x9D, 0xD3, + 0x17, 0xDC, 0x8E, 0xD3, 0x27, 0xCB, 0x8A, 0xD5, 0x53, 0xBD, 0x36, 0xD8, + 0x17, 0xBE, 0x65, 0xDD, 0x9B, 0xCA, 0x24, 0xE6, 0xAF, 0xD7, 0xDC, 0xE6, + 0x7D, 0xE1, 0x15, 0xE1, 0x08, 0xDF, 0xF4, 0xDF, 0x84, 0xD9, 0xD9, 0xDD, + 0x16, 0xD6, 0xED, 0xDC, 0x31, 0xDD, 0x33, 0xD7, 0x5E, 0xEF, 0x30, 0xD2, + 0xFA, 0xE9, 0xBA, 0xDF, 0xA1, 0xD6, 0xBE, 0xE5, 0x7C, 0xCE, 0x93, 0xDB, + 0xCF, 0xC9, 0x21, 0xD4, 0xDA, 0xC8, 0x82, 0xCB, 0x81, 0xCC, 0xE1, 0xC7, + 0xBD, 0xC0, 0x97, 0xCE, 0xE2, 0xAA, 0x99, 0xCE, 0xF8, 0xA8, 0x9A, 0xC5, + 0x3E, 0xB6, 0xFB, 0xC1, 0xCC, 0xC7, 0xB1, 0xC1, 0x63, 0xD3, 0x3A, 0xC0, + 0x90, 0xD4, 0x8D, 0xBE, 0x17, 0xD0, 0xB9, 0xBE, 0xCF, 0xC3, 0x9F, 0xC0, + 0x9D, 0xC6, 0x98, 0xC4, 0x86, 0xDB, 0x09, 0xD2, 0xC6, 0xEB, 0x6D, 0xE6, + 0xA5, 0xF2, 0xB8, 0xF6, 0x28, 0xF1, 0x02, 0x01, 0x2D, 0xF7, 0x36, 0x04, + 0x80, 0x09, 0x78, 0xFA, 0x67, 0x1A, 0x6F, 0xF9, 0x6E, 0x2D, 0x48, 0x02, + 0x79, 0x37, 0x6E, 0x07, 0x19, 0x32, 0x59, 0x16, 0x95, 0x29, 0x8F, 0x21, + 0x53, 0x24, 0x82, 0x14, 0x48, 0x26, 0x2E, 0xFD, 0xC0, 0x24, 0x8F, 0xFA, + 0x2C, 0x1C, 0x41, 0x01, 0x6D, 0x0E, 0xC9, 0xF9, 0xDF, 0x02, 0x35, 0xF6, + 0xCE, 0xF9, 0x6A, 0xF4, 0x1F, 0xFA, 0xBD, 0xF5, 0x22, 0x05, 0x75, 0x04, + 0xBD, 0x02, 0x04, 0x11, 0x74, 0xF9, 0xB1, 0x0D, 0x81, 0xF4, 0x8A, 0x09, + 0x8C, 0xFE, 0x0A, 0x10, 0x22, 0x0F, 0x09, 0x0E, 0x9D, 0x10, 0xA6, 0x0D, + 0xFA, 0x06, 0xFE, 0x14, 0x44, 0xF6, 0x64, 0x17, 0x05, 0xEE, 0x95, 0x1B, + 0x5F, 0xF7, 0x38, 0x23, 0xFA, 0x07, 0x82, 0x22, 0x02, 0x18, 0x2B, 0x24, + 0x5B, 0x21, 0x8D, 0x39, 0x12, 0x22, 0x3B, 0x45, 0xDA, 0x25, 0x5E, 0x3A, + 0x13, 0x27, 0xA7, 0x2F, 0x3C, 0x25, 0xA0, 0x29, 0xCA, 0x24, 0x6B, 0x1D, + 0xCA, 0x10, 0xCB, 0x12, 0xA2, 0xF5, 0xA5, 0x10, 0x60, 0xEB, 0x7D, 0x0D, + 0x3D, 0xEC, 0xD9, 0x0B, 0x22, 0xEB, 0x4B, 0xFD, 0x18, 0xE9, 0xEE, 0xE5, + 0x4C, 0xED, 0x68, 0xDF, 0xEE, 0xF4, 0x04, 0xE2, 0x9D, 0xFE, 0x62, 0xE6, + 0x9B, 0x05, 0xF9, 0xEC, 0x53, 0x07, 0x8D, 0xED, 0x2C, 0x06, 0x00, 0xE8, + 0x27, 0x0A, 0xF2, 0xF0, 0x41, 0x15, 0x01, 0x05, 0xD2, 0x20, 0xF9, 0x0C, + 0x20, 0x2E, 0x98, 0x04, 0x0F, 0x38, 0x5C, 0xFC, 0xC9, 0x32, 0x4B, 0xF8, + 0xB4, 0x1B, 0x79, 0xF2, 0xDB, 0x09, 0xAE, 0xF5, 0x0C, 0x0A, 0x34, 0xF7, + 0x7F, 0x07, 0x62, 0xF0, 0x44, 0xFF, 0x71, 0xF2, 0x09, 0xF6, 0xB6, 0xFF, + 0x41, 0xF1, 0x65, 0x07, 0x18, 0xF8, 0x6D, 0x02, 0xDF, 0x00, 0x35, 0x04, + 0x0E, 0x04, 0x6F, 0x13, 0x59, 0xFD, 0x1D, 0x20, 0xDA, 0xF3, 0x86, 0x29, + 0xD0, 0xF0, 0x4F, 0x35, 0xA3, 0xFB, 0x83, 0x39, 0x18, 0x0E, 0x09, 0x39, + 0x6D, 0x19, 0xF3, 0x38, 0x2F, 0x23, 0x8F, 0x39, 0x5B, 0x25, 0x61, 0x3D, + 0xE0, 0x25, 0x5A, 0x42, 0x54, 0x28, 0x35, 0x4A, 0x74, 0x2E, 0x01, 0x4A, + 0xB0, 0x36, 0x58, 0x40, 0xBF, 0x36, 0x5D, 0x37, 0x50, 0x30, 0xF5, 0x2D, + 0xAB, 0x27, 0x28, 0x25, 0x5F, 0x21, 0xAD, 0x18, 0x59, 0x26, 0x34, 0x0E, + 0xCD, 0x2C, 0xA7, 0x09, 0x62, 0x20, 0xEC, 0x05, 0xF7, 0x1A, 0xD8, 0x04, + 0xDA, 0x20, 0x40, 0x06, 0x46, 0x25, 0xC8, 0x06, 0xC7, 0x23, 0x08, 0xF8, + 0xB0, 0x20, 0xF0, 0xEC, 0x73, 0x12, 0x34, 0xEB, 0xD9, 0xFD, 0x94, 0xEB, + 0x03, 0x01, 0x0A, 0xF6, 0x00, 0x08, 0x46, 0x01, 0xD3, 0x00, 0x26, 0xFE, + 0xA6, 0xF8, 0x6A, 0xF1, 0x54, 0xF8, 0x87, 0xF4, 0x30, 0xF2, 0x71, 0xFB, + 0xC7, 0xEA, 0x90, 0xFA, 0x87, 0xF1, 0xDC, 0x00, 0x4E, 0xFE, 0x09, 0x05, + 0xA6, 0x07, 0xCD, 0x05, 0x12, 0x02, 0x1A, 0x10, 0x1B, 0xF6, 0x67, 0x20, + 0x65, 0xF0, 0xF7, 0x1C, 0xBA, 0xE7, 0x17, 0x07, 0xE8, 0xDE, 0x88, 0xF4, + 0x1D, 0xDD, 0xE2, 0xDE, 0x23, 0xDA, 0xCE, 0xCF, 0x99, 0xD3, 0xA8, 0xD1, + 0x86, 0xCB, 0x25, 0xD5, 0x90, 0xC1, 0x27, 0xD4, 0x18, 0xBA, 0x73, 0xD0, + 0xDE, 0xBD, 0xF8, 0xC4, 0xB4, 0xCA, 0x0D, 0xB8, 0xDD, 0xD2, 0xFA, 0xB8, + 0xA9, 0xCF, 0xCF, 0xC0, 0xF5, 0xC9, 0x3F, 0xC6, 0x38, 0xC7, 0x0D, 0xCB, + 0x48, 0xCC, 0x64, 0xCE, 0x3B, 0xDD, 0x22, 0xDC, 0x76, 0xE7, 0xE5, 0xEF, + 0xD3, 0xE1, 0x90, 0xF4, 0xFA, 0xDE, 0x94, 0xE6, 0xF5, 0xDF, 0xAD, 0xD4, + 0x53, 0xDA, 0xF9, 0xCD, 0x41, 0xD4, 0xCF, 0xCB, 0xB7, 0xD1, 0x43, 0xCA, + 0xEF, 0xD2, 0x7C, 0xCB, 0xD3, 0xD6, 0x25, 0xC8, 0x15, 0xD4, 0xC6, 0xC8, + 0x69, 0xCC, 0x67, 0xD0, 0xA2, 0xCC, 0x65, 0xD4, 0xD6, 0xDB, 0xE7, 0xCE, + 0x24, 0xE7, 0x96, 0xC6, 0xB0, 0xDF, 0x54, 0xC9, 0xD0, 0xDE, 0xD0, 0xD5, + 0x7C, 0xE9, 0xE2, 0xDD, 0x80, 0xFB, 0xB2, 0xE5, 0x79, 0x12, 0x8B, 0xF4, + 0xD7, 0x21, 0x35, 0x03, 0xF1, 0x24, 0x5E, 0x0D, 0x28, 0x20, 0xF7, 0x11, + 0x70, 0x1D, 0x1A, 0x13, 0xE0, 0x21, 0xE5, 0x14, 0x81, 0x26, 0xA5, 0x17, + 0x43, 0x1E, 0xC6, 0x14, 0x61, 0x13, 0x62, 0x0D, 0x29, 0x0A, 0xB6, 0x08, + 0xE8, 0x05, 0xA0, 0x0E, 0xDE, 0x04, 0xD0, 0x14, 0x0B, 0x00, 0x53, 0x18, + 0x24, 0xFA, 0x89, 0x14, 0xE4, 0xF9, 0x87, 0x0E, 0x74, 0xFA, 0x2C, 0x14, + 0xDF, 0xF1, 0xE8, 0x17, 0xCA, 0xF1, 0x87, 0x1B, 0xB9, 0xF3, 0x4C, 0x14, + 0xFC, 0xF4, 0x52, 0xFF, 0xEB, 0xF4, 0xF3, 0xF1, 0x5C, 0xF2, 0x75, 0xFA, + 0x3A, 0xF8, 0x7C, 0x07, 0x16, 0x06, 0x14, 0x0A, 0x0F, 0x12, 0xD9, 0x0B, + 0xE8, 0x13, 0x7B, 0x09, 0x78, 0x0F, 0x86, 0x04, 0xA1, 0x08, 0x55, 0x06, + 0x4B, 0x00, 0x8A, 0x09, 0x37, 0x04, 0x0C, 0x0A, 0x7D, 0x1F, 0xF3, 0x0F, + 0xD6, 0x37, 0xE2, 0x18, 0xD1, 0x39, 0xBA, 0x18, 0x87, 0x31, 0x94, 0x17, + 0xE3, 0x28, 0x81, 0x19, 0xB5, 0x22, 0x60, 0x1B, 0xAF, 0x18, 0x1B, 0x15, + 0x0D, 0x0D, 0xFD, 0x07, 0xD7, 0x06, 0xFC, 0xFD, 0xF0, 0x0C, 0x63, 0xF6, + 0x2C, 0x0D, 0x72, 0xF1, 0x9E, 0xFA, 0x1B, 0xE9, 0x6F, 0xE4, 0xFB, 0xE1, + 0x90, 0xDE, 0x4D, 0xE4, 0x85, 0xE9, 0x95, 0xE8, 0x8C, 0xF3, 0x77, 0xE9, + 0xFC, 0xF9, 0x98, 0xEC, 0xCC, 0xEF, 0x1F, 0xEE, 0x28, 0xDC, 0x8C, 0xE3, + 0xC0, 0xDC, 0xDA, 0xDA, 0x38, 0xED, 0xA1, 0xDE, 0x99, 0xF9, 0x69, 0xE7, + 0x8F, 0xFA, 0x65, 0xF2, 0x94, 0xF5, 0xE4, 0xF9, 0x36, 0xEC, 0x5B, 0xF6, + 0x8D, 0xE1, 0x75, 0xEF, 0xA1, 0xDF, 0xAD, 0xED, 0x5A, 0xDA, 0x70, 0xF1, + 0x28, 0xCE, 0x5F, 0xF1, 0x24, 0xCD, 0x6A, 0xE6, 0x01, 0xDC, 0xB0, 0xD8, + 0xFF, 0xE7, 0xD4, 0xCE, 0xF7, 0xE5, 0x08, 0xD4, 0xAB, 0xE3, 0xBA, 0xE7, + 0xBB, 0xEC, 0x61, 0xF3, 0x86, 0x00, 0x01, 0xF1, 0xEA, 0x0C, 0x85, 0xFA, + 0x49, 0x0B, 0xC3, 0x12, 0x61, 0x10, 0xAC, 0x1F, 0xAF, 0x21, 0xCD, 0x25, + 0x74, 0x32, 0xC5, 0x2A, 0x09, 0x3B, 0xF2, 0x2F, 0xBC, 0x34, 0xF7, 0x3E, + 0x5F, 0x2B, 0x05, 0x4B, 0xD1, 0x2A, 0x3F, 0x4C, 0x91, 0x35, 0xD5, 0x43, + 0x5E, 0x45, 0x91, 0x3B, 0x22, 0x49, 0xF9, 0x35, 0xB2, 0x42, 0xBC, 0x2A, + 0x20, 0x37, 0x9F, 0x26, 0x59, 0x26, 0xEF, 0x29, 0x0D, 0x21, 0xDA, 0x33, + 0x34, 0x1D, 0x92, 0x37, 0xB9, 0x0F, 0x61, 0x32, 0x2B, 0x05, 0x2C, 0x25, + 0x52, 0x04, 0x47, 0x19, 0x70, 0x02, 0xD9, 0x1E, 0xFA, 0xFD, 0xD9, 0x20, + 0xD7, 0x00, 0xCD, 0x18, 0x23, 0x0A, 0x49, 0x04, 0xE2, 0x1A, 0xF8, 0xF6, + 0x15, 0x23, 0x91, 0x09, 0x8D, 0x18, 0x4E, 0x1D, 0xD3, 0x0B, 0x05, 0x14, + 0xCE, 0x0E, 0x89, 0x00, 0x26, 0x1B, 0xBD, 0xF7, 0x19, 0x1D, 0xEA, 0xF0, + 0xB9, 0x10, 0xFC, 0xF3, 0xAB, 0x05, 0x09, 0x01, 0x72, 0x0D, 0x77, 0x06, + 0xE1, 0x21, 0xFC, 0x06, 0xB8, 0x32, 0x83, 0x0A, 0xDA, 0x31, 0xC5, 0x08, + 0xFF, 0x1F, 0x0C, 0xFB, 0x69, 0x0B, 0x96, 0xF1, 0x2C, 0xF4, 0x76, 0xE8, + 0x21, 0xE7, 0x23, 0xD8, 0xCF, 0xE7, 0xB6, 0xD2, 0x6D, 0xE4, 0xFD, 0xDF, + 0x6B, 0xD4, 0x0E, 0xEA, 0x96, 0xC5, 0x8E, 0xE9, 0x58, 0xC6, 0x55, 0xEB, + 0xC8, 0xCC, 0x06, 0xEB, 0x5B, 0xD0, 0xCF, 0xEB, 0xD0, 0xDC, 0xD0, 0xEC, + 0x9C, 0xE4, 0x5B, 0xE2, 0xF6, 0xD2, 0xF0, 0xDC, 0x36, 0xC2, 0xB0, 0xE3, + 0x18, 0xC5, 0x7E, 0xE6, 0x65, 0xD3, 0xE3, 0xE6, 0x90, 0xE3, 0x57, 0xE4, + 0x3E, 0xEA, 0x8C, 0xDE, 0xE0, 0xDF, 0xE8, 0xD4, 0x52, 0xCF, 0x35, 0xC7, + 0x04, 0xC4, 0x60, 0xC1, 0x7D, 0xBE, 0x47, 0xBC, 0xD0, 0xBD, 0xE8, 0xB3, + 0x23, 0xBA, 0x42, 0xB4, 0x74, 0xB0, 0x65, 0xB8, 0xFF, 0xA8, 0xE5, 0xB1, + 0x8D, 0xB0, 0x1C, 0xA3, 0xF3, 0xC5, 0xE5, 0xA0, 0x6E, 0xD1, 0xC6, 0xAA, + 0x07, 0xC0, 0x70, 0xB6, 0xEC, 0xB5, 0x21, 0xC8, 0xA4, 0xC6, 0x07, 0xD4, + 0xDF, 0xDB, 0xED, 0xD4, 0xC0, 0xEA, 0xDD, 0xD8, 0x19, 0xED, 0x85, 0xE6, + 0x4F, 0xF2, 0x1F, 0xF1, 0x6B, 0xFF, 0x98, 0xF1, 0xDA, 0x0D, 0xB4, 0xF3, + 0xF9, 0x15, 0x0E, 0x00, 0xCC, 0x14, 0xDB, 0x11, 0x76, 0x15, 0x84, 0x13, + 0x93, 0x1B, 0x07, 0x0D, 0xDE, 0x1C, 0x5E, 0x0B, 0x7B, 0x0F, 0x3B, 0x0A, + 0xB5, 0x02, 0x20, 0x09, 0x32, 0x04, 0xE9, 0x08, 0xB4, 0xFE, 0xA9, 0x07, + 0xA0, 0xF4, 0xD6, 0xF7, 0x14, 0xF9, 0x1E, 0xED, 0x56, 0xF9, 0x37, 0xED, + 0xA9, 0xFF, 0x9C, 0xF5, 0x34, 0x0D, 0xC3, 0x05, 0x64, 0x0C, 0x36, 0x10, + 0x81, 0xF9, 0x0E, 0x11, 0x46, 0xEA, 0x7E, 0x0D, 0x1D, 0xFB, 0x68, 0x0F, + 0x31, 0x10, 0x5D, 0x0F, 0x65, 0x0B, 0x57, 0x0F, 0x92, 0xF9, 0xB0, 0x19, + 0xF9, 0xEE, 0x2D, 0x26, 0x11, 0xEA, 0x6F, 0x29, 0xA4, 0xEC, 0x40, 0x28, + 0x09, 0xFD, 0xED, 0x2B, 0x16, 0x0E, 0x09, 0x2F, 0xFB, 0x1B, 0x7C, 0x34, + 0xC4, 0x2C, 0x3A, 0x42, 0x24, 0x37, 0x02, 0x45, 0x3C, 0x32, 0xD3, 0x39, + 0xDD, 0x29, 0xE4, 0x33, 0xC6, 0x20, 0x7E, 0x2B, 0xD7, 0x12, 0xD5, 0x1B, + 0x86, 0x00, 0x80, 0x11, 0x83, 0xFC, 0x4E, 0x0E, 0xBB, 0x0D, 0x27, 0x02, + 0x2A, 0x1C, 0x9C, 0xEE, 0x45, 0x1F, 0xB8, 0xE1, 0xB3, 0x1F, 0x2D, 0xE6, + 0x80, 0x1F, 0x71, 0xF5, 0xD0, 0x21, 0x9B, 0xFD, 0xC9, 0x27, 0xA4, 0x05, + 0x9A, 0x2F, 0xF0, 0x0C, 0x5A, 0x34, 0xF9, 0x0F, 0x39, 0x2F, 0x22, 0x12, + 0x97, 0x30, 0xF6, 0x18, 0xFF, 0x33, 0xEA, 0x1D, 0x6A, 0x32, 0x16, 0x18, + 0xC3, 0x33, 0x29, 0x0D, 0x80, 0x29, 0x47, 0x02, 0xAD, 0x0F, 0x6D, 0xFB, + 0xCF, 0xF4, 0xB2, 0xFD, 0x4F, 0xE3, 0x88, 0x04, 0x12, 0xDC, 0xA3, 0xFA, + 0x02, 0xDA, 0xDC, 0xE2, 0x44, 0xE1, 0x0D, 0xDB, 0xB0, 0xEE, 0x16, 0xEA, + 0x66, 0xF5, 0x21, 0x03, 0xB8, 0xF3, 0xC9, 0x1C, 0x3D, 0xEF, 0x92, 0x26, + 0xEB, 0xF1, 0x24, 0x1E, 0xFA, 0xFA, 0x88, 0x15, 0xF8, 0x02, 0xD8, 0x1C, + 0x4A, 0x0B, 0x2E, 0x2F, 0x0F, 0x16, 0xB0, 0x37, 0x1A, 0x24, 0xC8, 0x3B, + 0x3B, 0x30, 0x0F, 0x44, 0xC0, 0x38, 0xED, 0x4C, 0xED, 0x45, 0x41, 0x53, + 0xD8, 0x4F, 0x61, 0x4F, 0x1E, 0x4E, 0x87, 0x4A, 0xB9, 0x46, 0x50, 0x4B, + 0xDD, 0x40, 0x6B, 0x43, 0xC1, 0x3C, 0xEA, 0x2A, 0x9B, 0x33, 0xAF, 0x1A, + 0x9E, 0x24, 0x96, 0x19, 0x7F, 0x1C, 0x12, 0x1A, 0xF4, 0x1E, 0x39, 0x1C, + 0x7A, 0x1D, 0xD4, 0x15, 0x10, 0x17, 0x49, 0x08, 0x1E, 0x1A, 0x55, 0x00, + 0xC5, 0x20, 0xDB, 0x03, 0xE3, 0x17, 0x17, 0x06, 0x82, 0x09, 0x2D, 0xFF, + 0x5C, 0xFD, 0x91, 0xF5, 0x82, 0xF8, 0x01, 0xF6, 0xA1, 0x03, 0xB7, 0xFE, + 0x01, 0x16, 0xA7, 0x02, 0x6A, 0x19, 0xF0, 0xF8, 0x2D, 0x0A, 0xE9, 0xEE, + 0xC2, 0xFD, 0x50, 0xF8, 0xA8, 0xFB, 0xCC, 0x01, 0x7F, 0xFE, 0x96, 0xFF, + 0xF6, 0xFE, 0xCA, 0x01, 0x8A, 0xFF, 0x85, 0x0B, 0xA8, 0x00, 0x44, 0x15, + 0x66, 0x03, 0x52, 0x1B, 0x5E, 0x06, 0x04, 0x13, 0x6E, 0x00, 0xA8, 0xFC, + 0x91, 0xF0, 0xA0, 0xE8, 0x6B, 0xDB, 0x74, 0xE4, 0xB7, 0xCC, 0x23, 0xE8, + 0x9C, 0xCA, 0xB8, 0xE6, 0xA2, 0xD1, 0x93, 0xE6, 0xFB, 0xD3, 0x91, 0xE4, + 0x65, 0xD4, 0x2C, 0xDC, 0x72, 0xD6, 0xAA, 0xD0, 0xEB, 0xD4, 0xF4, 0xCF, + 0xDE, 0xD7, 0x2C, 0xDA, 0xFA, 0xE6, 0x90, 0xE0, 0xF2, 0xF5, 0xB3, 0xDB, + 0xDF, 0xF1, 0x85, 0xCD, 0xF3, 0xE8, 0xCB, 0xCE, 0x29, 0xE8, 0xE5, 0xE4, + 0x5E, 0xE9, 0x3A, 0xF8, 0x4A, 0xEB, 0x62, 0xFA, 0xF8, 0xEF, 0x74, 0xEE, + 0xD3, 0xF0, 0x6D, 0xDC, 0x04, 0xEA, 0x39, 0xD0, 0xBD, 0xE5, 0x15, 0xD4, + 0x24, 0xD8, 0x17, 0xDB, 0x1B, 0xC6, 0x47, 0xDC, 0x7A, 0xC5, 0xCA, 0xDA, + 0x49, 0xCB, 0x4A, 0xD4, 0x82, 0xCA, 0x83, 0xC7, 0x58, 0xC3, 0x76, 0xBA, + 0x69, 0xC7, 0x8D, 0xBB, 0xA3, 0xD6, 0x3D, 0xCA, 0xF7, 0xD7, 0x7D, 0xD2, + 0x5E, 0xCF, 0x60, 0xD2, 0x7C, 0xD3, 0x2A, 0xD9, 0xEE, 0xEA, 0x08, 0xE8, + 0x0D, 0x02, 0xDF, 0xFC, 0x60, 0x14, 0x5D, 0x10, 0x79, 0x23, 0x84, 0x16, + 0x7E, 0x23, 0xB3, 0x12, 0x89, 0x1B, 0xCB, 0x15, 0x12, 0x13, 0x36, 0x1D, + 0x33, 0x10, 0xF4, 0x18, 0xB9, 0x12, 0x72, 0x0F, 0x14, 0x16, 0xEF, 0x03, + 0x65, 0x17, 0x96, 0xFB, 0x62, 0x0E, 0xAE, 0x03, 0xDB, 0x04, 0xFE, 0x11, + 0x7C, 0x01, 0xD8, 0x14, 0x2B, 0x0A, 0x19, 0x15, 0x14, 0x15, 0xCA, 0x12, + 0xE4, 0x13, 0x80, 0x12, 0xC8, 0x08, 0xC9, 0x16, 0xA1, 0xF7, 0xB6, 0x17, + 0x08, 0xF2, 0xDF, 0x19, 0xFE, 0xFA, 0xCE, 0x17, 0x29, 0xF9, 0x3F, 0x0E, + 0x5F, 0xEF, 0x00, 0xFF, 0x69, 0xF8, 0xB2, 0x01, 0xED, 0x09, 0x6B, 0x13, + 0xDD, 0x0F, 0xB2, 0x13, 0xCA, 0x09, 0x3B, 0x10, 0x91, 0x0A, 0x97, 0x1A, + 0x22, 0x0E, 0x5E, 0x22, 0x08, 0x0A, 0x51, 0x21, 0xB7, 0x08, 0x4A, 0x1D, + 0xA5, 0x13, 0x46, 0x14, 0x55, 0x29, 0xC3, 0x0B, 0x0F, 0x38, 0x3A, 0x0B, + 0x69, 0x3A, 0x37, 0x14, 0x79, 0x27, 0x08, 0x18, 0x3E, 0x0D, 0x41, 0x10, + 0x9C, 0x03, 0xE5, 0x03, 0x94, 0x01, 0x16, 0xF2, 0xBD, 0xF7, 0xDB, 0xE0, + 0x1F, 0xE7, 0x20, 0xDD, 0x26, 0xE1, 0xE9, 0xE1, 0xE7, 0xE4, 0xDD, 0xE1, + 0x85, 0xE4, 0x4F, 0xE1, 0x7D, 0xE0, 0x2F, 0xE2, 0x39, 0xE5, 0xA5, 0xE8, + 0x77, 0xEB, 0xBC, 0xF5, 0xCB, 0xEC, 0x68, 0x01, 0x41, 0xEE, 0x2F, 0x08, + 0x06, 0xF2, 0x8E, 0x03, 0xE1, 0x02, 0x01, 0xF2, 0x7B, 0x15, 0xF5, 0xE9, + 0x7E, 0x1B, 0xEA, 0xF4, 0x5A, 0x15, 0x0C, 0xFE, 0xDA, 0x08, 0xFE, 0xFD, + 0x0E, 0x06, 0x59, 0xF7, 0x79, 0x0B, 0x06, 0xF2, 0xE6, 0x07, 0xF5, 0xF2, + 0x88, 0xFA, 0x14, 0xED, 0xAB, 0xEA, 0x94, 0xDE, 0x00, 0xD8, 0x83, 0xCE, + 0xF1, 0xD0, 0xC5, 0xC0, 0x12, 0xDE, 0x7D, 0xC1, 0x4B, 0xF0, 0x32, 0xCF, + 0x0B, 0xF6, 0x4D, 0xDB, 0x5A, 0xE9, 0xE9, 0xE7, 0x26, 0xDF, 0xF6, 0xF4, + 0x38, 0xE2, 0xAD, 0xF8, 0x56, 0xEC, 0x16, 0xFA, 0x5E, 0x04, 0x10, 0x01, + 0x10, 0x1C, 0x04, 0x0F, 0xA8, 0x22, 0x7C, 0x25, 0x36, 0x1D, 0x57, 0x39, + 0x26, 0x12, 0x0D, 0x41, 0x22, 0x15, 0x9C, 0x3E, 0x28, 0x24, 0x3D, 0x38, + 0x18, 0x2D, 0x5F, 0x39, 0xB4, 0x2E, 0x94, 0x3C, 0x14, 0x2B, 0x59, 0x36, + 0x99, 0x26, 0xB3, 0x2A, 0x5A, 0x2C, 0x42, 0x23, 0xE6, 0x32, 0x96, 0x26, + 0x82, 0x21, 0x29, 0x2F, 0x56, 0x0E, 0xFD, 0x2E, 0xC5, 0x0A, 0xF4, 0x20, + 0x46, 0x08, 0xE4, 0x19, 0x7F, 0x07, 0x83, 0x1B, 0x4B, 0x15, 0x03, 0x22, + 0xAA, 0x20, 0xFB, 0x25, 0x63, 0x1C, 0x7B, 0x1E, 0x77, 0x15, 0x36, 0x16, + 0x70, 0x19, 0xAD, 0x15, 0xA9, 0x29, 0xA5, 0x1C, 0x72, 0x35, 0x35, 0x21, + 0x32, 0x2F, 0x9C, 0x18, 0x07, 0x1B, 0x0A, 0x08, 0x1B, 0x0A, 0x45, 0x02, + 0x36, 0xF8, 0x20, 0x09, 0xB6, 0xED, 0x6B, 0x0B, 0xB9, 0xFA, 0xDA, 0x01, + 0x44, 0x10, 0xDA, 0xFF, 0xF6, 0x1B, 0xCD, 0x0A, 0xB1, 0x1F, 0xD7, 0x14, + 0xC7, 0x24, 0x81, 0x12, 0xF9, 0x1D, 0x82, 0x06, 0x80, 0x0E, 0xF4, 0xFE, + 0xD8, 0x04, 0x8A, 0xF4, 0x64, 0xF7, 0x23, 0xEB, 0x15, 0xEA, 0xCA, 0xE3, + 0xC7, 0xE8, 0x6A, 0xD5, 0x91, 0xDE, 0x6B, 0xCE, 0x15, 0xCE, 0x3E, 0xD4, + 0xC3, 0xD0, 0x79, 0xD7, 0x6D, 0xD1, 0x36, 0xD5, 0x0E, 0xCC, 0x07, 0xD5, + 0x33, 0xD4, 0x09, 0xDB, 0xD2, 0xDC, 0xC8, 0xEA, 0x19, 0xDD, 0x43, 0xF0, + 0x6A, 0xD5, 0xA5, 0xE7, 0xBC, 0xD0, 0x0D, 0xE9, 0x8E, 0xDD, 0x15, 0xEF, + 0x42, 0xEC, 0xB8, 0xEF, 0x3E, 0xEB, 0x50, 0xF0, 0x42, 0xDE, 0x2D, 0xF3, + 0x70, 0xD1, 0x1B, 0xF1, 0xC2, 0xD1, 0x83, 0xE9, 0x6F, 0xD4, 0xFB, 0xE2, + 0xD8, 0xC6, 0x1D, 0xD9, 0xC4, 0xBB, 0xB2, 0xC8, 0x4A, 0xBE, 0x1F, 0xBD, + 0x2B, 0xC7, 0x24, 0xBA, 0x47, 0xD5, 0x52, 0xB6, 0x2A, 0xD7, 0xC2, 0xBB, + 0x0C, 0xD6, 0x2D, 0xC6, 0x08, 0xE1, 0x90, 0xC5, 0x6D, 0xE2, 0x6A, 0xC5, + 0xF5, 0xDB, 0x37, 0xCB, 0x97, 0xDC, 0x7D, 0xD5, 0x87, 0xE7, 0x4B, 0xDC, + 0x9D, 0xFD, 0xCA, 0xDB, 0x14, 0x0F, 0x80, 0xE0, 0x06, 0x0E, 0x69, 0xE8, + 0x5C, 0x01, 0x10, 0xF4, 0x2A, 0xF8, 0x56, 0x02, 0x7B, 0xFD, 0x47, 0x02, + 0x93, 0x0F, 0x75, 0xFC, 0x68, 0x1B, 0x3E, 0x01, 0xE4, 0x10, 0x84, 0x08, + 0xF0, 0xF5, 0x55, 0x0A, 0xF8, 0xE4, 0xFD, 0x08, 0x08, 0xE5, 0xC0, 0xFE, + 0xAC, 0xE8, 0xFA, 0xF9, 0xA2, 0xE5, 0x6C, 0xFD, 0x38, 0xE0, 0x03, 0xF6, + 0x5A, 0xE1, 0x4D, 0xF0, 0x6B, 0xE8, 0x05, 0xF5, 0xB5, 0xEE, 0xDD, 0xFE, + 0xA8, 0xEE, 0xDF, 0x07, 0xF1, 0xF2, 0x02, 0x05, 0xB6, 0xF2, 0x10, 0xF5, + 0xB2, 0xFA, 0x75, 0xEF, 0xB9, 0x12, 0x05, 0xFF, 0x3A, 0x14, 0xA5, 0x12, + 0xF7, 0xFA, 0xF6, 0x11, 0xED, 0xEF, 0x04, 0x0E, 0xA2, 0x00, 0x1A, 0x1A, + 0x9B, 0x0F, 0x68, 0x20, 0x93, 0x10, 0x73, 0x1E, 0xA5, 0x0D, 0x9A, 0x1D, + 0xA5, 0x1A, 0xCD, 0x1D, 0x79, 0x39, 0xA8, 0x21, 0x0A, 0x4B, 0xF8, 0x31, + 0x9A, 0x3E, 0x2C, 0x3B, 0xE0, 0x21, 0x85, 0x30, 0xF0, 0x0B, 0x04, 0x26, + 0xD3, 0x0A, 0xEB, 0x1C, 0xC4, 0x13, 0x36, 0x12, 0x1A, 0x13, 0x46, 0x0A, + 0x6F, 0x0A, 0xCE, 0x01, 0xDF, 0x08, 0xBE, 0xF2, 0x55, 0x10, 0x43, 0xEB, + 0x4E, 0x13, 0x63, 0xF7, 0x0E, 0x0F, 0x0E, 0x04, 0xC3, 0x11, 0x3F, 0x01, + 0x45, 0x1F, 0x11, 0xF9, 0x5C, 0x28, 0x0A, 0xFA, 0xD4, 0x26, 0xD5, 0xFD, + 0x0E, 0x24, 0x99, 0xFF, 0x6B, 0x26, 0x2D, 0x05, 0xF0, 0x2D, 0x67, 0x0C, + 0xFD, 0x36, 0xF2, 0x12, 0xE0, 0x34, 0x88, 0x16, 0xF8, 0x21, 0x2F, 0x16, + 0x19, 0x09, 0x22, 0x14, 0x62, 0xFA, 0x18, 0x10, 0xE2, 0xFF, 0xAE, 0x06, + 0x1D, 0x04, 0x41, 0xFE, 0x40, 0xF6, 0x11, 0xFE, 0xB6, 0xEB, 0x85, 0x02, + 0x48, 0xED, 0xC0, 0x0E, 0x17, 0xF7, 0xC8, 0x21, 0x42, 0x07, 0x44, 0x2E, + 0x5F, 0x0D, 0x51, 0x2E, 0x39, 0x03, 0x79, 0x2C, 0xFA, 0xFD, 0xBC, 0x32, + 0xDE, 0x03, 0xD6, 0x36, 0xB1, 0x09, 0x09, 0x37, 0xA4, 0x0E, 0x82, 0x3B, + 0x4E, 0x16, 0x43, 0x40, 0x34, 0x23, 0x27, 0x3F, 0x1A, 0x2B, 0xD2, 0x3B, + 0xC1, 0x2A, 0x1E, 0x3E, 0x6E, 0x29, 0x2F, 0x3E, 0xAB, 0x24, 0x88, 0x36, + 0xE7, 0x25, 0xFD, 0x25, 0xC3, 0x38, 0x22, 0x14, 0xD1, 0x41, 0xAA, 0x0F, + 0x47, 0x30, 0x47, 0x0F, 0xE8, 0x1D, 0xDD, 0x0F, 0xEA, 0x16, 0x26, 0x13, + 0xA9, 0x20, 0x5F, 0x0D, 0x98, 0x2A, 0xEF, 0xFE, 0xE5, 0x24, 0x2B, 0xFB, + 0xBD, 0x17, 0xAB, 0xFE, 0x01, 0x12, 0x6B, 0xFE, 0x1A, 0x11, 0xD9, 0xF8, + 0x4A, 0x02, 0x5B, 0xF7, 0x50, 0xEE, 0xEF, 0xF8, 0xBD, 0xE3, 0x51, 0xF7, + 0xDC, 0xED, 0xD7, 0xFA, 0xB3, 0x07, 0x61, 0xF8, 0xCA, 0x0F, 0x33, 0xEF, + 0xF2, 0xFD, 0xB4, 0xEC, 0xBC, 0xEE, 0x64, 0xF8, 0x1B, 0xEA, 0x92, 0x02, + 0x91, 0xE7, 0xBD, 0x01, 0x5D, 0xED, 0x3C, 0xFD, 0x50, 0xFC, 0x49, 0xF7, + 0x57, 0x03, 0xE4, 0xF9, 0x02, 0x00, 0xE7, 0xFF, 0xF9, 0xFE, 0xB6, 0xFF, + 0x19, 0xFB, 0xA9, 0xF8, 0xF3, 0xEB, 0x89, 0xF0, 0x09, 0xE0, 0x55, 0xEC, + 0x93, 0xE3, 0x0C, 0xE9, 0xF5, 0xEC, 0x64, 0xE6, 0xE3, 0xF2, 0x55, 0xE4, + 0x3A, 0xEA, 0xA3, 0xDF, 0x96, 0xD5, 0x95, 0xD6, 0x18, 0xCF, 0xD4, 0xD0, + 0x74, 0xDB, 0x15, 0xD0, 0x32, 0xE3, 0xDC, 0xCD, 0x05, 0xE0, 0x1B, 0xCB, + 0x21, 0xDF, 0x80, 0xCC, 0x5C, 0xE2, 0x3B, 0xCE, 0x8D, 0xDF, 0xD3, 0xCB, + 0x72, 0xD5, 0xE9, 0xD3, 0x4D, 0xD1, 0xF7, 0xE7, 0x42, 0xD6, 0x5C, 0xEF, + 0x45, 0xE2, 0x6E, 0xE2, 0x12, 0xF0, 0xAC, 0xD5, 0x0B, 0xF3, 0x2A, 0xD4, + 0xC1, 0xE9, 0x58, 0xD7, 0x85, 0xDA, 0x1F, 0xE3, 0xE3, 0xCF, 0xAF, 0xEA, + 0x27, 0xCB, 0x3A, 0xDC, 0x53, 0xC6, 0x89, 0xCC, 0x5A, 0xC4, 0xEA, 0xC7, + 0xC2, 0xC3, 0xD9, 0xC9, 0x01, 0xBF, 0x29, 0xD3, 0x97, 0xBD, 0x2A, 0xDD, + 0x19, 0xC1, 0xD7, 0xDF, 0xE9, 0xC9, 0xCE, 0xDA, 0x6D, 0xDE, 0x29, 0xDE, + 0x66, 0xF0, 0x14, 0xF2, 0x6E, 0xF7, 0x89, 0x04, 0x45, 0xFD, 0xFB, 0x0E, + 0xA5, 0x09, 0x23, 0x19, 0x05, 0x16, 0x5B, 0x1E, 0x5A, 0x1D, 0x32, 0x1B, + 0x48, 0x20, 0xF9, 0x15, 0xD7, 0x18, 0x75, 0x0D, 0x39, 0x0E, 0xC5, 0x04, + 0x3A, 0x06, 0x2D, 0x05, 0x8B, 0x05, 0x00, 0x07, 0x96, 0x09, 0xAB, 0xFF, + 0xD5, 0x10, 0xA3, 0xFB, 0xFF, 0x14, 0xD3, 0xFE, 0x80, 0x0C, 0x09, 0x01, + 0xD8, 0x0E, 0x6E, 0x04, 0x98, 0x19, 0x82, 0x02, 0x80, 0x1A, 0xF4, 0xF8, + 0xD2, 0x13, 0x20, 0xFD, 0xE5, 0x09, 0x9E, 0x13, 0xEE, 0xFF, 0x52, 0x17, + 0xCE, 0xFC, 0xC6, 0x06, 0x38, 0xFC, 0x59, 0xF7, 0x74, 0xF8, 0x72, 0xF4, + 0x99, 0xFD, 0xD3, 0x07, 0x1D, 0x09, 0x32, 0x21, 0x09, 0x04, 0xD9, 0x23, + 0xC9, 0xF1, 0x2C, 0x14, 0x92, 0xF0, 0x2C, 0x16, 0x49, 0xFD, 0x56, 0x1D, + 0xE7, 0x02, 0xC6, 0x12, 0x4E, 0x06, 0x57, 0x07, 0xB0, 0x08, 0x01, 0x0A, + 0x69, 0x0D, 0x7F, 0x19, 0xBA, 0x23, 0xB1, 0x2B, 0x76, 0x33, 0xD0, 0x38, + 0x7F, 0x2D, 0xD9, 0x2F, 0x0F, 0x22, 0x38, 0x15, 0x18, 0x1A, 0x3F, 0x09, + 0xE0, 0x1D, 0xA5, 0x09, 0xA2, 0x21, 0xA8, 0x02, 0xD6, 0x1C, 0x9F, 0xF4, + 0x81, 0x13, 0xEB, 0xE8, 0xFD, 0x05, 0x65, 0xE6, 0x61, 0xFD, 0xE7, 0xF1, + 0x1E, 0xFB, 0x8A, 0x00, 0xE3, 0xFB, 0x34, 0x03, 0x38, 0x01, 0xB0, 0xFF, + 0x4E, 0x06, 0x3F, 0xF8, 0x38, 0x06, 0x9B, 0xF0, 0x78, 0x03, 0xE8, 0xF0, + 0x61, 0x03, 0xFF, 0xF4, 0x98, 0x03, 0x43, 0xF8, 0x3B, 0x00, 0x5C, 0xFE, + 0xB9, 0xFF, 0x91, 0x04, 0x28, 0x04, 0x8B, 0xFD, 0x45, 0xFF, 0xA0, 0xEE, + 0xAE, 0xEB, 0x8D, 0xEB, 0xBD, 0xD7, 0x31, 0xEF, 0xF3, 0xCF, 0xD6, 0xE6, + 0xA6, 0xD6, 0x62, 0xDB, 0x74, 0xE3, 0x51, 0xDC, 0xEF, 0xE8, 0xD5, 0xDE, + 0x80, 0xE7, 0x76, 0xDC, 0x64, 0xED, 0xA8, 0xE3, 0xEF, 0xF7, 0xFC, 0xEE, + 0x6E, 0xF7, 0x4B, 0xF0, 0xE2, 0xF3, 0xBE, 0xF1, 0x0D, 0xFA, 0xCC, 0xF6, + 0xA4, 0x03, 0x6A, 0xFE, 0x3B, 0x0F, 0x85, 0x0E, 0x1D, 0x1A, 0x91, 0x21, + 0xAE, 0x16, 0xE3, 0x31, 0xCA, 0x08, 0x7E, 0x3B, 0xC3, 0x06, 0xA2, 0x3C, + 0x45, 0x15, 0x1C, 0x3E, 0xA4, 0x22, 0x0B, 0x40, 0x76, 0x28, 0x83, 0x41, + 0x64, 0x29, 0xA5, 0x41, 0x0C, 0x2E, 0xEA, 0x3F, 0xE8, 0x30, 0xC8, 0x42, + 0xAA, 0x2A, 0x8E, 0x4A, 0xB1, 0x25, 0x9F, 0x4E, 0xF3, 0x25, 0x01, 0x50, + 0xB8, 0x21, 0xF6, 0x44, 0x4A, 0x19, 0xDC, 0x2E, 0x68, 0x12, 0x7B, 0x24, + 0xA6, 0x10, 0x5E, 0x22, 0x15, 0x19, 0x06, 0x20, 0xA2, 0x1E, 0x9D, 0x1E, + 0x21, 0x1D, 0xF7, 0x19, 0x1C, 0x1E, 0xA2, 0x0C, 0xFD, 0x2B, 0xB3, 0x03, + 0xB5, 0x3F, 0x89, 0x03, 0x72, 0x3E, 0x97, 0xFF, 0xD6, 0x2C, 0x2E, 0xF8, + 0x06, 0x27, 0x99, 0xFA, 0x7E, 0x21, 0x8A, 0x02, 0x52, 0x11, 0x21, 0xFD, + 0x65, 0x0A, 0x01, 0xF5, 0xD4, 0x11, 0x08, 0xF3, 0x17, 0x1E, 0x95, 0xEA, + 0xD8, 0x1F, 0xDF, 0xEC, 0x32, 0x1B, 0x6F, 0x02, 0xE1, 0x18, 0x97, 0x0B, + 0x80, 0x11, 0xCB, 0x00, 0x13, 0x06, 0x13, 0xF8, 0xB8, 0xFC, 0xB2, 0xFA, + 0xFC, 0xF7, 0x45, 0xFF, 0x6D, 0xF2, 0x53, 0x04, 0x5F, 0xEA, 0x81, 0x06, + 0x59, 0xE4, 0x8C, 0xFE, 0x59, 0xE3, 0x40, 0xF4, 0x74, 0xEA, 0xD6, 0xF4, + 0x3B, 0xEE, 0x55, 0xF9, 0xF4, 0xE5, 0x91, 0xF3, 0xC3, 0xD6, 0xD6, 0xEC, + 0x33, 0xD3, 0x60, 0xEB, 0x63, 0xDE, 0xB0, 0xEC, 0x42, 0xE5, 0xE9, 0xEE, + 0xB7, 0xE2, 0x15, 0xEC, 0xB3, 0xD7, 0x2C, 0xE7, 0x6E, 0xCE, 0x2D, 0xE2, + 0x3B, 0xCE, 0xBF, 0xE4, 0x2E, 0xD3, 0xFC, 0xF1, 0x62, 0xDC, 0xCE, 0xF3, + 0x66, 0xE2, 0x4B, 0xE3, 0x81, 0xDA, 0xE9, 0xD2, 0x2C, 0xC8, 0x0A, 0xCB, + 0xA9, 0xBB, 0x2F, 0xBF, 0x37, 0xBE, 0x6E, 0xAE, 0xFB, 0xC6, 0x43, 0xA5, + 0x2D, 0xCC, 0xB6, 0xA3, 0x33, 0xCC, 0xE8, 0xAA, 0xE5, 0xC6, 0x51, 0xBB, + 0xBA, 0xC0, 0x11, 0xC6, 0x13, 0xC3, 0xC0, 0xC3, 0xC7, 0xCF, 0xEE, 0xBF, + 0xD5, 0xD7, 0x9D, 0xC7, 0x96, 0xD7, 0x16, 0xD5, 0x60, 0xDA, 0xBB, 0xDC, + 0x60, 0xE1, 0x07, 0xE4, 0x31, 0xE8, 0x7A, 0xE8, 0x0F, 0xEF, 0xD9, 0xE6, + 0x1E, 0xF5, 0x08, 0xE5, 0xCD, 0xF6, 0x75, 0xE9, 0xF7, 0xF9, 0x15, 0xF6, + 0x3E, 0xFF, 0x0A, 0x06, 0x04, 0x01, 0xFA, 0x0A, 0x1A, 0x06, 0xEC, 0x01, + 0xDC, 0x0A, 0xA2, 0x01, 0xC2, 0x05, 0xD8, 0x05, 0x66, 0xFF, 0xE7, 0x08, + 0xB2, 0xFB, 0xCF, 0x10, 0x78, 0xFB, 0xE2, 0x16, 0x3B, 0x01, 0x72, 0x18, + 0x8B, 0x0A, 0x0F, 0x1A, 0x94, 0x0B, 0x16, 0x14, 0x63, 0x05, 0x65, 0x05, + 0x23, 0x00, 0xFC, 0x02, 0x62, 0xFD, 0x92, 0x0C, 0xB7, 0x01, 0xC1, 0x18, + 0x83, 0x07, 0x61, 0x1E, 0x95, 0x05, 0xEA, 0x0F, 0xDD, 0xF7, 0xA1, 0x05, + 0x75, 0xF0, 0x92, 0x12, 0xAE, 0xF3, 0x91, 0x1C, 0xAB, 0xFD, 0x8A, 0x10, + 0xCF, 0x18, 0xBD, 0xF9, 0x74, 0x2C, 0x99, 0xF7, 0x74, 0x2B, 0xF4, 0x05, + 0x62, 0x2A, 0xEA, 0x11, 0x18, 0x2A, 0xFD, 0x1F, 0x96, 0x23, 0x0B, 0x22, + 0xF3, 0x1A, 0x00, 0x18, 0xA0, 0x18, 0xE8, 0x15, 0xF5, 0x19, 0xEC, 0x19, + 0xBF, 0x1C, 0xB2, 0x16, 0x16, 0x1E, 0x0D, 0x07, 0xE9, 0x19, 0x67, 0xFB, + 0xD4, 0x14, 0x61, 0x02, 0x06, 0x0D, 0xA9, 0x0F, 0xAE, 0x08, 0xBF, 0x11, + 0x2B, 0x13, 0x64, 0x12, 0xE7, 0x1E, 0xB0, 0x12, 0xE2, 0x21, 0x60, 0x0A, + 0x9B, 0x1F, 0xB2, 0x04, 0x39, 0x20, 0x44, 0x07, 0x47, 0x25, 0x09, 0x13, + 0x0A, 0x28, 0x3C, 0x1A, 0x47, 0x26, 0x15, 0x16, 0xC9, 0x1D, 0x90, 0x14, + 0xD4, 0x18, 0xE9, 0x11, 0xD1, 0x15, 0xBD, 0x09, 0x28, 0x0C, 0xC0, 0x07, + 0x6E, 0x02, 0xF5, 0x08, 0xD8, 0xFC, 0x98, 0x03, 0xD9, 0xF5, 0x4B, 0xFD, + 0x36, 0xF4, 0xFD, 0x03, 0x9A, 0xFA, 0xA2, 0x13, 0x99, 0xFB, 0x2B, 0x1B, + 0xC9, 0xF9, 0xC9, 0x19, 0x97, 0xFB, 0x6F, 0x1A, 0x7B, 0xFD, 0x4C, 0x1D, + 0x71, 0xFD, 0x77, 0x1E, 0x88, 0xF9, 0xE3, 0x23, 0x18, 0xF5, 0x35, 0x28, + 0x0D, 0xF8, 0xD7, 0x24, 0x65, 0x02, 0x7C, 0x20, 0x8C, 0x0E, 0xFC, 0x20, + 0xC2, 0x19, 0x9B, 0x26, 0x92, 0x20, 0xD1, 0x30, 0x1B, 0x1E, 0x32, 0x33, + 0x9F, 0x20, 0x40, 0x25, 0x4D, 0x2A, 0x79, 0x18, 0x78, 0x2C, 0x39, 0x14, + 0xB8, 0x2F, 0x91, 0x19, 0x8B, 0x34, 0x09, 0x23, 0x3F, 0x33, 0x4A, 0x24, + 0xFE, 0x2F, 0x31, 0x1E, 0x53, 0x38, 0x9F, 0x16, 0x54, 0x40, 0x99, 0x10, + 0xB5, 0x37, 0x21, 0x0D, 0x09, 0x29, 0x72, 0x10, 0x51, 0x23, 0xE4, 0x1C, + 0x2C, 0x25, 0x1D, 0x22, 0x36, 0x23, 0x3B, 0x1B, 0x55, 0x1B, 0xA7, 0x12, + 0xC3, 0x0B, 0x27, 0x03, 0x28, 0x07, 0x7B, 0xFA, 0xB5, 0x09, 0xF4, 0x05, + 0x76, 0xF4, 0x8E, 0x0E, 0x3A, 0xE0, 0x3A, 0x03, 0x06, 0xF0, 0xEB, 0xFD, + 0x75, 0x07, 0x87, 0x09, 0xF0, 0x01, 0x46, 0x08, 0x36, 0xE9, 0x08, 0xFF, + 0x31, 0xDF, 0xC5, 0xFF, 0x5C, 0xEA, 0x76, 0xF4, 0xA9, 0xF5, 0x5E, 0xE1, + 0x61, 0xFD, 0xAE, 0xE5, 0xAA, 0xFE, 0x72, 0xEF, 0x7E, 0xEB, 0x84, 0xE3, + 0x12, 0xDD, 0xC8, 0xCE, 0xE5, 0xE6, 0x8E, 0xC5, 0x6B, 0xED, 0x84, 0xC6, + 0x93, 0xE4, 0xCF, 0xC2, 0xAF, 0xDD, 0xE0, 0xC0, 0xE2, 0xD9, 0x7A, 0xBF, + 0x4A, 0xD5, 0x82, 0xB8, 0xA6, 0xD1, 0x3B, 0xB9, 0xE4, 0xCB, 0x0B, 0xBD, + 0xE1, 0xC6, 0x14, 0xBE, 0x25, 0xBF, 0xA7, 0xB9, 0xA2, 0xBC, 0x89, 0xB9, + 0x15, 0xC1, 0xE9, 0xCA, 0x7E, 0xBF, 0xBC, 0xD9, 0x4C, 0xC0, 0x0E, 0xDB, + 0x4F, 0xCA, 0x70, 0xDB, 0x78, 0xD2, 0xB2, 0xDD, 0x71, 0xD0, 0x79, 0xE0, + 0x65, 0xCE, 0xB3, 0xEE, 0xFC, 0xCE, 0x1C, 0x01, 0xBC, 0xD3, 0xC7, 0xFF, + 0x38, 0xDC, 0x43, 0xF2, 0x7E, 0xDF, 0x9A, 0xF1, 0xFA, 0xDA, 0x80, 0xF6, + 0xE0, 0xCE, 0xF1, 0xF2, 0x60, 0xC8, 0xD1, 0xEB, 0x71, 0xD3, 0x64, 0xE6, + 0xC9, 0xE0, 0x4D, 0xE1, 0xDE, 0xE5, 0x18, 0xD6, 0xCE, 0xDD, 0xE0, 0xCB, + 0xD9, 0xD3, 0x2F, 0xD4, 0x2E, 0xDD, 0x18, 0xE2, 0x60, 0xED, 0x37, 0xE8, + 0x55, 0xFB, 0x01, 0xEE, 0xD1, 0x0A, 0xFB, 0xF5, 0x48, 0x11, 0xE3, 0xF6, + 0x02, 0x0F, 0xB3, 0xF6, 0xA6, 0x0D, 0x76, 0xFF, 0x21, 0x09, 0x6D, 0x01, + 0x83, 0x00, 0xE9, 0xFD, 0xF0, 0x02, 0xCD, 0xFC, 0x98, 0x17, 0x28, 0xF9, + 0x99, 0x1D, 0x8A, 0xF5, 0x51, 0x14, 0xD0, 0xFE, 0xF5, 0x16, 0xBF, 0x0E, + 0x75, 0x1E, 0xCF, 0x16, 0xA1, 0x20, 0xF4, 0x17, 0xAD, 0x1C, 0xCD, 0x14, + 0xD9, 0x1A, 0x7E, 0x1D, 0x19, 0x16, 0xFA, 0x2B, 0xDD, 0x13, 0x65, 0x2E, + 0x21, 0x1A, 0x0C, 0x23, 0xD2, 0x1F, 0x0C, 0x18, 0xE8, 0x16, 0x91, 0x12, + 0xFF, 0x07, 0x10, 0x16, 0x7F, 0x03, 0x8D, 0x21, 0x45, 0x0B, 0xC3, 0x28, + 0x1F, 0x18, 0xCE, 0x27, 0x78, 0x1A, 0xFE, 0x22, 0x56, 0x18, 0x4A, 0x22, + 0xD6, 0x12, 0x31, 0x1D, 0xF5, 0x0A, 0xB6, 0x11, 0x23, 0x0C, 0xFB, 0x0B, + 0xA1, 0x12, 0xC5, 0x15, 0x86, 0x0E, 0xAF, 0x26, 0x60, 0x0F, 0x25, 0x2F, + 0x5E, 0x1F, 0x8D, 0x29, 0x85, 0x26, 0xA6, 0x22, 0x86, 0x1B, 0x09, 0x23, + 0xAD, 0x12, 0x6E, 0x20, 0x8A, 0x15, 0x45, 0x10, 0xD4, 0x18, 0xAF, 0x00, + 0x44, 0x16, 0xDC, 0xFF, 0xCB, 0x0E, 0x80, 0x05, 0x48, 0x07, 0x28, 0x09, + 0x50, 0xFF, 0x56, 0x01, 0x6E, 0xFE, 0x9E, 0xF9, 0x05, 0xFA, 0x05, 0xF0, + 0xD0, 0xF2, 0x92, 0xE1, 0x27, 0xF5, 0x53, 0xDE, 0xCE, 0xF6, 0xED, 0xDB, + 0xFF, 0xFB, 0xFD, 0xD4, 0x75, 0x04, 0x9B, 0xD3, 0x8B, 0xFA, 0x54, 0xDB, + 0x37, 0xE9, 0x18, 0xE4, 0x7D, 0xDF, 0x5A, 0xDA, 0xCC, 0xD9, 0xF4, 0xCD, + 0xF8, 0xDD, 0x36, 0xD3, 0x74, 0xE1, 0xB6, 0xDB, 0xC9, 0xDD, 0xA7, 0xE0, + 0x02, 0xD3, 0xE7, 0xDD, 0xC4, 0xCE, 0x86, 0xD8, 0x68, 0xD7, 0x4E, 0xD7, + 0x2F, 0xD4, 0xC9, 0xDA, 0xDB, 0xC9, 0x76, 0xE3, 0x89, 0xCF, 0xC8, 0xE9, + 0xDD, 0xD9, 0xFA, 0xE7, 0x21, 0xE3, 0x89, 0xEB, 0x42, 0xF2, 0x14, 0xF5, + 0xD1, 0xF8, 0xF7, 0xF4, 0x4E, 0xEB, 0xD6, 0xF3, 0x01, 0xDD, 0xDE, 0xFC, + 0x1C, 0xDA, 0x5C, 0x0A, 0x01, 0xD9, 0x6C, 0x13, 0xA4, 0xE3, 0xC6, 0x10, + 0x70, 0xF9, 0x5F, 0x08, 0xF7, 0x03, 0x93, 0x04, 0xC7, 0x00, 0x14, 0x04, + 0x3D, 0x00, 0x70, 0x0A, 0x36, 0xFF, 0x4D, 0x12, 0x85, 0x09, 0xAC, 0x15, + 0xE0, 0x2C, 0xD7, 0x17, 0x9E, 0x42, 0xD8, 0x1B, 0x42, 0x36, 0xAE, 0x1F, + 0x5F, 0x20, 0xFB, 0x22, 0x52, 0x1D, 0x94, 0x2A, 0x39, 0x26, 0x04, 0x2A, + 0x30, 0x26, 0x45, 0x18, 0x0F, 0x27, 0xF7, 0x10, 0x15, 0x2B, 0xF1, 0x1C, + 0xBB, 0x29, 0xB1, 0x24, 0x3F, 0x2B, 0x29, 0x24, 0x61, 0x27, 0x7E, 0x19, + 0x6E, 0x24, 0xB6, 0x16, 0xCC, 0x2E, 0x9E, 0x1E, 0xF1, 0x2E, 0xD2, 0x1C, + 0x78, 0x27, 0xBB, 0x1B, 0x72, 0x31, 0x1B, 0x1D, 0x93, 0x33, 0x4A, 0x17, + 0xB1, 0x24, 0xC9, 0x0B, 0xD3, 0x22, 0x47, 0x03, 0xA4, 0x24, 0xBF, 0x08, + 0x2F, 0x20, 0xB0, 0x0C, 0xFC, 0x23, 0x1B, 0x0C, 0x1D, 0x2B, 0x9C, 0x14, + 0x7F, 0x2E, 0x2E, 0x18, 0xDE, 0x31, 0x20, 0x0E, 0x1E, 0x28, 0xFD, 0x07, + 0xF2, 0x0E, 0xB2, 0x11, 0x09, 0xFD, 0xC1, 0x20, 0xCB, 0xFA, 0x76, 0x21, + 0xB5, 0x03, 0x2E, 0x16, 0x49, 0x07, 0x8A, 0x0B, 0x24, 0xF8, 0x5F, 0x08, + 0x2C, 0xEC, 0xA7, 0x13, 0xE1, 0xE6, 0xA8, 0x1D, 0x16, 0xE3, 0x83, 0x1D, + 0x42, 0xEE, 0x21, 0x18, 0x6F, 0xFA, 0x30, 0x0B, 0x18, 0xFD, 0x57, 0x07, + 0x07, 0xF8, 0x3A, 0x0F, 0xE6, 0xEC, 0x2D, 0x06, 0x26, 0xE8, 0xF8, 0xF1, + 0xE8, 0xE2, 0x1A, 0xEF, 0x23, 0xDE, 0xCA, 0xF6, 0xAA, 0xE5, 0x27, 0xF2, + 0x53, 0xEC, 0x00, 0xE5, 0xE9, 0xE8, 0xAE, 0xDB, 0x16, 0xE7, 0x9F, 0xD4, + 0x0E, 0xE6, 0x98, 0xD0, 0xA1, 0xD9, 0xF5, 0xCA, 0x61, 0xD3, 0xF9, 0xC6, + 0xBD, 0xD6, 0xFA, 0xC3, 0xC4, 0xD5, 0xCB, 0xBF, 0xCB, 0xDA, 0x32, 0xCA, + 0x97, 0xD9, 0x80, 0xCF, 0xEF, 0xCF, 0x39, 0xC3, 0xA3, 0xCF, 0xF9, 0xC6, + 0x75, 0xD0, 0x90, 0xD6, 0xCD, 0xCC, 0x6F, 0xD6, 0xCA, 0xD3, 0x3D, 0xD2, + 0x30, 0xDD, 0x3A, 0xCC, 0x57, 0xD7, 0x09, 0xC7, 0x4E, 0xD7, 0x69, 0xD1, + 0x55, 0xDB, 0x2D, 0xDB, 0x6B, 0xD9, 0xAE, 0xDA, 0x02, 0xE2, 0x2D, 0xE4, + 0xC8, 0xEB, 0xA5, 0xF2, 0x59, 0xF1, 0xD1, 0xFB, 0x52, 0xFD, 0xFD, 0x04, + 0x43, 0x01, 0x4E, 0xFF, 0xFD, 0xFD, 0x4A, 0xF4, 0x53, 0x01, 0xF9, 0xF8, + 0x39, 0x04, 0x06, 0x0A, 0xF6, 0xFC, 0xB9, 0x16, 0xA4, 0xFC, 0x94, 0x13, + 0x6F, 0x0D, 0xF8, 0x0F, 0xF8, 0x15, 0x66, 0x0D, 0xFD, 0x20, 0xF9, 0x0E, + 0x06, 0x30, 0x2E, 0x1D, 0xAF, 0x24, 0x67, 0x27, 0x81, 0x11, 0x83, 0x21, + 0xF4, 0x04, 0x07, 0x1C, 0x5A, 0xF8, 0x5C, 0x1D, 0x69, 0xFC, 0x63, 0x1C, + 0x92, 0x0B, 0x5B, 0x1D, 0x0E, 0x10, 0x93, 0x17, 0x9E, 0x1A, 0xF1, 0x11, + 0x8A, 0x25, 0x65, 0x16, 0xC0, 0x1B, 0xC7, 0x12, 0xCF, 0x18, 0xAF, 0x0E, + 0x1A, 0x26, 0x8C, 0x1D, 0x7F, 0x2C, 0xEB, 0x2A, 0x99, 0x2E, 0xCB, 0x2F, + 0xE8, 0x2B, 0x2C, 0x2F, 0x36, 0x28, 0x86, 0x26, 0x8B, 0x28, 0xD7, 0x19, + 0xE8, 0x26, 0xF6, 0x0D, 0x93, 0x1F, 0xD5, 0x0B, 0x30, 0x10, 0x18, 0x13, + 0xEE, 0x09, 0x83, 0x16, 0xD8, 0x1C, 0xF4, 0x15, 0x11, 0x2F, 0x26, 0x1A, + 0xCF, 0x21, 0xF7, 0x12, 0xE7, 0x06, 0x4F, 0x06, 0x7D, 0xF1, 0xAB, 0x01, + 0x3A, 0xF2, 0xE5, 0xFD, 0x0F, 0xFE, 0x91, 0xF5, 0x7A, 0x07, 0x9F, 0xFA, + 0xB4, 0x10, 0xAE, 0x06, 0x04, 0x0A, 0x12, 0x05, 0x0D, 0x05, 0xD4, 0x0D, + 0x40, 0x04, 0x95, 0x10, 0x77, 0xF9, 0xC9, 0x00, 0xD0, 0xFD, 0x5C, 0x01, + 0x8D, 0x0D, 0xFE, 0x03, 0x65, 0x0D, 0x8A, 0xF5, 0x5B, 0x03, 0x84, 0xF2, + 0x7A, 0xF9, 0x4C, 0xF8, 0x0B, 0xF2, 0x82, 0xFA, 0xBB, 0xF1, 0x94, 0xFC, + 0x38, 0xFE, 0xB6, 0x01, 0xDB, 0x06, 0x80, 0x00, 0x48, 0x09, 0xDB, 0xFC, + 0xB9, 0x05, 0x97, 0x02, 0x32, 0xF8, 0x37, 0x06, 0xE4, 0xED, 0x26, 0x01, + 0x84, 0xEA, 0xAF, 0xFF, 0xA3, 0xEE, 0x1F, 0x13, 0x14, 0xF4, 0x2C, 0x23, + 0xA5, 0xF7, 0xEC, 0x18, 0x4F, 0xFE, 0xFC, 0x0A, 0x1F, 0x0A, 0xD5, 0x0A, + 0x05, 0x07, 0x73, 0x08, 0x40, 0xF8, 0x6E, 0x04, 0x4B, 0xF2, 0x77, 0x07, + 0xE1, 0xFB, 0x70, 0x10, 0x56, 0x05, 0x1D, 0x14, 0x0E, 0x05, 0x0E, 0x0D, + 0xE0, 0x10, 0x02, 0x0A, 0xBB, 0x21, 0x3A, 0x0C, 0xD0, 0x22, 0x39, 0x08, + 0x4B, 0x14, 0xAF, 0x00, 0x72, 0x0F, 0x23, 0x0D, 0x53, 0x13, 0x91, 0x18, + 0x47, 0x1F, 0x43, 0x14, 0x50, 0x39, 0x1C, 0x1A, 0x21, 0x38, 0xC4, 0x17, + 0x3E, 0x26, 0xE3, 0x0E, 0xFC, 0x14, 0xA7, 0x0C, 0x32, 0x05, 0x1F, 0x08, + 0xD1, 0x09, 0x6D, 0x05, 0xF5, 0x14, 0x1E, 0xFF, 0x2E, 0x1B, 0x94, 0xFC, + 0x37, 0x1B, 0x3E, 0x01, 0xD6, 0x1A, 0xA5, 0x0A, 0x7F, 0x1D, 0x87, 0x17, + 0x59, 0x11, 0x8F, 0x13, 0x8F, 0x03, 0x11, 0x07, 0xD2, 0x07, 0x6E, 0x00, + 0x87, 0x11, 0x80, 0xFC, 0xA5, 0x0F, 0x10, 0xF6, 0x57, 0x01, 0x5E, 0xEC, + 0xD9, 0xF7, 0xCF, 0xEB, 0x1F, 0xF7, 0xA1, 0xF2, 0xDF, 0xEA, 0x42, 0xF1, + 0x50, 0xE0, 0x24, 0xF4, 0xF8, 0xE7, 0x6C, 0xFA, 0xD2, 0xEF, 0x4D, 0xF5, + 0x55, 0xF5, 0x5E, 0xF1, 0x91, 0xFE, 0x67, 0xF0, 0x6C, 0x02, 0x22, 0xEA, + 0x92, 0xF9, 0xB4, 0xDF, 0xDC, 0xEB, 0xE7, 0xD8, 0x79, 0xDC, 0xFB, 0xD8, + 0xA3, 0xD5, 0x8C, 0xDE, 0xFF, 0xE1, 0x73, 0xDD, 0x02, 0xEA, 0xBB, 0xD4, + 0x73, 0xE4, 0xF3, 0xD6, 0xB9, 0xDD, 0x79, 0xE5, 0x8C, 0xCE, 0x66, 0xE8, + 0x5E, 0xC3, 0x51, 0xE5, 0x42, 0xC7, 0x14, 0xE6, 0xF6, 0xC8, 0xEE, 0xE1, + 0xC1, 0xCB, 0x5B, 0xE8, 0x15, 0xD1, 0xCB, 0xF4, 0x05, 0xC8, 0xCE, 0xF0, + 0x89, 0xC0, 0xDE, 0xE8, 0x0B, 0xC9, 0x58, 0xEF, 0x90, 0xD2, 0x3C, 0xFC, + 0xA5, 0xDC, 0xC5, 0x00, 0x85, 0xDF, 0x9A, 0xF0, 0xD4, 0xD8, 0x9F, 0xDF, + 0xFC, 0xDE, 0xEE, 0xEA, 0x57, 0xE2, 0xC0, 0xF3, 0xC4, 0xD8, 0xB3, 0xED, + 0x5B, 0xDC, 0xD5, 0xEA, 0x28, 0xE9, 0x27, 0xE3, 0xDF, 0xEF, 0xC6, 0xDD, + 0x30, 0x00, 0xA5, 0xE9, 0xB5, 0x08, 0xE9, 0xF0, 0x1B, 0xF5, 0x08, 0xE5, + 0x3D, 0xF0, 0x0F, 0xE6, 0x1C, 0xF8, 0xBF, 0xE5, 0x95, 0xF7, 0x18, 0xDC, + 0xA5, 0xFA, 0xD9, 0xDC, 0xC4, 0x01, 0xBC, 0xDC, 0xE2, 0x10, 0x32, 0xE7, + 0xA1, 0x18, 0x9E, 0xF7, 0x3C, 0x14, 0xA4, 0xFF, 0xFB, 0x13, 0x7B, 0x01, + 0xA5, 0x15, 0xE6, 0x02, 0xA9, 0x15, 0xED, 0x09, 0x2C, 0x11, 0xCE, 0x0E, + 0x41, 0x15, 0xA4, 0x19, 0xA1, 0x0E, 0x67, 0x15, 0xC6, 0x00, 0x96, 0x07, + 0x50, 0x05, 0x45, 0x17, 0x8F, 0x03, 0x08, 0x28, 0xD2, 0xF8, 0x9F, 0x2A, + 0x1D, 0xF4, 0x9B, 0x33, 0xFC, 0xF3, 0xD1, 0x31, 0x5F, 0xFD, 0x8E, 0x1E, + 0xC9, 0x0F, 0x71, 0x12, 0xB5, 0x14, 0xDA, 0x0F, 0x88, 0x08, 0x99, 0x0A, + 0x06, 0xF7, 0xE7, 0x04, 0x8D, 0xF7, 0x96, 0x0D, 0x76, 0x0B, 0xE9, 0x11, + 0x1D, 0x15, 0xE2, 0xFF, 0x1F, 0x1D, 0xA5, 0xF9, 0x5D, 0x29, 0x8A, 0x08, + 0x48, 0x22, 0x87, 0x10, 0xA9, 0x19, 0x8A, 0x0F, 0x58, 0x18, 0xB0, 0x00, + 0x90, 0x0F, 0x91, 0xED, 0x28, 0x0A, 0xF1, 0xEC, 0x87, 0x0A, 0x3F, 0xF6, + 0xE7, 0x06, 0x8B, 0xFE, 0x96, 0xFC, 0x6E, 0xFD, 0xAF, 0xF8, 0x92, 0xF4, + 0xC9, 0xF5, 0xDA, 0xF0, 0x29, 0xEA, 0x05, 0xE9, 0x9C, 0xE5, 0x27, 0xDB, + 0xF2, 0xEC, 0xB3, 0xD9, 0xC9, 0xFA, 0x3C, 0xEB, 0xF3, 0x0C, 0x1A, 0x00, + 0x5B, 0x0E, 0x18, 0xF8, 0x22, 0x05, 0xC3, 0xE4, 0xA4, 0x01, 0xD9, 0xE7, + 0xE9, 0xF6, 0xC6, 0xF3, 0x13, 0xEB, 0x0E, 0xF9, 0x63, 0xF2, 0x59, 0xF9, + 0x18, 0x02, 0xE6, 0xEF, 0x0B, 0x09, 0x4F, 0xE7, 0x65, 0x07, 0x26, 0xF8, + 0x65, 0xF3, 0xE0, 0x08, 0xA0, 0xD6, 0x93, 0x04, 0x7B, 0xD5, 0x0A, 0xFD, + 0x64, 0xEE, 0x6A, 0xF6, 0x3C, 0x02, 0x58, 0xF2, 0x0A, 0x01, 0x77, 0xF0, + 0xB8, 0xF6, 0xC3, 0xF9, 0x54, 0xEC, 0x27, 0x0E, 0xA2, 0xE2, 0x48, 0x16, + 0xCC, 0xE9, 0x20, 0x17, 0xF3, 0xF7, 0xFB, 0x20, 0xCB, 0xFE, 0xE9, 0x25, + 0xAF, 0x01, 0x9C, 0x1C, 0x23, 0x03, 0x2D, 0x19, 0xCF, 0x01, 0xA2, 0x1B, + 0x3D, 0xFD, 0xD1, 0x17, 0xD9, 0xFD, 0xBD, 0x11, 0xE9, 0x05, 0xA1, 0x0A, + 0x53, 0x11, 0x95, 0x02, 0xA6, 0x1F, 0x25, 0x07, 0x2B, 0x32, 0x24, 0x19, + 0xF1, 0x2F, 0x79, 0x1C, 0x2B, 0x1A, 0xCA, 0x19, 0x55, 0x13, 0xE7, 0x1F, + 0xE8, 0x1B, 0x7A, 0x21, 0xBE, 0x24, 0xFC, 0x1E, 0x5E, 0x22, 0xAC, 0x1A, + 0xB2, 0x21, 0x71, 0x18, 0x27, 0x30, 0x77, 0x1F, 0xBE, 0x33, 0xB2, 0x28, + 0x2A, 0x2C, 0xAB, 0x25, 0x80, 0x27, 0xE9, 0x1B, 0xB9, 0x24, 0xA5, 0x17, + 0x0E, 0x28, 0x03, 0x14, 0xFC, 0x24, 0x5F, 0x0C, 0x04, 0x1E, 0xF6, 0x0C, + 0x2E, 0x20, 0xF8, 0x18, 0xB4, 0x1A, 0x84, 0x19, 0xA4, 0x0E, 0xA3, 0x0C, + 0x0A, 0x0F, 0x9F, 0x03, 0xE9, 0x15, 0xCA, 0x05, 0xF5, 0x16, 0x6D, 0x0D, + 0x32, 0x1B, 0x99, 0x0D, 0xF5, 0x23, 0xF4, 0x05, 0x68, 0x27, 0xEB, 0x04, + 0xE2, 0x21, 0x30, 0x0E, 0xE1, 0x16, 0xFE, 0x15, 0x07, 0x0E, 0xD1, 0x12, + 0xA7, 0x01, 0x32, 0x04, 0x59, 0xFD, 0x73, 0xFA, 0x3E, 0x03, 0x9B, 0x01, + 0x5C, 0xFA, 0x04, 0x0C, 0x11, 0xEF, 0x77, 0x12, 0xA6, 0xF0, 0xAC, 0x18, + 0x87, 0xF5, 0x08, 0x1A, 0xC4, 0xF1, 0xC4, 0x0E, 0x02, 0xEB, 0x5A, 0x08, + 0xF3, 0xED, 0x9F, 0x0B, 0xFE, 0xF7, 0x2A, 0x05, 0x38, 0xF5, 0x72, 0xFB, + 0x7B, 0xE1, 0x41, 0xF4, 0x7B, 0xD2, 0xD6, 0xE6, 0xA4, 0xD4, 0x61, 0xDE, + 0x30, 0xDF, 0x36, 0xE3, 0x83, 0xE8, 0x85, 0xF0, 0x87, 0xE9, 0xD3, 0xF7, + 0x5B, 0xEA, 0xD1, 0xF4, 0x96, 0xF4, 0xE3, 0xEA, 0xBE, 0xFA, 0xD3, 0xD6, + 0x3D, 0xF5, 0x2E, 0xC5, 0x1A, 0xE8, 0xDA, 0xC2, 0x8B, 0xDD, 0x1B, 0xCB, + 0x1B, 0xD8, 0xA7, 0xCA, 0x24, 0xDB, 0x0B, 0xC2, 0xFC, 0xE5, 0x3E, 0xC6, + 0x1D, 0xE5, 0xDC, 0xCD, 0x13, 0xD0, 0x7F, 0xC3, 0x7F, 0xB7, 0x87, 0xB4, + 0x97, 0xAD, 0x03, 0xAE, 0x25, 0xB3, 0x9D, 0xAC, 0x0D, 0xBF, 0xB8, 0xB3, + 0xF6, 0xC5, 0xA5, 0xC1, 0x1F, 0xCA, 0x4E, 0xCE, 0x6F, 0xCD, 0x7D, 0xD5, + 0x23, 0xCE, 0x74, 0xDB, 0x5E, 0xD3, 0xF2, 0xE7, 0xCC, 0xD4, 0x75, 0xEC, + 0x70, 0xDD, 0x39, 0xEA, 0x76, 0xEE, 0xD3, 0xE9, 0x7D, 0xF1, 0x68, 0xE8, + 0x40, 0xE9, 0x7B, 0xF1, 0x62, 0xD9, 0xF0, 0xF8, 0x8B, 0xD0, 0xEE, 0xF7, + 0xD8, 0xDF, 0x86, 0xF8, 0x56, 0xF7, 0x38, 0xF0, 0x53, 0x07, 0x5D, 0xE6, + 0x3A, 0x13, 0x25, 0xF0, 0xCD, 0x11, 0x30, 0xFA, 0x9F, 0x09, 0x2F, 0xFC, + 0xF4, 0x0D, 0x4A, 0x0D, 0x57, 0x11, 0xCE, 0x19, 0x62, 0x14, 0xE3, 0x1B, + 0x85, 0x17, 0x77, 0x21, 0xD9, 0x10, 0x9D, 0x19, 0x13, 0x17, 0xF9, 0x0F, + 0x71, 0x26, 0xC4, 0x11, 0x2C, 0x27, 0xAB, 0x17, 0x62, 0x20, 0x66, 0x1F, + 0xD9, 0x1A, 0x15, 0x20, 0x81, 0x1B, 0x41, 0x24, 0xE4, 0x1F, 0x85, 0x2C, + 0x0A, 0x23, 0xB7, 0x34, 0x75, 0x29, 0x91, 0x3F, 0xE4, 0x2D, 0x1F, 0x3C, + 0xC4, 0x25, 0x56, 0x34, 0xEA, 0x15, 0x32, 0x34, 0xD4, 0x14, 0x7F, 0x37, + 0x0C, 0x18, 0xF0, 0x34, 0x4E, 0x17, 0x57, 0x29, 0x76, 0x20, 0xF7, 0x20, + 0x81, 0x24, 0xB9, 0x22, 0x4E, 0x19, 0x82, 0x23, 0xF6, 0x0D, 0x4E, 0x19, + 0xBA, 0x0F, 0xA7, 0x0B, 0x03, 0x21, 0x32, 0x02, 0x60, 0x2D, 0x00, 0x01, + 0xCF, 0x21, 0x5C, 0x05, 0x96, 0x1B, 0x7C, 0x11, 0x3D, 0x1E, 0x9F, 0x17, + 0x70, 0x1F, 0x68, 0x13, 0xFA, 0x20, 0xF3, 0x10, 0x12, 0x1A, 0xBF, 0x08, + 0x8A, 0x0F, 0xF3, 0xFA, 0x85, 0x08, 0x96, 0xF1, 0xE6, 0x08, 0xC1, 0xF8, + 0xDB, 0x0D, 0x0E, 0x09, 0xF2, 0x09, 0x96, 0x0F, 0x77, 0x04, 0x09, 0x10, + 0xE0, 0x09, 0xAA, 0x0D, 0x8E, 0x06, 0x19, 0x04, 0x48, 0x04, 0x8C, 0x05, + 0x71, 0x0C, 0x8E, 0x19, 0xC6, 0x0B, 0xA0, 0x21, 0xA4, 0x09, 0x06, 0x14, + 0xDF, 0x0A, 0x92, 0x11, 0xC7, 0xFC, 0x1B, 0x16, 0x12, 0xE9, 0x7D, 0x0F, + 0xE0, 0xEB, 0x91, 0x0F, 0x06, 0xFB, 0x73, 0x09, 0x11, 0x05, 0xC3, 0xFA, + 0x50, 0x06, 0x42, 0xFC, 0xA9, 0xFE, 0x20, 0x09, 0xD5, 0xF8, 0x15, 0x0F, + 0x07, 0xFD, 0x64, 0x05, 0x51, 0x07, 0xCE, 0xF7, 0xC6, 0x0F, 0xF1, 0xF5, + 0xF5, 0x11, 0xA2, 0xFA, 0x0C, 0x10, 0x15, 0xFD, 0x51, 0x17, 0x28, 0x05, + 0x1E, 0x20, 0x30, 0x0B, 0x0D, 0x20, 0x1F, 0x11, 0xBD, 0x25, 0xA8, 0x1D, + 0x51, 0x2B, 0xB2, 0x1A, 0x65, 0x25, 0xF2, 0x16, 0xB2, 0x24, 0x6C, 0x22, + 0xB8, 0x25, 0xFD, 0x25, 0xC2, 0x21, 0x81, 0x28, 0x0C, 0x19, 0x37, 0x26, + 0x79, 0x06, 0x49, 0x14, 0x12, 0xFE, 0x9D, 0x0F, 0xA9, 0x04, 0xDF, 0x11, + 0xA5, 0x0A, 0x93, 0x0B, 0xD3, 0x12, 0x2F, 0x12, 0x33, 0x1D, 0xF7, 0x1B, + 0x2E, 0x1E, 0xDB, 0x13, 0xAD, 0x1A, 0xF8, 0x0A, 0xC0, 0x14, 0x03, 0x07, + 0x8F, 0x0F, 0x69, 0xFB, 0x97, 0x15, 0x53, 0xF1, 0x3F, 0x1C, 0x98, 0xF5, + 0xF6, 0x11, 0x56, 0xFD, 0xE0, 0x01, 0x2B, 0x04, 0x3E, 0xFC, 0xDD, 0x0B, + 0x3E, 0xFD, 0x2A, 0x03, 0x1E, 0x00, 0x08, 0xEF, 0xCF, 0xFD, 0x41, 0xEE, + 0x44, 0xF4, 0xB8, 0xFA, 0x7D, 0xEA, 0xFC, 0x02, 0x07, 0xE4, 0xFA, 0xFB, + 0x79, 0xE5, 0x4F, 0xEA, 0xFB, 0xE8, 0xC7, 0xE6, 0xD5, 0xDE, 0xE0, 0xEB, + 0x21, 0xCF, 0x22, 0xEF, 0xD9, 0xCA, 0x4B, 0xF0, 0xB0, 0xCF, 0x32, 0xEC, + 0xB1, 0xD4, 0x07, 0xE2, 0x37, 0xD8, 0xFB, 0xD5, 0x39, 0xD7, 0xD5, 0xD3, + 0xAA, 0xD1, 0xD7, 0xDA, 0x92, 0xCC, 0x13, 0xDB, 0x41, 0xCA, 0x8D, 0xDA, + 0xD5, 0xCE, 0x0D, 0xE1, 0x22, 0xD1, 0xC4, 0xDD, 0xBF, 0xD1, 0x02, 0xD8, + 0x29, 0xD8, 0x0B, 0xE2, 0x04, 0xDB, 0xFE, 0xEE, 0x73, 0xD3, 0x71, 0xEE, + 0xF0, 0xCE, 0xC4, 0xE0, 0x28, 0xDC, 0x93, 0xD5, 0xDE, 0xDF, 0x38, 0xD5, + 0xFB, 0xD0, 0xBA, 0xD7, 0x37, 0xCA, 0xE2, 0xDA, 0x23, 0xD2, 0xAF, 0xD7, + 0x1E, 0xE2, 0x49, 0xC7, 0x20, 0xEF, 0x90, 0xB8, 0xD3, 0xEF, 0xB2, 0xC3, + 0xC5, 0xE2, 0xA3, 0xDA, 0x6B, 0xD3, 0xF6, 0xE0, 0xB5, 0xD3, 0x81, 0xDB, + 0x1F, 0xE2, 0xBA, 0xCF, 0x0C, 0xF6, 0x63, 0xC3, 0x27, 0xFF, 0x81, 0xC1, + 0x50, 0xF3, 0xDF, 0xC8, 0x51, 0xE9, 0x14, 0xD0, 0x25, 0xEC, 0x2B, 0xD5, + 0xFD, 0xF6, 0xEA, 0xDB, 0x2F, 0x06, 0xF5, 0xE6, 0x45, 0x14, 0xCC, 0xF9, + 0xC7, 0x15, 0x7D, 0x02, 0xAC, 0x0E, 0xC7, 0xFF, 0x4B, 0x0A, 0xD8, 0x03, + 0xE9, 0x07, 0x20, 0x08, 0x76, 0x0E, 0x91, 0x09, 0xFE, 0x15, 0xF4, 0x0D, + 0xF0, 0x0D, 0x5B, 0x19, 0x9C, 0xFF, 0x91, 0x2E, 0xDC, 0xF8, 0xED, 0x3C, + 0x3F, 0xFE, 0x36, 0x3A, 0x08, 0x09, 0x56, 0x30, 0xCF, 0x0E, 0x76, 0x26, + 0x7E, 0x0E, 0x32, 0x26, 0x5B, 0x0E, 0xA4, 0x2C, 0x6C, 0x10, 0xAD, 0x2C, + 0x7C, 0x0D, 0x88, 0x2F, 0xA3, 0x09, 0xD6, 0x30, 0x28, 0x0B, 0x83, 0x29, + 0x9C, 0x09, 0x51, 0x25, 0x94, 0x0F, 0xE1, 0x26, 0xC7, 0x20, 0x68, 0x26, + 0x25, 0x2A, 0xD2, 0x1F, 0x06, 0x32, 0xE4, 0x1A, 0x7E, 0x3F, 0xC1, 0x1B, + 0x59, 0x3B, 0x5A, 0x1A, 0x40, 0x2B, 0xD7, 0x14, 0x65, 0x26, 0x8D, 0x13, + 0x40, 0x1D, 0xE5, 0x0E, 0xC5, 0x0E, 0x4A, 0x08, 0xF8, 0x08, 0x01, 0x09, + 0x63, 0x03, 0x55, 0x02, 0x08, 0xFD, 0xBE, 0xF2, 0x69, 0xF8, 0x30, 0xE9, + 0x8E, 0xF5, 0xBF, 0xEB, 0x72, 0xF7, 0x6F, 0xEF, 0x4E, 0xFE, 0x2F, 0xEA, + 0x14, 0xFC, 0xE3, 0xE5, 0x45, 0xF1, 0x41, 0xE9, 0xB7, 0xF0, 0x08, 0xEA, + 0xD1, 0xF0, 0xED, 0xE7, 0xBF, 0xF0, 0x76, 0xEE, 0x1B, 0xF6, 0x31, 0xEF, + 0x35, 0xF5, 0x51, 0xEB, 0xF2, 0xEE, 0x2A, 0xF5, 0x22, 0xE8, 0xC6, 0x00, + 0xB0, 0xE9, 0x16, 0x03, 0x35, 0xF0, 0x46, 0xF9, 0x8C, 0xEC, 0x91, 0xEE, + 0xBB, 0xE6, 0x92, 0xEC, 0xE1, 0xE8, 0xD9, 0xE5, 0x1D, 0xF1, 0xCE, 0xDF, + 0xC7, 0xF4, 0x89, 0xE1, 0x68, 0xF2, 0xAC, 0xE8, 0xB6, 0xEE, 0xFB, 0xF5, + 0x9B, 0xF0, 0xC7, 0x03, 0x89, 0xF9, 0x74, 0x08, 0x5A, 0xFB, 0x96, 0x06, + 0x78, 0xF7, 0x8B, 0x07, 0x3D, 0xF2, 0xD0, 0x0E, 0x8B, 0xEF, 0xB1, 0x13, + 0x03, 0xF7, 0xFC, 0x06, 0x84, 0x03, 0xD5, 0xF5, 0x0D, 0x11, 0xC8, 0xF3, + 0x63, 0x17, 0x77, 0xFC, 0x0F, 0x11, 0x54, 0x07, 0x48, 0x0F, 0xDB, 0x11, + 0x80, 0x17, 0x42, 0x19, 0xAB, 0x1E, 0x2B, 0x1C, 0xD3, 0x23, 0x70, 0x1D, + 0xA0, 0x2A, 0x90, 0x22, 0xF3, 0x2A, 0x15, 0x28, 0x3B, 0x27, 0x46, 0x23, + 0xB8, 0x2A, 0x4A, 0x1E, 0x32, 0x2E, 0x40, 0x26, 0x39, 0x30, 0x6A, 0x2E, + 0x80, 0x3B, 0x8B, 0x2C, 0x9A, 0x49, 0xDE, 0x26, 0x42, 0x4A, 0xB5, 0x27, + 0xDE, 0x3E, 0x78, 0x2B, 0x3F, 0x33, 0xB5, 0x29, 0x4E, 0x2F, 0xE5, 0x25, + 0xE6, 0x2E, 0xA7, 0x23, 0xE5, 0x2D, 0xF5, 0x26, 0x92, 0x2D, 0x48, 0x2A, + 0x46, 0x2B, 0x8F, 0x24, 0x0D, 0x23, 0xE9, 0x1C, 0xED, 0x1E, 0xC1, 0x1B, + 0x3E, 0x20, 0xEC, 0x1A, 0xD2, 0x1F, 0x7A, 0x1F, 0x3F, 0x25, 0x8F, 0x29, + 0x90, 0x27, 0x90, 0x27, 0x21, 0x1B, 0x5D, 0x1C, 0x80, 0x0B, 0x99, 0x19, + 0x8C, 0x04, 0x01, 0x1E, 0x48, 0xFF, 0xFF, 0x19, 0x4D, 0xFC, 0xFF, 0x14, + 0x94, 0xFC, 0x15, 0x14, 0xBB, 0xF9, 0xF5, 0x11, 0x6D, 0xF3, 0x31, 0x0D, + 0x54, 0xF0, 0x50, 0x05, 0x82, 0xF6, 0xF1, 0xFD, 0xB5, 0xFB, 0x5A, 0xF5, + 0x7C, 0xF6, 0x3D, 0xE9, 0x16, 0xEA, 0x45, 0xDF, 0x18, 0xDF, 0x67, 0xDF, + 0xAE, 0xD8, 0x84, 0xDB, 0xD4, 0xD4, 0x47, 0xCC, 0x50, 0xD3, 0x30, 0xCB, + 0xA9, 0xD0, 0x75, 0xD3, 0x75, 0xC7, 0x98, 0xD9, 0xA0, 0xBD, 0xAF, 0xE1, + 0xC9, 0xBF, 0x66, 0xE3, 0x41, 0xC9, 0x0F, 0xD7, 0x69, 0xCF, 0xAD, 0xC6, + 0xDE, 0xD1, 0xAC, 0xC6, 0x28, 0xD2, 0xE6, 0xD2, 0x06, 0xCF, 0xFF, 0xD4, + 0x26, 0xC9, 0xFB, 0xCB, 0xC6, 0xC8, 0x81, 0xCE, 0x5B, 0xCF, 0xCB, 0xD0, + 0x0E, 0xD3, 0xFC, 0xC3, 0xD3, 0xD0, 0x62, 0xBC, 0xC0, 0xC8, 0x78, 0xBD, + 0x03, 0xC2, 0x9D, 0xBF, 0xDF, 0xBE, 0xB9, 0xBB, 0x33, 0xC2, 0x13, 0xB6, + 0x5A, 0xCA, 0xCC, 0xB7, 0xB0, 0xC5, 0x5F, 0xBA, 0x2B, 0xBD, 0x89, 0xC3, + 0x0B, 0xC5, 0x33, 0xD2, 0xB0, 0xDB, 0xDB, 0xD4, 0xB7, 0xE9, 0x38, 0xCC, + 0x93, 0xE9, 0x5E, 0xC9, 0x7E, 0xE8, 0x63, 0xD7, 0x8A, 0xE0, 0xEA, 0xEA, + 0x67, 0xDD, 0x1A, 0xF7, 0x2F, 0xE5, 0xB3, 0xF8, 0x1A, 0xF0, 0x7C, 0xF5, + 0xB1, 0x01, 0x17, 0xF1, 0x79, 0x0C, 0x61, 0xEB, 0x0F, 0x06, 0x0E, 0xF0, + 0xAE, 0xFF, 0x9F, 0xF8, 0x99, 0x08, 0xB8, 0xFA, 0x3E, 0x18, 0x75, 0x09, + 0xDB, 0x1F, 0xC6, 0x23, 0x50, 0x1B, 0x48, 0x2D, 0x80, 0x11, 0xAE, 0x29, + 0x9D, 0x0B, 0xDA, 0x22, 0x3A, 0x09, 0x71, 0x14, 0x33, 0x0F, 0x91, 0x0C, + 0x28, 0x1D, 0x2B, 0x13, 0x02, 0x28, 0x5A, 0x17, 0xA7, 0x2D, 0xD0, 0x18, + 0x0A, 0x30, 0x4F, 0x22, 0x1F, 0x33, 0x1A, 0x2B, 0x81, 0x33, 0xFB, 0x2D, + 0xC5, 0x2F, 0x89, 0x2B, 0x54, 0x2E, 0xCF, 0x29, 0x95, 0x31, 0xFB, 0x32, + 0x0D, 0x34, 0x82, 0x3E, 0xAB, 0x32, 0x27, 0x42, 0x6F, 0x2B, 0xEF, 0x3C, + 0xB2, 0x1F, 0x70, 0x35, 0x27, 0x14, 0x0E, 0x36, 0x4E, 0x0E, 0x24, 0x3A, + 0x40, 0x11, 0xBA, 0x39, 0xF1, 0x11, 0x2B, 0x35, 0x46, 0x0F, 0x44, 0x2D, + 0xED, 0x0D, 0x3D, 0x23, 0xB5, 0x0F, 0xB2, 0x1C, 0x8C, 0x12, 0xEE, 0x1B, + 0xE1, 0x11, 0xB3, 0x1D, 0x56, 0x15, 0x14, 0x20, 0xF8, 0x1F, 0x33, 0x22, + 0x41, 0x28, 0x77, 0x1F, 0x6D, 0x2C, 0x0A, 0x13, 0xAD, 0x27, 0x1A, 0xFF, + 0x13, 0x15, 0xDD, 0xEE, 0x4A, 0x0A, 0x85, 0xE9, 0x0B, 0x0B, 0x5D, 0xE9, + 0x30, 0x07, 0x9C, 0xF0, 0xBA, 0x01, 0xDE, 0xF9, 0xF8, 0x03, 0xCC, 0xF7, + 0x24, 0x0F, 0x1C, 0xED, 0x90, 0x15, 0xD8, 0xE5, 0x31, 0x0D, 0x0E, 0xEE, + 0x21, 0xFB, 0x4F, 0xFF, 0x62, 0xEB, 0x69, 0x06, 0xE3, 0xEE, 0x5B, 0x03, + 0xE1, 0xFC, 0x87, 0x04, 0x19, 0xFF, 0x3C, 0x08, 0x98, 0xFA, 0xD3, 0x0B, + 0x96, 0xF5, 0x65, 0x13, 0xD7, 0xEC, 0x62, 0x19, 0x40, 0xE7, 0xEE, 0x17, + 0x74, 0xEC, 0xE1, 0x17, 0xBA, 0xFC, 0xD2, 0x1B, 0xB8, 0x0A, 0x5F, 0x16, + 0xF6, 0x08, 0x8F, 0x0D, 0x26, 0x05, 0x2D, 0x12, 0xA0, 0x07, 0x4E, 0x17, + 0xB4, 0x03, 0x9C, 0x10, 0xD3, 0x04, 0xC4, 0x07, 0x90, 0x15, 0x36, 0x06, + 0xF4, 0x22, 0x09, 0x0E, 0xE1, 0x26, 0x5B, 0x16, 0x11, 0x29, 0x4B, 0x17, + 0x31, 0x2C, 0xE5, 0x14, 0x88, 0x31, 0x42, 0x15, 0x89, 0x36, 0xA8, 0x1A, + 0xE4, 0x38, 0x20, 0x26, 0x0B, 0x2E, 0x27, 0x2E, 0x09, 0x1E, 0xDC, 0x26, + 0xA7, 0x24, 0xA8, 0x15, 0x3B, 0x30, 0x8C, 0x07, 0x13, 0x2D, 0x1D, 0x04, + 0xDC, 0x20, 0x94, 0x0B, 0x2A, 0x0C, 0xC8, 0x14, 0x81, 0x02, 0x57, 0x13, + 0x03, 0x10, 0xF8, 0x0A, 0x45, 0x1B, 0x07, 0x08, 0xE7, 0x13, 0xE2, 0x04, + 0x91, 0x05, 0x3C, 0xFE, 0x82, 0xFC, 0x58, 0xFD, 0x31, 0xFB, 0xDE, 0xFF, + 0xFF, 0xFF, 0x52, 0xFF, 0x18, 0x05, 0xE6, 0xFD, 0x73, 0x08, 0x47, 0x00, + 0xDD, 0x07, 0xD7, 0x02, 0x3B, 0x04, 0x90, 0x04, 0xB4, 0x02, 0x6E, 0x09, + 0xEF, 0xFE, 0xF0, 0x06, 0x26, 0xF8, 0x48, 0xFB, 0xDF, 0xF3, 0x63, 0xF2, + 0xCA, 0xF8, 0x05, 0xEF, 0xBA, 0xFD, 0xFF, 0xF1, 0x7E, 0xF0, 0xFC, 0xF5, + 0xF7, 0xDB, 0xBD, 0xF2, 0x17, 0xD5, 0x07, 0xEF, 0x06, 0xDD, 0x79, 0xED, + 0x8C, 0xE4, 0x41, 0xE8, 0xB6, 0xE1, 0x72, 0xE7, 0x13, 0xDE, 0x81, 0xED, + 0xD5, 0xDB, 0xF7, 0xEB, 0x0B, 0xD8, 0x13, 0xE9, 0x18, 0xD4, 0x4C, 0xEC, + 0x68, 0xCF, 0xD6, 0xEE, 0xA9, 0xC7, 0xE7, 0xEE, 0xD8, 0xC2, 0x12, 0xEB, + 0x92, 0xCD, 0x1F, 0xE8, 0x92, 0xDD, 0x7F, 0xE7, 0xBA, 0xDB, 0xC0, 0xE0, + 0x27, 0xC9, 0xDA, 0xD7, 0xB1, 0xBF, 0xC9, 0xD2, 0x6C, 0xC0, 0xED, 0xCC, + 0x7B, 0xC2, 0x51, 0xC9, 0x48, 0xC6, 0x8A, 0xC8, 0xCF, 0xC6, 0x61, 0xC3, + 0xB5, 0xCC, 0x2B, 0xBA, 0x52, 0xDD, 0x94, 0xB5, 0x35, 0xE3, 0x28, 0xBA, + 0x82, 0xD8, 0xE7, 0xC3, 0x0E, 0xD4, 0xF6, 0xCF, 0x27, 0xDC, 0x0D, 0xD7, + 0x9E, 0xE1, 0x8A, 0xD0, 0x26, 0xE2, 0xB7, 0xC4, 0x71, 0xE6, 0x83, 0xBF, + 0xDC, 0xEF, 0xCE, 0xC1, 0xC1, 0xF4, 0xD5, 0xC6, 0x11, 0xF1, 0x47, 0xCE, + 0xE3, 0xEF, 0xFD, 0xDC, 0x98, 0xF3, 0x41, 0xED, 0x40, 0xF8, 0x16, 0xF3, + 0x03, 0x03, 0xC7, 0xF4, 0xE4, 0x10, 0xE9, 0xF9, 0x43, 0x18, 0xB5, 0x04, + 0xEA, 0x13, 0xB7, 0x0B, 0x46, 0x06, 0x3D, 0x02, 0x77, 0xFE, 0xB2, 0x01, + 0xC2, 0xFE, 0x0F, 0x13, 0x4B, 0x05, 0xA1, 0x21, 0xE4, 0x0F, 0x92, 0x2F, + 0xC6, 0x11, 0xE7, 0x35, 0x23, 0x0E, 0x21, 0x2C, 0xF0, 0x14, 0x05, 0x2C, + 0x88, 0x20, 0xF4, 0x35, 0x9F, 0x1F, 0x0D, 0x39, 0xAD, 0x18, 0xC5, 0x3C, + 0x19, 0x1E, 0x28, 0x3D, 0x80, 0x2A, 0xCB, 0x34, 0xCE, 0x29, 0xF5, 0x2E, + 0x6B, 0x1B, 0x1E, 0x2B, 0x5A, 0x0E, 0x32, 0x23, 0x99, 0x07, 0x30, 0x18, + 0x87, 0x05, 0xA1, 0x0F, 0x2F, 0x0B, 0xC8, 0x0F, 0xF3, 0x14, 0x96, 0x11, + 0x93, 0x17, 0x76, 0x0D, 0xE9, 0x18, 0x88, 0x0A, 0xC9, 0x1B, 0xFA, 0x09, + 0x73, 0x0C, 0xE4, 0x04, 0x8F, 0xF7, 0x4C, 0x02, 0x1B, 0xF0, 0xB2, 0xFC, + 0xF8, 0xF1, 0x84, 0xEA, 0x21, 0xFD, 0x97, 0xDB, 0x57, 0x03, 0x7C, 0xD8, + 0xF8, 0xFE, 0x85, 0xDB, 0x21, 0xF9, 0x65, 0xDF, 0x86, 0xF4, 0x39, 0xE4, + 0x26, 0xF5, 0x67, 0xEB, 0x02, 0xFE, 0x22, 0xEE, 0x98, 0x02, 0x18, 0xE8, + 0x62, 0xFD, 0x0D, 0xE5, 0x2C, 0xF8, 0xA6, 0xEA, 0xD0, 0xEE, 0x7A, 0xEA, + 0xD8, 0xE1, 0xBC, 0xE9, 0x69, 0xDD, 0x7D, 0xF4, 0x64, 0xDE, 0x48, 0xFA, + 0x33, 0xDE, 0x6F, 0xF8, 0xA0, 0xE3, 0x9E, 0xFE, 0x5D, 0xEB, 0xC8, 0x05, + 0xAE, 0xE5, 0x9B, 0x01, 0x2B, 0xDA, 0x78, 0xF4, 0x2E, 0xD9, 0xD3, 0xE8, + 0x53, 0xDE, 0xBE, 0xE0, 0xBA, 0xE3, 0xBD, 0xDF, 0xD6, 0xEB, 0x95, 0xE8, + 0x7A, 0xF2, 0x13, 0xF1, 0x52, 0xF3, 0x23, 0xF1, 0x92, 0xF2, 0x9C, 0xED, + 0x0F, 0xEB, 0xD4, 0xF1, 0xC0, 0xDF, 0xF4, 0xF4, 0x55, 0xE0, 0xA0, 0xF5, + 0x55, 0xE9, 0x21, 0xF3, 0x6E, 0xFA, 0xBD, 0xEB, 0x1E, 0x10, 0x79, 0xF0, + 0xE0, 0x11, 0xB7, 0xF8, 0xBF, 0x0B, 0x4F, 0x01, 0x8B, 0x15, 0x55, 0x0F, + 0x98, 0x1E, 0xF5, 0x15, 0x4B, 0x21, 0x26, 0x19, 0x16, 0x2A, 0x3C, 0x21, + 0x44, 0x32, 0x20, 0x28, 0x19, 0x34, 0xD2, 0x2A, 0xF7, 0x36, 0x3E, 0x30, + 0xCE, 0x32, 0x0E, 0x3D, 0x55, 0x2B, 0x13, 0x47, 0x02, 0x33, 0x3F, 0x44, + 0x16, 0x40, 0x76, 0x3C, 0x11, 0x47, 0x1D, 0x3E, 0xEE, 0x49, 0x27, 0x4A, + 0xF5, 0x47, 0x0A, 0x56, 0x4C, 0x44, 0x7C, 0x57, 0x78, 0x41, 0x03, 0x49, + 0x3A, 0x3E, 0x1A, 0x38, 0xA0, 0x3A, 0xAF, 0x32, 0xC3, 0x37, 0x32, 0x32, + 0x59, 0x38, 0x9E, 0x2D, 0x1F, 0x3A, 0xFF, 0x20, 0x3A, 0x3E, 0x7C, 0x17, + 0xC8, 0x40, 0x32, 0x18, 0xDE, 0x33, 0xD1, 0x1C, 0xE3, 0x25, 0x24, 0x22, + 0x66, 0x29, 0xCF, 0x23, 0x82, 0x32, 0xD3, 0x23, 0xAC, 0x39, 0xA0, 0x22, + 0xCA, 0x38, 0xDE, 0x1E, 0x87, 0x28, 0x13, 0x1D, 0x20, 0x10, 0x4E, 0x18, + 0xE9, 0xFF, 0xF2, 0x11, 0xFE, 0xF9, 0xB0, 0x13, 0x95, 0xF3, 0xF9, 0x11, + 0xB4, 0xF1, 0x0C, 0x0A, 0xC7, 0xF0, 0xDF, 0x05, 0x1F, 0xE8, 0xD8, 0xFD, + 0x5B, 0xDE, 0xDC, 0xF6, 0xD7, 0xD6, 0xB0, 0xF6, 0xFC, 0xD7, 0xCA, 0xED, + 0x06, 0xDF, 0x31, 0xDD, 0xD1, 0xE0, 0xD1, 0xD6, 0x7C, 0xDB, 0x0F, 0xD8, + 0x61, 0xCB, 0x56, 0xD5, 0x4D, 0xBD, 0xE5, 0xD1, 0x7D, 0xC2, 0x4D, 0xCB, + 0xF5, 0xCD, 0xB7, 0xBE, 0xB3, 0xCD, 0x2D, 0xBB, 0x9A, 0xC3, 0xD9, 0xBE, + 0x2B, 0xBC, 0x96, 0xB6, 0xEE, 0xBA, 0x29, 0xA5, 0x0E, 0xBB, 0xEA, 0xA2, + 0x49, 0xBA, 0x20, 0xB6, 0xCF, 0xBA, 0x62, 0xC7, 0x09, 0xBE, 0xBB, 0xCE, + 0x6D, 0xBE, 0xD0, 0xCE, 0x4F, 0xC0, 0x6C, 0xC8, 0xDF, 0xC4, 0x96, 0xBE, + 0x83, 0xC3, 0x19, 0xB8, 0xCE, 0xBB, 0x4D, 0xBD, 0xDC, 0xB0, 0x4E, 0xC5, + 0x8A, 0xAB, 0x86, 0xC3, 0xC6, 0xB0, 0x88, 0xC1, 0x5D, 0xB8, 0x65, 0xC9, + 0x0B, 0xC0, 0x46, 0xCA, 0xB2, 0xC9, 0xCC, 0xC1, 0xF1, 0xD2, 0xE0, 0xBC, + 0xAB, 0xE1, 0x0E, 0xC3, 0xA8, 0xE6, 0xBF, 0xD1, 0x70, 0xD7, 0x44, 0xDB, + 0x24, 0xCC, 0xED, 0xDA, 0xC0, 0xD6, 0x43, 0xDB, 0x50, 0xE7, 0x53, 0xDF, + 0xEE, 0xF2, 0xC2, 0xE0, 0x4A, 0xFF, 0x7C, 0xE4, 0x13, 0x08, 0x6D, 0xE7, + 0xE4, 0x0E, 0xB3, 0xE4, 0x89, 0x18, 0x9A, 0xF5, 0xCC, 0x14, 0x50, 0x0C, + 0xFC, 0x0D, 0x97, 0x10, 0xBA, 0x21, 0xBD, 0x19, 0xAA, 0x33, 0xD1, 0x22, + 0x08, 0x30, 0x67, 0x28, 0x63, 0x2A, 0xAB, 0x35, 0xA9, 0x23, 0x03, 0x3A, + 0xCF, 0x1C, 0xEE, 0x2B, 0xA6, 0x23, 0xA0, 0x1F, 0x80, 0x31, 0x6C, 0x2A, + 0x23, 0x34, 0xF3, 0x3E, 0x02, 0x27, 0x4E, 0x42, 0x30, 0x1D, 0x27, 0x3E, + 0x52, 0x22, 0x98, 0x3C, 0x18, 0x2B, 0xF7, 0x3A, 0xA1, 0x2D, 0xBA, 0x3F, + 0xED, 0x2A, 0x2A, 0x49, 0xBF, 0x2A, 0x48, 0x49, 0x84, 0x2C, 0xF1, 0x3D, + 0xEF, 0x32, 0xD0, 0x3D, 0xCC, 0x35, 0x6C, 0x44, 0xEB, 0x24, 0xD2, 0x3C, + 0x5F, 0x14, 0xCD, 0x32, 0x13, 0x12, 0xCD, 0x2C, 0xA2, 0x12, 0xC9, 0x22, + 0x1C, 0x1D, 0xDA, 0x1B, 0x99, 0x2A, 0x2B, 0x18, 0x31, 0x2F, 0xD3, 0x16, + 0x65, 0x2B, 0x97, 0x1A, 0xB6, 0x1F, 0xE8, 0x1C, 0xC9, 0x19, 0xB8, 0x1B, + 0xA7, 0x17, 0xAC, 0x0F, 0x7B, 0x1A, 0x08, 0x00, 0xD7, 0x28, 0xAD, 0xFC, + 0x2F, 0x2B, 0xBB, 0xFE, 0xE5, 0x18, 0xFD, 0x01, 0xBE, 0x03, 0x38, 0xFF, + 0xDC, 0xFB, 0xBF, 0xF6, 0x86, 0x03, 0xA9, 0xF0, 0x0E, 0x0B, 0x46, 0xE2, + 0x5D, 0x0D, 0xDA, 0xDB, 0xDE, 0x05, 0x02, 0xE5, 0x50, 0xF6, 0x8B, 0xE7, + 0x86, 0xEA, 0xD3, 0xE6, 0x8D, 0xE1, 0x43, 0xE5, 0xCD, 0xE2, 0x9D, 0xE4, + 0xA1, 0xE9, 0x9C, 0xE8, 0x6A, 0xEB, 0xE7, 0xEB, 0xA6, 0xE8, 0x47, 0xEF, + 0xD0, 0xE0, 0x04, 0xF8, 0x2C, 0xD3, 0xB4, 0xF8, 0x75, 0xC8, 0x1D, 0xF2, + 0xA1, 0xCA, 0xEA, 0xF1, 0x15, 0xD1, 0xBE, 0xED, 0x91, 0xD4, 0xD7, 0xEC, + 0xA9, 0xDE, 0x6C, 0xF9, 0x9D, 0xF0, 0x9D, 0x05, 0x33, 0x00, 0x99, 0x0D, + 0xB6, 0x02, 0x83, 0x0F, 0x68, 0xFC, 0x68, 0x0C, 0xAA, 0xF7, 0x90, 0x0C, + 0xE6, 0xF9, 0x47, 0x10, 0x09, 0x06, 0xF7, 0x0F, 0x37, 0x14, 0x02, 0x0D, + 0x6C, 0x23, 0xF8, 0x0C, 0x95, 0x2C, 0xCD, 0x0F, 0xAD, 0x2B, 0xE5, 0x1F, + 0x14, 0x2B, 0x6C, 0x2F, 0xDA, 0x24, 0xEC, 0x21, 0x20, 0x1C, 0x61, 0x06, + 0x5F, 0x1E, 0x58, 0xFD, 0x3F, 0x24, 0x67, 0x06, 0x95, 0x25, 0x14, 0x0D, + 0xD0, 0x26, 0x7D, 0x11, 0xFF, 0x23, 0x6A, 0x15, 0xAF, 0x23, 0x66, 0x1A, + 0x90, 0x30, 0xF7, 0x27, 0x06, 0x34, 0xEF, 0x2A, 0xE5, 0x2E, 0x47, 0x1D, + 0xA2, 0x31, 0x5A, 0x15, 0x8B, 0x2E, 0x77, 0x16, 0x8B, 0x27, 0x69, 0x19, + 0x50, 0x1D, 0x03, 0x15, 0xC2, 0x09, 0x65, 0x08, 0x0D, 0x04, 0xE5, 0x09, + 0xFA, 0x0B, 0x27, 0x1A, 0x28, 0x0A, 0xB2, 0x24, 0x08, 0x04, 0xB1, 0x21, + 0x51, 0x03, 0x37, 0x16, 0x15, 0x01, 0x0B, 0x0B, 0x22, 0x04, 0xE5, 0x0D, + 0x89, 0x09, 0x3E, 0x18, 0x18, 0x00, 0x65, 0x0F, 0xEE, 0xF0, 0x3C, 0xFA, + 0x8D, 0xEA, 0x13, 0xEE, 0xDE, 0xEE, 0xD9, 0xED, 0x99, 0xEF, 0x25, 0xEB, + 0x43, 0xF0, 0x98, 0xEB, 0xF3, 0xEB, 0x8C, 0xEC, 0xA4, 0xE2, 0x4C, 0xE6, + 0xB4, 0xEB, 0x4A, 0xED, 0x9A, 0xF4, 0x22, 0xF9, 0x21, 0xFA, 0xA2, 0x00, + 0x42, 0xFF, 0xCE, 0x01, 0xB8, 0xF4, 0x93, 0xFA, 0xE3, 0xE8, 0xAA, 0xF6, + 0x41, 0xDF, 0x55, 0xED, 0x90, 0xD2, 0xBB, 0xE0, 0x4B, 0xCC, 0x71, 0xDF, + 0x6A, 0xD5, 0x62, 0xE9, 0x7F, 0xDD, 0xE7, 0xED, 0xAA, 0xD9, 0xA3, 0xE6, + 0x72, 0xD7, 0x20, 0xE4, 0x90, 0xCF, 0x38, 0xDF, 0x1F, 0xCB, 0xE4, 0xD2, + 0xED, 0xD0, 0xB6, 0xC8, 0x10, 0xDC, 0x46, 0xCC, 0xC1, 0xEA, 0x44, 0xD3, + 0x83, 0xE7, 0x70, 0xCC, 0x28, 0xD6, 0xFB, 0xC9, 0x9D, 0xCE, 0xD4, 0xD0, + 0xB9, 0xCF, 0xEA, 0xC9, 0x1F, 0xD2, 0x5C, 0xB6, 0x84, 0xD8, 0xB6, 0xAC, + 0xB8, 0xDE, 0xB1, 0xAD, 0x13, 0xE2, 0x85, 0xB6, 0xC0, 0xDE, 0xA0, 0xC4, + 0x03, 0xCF, 0xF9, 0xCB, 0x50, 0xC4, 0xD5, 0xCE, 0x1D, 0xD1, 0x14, 0xD6, + 0xEF, 0xE5, 0xE3, 0xDC, 0x80, 0xF3, 0x28, 0xE0, 0x06, 0x02, 0xC0, 0xEB, + 0xC3, 0x0A, 0x2C, 0xF6, 0x77, 0x0A, 0xB9, 0xFE, 0x4B, 0x04, 0x10, 0x07, + 0x87, 0x04, 0x4B, 0x0D, 0x9B, 0x0E, 0xA7, 0x1D, 0xFB, 0x08, 0x36, 0x2B, + 0xD5, 0x01, 0x03, 0x30, 0x7F, 0x0A, 0x11, 0x31, 0xD5, 0x15, 0xA8, 0x31, + 0x30, 0x1F, 0x32, 0x2E, 0x3C, 0x23, 0x6E, 0x29, 0x95, 0x23, 0x2D, 0x34, + 0x3A, 0x20, 0xA9, 0x35, 0x47, 0x22, 0x1D, 0x2C, 0x22, 0x2C, 0xA6, 0x2C, + 0x80, 0x2D, 0x44, 0x2B, 0xEF, 0x24, 0x6B, 0x25, 0xD7, 0x17, 0x5E, 0x21, + 0xA3, 0x15, 0x69, 0x1F, 0x12, 0x22, 0x3A, 0x17, 0xEF, 0x2F, 0x91, 0x11, + 0x61, 0x37, 0xFB, 0x11, 0x21, 0x3B, 0xB8, 0x1B, 0x95, 0x39, 0x24, 0x30, + 0xCB, 0x2B, 0x31, 0x3A, 0x26, 0x1B, 0x3B, 0x35, 0xA5, 0x0E, 0x9C, 0x1F, + 0x1E, 0x09, 0xFE, 0x07, 0x88, 0x0C, 0xBF, 0x07, 0x8F, 0x07, 0x18, 0x0E, + 0x28, 0xF9, 0x2C, 0x09, 0xBC, 0xF2, 0xFC, 0x05, 0x10, 0xF9, 0xFF, 0x0C, + 0x1D, 0x04, 0x94, 0x0D, 0xEF, 0x0D, 0xB9, 0x0A, 0xA7, 0x0A, 0xA0, 0x08, + 0x0C, 0xFB, 0xAF, 0xFB, 0x6E, 0xF6, 0xB6, 0xF2, 0xF9, 0xF8, 0x23, 0xF2, + 0xB7, 0xFD, 0x38, 0xF2, 0x23, 0xFF, 0x12, 0xEF, 0xBF, 0xED, 0x04, 0xE5, + 0xA9, 0xDB, 0xFB, 0xE3, 0x10, 0xE5, 0xCE, 0xF6, 0xC7, 0xF6, 0x9F, 0xFF, + 0xD1, 0xFF, 0x19, 0xF9, 0x10, 0xFD, 0x2B, 0xF1, 0x4B, 0xEB, 0xDE, 0xE2, + 0x40, 0xEB, 0x69, 0xDD, 0x81, 0xF9, 0x58, 0xE4, 0xF7, 0xF3, 0x9A, 0xE6, + 0xA7, 0xE9, 0xA6, 0xE4, 0x53, 0xE9, 0x4C, 0xE6, 0xA7, 0xE9, 0xBE, 0xEE, + 0x9A, 0xE9, 0x50, 0xFA, 0x52, 0xF0, 0x10, 0x03, 0xC0, 0xEA, 0x47, 0xFD, + 0xBD, 0xE2, 0x7A, 0xF4, 0xE5, 0xEF, 0xE9, 0xF0, 0x60, 0xFA, 0xC3, 0xE7, + 0x3B, 0xFC, 0x65, 0xE7, 0x00, 0xFA, 0x3B, 0xEB, 0x42, 0xFF, 0x7C, 0xF0, + 0x0C, 0x0F, 0x8B, 0xFC, 0x45, 0x16, 0x5F, 0x00, 0x68, 0x10, 0xE8, 0xFF, + 0x25, 0x01, 0x9D, 0xFD, 0x78, 0xFF, 0xEC, 0xFF, 0xB0, 0x0C, 0x2F, 0x0C, + 0x7D, 0x19, 0x97, 0x1A, 0x39, 0x1A, 0x7D, 0x1D, 0xC4, 0x08, 0xEF, 0x11, + 0xB2, 0x07, 0xB3, 0x17, 0x91, 0x16, 0xF7, 0x1D, 0xA7, 0x22, 0x61, 0x1C, + 0xC2, 0x2C, 0x51, 0x2D, 0xAD, 0x2E, 0x5E, 0x37, 0x39, 0x2C, 0x41, 0x31, + 0xD4, 0x2B, 0xDF, 0x30, 0x98, 0x2C, 0xC3, 0x38, 0xAA, 0x24, 0x2F, 0x3A, + 0xD2, 0x11, 0x32, 0x30, 0x02, 0x10, 0xF8, 0x2E, 0x30, 0x24, 0x22, 0x35, + 0x0A, 0x2C, 0x69, 0x2D, 0x03, 0x27, 0xF9, 0x20, 0x97, 0x24, 0x6A, 0x1D, + 0xF1, 0x24, 0xE1, 0x1E, 0x20, 0x2C, 0x9B, 0x1E, 0xE6, 0x33, 0x2D, 0x1A, + 0xB4, 0x2B, 0x14, 0x10, 0x16, 0x1C, 0x22, 0x05, 0xB3, 0x19, 0x75, 0x03, + 0xE1, 0x1D, 0xEA, 0x08, 0x25, 0x15, 0x8F, 0x0A, 0xC0, 0x02, 0x9E, 0x0B, + 0x6F, 0xF9, 0x43, 0x0F, 0x13, 0xFA, 0x4B, 0x09, 0x0F, 0x02, 0x51, 0x00, + 0x22, 0x09, 0x55, 0xFF, 0x27, 0x03, 0xC5, 0xFD, 0xB5, 0xFC, 0x2E, 0xFD, + 0x62, 0xF4, 0x45, 0xFB, 0xC7, 0xE0, 0xD2, 0xEB, 0x7C, 0xDF, 0x72, 0xE7, + 0xCC, 0xEC, 0x70, 0xF4, 0x51, 0xE5, 0x52, 0xF8, 0xFA, 0xD9, 0x93, 0xF8, + 0xE4, 0xDB, 0x2C, 0xF4, 0xCD, 0xDA, 0x89, 0xE8, 0x00, 0xDA, 0xA5, 0xE8, + 0x34, 0xD7, 0x37, 0xE6, 0xDE, 0xCD, 0x49, 0xDA, 0x0B, 0xCE, 0x06, 0xD8, + 0x03, 0xDC, 0x52, 0xDF, 0x86, 0xE4, 0x9B, 0xDC, 0x49, 0xDB, 0xD8, 0xCF, + 0x96, 0xCE, 0xE5, 0xCB, 0xC9, 0xCF, 0xE9, 0xCB, 0x6C, 0xD6, 0xBB, 0xC5, + 0x06, 0xD4, 0x00, 0xC3, 0xF2, 0xCD, 0x93, 0xC8, 0x8B, 0xCD, 0x0B, 0xCB, + 0x3D, 0xCE, 0x82, 0xC7, 0x28, 0xC7, 0xAE, 0xC5, 0xE0, 0xC1, 0x19, 0xC0, + 0x50, 0xC3, 0x8E, 0xB5, 0x4E, 0xCA, 0x16, 0xB4, 0x1C, 0xD9, 0x6A, 0xB9, + 0x96, 0xE5, 0xB9, 0xBD, 0x2E, 0xE6, 0xC4, 0xC6, 0x1F, 0xE0, 0xF0, 0xDA, + 0xE9, 0xDA, 0x2F, 0xEB, 0xCE, 0xD6, 0x7B, 0xE4, 0x5B, 0xDE, 0x26, 0xDC, + 0x1A, 0xED, 0x93, 0xDF, 0x49, 0xEE, 0x5A, 0xE1, 0x73, 0xE4, 0xCE, 0xDA, + 0x53, 0xE6, 0x21, 0xDD, 0x76, 0xF3, 0xB1, 0xEC, 0xA7, 0xFA, 0x90, 0xF2, + 0xDD, 0x01, 0x26, 0xF6, 0x83, 0x08, 0xC4, 0xFB, 0x13, 0x0A, 0x30, 0xFB, + 0x35, 0x0F, 0x4A, 0x03, 0x2E, 0x0F, 0x96, 0x11, 0xD4, 0x04, 0xD2, 0x15, + 0x4B, 0x09, 0xF3, 0x13, 0x92, 0x16, 0x79, 0x10, 0x04, 0x14, 0x94, 0x0B, + 0x5B, 0x0A, 0x3E, 0x0A, 0xD6, 0x04, 0x8B, 0x10, 0x5D, 0x09, 0xCC, 0x1A, + 0xA5, 0x12, 0xFF, 0x22, 0x43, 0x16, 0x33, 0x27, 0xCC, 0x16, 0x75, 0x2B, + 0x25, 0x14, 0x1A, 0x2F, 0x8C, 0x12, 0x94, 0x30, 0x24, 0x1D, 0x48, 0x3E, + 0xB3, 0x25, 0xFE, 0x48, 0xF4, 0x1E, 0x21, 0x44, 0xC2, 0x1A, 0x36, 0x41, + 0x67, 0x1B, 0x47, 0x38, 0xA9, 0x16, 0xE6, 0x28, 0x4D, 0x12, 0xF6, 0x20, + 0x33, 0x13, 0x10, 0x23, 0x35, 0x14, 0x5A, 0x25, 0x1B, 0x13, 0xCB, 0x1F, + 0x6E, 0x17, 0x1A, 0x18, 0xEB, 0x27, 0x9C, 0x1C, 0x4B, 0x32, 0x2E, 0x26, + 0xD7, 0x29, 0x98, 0x1B, 0xD4, 0x23, 0x78, 0x06, 0xF5, 0x26, 0x5C, 0xFF, + 0xF2, 0x2B, 0xDC, 0x0A, 0xD0, 0x2B, 0xA2, 0x17, 0x1E, 0x24, 0x8B, 0x15, + 0x74, 0x23, 0xF5, 0x0C, 0x75, 0x27, 0xA6, 0x04, 0x79, 0x22, 0x0E, 0xFE, + 0xA4, 0x15, 0x83, 0xFE, 0xB3, 0x03, 0xF3, 0xF9, 0x44, 0xFD, 0x89, 0xF3, + 0x99, 0x08, 0x22, 0xFC, 0x61, 0x14, 0xA4, 0x07, 0xF9, 0x17, 0x12, 0x0F, + 0xAF, 0x15, 0xC9, 0x13, 0x87, 0x0C, 0x8A, 0x12, 0x0A, 0xFF, 0xBB, 0x0C, + 0x13, 0xFB, 0x1C, 0x09, 0x1E, 0xFD, 0x01, 0x0E, 0x66, 0xF8, 0xB3, 0x0E, + 0x38, 0xF2, 0xB7, 0x05, 0x6A, 0xF2, 0x08, 0xFF, 0xD2, 0xF1, 0xE6, 0x00, + 0x91, 0xE6, 0x7A, 0x02, 0xF2, 0xE5, 0x63, 0x08, 0x93, 0xF1, 0x83, 0x13, + 0x59, 0xFB, 0xEE, 0x14, 0x88, 0x07, 0xEF, 0x13, 0xF1, 0x08, 0xC6, 0x0E, + 0x79, 0x05, 0x9A, 0x07, 0x10, 0x03, 0x3A, 0x02, 0xCE, 0x01, 0x52, 0x00, + 0x17, 0x10, 0xC5, 0x0B, 0x05, 0x22, 0x27, 0x15, 0xA7, 0x22, 0xC1, 0x11, + 0x58, 0x1D, 0x56, 0x10, 0x98, 0x1D, 0xAE, 0x12, 0x01, 0x1B, 0x9D, 0x12, + 0x3D, 0x17, 0xBF, 0x0F, 0xFF, 0x16, 0xAF, 0x07, 0xB4, 0x1D, 0x8F, 0x06, + 0x99, 0x2A, 0x93, 0x0E, 0xB6, 0x2C, 0xB4, 0x0E, 0x99, 0x20, 0xF3, 0x0D, + 0x42, 0x15, 0x59, 0x14, 0xE4, 0x12, 0x97, 0x13, 0xA3, 0x18, 0xCF, 0x0A, + 0x2A, 0x1D, 0x20, 0x06, 0x68, 0x18, 0x13, 0x06, 0xE8, 0x0D, 0xC7, 0x03, + 0x83, 0x06, 0x8B, 0xFD, 0xC5, 0x05, 0xC2, 0xF7, 0x60, 0x02, 0x09, 0xF7, + 0x48, 0xF8, 0xA0, 0xFA, 0xD8, 0xEF, 0xC5, 0x00, 0xDA, 0xF2, 0x55, 0x06, + 0xDC, 0xFB, 0x54, 0x03, 0x94, 0x00, 0x58, 0xFF, 0x9D, 0xFE, 0x5C, 0x02, + 0xAA, 0xF6, 0x0A, 0x04, 0x6A, 0xED, 0x2C, 0x01, 0xE0, 0xE2, 0x03, 0x00, + 0xF4, 0xDC, 0xD9, 0x02, 0xAA, 0xE0, 0xF7, 0x03, 0xB5, 0xE1, 0xEE, 0xFE, + 0xE9, 0xD9, 0x48, 0xF0, 0xE7, 0xDA, 0x98, 0xE0, 0xB3, 0xE2, 0xF7, 0xDB, + 0x02, 0xDC, 0x82, 0xE0, 0xDB, 0xD2, 0xF4, 0xE0, 0x94, 0xD8, 0x54, 0xD5, + 0x7B, 0xEC, 0xD2, 0xCE, 0xDB, 0xF5, 0x76, 0xD2, 0xF7, 0xE8, 0xFB, 0xD6, + 0xCB, 0xE1, 0x2A, 0xE0, 0x04, 0xE0, 0x11, 0xDF, 0x6B, 0xDE, 0xD6, 0xD5, + 0x09, 0xE5, 0x1B, 0xDA, 0x64, 0xE5, 0x37, 0xE2, 0x83, 0xDA, 0x4E, 0xE7, + 0x45, 0xD5, 0x0D, 0xE8, 0xD4, 0xD9, 0x63, 0xDC, 0x2F, 0xDD, 0x8E, 0xD0, + 0xDE, 0xD9, 0x27, 0xD2, 0xD5, 0xD1, 0x8C, 0xD4, 0xA9, 0xCA, 0x21, 0xD1, + 0xB5, 0xC7, 0x15, 0xD8, 0x8F, 0xD0, 0x9F, 0xE8, 0xEB, 0xDD, 0x42, 0xEA, + 0x4D, 0xE4, 0x2C, 0xDF, 0x5F, 0xEA, 0x5A, 0xD8, 0xC1, 0xEA, 0x59, 0xD5, + 0xDC, 0xDF, 0xA6, 0xD5, 0x28, 0xD3, 0x03, 0xD8, 0x28, 0xD1, 0x38, 0xD6, + 0xFD, 0xD8, 0x79, 0xD1, 0x40, 0xE1, 0x3C, 0xCC, 0x93, 0xEA, 0xA6, 0xCC, + 0x4A, 0xEF, 0x8B, 0xDA, 0xA3, 0xE9, 0x6F, 0xE2, 0x46, 0xF4, 0x43, 0xE3, + 0x14, 0x11, 0xB6, 0xF0, 0xD6, 0x1A, 0xDC, 0xFE, 0x09, 0x17, 0x71, 0x09, + 0x5F, 0x16, 0x31, 0x16, 0xEA, 0x0D, 0xE3, 0x1B, 0x0B, 0x09, 0x38, 0x18, + 0xFB, 0x0F, 0x1C, 0x14, 0x3B, 0x11, 0x48, 0x18, 0xED, 0x08, 0x29, 0x1E, + 0xB3, 0x05, 0xE1, 0x1D, 0x3F, 0x0C, 0xDE, 0x1F, 0xCD, 0x15, 0xBF, 0x27, + 0x8D, 0x1C, 0xB8, 0x2A, 0x6E, 0x19, 0x41, 0x2B, 0x98, 0x10, 0x58, 0x2D, + 0x36, 0x09, 0x81, 0x26, 0xE7, 0x04, 0x2D, 0x1D, 0xEB, 0x05, 0xFB, 0x1A, + 0x78, 0x06, 0x73, 0x19, 0x46, 0x0A, 0xAC, 0x14, 0xB4, 0x15, 0x7F, 0x0E, + 0xB8, 0x1E, 0x3F, 0x08, 0x53, 0x1E, 0x43, 0x08, 0x89, 0x17, 0xD3, 0x10, + 0xDE, 0x15, 0x64, 0x14, 0x2D, 0x1B, 0xC1, 0x0E, 0x82, 0x1A, 0x61, 0x03, + 0xD7, 0x0C, 0x22, 0xF6, 0x20, 0xFF, 0xA2, 0xF5, 0x3D, 0xF9, 0x50, 0xFA, + 0xB7, 0xF7, 0x4E, 0xF5, 0xD2, 0xFE, 0x3C, 0xF2, 0x8E, 0x04, 0xA4, 0xF7, + 0xD0, 0xFE, 0x27, 0xFA, 0x83, 0xF2, 0x3E, 0xF6, 0xFE, 0xE7, 0xFC, 0xF4, + 0x5D, 0xE7, 0xA2, 0xF3, 0x28, 0xEA, 0xE2, 0xF4, 0x56, 0xE9, 0xE7, 0xF8, + 0x4B, 0xEB, 0x67, 0xF6, 0xEC, 0xEF, 0x9A, 0xEF, 0xCD, 0xEF, 0x24, 0xED, + 0xB2, 0xF0, 0x5D, 0xF6, 0x7F, 0xF4, 0xB5, 0x04, 0x60, 0xEE, 0x9E, 0x03, + 0xA0, 0xE6, 0x86, 0xF1, 0x57, 0xEC, 0x84, 0xE7, 0x25, 0xF8, 0xB0, 0xEA, + 0xD8, 0xF9, 0x51, 0xEA, 0xD1, 0xF8, 0x84, 0xE8, 0x87, 0xFC, 0xB4, 0xE2, + 0xD9, 0xFD, 0x6D, 0xDB, 0x1D, 0xF6, 0x0A, 0xE2, 0xAC, 0xEF, 0xE0, 0xF1, + 0xD5, 0xF5, 0xE5, 0xF6, 0x07, 0xFA, 0x9A, 0xF2, 0x63, 0xF7, 0x3E, 0xF1, + 0xE8, 0xF7, 0x37, 0xF0, 0xD6, 0xF9, 0xC5, 0xED, 0x18, 0xF8, 0x9A, 0xF0, + 0x7B, 0xF9, 0x38, 0xFB, 0xB5, 0x02, 0xB5, 0x01, 0x02, 0x0D, 0x1B, 0x04, + 0x85, 0x14, 0x3C, 0x08, 0x46, 0x18, 0x10, 0x0D, 0xA7, 0x1A, 0xC9, 0x12, + 0xE1, 0x1C, 0xAE, 0x19, 0x08, 0x13, 0x73, 0x23, 0x8C, 0x0A, 0x66, 0x2D, + 0xF0, 0x0E, 0xD8, 0x2E, 0xBE, 0x18, 0x52, 0x2D, 0x6F, 0x21, 0x5A, 0x2D, + 0xF3, 0x1C, 0x9E, 0x24, 0x94, 0x1B, 0xBD, 0x1E, 0x34, 0x22, 0xF4, 0x26, + 0x95, 0x1E, 0xF7, 0x2D, 0x9C, 0x1B, 0xF7, 0x2E, 0xA3, 0x29, 0x69, 0x35, + 0x02, 0x3A, 0x6A, 0x3B, 0xDA, 0x40, 0xE2, 0x39, 0xBF, 0x3D, 0xB5, 0x32, + 0x0B, 0x31, 0x7A, 0x2B, 0x8C, 0x28, 0x12, 0x2B, 0xB1, 0x28, 0xF3, 0x26, + 0x7A, 0x2C, 0x01, 0x1F, 0x9F, 0x2F, 0x54, 0x1D, 0x79, 0x2F, 0xA4, 0x20, + 0x21, 0x28, 0x1D, 0x1E, 0x41, 0x21, 0x01, 0x16, 0xCA, 0x24, 0xD3, 0x14, + 0xB7, 0x2A, 0x9C, 0x16, 0x0B, 0x26, 0x07, 0x0D, 0x2D, 0x19, 0x9E, 0x04, + 0x17, 0x11, 0xA4, 0x0C, 0x8A, 0x0B, 0x89, 0x11, 0xE4, 0x06, 0xDB, 0x0C, + 0x9B, 0x01, 0xC0, 0x08, 0x62, 0xFE, 0xCC, 0x03, 0x6B, 0x01, 0xC6, 0x03, + 0x49, 0xFF, 0x6E, 0x07, 0xE2, 0xFC, 0xA8, 0x05, 0x78, 0xFC, 0x1F, 0xFD, + 0xE9, 0xF9, 0x01, 0xF0, 0x14, 0xF8, 0xA4, 0xE9, 0xB7, 0xF2, 0xF2, 0xEE, + 0x66, 0xE3, 0x96, 0xF3, 0xC4, 0xD8, 0x48, 0xF4, 0xE1, 0xDC, 0x7D, 0xF1, + 0xCE, 0xE1, 0xBF, 0xEB, 0x54, 0xE4, 0x5B, 0xE7, 0xE6, 0xE2, 0xD7, 0xE6, + 0x1E, 0xDA, 0x1F, 0xE6, 0x7D, 0xD0, 0x7F, 0xE8, 0xC9, 0xCA, 0x95, 0xF0, + 0x6B, 0xCD, 0xE5, 0xF2, 0x5D, 0xD5, 0xFB, 0xEB, 0x9F, 0xDC, 0x85, 0xE1, + 0x32, 0xE0, 0x1D, 0xDB, 0x1F, 0xDB, 0x3C, 0xD8, 0xF7, 0xD5, 0x6C, 0xD8, + 0xF6, 0xD4, 0x96, 0xD9, 0x04, 0xCE, 0x66, 0xCD, 0x03, 0xC7, 0xCA, 0xC2, + 0x5E, 0xC6, 0x88, 0xC7, 0x58, 0xC7, 0x3C, 0xC6, 0xA5, 0xC7, 0xD4, 0xBA, + 0x42, 0xC2, 0x72, 0xAE, 0x32, 0xC0, 0x2B, 0xA7, 0xC2, 0xC9, 0x67, 0xA9, + 0xE4, 0xCF, 0x19, 0xB3, 0x8E, 0xCE, 0xB3, 0xBD, 0x2B, 0xD2, 0xD2, 0xC8, + 0xE3, 0xD9, 0x0E, 0xD2, 0x82, 0xDD, 0x94, 0xCF, 0x1D, 0xDE, 0xD3, 0xCC, + 0x84, 0xD9, 0xB6, 0xD2, 0x0C, 0xD3, 0x80, 0xD9, 0xB5, 0xD5, 0xE9, 0xDD, + 0x27, 0xE4, 0x39, 0xE2, 0x5B, 0xF6, 0x3F, 0xE6, 0x82, 0x02, 0x4B, 0xE8, + 0x71, 0x04, 0xDA, 0xF1, 0x29, 0x00, 0xFE, 0x04, 0x34, 0x04, 0x58, 0x12, + 0xE3, 0x0C, 0x04, 0x1A, 0x3C, 0x0D, 0x40, 0x1B, 0x68, 0x0F, 0xFA, 0x11, + 0x3C, 0x15, 0xD7, 0x0C, 0xC7, 0x16, 0x13, 0x0F, 0x35, 0x17, 0x6E, 0x12, + 0x5F, 0x12, 0xCD, 0x16, 0xD6, 0x05, 0x03, 0x1B, 0x56, 0x02, 0xFE, 0x1F, + 0xBC, 0x0F, 0x70, 0x23, 0x4C, 0x21, 0xA9, 0x21, 0xB7, 0x2E, 0xDC, 0x24, + 0x10, 0x31, 0xA9, 0x2D, 0x6A, 0x2A, 0x3C, 0x32, 0x50, 0x28, 0x70, 0x33, + 0xBC, 0x2C, 0xBD, 0x36, 0x18, 0x2D, 0xC6, 0x39, 0x67, 0x2B, 0xEB, 0x36, + 0xE9, 0x2B, 0xB9, 0x2F, 0x37, 0x26, 0x7E, 0x2B, 0x5E, 0x1A, 0xB3, 0x2B, + 0x20, 0x10, 0xC0, 0x2B, 0xF6, 0x07, 0xAB, 0x29, 0x63, 0x04, 0xC2, 0x23, + 0xC1, 0x11, 0xBF, 0x1E, 0xAB, 0x23, 0x16, 0x1F, 0x84, 0x28, 0x0B, 0x21, + 0x6F, 0x26, 0x8F, 0x1F, 0x83, 0x1B, 0x86, 0x14, 0x59, 0x18, 0x30, 0x0D, + 0x7E, 0x23, 0xC7, 0x0C, 0x30, 0x27, 0xAF, 0x08, 0x33, 0x25, 0xF8, 0x07, + 0xFA, 0x24, 0xFB, 0x09, 0xD8, 0x26, 0x7A, 0x06, 0xA0, 0x26, 0x76, 0xFF, + 0x7F, 0x1E, 0x73, 0xFD, 0x72, 0x13, 0x6D, 0xFF, 0xA9, 0x09, 0xC0, 0xFE, + 0x7F, 0x09, 0xB6, 0x00, 0xCA, 0x11, 0x40, 0x04, 0x6F, 0x17, 0x3B, 0x02, + 0x4B, 0x19, 0x60, 0x01, 0x93, 0x13, 0xB4, 0x09, 0xE0, 0x05, 0x85, 0x16, + 0x3C, 0xFC, 0xDC, 0x21, 0x99, 0xFC, 0xC6, 0x25, 0x2E, 0xFE, 0x23, 0x1D, + 0xA1, 0x01, 0x0C, 0x14, 0x3D, 0x04, 0x1F, 0x16, 0xE9, 0xFF, 0xB9, 0x1C, + 0xDA, 0xFA, 0xB3, 0x20, 0x97, 0xF5, 0x7D, 0x1E, 0x1F, 0xF2, 0x14, 0x15, + 0x16, 0xF7, 0x31, 0x0D, 0xEA, 0x02, 0x49, 0x0C, 0xAE, 0x0A, 0x7B, 0x0C, + 0x72, 0x09, 0x22, 0x09, 0x59, 0x08, 0xF7, 0x04, 0x17, 0x0B, 0x05, 0xFD, + 0x42, 0x14, 0xA8, 0xF6, 0x25, 0x19, 0x0B, 0xF7, 0x90, 0x0D, 0x61, 0xFA, + 0xAF, 0x08, 0xA1, 0x05, 0x15, 0x13, 0x5A, 0x0F, 0xB7, 0x1B, 0x1B, 0x0F, + 0xE1, 0x20, 0x61, 0x0B, 0x10, 0x22, 0x85, 0x08, 0x8B, 0x1D, 0x55, 0x0C, + 0x58, 0x18, 0x15, 0x12, 0xF4, 0x18, 0xBC, 0x13, 0x80, 0x20, 0x7F, 0x17, + 0x8F, 0x24, 0x4F, 0x1D, 0xA4, 0x21, 0x3E, 0x20, 0xDE, 0x1D, 0x90, 0x22, + 0x1F, 0x1A, 0xC8, 0x24, 0xB3, 0x13, 0xA9, 0x24, 0x86, 0x0C, 0x85, 0x20, + 0xE5, 0x0C, 0x7E, 0x1B, 0xF1, 0x11, 0xF8, 0x16, 0x78, 0x12, 0x8B, 0x11, + 0xF6, 0x0C, 0x50, 0x0F, 0xCF, 0x02, 0x8E, 0x0B, 0xF3, 0xF9, 0x27, 0x04, + 0xDE, 0xF6, 0x0D, 0xFF, 0x38, 0xFB, 0x29, 0xFC, 0xF2, 0x03, 0xA1, 0x00, + 0x3F, 0x07, 0x43, 0x08, 0xAC, 0x06, 0x1F, 0x07, 0x8A, 0x04, 0xEA, 0x02, + 0x52, 0xFD, 0x0F, 0xFF, 0xF1, 0xF7, 0x74, 0xF7, 0xE0, 0xF4, 0x74, 0xF2, + 0xDE, 0xEF, 0xF7, 0xED, 0x5D, 0xED, 0xFC, 0xE3, 0x8E, 0xEA, 0x73, 0xE0, + 0x6A, 0xE3, 0x21, 0xE3, 0x28, 0xDE, 0x89, 0xE4, 0x62, 0xDA, 0xFE, 0xDF, + 0xD3, 0xD7, 0x30, 0xD7, 0xCF, 0xDC, 0xEA, 0xD6, 0xEF, 0xE1, 0xB2, 0xD8, + 0xE6, 0xDC, 0x9E, 0xD5, 0xCA, 0xD9, 0x10, 0xD6, 0x98, 0xDA, 0x24, 0xD8, + 0x64, 0xD6, 0x8A, 0xD7, 0xA9, 0xD2, 0x1B, 0xDA, 0xA1, 0xD1, 0xFF, 0xDD, + 0x8C, 0xD5, 0xD3, 0xD7, 0x94, 0xDF, 0x09, 0xCD, 0x7B, 0xE8, 0x25, 0xCC, + 0xC3, 0xE0, 0xEE, 0xCF, 0xF7, 0xCC, 0x9D, 0xCD, 0x54, 0xC3, 0xE0, 0xCE, + 0x55, 0xC6, 0xF0, 0xD7, 0xC4, 0xCF, 0x4F, 0xDC, 0xDC, 0xD9, 0xF5, 0xDD, + 0xF6, 0xDF, 0xFF, 0xDC, 0x8A, 0xE0, 0x39, 0xD3, 0x7C, 0xDF, 0xF8, 0xCB, + 0x0F, 0xDC, 0x2C, 0xD0, 0x50, 0xD4, 0xE8, 0xDB, 0xC7, 0xD1, 0xC5, 0xE2, + 0x68, 0xD5, 0x61, 0xDF, 0xF1, 0xDA, 0xE9, 0xDF, 0x04, 0xE4, 0xEA, 0xE9, + 0x50, 0xEB, 0x9E, 0xF1, 0xC4, 0xEB, 0x57, 0xF1, 0xDA, 0xE9, 0x1F, 0xEF, + 0x21, 0xEE, 0x16, 0xF3, 0x70, 0xF6, 0xF7, 0xF6, 0x36, 0xFE, 0xF0, 0xF6, + 0x04, 0x00, 0xAE, 0xF9, 0xC4, 0xFA, 0x90, 0xF8, 0x28, 0xF8, 0x28, 0xF3, + 0xD1, 0xFA, 0x98, 0xF7, 0xD1, 0xFB, 0xC6, 0xFD, 0x25, 0xFC, 0x7B, 0xFE, + 0xAB, 0x03, 0x5D, 0x05, 0x94, 0x0F, 0xB2, 0x0D, 0x4F, 0x1B, 0xA8, 0x0D, + 0xA9, 0x22, 0x0F, 0x0E, 0x51, 0x20, 0x8A, 0x14, 0xA1, 0x15, 0xC7, 0x1C, + 0x47, 0x0A, 0x99, 0x20, 0x4F, 0x08, 0xF6, 0x1D, 0x8D, 0x0A, 0xFB, 0x19, + 0x03, 0x08, 0xEB, 0x16, 0x14, 0x0A, 0x17, 0x15, 0xDF, 0x14, 0x28, 0x13, + 0xFE, 0x1C, 0xD5, 0x13, 0x26, 0x1B, 0xC8, 0x18, 0xFC, 0x15, 0x77, 0x20, + 0x99, 0x13, 0x1B, 0x27, 0xC0, 0x14, 0x7C, 0x27, 0x1F, 0x1B, 0x7E, 0x21, + 0x3F, 0x20, 0xBA, 0x19, 0xD9, 0x19, 0x0C, 0x16, 0x09, 0x0B, 0xFD, 0x0D, + 0x1F, 0x01, 0xF6, 0x02, 0xE2, 0xFE, 0x3A, 0xFE, 0x58, 0xFF, 0xFB, 0xFE, + 0xEE, 0x03, 0xFD, 0x02, 0x3A, 0x0C, 0xEB, 0x00, 0x3E, 0x10, 0x45, 0xFA, + 0xB0, 0x0C, 0xD7, 0xF8, 0x5E, 0x05, 0xBD, 0xFC, 0xB5, 0xFE, 0xC1, 0xFC, + 0x3B, 0xFE, 0xCB, 0xF2, 0xE7, 0x03, 0x6F, 0xEA, 0x60, 0x06, 0xFC, 0xEA, + 0x2E, 0x00, 0x12, 0xF1, 0x35, 0xF2, 0xF9, 0xF7, 0xFB, 0xE4, 0x3D, 0xFD, + 0x36, 0xE1, 0x23, 0xFA, 0x25, 0xE9, 0xF1, 0xF0, 0xBB, 0xF1, 0xFE, 0xEB, + 0x81, 0xF2, 0x18, 0xEB, 0x69, 0xF1, 0x73, 0xEB, 0x48, 0xF3, 0x6F, 0xE9, + 0x18, 0xFB, 0xE5, 0xEC, 0x8C, 0xFD, 0x51, 0xF6, 0x8F, 0xF6, 0xAC, 0xF7, + 0x4E, 0xF2, 0xDB, 0xF3, 0x23, 0xF6, 0xA8, 0xF5, 0xEB, 0xFD, 0x20, 0xFA, + 0xCE, 0x00, 0x0D, 0xF8, 0x13, 0xFE, 0x05, 0xF7, 0xCE, 0xF9, 0xE3, 0xF7, + 0x12, 0xF8, 0x8D, 0xF5, 0x85, 0xF7, 0x24, 0xFA, 0x7D, 0xF4, 0x17, 0x03, + 0xDC, 0xFA, 0x40, 0x07, 0x9E, 0x09, 0x93, 0x02, 0x62, 0x17, 0x70, 0xFF, + 0x8D, 0x22, 0xD9, 0x0D, 0x2A, 0x1F, 0x86, 0x25, 0xB2, 0x17, 0x30, 0x35, + 0x22, 0x1D, 0xD2, 0x38, 0x9B, 0x24, 0x11, 0x35, 0x37, 0x29, 0x8D, 0x32, + 0x5D, 0x27, 0x9D, 0x36, 0x80, 0x1A, 0x75, 0x3B, 0xE1, 0x12, 0x2D, 0x3F, + 0x57, 0x1C, 0xFD, 0x3D, 0xE7, 0x2E, 0x20, 0x3C, 0x6C, 0x3C, 0xBA, 0x43, + 0x6A, 0x41, 0x4B, 0x4B, 0x08, 0x44, 0xF5, 0x4E, 0xB1, 0x3C, 0x95, 0x4A, + 0x68, 0x38, 0x79, 0x43, 0xCE, 0x3C, 0x32, 0x3E, 0xAC, 0x3C, 0xCD, 0x36, + 0x98, 0x36, 0xF1, 0x32, 0x20, 0x36, 0x60, 0x38, 0x65, 0x42, 0x88, 0x40, + 0xD5, 0x51, 0x18, 0x41, 0xA4, 0x58, 0x68, 0x3A, 0x69, 0x56, 0x71, 0x35, + 0x81, 0x5B, 0x9F, 0x37, 0x65, 0x5C, 0x6E, 0x3B, 0xB0, 0x58, 0xC9, 0x49, + 0xB2, 0x57, 0x21, 0x52, 0xC1, 0x50, 0x7F, 0x45, 0xBD, 0x4F, 0xBD, 0x3F, + 0x26, 0x50, 0x92, 0x3F, 0xCA, 0x41, 0xC2, 0x37, 0xBF, 0x2B, 0xC1, 0x36, + 0x86, 0x12, 0x6A, 0x33, 0x92, 0x04, 0xC8, 0x26, 0xD1, 0x26, 0x7C, 0x33, + 0xE7, 0x38, 0x08, 0x37, 0x27, 0x16, 0x3B, 0x1E, 0xD0, 0x19, 0xB0, 0x27, + 0xB4, 0x20, 0x1C, 0x2E, 0x2A, 0xFB, 0xCE, 0x0B, 0x2C, 0xDF, 0x3D, 0xF1, + 0xBB, 0xDF, 0x48, 0xF2, 0x13, 0x08, 0xD4, 0x16, 0xEF, 0x09, 0xE4, 0x0F, + 0x29, 0xE5, 0xC7, 0xE3, 0x7C, 0xF2, 0xBE, 0xF6, 0x55, 0xE8, 0xCB, 0xF3, + 0x2D, 0xB6, 0x91, 0xC2, 0xF8, 0xB6, 0x0A, 0xC1, 0x76, 0xD7, 0xC2, 0xCF, + 0xC2, 0xD0, 0xF4, 0xBC, 0x11, 0xC3, 0xC9, 0xAF, 0x14, 0xCA, 0x3B, 0xBB, + 0x4A, 0xB7, 0x07, 0xB8, 0x6E, 0xA2, 0xCF, 0xA8, 0xA0, 0xB2, 0x55, 0xB5, + 0x5F, 0xBF, 0xD7, 0xC0, 0x74, 0xB1, 0x04, 0xB3, 0x5F, 0xAD, 0xCB, 0xAD, + 0xE2, 0xBB, 0x13, 0xB9, 0x05, 0xB4, 0x6E, 0xAD, 0xBA, 0xB1, 0x85, 0xA8, + 0xF0, 0xBF, 0xB9, 0xBC, 0xA1, 0xBD, 0xCF, 0xC1, 0xB0, 0xAC, 0x0A, 0xAE, + 0x45, 0xA2, 0x19, 0x9F, 0xD1, 0xB0, 0x0E, 0xB0, 0x63, 0xB7, 0xFB, 0xB5, + 0xF8, 0xAF, 0xF9, 0xA9, 0x8C, 0xAD, 0x45, 0xA6, 0x18, 0xB7, 0x74, 0xB3, + 0x55, 0xBA, 0xAE, 0xC2, 0xC3, 0xA3, 0xA8, 0xB4, 0x10, 0x99, 0xDC, 0xA0, + 0x43, 0xB0, 0x56, 0xA5, 0xC4, 0xD3, 0xEF, 0xC1, 0x6A, 0xED, 0x00, 0xE4, + 0x7F, 0xEF, 0xDB, 0xF3, 0xA5, 0xDC, 0x97, 0xEB, 0xAD, 0xCC, 0x0C, 0xD9, + 0xC9, 0xC7, 0x9E, 0xCC, 0xDB, 0xB8, 0x12, 0xC1, 0x51, 0xA2, 0x4C, 0xB9, + 0x58, 0xA9, 0x4C, 0xC8, 0xA8, 0xCE, 0xD3, 0xE9, 0xD2, 0xFE, 0xA3, 0x0F, + 0x12, 0x0C, 0xDD, 0x11, 0xD1, 0xED, 0xAD, 0xF7, 0xE0, 0xD9, 0xEB, 0xED, + 0xFD, 0xE1, 0x1D, 0xF9, 0x37, 0xFD, 0x30, 0x0E, 0xC3, 0x09, 0x5E, 0x0D, + 0xA1, 0x0D, 0xE7, 0x06, 0x66, 0x17, 0x48, 0x0D, 0xB4, 0x22, 0x5D, 0x18, + 0xA2, 0x27, 0x31, 0x1D, 0x59, 0x13, 0xA4, 0x0B, 0x77, 0x0A, 0x21, 0x06, + 0xAE, 0x1F, 0x95, 0x19, 0x82, 0x2E, 0x44, 0x23, 0x02, 0x36, 0x39, 0x28, + 0x8B, 0x25, 0xD9, 0x1F, 0x8B, 0x06, 0x63, 0x0D, 0xA0, 0x06, 0x9F, 0x0E, + 0x8F, 0x1E, 0xA3, 0x1B, 0x36, 0x45, 0x3D, 0x38, 0x0D, 0x65, 0x2D, 0x58, + 0xA9, 0x62, 0x0C, 0x5E, 0x08, 0x45, 0x2E, 0x47, 0x32, 0x2B, 0x59, 0x2D, + 0x22, 0x1F, 0x51, 0x21, 0xAB, 0x17, 0xDB, 0x1F, 0x43, 0x17, 0xAE, 0x26, + 0x3D, 0x2D, 0x66, 0x3B, 0x1F, 0x51, 0x65, 0x53, 0xFA, 0x61, 0x05, 0x57, + 0x6A, 0x56, 0xE6, 0x46, 0x9C, 0x38, 0x5E, 0x2D, 0x77, 0x1C, 0xEB, 0x16, + 0x16, 0x18, 0xB0, 0x15, 0x29, 0x28, 0x8B, 0x27, 0x64, 0x41, 0x40, 0x41, + 0x6E, 0x5B, 0x53, 0x58, 0x50, 0x67, 0x08, 0x5E, 0x47, 0x65, 0xA5, 0x59, + 0x17, 0x55, 0xEB, 0x50, 0xA8, 0x3A, 0x31, 0x43, 0x1B, 0x1F, 0xC1, 0x2F, + 0xA0, 0x17, 0xD1, 0x27, 0x2F, 0x28, 0xF5, 0x33, 0x3E, 0x38, 0xE2, 0x41, + 0xB1, 0x49, 0x68, 0x54, 0xAE, 0x49, 0x26, 0x55, 0xB1, 0x36, 0x84, 0x40, + 0x10, 0x33, 0xB1, 0x39, 0xFB, 0x39, 0x4D, 0x3D, 0x38, 0x3D, 0x8B, 0x3D, + 0xCF, 0x3E, 0xC6, 0x3B, 0x3C, 0x41, 0xCD, 0x3A, 0x1A, 0x44, 0xB5, 0x3C, + 0xA9, 0x41, 0xD1, 0x3D, 0x20, 0x44, 0xFC, 0x45, 0x3C, 0x4C, 0x04, 0x50, + 0xB1, 0x52, 0x09, 0x52, 0x94, 0x5A, 0xDD, 0x53, 0xAA, 0x5F, 0x7A, 0x57, + 0x8E, 0x5D, 0x65, 0x58, 0x3C, 0x43, 0x73, 0x41, 0xDC, 0x1F, 0x68, 0x20, + 0x54, 0x14, 0x4F, 0x16, 0xD4, 0x1E, 0x02, 0x1F, 0xA0, 0x36, 0x5D, 0x31, + 0xE5, 0x58, 0xE0, 0x50, 0x36, 0x64, 0x70, 0x61, 0x77, 0x58, 0x79, 0x5D, + 0xCB, 0x50, 0xE4, 0x56, 0x28, 0x41, 0x55, 0x44, 0x7A, 0x18, 0xF6, 0x20, + 0xAC, 0xF8, 0x0C, 0x10, 0xC2, 0xFE, 0xC9, 0x1F, 0x1F, 0x19, 0xF3, 0x33, + 0x7E, 0x31, 0x2B, 0x3F, 0xB4, 0x34, 0xCE, 0x3C, 0x1F, 0x27, 0x60, 0x31, + 0x5A, 0x1B, 0x23, 0x27, 0x76, 0x1B, 0xB6, 0x26, 0x16, 0x1F, 0xA4, 0x29, + 0x22, 0x19, 0x39, 0x1F, 0x9D, 0x19, 0x83, 0x15, 0xD2, 0x23, 0x7A, 0x16, + 0xFA, 0x1A, 0x43, 0x0C, 0xF2, 0xFB, 0xB0, 0xF1, 0x03, 0xE7, 0x39, 0xDF, + 0x7E, 0xEE, 0x32, 0xE3, 0x40, 0x00, 0xF1, 0xEC, 0x16, 0x11, 0xEE, 0xF2, + 0x7E, 0x21, 0x5F, 0xF8, 0x8C, 0x26, 0x78, 0xFB, 0xD1, 0x07, 0xAE, 0xEB, + 0x4B, 0xDC, 0x24, 0xD6, 0xC0, 0xCB, 0xEA, 0xD0, 0xF8, 0xCD, 0xD0, 0xD2, + 0xEC, 0xE3, 0xDF, 0xE6, 0x2B, 0xFE, 0xC4, 0xFC, 0x7F, 0x02, 0xEF, 0xF7, + 0x5C, 0xFD, 0x57, 0xF1, 0x5C, 0xE6, 0xF0, 0xE8, 0x20, 0xC3, 0xA9, 0xD9, + 0xC3, 0xB9, 0xAE, 0xD6, 0x10, 0xC1, 0x09, 0xD4, 0x9B, 0xC8, 0x98, 0xD5, + 0x73, 0xCD, 0x28, 0xE2, 0x54, 0xCF, 0xF0, 0xE9, 0x63, 0xCF, 0x52, 0xDE, + 0x69, 0xCA, 0x7C, 0xC8, 0xBD, 0xC4, 0xF4, 0xC1, 0x8C, 0xC0, 0x29, 0xC0, + 0xA9, 0xC9, 0x89, 0xBF, 0x34, 0xCC, 0xF2, 0xBF, 0x46, 0xB4, 0x99, 0xB7, + 0xFC, 0xA2, 0xF9, 0xAD, 0x66, 0xA9, 0x8B, 0xA8, 0xD5, 0xB6, 0x40, 0xA9, + 0x4D, 0xBE, 0xB6, 0xAD, 0xDE, 0xCD, 0x5A, 0xBE, 0x24, 0xE2, 0x48, 0xD2, + 0x67, 0xEA, 0x60, 0xD6, 0xCF, 0xE8, 0xB9, 0xD2, 0xDF, 0xD0, 0x49, 0xC5, + 0x36, 0xB7, 0xE5, 0xB5, 0xA0, 0xBD, 0x61, 0xB9, 0xA4, 0xD4, 0x87, 0xCF, + 0x24, 0xEC, 0xC6, 0xEA, 0x03, 0x01, 0x3B, 0xF6, 0xEB, 0x0C, 0xFC, 0xF5, + 0xDB, 0x07, 0xA8, 0xF7, 0xE5, 0xF4, 0x3E, 0xF2, 0x9A, 0xE3, 0x8C, 0xE8, + 0x06, 0xE9, 0xA8, 0xEA, 0xCF, 0x01, 0x78, 0xF9, 0x4F, 0x0D, 0x58, 0x07, + 0x91, 0x0F, 0xAA, 0x12, 0x29, 0x15, 0x02, 0x1D, 0x5A, 0x0D, 0xE1, 0x18, + 0x4D, 0xF9, 0x77, 0x0A, 0x8E, 0xF7, 0x28, 0x05, 0x5D, 0x07, 0x2A, 0x02, + 0xC3, 0x14, 0x41, 0x06, 0xA3, 0x1A, 0x1B, 0x0F, 0x12, 0x18, 0x2B, 0x0F, + 0x80, 0x17, 0xE1, 0x12, 0x7F, 0x1D, 0xA9, 0x13, 0xE0, 0x21, 0x5A, 0x10, + 0x4E, 0x20, 0x0E, 0x15, 0xBE, 0x26, 0xE4, 0x23, 0x30, 0x2E, 0x32, 0x35, + 0xAB, 0x1D, 0x91, 0x31, 0x7F, 0x08, 0xD1, 0x1D, 0xC4, 0x0A, 0x96, 0x14, + 0x29, 0x17, 0x25, 0x11, 0xD9, 0x1C, 0xB4, 0x17, 0x85, 0x21, 0x97, 0x29, + 0xD4, 0x27, 0xB8, 0x2B, 0xCB, 0x37, 0x7C, 0x25, 0x0C, 0x44, 0x7E, 0x1F, + 0x7A, 0x2F, 0xB6, 0x13, 0x71, 0x01, 0x8F, 0xFC, 0xB4, 0xE4, 0xCF, 0xEA, + 0xC7, 0xF0, 0x71, 0xFB, 0x3E, 0x0B, 0xA6, 0x11, 0x2F, 0x33, 0xB4, 0x20, + 0xA9, 0x4D, 0x85, 0x26, 0x8D, 0x2D, 0x6D, 0x14, 0x53, 0xF9, 0x4A, 0x06, + 0x3A, 0xE5, 0x6C, 0x01, 0x91, 0xF5, 0x5E, 0xF1, 0xD3, 0x01, 0x71, 0xEC, + 0x69, 0xF4, 0x9E, 0xFD, 0xED, 0xFE, 0xC7, 0x11, 0x57, 0x21, 0xBE, 0x19, + 0x85, 0x23, 0x97, 0x0C, 0xA4, 0xF9, 0x3C, 0xF4, 0x4A, 0xD6, 0x4D, 0xF1, + 0x95, 0xDC, 0x59, 0xFB, 0xD5, 0xF2, 0xAD, 0xF5, 0x79, 0xF8, 0x27, 0xF3, + 0xE7, 0xDE, 0x3B, 0xF8, 0xDD, 0xC7, 0x20, 0xF7, 0x4F, 0xCD, 0xB1, 0xF2, + 0xBF, 0xCB, 0xCB, 0xED, 0x91, 0xC9, 0xCF, 0xE9, 0xD8, 0xE4, 0x8B, 0xE6, + 0x05, 0xF8, 0xE5, 0xEC, 0x5C, 0xF1, 0x1D, 0xF4, 0xDC, 0xE8, 0x06, 0xED, + 0xD1, 0xE9, 0x12, 0xEB, 0x20, 0xE3, 0x9E, 0xE4, 0xF6, 0xD8, 0x83, 0xDB, + 0xAC, 0xE9, 0x61, 0xF0, 0xA0, 0x06, 0x04, 0x07, 0x0F, 0x0C, 0x25, 0xFC, + 0x5D, 0xF4, 0x57, 0xF7, 0x3B, 0xD2, 0xB9, 0x00, 0xFB, 0xC2, 0xCE, 0xEE, + 0x2C, 0xC4, 0x44, 0xD8, 0xA8, 0xCE, 0x55, 0xD9, 0xD8, 0xE6, 0x21, 0xE3, + 0x70, 0xF5, 0x61, 0xED, 0x02, 0xFC, 0x9E, 0xFD, 0x54, 0xF9, 0x35, 0x01, + 0x79, 0xDE, 0x46, 0xF1, 0x6A, 0xBA, 0xF2, 0xE1, 0x00, 0xAE, 0x2D, 0xDA, + 0x8C, 0xC4, 0x03, 0xDF, 0xB3, 0xD3, 0xE7, 0xE5, 0x91, 0xDA, 0x49, 0xE9, + 0x98, 0xF4, 0xDA, 0xE9, 0x14, 0xFA, 0x92, 0xDF, 0xAF, 0xED, 0xB8, 0xCE, + 0x1B, 0xEC, 0x99, 0xC4, 0xA3, 0xE2, 0x71, 0xCB, 0x11, 0xD4, 0xF9, 0xCF, + 0x4C, 0xCB, 0xDB, 0xC5, 0x43, 0xCE, 0x55, 0xC1, 0xD3, 0xDA, 0x97, 0xC3, + 0xBE, 0xDF, 0xDA, 0xC9, 0x83, 0xD5, 0x80, 0xCE, 0xC5, 0xD0, 0x92, 0xD2, + 0x0E, 0xDB, 0x90, 0xDB, 0xBA, 0xE3, 0xC6, 0xDC, 0xEE, 0xE2, 0xD3, 0xD5, + 0xA7, 0xD1, 0x47, 0xCD, 0x52, 0xBB, 0x74, 0xB9, 0x18, 0xBD, 0x53, 0xAE, + 0x7F, 0xC4, 0x2D, 0xBB, 0x77, 0xB5, 0x4B, 0xC4, 0xC9, 0xB1, 0xBB, 0xD0, + 0x78, 0xCF, 0xD5, 0xDE, 0x88, 0xEB, 0x64, 0xEA, 0x3C, 0xDF, 0x94, 0xEB, + 0x13, 0xC2, 0x81, 0xD7, 0x91, 0xB4, 0x39, 0xC0, 0x78, 0xAD, 0x76, 0xAC, + 0x87, 0xA6, 0x06, 0xB2, 0x4F, 0xAE, 0x99, 0xD4, 0xB4, 0xD4, 0x9E, 0xE0, + 0xA4, 0xFB, 0xCB, 0xD6, 0x22, 0xF9, 0x26, 0xD9, 0x7F, 0xD9, 0x03, 0xCD, + 0x84, 0xBA, 0x85, 0xAF, 0xD3, 0xAF, 0x4F, 0xA5, 0x3E, 0xAF, 0xE3, 0xAB, + 0x3E, 0xB4, 0x27, 0xBC, 0xB2, 0xD9, 0x47, 0xD2, 0xD3, 0x01, 0xFF, 0xD0, + 0x04, 0x00, 0x07, 0xBB, 0x53, 0xE0, 0x01, 0xC0, 0xA8, 0xD5, 0x8F, 0xE0, + 0x50, 0xEA, 0xC1, 0xE1, 0x0F, 0xFC, 0xC5, 0xD5, 0x0B, 0x07, 0x76, 0xDF, + 0x74, 0x0E, 0x0C, 0xEF, 0x6B, 0x07, 0xBD, 0xFE, 0xDD, 0xFF, 0x74, 0x0A, + 0x11, 0x01, 0xAB, 0x0B, 0xBA, 0x04, 0x24, 0x0E, 0x35, 0x20, 0x8D, 0x1B, + 0x13, 0x47, 0x02, 0x20, 0x43, 0x42, 0xEB, 0x1C, 0x45, 0x1C, 0x91, 0x1C, + 0xDA, 0x11, 0x4E, 0x21, 0x5C, 0x0E, 0x00, 0x22, 0xA3, 0x01, 0xCE, 0x24, + 0x87, 0x17, 0xA4, 0x31, 0x0A, 0x42, 0x03, 0x3F, 0x12, 0x53, 0x61, 0x53, + 0x1F, 0x49, 0x0D, 0x5A, 0x20, 0x40, 0x99, 0x46, 0xE0, 0x2D, 0x2B, 0x36, + 0xBF, 0x0C, 0x39, 0x35, 0x55, 0x06, 0x99, 0x37, 0xAF, 0x17, 0xCC, 0x38, + 0x6B, 0x2F, 0xBA, 0x3B, 0x2B, 0x54, 0x08, 0x41, 0xA3, 0x67, 0x05, 0x41, + 0x01, 0x5D, 0x1E, 0x34, 0x8A, 0x4F, 0x26, 0x33, 0x6F, 0x4C, 0xD9, 0x3F, + 0x38, 0x45, 0xAA, 0x43, 0xF2, 0x3B, 0x8C, 0x4F, 0xBD, 0x46, 0x9E, 0x55, + 0xF3, 0x5A, 0x7F, 0x48, 0x55, 0x5D, 0xF5, 0x40, 0x95, 0x4C, 0xDE, 0x3A, + 0xEF, 0x41, 0xB0, 0x2F, 0xE5, 0x44, 0x61, 0x2F, 0xE6, 0x52, 0xEC, 0x42, + 0x1C, 0x5B, 0x04, 0x53, 0x6A, 0x4D, 0xA7, 0x4A, 0x36, 0x47, 0x18, 0x3C, + 0x41, 0x4C, 0x38, 0x33, 0x6F, 0x45, 0x45, 0x2B, 0xD9, 0x34, 0x1C, 0x27, + 0xCC, 0x34, 0xCB, 0x29, 0x51, 0x52, 0xDA, 0x37, 0x32, 0x56, 0x55, 0x4A, + 0xB0, 0x34, 0x58, 0x51, 0x7D, 0x25, 0x34, 0x47, 0x1B, 0x27, 0x8C, 0x31, + 0xE6, 0x31, 0x7C, 0x24, 0x90, 0x3B, 0x07, 0x23, 0x54, 0x28, 0x78, 0x2C, + 0x38, 0x27, 0x10, 0x41, 0x4D, 0x34, 0x55, 0x3F, 0xBC, 0x2A, 0x9F, 0x2C, + 0xED, 0x24, 0xEC, 0x21, 0x3E, 0x1D, 0x72, 0x1A, 0xCA, 0x0D, 0x59, 0x08, + 0x14, 0x0E, 0xD0, 0xFE, 0x00, 0x1F, 0xE0, 0x0A, 0xA2, 0x2D, 0xEC, 0x12, + 0xDF, 0x25, 0xA4, 0x17, 0x90, 0x14, 0xCD, 0x18, 0x03, 0x0B, 0xEC, 0x15, + 0x09, 0xFF, 0xF1, 0x1B, 0x1A, 0x04, 0x73, 0x27, 0x32, 0x1B, 0x2A, 0x2B, + 0x1D, 0x23, 0xE1, 0x2C, 0x6A, 0x2B, 0xAD, 0x2D, 0xB5, 0x43, 0xA7, 0x25, + 0xAB, 0x41, 0xF2, 0x1F, 0xE6, 0x1F, 0xD6, 0x20, 0x1E, 0x16, 0xF2, 0x2B, + 0x72, 0x2D, 0x06, 0x36, 0x07, 0x48, 0xF5, 0x34, 0xC8, 0x58, 0xAA, 0x3A, + 0x9F, 0x59, 0x3D, 0x3F, 0xB9, 0x47, 0x11, 0x34, 0x87, 0x29, 0x1B, 0x2F, + 0x89, 0x1D, 0xA2, 0x2E, 0x21, 0x29, 0x2E, 0x24, 0x75, 0x33, 0xB2, 0x1F, + 0xB4, 0x3A, 0x2A, 0x23, 0xBC, 0x3E, 0xAA, 0x2A, 0x59, 0x42, 0x5D, 0x2F, + 0x5D, 0x3C, 0xAF, 0x29, 0x2C, 0x24, 0x45, 0x24, 0x32, 0x14, 0x07, 0x1F, + 0x4B, 0x0F, 0x0C, 0x25, 0x2C, 0x0D, 0xB8, 0x34, 0xB2, 0x0E, 0x4A, 0x2E, + 0x53, 0x17, 0x6A, 0x23, 0xE7, 0x20, 0xCB, 0x1A, 0x1B, 0x27, 0xBE, 0x0C, + 0x8D, 0x24, 0x92, 0x0C, 0xC3, 0x14, 0x58, 0x12, 0x00, 0x1A, 0xF1, 0x1C, + 0x53, 0x2F, 0x53, 0x39, 0x8C, 0x38, 0xF1, 0x45, 0x8C, 0x2E, 0x72, 0x33, + 0x24, 0x18, 0x8E, 0x1C, 0x06, 0x0C, 0x5F, 0x08, 0x14, 0x10, 0xE3, 0xFE, + 0xED, 0x16, 0x2F, 0x01, 0x09, 0x11, 0xA5, 0x01, 0xE3, 0x09, 0x64, 0xFE, + 0xC3, 0x19, 0x0D, 0xFE, 0x4C, 0x1C, 0x35, 0x03, 0x88, 0xFB, 0xA9, 0x02, + 0x18, 0xE3, 0x52, 0xE2, 0xAA, 0xDA, 0x87, 0xC0, 0xE5, 0xDC, 0x23, 0xD0, + 0x50, 0xF3, 0xFF, 0xEF, 0x8B, 0x01, 0x79, 0xFE, 0xCD, 0xFD, 0x1A, 0x01, + 0xD7, 0xF5, 0xD7, 0x02, 0x65, 0xF3, 0x37, 0xFD, 0x5B, 0xFA, 0x3B, 0xE6, + 0x4D, 0xEA, 0x59, 0xDB, 0x1B, 0xDC, 0x8E, 0xD2, 0x7B, 0xE4, 0x3C, 0xCA, + 0x02, 0xE0, 0x94, 0xDB, 0xCC, 0xDC, 0x1E, 0xEF, 0xBF, 0xD4, 0xE8, 0xEA, + 0xE9, 0xB5, 0xE0, 0xD8, 0xA1, 0xA1, 0xF8, 0xD7, 0xE4, 0xAE, 0x86, 0xDC, + 0x14, 0xCB, 0x66, 0xD0, 0x28, 0xD3, 0x28, 0xC0, 0xFE, 0xC2, 0x75, 0xC3, + 0x76, 0xB2, 0xA5, 0xD1, 0x04, 0xB3, 0x1E, 0xD5, 0x28, 0xBC, 0x60, 0xD7, + 0xFD, 0xBC, 0x03, 0xD6, 0x07, 0xBE, 0x29, 0xDC, 0x5C, 0xD1, 0x22, 0xED, + 0x3D, 0xDC, 0xDC, 0xF1, 0x5D, 0xD3, 0x00, 0xF5, 0x87, 0xDC, 0xA4, 0xF4, + 0x73, 0xED, 0xC2, 0xE9, 0xBE, 0xEC, 0x76, 0xED, 0x0A, 0xED, 0x3A, 0xF8, + 0xDE, 0xFA, 0x05, 0xF6, 0xB7, 0x08, 0x16, 0xF6, 0xDF, 0x0A, 0x08, 0xFA, + 0x00, 0x03, 0xCC, 0xEF, 0x54, 0x02, 0x74, 0xE4, 0x8F, 0xFD, 0x61, 0xE0, + 0x4F, 0xEA, 0xC1, 0xD3, 0x86, 0xD3, 0xD4, 0xCB, 0x2B, 0xC6, 0xC9, 0xDB, + 0x50, 0xE6, 0xE7, 0xEA, 0xC7, 0x00, 0xBF, 0xE3, 0xD1, 0xDF, 0x89, 0xE1, + 0x2C, 0xB7, 0x0D, 0xE4, 0xDB, 0xAB, 0x6C, 0xD8, 0x56, 0xBC, 0xAD, 0xD6, + 0x66, 0xBE, 0xAD, 0xDB, 0x32, 0xAC, 0x8E, 0xD3, 0x05, 0xB5, 0x01, 0xDB, + 0x3F, 0xCF, 0xBA, 0xEB, 0x64, 0xE1, 0x21, 0xE7, 0x3F, 0xD8, 0xEB, 0xD6, + 0xCE, 0xC6, 0x9D, 0xC4, 0x24, 0xC8, 0xC2, 0xC0, 0x2A, 0xC9, 0xD3, 0xD6, + 0xED, 0xC3, 0x4D, 0xEE, 0x33, 0xC1, 0x7B, 0xF1, 0x71, 0xD2, 0x29, 0xE1, + 0xAE, 0xE9, 0x94, 0xD1, 0xD1, 0xE6, 0xE3, 0xCB, 0xCA, 0xC8, 0xE4, 0xC3, + 0xE9, 0xB3, 0x9A, 0xBA, 0xBE, 0xAC, 0x75, 0xB4, 0x44, 0x9C, 0x95, 0xB2, + 0x8F, 0x9B, 0x4C, 0xB0, 0x5B, 0xAB, 0x51, 0xA8, 0x42, 0xB7, 0x82, 0xA3, + 0x05, 0xC5, 0xE4, 0xAC, 0x64, 0xCB, 0x4C, 0xB5, 0x67, 0xBC, 0x62, 0xBB, + 0xDB, 0xB1, 0x35, 0xC1, 0x26, 0xBE, 0xE1, 0xBC, 0x1B, 0xBF, 0xA3, 0xB9, + 0xD7, 0xB1, 0x0B, 0xBC, 0x42, 0xAB, 0x91, 0xC5, 0xA4, 0xA6, 0xEA, 0xCF, + 0x1A, 0xAE, 0xF6, 0xCA, 0xFE, 0xB8, 0xC1, 0xBA, 0xCE, 0xBF, 0x98, 0xB0, + 0x86, 0xC9, 0xFD, 0xB1, 0x97, 0xC6, 0xE8, 0xB2, 0xB0, 0xB0, 0x5B, 0xAA, + 0x45, 0x9B, 0xDB, 0xA0, 0x6E, 0x9D, 0xDE, 0x9F, 0x68, 0xA7, 0x3D, 0xA1, + 0x0B, 0x9E, 0x1C, 0x9D, 0x8F, 0x99, 0x82, 0xA2, 0x71, 0xA4, 0xEE, 0xA9, + 0x4C, 0xA7, 0x6B, 0xAD, 0x29, 0xB2, 0x69, 0xBF, 0x9B, 0xC2, 0x3C, 0xD2, + 0x76, 0xBE, 0x7E, 0xD3, 0x89, 0xBE, 0x37, 0xCF, 0x62, 0xD2, 0x00, 0xDE, + 0xC1, 0xE9, 0x4A, 0xE1, 0xDA, 0xF5, 0x96, 0xD9, 0xC2, 0xF4, 0x59, 0xED, + 0x29, 0x02, 0x52, 0x01, 0x8A, 0x09, 0x58, 0x09, 0x05, 0xFF, 0xB5, 0x0C, + 0x31, 0xF4, 0xDE, 0xFC, 0x8A, 0xDF, 0xAA, 0xEB, 0x4E, 0xDD, 0x45, 0xF0, + 0xA3, 0xEE, 0x97, 0xF9, 0x08, 0xF6, 0x02, 0xF3, 0x6A, 0xEA, 0xBE, 0xE3, + 0xA4, 0xDF, 0x22, 0xE1, 0xDD, 0xEA, 0x06, 0xE6, 0x09, 0xEF, 0x05, 0xE8, + 0xD2, 0xD4, 0x66, 0xEF, 0x96, 0xC1, 0x66, 0xFA, 0x67, 0xD7, 0x8E, 0xF4, + 0x41, 0xEF, 0x18, 0xE4, 0x00, 0xEA, 0xBF, 0xE2, 0x3D, 0xD5, 0x93, 0xF4, + 0xFD, 0xD2, 0x97, 0xFE, 0xA6, 0xEC, 0x6D, 0xEB, 0xDA, 0xFB, 0x60, 0xE1, + 0x2C, 0xF1, 0x97, 0xED, 0x1A, 0xEB, 0x44, 0xF0, 0x2B, 0xFC, 0xD8, 0xE4, + 0xDD, 0x10, 0xC6, 0xE1, 0x7D, 0x12, 0x54, 0xF6, 0xD0, 0x13, 0x13, 0x07, + 0xF2, 0x20, 0x93, 0x06, 0x21, 0x27, 0x27, 0x07, 0xC6, 0x28, 0x1D, 0xFB, + 0xC1, 0x1B, 0xC6, 0xE4, 0x42, 0xFB, 0x24, 0xD5, 0x3C, 0xEE, 0x6A, 0xCE, + 0x61, 0xFC, 0xAB, 0xD2, 0x81, 0xFB, 0x53, 0xE9, 0x52, 0xF3, 0x30, 0xFC, + 0xFE, 0x04, 0x23, 0xFA, 0xAF, 0x0B, 0xB9, 0xFD, 0x42, 0xFE, 0x40, 0x09, + 0x17, 0x02, 0x2C, 0x15, 0x55, 0x07, 0xE6, 0x17, 0x10, 0xFD, 0xA2, 0x11, + 0x50, 0xFD, 0x97, 0x0B, 0xEE, 0x10, 0x7E, 0x0D, 0xB6, 0x29, 0x7C, 0x23, + 0xF0, 0x33, 0xCF, 0x35, 0x44, 0x2A, 0x56, 0x33, 0x82, 0x15, 0xCC, 0x29, + 0xF5, 0x04, 0x20, 0x1E, 0x33, 0x06, 0x76, 0x0B, 0xC8, 0x05, 0xD5, 0xF7, + 0xC4, 0xF8, 0x86, 0xEC, 0x06, 0xED, 0x73, 0xE0, 0x9E, 0xE9, 0x11, 0xDC, + 0x88, 0xEC, 0x4C, 0xE5, 0xE5, 0xEC, 0x18, 0xE5, 0xF0, 0xF0, 0x4D, 0xDD, + 0xAE, 0x0E, 0xC8, 0xE2, 0x33, 0x33, 0x48, 0xF8, 0x37, 0x3A, 0xEB, 0x00, + 0xB8, 0x2B, 0xD2, 0xFE, 0x34, 0x1B, 0xE4, 0x0D, 0xED, 0x16, 0xB0, 0x17, + 0x66, 0x2A, 0x0F, 0x28, 0xA2, 0x48, 0x36, 0x4C, 0x83, 0x5C, 0xBA, 0x54, + 0xA9, 0x5F, 0x5D, 0x4C, 0x91, 0x5A, 0x4F, 0x53, 0x3E, 0x5A, 0x84, 0x56, + 0x63, 0x5D, 0xC5, 0x52, 0x98, 0x53, 0x67, 0x45, 0x17, 0x42, 0x9F, 0x34, + 0x24, 0x42, 0x12, 0x3F, 0xC7, 0x47, 0x96, 0x49, 0xF1, 0x46, 0xCC, 0x42, + 0x5C, 0x48, 0x4C, 0x3B, 0xB8, 0x44, 0xC5, 0x33, 0x45, 0x37, 0x3C, 0x27, + 0xBF, 0x32, 0x20, 0x1C, 0xA7, 0x30, 0xA7, 0x1E, 0x95, 0x2A, 0x31, 0x32, + 0x06, 0x36, 0x22, 0x44, 0x6F, 0x40, 0xD3, 0x46, 0x07, 0x30, 0xCC, 0x42, + 0x4A, 0x19, 0x54, 0x2B, 0x57, 0x24, 0x61, 0x1D, 0xE8, 0x39, 0xD4, 0x2D, + 0x48, 0x34, 0x68, 0x3F, 0x15, 0x30, 0xA6, 0x3F, 0x63, 0x40, 0xC1, 0x33, + 0xCC, 0x45, 0x71, 0x25, 0x39, 0x3B, 0x65, 0x1C, 0x78, 0x2D, 0x56, 0x1E, + 0x5A, 0x23, 0xEE, 0x25, 0xCD, 0x33, 0x30, 0x2B, 0x48, 0x56, 0x88, 0x30, + 0xFB, 0x58, 0x79, 0x43, 0xCB, 0x3C, 0xB0, 0x4B, 0xB5, 0x2C, 0xDC, 0x32, + 0xA8, 0x21, 0x71, 0x10, 0x11, 0x0F, 0x52, 0xF3, 0x37, 0x0C, 0xD9, 0xE6, + 0x48, 0x16, 0x1C, 0xEE, 0x32, 0x15, 0x5E, 0xF4, 0xD2, 0x18, 0x3A, 0xF1, + 0xAC, 0x1A, 0x5B, 0xED, 0xE7, 0x13, 0xC2, 0xF3, 0x05, 0x1A, 0x12, 0xF3, + 0x61, 0x1E, 0x60, 0xF0, 0xAB, 0x15, 0x6F, 0x00, 0x3C, 0x0F, 0xF3, 0x0F, + 0xDD, 0x16, 0x73, 0x1B, 0x03, 0x1F, 0x80, 0x2E, 0xC0, 0x19, 0x49, 0x35, + 0xA5, 0x16, 0xDC, 0x22, 0x25, 0x18, 0xCA, 0x1A, 0x61, 0x12, 0xFE, 0x17, + 0x96, 0x07, 0xE6, 0x06, 0x7B, 0xF9, 0x4F, 0xF8, 0x49, 0xEE, 0x35, 0xF2, + 0x3C, 0xE6, 0xF4, 0xED, 0xF8, 0xDC, 0xF0, 0xDF, 0x25, 0xCF, 0x9C, 0xD9, + 0x5A, 0xCB, 0xC7, 0xE5, 0xDE, 0xE0, 0x8B, 0xEB, 0x22, 0x00, 0xCC, 0xF0, + 0x7D, 0x19, 0x22, 0x00, 0x23, 0x1E, 0xA5, 0x0A, 0x09, 0x14, 0x10, 0x15, + 0xB3, 0x0E, 0x2E, 0x1C, 0x19, 0x0F, 0x9C, 0x18, 0xB9, 0x17, 0xF6, 0x1D, + 0xBE, 0x2D, 0xDE, 0x34, 0x35, 0x48, 0x99, 0x49, 0xEA, 0x52, 0x79, 0x56, + 0x8F, 0x59, 0x0B, 0x61, 0x43, 0x5D, 0x48, 0x57, 0xD7, 0x48, 0x22, 0x3C, + 0xB7, 0x2E, 0x71, 0x30, 0x34, 0x21, 0x90, 0x2E, 0x23, 0x1E, 0x7C, 0x28, + 0x47, 0x19, 0x89, 0x23, 0x40, 0x15, 0x98, 0x1D, 0xED, 0x1C, 0x82, 0x1F, + 0x3A, 0x1D, 0xDD, 0x1E, 0xC0, 0x0E, 0x43, 0x14, 0x62, 0x07, 0x07, 0x0A, + 0x58, 0x0B, 0xBE, 0x10, 0x05, 0x11, 0x02, 0x17, 0x0D, 0x17, 0x7D, 0x14, + 0x75, 0x0A, 0x74, 0x1A, 0x96, 0xF8, 0x03, 0x23, 0x02, 0xF8, 0x97, 0x27, + 0x00, 0x08, 0x16, 0x1F, 0x0F, 0x1D, 0x5D, 0x1C, 0x85, 0x1D, 0xF7, 0x26, + 0xDA, 0x17, 0x01, 0x29, 0x9C, 0x0F, 0x65, 0x23, 0xFA, 0xFF, 0x4F, 0x27, + 0x1C, 0xF0, 0x9F, 0x29, 0x42, 0xE4, 0x72, 0x1D, 0x24, 0xE3, 0xC6, 0x0F, + 0xB7, 0xED, 0x81, 0x1C, 0xE5, 0x05, 0x4A, 0x35, 0x40, 0x1C, 0xE0, 0x3C, + 0x50, 0x1F, 0x97, 0x3D, 0x0E, 0x0F, 0x79, 0x32, 0x99, 0xF7, 0x78, 0x1C, + 0xE9, 0xDA, 0xA3, 0x05, 0x15, 0xC0, 0x4E, 0xED, 0x14, 0xC5, 0x19, 0xDB, + 0x77, 0xE0, 0x65, 0xE4, 0x44, 0xF1, 0x12, 0xF3, 0xD5, 0xE8, 0x2F, 0xE2, + 0x35, 0xD0, 0x2C, 0xDC, 0xC5, 0xC5, 0xB3, 0xEC, 0x69, 0xCE, 0x93, 0xF8, + 0x0B, 0xE0, 0x28, 0xFB, 0x11, 0xF7, 0x4C, 0xEE, 0x6C, 0x0B, 0x54, 0xED, + 0x1B, 0x17, 0xEB, 0x01, 0x62, 0x0B, 0xE6, 0x13, 0x3B, 0xF3, 0xC5, 0x1E, + 0x9A, 0xEE, 0xC5, 0x15, 0x53, 0xF0, 0xCD, 0x01, 0x92, 0xE8, 0x71, 0xFD, + 0xF3, 0xD7, 0x8F, 0xF6, 0xED, 0xC1, 0x68, 0xE7, 0x2A, 0xBB, 0x4B, 0xD7, + 0xF2, 0xC9, 0x19, 0xC2, 0x10, 0xD5, 0xD0, 0xBE, 0xC9, 0xC4, 0x35, 0xC8, + 0x4B, 0xB7, 0x4B, 0xC9, 0x3A, 0xC6, 0xB1, 0xCD, 0x9C, 0xD7, 0x6E, 0xD4, + 0x55, 0xE0, 0x4A, 0xDE, 0x15, 0xE4, 0x6D, 0xEC, 0xC1, 0xDD, 0xC4, 0xF5, + 0xFF, 0xD7, 0x73, 0xFC, 0xFF, 0xE4, 0x29, 0x06, 0x0E, 0xFD, 0xAF, 0x17, + 0x59, 0x15, 0xE3, 0x26, 0xBA, 0x25, 0x01, 0x2C, 0x56, 0x1B, 0x33, 0x28, + 0x1D, 0xF5, 0xB4, 0x16, 0x79, 0xDD, 0xB0, 0x01, 0xCC, 0xDB, 0x8F, 0xF1, + 0x81, 0xCE, 0x26, 0xF0, 0x4A, 0xBF, 0xE2, 0xEF, 0x11, 0xC1, 0xC4, 0xE7, + 0x38, 0xD3, 0xE8, 0xDE, 0x65, 0xDB, 0x92, 0xD5, 0x5F, 0xC1, 0xE3, 0xCC, + 0xBA, 0xB0, 0xB5, 0xC4, 0x94, 0xC4, 0x76, 0xCC, 0xE1, 0xD4, 0x67, 0xC3, + 0x8E, 0xC6, 0xCA, 0xB2, 0x3E, 0xA8, 0xCE, 0xBA, 0x58, 0xA3, 0xAF, 0xC1, + 0xB9, 0xB2, 0xA1, 0xC9, 0x8A, 0xB6, 0xF0, 0xD6, 0x75, 0xAC, 0xAF, 0xD1, + 0xDD, 0xAF, 0x1A, 0xCE, 0x44, 0xCC, 0x6F, 0xDF, 0x5B, 0xD4, 0x7D, 0xDD, + 0xE8, 0xB6, 0xC0, 0xBC, 0xCF, 0x9E, 0x72, 0xAF, 0xCA, 0xA0, 0x2E, 0xC1, + 0x33, 0xA2, 0x2D, 0xC5, 0xA3, 0xA0, 0x24, 0xBE, 0x0F, 0xB2, 0xA0, 0xC4, + 0x8B, 0xCD, 0xB8, 0xCB, 0xB1, 0xDD, 0x30, 0xD2, 0xF7, 0xD5, 0xF5, 0xE1, + 0x1E, 0xC0, 0x96, 0xDF, 0xDD, 0xB2, 0x18, 0xC9, 0x89, 0xB0, 0x1A, 0xBC, + 0xED, 0xB0, 0x27, 0xB7, 0xA5, 0xAD, 0x61, 0xA9, 0xB2, 0xB2, 0xE5, 0xA1, + 0x5D, 0xC8, 0x62, 0xA1, 0xF3, 0xC8, 0x59, 0x9C, 0x36, 0xAC, 0x67, 0xA1, + 0x28, 0x9A, 0x90, 0xA4, 0x49, 0xA6, 0x72, 0xB1, 0xEE, 0xC8, 0xFE, 0xCD, + 0x5F, 0xDD, 0x2D, 0xDB, 0xB4, 0xD7, 0x3A, 0xDA, 0xE9, 0xDC, 0xE9, 0xD2, + 0xDF, 0xE7, 0x80, 0xCF, 0xAC, 0xEB, 0x0D, 0xDD, 0x03, 0xEF, 0x55, 0xEA, + 0x4B, 0xEB, 0x2C, 0xEF, 0xF1, 0xE6, 0xDC, 0xF1, 0x11, 0xEB, 0x74, 0xF1, + 0x90, 0xEA, 0xD3, 0xE3, 0x1E, 0xD7, 0x29, 0xC8, 0xF7, 0xC2, 0x6E, 0xAD, + 0x42, 0xC4, 0x32, 0x9E, 0xFA, 0xCC, 0xE3, 0xA0, 0x4B, 0xD1, 0xD5, 0xAF, + 0x9E, 0xDB, 0xB1, 0xBE, 0x9D, 0xDE, 0xC8, 0xC9, 0x7C, 0xED, 0x36, 0xD2, + 0xE1, 0x0B, 0x1F, 0xDC, 0x6A, 0x12, 0x66, 0xF0, 0x36, 0x05, 0xFF, 0x08, + 0x33, 0xFA, 0x27, 0x19, 0x28, 0x02, 0xF8, 0x22, 0x8C, 0x1B, 0x45, 0x31, + 0x8B, 0x33, 0xB9, 0x3D, 0xA2, 0x3B, 0xB7, 0x45, 0xB3, 0x33, 0xB0, 0x43, + 0x40, 0x37, 0x54, 0x31, 0x17, 0x3E, 0x47, 0x22, 0xEE, 0x2D, 0x5A, 0x18, + 0x59, 0x13, 0x6B, 0x11, 0xA7, 0x0D, 0x17, 0x0E, 0x12, 0x1F, 0xB1, 0x07, + 0x81, 0x20, 0xD7, 0x00, 0xEA, 0x14, 0x12, 0x01, 0xBC, 0x16, 0x29, 0x0A, + 0x26, 0x20, 0xD1, 0x11, 0xB0, 0x1E, 0x56, 0x08, 0x73, 0x13, 0x41, 0x06, + 0xA7, 0x11, 0x85, 0x0F, 0x5D, 0x24, 0xB5, 0x14, 0x54, 0x2F, 0xBA, 0x21, + 0x3A, 0x2B, 0xBB, 0x32, 0x0D, 0x22, 0x16, 0x33, 0x21, 0x1C, 0xE6, 0x1A, + 0x7F, 0x2F, 0xCB, 0x10, 0x40, 0x44, 0x52, 0x23, 0x75, 0x3A, 0xE4, 0x2A, + 0x5A, 0x20, 0x25, 0x20, 0x65, 0x10, 0x8E, 0x17, 0x5C, 0x13, 0xFC, 0x15, + 0x76, 0x20, 0xC2, 0x18, 0x9D, 0x2C, 0x39, 0x17, 0xA6, 0x35, 0xDC, 0x12, + 0x05, 0x45, 0xD4, 0x1E, 0x02, 0x5C, 0x5D, 0x3A, 0x81, 0x68, 0x3D, 0x47, + 0x68, 0x59, 0xBB, 0x43, 0x60, 0x3B, 0xEE, 0x3A, 0x7E, 0x2B, 0x2A, 0x22, + 0x6B, 0x26, 0x49, 0x08, 0xBF, 0x22, 0x9D, 0xFB, 0x47, 0x1F, 0xC2, 0xF9, + 0xBE, 0x1F, 0x46, 0xFF, 0xD4, 0x28, 0x22, 0x01, 0x79, 0x28, 0x55, 0xFB, + 0xFC, 0x1F, 0x69, 0xFA, 0xD6, 0x21, 0xDC, 0x0B, 0x7B, 0x2E, 0x17, 0x23, + 0xFA, 0x2B, 0x2E, 0x32, 0x1C, 0x25, 0xAB, 0x36, 0x7A, 0x36, 0x09, 0x2E, + 0xE9, 0x46, 0x17, 0x2A, 0x1C, 0x47, 0x61, 0x2A, 0xB3, 0x3B, 0x2B, 0x31, + 0xF5, 0x27, 0x2D, 0x40, 0xC1, 0x1E, 0x60, 0x37, 0x5F, 0x23, 0x50, 0x1E, + 0xF3, 0x24, 0x83, 0x0A, 0x20, 0x1A, 0xBA, 0xF7, 0xA5, 0x05, 0xD2, 0xEC, + 0x1A, 0xEE, 0x76, 0xEB, 0xAB, 0xE3, 0x61, 0xE8, 0x6F, 0xEF, 0xD5, 0xDE, + 0x03, 0x00, 0x77, 0xDC, 0xE1, 0x15, 0xE7, 0xED, 0x0C, 0x33, 0xAD, 0x06, + 0x17, 0x44, 0x45, 0x1C, 0x60, 0x4A, 0x76, 0x1A, 0x75, 0x4C, 0xB8, 0x08, + 0x16, 0x3E, 0x7E, 0x0F, 0xCA, 0x2B, 0x96, 0x23, 0x14, 0x33, 0xAB, 0x31, + 0x6D, 0x4A, 0x4D, 0x3F, 0x91, 0x58, 0x5C, 0x50, 0xA0, 0x5F, 0x00, 0x5D, + 0x36, 0x52, 0x02, 0x5E, 0x9E, 0x35, 0x28, 0x54, 0x3E, 0x29, 0x7F, 0x3A, + 0xB4, 0x26, 0xDE, 0x28, 0x89, 0x1C, 0x64, 0x29, 0xCC, 0x0C, 0xCE, 0x1E, + 0x94, 0x08, 0xF7, 0x15, 0xAC, 0x0D, 0x0D, 0x1F, 0x3F, 0x18, 0x48, 0x20, + 0xFB, 0x21, 0x5F, 0x1E, 0x4E, 0x1F, 0x9E, 0x23, 0xA6, 0x15, 0x85, 0x18, + 0x8C, 0x12, 0xC0, 0x11, 0x1E, 0x0C, 0x95, 0x24, 0x2E, 0x03, 0x6B, 0x37, + 0x63, 0xFD, 0xAF, 0x2F, 0x2A, 0xEB, 0xD6, 0x12, 0xD3, 0xF0, 0xEB, 0x01, + 0x58, 0x0F, 0x57, 0x08, 0xF4, 0x19, 0xB0, 0x17, 0x34, 0x17, 0x00, 0x18, + 0x3F, 0x15, 0xE3, 0x0C, 0x1A, 0x1A, 0xFF, 0x0A, 0x95, 0x18, 0xC1, 0x13, + 0xB4, 0x0B, 0xCF, 0x11, 0x34, 0x02, 0xAA, 0x03, 0x77, 0x07, 0x27, 0x0F, + 0xAD, 0x26, 0x08, 0x27, 0xA2, 0x42, 0xCF, 0x31, 0xC7, 0x3B, 0x27, 0x35, + 0xC4, 0x26, 0xBC, 0x30, 0x7F, 0x18, 0xDB, 0x1E, 0x0B, 0x09, 0x04, 0xFE, + 0x03, 0xFA, 0xE0, 0xEB, 0x10, 0xFB, 0xA1, 0xDF, 0xD7, 0xFB, 0x60, 0xD7, + 0x6F, 0xF9, 0x44, 0xE8, 0xF6, 0x01, 0xCA, 0xF1, 0xCA, 0x04, 0xF6, 0xF8, + 0x3A, 0x00, 0xF2, 0xFD, 0x5D, 0x08, 0x73, 0xF9, 0x71, 0x12, 0xA9, 0x05, + 0xD9, 0x11, 0x17, 0x10, 0xAC, 0x10, 0x82, 0x09, 0xBB, 0x0B, 0x06, 0x08, + 0xB7, 0x08, 0x0D, 0x14, 0x6D, 0x0B, 0x23, 0x20, 0x5B, 0x05, 0x4B, 0x22, + 0x32, 0xF2, 0x57, 0x18, 0xC1, 0xDF, 0x6C, 0x09, 0x41, 0xDE, 0xB0, 0xF6, + 0xED, 0xE0, 0x06, 0xE7, 0xD2, 0xD9, 0x46, 0xDC, 0x45, 0xCB, 0xEA, 0xC6, + 0xDE, 0xB7, 0x9C, 0xB2, 0xB2, 0xB5, 0xE4, 0xAB, 0x1E, 0xC4, 0x4C, 0xB2, + 0xEF, 0xD3, 0x41, 0xCA, 0x63, 0xED, 0x34, 0xEF, 0x66, 0x06, 0x53, 0x0B, + 0x3F, 0x06, 0xBC, 0x0F, 0x01, 0xF1, 0xEA, 0x0B, 0xD7, 0xE0, 0x61, 0x0D, + 0x44, 0xE9, 0x44, 0x10, 0x78, 0x04, 0x50, 0x13, 0xDC, 0x19, 0xBD, 0x1F, + 0xAB, 0x1F, 0x2E, 0x30, 0x22, 0x23, 0xB3, 0x37, 0xEE, 0x23, 0xBC, 0x2E, + 0x32, 0x17, 0x28, 0x1B, 0x80, 0x02, 0x40, 0x06, 0xD6, 0xEC, 0x6C, 0xF2, + 0x9E, 0xDF, 0x56, 0xED, 0x2B, 0xDB, 0x99, 0xEC, 0xBC, 0xD5, 0x12, 0xED, + 0x91, 0xC8, 0xBD, 0xF1, 0x19, 0xCB, 0xDF, 0xF2, 0x97, 0xE3, 0xAE, 0xF4, + 0x09, 0xED, 0x88, 0xF6, 0x72, 0xDC, 0xFB, 0xEC, 0xEE, 0xD3, 0x7F, 0xEC, + 0x59, 0xE0, 0x66, 0xF7, 0x6E, 0xE6, 0x72, 0xF5, 0x64, 0xD0, 0x02, 0xF1, + 0xF0, 0xB2, 0x68, 0xF2, 0x52, 0xB9, 0xD9, 0xF4, 0xF7, 0xD4, 0x7A, 0xF9, + 0x63, 0xD9, 0xB8, 0xFB, 0x41, 0xD6, 0xEB, 0xF7, 0xF4, 0xDF, 0x9D, 0xF6, + 0x0A, 0xE4, 0x8F, 0xF0, 0xB9, 0xDC, 0x0C, 0xE5, 0x98, 0xCD, 0x66, 0xE8, + 0x45, 0xC4, 0xC7, 0xF1, 0xC6, 0xD5, 0x75, 0xF3, 0xCB, 0xFD, 0xDC, 0x04, + 0x06, 0x1D, 0x64, 0x17, 0x02, 0x1E, 0x92, 0x10, 0x0B, 0x09, 0x4B, 0x0B, + 0x3A, 0xEA, 0x11, 0xFE, 0xA0, 0xCD, 0x61, 0xDF, 0x3E, 0xC2, 0x59, 0xCD, + 0xEE, 0xC9, 0x40, 0xCA, 0xAE, 0xD4, 0xD7, 0xCA, 0x84, 0xD9, 0xB5, 0xCC, + 0xBC, 0xE3, 0xB7, 0xD2, 0x69, 0xED, 0xD3, 0xD3, 0xE3, 0xDF, 0x9F, 0xD0, + 0x95, 0xCE, 0x1B, 0xE2, 0xD1, 0xD3, 0x62, 0xF6, 0x6E, 0xE4, 0x1C, 0xEF, + 0xBF, 0xEF, 0x59, 0xE8, 0x33, 0x01, 0xFE, 0xF6, 0x5C, 0x20, 0x7C, 0x04, + 0xA7, 0x2C, 0x77, 0x0C, 0x49, 0x17, 0xF6, 0x0A, 0x63, 0xF4, 0x8A, 0xF8, + 0x93, 0xD8, 0xCD, 0xE7, 0xB8, 0xCF, 0x09, 0xDC, 0x48, 0xD0, 0x9E, 0xD5, + 0x87, 0xCA, 0x5F, 0xD7, 0xF5, 0xBD, 0x19, 0xD1, 0xD0, 0xB7, 0xB8, 0xC8, + 0xB2, 0xB7, 0x53, 0xC6, 0xF8, 0xB3, 0xE7, 0xCD, 0x68, 0xBB, 0x12, 0xDE, + 0x92, 0xD3, 0x0D, 0xE6, 0x27, 0xEE, 0x77, 0xF2, 0x85, 0xFC, 0x10, 0x02, + 0x4C, 0xF4, 0x9B, 0x0C, 0xD6, 0xE1, 0x29, 0x15, 0x67, 0xE0, 0xE6, 0x1D, + 0x82, 0xF7, 0x3B, 0x31, 0x4A, 0x15, 0x1A, 0x44, 0xED, 0x22, 0x98, 0x4B, + 0x46, 0x1E, 0x8E, 0x45, 0x91, 0x18, 0xF4, 0x3B, 0x8C, 0x0E, 0x56, 0x39, + 0x13, 0xFC, 0xEB, 0x26, 0x44, 0xEF, 0x34, 0x05, 0x70, 0xEC, 0x5D, 0xF6, + 0x06, 0xFA, 0x08, 0xF6, 0xF4, 0x0C, 0x15, 0xEF, 0xAD, 0x12, 0x71, 0xEC, + 0xBE, 0x0F, 0x64, 0xF0, 0x04, 0x0F, 0x61, 0xEB, 0xFC, 0x0C, 0xCA, 0xE2, + 0xED, 0xFF, 0x25, 0xE9, 0x96, 0xF7, 0xA4, 0xF3, 0x26, 0xFE, 0x9C, 0xF9, + 0x81, 0x08, 0xBC, 0x04, 0xDE, 0x0A, 0xB9, 0x0A, 0x85, 0x08, 0x33, 0x0F, + 0x5C, 0x05, 0x58, 0x16, 0x1A, 0xFE, 0x84, 0x16, 0x10, 0xFA, 0xC1, 0x06, + 0xA1, 0xFE, 0x3E, 0xEE, 0x1C, 0x08, 0xD9, 0xE7, 0x84, 0x0F, 0x40, 0xE9, + 0xA9, 0x10, 0xB6, 0xEC, 0x0B, 0x0B, 0xD4, 0x02, 0x0F, 0x05, 0x86, 0x12, + 0xD1, 0x05, 0x3C, 0x18, 0x3D, 0x0A, 0x38, 0x21, 0xDD, 0x14, 0x01, 0x1F, + 0xF9, 0x1F, 0xBE, 0x12, 0x41, 0x1F, 0xDA, 0x01, 0x2A, 0x0E, 0xEB, 0xE6, + 0xDD, 0xF3, 0x2F, 0xD2, 0x4C, 0xD6, 0xDE, 0xD1, 0x8F, 0xBC, 0x1F, 0xD2, + 0x6E, 0xBC, 0xF9, 0xC8, 0x69, 0xD1, 0x11, 0xC0, 0xCC, 0xE8, 0x02, 0xBC, + 0xA2, 0xF9, 0xC6, 0xB8, 0x4A, 0xFB, 0x7A, 0xB5, 0xAA, 0xF4, 0xE4, 0xBD, + 0x13, 0xF2, 0xEB, 0xD0, 0x92, 0xEB, 0x0B, 0xDA, 0x66, 0xE7, 0xFD, 0xDF, + 0xFF, 0xF8, 0x58, 0xEA, 0xF5, 0x0E, 0xD1, 0xF0, 0x43, 0x07, 0x16, 0xF3, + 0x6D, 0xEB, 0x1F, 0xEB, 0xAE, 0xD8, 0x73, 0xDE, 0xA1, 0xCE, 0x2F, 0xC7, + 0x67, 0xBD, 0xB4, 0xAC, 0xA6, 0xAA, 0xAC, 0xA9, 0xAB, 0xA5, 0x9A, 0xA4, + 0x75, 0xA8, 0x18, 0x9D, 0x9C, 0xAD, 0xC5, 0xA2, 0xA9, 0xAA, 0x9C, 0xA4, + 0xB8, 0x9E, 0x27, 0xA8, 0x34, 0xA2, 0xD0, 0xB6, 0x5E, 0xBA, 0xC5, 0xC7, + 0xD7, 0xD4, 0x1A, 0xCC, 0x10, 0xDA, 0x30, 0xCD, 0xF0, 0xD6, 0xEA, 0xD6, + 0x3D, 0xE8, 0x22, 0xE3, 0x62, 0xFE, 0xF7, 0xF7, 0xD1, 0x05, 0x8E, 0x0B, + 0x8A, 0x03, 0x64, 0x07, 0x3A, 0xFE, 0xD2, 0xFB, 0xD6, 0xFA, 0xAA, 0xF9, + 0xCE, 0x05, 0xAB, 0xF8, 0x1D, 0x09, 0x22, 0xF4, 0xD6, 0xF6, 0x24, 0xF5, + 0x6C, 0xEB, 0xF9, 0xFC, 0xE2, 0xE5, 0x48, 0xF8, 0xDD, 0xDF, 0x92, 0xE1, + 0xC2, 0xDB, 0xF4, 0xCB, 0x33, 0xE2, 0x40, 0xCE, 0xA6, 0xEE, 0x57, 0xE1, + 0x62, 0xEF, 0x27, 0xEC, 0x39, 0xF5, 0x0F, 0xE5, 0xB8, 0x09, 0xDF, 0xDF, + 0x44, 0x16, 0x98, 0xE4, 0xC0, 0x0D, 0x46, 0xED, 0x71, 0xF4, 0x32, 0xF1, + 0xB5, 0xEA, 0xBA, 0xE7, 0x09, 0x03, 0x71, 0xE5, 0x1D, 0x1D, 0xCD, 0xF6, + 0x93, 0x11, 0x0A, 0x00, 0xA6, 0xFA, 0xA1, 0xEC, 0xD4, 0xFD, 0x24, 0xDC, + 0x1D, 0x04, 0xE3, 0xE3, 0x6B, 0x0C, 0xA5, 0xEB, 0xAE, 0x18, 0xC9, 0xED, + 0xAC, 0x18, 0xB3, 0xFA, 0x4E, 0x15, 0xEB, 0x0C, 0xDA, 0x13, 0xAB, 0x15, + 0x11, 0x0C, 0x3F, 0x1B, 0xBD, 0x01, 0x60, 0x24, 0xE7, 0x09, 0x9D, 0x27, + 0xDB, 0x19, 0xF1, 0x17, 0x19, 0x14, 0xFE, 0xFA, 0x2C, 0x0A, 0xB3, 0xE6, + 0x2F, 0x02, 0xFA, 0xDD, 0x15, 0xE6, 0xB7, 0xE1, 0x0F, 0xC8, 0x42, 0xE4, + 0x42, 0xCB, 0xB0, 0xE1, 0x92, 0xEA, 0x13, 0xED, 0x46, 0x0F, 0x14, 0x02, + 0x7D, 0x28, 0x59, 0x18, 0x16, 0x2D, 0x4B, 0x1D, 0x55, 0x28, 0xC7, 0x0F, + 0xDB, 0x23, 0x65, 0x0E, 0xDD, 0x22, 0x3A, 0x17, 0x0F, 0x22, 0x51, 0x22, + 0x06, 0x1F, 0x21, 0x35, 0x0E, 0x22, 0xB0, 0x39, 0xEF, 0x2C, 0xA4, 0x2A, + 0x92, 0x26, 0x26, 0x14, 0xA0, 0x06, 0x70, 0x06, 0xCB, 0xED, 0x61, 0x0D, + 0x6E, 0xEA, 0xA5, 0x0C, 0x02, 0xF3, 0xD5, 0xF7, 0x57, 0xF4, 0x41, 0xE9, + 0x91, 0xE3, 0x6F, 0xE9, 0x07, 0xDC, 0xFE, 0xEF, 0x75, 0xF2, 0x6B, 0xFA, + 0x7B, 0x15, 0x8F, 0x01, 0xD1, 0x30, 0x8C, 0x0A, 0xEF, 0x40, 0xB7, 0x1D, + 0xCD, 0x4D, 0xB1, 0x35, 0x5F, 0x57, 0xB7, 0x43, 0xF7, 0x60, 0xE5, 0x4A, + 0x68, 0x61, 0x1C, 0x52, 0xA8, 0x56, 0x5E, 0x56, 0xE5, 0x50, 0x22, 0x5D, + 0x84, 0x4C, 0x6E, 0x5A, 0xF5, 0x4F, 0xD4, 0x4B, 0x0F, 0x58, 0xE1, 0x4A, + 0x8A, 0x58, 0x16, 0x57, 0xC4, 0x5B, 0x08, 0x57, 0x27, 0x51, 0x91, 0x49, + 0x02, 0x38, 0x14, 0x3A, 0xA1, 0x27, 0xCF, 0x23, 0xA0, 0x22, 0x09, 0x22, + 0x23, 0x1E, 0x62, 0x2B, 0x1A, 0x17, 0x21, 0x23, 0x54, 0x1B, 0x4C, 0x2A, + 0x51, 0x2C, 0x14, 0x44, 0xD9, 0x36, 0xD1, 0x4C, 0xA9, 0x35, 0x2A, 0x42, + 0x54, 0x2F, 0x30, 0x38, 0xA9, 0x30, 0xF5, 0x35, 0x92, 0x3A, 0xFA, 0x35, + 0x44, 0x3F, 0xF2, 0x3F, 0xE1, 0x31, 0x3A, 0x3F, 0x98, 0x11, 0xA1, 0x24, + 0x1F, 0x03, 0x3D, 0x1F, 0x5A, 0x12, 0xA5, 0x2C, 0xEB, 0x24, 0x12, 0x2E, + 0x84, 0x2A, 0xE9, 0x2B, 0x69, 0x31, 0x7A, 0x2E, 0x22, 0x43, 0x7A, 0x25, + 0x12, 0x52, 0xC2, 0x1A, 0x8F, 0x4E, 0xB4, 0x21, 0x31, 0x38, 0x9F, 0x2A, + 0x4E, 0x1D, 0xB7, 0x2E, 0xC6, 0x0B, 0x15, 0x26, 0x80, 0x0D, 0x0B, 0x0E, + 0x12, 0x17, 0xA8, 0x00, 0x19, 0x1C, 0x48, 0x03, 0x98, 0x15, 0x90, 0x02, + 0x78, 0x02, 0x68, 0xFF, 0x95, 0xF1, 0x4D, 0xF6, 0xB1, 0xED, 0x31, 0xF5, + 0x05, 0xFA, 0x13, 0x07, 0x63, 0x12, 0x9F, 0x0F, 0xF9, 0x24, 0xBF, 0x13, + 0xE7, 0x28, 0x56, 0x1F, 0x44, 0x23, 0x14, 0x2E, 0x71, 0x1D, 0xF0, 0x3B, + 0x71, 0x1A, 0x79, 0x3B, 0x76, 0x17, 0x92, 0x36, 0xED, 0x18, 0xBE, 0x38, + 0x31, 0x17, 0x60, 0x34, 0x0B, 0x08, 0xFD, 0x1B, 0xE8, 0xE6, 0x24, 0x00, + 0xAA, 0xCC, 0x34, 0xF8, 0xF3, 0xD6, 0xF2, 0xEE, 0x76, 0xE7, 0x24, 0xE2, + 0x1E, 0xE0, 0x96, 0xDB, 0xC4, 0xCE, 0x6D, 0xD0, 0x9B, 0xC8, 0xC2, 0xCC, + 0x44, 0xCF, 0xE8, 0xDC, 0xD2, 0xD9, 0x00, 0xF6, 0xA6, 0xF6, 0x5C, 0x06, + 0xF6, 0x1D, 0x9B, 0x0F, 0x42, 0x37, 0x41, 0x18, 0x03, 0x43, 0xF9, 0x21, + 0x67, 0x38, 0x1C, 0x32, 0x67, 0x1E, 0xE2, 0x42, 0x00, 0x14, 0x40, 0x4C, + 0x67, 0x21, 0xB9, 0x43, 0x9E, 0x29, 0xA6, 0x35, 0x03, 0x22, 0xFD, 0x33, + 0x97, 0x24, 0xAC, 0x2E, 0xEC, 0x27, 0x2D, 0x27, 0xD7, 0x22, 0xE9, 0x29, + 0xC2, 0x1B, 0x27, 0x2C, 0xAE, 0x0A, 0xCC, 0x23, 0x83, 0xF8, 0xB4, 0x0F, + 0x67, 0xFB, 0xF9, 0x0A, 0x36, 0x08, 0xF2, 0x13, 0x80, 0x0A, 0xF3, 0x08, + 0x4A, 0x0F, 0xC4, 0xF8, 0xCB, 0x1D, 0xB8, 0xFF, 0x5F, 0x28, 0x8B, 0x0E, + 0x07, 0x25, 0x34, 0x10, 0xD4, 0x14, 0xBB, 0x0F, 0x9C, 0x0D, 0xF4, 0x14, + 0xD5, 0x19, 0x5C, 0x1A, 0xD7, 0x21, 0x26, 0x1E, 0x7F, 0x0D, 0x26, 0x13, + 0x11, 0xF0, 0x00, 0x02, 0x97, 0xE8, 0x4F, 0x04, 0x52, 0xF1, 0x3D, 0x0D, + 0xEB, 0x01, 0x05, 0x12, 0x20, 0x0A, 0x0C, 0x15, 0x9D, 0x05, 0xB8, 0x1D, + 0xBB, 0x01, 0x8F, 0x2C, 0x2A, 0x0B, 0x68, 0x33, 0x22, 0x16, 0x32, 0x2C, + 0x4D, 0x00, 0x13, 0x1D, 0x83, 0xE0, 0x4C, 0x15, 0xFD, 0xDA, 0x35, 0x0E, + 0x2A, 0xE1, 0x42, 0xF8, 0xAA, 0xE1, 0xE4, 0xED, 0xB7, 0xDE, 0xB2, 0xF1, + 0x5D, 0xDD, 0x10, 0xDF, 0xC2, 0xD9, 0x97, 0xC3, 0x05, 0xD5, 0xEC, 0xBD, + 0x37, 0xD3, 0xE1, 0xC4, 0xD0, 0xDA, 0x76, 0xCC, 0xB6, 0xF5, 0x5E, 0xDA, + 0xBE, 0x10, 0xE8, 0xE7, 0xEF, 0x08, 0x2A, 0xF0, 0x63, 0xEE, 0x32, 0xF5, + 0xAA, 0xF1, 0x04, 0xEC, 0x17, 0xFF, 0x0E, 0xE8, 0x9E, 0xFA, 0x22, 0xF7, + 0xAC, 0xF8, 0xC2, 0xFC, 0xA1, 0xF5, 0x77, 0xF1, 0x1E, 0xE3, 0xD8, 0xD9, + 0xF2, 0xC7, 0x05, 0xC5, 0x36, 0xB0, 0x53, 0xBD, 0xD1, 0xA1, 0xC7, 0xB6, + 0xD9, 0x9F, 0xA4, 0xAF, 0x40, 0xA0, 0xEE, 0xA6, 0x38, 0x9C, 0xFA, 0xA0, + 0x51, 0xA1, 0xD0, 0x9E, 0x04, 0xAC, 0xEF, 0xAB, 0x08, 0xB8, 0x3C, 0xC7, + 0xBA, 0xCA, 0x35, 0xD9, 0xF0, 0xDD, 0xCA, 0xE3, 0xF1, 0xEB, 0xE2, 0xE4, + 0x0C, 0xF6, 0xC3, 0xEA, 0x90, 0x03, 0x8E, 0xFA, 0x3C, 0x0A, 0xCE, 0x01, + 0x23, 0x03, 0x9A, 0x03, 0x93, 0xF5, 0xCC, 0xFE, 0x32, 0xE2, 0x54, 0xFD, + 0xE2, 0xE2, 0x07, 0xFD, 0xC1, 0xF7, 0xFB, 0xF6, 0x8E, 0x02, 0x4E, 0xF4, + 0x55, 0x00, 0x2C, 0xF0, 0x23, 0xE9, 0x6D, 0xE9, 0x1E, 0xC8, 0x30, 0xDF, + 0x29, 0xA8, 0x90, 0xD4, 0x0C, 0x9C, 0xF7, 0xD6, 0x70, 0xAD, 0xD6, 0xD9, + 0x8B, 0xBE, 0xCD, 0xD5, 0xE2, 0xCE, 0x01, 0xD1, 0xE6, 0xE7, 0xD5, 0xD4, + 0x07, 0xFE, 0xD2, 0xD5, 0x64, 0x01, 0x53, 0xCA, 0x12, 0xF5, 0x19, 0xC9, + 0x1B, 0xF4, 0x9A, 0xCB, 0xD3, 0xF9, 0x90, 0xCC, 0x44, 0xF1, 0x7B, 0xD9, + 0xF3, 0xE1, 0x54, 0xE7, 0xA9, 0xD9, 0xA1, 0xE4, 0x79, 0xE4, 0x5F, 0xD8, + 0xB2, 0xF3, 0xB7, 0xD1, 0x88, 0xF4, 0x7D, 0xDA, 0x55, 0xE7, 0xA7, 0xE8, + 0xB5, 0xDB, 0x74, 0xEF, 0xD8, 0xE6, 0xF2, 0xF7, 0xC8, 0xFE, 0x7D, 0x01, + 0xAF, 0x06, 0x66, 0x02, 0x03, 0xFB, 0x0E, 0x04, 0xBA, 0xEB, 0x57, 0x05, + 0x71, 0xDE, 0xAA, 0xF9, 0x7E, 0xD0, 0xB6, 0xE6, 0x6F, 0xCE, 0x93, 0xDE, + 0x25, 0xCE, 0xD4, 0xE4, 0xEF, 0xBC, 0xBD, 0xE9, 0xD3, 0xB5, 0x2E, 0xE1, + 0x79, 0xBD, 0xE8, 0xDA, 0xEC, 0xCB, 0x2A, 0xE4, 0x5C, 0xEB, 0x88, 0xE6, + 0x09, 0x0A, 0x5F, 0xEE, 0x90, 0x15, 0x69, 0x04, 0xCC, 0x15, 0x2B, 0x0D, + 0x56, 0x16, 0x68, 0x09, 0x5C, 0x1D, 0x40, 0x01, 0xC0, 0x28, 0x39, 0x00, + 0x0D, 0x30, 0x09, 0x06, 0xBE, 0x26, 0xB5, 0x08, 0x09, 0x10, 0x51, 0x08, + 0x51, 0xFD, 0x47, 0xF4, 0x63, 0xF0, 0x64, 0xD4, 0xAF, 0xE2, 0x84, 0xC6, + 0xBA, 0xD6, 0x3B, 0xC9, 0x99, 0xCE, 0x90, 0xC0, 0xAC, 0xC8, 0x90, 0xBA, + 0x88, 0xCB, 0x25, 0xCC, 0x17, 0xDE, 0x6B, 0xCC, 0x08, 0xEC, 0x7D, 0xC4, + 0xA9, 0xF3, 0xD6, 0xD9, 0x47, 0x10, 0x82, 0xF5, 0x2A, 0x2F, 0x33, 0x0C, + 0x2B, 0x2E, 0x96, 0x1F, 0x9C, 0x1C, 0xDD, 0x27, 0x53, 0x23, 0x62, 0x2E, + 0x63, 0x35, 0x11, 0x35, 0x98, 0x33, 0x7F, 0x32, 0x07, 0x27, 0x79, 0x28, + 0x97, 0x15, 0xFC, 0x24, 0x98, 0x0F, 0x89, 0x29, 0x57, 0x17, 0x40, 0x28, + 0xBA, 0x14, 0xF9, 0x28, 0x3E, 0x05, 0xB1, 0x26, 0x0F, 0xF4, 0x0E, 0x0B, + 0x0E, 0xEF, 0xF4, 0xEE, 0xBE, 0xED, 0x8C, 0xEB, 0x42, 0xEC, 0x31, 0xEA, + 0xE7, 0xED, 0x90, 0xDF, 0x54, 0xEE, 0x05, 0xEA, 0x7F, 0xFB, 0x00, 0xFF, + 0xAE, 0x0F, 0x54, 0x03, 0x0C, 0x15, 0xB9, 0x04, 0x1C, 0x16, 0x86, 0xFF, + 0xB3, 0x12, 0x5F, 0xF6, 0x03, 0x05, 0xA4, 0xF9, 0xC8, 0x09, 0x97, 0xFD, + 0xC3, 0x17, 0x19, 0xFD, 0x2C, 0x08, 0x58, 0xF9, 0xC1, 0xF2, 0x19, 0xF1, + 0xDC, 0xF4, 0x70, 0xEC, 0x4A, 0xFC, 0x93, 0xEB, 0x12, 0xFE, 0x89, 0xE9, + 0x30, 0x04, 0xB7, 0xE8, 0xA9, 0x08, 0x20, 0xEB, 0x1A, 0xFD, 0x80, 0xF9, + 0x97, 0xF4, 0xFB, 0x10, 0xD6, 0xF9, 0x47, 0x17, 0x31, 0xF3, 0x70, 0x14, + 0x26, 0xE1, 0x31, 0x08, 0x8A, 0xDB, 0x9F, 0xE2, 0xD2, 0xD6, 0x11, 0xD0, + 0x08, 0xCD, 0xC0, 0xD9, 0xDF, 0xCE, 0xA1, 0xC8, 0xE0, 0xCF, 0x1E, 0xAA, + 0xA8, 0xC9, 0x1E, 0xA9, 0x2F, 0xCD, 0x23, 0xB9, 0x06, 0xE0, 0xB4, 0xCC, + 0x3F, 0xFD, 0x0C, 0xDB, 0x12, 0x14, 0x32, 0xDD, 0x7A, 0x15, 0xA8, 0xE4, + 0x31, 0x09, 0x18, 0xF2, 0xC5, 0x01, 0x1B, 0xF7, 0x32, 0x06, 0xF2, 0xF6, + 0x8D, 0x0D, 0x99, 0xFD, 0xD4, 0x0E, 0x78, 0x07, 0x32, 0x0D, 0x79, 0x08, + 0xA4, 0x07, 0x2B, 0x01, 0xD4, 0xF4, 0xF9, 0xED, 0xE2, 0xD8, 0x36, 0xCD, + 0x12, 0xBE, 0x51, 0xB1, 0x1C, 0xB0, 0x21, 0xA9, 0x42, 0xAE, 0x32, 0xA5, + 0x41, 0xB3, 0x4A, 0xA0, 0xCD, 0xC6, 0x45, 0xA8, 0x8C, 0xDF, 0x92, 0xB4, + 0x81, 0xF2, 0xEA, 0xC2, 0xC6, 0x00, 0xF9, 0xDB, 0xE9, 0x01, 0x8C, 0xF1, + 0x95, 0x01, 0x2D, 0xF7, 0x9F, 0x0D, 0x80, 0xF9, 0x13, 0x19, 0xBA, 0x0A, + 0x72, 0x23, 0xF1, 0x20, 0xAC, 0x2E, 0xE5, 0x29, 0xEC, 0x30, 0x7E, 0x2C, + 0xC4, 0x2A, 0x9A, 0x27, 0xF6, 0x23, 0xCB, 0x14, 0x1D, 0x19, 0xF5, 0x05, + 0x25, 0x07, 0xBA, 0x0C, 0x16, 0xFE, 0x28, 0x1C, 0xA9, 0xF8, 0x57, 0x1C, + 0xC0, 0xEC, 0xC6, 0x13, 0xAC, 0xE6, 0x3C, 0x06, 0x3A, 0xED, 0xEB, 0x00, + 0x7A, 0xF3, 0x04, 0x0D, 0xF1, 0xF5, 0xD1, 0x15, 0x70, 0x01, 0xA1, 0x1F, + 0xDB, 0x0E, 0x75, 0x29, 0xD8, 0x20, 0x6C, 0x2C, 0xD5, 0x34, 0x51, 0x2D, + 0x45, 0x2A, 0x06, 0x21, 0x7E, 0x0D, 0xC0, 0x0B, 0xEF, 0x14, 0xFD, 0x0E, + 0xE6, 0x3F, 0xDA, 0x26, 0x66, 0x54, 0xC4, 0x28, 0xA8, 0x41, 0x01, 0x1D, + 0xDD, 0x36, 0x4D, 0x22, 0x88, 0x3A, 0x23, 0x2D, 0x58, 0x2B, 0xC2, 0x37, + 0xE2, 0x17, 0xD6, 0x3D, 0xFE, 0x15, 0x20, 0x40, 0x81, 0x25, 0xD6, 0x50, + 0x27, 0x47, 0xA5, 0x5B, 0x2F, 0x62, 0x2F, 0x58, 0x60, 0x5D, 0xF0, 0x53, + 0x82, 0x44, 0x2A, 0x43, 0xCD, 0x24, 0x75, 0x2F, 0x81, 0x09, 0xA2, 0x2A, + 0x3F, 0x00, 0x80, 0x28, 0x75, 0x07, 0x5B, 0x1C, 0xAA, 0x11, 0x28, 0x11, + 0xDA, 0x1D, 0xA8, 0x16, 0xC6, 0x2A, 0xC5, 0x20, 0xAE, 0x2A, 0xD1, 0x27, + 0x1E, 0x30, 0xE5, 0x32, 0x7E, 0x48, 0x9A, 0x3E, 0x53, 0x5B, 0x28, 0x45, + 0x39, 0x60, 0x7B, 0x49, 0x69, 0x5B, 0xAD, 0x4F, 0x26, 0x58, 0xD6, 0x4C, + 0xD0, 0x5D, 0x08, 0x48, 0x58, 0x60, 0x87, 0x49, 0xA7, 0x54, 0x94, 0x43, + 0xCA, 0x3D, 0xBE, 0x42, 0xD7, 0x2A, 0x7E, 0x45, 0x03, 0x1D, 0x17, 0x3D, + 0x6E, 0x12, 0x63, 0x2F, 0xC2, 0x07, 0xCE, 0x1B, 0xB0, 0xF8, 0x50, 0x0C, + 0xF4, 0xF1, 0x03, 0x04, 0x80, 0xF0, 0xD1, 0x03, 0x17, 0xF6, 0x70, 0x10, + 0x50, 0x0F, 0xF7, 0x1F, 0xEE, 0x28, 0xF8, 0x32, 0xA2, 0x35, 0x39, 0x49, + 0x6E, 0x3A, 0x5D, 0x56, 0xD9, 0x3E, 0x67, 0x4F, 0x7A, 0x46, 0x1A, 0x41, + 0x78, 0x4E, 0xEA, 0x40, 0x9E, 0x57, 0x0D, 0x4D, 0x63, 0x58, 0x66, 0x5F, + 0x39, 0x50, 0x81, 0x64, 0x47, 0x47, 0x9F, 0x55, 0xCB, 0x3E, 0x57, 0x45, + 0x48, 0x3B, 0x67, 0x32, 0x8F, 0x36, 0x3F, 0x28, 0xD9, 0x28, 0x0D, 0x2F, + 0xF6, 0x19, 0xB6, 0x30, 0x95, 0x12, 0xF3, 0x2A, 0x07, 0x0F, 0x3E, 0x2A, + 0xF1, 0x0B, 0xF8, 0x25, 0x38, 0x11, 0x0F, 0x1A, 0xA9, 0x17, 0xC5, 0x1A, + 0x2A, 0x18, 0x5D, 0x2E, 0x92, 0x1C, 0x90, 0x40, 0x87, 0x22, 0xE9, 0x42, + 0xF3, 0x1A, 0x90, 0x36, 0x35, 0x07, 0x2B, 0x23, 0x92, 0x03, 0x2C, 0x22, + 0xC8, 0x0E, 0x94, 0x35, 0xCB, 0x09, 0xBD, 0x39, 0x04, 0xFE, 0x78, 0x23, + 0xA4, 0x0E, 0xBF, 0x15, 0xFB, 0x26, 0x77, 0x21, 0x9A, 0x28, 0xF0, 0x20, + 0x03, 0x1D, 0x35, 0x12, 0x4C, 0x15, 0xA5, 0x19, 0x17, 0x23, 0xA8, 0x24, + 0x47, 0x33, 0x66, 0x27, 0xFB, 0x2B, 0x6A, 0x32, 0x51, 0x15, 0xED, 0x31, + 0x39, 0x01, 0xE2, 0x19, 0x10, 0xE8, 0x82, 0xFA, 0x48, 0xCE, 0x4D, 0xE6, + 0x05, 0xD6, 0xDE, 0xE2, 0xDB, 0xE3, 0x87, 0xED, 0x75, 0xE1, 0x3B, 0xF3, + 0xB0, 0xE8, 0x89, 0xF0, 0x7E, 0xF4, 0xEC, 0xF8, 0xC9, 0xF7, 0x1F, 0xFE, + 0x37, 0xF5, 0x04, 0x00, 0x43, 0xFA, 0xC1, 0x01, 0x87, 0x0D, 0x7E, 0x08, + 0x8E, 0x21, 0x68, 0x12, 0x26, 0x33, 0x19, 0x0A, 0x68, 0x39, 0x77, 0x09, + 0x79, 0x2F, 0xE5, 0x1A, 0x95, 0x23, 0x47, 0x28, 0x23, 0x18, 0x95, 0x26, + 0xD1, 0x02, 0x33, 0x0F, 0xD3, 0xE4, 0x30, 0xE7, 0x52, 0xCF, 0x60, 0xC2, + 0x76, 0xCD, 0x78, 0xC1, 0xD6, 0xD4, 0xB9, 0xD1, 0xCA, 0xD0, 0xDC, 0xD2, + 0xD6, 0xC3, 0x65, 0xCF, 0x50, 0xC5, 0x89, 0xC8, 0x89, 0xD3, 0xF8, 0xBA, + 0xC6, 0xE4, 0xC8, 0xBA, 0x23, 0xF6, 0x0C, 0xDE, 0xFD, 0xF8, 0x6E, 0x01, + 0x8D, 0xF7, 0xDB, 0x09, 0x2B, 0x03, 0xE9, 0x14, 0xA0, 0x13, 0x26, 0x1F, + 0xE5, 0x15, 0xBF, 0x1C, 0x6D, 0x0E, 0xBC, 0x24, 0x07, 0x13, 0xB2, 0x2F, + 0x94, 0x14, 0x43, 0x30, 0x83, 0x05, 0x08, 0x35, 0xB4, 0xF7, 0x43, 0x31, + 0x40, 0xEF, 0xD8, 0x23, 0x88, 0xE7, 0xE6, 0x24, 0x50, 0xE3, 0xA1, 0x1A, + 0xCE, 0xE5, 0x17, 0xFB, 0x11, 0xE2, 0xE9, 0xE7, 0x00, 0xDE, 0xC2, 0xE9, + 0x5D, 0xDB, 0x71, 0xEC, 0x06, 0xD7, 0x06, 0xF1, 0x32, 0xE0, 0xD4, 0xF7, + 0x9A, 0xE8, 0x83, 0xF7, 0x87, 0xE6, 0x84, 0xFC, 0x78, 0xE6, 0x0A, 0x00, + 0x1F, 0xE8, 0xB1, 0xF2, 0x6A, 0xF4, 0x03, 0xE8, 0xBD, 0x08, 0xE5, 0xF3, + 0x14, 0x02, 0x2D, 0x02, 0x4C, 0xE3, 0x2A, 0xF9, 0xAA, 0xD2, 0xCA, 0xE3, + 0x03, 0xE0, 0x75, 0xDC, 0xF2, 0xFA, 0x5F, 0xE0, 0x74, 0x12, 0x60, 0xE8, + 0x1D, 0x1D, 0x1C, 0xF4, 0x17, 0x15, 0xCE, 0xFB, 0x94, 0x0C, 0x54, 0x02, + 0xC9, 0x0E, 0xB6, 0x08, 0xA6, 0x0A, 0xFD, 0x04, 0xB9, 0xF4, 0xBE, 0xF6, + 0x01, 0xD0, 0x38, 0xE4, 0x94, 0xB5, 0x6C, 0xCD, 0x50, 0xB8, 0xE3, 0xC4, + 0x48, 0xBE, 0xE5, 0xCF, 0xD5, 0xBA, 0x63, 0xD3, 0x43, 0xBA, 0x41, 0xCF, + 0x86, 0xBD, 0x03, 0xD4, 0x0B, 0xBF, 0x6D, 0xDD, 0xC2, 0xC5, 0x7F, 0xDA, + 0x4D, 0xD9, 0x44, 0xD1, 0x9B, 0xED, 0x9C, 0xDF, 0xA5, 0xF9, 0xF2, 0xF5, + 0x41, 0x01, 0x05, 0xF8, 0xE4, 0x08, 0xC1, 0xE8, 0xD0, 0x0D, 0x58, 0xD6, + 0x12, 0x0C, 0x1A, 0xD9, 0x91, 0x04, 0xC7, 0xE8, 0x71, 0xF3, 0x0B, 0xED, + 0x90, 0xD7, 0x72, 0xE4, 0x56, 0xB2, 0x2E, 0xD0, 0x0A, 0x9A, 0xDB, 0xB6, + 0x6B, 0xA2, 0x28, 0xA3, 0x6F, 0xAB, 0xAE, 0x9F, 0x17, 0xA9, 0xCB, 0xA4, + 0x41, 0xAD, 0xCB, 0xA4, 0x31, 0xBA, 0x6B, 0xAD, 0x56, 0xCF, 0x6B, 0xB9, + 0x03, 0xE0, 0x73, 0xC4, 0x79, 0xE7, 0x5B, 0xD8, 0x8F, 0xEF, 0x90, 0xE4, + 0x31, 0xF8, 0xF9, 0xE6, 0x31, 0xFA, 0xAC, 0xE8, 0xA8, 0xF7, 0x89, 0xF0, + 0x0C, 0x00, 0x4E, 0x03, 0xF1, 0x0F, 0x2B, 0x13, 0xDE, 0x15, 0x90, 0x11, + 0xE9, 0x03, 0x7F, 0x00, 0x5A, 0xE3, 0x85, 0xF2, 0x81, 0xDE, 0x07, 0xF0, + 0x6E, 0xE8, 0x14, 0xF3, 0x54, 0xE9, 0x77, 0xF8, 0x50, 0xE7, 0xC5, 0xF3, + 0x49, 0xDE, 0x98, 0xED, 0xCE, 0xD4, 0x03, 0xEF, 0x3C, 0xC4, 0x6C, 0xF3, + 0x06, 0xB7, 0xCF, 0xF6, 0x87, 0xC1, 0xAD, 0xEE, 0x4A, 0xDA, 0x25, 0xF4, + 0x6D, 0xF6, 0xB1, 0x05, 0x56, 0x04, 0xD5, 0x03, 0x3C, 0xE8, 0x1E, 0xF9, + 0xCA, 0xCD, 0x55, 0x08, 0xA7, 0xE7, 0x77, 0x21, 0xBE, 0x03, 0x80, 0x1C, + 0x2A, 0xFA, 0x7F, 0x03, 0xC0, 0xF1, 0x59, 0xF4, 0xDA, 0x00, 0xF6, 0xFA, + 0x61, 0x0E, 0xCB, 0x00, 0x07, 0x14, 0xE8, 0xFE, 0xDD, 0x1A, 0x12, 0x00, + 0x16, 0x2B, 0xF8, 0xFC, 0xD4, 0x3E, 0x51, 0xFB, 0xD1, 0x44, 0xA5, 0x01, + 0x0B, 0x40, 0x9D, 0x00, 0xD7, 0x30, 0xA1, 0xF3, 0x93, 0x13, 0x9B, 0xD6, + 0x8D, 0xF8, 0x84, 0xBC, 0xEC, 0xE3, 0x53, 0xC9, 0x2F, 0xD5, 0x7D, 0xD9, + 0x9D, 0xD8, 0x2E, 0xD8, 0xB2, 0xE6, 0xA0, 0xE1, 0x4F, 0xF2, 0x4A, 0xE8, + 0x68, 0xF7, 0x4C, 0xE9, 0x4B, 0xF6, 0xDA, 0xF7, 0x0D, 0xFA, 0xEB, 0x0A, + 0x9E, 0x04, 0x00, 0x10, 0x90, 0x09, 0x2F, 0x05, 0x0B, 0x08, 0x35, 0xFD, + 0xB6, 0x00, 0xC3, 0x00, 0x18, 0xFE, 0x50, 0x09, 0x1C, 0x0B, 0xE8, 0x0D, + 0x4E, 0x0D, 0x90, 0xFE, 0x02, 0xFE, 0xF4, 0xDE, 0x0A, 0xE2, 0x0E, 0xCA, + 0x70, 0xBA, 0xCF, 0xC0, 0xAF, 0xB0, 0xE7, 0xAB, 0x80, 0xC8, 0x77, 0x9F, + 0xBD, 0xCF, 0xC8, 0xAB, 0xB5, 0xC2, 0x40, 0xB3, 0x0F, 0xBB, 0xC0, 0xB5, + 0xF9, 0xC2, 0x93, 0xBB, 0x8A, 0xD9, 0x0C, 0xC3, 0xB6, 0xE9, 0xE6, 0xDB, + 0xE8, 0xF1, 0xB7, 0xF2, 0x97, 0xFD, 0x2B, 0xEF, 0xB1, 0x07, 0x99, 0xF2, + 0x73, 0x09, 0xDD, 0xFE, 0x0F, 0x07, 0x6F, 0xFC, 0x8B, 0x02, 0x63, 0xF5, + 0xC9, 0xFC, 0x30, 0xF2, 0x95, 0x01, 0x2D, 0xEC, 0x18, 0x01, 0x25, 0xE2, + 0xD8, 0xF2, 0x2B, 0xE5, 0x9F, 0xE4, 0xAE, 0xEF, 0x33, 0xDA, 0x51, 0xF3, + 0x51, 0xD6, 0x27, 0xEC, 0x24, 0xCD, 0x5A, 0xEA, 0x3F, 0xC6, 0x65, 0xF4, + 0x39, 0xC5, 0x6B, 0xE9, 0xCC, 0xC0, 0x8C, 0xDF, 0x8F, 0xD1, 0xA4, 0xE4, + 0x6A, 0xF3, 0x02, 0xE5, 0x5C, 0xFC, 0x19, 0xE8, 0x24, 0xEC, 0xA8, 0xEB, + 0xCD, 0xDF, 0x9E, 0xE6, 0xD7, 0xE0, 0x66, 0xDB, 0x84, 0xF1, 0x79, 0xE2, + 0xF9, 0x08, 0xDE, 0xF6, 0x9E, 0x00, 0xC5, 0xF4, 0xBE, 0xE4, 0xD3, 0xF0, + 0x0A, 0xE9, 0x78, 0x0B, 0x9C, 0xF5, 0x83, 0x1A, 0x25, 0xF1, 0x38, 0x0B, + 0x70, 0xFB, 0x2C, 0x0C, 0x2C, 0x1A, 0xF2, 0x1B, 0xEF, 0x28, 0x2D, 0x22, + 0xB4, 0x29, 0x65, 0x28, 0x24, 0x2A, 0xF1, 0x1F, 0x2C, 0x14, 0x67, 0x06, + 0xCA, 0xF8, 0x4A, 0xFA, 0xE0, 0xEF, 0x62, 0xE4, 0xB4, 0xF0, 0x82, 0xC7, + 0x1A, 0xF4, 0xFE, 0xC8, 0xD9, 0xFF, 0x98, 0xD4, 0x04, 0x08, 0x38, 0xDC, + 0x48, 0xFA, 0xEC, 0xE5, 0x96, 0xEC, 0x13, 0xE8, 0xB5, 0xE9, 0x92, 0xE5, + 0x23, 0xF1, 0xF6, 0xF9, 0x2E, 0x02, 0x2A, 0x1D, 0x42, 0x0A, 0x65, 0x21, + 0xE0, 0x0C, 0xD1, 0x07, 0xDC, 0x13, 0x0D, 0xF9, 0x93, 0x19, 0x7A, 0xFE, + 0xB0, 0x1A, 0x3F, 0xFE, 0x3F, 0x11, 0xEC, 0xF7, 0xD8, 0xFB, 0x7A, 0xF3, + 0xA7, 0xE5, 0xED, 0xDF, 0xDC, 0xD2, 0x35, 0xD1, 0xEF, 0xBE, 0x0D, 0xD0, + 0x18, 0xBB, 0x86, 0xCB, 0xBB, 0xCD, 0xA2, 0xD7, 0x59, 0xDB, 0xD5, 0xE9, + 0xED, 0xD6, 0xD5, 0xE9, 0x2A, 0xD0, 0x44, 0xE7, 0x43, 0xDF, 0xF5, 0xEE, + 0xEA, 0xF4, 0x12, 0xFB, 0x46, 0x03, 0x1E, 0x0E, 0xBC, 0x13, 0xFD, 0x28, + 0x58, 0x22, 0xDB, 0x32, 0x47, 0x2D, 0x45, 0x21, 0xCF, 0x33, 0xF6, 0x12, + 0x4C, 0x3D, 0xD6, 0x1E, 0x19, 0x3C, 0x9E, 0x31, 0x9A, 0x25, 0xA8, 0x2F, + 0xC2, 0x13, 0x1F, 0x1D, 0x06, 0x14, 0x62, 0x14, 0x40, 0x17, 0xA1, 0x14, + 0x67, 0x10, 0x7B, 0x18, 0x5E, 0x0E, 0xF2, 0x1F, 0xC5, 0x0F, 0x93, 0x1A, + 0xC4, 0x0D, 0x17, 0x1C, 0xE1, 0x0A, 0xA2, 0x23, 0x5C, 0x06, 0x35, 0x1C, + 0x37, 0x07, 0x45, 0x1B, 0x95, 0x15, 0xBB, 0x23, 0xDD, 0x2D, 0x57, 0x27, + 0x16, 0x38, 0xE5, 0x26, 0x65, 0x29, 0x48, 0x1D, 0x5C, 0x1F, 0x3A, 0x1A, + 0x93, 0x2A, 0x04, 0x2F, 0x89, 0x36, 0x49, 0x40, 0xDB, 0x32, 0x49, 0x32, + 0x00, 0x30, 0x24, 0x23, 0xDD, 0x38, 0x91, 0x35, 0x44, 0x37, 0xDF, 0x44, + 0x20, 0x36, 0x2C, 0x3A, 0x52, 0x4D, 0xA3, 0x3A, 0x13, 0x62, 0xDC, 0x4B, + 0xFF, 0x63, 0xCB, 0x54, 0xA0, 0x61, 0xA8, 0x5B, 0x75, 0x58, 0x90, 0x62, + 0x18, 0x42, 0x31, 0x4B, 0x62, 0x2D, 0xB2, 0x2A, 0xF2, 0x21, 0x82, 0x20, + 0x02, 0x22, 0xF6, 0x12, 0x25, 0x2B, 0x7A, 0x08, 0x12, 0x2C, 0x3B, 0x1B, + 0x14, 0x22, 0x50, 0x36, 0x9D, 0x21, 0x3D, 0x43, 0xE5, 0x35, 0x53, 0x40, + 0x07, 0x49, 0x55, 0x35, 0x0D, 0x54, 0x4F, 0x41, 0xB5, 0x56, 0x9D, 0x5D, + 0x99, 0x4B, 0x5E, 0x60, 0xA7, 0x43, 0xB5, 0x4B, 0x5C, 0x46, 0x5B, 0x34, + 0x44, 0x40, 0x35, 0x30, 0xC4, 0x33, 0xD4, 0x49, 0xF9, 0x2E, 0x89, 0x49, + 0x17, 0x1E, 0xC0, 0x24, 0xC1, 0xFF, 0x65, 0x04, 0x69, 0xEB, 0x94, 0xE9, + 0x05, 0xDE, 0xDD, 0xE7, 0x72, 0xDD, 0x1E, 0xF9, 0x1D, 0xF1, 0x03, 0xFE, + 0xF3, 0xF3, 0x10, 0xF7, 0x84, 0xE6, 0x74, 0xF3, 0x9B, 0xF0, 0xDF, 0xFB, + 0x6F, 0x05, 0x2F, 0x07, 0x7C, 0x0F, 0x51, 0x11, 0x75, 0x23, 0x90, 0x14, + 0x93, 0x3E, 0xE4, 0x11, 0x50, 0x35, 0x4A, 0x18, 0x7A, 0x19, 0xBC, 0x26, + 0xFA, 0x1C, 0xBC, 0x34, 0xEB, 0x2B, 0xD7, 0x44, 0xB1, 0x28, 0xE5, 0x4B, + 0x3D, 0x2A, 0x84, 0x47, 0xB9, 0x2A, 0xC3, 0x3B, 0x8C, 0x14, 0xAF, 0x28, + 0xDF, 0x08, 0x1A, 0x18, 0x8C, 0x0E, 0x4B, 0x0F, 0x35, 0x08, 0x73, 0x15, + 0x07, 0x0F, 0xE5, 0x27, 0x7C, 0x20, 0xC8, 0x26, 0xFC, 0x11, 0xBE, 0x0A, + 0x20, 0xF8, 0x95, 0xFD, 0x19, 0xFF, 0x4E, 0x15, 0xD5, 0x12, 0xFC, 0x26, + 0xD9, 0x04, 0x24, 0x15, 0x38, 0xEF, 0xEF, 0x02, 0x43, 0xEC, 0xA0, 0xFD, + 0x55, 0x07, 0xB1, 0x0D, 0x7F, 0x36, 0xDB, 0x2D, 0xAE, 0x3D, 0xA0, 0x2A, + 0x99, 0x1E, 0x9A, 0x07, 0xD4, 0x17, 0xB0, 0x0E, 0x23, 0x21, 0xBA, 0x30, + 0x9A, 0x13, 0x97, 0x27, 0xF8, 0x13, 0xDA, 0x20, 0x9C, 0x2F, 0x21, 0x35, + 0x1D, 0x3C, 0x75, 0x37, 0xED, 0x3B, 0xB4, 0x39, 0x8E, 0x3B, 0x12, 0x41, + 0x31, 0x2A, 0xAA, 0x35, 0x56, 0x12, 0xA5, 0x22, 0x02, 0x05, 0x97, 0x10, + 0x2D, 0xF6, 0x6F, 0x05, 0x7A, 0xE3, 0x10, 0x08, 0x42, 0xE4, 0x80, 0x15, + 0x21, 0xF7, 0x2F, 0x1A, 0xE1, 0x0A, 0x65, 0x15, 0xD3, 0x1B, 0xAF, 0x10, + 0x6F, 0x23, 0x51, 0x09, 0x4E, 0x2C, 0xC6, 0x0C, 0xDC, 0x42, 0x5B, 0x19, + 0x31, 0x47, 0x3D, 0x17, 0x6B, 0x38, 0x1D, 0x0A, 0xF8, 0x2F, 0x4D, 0x04, + 0xF7, 0x2B, 0xD0, 0x0B, 0xF1, 0x2A, 0xFF, 0x13, 0xB4, 0x1D, 0xED, 0x13, + 0xDC, 0x07, 0x19, 0x18, 0xD4, 0xED, 0x0C, 0x0D, 0xE4, 0xCE, 0x64, 0xF5, + 0x02, 0xBB, 0x2D, 0xE9, 0x6A, 0xB9, 0x51, 0xEA, 0x82, 0xBC, 0xC4, 0xF4, + 0xE0, 0xBA, 0x5F, 0xFD, 0xA7, 0xB6, 0x72, 0xF4, 0xA5, 0xBB, 0xC7, 0xE4, + 0xFC, 0xC9, 0x1B, 0xE3, 0x83, 0xDC, 0xEE, 0xED, 0x0B, 0xF7, 0x3D, 0x07, + 0x0B, 0x00, 0xA1, 0x14, 0x5C, 0xFF, 0xBC, 0x0E, 0xE9, 0x01, 0xB2, 0x06, + 0x18, 0x01, 0x36, 0xFC, 0x00, 0x05, 0xC0, 0xFA, 0xBE, 0x03, 0x95, 0xFB, + 0x6D, 0x0A, 0xB6, 0xFE, 0xD7, 0x11, 0xE1, 0x02, 0xA3, 0x08, 0x5F, 0xF6, + 0x3E, 0xFB, 0x7E, 0xE5, 0xCC, 0xE9, 0x4A, 0xD8, 0x49, 0xE0, 0x39, 0xD0, + 0x40, 0xDC, 0xB9, 0xD2, 0x46, 0xD5, 0xE2, 0xD7, 0xCD, 0xC6, 0x15, 0xD2, + 0xF0, 0xBF, 0xF4, 0xCA, 0x44, 0xD7, 0xD5, 0xD6, 0xD4, 0xDE, 0x0B, 0xE8, + 0xBA, 0xCA, 0x31, 0xE4, 0x32, 0xC7, 0x50, 0xD8, 0x32, 0xBD, 0x1B, 0xCC, + 0x1E, 0xB9, 0x61, 0xC8, 0x2E, 0xDF, 0x93, 0xE4, 0x7E, 0xF2, 0x18, 0xF6, + 0xEB, 0xCE, 0x31, 0xDE, 0x37, 0xC2, 0x71, 0xD1, 0xE7, 0xE2, 0x64, 0xE0, + 0x18, 0xDC, 0x66, 0xE6, 0x3C, 0xCF, 0xDB, 0xE8, 0xF8, 0xFB, 0xBF, 0xFB, + 0x1E, 0x19, 0xFF, 0x05, 0x3A, 0x0C, 0xAA, 0xF9, 0x08, 0xFF, 0xFD, 0xEA, + 0xD1, 0xE5, 0x17, 0xDE, 0x7B, 0xC2, 0xA1, 0xCB, 0x87, 0xB8, 0x4A, 0xC1, + 0xAE, 0xBB, 0xBC, 0xC0, 0x03, 0xBB, 0x2A, 0xBD, 0x97, 0xC5, 0x20, 0xCA, + 0xF8, 0xC9, 0x60, 0xD9, 0x77, 0xC7, 0x29, 0xD6, 0xAC, 0xCE, 0x02, 0xD9, + 0x67, 0xC9, 0x32, 0xE2, 0xEC, 0xC7, 0x87, 0xE1, 0x5D, 0xF2, 0x5E, 0xEB, + 0x2E, 0x1A, 0x09, 0xF5, 0x47, 0x17, 0x57, 0xE8, 0x7D, 0x0C, 0xBF, 0xE6, + 0x80, 0x0C, 0xC2, 0xEF, 0x5D, 0x10, 0xE3, 0xEC, 0xD3, 0x16, 0x97, 0xEC, + 0xD9, 0x10, 0xAC, 0xF0, 0xA9, 0xF3, 0x9A, 0xE6, 0x32, 0xD8, 0xBC, 0xCE, + 0x27, 0xD0, 0xEB, 0xBC, 0x48, 0xD6, 0x9E, 0xB6, 0xE8, 0xDD, 0x41, 0xC2, + 0x32, 0xD8, 0xF4, 0xDD, 0x79, 0xCB, 0x30, 0xE9, 0xB2, 0xC9, 0xBB, 0xE2, + 0xD7, 0xD2, 0xB7, 0xE2, 0x73, 0xE1, 0xC8, 0xF0, 0xB2, 0xFA, 0x1C, 0x03, + 0x1A, 0x09, 0xED, 0x0A, 0x44, 0xF8, 0x47, 0x13, 0x67, 0xEA, 0x7E, 0x13, + 0xE0, 0xF6, 0x4C, 0x04, 0x89, 0x0A, 0x80, 0x00, 0x49, 0x19, 0xA2, 0x07, + 0xD9, 0x1C, 0x22, 0x16, 0xFD, 0x15, 0xDC, 0x1A, 0xC7, 0x11, 0xDA, 0x0E, + 0x4E, 0x08, 0xCD, 0x02, 0xF4, 0xF8, 0xCE, 0xF4, 0x74, 0xF8, 0xAD, 0xF6, + 0xC6, 0x07, 0x7A, 0x09, 0x20, 0x08, 0x0B, 0x0E, 0x1B, 0xF5, 0xEA, 0xFD, + 0xB7, 0xF1, 0x7F, 0xF1, 0xB9, 0xFE, 0x35, 0xFC, 0x3A, 0x11, 0x1B, 0x0E, + 0xDB, 0x1F, 0xB1, 0x0D, 0x96, 0x13, 0x75, 0x00, 0xCD, 0xF6, 0x93, 0xEC, + 0x96, 0xF8, 0x0B, 0xE0, 0x0E, 0x16, 0x4C, 0xEB, 0xF9, 0x13, 0x78, 0xF4, + 0x51, 0xE8, 0x3D, 0xE4, 0x5B, 0xDE, 0xD2, 0xDB, 0x4F, 0x06, 0x1C, 0xF5, + 0x43, 0x0C, 0x68, 0xF7, 0xB3, 0xFD, 0x72, 0xE0, 0xD7, 0x0D, 0xD4, 0xF3, + 0xB8, 0x18, 0xA5, 0x13, 0xA7, 0x15, 0xC2, 0x14, 0x67, 0x1B, 0xA2, 0x12, + 0x32, 0x10, 0x51, 0x08, 0xAB, 0xE7, 0x5C, 0xF0, 0x04, 0xCF, 0xE4, 0xE6, + 0x14, 0xCA, 0x72, 0xD4, 0x0F, 0xC4, 0x6A, 0xBB, 0x5D, 0xCC, 0xFC, 0xC7, + 0xE1, 0xDD, 0xD0, 0xE2, 0x4F, 0xE1, 0xE7, 0xEE, 0xD4, 0xE0, 0x53, 0xF4, + 0x4E, 0xE6, 0x25, 0xED, 0xD4, 0xED, 0xA0, 0xEB, 0xCA, 0xFD, 0x15, 0xFE, + 0x20, 0x0B, 0xD2, 0x06, 0xC6, 0x02, 0x96, 0x04, 0x03, 0xFD, 0xDD, 0x05, + 0x3E, 0x0B, 0x83, 0x04, 0x19, 0x10, 0xDE, 0xFE, 0x53, 0x0C, 0x7A, 0xFE, + 0xF6, 0x0E, 0x00, 0xFC, 0x46, 0x03, 0xE8, 0xE8, 0x58, 0xE4, 0x4A, 0xCD, + 0x87, 0xD5, 0x7F, 0xAD, 0x78, 0xDB, 0xCD, 0xA3, 0xAE, 0xE2, 0xAA, 0xBE, + 0xBC, 0xEB, 0x96, 0xD1, 0xB3, 0xED, 0x0B, 0xD3, 0x32, 0xEB, 0x53, 0xD9, + 0x43, 0xEF, 0x88, 0xE7, 0xF9, 0xEF, 0xF6, 0xED, 0xC2, 0xEE, 0x21, 0xF5, + 0x88, 0xF9, 0xE5, 0x0E, 0x0C, 0x01, 0x48, 0x16, 0xD7, 0xFB, 0x20, 0x03, + 0x69, 0xFB, 0xA9, 0xF2, 0xD5, 0x02, 0x62, 0xEE, 0x31, 0x07, 0xAE, 0xFA, + 0xE2, 0x08, 0x9C, 0x06, 0x4E, 0xFD, 0x5D, 0xF4, 0xF6, 0xE6, 0xCB, 0xDC, + 0xC8, 0xDA, 0xC5, 0xCE, 0x38, 0xE4, 0x27, 0xC8, 0x52, 0xFB, 0x76, 0xDF, + 0x2A, 0x0D, 0x2D, 0xFA, 0x87, 0x08, 0x04, 0xEE, 0x06, 0xF1, 0x90, 0xCD, + 0x07, 0xEF, 0xDD, 0xC9, 0xE1, 0xF3, 0x81, 0xDC, 0x62, 0xE8, 0x61, 0xE6, + 0x69, 0xE6, 0x0B, 0xE8, 0x22, 0xE7, 0x2A, 0xDC, 0xB4, 0xE0, 0x10, 0xD3, + 0xA1, 0xEE, 0xC1, 0xED, 0x88, 0x08, 0xD0, 0x18, 0xFD, 0xFF, 0xDF, 0x17, + 0x01, 0xF1, 0x88, 0xEC, 0x24, 0x0B, 0xF3, 0xEE, 0xAB, 0x0F, 0x03, 0x0A, + 0x56, 0xDF, 0xE4, 0xEE, 0x2F, 0xDA, 0xF6, 0xDC, 0x59, 0x04, 0x9A, 0xFE, + 0x27, 0x1E, 0x4A, 0x12, 0x6B, 0x24, 0x36, 0x08, 0xF2, 0x19, 0x50, 0xFF, + 0x44, 0x00, 0x3A, 0xE9, 0xEF, 0xE1, 0xB0, 0xCD, 0xD6, 0xD5, 0x06, 0xC3, + 0xE2, 0xCE, 0xCA, 0xB6, 0xD7, 0xCB, 0xE1, 0xB3, 0x7A, 0xDC, 0x6C, 0xC2, + 0xF3, 0xE8, 0x2D, 0xD3, 0xDA, 0xE5, 0xDE, 0xDB, 0x61, 0xE1, 0x09, 0xDD, + 0x00, 0xE3, 0x99, 0xE7, 0x66, 0xF0, 0xDF, 0xF3, 0x04, 0x00, 0xA0, 0xF8, + 0x2C, 0xFB, 0x69, 0xFF, 0x65, 0xEC, 0xD3, 0xFD, 0x97, 0xE1, 0x36, 0xF1, + 0x92, 0xDC, 0xD3, 0xED, 0x13, 0xE9, 0x0C, 0x02, 0x00, 0xF6, 0x26, 0x10, + 0x86, 0xE7, 0x92, 0x00, 0x20, 0xD7, 0x48, 0xF1, 0x5B, 0xD9, 0x6B, 0xDD, + 0xB7, 0xD1, 0x7D, 0xC5, 0xC4, 0xCC, 0xC5, 0xD2, 0xCD, 0xE0, 0x82, 0xF4, + 0x96, 0xF1, 0x25, 0x05, 0xCB, 0xF7, 0x2F, 0xFE, 0x4C, 0xFB, 0xA1, 0xF1, + 0x9E, 0x03, 0xCA, 0xEF, 0xFC, 0x1B, 0x5F, 0xFB, 0x7D, 0x32, 0x1D, 0x18, + 0x9A, 0x2E, 0xB6, 0x21, 0xDB, 0x22, 0xE0, 0x0F, 0x5D, 0x31, 0x47, 0x18, + 0xBC, 0x3F, 0xDE, 0x31, 0x79, 0x34, 0x8F, 0x3A, 0xC9, 0x31, 0x62, 0x43, + 0xD0, 0x3A, 0x59, 0x43, 0xE3, 0x35, 0xCE, 0x32, 0x64, 0x21, 0x79, 0x22, + 0xB1, 0x0A, 0xE6, 0x14, 0x67, 0x08, 0x4D, 0x0F, 0x53, 0x15, 0x8C, 0x10, + 0xB1, 0x23, 0x4D, 0x1C, 0xDA, 0x1C, 0x5B, 0x1B, 0x29, 0x06, 0xC4, 0x07, + 0xD0, 0x14, 0x13, 0x15, 0xA4, 0x39, 0x46, 0x33, 0x11, 0x47, 0x6C, 0x2E, + 0xEB, 0x39, 0x80, 0x20, 0xB0, 0x23, 0x7C, 0x18, 0x39, 0x1F, 0xF0, 0x08, + 0xFE, 0x3D, 0xBE, 0x1E, 0x11, 0x52, 0xEC, 0x3F, 0x09, 0x3E, 0xEB, 0x23, + 0x61, 0x39, 0x58, 0x11, 0xA7, 0x51, 0xF9, 0x3C, 0xAE, 0x47, 0x32, 0x47, + 0x3D, 0x22, 0xB1, 0x2C, 0x74, 0x26, 0x43, 0x44, 0x52, 0x3D, 0x04, 0x60, + 0xD2, 0x41, 0x37, 0x55, 0x33, 0x43, 0xC9, 0x52, 0xA7, 0x37, 0x89, 0x48, + 0x85, 0x0D, 0xA5, 0x27, 0xB8, 0xF7, 0xBA, 0x18, 0xA8, 0x12, 0xF3, 0x16, + 0x4E, 0x20, 0x22, 0x14, 0x92, 0x0E, 0x70, 0x10, 0x94, 0x02, 0x2D, 0x14, + 0xDA, 0x0F, 0xF0, 0x2D, 0x85, 0x1A, 0x68, 0x33, 0xFF, 0x14, 0x41, 0x24, + 0xF9, 0x20, 0x98, 0x2E, 0x16, 0x34, 0xA1, 0x3E, 0x71, 0x29, 0x3B, 0x3B, + 0x5D, 0x19, 0x8A, 0x34, 0xFB, 0x1E, 0xE5, 0x36, 0x13, 0x21, 0x48, 0x2D, + 0xA1, 0x21, 0x81, 0x26, 0x04, 0x2B, 0x08, 0x27, 0x4D, 0x21, 0xAB, 0x0F, + 0x09, 0x04, 0xC3, 0xF7, 0x4A, 0xED, 0xE1, 0xE1, 0x4E, 0xE4, 0x27, 0xCF, + 0xAB, 0xE1, 0xC0, 0xDC, 0xA6, 0xE1, 0xAA, 0xFA, 0xF3, 0xE4, 0x4B, 0x0B, + 0x73, 0xE5, 0xA3, 0x0A, 0xFC, 0xDE, 0xE0, 0x0C, 0x24, 0xDA, 0xAB, 0x11, + 0x38, 0xF3, 0x3C, 0x1A, 0x35, 0x14, 0xBF, 0x2B, 0x27, 0x17, 0x5B, 0x2D, + 0xD8, 0x17, 0x2C, 0x28, 0x85, 0x21, 0x3C, 0x2C, 0x50, 0x2A, 0x1B, 0x24, + 0x63, 0x33, 0x71, 0x1B, 0x3F, 0x3A, 0xA6, 0x2A, 0x03, 0x3E, 0x74, 0x32, + 0x3B, 0x38, 0xAD, 0x1F, 0x46, 0x2B, 0x32, 0x12, 0x07, 0x11, 0xDD, 0x05, + 0xA0, 0xEF, 0x34, 0xFD, 0xF1, 0xE2, 0xA8, 0x0D, 0xC6, 0xF7, 0xEC, 0x24, + 0x0F, 0x05, 0xC9, 0x12, 0x6C, 0xF3, 0x1E, 0xE7, 0xD3, 0xFB, 0x4A, 0xF4, + 0x17, 0x21, 0xB6, 0x27, 0x31, 0x30, 0x1E, 0x3C, 0xB4, 0x21, 0x4A, 0x2E, + 0x2C, 0x06, 0x6F, 0x13, 0x41, 0xF8, 0xF8, 0xFA, 0x1E, 0x0F, 0xBF, 0x04, + 0x85, 0x2F, 0x9A, 0x26, 0x93, 0x29, 0x92, 0x19, 0x11, 0x18, 0xEC, 0xFF, + 0x06, 0x29, 0x5E, 0x1F, 0x89, 0x31, 0xE4, 0x38, 0x28, 0x15, 0x61, 0x1A, + 0xCD, 0x10, 0x9A, 0x11, 0x84, 0x32, 0x1F, 0x3A, 0x97, 0x42, 0xD3, 0x53, + 0xD8, 0x2F, 0x87, 0x4F, 0xF9, 0x1B, 0x10, 0x37, 0x7B, 0x0D, 0xEF, 0x18, + 0x1F, 0xFF, 0x41, 0xFF, 0x20, 0xFF, 0x19, 0xE9, 0xB0, 0x06, 0x4C, 0xE9, + 0xBD, 0x08, 0x7F, 0xF1, 0x94, 0x0C, 0xA7, 0xF8, 0x8F, 0x15, 0xB4, 0x02, + 0xE8, 0x18, 0x83, 0x02, 0xE5, 0x0D, 0x8F, 0x02, 0x0B, 0x02, 0x9C, 0x13, + 0x79, 0x0C, 0x7D, 0x2E, 0xF6, 0x18, 0x3D, 0x3F, 0x38, 0x0B, 0xA9, 0x37, + 0xA1, 0x05, 0x30, 0x26, 0x1E, 0x14, 0x83, 0x22, 0xD8, 0x14, 0x95, 0x1E, + 0x70, 0x16, 0xB8, 0x16, 0x04, 0x16, 0x29, 0x19, 0x96, 0xF6, 0x40, 0x1B, + 0x3C, 0xD2, 0xE3, 0x01, 0xC1, 0xBD, 0x66, 0xD2, 0x97, 0xB7, 0x0D, 0xC5, + 0xDC, 0xC5, 0x3C, 0xE7, 0xF3, 0xD1, 0x7A, 0x01, 0x50, 0xCA, 0x39, 0xF3, + 0xC5, 0xC0, 0xC7, 0xD8, 0xAA, 0xC3, 0xA9, 0xD4, 0x4E, 0xD4, 0x6B, 0xEA, + 0x08, 0xE5, 0x98, 0x05, 0xDA, 0xED, 0xC8, 0x07, 0x1E, 0xF5, 0xF1, 0xF8, + 0x26, 0xFD, 0xCC, 0xF8, 0x2C, 0x05, 0x3E, 0xFE, 0xD7, 0x04, 0xD6, 0xF3, + 0xAF, 0x08, 0xB9, 0xEA, 0x6D, 0x20, 0xCD, 0xEB, 0x19, 0x28, 0x7B, 0xE2, + 0x43, 0x16, 0x20, 0xE2, 0xD8, 0xF9, 0x78, 0xE5, 0x7E, 0xE5, 0xEE, 0xDF, + 0x79, 0xEC, 0xA7, 0xE5, 0x7F, 0xF8, 0xE7, 0xE2, 0x7B, 0xF0, 0x6F, 0xD3, + 0x63, 0xD5, 0xF0, 0xCA, 0x19, 0xCB, 0x13, 0xD4, 0x0E, 0xDA, 0xF6, 0xE4, + 0x13, 0xEA, 0xB2, 0xE7, 0xE3, 0xEC, 0xBA, 0xE5, 0x08, 0xE0, 0xD4, 0xE7, + 0x2F, 0xD8, 0x58, 0xE0, 0xB0, 0xEA, 0x45, 0xE2, 0x70, 0x06, 0x24, 0xFA, + 0x28, 0xFD, 0x1D, 0xF4, 0xB6, 0xEC, 0xF2, 0xE0, 0xB1, 0x00, 0xB0, 0xFF, + 0x13, 0x09, 0x90, 0x17, 0x13, 0xED, 0x32, 0xF2, 0x1B, 0xE6, 0xE4, 0xE1, + 0x42, 0x06, 0x9D, 0x00, 0xB1, 0x1A, 0xD1, 0x0A, 0x5D, 0x1C, 0xFC, 0x0C, + 0xC6, 0x19, 0xAD, 0x0C, 0xA6, 0x03, 0xE8, 0xEF, 0x91, 0xE6, 0x3F, 0xD3, + 0x4A, 0xD6, 0x09, 0xC8, 0x1C, 0xCF, 0x6D, 0xC7, 0x8B, 0xD5, 0x2B, 0xD0, + 0xED, 0xE3, 0xA2, 0xDF, 0xAD, 0xEA, 0x5B, 0xEC, 0x0F, 0xED, 0x29, 0xF1, + 0x17, 0xE7, 0x01, 0xF0, 0x69, 0xE1, 0x0A, 0xF6, 0xCA, 0xEC, 0x57, 0x0C, + 0x0A, 0x00, 0xF8, 0x29, 0xDF, 0x0C, 0x64, 0x2E, 0x56, 0x15, 0xEE, 0x0C, + 0xC8, 0x17, 0x6D, 0xEE, 0x81, 0x05, 0x9B, 0xE4, 0x65, 0xF6, 0xE2, 0xE6, + 0x80, 0xF0, 0xE3, 0xED, 0x58, 0xDD, 0xB9, 0xE4, 0x8D, 0xD5, 0x98, 0xCA, + 0x0E, 0xDA, 0x4B, 0xB9, 0xC8, 0xD3, 0x6C, 0xBB, 0x17, 0xCE, 0x56, 0xCA, + 0x89, 0xCE, 0x60, 0xD6, 0xFD, 0xC9, 0x77, 0xD2, 0x9F, 0xBD, 0x44, 0xD1, + 0x65, 0xB3, 0x5C, 0xDA, 0x17, 0xBB, 0xE7, 0xE4, 0x34, 0xD3, 0x43, 0xF1, + 0x6A, 0xEB, 0xD9, 0xF6, 0x4A, 0xF7, 0xEC, 0xFA, 0x9C, 0xED, 0x06, 0x00, + 0x86, 0xE1, 0x62, 0x02, 0x3E, 0xE1, 0x0D, 0x02, 0x14, 0xF1, 0x75, 0x0C, + 0xD2, 0x04, 0x74, 0x1F, 0xA5, 0xFD, 0x9B, 0x19, 0xB4, 0xEF, 0x63, 0x06, + 0x69, 0xE9, 0xEF, 0xF6, 0x1A, 0xE5, 0x9A, 0xEE, 0xEF, 0xED, 0x9E, 0xF2, + 0xED, 0x0D, 0xA6, 0xFD, 0x7C, 0x1B, 0x80, 0xF2, 0x29, 0x04, 0x15, 0xD6, + 0x48, 0xFE, 0x92, 0xE1, 0x3F, 0x08, 0x3B, 0xFB, 0x1E, 0x0E, 0x27, 0xF6, + 0xB5, 0x0C, 0xDD, 0xEC, 0x88, 0xFA, 0xFA, 0xE3, 0x85, 0xEF, 0xEC, 0xCF, + 0x46, 0x0B, 0x38, 0xDD, 0x19, 0x2E, 0xB5, 0x08, 0xF7, 0x1B, 0x2E, 0x07, + 0x11, 0xFF, 0x99, 0xF3, 0xAB, 0x0F, 0x0C, 0x10, 0x2F, 0x16, 0x20, 0x21, + 0x73, 0x03, 0x1F, 0x07, 0xF1, 0x0E, 0xCE, 0x10, 0x6D, 0x23, 0x7D, 0x27, + 0xC9, 0x29, 0x87, 0x19, 0xC9, 0x29, 0xDE, 0x14, 0x3A, 0x12, 0x2D, 0x15, + 0x16, 0xEF, 0xD8, 0xFA, 0xEA, 0xE2, 0xF5, 0xE2, 0x82, 0xEB, 0xEB, 0xD7, + 0xE3, 0xEF, 0x64, 0xCD, 0xF1, 0xF4, 0xDD, 0xDE, 0x1C, 0xF6, 0x1B, 0xF9, + 0xCB, 0xE3, 0x7D, 0xEF, 0xEE, 0xDA, 0x74, 0xE8, 0xA9, 0xE9, 0xEB, 0xF1, + 0x78, 0xF7, 0x25, 0xEF, 0x9B, 0x08, 0x6F, 0xFC, 0x5E, 0x1F, 0x0A, 0x17, + 0x71, 0x20, 0xCD, 0x16, 0x08, 0x10, 0xE5, 0x02, 0x67, 0x01, 0xF4, 0xF2, + 0x5E, 0xF7, 0xE0, 0xF5, 0xAD, 0xF2, 0x0E, 0xF9, 0xBD, 0xF4, 0xA8, 0xF8, + 0xA5, 0xED, 0x17, 0xF8, 0x30, 0xD5, 0xE9, 0xD8, 0xFF, 0xC3, 0xB8, 0xAF, + 0xCF, 0xC5, 0xD1, 0xA9, 0x12, 0xC3, 0xBE, 0xB9, 0xD2, 0xB5, 0x17, 0xC5, + 0xA7, 0xB4, 0x93, 0xCB, 0x08, 0xC4, 0xA7, 0xD9, 0x0F, 0xCE, 0x17, 0xDE, + 0xA6, 0xD5, 0x51, 0xD4, 0x6C, 0xE1, 0xD5, 0xDD, 0x68, 0xE4, 0x01, 0xF0, + 0x46, 0xE4, 0xF1, 0xEE, 0xEC, 0xDC, 0x1B, 0xE4, 0x2B, 0xCE, 0x91, 0xDE, + 0x35, 0xD4, 0xD6, 0xDB, 0x96, 0xF0, 0x26, 0xE7, 0x73, 0xFF, 0x41, 0xF3, + 0xB2, 0xF9, 0x7A, 0xE6, 0x4B, 0xE8, 0xC6, 0xD3, 0x7C, 0xCF, 0x1D, 0xC1, + 0xC9, 0xCA, 0x7D, 0xB4, 0x41, 0xE0, 0xC9, 0xC5, 0xF6, 0xF1, 0x1E, 0xD9, + 0x68, 0xDF, 0x93, 0xCA, 0x09, 0xC6, 0xBE, 0xC3, 0x09, 0xD4, 0xEA, 0xE3, + 0x29, 0xEE, 0x9C, 0xFE, 0x14, 0xF7, 0xDF, 0xF6, 0x35, 0xFA, 0x07, 0xEE, + 0x50, 0xEA, 0xA1, 0xE4, 0x9F, 0xDA, 0x19, 0xDD, 0xC7, 0xF8, 0x3E, 0xFB, + 0xD3, 0x09, 0x24, 0x09, 0x9B, 0xEB, 0x71, 0xE0, 0x43, 0xEA, 0xB5, 0xD2, + 0xAD, 0x0D, 0x16, 0xF7, 0x68, 0x0D, 0xE4, 0x00, 0x40, 0xF9, 0x82, 0xF2, + 0xE4, 0x07, 0xB6, 0x06, 0x34, 0x1B, 0x82, 0x1B, 0x8E, 0x1B, 0x52, 0x13, + 0x78, 0x18, 0xE8, 0x0B, 0x9D, 0x05, 0x88, 0xF9, 0x5D, 0xEB, 0x3D, 0xD9, + 0x63, 0xED, 0x48, 0xC9, 0x20, 0xF5, 0xA0, 0xC7, 0x9C, 0xEA, 0x09, 0xCA, + 0xB8, 0xED, 0x3A, 0xDB, 0xB2, 0xFB, 0xCC, 0xF2, 0xB5, 0xF4, 0xC1, 0xF6, + 0x58, 0xE6, 0x89, 0xF5, 0xBD, 0xEA, 0xF6, 0x05, 0x73, 0xF4, 0x9D, 0x11, + 0x06, 0x03, 0xF4, 0x19, 0xFF, 0x16, 0x40, 0x28, 0x16, 0x17, 0xB3, 0x27, + 0xF5, 0x11, 0x19, 0x1A, 0xF5, 0x12, 0x15, 0x0E, 0x1F, 0x0B, 0xD6, 0x0F, + 0x18, 0x04, 0x7B, 0x1E, 0xF9, 0x02, 0x8B, 0x24, 0xD8, 0xFA, 0x24, 0x19, + 0x26, 0xE8, 0x69, 0xFF, 0x8A, 0xDD, 0xDC, 0xE7, 0x4F, 0xE0, 0xF3, 0xE9, + 0x9A, 0xDF, 0x15, 0xFF, 0x94, 0xDC, 0x7F, 0x00, 0xF6, 0xE0, 0xB9, 0xE9, + 0xF2, 0xE9, 0xAE, 0xE2, 0x15, 0xF4, 0x70, 0xF3, 0x29, 0x04, 0x55, 0x0E, + 0xD2, 0x19, 0x6C, 0x29, 0xE2, 0x27, 0x53, 0x2F, 0xC0, 0x26, 0xD9, 0x1E, + 0x85, 0x22, 0x88, 0x1C, 0x2A, 0x1C, 0xFB, 0x28, 0xF5, 0x1A, 0x76, 0x2E, + 0xE9, 0x2B, 0x09, 0x35, 0x8F, 0x34, 0xE3, 0x2A, 0xFB, 0x2D, 0x9B, 0x13, + 0x99, 0x20, 0xCB, 0x0C, 0xAE, 0x13, 0xD4, 0x11, 0x11, 0x0A, 0x2B, 0x0F, + 0x51, 0x0F, 0x15, 0x15, 0x02, 0x25, 0x85, 0x1C, 0xF7, 0x2E, 0x2E, 0x0F, + 0x40, 0x25, 0x35, 0x0A, 0xA3, 0x1A, 0x6C, 0x17, 0x4D, 0x22, 0x81, 0x1F, + 0xA4, 0x2F, 0x0B, 0x14, 0xAB, 0x36, 0x8F, 0x06, 0x98, 0x3A, 0x71, 0x0E, + 0x91, 0x40, 0x78, 0x30, 0xDA, 0x43, 0xE4, 0x4B, 0xAE, 0x35, 0xBA, 0x41, + 0xD2, 0x23, 0x00, 0x33, 0x45, 0x32, 0x27, 0x3A, 0x63, 0x3F, 0xF2, 0x3A, + 0x67, 0x22, 0xB8, 0x1F, 0xC3, 0x2B, 0x64, 0x1F, 0x91, 0x5A, 0x13, 0x47, + 0x9C, 0x57, 0x17, 0x52, 0x06, 0x51, 0x8E, 0x4C, 0x06, 0x5F, 0x28, 0x4E, + 0x4A, 0x37, 0x93, 0x32, 0x6F, 0x07, 0xA1, 0x14, 0x88, 0x10, 0x74, 0x14, + 0x1D, 0x16, 0x00, 0x0E, 0x29, 0x09, 0x94, 0x08, 0x86, 0x1A, 0x7B, 0x25, + 0xE4, 0x29, 0x9A, 0x39, 0xED, 0x15, 0xA4, 0x26, 0x54, 0x0F, 0xD9, 0x1F, + 0x81, 0x23, 0xD0, 0x30, 0xC0, 0x35, 0x7E, 0x3B, 0x02, 0x46, 0xD2, 0x47, + 0x32, 0x43, 0x53, 0x45, 0xDB, 0x23, 0x6D, 0x2C, 0x19, 0x13, 0xDA, 0x19, + 0x53, 0x1D, 0x45, 0x17, 0x1A, 0x25, 0x05, 0x1E, 0xE4, 0x29, 0x1B, 0x1F, + 0x58, 0x2A, 0xBF, 0x13, 0x05, 0x14, 0x6A, 0xF9, 0x3A, 0xF3, 0xDC, 0xDC, + 0x07, 0xD9, 0x5A, 0xDA, 0xC0, 0xD2, 0xA5, 0xEE, 0x79, 0xE5, 0x98, 0x00, + 0x52, 0xFE, 0x84, 0x0B, 0x19, 0x0A, 0xA7, 0x13, 0x7A, 0x07, 0x9B, 0x13, + 0x3D, 0x03, 0x2A, 0x18, 0xF0, 0x04, 0xB8, 0x2B, 0x44, 0x03, 0x6F, 0x38, + 0x7F, 0xFC, 0xC1, 0x34, 0x86, 0x01, 0xC6, 0x29, 0xD9, 0x0B, 0xEE, 0x20, + 0x22, 0x13, 0x13, 0x24, 0xF5, 0x24, 0x55, 0x2E, 0x31, 0x37, 0xDB, 0x31, + 0xAC, 0x36, 0x0B, 0x2E, 0x86, 0x15, 0x5E, 0x12, 0x03, 0xE8, 0x87, 0xEF, + 0x09, 0xDF, 0xAD, 0xED, 0x09, 0xFE, 0x43, 0x01, 0x0A, 0x14, 0x22, 0x0B, + 0x05, 0x0C, 0x82, 0xFF, 0x54, 0x09, 0x78, 0xFE, 0x19, 0x10, 0x57, 0x0E, + 0x3E, 0x12, 0xBA, 0x13, 0x2C, 0x11, 0xE2, 0x14, 0xA9, 0x08, 0x7B, 0x14, + 0x80, 0xFB, 0xDF, 0xFC, 0x8B, 0x02, 0x6F, 0xEF, 0x34, 0x16, 0x7B, 0x0A, + 0x26, 0x03, 0xE5, 0x0E, 0x3A, 0xDC, 0x5B, 0xFD, 0x8C, 0xE9, 0x3E, 0x18, + 0x38, 0x1D, 0xE0, 0x37, 0x9A, 0x28, 0x91, 0x20, 0x4D, 0x16, 0x63, 0x0F, + 0x02, 0x20, 0x12, 0x2F, 0x42, 0x2B, 0x25, 0x4A, 0x7E, 0x23, 0x00, 0x46, + 0xE4, 0x20, 0xAD, 0x2D, 0x54, 0x19, 0xC1, 0x09, 0x1D, 0x12, 0x41, 0xEF, + 0xB1, 0x1D, 0x0E, 0xED, 0x56, 0x20, 0xF1, 0xEC, 0xBC, 0x18, 0xA1, 0xEF, + 0x2B, 0x26, 0xA8, 0x0A, 0xA0, 0x2D, 0x16, 0x21, 0x68, 0x1C, 0xA4, 0x1C, + 0x2B, 0x12, 0x36, 0x0E, 0xE9, 0x14, 0x99, 0x10, 0xB9, 0x23, 0xBB, 0x2F, + 0x1C, 0x43, 0xFF, 0x56, 0x49, 0x49, 0x08, 0x57, 0x41, 0x28, 0xAD, 0x33, + 0xB6, 0x0C, 0xEE, 0x25, 0xD4, 0x0E, 0x3E, 0x29, 0x51, 0x1D, 0x1F, 0x2A, + 0xE8, 0x20, 0x31, 0x2F, 0xA9, 0x18, 0x55, 0x33, 0x14, 0xF6, 0x25, 0x22, + 0x37, 0xC4, 0x90, 0xF4, 0xA8, 0xB4, 0xD8, 0xD6, 0xBC, 0xC8, 0x4D, 0xE4, + 0x9F, 0xD7, 0x5B, 0xFA, 0x6A, 0xE0, 0x1A, 0x05, 0x27, 0xEF, 0xE3, 0x07, + 0x51, 0xF6, 0xEE, 0xFA, 0xF3, 0xFD, 0xB1, 0xED, 0xF6, 0x08, 0xCE, 0x03, + 0xC6, 0x06, 0xD2, 0x1F, 0xAF, 0xF6, 0x35, 0x12, 0xF5, 0xF5, 0x36, 0x02, + 0x23, 0x0F, 0x93, 0x02, 0xD3, 0x18, 0xCE, 0xF9, 0xE5, 0x0D, 0x03, 0x02, + 0x88, 0x0D, 0x4B, 0x17, 0xC6, 0x17, 0xD4, 0x14, 0x4F, 0x0D, 0xD8, 0x00, + 0xF8, 0xE6, 0x37, 0xE7, 0x6B, 0xCD, 0xF6, 0xD8, 0x23, 0xD7, 0x50, 0xDA, + 0xE3, 0xF4, 0xE5, 0xE1, 0xEA, 0xF9, 0xA1, 0xE2, 0x33, 0xE7, 0x24, 0xDB, + 0x8E, 0xDD, 0xBA, 0xD9, 0x79, 0xDC, 0xF6, 0xE0, 0xD9, 0xE1, 0x84, 0xE7, + 0x1C, 0xEF, 0xBA, 0xEA, 0x78, 0xF2, 0x74, 0xE7, 0xC6, 0xE8, 0xF6, 0xE5, + 0xE8, 0xEF, 0x75, 0xFD, 0x47, 0xE7, 0xCF, 0x0B, 0x99, 0xC1, 0xB8, 0xEC, + 0xF9, 0xCF, 0x1A, 0xE4, 0x7C, 0x00, 0x33, 0x06, 0x9B, 0xF5, 0xB7, 0xF2, + 0xC0, 0xD6, 0x7D, 0xD4, 0xBF, 0xED, 0xD8, 0xF5, 0x00, 0x06, 0x7F, 0x03, + 0xBA, 0xF9, 0x6F, 0xEE, 0xD9, 0xF4, 0xC0, 0xEB, 0x1D, 0xF0, 0x6F, 0xE3, + 0xB3, 0xD5, 0xED, 0xCB, 0x46, 0xC2, 0x33, 0xC7, 0x19, 0xBE, 0xFA, 0xC7, + 0x83, 0xC0, 0x24, 0xBA, 0xFE, 0xD3, 0x26, 0xBF, 0x91, 0xE9, 0x2E, 0xDB, + 0x6D, 0xE0, 0x95, 0xE7, 0x88, 0xD1, 0x5F, 0xE5, 0xF1, 0xE8, 0xE5, 0xE9, + 0x3F, 0x0F, 0x3D, 0xF6, 0xF5, 0x27, 0x18, 0x02, 0x78, 0x26, 0xA5, 0x05, + 0xF7, 0x0C, 0x0D, 0x01, 0xA2, 0x00, 0xA2, 0xF9, 0xED, 0x04, 0xF9, 0xF9, + 0x43, 0x09, 0x05, 0x01, 0x8B, 0x0D, 0x81, 0x05, 0x26, 0x0F, 0x5F, 0x00, + 0xF4, 0x01, 0x71, 0xE9, 0x2B, 0xE5, 0xC2, 0xCD, 0x3E, 0xD1, 0x5F, 0xBF, + 0x6E, 0xD6, 0xE8, 0xC6, 0xCE, 0xDE, 0x48, 0xE0, 0x86, 0xE2, 0x80, 0xF0, + 0x02, 0xE9, 0x91, 0xE9, 0x8D, 0xE3, 0xC0, 0xDE, 0x85, 0xDC, 0xF6, 0xDD, + 0x3D, 0xE7, 0x42, 0xE9, 0xAA, 0xF7, 0xDD, 0x03, 0x28, 0x00, 0x4F, 0x17, + 0x3C, 0x05, 0x22, 0x1C, 0xF1, 0x06, 0x85, 0x23, 0x2F, 0x03, 0x6B, 0x22, + 0xD8, 0x0D, 0xF6, 0x1B, 0xEF, 0x1B, 0x04, 0x2A, 0x78, 0x12, 0x1E, 0x32, + 0x2A, 0x03, 0x35, 0x24, 0x51, 0xEB, 0x31, 0x0E, 0xE6, 0xE1, 0xFB, 0xF4, + 0xDC, 0xF6, 0x32, 0xF2, 0x9F, 0x0B, 0xED, 0x09, 0x62, 0x08, 0xFE, 0x08, + 0xBE, 0xF7, 0xD8, 0xEE, 0x6B, 0xFD, 0x99, 0xEB, 0x63, 0x07, 0xEA, 0xF0, + 0x2B, 0x07, 0x0E, 0xED, 0xC7, 0x07, 0x02, 0xEF, 0x47, 0x00, 0xA9, 0xED, + 0x5C, 0xF8, 0x61, 0xE5, 0xBB, 0x12, 0xAA, 0xF3, 0x68, 0x2F, 0x6D, 0x0B, + 0x38, 0x15, 0x29, 0x0C, 0xE8, 0xF6, 0xA3, 0x07, 0x19, 0x0E, 0x6A, 0x18, + 0xC2, 0x1B, 0x4F, 0x1A, 0x17, 0xFC, 0x8A, 0xF6, 0x62, 0xFA, 0x15, 0xF9, + 0x35, 0x12, 0xD5, 0x25, 0x34, 0x11, 0x80, 0x2C, 0xE3, 0x15, 0x70, 0x17, + 0xBE, 0x1E, 0x56, 0x06, 0xD3, 0x05, 0x0F, 0xED, 0x53, 0xE5, 0x31, 0xE3, + 0x73, 0xDC, 0x9B, 0xE7, 0xA2, 0xD6, 0xC7, 0xDD, 0x77, 0xD9, 0x8C, 0xDD, + 0x37, 0xF1, 0x4A, 0xF4, 0x80, 0xF7, 0x6D, 0x00, 0x0A, 0xE4, 0x15, 0xF1, + 0x30, 0xE5, 0x07, 0xE7, 0x49, 0xFD, 0x9F, 0xFA, 0x31, 0x0F, 0xF2, 0x16, + 0xFB, 0x19, 0x09, 0x1A, 0x26, 0x1D, 0x81, 0x02, 0x85, 0x1A, 0x41, 0xEF, + 0x08, 0x19, 0xDB, 0xEB, 0x95, 0x13, 0xBD, 0xF5, 0x93, 0x0B, 0x22, 0x07, + 0x72, 0x0A, 0xBC, 0x0A, 0xA3, 0x02, 0x2D, 0xF3, 0x02, 0xEA, 0xC1, 0xC9, + 0xBC, 0xD5, 0x28, 0xAF, 0xB9, 0xCB, 0xF1, 0xB0, 0xA5, 0xC7, 0xC0, 0xBD, + 0x87, 0xCA, 0xC4, 0xC9, 0xC1, 0xCF, 0xA5, 0xCE, 0x0A, 0xD6, 0xD6, 0xCE, + 0x11, 0xDA, 0xED, 0xD0, 0x94, 0xDE, 0xCB, 0xD0, 0x73, 0xDF, 0x89, 0xD2, + 0x7B, 0xD9, 0x93, 0xE1, 0x18, 0xDD, 0xD7, 0xEB, 0x75, 0xE5, 0x68, 0xDF, + 0xFB, 0xDF, 0x6E, 0xD6, 0x3B, 0xE0, 0x32, 0xDE, 0x1E, 0xFD, 0x27, 0xEC, + 0x9B, 0x0A, 0x1B, 0xF6, 0xCB, 0xF9, 0xB7, 0xF3, 0xCA, 0xE1, 0x11, 0xE0, + 0x36, 0xCD, 0xB3, 0xC8, 0x47, 0xD1, 0x0E, 0xC5, 0x74, 0xE5, 0xDB, 0xD3, + 0xBC, 0xE7, 0x0D, 0xDE, 0xB3, 0xCE, 0x6B, 0xCB, 0x50, 0xCE, 0x8C, 0xC0, + 0x8F, 0xE8, 0xFF, 0xC8, 0x36, 0xF1, 0x68, 0xC9, 0xFE, 0xEA, 0x20, 0xD5, + 0x4C, 0xDD, 0x5A, 0xE2, 0x08, 0xC9, 0x2C, 0xD4, 0x70, 0xC0, 0xFF, 0xCE, + 0x19, 0xD5, 0x81, 0xEA, 0xAB, 0xD4, 0xBE, 0xE6, 0xF2, 0xB4, 0xC7, 0xC4, + 0xEC, 0xC8, 0xED, 0xD2, 0x4E, 0xFB, 0x2E, 0xF5, 0x25, 0xEE, 0xA2, 0xE4, + 0x2C, 0xD4, 0x32, 0xD2, 0x30, 0xEF, 0x67, 0xEE, 0x52, 0xF9, 0x57, 0xFB, + 0xAE, 0xEA, 0x47, 0xE6, 0x14, 0xF6, 0x43, 0xD6, 0xB2, 0xF4, 0x9E, 0xC1, + 0xBF, 0xD1, 0xA2, 0xA6, 0xB8, 0xBB, 0x12, 0xA2, 0xFC, 0xBD, 0x11, 0xAD, + 0x48, 0xC8, 0xF9, 0xB9, 0x2D, 0xDD, 0xE0, 0xCB, 0x4E, 0xE3, 0xF9, 0xD1, + 0xFD, 0xD0, 0xC0, 0xCA, 0x78, 0xCE, 0xDE, 0xCA, 0xC9, 0xD8, 0x5A, 0xD2, + 0x7E, 0xDD, 0x5B, 0xE3, 0x0B, 0xEC, 0x0A, 0xFB, 0x70, 0xFB, 0x11, 0xFB, + 0xC5, 0xF1, 0xD7, 0xE8, 0x06, 0xE7, 0x3B, 0xEA, 0x49, 0xF2, 0xA4, 0xF5, + 0xAB, 0xF6, 0xFB, 0xF9, 0x3D, 0xEA, 0x34, 0xFC, 0x3E, 0xE4, 0x68, 0x01, + 0x83, 0xD4, 0xB1, 0xF7, 0x70, 0xAC, 0xB7, 0xCD, 0x25, 0xA2, 0xD7, 0xBA, + 0x32, 0xC6, 0x3D, 0xCF, 0x78, 0xE8, 0x8C, 0xDC, 0xDB, 0xF2, 0xCB, 0xE2, + 0x8B, 0xEE, 0x98, 0xE7, 0xAE, 0xE7, 0x8D, 0xDC, 0x4B, 0xE9, 0x84, 0xCF, + 0x7F, 0xF8, 0x45, 0xDC, 0xF5, 0x08, 0xE2, 0xF8, 0xA7, 0x08, 0x3F, 0x14, + 0xE8, 0xFA, 0x4C, 0x20, 0xB1, 0xFD, 0x7A, 0x14, 0xC2, 0x10, 0x81, 0x08, + 0xCA, 0x22, 0x17, 0x0E, 0x9F, 0x2B, 0xC6, 0x15, 0xFF, 0x22, 0xF4, 0x16, + 0xCE, 0x14, 0xB5, 0x11, 0xD4, 0x01, 0xD3, 0xF8, 0xCA, 0xF7, 0x97, 0xEA, + 0x0C, 0x05, 0x2B, 0xFD, 0x49, 0x1B, 0x6E, 0x19, 0x0B, 0x13, 0x97, 0x1C, + 0x75, 0xFC, 0x0A, 0x12, 0x71, 0x10, 0x23, 0x1E, 0xD6, 0x29, 0xE4, 0x21, + 0xE5, 0x23, 0x8E, 0x13, 0xD6, 0x18, 0xEC, 0x12, 0x84, 0x11, 0x33, 0x16, + 0xB6, 0x11, 0x01, 0x18, 0x11, 0x2D, 0x71, 0x2F, 0x80, 0x41, 0x82, 0x3A, + 0xEC, 0x27, 0x26, 0x16, 0x62, 0x21, 0x67, 0x0E, 0x7E, 0x46, 0x16, 0x38, + 0xF6, 0x43, 0xA8, 0x3D, 0xBA, 0x19, 0xCF, 0x22, 0x3F, 0x23, 0x7D, 0x27, + 0xB7, 0x4A, 0x0B, 0x3C, 0x95, 0x49, 0x6C, 0x41, 0xF9, 0x3F, 0x3B, 0x43, + 0x19, 0x43, 0x16, 0x3D, 0xAE, 0x2F, 0xC1, 0x20, 0xB4, 0x10, 0x15, 0x11, + 0x72, 0xFF, 0xE1, 0x18, 0x78, 0xF3, 0x52, 0x18, 0x4A, 0x00, 0x34, 0x20, + 0xB0, 0x20, 0x81, 0x2C, 0xCF, 0x25, 0xE7, 0x20, 0x96, 0x1F, 0xF4, 0x16, + 0xE6, 0x23, 0x48, 0x1F, 0xD1, 0x26, 0x32, 0x2E, 0x9A, 0x2E, 0xE0, 0x40, + 0x5D, 0x35, 0x15, 0x4C, 0x29, 0x21, 0x13, 0x37, 0x85, 0x08, 0x6B, 0x23, + 0x38, 0x11, 0x77, 0x2D, 0x34, 0x24, 0x98, 0x2D, 0x78, 0x25, 0xC3, 0x1C, + 0xE9, 0x25, 0x83, 0x12, 0x20, 0x20, 0x49, 0x08, 0x3A, 0x04, 0xF0, 0xF7, + 0xB0, 0xE9, 0x79, 0xEC, 0x7D, 0xE6, 0xF2, 0xF1, 0x8C, 0xF9, 0x08, 0x08, + 0x49, 0x0E, 0x12, 0x12, 0xA9, 0x18, 0x11, 0x08, 0x75, 0x14, 0x8D, 0x00, + 0xC5, 0x00, 0x48, 0x02, 0x29, 0xF9, 0x51, 0x17, 0xB1, 0x0D, 0x14, 0x37, + 0xCE, 0x26, 0x17, 0x3E, 0x8A, 0x2A, 0xC1, 0x2B, 0x66, 0x26, 0x89, 0x1D, + 0x64, 0x31, 0x38, 0x22, 0xC8, 0x3E, 0x1C, 0x35, 0x86, 0x3F, 0x47, 0x41, + 0x1B, 0x36, 0xC0, 0x39, 0xFA, 0x2B, 0x17, 0x32, 0x0B, 0x18, 0x95, 0x1A, + 0xF1, 0x0A, 0xF4, 0xFC, 0xE2, 0x0D, 0x30, 0xFD, 0xE3, 0x12, 0xF5, 0x06, + 0x5A, 0x13, 0x22, 0xFE, 0x5E, 0x0D, 0x0A, 0xF7, 0xBB, 0x0B, 0x58, 0x09, + 0x8B, 0x11, 0xEC, 0x17, 0x15, 0x1C, 0x4E, 0x14, 0x48, 0x1F, 0x76, 0x10, + 0x2E, 0x0E, 0x78, 0x0F, 0x5B, 0xFA, 0xE7, 0x14, 0xBC, 0x08, 0xC0, 0x27, + 0x4C, 0x1C, 0x36, 0x2F, 0x93, 0x07, 0x25, 0x1A, 0xA9, 0xFD, 0x46, 0x12, + 0xB8, 0x1D, 0xA4, 0x33, 0xF4, 0x1F, 0x3A, 0x38, 0x2E, 0xFB, 0xA1, 0x0E, + 0xD6, 0x08, 0x9C, 0x11, 0x80, 0x2F, 0x3A, 0x2F, 0xCD, 0x2B, 0xB7, 0x2F, + 0x81, 0x26, 0x1C, 0x24, 0x08, 0x2B, 0x6A, 0x12, 0xC2, 0x18, 0x7E, 0x00, + 0xC9, 0x07, 0xA6, 0xFF, 0x72, 0x0A, 0x7F, 0x0A, 0x60, 0x02, 0x28, 0x08, + 0x66, 0xFB, 0xD3, 0x04, 0xB4, 0x13, 0x3C, 0x11, 0x50, 0x22, 0xE1, 0x11, + 0x24, 0x19, 0x80, 0x08, 0x88, 0x18, 0x9F, 0x07, 0x7F, 0x1D, 0xC9, 0x12, + 0xB1, 0x22, 0x82, 0x2A, 0x6C, 0x28, 0xC9, 0x39, 0x69, 0x1B, 0xB0, 0x27, + 0x92, 0x0D, 0xA9, 0x12, 0x8A, 0x16, 0x90, 0x1F, 0xA2, 0x20, 0xF6, 0x35, + 0xA0, 0x1A, 0x2C, 0x38, 0x34, 0x10, 0x2C, 0x2F, 0x2B, 0x01, 0xE7, 0x1F, + 0x96, 0xD8, 0x39, 0x02, 0xF8, 0xB7, 0x8B, 0xF1, 0x3F, 0xC2, 0x01, 0xEF, + 0xED, 0xDE, 0xEB, 0xEB, 0x7F, 0xEE, 0xA1, 0xF2, 0x30, 0xEF, 0x43, 0xF6, + 0x27, 0xE8, 0x86, 0xE8, 0x65, 0xDD, 0x95, 0xDF, 0x10, 0xE0, 0xD4, 0xED, + 0x85, 0xEF, 0x1F, 0x06, 0x95, 0x00, 0x45, 0x1D, 0x4E, 0x0F, 0xD9, 0x1D, + 0x87, 0x11, 0x3F, 0x04, 0xCA, 0x0B, 0xE2, 0xF2, 0xC7, 0x10, 0x3A, 0xF4, + 0x10, 0x1C, 0x30, 0x01, 0xB0, 0x1F, 0xA0, 0x0C, 0xE2, 0x1D, 0x15, 0x11, + 0x50, 0x0F, 0x36, 0x0B, 0xED, 0x00, 0xF6, 0xF6, 0xB3, 0x04, 0x7A, 0xE7, + 0x7D, 0x0E, 0x63, 0xEA, 0x6E, 0x07, 0x29, 0xE7, 0xB6, 0xFB, 0xC7, 0xDE, + 0x7E, 0xFD, 0x95, 0xE2, 0xFC, 0xFD, 0xE1, 0xE4, 0xC8, 0xFD, 0xC4, 0xE6, + 0x39, 0xFE, 0x5C, 0xF4, 0xC4, 0xF5, 0x4B, 0xF9, 0x6F, 0xEB, 0xBB, 0xF4, + 0xC2, 0xED, 0xA9, 0x07, 0xA9, 0xEE, 0x4E, 0x0C, 0x06, 0xD5, 0x43, 0xE7, + 0x23, 0xC5, 0xF0, 0xDC, 0xF0, 0xE4, 0x10, 0x03, 0xB4, 0xF4, 0x11, 0x15, + 0x5A, 0xD4, 0x18, 0xF9, 0xB2, 0xD0, 0xD9, 0xE8, 0xE1, 0xF1, 0xE1, 0xF3, + 0x00, 0x02, 0x79, 0xFE, 0xAF, 0x09, 0x32, 0x0A, 0x90, 0x08, 0x56, 0x05, + 0x1D, 0xE8, 0xB0, 0xE4, 0x33, 0xD0, 0xCD, 0xD1, 0x24, 0xDB, 0x1A, 0xD9, + 0xC9, 0xE0, 0xA2, 0xD9, 0xD1, 0xD8, 0xE6, 0xCF, 0x1D, 0xDE, 0xE5, 0xD2, + 0x02, 0xEA, 0x0E, 0xE7, 0x8A, 0xEB, 0x43, 0xF8, 0x13, 0xE7, 0x42, 0xEE, + 0x83, 0xE3, 0xDE, 0xE0, 0x76, 0xE8, 0x1F, 0xFD, 0x75, 0xF8, 0xBB, 0x1C, + 0xC3, 0x07, 0x5E, 0x13, 0x41, 0x10, 0xBF, 0x06, 0xA0, 0x14, 0x90, 0x06, + 0xB4, 0x12, 0xEF, 0x05, 0x2F, 0x0E, 0x01, 0x17, 0xDD, 0x08, 0x13, 0x28, + 0x13, 0xFB, 0x79, 0x0B, 0x74, 0xE3, 0x9C, 0xDA, 0xB9, 0xD0, 0xA4, 0xD3, + 0x6E, 0xD0, 0x87, 0xE2, 0x82, 0xE4, 0x6A, 0xE3, 0x46, 0xFD, 0x83, 0xE9, + 0x7B, 0xFD, 0x09, 0xEB, 0x21, 0xE8, 0x46, 0xD8, 0x47, 0xDC, 0xBB, 0xCF, + 0x6A, 0xE2, 0xCB, 0xE6, 0xCA, 0xEE, 0xD8, 0xF9, 0x3C, 0x02, 0xDD, 0xFD, + 0x89, 0x17, 0xA1, 0x0E, 0xEE, 0x1E, 0xA5, 0x12, 0xDF, 0x10, 0x82, 0x04, + 0x4B, 0x02, 0x6A, 0x11, 0x68, 0x09, 0xDF, 0x23, 0x67, 0x1A, 0x7E, 0x24, + 0x28, 0x22, 0xEC, 0x2B, 0xC8, 0x0B, 0x21, 0x27, 0xC3, 0xEF, 0xCF, 0x14, + 0xC5, 0xF3, 0x6C, 0x15, 0x3A, 0x0B, 0x0F, 0x23, 0xE6, 0x14, 0x0D, 0x17, + 0x8F, 0x11, 0xC2, 0x00, 0x0B, 0x1B, 0x24, 0x08, 0xE3, 0x2C, 0x42, 0x0F, + 0x0E, 0x32, 0xA2, 0x03, 0xDE, 0x29, 0x79, 0x00, 0x1C, 0x1A, 0x17, 0xF8, + 0xA5, 0x15, 0xC0, 0xE3, 0x2A, 0x2A, 0xEC, 0xF6, 0x1A, 0x2B, 0xF7, 0x19, + 0x5B, 0x0B, 0xAC, 0x0A, 0xAA, 0x09, 0x00, 0xFF, 0x33, 0x30, 0xC7, 0x27, + 0x58, 0x36, 0x8B, 0x3C, 0xD1, 0x0F, 0x29, 0x28, 0x17, 0x07, 0xFE, 0x21, + 0x5B, 0x1F, 0x83, 0x1B, 0x40, 0x2B, 0x26, 0x09, 0xEC, 0x2D, 0x86, 0x0F, + 0xC1, 0x22, 0x69, 0x1A, 0x0B, 0x00, 0x45, 0x0D, 0x43, 0xE6, 0xB4, 0x06, + 0xE3, 0xEB, 0xBA, 0x11, 0xEB, 0xEE, 0xE5, 0x0A, 0x4D, 0xE4, 0x48, 0xF4, + 0x6C, 0xE7, 0x89, 0xEF, 0x3B, 0xF2, 0xC7, 0xFE, 0xB2, 0xF2, 0xBA, 0x0F, + 0x55, 0xEB, 0x97, 0x14, 0xAE, 0xE9, 0x34, 0x03, 0xCB, 0xFA, 0xFC, 0xF6, + 0x84, 0x10, 0x1E, 0x08, 0x9C, 0x18, 0xCA, 0x0C, 0x30, 0x12, 0xBF, 0xFD, + 0xBF, 0xFA, 0xA7, 0xF9, 0x2D, 0xEF, 0xFD, 0xFE, 0xE9, 0x01, 0xD1, 0x0B, + 0xA0, 0x0F, 0xB8, 0x12, 0x8A, 0x00, 0x5A, 0xFD, 0x3B, 0xE3, 0xB6, 0xDB, + 0x20, 0xD7, 0xBE, 0xD3, 0xC2, 0xDC, 0x51, 0xDE, 0xB6, 0xDE, 0x42, 0xDD, + 0x69, 0xDA, 0x2D, 0xD9, 0x0A, 0xD6, 0xA0, 0xD8, 0x5B, 0xCE, 0x65, 0xCB, + 0xE1, 0xC3, 0x8E, 0xBD, 0x36, 0xC6, 0x6B, 0xC6, 0x69, 0xD4, 0x5E, 0xDC, + 0xE2, 0xE4, 0xD9, 0xE6, 0x28, 0xEE, 0xCE, 0xE1, 0xBE, 0xE9, 0xA3, 0xDC, + 0x90, 0xDE, 0x1C, 0xCC, 0xE7, 0xD5, 0xEE, 0xC2, 0x1B, 0xD1, 0xE8, 0xD7, + 0x3C, 0xDC, 0x1D, 0xE2, 0xCC, 0xEF, 0x24, 0xDE, 0x0B, 0xEE, 0x1D, 0xE2, + 0x32, 0xE8, 0x7E, 0xDE, 0x3A, 0xE8, 0xB6, 0xD3, 0xAE, 0xD8, 0x59, 0xD1, + 0x20, 0xC8, 0xA8, 0xC3, 0xD8, 0xD3, 0x9F, 0xB1, 0xAF, 0xDB, 0x85, 0xB0, + 0xBB, 0xD0, 0x26, 0xB6, 0x9C, 0xD7, 0xA5, 0xBF, 0x08, 0xE4, 0x77, 0xCC, + 0x9C, 0xD6, 0xD0, 0xCE, 0x27, 0xCD, 0x09, 0xD1, 0x3D, 0xDB, 0xAF, 0xDF, + 0x4A, 0xD3, 0xC0, 0xDF, 0xC2, 0xB5, 0x45, 0xCD, 0x43, 0xBE, 0x45, 0xCB, + 0x3D, 0xE7, 0xFC, 0xE1, 0xF7, 0xF2, 0xCE, 0xEF, 0x00, 0xE8, 0x0A, 0xEF, + 0xCE, 0xEB, 0xED, 0xF7, 0xCE, 0xF3, 0xCC, 0xFA, 0xF9, 0x07, 0x7A, 0xF7, + 0xC8, 0x1A, 0x55, 0xF8, 0xCD, 0x01, 0x5F, 0xE7, 0x6D, 0xD7, 0x04, 0xCB, + 0xCD, 0xC9, 0x66, 0xBF, 0xE8, 0xCA, 0x31, 0xBE, 0xA5, 0xCB, 0xFE, 0xB9, + 0x75, 0xD7, 0xF5, 0xBF, 0x30, 0xE3, 0x0D, 0xCF, 0xA3, 0xE2, 0x0C, 0xD9, + 0x31, 0xDE, 0x0F, 0xDE, 0x3F, 0xDF, 0xAC, 0xDB, 0x7C, 0xDB, 0xEA, 0xD6, + 0x4B, 0xDA, 0x55, 0xE1, 0x0C, 0xE9, 0xE3, 0xEE, 0x00, 0xEE, 0x21, 0xF3, + 0xD1, 0xE2, 0xEC, 0xF1, 0xDD, 0xDF, 0x23, 0xF0, 0x44, 0xE7, 0xF2, 0xFF, + 0x98, 0xED, 0xFD, 0x19, 0xA0, 0xEF, 0xDE, 0x1E, 0x5C, 0xE0, 0x59, 0x00, + 0xAD, 0xC2, 0x27, 0xD5, 0xAC, 0xBD, 0x2C, 0xC6, 0xF7, 0xD0, 0xCA, 0xD1, + 0xA9, 0xD3, 0xC4, 0xD8, 0x54, 0xCE, 0x01, 0xDB, 0x9B, 0xDD, 0x13, 0xE5, + 0x92, 0xF4, 0x2C, 0xE8, 0xFF, 0xF9, 0xA5, 0xDD, 0xF3, 0xE9, 0xCB, 0xDC, + 0x28, 0xD7, 0x65, 0xE8, 0x2A, 0xD8, 0x68, 0xF5, 0xB3, 0xF3, 0x79, 0x04, + 0x6E, 0x0B, 0x5A, 0x07, 0xCF, 0xFE, 0xD0, 0xFB, 0x80, 0xF5, 0xDB, 0xF9, + 0xAB, 0x0D, 0x5B, 0x0D, 0x31, 0x23, 0xC5, 0x20, 0x90, 0x1F, 0xB3, 0x10, + 0x34, 0x0E, 0x91, 0xF3, 0xCF, 0x02, 0xD5, 0xEF, 0xE7, 0x07, 0x8B, 0xF6, + 0xE8, 0x0D, 0x6D, 0xF6, 0x94, 0x0E, 0x1A, 0xF6, 0x0D, 0x1A, 0xEE, 0xF8, + 0x62, 0x29, 0x0B, 0x06, 0xD7, 0x23, 0x2F, 0x0E, 0xD2, 0x12, 0x34, 0x03, + 0x10, 0x10, 0x3C, 0x00, 0xA0, 0x0E, 0xE3, 0xFE, 0x92, 0x0D, 0xA5, 0xFA, + 0xAA, 0x12, 0x51, 0x00, 0xBC, 0x0A, 0x34, 0xF9, 0x26, 0x03, 0x5C, 0xEF, + 0x26, 0x11, 0x6D, 0x0A, 0x2D, 0x1D, 0xC2, 0x30, 0x50, 0x15, 0x39, 0x35, + 0x17, 0x16, 0x38, 0x24, 0x9E, 0x26, 0x31, 0x19, 0x9C, 0x30, 0x88, 0x1A, + 0x5D, 0x36, 0x11, 0x21, 0x1D, 0x3B, 0xD7, 0x21, 0x96, 0x37, 0xB9, 0x17, + 0xED, 0x2E, 0x4F, 0x13, 0x0F, 0x2C, 0x7D, 0x23, 0x52, 0x30, 0x5A, 0x32, + 0x2B, 0x32, 0xBD, 0x33, 0xD0, 0x2A, 0x9D, 0x2B, 0x58, 0x24, 0xCA, 0x20, + 0x19, 0x1C, 0xE6, 0x1C, 0x32, 0x07, 0x1D, 0x1E, 0xE3, 0xFC, 0x51, 0x1C, + 0x15, 0x14, 0xF4, 0x1A, 0xCE, 0x2F, 0x96, 0x26, 0x97, 0x32, 0xB2, 0x30, + 0xF1, 0x2B, 0x9A, 0x2D, 0xA1, 0x1B, 0x7B, 0x2F, 0x0B, 0x09, 0x5F, 0x35, + 0xE4, 0x0E, 0xBE, 0x31, 0x9B, 0x16, 0xDD, 0x32, 0x8D, 0x09, 0xA8, 0x2F, + 0xAA, 0xF8, 0x47, 0x14, 0x58, 0xF8, 0x9D, 0xFF, 0xD2, 0x08, 0x99, 0x00, + 0xED, 0x12, 0x22, 0x06, 0x42, 0x0F, 0x52, 0x08, 0xC5, 0x04, 0x4C, 0x03, + 0x2F, 0xF7, 0xFE, 0xF7, 0x7B, 0xF0, 0x92, 0xEE, 0x42, 0xF3, 0xD8, 0xE3, + 0xD5, 0xFA, 0xD6, 0xDD, 0x49, 0xFD, 0x51, 0xEE, 0x41, 0xFF, 0x12, 0x06, + 0x9F, 0x07, 0xC9, 0x14, 0x9D, 0x0F, 0xE8, 0x1B, 0xF1, 0x15, 0x07, 0x18, + 0xD3, 0x15, 0x8A, 0x14, 0xBC, 0x18, 0xA0, 0x1F, 0x06, 0x1C, 0x00, 0x31, + 0x63, 0x0A, 0x4C, 0x38, 0x61, 0xF5, 0xCD, 0x27, 0xBE, 0xFC, 0x56, 0x11, + 0x67, 0x12, 0xB8, 0x09, 0xBC, 0x15, 0x00, 0xFF, 0x56, 0x0F, 0xCC, 0xED, + 0x8F, 0x0E, 0xB7, 0xEA, 0xEB, 0x0B, 0xFD, 0xF5, 0x1E, 0x09, 0xE5, 0x02, + 0x66, 0x0A, 0xB8, 0x08, 0x66, 0x05, 0x12, 0xFA, 0x00, 0x01, 0xF4, 0xED, + 0x86, 0x0E, 0x2D, 0xFA, 0x11, 0x19, 0xA5, 0xFE, 0xEB, 0x07, 0x04, 0xF9, + 0xD8, 0xF4, 0x22, 0x01, 0xF1, 0xF8, 0x9E, 0x12, 0xD2, 0xFC, 0x20, 0x15, + 0x22, 0xFB, 0xA5, 0x05, 0xF6, 0xFB, 0x92, 0xFB, 0x53, 0xF7, 0xF4, 0xFD, + 0x2A, 0x02, 0xD8, 0x07, 0x89, 0x20, 0x93, 0x16, 0x13, 0x25, 0x31, 0x1C, + 0xFE, 0x0E, 0x45, 0x12, 0xC8, 0x03, 0x68, 0x0F, 0xF5, 0xFA, 0x13, 0x15, + 0xE2, 0xF4, 0x57, 0x12, 0xDB, 0x01, 0xEF, 0x0B, 0x16, 0x0F, 0xEA, 0x07, + 0x12, 0x16, 0xC1, 0x02, 0xF1, 0x20, 0xD7, 0xFD, 0x1E, 0x2E, 0x9C, 0xFE, + 0x24, 0x33, 0xC0, 0x05, 0xA5, 0x2A, 0xB6, 0x11, 0x35, 0x29, 0x28, 0x16, + 0xBF, 0x2D, 0x22, 0x12, 0x52, 0x22, 0xA7, 0x16, 0x01, 0x11, 0xA3, 0x1D, + 0xB1, 0x08, 0xD5, 0x27, 0x9A, 0x0A, 0xE4, 0x36, 0xAB, 0x0E, 0xA4, 0x36, + 0x97, 0x06, 0x06, 0x26, 0x3D, 0xF5, 0x76, 0x10, 0x93, 0xE5, 0x71, 0x0A, + 0x74, 0xDC, 0x8C, 0x18, 0x7B, 0xE0, 0x7E, 0x20, 0xEF, 0xE4, 0x6F, 0x18, + 0x87, 0xE2, 0x30, 0x09, 0xC0, 0xE9, 0xEA, 0xF5, 0x0D, 0xF6, 0x06, 0xEC, + 0x58, 0xF3, 0xA0, 0xFB, 0x0F, 0xE9, 0xA8, 0x11, 0xAA, 0xE4, 0x87, 0x1A, + 0x72, 0xE5, 0x00, 0x1A, 0x80, 0xEF, 0x26, 0x14, 0x57, 0xFC, 0x56, 0x0B, + 0x90, 0x0B, 0x82, 0xFF, 0x44, 0x1E, 0x4E, 0xF7, 0x7F, 0x1C, 0xDF, 0xF7, + 0x7F, 0x06, 0x04, 0xFE, 0xB4, 0xFF, 0x85, 0x0A, 0x23, 0x14, 0x25, 0x18, + 0xA4, 0x1F, 0x34, 0x12, 0x57, 0x1E, 0x62, 0x01, 0x5D, 0x24, 0x35, 0x03, + 0x5C, 0x24, 0x12, 0x11, 0xA2, 0x1D, 0x66, 0x0E, 0x1F, 0x16, 0xCF, 0x01, + 0xF3, 0x0A, 0x54, 0xFD, 0x04, 0x02, 0x0C, 0xF6, 0x47, 0x04, 0xC4, 0xF5, + 0x43, 0x0A, 0xA4, 0xFC, 0x09, 0x02, 0xB3, 0xEF, 0x1F, 0xF3, 0xD6, 0xDF, + 0x42, 0xF5, 0xA2, 0xEB, 0x92, 0xFC, 0x1B, 0x02, 0x2C, 0xF0, 0xDA, 0x06, + 0xD3, 0xE0, 0x92, 0xFE, 0x34, 0xE2, 0x7F, 0xF7, 0xC8, 0xF0, 0x39, 0xF4, + 0x98, 0x03, 0xD7, 0xFD, 0x2B, 0x14, 0x79, 0x0D, 0x5E, 0x14, 0xD3, 0x0A, + 0xC4, 0x00, 0x58, 0x01, 0x77, 0xF2, 0x7D, 0xFB, 0x52, 0xF0, 0x40, 0xF4, + 0xD2, 0xEF, 0xE9, 0xF1, 0x9B, 0xE9, 0x23, 0xF3, 0x77, 0xE4, 0x5F, 0xF7, + 0x31, 0xEA, 0xAF, 0xFD, 0xB8, 0xF6, 0x58, 0x00, 0xC4, 0x02, 0xC1, 0xFC, + 0x8B, 0x01, 0x5D, 0xF7, 0xB7, 0xF8, 0x16, 0xF5, 0xBE, 0xFA, 0xD6, 0xFB, + 0x91, 0x04, 0xB3, 0x0D, 0xE0, 0x12, 0x51, 0x10, 0xBD, 0x21, 0x12, 0x08, + 0x80, 0x25, 0x32, 0x13, 0x21, 0x21, 0x6F, 0x20, 0x62, 0x16, 0xEF, 0x27, + 0x1B, 0x0A, 0x24, 0x2E, 0x12, 0x05, 0x86, 0x1A, 0xC2, 0x0B, 0x0E, 0xFA, + 0x95, 0x16, 0x8B, 0xF8, 0x4E, 0x0E, 0x4E, 0x09, 0xF6, 0xF1, 0xEC, 0x06, + 0x83, 0xDD, 0x36, 0xF8, 0x84, 0xDE, 0xDC, 0xF0, 0xA1, 0xE6, 0x5C, 0xF6, + 0xE3, 0xEF, 0x19, 0x03, 0x47, 0x02, 0xC9, 0x0A, 0xF4, 0x0E, 0x48, 0x04, + 0x6A, 0x0A, 0x98, 0xF8, 0xCB, 0x06, 0xE8, 0xFB, 0x2A, 0x0C, 0xD6, 0x04, + 0x9E, 0x12, 0xC7, 0xFF, 0x6F, 0x13, 0x1D, 0x05, 0xDC, 0x10, 0xFE, 0x1D, + 0x73, 0x12, 0x0C, 0x31, 0xF8, 0x0D, 0x47, 0x3F, 0xBD, 0x00, 0x35, 0x46, + 0x24, 0x01, 0xED, 0x34, 0xF9, 0x17, 0xD8, 0x1D, 0x5D, 0x2F, 0x50, 0x1A, + 0xEC, 0x31, 0x45, 0x23, 0xAB, 0x26, 0x30, 0x2C, 0xF7, 0x20, 0x47, 0x2F, + 0x03, 0x1E, 0xC8, 0x2B, 0x6B, 0x16, 0xFA, 0x30, 0x47, 0x1C, 0xF2, 0x39, + 0xE8, 0x2C, 0xE1, 0x24, 0xA7, 0x2B, 0x71, 0xFE, 0x93, 0x28, 0x71, 0xEF, + 0xFB, 0x31, 0x25, 0xFE, 0x71, 0x26, 0xE9, 0x10, 0x7B, 0x0F, 0xA3, 0x14, + 0x6A, 0x0B, 0x55, 0x0E, 0x04, 0x0C, 0x10, 0x08, 0x9D, 0x0F, 0xB0, 0x0F, + 0xFA, 0x20, 0xF4, 0x22, 0xA7, 0x2F, 0xCA, 0x20, 0xC0, 0x2C, 0x90, 0x04, + 0x1F, 0x23, 0x30, 0xF3, 0x01, 0x23, 0x0B, 0xF9, 0xBD, 0x1C, 0x8E, 0x05, + 0x84, 0x06, 0xF2, 0x0B, 0xF7, 0xFC, 0x2B, 0x0E, 0x17, 0x07, 0xA4, 0x17, + 0x56, 0x11, 0x8A, 0x1E, 0x4C, 0x11, 0x35, 0x1C, 0x96, 0x07, 0x4A, 0x17, + 0x76, 0xFE, 0xC9, 0x0A, 0x05, 0xFD, 0x59, 0xFE, 0x68, 0x02, 0xFE, 0xFC, + 0x6C, 0x01, 0x8A, 0xFC, 0x9B, 0xF6, 0x8B, 0xFB, 0xE1, 0xF1, 0x0A, 0x06, + 0x00, 0xFE, 0x94, 0x0D, 0x91, 0x0C, 0x59, 0x0B, 0x74, 0x06, 0xE6, 0x0B, + 0xE6, 0xF0, 0xAE, 0x06, 0x19, 0xE5, 0x4F, 0xF9, 0xDF, 0xEE, 0x3C, 0xF4, + 0x39, 0xFE, 0xEC, 0xFE, 0x01, 0x05, 0xE6, 0x05, 0xA4, 0xFF, 0x9C, 0xFC, + 0xE8, 0xF0, 0x19, 0xEB, 0x77, 0xE6, 0x55, 0xDC, 0xA3, 0xE7, 0x18, 0xDC, + 0x62, 0xF1, 0x52, 0xDF, 0x63, 0xF4, 0xAD, 0xDF, 0x42, 0xE4, 0x87, 0xE1, + 0x21, 0xCE, 0x94, 0xDF, 0x80, 0xC2, 0xE6, 0xDC, 0x05, 0xC5, 0x68, 0xD8, + 0x14, 0xD2, 0xB0, 0xD3, 0xE2, 0xDD, 0xA0, 0xD1, 0x91, 0xE5, 0x82, 0xD2, + 0x70, 0xED, 0x2E, 0xDA, 0x59, 0xE9, 0xF6, 0xE1, 0x17, 0xDA, 0x99, 0xDD, + 0x85, 0xD2, 0x03, 0xD5, 0x58, 0xD2, 0x0A, 0xD9, 0x38, 0xD7, 0xF8, 0xE1, + 0xD1, 0xE6, 0xB1, 0xE9, 0xD8, 0xF1, 0x0A, 0xF4, 0x00, 0xEA, 0x91, 0xF3, + 0x2D, 0xDC, 0x49, 0xE7, 0xAD, 0xD7, 0xE7, 0xE6, 0x89, 0xDE, 0xFC, 0xE8, + 0x34, 0xE9, 0x8A, 0xD6, 0x47, 0xF5, 0x02, 0xC2, 0x6A, 0xFE, 0x61, 0xC2, + 0xBD, 0xFA, 0xBB, 0xCB, 0x50, 0xEB, 0x6F, 0xD4, 0x09, 0xD5, 0xBF, 0xE4, + 0x23, 0xC5, 0xB7, 0xEB, 0x87, 0xCB, 0xB5, 0xDE, 0x84, 0xDC, 0xEE, 0xD7, + 0xA6, 0xE4, 0xFD, 0xD9, 0xC5, 0xE4, 0xF5, 0xD5, 0xA2, 0xDE, 0xB9, 0xD1, + 0xE6, 0xD3, 0x8E, 0xD0, 0x42, 0xCE, 0xD0, 0xD1, 0x91, 0xCC, 0x5B, 0xD7, + 0x87, 0xCC, 0xDC, 0xD7, 0x79, 0xD4, 0x4B, 0xD2, 0x1A, 0xDD, 0x1B, 0xD7, + 0x30, 0xE0, 0x48, 0xE1, 0xA4, 0xE0, 0xE8, 0xE3, 0x0F, 0xE0, 0x85, 0xDE, + 0x45, 0xDE, 0x9A, 0xCB, 0xE4, 0xDD, 0xEB, 0xBB, 0x93, 0xED, 0x2F, 0xC2, + 0xDA, 0x00, 0x7C, 0xD5, 0x23, 0xF9, 0x9D, 0xE7, 0x74, 0xE7, 0x2D, 0xE7, + 0xAE, 0xE4, 0xAB, 0xD8, 0x99, 0xE7, 0xF0, 0xD3, 0x91, 0xE4, 0x25, 0xD3, + 0x0F, 0xD5, 0x3D, 0xCA, 0xFD, 0xBE, 0x8A, 0xC9, 0x36, 0xB8, 0x89, 0xD7, + 0xBE, 0xC7, 0x86, 0xE1, 0x38, 0xDA, 0x67, 0xE3, 0xA2, 0xD9, 0xE2, 0xE0, + 0x4F, 0xCA, 0xB0, 0xD9, 0x03, 0xBE, 0xB5, 0xD9, 0x8D, 0xB9, 0x6D, 0xE6, + 0x8E, 0xBA, 0xEE, 0xED, 0x56, 0xBE, 0x1F, 0xE6, 0xDE, 0xCC, 0x5F, 0xDF, + 0xBC, 0xE1, 0x2A, 0xE4, 0xA2, 0xE7, 0x0B, 0xE8, 0xE0, 0xE2, 0x3C, 0xE6, + 0x9E, 0xE4, 0xE4, 0xE8, 0xB4, 0xEF, 0x20, 0xE8, 0x62, 0xFD, 0x48, 0xE3, + 0xC5, 0x02, 0x79, 0xED, 0x9F, 0xFC, 0x38, 0xFB, 0x12, 0xF1, 0x2F, 0xFA, + 0xDB, 0xEA, 0x3E, 0xF8, 0xDA, 0xF2, 0xEA, 0xF6, 0x65, 0x03, 0xA8, 0xF1, + 0xD3, 0x12, 0xA8, 0xF3, 0x50, 0x1D, 0x1E, 0xFD, 0x2C, 0x19, 0x68, 0x07, + 0xC6, 0x05, 0x63, 0x0F, 0xD1, 0xF7, 0xF6, 0x10, 0x40, 0xF8, 0x22, 0x0C, + 0x10, 0xFE, 0x03, 0x08, 0xAF, 0x0C, 0x23, 0x0B, 0x05, 0x24, 0xCA, 0x11, + 0xB1, 0x31, 0xF4, 0x16, 0x71, 0x2A, 0xBA, 0x1E, 0x2F, 0x16, 0xAF, 0x26, + 0xD8, 0x05, 0x9D, 0x27, 0x08, 0x01, 0xA1, 0x25, 0xA6, 0x07, 0x6A, 0x22, + 0xAF, 0x17, 0xAF, 0x17, 0xBB, 0x22, 0xC5, 0x0B, 0xC5, 0x20, 0xF3, 0x06, + 0xD3, 0x1F, 0xAF, 0x07, 0xEF, 0x22, 0x87, 0x08, 0x86, 0x1F, 0x9E, 0x02, + 0x2F, 0x17, 0x8E, 0xF9, 0x5D, 0x12, 0xC9, 0xF9, 0xDE, 0x14, 0xFE, 0x01, + 0x6E, 0x1C, 0x68, 0x08, 0x14, 0x22, 0xA7, 0x12, 0x30, 0x1E, 0xB4, 0x1F, + 0xB4, 0x16, 0x4B, 0x23, 0x50, 0x15, 0x0F, 0x22, 0x77, 0x11, 0x5A, 0x29, + 0xB3, 0x0A, 0xBB, 0x32, 0xA9, 0x10, 0xA6, 0x2D, 0x00, 0x1F, 0x9D, 0x1E, + 0x87, 0x23, 0x86, 0x1A, 0x57, 0x1F, 0x6C, 0x19, 0x80, 0x19, 0xEC, 0x0A, + 0xDD, 0x0F, 0x75, 0x06, 0x60, 0x08, 0x21, 0x0E, 0xDC, 0x01, 0xFD, 0x0D, + 0xFC, 0xF7, 0xC0, 0x12, 0xB9, 0xF6, 0x24, 0x1D, 0x74, 0xFE, 0xE5, 0x0E, + 0x97, 0xF8, 0xC3, 0xF1, 0x3C, 0xE8, 0xCE, 0xE5, 0xBA, 0xE7, 0xA3, 0xE1, + 0xF5, 0xEF, 0x43, 0xDD, 0x70, 0xF4, 0x4C, 0xE5, 0x8C, 0x00, 0x56, 0xF3, + 0xD3, 0x0D, 0x9F, 0xFF, 0x54, 0x0D, 0x1C, 0x08, 0x62, 0x0A, 0x79, 0x03, + 0xE7, 0x06, 0x6A, 0xF4, 0x1F, 0xF9, 0x3A, 0xEE, 0xB5, 0xEC, 0xFB, 0xF7, + 0xDE, 0xF3, 0x78, 0xFC, 0x9C, 0x08, 0x4B, 0xFA, 0x9C, 0x11, 0xDB, 0xFF, + 0xE3, 0x0D, 0xFE, 0x05, 0x33, 0x05, 0xA9, 0x0F, 0x6E, 0xF9, 0x5B, 0x1E, + 0x57, 0xF9, 0xE7, 0x19, 0xEE, 0x05, 0x34, 0x08, 0x15, 0x12, 0x49, 0x00, + 0x67, 0x16, 0xCC, 0xF8, 0x29, 0x10, 0x24, 0xF2, 0x0C, 0x0D, 0xE6, 0xFB, + 0x0E, 0x18, 0x0A, 0x0C, 0x91, 0x1B, 0xB9, 0x14, 0xE1, 0x12, 0x5F, 0x1B, + 0x28, 0x17, 0x34, 0x20, 0x48, 0x22, 0xC0, 0x1C, 0xD1, 0x1E, 0xF2, 0x14, + 0x1F, 0x10, 0xA6, 0x15, 0x66, 0x01, 0x2E, 0x20, 0x0B, 0xFC, 0x63, 0x24, + 0xD2, 0x08, 0x27, 0x21, 0xE5, 0x1C, 0x79, 0x1D, 0xE3, 0x21, 0x43, 0x1A, + 0xAB, 0x17, 0x57, 0x1E, 0x7D, 0x0F, 0x2E, 0x21, 0xFB, 0x09, 0x23, 0x18, + 0x97, 0xFC, 0xFF, 0x0B, 0xEC, 0xF8, 0x04, 0x07, 0xC0, 0x07, 0xD8, 0x05, + 0x89, 0x10, 0x51, 0x0A, 0x4C, 0x12, 0x22, 0x18, 0xD1, 0x17, 0xA6, 0x1D, + 0xFC, 0x17, 0x2E, 0x17, 0x7D, 0x10, 0x6A, 0x10, 0x8C, 0x09, 0x22, 0x0C, + 0x66, 0x06, 0xA0, 0x0A, 0x9D, 0x08, 0x8C, 0x07, 0x5B, 0x13, 0x87, 0x08, + 0x8D, 0x23, 0x89, 0x0E, 0xDE, 0x2E, 0xD3, 0x0C, 0x3D, 0x2F, 0x84, 0x0A, + 0xFC, 0x26, 0xC7, 0x0C, 0x08, 0x14, 0x16, 0x0D, 0xDF, 0xF8, 0xCA, 0x0C, + 0x5B, 0xEE, 0x4A, 0x0C, 0xAD, 0xF7, 0xAF, 0x0A, 0xEB, 0xFC, 0xC6, 0x07, + 0x0E, 0xFF, 0xCD, 0xFF, 0xC4, 0x02, 0x27, 0xFE, 0x53, 0x00, 0x83, 0x0F, + 0xBC, 0xFB, 0xA7, 0x1C, 0x4B, 0xFD, 0xE4, 0x19, 0xB3, 0x00, 0xBF, 0x15, + 0x07, 0xFE, 0xEE, 0x11, 0x44, 0xF9, 0xFF, 0x0C, 0x67, 0xF4, 0xBB, 0x0A, + 0xDD, 0xF3, 0x8F, 0x07, 0x3A, 0xFB, 0x40, 0x07, 0xE3, 0xFE, 0x59, 0x12, + 0x8D, 0x01, 0x89, 0x1B, 0x96, 0x0B, 0x9B, 0x17, 0xE9, 0x15, 0x96, 0x0D, + 0xE0, 0x11, 0x59, 0x05, 0xC7, 0xFF, 0x83, 0xFE, 0x61, 0xED, 0xA0, 0xF3, + 0xEF, 0xE3, 0x18, 0xEA, 0x40, 0xF1, 0xDE, 0xEE, 0xDB, 0x09, 0x6A, 0xFC, + 0x1F, 0x12, 0xB3, 0x06, 0xDB, 0x0D, 0xE7, 0x0C, 0xDC, 0x0E, 0x4A, 0x0D, + 0x6E, 0x17, 0x7B, 0x03, 0x87, 0x1D, 0xB1, 0xF4, 0x42, 0x1D, 0xE0, 0xEF, + 0xB6, 0x17, 0x30, 0xF9, 0x22, 0x10, 0x7B, 0x02, 0xD4, 0x15, 0xA4, 0x08, + 0x69, 0x25, 0xC9, 0x11, 0xFD, 0x23, 0x6D, 0x17, 0xAB, 0x0E, 0xF9, 0x16, + 0x25, 0xFA, 0x5C, 0x14, 0xEA, 0xF7, 0xC4, 0x0C, 0x9B, 0xFF, 0x15, 0x02, + 0x2A, 0xFE, 0x6D, 0xF7, 0x41, 0xF5, 0x4F, 0xF0, 0x80, 0xEC, 0xFD, 0xF2, + 0xC4, 0xE9, 0x1C, 0xF9, 0xDE, 0xED, 0x75, 0xFA, 0x0D, 0xEF, 0x2E, 0xF7, + 0x57, 0xE8, 0x54, 0xF3, 0xB5, 0xE0, 0x8F, 0xF2, 0x1C, 0xE1, 0x66, 0xFA, + 0x0F, 0xE6, 0x46, 0x05, 0xD3, 0xE5, 0x3E, 0x02, 0x4B, 0xE1, 0x49, 0xF9, + 0xE6, 0xE2, 0x92, 0xF4, 0xE3, 0xEC, 0x50, 0xEF, 0x4F, 0xF4, 0x0E, 0xF0, + 0x37, 0xFC, 0x57, 0xF7, 0xA8, 0x08, 0x5F, 0xFD, 0xFE, 0x09, 0x7C, 0xFC, + 0xE6, 0xFD, 0x4C, 0xEC, 0x77, 0xF2, 0x55, 0xDC, 0x24, 0xED, 0x9E, 0xE0, + 0xD8, 0xE9, 0x79, 0xED, 0x58, 0xEB, 0x48, 0xFE, 0x7F, 0xFB, 0xA8, 0x12, + 0x7A, 0x0C, 0x97, 0x1C, 0x21, 0x07, 0x29, 0x1A, 0x90, 0xF6, 0x7E, 0x0D, + 0x1A, 0xEE, 0xDD, 0xF6, 0xE6, 0xE9, 0xB5, 0xE3, 0xD9, 0xE8, 0xCD, 0xE4, + 0x78, 0xF0, 0x49, 0xF7, 0x67, 0xF9, 0xE9, 0x04, 0xB9, 0x01, 0x1D, 0x02, + 0x8F, 0x0F, 0x3F, 0x00, 0xB8, 0x14, 0xD3, 0x01, 0x5B, 0x0B, 0x3E, 0xF7, + 0xDD, 0x01, 0x59, 0xEF, 0x34, 0xFF, 0x85, 0xF1, 0x02, 0x05, 0x09, 0xEC, + 0xB1, 0x0C, 0xE3, 0xE9, 0xCF, 0x10, 0x53, 0xF5, 0xEA, 0x13, 0x00, 0x02, + 0x7F, 0x11, 0x5F, 0x0D, 0x2B, 0x09, 0x69, 0x18, 0x60, 0x05, 0xE0, 0x1C, + 0xB3, 0x09, 0x96, 0x14, 0x88, 0x0F, 0x0D, 0x05, 0xB5, 0x0D, 0x6E, 0xFF, + 0x58, 0x08, 0x64, 0x0C, 0x8B, 0x05, 0x33, 0x1E, 0xE6, 0x05, 0x2A, 0x28, + 0x1D, 0x0D, 0x2B, 0x2D, 0x34, 0x1B, 0x8D, 0x32, 0x53, 0x2C, 0xB6, 0x3A, + 0x8F, 0x32, 0x68, 0x44, 0x70, 0x28, 0x52, 0x49, 0x3C, 0x19, 0xA9, 0x44, + 0x0C, 0x1A, 0x8E, 0x36, 0x5A, 0x2F, 0xEB, 0x23, 0x61, 0x3F, 0xF9, 0x17, + 0x7D, 0x43, 0x17, 0x17, 0xD2, 0x43, 0xF3, 0x22, 0xF8, 0x3F, 0xF4, 0x32, + 0xEE, 0x3B, 0x1C, 0x34, 0x16, 0x39, 0x8D, 0x2C, 0x12, 0x35, 0x21, 0x29, + 0xFC, 0x2F, 0x30, 0x26, 0x41, 0x2B, 0xA1, 0x21, 0x7D, 0x2C, 0x5F, 0x1F, + 0xBA, 0x34, 0xCB, 0x28, 0x0A, 0x39, 0x4F, 0x40, 0x0B, 0x36, 0x62, 0x4F, + 0xD6, 0x30, 0x63, 0x49, 0x19, 0x28, 0xF9, 0x42, 0x6B, 0x22, 0x3E, 0x42, + 0x82, 0x22, 0x72, 0x40, 0xFC, 0x1D, 0x1B, 0x45, 0x3B, 0x1A, 0xB2, 0x44, + 0x0B, 0x21, 0x24, 0x38, 0x43, 0x2C, 0xB7, 0x2E, 0xE1, 0x2A, 0x40, 0x26, + 0xC1, 0x13, 0xC4, 0x1C, 0xDF, 0xFE, 0xDC, 0x1B, 0x36, 0x04, 0xEA, 0x19, + 0xB2, 0x12, 0x91, 0x13, 0x25, 0x12, 0x52, 0x18, 0x76, 0x0A, 0x35, 0x1C, + 0x7E, 0x0B, 0x18, 0x12, 0x0C, 0x0F, 0x25, 0x05, 0x0C, 0x11, 0xF0, 0xFD, + 0xA5, 0x0F, 0xFB, 0xF8, 0x7A, 0x04, 0xEF, 0xF2, 0x8E, 0xFA, 0x19, 0xF3, + 0xEF, 0xFA, 0xDE, 0xFB, 0xE0, 0xF5, 0x93, 0xFE, 0x6C, 0xE5, 0xA1, 0xF4, + 0x74, 0xDF, 0x66, 0xEA, 0x8A, 0xEA, 0xD2, 0xDE, 0x90, 0xF2, 0x4C, 0xD1, + 0x83, 0xF1, 0x68, 0xCF, 0xD6, 0xF0, 0x97, 0xD3, 0x79, 0xEE, 0x6B, 0xD6, + 0xF9, 0xE4, 0x63, 0xD7, 0x43, 0xD9, 0x2C, 0xD8, 0x2E, 0xCD, 0x83, 0xD9, + 0x59, 0xC5, 0x0E, 0xD6, 0xC9, 0xCF, 0x98, 0xD0, 0x6F, 0xE6, 0x10, 0xCA, + 0xAC, 0xEE, 0x53, 0xC8, 0x34, 0xE0, 0x0B, 0xCC, 0xC6, 0xCF, 0xCC, 0xCB, + 0x3C, 0xCD, 0x40, 0xC9, 0x1C, 0xD4, 0xA4, 0xC9, 0x0A, 0xDB, 0x2E, 0xCD, + 0x07, 0xE6, 0x89, 0xD0, 0xF9, 0xF6, 0x88, 0xD7, 0xAB, 0xFB, 0xDB, 0xDE, + 0x3A, 0xEB, 0x15, 0xDD, 0xDE, 0xDE, 0xE7, 0xE1, 0xFB, 0xE7, 0xA7, 0xF0, + 0xFD, 0xEC, 0x00, 0xF7, 0x69, 0xDF, 0x29, 0xF3, 0xDE, 0xD6, 0xE2, 0xE8, + 0x35, 0xD7, 0x6D, 0xDC, 0x98, 0xD6, 0x38, 0xDC, 0x3D, 0xDA, 0x9B, 0xE7, + 0xD1, 0xDD, 0x82, 0xEA, 0x4C, 0xDE, 0x6B, 0xE3, 0xA2, 0xF0, 0xE4, 0xE6, + 0x01, 0x0D, 0x1E, 0xF8, 0x37, 0x0B, 0xFC, 0xFF, 0x99, 0xF5, 0xCF, 0xF9, + 0xB8, 0xE3, 0xBC, 0xF4, 0xFE, 0xDC, 0x24, 0xF7, 0xC2, 0xE5, 0x0F, 0xEF, + 0x60, 0xF2, 0x0F, 0xE0, 0x4C, 0xF5, 0x6D, 0xDB, 0x27, 0xF8, 0x77, 0xDF, + 0xCE, 0xFF, 0xEB, 0xE6, 0x19, 0xFA, 0x54, 0xE1, 0xEE, 0xE7, 0xEF, 0xD7, + 0xDB, 0xD0, 0x58, 0xD7, 0x55, 0xC7, 0x81, 0xD9, 0xF8, 0xC8, 0x17, 0xD8, + 0x85, 0xCF, 0xA0, 0xDF, 0xC2, 0xD6, 0x90, 0xEA, 0x5A, 0xCC, 0x9A, 0xE0, + 0x9C, 0xCA, 0x95, 0xDA, 0x72, 0xD0, 0x02, 0xD7, 0x9C, 0xCD, 0x32, 0xCE, + 0xB5, 0xC1, 0xDA, 0xD2, 0xF9, 0xB8, 0x4C, 0xDE, 0x40, 0xBC, 0x9F, 0xE1, + 0x28, 0xB9, 0xCE, 0xDC, 0xFD, 0xB2, 0x74, 0xD6, 0xAC, 0xAD, 0x61, 0xCA, + 0x69, 0xB2, 0xFD, 0xC1, 0x74, 0xC9, 0x11, 0xC8, 0xA6, 0xDA, 0x4E, 0xCD, + 0x97, 0xE6, 0x63, 0xC9, 0x6B, 0xE8, 0xDC, 0xCA, 0xBC, 0xDC, 0xC5, 0xD5, + 0x4A, 0xD2, 0x1C, 0xD9, 0x4C, 0xC4, 0x48, 0xD3, 0x40, 0xD1, 0x42, 0xD4, + 0xA3, 0xE1, 0x92, 0xD0, 0xB0, 0xED, 0x1D, 0xD6, 0x2A, 0xFF, 0x81, 0xDF, + 0x8A, 0xF2, 0x1B, 0xDD, 0x05, 0xF4, 0x2C, 0xDE, 0xCA, 0xF7, 0xBD, 0xD4, + 0x5A, 0xE6, 0x9A, 0xD8, 0x10, 0xDD, 0xD1, 0xDE, 0xC0, 0xE5, 0x57, 0xDF, + 0xDB, 0x0A, 0xCF, 0xF0, 0x3D, 0x16, 0xF5, 0xFE, 0x51, 0x14, 0x49, 0x06, + 0xA4, 0x11, 0x6E, 0x0A, 0xD0, 0xF7, 0x6B, 0x0E, 0xA6, 0x08, 0xAB, 0x15, + 0xAC, 0x1D, 0x3C, 0x16, 0x7B, 0x14, 0xC4, 0x12, 0x5D, 0x19, 0x0C, 0x15, + 0x76, 0x24, 0x6A, 0x1A, 0xBF, 0x1C, 0x03, 0x0C, 0x2B, 0x11, 0xDB, 0xFE, + 0xA9, 0x14, 0x62, 0x09, 0x89, 0x1A, 0x41, 0x10, 0x02, 0x27, 0xFB, 0x18, + 0x1B, 0x2D, 0x82, 0x33, 0xA6, 0x29, 0xAD, 0x42, 0x90, 0x21, 0x1F, 0x29, + 0x8B, 0x1D, 0x61, 0x18, 0xCE, 0x20, 0x28, 0x19, 0x67, 0x22, 0x91, 0x10, + 0x87, 0x2A, 0x09, 0x20, 0xEB, 0x35, 0xE0, 0x3F, 0x29, 0x42, 0x6D, 0x41, + 0xB0, 0x49, 0x29, 0x35, 0xCC, 0x3F, 0x20, 0x32, 0x42, 0x29, 0xD2, 0x25, + 0x3E, 0x17, 0x2F, 0x17, 0x99, 0x16, 0x58, 0x10, 0xDE, 0x1D, 0x37, 0x14, + 0x2E, 0x1E, 0xD0, 0x23, 0xD3, 0x18, 0xA1, 0x31, 0xF9, 0x0C, 0x0D, 0x3D, + 0x2B, 0x02, 0xE4, 0x38, 0x84, 0x04, 0x91, 0x28, 0xAB, 0x03, 0xC5, 0x17, + 0x6F, 0xF4, 0x8D, 0xFE, 0xF5, 0xEE, 0xDF, 0xF5, 0xD3, 0xEC, 0x7C, 0xFA, + 0xB5, 0xDB, 0xB4, 0xFD, 0x72, 0xE6, 0x67, 0x06, 0x5A, 0xF3, 0xF8, 0xFC, + 0xBC, 0xF0, 0x0D, 0xE9, 0xC1, 0x04, 0x08, 0xE6, 0x25, 0x1A, 0x74, 0xEE, + 0xFC, 0x15, 0x05, 0xF1, 0xB5, 0x06, 0x24, 0xF2, 0x4F, 0xFA, 0xDC, 0xE9, + 0xFC, 0xED, 0xED, 0xDF, 0x58, 0xE8, 0x35, 0xE2, 0xA1, 0xEC, 0xE6, 0xD7, + 0x4D, 0xF9, 0x0D, 0xD9, 0x7A, 0xF7, 0x59, 0xED, 0x35, 0xF9, 0xC9, 0x00, + 0x9B, 0x08, 0x5D, 0x06, 0x24, 0x12, 0x1E, 0x01, 0x8C, 0x08, 0x7F, 0xF3, + 0x92, 0xF4, 0xFB, 0xE5, 0x78, 0xF4, 0x54, 0xEF, 0x25, 0xF2, 0x91, 0xEB, + 0x3C, 0xFC, 0xED, 0xEB, 0x68, 0x14, 0x62, 0x01, 0x58, 0x12, 0x78, 0x07, + 0xB1, 0x0C, 0xCA, 0x06, 0x82, 0x08, 0xE5, 0x03, 0x22, 0x02, 0x29, 0x0D, + 0x93, 0x04, 0x4C, 0x20, 0xF2, 0xFE, 0x6C, 0x22, 0x11, 0x03, 0xE9, 0x1F, + 0x8C, 0x12, 0xF9, 0x14, 0x9C, 0x1D, 0x13, 0x06, 0xA7, 0x27, 0xA7, 0x0A, + 0xE0, 0x1D, 0x86, 0x0E, 0xAD, 0x0C, 0x02, 0x08, 0x24, 0x0B, 0x65, 0x08, + 0xC0, 0x1A, 0xA4, 0x0E, 0xD5, 0x18, 0x2C, 0x06, 0x98, 0x0F, 0xA5, 0x0A, + 0x0B, 0x0A, 0x7A, 0x10, 0xF7, 0x06, 0x5D, 0x07, 0x5C, 0x06, 0xBE, 0x0D, + 0x9F, 0xFC, 0xDD, 0x12, 0x5E, 0x07, 0x4E, 0x18, 0x19, 0x12, 0xB6, 0x1C, + 0xDC, 0x15, 0x37, 0x1C, 0x64, 0x18, 0x8E, 0x16, 0xC8, 0x0C, 0x06, 0x11, + 0x87, 0x07, 0xC5, 0x12, 0x14, 0x12, 0xD7, 0x12, 0xF1, 0x1A, 0x1A, 0x03, + 0x92, 0x26, 0x2B, 0xF8, 0xF3, 0x26, 0xA5, 0x00, 0x77, 0x1C, 0xA9, 0x0F, + 0xB5, 0x09, 0x38, 0x13, 0x7E, 0xF8, 0x36, 0x03, 0xB2, 0xFF, 0x6E, 0xF4, + 0x2A, 0x10, 0x8D, 0xFA, 0x52, 0x11, 0x93, 0x0A, 0x76, 0xF8, 0xA2, 0x09, + 0x67, 0xE3, 0x38, 0x04, 0x2C, 0xDE, 0x57, 0x0E, 0x12, 0xE5, 0x49, 0x19, + 0x73, 0xF2, 0x4A, 0x0D, 0x8E, 0xFB, 0xC4, 0x01, 0xCF, 0xF2, 0x55, 0xFE, + 0x33, 0xF0, 0x08, 0xF9, 0x92, 0x05, 0xB4, 0x01, 0x9E, 0xF7, 0x47, 0x00, + 0xF7, 0xD4, 0x10, 0xF5, 0xF8, 0xD1, 0xEE, 0xFC, 0x24, 0xD5, 0x1F, 0x08, + 0x02, 0xE5, 0x8B, 0x07, 0xB1, 0xF5, 0x8B, 0xFB, 0xAE, 0xF9, 0x17, 0xF4, + 0xC6, 0xF8, 0xA3, 0xEF, 0x4F, 0xF9, 0x55, 0xEA, 0x22, 0xFA, 0x87, 0xEC, + 0x91, 0xF4, 0x9B, 0xF6, 0xBD, 0xF9, 0x76, 0xFC, 0xB5, 0x06, 0x20, 0xF9, + 0xDC, 0x19, 0x17, 0xF6, 0xE3, 0x29, 0xC5, 0xF4, 0xD0, 0x1E, 0xFF, 0xF6, + 0x2C, 0x15, 0x8B, 0xFD, 0x15, 0x15, 0x64, 0x06, 0x51, 0x15, 0x29, 0x0F, + 0x61, 0x1B, 0x32, 0x1A, 0x11, 0x13, 0x3E, 0x1E, 0x4E, 0x0E, 0x04, 0x1E, + 0xBE, 0x13, 0xFF, 0x18, 0x6C, 0x0E, 0x7B, 0x0E, 0xD0, 0x11, 0xF3, 0x10, + 0x0E, 0x17, 0xE8, 0x10, 0xA2, 0x08, 0x21, 0x0E, 0x27, 0x0F, 0x93, 0x16, + 0x3A, 0x2A, 0xA3, 0x1F, 0x68, 0x20, 0x98, 0x1A, 0xDA, 0x0D, 0x9F, 0x07, + 0x24, 0x07, 0x6A, 0xF3, 0x86, 0xED, 0xD5, 0xEA, 0xD7, 0xD5, 0xF1, 0xEE, + 0x36, 0xD9, 0xEA, 0xFA, 0x3B, 0xE9, 0x2E, 0x04, 0x81, 0xFE, 0x44, 0x0C, + 0x36, 0x05, 0x00, 0x03, 0xD7, 0xFA, 0x2E, 0xF5, 0x16, 0xF4, 0x2D, 0xEF, + 0xDF, 0xEC, 0x22, 0xDF, 0x97, 0xEC, 0x27, 0xE0, 0x4F, 0xF2, 0x07, 0xEB, + 0x71, 0xF0, 0x7A, 0xEE, 0x80, 0xE7, 0x62, 0xED, 0x89, 0xE8, 0xBA, 0xF3, + 0x9C, 0xDC, 0xCB, 0xF9, 0x98, 0xC6, 0x09, 0xF1, 0xBB, 0xD1, 0x89, 0xE4, + 0x3F, 0xEF, 0xED, 0xEB, 0xDF, 0xFC, 0x11, 0xF8, 0xFD, 0xF7, 0x02, 0xED, + 0xB2, 0xF7, 0x71, 0xE8, 0x87, 0xEE, 0xD3, 0xE6, 0x0E, 0xE6, 0x3C, 0xEC, + 0x45, 0xF8, 0x30, 0x03, 0xEA, 0x03, 0x0B, 0x0A, 0x35, 0x00, 0xF7, 0x02, + 0x33, 0xFB, 0xF3, 0xFA, 0x5C, 0x04, 0xE7, 0xFB, 0x18, 0x04, 0x59, 0xFA, + 0xC3, 0xF4, 0xA9, 0xEB, 0x10, 0xFD, 0xE0, 0xE4, 0x2D, 0x06, 0x87, 0xDE, + 0xCA, 0x0A, 0x2B, 0xE4, 0x0F, 0x14, 0x61, 0x03, 0xCE, 0x10, 0x90, 0x15, + 0xFE, 0x0E, 0x96, 0x14, 0x12, 0x10, 0x92, 0x16, 0xFF, 0x0B, 0x9E, 0x16, + 0x0D, 0x04, 0x2C, 0x10, 0xDC, 0x0A, 0x0E, 0x18, 0x1C, 0x1B, 0xBF, 0x29, + 0x2F, 0x29, 0x69, 0x34, 0xDB, 0x39, 0xAA, 0x39, 0x9D, 0x3B, 0x5B, 0x3C, + 0x5B, 0x2F, 0x17, 0x37, 0xF9, 0x1D, 0xC4, 0x37, 0x01, 0x0F, 0x5C, 0x47, + 0x60, 0x10, 0x7A, 0x4E, 0x28, 0x1F, 0x62, 0x4F, 0x06, 0x35, 0x1E, 0x4B, + 0x7E, 0x4E, 0x81, 0x42, 0x8B, 0x56, 0x2D, 0x42, 0x7A, 0x3E, 0xA9, 0x3B, + 0x2D, 0x37, 0x48, 0x30, 0xB3, 0x3E, 0x78, 0x27, 0xFC, 0x37, 0x3A, 0x1F, + 0xA8, 0x2F, 0xC0, 0x1C, 0x5A, 0x2D, 0xBF, 0x22, 0x4D, 0x36, 0x6C, 0x1F, + 0x37, 0x46, 0xCF, 0x1D, 0x06, 0x42, 0x55, 0x1C, 0xEB, 0x29, 0x12, 0x10, + 0xBE, 0x1B, 0x8A, 0x1A, 0x8E, 0x10, 0xCC, 0x24, 0xC4, 0x08, 0x80, 0x1D, + 0x78, 0x0F, 0x01, 0x18, 0xF0, 0x09, 0xD8, 0x0D, 0xA9, 0x01, 0xB8, 0x0C, + 0x1C, 0x0C, 0x13, 0x18, 0x9D, 0x09, 0xB7, 0x1A, 0x49, 0xFD, 0xE1, 0x16, + 0x4E, 0xFE, 0x41, 0x0D, 0x7B, 0x02, 0x71, 0x01, 0xF2, 0xF8, 0x8F, 0xFB, + 0xEB, 0xE9, 0x5E, 0xFB, 0x1F, 0xDF, 0x31, 0xF7, 0xF0, 0xE4, 0x61, 0xF7, + 0x0A, 0xF1, 0x82, 0xFB, 0xDA, 0xF1, 0x59, 0xFC, 0xCD, 0xEE, 0x27, 0x01, + 0xF3, 0xEB, 0x70, 0x03, 0x16, 0xED, 0x80, 0xFE, 0xF1, 0xE5, 0x52, 0xF6, + 0x22, 0xE3, 0x0B, 0xFA, 0xA1, 0xEA, 0x40, 0xFB, 0x8A, 0xF7, 0x23, 0xF6, + 0xF9, 0x0E, 0xAB, 0xF1, 0xE5, 0x13, 0x79, 0xE9, 0x30, 0x09, 0x43, 0xEE, + 0x9E, 0xFF, 0x30, 0xF7, 0xEE, 0xFD, 0xEB, 0xF8, 0x80, 0x09, 0x9C, 0xF9, + 0x92, 0x0A, 0x6A, 0xF3, 0xAB, 0x0A, 0x3B, 0xFA, 0xF6, 0x0C, 0x1C, 0x06, + 0xFB, 0x09, 0x98, 0xFF, 0xB6, 0x0A, 0xF7, 0x01, 0x8F, 0x14, 0x56, 0x11, + 0xA8, 0x27, 0x5E, 0x19, 0x9E, 0x23, 0x54, 0x0C, 0xAD, 0x11, 0xBB, 0x00, + 0xF2, 0x0C, 0xAD, 0xFF, 0xA4, 0x08, 0x74, 0xFE, 0x46, 0x07, 0x34, 0x10, + 0x95, 0x09, 0x34, 0x1E, 0x47, 0x14, 0x8A, 0x19, 0x32, 0x18, 0xB0, 0x13, + 0xD0, 0x13, 0x96, 0x16, 0xFC, 0x17, 0x61, 0x18, 0x40, 0x14, 0xFC, 0x0E, + 0x91, 0x01, 0xF8, 0x0E, 0x49, 0xF4, 0xC7, 0x14, 0x85, 0xF8, 0x51, 0x0B, + 0x32, 0xFE, 0xBE, 0xFD, 0xBB, 0x09, 0x2A, 0xFA, 0x6D, 0x07, 0x68, 0xF5, + 0x96, 0xF0, 0x71, 0xED, 0x7B, 0xE8, 0x48, 0xEF, 0x49, 0xE6, 0x0C, 0xEB, + 0xA8, 0xE4, 0x78, 0xE0, 0x6F, 0xEE, 0xF4, 0xE0, 0x5F, 0xEC, 0x55, 0xE4, + 0xFB, 0xE0, 0x7B, 0xEA, 0x6C, 0xDF, 0xC4, 0xF0, 0xAE, 0xE2, 0x1B, 0xF7, + 0x18, 0xDD, 0xA7, 0xED, 0x74, 0xD8, 0xD7, 0xD3, 0x78, 0xDB, 0xEA, 0xC6, + 0x3B, 0xDB, 0x4C, 0xCC, 0x15, 0xD2, 0x5A, 0xCF, 0xA5, 0xC1, 0xFA, 0xC7, + 0xC3, 0xC5, 0xA4, 0xCA, 0x19, 0xCD, 0x5B, 0xCD, 0x71, 0xC7, 0x49, 0xC5, + 0xD8, 0xC9, 0xF6, 0xC3, 0x13, 0xC5, 0xAE, 0xC4, 0xE1, 0xBE, 0x2E, 0xC4, + 0x85, 0xC2, 0x85, 0xC8, 0x7D, 0xCC, 0x6F, 0xC5, 0x58, 0xD6, 0x95, 0xBA, + 0x9B, 0xCE, 0xDB, 0xBA, 0xBB, 0xC6, 0x1A, 0xC4, 0x55, 0xC6, 0x56, 0xC8, + 0xD8, 0xBD, 0x69, 0xCC, 0xA7, 0xC2, 0x4C, 0xD7, 0x9F, 0xD1, 0xE8, 0xDE, + 0x5C, 0xD0, 0x01, 0xE0, 0xF5, 0xC9, 0xC4, 0xE3, 0x76, 0xD6, 0x47, 0xEB, + 0x40, 0xDE, 0x7F, 0xF1, 0xBC, 0xD0, 0xC0, 0xF0, 0xB5, 0xD4, 0x04, 0xF7, + 0x6C, 0xEA, 0xE6, 0x01, 0x6B, 0xFE, 0x36, 0xFE, 0x48, 0x11, 0xEC, 0xFB, + 0x1A, 0x13, 0x9F, 0x00, 0xB3, 0xFF, 0xCA, 0xFC, 0xA4, 0xF7, 0x80, 0xF7, + 0xC7, 0xFD, 0x8D, 0x04, 0x68, 0x07, 0x44, 0x17, 0x4D, 0x15, 0x0C, 0x14, + 0x63, 0x20, 0x89, 0x07, 0x54, 0x29, 0xA6, 0x04, 0xC6, 0x2D, 0xB7, 0x0B, + 0x8D, 0x25, 0xCC, 0x0D, 0xCA, 0x1D, 0x4D, 0x0E, 0x2F, 0x17, 0xCB, 0x10, + 0x47, 0x0F, 0xE5, 0x0E, 0x72, 0x0F, 0x68, 0x13, 0xC1, 0x1A, 0x7E, 0x1E, + 0x07, 0x21, 0x01, 0x23, 0x74, 0x18, 0x58, 0x21, 0xFF, 0x16, 0x05, 0x26, + 0xEB, 0x10, 0x2B, 0x25, 0x75, 0x03, 0x77, 0x16, 0xF9, 0xFE, 0xF6, 0x0D, + 0x73, 0xF8, 0x21, 0x09, 0x45, 0xF1, 0x6F, 0x01, 0xF7, 0xF7, 0xD6, 0xFD, + 0xB5, 0x0A, 0x98, 0xFD, 0xB1, 0x0D, 0x6C, 0x00, 0x8E, 0x01, 0x1E, 0x08, + 0xD4, 0xF7, 0xC3, 0x01, 0xC0, 0xED, 0xD1, 0xED, 0xC6, 0xED, 0x8B, 0xE3, + 0xBA, 0xF4, 0xB4, 0xDF, 0xD8, 0xFA, 0xD6, 0xE5, 0xE8, 0x03, 0xC3, 0xF1, + 0x6D, 0x0B, 0x78, 0xF1, 0x93, 0x16, 0x1D, 0xF0, 0x88, 0x06, 0x5C, 0xE9, + 0x32, 0xEA, 0x43, 0xE9, 0x9E, 0xDF, 0xD5, 0xEA, 0x9E, 0xE1, 0xCA, 0xDE, + 0x51, 0xF7, 0xDD, 0xE3, 0x89, 0x08, 0x25, 0xF6, 0xA8, 0xFB, 0x14, 0xFB, + 0x3E, 0xDE, 0x86, 0xFE, 0x34, 0xC8, 0xEE, 0x06, 0xD8, 0xC8, 0xB9, 0x06, + 0x35, 0xE6, 0x89, 0xFB, 0x10, 0xF8, 0x6B, 0xEE, 0x6C, 0xEF, 0xBB, 0xEC, + 0xD7, 0xF3, 0xCE, 0xF5, 0xF4, 0xFD, 0x80, 0x07, 0x98, 0xFE, 0xFF, 0x14, + 0xFF, 0xFF, 0x31, 0x0D, 0x06, 0x03, 0xE7, 0x02, 0xE3, 0x0C, 0xB5, 0x06, + 0xA7, 0x19, 0x31, 0x09, 0x01, 0x2C, 0x6C, 0x10, 0xC8, 0x28, 0xF1, 0x13, + 0xFB, 0x14, 0x5A, 0x0F, 0xC1, 0x13, 0x66, 0x10, 0xB9, 0x19, 0xDE, 0x0A, + 0x47, 0x28, 0x20, 0x0C, 0x23, 0x2D, 0xB4, 0x12, 0x0B, 0x25, 0x81, 0x17, + 0x37, 0x1A, 0x5F, 0x1B, 0xD7, 0x17, 0x8A, 0x18, 0xFB, 0x19, 0x3F, 0x1C, + 0x57, 0x0F, 0x65, 0x1C, 0xC5, 0x14, 0x82, 0x17, 0x36, 0x25, 0xA1, 0x1E, + 0xEC, 0x30, 0xDE, 0x25, 0x2D, 0x3B, 0xFC, 0x25, 0x4B, 0x33, 0x3A, 0x23, + 0x64, 0x22, 0x1B, 0x1C, 0x7E, 0x1A, 0x2C, 0x0E, 0x16, 0x15, 0xAE, 0x04, + 0xAF, 0x09, 0xBF, 0x07, 0xFB, 0xFF, 0x21, 0x14, 0xD1, 0x07, 0x85, 0x21, + 0xCF, 0x10, 0xE9, 0x18, 0x24, 0x12, 0x63, 0x0E, 0xF8, 0x05, 0x3A, 0x08, + 0xA2, 0xF0, 0x87, 0xF6, 0x7B, 0xE0, 0xE4, 0xE8, 0x3A, 0xDB, 0x87, 0xE8, + 0xF5, 0xE5, 0x4D, 0xE8, 0x19, 0xF0, 0xA7, 0xE7, 0xBE, 0xF1, 0xCD, 0xF6, + 0x6E, 0xEC, 0x56, 0x01, 0x07, 0xDB, 0x49, 0xF6, 0x7E, 0xCD, 0x79, 0xE8, + 0x79, 0xD1, 0xFE, 0xDA, 0x91, 0xCF, 0x8A, 0xCA, 0xDC, 0xC8, 0xAD, 0xC5, + 0x4B, 0xC5, 0x5E, 0xCB, 0x24, 0xC8, 0x6E, 0xD4, 0x72, 0xDC, 0x2C, 0xE1, + 0x42, 0xEB, 0xCF, 0xE4, 0x1E, 0xEA, 0xEE, 0xE2, 0xC7, 0xEA, 0x30, 0xE3, + 0x26, 0xF2, 0xBE, 0xE0, 0x5D, 0xFC, 0x6A, 0xDA, 0x16, 0xF8, 0xBC, 0xD3, + 0x39, 0xE4, 0x8D, 0xDA, 0xAD, 0xE1, 0x4E, 0xEB, 0x22, 0xF2, 0x85, 0xFA, + 0x38, 0x08, 0x01, 0x08, 0x36, 0x19, 0x51, 0x12, 0x44, 0x1B, 0x3F, 0x13, + 0x52, 0x13, 0x86, 0x0A, 0x4F, 0x13, 0x75, 0x08, 0x6A, 0x0B, 0x6C, 0x05, + 0x9B, 0xF7, 0x69, 0x03, 0x7A, 0xFF, 0x17, 0x11, 0x07, 0x16, 0xFB, 0x1F, + 0x9A, 0x1F, 0x64, 0x27, 0x57, 0x34, 0xFD, 0x2F, 0xA3, 0x44, 0x8F, 0x36, + 0x82, 0x35, 0x1A, 0x36, 0x77, 0x21, 0x52, 0x33, 0xA3, 0x13, 0x05, 0x2B, + 0xB4, 0x09, 0x4F, 0x1D, 0x77, 0x0B, 0xF7, 0x1C, 0xA7, 0x0F, 0xE8, 0x21, + 0x76, 0x0F, 0xBE, 0x1F, 0xEE, 0x15, 0x54, 0x27, 0x62, 0x21, 0x84, 0x32, + 0x5A, 0x28, 0x46, 0x2C, 0x36, 0x1B, 0x67, 0x1D, 0x5B, 0x0D, 0x1C, 0x0E, + 0xA2, 0x0A, 0x6D, 0xF4, 0xFF, 0x09, 0xBD, 0xE8, 0x32, 0x01, 0x41, 0xEE, + 0xD8, 0xF4, 0x51, 0xF6, 0xB7, 0x00, 0x9A, 0xFF, 0x5D, 0x13, 0xC6, 0x02, + 0xA1, 0x19, 0xA9, 0x09, 0x6B, 0x13, 0x11, 0x08, 0x71, 0xFA, 0x16, 0xEE, + 0x59, 0xE2, 0x4F, 0xE0, 0x24, 0xE0, 0x7C, 0xDC, 0x5D, 0xEF, 0x34, 0xD8, + 0x5D, 0xF4, 0xCB, 0xE0, 0x7D, 0xEC, 0x43, 0xE7, 0x4F, 0xF4, 0xC5, 0xE8, + 0x8A, 0xF8, 0x1F, 0xE7, 0xD4, 0xEB, 0xE8, 0xE7, 0xFC, 0xD9, 0x46, 0xE5, + 0x0D, 0xCE, 0x75, 0xD5, 0x8D, 0xC3, 0xC6, 0xBD, 0xC2, 0xBD, 0x63, 0xB5, + 0x43, 0xC6, 0x2F, 0xC6, 0x3A, 0xC7, 0xDE, 0xCE, 0xFB, 0xC3, 0x96, 0xD4, + 0x6D, 0xBC, 0xC3, 0xE3, 0xC0, 0xB6, 0x57, 0xE4, 0x95, 0xC0, 0xB8, 0xD6, + 0xC4, 0xCA, 0xA4, 0xD2, 0xF2, 0xCB, 0x84, 0xD7, 0x0B, 0xD5, 0x72, 0xD6, + 0xB3, 0xDE, 0x2B, 0xDA, 0xF8, 0xE0, 0x94, 0xE4, 0x22, 0xE8, 0x88, 0xE6, + 0x04, 0xEC, 0xD0, 0xE5, 0x52, 0xEA, 0x5C, 0xEC, 0x76, 0xEE, 0xA3, 0xF9, + 0x5D, 0xF8, 0x0F, 0x06, 0xC7, 0xF3, 0x51, 0x02, 0x26, 0xEF, 0x68, 0xF9, + 0xA6, 0xFC, 0x9E, 0xF7, 0xF4, 0x04, 0x88, 0xF6, 0xEB, 0x03, 0x8C, 0x00, + 0x77, 0x0B, 0x79, 0x19, 0xD4, 0x0D, 0xD4, 0x28, 0x6E, 0x12, 0xAE, 0x2D, + 0xAF, 0x22, 0xC2, 0x28, 0x98, 0x34, 0xD8, 0x1C, 0x36, 0x33, 0xDF, 0x13, + 0xA1, 0x20, 0x6C, 0x13, 0xAC, 0x11, 0x40, 0x1D, 0x2E, 0x0B, 0xF8, 0x1E, + 0x31, 0x16, 0x82, 0x15, 0xBF, 0x2B, 0x56, 0x14, 0xC4, 0x33, 0xA9, 0x19, + 0x94, 0x2E, 0x27, 0x1E, 0xC5, 0x2C, 0x06, 0x24, 0x0D, 0x29, 0x69, 0x1D, + 0x90, 0x1B, 0x7F, 0x0E, 0x6C, 0x10, 0xE3, 0x10, 0x9D, 0x16, 0xA2, 0x12, + 0x6E, 0x1D, 0x8B, 0x09, 0x4E, 0x1C, 0xC4, 0x0A, 0xE2, 0x21, 0x38, 0x0F, + 0x35, 0x1C, 0x39, 0x06, 0x50, 0x0E, 0x0F, 0x04, 0x2C, 0x18, 0x4A, 0x10, + 0x38, 0x21, 0x56, 0x18, 0x30, 0x13, 0x9A, 0x1E, 0x20, 0x01, 0xD7, 0x21, + 0x66, 0xF3, 0x0C, 0x1D, 0xE8, 0xE8, 0x48, 0x13, 0xD7, 0xE6, 0xC5, 0x0D, + 0x48, 0xE7, 0x49, 0x0C, 0xB7, 0xEE, 0x3E, 0x14, 0xB2, 0xFC, 0x05, 0x1C, + 0x90, 0x06, 0x5D, 0x16, 0x0A, 0x14, 0xF9, 0x0C, 0x34, 0x19, 0xB9, 0x01, + 0x39, 0x09, 0x20, 0xEF, 0x55, 0x00, 0xE4, 0xE1, 0x83, 0x01, 0xFB, 0xE6, + 0xD1, 0x02, 0xDA, 0xFF, 0xA0, 0x1A, 0xED, 0x1A, 0xEB, 0x2F, 0x7F, 0x27, + 0xD5, 0x34, 0xBD, 0x38, 0x87, 0x34, 0x79, 0x3A, 0xCB, 0x2A, 0x07, 0x21, + 0xAA, 0x25, 0x22, 0x0C, 0x50, 0x20, 0x53, 0x05, 0xC4, 0x15, 0x05, 0x10, + 0xED, 0x1E, 0x51, 0x23, 0x43, 0x30, 0x68, 0x31, 0x76, 0x2E, 0xA1, 0x45, + 0xF4, 0x23, 0x4A, 0x4E, 0xCD, 0x17, 0x4F, 0x46, 0x99, 0x0A, 0xC6, 0x40, + 0x6A, 0x0E, 0xF9, 0x36, 0x73, 0x1E, 0x56, 0x2F, 0x38, 0x23, 0x19, 0x34, + 0xDA, 0x1D, 0xF6, 0x39, 0xBC, 0x16, 0x01, 0x37, 0x52, 0x19, 0x72, 0x37, + 0x2C, 0x17, 0xF5, 0x3D, 0xA9, 0x0B, 0xA5, 0x41, 0x47, 0x16, 0x34, 0x41, + 0x18, 0x2C, 0x8A, 0x3D, 0x43, 0x38, 0xB1, 0x32, 0x61, 0x43, 0x02, 0x23, + 0x4C, 0x42, 0x25, 0x13, 0xCA, 0x29, 0xA8, 0x05, 0x7B, 0x12, 0x04, 0x0A, + 0x86, 0x07, 0xA0, 0x18, 0x20, 0x0A, 0x25, 0x1D, 0x7F, 0x14, 0xA6, 0x16, + 0xC9, 0x1C, 0x64, 0x0A, 0x2D, 0x21, 0x92, 0xFC, 0x85, 0x16, 0xB2, 0xF2, + 0x67, 0x04, 0x07, 0xF2, 0xDD, 0xF7, 0x1F, 0xF4, 0xFD, 0xF7, 0x3D, 0xFF, + 0x96, 0xFB, 0x2C, 0x04, 0xE4, 0x02, 0xC3, 0xF8, 0x52, 0xFF, 0x77, 0xE7, + 0x65, 0xED, 0x9E, 0xD5, 0x06, 0xE9, 0x27, 0xD0, 0xAA, 0xE1, 0xEC, 0xD2, + 0x83, 0xD1, 0x25, 0xD0, 0x0E, 0xDA, 0xF3, 0xD5, 0x62, 0xE7, 0xE5, 0xE3, + 0xBE, 0xE6, 0xFF, 0xE2, 0x91, 0xEC, 0x2A, 0xDA, 0x14, 0xE8, 0xC4, 0xD0, + 0xE0, 0xD8, 0x9C, 0xC5, 0xCA, 0xDA, 0xEE, 0xC1, 0xE6, 0xEC, 0x85, 0xCA, + 0x8B, 0xF3, 0x77, 0xCF, 0x46, 0xEA, 0x67, 0xCF, 0x4A, 0xE8, 0x5F, 0xDA, + 0x5F, 0xEB, 0x4C, 0xE6, 0x5C, 0xE0, 0xA3, 0xE5, 0x42, 0xD8, 0x66, 0xE1, + 0x9D, 0xDB, 0xED, 0xDA, 0x57, 0xDB, 0x9D, 0xDE, 0x69, 0xD6, 0x16, 0xED, + 0x56, 0xDB, 0x06, 0xF5, 0x0A, 0xEE, 0xB6, 0xFD, 0xE0, 0xF2, 0x10, 0x00, + 0xEA, 0xF5, 0x0A, 0xFF, 0x18, 0x02, 0xA8, 0x04, 0x68, 0x00, 0xD1, 0x00, + 0x55, 0xF7, 0x99, 0xF0, 0x67, 0xFC, 0x4C, 0xF0, 0x74, 0x06, 0xF8, 0xFC, + 0xE5, 0xFE, 0xC5, 0xF8, 0x3C, 0xF0, 0x2A, 0xF2, 0x76, 0xF0, 0x44, 0xFB, + 0x3F, 0xF6, 0x5B, 0x04, 0x26, 0xF6, 0x30, 0x05, 0x4F, 0xFB, 0xAC, 0x0A, + 0xAD, 0xF3, 0x65, 0x00, 0xBF, 0xE8, 0x00, 0xE6, 0x05, 0xEF, 0xBD, 0xE4, + 0x4A, 0xED, 0xCB, 0xF5, 0xC6, 0xD9, 0x9A, 0xEB, 0xF9, 0xD0, 0x44, 0xDC, + 0x77, 0xD9, 0x86, 0xE8, 0x75, 0xDC, 0xAA, 0xE9, 0xB0, 0xD4, 0xBE, 0xD9, + 0x05, 0xD0, 0x12, 0xDB, 0xF4, 0xD1, 0xD5, 0xE3, 0xC1, 0xD3, 0x22, 0xE3, + 0x7C, 0xDF, 0x0E, 0xEA, 0x55, 0xEE, 0xC3, 0xFA, 0x06, 0xE5, 0x50, 0xF7, + 0x97, 0xDA, 0xFE, 0xE4, 0x37, 0xD8, 0xC0, 0xD6, 0x3A, 0xCB, 0x56, 0xCB, + 0xA4, 0xC1, 0xB5, 0xC5, 0xB5, 0xC2, 0x08, 0xC8, 0xEA, 0xCB, 0xB0, 0xD4, + 0x15, 0xDC, 0x45, 0xE0, 0xEF, 0xE5, 0x42, 0xD7, 0xB1, 0xEB, 0x54, 0xD2, + 0xC5, 0xFE, 0x5B, 0xDE, 0xD2, 0x03, 0x9E, 0xD6, 0xDC, 0xF5, 0xEC, 0xCE, + 0x01, 0xEE, 0xF3, 0xDA, 0x4A, 0xEA, 0xEB, 0xE4, 0x6D, 0xF2, 0x9E, 0xF6, + 0xF1, 0x07, 0xC1, 0x0B, 0x1D, 0x17, 0x41, 0x14, 0xA4, 0x11, 0x54, 0x10, + 0xD7, 0x12, 0x5A, 0x0D, 0x21, 0x16, 0x22, 0x0E, 0x14, 0x02, 0xC9, 0x05, + 0x48, 0xFB, 0x5F, 0xFE, 0x16, 0x05, 0xAA, 0xF9, 0xE4, 0x0D, 0x2F, 0xF0, + 0x5B, 0x1C, 0xA1, 0xEB, 0xF6, 0x25, 0xBB, 0xFA, 0xD0, 0x20, 0x40, 0x0B, + 0x9E, 0x17, 0xBE, 0x0C, 0x04, 0x11, 0x7F, 0x0B, 0xEA, 0x0B, 0x0E, 0x0D, + 0x78, 0x02, 0xD3, 0x08, 0xB7, 0xFB, 0x7B, 0x08, 0x65, 0x00, 0x42, 0x10, + 0xF2, 0x04, 0x2D, 0x14, 0x63, 0x10, 0x78, 0x1C, 0xC3, 0x22, 0x05, 0x1E, + 0x44, 0x24, 0xEC, 0x0A, 0x5E, 0x29, 0xDA, 0x05, 0x5F, 0x27, 0x18, 0x0C, + 0xC6, 0x14, 0x5F, 0x12, 0x97, 0x13, 0xA9, 0x25, 0x7C, 0x17, 0x6F, 0x26, + 0xA5, 0x0E, 0xAB, 0x08, 0x34, 0x0F, 0x7D, 0x00, 0x30, 0x0E, 0xD2, 0x13, + 0x0E, 0xF7, 0x34, 0x1D, 0xD6, 0xE8, 0x9A, 0x1A, 0x10, 0xF1, 0xE8, 0x17, + 0xE0, 0xFD, 0xDB, 0x1F, 0x4B, 0x01, 0x5B, 0x26, 0xDF, 0xFF, 0xF5, 0x1D, + 0x89, 0x03, 0xFE, 0x0F, 0x3F, 0x00, 0x1F, 0x07, 0xD2, 0xF1, 0xFD, 0x02, + 0x72, 0xEA, 0x57, 0xF9, 0x64, 0xDF, 0xEB, 0xE6, 0x49, 0xD5, 0xFB, 0xE0, + 0x0D, 0xD9, 0xE6, 0xE4, 0x2A, 0xE6, 0x8C, 0xED, 0x03, 0xF3, 0x93, 0x00, + 0x1D, 0xEB, 0xC0, 0xFD, 0x9B, 0xE1, 0x55, 0xEA, 0x02, 0xF2, 0xEA, 0xE4, + 0x91, 0x04, 0x08, 0xE4, 0xD4, 0x05, 0xF8, 0xE0, 0x0C, 0x0A, 0x3A, 0xE5, + 0x7A, 0x0F, 0xE4, 0xF3, 0x41, 0x08, 0xCF, 0xFC, 0xA1, 0x0A, 0x34, 0xFF, + 0x59, 0x1D, 0x92, 0x07, 0x19, 0x27, 0x15, 0x0D, 0x0D, 0x27, 0xA7, 0x0C, + 0x0E, 0x26, 0x4E, 0x0C, 0x4D, 0x1B, 0xD6, 0x08, 0x04, 0x15, 0x5C, 0x02, + 0xD7, 0x1D, 0xFE, 0xFF, 0x23, 0x1F, 0xDE, 0x01, 0x1F, 0x2B, 0x1F, 0x13, + 0xE1, 0x35, 0xD0, 0x27, 0x58, 0x2A, 0xB3, 0x2F, 0x6C, 0x18, 0x51, 0x25, + 0x28, 0x03, 0x25, 0x11, 0x1F, 0xF6, 0xF3, 0x05, 0xAA, 0x00, 0xF6, 0x01, + 0x9A, 0x18, 0x0C, 0x07, 0xC0, 0x23, 0x74, 0x11, 0x1D, 0x23, 0x21, 0x13, + 0x9A, 0x25, 0x10, 0x19, 0x21, 0x28, 0x46, 0x25, 0xDF, 0x19, 0xDE, 0x20, + 0xF3, 0xF9, 0x8B, 0x0C, 0xF2, 0xDA, 0x49, 0xF2, 0xB5, 0xDC, 0xE2, 0xEC, + 0x98, 0xF6, 0x69, 0xFA, 0xBB, 0x05, 0x61, 0xFE, 0x33, 0x06, 0xFF, 0xF4, + 0x51, 0x0D, 0x19, 0xF1, 0x9E, 0x0E, 0x3A, 0xF2, 0xB0, 0xF5, 0x48, 0xEB, + 0x8D, 0xD4, 0x50, 0xDD, 0xEE, 0xC6, 0x08, 0xDE, 0xBC, 0xD4, 0x89, 0xF1, + 0x03, 0xEC, 0xB3, 0xFD, 0x81, 0xF8, 0x3D, 0x06, 0x7D, 0xEF, 0x6C, 0x11, + 0xDD, 0xE2, 0xD4, 0x09, 0x47, 0xE0, 0x03, 0xF6, 0x8E, 0xDC, 0x3A, 0xEC, + 0xBC, 0xDC, 0xD0, 0xE8, 0xC3, 0xD8, 0x49, 0xE1, 0x50, 0xD6, 0x33, 0xE0, + 0xEE, 0xE5, 0x5D, 0xEF, 0xAF, 0xF2, 0x77, 0xF8, 0x7A, 0xF4, 0x0A, 0xF4, + 0x0F, 0xFA, 0x36, 0xF2, 0x51, 0x06, 0xC3, 0xFD, 0x10, 0x08, 0xCD, 0x04, + 0x1B, 0x0A, 0x5E, 0x03, 0x04, 0x0E, 0xDA, 0x08, 0x32, 0x0F, 0xF3, 0x0C, + 0x8D, 0x10, 0xCB, 0x08, 0xF4, 0x0E, 0x89, 0x0B, 0x91, 0x12, 0x6B, 0x1C, + 0x5C, 0x13, 0xB2, 0x2B, 0x42, 0x16, 0x12, 0x32, 0xD1, 0x1A, 0x8B, 0x35, + 0xEF, 0x0F, 0xAE, 0x34, 0xC4, 0x05, 0xC8, 0x29, 0xC4, 0x08, 0x5D, 0x16, + 0xD3, 0x12, 0x95, 0x10, 0xE3, 0x15, 0xAD, 0x13, 0x73, 0x1C, 0xB3, 0x10, + 0xC4, 0x24, 0xBA, 0x14, 0xDB, 0x1E, 0x7A, 0x1F, 0xE3, 0x0E, 0x1B, 0x1C, + 0x3D, 0x03, 0xD1, 0x12, 0x87, 0x11, 0xAD, 0x0C, 0x55, 0x1F, 0x72, 0xFE, + 0x96, 0x28, 0xDC, 0x00, 0x67, 0x3A, 0xFA, 0x14, 0xDD, 0x35, 0x6D, 0x1D, + 0x86, 0x22, 0x0C, 0x18, 0x35, 0x25, 0x77, 0x0E, 0xD8, 0x1C, 0xEE, 0xEF, + 0xF2, 0x07, 0x58, 0xDA, 0xB4, 0x0C, 0xD6, 0xE8, 0x38, 0x15, 0xA9, 0xF2, + 0x5E, 0x09, 0xBA, 0xEB, 0xF0, 0x00, 0x25, 0xF3, 0x62, 0xFB, 0x3D, 0xFA, + 0xBE, 0xF1, 0x42, 0xF2, 0x4F, 0xE6, 0x6A, 0xE6, 0xFA, 0xD2, 0x7D, 0xE2, + 0xFB, 0xCC, 0xEF, 0xE3, 0x30, 0xDA, 0xBF, 0xDF, 0x57, 0xE6, 0x92, 0xE6, + 0x41, 0xE9, 0x0B, 0xF0, 0xD1, 0xDD, 0x7A, 0xE3, 0xEE, 0xCA, 0x23, 0xCA, + 0x11, 0xB5, 0xD7, 0xB7, 0xBF, 0xA3, 0x7F, 0xB0, 0xC6, 0xA7, 0xD2, 0xB0, + 0x31, 0xB5, 0xA3, 0xBA, 0x89, 0xBB, 0xE9, 0xC4, 0x3E, 0xC5, 0x65, 0xC5, + 0xD6, 0xC8, 0x68, 0xC0, 0x41, 0xBB, 0xF7, 0xC2, 0x80, 0xBB, 0x2E, 0xD7, + 0x52, 0xB7, 0xF7, 0xDB, 0x43, 0xAA, 0x88, 0xD2, 0x72, 0xB7, 0xF4, 0xD5, + 0x47, 0xD3, 0x3A, 0xE7, 0x63, 0xD9, 0x74, 0xF5, 0x58, 0xD4, 0x3E, 0xF8, + 0xCD, 0xD9, 0x7E, 0xFC, 0x01, 0xE9, 0xCD, 0xFE, 0x12, 0xFE, 0x6E, 0xFC, + 0x3C, 0x06, 0x37, 0xFE, 0x67, 0x03, 0x1C, 0x04, 0x73, 0x08, 0x86, 0x03, + 0xD2, 0x14, 0x14, 0x00, 0x82, 0x1B, 0xF0, 0x00, 0x46, 0x16, 0x1C, 0x02, + 0x6F, 0x12, 0xE1, 0x06, 0xAE, 0x1B, 0xC2, 0x0A, 0xED, 0x23, 0xE4, 0x0E, + 0xFC, 0x27, 0x82, 0x19, 0xC1, 0x2C, 0xDD, 0x16, 0x1C, 0x2D, 0x24, 0x0F, + 0x8D, 0x22, 0x5B, 0x0A, 0x8E, 0x27, 0xB8, 0x10, 0xBC, 0x2B, 0x3F, 0x19, + 0x68, 0x26, 0x20, 0x1A, 0x38, 0x2E, 0x39, 0x1A, 0xAB, 0x33, 0xBB, 0x1D, + 0x3B, 0x24, 0x39, 0x17, 0x7C, 0x22, 0xBF, 0x15, 0x1D, 0x31, 0x36, 0x25, + 0xF0, 0x2B, 0x74, 0x29, 0x91, 0x15, 0x74, 0x23, 0x17, 0x08, 0x41, 0x2C, + 0x96, 0x02, 0xE0, 0x31, 0x84, 0xF5, 0x95, 0x1D, 0x67, 0xF4, 0xC4, 0x0C, + 0x30, 0x04, 0x5E, 0x0F, 0x09, 0x16, 0x79, 0x15, 0x8A, 0x28, 0x2D, 0x1E, + 0x6B, 0x38, 0x5E, 0x2A, 0x12, 0x2C, 0x36, 0x22, 0x1F, 0x1A, 0x4B, 0x0F, + 0x42, 0x15, 0x02, 0x02, 0x75, 0x02, 0x30, 0xF8, 0x33, 0xF0, 0x4B, 0xF1, + 0xE6, 0xEC, 0x05, 0xF1, 0x89, 0xFA, 0xA8, 0x03, 0xF3, 0x14, 0x3D, 0x14, + 0xB3, 0x26, 0x4C, 0x14, 0x21, 0x25, 0x61, 0x0D, 0xD2, 0x20, 0x68, 0x06, + 0x1D, 0x1C, 0xEF, 0xFF, 0x4A, 0x0E, 0x07, 0xF9, 0x40, 0x05, 0x1F, 0xF7, + 0xBD, 0x04, 0xA6, 0x02, 0x65, 0x0E, 0x40, 0x24, 0xBC, 0x21, 0x87, 0x41, + 0x1A, 0x30, 0x8E, 0x47, 0xCF, 0x30, 0xEC, 0x42, 0x48, 0x25, 0x87, 0x39, + 0x34, 0x15, 0xFF, 0x30, 0x88, 0x0C, 0x9D, 0x2D, 0xC1, 0x0D, 0x8D, 0x2B, + 0xFB, 0x11, 0xF1, 0x28, 0xD7, 0x14, 0x0E, 0x28, 0xB5, 0x15, 0x34, 0x2C, + 0xF7, 0x1B, 0x35, 0x33, 0x23, 0x2F, 0x40, 0x3A, 0xF2, 0x2B, 0x5E, 0x40, + 0x07, 0x16, 0xE2, 0x44, 0x51, 0x16, 0x2E, 0x3D, 0xED, 0x1F, 0x58, 0x28, + 0x9E, 0x24, 0x84, 0x1A, 0xD4, 0x22, 0x9A, 0x19, 0x30, 0x29, 0x12, 0x2C, + 0x9D, 0x31, 0xCF, 0x38, 0x8A, 0x33, 0x26, 0x30, 0x63, 0x39, 0xA2, 0x22, + 0x00, 0x41, 0x99, 0x17, 0x35, 0x2D, 0x5E, 0x08, 0x92, 0x1A, 0x07, 0x0C, + 0x3E, 0x1B, 0x58, 0x17, 0x0B, 0x09, 0x75, 0x0B, 0xD3, 0xFD, 0xAF, 0x03, + 0x2A, 0x1B, 0x21, 0x0C, 0xAB, 0x29, 0xE1, 0x07, 0x76, 0x13, 0x9C, 0xF9, + 0x98, 0x09, 0x56, 0xF7, 0x55, 0x07, 0x5E, 0xF7, 0x0F, 0xFF, 0x41, 0xF4, + 0x9B, 0xFD, 0xEA, 0xF1, 0xB2, 0xFC, 0xB5, 0xF3, 0x70, 0xF0, 0x58, 0xEF, + 0x39, 0xEA, 0x3B, 0xED, 0xC5, 0xE2, 0xC0, 0xEF, 0x9B, 0xCF, 0x81, 0xE5, + 0xD9, 0xC0, 0xAA, 0xCF, 0xD2, 0xC1, 0x5F, 0xBE, 0xF5, 0xCE, 0x7D, 0xBF, + 0xCF, 0xD5, 0xFB, 0xC3, 0x70, 0xD9, 0x9C, 0xC7, 0x96, 0xDB, 0x04, 0xC9, + 0xBD, 0xD9, 0x6A, 0xC2, 0x0D, 0xD6, 0xD6, 0xBB, 0x96, 0xD7, 0xBF, 0xBE, + 0x9D, 0xD5, 0xF3, 0xC7, 0x9D, 0xD3, 0x5E, 0xD5, 0xD9, 0xDA, 0x58, 0xE3, + 0x43, 0xE3, 0xCE, 0xF0, 0xAE, 0xF4, 0x3A, 0x00, 0x31, 0x01, 0xDE, 0x00, + 0x3A, 0xF8, 0x92, 0xEF, 0xD1, 0xF3, 0x62, 0xE8, 0x93, 0xF4, 0xC0, 0xEC, + 0x56, 0xE7, 0x08, 0xEB, 0x28, 0xE2, 0x98, 0xEC, 0x4B, 0xEA, 0xF1, 0xF5, + 0x6B, 0xF2, 0xB5, 0xFF, 0xEE, 0xF7, 0x3C, 0xFC, 0x42, 0xF9, 0xDB, 0xF0, + 0x88, 0xEB, 0xA4, 0xE4, 0x34, 0xD5, 0x78, 0xE1, 0xB1, 0xCC, 0x46, 0xEA, + 0x83, 0xDC, 0x69, 0xFB, 0xA7, 0xE9, 0x31, 0x02, 0xC4, 0xE9, 0x62, 0xF4, + 0x89, 0xF2, 0x27, 0xF1, 0xF1, 0xF8, 0x11, 0xFD, 0x3A, 0xF4, 0xB3, 0xFF, + 0xB0, 0xF0, 0x48, 0xEF, 0x04, 0xEB, 0xDC, 0xE1, 0xAF, 0xE4, 0x24, 0xDD, + 0x1B, 0xF5, 0xE9, 0xE1, 0xF1, 0xFE, 0x2C, 0xEA, 0x19, 0xEB, 0xF2, 0xE5, + 0x26, 0xDA, 0x7D, 0xE3, 0x7D, 0xDD, 0x26, 0xF0, 0xA2, 0xDA, 0x94, 0xEE, + 0x5F, 0xCE, 0x3F, 0xDD, 0xE8, 0xC8, 0x5A, 0xD7, 0x89, 0xC4, 0x4E, 0xDF, + 0x91, 0xC6, 0xAC, 0xED, 0x78, 0xD5, 0x28, 0xF3, 0x69, 0xDC, 0x12, 0xE4, + 0xB6, 0xD1, 0xF8, 0xD1, 0xBB, 0xD4, 0x73, 0xD6, 0xEC, 0xE3, 0x92, 0xD7, + 0x64, 0xE8, 0xA1, 0xC8, 0x88, 0xE5, 0x41, 0xC1, 0x36, 0xE9, 0x23, 0xCC, + 0xCD, 0xEC, 0xD3, 0xDF, 0xEC, 0xE9, 0x90, 0xF0, 0xAB, 0xEA, 0xBA, 0xF3, + 0x64, 0xEC, 0x32, 0xF0, 0x84, 0xE9, 0xD3, 0xEE, 0xCF, 0xEC, 0x34, 0xED, + 0x44, 0xFC, 0xA6, 0xF1, 0x4B, 0x08, 0xBA, 0xF4, 0xA8, 0x0E, 0x5E, 0xF6, + 0x49, 0x17, 0xF5, 0xFA, 0x57, 0x14, 0xBF, 0xFE, 0x7B, 0x07, 0x03, 0x01, + 0x79, 0x06, 0x1C, 0x06, 0x93, 0x0E, 0x31, 0x0A, 0x67, 0x13, 0x05, 0x11, + 0x09, 0x0D, 0x1E, 0x12, 0x9E, 0x06, 0x03, 0x0C, 0xFC, 0x01, 0x74, 0x0F, + 0xB7, 0xFC, 0xA1, 0x15, 0x6A, 0xFD, 0xBA, 0x1A, 0x84, 0x09, 0xB1, 0x1F, + 0xF2, 0x1C, 0xB9, 0x18, 0xF2, 0x2D, 0xAC, 0x0B, 0xCF, 0x32, 0x6C, 0x0A, + 0x1D, 0x28, 0x31, 0x11, 0xD5, 0x1A, 0x10, 0x1D, 0x31, 0x16, 0xDF, 0x26, + 0x08, 0x29, 0x35, 0x2A, 0x8D, 0x3B, 0x40, 0x29, 0xE7, 0x3A, 0x4E, 0x2A, + 0x51, 0x36, 0x46, 0x30, 0x06, 0x28, 0x4F, 0x2A, 0x85, 0x07, 0xF5, 0x18, + 0xBF, 0xF9, 0x25, 0x23, 0x94, 0x05, 0x5B, 0x3A, 0x9A, 0x0B, 0x97, 0x32, + 0x04, 0x11, 0x42, 0x22, 0x2F, 0x20, 0x66, 0x27, 0xF5, 0x1D, 0x32, 0x2B, + 0x67, 0x02, 0x58, 0x23, 0xDF, 0xFA, 0x52, 0x1F, 0x6C, 0x05, 0x74, 0x16, + 0x1A, 0x01, 0xF1, 0x0B, 0xFF, 0x04, 0x4A, 0x14, 0xDD, 0x18, 0x9B, 0x1E, + 0x28, 0x13, 0x4E, 0x0E, 0xEB, 0x00, 0xD3, 0xFE, 0x00, 0xFF, 0xA0, 0xF9, + 0x4C, 0xF6, 0x56, 0xE5, 0x1C, 0xE2, 0x55, 0xCD, 0xDA, 0xE4, 0xAC, 0xCA, + 0x5A, 0xF9, 0xBE, 0xDC, 0xED, 0x02, 0x52, 0xEE, 0x61, 0x06, 0xD9, 0xF1, + 0x21, 0x06, 0x63, 0xE9, 0x98, 0xFF, 0x3E, 0xDB, 0xED, 0xF7, 0x9C, 0xD6, + 0x13, 0xF9, 0xB7, 0xE0, 0xA2, 0x04, 0x82, 0xE7, 0x8A, 0x09, 0x2A, 0xED, + 0xC6, 0x06, 0x7B, 0xFA, 0xD7, 0x0F, 0x15, 0x0D, 0xD2, 0x14, 0x46, 0x1A, + 0x3B, 0x05, 0x55, 0x16, 0xF2, 0x01, 0x0B, 0x0D, 0xC5, 0x13, 0xDE, 0x0E, + 0x97, 0x24, 0xC7, 0x15, 0x2F, 0x34, 0xFD, 0x11, 0x26, 0x34, 0xB1, 0x0B, + 0x79, 0x15, 0xB0, 0x0E, 0x07, 0xFA, 0xB5, 0x16, 0x8E, 0xF4, 0x21, 0x16, + 0xBB, 0x01, 0xDC, 0x0B, 0x63, 0x19, 0x01, 0x03, 0xAA, 0x28, 0x83, 0x04, + 0xEA, 0x25, 0xB6, 0x0B, 0xD3, 0x1B, 0xE9, 0x18, 0x55, 0x04, 0x4A, 0x18, + 0xC4, 0xE9, 0x9D, 0x0E, 0x85, 0xE5, 0xE1, 0x17, 0xA7, 0xEE, 0x7C, 0x1E, + 0xAF, 0xF7, 0x34, 0x19, 0x32, 0x0C, 0xA5, 0x19, 0xED, 0x16, 0x9F, 0x0E, + 0x87, 0x0A, 0xDD, 0xFE, 0xBC, 0x05, 0x22, 0x00, 0x40, 0xFF, 0xD6, 0xFA, + 0x7A, 0xF4, 0xFF, 0xF4, 0xC2, 0xF7, 0x02, 0x06, 0xAD, 0x00, 0xC0, 0x15, + 0xCC, 0xFC, 0x21, 0x0A, 0x2F, 0xF5, 0xEE, 0xF9, 0xC8, 0xF3, 0xAB, 0xF4, + 0xB4, 0xE7, 0xC6, 0xF3, 0x21, 0xD9, 0x7A, 0xFC, 0xEA, 0xEB, 0xB2, 0x10, + 0x75, 0x0A, 0xE0, 0x15, 0x54, 0x14, 0xD8, 0x09, 0x16, 0x15, 0x5F, 0x07, + 0x59, 0xFF, 0x2B, 0xFA, 0xC5, 0xD4, 0xBB, 0xDE, 0x2E, 0xC7, 0x52, 0xE0, + 0x54, 0xDC, 0x99, 0xF1, 0x86, 0xF4, 0x6E, 0xF0, 0x9C, 0x0B, 0x4D, 0xEF, + 0x7D, 0x17, 0xAD, 0xF6, 0x80, 0x10, 0xE4, 0xF1, 0x06, 0x09, 0xF3, 0xE8, + 0xA1, 0x01, 0x98, 0xEB, 0x86, 0xFC, 0x8A, 0xF2, 0x0F, 0xFD, 0xC7, 0x00, + 0x57, 0xFD, 0x80, 0x17, 0x04, 0x0B, 0x6D, 0x21, 0xCF, 0x1E, 0x52, 0x1D, + 0x40, 0x21, 0x47, 0x1B, 0x98, 0x1D, 0x46, 0x18, 0x28, 0x1C, 0x08, 0x0E, + 0x85, 0x18, 0x19, 0x02, 0x3D, 0x19, 0xB3, 0xFC, 0xDE, 0x1E, 0x3A, 0x01, + 0x09, 0x1C, 0x95, 0x09, 0x58, 0x10, 0x66, 0x13, 0x97, 0x05, 0x73, 0x14, + 0x6E, 0xFC, 0x8B, 0x09, 0xDC, 0xF3, 0xD4, 0x02, 0x29, 0xFA, 0xCD, 0x0C, + 0x3F, 0x09, 0xBF, 0x12, 0xD5, 0x10, 0x39, 0x10, 0xA7, 0x0F, 0xD0, 0x12, + 0xB7, 0x0B, 0xBC, 0x0C, 0x34, 0x0A, 0x3C, 0x02, 0x88, 0x03, 0x03, 0xF9, + 0x46, 0xFC, 0xCB, 0xEF, 0x43, 0x05, 0x22, 0xEB, 0x83, 0x17, 0x9F, 0xE9, + 0x7A, 0x1A, 0xB8, 0xED, 0x0F, 0x19, 0x6B, 0x03, 0x0D, 0x08, 0x3F, 0x11, + 0x77, 0xE5, 0x74, 0x05, 0xE7, 0xD6, 0x2E, 0xFD, 0x1F, 0xE0, 0xAF, 0x02, + 0xA3, 0xE2, 0x41, 0xF9, 0xEE, 0xE4, 0xE1, 0xE1, 0x51, 0xF2, 0x6C, 0xD9, + 0x07, 0xF5, 0x22, 0xDA, 0x3F, 0xF0, 0xB0, 0xDF, 0x99, 0xE7, 0xE3, 0xEF, + 0xEC, 0xCB, 0x44, 0xEE, 0x38, 0xAF, 0xB7, 0xD9, 0xA7, 0xB1, 0xDD, 0xD2, + 0x6E, 0xC2, 0xD3, 0xD3, 0x49, 0xC5, 0xF1, 0xC4, 0xA8, 0xBD, 0x15, 0xB8, + 0x3A, 0xB8, 0x8A, 0xC1, 0x72, 0xB5, 0x3A, 0xD3, 0xBB, 0xB4, 0xA3, 0xDF, + 0x53, 0xBC, 0xD8, 0xE0, 0x07, 0xC9, 0x30, 0xDA, 0x81, 0xD6, 0xDA, 0xD9, + 0x42, 0xD8, 0xF3, 0xE0, 0xF5, 0xCA, 0xED, 0xDD, 0xD6, 0xC7, 0x7D, 0xDA, + 0xBD, 0xCE, 0x3C, 0xDD, 0x35, 0xDC, 0xE3, 0xE4, 0x9A, 0xF4, 0xCE, 0xF8, + 0xCE, 0x0C, 0x85, 0x0B, 0xE2, 0x1E, 0xD0, 0x0D, 0x8B, 0x26, 0xB2, 0x02, + 0x82, 0x25, 0x7E, 0xFA, 0x03, 0x14, 0x9A, 0xF8, 0xDA, 0xF1, 0x92, 0xF2, + 0xCC, 0xE5, 0x13, 0xF2, 0x3E, 0xF8, 0xF3, 0xFC, 0xF9, 0x0A, 0x64, 0xFF, + 0x49, 0x23, 0x9C, 0x02, 0x68, 0x37, 0xA6, 0x09, 0x08, 0x2A, 0xBE, 0x03, + 0x2D, 0x16, 0x59, 0xFA, 0x5E, 0x0F, 0xB6, 0xF2, 0x09, 0x0F, 0x0A, 0xF5, + 0x0F, 0x0D, 0x74, 0xF8, 0x68, 0x19, 0x59, 0x03, 0x85, 0x30, 0x56, 0x16, + 0x3B, 0x37, 0x97, 0x18, 0x6B, 0x31, 0xCA, 0x15, 0xBD, 0x30, 0x42, 0x1C, + 0x1C, 0x25, 0x36, 0x14, 0x2C, 0x1B, 0x1B, 0x13, 0xEB, 0x21, 0x8B, 0x25, + 0x24, 0x10, 0xD5, 0x1F, 0x1E, 0xEF, 0x2E, 0x06, 0xC4, 0xE8, 0x7F, 0x01, + 0x3C, 0xEF, 0xB2, 0x0B, 0x8B, 0xED, 0x66, 0x09, 0xE6, 0xF8, 0x85, 0x10, + 0x67, 0x0C, 0x2E, 0x1F, 0xAF, 0x13, 0x15, 0x1E, 0xE8, 0x19, 0x4B, 0x24, + 0x81, 0x12, 0x2F, 0x26, 0xDC, 0xEE, 0x84, 0x0E, 0x54, 0xD7, 0xA2, 0xFF, + 0x78, 0xDB, 0xF0, 0xFE, 0xC5, 0xE6, 0xEF, 0xF9, 0xD2, 0xFA, 0xAC, 0xF9, + 0x6E, 0x19, 0x31, 0x06, 0xDC, 0x2E, 0x38, 0x0F, 0x95, 0x29, 0xC3, 0x0B, + 0xF2, 0x11, 0x72, 0x04, 0x76, 0xF7, 0xA7, 0x00, 0x3B, 0xE5, 0xDC, 0xFD, + 0x78, 0xF3, 0x9D, 0x01, 0xEB, 0x12, 0x9C, 0x0C, 0xDB, 0x21, 0x3D, 0x18, + 0x3F, 0x25, 0xF2, 0x20, 0xCD, 0x20, 0x3E, 0x27, 0x74, 0x1D, 0xF9, 0x30, + 0x09, 0x1C, 0x3A, 0x35, 0x52, 0x19, 0x5C, 0x37, 0x01, 0x17, 0x9E, 0x31, + 0xCC, 0x12, 0x68, 0x22, 0x6F, 0x15, 0xFF, 0x22, 0x1A, 0x13, 0x83, 0x2D, + 0xE2, 0x04, 0x9C, 0x33, 0xFB, 0x02, 0x8A, 0x3A, 0x7D, 0x10, 0x11, 0x3C, + 0x26, 0x24, 0xD1, 0x34, 0xCF, 0x35, 0xDB, 0x2E, 0xAC, 0x2A, 0xE3, 0x1F, + 0x25, 0x24, 0x46, 0x15, 0x44, 0x2C, 0x9E, 0x13, 0xB0, 0x2A, 0xB2, 0x14, + 0xDA, 0x2B, 0xF0, 0x19, 0xF6, 0x32, 0x05, 0x1F, 0x79, 0x3F, 0x43, 0x26, + 0xA7, 0x44, 0x12, 0x29, 0x6C, 0x38, 0xDB, 0x27, 0x4B, 0x28, 0x49, 0x24, + 0xB6, 0x18, 0x2D, 0x11, 0x94, 0x0F, 0x7B, 0xFD, 0xDC, 0x1D, 0xDA, 0x08, + 0x58, 0x25, 0xF2, 0x10, 0x1C, 0x1A, 0x5A, 0x01, 0xCA, 0x17, 0x3E, 0xFD, + 0xC0, 0x1E, 0x6C, 0x0A, 0x04, 0x13, 0x74, 0x09, 0xAB, 0xFF, 0xE8, 0xFD, + 0x37, 0x01, 0x9C, 0x03, 0x42, 0xFE, 0x56, 0x04, 0x6B, 0xFA, 0x05, 0xF9, + 0x7D, 0x03, 0x51, 0xFC, 0x98, 0xF5, 0x3A, 0xF6, 0x39, 0xDF, 0x6C, 0xE1, + 0x9B, 0xDF, 0x0F, 0xDC, 0xCA, 0xDF, 0x07, 0xD8, 0xD5, 0xD6, 0xF6, 0xC8, + 0x5B, 0xD6, 0xF2, 0xC0, 0xB4, 0xDF, 0x5B, 0xC3, 0xA3, 0xE0, 0xBD, 0xC5, + 0xE5, 0xD5, 0x83, 0xC3, 0x20, 0xC9, 0xDC, 0xC7, 0xAE, 0xBF, 0x7A, 0xD0, + 0xDA, 0xC4, 0x22, 0xD4, 0xFD, 0xCE, 0x27, 0xDD, 0xBB, 0xCD, 0xE3, 0xE0, + 0x08, 0xD3, 0xD3, 0xDF, 0xE9, 0xD9, 0x16, 0xE5, 0xF4, 0xD8, 0x23, 0xED, + 0x7E, 0xDE, 0x41, 0xF7, 0x96, 0xE6, 0xAF, 0xF6, 0xD9, 0xF3, 0xD1, 0xF0, + 0x60, 0x03, 0xA6, 0xF4, 0x1D, 0x0C, 0xB9, 0xF9, 0x01, 0x02, 0x7D, 0xF4, + 0x04, 0xED, 0xCA, 0xF3, 0xAF, 0xE3, 0x8B, 0xFD, 0x90, 0xE5, 0x79, 0xFF, + 0xB7, 0xE5, 0x06, 0xF5, 0xEE, 0xE8, 0xBF, 0xF0, 0xC9, 0xEC, 0x03, 0xEF, + 0x2A, 0xEB, 0xBC, 0xEA, 0xAE, 0xEE, 0xA3, 0xEA, 0x6F, 0xEE, 0xF2, 0xE0, + 0xD2, 0xEC, 0x46, 0xE0, 0x72, 0xE9, 0x4D, 0xEA, 0x0D, 0xF0, 0x67, 0xF6, + 0x27, 0xFA, 0xA7, 0x00, 0xC5, 0xFA, 0xE0, 0xFD, 0x7B, 0xFC, 0x47, 0xF6, + 0xA3, 0xFC, 0x2A, 0xED, 0x03, 0xF0, 0x57, 0xDE, 0xD4, 0xED, 0x3E, 0xE5, + 0xCD, 0xF5, 0x8D, 0xF8, 0x24, 0xE7, 0x54, 0xFA, 0x1F, 0xD8, 0xEF, 0xF4, + 0x03, 0xE1, 0x4A, 0xF0, 0x98, 0xEB, 0x79, 0xEE, 0xAC, 0xE8, 0x41, 0xE4, + 0x1E, 0xE4, 0x97, 0xDA, 0x69, 0xE0, 0xA2, 0xDE, 0xC0, 0xE3, 0x67, 0xE7, + 0x08, 0xF6, 0x6C, 0xF8, 0x9E, 0x00, 0x47, 0xF9, 0xD0, 0xF4, 0x3D, 0xE2, + 0xAB, 0xEA, 0xAA, 0xDE, 0x69, 0xE5, 0x44, 0xE7, 0x24, 0xDB, 0x17, 0xE7, + 0xEB, 0xDA, 0x12, 0xEC, 0x4B, 0xE4, 0x0B, 0xF4, 0xD8, 0xE6, 0x76, 0xF2, + 0xAC, 0xE7, 0xE8, 0xED, 0xB0, 0xE4, 0xDD, 0xEC, 0x4B, 0xD7, 0xEC, 0xE9, + 0x02, 0xD9, 0xA5, 0xEC, 0xAC, 0xF6, 0x86, 0xF8, 0xB6, 0x10, 0x47, 0xF5, + 0x47, 0x19, 0xB4, 0xED, 0x6C, 0x1F, 0x4A, 0xFC, 0x58, 0x15, 0xE4, 0x08, + 0xD3, 0xFE, 0x91, 0x0B, 0x36, 0xF1, 0x66, 0x07, 0x7F, 0xF0, 0xBB, 0xFF, + 0x15, 0xFC, 0x4B, 0x05, 0x30, 0x10, 0x6F, 0x16, 0xEA, 0x1E, 0x95, 0x1F, + 0xAA, 0x19, 0xC1, 0x12, 0x1B, 0x0B, 0xF3, 0x05, 0xEE, 0x05, 0x80, 0x04, + 0xA1, 0x08, 0xF2, 0x04, 0x3A, 0x04, 0x50, 0x04, 0x12, 0x03, 0xE5, 0x0A, + 0xAF, 0x01, 0x1A, 0x18, 0x92, 0x07, 0xF8, 0x23, 0x2F, 0x12, 0xF1, 0x23, + 0x0A, 0x11, 0x5E, 0x21, 0x74, 0x07, 0x12, 0x19, 0x2F, 0x0B, 0x33, 0x0C, + 0xC6, 0x25, 0x42, 0x0B, 0x8C, 0x2F, 0x56, 0x09, 0xBE, 0x20, 0x14, 0x0E, + 0x9E, 0x13, 0x31, 0x1B, 0xF2, 0x06, 0x53, 0x19, 0xAD, 0x07, 0xEA, 0x17, + 0x49, 0x20, 0xAB, 0x28, 0x24, 0x23, 0x5F, 0x29, 0x66, 0x12, 0x61, 0x1C, + 0xED, 0x14, 0x93, 0x20, 0x1A, 0x22, 0x7F, 0x21, 0x00, 0x1C, 0xEB, 0x08, + 0x92, 0x0F, 0x1D, 0xF5, 0x37, 0x16, 0xE3, 0xFB, 0x1D, 0x19, 0x1F, 0x08, + 0x88, 0x14, 0x54, 0x12, 0x48, 0x19, 0x21, 0x1A, 0xBC, 0x12, 0xA5, 0x0F, + 0x5A, 0x01, 0xE7, 0x01, 0xD9, 0xFB, 0x2B, 0x00, 0x4E, 0xF8, 0xF0, 0xF4, + 0x62, 0xEB, 0x8E, 0xE4, 0x3A, 0xE9, 0x6F, 0xE9, 0x12, 0xFD, 0xE9, 0xFA, + 0x13, 0x0D, 0xD6, 0x01, 0x4A, 0x14, 0x4E, 0xFA, 0xA2, 0x19, 0xA6, 0xEC, + 0x8C, 0x12, 0x01, 0xE3, 0x66, 0x06, 0xF4, 0xE1, 0x51, 0x02, 0x13, 0xEA, + 0xB5, 0x08, 0xF8, 0xF6, 0xAE, 0x19, 0xC3, 0x08, 0xF4, 0x22, 0x72, 0x1C, + 0xCF, 0x1E, 0xBA, 0x27, 0xFB, 0x1A, 0x8E, 0x28, 0x3F, 0x17, 0xD6, 0x1E, + 0x31, 0x19, 0xD1, 0x15, 0xD4, 0x19, 0x84, 0x1A, 0x29, 0x19, 0x7C, 0x28, + 0xC2, 0x20, 0xA7, 0x25, 0x5B, 0x25, 0xDE, 0x13, 0xED, 0x19, 0x89, 0x06, + 0x2E, 0x08, 0x02, 0x03, 0xAF, 0x03, 0x12, 0x07, 0xE0, 0x06, 0x45, 0x0D, + 0xF9, 0x03, 0xF6, 0x16, 0xC1, 0x02, 0x89, 0x18, 0x66, 0x02, 0x54, 0x12, + 0x44, 0xFE, 0x21, 0x10, 0xCA, 0xFC, 0x9B, 0x10, 0x71, 0xEF, 0x89, 0x0A, + 0x14, 0xF0, 0x7F, 0x12, 0xF6, 0x06, 0xE4, 0x1E, 0x87, 0x19, 0xD9, 0x14, + 0xBF, 0x26, 0xE2, 0x06, 0x80, 0x23, 0xE2, 0xFE, 0xE8, 0x08, 0x72, 0xF6, + 0xAF, 0xF7, 0x07, 0xFA, 0x08, 0xF6, 0xEF, 0xFE, 0xBD, 0xEA, 0x1B, 0xF3, + 0x5C, 0xE3, 0x08, 0xED, 0xBE, 0xF2, 0xFA, 0xF7, 0x38, 0xFA, 0x1B, 0xFC, + 0x37, 0xE4, 0x62, 0xF0, 0x7B, 0xD2, 0x15, 0xF1, 0x8B, 0xCF, 0xA3, 0xFD, + 0x36, 0xDA, 0x17, 0x02, 0x1C, 0xF8, 0xE1, 0x02, 0x13, 0x09, 0x3A, 0xFC, + 0x2D, 0x00, 0x1D, 0xF0, 0x1C, 0xF5, 0xC7, 0xF0, 0xA0, 0xEA, 0xD0, 0xF0, + 0x28, 0xE3, 0x9B, 0xE0, 0x0E, 0xEB, 0xA9, 0xD6, 0x25, 0x00, 0x9B, 0xE1, + 0x91, 0x0E, 0x77, 0xF1, 0x48, 0x13, 0x81, 0xF9, 0x62, 0x17, 0x8D, 0xFF, + 0x55, 0x0C, 0x86, 0xFB, 0xBF, 0x01, 0xA4, 0xF3, 0x36, 0x09, 0xAE, 0xFB, + 0x40, 0x0E, 0x05, 0x04, 0x3C, 0x0E, 0x97, 0x0E, 0x07, 0x16, 0xD4, 0x26, + 0xA6, 0x18, 0x8E, 0x2F, 0x59, 0x15, 0x92, 0x21, 0xE7, 0x1A, 0x2C, 0x11, + 0xD5, 0x1D, 0xAA, 0x0F, 0x4B, 0x17, 0xD0, 0x17, 0xCE, 0x0F, 0xD8, 0x19, + 0x2C, 0x0D, 0xD8, 0x21, 0xC7, 0x07, 0xB6, 0x29, 0xFC, 0x01, 0xD2, 0x28, + 0x90, 0xFE, 0xF2, 0x1F, 0x3F, 0xFC, 0x1B, 0x15, 0x0E, 0xFC, 0x71, 0x0E, + 0xD9, 0xFD, 0xA4, 0x0E, 0x64, 0xFF, 0xF4, 0x12, 0xB2, 0x07, 0xB9, 0x12, + 0xF4, 0x0D, 0x4F, 0x06, 0xF5, 0x11, 0x3B, 0xFA, 0x52, 0x18, 0x4B, 0xF2, + 0x40, 0x13, 0x0F, 0xEC, 0xBD, 0x0B, 0xD2, 0xEF, 0xA9, 0x04, 0xA6, 0xF3, + 0xC6, 0x00, 0x3F, 0xFE, 0x54, 0x02, 0x5A, 0x0B, 0xDB, 0xFA, 0x12, 0x06, + 0xAB, 0xF6, 0x7F, 0xFD, 0x86, 0x02, 0x32, 0x01, 0xAB, 0xF8, 0x25, 0xF4, + 0xAF, 0xE4, 0x35, 0xE0, 0xA7, 0xE7, 0x1F, 0xE2, 0xBD, 0xEA, 0x3E, 0xED, + 0xF3, 0xE1, 0xC6, 0xEB, 0x4C, 0xE4, 0x0F, 0xE5, 0xE0, 0xE9, 0xE2, 0xE0, + 0xAC, 0xE4, 0xA9, 0xDD, 0x0A, 0xE5, 0x32, 0xE3, 0x4A, 0xE3, 0xE6, 0xE2, + 0x77, 0xD0, 0x9F, 0xD2, 0xC6, 0xC9, 0xBE, 0xCD, 0xF5, 0xD6, 0xFB, 0xD3, + 0x15, 0xCE, 0xB7, 0xC1, 0x50, 0xBB, 0x97, 0xAE, 0xE2, 0xBE, 0x87, 0xB8, + 0x11, 0xCC, 0xFC, 0xCD, 0xCA, 0xCD, 0x1C, 0xDC, 0xC6, 0xC5, 0xA7, 0xDB, + 0x08, 0xBC, 0x4B, 0xC7, 0xDB, 0xBB, 0x31, 0xB7, 0xB8, 0xC7, 0xF1, 0xC2, + 0x24, 0xCF, 0x74, 0xD3, 0xB8, 0xCD, 0xC9, 0xDB, 0x17, 0xD8, 0x7C, 0xE7, + 0x8E, 0xEF, 0xC9, 0xF8, 0xFB, 0xF7, 0x99, 0xFF, 0x87, 0xFB, 0x22, 0xF5, + 0x40, 0xFE, 0x7C, 0xE9, 0xE5, 0xFA, 0x66, 0xEF, 0xE9, 0x03, 0x75, 0xFD, + 0x55, 0x11, 0x3F, 0x03, 0x44, 0x09, 0x1E, 0x02, 0xDE, 0xFD, 0x68, 0x02, + 0xB0, 0x04, 0x47, 0x03, 0x4B, 0x0C, 0xDA, 0xFE, 0x8D, 0x14, 0x7F, 0xFB, + 0x00, 0x20, 0x99, 0xFA, 0xBF, 0x1F, 0x01, 0xF8, 0x75, 0x18, 0x7C, 0xF7, + 0x74, 0x16, 0x3C, 0x00, 0xD7, 0x0C, 0x99, 0x09, 0xC0, 0xFF, 0xB7, 0x0B, + 0x18, 0xFB, 0xD8, 0x0A, 0xCE, 0x07, 0x53, 0x19, 0xEA, 0x18, 0x9C, 0x22, + 0xE6, 0x21, 0x45, 0x1E, 0x63, 0x1A, 0x9B, 0x1C, 0xB2, 0x04, 0x9C, 0x18, + 0x8A, 0xF4, 0x50, 0x0F, 0x7F, 0xFF, 0xDC, 0x18, 0x74, 0x09, 0xB6, 0x1F, + 0x64, 0xFF, 0x06, 0x0C, 0x1E, 0x00, 0xB1, 0x03, 0x3E, 0x11, 0xCE, 0x12, + 0x13, 0x18, 0xC2, 0x17, 0x75, 0x08, 0x00, 0x11, 0x03, 0xF7, 0x96, 0x13, + 0x06, 0xEF, 0x0D, 0x17, 0xDC, 0xF9, 0x02, 0x19, 0x8E, 0x10, 0xF1, 0x19, + 0xEC, 0x0D, 0x61, 0x0C, 0x25, 0xFE, 0x70, 0x02, 0xF3, 0x06, 0xD7, 0x11, + 0x0A, 0x10, 0x24, 0x0C, 0xA1, 0x03, 0x1F, 0xF1, 0x9A, 0xFE, 0x47, 0xEE, + 0x5F, 0x0F, 0x49, 0xFA, 0xCE, 0x15, 0xCA, 0x06, 0xA5, 0x0E, 0x00, 0x0E, + 0x81, 0x0F, 0x57, 0x08, 0xED, 0x12, 0x56, 0xF5, 0x5B, 0x1B, 0x11, 0xF4, + 0xEC, 0x20, 0xAE, 0x0D, 0x1E, 0x1C, 0x7D, 0x1D, 0x60, 0x16, 0x84, 0x20, + 0x55, 0x1F, 0x2F, 0x31, 0xFD, 0x2E, 0xC3, 0x3E, 0xC6, 0x36, 0xA7, 0x33, + 0xD9, 0x32, 0xB6, 0x21, 0x6A, 0x22, 0x8A, 0x1E, 0x18, 0x19, 0xDD, 0x2B, + 0x03, 0x1A, 0xB4, 0x36, 0x41, 0x1D, 0x61, 0x39, 0xA0, 0x1B, 0x8D, 0x2D, + 0x9E, 0x1D, 0x51, 0x1A, 0x5D, 0x2C, 0x0F, 0x15, 0xE9, 0x32, 0x06, 0x18, + 0xBC, 0x22, 0xCB, 0x1C, 0x6B, 0x0C, 0xEC, 0x21, 0xB2, 0x02, 0xA8, 0x23, + 0x12, 0x0E, 0x9E, 0x2B, 0x75, 0x1D, 0x2F, 0x2F, 0xEC, 0x24, 0x42, 0x2E, + 0xC1, 0x1C, 0x63, 0x20, 0xB9, 0x19, 0xA9, 0x13, 0xBB, 0x22, 0x62, 0x19, + 0x38, 0x29, 0xDF, 0x1A, 0x30, 0x28, 0x9C, 0x0C, 0x7B, 0x23, 0xD2, 0x02, + 0xE6, 0x1C, 0x95, 0xFE, 0xC4, 0x1F, 0x42, 0x09, 0x2F, 0x2A, 0x20, 0x21, + 0xF0, 0x19, 0x2C, 0x19, 0x72, 0x03, 0x6B, 0x01, 0x61, 0x02, 0x6F, 0x03, + 0x07, 0x08, 0xA8, 0x11, 0xC0, 0x01, 0x73, 0x09, 0x76, 0xF4, 0x53, 0xFA, + 0xD5, 0xEA, 0x1A, 0xF3, 0xC1, 0xE5, 0xDB, 0xEA, 0xC3, 0xF2, 0x1C, 0xEF, + 0x40, 0x04, 0x93, 0xF4, 0x01, 0xF7, 0xB4, 0xDD, 0x79, 0xE7, 0xBA, 0xD0, + 0xD5, 0xE2, 0xF7, 0xDC, 0x70, 0xCB, 0xD4, 0xD4, 0x4D, 0xB8, 0x18, 0xC4, + 0x85, 0xC5, 0xDF, 0xC7, 0xFC, 0xD9, 0xBD, 0xD4, 0x37, 0xDE, 0x2F, 0xD7, + 0x73, 0xE3, 0x25, 0xD9, 0x06, 0xE1, 0x18, 0xD7, 0xF4, 0xD6, 0xBF, 0xCB, + 0xD5, 0xDB, 0xB5, 0xD1, 0xE9, 0xE4, 0xCA, 0xE5, 0xC5, 0xE4, 0xE3, 0xE5, + 0x79, 0xE6, 0x93, 0xDE, 0x05, 0xED, 0x3B, 0xE9, 0x98, 0xEE, 0xA3, 0xF6, + 0x18, 0xF3, 0xD8, 0xFD, 0xD3, 0xFD, 0xF5, 0xFE, 0xDE, 0x03, 0xE8, 0x01, + 0x21, 0x02, 0x31, 0x0A, 0xB4, 0xFA, 0x4F, 0x0B, 0xD7, 0xEE, 0x0B, 0x06, + 0x4B, 0xE2, 0x8D, 0x00, 0xB7, 0xE0, 0xA4, 0xFD, 0x61, 0xE8, 0x04, 0xF6, + 0x66, 0xEB, 0x0F, 0xE8, 0xA6, 0xF5, 0x4B, 0xE4, 0x26, 0xFD, 0xF3, 0xE8, + 0xB4, 0xFD, 0x11, 0xF6, 0x8E, 0xF4, 0x49, 0xF9, 0xF3, 0xEA, 0x7E, 0xFB, + 0x5B, 0xE7, 0x06, 0xFC, 0x65, 0xE7, 0x01, 0xEC, 0xB6, 0xEF, 0xA1, 0xDF, + 0x25, 0xEE, 0x5E, 0xDB, 0x61, 0xEE, 0xBE, 0xDD, 0x88, 0xFC, 0x74, 0xE6, + 0xB5, 0x00, 0xFE, 0xEB, 0xA3, 0xF3, 0x27, 0xEA, 0xF5, 0xEF, 0xAF, 0xF2, + 0x12, 0xE9, 0xCF, 0xEF, 0xB5, 0xD9, 0x42, 0xD9, 0xD6, 0xD4, 0x29, 0xCF, + 0x54, 0xD3, 0x4D, 0xDA, 0xFB, 0xCA, 0xAF, 0xE3, 0x8B, 0xC8, 0xE2, 0xE3, + 0x63, 0xD6, 0x04, 0xE6, 0x90, 0xDB, 0xC8, 0xE0, 0x08, 0xD9, 0x38, 0xE3, + 0xFB, 0xE0, 0x57, 0xF9, 0x9A, 0xD9, 0x7B, 0xF8, 0xE3, 0xCF, 0x6F, 0xDF, + 0xEF, 0xE2, 0x37, 0xD9, 0xC7, 0xE4, 0x3C, 0xD8, 0xBE, 0xD0, 0xCB, 0xD4, + 0x4D, 0xCD, 0x8B, 0xDC, 0x2B, 0xDE, 0x3E, 0xED, 0x57, 0xE6, 0x5C, 0xEE, + 0x4A, 0xEF, 0x4F, 0xE7, 0xA5, 0x04, 0x21, 0xE7, 0x9C, 0x00, 0xA1, 0xD8, + 0x79, 0xEE, 0xD4, 0xCE, 0x90, 0xEA, 0xEC, 0xE1, 0x2E, 0xE7, 0x47, 0xEF, + 0x5A, 0xEB, 0x77, 0xF1, 0xD1, 0x01, 0xD6, 0xFD, 0x19, 0x18, 0x00, 0x05, + 0x3F, 0x25, 0x84, 0x03, 0x17, 0x23, 0xC3, 0x08, 0x1E, 0x0C, 0x18, 0x0F, + 0x64, 0xF6, 0x63, 0x0E, 0xCE, 0xF4, 0x81, 0x0D, 0xD5, 0xFE, 0xAD, 0x13, + 0x4A, 0x0A, 0x6B, 0x1A, 0xE5, 0x17, 0x6C, 0x18, 0xC4, 0x24, 0xDC, 0x1D, + 0xCF, 0x18, 0xB2, 0x1F, 0xEB, 0x0A, 0xE6, 0x22, 0x7D, 0x04, 0x08, 0x26, + 0xF0, 0xFF, 0x56, 0x1C, 0x88, 0x0B, 0x9F, 0x16, 0x85, 0x1A, 0xE7, 0x17, + 0x58, 0x26, 0x0D, 0x1F, 0xE3, 0x1F, 0x89, 0x18, 0x87, 0x1E, 0xDB, 0x19, + 0x44, 0x28, 0xB5, 0x27, 0x1E, 0x2A, 0x82, 0x30, 0xAF, 0x27, 0xBD, 0x34, + 0x07, 0x26, 0x04, 0x31, 0xDD, 0x15, 0x46, 0x27, 0x69, 0x0D, 0x97, 0x2A, + 0xC1, 0x15, 0x31, 0x2A, 0xCB, 0x0B, 0x14, 0x11, 0x62, 0x01, 0x1B, 0x00, + 0x51, 0x0E, 0xB5, 0x0E, 0x28, 0x22, 0x06, 0x22, 0xEC, 0x1E, 0xE6, 0x1A, + 0x65, 0x15, 0x78, 0x0B, 0x67, 0x17, 0x6F, 0x0B, 0xEC, 0x09, 0x91, 0x11, + 0xEE, 0xFB, 0x48, 0x18, 0x7E, 0xFA, 0xF4, 0x1B, 0xEE, 0xF4, 0xFB, 0x07, + 0xEC, 0x04, 0x5C, 0xF9, 0x0B, 0x1B, 0x1C, 0xF8, 0x45, 0x18, 0xE2, 0xEA, + 0xEB, 0x0D, 0x7B, 0xDA, 0x54, 0x0C, 0xEC, 0xDF, 0xF9, 0x08, 0x12, 0xEF, + 0x9B, 0xFF, 0x88, 0xEA, 0xA1, 0x03, 0xA8, 0xE8, 0xEC, 0x08, 0x2C, 0xF0, + 0xC1, 0xFF, 0xAF, 0xF3, 0xED, 0xFD, 0xA2, 0xFE, 0x88, 0xFF, 0x6D, 0x07, + 0x19, 0xFC, 0x3E, 0x05, 0x22, 0x03, 0xB6, 0x08, 0x44, 0x12, 0x01, 0x12, + 0x92, 0x20, 0x25, 0x16, 0xA6, 0x2A, 0xEB, 0x15, 0x94, 0x2E, 0xE3, 0x11, + 0x60, 0x2D, 0xB7, 0x06, 0xC8, 0x21, 0xA3, 0xFE, 0xB6, 0x05, 0xDF, 0x00, + 0x8A, 0xF5, 0xBB, 0x09, 0x14, 0xFB, 0xD9, 0x0D, 0xDB, 0x0B, 0x32, 0x11, + 0x6A, 0x1B, 0x6A, 0x10, 0x4E, 0x1E, 0xE8, 0x0D, 0x7C, 0x16, 0x97, 0x16, + 0x1B, 0xFD, 0xBD, 0x0D, 0x87, 0xF2, 0x17, 0x00, 0xCE, 0xF2, 0x17, 0x01, + 0x72, 0xFA, 0x00, 0x0E, 0x41, 0x0B, 0x99, 0x17, 0xE1, 0x16, 0x78, 0x1E, + 0x0D, 0x1E, 0x1E, 0x1F, 0xAC, 0x16, 0xFC, 0x12, 0x3C, 0x09, 0x56, 0x10, + 0xD8, 0xFF, 0xA3, 0x14, 0x92, 0xF0, 0xCB, 0x11, 0xEC, 0xE9, 0xB2, 0x13, + 0x41, 0xF9, 0xCF, 0x1D, 0xB6, 0x01, 0xAD, 0x16, 0x75, 0xFC, 0x33, 0x08, + 0x4C, 0xFA, 0xBA, 0x09, 0x73, 0xF5, 0x79, 0x0D, 0x97, 0xE3, 0xA2, 0x05, + 0x57, 0xDA, 0xFB, 0xFB, 0xD8, 0xE9, 0xA4, 0xFD, 0xE4, 0xFB, 0xA7, 0x04, + 0x5F, 0x09, 0x5C, 0x0E, 0x13, 0x14, 0x8A, 0x18, 0xD5, 0x0B, 0x49, 0x0B, + 0xFC, 0x03, 0x42, 0xFC, 0xBE, 0x04, 0x69, 0xF8, 0x96, 0xF3, 0xFC, 0xE9, + 0x66, 0xE4, 0x1D, 0xE3, 0xD8, 0xEF, 0x2E, 0xEA, 0xCE, 0x04, 0x01, 0xEE, + 0x6A, 0x0E, 0x07, 0xED, 0x40, 0x0A, 0x31, 0xF0, 0x21, 0x09, 0x08, 0xF2, + 0xE5, 0x0E, 0xD9, 0xEE, 0xD2, 0x1A, 0xBF, 0xFF, 0xE5, 0x1C, 0x03, 0x0F, + 0x11, 0x0F, 0x64, 0x07, 0xF1, 0x0C, 0x91, 0x05, 0x47, 0x17, 0xD2, 0x0A, + 0x78, 0x21, 0x18, 0x0E, 0x99, 0x26, 0xA6, 0x0D, 0xEF, 0x27, 0x82, 0x17, + 0xE0, 0x27, 0xBA, 0x26, 0xFC, 0x2E, 0x45, 0x2E, 0x49, 0x2A, 0x16, 0x28, + 0x0F, 0x0F, 0x10, 0x17, 0xF6, 0xF1, 0x27, 0x06, 0x68, 0xE4, 0xF4, 0x03, + 0xD2, 0xE6, 0x53, 0x0A, 0x08, 0xEE, 0x48, 0x04, 0x48, 0xFE, 0xD8, 0x07, + 0x2D, 0x0E, 0x7E, 0x09, 0x10, 0x1C, 0x6D, 0x03, 0xB5, 0x1A, 0x51, 0x01, + 0x99, 0xFE, 0x3F, 0xFA, 0x8D, 0xE8, 0x1D, 0xF2, 0xEF, 0xE9, 0x6C, 0xE6, + 0x7F, 0xFD, 0x5C, 0xE6, 0x4C, 0x08, 0x6D, 0xED, 0x00, 0x08, 0x21, 0xF3, + 0x40, 0x0A, 0xD8, 0x03, 0xDE, 0x03, 0xAE, 0x07, 0x19, 0xFB, 0x75, 0xF3, + 0x2C, 0x00, 0x8D, 0xF5, 0x97, 0x00, 0xB8, 0x00, 0xDC, 0xF4, 0x45, 0xF1, + 0x30, 0xF0, 0x69, 0xE6, 0xA7, 0xF3, 0x59, 0xEF, 0xCD, 0xE9, 0x9A, 0xEE, + 0x89, 0xD8, 0x0F, 0xE2, 0x8E, 0xD9, 0x7E, 0xDE, 0x77, 0xDD, 0x3F, 0xDD, + 0xB7, 0xDD, 0xEB, 0xDE, 0x58, 0xE8, 0x36, 0xF2, 0xCE, 0xE2, 0xCF, 0xF1, + 0xB7, 0xCA, 0xE2, 0xD8, 0x03, 0xBF, 0xA5, 0xDC, 0xCF, 0xB2, 0x42, 0xE2, + 0x4B, 0xA6, 0xC1, 0xD4, 0x3B, 0xAC, 0x82, 0xD1, 0x81, 0xBF, 0xD9, 0xD9, + 0x49, 0xD4, 0x37, 0xE1, 0x8C, 0xE4, 0x54, 0xE3, 0xF8, 0xE8, 0xB7, 0xE2, + 0x80, 0xD2, 0x48, 0xD8, 0xAE, 0xB9, 0xD2, 0xC6, 0x21, 0xC1, 0x1A, 0xC3, + 0x66, 0xCE, 0x1F, 0xC6, 0xC0, 0xDD, 0xB7, 0xD5, 0xA9, 0xF2, 0x51, 0xF2, + 0xFD, 0xF9, 0xA5, 0x01, 0xBA, 0xFC, 0xE9, 0xFE, 0x0A, 0x05, 0x14, 0xFD, + 0x5D, 0x0A, 0xDA, 0xFD, 0xAE, 0x08, 0x28, 0xF4, 0x75, 0x05, 0x39, 0xEE, + 0x0B, 0x05, 0x31, 0xED, 0x85, 0x0B, 0xA3, 0xEC, 0x0A, 0x11, 0x71, 0xF2, + 0x77, 0x16, 0xB0, 0xF6, 0xD4, 0x19, 0xC8, 0xEE, 0xE4, 0x1C, 0xB0, 0xF1, + 0xD9, 0x23, 0xCC, 0x02, 0xF2, 0x20, 0xBD, 0x02, 0xE3, 0x1D, 0x5F, 0x01, + 0x15, 0x11, 0xCE, 0x07, 0xD3, 0x05, 0xA0, 0x19, 0xBE, 0x03, 0x79, 0x1B, + 0x34, 0x0B, 0x90, 0x11, 0xF6, 0x1B, 0x24, 0x16, 0x62, 0x27, 0x3C, 0x1A, + 0x79, 0x2D, 0x77, 0x1D, 0xC7, 0x2C, 0xDF, 0x1C, 0x17, 0x17, 0xCD, 0x05, + 0x7E, 0x02, 0x63, 0xF7, 0xA6, 0x03, 0x6D, 0x08, 0x5E, 0xF6, 0x06, 0x0C, + 0xAC, 0xE9, 0xBA, 0x04, 0xF6, 0xF7, 0x67, 0x0B, 0xEB, 0x0F, 0x65, 0x1B, + 0x0F, 0x0D, 0x28, 0x18, 0xA2, 0xFC, 0x26, 0x10, 0xA6, 0xF7, 0x12, 0x1A, + 0xB9, 0xF7, 0x78, 0x21, 0x9A, 0xFB, 0xEF, 0x1D, 0x0C, 0x01, 0x9F, 0x1A, + 0x7B, 0xFF, 0x84, 0x0F, 0x49, 0x01, 0xBA, 0x04, 0x32, 0x0C, 0x52, 0x06, + 0x20, 0x09, 0x1A, 0xFF, 0x48, 0xFE, 0xEB, 0xF5, 0x25, 0xFB, 0xB3, 0xF9, + 0xCA, 0x08, 0x99, 0x08, 0x4C, 0x17, 0xDC, 0x09, 0xD4, 0x15, 0xC6, 0x03, + 0xEE, 0x08, 0x81, 0x0B, 0x00, 0xFD, 0x8B, 0x0D, 0xC2, 0x00, 0xAD, 0x0C, + 0xF9, 0x0B, 0x85, 0x15, 0x25, 0x15, 0x89, 0x1D, 0x9F, 0x25, 0x22, 0x29, + 0xAA, 0x2E, 0xC2, 0x31, 0xF5, 0x25, 0xE4, 0x2E, 0x95, 0x20, 0x2A, 0x2C, + 0x0B, 0x1E, 0x48, 0x2B, 0x97, 0x14, 0x43, 0x26, 0x63, 0x10, 0x29, 0x23, + 0xB3, 0x14, 0x8C, 0x21, 0x64, 0x15, 0x96, 0x1B, 0x96, 0x19, 0x8E, 0x1B, + 0xB7, 0x23, 0x85, 0x1E, 0xA9, 0x2C, 0x14, 0x24, 0x28, 0x24, 0x38, 0x29, + 0x81, 0x14, 0xCC, 0x2C, 0xCF, 0x10, 0xB2, 0x2A, 0xC9, 0x16, 0x7C, 0x21, + 0x71, 0x1A, 0x64, 0x15, 0x44, 0x24, 0x05, 0x13, 0x3A, 0x2D, 0x5E, 0x0F, + 0xF1, 0x22, 0x6C, 0xFF, 0x5A, 0x2C, 0xEB, 0x09, 0x22, 0x3C, 0x09, 0x1D, + 0xEB, 0x38, 0x91, 0x23, 0x3E, 0x37, 0x2C, 0x2B, 0xC7, 0x30, 0xBF, 0x20, + 0xD1, 0x16, 0xE3, 0x06, 0x4F, 0x0B, 0xFA, 0x0B, 0xE4, 0x01, 0x48, 0x16, + 0x4D, 0xEB, 0xE2, 0x11, 0xB7, 0xF0, 0x66, 0x12, 0x3D, 0x19, 0xCE, 0x10, + 0x53, 0x2F, 0xBE, 0x04, 0x68, 0x1B, 0xA3, 0xF0, 0xC6, 0x09, 0xEC, 0xE7, + 0xEC, 0xF7, 0xF3, 0xE8, 0x5D, 0xDB, 0xA4, 0xEA, 0x10, 0xD3, 0x2C, 0xF4, + 0x48, 0xDF, 0x58, 0xF8, 0x01, 0xE6, 0xB2, 0xEB, 0x99, 0xE9, 0xA3, 0xE5, + 0x09, 0xE8, 0x30, 0xDC, 0x6C, 0xDB, 0x03, 0xC3, 0x5D, 0xD2, 0xFF, 0xBA, + 0x03, 0xD3, 0x10, 0xC4, 0x51, 0xD6, 0x85, 0xCC, 0x56, 0xD7, 0xF2, 0xD7, + 0x0E, 0xDD, 0x36, 0xDF, 0x07, 0xDE, 0xDA, 0xD6, 0x5C, 0xD3, 0x03, 0xCE, + 0x73, 0xD3, 0x02, 0xD6, 0x44, 0xD7, 0x31, 0xD9, 0x00, 0xDB, 0x3B, 0xDE, + 0x86, 0xE1, 0x27, 0xED, 0x3D, 0xE6, 0x6F, 0xF4, 0x3D, 0xED, 0x77, 0xF3, + 0x31, 0xF6, 0x3B, 0xF6, 0x5C, 0xF0, 0x76, 0xF3, 0xCE, 0xDD, 0x5A, 0xF0, + 0x26, 0xD4, 0xB0, 0xF5, 0x04, 0xDC, 0x4C, 0xF5, 0x1A, 0xEF, 0x6E, 0xF7, + 0x17, 0xFA, 0x4D, 0xFE, 0xC7, 0x02, 0x41, 0x04, 0xB2, 0x00, 0x03, 0xF9, + 0xC8, 0xF4, 0x4E, 0xE7, 0xD4, 0xE8, 0x19, 0xE1, 0xD6, 0xDD, 0x79, 0xE2, + 0x85, 0xE3, 0x3D, 0xE6, 0xB6, 0xEE, 0x28, 0xE5, 0xB6, 0xF6, 0xB6, 0xDF, + 0x8F, 0x00, 0x7F, 0xE0, 0x21, 0x05, 0x1F, 0xEE, 0xEC, 0xFC, 0x5E, 0xF3, + 0x9E, 0xF6, 0x4B, 0xF2, 0x7C, 0xEE, 0xA2, 0xF1, 0x16, 0xEA, 0xF3, 0xEE, + 0x41, 0xEF, 0x65, 0xEC, 0x96, 0x00, 0x6F, 0x00, 0xE3, 0x02, 0xA0, 0x0A, + 0xAC, 0xE6, 0x28, 0xEF, 0x7A, 0xE1, 0xF2, 0xE1, 0x98, 0xF5, 0x29, 0xED, + 0x2A, 0xF0, 0x9D, 0xEE, 0x08, 0xDD, 0x6E, 0xEB, 0x97, 0xDC, 0x55, 0xF2, + 0x9B, 0xE3, 0x10, 0xF6, 0xE1, 0xEE, 0x2F, 0xF5, 0x87, 0xF8, 0xA9, 0xFB, + 0x37, 0xEF, 0xA1, 0xFF, 0xC8, 0xDB, 0xE0, 0xFC, 0x8A, 0xDC, 0x2C, 0x0A, + 0xED, 0xEB, 0x49, 0x10, 0x6F, 0xED, 0x3C, 0xF9, 0x3A, 0xE8, 0x71, 0xEB, + 0x6A, 0xEE, 0xF4, 0xF1, 0x72, 0xF1, 0xB9, 0xE8, 0xEB, 0xEE, 0x43, 0xDD, + 0x98, 0xEA, 0x26, 0xDE, 0x34, 0xED, 0x2D, 0xE8, 0x78, 0xF6, 0xE2, 0xF6, + 0x92, 0xFC, 0x32, 0xFD, 0x76, 0x03, 0x1F, 0xFC, 0x60, 0x06, 0xEF, 0xF9, + 0x77, 0x07, 0xC2, 0xFC, 0xD5, 0x08, 0x80, 0x01, 0x91, 0x03, 0xA6, 0x02, + 0x17, 0xF9, 0xCE, 0x01, 0x54, 0x02, 0x01, 0x08, 0x3A, 0x1D, 0xC0, 0x11, + 0x4D, 0x34, 0x32, 0x16, 0xC2, 0x2A, 0x73, 0xFF, 0xAD, 0x14, 0xAA, 0xF1, + 0x3B, 0x08, 0x1D, 0x03, 0xC4, 0xF3, 0x7C, 0x09, 0xE5, 0xE9, 0xD6, 0x04, + 0x03, 0xF4, 0x8C, 0x05, 0x54, 0x02, 0x64, 0x0A, 0xC3, 0x0B, 0xFC, 0x0C, + 0x21, 0x17, 0x7A, 0x10, 0x70, 0x06, 0x0E, 0x05, 0x66, 0xF4, 0xDA, 0xFC, + 0xC4, 0x01, 0xD3, 0x02, 0xA9, 0x09, 0x63, 0x07, 0x76, 0x06, 0x41, 0x0E, + 0x63, 0x10, 0x59, 0x1B, 0x73, 0x1B, 0xAE, 0x20, 0x8E, 0x17, 0x8C, 0x17, + 0x86, 0x0B, 0xD5, 0x07, 0xAA, 0x06, 0x62, 0x08, 0x32, 0x0F, 0xF2, 0x12, + 0x48, 0x10, 0x07, 0x04, 0xDD, 0x11, 0x9D, 0xFE, 0x3C, 0x13, 0xF0, 0x0E, + 0x4B, 0x11, 0xBE, 0x1D, 0x04, 0x07, 0xB5, 0x1B, 0x35, 0xF4, 0x56, 0x05, + 0xE7, 0xF1, 0x51, 0xF7, 0x81, 0xFC, 0x08, 0xF7, 0xFF, 0x03, 0xAF, 0xFA, + 0xA0, 0x08, 0xF1, 0xFC, 0x55, 0x04, 0x60, 0xF9, 0xD6, 0xFD, 0x05, 0xFC, + 0xCE, 0xFC, 0xE2, 0xFD, 0x92, 0xEE, 0x42, 0xEE, 0x58, 0xDF, 0xFD, 0xDB, + 0x4F, 0xE2, 0x67, 0xDA, 0xA3, 0xEA, 0xFB, 0xE7, 0x94, 0xF5, 0x88, 0xFA, + 0x6E, 0xF8, 0x04, 0xFF, 0xBE, 0xE8, 0x95, 0xF6, 0x51, 0xE4, 0x64, 0xF4, + 0xE4, 0xF5, 0xE7, 0xF3, 0x26, 0x01, 0x96, 0xF5, 0xD9, 0x02, 0x0A, 0xFA, + 0x5C, 0x12, 0xC1, 0xFE, 0xAA, 0x22, 0xF7, 0x06, 0xD1, 0x22, 0xD0, 0x06, + 0x96, 0x21, 0x5A, 0x06, 0xF2, 0x19, 0x7B, 0x0D, 0x86, 0x05, 0xF4, 0x0E, + 0x6F, 0xFE, 0x16, 0x14, 0x9D, 0x05, 0x46, 0x12, 0xF2, 0x0E, 0x7C, 0x07, + 0xF4, 0x1D, 0x40, 0x0B, 0x16, 0x25, 0xF6, 0x10, 0x77, 0x20, 0xA8, 0x10, + 0x3D, 0x0C, 0xC7, 0x0D, 0x98, 0xFD, 0x1F, 0x13, 0x96, 0x05, 0xF4, 0x18, + 0xFA, 0x0A, 0xBB, 0x13, 0x12, 0x0F, 0x04, 0x0F, 0x32, 0x20, 0xFC, 0x08, + 0x51, 0x2D, 0xEB, 0x0C, 0xDD, 0x19, 0x45, 0x1B, 0x50, 0x08, 0x3E, 0x2B, + 0x3F, 0x12, 0xBA, 0x2B, 0x2C, 0x19, 0xC7, 0x17, 0x8E, 0x1A, 0xFE, 0x0B, + 0x92, 0x15, 0xA3, 0x0C, 0xF4, 0x06, 0x8E, 0x0C, 0xB5, 0x0B, 0xE0, 0x11, + 0x20, 0x09, 0x9C, 0x0A, 0xD7, 0xF3, 0x5A, 0xFE, 0x21, 0xF6, 0x66, 0x08, + 0x2A, 0x05, 0x3B, 0x11, 0xBC, 0xFF, 0xDC, 0x0C, 0xA1, 0xEC, 0x63, 0x07, + 0x5B, 0xEC, 0x80, 0x07, 0xA2, 0xF7, 0x2E, 0xFF, 0x62, 0xFC, 0x23, 0xFB, + 0x8B, 0x05, 0xF2, 0x08, 0x83, 0x04, 0x7A, 0x07, 0xE0, 0xF9, 0xF5, 0x04, + 0x4F, 0xFC, 0x4B, 0x0B, 0xE8, 0xFF, 0x77, 0x01, 0xDA, 0xF2, 0x1A, 0xEC, + 0x7D, 0xEF, 0x2E, 0xEB, 0xBF, 0xFB, 0x8B, 0xF5, 0x7A, 0x02, 0x13, 0xF8, + 0x83, 0x07, 0xE7, 0xFD, 0xDB, 0x13, 0x49, 0x03, 0x74, 0x1F, 0x21, 0xFD, + 0xE4, 0x29, 0xDB, 0xFC, 0xBA, 0x33, 0x01, 0x11, 0xBA, 0x2B, 0xB8, 0x15, + 0x46, 0x1F, 0x33, 0x09, 0x29, 0x20, 0x74, 0x0D, 0x50, 0x23, 0xB7, 0x18, + 0x99, 0x1E, 0x93, 0x23, 0x09, 0x19, 0x15, 0x38, 0x03, 0x15, 0x95, 0x3F, + 0x22, 0x1C, 0x40, 0x45, 0x76, 0x22, 0x8A, 0x4B, 0x86, 0x12, 0xB1, 0x37, + 0x09, 0x01, 0xD8, 0x21, 0x30, 0xFE, 0x16, 0x18, 0x81, 0x08, 0xF7, 0x12, + 0xB6, 0x0E, 0x42, 0x0D, 0x1A, 0x0F, 0x7B, 0x14, 0x62, 0x15, 0xAA, 0x1C, + 0xB7, 0x16, 0x3E, 0x0E, 0x14, 0x1F, 0x6A, 0x0A, 0x1C, 0x29, 0xA7, 0x0D, + 0xCD, 0x1F, 0xD7, 0x09, 0xF1, 0x0E, 0x05, 0x04, 0x93, 0x0E, 0x95, 0x04, + 0xE3, 0x1C, 0x18, 0x09, 0x4A, 0x23, 0x85, 0x0B, 0x33, 0x24, 0x9F, 0x13, + 0xC2, 0x27, 0x34, 0x1C, 0x2B, 0x18, 0x48, 0x13, 0x21, 0x1D, 0xE0, 0x15, + 0x71, 0x30, 0xA7, 0x1E, 0xBD, 0x1F, 0xDB, 0x07, 0x6D, 0x09, 0xA1, 0xFB, + 0xE6, 0x04, 0x8D, 0x0D, 0x29, 0x00, 0x12, 0x12, 0xC1, 0xEB, 0x0B, 0xF8, + 0xA0, 0xEC, 0x23, 0xEB, 0xE1, 0x08, 0x02, 0xF0, 0xCE, 0x0D, 0x52, 0xF2, + 0x7B, 0xFD, 0x14, 0x07, 0x96, 0xF1, 0x37, 0x19, 0xED, 0xDE, 0x7C, 0x08, + 0x22, 0xD0, 0x18, 0xF7, 0x19, 0xD4, 0xC9, 0xF7, 0x3D, 0xD1, 0xA0, 0xE8, + 0x27, 0xCB, 0x0A, 0xD5, 0x13, 0xD9, 0x84, 0xDA, 0xCD, 0xED, 0x76, 0xEA, + 0x32, 0xED, 0x84, 0xE8, 0x4A, 0xE3, 0x74, 0xE1, 0xBE, 0xDC, 0x97, 0xE2, + 0x0E, 0xD4, 0x2B, 0xE6, 0x17, 0xCD, 0x88, 0xEE, 0xCD, 0xD5, 0x49, 0xF4, + 0xFD, 0xDF, 0x4D, 0xEB, 0x14, 0xE0, 0xA5, 0xEB, 0x53, 0xE8, 0xF1, 0xF9, + 0xDF, 0xF3, 0x94, 0xF8, 0x9B, 0xFF, 0xC5, 0xF1, 0x1F, 0x04, 0x09, 0xEF, + 0x2F, 0x04, 0x32, 0xF4, 0xF8, 0x09, 0xE0, 0xFE, 0xC4, 0x0E, 0x9D, 0xF9, + 0xA3, 0x0D, 0x38, 0xE8, 0xC2, 0x12, 0xC6, 0xE1, 0x65, 0x13, 0x7E, 0xE3, + 0xDE, 0x0B, 0x59, 0xE8, 0x90, 0x09, 0xA7, 0xEF, 0x91, 0x0F, 0x41, 0xFE, + 0x3B, 0x0E, 0x07, 0x02, 0x43, 0x0A, 0xA3, 0xF9, 0x65, 0x05, 0x46, 0xF4, + 0xA6, 0xF4, 0x68, 0xF8, 0x68, 0xED, 0xE9, 0xFA, 0x14, 0xF4, 0xF5, 0xF2, + 0x7D, 0x02, 0x06, 0xF6, 0x58, 0x0B, 0x1A, 0xF8, 0xE4, 0x07, 0xB5, 0xF5, + 0x7D, 0xFC, 0xE9, 0xF7, 0x69, 0xE0, 0x94, 0xF3, 0xB4, 0xCF, 0x91, 0xEE, + 0x88, 0xE1, 0xC7, 0xF9, 0x94, 0xEB, 0x83, 0xF2, 0x5A, 0xE4, 0xAE, 0xD9, + 0x95, 0xDC, 0x93, 0xD6, 0xF1, 0xD9, 0x06, 0xE8, 0xEF, 0xCB, 0x4A, 0xEE, + 0x74, 0xBC, 0x8C, 0xE3, 0x6A, 0xCC, 0xEF, 0xE1, 0xC6, 0xDD, 0xA8, 0xE0, + 0x66, 0xEB, 0x7E, 0xE8, 0xC9, 0xF7, 0x4F, 0xF9, 0x73, 0xE8, 0xD9, 0xF3, + 0x3F, 0xD6, 0x30, 0xE3, 0xD7, 0xDB, 0x45, 0xE0, 0x08, 0xD9, 0x4A, 0xDC, + 0xF7, 0xC6, 0x3C, 0xCD, 0x55, 0xCA, 0x9D, 0xC3, 0x33, 0xDF, 0x5B, 0xCC, + 0x9B, 0xE8, 0x5B, 0xD9, 0x50, 0xDF, 0x11, 0xDD, 0x40, 0xD6, 0xA5, 0xE6, + 0x6A, 0xD5, 0x3D, 0xED, 0x6A, 0xDF, 0xEE, 0xEF, 0x9E, 0xF2, 0x26, 0xF5, + 0x02, 0xFA, 0x29, 0xEE, 0xB2, 0xF6, 0xB0, 0xED, 0xD0, 0x00, 0x6C, 0x03, + 0xEB, 0x08, 0xC3, 0x14, 0x26, 0x03, 0x01, 0x1A, 0x45, 0xFE, 0x65, 0x1A, + 0xCD, 0x00, 0x40, 0x0F, 0xEF, 0x09, 0xEF, 0x04, 0x14, 0x0C, 0x26, 0x01, + 0xEB, 0xFF, 0xD9, 0xFC, 0xA0, 0xF5, 0xA3, 0xFA, 0x8D, 0xF5, 0xDF, 0xFC, + 0xFC, 0xF3, 0x5D, 0x06, 0x0E, 0xF4, 0x14, 0x0B, 0xD4, 0x02, 0xD5, 0x0A, + 0xBF, 0x0A, 0xE7, 0x06, 0x99, 0x04, 0xE7, 0x03, 0x9B, 0x06, 0x6E, 0x07, + 0x7B, 0x12, 0x97, 0x00, 0x2C, 0x20, 0xD3, 0xF4, 0x3C, 0x23, 0x90, 0xF8, + 0x76, 0x23, 0x4C, 0x09, 0x32, 0x21, 0x18, 0x0E, 0xBF, 0x1A, 0xB3, 0x12, + 0xED, 0x18, 0x5A, 0x1D, 0x0D, 0x19, 0xD5, 0x23, 0x46, 0x09, 0xE5, 0x18, + 0xAC, 0x0B, 0x81, 0x14, 0x69, 0x1E, 0xFB, 0x13, 0x56, 0x1F, 0x35, 0x04, + 0xF9, 0x19, 0xCE, 0xFD, 0x36, 0x1D, 0x49, 0x07, 0x94, 0x16, 0x4E, 0x03, + 0x3D, 0x01, 0x87, 0xEC, 0x55, 0xFD, 0xCA, 0xE8, 0x62, 0xF8, 0x15, 0xF1, + 0x85, 0xEA, 0x77, 0xF2, 0xBA, 0xEF, 0x32, 0xFE, 0xC5, 0xFB, 0xE2, 0x0C, + 0x8F, 0xF7, 0x57, 0xFE, 0x53, 0xEE, 0x1E, 0xE7, 0x0B, 0xDF, 0x16, 0xE1, + 0x0A, 0xCC, 0xED, 0xE1, 0xBB, 0xD1, 0x6A, 0xE0, 0x3C, 0xF2, 0xC6, 0xE8, + 0xDF, 0x0A, 0x22, 0xF6, 0xF5, 0x06, 0x87, 0xFC, 0x56, 0xFC, 0xEC, 0x00, + 0x77, 0xF2, 0x43, 0xF8, 0xFA, 0xE3, 0x3A, 0xF0, 0x58, 0xDF, 0x88, 0xF6, + 0xA0, 0xE6, 0x90, 0xF8, 0x52, 0xED, 0x1C, 0xF8, 0xF0, 0x03, 0xCB, 0x09, + 0xD6, 0x1B, 0xC5, 0x17, 0xB1, 0x1D, 0x15, 0x16, 0xF3, 0x17, 0xAD, 0x1C, + 0x90, 0x16, 0x46, 0x2A, 0x3E, 0x0F, 0x18, 0x29, 0xE7, 0x03, 0xF0, 0x21, + 0x8F, 0x04, 0x9E, 0x20, 0x9F, 0x05, 0xAF, 0x15, 0x22, 0x02, 0x13, 0x09, + 0x59, 0x00, 0xB3, 0x09, 0x0E, 0x09, 0x47, 0x0B, 0xBC, 0x19, 0x50, 0x02, + 0x57, 0x24, 0xA5, 0xFD, 0x31, 0x22, 0x46, 0xFF, 0xE8, 0x19, 0x5C, 0x05, + 0xD7, 0x03, 0x86, 0x05, 0x03, 0xF8, 0xE2, 0x0A, 0x1E, 0xF2, 0x06, 0x0B, + 0x30, 0xF0, 0x5A, 0xFE, 0xB3, 0x09, 0xD8, 0xFC, 0x67, 0x29, 0x53, 0x08, + 0xF0, 0x32, 0xBE, 0x0E, 0xFB, 0x26, 0x00, 0x03, 0xAB, 0x17, 0x45, 0xF4, + 0xE9, 0x10, 0x83, 0xF1, 0x0A, 0x13, 0x00, 0xFA, 0x9E, 0x03, 0x8B, 0xF6, + 0x12, 0xEB, 0xF1, 0xEC, 0x92, 0xE3, 0x29, 0xF5, 0xBA, 0xF3, 0x24, 0x0C, + 0xF4, 0x01, 0x8D, 0x11, 0xA5, 0xFF, 0x8D, 0x04, 0x37, 0x05, 0xC9, 0x04, + 0x80, 0x09, 0x85, 0x0E, 0x08, 0x04, 0xA2, 0x1C, 0x72, 0xFE, 0xD3, 0x23, + 0xC8, 0xF3, 0xB4, 0x13, 0xBA, 0xEB, 0x2D, 0x04, 0x81, 0xF4, 0xC1, 0x08, + 0x5B, 0xF5, 0xA3, 0x01, 0x52, 0xF1, 0x7E, 0xE9, 0xF3, 0xFF, 0x41, 0xE4, + 0x7C, 0x18, 0x38, 0xFC, 0xA6, 0x20, 0x78, 0x12, 0xB7, 0x10, 0x18, 0x13, + 0x6D, 0xFE, 0x7D, 0x08, 0x01, 0xF3, 0x91, 0xFE, 0x28, 0xF8, 0x57, 0x01, + 0x0F, 0x0C, 0x03, 0x0B, 0x85, 0x14, 0x4B, 0x0D, 0x69, 0x19, 0x62, 0x0F, + 0x5A, 0x31, 0xB7, 0x1C, 0xE6, 0x3F, 0xD9, 0x24, 0x0B, 0x32, 0x24, 0x20, + 0x13, 0x19, 0xF4, 0x1E, 0x90, 0x07, 0xD3, 0x23, 0x0C, 0x04, 0x90, 0x23, + 0x16, 0x04, 0x90, 0x20, 0xC8, 0x07, 0x28, 0x22, 0xA7, 0x0F, 0x1E, 0x23, + 0x66, 0x08, 0x30, 0x1F, 0xFA, 0xFE, 0x3C, 0x1C, 0x43, 0x01, 0x4B, 0x15, + 0x58, 0x00, 0x69, 0x08, 0x2C, 0xF7, 0x47, 0xF7, 0xB0, 0xFB, 0x5B, 0xF7, + 0x8A, 0x04, 0xB3, 0x03, 0xC9, 0x03, 0x57, 0x05, 0x9C, 0x07, 0x4F, 0x00, + 0x01, 0x10, 0x24, 0xF2, 0x10, 0x15, 0xF5, 0xEE, 0x97, 0x06, 0xD1, 0xF8, + 0x6D, 0xF8, 0x94, 0x01, 0x88, 0xF0, 0x28, 0xFC, 0xC9, 0xE7, 0x6A, 0xEB, + 0x59, 0xE9, 0x52, 0xE3, 0x77, 0xF5, 0x89, 0xED, 0x16, 0xFD, 0x84, 0xFD, + 0x21, 0xF7, 0x57, 0xFE, 0x36, 0xF0, 0xEF, 0xF0, 0xB2, 0xFB, 0x14, 0xEB, + 0x2A, 0xFB, 0xC4, 0xDF, 0x3C, 0xD8, 0x29, 0xC4, 0x9B, 0xC2, 0xAC, 0xC0, + 0x69, 0xC6, 0x36, 0xD5, 0xF9, 0xD1, 0xEF, 0xDF, 0xEF, 0xE8, 0x29, 0xE2, + 0x38, 0xFA, 0x2D, 0xE2, 0xB8, 0xEC, 0x63, 0xD5, 0x16, 0xD6, 0xB4, 0xC6, + 0x84, 0xCD, 0xC3, 0xC1, 0x6F, 0xC2, 0x32, 0xB8, 0x5D, 0xB4, 0x3F, 0xAD, + 0x32, 0xBB, 0x62, 0xB6, 0xCB, 0xD4, 0x41, 0xCC, 0x93, 0xE7, 0xFE, 0xD5, + 0x1F, 0xE8, 0x0F, 0xD3, 0xE6, 0xE1, 0x2C, 0xD0, 0x63, 0xDE, 0x09, 0xD1, + 0x7B, 0xDD, 0xDB, 0xDA, 0x0E, 0xDE, 0x3E, 0xE6, 0x0D, 0xE0, 0x83, 0xE4, + 0xD2, 0xE7, 0x84, 0xE3, 0xA8, 0xF1, 0xDB, 0xEF, 0x72, 0xF2, 0x7D, 0xFD, + 0xDD, 0xED, 0xAE, 0x04, 0xC3, 0xED, 0xFE, 0x02, 0x39, 0xF4, 0x62, 0xFA, + 0x83, 0xFF, 0x89, 0xF6, 0x65, 0x04, 0xE8, 0xF4, 0x43, 0x05, 0x2F, 0xF6, + 0xC4, 0x04, 0x2B, 0xFB, 0x88, 0x05, 0xF1, 0x04, 0x93, 0x0C, 0xA5, 0x14, + 0x93, 0x11, 0x48, 0x1D, 0x36, 0x0F, 0xE5, 0x15, 0x02, 0x08, 0xF5, 0x07, + 0xF1, 0x0F, 0x53, 0x11, 0x2B, 0x16, 0x85, 0x1B, 0xAD, 0x16, 0x31, 0x1B, + 0x91, 0x17, 0x4B, 0x17, 0x52, 0x15, 0xBE, 0x13, 0x5F, 0x16, 0x74, 0x21, + 0x33, 0x16, 0x3F, 0x31, 0xAD, 0x17, 0xA8, 0x36, 0x5B, 0x13, 0x0E, 0x33, + 0x54, 0x0C, 0xC9, 0x2B, 0x1E, 0x0E, 0x42, 0x22, 0xC6, 0x1A, 0xFB, 0x1F, + 0x41, 0x1C, 0x92, 0x1E, 0x12, 0x0A, 0xD9, 0x10, 0xA2, 0x0A, 0x26, 0x0C, + 0x00, 0x20, 0x04, 0x1B, 0x89, 0x1B, 0x82, 0x1B, 0xE2, 0x10, 0x5D, 0x10, + 0xD3, 0x16, 0xA0, 0x0F, 0x16, 0x17, 0xED, 0x13, 0xBB, 0x17, 0xDF, 0x1C, + 0xB8, 0x23, 0x28, 0x2E, 0x96, 0x2B, 0xFC, 0x34, 0xF7, 0x22, 0xDE, 0x1F, + 0xFC, 0x1E, 0x57, 0x10, 0x71, 0x1F, 0x1F, 0x0F, 0xD2, 0x15, 0x7C, 0x05, + 0x90, 0x15, 0x8C, 0x01, 0xDE, 0x24, 0x5C, 0x0C, 0xC0, 0x33, 0x14, 0x1A, + 0x5A, 0x3E, 0x28, 0x21, 0x27, 0x46, 0x3A, 0x1E, 0x57, 0x41, 0xA8, 0x17, + 0xD1, 0x2E, 0x2B, 0x19, 0x5C, 0x22, 0x37, 0x28, 0x78, 0x23, 0xF1, 0x3A, + 0x99, 0x29, 0xA1, 0x46, 0xFC, 0x34, 0xF5, 0x4E, 0xAF, 0x37, 0xA7, 0x50, + 0xE9, 0x2C, 0x9B, 0x4B, 0xBA, 0x29, 0x4E, 0x42, 0xF3, 0x27, 0x32, 0x30, + 0x56, 0x20, 0x88, 0x27, 0xE9, 0x1C, 0x61, 0x29, 0xAD, 0x21, 0x44, 0x2B, + 0xB2, 0x28, 0x82, 0x31, 0xA5, 0x23, 0x0F, 0x29, 0x29, 0x17, 0xE7, 0x14, + 0x0A, 0x08, 0x20, 0x0A, 0xCA, 0xFD, 0x90, 0x0D, 0xC0, 0xFA, 0x02, 0x14, + 0x24, 0xFE, 0xA6, 0x15, 0xBF, 0x0B, 0xE2, 0x12, 0x73, 0x15, 0x64, 0x07, + 0x82, 0x1E, 0x6D, 0x05, 0xC9, 0x14, 0x67, 0xFD, 0x80, 0x06, 0x06, 0xF6, + 0xFD, 0x0A, 0xC1, 0xFF, 0x08, 0x17, 0xA5, 0x0C, 0xAC, 0x23, 0x0E, 0x14, + 0x9D, 0x29, 0x7E, 0x13, 0x11, 0x1C, 0x37, 0x09, 0x5D, 0x09, 0x77, 0x04, + 0x5D, 0x03, 0xAA, 0x0C, 0x08, 0xFB, 0xBC, 0x06, 0x8C, 0xEE, 0xAA, 0xEB, + 0xA2, 0xF7, 0x89, 0xE3, 0xE4, 0x04, 0x5E, 0xF0, 0x8A, 0xF2, 0x8C, 0xE7, + 0x8C, 0xDF, 0x5E, 0xD6, 0x2C, 0xE0, 0x78, 0xD8, 0x29, 0xD8, 0xA9, 0xE1, + 0xE9, 0xCE, 0x6C, 0xEE, 0xBB, 0xD8, 0xDD, 0xFE, 0x02, 0xD5, 0x8B, 0xF6, + 0x9C, 0xC4, 0x6A, 0xDF, 0xF7, 0xC8, 0xF5, 0xD4, 0x9A, 0xCB, 0x72, 0xC7, + 0x53, 0xBB, 0x1A, 0xB8, 0x68, 0xAD, 0xDB, 0xB5, 0x12, 0xBB, 0xF1, 0xC7, + 0x6A, 0xD9, 0x83, 0xE1, 0xFC, 0xE3, 0xE5, 0xE5, 0x1B, 0xD9, 0x8D, 0xDF, + 0xFC, 0xC7, 0x42, 0xDC, 0xFA, 0xB9, 0xDC, 0xCD, 0x65, 0xBD, 0x03, 0xC1, + 0xFA, 0xCB, 0xA8, 0xC6, 0x05, 0xE0, 0xB9, 0xD6, 0xEB, 0xFA, 0x32, 0xE4, + 0x4A, 0x10, 0x10, 0xEB, 0x55, 0x18, 0x87, 0xEC, 0xE1, 0x08, 0x30, 0xDD, + 0x6E, 0xED, 0x92, 0xCD, 0xB2, 0xDB, 0x11, 0xD3, 0xC4, 0xD4, 0x3B, 0xDE, + 0x6B, 0xE0, 0x6F, 0xEC, 0x66, 0xF5, 0xB1, 0xF9, 0x7C, 0xFF, 0x60, 0xF7, + 0xC0, 0xFC, 0xB8, 0xEB, 0x7E, 0xEA, 0x9D, 0xDD, 0x3C, 0xE2, 0x87, 0xDB, + 0xF6, 0xE0, 0x6D, 0xD5, 0x3C, 0xE1, 0x3C, 0xD4, 0xF9, 0xE6, 0x56, 0xE4, + 0xA9, 0xEE, 0x4B, 0xF2, 0x18, 0xF5, 0x01, 0xF4, 0x70, 0xF1, 0x9B, 0xEA, + 0xFB, 0xEA, 0x59, 0xE6, 0x09, 0xE4, 0xA9, 0xE1, 0x79, 0xEB, 0xC4, 0xD9, + 0x96, 0xFD, 0x17, 0xD6, 0x33, 0x02, 0x49, 0xDC, 0x2E, 0xF2, 0xD6, 0xE3, + 0x1D, 0xE5, 0xFE, 0xF0, 0xB6, 0xD4, 0x41, 0xF6, 0x93, 0xBA, 0xDD, 0xE5, + 0xFC, 0xB5, 0x43, 0xDB, 0xF6, 0xCF, 0xC3, 0xEC, 0x2D, 0xE2, 0x5A, 0xF9, + 0x3F, 0xE1, 0x84, 0xE8, 0x19, 0xEB, 0xE8, 0xDE, 0xB7, 0xEC, 0x26, 0xE3, + 0x8D, 0xD9, 0x99, 0xE4, 0x13, 0xD7, 0x22, 0xF1, 0xF7, 0xE1, 0x95, 0xFF, + 0x3C, 0xE1, 0xD9, 0xF5, 0x88, 0xE8, 0xEB, 0xEA, 0xF9, 0xF1, 0xC5, 0xEC, + 0xE0, 0xE6, 0x60, 0xE5, 0x42, 0xD9, 0xCD, 0xD3, 0xFA, 0xDD, 0x14, 0xD3, + 0x67, 0xF6, 0x16, 0xEF, 0x00, 0x04, 0x55, 0x01, 0xA8, 0x00, 0xC0, 0x01, + 0x6E, 0x08, 0x38, 0x06, 0x4A, 0x13, 0xEF, 0x03, 0x4F, 0x13, 0x69, 0x03, + 0xD5, 0x0E, 0x52, 0x0E, 0x82, 0x07, 0x69, 0x14, 0xB4, 0x05, 0x9D, 0x1A, + 0xD9, 0x16, 0x38, 0x29, 0xF1, 0x2C, 0x13, 0x37, 0x40, 0x2D, 0xE5, 0x35, + 0xFB, 0x1A, 0x3C, 0x1D, 0x57, 0x14, 0x72, 0x15, 0x05, 0x0E, 0x02, 0x2B, + 0xEC, 0xFE, 0x51, 0x33, 0x05, 0x07, 0x58, 0x2D, 0x38, 0x1B, 0x06, 0x25, + 0xB2, 0x2A, 0x7B, 0x20, 0x6A, 0x36, 0xED, 0x22, 0x86, 0x37, 0xC5, 0x23, + 0xD3, 0x26, 0xE6, 0x18, 0xE8, 0x0F, 0xD9, 0x0D, 0x44, 0x18, 0xAA, 0x1D, + 0xFC, 0x2F, 0xD1, 0x2E, 0xB5, 0x38, 0x5A, 0x34, 0xC1, 0x2D, 0x4D, 0x32, + 0x97, 0x30, 0x1B, 0x35, 0xBE, 0x42, 0x33, 0x37, 0x47, 0x46, 0x56, 0x2E, + 0xBC, 0x37, 0x22, 0x26, 0xFA, 0x2B, 0x0F, 0x29, 0x25, 0x28, 0x25, 0x28, + 0x88, 0x28, 0x66, 0x24, 0xFC, 0x31, 0x52, 0x2F, 0x1E, 0x27, 0x9E, 0x1F, + 0x63, 0x15, 0x6D, 0xFF, 0xD1, 0x1C, 0xA5, 0x02, 0xD6, 0x23, 0x68, 0x14, + 0x59, 0x0D, 0x6B, 0x0D, 0x42, 0xFB, 0xFA, 0x07, 0x14, 0x04, 0xCF, 0x12, + 0x94, 0x09, 0xDB, 0x0D, 0x13, 0x0E, 0xA8, 0x02, 0x06, 0x19, 0x14, 0x04, + 0x93, 0x0F, 0x45, 0xFD, 0xD4, 0xFC, 0x41, 0xEF, 0x35, 0x03, 0xFB, 0xF4, + 0x32, 0x0B, 0xB5, 0xFA, 0x8C, 0x02, 0x55, 0xEB, 0xBC, 0xFA, 0x3F, 0xDF, + 0x86, 0xF8, 0xCB, 0xEC, 0x04, 0xF0, 0x43, 0xFB, 0x3A, 0xE5, 0x7A, 0xF6, + 0xF5, 0xE7, 0x1E, 0xF4, 0xE6, 0xEE, 0x4D, 0xF3, 0xCE, 0xF5, 0xC1, 0xED, + 0x3D, 0x06, 0x69, 0xFD, 0x6E, 0x0B, 0xBC, 0x16, 0x60, 0xFB, 0x44, 0x19, + 0xC6, 0xF5, 0xA8, 0x1A, 0xD0, 0xFA, 0x10, 0x22, 0xB9, 0xFB, 0x6C, 0x1A, + 0x85, 0xFA, 0x68, 0x0D, 0xCE, 0xF8, 0x07, 0x0B, 0x46, 0x05, 0xDD, 0x0F, + 0xCE, 0x13, 0x33, 0x0D, 0xEC, 0x14, 0xC4, 0x0F, 0x7F, 0x12, 0xD1, 0x17, + 0x18, 0x08, 0x39, 0x0A, 0x61, 0xFD, 0xCB, 0xFA, 0x5A, 0xFE, 0xAA, 0xF9, + 0xBE, 0x07, 0x3E, 0xFC, 0x2F, 0x06, 0x64, 0xF7, 0x0B, 0x02, 0x19, 0xF5, + 0x5F, 0x01, 0xDE, 0xF8, 0x12, 0xFF, 0x5A, 0x02, 0x73, 0xF9, 0x61, 0x05, + 0xEA, 0xFC, 0xA9, 0xFC, 0x60, 0x16, 0x4D, 0xF9, 0x8F, 0x24, 0x38, 0xF3, + 0xD6, 0x20, 0xB2, 0xF6, 0x44, 0x11, 0xA5, 0xFF, 0xED, 0xFA, 0xD0, 0xFC, + 0x18, 0xE8, 0x4A, 0xF3, 0xE6, 0xEF, 0x69, 0xFF, 0x9D, 0xFD, 0x11, 0x13, + 0x2C, 0xEC, 0x39, 0x08, 0xCD, 0xDC, 0x25, 0xF4, 0x75, 0xE6, 0xF5, 0xEF, + 0xCE, 0xF0, 0x4B, 0xEC, 0x27, 0xE5, 0x0A, 0xD7, 0x54, 0xD5, 0x45, 0xD3, + 0xEC, 0xCE, 0x81, 0xEA, 0x08, 0xD9, 0xBE, 0xFB, 0x5A, 0xF9, 0xCD, 0x06, + 0x21, 0x0E, 0xC2, 0x0B, 0xC6, 0xFB, 0xB9, 0xF7, 0x93, 0xDF, 0x55, 0xDA, + 0xDF, 0xD6, 0x03, 0xD0, 0xBE, 0xCB, 0x43, 0xC5, 0xF8, 0xBD, 0x35, 0xB8, + 0xDA, 0xC7, 0x23, 0xC4, 0x19, 0xE6, 0xF7, 0xE3, 0xF3, 0xF9, 0xB2, 0xF0, + 0xED, 0xF9, 0x39, 0xE7, 0xD8, 0xF2, 0x75, 0xE7, 0x12, 0xEE, 0xC5, 0xEC, + 0xC6, 0xEC, 0x97, 0xE5, 0x08, 0xF3, 0x65, 0xE7, 0x1F, 0xFE, 0x17, 0xF3, + 0x76, 0x03, 0xFF, 0xF4, 0x02, 0x02, 0x0D, 0xFA, 0x2D, 0x04, 0x16, 0x08, + 0xAD, 0x06, 0xBA, 0x0B, 0x8C, 0x00, 0x50, 0x05, 0xE7, 0x02, 0x1D, 0x07, + 0xEC, 0x09, 0x6E, 0x09, 0xC9, 0xF8, 0xBB, 0xFA, 0xF5, 0xE7, 0xAD, 0xEC, + 0xAA, 0xE2, 0xC7, 0xE9, 0x89, 0xD4, 0x9A, 0xF0, 0x44, 0xD2, 0x42, 0x00, + 0x9C, 0xE6, 0x23, 0x09, 0x09, 0xFD, 0xF0, 0x05, 0x8E, 0x08, 0x3C, 0xFF, + 0x7A, 0x08, 0x6A, 0x00, 0x07, 0xF9, 0x9C, 0x00, 0x82, 0xEE, 0x65, 0xFF, + 0x36, 0xE3, 0xAB, 0xF1, 0x07, 0xED, 0xE1, 0xEF, 0xAB, 0x09, 0xC5, 0xFB, + 0x75, 0x16, 0xC2, 0x03, 0x6C, 0x16, 0x32, 0x0C, 0x67, 0x11, 0x0E, 0x0F, + 0x96, 0x06, 0x97, 0x0E, 0xA6, 0x02, 0xE1, 0x13, 0x7A, 0x0E, 0x6C, 0x1C, + 0x47, 0x04, 0xE0, 0x0A, 0x19, 0xF6, 0x80, 0xEF, 0xF7, 0x03, 0x8C, 0xEA, + 0x20, 0x17, 0x45, 0xF5, 0xBD, 0x0F, 0xD0, 0xEF, 0x42, 0xFA, 0x99, 0xE3, + 0x11, 0xF7, 0x1D, 0xF5, 0x5F, 0xFC, 0xA5, 0x0D, 0xA6, 0x05, 0xE5, 0x1A, + 0x5A, 0x0C, 0x73, 0x1D, 0x58, 0x01, 0x0C, 0x0F, 0x54, 0xEF, 0x65, 0xF7, + 0xFB, 0xF2, 0x71, 0xEF, 0x4B, 0xFA, 0xF5, 0xEE, 0x93, 0xE8, 0xDE, 0xE3, + 0x44, 0xDB, 0x7F, 0xDE, 0x5A, 0xF0, 0x37, 0xEF, 0x1F, 0x0E, 0xFC, 0x05, + 0x25, 0x16, 0x6D, 0x00, 0xF3, 0x10, 0x2D, 0xEA, 0xA1, 0x07, 0x7E, 0xE3, + 0x79, 0xFB, 0x1B, 0xE8, 0xFF, 0xF9, 0x6E, 0xF4, 0x99, 0x05, 0x28, 0x0B, + 0xE2, 0x0B, 0x02, 0x13, 0x29, 0x10, 0xE8, 0x0C, 0xEA, 0x17, 0x7C, 0x10, + 0x8F, 0x1D, 0x1D, 0x15, 0x69, 0x19, 0x25, 0x08, 0x41, 0x0E, 0xA6, 0xFF, + 0xEF, 0x0D, 0x06, 0x0E, 0x91, 0x1F, 0x65, 0x1F, 0xF0, 0x27, 0x4F, 0x22, + 0xF3, 0x19, 0xE3, 0x1D, 0xBA, 0x05, 0xEF, 0x16, 0xA6, 0xFE, 0x0A, 0x12, + 0xF9, 0x03, 0x57, 0x11, 0x5D, 0x12, 0xB0, 0x12, 0xC0, 0x1C, 0xB7, 0x10, + 0x3B, 0x1F, 0x41, 0x1A, 0x74, 0x1F, 0x40, 0x30, 0x78, 0x1C, 0x69, 0x41, + 0xB9, 0x0A, 0x78, 0x37, 0xF6, 0xFA, 0x46, 0x1D, 0xFE, 0x0D, 0x8F, 0x1E, + 0x15, 0x26, 0xDD, 0x2B, 0x2B, 0x30, 0x7C, 0x2D, 0x98, 0x32, 0x4B, 0x23, + 0x33, 0x2F, 0xE6, 0x14, 0x3C, 0x1B, 0xFA, 0x03, 0xB6, 0x0B, 0x09, 0x09, + 0x8C, 0x00, 0x20, 0x14, 0x2F, 0xEE, 0x7D, 0x04, 0x89, 0xED, 0x16, 0xFD, + 0x51, 0x04, 0xCA, 0x14, 0x2D, 0x11, 0x89, 0x22, 0x61, 0xF8, 0x0E, 0x0C, + 0x9D, 0xE7, 0xBC, 0x01, 0xE5, 0xF0, 0xE1, 0x0D, 0x6A, 0xFB, 0x94, 0x15, + 0xDF, 0x09, 0x37, 0x17, 0x59, 0x1F, 0x42, 0x10, 0x20, 0x23, 0x27, 0xF9, + 0xF6, 0x19, 0xCD, 0xEA, 0xC4, 0x1A, 0xE5, 0xF2, 0x36, 0x19, 0xAA, 0xF3, + 0xD2, 0x0D, 0x48, 0xE8, 0x42, 0x0A, 0x66, 0xEB, 0x74, 0x1C, 0x16, 0x0A, + 0x99, 0x2D, 0xA0, 0x1E, 0x66, 0x27, 0x72, 0x12, 0x95, 0x19, 0xEF, 0x08, + 0x92, 0x1A, 0x28, 0x14, 0x19, 0x1E, 0x13, 0x1D, 0x09, 0x22, 0xDD, 0x25, + 0x53, 0x26, 0x9F, 0x2E, 0xB7, 0x24, 0x47, 0x2A, 0x36, 0x1E, 0x63, 0x24, + 0xB8, 0x17, 0x6F, 0x2C, 0x39, 0x11, 0x82, 0x32, 0x2D, 0x04, 0x80, 0x24, + 0xDD, 0xFD, 0x46, 0x19, 0xBC, 0x05, 0x1D, 0x1E, 0x70, 0x08, 0xD5, 0x1F, + 0x1B, 0xFB, 0x30, 0x15, 0x4F, 0xED, 0x61, 0x0C, 0x0E, 0xEB, 0x58, 0x07, + 0x66, 0xEE, 0xA9, 0xFA, 0x4F, 0xF6, 0x41, 0xF0, 0x80, 0x01, 0x06, 0xF1, + 0xD5, 0x07, 0x64, 0xF9, 0x03, 0x0A, 0x73, 0xFE, 0xB6, 0x13, 0xDE, 0x01, + 0x18, 0x20, 0x7C, 0x05, 0x9D, 0x14, 0xEE, 0xF4, 0xDA, 0x09, 0x12, 0xEC, + 0xD7, 0x0F, 0x96, 0xFD, 0x84, 0x0D, 0x9B, 0x0B, 0x12, 0xFE, 0x25, 0x08, + 0x9E, 0xFA, 0xFE, 0x0A, 0xD1, 0xF7, 0x09, 0x0B, 0xCE, 0xF2, 0x16, 0x00, + 0x79, 0xFF, 0xE2, 0xFB, 0x85, 0xFD, 0xB7, 0xE7, 0x14, 0xE7, 0xA0, 0xCE, + 0xC6, 0xDF, 0x1E, 0xDA, 0x5B, 0xEA, 0x2B, 0xF4, 0x5E, 0xE2, 0xA0, 0xEB, + 0xE1, 0xCF, 0xBF, 0xD5, 0x79, 0xCF, 0x7C, 0xD8, 0x38, 0xD6, 0x29, 0xE4, + 0x67, 0xD9, 0x6C, 0xE8, 0xC6, 0xD6, 0xDF, 0xE7, 0x8C, 0xCD, 0x43, 0xDB, + 0x40, 0xC6, 0x61, 0xBE, 0xDF, 0xCE, 0x7D, 0xB0, 0xE4, 0xD0, 0x53, 0xB8, + 0x6F, 0xB5, 0xE8, 0xB7, 0xC1, 0x9B, 0x4B, 0xB6, 0xF4, 0xA8, 0xB9, 0xD0, + 0x3D, 0xC6, 0xA4, 0xE8, 0xD7, 0xC7, 0x5F, 0xD5, 0xAE, 0xBA, 0x6B, 0xBB, + 0x9B, 0xC2, 0x2E, 0xBA, 0x62, 0xD1, 0x2C, 0xB9, 0x84, 0xDA, 0x6E, 0xB6, + 0x41, 0xE8, 0xB0, 0xC0, 0xC1, 0xE9, 0x5A, 0xC6, 0x06, 0xDD, 0x89, 0xC7, + 0x28, 0xDD, 0x50, 0xDD, 0x56, 0xE6, 0x20, 0xF5, 0x10, 0xE5, 0x82, 0xEE, + 0x8B, 0xE7, 0x1A, 0xE0, 0x25, 0xF8, 0x6F, 0xE8, 0x34, 0xFC, 0x23, 0xED, + 0x87, 0xEB, 0x4C, 0xDD, 0xEE, 0xDB, 0x2C, 0xD5, 0x77, 0xDD, 0x0B, 0xDE, + 0x6B, 0xEA, 0x4F, 0xE3, 0xB7, 0xF3, 0x25, 0xE2, 0x30, 0xFC, 0xC1, 0xE5, + 0x7A, 0xF7, 0x05, 0xE5, 0x2B, 0xEB, 0xBA, 0xE5, 0x53, 0xE8, 0x8B, 0xE7, + 0x2F, 0xF0, 0xB7, 0xEE, 0xCE, 0xE2, 0x48, 0xEA, 0x9C, 0xD6, 0x7E, 0xE7, + 0x58, 0xEB, 0xC9, 0xFB, 0x4F, 0xFF, 0xF9, 0x0A, 0x33, 0x03, 0xBE, 0x02, + 0xFE, 0xFE, 0x8C, 0xF2, 0xC2, 0xF2, 0xF2, 0xEE, 0xA9, 0xE6, 0x11, 0xF5, + 0x7F, 0xF3, 0x8A, 0x0A, 0x6D, 0xF2, 0xB6, 0x07, 0x1A, 0xE0, 0x4A, 0xE9, + 0x43, 0xE2, 0x2C, 0xE3, 0xBE, 0xEF, 0xEF, 0xF5, 0xE5, 0xF0, 0xEE, 0xFB, + 0xA1, 0xEA, 0x0A, 0xF5, 0x75, 0xEF, 0xDF, 0xFE, 0xEE, 0xFC, 0x81, 0x12, + 0x7B, 0x0D, 0x9A, 0x1B, 0x0E, 0x0F, 0xE5, 0x16, 0x3A, 0xFE, 0xB3, 0x0A, + 0x68, 0xE6, 0x4B, 0xF2, 0x80, 0xDB, 0xBB, 0xE7, 0xB4, 0xE9, 0x70, 0xFF, + 0x30, 0x02, 0x72, 0x0F, 0x5E, 0x13, 0x14, 0x01, 0xDC, 0x20, 0x25, 0xFE, + 0x7E, 0x23, 0x62, 0x0A, 0x95, 0x0F, 0x07, 0x01, 0xA3, 0xFE, 0x90, 0xF4, + 0x08, 0x08, 0x80, 0x04, 0x3A, 0x18, 0x99, 0x23, 0xE0, 0x22, 0x81, 0x3B, + 0x82, 0x34, 0x73, 0x48, 0xF2, 0x32, 0x2B, 0x41, 0xC7, 0x1B, 0x0C, 0x2C, + 0x82, 0x15, 0x9B, 0x1E, 0xC1, 0x23, 0x34, 0x1D, 0xA6, 0x30, 0x52, 0x1C, + 0x93, 0x36, 0x91, 0x1A, 0xD4, 0x3A, 0x3D, 0x25, 0x5A, 0x3B, 0xDD, 0x31, + 0x82, 0x33, 0x0A, 0x2A, 0xBA, 0x1E, 0xF8, 0x13, 0x61, 0x0B, 0xC7, 0x09, + 0x5C, 0x0D, 0x5D, 0x14, 0x66, 0x1B, 0x37, 0x23, 0x15, 0x30, 0x90, 0x31, + 0xA4, 0x39, 0x70, 0x34, 0x2A, 0x35, 0x6D, 0x31, 0xDF, 0x33, 0xA3, 0x31, + 0x19, 0x39, 0xA6, 0x32, 0xE3, 0x2E, 0xE7, 0x26, 0x1F, 0x18, 0xBF, 0x1D, + 0x48, 0x19, 0x46, 0x36, 0x78, 0x2B, 0x29, 0x49, 0xA2, 0x3C, 0xD9, 0x3E, + 0x4E, 0x3B, 0x3F, 0x29, 0x4F, 0x28, 0x5A, 0x15, 0x33, 0x1B, 0xE3, 0x0B, + 0x93, 0x29, 0x55, 0x23, 0xD7, 0x30, 0xA8, 0x33, 0x33, 0x1B, 0x87, 0x1B, + 0x34, 0x15, 0xBA, 0x13, 0x89, 0x20, 0x6A, 0x23, 0x07, 0x17, 0x6A, 0x1A, + 0x6A, 0xFC, 0x86, 0xF9, 0x05, 0xF7, 0x41, 0xEE, 0x8C, 0x03, 0xFB, 0x00, + 0x17, 0x0E, 0x9D, 0x17, 0x41, 0x14, 0xB4, 0x1B, 0x48, 0x14, 0x7A, 0x0E, + 0x37, 0x03, 0xEE, 0xF7, 0x86, 0xEF, 0xAC, 0xE7, 0x67, 0xEE, 0xA1, 0xEE, + 0x08, 0xEA, 0x45, 0xF7, 0x74, 0xDB, 0x52, 0xEC, 0x0A, 0xED, 0xC1, 0xEC, + 0xD1, 0x17, 0x78, 0x03, 0x21, 0x18, 0xBA, 0x01, 0xCC, 0xF2, 0xD9, 0xE7, + 0x45, 0xE0, 0xC0, 0xE1, 0x05, 0xE6, 0xF7, 0xF3, 0x45, 0xEF, 0x0E, 0x03, + 0x31, 0x00, 0xCC, 0x0D, 0xA8, 0x0C, 0xBB, 0x13, 0xAF, 0x04, 0xF2, 0x07, + 0x27, 0xFD, 0x0E, 0x02, 0x58, 0xFD, 0x68, 0x0A, 0x29, 0xFD, 0x7F, 0x09, + 0xA2, 0xFA, 0x46, 0xFB, 0x31, 0x06, 0xC4, 0x00, 0xAB, 0x13, 0x81, 0x14, + 0xCC, 0x0A, 0xDF, 0x12, 0x67, 0xF7, 0x50, 0xFE, 0x3D, 0xEF, 0x0A, 0xEE, + 0x93, 0xF1, 0xF5, 0xEA, 0x72, 0xED, 0x41, 0xE8, 0x2E, 0xED, 0x3E, 0xED, + 0xC6, 0xEA, 0xAF, 0xF2, 0x3D, 0xEC, 0xC0, 0xED, 0x57, 0xFC, 0xCC, 0xE6, + 0x03, 0x0D, 0x36, 0xED, 0xF1, 0x0E, 0xB4, 0xEC, 0xBF, 0x0F, 0x62, 0xDF, + 0xD7, 0x21, 0xD6, 0xEA, 0xF3, 0x2A, 0xDF, 0x00, 0x2B, 0x19, 0x9D, 0x05, + 0x72, 0xFF, 0x56, 0x00, 0x2D, 0xF3, 0xA5, 0xFC, 0x13, 0xF0, 0x0E, 0xF8, + 0x34, 0xFD, 0xDD, 0x05, 0xA3, 0x00, 0x5B, 0x0D, 0x5A, 0xE4, 0x8F, 0xEF, + 0xD9, 0xD5, 0x68, 0xDD, 0xC8, 0xE7, 0x0C, 0xED, 0xA2, 0xE8, 0x9E, 0xF2, + 0x1C, 0xD4, 0x1F, 0xE8, 0xC8, 0xD5, 0x1E, 0xED, 0x55, 0xDD, 0xF7, 0xFA, + 0xFD, 0xDA, 0x35, 0x05, 0xAC, 0xD9, 0xA6, 0x03, 0x0D, 0xDB, 0x18, 0xF3, + 0x6C, 0xD4, 0x02, 0xD9, 0x24, 0xD2, 0x1C, 0xD1, 0x3C, 0xE0, 0xC0, 0xE5, + 0x8A, 0xEB, 0x26, 0xF4, 0x8C, 0xE7, 0x62, 0xE3, 0x94, 0xEA, 0x75, 0xD3, + 0x73, 0xFA, 0xE1, 0xE5, 0x6D, 0xF4, 0x74, 0xF5, 0x97, 0xE0, 0xD4, 0xED, + 0xB2, 0xEA, 0x88, 0xF0, 0xCA, 0x10, 0xB5, 0x03, 0x90, 0x23, 0xE0, 0x08, + 0x1B, 0x1E, 0x0D, 0x04, 0x30, 0x17, 0xFB, 0x04, 0xC9, 0x05, 0x3C, 0xF9, + 0x65, 0xF0, 0xDE, 0xED, 0x2A, 0xF4, 0xB9, 0xFE, 0x5A, 0x05, 0x03, 0x10, + 0x5E, 0x00, 0xBE, 0x0A, 0xB7, 0xFA, 0x0D, 0x13, 0xDC, 0x01, 0xE4, 0x2B, + 0x54, 0xF8, 0xB0, 0x27, 0xE0, 0xE9, 0x36, 0x05, 0xD5, 0xEE, 0x8B, 0xEC, + 0x8C, 0xF5, 0x39, 0xEB, 0xC5, 0xF0, 0xA9, 0xF1, 0x52, 0xF3, 0xB0, 0xFE, + 0xBD, 0xF8, 0xAC, 0x06, 0xC3, 0xF8, 0x32, 0x04, 0x23, 0xFD, 0xE7, 0x05, + 0xCD, 0x0B, 0x89, 0x0E, 0x59, 0x13, 0x04, 0x05, 0x29, 0x13, 0x79, 0xEE, + 0xBD, 0x1C, 0x5E, 0xF1, 0xD1, 0x1E, 0x04, 0x08, 0xD1, 0x0D, 0x8D, 0x19, + 0xAC, 0x02, 0x00, 0x1B, 0x1D, 0x0B, 0x0E, 0x10, 0xD4, 0x11, 0x0E, 0x09, + 0xCD, 0x23, 0x66, 0x19, 0x41, 0x30, 0xAB, 0x1C, 0x39, 0x1A, 0xF4, 0xFD, + 0x6C, 0x10, 0x43, 0xF3, 0x20, 0x21, 0x23, 0x0A, 0xC0, 0x11, 0xA4, 0x0C, + 0xB8, 0xE9, 0x79, 0xF8, 0x43, 0xEC, 0xFA, 0xFF, 0x10, 0x07, 0x4C, 0x15, + 0x0F, 0x14, 0x4B, 0x21, 0x96, 0x1A, 0x81, 0x2B, 0x96, 0x19, 0xFC, 0x25, + 0x59, 0x04, 0xB8, 0x02, 0x65, 0xF4, 0x1A, 0xE6, 0x24, 0x01, 0x54, 0xEB, + 0x2B, 0x05, 0x6C, 0xE8, 0xFC, 0xF2, 0x6C, 0xD6, 0x6D, 0xF5, 0xCA, 0xE3, + 0x91, 0x10, 0x6B, 0x07, 0xA2, 0x0D, 0xAD, 0x07, 0xA9, 0xF1, 0x5E, 0xEF, + 0x48, 0xEC, 0x8A, 0xF1, 0x1C, 0xF7, 0xE3, 0x00, 0xA6, 0xFA, 0xB5, 0xFE, + 0xD7, 0x00, 0x0B, 0xFC, 0x2A, 0x0B, 0x6E, 0x01, 0x33, 0x05, 0x56, 0xFE, + 0x68, 0xFD, 0x99, 0xFE, 0x77, 0x0A, 0x64, 0x0D, 0x6D, 0x13, 0x74, 0x10, + 0xD3, 0x0A, 0xC2, 0x01, 0x87, 0x0B, 0x5F, 0x03, 0xA3, 0x10, 0x93, 0x15, + 0x6F, 0x06, 0x1C, 0x14, 0x7A, 0xFC, 0x6E, 0x01, 0xF5, 0xFE, 0xA9, 0xFB, + 0x6A, 0x03, 0x9A, 0x01, 0xCA, 0x01, 0x5F, 0xFF, 0x6D, 0xFE, 0x89, 0xFD, + 0xD6, 0xF5, 0x04, 0x02, 0x34, 0xEC, 0xBC, 0x07, 0x27, 0xE9, 0xD7, 0x0F, + 0x81, 0xF6, 0x1B, 0x18, 0xB6, 0x04, 0xFB, 0x10, 0xC9, 0x07, 0xBC, 0x06, + 0x8B, 0x11, 0x23, 0x0C, 0x50, 0x15, 0x6C, 0x0F, 0xC7, 0x05, 0x77, 0x09, + 0x4D, 0xF4, 0xBC, 0x00, 0x0D, 0xF0, 0x30, 0xFA, 0xD2, 0xF7, 0xB7, 0xFA, + 0x1A, 0x0D, 0xE3, 0x08, 0xFF, 0x08, 0xF1, 0x01, 0x4C, 0xE6, 0xC2, 0xDF, + 0x83, 0xE0, 0xA8, 0xDC, 0x74, 0xEC, 0xF0, 0xF5, 0xFD, 0xDA, 0x0D, 0xF7, + 0xDF, 0xC9, 0xC6, 0xEB, 0xEA, 0xDB, 0x23, 0xFA, 0xD7, 0xEC, 0x95, 0x01, + 0x56, 0xF6, 0x62, 0xF5, 0xFF, 0x01, 0x2E, 0xEC, 0x18, 0xFD, 0xF4, 0xD8, + 0xB2, 0xE8, 0xA1, 0xBC, 0x6E, 0xE5, 0xBB, 0xC4, 0x57, 0xF6, 0x8E, 0xEA, + 0x27, 0xF5, 0x9C, 0xF0, 0x3D, 0xE6, 0xC4, 0xDC, 0x9B, 0xEA, 0x09, 0xDB, + 0x92, 0xF8, 0x38, 0xE4, 0x5F, 0xF0, 0xFF, 0xDD, 0x32, 0xE1, 0x62, 0xD7, + 0x41, 0xEC, 0x2B, 0xE5, 0xBC, 0x05, 0x8C, 0xF8, 0x95, 0x13, 0x73, 0x05, + 0x98, 0x16, 0xD9, 0x15, 0x0A, 0x0A, 0x4D, 0x1B, 0x21, 0xEB, 0x0C, 0x07, + 0xD9, 0xDC, 0x0C, 0xF8, 0x51, 0xF2, 0x93, 0xFD, 0x59, 0x07, 0xE7, 0xF9, + 0xBF, 0x02, 0xFE, 0xEC, 0xBD, 0xF7, 0x32, 0xF2, 0x37, 0xED, 0xE5, 0xFD, + 0xC0, 0xE4, 0xF3, 0xFB, 0x92, 0xE0, 0x79, 0xF1, 0x34, 0xDB, 0x0B, 0xEE, + 0xFD, 0xD3, 0xC5, 0xED, 0x3A, 0xD0, 0xB2, 0xEA, 0xEF, 0xD5, 0xF5, 0xE9, + 0x51, 0xDC, 0x11, 0xE3, 0xB0, 0xE1, 0x6A, 0xDD, 0x0C, 0xE5, 0x6C, 0xDB, + 0x14, 0xF0, 0x36, 0xDA, 0x10, 0xF6, 0xC4, 0xD5, 0x64, 0xF6, 0x2F, 0xDC, + 0x0B, 0xFE, 0x14, 0xEF, 0xC0, 0x04, 0x16, 0xFB, 0x07, 0x06, 0x60, 0xFB, + 0x1E, 0x00, 0x97, 0xF2, 0x18, 0xF3, 0xE3, 0xED, 0x81, 0xEF, 0x57, 0xFE, + 0x2F, 0x05, 0x62, 0x1B, 0xBE, 0x0E, 0x45, 0x1A, 0x96, 0x08, 0xF3, 0x02, + 0xB6, 0x16, 0xF0, 0x02, 0xBF, 0x1B, 0x6B, 0x0C, 0xB2, 0xFC, 0x6A, 0xF6, + 0xED, 0xE1, 0x5D, 0xDC, 0x6F, 0xE7, 0x34, 0xE5, 0xCF, 0xF8, 0xC2, 0xF7, + 0x92, 0x07, 0x4F, 0x03, 0xA3, 0x12, 0xA4, 0x0A, 0xA3, 0x0E, 0x69, 0x01, + 0x56, 0xF5, 0xC9, 0xEF, 0x04, 0xDE, 0x55, 0xF3, 0xDA, 0xDA, 0x61, 0x02, + 0x77, 0xD8, 0x04, 0xFD, 0x4F, 0xCF, 0x4E, 0xEE, 0x33, 0xD4, 0x11, 0xF4, + 0xE7, 0xE9, 0x5C, 0x0A, 0xB6, 0xF3, 0xB7, 0x0B, 0xA9, 0xEE, 0x9F, 0xF8, + 0x8B, 0xF5, 0xB9, 0xF6, 0xB2, 0x0B, 0x15, 0x03, 0xBE, 0x19, 0x05, 0x00, + 0xBF, 0x1C, 0xDC, 0xFA, 0xE9, 0x1E, 0x0B, 0x07, 0x2B, 0x18, 0x3C, 0x0E, + 0x2A, 0x11, 0x50, 0x10, 0x40, 0x1E, 0x81, 0x1F, 0xA5, 0x2C, 0x69, 0x2A, + 0x10, 0x27, 0xD5, 0x25, 0xC0, 0x1E, 0xBC, 0x27, 0xC2, 0x21, 0x07, 0x30, + 0xA8, 0x23, 0xFA, 0x20, 0xA4, 0x18, 0xC8, 0xFE, 0xEC, 0x0F, 0x45, 0xF4, + 0xDE, 0x0E, 0x01, 0xFF, 0x44, 0x13, 0x79, 0x04, 0x71, 0x17, 0x72, 0x00, + 0x4A, 0x1A, 0xD5, 0x04, 0x6E, 0x18, 0x64, 0x0F, 0x7C, 0x12, 0x7D, 0x16, + 0xAC, 0x0E, 0xED, 0x16, 0x94, 0x0B, 0x8B, 0x0D, 0x18, 0x10, 0xE0, 0x0C, + 0x0B, 0x17, 0x3E, 0x0F, 0x75, 0x21, 0x91, 0x0D, 0x95, 0x2D, 0xA0, 0x03, + 0xBA, 0x2A, 0x42, 0xFC, 0x80, 0x18, 0xE6, 0x06, 0x24, 0x16, 0xD7, 0x20, + 0x16, 0x1C, 0x27, 0x2F, 0xE8, 0x09, 0x7D, 0x18, 0x48, 0xFA, 0xBE, 0xFE, + 0x33, 0x07, 0xAF, 0x01, 0xA2, 0x0D, 0x3C, 0x04, 0xEE, 0xF6, 0xB2, 0xF0, + 0xB7, 0xE7, 0x36, 0xEE, 0xA8, 0xF2, 0x23, 0x0F, 0x68, 0xFD, 0xB3, 0x2A, + 0xA1, 0xFD, 0xC8, 0x2C, 0xBF, 0x00, 0xEC, 0x23, 0x37, 0xFF, 0x24, 0x0B, + 0x1C, 0xF1, 0x48, 0xEC, 0xD0, 0xE5, 0x26, 0xED, 0xF6, 0xE5, 0x42, 0x01, + 0x5F, 0xE4, 0xCA, 0xFA, 0x85, 0xE6, 0x68, 0xE9, 0x1D, 0x04, 0x3D, 0xFB, + 0x7D, 0x20, 0x79, 0x16, 0xC7, 0x18, 0xFB, 0x0D, 0x5B, 0x02, 0xEF, 0xFE, + 0x03, 0x00, 0xB4, 0x10, 0x6C, 0x11, 0x6D, 0x25, 0x6D, 0x20, 0xA0, 0x21, + 0xC9, 0x21, 0xE9, 0x1E, 0x29, 0x1B, 0x75, 0x27, 0x5A, 0x1C, 0xDF, 0x2D, + 0x4A, 0x24, 0x6F, 0x2F, 0x81, 0x24, 0xCB, 0x2A, 0x41, 0x15, 0xC4, 0x16, + 0x4C, 0x03, 0x62, 0x01, 0x20, 0x08, 0x37, 0x05, 0x85, 0x1D, 0xD8, 0x1E, + 0xD9, 0x21, 0xAD, 0x2B, 0x3A, 0x13, 0xD8, 0x1D, 0x6B, 0x0B, 0xA6, 0x12, + 0x77, 0x10, 0x2A, 0x18, 0x40, 0x0E, 0xD2, 0x14, 0x13, 0x04, 0xD5, 0x07, + 0xC0, 0x01, 0xEE, 0x0D, 0xF0, 0x09, 0x30, 0x1C, 0x73, 0x22, 0x44, 0x24, + 0x5B, 0x31, 0xF3, 0x1E, 0x35, 0x26, 0xC5, 0x10, 0x6A, 0x16, 0x92, 0x0C, + 0x31, 0x15, 0xEC, 0x1B, 0x24, 0x1B, 0xED, 0x28, 0x8D, 0x1D, 0xE6, 0x1B, + 0x8B, 0x1A, 0x59, 0x04, 0x33, 0x14, 0x2C, 0x01, 0x49, 0x18, 0xAC, 0x0F, + 0x07, 0x15, 0x0B, 0x07, 0xEC, 0x00, 0xB2, 0xF0, 0x0C, 0xFD, 0xEA, 0xF2, + 0x88, 0x16, 0x9A, 0x0A, 0xEE, 0x24, 0xF9, 0x10, 0xD4, 0x17, 0x19, 0xFD, + 0xCD, 0x0E, 0xE8, 0xF6, 0x68, 0x0D, 0xE6, 0x00, 0x32, 0xFF, 0xB2, 0x06, + 0xA3, 0xEE, 0x93, 0x08, 0x6C, 0xE9, 0x0D, 0xFE, 0x29, 0xEB, 0x42, 0xED, + 0xE2, 0xFC, 0x0A, 0xEF, 0x6F, 0x0F, 0xC7, 0xF8, 0x62, 0x09, 0xFA, 0xEF, + 0xF1, 0xF0, 0x4D, 0xDC, 0x71, 0xE0, 0x8D, 0xD7, 0x56, 0xDA, 0xD8, 0xDF, + 0x60, 0xCF, 0xE6, 0xE2, 0x3D, 0xCA, 0x14, 0xDD, 0x3B, 0xD9, 0xB4, 0xE0, + 0x07, 0xF5, 0x3E, 0xF7, 0x0C, 0x07, 0x7B, 0x06, 0x77, 0xFD, 0xF4, 0xFE, + 0x3B, 0xE3, 0x5D, 0xF2, 0x71, 0xD7, 0x28, 0xF0, 0xB3, 0xE3, 0x35, 0xF1, + 0x05, 0xF5, 0x25, 0xF1, 0x1B, 0xF8, 0xE2, 0xF2, 0x7D, 0xEF, 0x9F, 0xF4, + 0x4E, 0xED, 0x5A, 0xFF, 0x97, 0xF0, 0x02, 0x0F, 0x31, 0xEF, 0x34, 0x10, + 0x9F, 0xEC, 0xA6, 0x04, 0xDD, 0xED, 0xE1, 0xFD, 0xC3, 0xF0, 0xF4, 0x02, + 0xD7, 0xF0, 0xAF, 0x00, 0x77, 0xE7, 0x4A, 0xEE, 0x20, 0xDD, 0x06, 0xE3, + 0x9D, 0xE5, 0xB9, 0xE1, 0xAB, 0xFF, 0xD6, 0xE9, 0xA0, 0x09, 0xBA, 0xEE, + 0x09, 0xFE, 0x8D, 0xE0, 0x5B, 0xF9, 0xF5, 0xD2, 0x3D, 0x05, 0x01, 0xDC, + 0x61, 0x0F, 0xBE, 0xEA, 0xF9, 0x00, 0x15, 0xE1, 0x51, 0xE6, 0xBD, 0xCE, + 0xBE, 0xE3, 0xD3, 0xDB, 0xF1, 0xFD, 0xE3, 0x03, 0xBF, 0x09, 0x0E, 0x11, + 0xB5, 0xFC, 0x28, 0xFA, 0xE4, 0xF4, 0x38, 0xF0, 0xC3, 0xF5, 0x6A, 0xF9, + 0x6E, 0xEF, 0x39, 0xF1, 0x6F, 0xE0, 0x2C, 0xD6, 0xBA, 0xD7, 0xFC, 0xCE, + 0x21, 0xDE, 0x42, 0xE7, 0xC6, 0xF3, 0x19, 0x08, 0x8C, 0x03, 0x17, 0x1D, + 0x15, 0xF9, 0x05, 0x11, 0x22, 0xE2, 0x93, 0xEF, 0x78, 0xD4, 0x21, 0xE1, + 0x70, 0xCD, 0x59, 0xE4, 0x0F, 0xC7, 0xDD, 0xDB, 0x5E, 0xCB, 0x80, 0xCA, + 0xDE, 0xE4, 0x74, 0xCE, 0x7D, 0x03, 0xE7, 0xE3, 0x84, 0x0B, 0x26, 0xF2, + 0x6E, 0xFD, 0x84, 0xF8, 0x06, 0xEC, 0xBE, 0xFC, 0x18, 0xEE, 0x55, 0x03, + 0xDA, 0x02, 0x23, 0x09, 0x10, 0x0F, 0x1B, 0x02, 0x01, 0x0B, 0x60, 0xF2, + 0x3B, 0x07, 0x36, 0xF0, 0x73, 0x0A, 0x09, 0x03, 0xD3, 0x0E, 0xE7, 0x19, + 0xE5, 0x16, 0x5D, 0x27, 0xC3, 0x1A, 0x74, 0x28, 0xF1, 0x17, 0x4E, 0x22, + 0x80, 0x18, 0xFB, 0x1C, 0xCF, 0x1B, 0x87, 0x1E, 0xBF, 0x12, 0xD5, 0x20, + 0xCF, 0x00, 0xDF, 0x1A, 0xB2, 0xF9, 0x20, 0x0E, 0x49, 0xFC, 0xFA, 0x04, + 0x28, 0x02, 0x20, 0x02, 0xAD, 0x0B, 0x23, 0x08, 0xFE, 0x0C, 0xC7, 0x16, + 0x72, 0x09, 0x84, 0x21, 0x70, 0x0B, 0x57, 0x1C, 0xD0, 0x07, 0x14, 0x0E, + 0xB3, 0xFC, 0xB8, 0x02, 0x09, 0xF8, 0x49, 0xFC, 0x64, 0xF8, 0x07, 0xF7, + 0x4C, 0xF9, 0x62, 0xF7, 0x93, 0x02, 0x85, 0x03, 0x03, 0x15, 0x95, 0x12, + 0xC7, 0x29, 0x05, 0x1B, 0xB2, 0x28, 0x83, 0x17, 0xE8, 0x0D, 0xD6, 0xFF, + 0xC0, 0xFA, 0x76, 0xE7, 0x86, 0xF9, 0x43, 0xF0, 0x85, 0xFC, 0x80, 0x04, + 0x57, 0x04, 0x99, 0x05, 0x17, 0x1A, 0xFD, 0x03, 0x39, 0x30, 0x3A, 0x12, + 0xD3, 0x32, 0x34, 0x25, 0x2D, 0x2A, 0x80, 0x2E, 0x08, 0x1E, 0x67, 0x25, + 0xE3, 0x07, 0xF0, 0x08, 0x2B, 0xF7, 0x8B, 0xF4, 0x6B, 0xFE, 0xAD, 0xFA, + 0xA4, 0x0A, 0x1F, 0xFF, 0xAD, 0x0A, 0x64, 0xF7, 0xCA, 0x09, 0x08, 0xFC, + 0xD6, 0x0E, 0x7F, 0x09, 0x74, 0x12, 0xE7, 0x09, 0x02, 0x0C, 0x9B, 0xFF, + 0x14, 0x01, 0xE9, 0xF8, 0x6A, 0xFB, 0xF0, 0xFB, 0x03, 0xFD, 0xBD, 0x06, + 0x10, 0x03, 0x4D, 0x10, 0x9C, 0x00, 0xA5, 0x0B, 0x22, 0xFD, 0xB2, 0x01, + 0xC2, 0x08, 0x54, 0x05, 0xC8, 0x1A, 0x9A, 0x0F, 0xA6, 0x25, 0x55, 0x10, + 0xB6, 0x21, 0x56, 0x05, 0xF1, 0x12, 0x2D, 0x00, 0x42, 0x0A, 0x06, 0x0B, + 0xBC, 0x09, 0xA2, 0x13, 0x62, 0x09, 0xDB, 0x0F, 0xF4, 0x0C, 0x0E, 0x0A, + 0xCA, 0x15, 0x40, 0x0D, 0x2E, 0x1A, 0x09, 0x1B, 0x93, 0x12, 0xC5, 0x25, + 0x4F, 0x03, 0x3F, 0x1E, 0xF0, 0xF6, 0xF7, 0x11, 0xC1, 0xF5, 0x02, 0x0D, + 0x4E, 0x00, 0x76, 0x05, 0xEB, 0x09, 0xDE, 0xFE, 0x82, 0x0C, 0x3B, 0x06, + 0x4E, 0x0F, 0x44, 0x1B, 0x1B, 0x0F, 0x37, 0x2C, 0xF9, 0x04, 0x53, 0x2A, + 0x54, 0xFC, 0x0E, 0x1C, 0x89, 0xFE, 0x3E, 0x0C, 0x1B, 0x07, 0xFB, 0x00, + 0x27, 0x09, 0x7F, 0xF9, 0xD2, 0xFF, 0xFC, 0xF0, 0x3E, 0xF7, 0x50, 0xEC, + 0x67, 0xFA, 0x91, 0xEF, 0x24, 0xFC, 0xC1, 0xF2, 0x6C, 0xEF, 0x6D, 0xED, + 0x36, 0xE1, 0xDB, 0xE0, 0xC9, 0xE0, 0xA2, 0xE0, 0xAE, 0xEA, 0x42, 0xF3, + 0x86, 0xE8, 0x7B, 0x00, 0x32, 0xDB, 0x08, 0xF8, 0x91, 0xD6, 0x24, 0xE1, + 0x65, 0xDD, 0x9A, 0xD0, 0xBD, 0xE8, 0xBA, 0xC9, 0x46, 0xEE, 0xAF, 0xCC, + 0x33, 0xE7, 0x73, 0xDD, 0x33, 0xE1, 0xDD, 0xE8, 0xFA, 0xF0, 0xFB, 0xEE, + 0x67, 0x04, 0x2F, 0xF5, 0xF5, 0xFF, 0xAD, 0xF1, 0x31, 0xF1, 0x88, 0xE6, + 0xF7, 0xF1, 0xC1, 0xE6, 0x50, 0x00, 0x5C, 0xF7, 0x44, 0x0E, 0xE0, 0x02, + 0xB3, 0x17, 0x06, 0x06, 0xC3, 0x18, 0x4D, 0x0A, 0x29, 0x14, 0xC0, 0x07, + 0x05, 0x15, 0x8C, 0x00, 0x85, 0x15, 0xC4, 0x00, 0x6F, 0x09, 0x44, 0x08, + 0x0F, 0xFC, 0x7A, 0x0B, 0x18, 0xFD, 0x26, 0x08, 0xCE, 0x05, 0xB8, 0x06, + 0x19, 0x0C, 0xF0, 0x06, 0xA6, 0x07, 0xF7, 0x08, 0xB9, 0xF2, 0xC1, 0x0B, + 0x08, 0xDC, 0x2F, 0x0D, 0xBA, 0xDB, 0x05, 0x0C, 0x54, 0xEB, 0x13, 0x0B, + 0xA7, 0xF6, 0x95, 0x09, 0x38, 0xFD, 0xAB, 0x04, 0xF5, 0xFE, 0xD4, 0x05, + 0xF4, 0xF7, 0x00, 0x0C, 0xBD, 0xF3, 0x22, 0x0F, 0x34, 0xF9, 0x63, 0x08, + 0x7D, 0xFE, 0x1A, 0xF4, 0xFA, 0x01, 0x25, 0xE1, 0xDC, 0x07, 0xBD, 0xE1, + 0xD9, 0x0E, 0x75, 0xF0, 0xAF, 0x0B, 0x8F, 0xF9, 0xD8, 0xFC, 0xD9, 0xF7, + 0xD9, 0xF4, 0x60, 0xF9, 0x75, 0xFA, 0x1F, 0x01, 0xD7, 0xFE, 0x1C, 0x03, + 0x9C, 0xFA, 0xBD, 0x02, 0xA3, 0xF7, 0x5F, 0x03, 0xF0, 0xFF, 0x19, 0x04, + 0x6A, 0x0C, 0x6A, 0x03, 0x0C, 0x13, 0x9E, 0xFD, 0x9B, 0x17, 0x2A, 0xF5, + 0xD1, 0x13, 0x4F, 0xEE, 0x89, 0x0B, 0xD6, 0xF7, 0x06, 0x0F, 0x9D, 0x0A, + 0x09, 0x0E, 0x22, 0x0F, 0x1E, 0xFA, 0xE3, 0x06, 0xF4, 0xE8, 0x97, 0xFF, + 0x92, 0xE8, 0xF0, 0x03, 0x24, 0xEE, 0xEE, 0x07, 0x74, 0xF6, 0x80, 0x02, + 0x73, 0x04, 0x6E, 0xFE, 0x7C, 0x0D, 0x3B, 0xFE, 0x7B, 0x09, 0xD5, 0x00, + 0x6E, 0xFF, 0x92, 0x04, 0xB1, 0xF3, 0xD2, 0xFD, 0x6D, 0xE9, 0x96, 0xF0, + 0xE8, 0xEB, 0xF9, 0xF2, 0xD9, 0xFE, 0x50, 0x06, 0x9B, 0x11, 0x99, 0x15, + 0x86, 0x1B, 0xB7, 0x18, 0xD3, 0x21, 0x84, 0x13, 0xF0, 0x22, 0x97, 0x0D, + 0x10, 0x16, 0x02, 0x0D, 0x98, 0x03, 0xD5, 0x09, 0xD1, 0xF9, 0x27, 0x07, + 0xED, 0xF9, 0x68, 0x0D, 0xA4, 0x08, 0x21, 0x1C, 0x81, 0x1C, 0xED, 0x27, + 0x53, 0x25, 0xDA, 0x24, 0x66, 0x22, 0x65, 0x17, 0x17, 0x1B, 0x25, 0x0C, + 0x35, 0x17, 0x2A, 0x0C, 0x14, 0x15, 0x64, 0x08, 0x55, 0x11, 0xFF, 0xFE, + 0x48, 0x0F, 0xB9, 0x01, 0x20, 0x11, 0xD6, 0x0E, 0x0F, 0x0E, 0xBE, 0x18, + 0x03, 0x02, 0x1F, 0x17, 0xF1, 0xF8, 0x44, 0x03, 0x59, 0x06, 0xB6, 0xEC, + 0x42, 0x21, 0x1D, 0xE7, 0x26, 0x2A, 0x10, 0xEB, 0x14, 0x19, 0x08, 0xEB, + 0x54, 0x02, 0x66, 0xF0, 0x11, 0xF6, 0xDB, 0x06, 0xD1, 0xF2, 0xCF, 0x14, + 0x8E, 0xF6, 0x68, 0x0D, 0x78, 0x01, 0x5B, 0x05, 0xD5, 0x0B, 0x03, 0x06, + 0xF9, 0x12, 0x22, 0x0A, 0xAC, 0x12, 0xFB, 0x07, 0xFC, 0xFC, 0x73, 0xFC, + 0xB1, 0xDE, 0xFC, 0xED, 0xA4, 0xD1, 0x01, 0xE6, 0x4A, 0xD6, 0x24, 0xEC, + 0x45, 0xDC, 0x93, 0xF4, 0xFB, 0xDC, 0x9F, 0xF7, 0x6A, 0xDF, 0x5F, 0xFE, + 0x84, 0xE7, 0x4A, 0x09, 0x22, 0xF1, 0xCD, 0x09, 0xB4, 0xEE, 0x94, 0xF5, + 0xE6, 0xDD, 0x36, 0xDC, 0xE8, 0xD0, 0x83, 0xD0, 0xC2, 0xD4, 0x3A, 0xD7, + 0xBB, 0xE4, 0x98, 0xE5, 0x3C, 0xF5, 0xC8, 0xEC, 0xBF, 0xFF, 0xF4, 0xEC, + 0x78, 0x02, 0x74, 0xEE, 0xB0, 0x00, 0x77, 0xF5, 0xDF, 0xF6, 0x9D, 0xF7, + 0x2F, 0xE9, 0xE7, 0xF2, 0x24, 0xE3, 0x86, 0xF8, 0xC7, 0xE6, 0xF9, 0x06, + 0xD4, 0xF1, 0xE1, 0x0F, 0x69, 0xF7, 0xAC, 0x0C, 0xC5, 0xF6, 0x6E, 0x01, + 0xAB, 0xFB, 0xF9, 0xF4, 0x12, 0x05, 0x18, 0xED, 0x7C, 0x0B, 0xA4, 0xF1, + 0x73, 0x0B, 0x2D, 0xF6, 0xF2, 0x07, 0x6A, 0xF8, 0x08, 0x00, 0xFD, 0xFB, + 0xC8, 0xF3, 0xE4, 0xFC, 0x1C, 0xEC, 0xDC, 0xFD, 0x7A, 0xEF, 0xCB, 0xFE, + 0xE5, 0xF7, 0xB8, 0x02, 0x39, 0x06, 0x74, 0x0D, 0x55, 0x13, 0x15, 0x13, + 0x40, 0x13, 0x56, 0x12, 0x93, 0x0B, 0x27, 0x11, 0x88, 0x04, 0x11, 0x08, + 0x28, 0xF7, 0x28, 0xF5, 0x12, 0xE7, 0xB7, 0xE9, 0x87, 0xEB, 0xF2, 0xF5, + 0x14, 0xFE, 0xA3, 0x03, 0x05, 0x06, 0x91, 0x00, 0x87, 0x06, 0xA5, 0xFD, + 0x39, 0x09, 0xB6, 0x04, 0xE1, 0x07, 0x57, 0x08, 0x3C, 0x04, 0xFC, 0xFD, + 0x1A, 0x00, 0x31, 0xEF, 0x72, 0xF7, 0xAA, 0xE4, 0x2E, 0xEC, 0x83, 0xE0, + 0xA9, 0xE9, 0xA6, 0xEA, 0xD4, 0xF2, 0xB3, 0xF5, 0xBD, 0xFA, 0xC0, 0xEE, + 0xDE, 0xFF, 0xF2, 0xE2, 0x97, 0x05, 0x26, 0xE0, 0x6C, 0x00, 0x6C, 0xDB, + 0x43, 0xEE, 0x5A, 0xCB, 0xFE, 0xDD, 0x5E, 0xC0, 0x9A, 0xD2, 0x28, 0xC7, + 0x94, 0xCB, 0x00, 0xDB, 0x65, 0xD1, 0x74, 0xEF, 0x9B, 0xDF, 0x3C, 0xF9, + 0x3F, 0xE7, 0x6B, 0xF6, 0xE8, 0xE4, 0xD1, 0xED, 0xA2, 0xE5, 0xB0, 0xEA, + 0x7D, 0xE9, 0x6E, 0xE7, 0x23, 0xE3, 0xF9, 0xDF, 0x3D, 0xDB, 0xE4, 0xE3, + 0x60, 0xDC, 0x58, 0xF2, 0xFC, 0xE5, 0x22, 0xFE, 0xEC, 0xF0, 0x4F, 0x01, + 0x7F, 0xFC, 0xA6, 0xFF, 0xA0, 0x09, 0xA7, 0x01, 0x47, 0x0F, 0xD3, 0x03, + 0xA4, 0x0F, 0xBF, 0x08, 0x10, 0x0C, 0x5E, 0x0C, 0x7D, 0x04, 0xAF, 0x11, + 0x63, 0xF8, 0xD0, 0x16, 0x76, 0xF3, 0x0D, 0x17, 0xED, 0xFE, 0xDE, 0x1C, + 0x53, 0x13, 0xC0, 0x24, 0x20, 0x21, 0xC6, 0x26, 0xB6, 0x28, 0x99, 0x28, + 0x93, 0x2B, 0x75, 0x21, 0xA6, 0x27, 0xF0, 0x0B, 0xEB, 0x28, 0x8C, 0x03, + 0x26, 0x2B, 0x06, 0x0F, 0x12, 0x1C, 0x97, 0x0F, 0xDD, 0x0A, 0x69, 0x03, + 0x80, 0x16, 0x52, 0x0C, 0x8E, 0x2B, 0x99, 0x1E, 0xAA, 0x26, 0x0A, 0x18, + 0x48, 0x21, 0xCE, 0x10, 0xF7, 0x31, 0x92, 0x1E, 0x1F, 0x3E, 0x53, 0x2C, + 0x29, 0x3D, 0x71, 0x2C, 0x06, 0x36, 0xD3, 0x22, 0x6D, 0x20, 0xD1, 0x0B, + 0x30, 0x05, 0x45, 0xF1, 0x96, 0xFC, 0xED, 0xF4, 0xF8, 0xFA, 0x75, 0x09, + 0x69, 0xF0, 0xBE, 0x04, 0xCC, 0xE9, 0x9A, 0xF3, 0x7F, 0xF0, 0xAD, 0xF7, + 0xC8, 0xED, 0x4F, 0xF9, 0x79, 0xDA, 0xBB, 0xE7, 0xB8, 0xCC, 0xFD, 0xDD, + 0x3D, 0xCE, 0x1A, 0xDF, 0x69, 0xDD, 0xB5, 0xE3, 0xC8, 0xF1, 0xB3, 0xF0, + 0x44, 0xFB, 0x42, 0xFF, 0xE4, 0xEF, 0x50, 0xFD, 0x88, 0xE7, 0x75, 0xF5, + 0x59, 0xEF, 0x24, 0xF9, 0x20, 0xF3, 0xB9, 0xF6, 0x97, 0xED, 0x93, 0xE7, + 0xC4, 0xF6, 0xAC, 0xE8, 0x3D, 0x05, 0x92, 0xF7, 0x94, 0x00, 0x01, 0xFC, + 0x23, 0xFF, 0xAF, 0x03, 0xEE, 0x09, 0x52, 0x0E, 0x48, 0x0B, 0x97, 0x09, + 0x35, 0x07, 0x18, 0x05, 0xB6, 0x13, 0xF9, 0x14, 0xE7, 0x20, 0xA4, 0x1C, + 0x3E, 0x1D, 0x82, 0x15, 0x14, 0x14, 0xE1, 0x1C, 0x8B, 0x0C, 0x61, 0x21, + 0xCE, 0x04, 0xE2, 0x19, 0xB2, 0x02, 0x54, 0x21, 0x3B, 0x09, 0x51, 0x34, + 0xEC, 0x12, 0x1A, 0x36, 0x60, 0x1E, 0x20, 0x29, 0xE4, 0x24, 0x80, 0x1E, + 0xBA, 0x26, 0x38, 0x22, 0x60, 0x1F, 0x3B, 0x2C, 0x51, 0x07, 0x0D, 0x29, + 0x57, 0xF8, 0x10, 0x22, 0x5B, 0x0B, 0xBF, 0x29, 0x3D, 0x2B, 0xAA, 0x35, + 0x08, 0x32, 0x90, 0x28, 0x08, 0x2A, 0x53, 0x11, 0xA5, 0x2E, 0xEE, 0x09, + 0x30, 0x36, 0x03, 0x09, 0xBD, 0x30, 0x26, 0x08, 0xB0, 0x1E, 0x67, 0x0B, + 0x42, 0x0C, 0x73, 0x0D, 0x71, 0x0A, 0x46, 0x10, 0x3E, 0x1B, 0x72, 0x1A, + 0xA8, 0x1C, 0x06, 0x18, 0xE0, 0x01, 0x64, 0xFC, 0xAD, 0xF1, 0x9A, 0xE6, + 0x3C, 0xFE, 0xB6, 0xF1, 0x35, 0x08, 0x0A, 0x02, 0x9E, 0x05, 0x3E, 0x01, + 0xAB, 0x06, 0x11, 0xFE, 0xDE, 0x08, 0x05, 0x01, 0xA0, 0x03, 0x5F, 0x02, + 0x8D, 0xFB, 0x5C, 0x00, 0xB4, 0xF0, 0x6B, 0xF7, 0x3B, 0xE3, 0xD9, 0xE5, + 0x96, 0xEB, 0xBC, 0xE0, 0x55, 0x06, 0xBF, 0xF3, 0x1A, 0x0E, 0x1D, 0xFC, + 0x36, 0xFC, 0x71, 0xE5, 0x5E, 0xF1, 0x66, 0xD9, 0xF8, 0xF2, 0x50, 0xE4, + 0x62, 0xE8, 0x17, 0xE0, 0xBA, 0xE1, 0x20, 0xD9, 0x45, 0xEE, 0x79, 0xE6, + 0x16, 0xFB, 0x91, 0xF2, 0xF2, 0x00, 0x97, 0xF3, 0x5D, 0x06, 0x48, 0xF7, + 0xAB, 0x04, 0x26, 0xFB, 0x02, 0xFD, 0x25, 0xF6, 0x06, 0xFE, 0xF9, 0xF6, + 0x3F, 0x02, 0xE7, 0xFB, 0x87, 0x01, 0x23, 0xFE, 0x98, 0x04, 0x08, 0x08, + 0x24, 0x0A, 0x45, 0x15, 0x37, 0x01, 0x30, 0x15, 0x6E, 0xEF, 0xBD, 0x0D, + 0x4E, 0xEC, 0xAF, 0x0D, 0x59, 0x00, 0xB5, 0x19, 0x6B, 0x17, 0x13, 0x23, + 0xC8, 0x14, 0x54, 0x15, 0x64, 0x06, 0xB1, 0x07, 0x21, 0x11, 0x11, 0x1A, + 0xB8, 0x16, 0x19, 0x2C, 0xC4, 0xF2, 0x96, 0x14, 0x0C, 0xD7, 0x92, 0xF5, + 0x60, 0xF0, 0xC9, 0xF9, 0x5F, 0x15, 0xD2, 0x09, 0x0E, 0x1E, 0x4B, 0x0E, + 0xD2, 0x14, 0x6E, 0x14, 0x00, 0xFF, 0x29, 0x0F, 0xE6, 0xE7, 0x1A, 0xFC, + 0x72, 0xE4, 0x20, 0xF7, 0x8D, 0xE5, 0x27, 0xF5, 0x90, 0xD0, 0x72, 0xDA, + 0xD1, 0xC2, 0x45, 0xCB, 0xB3, 0xD8, 0x6B, 0xE8, 0x3E, 0xED, 0x12, 0xFB, + 0x55, 0xE5, 0x02, 0xE5, 0x29, 0xD9, 0xEE, 0xD0, 0x9E, 0xD8, 0x9B, 0xD0, + 0xD9, 0xD6, 0x02, 0xCD, 0x69, 0xD6, 0xF1, 0xC8, 0x56, 0xDD, 0x13, 0xCC, + 0x99, 0xDF, 0xC8, 0xCF, 0xEE, 0xE6, 0x88, 0xD8, 0x70, 0xFA, 0x40, 0xE9, + 0x22, 0xF8, 0x22, 0xED, 0x51, 0xE3, 0x4A, 0xE4, 0x37, 0xE5, 0xC0, 0xEB, + 0x9D, 0xF8, 0x43, 0xFA, 0x02, 0x0A, 0x69, 0xF5, 0x81, 0x16, 0x1C, 0xE4, + 0x8A, 0x15, 0x03, 0xDC, 0xE9, 0x07, 0x9C, 0xDF, 0x01, 0xF6, 0xE1, 0xE3, + 0xD1, 0xEB, 0x29, 0xE8, 0xE8, 0xF8, 0x7C, 0xF5, 0x89, 0x15, 0x56, 0x07, + 0x0B, 0x19, 0x10, 0x0F, 0x04, 0x02, 0x60, 0x10, 0xE6, 0xFD, 0xE2, 0x18, + 0x97, 0x05, 0x77, 0x18, 0x69, 0xF9, 0x0F, 0x03, 0x6A, 0xEF, 0xC5, 0xF6, + 0x97, 0xF4, 0x9C, 0xFA, 0xED, 0x01, 0x39, 0x04, 0xA6, 0x1B, 0x71, 0x1F, + 0x6C, 0x24, 0xAF, 0x32, 0x00, 0x0A, 0xA9, 0x1C, 0x18, 0xFD, 0xAF, 0x11, + 0x9F, 0x10, 0x35, 0x2B, 0x94, 0x13, 0x91, 0x29, 0xB1, 0xFA, 0x4F, 0xFF, + 0x18, 0xF4, 0xF3, 0xED, 0x71, 0x14, 0xDA, 0x11, 0x89, 0x3B, 0x40, 0x3F, + 0xFF, 0x53, 0x2B, 0x56, 0xC5, 0x5C, 0x8E, 0x5C, 0x5F, 0x53, 0x0C, 0x55, + 0x5D, 0x55, 0x61, 0x58, 0x08, 0x58, 0xD2, 0x60, 0xDD, 0x3C, 0xCE, 0x4A, + 0x1A, 0x3B, 0x54, 0x3E, 0xC5, 0x41, 0xB6, 0x36, 0x00, 0x21, 0x91, 0x21, + 0x47, 0x1E, 0xE6, 0x30, 0x06, 0x47, 0x24, 0x4F, 0x04, 0x52, 0x35, 0x46, + 0x99, 0x49, 0x9E, 0x38, 0x20, 0x45, 0xF9, 0x30, 0xFD, 0x19, 0xE1, 0x08, + 0x07, 0xDE, 0x13, 0xDD, 0x08, 0xB3, 0x44, 0xBB, 0x6D, 0xA7, 0x32, 0xAC, + 0xC1, 0xAF, 0x37, 0xB3, 0x44, 0xAA, 0x74, 0xAF, 0xF7, 0xB2, 0x9C, 0xAB, + 0x35, 0xC0, 0xF8, 0xA7, 0x24, 0xB3, 0x10, 0xA3, 0x2B, 0xAE, 0x7F, 0xB2, + 0xBE, 0xB9, 0xB9, 0xBD, 0x73, 0xAD, 0xE7, 0xA9, 0x7E, 0x9C, 0xAD, 0x9D, + 0xD6, 0xBC, 0x89, 0xC4, 0x53, 0xD1, 0xF7, 0xDB, 0x02, 0xBF, 0xE9, 0xD0, + 0x03, 0xC4, 0x62, 0xD6, 0xE2, 0xCD, 0x3A, 0xD3, 0xD3, 0xD2, 0x2A, 0xD2, + 0x88, 0xED, 0x9E, 0xEE, 0x44, 0x0B, 0x03, 0x07, 0xDB, 0x29, 0x1D, 0x21, + 0x9D, 0x4A, 0xCD, 0x42, 0x08, 0x46, 0x26, 0x3B, 0xE4, 0x40, 0x7E, 0x37, + 0x18, 0x4C, 0xD6, 0x4D, 0x96, 0x34, 0x4E, 0x3C, 0x85, 0x21, 0x51, 0x22, + 0x29, 0x43, 0xA4, 0x40, 0x58, 0x61, 0x05, 0x5E, 0x4E, 0x58, 0xD0, 0x43, + 0x4D, 0x4B, 0xF9, 0x24, 0x28, 0x4D, 0x22, 0x2D, 0x3E, 0x43, 0x2B, 0x34, + 0x50, 0x30, 0xC0, 0x2D, 0xB0, 0x2C, 0x37, 0x36, 0xD3, 0x0F, 0x31, 0x1E, + 0xDD, 0xF3, 0x7A, 0xF4, 0x33, 0x07, 0x52, 0xF2, 0xAE, 0x14, 0x85, 0xFB, + 0x79, 0xE8, 0x93, 0xDB, 0x35, 0xB4, 0x5F, 0xB4, 0x2E, 0xC5, 0x3C, 0xCC, + 0xCF, 0xCF, 0x9B, 0xD6, 0x8A, 0xAC, 0x6B, 0xAF, 0x8C, 0xA6, 0x59, 0xA8, + 0xCB, 0xAD, 0x1C, 0xAC, 0x57, 0xB5, 0x50, 0xA8, 0x5D, 0xCD, 0x00, 0xBB, + 0xF3, 0xC6, 0xAB, 0xC3, 0x7E, 0xA9, 0x1D, 0xB6, 0x89, 0xA3, 0xC1, 0xA8, + 0x78, 0xAC, 0xFC, 0xA7, 0xC3, 0xAB, 0xB5, 0xB3, 0x01, 0xB0, 0x29, 0xCD, + 0xAA, 0xD3, 0xE8, 0xF6, 0x0C, 0xF7, 0x30, 0x0F, 0x29, 0x07, 0x74, 0x11, + 0x9A, 0x0A, 0x63, 0x11, 0xB4, 0x06, 0x53, 0x14, 0xAD, 0xFB, 0x4C, 0x0F, + 0xA7, 0xF7, 0x7D, 0x01, 0xFD, 0x0D, 0x4C, 0x05, 0x14, 0x14, 0xBE, 0x06, + 0x00, 0x1C, 0x1E, 0x1A, 0xEB, 0x31, 0x98, 0x3D, 0x60, 0x21, 0x0B, 0x34, + 0x78, 0x11, 0xA9, 0x25, 0xBE, 0x1E, 0xE7, 0x30, 0x0D, 0x22, 0xF1, 0x2C, + 0x17, 0x12, 0x7A, 0x13, 0x07, 0xFD, 0xE9, 0xFB, 0x5A, 0xEA, 0x0C, 0xE8, + 0xA0, 0xEC, 0xE7, 0xDE, 0xC0, 0xF6, 0xAB, 0xDB, 0x60, 0xDD, 0xF5, 0xC3, + 0x5E, 0xBC, 0x35, 0xAD, 0x44, 0xC7, 0x5D, 0xBE, 0xB4, 0xD4, 0x69, 0xD4, + 0xB2, 0xC1, 0xDA, 0xD0, 0x3F, 0xBB, 0x51, 0xD7, 0xF5, 0xCD, 0xB3, 0xE9, + 0xDE, 0xDC, 0x31, 0xEA, 0x6E, 0xDF, 0x97, 0xDE, 0x1F, 0xE8, 0xED, 0xE6, + 0xCB, 0xEC, 0xFD, 0xF1, 0x48, 0xDE, 0x15, 0xE5, 0x46, 0xD7, 0x3E, 0xD8, + 0x14, 0xD4, 0x13, 0xD1, 0xAC, 0xDB, 0x49, 0xDD, 0x3D, 0xEB, 0xA5, 0xF0, + 0x28, 0xEB, 0x84, 0xED, 0xB3, 0xF3, 0x31, 0xF3, 0x2F, 0x00, 0xAA, 0xFA, + 0x81, 0xFD, 0x89, 0xEF, 0x4F, 0xF9, 0x31, 0xEE, 0xD9, 0x02, 0x0F, 0x07, + 0xF5, 0x10, 0xFF, 0x1D, 0x1D, 0x16, 0xD5, 0x20, 0x21, 0x11, 0xEE, 0x18, + 0x4E, 0x14, 0x28, 0x16, 0xEA, 0x2F, 0x3A, 0x27, 0x0C, 0x35, 0xFD, 0x27, + 0x60, 0x20, 0xD1, 0x17, 0xD8, 0x21, 0x94, 0x1B, 0x1B, 0x32, 0x75, 0x27, + 0x7D, 0x31, 0xDE, 0x22, 0x42, 0x28, 0xBF, 0x1C, 0x23, 0x1E, 0x82, 0x1C, + 0xD6, 0x15, 0xEF, 0x20, 0x87, 0x1C, 0x30, 0x2B, 0xFF, 0x25, 0xE8, 0x27, + 0x76, 0x2D, 0x09, 0x23, 0x81, 0x3B, 0xA5, 0x31, 0x82, 0x4E, 0x13, 0x4A, + 0x58, 0x53, 0x58, 0x55, 0x46, 0x51, 0x4C, 0x5A, 0x16, 0x58, 0x97, 0x5F, + 0x91, 0x54, 0x20, 0x55, 0xF9, 0x40, 0x56, 0x44, 0xE1, 0x3A, 0xB4, 0x48, + 0x19, 0x4B, 0xE0, 0x58, 0x4F, 0x59, 0x6C, 0x5D, 0xCE, 0x5A, 0x81, 0x5C, + 0xFF, 0x55, 0xE1, 0x5B, 0x5C, 0x56, 0x23, 0x5C, 0xC9, 0x56, 0x97, 0x5E, + 0x46, 0x4C, 0xD4, 0x5F, 0x1B, 0x44, 0x49, 0x60, 0xA0, 0x43, 0x37, 0x5D, + 0x3B, 0x49, 0xB9, 0x5D, 0x88, 0x57, 0x58, 0x62, 0x20, 0x5B, 0xBC, 0x51, + 0x46, 0x46, 0x24, 0x2F, 0x0F, 0x3F, 0x9B, 0x2D, 0x72, 0x40, 0xAE, 0x38, + 0xAA, 0x2B, 0x1C, 0x22, 0x63, 0x22, 0xF6, 0x10, 0xDD, 0x2D, 0x3A, 0x16, + 0x70, 0x3B, 0x9F, 0x1E, 0x46, 0x40, 0x0F, 0x22, 0x94, 0x32, 0x23, 0x19, + 0xD2, 0x1F, 0xAD, 0x0A, 0xAD, 0x16, 0xA2, 0x04, 0x51, 0x1C, 0xBB, 0x12, + 0x8B, 0x25, 0x20, 0x23, 0x70, 0x1A, 0xAE, 0x13, 0x3A, 0x0B, 0xA1, 0xFE, + 0xD1, 0x07, 0xEA, 0x00, 0x25, 0x01, 0x21, 0x05, 0x2E, 0xE7, 0xF0, 0xF1, + 0x37, 0xD3, 0x8D, 0xE1, 0x9C, 0xD9, 0x13, 0xE7, 0x9C, 0xE0, 0xAE, 0xE9, + 0x8D, 0xCF, 0x0F, 0xDE, 0x57, 0xC4, 0xAD, 0xE0, 0x73, 0xD5, 0x00, 0xF0, + 0x5B, 0xD9, 0xCE, 0xE0, 0x8B, 0xD3, 0x62, 0xD1, 0xB4, 0xD8, 0xF2, 0xD9, + 0x8C, 0xE2, 0x91, 0xE1, 0xE8, 0xE9, 0xDD, 0xE8, 0x7E, 0xEC, 0x2E, 0xF5, + 0x91, 0xE5, 0x0C, 0xED, 0xEA, 0xE5, 0xD1, 0xE1, 0x24, 0xE0, 0x60, 0xDA, + 0x7B, 0xD1, 0x12, 0xD0, 0xEB, 0xCB, 0x9E, 0xC6, 0x59, 0xC8, 0x04, 0xBC, + 0x06, 0xCF, 0xE4, 0xC3, 0x3D, 0xD7, 0xB2, 0xCD, 0xF0, 0xD0, 0xE6, 0xC2, + 0x19, 0xC7, 0xA6, 0xB5, 0xBF, 0xD4, 0x37, 0xC3, 0xBB, 0xDC, 0x6A, 0xCC, + 0x35, 0xC3, 0x1F, 0xB6, 0xA4, 0xAF, 0x43, 0xAA, 0xC0, 0xB0, 0x73, 0xB1, + 0x8A, 0xAC, 0xCA, 0xAA, 0xF7, 0xB9, 0xBD, 0xAF, 0xBE, 0xDA, 0x45, 0xC5, + 0xFD, 0xE2, 0x3F, 0xC3, 0xEF, 0xDD, 0xD0, 0xC0, 0xE2, 0xD4, 0x56, 0xCF, + 0xA2, 0xCC, 0x00, 0xDB, 0xFE, 0xD2, 0xB3, 0xE6, 0xD0, 0xD8, 0x54, 0xFB, + 0x43, 0xE3, 0x5B, 0x15, 0xC0, 0xF6, 0x8E, 0x22, 0xC5, 0xFB, 0xBF, 0x14, + 0x53, 0xF9, 0x5E, 0x01, 0xFE, 0xFD, 0x44, 0xF4, 0x83, 0x04, 0x80, 0xEA, + 0x60, 0x07, 0x70, 0xF0, 0xF6, 0x0F, 0xA6, 0x0B, 0x9B, 0x16, 0x88, 0x1A, + 0x1C, 0x07, 0x82, 0x07, 0xFB, 0x0D, 0x47, 0x06, 0x68, 0x2B, 0x91, 0x16, + 0x25, 0x1E, 0xF9, 0x09, 0x33, 0xFF, 0x34, 0xFE, 0xB5, 0xFC, 0xBB, 0x09, + 0xC1, 0x0F, 0x50, 0x0D, 0xEC, 0x22, 0x80, 0x00, 0x85, 0x1E, 0xBD, 0xF8, + 0xF8, 0x07, 0x61, 0xF6, 0x20, 0x06, 0x80, 0xFA, 0xAE, 0x20, 0xB9, 0x0C, + 0xE4, 0x2D, 0x2C, 0x23, 0x1C, 0x23, 0x0B, 0x2E, 0x2B, 0x1C, 0x54, 0x24, + 0x73, 0x23, 0xA7, 0x16, 0xC2, 0x38, 0x6C, 0x26, 0xF5, 0x33, 0xB8, 0x35, + 0x28, 0x1C, 0x9D, 0x26, 0x4E, 0x14, 0x6D, 0x13, 0x72, 0x1B, 0xDD, 0x1A, + 0x45, 0x2A, 0x8C, 0x3B, 0x50, 0x29, 0x5F, 0x4B, 0xC0, 0x33, 0x2E, 0x41, + 0xCA, 0x3F, 0x63, 0x31, 0x79, 0x30, 0x7F, 0x2F, 0x1C, 0x13, 0x13, 0x23, + 0xF3, 0xFF, 0xC7, 0x01, 0x3A, 0x03, 0x9B, 0xF7, 0x6E, 0x01, 0xE1, 0x01, + 0xCE, 0x0D, 0x02, 0x09, 0x43, 0x2E, 0x98, 0x0E, 0xC9, 0x34, 0xB9, 0x1B, + 0x05, 0x1B, 0x72, 0x1B, 0xD2, 0xF9, 0x2C, 0xF9, 0xF4, 0xE7, 0x7F, 0xEA, + 0x82, 0xD8, 0x4B, 0xF0, 0x44, 0xC0, 0xF9, 0xD3, 0xA3, 0xC0, 0xE6, 0xC3, + 0xB1, 0xDB, 0xD0, 0xD9, 0xF5, 0xEA, 0x7B, 0xEE, 0xF5, 0xD6, 0x34, 0xF0, + 0x68, 0xBE, 0xEF, 0xE5, 0x4D, 0xCA, 0x2F, 0xD1, 0xBF, 0xE7, 0x28, 0xC2, + 0xE9, 0xE9, 0xB3, 0xD3, 0xAC, 0xD7, 0x8F, 0xE7, 0x2F, 0xCA, 0xD0, 0xD7, + 0x4E, 0xBD, 0xAD, 0xB5, 0x78, 0xB2, 0x3E, 0xB6, 0x35, 0xB5, 0x8F, 0xD6, + 0x70, 0xB9, 0x85, 0xDC, 0xAC, 0xC4, 0xBC, 0xD2, 0xE1, 0xE5, 0x3A, 0xDC, + 0xE5, 0xF9, 0x8A, 0xF5, 0x1C, 0x00, 0xB0, 0x04, 0xE4, 0xF9, 0xFC, 0xF7, + 0xCC, 0xF0, 0xE7, 0xF7, 0x0D, 0x01, 0xCD, 0xFE, 0x1A, 0x20, 0x38, 0x04, + 0x29, 0x3E, 0x8B, 0x21, 0xB7, 0x2D, 0x92, 0x24, 0xFA, 0x0C, 0xEF, 0x09, + 0x0C, 0x0F, 0xE9, 0x00, 0xD9, 0x18, 0x76, 0x0B, 0x99, 0x06, 0x10, 0x0D, + 0x50, 0xDE, 0x91, 0x07, 0x8B, 0xD3, 0x04, 0x03, 0x67, 0xEF, 0x10, 0xF5, + 0xE1, 0x03, 0x3F, 0xEC, 0xBC, 0xF4, 0xF8, 0xEA, 0x9E, 0xDA, 0xC0, 0xCF, + 0xAE, 0xD2, 0xFD, 0xAF, 0x1D, 0xCD, 0x74, 0xBF, 0xDF, 0xC5, 0x1E, 0xDB, + 0x60, 0xB4, 0x9E, 0xCD, 0x23, 0xA1, 0xF1, 0xBA, 0xE6, 0xBC, 0x7E, 0xD5, + 0x8D, 0xF6, 0x9F, 0x06, 0x7D, 0x04, 0x54, 0x23, 0xCE, 0xDF, 0xE3, 0x13, + 0x2D, 0xD6, 0x97, 0xF1, 0x38, 0xF5, 0x07, 0xE2, 0x01, 0xF7, 0x15, 0xD9, + 0xCE, 0xCE, 0x5B, 0xD7, 0xA7, 0xB6, 0x7F, 0xD9, 0x00, 0xB9, 0x20, 0xCB, + 0x14, 0xD7, 0xC7, 0xCE, 0x67, 0xFA, 0xC6, 0xED, 0xC2, 0xF2, 0xB6, 0x08, + 0x39, 0xEB, 0x89, 0x0C, 0x8F, 0x07, 0x37, 0x14, 0x31, 0x2E, 0xCD, 0x36, + 0x8B, 0x31, 0x5A, 0x3E, 0x38, 0x14, 0x54, 0x23, 0x4A, 0xFE, 0xF3, 0x05, + 0xDF, 0xF9, 0xB0, 0xF6, 0x9D, 0x09, 0xFE, 0xFA, 0x01, 0x0A, 0x43, 0xFF, + 0xE0, 0xE9, 0x98, 0xF3, 0xAF, 0xDD, 0x56, 0xE7, 0x9B, 0xEE, 0xD6, 0xE5, + 0xDF, 0x03, 0x40, 0xFE, 0x1A, 0xEE, 0x64, 0x0C, 0x34, 0xC2, 0x85, 0xE9, + 0xC9, 0xC8, 0xA8, 0xD7, 0xD5, 0xDF, 0x11, 0xE2, 0x22, 0xE1, 0x39, 0xE5, + 0x05, 0xC7, 0x9B, 0xD4, 0x78, 0xB5, 0x41, 0xC2, 0x19, 0xC1, 0x3D, 0xCC, + 0x39, 0xC8, 0x77, 0xE0, 0x69, 0xC7, 0x1D, 0xDE, 0xFE, 0xC7, 0x4F, 0xC3, + 0x6F, 0xC6, 0x8A, 0xAB, 0xA0, 0xC4, 0x21, 0xAC, 0x71, 0xD1, 0xC7, 0xC7, + 0x98, 0xEE, 0xFC, 0xE0, 0x02, 0xF8, 0x25, 0xD5, 0x0E, 0xDD, 0x24, 0xB7, + 0x53, 0xD7, 0xD7, 0xC5, 0xD2, 0xE9, 0x1D, 0xF1, 0x85, 0xEC, 0x43, 0xD9, + 0x82, 0xF5, 0x8D, 0xA9, 0xA5, 0x08, 0x24, 0xC6, 0x25, 0x21, 0x05, 0x0C, + 0x66, 0x45, 0xDD, 0x3E, 0x42, 0x49, 0x24, 0x3A, 0x2F, 0x24, 0x36, 0x11, + 0xD3, 0x18, 0x58, 0x08, 0x53, 0x1E, 0x74, 0x12, 0x7E, 0x0B, 0x58, 0xFE, + 0x1B, 0x07, 0x3B, 0xE2, 0xB4, 0x0C, 0x89, 0xDA, 0xF7, 0x07, 0xB5, 0xEA, + 0xFB, 0x00, 0x5A, 0x0E, 0x48, 0xF9, 0x2E, 0x25, 0x09, 0xFE, 0xD8, 0x1E, + 0x07, 0x01, 0xAE, 0x01, 0x2C, 0x0C, 0x00, 0xFC, 0xAF, 0x11, 0x20, 0x18, + 0xFB, 0xF0, 0x40, 0x0E, 0x7C, 0xDC, 0x6D, 0xF9, 0xF0, 0xEA, 0x11, 0x0D, + 0x95, 0xF0, 0x82, 0x0B, 0xC7, 0xE3, 0x6B, 0xF5, 0x3B, 0xE7, 0x68, 0xF3, + 0x0E, 0x08, 0x86, 0xEA, 0xE1, 0x14, 0x8C, 0xD9, 0x04, 0x04, 0x32, 0xE1, + 0x33, 0x12, 0xA9, 0x02, 0x41, 0x2B, 0x85, 0x17, 0x45, 0x1A, 0x73, 0x19, + 0x94, 0x16, 0xA9, 0x34, 0xB9, 0x2D, 0x9B, 0x41, 0x9B, 0x36, 0xD1, 0x31, + 0x9C, 0x3F, 0x44, 0x37, 0x16, 0x58, 0xF4, 0x45, 0x59, 0x58, 0xF6, 0x46, + 0x66, 0x51, 0x0C, 0x59, 0xBF, 0x57, 0xD0, 0x61, 0xFA, 0x56, 0x75, 0x52, + 0x46, 0x5A, 0x18, 0x5E, 0x22, 0x5C, 0x1F, 0x61, 0x08, 0x5C, 0xD8, 0x4C, + 0x05, 0x62, 0x50, 0x52, 0x3E, 0x48, 0xFA, 0x40, 0x7F, 0x1E, 0x83, 0x1C, + 0x97, 0x31, 0x95, 0x3C, 0xF0, 0x47, 0xF3, 0x56, 0xB9, 0x2C, 0xC3, 0x35, + 0xAC, 0x2A, 0x15, 0x2D, 0xDF, 0x4E, 0x5A, 0x4D, 0x9B, 0x57, 0xAA, 0x4E, + 0x7C, 0x41, 0xE7, 0x32, 0x56, 0x19, 0x3D, 0x28, 0x9D, 0xFD, 0x03, 0x2A, + 0x0D, 0xFF, 0xD4, 0x1F, 0x1B, 0x12, 0x9D, 0x20, 0x87, 0x2D, 0x9A, 0x27, + 0xF7, 0x1F, 0x29, 0x04, 0xB0, 0x0A, 0xC7, 0xF1, 0x62, 0x07, 0x99, 0x0C, + 0x5A, 0x05, 0xB6, 0x1D, 0x49, 0x14, 0x35, 0x16, 0x5A, 0x1D, 0x2B, 0x16, + 0xA1, 0x24, 0x3C, 0x39, 0x70, 0x37, 0x09, 0x5B, 0xB7, 0x2E, 0x84, 0x4D, + 0xF7, 0x13, 0x68, 0x32, 0x1C, 0x10, 0x80, 0x31, 0x84, 0x1A, 0x6F, 0x33, + 0x7D, 0x12, 0xAC, 0x18, 0xF3, 0x0E, 0xFC, 0xF5, 0x9C, 0x14, 0xE5, 0xF6, + 0xF6, 0x0C, 0x83, 0x0F, 0x95, 0x0A, 0xE6, 0x18, 0x13, 0x03, 0x90, 0x0A, + 0xAA, 0x01, 0xA6, 0xFC, 0xA0, 0x07, 0xA8, 0xF7, 0xD1, 0x10, 0x8A, 0x01, + 0x00, 0x1C, 0xFD, 0x0F, 0xC5, 0x28, 0x09, 0x17, 0xEF, 0x26, 0x83, 0x01, + 0x39, 0x1D, 0x95, 0xF7, 0x17, 0x21, 0x81, 0x14, 0x0B, 0x1B, 0x56, 0x17, + 0x24, 0x1B, 0x3D, 0x08, 0xD7, 0x38, 0xC4, 0x0D, 0xF1, 0x3C, 0xEF, 0xFF, + 0x56, 0x1A, 0x1E, 0xF5, 0x17, 0x14, 0xE6, 0x12, 0xFF, 0x13, 0xE8, 0x18, + 0x57, 0xF5, 0xB0, 0x08, 0xE0, 0xCE, 0x0D, 0xF5, 0x59, 0xDA, 0x64, 0xEF, + 0x73, 0xFC, 0x14, 0xDE, 0x0A, 0xF0, 0xF7, 0xAC, 0xAA, 0xF8, 0x24, 0xBF, + 0x77, 0x17, 0x18, 0x03, 0xF8, 0x09, 0xE1, 0x18, 0x8E, 0x04, 0xF6, 0x1A, + 0x30, 0x10, 0xCD, 0x1C, 0xE7, 0xFC, 0xF8, 0x04, 0x80, 0xEC, 0xF7, 0xFA, + 0x06, 0xF6, 0x96, 0xF6, 0x38, 0x06, 0x95, 0xE5, 0x24, 0x04, 0xBA, 0xDD, + 0xA5, 0xFD, 0x17, 0xDC, 0x8A, 0xFD, 0x00, 0xE8, 0x98, 0x01, 0x7A, 0x05, + 0x03, 0x01, 0xF1, 0x13, 0xC9, 0xFB, 0xEE, 0xFF, 0x65, 0x11, 0x84, 0xF0, + 0x02, 0x31, 0x97, 0x0B, 0xA4, 0x31, 0x2D, 0x1F, 0xA6, 0x16, 0xC8, 0x0B, + 0xB9, 0xFF, 0x60, 0x0A, 0xD7, 0xFC, 0x5A, 0x1C, 0x40, 0xF3, 0x22, 0x0B, + 0xCB, 0xE4, 0xA3, 0xE6, 0xB4, 0xFF, 0xBF, 0xE1, 0x12, 0x0D, 0x95, 0xE2, + 0xE1, 0xEA, 0xE1, 0xE0, 0xAE, 0xE0, 0xFE, 0xF0, 0xA4, 0xEE, 0x55, 0xF7, + 0x31, 0xDB, 0x73, 0xE8, 0xDE, 0xD2, 0xE1, 0xF1, 0x19, 0xF3, 0x9C, 0x05, + 0x21, 0x07, 0x0F, 0x09, 0x4C, 0x05, 0xB0, 0x11, 0xC8, 0x08, 0x42, 0x17, + 0xD8, 0x14, 0x50, 0x1F, 0x01, 0x16, 0x9B, 0x2D, 0xDE, 0x06, 0xE7, 0x26, + 0xDD, 0x03, 0x2B, 0x1C, 0x32, 0xF2, 0xBB, 0x20, 0xCB, 0xDC, 0xD3, 0x1C, + 0x21, 0x09, 0x4B, 0x2A, 0x41, 0x14, 0xBB, 0x39, 0xDF, 0xD6, 0x53, 0x11, + 0x5E, 0xB8, 0x61, 0xE6, 0xF3, 0xD0, 0xC4, 0xE0, 0xB6, 0xDE, 0x99, 0xDA, + 0xFE, 0xBD, 0x48, 0xC6, 0x56, 0xA7, 0x51, 0xC7, 0x00, 0xBB, 0xCC, 0xE8, + 0x3D, 0xE3, 0x17, 0xFC, 0xD1, 0xE6, 0x86, 0xE6, 0xA9, 0xD3, 0x3E, 0xD1, + 0x6B, 0xD5, 0xA9, 0xCD, 0xA0, 0xDE, 0x65, 0xC9, 0xE0, 0xCA, 0x5E, 0xBF, + 0x92, 0xA2, 0x5A, 0xAF, 0x65, 0xA1, 0xB6, 0xA6, 0x11, 0xAE, 0xA3, 0xAD, + 0x98, 0xA9, 0x0B, 0xBA, 0x5A, 0xB5, 0x2A, 0xD3, 0xA2, 0xC0, 0x0E, 0xE0, + 0x64, 0xC3, 0x45, 0xD8, 0xCF, 0xD9, 0xB4, 0xEF, 0x27, 0xF8, 0xA1, 0x1B, + 0x96, 0xF3, 0x9A, 0x22, 0xB0, 0xE5, 0xC4, 0x0D, 0xC0, 0x01, 0x4C, 0x08, + 0x02, 0x07, 0x59, 0x02, 0x63, 0xE8, 0x04, 0xF9, 0x03, 0xE5, 0xC6, 0xF0, + 0xF1, 0xED, 0x70, 0xE1, 0xC8, 0xE8, 0x9E, 0xF1, 0x35, 0xDD, 0x26, 0xFB, + 0x53, 0xCB, 0x3A, 0xD6, 0xB1, 0xCD, 0xD0, 0xC7, 0xBE, 0xE0, 0x01, 0xD4, + 0xEF, 0xE0, 0x27, 0xD6, 0x86, 0xE0, 0x4E, 0xDC, 0x07, 0xE3, 0x63, 0xF0, + 0x76, 0xDF, 0x5C, 0xF2, 0xB6, 0xE1, 0x48, 0xED, 0x5B, 0xE1, 0x96, 0xF3, + 0x67, 0xEB, 0xB6, 0xF2, 0x76, 0xF5, 0x73, 0xE7, 0x00, 0xF2, 0xD6, 0xD9, + 0x32, 0xEC, 0x52, 0xC4, 0x89, 0xD9, 0x95, 0xB0, 0xEC, 0xCB, 0xB5, 0xC4, + 0x8E, 0xDD, 0xC0, 0xE7, 0x81, 0xD9, 0x24, 0xD7, 0x30, 0xB6, 0xD6, 0xBE, + 0xD8, 0xBC, 0x3C, 0xDB, 0x90, 0xCB, 0x05, 0xEC, 0x14, 0xC5, 0x9C, 0xD8, + 0x29, 0xCA, 0xD5, 0xCB, 0xB6, 0xE9, 0xA4, 0xDE, 0x99, 0x0A, 0xC3, 0xF8, + 0x6F, 0x0F, 0xE1, 0x04, 0xA7, 0x04, 0x93, 0x0C, 0xFA, 0xF8, 0xBF, 0x0A, + 0x9F, 0xE5, 0xBF, 0xFC, 0x35, 0xC6, 0x86, 0xD5, 0x0D, 0xAC, 0xED, 0xAC, + 0x84, 0xAC, 0xF3, 0xB7, 0x6C, 0xB6, 0x69, 0xC9, 0x29, 0xC0, 0xED, 0xC7, + 0x60, 0xE9, 0x9C, 0xE3, 0x43, 0x02, 0xC4, 0x01, 0x29, 0xED, 0x82, 0x05, + 0x85, 0xF2, 0x31, 0x0C, 0xF1, 0x15, 0xFC, 0x14, 0xC7, 0x22, 0x4F, 0x06, + 0x62, 0x1A, 0x50, 0xED, 0x22, 0x0D, 0x5E, 0xED, 0xB0, 0xFE, 0x31, 0x07, + 0xA9, 0xEB, 0x2F, 0x02, 0x76, 0xEA, 0x01, 0xF8, 0xF9, 0xF1, 0xF2, 0x02, + 0x5F, 0xE8, 0xAB, 0xF4, 0x85, 0xED, 0xBA, 0xE8, 0xFF, 0xF5, 0x43, 0xE4, + 0x00, 0xE9, 0x62, 0xD7, 0x74, 0xD5, 0xE6, 0xD8, 0xD1, 0xBA, 0x90, 0xDA, + 0x38, 0xC0, 0x7E, 0xE7, 0x94, 0xE5, 0xBD, 0x01, 0x8A, 0xDF, 0x6C, 0xF8, + 0xD7, 0xDB, 0xDE, 0xFE, 0x7C, 0x04, 0xE5, 0x18, 0x39, 0x18, 0x3D, 0x19, + 0x92, 0x02, 0x5C, 0x10, 0x5B, 0xED, 0x20, 0x06, 0xA4, 0xD6, 0x5F, 0xEF, + 0xEC, 0xC5, 0x58, 0xD8, 0xCF, 0xDF, 0x05, 0xE3, 0xD2, 0xEE, 0xB2, 0xF2, + 0x4E, 0xD8, 0x32, 0xDD, 0x7E, 0xF6, 0x31, 0xDE, 0xAF, 0x24, 0xF4, 0xF4, + 0x2B, 0x19, 0x6D, 0xEA, 0x79, 0xF6, 0x44, 0xD4, 0x78, 0xE3, 0xA0, 0xCD, + 0x28, 0xE7, 0x55, 0xD4, 0x99, 0x09, 0xF3, 0xE9, 0xD3, 0x1C, 0x99, 0xF4, + 0xA6, 0x0C, 0x04, 0xE8, 0xAE, 0x0E, 0xA8, 0xF1, 0xB7, 0x0E, 0x6B, 0xEF, + 0x83, 0xF3, 0x54, 0xCD, 0xDC, 0xC8, 0xFC, 0xAF, 0x28, 0xC2, 0xA4, 0xB6, + 0xE6, 0xBD, 0xDD, 0xC5, 0x4F, 0xB7, 0xCD, 0xC6, 0x35, 0xCC, 0x2B, 0xD8, + 0x58, 0xCC, 0xC7, 0xDC, 0x5B, 0xEE, 0x08, 0xED, 0x6F, 0x30, 0x97, 0x15, + 0x7C, 0x3A, 0x8E, 0x21, 0x3A, 0x22, 0x6C, 0x20, 0x6E, 0x28, 0x9C, 0x33, + 0x02, 0x2D, 0x2C, 0x3A, 0xBD, 0x1D, 0x03, 0x21, 0x6E, 0x18, 0x79, 0x0F, + 0xF8, 0x0F, 0x38, 0x07, 0xFA, 0x0A, 0x58, 0xF9, 0x87, 0x0F, 0x25, 0xFB, + 0xD1, 0x19, 0xC4, 0x0C, 0x43, 0x1D, 0xB7, 0x11, 0x4F, 0x1B, 0xB2, 0x07, + 0x16, 0x22, 0x66, 0x09, 0xD5, 0x21, 0x47, 0x1F, 0x58, 0x33, 0xC7, 0x31, + 0x9B, 0x41, 0x0D, 0x28, 0x82, 0x39, 0x46, 0x15, 0xA2, 0x42, 0x14, 0x24, + 0x4B, 0x4C, 0x22, 0x4C, 0x0E, 0x4D, 0xE0, 0x61, 0xB9, 0x55, 0x10, 0x5C, + 0xF2, 0x4B, 0x6A, 0x39, 0x93, 0x36, 0xB7, 0x1A, 0x4D, 0x36, 0x16, 0x1E, + 0xAE, 0x2F, 0x3C, 0x22, 0xDA, 0x20, 0xBD, 0x10, 0xF3, 0x2A, 0xA6, 0x02, + 0xFF, 0x4A, 0xE1, 0x19, 0xC9, 0x49, 0x62, 0x20, 0x26, 0x22, 0x2A, 0x08, + 0x75, 0x0D, 0x0A, 0x00, 0x9F, 0x1E, 0x2B, 0x05, 0x95, 0x2C, 0x84, 0x0C, + 0xA6, 0x3B, 0x01, 0x20, 0x1E, 0x46, 0xEB, 0x2F, 0x34, 0x30, 0xD6, 0x21, + 0x80, 0x13, 0xCA, 0x18, 0x3C, 0xFD, 0x57, 0x1B, 0x0D, 0xEF, 0xB3, 0xFF, + 0x20, 0xE9, 0x20, 0xE2, 0x68, 0xEA, 0x88, 0xE9, 0xA0, 0xFD, 0x47, 0x07, + 0x3E, 0x16, 0xBF, 0x23, 0x35, 0x17, 0xA0, 0x2C, 0x80, 0x02, 0xC4, 0x15, + 0x93, 0x08, 0xDB, 0x1B, 0xC1, 0x38, 0xD8, 0x4C, 0x0A, 0x5B, 0x20, 0x5D, + 0xB7, 0x55, 0xCE, 0x47, 0x03, 0x45, 0x81, 0x3E, 0x4F, 0x3B, 0xA7, 0x35, + 0xED, 0x28, 0xB4, 0x14, 0xB3, 0x15, 0xE8, 0xF9, 0x97, 0x01, 0x7E, 0xEB, + 0x2D, 0xEA, 0x6E, 0xDE, 0xD2, 0xE8, 0xF7, 0xDD, 0xCA, 0xEC, 0x0A, 0xE0, + 0x27, 0xF7, 0x25, 0xD4, 0xE3, 0xFD, 0xEB, 0xCE, 0xE2, 0xFF, 0x68, 0xDC, + 0xB1, 0x09, 0xDC, 0xE8, 0x91, 0x13, 0x22, 0xF7, 0x36, 0x07, 0x4D, 0xE9, + 0x93, 0xFB, 0x6B, 0xDA, 0x31, 0x11, 0x9F, 0x00, 0x6A, 0x29, 0x04, 0x25, + 0xA3, 0x30, 0x81, 0x21, 0xDA, 0x34, 0x3A, 0x1E, 0xEB, 0x23, 0x52, 0x13, + 0x83, 0xFF, 0x9B, 0xFB, 0xB9, 0xF8, 0x0E, 0x00, 0xA5, 0xFB, 0x9E, 0x01, + 0x26, 0xD6, 0xD3, 0xDC, 0x02, 0xE6, 0xC8, 0xE7, 0x4D, 0x31, 0x7D, 0x1D, + 0x90, 0x1E, 0xAB, 0x12, 0x2C, 0xEB, 0x7D, 0xF8, 0xB1, 0x07, 0x61, 0x16, + 0x0C, 0x22, 0x13, 0x29, 0x6F, 0x15, 0x08, 0x1A, 0x4F, 0x22, 0x54, 0x29, + 0xB3, 0x23, 0x04, 0x2B, 0x90, 0x09, 0x0D, 0x08, 0xE8, 0x0E, 0x23, 0xFD, + 0x21, 0x18, 0x8A, 0x01, 0x58, 0x02, 0x26, 0xF6, 0xE2, 0x04, 0xD7, 0xF2, + 0xFA, 0x26, 0x45, 0xFA, 0x84, 0x2B, 0x67, 0x02, 0x83, 0x27, 0x42, 0x20, + 0x70, 0x25, 0x04, 0x2B, 0x1C, 0x20, 0x48, 0x26, 0x1A, 0x35, 0x3E, 0x39, + 0x69, 0x57, 0x4A, 0x49, 0x49, 0x4F, 0x87, 0x38, 0x9B, 0x37, 0x51, 0x2C, + 0x9E, 0x3D, 0x7E, 0x31, 0x56, 0x35, 0x09, 0x1F, 0x6A, 0x20, 0x9D, 0x11, + 0xB9, 0x0F, 0x9C, 0x09, 0x35, 0xF9, 0x38, 0xEE, 0x55, 0xE9, 0xFE, 0xD9, + 0xD3, 0xEB, 0xC0, 0xDE, 0xC5, 0xEE, 0xB9, 0xDD, 0x2B, 0xE0, 0x38, 0xDA, + 0x3B, 0xE4, 0x85, 0xEF, 0x8C, 0xFA, 0xFF, 0xF8, 0x43, 0x0D, 0xF4, 0x12, + 0xEE, 0x11, 0xA4, 0x30, 0x5B, 0x0A, 0x5E, 0x2C, 0xE0, 0x22, 0x24, 0x40, + 0xDC, 0x3D, 0x2F, 0x55, 0x7F, 0x39, 0xF9, 0x45, 0x65, 0x3D, 0x5E, 0x4B, + 0xE2, 0x32, 0xF7, 0x54, 0x2C, 0x14, 0xEC, 0x41, 0x68, 0x14, 0xA0, 0x44, + 0x4C, 0x16, 0x9F, 0x45, 0xDA, 0xF1, 0x07, 0x22, 0xDC, 0xE5, 0xB7, 0x19, + 0xA5, 0x0E, 0x70, 0x3F, 0x8D, 0x10, 0x49, 0x3F, 0xF1, 0xE8, 0x78, 0x11, + 0x4F, 0xE5, 0x12, 0x0E, 0xE1, 0xF0, 0xE4, 0x25, 0xC2, 0xF7, 0xB9, 0x26, + 0xF3, 0x17, 0x37, 0x33, 0x7A, 0x24, 0xBC, 0x38, 0xB2, 0xF8, 0x72, 0x17, + 0x89, 0xDE, 0xF3, 0xFA, 0x4A, 0xCB, 0xE8, 0xEC, 0x74, 0xA9, 0x93, 0xE4, + 0x92, 0xA8, 0x0F, 0xD7, 0xEA, 0xAE, 0xD2, 0xC5, 0x27, 0xBF, 0x3E, 0xCD, + 0xC8, 0xF2, 0xEB, 0xDE, 0x62, 0x0F, 0x70, 0xE9, 0xA9, 0xFD, 0x6C, 0xFC, + 0xC9, 0xF0, 0xBA, 0x12, 0xC3, 0xF5, 0x87, 0x21, 0x5C, 0xEF, 0x78, 0x27, + 0x12, 0xF3, 0x79, 0x2A, 0x58, 0xF9, 0x8D, 0x22, 0x5D, 0xEA, 0xF6, 0x11, + 0x48, 0xE9, 0xC2, 0x10, 0x46, 0xF2, 0x16, 0xFF, 0x57, 0xE2, 0xD7, 0xD2, + 0x0C, 0xC7, 0x3F, 0xC8, 0x4E, 0xCB, 0x9D, 0xCF, 0xC4, 0xD6, 0x51, 0xC1, + 0x06, 0xC4, 0x9B, 0xBA, 0x40, 0xC2, 0x44, 0xCD, 0xF2, 0xC2, 0x06, 0xD7, + 0x39, 0xBF, 0xC6, 0xE9, 0x13, 0xDB, 0xF2, 0x06, 0x9B, 0xE9, 0xAA, 0xFE, + 0xBE, 0xF7, 0xF9, 0xFA, 0xDF, 0x1B, 0xCD, 0x0F, 0xA1, 0x24, 0x65, 0x06, + 0xF2, 0x19, 0x2E, 0x03, 0x42, 0xFE, 0xF5, 0x0E, 0x8D, 0xBF, 0x12, 0xE5, + 0x1D, 0xB8, 0xA9, 0xD7, 0x58, 0xDE, 0x54, 0xF6, 0x8D, 0xDD, 0x6A, 0xF0, + 0xEB, 0xCB, 0xA7, 0xDA, 0x65, 0xD4, 0xAD, 0xE4, 0x53, 0xED, 0xFE, 0xE8, + 0xC3, 0xDA, 0x01, 0xBB, 0x6E, 0xC4, 0xD3, 0xB8, 0x70, 0xCF, 0x25, 0xE0, + 0xE8, 0xDA, 0x68, 0xE0, 0x9C, 0xF7, 0xAF, 0xE5, 0xC2, 0x0E, 0x44, 0xFA, + 0x53, 0xEF, 0xB7, 0xE7, 0x33, 0xC5, 0x5E, 0xCC, 0x9E, 0xB4, 0x57, 0xCF, + 0xE6, 0xA2, 0x7F, 0xBB, 0xE4, 0xA0, 0xE9, 0xA5, 0x14, 0xA4, 0x50, 0xAB, + 0xF0, 0xAD, 0x8F, 0xA9, 0xC6, 0xD8, 0x85, 0xBE, 0x47, 0xE1, 0x87, 0xD8, + 0xA9, 0xC2, 0xFD, 0xCD, 0x50, 0xD9, 0x8D, 0xD7, 0xEB, 0xF5, 0xC2, 0xF3, + 0xB3, 0xE1, 0xCC, 0xE8, 0xD8, 0xDD, 0x93, 0xDA, 0x84, 0xE3, 0x9F, 0xE4, + 0x5D, 0xD3, 0x60, 0xDE, 0xC9, 0xC6, 0xC3, 0xCD, 0x24, 0xC0, 0x69, 0xCD, + 0x09, 0xA8, 0x58, 0xBB, 0x52, 0xA5, 0x06, 0xB9, 0xA2, 0xB9, 0xE1, 0xC7, + 0x83, 0xC2, 0xC7, 0xB7, 0x87, 0xC7, 0xF8, 0xA4, 0xE6, 0xC3, 0xBE, 0xA1, + 0xBF, 0xB6, 0xFD, 0xAF, 0xF7, 0xC5, 0x69, 0xDD, 0x96, 0xDB, 0x7E, 0xFE, + 0xD2, 0xD4, 0xFB, 0xFA, 0x96, 0xE3, 0x56, 0x10, 0xF5, 0x06, 0x97, 0x24, + 0x5E, 0x13, 0x26, 0x14, 0xFA, 0x0C, 0x66, 0x05, 0x7C, 0x0E, 0x30, 0x06, + 0x8F, 0xEF, 0x02, 0xF1, 0xCD, 0xD0, 0xC7, 0xDF, 0xE5, 0xEB, 0xB5, 0xF7, + 0xFA, 0xEE, 0xBE, 0xF9, 0xF1, 0xDB, 0xD4, 0xE1, 0xE9, 0xEB, 0x23, 0xE9, + 0xBA, 0xFE, 0x48, 0xF7, 0xCC, 0xF0, 0x7E, 0xD3, 0xBA, 0xF3, 0x9C, 0xCE, + 0x8F, 0xFF, 0x9D, 0xFA, 0x88, 0xF4, 0x86, 0x07, 0x86, 0x0B, 0x7A, 0x19, + 0x74, 0x23, 0x40, 0x2F, 0x5E, 0x17, 0xD0, 0x14, 0x53, 0x0E, 0x95, 0xFA, + 0xBA, 0xF3, 0xB8, 0xF8, 0xCE, 0xC8, 0x0E, 0xE8, 0x65, 0xBA, 0x49, 0xD0, + 0xEF, 0xC2, 0xE8, 0xCF, 0x49, 0xD2, 0xB1, 0xDB, 0xC4, 0xF8, 0x8F, 0xED, + 0x64, 0x0C, 0x8B, 0x07, 0x34, 0xFB, 0x2B, 0x1C, 0x9A, 0x11, 0x37, 0x27, + 0x6C, 0x34, 0x2F, 0x20, 0x1B, 0x3B, 0xC0, 0x1D, 0xD6, 0x38, 0x1A, 0x22, + 0xFB, 0x2B, 0xBC, 0x15, 0xF9, 0x25, 0x1E, 0x0E, 0xE6, 0x17, 0x68, 0x02, + 0x5F, 0x09, 0x50, 0xF1, 0xC2, 0xF7, 0xBE, 0xE2, 0xBA, 0xFC, 0xAF, 0xE4, + 0xE8, 0x20, 0xDF, 0xF6, 0x8A, 0x1B, 0x74, 0xF8, 0x9B, 0x05, 0xD0, 0xF5, + 0x25, 0x01, 0x81, 0xFB, 0x1C, 0xF8, 0xFE, 0xFC, 0xC3, 0x06, 0x34, 0x0C, + 0x9E, 0x2C, 0xC1, 0x25, 0x5B, 0x39, 0x9F, 0x22, 0x78, 0x43, 0x8C, 0x30, + 0xD1, 0x56, 0x10, 0x54, 0x4B, 0x4F, 0x0F, 0x54, 0xFC, 0x3B, 0x85, 0x45, + 0xCC, 0x42, 0xA2, 0x3E, 0x8C, 0x31, 0x72, 0x20, 0x5B, 0x15, 0xED, 0x07, + 0x07, 0x36, 0x9D, 0x1C, 0x18, 0x4E, 0x1B, 0x12, 0xFE, 0x32, 0x86, 0xEA, + 0x94, 0x37, 0x94, 0x06, 0xB1, 0x4F, 0x8D, 0x20, 0x71, 0x35, 0x9A, 0xF2, + 0xA2, 0x19, 0xA2, 0xDF, 0x93, 0x21, 0xC9, 0xFE, 0xBB, 0x2E, 0x88, 0x17, + 0x82, 0x43, 0xD3, 0x32, 0x2F, 0x5A, 0xF2, 0x45, 0xDD, 0x57, 0xA7, 0x2D, + 0x4A, 0x4A, 0x34, 0x1F, 0x5A, 0x29, 0xFD, 0x18, 0x6E, 0x12, 0x8A, 0xF8, + 0xB6, 0x16, 0xE8, 0xEF, 0xD7, 0x0A, 0xE2, 0xFE, 0xF3, 0x00, 0x0D, 0x0E, + 0xF4, 0x1F, 0x90, 0x30, 0xCB, 0x41, 0xD0, 0x42, 0x46, 0x3B, 0x61, 0x2F, + 0x83, 0x3F, 0x25, 0x2F, 0xD8, 0x51, 0x38, 0x4C, 0xFF, 0x4A, 0x03, 0x65, + 0x93, 0x42, 0x1C, 0x59, 0x4A, 0x48, 0xA0, 0x3F, 0x3B, 0x41, 0x39, 0x36, + 0x3E, 0x21, 0x5D, 0x1C, 0x68, 0x00, 0x9C, 0xF7, 0x80, 0xE9, 0xBD, 0xE4, + 0xB0, 0xF6, 0x05, 0xE9, 0xF9, 0x13, 0x51, 0xF6, 0x77, 0x12, 0x28, 0xF9, + 0x35, 0xFD, 0x2E, 0xE9, 0xD3, 0xEE, 0x6D, 0xD5, 0x4A, 0xF9, 0xEE, 0xD0, + 0x08, 0x1B, 0x4D, 0xE6, 0x47, 0x2D, 0xF9, 0xFA, 0x85, 0x0D, 0xBE, 0xED, + 0x5F, 0x20, 0xF8, 0x09, 0xAE, 0x59, 0xED, 0x41, 0x18, 0x51, 0xFC, 0x40, + 0x19, 0x39, 0x65, 0x37, 0x38, 0x31, 0x75, 0x3F, 0xC1, 0x08, 0xCD, 0x14, + 0x2F, 0xF5, 0xF4, 0xFF, 0xD9, 0x12, 0xDB, 0x19, 0xF8, 0x0C, 0x38, 0xF9, + 0x6D, 0xE5, 0x1B, 0xCB, 0xDC, 0xEC, 0x8C, 0xEA, 0x16, 0x09, 0xB3, 0x20, + 0xB2, 0xED, 0x3F, 0x0B, 0xB3, 0xD9, 0x81, 0xEC, 0x7D, 0xF5, 0xEF, 0xF4, + 0xA8, 0x10, 0xDE, 0x02, 0x4C, 0x17, 0x00, 0x24, 0x54, 0x07, 0x5B, 0x30, + 0xAE, 0xE8, 0xBD, 0x17, 0xC7, 0xD7, 0x54, 0x0C, 0xA5, 0xD2, 0x72, 0x07, + 0x31, 0xC6, 0xEB, 0xE5, 0x4D, 0xC7, 0xA7, 0xCA, 0x21, 0xD4, 0x8E, 0xDF, + 0x93, 0xEC, 0x67, 0x02, 0x38, 0x0C, 0x93, 0x19, 0xA4, 0x12, 0x98, 0x1D, + 0xD8, 0x0D, 0x4E, 0x0B, 0x47, 0x14, 0xE7, 0x08, 0x3E, 0x25, 0xE6, 0x2A, + 0x3C, 0x1E, 0x5F, 0x32, 0x6B, 0x15, 0x08, 0x1E, 0xB9, 0x2C, 0x9C, 0x2B, + 0xDE, 0x2D, 0x09, 0x34, 0xA4, 0x1F, 0x53, 0x20, 0x95, 0x1F, 0x60, 0x1A, + 0xFF, 0x0F, 0xEE, 0x05, 0xBF, 0x07, 0xCF, 0xDF, 0x04, 0x11, 0x65, 0xE0, + 0x8D, 0x10, 0xBE, 0xF1, 0x30, 0xFC, 0x88, 0xE3, 0xE7, 0xEE, 0x87, 0xE1, + 0x4F, 0x03, 0x75, 0xF7, 0x63, 0x17, 0xFF, 0x08, 0xE7, 0x1A, 0xA6, 0x13, + 0x80, 0x19, 0x99, 0x1A, 0xB2, 0x29, 0xCB, 0x26, 0x79, 0x3E, 0xA5, 0x27, + 0x33, 0x33, 0xEF, 0x22, 0x2B, 0x21, 0xA6, 0x26, 0x96, 0x10, 0x9F, 0x27, + 0x2A, 0xF9, 0x9C, 0x14, 0xF6, 0xFF, 0x3F, 0x1F, 0x89, 0x15, 0x7A, 0x30, + 0x0F, 0x09, 0x92, 0x03, 0x21, 0xE3, 0x3A, 0xE0, 0xF4, 0xE7, 0x7C, 0xF6, + 0x7D, 0xEE, 0x82, 0xFD, 0x79, 0xD2, 0xD3, 0xE3, 0xDA, 0xE1, 0x10, 0xE1, + 0x3C, 0x08, 0x36, 0xF6, 0x0E, 0x07, 0xFA, 0xF4, 0xC5, 0x06, 0x06, 0x07, + 0xAB, 0x17, 0x54, 0x35, 0x58, 0x07, 0x60, 0x26, 0x09, 0xDA, 0x70, 0xF0, + 0x3A, 0xC5, 0xA0, 0xD3, 0xC0, 0xB0, 0x8C, 0xB7, 0x4B, 0x9D, 0x65, 0xA4, + 0x2D, 0xAE, 0x31, 0xA9, 0x04, 0xCA, 0xA8, 0xC4, 0xAA, 0xED, 0xEB, 0xF5, + 0xB8, 0xFD, 0x04, 0x11, 0xF4, 0xF7, 0xAF, 0x13, 0x53, 0x14, 0x60, 0x1B, + 0x04, 0x38, 0x5E, 0x20, 0xBC, 0x28, 0x0F, 0x10, 0xFA, 0x13, 0x81, 0x15, + 0x04, 0x12, 0x29, 0x31, 0xF3, 0xF8, 0x17, 0x2E, 0x89, 0xE7, 0xF7, 0x24, + 0x5E, 0xF2, 0x6E, 0x14, 0x46, 0xF6, 0xC7, 0xF6, 0x97, 0xF0, 0x9E, 0xEB, + 0xA5, 0xE6, 0x31, 0xE7, 0x94, 0xDC, 0x2F, 0xE9, 0xE0, 0xBF, 0x60, 0xCF, + 0x84, 0xB2, 0xF9, 0xCC, 0x5C, 0xBE, 0x7A, 0xF3, 0xAF, 0xCA, 0xC5, 0x06, + 0x1A, 0xD4, 0xBA, 0x11, 0xE2, 0xEE, 0xF0, 0x16, 0xDC, 0x1E, 0x9D, 0x29, + 0x65, 0x2D, 0x03, 0x3C, 0xB0, 0x22, 0xD0, 0x35, 0x8E, 0x09, 0xD2, 0x11, + 0x77, 0xEA, 0x28, 0xE5, 0xAC, 0xD1, 0xAC, 0xD6, 0x9B, 0xD1, 0xEA, 0xEC, + 0x7F, 0xE3, 0x71, 0x00, 0xE6, 0xE0, 0x5A, 0xEE, 0xDD, 0xE3, 0x09, 0xD6, + 0x9E, 0xFA, 0x78, 0xEB, 0x7B, 0xEE, 0x0C, 0xF2, 0x39, 0xCE, 0xC1, 0xCD, + 0x10, 0xD0, 0xA0, 0xD1, 0x30, 0xE5, 0x4E, 0xE5, 0x66, 0xFC, 0xD7, 0xEB, + 0x71, 0x12, 0x5C, 0x02, 0x5D, 0x12, 0xD4, 0x0C, 0x9E, 0x06, 0x33, 0x00, + 0x59, 0x04, 0x50, 0xFA, 0xBD, 0xED, 0x49, 0xF0, 0x53, 0xBF, 0x97, 0xCA, + 0x7B, 0xAA, 0x39, 0xBC, 0x5A, 0xB1, 0x94, 0xC7, 0xC7, 0xC6, 0x3E, 0xCC, + 0x9A, 0xEE, 0xD0, 0xDE, 0x89, 0x06, 0x65, 0xF4, 0x2B, 0x0B, 0xEC, 0x09, + 0xDE, 0x1C, 0xAC, 0x25, 0x46, 0x2C, 0x31, 0x2F, 0x95, 0x20, 0x03, 0x18, + 0x77, 0x15, 0xAD, 0x02, 0x0A, 0x16, 0x91, 0x0F, 0x0B, 0xF2, 0x65, 0x17, + 0x33, 0xD3, 0x09, 0x09, 0xC1, 0xD9, 0xF9, 0x05, 0x12, 0xDD, 0x51, 0x04, + 0x20, 0xEF, 0x60, 0x02, 0xF9, 0xFB, 0x88, 0x09, 0xCB, 0xE9, 0x48, 0xF3, + 0x5D, 0xD5, 0x22, 0xDE, 0x64, 0xCD, 0x55, 0xF9, 0x97, 0xB5, 0x97, 0x01, + 0xA7, 0xB7, 0x2C, 0x02, 0x63, 0xE3, 0xB9, 0x15, 0xDE, 0x00, 0xD0, 0x18, + 0x30, 0x1A, 0xFE, 0x28, 0x9E, 0x2C, 0xDF, 0x4C, 0x3F, 0x23, 0x39, 0x51, + 0xA2, 0x21, 0x3B, 0x4D, 0x21, 0x1E, 0xA8, 0x3D, 0x9D, 0x02, 0xE2, 0x10, + 0x1A, 0x09, 0x4E, 0x0E, 0xE5, 0x1F, 0xB8, 0x15, 0x5E, 0x0B, 0x66, 0xE8, + 0xFC, 0xF4, 0xE5, 0xC5, 0x33, 0x10, 0x23, 0xE5, 0x42, 0x1D, 0x29, 0xED, + 0xD4, 0x09, 0xC1, 0xD8, 0x7C, 0x0C, 0xE4, 0xFA, 0xB8, 0x08, 0xF0, 0x11, + 0xD1, 0xFF, 0x1D, 0x06, 0x4F, 0x12, 0xE6, 0x08, 0x74, 0x25, 0x38, 0x0E, + 0x39, 0x19, 0x7A, 0x04, 0xF2, 0xF3, 0xEF, 0xF9, 0x89, 0xD7, 0xD5, 0xF4, + 0xFB, 0xCD, 0xEA, 0xD7, 0xFB, 0xD9, 0x4F, 0xC4, 0x8E, 0xEC, 0xAE, 0xC5, + 0x35, 0xF9, 0x1D, 0xD3, 0x23, 0x0D, 0x93, 0xFC, 0x13, 0x15, 0xC4, 0x1A, + 0x9D, 0xFC, 0x9D, 0x1C, 0x83, 0x05, 0xB2, 0x27, 0x8E, 0x3A, 0x2C, 0x44, + 0xB3, 0x3A, 0xCF, 0x32, 0x54, 0x1F, 0x2E, 0x0C, 0x6B, 0x22, 0x7F, 0x0E, + 0xCE, 0x0E, 0xB1, 0xFA, 0x84, 0xEE, 0xD3, 0xCD, 0xC1, 0xED, 0xAD, 0xD0, + 0x43, 0xD7, 0xCE, 0xD6, 0x9A, 0xB7, 0x61, 0xC4, 0x73, 0xCC, 0xCC, 0xCB, + 0x2E, 0xE2, 0x55, 0xC2, 0xE4, 0xD8, 0x5F, 0xA8, 0xE0, 0xDC, 0x80, 0xBF, + 0x11, 0xD5, 0x15, 0xDA, 0xA0, 0xD2, 0x3F, 0xE5, 0xBC, 0xF1, 0x80, 0xE5, + 0x3A, 0x09, 0x75, 0xE1, 0x07, 0x0F, 0xC4, 0xEA, 0x26, 0x16, 0xEA, 0xFD, + 0x85, 0x13, 0xF4, 0x0A, 0xD8, 0x02, 0x21, 0x05, 0xA2, 0xF7, 0xD5, 0xEE, + 0x20, 0x01, 0xF7, 0xEA, 0x09, 0x0C, 0xA2, 0xF8, 0x35, 0xF4, 0x17, 0xD3, + 0xCA, 0xCC, 0xDA, 0x9F, 0x1D, 0xC0, 0x06, 0xA6, 0xAB, 0xD2, 0x76, 0xCD, + 0x2C, 0xD2, 0xA6, 0xCD, 0x66, 0xBE, 0x61, 0xAC, 0xDD, 0xCB, 0x3C, 0xBC, + 0xFF, 0xE5, 0xCE, 0xDB, 0x15, 0xEE, 0xD3, 0xDD, 0xCB, 0xEE, 0x24, 0xE7, + 0x3B, 0xDF, 0x75, 0xE4, 0xD3, 0xC6, 0x7B, 0xCC, 0xE9, 0xC2, 0x04, 0xCB, + 0xD9, 0xD2, 0x80, 0xCD, 0xA5, 0xC9, 0x61, 0xAD, 0xF3, 0xAD, 0x0E, 0x9F, + 0x97, 0xC2, 0x90, 0xBE, 0xE1, 0xE3, 0x82, 0xD7, 0x51, 0xEB, 0x8F, 0xEA, + 0x22, 0xFF, 0x56, 0x06, 0x22, 0x14, 0x4D, 0x14, 0x14, 0x25, 0x69, 0x26, + 0x53, 0x2F, 0xD5, 0x30, 0x95, 0x21, 0xF0, 0x1B, 0x50, 0x16, 0x1E, 0x0D, + 0xBD, 0x0E, 0xB9, 0x01, 0x7E, 0x0A, 0xBC, 0xEC, 0xF6, 0x0E, 0xF3, 0xE9, + 0x9D, 0x04, 0x99, 0xEC, 0xFE, 0x08, 0x2F, 0xEA, 0x96, 0x06, 0x30, 0xE0, + 0x8B, 0xE9, 0xEF, 0xD3, 0x49, 0xCB, 0xA4, 0xC3, 0xAE, 0xBD, 0x47, 0xB7, + 0x6B, 0xD8, 0xC2, 0xCD, 0x1A, 0xF8, 0x52, 0xF0, 0x8B, 0x06, 0x4B, 0x0A, + 0x3A, 0x02, 0x37, 0x0B, 0xEA, 0x1B, 0xDB, 0x13, 0x79, 0x4A, 0x96, 0x26, + 0x06, 0x4F, 0x23, 0x26, 0x76, 0x33, 0x1C, 0x20, 0xD0, 0x21, 0xB3, 0x26, + 0xC6, 0x12, 0xA3, 0x25, 0x80, 0x09, 0xF5, 0x1C, 0x1B, 0x16, 0x82, 0x2A, + 0x48, 0x13, 0xD4, 0x20, 0x45, 0x03, 0xA2, 0xFB, 0x5A, 0x0E, 0xED, 0xF9, + 0x99, 0x19, 0x44, 0x09, 0xC3, 0xF5, 0xFE, 0xF1, 0xDF, 0xE0, 0x81, 0xE4, + 0x4B, 0xF4, 0x7C, 0x0D, 0x1A, 0x01, 0x86, 0x27, 0x80, 0x13, 0xF7, 0x29, + 0xEB, 0x27, 0xDD, 0x39, 0x48, 0x20, 0x73, 0x2A, 0x48, 0x11, 0x69, 0x0B, + 0x6E, 0x06, 0x4C, 0x02, 0xDE, 0xF8, 0xD9, 0xE6, 0x7B, 0xEB, 0x9D, 0xC8, + 0x75, 0xE5, 0xC1, 0xCE, 0x46, 0xE8, 0xF0, 0xE1, 0x8F, 0xED, 0x0D, 0xF7, + 0xC8, 0x06, 0x4B, 0x19, 0xF0, 0x2A, 0x54, 0x38, 0xED, 0x4A, 0xA3, 0x3F, + 0x73, 0x5A, 0x05, 0x41, 0x3E, 0x4C, 0xA7, 0x3D, 0xD5, 0x35, 0xB0, 0x32, + 0x3D, 0x1D, 0x4D, 0x29, 0x78, 0x09, 0x0C, 0x1E, 0x6A, 0xFB, 0x90, 0x08, + 0x7F, 0xF6, 0x9F, 0xED, 0x08, 0x06, 0x81, 0xF0, 0x14, 0x1C, 0xFC, 0x01, + 0x89, 0x23, 0x87, 0xFB, 0x70, 0x1F, 0x9C, 0xF3, 0xB2, 0x13, 0x66, 0xFC, + 0xAC, 0x0D, 0xE1, 0x07, 0xBF, 0x13, 0x89, 0x0C, 0xBB, 0x19, 0x79, 0x0E, + 0xA5, 0x25, 0x07, 0x19, 0x69, 0x33, 0xDD, 0x24, 0xE7, 0x4D, 0x22, 0x3D, + 0x10, 0x5F, 0x62, 0x4F, 0x07, 0x5A, 0xA3, 0x44, 0x92, 0x55, 0xF5, 0x43, + 0x27, 0x4F, 0x1E, 0x4F, 0xD7, 0x39, 0x3B, 0x32, 0x80, 0x2C, 0x03, 0x1A, + 0x6B, 0x2C, 0x7E, 0x19, 0x8C, 0x21, 0x86, 0x06, 0x40, 0x09, 0xA9, 0xFC, + 0x48, 0x01, 0x90, 0x18, 0xFA, 0x06, 0x2A, 0x33, 0xD6, 0xF7, 0x5B, 0x1C, + 0x45, 0xF2, 0x67, 0x16, 0x4C, 0x06, 0xA3, 0x38, 0x9E, 0x16, 0xE0, 0x3F, + 0xEA, 0x21, 0x43, 0x41, 0x24, 0x33, 0xFF, 0x47, 0x07, 0x29, 0xA9, 0x31, + 0x29, 0x05, 0x5B, 0x1A, 0x49, 0xDE, 0x31, 0x0D, 0x82, 0xC6, 0x33, 0xF4, + 0x32, 0xC7, 0x97, 0xDC, 0x9A, 0xD1, 0xDC, 0xE2, 0x20, 0xE9, 0x7A, 0xF6, + 0x13, 0x15, 0x14, 0x06, 0x50, 0x37, 0x8C, 0x0F, 0xB1, 0x3E, 0x8F, 0x14, + 0xFB, 0x4D, 0x2A, 0x31, 0x5E, 0x52, 0x60, 0x48, 0x25, 0x36, 0x3F, 0x2F, + 0xF5, 0x27, 0xF6, 0x15, 0x36, 0x29, 0xF1, 0x1E, 0x3A, 0x19, 0xB4, 0x26, + 0xAB, 0x02, 0x81, 0x12, 0xFE, 0xFE, 0x7A, 0xFF, 0x58, 0x09, 0x92, 0x05, + 0x1D, 0x12, 0x84, 0x05, 0x8E, 0x11, 0x41, 0xFC, 0x9F, 0x03, 0xB8, 0xFF, + 0x20, 0xEF, 0xE3, 0xFF, 0x0F, 0xE2, 0x72, 0xFD, 0x20, 0xDF, 0xC7, 0x0E, + 0x1A, 0xF0, 0xA9, 0x2E, 0xAF, 0x0B, 0x52, 0x34, 0x60, 0x11, 0xEA, 0x28, + 0x60, 0x1F, 0xBB, 0x47, 0x9E, 0x34, 0x8A, 0x5D, 0x87, 0x3B, 0x93, 0x52, + 0xA7, 0x30, 0x3E, 0x4B, 0x8E, 0x11, 0xE1, 0x2F, 0x8B, 0xF5, 0x67, 0x05, + 0xAC, 0xFC, 0x13, 0x01, 0x49, 0x0C, 0x01, 0x01, 0x9C, 0xF7, 0x0C, 0xD6, + 0xB5, 0xDA, 0x0B, 0xCA, 0x31, 0xEB, 0x35, 0x00, 0x6F, 0xF3, 0xF9, 0x18, + 0x7F, 0xDC, 0x5B, 0xFF, 0x04, 0xEB, 0x10, 0xF7, 0x90, 0x0A, 0x41, 0xF4, + 0x7D, 0x12, 0xDB, 0xF8, 0x93, 0x0E, 0x78, 0x16, 0x07, 0x0F, 0x15, 0x26, + 0xFD, 0x02, 0x09, 0x1D, 0x57, 0xF0, 0x83, 0x0A, 0x5A, 0xEA, 0x1C, 0xEC, + 0x1D, 0xDA, 0xB9, 0xCC, 0xCF, 0xBF, 0x93, 0xC6, 0x93, 0xD2, 0xA3, 0xD9, + 0x4B, 0x07, 0x4D, 0xF6, 0x58, 0x26, 0xCE, 0x1C, 0x56, 0x23, 0x31, 0x39, + 0xEA, 0x1F, 0xBD, 0x3F, 0xF9, 0x2F, 0xC0, 0x3D, 0xEF, 0x41, 0x1C, 0x39, + 0x49, 0x43, 0x44, 0x2A, 0x2C, 0x2F, 0x79, 0x15, 0x92, 0x24, 0x22, 0x0B, + 0xAB, 0x1A, 0x1A, 0x00, 0x0C, 0xFF, 0x98, 0xEF, 0xD9, 0xE6, 0xD6, 0xE1, + 0x63, 0xDA, 0xD0, 0xE1, 0x81, 0xDE, 0x08, 0xE7, 0x02, 0xE4, 0x25, 0xDF, + 0x83, 0xDE, 0xAD, 0xDB, 0x5F, 0xC8, 0xB5, 0xDF, 0xBA, 0xB9, 0xBF, 0xEA, + 0x1A, 0xCD, 0x34, 0xF5, 0x78, 0xDE, 0x6A, 0x00, 0xEE, 0xD6, 0x7D, 0x01, + 0x99, 0xE6, 0x11, 0x0C, 0xE4, 0x18, 0x4C, 0x31, 0x80, 0x30, 0x1D, 0x3A, + 0x0F, 0x28, 0xCE, 0x2D, 0x86, 0x29, 0xE0, 0x30, 0xED, 0x13, 0x69, 0x20, + 0x1E, 0xE8, 0xA9, 0x00, 0x35, 0xE9, 0x1A, 0x05, 0xC3, 0xED, 0x13, 0xF5, + 0x76, 0xE5, 0x5D, 0xCD, 0x34, 0xEE, 0x69, 0xD0, 0x84, 0x02, 0x20, 0xEB, + 0xAD, 0xFA, 0xFD, 0xED, 0xF8, 0xD1, 0xFE, 0xD9, 0x4A, 0xD3, 0x64, 0xE4, + 0x92, 0xFA, 0x92, 0xF3, 0x95, 0x04, 0xF5, 0xED, 0x88, 0xFA, 0xD6, 0xFE, + 0xAB, 0xF8, 0x07, 0x17, 0xD4, 0xE7, 0xD5, 0x15, 0xF6, 0xD2, 0xF8, 0xF7, + 0x01, 0xCA, 0x6A, 0xCE, 0xC9, 0xB3, 0x35, 0xA9, 0x2E, 0x9F, 0x0B, 0x9D, + 0x83, 0xB6, 0xA8, 0xBF, 0x59, 0xCD, 0x4D, 0xD9, 0xB3, 0xCE, 0xEA, 0xE6, + 0x43, 0xDB, 0x90, 0xFF, 0x14, 0xEE, 0xBC, 0x13, 0xF3, 0x09, 0x43, 0x26, + 0xCD, 0x1A, 0xDF, 0x18, 0x98, 0x05, 0xD9, 0xF6, 0xF6, 0xF1, 0x98, 0xEF, + 0xDA, 0xF7, 0x49, 0x01, 0xE3, 0xF9, 0xA3, 0x01, 0xDD, 0xDD, 0x6E, 0xDC, + 0xA0, 0xC0, 0x44, 0xC5, 0x80, 0xCD, 0x97, 0xC5, 0xAA, 0xD4, 0x17, 0xBA, + 0xCD, 0xC4, 0x8D, 0xB7, 0xBA, 0xC9, 0x3B, 0xCC, 0xA0, 0xBF, 0xE9, 0xD0, + 0x1C, 0xB3, 0x37, 0xC4, 0x41, 0xC1, 0x55, 0xCA, 0xA6, 0xD3, 0xA6, 0xE2, + 0x3F, 0xDF, 0xC0, 0xE4, 0xC9, 0xF4, 0xA5, 0xE4, 0x80, 0x22, 0xA1, 0xFF, + 0x8E, 0x2F, 0x64, 0x0B, 0x93, 0x24, 0x36, 0x09, 0x4D, 0x16, 0xE5, 0x0A, + 0xC4, 0xEC, 0xB4, 0xFD, 0x04, 0xCF, 0x63, 0xE2, 0x6A, 0xDC, 0xF9, 0xDF, + 0x56, 0xED, 0x6B, 0xD8, 0xF4, 0xE0, 0x19, 0xB0, 0x19, 0xE6, 0xFF, 0xA5, + 0xAB, 0xFD, 0xE9, 0xC4, 0x7F, 0xE6, 0x15, 0xCC, 0x15, 0xDB, 0x05, 0xC1, + 0x7A, 0xF4, 0x3F, 0xD6, 0xF2, 0xF6, 0x8C, 0xF0, 0xC2, 0xF3, 0x22, 0xF9, + 0x0D, 0x0D, 0xB4, 0x08, 0xC3, 0x15, 0xAF, 0x07, 0x13, 0xF6, 0x8F, 0xED, + 0xED, 0xDF, 0xC5, 0xDE, 0x81, 0xC6, 0x27, 0xCE, 0xCF, 0xA7, 0x4B, 0xAD, + 0x3E, 0xA6, 0x76, 0x9B, 0x5E, 0xBA, 0xCC, 0xAE, 0x2C, 0xE3, 0x8C, 0xE0, + 0xE9, 0x00, 0xF8, 0x09, 0x10, 0xF9, 0x24, 0x1B, 0xB4, 0x00, 0xC4, 0x34, + 0x7E, 0x20, 0x1D, 0x47, 0xE4, 0x20, 0x33, 0x43, 0x65, 0x0C, 0x21, 0x38, + 0x4A, 0x0B, 0x27, 0x2C, 0xF4, 0x08, 0xF0, 0x22, 0xCC, 0xF5, 0xE1, 0x0D, + 0x77, 0xEE, 0xD7, 0xFD, 0xA1, 0xF1, 0x88, 0xF5, 0x3E, 0xED, 0x02, 0xF2, + 0x0A, 0xEB, 0x36, 0xEF, 0x8E, 0xF2, 0xAB, 0xDF, 0xC1, 0xF3, 0x2D, 0xD9, + 0x26, 0xE4, 0x52, 0xD3, 0x02, 0xE6, 0x63, 0xD9, 0x32, 0xF1, 0xB4, 0xEF, + 0x68, 0xFA, 0x0E, 0xFF, 0x95, 0x09, 0xBC, 0xFE, 0xE0, 0x27, 0x77, 0x0B, + 0x6A, 0x4C, 0x52, 0x28, 0x09, 0x49, 0xE9, 0x27, 0x0E, 0x2B, 0x78, 0x26, + 0x83, 0x28, 0x2A, 0x2D, 0x0D, 0x2B, 0xBD, 0x0A, 0x74, 0x12, 0x5A, 0xE8, + 0xAB, 0x12, 0x7B, 0xF5, 0xC9, 0x0F, 0x03, 0xF0, 0x73, 0xE8, 0xE1, 0xCD, + 0x4A, 0xED, 0x43, 0xDB, 0xE6, 0x08, 0x6A, 0xF7, 0xD2, 0xEA, 0x66, 0xDF, + 0xAC, 0xCC, 0xFC, 0xDD, 0x06, 0xE9, 0x4D, 0x0E, 0x98, 0x0F, 0xD8, 0x17, + 0x7C, 0x20, 0x11, 0x11, 0x5E, 0x27, 0xC0, 0x1F, 0x67, 0x1E, 0x5F, 0x1F, + 0x71, 0x03, 0x2B, 0x10, 0xC7, 0xE5, 0xB9, 0x00, 0x52, 0xD1, 0x8E, 0xE4, + 0x41, 0xC0, 0x8A, 0xBA, 0xA6, 0xB5, 0x25, 0xAB, 0xE3, 0xC7, 0xD8, 0xC1, + 0xC8, 0xEB, 0x0E, 0xD9, 0x64, 0x0B, 0x5B, 0xE6, 0x9E, 0x24, 0x07, 0x01, + 0x67, 0x3B, 0x4D, 0x32, 0x74, 0x4C, 0x34, 0x4B, 0xDB, 0x44, 0x56, 0x36, + 0xAB, 0x28, 0x9B, 0x0F, 0x12, 0x0F, 0x78, 0xF0, 0xE6, 0xFB, 0x55, 0xE8, + 0x55, 0xDC, 0xF6, 0xDB, 0x03, 0xD7, 0xF7, 0xD9, 0x95, 0xF3, 0x7E, 0xE2, + 0x73, 0xFC, 0x3C, 0xE4, 0x61, 0xEF, 0xB1, 0xE9, 0x5B, 0xE4, 0x0D, 0xDF, + 0x9A, 0xDD, 0x2B, 0xCA, 0xD7, 0xCF, 0x44, 0xC0, 0x86, 0xBA, 0xA7, 0xC1, + 0x5B, 0xAF, 0xFE, 0xD3, 0x04, 0xBB, 0xAE, 0xEB, 0xD7, 0xCC, 0x4A, 0xF3, + 0xE7, 0xF9, 0x0C, 0x07, 0xD4, 0x27, 0xCF, 0x1E, 0xE7, 0x24, 0xCB, 0x26, + 0x42, 0x0E, 0x86, 0x1F, 0x60, 0x12, 0x2F, 0x13, 0x29, 0x0C, 0xA8, 0xF8, + 0x77, 0xF9, 0xA1, 0xDC, 0xAF, 0xF8, 0xD8, 0xDC, 0x3E, 0xE4, 0x83, 0xDC, + 0x6A, 0xC4, 0x68, 0xCE, 0x5F, 0xD4, 0x80, 0xD3, 0xC3, 0xFB, 0x13, 0xE2, + 0x5F, 0xEF, 0x92, 0xD0, 0x03, 0xDC, 0x44, 0xD9, 0x82, 0xE8, 0xB1, 0x02, + 0x9D, 0xFA, 0xC3, 0x0C, 0x61, 0x03, 0x95, 0x02, 0x0D, 0x09, 0x46, 0xFA, + 0xBB, 0x13, 0x8C, 0xF6, 0x50, 0x08, 0xAB, 0xF5, 0x8E, 0xF5, 0x10, 0xF0, + 0x1E, 0xE4, 0xD3, 0xD4, 0x5B, 0xC6, 0x3C, 0xAB, 0x22, 0xC2, 0x26, 0x9D, + 0x3C, 0xDD, 0x23, 0xB9, 0x70, 0xF3, 0x7A, 0xCE, 0xD9, 0x07, 0x6B, 0xDD, + 0x12, 0x2D, 0xD9, 0x0B, 0x4F, 0x57, 0xE0, 0x34, 0xDD, 0x5F, 0xBB, 0x36, + 0xAC, 0x43, 0x98, 0x29, 0x7C, 0x29, 0xBE, 0x18, 0x9C, 0x14, 0x37, 0x00, + 0x42, 0xFD, 0x0A, 0xF2, 0x02, 0xE6, 0xA5, 0xEB, 0x9E, 0xE0, 0x36, 0xE2, + 0xD5, 0xF9, 0x2F, 0xE8, 0xEB, 0x19, 0x45, 0xFF, 0xBC, 0x1C, 0xE7, 0x06, + 0xC7, 0xFF, 0xA4, 0xF8, 0xBA, 0xDE, 0x53, 0xE9, 0x9C, 0xCE, 0x16, 0xE3, + 0x9B, 0xCD, 0x5F, 0xE0, 0x6D, 0xDD, 0x85, 0xF6, 0x9D, 0xF0, 0x80, 0x19, + 0x16, 0x05, 0x4B, 0x26, 0x4A, 0x32, 0x74, 0x41, 0x9B, 0x41, 0x2A, 0x50, + 0x10, 0x31, 0x4E, 0x45, 0xE6, 0x35, 0xEA, 0x4D, 0x8E, 0x3C, 0xAD, 0x4B, + 0x9B, 0x28, 0x91, 0x20, 0x34, 0x23, 0xBF, 0x08, 0x0F, 0x25, 0x6B, 0x12, + 0x51, 0x06, 0xD5, 0x01, 0x6C, 0xF6, 0xFC, 0xEA, 0x34, 0x1D, 0x8D, 0x0A, + 0x81, 0x2F, 0x15, 0x16, 0xA1, 0x0F, 0xF9, 0xF4, 0x71, 0x0B, 0xA9, 0x14, + 0xD9, 0x1B, 0xC3, 0x43, 0x69, 0x19, 0x95, 0x41, 0x0E, 0x1E, 0x34, 0x4C, + 0x72, 0x2E, 0x31, 0x64, 0x98, 0x23, 0xCB, 0x4E, 0xD9, 0x16, 0xC9, 0x29, + 0xDD, 0x1F, 0x6D, 0x1A, 0x89, 0x14, 0xC1, 0xFF, 0x11, 0xF0, 0x22, 0xDB, + 0x87, 0xE4, 0xB0, 0xE2, 0x38, 0xFB, 0xAE, 0x07, 0xCF, 0x13, 0x59, 0x19, + 0x36, 0x24, 0x9C, 0x2A, 0x99, 0x3B, 0xC7, 0x48, 0x80, 0x56, 0x1A, 0x5C, + 0xDE, 0x5D, 0x52, 0x61, 0x05, 0x4F, 0xA6, 0x55, 0x64, 0x3C, 0x81, 0x37, + 0x40, 0x34, 0x06, 0x2A, 0xAB, 0x25, 0xBA, 0x16, 0xF3, 0x17, 0x8A, 0xF3, + 0x5A, 0x25, 0xBF, 0xF8, 0xD8, 0x41, 0x73, 0x14, 0xB6, 0x4C, 0xFE, 0x19, + 0xE7, 0x42, 0xFE, 0x1A, 0x45, 0x3B, 0xAE, 0x27, 0x7D, 0x2E, 0xCE, 0x2C, + 0x88, 0x26, 0xE4, 0x2D, 0xBA, 0x1E, 0x42, 0x33, 0x6F, 0x10, 0x9D, 0x3A, + 0x06, 0x0B, 0x48, 0x38, 0x36, 0x16, 0xAE, 0x3A, 0xB3, 0x3B, 0xB0, 0x55, + 0x55, 0x5A, 0xF7, 0x5F, 0xE4, 0x58, 0x9C, 0x58, 0xFC, 0x50, 0x01, 0x59, + 0x02, 0x50, 0x7B, 0x58, 0xC1, 0x38, 0x42, 0x41, 0x69, 0x20, 0x34, 0x2F, + 0x73, 0x1D, 0x3B, 0x23, 0x64, 0x18, 0x19, 0x01, 0x0A, 0x16, 0xB0, 0xF8, + 0x95, 0x26, 0x41, 0x1D, 0xAF, 0x1E, 0x7D, 0x21, 0x98, 0x07, 0xA6, 0x06, + 0x16, 0x1C, 0xDF, 0x10, 0xE0, 0x39, 0x8E, 0x21, 0x6C, 0x37, 0x0C, 0x1B, + 0x4C, 0x2A, 0x1D, 0x2A, 0x8B, 0x21, 0xEA, 0x46, 0x8B, 0x12, 0xA9, 0x3F, + 0x2C, 0x07, 0x5F, 0x23, 0xDF, 0xFD, 0xBD, 0xFD, 0xD0, 0xE6, 0xE8, 0xD3, + 0x8E, 0xCF, 0x2F, 0xBF, 0x80, 0xBE, 0x3D, 0xC8, 0x70, 0xBC, 0xA4, 0xD9, + 0x6A, 0xD4, 0x3C, 0xE8, 0x71, 0xF1, 0x9F, 0x03, 0xFF, 0x16, 0xE2, 0x2F, + 0xAA, 0x39, 0xF0, 0x55, 0xD2, 0x37, 0xB4, 0x5A, 0xF6, 0x19, 0x4E, 0x46, + 0x3B, 0x04, 0xB1, 0x33, 0x6B, 0xFC, 0xE9, 0x22, 0xA4, 0xE2, 0x51, 0xFB, + 0x72, 0xCD, 0xAF, 0xD7, 0x56, 0xD6, 0x4E, 0xCE, 0x8A, 0xE9, 0x05, 0xD4, + 0x66, 0xF2, 0xED, 0xEB, 0x9A, 0xF1, 0x19, 0x00, 0xA9, 0xF1, 0xF8, 0x0D, + 0x1A, 0xEB, 0xB5, 0x0D, 0x71, 0xEA, 0x7E, 0x00, 0xB7, 0xE6, 0x5B, 0xFC, + 0x20, 0xE6, 0x51, 0xFC, 0xEB, 0xF3, 0x16, 0xFA, 0x0A, 0x0B, 0x71, 0x0A, + 0x26, 0x31, 0xDD, 0x35, 0xDB, 0x47, 0xEE, 0x4D, 0xF6, 0x41, 0x25, 0x4E, + 0xDF, 0x41, 0x81, 0x5A, 0xB3, 0x3A, 0xC2, 0x46, 0xA2, 0x14, 0xC4, 0x14, + 0x84, 0x01, 0xE8, 0x06, 0xA9, 0x0B, 0x80, 0x05, 0xE3, 0x03, 0x5A, 0xEB, + 0xDB, 0xF3, 0x78, 0xE0, 0xD4, 0xF4, 0x83, 0x0A, 0x19, 0xF5, 0x2D, 0x1B, + 0x81, 0xFA, 0x5F, 0x0A, 0x9D, 0x15, 0xCC, 0x10, 0x12, 0x24, 0x0B, 0x0E, + 0xBC, 0x14, 0xBE, 0x05, 0x1E, 0x12, 0x05, 0x11, 0x90, 0x19, 0x48, 0x1A, + 0xE0, 0x16, 0x0E, 0x19, 0xA6, 0x05, 0xD7, 0x0C, 0x3E, 0xEC, 0xA6, 0xF2, + 0x4E, 0xDC, 0x69, 0xD8, 0x1B, 0xD4, 0xD7, 0xC1, 0xD9, 0xD5, 0x8D, 0xB4, + 0xEB, 0xD9, 0x27, 0xC0, 0x14, 0xDF, 0xE8, 0xDD, 0xC6, 0xED, 0xD4, 0xF8, + 0xBC, 0x03, 0xEC, 0x18, 0xD2, 0x27, 0x76, 0x42, 0x89, 0x42, 0x16, 0x51, + 0xAD, 0x32, 0xF5, 0x41, 0x62, 0x11, 0x2A, 0x32, 0x22, 0xF7, 0x84, 0x19, + 0x13, 0xDD, 0x4F, 0xFA, 0xCA, 0xC1, 0x0B, 0xE5, 0xB0, 0xBD, 0x36, 0xE0, + 0x56, 0xD2, 0x85, 0xE5, 0xF0, 0xDD, 0x12, 0xDB, 0x45, 0xE9, 0x34, 0xD5, + 0xD7, 0xF0, 0x84, 0xE4, 0x8A, 0xD8, 0x1A, 0xE6, 0x21, 0xC4, 0x6B, 0xDC, + 0x67, 0xC6, 0x9A, 0xD6, 0x63, 0xDD, 0x7A, 0xD9, 0xE7, 0xF6, 0x27, 0xDE, + 0xF0, 0x00, 0x0A, 0xF1, 0x60, 0x08, 0xC4, 0x0F, 0xAD, 0x14, 0xE0, 0x22, + 0x22, 0x23, 0xD5, 0x1F, 0x63, 0x32, 0x78, 0x1D, 0xF8, 0x1F, 0x34, 0x0F, + 0x44, 0xFA, 0x57, 0xF3, 0x0F, 0xF0, 0x18, 0xF6, 0xBE, 0xE9, 0xA7, 0xED, + 0xC4, 0xDD, 0xE6, 0xC6, 0xCB, 0xE0, 0x52, 0xC6, 0xC3, 0xEC, 0x40, 0xE6, + 0x4E, 0xDE, 0x6D, 0xDD, 0xB9, 0xCE, 0xFF, 0xD9, 0x91, 0xE6, 0x87, 0xFD, + 0xE1, 0xFF, 0x4B, 0x0B, 0xBE, 0xFA, 0x2A, 0x04, 0xEB, 0xEA, 0x74, 0x08, + 0x19, 0xE6, 0x6C, 0xFF, 0x4A, 0xEF, 0x35, 0xEF, 0x73, 0xE7, 0x5C, 0xE1, + 0x53, 0xD4, 0x71, 0xD1, 0x84, 0xC4, 0xEC, 0xCB, 0xBE, 0xB8, 0x72, 0xC3, + 0xE6, 0xBB, 0xBD, 0xBA, 0x8A, 0xC6, 0xD7, 0xB8, 0x85, 0xDF, 0x92, 0xCB, + 0x44, 0xFB, 0x89, 0xF7, 0x26, 0x1C, 0x98, 0x23, 0x46, 0x3B, 0x7D, 0x35, + 0x13, 0x3B, 0xDD, 0x27, 0x7C, 0x2B, 0xB8, 0x0E, 0x47, 0x1A, 0xCA, 0x04, + 0xAB, 0xFB, 0xA8, 0xFC, 0x09, 0xD2, 0x5F, 0xE1, 0x04, 0xC4, 0x24, 0xD5, + 0x7F, 0xCB, 0x7E, 0xD9, 0xC2, 0xDB, 0x08, 0xD2, 0x46, 0xF6, 0x10, 0xBF, + 0x39, 0xF2, 0x2C, 0xBC, 0xB6, 0xDF, 0x4A, 0xCA, 0xD8, 0xDB, 0xD3, 0xCB, + 0xAB, 0xDD, 0xF2, 0xD3, 0x03, 0xDE, 0x16, 0xE3, 0x67, 0xE2, 0x3F, 0xEA, + 0x24, 0xEA, 0x3F, 0xEF, 0x1A, 0xF5, 0x65, 0xFC, 0xAE, 0x02, 0x85, 0x01, + 0xBE, 0x0D, 0x9C, 0xF6, 0x97, 0x0E, 0x99, 0xFF, 0x12, 0x1B, 0xBB, 0x1E, + 0x0E, 0x1D, 0x5B, 0x0D, 0x45, 0x03, 0xC4, 0xEC, 0x83, 0xEF, 0x17, 0xF0, + 0x6B, 0xDC, 0x40, 0xDF, 0x0A, 0xCB, 0x5D, 0xBC, 0xC1, 0xD0, 0x3E, 0xC9, + 0x41, 0xE6, 0x3A, 0xE6, 0x49, 0xE6, 0xE0, 0xE3, 0x3E, 0xDC, 0x31, 0xFD, + 0x34, 0xEA, 0x43, 0x26, 0x8E, 0xEB, 0xC3, 0x27, 0xCD, 0xE5, 0x5F, 0x1B, + 0x55, 0xFC, 0xBA, 0x1A, 0x73, 0x09, 0xB9, 0x13, 0xF9, 0x07, 0x6E, 0x0C, + 0xE9, 0xFB, 0x42, 0x04, 0x11, 0xDA, 0x72, 0xE9, 0x21, 0xBA, 0x78, 0xCE, + 0x8E, 0xB7, 0x00, 0xC6, 0xD1, 0xC6, 0xF3, 0xC4, 0xB6, 0xD7, 0x29, 0xCB, + 0x0A, 0xEF, 0x9F, 0xE6, 0x73, 0x10, 0x9B, 0x06, 0x9B, 0x3B, 0x69, 0x16, + 0x52, 0x5A, 0x9F, 0x23, 0x2C, 0x51, 0x77, 0x1E, 0x4F, 0x2F, 0xD2, 0xFA, + 0x31, 0x1C, 0x79, 0xE8, 0xA9, 0x0D, 0x78, 0xE3, 0xE4, 0xFE, 0x5B, 0xD0, + 0xA7, 0x01, 0xC6, 0xCF, 0x23, 0xFC, 0xF7, 0xE5, 0x43, 0xF4, 0x64, 0xE7, + 0x84, 0xF3, 0x7B, 0xE2, 0x9A, 0xF7, 0xFB, 0xEB, 0x30, 0xF0, 0x93, 0xDE, + 0x52, 0xE1, 0x90, 0xCE, 0x49, 0xDF, 0x66, 0xD2, 0x7E, 0xD3, 0x1D, 0xDC, + 0xF7, 0xDA, 0xBB, 0xE8, 0xA6, 0xEE, 0xB0, 0xF8, 0xF1, 0x00, 0xB9, 0x0E, + 0x8B, 0x15, 0x35, 0x14, 0x39, 0x17, 0x3F, 0x15, 0xB4, 0x10, 0x98, 0x1E, + 0x04, 0x12, 0x5E, 0x24, 0x5D, 0x10, 0x6B, 0x0C, 0x30, 0x03, 0xC0, 0xF0, + 0x3E, 0xF9, 0xF7, 0xE4, 0xD8, 0xE1, 0x33, 0xCC, 0xC2, 0xBA, 0x6F, 0xBF, + 0xE1, 0xC5, 0x16, 0xC6, 0x47, 0xEB, 0xC3, 0xD1, 0xFA, 0xEA, 0xC6, 0xD9, + 0x70, 0xF1, 0xE4, 0xDD, 0x17, 0x0D, 0x7F, 0xEE, 0x5D, 0x11, 0x2D, 0xF9, + 0x7E, 0x0B, 0xE7, 0xF7, 0x50, 0x0D, 0x73, 0xFD, 0x88, 0xFC, 0x1B, 0x0A, + 0x1D, 0xE9, 0x7D, 0x07, 0x97, 0xE7, 0xAE, 0xED, 0xFF, 0xD7, 0x91, 0xCF, + 0x10, 0xBF, 0xD1, 0xAD, 0x5A, 0xB7, 0x20, 0x9B, 0xC3, 0xB0, 0x02, 0xA3, + 0x16, 0xB9, 0x41, 0xC0, 0x90, 0xDE, 0x20, 0xE3, 0x43, 0x02, 0x12, 0xFD, + 0x7E, 0x16, 0xB2, 0x19, 0xA1, 0x20, 0x59, 0x2E, 0x38, 0x1E, 0x05, 0x28, + 0x02, 0x0D, 0xEE, 0x1F, 0x68, 0xF3, 0x20, 0x0E, 0x75, 0xE1, 0xCA, 0xE0, + 0x11, 0xD7, 0x40, 0xC5, 0xED, 0xD9, 0x81, 0xBB, 0xCF, 0xDB, 0xF4, 0xB2, + 0x24, 0xD0, 0x77, 0xC2, 0xF1, 0xCC, 0x40, 0xDA, 0xA0, 0xD5, 0xB7, 0xE3, + 0xEB, 0xE1, 0xB2, 0xDF, 0x17, 0xEF, 0x22, 0xDA, 0xD2, 0xE2, 0x23, 0xD7, + 0x07, 0xC6, 0xDE, 0xE5, 0x8F, 0xCD, 0xCC, 0xFB, 0xAC, 0xEE, 0xF3, 0x07, + 0x32, 0x03, 0x70, 0x1A, 0x0E, 0x18, 0xFA, 0x1E, 0x8F, 0x39, 0x50, 0x1C, + 0xFA, 0x48, 0x0A, 0x27, 0xE1, 0x3E, 0xC0, 0x27, 0x36, 0x1B, 0x04, 0x0A, + 0xBA, 0x00, 0x99, 0xF3, 0x8C, 0x00, 0xD3, 0xED, 0xDB, 0xF2, 0x26, 0xD8, + 0xB3, 0xDD, 0xF2, 0xC5, 0x72, 0xE4, 0x7B, 0xD3, 0x11, 0xF2, 0x3B, 0xD8, + 0xEF, 0xF5, 0x39, 0xCC, 0x1C, 0x05, 0xB8, 0xDC, 0x8F, 0x15, 0x0E, 0xF5, + 0xF9, 0x0E, 0x2C, 0xFC, 0x18, 0x07, 0x06, 0x0F, 0xB8, 0x06, 0xCF, 0x1D, + 0xBA, 0xF2, 0xB4, 0x13, 0x48, 0xDC, 0x2F, 0xFD, 0x4D, 0xDD, 0x7C, 0xD7, + 0xDB, 0xE5, 0xA9, 0xB6, 0x10, 0xD7, 0x3F, 0xB9, 0x92, 0xC6, 0xF2, 0xC7, + 0xC2, 0xCF, 0x2D, 0xCF, 0xAB, 0xE6, 0xED, 0xF1, 0xE9, 0x09, 0xF3, 0x18, + 0xE0, 0x21, 0xAA, 0x2A, 0x6D, 0x28, 0x87, 0x3F, 0x4F, 0x38, 0x0A, 0x4E, + 0x4E, 0x39, 0x7B, 0x48, 0x70, 0x20, 0xCD, 0x37, 0xBB, 0x0F, 0x19, 0x2A, + 0xD9, 0x09, 0xA8, 0x12, 0x4A, 0x06, 0xCF, 0xF2, 0x31, 0x08, 0x7A, 0xED, + 0xB5, 0x0A, 0x3C, 0xFA, 0x46, 0x06, 0x4F, 0xFE, 0x90, 0x07, 0xBB, 0x02, + 0xE4, 0x11, 0x17, 0x14, 0xD4, 0x13, 0xF7, 0x14, 0xE8, 0x19, 0x04, 0x06, + 0x1F, 0x14, 0x8D, 0x0D, 0x43, 0x02, 0xED, 0x19, 0x6D, 0xFB, 0xCD, 0x17, + 0xA2, 0x09, 0x1E, 0x1D, 0x27, 0x28, 0xD2, 0x24, 0x70, 0x32, 0x1A, 0x31, + 0xCF, 0x32, 0x43, 0x46, 0x05, 0x3A, 0x50, 0x4F, 0x99, 0x38, 0xFE, 0x3C, + 0x8A, 0x2A, 0xF9, 0x17, 0x8F, 0x1F, 0x08, 0x0B, 0x1E, 0x13, 0xF8, 0x0C, + 0xF4, 0xFC, 0x78, 0xFE, 0x67, 0xF9, 0x19, 0xF8, 0xDC, 0x0E, 0x27, 0x0E, + 0x04, 0x11, 0xE2, 0x12, 0x3E, 0xFF, 0x12, 0x03, 0x36, 0x01, 0xFB, 0x14, + 0x34, 0x13, 0x83, 0x2F, 0xB1, 0x23, 0xAD, 0x2E, 0x9B, 0x3F, 0x42, 0x32, + 0xB8, 0x53, 0xD3, 0x3B, 0x8A, 0x41, 0x4D, 0x2D, 0x0E, 0x25, 0x7F, 0x0E, + 0xC1, 0x0D, 0xAC, 0xF5, 0xDF, 0xFA, 0x81, 0xE7, 0xE2, 0xF4, 0x9D, 0xE1, + 0x24, 0x05, 0xEF, 0xEE, 0xE4, 0x1F, 0x9E, 0x0A, 0x05, 0x36, 0x10, 0x24, + 0xC6, 0x4B, 0x69, 0x43, 0x13, 0x5B, 0x27, 0x5E, 0x3E, 0x5E, 0x72, 0x60, + 0x0C, 0x54, 0x2B, 0x5E, 0x24, 0x41, 0x48, 0x58, 0xEA, 0x35, 0x60, 0x51, + 0x04, 0x31, 0x11, 0x4B, 0x75, 0x1D, 0x24, 0x36, 0xB0, 0x11, 0x9A, 0x20, + 0xC0, 0x1E, 0x1C, 0x21, 0xDF, 0x2A, 0x39, 0x2D, 0x25, 0x2B, 0x76, 0x19, + 0xEB, 0x1D, 0x42, 0x08, 0x66, 0x0F, 0xC7, 0x1C, 0x0D, 0x07, 0xF5, 0x26, + 0xE9, 0xFB, 0x02, 0x1D, 0xE6, 0xF7, 0x9D, 0x0B, 0xFD, 0x08, 0xB9, 0xFF, + 0x0A, 0x1A, 0xB8, 0xFA, 0xC8, 0x1E, 0x3E, 0x0D, 0x95, 0x22, 0xF5, 0x2D, + 0x75, 0x2C, 0x85, 0x31, 0x9E, 0x31, 0x50, 0x2E, 0xB2, 0x28, 0x0F, 0x38, + 0x9E, 0x14, 0x9B, 0x2C, 0x42, 0x05, 0x62, 0x0B, 0xFE, 0x06, 0xBB, 0xFB, + 0x08, 0x0E, 0x9B, 0xF5, 0x9F, 0x09, 0xCB, 0xE4, 0x55, 0x00, 0xAC, 0xE4, + 0x60, 0xF5, 0xF6, 0xF4, 0x94, 0xE6, 0xE9, 0xF5, 0xEE, 0xE2, 0x47, 0x01, + 0xA2, 0xF6, 0x2B, 0x1C, 0xC8, 0x0A, 0x4E, 0x24, 0xD4, 0x01, 0x3F, 0x2C, + 0x20, 0x02, 0x07, 0x32, 0xED, 0x14, 0x82, 0x2B, 0x34, 0x1E, 0xF8, 0x28, + 0xB0, 0x13, 0xF0, 0x16, 0x79, 0xF3, 0xC9, 0xF0, 0xC6, 0xD2, 0xC0, 0xD1, + 0x17, 0xC7, 0x5C, 0xCA, 0xA1, 0xCA, 0xBC, 0xCE, 0x54, 0xCC, 0xD3, 0xDD, + 0xF7, 0xE4, 0xD2, 0xFC, 0xF3, 0x12, 0x86, 0x29, 0xB2, 0x33, 0x1F, 0x4C, + 0x8D, 0x44, 0x60, 0x4D, 0xD8, 0x48, 0x8D, 0x45, 0x47, 0x3B, 0x1F, 0x31, + 0x94, 0x21, 0x10, 0x0E, 0xE9, 0x09, 0xE2, 0xF4, 0x8D, 0xE7, 0xFB, 0xEE, + 0x5B, 0xCE, 0xE7, 0xF4, 0xED, 0xDA, 0xA1, 0xF6, 0xBD, 0xFE, 0xCA, 0xFE, + 0x5B, 0x1F, 0xAC, 0x05, 0xF6, 0x1E, 0x8A, 0x09, 0x7B, 0x0F, 0x6B, 0x19, + 0x12, 0x02, 0x86, 0x20, 0xD1, 0xF7, 0xEE, 0x12, 0x61, 0xF8, 0x6E, 0x04, + 0x50, 0xFF, 0xB1, 0x11, 0xFF, 0x09, 0x4A, 0x1C, 0x20, 0x1C, 0xE8, 0x29, + 0xF1, 0x30, 0x1F, 0x46, 0x95, 0x4D, 0x1C, 0x4E, 0x1F, 0x5B, 0xE6, 0x48, + 0x8A, 0x4F, 0xFD, 0x43, 0xB2, 0x3F, 0xA0, 0x29, 0xB5, 0x2A, 0x37, 0x0D, + 0x83, 0x20, 0xC5, 0x05, 0x11, 0x18, 0xB4, 0xEF, 0x68, 0x05, 0xA1, 0xCF, + 0x05, 0x06, 0xA2, 0xD7, 0xCC, 0x11, 0xB4, 0xF8, 0xE1, 0x07, 0xFC, 0x04, + 0xA3, 0x00, 0x1D, 0x0E, 0x9B, 0x16, 0xFA, 0x29, 0xB7, 0x20, 0x26, 0x36, + 0xDC, 0x15, 0x0B, 0x20, 0xAB, 0x09, 0xDA, 0x1C, 0xB2, 0xF7, 0xA3, 0x2D, + 0xB7, 0xE6, 0xC0, 0x28, 0xF7, 0xDC, 0x1E, 0x0D, 0x86, 0xD6, 0x70, 0xE6, + 0x33, 0xCB, 0xF7, 0xCA, 0x5F, 0xBF, 0x8D, 0xC1, 0x52, 0xC2, 0xD2, 0xC6, + 0x38, 0xCB, 0x95, 0xDA, 0x1B, 0xD5, 0x71, 0xF6, 0xF6, 0xF3, 0x4D, 0x15, + 0x31, 0x21, 0x5F, 0x2F, 0xFE, 0x2F, 0x7C, 0x3E, 0x62, 0x23, 0x45, 0x31, + 0xC7, 0x11, 0x25, 0x07, 0xFA, 0xEE, 0x92, 0xD9, 0xF1, 0xC6, 0x2E, 0xBF, + 0x2C, 0xB1, 0x20, 0xB6, 0xFD, 0xB7, 0x8D, 0xA7, 0x30, 0xC3, 0xBB, 0xA6, + 0x3F, 0xCE, 0xBD, 0xBF, 0xD0, 0xDC, 0x0E, 0xCD, 0xF9, 0xDD, 0x08, 0xDD, + 0x0C, 0xD8, 0xC7, 0xEC, 0xD7, 0xD2, 0x33, 0xE0, 0x05, 0xC6, 0xE2, 0xCD, + 0x73, 0xB5, 0x66, 0xC9, 0x43, 0xAC, 0x8C, 0xCB, 0x25, 0xBE, 0xF9, 0xC9, + 0xA2, 0xDC, 0xD8, 0xDC, 0x93, 0xE7, 0x0F, 0xF8, 0xF4, 0xFE, 0x28, 0x05, + 0x45, 0x21, 0xD4, 0x14, 0x02, 0x27, 0x82, 0x19, 0xBD, 0x03, 0xC8, 0xFE, + 0x7D, 0xE9, 0x26, 0xEA, 0xF1, 0xE4, 0x9F, 0xE5, 0x69, 0xCF, 0xB4, 0xC7, + 0x28, 0xC9, 0x67, 0xAC, 0x92, 0xD8, 0xDB, 0xC0, 0xFF, 0xD7, 0xE3, 0xC7, + 0xAB, 0xD5, 0x6D, 0xBD, 0x83, 0xE6, 0x43, 0xDB, 0x30, 0xFF, 0x15, 0xF7, + 0xAB, 0xFD, 0x68, 0xF0, 0xAE, 0xF7, 0x63, 0xF9, 0xD1, 0xF8, 0x45, 0x05, + 0xED, 0xE3, 0xFE, 0xEE, 0x9A, 0xC8, 0xEC, 0xD8, 0x1B, 0xBB, 0x2D, 0xD5, + 0xDE, 0xBD, 0xFB, 0xBD, 0xE0, 0xB1, 0xF3, 0x9E, 0x0F, 0xAA, 0x96, 0xA8, + 0xDB, 0xD0, 0xC9, 0xB6, 0x0C, 0xF9, 0x9D, 0xC4, 0x1D, 0x06, 0xE9, 0xEC, + 0x7F, 0x0F, 0xCE, 0x0E, 0x74, 0x2D, 0x3B, 0x2B, 0x2C, 0x46, 0x17, 0x3E, + 0xC6, 0x35, 0x65, 0x2B, 0xD4, 0x1E, 0x86, 0x07, 0x72, 0x07, 0xAC, 0xEE, + 0x06, 0xDD, 0xB3, 0xE0, 0x38, 0xD3, 0x90, 0xD9, 0x91, 0xEA, 0x9C, 0xDF, + 0x74, 0xEF, 0xF3, 0xEA, 0x7C, 0xEC, 0x99, 0xE8, 0x23, 0xFA, 0xB9, 0xEF, + 0x06, 0x09, 0x6B, 0x08, 0x09, 0x05, 0x49, 0x0A, 0x42, 0xFA, 0x61, 0x02, + 0xD7, 0xEB, 0x36, 0x09, 0x11, 0xD5, 0x82, 0x14, 0x9F, 0xCF, 0x59, 0x16, + 0x99, 0xDB, 0xCC, 0x12, 0x5C, 0xEC, 0xA1, 0x18, 0x88, 0x07, 0x39, 0x24, + 0x27, 0x25, 0xAA, 0x33, 0x65, 0x38, 0x70, 0x47, 0x1F, 0x2E, 0xE7, 0x47, + 0x06, 0x19, 0xCD, 0x27, 0xE5, 0x11, 0x1D, 0x16, 0x03, 0x03, 0x86, 0x0E, + 0x1A, 0xEE, 0x22, 0xF2, 0x5D, 0xE7, 0xFF, 0xEA, 0x6F, 0xFB, 0x73, 0x01, + 0x78, 0x0A, 0x90, 0xFF, 0x87, 0x0B, 0x0A, 0xFA, 0xA5, 0x24, 0xB5, 0x0E, + 0xEE, 0x39, 0xC6, 0x17, 0x85, 0x30, 0x04, 0x0D, 0x94, 0x22, 0x08, 0x0B, + 0x99, 0x21, 0x49, 0x0A, 0xE8, 0x1B, 0xF3, 0xF7, 0x60, 0x04, 0x9C, 0xD6, + 0xD4, 0xE8, 0xF1, 0xB7, 0x8D, 0xCE, 0x65, 0xAF, 0xB2, 0xB9, 0x19, 0xAE, + 0xE7, 0xC7, 0x73, 0xBD, 0x3F, 0xEA, 0xCF, 0xD0, 0x94, 0xF9, 0x8A, 0xE1, + 0x00, 0x0B, 0x24, 0x08, 0xF5, 0x27, 0x37, 0x24, 0x26, 0x39, 0x84, 0x2B, + 0x7E, 0x3C, 0x16, 0x2C, 0xBE, 0x2D, 0x8A, 0x1A, 0xDF, 0x11, 0x93, 0x06, + 0x13, 0xEF, 0xC8, 0xF1, 0xC5, 0xC9, 0xB1, 0xD7, 0x20, 0xC1, 0xF7, 0xC2, + 0xCC, 0xCC, 0xF6, 0xB9, 0xED, 0xCB, 0xB6, 0xC6, 0xEF, 0xD0, 0x8C, 0xDC, + 0x0B, 0xE5, 0x54, 0xE9, 0x2A, 0xED, 0xC3, 0xEC, 0x29, 0xE5, 0x77, 0xED, + 0x2F, 0xE2, 0x0B, 0xED, 0x4D, 0xDA, 0xDA, 0xE5, 0x63, 0xCC, 0xB1, 0xE2, + 0xF3, 0xD4, 0x62, 0xDE, 0x41, 0xEC, 0x65, 0xD7, 0xA4, 0xF9, 0x95, 0xE3, + 0xF0, 0x0B, 0x51, 0x05, 0xE4, 0x1D, 0xA4, 0x25, 0x79, 0x23, 0x50, 0x30, + 0x9F, 0x19, 0xDB, 0x17, 0x00, 0x04, 0x47, 0xF4, 0x2E, 0xF8, 0x36, 0xE6, + 0x17, 0xE9, 0xFC, 0xD0, 0x62, 0xD2, 0xD2, 0xB4, 0xB2, 0xCC, 0x10, 0xC4, + 0x92, 0xED, 0xD1, 0xEC, 0x03, 0xFF, 0x50, 0xF1, 0xBD, 0xE9, 0xEE, 0xF1, + 0xFD, 0xE9, 0x6D, 0x0D, 0x31, 0xF5, 0xB6, 0x16, 0x38, 0xF3, 0xDB, 0x12, + 0x6C, 0xFB, 0x55, 0x1B, 0x58, 0x04, 0xB5, 0x0D, 0x9E, 0xF7, 0xE9, 0xEF, + 0xEF, 0xDB, 0x4E, 0xE1, 0x4B, 0xC5, 0x94, 0xCD, 0x40, 0xBA, 0xEC, 0xAF, + 0x16, 0xB9, 0xF0, 0xA6, 0x1F, 0xCA, 0xFE, 0xAB, 0x21, 0xE9, 0x6E, 0xBB, + 0xB5, 0x0D, 0xD5, 0xF2, 0x9A, 0x22, 0x18, 0x28, 0x1A, 0x2E, 0x67, 0x34, + 0x05, 0x3F, 0x23, 0x29, 0x41, 0x35, 0x95, 0x10, 0xD6, 0x18, 0xBB, 0x02, + 0x41, 0x0C, 0x1E, 0x06, 0x35, 0xFA, 0x25, 0xF4, 0x07, 0xDC, 0x94, 0xCD, + 0xC5, 0xD9, 0xD5, 0xBF, 0x7E, 0xE6, 0x8C, 0xC2, 0x15, 0xE3, 0xFE, 0xC5, + 0xFE, 0xE7, 0x3F, 0xDF, 0xA1, 0xFE, 0xF3, 0xF8, 0x32, 0x05, 0xB1, 0xF5, + 0x7F, 0xF8, 0x36, 0xE8, 0xA7, 0xE9, 0xF4, 0xDE, 0xF8, 0xCD, 0x47, 0xCF, + 0xFA, 0xBE, 0x59, 0xC7, 0xDD, 0xCB, 0xDD, 0xC8, 0xE9, 0xE5, 0x62, 0xD2, + 0x20, 0x02, 0x46, 0xEA, 0xC8, 0x0E, 0xEF, 0xFE, 0xC3, 0x11, 0xB0, 0x05, + 0x40, 0x11, 0x4C, 0x08, 0x30, 0xFA, 0x4B, 0xF9, 0x91, 0xEC, 0xD8, 0xEA, + 0x49, 0xF3, 0x0B, 0xEC, 0x47, 0xF0, 0x27, 0xDA, 0xAF, 0xE7, 0x0A, 0xC6, + 0x1C, 0xE5, 0xF0, 0xD7, 0x56, 0xDC, 0x3A, 0xE9, 0x96, 0xC7, 0xB2, 0xD8, + 0x5D, 0xD0, 0xCD, 0xD8, 0x01, 0xF2, 0xF7, 0xFC, 0xAE, 0x00, 0xC8, 0x14, + 0xBF, 0xF7, 0x91, 0x12, 0x80, 0xFA, 0x01, 0x1E, 0x0E, 0x09, 0x75, 0x28, + 0x75, 0xF7, 0xD7, 0x17, 0x35, 0xCB, 0xB1, 0xF5, 0x8E, 0xB5, 0xDE, 0xD4, + 0x90, 0xBD, 0xFE, 0xBE, 0x00, 0xD5, 0xF4, 0xC0, 0x04, 0xEB, 0x53, 0xD8, + 0x5A, 0xF5, 0x29, 0xF5, 0xF2, 0x0D, 0x0A, 0x2C, 0x6F, 0x31, 0xD7, 0x5E, + 0x81, 0x53, 0x97, 0x61, 0xC9, 0x64, 0x36, 0x4E, 0x10, 0x54, 0xBF, 0x41, + 0x62, 0x44, 0x78, 0x3B, 0xF1, 0x3B, 0xEF, 0x2B, 0x3F, 0x16, 0x03, 0x0E, + 0x1A, 0xF1, 0x57, 0xF9, 0x6A, 0xF0, 0xF0, 0xEE, 0xB1, 0xFC, 0xEE, 0xED, + 0x03, 0x08, 0x8A, 0x05, 0xED, 0x1E, 0xDF, 0x19, 0xD0, 0x38, 0x0B, 0x23, + 0xD7, 0x35, 0xAB, 0x2B, 0xBB, 0x1F, 0xA1, 0x21, 0x13, 0x0D, 0x06, 0x11, + 0x33, 0xF7, 0x85, 0x09, 0x14, 0xF4, 0x3C, 0x0A, 0xB5, 0x14, 0xF3, 0x0F, + 0x41, 0x33, 0xE0, 0x24, 0x34, 0x3D, 0xDC, 0x40, 0xDC, 0x51, 0xCC, 0x47, + 0x9D, 0x66, 0xEC, 0x45, 0xDC, 0x5F, 0xAB, 0x42, 0x24, 0x3C, 0x46, 0x2E, + 0xEF, 0x1F, 0xA5, 0x26, 0xA5, 0x1E, 0x91, 0x2B, 0xF3, 0x1C, 0x0F, 0x0A, + 0x46, 0x21, 0x77, 0xE3, 0x7E, 0x3C, 0x37, 0xF7, 0x0C, 0x4B, 0x28, 0x10, + 0x46, 0x2E, 0x01, 0x07, 0x4A, 0x1D, 0x7D, 0x1C, 0x13, 0x26, 0xA1, 0x3E, + 0x5F, 0x1E, 0x26, 0x3C, 0x77, 0x16, 0x07, 0x3C, 0xCF, 0x1C, 0x83, 0x47, + 0x4C, 0x12, 0xDA, 0x34, 0xC8, 0xF7, 0x2D, 0x1F, 0x34, 0xEC, 0x49, 0x1A, + 0xDD, 0xF2, 0x92, 0x02, 0x65, 0xFC, 0x78, 0xE8, 0x77, 0xF4, 0x05, 0xE1, + 0xBA, 0xE4, 0x11, 0xE9, 0x44, 0xEC, 0xD5, 0x08, 0xFE, 0xFB, 0xF0, 0x2B, + 0x62, 0x1A, 0xBB, 0x42, 0xFD, 0x4A, 0x0F, 0x58, 0x0A, 0x5D, 0x5A, 0x5C, + 0x8F, 0x55, 0x77, 0x48, 0x22, 0x4F, 0x89, 0x3C, 0x66, 0x3D, 0xBF, 0x2E, + 0x2A, 0x10, 0xFC, 0x03, 0xC9, 0xE6, 0xF9, 0xDE, 0x72, 0xDA, 0x9D, 0xD7, + 0x78, 0xE0, 0x88, 0xDA, 0x5F, 0xF5, 0xCD, 0xDA, 0x3C, 0x10, 0x2B, 0xEB, + 0x85, 0x26, 0x54, 0x0F, 0x2A, 0x25, 0x44, 0x25, 0x4E, 0x15, 0xBE, 0x2D, + 0x03, 0x03, 0x70, 0x2D, 0x2B, 0xF3, 0x74, 0x1E, 0x7C, 0xF3, 0x55, 0x0C, + 0x28, 0xF4, 0x6D, 0xFE, 0x81, 0xF9, 0xDA, 0x08, 0xB0, 0x07, 0xD8, 0x17, + 0x56, 0x1B, 0xD1, 0x21, 0x91, 0x31, 0x18, 0x3C, 0x20, 0x38, 0x29, 0x4C, + 0x07, 0x36, 0xA1, 0x3D, 0x1C, 0x34, 0xFF, 0x26, 0x7A, 0x22, 0x40, 0x11, + 0xE5, 0x03, 0x74, 0xF6, 0x79, 0xE6, 0xD7, 0xE3, 0xF8, 0xE0, 0xE1, 0xF0, + 0x1A, 0xDC, 0x1F, 0xFC, 0x8B, 0xD6, 0x59, 0xF4, 0x37, 0xF9, 0x0C, 0x09, + 0xAA, 0x1C, 0xBE, 0x1F, 0x89, 0x22, 0x1D, 0x10, 0xDA, 0x23, 0x00, 0x0A, + 0xCA, 0x22, 0x1E, 0x16, 0x9B, 0x14, 0xBC, 0x1E, 0xBB, 0xFC, 0x63, 0x16, + 0xFB, 0xE5, 0x96, 0xED, 0x42, 0xCE, 0x4C, 0xCD, 0x08, 0xBC, 0xE3, 0xC7, + 0xED, 0xCB, 0x67, 0xD3, 0xDE, 0xED, 0xEB, 0xEB, 0xC8, 0x07, 0xC8, 0x04, + 0x8B, 0x21, 0x5B, 0x1F, 0x49, 0x43, 0x48, 0x42, 0x1A, 0x55, 0x59, 0x5E, + 0x01, 0x4A, 0x78, 0x60, 0x2E, 0x3F, 0x09, 0x58, 0x9D, 0x3A, 0x22, 0x4D, + 0xE9, 0x2C, 0xB4, 0x27, 0xD0, 0x09, 0x75, 0xF7, 0xFD, 0xEB, 0x6D, 0xEA, + 0x43, 0xEC, 0x65, 0xFA, 0x33, 0xF7, 0x47, 0x04, 0x4D, 0x12, 0x72, 0x00, + 0xFF, 0x36, 0xC3, 0xF7, 0xB1, 0x3A, 0x00, 0xFA, 0xB0, 0x1D, 0x51, 0x07, + 0xDD, 0x08, 0x71, 0x11, 0x4F, 0xFA, 0x6A, 0x10, 0x01, 0xF3, 0x11, 0x0C, + 0x55, 0x03, 0xA3, 0x0F, 0x33, 0x12, 0x83, 0x14, 0x84, 0x15, 0x39, 0x23, + 0xB9, 0x13, 0xEC, 0x2E, 0x3C, 0x1B, 0x1E, 0x31, 0x99, 0x29, 0x9D, 0x3E, + 0x64, 0x1A, 0x57, 0x3A, 0x0F, 0x03, 0x9C, 0x20, 0x8D, 0x09, 0xF8, 0x16, + 0xB6, 0x0A, 0x96, 0x0A, 0x59, 0xEF, 0x4C, 0xE8, 0x2E, 0xDC, 0x58, 0xDF, + 0xC1, 0xDE, 0x91, 0xF6, 0xF2, 0xD5, 0xC4, 0xEC, 0x8D, 0xCD, 0x93, 0xDE, + 0x6C, 0xE3, 0xC2, 0xF8, 0x90, 0xFE, 0xFC, 0x07, 0x99, 0x01, 0xDE, 0xF7, + 0xB5, 0x00, 0x1F, 0xFF, 0xD3, 0xFF, 0xE9, 0x15, 0x5F, 0xF1, 0x99, 0x01, + 0x19, 0xE3, 0x6C, 0xD9, 0x2C, 0xD5, 0x75, 0xC7, 0x02, 0xBF, 0xAE, 0xBA, + 0xA5, 0xA9, 0x05, 0xA1, 0x43, 0xAD, 0x7B, 0x9E, 0xB2, 0xC5, 0xD5, 0xB6, + 0xE0, 0xD9, 0xAC, 0xCD, 0x1E, 0xF3, 0x50, 0xEF, 0x7F, 0x10, 0x1E, 0x21, + 0xBD, 0x21, 0x11, 0x41, 0xF0, 0x2B, 0x6B, 0x3D, 0x7A, 0x25, 0xDC, 0x21, + 0x24, 0x10, 0xAF, 0xF7, 0x4F, 0xEF, 0xEB, 0xD2, 0xB9, 0xBC, 0xEC, 0xBA, + 0x55, 0x9B, 0x94, 0xB6, 0x15, 0xA5, 0x69, 0xC8, 0x60, 0xC7, 0x6F, 0xC8, + 0xE6, 0xEA, 0x87, 0xC6, 0x38, 0x03, 0x23, 0xDB, 0x1E, 0x08, 0x26, 0xEB, + 0xCC, 0xF9, 0x44, 0xFB, 0xF2, 0xE4, 0x76, 0x05, 0x7C, 0xD4, 0xD7, 0xFC, + 0xBB, 0xD1, 0x06, 0xF7, 0x3F, 0xDE, 0x32, 0xF3, 0x68, 0xF1, 0xEA, 0xEA, + 0xF2, 0x06, 0xDB, 0xF9, 0xCC, 0x12, 0x57, 0x12, 0x3E, 0x17, 0x35, 0x1A, + 0x5F, 0x1D, 0x36, 0x23, 0x33, 0x1B, 0x7F, 0x1F, 0x1E, 0x09, 0x63, 0x00, + 0xE9, 0xF2, 0x01, 0xEA, 0x22, 0xEC, 0xA8, 0xE4, 0x8D, 0xEF, 0x49, 0xD8, + 0xB0, 0xF5, 0xEA, 0xCC, 0x0A, 0x00, 0xE8, 0xD8, 0x8F, 0xFA, 0xDA, 0xD9, + 0xE0, 0xEF, 0xEE, 0xD3, 0x61, 0x00, 0x6C, 0xF2, 0x10, 0x10, 0xD2, 0x1A, + 0x5E, 0x02, 0x59, 0x26, 0x8D, 0x05, 0xB2, 0x1B, 0xAF, 0x26, 0xD8, 0x1A, + 0x00, 0x29, 0xF0, 0x18, 0x98, 0x0A, 0xA8, 0x05, 0x2A, 0xED, 0xED, 0xEC, + 0x06, 0xCF, 0xE8, 0xCD, 0x1D, 0xB9, 0xE4, 0xAD, 0xD1, 0xBB, 0xE3, 0xA8, + 0x58, 0xD4, 0x25, 0xC2, 0x11, 0xEB, 0x2A, 0xE0, 0xAE, 0xF9, 0x34, 0xFE, + 0x13, 0x13, 0x47, 0x1E, 0x46, 0x34, 0x92, 0x3E, 0x71, 0x40, 0x22, 0x46, + 0x4B, 0x35, 0x2F, 0x35, 0xC7, 0x1F, 0x8E, 0x26, 0xA5, 0xF9, 0xB5, 0x12, + 0x2F, 0xC8, 0x39, 0xF5, 0xBA, 0xB6, 0x10, 0xD6, 0x2E, 0xC4, 0xF6, 0xBA, + 0x97, 0xC2, 0xA5, 0xB8, 0x01, 0xC3, 0x26, 0xD5, 0x2C, 0xDF, 0x77, 0xF7, + 0xF2, 0xF8, 0xB0, 0x15, 0x16, 0xF8, 0xAC, 0x1F, 0x73, 0xE8, 0xD6, 0x16, + 0x84, 0xDC, 0x32, 0x13, 0xEF, 0xE1, 0x0B, 0x12, 0xBE, 0xF8, 0x82, 0x0A, + 0x1A, 0x08, 0x5F, 0xFE, 0xE1, 0x15, 0xCE, 0x03, 0x92, 0x2D, 0xBD, 0x0A, + 0x6E, 0x36, 0xDF, 0x0A, 0xEA, 0x32, 0x1D, 0x12, 0x27, 0x2D, 0xBC, 0x0C, + 0x92, 0x21, 0xB2, 0x08, 0x3B, 0x17, 0x4C, 0x09, 0x7E, 0x18, 0x96, 0xFF, + 0x53, 0x10, 0xD6, 0xEB, 0xB2, 0xF9, 0xCE, 0xD6, 0x31, 0x01, 0xA6, 0xDD, + 0x44, 0x0C, 0x82, 0xE6, 0xD5, 0xF6, 0xE1, 0xE1, 0x74, 0xF2, 0xC1, 0xF6, + 0xC8, 0x0D, 0x3F, 0x16, 0x33, 0x18, 0x6D, 0x1B, 0x4A, 0x06, 0x42, 0x1E, + 0x9C, 0xFD, 0x8B, 0x29, 0x5A, 0xFF, 0x1B, 0x1B, 0x51, 0xF8, 0x1C, 0x06, + 0x90, 0xEC, 0xED, 0xF0, 0x17, 0xD7, 0xCB, 0xC9, 0x2E, 0xC3, 0xA0, 0xB0, + 0xB2, 0xBC, 0xD4, 0xA9, 0x62, 0xB4, 0x82, 0xB0, 0x4C, 0xAA, 0x6C, 0xC6, + 0x23, 0xB6, 0x96, 0xE7, 0xED, 0xE6, 0xE4, 0x0A, 0xDC, 0x21, 0xF3, 0x1D, + 0xC8, 0x43, 0x47, 0x25, 0xAC, 0x49, 0x88, 0x24, 0x78, 0x35, 0x43, 0x17, + 0x00, 0x12, 0xF4, 0xF6, 0x06, 0xEB, 0x8C, 0xCD, 0x62, 0xC8, 0x14, 0xB0, + 0x6A, 0xBC, 0x9C, 0xA3, 0x10, 0xC6, 0xAF, 0xA9, 0x75, 0xD2, 0xFD, 0xBB, + 0x28, 0xDF, 0xF7, 0xD2, 0xE9, 0xE8, 0x51, 0xE8, 0x29, 0xF4, 0x53, 0xF0, + 0x20, 0xF8, 0xF3, 0xEA, 0x76, 0xE7, 0x7C, 0xED, 0xDE, 0xD7, 0x34, 0xFA, + 0xE1, 0xD3, 0x45, 0x01, 0x85, 0xDD, 0x3F, 0x06, 0x5E, 0xE6, 0x55, 0xFC, + 0x4D, 0xF8, 0xC7, 0xF1, 0x50, 0x08, 0x95, 0xEF, 0xD5, 0xFB, 0x2C, 0xF1, + 0xD9, 0xED, 0x11, 0xF9, 0x88, 0xEF, 0xE3, 0xF2, 0x76, 0xEF, 0x6E, 0xDE, + 0x4A, 0xE6, 0xFA, 0xD3, 0x5A, 0xDF, 0x19, 0xD6, 0x56, 0xCD, 0xD0, 0xCB, + 0xDC, 0xB7, 0x33, 0xB8, 0x9E, 0xBE, 0x7A, 0xBA, 0xD3, 0xCD, 0x08, 0xC7, + 0x90, 0xD3, 0xD1, 0xBF, 0xBE, 0xE5, 0x60, 0xC8, 0xD4, 0xF3, 0x5C, 0xE6, + 0xDD, 0xEE, 0x04, 0xF7, 0x01, 0xE8, 0x79, 0xF7, 0xFF, 0xEA, 0xBC, 0xF5, + 0x95, 0xFD, 0x86, 0xFC, 0x86, 0x04, 0x72, 0xF7, 0xF9, 0xF4, 0x55, 0xE2, + 0x9F, 0xDD, 0x8E, 0xC4, 0x70, 0xC1, 0x1B, 0xA6, 0xB2, 0xA2, 0x12, 0xA0, + 0x65, 0x96, 0x04, 0xB3, 0xED, 0xB2, 0x42, 0xCD, 0xE7, 0xE5, 0x68, 0xE3, + 0x68, 0x1B, 0x2C, 0xF5, 0xE7, 0x43, 0xC0, 0x17, 0x9B, 0x47, 0xCA, 0x40, + 0x32, 0x38, 0x11, 0x48, 0x59, 0x28, 0xE9, 0x33, 0x06, 0x11, 0xA3, 0x18, + 0x43, 0xF6, 0xB0, 0xEB, 0x5D, 0xD5, 0x5C, 0xBE, 0x70, 0xC2, 0x6B, 0xAC, + 0xFF, 0xC6, 0x9E, 0xAE, 0xA6, 0xCB, 0xFC, 0xBA, 0xCE, 0xD9, 0xDB, 0xCF, + 0x25, 0xEB, 0xD0, 0xE7, 0x7F, 0xED, 0x15, 0xF8, 0xE5, 0xE6, 0xC2, 0x06, + 0x66, 0xE4, 0x01, 0x15, 0x45, 0xEA, 0x4E, 0x15, 0x92, 0xE7, 0xC4, 0x07, + 0x46, 0xE9, 0xB7, 0xFD, 0x5B, 0xE9, 0xF0, 0xFB, 0xFA, 0xEF, 0x97, 0x0C, + 0x80, 0x0F, 0x5C, 0x20, 0x07, 0x29, 0x29, 0x1C, 0x06, 0x34, 0x0D, 0x17, + 0xD9, 0x2D, 0x9D, 0x1A, 0x16, 0x14, 0x75, 0x10, 0xE2, 0xF9, 0xF2, 0x08, + 0x17, 0xF2, 0xDA, 0x1B, 0x6B, 0xF4, 0xCB, 0x16, 0x2C, 0xF5, 0x86, 0xED, + 0xDA, 0xFE, 0xA2, 0xF2, 0x60, 0xFC, 0xBC, 0x09, 0xA7, 0xE5, 0x83, 0xFA, + 0x7C, 0xF1, 0x2A, 0x00, 0x2C, 0x1C, 0x77, 0x1E, 0x95, 0x34, 0xE1, 0x2C, + 0x14, 0x38, 0xB3, 0x30, 0x2A, 0x3A, 0x0C, 0x36, 0x76, 0x37, 0x43, 0x32, + 0xB8, 0x20, 0x1C, 0x1C, 0x3F, 0x0E, 0x46, 0x0A, 0x3B, 0xFE, 0x9A, 0xF3, + 0x29, 0xE6, 0x16, 0xD6, 0x96, 0xD6, 0x7E, 0xD2, 0xB7, 0xD6, 0xD1, 0xE0, + 0x59, 0xEE, 0xFB, 0xF7, 0xF4, 0x0F, 0x9A, 0x1A, 0x3C, 0x2F, 0x12, 0x32, + 0x25, 0x4F, 0x01, 0x3A, 0x4C, 0x61, 0x69, 0x4B, 0x2D, 0x5F, 0xB0, 0x60, + 0x24, 0x5A, 0x7C, 0x65, 0x00, 0x53, 0x2A, 0x54, 0x33, 0x41, 0x7D, 0x36, + 0xAB, 0x34, 0xD9, 0x16, 0xEE, 0x26, 0xD6, 0xF5, 0x6E, 0x10, 0x68, 0xDE, + 0xBC, 0x07, 0xD5, 0xD9, 0xCE, 0x0A, 0x24, 0xE9, 0xD2, 0x0D, 0x1D, 0x07, + 0xBA, 0x0D, 0x67, 0x24, 0x0D, 0x19, 0x91, 0x35, 0x5D, 0x2C, 0xFF, 0x30, + 0x04, 0x2A, 0x28, 0x2E, 0xD6, 0x13, 0xA7, 0x35, 0x68, 0x13, 0x8C, 0x35, + 0x7F, 0x29, 0xC9, 0x2C, 0x01, 0x32, 0x60, 0x20, 0x90, 0x3D, 0x74, 0x24, + 0x64, 0x47, 0xF5, 0x34, 0xA4, 0x37, 0xCD, 0x34, 0x73, 0x26, 0xD0, 0x2A, + 0x26, 0x1E, 0x51, 0x31, 0x09, 0x0E, 0x95, 0x2E, 0xD1, 0x01, 0x0E, 0x21, + 0x66, 0x07, 0x86, 0x20, 0x1E, 0x08, 0x2B, 0x13, 0xAD, 0x02, 0x51, 0x00, + 0xBF, 0x09, 0x80, 0x0B, 0x87, 0x01, 0xE3, 0x11, 0xB3, 0xF3, 0xCA, 0x07, + 0xD8, 0x05, 0x97, 0x11, 0x76, 0x27, 0xCB, 0x29, 0x91, 0x36, 0x27, 0x30, + 0x55, 0x36, 0x72, 0x21, 0xE4, 0x32, 0xA8, 0x15, 0x74, 0x27, 0x1A, 0x12, + 0xCF, 0x11, 0xF7, 0x05, 0x69, 0xF0, 0x47, 0xE8, 0x45, 0xD7, 0x2B, 0xD3, + 0x86, 0xCA, 0xE1, 0xD9, 0xB9, 0xC9, 0x48, 0xE3, 0x2E, 0xD2, 0x7C, 0xE2, + 0x62, 0xE2, 0xDA, 0xEF, 0x74, 0x03, 0xE1, 0x07, 0x5B, 0x24, 0xF4, 0x1D, + 0xBF, 0x36, 0xFE, 0x3B, 0x4D, 0x40, 0xAF, 0x5B, 0x0D, 0x42, 0x1E, 0x62, + 0x6D, 0x3C, 0x38, 0x47, 0x5B, 0x32, 0xE6, 0x27, 0x15, 0x20, 0x64, 0x0D, + 0xDA, 0x00, 0xC9, 0xEA, 0x39, 0xDB, 0xDE, 0xD1, 0x4A, 0xC8, 0xAB, 0xD6, + 0xA8, 0xC4, 0xBE, 0xE7, 0x46, 0xC5, 0xD9, 0xEE, 0x53, 0xD9, 0xD0, 0xED, + 0x11, 0xEF, 0xBC, 0xF8, 0x8D, 0xF4, 0x7D, 0x05, 0x2E, 0x03, 0x77, 0x0C, + 0xF8, 0x19, 0x9C, 0x20, 0xD0, 0x22, 0x24, 0x23, 0x5C, 0x2B, 0x9F, 0x10, + 0xC6, 0x30, 0x9A, 0x0A, 0xB5, 0x27, 0xD8, 0x13, 0x98, 0x2B, 0x3A, 0x1D, + 0xF5, 0x31, 0x83, 0x15, 0x95, 0x1E, 0x64, 0x01, 0x21, 0x18, 0xA2, 0xF8, + 0x38, 0x20, 0x8F, 0x05, 0xEA, 0x0D, 0x29, 0x19, 0x39, 0xFF, 0xEB, 0x2A, + 0xB9, 0xFE, 0x00, 0x2C, 0xE2, 0xF0, 0x0B, 0x0F, 0xC3, 0xEC, 0x3F, 0xFD, + 0x02, 0xF2, 0xF4, 0x10, 0xDB, 0xDA, 0x79, 0x13, 0x5D, 0xD2, 0x0F, 0x04, + 0x36, 0xFD, 0x59, 0x0F, 0x9E, 0x22, 0x86, 0x1E, 0x2F, 0x26, 0xAA, 0x18, + 0xDD, 0x30, 0xA3, 0x12, 0x4F, 0x3F, 0x5D, 0x18, 0xE6, 0x2E, 0x8E, 0x19, + 0x82, 0x13, 0x4C, 0x05, 0x34, 0x03, 0xAA, 0xF0, 0xFF, 0xF6, 0x2A, 0xE7, + 0x9F, 0xE6, 0x2B, 0xDA, 0x30, 0xDF, 0x18, 0xD9, 0xA3, 0xE4, 0x72, 0xE9, + 0x96, 0xEF, 0x9E, 0xFF, 0xD8, 0x07, 0x25, 0x19, 0x21, 0x24, 0x4C, 0x32, + 0x08, 0x36, 0xE8, 0x4B, 0x1D, 0x43, 0xCF, 0x60, 0x48, 0x50, 0x6F, 0x61, + 0x3D, 0x53, 0x0E, 0x53, 0x42, 0x38, 0x4E, 0x3C, 0x22, 0x0A, 0xA7, 0x22, + 0xB6, 0xE4, 0xF2, 0x0B, 0xEF, 0xC5, 0xF6, 0xF4, 0x81, 0xB0, 0x02, 0xE6, + 0x63, 0xBB, 0xD5, 0xE7, 0x98, 0xD1, 0x25, 0xF9, 0x7F, 0xCF, 0xA5, 0x06, + 0x3C, 0xD9, 0x8B, 0x08, 0xEF, 0xFF, 0xD6, 0x0B, 0xB2, 0x0F, 0x03, 0x04, + 0x92, 0x0A, 0xD5, 0xF9, 0x03, 0x0B, 0x2C, 0xFD, 0x30, 0x12, 0x72, 0x03, + 0x29, 0x1C, 0xC0, 0xFF, 0xF8, 0x1A, 0xC2, 0xEF, 0x40, 0x22, 0xAA, 0xED, + 0xA5, 0x21, 0xB7, 0xF5, 0x21, 0x07, 0xF7, 0xFA, 0x7C, 0xFF, 0x67, 0x01, + 0x8F, 0x0A, 0x46, 0x04, 0x13, 0x01, 0xF6, 0xF2, 0xB4, 0xE5, 0x57, 0xE6, + 0x52, 0xD0, 0x39, 0xF1, 0xE6, 0xC0, 0x00, 0xE2, 0xA1, 0xB8, 0x5B, 0xC7, + 0x91, 0xC7, 0x19, 0xD0, 0xE5, 0xD5, 0xE2, 0xCF, 0x0F, 0xD0, 0xB5, 0xC1, + 0x58, 0xDB, 0xC7, 0xD3, 0x70, 0xFA, 0xD8, 0xEB, 0xE1, 0x03, 0xB5, 0xEA, + 0x42, 0xFA, 0x9D, 0xEA, 0x18, 0xF6, 0xF8, 0x00, 0x73, 0xEB, 0x4F, 0x0F, + 0x70, 0xDF, 0x91, 0xFD, 0xB1, 0xDC, 0x9B, 0xDF, 0x5B, 0xD2, 0x17, 0xCE, + 0x66, 0xC1, 0x7C, 0xC4, 0x4E, 0xAF, 0xE6, 0xAB, 0xE8, 0x9F, 0x37, 0x9D, + 0x0F, 0xAC, 0x47, 0xB9, 0xBE, 0xD3, 0x98, 0xDE, 0xB6, 0xF2, 0xA4, 0xFA, + 0xF9, 0x09, 0xA4, 0x19, 0xD9, 0x2C, 0xCA, 0x31, 0x0C, 0x40, 0x3A, 0x2F, + 0x36, 0x39, 0xBF, 0x1F, 0x62, 0x2A, 0x68, 0x16, 0x94, 0x0A, 0xD9, 0xFC, + 0x55, 0xE2, 0xBE, 0xE7, 0x1B, 0xC8, 0x5D, 0xE7, 0x25, 0xBD, 0xBA, 0xDA, + 0x65, 0xC0, 0xC0, 0xD3, 0x39, 0xCC, 0x08, 0xDB, 0xC8, 0xDE, 0xD7, 0xD9, + 0xC9, 0xF4, 0xA9, 0xDC, 0x73, 0x07, 0xD2, 0xF0, 0x0B, 0x17, 0xB8, 0x11, + 0xF8, 0x17, 0x16, 0x23, 0x25, 0x1B, 0xC6, 0x11, 0x27, 0x21, 0xE2, 0xFD, + 0x40, 0x1C, 0x36, 0x09, 0xB2, 0x0B, 0x9A, 0x0A, 0x58, 0x06, 0xF4, 0xFA, + 0x65, 0x21, 0xB2, 0x06, 0x24, 0x27, 0x6F, 0x16, 0x92, 0x0F, 0x3F, 0x1D, + 0x9B, 0x02, 0x12, 0x2A, 0xA3, 0xF4, 0xA5, 0x27, 0x8D, 0xE5, 0xEA, 0x0B, + 0x92, 0xE8, 0x5A, 0xF7, 0xA1, 0xEA, 0x32, 0xEE, 0x10, 0xDB, 0x0E, 0xE4, + 0x0B, 0xDC, 0xC8, 0xF3, 0xA0, 0xF4, 0xBD, 0x11, 0xAD, 0xFB, 0xFF, 0x0E, + 0xAA, 0xF7, 0xB6, 0x0A, 0x3E, 0xFE, 0xB0, 0x15, 0xCA, 0x09, 0x74, 0x1C, + 0x88, 0x11, 0xE9, 0x1E, 0x61, 0x17, 0x97, 0x24, 0x8F, 0x1D, 0x4E, 0x2F, + 0x79, 0x22, 0x65, 0x22, 0x89, 0x25, 0x25, 0x04, 0xD6, 0x15, 0x39, 0xEA, + 0x7F, 0xF7, 0xC5, 0xD3, 0xBB, 0xE3, 0x66, 0xC6, 0xC5, 0xD9, 0x91, 0xC2, + 0x29, 0xDB, 0xCF, 0xC9, 0x3B, 0xF0, 0x3E, 0xDA, 0x08, 0x0B, 0x92, 0xF0, + 0xBD, 0x21, 0xA4, 0x0A, 0xF7, 0x44, 0xD8, 0x25, 0x9C, 0x65, 0xD6, 0x43, + 0xDE, 0x64, 0x74, 0x58, 0x17, 0x55, 0x53, 0x51, 0xD7, 0x43, 0x16, 0x2C, + 0x99, 0x23, 0xBD, 0x09, 0x04, 0xED, 0xB7, 0xF5, 0xF4, 0xBB, 0x00, 0xDF, + 0x18, 0xAA, 0xCE, 0xCF, 0x47, 0xAD, 0x46, 0xDA, 0xDF, 0xBE, 0xAB, 0xE7, + 0xDB, 0xDD, 0x7B, 0xE4, 0x0F, 0xF9, 0xA2, 0xE7, 0xA4, 0x0E, 0x70, 0xFB, + 0xED, 0x17, 0xEE, 0x07, 0x68, 0x0E, 0x32, 0x0C, 0x12, 0x0B, 0x34, 0x14, + 0xD8, 0x0A, 0xDA, 0x0B, 0x3C, 0x01, 0x70, 0xF9, 0xA4, 0xF4, 0x63, 0xF4, + 0x5A, 0xF7, 0x1D, 0x0A, 0x8D, 0xFC, 0x68, 0x1C, 0xA2, 0x05, 0xEB, 0x15, + 0x84, 0x1B, 0x42, 0x0D, 0x46, 0x20, 0xD4, 0x05, 0x05, 0x0B, 0xEA, 0xF7, + 0x9F, 0xF9, 0x2D, 0xF2, 0x57, 0xFA, 0xA7, 0xE8, 0xDD, 0xE2, 0x65, 0xC6, + 0xAE, 0xC9, 0x2D, 0xB3, 0x84, 0xDE, 0x2A, 0xC6, 0x34, 0xEB, 0x8A, 0xDA, + 0x80, 0xE1, 0x1B, 0xDD, 0x76, 0xED, 0xBD, 0xE5, 0x66, 0x00, 0xA3, 0xFA, + 0x69, 0xFE, 0x03, 0x02, 0xB9, 0xF6, 0x13, 0xFB, 0xB8, 0xF6, 0x24, 0xF9, + 0xFC, 0xEF, 0x0A, 0xF2, 0x58, 0xDE, 0x0F, 0xDC, 0x26, 0xCE, 0x84, 0xC1, + 0x3D, 0xBF, 0x94, 0xAC, 0x93, 0xB0, 0xC4, 0xA7, 0x1F, 0xA3, 0x9E, 0xA3, + 0xFE, 0xA2, 0xB7, 0xA3, 0xD6, 0xB4, 0x15, 0xB6, 0xDF, 0xC6, 0x21, 0xC6, + 0x36, 0xE0, 0x21, 0xD1, 0x68, 0xFE, 0xF4, 0xEA, 0xE4, 0x11, 0xA2, 0x07, + 0x95, 0x21, 0x4B, 0x11, 0xBD, 0x2D, 0x84, 0x1C, 0xAC, 0x24, 0xA4, 0x15, + 0xA3, 0x03, 0xFF, 0xEF, 0x81, 0xE0, 0xA4, 0xD9, 0x9A, 0xC3, 0x14, 0xC5, + 0x9B, 0xAF, 0xCA, 0xA5, 0x70, 0xB1, 0x54, 0x9F, 0x8B, 0xC4, 0x95, 0xAE, + 0x1F, 0xD1, 0x96, 0xBB, 0x69, 0xD7, 0xC5, 0xCE, 0xC9, 0xE7, 0x61, 0xE9, + 0x68, 0xFA, 0xEA, 0xF3, 0xA1, 0xFA, 0x38, 0xEC, 0xAF, 0xF1, 0xAE, 0xED, + 0x27, 0xF0, 0xF8, 0xF4, 0x02, 0xF5, 0xDF, 0xEE, 0xA7, 0xF6, 0x11, 0xE3, + 0x62, 0xF4, 0x65, 0xE6, 0xDA, 0xF2, 0x8C, 0xF7, 0x38, 0xEC, 0x8B, 0xFC, + 0x80, 0xE9, 0xAB, 0xF2, 0xA4, 0xF7, 0xD8, 0xE7, 0x11, 0xF9, 0xDD, 0xD5, + 0xF7, 0xE0, 0x6B, 0xBA, 0x27, 0xD7, 0xDC, 0xAC, 0x69, 0xD1, 0x29, 0xB5, + 0x20, 0xB5, 0x9E, 0xC0, 0xD6, 0xB5, 0x68, 0xCD, 0xC6, 0xD5, 0x4B, 0xD6, + 0xD1, 0xD2, 0xE1, 0xC4, 0xE9, 0xC7, 0x4C, 0xBB, 0x27, 0xE0, 0x39, 0xD9, + 0x11, 0xF2, 0x2A, 0xF1, 0x18, 0xEA, 0xFE, 0xEB, 0x85, 0xE2, 0xD9, 0xE9, + 0xAB, 0xE9, 0x1F, 0xF6, 0xEF, 0xEC, 0x64, 0xF0, 0xBC, 0xE2, 0xE2, 0xD2, + 0x73, 0xDF, 0xC9, 0xC2, 0x53, 0xD5, 0x4F, 0xD6, 0x0C, 0xC0, 0xD8, 0xE7, + 0x8F, 0xBA, 0x8A, 0xD9, 0x43, 0xBA, 0x6F, 0xD4, 0x66, 0xB9, 0x66, 0xE1, + 0x93, 0xCD, 0x96, 0xF3, 0x41, 0xF8, 0xAB, 0x1B, 0xA3, 0x27, 0x48, 0x4A, + 0x35, 0x49, 0x62, 0x5E, 0xFD, 0x5C, 0xAB, 0x59, 0x1D, 0x63, 0x5D, 0x4A, + 0xA3, 0x46, 0x65, 0x31, 0xDB, 0x11, 0x7E, 0x0A, 0xA5, 0xE9, 0xB4, 0xE9, + 0xC2, 0xCF, 0x5F, 0xE0, 0x5D, 0xBC, 0x58, 0xD7, 0xE8, 0xBE, 0xE2, 0xD6, + 0x87, 0xD7, 0x4D, 0xEB, 0x05, 0xF3, 0x42, 0xFB, 0x0A, 0x0B, 0x53, 0x07, + 0xD2, 0x12, 0x6C, 0x1B, 0x97, 0x13, 0x5B, 0x2C, 0xAE, 0x20, 0xA4, 0x26, + 0x5F, 0x2B, 0x5F, 0x20, 0x1C, 0x26, 0xA7, 0x25, 0xAA, 0x1C, 0x47, 0x27, + 0xA5, 0x1A, 0xB5, 0x27, 0x80, 0x1A, 0x23, 0x22, 0xE4, 0x28, 0xEB, 0x23, + 0x56, 0x3F, 0x66, 0x2F, 0xDA, 0x42, 0x57, 0x2D, 0xFD, 0x3D, 0x33, 0x28, + 0xE7, 0x34, 0x00, 0x2B, 0xCD, 0x22, 0xA4, 0x20, 0x89, 0x1B, 0x4B, 0x0F, + 0x0C, 0x1E, 0x19, 0x0A, 0x89, 0x1A, 0xF1, 0x01, 0x82, 0x1E, 0x7E, 0xF9, + 0x28, 0x35, 0xEB, 0x0A, 0x66, 0x33, 0x1D, 0x17, 0xBC, 0x15, 0x9D, 0x13, + 0x6E, 0x13, 0x76, 0x23, 0x48, 0x24, 0xC7, 0x2F, 0x48, 0x28, 0x00, 0x24, + 0x8B, 0x2D, 0x7A, 0x1D, 0x92, 0x42, 0xD0, 0x33, 0x33, 0x4D, 0x7E, 0x4A, + 0x72, 0x3D, 0x24, 0x43, 0x81, 0x20, 0x11, 0x36, 0xE0, 0xF7, 0xBA, 0x25, + 0x00, 0xD6, 0x4C, 0x05, 0xD7, 0xC9, 0xD1, 0xE4, 0x41, 0xCF, 0xA7, 0xD9, + 0x50, 0xE3, 0xAA, 0xE5, 0xFB, 0x00, 0x69, 0xFE, 0x78, 0x28, 0x03, 0x29, + 0x56, 0x4B, 0xEE, 0x56, 0x7D, 0x56, 0x28, 0x64, 0x5F, 0x56, 0x36, 0x4F, + 0x0D, 0x56, 0x0A, 0x39, 0x8B, 0x43, 0x68, 0x29, 0x03, 0x22, 0x64, 0x06, + 0x77, 0x01, 0x3A, 0xE3, 0x23, 0xE2, 0xC9, 0xD6, 0x92, 0xC8, 0x7F, 0xCF, + 0xC5, 0xC0, 0x8F, 0xD9, 0x44, 0xD3, 0x53, 0xEF, 0x2E, 0xED, 0x05, 0xFD, + 0x31, 0xFE, 0x81, 0x10, 0xF9, 0x11, 0xDD, 0x26, 0x3D, 0x25, 0x8C, 0x36, + 0x41, 0x1E, 0x8C, 0x36, 0xFC, 0x05, 0x89, 0x24, 0xF5, 0xFD, 0x42, 0x1C, + 0xB7, 0x0A, 0x2D, 0x1F, 0x14, 0x20, 0xCB, 0x1D, 0x8A, 0x27, 0xE3, 0x19, + 0xA6, 0x2E, 0xE1, 0x22, 0x0C, 0x3E, 0xD3, 0x37, 0xC6, 0x37, 0x18, 0x35, + 0x5E, 0x1B, 0xF9, 0x1F, 0x37, 0xFC, 0x26, 0x1F, 0xB8, 0xE8, 0x26, 0x1F, + 0xED, 0xF2, 0x8C, 0x09, 0x7D, 0x0D, 0xC0, 0xFE, 0x13, 0x08, 0x60, 0xF9, + 0x7C, 0xEC, 0x2C, 0xE5, 0x88, 0xF3, 0x52, 0xEC, 0x1D, 0x07, 0x7C, 0x07, + 0x6C, 0xF6, 0x3B, 0x04, 0x8A, 0xF5, 0xF4, 0xFA, 0xEC, 0x23, 0xC1, 0x0A, + 0xFA, 0x40, 0x43, 0x15, 0x7B, 0x39, 0xDC, 0x0D, 0x35, 0x28, 0x27, 0x1D, + 0x47, 0x16, 0xDE, 0x3B, 0xCB, 0x0B, 0x13, 0x35, 0x3B, 0x11, 0x4A, 0x1B, + 0x27, 0x0E, 0x49, 0x0C, 0x06, 0xE8, 0x04, 0xF7, 0xD6, 0xBF, 0x60, 0xDF, + 0x72, 0xB4, 0x3C, 0xD3, 0x67, 0xC0, 0xB9, 0xD9, 0x63, 0xDD, 0x70, 0xF1, + 0x6B, 0x02, 0x92, 0x09, 0xE8, 0x28, 0x0A, 0x24, 0x7D, 0x4C, 0x41, 0x3F, + 0x2A, 0x62, 0xEF, 0x4C, 0x6A, 0x60, 0xDA, 0x50, 0x3B, 0x49, 0x08, 0x4B, + 0x09, 0x2F, 0x3D, 0x34, 0x77, 0x13, 0x1F, 0x0E, 0x83, 0xFA, 0x61, 0xEF, + 0x85, 0xEF, 0xF9, 0xE2, 0x20, 0xE3, 0x6F, 0xDA, 0x69, 0xD7, 0x73, 0xE1, + 0x3F, 0xDD, 0x04, 0xFA, 0x0B, 0xF4, 0x1D, 0x0E, 0x4C, 0x0E, 0x0F, 0x13, + 0x12, 0x1D, 0xC6, 0x15, 0x15, 0x20, 0xCB, 0x1E, 0xDB, 0x24, 0xCD, 0x29, + 0x9E, 0x22, 0x5E, 0x31, 0xCF, 0x17, 0x7D, 0x2D, 0x05, 0x08, 0x30, 0x25, + 0x6E, 0xF6, 0xCE, 0x22, 0x11, 0xF1, 0x58, 0x22, 0x3F, 0xF4, 0x95, 0x29, + 0x22, 0x01, 0x59, 0x33, 0xEC, 0x0D, 0x3C, 0x29, 0xE7, 0x07, 0xDD, 0x11, + 0x9B, 0x00, 0x98, 0x02, 0x7A, 0xFD, 0xD7, 0xF9, 0xBC, 0xE7, 0x1A, 0xEF, + 0x12, 0xDB, 0x3D, 0xF1, 0x46, 0xEA, 0xB4, 0xF4, 0x52, 0xEF, 0x6B, 0xE3, + 0x58, 0xEE, 0x0F, 0xD9, 0x30, 0x03, 0xDF, 0xE9, 0xB0, 0x01, 0xF9, 0xE5, + 0x44, 0xE4, 0x18, 0xD0, 0x2C, 0xEB, 0xC0, 0xE5, 0xC9, 0xFE, 0x4F, 0x02, + 0x89, 0xFD, 0xE6, 0xF8, 0x93, 0x04, 0xBC, 0xFD, 0x36, 0x14, 0xA9, 0x18, + 0x8F, 0x17, 0xC1, 0x17, 0x8F, 0x0D, 0x3B, 0x06, 0x91, 0xFA, 0x81, 0xF6, + 0x09, 0xDE, 0x7F, 0xDA, 0x9C, 0xC8, 0xE7, 0xBC, 0x72, 0xBF, 0x16, 0xB2, + 0xEA, 0xBE, 0x5B, 0xB6, 0xED, 0xCF, 0xA6, 0xC1, 0xE7, 0xF0, 0x7B, 0xDC, + 0xC1, 0x17, 0x4A, 0x06, 0x23, 0x32, 0x24, 0x2E, 0x9A, 0x3B, 0xED, 0x47, + 0x00, 0x3D, 0x47, 0x51, 0x8C, 0x31, 0x59, 0x49, 0x90, 0x19, 0x67, 0x26, + 0x09, 0xF4, 0xF5, 0xF6, 0xB8, 0xC8, 0x96, 0xDA, 0x4B, 0xB0, 0xBB, 0xCF, + 0x82, 0xA6, 0x3C, 0xC1, 0xB8, 0xA9, 0x79, 0xBD, 0x42, 0xBF, 0x50, 0xCE, + 0xEB, 0xD0, 0x6C, 0xD6, 0x66, 0xDF, 0x86, 0xD0, 0x09, 0xF3, 0x46, 0xD5, + 0x0A, 0xF6, 0x07, 0xE5, 0x48, 0xF0, 0x0A, 0xEA, 0xF2, 0xFC, 0x7A, 0xED, + 0x6F, 0x0B, 0x0E, 0xF8, 0xA3, 0x10, 0x72, 0xFC, 0xA2, 0x13, 0x1A, 0xF8, + 0x95, 0x0C, 0xE4, 0xF5, 0x43, 0xFC, 0xD4, 0xF3, 0x96, 0xF5, 0x15, 0xEF, + 0xB7, 0xFB, 0x21, 0xF6, 0xC1, 0xFE, 0x02, 0x05, 0x57, 0x03, 0x65, 0x05, + 0x49, 0x11, 0x00, 0x01, 0x55, 0x18, 0x27, 0x06, 0xDC, 0x13, 0xAE, 0x0E, + 0xB3, 0x08, 0xC6, 0x0B, 0xA8, 0xF6, 0x05, 0xF7, 0xBE, 0xE8, 0x85, 0xEB, + 0x02, 0xEA, 0xFC, 0xF7, 0xBC, 0xEB, 0xDD, 0x02, 0x3B, 0xE1, 0xDA, 0xF8, + 0x5D, 0xE5, 0xC9, 0xF4, 0x3B, 0x06, 0xCC, 0x07, 0x62, 0x17, 0x4E, 0x19, + 0xB5, 0x0F, 0x84, 0x1F, 0xE2, 0x15, 0x2F, 0x22, 0x7D, 0x2A, 0x02, 0x26, + 0xFC, 0x2D, 0xDC, 0x25, 0xAF, 0x1B, 0x94, 0x18, 0x32, 0x05, 0xD2, 0xFF, + 0xD2, 0xE4, 0xAD, 0xE4, 0xF5, 0xC5, 0x2D, 0xDC, 0xF4, 0xBD, 0x31, 0xE8, + 0xB9, 0xCC, 0x3E, 0xF4, 0x43, 0xEA, 0x0E, 0x03, 0x98, 0x0F, 0x65, 0x1E, + 0xB1, 0x35, 0x37, 0x44, 0xAE, 0x4A, 0x28, 0x61, 0x3D, 0x52, 0x0D, 0x66, + 0x77, 0x5A, 0x36, 0x62, 0xB2, 0x58, 0x26, 0x57, 0xB2, 0x42, 0xAB, 0x39, + 0x88, 0x2A, 0x8E, 0x13, 0x5A, 0x18, 0x3F, 0xF5, 0x91, 0x07, 0x8B, 0xDC, + 0x65, 0xF8, 0x57, 0xCE, 0xE5, 0xEE, 0x8B, 0xCF, 0xE4, 0xF3, 0x80, 0xD6, + 0xD3, 0xF9, 0xAC, 0xE8, 0xE7, 0x01, 0x45, 0x01, 0xD4, 0x18, 0x90, 0x0A, + 0x15, 0x2C, 0xAC, 0x0B, 0xA8, 0x2A, 0x66, 0x1B, 0x5B, 0x1D, 0xE0, 0x30, + 0xB3, 0x10, 0x41, 0x2B, 0x9F, 0x07, 0x6C, 0x10, 0x9A, 0x00, 0x5A, 0x03, + 0x13, 0xFD, 0xBD, 0xFE, 0x05, 0xFA, 0xE7, 0x00, 0x34, 0xF2, 0xEC, 0x0A, + 0xE2, 0xF4, 0x99, 0x0F, 0x52, 0x0A, 0x36, 0x13, 0x4D, 0x0F, 0x08, 0x1B, + 0xBF, 0xF9, 0xE2, 0x1F, 0x0E, 0xE8, 0x52, 0x16, 0x66, 0xDC, 0xD5, 0x02, + 0xBD, 0xD8, 0x39, 0xF4, 0x7A, 0xDC, 0x37, 0xEB, 0x0B, 0xD9, 0x3F, 0xDA, + 0x3D, 0xD5, 0x07, 0xCB, 0xAC, 0xDE, 0x12, 0xD8, 0x9F, 0xEB, 0xA1, 0xE1, + 0x94, 0xF0, 0x9D, 0xCD, 0xC4, 0xF8, 0x5A, 0xD0, 0xB5, 0x09, 0xD4, 0xEB, + 0x53, 0x10, 0x6B, 0xEF, 0x04, 0x0D, 0xF7, 0xF1, 0x32, 0x14, 0x39, 0x06, + 0x25, 0x14, 0x23, 0x0A, 0x04, 0xFB, 0x8C, 0xF7, 0xE5, 0xE3, 0xA9, 0xEB, + 0x0A, 0xD6, 0x24, 0xE9, 0x31, 0xBD, 0x15, 0xD6, 0xEB, 0xA8, 0xD2, 0xB7, + 0xAB, 0xA6, 0x49, 0xA8, 0x8D, 0xAC, 0x30, 0xAC, 0xD2, 0xC2, 0x82, 0xBB, + 0x14, 0xEB, 0x3B, 0xDF, 0x82, 0x10, 0x15, 0x0E, 0x1D, 0x27, 0xE6, 0x23, + 0xDA, 0x2F, 0x43, 0x21, 0xC5, 0x2B, 0x67, 0x1D, 0x07, 0x1A, 0x4F, 0x15, + 0x82, 0xFD, 0xCE, 0xF7, 0xF5, 0xE1, 0x43, 0xD1, 0xB5, 0xC8, 0xCA, 0xB3, + 0x19, 0xB6, 0xBB, 0xA3, 0x21, 0xB3, 0xB6, 0x9F, 0x3C, 0xAF, 0x1D, 0xA6, + 0x66, 0xAA, 0xCB, 0xB3, 0xBD, 0xB5, 0xD7, 0xB9, 0x4F, 0xD2, 0x88, 0xC3, + 0x12, 0xF0, 0xB0, 0xD2, 0xAE, 0xF9, 0xEC, 0xD9, 0x3B, 0xF7, 0x73, 0xE0, + 0xD9, 0xFB, 0x03, 0xF0, 0x20, 0x00, 0x9D, 0xFC, 0x25, 0xF1, 0x1A, 0xF3, + 0xED, 0xD9, 0xC9, 0xEB, 0xAF, 0xD2, 0xA3, 0xEF, 0x3D, 0xD7, 0xF1, 0xEB, + 0xE8, 0xDB, 0x31, 0xDD, 0x8D, 0xE3, 0x8F, 0xD2, 0xB4, 0xEB, 0x1F, 0xDF, + 0xDF, 0xE8, 0x4F, 0xEC, 0x55, 0xDF, 0x48, 0xED, 0x97, 0xDA, 0x5B, 0xEB, + 0xE3, 0xDC, 0x18, 0xD7, 0xCD, 0xE0, 0x8D, 0xBC, 0x89, 0xD7, 0xA3, 0xB0, + 0xE6, 0xBE, 0x71, 0xA6, 0x80, 0xA8, 0x1C, 0xA0, 0x6D, 0xAC, 0xEB, 0xAD, + 0x77, 0xC6, 0x24, 0xBF, 0x73, 0xD9, 0x5E, 0xC1, 0xA4, 0xE0, 0x9B, 0xCF, + 0x5D, 0xEB, 0x9F, 0xEB, 0x54, 0xF4, 0x55, 0xFA, 0xF5, 0xF6, 0x57, 0x05, + 0x69, 0xFF, 0x4A, 0x14, 0x3A, 0x05, 0x03, 0x15, 0x8E, 0xF4, 0xBE, 0xFF, + 0x84, 0xDB, 0x2C, 0xE3, 0xCD, 0xCA, 0xA5, 0xD4, 0x46, 0xBB, 0xFC, 0xCC, + 0x4D, 0xAF, 0x51, 0xB9, 0x13, 0xAC, 0x7B, 0xB0, 0x19, 0xB5, 0xE4, 0xC3, + 0x2F, 0xCA, 0x81, 0xE6, 0xEA, 0xED, 0x62, 0x0E, 0x59, 0x16, 0x30, 0x32, + 0x7D, 0x33, 0x8D, 0x49, 0xB3, 0x4B, 0xFD, 0x4D, 0x95, 0x5F, 0xD9, 0x49, + 0xAF, 0x59, 0x16, 0x44, 0x74, 0x36, 0x57, 0x2D, 0x1F, 0x08, 0xF1, 0x0B, + 0x7F, 0xDA, 0x37, 0xF9, 0x85, 0xC1, 0xED, 0xEF, 0x37, 0xC3, 0x0D, 0xDF, + 0x3C, 0xD2, 0x3E, 0xCF, 0xBE, 0xDF, 0x25, 0xCC, 0x6D, 0xE5, 0xD1, 0xCF, + 0x1B, 0xED, 0x11, 0xDA, 0xB5, 0x04, 0x56, 0xEF, 0x8F, 0x23, 0x50, 0x03, + 0xF2, 0x31, 0x21, 0x0A, 0x2A, 0x2E, 0x2A, 0x0F, 0x6F, 0x24, 0x83, 0x25, + 0x2A, 0x19, 0x0C, 0x2C, 0x5D, 0x12, 0xF7, 0x17, 0xFE, 0x0E, 0xFE, 0x0F, + 0xD9, 0x0C, 0xB8, 0x11, 0x60, 0x16, 0x02, 0x12, 0x6E, 0x25, 0xE4, 0x12, + 0x86, 0x2D, 0xB7, 0x1A, 0xF3, 0x2B, 0x75, 0x1F, 0x57, 0x23, 0xD1, 0x14, + 0x71, 0x1E, 0x82, 0x10, 0x34, 0x1E, 0x8B, 0x14, 0xEE, 0x1C, 0x88, 0x10, + 0xCB, 0x21, 0xEE, 0x0D, 0x0F, 0x22, 0x7F, 0x17, 0x4D, 0x0D, 0xA8, 0x1A, + 0x79, 0xF5, 0x62, 0x0B, 0xB4, 0xF0, 0xEB, 0xFE, 0x2D, 0xF6, 0x38, 0xF4, + 0xED, 0xF9, 0x17, 0xEB, 0x36, 0x0A, 0xAB, 0xF9, 0xFA, 0x29, 0xC7, 0x13, + 0x83, 0x40, 0x51, 0x22, 0xFD, 0x49, 0x88, 0x26, 0x94, 0x4F, 0xAE, 0x37, + 0xFC, 0x3D, 0x1B, 0x52, 0xFD, 0x17, 0xE8, 0x4D, 0x15, 0x00, 0x37, 0x33, + 0xE7, 0xF1, 0xD8, 0x1A, 0xA7, 0xE2, 0xC8, 0xFC, 0x16, 0xE0, 0xC1, 0xDB, + 0x1B, 0xE5, 0xAE, 0xD0, 0x4F, 0xEE, 0x2C, 0xE1, 0x47, 0x02, 0x72, 0xF9, + 0x49, 0x1E, 0x66, 0x14, 0xDC, 0x3A, 0x22, 0x38, 0xDA, 0x51, 0x32, 0x56, + 0xEA, 0x62, 0xED, 0x5C, 0x27, 0x63, 0x2A, 0x4F, 0x1F, 0x47, 0xB2, 0x3D, + 0x62, 0x1C, 0x74, 0x2D, 0xB7, 0xFD, 0xDD, 0x15, 0x25, 0xEB, 0xC1, 0xFF, + 0xD4, 0xD8, 0x14, 0xE8, 0x60, 0xD1, 0x0C, 0xC9, 0x30, 0xD8, 0xC8, 0xBF, + 0x7A, 0xDF, 0x7A, 0xD4, 0x0A, 0xE8, 0x9E, 0xE4, 0xC2, 0xF2, 0x96, 0xE6, + 0xEF, 0xFB, 0xEF, 0xF4, 0x0B, 0x0B, 0xAF, 0x10, 0x79, 0x1D, 0x9D, 0x28, + 0xC8, 0x2A, 0x88, 0x35, 0x7A, 0x2B, 0xA3, 0x30, 0xDD, 0x28, 0x2C, 0x1F, + 0x9E, 0x26, 0x78, 0x09, 0x48, 0x15, 0xC1, 0xFD, 0x3A, 0xF9, 0x8A, 0xFE, + 0x7A, 0xE7, 0x5F, 0x01, 0x4C, 0xE7, 0xE2, 0x0A, 0xC4, 0xF2, 0xCE, 0x0E, + 0x28, 0x00, 0xC2, 0x07, 0x90, 0x07, 0x52, 0xFF, 0xF4, 0x06, 0xD5, 0xF4, + 0xD1, 0x04, 0x5C, 0xFA, 0x39, 0x06, 0x5F, 0x09, 0xCE, 0x05, 0x5E, 0x00, + 0x8E, 0x06, 0x49, 0xEF, 0xCF, 0x03, 0x8C, 0xEB, 0x5E, 0xF8, 0x4E, 0xE6, + 0x35, 0xE6, 0x71, 0xDF, 0xAB, 0xD6, 0x71, 0xEF, 0xD2, 0xDF, 0x12, 0xFF, + 0xEF, 0xF6, 0x47, 0xF4, 0x35, 0x08, 0x53, 0x00, 0xDB, 0x14, 0xBD, 0x20, + 0x00, 0x16, 0x8A, 0x25, 0x4C, 0x15, 0x33, 0x1D, 0x68, 0x1E, 0x14, 0x20, + 0x5A, 0x1E, 0xE9, 0x23, 0x74, 0x0B, 0xC3, 0x12, 0x4C, 0xF7, 0x45, 0xFF, + 0xB7, 0xEE, 0x9E, 0xF9, 0x19, 0xE5, 0xE1, 0xED, 0xDB, 0xCF, 0x9F, 0xE2, + 0xAF, 0xC2, 0x90, 0xE4, 0x02, 0xCE, 0xC2, 0xE8, 0xE9, 0xEE, 0x50, 0xF4, + 0x94, 0x1D, 0xA6, 0x13, 0xD7, 0x48, 0x19, 0x33, 0x3F, 0x60, 0xC6, 0x45, + 0x31, 0x64, 0xFB, 0x59, 0xCD, 0x5D, 0x3C, 0x64, 0x95, 0x4D, 0xAA, 0x51, + 0x86, 0x36, 0x5B, 0x33, 0xDB, 0x19, 0xEB, 0x1D, 0x44, 0xFA, 0xA1, 0x08, + 0x21, 0xE8, 0x12, 0xED, 0x9D, 0xE1, 0x69, 0xD7, 0x41, 0xDA, 0xA1, 0xC8, + 0x44, 0xD5, 0x7B, 0xC9, 0xFB, 0xD2, 0xDA, 0xE4, 0x1B, 0xD6, 0xE1, 0x05, + 0xBE, 0xE3, 0x3B, 0x1B, 0x76, 0xF4, 0x44, 0x32, 0x9A, 0x01, 0xF1, 0x42, + 0xCF, 0x09, 0xD3, 0x39, 0xF8, 0x09, 0x5E, 0x2A, 0xFE, 0x04, 0x80, 0x1E, + 0x05, 0x02, 0x05, 0x14, 0x18, 0xFD, 0x4D, 0x1A, 0x15, 0xFA, 0x09, 0x23, + 0x30, 0x03, 0x2F, 0x0F, 0xDF, 0x0D, 0xA2, 0xF6, 0xEF, 0x0B, 0x8B, 0xEF, + 0x41, 0x09, 0xC2, 0xEF, 0x56, 0x0C, 0x6D, 0xFB, 0x60, 0x09, 0xAC, 0x00, + 0x96, 0x0E, 0xF4, 0xFA, 0x8E, 0x1E, 0x43, 0xFE, 0xC7, 0x19, 0x92, 0x07, + 0xA1, 0x0B, 0x7F, 0x0E, 0x81, 0x07, 0x13, 0xFB, 0xFB, 0xF3, 0x53, 0xD4, + 0xFC, 0xD9, 0x5F, 0xC3, 0x1D, 0xDF, 0x05, 0xCC, 0xAE, 0xED, 0x5D, 0xDD, + 0xF1, 0xE6, 0x8C, 0xE8, 0x35, 0xEC, 0xAC, 0xF3, 0x6E, 0x0A, 0x9C, 0x08, + 0x57, 0x1C, 0x5F, 0x14, 0x05, 0x24, 0xA4, 0x17, 0xB2, 0x33, 0x66, 0x1E, + 0x2E, 0x3B, 0x01, 0x22, 0x8B, 0x2A, 0xD7, 0x1E, 0x1B, 0x04, 0x54, 0x14, + 0xEC, 0xD8, 0xFD, 0xFD, 0x68, 0xBB, 0x92, 0xDE, 0x2E, 0xAB, 0x96, 0xC2, + 0xB3, 0xA9, 0x3D, 0xB6, 0x5C, 0xB6, 0x94, 0xBC, 0x00, 0xCA, 0xFC, 0xD4, + 0xCF, 0xEF, 0x10, 0xF5, 0xDE, 0x20, 0x5D, 0x0F, 0x71, 0x37, 0x77, 0x21, + 0x4B, 0x35, 0xA6, 0x2C, 0x72, 0x38, 0xDA, 0x3A, 0xD4, 0x3A, 0x05, 0x43, + 0xE9, 0x2E, 0x68, 0x34, 0x98, 0x19, 0x36, 0x1F, 0x19, 0xFC, 0x77, 0x0E, + 0xB1, 0xDB, 0xBB, 0xEF, 0x0C, 0xC2, 0xE5, 0xCA, 0xD0, 0xAD, 0xAE, 0xB8, + 0x77, 0x9F, 0x25, 0xB7, 0x80, 0xAC, 0xE0, 0xC2, 0x7E, 0xD9, 0x11, 0xD9, + 0xE1, 0x08, 0xB6, 0xF1, 0xD1, 0x2C, 0x9B, 0x00, 0x00, 0x3C, 0x11, 0x0E, + 0x23, 0x34, 0x5D, 0x2B, 0xBA, 0x31, 0x88, 0x42, 0x4A, 0x34, 0x8E, 0x3E, + 0x63, 0x29, 0x68, 0x34, 0x7A, 0x1E, 0x82, 0x2E, 0x77, 0x19, 0x45, 0x22, + 0xAE, 0x0B, 0x0C, 0x17, 0x58, 0xFD, 0xA0, 0x10, 0x79, 0x03, 0x1E, 0x08, + 0x9E, 0x07, 0x7C, 0x02, 0x36, 0xFD, 0xF1, 0x02, 0xD1, 0xFA, 0x33, 0x05, + 0x60, 0x05, 0x10, 0x12, 0x82, 0x11, 0x08, 0x24, 0xF1, 0x17, 0x7B, 0x23, + 0xA2, 0x1F, 0xB1, 0x1C, 0x65, 0x29, 0x81, 0x22, 0x16, 0x27, 0x81, 0x22, + 0xE7, 0x1C, 0xC6, 0x1D, 0xB1, 0x0D, 0xB6, 0x1B, 0x80, 0xF2, 0x86, 0x13, + 0xE4, 0xE1, 0xC8, 0x07, 0xEE, 0xED, 0x06, 0xFF, 0xF3, 0xFE, 0xF9, 0xF8, + 0x1E, 0xFF, 0xEA, 0xF0, 0xAB, 0x03, 0xCF, 0xFF, 0x19, 0x1F, 0x43, 0x34, + 0xF3, 0x36, 0x7B, 0x59, 0x8C, 0x3E, 0x84, 0x54, 0xCB, 0x48, 0xB3, 0x46, + 0x8E, 0x51, 0xAB, 0x3E, 0xB3, 0x47, 0x99, 0x2F, 0xC7, 0x31, 0x9A, 0x11, + 0x6F, 0x24, 0x42, 0xF5, 0xE7, 0x18, 0x32, 0xE2, 0x1E, 0x04, 0x96, 0xD3, + 0x33, 0xF3, 0xD0, 0xD2, 0x8C, 0xED, 0xB1, 0xDD, 0x1E, 0xF3, 0x79, 0xEC, + 0x2D, 0x03, 0xF3, 0x03, 0x19, 0x1F, 0x71, 0x23, 0xFB, 0x40, 0xCF, 0x42, + 0x2A, 0x55, 0x9C, 0x59, 0x33, 0x58, 0x43, 0x61, 0x80, 0x53, 0xF4, 0x5D, + 0x01, 0x42, 0x83, 0x55, 0x32, 0x25, 0xF7, 0x3E, 0xDA, 0x0A, 0x7C, 0x11, + 0xDD, 0xEE, 0x99, 0xE2, 0x00, 0xCB, 0x35, 0xC6, 0x7A, 0xB0, 0x4A, 0xB6, + 0xD2, 0xA4, 0xED, 0xB0, 0x29, 0x9D, 0x4F, 0xBA, 0xE6, 0xAC, 0x56, 0xC2, + 0xDA, 0xD6, 0x51, 0xC6, 0x0A, 0xF7, 0xF1, 0xD9, 0x18, 0x03, 0x08, 0xFB, + 0x16, 0x09, 0x73, 0x16, 0x2C, 0x10, 0x45, 0x1F, 0x1F, 0x0F, 0x18, 0x1A, + 0xD1, 0x07, 0x64, 0x16, 0x35, 0x02, 0x12, 0x15, 0xE2, 0xF9, 0xD1, 0x0D, + 0xBF, 0xF5, 0x6C, 0x01, 0xAA, 0xF1, 0x9E, 0xED, 0x52, 0xEB, 0xF2, 0xDE, + 0x7B, 0xEF, 0xA1, 0xDC, 0xD5, 0xF7, 0x80, 0xDC, 0xCF, 0xF9, 0x89, 0xD8, + 0xBF, 0xF8, 0xB4, 0xDA, 0xE5, 0xFE, 0x7F, 0xF1, 0x85, 0x04, 0xB7, 0x08, + 0x1D, 0xF7, 0xA7, 0x08, 0xF5, 0xE2, 0x3D, 0x01, 0x97, 0xD9, 0xBC, 0xF3, + 0x7A, 0xDA, 0xBD, 0xDA, 0xC4, 0xE4, 0x93, 0xCB, 0x76, 0xE3, 0x25, 0xC8, + 0x20, 0xD1, 0x19, 0xC2, 0xDC, 0xCB, 0xDA, 0xB9, 0x64, 0xD3, 0xBA, 0xBE, + 0x09, 0xD3, 0xA2, 0xC9, 0xF6, 0xCD, 0xEE, 0xD1, 0xCE, 0xDC, 0xFF, 0xE4, + 0x83, 0xF5, 0xA8, 0xF8, 0xEA, 0xF6, 0x18, 0x00, 0x1F, 0xF3, 0xFA, 0x00, + 0x4F, 0xF8, 0xCD, 0xFB, 0x5D, 0xF7, 0x78, 0xF6, 0x6B, 0xF4, 0x0D, 0xF1, + 0xA5, 0xF6, 0x0B, 0xE3, 0x9B, 0xF6, 0xDA, 0xCD, 0x65, 0xEA, 0xE1, 0xB4, + 0xBF, 0xD1, 0x8A, 0xA1, 0x78, 0xB2, 0x01, 0xA0, 0x75, 0x9E, 0x31, 0xB2, + 0x1D, 0xA4, 0x8D, 0xCB, 0xE9, 0xB9, 0xD0, 0xE5, 0x7B, 0xD9, 0x64, 0x05, + 0x82, 0x05, 0x82, 0x1F, 0xEB, 0x2D, 0x7F, 0x2C, 0x87, 0x3F, 0xC0, 0x34, + 0x8F, 0x35, 0xE2, 0x31, 0xB2, 0x20, 0x61, 0x1B, 0xBA, 0x10, 0x96, 0xFA, + 0x91, 0xF3, 0xF3, 0xD3, 0x29, 0xC5, 0xD3, 0xB0, 0xB5, 0xA3, 0x99, 0xA1, + 0x8D, 0x9C, 0x23, 0xA5, 0x5C, 0x9F, 0xA8, 0xA9, 0xF6, 0xA0, 0xDB, 0xA9, + 0x6A, 0xA6, 0xD5, 0xAF, 0xBD, 0xB4, 0xC9, 0xBD, 0x74, 0xCE, 0x55, 0xCF, + 0x48, 0xEC, 0x27, 0xE7, 0xE7, 0xFD, 0xF0, 0xFE, 0x3A, 0x03, 0xCC, 0x0A, + 0x04, 0x08, 0x54, 0x0D, 0xEF, 0x07, 0x7A, 0x07, 0x3C, 0xFA, 0x0A, 0xFF, + 0x52, 0xE7, 0xFC, 0xF1, 0x5C, 0xDA, 0xD9, 0xDF, 0x97, 0xD5, 0x0B, 0xDB, + 0x20, 0xD3, 0x22, 0xD3, 0x7F, 0xD4, 0x7D, 0xC4, 0x24, 0xD8, 0x7E, 0xC8, + 0xB0, 0xD8, 0xE2, 0xDA, 0x91, 0xD8, 0x4C, 0xF1, 0xFB, 0xD7, 0x86, 0x07, + 0xFC, 0xE0, 0x33, 0x1C, 0x9B, 0xEC, 0xF0, 0x25, 0xAB, 0xEC, 0x28, 0x17, + 0x2F, 0xEF, 0x4E, 0xFD, 0x4C, 0xF5, 0xBB, 0xE8, 0x89, 0xEF, 0x64, 0xDC, + 0x49, 0xEC, 0xAA, 0xDE, 0x91, 0xFA, 0x6E, 0xE5, 0x1F, 0x03, 0x46, 0xE2, + 0x66, 0x0A, 0x13, 0xE2, 0xD5, 0x14, 0x17, 0xED, 0x72, 0x01, 0x88, 0xF6, + 0xB6, 0xE5, 0x70, 0xFC, 0xF0, 0xF2, 0x82, 0x0B, 0xE1, 0x1A, 0x41, 0x1C, + 0xFC, 0x2E, 0xAF, 0x1E, 0xD4, 0x31, 0xB3, 0x1E, 0x5A, 0x3E, 0x44, 0x25, + 0xA7, 0x40, 0xB8, 0x29, 0x7E, 0x27, 0x23, 0x24, 0xC2, 0x09, 0x5A, 0x11, + 0xED, 0xF0, 0x43, 0xF9, 0xB3, 0xE3, 0x32, 0xE8, 0x9D, 0xE8, 0x96, 0xDD, + 0x75, 0xF1, 0x65, 0xD6, 0x04, 0xF5, 0x05, 0xD9, 0xA2, 0xF7, 0x53, 0xED, + 0x7E, 0x06, 0xA5, 0x0F, 0x1C, 0x25, 0x66, 0x33, 0x80, 0x42, 0xA0, 0x53, + 0x2A, 0x55, 0xAB, 0x65, 0xF0, 0x60, 0x5C, 0x60, 0x3D, 0x61, 0x52, 0x50, + 0x12, 0x4E, 0xF9, 0x3B, 0x4D, 0x2D, 0x59, 0x1C, 0xCA, 0x0D, 0xF8, 0xF4, + 0x61, 0xF1, 0x1A, 0xCE, 0xFA, 0xDC, 0x81, 0xAC, 0xA8, 0xD4, 0x43, 0x9C, + 0x38, 0xCF, 0x19, 0xA2, 0x99, 0xCE, 0xE3, 0xB4, 0x81, 0xD4, 0x4E, 0xD3, + 0x39, 0xE3, 0xE2, 0xF9, 0x6F, 0xFE, 0x60, 0x1C, 0x30, 0x19, 0x53, 0x39, + 0xAA, 0x2B, 0x33, 0x4D, 0x75, 0x3B, 0xA5, 0x4D, 0x30, 0x3B, 0x45, 0x45, + 0x53, 0x2B, 0x1F, 0x3F, 0xBE, 0x25, 0xDC, 0x33, 0x79, 0x25, 0x56, 0x1E, + 0x3F, 0x16, 0xBD, 0x05, 0xC7, 0xFF, 0x44, 0xF4, 0x34, 0xFC, 0x7B, 0xF0, + 0x45, 0x04, 0x8F, 0xF5, 0xB0, 0xFF, 0xA9, 0xFB, 0xFB, 0xF7, 0xB9, 0xFD, + 0x05, 0xFE, 0x3C, 0xFE, 0xB9, 0x0E, 0xCA, 0x00, 0x6A, 0x16, 0xC3, 0xFD, + 0xF5, 0x0C, 0xCB, 0x01, 0xC4, 0xFE, 0x7A, 0x11, 0xA7, 0xF9, 0x03, 0x10, + 0x9D, 0x04, 0x98, 0xFE, 0x16, 0x0B, 0xAB, 0xEC, 0xBC, 0xF7, 0xEB, 0xDB, + 0x34, 0xE4, 0x28, 0xDB, 0x36, 0xDF, 0xCE, 0xE6, 0x4A, 0xDC, 0x93, 0xEC, + 0xF2, 0xE2, 0x11, 0xF5, 0x5F, 0xF9, 0xE0, 0x02, 0x01, 0x0E, 0x7C, 0x05, + 0x75, 0x11, 0x43, 0x02, 0x9E, 0x13, 0x4D, 0x0F, 0xB4, 0x21, 0x2A, 0x26, + 0x0F, 0x28, 0x72, 0x2E, 0x03, 0x29, 0x15, 0x2A, 0xB8, 0x31, 0xC5, 0x26, + 0x81, 0x2E, 0xDD, 0x1F, 0x57, 0x1B, 0x45, 0x07, 0xBD, 0x04, 0x6E, 0xE9, + 0xE8, 0xEC, 0xB3, 0xDD, 0xB3, 0xDD, 0xD1, 0xD9, 0x9B, 0xD9, 0xD1, 0xCE, + 0x42, 0xD7, 0x45, 0xCC, 0x2A, 0xDB, 0xD8, 0xD7, 0x39, 0xE5, 0xBD, 0xE5, + 0x58, 0xF5, 0xCC, 0xFB, 0xFA, 0x0F, 0xBF, 0x1B, 0xA0, 0x2A, 0xF6, 0x3D, + 0xF3, 0x41, 0xC5, 0x59, 0x05, 0x59, 0xED, 0x63, 0xBE, 0x62, 0x87, 0x57, + 0xE5, 0x50, 0xA7, 0x3C, 0xBA, 0x2C, 0x12, 0x25, 0x44, 0x0C, 0x13, 0x0B, + 0xDA, 0xED, 0x77, 0xE0, 0xFB, 0xCB, 0x8E, 0xBC, 0x16, 0xB5, 0xF3, 0xAA, + 0x4A, 0xAE, 0x96, 0xA7, 0x10, 0xB0, 0x23, 0xBB, 0x19, 0xBB, 0xC4, 0xDA, + 0x6A, 0xD0, 0x56, 0xF6, 0xF3, 0xEA, 0x07, 0x0A, 0x23, 0x09, 0xFA, 0x12, + 0xC0, 0x28, 0x70, 0x17, 0x1B, 0x3E, 0x3C, 0x24, 0x97, 0x46, 0x9B, 0x32, + 0xEB, 0x4A, 0x3B, 0x28, 0x79, 0x43, 0xDF, 0x11, 0x53, 0x30, 0x54, 0x07, + 0xCC, 0x1D, 0x4A, 0x00, 0xFC, 0x0C, 0x2F, 0xF8, 0x35, 0x06, 0x05, 0xF3, + 0xF1, 0x07, 0x9C, 0xFC, 0x39, 0x07, 0x7E, 0x0C, 0xB9, 0x10, 0xEC, 0x11, + 0x60, 0x1A, 0x8D, 0x13, 0xFE, 0x0D, 0x68, 0x13, 0x71, 0xFB, 0x51, 0x16, + 0x31, 0xFC, 0xDA, 0x1F, 0x57, 0x0A, 0xEB, 0x22, 0x1B, 0x10, 0x1E, 0x19, + 0x09, 0x0D, 0x64, 0x0F, 0x35, 0x04, 0x61, 0x13, 0xDF, 0xF4, 0x15, 0x15, + 0x32, 0xEB, 0xC0, 0x09, 0x0E, 0xE8, 0x58, 0xFC, 0x48, 0xE4, 0x6F, 0xF4, + 0x96, 0xE2, 0xB1, 0xF8, 0x17, 0xEC, 0x92, 0x02, 0x26, 0x04, 0xD2, 0x02, + 0x45, 0x16, 0x1F, 0xFC, 0xAD, 0x12, 0xED, 0xF8, 0x49, 0x09, 0x76, 0x02, + 0x2E, 0x0C, 0x61, 0x14, 0x4C, 0x11, 0x2C, 0x22, 0x0A, 0x17, 0xF7, 0x2E, + 0x73, 0x27, 0xB6, 0x31, 0x86, 0x2B, 0x01, 0x25, 0xAD, 0x18, 0xFA, 0x0E, + 0xE3, 0x04, 0x05, 0xED, 0x92, 0xF3, 0xBE, 0xCF, 0x9F, 0xD9, 0xAA, 0xC1, + 0x26, 0xCE, 0x85, 0xB7, 0x0C, 0xE0, 0x30, 0xB6, 0xC4, 0xED, 0x1D, 0xC5, + 0xE1, 0xEF, 0x3E, 0xD8, 0xFF, 0xFC, 0x44, 0xF1, 0x52, 0x17, 0x6E, 0x1C, + 0xBC, 0x31, 0x56, 0x47, 0xF7, 0x3C, 0x20, 0x5F, 0x85, 0x44, 0x95, 0x67, + 0x39, 0x50, 0x5A, 0x5A, 0x60, 0x42, 0xAF, 0x35, 0xB8, 0x13, 0x39, 0x09, + 0xF0, 0xDD, 0xEC, 0xDF, 0x0D, 0xB3, 0x1B, 0xB9, 0x78, 0x9F, 0xA7, 0x9F, + 0xC3, 0xA1, 0x1A, 0xA1, 0x8F, 0xA5, 0x1C, 0xA9, 0xEA, 0xA7, 0x4E, 0xB3, + 0x7C, 0xB4, 0x1B, 0xCD, 0x4C, 0xCF, 0xED, 0xE6, 0xD6, 0xE8, 0x84, 0xF2, + 0x83, 0xF5, 0x14, 0xFA, 0x23, 0x04, 0x83, 0x02, 0xD1, 0x13, 0x37, 0x06, + 0x15, 0x1F, 0xF4, 0x0C, 0x2D, 0x24, 0xA9, 0x16, 0x0F, 0x1C, 0x1E, 0x16, + 0xBF, 0x11, 0x16, 0x09, 0x44, 0x09, 0xDB, 0xF3, 0x0F, 0xFC, 0x21, 0xE1, + 0xAC, 0xF0, 0xE5, 0xE1, 0xDD, 0xF0, 0xDF, 0xF1, 0x4C, 0xF4, 0x85, 0xFF, + 0xCB, 0xF9, 0x93, 0x02, 0xD8, 0x09, 0xC8, 0xFB, 0xAB, 0x0E, 0x51, 0xF3, + 0x17, 0x04, 0x67, 0xF1, 0xBB, 0xFF, 0x8F, 0xF7, 0xCB, 0x01, 0x74, 0x06, + 0x56, 0x04, 0x76, 0x16, 0xDE, 0x06, 0x7E, 0x19, 0x6E, 0x01, 0x64, 0x16, + 0xFB, 0xEF, 0x58, 0x0D, 0x47, 0xE6, 0x4C, 0xFC, 0x31, 0xF0, 0xB7, 0xFA, + 0x38, 0xF9, 0x9B, 0x00, 0xDF, 0x00, 0xE8, 0xFC, 0xFE, 0x19, 0x36, 0x00, + 0xEA, 0x35, 0xB6, 0x10, 0xC2, 0x3D, 0x15, 0x1D, 0x5B, 0x2C, 0x11, 0x1E, + 0xFC, 0x1A, 0x20, 0x2B, 0x69, 0x22, 0xEA, 0x44, 0x18, 0x2B, 0xD0, 0x4C, + 0xDC, 0x2A, 0xA3, 0x4B, 0xD2, 0x36, 0xCD, 0x4C, 0xA8, 0x4A, 0xC3, 0x44, + 0xBA, 0x46, 0xCD, 0x39, 0xAD, 0x29, 0x5E, 0x33, 0xA5, 0x0F, 0x66, 0x2A, + 0xA7, 0xF3, 0x24, 0x1A, 0x86, 0xD9, 0x02, 0x07, 0x7A, 0xD9, 0x60, 0xF8, + 0x26, 0xE8, 0x0F, 0xF2, 0x3D, 0xFC, 0x5B, 0xF7, 0x60, 0x17, 0xFB, 0x0A, + 0x59, 0x31, 0xA2, 0x2A, 0x4D, 0x48, 0xFF, 0x46, 0x12, 0x5C, 0xB4, 0x56, + 0x70, 0x65, 0x51, 0x61, 0xEB, 0x62, 0xC7, 0x61, 0xC2, 0x5C, 0x92, 0x51, + 0xA1, 0x51, 0xC5, 0x38, 0xEC, 0x37, 0xCD, 0x16, 0x77, 0x0F, 0xEA, 0xF0, + 0xAA, 0xE9, 0xA3, 0xDA, 0x9D, 0xCF, 0x87, 0xCE, 0x2F, 0xBC, 0x83, 0xC0, + 0x8F, 0xB9, 0xC2, 0xB8, 0x09, 0xC8, 0x92, 0xC4, 0xD8, 0xDB, 0xB3, 0xE3, + 0xBF, 0xEF, 0x82, 0x05, 0x15, 0x01, 0x83, 0x1C, 0x45, 0x0E, 0xE9, 0x27, + 0xF2, 0x19, 0x03, 0x31, 0xF3, 0x26, 0x0C, 0x38, 0xF3, 0x2A, 0x09, 0x3F, + 0x48, 0x1F, 0xB5, 0x43, 0x79, 0x0B, 0x69, 0x35, 0xF8, 0x08, 0x8D, 0x17, + 0x58, 0x0F, 0x86, 0xFE, 0xAE, 0x00, 0xFC, 0xF8, 0x07, 0xF4, 0x11, 0xFB, + 0xE9, 0xFF, 0x86, 0xF9, 0x0C, 0x10, 0x13, 0xFC, 0x6F, 0x13, 0x6D, 0x02, + 0x65, 0x11, 0x3D, 0x11, 0x2D, 0x12, 0x15, 0x1C, 0x4C, 0x13, 0xCB, 0x0C, + 0xA0, 0x12, 0x57, 0xF7, 0x0A, 0x10, 0x8A, 0xF5, 0xD7, 0x07, 0x5B, 0xFC, + 0x14, 0xFC, 0x18, 0xF8, 0x10, 0xF1, 0xDE, 0xF6, 0xB3, 0xEA, 0xC5, 0xFE, + 0xF2, 0xE6, 0x32, 0xF7, 0x5B, 0xE3, 0xDE, 0xF3, 0xB3, 0xEA, 0x85, 0xFE, + 0x9F, 0xF7, 0xEF, 0xF5, 0xD7, 0xFA, 0xA1, 0xE3, 0x44, 0x03, 0x45, 0xE2, + 0xDE, 0x0D, 0xE1, 0xEA, 0x79, 0x00, 0x43, 0xF3, 0x78, 0xEB, 0x62, 0xFC, + 0x8A, 0xEA, 0x9D, 0x07, 0x7E, 0xFA, 0x9D, 0x0E, 0xE7, 0x0C, 0xE9, 0x0B, + 0x63, 0x1B, 0xEE, 0x07, 0x7C, 0x1B, 0xC6, 0x03, 0x7C, 0x08, 0xAA, 0xFF, + 0x88, 0xF1, 0xF5, 0xF7, 0x18, 0xE0, 0xFD, 0xE5, 0x7D, 0xD7, 0x9A, 0xCD, + 0x98, 0xCF, 0xBB, 0xB3, 0xA2, 0xBD, 0x86, 0xA0, 0x5C, 0xB1, 0x01, 0xA0, + 0x1F, 0xB4, 0x52, 0xB7, 0xF8, 0xBC, 0x81, 0xDB, 0x9F, 0xD1, 0xC8, 0xFC, + 0xEC, 0xF7, 0x56, 0x12, 0x1F, 0x1F, 0x44, 0x24, 0x53, 0x33, 0x81, 0x36, + 0x3E, 0x2C, 0x5C, 0x36, 0x1E, 0x13, 0x0E, 0x21, 0x93, 0xFA, 0xA9, 0x04, + 0x8F, 0xE9, 0x6A, 0xE7, 0xCD, 0xD4, 0xCF, 0xCF, 0x4C, 0xBE, 0x05, 0xBA, + 0xEE, 0xB4, 0xDB, 0xA5, 0x3C, 0xAD, 0x56, 0x9B, 0x75, 0xA2, 0xDB, 0x9C, + 0xAD, 0x9F, 0x21, 0xA3, 0x52, 0x9F, 0x88, 0xA7, 0x95, 0xAB, 0x13, 0xB5, + 0xDE, 0xC6, 0x42, 0xC5, 0xD5, 0xDD, 0x2C, 0xD9, 0x9D, 0xEF, 0xEC, 0xF5, + 0x43, 0x01, 0x46, 0x01, 0xF7, 0x0F, 0x4A, 0xF7, 0x84, 0x0C, 0x0A, 0xEE, + 0x76, 0xEC, 0xDF, 0xEB, 0x0E, 0xC8, 0xB4, 0xEB, 0x7A, 0xBF, 0x70, 0xEA, + 0x99, 0xC7, 0x27, 0xE3, 0x1A, 0xD0, 0xA6, 0xD7, 0xC7, 0xD5, 0x7D, 0xD4, + 0x3F, 0xD7, 0xC2, 0xDB, 0x1B, 0xE0, 0x1D, 0xE0, 0xA9, 0xEC, 0x98, 0xE8, + 0xB6, 0xEE, 0x5C, 0xF7, 0x8F, 0xE9, 0x30, 0xFC, 0x3D, 0xE2, 0x46, 0xFD, + 0x18, 0xCF, 0x27, 0xF8, 0xA3, 0xBF, 0x26, 0xF0, 0x9D, 0xB9, 0xE5, 0xF0, + 0xC4, 0xB6, 0x95, 0xEE, 0xA7, 0xCD, 0xB6, 0xF3, 0x0D, 0xEF, 0x96, 0xF9, + 0x96, 0x07, 0x1A, 0xF0, 0x6D, 0x1F, 0x99, 0xE7, 0xC8, 0x24, 0x3A, 0xE6, + 0x3D, 0x14, 0x40, 0xF1, 0x34, 0x00, 0x32, 0xFB, 0x82, 0xFA, 0x5C, 0x04, + 0xAD, 0x01, 0x20, 0x08, 0x25, 0x0E, 0x7A, 0x04, 0x5E, 0x16, 0x6C, 0x0D, + 0xF5, 0x1A, 0xF1, 0x12, 0x16, 0x1F, 0x4C, 0x19, 0xD8, 0x1A, 0x05, 0x24, + 0x6D, 0x1B, 0x46, 0x1B, 0xE0, 0x28, 0x9A, 0x17, 0xBC, 0x2A, 0x7E, 0x1C, + 0x2A, 0x17, 0xDB, 0x0F, 0x13, 0x10, 0xBF, 0xF9, 0x07, 0x0C, 0x9D, 0xE1, + 0xA6, 0xF3, 0xEB, 0xD0, 0xC9, 0xCD, 0xD3, 0xD2, 0x69, 0xBB, 0x25, 0xDA, + 0xBA, 0xCE, 0xFE, 0xDE, 0xE4, 0xF6, 0x46, 0xF7, 0x06, 0x1C, 0x9E, 0x14, + 0xF7, 0x34, 0x1E, 0x2C, 0xFE, 0x50, 0x63, 0x40, 0x64, 0x5D, 0xF8, 0x44, + 0x4E, 0x4E, 0x12, 0x47, 0x6F, 0x3D, 0xCB, 0x4A, 0xF5, 0x2E, 0x7C, 0x3A, + 0x60, 0x17, 0xC7, 0x16, 0x70, 0xFF, 0x7E, 0xF0, 0xC5, 0xE7, 0x42, 0xC9, + 0xAD, 0xCD, 0x4E, 0xB0, 0x37, 0xBF, 0x67, 0xAC, 0xC0, 0xB4, 0xA0, 0xAA, + 0x67, 0xBD, 0xCB, 0xB9, 0x7C, 0xE0, 0x08, 0xE4, 0x32, 0x00, 0xF6, 0x08, + 0x64, 0x18, 0xE3, 0x1F, 0x5F, 0x25, 0x69, 0x2C, 0x59, 0x29, 0x50, 0x33, + 0x71, 0x2B, 0xD7, 0x3C, 0x80, 0x28, 0xE1, 0x3B, 0xEE, 0x26, 0xEF, 0x37, + 0x8D, 0x24, 0xAA, 0x2F, 0x72, 0x28, 0x8E, 0x2A, 0x68, 0x1F, 0x53, 0x2B, + 0x34, 0x0D, 0x8A, 0x1E, 0xD5, 0x0B, 0x52, 0x0D, 0xC0, 0x10, 0xEB, 0xFD, + 0xB1, 0x15, 0xD9, 0xF2, 0x47, 0x09, 0xB9, 0xF1, 0xBD, 0xFE, 0x38, 0x05, + 0x67, 0x02, 0x17, 0x1B, 0xD6, 0x05, 0xCD, 0x1C, 0x7F, 0x01, 0xFA, 0x12, + 0x65, 0xF3, 0x4C, 0x07, 0xC3, 0xEB, 0x23, 0xF9, 0xA0, 0xF6, 0xC7, 0xF2, + 0xAC, 0x00, 0x8C, 0xF0, 0xB3, 0x0B, 0xE4, 0xF6, 0xF4, 0x12, 0xDB, 0xFE, + 0x9A, 0x0F, 0x5D, 0xF5, 0x09, 0x13, 0xA4, 0xF1, 0x51, 0x09, 0x14, 0xF8, + 0x73, 0xF8, 0xC1, 0x00, 0xAF, 0xFC, 0x95, 0x04, 0x69, 0x0B, 0x0C, 0x01, + 0x7E, 0x17, 0x55, 0x05, 0xEB, 0x25, 0xEC, 0x14, 0x87, 0x1D, 0x92, 0x0F, + 0xB7, 0x0B, 0x28, 0xFF, 0xA4, 0x09, 0xBD, 0x08, 0x95, 0x0C, 0x82, 0x1E, + 0xC6, 0x17, 0xC7, 0x20, 0x67, 0x2B, 0x94, 0x1B, 0xA5, 0x34, 0x99, 0x21, + 0x5A, 0x25, 0x84, 0x1C, 0xAB, 0x0F, 0x3F, 0x07, 0x9D, 0xF9, 0x5D, 0xEE, + 0x2F, 0xDB, 0xB4, 0xDA, 0xC9, 0xC2, 0x87, 0xCE, 0x1C, 0xB8, 0x45, 0xCA, + 0x1D, 0xC3, 0x48, 0xD5, 0x05, 0xDD, 0xC6, 0xE9, 0x90, 0xEF, 0xE2, 0xFC, + 0xB4, 0x0F, 0x93, 0x17, 0x39, 0x2C, 0x70, 0x2C, 0x58, 0x35, 0x81, 0x36, + 0xD0, 0x45, 0x5F, 0x42, 0x3F, 0x4A, 0xB6, 0x3C, 0x63, 0x41, 0x43, 0x2B, + 0xC0, 0x28, 0xF6, 0x1C, 0x85, 0xFF, 0x35, 0x0A, 0x6F, 0xD3, 0x64, 0xE5, + 0x3D, 0xAE, 0xE6, 0xBE, 0x9E, 0xA4, 0x8C, 0xAD, 0x9B, 0xA7, 0xD8, 0xAE, + 0x09, 0xAB, 0xBD, 0xBF, 0x6E, 0xC5, 0x46, 0xD4, 0x34, 0xE6, 0x89, 0xDD, + 0x72, 0xFC, 0x7E, 0xEB, 0x84, 0x0F, 0xB1, 0x0B, 0xC1, 0x1A, 0x38, 0x23, + 0x19, 0x25, 0xCF, 0x22, 0xBF, 0x2F, 0x77, 0x17, 0xFC, 0x35, 0xE6, 0x13, + 0x03, 0x34, 0x08, 0x19, 0x12, 0x31, 0x0F, 0x1E, 0x9E, 0x25, 0x3A, 0x18, + 0xBF, 0x11, 0x37, 0x0C, 0x0B, 0x0D, 0x0A, 0x0C, 0x74, 0x0F, 0x65, 0x18, + 0xE9, 0x01, 0x27, 0x1C, 0x37, 0xF6, 0x4D, 0x1A, 0x39, 0xFA, 0x61, 0x1A, + 0x60, 0x03, 0xF3, 0x1B, 0x7E, 0xFE, 0xA8, 0x1B, 0xD4, 0xF2, 0xBD, 0x11, + 0x8B, 0xFD, 0x76, 0x0C, 0xBB, 0x0D, 0x42, 0x0D, 0xDD, 0x07, 0xA7, 0x0E, + 0x84, 0xF5, 0xF0, 0x12, 0x05, 0xED, 0xA3, 0x16, 0x96, 0xEE, 0x4D, 0x11, + 0xE0, 0xED, 0x89, 0xFE, 0xA2, 0xF1, 0xE8, 0xF5, 0xE7, 0xF1, 0x48, 0xF3, + 0xCB, 0xF8, 0x3A, 0xF3, 0xAD, 0x11, 0x41, 0x01, 0x30, 0x25, 0xDF, 0x05, + 0x06, 0x22, 0x8A, 0x00, 0x22, 0x11, 0xA5, 0xFE, 0x5D, 0x0A, 0x48, 0xFC, + 0x5B, 0x03, 0xBE, 0xF0, 0xC5, 0x00, 0x26, 0xE6, 0xDB, 0x11, 0x0C, 0xEF, + 0x38, 0x28, 0xC9, 0x00, 0x8B, 0x32, 0xA7, 0x04, 0x83, 0x32, 0xA6, 0x0F, + 0x22, 0x33, 0x13, 0x21, 0x87, 0x2B, 0xD3, 0x1D, 0xE4, 0x0C, 0xE7, 0x0E, + 0x7C, 0xE7, 0x39, 0x00, 0x90, 0xD4, 0xF0, 0xF5, 0x99, 0xD1, 0xD0, 0xE9, + 0x39, 0xCC, 0x69, 0xD9, 0x28, 0xBA, 0xFB, 0xCB, 0xFC, 0xB2, 0x04, 0xCB, + 0x8F, 0xC9, 0x34, 0xD1, 0x8B, 0xF2, 0x8C, 0xDD, 0xCE, 0x14, 0x88, 0xFA, + 0x56, 0x2B, 0x77, 0x17, 0x74, 0x3C, 0x93, 0x21, 0x34, 0x40, 0x65, 0x30, + 0x20, 0x2D, 0x6A, 0x3F, 0x03, 0x05, 0xD0, 0x2D, 0xC1, 0xE3, 0xDD, 0x0B, + 0x5B, 0xCC, 0x14, 0xE8, 0x90, 0xB7, 0x27, 0xC7, 0xB4, 0xB0, 0x4D, 0xB3, + 0xD8, 0xB1, 0x8F, 0xA5, 0xDE, 0xB1, 0x98, 0x9C, 0x39, 0xAC, 0x84, 0x9C, + 0xF2, 0xAB, 0x02, 0xA9, 0x6A, 0xC4, 0xEE, 0xC2, 0x2F, 0xDF, 0x2A, 0xDB, + 0xE1, 0xF4, 0x55, 0xF8, 0xBE, 0x0A, 0xE4, 0x18, 0xD2, 0x1F, 0x19, 0x29, + 0xA6, 0x2E, 0x5E, 0x26, 0xAA, 0x2A, 0x2B, 0x17, 0x4E, 0x20, 0xCE, 0x12, + 0x9A, 0x0C, 0xA9, 0x15, 0x68, 0x01, 0xD6, 0x0E, 0x71, 0x09, 0x61, 0x03, + 0xFF, 0x0E, 0xF1, 0x02, 0xCE, 0x0E, 0xD9, 0x0A, 0xD6, 0x05, 0x52, 0x13, + 0x7D, 0x01, 0x82, 0x1B, 0xA6, 0x07, 0x94, 0x18, 0x07, 0x0C, 0xBD, 0x0E, + 0x88, 0x1C, 0xA8, 0x0C, 0xFB, 0x31, 0x26, 0x0A, 0x71, 0x30, 0xB7, 0xFB, + 0x71, 0x21, 0x14, 0xF6, 0xEB, 0x14, 0x77, 0x01, 0x27, 0x0B, 0xCE, 0x0F, + 0xFF, 0xFC, 0x7C, 0x1C, 0x97, 0xF6, 0x23, 0x20, 0x3B, 0x0A, 0x40, 0x22, + 0x92, 0x16, 0xA8, 0x28, 0x69, 0x11, 0x02, 0x34, 0x77, 0x0F, 0x25, 0x3F, + 0x45, 0x0F, 0xFC, 0x35, 0xAD, 0x16, 0xC3, 0x23, 0x7F, 0x22, 0xA1, 0x18, + 0x48, 0x30, 0x42, 0x1F, 0xD3, 0x33, 0xB9, 0x2B, 0xFA, 0x25, 0x86, 0x26, + 0x3E, 0x22, 0x91, 0x25, 0x61, 0x2B, 0xF2, 0x32, 0x1C, 0x35, 0xAE, 0x3D, + 0xC8, 0x3A, 0xB4, 0x42, 0xF3, 0x3F, 0xEF, 0x40, 0x75, 0x4F, 0xC8, 0x3E, + 0xB0, 0x53, 0xE8, 0x3B, 0x43, 0x46, 0xE0, 0x2E, 0xF4, 0x36, 0x15, 0x18, + 0xA8, 0x14, 0x5D, 0xFC, 0xC9, 0xEE, 0x8D, 0xF0, 0x60, 0xDA, 0x77, 0xEB, + 0x47, 0xDB, 0x2E, 0xE4, 0x01, 0xEB, 0x2C, 0xE2, 0x99, 0xF8, 0x00, 0xE3, + 0xE9, 0x0D, 0x80, 0xF8, 0x5F, 0x26, 0x52, 0x1C, 0x26, 0x32, 0xA3, 0x34, + 0x6C, 0x41, 0x6D, 0x46, 0x61, 0x52, 0xA3, 0x56, 0xB3, 0x51, 0x2A, 0x5A, + 0x39, 0x46, 0x12, 0x4D, 0xEF, 0x36, 0x5C, 0x3B, 0x0C, 0x14, 0xF4, 0x1D, + 0x5C, 0xE0, 0x9C, 0xF2, 0x6A, 0xB6, 0xE4, 0xD1, 0xA4, 0xA6, 0xE0, 0xBF, + 0xCC, 0xA7, 0x21, 0xB4, 0x56, 0xAB, 0x81, 0xAF, 0xA0, 0xC0, 0x17, 0xC2, + 0xEC, 0xD8, 0xEC, 0xE1, 0x39, 0xEF, 0x16, 0x03, 0xF1, 0x05, 0x75, 0x1C, + 0xEB, 0x17, 0x48, 0x2A, 0x45, 0x1A, 0xFB, 0x2B, 0xAA, 0x0C, 0x1D, 0x22, + 0x10, 0x11, 0xA5, 0x1D, 0x07, 0x1A, 0x06, 0x18, 0x67, 0x14, 0x29, 0x10, + 0x01, 0x08, 0xC7, 0x11, 0x52, 0x00, 0x33, 0x0C, 0xE5, 0x08, 0x1C, 0xF5, + 0x45, 0x10, 0x54, 0xEB, 0xB0, 0x10, 0x9C, 0xF5, 0xE8, 0x16, 0x9B, 0xFC, + 0x16, 0x1E, 0x9C, 0x00, 0xD3, 0x22, 0x30, 0x0A, 0x21, 0x11, 0x86, 0x08, + 0xB3, 0xF8, 0xC7, 0x02, 0x0C, 0xF2, 0x7F, 0x00, 0x6B, 0xF7, 0x26, 0xFA, + 0x83, 0x00, 0x90, 0xEE, 0xF4, 0x00, 0x30, 0xE2, 0x06, 0xFD, 0xED, 0xE0, + 0x02, 0xE8, 0x64, 0xDC, 0x4C, 0xD5, 0xF4, 0xDA, 0x8D, 0xDB, 0x5B, 0xED, + 0x07, 0xE2, 0x16, 0xFD, 0xBE, 0xE8, 0x88, 0xFC, 0xDA, 0xF8, 0xBC, 0xFA, + 0xFE, 0x05, 0x20, 0xF7, 0x3A, 0x08, 0x5E, 0xEE, 0x45, 0x05, 0x84, 0xEA, + 0xA3, 0xFD, 0x3E, 0xED, 0xA2, 0xED, 0x56, 0xF2, 0xE9, 0xEB, 0x1D, 0xF7, + 0x87, 0xF7, 0x00, 0xF9, 0x7E, 0xF8, 0x8D, 0xFE, 0x6F, 0xF2, 0xA0, 0x00, + 0x69, 0xF1, 0x07, 0xFB, 0xA1, 0xFB, 0xAD, 0xF9, 0x6F, 0x0C, 0x89, 0xFE, + 0x4A, 0x0F, 0x49, 0xFF, 0xFD, 0xFC, 0x58, 0xF7, 0xF6, 0xE9, 0x4F, 0xEE, + 0xF8, 0xD8, 0xDE, 0xDC, 0xB4, 0xC5, 0x14, 0xC7, 0xCD, 0xB2, 0x84, 0xB4, + 0x14, 0xA8, 0x67, 0xA9, 0x70, 0xAD, 0xDD, 0xA9, 0x97, 0xC0, 0x0D, 0xB5, + 0xA5, 0xD5, 0xCD, 0xCD, 0xB2, 0xF1, 0x27, 0xEB, 0xE2, 0x14, 0xE3, 0xFE, + 0xAC, 0x2B, 0xCD, 0x16, 0xEC, 0x2B, 0x40, 0x2A, 0xF5, 0x1C, 0xE5, 0x21, + 0x41, 0x02, 0x9D, 0x08, 0x50, 0xE6, 0x41, 0xEE, 0x49, 0xD6, 0x88, 0xDB, + 0x7A, 0xC6, 0xE1, 0xCA, 0x28, 0xB6, 0x7F, 0xB7, 0xE4, 0xAA, 0xBA, 0xA5, + 0xA4, 0xA6, 0x99, 0xA1, 0xDA, 0xA3, 0x03, 0xA8, 0x99, 0xA6, 0x79, 0xB0, + 0x36, 0xB7, 0x22, 0xC1, 0xF8, 0xC7, 0xAB, 0xDC, 0x14, 0xD6, 0x96, 0xF8, + 0xB8, 0xF2, 0xD9, 0x0F, 0x87, 0x0A, 0x94, 0x21, 0x98, 0x04, 0x97, 0x28, + 0x25, 0xFA, 0x97, 0x1E, 0xC7, 0xFF, 0x56, 0x0F, 0x3F, 0xFF, 0xB4, 0x09, + 0xFC, 0xEF, 0x6C, 0x04, 0x91, 0xE6, 0xA3, 0xFD, 0x03, 0xEE, 0xD7, 0xFE, + 0xDC, 0xFF, 0xE7, 0xFE, 0x01, 0x0C, 0x23, 0xF6, 0xBB, 0x12, 0x5E, 0xFF, + 0xF0, 0x10, 0xD5, 0x0B, 0xDC, 0x10, 0x37, 0x07, 0xA8, 0x12, 0xF4, 0x05, + 0xF0, 0x08, 0xCF, 0x08, 0xF8, 0x02, 0x11, 0x00, 0xB0, 0x06, 0x01, 0xF1, + 0xAC, 0x08, 0x32, 0xEE, 0x3E, 0x05, 0xB0, 0xEF, 0x5A, 0x0B, 0x0C, 0xF1, + 0xC2, 0x0E, 0x0C, 0xF8, 0xE9, 0x09, 0x65, 0xFB, 0x3E, 0x0B, 0xCB, 0xF5, + 0x19, 0x0A, 0xD9, 0xFB, 0xD3, 0x0B, 0x4E, 0x12, 0xF1, 0x06, 0xB1, 0x1A, + 0x3A, 0xFC, 0xC0, 0x1C, 0xDB, 0xFF, 0x86, 0x23, 0xF7, 0x09, 0xC9, 0x19, + 0x55, 0x15, 0x38, 0x0F, 0x20, 0x15, 0x97, 0x16, 0x7F, 0x0A, 0xC9, 0x1D, + 0x06, 0x0A, 0x9E, 0x17, 0x5E, 0x12, 0x22, 0x0C, 0x0A, 0x18, 0x20, 0x0B, + 0xC5, 0x0A, 0x40, 0x06, 0xCD, 0x09, 0x7E, 0x01, 0xFC, 0x21, 0x7B, 0x13, + 0x10, 0x31, 0x4C, 0x27, 0x8A, 0x3A, 0x17, 0x24, 0x73, 0x3B, 0x76, 0x18, + 0x25, 0x28, 0xB5, 0x0C, 0x99, 0x04, 0x60, 0xEF, 0xBB, 0xE1, 0xF8, 0xD0, + 0x8A, 0xD0, 0x26, 0xC8, 0x74, 0xCA, 0x71, 0xC2, 0x48, 0xD7, 0x4A, 0xC5, + 0xFF, 0xFC, 0xB9, 0xE9, 0x60, 0x1E, 0x42, 0x11, 0xA7, 0x2F, 0xC2, 0x2D, + 0x1B, 0x37, 0x3B, 0x4D, 0xEC, 0x36, 0xEB, 0x5E, 0xAC, 0x38, 0xF7, 0x5E, + 0xC4, 0x37, 0x84, 0x4F, 0x7B, 0x34, 0x34, 0x33, 0x83, 0x28, 0x6D, 0x10, + 0xBA, 0x01, 0x55, 0xEA, 0x20, 0xD7, 0x0C, 0xCB, 0xF4, 0xC5, 0x36, 0xB7, + 0xCE, 0xB9, 0x18, 0xA7, 0xF9, 0xB2, 0xA5, 0xA5, 0x4C, 0xC9, 0x70, 0xB8, + 0x6F, 0xDD, 0x28, 0xCE, 0x96, 0xDD, 0xA3, 0xE5, 0xD0, 0xE6, 0x67, 0xFE, + 0x54, 0xFF, 0x65, 0x13, 0x5D, 0x11, 0xE7, 0x1F, 0xE6, 0x22, 0x27, 0x24, + 0x94, 0x36, 0x3B, 0x1F, 0x94, 0x34, 0xF7, 0x0F, 0xC3, 0x24, 0x6B, 0x00, + 0xDF, 0x12, 0xCC, 0xF5, 0x08, 0xFD, 0x59, 0xEE, 0x0A, 0xEA, 0xBE, 0xEE, + 0xD3, 0xE8, 0x56, 0xF7, 0x77, 0xFB, 0x6F, 0x06, 0xC1, 0x08, 0x5D, 0x15, + 0x20, 0x16, 0xE8, 0x1F, 0x73, 0x29, 0x17, 0x1C, 0xFE, 0x27, 0xF9, 0x01, + 0x2E, 0x1B, 0x16, 0xF1, 0xDF, 0x0A, 0x17, 0xE9, 0x4C, 0xF8, 0x6B, 0xDD, + 0xE1, 0xF6, 0x4E, 0xE3, 0x8A, 0xFB, 0x53, 0xF8, 0x2E, 0xF3, 0x4D, 0x09, + 0x58, 0xF0, 0xE1, 0x0E, 0xE4, 0xFC, 0x7C, 0x02, 0xC2, 0xFB, 0xCE, 0xEF, + 0x43, 0xF0, 0x61, 0xED, 0x21, 0xED, 0x9F, 0xEF, 0x56, 0xF3, 0xA0, 0xF1, + 0x23, 0xFD, 0xB8, 0xF8, 0xDD, 0x04, 0xB3, 0xFE, 0xFB, 0x0A, 0x70, 0x03, + 0xDE, 0x06, 0xA1, 0x0C, 0x35, 0xF7, 0x6E, 0x11, 0x68, 0xF8, 0x47, 0x11, + 0x35, 0x05, 0x14, 0x0B, 0x4E, 0xF8, 0xB7, 0xFA, 0xAB, 0xE9, 0xCE, 0xF2, + 0x5B, 0xF0, 0x87, 0x00, 0xF2, 0xEE, 0x58, 0x11, 0xB1, 0xE8, 0xED, 0x13, + 0x21, 0x02, 0x3A, 0x17, 0x5A, 0x29, 0x3C, 0x1E, 0x3F, 0x3C, 0x28, 0x27, + 0x10, 0x40, 0x50, 0x25, 0x49, 0x2F, 0x40, 0x0D, 0x84, 0x07, 0x2C, 0xEB, + 0x5F, 0xE3, 0x1D, 0xD1, 0x92, 0xCF, 0x53, 0xC6, 0x22, 0xC6, 0x7B, 0xC9, + 0x33, 0xC2, 0x1F, 0xD3, 0x2E, 0xDB, 0xA9, 0xE7, 0xDE, 0x0C, 0x65, 0x09, + 0xE0, 0x2E, 0x03, 0x24, 0x3C, 0x3F, 0x3A, 0x2F, 0x83, 0x3F, 0xEE, 0x32, + 0xC9, 0x35, 0xEA, 0x3F, 0xAE, 0x34, 0x34, 0x4E, 0xA2, 0x2B, 0xD7, 0x43, + 0x58, 0x0F, 0xCA, 0x27, 0x13, 0xF2, 0x49, 0x0F, 0x14, 0xDC, 0x84, 0xF3, + 0xF7, 0xCA, 0x44, 0xD6, 0xF1, 0xB8, 0x26, 0xC7, 0xCD, 0xA8, 0xCE, 0xC0, + 0x54, 0xB0, 0x7B, 0xC2, 0xDA, 0xD1, 0xEF, 0xCF, 0x7C, 0xED, 0xAA, 0xDF, + 0xD5, 0xF6, 0xCE, 0xEB, 0xFF, 0xFC, 0x63, 0xFD, 0x97, 0x05, 0xA2, 0x0F, + 0x6A, 0x14, 0x6F, 0x1A, 0x16, 0x20, 0xD3, 0x22, 0x44, 0x18, 0xAC, 0x21, + 0x21, 0x13, 0x7F, 0x15, 0x99, 0x0C, 0x7E, 0xFF, 0x86, 0xF9, 0xD7, 0xE8, + 0xC7, 0xED, 0x7A, 0xDF, 0x55, 0xEE, 0x3B, 0xE3, 0xD6, 0xFB, 0x9E, 0xEE, + 0x31, 0x14, 0x35, 0xF8, 0x87, 0x2C, 0x85, 0x00, 0x9A, 0x2E, 0xA6, 0x01, + 0xB8, 0x21, 0x99, 0xFD, 0x28, 0x14, 0x67, 0x01, 0x27, 0x09, 0x5B, 0xFD, + 0xD6, 0x03, 0x9A, 0xF0, 0x43, 0xF5, 0x5A, 0xEE, 0x5B, 0xE5, 0x37, 0xFC, + 0x98, 0xE7, 0x1C, 0x0D, 0xD7, 0xF0, 0xF2, 0x0B, 0xFF, 0xEB, 0x0D, 0xFC, + 0x4D, 0xDC, 0x05, 0xE3, 0x66, 0xD6, 0xFB, 0xCD, 0xFA, 0xE0, 0x16, 0xC8, + 0x0A, 0xF3, 0x23, 0xD1, 0xB6, 0xFC, 0xDB, 0xEA, 0x08, 0xF4, 0x56, 0x03, + 0x54, 0xEE, 0xB2, 0x14, 0xCD, 0xF0, 0x8A, 0x18, 0x17, 0xE5, 0x57, 0x0B, + 0x26, 0xCF, 0x20, 0xF9, 0xA0, 0xD1, 0x55, 0xF3, 0x93, 0xE6, 0x9E, 0xF8, + 0x70, 0xEC, 0xA8, 0xF0, 0xAA, 0xEB, 0x84, 0xE4, 0x18, 0xE8, 0xD7, 0xE2, + 0xF4, 0xE0, 0x4F, 0xE4, 0xD1, 0xE9, 0x56, 0xEC, 0xA9, 0x03, 0xB3, 0x02, + 0xF7, 0x1B, 0x6F, 0x13, 0xDA, 0x26, 0x97, 0x13, 0x9C, 0x20, 0x23, 0x14, + 0x3D, 0x08, 0x3F, 0x0A, 0x0B, 0xE9, 0xE5, 0xEC, 0x26, 0xCA, 0x19, 0xCC, + 0x48, 0xB3, 0x6B, 0xB8, 0x28, 0xB1, 0xA2, 0xB7, 0x61, 0xBF, 0xA7, 0xC0, + 0x1C, 0xE0, 0x72, 0xD4, 0x1F, 0x05, 0x2A, 0xF3, 0x23, 0x16, 0x6D, 0x14, + 0xB7, 0x22, 0xE0, 0x2C, 0xED, 0x33, 0xB4, 0x38, 0x8B, 0x42, 0x1B, 0x43, + 0x82, 0x42, 0x9B, 0x3F, 0xF7, 0x36, 0x02, 0x2F, 0xD0, 0x2C, 0x76, 0x24, + 0x44, 0x15, 0x7E, 0x0D, 0xB7, 0xF4, 0x62, 0xE4, 0x3E, 0xDB, 0x75, 0xC4, + 0x19, 0xC4, 0x53, 0xB8, 0xBC, 0xB7, 0xCF, 0xBC, 0xB1, 0xC0, 0x9B, 0xCA, + 0xE0, 0xD8, 0xDB, 0xDF, 0x79, 0xF4, 0x6D, 0xF5, 0xEE, 0x10, 0x7E, 0x02, + 0xF8, 0x21, 0xE9, 0x0E, 0xD8, 0x26, 0x38, 0x21, 0xF7, 0x32, 0x08, 0x3C, + 0x62, 0x41, 0x77, 0x54, 0x69, 0x47, 0x43, 0x62, 0xEA, 0x40, 0x7E, 0x62, + 0x06, 0x2F, 0x3E, 0x5A, 0x92, 0x1B, 0x99, 0x4A, 0x27, 0x15, 0xA8, 0x31, + 0x60, 0x12, 0xCE, 0x1B, 0x86, 0x0F, 0xE3, 0x0F, 0xCB, 0x19, 0x90, 0x13, + 0x03, 0x2A, 0x26, 0x20, 0xDB, 0x39, 0xDA, 0x2C, 0x16, 0x47, 0x17, 0x36, + 0xD1, 0x46, 0xA5, 0x34, 0x03, 0x3E, 0xEF, 0x31, 0x76, 0x32, 0x96, 0x30, + 0x90, 0x24, 0xDD, 0x26, 0x78, 0x23, 0x38, 0x1B, 0x01, 0x2A, 0x17, 0x1A, + 0xFD, 0x27, 0x18, 0x20, 0x1D, 0x1C, 0x63, 0x1D, 0x5A, 0x11, 0x77, 0x14, + 0xE6, 0x14, 0xAC, 0x0C, 0x55, 0x1F, 0xCB, 0x06, 0xFA, 0x1B, 0xC2, 0x08, + 0x9E, 0x11, 0x5D, 0x18, 0x18, 0x15, 0xF2, 0x2B, 0xB4, 0x15, 0xBB, 0x2E, + 0x35, 0x09, 0xFE, 0x34, 0x3C, 0xF9, 0x9A, 0x41, 0xD0, 0xEA, 0x87, 0x36, + 0x75, 0xF2, 0x3D, 0x27, 0x99, 0x07, 0xBF, 0x2A, 0xC7, 0x10, 0xA4, 0x28, + 0x90, 0x0F, 0x90, 0x16, 0x2B, 0x06, 0x8D, 0x0A, 0x20, 0xFC, 0x80, 0x05, + 0x4E, 0xFD, 0x87, 0x01, 0x72, 0x0A, 0xD6, 0x0A, 0x98, 0x1A, 0x13, 0x23, + 0xD4, 0x27, 0xF0, 0x31, 0xCE, 0x2E, 0x48, 0x31, 0x6D, 0x2F, 0x2C, 0x28, + 0x7D, 0x1F, 0xA3, 0x0E, 0x8D, 0xF5, 0x55, 0xE6, 0x77, 0xC9, 0x91, 0xC7, + 0x12, 0xB6, 0x50, 0xBE, 0xEC, 0xBC, 0xE6, 0xB7, 0x67, 0xD9, 0x3B, 0xB6, + 0x8D, 0xFA, 0xBE, 0xC5, 0x76, 0x0D, 0xA9, 0xDD, 0x94, 0x21, 0xCD, 0x00, + 0x90, 0x36, 0xC4, 0x29, 0x93, 0x33, 0xFE, 0x3A, 0x91, 0x28, 0xAA, 0x34, + 0x4A, 0x29, 0xAE, 0x28, 0x9E, 0x29, 0x49, 0x1A, 0x05, 0x17, 0x30, 0x0B, + 0x9C, 0xE9, 0x94, 0xF9, 0x17, 0xBF, 0x24, 0xE1, 0xAE, 0xB0, 0x16, 0xC7, + 0xE7, 0xAE, 0xBC, 0xAF, 0xC3, 0xAB, 0xC1, 0x9F, 0xC8, 0xB0, 0xB5, 0x9F, + 0x6A, 0xC2, 0xD0, 0xAF, 0x65, 0xDD, 0x8F, 0xC4, 0x47, 0xFC, 0x38, 0xDB, + 0xFA, 0x10, 0xB7, 0xF0, 0x62, 0x17, 0x64, 0xFB, 0x26, 0x15, 0xF5, 0x03, + 0x22, 0x10, 0x67, 0x0C, 0x58, 0x07, 0x2A, 0x11, 0x5E, 0xF5, 0xF5, 0x0C, + 0x57, 0xE1, 0x94, 0x02, 0x7E, 0xDA, 0x80, 0xFA, 0x89, 0xD5, 0x38, 0xEA, + 0x5B, 0xD5, 0x11, 0xDC, 0xA8, 0xE9, 0x7A, 0xE0, 0x61, 0xFA, 0xD2, 0xEA, + 0x26, 0xFD, 0xF9, 0xF4, 0x6B, 0x01, 0xEE, 0x05, 0x5D, 0x06, 0x7C, 0x0E, + 0xC2, 0xFD, 0xD6, 0x00, 0x30, 0xEE, 0x5B, 0xF3, 0x9D, 0xE5, 0xA8, 0xED, + 0x7E, 0xE3, 0x92, 0xE2, 0xE0, 0xE5, 0x85, 0xE0, 0x85, 0xEA, 0x1F, 0xEB, + 0x65, 0xE5, 0xD6, 0xE1, 0x51, 0xD7, 0xE0, 0xCC, 0x74, 0xC9, 0xD1, 0xC7, + 0xA9, 0xC9, 0xD5, 0xCD, 0x84, 0xD5, 0xC4, 0xD2, 0x35, 0xE4, 0x2E, 0xD7, + 0x26, 0xF1, 0xFE, 0xE3, 0xC7, 0xF3, 0xA0, 0xEE, 0x87, 0xFB, 0x81, 0xF6, + 0x9F, 0x01, 0x7A, 0xFC, 0x48, 0xEE, 0xD8, 0xF5, 0xE4, 0xD6, 0xBB, 0xEB, + 0xAF, 0xD6, 0x22, 0xE9, 0xF3, 0xE3, 0xCF, 0xEC, 0xDC, 0xEA, 0xEB, 0xEE, + 0xC0, 0xE5, 0x59, 0xF3, 0x04, 0xEB, 0xD7, 0x07, 0x0F, 0xF0, 0xF2, 0x16, + 0xA1, 0xE8, 0x29, 0x10, 0x4E, 0xEC, 0x87, 0x0C, 0x96, 0xF2, 0x72, 0x0C, + 0x22, 0xF7, 0x80, 0x08, 0x05, 0x04, 0x3C, 0x08, 0x34, 0x02, 0x9C, 0x01, + 0x04, 0xEA, 0x16, 0xED, 0x08, 0xD7, 0x7A, 0xD2, 0xF1, 0xD1, 0x99, 0xC0, + 0x8D, 0xCE, 0x61, 0xBA, 0x0F, 0xC8, 0x4F, 0xB5, 0xE8, 0xD3, 0x35, 0xBA, + 0x42, 0xFB, 0xDD, 0xD1, 0x0C, 0x1C, 0x6E, 0xEF, 0xE8, 0x25, 0x67, 0x0E, + 0x7A, 0x31, 0x15, 0x26, 0xCE, 0x3E, 0x83, 0x33, 0x38, 0x3D, 0x12, 0x41, + 0x78, 0x37, 0xB6, 0x46, 0x1C, 0x37, 0x6F, 0x38, 0x7C, 0x24, 0xB0, 0x1D, + 0x05, 0xFE, 0x0F, 0x01, 0xEF, 0xD9, 0xE5, 0xE5, 0xEF, 0xBB, 0x02, 0xCB, + 0x6F, 0xB0, 0xDF, 0xB7, 0x9C, 0xBE, 0x9F, 0xB3, 0x4A, 0xDC, 0xB4, 0xBC, + 0xD0, 0xF2, 0x66, 0xD5, 0xD9, 0x01, 0x5B, 0xF2, 0x8C, 0x16, 0x04, 0x0F, + 0x96, 0x25, 0xF6, 0x25, 0x6E, 0x1F, 0xD0, 0x2E, 0x18, 0x11, 0x50, 0x33, + 0x5F, 0x05, 0x61, 0x31, 0x20, 0x03, 0x52, 0x28, 0x1A, 0x10, 0x41, 0x22, + 0x2B, 0x1B, 0xD8, 0x1E, 0x98, 0x1F, 0x89, 0x16, 0x4E, 0x22, 0x43, 0x0A, + 0x88, 0x21, 0x36, 0xFE, 0xA5, 0x19, 0x7A, 0xF4, 0xDA, 0x1D, 0x8B, 0xFA, + 0xD0, 0x26, 0xD6, 0x0D, 0xDF, 0x22, 0x5A, 0x20, 0x59, 0x21, 0xB3, 0x2A, + 0x99, 0x25, 0xD7, 0x27, 0xBA, 0x27, 0xE0, 0x24, 0xC4, 0x1A, 0xCF, 0x29, + 0xD9, 0x03, 0x69, 0x30, 0xDC, 0x02, 0x8D, 0x31, 0xBA, 0x10, 0x5C, 0x27, + 0x21, 0x0F, 0xCC, 0x18, 0x5E, 0x0D, 0x8C, 0x11, 0x1D, 0x09, 0xBA, 0x0A, + 0xEF, 0xFB, 0x0A, 0x03, 0x96, 0x05, 0xC8, 0xFF, 0x06, 0x21, 0x57, 0x04, + 0xFD, 0x25, 0xD4, 0x0D, 0x76, 0x1A, 0xE5, 0x11, 0x60, 0x18, 0x43, 0x12, + 0x84, 0x0D, 0x32, 0x08, 0xC0, 0xF9, 0x7C, 0xFC, 0xD0, 0xFA, 0xD5, 0x01, + 0x4F, 0x03, 0x5A, 0x0A, 0x02, 0xFC, 0xE3, 0x08, 0xF7, 0xFF, 0xD8, 0x07, + 0x56, 0x19, 0x1C, 0x08, 0x20, 0x2B, 0x35, 0x02, 0xF7, 0x20, 0x78, 0xF8, + 0xCD, 0x0E, 0x62, 0xF9, 0xCA, 0x06, 0xA5, 0x06, 0x1C, 0x09, 0x19, 0x10, + 0xD3, 0x14, 0x78, 0x16, 0xC6, 0x12, 0x03, 0x16, 0x66, 0x0B, 0xE0, 0x09, + 0xE9, 0x00, 0x35, 0xF2, 0x60, 0xE3, 0x2A, 0xD4, 0x18, 0xC9, 0x0C, 0xBC, + 0xF2, 0xB9, 0x16, 0xA7, 0x7F, 0xB8, 0xC0, 0xA8, 0xAE, 0xD4, 0xD1, 0xC8, + 0xDF, 0xFD, 0x08, 0xEB, 0x7A, 0x17, 0x14, 0x0B, 0x6C, 0x25, 0xE1, 0x28, + 0x7F, 0x2B, 0x30, 0x3E, 0x8C, 0x27, 0xF0, 0x47, 0xAD, 0x24, 0x61, 0x40, + 0x8B, 0x28, 0x2F, 0x2B, 0xBA, 0x19, 0x67, 0x09, 0xA4, 0xF5, 0xAF, 0xEB, + 0x81, 0xDA, 0x48, 0xD9, 0x72, 0xC0, 0xBF, 0xBE, 0x4A, 0xAB, 0x82, 0xA9, + 0x15, 0xA4, 0xC5, 0xA8, 0xA5, 0xA4, 0x5A, 0xB4, 0xAA, 0xB8, 0x72, 0xC5, + 0x68, 0xD9, 0x94, 0xD5, 0x98, 0xEB, 0xA1, 0xE8, 0xE9, 0xF2, 0xE8, 0xFF, + 0x31, 0x09, 0x55, 0x12, 0xF0, 0x24, 0x39, 0x1A, 0x75, 0x2F, 0xB5, 0x18, + 0x19, 0x2C, 0x76, 0x20, 0xB4, 0x1E, 0x21, 0x2E, 0x7C, 0x0F, 0x92, 0x2F, + 0x2B, 0x0B, 0x7D, 0x2D, 0xFC, 0x02, 0x08, 0x27, 0x67, 0xFC, 0xBE, 0x19, + 0x13, 0x00, 0x1D, 0x13, 0x57, 0x02, 0x80, 0x12, 0xA4, 0x0B, 0x8E, 0x0F, + 0xB8, 0x20, 0xAE, 0x09, 0x91, 0x34, 0x95, 0x0B, 0x85, 0x37, 0x15, 0x0E, + 0xEA, 0x32, 0xB8, 0x0A, 0x4A, 0x2A, 0x71, 0x10, 0x97, 0x19, 0x9E, 0x1C, + 0xF9, 0x0F, 0x3D, 0x20, 0xD6, 0x08, 0x35, 0x17, 0x85, 0x03, 0xE9, 0x09, + 0xFF, 0x08, 0xE5, 0xFE, 0x17, 0x0D, 0x41, 0xFD, 0x28, 0x09, 0xBD, 0x05, + 0x25, 0xFF, 0xF1, 0x08, 0x43, 0x05, 0xD5, 0x09, 0xB3, 0x16, 0xE0, 0x13, + 0xC2, 0x14, 0x9C, 0x19, 0xC5, 0x09, 0x34, 0x1A, 0xE6, 0xFE, 0xC7, 0x16, + 0x97, 0xF7, 0x82, 0x06, 0x05, 0xF5, 0x40, 0xFF, 0xCA, 0xF2, 0x05, 0x0D, + 0xE1, 0xF6, 0x74, 0x18, 0x3F, 0x01, 0xBC, 0x11, 0x43, 0x04, 0x17, 0x05, + 0xA2, 0xFD, 0x82, 0xFF, 0xCB, 0xF3, 0xD7, 0xF8, 0xDB, 0xED, 0x7D, 0xF5, + 0x94, 0xF5, 0x0E, 0xFD, 0x5C, 0x02, 0x9B, 0x00, 0xE5, 0x13, 0xFF, 0xFC, + 0x61, 0x28, 0xA4, 0xF6, 0xDC, 0x21, 0x13, 0xEC, 0xF9, 0xFD, 0x77, 0xDE, + 0xB1, 0xD8, 0x19, 0xD0, 0x54, 0xC4, 0x0A, 0xBE, 0x99, 0xBC, 0x4E, 0xA8, + 0x32, 0xBC, 0xD0, 0x9E, 0x03, 0xC7, 0x03, 0xA8, 0x8C, 0xDA, 0xE5, 0xC3, + 0x30, 0xF1, 0xCE, 0xEE, 0x9E, 0x06, 0x59, 0x10, 0x8F, 0x13, 0x90, 0x1B, + 0x61, 0x1D, 0x02, 0x21, 0xAC, 0x26, 0xEB, 0x28, 0xD9, 0x17, 0x9D, 0x21, + 0xEA, 0xF5, 0xE3, 0x06, 0x1A, 0xDA, 0xA4, 0xE5, 0xE2, 0xC3, 0xFF, 0xC5, + 0xA6, 0xAA, 0x3B, 0xAF, 0xEC, 0x9C, 0x8C, 0xA5, 0xDE, 0xA0, 0x88, 0xA3, + 0xD4, 0xAB, 0x59, 0xA5, 0x2E, 0xBC, 0xC4, 0xB4, 0xC9, 0xC2, 0x58, 0xCC, + 0xC9, 0xC4, 0xB4, 0xD6, 0x59, 0xD0, 0x1A, 0xD9, 0xB9, 0xDD, 0x76, 0xE8, + 0xCA, 0xF4, 0x07, 0x03, 0x0E, 0x0C, 0x57, 0x11, 0x2A, 0x1A, 0x6B, 0x0F, + 0xB0, 0x28, 0xD3, 0x0C, 0xE8, 0x22, 0x5A, 0x0C, 0xCC, 0x05, 0xB0, 0x08, + 0x98, 0xEB, 0x09, 0xFD, 0x95, 0xE2, 0xC8, 0xED, 0x4C, 0xE3, 0x54, 0xE8, + 0x79, 0xE7, 0xB2, 0xF1, 0x6A, 0xF6, 0x48, 0xFF, 0x41, 0x0E, 0xF1, 0x00, + 0xA5, 0x1A, 0x78, 0xFF, 0x88, 0x18, 0x29, 0x07, 0x01, 0x14, 0x89, 0x0E, + 0xE5, 0x0B, 0x54, 0x1B, 0xC6, 0x02, 0xD9, 0x1F, 0x77, 0xFD, 0xA1, 0x10, + 0xD7, 0xFC, 0x2B, 0x06, 0x2E, 0x00, 0xCD, 0xFB, 0xE8, 0x05, 0x72, 0xE8, + 0xEB, 0x08, 0xEF, 0xDB, 0x0D, 0x12, 0xF1, 0xDF, 0x50, 0x1D, 0x3D, 0xEC, + 0x3A, 0x1D, 0x8A, 0x00, 0xAC, 0x15, 0x75, 0x17, 0x40, 0x10, 0x4B, 0x22, + 0xC5, 0x10, 0xE2, 0x1F, 0x39, 0x0F, 0x5A, 0x15, 0xC5, 0x06, 0x41, 0x09, + 0xAF, 0xFD, 0x5B, 0x0B, 0xAA, 0x00, 0xC1, 0x1F, 0xCF, 0x11, 0xC7, 0x32, + 0xCD, 0x20, 0xA3, 0x38, 0x5C, 0x2C, 0xE1, 0x31, 0xF2, 0x34, 0xDC, 0x2F, + 0x38, 0x27, 0x81, 0x35, 0xC9, 0x0A, 0xE4, 0x2D, 0xC4, 0xFB, 0xDA, 0x26, + 0x0C, 0x06, 0xCF, 0x2A, 0x87, 0x20, 0x3C, 0x2E, 0x89, 0x37, 0xA9, 0x2C, + 0xAA, 0x39, 0xE2, 0x22, 0xBC, 0x2A, 0x02, 0x16, 0xB5, 0x12, 0xB9, 0x02, + 0x14, 0xF4, 0xC1, 0xEC, 0xE3, 0xDC, 0x07, 0xE0, 0xF8, 0xD4, 0x7A, 0xDD, + 0x02, 0xDE, 0x17, 0xE5, 0x1D, 0xFB, 0x42, 0xF9, 0xBC, 0x21, 0x0B, 0x13, + 0xA3, 0x3F, 0xC8, 0x27, 0x89, 0x56, 0xF4, 0x39, 0x15, 0x65, 0xE4, 0x46, + 0xDF, 0x5F, 0x20, 0x49, 0x9E, 0x4C, 0xBF, 0x44, 0x2A, 0x36, 0x07, 0x3B, + 0x5F, 0x1A, 0x43, 0x2A, 0x51, 0xF9, 0x16, 0x14, 0xCD, 0xE2, 0xD8, 0x02, + 0xFF, 0xD4, 0x8C, 0xFB, 0x80, 0xCE, 0x48, 0xF1, 0x4E, 0xD0, 0xF7, 0xE3, + 0x00, 0xD5, 0x3D, 0xE4, 0x23, 0xE9, 0x15, 0xF1, 0xFD, 0x09, 0xB8, 0xFF, + 0x66, 0x1C, 0x56, 0x0C, 0x76, 0x14, 0x67, 0x18, 0xEA, 0x0D, 0x58, 0x23, + 0xB3, 0x16, 0x59, 0x31, 0x1F, 0x1D, 0x1E, 0x47, 0xE5, 0x20, 0xDC, 0x4F, + 0xC1, 0x23, 0x08, 0x41, 0xA9, 0x25, 0xDC, 0x27, 0x5B, 0x23, 0x98, 0x14, + 0x9C, 0x17, 0xEC, 0x0E, 0x20, 0x09, 0xEE, 0x08, 0x32, 0x02, 0x48, 0x06, + 0xD3, 0x12, 0x60, 0x0D, 0xDB, 0x2B, 0x63, 0x12, 0xE5, 0x3C, 0x88, 0x16, + 0x42, 0x49, 0x37, 0x19, 0x7E, 0x43, 0x0D, 0x1C, 0x7D, 0x29, 0x54, 0x1E, + 0x2F, 0x0E, 0x6A, 0x17, 0xB1, 0xFA, 0xE9, 0x0B, 0x69, 0xEC, 0x6B, 0x04, + 0x65, 0xE1, 0x00, 0xF8, 0x7B, 0xE1, 0x76, 0xE5, 0x87, 0xF8, 0xDC, 0xD9, + 0xED, 0x11, 0x1B, 0xDA, 0xFF, 0x18, 0x5D, 0xE1, 0x20, 0x10, 0xBB, 0xEB, + 0xD8, 0x01, 0x49, 0xF7, 0x02, 0xFC, 0xC9, 0xFD, 0x43, 0x00, 0xE0, 0x00, + 0x5D, 0x05, 0xCB, 0xFE, 0xD5, 0xFE, 0x95, 0xFA, 0xC4, 0xF3, 0x19, 0xF9, + 0xF7, 0xF4, 0x1B, 0xFE, 0xA7, 0xF4, 0xE6, 0x06, 0xDB, 0xE6, 0x44, 0xFE, + 0x91, 0xE0, 0x11, 0xE8, 0x30, 0xE5, 0x8A, 0xDA, 0xF2, 0xE7, 0xA6, 0xD3, + 0x6E, 0xE9, 0x9A, 0xCC, 0x20, 0xEA, 0x91, 0xCF, 0xF1, 0xE7, 0x37, 0xDC, + 0x30, 0xE3, 0x98, 0xED, 0x74, 0xE4, 0x37, 0x02, 0x4D, 0xE8, 0xBA, 0x02, + 0x8B, 0xDF, 0x00, 0xEE, 0xCE, 0xCF, 0xC8, 0xD7, 0x31, 0xBF, 0x0B, 0xC8, + 0xEC, 0xB4, 0xF9, 0xBE, 0xD7, 0xB0, 0xD7, 0xAF, 0x3E, 0xAB, 0xE5, 0x9F, + 0x26, 0xB4, 0x09, 0xA4, 0xF1, 0xD2, 0x16, 0xC0, 0x26, 0xF5, 0x29, 0xE3, + 0x1E, 0x10, 0xB9, 0xFF, 0x92, 0x20, 0xBB, 0x12, 0x46, 0x1F, 0x93, 0x1B, + 0x2A, 0x19, 0x7B, 0x16, 0x09, 0x0D, 0x6A, 0x07, 0x42, 0xE6, 0x88, 0xEF, + 0x9F, 0xC1, 0xF4, 0xCD, 0xF8, 0xB8, 0xF3, 0xBA, 0x4D, 0xB0, 0x03, 0xB5, + 0x4F, 0xA2, 0x98, 0xAA, 0x42, 0x9F, 0x62, 0xA1, 0xEE, 0xA8, 0x35, 0xA4, + 0x11, 0xB6, 0xB3, 0xB1, 0x8F, 0xBF, 0xAD, 0xBE, 0xD2, 0xCD, 0xEE, 0xD0, + 0x22, 0xE3, 0x9E, 0xE4, 0x32, 0xFA, 0xB7, 0xF2, 0x8B, 0x08, 0xCF, 0x07, + 0x0A, 0x06, 0x09, 0x1E, 0x3F, 0x02, 0x6E, 0x29, 0x59, 0x06, 0x1A, 0x28, + 0x3A, 0x09, 0xBC, 0x17, 0xA6, 0x00, 0x34, 0xFE, 0xE2, 0xEC, 0x17, 0xF1, + 0x60, 0xE3, 0x52, 0xFA, 0xED, 0xE2, 0x6F, 0x09, 0x2F, 0xE6, 0x3E, 0x0F, + 0x48, 0xF0, 0x63, 0x06, 0x1E, 0x05, 0x9B, 0xFB, 0x6F, 0x1C, 0x8E, 0xF9, + 0xA6, 0x22, 0x2D, 0xFB, 0xB9, 0x19, 0xD4, 0xFE, 0x31, 0x06, 0x41, 0x06, + 0xC3, 0xFD, 0xE2, 0x10, 0x90, 0x03, 0xA6, 0x14, 0x8B, 0x03, 0xBE, 0x0B, + 0x88, 0x06, 0x93, 0xFB, 0x8B, 0x0D, 0xAE, 0xF7, 0xCF, 0x0B, 0xBF, 0x05, + 0xA5, 0x0A, 0x53, 0x0E, 0x56, 0x12, 0xC1, 0x11, 0xA8, 0x19, 0x3F, 0x18, + 0xE9, 0x18, 0x84, 0x13, 0x0F, 0x14, 0xC2, 0x03, 0x84, 0x0F, 0x20, 0xF9, + 0xF0, 0x08, 0xFB, 0xF9, 0xE0, 0x00, 0x50, 0xFF, 0x11, 0x03, 0x56, 0x08, + 0xFE, 0x05, 0x8A, 0x17, 0x1D, 0xFE, 0xB7, 0x1D, 0x07, 0xF6, 0xC1, 0x1D, + 0xA1, 0xF2, 0x7B, 0x23, 0x4F, 0xF9, 0x43, 0x25, 0x07, 0x03, 0x47, 0x1D, + 0xCF, 0x0E, 0x3F, 0x16, 0x52, 0x21, 0xA7, 0x10, 0x14, 0x2E, 0xD2, 0x05, + 0x9A, 0x33, 0x04, 0x02, 0xF8, 0x2C, 0x9C, 0x05, 0x30, 0x11, 0x67, 0x03, + 0xAC, 0xF8, 0xCA, 0xF6, 0x89, 0xF0, 0x46, 0xDF, 0xB7, 0xE7, 0xD4, 0xCD, + 0xEF, 0xDB, 0x31, 0xD1, 0xC4, 0xDB, 0x47, 0xE5, 0x9C, 0xEE, 0xB2, 0x00, + 0xB8, 0x0A, 0xC5, 0x1C, 0xBF, 0x2D, 0xCD, 0x38, 0x29, 0x50, 0x63, 0x50, + 0x96, 0x5C, 0xD5, 0x5D, 0xE6, 0x59, 0xDC, 0x5E, 0x81, 0x4E, 0x59, 0x4F, + 0xA1, 0x31, 0x18, 0x37, 0x54, 0x10, 0xD4, 0x22, 0x3C, 0xF7, 0x02, 0x08, + 0x0B, 0xE4, 0x77, 0xE2, 0xD6, 0xCF, 0x66, 0xC7, 0x1E, 0xC0, 0x91, 0xC2, + 0x2A, 0xC1, 0xC8, 0xCB, 0xF6, 0xD0, 0x27, 0xDE, 0x1E, 0xE8, 0x5E, 0xF2, + 0x63, 0x06, 0xED, 0xFE, 0xAB, 0x25, 0x0F, 0x0B, 0x62, 0x38, 0xAB, 0x1A, + 0x56, 0x38, 0x48, 0x24, 0x70, 0x2F, 0x02, 0x23, 0x83, 0x2A, 0xA4, 0x17, + 0x0C, 0x23, 0x07, 0x0B, 0x62, 0x18, 0xEE, 0x08, 0x80, 0x15, 0x65, 0x0A, + 0xA9, 0x15, 0x8F, 0x08, 0xEF, 0x0C, 0x66, 0x02, 0x4C, 0x02, 0x63, 0xFC, + 0xF9, 0xFB, 0x7F, 0x01, 0x8B, 0xFC, 0x47, 0x09, 0x14, 0x0B, 0xDA, 0x0B, + 0xC3, 0x19, 0xD5, 0x16, 0xB4, 0x1C, 0x3E, 0x22, 0x72, 0x22, 0xBE, 0x1D, + 0x8B, 0x2C, 0xA3, 0x15, 0xF4, 0x2A, 0xA5, 0x11, 0xF4, 0x13, 0x4D, 0x08, + 0x5D, 0xF2, 0x8B, 0xFE, 0xD6, 0xE1, 0x22, 0xFA, 0x84, 0xE5, 0xE1, 0xED, + 0x5F, 0xF1, 0x92, 0xE0, 0x8C, 0x00, 0x19, 0xE0, 0x3C, 0x07, 0x67, 0xE7, + 0xBC, 0x02, 0x4E, 0xFB, 0xE8, 0xF9, 0xE0, 0x12, 0xB1, 0xF5, 0x75, 0x17, + 0x58, 0xF8, 0x16, 0x12, 0x46, 0xF7, 0x44, 0x11, 0x86, 0xF4, 0x9B, 0x13, + 0xCC, 0xF6, 0xD3, 0x0C, 0xBE, 0xF9, 0xA7, 0x04, 0xB2, 0xFA, 0x49, 0xFF, + 0x67, 0xFC, 0xEB, 0xEC, 0x44, 0xFB, 0x89, 0xE2, 0xA3, 0xFB, 0x76, 0xF2, + 0xAE, 0x02, 0xEB, 0x03, 0x9D, 0x06, 0x77, 0x0D, 0x96, 0x0A, 0x7F, 0x16, + 0xE6, 0x08, 0xC1, 0x19, 0x3B, 0xFF, 0x8B, 0x17, 0xE0, 0xF8, 0xD8, 0x0E, + 0x6B, 0xEF, 0x9A, 0x04, 0xA6, 0xE2, 0xC5, 0xFD, 0x11, 0xE3, 0x9E, 0xF1, + 0x2D, 0xED, 0x8F, 0xE4, 0x49, 0xED, 0xCB, 0xDB, 0xC3, 0xEC, 0x80, 0xD3, + 0xB6, 0xF7, 0xCF, 0xD1, 0xAF, 0x03, 0x30, 0xE3, 0x70, 0x0D, 0x1A, 0x04, + 0x04, 0x22, 0x0A, 0x26, 0xA8, 0x43, 0xA3, 0x3F, 0x8A, 0x5A, 0x4B, 0x43, + 0x1D, 0x52, 0xEF, 0x38, 0x68, 0x2F, 0x7E, 0x2C, 0x34, 0x0C, 0x47, 0x1B, + 0xDE, 0xF7, 0x5F, 0x0A, 0xE3, 0xF1, 0xDB, 0xF5, 0x1A, 0xEC, 0xCE, 0xE0, + 0xF6, 0xDD, 0x21, 0xDB, 0xE1, 0xD2, 0xB1, 0xE3, 0xB9, 0xCF, 0xCA, 0xE5, + 0xF8, 0xD1, 0xA9, 0xE1, 0xAB, 0xD9, 0xA6, 0xEE, 0xB5, 0xEA, 0xFA, 0x05, + 0x4A, 0xFF, 0xFD, 0x0B, 0xE8, 0x11, 0x63, 0x07, 0x69, 0x1F, 0xE5, 0x09, + 0x1D, 0x1E, 0xAA, 0x10, 0x51, 0x10, 0xC7, 0x18, 0xE0, 0x01, 0x43, 0x18, + 0xAC, 0x00, 0xC5, 0x0D, 0x49, 0x0A, 0x26, 0x04, 0x78, 0x0E, 0x7A, 0x02, + 0xB6, 0x0D, 0xD0, 0x0D, 0x38, 0x0C, 0x2F, 0x19, 0x62, 0x04, 0x79, 0x13, + 0xAA, 0xFD, 0x36, 0x00, 0x8C, 0xF6, 0xF2, 0xEE, 0x69, 0xEE, 0x49, 0xE9, + 0x8F, 0xF9, 0x21, 0xE7, 0xB0, 0x0E, 0x29, 0xE7, 0xC6, 0x17, 0x49, 0xEB, + 0x2D, 0x11, 0x71, 0xEB, 0x82, 0x02, 0x3E, 0xE7, 0x23, 0xF0, 0xC4, 0xE8, + 0x58, 0xD6, 0xBF, 0xEC, 0x12, 0xBF, 0x3E, 0xE9, 0x0C, 0xC1, 0xE4, 0xE8, + 0xB6, 0xDB, 0x0C, 0xF0, 0x4A, 0xFA, 0x76, 0xF4, 0x58, 0x08, 0x6C, 0xEE, + 0x6E, 0x00, 0xEE, 0xE4, 0x6C, 0xF2, 0xC0, 0xE7, 0xDF, 0xE8, 0xE9, 0xF0, + 0x6F, 0xE2, 0x6E, 0xED, 0x12, 0xDD, 0xEC, 0xE4, 0xD0, 0xD7, 0xC0, 0xE6, + 0x2D, 0xD1, 0xD2, 0xEF, 0xFD, 0xCD, 0x15, 0xF3, 0xEC, 0xD4, 0x5E, 0xEE, + 0x86, 0xDB, 0xFB, 0xEB, 0x0E, 0xDC, 0x53, 0xEB, 0x85, 0xDF, 0x01, 0xF3, + 0x5E, 0xE9, 0x9E, 0xFD, 0x9E, 0xFA, 0x03, 0xFE, 0xFC, 0x06, 0x9E, 0xFB, + 0xD1, 0xFD, 0xDD, 0xF8, 0xC9, 0xE6, 0xBE, 0xEF, 0xF6, 0xD4, 0x1D, 0xE3, + 0x0C, 0xCE, 0x01, 0xD6, 0x8A, 0xC9, 0xB3, 0xC6, 0x95, 0xCA, 0x35, 0xBE, + 0xBD, 0xD2, 0x41, 0xBA, 0x13, 0xDA, 0x96, 0xB9, 0x0A, 0xDF, 0xFF, 0xC9, + 0x62, 0xE9, 0x07, 0xE3, 0x5A, 0xFF, 0xA1, 0xF7, 0x0B, 0x1A, 0x0E, 0x10, + 0x1B, 0x33, 0x78, 0x2A, 0x3A, 0x44, 0x2B, 0x36, 0xEC, 0x45, 0xD1, 0x2E, + 0x95, 0x3B, 0xA6, 0x17, 0x3D, 0x2A, 0xBF, 0xF6, 0x72, 0x0B, 0x79, 0xDA, + 0x48, 0xE2, 0xE0, 0xCF, 0xC0, 0xC6, 0xF9, 0xCA, 0xBA, 0xC2, 0xA8, 0xBD, + 0xC6, 0xC7, 0x0E, 0xB8, 0xBF, 0xD0, 0x1D, 0xC7, 0x3C, 0xDB, 0xF1, 0xE2, + 0x15, 0xE8, 0x75, 0xF8, 0xE4, 0x00, 0xC4, 0x01, 0x9E, 0x20, 0x2D, 0x10, + 0x60, 0x3A, 0x45, 0x28, 0x98, 0x43, 0x3A, 0x3B, 0x0A, 0x38, 0x24, 0x42, + 0xFB, 0x25, 0x97, 0x41, 0xA5, 0x1A, 0xC4, 0x3E, 0xCA, 0x16, 0x32, 0x3C, + 0xE8, 0x13, 0x33, 0x38, 0x81, 0x0B, 0x58, 0x2D, 0x7A, 0x11, 0x64, 0x1F, + 0x3F, 0x25, 0x7A, 0x1B, 0x24, 0x25, 0xCA, 0x1F, 0x60, 0x17, 0xD4, 0x21, + 0x06, 0x11, 0xFD, 0x1F, 0x39, 0x16, 0xA9, 0x1F, 0x31, 0x1F, 0x55, 0x23, + 0x47, 0x22, 0x71, 0x28, 0x00, 0x29, 0x06, 0x29, 0x3E, 0x32, 0xEC, 0x1F, + 0x5B, 0x34, 0x7B, 0x17, 0xE1, 0x2A, 0x0E, 0x13, 0xE1, 0x16, 0x51, 0x08, + 0xAB, 0x0D, 0x16, 0x03, 0xF4, 0x12, 0xEC, 0x0F, 0x41, 0x12, 0xA2, 0x22, + 0x43, 0x13, 0xBA, 0x35, 0x51, 0x20, 0x8B, 0x37, 0xC0, 0x2E, 0x06, 0x26, + 0xA3, 0x35, 0xEE, 0x19, 0x3D, 0x27, 0x58, 0x17, 0x91, 0x0B, 0x3F, 0x1D, + 0xE9, 0x01, 0xFB, 0x26, 0xCA, 0x0D, 0x72, 0x2B, 0x32, 0x12, 0xAA, 0x24, + 0x99, 0x07, 0x82, 0x17, 0x2F, 0x03, 0x56, 0x19, 0x30, 0x06, 0xA4, 0x28, + 0x77, 0x05, 0x20, 0x2F, 0x48, 0x06, 0x20, 0x32, 0xF1, 0x10, 0x1C, 0x33, + 0x16, 0x1F, 0xDB, 0x2E, 0x1A, 0x23, 0x1A, 0x27, 0xA1, 0x16, 0x05, 0x17, + 0x60, 0x01, 0xD1, 0x02, 0xC2, 0xF1, 0x7A, 0xF4, 0x01, 0xEF, 0x1A, 0xEC, + 0x50, 0xF2, 0xBB, 0xDD, 0x8B, 0xEF, 0x9F, 0xCD, 0x5F, 0xED, 0x8E, 0xCB, + 0xB8, 0xF4, 0x72, 0xD9, 0xA6, 0x02, 0xD4, 0xEC, 0x2A, 0x15, 0x4A, 0x04, + 0x3C, 0x2B, 0x36, 0x1C, 0x31, 0x42, 0xB8, 0x2A, 0xF2, 0x4D, 0x5F, 0x32, + 0x6A, 0x4A, 0x73, 0x2E, 0x3E, 0x36, 0x7D, 0x14, 0x3C, 0x13, 0x54, 0xEE, + 0x65, 0xF2, 0xE2, 0xD2, 0x8D, 0xD9, 0x66, 0xC6, 0x67, 0xCA, 0x57, 0xBF, + 0xF3, 0xC1, 0x59, 0xBD, 0x50, 0xC1, 0x9A, 0xC4, 0x8E, 0xD3, 0xA7, 0xCD, + 0xAD, 0xE4, 0x89, 0xD3, 0x7E, 0xE6, 0x6B, 0xD8, 0xFA, 0xE3, 0xE0, 0xDC, + 0x7F, 0xE2, 0xE9, 0xE3, 0x55, 0xF1, 0xD6, 0xF0, 0x65, 0x08, 0x50, 0x03, + 0xAB, 0x09, 0xC0, 0x10, 0xD9, 0x01, 0xDB, 0x11, 0xC4, 0x00, 0x14, 0x09, + 0xA9, 0xFB, 0x1D, 0xFD, 0xFA, 0xEC, 0xDB, 0xF0, 0xCD, 0xDB, 0xC1, 0xE3, + 0xA6, 0xD2, 0x2E, 0xE4, 0x45, 0xDB, 0x5C, 0xF0, 0x15, 0xF2, 0x60, 0xF0, + 0x14, 0x03, 0x28, 0xEB, 0xEB, 0x00, 0xF1, 0xF1, 0x85, 0xF4, 0x5E, 0xFE, + 0xE9, 0xEB, 0xD0, 0x00, 0x3C, 0xE3, 0x6D, 0xFE, 0xE7, 0xDE, 0x3C, 0x01, + 0x14, 0xE2, 0x64, 0xFA, 0x31, 0xDE, 0xA8, 0xEC, 0xF8, 0xD6, 0x47, 0xE4, + 0x69, 0xD5, 0xF8, 0xDA, 0x00, 0xD7, 0xDC, 0xD3, 0x35, 0xD7, 0x37, 0xD5, + 0x35, 0xDA, 0x05, 0xDB, 0x2D, 0xEA, 0x9D, 0xE0, 0x07, 0xFF, 0xC3, 0xE2, + 0xC7, 0x06, 0x06, 0xE6, 0x69, 0xFD, 0xF2, 0xEB, 0x10, 0xE9, 0x44, 0xE9, + 0x40, 0xDC, 0x78, 0xE2, 0x60, 0xE3, 0x1E, 0xE2, 0xC8, 0xEE, 0x61, 0xE5, + 0x08, 0xEF, 0x28, 0xEB, 0x91, 0xE9, 0x28, 0xEE, 0x1D, 0xEB, 0x08, 0xED, + 0x49, 0xEA, 0xB7, 0xF0, 0x62, 0xE0, 0x9E, 0xF4, 0x1F, 0xDE, 0xEA, 0xFB, + 0x25, 0xE9, 0x5A, 0x0C, 0x3E, 0xF5, 0x6E, 0x15, 0x50, 0xFB, 0x7C, 0x0E, + 0xA4, 0xFF, 0xD4, 0xFE, 0x4D, 0xF8, 0x87, 0xF2, 0xA1, 0xDF, 0x35, 0xE3, + 0xF3, 0xC5, 0x78, 0xC8, 0x57, 0xBC, 0x6F, 0xB2, 0xD7, 0xC4, 0xF6, 0xAC, + 0xBB, 0xCC, 0xED, 0xBA, 0xA5, 0xD2, 0xE2, 0xD0, 0xCD, 0xE5, 0x0C, 0xE2, + 0x13, 0x01, 0x14, 0xFA, 0x18, 0x1C, 0xAF, 0x1E, 0x7C, 0x33, 0x2A, 0x3C, + 0xEC, 0x3E, 0x4B, 0x47, 0x99, 0x3D, 0x64, 0x41, 0x0D, 0x33, 0xC9, 0x30, + 0xAA, 0x1E, 0x37, 0x19, 0xAA, 0x04, 0x87, 0xFA, 0xAD, 0xEE, 0xD3, 0xD9, + 0x32, 0xE0, 0xAB, 0xBF, 0x8F, 0xDB, 0xE3, 0xB7, 0xE3, 0xDC, 0x08, 0xBF, + 0x3B, 0xDE, 0xF3, 0xC3, 0xAB, 0xE4, 0xD5, 0xCC, 0x65, 0xED, 0x9E, 0xEA, + 0x03, 0xF3, 0x45, 0x0B, 0x5F, 0xF7, 0xBB, 0x1E, 0x52, 0xFD, 0x65, 0x2D, + 0x4F, 0x06, 0x8F, 0x36, 0x73, 0x0B, 0x10, 0x38, 0x8E, 0x10, 0x17, 0x38, + 0x99, 0x1C, 0x06, 0x30, 0x16, 0x28, 0x1F, 0x18, 0x67, 0x2D, 0x17, 0x00, + 0x67, 0x2A, 0xCC, 0xF3, 0x8C, 0x1F, 0x7E, 0xF5, 0xF6, 0x14, 0x90, 0x02, + 0x4F, 0x0E, 0xEC, 0x11, 0xC9, 0x0F, 0x11, 0x21, 0x1A, 0x1A, 0x7B, 0x31, + 0x56, 0x23, 0xC3, 0x3B, 0xA5, 0x1D, 0xE2, 0x35, 0xBC, 0x0B, 0x6F, 0x28, + 0x44, 0x04, 0xD3, 0x17, 0xA1, 0x0A, 0x71, 0x04, 0x2B, 0x0E, 0xF7, 0xFB, + 0x77, 0x0A, 0xEB, 0x03, 0x6A, 0x0B, 0x6C, 0x0B, 0xCE, 0x13, 0x15, 0x0F, + 0x6F, 0x20, 0xAE, 0x1A, 0x89, 0x2B, 0x73, 0x24, 0xE4, 0x2B, 0x7B, 0x25, + 0x3F, 0x25, 0xD9, 0x26, 0x1F, 0x21, 0x87, 0x2A, 0x52, 0x1D, 0x74, 0x30, + 0x86, 0x18, 0xA6, 0x2F, 0x39, 0x1C, 0x13, 0x20, 0x78, 0x23, 0xEE, 0x14, + 0x6B, 0x1C, 0x16, 0x15, 0x0D, 0x0A, 0xB6, 0x0F, 0x29, 0x03, 0x2D, 0x04, + 0xD9, 0x0D, 0xED, 0x07, 0xD3, 0x1B, 0x8A, 0x18, 0x8A, 0x24, 0xF8, 0x22, + 0x9D, 0x28, 0x3C, 0x2E, 0x39, 0x2F, 0x80, 0x35, 0x5F, 0x31, 0x6D, 0x29, + 0x9F, 0x22, 0x80, 0x14, 0x2F, 0x0B, 0x1A, 0x05, 0x17, 0xF5, 0x30, 0xF2, + 0x52, 0xE6, 0xA0, 0xD3, 0xE2, 0xE0, 0x2C, 0xBD, 0xE9, 0xD8, 0x6B, 0xBB, + 0x78, 0xCE, 0x5D, 0xC4, 0x12, 0xD0, 0x0C, 0xD2, 0x9C, 0xE6, 0x77, 0xE5, + 0x72, 0x09, 0x39, 0xFF, 0xD0, 0x27, 0x14, 0x1F, 0x52, 0x3F, 0x3D, 0x3E, + 0xE4, 0x4C, 0xFA, 0x50, 0xDA, 0x49, 0xC1, 0x51, 0x90, 0x3A, 0x43, 0x3F, + 0x1B, 0x21, 0xAE, 0x1D, 0x2D, 0x01, 0xB5, 0xF4, 0x8D, 0xE7, 0xCB, 0xC7, + 0x71, 0xD4, 0xF7, 0xA9, 0xB4, 0xC3, 0x13, 0xA9, 0xB0, 0xB7, 0x60, 0xB1, + 0x8C, 0xB6, 0x60, 0xB7, 0xD9, 0xC2, 0xBD, 0xC1, 0xDA, 0xCD, 0xBC, 0xD7, + 0x2B, 0xD0, 0x09, 0xF9, 0x28, 0xD8, 0x43, 0x12, 0x32, 0xF0, 0x0B, 0x1E, + 0x84, 0x0E, 0xCB, 0x25, 0xA5, 0x21, 0x3D, 0x26, 0x23, 0x25, 0xD6, 0x1B, + 0x6D, 0x1B, 0x2A, 0x0B, 0x78, 0x0D, 0x50, 0xFF, 0x21, 0x05, 0x41, 0xF8, + 0x0E, 0x06, 0xFC, 0xF1, 0xB9, 0x0C, 0x53, 0xF2, 0x4F, 0x0C, 0x02, 0xF8, + 0x50, 0x06, 0x0A, 0xFF, 0x4D, 0x01, 0xFF, 0x06, 0x57, 0xFB, 0x52, 0x10, + 0xCC, 0xF7, 0xF4, 0x1F, 0xC3, 0xF8, 0xE9, 0x2D, 0x18, 0xFB, 0xDB, 0x31, + 0x84, 0x00, 0xEB, 0x2C, 0x1C, 0x06, 0x35, 0x1E, 0xE7, 0x05, 0x35, 0x04, + 0x41, 0xFB, 0xB8, 0xE6, 0x93, 0xEC, 0xF4, 0xDE, 0xE6, 0xED, 0x93, 0xEE, + 0x79, 0xFD, 0x57, 0xFD, 0xB0, 0x11, 0xBE, 0x06, 0xA2, 0x24, 0x65, 0x0F, + 0xB5, 0x2B, 0xD6, 0x0E, 0xBF, 0x2C, 0x82, 0x0A, 0x0A, 0x28, 0x74, 0x0E, + 0xB4, 0x18, 0xB2, 0x0D, 0x0D, 0x0E, 0xAA, 0x04, 0x8A, 0x11, 0xAC, 0x08, + 0xE1, 0x18, 0x37, 0x1D, 0x72, 0x17, 0x58, 0x2E, 0xC6, 0x10, 0x29, 0x30, + 0xFC, 0x0F, 0x99, 0x2E, 0x55, 0x10, 0x42, 0x2E, 0x70, 0x0E, 0xFA, 0x25, + 0xB6, 0x11, 0x53, 0x1D, 0xB3, 0x1C, 0x2C, 0x1C, 0x88, 0x1F, 0x62, 0x1D, + 0x1A, 0x0A, 0x39, 0x17, 0xA6, 0xF0, 0x51, 0x0B, 0x43, 0xE4, 0xD1, 0xFD, + 0xB9, 0xD8, 0x12, 0xEC, 0xB0, 0xCD, 0x7D, 0xDE, 0x1F, 0xCC, 0xA4, 0xD8, + 0xFA, 0xCA, 0x37, 0xD2, 0x47, 0xCD, 0xD0, 0xC8, 0x3F, 0xE2, 0x1F, 0xCB, + 0xEA, 0xFF, 0x0C, 0xE3, 0xF9, 0x1F, 0xBB, 0xFC, 0x53, 0x3C, 0xEB, 0x08, + 0x88, 0x47, 0xDA, 0x0F, 0x5E, 0x44, 0x2F, 0x12, 0x41, 0x33, 0xDC, 0x07, + 0x0A, 0x19, 0x46, 0xF9, 0xB1, 0xF5, 0x34, 0xEF, 0x55, 0xC9, 0x33, 0xDF, + 0x7C, 0xAD, 0x9E, 0xC4, 0xBE, 0xA9, 0x0F, 0xB2, 0x29, 0xAC, 0xA4, 0xAD, + 0xD4, 0xAF, 0x93, 0xA8, 0x60, 0xB6, 0xB4, 0xA8, 0xE2, 0xC0, 0xEA, 0xB9, + 0x34, 0xD1, 0xB6, 0xD4, 0x1F, 0xE5, 0x6B, 0xEC, 0x4C, 0xF9, 0xFA, 0xF9, + 0x10, 0x01, 0x3D, 0xFE, 0xEA, 0xFA, 0xC7, 0x02, 0x20, 0xF3, 0xE5, 0x06, + 0x07, 0xE7, 0x6D, 0x00, 0x17, 0xD9, 0xC0, 0xF3, 0x01, 0xD3, 0xEA, 0xEB, + 0xC0, 0xD6, 0x48, 0xEC, 0x37, 0xE2, 0xA8, 0xEE, 0xDA, 0xEB, 0xE3, 0xF0, + 0xFE, 0xF3, 0xB9, 0xF0, 0xF8, 0xFC, 0x7C, 0xEE, 0x12, 0xFE, 0x13, 0xF3, + 0x53, 0xF8, 0xC5, 0xF8, 0xAD, 0xF3, 0xF7, 0xF7, 0x7A, 0xEF, 0x4D, 0xF8, + 0x53, 0xE4, 0xE9, 0xF7, 0x72, 0xD7, 0x94, 0xF5, 0x32, 0xD2, 0x4A, 0xF2, + 0x31, 0xD0, 0x79, 0xDE, 0x88, 0xCB, 0x50, 0xC9, 0x2C, 0xCF, 0x96, 0xCB, + 0x9B, 0xE2, 0x0E, 0xDA, 0x85, 0xF2, 0x36, 0xEF, 0x8B, 0xFB, 0xC2, 0x06, + 0x25, 0x0C, 0x80, 0x0E, 0x7D, 0x1E, 0xBA, 0x06, 0xF5, 0x24, 0x7A, 0xFF, + 0x97, 0x1C, 0xD8, 0xF7, 0xBB, 0x11, 0xC6, 0xEA, 0x87, 0x13, 0xC4, 0xEA, + 0xBB, 0x1F, 0xFB, 0xF7, 0xEE, 0x24, 0x10, 0xFD, 0xAC, 0x22, 0x27, 0xFD, + 0x55, 0x1E, 0x9A, 0x03, 0x97, 0x14, 0x3E, 0x0E, 0x97, 0x0B, 0xA4, 0x17, + 0xB6, 0x0C, 0x2F, 0x25, 0xA3, 0x1D, 0xE4, 0x34, 0x6C, 0x33, 0xA6, 0x3C, + 0xC1, 0x37, 0x53, 0x3C, 0x2B, 0x26, 0xBF, 0x2E, 0xF4, 0x06, 0x3D, 0x14, + 0xAD, 0xE9, 0x61, 0xF8, 0xCA, 0xD8, 0x0F, 0xE5, 0x6A, 0xCB, 0xF5, 0xDD, + 0x62, 0xC4, 0x6C, 0xDC, 0x0D, 0xD3, 0x2E, 0xE3, 0x08, 0xF6, 0x08, 0xF6, + 0xDC, 0x1A, 0x67, 0x0F, 0x35, 0x32, 0xD9, 0x29, 0x86, 0x3B, 0xBB, 0x41, + 0x12, 0x3C, 0xB4, 0x50, 0xA0, 0x3B, 0xF5, 0x52, 0x24, 0x3F, 0xD5, 0x50, + 0x10, 0x3C, 0x33, 0x49, 0x68, 0x29, 0xF8, 0x33, 0x6A, 0x12, 0x9E, 0x12, + 0xFE, 0xFC, 0x34, 0xEA, 0xA2, 0xE8, 0x27, 0xC8, 0xFC, 0xDA, 0xF2, 0xBC, + 0x2D, 0xDA, 0xD8, 0xC5, 0xA7, 0xE9, 0x1D, 0xD1, 0x7E, 0xFF, 0x51, 0xDE, + 0x68, 0x10, 0x2A, 0xF3, 0xF5, 0x1A, 0xF4, 0x05, 0xFC, 0x1F, 0x5A, 0x15, + 0x42, 0x1E, 0xCF, 0x27, 0xA8, 0x19, 0x36, 0x41, 0x31, 0x1C, 0xE7, 0x58, + 0x13, 0x26, 0xE5, 0x5A, 0x7E, 0x2B, 0x1F, 0x48, 0x29, 0x27, 0xC6, 0x2F, + 0x00, 0x1C, 0xF0, 0x1E, 0xA0, 0x0D, 0x69, 0x1A, 0x1C, 0x07, 0xDE, 0x19, + 0xBB, 0x0B, 0x24, 0x1B, 0x27, 0x10, 0xCA, 0x25, 0x2B, 0x14, 0x0F, 0x36, + 0x7F, 0x1B, 0xD5, 0x3B, 0xAD, 0x1E, 0x7D, 0x2D, 0x14, 0x1F, 0x4A, 0x14, + 0xBD, 0x16, 0x4B, 0x0A, 0x8E, 0x03, 0xC9, 0x12, 0xC7, 0xF3, 0x94, 0x13, + 0xD0, 0xEC, 0xD5, 0x10, 0xE2, 0xF3, 0xCF, 0x0F, 0x2D, 0x04, 0x10, 0x09, + 0x79, 0x0F, 0x57, 0x05, 0xD9, 0x0E, 0xD2, 0xFE, 0x5E, 0x09, 0x98, 0xED, + 0x7D, 0x07, 0xDA, 0xE5, 0x12, 0x07, 0xA1, 0xFC, 0x8D, 0x0E, 0x4F, 0x16, + 0x36, 0x1C, 0xBF, 0x12, 0x26, 0x21, 0x11, 0x05, 0x91, 0x20, 0x71, 0x04, + 0xAD, 0x22, 0x6B, 0x08, 0xED, 0x1D, 0x71, 0x01, 0x39, 0x17, 0xC9, 0xF9, + 0x40, 0x1C, 0xE9, 0xFF, 0xA9, 0x22, 0x09, 0x0B, 0x69, 0x23, 0x30, 0x16, + 0xA9, 0x24, 0xE6, 0x1E, 0x3F, 0x1A, 0x06, 0x20, 0xF2, 0xFF, 0xE8, 0x1A, + 0x50, 0xED, 0xB4, 0x0D, 0x39, 0xE6, 0xEB, 0xF8, 0x46, 0xDC, 0x53, 0xDF, + 0xBE, 0xCC, 0xA2, 0xBF, 0xB8, 0xBD, 0x34, 0xA4, 0xFC, 0xAB, 0xBD, 0x9D, + 0xE3, 0x9E, 0xCB, 0xA7, 0x98, 0xAB, 0x41, 0xB9, 0xA1, 0xCD, 0xC4, 0xCE, + 0x8C, 0xEE, 0x01, 0xE3, 0xD9, 0x0B, 0x14, 0xF5, 0x46, 0x2B, 0xEF, 0x09, + 0x32, 0x3E, 0x4C, 0x1E, 0x15, 0x35, 0x9D, 0x20, 0x6D, 0x18, 0xB5, 0x0D, + 0x7B, 0xFD, 0x30, 0xF6, 0xF5, 0xE4, 0xB8, 0xE1, 0xD4, 0xC9, 0xA3, 0xD0, + 0x5B, 0xB9, 0x00, 0xCB, 0x72, 0xAF, 0xC1, 0xCC, 0x6F, 0xA3, 0xF2, 0xC0, + 0x37, 0xA2, 0x0D, 0xAA, 0xCD, 0xA8, 0x72, 0x9D, 0x1C, 0xAD, 0x6A, 0x9F, + 0x02, 0xB5, 0xCA, 0xAC, 0xB2, 0xC7, 0x08, 0xCA, 0x9F, 0xE7, 0xE4, 0xE7, + 0x67, 0x0B, 0x6A, 0xF4, 0x94, 0x22, 0xBE, 0xF7, 0x3C, 0x20, 0x85, 0xF7, + 0x16, 0x05, 0xC0, 0xF3, 0xDB, 0xE4, 0xF8, 0xF5, 0x37, 0xD4, 0x13, 0xFA, + 0x4C, 0xD8, 0x6C, 0xF7, 0x19, 0xE6, 0xCB, 0xF3, 0xDE, 0xEC, 0xEA, 0xEE, + 0x06, 0xEB, 0x63, 0xEB, 0x32, 0xEF, 0x8B, 0xF0, 0x96, 0xF8, 0x4C, 0xFB, + 0x7E, 0x05, 0x35, 0xFF, 0x2B, 0x13, 0x8B, 0xF6, 0x9E, 0x0F, 0x10, 0xF1, + 0x0C, 0x00, 0x34, 0xF0, 0x80, 0xF4, 0x74, 0xE6, 0x18, 0xE2, 0x01, 0xD9, + 0xE0, 0xCB, 0xBC, 0xD7, 0xDC, 0xC5, 0x4B, 0xEA, 0xE1, 0xCA, 0xD9, 0xFD, + 0x89, 0xCE, 0x18, 0xFC, 0x89, 0xD6, 0xEA, 0xF1, 0x40, 0xE1, 0xEC, 0xF2, + 0xCA, 0xE4, 0xAB, 0xFA, 0x83, 0xE8, 0x9D, 0x02, 0x19, 0xEF, 0xED, 0x0A, + 0xFC, 0xF6, 0xE6, 0x0D, 0x58, 0x07, 0x69, 0x0F, 0x09, 0x1D, 0xC7, 0x1B, + 0xFF, 0x27, 0x7E, 0x25, 0x35, 0x26, 0x9B, 0x1E, 0x59, 0x29, 0xC4, 0x10, + 0x2D, 0x30, 0x41, 0x04, 0x8D, 0x2A, 0x90, 0xFA, 0x48, 0x25, 0x0B, 0xFA, + 0x12, 0x25, 0x1B, 0x04, 0x59, 0x19, 0x52, 0x0E, 0xE5, 0x0A, 0x00, 0x13, + 0x03, 0x03, 0x13, 0x13, 0xB5, 0xF8, 0xB0, 0x0E, 0x12, 0xEC, 0x94, 0x03, + 0xC6, 0xE2, 0x7F, 0xF2, 0xB9, 0xD9, 0x3A, 0xE6, 0x43, 0xCE, 0xEB, 0xE9, + 0xE6, 0xC6, 0x74, 0xF4, 0x01, 0xD0, 0x83, 0xF3, 0xF8, 0xE5, 0x7C, 0xF0, + 0x90, 0x00, 0xEC, 0xFC, 0x66, 0x24, 0xFE, 0x13, 0xA8, 0x4A, 0x64, 0x2D, + 0xBC, 0x5F, 0xAC, 0x3E, 0x3D, 0x58, 0x03, 0x40, 0xB6, 0x3D, 0x02, 0x3B, + 0x86, 0x20, 0xD6, 0x2A, 0x66, 0x03, 0xB3, 0x08, 0xBC, 0xE5, 0x59, 0xEA, + 0x5A, 0xCD, 0x34, 0xD7, 0x54, 0xC2, 0xAB, 0xC9, 0xC6, 0xC8, 0xEE, 0xCC, + 0x34, 0xDD, 0x94, 0xDC, 0x0C, 0xF8, 0x29, 0xE3, 0xDD, 0x0B, 0xA6, 0xE8, + 0xD1, 0x0F, 0xCE, 0xFB, 0x12, 0x0F, 0xE1, 0x0F, 0x2F, 0x12, 0xDA, 0x1B, + 0xBC, 0x16, 0x64, 0x27, 0x52, 0x23, 0x5D, 0x2F, 0x0A, 0x36, 0xD4, 0x2E, + 0xC7, 0x3C, 0x35, 0x30, 0xEB, 0x33, 0x67, 0x30, 0xEB, 0x2A, 0xA9, 0x2B, + 0x55, 0x27, 0xEA, 0x24, 0xC1, 0x1F, 0xC6, 0x22, 0x11, 0x12, 0x29, 0x30, + 0x60, 0x0B, 0xB3, 0x3E, 0x77, 0x0F, 0xA5, 0x39, 0x6D, 0x19, 0x55, 0x29, + 0x06, 0x24, 0x73, 0x1B, 0x5D, 0x2B, 0x4E, 0x10, 0x81, 0x31, 0x3E, 0x07, + 0x93, 0x30, 0xE2, 0x02, 0x13, 0x29, 0x18, 0xF9, 0x8A, 0x20, 0x51, 0xE8, + 0xB0, 0x11, 0x5D, 0xE4, 0xBD, 0xFB, 0x5C, 0xEA, 0xAB, 0xE8, 0x6A, 0xEA, + 0xCF, 0xE8, 0xB3, 0xF0, 0x75, 0xF9, 0x47, 0x04, 0x75, 0x05, 0xAC, 0x17, + 0x92, 0x0C, 0xA4, 0x26, 0xC1, 0x10, 0x54, 0x2C, 0xC7, 0x09, 0x65, 0x21, + 0x10, 0xFF, 0xDF, 0x16, 0x64, 0xFE, 0x3A, 0x14, 0x56, 0x07, 0x10, 0x09, + 0xEB, 0x0B, 0xA5, 0xFA, 0x22, 0x0C, 0xF9, 0xF8, 0x21, 0x10, 0xDF, 0xFF, + 0x2C, 0x15, 0x22, 0x03, 0x33, 0x18, 0x60, 0x06, 0xBF, 0x1C, 0xD6, 0x10, + 0xCC, 0x24, 0x7E, 0x18, 0xCE, 0x28, 0xDF, 0x14, 0xDA, 0x1D, 0x47, 0x0E, + 0xE5, 0x00, 0x2E, 0x08, 0x3C, 0xE2, 0x78, 0xFC, 0xDE, 0xD0, 0x2E, 0xEA, + 0xC0, 0xCA, 0x07, 0xD8, 0x69, 0xC7, 0x2B, 0xD3, 0x3B, 0xC4, 0xD1, 0xD9, + 0xED, 0xC6, 0xC4, 0xE4, 0x8D, 0xD7, 0x4A, 0xF4, 0xC5, 0xF8, 0x20, 0x04, + 0xED, 0x1B, 0x29, 0x17, 0xAD, 0x2A, 0xD9, 0x2C, 0x3E, 0x24, 0xCD, 0x31, + 0x8E, 0x1A, 0xBD, 0x20, 0x5F, 0x15, 0x0C, 0x13, 0x0E, 0x11, 0x8B, 0x17, + 0x16, 0x07, 0xB7, 0x1A, 0xAD, 0xF7, 0x2C, 0x0A, 0xF6, 0xE3, 0xB8, 0xEE, + 0x39, 0xCF, 0xE0, 0xD0, 0x03, 0xBD, 0x6F, 0xBA, 0xEF, 0xAB, 0xC5, 0xBA, + 0xE6, 0xAC, 0x4B, 0xCA, 0x3A, 0xCB, 0x87, 0xD9, 0xE3, 0xF7, 0x54, 0xEF, + 0xBE, 0x1D, 0xA7, 0x08, 0x05, 0x2E, 0xB0, 0x10, 0x74, 0x2C, 0x2D, 0x0B, + 0xF5, 0x29, 0xF5, 0x09, 0x65, 0x27, 0xD2, 0x15, 0xDC, 0x26, 0x7F, 0x1E, + 0xFE, 0x2F, 0x78, 0x18, 0x09, 0x38, 0xD0, 0x12, 0x0A, 0x3B, 0xCB, 0x14, + 0xAE, 0x3B, 0x4F, 0x1C, 0x68, 0x31, 0xBA, 0x24, 0x6A, 0x1F, 0xCD, 0x28, + 0x5D, 0x14, 0xDF, 0x2C, 0x88, 0x13, 0x8E, 0x31, 0x16, 0x12, 0x16, 0x32, + 0xCF, 0x0B, 0x2D, 0x2F, 0x35, 0x0D, 0x99, 0x27, 0x55, 0x12, 0xBA, 0x18, + 0xD3, 0x0D, 0x78, 0x05, 0x66, 0x02, 0xB6, 0xFA, 0x1F, 0xF7, 0x44, 0xFC, + 0x38, 0xF7, 0x6D, 0xF9, 0x39, 0x04, 0xC6, 0xF6, 0x53, 0x0D, 0x4E, 0xFF, + 0xC7, 0x08, 0x66, 0x06, 0x50, 0xF4, 0x89, 0x07, 0xBC, 0xDD, 0x40, 0x0A, + 0xC8, 0xDB, 0x3A, 0x08, 0xA0, 0xEA, 0x74, 0xFA, 0xCA, 0xF8, 0x51, 0xEB, + 0x8E, 0x02, 0x7F, 0xE5, 0x97, 0x05, 0x1A, 0xED, 0xEE, 0xFB, 0x75, 0xF6, + 0x16, 0xEF, 0x75, 0xF3, 0xBE, 0xED, 0x0F, 0xEF, 0xF7, 0xEF, 0x7B, 0xF3, + 0x82, 0xF1, 0x42, 0xFB, 0x44, 0x01, 0xBC, 0x07, 0x44, 0x18, 0xDC, 0x10, + 0xAA, 0x24, 0xC6, 0x09, 0xA3, 0x24, 0x19, 0xFA, 0x37, 0x16, 0xD3, 0xE7, + 0xA8, 0xFE, 0x28, 0xD2, 0x98, 0xE4, 0x26, 0xBF, 0xC7, 0xC1, 0xE1, 0xB6, + 0x5F, 0xA7, 0xA1, 0xB3, 0x92, 0xA4, 0x81, 0xB7, 0x76, 0xAD, 0xB0, 0xC8, + 0x12, 0xB9, 0x6C, 0xDE, 0xD5, 0xC5, 0x45, 0xF0, 0x94, 0xDC, 0x9D, 0xFD, + 0x02, 0xF9, 0xBD, 0x0E, 0xCE, 0x0A, 0xE4, 0x21, 0x9A, 0x10, 0xBB, 0x2B, + 0x17, 0x0B, 0xC2, 0x22, 0x3A, 0xFF, 0xC5, 0x06, 0x91, 0xF1, 0x66, 0xE8, + 0x33, 0xD6, 0xF1, 0xCB, 0xA4, 0xB5, 0xB2, 0xAE, 0x75, 0xA4, 0xF7, 0x9C, + 0x7E, 0xA4, 0xED, 0x9A, 0xDF, 0xAA, 0x8E, 0xA0, 0xE9, 0xB1, 0xE3, 0xA4, + 0xA3, 0xBC, 0x82, 0xA8, 0x22, 0xC6, 0xA3, 0xB5, 0x8D, 0xD1, 0x08, 0xCF, + 0x01, 0xE2, 0x30, 0xEC, 0x89, 0xF6, 0xA6, 0x02, 0x2E, 0x13, 0x37, 0x10, + 0xDC, 0x2F, 0x9C, 0x16, 0x09, 0x36, 0x5E, 0x13, 0x48, 0x22, 0x00, 0x05, + 0xBD, 0x0C, 0x08, 0xEF, 0x7E, 0x05, 0x5A, 0xDE, 0xAD, 0x06, 0x79, 0xE1, + 0x5A, 0x08, 0xED, 0xF2, 0x65, 0x0F, 0xBF, 0x03, 0x6F, 0x1D, 0x8F, 0x10, + 0xB3, 0x29, 0xA4, 0x17, 0xDF, 0x28, 0x60, 0x1A, 0xFA, 0x1B, 0x43, 0x1D, + 0x6E, 0x10, 0x32, 0x1D, 0xCC, 0x0A, 0x53, 0x1A, 0xEE, 0x0A, 0x6B, 0x14, + 0x1D, 0x0D, 0x47, 0x0A, 0x77, 0x0C, 0x3F, 0x03, 0x9F, 0x0C, 0xBC, 0x05, + 0x44, 0x0B, 0x5B, 0x08, 0x2B, 0x0B, 0x6D, 0x03, 0xA6, 0x0F, 0xD1, 0x02, + 0x58, 0x0A, 0xA6, 0x08, 0xC4, 0x03, 0xC0, 0x12, 0x6B, 0x04, 0x47, 0x21, + 0xB8, 0x00, 0xE0, 0x27, 0x1A, 0xFF, 0x62, 0x26, 0x31, 0xFF, 0x2B, 0x27, + 0xE3, 0xFA, 0xD9, 0x28, 0x55, 0xF9, 0x80, 0x26, 0x14, 0xFD, 0x38, 0x25, + 0x22, 0x0F, 0x02, 0x33, 0x6F, 0x30, 0x8F, 0x44, 0x30, 0x4B, 0x6E, 0x4D, + 0xB1, 0x58, 0xD9, 0x5A, 0xF0, 0x5A, 0x14, 0x60, 0x35, 0x5A, 0x62, 0x5B, + 0xCD, 0x5F, 0xA3, 0x5D, 0xA2, 0x4F, 0xD1, 0x48, 0x4B, 0x4C, 0x11, 0x3A, + 0x18, 0x61, 0x4A, 0x44, 0x4A, 0x30, 0x2F, 0x12, 0x5C, 0xF9, 0x10, 0xE3, + 0xD5, 0x16, 0x53, 0x12, 0x1B, 0x32, 0x43, 0x39, 0x8E, 0x2C, 0xE5, 0x2A, + 0x90, 0x2F, 0xF7, 0x28, 0xF4, 0x1D, 0x94, 0x27, 0x60, 0xFE, 0x84, 0x13, + 0xEF, 0xE8, 0x4B, 0xFC, 0x5D, 0xD5, 0x9B, 0xED, 0x76, 0xC7, 0xC4, 0xE4, + 0x51, 0xB7, 0x30, 0xD1, 0xD4, 0xB6, 0xFD, 0xCE, 0x58, 0xB6, 0x76, 0xC8, + 0x25, 0xA5, 0xFE, 0xA6, 0x30, 0xA4, 0x8E, 0x9B, 0x0F, 0xAE, 0xD2, 0xA5, + 0x48, 0xA5, 0x8F, 0xA2, 0xC1, 0xA3, 0x6C, 0xA7, 0xAA, 0xBE, 0x4C, 0xCA, + 0xAA, 0xD0, 0x06, 0xDB, 0x1F, 0xD8, 0xC9, 0xCE, 0xAE, 0xE5, 0x2D, 0xCF, + 0x4B, 0xE6, 0xB2, 0xD0, 0x8A, 0xE4, 0x8D, 0xD1, 0x65, 0xFD, 0x0B, 0xEF, + 0xB1, 0x0F, 0xA7, 0x09, 0x65, 0x0B, 0x46, 0x08, 0x24, 0x20, 0xE2, 0x17, + 0x92, 0x3B, 0x6D, 0x30, 0xD6, 0x35, 0x85, 0x23, 0xBD, 0x36, 0x30, 0x15, + 0x2E, 0x48, 0x8F, 0x25, 0xDF, 0x43, 0xD0, 0x2D, 0xEF, 0x40, 0x58, 0x33, + 0x8A, 0x56, 0xD2, 0x50, 0xAA, 0x62, 0xCC, 0x62, 0x2E, 0x5C, 0x07, 0x5E, + 0xBF, 0x5A, 0x02, 0x5F, 0x19, 0x54, 0x45, 0x5A, 0x81, 0x39, 0x18, 0x3A, + 0x3C, 0x1A, 0x11, 0x1D, 0x03, 0x05, 0x59, 0x18, 0xBA, 0xF3, 0xB4, 0x0C, + 0x7E, 0xE5, 0x3B, 0xF5, 0x1B, 0xF8, 0xAA, 0xFB, 0x97, 0x09, 0xDF, 0x09, + 0x46, 0xF2, 0xA7, 0xF3, 0xC6, 0xEF, 0x3A, 0xF0, 0x82, 0x0A, 0x52, 0x02, + 0x08, 0x06, 0xAC, 0xEC, 0xD9, 0xEA, 0x0D, 0xD4, 0xEF, 0xDE, 0xBD, 0xDD, + 0x7E, 0xDF, 0x46, 0xE8, 0x72, 0xE5, 0x17, 0xE8, 0x74, 0xE7, 0x5E, 0xE8, + 0x90, 0xD3, 0xF2, 0xE8, 0xB0, 0xC3, 0x40, 0xED, 0xB1, 0xD8, 0x57, 0xFE, + 0xC8, 0xF8, 0x1B, 0x0F, 0xE3, 0x0C, 0x7F, 0x15, 0x50, 0x19, 0xDE, 0x23, + 0xA4, 0x27, 0x20, 0x37, 0xD2, 0x2C, 0xC1, 0x39, 0x97, 0x16, 0xE9, 0x2B, + 0x23, 0x00, 0xE9, 0x19, 0xCE, 0x00, 0xB0, 0x09, 0x1F, 0x10, 0x8D, 0x00, + 0x05, 0x2B, 0x51, 0x0A, 0x37, 0x3D, 0xC2, 0x18, 0xE5, 0x36, 0x16, 0x1D, + 0xCE, 0x38, 0x5C, 0x28, 0xD3, 0x40, 0xEC, 0x32, 0x17, 0x33, 0x46, 0x30, + 0x4B, 0x23, 0xEA, 0x2C, 0xC4, 0x13, 0xF5, 0x1D, 0xA1, 0x02, 0x6C, 0x08, + 0xD6, 0xFB, 0x88, 0x00, 0x23, 0xEB, 0x94, 0xF1, 0xA8, 0xCF, 0x84, 0xD8, + 0x51, 0xB9, 0x9C, 0xC3, 0x52, 0xA8, 0x66, 0xAF, 0xEB, 0x9E, 0xCF, 0xA0, + 0x5E, 0x9C, 0xCA, 0x9C, 0x19, 0xA0, 0x6A, 0xA0, 0x59, 0xA4, 0x75, 0xA6, + 0xDF, 0xAC, 0x5F, 0xAE, 0x82, 0xC2, 0x66, 0xBC, 0x9B, 0xCA, 0x99, 0xC6, + 0x7B, 0xBC, 0x18, 0xC7, 0x58, 0xB3, 0x6C, 0xC8, 0xF0, 0xB2, 0x07, 0xC9, + 0x20, 0xB9, 0xEA, 0xC4, 0x93, 0xBF, 0x05, 0xC2, 0x3A, 0xBA, 0x2F, 0xC0, + 0x05, 0xC2, 0xE3, 0xCB, 0x19, 0xDE, 0xE3, 0xEB, 0x11, 0xE8, 0x04, 0xFE, + 0x5B, 0xEA, 0xB4, 0xFE, 0xD9, 0x03, 0x32, 0x05, 0xEF, 0x14, 0x78, 0x01, + 0x15, 0x0B, 0x7F, 0xF3, 0x86, 0x02, 0x53, 0xF1, 0xC9, 0x01, 0x4B, 0xF7, + 0x46, 0x00, 0x90, 0xF5, 0x95, 0xFF, 0x72, 0xE6, 0x49, 0xF7, 0x81, 0xD8, + 0xE1, 0xE9, 0xF6, 0xDC, 0x7A, 0xDC, 0x4A, 0xEB, 0xE8, 0xCB, 0x66, 0xEE, + 0x2A, 0xCD, 0x28, 0xEC, 0xD3, 0xE5, 0x2A, 0xF6, 0x42, 0xF4, 0x8F, 0x00, + 0xE5, 0xFA, 0xDE, 0x09, 0x95, 0x08, 0x40, 0x0A, 0x48, 0x08, 0x1B, 0xF3, + 0x68, 0x02, 0xF2, 0xE4, 0x04, 0xFC, 0x53, 0xE1, 0x69, 0xFA, 0xBA, 0xE4, + 0x8D, 0x06, 0xD0, 0xFC, 0x2B, 0x1A, 0x1B, 0x22, 0xF5, 0x26, 0x85, 0x3D, + 0x06, 0x27, 0x6A, 0x46, 0x71, 0x2E, 0xC2, 0x4C, 0x5B, 0x3A, 0xBD, 0x4A, + 0x9C, 0x37, 0x57, 0x39, 0xF7, 0x2D, 0xDB, 0x2F, 0x4D, 0x31, 0x78, 0x40, + 0xD8, 0x38, 0x53, 0x50, 0xF6, 0x39, 0x7D, 0x47, 0x9A, 0x35, 0x07, 0x38, + 0x37, 0x31, 0x78, 0x31, 0xAB, 0x2D, 0x83, 0x25, 0xF8, 0x2C, 0x25, 0x22, + 0x33, 0x2E, 0x67, 0x34, 0x3A, 0x2B, 0x1E, 0x3E, 0x77, 0x38, 0x57, 0x44, + 0x20, 0x57, 0x7F, 0x58, 0xC4, 0x5F, 0x9A, 0x59, 0xB9, 0x4D, 0xAB, 0x4B, + 0xE1, 0x43, 0x4D, 0x54, 0xCF, 0x42, 0x31, 0x5B, 0x97, 0x3D, 0x5F, 0x4A, + 0x6D, 0x34, 0x75, 0x32, 0x88, 0x22, 0xED, 0x1A, 0x3B, 0x0B, 0xF4, 0x02, + 0x5A, 0xF8, 0xE7, 0xF1, 0x92, 0xE8, 0x77, 0xE7, 0x1A, 0xD9, 0xC2, 0xD6, + 0x25, 0xD8, 0x54, 0xC9, 0xCD, 0xED, 0x12, 0xD0, 0xA9, 0x0D, 0x2B, 0xE5, + 0x5E, 0x1F, 0x16, 0xFB, 0xD0, 0x1B, 0x40, 0x05, 0x3D, 0x12, 0x3D, 0x04, + 0x7D, 0x0B, 0xE9, 0x07, 0x64, 0x02, 0xEE, 0x0A, 0xDD, 0xF5, 0x1E, 0x06, + 0x01, 0xF5, 0xE7, 0x05, 0x59, 0x03, 0x34, 0x0B, 0xB6, 0x0E, 0x53, 0x09, + 0xBD, 0x16, 0x16, 0x01, 0x84, 0x21, 0x4D, 0xFE, 0xA9, 0x1A, 0x4F, 0xF8, + 0x87, 0x04, 0x64, 0xEE, 0x26, 0xFD, 0xB4, 0xF3, 0x79, 0x04, 0x9B, 0x00, + 0x59, 0x06, 0x63, 0x0B, 0x33, 0x05, 0xDA, 0x15, 0xF8, 0xFD, 0xE3, 0x0A, + 0x62, 0xED, 0xC5, 0xEC, 0x8C, 0xDE, 0x6E, 0xD6, 0x1E, 0xD5, 0x21, 0xD3, + 0xE2, 0xD4, 0x1D, 0xDE, 0x37, 0xD4, 0xFF, 0xE0, 0x67, 0xD8, 0x8B, 0xE3, + 0xCF, 0xDC, 0xDF, 0xE3, 0xA3, 0xD6, 0x66, 0xD9, 0xCB, 0xD1, 0x2B, 0xD1, + 0xA2, 0xD2, 0x50, 0xD3, 0xBA, 0xD5, 0x98, 0xDB, 0x20, 0xDA, 0x32, 0xDD, + 0x0A, 0xE4, 0x31, 0xE3, 0xD2, 0xE1, 0x45, 0xDD, 0xC2, 0xD5, 0xA4, 0xC2, + 0x15, 0xD5, 0xD5, 0xB8, 0x50, 0xDB, 0x24, 0xCF, 0x9B, 0xE6, 0x30, 0xF0, + 0xD5, 0xFD, 0x37, 0x0B, 0x34, 0x0C, 0xDA, 0x1C, 0x96, 0x0E, 0x69, 0x2D, + 0x36, 0x20, 0xE4, 0x4E, 0x5F, 0x23, 0xFD, 0x5F, 0x9C, 0x0B, 0xF6, 0x4E, + 0x72, 0xFC, 0x06, 0x36, 0x94, 0xFA, 0xE0, 0x13, 0x4C, 0xFD, 0x78, 0xF5, + 0x92, 0x0A, 0x3C, 0x00, 0xDC, 0x17, 0x59, 0x20, 0xD4, 0x13, 0x8A, 0x27, + 0x15, 0x23, 0x8D, 0x37, 0x9B, 0x45, 0xD3, 0x58, 0xEF, 0x4F, 0x54, 0x5E, + 0x7D, 0x51, 0x71, 0x59, 0xFF, 0x5D, 0x87, 0x62, 0x14, 0x5F, 0x91, 0x57, + 0xFC, 0x4E, 0x8A, 0x30, 0xE0, 0x38, 0x01, 0x0D, 0xAC, 0x14, 0x2B, 0xEA, + 0x22, 0xF3, 0x75, 0xC9, 0xFA, 0xDD, 0x08, 0xBA, 0xA6, 0xD0, 0x29, 0xBF, + 0x63, 0xD3, 0xAC, 0xCD, 0x8D, 0xDF, 0x75, 0xD8, 0x7D, 0xEF, 0xD7, 0xE8, + 0xA1, 0xF5, 0x39, 0xFE, 0x6C, 0xEF, 0x7F, 0x10, 0x22, 0xF0, 0x13, 0x1C, + 0x65, 0xFA, 0x9B, 0x22, 0x03, 0x0A, 0x0D, 0x2C, 0x61, 0x14, 0x0F, 0x2C, + 0xAE, 0x17, 0x2A, 0x24, 0xEA, 0x24, 0xDD, 0x2D, 0x59, 0x32, 0x4D, 0x35, + 0x29, 0x34, 0xA6, 0x26, 0x3B, 0x34, 0x6B, 0x1D, 0xA9, 0x2B, 0x79, 0x1D, + 0xEC, 0x17, 0x7C, 0x10, 0x86, 0x11, 0x73, 0x00, 0x5A, 0x16, 0xE9, 0x00, + 0x8E, 0x12, 0x77, 0x09, 0xDC, 0x0F, 0x7C, 0x14, 0xF8, 0x0E, 0x5F, 0x17, + 0xAA, 0x0A, 0xB2, 0x09, 0x6A, 0x0B, 0x17, 0xFD, 0xC4, 0x0F, 0xBA, 0xF9, + 0x2A, 0x0B, 0x0A, 0xED, 0x01, 0xF8, 0x70, 0xDA, 0x50, 0xE5, 0xEC, 0xCF, + 0x6E, 0xE5, 0xB2, 0xCB, 0x7C, 0xEE, 0x00, 0xD4, 0x03, 0xEB, 0x35, 0xE1, + 0x25, 0xE7, 0x59, 0xEE, 0x2A, 0xF0, 0x7F, 0xF9, 0xEF, 0xFA, 0x0B, 0xFA, + 0xFA, 0xF8, 0x0D, 0xF1, 0x5A, 0xDF, 0xD1, 0xD9, 0x00, 0xC9, 0x72, 0xCB, + 0x10, 0xC8, 0xEF, 0xDA, 0xF2, 0xCA, 0x87, 0xE9, 0x07, 0xD1, 0x4F, 0xEA, + 0xE1, 0xDE, 0x9F, 0xE5, 0x99, 0xF2, 0xBB, 0xEA, 0x29, 0x05, 0xBA, 0xFE, + 0xB0, 0x04, 0xE2, 0x05, 0xFC, 0xF2, 0x1E, 0x02, 0x1C, 0xEE, 0xC3, 0x0C, + 0x84, 0xFB, 0x48, 0x15, 0xD0, 0xFD, 0x47, 0x01, 0x7D, 0xEF, 0x34, 0xE8, + 0x73, 0xE6, 0xF2, 0xDD, 0x2B, 0xE4, 0x6D, 0xD3, 0x3F, 0xF2, 0x4F, 0xE3, + 0x6A, 0x08, 0x85, 0x06, 0xA4, 0x13, 0x98, 0x14, 0x16, 0x2D, 0x76, 0x28, + 0x6D, 0x47, 0x61, 0x40, 0x35, 0x49, 0x51, 0x52, 0x43, 0x44, 0x3B, 0x5B, + 0x9F, 0x3C, 0xD4, 0x4D, 0x8F, 0x33, 0xC0, 0x39, 0xDC, 0x2E, 0xF3, 0x1A, + 0xB7, 0x1E, 0x6A, 0xEB, 0x9B, 0x01, 0x8F, 0xC1, 0xDA, 0xE6, 0x78, 0xAD, + 0xD0, 0xD4, 0xEB, 0xA5, 0x78, 0xC4, 0xD0, 0x9C, 0xC4, 0xAB, 0x97, 0x9A, + 0xE7, 0xA6, 0xE7, 0xA7, 0x1A, 0xC3, 0x08, 0xBB, 0xFC, 0xE0, 0xF2, 0xDC, + 0xF6, 0xF0, 0xA3, 0x0D, 0xD5, 0x06, 0x51, 0x38, 0x16, 0x20, 0x7B, 0x45, + 0x1A, 0x26, 0x66, 0x3C, 0xBC, 0x18, 0xE5, 0x2E, 0xF7, 0x09, 0x68, 0x1D, + 0x06, 0x0C, 0x34, 0x17, 0x79, 0x0B, 0x0C, 0x1B, 0x99, 0x0A, 0x9E, 0x23, + 0x6E, 0x1B, 0x13, 0x28, 0xD5, 0x2E, 0xFC, 0x30, 0x20, 0x33, 0x25, 0x45, + 0xF1, 0x30, 0xA3, 0x4F, 0x60, 0x31, 0x6F, 0x52, 0x44, 0x2A, 0x02, 0x56, + 0xA5, 0x1E, 0xEC, 0x52, 0x74, 0x1A, 0x8D, 0x42, 0xC1, 0x1C, 0xEA, 0x27, + 0xC8, 0x16, 0x4C, 0x0E, 0xD7, 0x0E, 0x87, 0x00, 0x1B, 0x0F, 0x5F, 0x03, + 0x7D, 0x03, 0xF2, 0x0A, 0xAE, 0xF2, 0x80, 0x02, 0x14, 0xFF, 0xA2, 0xF7, + 0xF2, 0x0F, 0xD7, 0xF5, 0xA0, 0xFD, 0x66, 0xE9, 0xDF, 0xF2, 0xB8, 0xE7, + 0xEF, 0xFC, 0x3C, 0xEB, 0xCF, 0xF4, 0x1A, 0xE4, 0x16, 0xDE, 0x2E, 0xEA, + 0xEA, 0xDA, 0x8B, 0xF0, 0xC9, 0xE3, 0xEE, 0xE4, 0x43, 0xD7, 0x20, 0xCE, + 0x2D, 0xCF, 0xF1, 0xC8, 0x41, 0xCC, 0x34, 0xC8, 0x50, 0xBA, 0xAD, 0xBC, + 0xB2, 0xB6, 0x7F, 0xC4, 0x01, 0xCB, 0x86, 0xD6, 0x5E, 0xDF, 0xF0, 0xDF, + 0x11, 0xE0, 0xD2, 0xE2, 0x37, 0xD8, 0xC3, 0xE2, 0x95, 0xD5, 0x5E, 0xDA, + 0x20, 0xC9, 0x9D, 0xC8, 0x49, 0xA8, 0x49, 0xB5, 0x64, 0x9B, 0xB7, 0xA9, + 0x89, 0xBD, 0xD7, 0xB3, 0xCE, 0xE2, 0x18, 0xCE, 0xC3, 0xF8, 0xA5, 0xE9, + 0x5C, 0x15, 0x93, 0x0A, 0xAE, 0x28, 0x66, 0x1E, 0x62, 0x2B, 0x3E, 0x2F, + 0xF8, 0x3F, 0x7C, 0x54, 0xFF, 0x50, 0x7F, 0x58, 0xEF, 0x47, 0x94, 0x41, + 0xAE, 0x34, 0x27, 0x30, 0x8A, 0x1A, 0x27, 0x0D, 0x3A, 0x0A, 0xAB, 0xEB, + 0x5C, 0xF9, 0xEB, 0xD8, 0x33, 0xDD, 0xA9, 0xC8, 0x30, 0xC7, 0xF4, 0xB4, + 0xC1, 0xBE, 0xF1, 0xA1, 0x27, 0xC2, 0xC9, 0x9F, 0xA6, 0xC1, 0x03, 0xA4, + 0xC2, 0xBB, 0x7D, 0xAB, 0x8A, 0xC3, 0x22, 0xC9, 0x30, 0xD1, 0xFE, 0xE1, + 0x87, 0xDE, 0xB4, 0xE0, 0x39, 0xF3, 0x6F, 0xEA, 0x2F, 0xFC, 0xA4, 0xFA, + 0x9F, 0xF5, 0x27, 0xFC, 0x19, 0xEB, 0xE4, 0xFA, 0x0B, 0xEC, 0x6B, 0x0A, + 0xA9, 0xFA, 0x53, 0x23, 0x46, 0x06, 0x3C, 0x1E, 0xB2, 0x1A, 0x37, 0x19, + 0xAD, 0x2E, 0x8B, 0x2A, 0x49, 0x2E, 0xBB, 0x25, 0x11, 0x3C, 0xE8, 0x1E, + 0x49, 0x58, 0xCA, 0x2F, 0x34, 0x51, 0x4E, 0x32, 0xC8, 0x3E, 0x2D, 0x2E, + 0x72, 0x39, 0x2A, 0x34, 0x95, 0x20, 0x69, 0x28, 0xD1, 0x13, 0x4C, 0x24, + 0x28, 0x17, 0x87, 0x27, 0xA0, 0x02, 0xC7, 0x15, 0x06, 0x02, 0x95, 0x1C, + 0xDD, 0x1C, 0x27, 0x2E, 0x97, 0x21, 0xC4, 0x20, 0xF5, 0x17, 0x75, 0x18, + 0x3E, 0x22, 0xED, 0x28, 0x9F, 0x2B, 0xF6, 0x31, 0x90, 0x17, 0xE3, 0x22, + 0x1C, 0x08, 0x01, 0x1B, 0x62, 0x0A, 0x8B, 0x1D, 0xB1, 0x12, 0x90, 0x1F, + 0x92, 0x15, 0x9C, 0x26, 0x08, 0x15, 0xEA, 0x25, 0xA4, 0x1B, 0xE6, 0x16, + 0x31, 0x1B, 0x00, 0x07, 0xC9, 0x19, 0x8B, 0x0D, 0x63, 0x0C, 0x40, 0x13, + 0x16, 0xED, 0x24, 0x09, 0x15, 0xDB, 0xCD, 0x0C, 0xCF, 0xEB, 0x4E, 0x22, + 0xC0, 0x11, 0x72, 0x2D, 0x04, 0x15, 0xAE, 0x0B, 0xE2, 0xFB, 0xEF, 0xE4, + 0x52, 0xF1, 0x68, 0xDF, 0xF4, 0xDA, 0x3D, 0xCF, 0x94, 0xB6, 0xCD, 0xB8, + 0x33, 0xB5, 0xCC, 0xBE, 0x1C, 0xCB, 0xE7, 0xC9, 0x67, 0xD3, 0x1F, 0xDA, + 0x3E, 0xDA, 0x30, 0xFF, 0x50, 0xF3, 0x91, 0x26, 0xEF, 0x10, 0x47, 0x3D, + 0xBB, 0x21, 0xB5, 0x4F, 0xA1, 0x20, 0xBF, 0x54, 0xAB, 0x15, 0x14, 0x36, + 0x04, 0x0D, 0xA9, 0x11, 0x1B, 0x01, 0x07, 0xFD, 0xD9, 0xED, 0xEC, 0xEB, + 0x0D, 0xDE, 0xE3, 0xD6, 0x1B, 0xD0, 0x0A, 0xC0, 0x41, 0xC5, 0x93, 0xAF, + 0x90, 0xD1, 0x9F, 0xAB, 0x86, 0xE0, 0x05, 0xA9, 0xE3, 0xDD, 0x43, 0xB0, + 0x52, 0xE6, 0x78, 0xD3, 0x24, 0xF9, 0xE8, 0xEC, 0xAA, 0xFD, 0x75, 0xEC, + 0x43, 0xFF, 0x00, 0xF4, 0x8B, 0x0E, 0x25, 0xFB, 0xDB, 0x19, 0xCC, 0xFE, + 0x97, 0x09, 0x19, 0x02, 0xB6, 0xF5, 0x68, 0xF5, 0x94, 0xF0, 0xE5, 0xDC, + 0x33, 0xE6, 0x7D, 0xC6, 0xFC, 0xE5, 0xAE, 0xD0, 0xA5, 0xF7, 0x50, 0xEB, + 0x1E, 0xEB, 0x63, 0xE2, 0x4E, 0xD4, 0x2F, 0xDA, 0xA5, 0xE6, 0xF1, 0xF5, + 0xD8, 0xFD, 0x4B, 0x02, 0x3F, 0x08, 0x19, 0xF8, 0x90, 0x0A, 0x2D, 0xF8, + 0x51, 0x00, 0x79, 0xF9, 0x47, 0xFD, 0x42, 0xF4, 0x6A, 0xEF, 0xC6, 0xEA, + 0xE3, 0xD4, 0x6C, 0xDF, 0xFB, 0xDB, 0x07, 0xDC, 0x15, 0x00, 0x65, 0xE7, + 0x21, 0x11, 0x5B, 0xFE, 0x4C, 0x11, 0xB6, 0x0C, 0x38, 0x16, 0x97, 0x06, + 0xFD, 0x16, 0x2F, 0x07, 0x99, 0x0F, 0x1D, 0x08, 0x5B, 0x02, 0x03, 0xF0, + 0xF9, 0x06, 0x77, 0xEF, 0xA3, 0x02, 0x7E, 0xF8, 0xC6, 0xE4, 0xBB, 0xE4, + 0x10, 0xEA, 0x34, 0xE5, 0xE0, 0x07, 0xF6, 0x01, 0x3D, 0x0B, 0x53, 0x11, + 0x2F, 0x12, 0x26, 0x22, 0x31, 0x32, 0x99, 0x3D, 0xD5, 0x38, 0xF2, 0x3E, + 0xE7, 0x24, 0x8E, 0x34, 0x07, 0x17, 0xA2, 0x25, 0xE0, 0x09, 0xE7, 0x10, + 0x9E, 0xF6, 0x71, 0x07, 0x15, 0xF4, 0x67, 0xFA, 0x10, 0x08, 0x26, 0xE4, + 0x50, 0x0D, 0x1E, 0xDA, 0x56, 0xF5, 0xD2, 0xDA, 0x8D, 0xE1, 0x7C, 0xD8, + 0x56, 0xE2, 0x9C, 0xE8, 0x5A, 0xE6, 0x38, 0x09, 0x18, 0xF4, 0xAB, 0x23, + 0x88, 0x18, 0x38, 0x49, 0x3A, 0x38, 0xED, 0x6A, 0x75, 0x35, 0x4B, 0x5E, + 0x79, 0x27, 0xC2, 0x34, 0xAD, 0x29, 0xE9, 0x1A, 0xC4, 0x20, 0xAA, 0x0D, + 0x4D, 0xF9, 0x37, 0xF1, 0x03, 0xDE, 0xB2, 0xD8, 0x0D, 0xD7, 0x3B, 0xCE, + 0xD4, 0xB9, 0x99, 0xBC, 0xE6, 0x9C, 0xD1, 0xA7, 0x2B, 0xAB, 0xB9, 0xA7, + 0x1F, 0xC4, 0xFC, 0xC1, 0x62, 0xD0, 0x36, 0xDC, 0x1A, 0xE5, 0x3E, 0xEC, + 0x06, 0xF5, 0x1E, 0xF9, 0x19, 0xFB, 0x09, 0x0A, 0x9A, 0x0B, 0x64, 0x17, + 0x07, 0x1E, 0x44, 0x1A, 0x43, 0x1E, 0x8A, 0x1D, 0xC4, 0x1F, 0x0F, 0x23, + 0x63, 0x2A, 0x42, 0x22, 0x45, 0x33, 0xF9, 0x24, 0xE5, 0x30, 0xDC, 0x2E, + 0xA0, 0x23, 0x3D, 0x3A, 0xDB, 0x2A, 0xD7, 0x46, 0xF3, 0x39, 0x42, 0x46, + 0x46, 0x3E, 0x48, 0x42, 0xEB, 0x35, 0xFF, 0x38, 0x99, 0x21, 0x81, 0x23, + 0x51, 0x1A, 0x7A, 0x1E, 0x0F, 0x23, 0x77, 0x24, 0xF4, 0x25, 0x5B, 0x13, + 0x04, 0x1D, 0xFC, 0x02, 0x3A, 0x1C, 0xA2, 0x11, 0x43, 0x18, 0x62, 0x0D, + 0xE9, 0x09, 0xD4, 0xF8, 0xE9, 0x00, 0x90, 0xFA, 0xF6, 0xF8, 0x2A, 0xFE, + 0x14, 0xF5, 0x50, 0xF8, 0xA1, 0xEF, 0x12, 0xEB, 0x9A, 0xED, 0x43, 0xE2, + 0x17, 0xF7, 0x24, 0xE0, 0x8F, 0xFE, 0x49, 0xE5, 0xC7, 0xFB, 0xC4, 0xEE, + 0xCB, 0xF2, 0xA3, 0xF9, 0xEF, 0xE8, 0x42, 0x00, 0x42, 0xEA, 0x94, 0xF7, + 0x8E, 0xFD, 0xF9, 0xEF, 0x29, 0x03, 0xCB, 0xE1, 0x61, 0xFC, 0xBC, 0xD9, + 0xE7, 0x05, 0xC9, 0xEE, 0x04, 0x12, 0xFE, 0x03, 0xA1, 0x1C, 0xA3, 0x0E, + 0xF3, 0x2C, 0x32, 0x16, 0x81, 0x2C, 0x1A, 0x0E, 0xBA, 0x1E, 0x71, 0xFB, + 0xA6, 0x14, 0xB8, 0xF0, 0x1F, 0xF8, 0xA2, 0xDF, 0x31, 0xD6, 0xCD, 0xD1, + 0x21, 0xC6, 0x91, 0xD4, 0xF3, 0xC5, 0xF5, 0xDC, 0xD3, 0xDA, 0x28, 0xF6, + 0x6F, 0xF3, 0xD9, 0x18, 0xD6, 0xFA, 0xEA, 0x28, 0x11, 0x00, 0xCC, 0x31, + 0xC6, 0x17, 0x80, 0x45, 0xFA, 0x2B, 0x9F, 0x4C, 0x30, 0x22, 0x50, 0x35, + 0xBF, 0x11, 0x07, 0x1D, 0xA4, 0x0A, 0xD4, 0x0A, 0x9A, 0xF7, 0x57, 0xEB, + 0x67, 0xCA, 0x5C, 0xC4, 0x9A, 0xAF, 0x36, 0xB8, 0xCC, 0xAA, 0x8F, 0xBA, + 0xDF, 0xA2, 0xEA, 0xAC, 0x35, 0xBA, 0x57, 0xB4, 0xF0, 0xD1, 0xFD, 0xC2, + 0x3A, 0xD4, 0x06, 0xCA, 0x6C, 0xE3, 0x5B, 0xE1, 0x25, 0xF3, 0x7E, 0xF3, + 0x4E, 0xF6, 0xA0, 0xFD, 0xC1, 0xF9, 0xD6, 0x00, 0x04, 0x05, 0x85, 0xFA, + 0xDC, 0x05, 0xE0, 0xF9, 0x7E, 0xFB, 0xD1, 0xFF, 0xFD, 0xF7, 0xED, 0x09, + 0x9C, 0xFA, 0x99, 0x0F, 0xC9, 0xFB, 0xDA, 0x04, 0xD3, 0xF8, 0x3F, 0xF4, + 0x79, 0xEE, 0x24, 0xEF, 0xFF, 0xF0, 0x46, 0x07, 0xC6, 0xFB, 0xEB, 0x15, + 0x5D, 0xFD, 0x9E, 0x0C, 0xE2, 0x04, 0x70, 0x10, 0x4C, 0x04, 0x8E, 0x0E, + 0x14, 0xFF, 0xAD, 0x05, 0x27, 0x06, 0x24, 0x03, 0x89, 0x04, 0x33, 0xF6, + 0xD6, 0x02, 0x8A, 0xEF, 0xEB, 0x08, 0xD5, 0xFA, 0x5F, 0xFE, 0xD5, 0xFC, + 0x06, 0xFC, 0xB4, 0xF5, 0x2C, 0x05, 0xAD, 0xF0, 0x9D, 0xFA, 0xDF, 0xED, + 0x9D, 0xF1, 0x69, 0xF7, 0xDF, 0xFB, 0x30, 0x06, 0x20, 0x01, 0xD1, 0x05, + 0x8A, 0xE6, 0x46, 0xF8, 0xA6, 0xE0, 0x97, 0xF3, 0x3C, 0xFB, 0x51, 0xF0, + 0xD2, 0xF4, 0xEF, 0xD8, 0xE8, 0xE8, 0x48, 0xCE, 0xBA, 0xF1, 0xDD, 0xD9, + 0x5C, 0x00, 0x27, 0xF3, 0x2D, 0x11, 0xB6, 0x0D, 0x88, 0x28, 0x64, 0x16, + 0x6D, 0x37, 0x75, 0x1C, 0x12, 0x2C, 0xF6, 0x26, 0x1C, 0x29, 0xCA, 0x2D, + 0x35, 0x30, 0xEA, 0x1E, 0xE0, 0x2E, 0xB0, 0x0E, 0x58, 0x24, 0x81, 0x0B, + 0x3A, 0x11, 0xE4, 0xFA, 0x31, 0x04, 0x43, 0xDF, 0xB1, 0x0C, 0x18, 0xD9, + 0x3D, 0x1F, 0x43, 0xE8, 0x10, 0x26, 0xF5, 0xFF, 0xC1, 0x22, 0xD7, 0x23, + 0x0E, 0x27, 0x70, 0x43, 0x47, 0x48, 0xB0, 0x59, 0x49, 0x5D, 0x5C, 0x59, + 0x74, 0x50, 0x8D, 0x4B, 0x80, 0x43, 0x8B, 0x3F, 0xDB, 0x3A, 0xEF, 0x2C, + 0xDF, 0x27, 0x02, 0x18, 0x0C, 0x0A, 0x6A, 0x03, 0x33, 0xED, 0x69, 0xE9, + 0x70, 0xDD, 0xCF, 0xD8, 0xD3, 0xDB, 0xC2, 0xE0, 0xFD, 0xD6, 0xD0, 0xE7, + 0x31, 0xD3, 0x53, 0xE2, 0x4B, 0xE6, 0xE3, 0xE4, 0xDC, 0xF7, 0xA5, 0xEB, + 0x37, 0xF7, 0xA7, 0xF4, 0xEE, 0xF7, 0xD5, 0xFC, 0x35, 0xF3, 0xB4, 0xFC, + 0x46, 0xF7, 0xF7, 0x09, 0x45, 0x05, 0x3C, 0x18, 0x16, 0x10, 0x74, 0x19, + 0x41, 0x1D, 0x19, 0x18, 0x45, 0x21, 0x7F, 0x17, 0x81, 0x08, 0xC0, 0x04, + 0xFE, 0xEE, 0x78, 0xF4, 0xA6, 0x01, 0x3D, 0xFE, 0x1E, 0x19, 0x6B, 0xFF, + 0x68, 0x13, 0xE2, 0xFD, 0xCD, 0x1C, 0x8E, 0x13, 0x45, 0x34, 0xC0, 0x23, + 0xEB, 0x2E, 0x2B, 0x1D, 0x3D, 0x0E, 0x14, 0x14, 0xE2, 0xF6, 0x55, 0x17, + 0x75, 0xF6, 0xC2, 0x1C, 0xDE, 0xF6, 0x30, 0x10, 0x91, 0xFE, 0xEC, 0x02, + 0xE2, 0xF9, 0x9F, 0xFC, 0x86, 0xD8, 0x62, 0xF9, 0x62, 0xCE, 0x44, 0xFB, + 0x07, 0xE4, 0x41, 0x03, 0x83, 0xEB, 0x21, 0x0C, 0x8F, 0xEA, 0x17, 0x18, + 0x15, 0xF3, 0x72, 0x1C, 0xAF, 0xED, 0x1B, 0xFF, 0xEE, 0xDA, 0x89, 0xE1, + 0x5A, 0xD8, 0x2F, 0xE1, 0x44, 0xE2, 0x48, 0xE9, 0xB9, 0xE6, 0x5C, 0xE5, + 0xC4, 0xF4, 0x36, 0xE6, 0xCB, 0x01, 0x1F, 0xF4, 0x91, 0xFA, 0x31, 0xFC, + 0xD7, 0xFD, 0x43, 0x04, 0xF1, 0x07, 0x6A, 0x05, 0x68, 0xFD, 0x03, 0x08, + 0xC0, 0xED, 0x48, 0x0F, 0x1E, 0xEB, 0x50, 0x00, 0xFF, 0xE8, 0x40, 0xE6, + 0x91, 0xE1, 0xFB, 0xCF, 0xA9, 0xE8, 0xB1, 0xC3, 0xE9, 0xE2, 0xD1, 0xB4, + 0x19, 0xD5, 0x58, 0xA8, 0x8D, 0xE3, 0x89, 0xB4, 0x04, 0xDA, 0x43, 0xBA, + 0x86, 0xC6, 0x3F, 0xC4, 0x36, 0xE5, 0xDA, 0xEE, 0x55, 0x07, 0xB7, 0x0A, + 0x07, 0x11, 0x62, 0x19, 0x98, 0x0E, 0x61, 0x29, 0x14, 0x0C, 0x1F, 0x2D, + 0x6C, 0x0D, 0x62, 0x2D, 0x47, 0x04, 0xCE, 0x21, 0x99, 0xF9, 0x65, 0x04, + 0xBD, 0xF6, 0x01, 0xEA, 0xF8, 0xF8, 0xBF, 0xD2, 0x77, 0xFA, 0x58, 0xBB, + 0x5F, 0xE1, 0x07, 0xAC, 0x29, 0xC5, 0xB9, 0xA4, 0x77, 0xC9, 0x06, 0xAE, + 0x83, 0xD2, 0xE4, 0xC9, 0x70, 0xDA, 0xD1, 0xE5, 0x38, 0xF3, 0xF5, 0xF9, + 0x6F, 0x0D, 0xFC, 0x09, 0x07, 0x0C, 0xBB, 0x05, 0xC9, 0x08, 0x63, 0x01, + 0x49, 0x0C, 0x0E, 0x02, 0x9A, 0x08, 0x9B, 0xF5, 0xC1, 0x0D, 0x3B, 0xF8, + 0xE8, 0x0B, 0xBE, 0x08, 0x55, 0x06, 0xD1, 0x10, 0x01, 0x0B, 0xB8, 0x12, + 0x81, 0x16, 0x5D, 0x0D, 0x99, 0x28, 0x15, 0x17, 0x54, 0x29, 0x88, 0x23, + 0x6F, 0x1F, 0xC8, 0x12, 0xB6, 0x2C, 0x05, 0x0F, 0x78, 0x42, 0xC8, 0x1F, + 0x0B, 0x3B, 0xD1, 0x21, 0x2F, 0x32, 0x29, 0x28, 0x3B, 0x3C, 0x0D, 0x31, + 0x07, 0x28, 0xE5, 0x1C, 0x2D, 0x1A, 0x99, 0x1A, 0x69, 0x2E, 0x06, 0x26, + 0x38, 0x33, 0xB5, 0x21, 0xFF, 0x23, 0xCE, 0x1D, 0x3A, 0x18, 0xC4, 0x17, + 0xFF, 0x18, 0x8F, 0x0F, 0x9A, 0x26, 0xEE, 0x16, 0xC1, 0x34, 0xE7, 0x2C, + 0xF4, 0x2E, 0xF3, 0x31, 0x29, 0x20, 0xEA, 0x30, 0x22, 0x14, 0x9B, 0x31, + 0x96, 0x0E, 0xF4, 0x29, 0x58, 0x17, 0x99, 0x1C, 0x69, 0x19, 0x92, 0x1C, + 0x90, 0x09, 0xEB, 0x29, 0xD4, 0xF6, 0xB9, 0x1F, 0x2E, 0xF8, 0x52, 0x12, + 0xDB, 0x02, 0x3D, 0x21, 0x0F, 0x03, 0x04, 0x35, 0x8C, 0x08, 0xAB, 0x36, + 0x7B, 0x05, 0x3F, 0x27, 0x33, 0xE4, 0xE1, 0x10, 0x6A, 0xBF, 0x98, 0xEC, + 0x5D, 0xBE, 0x4A, 0xCE, 0xBD, 0xC8, 0x1A, 0xC2, 0xD2, 0xBB, 0x29, 0xB5, + 0x67, 0xB1, 0x81, 0xB5, 0x20, 0xBD, 0xE5, 0xC8, 0xC3, 0xCF, 0x83, 0xDF, + 0xD4, 0xE0, 0xAF, 0xFA, 0xA4, 0xFF, 0x31, 0x1F, 0xDD, 0x17, 0x8F, 0x2D, + 0x54, 0x16, 0xC3, 0x23, 0xC4, 0x15, 0x22, 0x21, 0x19, 0x08, 0xDE, 0x1C, + 0x45, 0xF6, 0x37, 0x17, 0x1E, 0xED, 0xD4, 0xFD, 0xD5, 0xDC, 0x56, 0xCC, + 0xD3, 0xD6, 0xB2, 0xB6, 0x75, 0xC0, 0xDF, 0xB1, 0x23, 0x9E, 0xC7, 0xA4, + 0xCD, 0xA5, 0x4A, 0xA8, 0x7E, 0xB5, 0x2E, 0xB7, 0x2E, 0xBB, 0xFD, 0xBB, + 0xCC, 0xE0, 0x2B, 0xC9, 0xEB, 0xF9, 0xC3, 0xDB, 0x43, 0xFE, 0xD4, 0xF0, + 0x65, 0x03, 0xD2, 0x08, 0x8A, 0xF2, 0xA3, 0x0C, 0x0D, 0xF9, 0x12, 0x19, + 0x9C, 0x0B, 0xA3, 0x18, 0xBB, 0x0E, 0xCC, 0x04, 0x66, 0x16, 0xAE, 0x09, + 0xCF, 0x07, 0x2B, 0x06, 0x58, 0xF9, 0x85, 0xFA, 0x1B, 0x00, 0x55, 0xEF, + 0xB3, 0x0B, 0xD8, 0xF3, 0xA0, 0x21, 0x11, 0x10, 0x4F, 0x2E, 0x0D, 0x17, + 0x78, 0x32, 0x3B, 0x18, 0x44, 0x39, 0x0F, 0x21, 0xCF, 0x37, 0x01, 0x1F, + 0xDB, 0x34, 0x6F, 0x16, 0xCB, 0x32, 0xEE, 0x0D, 0x93, 0x1C, 0x40, 0x02, + 0xE8, 0x19, 0x8E, 0x00, 0x7B, 0x27, 0x77, 0xF7, 0x5B, 0x1E, 0x94, 0xE6, + 0x79, 0x27, 0x69, 0xF1, 0x43, 0x2F, 0xAD, 0xFA, 0x7F, 0x13, 0xB4, 0xED, + 0xF2, 0x08, 0xAA, 0xEF, 0x38, 0x12, 0x1E, 0x05, 0x01, 0xF7, 0xCB, 0x06, + 0xB4, 0xDF, 0x40, 0x06, 0xBC, 0xF7, 0x57, 0x0C, 0x91, 0x19, 0xF7, 0x08, + 0x3A, 0x1F, 0x3A, 0x09, 0xEB, 0x10, 0x0B, 0x0E, 0xC1, 0x0A, 0x5D, 0x07, + 0x8B, 0x10, 0x68, 0x05, 0x0D, 0x16, 0x23, 0x18, 0xD7, 0x10, 0x25, 0x1E, + 0xB8, 0x0C, 0x8A, 0x16, 0xF7, 0x0F, 0xD9, 0x18, 0xD8, 0x07, 0xB1, 0x14, + 0x84, 0x05, 0x25, 0x11, 0x5B, 0xFF, 0x2C, 0x08, 0xBE, 0xE4, 0x60, 0xEE, + 0x0C, 0xDA, 0x49, 0xE4, 0xA6, 0xCE, 0x31, 0xD8, 0x62, 0xBE, 0xDA, 0xCA, + 0x46, 0xC4, 0x62, 0xD6, 0xDB, 0xEB, 0x1D, 0xF4, 0x38, 0x21, 0x69, 0x26, + 0x0B, 0x2D, 0xC6, 0x4C, 0xE4, 0x2C, 0xF6, 0x57, 0xC4, 0x42, 0x68, 0x55, + 0xDE, 0x47, 0xD9, 0x49, 0xE5, 0x27, 0x43, 0x40, 0xD7, 0x02, 0x65, 0x39, + 0x1D, 0xEA, 0xD6, 0x24, 0x12, 0xE1, 0x30, 0x0F, 0xC9, 0xEB, 0xE0, 0x05, + 0xA8, 0xE1, 0xB7, 0xEF, 0x29, 0xC6, 0xB0, 0xD8, 0xAE, 0xB7, 0x82, 0xD1, + 0xFE, 0xBC, 0x02, 0xCE, 0x7D, 0xD2, 0x38, 0xC8, 0x73, 0xE1, 0xFC, 0xCC, + 0xDA, 0xED, 0x2E, 0xE5, 0x54, 0x0B, 0xA7, 0x03, 0x3F, 0x22, 0x8D, 0x1A, + 0x22, 0x15, 0x1A, 0x17, 0x39, 0xFE, 0xE2, 0x03, 0x8F, 0xFF, 0x7E, 0x02, + 0x45, 0x04, 0xBF, 0x16, 0xE6, 0xEF, 0x7F, 0x1A, 0x32, 0xDF, 0x92, 0xFB, + 0x96, 0xEA, 0x93, 0xEF, 0xE1, 0xF2, 0x57, 0xFD, 0xB9, 0xE6, 0xBE, 0xF3, + 0x5D, 0xE9, 0xCA, 0xE6, 0x75, 0xEB, 0xDD, 0xE4, 0xDE, 0xE8, 0x02, 0xEA, + 0x6D, 0x07, 0xF9, 0xFB, 0x7E, 0x20, 0xC3, 0xFF, 0x12, 0x27, 0x92, 0x01, + 0xF7, 0x2B, 0x75, 0x0D, 0x6D, 0x1F, 0xFE, 0x05, 0x6B, 0x11, 0x42, 0xF3, + 0xDE, 0x07, 0x8D, 0xE6, 0xBF, 0xF9, 0x39, 0xDF, 0x86, 0xF8, 0x03, 0xE4, + 0x75, 0xFE, 0xF6, 0xF2, 0x2B, 0x04, 0x26, 0xF8, 0x3F, 0x13, 0x6C, 0xF7, + 0x91, 0x14, 0x99, 0x00, 0xE2, 0xFE, 0x58, 0x09, 0x1F, 0xF5, 0x90, 0x03, + 0xC8, 0x06, 0x50, 0xF9, 0xD9, 0x11, 0xA8, 0xF5, 0x2C, 0x00, 0xDA, 0xEC, + 0x86, 0xF7, 0x4B, 0xF0, 0xBB, 0xFA, 0x11, 0x0B, 0xE3, 0xF5, 0xFB, 0x1D, + 0x34, 0xFE, 0xCB, 0x19, 0xD3, 0x09, 0xF4, 0x09, 0xBB, 0xFE, 0xFA, 0x00, + 0x6A, 0xEE, 0x92, 0x05, 0x92, 0xF2, 0xAC, 0x09, 0x6F, 0xFB, 0xE2, 0xFF, + 0xBA, 0xED, 0x20, 0xE3, 0x9F, 0xD7, 0xF0, 0xC6, 0x9C, 0xC8, 0xB6, 0xBC, + 0x4B, 0xB6, 0x82, 0xB2, 0xCF, 0xB8, 0x6D, 0xB1, 0x90, 0xE1, 0xC3, 0xC1, + 0x6B, 0x0A, 0x71, 0xD2, 0x83, 0x11, 0x30, 0xEE, 0xE2, 0x07, 0xC8, 0x0C, + 0x66, 0x0B, 0x7C, 0x20, 0xE1, 0x0F, 0x20, 0x2C, 0xD4, 0x15, 0x8B, 0x34, + 0x2A, 0x1B, 0x74, 0x33, 0x7B, 0x11, 0x3B, 0x27, 0x4A, 0xF6, 0x22, 0x13, + 0xCE, 0xDA, 0xC0, 0xF3, 0xF4, 0xD1, 0x25, 0xD2, 0x15, 0xC1, 0x1F, 0xB5, + 0xF3, 0xA6, 0x1C, 0xA4, 0xFA, 0x9D, 0x1C, 0xA1, 0x25, 0xAE, 0xF3, 0xB0, + 0xED, 0xD1, 0xF5, 0xD0, 0x41, 0xE9, 0x4B, 0xE0, 0xA9, 0xEB, 0x48, 0xDE, + 0xC2, 0xF2, 0x5A, 0xEE, 0xAB, 0xFA, 0xB6, 0xFB, 0x12, 0x09, 0xC6, 0xFA, + 0x93, 0x20, 0xCF, 0x02, 0x6B, 0x0E, 0xEB, 0xF9, 0xBA, 0xFD, 0xB6, 0xFD, + 0x28, 0x15, 0x42, 0x1A, 0x60, 0x0A, 0x64, 0x16, 0x18, 0xEA, 0x16, 0x0D, + 0xBF, 0xF0, 0x88, 0x12, 0x0F, 0x06, 0x58, 0x10, 0x9C, 0x14, 0x9A, 0x12, + 0x67, 0x1F, 0x3F, 0x12, 0x8E, 0x1F, 0x6C, 0x00, 0x0F, 0x19, 0x06, 0xF6, + 0xB2, 0x12, 0x98, 0x05, 0x87, 0x17, 0x6F, 0x18, 0x85, 0x14, 0x90, 0x0D, + 0x3B, 0x04, 0x48, 0x01, 0x51, 0x04, 0x32, 0x0D, 0xDE, 0x18, 0xAD, 0x1F, + 0xCD, 0x23, 0xFE, 0x25, 0x2C, 0x15, 0xCA, 0x1A, 0x5E, 0x06, 0x5B, 0x15, + 0xC1, 0x06, 0xDF, 0x15, 0x04, 0x16, 0x6D, 0x18, 0xD9, 0x27, 0xA4, 0x1D, + 0x4B, 0x30, 0x12, 0x24, 0x7E, 0x32, 0x95, 0x35, 0xBC, 0x2E, 0x9F, 0x47, + 0x27, 0x31, 0xFC, 0x46, 0xF1, 0x2A, 0x9D, 0x24, 0xE3, 0x19, 0xFC, 0x0B, + 0xDA, 0x0C, 0x1B, 0x13, 0xB2, 0x0C, 0x9D, 0x1D, 0x37, 0x10, 0x0E, 0x25, + 0xA2, 0x0E, 0xB0, 0x2D, 0x2E, 0x23, 0x7A, 0x47, 0xDF, 0x39, 0xC7, 0x5B, + 0x2E, 0x33, 0xA2, 0x56, 0x8E, 0x21, 0x16, 0x48, 0xAC, 0x17, 0x0A, 0x2F, + 0x48, 0x02, 0x66, 0x07, 0xD0, 0xE6, 0xCC, 0xE4, 0xBA, 0xE5, 0xE4, 0xCF, + 0x24, 0xEC, 0xD9, 0xBC, 0x37, 0xED, 0x1E, 0xBB, 0xC6, 0xFE, 0x9D, 0xDF, + 0xCE, 0x1A, 0xAE, 0x0C, 0x9D, 0x2B, 0x8C, 0x1F, 0xC2, 0x3A, 0x12, 0x38, + 0x92, 0x3C, 0x48, 0x4E, 0x40, 0x27, 0xFA, 0x3A, 0xD7, 0x15, 0x3A, 0x1E, + 0x30, 0x0D, 0x65, 0x12, 0xA8, 0x00, 0xDA, 0x04, 0xEB, 0xF7, 0x82, 0xF1, + 0xCD, 0xFA, 0x0C, 0xE7, 0x7B, 0xF8, 0x99, 0xD5, 0x3E, 0xF5, 0x7B, 0xC5, + 0x39, 0xE4, 0xEF, 0xB7, 0x01, 0xC6, 0xD8, 0xA9, 0x58, 0xC1, 0xDB, 0xAF, + 0x05, 0xD6, 0xFA, 0xC7, 0xB8, 0xE9, 0xE6, 0xE6, 0x15, 0xFF, 0x0D, 0x0B, + 0x8C, 0x0D, 0x39, 0x18, 0x22, 0x00, 0x51, 0x0A, 0x09, 0xFB, 0xF7, 0x13, + 0x32, 0x01, 0x90, 0x23, 0xF4, 0xEC, 0x90, 0x0B, 0xC3, 0xD7, 0x7B, 0xE7, + 0x8B, 0xDB, 0xC8, 0xDE, 0x64, 0xE0, 0x3D, 0xE1, 0x91, 0xDD, 0x27, 0xDB, + 0x78, 0xDD, 0xF2, 0xDC, 0x34, 0xF2, 0x38, 0xF3, 0x26, 0x0E, 0xC9, 0x04, + 0x7A, 0x0A, 0x1F, 0x01, 0x8C, 0xFD, 0xCD, 0x01, 0x67, 0x04, 0x16, 0x0B, + 0x6B, 0x05, 0x19, 0x07, 0xEA, 0xF7, 0xDE, 0x04, 0xA4, 0xF2, 0xFB, 0x04, + 0x00, 0x03, 0xD8, 0xF9, 0x5A, 0x1B, 0x60, 0xFA, 0xB4, 0x1A, 0xA6, 0x01, + 0xF2, 0x0B, 0xE2, 0x02, 0xF2, 0x09, 0x5F, 0x07, 0x0B, 0x05, 0xF1, 0x02, + 0xCA, 0x09, 0x6E, 0x03, 0xDB, 0x06, 0x36, 0xFC, 0x5E, 0xF6, 0x8B, 0xEA, + 0xBB, 0xFF, 0x23, 0xEF, 0x55, 0x0A, 0xBF, 0x00, 0x2B, 0x02, 0x21, 0x0D, + 0x80, 0xEF, 0xC8, 0xFF, 0xD5, 0xEB, 0x1D, 0xFC, 0x93, 0xFB, 0xA9, 0x07, + 0x7D, 0x0F, 0xC3, 0x10, 0xFA, 0x08, 0x0D, 0x0A, 0xC4, 0xF4, 0x0E, 0xF1, + 0x4D, 0x05, 0x33, 0xFA, 0xB5, 0x06, 0x2A, 0x06, 0x58, 0xF1, 0x5F, 0xFC, + 0x12, 0xF2, 0xE6, 0xF6, 0x99, 0xE7, 0xD0, 0xE3, 0x6E, 0xCD, 0x9B, 0xD2, + 0x8F, 0xC1, 0xC3, 0xD0, 0x3A, 0xBF, 0xB4, 0xC5, 0xE3, 0xB5, 0xDD, 0xB0, + 0x9D, 0xAD, 0xBB, 0xA2, 0x55, 0xCA, 0x47, 0xB8, 0x25, 0xFE, 0x6B, 0xE6, + 0xF5, 0x1B, 0x7F, 0x06, 0x9C, 0x2B, 0x00, 0x20, 0xF5, 0x45, 0x80, 0x47, + 0xD3, 0x49, 0x38, 0x51, 0x10, 0x27, 0xB8, 0x2F, 0x12, 0x00, 0x9F, 0x19, + 0x65, 0xDE, 0x7D, 0x07, 0xCA, 0xBD, 0x4F, 0xE3, 0x91, 0xB6, 0xE5, 0xC4, + 0x0A, 0xD1, 0x4C, 0xBC, 0x1A, 0xE4, 0x06, 0xC3, 0x5B, 0xE5, 0xA3, 0xCE, + 0x01, 0xE7, 0xE7, 0xD1, 0xA7, 0xE7, 0xF1, 0xCE, 0x82, 0xE5, 0x5B, 0xD2, + 0xF0, 0xF1, 0xAC, 0xEE, 0x19, 0x05, 0x3D, 0x14, 0xC6, 0x08, 0x26, 0x23, + 0x9F, 0x14, 0xEA, 0x31, 0x14, 0x24, 0x3D, 0x36, 0x5D, 0x27, 0x87, 0x30, + 0x1E, 0x25, 0x17, 0x31, 0xA6, 0x0D, 0x22, 0x12, 0x04, 0x03, 0xFB, 0xFD, + 0xE8, 0x12, 0x84, 0x0C, 0xA8, 0x0A, 0x23, 0xF8, 0x85, 0xF4, 0x29, 0xE2, + 0x74, 0xF3, 0x21, 0xFE, 0xB9, 0xF0, 0xDF, 0x0E, 0x2A, 0xED, 0x98, 0x08, + 0xDF, 0x07, 0xE9, 0x0F, 0xA2, 0x21, 0x71, 0x15, 0x34, 0x1B, 0xFD, 0x14, + 0xEC, 0x0D, 0x04, 0x16, 0xF8, 0x05, 0xC5, 0x0B, 0x05, 0xFF, 0x4E, 0x05, + 0x22, 0xF9, 0x71, 0x09, 0x95, 0xF0, 0x99, 0x01, 0xFC, 0xED, 0x06, 0xFA, + 0x74, 0xF6, 0x30, 0x00, 0xE9, 0xFD, 0x23, 0xFC, 0xC6, 0x0C, 0x73, 0xF8, + 0x1A, 0x25, 0x2E, 0x11, 0xB0, 0x1F, 0x53, 0x1C, 0x99, 0x07, 0x31, 0x12, + 0x12, 0xFA, 0x9D, 0x13, 0x59, 0x02, 0x60, 0x14, 0x7B, 0x1B, 0x03, 0x0E, + 0x02, 0x1E, 0x9C, 0x0C, 0xDC, 0x11, 0x2E, 0x0D, 0xF2, 0x14, 0xCD, 0x0A, + 0xF8, 0x23, 0x4A, 0x08, 0x01, 0x34, 0xF9, 0x05, 0x73, 0x38, 0x2D, 0x11, + 0xF1, 0x30, 0x3B, 0x21, 0xC0, 0x2A, 0xDD, 0x24, 0xC0, 0x13, 0x9A, 0x18, + 0x2B, 0xF0, 0x75, 0x02, 0x6E, 0xE3, 0x99, 0xF9, 0xD9, 0xDD, 0x77, 0xFA, + 0x76, 0xC2, 0xC5, 0xE7, 0x11, 0xB5, 0x03, 0xD1, 0xA2, 0xCF, 0xA0, 0xD4, + 0x28, 0xE2, 0x1B, 0xD5, 0x50, 0xF6, 0x9C, 0xE3, 0xC5, 0x14, 0xF9, 0x0B, + 0x09, 0x15, 0x6F, 0x1D, 0xB0, 0x19, 0x2F, 0x2B, 0x5C, 0x2D, 0x3E, 0x36, + 0xEB, 0x20, 0x8B, 0x27, 0xDC, 0xFD, 0xB2, 0x15, 0x4C, 0xD8, 0x2E, 0xF5, + 0xD8, 0xBC, 0x1A, 0xCB, 0x14, 0xB7, 0x53, 0xAF, 0xF5, 0xB6, 0xAC, 0xA3, + 0x12, 0xA5, 0xE1, 0x9F, 0x3B, 0xA4, 0xAA, 0xA1, 0x3E, 0xCF, 0xEB, 0xB5, + 0x97, 0xE1, 0x8C, 0xBE, 0x47, 0xDE, 0x3E, 0xC0, 0x0F, 0xFE, 0xF7, 0xE2, + 0x89, 0x1C, 0x27, 0x00, 0x7B, 0x16, 0xBC, 0x00, 0x51, 0x0D, 0x8B, 0x01, + 0x95, 0x0D, 0xE9, 0xFF, 0x4D, 0x04, 0x14, 0xF8, 0x64, 0xF7, 0x79, 0xFD, + 0x19, 0xED, 0x2C, 0x03, 0xD6, 0xDD, 0x59, 0xF5, 0x14, 0xD6, 0x38, 0xE4, + 0x4E, 0xE4, 0x22, 0xE1, 0x07, 0xF0, 0x61, 0xEA, 0xCE, 0xE8, 0x46, 0xEA, + 0x09, 0xE3, 0x36, 0xE2, 0x9C, 0xEE, 0xEF, 0xE8, 0xA5, 0x06, 0x53, 0xF2, + 0x66, 0x1B, 0xF3, 0xF8, 0x2B, 0x1B, 0x64, 0x01, 0x80, 0x19, 0x8C, 0x0A, + 0xBB, 0x13, 0x1A, 0x0D, 0x73, 0xFC, 0x39, 0x05, 0xF2, 0xF4, 0x2B, 0x00, + 0xCE, 0xF8, 0x79, 0xFA, 0xAE, 0xF2, 0xED, 0xF4, 0xC0, 0xF9, 0x14, 0x01, + 0xAB, 0x10, 0xDD, 0x08, 0xFB, 0x19, 0x03, 0x01, 0xE7, 0x19, 0x3C, 0x0A, + 0x45, 0x1B, 0x0E, 0x1E, 0x79, 0x25, 0xAE, 0x2C, 0x40, 0x2F, 0x54, 0x34, + 0x22, 0x39, 0x3B, 0x39, 0x28, 0x43, 0x40, 0x3C, 0xD8, 0x33, 0xF4, 0x37, + 0x82, 0x1E, 0xB4, 0x37, 0xEB, 0x1A, 0x26, 0x34, 0x2A, 0x28, 0x6E, 0x22, + 0xB1, 0x40, 0x95, 0x23, 0x29, 0x4F, 0x46, 0x42, 0x1A, 0x3F, 0x8A, 0x42, + 0x3F, 0x29, 0xF4, 0x2F, 0x4F, 0x1A, 0x99, 0x35, 0x39, 0x08, 0x49, 0x2F, + 0x53, 0xF8, 0x99, 0x14, 0x30, 0xE8, 0xDB, 0x05, 0x62, 0xE3, 0xF7, 0x06, + 0x9A, 0xF8, 0x6E, 0x0A, 0x79, 0x13, 0x63, 0x06, 0xA0, 0x26, 0x21, 0x0B, + 0xA4, 0x38, 0x3C, 0x2C, 0x2E, 0x45, 0x03, 0x56, 0x89, 0x43, 0xD0, 0x63, + 0xAA, 0x3D, 0x0E, 0x59, 0xB4, 0x41, 0xE2, 0x51, 0xAD, 0x35, 0x22, 0x49, + 0xAA, 0x14, 0xD5, 0x3A, 0x44, 0xFD, 0x7E, 0x28, 0x00, 0xEB, 0xC9, 0x08, + 0x08, 0xD1, 0xBB, 0xE5, 0x80, 0xC0, 0xBD, 0xD6, 0xE9, 0xBD, 0x18, 0xCB, + 0x97, 0xB9, 0x9E, 0xAB, 0xDC, 0xC1, 0xAF, 0xA1, 0x35, 0xE1, 0xC5, 0xB8, + 0x6C, 0xFD, 0x34, 0xCE, 0x7C, 0x02, 0x3F, 0xDD, 0x88, 0x08, 0x3F, 0xF7, + 0x04, 0x1E, 0xAB, 0x12, 0x51, 0x2D, 0xCF, 0x18, 0x42, 0x33, 0x88, 0x1A, + 0xEE, 0x27, 0x5F, 0x18, 0x06, 0x14, 0x27, 0x10, 0xB1, 0x0A, 0x4B, 0x0F, + 0xB0, 0x03, 0xFD, 0x0A, 0x16, 0xF9, 0x74, 0xF4, 0x15, 0xE8, 0x82, 0xDB, + 0x18, 0xD8, 0x76, 0xDE, 0x38, 0xD6, 0xA1, 0xE9, 0xE4, 0xEA, 0x45, 0xEE, + 0x6D, 0xFF, 0x9F, 0xF5, 0xC8, 0x0C, 0x46, 0xFC, 0xD0, 0x21, 0x03, 0x06, + 0xEA, 0x27, 0xE1, 0x09, 0xB6, 0x14, 0xE3, 0x03, 0x1F, 0xF2, 0x26, 0xF9, + 0x74, 0xD9, 0x4E, 0xF3, 0x3E, 0xD9, 0xA8, 0xF9, 0x9B, 0xDA, 0x1D, 0xF3, + 0x2B, 0xDF, 0x89, 0xEE, 0x62, 0xE9, 0x66, 0xF8, 0x72, 0xEF, 0xA1, 0xF1, + 0x59, 0xFE, 0xFE, 0xE5, 0x95, 0x08, 0x34, 0xE0, 0x7E, 0xFD, 0xFC, 0xD1, + 0xA9, 0xF1, 0xC5, 0xC3, 0x6E, 0xF1, 0x59, 0xCA, 0x33, 0xE7, 0x2C, 0xDC, + 0x7D, 0xDA, 0x8C, 0xF4, 0x75, 0xE2, 0xB6, 0x13, 0xB5, 0xF1, 0xB6, 0x1B, + 0xC3, 0x03, 0xF0, 0x0F, 0xF4, 0x17, 0x63, 0x10, 0x22, 0x19, 0x84, 0x15, + 0xEA, 0x0E, 0xC6, 0x1C, 0x80, 0x0D, 0x84, 0x20, 0xEA, 0x0A, 0xDD, 0x12, + 0xF6, 0x04, 0x44, 0xFD, 0xE6, 0xFD, 0x3B, 0xE6, 0xF9, 0xED, 0xC3, 0xDC, + 0x57, 0xD3, 0x55, 0xD7, 0x09, 0xC0, 0xC5, 0xCE, 0x39, 0xC1, 0x67, 0xC9, + 0xD6, 0xD4, 0x88, 0xCD, 0xC3, 0xF1, 0x6C, 0xDB, 0x22, 0x0E, 0x8A, 0xED, + 0xDE, 0x24, 0xD1, 0x08, 0x3D, 0x2D, 0xB5, 0x24, 0x4F, 0x32, 0x58, 0x3F, + 0x1E, 0x38, 0xC9, 0x52, 0x2D, 0x2A, 0x0E, 0x52, 0x4A, 0x13, 0x7A, 0x44, + 0xA7, 0x00, 0x3C, 0x25, 0xDD, 0xEC, 0x8F, 0x04, 0x7D, 0xD3, 0x5D, 0xEB, + 0x32, 0xC3, 0xF2, 0xC8, 0x30, 0xBB, 0xDB, 0xA4, 0xA9, 0xBE, 0x27, 0x9D, + 0x53, 0xCF, 0x8C, 0xAF, 0xF3, 0xDB, 0xBC, 0xC3, 0x41, 0xF2, 0x3F, 0xE8, + 0x5E, 0x0D, 0x3D, 0x0C, 0xE0, 0x18, 0xDE, 0x1B, 0xFE, 0x17, 0x20, 0x27, + 0x98, 0x19, 0x3D, 0x2B, 0xEC, 0x2A, 0x6E, 0x33, 0xB6, 0x37, 0xEE, 0x3E, + 0x0D, 0x24, 0x5A, 0x35, 0x76, 0x15, 0x98, 0x27, 0xDF, 0x1D, 0x2D, 0x1A, + 0xF4, 0x16, 0xB7, 0xFF, 0xD7, 0xFC, 0xAF, 0xED, 0x32, 0xEF, 0x83, 0xF5, + 0x1B, 0xF4, 0x60, 0x05, 0x14, 0xF0, 0x0C, 0x05, 0x5D, 0xE6, 0xD2, 0xF9, + 0xF6, 0xF0, 0xF1, 0xF4, 0xAD, 0x03, 0x6E, 0xF0, 0x01, 0x16, 0x77, 0xF7, + 0x3A, 0x22, 0xFF, 0x09, 0xD7, 0x18, 0xFA, 0x0A, 0x5D, 0x06, 0x15, 0x04, + 0x21, 0xF8, 0x7F, 0x07, 0x1D, 0xF2, 0x70, 0x0F, 0xD7, 0xEE, 0xE7, 0x0B, + 0x4A, 0xEC, 0xD7, 0xFB, 0xB3, 0xFD, 0xCB, 0xFC, 0x19, 0x1B, 0x1A, 0x0B, + 0x44, 0x22, 0x1A, 0x08, 0xB4, 0x16, 0xD7, 0xFE, 0x07, 0x0C, 0xDE, 0xF9, + 0x5F, 0xFE, 0x70, 0xED, 0xE4, 0xF6, 0x51, 0xE8, 0xA2, 0xFD, 0x66, 0xF6, + 0x9B, 0xFB, 0xC3, 0xFD, 0x02, 0xF4, 0x7D, 0x00, 0x17, 0xFD, 0x79, 0x0D, + 0x31, 0x12, 0x70, 0x17, 0xE8, 0x22, 0xC8, 0x1B, 0x27, 0x28, 0xCD, 0x17, + 0x3E, 0x23, 0x0D, 0x0C, 0xA0, 0x19, 0xDD, 0x03, 0x88, 0x0A, 0x1A, 0xF2, + 0x85, 0xF9, 0xC4, 0xDC, 0xC1, 0xEA, 0x16, 0xD8, 0x3A, 0xDC, 0xDA, 0xDA, + 0xF8, 0xD3, 0xB4, 0xD6, 0x1D, 0xCA, 0xB7, 0xC3, 0xD8, 0xD6, 0xED, 0xC2, + 0x7F, 0xF9, 0x25, 0xDD, 0x53, 0x00, 0x9C, 0xF2, 0xDE, 0xFE, 0x0F, 0x0B, + 0xD6, 0x0D, 0x57, 0x27, 0xD0, 0x10, 0xC9, 0x30, 0x20, 0x0F, 0x67, 0x34, + 0xFF, 0x19, 0x25, 0x39, 0x75, 0x1A, 0xFF, 0x29, 0x36, 0x05, 0xC3, 0x0E, + 0x38, 0xEA, 0xAF, 0xFE, 0x2A, 0xCE, 0xC5, 0xE5, 0x39, 0xB8, 0x08, 0xC5, + 0xAF, 0xAF, 0xD9, 0xB0, 0x26, 0xB0, 0xDE, 0xA2, 0xEB, 0xBF, 0x43, 0xA9, + 0x8E, 0xD6, 0xE1, 0xC0, 0x12, 0xEA, 0x12, 0xD3, 0xDB, 0x00, 0xF2, 0xEE, + 0x9F, 0x06, 0x0B, 0x16, 0xF7, 0xF9, 0x4A, 0x23, 0x5E, 0xFB, 0x4B, 0x17, + 0x8F, 0x01, 0x33, 0x0D, 0x92, 0x00, 0x2A, 0x0C, 0xCB, 0x09, 0xD2, 0x14, + 0x31, 0x05, 0xE5, 0x0F, 0x57, 0xED, 0x8A, 0xF7, 0xCC, 0xEB, 0x2D, 0xEE, + 0x77, 0xEF, 0x27, 0xEC, 0x01, 0xE5, 0xB9, 0xEE, 0x96, 0xDF, 0xBE, 0xF5, + 0x87, 0xE6, 0xFA, 0xF1, 0x45, 0xF9, 0x92, 0xF6, 0xC5, 0x14, 0x5E, 0x01, + 0x8D, 0x21, 0x04, 0x09, 0xDA, 0x07, 0x93, 0x06, 0xE8, 0xEB, 0xF5, 0x02, + 0x98, 0xEA, 0x4B, 0x05, 0x23, 0xE9, 0x40, 0xFB, 0x2D, 0xEA, 0x26, 0xF4, + 0xCB, 0xF7, 0x72, 0xFB, 0x40, 0xFE, 0xBE, 0x04, 0x96, 0xFD, 0x35, 0xFE, + 0x5E, 0xFF, 0x57, 0xEA, 0x96, 0x01, 0x47, 0xE1, 0x75, 0x02, 0xF3, 0xE1, + 0xF7, 0xFF, 0x08, 0xE9, 0x03, 0xFA, 0x5D, 0xF2, 0x30, 0xF7, 0x78, 0xF3, + 0x17, 0x08, 0x8B, 0x02, 0x05, 0x16, 0x74, 0x10, 0x98, 0x08, 0x74, 0x08, + 0x4E, 0x05, 0xCE, 0x09, 0x39, 0x0F, 0x6B, 0x11, 0xB2, 0x17, 0x55, 0x12, + 0x10, 0x26, 0x3F, 0x18, 0x04, 0x2C, 0x7B, 0x25, 0x92, 0x26, 0x1C, 0x30, + 0xFD, 0x1B, 0xAA, 0x30, 0xAA, 0x22, 0x80, 0x2E, 0x47, 0x36, 0xBE, 0x27, + 0x58, 0x32, 0x8C, 0x12, 0x4B, 0x1F, 0xDF, 0x00, 0x94, 0x14, 0x8E, 0xFE, + 0xE1, 0x18, 0x8B, 0x01, 0x8A, 0x19, 0xC0, 0x06, 0x09, 0x1A, 0x0E, 0x17, + 0xE4, 0x28, 0x20, 0x29, 0xD2, 0x2D, 0x3B, 0x28, 0xB8, 0x2A, 0xD9, 0x23, + 0x1F, 0x30, 0x95, 0x2A, 0x61, 0x3B, 0xDE, 0x37, 0x60, 0x3B, 0x91, 0x3B, + 0xA6, 0x2B, 0x4B, 0x34, 0x10, 0x1D, 0x24, 0x35, 0xAA, 0x07, 0x1A, 0x26, + 0x9C, 0xF5, 0x8A, 0x03, 0x98, 0xF7, 0x4A, 0xF7, 0xA9, 0xF9, 0xEF, 0xFA, + 0xD1, 0xF7, 0xC6, 0xF9, 0xB4, 0xF4, 0xE3, 0xF2, 0x43, 0xFC, 0x70, 0xF1, + 0x7F, 0x11, 0xB7, 0xFF, 0xFA, 0x0C, 0x64, 0x0A, 0x14, 0xFB, 0x0E, 0x16, + 0x0E, 0xFD, 0xCF, 0x24, 0xB3, 0x06, 0xFE, 0x23, 0xB2, 0x08, 0x1C, 0x19, + 0x34, 0x0D, 0xC2, 0x1B, 0x0D, 0x18, 0x86, 0x23, 0x67, 0x1B, 0xCB, 0x1C, + 0x19, 0x16, 0x2E, 0x19, 0x17, 0x11, 0xF6, 0x19, 0xC5, 0x0D, 0x89, 0x11, + 0x4D, 0x00, 0x89, 0x06, 0xF6, 0xF4, 0xDA, 0x0B, 0x39, 0xF4, 0xD5, 0x16, + 0x4A, 0xFC, 0xBA, 0x15, 0x6D, 0x0C, 0x1E, 0x0F, 0x7B, 0x25, 0x14, 0x0D, + 0xDC, 0x2D, 0xA4, 0x04, 0x2B, 0x09, 0xA0, 0xE6, 0xF1, 0xF1, 0x0F, 0xD9, + 0xEB, 0xF3, 0x53, 0xDB, 0x77, 0xE6, 0x8F, 0xD6, 0x12, 0xD5, 0x32, 0xE1, + 0x3B, 0xD2, 0x24, 0xEF, 0xCF, 0xE0, 0xBC, 0xF1, 0xC8, 0xF3, 0x55, 0xF4, + 0x01, 0xFE, 0x18, 0xF5, 0x18, 0x04, 0xDD, 0xFA, 0x70, 0x0A, 0xC7, 0x0A, + 0x03, 0x0B, 0x42, 0x0F, 0xBC, 0x09, 0x94, 0x06, 0xD0, 0x08, 0x89, 0xFB, + 0x02, 0xF9, 0xC7, 0xEA, 0xAA, 0xE9, 0x5F, 0xEA, 0xF7, 0xE5, 0xA2, 0xF7, + 0x1A, 0xDE, 0x8C, 0xF4, 0xA8, 0xDD, 0xB0, 0xEC, 0x37, 0xF6, 0xD3, 0xF8, + 0x3D, 0x12, 0x55, 0x09, 0x70, 0x11, 0x3E, 0x06, 0x7E, 0xFE, 0x4F, 0xF3, + 0xDA, 0xF4, 0xA2, 0xE8, 0x43, 0xF3, 0x11, 0xF2, 0xBD, 0xE3, 0xE1, 0xF1, + 0x4B, 0xDD, 0x4A, 0xEB, 0xF5, 0xF6, 0x0A, 0xEA, 0x8D, 0x07, 0xFD, 0xDF, + 0x60, 0x01, 0xFD, 0xDD, 0x14, 0xF5, 0x5C, 0xDA, 0x34, 0xE9, 0x48, 0xCB, + 0x42, 0xE1, 0xF1, 0xCB, 0x41, 0xE4, 0xD6, 0xD7, 0x92, 0xFA, 0x01, 0xEA, + 0x1D, 0x05, 0x9F, 0xFF, 0x4A, 0xFA, 0xC3, 0x13, 0x20, 0xF9, 0x5C, 0x24, + 0xD3, 0xED, 0x0A, 0x1C, 0xD0, 0xD1, 0xF9, 0x03, 0x31, 0xC0, 0xA4, 0xE9, + 0x11, 0xBE, 0x30, 0xD8, 0x4E, 0xC4, 0x0A, 0xD0, 0x93, 0xD3, 0x1D, 0xCD, + 0xB3, 0xE7, 0x27, 0xD0, 0x52, 0xE5, 0xC4, 0xC4, 0x87, 0xDA, 0x2F, 0xC7, + 0xF7, 0xD3, 0x19, 0xDD, 0xB4, 0xCF, 0x2B, 0xE9, 0xA2, 0xD7, 0x85, 0xF1, + 0xAC, 0xE4, 0x91, 0xFF, 0x84, 0xEB, 0x49, 0x02, 0x40, 0xF6, 0xBF, 0xF3, + 0x4C, 0x05, 0xAB, 0xED, 0x7D, 0xFD, 0xF5, 0xEC, 0x6C, 0xF6, 0x02, 0xEF, + 0x6E, 0xFF, 0x67, 0xFC, 0xE3, 0x04, 0x05, 0x0A, 0x2B, 0x19, 0xB1, 0x1C, + 0x26, 0x2D, 0xFF, 0x23, 0xA9, 0x27, 0x26, 0x1A, 0x86, 0x1C, 0x8D, 0x16, + 0x4A, 0x11, 0x1D, 0x10, 0xD2, 0x0F, 0xDB, 0x0C, 0x7E, 0x1E, 0x4A, 0x0F, + 0xCC, 0x21, 0x7C, 0x0B, 0xAC, 0x13, 0x82, 0x04, 0x6B, 0x10, 0xD4, 0x09, + 0x7A, 0x13, 0x87, 0x1D, 0x8C, 0x03, 0x39, 0x1C, 0x42, 0xF1, 0x5E, 0x08, + 0xDC, 0xF9, 0x0B, 0x05, 0xCA, 0x12, 0xA3, 0x0C, 0xC5, 0x2D, 0x1C, 0x16, + 0x9D, 0x3A, 0xD8, 0x1A, 0xEB, 0x2C, 0x83, 0x1A, 0x34, 0x1C, 0x1E, 0x18, + 0x71, 0x10, 0x0A, 0x0B, 0x48, 0x08, 0xB2, 0xFB, 0xE5, 0x03, 0xF8, 0xF1, + 0xE2, 0x04, 0xD5, 0xF5, 0xD4, 0x0D, 0x67, 0x03, 0xE5, 0x0C, 0xBA, 0x08, + 0x52, 0x03, 0x51, 0x07, 0xCF, 0xF5, 0x17, 0x02, 0xEB, 0xE9, 0x91, 0x01, + 0x08, 0xF4, 0xE8, 0x10, 0x1F, 0x07, 0xD7, 0x1D, 0x5C, 0x05, 0xBD, 0x14, + 0xB7, 0xF8, 0x52, 0x02, 0xA7, 0xFA, 0x90, 0xF3, 0x7E, 0xFE, 0xE3, 0xE3, + 0x68, 0xF5, 0x7D, 0xD8, 0x52, 0xEE, 0xF5, 0xD9, 0x69, 0xF0, 0x69, 0xE0, + 0xE6, 0xEF, 0x42, 0xDC, 0xA8, 0xF3, 0x48, 0xE0, 0x3E, 0xFE, 0xCB, 0xEE, + 0xCE, 0x02, 0xB5, 0xF7, 0x03, 0x00, 0x52, 0x02, 0x9F, 0xFD, 0xD8, 0x0E, + 0xC3, 0xFB, 0x07, 0x1A, 0x22, 0xFC, 0x4B, 0x24, 0xF5, 0x05, 0x21, 0x2C, + 0x97, 0x0D, 0x86, 0x21, 0x58, 0x08, 0x5A, 0x0D, 0x2F, 0xF1, 0x51, 0xFA, + 0x15, 0xD7, 0xA0, 0xE4, 0x8C, 0xCF, 0x20, 0xD7, 0xD0, 0xC5, 0x67, 0xC7, + 0x28, 0xC1, 0x79, 0xBD, 0x77, 0xD6, 0x4A, 0xCB, 0x92, 0xF3, 0x0D, 0xE8, + 0xC7, 0xFD, 0xCF, 0xFB, 0x6F, 0xE7, 0x62, 0xF9, 0xE9, 0xD2, 0xCC, 0xFD, + 0xB9, 0xD9, 0xE1, 0x09, 0x5F, 0xE6, 0xD0, 0x05, 0xF4, 0xEF, 0xF6, 0x01, + 0x02, 0xFA, 0xE6, 0x06, 0x36, 0xF9, 0x7F, 0x03, 0xE4, 0xF1, 0xB3, 0xF4, + 0x55, 0xF9, 0xEC, 0xEB, 0xD7, 0x08, 0x41, 0xEC, 0x37, 0x08, 0x82, 0xEA, + 0xC6, 0x04, 0x31, 0xF0, 0x36, 0x11, 0x19, 0xFF, 0xC0, 0x0A, 0x15, 0xFF, + 0x47, 0xF1, 0xC1, 0xEF, 0xA4, 0xE8, 0xAD, 0xE5, 0x12, 0xEF, 0x46, 0xEB, + 0xB4, 0xF0, 0x3A, 0xF1, 0x32, 0xE8, 0x88, 0xEC, 0xBD, 0xF2, 0x8B, 0xF3, + 0x64, 0x09, 0x5C, 0xFC, 0x24, 0x0F, 0xC1, 0xFB, 0x6A, 0x0B, 0xC0, 0xFB, + 0x36, 0x01, 0x49, 0xF0, 0x04, 0x00, 0xCE, 0xEB, 0xCE, 0x0A, 0x3B, 0xFB, + 0x0D, 0x0D, 0x7C, 0x01, 0x76, 0x08, 0x04, 0xF6, 0xA6, 0xFF, 0xEB, 0xE4, + 0x59, 0x07, 0x66, 0xDF, 0x34, 0x1F, 0xE0, 0xE8, 0xED, 0x19, 0x20, 0xF5, + 0x11, 0xFF, 0xE0, 0x00, 0x21, 0xF7, 0x2F, 0x10, 0x21, 0xF5, 0xD4, 0x14, + 0x11, 0xED, 0x34, 0x09, 0x4F, 0xF2, 0x1B, 0x00, 0xAA, 0xF7, 0x5A, 0xFC, + 0x73, 0xED, 0xCD, 0xFA, 0x0C, 0xEB, 0x14, 0xFF, 0x50, 0x00, 0x90, 0x05, + 0x41, 0x17, 0x4C, 0x02, 0xBA, 0x16, 0x90, 0xFA, 0xB4, 0x0C, 0x12, 0x00, + 0x90, 0x00, 0x9F, 0xFE, 0xF3, 0xF4, 0x0D, 0xF6, 0xD9, 0xF3, 0x6F, 0xFC, + 0xF3, 0xF2, 0xFD, 0x09, 0x27, 0xF9, 0x6A, 0x13, 0x6C, 0x10, 0xB4, 0x1D, + 0x76, 0x25, 0x56, 0x2D, 0xAF, 0x2F, 0xD8, 0x33, 0x0E, 0x30, 0xDA, 0x33, + 0x85, 0x24, 0xAD, 0x30, 0xFB, 0x24, 0xCF, 0x31, 0x26, 0x31, 0xD2, 0x36, + 0xD4, 0x2A, 0xFA, 0x2B, 0xC5, 0x21, 0x5E, 0x24, 0xAB, 0x1B, 0x25, 0x1E, + 0x1B, 0x0C, 0x1C, 0x13, 0x3F, 0x02, 0xA3, 0x0F, 0x10, 0x10, 0x13, 0x12, + 0x9E, 0x29, 0x4B, 0x1B, 0xBC, 0x34, 0x76, 0x23, 0x9B, 0x36, 0xCD, 0x33, + 0x6C, 0x31, 0x94, 0x48, 0xFA, 0x1E, 0x63, 0x41, 0xBE, 0x11, 0xA6, 0x2C, + 0xED, 0x1B, 0xAE, 0x32, 0xC0, 0x29, 0xEF, 0x46, 0xD7, 0x28, 0xC6, 0x49, + 0xB6, 0x22, 0xE4, 0x3C, 0xF6, 0x1D, 0xA7, 0x2D, 0xE5, 0x17, 0x75, 0x21, + 0x65, 0x10, 0x37, 0x18, 0xA3, 0x0C, 0xF5, 0x10, 0xA6, 0x10, 0x23, 0x0F, + 0x9E, 0x12, 0x8C, 0x0F, 0xE1, 0x12, 0x19, 0x14, 0xC7, 0x20, 0x2F, 0x1B, + 0x16, 0x28, 0xB6, 0x13, 0x27, 0x1A, 0x69, 0x09, 0xBE, 0x12, 0xFF, 0x06, + 0x1E, 0x18, 0xCA, 0x00, 0x52, 0x13, 0xD2, 0xF5, 0x59, 0x08, 0x31, 0xF5, + 0xC1, 0x00, 0x9E, 0x01, 0x15, 0x00, 0x66, 0x04, 0x36, 0x07, 0x06, 0xF8, + 0xA9, 0x15, 0x5A, 0xF4, 0x87, 0x1E, 0x76, 0xFC, 0xD8, 0x13, 0x1E, 0xFD, + 0x1B, 0x0B, 0x0B, 0xF8, 0xA4, 0x09, 0x92, 0xF1, 0xF6, 0x09, 0x80, 0xE9, + 0xAC, 0x0C, 0x4E, 0xEE, 0x9E, 0x01, 0xC4, 0xF6, 0x7D, 0xEF, 0xA0, 0xFD, + 0xF2, 0xDD, 0xEE, 0x01, 0x4B, 0xD7, 0xBD, 0xFC, 0xCA, 0xEA, 0xDB, 0xFB, + 0x05, 0xF7, 0x7A, 0xF7, 0xA1, 0xE9, 0xE3, 0xEE, 0x53, 0xDB, 0x32, 0xE9, + 0x13, 0xDB, 0x88, 0xDF, 0x3E, 0xE7, 0x3E, 0xDE, 0xF1, 0xF0, 0xA8, 0xE3, + 0xA7, 0xF2, 0x94, 0xE7, 0xFF, 0xF1, 0x3C, 0xEF, 0x3E, 0xEE, 0x9E, 0xF5, + 0x07, 0xF5, 0xCA, 0xEF, 0x2E, 0x01, 0xFC, 0xE5, 0xAD, 0xF1, 0x9B, 0xE1, + 0x56, 0xE0, 0xCC, 0xDE, 0xE7, 0xE1, 0xE2, 0xDA, 0x40, 0xE3, 0xDF, 0xDF, + 0x8B, 0xE2, 0x11, 0xEE, 0x42, 0xE9, 0x86, 0xFC, 0x9E, 0xED, 0x18, 0x04, + 0x70, 0xDD, 0x54, 0xFC, 0x8A, 0xD2, 0x15, 0xF1, 0x47, 0xE3, 0x79, 0xEB, + 0x14, 0xF5, 0xD2, 0xE3, 0x0A, 0xEB, 0x4C, 0xD4, 0xFC, 0xD9, 0xAA, 0xCF, + 0x74, 0xDB, 0x0F, 0xDD, 0xAF, 0xE0, 0xE9, 0xE3, 0x3E, 0xE5, 0xFC, 0xE2, + 0xC6, 0xEF, 0x3D, 0xE8, 0x3E, 0xF6, 0x15, 0xF5, 0x21, 0xF4, 0x04, 0xFE, + 0x4A, 0xF2, 0xB6, 0xF6, 0xB9, 0xF7, 0x14, 0xF0, 0x54, 0xED, 0x0B, 0xED, + 0x1A, 0xD9, 0x20, 0xF5, 0xCC, 0xDA, 0x99, 0x09, 0x25, 0xE9, 0xBA, 0x0A, + 0xFD, 0xF9, 0x20, 0x02, 0x24, 0x05, 0x83, 0x00, 0xAB, 0x06, 0xED, 0x05, + 0x65, 0x01, 0xE3, 0x07, 0x70, 0xF4, 0xD8, 0x01, 0xB5, 0xEC, 0x3F, 0xFF, + 0x15, 0xF3, 0x7E, 0xFB, 0x21, 0x02, 0x33, 0xFC, 0x4D, 0x06, 0x1C, 0x01, + 0xFC, 0x03, 0xF9, 0x04, 0xE0, 0x07, 0x68, 0x02, 0x60, 0x0A, 0x49, 0xFA, + 0xEE, 0x0D, 0x3E, 0xF7, 0xDD, 0x11, 0x88, 0xF8, 0x65, 0x0D, 0x2F, 0x01, + 0x7A, 0x04, 0x6F, 0x09, 0x85, 0xFE, 0x52, 0x0D, 0x17, 0x02, 0xA3, 0x14, + 0x8C, 0x08, 0xCE, 0x1B, 0xB9, 0x10, 0x93, 0x1C, 0xA9, 0x22, 0xCA, 0x0F, + 0xEB, 0x2D, 0x6F, 0xFB, 0xE3, 0x29, 0x70, 0xEE, 0xA2, 0x21, 0x43, 0xEC, + 0x52, 0x1D, 0xD7, 0xEC, 0x79, 0x16, 0x28, 0xF1, 0x28, 0x04, 0x4C, 0xFD, + 0x85, 0xF6, 0xBB, 0x0B, 0xD9, 0xF8, 0x75, 0x17, 0x5B, 0x00, 0xFC, 0x1F, + 0xF1, 0x03, 0xB3, 0x23, 0x0C, 0x0B, 0x13, 0x23, 0x45, 0x16, 0xAC, 0x19, + 0xF1, 0x10, 0x4A, 0x07, 0xD6, 0x0D, 0x0D, 0x00, 0x26, 0x11, 0x5A, 0x06, + 0x52, 0xFB, 0xE8, 0x03, 0x8E, 0xEC, 0xD6, 0xF8, 0xC6, 0xFE, 0x2F, 0xF5, + 0x9B, 0x09, 0x42, 0xF5, 0xED, 0xFC, 0xDC, 0xF5, 0xE1, 0xF2, 0x46, 0xF5, + 0x4B, 0xF0, 0xC1, 0xF3, 0x68, 0xE2, 0xAB, 0xF3, 0xE7, 0xD4, 0xD6, 0xF3, + 0x3F, 0xDD, 0x65, 0xF7, 0x56, 0xE2, 0x7A, 0xF0, 0x7D, 0xDC, 0x95, 0xED, + 0x1C, 0xE1, 0x7E, 0x00, 0x3D, 0xEE, 0x81, 0x12, 0x9C, 0xF7, 0x9A, 0x17, + 0x96, 0xF9, 0xED, 0x0B, 0x12, 0xFA, 0x24, 0xFD, 0xB1, 0xF3, 0x10, 0xEE, + 0x27, 0xF3, 0x42, 0xE7, 0xEA, 0xF6, 0x56, 0xEA, 0x97, 0xEC, 0xEB, 0xE3, + 0x65, 0xE7, 0xEC, 0xE2, 0xCF, 0xEA, 0x9D, 0xE6, 0x6B, 0xED, 0x88, 0xE6, + 0x6B, 0xEF, 0xEB, 0xE9, 0x55, 0xEE, 0x93, 0xF5, 0xFB, 0xF7, 0xC8, 0x06, + 0xEA, 0xFF, 0xA5, 0x00, 0x6F, 0xFA, 0xDF, 0xF5, 0x64, 0xF9, 0xF7, 0x05, + 0x22, 0xFA, 0xFA, 0x08, 0xC8, 0xFC, 0x73, 0xFD, 0x02, 0x02, 0x53, 0xFE, + 0x93, 0x00, 0xB1, 0xFE, 0x72, 0xFC, 0x76, 0xFA, 0x50, 0xF8, 0xF7, 0xF3, + 0x20, 0xF0, 0x9A, 0xE8, 0xDC, 0xEF, 0xEA, 0xEC, 0x3A, 0xEB, 0x69, 0xF4, + 0xD0, 0xDD, 0x6F, 0xE5, 0xD1, 0xEB, 0x92, 0xDA, 0x81, 0x07, 0x68, 0xDB, + 0x9D, 0x11, 0x94, 0xE0, 0x4B, 0x10, 0xF9, 0xEE, 0x6E, 0x09, 0xF7, 0xF8, + 0xA0, 0x05, 0xFA, 0xF8, 0xC0, 0xFE, 0x97, 0xF4, 0xFF, 0xF5, 0x30, 0xEF, + 0x47, 0xFB, 0x79, 0xE7, 0x52, 0xFD, 0x74, 0xDE, 0xE3, 0xF5, 0xE8, 0xDD, + 0x22, 0xFA, 0xBD, 0xE5, 0x23, 0x06, 0xA8, 0xE7, 0x8F, 0x05, 0x52, 0xDC, + 0xC4, 0xFF, 0x85, 0xD7, 0x7A, 0xFC, 0xBD, 0xE4, 0x11, 0xF1, 0x55, 0xF9, + 0x7A, 0xDF, 0x84, 0x0A, 0xDF, 0xDB, 0x10, 0x17, 0x4A, 0xEC, 0x9B, 0x20, + 0xCA, 0xF5, 0xA9, 0x14, 0x3E, 0xE9, 0x53, 0xF3, 0x61, 0xE2, 0x8C, 0xE2, + 0x17, 0xE6, 0xB3, 0xE8, 0xDF, 0xDF, 0x54, 0xEF, 0x7C, 0xDE, 0x8B, 0xF0, + 0x0E, 0xE2, 0x74, 0xEB, 0xDD, 0xE1, 0x72, 0xEA, 0x8C, 0xEA, 0x7C, 0xF4, + 0x59, 0xF9, 0x16, 0xFA, 0x66, 0xFF, 0x2C, 0xFC, 0x99, 0xFE, 0x7E, 0x08, + 0x03, 0x05, 0x64, 0x0E, 0xB3, 0x1C, 0x38, 0x0B, 0xD7, 0x2C, 0x1F, 0x0A, + 0x9B, 0x28, 0x35, 0x12, 0x3C, 0x1B, 0x42, 0x20, 0xE3, 0x05, 0xA3, 0x22, + 0xCB, 0xFE, 0x24, 0x23, 0x0D, 0x05, 0xC3, 0x20, 0x5B, 0x0D, 0x70, 0x20, + 0x4A, 0x16, 0x01, 0x27, 0xA8, 0x1C, 0x1D, 0x23, 0x62, 0x28, 0x48, 0x1D, + 0x83, 0x2D, 0x45, 0x15, 0x21, 0x26, 0x0D, 0x0A, 0xA4, 0x1C, 0xD6, 0x09, + 0x56, 0x20, 0xED, 0x0F, 0x9B, 0x2D, 0x7E, 0x19, 0xBA, 0x2E, 0x84, 0x30, + 0x77, 0x2B, 0x56, 0x49, 0x27, 0x26, 0xF9, 0x41, 0x4C, 0x1F, 0x0D, 0x2B, + 0x41, 0x19, 0xE6, 0x27, 0xAA, 0x14, 0x48, 0x26, 0x32, 0x1A, 0x77, 0x21, + 0xAC, 0x2B, 0xAD, 0x2C, 0xDA, 0x3D, 0x78, 0x3F, 0xEB, 0x34, 0xE8, 0x3F, + 0x9B, 0x25, 0xA1, 0x33, 0x40, 0x29, 0xDB, 0x2B, 0x0E, 0x2D, 0x88, 0x27, + 0x3F, 0x24, 0xD7, 0x23, 0xF8, 0x15, 0x28, 0x1E, 0xFE, 0x1B, 0xBA, 0x1D, + 0x86, 0x2C, 0x77, 0x18, 0x63, 0x2A, 0x4E, 0x05, 0x77, 0x1B, 0x33, 0xFD, + 0x9E, 0x10, 0xC6, 0x08, 0x43, 0x09, 0x56, 0x18, 0xD3, 0x05, 0x0D, 0x24, + 0x9F, 0x12, 0x43, 0x24, 0xAF, 0x2D, 0x98, 0x18, 0xEA, 0x44, 0xBD, 0x14, + 0xB1, 0x3D, 0x3B, 0x16, 0xCE, 0x19, 0x2F, 0x0B, 0x24, 0x03, 0xDD, 0xFC, + 0x16, 0x03, 0x14, 0xF7, 0x8E, 0x01, 0xC0, 0xF6, 0xF3, 0x0C, 0x42, 0x03, + 0x08, 0x1B, 0x6C, 0x0F, 0x42, 0x10, 0xDD, 0x0B, 0x2A, 0x04, 0x9F, 0x0C, + 0x03, 0xFA, 0xF7, 0x0C, 0xB8, 0xE2, 0x36, 0x03, 0xA8, 0xCE, 0xF0, 0xF6, + 0x18, 0xD7, 0x5C, 0xED, 0x40, 0xEC, 0x13, 0xEF, 0xC5, 0xE8, 0xF7, 0xF5, + 0x54, 0xD9, 0x54, 0xF6, 0xB8, 0xDC, 0xE6, 0xEF, 0x14, 0xE5, 0x67, 0xE0, + 0x86, 0xDD, 0x8C, 0xCB, 0x3E, 0xD8, 0x18, 0xC4, 0x07, 0xE7, 0xFC, 0xD4, + 0x6D, 0xF0, 0xCB, 0xEA, 0x7A, 0xE8, 0x24, 0xF6, 0xB3, 0xEA, 0x48, 0xFC, + 0x1A, 0xFB, 0x97, 0xFE, 0x22, 0xFD, 0xCA, 0xFD, 0x97, 0xF2, 0x3F, 0xFA, + 0xFB, 0xEF, 0x95, 0xFB, 0xC5, 0xEC, 0x1D, 0xF5, 0x70, 0xF5, 0xFF, 0xEA, + 0x29, 0x07, 0x15, 0xF4, 0x71, 0xF6, 0xB9, 0xF8, 0xFE, 0xD7, 0xD2, 0xF4, + 0x72, 0xD3, 0xD8, 0xF3, 0x98, 0xDF, 0x30, 0xF2, 0xB4, 0xF3, 0xF1, 0xF8, + 0x4C, 0x07, 0x50, 0x06, 0xCD, 0x0D, 0x3F, 0x08, 0x8D, 0x0F, 0x16, 0xFE, + 0xA1, 0x16, 0x0C, 0x02, 0xDF, 0x12, 0xD4, 0x0A, 0x59, 0x02, 0x8A, 0x09, + 0xC3, 0xFC, 0xB7, 0x0B, 0x05, 0x07, 0x90, 0x12, 0xF7, 0x12, 0x98, 0x18, + 0xD6, 0x1B, 0x31, 0x17, 0xDE, 0x18, 0x37, 0x0F, 0x6D, 0x14, 0xFF, 0x0A, + 0x15, 0x18, 0xB5, 0x0E, 0xB5, 0x1F, 0x6D, 0x1D, 0x24, 0x2F, 0x32, 0x2B, + 0xA6, 0x3C, 0x07, 0x28, 0x2C, 0x3D, 0x38, 0x29, 0x66, 0x28, 0x7A, 0x30, + 0x40, 0x10, 0xD0, 0x23, 0xE3, 0x08, 0xE7, 0x11, 0x7C, 0x05, 0xEB, 0x05, + 0x63, 0xFF, 0xFB, 0xF4, 0x30, 0x13, 0xD2, 0xFD, 0x01, 0x20, 0x80, 0x0B, + 0xC6, 0x01, 0x41, 0xFA, 0x3B, 0x00, 0xE2, 0xFE, 0x84, 0x14, 0xB3, 0x15, + 0xE5, 0x0A, 0x25, 0x13, 0x21, 0x02, 0x2A, 0x0D, 0xFA, 0xFC, 0x66, 0x0E, + 0x94, 0x12, 0x73, 0x1B, 0x14, 0x32, 0xE9, 0x1B, 0x5A, 0x23, 0x79, 0xFB, + 0x9F, 0x19, 0x8B, 0x01, 0xB6, 0x07, 0xCA, 0x0B, 0x89, 0xDB, 0xB1, 0xE8, + 0x2B, 0xE6, 0x89, 0xE4, 0x2D, 0xFB, 0x42, 0xED, 0x04, 0xD9, 0xC2, 0xDC, + 0x98, 0xC3, 0xE5, 0xD4, 0x37, 0xCE, 0xF9, 0xD8, 0xB2, 0xC1, 0x92, 0xCB, + 0x18, 0xAC, 0xB2, 0xB0, 0x38, 0xBF, 0x87, 0xBB, 0xFB, 0xCD, 0x9E, 0xC9, + 0xE5, 0xB6, 0xF8, 0xB6, 0xF6, 0xB5, 0x2B, 0xBA, 0x65, 0xC9, 0x6B, 0xCC, + 0x95, 0xBD, 0xEB, 0xC1, 0xB7, 0xB1, 0xC4, 0xBD, 0x2F, 0xC0, 0x09, 0xD1, + 0x05, 0xC5, 0x49, 0xD7, 0x87, 0xB0, 0x15, 0xBB, 0xE0, 0xA2, 0x13, 0x9A, + 0xBC, 0xBA, 0x9A, 0xA4, 0x37, 0xC1, 0x6E, 0xB2, 0xB7, 0xA6, 0x09, 0xAC, + 0xA0, 0x9B, 0xF8, 0xA3, 0xBA, 0xA7, 0x37, 0xA5, 0xE4, 0xBA, 0x9F, 0xB6, + 0x06, 0xC3, 0xA7, 0xC1, 0x9A, 0xBE, 0x42, 0xBD, 0x38, 0xAB, 0x91, 0xAC, + 0x14, 0x9F, 0xF5, 0xA1, 0x42, 0xB3, 0x32, 0xA5, 0x6A, 0xCA, 0xA4, 0xB4, + 0x6F, 0xCA, 0x9A, 0xC0, 0xBF, 0xBE, 0xB2, 0xBD, 0x40, 0xC1, 0x80, 0xBF, + 0x48, 0xD2, 0xEF, 0xC1, 0x0F, 0xD3, 0x9A, 0xC0, 0x30, 0xC8, 0x3B, 0xBB, + 0xE2, 0xB2, 0x57, 0xAC, 0xD0, 0xB3, 0xED, 0xB5, 0x0F, 0xDC, 0x59, 0xD7, + 0x32, 0xFC, 0x99, 0xF0, 0x5E, 0x05, 0xBE, 0xFD, 0xCA, 0xF6, 0x6A, 0xFD, + 0xB3, 0xF5, 0x97, 0x06, 0x46, 0x08, 0x93, 0x0D, 0xE4, 0x10, 0x9B, 0x08, + 0x3D, 0x04, 0xCB, 0x08, 0xC6, 0xF4, 0x84, 0x0A, 0xCB, 0xF2, 0x64, 0x01, + 0x8C, 0xE7, 0x63, 0xF3, 0x41, 0xEB, 0x5A, 0xFA, 0xE7, 0x02, 0xA4, 0x05, + 0xE3, 0x07, 0x71, 0x00, 0x0D, 0x10, 0xFD, 0x09, 0xCA, 0x26, 0x59, 0x25, + 0xC5, 0x2C, 0x26, 0x2D, 0xBD, 0x25, 0xAA, 0x2A, 0xDB, 0x19, 0xE3, 0x26, + 0x4B, 0x0E, 0x05, 0x18, 0x21, 0x0E, 0xA2, 0x0F, 0xCE, 0x1D, 0x8E, 0x1C, + 0xAB, 0x34, 0x3B, 0x29, 0xEF, 0x47, 0xFD, 0x33, 0x24, 0x54, 0x15, 0x3E, + 0xBE, 0x56, 0x46, 0x40, 0xE0, 0x4F, 0x08, 0x3E, 0xA0, 0x43, 0xEA, 0x2F, + 0xE2, 0x35, 0xC2, 0x29, 0x45, 0x1F, 0xAB, 0x25, 0xD8, 0x0C, 0xD9, 0x1C, + 0x80, 0x0C, 0x61, 0x27, 0x52, 0x14, 0x53, 0x3F, 0xD7, 0x2E, 0xDF, 0x52, + 0x23, 0x51, 0xD7, 0x56, 0x0F, 0x5E, 0xA9, 0x59, 0x07, 0x5A, 0x42, 0x5B, + 0x94, 0x56, 0xD8, 0x4F, 0xDD, 0x56, 0x68, 0x45, 0xA6, 0x45, 0xB4, 0x3B, + 0x28, 0x31, 0x38, 0x33, 0x42, 0x2C, 0xFD, 0x24, 0x0B, 0x2B, 0x81, 0x1F, + 0x1B, 0x39, 0xEA, 0x32, 0x24, 0x4D, 0x2D, 0x48, 0x15, 0x58, 0xC6, 0x5A, + 0xB3, 0x57, 0xC4, 0x5C, 0xF0, 0x48, 0x31, 0x51, 0xC1, 0x3C, 0xC0, 0x4F, + 0xC7, 0x30, 0x71, 0x4A, 0xB5, 0x15, 0xC1, 0x34, 0x5C, 0x02, 0xA0, 0x1B, + 0x7D, 0x0F, 0x60, 0x14, 0x27, 0x2A, 0xFA, 0x23, 0x21, 0x46, 0x8B, 0x38, + 0xBF, 0x5C, 0xC8, 0x3E, 0x0E, 0x5B, 0xF7, 0x3D, 0x58, 0x48, 0x61, 0x43, + 0xC6, 0x39, 0x9F, 0x3F, 0xAD, 0x2C, 0x59, 0x2D, 0xD1, 0x17, 0xFF, 0x1D, + 0xB4, 0xF6, 0xE8, 0x0B, 0xE7, 0xEC, 0x9A, 0x04, 0x20, 0x12, 0xA0, 0x1C, + 0x69, 0x3B, 0x9C, 0x3A, 0x38, 0x4E, 0x14, 0x45, 0x9C, 0x57, 0xDE, 0x4E, + 0xC6, 0x53, 0x72, 0x4E, 0xFC, 0x52, 0x28, 0x3B, 0xA9, 0x50, 0xFC, 0x30, + 0x75, 0x39, 0xDE, 0x2A, 0x72, 0x10, 0xDE, 0x10, 0xE2, 0xEF, 0x67, 0xF9, + 0x43, 0xFF, 0xEE, 0x01, 0xA7, 0x1B, 0x5A, 0x10, 0x43, 0x23, 0x90, 0x19, + 0x0C, 0x1A, 0xD4, 0x22, 0xBE, 0x10, 0x49, 0x28, 0x77, 0x1D, 0x6E, 0x2B, + 0xE3, 0x33, 0x9A, 0x2D, 0x5E, 0x35, 0x1A, 0x2A, 0xCC, 0x0F, 0xCD, 0x0C, + 0x8A, 0xEC, 0xC5, 0xEC, 0x8D, 0xFA, 0x22, 0xF7, 0xE1, 0x0E, 0xB6, 0x07, + 0x0A, 0xFF, 0x6E, 0xFF, 0x29, 0xED, 0x7F, 0xFA, 0x85, 0xF4, 0x49, 0x03, + 0xE8, 0xFD, 0x08, 0x10, 0xA3, 0xFF, 0x12, 0x10, 0x03, 0x01, 0x9E, 0x03, + 0x7D, 0x02, 0x2C, 0x00, 0xB0, 0xF9, 0x6A, 0xF2, 0xBA, 0xEC, 0xB2, 0xE7, + 0xE3, 0xE4, 0x4E, 0xF3, 0x1B, 0xD6, 0xD7, 0xF4, 0x21, 0xCC, 0xE3, 0xF0, + 0x4D, 0xCE, 0x39, 0xEF, 0x57, 0xCE, 0x07, 0xE8, 0x1E, 0xDB, 0x7B, 0xE9, + 0xF2, 0xEF, 0x42, 0xE9, 0x7C, 0xE4, 0x79, 0xD5, 0x43, 0xCD, 0x83, 0xCE, + 0x39, 0xCC, 0xBC, 0xCF, 0xC6, 0xD3, 0x35, 0xC2, 0x3C, 0xDC, 0x12, 0xBC, + 0x8E, 0xE9, 0x93, 0xC5, 0xF2, 0xF6, 0xD1, 0xDA, 0xE4, 0xF9, 0x04, 0xEC, + 0x33, 0xF7, 0x69, 0xFC, 0xCA, 0xE8, 0x67, 0x00, 0x35, 0xD1, 0x42, 0xE5, + 0x97, 0xC4, 0xC0, 0xD4, 0xC3, 0xB9, 0xBC, 0xCD, 0x2A, 0xB8, 0x95, 0xC7, + 0x4D, 0xC4, 0xA3, 0xD0, 0x29, 0xC7, 0xD5, 0xCB, 0x6C, 0xC8, 0x17, 0xC3, + 0x21, 0xDC, 0x28, 0xD2, 0x4B, 0xEC, 0xF4, 0xD8, 0x82, 0xE7, 0x8B, 0xCB, + 0x32, 0xE1, 0x50, 0xC9, 0x76, 0xE1, 0xCD, 0xD0, 0xF0, 0xE3, 0x24, 0xD3, + 0xA6, 0xDE, 0x97, 0xD3, 0x50, 0xCD, 0x3A, 0xC1, 0x7F, 0xC7, 0xAC, 0xB4, + 0xD7, 0xD8, 0x3D, 0xCC, 0xBB, 0xE6, 0x1E, 0xE9, 0x53, 0xF2, 0xDE, 0xF1, + 0x4C, 0xFB, 0xBD, 0xE8, 0xB9, 0xF2, 0xE8, 0xE1, 0x33, 0x00, 0x9A, 0xE9, + 0x3E, 0x16, 0x00, 0xF6, 0x01, 0x00, 0x81, 0xF2, 0x5C, 0xD7, 0xCD, 0xDC, + 0xAF, 0xD6, 0xE7, 0xD7, 0xAD, 0xFE, 0xEA, 0xEE, 0xBB, 0x1A, 0xA1, 0x06, + 0x15, 0x18, 0x6B, 0x17, 0x71, 0x04, 0x8D, 0x13, 0xAA, 0xF7, 0xCE, 0x09, + 0x07, 0xFE, 0xC3, 0x19, 0x9F, 0x03, 0x4F, 0x1D, 0x08, 0x07, 0x1E, 0x08, + 0xF3, 0xFB, 0x0F, 0xF6, 0x99, 0xEE, 0x20, 0xED, 0x87, 0xFD, 0xCC, 0xF4, + 0x68, 0x0D, 0x23, 0x08, 0x71, 0x13, 0xCF, 0x15, 0x7B, 0x11, 0x12, 0x18, + 0x68, 0x16, 0x3F, 0x12, 0xD4, 0x22, 0x28, 0x0F, 0xD4, 0x2A, 0x87, 0x21, + 0x90, 0x2F, 0xB0, 0x33, 0xF8, 0x1A, 0x58, 0x30, 0x66, 0xFD, 0x47, 0x1E, + 0x57, 0x09, 0x65, 0x0C, 0xC2, 0x27, 0xE8, 0x11, 0xBD, 0x26, 0x66, 0x21, + 0xE6, 0x15, 0x4D, 0x25, 0xD3, 0x0C, 0x56, 0x17, 0x69, 0x07, 0x66, 0x02, + 0x81, 0xFA, 0xA3, 0x05, 0x33, 0xF3, 0xD7, 0x15, 0xB2, 0xF9, 0x16, 0x09, + 0x9F, 0x01, 0xAA, 0xF5, 0x8E, 0x03, 0x48, 0xFC, 0x52, 0x08, 0x57, 0x01, + 0x40, 0x1D, 0x10, 0xFE, 0xEA, 0x27, 0xC6, 0xFB, 0xFD, 0x16, 0xF3, 0xFD, + 0xE0, 0x02, 0x7C, 0x0C, 0x5E, 0xFA, 0x1B, 0x19, 0xAA, 0xFF, 0x48, 0x1F, + 0x4E, 0x0E, 0x69, 0x13, 0xB1, 0x12, 0x63, 0x0C, 0xCA, 0x01, 0x07, 0x1B, + 0x5B, 0xF8, 0x10, 0x20, 0x23, 0xF8, 0x0E, 0x16, 0x95, 0xF0, 0x46, 0xFE, + 0x33, 0xEE, 0x7F, 0xF6, 0x17, 0xEF, 0x46, 0xFF, 0xC7, 0xF5, 0x97, 0x00, + 0x11, 0xFB, 0x61, 0xF1, 0xBC, 0xF3, 0x08, 0xE8, 0x67, 0xEA, 0x50, 0xF4, + 0x50, 0xEE, 0x9C, 0xED, 0xEF, 0xEA, 0xFA, 0xEC, 0xC5, 0xD6, 0x1A, 0xF0, + 0x34, 0xDF, 0xBB, 0xD8, 0x29, 0xFA, 0x30, 0xD3, 0x3D, 0xF3, 0xDD, 0xD5, + 0x15, 0xD5, 0xC7, 0xDB, 0xEB, 0xCD, 0xCF, 0xE1, 0xCF, 0xD9, 0x65, 0xD9, + 0xB2, 0xDB, 0x24, 0xDC, 0x16, 0xDD, 0x88, 0xE1, 0x4F, 0xDD, 0x93, 0xEB, + 0x1B, 0xDB, 0x92, 0xE2, 0x0A, 0xE1, 0xEF, 0xCB, 0xB0, 0xD2, 0x28, 0xC4, + 0xE0, 0xC6, 0x02, 0xBF, 0xC9, 0xCC, 0x69, 0xC3, 0x91, 0xC0, 0xD4, 0xD0, + 0x94, 0xBA, 0x0F, 0xD9, 0xA8, 0xCE, 0x69, 0xD5, 0xFC, 0xDC, 0xA4, 0xD4, + 0xB0, 0xD4, 0xAF, 0xD6, 0x42, 0xC6, 0x4D, 0xC7, 0x75, 0xC8, 0x95, 0xC9, + 0xE1, 0xBC, 0xED, 0xD9, 0xE4, 0xAB, 0xEE, 0xBF, 0x62, 0xC7, 0xB4, 0xB1, + 0x69, 0xD9, 0xB0, 0xCC, 0xC5, 0xC7, 0xD3, 0xD4, 0x75, 0xD2, 0x35, 0xD1, + 0x94, 0xE6, 0x80, 0xD7, 0x8A, 0xE5, 0x02, 0xD5, 0xD1, 0xEE, 0x97, 0xD0, + 0x33, 0xDF, 0x17, 0xDB, 0xAE, 0xC4, 0xC4, 0xCB, 0x45, 0xD2, 0x52, 0xB1, + 0xC1, 0xDB, 0xFF, 0xBF, 0x01, 0xCA, 0x0C, 0xD2, 0x28, 0xBE, 0x32, 0xDB, + 0x12, 0xBC, 0x9E, 0xDB, 0x95, 0xC7, 0x34, 0xD1, 0xE4, 0xE3, 0x13, 0xD6, + 0xF1, 0xDA, 0x34, 0xDA, 0x33, 0xB7, 0xCC, 0xCC, 0x49, 0xB0, 0x93, 0xB5, + 0x16, 0xBF, 0xAC, 0xA9, 0x64, 0xC0, 0xFC, 0xB2, 0x8A, 0xAE, 0x81, 0xC0, + 0x56, 0xAF, 0x79, 0xBB, 0xE0, 0xC9, 0x82, 0xB1, 0x97, 0xDD, 0xA1, 0xC9, + 0x41, 0xE8, 0x1F, 0xE8, 0x73, 0xE0, 0xEA, 0xE9, 0xB5, 0xDE, 0x7C, 0xE3, + 0x02, 0xF5, 0x0E, 0xE3, 0x98, 0xEB, 0x96, 0xE1, 0x09, 0xCE, 0xAA, 0xDA, + 0x1A, 0xC5, 0x05, 0xE2, 0x4A, 0xCD, 0x5E, 0xEC, 0x6A, 0xDE, 0xC2, 0xEE, + 0xB5, 0xFC, 0xAB, 0xEF, 0xC9, 0x16, 0x96, 0xE3, 0x3B, 0x1B, 0x5D, 0xD4, + 0xB2, 0x10, 0x80, 0xD5, 0x6D, 0x01, 0xB1, 0xF2, 0x25, 0xF0, 0xDA, 0x08, + 0xB9, 0xF1, 0x02, 0xF6, 0xAC, 0x07, 0xFB, 0xDD, 0x21, 0xFC, 0xA5, 0xE4, + 0x4F, 0xF6, 0xB5, 0xFB, 0x56, 0x12, 0xAF, 0x13, 0x44, 0x19, 0xBA, 0x17, + 0x82, 0x14, 0x7C, 0x06, 0x1B, 0x21, 0xED, 0x09, 0x0B, 0x31, 0x7D, 0x22, + 0xA4, 0x2F, 0x07, 0x2D, 0x2D, 0x19, 0xE9, 0x1A, 0x1F, 0x15, 0x47, 0x08, + 0x61, 0x21, 0xE1, 0x0D, 0xD0, 0x14, 0xC8, 0x28, 0xD4, 0x0C, 0xB8, 0x3C, + 0xF8, 0x1B, 0x08, 0x3D, 0x5C, 0x2A, 0xD8, 0x32, 0x0D, 0x37, 0x60, 0x2C, + 0xAE, 0x43, 0xC9, 0x41, 0x8A, 0x2D, 0x33, 0x46, 0xF6, 0x0C, 0xA6, 0x2C, + 0x2E, 0x06, 0xB6, 0x1A, 0x84, 0x0D, 0xDD, 0x0A, 0xBE, 0x12, 0x83, 0x1A, + 0x4B, 0x09, 0xCB, 0x36, 0xDD, 0x1E, 0x20, 0x33, 0x75, 0x40, 0x6B, 0x3D, + 0x95, 0x47, 0x47, 0x54, 0x3B, 0x56, 0xC4, 0x5E, 0x5E, 0x55, 0x59, 0x5D, + 0x1F, 0x3A, 0x32, 0x50, 0x06, 0x32, 0x49, 0x54, 0x26, 0x3D, 0xA5, 0x51, + 0x41, 0x45, 0x45, 0x3D, 0xA3, 0x52, 0x4A, 0x3F, 0x1B, 0x5D, 0xCE, 0x40, + 0x78, 0x54, 0x22, 0x3A, 0x16, 0x52, 0x86, 0x48, 0xC8, 0x5B, 0xB0, 0x58, + 0xCD, 0x5A, 0x30, 0x61, 0xA4, 0x52, 0x62, 0x6A, 0x68, 0x4F, 0xCB, 0x60, + 0x97, 0x42, 0x6D, 0x46, 0x9C, 0x33, 0x53, 0x3E, 0xF7, 0x35, 0xD6, 0x3B, + 0x5C, 0x42, 0xC1, 0x33, 0x29, 0x56, 0xFE, 0x3B, 0xA8, 0x5A, 0x1C, 0x39, + 0x26, 0x58, 0x06, 0x37, 0x6E, 0x5C, 0x14, 0x48, 0xBA, 0x57, 0xE0, 0x4E, + 0x33, 0x4B, 0x6C, 0x4E, 0xBC, 0x30, 0xAB, 0x47, 0x49, 0x22, 0xE0, 0x43, + 0x66, 0x30, 0x90, 0x40, 0xDD, 0x3C, 0x7F, 0x47, 0x8E, 0x45, 0xFE, 0x61, + 0x65, 0x57, 0x5F, 0x64, 0xA6, 0x5B, 0xFD, 0x53, 0xCF, 0x52, 0x56, 0x53, + 0x94, 0x41, 0x56, 0x4F, 0xAF, 0x23, 0xD9, 0x36, 0x0D, 0x25, 0x4F, 0x24, + 0x7F, 0x36, 0xF2, 0x16, 0xF5, 0x28, 0x24, 0x0F, 0xA8, 0x17, 0xEC, 0x1B, + 0x3E, 0x21, 0xB8, 0x2E, 0x6B, 0x2C, 0xCE, 0x36, 0xE0, 0x37, 0xFE, 0x33, + 0xAE, 0x4B, 0x06, 0x34, 0x29, 0x4A, 0x26, 0x40, 0x95, 0x3B, 0xA7, 0x41, + 0xB5, 0x29, 0xBF, 0x2C, 0x0B, 0x1E, 0xC4, 0x1A, 0x85, 0x19, 0x2E, 0x12, + 0xC4, 0x09, 0x7E, 0x09, 0xBC, 0x14, 0x10, 0x02, 0xDB, 0x35, 0x68, 0x09, + 0x2E, 0x45, 0xDA, 0x14, 0xD2, 0x3A, 0xBB, 0x12, 0x87, 0x20, 0x61, 0x07, + 0xEA, 0x1B, 0xA5, 0xFE, 0x52, 0x1F, 0x6C, 0x03, 0x5C, 0x04, 0x4F, 0x03, + 0x80, 0xED, 0xAF, 0xF9, 0xB9, 0xE8, 0x7C, 0x09, 0xB2, 0xE9, 0xC8, 0x28, + 0x34, 0x09, 0x2C, 0x31, 0x44, 0x1D, 0x20, 0x31, 0x54, 0x11, 0xB8, 0x17, + 0xB7, 0x0C, 0x7B, 0xEF, 0x1C, 0x0E, 0xD7, 0xEF, 0x49, 0x0B, 0xB0, 0xF2, + 0xA9, 0xFA, 0xEF, 0xEC, 0x85, 0xED, 0xDA, 0xEA, 0x10, 0xF6, 0xE1, 0xDB, + 0x98, 0x0F, 0xBB, 0xE3, 0x7A, 0x23, 0x74, 0xFE, 0x06, 0x22, 0x06, 0x0B, + 0x71, 0x23, 0xDF, 0x14, 0x7D, 0x23, 0xB1, 0x15, 0xC8, 0x1A, 0xB6, 0x14, + 0xDF, 0x12, 0x56, 0x0F, 0x84, 0x0D, 0xDE, 0xF7, 0xC5, 0x05, 0x94, 0xE9, + 0x01, 0xF8, 0xBE, 0xEE, 0xF6, 0xEE, 0x5D, 0xF1, 0x51, 0xF7, 0x61, 0xF1, + 0x82, 0x11, 0x2D, 0x05, 0xCF, 0x1F, 0xFB, 0x15, 0xCB, 0x16, 0x88, 0x02, + 0x6D, 0xFB, 0x3D, 0xE7, 0x66, 0xF4, 0xB9, 0xEB, 0xF7, 0x0F, 0xA2, 0xEA, + 0xAF, 0x14, 0xDF, 0xDC, 0x1D, 0xFF, 0xB3, 0xE8, 0x67, 0xF0, 0x1F, 0xFE, + 0x05, 0xF7, 0xC7, 0x14, 0xF1, 0x03, 0x41, 0x26, 0x08, 0xFC, 0x49, 0x24, + 0x45, 0xE9, 0x9C, 0x12, 0x2C, 0xE5, 0x62, 0xFD, 0x3B, 0xE7, 0xB7, 0xF2, + 0x00, 0xE2, 0x40, 0xF0, 0x46, 0xE1, 0x3F, 0xE6, 0x79, 0xDF, 0xC6, 0xDD, + 0x3A, 0xD5, 0x4F, 0xEC, 0xEE, 0xDE, 0x63, 0xF7, 0x5D, 0xFC, 0xB5, 0xF8, + 0xB6, 0x01, 0x69, 0xF6, 0xA6, 0xF5, 0xD0, 0xF2, 0x02, 0xEA, 0xD7, 0x02, + 0xBB, 0xDA, 0xED, 0xFF, 0xA6, 0xD4, 0xF5, 0xE2, 0x42, 0xC6, 0xA3, 0xD9, + 0x00, 0xC1, 0xE9, 0xDD, 0xED, 0xD1, 0xD9, 0xE7, 0x96, 0xCA, 0x5E, 0xF8, + 0x60, 0xCA, 0xB0, 0xFF, 0xA4, 0xDC, 0x4C, 0xF3, 0xFF, 0xE2, 0x05, 0xDA, + 0xCC, 0xE6, 0xBE, 0xCC, 0x44, 0xE4, 0x79, 0xD2, 0xC9, 0xD8, 0xBC, 0xD6, + 0xC8, 0xD5, 0xEF, 0xDB, 0x74, 0xE8, 0xE5, 0xE5, 0x61, 0xEB, 0xB4, 0xDA, + 0x8D, 0xD7, 0x62, 0xD5, 0xA5, 0xD9, 0xB8, 0xE0, 0xC4, 0xED, 0x7A, 0xDF, + 0x16, 0xEF, 0xB7, 0xE1, 0xE4, 0xDE, 0xB9, 0xE7, 0xC7, 0xD9, 0xCB, 0xE3, + 0x74, 0xD5, 0xD0, 0xD7, 0x10, 0xCD, 0x13, 0xC9, 0x50, 0xC6, 0x6A, 0xC3, + 0x55, 0xB5, 0x21, 0xCD, 0x20, 0xB0, 0x98, 0xD5, 0x29, 0xC8, 0xFC, 0xD8, + 0x6C, 0xD8, 0xD2, 0xDA, 0x0D, 0xD6, 0x39, 0xE5, 0x92, 0xD7, 0xFD, 0xF6, + 0x91, 0xE0, 0x7A, 0xFA, 0x09, 0xDB, 0x64, 0xF1, 0xA6, 0xC3, 0x2A, 0xE3, + 0x52, 0xBE, 0x55, 0xD3, 0x11, 0xD2, 0x95, 0xD1, 0xF7, 0xD6, 0x0D, 0xDA, + 0x70, 0xB7, 0x03, 0xCE, 0x5C, 0xA3, 0x4D, 0xBB, 0x9A, 0xB3, 0xDB, 0xBD, + 0xF6, 0xCB, 0xFE, 0xCA, 0x64, 0xD7, 0x04, 0xC9, 0x98, 0xD5, 0xD8, 0xBA, + 0x21, 0xCE, 0x48, 0xBC, 0x84, 0xD1, 0xE1, 0xBC, 0xEE, 0xD5, 0x32, 0xBB, + 0xDD, 0xC0, 0xC7, 0xBD, 0x29, 0xAE, 0x97, 0xB4, 0x07, 0xA8, 0x3A, 0xB5, + 0xC4, 0xBA, 0x2D, 0xBE, 0x58, 0xE3, 0xFF, 0xCB, 0x01, 0xE0, 0xD5, 0xDA, + 0x77, 0xC3, 0x82, 0xD5, 0x76, 0xBF, 0x4A, 0xD1, 0xEF, 0xB9, 0x21, 0xC9, + 0xB4, 0xA4, 0x21, 0xB5, 0x40, 0x9A, 0x25, 0xB2, 0x89, 0x9E, 0x76, 0xBE, + 0x33, 0xA8, 0x45, 0xC7, 0x72, 0xAE, 0x80, 0xC7, 0x4A, 0xB7, 0x43, 0xC9, + 0xE5, 0xCF, 0x73, 0xC9, 0x00, 0xD5, 0x66, 0xC2, 0x72, 0xBE, 0x6C, 0xC2, + 0x80, 0xAC, 0x77, 0xC8, 0x07, 0xAC, 0x67, 0xC7, 0x94, 0xB5, 0x4F, 0xBD, + 0xCE, 0xB2, 0xB3, 0xAC, 0x5B, 0xA5, 0x16, 0xA4, 0x8A, 0xA1, 0xF4, 0xAC, + 0xF1, 0xB2, 0xC3, 0xBC, 0xCF, 0xC7, 0x7D, 0xC5, 0xDF, 0xCE, 0xA8, 0xC5, + 0xF5, 0xC9, 0x1F, 0xC8, 0x9B, 0xCD, 0x7E, 0xC5, 0x9C, 0xDB, 0x14, 0xBF, + 0x0F, 0xD6, 0xF0, 0xB9, 0xB5, 0xCC, 0xC4, 0xA6, 0x2A, 0xC7, 0xBE, 0xA2, + 0x6F, 0xBB, 0xE1, 0xB5, 0x7D, 0xC6, 0xFE, 0xC4, 0x41, 0xE6, 0xC4, 0xD1, + 0xC3, 0xEA, 0x00, 0xD8, 0x6B, 0xDB, 0xF5, 0xDA, 0x4E, 0xE2, 0x70, 0xD8, + 0xDC, 0xE6, 0xF7, 0xD5, 0x78, 0xD5, 0xA4, 0xD4, 0x7E, 0xC3, 0x09, 0xC2, + 0x4E, 0xB7, 0x15, 0xB8, 0x87, 0xC7, 0x7E, 0xC3, 0x81, 0xE3, 0xA7, 0xC8, + 0x0F, 0xDF, 0x63, 0xCB, 0xA4, 0xD0, 0x64, 0xD5, 0x21, 0xE0, 0x88, 0xD6, + 0x98, 0xE8, 0xC8, 0xD4, 0x80, 0xD4, 0xF0, 0xE5, 0xA9, 0xC9, 0x3F, 0xE9, + 0xE5, 0xC1, 0x41, 0xDA, 0xCF, 0xC2, 0xF5, 0xD9, 0x0B, 0xD4, 0x1E, 0xE9, + 0x5B, 0xDE, 0x90, 0xF7, 0xE8, 0xE0, 0x49, 0xFA, 0x54, 0xEB, 0x73, 0x00, + 0x36, 0x02, 0x3E, 0xFD, 0x82, 0x0B, 0x42, 0xF5, 0xEF, 0xFE, 0x9B, 0xFC, + 0xC4, 0xF8, 0xB1, 0xEC, 0x1E, 0xEA, 0x88, 0xD2, 0x02, 0xD2, 0xE9, 0xD6, + 0xF7, 0xE0, 0x86, 0xDD, 0x50, 0xFF, 0xEC, 0xD6, 0xFA, 0x10, 0x60, 0xDB, + 0xDC, 0x29, 0xE2, 0xE5, 0x4F, 0x2D, 0x2C, 0xEE, 0xC6, 0x16, 0xBB, 0xFE, + 0x58, 0x0C, 0x87, 0x0A, 0x5F, 0xFC, 0x1D, 0x09, 0xB7, 0xEA, 0x48, 0xFF, + 0x41, 0xF1, 0x33, 0xFF, 0x31, 0x05, 0x74, 0x0F, 0x7D, 0x12, 0xED, 0x19, + 0xBA, 0x1A, 0x77, 0x1D, 0x2A, 0x2B, 0xA6, 0x16, 0x84, 0x31, 0x0A, 0x0C, + 0x07, 0x2A, 0x8C, 0x0D, 0x5C, 0x1D, 0x71, 0x0D, 0x45, 0x10, 0x96, 0x03, + 0x3E, 0x09, 0x3F, 0xFC, 0x4C, 0x04, 0x9E, 0xFB, 0xC4, 0x0F, 0x8A, 0xFC, + 0xFF, 0x1F, 0xAF, 0x09, 0x63, 0x27, 0xC8, 0x1A, 0x85, 0x2E, 0x42, 0x26, + 0x9C, 0x2F, 0x91, 0x28, 0x68, 0x2E, 0x35, 0x26, 0x4B, 0x2F, 0xAB, 0x2B, + 0x7D, 0x25, 0x95, 0x22, 0xD6, 0x13, 0xA8, 0x0A, 0x31, 0x16, 0xAA, 0x01, + 0x90, 0x2B, 0x82, 0x0B, 0xEA, 0x37, 0xCE, 0x19, 0x93, 0x34, 0x69, 0x2A, + 0x88, 0x38, 0xF3, 0x33, 0xFE, 0x46, 0xE1, 0x24, 0xA2, 0x4E, 0x6B, 0x17, + 0x45, 0x45, 0xAD, 0x1F, 0x47, 0x2F, 0xDB, 0x27, 0xBC, 0x1E, 0xAF, 0x22, + 0xD5, 0x19, 0x52, 0x21, 0x42, 0x25, 0xD1, 0x2D, 0xF6, 0x33, 0x47, 0x36, + 0x35, 0x30, 0x8E, 0x38, 0x83, 0x34, 0xA5, 0x3C, 0x8A, 0x3F, 0x97, 0x39, + 0xF5, 0x3B, 0xA2, 0x2A, 0x9D, 0x3A, 0xB0, 0x15, 0x56, 0x3D, 0x04, 0x08, + 0xC0, 0x30, 0xFC, 0x05, 0xE0, 0x14, 0x5E, 0x0F, 0xF1, 0x11, 0x4E, 0x24, + 0xF5, 0x29, 0x1F, 0x2F, 0xA0, 0x3B, 0x74, 0x2F, 0xAF, 0x39, 0xE1, 0x27, + 0x2C, 0x37, 0x59, 0x28, 0x22, 0x38, 0xA5, 0x3E, 0x0D, 0x42, 0x56, 0x45, + 0x5E, 0x4D, 0xBD, 0x39, 0x50, 0x36, 0xE3, 0x33, 0xD1, 0x25, 0x28, 0x31, + 0xE4, 0x35, 0x64, 0x2A, 0xC1, 0x42, 0x9B, 0x2C, 0xA2, 0x3B, 0x19, 0x3B, + 0x00, 0x33, 0x58, 0x39, 0xB3, 0x33, 0x7A, 0x2B, 0xC4, 0x3C, 0x8A, 0x26, + 0x96, 0x49, 0xA9, 0x1C, 0xA7, 0x3F, 0xA9, 0x0E, 0x80, 0x2C, 0x74, 0x06, + 0xD7, 0x2A, 0x88, 0xFD, 0x25, 0x2D, 0x39, 0xF8, 0x53, 0x2D, 0x37, 0x08, + 0x3F, 0x31, 0x51, 0x19, 0x9F, 0x36, 0xBE, 0x1E, 0xC1, 0x2F, 0x83, 0x2B, + 0x43, 0x2B, 0x0B, 0x2C, 0xD4, 0x2B, 0xB5, 0x1D, 0xED, 0x1C, 0x43, 0x13, + 0x29, 0x19, 0x5B, 0x08, 0x28, 0x1B, 0xDD, 0xFE, 0xE6, 0x12, 0xC7, 0xF7, + 0x28, 0x13, 0x1C, 0x00, 0x0F, 0x1D, 0x2C, 0x12, 0x2E, 0x1E, 0x4A, 0x10, + 0xEA, 0x11, 0xBE, 0x0D, 0x23, 0x09, 0xA4, 0x11, 0x56, 0x12, 0xB0, 0x11, + 0x09, 0x1A, 0x86, 0x20, 0xD0, 0x0B, 0xD1, 0x2D, 0xEE, 0xF6, 0x02, 0x22, + 0xD0, 0xF2, 0xE1, 0x16, 0xF9, 0x07, 0x9A, 0x19, 0xFB, 0x1B, 0xEC, 0x14, + 0xDA, 0x1D, 0xD2, 0x10, 0x8C, 0x17, 0x17, 0x1A, 0xE1, 0x16, 0x2C, 0x23, + 0xA9, 0x24, 0xE9, 0x20, 0xC3, 0x30, 0x5B, 0x0D, 0xEB, 0x2B, 0x8F, 0x01, + 0xB4, 0x1A, 0x75, 0x07, 0x37, 0x0B, 0x62, 0x11, 0x70, 0x0F, 0x1F, 0x23, + 0xD6, 0x18, 0x3E, 0x29, 0x93, 0x18, 0x9F, 0x2A, 0x44, 0x18, 0x15, 0x39, + 0x8D, 0x1E, 0x5D, 0x3B, 0x64, 0x2A, 0x4A, 0x30, 0x04, 0x26, 0xC8, 0x30, + 0xE6, 0x20, 0xE9, 0x33, 0x18, 0x24, 0xCB, 0x1E, 0xD7, 0x18, 0xE9, 0x0D, + 0x06, 0x08, 0x6F, 0x10, 0x55, 0x07, 0xAF, 0x19, 0xC4, 0x19, 0x16, 0x25, + 0x91, 0x21, 0xA2, 0x21, 0xB1, 0x1A, 0x42, 0x16, 0x23, 0x13, 0x4A, 0x0F, + 0xED, 0x11, 0x1E, 0x1B, 0x1B, 0x1A, 0xD0, 0x32, 0x91, 0x0E, 0x1C, 0x2C, + 0x7C, 0xEB, 0xEC, 0x19, 0x50, 0xE9, 0x7C, 0x23, 0x61, 0x0A, 0x11, 0x29, + 0x32, 0x0F, 0x57, 0x22, 0x81, 0xFF, 0xF2, 0x1F, 0x8C, 0xFF, 0x2F, 0x1B, + 0x2A, 0x03, 0x79, 0x19, 0x3C, 0x09, 0x2E, 0x21, 0x35, 0x17, 0xAE, 0x26, + 0xD2, 0x16, 0x9C, 0x1F, 0x66, 0xFD, 0x83, 0x15, 0xCB, 0xEE, 0x5E, 0x0C, + 0x08, 0xF2, 0x47, 0x0E, 0xF9, 0xE9, 0x92, 0x1C, 0x39, 0xEA, 0x98, 0x18, + 0x4E, 0xFF, 0x06, 0x14, 0x5C, 0x17, 0x70, 0x1A, 0x15, 0x1C, 0x3B, 0x12, + 0x69, 0x11, 0xC5, 0x0F, 0xCF, 0x0D, 0xFD, 0x15, 0x5D, 0x09, 0xE6, 0x17, + 0x2A, 0xFB, 0x54, 0x12, 0xA1, 0xE9, 0x8F, 0xFE, 0x5C, 0xE3, 0xFC, 0xF2, + 0xA2, 0xE7, 0x9A, 0xFA, 0x72, 0xE7, 0xA4, 0xF8, 0xC6, 0xE4, 0x22, 0xF9, + 0xEE, 0xE9, 0xF4, 0x04, 0xE7, 0xFA, 0x47, 0xFA, 0x85, 0x04, 0xDA, 0xF2, + 0xB7, 0xF3, 0x1A, 0xFC, 0xB7, 0xD5, 0x4D, 0xF9, 0x87, 0xBD, 0xB2, 0xF5, + 0x9C, 0xB1, 0xA7, 0xF6, 0x9B, 0xB6, 0x54, 0xEB, 0x24, 0xC5, 0xD8, 0xE5, + 0xAF, 0xC7, 0xD1, 0xF0, 0x81, 0xCF, 0xAF, 0xF7, 0x89, 0xE7, 0xB7, 0xF5, + 0x4B, 0xF5, 0xE5, 0xF4, 0x4B, 0xEC, 0x0C, 0xF8, 0x45, 0xE2, 0xE9, 0xF0, + 0xBE, 0xDF, 0x1E, 0xDF, 0x5B, 0xC9, 0x50, 0xCF, 0x01, 0xBD, 0x2F, 0xC7, + 0xA5, 0xC7, 0x05, 0xCF, 0xA3, 0xC7, 0x0C, 0xDF, 0xEA, 0xCE, 0x6F, 0xE9, + 0x84, 0xE6, 0xBB, 0xEA, 0xAA, 0xF1, 0xD8, 0xEB, 0xD8, 0xE6, 0x6D, 0xF3, + 0x1A, 0xE6, 0x40, 0xE9, 0xFC, 0xDC, 0x9F, 0xD9, 0x6E, 0xBD, 0xB2, 0xDE, + 0x77, 0xB9, 0xD3, 0xD9, 0xA9, 0xCC, 0xEA, 0xD0, 0xFA, 0xE5, 0xF9, 0xD7, + 0xA7, 0xFE, 0x70, 0xDC, 0x71, 0xF8, 0x95, 0xDA, 0xC6, 0xDE, 0x97, 0xDB, + 0x97, 0xD8, 0xFC, 0xDB, 0x26, 0xDF, 0x86, 0xD0, 0x55, 0xC8, 0x40, 0xCD, + 0x22, 0xA8, 0x87, 0xD4, 0x5C, 0xAA, 0x1D, 0xC5, 0xAE, 0xB4, 0x94, 0xAE, + 0x0D, 0xB8, 0xCA, 0xB3, 0x87, 0xB6, 0x6A, 0xBD, 0xDA, 0xB3, 0xC8, 0xB9, + 0xBF, 0xBC, 0x7A, 0xC5, 0x4E, 0xC7, 0xCD, 0xC8, 0xEF, 0xCC, 0x2F, 0xC3, + 0x85, 0xBC, 0x1D, 0xD4, 0x29, 0xA3, 0x91, 0xCF, 0xC5, 0x9F, 0x7A, 0xBB, + 0x97, 0x9D, 0x6B, 0xBE, 0xEE, 0xA7, 0x09, 0xC8, 0x49, 0xC6, 0xB2, 0xC6, + 0x5B, 0xD9, 0xBC, 0xC9, 0x1C, 0xE0, 0xA4, 0xD1, 0xA9, 0xDE, 0xCE, 0xCA, + 0xB3, 0xCB, 0x92, 0xC3, 0xBA, 0xBA, 0x7B, 0xC3, 0x48, 0xB9, 0x8C, 0xC7, + 0x18, 0xB0, 0xF6, 0xBC, 0x51, 0xB2, 0xA4, 0xB1, 0x59, 0xC9, 0x81, 0xC4, + 0x27, 0xD5, 0x6A, 0xD6, 0x19, 0xD5, 0x48, 0xE2, 0x21, 0xD9, 0x1C, 0xEB, + 0xC3, 0xDE, 0x9C, 0xDE, 0x1A, 0xDB, 0x9D, 0xCE, 0xDE, 0xCF, 0x07, 0xC8, + 0x48, 0xC5, 0xB7, 0xC6, 0x25, 0xBC, 0x9E, 0xCC, 0xC3, 0xB6, 0xE6, 0xD0, + 0xA7, 0xC7, 0xAE, 0xCC, 0x2F, 0xE9, 0xFE, 0xD2, 0x84, 0xF2, 0xA4, 0xE1, + 0x81, 0xE6, 0xBC, 0xED, 0x31, 0xE8, 0x5A, 0xF7, 0xC9, 0xF0, 0x79, 0xF2, + 0x72, 0xEA, 0xCC, 0xEF, 0xFD, 0xD6, 0x44, 0xF5, 0x9D, 0xCD, 0xBD, 0xE9, + 0x38, 0xD7, 0x65, 0xD2, 0xA6, 0xD9, 0xE1, 0xCD, 0x84, 0xDE, 0xEF, 0xDC, + 0xE3, 0xE9, 0xA2, 0xEA, 0x8E, 0xF5, 0xB5, 0xFC, 0x73, 0x14, 0xDE, 0xFF, + 0x20, 0x29, 0x48, 0xF0, 0x7E, 0x18, 0x9F, 0xEE, 0x0B, 0xFF, 0x8D, 0xED, + 0x97, 0xFA, 0x2A, 0xEB, 0x7E, 0x01, 0x28, 0xF7, 0x9B, 0x03, 0x06, 0xFE, + 0xFA, 0xFE, 0xBF, 0xF5, 0x7B, 0x01, 0x6C, 0xF7, 0x14, 0x1C, 0x2D, 0x07, + 0x04, 0x30, 0x05, 0x12, 0xB4, 0x2B, 0x6B, 0x13, 0x4C, 0x2B, 0x96, 0x13, + 0x00, 0x37, 0xC5, 0x11, 0xF3, 0x3C, 0x80, 0x07, 0x2D, 0x31, 0xE0, 0x07, + 0xA0, 0x27, 0x68, 0x15, 0xC1, 0x2A, 0x59, 0x10, 0xFF, 0x2D, 0x1F, 0x04, + 0xDE, 0x2D, 0xB0, 0x0B, 0xAA, 0x2F, 0xE9, 0x18, 0xD1, 0x2D, 0xA9, 0x20, + 0xF7, 0x37, 0xAB, 0x21, 0xDF, 0x45, 0x95, 0x1E, 0x49, 0x30, 0xF8, 0x21, + 0x6B, 0x1A, 0xC3, 0x20, 0xD3, 0x16, 0x24, 0x16, 0xC1, 0x11, 0x47, 0x1A, + 0x74, 0x10, 0x9E, 0x1C, 0xB3, 0x21, 0x60, 0x19, 0xE8, 0x30, 0x03, 0x23, + 0x0C, 0x2F, 0x73, 0x33, 0xEA, 0x2F, 0x84, 0x35, 0x68, 0x2A, 0x95, 0x28, + 0xE6, 0x24, 0xDB, 0x24, 0x2D, 0x2C, 0xE4, 0x25, 0xBE, 0x2F, 0x01, 0x1E, + 0xEC, 0x30, 0x0A, 0x16, 0x97, 0x32, 0xC3, 0x21, 0x5A, 0x33, 0x74, 0x2F, + 0x0B, 0x3B, 0x1F, 0x31, 0x72, 0x42, 0xA5, 0x3C, 0xEF, 0x42, 0x7F, 0x3D, + 0x6C, 0x4D, 0x6A, 0x30, 0x09, 0x5E, 0x28, 0x31, 0x1E, 0x57, 0x5A, 0x2E, + 0x58, 0x40, 0x56, 0x28, 0xB8, 0x35, 0x0A, 0x27, 0xDA, 0x33, 0x0D, 0x27, + 0xD1, 0x31, 0x3E, 0x25, 0x68, 0x33, 0x3B, 0x24, 0x6E, 0x3C, 0x47, 0x30, + 0xFB, 0x4F, 0xB7, 0x37, 0xEA, 0x54, 0xEC, 0x39, 0x41, 0x44, 0xDC, 0x40, + 0x06, 0x3A, 0x5F, 0x3A, 0x70, 0x34, 0x95, 0x2D, 0x92, 0x2E, 0xAF, 0x22, + 0xC5, 0x2D, 0xAD, 0x10, 0x21, 0x34, 0x89, 0x0C, 0x8E, 0x33, 0x9E, 0x19, + 0xBD, 0x27, 0x04, 0x28, 0x4F, 0x26, 0x99, 0x2B, 0x2D, 0x2E, 0x51, 0x18, + 0x0D, 0x29, 0x7D, 0x0F, 0x7B, 0x20, 0x0F, 0x17, 0x56, 0x26, 0xCA, 0x10, + 0x1D, 0x21, 0x7E, 0x0F, 0x9E, 0x17, 0x2E, 0x18, 0xB8, 0x1A, 0xF5, 0x13, + 0xD8, 0x1B, 0x9D, 0x0F, 0x18, 0x24, 0x3F, 0x15, 0x83, 0x2E, 0x8A, 0x16, + 0x93, 0x28, 0xEC, 0x0D, 0xAE, 0x21, 0x13, 0x04, 0xCF, 0x26, 0x7D, 0x05, + 0x35, 0x1F, 0x85, 0x09, 0xF0, 0x0A, 0x58, 0xFF, 0x0D, 0x09, 0x13, 0xFE, + 0xED, 0x11, 0xE2, 0x07, 0x56, 0x1B, 0x62, 0x0D, 0x44, 0x23, 0xB8, 0x16, + 0xB9, 0x20, 0x3E, 0x1A, 0x21, 0x24, 0xFB, 0x1D, 0x1D, 0x2C, 0x1E, 0x1B, + 0xAD, 0x2C, 0x97, 0x10, 0x5F, 0x22, 0x5C, 0x13, 0x95, 0x12, 0x18, 0x16, + 0x4C, 0x16, 0x7E, 0x19, 0x96, 0x22, 0x93, 0x20, 0x1E, 0x25, 0xB7, 0x1D, + 0x5F, 0x27, 0x3D, 0x14, 0xC5, 0x24, 0x2C, 0x0E, 0xEF, 0x0F, 0xB1, 0x14, + 0xC2, 0xF8, 0x6B, 0x19, 0x2F, 0xF7, 0x7B, 0x0C, 0x98, 0xF9, 0xCA, 0x05, + 0x82, 0xF7, 0x91, 0x11, 0x36, 0xFA, 0x85, 0x11, 0x2D, 0xF6, 0x31, 0x03, + 0x8E, 0xF5, 0x5F, 0x0C, 0x10, 0xFD, 0x64, 0x1B, 0x5C, 0xFC, 0xD9, 0x14, + 0xB2, 0xFA, 0x06, 0x0C, 0x29, 0x07, 0x4A, 0x05, 0x66, 0x18, 0xCE, 0x05, + 0x99, 0x1B, 0xCA, 0x16, 0x5B, 0x0F, 0x20, 0x28, 0xE2, 0xFE, 0x6B, 0x28, + 0xD2, 0xF7, 0xAC, 0x1E, 0xEB, 0xF5, 0xB2, 0x1A, 0x67, 0xFF, 0x7E, 0x12, + 0xA8, 0x0B, 0xB1, 0x03, 0x79, 0x0A, 0xCF, 0xF4, 0x85, 0x17, 0x50, 0xEC, + 0x5A, 0x21, 0xF6, 0xF4, 0xA3, 0x13, 0x70, 0x00, 0x33, 0x09, 0xF0, 0x07, + 0x29, 0x06, 0x4E, 0x0F, 0x2E, 0x14, 0xFF, 0x15, 0xF4, 0x2A, 0xF6, 0x15, + 0x23, 0x2A, 0xE1, 0x0B, 0x25, 0x1D, 0x15, 0x09, 0x99, 0x0F, 0xFA, 0x03, + 0xE7, 0x01, 0xF5, 0xF9, 0xF8, 0xFC, 0x49, 0xF9, 0xF2, 0xF8, 0x14, 0x04, + 0x4A, 0xF2, 0x59, 0x10, 0x86, 0xF7, 0xA7, 0x0A, 0x55, 0xFE, 0xB8, 0x0A, + 0xC9, 0x04, 0xF3, 0x0D, 0xF5, 0x0E, 0x8E, 0xFF, 0x85, 0x01, 0x4F, 0xFC, + 0x92, 0xEB, 0xBC, 0x03, 0x36, 0xEA, 0x06, 0x0C, 0xD8, 0xF4, 0xFF, 0x10, + 0xAA, 0xFD, 0x40, 0x0A, 0xC4, 0x02, 0xBE, 0xFF, 0x21, 0x03, 0x58, 0xF7, + 0x27, 0xFB, 0x2A, 0xFF, 0x05, 0xF8, 0xE6, 0x09, 0xD8, 0xFB, 0x09, 0x01, + 0x0D, 0xF3, 0x1A, 0xFC, 0x57, 0xE8, 0xC5, 0xF9, 0xC1, 0xEA, 0xE8, 0xED, + 0x06, 0xE9, 0x84, 0xEF, 0x90, 0xE4, 0xA2, 0xF0, 0x06, 0xEE, 0xDE, 0xEC, + 0xCB, 0xF0, 0x9D, 0xFF, 0xC9, 0xEB, 0xE7, 0x15, 0x23, 0xF9, 0x84, 0x1F, + 0xDD, 0x0E, 0x7C, 0x17, 0x65, 0x0C, 0x84, 0x06, 0x7B, 0xF1, 0xAA, 0x03, + 0x2D, 0xE4, 0xF2, 0xFB, 0x7B, 0xE5, 0xFE, 0xF3, 0xA0, 0xE2, 0xE6, 0x00, + 0x6E, 0xE2, 0xD8, 0x08, 0xEB, 0xEC, 0xB5, 0x04, 0x50, 0xF2, 0xCF, 0x04, + 0xC3, 0xE9, 0xF9, 0xFE, 0xE0, 0xDA, 0xFC, 0xF6, 0x1E, 0xC5, 0xA3, 0xF3, + 0x24, 0xBC, 0x85, 0xE4, 0x4A, 0xCA, 0x93, 0xDC, 0xE5, 0xD7, 0x1B, 0xE3, + 0xC9, 0xD9, 0x36, 0xE4, 0x78, 0xD2, 0x9B, 0xE0, 0xCD, 0xCB, 0xA3, 0xDC, + 0x0C, 0xCB, 0x15, 0xEA, 0x84, 0xD0, 0x95, 0x00, 0xE8, 0xDD, 0xE0, 0xFC, + 0xB7, 0xE4, 0x7B, 0xEB, 0x92, 0xDF, 0xDE, 0xE4, 0x66, 0xD9, 0x07, 0xE9, + 0x3E, 0xD1, 0x0C, 0xE9, 0x57, 0xCE, 0x01, 0xE4, 0xA7, 0xD8, 0xB5, 0xDF, + 0x6D, 0xE5, 0x2B, 0xDD, 0xA0, 0xE9, 0xD2, 0xE8, 0xEE, 0xD9, 0x75, 0xF2, + 0x7C, 0xCE, 0x7A, 0xE9, 0x45, 0xD8, 0x6D, 0xE1, 0xAF, 0xE2, 0x6C, 0xE1, + 0x8C, 0xDF, 0x91, 0xE0, 0x76, 0xD3, 0x16, 0xE5, 0x70, 0xD8, 0x0E, 0xEA, + 0xA7, 0xE6, 0x05, 0xDF, 0x70, 0xDD, 0x4C, 0xDE, 0xC9, 0xD0, 0x84, 0xF3, + 0x7A, 0xDB, 0x36, 0xF6, 0xCF, 0xE1, 0xF5, 0xE2, 0x4E, 0xDA, 0xEE, 0xD9, + 0x7F, 0xDF, 0xDE, 0xD9, 0xF3, 0xE1, 0x96, 0xD3, 0x66, 0xDA, 0x9A, 0xDF, + 0xD6, 0xE4, 0xBF, 0xFB, 0xFF, 0xED, 0x85, 0xF9, 0x94, 0xE0, 0x3B, 0xE5, + 0xA8, 0xDA, 0xC0, 0xE2, 0x07, 0xE9, 0xC8, 0xED, 0x80, 0xE0, 0x40, 0xFD, + 0x96, 0xC5, 0xFF, 0x08, 0x47, 0xCC, 0xAF, 0x03, 0xEF, 0xDE, 0xCA, 0xFF, + 0x48, 0xEE, 0xF8, 0xFE, 0x3D, 0xFF, 0xFD, 0xF6, 0x61, 0xF5, 0x34, 0xFB, + 0x06, 0xE7, 0xEC, 0xF9, 0x48, 0xED, 0x07, 0xED, 0xBF, 0xE9, 0x88, 0xF6, + 0x87, 0xD5, 0xAC, 0x05, 0x1E, 0xD2, 0x63, 0x02, 0xFC, 0xE5, 0x84, 0x01, + 0x42, 0xF9, 0x23, 0x04, 0xCA, 0x05, 0xD4, 0xFD, 0x2A, 0x02, 0x6F, 0xF9, + 0x77, 0xF2, 0xFE, 0x02, 0xB1, 0xF3, 0xA1, 0x14, 0x95, 0x07, 0x48, 0x0D, + 0x79, 0x0B, 0x7C, 0xFC, 0xB4, 0x02, 0x50, 0xFD, 0xAD, 0x02, 0x14, 0xF0, + 0x79, 0xFB, 0x63, 0xE3, 0x7B, 0xF4, 0xEB, 0xEB, 0x57, 0xFA, 0xCA, 0xF8, + 0x4D, 0x0D, 0x0C, 0xFA, 0xCF, 0x1C, 0x95, 0xF4, 0x3A, 0x0F, 0x61, 0xF7, + 0x3C, 0xF5, 0x92, 0xF8, 0x4A, 0xE7, 0x0C, 0x00, 0xE1, 0xED, 0x7F, 0x04, + 0x76, 0x00, 0x01, 0xFF, 0xBD, 0x09, 0x72, 0x03, 0x8E, 0x08, 0xCD, 0x05, + 0x32, 0x08, 0x22, 0x07, 0xD1, 0x03, 0x0D, 0x0F, 0xEF, 0xF7, 0x58, 0x0F, + 0xDB, 0xF9, 0x1E, 0x0C, 0x15, 0x0C, 0x6E, 0x10, 0x79, 0x19, 0xDD, 0x0B, + 0x8C, 0x13, 0x4A, 0xFC, 0xB1, 0xFF, 0xB0, 0xF8, 0x09, 0xF7, 0xE2, 0xF9, + 0xB2, 0xFE, 0x3C, 0x00, 0x5E, 0x08, 0x1C, 0x05, 0x8B, 0x10, 0x36, 0xF8, + 0xC1, 0x10, 0xC6, 0xF3, 0x2B, 0x0F, 0xF1, 0xFE, 0x1B, 0x19, 0x5C, 0xFF, + 0x36, 0x10, 0x1D, 0xF5, 0x66, 0xEE, 0x52, 0xF1, 0x96, 0xDF, 0x03, 0xF6, + 0x88, 0xF1, 0xE4, 0xF6, 0x76, 0x0D, 0x29, 0xED, 0x28, 0x1A, 0x99, 0xE4, + 0xAE, 0x10, 0xD0, 0xDC, 0x2E, 0xF7, 0x9F, 0xDB, 0xE2, 0xE6, 0x3B, 0xEA, + 0x77, 0xF2, 0x3A, 0xE9, 0xB9, 0xFE, 0x53, 0xDB, 0x19, 0xF8, 0xC5, 0xDB, + 0x1F, 0xF5, 0xA6, 0xD9, 0xDA, 0xF1, 0x60, 0xDF, 0x66, 0xE0, 0xE9, 0xF5, + 0xB3, 0xE4, 0xC1, 0xF9, 0x5F, 0xF8, 0x83, 0xE9, 0x90, 0xF8, 0x07, 0xE2, + 0x75, 0xF8, 0x11, 0xDE, 0x4F, 0xF2, 0x7B, 0xDE, 0xBC, 0xD4, 0xFC, 0xE8, + 0x1F, 0xC4, 0x17, 0xE5, 0xA9, 0xD1, 0x69, 0xD3, 0x1C, 0xDB, 0x93, 0xCA, + 0x66, 0xDF, 0xBA, 0xCE, 0x1E, 0xF6, 0x68, 0xD1, 0xC8, 0x01, 0x4C, 0xCA, + 0xB4, 0xEF, 0x5C, 0xC5, 0xBD, 0xDF, 0xDA, 0xC0, 0x1C, 0xE1, 0x1C, 0xBD, + 0x39, 0xE5, 0x27, 0xC9, 0x40, 0xE8, 0x81, 0xD0, 0x9B, 0xE7, 0xAE, 0xBC, + 0xCC, 0xDB, 0x32, 0xB1, 0xE8, 0xDD, 0x65, 0xC8, 0xEF, 0xE7, 0xB3, 0xDF, + 0x73, 0xE1, 0x0E, 0xE6, 0x2C, 0xDA, 0xD1, 0xE2, 0xA8, 0xDB, 0xE7, 0xD4, + 0x15, 0xDE, 0xF9, 0xCE, 0xDD, 0xD7, 0xB7, 0xD6, 0x2B, 0xDB, 0xA1, 0xD1, + 0x54, 0xE3, 0xAA, 0xCB, 0x47, 0xE6, 0x9A, 0xD6, 0xDC, 0xFD, 0x66, 0xDD, + 0x49, 0x0A, 0xA1, 0xE2, 0x47, 0xFF, 0xA9, 0xE8, 0x14, 0xF3, 0x7B, 0xDE, + 0x1A, 0xDE, 0xEA, 0xD1, 0x98, 0xCE, 0x1C, 0xD3, 0x45, 0xD0, 0xE1, 0xDA, + 0x5E, 0xD6, 0xE3, 0xE3, 0x13, 0xDB, 0x17, 0xEE, 0xB1, 0xE2, 0x54, 0xFB, + 0xAD, 0xE4, 0x60, 0x05, 0x54, 0xE8, 0x6D, 0x03, 0x2A, 0xF6, 0xB2, 0xFE, + 0x0C, 0xFE, 0x8A, 0xF7, 0xF1, 0xFB, 0x58, 0xEA, 0x2B, 0xF7, 0x50, 0xE9, + 0xC1, 0xF9, 0xD8, 0xEB, 0x8F, 0xF9, 0x80, 0xE7, 0x71, 0xF4, 0x70, 0xF0, + 0xB7, 0xF1, 0xD7, 0x00, 0x3E, 0xF6, 0x73, 0x0C, 0x0B, 0x0D, 0x76, 0x18, + 0xCB, 0x1E, 0xF4, 0x1B, 0xCD, 0x22, 0xE5, 0x0C, 0x41, 0x1F, 0x13, 0xFD, + 0x35, 0x0C, 0x4F, 0xFE, 0xB9, 0xF9, 0x3A, 0x02, 0xEE, 0xFA, 0x53, 0xFD, + 0xA1, 0x0E, 0xA8, 0xFC, 0x07, 0x1C, 0x1B, 0x08, 0x87, 0x28, 0xF7, 0x0C, + 0xAE, 0x34, 0x5F, 0x0D, 0x64, 0x2C, 0xAD, 0x15, 0x0A, 0x2E, 0xD8, 0x0D, + 0x68, 0x34, 0x2F, 0xFE, 0x59, 0x24, 0xB7, 0xFE, 0x29, 0x19, 0x0B, 0x03, + 0xA0, 0x1E, 0xBE, 0x04, 0x27, 0x15, 0x30, 0x07, 0x87, 0x02, 0xC3, 0x06, + 0x2F, 0x0F, 0x93, 0x00, 0x45, 0x22, 0xF2, 0x05, 0x07, 0x24, 0x4C, 0x11, + 0xA4, 0x26, 0xED, 0x11, 0x98, 0x22, 0x87, 0x0F, 0xFD, 0x1A, 0xF0, 0x0C, + 0xE1, 0x13, 0xA2, 0x0F, 0xE4, 0x0A, 0xFA, 0x15, 0x26, 0x0F, 0x37, 0x1C, + 0x8B, 0x20, 0xCA, 0x21, 0x2B, 0x26, 0x1B, 0x23, 0xE9, 0x1F, 0xD9, 0x27, + 0x8A, 0x21, 0x7A, 0x36, 0x83, 0x27, 0x1C, 0x3B, 0x79, 0x2A, 0xF9, 0x2B, + 0x99, 0x23, 0x1B, 0x22, 0x7D, 0x1C, 0x02, 0x1F, 0x5B, 0x1C, 0x83, 0x1C, + 0x37, 0x14, 0xE7, 0x25, 0x2C, 0x12, 0x46, 0x30, 0x10, 0x20, 0x8B, 0x33, + 0x73, 0x2F, 0x85, 0x39, 0xB0, 0x3F, 0x07, 0x40, 0x40, 0x41, 0x13, 0x3E, + 0x23, 0x34, 0x36, 0x38, 0x95, 0x34, 0x28, 0x34, 0x63, 0x38, 0xC9, 0x3C, + 0xCB, 0x33, 0x66, 0x44, 0x97, 0x31, 0xCE, 0x38, 0x87, 0x2D, 0x59, 0x34, + 0xBC, 0x27, 0x86, 0x31, 0x9A, 0x22, 0x56, 0x2F, 0xB0, 0x21, 0xF1, 0x38, + 0xCB, 0x2B, 0xB0, 0x37, 0x53, 0x34, 0x11, 0x38, 0xC3, 0x32, 0xBF, 0x40, + 0x23, 0x2A, 0xD1, 0x3A, 0x28, 0x14, 0x55, 0x35, 0xC0, 0xFE, 0xE1, 0x3A, + 0x9D, 0x07, 0xC5, 0x3A, 0xBA, 0x1C, 0x54, 0x38, 0x8F, 0x22, 0x14, 0x3E, + 0xD1, 0x1F, 0xDA, 0x45, 0x67, 0x1E, 0xE4, 0x46, 0x11, 0x24, 0x49, 0x3E, + 0xF3, 0x33, 0x19, 0x36, 0xC6, 0x3D, 0x06, 0x2E, 0xAC, 0x35, 0xFD, 0x29, + 0x0F, 0x2F, 0x92, 0x30, 0x06, 0x33, 0xD8, 0x28, 0xD4, 0x33, 0x50, 0x1A, + 0xAA, 0x2C, 0x4D, 0x17, 0x8E, 0x26, 0xD5, 0x16, 0x63, 0x2D, 0x82, 0x1A, + 0x47, 0x30, 0xA0, 0x1F, 0xA5, 0x28, 0xDC, 0x1D, 0x5E, 0x29, 0xCD, 0x20, + 0x4D, 0x29, 0x7E, 0x33, 0x38, 0x29, 0x5E, 0x3C, 0xF0, 0x28, 0xD8, 0x36, + 0xEE, 0x20, 0x70, 0x35, 0x1D, 0x26, 0x52, 0x29, 0xE6, 0x2B, 0x88, 0x17, + 0x65, 0x17, 0x8F, 0x14, 0x9B, 0x04, 0x6B, 0x18, 0xC6, 0x0B, 0x3E, 0x0E, + 0xF1, 0x18, 0xFA, 0x02, 0xBC, 0x19, 0x16, 0x08, 0x9E, 0x07, 0x8A, 0x05, + 0x12, 0xEE, 0x21, 0xFE, 0x95, 0xEA, 0x34, 0x0A, 0x0F, 0xF7, 0xAF, 0x18, + 0x00, 0x01, 0xF0, 0x0C, 0x07, 0x00, 0x95, 0xFF, 0xB4, 0xF6, 0xC3, 0x0A, + 0xB9, 0xFE, 0x1C, 0x1C, 0x9D, 0x15, 0x84, 0x23, 0x08, 0x1C, 0xF4, 0x19, + 0xBD, 0x0F, 0x04, 0x0F, 0x41, 0x01, 0xCD, 0x11, 0x8D, 0xF4, 0x29, 0x18, + 0x47, 0xEE, 0xF4, 0x13, 0x72, 0xE6, 0xF3, 0x0E, 0xF1, 0xE0, 0x07, 0x12, + 0xE8, 0xF4, 0x92, 0x05, 0xC4, 0x07, 0x07, 0xFB, 0xF8, 0x06, 0xA1, 0x0A, + 0x92, 0x09, 0x52, 0x1E, 0x96, 0x11, 0x03, 0x2B, 0x38, 0x0F, 0xB4, 0x31, + 0x55, 0xFC, 0x9A, 0x29, 0x61, 0xEF, 0xF1, 0x15, 0x0A, 0xF8, 0x7C, 0x0B, + 0xA0, 0x05, 0xAF, 0x09, 0x52, 0x0D, 0x76, 0x08, 0x61, 0x11, 0xE2, 0x06, + 0x88, 0x15, 0xF0, 0x09, 0x71, 0x1E, 0xD0, 0x13, 0xA9, 0x1E, 0xC4, 0x10, + 0x6B, 0x0C, 0x55, 0x06, 0x85, 0xFA, 0xDC, 0x02, 0xE3, 0xF6, 0xB6, 0x0E, + 0xE1, 0xFF, 0x57, 0x21, 0x58, 0x07, 0xDF, 0x1A, 0x2A, 0xF8, 0x26, 0x11, + 0x62, 0xE7, 0x0B, 0x14, 0xF8, 0xF5, 0xF1, 0x11, 0xA4, 0x04, 0x8C, 0x08, + 0x4A, 0xFF, 0xF9, 0xF3, 0xD1, 0xFB, 0xB5, 0xE9, 0xF7, 0xFE, 0x07, 0xF6, + 0x76, 0x08, 0xEB, 0xFB, 0xC9, 0x07, 0xD6, 0xF7, 0xE5, 0xF8, 0x81, 0xFD, + 0x43, 0xF0, 0x80, 0x04, 0x70, 0xF7, 0x08, 0x09, 0x9A, 0x04, 0xB5, 0x0D, + 0x98, 0x0A, 0xDF, 0x01, 0x6C, 0x10, 0x3E, 0xEF, 0x2A, 0x06, 0xF0, 0xEF, + 0x55, 0xF1, 0x82, 0xFE, 0x68, 0xF4, 0x39, 0xFE, 0x8A, 0xFD, 0x4A, 0xF5, + 0x93, 0xFC, 0x4D, 0xFE, 0xC0, 0x01, 0x11, 0x03, 0x88, 0x0A, 0xF7, 0xFC, + 0x41, 0x05, 0xEA, 0x07, 0x6B, 0xFB, 0x31, 0x16, 0xA6, 0xFA, 0x45, 0x0B, + 0xA7, 0xF9, 0x3F, 0x01, 0xED, 0xF7, 0xC8, 0x07, 0x73, 0xEF, 0xE3, 0x02, + 0x8B, 0xDF, 0x35, 0xFC, 0x68, 0xDD, 0x62, 0x05, 0x31, 0xE5, 0xD4, 0xFD, + 0x6A, 0xE0, 0x69, 0xE4, 0x5F, 0xD7, 0x84, 0xDF, 0xC0, 0xDE, 0xCC, 0xE4, + 0x16, 0xE2, 0x5A, 0xE2, 0x2E, 0xD9, 0xBF, 0xDD, 0x15, 0xD7, 0xB5, 0xD7, + 0xA4, 0xD7, 0x02, 0xDA, 0xD2, 0xDB, 0x4F, 0xEB, 0x8F, 0xE2, 0x8C, 0xF9, + 0x69, 0xDF, 0xFA, 0xF1, 0x83, 0xCD, 0xC1, 0xE7, 0x24, 0xC8, 0x12, 0xE8, + 0x5F, 0xD7, 0x21, 0xE6, 0xFB, 0xD5, 0x0B, 0xE3, 0x8A, 0xD5, 0x7C, 0xDB, + 0x17, 0xDD, 0xB0, 0xD5, 0xFB, 0xD8, 0x74, 0xD2, 0x48, 0xD5, 0x4D, 0xCF, + 0x3E, 0xD8, 0x19, 0xD3, 0xD3, 0xDA, 0xAD, 0xD1, 0x30, 0xD9, 0xED, 0xD3, + 0x91, 0xE2, 0x94, 0xDA, 0x39, 0xE7, 0x9E, 0xD6, 0x30, 0xDE, 0x4D, 0xDC, + 0x64, 0xD5, 0x91, 0xE1, 0x36, 0xCA, 0xF6, 0xD0, 0x91, 0xC4, 0x7E, 0xC4, + 0x36, 0xC4, 0xCC, 0xC1, 0x36, 0xD0, 0xBE, 0xBF, 0x62, 0xE9, 0x83, 0xC3, + 0x87, 0xF9, 0x85, 0xC1, 0x89, 0xF2, 0x74, 0xBB, 0x5D, 0xDE, 0x02, 0xBD, + 0xF3, 0xD2, 0xBC, 0xB8, 0x41, 0xCE, 0x51, 0xB2, 0x29, 0xCA, 0x4D, 0xB0, + 0xFF, 0xC3, 0xCC, 0xB6, 0xF9, 0xBC, 0x83, 0xC9, 0xE2, 0xBB, 0xCD, 0xCD, + 0x43, 0xC5, 0xD3, 0xCA, 0x63, 0xC4, 0xD3, 0xD8, 0xFE, 0xAB, 0xD3, 0xD9, + 0x47, 0xA6, 0x08, 0xC6, 0xEF, 0xBB, 0xB6, 0xBB, 0xEC, 0xCA, 0xCB, 0xBA, + 0x67, 0xCF, 0x87, 0xB9, 0x3B, 0xC7, 0x86, 0xBE, 0x60, 0xB2, 0x1F, 0xC9, + 0x83, 0xAF, 0x5C, 0xCF, 0xA9, 0xC2, 0xE4, 0xD1, 0x08, 0xD4, 0x78, 0xDC, + 0xA5, 0xE1, 0xE5, 0xE1, 0xAA, 0xE3, 0x9B, 0xDA, 0xE6, 0xE1, 0x1B, 0xDD, + 0x93, 0xEF, 0x65, 0xE6, 0xB3, 0xF6, 0x96, 0xE5, 0x53, 0xF0, 0x3E, 0xE0, + 0x85, 0xF3, 0xE7, 0xEC, 0xD5, 0xFD, 0x69, 0xFB, 0x0C, 0x07, 0xF8, 0xFB, + 0x5A, 0x0B, 0x61, 0x01, 0x4E, 0x0B, 0x9A, 0xFB, 0x59, 0x06, 0x21, 0xEC, + 0x15, 0xF3, 0x39, 0xE8, 0x3C, 0xEC, 0x00, 0xEA, 0x78, 0xFC, 0xCB, 0xEA, + 0xD8, 0x05, 0x23, 0xF0, 0xF9, 0xFF, 0x1F, 0xFA, 0x1F, 0xF5, 0xA0, 0x00, + 0xDA, 0xF1, 0x8F, 0x0F, 0x92, 0xFF, 0xFD, 0x1B, 0x76, 0x10, 0x0F, 0x14, + 0x46, 0x04, 0x82, 0x01, 0xD8, 0xEC, 0xF7, 0xF7, 0xA2, 0xF1, 0x8B, 0xFE, + 0xEA, 0x03, 0x75, 0x01, 0x78, 0x0D, 0xDB, 0x01, 0xB8, 0x0F, 0x39, 0x03, + 0x0C, 0x11, 0x96, 0xFA, 0x0E, 0x12, 0x73, 0xF9, 0x79, 0x0F, 0x4D, 0x07, + 0x13, 0x0F, 0x14, 0x09, 0xA7, 0x0D, 0x6E, 0x00, 0x9D, 0x08, 0x89, 0xFC, + 0xF0, 0x0B, 0xD6, 0xF2, 0x74, 0x0B, 0x82, 0xF2, 0x75, 0x08, 0x17, 0x07, + 0x83, 0x0C, 0x43, 0x15, 0x64, 0x0E, 0xFE, 0x19, 0x8B, 0x16, 0xFD, 0x1E, + 0xC5, 0x1F, 0x10, 0x21, 0xAC, 0x21, 0x80, 0x1D, 0x6F, 0x1B, 0x2A, 0x0F, + 0x29, 0x10, 0x2E, 0x08, 0x64, 0x09, 0x47, 0x0F, 0x66, 0x0F, 0x62, 0x0F, + 0x06, 0x1C, 0x73, 0x17, 0x0D, 0x1D, 0xE6, 0x20, 0x78, 0x1C, 0xCD, 0x20, + 0xBC, 0x22, 0x9B, 0x2D, 0x03, 0x2D, 0x79, 0x32, 0x69, 0x33, 0x8B, 0x23, + 0xDC, 0x32, 0xE7, 0x19, 0xBB, 0x29, 0xBF, 0x18, 0x59, 0x1A, 0x32, 0x1A, + 0xEF, 0x18, 0xA7, 0x1D, 0x90, 0x1C, 0x15, 0x21, 0x9B, 0x17, 0xF6, 0x1C, + 0x3A, 0x08, 0x87, 0x1A, 0x57, 0xFA, 0x34, 0x1E, 0x4D, 0x07, 0x9C, 0x14, + 0x4B, 0x1C, 0x39, 0x0E, 0xCB, 0x1D, 0x92, 0x11, 0xBA, 0x1A, 0xDE, 0x0C, + 0xDA, 0x1B, 0x1E, 0x05, 0xE0, 0x11, 0x70, 0x03, 0x23, 0x0A, 0x46, 0x03, + 0x5D, 0x0C, 0x10, 0xFE, 0xB9, 0x07, 0xB2, 0xFB, 0xB6, 0x07, 0xD7, 0x04, + 0xD4, 0x15, 0x70, 0x0F, 0x40, 0x23, 0x29, 0x0B, 0xEC, 0x25, 0xAA, 0xFD, + 0x8A, 0x1B, 0x0E, 0xF4, 0x25, 0x0C, 0x15, 0xF0, 0x39, 0x00, 0x17, 0xFB, + 0x94, 0xFB, 0x92, 0x02, 0xFD, 0x00, 0xB6, 0xFD, 0x7F, 0xFD, 0xCC, 0xFD, + 0x9C, 0xF4, 0x4F, 0xF0, 0xBD, 0xF6, 0x16, 0xE9, 0x82, 0xF7, 0x5E, 0x00, + 0x4E, 0xFA, 0x1C, 0x0A, 0xF8, 0x05, 0x1C, 0xF8, 0x5F, 0x07, 0x87, 0xE4, + 0xE2, 0xF9, 0x68, 0xDB, 0x99, 0xF2, 0x6B, 0xD8, 0xD9, 0xEA, 0x8B, 0xD7, + 0x8A, 0xD8, 0xA4, 0xDA, 0x1A, 0xD7, 0x9A, 0xDD, 0xAA, 0xE6, 0x5C, 0xDF, + 0xAB, 0xEE, 0xA1, 0xE6, 0x8F, 0xEC, 0x91, 0xF0, 0xA4, 0xE4, 0xB4, 0xE4, + 0x18, 0xE0, 0xC1, 0xD7, 0xA6, 0xE8, 0x27, 0xDF, 0x91, 0xF0, 0x55, 0xDA, + 0x90, 0xE8, 0xB3, 0xCF, 0x0F, 0xE5, 0x60, 0xD9, 0x85, 0xEE, 0x85, 0xED, + 0xA7, 0xED, 0xB2, 0xF4, 0x45, 0xE3, 0x38, 0xF1, 0xE2, 0xDC, 0xC2, 0xED, + 0xE3, 0xD9, 0x05, 0xE9, 0x89, 0xDD, 0x9E, 0xE3, 0x93, 0xE4, 0xE8, 0xE6, + 0x4D, 0xE8, 0x9A, 0xF7, 0x00, 0xF4, 0x70, 0x04, 0x19, 0xFD, 0xC1, 0x0A, + 0xAE, 0xF1, 0xCF, 0x09, 0x78, 0xE6, 0xC6, 0x00, 0x92, 0xEE, 0x4D, 0x06, + 0x0B, 0x08, 0xF3, 0x0F, 0x80, 0x1C, 0x30, 0x08, 0x9B, 0x1C, 0xDB, 0xFE, + 0x4F, 0x10, 0x21, 0xFE, 0xA0, 0x0B, 0x50, 0xFA, 0x61, 0x16, 0xA0, 0xFB, + 0x44, 0x1A, 0xAF, 0x05, 0xEA, 0x1D, 0x2A, 0x01, 0x57, 0x29, 0xE0, 0xFD, + 0x07, 0x28, 0x79, 0x15, 0xFF, 0x22, 0x82, 0x25, 0xE7, 0x1C, 0x60, 0x1E, + 0xAD, 0x13, 0xCD, 0x1C, 0xA1, 0x14, 0x8F, 0x1D, 0x10, 0x14, 0xE4, 0x1A, + 0xE3, 0x0F, 0x57, 0x1D, 0xF3, 0x12, 0x4A, 0x1C, 0x71, 0x1A, 0x93, 0x18, + 0xB2, 0x23, 0x43, 0x1A, 0x04, 0x27, 0x58, 0x27, 0x21, 0x24, 0x15, 0x32, + 0xCD, 0x1D, 0xCE, 0x22, 0x59, 0x17, 0x2E, 0x1A, 0x0E, 0x22, 0xA1, 0x25, + 0x57, 0x34, 0x21, 0x25, 0x7E, 0x2C, 0xE8, 0x25, 0x3E, 0x1C, 0x1B, 0x28, + 0xF0, 0x23, 0xE0, 0x1E, 0x65, 0x31, 0x20, 0x17, 0x1E, 0x39, 0xAE, 0x0F, + 0x24, 0x35, 0xCE, 0x07, 0xBC, 0x22, 0xB3, 0x0B, 0x96, 0x20, 0xF6, 0x1D, + 0x6A, 0x34, 0xF2, 0x2C, 0xFD, 0x3F, 0x3D, 0x2A, 0x89, 0x3B, 0xCB, 0x20, + 0x8D, 0x33, 0x80, 0x21, 0x69, 0x2E, 0x10, 0x30, 0x42, 0x2C, 0x4C, 0x43, + 0xA9, 0x29, 0x1C, 0x4A, 0x53, 0x2C, 0x77, 0x42, 0x76, 0x36, 0xCB, 0x41, + 0x59, 0x3D, 0xA5, 0x45, 0x4E, 0x38, 0x61, 0x3A, 0xE8, 0x28, 0xD9, 0x2E, + 0xAD, 0x20, 0x25, 0x2C, 0x84, 0x22, 0xB9, 0x28, 0x72, 0x20, 0x87, 0x2A, + 0x2C, 0x21, 0x7E, 0x32, 0x55, 0x2A, 0xC5, 0x39, 0x5F, 0x2D, 0xA7, 0x3F, + 0xEB, 0x27, 0x42, 0x47, 0x41, 0x27, 0x11, 0x4C, 0xB2, 0x2B, 0x04, 0x4B, + 0xB3, 0x38, 0xD7, 0x48, 0x0D, 0x54, 0x84, 0x45, 0x64, 0x5E, 0x96, 0x3F, + 0x13, 0x49, 0x2B, 0x3B, 0xF9, 0x30, 0xC5, 0x40, 0xF2, 0x25, 0xA1, 0x48, + 0xC5, 0x22, 0xCF, 0x42, 0x8B, 0x22, 0xA5, 0x3C, 0x6E, 0x28, 0x12, 0x3F, + 0x32, 0x37, 0x20, 0x3B, 0x08, 0x43, 0x79, 0x3B, 0x4F, 0x3C, 0x3E, 0x4E, + 0x98, 0x26, 0x0F, 0x57, 0x5F, 0x12, 0x4F, 0x46, 0x58, 0x0F, 0x3C, 0x37, + 0xEF, 0x21, 0xE1, 0x37, 0xF4, 0x2F, 0x6F, 0x3D, 0x47, 0x27, 0x05, 0x3B, + 0x1E, 0x1F, 0xC4, 0x33, 0x20, 0x29, 0xB7, 0x31, 0x28, 0x36, 0x29, 0x2E, + 0xEF, 0x3B, 0xFF, 0x24, 0x3F, 0x38, 0x37, 0x1B, 0x6B, 0x2B, 0x9F, 0x14, + 0xE9, 0x24, 0x26, 0x19, 0x6D, 0x1C, 0xAB, 0x1C, 0xC2, 0x0C, 0x5A, 0x11, + 0xDF, 0xFC, 0x49, 0x0E, 0x73, 0xF4, 0x5F, 0x1A, 0x2B, 0x03, 0x1C, 0x19, + 0x76, 0x12, 0xDA, 0x13, 0x82, 0x16, 0xAE, 0x17, 0x5A, 0x1D, 0x9E, 0x17, + 0x08, 0x1D, 0x1B, 0x1F, 0x7D, 0x0E, 0xA0, 0x25, 0x9A, 0x03, 0x4B, 0x18, + 0xA5, 0xFD, 0xD8, 0x10, 0x60, 0xF4, 0xAF, 0x19, 0x56, 0xF8, 0xDA, 0x1B, + 0x7C, 0xFE, 0x95, 0x14, 0xF2, 0xF9, 0x7F, 0x10, 0x69, 0x09, 0xE5, 0x0B, + 0xAD, 0x26, 0x90, 0xFF, 0x1A, 0x1E, 0x0D, 0x01, 0xD0, 0xFC, 0xD5, 0x12, + 0xD9, 0xF2, 0x28, 0x17, 0xC8, 0xF6, 0x9C, 0x14, 0x15, 0xFE, 0x66, 0x11, + 0x9A, 0x05, 0x0F, 0x00, 0x64, 0x06, 0x80, 0xF6, 0x7F, 0x0E, 0xA7, 0x00, + 0x38, 0x19, 0x46, 0x05, 0x23, 0x15, 0x72, 0xFF, 0xC8, 0xFE, 0xC6, 0x00, + 0xE0, 0xF0, 0x7F, 0x04, 0x53, 0xF4, 0xB9, 0xFA, 0x28, 0xEC, 0xBA, 0xF1, + 0x43, 0xE4, 0x38, 0xED, 0x44, 0xE5, 0xAB, 0xE3, 0x95, 0xE0, 0x47, 0xE0, + 0x7B, 0xE3, 0x3B, 0xE8, 0xDE, 0xED, 0xCF, 0xEE, 0xDC, 0xF1, 0x93, 0xED, + 0xB0, 0xFE, 0x34, 0xED, 0xA0, 0x0D, 0x20, 0xEE, 0xCD, 0xFC, 0x7D, 0xEB, + 0xBA, 0xE3, 0x0A, 0xEB, 0xF9, 0xD7, 0xCE, 0xF4, 0x72, 0xCC, 0x07, 0xFD, + 0xEE, 0xD5, 0x57, 0xFA, 0x7A, 0xEA, 0xB2, 0xF8, 0xCB, 0xF0, 0xDE, 0xED, + 0x59, 0xF4, 0x25, 0xE0, 0xAB, 0xF0, 0xFB, 0xE1, 0xEA, 0xE6, 0xD2, 0xE8, + 0xAB, 0xE4, 0xFB, 0xF8, 0x58, 0xE7, 0x88, 0x02, 0x57, 0xE5, 0x02, 0xF6, + 0x09, 0xDD, 0xA1, 0xF1, 0x27, 0xD1, 0x60, 0xF8, 0x98, 0xD0, 0x11, 0xF3, + 0xC8, 0xE8, 0xBA, 0xEA, 0x07, 0x01, 0xC5, 0xE7, 0xE8, 0x08, 0xF3, 0xE4, + 0x70, 0x05, 0x44, 0xEE, 0xD1, 0xFB, 0xDB, 0xFB, 0x8D, 0xF9, 0xC7, 0xFA, + 0xD4, 0xFD, 0x23, 0xF1, 0x65, 0xF3, 0x16, 0xE4, 0x67, 0xE3, 0x1A, 0xDA, + 0x69, 0xE4, 0x67, 0xDA, 0x64, 0xEF, 0x53, 0xDD, 0x80, 0xFA, 0xB7, 0xE3, + 0x8D, 0x00, 0x71, 0xEF, 0xF2, 0x0C, 0x0D, 0xF7, 0xAA, 0x09, 0x8B, 0xFC, + 0xFC, 0xE9, 0x17, 0xFA, 0x54, 0xDE, 0x49, 0xEE, 0x7B, 0xDB, 0x27, 0xF2, + 0xFE, 0xCB, 0x5B, 0x01, 0x91, 0xD3, 0x59, 0x09, 0x3C, 0xEC, 0xE1, 0x0B, + 0x21, 0xF6, 0x1E, 0x08, 0xDA, 0xFD, 0xB8, 0x01, 0x47, 0x02, 0x49, 0xFB, + 0xAC, 0xF3, 0xF1, 0xF6, 0xC0, 0xE6, 0x82, 0xFE, 0xAC, 0xEA, 0x40, 0x0A, + 0x8B, 0xF1, 0x65, 0x07, 0x88, 0xF7, 0xAC, 0xF2, 0x82, 0xFF, 0x57, 0xDB, + 0xE0, 0xF9, 0x8E, 0xD3, 0xC4, 0xED, 0x26, 0xE0, 0xF2, 0xF1, 0x0B, 0xEE, + 0xAC, 0xFF, 0x7D, 0xF1, 0x53, 0x02, 0xA8, 0xEF, 0x94, 0xF8, 0xDD, 0xEC, + 0x25, 0xEB, 0xF7, 0xE9, 0xAA, 0xD5, 0x54, 0xE4, 0x1F, 0xCD, 0x42, 0xE1, + 0x25, 0xDC, 0xD5, 0xDF, 0x63, 0xE2, 0x8A, 0xDA, 0xB2, 0xE1, 0x81, 0xD7, + 0x6F, 0xE2, 0x5B, 0xD6, 0x33, 0xDA, 0x38, 0xD4, 0x39, 0xD6, 0xD8, 0xCA, + 0x15, 0xD7, 0x1C, 0xBD, 0x12, 0xCF, 0xAE, 0xB7, 0xFE, 0xC7, 0x59, 0xBF, + 0x5F, 0xC7, 0x21, 0xD8, 0x36, 0xC9, 0xE1, 0xDF, 0xD6, 0xC7, 0xEA, 0xD2, + 0x82, 0xC3, 0x9E, 0xCF, 0xD8, 0xCE, 0xEC, 0xC0, 0xCA, 0xD9, 0xE7, 0xAC, + 0x02, 0xD1, 0x82, 0xAE, 0xEA, 0xC5, 0x17, 0xB5, 0x31, 0xC5, 0x91, 0xB8, + 0x12, 0xCA, 0x9F, 0xC5, 0x1B, 0xC5, 0xE4, 0xC9, 0x24, 0xB8, 0x71, 0xB6, + 0x89, 0xAF, 0xA2, 0xAC, 0x4D, 0xB6, 0xBC, 0xB2, 0x2F, 0xC7, 0x4C, 0xB2, + 0x32, 0xCD, 0x1A, 0xB8, 0x74, 0xCB, 0xC0, 0xCC, 0x46, 0xC6, 0x18, 0xDD, + 0x32, 0xB8, 0x24, 0xE4, 0x33, 0xB5, 0xCA, 0xE9, 0x7F, 0xC8, 0x11, 0xE9, + 0xE0, 0xDE, 0xAF, 0xD7, 0x62, 0xE3, 0x8C, 0xC9, 0xAD, 0xDC, 0xB5, 0xC9, + 0xC7, 0xDD, 0xA5, 0xC2, 0x1E, 0xE4, 0x9F, 0xBA, 0x66, 0xED, 0xDC, 0xBA, + 0x5F, 0xF2, 0x84, 0xBC, 0xAD, 0xE8, 0xCC, 0xBE, 0xC4, 0xD9, 0x2A, 0xC5, + 0x03, 0xD6, 0x97, 0xCC, 0x76, 0xDF, 0x73, 0xD8, 0xF7, 0xE3, 0xDE, 0xE7, + 0x29, 0xE2, 0x3C, 0xE2, 0x61, 0xE5, 0x64, 0xD4, 0x39, 0xED, 0xC1, 0xD6, + 0xED, 0xF4, 0x1E, 0xDD, 0x3C, 0xF4, 0xBC, 0xDC, 0x9D, 0xE6, 0x69, 0xDB, + 0x37, 0xD8, 0x63, 0xE7, 0xD1, 0xD8, 0xB3, 0xF2, 0x78, 0xE5, 0xBE, 0xF2, + 0xD7, 0xF2, 0xC1, 0xEE, 0x74, 0xF1, 0x38, 0xE0, 0xB4, 0xE0, 0xE7, 0xD7, + 0xFF, 0xD3, 0x91, 0xE3, 0x2F, 0xDD, 0x84, 0xF5, 0xEE, 0xF5, 0xF7, 0xFF, + 0xA0, 0x00, 0x94, 0xFD, 0xF5, 0x00, 0x5D, 0xF5, 0xAD, 0x02, 0x5A, 0xF7, + 0x47, 0xFE, 0x27, 0x04, 0x58, 0xFA, 0x68, 0x07, 0x76, 0x08, 0x7D, 0x04, + 0x7B, 0x1B, 0xE7, 0x03, 0x83, 0x1D, 0x26, 0xFF, 0xB8, 0x1B, 0x5A, 0xFB, + 0x21, 0x11, 0x6E, 0xFB, 0xFC, 0xFE, 0x88, 0xFD, 0x5E, 0xFC, 0x57, 0x06, + 0x24, 0x07, 0x37, 0x11, 0xB5, 0x14, 0xDE, 0x11, 0x29, 0x20, 0x1C, 0x0F, + 0x60, 0x2A, 0xF7, 0x0C, 0x17, 0x26, 0x2F, 0x01, 0x53, 0x10, 0x3E, 0xF4, + 0x74, 0x01, 0xA5, 0xF6, 0x04, 0x06, 0x0F, 0x02, 0x5B, 0x11, 0xAA, 0x09, + 0x18, 0x12, 0x3A, 0x0B, 0x59, 0x06, 0xF3, 0x0B, 0x13, 0xF8, 0x74, 0x0D, + 0x0E, 0xF7, 0xDC, 0x0F, 0x10, 0xFF, 0x26, 0x16, 0xE3, 0x02, 0x9D, 0x1B, + 0x57, 0x0C, 0xED, 0x16, 0xC3, 0x1B, 0xE1, 0x0A, 0x8E, 0x22, 0x6D, 0x00, + 0x80, 0x1B, 0x2F, 0x00, 0x8C, 0x0F, 0x53, 0x0F, 0xF2, 0x04, 0xF4, 0x18, + 0xAB, 0x08, 0xF5, 0x1A, 0x77, 0x25, 0x5E, 0x22, 0x75, 0x3F, 0x97, 0x21, + 0x1A, 0x3B, 0xD4, 0x1E, 0xE7, 0x22, 0xCC, 0x22, 0x07, 0x18, 0x62, 0x21, + 0xB3, 0x1A, 0x47, 0x1E, 0x8A, 0x12, 0xCB, 0x1D, 0x97, 0x13, 0x9A, 0x1D, + 0xDE, 0x26, 0x0C, 0x26, 0xF1, 0x33, 0x17, 0x2F, 0x72, 0x39, 0x7A, 0x26, + 0xC2, 0x3B, 0x1B, 0x1D, 0x32, 0x31, 0x2C, 0x1C, 0x5B, 0x28, 0x05, 0x15, + 0x5C, 0x31, 0xC8, 0x0B, 0xF2, 0x2D, 0x7A, 0x02, 0x0A, 0x1E, 0x90, 0xFB, + 0xAE, 0x1C, 0xDE, 0xFE, 0x5B, 0x19, 0x5E, 0x0C, 0x2A, 0x0A, 0x0C, 0x1C, + 0xFC, 0x02, 0x07, 0x1C, 0x22, 0x07, 0xEE, 0x14, 0x77, 0x08, 0x60, 0x1A, + 0x04, 0x0C, 0x41, 0x13, 0x72, 0x0A, 0xDF, 0xF8, 0xBE, 0xEF, 0x28, 0xF2, + 0xD7, 0xE1, 0xE1, 0xFA, 0xF9, 0xF3, 0x26, 0xFA, 0x6F, 0xF5, 0x99, 0x01, + 0x4F, 0xE4, 0xFB, 0x13, 0x0B, 0xEC, 0x97, 0x15, 0x7A, 0xFF, 0xB2, 0x0B, + 0x11, 0x04, 0xFF, 0x05, 0x70, 0x01, 0x8F, 0xF9, 0x4B, 0xFF, 0x5A, 0xE3, + 0x9D, 0x04, 0x55, 0xD9, 0x5E, 0x02, 0x06, 0xE6, 0x8F, 0xF4, 0xCA, 0xF0, + 0x3C, 0xEE, 0x50, 0xF5, 0x22, 0xEE, 0x41, 0xFF, 0xBC, 0xF1, 0x5F, 0x01, + 0x48, 0xF5, 0xDE, 0xF7, 0x10, 0xFB, 0x79, 0xED, 0x78, 0x07, 0x3F, 0xEB, + 0x88, 0x10, 0x9D, 0xEF, 0xDD, 0x0F, 0x58, 0xEE, 0xC2, 0x08, 0x50, 0xE3, + 0xD2, 0x07, 0xFF, 0xE2, 0xE5, 0x0E, 0x2C, 0xF4, 0xCF, 0x0E, 0x11, 0xF6, + 0x33, 0xFF, 0x20, 0xF0, 0x8B, 0xEC, 0xAD, 0xF7, 0x27, 0xE7, 0x5A, 0xFC, + 0x7B, 0xEA, 0x30, 0x02, 0x41, 0xF0, 0xA3, 0x08, 0x26, 0xF5, 0x40, 0xFF, + 0xAB, 0xF2, 0x1C, 0xEF, 0x04, 0xEC, 0xDE, 0xE6, 0xD9, 0xE3, 0xD9, 0xEB, + 0x2A, 0xDD, 0x2B, 0xFA, 0xCC, 0xE2, 0xE3, 0x00, 0x25, 0xF3, 0x32, 0x00, + 0x86, 0x03, 0xE2, 0x01, 0x38, 0x0A, 0x10, 0xF9, 0x3A, 0xFE, 0x33, 0xF3, + 0x31, 0xE7, 0xF9, 0xF8, 0xBC, 0xDA, 0xFE, 0xF6, 0xCC, 0xE3, 0x22, 0xF6, + 0x6B, 0xEF, 0xD7, 0xF7, 0x4A, 0xF9, 0xCF, 0xFC, 0xA1, 0x04, 0xF4, 0x06, + 0x5A, 0x00, 0x53, 0x09, 0xF2, 0x04, 0x92, 0x0F, 0xF0, 0x14, 0xE9, 0x1C, + 0x5D, 0x0A, 0x2B, 0x17, 0xC2, 0x00, 0xD8, 0x0B, 0x68, 0x12, 0x69, 0x0E, + 0xD3, 0x24, 0x10, 0x0D, 0x22, 0x2D, 0xBE, 0x18, 0x10, 0x3C, 0xB4, 0x37, + 0xD9, 0x4F, 0x57, 0x4C, 0x59, 0x52, 0xF5, 0x57, 0x0F, 0x4E, 0x49, 0x5A, + 0x1F, 0x5E, 0x24, 0x5E, 0x70, 0x5D, 0x74, 0x57, 0x99, 0x42, 0x1F, 0x3F, + 0x86, 0x53, 0x67, 0x50, 0xE3, 0x54, 0xCD, 0x57, 0x16, 0x20, 0x2F, 0x25, + 0x77, 0x2B, 0xF3, 0x25, 0x02, 0x5C, 0x83, 0x59, 0x03, 0x56, 0x80, 0x5A, + 0x89, 0x43, 0x34, 0x43, 0x1E, 0x2E, 0xAD, 0x34, 0xCD, 0xFE, 0xC2, 0x0C, + 0xC3, 0xDB, 0xDE, 0xD8, 0x90, 0xBF, 0xA1, 0xB3, 0x35, 0xA8, 0xB4, 0xAE, + 0x24, 0xA3, 0xA9, 0xB2, 0x1E, 0xA9, 0x2A, 0xB5, 0xA3, 0xB8, 0xE3, 0xCB, + 0x13, 0xB2, 0x21, 0xCC, 0x3A, 0xAE, 0x5A, 0xB4, 0x1F, 0xC4, 0x69, 0xB7, + 0x12, 0xC0, 0xF4, 0xBB, 0x57, 0xB8, 0x69, 0xAA, 0x71, 0xD7, 0x8C, 0xB9, + 0xED, 0xEC, 0xEF, 0xDE, 0xEA, 0xE1, 0x8F, 0xE1, 0x44, 0xE1, 0xA1, 0xDD, + 0xC1, 0xE3, 0xE2, 0xE6, 0xBB, 0xD8, 0x09, 0xE5, 0x14, 0xED, 0x2F, 0xF1, + 0xB0, 0x1A, 0x51, 0x1A, 0xEF, 0x2A, 0xE9, 0x2B, 0x03, 0x32, 0x98, 0x2D, + 0x35, 0x51, 0xA8, 0x4C, 0xC4, 0x5A, 0x74, 0x5C, 0xA9, 0x4A, 0x3F, 0x4C, + 0xE6, 0x4B, 0xFC, 0x44, 0x4A, 0x47, 0x37, 0x43, 0xDE, 0x34, 0xA5, 0x41, + 0x0E, 0x40, 0x10, 0x4D, 0x4C, 0x5C, 0xCB, 0x5C, 0x25, 0x5B, 0x71, 0x5C, + 0x00, 0x51, 0x96, 0x51, 0xCF, 0x57, 0x05, 0x56, 0x27, 0x54, 0x98, 0x59, + 0xE6, 0x44, 0xA3, 0x48, 0x6A, 0x40, 0x51, 0x45, 0x4F, 0x41, 0x1E, 0x58, + 0xC2, 0x2F, 0x6B, 0x53, 0x9A, 0x20, 0xB6, 0x49, 0xBA, 0x28, 0xC7, 0x54, + 0xE7, 0x19, 0x8E, 0x36, 0x5B, 0x05, 0xF3, 0x05, 0x57, 0x1A, 0x6A, 0x0B, + 0x53, 0x26, 0xA1, 0x14, 0xB7, 0x0D, 0x1E, 0xFE, 0x4D, 0xFD, 0xBE, 0xFA, + 0xB0, 0xFF, 0x95, 0x0D, 0x17, 0x07, 0x5D, 0x1B, 0xC5, 0x11, 0x9C, 0x23, + 0x89, 0x0A, 0x90, 0x17, 0xCF, 0xF4, 0x65, 0xFB, 0x95, 0xF9, 0xF7, 0xF2, + 0xAC, 0x0C, 0x3B, 0x06, 0xF7, 0x19, 0x55, 0x15, 0x71, 0x36, 0x1C, 0x1B, + 0x62, 0x52, 0x77, 0x33, 0xE5, 0x5C, 0x8E, 0x4E, 0xCA, 0x63, 0x24, 0x51, + 0xC8, 0x60, 0xE3, 0x46, 0x22, 0x4F, 0xB9, 0x47, 0x37, 0x44, 0x49, 0x56, + 0x1C, 0x4A, 0x6B, 0x62, 0x81, 0x53, 0x68, 0x5E, 0xCB, 0x52, 0x16, 0x4D, + 0x28, 0x4B, 0x49, 0x46, 0x9F, 0x45, 0x8A, 0x49, 0x87, 0x36, 0x3D, 0x46, + 0x63, 0x27, 0x1E, 0x46, 0x1C, 0x21, 0x92, 0x3C, 0x7F, 0x11, 0xA7, 0x1B, + 0x08, 0x04, 0x28, 0x0B, 0x18, 0xF7, 0x51, 0x07, 0x10, 0xDA, 0x4D, 0xEC, + 0x55, 0xC6, 0x11, 0xD4, 0x16, 0xC1, 0xC2, 0xC6, 0x89, 0xAE, 0x39, 0xB7, + 0x65, 0xA1, 0xD8, 0xAB, 0xB1, 0xA1, 0xC0, 0xA0, 0x9A, 0x9F, 0x43, 0xA0, + 0x2F, 0xAA, 0x6B, 0xA8, 0x51, 0xBC, 0x9A, 0xAC, 0xA5, 0xC6, 0xA4, 0xB4, + 0x2B, 0xC1, 0xA0, 0xB5, 0x0F, 0xB6, 0xB1, 0xA8, 0x57, 0xAD, 0x80, 0x9D, + 0x93, 0x9F, 0xBC, 0x9D, 0xB0, 0x99, 0xA9, 0xA5, 0x14, 0x9D, 0x24, 0xA6, + 0xD5, 0xA6, 0x0A, 0xA8, 0x48, 0xBF, 0x26, 0xC6, 0xE8, 0xD2, 0x1D, 0xDB, + 0xA9, 0xCB, 0xC9, 0xC9, 0xBF, 0xC6, 0x16, 0xC9, 0x60, 0xD4, 0x54, 0xDB, + 0x7D, 0xD5, 0x04, 0xD6, 0x16, 0xC7, 0x85, 0xD1, 0x37, 0xCE, 0xCE, 0xE0, + 0xEE, 0xE1, 0x1F, 0xE7, 0x2B, 0xDA, 0x8C, 0xE6, 0x0F, 0xC3, 0x37, 0xDE, + 0x2B, 0xB6, 0x28, 0xCC, 0xF4, 0xBB, 0x4B, 0xD1, 0x35, 0xCD, 0x8E, 0xDC, + 0x5F, 0xD9, 0x18, 0xD2, 0xA1, 0xDE, 0x39, 0xCD, 0xE8, 0xD8, 0x18, 0xDA, + 0x8F, 0xCE, 0x0B, 0xDF, 0x0B, 0xCE, 0xC7, 0xDA, 0x85, 0xC5, 0xE1, 0xCB, + 0x6A, 0xC3, 0xDC, 0xBA, 0x71, 0xD8, 0xBB, 0xBA, 0x8B, 0xE6, 0x34, 0xC9, + 0x16, 0xEB, 0xDF, 0xDC, 0x89, 0xF8, 0x8C, 0xE7, 0xF8, 0x08, 0x78, 0xF9, + 0x86, 0x06, 0xE5, 0x0F, 0x8E, 0x05, 0x8F, 0x15, 0xDA, 0x12, 0x57, 0x15, + 0xB9, 0x0B, 0xC6, 0x12, 0x3D, 0xFD, 0x95, 0x04, 0xA9, 0x11, 0x0B, 0x0B, + 0x77, 0x29, 0xEF, 0x28, 0xB0, 0x2B, 0xA2, 0x3C, 0xC0, 0x2F, 0xD4, 0x49, + 0xB2, 0x41, 0xCA, 0x4D, 0x80, 0x51, 0xE9, 0x42, 0x44, 0x48, 0xFF, 0x37, + 0x98, 0x34, 0x28, 0x35, 0x68, 0x29, 0x36, 0x2F, 0x23, 0x23, 0xFC, 0x1F, + 0x0B, 0x23, 0x40, 0x1C, 0x61, 0x24, 0x3B, 0x24, 0x00, 0x10, 0x56, 0x1D, + 0x94, 0xFA, 0x14, 0x12, 0xC9, 0x01, 0xEC, 0x11, 0x4D, 0x0F, 0x07, 0x0D, + 0x77, 0x17, 0xDA, 0x06, 0x24, 0x21, 0x48, 0x0F, 0x8F, 0x1D, 0xF1, 0x14, + 0xAA, 0x12, 0x82, 0x15, 0x88, 0x0F, 0x65, 0x1D, 0x35, 0x04, 0x50, 0x18, + 0x0D, 0xF7, 0xC9, 0x02, 0xCC, 0xF0, 0x34, 0xF5, 0x05, 0xEF, 0xF4, 0xF3, + 0x0F, 0xF6, 0x2D, 0xF8, 0x7B, 0xF9, 0x6A, 0xFB, 0x73, 0xEC, 0xB7, 0xF1, + 0x65, 0xDD, 0x0B, 0xEA, 0xDA, 0xE0, 0x1F, 0xEA, 0xAA, 0xE9, 0x16, 0xE4, + 0x66, 0xE9, 0xA9, 0xE2, 0x1A, 0xEC, 0x14, 0xE2, 0x30, 0xED, 0x9E, 0xD3, + 0x7F, 0xDF, 0x9F, 0xC7, 0x98, 0xD2, 0x89, 0xCE, 0x0C, 0xDA, 0xAD, 0xD3, + 0x34, 0xE1, 0x1E, 0xC5, 0xCC, 0xDF, 0x88, 0xB7, 0x9F, 0xE6, 0x3A, 0xB2, + 0xE9, 0xEB, 0xEB, 0xB4, 0x01, 0xE5, 0x2D, 0xCA, 0x5B, 0xE0, 0x42, 0xE0, + 0x2B, 0xDC, 0x3A, 0xDE, 0x0C, 0xD7, 0xB3, 0xD2, 0x41, 0xD9, 0xF0, 0xC8, + 0x2E, 0xD2, 0x52, 0xBF, 0xE3, 0xBA, 0xE4, 0xBD, 0xB4, 0xA8, 0x8A, 0xBE, + 0xE1, 0xB3, 0xCB, 0xBC, 0xEF, 0xC8, 0x69, 0xBE, 0xA8, 0xCD, 0x46, 0xBE, + 0x63, 0xC9, 0x42, 0xAE, 0x20, 0xC7, 0xDE, 0xAA, 0x21, 0xBF, 0x8D, 0xB6, + 0x38, 0xB2, 0x20, 0xAF, 0x7D, 0xAC, 0xBC, 0xA7, 0xAE, 0xA1, 0xE1, 0xA5, + 0x34, 0x9C, 0xC1, 0x9F, 0xE6, 0xAC, 0xF4, 0xA0, 0x5B, 0xBE, 0xFA, 0xAF, + 0x11, 0xD0, 0x66, 0xCD, 0xE2, 0xEB, 0xF2, 0xEE, 0xD2, 0xF5, 0xF1, 0x01, + 0x83, 0x01, 0x6B, 0x19, 0x4E, 0x21, 0x0F, 0x34, 0x5A, 0x23, 0x3C, 0x31, + 0x28, 0x18, 0x98, 0x28, 0xE6, 0x18, 0x81, 0x20, 0xD2, 0x11, 0x9B, 0x15, + 0x82, 0x15, 0x85, 0x22, 0x3C, 0x30, 0xBA, 0x33, 0xFE, 0x44, 0x1C, 0x2A, + 0xDA, 0x43, 0xC8, 0x25, 0x54, 0x44, 0xA7, 0x3A, 0x87, 0x3F, 0xC0, 0x40, + 0xC6, 0x1D, 0xEF, 0x29, 0x69, 0x0E, 0xCB, 0x1A, 0xBE, 0x1A, 0x66, 0x1B, + 0x24, 0x0F, 0x69, 0x14, 0x90, 0xFF, 0xA7, 0x14, 0x50, 0xFE, 0x63, 0x18, + 0xCF, 0xFA, 0xC6, 0x08, 0x38, 0xFF, 0x6A, 0xFD, 0x85, 0x09, 0xAA, 0xF5, + 0x22, 0x10, 0x40, 0xE3, 0x87, 0x0A, 0xC7, 0xD9, 0x3B, 0x02, 0x92, 0xEA, + 0xA3, 0x05, 0xAF, 0xFA, 0xBB, 0x08, 0x9C, 0xFA, 0xD2, 0x03, 0x6A, 0x03, + 0xCD, 0xFC, 0xAF, 0x0E, 0xC4, 0x05, 0x36, 0x11, 0xFF, 0x14, 0x82, 0x0F, + 0x8E, 0x1F, 0x19, 0x10, 0x72, 0x26, 0xB8, 0x0B, 0x05, 0x24, 0xD5, 0x06, + 0x3A, 0x1C, 0x44, 0x0B, 0xD9, 0x13, 0x2E, 0x10, 0x87, 0x17, 0xAE, 0x11, + 0xCB, 0x1C, 0x18, 0x07, 0xC8, 0x0A, 0xEB, 0xF5, 0xD5, 0xF9, 0xC5, 0xF0, + 0x89, 0xF8, 0x7A, 0xF6, 0x34, 0xF0, 0x1B, 0xFB, 0x85, 0xEA, 0x9D, 0xFC, + 0x68, 0xEB, 0x53, 0xF9, 0x17, 0xF2, 0x0D, 0xEF, 0x08, 0x09, 0x68, 0xE9, + 0xF4, 0x11, 0xBA, 0xEB, 0x5C, 0xFA, 0x56, 0xE7, 0xD4, 0xE6, 0xF5, 0xE1, + 0xD8, 0xE8, 0x9C, 0xEC, 0x96, 0xF0, 0x51, 0xF9, 0xF7, 0xF0, 0xC1, 0xEE, + 0x90, 0xE4, 0xDA, 0xDC, 0x72, 0xD4, 0x27, 0xD4, 0x47, 0xD8, 0x9D, 0xC7, + 0x57, 0xF0, 0x35, 0xC8, 0x7C, 0xF1, 0x28, 0xCF, 0x4D, 0xDD, 0xFA, 0xC3, + 0xBB, 0xDC, 0xA5, 0xC8, 0x4A, 0xE3, 0xE2, 0xE0, 0xBB, 0xD5, 0xBF, 0xE2, + 0x4E, 0xCA, 0x84, 0xD1, 0xA3, 0xCC, 0x2E, 0xC3, 0x23, 0xCD, 0xD5, 0xC7, + 0xF6, 0xCD, 0xE6, 0xD4, 0x72, 0xD1, 0x4D, 0xD2, 0x4F, 0xDF, 0x99, 0xE2, + 0xC7, 0xFD, 0x2F, 0x0F, 0x6C, 0x12, 0x86, 0x2B, 0x9F, 0x0F, 0x2C, 0x31, + 0xD3, 0x1D, 0xA8, 0x3C, 0xC6, 0x31, 0x28, 0x3C, 0x2D, 0x2B, 0xBA, 0x2B, + 0x65, 0x2D, 0x61, 0x32, 0xA7, 0x36, 0xD9, 0x3B, 0xFB, 0x36, 0x7D, 0x3B, + 0xF3, 0x3C, 0xD6, 0x35, 0xE7, 0x46, 0x4E, 0x24, 0xEE, 0x43, 0xD7, 0x1B, + 0x8C, 0x2E, 0x33, 0x17, 0xE0, 0x20, 0x1C, 0x14, 0xA6, 0x1C, 0x95, 0x17, + 0x8E, 0x0E, 0xF7, 0x0B, 0x98, 0xFA, 0x28, 0xFA, 0x1F, 0xF0, 0x2C, 0xF3, + 0x00, 0xF3, 0xDD, 0xF0, 0x18, 0xF0, 0x41, 0xED, 0xAE, 0xE9, 0x08, 0xE8, + 0xFF, 0xEE, 0x81, 0xE6, 0x19, 0xF7, 0xC0, 0xE8, 0x5C, 0x01, 0xF0, 0xEB, + 0x75, 0x07, 0x56, 0xF3, 0x71, 0x09, 0x54, 0x06, 0xD1, 0x0D, 0x09, 0x17, + 0x62, 0x0F, 0xE1, 0x1C, 0x17, 0x14, 0x18, 0x2E, 0x3F, 0x0F, 0x1B, 0x35, + 0x49, 0x0C, 0xB3, 0x2D, 0x4B, 0x15, 0x4E, 0x32, 0x29, 0x19, 0xBE, 0x32, + 0x2F, 0x22, 0x8B, 0x30, 0x16, 0x2F, 0x25, 0x39, 0x84, 0x3C, 0x7C, 0x42, + 0xD9, 0x45, 0xFE, 0x46, 0xF2, 0x40, 0x80, 0x45, 0xF2, 0x3F, 0xED, 0x45, + 0x25, 0x3F, 0xA7, 0x46, 0xF1, 0x36, 0x9A, 0x3B, 0xEB, 0x2D, 0xBC, 0x36, + 0x07, 0x1C, 0x95, 0x39, 0xFE, 0x10, 0xD5, 0x2D, 0x29, 0x0F, 0x09, 0x21, + 0xB5, 0x0D, 0x7A, 0x23, 0x82, 0x12, 0xC4, 0x1A, 0x96, 0x1B, 0xE3, 0x0D, + 0x87, 0x26, 0x53, 0x1C, 0xF7, 0x21, 0xB1, 0x1E, 0x9E, 0x1C, 0x7D, 0x0C, + 0x78, 0x18, 0x5F, 0x0D, 0x41, 0xF6, 0x94, 0x09, 0x7F, 0xDF, 0x47, 0xFA, + 0xD3, 0xDC, 0x72, 0xEA, 0xC5, 0xD0, 0x3B, 0xD5, 0xA3, 0xCB, 0x11, 0xCB, + 0x51, 0xD0, 0x18, 0xCF, 0x8E, 0xD3, 0x2F, 0xCF, 0x51, 0xC9, 0x81, 0xC4, + 0x97, 0xBF, 0x7D, 0xBD, 0x5A, 0xC6, 0x41, 0xC4, 0x9C, 0xCB, 0x3D, 0xD0, + 0x8D, 0xC7, 0x07, 0xD3, 0x50, 0xC4, 0xE7, 0xD3, 0x9A, 0xD0, 0xB9, 0xD9, + 0x28, 0xE4, 0x6D, 0xDB, 0x33, 0xE5, 0x3E, 0xDA, 0x1C, 0xDC, 0xC9, 0xD5, + 0xA0, 0xEA, 0xA7, 0xDE, 0x9C, 0x0E, 0x7D, 0x02, 0xEE, 0x29, 0xED, 0x1E, + 0x13, 0x37, 0x95, 0x29, 0x88, 0x30, 0xBA, 0x2F, 0xF6, 0x18, 0x29, 0x2B, + 0x37, 0x1F, 0xE2, 0x29, 0x08, 0x32, 0x5D, 0x27, 0xE0, 0x24, 0xB7, 0x1A, + 0x79, 0x20, 0xCD, 0x21, 0xA8, 0x25, 0x98, 0x26, 0x71, 0x1E, 0x88, 0x15, + 0xF0, 0x21, 0xE2, 0x11, 0x80, 0x25, 0x7A, 0x0E, 0x64, 0x15, 0xD8, 0xFB, + 0x2C, 0xF3, 0xA3, 0xEE, 0xA2, 0xD8, 0x4D, 0xEA, 0x12, 0xD0, 0x5C, 0xDD, + 0xC5, 0xC9, 0x90, 0xCD, 0x62, 0xCE, 0x0D, 0xD2, 0xFC, 0xDC, 0x89, 0xDC, + 0xF8, 0xDA, 0x65, 0xD1, 0xB7, 0xDA, 0x71, 0xD0, 0xCC, 0xEA, 0x9D, 0xEE, + 0x83, 0xE6, 0x83, 0xFD, 0x8B, 0xDF, 0x89, 0xFA, 0x14, 0xF0, 0x90, 0xFE, + 0x03, 0x06, 0xB5, 0x12, 0x8F, 0x19, 0x46, 0x2D, 0x03, 0x22, 0xCF, 0x31, + 0xC2, 0x29, 0xEC, 0x30, 0x16, 0x31, 0x96, 0x2F, 0xA7, 0x25, 0xC7, 0x25, + 0x43, 0x2D, 0xEC, 0x35, 0x67, 0x3E, 0xA6, 0x47, 0xE7, 0x31, 0xDE, 0x39, + 0x4D, 0x34, 0x33, 0x36, 0xAD, 0x3C, 0x00, 0x3A, 0x01, 0x30, 0xBD, 0x3A, + 0x7D, 0x32, 0xA8, 0x49, 0xB7, 0x2E, 0x88, 0x48, 0xBE, 0x23, 0xD2, 0x3B, + 0x67, 0x33, 0xB1, 0x3A, 0x17, 0x3F, 0x53, 0x33, 0x3C, 0x2E, 0x60, 0x29, + 0x6A, 0x19, 0x20, 0x2B, 0xE0, 0x1B, 0xDE, 0x2F, 0x14, 0x25, 0x7E, 0x2E, + 0x77, 0x2A, 0xC4, 0x2B, 0x44, 0x33, 0xE6, 0x27, 0xAF, 0x27, 0xAD, 0x1E, + 0x72, 0x0A, 0xD5, 0x17, 0x70, 0xFA, 0xCB, 0x12, 0xCC, 0xFE, 0xDD, 0x18, + 0x5F, 0x0B, 0xD3, 0x26, 0x79, 0x18, 0x73, 0x2A, 0xA2, 0x13, 0xC7, 0x1A, + 0x66, 0xF4, 0x3B, 0xFD, 0xAA, 0xE1, 0x2E, 0xF1, 0xE1, 0xDE, 0xB2, 0xEC, + 0xDB, 0xEA, 0xB7, 0xFA, 0x42, 0xFA, 0x9C, 0x0E, 0xCC, 0xF9, 0x6E, 0x04, + 0xCB, 0x01, 0x93, 0x0D, 0x34, 0x05, 0xAD, 0x20, 0x3E, 0xF1, 0x2A, 0x08, + 0x4E, 0xDF, 0x83, 0xEC, 0x25, 0xDB, 0x2A, 0xF2, 0xE6, 0xDB, 0x20, 0x00, + 0xBD, 0xDD, 0x0E, 0xF9, 0xF9, 0xE7, 0xCB, 0xF1, 0x04, 0xF4, 0x13, 0x06, + 0xB8, 0xFC, 0xB8, 0x14, 0x7B, 0x09, 0x93, 0x17, 0xBD, 0x0D, 0xA0, 0x1B, + 0xE2, 0x0E, 0x11, 0x12, 0x89, 0x15, 0x43, 0x03, 0x46, 0x14, 0xA3, 0x02, + 0xD1, 0x0C, 0xA0, 0x0B, 0x8D, 0x09, 0xDA, 0x0C, 0xD8, 0x04, 0x13, 0xFB, + 0x8C, 0x05, 0x23, 0xEC, 0xB9, 0x10, 0xD8, 0xE8, 0xC1, 0x0E, 0x57, 0xE3, + 0xCC, 0x07, 0x24, 0xE9, 0x67, 0x0D, 0x80, 0xF6, 0x55, 0x03, 0x6F, 0xF0, + 0x1E, 0xF7, 0x2C, 0xDE, 0x79, 0xFA, 0xBE, 0xD7, 0x57, 0xF2, 0xE0, 0xDF, + 0x50, 0xE7, 0xF2, 0xEC, 0x7F, 0xD4, 0xEB, 0xE4, 0xDF, 0xC9, 0x2D, 0xD5, + 0x8A, 0xCE, 0xC3, 0xCD, 0xA9, 0xC7, 0xDC, 0xC5, 0x12, 0xD3, 0x0F, 0xCE, + 0xBC, 0xE3, 0xB3, 0xDC, 0xFF, 0xD5, 0x23, 0xDD, 0xBF, 0xD6, 0xA5, 0xDF, + 0xF9, 0xEA, 0x64, 0xE8, 0x83, 0xEA, 0x32, 0xEA, 0xC8, 0xEB, 0xED, 0xEE, + 0xBB, 0xFB, 0x6E, 0xF0, 0x2B, 0x00, 0x2C, 0xEF, 0x75, 0xFD, 0xC2, 0xF3, + 0x8D, 0x07, 0xF8, 0xEF, 0x21, 0x0F, 0xA8, 0xE7, 0xDA, 0x0A, 0x79, 0xEE, + 0xE6, 0x07, 0xAC, 0xFE, 0x7C, 0x0B, 0xA1, 0x08, 0x99, 0x13, 0x90, 0x0E, + 0xB1, 0x10, 0x31, 0x0A, 0x97, 0x07, 0x1A, 0x00, 0xF5, 0xF3, 0x21, 0xE8, + 0xC6, 0xED, 0x32, 0xD9, 0xDC, 0x03, 0x72, 0xE8, 0xF0, 0xFD, 0xFB, 0xE4, + 0xF0, 0xF1, 0x8E, 0xDB, 0x23, 0xFD, 0x17, 0xEB, 0x01, 0xFE, 0x54, 0xFD, + 0xD3, 0xED, 0x75, 0xFE, 0xED, 0xED, 0x31, 0xFC, 0x1C, 0xFC, 0xB6, 0xF9, + 0x0B, 0xFA, 0x1E, 0xF0, 0x98, 0xFC, 0x20, 0xEE, 0xDC, 0x0A, 0x62, 0xF7, + 0x45, 0x11, 0x5F, 0x02, 0xFE, 0x0F, 0x15, 0x09, 0x84, 0x07, 0x57, 0x12, + 0x7C, 0x00, 0xA2, 0x21, 0x4D, 0xFB, 0xF5, 0x22, 0xFE, 0xF6, 0x2E, 0x12, + 0x84, 0xFE, 0xC4, 0x09, 0x17, 0xFE, 0xB1, 0x12, 0xA2, 0xF1, 0x37, 0x16, + 0xCA, 0xF2, 0x51, 0x15, 0xF0, 0x01, 0x13, 0x2C, 0xA6, 0x05, 0x9D, 0x30, + 0x03, 0xF3, 0x64, 0x08, 0x56, 0xE9, 0x7E, 0xF1, 0xEC, 0xF3, 0x96, 0xFA, + 0x3C, 0xFA, 0xB2, 0x02, 0xAB, 0xED, 0x1B, 0x00, 0xD7, 0xE2, 0x2B, 0x00, + 0x42, 0xE3, 0xFA, 0xF8, 0x4C, 0xDB, 0xA6, 0xE1, 0xBE, 0xE1, 0xED, 0xDD, + 0xD2, 0xFC, 0xD8, 0xEB, 0xAB, 0xFE, 0x45, 0xED, 0x16, 0xF3, 0xB3, 0xEB, + 0xC1, 0xFA, 0xD9, 0xED, 0x7B, 0xF8, 0xE4, 0xE9, 0x52, 0xEE, 0xAC, 0xEA, + 0x58, 0xF3, 0xCD, 0xF4, 0x49, 0xFD, 0x5A, 0xFF, 0x3E, 0x03, 0xBE, 0x0C, + 0x33, 0x01, 0xE2, 0x1C, 0x32, 0x06, 0x42, 0x24, 0xB4, 0x14, 0x22, 0x20, + 0x50, 0x0F, 0x65, 0x16, 0xEF, 0x0C, 0x46, 0x0E, 0xF1, 0x1C, 0xC0, 0x06, + 0x04, 0x1F, 0x5A, 0x06, 0x64, 0x1E, 0xE8, 0x0C, 0x15, 0x18, 0x15, 0x00, + 0x7A, 0x03, 0xA9, 0xF0, 0x2F, 0xFA, 0x89, 0xF6, 0xAD, 0x00, 0x2D, 0xFA, + 0x55, 0x06, 0x15, 0xF4, 0x49, 0x0B, 0x68, 0xFC, 0xB3, 0x10, 0xBF, 0x00, + 0x81, 0x0D, 0x1E, 0xED, 0xFB, 0x0D, 0x38, 0xE9, 0x13, 0x02, 0xF6, 0xE5, + 0xAE, 0xEF, 0x1F, 0xD9, 0x7A, 0xF2, 0x0C, 0xD9, 0xB6, 0xFB, 0x86, 0xD8, + 0x75, 0xF5, 0x07, 0xD1, 0x65, 0xED, 0x2C, 0xD2, 0x11, 0xED, 0x7C, 0xDE, + 0x18, 0xE9, 0x83, 0xE1, 0xBB, 0xE1, 0x12, 0xDA, 0xE5, 0xD3, 0x74, 0xD2, + 0x58, 0xD1, 0x44, 0xCB, 0xF5, 0xD8, 0xAA, 0xC5, 0xBF, 0xD7, 0xCC, 0xCF, + 0x7D, 0xDB, 0x5E, 0xE1, 0x12, 0xE8, 0x5B, 0xEA, 0x2C, 0xE9, 0xF0, 0xE7, + 0x4E, 0xE8, 0xDE, 0xE5, 0xD0, 0xF7, 0x78, 0xF1, 0xF3, 0xF9, 0xA5, 0xEA, + 0xD1, 0xF8, 0xA1, 0xF0, 0xBE, 0x09, 0xA2, 0xFF, 0xBE, 0x13, 0x5B, 0xEF, + 0xA2, 0x0B, 0x19, 0xEB, 0x03, 0xF6, 0x24, 0xEF, 0x82, 0xEA, 0x69, 0xE9, + 0xA4, 0xF3, 0x79, 0xE7, 0x6A, 0xF3, 0xD1, 0xE5, 0x69, 0xEB, 0x64, 0xDF, + 0xDA, 0xF2, 0x1E, 0xE8, 0x20, 0x00, 0x72, 0x02, 0x1C, 0xFD, 0x0C, 0x03, + 0x49, 0xEE, 0x35, 0xF5, 0x49, 0xEA, 0x21, 0xF7, 0x53, 0xF5, 0xDC, 0xFB, + 0xE5, 0xF2, 0x4E, 0xF8, 0xBE, 0xEC, 0x35, 0xF7, 0x2A, 0xFF, 0x42, 0x02, + 0x6E, 0x01, 0xD5, 0xFC, 0xCE, 0xF2, 0x52, 0xF4, 0xAA, 0xEC, 0x91, 0xFA, + 0x1E, 0xE0, 0xC1, 0xEE, 0xA7, 0xE5, 0x19, 0xEA, 0x57, 0x02, 0x0C, 0xFA, + 0x47, 0x0F, 0x67, 0xF6, 0x86, 0x0E, 0xA1, 0xE8, 0x06, 0x02, 0xB4, 0xE9, + 0x40, 0xE8, 0x14, 0xF9, 0xF6, 0xD6, 0xA1, 0xFF, 0xDB, 0xD5, 0xFD, 0xFA, + 0x99, 0xE5, 0x5C, 0x01, 0xA7, 0xF1, 0x87, 0xF8, 0x5A, 0xEB, 0xA5, 0xE3, + 0xEE, 0xE6, 0xEC, 0xDE, 0xAC, 0xE7, 0x18, 0xE2, 0x7E, 0xDA, 0x4F, 0xE4, + 0x22, 0xC4, 0xBB, 0xDE, 0xD9, 0xCA, 0xC1, 0xED, 0x5C, 0xDC, 0x91, 0xFE, + 0x7C, 0xDD, 0x7C, 0xEF, 0x51, 0xE9, 0x61, 0xEC, 0xCD, 0xF2, 0x60, 0xF1, + 0xB4, 0xEB, 0xD8, 0xEC, 0x9E, 0xF3, 0xE4, 0xF9, 0x50, 0xFB, 0x47, 0x0D, + 0xD8, 0xF3, 0xDA, 0x12, 0x23, 0x01, 0xD4, 0x14, 0x31, 0x15, 0x8B, 0x0C, + 0x31, 0x15, 0xEE, 0xFE, 0x2F, 0x03, 0x37, 0xFD, 0xE8, 0xEE, 0x0C, 0x00, + 0x69, 0xF1, 0x6E, 0xFC, 0xF6, 0xF9, 0xCC, 0xF0, 0x9B, 0x07, 0xA7, 0xE9, + 0x49, 0x13, 0xC3, 0xD6, 0x42, 0x05, 0x25, 0xC2, 0xAB, 0xF4, 0x9B, 0xC7, + 0x39, 0xEF, 0x28, 0xD4, 0xD1, 0xFB, 0x1D, 0xE5, 0x67, 0x0B, 0x64, 0xF3, + 0x94, 0x16, 0x7B, 0xFC, 0xDE, 0x1B, 0xC7, 0xFC, 0x1A, 0x15, 0x57, 0xFC, + 0xE6, 0x12, 0x03, 0x0F, 0x0B, 0x1D, 0xB0, 0x1A, 0xDF, 0x31, 0xF1, 0x22, + 0x1D, 0x41, 0xC5, 0x30, 0x0E, 0x44, 0x8C, 0x33, 0x1B, 0x3E, 0xA5, 0x31, + 0x73, 0x3D, 0x4F, 0x39, 0x44, 0x42, 0x59, 0x41, 0x50, 0x3D, 0x8C, 0x45, + 0x3C, 0x2B, 0x74, 0x42, 0xE8, 0x2C, 0xE0, 0x41, 0x53, 0x3F, 0x48, 0x49, + 0x80, 0x34, 0xF2, 0x3D, 0xCE, 0x28, 0x99, 0x34, 0x88, 0x2A, 0xD9, 0x35, + 0xDA, 0x25, 0xB8, 0x34, 0x07, 0x2A, 0x8B, 0x32, 0x89, 0x34, 0x53, 0x2D, + 0xB0, 0x29, 0xE5, 0x26, 0xE9, 0x1F, 0xF8, 0x25, 0x91, 0x24, 0xD8, 0x31, + 0xCC, 0x1F, 0x4A, 0x32, 0xFB, 0x21, 0x42, 0x2A, 0xD7, 0x36, 0x90, 0x29, + 0x55, 0x3F, 0x0C, 0x0F, 0xD6, 0x39, 0x68, 0x07, 0x0D, 0x25, 0x05, 0x15, + 0x88, 0x07, 0xE2, 0x0F, 0xBC, 0x03, 0x11, 0x17, 0x12, 0x14, 0x8B, 0x1F, + 0xB1, 0x1B, 0xBF, 0x17, 0x3E, 0x26, 0xA7, 0x16, 0x57, 0x31, 0x39, 0x2A, + 0x3E, 0x1F, 0xDD, 0x25, 0x6B, 0x12, 0x9C, 0x1A, 0x22, 0x1A, 0xEA, 0x25, + 0xEE, 0x11, 0x32, 0x1F, 0xF5, 0x09, 0x37, 0x18, 0xDE, 0x1A, 0x6B, 0x22, + 0x12, 0x22, 0x5E, 0x26, 0x30, 0x0B, 0xFA, 0x1C, 0x52, 0xFA, 0xA2, 0x14, + 0x04, 0x06, 0x17, 0x1F, 0x65, 0x0E, 0x66, 0x27, 0xBF, 0x0B, 0xA6, 0x1F, + 0xB0, 0x0E, 0x44, 0x20, 0x29, 0x04, 0x85, 0x1B, 0xCB, 0xF8, 0xC0, 0x0B, + 0x6D, 0xFE, 0xA1, 0x13, 0x0A, 0xFB, 0xC6, 0x1C, 0xDD, 0xF7, 0xFD, 0x1B, + 0x00, 0x06, 0x11, 0x20, 0xF5, 0x07, 0x16, 0x13, 0x8F, 0xF1, 0x3F, 0xF1, + 0x60, 0xE3, 0xFC, 0xD8, 0x05, 0xEE, 0x84, 0xE4, 0x73, 0xF5, 0x29, 0xEC, + 0x53, 0xF1, 0xD5, 0xE2, 0xEA, 0xF9, 0x3A, 0xF1, 0x4C, 0xFD, 0x3C, 0x00, + 0xA2, 0xE9, 0x52, 0xFE, 0x5F, 0xDB, 0x27, 0xFE, 0x19, 0xD9, 0x68, 0xFC, + 0x57, 0xDF, 0x13, 0xF3, 0xAF, 0xED, 0x23, 0xE5, 0xA3, 0xF6, 0x4E, 0xE5, + 0x44, 0xF3, 0xF9, 0xE5, 0x55, 0xEE, 0x5E, 0xEB, 0x01, 0xEA, 0xC7, 0xFC, + 0xBE, 0xE7, 0x60, 0xF9, 0x97, 0xF9, 0x9A, 0xFD, 0x3A, 0x0D, 0x10, 0x05, + 0xD6, 0x0B, 0xB7, 0xF0, 0x99, 0x11, 0x1A, 0xE6, 0x6B, 0x15, 0x5E, 0xEF, + 0x54, 0xFA, 0xB6, 0xEF, 0x93, 0xE7, 0x45, 0xF5, 0x31, 0xE1, 0x05, 0xFD, + 0x6C, 0xE5, 0xB8, 0xF2, 0xDB, 0xFA, 0xB8, 0xE8, 0x0B, 0x05, 0x91, 0xEA, + 0x5B, 0x0D, 0x26, 0xFC, 0xF0, 0x11, 0x7E, 0x0E, 0x4B, 0x12, 0x6E, 0x15, + 0x15, 0x1A, 0x22, 0x1A, 0xA7, 0x0C, 0x4B, 0x09, 0x22, 0xFB, 0xBD, 0xF4, + 0xE2, 0xF8, 0xBE, 0xF8, 0xFB, 0xFB, 0x38, 0x03, 0xE9, 0xF9, 0xB0, 0xFF, + 0x45, 0xFE, 0x25, 0xFF, 0x9F, 0x02, 0x36, 0xFF, 0x56, 0xF6, 0xDA, 0xF1, + 0x5C, 0xFA, 0x4B, 0xF5, 0xD9, 0xF9, 0xA6, 0xF4, 0x33, 0xF3, 0x41, 0xEB, + 0x4E, 0xF5, 0xEF, 0xF2, 0xD1, 0xEF, 0xCA, 0xF1, 0xCB, 0xF9, 0x94, 0xF1, + 0x46, 0x08, 0x40, 0xFC, 0x00, 0x09, 0xEA, 0xF7, 0x8C, 0x0D, 0x10, 0xF7, + 0xAC, 0x07, 0x8F, 0xF5, 0xD9, 0xFB, 0x09, 0xEF, 0x2A, 0x06, 0x70, 0xF8, + 0x96, 0x0E, 0x74, 0x02, 0xE0, 0x03, 0x87, 0x01, 0xB1, 0x03, 0x44, 0x06, + 0x43, 0x07, 0x30, 0x0B, 0x67, 0xFC, 0xFC, 0x05, 0xC0, 0xF9, 0xCB, 0x18, + 0x26, 0x01, 0xD0, 0x2D, 0x43, 0x17, 0x08, 0x2D, 0x9B, 0x1D, 0x8C, 0x21, + 0x6A, 0x03, 0x88, 0x13, 0xD6, 0xFD, 0xF1, 0x1E, 0x8D, 0x12, 0x01, 0x41, + 0xE3, 0x0C, 0x32, 0x49, 0x29, 0xFB, 0xB0, 0x31, 0xC1, 0x06, 0x01, 0x1D, + 0xC3, 0x19, 0x8E, 0x11, 0xED, 0x16, 0xB1, 0x0A, 0xDE, 0x06, 0x70, 0x01, + 0x8D, 0x07, 0x2F, 0xFD, 0x20, 0x0E, 0xD5, 0x01, 0x0E, 0x04, 0x85, 0xFD, + 0x66, 0xF6, 0xE0, 0xF5, 0x66, 0xEE, 0x94, 0x00, 0x50, 0xEA, 0x4E, 0x10, + 0x6F, 0xE6, 0xFE, 0x0D, 0x3F, 0xEA, 0xA4, 0x08, 0xD1, 0xE8, 0x18, 0xF7, + 0x3F, 0xE0, 0x05, 0xE5, 0xC7, 0xF3, 0x07, 0xFB, 0xCC, 0x04, 0x4F, 0x09, + 0xF6, 0xF5, 0xD1, 0xF8, 0xC7, 0xE4, 0x62, 0xF9, 0x2F, 0xD9, 0x4E, 0xFB, + 0xA7, 0xD4, 0x0A, 0xF5, 0x34, 0xD7, 0xDF, 0xFA, 0x91, 0xE6, 0x1F, 0x03, + 0xA0, 0xF9, 0x84, 0x05, 0x7B, 0xFF, 0xB2, 0x06, 0x55, 0xF4, 0x5F, 0x00, + 0x6B, 0xE7, 0xBF, 0xF5, 0x70, 0xEE, 0xC2, 0xFA, 0xF8, 0xEC, 0x33, 0xFD, + 0xD2, 0xEA, 0x99, 0xFF, 0xC2, 0xF7, 0x3D, 0x06, 0x4F, 0xE8, 0x88, 0xF4, + 0xDF, 0xD8, 0x34, 0xED, 0xBA, 0xF2, 0x6A, 0xFD, 0x29, 0x03, 0xD9, 0xF1, + 0x14, 0x0C, 0x96, 0xE4, 0xFC, 0x18, 0x66, 0xEE, 0x62, 0x08, 0x57, 0xEF, + 0xF5, 0x05, 0x5C, 0xFF, 0x6C, 0x0B, 0x07, 0x09, 0x9E, 0x07, 0x5E, 0x01, + 0x1F, 0x14, 0xCE, 0x10, 0x25, 0x0E, 0x45, 0x12, 0xC4, 0x06, 0xA3, 0x1B, + 0x55, 0x0E, 0x5E, 0x2C, 0x93, 0x12, 0x2B, 0x1D, 0x32, 0x19, 0xF2, 0x0A, + 0x45, 0x17, 0x9C, 0xF4, 0xFB, 0x1E, 0x5F, 0xFA, 0x5A, 0x2A, 0xC4, 0x14, + 0xE4, 0x1F, 0x65, 0x17, 0x2A, 0x1A, 0xFA, 0x19, 0x07, 0x21, 0x4C, 0x25, + 0x0A, 0x22, 0x80, 0x1E, 0x51, 0x26, 0xBF, 0x16, 0x0E, 0x1F, 0x4A, 0x0F, + 0x0F, 0x11, 0x16, 0xFB, 0x5E, 0x1B, 0x1E, 0xFC, 0x7E, 0x0E, 0x57, 0xF3, + 0xCC, 0xF8, 0x2E, 0xEA, 0xD7, 0x02, 0x75, 0xFF, 0x84, 0x0E, 0x06, 0x07, + 0x81, 0x09, 0x98, 0xFA, 0xCF, 0x06, 0x6E, 0xF5, 0x55, 0x03, 0xA9, 0xEC, + 0xBF, 0xF0, 0x21, 0xDA, 0x04, 0xE9, 0xA0, 0xDD, 0x53, 0xF6, 0xDB, 0xF2, + 0xD6, 0x0A, 0xAB, 0xFB, 0x9F, 0x0D, 0x79, 0xEF, 0x79, 0x07, 0xE2, 0xEB, + 0x1E, 0xFD, 0x95, 0xF3, 0xD8, 0xED, 0x8B, 0xF4, 0xD8, 0xEC, 0xB4, 0xF9, + 0x4F, 0xEB, 0x04, 0xFB, 0x43, 0xF6, 0x08, 0xF5, 0x94, 0x09, 0x54, 0xF4, + 0x28, 0x00, 0xCF, 0xF9, 0xE1, 0xF6, 0xD6, 0x03, 0x00, 0xF8, 0x5F, 0x06, + 0xA9, 0xF6, 0xB4, 0xFF, 0xEB, 0x00, 0x1C, 0x00, 0x6B, 0x11, 0x3D, 0x02, + 0xD8, 0x11, 0x4A, 0x03, 0xB2, 0xFC, 0x0C, 0x02, 0xF2, 0xFB, 0xC9, 0x08, + 0x8E, 0x09, 0xA2, 0x17, 0x1A, 0xFC, 0xFF, 0x11, 0xED, 0xEC, 0x29, 0x08, + 0x8C, 0xF4, 0x53, 0x0A, 0xF9, 0xFC, 0x28, 0x07, 0x84, 0xFB, 0x2C, 0x04, + 0xAC, 0xFC, 0x1B, 0x07, 0x18, 0xFD, 0x4B, 0x06, 0x33, 0x0C, 0xD2, 0x17, + 0x97, 0x10, 0x5A, 0x1F, 0x8A, 0xF9, 0x87, 0x05, 0x08, 0xEF, 0xA5, 0xF4, + 0x7F, 0xEE, 0x5A, 0xF6, 0xB6, 0xEC, 0x89, 0xFE, 0xA8, 0xE9, 0x74, 0x01, + 0xBE, 0xE8, 0xA9, 0xF5, 0x00, 0xEF, 0x3E, 0xED, 0x4E, 0xFD, 0xC6, 0xFA, + 0x92, 0xFF, 0x1D, 0x04, 0x24, 0xE6, 0xDB, 0xF7, 0xFA, 0xD4, 0x82, 0xED, + 0x71, 0xEB, 0x4F, 0xFC, 0x7D, 0x01, 0xB5, 0x07, 0xF5, 0xF0, 0x1F, 0xF4, + 0x96, 0xDD, 0x95, 0xE2, 0x88, 0xE8, 0x3F, 0xF3, 0xBC, 0xED, 0xED, 0x00, + 0x24, 0xE4, 0x75, 0xF9, 0xA2, 0xF0, 0x6F, 0xFC, 0xD7, 0xF6, 0xEC, 0xE7, + 0x36, 0xFC, 0x84, 0xD3, 0x3C, 0x03, 0xC2, 0xD8, 0xEA, 0xF5, 0x14, 0xD9, + 0x1D, 0xFD, 0x62, 0xEC, 0x12, 0x06, 0xE0, 0xFE, 0xEF, 0xFC, 0x51, 0xFC, + 0xB8, 0xFE, 0x5C, 0xF8, 0x9B, 0xF9, 0x6F, 0xEA, 0x20, 0xF2, 0xF3, 0xDD, + 0x45, 0xEC, 0x6A, 0xD5, 0x93, 0xE2, 0x34, 0xCD, 0x99, 0xE2, 0x33, 0xD3, + 0xD5, 0xE3, 0x81, 0xDA, 0xC7, 0xE6, 0xA9, 0xDF, 0xBF, 0xE9, 0xC7, 0xE1, + 0x64, 0xEF, 0x52, 0xDC, 0xFA, 0xF9, 0xB3, 0xDA, 0x9B, 0xF1, 0x55, 0xD3, + 0xF2, 0xDA, 0x16, 0xC9, 0x4D, 0xD4, 0xC7, 0xCD, 0x23, 0xE0, 0x57, 0xDA, + 0x6A, 0xE4, 0x5D, 0xD7, 0x92, 0xDE, 0xBB, 0xC2, 0x2F, 0xD7, 0xC7, 0xB8, + 0x2B, 0xC3, 0x46, 0xBA, 0xC5, 0xC5, 0x4F, 0xC6, 0x62, 0xE5, 0xE4, 0xD8, + 0x19, 0xF2, 0xDE, 0xD7, 0x27, 0xF8, 0x19, 0xD7, 0xF9, 0xFE, 0xCF, 0xE2, + 0xAE, 0xF4, 0xCD, 0xDF, 0xE4, 0xE3, 0x29, 0xCD, 0x59, 0xE6, 0xE1, 0xCA, + 0x7B, 0xF3, 0xB8, 0xD7, 0x20, 0xFE, 0x6F, 0xDF, 0xFA, 0x01, 0x1A, 0xE0, + 0x0A, 0x07, 0x2F, 0xE9, 0x5E, 0xF9, 0xD0, 0xEE, 0xF1, 0xD3, 0xDC, 0xEB, + 0xA8, 0xCA, 0xF8, 0xF3, 0xF7, 0xC8, 0xC5, 0xEC, 0xEB, 0xCF, 0xDD, 0xE3, + 0xFE, 0xE6, 0x2B, 0xEB, 0x15, 0xE9, 0x8D, 0xEA, 0x37, 0xE2, 0xC0, 0xE5, + 0x97, 0xE0, 0x78, 0xE8, 0x94, 0xDB, 0x7D, 0xE7, 0x99, 0xD9, 0xD9, 0xDB, + 0xE3, 0xE4, 0x14, 0xD5, 0x6E, 0xF0, 0xB2, 0xD4, 0x0A, 0xE9, 0x42, 0xCB, + 0x02, 0xD9, 0xFD, 0xCA, 0x0C, 0xCD, 0x3C, 0xD2, 0x38, 0xD1, 0xF4, 0xD3, + 0x73, 0xEC, 0x2B, 0xE3, 0xBC, 0xF8, 0x1A, 0xE9, 0x9F, 0xE5, 0x68, 0xDA, + 0x41, 0xEA, 0x96, 0xEB, 0xAE, 0xF4, 0xDD, 0xFF, 0x9B, 0xE0, 0xFD, 0xF7, + 0xFB, 0xE3, 0xF6, 0x01, 0x2D, 0xFC, 0x74, 0x09, 0x56, 0xFF, 0x85, 0xFC, + 0x96, 0xFF, 0xAE, 0xFD, 0x32, 0x00, 0x4D, 0x01, 0xBA, 0xFA, 0x21, 0xFB, + 0xBC, 0xFA, 0xE9, 0xFB, 0xDE, 0x04, 0x49, 0x0F, 0x63, 0x12, 0x77, 0x1C, + 0xC7, 0x18, 0x5A, 0x0F, 0xE4, 0x0D, 0x95, 0xFC, 0xCC, 0xF9, 0x55, 0xEF, + 0xC3, 0xFA, 0x0C, 0xF8, 0xF2, 0xFB, 0xC3, 0x0A, 0x2B, 0xF9, 0x1A, 0x14, + 0x3D, 0x0E, 0x39, 0x22, 0x55, 0x1E, 0x66, 0x29, 0x1F, 0x1F, 0x6C, 0x24, + 0x51, 0x20, 0x2E, 0x26, 0xCA, 0x19, 0x36, 0x30, 0xC6, 0x07, 0x8E, 0x2A, + 0x3D, 0x07, 0x9C, 0x1F, 0xDB, 0x1E, 0x0E, 0x20, 0x77, 0x29, 0x1D, 0x15, + 0x7E, 0x21, 0xCE, 0x0B, 0x6A, 0x18, 0x37, 0x15, 0x9F, 0x11, 0x11, 0x29, + 0x6E, 0x07, 0xB2, 0x29, 0x72, 0x08, 0x1F, 0x1C, 0x82, 0x15, 0xC3, 0x23, + 0x65, 0x1C, 0xAA, 0x2B, 0x11, 0x25, 0x14, 0x27, 0x60, 0x34, 0x67, 0x26, + 0x7A, 0x3D, 0x15, 0x21, 0xF2, 0x3F, 0xE6, 0x10, 0x8E, 0x46, 0x58, 0x13, + 0x32, 0x49, 0xE0, 0x26, 0x15, 0x41, 0x71, 0x2B, 0xDC, 0x32, 0xE3, 0x26, + 0x12, 0x2F, 0x2F, 0x31, 0x2B, 0x2C, 0x4A, 0x39, 0xBB, 0x20, 0x6C, 0x30, + 0xAD, 0x21, 0x03, 0x2B, 0x72, 0x23, 0x00, 0x22, 0x1F, 0x26, 0x3F, 0x1A, + 0x1C, 0x2A, 0xBB, 0x23, 0x29, 0x2A, 0x72, 0x32, 0x20, 0x2E, 0x7D, 0x3C, + 0x2D, 0x36, 0x40, 0x4B, 0xCA, 0x3A, 0x49, 0x4E, 0x64, 0x33, 0xD4, 0x30, + 0xBC, 0x2D, 0x7A, 0x10, 0xCC, 0x1F, 0x99, 0xFF, 0xEB, 0x0F, 0xD2, 0x08, + 0x73, 0x10, 0x07, 0x21, 0xC9, 0x11, 0x1B, 0x2B, 0x99, 0x1A, 0xFF, 0x29, + 0x52, 0x29, 0x1F, 0x22, 0xE0, 0x18, 0x09, 0x05, 0x12, 0xFD, 0x71, 0xF1, + 0xA9, 0x01, 0x01, 0x00, 0xA4, 0x07, 0x4F, 0x02, 0x43, 0xF6, 0x63, 0xED, + 0xCE, 0xED, 0x5C, 0xE7, 0x02, 0xF1, 0x2E, 0xF1, 0xC2, 0xF1, 0x1E, 0xF4, + 0xA6, 0xF5, 0x68, 0xF4, 0x14, 0x02, 0x86, 0xFF, 0xD2, 0x12, 0x19, 0x11, + 0x37, 0x17, 0xBA, 0x1E, 0xBC, 0x0F, 0x88, 0x26, 0x03, 0x09, 0xF4, 0x23, + 0xC1, 0x07, 0x48, 0x13, 0x82, 0x0F, 0xB7, 0x0D, 0xC0, 0x19, 0xFD, 0x20, + 0xA4, 0x15, 0x4F, 0x2C, 0x81, 0x13, 0xE4, 0x29, 0x89, 0x28, 0x1D, 0x30, + 0x64, 0x32, 0x3C, 0x31, 0x4D, 0x21, 0xF9, 0x27, 0x31, 0x12, 0xAB, 0x24, + 0x0E, 0x0A, 0x36, 0x24, 0x48, 0x03, 0xCC, 0x1D, 0xF8, 0xF8, 0x4F, 0x05, + 0xBC, 0xFE, 0x64, 0xFA, 0x2B, 0x08, 0xF6, 0xFF, 0xEE, 0x02, 0x32, 0xFD, + 0x3D, 0xF8, 0xBD, 0xFB, 0x2F, 0xEE, 0xE1, 0x05, 0x36, 0xF5, 0xC2, 0x11, + 0x5C, 0x02, 0xB9, 0x06, 0xAA, 0x0F, 0x02, 0x01, 0x82, 0xFE, 0x4B, 0xF8, + 0xB1, 0xDD, 0x0D, 0xEA, 0x2A, 0xD3, 0x9F, 0xF4, 0xB0, 0xCD, 0x2D, 0xFF, + 0xAE, 0xE2, 0x14, 0x08, 0x7D, 0xFC, 0xA7, 0x04, 0xB5, 0xF6, 0x79, 0xF1, + 0x04, 0xF1, 0x91, 0xEC, 0x35, 0xF5, 0x2E, 0xE8, 0x50, 0xFC, 0x7D, 0xE4, + 0xF0, 0xF9, 0xCE, 0xDB, 0x5A, 0xEF, 0x7F, 0xCB, 0x57, 0xF4, 0x4D, 0xD8, + 0xC4, 0xFB, 0xAE, 0xEA, 0x98, 0xF5, 0xCB, 0xE5, 0x6B, 0xF5, 0xFB, 0xED, + 0x2A, 0x01, 0xF4, 0x04, 0x59, 0x05, 0xA0, 0xFD, 0xD8, 0x04, 0x89, 0xEA, + 0x4A, 0x09, 0x71, 0xE7, 0xB0, 0x09, 0xF2, 0xE4, 0xFC, 0x01, 0x25, 0xE5, + 0x44, 0xFF, 0x24, 0xF3, 0x24, 0xF6, 0x11, 0xFE, 0x8D, 0xEC, 0x57, 0x01, + 0x81, 0xF2, 0x4D, 0x05, 0x26, 0xF7, 0x49, 0x03, 0xE8, 0xF4, 0xE3, 0xF8, + 0x9F, 0xEA, 0xCC, 0xF0, 0xF8, 0xED, 0xC3, 0xFC, 0x74, 0xFC, 0x84, 0x02, + 0xB2, 0xFD, 0xAB, 0xFA, 0x67, 0xF9, 0x96, 0x01, 0xB3, 0xF0, 0xDA, 0x03, + 0xB8, 0xF4, 0x02, 0x09, 0xE9, 0xF4, 0xD0, 0x0D, 0x2D, 0xE9, 0xC1, 0x04, + 0xB0, 0xF2, 0x4D, 0x0E, 0x9B, 0xFA, 0x3E, 0x14, 0x71, 0xF0, 0xEE, 0xF6, + 0x93, 0xF2, 0xC5, 0xE6, 0x7E, 0xF8, 0x63, 0xEB, 0x2B, 0xEC, 0x09, 0xE0, + 0x84, 0xF3, 0xBC, 0xE2, 0x62, 0x0F, 0x8D, 0xFC, 0x27, 0x12, 0x08, 0x08, + 0xB9, 0x07, 0x54, 0x0B, 0x45, 0x09, 0x5D, 0x13, 0xA9, 0x0F, 0xF3, 0x16, + 0xFE, 0x11, 0x2E, 0x1D, 0x37, 0x0D, 0xC3, 0x17, 0x8F, 0x0B, 0xD3, 0x0A, + 0xCC, 0x0B, 0xA4, 0x10, 0x83, 0x09, 0xFD, 0x17, 0xB1, 0x04, 0x16, 0x13, + 0xE8, 0x0A, 0xDE, 0x19, 0x54, 0x18, 0x23, 0x27, 0x7C, 0x16, 0x9E, 0x20, + 0xB8, 0x16, 0x3C, 0x1A, 0x8C, 0x14, 0xE5, 0x13, 0x25, 0x19, 0x1F, 0x0B, + 0x11, 0x24, 0x62, 0x04, 0xB8, 0x13, 0x2C, 0xFF, 0xBC, 0xFE, 0x2E, 0x08, + 0xBD, 0xFB, 0xED, 0x0F, 0x1A, 0x00, 0x48, 0x16, 0xD5, 0x03, 0xC9, 0x21, + 0x21, 0x0F, 0x71, 0x27, 0x79, 0x1C, 0xC1, 0x2E, 0xB0, 0x19, 0x6B, 0x30, + 0x15, 0x05, 0x26, 0x1D, 0xEE, 0xFE, 0x30, 0x16, 0x4B, 0x0F, 0xFC, 0x21, + 0x50, 0x0B, 0x6F, 0x1E, 0x5F, 0xF2, 0xFB, 0x07, 0x1D, 0xEE, 0xF7, 0xF8, + 0x01, 0xF5, 0xAF, 0xF2, 0x37, 0xED, 0x08, 0xE8, 0x0C, 0xF2, 0x5F, 0xEE, + 0x6E, 0x00, 0xF1, 0xF4, 0x1A, 0x0A, 0x32, 0xF3, 0xE6, 0x1B, 0x75, 0x01, + 0x87, 0x10, 0x0D, 0x02, 0x9C, 0xF3, 0x55, 0xF7, 0x73, 0xF6, 0x19, 0xFE, + 0x75, 0xFC, 0x0D, 0xFD, 0x57, 0xFA, 0x41, 0xF2, 0x15, 0x01, 0xC8, 0xFC, + 0x0D, 0x04, 0xF5, 0x0D, 0x8A, 0xFB, 0x6D, 0x09, 0x3A, 0x05, 0x31, 0x14, + 0x25, 0x12, 0x35, 0x25, 0xA7, 0x04, 0xCB, 0x09, 0x4E, 0x08, 0x6E, 0xF1, + 0xBC, 0x1D, 0x6B, 0xFF, 0x5B, 0x12, 0x62, 0x01, 0xC3, 0xF2, 0x8F, 0xF2, + 0xD6, 0xEC, 0xFB, 0xF4, 0xFE, 0xF9, 0xC2, 0xF8, 0xF9, 0xFB, 0xC4, 0xEE, + 0xE7, 0x01, 0xA4, 0xE8, 0xB2, 0x0A, 0x09, 0xE4, 0x72, 0x02, 0x54, 0xDA, + 0x0A, 0xFD, 0x96, 0xDF, 0xAC, 0xF6, 0x28, 0xE7, 0x6F, 0xEA, 0x88, 0xDD, + 0x69, 0xE5, 0x96, 0xD4, 0x48, 0xE4, 0xB3, 0xD7, 0x26, 0xE3, 0x95, 0xDE, + 0x3A, 0xE7, 0xE2, 0xE3, 0xEC, 0xEE, 0x69, 0xEA, 0x11, 0xF6, 0xEC, 0xFA, + 0x96, 0x02, 0x38, 0x10, 0x4E, 0x07, 0x26, 0x12, 0xD6, 0xF9, 0x9F, 0x00, + 0x45, 0xF5, 0x6C, 0xFC, 0x49, 0xF1, 0xC6, 0x01, 0xB9, 0xDB, 0xB8, 0x03, + 0x31, 0xE2, 0x87, 0x18, 0x6F, 0xF6, 0x92, 0x1A, 0x38, 0xFF, 0xE6, 0x08, + 0xAB, 0x08, 0x62, 0x02, 0x3D, 0x10, 0xA8, 0xFB, 0x33, 0x11, 0x46, 0xF6, + 0xAD, 0xFD, 0x19, 0xEF, 0x2A, 0xF4, 0xE1, 0xF2, 0x2B, 0xF5, 0x2D, 0xEC, + 0xC8, 0xF1, 0xCE, 0xE0, 0x91, 0xF0, 0x43, 0xE8, 0x14, 0xE2, 0x8E, 0xE3, + 0xCD, 0xD8, 0x84, 0xE0, 0xAA, 0xEE, 0x19, 0xF6, 0x27, 0x00, 0xE5, 0xFF, + 0x8C, 0xF6, 0xAB, 0xEF, 0x13, 0xFA, 0x91, 0xEC, 0x31, 0x00, 0x7C, 0xF6, + 0xB6, 0xEA, 0xC7, 0xF5, 0xF3, 0xD7, 0xC3, 0xF0, 0x52, 0xDA, 0xAE, 0xF2, + 0xA2, 0xE8, 0x3E, 0x01, 0x81, 0xF3, 0xDD, 0x0E, 0xF1, 0xF8, 0xF0, 0x12, + 0x55, 0xFB, 0x53, 0x0F, 0xE3, 0xFE, 0x47, 0x0B, 0xDF, 0xFD, 0x39, 0x01, + 0xDA, 0xE6, 0x11, 0xE5, 0xC0, 0xDB, 0xBC, 0xD8, 0x53, 0xEA, 0x84, 0xE1, + 0xFE, 0xF7, 0x65, 0xE8, 0x79, 0xFD, 0x53, 0xF3, 0x65, 0xF9, 0x2C, 0x02, + 0xCC, 0xEA, 0x84, 0xFA, 0x36, 0xE3, 0x12, 0xE6, 0x27, 0xF6, 0x2D, 0xF1, + 0xA5, 0xF9, 0x30, 0xF0, 0xE7, 0xE6, 0x30, 0xD1, 0x16, 0xEA, 0xBD, 0xCF, + 0xFE, 0xEE, 0x27, 0xE4, 0x6D, 0xDE, 0xB2, 0xEF, 0xE9, 0xD3, 0x68, 0xF7, + 0x43, 0xE6, 0xA2, 0xFB, 0x26, 0xF5, 0x9D, 0xED, 0x58, 0xF9, 0x93, 0xE1, + 0x77, 0x01, 0x0F, 0xE3, 0xDF, 0xF0, 0x0E, 0xE0, 0x84, 0xDA, 0xA0, 0xE5, + 0x6A, 0xDB, 0x29, 0xF4, 0x04, 0xE1, 0x04, 0xF8, 0x69, 0xE2, 0x54, 0xED, + 0xF0, 0xE7, 0x4B, 0xE5, 0x61, 0xED, 0xCF, 0xDD, 0x65, 0xEC, 0x21, 0xC9, + 0x26, 0xFA, 0x0C, 0xC6, 0x6D, 0x0D, 0x81, 0xD8, 0x88, 0x18, 0xFE, 0xE9, + 0x42, 0x18, 0x56, 0xEF, 0x44, 0x03, 0x5F, 0xE5, 0xEE, 0xF4, 0x60, 0xE0, + 0xC4, 0xF1, 0xEF, 0xE4, 0x62, 0xF0, 0x0D, 0xF1, 0xDF, 0xF0, 0x34, 0xF8, + 0x68, 0xF7, 0xAA, 0xF4, 0x4C, 0x07, 0xD1, 0xF7, 0xEA, 0x07, 0x32, 0xFF, + 0xAD, 0xFD, 0x3B, 0x00, 0x54, 0xFB, 0xA0, 0xFC, 0x40, 0xF6, 0x6F, 0xFE, + 0x8D, 0xE7, 0x45, 0xFE, 0x14, 0xE5, 0x70, 0xF9, 0x72, 0xEF, 0x59, 0xF8, + 0x01, 0xF2, 0xB2, 0xF6, 0x92, 0xF6, 0x45, 0xF8, 0x9A, 0xF0, 0x8B, 0xF8, + 0xE4, 0xE2, 0xF8, 0xF1, 0x5B, 0xF5, 0x16, 0xFB, 0x32, 0x0B, 0x5F, 0x0C, + 0x1A, 0x00, 0xBA, 0x02, 0xB7, 0xF4, 0xCC, 0xFB, 0xD7, 0xEB, 0xED, 0x05, + 0xCC, 0xE8, 0x72, 0x12, 0x71, 0xEF, 0x3C, 0x12, 0x9D, 0xF7, 0x0B, 0xFF, + 0xB2, 0x03, 0x2B, 0xEC, 0x7E, 0x02, 0xEF, 0xDE, 0xBF, 0x04, 0xFC, 0xE5, + 0xE9, 0x0A, 0x70, 0xFA, 0x55, 0x03, 0x3D, 0x02, 0xFC, 0xFF, 0x7C, 0xFE, + 0x36, 0x0C, 0xEF, 0x08, 0xFF, 0x09, 0x9D, 0x12, 0x74, 0xF4, 0x4C, 0xFF, + 0x57, 0xFC, 0x1C, 0xFE, 0x8A, 0x09, 0x0E, 0x06, 0x88, 0x0A, 0x16, 0xFD, + 0xB2, 0x14, 0x28, 0x00, 0x90, 0x1A, 0x93, 0x0C, 0x30, 0x21, 0xAF, 0x1F, + 0x98, 0x23, 0x2B, 0x2F, 0x33, 0x18, 0xDF, 0x2B, 0xBC, 0x09, 0x75, 0x20, + 0x77, 0x04, 0xA5, 0x18, 0x5D, 0x08, 0xC5, 0x11, 0x0F, 0x18, 0xE9, 0x0C, + 0x8C, 0x26, 0xDA, 0x04, 0x41, 0x1D, 0xC6, 0xF9, 0x43, 0x12, 0x05, 0x02, + 0xA0, 0x12, 0x33, 0x12, 0x0F, 0x0E, 0x6B, 0x10, 0xE7, 0x11, 0x37, 0x17, + 0x43, 0x11, 0xAE, 0x21, 0x4C, 0x03, 0x5E, 0x16, 0x32, 0x09, 0x9E, 0x11, + 0x1B, 0x0B, 0xDA, 0x0B, 0x75, 0xF8, 0x97, 0xF6, 0x9E, 0xEC, 0xAE, 0xE7, + 0xD8, 0xED, 0xA3, 0xE9, 0x6A, 0xFA, 0x7D, 0xF8, 0x69, 0xF7, 0x9A, 0xF5, + 0xF3, 0xEB, 0x0B, 0xEF, 0x5F, 0xEF, 0xAD, 0xF6, 0x6E, 0xF4, 0x28, 0xF3, + 0x91, 0xFD, 0x92, 0xF0, 0x56, 0x01, 0x59, 0xF0, 0xEB, 0x05, 0x68, 0xF2, + 0xB9, 0x0F, 0xA2, 0xF3, 0xFF, 0x14, 0xF3, 0xF3, 0x03, 0x1A, 0x53, 0x01, + 0x2B, 0x15, 0x24, 0x0C, 0x11, 0x13, 0xB0, 0x19, 0x4A, 0x1A, 0x77, 0x2D, + 0x17, 0x16, 0xAC, 0x31, 0xBE, 0x10, 0x6E, 0x25, 0x04, 0x16, 0xDF, 0x16, + 0x28, 0x1E, 0x42, 0x0D, 0x85, 0x1E, 0x08, 0x07, 0x2F, 0x1C, 0x8C, 0x08, + 0x9E, 0x20, 0x4C, 0x0E, 0x00, 0x20, 0x84, 0x0C, 0xEA, 0x22, 0x16, 0x0C, + 0xA2, 0x20, 0x90, 0x0D, 0xA2, 0x0F, 0x5F, 0x0E, 0x69, 0x05, 0x98, 0x10, + 0x4D, 0x01, 0x6D, 0x0D, 0xF2, 0xFE, 0x01, 0x08, 0xA5, 0xFF, 0xC3, 0xFE, + 0x65, 0x05, 0xFA, 0xF5, 0xAE, 0x11, 0x95, 0xF6, 0x65, 0x18, 0x2E, 0xF6, + 0x6D, 0x1A, 0x3D, 0x02, 0xDF, 0x09, 0xEF, 0x0B, 0xFD, 0xF2, 0x77, 0x04, + 0x9F, 0xF7, 0x7C, 0x07, 0x24, 0xFC, 0x06, 0x01, 0x39, 0xF5, 0x1D, 0xF1, + 0x8A, 0xFC, 0x22, 0xFC, 0x21, 0x0D, 0x75, 0x15, 0x03, 0x14, 0x99, 0x1F, + 0xDC, 0x1B, 0x64, 0x25, 0x20, 0x1C, 0xB9, 0x29, 0xB7, 0x0B, 0xBC, 0x1C, + 0x35, 0x01, 0xC6, 0x09, 0x9F, 0xFF, 0x09, 0xFF, 0x48, 0x01, 0x85, 0xFB, + 0xC5, 0x04, 0xE6, 0xFE, 0x1A, 0xFB, 0x97, 0xFC, 0xE6, 0xFA, 0xFE, 0xFF, + 0x37, 0x12, 0xFD, 0x10, 0xAC, 0x1A, 0xA9, 0x11, 0x46, 0x17, 0x6B, 0x06, + 0xCE, 0x1A, 0x3E, 0x04, 0x69, 0x15, 0x32, 0x00, 0xBE, 0x04, 0xAB, 0xFF, + 0xA4, 0xF0, 0xFB, 0x05, 0x9B, 0xDF, 0xEE, 0x02, 0xA0, 0xE7, 0x8E, 0x05, + 0x3B, 0x03, 0xA0, 0x0C, 0xD8, 0x05, 0x94, 0xFD, 0xA9, 0xF8, 0xCB, 0xF4, + 0x1A, 0xF4, 0x1B, 0xF7, 0xFC, 0xE9, 0xC4, 0xED, 0xCC, 0xEB, 0x91, 0xFC, + 0x38, 0xF4, 0x8D, 0x0F, 0xD9, 0xF2, 0x61, 0x07, 0xA9, 0xF2, 0xA0, 0x01, + 0x3B, 0xF6, 0xA8, 0x08, 0x52, 0xF3, 0x07, 0x06, 0xF4, 0xE2, 0x17, 0xF1, + 0x4A, 0xEA, 0x24, 0xED, 0x73, 0xFE, 0xF7, 0xF1, 0x59, 0xF8, 0xA8, 0xE8, + 0x79, 0xF3, 0x8E, 0xE9, 0x5C, 0xF8, 0x0D, 0xFA, 0xF8, 0xF2, 0x9D, 0xFA, + 0x1A, 0xE5, 0x19, 0xEC, 0x2F, 0xDA, 0xC5, 0xEA, 0x4F, 0xDD, 0x3E, 0xEB, + 0x09, 0xEB, 0x18, 0xE7, 0x0E, 0xFB, 0x77, 0xEE, 0xD2, 0xFB, 0x4E, 0xEE, + 0x65, 0xEF, 0xB1, 0xE3, 0x83, 0xF0, 0x2B, 0xEB, 0x87, 0xEB, 0x24, 0xF3, + 0xE3, 0xE7, 0x2A, 0xFD, 0x70, 0xF2, 0xEA, 0x09, 0x67, 0xEE, 0xB3, 0x05, + 0xF9, 0xE7, 0x73, 0x00, 0xFE, 0xEC, 0xDC, 0x00, 0xB7, 0xF9, 0xF9, 0x0A, + 0xBA, 0x02, 0x6E, 0x11, 0x48, 0x05, 0x51, 0x07, 0xC4, 0x0C, 0x4D, 0x02, + 0xA5, 0x0C, 0x6E, 0x04, 0xA3, 0x09, 0xC7, 0x04, 0x49, 0x05, 0xB0, 0x04, + 0x21, 0x02, 0x43, 0x06, 0x40, 0x05, 0x78, 0x02, 0x6A, 0x07, 0x2D, 0xFF, + 0x14, 0x0B, 0xE4, 0x04, 0x3C, 0x04, 0x1F, 0xFF, 0x29, 0xFA, 0x23, 0xF0, + 0x4E, 0xF6, 0xCA, 0xEB, 0x18, 0xF5, 0x4C, 0xF2, 0x57, 0xFC, 0x2B, 0xFF, + 0xA2, 0xFA, 0x2B, 0xFD, 0x2A, 0xF7, 0x25, 0xFD, 0x88, 0xFF, 0x22, 0x12, + 0x00, 0xFB, 0xB6, 0x16, 0xBD, 0xFB, 0x71, 0x0F, 0xAF, 0x16, 0xC8, 0x13, + 0x3D, 0x2C, 0x79, 0x16, 0x46, 0x2A, 0x83, 0x14, 0x51, 0x1D, 0x39, 0x11, + 0x31, 0x19, 0x4F, 0x0C, 0xB1, 0x16, 0x5B, 0x04, 0x80, 0x0C, 0x20, 0x02, + 0xA2, 0x05, 0x64, 0x06, 0x1D, 0x0F, 0xDD, 0x0F, 0xB1, 0x17, 0xF3, 0x17, + 0x9A, 0x17, 0xF3, 0x13, 0xF0, 0x1F, 0x5C, 0x18, 0xF8, 0x1A, 0x68, 0x20, + 0x9D, 0x0B, 0x8B, 0x1C, 0xA0, 0x0A, 0x36, 0x19, 0xE7, 0x10, 0x33, 0x1A, + 0x2F, 0x18, 0x7A, 0x1B, 0xC0, 0x1C, 0x34, 0x16, 0x62, 0x1B, 0x10, 0x12, + 0x46, 0x14, 0xB2, 0x17, 0x04, 0x0B, 0x67, 0x15, 0xCC, 0x0A, 0x29, 0x0A, + 0x66, 0x1A, 0x10, 0x16, 0x42, 0x16, 0x7E, 0x19, 0x15, 0x05, 0xF8, 0x07, + 0x3D, 0x06, 0x57, 0x0A, 0xE6, 0xFE, 0x18, 0x09, 0x23, 0xF7, 0x03, 0x02, + 0x13, 0xFE, 0x0B, 0x11, 0x27, 0x05, 0x2A, 0x1F, 0xDB, 0x0C, 0x8C, 0x1E, + 0x18, 0x14, 0x1F, 0x20, 0x6A, 0x12, 0xB8, 0x1C, 0x81, 0x13, 0xAF, 0x18, + 0x34, 0x17, 0x22, 0x19, 0xB8, 0x10, 0x53, 0x0E, 0x63, 0x0E, 0x6F, 0x09, + 0xEC, 0x10, 0xB5, 0x0C, 0x3E, 0x1B, 0x5F, 0x11, 0xA2, 0x28, 0xE6, 0x1B, + 0x63, 0x1E, 0x43, 0x21, 0x84, 0x0B, 0xBF, 0x22, 0xE3, 0x0C, 0x69, 0x26, + 0x84, 0x1C, 0xF0, 0x2B, 0xEE, 0x20, 0xD7, 0x28, 0xC4, 0x1C, 0xB6, 0x1B, + 0xA1, 0x13, 0xC1, 0x0B, 0x48, 0x0A, 0x2C, 0x0E, 0x00, 0x0A, 0xF7, 0x18, + 0x21, 0x0F, 0x71, 0x14, 0x0F, 0x1D, 0x3F, 0x19, 0x5A, 0x1D, 0x29, 0x1A, + 0x04, 0x0F, 0xCA, 0x0F, 0xE7, 0x05, 0x85, 0x15, 0x19, 0xF9, 0xCF, 0x1B, + 0xBD, 0xF7, 0x7D, 0x13, 0xDD, 0xFD, 0x5B, 0x01, 0xF8, 0xFD, 0x5C, 0xF1, + 0xF9, 0x07, 0xCC, 0xF0, 0xC9, 0x0A, 0x23, 0xF1, 0xE4, 0x03, 0x26, 0xF5, + 0x83, 0x00, 0x37, 0x02, 0xBD, 0x02, 0x60, 0x08, 0x81, 0x0D, 0x76, 0x0E, + 0x98, 0x05, 0xC6, 0x0C, 0x15, 0xF1, 0xF4, 0x05, 0x8F, 0xEC, 0x08, 0x04, + 0xE2, 0xF2, 0x7E, 0x02, 0x81, 0xF0, 0xD6, 0xFC, 0xC0, 0xEE, 0xB3, 0xF4, + 0xDB, 0x01, 0x96, 0xF4, 0xC9, 0x0D, 0xC4, 0xF3, 0xB8, 0x07, 0xDA, 0xF0, + 0x69, 0x00, 0x90, 0xF4, 0x96, 0xF4, 0xB1, 0xFA, 0x16, 0xEA, 0x95, 0xF6, + 0x61, 0xEA, 0xEA, 0xF1, 0x6D, 0xE6, 0x4A, 0xED, 0x87, 0xE2, 0x83, 0xDF, + 0x0A, 0xF4, 0xAF, 0xDF, 0xC1, 0x08, 0x78, 0xE6, 0xC1, 0x08, 0xEC, 0xEA, + 0x27, 0x01, 0x2E, 0xF3, 0x68, 0xFC, 0xD7, 0xF3, 0x3A, 0xFC, 0xC2, 0xF8, + 0x00, 0x01, 0xEC, 0xFF, 0x76, 0x01, 0xDF, 0xFC, 0x10, 0x02, 0xFF, 0xFC, + 0x49, 0x08, 0x6E, 0x03, 0x26, 0x05, 0xA8, 0x02, 0xD6, 0xF4, 0x3A, 0x00, + 0xB3, 0xEF, 0x09, 0x0D, 0xC9, 0xF6, 0xAC, 0x14, 0xC5, 0xF2, 0x33, 0x07, + 0xD5, 0xF0, 0x94, 0xFB, 0x6A, 0xF7, 0xE3, 0xF6, 0xB1, 0xFB, 0x27, 0xF6, + 0x5A, 0xFF, 0x4B, 0xF7, 0x95, 0xF9, 0xE4, 0xEF, 0x9B, 0xF0, 0xDD, 0xE9, + 0x8B, 0xEE, 0x1D, 0xE0, 0xC1, 0xF0, 0xEB, 0xD1, 0xB0, 0xF4, 0x80, 0xCF, + 0x23, 0xF1, 0xA9, 0xD3, 0x38, 0xF0, 0x73, 0xE4, 0xF0, 0xED, 0x10, 0xEF, + 0x2E, 0xE7, 0xBE, 0xED, 0xBA, 0xE8, 0xFD, 0xEF, 0x4F, 0xE4, 0x4C, 0xE4, + 0x12, 0xE2, 0x55, 0xDD, 0x7C, 0xF0, 0xEF, 0xE5, 0x11, 0xFB, 0xD9, 0xE8, + 0xD8, 0xF5, 0xAF, 0xE3, 0x37, 0xF3, 0x8C, 0xE5, 0x18, 0xFC, 0xCF, 0xEF, + 0x7A, 0x04, 0xB4, 0xFA, 0x48, 0x07, 0x32, 0x09, 0x93, 0x01, 0xD0, 0x12, + 0x14, 0xF2, 0x20, 0x0E, 0xFF, 0xE9, 0x97, 0xFF, 0xA9, 0xEF, 0xC6, 0xF4, + 0x36, 0xF0, 0x31, 0xED, 0x38, 0xED, 0xE5, 0xED, 0x1E, 0xF0, 0x1A, 0xF7, + 0x1B, 0xF7, 0x55, 0xFD, 0x26, 0xFB, 0xB6, 0xFF, 0xCC, 0x02, 0x1F, 0x03, + 0x41, 0x07, 0xF7, 0x06, 0x05, 0xFA, 0x3C, 0x03, 0xD0, 0xF6, 0x11, 0x02, + 0x77, 0xFD, 0x57, 0xFC, 0x60, 0xF9, 0x4C, 0xF2, 0x4C, 0xF1, 0x28, 0xF3, + 0xF9, 0xEF, 0xB4, 0xF3, 0x63, 0xF6, 0xC9, 0xF4, 0x10, 0xFB, 0xE2, 0xFF, + 0x90, 0xFD, 0x9E, 0x0F, 0x24, 0xF6, 0x09, 0x07, 0x8A, 0xE8, 0x3C, 0xEE, + 0x39, 0xF1, 0x7A, 0xEE, 0x92, 0xFF, 0x76, 0xF7, 0xF1, 0xF3, 0x3F, 0xF1, + 0x07, 0xEE, 0xB0, 0xF4, 0xDF, 0xFB, 0x63, 0xFE, 0xED, 0x01, 0x8F, 0xFA, + 0xA4, 0x02, 0xAA, 0xF8, 0xF8, 0x0C, 0xB7, 0x00, 0xB0, 0x17, 0x4D, 0x0B, + 0x94, 0x15, 0x62, 0x10, 0x73, 0x0E, 0x92, 0x0B, 0x47, 0x0C, 0x09, 0x00, + 0x16, 0x0C, 0x79, 0xF0, 0x19, 0x02, 0xA6, 0xE4, 0x6C, 0xF3, 0xF7, 0xE5, + 0x50, 0xF6, 0x09, 0xF3, 0x04, 0x00, 0xE8, 0xFA, 0x59, 0x03, 0x5A, 0x00, + 0x90, 0x0C, 0x01, 0x0B, 0x47, 0x10, 0xD2, 0x0B, 0x84, 0x0B, 0xB6, 0x05, + 0x7D, 0x09, 0x81, 0xFE, 0xB2, 0x0C, 0xE2, 0xFC, 0x04, 0x10, 0x1E, 0x04, + 0xE7, 0x07, 0x90, 0x00, 0x8F, 0x07, 0xDD, 0xF9, 0x41, 0x0C, 0x00, 0xFC, + 0x8E, 0x03, 0xC3, 0xFE, 0x49, 0x02, 0xC4, 0xFF, 0xF9, 0x04, 0x8A, 0xF9, + 0xE9, 0xFB, 0x4A, 0xF0, 0x2D, 0xF9, 0xB4, 0xEF, 0x4C, 0x00, 0x80, 0xF0, + 0xEB, 0xFB, 0x1D, 0xED, 0xE6, 0xEF, 0x6E, 0xEE, 0x99, 0xE6, 0xEA, 0xF5, + 0x25, 0xDC, 0xAD, 0xFD, 0x31, 0xD7, 0xAF, 0xFF, 0xEC, 0xE2, 0x84, 0x02, + 0x3B, 0xF4, 0xB1, 0x05, 0x70, 0xF9, 0xBB, 0xFD, 0x4A, 0xF9, 0x28, 0xFC, + 0x4C, 0xFA, 0x40, 0x00, 0xD4, 0xF7, 0x10, 0xF5, 0x6A, 0xF8, 0xA6, 0xEC, + 0x56, 0xF4, 0xA7, 0xE7, 0x11, 0xED, 0xDC, 0xD9, 0x07, 0xEF, 0x72, 0xD8, + 0x40, 0xF2, 0x35, 0xEB, 0xAC, 0xF4, 0xC4, 0xF8, 0x8E, 0xF8, 0xC8, 0xFB, + 0x2C, 0xF7, 0x53, 0xFC, 0xAF, 0xF4, 0xBE, 0xF7, 0xDB, 0xFE, 0xC0, 0xFC, + 0x8F, 0x00, 0xB1, 0x00, 0xC0, 0xF9, 0x05, 0x05, 0x89, 0xFB, 0x97, 0x0D, + 0xBA, 0xFA, 0x82, 0x05, 0xA0, 0xF9, 0xED, 0xFD, 0x9C, 0x02, 0x6F, 0x04, + 0xE0, 0x11, 0x6A, 0x12, 0xBB, 0x10, 0xF3, 0x12, 0x5D, 0x04, 0x66, 0x05, + 0xD5, 0x02, 0x26, 0x06, 0x80, 0x00, 0x0B, 0x0B, 0xEC, 0xF8, 0xBA, 0x04, + 0xC2, 0xFC, 0xBE, 0x00, 0x2B, 0x05, 0x47, 0x01, 0x57, 0x00, 0x5F, 0xFD, + 0xA5, 0xF9, 0x2D, 0xFB, 0xA5, 0xFA, 0x9D, 0xFC, 0x1E, 0x00, 0x18, 0xFC, + 0xC8, 0xFF, 0xDA, 0xF9, 0x69, 0xFA, 0x0C, 0xF7, 0xAF, 0xFE, 0xCE, 0xF2, + 0xDC, 0xFF, 0x43, 0xEB, 0x26, 0xF3, 0xE1, 0xE5, 0xF0, 0xEA, 0xB4, 0xEB, + 0x99, 0xEA, 0xF5, 0xF3, 0x2D, 0xEA, 0x93, 0xF1, 0x59, 0xEC, 0xEE, 0xED, + 0x72, 0xF6, 0x47, 0xF4, 0x2A, 0xF8, 0x98, 0xED, 0xFD, 0xF3, 0x4E, 0xDF, + 0xD8, 0xF9, 0xD5, 0xE2, 0x89, 0xFA, 0x15, 0xEE, 0x34, 0xF5, 0xB2, 0xF8, + 0x77, 0xF7, 0x73, 0xFC, 0xF0, 0xFE, 0xE7, 0x01, 0xD0, 0xF8, 0xB9, 0x0A, + 0x52, 0xEE, 0xBC, 0x0C, 0xAC, 0xF2, 0x26, 0x06, 0x62, 0xFA, 0xE8, 0xF6, + 0x72, 0x03, 0x68, 0xEC, 0xE0, 0x08, 0xED, 0xE7, 0x53, 0x0B, 0x61, 0xE9, + 0xC9, 0x0C, 0xD4, 0xEE, 0x77, 0xFF, 0x8B, 0xEB, 0x34, 0xEF, 0x9A, 0xEB, + 0x6F, 0xE9, 0xF9, 0xEF, 0xC5, 0xE8, 0x1D, 0xED, 0x30, 0xED, 0x93, 0xE9, + 0x26, 0xF9, 0xF7, 0xE7, 0x33, 0x04, 0x50, 0xE8, 0x22, 0x0D, 0xE5, 0xF3, + 0xBF, 0x0C, 0xCE, 0xF8, 0x79, 0x04, 0x87, 0xF0, 0xA6, 0x08, 0x92, 0xF1, + 0xF2, 0x07, 0xBE, 0xF0, 0x99, 0xF5, 0xD8, 0xEC, 0xC3, 0xE4, 0xAF, 0xF7, + 0xC4, 0xDD, 0xC3, 0x04, 0x98, 0xE2, 0xCB, 0x09, 0xA8, 0xF3, 0x83, 0x0F, + 0x21, 0x06, 0x94, 0x12, 0x2A, 0x0F, 0xB5, 0x0A, 0x32, 0x13, 0xF5, 0x03, + 0x23, 0x0C, 0x80, 0x02, 0x03, 0xFA, 0x61, 0x07, 0x03, 0xF2, 0x7A, 0x11, + 0x60, 0xF4, 0xBB, 0x0F, 0xBC, 0xF3, 0x7F, 0x03, 0x5B, 0xFA, 0x89, 0x03, + 0x24, 0x07, 0xC6, 0x07, 0x46, 0x06, 0x18, 0xFE, 0xE8, 0xFF, 0xD7, 0xF3, + 0xD3, 0x09, 0x76, 0xF6, 0x1C, 0x14, 0xC9, 0xF7, 0xA9, 0x13, 0xC9, 0xF4, + 0x72, 0x0E, 0xEC, 0xF8, 0xE1, 0x00, 0xC9, 0x04, 0xC3, 0xF5, 0xA8, 0x14, + 0x81, 0xF4, 0x14, 0x18, 0x1C, 0x06, 0xAD, 0x15, 0xC9, 0x11, 0x5C, 0x0D, + 0x25, 0x10, 0xCA, 0xFF, 0x14, 0x17, 0x08, 0xFF, 0xF6, 0x19, 0x2D, 0x05, + 0x91, 0x15, 0x45, 0x0D, 0xA8, 0x03, 0x3D, 0x10, 0xBA, 0xF0, 0x18, 0x13, + 0x57, 0xEE, 0x6F, 0x15, 0x34, 0xF9, 0x77, 0x14, 0xA3, 0x0A, 0x39, 0x19, + 0x80, 0x13, 0xC9, 0x1A, 0x96, 0x13, 0xC4, 0x14, 0x53, 0x12, 0x55, 0x0C, + 0x25, 0x16, 0x4B, 0x09, 0x3F, 0x1A, 0xE5, 0x08, 0x3C, 0x15, 0x78, 0x08, + 0x6D, 0x0C, 0x2E, 0x0B, 0x97, 0xFE, 0x5F, 0x0A, 0xEF, 0xF3, 0x81, 0x0B, + 0xF7, 0xF9, 0x04, 0x0C, 0xC5, 0x04, 0x2D, 0x0C, 0x80, 0x08, 0xA5, 0x12, + 0x85, 0x08, 0x08, 0x11, 0x58, 0x0D, 0xA6, 0x0A, 0x05, 0x0F, 0xE2, 0x03, + 0x07, 0x09, 0xF0, 0xFC, 0x02, 0x06, 0x9F, 0x00, 0x23, 0x02, 0x6D, 0x0E, + 0xF0, 0xFF, 0x28, 0x15, 0x97, 0x06, 0x2E, 0x15, 0x51, 0x0F, 0x77, 0x1D, + 0x0B, 0x14, 0xAA, 0x24, 0x0A, 0x13, 0x6A, 0x22, 0xF7, 0x19, 0x21, 0x21, + 0x96, 0x23, 0x18, 0x1E, 0x12, 0x22, 0xDC, 0x17, 0x7B, 0x23, 0xBD, 0x1A, + 0xE0, 0x21, 0xEF, 0x20, 0x78, 0x18, 0xFF, 0x1D, 0x85, 0x13, 0xD2, 0x17, + 0xFA, 0x15, 0xB1, 0x11, 0xCA, 0x15, 0x45, 0x04, 0x8A, 0x10, 0x42, 0xF9, + 0x31, 0x12, 0x6D, 0xFF, 0xB3, 0x11, 0x7C, 0x03, 0x66, 0x06, 0x32, 0xFA, + 0xA6, 0x01, 0x15, 0x00, 0x90, 0x03, 0x16, 0x0F, 0xB8, 0x00, 0x03, 0x0F, + 0x0C, 0x01, 0x97, 0x09, 0x26, 0x0C, 0x01, 0x0B, 0xC8, 0x18, 0xD1, 0x13, + 0xC6, 0x1D, 0x1A, 0x19, 0x29, 0x20, 0xE4, 0x14, 0x93, 0x1D, 0xBA, 0x0A, + 0xFC, 0x18, 0x58, 0x06, 0xAE, 0x1C, 0xB6, 0x0E, 0x8B, 0x14, 0xB4, 0x0F, + 0xCA, 0x02, 0xCB, 0x08, 0x96, 0xF5, 0x25, 0x06, 0x49, 0xEE, 0x0A, 0x02, + 0xAA, 0xF4, 0x50, 0xFD, 0xCD, 0x00, 0xA4, 0x02, 0x28, 0x07, 0xE4, 0x0A, + 0x8D, 0x02, 0x6C, 0x0B, 0x8C, 0xF4, 0xED, 0x07, 0xEB, 0xF0, 0x2B, 0x0B, + 0x8D, 0xFB, 0xA4, 0x12, 0xA8, 0x00, 0xA0, 0x11, 0x2B, 0x07, 0xBE, 0x11, + 0xF4, 0x0D, 0xF8, 0x0F, 0x47, 0x0C, 0x32, 0x0A, 0x3D, 0x0F, 0x84, 0x0D, + 0x81, 0x0C, 0xC1, 0x02, 0x1E, 0x09, 0x94, 0xEC, 0x71, 0x13, 0xD0, 0xEA, + 0xAA, 0x13, 0x2B, 0xF4, 0x45, 0x0A, 0x86, 0xFD, 0xB9, 0x0D, 0x05, 0x0A, + 0x08, 0x0F, 0x1F, 0x16, 0xC5, 0x06, 0xCD, 0x1C, 0x4A, 0x08, 0x3E, 0x1C, + 0x30, 0x0A, 0xEB, 0x11, 0x09, 0x01, 0x84, 0x02, 0x0F, 0xFA, 0x44, 0xFA, + 0xE5, 0xFE, 0x6A, 0x02, 0xFC, 0x02, 0xEE, 0x0E, 0x1E, 0xFD, 0x38, 0x0B, + 0xD1, 0xF6, 0x1B, 0x00, 0xC9, 0xFC, 0xDC, 0xFC, 0xDB, 0x08, 0xFC, 0xFB, + 0xFE, 0x0A, 0x65, 0xF7, 0xC0, 0x07, 0x3B, 0xF7, 0x0F, 0x09, 0xA3, 0xFD, + 0x44, 0x0E, 0xC0, 0x03, 0x3E, 0x0B, 0xD5, 0x03, 0xCE, 0x04, 0x3D, 0x06, + 0x66, 0x04, 0xEE, 0x0D, 0xF5, 0xFA, 0xCE, 0x04, 0x4B, 0xEB, 0x38, 0xF3, + 0x87, 0xF0, 0xA8, 0xF2, 0x23, 0xFE, 0xB2, 0xF5, 0x18, 0xFC, 0x14, 0xF2, + 0xF0, 0xF9, 0x5A, 0xEF, 0x55, 0xF8, 0xF0, 0xEE, 0x36, 0xF0, 0x57, 0xF6, + 0x73, 0xE4, 0x18, 0x00, 0xEB, 0xDC, 0xD8, 0xFE, 0x82, 0xE2, 0x25, 0xFE, + 0x48, 0xE9, 0x50, 0x02, 0x8C, 0xEA, 0x32, 0x03, 0xE2, 0xEE, 0x07, 0x06, + 0x7B, 0xF0, 0xDF, 0x06, 0x73, 0xEE, 0x60, 0x01, 0x85, 0xEC, 0xA2, 0xF0, + 0x85, 0xEC, 0x86, 0xE4, 0x7F, 0xEE, 0xB4, 0xEB, 0x03, 0xEF, 0x08, 0xF4, + 0xB3, 0xF5, 0x0F, 0xFB, 0x7B, 0xFF, 0xBC, 0xFC, 0xBC, 0x04, 0x78, 0xF5, + 0x55, 0x06, 0x82, 0xF5, 0x19, 0x06, 0xB2, 0xFC, 0x55, 0xFE, 0xEC, 0xF8, + 0xC1, 0xED, 0x6F, 0xEA, 0x64, 0xE8, 0x26, 0xE7, 0xB4, 0xEA, 0x0F, 0xED, + 0xBC, 0xE7, 0x84, 0xEE, 0x4C, 0xE6, 0x20, 0xEA, 0x79, 0xE8, 0x99, 0xE1, + 0x3F, 0xF2, 0x93, 0xE6, 0x45, 0xFA, 0x6C, 0xF5, 0x9A, 0xFA, 0x19, 0xF9, + 0x21, 0xF7, 0xD8, 0xF1, 0xC0, 0xF7, 0xE1, 0xF1, 0x88, 0xF9, 0xC9, 0xF7, + 0x76, 0xEE, 0xE6, 0xF1, 0x4C, 0xEB, 0x4A, 0xF3, 0x49, 0xFA, 0xB2, 0x01, + 0xB8, 0x00, 0x93, 0x0A, 0x95, 0xFA, 0x91, 0x0F, 0x65, 0x01, 0x40, 0x13, + 0x91, 0x0F, 0xE0, 0x11, 0x2B, 0x0F, 0x07, 0x0D, 0xF0, 0x0A, 0xBF, 0x05, + 0x40, 0x09, 0xF0, 0xFA, 0xA3, 0x05, 0x61, 0xF7, 0x2B, 0x02, 0x04, 0xFF, + 0xC0, 0x08, 0xE0, 0x0A, 0x50, 0x10, 0xAD, 0x0E, 0xC5, 0x10, 0x83, 0x0D, + 0x64, 0x0D, 0xEF, 0x0F, 0xF9, 0x00, 0x6A, 0x09, 0x08, 0xF9, 0x40, 0xFF, + 0x1B, 0xFE, 0xEF, 0xF8, 0x6C, 0x01, 0xF3, 0xE7, 0x3C, 0x00, 0x48, 0xDC, + 0xE4, 0x02, 0x2E, 0xE6, 0x06, 0x01, 0xFC, 0xEB, 0x53, 0xFA, 0xEF, 0xEC, + 0xFD, 0xF2, 0x83, 0xF4, 0x97, 0xED, 0x64, 0xFF, 0xCE, 0xF3, 0xD6, 0x06, + 0x1D, 0x00, 0x96, 0x05, 0xC7, 0x01, 0x57, 0xFD, 0x09, 0xFC, 0x60, 0xF2, + 0x7D, 0xF5, 0xD8, 0xE8, 0x1A, 0xEC, 0xFA, 0xE2, 0x61, 0xEE, 0x89, 0xEB, + 0x14, 0xF6, 0x84, 0xF2, 0x6B, 0xF9, 0x44, 0xEE, 0x26, 0x01, 0x81, 0xF4, + 0x4E, 0x06, 0x0A, 0x03, 0x74, 0x00, 0x85, 0x06, 0xC7, 0xF7, 0x0D, 0x01, + 0x18, 0xF7, 0xB6, 0xFD, 0x89, 0xFB, 0x61, 0xF4, 0xA5, 0xFC, 0x9C, 0xE5, + 0xEE, 0x02, 0x44, 0xE5, 0xF8, 0x08, 0xAA, 0xF0, 0x79, 0xFE, 0x9C, 0xFD, + 0x79, 0xFB, 0xA4, 0x14, 0x27, 0x01, 0x71, 0x1F, 0xFA, 0xFD, 0xB9, 0x14, + 0x5B, 0x05, 0x0D, 0x13, 0x36, 0x09, 0x25, 0x0D, 0xE4, 0x03, 0x4A, 0xFF, + 0x15, 0x05, 0xD3, 0xFB, 0x0E, 0x05, 0x1B, 0xFE, 0x7A, 0x04, 0xBB, 0x00, + 0xD4, 0x08, 0xF9, 0x08, 0x3F, 0x0C, 0xC2, 0x16, 0xFF, 0x02, 0xA5, 0x1C, + 0xE7, 0xF7, 0x9B, 0x1A, 0xDD, 0xF8, 0xCE, 0x16, 0x22, 0xFA, 0xE7, 0x0A, + 0xF0, 0xF9, 0xF1, 0xF2, 0xC3, 0xFA, 0xE0, 0xE0, 0xF5, 0xEF, 0x76, 0xDA, + 0x31, 0xF4, 0xAA, 0xE3, 0xCC, 0x08, 0x68, 0x00, 0x3A, 0x11, 0x1C, 0x1C, + 0x05, 0x06, 0x66, 0x1F, 0xC2, 0xF5, 0x65, 0x0F, 0xFA, 0xF6, 0x85, 0x02, + 0xC8, 0xEF, 0x45, 0xF2, 0x9B, 0xE6, 0x6A, 0xE4, 0xA9, 0xE7, 0x31, 0xE1, + 0x7F, 0xE5, 0x96, 0xDB, 0x43, 0xED, 0xBC, 0xD7, 0x4E, 0xFC, 0xAB, 0xE3, + 0x60, 0x03, 0xDE, 0xFA, 0x5C, 0xFF, 0x92, 0x07, 0xA5, 0xF6, 0xCA, 0x02, + 0xE1, 0xF4, 0x67, 0x01, 0xEE, 0xF7, 0x1F, 0x01, 0x5A, 0x02, 0x8F, 0xFB, + 0xCB, 0x09, 0x1D, 0xF5, 0x1C, 0x05, 0xC8, 0xE8, 0x34, 0x05, 0x38, 0xE2, + 0xA8, 0x06, 0x8D, 0xE6, 0x8B, 0x0D, 0xAC, 0xF2, 0xFA, 0x0E, 0x30, 0xFD, + 0xEE, 0xFC, 0x77, 0xFC, 0xDA, 0xEF, 0x1F, 0xFC, 0x70, 0xEA, 0xBB, 0xFC, + 0x49, 0xE8, 0x47, 0xF7, 0x7A, 0xE7, 0x96, 0xEF, 0xC2, 0xE1, 0x8A, 0xEE, + 0x05, 0xDF, 0xA4, 0xEC, 0x93, 0xEB, 0x1D, 0xF1, 0x39, 0xF6, 0xBF, 0x03, + 0xD2, 0xF3, 0xA7, 0x09, 0x4A, 0xF4, 0x98, 0x03, 0x40, 0xF8, 0xFA, 0x00, + 0xD0, 0xF5, 0x1A, 0xFB, 0x13, 0xF5, 0x71, 0xF1, 0xB9, 0xF9, 0x75, 0xE3, + 0x4F, 0xFC, 0xCF, 0xD8, 0xC3, 0xFB, 0xAF, 0xD9, 0x81, 0xFA, 0xCC, 0xE3, + 0xD1, 0xF7, 0xDD, 0xEE, 0x9A, 0xF1, 0x98, 0xF9, 0xEB, 0xE9, 0x29, 0xFF, + 0x0B, 0xEA, 0x20, 0xFF, 0x78, 0xF6, 0xFB, 0x00, 0x13, 0x05, 0x9B, 0xFA, + 0xA0, 0x0B, 0xC7, 0xF4, 0xF1, 0x0D, 0xD6, 0xFD, 0xA2, 0x0F, 0x9F, 0x05, + 0x49, 0x0B, 0x3F, 0xFE, 0xF3, 0x06, 0x13, 0xFF, 0x25, 0x08, 0x4C, 0x0C, + 0xA8, 0x03, 0xDF, 0x0C, 0x9B, 0xFE, 0xF1, 0x04, 0xB0, 0x00, 0x3C, 0x01, + 0x5F, 0xFD, 0xD6, 0x03, 0x6C, 0xFE, 0xC9, 0x05, 0x4A, 0x06, 0xEB, 0x00, + 0xBB, 0x19, 0xB8, 0x05, 0x2E, 0x27, 0x26, 0x0C, 0xF7, 0x17, 0xDA, 0x08, + 0x28, 0x06, 0x77, 0x01, 0x57, 0xFD, 0xDC, 0xFD, 0x73, 0xFB, 0x60, 0x01, + 0xCF, 0xFD, 0xBB, 0xFC, 0x6B, 0xFC, 0xE6, 0xF9, 0x29, 0xFA, 0x89, 0xFD, + 0x90, 0xF9, 0x21, 0x01, 0x2B, 0xFB, 0x0F, 0x0C, 0x95, 0xF6, 0x08, 0x08, + 0xDC, 0xE9, 0x6B, 0xF5, 0x05, 0xE7, 0xBD, 0xEE, 0xB5, 0xEC, 0xF7, 0xF2, + 0xF9, 0xF0, 0x98, 0xF5, 0xA7, 0xF0, 0x1C, 0xF0, 0x70, 0xF1, 0x20, 0xF2, + 0xBC, 0xF3, 0xDE, 0xF8, 0xD3, 0xEC, 0x49, 0xEE, 0x9C, 0xEB, 0x08, 0xE6, + 0x15, 0xF5, 0x69, 0xEC, 0xE5, 0xFA, 0x2F, 0xF1, 0xC3, 0xFE, 0x18, 0xF2, + 0x84, 0x00, 0xC9, 0xF4, 0x2C, 0x00, 0xEF, 0xFB, 0xC4, 0x03, 0xAE, 0x00, + 0x00, 0x05, 0x6C, 0x02, 0x84, 0x05, 0x94, 0x00, 0xC8, 0x04, 0xE7, 0xF9, + 0xB4, 0x00, 0x2A, 0xF9, 0x58, 0x03, 0xD4, 0xFC, 0x9B, 0x02, 0x79, 0xFE, + 0x89, 0xF8, 0xB6, 0xFB, 0x76, 0xF1, 0x09, 0xF6, 0x4F, 0xFD, 0x6C, 0x05, + 0xE8, 0x0F, 0x38, 0x18, 0x5E, 0x15, 0x08, 0x13, 0x9E, 0x11, 0x7D, 0x0B, + 0x72, 0x09, 0x21, 0x08, 0xAE, 0x0A, 0x77, 0x08, 0xC4, 0x0D, 0x27, 0x07, + 0x0F, 0x00, 0x9A, 0xFD, 0x0F, 0xF7, 0xAE, 0xFD, 0x6C, 0xF8, 0x90, 0x04, + 0x59, 0x00, 0x28, 0x08, 0xE4, 0x04, 0x28, 0x09, 0x4C, 0x01, 0x28, 0x06, + 0x4F, 0xFD, 0x01, 0x02, 0x8A, 0xFF, 0xA9, 0x06, 0xFF, 0x06, 0x10, 0x0B, + 0x5F, 0xFC, 0x7F, 0x00, 0xC9, 0xEA, 0x6C, 0xEF, 0x7A, 0xE9, 0x2A, 0xEA, + 0xEC, 0xF1, 0x2A, 0xEF, 0x71, 0xFB, 0xD4, 0xF6, 0x45, 0x01, 0xE3, 0xFE, + 0x8D, 0x03, 0x84, 0x00, 0x1B, 0x04, 0x81, 0xFE, 0x44, 0x00, 0x0D, 0xFC, + 0x57, 0xF6, 0xF0, 0xF7, 0x93, 0xF2, 0x9C, 0xF5, 0x6D, 0xFC, 0x5E, 0xF5, + 0x23, 0xFE, 0x03, 0xEB, 0x33, 0xF9, 0xBF, 0xE0, 0x27, 0x03, 0x40, 0xEE, + 0x6C, 0x08, 0x7F, 0xFB, 0x63, 0x05, 0xE9, 0xF9, 0x0A, 0x0B, 0x3C, 0x01, + 0xF6, 0x0A, 0xCA, 0x04, 0x08, 0x00, 0xBD, 0xFA, 0xE4, 0xF8, 0xDF, 0xF6, + 0x4F, 0xF2, 0x9B, 0xF3, 0x73, 0xEE, 0xEA, 0xED, 0x9D, 0xEF, 0x9C, 0xF0, + 0x36, 0xFE, 0x1B, 0x08, 0xBB, 0x10, 0xCD, 0x1E, 0xD5, 0x11, 0xD4, 0x1C, + 0x74, 0x09, 0xD5, 0x0E, 0x04, 0x04, 0x60, 0x0A, 0x1B, 0xFD, 0x66, 0x08, + 0xC0, 0xF4, 0x29, 0xFF, 0x98, 0xF2, 0x17, 0xFB, 0xDF, 0xF1, 0xF5, 0xF5, + 0x38, 0xFB, 0xA0, 0xF8, 0x33, 0x03, 0x67, 0x08, 0x86, 0x04, 0xF7, 0x12, + 0x09, 0x07, 0x7A, 0x11, 0xDC, 0x04, 0x34, 0x0C, 0x46, 0x04, 0x26, 0x07, + 0xD4, 0x07, 0xA8, 0x04, 0x1A, 0x0A, 0xC0, 0x04, 0x6E, 0x02, 0x07, 0xFB, + 0xE6, 0xFA, 0xC2, 0xF6, 0x8D, 0xFF, 0x06, 0x02, 0xEC, 0xFB, 0x6F, 0x06, + 0x90, 0x00, 0x1C, 0x0F, 0xCC, 0x0D, 0xF0, 0x16, 0x9B, 0x06, 0x1E, 0x11, + 0x3A, 0x04, 0x38, 0x0C, 0xC3, 0x07, 0xC7, 0x09, 0x72, 0x05, 0x3A, 0x08, + 0x46, 0x01, 0xA0, 0x05, 0x4B, 0x03, 0xC2, 0x08, 0xC9, 0x08, 0xDB, 0x0D, + 0xD2, 0x05, 0x91, 0x11, 0xD6, 0x14, 0x05, 0x21, 0x38, 0x25, 0xA3, 0x28, + 0x8D, 0x1A, 0xC5, 0x1B, 0xD5, 0x0A, 0x3A, 0x12, 0xB3, 0x06, 0x51, 0x11, + 0x85, 0x01, 0x04, 0x0B, 0x92, 0xF9, 0x07, 0x04, 0x7E, 0xFA, 0x2A, 0x00, + 0x08, 0xFE, 0x3C, 0xF9, 0x7F, 0x09, 0x2E, 0x00, 0xEE, 0x11, 0x21, 0x0B, + 0x33, 0x0D, 0x55, 0x0F, 0x31, 0x08, 0xD4, 0x10, 0x49, 0x07, 0x52, 0x07, + 0xE6, 0x0E, 0xCC, 0x02, 0xD3, 0x0F, 0x04, 0xF8, 0xAF, 0x06, 0xCF, 0xE8, + 0xCB, 0x10, 0xC5, 0xEE, 0x3E, 0x0E, 0x7A, 0xF6, 0x70, 0xF5, 0x1E, 0xFB, + 0x9B, 0xF7, 0x2D, 0x09, 0x56, 0xFE, 0x39, 0x0A, 0x9F, 0xF6, 0x9E, 0xFE, + 0x6B, 0xF7, 0x1F, 0x00, 0x3B, 0xF5, 0x79, 0x01, 0x85, 0xF5, 0x29, 0x00, + 0xB5, 0xFE, 0x08, 0xFE, 0xC5, 0xFC, 0x20, 0xFE, 0x79, 0x03, 0x66, 0x0A, + 0xA8, 0x07, 0xAA, 0x0F, 0x0B, 0x09, 0x58, 0x0F, 0xE3, 0x10, 0xDF, 0x14, + 0xD2, 0x05, 0x39, 0x17, 0x97, 0x07, 0xF1, 0x0D, 0xEF, 0x1B, 0x92, 0x04, + 0xF6, 0x1A, 0x61, 0xFB, 0xB7, 0xFA, 0x06, 0xE9, 0x68, 0xF6, 0xD7, 0xF2, + 0x65, 0x0E, 0x00, 0x11, 0x1E, 0x14, 0xD6, 0x1E, 0x51, 0x1B, 0x3E, 0x1F, + 0x45, 0x21, 0x0C, 0x1E, 0x04, 0x18, 0xD7, 0x1F, 0x8A, 0x15, 0x20, 0x21, + 0x9F, 0x16, 0x09, 0x1A, 0xF7, 0x10, 0xA5, 0x0B, 0x67, 0x02, 0x9C, 0xFB, + 0xDE, 0xF1, 0xCF, 0xF8, 0x19, 0x04, 0x9E, 0x04, 0x77, 0x09, 0x40, 0x05, + 0xBE, 0xF5, 0x5E, 0x11, 0xBC, 0xFC, 0x52, 0x20, 0xB2, 0x02, 0x8F, 0x22, + 0xB4, 0xFA, 0xBE, 0x18, 0x7E, 0x11, 0x6C, 0x0A, 0x10, 0x1B, 0x3C, 0xFF, + 0x81, 0xF3, 0x24, 0xE9, 0x38, 0xEF, 0xB5, 0xE4, 0x82, 0x0B, 0xD8, 0xEF, + 0x0E, 0x03, 0x38, 0xF4, 0x73, 0xF5, 0x72, 0x00, 0x71, 0xF4, 0xBE, 0xFC, + 0x23, 0xFC, 0x1C, 0xF0, 0xF5, 0x10, 0x02, 0xFC, 0x21, 0x01, 0x2E, 0xF9, + 0x08, 0xDE, 0x64, 0xE7, 0x96, 0xE0, 0x5C, 0xEA, 0x7E, 0xF6, 0xDF, 0xE8, + 0xE2, 0xF6, 0xAA, 0xED, 0x2A, 0xDF, 0xA0, 0xFF, 0x61, 0xD8, 0x89, 0xFD, + 0x7A, 0xF2, 0x42, 0x05, 0x03, 0x13, 0x46, 0x10, 0x17, 0x11, 0xB3, 0x0B, + 0xAA, 0xEB, 0x29, 0x03, 0x8F, 0xE7, 0x9F, 0xF5, 0xDD, 0x00, 0xBA, 0xEC, + 0xD8, 0x06, 0x00, 0xF1, 0x95, 0x00, 0xB7, 0xF9, 0xEE, 0xF9, 0x3D, 0x01, + 0x59, 0xFB, 0x9A, 0x1C, 0x8B, 0xF7, 0x6F, 0x1D, 0x58, 0xEC, 0x61, 0x0D, + 0x59, 0xFD, 0x73, 0x0B, 0x6A, 0x10, 0xB2, 0xF2, 0xAB, 0x00, 0xC9, 0xEE, + 0xDC, 0xF8, 0x23, 0xEF, 0x80, 0x05, 0xBC, 0xE1, 0x89, 0x13, 0xD6, 0xEA, + 0xBF, 0x0F, 0xD7, 0xFB, 0x07, 0xFB, 0x4A, 0x0C, 0x0E, 0x03, 0x90, 0x10, + 0x45, 0x15, 0x04, 0x11, 0x35, 0x0C, 0xD8, 0x12, 0xC4, 0xF4, 0x76, 0x06, + 0xAA, 0xEF, 0x85, 0xFB, 0xED, 0x02, 0xCA, 0xF0, 0x10, 0x04, 0xCE, 0xE4, + 0xD8, 0xF4, 0xD9, 0xE8, 0x54, 0xFB, 0xF9, 0xEC, 0xD2, 0xF8, 0xDE, 0xF4, + 0x32, 0xE2, 0x72, 0x10, 0x37, 0xEB, 0x35, 0x17, 0x47, 0x0C, 0x3B, 0x04, + 0x0D, 0xFF, 0xD8, 0xEE, 0x99, 0xE6, 0xE9, 0xEA, 0x27, 0xF1, 0x08, 0xF5, + 0x1B, 0xF5, 0x2A, 0x09, 0xF7, 0xE7, 0xD6, 0x12, 0x08, 0xEF, 0x12, 0x01, + 0xA9, 0x0B, 0xF5, 0x03, 0x29, 0x10, 0xC0, 0x12, 0x7F, 0x08, 0x08, 0x14, + 0xC5, 0x0E, 0x26, 0x13, 0x7A, 0x06, 0xD1, 0x0C, 0x3F, 0x08, 0xCF, 0x03, + 0xBC, 0x1E, 0xC8, 0x04, 0x63, 0x11, 0x48, 0xFF, 0x95, 0xFE, 0x8B, 0xE4, + 0x14, 0x06, 0x6B, 0xDE, 0x04, 0x16, 0xCA, 0xFC, 0x57, 0x14, 0xA0, 0x10, + 0x0D, 0xFE, 0x89, 0x0C, 0x83, 0xFC, 0xD5, 0x09, 0xC7, 0x0D, 0x21, 0x0C, + 0x01, 0x10, 0x96, 0x02, 0x60, 0xFB, 0x85, 0xF4, 0x89, 0xEC, 0x67, 0xF2, + 0xD0, 0xF4, 0x29, 0xE4, 0x3C, 0x0D, 0xB1, 0xE0, 0x7F, 0x11, 0xA4, 0x04, + 0xF8, 0xF4, 0x40, 0x19, 0xC5, 0xE6, 0x50, 0x08, 0x33, 0x01, 0xCE, 0x0B, + 0x6B, 0x17, 0xFB, 0x25, 0xBB, 0xFE, 0x9C, 0x24, 0xD2, 0xE5, 0x9B, 0x12, + 0x87, 0xFB, 0x7B, 0x03, 0x83, 0x13, 0xD1, 0xF5, 0x95, 0x0E, 0xC4, 0xF6, + 0x50, 0x07, 0xAD, 0x0B, 0x3C, 0x02, 0x5B, 0x1D, 0xFA, 0x02, 0x2E, 0x25, + 0xBA, 0x13, 0xE6, 0x25, 0xC3, 0x22, 0xCA, 0x1B, 0x73, 0x1D, 0x05, 0x02, + 0x31, 0x22, 0x34, 0xF2, 0x17, 0x1D, 0x1D, 0xFC, 0x23, 0xFE, 0x9B, 0x0B, + 0xE7, 0xF6, 0xAB, 0x0D, 0x94, 0x1A, 0x83, 0x08, 0xDB, 0x2F, 0x58, 0x0B, + 0xCB, 0x1B, 0xEE, 0x0B, 0x2D, 0x0E, 0x97, 0x0B, 0x82, 0x07, 0xC1, 0x0F, + 0x8A, 0xFD, 0xAA, 0x09, 0x59, 0xFB, 0x56, 0xFE, 0x68, 0x02, 0x11, 0xFE, + 0x19, 0x0E, 0x29, 0x03, 0xA8, 0x11, 0xCC, 0x02, 0x6F, 0x0A, 0xFA, 0xF7, + 0xAC, 0x10, 0xF0, 0xF5, 0x75, 0x12, 0x1B, 0x0C, 0x60, 0xFC, 0x81, 0x17, + 0x9C, 0xF3, 0x9D, 0x10, 0x90, 0xF8, 0xC6, 0x08, 0x18, 0xFA, 0xFB, 0xF7, + 0xD9, 0xF4, 0xE5, 0xEF, 0xBC, 0xE8, 0xD0, 0xF7, 0x9A, 0xE4, 0xE8, 0xED, + 0x3E, 0xDD, 0xCE, 0xDB, 0xCD, 0xE0, 0xA5, 0xDD, 0x53, 0xEC, 0x21, 0xE1, + 0xFA, 0xCD, 0x40, 0xEB, 0x82, 0xB7, 0x8C, 0xF0, 0x25, 0xCF, 0x01, 0xE6, + 0xBC, 0xDD, 0xAF, 0xEB, 0xE7, 0xDC, 0x61, 0xEF, 0x3B, 0xEA, 0x41, 0xE7, + 0x92, 0xEF, 0xF1, 0xE3, 0xDE, 0xE0, 0xD3, 0xE8, 0xCE, 0xEB, 0x63, 0xFB, + 0x4B, 0x07, 0xF7, 0x00, 0x05, 0xFF, 0x01, 0xF0, 0x27, 0xF4, 0xC9, 0xE6, + 0x71, 0x00, 0x79, 0xE4, 0x88, 0xFE, 0xBF, 0xEC, 0x26, 0xF5, 0xFA, 0xF7, + 0xCF, 0x03, 0x01, 0xF4, 0x02, 0x0E, 0x8C, 0xF5, 0x77, 0x06, 0xA1, 0xFC, + 0x25, 0x13, 0xDD, 0xF6, 0x08, 0x19, 0xDF, 0xF6, 0xD4, 0x06, 0xED, 0x08, + 0xEF, 0xFC, 0x69, 0xFF, 0x8D, 0x07, 0x53, 0xF1, 0xBC, 0x15, 0x2F, 0xFD, + 0xA5, 0x0A, 0xA8, 0xF1, 0xF0, 0xF2, 0xCC, 0xE3, 0x6D, 0xF5, 0x42, 0xF1, + 0x64, 0xF8, 0x62, 0xFA, 0x0F, 0xEF, 0x70, 0xF6, 0x2B, 0xF9, 0x4F, 0xF0, + 0xD4, 0xFB, 0xF0, 0xF6, 0x4F, 0xF0, 0xD5, 0xFA, 0x91, 0xE4, 0x50, 0xFC, + 0xFD, 0xE5, 0x03, 0x05, 0xCC, 0xFA, 0x4B, 0xF9, 0xCE, 0x00, 0xF2, 0xF1, + 0x39, 0xFE, 0x86, 0x00, 0xBD, 0xEF, 0x26, 0x05, 0xB3, 0xE6, 0xFD, 0xFE, + 0x0E, 0x0A, 0x7C, 0x00, 0x48, 0x19, 0x05, 0xFF, 0x1B, 0xFC, 0xBE, 0xFD, + 0x44, 0xEC, 0xBC, 0x06, 0x93, 0xF3, 0x26, 0x04, 0xD1, 0xF7, 0x36, 0xFA, + 0x7A, 0x03, 0x95, 0xFA, 0x07, 0x0B, 0xC0, 0xF8, 0xE7, 0x00, 0xD7, 0xF1, + 0x30, 0x04, 0x8B, 0xF2, 0x9A, 0x04, 0x34, 0xF1, 0x78, 0x04, 0x71, 0xF1, + 0x43, 0x01, 0xE2, 0xFF, 0x45, 0xF1, 0xE1, 0x0E, 0xB6, 0xF0, 0x8F, 0x0A, + 0x55, 0xFF, 0x69, 0xFE, 0x43, 0x07, 0x8C, 0xFA, 0xC3, 0xFF, 0x90, 0xF5, + 0x5D, 0x01, 0xA2, 0xF0, 0x33, 0x19, 0xA9, 0xFA, 0xB9, 0x25, 0xCA, 0x0C, + 0x17, 0x17, 0x76, 0x0A, 0xBC, 0x06, 0xB7, 0x0E, 0xBC, 0xEA, 0x31, 0x2A, + 0xE9, 0xDC, 0xF2, 0x2C, 0xDE, 0xFB, 0x87, 0x23, 0x5E, 0x01, 0xA5, 0x1C, + 0xCF, 0xF9, 0x31, 0x08, 0xA2, 0x02, 0xB9, 0xFB, 0xBA, 0x02, 0xC8, 0xFE, + 0x6F, 0x05, 0xB7, 0x04, 0xF0, 0x02, 0x1C, 0x10, 0x8F, 0x04, 0x1A, 0x11, + 0x29, 0x10, 0xB5, 0xFB, 0x28, 0x1C, 0x2C, 0xF8, 0xE1, 0x19, 0x9F, 0x01, + 0xEF, 0x05, 0x71, 0xF7, 0x87, 0x01, 0x11, 0xF0, 0xAA, 0x12, 0xEE, 0xF7, + 0x7F, 0x13, 0xF5, 0x01, 0x95, 0x08, 0xCE, 0xFE, 0x00, 0x14, 0xF5, 0xEE, + 0x42, 0x23, 0xAD, 0xF4, 0x8D, 0x15, 0xF7, 0x03, 0xD7, 0xFB, 0x3A, 0xFE, + 0xA5, 0xF8, 0xFF, 0xF8, 0x7F, 0x01, 0x8F, 0x02, 0x83, 0x0F, 0x0C, 0x0A, + 0x09, 0x14, 0xEA, 0xFE, 0x54, 0x02, 0x18, 0xF8, 0xED, 0x08, 0x52, 0x01, + 0x5C, 0x26, 0x1F, 0xFF, 0x8D, 0x27, 0x07, 0xFE, 0x0E, 0x06, 0x5A, 0x0E, + 0xA0, 0xE1, 0x2B, 0x0F, 0x36, 0xD9, 0x72, 0xFD, 0xC7, 0xE4, 0x6C, 0xF7, + 0xBB, 0xDD, 0x04, 0xFA, 0xA7, 0xC9, 0x41, 0xEA, 0x6C, 0xDD, 0xD0, 0xE1, + 0x15, 0xF9, 0x06, 0xF0, 0x47, 0xEE, 0xB4, 0xEB, 0x5B, 0xEF, 0x46, 0xE7, + 0x36, 0xEC, 0xD9, 0xF7, 0x0A, 0xD8, 0x61, 0xFE, 0xF7, 0xDE, 0x64, 0xFB, + 0xF7, 0xF2, 0x39, 0xFF, 0xE8, 0xF9, 0xEB, 0xF5, 0x68, 0xF7, 0x67, 0xEC, + 0x3E, 0xF3, 0xB4, 0xF6, 0x17, 0xF3, 0xE4, 0xEA, 0xD4, 0xF1, 0xC1, 0xD6, + 0x2B, 0xEC, 0x24, 0xE8, 0x9F, 0xED, 0xAD, 0xEF, 0x94, 0xE8, 0x7D, 0xE9, + 0x94, 0xD6, 0x52, 0xF7, 0xE2, 0xD7, 0x55, 0xF9, 0xB8, 0xDF, 0x01, 0xE1, + 0x00, 0xD3, 0xDC, 0xC5, 0x7F, 0xCC, 0x10, 0xC3, 0xE8, 0xD0, 0xE8, 0xCE, + 0x43, 0xDF, 0x4D, 0xDE, 0x55, 0xFA, 0xB2, 0xF8, 0xE1, 0x0D, 0xE6, 0x00, + 0x6B, 0x0D, 0x35, 0xF2, 0xE7, 0x09, 0x41, 0xF6, 0x3E, 0x10, 0x00, 0x05, + 0xD5, 0x18, 0x43, 0xFE, 0x3D, 0x18, 0xB4, 0xF2, 0x66, 0x03, 0x59, 0xF2, + 0x81, 0xFD, 0xE6, 0xEC, 0x76, 0x13, 0x30, 0xF3, 0x4C, 0x16, 0xAD, 0x0B, + 0xB2, 0x07, 0xF0, 0x1C, 0xB0, 0xFA, 0xD0, 0x25, 0x05, 0xF7, 0x0E, 0x23, + 0x03, 0xFF, 0x6E, 0x17, 0x67, 0xF6, 0x42, 0x08, 0x86, 0xE7, 0xB4, 0x03, + 0x66, 0xF3, 0xF0, 0x08, 0x9E, 0x01, 0x30, 0x0C, 0x62, 0xF6, 0x49, 0x07, + 0x45, 0xEB, 0xD8, 0x03, 0xB3, 0xFA, 0x53, 0x0E, 0xF2, 0x05, 0x4E, 0x0D, + 0x1E, 0xF1, 0x37, 0x06, 0x1D, 0xD7, 0xC6, 0xFB, 0x1D, 0xD8, 0xA4, 0xE4, + 0x74, 0xF0, 0x5F, 0xDE, 0x86, 0x02, 0x68, 0xEC, 0xB6, 0xFF, 0x12, 0xE7, + 0x60, 0x04, 0xF7, 0xE0, 0x60, 0x0A, 0xC7, 0xF1, 0x1B, 0x1B, 0x08, 0x02, + 0xFC, 0x21, 0x21, 0x10, 0x61, 0x13, 0x74, 0x19, 0xAC, 0x15, 0x81, 0x16, + 0xE5, 0x1B, 0x40, 0x19, 0xB6, 0x2C, 0x59, 0x1B, 0x30, 0x2D, 0x4D, 0x18, + 0xE8, 0x13, 0x47, 0x14, 0x93, 0x03, 0xB3, 0x08, 0x53, 0x05, 0x3F, 0x02, + 0xBA, 0x0D, 0x4A, 0x05, 0x47, 0xFB, 0x75, 0x07, 0xA9, 0xF0, 0x41, 0x12, + 0x84, 0x00, 0xDC, 0x30, 0xA1, 0x02, 0xEC, 0x30, 0xB2, 0x00, 0x4E, 0x1C, + 0x18, 0x06, 0xA5, 0x0F, 0xF2, 0x12, 0xEB, 0xF5, 0xEA, 0x17, 0x68, 0xF7, + 0xE8, 0x0E, 0xA0, 0x10, 0xAD, 0x15, 0x04, 0x21, 0x74, 0x2C, 0x20, 0x30, + 0xB8, 0x36, 0xAD, 0x2F, 0xFE, 0x29, 0x4B, 0x1A, 0xE3, 0x18, 0x81, 0x0D, + 0xC2, 0x17, 0xC5, 0x11, 0x36, 0x18, 0xBA, 0x0C, 0xFC, 0x0F, 0xC7, 0x01, + 0x10, 0x09, 0xDA, 0x06, 0x3B, 0x07, 0xB5, 0x11, 0x15, 0x18, 0xA5, 0x10, + 0xF2, 0x21, 0x44, 0x0B, 0x39, 0x16, 0x98, 0x03, 0x50, 0x0B, 0xEF, 0xF9, + 0x87, 0xF8, 0x46, 0xFA, 0x72, 0xEF, 0x93, 0xFF, 0xCA, 0xFC, 0x55, 0x04, + 0x65, 0x06, 0xF6, 0xFF, 0x7D, 0x01, 0x84, 0xFF, 0x80, 0x14, 0x16, 0x0C, + 0x8A, 0x37, 0x46, 0x0F, 0x93, 0x31, 0x64, 0x1E, 0xDD, 0x21, 0x48, 0x2D, + 0x85, 0x14, 0xD3, 0x1D, 0xA0, 0x05, 0x87, 0x14, 0xF3, 0x18, 0x4C, 0x1E, + 0xF1, 0x28, 0xE9, 0x19, 0xFA, 0x1B, 0x0B, 0x18, 0x58, 0x15, 0x3F, 0x2B, + 0x76, 0x21, 0x16, 0x2E, 0xC8, 0x22, 0x2E, 0x35, 0x3F, 0x12, 0x41, 0x47, + 0x6C, 0x07, 0xB9, 0x35, 0xB3, 0x0D, 0xFB, 0x2B, 0xCE, 0x11, 0xF9, 0x28, + 0x0F, 0x0F, 0xC1, 0x23, 0x19, 0x04, 0x28, 0x23, 0xCB, 0xEE, 0xA2, 0x17, + 0x26, 0xFA, 0xBE, 0x17, 0xB0, 0x15, 0xEC, 0x09, 0x67, 0x13, 0x90, 0xFF, + 0xDD, 0x13, 0x60, 0x05, 0xF3, 0x13, 0xE4, 0xF5, 0x6C, 0xF7, 0x1C, 0xEE, + 0x04, 0xEA, 0xA9, 0x00, 0x32, 0xF4, 0x89, 0x04, 0x33, 0xFE, 0x23, 0xF1, + 0x0E, 0x14, 0x10, 0xF6, 0x03, 0x2C, 0xD4, 0x03, 0x6B, 0x1A, 0x68, 0xFB, + 0xBA, 0x0A, 0x0E, 0xFB, 0xBB, 0x1D, 0xCB, 0x06, 0x8E, 0x10, 0xBA, 0x0B, + 0x50, 0x10, 0xF1, 0x15, 0x99, 0x1E, 0xCB, 0x27, 0x6B, 0x0D, 0xA5, 0x20, + 0x5C, 0x07, 0x94, 0x0E, 0xAB, 0x04, 0x68, 0x07, 0x7C, 0xF5, 0xCC, 0xF0, + 0x4A, 0xEE, 0x67, 0xE9, 0xC3, 0xF0, 0x21, 0xF4, 0xB8, 0xF4, 0xC4, 0x05, + 0x69, 0xF9, 0xEA, 0x16, 0x90, 0xF9, 0x8F, 0x08, 0x24, 0xF3, 0x4A, 0xF9, + 0xA9, 0xF7, 0xDF, 0xEC, 0xE7, 0xF1, 0xBE, 0xE0, 0xFC, 0xEA, 0x2B, 0xE9, + 0x43, 0xFE, 0x0A, 0xF2, 0x1F, 0x06, 0xFD, 0xE3, 0x0B, 0x0B, 0xC0, 0xED, + 0x0C, 0x0C, 0xEF, 0x06, 0xFC, 0xF7, 0xBA, 0xF5, 0x49, 0xE9, 0x57, 0xE0, + 0x37, 0xE2, 0x2A, 0xDF, 0x18, 0xDD, 0x67, 0xE1, 0x54, 0xDA, 0x6A, 0xE9, + 0x05, 0xC9, 0xF6, 0xE6, 0x6C, 0xCB, 0x3F, 0xDC, 0x49, 0xEA, 0xFB, 0xCC, + 0xAA, 0xEE, 0x58, 0xC9, 0xAD, 0xE0, 0x3B, 0xD5, 0x9A, 0xDA, 0xDD, 0xD4, + 0xD6, 0xC9, 0x5E, 0xCD, 0x82, 0xBE, 0xBC, 0xD1, 0xA1, 0xCF, 0x1E, 0xD6, + 0xFB, 0xC2, 0x89, 0xCC, 0xDA, 0xB5, 0x77, 0xD3, 0xF3, 0xD9, 0xF2, 0xE2, + 0xD4, 0xEA, 0x09, 0xE3, 0x18, 0xF3, 0x75, 0xE2, 0xF3, 0x0D, 0xAE, 0xE1, + 0x56, 0xFD, 0x3C, 0xDA, 0x12, 0xE4, 0x63, 0xEB, 0x24, 0xEE, 0x02, 0x10, + 0x82, 0xEF, 0x15, 0x13, 0x1E, 0xFE, 0x23, 0x0F, 0x95, 0x1A, 0xF2, 0x1A, + 0x23, 0x17, 0x63, 0x12, 0xB5, 0x11, 0x4A, 0x11, 0xE9, 0x1C, 0x32, 0x24, + 0x57, 0x27, 0xFC, 0x20, 0x5A, 0x1C, 0xB0, 0x14, 0x2C, 0x00, 0xF4, 0x18, + 0xBE, 0x01, 0x15, 0x24, 0x83, 0x10, 0x61, 0x1B, 0xF4, 0x09, 0xAB, 0x19, + 0x00, 0xFD, 0xED, 0x28, 0xB9, 0x13, 0x91, 0x22, 0x52, 0x1E, 0x6D, 0x0D, + 0x60, 0x17, 0x2D, 0x07, 0x7A, 0x28, 0x90, 0x10, 0x87, 0x22, 0x5D, 0x0D, + 0x5F, 0x22, 0x97, 0x07, 0x44, 0x36, 0x30, 0x12, 0xBD, 0x2D, 0xC1, 0x15, + 0x0B, 0x1D, 0x87, 0x12, 0x6A, 0x28, 0x23, 0x0F, 0x76, 0x2E, 0x8F, 0x08, + 0xE5, 0x1E, 0xE8, 0x0B, 0xE6, 0x20, 0xD2, 0x03, 0x70, 0x20, 0xA8, 0xFD, + 0xD4, 0x1C, 0xBF, 0x13, 0x37, 0x25, 0xAE, 0x1A, 0x78, 0x21, 0x5E, 0x0D, + 0xAC, 0x0E, 0x19, 0x02, 0xFA, 0xFA, 0xBA, 0x07, 0x79, 0xE8, 0x21, 0x00, + 0xE6, 0xEA, 0x45, 0xF2, 0x6A, 0xF5, 0xFD, 0x07, 0x6F, 0xFD, 0xC7, 0x12, + 0xF4, 0x0F, 0x84, 0x0B, 0xA9, 0x00, 0xA6, 0x05, 0xD8, 0xE5, 0x5E, 0xFD, + 0xA6, 0xE6, 0xCE, 0xFC, 0xD9, 0xE0, 0x70, 0xF6, 0x0A, 0xE6, 0x1C, 0xF7, + 0xAE, 0xFA, 0x76, 0xFA, 0x10, 0x02, 0x1E, 0xF9, 0x90, 0x05, 0xA7, 0x03, + 0x17, 0x0D, 0xBC, 0x13, 0xB9, 0x08, 0xCD, 0x09, 0x4C, 0xF3, 0x4D, 0xDF, + 0x2F, 0xE6, 0x4A, 0xDC, 0xB4, 0xE3, 0x77, 0xF1, 0xBA, 0xEB, 0x39, 0xF9, + 0xF7, 0xF4, 0x16, 0xF8, 0xB2, 0xF0, 0x3F, 0xE3, 0xE6, 0xE6, 0x75, 0xDC, + 0x61, 0xD9, 0xBE, 0xE4, 0xE1, 0xD9, 0xE8, 0xE5, 0x4B, 0xEA, 0xA6, 0xE1, + 0x30, 0xDA, 0x5A, 0xD3, 0x40, 0xC9, 0x2E, 0xC9, 0x65, 0xDC, 0x4B, 0xCF, + 0x01, 0xDE, 0xA7, 0xE7, 0x23, 0xD0, 0x88, 0xFE, 0xD9, 0xE3, 0xC1, 0x06, + 0xB0, 0xFC, 0xCF, 0xFF, 0x8D, 0x00, 0x35, 0xEE, 0x59, 0xFE, 0x3E, 0xDF, + 0xA9, 0x01, 0xE0, 0xE1, 0xA8, 0x08, 0xD7, 0xF6, 0x62, 0x0C, 0x20, 0x0A, + 0x66, 0x00, 0xE1, 0x0D, 0xDD, 0xEF, 0x3E, 0x13, 0xCB, 0x03, 0xFF, 0x1C, + 0x85, 0x17, 0xED, 0x14, 0xDC, 0x12, 0x34, 0x0B, 0x1E, 0x0B, 0x21, 0x00, + 0x91, 0xFA, 0x4F, 0xF3, 0xFE, 0xF9, 0x6C, 0xFB, 0xA7, 0x0B, 0xDA, 0x03, + 0x79, 0x11, 0x8A, 0x02, 0x95, 0x0D, 0x61, 0x0F, 0x4D, 0x03, 0xA4, 0x19, + 0x83, 0xFF, 0x78, 0x12, 0x70, 0x00, 0x93, 0x15, 0xF1, 0xF6, 0xB8, 0x0C, + 0x66, 0xF7, 0x23, 0xEE, 0x7D, 0x11, 0x90, 0xEC, 0x57, 0x1D, 0x05, 0xEF, + 0xA3, 0x0A, 0x0D, 0xE7, 0x99, 0x10, 0x2C, 0x01, 0xEC, 0x19, 0xDD, 0x16, + 0x75, 0x10, 0xB6, 0x18, 0x08, 0x10, 0x85, 0x1A, 0x6D, 0x04, 0x00, 0x04, + 0xA7, 0x01, 0x66, 0xF7, 0x5C, 0x10, 0x9C, 0x03, 0xCE, 0x18, 0xEA, 0x03, + 0xE6, 0x13, 0xFD, 0x02, 0x43, 0x0C, 0x4F, 0x05, 0x3C, 0x0D, 0xA0, 0xF1, + 0xA0, 0x09, 0x8F, 0xEC, 0x4F, 0xF9, 0x8C, 0x01, 0x03, 0xD4, 0x0F, 0x02, + 0x29, 0xCC, 0xA5, 0x03, 0x88, 0xE6, 0x4C, 0x0B, 0xD2, 0xEE, 0x13, 0x00, + 0xB8, 0xFB, 0xB9, 0xFA, 0xDC, 0xF6, 0x45, 0xF6, 0x96, 0xE1, 0xD5, 0xEF, + 0x9A, 0xE7, 0x39, 0xF0, 0x66, 0xF3, 0x64, 0xF7, 0xF7, 0xEC, 0xB5, 0x05, + 0xFD, 0xFA, 0x46, 0x0D, 0xF0, 0x14, 0x90, 0x11, 0xC5, 0x14, 0x86, 0x14, + 0x49, 0x1D, 0xCE, 0x0A, 0xF0, 0x1E, 0x98, 0x04, 0xEF, 0x0A, 0xD4, 0x07, + 0x32, 0x05, 0x45, 0x04, 0x51, 0x0E, 0x57, 0xFD, 0xEF, 0x12, 0xAE, 0x04, + 0x21, 0x0F, 0x49, 0x10, 0xC1, 0x0E, 0x08, 0x07, 0x3F, 0x0F, 0x23, 0x13, + 0x04, 0x0F, 0xB9, 0x27, 0x41, 0x0E, 0x9A, 0x19, 0x1B, 0x08, 0x36, 0x12, + 0x35, 0x11, 0x53, 0x10, 0x29, 0x1B, 0x23, 0xFE, 0xB2, 0x0A, 0xD2, 0xFA, + 0x31, 0xFB, 0xEB, 0x0B, 0x5D, 0x11, 0xEC, 0x16, 0xAA, 0x2C, 0xC9, 0x1A, + 0xEF, 0x28, 0x9A, 0x2A, 0xDA, 0x26, 0xD9, 0x35, 0x4F, 0x3F, 0x2B, 0x2F, + 0x73, 0x49, 0x5F, 0x20, 0x55, 0x36, 0xF7, 0x14, 0x27, 0x23, 0xBE, 0x15, + 0x30, 0x17, 0x5A, 0x1B, 0x51, 0x19, 0xDB, 0x23, 0x1B, 0x30, 0x92, 0x29, + 0x7D, 0x36, 0xAE, 0x32, 0x14, 0x20, 0xF1, 0x3D, 0x9A, 0x1B, 0x2A, 0x31, + 0xB2, 0x1E, 0x0D, 0x27, 0xC8, 0x08, 0x6D, 0x29, 0x50, 0xFF, 0xB1, 0x16, + 0x66, 0x0E, 0x81, 0x06, 0x29, 0x1C, 0x9B, 0x12, 0xCF, 0x26, 0x12, 0x18, + 0x01, 0x24, 0x7F, 0x17, 0x19, 0x10, 0xC3, 0x1E, 0x48, 0x08, 0x83, 0x1D, + 0x35, 0x00, 0x89, 0x15, 0x82, 0xFD, 0xFE, 0x03, 0xFE, 0x04, 0x79, 0xF8, + 0xF1, 0xFB, 0x9A, 0xFD, 0x8F, 0xF4, 0xBC, 0xF6, 0x92, 0xED, 0xB3, 0xED, + 0xF2, 0xE5, 0x2B, 0xF0, 0xAA, 0xF6, 0x8E, 0xEE, 0xEF, 0xFC, 0xD9, 0xEE, + 0x3A, 0xED, 0xED, 0xF4, 0xD4, 0xED, 0x8E, 0xFA, 0x8D, 0xF0, 0x4A, 0xFE, + 0x12, 0xEB, 0x15, 0xF8, 0x19, 0xF5, 0x70, 0xE5, 0x2E, 0xF5, 0x20, 0xCF, + 0x5A, 0xD3, 0x03, 0xB8, 0x8A, 0xC0, 0x63, 0xB8, 0xA6, 0xC4, 0x5C, 0xC5, + 0xB8, 0xC9, 0xCE, 0xC7, 0x07, 0xBE, 0xD0, 0xD3, 0x51, 0xAC, 0x23, 0xDB, + 0xCA, 0xAB, 0x4B, 0xC9, 0x74, 0xB5, 0x7E, 0xB5, 0x45, 0xB3, 0xA1, 0xB1, + 0x2A, 0xAA, 0x58, 0xAB, 0x63, 0xA4, 0x41, 0xA5, 0x06, 0xB0, 0x9D, 0xB4, + 0x53, 0xD4, 0x5D, 0xB9, 0x11, 0xEB, 0xD0, 0xBA, 0x79, 0xE3, 0x71, 0xC9, + 0x85, 0xD9, 0xAF, 0xC7, 0xC3, 0xD0, 0x95, 0xC5, 0x6F, 0xC7, 0x62, 0xD4, + 0xAB, 0xC6, 0xE6, 0xC9, 0x12, 0xBE, 0x46, 0xAA, 0x3E, 0xB5, 0x5B, 0xAE, + 0x65, 0xC2, 0xE1, 0xBB, 0x40, 0xCF, 0x32, 0xB9, 0xB6, 0xD0, 0x8E, 0xC6, + 0x05, 0xDA, 0x3D, 0xD7, 0x64, 0xDC, 0xF9, 0xD2, 0xD5, 0xCF, 0x67, 0xCB, + 0x0A, 0xCD, 0xE9, 0xD2, 0x69, 0xD1, 0x9D, 0xD9, 0x6A, 0xDF, 0xB6, 0xCF, + 0x88, 0xEF, 0x90, 0xC7, 0x2B, 0xE5, 0x9B, 0xCA, 0x4E, 0xDC, 0x7B, 0xD6, + 0x54, 0xF3, 0x73, 0xED, 0x51, 0x09, 0x2A, 0xF6, 0xAB, 0x05, 0x22, 0xF9, + 0x7E, 0xFA, 0x61, 0x0B, 0xC1, 0xF7, 0xB5, 0x0A, 0x69, 0xFD, 0xED, 0x08, + 0xF4, 0x00, 0xB6, 0x16, 0x39, 0xFA, 0xA8, 0x09, 0x97, 0x01, 0xBC, 0xFC, + 0x55, 0x13, 0x33, 0x0B, 0x7A, 0x12, 0x8C, 0x13, 0x59, 0x12, 0xB8, 0x11, + 0x55, 0x0B, 0xCD, 0x19, 0x08, 0x07, 0x74, 0x20, 0xD6, 0x10, 0xDA, 0x1F, + 0x53, 0x18, 0x50, 0x19, 0x6A, 0x1B, 0xB8, 0x11, 0xC0, 0x0F, 0x02, 0x19, + 0xCA, 0x06, 0xCD, 0x1B, 0x2C, 0x0B, 0x54, 0x19, 0x68, 0x0B, 0x0D, 0x1E, + 0x80, 0x0E, 0xB2, 0x15, 0xBB, 0x1C, 0x1C, 0x0E, 0x4E, 0x24, 0x6C, 0x16, + 0x44, 0x20, 0x1B, 0x1C, 0x6F, 0x1C, 0x8C, 0x1C, 0xB4, 0x17, 0xAD, 0x1C, + 0xE9, 0x09, 0xF0, 0x18, 0x7E, 0x0A, 0x12, 0x12, 0xAC, 0x18, 0xE5, 0x19, + 0x2E, 0x26, 0xD4, 0x28, 0x74, 0x3F, 0xC4, 0x30, 0x9D, 0x3B, 0x6D, 0x34, + 0x6B, 0x22, 0x60, 0x32, 0x49, 0x21, 0x1B, 0x2C, 0xC5, 0x18, 0xEF, 0x1C, + 0xDC, 0x06, 0x1E, 0x02, 0x45, 0x03, 0x78, 0xEA, 0x5C, 0x01, 0x2D, 0xEA, + 0x52, 0xFC, 0xCE, 0xFD, 0x13, 0xFA, 0x8D, 0x15, 0xC6, 0x00, 0x4B, 0x15, + 0xC4, 0x05, 0x7E, 0xFC, 0xEE, 0xF1, 0xDE, 0xFD, 0x7D, 0xE8, 0x55, 0x06, + 0x3C, 0xF7, 0x7B, 0xFA, 0xF4, 0x01, 0xE4, 0xFF, 0xFD, 0x06, 0x6D, 0x03, + 0x51, 0x0C, 0xC5, 0xF8, 0xDD, 0x14, 0xF5, 0xFF, 0xE7, 0x23, 0x1E, 0x0C, + 0xC9, 0x23, 0x76, 0x0E, 0x1B, 0x0C, 0xE2, 0x10, 0x80, 0x03, 0x3A, 0x0C, + 0xAD, 0x00, 0x73, 0xFE, 0xA9, 0xEF, 0xD1, 0xF5, 0x2F, 0xF1, 0xF9, 0xF5, + 0xB4, 0xFE, 0x99, 0xFA, 0x79, 0x03, 0x6B, 0xFF, 0x7E, 0x08, 0xCF, 0x01, + 0x44, 0x04, 0x5B, 0x04, 0xE3, 0xFE, 0xDD, 0x0B, 0xF6, 0x0F, 0x4E, 0x1D, + 0x14, 0x1C, 0xC9, 0x1C, 0x82, 0x16, 0x09, 0x0A, 0x75, 0x14, 0xC7, 0x0B, + 0xDB, 0x1C, 0xFE, 0x18, 0x1F, 0x2E, 0x4F, 0x1C, 0x3F, 0x37, 0x7D, 0x1D, + 0x0C, 0x40, 0xEF, 0x25, 0xD1, 0x43, 0x5C, 0x27, 0xA2, 0x39, 0x31, 0x2E, + 0x33, 0x2F, 0x91, 0x41, 0xF7, 0x23, 0x61, 0x42, 0x29, 0x1E, 0xAD, 0x32, + 0x7C, 0x24, 0xC4, 0x35, 0x4E, 0x33, 0x59, 0x45, 0x40, 0x3C, 0x80, 0x3C, + 0x92, 0x37, 0x01, 0x32, 0x66, 0x35, 0x73, 0x40, 0x11, 0x2B, 0x0F, 0x47, + 0xC8, 0x17, 0xDC, 0x43, 0x19, 0x16, 0xCF, 0x42, 0x31, 0x1C, 0x0C, 0x36, + 0x23, 0x1E, 0x99, 0x34, 0x0B, 0x21, 0x84, 0x40, 0x56, 0x1F, 0x56, 0x38, + 0xD3, 0x1A, 0xE5, 0x21, 0xA1, 0x11, 0x7C, 0x13, 0xDE, 0x14, 0x1B, 0x17, + 0xC7, 0x1C, 0x65, 0x18, 0x06, 0x16, 0xCC, 0x16, 0xF2, 0x1E, 0xCD, 0x17, + 0xFA, 0x29, 0xA1, 0x0A, 0x69, 0x19, 0x90, 0x00, 0xA1, 0x07, 0x1E, 0x02, + 0xF0, 0x03, 0x91, 0xFC, 0xE6, 0x09, 0x51, 0xF3, 0x62, 0x1D, 0x8B, 0xF3, + 0xFC, 0x3B, 0x75, 0x00, 0x6A, 0x40, 0xAB, 0x08, 0x69, 0x25, 0xC4, 0x07, + 0x33, 0x11, 0x66, 0x02, 0x19, 0xF1, 0x1A, 0xF5, 0x73, 0xCD, 0x52, 0xE1, + 0x3F, 0xBF, 0x45, 0xD8, 0x24, 0xB8, 0x37, 0xDA, 0x56, 0xC1, 0x5E, 0xD9, + 0xC2, 0xC8, 0xC3, 0xE2, 0x37, 0xD3, 0x33, 0xDA, 0x2F, 0xE7, 0xC9, 0xCA, + 0x50, 0xDE, 0xFA, 0xD4, 0x7D, 0xC8, 0x1B, 0xDE, 0x45, 0xBF, 0xCC, 0xDD, + 0x04, 0xC0, 0x9F, 0xD5, 0x6B, 0xC2, 0xBC, 0xC9, 0x96, 0xD1, 0x00, 0xBF, + 0x90, 0xD8, 0xF2, 0xBD, 0x7F, 0xC4, 0x9C, 0xCA, 0xDE, 0xC2, 0x00, 0xCE, + 0x47, 0xD3, 0xC7, 0xD1, 0x03, 0xDA, 0x78, 0xE1, 0x51, 0xD7, 0xFF, 0xDD, + 0xC6, 0xBE, 0xC4, 0xC6, 0xBE, 0xB0, 0xEC, 0xBA, 0x6F, 0xBA, 0xA1, 0xB1, + 0xFC, 0xC2, 0xF4, 0xAE, 0xA3, 0xC4, 0x07, 0xBF, 0xA4, 0xC0, 0xAE, 0xD0, + 0x3E, 0xD6, 0x19, 0xDF, 0xE0, 0xFA, 0x23, 0xE9, 0xD4, 0x02, 0x9C, 0xF1, + 0x52, 0xF0, 0x27, 0xF0, 0xA9, 0xDD, 0x02, 0xE6, 0x82, 0xD7, 0xC0, 0xEC, + 0x14, 0xDF, 0x78, 0x02, 0xF1, 0xEF, 0x19, 0x0C, 0xFE, 0xFF, 0xD2, 0x05, + 0x4B, 0x0E, 0x1D, 0x03, 0x28, 0x19, 0xDB, 0x06, 0x17, 0x17, 0x16, 0x0E, + 0xC1, 0x0F, 0x4F, 0x15, 0xE3, 0x18, 0x32, 0x16, 0xA8, 0x20, 0x85, 0x17, + 0x95, 0x22, 0xB5, 0x1A, 0xF6, 0x22, 0xB9, 0x24, 0x2D, 0x14, 0x0B, 0x27, + 0x3D, 0x13, 0xFF, 0x20, 0xE3, 0x17, 0xD4, 0x28, 0x11, 0x1B, 0xFA, 0x24, + 0x3E, 0x2E, 0x94, 0x1A, 0x9C, 0x36, 0x03, 0x1C, 0x10, 0x2E, 0x5B, 0x1B, + 0x0A, 0x22, 0x83, 0x18, 0xEA, 0x17, 0xF5, 0x17, 0x52, 0x15, 0x2F, 0x1D, + 0xC9, 0x1C, 0xB8, 0x1E, 0xC7, 0x24, 0x14, 0x1C, 0xC5, 0x16, 0xC3, 0x18, + 0xAB, 0x04, 0x72, 0x0D, 0x16, 0x07, 0x92, 0x04, 0x38, 0x17, 0x22, 0x08, + 0x8F, 0x1C, 0x6A, 0x04, 0x56, 0x0D, 0x6E, 0x03, 0xFF, 0x00, 0x78, 0x0C, + 0x16, 0x13, 0x5A, 0x0B, 0x99, 0x1E, 0x90, 0x06, 0xD7, 0x0C, 0x2F, 0x15, + 0x47, 0x02, 0xBB, 0x20, 0xE8, 0x08, 0xB9, 0x07, 0x90, 0x0C, 0xB0, 0xED, + 0x30, 0x00, 0x7B, 0xE8, 0x83, 0xEF, 0xE7, 0xE0, 0x45, 0xD4, 0x41, 0xDD, + 0x6A, 0xC2, 0x8A, 0xF4, 0xDE, 0xD4, 0x17, 0x03, 0x8F, 0xE3, 0x49, 0xF3, + 0xF5, 0xE4, 0xF6, 0xE6, 0x31, 0xEE, 0x5F, 0xDC, 0x8E, 0xE9, 0x5E, 0xD1, + 0x4E, 0xD8, 0x6B, 0xE3, 0x0F, 0xCA, 0xB7, 0xEB, 0x38, 0xC9, 0xF0, 0xD6, + 0x43, 0xD5, 0x5A, 0xD4, 0x36, 0xE5, 0x6E, 0xD5, 0x6E, 0xED, 0x04, 0xD8, + 0x84, 0xE0, 0x16, 0xE8, 0x2D, 0xDE, 0x4C, 0xEA, 0x61, 0xE2, 0x29, 0xE5, + 0x68, 0xCB, 0x42, 0xE5, 0x1F, 0xB2, 0x0F, 0xDE, 0x58, 0xAB, 0xD0, 0xCB, + 0xEC, 0xB7, 0xF6, 0xC1, 0x89, 0xC6, 0x70, 0xBC, 0x5B, 0xC2, 0x11, 0xB2, + 0xE7, 0xC0, 0xF8, 0xB9, 0x8F, 0xCA, 0x5D, 0xD3, 0x1E, 0xD8, 0x46, 0xE7, + 0x4B, 0xE5, 0xD4, 0xDD, 0xFF, 0xDB, 0x0C, 0xCC, 0x90, 0xD4, 0x05, 0xCB, + 0xD4, 0xD8, 0x56, 0xC6, 0x11, 0xDC, 0xCA, 0xC5, 0xCB, 0xE3, 0xB4, 0xD5, + 0x43, 0xF1, 0xF3, 0xE3, 0x28, 0x0E, 0xE0, 0xEA, 0x28, 0x20, 0x2B, 0xF6, + 0x08, 0x15, 0xF4, 0xFF, 0xBD, 0x04, 0x50, 0x0D, 0xDB, 0xFB, 0x59, 0x1C, + 0x21, 0x07, 0x60, 0x16, 0xDE, 0x19, 0x67, 0x0F, 0x77, 0x1B, 0xCF, 0x10, + 0xEE, 0x17, 0x3C, 0x0E, 0x7D, 0x15, 0xC1, 0x17, 0x0C, 0x11, 0x9F, 0x2A, + 0xE3, 0x08, 0x39, 0x2D, 0x93, 0x18, 0x4A, 0x27, 0x0D, 0x38, 0xAF, 0x2B, + 0xBA, 0x36, 0x09, 0x2A, 0x73, 0x2A, 0x4E, 0x25, 0x50, 0x24, 0x49, 0x27, + 0xDE, 0x19, 0x88, 0x24, 0xFF, 0x1D, 0x6F, 0x2F, 0xEE, 0x27, 0xA8, 0x31, + 0xC4, 0x24, 0x4F, 0x22, 0xC7, 0x26, 0x8B, 0x29, 0x49, 0x3F, 0x4B, 0x38, + 0x3A, 0x48, 0x98, 0x2F, 0x92, 0x2F, 0x83, 0x26, 0x34, 0x18, 0x90, 0x29, + 0xA3, 0x15, 0x47, 0x26, 0x88, 0x28, 0xA9, 0x17, 0x00, 0x40, 0xD6, 0x13, + 0xA2, 0x48, 0xCF, 0x26, 0x88, 0x44, 0xDA, 0x34, 0xEB, 0x30, 0x91, 0x43, + 0x41, 0x29, 0x4C, 0x51, 0xDB, 0x32, 0x75, 0x3F, 0x6F, 0x29, 0xC9, 0x26, + 0x83, 0x1E, 0x4C, 0x18, 0x50, 0x0F, 0xFD, 0x05, 0xC1, 0xF4, 0xA5, 0x04, + 0x59, 0xF2, 0xC0, 0x15, 0xEF, 0x04, 0xF6, 0x18, 0x9A, 0x19, 0xE7, 0x18, + 0x12, 0x27, 0x2B, 0x24, 0x96, 0x27, 0xC9, 0x23, 0x3F, 0x15, 0xE0, 0x27, + 0x5A, 0xF8, 0x35, 0x32, 0xB2, 0xF8, 0x8C, 0x20, 0x4D, 0x03, 0x84, 0xFE, + 0x8D, 0x02, 0xF0, 0xF1, 0xFD, 0x10, 0xC4, 0xFF, 0x6D, 0x25, 0xA6, 0x09, + 0x1A, 0x2E, 0x12, 0x12, 0x20, 0x20, 0x3C, 0x1B, 0x3D, 0x07, 0x5A, 0x11, + 0xDC, 0xFE, 0xD0, 0x07, 0x1C, 0x07, 0x3B, 0x06, 0x8F, 0x1C, 0x0A, 0xF0, + 0x71, 0x1A, 0x40, 0xCC, 0x64, 0xF8, 0x99, 0xC8, 0x5C, 0xEC, 0x5B, 0xDF, + 0x08, 0xEE, 0xE1, 0xED, 0x3D, 0xEC, 0x17, 0xFA, 0x8C, 0xF6, 0xF8, 0x05, + 0x23, 0xF9, 0x50, 0x04, 0x01, 0xF1, 0x71, 0x02, 0x9F, 0xF0, 0x66, 0x03, + 0xF4, 0x08, 0xBB, 0xF8, 0x9F, 0x15, 0xC5, 0xF3, 0xFD, 0x11, 0xF6, 0xF7, + 0x5C, 0x1E, 0x93, 0xF2, 0xAC, 0x25, 0xE8, 0xFD, 0xD7, 0x22, 0xB1, 0x13, + 0x7C, 0x16, 0x0E, 0x1D, 0x10, 0x04, 0x1E, 0x26, 0xAB, 0xFE, 0xB9, 0x29, + 0xEE, 0xFF, 0x5A, 0x21, 0xD6, 0x09, 0xBD, 0x18, 0x10, 0x11, 0x5A, 0x0F, + 0x4D, 0x03, 0x85, 0x06, 0xFD, 0xFB, 0xE6, 0x0F, 0xF5, 0x04, 0xC1, 0x15, + 0xCF, 0x12, 0x80, 0x15, 0xAC, 0x14, 0x66, 0x14, 0x57, 0x10, 0xA0, 0x17, + 0x16, 0x07, 0xA5, 0x21, 0x1B, 0xFD, 0x11, 0x16, 0x5E, 0xFD, 0x56, 0x06, + 0x7B, 0xFD, 0x0F, 0x03, 0xCE, 0xF4, 0x63, 0x04, 0xC9, 0xF2, 0x26, 0x08, + 0x96, 0xFE, 0x89, 0x03, 0x15, 0x0A, 0x82, 0xFA, 0xC3, 0x15, 0xA4, 0xF2, + 0x7C, 0x10, 0xC3, 0xFC, 0x3E, 0xF9, 0x8B, 0x11, 0xD8, 0xDF, 0xD7, 0x0D, + 0x3B, 0xDB, 0x97, 0xF9, 0xDA, 0xF9, 0x85, 0xF1, 0xD3, 0x10, 0x20, 0xEB, + 0x9A, 0x0B, 0x55, 0xD8, 0xEE, 0xFB, 0x6C, 0xD8, 0xAD, 0xFA, 0x59, 0xE6, + 0x54, 0x06, 0x43, 0xDF, 0x10, 0xF8, 0x45, 0xD1, 0x94, 0xD7, 0x1B, 0xCC, + 0x84, 0xC4, 0x82, 0xC8, 0xEC, 0xBA, 0xEA, 0xC1, 0x52, 0xAE, 0x62, 0xB9, + 0xFF, 0xAF, 0xE7, 0xB0, 0x4E, 0xBD, 0x03, 0xA4, 0xDD, 0xBB, 0x24, 0xA8, + 0xC8, 0xCB, 0x18, 0xC1, 0xC8, 0xDF, 0x2F, 0xCE, 0xD7, 0xD7, 0x3B, 0xC7, + 0x8A, 0xCE, 0xC2, 0xC7, 0x1F, 0xBD, 0x38, 0xD3, 0xCB, 0xA4, 0xEC, 0xC4, + 0x68, 0xAC, 0xCA, 0xB6, 0xE7, 0xC3, 0x24, 0xBD, 0x65, 0xC5, 0x2A, 0xBB, + 0x08, 0xC5, 0xB3, 0xBF, 0x7A, 0xC7, 0x37, 0xD1, 0x91, 0xCD, 0xBF, 0xD6, + 0xB9, 0xD4, 0x31, 0xD0, 0x01, 0xC9, 0x6A, 0xC9, 0xCF, 0xB9, 0x54, 0xB9, + 0x20, 0xAF, 0x1B, 0xAB, 0x4D, 0xA4, 0x03, 0xAD, 0x32, 0xA5, 0xE2, 0xB7, + 0x6A, 0xB8, 0x39, 0xC3, 0xE1, 0xD0, 0xDE, 0xCC, 0x71, 0xDE, 0xCD, 0xD6, + 0x38, 0xE7, 0x07, 0xE6, 0xB1, 0xE8, 0x96, 0xF3, 0x25, 0xF2, 0x79, 0xFA, + 0xA0, 0xF5, 0x89, 0x01, 0xA9, 0xEF, 0xEE, 0xFD, 0xCE, 0xFC, 0xB5, 0xF6, + 0xC3, 0x02, 0xD6, 0xEF, 0x57, 0xF9, 0x64, 0xDE, 0x01, 0xF7, 0x2F, 0xE6, + 0xD7, 0xFD, 0xC9, 0xFC, 0xB3, 0x07, 0x85, 0x02, 0xA2, 0x12, 0xCE, 0x15, + 0x83, 0x1B, 0x66, 0x1F, 0x48, 0x16, 0xFE, 0x14, 0x5F, 0xFF, 0xE9, 0x1F, + 0xE6, 0xF2, 0xB3, 0x20, 0xD4, 0xF5, 0xA7, 0x0D, 0x25, 0xFE, 0xA2, 0x0B, + 0x5B, 0x09, 0xCE, 0x18, 0x0A, 0x14, 0x30, 0x26, 0x41, 0x25, 0xFF, 0x2E, + 0x92, 0x2C, 0xD1, 0x32, 0x3B, 0x32, 0x72, 0x30, 0x0F, 0x3A, 0xFF, 0x29, + 0xF2, 0x24, 0x8E, 0x29, 0x5D, 0x19, 0x0B, 0x26, 0x90, 0x23, 0xFB, 0x0F, + 0xC8, 0x24, 0x09, 0x09, 0xAE, 0x28, 0xCF, 0x19, 0xA2, 0x31, 0xD4, 0x1D, + 0xE6, 0x39, 0xF6, 0x1D, 0xA6, 0x34, 0xBC, 0x26, 0x1E, 0x2B, 0x64, 0x24, + 0xA2, 0x25, 0xFE, 0x26, 0x81, 0x2C, 0x34, 0x3E, 0x79, 0x40, 0x54, 0x45, + 0x6D, 0x41, 0xBB, 0x3E, 0xA9, 0x36, 0xD9, 0x35, 0xC9, 0x2C, 0x13, 0x1A, + 0x49, 0x1E, 0x75, 0x04, 0xA7, 0x0D, 0x2C, 0x09, 0xBC, 0x00, 0x09, 0x11, + 0xE2, 0xFA, 0x6F, 0x05, 0x45, 0x08, 0xAF, 0x04, 0x3A, 0x17, 0xF9, 0x11, + 0xAD, 0x10, 0xDE, 0x0D, 0xA9, 0x01, 0x53, 0x0A, 0x94, 0x01, 0x6E, 0x18, + 0xA3, 0x0E, 0x08, 0x1C, 0x0F, 0x16, 0xFA, 0x07, 0xD9, 0x0B, 0xF5, 0xFC, + 0x08, 0x01, 0x72, 0x06, 0x3C, 0x05, 0x31, 0x10, 0xCC, 0x0E, 0x82, 0x16, + 0xD8, 0x0F, 0x26, 0x0F, 0xEE, 0x07, 0x8C, 0x00, 0x38, 0xFD, 0x65, 0x09, + 0xB5, 0xFA, 0x42, 0x1C, 0xF7, 0xFC, 0x9B, 0x17, 0x7D, 0xEC, 0xC7, 0x0F, + 0x86, 0xE5, 0x28, 0x0A, 0x41, 0xF5, 0x18, 0xF1, 0x2D, 0xF0, 0xAF, 0xE1, + 0xB3, 0xE0, 0xDE, 0xEA, 0x5E, 0xED, 0x3C, 0xFC, 0x50, 0x06, 0x49, 0x11, + 0x75, 0x10, 0xCF, 0x1F, 0x1E, 0x09, 0xC8, 0x1D, 0x9D, 0x09, 0x93, 0x16, + 0xE9, 0x10, 0x24, 0x0F, 0x86, 0x13, 0x94, 0x07, 0xAD, 0x1B, 0xB2, 0x08, + 0x69, 0x26, 0xED, 0x0C, 0x53, 0x2A, 0x08, 0x11, 0x85, 0x34, 0xB9, 0x1C, + 0x51, 0x3C, 0x4B, 0x27, 0xE8, 0x2C, 0x94, 0x1D, 0x8A, 0x23, 0x16, 0x0F, + 0xA6, 0x2F, 0xE9, 0x1C, 0x18, 0x36, 0x57, 0x26, 0xC4, 0x25, 0x7A, 0x1B, + 0xF4, 0x0C, 0xAE, 0x1F, 0xF0, 0xFE, 0xB7, 0x20, 0xD8, 0x0E, 0x6F, 0x19, + 0x17, 0x1F, 0xBC, 0x1B, 0xC6, 0x1D, 0x5D, 0x12, 0x02, 0x22, 0xB4, 0x0E, + 0x38, 0x22, 0x2A, 0x1A, 0xED, 0x25, 0x8A, 0x12, 0x7D, 0x25, 0xF9, 0x0A, + 0xDE, 0x11, 0x15, 0x11, 0x0F, 0xFA, 0x79, 0x0F, 0x49, 0xF8, 0x0B, 0x0E, + 0x6E, 0x06, 0xC9, 0x0F, 0x5F, 0x07, 0xC8, 0x01, 0xF6, 0x0A, 0x5E, 0xF3, + 0xFE, 0x0C, 0xB6, 0xFF, 0x3B, 0x06, 0xCA, 0x0A, 0xC1, 0x0F, 0xCF, 0xFB, + 0xAC, 0x11, 0xC8, 0xF7, 0x4C, 0x0E, 0x20, 0x07, 0x46, 0x11, 0xDC, 0x05, + 0xE8, 0x00, 0xB8, 0x02, 0xEB, 0xF0, 0x5A, 0x1A, 0xDC, 0xF1, 0xA2, 0x23, + 0x74, 0xF4, 0x58, 0x0B, 0x05, 0xFA, 0x6E, 0x05, 0x38, 0xF9, 0xD9, 0x06, + 0x12, 0xDF, 0x65, 0xEA, 0x60, 0xD2, 0xDC, 0xDE, 0xD5, 0xD7, 0xBF, 0xEA, + 0x81, 0xD3, 0xD3, 0xE0, 0x12, 0xCF, 0x17, 0xD6, 0x39, 0xD5, 0x9F, 0xE1, + 0x79, 0xE0, 0x3C, 0xEB, 0x3B, 0xED, 0xBA, 0xF0, 0xAD, 0xED, 0x90, 0xEF, + 0xC3, 0xE1, 0x38, 0xE0, 0xC1, 0xE0, 0x61, 0xD8, 0x45, 0xE9, 0x09, 0xE1, + 0x61, 0xF1, 0xE7, 0xE0, 0x23, 0xF0, 0xC0, 0xDB, 0x1F, 0xDD, 0xB5, 0xE5, + 0x3E, 0xE3, 0xAD, 0xED, 0xA8, 0xE8, 0x15, 0xF0, 0xCD, 0xCD, 0x86, 0xF0, + 0x08, 0xD1, 0x03, 0xEE, 0x12, 0xDE, 0xC2, 0xED, 0xFF, 0xDB, 0x44, 0xE3, + 0x7B, 0xDE, 0xA7, 0xDB, 0xDD, 0xE5, 0x0C, 0xD6, 0x4D, 0xE7, 0x59, 0xCA, + 0x8A, 0xEE, 0x5A, 0xDC, 0x5F, 0xFC, 0x3D, 0xF2, 0x77, 0xF9, 0x4C, 0xF5, + 0x35, 0xF4, 0xB4, 0x00, 0xCA, 0xF3, 0x20, 0x0A, 0x06, 0xF6, 0x85, 0x02, + 0xFC, 0xFD, 0x9D, 0xF6, 0xFE, 0x04, 0xCB, 0xF3, 0x08, 0x12, 0x16, 0xF0, + 0x2A, 0x31, 0x2B, 0xF4, 0xD3, 0x46, 0x9A, 0xFF, 0x5A, 0x3F, 0x89, 0x07, + 0xCF, 0x2C, 0x38, 0x0D, 0xA5, 0x1E, 0xE7, 0x0B, 0xDE, 0x21, 0xD4, 0x16, + 0x0F, 0x23, 0xFE, 0x1E, 0x84, 0x13, 0x75, 0x1F, 0xEE, 0x0A, 0x74, 0x1F, + 0x0A, 0x0D, 0x36, 0x10, 0x61, 0x14, 0xD4, 0x0A, 0x44, 0x19, 0x94, 0x1B, + 0xB1, 0x14, 0x98, 0x20, 0x50, 0x1A, 0x63, 0x15, 0x91, 0x21, 0x93, 0x0E, + 0xC7, 0x1B, 0xEC, 0x0A, 0x88, 0x0D, 0x3A, 0x06, 0xB0, 0xFA, 0x71, 0x0A, + 0xC1, 0xE3, 0x07, 0x0F, 0xBD, 0xDD, 0xAF, 0x06, 0xA2, 0xEC, 0x61, 0x01, + 0xB8, 0x01, 0xF9, 0x09, 0x21, 0x10, 0xF2, 0x0C, 0xB6, 0x0B, 0x26, 0x0D, + 0x10, 0x00, 0xB9, 0x12, 0x30, 0x03, 0xD1, 0x17, 0x5A, 0x0A, 0x38, 0x16, + 0x0A, 0x11, 0x81, 0x11, 0x82, 0x14, 0x06, 0x16, 0x50, 0x0B, 0xBB, 0x12, + 0xDC, 0x09, 0x06, 0x01, 0xD5, 0x0E, 0xCE, 0xF6, 0x71, 0x0A, 0x33, 0xEE, + 0x1D, 0xFA, 0xA4, 0xE3, 0x92, 0xE4, 0x67, 0xE6, 0x61, 0xD5, 0x90, 0xE7, + 0xF7, 0xD6, 0x10, 0xE0, 0x60, 0xDA, 0x30, 0xE0, 0x06, 0xCC, 0x19, 0xDE, + 0x28, 0xBF, 0xF9, 0xD9, 0xB7, 0xC5, 0x7F, 0xE7, 0x85, 0xD9, 0xF4, 0xEE, + 0x41, 0xEF, 0x75, 0xE7, 0x35, 0xE9, 0xF6, 0xD7, 0x71, 0xD0, 0x4C, 0xCD, + 0x0A, 0xCF, 0x0A, 0xD1, 0x60, 0xD5, 0xC6, 0xC7, 0x94, 0xC8, 0x54, 0xB9, + 0x9A, 0xC4, 0x56, 0xB6, 0x4A, 0xC4, 0x3C, 0xAB, 0xF8, 0xB6, 0xBE, 0xA8, + 0xED, 0xB3, 0x5C, 0xBA, 0xAC, 0xBF, 0x42, 0xC3, 0xED, 0xC6, 0x4E, 0xC5, + 0x8D, 0xC4, 0x47, 0xC3, 0x5F, 0xC4, 0x46, 0xB9, 0x7E, 0xB8, 0x67, 0xC3, + 0xCD, 0xAF, 0xF4, 0xCE, 0x2D, 0xC4, 0xA1, 0xCF, 0xCA, 0xD0, 0xC6, 0xD3, + 0x25, 0xCE, 0x02, 0xC9, 0x2E, 0xD8, 0x57, 0xC8, 0x92, 0xEA, 0x6B, 0xD5, + 0x8B, 0xED, 0xC6, 0xDA, 0x11, 0xE9, 0x92, 0xEF, 0x52, 0xEA, 0x90, 0x05, + 0x63, 0xED, 0x6C, 0x03, 0xFD, 0xF3, 0xEA, 0x02, 0x0D, 0x03, 0x8E, 0x05, + 0x26, 0x14, 0x7A, 0x0B, 0x4B, 0x21, 0x58, 0x1C, 0x92, 0x2E, 0x98, 0x1E, + 0x58, 0x32, 0xB6, 0x11, 0xDE, 0x31, 0x57, 0x17, 0x86, 0x2E, 0x66, 0x2D, + 0x87, 0x26, 0xF5, 0x35, 0xB7, 0x25, 0x02, 0x36, 0xF5, 0x24, 0xD0, 0x32, + 0xF5, 0x21, 0x18, 0x2B, 0x9F, 0x19, 0x2C, 0x32, 0xF8, 0x1A, 0xD3, 0x34, + 0x95, 0x2C, 0x22, 0x26, 0x10, 0x2C, 0xCA, 0x1F, 0x6F, 0x32, 0x12, 0x2A, + 0xC0, 0x48, 0x1A, 0x3A, 0x21, 0x4C, 0xA4, 0x40, 0x6E, 0x3A, 0x04, 0x3C, + 0xB0, 0x28, 0xE3, 0x35, 0x74, 0x21, 0xB8, 0x2A, 0x60, 0x24, 0xFA, 0x21, + 0x68, 0x2F, 0xD9, 0x2A, 0x8C, 0x3A, 0x4A, 0x31, 0x43, 0x45, 0x31, 0x30, + 0x19, 0x4F, 0x42, 0x39, 0xA2, 0x52, 0x80, 0x3F, 0x34, 0x51, 0xC3, 0x47, + 0xA0, 0x42, 0x72, 0x5A, 0xF4, 0x32, 0x71, 0x52, 0x02, 0x35, 0x80, 0x3D, + 0xB7, 0x2F, 0xC1, 0x2D, 0xD3, 0x21, 0xDB, 0x09, 0x4C, 0x15, 0x78, 0x00, + 0x02, 0x06, 0x63, 0x19, 0x68, 0x0A, 0x01, 0x1F, 0xF4, 0x1B, 0xBF, 0x19, + 0x1D, 0x1F, 0x05, 0x16, 0x5C, 0x20, 0x09, 0x15, 0x7B, 0x21, 0x6F, 0x12, + 0xD6, 0x1C, 0x3C, 0x12, 0x61, 0x1F, 0x36, 0x13, 0xC4, 0x21, 0x25, 0x0B, + 0x76, 0x1A, 0xDE, 0x01, 0x5D, 0x14, 0x8E, 0x04, 0x27, 0x06, 0x07, 0x07, + 0xDD, 0xF2, 0x40, 0xF7, 0x6B, 0xF7, 0xBA, 0xF3, 0xF4, 0xFA, 0xF7, 0xF1, + 0xF3, 0xE8, 0xF7, 0xE2, 0x8C, 0xDF, 0x64, 0xDF, 0xA6, 0xE3, 0x53, 0xE6, + 0x24, 0xE6, 0x5B, 0xEE, 0x95, 0xE7, 0x79, 0xF3, 0xC2, 0xDD, 0x68, 0xF0, + 0x58, 0xD7, 0x04, 0xF2, 0xD6, 0xDF, 0x1F, 0xFB, 0x80, 0xDF, 0x34, 0xF8, + 0x38, 0xD6, 0x99, 0xF5, 0x34, 0xCF, 0xB4, 0xF4, 0x06, 0xD5, 0xAC, 0xF1, + 0xDA, 0xDB, 0x32, 0xFA, 0xEC, 0xD9, 0xAF, 0xF7, 0x1D, 0xDF, 0x2C, 0xEF, + 0x0C, 0xF0, 0x97, 0xF9, 0xE7, 0x05, 0x23, 0x01, 0x5F, 0x22, 0x53, 0x00, + 0x90, 0x27, 0x09, 0x07, 0x73, 0x0B, 0xF7, 0x0E, 0x86, 0x06, 0xBA, 0x07, + 0x8A, 0x19, 0x7F, 0x00, 0xFE, 0x18, 0x69, 0xFE, 0x4E, 0x17, 0x1B, 0xF1, + 0x7C, 0x16, 0xDC, 0xEC, 0xDB, 0x00, 0x4B, 0xFF, 0x09, 0xF8, 0x48, 0x0A, + 0x44, 0x02, 0x87, 0x0E, 0xCE, 0x04, 0x48, 0x18, 0x39, 0x00, 0x6D, 0x19, + 0xC2, 0xFA, 0x64, 0x18, 0x1A, 0xF8, 0xA7, 0x12, 0x9F, 0xF4, 0x01, 0x04, + 0x91, 0xEE, 0x1E, 0xF7, 0x4E, 0xEC, 0x18, 0xF3, 0xD6, 0xEE, 0x97, 0xFB, + 0xE4, 0xF0, 0x97, 0xF8, 0xE9, 0xEF, 0xD5, 0xEC, 0x14, 0xF0, 0xA0, 0xF1, + 0xDD, 0xF3, 0x96, 0xF1, 0x47, 0xF2, 0x0D, 0xEA, 0x8D, 0xE5, 0x6B, 0xF2, + 0x61, 0xE1, 0xA2, 0xF2, 0x7C, 0xE7, 0x64, 0xE8, 0x49, 0xF9, 0xDE, 0xE9, + 0xE1, 0x0B, 0x19, 0xDE, 0xE8, 0x01, 0xF3, 0xD1, 0x50, 0xEF, 0xA6, 0xDA, + 0x66, 0xE7, 0xCA, 0xDA, 0xEF, 0xE9, 0x23, 0xCF, 0x36, 0xE1, 0x59, 0xC2, + 0xA6, 0xCF, 0x45, 0xBC, 0x85, 0xCA, 0x2E, 0xC4, 0xEC, 0xBF, 0x53, 0xCE, + 0xA3, 0xB1, 0x36, 0xD6, 0xB5, 0xB9, 0xDC, 0xDC, 0x95, 0xD3, 0xC9, 0xD9, + 0xA0, 0xEF, 0x01, 0xE2, 0x3C, 0x01, 0x29, 0xF1, 0xCD, 0xF8, 0x9F, 0xE1, + 0x91, 0xE2, 0x07, 0xD3, 0x8A, 0xDA, 0x75, 0xDA, 0x96, 0xDB, 0xF8, 0xD4, + 0xB0, 0xC1, 0xD5, 0xBF, 0x2C, 0xAA, 0xC7, 0xB3, 0x1F, 0xB3, 0x35, 0xB2, + 0xD5, 0xBA, 0xD3, 0xB6, 0xB9, 0xC4, 0xC4, 0xCA, 0xA2, 0xD5, 0xA5, 0xDC, + 0xFD, 0xD9, 0x67, 0xE1, 0x04, 0xDD, 0xA0, 0xE4, 0x71, 0xF5, 0x90, 0xE9, + 0x18, 0xFF, 0x55, 0xE9, 0x8C, 0xDE, 0xE8, 0xE3, 0x96, 0xC1, 0x41, 0xDF, + 0xA6, 0xC1, 0xDD, 0xD9, 0x6C, 0xCB, 0xF6, 0xCF, 0x6A, 0xD9, 0x46, 0xD0, + 0xA1, 0xEF, 0xC3, 0xD8, 0x7E, 0x00, 0xAB, 0xD8, 0xDD, 0xFE, 0x4E, 0xE2, + 0xB6, 0xF8, 0x89, 0x04, 0x4E, 0xF1, 0xEC, 0x18, 0x5C, 0xEE, 0x5E, 0x14, + 0x95, 0xFF, 0xFC, 0x15, 0x44, 0x13, 0x50, 0x16, 0x52, 0x17, 0x64, 0x0E, + 0x66, 0x1A, 0x3A, 0x10, 0xFC, 0x21, 0x68, 0x13, 0xCB, 0x2F, 0xC9, 0x17, + 0x87, 0x40, 0xD3, 0x21, 0xBE, 0x46, 0x8E, 0x25, 0xA7, 0x38, 0xB7, 0x20, + 0x84, 0x2B, 0x6F, 0x1E, 0x4D, 0x26, 0xA6, 0x1D, 0xFD, 0x13, 0x20, 0x16, + 0xFC, 0x02, 0xCF, 0x11, 0xF7, 0x01, 0x0C, 0x1E, 0x58, 0x14, 0xE6, 0x2B, + 0x69, 0x2B, 0xE0, 0x2D, 0x15, 0x2A, 0xCC, 0x33, 0x56, 0x2B, 0x59, 0x37, + 0xE6, 0x3E, 0xC7, 0x35, 0x3A, 0x32, 0x3C, 0x37, 0xDF, 0x15, 0x9A, 0x33, + 0x0C, 0x17, 0x32, 0x2E, 0x00, 0x21, 0x2A, 0x2E, 0x0F, 0x2A, 0xCA, 0x35, + 0xC1, 0x3A, 0x71, 0x3F, 0x3B, 0x37, 0x69, 0x41, 0x39, 0x2A, 0xC3, 0x4C, + 0x13, 0x42, 0x4A, 0x54, 0x04, 0x59, 0xBB, 0x4B, 0xC1, 0x3E, 0x40, 0x4F, + 0x33, 0x1D, 0x7B, 0x4A, 0x4D, 0x1D, 0xAB, 0x32, 0xE2, 0x27, 0x45, 0x23, + 0x2E, 0x27, 0x0F, 0x10, 0x51, 0x22, 0x79, 0xF8, 0xA6, 0x23, 0x0A, 0xFB, + 0x55, 0x2B, 0x28, 0x15, 0xDE, 0x36, 0x7F, 0x2A, 0xBD, 0x3F, 0xE2, 0x36, + 0x96, 0x2F, 0xD2, 0x3E, 0x28, 0x22, 0x39, 0x39, 0xDA, 0x2B, 0x25, 0x2A, + 0xBA, 0x2B, 0x36, 0x1E, 0x91, 0x25, 0xA7, 0x13, 0x18, 0x22, 0xEB, 0x05, + 0xBF, 0x12, 0x01, 0xFA, 0x25, 0x06, 0x07, 0xFD, 0x9C, 0x07, 0x6A, 0x02, + 0x66, 0x0E, 0x83, 0x03, 0xE4, 0x18, 0x88, 0x05, 0x0F, 0x0D, 0x59, 0xFE, + 0x86, 0xEF, 0xD6, 0xF5, 0x03, 0xF2, 0x14, 0xFB, 0x2F, 0xF3, 0x2F, 0x04, + 0x9B, 0xE3, 0xD0, 0x00, 0xCD, 0xEB, 0x31, 0xFB, 0x0D, 0xF7, 0x17, 0xFA, + 0x5B, 0xF0, 0x32, 0xF0, 0xDE, 0xEE, 0x95, 0xF1, 0x73, 0xEA, 0x07, 0xFD, + 0x32, 0xDF, 0x78, 0xFE, 0xCC, 0xE6, 0xDE, 0x00, 0xE7, 0xF2, 0xE2, 0xFB, + 0x56, 0xFF, 0xE8, 0xF3, 0x00, 0x03, 0x5D, 0xF5, 0x8C, 0xF2, 0x63, 0xFF, + 0x2A, 0xF7, 0x7A, 0x07, 0x64, 0x12, 0x1A, 0x0B, 0xB5, 0x20, 0x50, 0x12, + 0x2B, 0x2A, 0xC5, 0x16, 0xEB, 0x23, 0x57, 0x14, 0x31, 0x12, 0x1F, 0x0C, + 0xA5, 0x14, 0xC8, 0x05, 0xCC, 0x19, 0x73, 0xFA, 0xB2, 0x0D, 0xEB, 0xEB, + 0x7C, 0x02, 0xE5, 0xEC, 0xC4, 0x00, 0xA8, 0xEC, 0x13, 0xFF, 0x70, 0xEC, + 0xCC, 0xFD, 0x6B, 0x01, 0xF7, 0x03, 0x70, 0x13, 0x17, 0x0C, 0x3A, 0x13, + 0x36, 0x03, 0x52, 0x1A, 0x62, 0xF7, 0x15, 0x12, 0x97, 0xF9, 0x55, 0xF9, + 0x43, 0xEF, 0xFE, 0xF1, 0x0B, 0xDC, 0x5C, 0xEF, 0xB6, 0xE7, 0x2F, 0xF8, + 0xDE, 0xFA, 0xEF, 0x08, 0x49, 0x08, 0xD5, 0x19, 0xAD, 0x17, 0x8F, 0x27, + 0x21, 0x13, 0x67, 0x28, 0x7B, 0x06, 0xCA, 0x2C, 0x19, 0x08, 0x71, 0x34, + 0x87, 0x11, 0x11, 0x28, 0xD0, 0x0E, 0x9C, 0x08, 0x58, 0x0C, 0x66, 0xED, + 0x33, 0x0A, 0x47, 0xDD, 0x0F, 0xFB, 0xE9, 0xE1, 0xD2, 0xF7, 0xD2, 0xF6, + 0xD6, 0xF7, 0xBF, 0xFA, 0xD3, 0xF3, 0xBA, 0xF5, 0x0E, 0xFC, 0xF1, 0xF7, + 0x56, 0xFE, 0x14, 0xF8, 0x34, 0xFA, 0x64, 0xF7, 0xB3, 0xF5, 0x9B, 0xFB, + 0xAE, 0xF4, 0x8D, 0x05, 0xD5, 0x00, 0xB6, 0x07, 0xA6, 0x07, 0xAC, 0x03, + 0xF7, 0x05, 0x16, 0x03, 0x32, 0x04, 0x84, 0x02, 0x07, 0xFF, 0x2C, 0x02, + 0x1C, 0xF9, 0x3D, 0xF4, 0x6C, 0xF4, 0xEC, 0xDA, 0xC7, 0xE7, 0xFE, 0xC1, + 0x3E, 0xE1, 0x84, 0xC6, 0xE8, 0xE3, 0x55, 0xDA, 0xD4, 0xE5, 0xC6, 0xD2, + 0x46, 0xE1, 0xA7, 0xD4, 0xEB, 0xE7, 0x96, 0xE8, 0x13, 0xFC, 0x22, 0xEA, + 0x38, 0xFC, 0x5F, 0xE9, 0xE2, 0xEF, 0xDE, 0xEC, 0x5D, 0xE6, 0x71, 0xDF, + 0xE7, 0xE6, 0x5C, 0xD0, 0x0F, 0xE1, 0xD6, 0xCC, 0xC8, 0xCE, 0xD0, 0xC5, + 0xFC, 0xC5, 0x38, 0xBF, 0x02, 0xCC, 0xD8, 0xCB, 0x5A, 0xE4, 0xAB, 0xE6, + 0xCD, 0xFC, 0x9D, 0xFB, 0xE5, 0x00, 0x5B, 0x0C, 0xF3, 0x03, 0x8A, 0x24, + 0x04, 0x02, 0xF5, 0x28, 0x7D, 0xF6, 0x34, 0x25, 0x0A, 0xFA, 0x88, 0x2D, + 0x0F, 0x12, 0x50, 0x26, 0x20, 0x20, 0xFC, 0x12, 0xC2, 0x1A, 0xDE, 0x11, + 0x15, 0x17, 0x44, 0x0E, 0x8B, 0x19, 0xD7, 0x01, 0x70, 0x1C, 0x15, 0x04, + 0x24, 0x2B, 0xBA, 0x09, 0x2A, 0x2E, 0x26, 0x07, 0x68, 0x18, 0xBF, 0x01, + 0x1B, 0x04, 0x4C, 0x02, 0xB3, 0x01, 0xFE, 0x0B, 0x9A, 0x09, 0x22, 0x13, + 0x0A, 0x03, 0xBD, 0x13, 0x43, 0xFF, 0x11, 0x17, 0x8B, 0x04, 0xE4, 0x18, + 0xC4, 0x09, 0x47, 0x1B, 0x69, 0x0E, 0xD3, 0x1B, 0xFA, 0x08, 0x0F, 0x0B, + 0x64, 0xF7, 0xF2, 0xFC, 0x3F, 0xEA, 0xA7, 0x03, 0xF6, 0xF1, 0x0D, 0x07, + 0x82, 0x00, 0x72, 0x05, 0x6E, 0x08, 0x8E, 0xFF, 0x5B, 0x08, 0xBC, 0xFB, + 0x3E, 0xFA, 0xB2, 0x0C, 0xBE, 0xED, 0x2A, 0x18, 0x64, 0xF5, 0xB5, 0x12, + 0xBC, 0xF5, 0xAE, 0x05, 0xEC, 0xE6, 0x8A, 0xED, 0x5A, 0xD8, 0x59, 0xD7, + 0xC9, 0xD0, 0x75, 0xD3, 0x9E, 0xCD, 0xAA, 0xD7, 0x4A, 0xD4, 0xB3, 0xDC, + 0x69, 0xEE, 0x9E, 0xE2, 0x49, 0xF9, 0x22, 0xE6, 0x04, 0x00, 0x5F, 0xEC, + 0x90, 0x14, 0xB8, 0xF1, 0xA1, 0x05, 0xEB, 0xF0, 0xE3, 0xE5, 0x39, 0xF1, + 0x29, 0xD8, 0x2E, 0xF1, 0x7B, 0xD0, 0x35, 0xE4, 0x9D, 0xD4, 0xA1, 0xD2, + 0x6B, 0xD6, 0x2F, 0xC8, 0xD0, 0xD0, 0x83, 0xBE, 0xDF, 0xCC, 0x6B, 0xB3, + 0x34, 0xC9, 0x9D, 0xB1, 0xAF, 0xCE, 0x02, 0xBA, 0xF4, 0xDE, 0xA4, 0xCC, + 0xB6, 0xE4, 0x9F, 0xD5, 0x1C, 0xD9, 0x1C, 0xCC, 0x20, 0xC1, 0xC3, 0xC2, + 0x22, 0xB4, 0x39, 0xB9, 0x4B, 0xB7, 0xA9, 0xB6, 0x0E, 0xB3, 0x01, 0xC2, + 0x21, 0xB5, 0xD4, 0xC7, 0x7A, 0xCD, 0xFF, 0xCA, 0x61, 0xE4, 0x72, 0xD0, + 0x63, 0xF1, 0xFF, 0xDC, 0x1C, 0xF3, 0xC0, 0xF1, 0xF1, 0xE0, 0x7B, 0xF4, + 0x38, 0xD5, 0x54, 0xEE, 0xA0, 0xED, 0xB1, 0xF7, 0x07, 0x18, 0xEA, 0x02, + 0x7D, 0x29, 0x1E, 0x07, 0xD6, 0x18, 0xAF, 0x0F, 0xCE, 0x0A, 0x6B, 0x17, + 0x59, 0x18, 0x7C, 0x1C, 0xB6, 0x25, 0xCA, 0x2F, 0x7F, 0x25, 0x40, 0x38, + 0xF3, 0x24, 0x24, 0x25, 0xC6, 0x27, 0x7C, 0x1F, 0x7F, 0x2D, 0x79, 0x26, + 0x17, 0x30, 0xCB, 0x1B, 0xAF, 0x33, 0x1A, 0x18, 0x37, 0x36, 0xC5, 0x26, + 0x00, 0x43, 0xE5, 0x31, 0x5F, 0x4F, 0x90, 0x2E, 0x0C, 0x49, 0x53, 0x2C, + 0x20, 0x45, 0x1E, 0x3C, 0xF9, 0x3C, 0xF6, 0x3E, 0xA2, 0x24, 0x8F, 0x37, + 0x62, 0x13, 0x42, 0x3C, 0xCF, 0x17, 0x51, 0x38, 0x98, 0x1E, 0xFC, 0x3A, + 0x50, 0x2E, 0x12, 0x49, 0x9C, 0x45, 0xB6, 0x3F, 0x6C, 0x3C, 0xEC, 0x33, + 0xA6, 0x2F, 0x23, 0x46, 0x9D, 0x4C, 0x9F, 0x53, 0x5D, 0x57, 0x04, 0x4A, + 0x9D, 0x2E, 0x94, 0x40, 0x7A, 0x0F, 0x66, 0x33, 0xB4, 0x0D, 0xE3, 0x26, + 0xA2, 0x0C, 0xC4, 0x20, 0xA3, 0x11, 0x88, 0x1B, 0x64, 0x17, 0x1D, 0x17, + 0x4B, 0x1B, 0x5C, 0x13, 0x6E, 0x34, 0x0B, 0x21, 0x46, 0x4B, 0xD3, 0x40, + 0xAA, 0x44, 0xCD, 0x47, 0x9D, 0x30, 0x2A, 0x38, 0xAC, 0x25, 0x89, 0x32, + 0x9D, 0x23, 0xB5, 0x2C, 0xC2, 0x1E, 0xB5, 0x13, 0x15, 0x1F, 0x2A, 0x01, + 0x38, 0x24, 0xDD, 0xFF, 0x3C, 0x1D, 0x4D, 0xF7, 0x64, 0x14, 0x95, 0xF6, + 0x11, 0x16, 0x8D, 0xFB, 0x01, 0x1F, 0xD5, 0x06, 0x98, 0x1D, 0xE2, 0x0D, + 0x62, 0x10, 0x1D, 0xFB, 0x8E, 0xF4, 0xEC, 0xED, 0xDC, 0xD9, 0x9F, 0xEA, + 0xE6, 0xD3, 0x2C, 0xE5, 0x45, 0xD3, 0x94, 0xEB, 0x95, 0xD6, 0x25, 0xEF, + 0x7E, 0xE0, 0x50, 0xEC, 0x00, 0xED, 0x1F, 0xE9, 0x2F, 0xEC, 0x6B, 0xE1, + 0xA3, 0xD8, 0xB7, 0xE2, 0xDB, 0xC6, 0xDF, 0xE6, 0x77, 0xC6, 0x11, 0xE3, + 0xE9, 0xD1, 0xE6, 0xE0, 0x0B, 0xE3, 0x82, 0xDF, 0x34, 0xEA, 0xED, 0xDB, + 0xA0, 0xDA, 0x13, 0xE5, 0x51, 0xD6, 0x64, 0xF3, 0x16, 0xE8, 0x7F, 0xFA, + 0x88, 0xF2, 0x7D, 0xFE, 0x12, 0xEE, 0x60, 0xF7, 0xB4, 0xED, 0x35, 0xF1, + 0x92, 0xEC, 0x53, 0xEB, 0x7D, 0xDB, 0xA7, 0xE4, 0xC5, 0xD6, 0xEF, 0xE9, + 0xCF, 0xDD, 0xC2, 0xF1, 0x5B, 0xDB, 0xA7, 0xF1, 0x84, 0xE7, 0x66, 0xF6, + 0xAC, 0xFD, 0x30, 0x01, 0x26, 0x06, 0x27, 0xFF, 0x93, 0x00, 0x66, 0xFD, + 0x7A, 0xFE, 0x6B, 0xFE, 0xA2, 0xFA, 0xF9, 0xF4, 0x96, 0xE8, 0x0A, 0xEB, + 0xE7, 0xDD, 0xD3, 0xDF, 0x70, 0xE2, 0xDC, 0xDA, 0x0A, 0xE9, 0x12, 0xE3, + 0x54, 0xF0, 0xE4, 0xEA, 0xDF, 0xFD, 0x85, 0xFD, 0x23, 0x04, 0x85, 0x11, + 0x7D, 0x05, 0xD1, 0x07, 0x75, 0x0B, 0x5D, 0xF7, 0x36, 0xF4, 0x8A, 0xE4, + 0x34, 0xD2, 0x35, 0xD3, 0xB6, 0xD0, 0xB1, 0xDB, 0x57, 0xC6, 0x67, 0xD5, + 0x03, 0xB7, 0x1B, 0xC2, 0x00, 0xCD, 0x3F, 0xC8, 0x8A, 0xE3, 0x6B, 0xD4, + 0x49, 0xDD, 0x33, 0xDC, 0xC1, 0xD9, 0xDF, 0xF0, 0x4C, 0xEA, 0xD6, 0xFF, + 0xFB, 0xF1, 0x6D, 0xF9, 0x14, 0xE9, 0x3B, 0xF1, 0xC9, 0xF5, 0x56, 0xEA, + 0x5A, 0xFB, 0x18, 0xE0, 0x08, 0xEA, 0x2C, 0xDE, 0xCA, 0xEE, 0xB2, 0xDC, + 0x6E, 0xF3, 0x8B, 0xD7, 0xA4, 0xD5, 0x72, 0xD4, 0x0E, 0xCB, 0xF2, 0xD0, + 0x32, 0xE0, 0x5C, 0xD4, 0x0B, 0xD7, 0x01, 0xD3, 0xA0, 0xD0, 0x16, 0xC4, + 0x4F, 0xDE, 0xBE, 0xBC, 0x65, 0xDB, 0x7C, 0xC3, 0xB7, 0xDC, 0x45, 0xCD, + 0x81, 0xE3, 0xF7, 0xD2, 0xE0, 0xDC, 0x26, 0xD6, 0x32, 0xDC, 0x0F, 0xD9, + 0x5C, 0xE8, 0xC0, 0xD5, 0x61, 0xE1, 0xCF, 0xC4, 0xE2, 0xC3, 0xF5, 0xB8, + 0x97, 0xB0, 0x85, 0xBE, 0x4E, 0xB6, 0x1E, 0xBC, 0x62, 0xC8, 0xD1, 0xC3, + 0x55, 0xCC, 0x07, 0xD5, 0x22, 0xD3, 0x9D, 0xD1, 0xC0, 0xE9, 0xF1, 0xDA, + 0xB7, 0xF5, 0x08, 0xEC, 0x35, 0xFB, 0x65, 0xF3, 0xF1, 0xFE, 0x2C, 0xFF, + 0xC6, 0xF1, 0x55, 0x04, 0x1A, 0xE0, 0x30, 0x01, 0xF7, 0xDC, 0x8B, 0xFF, + 0xED, 0xE1, 0x5B, 0xFA, 0x7E, 0xEE, 0x62, 0xEE, 0x9D, 0xFE, 0xB1, 0xE9, + 0xE9, 0x0B, 0xDE, 0xF3, 0x2B, 0x0B, 0xDB, 0xFB, 0x00, 0xFE, 0x26, 0x00, + 0xBF, 0x0A, 0x5E, 0x14, 0x7B, 0x19, 0x30, 0x26, 0x8E, 0x13, 0x46, 0x2C, + 0xE9, 0x13, 0xD6, 0x28, 0x51, 0x18, 0xF4, 0x1C, 0x8E, 0x15, 0xA1, 0x17, + 0xAE, 0x22, 0x8B, 0x1B, 0xEC, 0x35, 0x49, 0x27, 0x3F, 0x3E, 0x81, 0x28, + 0x8D, 0x4F, 0x19, 0x26, 0xB2, 0x51, 0xA1, 0x33, 0xEE, 0x4A, 0xFE, 0x33, + 0x99, 0x58, 0x18, 0x2D, 0x0C, 0x57, 0x66, 0x38, 0x81, 0x40, 0x0B, 0x46, + 0x25, 0x35, 0xEF, 0x4D, 0x94, 0x2E, 0x5E, 0x53, 0x1F, 0x23, 0xE1, 0x4C, + 0x57, 0x25, 0xF3, 0x3A, 0x90, 0x2B, 0x6E, 0x32, 0xBF, 0x1C, 0xDA, 0x2F, + 0x2D, 0x0E, 0x5E, 0x30, 0x92, 0x1A, 0x4F, 0x37, 0x9F, 0x32, 0x50, 0x33, + 0xD4, 0x3B, 0x6E, 0x2D, 0xAF, 0x3E, 0x80, 0x37, 0x75, 0x3C, 0x58, 0x41, + 0x6B, 0x2F, 0x87, 0x42, 0x59, 0x27, 0x99, 0x44, 0xDF, 0x28, 0x7F, 0x43, + 0x0F, 0x1E, 0xC8, 0x36, 0x3E, 0x12, 0x0E, 0x27, 0x62, 0x16, 0x40, 0x1C, + 0xF7, 0x16, 0xD2, 0x19, 0x3C, 0x15, 0x0E, 0x10, 0xBC, 0x1D, 0x60, 0xFF, + 0xD5, 0x1F, 0xF3, 0xF5, 0x12, 0x20, 0xA0, 0xF8, 0xCF, 0x21, 0xA3, 0xFE, + 0x8F, 0x13, 0x03, 0xFA, 0xEC, 0x00, 0x72, 0xF9, 0x52, 0xF8, 0x4B, 0xFF, + 0xEE, 0xF8, 0xF5, 0xFD, 0x3A, 0xF5, 0x07, 0xFC, 0x64, 0xF4, 0x33, 0xFF, + 0x13, 0xF9, 0x2B, 0xF4, 0xAD, 0xF0, 0xDB, 0xE3, 0x9D, 0xE9, 0x7A, 0xED, + 0x88, 0xF7, 0xCB, 0x03, 0x9E, 0x00, 0x34, 0x0C, 0x57, 0xF8, 0x65, 0x09, + 0xB2, 0xF7, 0x83, 0xFF, 0x2C, 0x02, 0x38, 0xF6, 0x27, 0xFD, 0x17, 0xF5, + 0x6B, 0xF6, 0x06, 0xF9, 0xEF, 0xFE, 0x6F, 0x00, 0x24, 0xFE, 0xD3, 0x00, + 0x46, 0x06, 0x1C, 0x00, 0x6C, 0x1A, 0x76, 0xFE, 0x76, 0x12, 0x90, 0xFA, + 0x83, 0xEE, 0x1D, 0x02, 0x2F, 0xDB, 0xA1, 0xFE, 0xF6, 0xE5, 0x17, 0xF2, + 0x41, 0xF4, 0xBB, 0xEE, 0xB9, 0x07, 0x06, 0xEC, 0xF1, 0x18, 0xBE, 0xEB, + 0x57, 0x0D, 0xEA, 0xF0, 0x14, 0xFB, 0x84, 0xF4, 0x83, 0xFA, 0xF8, 0xEC, + 0xFD, 0xF3, 0x4F, 0xF3, 0xF1, 0xE7, 0x57, 0x04, 0xF7, 0xEC, 0xC8, 0xFC, + 0xB8, 0xF0, 0x1F, 0xF6, 0x48, 0xF7, 0x52, 0x01, 0x2A, 0x15, 0x7C, 0x0C, + 0x46, 0x28, 0x07, 0x16, 0x95, 0x20, 0xDB, 0x19, 0x8A, 0x14, 0xFC, 0x20, + 0xC8, 0x17, 0x8B, 0x2E, 0xBA, 0x1F, 0x30, 0x25, 0x5B, 0x18, 0x85, 0x12, + 0xAE, 0xF4, 0xFB, 0x03, 0x3E, 0xDE, 0x9C, 0xF2, 0x56, 0xE6, 0xF4, 0xEE, + 0xB8, 0xED, 0x51, 0xF4, 0x90, 0xFB, 0xDA, 0xF6, 0x87, 0xFF, 0x8A, 0x00, + 0xFE, 0xF9, 0x78, 0x12, 0x20, 0xFF, 0xF0, 0x22, 0x00, 0x02, 0xC6, 0x23, + 0x87, 0xFF, 0xD1, 0x0D, 0x98, 0x05, 0x00, 0x01, 0xD1, 0x11, 0xF8, 0x08, + 0xC9, 0x0D, 0x40, 0x06, 0x47, 0x08, 0x90, 0x03, 0xF7, 0x04, 0xC7, 0x0B, + 0xDC, 0xF2, 0xF7, 0x03, 0x51, 0xE8, 0xD2, 0xF3, 0x5C, 0xD9, 0x1D, 0xEE, + 0xCA, 0xD1, 0x79, 0xF4, 0x81, 0xE3, 0xB6, 0xFD, 0x46, 0xEF, 0x12, 0xFF, + 0xD9, 0xEF, 0xBC, 0xF8, 0x63, 0xE8, 0xB0, 0xEE, 0x4F, 0xE9, 0x69, 0xDF, + 0x19, 0xFC, 0x1F, 0xDC, 0x03, 0x02, 0x69, 0xE2, 0x19, 0xFA, 0x68, 0xDF, + 0x78, 0xF6, 0x20, 0xDB, 0x82, 0xE8, 0x8C, 0xDB, 0xC3, 0xD5, 0xD0, 0xE2, + 0x04, 0xE1, 0xF8, 0xE8, 0xEE, 0xF6, 0xC7, 0xE0, 0x3A, 0x0A, 0x64, 0xDA, + 0x2D, 0x1A, 0x1E, 0xD8, 0xF1, 0x16, 0x9C, 0xDA, 0x83, 0x0D, 0x71, 0xEC, + 0x53, 0x08, 0x1E, 0xFF, 0x03, 0x03, 0xFB, 0x06, 0x33, 0x02, 0xC9, 0x05, + 0xA3, 0x0B, 0x78, 0xFF, 0x60, 0x0D, 0x74, 0xFA, 0xDE, 0xFC, 0x9E, 0xFD, + 0xDB, 0xF1, 0x5D, 0x00, 0x56, 0x01, 0x1B, 0x07, 0x00, 0x1A, 0xCD, 0x11, + 0xF2, 0x22, 0xC5, 0x10, 0x28, 0x1E, 0xD0, 0x0A, 0x22, 0x0C, 0x9E, 0x10, + 0x7B, 0xED, 0xDF, 0x18, 0xEB, 0xE5, 0x4B, 0x11, 0x1F, 0xED, 0x79, 0x07, + 0x7C, 0xEB, 0x12, 0x05, 0xDE, 0xF3, 0xA4, 0xFD, 0xE0, 0xFB, 0xD5, 0xF4, + 0xB9, 0xFB, 0x57, 0xF4, 0xCE, 0x0B, 0x05, 0x05, 0x46, 0x1C, 0x2C, 0x1C, + 0xFC, 0x15, 0x5A, 0x2B, 0xF0, 0x0D, 0xF6, 0x2F, 0x8D, 0x1E, 0x5D, 0x30, + 0x99, 0x26, 0xC8, 0x28, 0x40, 0x18, 0xB5, 0x16, 0xBF, 0x0C, 0x20, 0x09, + 0x3D, 0xF8, 0x34, 0xFB, 0x39, 0xE5, 0x72, 0xEF, 0xB7, 0xEF, 0x91, 0xE7, + 0xE8, 0x05, 0x77, 0xE3, 0x06, 0x06, 0x43, 0xF3, 0xFC, 0xF1, 0x35, 0xFA, + 0xBB, 0xEA, 0xAB, 0xFE, 0x17, 0xEB, 0xE7, 0x0F, 0x03, 0xF4, 0xD8, 0x0A, + 0x08, 0x07, 0x6C, 0x02, 0x29, 0xFE, 0x4E, 0x07, 0x3D, 0xE2, 0x9C, 0x05, + 0x22, 0xDC, 0x30, 0xFC, 0xB8, 0xE5, 0x38, 0xF6, 0xD6, 0xE4, 0x14, 0xEF, + 0x79, 0xDE, 0xB3, 0xD8, 0x06, 0xDA, 0x0A, 0xC4, 0x98, 0xCF, 0xDD, 0xC6, + 0x25, 0xD0, 0xE6, 0xD6, 0xDC, 0xDE, 0xC6, 0xDE, 0x17, 0xD8, 0xBA, 0xD8, + 0x7C, 0xC8, 0x04, 0xD1, 0xC8, 0xC3, 0x2A, 0xCE, 0xAB, 0xC7, 0x05, 0xD1, + 0xB5, 0xD3, 0x2E, 0xCE, 0x8C, 0xD3, 0x6F, 0xC2, 0x30, 0xD0, 0x0D, 0xBF, + 0x3E, 0xD4, 0xC8, 0xBF, 0xB1, 0xD2, 0xC8, 0xBF, 0x58, 0xD2, 0x95, 0xC5, + 0x37, 0xDB, 0x4B, 0xC8, 0xC7, 0xE6, 0xC8, 0xC4, 0xA8, 0xE4, 0x79, 0xC9, + 0x4F, 0xDB, 0x84, 0xD5, 0x99, 0xD4, 0x7A, 0xDF, 0x9D, 0xCF, 0x27, 0xEC, + 0xDB, 0xDA, 0xDE, 0xF8, 0x90, 0xEF, 0xFD, 0xFB, 0x78, 0xF6, 0x57, 0xF0, + 0x91, 0x00, 0x2E, 0xEB, 0xA3, 0xFF, 0x17, 0xEE, 0xB9, 0xEC, 0xE6, 0xEC, + 0xCB, 0xEF, 0x95, 0xF2, 0x47, 0x06, 0xB0, 0x02, 0xF8, 0x0D, 0x66, 0x0A, + 0x5D, 0x09, 0xBC, 0xFB, 0x29, 0x0C, 0x04, 0xFA, 0x27, 0x0C, 0x13, 0x07, + 0xA0, 0x13, 0x2C, 0x0A, 0x0C, 0x28, 0xE4, 0x14, 0xEB, 0x24, 0xEB, 0x1C, + 0xFA, 0x1A, 0x26, 0x1C, 0xFE, 0x1F, 0x3D, 0x22, 0x29, 0x1A, 0x06, 0x20, + 0xF5, 0x11, 0x4C, 0x15, 0xEC, 0x15, 0xDA, 0x12, 0x77, 0x28, 0xBC, 0x17, + 0xF6, 0x37, 0x0A, 0x28, 0xB0, 0x40, 0x12, 0x46, 0x1F, 0x4F, 0x6C, 0x5A, + 0x9A, 0x4A, 0xFB, 0x5B, 0xBD, 0x38, 0xF2, 0x56, 0x65, 0x30, 0x66, 0x4E, + 0xFB, 0x25, 0x6B, 0x41, 0x7A, 0x20, 0x42, 0x30, 0xEF, 0x2C, 0xD9, 0x2E, + 0x26, 0x39, 0x91, 0x3D, 0xD7, 0x31, 0x21, 0x42, 0xD6, 0x31, 0x9C, 0x4A, + 0xE4, 0x44, 0x1A, 0x55, 0xCC, 0x49, 0x63, 0x47, 0x0F, 0x49, 0x9C, 0x36, + 0xD3, 0x52, 0x91, 0x3B, 0x33, 0x55, 0x9D, 0x3B, 0x7F, 0x4D, 0xD8, 0x32, + 0x06, 0x40, 0x84, 0x30, 0x83, 0x36, 0x8E, 0x30, 0x4B, 0x28, 0x8E, 0x29, + 0x01, 0x14, 0x18, 0x21, 0x1B, 0x10, 0xA9, 0x2D, 0xB0, 0x11, 0xA0, 0x33, + 0xAC, 0x0D, 0x11, 0x1D, 0xAD, 0x10, 0xBE, 0x0D, 0x26, 0x13, 0xB7, 0x07, + 0xE2, 0x0B, 0x3A, 0xF6, 0x94, 0x03, 0x84, 0xEB, 0x0C, 0xFA, 0x4B, 0xEF, + 0xB8, 0xF2, 0x5A, 0xEF, 0x72, 0xF9, 0x96, 0xF1, 0x81, 0xF9, 0xFE, 0xFE, + 0xC1, 0xE8, 0x28, 0x02, 0x21, 0xE5, 0x59, 0xF7, 0x5F, 0xE7, 0x5B, 0xEA, + 0x06, 0xE7, 0xE1, 0xE1, 0x0E, 0xEE, 0x03, 0xE4, 0x22, 0xFD, 0x4F, 0xF2, + 0xAF, 0x0D, 0xCA, 0x01, 0x6A, 0x14, 0x6F, 0x08, 0x8E, 0x03, 0x89, 0x04, + 0xE2, 0xF9, 0x23, 0x00, 0x73, 0xFF, 0x8F, 0xF9, 0x0D, 0xFE, 0x5A, 0xED, + 0x37, 0xFD, 0x6F, 0xF8, 0x72, 0xF3, 0x1F, 0xFE, 0x5A, 0xED, 0x65, 0xE9, + 0x51, 0xF5, 0xB2, 0xEE, 0x39, 0xF6, 0xEF, 0xFE, 0x78, 0xF4, 0xAF, 0xF1, + 0xBF, 0xF8, 0x1F, 0xEF, 0xA1, 0x00, 0xDF, 0x02, 0xCE, 0x08, 0x50, 0xF9, + 0x7A, 0x0D, 0x0C, 0xEC, 0x28, 0xF9, 0x36, 0xF8, 0x17, 0xDE, 0xDB, 0xF6, + 0x76, 0xD6, 0xC8, 0xE6, 0xEC, 0xCF, 0x1C, 0xDE, 0xCB, 0xD7, 0xE9, 0xDD, + 0xCA, 0xE5, 0xBE, 0xEB, 0x87, 0xF2, 0x2C, 0x00, 0x99, 0x09, 0x42, 0x10, + 0x53, 0x08, 0xB1, 0x1B, 0x86, 0xFF, 0xB3, 0x1A, 0xF7, 0x0C, 0xCD, 0x0F, + 0x0D, 0x06, 0xBC, 0xFA, 0x5B, 0xE8, 0xAE, 0xE6, 0x5E, 0xE2, 0xCD, 0xE2, + 0xC6, 0xEE, 0x96, 0xD7, 0x73, 0xF4, 0x41, 0xD2, 0xA6, 0xEF, 0x96, 0xE0, + 0x18, 0xEA, 0xCB, 0xE4, 0x3A, 0xEF, 0x60, 0xE8, 0x84, 0xF8, 0xF6, 0xFA, + 0x6B, 0xFA, 0xA1, 0xFF, 0x5E, 0xF4, 0xAC, 0xF0, 0x18, 0xEF, 0x05, 0xF2, + 0x75, 0xED, 0x03, 0x00, 0xBF, 0xEE, 0xBA, 0xF3, 0x9C, 0xF2, 0x51, 0xE1, + 0xA0, 0xF2, 0xC6, 0xEB, 0x57, 0xEC, 0x9A, 0xF3, 0x67, 0xED, 0xBF, 0xEA, + 0xB9, 0xF6, 0xC7, 0xE8, 0x5F, 0xF6, 0xD7, 0xEA, 0x2C, 0xDF, 0xE4, 0xDF, + 0x2E, 0xD0, 0xFB, 0xD0, 0xEA, 0xC5, 0x0C, 0xC9, 0x4B, 0xAB, 0x26, 0xCD, + 0x0D, 0xA5, 0x6F, 0xD2, 0x06, 0xB3, 0xA4, 0xD4, 0xC9, 0xB6, 0xB3, 0xD3, + 0x69, 0xB4, 0xE7, 0xC3, 0x7F, 0xB8, 0x6F, 0xB1, 0x29, 0xC0, 0xFA, 0xAD, + 0xD8, 0xAF, 0x58, 0xB3, 0xFA, 0x9D, 0x03, 0xB8, 0x7D, 0xB3, 0x40, 0xB4, + 0xA5, 0xC4, 0x54, 0xAF, 0xC8, 0xC7, 0xE8, 0xBF, 0xB0, 0xD3, 0x45, 0xD5, + 0x52, 0xDF, 0x80, 0xDE, 0x9E, 0xE4, 0x02, 0xE3, 0x88, 0xE3, 0xF3, 0xE3, + 0x5F, 0xE1, 0xE2, 0xE3, 0x40, 0xDE, 0xD4, 0xDA, 0x2D, 0xE4, 0xED, 0xD6, + 0xF9, 0xEA, 0x41, 0xE0, 0xD8, 0xE9, 0x38, 0xDD, 0x68, 0xF0, 0x4E, 0xD7, + 0x38, 0xF4, 0x0B, 0xE6, 0x3A, 0xF4, 0x34, 0xF6, 0xF2, 0x00, 0x0B, 0x00, + 0x87, 0x13, 0x49, 0x0D, 0xE5, 0x1B, 0x14, 0x0A, 0xFD, 0x12, 0xF4, 0xF7, + 0xF3, 0x06, 0x6C, 0xF7, 0x19, 0xF7, 0x25, 0xFA, 0xA7, 0xEE, 0x3B, 0xF1, + 0x19, 0x07, 0x64, 0xF3, 0xC7, 0x21, 0x83, 0xFB, 0xDC, 0x20, 0x07, 0x02, + 0xFB, 0x16, 0x5C, 0x13, 0xF0, 0x17, 0x14, 0x25, 0xA1, 0x1C, 0xBF, 0x23, + 0xD9, 0x1E, 0x73, 0x23, 0xAB, 0x2D, 0x3D, 0x34, 0x39, 0x38, 0x24, 0x36, + 0x4F, 0x28, 0xF8, 0x21, 0x58, 0x1C, 0x9A, 0x22, 0xB7, 0x19, 0xAA, 0x28, + 0xC6, 0x16, 0xA6, 0x1E, 0x3A, 0x0F, 0x2B, 0x1B, 0x56, 0x0B, 0xE4, 0x17, + 0xE0, 0x17, 0xBB, 0x0C, 0x1E, 0x1D, 0xB3, 0x10, 0x95, 0x20, 0x0D, 0x28, + 0xB8, 0x2A, 0xC7, 0x32, 0x12, 0x28, 0x74, 0x32, 0x33, 0x23, 0x0C, 0x44, + 0x5C, 0x28, 0xB3, 0x51, 0xB1, 0x33, 0xF1, 0x3D, 0x93, 0x34, 0xDB, 0x33, + 0xC2, 0x2C, 0x95, 0x3F, 0x61, 0x24, 0xD6, 0x32, 0x9A, 0x15, 0x42, 0x26, + 0x82, 0x1C, 0x98, 0x2A, 0x7D, 0x2B, 0x22, 0x20, 0x9D, 0x23, 0x5F, 0x17, + 0x40, 0x20, 0x75, 0x1B, 0x78, 0x22, 0xD1, 0x22, 0xC1, 0x1D, 0x62, 0x29, + 0x00, 0x1C, 0x93, 0x29, 0xD9, 0x1C, 0xB4, 0x1E, 0x14, 0x1C, 0x70, 0x10, + 0xAB, 0x06, 0xA8, 0x08, 0xE0, 0xF4, 0xB4, 0xFF, 0x82, 0xED, 0x3D, 0xF2, + 0xE6, 0xE1, 0x60, 0xF1, 0x5E, 0xF0, 0x5D, 0xF7, 0x93, 0x01, 0x65, 0xF6, + 0xEF, 0xF9, 0x7E, 0xF8, 0x13, 0xF5, 0x05, 0x03, 0xD4, 0x02, 0xCF, 0x0A, + 0xE2, 0x11, 0xD7, 0x04, 0x65, 0x09, 0x0D, 0xFF, 0xB0, 0xFA, 0x3C, 0x02, + 0x0E, 0xF5, 0xFF, 0xFE, 0x6D, 0xF9, 0xBF, 0x04, 0x9C, 0x06, 0x3C, 0x13, + 0x8A, 0x0D, 0xDA, 0x10, 0xDD, 0x0E, 0x97, 0x0A, 0x72, 0x0D, 0x0E, 0x0F, + 0x3B, 0x0C, 0x15, 0x10, 0x39, 0x15, 0x1E, 0x0A, 0xBC, 0x15, 0x41, 0x07, + 0xF1, 0x0D, 0xC3, 0x03, 0xEB, 0x0F, 0xDE, 0xF2, 0xBD, 0x19, 0x67, 0xEB, + 0x64, 0x17, 0x9A, 0xF3, 0xFA, 0x0F, 0x2B, 0xFD, 0xC4, 0x13, 0x45, 0x07, + 0x4E, 0x1D, 0xF6, 0x10, 0xD1, 0x1E, 0xB4, 0x12, 0x68, 0x18, 0xFA, 0x0E, + 0x57, 0x1B, 0xB9, 0x0F, 0x32, 0x1F, 0xA0, 0x0F, 0x11, 0x1B, 0x4F, 0x0D, + 0x63, 0x28, 0x36, 0x15, 0x65, 0x39, 0x6B, 0x1B, 0xBB, 0x27, 0x11, 0x11, + 0x2F, 0x09, 0xA0, 0x09, 0xA2, 0xF7, 0x60, 0x02, 0x5A, 0xFA, 0x2C, 0xF1, + 0x42, 0xFB, 0x46, 0xE1, 0x73, 0xF5, 0xB8, 0xE1, 0x1F, 0xF7, 0x7F, 0xEA, + 0xD8, 0xF9, 0x3E, 0xF9, 0xC2, 0x06, 0xBF, 0x10, 0xA8, 0x1D, 0x72, 0x22, + 0x7B, 0x16, 0x18, 0x1E, 0xC3, 0xFE, 0xBE, 0x17, 0xD5, 0xFE, 0xC9, 0x1C, + 0x76, 0x04, 0x78, 0x10, 0x99, 0xF9, 0xBE, 0xFA, 0x4F, 0xED, 0x8C, 0xFF, + 0xFF, 0xDF, 0x6B, 0x04, 0x33, 0xD5, 0xE3, 0xFE, 0x51, 0xD9, 0x6C, 0x00, + 0xF0, 0xDE, 0xE7, 0xF9, 0xB9, 0xD9, 0x74, 0xEE, 0x29, 0xD6, 0xE9, 0xF0, + 0x4A, 0xE6, 0x85, 0xFB, 0x3C, 0xEF, 0x89, 0xFF, 0x6A, 0xE2, 0xE9, 0xFC, + 0x6C, 0xD9, 0x3C, 0xED, 0xD5, 0xD9, 0x83, 0xDC, 0xAF, 0xD8, 0xC1, 0xD8, + 0x54, 0xE8, 0x39, 0xD9, 0x3A, 0xF9, 0xDA, 0xD9, 0x81, 0xEA, 0xD0, 0xE0, + 0x0A, 0xDE, 0xA6, 0xE8, 0x9B, 0xE6, 0x57, 0xE3, 0x98, 0xE9, 0x89, 0xE6, + 0xF0, 0xEA, 0xE9, 0xFC, 0xAC, 0xEA, 0x81, 0x00, 0xB9, 0xE0, 0xAB, 0xF1, + 0x34, 0xE1, 0xD7, 0xF4, 0x20, 0xF3, 0xBD, 0x08, 0x39, 0x05, 0xC7, 0x07, + 0x67, 0x08, 0x39, 0xFC, 0x65, 0xF9, 0x67, 0xFE, 0x3F, 0xF4, 0x23, 0xF3, + 0x33, 0x01, 0x91, 0xEE, 0x7D, 0x06, 0xD9, 0x04, 0x17, 0xFF, 0xCD, 0x04, + 0x51, 0xF0, 0xBB, 0xF5, 0x1B, 0xED, 0x1D, 0xF8, 0xA8, 0x00, 0xB4, 0xFC, + 0x2E, 0x14, 0x00, 0xF9, 0xC8, 0x1B, 0x0F, 0xFA, 0xE1, 0x10, 0x16, 0x02, + 0x29, 0x0D, 0x3A, 0x07, 0x83, 0x19, 0xD0, 0x05, 0xA0, 0x1E, 0xD8, 0x07, + 0x01, 0x1D, 0x1B, 0x06, 0x80, 0x1F, 0xAC, 0x07, 0xCF, 0x2F, 0xD7, 0x11, + 0x39, 0x41, 0xCC, 0x13, 0x4A, 0x48, 0x61, 0x1B, 0xF5, 0x49, 0xAD, 0x36, + 0x81, 0x41, 0xC1, 0x46, 0x29, 0x33, 0xF3, 0x30, 0xEB, 0x1F, 0x52, 0x1A, + 0xA0, 0x06, 0xCC, 0x0E, 0xDE, 0xFB, 0x3C, 0xF6, 0x48, 0x00, 0x5D, 0xF0, + 0x3A, 0x00, 0xB4, 0xFF, 0x53, 0xFF, 0xAA, 0x04, 0xEE, 0x10, 0x5C, 0x14, + 0x26, 0x24, 0xDF, 0x2C, 0xAF, 0x27, 0x8C, 0x2F, 0x54, 0x2D, 0x45, 0x1A, + 0x84, 0x2B, 0x82, 0x0F, 0x97, 0x17, 0x31, 0x1D, 0x8E, 0x11, 0x4A, 0x20, + 0x40, 0x19, 0x5A, 0x12, 0x8E, 0x07, 0x89, 0x0A, 0x1F, 0xE5, 0x5E, 0x02, + 0x15, 0xDC, 0xFD, 0xF1, 0x69, 0xE3, 0x72, 0xE3, 0xE1, 0xE0, 0xE1, 0xE0, + 0x35, 0xD8, 0xF2, 0xDE, 0x41, 0xD2, 0xC7, 0xDE, 0xAC, 0xD3, 0x02, 0xE3, + 0xF9, 0xCC, 0x95, 0xDE, 0xAA, 0xBA, 0xCF, 0xD9, 0x46, 0xB1, 0x90, 0xD5, + 0xEF, 0xB1, 0x07, 0xCF, 0xF9, 0xAF, 0xA4, 0xC6, 0xD8, 0xB9, 0x3E, 0xC3, + 0x0E, 0xD3, 0xA5, 0xCE, 0xED, 0xD4, 0x44, 0xD8, 0x79, 0xBD, 0xE5, 0xD0, + 0x89, 0xB0, 0x59, 0xC7, 0xAE, 0xB4, 0xFF, 0xC5, 0x60, 0xC1, 0xE8, 0xC8, + 0x32, 0xD9, 0x1C, 0xD0, 0xCF, 0xEE, 0xD3, 0xCF, 0x04, 0xF0, 0xAF, 0xC3, + 0x9B, 0xE5, 0x56, 0xCD, 0x2B, 0xD6, 0xCC, 0xE2, 0x8A, 0xC6, 0xF9, 0xE0, + 0xA9, 0xCB, 0x62, 0xE1, 0xF7, 0xD9, 0xC7, 0xE3, 0xD8, 0xD8, 0x27, 0xD5, + 0xA0, 0xD5, 0x5B, 0xD2, 0x07, 0xE5, 0x26, 0xE3, 0x45, 0xE7, 0xD4, 0xE5, + 0xEA, 0xD9, 0x4D, 0xE4, 0x05, 0xDB, 0x3D, 0xEA, 0x9A, 0xE0, 0x8D, 0xE8, + 0x0C, 0xEA, 0xC8, 0xE6, 0xD4, 0xF8, 0xE9, 0xEC, 0xAE, 0xFA, 0xE6, 0xF1, + 0xA5, 0xE8, 0x0A, 0xEF, 0x87, 0xE7, 0x6F, 0xF7, 0x15, 0xF1, 0xE6, 0x08, + 0x82, 0xF1, 0xAE, 0x1A, 0xF3, 0x04, 0xDC, 0x2B, 0x30, 0x2F, 0xC2, 0x27, + 0x40, 0x4C, 0x47, 0x16, 0xE0, 0x4E, 0xFF, 0x1F, 0xFA, 0x37, 0x7B, 0x2F, + 0xE9, 0x21, 0x27, 0x28, 0x1A, 0x24, 0x60, 0x23, 0x95, 0x2C, 0xC5, 0x24, + 0x91, 0x35, 0x3C, 0x14, 0xCB, 0x3B, 0xB3, 0x02, 0x26, 0x2C, 0x5B, 0x03, + 0x4B, 0x1D, 0x20, 0x07, 0x75, 0x2A, 0xFB, 0x12, 0x83, 0x3A, 0x4B, 0x29, + 0xB1, 0x49, 0x9C, 0x32, 0x24, 0x5E, 0x1D, 0x34, 0xAF, 0x5B, 0x6C, 0x3A, + 0x2B, 0x41, 0x2A, 0x3B, 0x59, 0x30, 0x7F, 0x3D, 0x43, 0x39, 0x3F, 0x41, + 0xD6, 0x3C, 0x5E, 0x38, 0x2F, 0x2A, 0xFD, 0x28, 0x48, 0x29, 0x3C, 0x26, + 0xA8, 0x2C, 0x17, 0x2C, 0x7D, 0x25, 0xF5, 0x28, 0x80, 0x28, 0xA2, 0x2E, + 0x5A, 0x14, 0x62, 0x3C, 0x70, 0xF6, 0xE6, 0x30, 0x26, 0x03, 0x47, 0x21, + 0xA1, 0x14, 0xDE, 0x1C, 0x01, 0x05, 0xB9, 0x10, 0x1D, 0xF7, 0x74, 0x03, + 0x1B, 0xF2, 0xDA, 0x00, 0x67, 0xF0, 0x0F, 0xFD, 0x4C, 0x08, 0xD1, 0xF7, + 0xE3, 0x18, 0x5F, 0xFC, 0x56, 0x05, 0x3E, 0xFE, 0x9E, 0xF2, 0x6A, 0x00, + 0x95, 0xF7, 0x47, 0x13, 0x73, 0x01, 0x8E, 0x1E, 0xD5, 0x04, 0x4C, 0x1C, + 0xF3, 0x09, 0x97, 0x0C, 0x28, 0x17, 0x01, 0xF5, 0xE2, 0x14, 0xCF, 0xF7, + 0xAC, 0x08, 0x36, 0x05, 0xDB, 0x0F, 0xB5, 0x07, 0x82, 0x19, 0xBF, 0x04, + 0xE2, 0x1B, 0xC2, 0xFD, 0x04, 0x1D, 0x05, 0xFC, 0xF4, 0x14, 0x0B, 0x02, + 0x45, 0x0B, 0xEE, 0x0B, 0x58, 0x0B, 0x41, 0x15, 0xDD, 0x0A, 0x0E, 0x1E, + 0x04, 0xFB, 0x14, 0x1C, 0xBD, 0xFA, 0xE7, 0x16, 0x86, 0x11, 0x5B, 0x0E, + 0x9D, 0x15, 0xCC, 0xF8, 0x80, 0x02, 0x1F, 0xF5, 0xF6, 0xEE, 0x9E, 0x02, + 0x0D, 0xE9, 0x39, 0x0C, 0xAC, 0xF1, 0xFA, 0x1E, 0x96, 0x03, 0xAA, 0x2F, + 0xF9, 0x14, 0xC1, 0x2D, 0xF3, 0x1E, 0x87, 0x29, 0x76, 0x25, 0xC9, 0x24, + 0x29, 0x31, 0x09, 0x17, 0xDB, 0x27, 0x5B, 0x0A, 0x86, 0x0E, 0xF5, 0x09, + 0x7C, 0x05, 0xBA, 0x0B, 0x06, 0x02, 0x28, 0x08, 0xCE, 0xFD, 0x1F, 0xFE, + 0x3E, 0xFE, 0x7D, 0xEF, 0xC6, 0xF7, 0x7A, 0xE2, 0xC2, 0xF2, 0x55, 0xE2, + 0xE8, 0x00, 0x72, 0xF6, 0xA4, 0x13, 0x86, 0x0C, 0xFA, 0x26, 0x74, 0x14, + 0x5E, 0x31, 0x57, 0x18, 0x27, 0x19, 0xBA, 0x17, 0xE0, 0xFC, 0xED, 0x1D, + 0xCD, 0xFD, 0xB6, 0x21, 0x9D, 0x02, 0xD2, 0x00, 0xF9, 0xFC, 0x45, 0xE3, + 0xDF, 0xF5, 0x47, 0xE7, 0xE7, 0xEB, 0x9F, 0xE6, 0xE9, 0xDF, 0xBC, 0xE1, + 0xC4, 0xDB, 0x1A, 0xE2, 0xCD, 0xCE, 0x76, 0xCE, 0x08, 0xB8, 0x0C, 0xBF, + 0xAB, 0xBF, 0x7A, 0xC8, 0xFE, 0xD2, 0x36, 0xC1, 0x82, 0xCD, 0x76, 0xAF, + 0xF6, 0xC6, 0x0E, 0xB2, 0xC4, 0xC4, 0x36, 0xB9, 0xB8, 0xAF, 0xBC, 0xBD, + 0x40, 0xA8, 0xA4, 0xC2, 0x1A, 0xB8, 0x15, 0xB3, 0x59, 0xB8, 0xD5, 0x9E, + 0x4E, 0xAC, 0x15, 0xA5, 0xA4, 0xAA, 0x45, 0xB9, 0x39, 0xAC, 0x38, 0xCC, + 0x6B, 0xB3, 0xEE, 0xD6, 0xF1, 0xC4, 0xF4, 0xD9, 0xEF, 0xCD, 0xF6, 0xCE, + 0xEA, 0xC7, 0xA3, 0xBE, 0x81, 0xBC, 0x24, 0xC5, 0x16, 0xB6, 0x5B, 0xD6, + 0x3C, 0xAE, 0x7B, 0xDA, 0x17, 0xAB, 0x5D, 0xDC, 0x9F, 0xB7, 0x2C, 0xDD, + 0x01, 0xCD, 0x29, 0xD5, 0xE8, 0xD8, 0xFB, 0xD3, 0x80, 0xDD, 0x39, 0xD8, + 0xF3, 0xE4, 0x7F, 0xD3, 0xF7, 0xE8, 0x4B, 0xD6, 0x34, 0xEA, 0x0E, 0xDD, + 0x57, 0xF7, 0xFD, 0xE1, 0x75, 0xFB, 0x00, 0xE5, 0xA9, 0xED, 0x7C, 0xDE, + 0xBF, 0xE6, 0xC5, 0xD7, 0xBC, 0xEB, 0x7C, 0xE0, 0xDB, 0xEF, 0xB6, 0xEF, + 0x98, 0xFE, 0xC8, 0xFE, 0xBB, 0x12, 0x59, 0x0E, 0x59, 0x11, 0xA9, 0x13, + 0x92, 0x12, 0xE2, 0x0F, 0x10, 0x1C, 0x4D, 0x0D, 0xE9, 0x0B, 0x9B, 0x0C, + 0xE9, 0xEB, 0x44, 0x0D, 0xA6, 0xE9, 0xFA, 0x0F, 0x44, 0xF8, 0xBB, 0x07, + 0xFC, 0xEF, 0x50, 0xFD, 0x23, 0xF2, 0xBC, 0x02, 0x82, 0x0D, 0x7D, 0x0C, + 0xF0, 0x0E, 0x64, 0x14, 0xB6, 0x08, 0x90, 0x1F, 0x90, 0x18, 0xD5, 0x27, + 0xAD, 0x29, 0x9A, 0x21, 0x1A, 0x38, 0x71, 0x1C, 0xCF, 0x41, 0x2E, 0x29, + 0xDC, 0x45, 0x3E, 0x2E, 0x56, 0x42, 0x40, 0x23, 0x23, 0x3E, 0x19, 0x1C, + 0x12, 0x46, 0xF9, 0x18, 0xB6, 0x43, 0xE0, 0x0F, 0xBA, 0x29, 0xE8, 0x0C, + 0xBA, 0x1A, 0x73, 0x11, 0xBD, 0x18, 0x05, 0x14, 0x35, 0x0C, 0xC8, 0x10, + 0xB6, 0x07, 0x34, 0x04, 0x22, 0x0D, 0x06, 0x00, 0x02, 0x0D, 0x69, 0x04, + 0xD5, 0x17, 0x18, 0x05, 0x65, 0x1F, 0x17, 0x07, 0xF1, 0x0A, 0xF9, 0x04, + 0x50, 0xF7, 0xDC, 0xFE, 0xE1, 0xEC, 0xCA, 0xF4, 0x00, 0xE0, 0x60, 0xEC, + 0xD0, 0xDA, 0x07, 0xEF, 0x1E, 0xE7, 0x0E, 0xF4, 0x2B, 0xF6, 0xA0, 0xF9, + 0x1D, 0xFD, 0x20, 0x09, 0xE6, 0x03, 0x17, 0x15, 0x67, 0x10, 0x2B, 0x12, + 0xCF, 0x16, 0x54, 0x10, 0x69, 0x0D, 0x2A, 0x0F, 0x32, 0x00, 0x7C, 0x04, + 0xDB, 0xFE, 0xAC, 0x06, 0xC8, 0xFD, 0xF1, 0x17, 0x57, 0xFD, 0xE7, 0x1C, + 0x8A, 0x08, 0xE2, 0x1A, 0x0E, 0x14, 0x39, 0x18, 0xBA, 0x14, 0x29, 0x10, + 0x32, 0x0C, 0xCD, 0x12, 0xEA, 0x10, 0x74, 0x1C, 0x6A, 0x21, 0xA5, 0x1D, + 0x03, 0x20, 0xB0, 0x19, 0xA7, 0x16, 0x8A, 0x19, 0x36, 0x0A, 0x35, 0x19, + 0xD8, 0xF0, 0xC7, 0x1A, 0xA8, 0xFB, 0x1F, 0x2B, 0xAA, 0x24, 0xA3, 0x2D, + 0xE9, 0x31, 0xDA, 0x16, 0xC4, 0x3B, 0x27, 0x1C, 0x45, 0x5B, 0x0E, 0x3A, + 0x19, 0x5F, 0x0E, 0x38, 0x14, 0x4B, 0x01, 0x3A, 0xDF, 0x42, 0x5B, 0x51, + 0xAD, 0x2A, 0x96, 0x49, 0x0D, 0x12, 0xF3, 0x37, 0x65, 0x1B, 0x0F, 0x3D, + 0x69, 0x13, 0xC6, 0x2C, 0x1A, 0x05, 0x7F, 0x0B, 0xDC, 0x1C, 0x3F, 0x06, + 0xAB, 0x29, 0x5B, 0x0A, 0x2F, 0x17, 0xAE, 0x0C, 0xA1, 0x11, 0xCB, 0x1D, + 0x4C, 0x24, 0x20, 0x30, 0x0B, 0x29, 0x02, 0x36, 0xC9, 0x23, 0x8E, 0x2D, + 0x36, 0x2A, 0x9F, 0x1E, 0x1E, 0x25, 0xB3, 0x1C, 0x85, 0x1F, 0x7B, 0x24, + 0x3F, 0x27, 0xCA, 0x29, 0xD3, 0x2B, 0x7F, 0x22, 0xFA, 0x2A, 0x7A, 0x09, + 0xE7, 0x1D, 0x7A, 0xF3, 0x0F, 0x04, 0x46, 0xE9, 0x71, 0xEB, 0x33, 0xE5, + 0x4D, 0xE0, 0xCF, 0xED, 0x0F, 0xEE, 0x18, 0xF7, 0xEE, 0x02, 0xF6, 0xEF, + 0x18, 0x08, 0xFF, 0xEB, 0xEC, 0xF4, 0xC4, 0xEE, 0xDC, 0xEA, 0x5F, 0xE6, + 0x63, 0xFB, 0x13, 0xE1, 0x83, 0xFE, 0x83, 0xDF, 0x0B, 0xEB, 0x78, 0xD2, + 0x57, 0xD4, 0xF9, 0xC8, 0x03, 0xC7, 0x86, 0xCC, 0x85, 0xC5, 0x7F, 0xD2, + 0x3B, 0xCE, 0xA0, 0xD2, 0x8A, 0xCC, 0x90, 0xD0, 0x61, 0xC5, 0xD4, 0xDA, + 0xFF, 0xD2, 0x40, 0xE3, 0xFA, 0xE4, 0x8B, 0xD9, 0x7C, 0xE5, 0x9E, 0xCF, + 0x26, 0xDF, 0xE3, 0xD2, 0xD7, 0xD5, 0x4D, 0xD5, 0xD6, 0xD6, 0x58, 0xDE, + 0xD9, 0xDD, 0xC1, 0xEE, 0xED, 0xD6, 0x68, 0xEB, 0x61, 0xCB, 0x6F, 0xDD, + 0xD2, 0xC8, 0xAC, 0xDC, 0xDA, 0xCB, 0x23, 0xE5, 0xD7, 0xD2, 0x2D, 0xF4, + 0xF8, 0xD8, 0x77, 0x02, 0x0D, 0xE2, 0x4F, 0xFB, 0x89, 0xF3, 0xCE, 0xED, + 0xD6, 0xF2, 0x1A, 0xEF, 0xF8, 0xDF, 0x21, 0xF7, 0x21, 0xD6, 0x83, 0x00, + 0x7C, 0xE0, 0x89, 0x0E, 0x23, 0xF6, 0x04, 0x1A, 0x25, 0x0A, 0xF5, 0x19, + 0x65, 0x1F, 0x9F, 0x1C, 0x47, 0x2C, 0x14, 0x2A, 0x0D, 0x2A, 0xC8, 0x32, + 0xFD, 0x28, 0x5B, 0x36, 0xB8, 0x26, 0x91, 0x3A, 0xD5, 0x29, 0x29, 0x36, + 0xAE, 0x37, 0x69, 0x25, 0x05, 0x37, 0xE2, 0x12, 0x99, 0x29, 0x80, 0x05, + 0x06, 0x1E, 0x1B, 0xFB, 0xF6, 0x19, 0x19, 0xFB, 0xC1, 0x24, 0x45, 0x0B, + 0xDC, 0x33, 0xE1, 0x1D, 0x71, 0x38, 0xC3, 0x2D, 0xB4, 0x39, 0x8F, 0x37, + 0x42, 0x40, 0xC9, 0x36, 0x9E, 0x3A, 0x88, 0x31, 0x18, 0x2C, 0xC1, 0x2C, + 0x42, 0x29, 0xE6, 0x2C, 0x84, 0x2B, 0xEC, 0x33, 0xAC, 0x28, 0xF7, 0x34, + 0x7A, 0x1E, 0x58, 0x23, 0x49, 0x18, 0xC9, 0x08, 0x32, 0x11, 0x85, 0xF4, + 0x44, 0xFD, 0xDF, 0xF2, 0x9A, 0xF7, 0x25, 0x00, 0x09, 0xF8, 0x33, 0x08, + 0x6F, 0xF1, 0x78, 0x07, 0xAD, 0xFC, 0xA8, 0xF7, 0xC5, 0xFF, 0xDD, 0xDE, + 0x75, 0xE6, 0xE0, 0xD8, 0xBD, 0xDE, 0xB3, 0xD8, 0x35, 0xEF, 0x3D, 0xCE, + 0xD5, 0xFC, 0x97, 0xCB, 0xF0, 0x02, 0x53, 0xCF, 0x5E, 0xFE, 0x35, 0xD8, + 0xE5, 0xEE, 0x8C, 0xE4, 0x0E, 0xE0, 0x51, 0xE4, 0xE4, 0xD8, 0x98, 0xDD, + 0x04, 0xD8, 0x95, 0xDA, 0x8E, 0xE5, 0xC6, 0xDF, 0x03, 0xF1, 0xE3, 0xE0, + 0x20, 0xF5, 0x7D, 0xD6, 0x8C, 0xF1, 0xDE, 0xC9, 0x23, 0xD8, 0x3F, 0xCC, + 0x88, 0xC5, 0x73, 0xE2, 0x3A, 0xC0, 0x90, 0xE6, 0x0E, 0xB2, 0x76, 0xD4, + 0x95, 0xBD, 0x91, 0xD2, 0x13, 0xC9, 0x34, 0xD1, 0xCA, 0xBA, 0x6D, 0xC6, + 0xA0, 0xC3, 0x0A, 0xD3, 0x7A, 0xD2, 0x7A, 0xEE, 0xA3, 0xCC, 0x96, 0xEC, + 0xC6, 0xD3, 0xEC, 0xDB, 0xB0, 0xE3, 0xD9, 0xD3, 0xDC, 0xD6, 0xE3, 0xC3, + 0x32, 0xC5, 0x65, 0xBE, 0x36, 0xC3, 0xA0, 0xD1, 0xDF, 0xBB, 0x1E, 0xE2, + 0x54, 0xC4, 0x8F, 0xE3, 0xB4, 0xE4, 0x3E, 0xE9, 0x0F, 0xFA, 0x80, 0xF4, + 0x49, 0xFC, 0x01, 0xF8, 0xF0, 0xFA, 0x0A, 0xFB, 0x40, 0x00, 0x3F, 0x06, + 0x54, 0xEE, 0xE3, 0x14, 0xD1, 0xDB, 0xB1, 0x18, 0xCB, 0xEB, 0x29, 0x13, + 0x81, 0xEA, 0x42, 0x06, 0x4E, 0xE1, 0x10, 0xF3, 0xF5, 0xEE, 0x93, 0xF1, + 0xAA, 0xF5, 0xFE, 0xF9, 0x4D, 0xFA, 0x0F, 0x00, 0xAA, 0x0C, 0xE0, 0x08, + 0x16, 0x27, 0x3B, 0x14, 0xD9, 0x38, 0x5E, 0x1D, 0x18, 0x3B, 0x51, 0x1B, + 0x98, 0x35, 0xA6, 0x15, 0xCD, 0x2E, 0x60, 0x1D, 0x2B, 0x2C, 0x63, 0x31, + 0x6E, 0x29, 0xC6, 0x37, 0x1F, 0x23, 0xEA, 0x27, 0xBF, 0x1A, 0xDA, 0x1A, + 0xB7, 0x11, 0x61, 0x11, 0x55, 0x0B, 0x8F, 0x0C, 0xED, 0xFF, 0x4D, 0x11, + 0xFC, 0xF2, 0x21, 0x0B, 0x9B, 0xF4, 0x43, 0xFE, 0x83, 0xFE, 0x31, 0x03, + 0xAC, 0x07, 0x26, 0x07, 0x64, 0x0E, 0x4A, 0xF9, 0x28, 0x01, 0x1A, 0xF7, + 0x76, 0xF5, 0xE7, 0x00, 0x84, 0x02, 0x6B, 0xFF, 0xDB, 0x04, 0x3B, 0xF0, + 0x74, 0xF8, 0x88, 0xE5, 0xC9, 0xF6, 0xE7, 0xE9, 0x68, 0xFD, 0xE0, 0xEC, + 0x0B, 0x06, 0xF9, 0xF3, 0x04, 0x1A, 0xC3, 0x00, 0x60, 0x31, 0xDC, 0x02, + 0xEA, 0x2D, 0x06, 0x06, 0x09, 0x2B, 0x18, 0x17, 0x79, 0x2E, 0xB9, 0x18, + 0xE3, 0x1B, 0xDC, 0x08, 0x07, 0x12, 0x99, 0x12, 0x74, 0x10, 0x6F, 0x20, + 0x29, 0x08, 0x87, 0x1A, 0x38, 0x11, 0xEF, 0x1C, 0xCF, 0x2C, 0xA5, 0x29, + 0xEB, 0x31, 0x53, 0x2B, 0x30, 0x22, 0xAD, 0x2A, 0xB5, 0x21, 0x11, 0x2E, + 0x80, 0x1F, 0x92, 0x26, 0x98, 0x0A, 0x6C, 0x1C, 0x1D, 0x04, 0xDF, 0x14, + 0x70, 0x0E, 0xDD, 0x01, 0xAC, 0x0C, 0x95, 0xF7, 0x6A, 0x0F, 0x4C, 0x09, + 0x7F, 0x20, 0x23, 0x2A, 0x8E, 0x21, 0xA1, 0x3F, 0x30, 0x1A, 0xE2, 0x40, + 0x26, 0x29, 0x89, 0x36, 0x9C, 0x38, 0x03, 0x23, 0xF5, 0x34, 0xD6, 0x1D, + 0xC9, 0x34, 0xF5, 0x24, 0xF8, 0x31, 0x8C, 0x1D, 0x64, 0x1E, 0x99, 0x16, + 0x24, 0x12, 0xAD, 0x13, 0x7B, 0x0A, 0xB7, 0x0C, 0x0F, 0x05, 0x60, 0x0E, + 0xD6, 0x11, 0xAD, 0x14, 0x6B, 0x1E, 0xC3, 0x18, 0x30, 0x1E, 0xF7, 0x23, + 0x83, 0x24, 0x00, 0x3A, 0x30, 0x2C, 0x90, 0x47, 0xAD, 0x23, 0xEF, 0x47, + 0x6E, 0x1D, 0xEF, 0x43, 0x7B, 0x27, 0x12, 0x3B, 0x77, 0x33, 0x45, 0x3A, + 0xD9, 0x31, 0xEE, 0x3E, 0xFD, 0x2C, 0x8B, 0x33, 0x91, 0x35, 0x02, 0x22, + 0x87, 0x3C, 0x2E, 0x19, 0x00, 0x2D, 0x28, 0x0B, 0xBC, 0x13, 0x4F, 0xF5, + 0xD9, 0xFB, 0x40, 0xF2, 0x88, 0xE6, 0x4E, 0x05, 0x70, 0xE7, 0x0B, 0x11, + 0x61, 0xF4, 0xDE, 0x06, 0x78, 0xE5, 0x1B, 0xF5, 0x4B, 0xD4, 0x41, 0xE3, + 0xE5, 0xE2, 0x21, 0xDA, 0xA5, 0xDD, 0x35, 0xDB, 0xB5, 0xC5, 0x18, 0xD9, + 0xC1, 0xC5, 0x9E, 0xCA, 0xCB, 0xCA, 0xA2, 0xB8, 0x4E, 0xCB, 0x6E, 0xB2, + 0x3A, 0xC6, 0x81, 0xB5, 0xE7, 0xB9, 0x13, 0xC2, 0xCD, 0xB6, 0x96, 0xD7, + 0xE5, 0xC8, 0xE0, 0xE9, 0xAB, 0xE1, 0xBB, 0xE5, 0x4F, 0xE7, 0xCA, 0xD4, + 0xDD, 0xDB, 0x59, 0xCB, 0x52, 0xCD, 0x03, 0xBC, 0x22, 0xCD, 0x40, 0xB3, + 0x3D, 0xD4, 0xEB, 0xB9, 0xE9, 0xCC, 0x51, 0xBC, 0xAC, 0xC8, 0x06, 0xC3, + 0xAC, 0xCF, 0x60, 0xCC, 0xCB, 0xD8, 0x0F, 0xC9, 0xB3, 0xE7, 0x88, 0xC7, + 0x3C, 0xEC, 0xDA, 0xCF, 0x95, 0xE0, 0x15, 0xCE, 0x54, 0xDB, 0x35, 0xC3, + 0x91, 0xD5, 0x43, 0xB8, 0xBE, 0xCE, 0xE7, 0xB1, 0xCB, 0xCB, 0xA2, 0xB4, + 0x30, 0xD0, 0x7F, 0xC9, 0x48, 0xD8, 0x23, 0xE9, 0x3F, 0xCF, 0x0C, 0xF4, + 0xB3, 0xD4, 0xED, 0xF4, 0xBD, 0xF1, 0xF8, 0xFD, 0xA4, 0xF7, 0x56, 0xF7, + 0x8B, 0xF0, 0xD7, 0xE8, 0xA9, 0xF1, 0x66, 0xF1, 0x48, 0xE6, 0x08, 0xF4, + 0x05, 0xDA, 0xA0, 0xE2, 0xF6, 0xDB, 0xB1, 0xE7, 0xCE, 0xCA, 0x1A, 0xED, + 0x2D, 0xB1, 0x78, 0xDB, 0xCA, 0xBB, 0x3D, 0xDC, 0x5A, 0xDE, 0x19, 0xE9, + 0xEB, 0xF7, 0xE4, 0xE8, 0x88, 0xFD, 0xB0, 0xEF, 0x90, 0xF9, 0xFC, 0x00, + 0x85, 0xF6, 0xBE, 0x09, 0xDC, 0xF7, 0x09, 0x11, 0xC6, 0xFE, 0x68, 0x18, + 0x98, 0x04, 0x38, 0x18, 0xDE, 0x05, 0x47, 0x12, 0x16, 0x0C, 0x92, 0x10, + 0xBC, 0x0A, 0x10, 0x0D, 0x20, 0xF6, 0x92, 0xF7, 0xCB, 0xF1, 0x27, 0xEA, + 0x32, 0xF8, 0x66, 0xEC, 0x89, 0xEF, 0x7E, 0xEB, 0x35, 0xF4, 0x0C, 0xF6, + 0x6E, 0x06, 0xF3, 0x0D, 0x52, 0x02, 0x2A, 0x13, 0xB0, 0xF3, 0xF6, 0xFE, + 0x21, 0xF4, 0xB6, 0xF4, 0x05, 0xF9, 0x29, 0xF3, 0x36, 0xFB, 0x9B, 0xE7, + 0x94, 0x01, 0xB0, 0xE6, 0x83, 0xF8, 0xE3, 0xE4, 0xC6, 0xE6, 0xA9, 0xDC, + 0x96, 0xED, 0x8D, 0xE0, 0x5E, 0xFA, 0xAE, 0xE2, 0xB6, 0xF5, 0x49, 0xE8, + 0x2A, 0xF1, 0x19, 0xFE, 0x54, 0xFA, 0x2E, 0x10, 0x45, 0x03, 0x0A, 0x0B, + 0x29, 0x0A, 0xE9, 0xFC, 0x96, 0x07, 0xC9, 0xED, 0x80, 0xF5, 0x30, 0xE1, + 0xB1, 0xEC, 0x80, 0xE7, 0xE1, 0xF6, 0x83, 0xF8, 0xF2, 0xFD, 0x96, 0xFE, + 0x1C, 0x04, 0x6D, 0x06, 0x64, 0x0A, 0x4A, 0x14, 0x16, 0x02, 0x98, 0x0F, + 0x78, 0xFD, 0x7E, 0xFD, 0x7A, 0x0C, 0xC0, 0xF7, 0x88, 0x11, 0xDE, 0xF6, + 0x73, 0x0B, 0x96, 0xF2, 0x9D, 0x18, 0x72, 0xFC, 0x3F, 0x1C, 0x0F, 0x07, + 0x3A, 0x11, 0xDA, 0x0A, 0x7E, 0x12, 0x26, 0x15, 0xBE, 0x15, 0xAC, 0x23, + 0x39, 0x1A, 0xD7, 0x2D, 0xCF, 0x31, 0x81, 0x3A, 0x97, 0x4A, 0xC9, 0x43, + 0x8E, 0x4C, 0x51, 0x3B, 0xCF, 0x4C, 0x25, 0x36, 0xFE, 0x4E, 0xB9, 0x42, + 0xDB, 0x37, 0xA4, 0x4B, 0x38, 0x2A, 0x70, 0x4B, 0x65, 0x32, 0x3F, 0x3B, + 0xE8, 0x1A, 0x25, 0x15, 0xBC, 0x0A, 0x26, 0x0C, 0x7D, 0x18, 0x05, 0x20, + 0x21, 0x17, 0x78, 0x29, 0x5D, 0x20, 0x49, 0x34, 0x29, 0x43, 0xFA, 0x42, + 0x23, 0x4F, 0x08, 0x46, 0xC3, 0x3D, 0x94, 0x38, 0xDA, 0x3A, 0x6E, 0x31, + 0x9D, 0x3E, 0x69, 0x32, 0xAF, 0x36, 0x20, 0x2D, 0xBB, 0x33, 0x34, 0x2E, + 0xEC, 0x35, 0x3C, 0x35, 0xD6, 0x2D, 0xA2, 0x30, 0xE1, 0x1A, 0x88, 0x26, + 0x07, 0x0A, 0xAE, 0x23, 0x4F, 0x04, 0xC4, 0x22, 0x17, 0x05, 0x4E, 0x23, + 0xEA, 0x04, 0x40, 0x2C, 0x91, 0x0B, 0xFD, 0x34, 0xC4, 0x14, 0x0D, 0x33, + 0x31, 0x0B, 0x02, 0x29, 0x39, 0xF9, 0xAD, 0x15, 0x3E, 0xF0, 0xB8, 0x01, + 0x59, 0xE5, 0xA5, 0xF9, 0xB2, 0xE4, 0xC6, 0xF1, 0x19, 0xFE, 0xE9, 0xE6, + 0x44, 0x11, 0xA6, 0xE5, 0xD2, 0x0C, 0x2C, 0xE7, 0x0B, 0x0A, 0x6B, 0xE7, + 0xC5, 0x0B, 0x34, 0xED, 0x8B, 0xFE, 0x56, 0xF0, 0xF9, 0xEF, 0x90, 0xE8, + 0x12, 0x01, 0x1D, 0xE8, 0x36, 0x11, 0x52, 0xEC, 0x7E, 0xFF, 0xF9, 0xDE, + 0x6C, 0xEE, 0xD4, 0xCD, 0x01, 0xEC, 0xB6, 0xD1, 0xBA, 0xE8, 0xB5, 0xDC, + 0xEE, 0xE6, 0x25, 0xDA, 0x3E, 0xE2, 0x04, 0xD4, 0x91, 0xDC, 0x6E, 0xDA, + 0xAA, 0xDB, 0xBF, 0xE7, 0xD5, 0xD8, 0x02, 0xF2, 0xC9, 0xE2, 0x0D, 0xF6, + 0xF8, 0xED, 0xCA, 0xED, 0xEA, 0xE2, 0x65, 0xE6, 0xDA, 0xD9, 0x38, 0xE7, + 0xF4, 0xDF, 0x45, 0xE7, 0xEA, 0xE4, 0xD8, 0xE9, 0xE2, 0xE2, 0x6A, 0xEE, + 0x7E, 0xDD, 0x16, 0xEF, 0xE8, 0xDD, 0xC2, 0xF0, 0x42, 0xF7, 0x43, 0x00, + 0x99, 0x1B, 0x93, 0x0D, 0x7A, 0x2E, 0x9E, 0x0C, 0x82, 0x2E, 0x76, 0x12, + 0xBD, 0x1B, 0x86, 0x13, 0x48, 0x00, 0x13, 0xFD, 0x33, 0xFA, 0x52, 0xF8, + 0x10, 0x01, 0x3A, 0x07, 0x7C, 0xF8, 0x1B, 0xFA, 0x0F, 0xF3, 0x15, 0xF0, + 0x4B, 0xF7, 0x8C, 0x00, 0x07, 0xFD, 0x98, 0x15, 0xA7, 0x00, 0x20, 0x2C, + 0x05, 0x0B, 0xAF, 0x3D, 0x4E, 0x1B, 0x18, 0x35, 0xCE, 0x1A, 0x80, 0x1D, + 0xCB, 0x1E, 0xDA, 0x16, 0x40, 0x26, 0x70, 0x15, 0xEE, 0x1B, 0xFC, 0x15, + 0x99, 0x10, 0xD8, 0x1C, 0x43, 0x14, 0xF0, 0x2A, 0x11, 0x14, 0xE7, 0x33, + 0xCC, 0x08, 0x0D, 0x30, 0x4C, 0x07, 0x2D, 0x2C, 0xD1, 0x06, 0x73, 0x17, + 0x07, 0x05, 0x00, 0xFD, 0xA4, 0x0F, 0x34, 0xFB, 0xB9, 0x12, 0xCE, 0xFD, + 0x6F, 0x07, 0x05, 0xFC, 0xD5, 0xFF, 0xE8, 0x01, 0xCF, 0xFD, 0x71, 0x02, + 0x72, 0xFC, 0x44, 0xF4, 0x40, 0xF6, 0xAE, 0xE2, 0xED, 0xEF, 0xDD, 0xE0, + 0x11, 0xF0, 0x72, 0xE4, 0x43, 0xFA, 0x2A, 0xE6, 0xAF, 0xFB, 0xAA, 0xE9, + 0x52, 0xF2, 0x9D, 0xEA, 0xC2, 0xF2, 0x2E, 0xF4, 0x9E, 0xF6, 0xBB, 0x07, + 0xEE, 0xFE, 0x30, 0x11, 0xC7, 0x0E, 0xE2, 0x0B, 0x2E, 0x15, 0x54, 0xFE, + 0x8C, 0x18, 0x36, 0xF3, 0x15, 0x14, 0x16, 0xE8, 0xFF, 0xFD, 0x67, 0xDA, + 0x66, 0xE4, 0xC6, 0xDE, 0x7D, 0xDB, 0xFD, 0xE9, 0xC4, 0xF3, 0xFF, 0xED, + 0xAD, 0x04, 0x7E, 0xF2, 0xF0, 0xFA, 0xC5, 0xF3, 0x0E, 0xF3, 0x10, 0xF4, + 0xA9, 0xED, 0x4C, 0x03, 0x7D, 0xE6, 0x91, 0x0A, 0xFC, 0xE5, 0xB5, 0xF4, + 0x0D, 0xED, 0x65, 0xDE, 0x85, 0xEF, 0x42, 0xD8, 0x86, 0xE5, 0x53, 0xD1, + 0x7B, 0xEA, 0xF3, 0xD1, 0xF0, 0xFA, 0x3F, 0xEB, 0x42, 0xF6, 0x0D, 0xFF, + 0xBB, 0xF4, 0xD3, 0x05, 0x7D, 0x02, 0xC2, 0x12, 0x71, 0x07, 0x66, 0x16, + 0xAA, 0x00, 0x6A, 0x06, 0x88, 0x04, 0x7E, 0xFB, 0x93, 0x04, 0x09, 0xF9, + 0x4E, 0xF3, 0xE6, 0xED, 0x69, 0xDE, 0xFF, 0xE6, 0x89, 0xD3, 0x82, 0xF1, + 0x1C, 0xDA, 0x16, 0xF4, 0xA1, 0xE4, 0x86, 0xF0, 0xC5, 0xF1, 0x33, 0xFF, + 0xE3, 0xF8, 0xBD, 0x08, 0x1E, 0xF9, 0x74, 0x06, 0x89, 0x02, 0x8C, 0x05, + 0x57, 0x10, 0x14, 0x00, 0x0C, 0x11, 0x20, 0xF8, 0x12, 0x0A, 0x4D, 0xF9, + 0xA4, 0x03, 0xDF, 0x00, 0x81, 0xFB, 0xD9, 0xFF, 0x19, 0xF8, 0xC1, 0xFC, + 0xAC, 0xF1, 0x00, 0xF8, 0x40, 0xE5, 0x52, 0xEF, 0x2C, 0xDA, 0x34, 0xEB, + 0x85, 0xE0, 0xDB, 0xE4, 0xC0, 0xED, 0x31, 0xE0, 0xBF, 0xEC, 0xB0, 0xDD, + 0x54, 0xEA, 0x6B, 0xDE, 0xDE, 0xE0, 0xD6, 0xE5, 0x94, 0xCB, 0x93, 0xE5, + 0xD0, 0xBE, 0x81, 0xE2, 0x0A, 0xB9, 0xB2, 0xDA, 0xD3, 0xB3, 0x0D, 0xCC, + 0x1F, 0xBA, 0x25, 0xC1, 0xA1, 0xC9, 0xF2, 0xBD, 0x8B, 0xD1, 0x28, 0xC2, + 0xE6, 0xCC, 0xE7, 0xC7, 0x8F, 0xD1, 0x8A, 0xD3, 0x81, 0xE4, 0xB7, 0xDD, + 0x93, 0xEA, 0xD9, 0xE4, 0x70, 0xE1, 0x37, 0xEF, 0x0A, 0xE4, 0x3B, 0xF6, + 0x0D, 0xE5, 0xBA, 0xF9, 0x89, 0xE0, 0x95, 0xF3, 0x62, 0xF0, 0x5D, 0xE5, + 0xF7, 0xFE, 0x79, 0xE6, 0x2A, 0xFE, 0x2C, 0xF0, 0x19, 0x01, 0x38, 0xFA, + 0xD5, 0x0E, 0x84, 0x07, 0x58, 0x1E, 0x0D, 0x0B, 0xD3, 0x20, 0x4A, 0x0B, + 0x08, 0x1F, 0x6A, 0x07, 0x2C, 0x20, 0xF4, 0x07, 0xFF, 0x0F, 0x81, 0x0E, + 0x50, 0x07, 0x82, 0x00, 0x3D, 0x1B, 0xDE, 0xF5, 0x4A, 0x22, 0x65, 0x00, + 0x8D, 0x1C, 0xFE, 0x04, 0x21, 0x21, 0xB0, 0x07, 0xCB, 0x2E, 0xB3, 0x19, + 0xFD, 0x34, 0x42, 0x2B, 0x2B, 0x2F, 0xDE, 0x39, 0x10, 0x23, 0x4D, 0x43, + 0xD2, 0x16, 0x92, 0x3F, 0x13, 0x1B, 0x9F, 0x3A, 0x07, 0x32, 0x12, 0x34, + 0x5B, 0x40, 0x9C, 0x2F, 0xF4, 0x3B, 0xAA, 0x35, 0x52, 0x3F, 0x68, 0x3A, + 0x06, 0x3D, 0xF0, 0x3E, 0xA0, 0x2A, 0x06, 0x49, 0xC0, 0x19, 0x07, 0x41, + 0xBF, 0x12, 0x12, 0x2A, 0x1A, 0x21, 0x52, 0x24, 0x67, 0x41, 0x24, 0x32, + 0x02, 0x5B, 0x1E, 0x38, 0xEF, 0x56, 0xEB, 0x32, 0x54, 0x49, 0x0B, 0x36, + 0xC3, 0x47, 0xF3, 0x41, 0x26, 0x3F, 0x3E, 0x44, 0xCE, 0x3B, 0x53, 0x3F, + 0x0F, 0x44, 0xDE, 0x3C, 0xBA, 0x41, 0x51, 0x32, 0x74, 0x42, 0x59, 0x28, + 0x95, 0x43, 0x6F, 0x29, 0x54, 0x30, 0x72, 0x24, 0xCE, 0x22, 0xFD, 0x26, + 0xD1, 0x2A, 0xAE, 0x33, 0x84, 0x2A, 0x6A, 0x27, 0x16, 0x14, 0xEC, 0x10, + 0xBC, 0xFF, 0x57, 0x08, 0xEB, 0xF4, 0xDF, 0x02, 0x21, 0xEB, 0x43, 0x03, + 0xF3, 0xEF, 0xB5, 0x06, 0xBD, 0xFE, 0xEE, 0xFE, 0x62, 0x08, 0x0A, 0xF7, + 0xBC, 0xFE, 0xF2, 0xF9, 0x52, 0xEE, 0xC8, 0x01, 0xA6, 0xE3, 0xCF, 0xFD, + 0xDD, 0xDC, 0x9E, 0xF3, 0x0C, 0xEA, 0x48, 0xF1, 0x88, 0xEE, 0xBA, 0xEF, + 0xEA, 0xE6, 0x80, 0xED, 0x76, 0xE7, 0x81, 0xE6, 0x06, 0xE8, 0x81, 0xE0, + 0xBE, 0xE5, 0x67, 0xD4, 0xFE, 0xD9, 0x66, 0xCB, 0xFC, 0xD7, 0xF4, 0xD8, + 0x6F, 0xE1, 0x93, 0xE6, 0xA3, 0xDF, 0xED, 0xF4, 0x05, 0xD6, 0x01, 0x04, + 0xAB, 0xD2, 0xBE, 0x09, 0x84, 0xCF, 0x89, 0x0B, 0xB8, 0xD7, 0xF1, 0x09, + 0x49, 0xED, 0x25, 0x01, 0xFC, 0xEA, 0x91, 0xEB, 0xC2, 0xE1, 0x95, 0xD9, + 0x41, 0xEC, 0x7D, 0xD4, 0x56, 0xF9, 0x7B, 0xD5, 0x03, 0xF2, 0xCC, 0xDC, + 0x74, 0xEA, 0xA7, 0xEA, 0xA9, 0xFA, 0x2A, 0xFB, 0xEB, 0x06, 0x67, 0x04, + 0x04, 0x09, 0x40, 0x0C, 0x33, 0x0C, 0xE8, 0x0B, 0xFA, 0x02, 0x11, 0xFC, + 0xCA, 0xF7, 0x85, 0xF9, 0xBA, 0x00, 0x44, 0xF7, 0xA1, 0xFC, 0x40, 0xE4, + 0x57, 0xE7, 0x3F, 0xD8, 0x70, 0xE2, 0x59, 0xD6, 0x69, 0xDD, 0x96, 0xD6, + 0xB1, 0xD2, 0x5E, 0xD9, 0x4A, 0xD8, 0x1B, 0xE1, 0xC8, 0xE5, 0xCD, 0xDF, + 0x2F, 0xF2, 0x94, 0xD8, 0x99, 0x01, 0xF0, 0xE2, 0x37, 0x03, 0xDC, 0xF2, + 0x07, 0xED, 0xB5, 0xF9, 0xF9, 0xD8, 0x1C, 0xF6, 0x11, 0xDB, 0x92, 0xEA, + 0xDC, 0xD8, 0x70, 0xE7, 0x41, 0xDB, 0xC4, 0xED, 0xCC, 0xF8, 0x10, 0xF2, + 0x0E, 0x0B, 0x4E, 0xEF, 0x76, 0x05, 0xFC, 0xE2, 0x2A, 0xF6, 0xA6, 0xD4, + 0xF9, 0xE2, 0xED, 0xD2, 0xE1, 0xD3, 0x5E, 0xD6, 0xF3, 0xCF, 0x32, 0xD6, + 0x92, 0xCF, 0xA9, 0xD0, 0xA7, 0xCA, 0x00, 0xCB, 0x55, 0xC8, 0x88, 0xD4, + 0xEF, 0xCC, 0xC5, 0xE1, 0x10, 0xCF, 0xC1, 0xE1, 0x76, 0xD2, 0x9A, 0xDC, + 0xAE, 0xDB, 0xD0, 0xD6, 0x35, 0xE2, 0x73, 0xD2, 0x25, 0xDF, 0x89, 0xCD, + 0xEC, 0xD0, 0x29, 0xC8, 0x78, 0xC7, 0x5E, 0xC7, 0x12, 0xD0, 0x82, 0xCB, + 0xED, 0xDE, 0x1C, 0xD3, 0x34, 0xDF, 0x39, 0xDB, 0x75, 0xDA, 0x47, 0xDD, + 0x3B, 0xE0, 0x39, 0xDC, 0x37, 0xE4, 0xB8, 0xDA, 0x83, 0xDB, 0xFE, 0xCF, + 0x63, 0xCF, 0x16, 0xC9, 0x20, 0xCB, 0x45, 0xD8, 0x31, 0xC9, 0xC1, 0xE7, + 0xD0, 0xD0, 0x8D, 0xEF, 0x46, 0xDA, 0x77, 0xFB, 0x70, 0xDD, 0x13, 0xF7, + 0xE6, 0xE8, 0x7D, 0xEF, 0x3B, 0xF4, 0xD2, 0xF0, 0x71, 0xF7, 0xFD, 0xE3, + 0xD0, 0xF1, 0x6D, 0xD8, 0xB3, 0xF1, 0x00, 0xE3, 0x06, 0xFC, 0x12, 0xF2, + 0x10, 0xF8, 0x79, 0xF8, 0xD5, 0xE0, 0x78, 0x07, 0x7C, 0xE2, 0x62, 0x23, + 0xAC, 0x04, 0x3D, 0x2D, 0x71, 0x28, 0xEA, 0x25, 0x13, 0x42, 0xA1, 0x22, + 0x41, 0x4A, 0x6A, 0x1B, 0x2B, 0x3D, 0x62, 0x13, 0x1B, 0x33, 0xE2, 0x1E, + 0xCF, 0x31, 0x85, 0x20, 0x26, 0x26, 0x45, 0x0F, 0x39, 0x24, 0x8E, 0x12, + 0x21, 0x2A, 0xC3, 0x22, 0xC8, 0x20, 0x0D, 0x28, 0x40, 0x13, 0x6C, 0x30, + 0x91, 0x16, 0x4A, 0x3A, 0xA0, 0x33, 0x7A, 0x36, 0x73, 0x46, 0xC1, 0x2F, + 0xA3, 0x3E, 0xE7, 0x24, 0xF2, 0x38, 0x2B, 0x16, 0x00, 0x33, 0x2C, 0x18, + 0x96, 0x29, 0x31, 0x26, 0xD6, 0x29, 0x05, 0x33, 0x35, 0x29, 0x1E, 0x3F, + 0x6E, 0x28, 0x7A, 0x44, 0x70, 0x34, 0x15, 0x48, 0x4B, 0x39, 0x4B, 0x42, + 0x21, 0x31, 0x53, 0x2E, 0x13, 0x21, 0x19, 0x1D, 0x70, 0x11, 0xB3, 0x17, + 0x62, 0x13, 0x55, 0x19, 0x6A, 0x14, 0x24, 0x18, 0x2F, 0x0F, 0xA5, 0x17, + 0xA6, 0x0D, 0x68, 0x1A, 0xA6, 0x0D, 0x05, 0x23, 0x00, 0x10, 0x9D, 0x24, + 0xEC, 0x0F, 0x24, 0x17, 0x0A, 0x0B, 0xDC, 0x09, 0xA1, 0x0B, 0x1C, 0xF7, + 0xBB, 0x16, 0x43, 0xEF, 0x83, 0x16, 0x6B, 0xF7, 0xD4, 0x11, 0x74, 0xFA, + 0xEB, 0x17, 0x88, 0x07, 0x4D, 0x13, 0xF1, 0x13, 0xBC, 0x06, 0x9E, 0x0F, + 0xF6, 0x07, 0x07, 0x0C, 0xB5, 0x0D, 0xB4, 0x0C, 0xC6, 0x05, 0x01, 0x08, + 0x6F, 0x01, 0x83, 0xFF, 0xCA, 0x08, 0x36, 0x01, 0xC8, 0x09, 0x3F, 0x0A, + 0xDF, 0x07, 0xF1, 0x11, 0x4A, 0x06, 0x82, 0x18, 0x9C, 0xFE, 0x0D, 0x1C, + 0x96, 0xFA, 0xD9, 0x16, 0xCD, 0x05, 0x11, 0x0B, 0xA0, 0x0E, 0x31, 0x06, + 0xA6, 0x02, 0x47, 0x03, 0x8F, 0xF4, 0x7A, 0xF7, 0x82, 0xEF, 0xB1, 0xF4, + 0xFC, 0xE7, 0xF2, 0xF8, 0xD8, 0xE6, 0xD7, 0xEE, 0xD7, 0xF2, 0xEC, 0xEB, + 0xF6, 0xF8, 0xC5, 0xFA, 0x5E, 0xFE, 0x2E, 0x0B, 0x92, 0x0A, 0x89, 0x17, + 0x50, 0x16, 0x40, 0x16, 0x04, 0x1F, 0x71, 0x0C, 0x34, 0x1B, 0xD8, 0x04, + 0x30, 0x0C, 0xA3, 0xFD, 0x81, 0xF8, 0x1D, 0xFB, 0x6A, 0xED, 0x21, 0xF4, + 0x64, 0xF8, 0x8A, 0xEC, 0x85, 0x06, 0xB3, 0xF4, 0x3C, 0x10, 0xB8, 0x03, + 0xAB, 0x1E, 0x8F, 0x10, 0x7F, 0x23, 0x50, 0x19, 0x55, 0x23, 0x53, 0x23, + 0x53, 0x24, 0x40, 0x25, 0x92, 0x19, 0x03, 0x16, 0x1F, 0x0D, 0xAA, 0x09, + 0xBE, 0x09, 0x5C, 0x05, 0x06, 0x08, 0xC2, 0x04, 0x13, 0x01, 0x6D, 0x05, + 0x7C, 0x02, 0xA0, 0x07, 0x95, 0x0F, 0x10, 0x14, 0xF8, 0x14, 0xDE, 0x1A, + 0xBE, 0x0E, 0xB8, 0x12, 0x80, 0xFC, 0x70, 0x01, 0x2F, 0xE9, 0x90, 0xF0, + 0xD2, 0xDD, 0xD2, 0xEA, 0x91, 0xDD, 0xE2, 0xE7, 0x59, 0xDC, 0x69, 0xE5, + 0x8A, 0xD2, 0xA9, 0xF0, 0x9E, 0xD6, 0x60, 0xFB, 0x59, 0xE1, 0x4C, 0x00, + 0x84, 0xDD, 0xA2, 0x06, 0x7B, 0xD8, 0x41, 0xF8, 0x8A, 0xE9, 0xF2, 0xDB, + 0xDF, 0xF4, 0xB6, 0xCA, 0x26, 0xE9, 0x48, 0xC5, 0xE4, 0xE1, 0xF5, 0xC7, + 0x30, 0xD8, 0xF2, 0xD6, 0xA6, 0xD2, 0x01, 0xF0, 0xFC, 0xE6, 0xA4, 0xFF, + 0xC2, 0xFD, 0x89, 0xFE, 0x46, 0xFD, 0xEC, 0xF6, 0x91, 0xFC, 0xAF, 0xF1, + 0xF9, 0x02, 0x7A, 0xEC, 0x86, 0x01, 0x6A, 0xF0, 0x87, 0xFF, 0x95, 0xF7, + 0xF7, 0x03, 0xA9, 0xF2, 0xBB, 0x08, 0xB4, 0xF1, 0x29, 0x00, 0x19, 0xF5, + 0x1B, 0xF7, 0x0D, 0xF5, 0x50, 0x01, 0x2E, 0xFD, 0xC3, 0x11, 0x6F, 0x06, + 0x61, 0x1A, 0x9A, 0x04, 0x6C, 0x16, 0x1B, 0xFD, 0x4C, 0x03, 0x93, 0xF7, + 0x08, 0xFB, 0x6E, 0xF7, 0x1C, 0x0C, 0x01, 0xFE, 0x24, 0x12, 0x9C, 0x05, + 0xFF, 0x07, 0x82, 0x09, 0x2C, 0x0B, 0xE6, 0x10, 0x09, 0x1C, 0xE6, 0x1C, + 0xEA, 0x21, 0x5F, 0x22, 0x0A, 0x18, 0x7A, 0x22, 0x72, 0x0F, 0xC5, 0x16, + 0x23, 0x0C, 0x04, 0x03, 0x37, 0x10, 0xA5, 0xFF, 0x40, 0x15, 0x9B, 0x00, + 0xBF, 0x12, 0x79, 0xFF, 0x3F, 0x02, 0xF9, 0x04, 0x87, 0xF0, 0x2A, 0x0A, + 0x97, 0xF0, 0x76, 0x1A, 0x7F, 0xF3, 0x0A, 0x32, 0x4F, 0xF7, 0xF3, 0x37, + 0xEA, 0x09, 0x70, 0x33, 0x9D, 0x1D, 0x63, 0x21, 0xCE, 0x23, 0x85, 0x10, + 0x02, 0x21, 0x82, 0x0F, 0xDA, 0x20, 0xA0, 0x09, 0x76, 0x24, 0xBB, 0x04, + 0xC0, 0x1F, 0x5C, 0x03, 0x17, 0x17, 0x97, 0xFD, 0xC6, 0x16, 0xD2, 0xF7, + 0x7D, 0x14, 0x60, 0xFA, 0xC6, 0x09, 0xE5, 0x03, 0x27, 0xFD, 0x00, 0x00, + 0x26, 0xF0, 0x03, 0xF2, 0xA3, 0xE5, 0x72, 0xE7, 0xF3, 0xEA, 0x79, 0xE6, + 0x25, 0xE9, 0xBB, 0xE8, 0xC3, 0xD4, 0x68, 0xE3, 0x2F, 0xCA, 0x22, 0xE4, + 0x5B, 0xC2, 0xB4, 0xDF, 0xF4, 0xB8, 0x8A, 0xD3, 0xE7, 0xB4, 0xA8, 0xD0, + 0x51, 0xB7, 0x4F, 0xCF, 0xCC, 0xC8, 0x11, 0xD0, 0xD1, 0xD6, 0x68, 0xD1, + 0x30, 0xCD, 0xB2, 0xCF, 0x65, 0xB7, 0x88, 0xD0, 0xE3, 0xA9, 0xE3, 0xD6, + 0xDF, 0xAD, 0xAC, 0xD9, 0xCE, 0xB8, 0x90, 0xCE, 0x0F, 0xBE, 0x37, 0xBD, + 0x81, 0xC3, 0xDD, 0xBA, 0x64, 0xD0, 0xCD, 0xC1, 0x9C, 0xDF, 0x55, 0xC6, + 0x78, 0xE7, 0x76, 0xC7, 0x5F, 0xE8, 0x2D, 0xC8, 0x1D, 0xEC, 0xBE, 0xD0, + 0x15, 0xE5, 0xE1, 0xD2, 0xD6, 0xD3, 0xCA, 0xD3, 0x05, 0xCF, 0xD5, 0xDA, + 0xFD, 0xD3, 0x6C, 0xE4, 0xAE, 0xDC, 0x56, 0xF1, 0x18, 0xE8, 0x4D, 0xF5, + 0x16, 0xF2, 0xB7, 0xEC, 0x1F, 0xF1, 0x8B, 0xE7, 0x71, 0xF3, 0x51, 0xEB, + 0xD0, 0x03, 0x61, 0xF2, 0xB9, 0x03, 0xE5, 0xF6, 0x82, 0xFB, 0x77, 0xFB, + 0xFB, 0x05, 0x9B, 0x08, 0x99, 0x12, 0xD2, 0x13, 0x7B, 0x0B, 0x1D, 0x19, + 0x61, 0x00, 0xE9, 0x1D, 0x38, 0x11, 0x00, 0x22, 0xE1, 0x24, 0x84, 0x20, + 0xBA, 0x25, 0x88, 0x18, 0xB6, 0x29, 0xF1, 0x13, 0xA7, 0x23, 0x23, 0x17, + 0x33, 0x15, 0x3C, 0x1D, 0xBF, 0x10, 0x7E, 0x18, 0x75, 0x08, 0x5E, 0x12, + 0x33, 0xFE, 0xE4, 0x19, 0xBA, 0x10, 0x8F, 0x20, 0xF2, 0x38, 0xB4, 0x1F, + 0x01, 0x4F, 0x2E, 0x18, 0xBA, 0x52, 0xA4, 0x0F, 0xE0, 0x46, 0xB4, 0x13, + 0xD9, 0x26, 0xF7, 0x21, 0x4A, 0x13, 0x2F, 0x2C, 0x6B, 0x18, 0x61, 0x2B, + 0x7E, 0x20, 0x0D, 0x28, 0x1F, 0x24, 0x34, 0x2A, 0xB3, 0x21, 0x04, 0x28, + 0x20, 0x22, 0x36, 0x2B, 0x54, 0x2A, 0x84, 0x34, 0xF6, 0x35, 0x87, 0x32, + 0x64, 0x41, 0x5C, 0x2E, 0x5D, 0x42, 0xEA, 0x2A, 0x6B, 0x3A, 0xBF, 0x25, + 0x49, 0x2E, 0x7E, 0x1F, 0x60, 0x1F, 0x40, 0x1D, 0x79, 0x0B, 0xB4, 0x1E, + 0xF3, 0x01, 0xE9, 0x1A, 0x4D, 0x0E, 0x5C, 0x16, 0xF9, 0x1B, 0x61, 0x16, + 0x8C, 0x25, 0x74, 0x14, 0xEA, 0x20, 0xE7, 0x10, 0x4B, 0x0C, 0xD8, 0x0C, + 0xA9, 0xFA, 0x6B, 0x0A, 0xC4, 0xF7, 0x46, 0x0D, 0x15, 0x02, 0xF5, 0x08, + 0xCB, 0x0A, 0x34, 0x02, 0x51, 0x07, 0x7B, 0x00, 0x8B, 0x05, 0x42, 0x06, + 0xFC, 0x08, 0x6A, 0x0D, 0x32, 0x0B, 0x93, 0x09, 0x43, 0x0B, 0x5F, 0xFF, + 0x00, 0x06, 0x7E, 0xFB, 0xE3, 0x0C, 0xFA, 0xFE, 0x0E, 0x16, 0xB8, 0x07, + 0x62, 0x11, 0x44, 0x18, 0x4C, 0x04, 0xC1, 0x21, 0xEC, 0xFD, 0x05, 0x26, + 0xA0, 0x06, 0xD5, 0x29, 0xAF, 0x12, 0x9D, 0x25, 0xF4, 0x21, 0x28, 0x22, + 0x2E, 0x2A, 0xC0, 0x23, 0x8F, 0x21, 0x16, 0x1E, 0xC5, 0x16, 0x4D, 0x13, + 0x38, 0x14, 0x26, 0x12, 0x9F, 0x16, 0x3D, 0x18, 0x7E, 0x16, 0x21, 0x20, + 0x9D, 0x13, 0x5D, 0x22, 0x9C, 0x17, 0x74, 0x1E, 0xAD, 0x1C, 0xDF, 0x1D, + 0x00, 0x1F, 0x7A, 0x13, 0x40, 0x24, 0x28, 0x0A, 0xF7, 0x18, 0x5F, 0x0C, + 0x4F, 0x04, 0x0D, 0x0B, 0xF4, 0xFA, 0xD1, 0x0E, 0xFF, 0xF5, 0xF5, 0x11, + 0x91, 0xED, 0x0D, 0x02, 0xB4, 0xEF, 0x2F, 0xF7, 0xBC, 0xFA, 0xA7, 0x02, + 0x84, 0xF6, 0x32, 0x04, 0xBF, 0xFB, 0xFE, 0xFC, 0xB5, 0x06, 0x24, 0xF8, + 0xAA, 0xF4, 0x44, 0xEA, 0x3C, 0xE8, 0x2D, 0xEC, 0x1F, 0xE9, 0x2B, 0xFC, + 0x46, 0xE0, 0x2E, 0xF8, 0x4A, 0xDE, 0xFF, 0xF2, 0xD3, 0xE6, 0xB3, 0xF6, + 0xCF, 0xED, 0x07, 0xF0, 0x98, 0xEC, 0x3F, 0xEC, 0x97, 0xE6, 0x85, 0xEE, + 0x23, 0xE0, 0xAC, 0xEB, 0x29, 0xE2, 0xBC, 0xE3, 0xF8, 0xE2, 0x08, 0xD3, + 0x91, 0xD9, 0x1C, 0xCC, 0xC5, 0xD3, 0x99, 0xCC, 0x9D, 0xD6, 0x5D, 0xC2, + 0x5F, 0xD8, 0xE4, 0xBE, 0x20, 0xD6, 0x83, 0xC5, 0x65, 0xDE, 0x29, 0xC5, + 0x31, 0xEA, 0xC2, 0xC3, 0x39, 0xEB, 0x64, 0xCC, 0x1E, 0xE8, 0xBB, 0xCF, + 0x58, 0xD9, 0xBA, 0xC8, 0xE7, 0xC5, 0xCE, 0xC8, 0x5E, 0xC3, 0xE3, 0xCD, + 0xA2, 0xC8, 0x7E, 0xCD, 0x65, 0xCE, 0x9D, 0xD0, 0x09, 0xD0, 0x2A, 0xCF, + 0xEC, 0xC3, 0x13, 0xBE, 0xD1, 0xB0, 0x2C, 0xB3, 0x3C, 0xAA, 0x83, 0xB9, + 0xB7, 0xB8, 0xC4, 0xBF, 0xAC, 0xC4, 0x5F, 0xC1, 0xF6, 0xC4, 0x45, 0xCE, + 0xFA, 0xC7, 0xEE, 0xDC, 0x73, 0xC2, 0x9D, 0xE0, 0xD1, 0xBC, 0xF1, 0xE7, + 0x81, 0xC4, 0xF5, 0xEA, 0x92, 0xCA, 0x72, 0xE0, 0xE0, 0xCE, 0xF2, 0xD7, + 0xED, 0xE3, 0xC4, 0xD2, 0x83, 0xFB, 0x3B, 0xD3, 0x0A, 0x01, 0xBD, 0xE0, + 0x96, 0xFF, 0x68, 0xEE, 0x51, 0xFF, 0xC9, 0xF1, 0x6D, 0xFB, 0xD9, 0xEC, + 0xC6, 0xF1, 0x39, 0xE6, 0xE0, 0xE5, 0x49, 0xE7, 0x11, 0xE8, 0xFF, 0xF0, + 0x05, 0xFA, 0x70, 0xF9, 0x86, 0x0A, 0x06, 0x04, 0x88, 0x10, 0x3C, 0x0C, + 0xC0, 0x0E, 0x94, 0x09, 0x58, 0x08, 0xCA, 0x06, 0x57, 0x03, 0xF4, 0x09, + 0x58, 0x0B, 0x73, 0x0D, 0x1F, 0x0D, 0xF7, 0x0E, 0x08, 0x07, 0x7C, 0x0E, + 0x38, 0x03, 0xA1, 0x0A, 0x24, 0xFB, 0x1D, 0x07, 0xAA, 0x01, 0xB6, 0x06, + 0x28, 0x11, 0xE4, 0x08, 0xE5, 0x12, 0x8B, 0x0D, 0x0F, 0x18, 0x21, 0x12, + 0x90, 0x20, 0x35, 0x16, 0xAE, 0x1A, 0x9D, 0x15, 0xE1, 0x16, 0xFD, 0x12, + 0x9B, 0x16, 0xBD, 0x0B, 0x82, 0x0F, 0x1E, 0x02, 0x53, 0x08, 0x1B, 0x00, + 0xC4, 0x07, 0xE3, 0xF7, 0x99, 0x0F, 0x2E, 0xF1, 0x00, 0x1E, 0xD3, 0xFF, + 0x70, 0x20, 0x3D, 0x0C, 0x42, 0x0E, 0xE1, 0x08, 0xDA, 0xFD, 0xCA, 0x0B, + 0xD3, 0xEF, 0xFF, 0x14, 0x6B, 0xE6, 0x53, 0x18, 0xF2, 0xE8, 0x06, 0x14, + 0xAB, 0xEA, 0x69, 0x10, 0x22, 0xF4, 0xD9, 0x0C, 0x56, 0x08, 0x00, 0x09, + 0x93, 0x14, 0xEE, 0x0D, 0x61, 0x11, 0xDE, 0x14, 0x61, 0x11, 0xB6, 0x14, + 0x52, 0x23, 0xFD, 0x0C, 0x56, 0x24, 0x9F, 0x05, 0x00, 0x16, 0x07, 0x0C, + 0x31, 0x14, 0x7E, 0x13, 0xB1, 0x0E, 0x49, 0x0D, 0xDA, 0x0E, 0x9C, 0x00, + 0x32, 0x1E, 0x39, 0xFD, 0x11, 0x23, 0x17, 0x0D, 0xA6, 0x1E, 0x49, 0x21, + 0x43, 0x1E, 0x20, 0x29, 0x89, 0x19, 0x59, 0x25, 0x52, 0x04, 0xEF, 0x15, + 0xF9, 0xF7, 0x4D, 0x0A, 0xF2, 0xFC, 0xBF, 0x10, 0xD8, 0xF8, 0xE4, 0x0F, + 0x96, 0x04, 0x51, 0x04, 0x07, 0x1F, 0xF4, 0x09, 0xCD, 0x26, 0x9E, 0x16, + 0xC6, 0x22, 0x09, 0x1A, 0x9D, 0x17, 0xFA, 0x20, 0xF9, 0x12, 0x02, 0x2E, + 0x7F, 0x13, 0xF1, 0x2E, 0xC9, 0x13, 0x8A, 0x29, 0x88, 0x14, 0x25, 0x26, + 0xB2, 0x07, 0x3E, 0x21, 0x2E, 0x06, 0xC5, 0x22, 0xC4, 0x23, 0xF5, 0x2B, + 0xBF, 0x3E, 0xDB, 0x2E, 0xDA, 0x3A, 0xA2, 0x23, 0xEC, 0x2D, 0x45, 0x22, + 0x2F, 0x2C, 0x94, 0x26, 0x18, 0x2A, 0x93, 0x1C, 0x8C, 0x2A, 0xA5, 0x19, + 0x41, 0x2A, 0x1D, 0x24, 0x28, 0x20, 0x10, 0x23, 0x3C, 0x1B, 0x22, 0x19, + 0xB8, 0x1E, 0x00, 0x21, 0x92, 0x1B, 0xB9, 0x2A, 0xA1, 0x1A, 0xF3, 0x26, + 0x0C, 0x1F, 0xD9, 0x1F, 0x13, 0x22, 0x90, 0x14, 0x7A, 0x24, 0xD5, 0x12, + 0x28, 0x25, 0xB8, 0x1D, 0xEF, 0x25, 0xD8, 0x21, 0xB4, 0x16, 0xBE, 0x14, + 0x6D, 0x01, 0xF1, 0x00, 0xF0, 0xFC, 0xBA, 0xF6, 0x6F, 0x01, 0x65, 0xF2, + 0xF1, 0x04, 0xBD, 0xEC, 0xAA, 0x0C, 0x11, 0xEE, 0xEC, 0x0F, 0x72, 0xF1, + 0xB3, 0x01, 0x7E, 0xF0, 0x6E, 0xF1, 0x49, 0xFB, 0xD1, 0xE2, 0xBF, 0x04, + 0x2B, 0xD9, 0x95, 0xFB, 0xF7, 0xE6, 0xDF, 0xEC, 0x9D, 0xF5, 0x5B, 0xDF, + 0xBA, 0xF4, 0x69, 0xD7, 0xA3, 0xE9, 0x1F, 0xDB, 0xB0, 0xDC, 0x59, 0xEB, + 0x28, 0xD2, 0x7D, 0xF3, 0x58, 0xD6, 0x58, 0xFD, 0xC4, 0xE4, 0x1C, 0x02, + 0x2F, 0xE6, 0x91, 0xF0, 0xCA, 0xFD, 0xF4, 0x04, 0xE5, 0x15, 0x0C, 0x1E, + 0x5A, 0x11, 0x56, 0x16, 0x93, 0x27, 0xC1, 0x2D, 0xB2, 0x53, 0x5B, 0x54, + 0xFE, 0x61, 0x2A, 0x5C, 0x5D, 0x55, 0x34, 0x48, 0x1F, 0x46, 0x38, 0x34, + 0x83, 0x2D, 0x72, 0x2A, 0x28, 0x09, 0xCB, 0x1B, 0x29, 0xE9, 0x5D, 0x03, + 0x33, 0xE2, 0x25, 0xF3, 0xF7, 0xF3, 0x6B, 0xEF, 0x75, 0xF7, 0x46, 0xE1, + 0x08, 0xE7, 0x1F, 0xD9, 0xA9, 0xD9, 0x41, 0xE2, 0x69, 0xD4, 0x07, 0xE9, + 0x9C, 0xCB, 0x7E, 0xE4, 0x16, 0xC9, 0x94, 0xDD, 0xF1, 0xD2, 0x43, 0xDD, + 0x86, 0xC2, 0x6C, 0xCE, 0xAB, 0xB2, 0xA1, 0xBB, 0x19, 0xCE, 0x6F, 0xCF, + 0xF2, 0xDE, 0x66, 0xE6, 0xE4, 0xDD, 0x54, 0xE3, 0x3E, 0xEB, 0x2A, 0xE3, + 0x00, 0xF3, 0xBA, 0xE7, 0x07, 0xEF, 0x0B, 0xE1, 0xE8, 0xFC, 0xAD, 0xF2, + 0x94, 0x0E, 0x4D, 0x16, 0x1C, 0x03, 0x7B, 0x0E, 0x92, 0x10, 0xDC, 0x11, + 0x22, 0x28, 0xA2, 0x1F, 0x5D, 0x2C, 0x2B, 0x1D, 0xFC, 0x38, 0x25, 0x2C, + 0x27, 0x48, 0xAC, 0x3E, 0xD1, 0x49, 0xD4, 0x43, 0x03, 0x2E, 0x49, 0x2A, + 0x8D, 0x2A, 0x71, 0x23, 0xDB, 0x52, 0xEF, 0x50, 0xCF, 0x4F, 0xEC, 0x54, + 0xC8, 0x1B, 0x6E, 0x1D, 0x00, 0x1C, 0xB8, 0x13, 0x45, 0x30, 0xED, 0x20, + 0x7A, 0x17, 0x24, 0x09, 0x9B, 0x0B, 0x24, 0xFB, 0x0A, 0x0D, 0x9B, 0x00, + 0x1A, 0xE7, 0xF5, 0xE6, 0xB1, 0xCA, 0x4A, 0xD1, 0xE1, 0xD4, 0xD7, 0xE0, + 0xBD, 0xC8, 0xB3, 0xDD, 0x6C, 0xB1, 0xD8, 0xCB, 0x44, 0xCA, 0xF9, 0xD7, + 0x60, 0xE4, 0xEA, 0xDF, 0xE7, 0xCE, 0x61, 0xBD, 0xB7, 0xD7, 0xEE, 0xB2, + 0x25, 0xE7, 0x26, 0xCD, 0x04, 0xC1, 0xD0, 0xC7, 0xD1, 0xB4, 0xE6, 0xC3, + 0x02, 0xE1, 0x23, 0xF3, 0x56, 0xFA, 0x2E, 0x0A, 0x76, 0xDC, 0x56, 0xDA, + 0x5C, 0xD4, 0x10, 0xC7, 0x5F, 0xEE, 0xEE, 0xE6, 0x3D, 0xE2, 0x3C, 0xE5, + 0xCC, 0xC8, 0x90, 0xD1, 0x50, 0xCE, 0x67, 0xD7, 0x9C, 0xD8, 0x16, 0xDC, + 0x7F, 0xCF, 0xC2, 0xD1, 0x7A, 0xC9, 0x81, 0xD0, 0x68, 0xCD, 0xFE, 0xDA, + 0xBE, 0xC3, 0x29, 0xDA, 0x7C, 0xC2, 0xA4, 0xCD, 0xC1, 0xC9, 0x00, 0xC8, + 0xDE, 0xCA, 0x13, 0xC3, 0x8D, 0xC5, 0xC7, 0xA9, 0xB6, 0xB2, 0x7F, 0x99, + 0x9F, 0xA8, 0x22, 0xA5, 0x63, 0xA2, 0xAC, 0xA6, 0x69, 0x9E, 0x6C, 0x9E, + 0x88, 0xA7, 0x56, 0xA2, 0x18, 0xB0, 0x78, 0xA9, 0xD8, 0xC2, 0x71, 0xB3, + 0x33, 0xC8, 0xCD, 0xB4, 0xCC, 0xB8, 0x6F, 0xAA, 0x5D, 0xC4, 0x8A, 0xB0, + 0xE8, 0xE1, 0xF2, 0xCD, 0x1E, 0xF6, 0x55, 0xE6, 0x32, 0xE8, 0x23, 0xE2, + 0x9A, 0xC5, 0x79, 0xD1, 0xE5, 0xA9, 0xBB, 0xCF, 0x3C, 0xA2, 0xA4, 0xDE, + 0x84, 0xB7, 0x63, 0xE4, 0x32, 0xD1, 0xA0, 0xE7, 0x35, 0xE7, 0x98, 0xED, + 0xBB, 0x03, 0x92, 0xEC, 0xD4, 0x1E, 0x89, 0xFF, 0x76, 0x33, 0xEB, 0x1E, + 0x4B, 0x2A, 0x25, 0x24, 0xC9, 0x12, 0x6F, 0x19, 0xA4, 0x1B, 0xBC, 0x20, + 0xFE, 0x24, 0xC0, 0x2D, 0xFE, 0x31, 0xB7, 0x33, 0x86, 0x55, 0x12, 0x4A, + 0x16, 0x59, 0x0B, 0x53, 0xD2, 0x3A, 0x44, 0x38, 0xE5, 0x35, 0x6C, 0x31, + 0x8B, 0x3E, 0x8E, 0x40, 0xC5, 0x27, 0x4D, 0x33, 0xEC, 0x10, 0x64, 0x1E, + 0xC3, 0x13, 0x47, 0x22, 0x4F, 0x0A, 0xA0, 0x19, 0x13, 0x01, 0xA3, 0x04, + 0x70, 0x00, 0x13, 0x01, 0x83, 0xFE, 0xB1, 0x07, 0xF1, 0x00, 0xBC, 0x04, + 0x19, 0x04, 0xC8, 0xF6, 0x3F, 0x13, 0x45, 0xF6, 0xAE, 0x26, 0xAA, 0x0F, + 0xA3, 0x2A, 0xDC, 0x23, 0xF8, 0x25, 0xEF, 0x27, 0xC0, 0x27, 0x5B, 0x31, + 0x59, 0x1F, 0xB9, 0x2A, 0x7C, 0x1C, 0xD1, 0x22, 0x34, 0x22, 0x1E, 0x2C, + 0x39, 0x23, 0xD3, 0x2D, 0x69, 0x2A, 0xE6, 0x23, 0x8F, 0x2F, 0xC9, 0x1C, + 0xAE, 0x3A, 0x67, 0x29, 0xC2, 0x50, 0x81, 0x3E, 0xAC, 0x57, 0x55, 0x4E, + 0x58, 0x4C, 0xF1, 0x52, 0x4D, 0x43, 0x69, 0x55, 0x03, 0x37, 0xD8, 0x52, + 0x5D, 0x1F, 0xBA, 0x3D, 0xF4, 0x1F, 0xD8, 0x40, 0x5C, 0x40, 0x28, 0x55, + 0x6E, 0x5D, 0xA8, 0x59, 0xDE, 0x5F, 0x4A, 0x58, 0xC7, 0x56, 0x71, 0x53, + 0x9C, 0x55, 0xFE, 0x53, 0x4C, 0x48, 0x59, 0x4C, 0x5F, 0x36, 0xB7, 0x33, + 0x57, 0x40, 0x3F, 0x2F, 0xA8, 0x49, 0xFC, 0x34, 0xDC, 0x3B, 0x17, 0x2B, + 0xC9, 0x3E, 0x27, 0x2C, 0x0E, 0x56, 0x7D, 0x42, 0xE1, 0x59, 0x60, 0x4E, + 0xED, 0x53, 0x34, 0x51, 0xA9, 0x5B, 0x92, 0x5D, 0x99, 0x59, 0x67, 0x5D, + 0x1F, 0x4C, 0xE7, 0x53, 0xA7, 0x3E, 0x8C, 0x47, 0xA3, 0x32, 0xBC, 0x3D, + 0x6D, 0x2B, 0x80, 0x42, 0x01, 0x22, 0xC1, 0x3D, 0x90, 0x2A, 0xC7, 0x3D, + 0x56, 0x37, 0x4F, 0x4C, 0x4C, 0x27, 0x88, 0x48, 0x82, 0x17, 0xDF, 0x40, + 0x72, 0x1C, 0x8E, 0x4D, 0x8B, 0x1E, 0x01, 0x52, 0x33, 0x10, 0x26, 0x38, + 0xE9, 0x09, 0xE1, 0x2A, 0xC9, 0x1C, 0x46, 0x34, 0x85, 0x23, 0x2A, 0x2B, + 0x3B, 0x12, 0xC9, 0x14, 0x43, 0x04, 0x24, 0x0A, 0xFE, 0xF3, 0xF0, 0x07, + 0x7F, 0xE0, 0x6D, 0xF5, 0x3F, 0xD9, 0x30, 0xDD, 0x2B, 0xD3, 0xCF, 0xD3, + 0x0B, 0xD8, 0x7B, 0xD0, 0xE6, 0xE5, 0x5F, 0xD4, 0xEB, 0xD7, 0x85, 0xCE, + 0x64, 0xC2, 0xD1, 0xC2, 0x39, 0xB3, 0xB3, 0xBD, 0x99, 0xA6, 0x74, 0xB3, + 0xF6, 0xA8, 0x2D, 0xAF, 0xC3, 0xAE, 0xF8, 0xAC, 0x02, 0xA7, 0x72, 0xA5, + 0xE1, 0xA8, 0x8C, 0xB3, 0xC8, 0xB1, 0xCD, 0xBC, 0x1A, 0xA7, 0x85, 0xAA, + 0x72, 0xA5, 0x6A, 0xA4, 0x91, 0xB0, 0xD5, 0xA9, 0x20, 0xB4, 0xE7, 0xA6, + 0xFE, 0xB9, 0x62, 0xA0, 0x6B, 0xB3, 0xF6, 0x9D, 0x7A, 0xA2, 0xDC, 0x9E, + 0x82, 0xA6, 0x66, 0xAE, 0xD3, 0xAD, 0xE9, 0xC3, 0x98, 0xA9, 0x98, 0xB9, + 0xC7, 0xB1, 0xAC, 0xA6, 0xF8, 0xC6, 0x29, 0xA8, 0xFF, 0xD7, 0x70, 0xAD, + 0xEE, 0xCF, 0x34, 0xA6, 0xB9, 0xD0, 0xB0, 0xB2, 0x0F, 0xE5, 0xCC, 0xD6, + 0x61, 0xE0, 0xCE, 0xE2, 0x7C, 0xDD, 0x68, 0xE3, 0x64, 0xE3, 0xDF, 0xE0, + 0x68, 0xE3, 0xE3, 0xDC, 0x4A, 0xDB, 0x8D, 0xDB, 0x73, 0xD1, 0xF9, 0xDC, + 0x03, 0xD6, 0x8C, 0xEA, 0x9C, 0xDD, 0x82, 0xE3, 0xDE, 0xE6, 0xF1, 0xCA, + 0x89, 0xED, 0xAC, 0xC8, 0xCA, 0xE6, 0xDA, 0xD1, 0xDA, 0xDA, 0x76, 0xD1, + 0xCA, 0xD9, 0x0B, 0xD0, 0x7F, 0xE7, 0x81, 0xD8, 0x49, 0xF2, 0xE9, 0xE7, + 0x3C, 0x03, 0xDD, 0xFD, 0x71, 0x11, 0x32, 0x09, 0x36, 0x17, 0x90, 0x0B, + 0xF3, 0x26, 0x51, 0x14, 0x18, 0x28, 0x95, 0x16, 0x08, 0x21, 0x54, 0x1E, + 0x0B, 0x30, 0x99, 0x34, 0xE8, 0x3C, 0xA6, 0x39, 0x61, 0x32, 0x74, 0x2C, + 0xF0, 0x34, 0xC5, 0x32, 0x23, 0x53, 0x99, 0x4D, 0x5D, 0x5B, 0xB9, 0x5F, + 0xCE, 0x42, 0x23, 0x5E, 0xAC, 0x2C, 0x78, 0x4D, 0x90, 0x27, 0x61, 0x45, + 0x3B, 0x23, 0xBD, 0x41, 0xA0, 0x1A, 0xB5, 0x3A, 0x63, 0x18, 0x6B, 0x35, + 0x81, 0x0D, 0xEE, 0x1C, 0x17, 0xFF, 0x9D, 0x04, 0xA5, 0x0F, 0x62, 0x09, + 0x5D, 0x1D, 0xF1, 0x10, 0xA9, 0xFB, 0xE2, 0x02, 0xE6, 0xD4, 0x2C, 0xE7, + 0x55, 0xD2, 0xD0, 0xDC, 0x73, 0xDF, 0x5D, 0xE7, 0x68, 0xE1, 0x4F, 0xDE, + 0x7F, 0xE2, 0x14, 0xCF, 0x5F, 0xEC, 0x91, 0xD2, 0xFE, 0xED, 0xA6, 0xD1, + 0x10, 0xE4, 0xAF, 0xC0, 0x06, 0xD5, 0xA5, 0xAC, 0xE1, 0xCD, 0x46, 0xAD, + 0xCF, 0xD4, 0x5D, 0xB6, 0x68, 0xEB, 0x9B, 0xC5, 0x05, 0xFE, 0xC0, 0xDC, + 0x15, 0xF2, 0xC5, 0xE1, 0x44, 0xE9, 0x11, 0xEC, 0x94, 0xFF, 0x04, 0x11, + 0xAA, 0x07, 0xDF, 0x1D, 0x57, 0xF7, 0xE3, 0x03, 0x45, 0xFE, 0x4F, 0xF9, + 0x75, 0x06, 0x7A, 0xFE, 0xAE, 0x08, 0x32, 0xFE, 0x72, 0x10, 0x91, 0x0A, + 0xEF, 0xFE, 0xFF, 0x15, 0x90, 0xEC, 0xA5, 0x0F, 0x74, 0xF5, 0x96, 0x09, + 0xAC, 0xFC, 0x70, 0xFF, 0xE0, 0xFD, 0x0D, 0xEF, 0xDB, 0xFF, 0x9B, 0xEA, + 0xEF, 0xFB, 0xEB, 0xEF, 0xD0, 0xEE, 0xF9, 0xF3, 0x24, 0xDF, 0x68, 0xF2, + 0xB0, 0xDD, 0xF2, 0xF3, 0x41, 0xE4, 0x1B, 0xFB, 0xED, 0xEF, 0x60, 0xFB, + 0x49, 0xF5, 0x16, 0xF0, 0x89, 0xEF, 0x92, 0xEF, 0xA9, 0xE7, 0x2B, 0xF5, + 0x05, 0xED, 0x67, 0xF4, 0xC6, 0xF4, 0x55, 0xF2, 0x5E, 0xE7, 0xE2, 0xE2, + 0x8D, 0xED, 0xCA, 0xDD, 0x04, 0x02, 0xAC, 0xED, 0x06, 0xF7, 0x2F, 0xF5, + 0x24, 0xEA, 0xAF, 0xF1, 0x39, 0xE8, 0x72, 0xEB, 0x81, 0xF3, 0xE5, 0xF6, + 0xC6, 0x03, 0x3D, 0x05, 0xDE, 0xF8, 0xD4, 0xF8, 0x23, 0xF0, 0x58, 0xFB, + 0x7C, 0xFB, 0x68, 0x19, 0xD0, 0x02, 0xDB, 0x1F, 0xEE, 0x07, 0x25, 0x12, + 0xE7, 0x03, 0xE4, 0x08, 0xCE, 0xFA, 0xD9, 0x01, 0x56, 0x00, 0xF2, 0x06, + 0x37, 0x10, 0x6D, 0x28, 0x49, 0x0D, 0x43, 0x3D, 0x16, 0xF6, 0x66, 0x29, + 0x67, 0xEC, 0x1C, 0x1E, 0x1D, 0xE1, 0xDB, 0x12, 0x1D, 0xC7, 0x4E, 0xE6, + 0x5D, 0xBA, 0xBD, 0xC3, 0x24, 0xBC, 0x29, 0xC5, 0x6A, 0xBC, 0xFC, 0xC9, + 0x7D, 0xBA, 0xBD, 0xC5, 0xB3, 0xCC, 0xE3, 0xCF, 0xDE, 0xDF, 0x4E, 0xDB, + 0x9B, 0xE1, 0x1D, 0xDB, 0x51, 0xD1, 0x13, 0xCA, 0x1C, 0xB3, 0x02, 0xB0, + 0x6F, 0xAF, 0xA9, 0xA8, 0xB8, 0xB7, 0x4B, 0xA1, 0xF8, 0xBB, 0x12, 0xA8, + 0x3D, 0xC9, 0x77, 0xBD, 0xA1, 0xCD, 0xF7, 0xB7, 0xB7, 0xCF, 0xED, 0xB2, + 0x43, 0xE4, 0x51, 0xCA, 0x29, 0xEC, 0x7E, 0xE2, 0xC0, 0xD8, 0x34, 0xE3, + 0x71, 0xC9, 0x72, 0xD7, 0xA0, 0xDE, 0xA9, 0xE1, 0xBB, 0xF2, 0x14, 0xEB, + 0x97, 0xE2, 0x36, 0xDD, 0xB8, 0xD7, 0xD5, 0xE1, 0xD3, 0xD9, 0x7A, 0xEE, + 0x35, 0xE0, 0xAC, 0xEA, 0xFA, 0x01, 0x28, 0xF4, 0x45, 0x1A, 0x6D, 0xFE, + 0x75, 0x16, 0x0C, 0xF8, 0x76, 0x18, 0xE3, 0xFE, 0x3F, 0x17, 0xF5, 0x08, + 0xF7, 0x04, 0x2B, 0xFA, 0xFE, 0xEB, 0xA5, 0xE3, 0x4D, 0xE8, 0xFB, 0xDD, + 0x2A, 0xE5, 0x2C, 0xD4, 0xA3, 0xD8, 0x50, 0xC4, 0xC2, 0xE8, 0x76, 0xC9, + 0xC4, 0xF4, 0x09, 0xD5, 0xA4, 0xDF, 0xE1, 0xD1, 0xDC, 0xDB, 0x53, 0xD8, + 0x9C, 0xE4, 0xB1, 0xED, 0x02, 0xD5, 0x8D, 0xEA, 0x0A, 0xDC, 0xC0, 0xEE, + 0x48, 0xEE, 0x3D, 0xFC, 0x86, 0xEA, 0xEA, 0xFA, 0x5D, 0xF6, 0x63, 0x0B, + 0x7B, 0x0D, 0x72, 0x1E, 0x04, 0x17, 0x56, 0x1C, 0x19, 0x24, 0xAA, 0x1B, + 0xB7, 0x32, 0xA7, 0x1B, 0x64, 0x36, 0x29, 0x13, 0xFB, 0x2F, 0x1D, 0x0B, + 0xC8, 0x23, 0x6D, 0x09, 0x8A, 0x1D, 0xAD, 0x0A, 0x0E, 0x13, 0xB5, 0x05, + 0x75, 0x17, 0x79, 0x10, 0x70, 0x2F, 0xF7, 0x21, 0x0A, 0x41, 0x1C, 0x33, + 0x41, 0x4E, 0x0D, 0x49, 0xBC, 0x56, 0x12, 0x4D, 0x13, 0x5E, 0x3C, 0x52, + 0x88, 0x5C, 0x15, 0x53, 0x8C, 0x45, 0xC7, 0x40, 0x3E, 0x41, 0xE9, 0x44, + 0xC2, 0x48, 0xA6, 0x4B, 0x0B, 0x3F, 0x2D, 0x3F, 0x30, 0x44, 0x9F, 0x4A, + 0x92, 0x4E, 0xA7, 0x5B, 0xE6, 0x4A, 0x5D, 0x5D, 0xFD, 0x47, 0xC7, 0x5A, + 0x6C, 0x40, 0xAA, 0x4B, 0x7D, 0x31, 0x60, 0x32, 0x30, 0x1A, 0xC4, 0x15, + 0xA9, 0x14, 0xA0, 0x12, 0xAD, 0x05, 0x05, 0x0C, 0x51, 0xEA, 0xEE, 0xF4, + 0xF1, 0xF6, 0x1D, 0xF7, 0xBA, 0x07, 0xE2, 0x00, 0x75, 0x18, 0xD6, 0x0B, + 0x44, 0x38, 0x97, 0x1E, 0x5E, 0x3C, 0xCC, 0x1B, 0xBF, 0x31, 0x66, 0x08, + 0x53, 0x2A, 0x67, 0xFE, 0x9D, 0x14, 0xC3, 0xFE, 0x01, 0x0F, 0x8C, 0x07, + 0x1D, 0x18, 0x4E, 0x10, 0x51, 0x21, 0x4A, 0x19, 0x42, 0x29, 0xB2, 0x20, + 0xFE, 0x31, 0x51, 0x2B, 0x6E, 0x41, 0xA2, 0x3C, 0xBD, 0x44, 0xFF, 0x49, + 0x94, 0x42, 0x18, 0x58, 0x48, 0x46, 0xD5, 0x5A, 0x03, 0x4A, 0x00, 0x4D, + 0xBE, 0x49, 0x6A, 0x3F, 0x52, 0x3D, 0xB2, 0x30, 0xAE, 0x2E, 0xCB, 0x2E, + 0xF9, 0x27, 0x5D, 0x41, 0x08, 0x20, 0xC6, 0x48, 0x4E, 0x26, 0xE6, 0x47, + 0x34, 0x32, 0xF8, 0x47, 0x19, 0x48, 0xCA, 0x4C, 0x1E, 0x5B, 0xF7, 0x52, + 0x6A, 0x53, 0x39, 0x52, 0xB6, 0x4E, 0xC3, 0x54, 0x88, 0x41, 0x82, 0x46, + 0xB5, 0x32, 0x88, 0x2D, 0xC8, 0x2D, 0xAC, 0x21, 0xAA, 0x12, 0x3D, 0x17, + 0x55, 0x05, 0x79, 0x13, 0x65, 0x1B, 0x59, 0x1B, 0xAD, 0x30, 0x74, 0x28, + 0x26, 0x2E, 0x76, 0x25, 0xF5, 0x1B, 0x41, 0x14, 0xF6, 0x13, 0x8B, 0x0C, + 0x2F, 0x06, 0x32, 0xFE, 0x04, 0xFA, 0xE5, 0xEF, 0x60, 0xFB, 0x0C, 0xE9, + 0x57, 0xFB, 0xA3, 0xE3, 0x5F, 0xF7, 0x11, 0xE6, 0xCD, 0xF7, 0x60, 0xEE, + 0xC9, 0xFF, 0x36, 0xF7, 0x62, 0xFE, 0x03, 0xF7, 0x81, 0x04, 0xCA, 0xFB, + 0x86, 0x11, 0xCC, 0x03, 0x67, 0x04, 0x98, 0xFC, 0xC1, 0xF6, 0xA5, 0xE9, + 0x0B, 0xFA, 0x86, 0xD3, 0x06, 0xF7, 0x21, 0xD7, 0x54, 0xF7, 0xF5, 0xF3, + 0xD7, 0x09, 0x29, 0x0E, 0xBE, 0x1F, 0xD9, 0x1F, 0x80, 0x37, 0x6D, 0x33, + 0xDC, 0x40, 0xF0, 0x34, 0x7F, 0x34, 0x37, 0x1B, 0xA2, 0x22, 0xA6, 0x08, + 0x6C, 0x05, 0x7E, 0xFC, 0x96, 0xF6, 0x34, 0xED, 0x96, 0xFC, 0xAB, 0xE5, + 0x7F, 0x02, 0x52, 0xEB, 0x30, 0xFF, 0xB7, 0xE3, 0xA7, 0x05, 0xE4, 0xE6, + 0xC5, 0x0D, 0xD5, 0xFE, 0xA1, 0xF6, 0xDB, 0xEF, 0x31, 0xE1, 0x00, 0xCE, + 0x77, 0xE4, 0x58, 0xD5, 0x4D, 0xED, 0xBC, 0xEA, 0x98, 0xF6, 0xE8, 0xE9, + 0x75, 0x00, 0xAD, 0xEE, 0xFF, 0xF5, 0x46, 0xF6, 0xE9, 0xF4, 0x2C, 0x07, + 0x43, 0x13, 0x14, 0x2A, 0x0C, 0x33, 0x86, 0x42, 0xAD, 0x46, 0x58, 0x4C, + 0x85, 0x49, 0x7E, 0x42, 0x0E, 0x38, 0xF9, 0x28, 0x6D, 0x12, 0x4C, 0x0A, + 0xCC, 0xFB, 0xFA, 0xF6, 0x48, 0xED, 0x70, 0xF8, 0x44, 0xCB, 0x4F, 0xFC, + 0xA7, 0xD4, 0x34, 0x10, 0x6A, 0x07, 0xFD, 0x2B, 0xE9, 0x2A, 0x37, 0x39, + 0x6F, 0x47, 0x4C, 0x40, 0x4E, 0x54, 0x6E, 0x3E, 0x33, 0x3E, 0xCD, 0x35, + 0x97, 0x1B, 0xC9, 0x2F, 0x82, 0x07, 0x14, 0x27, 0x81, 0xFF, 0x43, 0x17, + 0x28, 0xFF, 0x12, 0x0C, 0x2A, 0x0A, 0xD1, 0x14, 0x47, 0x0B, 0x83, 0x1D, + 0x17, 0x02, 0x38, 0x19, 0x56, 0xFC, 0x5D, 0x11, 0x76, 0x06, 0x43, 0x11, + 0xED, 0x00, 0x4A, 0x05, 0x22, 0xE0, 0x87, 0xE9, 0xCB, 0xCB, 0x96, 0xD0, + 0xB9, 0xB7, 0x79, 0xB9, 0x11, 0xA4, 0x8F, 0xB4, 0x7C, 0xA4, 0x13, 0xBB, + 0xCA, 0xBD, 0xB7, 0xD2, 0x75, 0xE3, 0xF1, 0xF6, 0xE2, 0xED, 0x41, 0xF7, + 0xC2, 0xD7, 0x04, 0xDF, 0x57, 0xC4, 0x92, 0xD3, 0x49, 0xB2, 0x03, 0xC0, + 0x6A, 0xAE, 0xA8, 0xAD, 0x98, 0xC7, 0xAE, 0xB5, 0xD1, 0xD7, 0x79, 0xBB, + 0x47, 0xD5, 0x06, 0xBC, 0x96, 0xD6, 0x52, 0xCF, 0x5F, 0xDD, 0xEC, 0xED, + 0xB8, 0xEA, 0x39, 0x06, 0xD0, 0xEA, 0xAA, 0xFC, 0xE3, 0xD9, 0x50, 0xE1, + 0x46, 0xC8, 0x66, 0xCE, 0x7F, 0xB4, 0xC2, 0xAE, 0xC2, 0xAB, 0xD0, 0x9B, + 0x58, 0xAB, 0x0F, 0xAA, 0x4E, 0xA9, 0x68, 0xBA, 0x7D, 0xB4, 0xCA, 0xCC, + 0x2A, 0xC8, 0x3E, 0xDA, 0x21, 0xC7, 0x1F, 0xCE, 0x7E, 0xB4, 0x6A, 0xBD, + 0x3D, 0xA6, 0x2E, 0xB0, 0x7D, 0xAB, 0xAE, 0xAC, 0x97, 0xAA, 0x4C, 0xAC, + 0xF8, 0xA4, 0xA1, 0xAE, 0x30, 0xBA, 0xB8, 0xCA, 0x74, 0xCF, 0x24, 0xE2, + 0xF9, 0xE2, 0xDE, 0xF1, 0x74, 0xFD, 0x21, 0x0D, 0x13, 0xFF, 0x13, 0x13, + 0x48, 0xEA, 0x6C, 0xFC, 0x59, 0xD4, 0xD2, 0xE5, 0xB7, 0xBE, 0xD7, 0xD0, + 0x7E, 0xAD, 0x24, 0xB0, 0xC7, 0xA9, 0x27, 0x98, 0x54, 0xB9, 0x3E, 0xA8, + 0x89, 0xC7, 0x55, 0xCA, 0xF2, 0xD1, 0x02, 0xE5, 0xA9, 0xF0, 0x48, 0xFB, + 0x8F, 0x05, 0x5D, 0xFE, 0x5E, 0x00, 0xA3, 0xF6, 0xE8, 0xFC, 0x47, 0xF1, + 0xA1, 0x00, 0x6C, 0xF3, 0x01, 0xFA, 0x7B, 0xF4, 0x5B, 0xF1, 0x66, 0xE9, + 0xA0, 0xFC, 0xB2, 0xF1, 0x16, 0xFE, 0xD7, 0x02, 0x71, 0xEB, 0x87, 0x00, + 0x75, 0xF1, 0x56, 0x07, 0x2D, 0xFA, 0xE7, 0x06, 0xE6, 0xE6, 0xAF, 0xEC, + 0x3A, 0xCF, 0xA8, 0xD5, 0x8D, 0xC6, 0x49, 0xCA, 0xAB, 0xBF, 0x64, 0xB9, + 0x48, 0xBC, 0xCF, 0xAB, 0x2C, 0xC8, 0x8F, 0xB2, 0xBA, 0xCC, 0x59, 0xBF, + 0x71, 0xD8, 0xB5, 0xDB, 0x51, 0xFF, 0xC1, 0x03, 0x37, 0x16, 0xB9, 0x14, + 0x53, 0x00, 0x0A, 0x05, 0xB4, 0xE1, 0x32, 0xE7, 0x09, 0xD4, 0xE1, 0xD4, + 0x06, 0xCB, 0x7B, 0xD1, 0x67, 0xC3, 0x90, 0xCE, 0x5E, 0xD0, 0x08, 0xDD, + 0x6C, 0xF1, 0xE3, 0xFF, 0x2B, 0xFD, 0xF4, 0x04, 0x20, 0x02, 0x11, 0xFF, + 0xF3, 0x0A, 0x51, 0x01, 0x92, 0xF4, 0xDD, 0xED, 0xA5, 0xCE, 0x6F, 0xCE, + 0x4E, 0xC4, 0xA0, 0xBF, 0x21, 0xCA, 0x20, 0xBE, 0xD5, 0xCE, 0x4C, 0xBF, + 0xCB, 0xEA, 0xDC, 0xD4, 0x42, 0xFF, 0x97, 0xF3, 0x4A, 0xF1, 0x5B, 0x03, + 0x36, 0xE0, 0x6F, 0xFB, 0xA9, 0xE1, 0x8E, 0xEC, 0x03, 0xE1, 0x02, 0xE0, + 0x13, 0xBD, 0xC1, 0xBB, 0xD2, 0x9C, 0x5D, 0xA2, 0x73, 0xAB, 0xFF, 0xB8, + 0x19, 0xBE, 0x0F, 0xCE, 0x8C, 0xC8, 0xCC, 0xD8, 0x74, 0xE2, 0xEC, 0xF1, + 0xD6, 0xF9, 0xDF, 0x08, 0xF4, 0x11, 0x65, 0x1E, 0x42, 0x30, 0x5B, 0x2E, + 0x2B, 0x37, 0x7A, 0x2A, 0x8F, 0x26, 0xB3, 0x1F, 0x71, 0x07, 0x8C, 0x07, + 0x7A, 0xE2, 0x8C, 0xE9, 0x3D, 0xC3, 0x08, 0xD0, 0x94, 0xB7, 0x73, 0xBD, + 0x1A, 0xC6, 0x30, 0xC8, 0x72, 0xDB, 0xD6, 0xE2, 0xAE, 0xFB, 0x2B, 0xFE, + 0xE4, 0x20, 0x14, 0x17, 0x39, 0x3C, 0xEC, 0x26, 0x5E, 0x4D, 0x48, 0x29, + 0x1B, 0x55, 0x7D, 0x25, 0xF1, 0x4E, 0xC1, 0x23, 0xE3, 0x33, 0xBC, 0x1C, + 0xB5, 0x2A, 0x4C, 0x1F, 0x9E, 0x2E, 0xCE, 0x18, 0xAC, 0x1C, 0xB4, 0xFE, + 0x80, 0x15, 0xA2, 0xFC, 0x5F, 0x1F, 0xAE, 0x0C, 0x5A, 0x19, 0x8A, 0x13, + 0xC9, 0x04, 0x05, 0x0E, 0x1D, 0xF7, 0x28, 0xF8, 0x5F, 0xF7, 0xBA, 0xDC, + 0x1D, 0xFA, 0xA0, 0xC9, 0x29, 0xF3, 0x3D, 0xBE, 0x97, 0xF2, 0x39, 0xCA, + 0x75, 0xF1, 0x91, 0xDA, 0x79, 0xFA, 0xE0, 0xEF, 0x1F, 0x11, 0x61, 0x0D, + 0x44, 0x13, 0x1E, 0x0A, 0xFD, 0x0E, 0xAC, 0xF4, 0x99, 0x0F, 0x21, 0xE4, + 0xA4, 0x19, 0xE7, 0xE2, 0x0A, 0x17, 0x4B, 0xE3, 0xC8, 0xFA, 0x92, 0xD1, + 0xA3, 0x05, 0x4D, 0xE3, 0x58, 0x1A, 0x49, 0x10, 0xE9, 0x07, 0x03, 0x17, + 0xD6, 0x10, 0xFD, 0x17, 0x42, 0x1E, 0x94, 0x1B, 0xC5, 0x13, 0x8A, 0x15, + 0x85, 0x0D, 0x1A, 0x0F, 0x24, 0x07, 0x95, 0x06, 0x3C, 0x06, 0xD1, 0x09, + 0x47, 0x10, 0xA6, 0x1D, 0x55, 0x25, 0x5A, 0x3A, 0x8D, 0x3A, 0xD1, 0x48, + 0xCD, 0x4C, 0x74, 0x50, 0x93, 0x4A, 0x05, 0x4E, 0x9E, 0x40, 0x05, 0x42, + 0xEC, 0x41, 0xDD, 0x3C, 0xAF, 0x32, 0x25, 0x24, 0xFC, 0x2F, 0x79, 0x11, + 0x4A, 0x4C, 0x59, 0x2C, 0xBB, 0x43, 0x8C, 0x2F, 0xE6, 0x30, 0xC5, 0x20, + 0x7E, 0x40, 0x88, 0x39, 0xFC, 0x4E, 0x55, 0x53, 0xB3, 0x58, 0x68, 0x5A, + 0x69, 0x62, 0x9A, 0x5A, 0xB5, 0x5E, 0xE4, 0x4C, 0xEC, 0x40, 0xC6, 0x28, + 0x8C, 0x25, 0xFE, 0x09, 0xAB, 0x1A, 0xA5, 0xFF, 0x68, 0xF1, 0xDB, 0xE0, + 0x22, 0xC9, 0x15, 0xBD, 0x66, 0xCC, 0x9D, 0xC1, 0x81, 0xE5, 0xB8, 0xE4, + 0x76, 0x0D, 0xB0, 0x0C, 0xD2, 0x2B, 0xC7, 0x2A, 0x6D, 0x3E, 0xDF, 0x45, + 0xC6, 0x52, 0xCA, 0x5C, 0xB3, 0x5B, 0x8C, 0x5E, 0x8C, 0x59, 0x7B, 0x56, + 0xFE, 0x5D, 0xB4, 0x5C, 0x4C, 0x5A, 0xE2, 0x58, 0x3F, 0x3A, 0x2F, 0x3D, + 0x31, 0x1C, 0x26, 0x27, 0x21, 0x0F, 0x0C, 0x1C, 0xFD, 0x0A, 0x53, 0x12, + 0x03, 0x0B, 0xDC, 0x06, 0x6D, 0x0E, 0xD1, 0x08, 0x24, 0x15, 0xB3, 0x0E, + 0xD6, 0x13, 0x34, 0x01, 0xF7, 0x0B, 0x5F, 0xF5, 0x20, 0x0C, 0x84, 0xF0, + 0xD1, 0x11, 0x93, 0xF2, 0x99, 0x0D, 0x7A, 0xFD, 0x69, 0x10, 0xA0, 0x0C, + 0x5F, 0x29, 0xA9, 0x2A, 0xA4, 0x2A, 0xA7, 0x2D, 0xD4, 0x19, 0x83, 0x14, + 0x03, 0x13, 0x80, 0x04, 0x9B, 0xF7, 0xA3, 0xEB, 0x95, 0xD4, 0x0E, 0xD8, + 0x55, 0xC7, 0xCA, 0xD2, 0x8D, 0xCF, 0xA8, 0xDB, 0x9C, 0xDE, 0x37, 0xF3, + 0x43, 0xE6, 0x5E, 0xFE, 0x49, 0xEF, 0x49, 0x0B, 0x31, 0xF9, 0x6E, 0x17, + 0x6A, 0x00, 0xFD, 0x17, 0xCA, 0x05, 0x69, 0x13, 0xA9, 0x15, 0x0F, 0x09, + 0x2D, 0x1A, 0x20, 0x04, 0xFB, 0x16, 0x5B, 0x06, 0xFB, 0x26, 0xD0, 0x13, + 0xBF, 0x32, 0xFD, 0x2F, 0xD6, 0x29, 0xDB, 0x31, 0x3F, 0x29, 0x76, 0x2A, + 0x84, 0x31, 0xA1, 0x2A, 0x19, 0x24, 0x3C, 0x0F, 0x70, 0x09, 0x48, 0xEF, + 0xB4, 0x1E, 0x7B, 0x03, 0x67, 0x47, 0x0C, 0x2D, 0xCC, 0x43, 0x16, 0x36, + 0x3F, 0x4A, 0x70, 0x42, 0x8A, 0x5A, 0x6D, 0x50, 0xDF, 0x5B, 0xEF, 0x47, + 0x6C, 0x5B, 0xBB, 0x42, 0x0C, 0x4D, 0x73, 0x4D, 0x10, 0x39, 0x0F, 0x52, + 0xF2, 0x27, 0xA2, 0x3C, 0x31, 0x15, 0x1D, 0x13, 0x04, 0xF1, 0x4C, 0xE2, + 0x65, 0xBF, 0xBF, 0xBA, 0xF5, 0xA0, 0xF1, 0xA9, 0x5E, 0xA5, 0x6C, 0xBD, + 0xE0, 0xC5, 0xB9, 0xEB, 0xA0, 0xDD, 0x7D, 0x05, 0xA2, 0xF2, 0xB2, 0x17, + 0xA8, 0x23, 0xD6, 0x45, 0x62, 0x37, 0xE8, 0x5D, 0xF7, 0x23, 0xD1, 0x42, + 0x71, 0x18, 0xBD, 0x2A, 0xCA, 0xF5, 0xCF, 0x13, 0x6B, 0xD0, 0xA4, 0xF6, + 0x37, 0xB9, 0x8D, 0xE9, 0x83, 0xA5, 0xB1, 0xDA, 0x0C, 0xA7, 0x16, 0xCB, + 0x98, 0xA4, 0x4F, 0xC5, 0xF7, 0x9E, 0x22, 0xC2, 0x2B, 0xA8, 0xDD, 0xC1, + 0x39, 0xA7, 0xE5, 0xB5, 0xA3, 0xAB, 0x82, 0xAD, 0xE6, 0xC0, 0x39, 0xBA, + 0x1D, 0xBE, 0xC3, 0xBB, 0xB3, 0xC1, 0x61, 0xCF, 0x5C, 0xD3, 0x44, 0xF5, + 0x4A, 0xD9, 0xBC, 0x02, 0x20, 0xE9, 0x37, 0x10, 0x93, 0xF7, 0x5A, 0x1D, + 0xC8, 0xFB, 0x77, 0x27, 0x46, 0xF1, 0xEC, 0x23, 0x7C, 0xD7, 0x88, 0x09, + 0x6C, 0xBE, 0xF7, 0xF5, 0xA4, 0xAF, 0x76, 0xE9, 0x59, 0xBB, 0x5D, 0xE5, + 0x8E, 0xCB, 0xED, 0xE4, 0xB4, 0xDB, 0x3B, 0xE5, 0x10, 0xEA, 0xA4, 0xE5, + 0x41, 0xEF, 0x73, 0xF4, 0x17, 0xEB, 0x58, 0x03, 0x2F, 0xDC, 0x7B, 0xF5, + 0xA9, 0xDF, 0xCF, 0xEF, 0xF3, 0xE5, 0xC1, 0xEC, 0x17, 0xF2, 0x63, 0xE5, + 0x08, 0x06, 0xE4, 0xF2, 0xB3, 0x01, 0x78, 0xF7, 0xEE, 0xEB, 0x79, 0xE7, + 0x6F, 0xE0, 0x71, 0xEA, 0xE1, 0xDE, 0xFF, 0xEB, 0x82, 0xCE, 0xE2, 0xCE, + 0x87, 0xD2, 0x37, 0xC5, 0x42, 0xED, 0xEE, 0xDB, 0x91, 0xDD, 0xFE, 0xDB, + 0x16, 0xCF, 0xA9, 0xDC, 0x96, 0xE3, 0x85, 0xFB, 0xC8, 0xF8, 0x16, 0x17, + 0xFF, 0x0D, 0xBE, 0x25, 0x2C, 0x1F, 0x8B, 0x32, 0x5B, 0x24, 0xB4, 0x34, + 0x67, 0x18, 0x4F, 0x2C, 0x8C, 0xF9, 0x1E, 0x17, 0x00, 0xD1, 0xEF, 0xDF, + 0x49, 0xB7, 0x95, 0xB3, 0x43, 0xB8, 0x01, 0xAC, 0xF1, 0xD6, 0x9F, 0xBC, + 0x31, 0xFE, 0x19, 0xEF, 0xCA, 0x19, 0xE4, 0x1A, 0x72, 0x40, 0x20, 0x3A, + 0x3C, 0x5C, 0xFA, 0x57, 0x1A, 0x5A, 0x36, 0x57, 0x0B, 0x43, 0x9C, 0x35, + 0xCE, 0x29, 0x37, 0x14, 0xD5, 0x11, 0x40, 0xF4, 0x0F, 0xEE, 0x14, 0xD2, + 0x98, 0xCF, 0xD3, 0xC6, 0xF5, 0xB3, 0x80, 0xC8, 0xB7, 0x9E, 0x9B, 0xC2, + 0xA1, 0x9F, 0xA9, 0xBA, 0x02, 0xAB, 0xA7, 0xB4, 0xA3, 0xAA, 0xB6, 0xA5, + 0x3F, 0xA6, 0xF0, 0x9F, 0x37, 0xAF, 0xCD, 0xB6, 0x1A, 0xB5, 0x9F, 0xC5, + 0x27, 0xBE, 0x29, 0xCA, 0x55, 0xD2, 0x1F, 0xDE, 0x3D, 0xDF, 0xFB, 0xF1, + 0xBC, 0xE9, 0x38, 0x09, 0xB8, 0xEF, 0x10, 0x19, 0x69, 0xF9, 0x6F, 0x19, + 0xAB, 0xF7, 0x93, 0x0C, 0x22, 0xE8, 0xE9, 0xEC, 0xDA, 0xEE, 0xCD, 0xDC, + 0x95, 0xE5, 0x18, 0xD9, 0xC2, 0xC7, 0xCF, 0xD4, 0xBE, 0xCB, 0xE5, 0xE1, + 0x63, 0xD5, 0x00, 0xE2, 0x01, 0xDE, 0xB6, 0xDA, 0x19, 0xFA, 0x61, 0xE5, + 0xE0, 0x0C, 0xA3, 0xFA, 0x73, 0xFD, 0x8F, 0xFA, 0x3E, 0xE8, 0x59, 0xEF, + 0xBC, 0xE4, 0x1F, 0xED, 0xB6, 0xE6, 0x01, 0xE2, 0x47, 0xFF, 0x4C, 0xE1, + 0xDB, 0x12, 0x95, 0xE0, 0x8E, 0x11, 0x4C, 0xDD, 0xC4, 0x03, 0xE3, 0xDC, + 0xE1, 0xF7, 0xD1, 0xE0, 0xCE, 0xF3, 0xE1, 0xF0, 0x4F, 0xE4, 0x5D, 0xF5, + 0x3E, 0xD1, 0xEA, 0xE2, 0x54, 0xDC, 0x74, 0xE2, 0x81, 0xFD, 0xB7, 0xF7, + 0x61, 0xFB, 0xF9, 0xF1, 0xF0, 0xF8, 0x4E, 0xF6, 0x21, 0x17, 0x98, 0x14, + 0x95, 0x1B, 0x8C, 0x15, 0x81, 0x11, 0x02, 0x0E, 0x36, 0x1D, 0x8F, 0x10, + 0x5F, 0x19, 0xD3, 0x0C, 0xDF, 0xFC, 0x7A, 0xF9, 0xCA, 0xE3, 0x4E, 0xDF, + 0x6E, 0xC2, 0xC1, 0xC8, 0x41, 0xA3, 0xB8, 0xB0, 0xF0, 0xAB, 0x4B, 0xBB, + 0x9B, 0xD5, 0x3D, 0xDF, 0xEE, 0xFE, 0xC0, 0xF3, 0xA4, 0x2A, 0x7D, 0x13, + 0x0D, 0x54, 0x9F, 0x3B, 0x29, 0x62, 0x64, 0x55, 0x68, 0x54, 0x4B, 0x5B, + 0xC8, 0x41, 0x59, 0x45, 0x1B, 0x2B, 0x6A, 0x26, 0x59, 0x18, 0xC8, 0x15, + 0xCB, 0x0C, 0x1E, 0x08, 0x1A, 0xF7, 0x30, 0xFC, 0x46, 0xF6, 0x7D, 0x05, + 0xF8, 0x03, 0xB0, 0x14, 0xFC, 0x07, 0x4B, 0x17, 0x4F, 0x13, 0xE1, 0x12, + 0x32, 0x24, 0x57, 0x0F, 0xE1, 0x25, 0xEE, 0x00, 0xA0, 0x20, 0x90, 0xF3, + 0xBD, 0x20, 0xB9, 0x00, 0xB2, 0x27, 0x2C, 0x13, 0x2C, 0x3D, 0xD7, 0x26, + 0x98, 0x57, 0x52, 0x3D, 0xAA, 0x5E, 0xB1, 0x3E, 0x58, 0x5A, 0x10, 0x3E, + 0x78, 0x5E, 0x78, 0x46, 0x40, 0x56, 0x9E, 0x3F, 0x12, 0x3B, 0x19, 0x23, + 0x1C, 0x28, 0x1A, 0x0E, 0xAB, 0x22, 0x8D, 0x09, 0x82, 0x1D, 0x74, 0x0E, + 0x00, 0x18, 0xC9, 0x0C, 0x27, 0x1A, 0xB8, 0x08, 0xEF, 0x26, 0x23, 0x10, + 0xD7, 0x34, 0x05, 0x12, 0x69, 0x47, 0xB7, 0x1A, 0x17, 0x44, 0x87, 0x18, + 0x2B, 0x34, 0xC8, 0x0D, 0x37, 0x30, 0xB2, 0x0F, 0x5F, 0x2B, 0xD2, 0x11, + 0x31, 0x1B, 0x0E, 0x08, 0x42, 0x0E, 0x8F, 0xFA, 0x04, 0x11, 0xC2, 0xF6, + 0xF1, 0x13, 0xCC, 0xFA, 0x21, 0x17, 0xED, 0xFD, 0x05, 0x10, 0xBE, 0xF6, + 0xF9, 0x00, 0x12, 0xF1, 0xD9, 0x13, 0x88, 0x07, 0xB1, 0x2C, 0xD0, 0x18, + 0x6C, 0x27, 0x2A, 0x0F, 0x7C, 0x29, 0xA7, 0x0D, 0x14, 0x3B, 0x08, 0x1E, + 0x86, 0x48, 0x41, 0x2E, 0xD2, 0x47, 0xA9, 0x34, 0x1F, 0x3C, 0xB0, 0x34, + 0xC9, 0x34, 0xC3, 0x2C, 0xB6, 0x20, 0xC8, 0x18, 0xCF, 0xEA, 0x76, 0xEE, + 0x14, 0xC9, 0x3F, 0xCD, 0x39, 0xC9, 0x95, 0xC6, 0xF6, 0xC6, 0x93, 0xC4, + 0x4D, 0xD9, 0xE7, 0xD4, 0xB7, 0xFC, 0x38, 0xF1, 0xF5, 0x19, 0x65, 0x10, + 0x0E, 0x3B, 0x35, 0x39, 0xAC, 0x59, 0xCC, 0x5B, 0xC4, 0x5A, 0x54, 0x5C, + 0xE7, 0x41, 0x9B, 0x41, 0xBA, 0x24, 0x9F, 0x2E, 0x43, 0x04, 0xE4, 0x23, + 0x07, 0xE1, 0xE9, 0x15, 0xF4, 0xCB, 0xB4, 0x04, 0x2F, 0xD3, 0x24, 0xF5, + 0x56, 0xE8, 0x11, 0xEE, 0x23, 0xF7, 0x7C, 0xE6, 0x84, 0x06, 0xFA, 0xE6, + 0xA3, 0x12, 0x75, 0xF6, 0xBE, 0x0B, 0x73, 0xFD, 0x9C, 0x05, 0x3E, 0xFE, + 0x13, 0x16, 0xDD, 0x0D, 0xB8, 0x2B, 0x01, 0x23, 0x67, 0x37, 0xE7, 0x33, + 0x33, 0x3F, 0xC3, 0x38, 0x5E, 0x4A, 0x97, 0x30, 0x6C, 0x4B, 0x56, 0x2B, + 0x83, 0x40, 0xC6, 0x2B, 0x65, 0x2F, 0x37, 0x2D, 0x1A, 0x0C, 0x46, 0x22, + 0x37, 0xEF, 0x76, 0x12, 0xBD, 0xE2, 0x09, 0xFD, 0xBA, 0xDB, 0x1A, 0xE7, + 0x79, 0xD6, 0x53, 0xDC, 0x3D, 0xD7, 0xB5, 0xDD, 0x64, 0xE9, 0x12, 0xEC, + 0xE8, 0xFE, 0xB5, 0xFC, 0x42, 0x05, 0x32, 0xFA, 0x99, 0xFC, 0xFB, 0xEE, + 0x60, 0xF2, 0xD5, 0xF5, 0x5A, 0xF0, 0xCF, 0x01, 0xC6, 0xE7, 0x02, 0xF9, + 0x73, 0xE1, 0x46, 0xF1, 0xBC, 0xDC, 0x59, 0xE9, 0x91, 0xD7, 0x58, 0xDE, + 0xBE, 0xE0, 0x20, 0xE6, 0x6B, 0xE6, 0x38, 0xE9, 0xDA, 0xDA, 0x07, 0xDA, + 0x76, 0xD9, 0x18, 0xD7, 0x8B, 0x03, 0x07, 0x01, 0xD1, 0x1A, 0x93, 0x15, + 0xE1, 0x0D, 0x13, 0x05, 0xFD, 0x19, 0xD8, 0x18, 0x47, 0x36, 0xB7, 0x3E, + 0x63, 0x3F, 0x8E, 0x46, 0x9A, 0x36, 0xC5, 0x3B, 0x5F, 0x2A, 0x9E, 0x32, + 0x26, 0x1B, 0x45, 0x28, 0xB0, 0x04, 0xB0, 0x12, 0x8D, 0xF5, 0x27, 0x02, + 0x86, 0xEB, 0x45, 0xF9, 0x60, 0xDA, 0x2D, 0xE9, 0xFA, 0xE5, 0xCD, 0xEF, + 0x6C, 0x0F, 0x5F, 0x16, 0xD9, 0x27, 0x32, 0x32, 0x41, 0x39, 0xDD, 0x40, + 0xE3, 0x54, 0xF1, 0x53, 0x71, 0x62, 0x14, 0x60, 0x6B, 0x5F, 0x23, 0x5E, + 0x34, 0x58, 0x99, 0x5C, 0x22, 0x4A, 0x0F, 0x56, 0xD7, 0x31, 0xC7, 0x37, + 0x8A, 0x11, 0xB0, 0x10, 0x23, 0xF3, 0x06, 0xF9, 0x59, 0xE0, 0x19, 0xF2, + 0xB3, 0xD9, 0x4A, 0xF9, 0x33, 0xDE, 0xC2, 0x04, 0xF6, 0xE7, 0x12, 0xFF, + 0x6B, 0xEE, 0x84, 0xF1, 0xBF, 0xF0, 0x32, 0xF0, 0x0B, 0xE9, 0x0C, 0xF2, + 0xF0, 0xEC, 0x7F, 0xF9, 0xF6, 0x09, 0xA3, 0x0B, 0xA1, 0x20, 0x07, 0x14, + 0x91, 0x2D, 0xA0, 0x16, 0xA4, 0x2C, 0x68, 0x0F, 0x3D, 0x1C, 0xF5, 0x01, + 0x4F, 0x0E, 0xE8, 0x01, 0xF6, 0x06, 0x89, 0x08, 0xB5, 0xFD, 0xFD, 0x0F, + 0x4A, 0xEE, 0xB4, 0x13, 0xAB, 0xE4, 0x97, 0x10, 0x48, 0xE9, 0x9F, 0x08, + 0xCB, 0xF9, 0xB0, 0x03, 0xB9, 0x00, 0x29, 0xFD, 0x3C, 0xFC, 0xF5, 0xF9, + 0x23, 0xFE, 0x9B, 0x02, 0x64, 0xF2, 0x8E, 0x02, 0x23, 0xE5, 0x2F, 0x01, + 0xE8, 0xE3, 0x14, 0x06, 0x7C, 0xE0, 0x1F, 0x0C, 0x1E, 0xD5, 0x23, 0x10, + 0xF6, 0xCA, 0x07, 0x12, 0xF1, 0xC4, 0x17, 0x07, 0x60, 0xC0, 0x21, 0xEF, + 0xFA, 0xC5, 0xEA, 0xE3, 0x8B, 0xC5, 0x80, 0xE1, 0x11, 0xB6, 0x68, 0xDE, + 0x95, 0xB6, 0xC9, 0xF1, 0xE1, 0xC6, 0x89, 0x07, 0x93, 0xC7, 0xB3, 0xF5, + 0xBB, 0xD5, 0x53, 0xE9, 0xE0, 0xF9, 0xC4, 0x03, 0x2C, 0x0A, 0x81, 0x13, + 0xB0, 0x01, 0x3A, 0x0E, 0x55, 0xEE, 0x6B, 0x07, 0x7D, 0xDF, 0xB1, 0xFB, + 0xCB, 0xD8, 0xF4, 0xEC, 0xD9, 0xCE, 0xCE, 0xE4, 0xD5, 0xBE, 0x4F, 0xD8, + 0xDB, 0xA9, 0x3E, 0xC2, 0x1F, 0xAB, 0x9E, 0xC5, 0x26, 0xC5, 0x94, 0xE3, + 0xF9, 0xEA, 0xE2, 0x07, 0x53, 0x15, 0xCF, 0x22, 0xA2, 0x34, 0x4E, 0x25, + 0x7F, 0x4B, 0x71, 0x1D, 0x15, 0x57, 0x71, 0x1E, 0x7C, 0x4A, 0xE4, 0x1F, + 0x57, 0x1D, 0xC8, 0x04, 0x04, 0xEC, 0x28, 0xE1, 0x45, 0xCF, 0xA2, 0xD1, + 0x46, 0xC1, 0x2C, 0xCE, 0x72, 0xC5, 0x54, 0xD5, 0xE7, 0xD6, 0xAF, 0xDC, + 0x13, 0xDF, 0x83, 0xD7, 0xE5, 0xDD, 0x09, 0xD2, 0x66, 0xDD, 0xCD, 0xD0, + 0xD4, 0xDF, 0xEF, 0xCD, 0xE1, 0xEC, 0xF6, 0xCD, 0xFF, 0x00, 0xC0, 0xD6, + 0x0E, 0x09, 0x4E, 0xDE, 0x47, 0x0D, 0xD8, 0xEF, 0x52, 0x0D, 0x28, 0x08, + 0x25, 0xF6, 0xA8, 0x00, 0x61, 0xE2, 0xDB, 0xED, 0x2E, 0xDF, 0xAA, 0xE9, + 0xFB, 0xD6, 0x6C, 0xDF, 0x21, 0xBC, 0x3E, 0xCA, 0xCD, 0xA7, 0x50, 0xC7, + 0xA7, 0xA9, 0x95, 0xD1, 0xDB, 0xB1, 0xF1, 0xD5, 0x6F, 0xBB, 0x47, 0xDE, + 0x42, 0xC2, 0x46, 0xDA, 0xED, 0xD3, 0xB5, 0xD0, 0x21, 0xD7, 0xF1, 0xBC, + 0xA3, 0xCF, 0x9F, 0xAC, 0x1B, 0xDB, 0xB1, 0xBD, 0xE9, 0xDC, 0xFA, 0xD2, + 0xC9, 0xE4, 0x3F, 0xED, 0x91, 0xE5, 0x9B, 0xF3, 0xB5, 0xD4, 0x9A, 0xDA, + 0xB4, 0xCF, 0x24, 0xCD, 0x2E, 0xD3, 0xA9, 0xDB, 0x38, 0xD6, 0x21, 0xEE, + 0xF1, 0xD5, 0x16, 0xEE, 0x8D, 0xDD, 0xAF, 0xE4, 0x75, 0xFE, 0xA0, 0xEE, + 0x32, 0x0D, 0xE6, 0xFA, 0xF4, 0xF9, 0x57, 0xF4, 0x4C, 0x09, 0xE3, 0x0D, + 0x43, 0x27, 0xFC, 0x34, 0x9F, 0x22, 0x01, 0x2F, 0x1E, 0x1F, 0xA9, 0x24, + 0x4A, 0x27, 0x00, 0x2D, 0x32, 0x12, 0x9D, 0x1A, 0x24, 0xEF, 0x61, 0xFC, + 0x2A, 0xE0, 0x8A, 0xEE, 0xA4, 0xC3, 0x48, 0xD0, 0x11, 0xAC, 0xEA, 0xB9, + 0x0C, 0xC7, 0xE4, 0xC9, 0x02, 0xF3, 0x5A, 0xE9, 0xFA, 0x12, 0x17, 0x0B, + 0x4B, 0x29, 0xAA, 0x23, 0x6C, 0x3C, 0x61, 0x2A, 0x9C, 0x4D, 0x8F, 0x24, + 0x46, 0x4B, 0x42, 0x11, 0x5E, 0x2F, 0x71, 0xED, 0xB3, 0x0E, 0x5A, 0xCF, + 0xD7, 0xED, 0xB0, 0xC4, 0x07, 0xC7, 0x73, 0xBB, 0x3B, 0xB3, 0x08, 0xB9, + 0xF7, 0xC0, 0x5E, 0xC7, 0x8D, 0xD0, 0xB0, 0xC6, 0x81, 0xDB, 0x3E, 0xB8, + 0x39, 0xED, 0x29, 0xB0, 0x96, 0xF6, 0xC0, 0xA7, 0xD0, 0xF4, 0xC3, 0xA3, + 0xC5, 0xF7, 0xCF, 0xAE, 0x34, 0x05, 0x99, 0xC9, 0x6B, 0x07, 0x3A, 0xDF, + 0x52, 0x03, 0x0F, 0xED, 0x1E, 0x11, 0x2C, 0x03, 0x3F, 0x09, 0xDC, 0x02, + 0xE9, 0xEE, 0x8F, 0xF4, 0x3F, 0xE8, 0x8E, 0xEE, 0xF9, 0xE2, 0x39, 0xE1, + 0x80, 0xDE, 0xCD, 0xD7, 0x6F, 0xDF, 0x53, 0xE1, 0x29, 0xD6, 0xE7, 0xEC, + 0x2F, 0xD2, 0xB5, 0xED, 0xAF, 0xE3, 0x8A, 0xEE, 0x23, 0xF0, 0x31, 0xEB, + 0x54, 0xEB, 0x33, 0xDF, 0xB2, 0xE5, 0x1E, 0xDE, 0x04, 0xE7, 0x90, 0xEB, + 0x7C, 0xEB, 0x97, 0xF5, 0x30, 0xF5, 0x4B, 0xFD, 0x44, 0xFB, 0xFF, 0xFC, + 0x72, 0xF0, 0x23, 0xF7, 0xCB, 0xDA, 0x6D, 0xE9, 0x26, 0xDE, 0xB8, 0xE0, + 0x0F, 0xFF, 0xD7, 0xF2, 0x74, 0x0C, 0xDC, 0xFB, 0x68, 0xFB, 0xB3, 0xF2, + 0x34, 0xFE, 0x99, 0x09, 0x7A, 0x14, 0x06, 0x26, 0x2C, 0x11, 0x9C, 0x15, + 0x1A, 0x15, 0xF7, 0x0D, 0x0F, 0x2F, 0x3D, 0x19, 0xD1, 0x33, 0xCC, 0x10, + 0x3D, 0x31, 0xB3, 0x11, 0x5F, 0x41, 0xC7, 0x2B, 0xE1, 0x45, 0x58, 0x38, + 0x80, 0x1C, 0xCC, 0x17, 0x10, 0xE9, 0xB9, 0xEC, 0x56, 0xC7, 0xA2, 0xCE, + 0x8A, 0xA5, 0x34, 0xAD, 0x47, 0xA7, 0x3E, 0xB4, 0x50, 0xDA, 0xF7, 0xEC, + 0x10, 0x02, 0xDD, 0x11, 0x3A, 0x23, 0xB7, 0x25, 0xB6, 0x4A, 0xED, 0x3C, + 0x00, 0x5C, 0x0D, 0x41, 0xB6, 0x53, 0x1E, 0x2F, 0x46, 0x40, 0x47, 0x13, + 0xFD, 0x2F, 0x33, 0x02, 0x72, 0x18, 0xCD, 0xEF, 0x95, 0xF4, 0xA7, 0xD3, + 0x3C, 0xD3, 0xD0, 0xC2, 0x9B, 0xD3, 0x96, 0xCF, 0x83, 0xF0, 0x9E, 0xE8, + 0xA0, 0x06, 0xB9, 0xF2, 0xCE, 0x11, 0x7E, 0xF4, 0x5C, 0x12, 0x13, 0xEE, + 0xA1, 0x12, 0x8C, 0xE7, 0x16, 0x17, 0xAC, 0xE9, 0x13, 0x14, 0xD3, 0xE7, + 0xB0, 0x1D, 0xB2, 0xF6, 0xF2, 0x2A, 0xB3, 0x16, 0x4D, 0x28, 0x60, 0x29, + 0x51, 0x21, 0x5F, 0x26, 0x14, 0x0F, 0x50, 0x12, 0xCB, 0x02, 0x4A, 0x02, + 0x62, 0x05, 0x51, 0xFF, 0xB3, 0xFD, 0x91, 0xFD, 0x19, 0xF4, 0xB9, 0x00, + 0x04, 0xF2, 0x49, 0x07, 0x4D, 0xF5, 0x19, 0x09, 0x36, 0xFD, 0x54, 0x0C, + 0x22, 0x02, 0xAE, 0x15, 0x15, 0x06, 0xE9, 0x1F, 0x47, 0x0D, 0x54, 0x1F, + 0x70, 0x20, 0x70, 0x21, 0xBD, 0x2B, 0x43, 0x1C, 0xE6, 0x2A, 0xBF, 0x12, + 0x7B, 0x22, 0xDE, 0x15, 0xBF, 0x16, 0xFC, 0x22, 0x54, 0x13, 0x50, 0x2E, + 0x44, 0x11, 0x32, 0x30, 0xB7, 0x1F, 0x9C, 0x42, 0xAE, 0x24, 0x04, 0x47, + 0xD6, 0x13, 0xB2, 0x32, 0xE5, 0x26, 0xEE, 0x40, 0xBF, 0x4B, 0x2D, 0x5E, + 0x33, 0x50, 0x00, 0x62, 0xF9, 0x4C, 0x86, 0x5B, 0x99, 0x57, 0x46, 0x5D, + 0xA9, 0x5A, 0xFE, 0x59, 0x1B, 0x4E, 0xB0, 0x47, 0x60, 0x49, 0xD3, 0x3C, + 0x6F, 0x4F, 0x0F, 0x38, 0xBF, 0x41, 0x17, 0x20, 0x1F, 0x26, 0xF1, 0x04, + 0x57, 0x0A, 0xE6, 0xEC, 0x60, 0xE1, 0xB1, 0xC7, 0xF5, 0xDA, 0x42, 0xC7, + 0x9D, 0x06, 0xFB, 0xF2, 0x34, 0x31, 0x8F, 0x26, 0xC9, 0x4D, 0x4A, 0x50, + 0xE3, 0x5D, 0x84, 0x5D, 0xC8, 0x63, 0x98, 0x5B, 0xB9, 0x52, 0xEE, 0x44, + 0x0A, 0x2F, 0xDD, 0x1B, 0xEC, 0x0B, 0x1E, 0xFC, 0xEE, 0xE5, 0xA3, 0xE2, + 0xA2, 0xCD, 0x7F, 0xD1, 0x25, 0xCE, 0x34, 0xD4, 0xB7, 0xD5, 0x60, 0xE1, + 0xB7, 0xE0, 0xB4, 0xF4, 0x29, 0xE7, 0xEE, 0x09, 0x86, 0xE7, 0x7D, 0x1E, + 0x96, 0xE7, 0x2C, 0x24, 0x78, 0xEA, 0x66, 0x14, 0x85, 0x00, 0x1C, 0x0F, + 0x70, 0x1B, 0xD5, 0x1A, 0xB6, 0x1C, 0xBD, 0x1C, 0x8A, 0x1C, 0x6C, 0x1A, + 0x5E, 0x2C, 0x08, 0x28, 0xB5, 0x28, 0x13, 0x2B, 0x08, 0x14, 0xBC, 0x0D, + 0x2E, 0x10, 0xF6, 0xF9, 0xF2, 0x0E, 0xBF, 0xF9, 0x6C, 0xFA, 0x60, 0xF2, + 0x0D, 0xE4, 0x17, 0xEE, 0x35, 0xDF, 0x3F, 0xFC, 0xE5, 0xE7, 0xB5, 0x0E, + 0x1F, 0xF6, 0x36, 0x19, 0xE7, 0x05, 0x63, 0x1C, 0x14, 0x06, 0x7B, 0x13, + 0xD7, 0x04, 0xB2, 0x0C, 0x89, 0x06, 0x0E, 0x04, 0xD6, 0x08, 0x7D, 0x07, + 0x63, 0x0A, 0xBC, 0x13, 0x3E, 0xFB, 0x1E, 0x0C, 0x1F, 0xEB, 0x3A, 0x03, + 0x3A, 0xEF, 0x9A, 0x09, 0x29, 0xF6, 0x1F, 0x0E, 0xBE, 0xE5, 0x9A, 0x01, + 0xC4, 0xD7, 0xC1, 0xFB, 0xED, 0xEC, 0xA4, 0x15, 0x7A, 0x02, 0xB0, 0x29, + 0x09, 0x01, 0xF2, 0x17, 0x19, 0x0E, 0xCE, 0x17, 0x8B, 0x25, 0x42, 0x36, + 0x65, 0x22, 0x88, 0x32, 0xFD, 0x1E, 0x30, 0x1A, 0x58, 0x23, 0x09, 0x15, + 0x82, 0x12, 0x78, 0x0B, 0xE0, 0xF7, 0x00, 0xF0, 0xDB, 0xE3, 0xAE, 0xDB, + 0xC4, 0xC9, 0x2F, 0xC9, 0x4D, 0xB6, 0x0C, 0xC0, 0x9D, 0xBF, 0xA3, 0xD4, + 0xC4, 0xDD, 0x5E, 0xF9, 0x41, 0x06, 0xF5, 0x26, 0x3F, 0x2D, 0x9F, 0x44, + 0x5A, 0x48, 0x60, 0x44, 0x70, 0x56, 0xA8, 0x3E, 0xFB, 0x4D, 0x57, 0x2E, + 0x2E, 0x2A, 0x1B, 0x0D, 0x0E, 0x04, 0xA5, 0xF8, 0xD2, 0xF3, 0x03, 0xF5, + 0x5B, 0xEA, 0x2C, 0xE9, 0x6F, 0xD2, 0x12, 0xD0, 0x75, 0xC9, 0x3E, 0xD1, + 0x38, 0xD2, 0xC9, 0xEF, 0x13, 0xD3, 0x6A, 0xFC, 0xDA, 0xDB, 0x97, 0xFC, + 0x26, 0xF0, 0x92, 0x00, 0x85, 0xF9, 0xB7, 0xF7, 0x79, 0xF4, 0xB3, 0xE3, + 0x39, 0xF7, 0xFF, 0xE6, 0xB4, 0xF9, 0x47, 0xFD, 0xEB, 0xEF, 0xD4, 0x0D, + 0xA5, 0xF5, 0x5B, 0x1D, 0x72, 0x01, 0xDD, 0x19, 0x59, 0xF4, 0xD7, 0xFE, + 0xA6, 0xE1, 0x8D, 0xE7, 0xAB, 0xDC, 0xCF, 0xDE, 0x4F, 0xD5, 0x45, 0xDC, + 0xE7, 0xD2, 0xFE, 0xE8, 0xE9, 0xE6, 0xD8, 0xFB, 0x60, 0xF7, 0x02, 0x02, + 0x56, 0x00, 0x01, 0x14, 0xBD, 0xFE, 0xF1, 0x1B, 0xB3, 0xED, 0x0A, 0x10, + 0xAE, 0xE9, 0x3F, 0x0F, 0xCE, 0xF6, 0xD8, 0x0E, 0xC4, 0x07, 0x18, 0x0D, + 0xA6, 0x0E, 0xE1, 0x07, 0x61, 0x0C, 0x71, 0x01, 0x49, 0x05, 0x08, 0x02, + 0x69, 0x05, 0x19, 0x0A, 0x68, 0x0F, 0xBA, 0x18, 0xD9, 0x05, 0xA7, 0x17, + 0xE7, 0xFC, 0x5A, 0x10, 0x16, 0x12, 0x09, 0x1D, 0x81, 0x12, 0xD9, 0x0D, + 0xC8, 0x01, 0x2F, 0xF0, 0x17, 0x0E, 0xF5, 0xFE, 0xB9, 0x18, 0xF7, 0x0E, + 0xC2, 0x0D, 0xBE, 0x05, 0xEC, 0x0D, 0x59, 0x06, 0xD4, 0x14, 0xB0, 0x0E, + 0x78, 0x01, 0x13, 0x01, 0x44, 0xDC, 0x08, 0xE5, 0xBB, 0xBA, 0x65, 0xC8, + 0xA0, 0xA1, 0x40, 0xAA, 0x0A, 0xA1, 0x26, 0xA2, 0x74, 0xB5, 0xE9, 0xAA, + 0x5F, 0xD5, 0xE9, 0xBF, 0xB2, 0xF0, 0x58, 0xE0, 0x22, 0x04, 0xA2, 0xFF, + 0x59, 0x1A, 0x39, 0x1F, 0x24, 0x0D, 0xC1, 0x15, 0xCF, 0xD9, 0x70, 0xE2, + 0x51, 0xB2, 0x85, 0xBD, 0x0F, 0xAA, 0xF0, 0xB0, 0x18, 0xB0, 0xDE, 0xAF, + 0x84, 0xAE, 0xE1, 0xB0, 0xB8, 0xB8, 0xC1, 0xC3, 0x96, 0xC6, 0x4A, 0xDC, + 0xD5, 0xC3, 0xF2, 0xE6, 0x55, 0xCF, 0xDB, 0xEC, 0xF1, 0xE6, 0x47, 0xE5, + 0xE7, 0xF6, 0x52, 0xE5, 0xAA, 0xFA, 0x5A, 0xE5, 0x7E, 0x02, 0xBD, 0xE4, + 0x8F, 0x0E, 0xCC, 0xF4, 0xC6, 0x12, 0x7B, 0x01, 0xAF, 0x11, 0x40, 0x07, + 0xB0, 0x04, 0xF0, 0xF8, 0x66, 0x01, 0x46, 0xF2, 0x08, 0xFD, 0x54, 0xF6, + 0x12, 0xE9, 0x4C, 0xED, 0xA7, 0xDD, 0x4D, 0xEB, 0x83, 0xD8, 0xA3, 0xE3, + 0x41, 0xD5, 0x7D, 0xDA, 0xA0, 0xD0, 0xFE, 0xD8, 0x99, 0xD1, 0x3C, 0xDE, + 0xC9, 0xCB, 0x22, 0xD8, 0x2C, 0xCF, 0x37, 0xD9, 0x4B, 0xDF, 0xFB, 0xEE, + 0x55, 0xD1, 0xA6, 0xE9, 0x39, 0xB6, 0xAE, 0xD5, 0xCC, 0xB5, 0xE4, 0xD9, + 0x5C, 0xB4, 0x93, 0xD2, 0xF2, 0xAF, 0x58, 0xC1, 0xB6, 0xC6, 0x26, 0xCC, + 0x06, 0xD1, 0x81, 0xCC, 0xAD, 0xCC, 0x3F, 0xC5, 0xC5, 0xDF, 0x2A, 0xCF, + 0x17, 0xFE, 0x9A, 0xDC, 0xF2, 0xFF, 0x31, 0xDD, 0xDC, 0xEF, 0xC0, 0xD8, + 0xC8, 0xFC, 0x28, 0xEC, 0x14, 0x18, 0x7B, 0x04, 0x64, 0x22, 0x01, 0x07, + 0x13, 0x24, 0xC8, 0x02, 0x90, 0x1F, 0x8F, 0xFB, 0xAB, 0x04, 0x75, 0xDD, + 0x43, 0xE7, 0xD8, 0xC5, 0xEF, 0xCE, 0x01, 0xBB, 0xF9, 0xB0, 0xC4, 0xA6, + 0xFE, 0xB5, 0x89, 0xAF, 0x81, 0xE7, 0xCD, 0xDD, 0xB0, 0x1A, 0xF2, 0x07, + 0x07, 0x3F, 0x57, 0x30, 0x5E, 0x53, 0xEB, 0x51, 0x84, 0x54, 0x6E, 0x49, + 0x0B, 0x42, 0x21, 0x25, 0x26, 0x1F, 0xB9, 0x04, 0xBA, 0xF6, 0x87, 0xED, + 0x29, 0xD3, 0x3B, 0xD8, 0x37, 0xBE, 0x6B, 0xD3, 0xC3, 0xB9, 0x11, 0xE4, + 0x01, 0xC9, 0xF6, 0xF7, 0x03, 0xDF, 0xF5, 0x03, 0x64, 0xF0, 0x64, 0x0A, + 0xFA, 0x05, 0x68, 0x10, 0x89, 0x14, 0xBA, 0x04, 0x26, 0x20, 0xA1, 0xF1, + 0x45, 0x2B, 0x5E, 0xEB, 0xC1, 0x23, 0xBF, 0xEA, 0x4C, 0x19, 0xC8, 0xFC, + 0x2A, 0x14, 0x8B, 0x12, 0xD4, 0x0B, 0x3C, 0x15, 0xEF, 0x14, 0x15, 0x23, + 0x6D, 0x1D, 0x38, 0x2F, 0x8F, 0x15, 0x93, 0x2C, 0x0C, 0x0F, 0x47, 0x24, + 0x26, 0x10, 0xC8, 0x15, 0x29, 0x1D, 0x2E, 0x12, 0x38, 0x26, 0x31, 0x18, + 0x83, 0x28, 0x1A, 0x23, 0x4A, 0x25, 0x7D, 0x28, 0x4D, 0x27, 0x3D, 0x2F, + 0x29, 0x2D, 0x1D, 0x31, 0xB3, 0x28, 0x69, 0x28, 0x54, 0x1F, 0x4E, 0x1C, + 0x03, 0x20, 0x88, 0x12, 0xB3, 0x28, 0xC0, 0x13, 0xC3, 0x29, 0x6B, 0x0D, + 0x99, 0x2C, 0x33, 0x09, 0x84, 0x2A, 0x84, 0x08, 0x39, 0x17, 0x9E, 0xFD, + 0xD3, 0x19, 0x14, 0x13, 0x49, 0x26, 0x21, 0x31, 0xF7, 0x12, 0x46, 0x21, + 0xCF, 0x13, 0x48, 0x0F, 0xD9, 0x32, 0x72, 0x18, 0x2B, 0x37, 0xCC, 0x1C, + 0x55, 0x29, 0xCA, 0x14, 0xCA, 0x1F, 0xF5, 0x13, 0x83, 0x07, 0x5D, 0x0B, + 0x65, 0xD7, 0x02, 0xE8, 0x8F, 0xAF, 0xEA, 0xC3, 0x41, 0xA3, 0xB5, 0xAD, + 0x13, 0xA3, 0xD6, 0xA0, 0x57, 0xAB, 0x6D, 0xA8, 0xEB, 0xCB, 0xEF, 0xD3, + 0xF8, 0xF5, 0x1B, 0x04, 0xBE, 0x19, 0xB5, 0x1A, 0x4C, 0x33, 0x5C, 0x23, + 0xBD, 0x36, 0x9B, 0x1A, 0x38, 0x1D, 0xB0, 0xF8, 0xE6, 0xEF, 0x2C, 0xD1, + 0x24, 0xD1, 0x6D, 0xBC, 0x8D, 0xC8, 0x91, 0xBA, 0x9B, 0xC1, 0xB0, 0xC1, + 0x34, 0xC0, 0x09, 0xD4, 0x83, 0xD1, 0xF6, 0xED, 0x63, 0xE9, 0x93, 0xFB, + 0xD6, 0xF3, 0x91, 0xFB, 0xEB, 0xF0, 0x2D, 0xF7, 0x28, 0xF1, 0x84, 0xEE, + 0xFD, 0xF7, 0x6B, 0xE7, 0x94, 0x05, 0xBF, 0xEB, 0xF4, 0x19, 0x86, 0xFA, + 0x25, 0x2B, 0x3C, 0x06, 0x0D, 0x31, 0x84, 0x0C, 0xF1, 0x2F, 0x41, 0x16, + 0xDE, 0x32, 0x7F, 0x19, 0x18, 0x31, 0xEB, 0x11, 0xF4, 0x22, 0xA1, 0x0C, + 0x1C, 0x12, 0xD6, 0x08, 0xDF, 0x0B, 0x1F, 0x0B, 0x26, 0x0A, 0x64, 0x0D, + 0x36, 0x0E, 0x01, 0x0F, 0xC4, 0x11, 0x4E, 0x0B, 0x07, 0x0B, 0xA3, 0x01, + 0x39, 0x0D, 0x06, 0x08, 0xD4, 0x11, 0x71, 0x08, 0x2C, 0x0F, 0x23, 0xFD, + 0x7B, 0x0A, 0xE5, 0xF8, 0xBC, 0xFB, 0x0F, 0xF5, 0xF3, 0xDE, 0x22, 0xF0, + 0xB8, 0xCF, 0x4D, 0xF6, 0xD5, 0xD8, 0x9B, 0xFC, 0x8D, 0xDE, 0x47, 0xF1, + 0x6E, 0xDF, 0xC8, 0xE6, 0x48, 0xFC, 0xAA, 0xFD, 0x0E, 0x0F, 0xA1, 0x0E, + 0x26, 0x07, 0x57, 0x06, 0x69, 0x1D, 0xF5, 0x14, 0x90, 0x35, 0xC3, 0x1F, + 0x5C, 0x2D, 0x88, 0x15, 0xB4, 0x27, 0xA5, 0x1A, 0x68, 0x2F, 0x64, 0x2D, + 0xA4, 0x20, 0xE2, 0x24, 0x34, 0xFE, 0x87, 0xFC, 0x80, 0xF0, 0x76, 0xDF, + 0xC6, 0xEC, 0xA9, 0xC9, 0x7F, 0xEC, 0x8F, 0xC3, 0xFC, 0x06, 0x03, 0xF2, + 0x7D, 0x2C, 0x0B, 0x31, 0x7C, 0x43, 0xFB, 0x50, 0xB0, 0x55, 0x81, 0x5C, + 0x9E, 0x66, 0xEC, 0x62, 0x27, 0x5E, 0x74, 0x57, 0x07, 0x37, 0xD0, 0x33, + 0x9C, 0x10, 0x00, 0x11, 0x62, 0xF1, 0x47, 0xF6, 0xB8, 0xDB, 0xF5, 0xE1, + 0xB5, 0xE2, 0x21, 0xEB, 0x06, 0xF0, 0x33, 0x02, 0xED, 0xF4, 0xFC, 0x14, + 0x92, 0xFB, 0x8F, 0x26, 0x2C, 0x04, 0x46, 0x2E, 0x40, 0x04, 0x03, 0x2A, + 0xC6, 0xFE, 0x78, 0x1F, 0x1B, 0x0C, 0x7A, 0x1E, 0xC0, 0x1E, 0xBE, 0x1E, + 0x0B, 0x2E, 0x5B, 0x1D, 0x7C, 0x40, 0x5E, 0x21, 0xA9, 0x46, 0x8A, 0x27, + 0xF5, 0x40, 0xAD, 0x37, 0x3C, 0x38, 0x37, 0x44, 0xD7, 0x34, 0x5F, 0x3F, + 0x1A, 0x34, 0x2C, 0x35, 0xD5, 0x34, 0x9C, 0x2E, 0x33, 0x31, 0x7C, 0x24, + 0x3C, 0x26, 0xA2, 0x1C, 0xD8, 0x26, 0xBD, 0x1C, 0xF9, 0x36, 0xDA, 0x20, + 0x50, 0x4A, 0x60, 0x2C, 0xAF, 0x50, 0x69, 0x3A, 0xEB, 0x44, 0xB5, 0x44, + 0xAE, 0x32, 0xD2, 0x4A, 0x30, 0x26, 0x3C, 0x47, 0xC3, 0x1B, 0x93, 0x2F, + 0x1B, 0x1B, 0x4E, 0x1C, 0x1E, 0x20, 0x88, 0x14, 0x2A, 0x1F, 0x3D, 0x0C, + 0x1F, 0x21, 0x68, 0x0E, 0x61, 0x32, 0xB6, 0x27, 0xE8, 0x35, 0x6B, 0x34, + 0x7C, 0x10, 0x40, 0x19, 0x6D, 0x00, 0x8B, 0x12, 0x99, 0x14, 0x94, 0x28, + 0xB4, 0x1B, 0xD1, 0x24, 0xD4, 0x1D, 0x05, 0x16, 0x75, 0x25, 0xD8, 0x1D, + 0x6D, 0x08, 0x04, 0x0E, 0x35, 0xD3, 0xD8, 0xE5, 0x1A, 0xB3, 0xF3, 0xD2, + 0xD5, 0x9C, 0x52, 0xB7, 0xE1, 0xA5, 0xB6, 0xAF, 0x2A, 0xDF, 0x69, 0xE0, + 0xD8, 0x17, 0xA7, 0x18, 0xDE, 0x32, 0x89, 0x39, 0x49, 0x40, 0xA0, 0x4C, + 0x5C, 0x38, 0xCD, 0x4E, 0xA2, 0x17, 0x64, 0x28, 0x33, 0x00, 0x41, 0xFB, + 0x98, 0xED, 0xB8, 0xE3, 0x3B, 0xCD, 0xBA, 0xD6, 0xE8, 0xBE, 0x44, 0xDC, + 0x0C, 0xCF, 0xE8, 0xF5, 0x30, 0xDF, 0x26, 0x0E, 0x14, 0xEF, 0xC1, 0x16, + 0x8B, 0x05, 0xAD, 0x22, 0xC8, 0x0D, 0x14, 0x26, 0x0F, 0x03, 0x3B, 0x0E, + 0xF6, 0xFB, 0x4D, 0xFE, 0x73, 0xFA, 0x18, 0x00, 0x6C, 0xFE, 0x68, 0x02, + 0xEF, 0x10, 0xF6, 0x14, 0x01, 0x25, 0xBB, 0x32, 0x1F, 0x27, 0x5C, 0x3C, + 0xF4, 0x21, 0x09, 0x37, 0x16, 0x20, 0x9A, 0x35, 0xE7, 0x16, 0x34, 0x30, + 0x2C, 0x10, 0x87, 0x21, 0x32, 0x1A, 0x5A, 0x20, 0x24, 0x18, 0xED, 0x1D, + 0xC4, 0x10, 0x36, 0x14, 0x97, 0x15, 0x58, 0x11, 0xE2, 0x0C, 0xFB, 0x14, + 0x4E, 0x04, 0x5F, 0x20, 0x04, 0x0A, 0x40, 0x18, 0x0C, 0x12, 0x88, 0x00, + 0xE5, 0x0C, 0x68, 0xF0, 0x51, 0xFA, 0x56, 0xE0, 0xEC, 0xEB, 0xC5, 0xD0, + 0x76, 0xF1, 0xB7, 0xDA, 0xF7, 0xF8, 0x9B, 0xEA, 0xD9, 0xEF, 0xCA, 0xE1, + 0xCF, 0xF3, 0x93, 0xE0, 0x9D, 0x09, 0x63, 0xFD, 0xD0, 0xFC, 0x96, 0xFD, + 0xC4, 0xD8, 0x24, 0xDF, 0xE2, 0xE7, 0x12, 0xE9, 0xFA, 0x03, 0xC0, 0xF7, + 0xAA, 0xFA, 0xA8, 0xE7, 0x7E, 0xFC, 0xE7, 0xEF, 0xE2, 0x09, 0x3F, 0x07, + 0xFF, 0xEF, 0xBA, 0xF1, 0x02, 0xC5, 0x1A, 0xD3, 0xA3, 0xB1, 0x96, 0xD3, + 0x61, 0xA7, 0x36, 0xCC, 0x19, 0xB5, 0xC0, 0xD4, 0x9B, 0xF0, 0xFD, 0x0B, + 0x02, 0x2E, 0xD0, 0x3A, 0xB4, 0x51, 0xC7, 0x53, 0x4E, 0x62, 0x39, 0x62, + 0x77, 0x53, 0xF6, 0x55, 0x55, 0x28, 0xE8, 0x2C, 0xFE, 0x06, 0x5F, 0x05, + 0xBD, 0xEE, 0xFB, 0xE7, 0xF4, 0xD3, 0x50, 0xD4, 0x7F, 0xD1, 0x66, 0xE5, + 0x16, 0xD2, 0xD0, 0x02, 0x37, 0xD0, 0xED, 0x15, 0x12, 0xEA, 0x6C, 0x31, + 0x29, 0xFD, 0xAA, 0x3F, 0x51, 0xF9, 0x75, 0x34, 0xE9, 0xFC, 0x3F, 0x26, + 0x2C, 0xFB, 0xEE, 0x11, 0x6C, 0xEF, 0xE5, 0xF9, 0x52, 0xFF, 0x9D, 0xF8, + 0x56, 0x16, 0x29, 0x05, 0xBD, 0x13, 0xF3, 0x04, 0x26, 0x0F, 0x96, 0x0B, + 0xD2, 0x0E, 0x91, 0x11, 0x64, 0x0A, 0x67, 0x01, 0x2D, 0xFF, 0x76, 0xEF, + 0x73, 0x01, 0x1B, 0xF1, 0x87, 0x0B, 0xA6, 0xF8, 0xDD, 0x0B, 0x9C, 0xFF, + 0x5C, 0x0C, 0x5D, 0x0A, 0x94, 0x0A, 0xF2, 0x08, 0x3F, 0x11, 0x2C, 0x0A, + 0x67, 0x1C, 0x8B, 0x10, 0x05, 0x20, 0x3A, 0x15, 0x8F, 0x1B, 0x3E, 0x16, + 0x7E, 0x0B, 0xF4, 0x0F, 0x4C, 0xF4, 0x77, 0x01, 0xAF, 0xE7, 0x5E, 0xF8, + 0xB0, 0xF1, 0x15, 0xFF, 0xE7, 0xF4, 0x86, 0x01, 0xFE, 0xEE, 0x7E, 0xFF, + 0x6E, 0xFC, 0xD8, 0x0D, 0xDC, 0xFE, 0xEF, 0x12, 0xC8, 0xE8, 0xF2, 0xF8, + 0x58, 0xE8, 0x06, 0xF6, 0xA9, 0xEF, 0x10, 0x00, 0x98, 0xE1, 0xA5, 0xED, + 0x73, 0xE2, 0x4E, 0xD7, 0xAA, 0xEF, 0xDE, 0xD0, 0x2C, 0xE6, 0x90, 0xC8, + 0xB3, 0xC4, 0xA4, 0xAD, 0x5D, 0xAD, 0xAE, 0xA0, 0x9A, 0xA3, 0xB0, 0x9F, + 0x67, 0x9E, 0x7B, 0x9C, 0x3F, 0xBC, 0xD2, 0xB3, 0x99, 0xED, 0xC2, 0xDF, + 0x94, 0x12, 0x55, 0x02, 0x39, 0x2E, 0xF4, 0x17, 0xAC, 0x32, 0xC3, 0x1A, + 0x67, 0x14, 0x72, 0xFC, 0x3F, 0xE5, 0x9D, 0xCF, 0xF9, 0xC1, 0x4C, 0xB1, + 0x10, 0xAE, 0x41, 0xA2, 0x33, 0xAD, 0x10, 0x9B, 0xCA, 0xB7, 0x6E, 0x98, + 0x04, 0xC2, 0xA6, 0xB1, 0x15, 0xD4, 0x10, 0xDF, 0xF3, 0xD6, 0xB5, 0xED, + 0xAE, 0xC9, 0xDB, 0xEA, 0x16, 0xC3, 0x73, 0xF1, 0xD4, 0xC0, 0xD0, 0xE8, + 0xA7, 0xC0, 0x0A, 0xD6, 0x69, 0xCB, 0x50, 0xD7, 0x4A, 0xE0, 0xC6, 0xE2, + 0x9D, 0xF6, 0xB4, 0xE8, 0xA5, 0x04, 0x45, 0xE6, 0x9F, 0x04, 0xD7, 0xEE, + 0x73, 0xF7, 0x3D, 0xFB, 0x0E, 0xE1, 0x20, 0xF3, 0x57, 0xD3, 0xDF, 0xED, + 0x93, 0xCB, 0xEC, 0xEC, 0x34, 0xC5, 0xB2, 0xE8, 0xD5, 0xCE, 0xB7, 0xE8, + 0x9E, 0xDE, 0x3A, 0xE3, 0x20, 0xEC, 0x15, 0xE9, 0x98, 0xF0, 0x1E, 0xFA, + 0x31, 0xF8, 0x6A, 0xFE, 0xC8, 0x08, 0x64, 0xF4, 0xA2, 0x09, 0x14, 0xEB, + 0x9E, 0xEE, 0x9C, 0xDA, 0xBC, 0xE2, 0x79, 0xDB, 0xDE, 0xEF, 0xF5, 0xEF, + 0x58, 0xE7, 0x00, 0xE5, 0xDE, 0xDE, 0x49, 0xD0, 0xB1, 0xFE, 0x23, 0xE0, + 0x3B, 0x11, 0x2B, 0xEC, 0x8D, 0xED, 0x4C, 0xCA, 0x47, 0xDC, 0x59, 0xBB, + 0x85, 0xEA, 0x59, 0xCD, 0x14, 0xE1, 0x6B, 0xC7, 0x96, 0xD8, 0x72, 0xB9, + 0x4F, 0xEE, 0x40, 0xD3, 0x08, 0xF2, 0xA1, 0xE3, 0xB1, 0xCD, 0x2A, 0xC4, + 0x7F, 0xAE, 0x0A, 0xA8, 0x56, 0xA1, 0x02, 0xA1, 0xDE, 0x9F, 0x43, 0xA5, + 0x39, 0xC7, 0xCB, 0xC4, 0xEF, 0x01, 0xBF, 0xF6, 0x81, 0x27, 0x3D, 0x1B, + 0xD6, 0x39, 0x01, 0x36, 0x0D, 0x39, 0x2C, 0x46, 0x57, 0x25, 0x53, 0x35, + 0x08, 0x06, 0x21, 0x07, 0x96, 0xEE, 0x58, 0xDB, 0x20, 0xEA, 0x5F, 0xC8, + 0x7B, 0xE4, 0x1E, 0xC7, 0xB1, 0xD9, 0x54, 0xCF, 0xD4, 0xE2, 0x3A, 0xEE, + 0x91, 0xF9, 0x1C, 0x12, 0x22, 0x0E, 0x0E, 0x29, 0x16, 0x1A, 0xEE, 0x2F, + 0x9E, 0x1E, 0xFD, 0x2D, 0xDF, 0x1C, 0x2C, 0x26, 0x19, 0x14, 0xDD, 0x11, + 0x38, 0x20, 0x2B, 0x0C, 0x7C, 0x38, 0x78, 0x08, 0x71, 0x33, 0xDC, 0xF7, + 0x4E, 0x29, 0xC0, 0xFA, 0xA8, 0x2B, 0x43, 0x0D, 0x81, 0x1D, 0x32, 0x16, + 0xEA, 0xFE, 0x38, 0x11, 0x99, 0xF4, 0xFB, 0x0E, 0x0A, 0xEC, 0x4D, 0x03, + 0x5C, 0xE1, 0xEB, 0xEF, 0x71, 0xEE, 0xAC, 0xEB, 0xD6, 0xF9, 0xA0, 0xF1, + 0x12, 0x03, 0x5D, 0xFD, 0x69, 0x06, 0x22, 0x08, 0x78, 0x00, 0xC4, 0x0B, + 0x0E, 0xF9, 0x4E, 0x08, 0x3F, 0xEF, 0x48, 0x01, 0xA3, 0xEA, 0x36, 0xF4, + 0x52, 0xF9, 0x38, 0xF4, 0x5F, 0x08, 0x27, 0xFA, 0x5D, 0x03, 0x83, 0xF4, + 0x5E, 0x00, 0x57, 0xFF, 0x14, 0x14, 0x87, 0x2A, 0x08, 0x18, 0x10, 0x33, + 0xFE, 0x0A, 0xED, 0x0F, 0x75, 0x22, 0x13, 0x11, 0x3C, 0x34, 0x36, 0x1B, + 0x62, 0x1F, 0xF0, 0x0B, 0x48, 0x12, 0xE7, 0x06, 0xED, 0x12, 0x0A, 0x09, + 0x45, 0x00, 0xBE, 0xF0, 0x05, 0xE3, 0x07, 0xCB, 0x5D, 0xC5, 0xB5, 0xB2, + 0xC6, 0xA6, 0x38, 0xAB, 0xEA, 0xB0, 0x24, 0xB6, 0x34, 0xE7, 0xDF, 0xDE, + 0x6B, 0x12, 0xF3, 0x15, 0xD9, 0x30, 0x8E, 0x3C, 0x6A, 0x54, 0x0B, 0x52, + 0x19, 0x55, 0xEA, 0x48, 0xBC, 0x2C, 0x5F, 0x24, 0x68, 0x06, 0x07, 0xF4, + 0x51, 0xE4, 0x89, 0xC2, 0x66, 0xC7, 0x28, 0xAC, 0x0F, 0xC0, 0x10, 0xB3, + 0xDB, 0xC6, 0x60, 0xC1, 0xFC, 0xDB, 0x54, 0xDC, 0xC2, 0xF2, 0xB5, 0x06, + 0xF9, 0xEC, 0x91, 0x1C, 0xEA, 0xE4, 0x7E, 0x1B, 0x27, 0xF6, 0x10, 0x21, + 0x96, 0x00, 0xD8, 0x1C, 0xB4, 0x09, 0x1C, 0x10, 0x93, 0x1E, 0xE2, 0x0D, + 0x47, 0x2D, 0x43, 0x13, 0x67, 0x2D, 0x14, 0x1C, 0x78, 0x28, 0x1D, 0x20, + 0x86, 0x29, 0xA0, 0x1C, 0x87, 0x1E, 0xFC, 0x05, 0x14, 0x18, 0xA7, 0xF6, + 0x89, 0x18, 0xEB, 0xFB, 0x63, 0x0D, 0x1C, 0x07, 0x8F, 0x06, 0xAB, 0x10, + 0x60, 0x06, 0x3B, 0x0B, 0x0E, 0x14, 0x1E, 0x16, 0x9E, 0x24, 0x33, 0x28, + 0x8A, 0x26, 0xD5, 0x27, 0x20, 0x17, 0x8A, 0x1F, 0x47, 0x0D, 0x06, 0x1A, + 0x7A, 0x0B, 0x50, 0x0B, 0x71, 0x0D, 0x77, 0x01, 0xCF, 0x1E, 0xD4, 0x10, + 0x51, 0x1E, 0x24, 0x17, 0x87, 0x19, 0x8E, 0x1C, 0x9F, 0x39, 0x98, 0x3B, + 0xF8, 0x46, 0x83, 0x49, 0x79, 0x22, 0x35, 0x30, 0x4C, 0x0E, 0xFF, 0x29, + 0xB5, 0x21, 0x78, 0x43, 0xA8, 0x2D, 0xA4, 0x3E, 0xAA, 0x24, 0x2A, 0x24, + 0xE7, 0x2A, 0xCE, 0x2B, 0xEB, 0x2B, 0xC7, 0x2A, 0x0A, 0x06, 0x6B, 0xFE, + 0x9B, 0xDE, 0xC6, 0xD8, 0xD9, 0xC9, 0x7B, 0xC0, 0x5E, 0xCC, 0x15, 0xB9, + 0x0F, 0xF4, 0x1D, 0xD9, 0x22, 0x22, 0x0F, 0x05, 0x4E, 0x3B, 0x0E, 0x2A, + 0x45, 0x48, 0xD7, 0x4D, 0x8C, 0x4C, 0x1D, 0x5F, 0x20, 0x43, 0x64, 0x59, + 0x44, 0x25, 0xA5, 0x43, 0x02, 0x03, 0xAC, 0x23, 0xDF, 0xF7, 0x55, 0x08, + 0x77, 0xF8, 0xB1, 0xF2, 0xE9, 0xF4, 0x83, 0xEB, 0xC4, 0x04, 0xDB, 0x01, + 0x33, 0x2C, 0x67, 0x2F, 0x63, 0x43, 0xF7, 0x55, 0x25, 0x46, 0x91, 0x65, + 0xA1, 0x43, 0xAA, 0x61, 0x7C, 0x42, 0x36, 0x57, 0xB3, 0x45, 0xF2, 0x4A, + 0x19, 0x47, 0xC2, 0x35, 0xDE, 0x50, 0xC5, 0x35, 0xB5, 0x5E, 0x4F, 0x4B, + 0xFF, 0x5B, 0xEB, 0x4B, 0x44, 0x53, 0x9E, 0x42, 0x83, 0x49, 0xAC, 0x3E, + 0xA9, 0x33, 0xCF, 0x2F, 0xEC, 0x29, 0x87, 0x26, 0xE9, 0x2B, 0x05, 0x28, + 0x04, 0x23, 0xF7, 0x21, 0x07, 0x0C, 0x5E, 0x0B, 0x25, 0x07, 0x99, 0x06, + 0x15, 0x0A, 0xA3, 0x1A, 0x79, 0xF9, 0xE4, 0x1D, 0x9B, 0xEE, 0x2C, 0x10, + 0xBA, 0xE6, 0xB4, 0x09, 0xD3, 0xD5, 0xE6, 0x03, 0x5A, 0xCA, 0x0F, 0xF3, + 0x87, 0xD0, 0xBA, 0xF6, 0xE2, 0xD2, 0x97, 0x02, 0xD8, 0xC4, 0x1F, 0xF2, + 0x36, 0xD6, 0x06, 0xF3, 0x19, 0xFF, 0x8E, 0x0E, 0xED, 0xF8, 0x6C, 0x08, + 0x5E, 0xE8, 0xAA, 0xFC, 0x3E, 0x0D, 0xE2, 0x15, 0x9B, 0x2A, 0x43, 0x26, + 0x4F, 0x22, 0xF4, 0x24, 0xDC, 0x2B, 0x57, 0x34, 0xE7, 0x2C, 0xFC, 0x31, + 0xB6, 0x0C, 0x95, 0x06, 0xAF, 0xEE, 0xA3, 0xDC, 0x31, 0xD8, 0x1E, 0xC4, + 0x3F, 0xC7, 0x09, 0xBD, 0x66, 0xD7, 0x05, 0xDD, 0x3C, 0x0C, 0x34, 0x18, + 0x7A, 0x3E, 0xB6, 0x3E, 0xCA, 0x5C, 0x17, 0x53, 0x6E, 0x61, 0x15, 0x5C, + 0xB6, 0x48, 0x4A, 0x4D, 0x8A, 0x21, 0xE8, 0x2C, 0xCA, 0x00, 0x48, 0x02, + 0xBB, 0xE7, 0xA9, 0xDE, 0x73, 0xC3, 0x07, 0xC5, 0xC9, 0xB2, 0x97, 0xB7, + 0xB9, 0xC8, 0x3B, 0xC5, 0x3B, 0xE6, 0xA0, 0xE6, 0xA3, 0xEE, 0x17, 0xF4, + 0x68, 0xE9, 0xA8, 0xEF, 0x78, 0xE3, 0x06, 0xF4, 0x1E, 0xD6, 0x16, 0xF4, + 0x62, 0xCD, 0x91, 0xF1, 0x8D, 0xD5, 0xFC, 0xF7, 0x3C, 0xE5, 0xF8, 0xF5, + 0x90, 0xF8, 0x52, 0xF7, 0x2C, 0x06, 0xB5, 0x06, 0x89, 0x08, 0xD2, 0x16, + 0x14, 0x0C, 0xDC, 0x20, 0xDB, 0x0A, 0x70, 0x1E, 0xE9, 0x0A, 0x78, 0x17, + 0x5E, 0x0E, 0x51, 0x0E, 0x74, 0x0F, 0xF0, 0x05, 0xD1, 0x0D, 0x41, 0xFA, + 0x50, 0x15, 0x39, 0xFD, 0xBC, 0x26, 0x05, 0x19, 0x4D, 0x32, 0x0F, 0x29, + 0x70, 0x3A, 0x68, 0x22, 0x5E, 0x3E, 0x82, 0x1F, 0xA4, 0x30, 0x99, 0x1F, + 0x0B, 0x1F, 0xEC, 0x19, 0xFB, 0x20, 0xE3, 0x1A, 0x29, 0x12, 0xC6, 0x08, + 0x2D, 0xF4, 0x55, 0xF0, 0x2A, 0xF8, 0xCC, 0x01, 0x39, 0x01, 0x1A, 0x16, + 0x10, 0xED, 0xEF, 0xFF, 0xA0, 0xE9, 0x31, 0xF5, 0x27, 0x00, 0x59, 0x12, + 0xC7, 0x03, 0x88, 0x1B, 0x76, 0xFA, 0xEA, 0x0B, 0x56, 0xFA, 0x87, 0x07, + 0xCC, 0xF1, 0xD8, 0xFB, 0x19, 0xD2, 0x4F, 0xD5, 0x72, 0xB2, 0x72, 0xB7, + 0xAB, 0xA0, 0xEF, 0xB1, 0x3C, 0xA3, 0xCD, 0xBB, 0x2B, 0xC6, 0x39, 0xD7, + 0xC8, 0xFC, 0x77, 0xFE, 0xD1, 0x1F, 0xAE, 0x21, 0xCD, 0x27, 0x53, 0x34, + 0x9F, 0x22, 0x46, 0x37, 0xA3, 0x0B, 0x1E, 0x28, 0x87, 0xE9, 0xBB, 0xFF, + 0x7F, 0xD2, 0x5C, 0xD2, 0xC0, 0xCC, 0xD5, 0xBD, 0xFD, 0xC5, 0x9E, 0xBA, + 0x89, 0xBF, 0x5C, 0xC3, 0x4B, 0xC4, 0x8E, 0xD2, 0x1A, 0xDB, 0xF0, 0xE1, + 0xB3, 0xE6, 0x9D, 0xE8, 0xA6, 0xDA, 0x75, 0xE0, 0x75, 0xD9, 0x38, 0xD8, + 0x35, 0xDD, 0x88, 0xD5, 0x40, 0xE1, 0x0F, 0xDE, 0x43, 0xF6, 0xFC, 0xF6, + 0xCA, 0x0A, 0xA3, 0x0C, 0x9D, 0x09, 0xCE, 0x0F, 0xE1, 0x03, 0xF2, 0x0B, + 0x2F, 0x0B, 0x57, 0x0D, 0xD5, 0x02, 0xF0, 0x05, 0x33, 0xF3, 0x35, 0xFD, + 0xEC, 0xF3, 0x06, 0xFC, 0x7D, 0xED, 0xFC, 0xF5, 0x50, 0xE6, 0x57, 0xF6, + 0x35, 0xEF, 0x04, 0xF6, 0xC3, 0x05, 0x5E, 0xF8, 0x7E, 0x17, 0xF8, 0xFB, + 0xAC, 0x19, 0x5C, 0xF8, 0x2B, 0x0D, 0xF7, 0xFA, 0xC5, 0xF1, 0x05, 0xF7, + 0x1D, 0xCD, 0xE8, 0xD5, 0xD2, 0xC3, 0xCD, 0xBC, 0xA5, 0xD7, 0x5B, 0xC4, + 0xF8, 0xD7, 0x4D, 0xC6, 0xFB, 0xD1, 0x47, 0xC5, 0x29, 0xE8, 0x4B, 0xE0, + 0x93, 0xE6, 0xDB, 0xEC, 0x45, 0xC1, 0x4C, 0xD4, 0x5C, 0xC9, 0x9E, 0xD3, + 0x93, 0xE2, 0x4C, 0xDA, 0x49, 0xD9, 0xDC, 0xCB, 0x9C, 0xD4, 0x04, 0xCC, + 0xC9, 0xE3, 0x00, 0xD9, 0xE1, 0xE7, 0x05, 0xD7, 0xBC, 0xD4, 0xD0, 0xC4, + 0xA6, 0xC4, 0x03, 0xBA, 0xD6, 0xB2, 0x40, 0xB9, 0xB6, 0xAD, 0xC7, 0xC5, + 0x5A, 0xD5, 0x5C, 0xEB, 0xC6, 0x04, 0x61, 0x14, 0x16, 0x1D, 0x0C, 0x2E, + 0x5C, 0x34, 0x74, 0x3B, 0xD3, 0x44, 0xDF, 0x39, 0xFB, 0x2E, 0xC8, 0x1C, + 0x36, 0x04, 0x60, 0xEF, 0x24, 0xEA, 0xAC, 0xD2, 0x39, 0xD3, 0x34, 0xC4, + 0x10, 0xB9, 0x5D, 0xBE, 0x22, 0xB8, 0xC4, 0xCB, 0x63, 0xCB, 0x65, 0xDD, + 0x83, 0xE5, 0xC3, 0xEF, 0x31, 0xF9, 0x9D, 0x00, 0x0C, 0xF7, 0xEA, 0x07, + 0x54, 0xE2, 0xD1, 0x01, 0xCB, 0xCE, 0xB8, 0xED, 0xDF, 0xD9, 0xA3, 0xE0, + 0x3B, 0xF5, 0x78, 0xDF, 0xA9, 0xFD, 0xBC, 0xDF, 0xB1, 0xF5, 0xD5, 0xE3, + 0x0D, 0xF3, 0xE9, 0xEF, 0xB6, 0xE5, 0x2B, 0xE7, 0xA8, 0xD4, 0xB8, 0xD2, + 0xEB, 0xE3, 0x97, 0xD9, 0xE3, 0xDF, 0xF4, 0xD5, 0x7D, 0xCF, 0x0C, 0xD5, + 0x22, 0xD8, 0xB9, 0xE2, 0xBF, 0xE5, 0x20, 0xE2, 0x24, 0xF1, 0x9E, 0xE7, + 0xC2, 0xFA, 0x30, 0xF8, 0xE3, 0xFC, 0xF1, 0xF4, 0x6C, 0xFB, 0x8A, 0xE1, + 0xDD, 0xFD, 0xFE, 0xD4, 0x09, 0x03, 0x49, 0xD1, 0x19, 0x11, 0x96, 0xDE, + 0xAD, 0x17, 0xEE, 0xF2, 0x08, 0x09, 0x31, 0xF8, 0xF3, 0x0B, 0x53, 0x07, + 0xDE, 0x20, 0xBB, 0x22, 0x6D, 0x11, 0xFF, 0x15, 0xD1, 0x02, 0x86, 0x0B, + 0x9C, 0x18, 0xE9, 0x2B, 0xFD, 0x1E, 0x67, 0x2E, 0x8C, 0x18, 0x1E, 0x0C, + 0x19, 0x2E, 0x19, 0x03, 0xFC, 0x27, 0x8F, 0xF1, 0x3E, 0xF5, 0xB3, 0xCA, + 0x17, 0xD6, 0x90, 0xBD, 0xB7, 0xC6, 0x4C, 0xB9, 0xD0, 0xB2, 0xD0, 0xB8, + 0x70, 0xB7, 0x6F, 0xD1, 0x87, 0xE6, 0x86, 0x02, 0x6D, 0x1A, 0x75, 0x35, + 0x8E, 0x2B, 0x15, 0x49, 0x0D, 0x34, 0xF8, 0x49, 0x15, 0x2C, 0x37, 0x37, + 0x9E, 0xFF, 0xDE, 0x07, 0xD9, 0xDC, 0x81, 0xDB, 0x3B, 0xCF, 0x7E, 0xBC, + 0x9A, 0xBE, 0x2D, 0xAF, 0x83, 0xC1, 0xAC, 0xC0, 0x72, 0xE4, 0x12, 0xE0, + 0x3D, 0x01, 0x43, 0xF6, 0x2E, 0x11, 0x62, 0x05, 0xEE, 0x22, 0x39, 0x0E, + 0xAC, 0x37, 0x9B, 0x21, 0xA0, 0x37, 0x2B, 0x2B, 0xF4, 0x28, 0x08, 0x1C, + 0x97, 0x2F, 0x33, 0x1B, 0xBD, 0x37, 0x8B, 0x20, 0x9B, 0x38, 0xBE, 0x23, + 0x28, 0x47, 0x11, 0x33, 0x8B, 0x49, 0x28, 0x33, 0xA7, 0x35, 0x24, 0x23, + 0x5E, 0x30, 0x7E, 0x2B, 0xA5, 0x21, 0x0A, 0x2C, 0xFE, 0x02, 0x59, 0x1B, + 0x23, 0xEE, 0x11, 0x0D, 0x71, 0xEA, 0x3E, 0xFE, 0x85, 0xFE, 0x58, 0x04, + 0xCE, 0x0F, 0xD2, 0x1A, 0xA5, 0x09, 0xC8, 0x22, 0x33, 0xF6, 0x92, 0x19, + 0xF3, 0xE7, 0xF0, 0x13, 0xA8, 0xDF, 0x3B, 0x03, 0xFD, 0xE2, 0x90, 0xE9, + 0x04, 0xF2, 0x9D, 0xE6, 0xDE, 0xF3, 0xE2, 0xE1, 0xA4, 0xFF, 0xB5, 0xD9, + 0xD0, 0x2D, 0xB5, 0xF5, 0xF9, 0x30, 0x01, 0x01, 0x2A, 0x0C, 0x93, 0xF3, + 0x95, 0x15, 0x04, 0x0F, 0x57, 0x2F, 0xE6, 0x2B, 0xDB, 0x2A, 0x83, 0x18, + 0x24, 0x1F, 0x1B, 0xFC, 0x0C, 0x18, 0x1A, 0xF4, 0xF9, 0xEE, 0x1C, 0xD7, + 0x02, 0xB8, 0x9A, 0xAD, 0x43, 0xA8, 0x0C, 0xA6, 0x37, 0xA7, 0xE7, 0xA8, + 0xF7, 0xB1, 0xF4, 0xB3, 0x5E, 0xE7, 0x3E, 0xE0, 0xF9, 0x24, 0x78, 0x17, + 0x1B, 0x39, 0x69, 0x30, 0x3E, 0x3F, 0x99, 0x32, 0x9E, 0x42, 0xEC, 0x2A, + 0x07, 0x1A, 0x1B, 0x0B, 0xE5, 0xE0, 0x58, 0xE9, 0x82, 0xC7, 0x9A, 0xDE, + 0xE0, 0xB8, 0xF0, 0xD0, 0x42, 0xB1, 0xEA, 0xBC, 0x45, 0xC9, 0xA5, 0xBD, + 0xBE, 0xE6, 0xE6, 0xD1, 0xB8, 0xF3, 0x98, 0xF1, 0x3E, 0xF8, 0xDF, 0x09, + 0xEA, 0xF2, 0xE9, 0x09, 0x37, 0xE8, 0x71, 0xFB, 0xFD, 0xEB, 0xE5, 0xEF, + 0x9F, 0xFF, 0xB3, 0xF4, 0xD6, 0xFE, 0xDC, 0xF8, 0x98, 0xF7, 0x86, 0x01, + 0x19, 0x03, 0x15, 0x14, 0x3E, 0x11, 0xDE, 0x19, 0x0C, 0x0F, 0xE7, 0x0E, + 0x15, 0x09, 0x20, 0x07, 0xB0, 0x08, 0x20, 0x04, 0x35, 0xFD, 0x08, 0xFA, + 0xD0, 0xF0, 0xEB, 0xF3, 0xA7, 0xF1, 0x38, 0xF4, 0x69, 0x02, 0x1B, 0x07, + 0x9A, 0x0D, 0xB6, 0x1F, 0x9E, 0x0E, 0xCF, 0x29, 0x94, 0x15, 0xAD, 0x27, + 0x07, 0x20, 0x99, 0x21, 0x85, 0x0C, 0xF6, 0x07, 0xCE, 0xF8, 0x98, 0xF1, + 0xA7, 0x03, 0x07, 0xF8, 0x58, 0x01, 0x08, 0xF1, 0x34, 0xF9, 0xEC, 0xE0, + 0xA3, 0x12, 0x16, 0xFD, 0x7F, 0x1C, 0xE2, 0x1E, 0x03, 0xFE, 0x33, 0x13, + 0x1B, 0x02, 0x94, 0x11, 0xE9, 0x2F, 0x6E, 0x2E, 0x8F, 0x3F, 0xDD, 0x2D, + 0xD4, 0x37, 0xC1, 0x14, 0x94, 0x44, 0x07, 0x1A, 0x20, 0x32, 0x6A, 0x16, + 0x9F, 0xFC, 0xCB, 0xF5, 0x7F, 0xEC, 0xD9, 0xEB, 0x4E, 0xEC, 0x58, 0xE8, + 0xD9, 0xE4, 0xCE, 0xDF, 0xFD, 0xFE, 0x71, 0xFC, 0xD4, 0x32, 0x71, 0x35, + 0x9E, 0x4D, 0x35, 0x55, 0x99, 0x58, 0x66, 0x5D, 0x05, 0x63, 0x31, 0x5D, + 0xDD, 0x4D, 0xE9, 0x46, 0x0B, 0x27, 0x6D, 0x2A, 0xE4, 0x07, 0x79, 0x10, + 0x41, 0xEC, 0xDA, 0xFE, 0xE6, 0xD0, 0x8F, 0xF5, 0x57, 0xC9, 0xBF, 0xEB, + 0x0D, 0xE2, 0x8A, 0xEE, 0xCD, 0xF8, 0xA7, 0xFA, 0x13, 0x01, 0x2A, 0x05, + 0x51, 0x0D, 0x2B, 0x0E, 0xC3, 0x0B, 0x00, 0x09, 0x16, 0xF9, 0x9A, 0xF2, + 0xEB, 0xFF, 0xF2, 0xF3, 0x6A, 0x13, 0xA5, 0x0B, 0x0F, 0x13, 0xCA, 0x10, + 0x6E, 0x14, 0x86, 0x08, 0x8E, 0x1D, 0x10, 0x05, 0xE2, 0x1E, 0x71, 0x0B, + 0x80, 0x13, 0x4E, 0x11, 0x96, 0x0E, 0x7D, 0x17, 0x10, 0x0E, 0xBB, 0x19, + 0xB4, 0x0F, 0x3E, 0x15, 0x8B, 0x1C, 0x48, 0x11, 0x82, 0x22, 0x3E, 0x10, + 0x66, 0x1E, 0x18, 0x1A, 0xFB, 0x1E, 0x35, 0x2A, 0x50, 0x25, 0x3B, 0x35, + 0xE2, 0x2C, 0x1C, 0x3B, 0xFE, 0x21, 0x34, 0x2D, 0xA4, 0xFF, 0x5F, 0x0D, + 0xEE, 0xF8, 0x72, 0x0E, 0x65, 0x04, 0x0E, 0x23, 0x28, 0xF5, 0xA9, 0x18, + 0x21, 0xF9, 0x64, 0x15, 0x1F, 0x1E, 0x59, 0x2F, 0xCC, 0x18, 0xC9, 0x20, + 0x9A, 0xFE, 0xE9, 0xFF, 0xBC, 0x09, 0x50, 0x0A, 0x26, 0x0E, 0x21, 0x16, + 0x35, 0xF4, 0xFD, 0x05, 0x22, 0xF1, 0x15, 0xFF, 0x6A, 0x07, 0x2D, 0x0B, + 0xF7, 0xF7, 0xBF, 0xF8, 0xEC, 0xD8, 0x06, 0xD7, 0xDE, 0xC9, 0x7E, 0xC9, + 0x95, 0xAF, 0x2F, 0xBE, 0xFF, 0xAA, 0xE9, 0xC7, 0x0C, 0xE2, 0xB4, 0xFB, + 0x58, 0x21, 0xBF, 0x28, 0x86, 0x43, 0xAA, 0x36, 0xE1, 0x5A, 0x13, 0x41, + 0xC0, 0x5C, 0x5C, 0x48, 0x45, 0x37, 0x32, 0x3D, 0x88, 0x02, 0x94, 0x22, + 0x90, 0xE2, 0x21, 0x07, 0xDF, 0xCD, 0xDF, 0xE4, 0x75, 0xC9, 0x50, 0xC6, + 0xE6, 0xDE, 0x53, 0xCA, 0x80, 0xE9, 0xDE, 0xEA, 0x02, 0xE1, 0x6B, 0x07, + 0xFE, 0xEA, 0x87, 0x19, 0x67, 0xFE, 0x64, 0x1F, 0xA4, 0xF2, 0xE8, 0x10, + 0x20, 0xE4, 0xE1, 0x02, 0x76, 0xF2, 0xEE, 0x00, 0x81, 0x01, 0x6F, 0xFF, + 0x8E, 0x09, 0x99, 0xFD, 0x39, 0x13, 0xC9, 0xF9, 0x6A, 0x1F, 0x68, 0x01, + 0x0F, 0x1D, 0xAE, 0x02, 0x69, 0x11, 0xB5, 0xF5, 0xAE, 0x15, 0xFC, 0xFA, + 0xDF, 0x19, 0x87, 0x0F, 0xC4, 0x17, 0x95, 0x1E, 0x1B, 0x0D, 0xE1, 0x1F, + 0x2A, 0x0C, 0xB1, 0x29, 0x91, 0x17, 0x36, 0x2E, 0x3D, 0x24, 0xE6, 0x23, + 0x80, 0x2E, 0x7A, 0x23, 0x31, 0x29, 0xBA, 0x25, 0x43, 0x15, 0x54, 0x16, + 0x30, 0x10, 0x43, 0x0D, 0x51, 0x21, 0xFC, 0x16, 0xB6, 0x19, 0x20, 0x0A, + 0x36, 0x04, 0xE8, 0xFD, 0xB0, 0x19, 0xAC, 0x2C, 0x2A, 0x28, 0x4B, 0x4F, + 0x6A, 0x09, 0xD8, 0x30, 0xC6, 0x02, 0x06, 0x1F, 0x0F, 0x13, 0x5B, 0x1F, + 0x3E, 0x10, 0x62, 0x05, 0xDE, 0x0D, 0x00, 0xF4, 0x47, 0x18, 0x93, 0xFC, + 0x48, 0x0D, 0x07, 0xF5, 0x3C, 0xE8, 0x33, 0xD8, 0x1D, 0xD3, 0x09, 0xC6, + 0x6C, 0xD2, 0x7D, 0xC5, 0xCF, 0xD0, 0x3F, 0xCC, 0xBD, 0xE6, 0xA1, 0xEE, + 0x72, 0x1C, 0x14, 0x2F, 0x3A, 0x36, 0x5A, 0x53, 0xCD, 0x3A, 0x0F, 0x5A, + 0x28, 0x4D, 0x50, 0x5F, 0x0D, 0x45, 0x18, 0x52, 0x37, 0x20, 0x9F, 0x34, + 0xE5, 0x00, 0x98, 0x16, 0xD2, 0xE7, 0x55, 0xFE, 0x1B, 0xD3, 0x3D, 0xEA, + 0xAC, 0xDC, 0xA4, 0xE6, 0xF6, 0x05, 0x49, 0xFC, 0x82, 0x1C, 0x73, 0x09, + 0x23, 0x1E, 0x7A, 0x09, 0x5E, 0x25, 0x4F, 0x15, 0xF8, 0x21, 0x72, 0x18, + 0x27, 0x0E, 0xDD, 0x0F, 0x41, 0x00, 0x4D, 0x13, 0xF6, 0x01, 0x5C, 0x18, + 0x0D, 0x13, 0x32, 0x13, 0x42, 0x28, 0xFE, 0x07, 0x5C, 0x2E, 0x68, 0x04, + 0xA8, 0x14, 0x2B, 0x08, 0x96, 0xE7, 0x40, 0xF8, 0x9C, 0xD6, 0x66, 0xE6, + 0xC4, 0xDD, 0x1C, 0xE6, 0x0F, 0xDF, 0xC1, 0xE5, 0x0D, 0xDF, 0x54, 0xE1, + 0x48, 0xEF, 0x1E, 0xE8, 0xE8, 0xFC, 0x5D, 0xF5, 0x13, 0xF8, 0xC9, 0xF8, + 0x23, 0xF3, 0xD8, 0x02, 0x14, 0xED, 0x91, 0x0B, 0x4E, 0xD6, 0x4B, 0xF8, + 0x67, 0xC1, 0xA8, 0xDF, 0x8E, 0xCD, 0xD3, 0xE2, 0x55, 0xE7, 0x70, 0xF1, + 0xB2, 0xEA, 0x94, 0xEC, 0xAE, 0xF5, 0x3D, 0xF4, 0x2E, 0x1B, 0xC1, 0x17, + 0xAD, 0x1F, 0x2D, 0x18, 0x0F, 0x16, 0x17, 0xFE, 0x2D, 0x2F, 0xB4, 0x06, + 0x80, 0x36, 0xBF, 0x15, 0x99, 0x19, 0xBE, 0x0D, 0x7B, 0x0B, 0x77, 0x08, + 0x8A, 0x0C, 0xDD, 0xFF, 0x67, 0xF0, 0xCC, 0xD5, 0xB4, 0xC3, 0x17, 0xAD, + 0x6F, 0xA9, 0x47, 0xA4, 0xA3, 0x9E, 0x40, 0xA5, 0xE2, 0xB4, 0x6F, 0xB9, + 0xAD, 0xE8, 0xE1, 0xDD, 0x81, 0x0C, 0x1E, 0xF3, 0x35, 0x1E, 0xB0, 0xFA, + 0xC2, 0x26, 0xCA, 0x05, 0x76, 0x0E, 0xCB, 0x05, 0xD8, 0xDD, 0x4C, 0xEF, + 0x7A, 0xC1, 0x1E, 0xD4, 0x1E, 0xB4, 0x3A, 0xB8, 0xF7, 0xA0, 0xDF, 0xA3, + 0x45, 0x99, 0xB8, 0x9E, 0x5E, 0xA4, 0xFA, 0xA3, 0x38, 0xB9, 0x15, 0xB4, + 0x74, 0xC7, 0x2E, 0xC2, 0x26, 0xCA, 0x87, 0xC8, 0x37, 0xC6, 0x14, 0xCC, + 0xB3, 0xC5, 0x79, 0xD2, 0x1E, 0xC6, 0xB4, 0xD7, 0x80, 0xC9, 0x9E, 0xDF, + 0xB9, 0xDF, 0xE0, 0xF0, 0xAB, 0xF4, 0x49, 0xFD, 0xD0, 0xF5, 0xFA, 0xF6, + 0xA0, 0xF4, 0x36, 0xE8, 0x17, 0xF1, 0x85, 0xD7, 0xA1, 0xE1, 0x32, 0xC9, + 0x1E, 0xD2, 0x99, 0xD0, 0x45, 0xCD, 0xD7, 0xE8, 0xAD, 0xCF, 0x18, 0xF0, + 0x8B, 0xE3, 0x36, 0xF1, 0x21, 0xFE, 0xE4, 0xF7, 0x46, 0x09, 0x08, 0xF6, + 0x91, 0x0C, 0xED, 0xEE, 0x9C, 0x0B, 0x7C, 0xE8, 0xBE, 0xF5, 0x07, 0xDD, + 0x03, 0xD3, 0xEB, 0xC3, 0xC8, 0xC7, 0xA4, 0xB5, 0x6C, 0xD9, 0x3E, 0xBB, + 0x07, 0xE2, 0xFD, 0xC0, 0x8F, 0xDD, 0xA5, 0xCF, 0x60, 0xFA, 0x90, 0xFE, + 0xD2, 0x10, 0x98, 0x18, 0x7D, 0xFE, 0x2F, 0x05, 0xFB, 0xFA, 0x46, 0x01, + 0x57, 0xFD, 0x4A, 0x01, 0x12, 0xEE, 0x3D, 0xF0, 0xF1, 0xEA, 0x17, 0xE8, + 0x54, 0xF9, 0xA2, 0xEA, 0x4A, 0xFC, 0x99, 0xE1, 0xD3, 0xE2, 0xB9, 0xC4, + 0x6C, 0xCA, 0x37, 0xB0, 0xDF, 0xBB, 0x4E, 0xB2, 0x19, 0xBE, 0xAC, 0xC7, + 0xAE, 0xDB, 0x12, 0xE0, 0x0D, 0x01, 0xCC, 0xF5, 0x53, 0x20, 0xA7, 0x1A, + 0xE9, 0x27, 0xDE, 0x30, 0xE7, 0x1B, 0xA5, 0x2D, 0xFB, 0x09, 0x91, 0x26, + 0xC0, 0xF0, 0x20, 0x09, 0x2F, 0xD8, 0x79, 0xE4, 0x61, 0xC6, 0x07, 0xD5, + 0x11, 0xC4, 0x8C, 0xD6, 0xBF, 0xCF, 0x78, 0xD7, 0x19, 0xE1, 0x70, 0xD8, + 0xEF, 0xF3, 0xB5, 0xE8, 0xE6, 0xFB, 0x2B, 0xFD, 0x60, 0xFA, 0xC3, 0x10, + 0x6C, 0xFB, 0x48, 0x20, 0x2E, 0x0A, 0x3B, 0x29, 0x65, 0x1E, 0x99, 0x2A, + 0xE9, 0x28, 0x95, 0x1E, 0x14, 0x33, 0xD7, 0x12, 0x01, 0x37, 0x58, 0x0C, + 0xC3, 0x2C, 0x98, 0x07, 0x15, 0x1C, 0x07, 0x05, 0x94, 0x01, 0xA3, 0xFB, + 0x4A, 0xF1, 0x3C, 0xEE, 0x8E, 0x00, 0x5F, 0xF4, 0xC8, 0x0A, 0x3A, 0xFA, + 0x33, 0xFB, 0x18, 0xE9, 0x53, 0xFD, 0xE1, 0xED, 0xF4, 0x0C, 0xF6, 0x00, + 0xE4, 0x0F, 0x36, 0xFD, 0x22, 0x0F, 0x2D, 0xF0, 0x49, 0xFA, 0x71, 0xDF, + 0xC5, 0xCA, 0x7B, 0xC6, 0x95, 0xAC, 0x9B, 0xB3, 0x64, 0xBA, 0xE1, 0xC2, + 0xCA, 0xD2, 0x3F, 0xE0, 0xFF, 0xCF, 0xC4, 0xDB, 0xE1, 0xDC, 0x43, 0xE5, + 0x24, 0xFD, 0x35, 0xFF, 0x49, 0xF2, 0x4D, 0xED, 0x20, 0xE8, 0xD3, 0xE0, + 0xBE, 0xFA, 0x66, 0xF8, 0xA8, 0xF9, 0xAE, 0x03, 0xD5, 0xFB, 0xCA, 0x0B, + 0x75, 0x1A, 0x40, 0x22, 0x63, 0x2A, 0xA9, 0x1B, 0x5C, 0x16, 0x10, 0x02, + 0x49, 0xFA, 0x7D, 0xFC, 0xCD, 0xE8, 0x81, 0xF5, 0x07, 0xED, 0x2C, 0xEC, + 0x54, 0x0C, 0xF8, 0xF0, 0x8A, 0x31, 0x3D, 0x00, 0x1B, 0x4C, 0x1E, 0x21, + 0xCF, 0x5D, 0x6C, 0x48, 0xBC, 0x63, 0xAA, 0x54, 0xED, 0x52, 0xAC, 0x44, + 0xD7, 0x2D, 0x41, 0x28, 0x75, 0x0F, 0x9D, 0x06, 0x78, 0xF4, 0xCB, 0xE5, + 0x83, 0xD6, 0xFF, 0xCE, 0xC6, 0xCD, 0xD8, 0xD0, 0x00, 0xD5, 0xAF, 0xE1, + 0x9E, 0xD4, 0x01, 0xF4, 0x99, 0xD2, 0x36, 0x0A, 0x87, 0xDA, 0x02, 0x19, + 0xD8, 0xDD, 0xCC, 0x10, 0xD9, 0xD9, 0x64, 0x03, 0xB1, 0xE8, 0x87, 0x07, + 0x01, 0xF7, 0x56, 0x07, 0x9F, 0xF7, 0xE9, 0x02, 0xE0, 0xFD, 0xBC, 0xFF, + 0xB6, 0xFE, 0x7F, 0xEF, 0x33, 0xF8, 0xB3, 0xE0, 0xFD, 0xEA, 0xD0, 0xDE, + 0xA0, 0xE7, 0xD6, 0xEE, 0x5E, 0xFD, 0xA4, 0x09, 0xB4, 0x15, 0xCD, 0x1E, + 0xF4, 0x1B, 0xC6, 0x1C, 0xFE, 0x27, 0xD2, 0x1E, 0x79, 0x3E, 0xB1, 0x35, + 0x44, 0x3D, 0x76, 0x35, 0xDE, 0x37, 0x91, 0x30, 0x8A, 0x3C, 0xF4, 0x36, + 0x1E, 0x30, 0xB2, 0x26, 0xDC, 0x23, 0x0F, 0x10, 0xB1, 0x31, 0x6C, 0x0F, + 0x09, 0x38, 0xCB, 0x1B, 0xC7, 0x22, 0xA2, 0x20, 0xDD, 0x1F, 0x44, 0x2C, + 0x9B, 0x3C, 0x70, 0x4D, 0x9E, 0x3D, 0x87, 0x4E, 0x7A, 0x2B, 0xDC, 0x2C, + 0x3A, 0x33, 0x4D, 0x25, 0xC5, 0x30, 0xF4, 0x2B, 0xF6, 0x18, 0x34, 0x1D, + 0x54, 0x19, 0xE8, 0x11, 0x27, 0x23, 0x2A, 0x16, 0xFB, 0x0C, 0xD8, 0xFF, + 0x68, 0xF1, 0xB9, 0xDC, 0x0A, 0xE5, 0x37, 0xD1, 0xA5, 0xD6, 0x98, 0xCE, + 0x31, 0xD8, 0xCB, 0xDE, 0xBB, 0xF2, 0x87, 0x02, 0x01, 0x1C, 0x31, 0x29, + 0xB3, 0x4A, 0xA1, 0x4E, 0x56, 0x63, 0x70, 0x60, 0xEA, 0x5A, 0x70, 0x56, + 0x88, 0x3E, 0xE3, 0x36, 0x1E, 0x1F, 0x9A, 0x19, 0x51, 0x03, 0x45, 0x0D, + 0xA4, 0xF0, 0x6C, 0xFB, 0x15, 0xF8, 0xA8, 0xE6, 0xE3, 0x14, 0x48, 0xE1, + 0xB5, 0x27, 0xEB, 0xEC, 0xD0, 0x26, 0xCD, 0x05, 0xE8, 0x29, 0x8A, 0x2F, + 0xF4, 0x30, 0xE2, 0x56, 0x32, 0x32, 0xE8, 0x5F, 0x45, 0x33, 0x40, 0x56, + 0x6C, 0x3F, 0x87, 0x49, 0x59, 0x4C, 0x38, 0x38, 0xAD, 0x4D, 0x81, 0x26, + 0x16, 0x4A, 0x19, 0x21, 0xA8, 0x3B, 0x4F, 0x21, 0xAA, 0x20, 0xCC, 0x15, + 0x53, 0x07, 0x59, 0x10, 0x3E, 0xFD, 0xF3, 0x15, 0x38, 0x00, 0x9D, 0x1C, + 0x1B, 0xF8, 0xF1, 0x25, 0xDC, 0xF7, 0xD4, 0x2E, 0x4F, 0x0C, 0x8A, 0x37, + 0x67, 0x14, 0xCD, 0x3F, 0xD0, 0x09, 0xFA, 0x35, 0x6A, 0x08, 0x98, 0x1F, + 0xB7, 0x02, 0xAA, 0x04, 0x94, 0xEC, 0x59, 0xF1, 0xCF, 0xEB, 0x8E, 0x00, + 0x42, 0xEE, 0x8F, 0x10, 0x1B, 0xE4, 0xEA, 0x09, 0x3E, 0xFF, 0x22, 0x0B, + 0xEC, 0x2E, 0xEA, 0x10, 0xEC, 0x29, 0x93, 0x02, 0x31, 0x0F, 0xA7, 0xF2, + 0x2A, 0x0F, 0x36, 0xFE, 0x3E, 0x0B, 0xA9, 0x0C, 0xE9, 0x01, 0xF8, 0x06, + 0xAB, 0x06, 0xCA, 0xFD, 0x80, 0x03, 0x86, 0xF8, 0x1B, 0xE5, 0xEC, 0xE8, + 0x4C, 0xC3, 0x40, 0xCF, 0x37, 0xB2, 0xBE, 0xC0, 0x5D, 0xB7, 0xCF, 0xC3, + 0x0E, 0xD9, 0x74, 0xCF, 0x4B, 0x0A, 0xBB, 0xE7, 0x4D, 0x34, 0xDB, 0x15, + 0x39, 0x50, 0x06, 0x49, 0x93, 0x55, 0x83, 0x5E, 0xB7, 0x46, 0x39, 0x5A, + 0x1A, 0x31, 0x41, 0x4D, 0x13, 0x15, 0xCA, 0x27, 0xF5, 0xF7, 0x5F, 0xF7, + 0x9B, 0xEA, 0x0D, 0xD3, 0xA4, 0xEB, 0x4D, 0xBE, 0xBD, 0xEE, 0xA8, 0xCA, + 0xD4, 0xF0, 0xF0, 0xE6, 0xB0, 0xF9, 0x6D, 0xF9, 0xFA, 0x06, 0x00, 0x05, + 0x0A, 0x0A, 0x17, 0x11, 0xEA, 0x07, 0x49, 0x1B, 0xC2, 0x01, 0x91, 0x1F, + 0xFC, 0xF9, 0xA0, 0x26, 0xF5, 0xF8, 0x91, 0x24, 0xBF, 0xF2, 0x6B, 0x0C, + 0x1D, 0xED, 0xB4, 0xF5, 0x37, 0xF6, 0x86, 0xEF, 0xEA, 0xEC, 0x72, 0xE1, + 0xE2, 0xD1, 0x46, 0xD9, 0x6A, 0xCE, 0xC9, 0xF4, 0xDB, 0xD9, 0x1C, 0x0E, + 0x34, 0xDA, 0x8F, 0x08, 0x73, 0xE2, 0x8B, 0x03, 0xC5, 0xF8, 0xA0, 0x0A, + 0x4A, 0x00, 0xDE, 0x05, 0xB4, 0x05, 0xBF, 0xFD, 0x56, 0x18, 0xBA, 0xFD, + 0xE9, 0x10, 0x4F, 0xF1, 0x62, 0xF8, 0x55, 0xE0, 0x01, 0xF8, 0x58, 0xEA, + 0x72, 0xFE, 0xBB, 0x05, 0x28, 0xF6, 0x14, 0x0F, 0x75, 0x05, 0x72, 0x24, + 0x81, 0x30, 0x86, 0x41, 0xE8, 0x38, 0xFA, 0x2E, 0xF7, 0x2F, 0xBD, 0x14, + 0xBF, 0x43, 0x65, 0x1E, 0x54, 0x4A, 0x4C, 0x22, 0xC8, 0x3E, 0x46, 0x19, + 0x0C, 0x3F, 0x2C, 0x24, 0xA2, 0x2B, 0x19, 0x2D, 0x64, 0xFD, 0xEA, 0x1B, + 0x41, 0xD6, 0x71, 0x01, 0x83, 0xBD, 0x78, 0xE6, 0x4F, 0xBA, 0x75, 0xCF, + 0x3B, 0xD8, 0xE7, 0xD6, 0xAB, 0x04, 0x81, 0x08, 0xAB, 0x26, 0x2D, 0x3F, + 0xA9, 0x3D, 0xA3, 0x57, 0xEA, 0x46, 0x47, 0x55, 0xD9, 0x35, 0xBE, 0x46, + 0xB8, 0x15, 0xC7, 0x32, 0xF7, 0xF4, 0x2E, 0x19, 0x9F, 0xD2, 0x04, 0xFB, + 0x32, 0xBE, 0x02, 0xDB, 0x9F, 0xC2, 0xE0, 0xBC, 0x2D, 0xCF, 0xB6, 0xB1, + 0xF2, 0xDB, 0x1D, 0xB7, 0x27, 0xE4, 0xCE, 0xC2, 0x99, 0xED, 0xE2, 0xE5, + 0x19, 0xFE, 0x77, 0x09, 0x61, 0x08, 0x64, 0x10, 0xEB, 0x10, 0x0F, 0x13, + 0xC3, 0x22, 0x7F, 0x18, 0xF3, 0x2A, 0x55, 0x0B, 0x42, 0x1C, 0x91, 0xF5, + 0x65, 0x13, 0xCF, 0xF3, 0x60, 0x11, 0x9D, 0xFE, 0xD9, 0x05, 0xC8, 0x06, + 0xF9, 0xFF, 0x88, 0x0F, 0xA6, 0x09, 0x4A, 0x16, 0x36, 0x0F, 0x05, 0x18, + 0xC4, 0x06, 0xAC, 0x15, 0xC8, 0x08, 0x04, 0x1A, 0xE8, 0x0F, 0x6D, 0x1F, + 0x9A, 0x0B, 0x7F, 0x13, 0xF4, 0x03, 0xB0, 0x00, 0x5D, 0xF7, 0x43, 0xF6, + 0x2B, 0xE2, 0x56, 0xE6, 0xCD, 0xE0, 0xBF, 0xE4, 0xD9, 0xE5, 0x45, 0xF4, + 0xEA, 0xD0, 0x94, 0xF7, 0x08, 0xC4, 0x0E, 0xF5, 0x11, 0xD3, 0x26, 0xF4, + 0xA8, 0xE0, 0x75, 0xF0, 0x61, 0xD5, 0x22, 0xDC, 0x59, 0xCB, 0xEB, 0xCF, + 0xAF, 0xD9, 0xAE, 0xDF, 0xE0, 0xE3, 0x96, 0xE4, 0x03, 0xEC, 0xF5, 0xDE, + 0x55, 0xFE, 0x05, 0xE8, 0xB8, 0xF9, 0x3E, 0xEA, 0x95, 0xD6, 0x9F, 0xDA, + 0x74, 0xB1, 0xCF, 0xC4, 0x21, 0xA2, 0xF1, 0xB2, 0x39, 0xAD, 0xD5, 0xAB, + 0x2F, 0xD2, 0x98, 0xB5, 0xAC, 0x04, 0x8C, 0xD8, 0x74, 0x2F, 0xBF, 0x06, + 0x29, 0x55, 0xB3, 0x30, 0xA0, 0x65, 0xF4, 0x48, 0x43, 0x49, 0x4C, 0x43, + 0x29, 0x16, 0x1D, 0x2B, 0x20, 0xE5, 0xCD, 0x05, 0x85, 0xC4, 0x5A, 0xDE, + 0xDC, 0xB9, 0xE6, 0xC2, 0xA9, 0xB6, 0x8A, 0xB0, 0x1B, 0xB5, 0xC1, 0xB4, + 0x2F, 0xC0, 0xCB, 0xCF, 0x1B, 0xD9, 0x8A, 0xE8, 0xB2, 0xE7, 0x82, 0xF7, + 0x26, 0xDF, 0x26, 0xFF, 0x9B, 0xD9, 0x48, 0xFC, 0x85, 0xE2, 0x7F, 0xF6, + 0x65, 0xEE, 0x31, 0xF6, 0x8E, 0xF4, 0xC9, 0xEE, 0x1F, 0xF4, 0xEA, 0xD6, + 0x47, 0xF6, 0x5A, 0xC6, 0x44, 0xF6, 0x1E, 0xCD, 0x47, 0xF4, 0x6A, 0xDC, + 0x10, 0xF4, 0x78, 0xE9, 0x80, 0xF5, 0xE6, 0xFF, 0x03, 0xF2, 0x89, 0x0D, + 0x0D, 0xE6, 0x9D, 0xFD, 0xEA, 0xE4, 0x8A, 0xF2, 0xB4, 0xF8, 0x6F, 0xF4, + 0xDF, 0x0B, 0x13, 0xF0, 0x92, 0x11, 0xE3, 0xEB, 0x69, 0x0D, 0x36, 0xE8, + 0x3A, 0x02, 0x07, 0xE0, 0xDC, 0xFD, 0x48, 0xE8, 0xED, 0xF6, 0x31, 0xF7, + 0xFB, 0xE2, 0x88, 0xF5, 0xA4, 0xD2, 0x2C, 0xEE, 0xC7, 0xDB, 0xCE, 0xFA, + 0x35, 0xE8, 0xC0, 0x0B, 0x87, 0xE0, 0x5D, 0xFF, 0x49, 0xE8, 0x1E, 0xFB, + 0xA6, 0xFE, 0x21, 0x09, 0xE8, 0x01, 0x75, 0x02, 0xBE, 0x0D, 0x09, 0xFD, + 0x13, 0x27, 0x73, 0x03, 0x8E, 0x24, 0x6D, 0xF9, 0x73, 0x0A, 0xC2, 0xDE, + 0xDF, 0xE9, 0x29, 0xBE, 0x37, 0xD5, 0xE0, 0xAD, 0xC9, 0xDA, 0xD2, 0xC3, + 0x1D, 0xF3, 0x55, 0xF3, 0xF8, 0x15, 0x1C, 0x28, 0x41, 0x3F, 0xC1, 0x54, + 0x25, 0x5E, 0xDA, 0x62, 0x38, 0x63, 0x35, 0x54, 0x87, 0x51, 0x88, 0x3F, + 0x26, 0x2E, 0xDF, 0x26, 0x76, 0x0B, 0x3B, 0x0E, 0xF6, 0xEF, 0x13, 0xF9, + 0xDC, 0xD5, 0xAC, 0xE1, 0x61, 0xD0, 0xDF, 0xD6, 0xAA, 0xE2, 0x3B, 0xDD, + 0xAF, 0xF2, 0x3C, 0xEF, 0x0C, 0xF8, 0x0E, 0x0A, 0x41, 0x00, 0xE4, 0x20, + 0x59, 0x11, 0xCD, 0x31, 0xAF, 0x1B, 0x9C, 0x36, 0x3E, 0x17, 0x67, 0x20, + 0xD2, 0x0F, 0x4D, 0xFD, 0xDD, 0x07, 0x13, 0xEB, 0x6A, 0x06, 0x03, 0xEA, + 0x84, 0x08, 0x0E, 0xE4, 0xFB, 0xFD, 0x20, 0xE0, 0x6A, 0xF4, 0x62, 0xEB, + 0xAA, 0xEE, 0x51, 0xE7, 0xB8, 0xEB, 0x10, 0xE1, 0x78, 0xE8, 0xA3, 0xE8, + 0x46, 0xE0, 0x73, 0xEB, 0x19, 0xE1, 0x4A, 0xFB, 0x17, 0xE9, 0xC9, 0x13, + 0xB8, 0xEB, 0xBB, 0x11, 0xF1, 0xF6, 0xCD, 0x01, 0x2E, 0xFF, 0x65, 0xF0, + 0x60, 0xF8, 0xFB, 0xE2, 0xF4, 0xF6, 0xA6, 0xED, 0xDF, 0xF0, 0x38, 0x01, + 0xC2, 0xDF, 0x55, 0x08, 0xC1, 0xE6, 0x15, 0x0C, 0xD4, 0x00, 0x51, 0x0B, + 0x8D, 0x00, 0x24, 0xF9, 0xDE, 0xF3, 0xB3, 0xE5, 0xFA, 0x00, 0x6B, 0xF2, + 0xEE, 0x14, 0x98, 0x0A, 0xA1, 0x1D, 0x19, 0x0C, 0x03, 0x23, 0xE5, 0x03, + 0xD1, 0x18, 0xD2, 0xFC, 0x9F, 0xF0, 0x2A, 0xEC, 0x6C, 0xBD, 0xA0, 0xCB, + 0xE7, 0xA3, 0x33, 0xAB, 0xB2, 0x9E, 0x17, 0x9A, 0xEF, 0xAD, 0x91, 0xA5, + 0x04, 0xDF, 0xD3, 0xC7, 0x7E, 0x0C, 0xEE, 0xE7, 0x07, 0x2B, 0x96, 0x07, + 0x96, 0x44, 0x5D, 0x26, 0x5E, 0x3C, 0x9E, 0x2B, 0x36, 0x15, 0x61, 0x14, + 0x68, 0xF5, 0x21, 0xEE, 0x53, 0xE1, 0x39, 0xC6, 0x75, 0xC9, 0xE8, 0xAB, + 0x5F, 0xB3, 0x46, 0xA0, 0x5D, 0xA9, 0x8E, 0x9C, 0xD5, 0xAF, 0xDD, 0xAC, + 0xD3, 0xC7, 0xDA, 0xD1, 0xA2, 0xE5, 0x1A, 0xEC, 0x6E, 0xFC, 0x36, 0xF8, + 0x66, 0x0B, 0x2A, 0x06, 0xA1, 0x0C, 0x50, 0x0D, 0xE6, 0xF7, 0x29, 0x04, + 0xBD, 0xEA, 0x54, 0x05, 0x76, 0xF1, 0xFB, 0x0F, 0x31, 0xF8, 0xFD, 0x04, + 0x61, 0xFE, 0x3C, 0xEF, 0x5C, 0x04, 0x3A, 0xE3, 0xC9, 0x05, 0x7A, 0xDE, + 0x0F, 0x03, 0xFC, 0xE7, 0x86, 0xEE, 0xCF, 0xF4, 0x3F, 0xDB, 0x7B, 0xF3, + 0x63, 0xE2, 0x6D, 0xF6, 0xCE, 0xE7, 0xAC, 0x00, 0x70, 0xE6, 0xFD, 0x06, + 0x9D, 0xEB, 0x1E, 0x08, 0xCD, 0xEB, 0x7E, 0xFA, 0xF6, 0xE3, 0xB0, 0xE2, + 0x77, 0xE6, 0xDB, 0xDD, 0x71, 0xF4, 0xAE, 0xE7, 0xA9, 0xF6, 0x6E, 0xE8, + 0x73, 0xED, 0x6E, 0xEC, 0x34, 0xF2, 0xFD, 0xF7, 0x6D, 0xFF, 0x5E, 0xFF, + 0x68, 0xF8, 0xBD, 0x00, 0x4E, 0xF2, 0x9F, 0x0A, 0x01, 0x04, 0x0A, 0x1C, + 0x7D, 0x12, 0x3D, 0x16, 0xBF, 0x16, 0x56, 0x05, 0x71, 0x19, 0xCB, 0x06, + 0x51, 0x0B, 0x96, 0x08, 0xD4, 0xE2, 0x38, 0xF0, 0xBF, 0xBC, 0x19, 0xCD, + 0x02, 0xB8, 0xA3, 0xBA, 0xFF, 0xCA, 0x47, 0xC2, 0xF0, 0xE5, 0xED, 0xDB, + 0xD6, 0x0A, 0xF5, 0x04, 0x5C, 0x2A, 0x7A, 0x31, 0x46, 0x35, 0x94, 0x48, + 0xB8, 0x2E, 0x8E, 0x45, 0x66, 0x25, 0x35, 0x38, 0x54, 0x1E, 0xFD, 0x27, + 0x01, 0x0C, 0xF5, 0x15, 0x4B, 0x00, 0x3A, 0x11, 0xBB, 0xFD, 0x86, 0x09, + 0x71, 0xF7, 0x21, 0xF7, 0xD4, 0xFB, 0x9D, 0xEB, 0x5C, 0x06, 0xD4, 0xEA, + 0xF9, 0x05, 0x88, 0xF5, 0xF3, 0x08, 0x32, 0x0A, 0x28, 0x1A, 0x5F, 0x24, + 0x12, 0x2F, 0xDA, 0x43, 0x3C, 0x3F, 0x3A, 0x56, 0xD3, 0x48, 0x87, 0x4B, + 0x98, 0x49, 0x58, 0x35, 0x91, 0x46, 0xFC, 0x2B, 0x92, 0x43, 0x55, 0x27, + 0x61, 0x3B, 0x4E, 0x20, 0x35, 0x2F, 0xC5, 0x23, 0xBE, 0x1F, 0x38, 0x20, + 0xF6, 0x15, 0x80, 0x16, 0x07, 0x0B, 0xB9, 0x10, 0x5E, 0x02, 0xDE, 0x07, + 0x10, 0x07, 0x1D, 0x07, 0xFA, 0x03, 0x75, 0x0B, 0x5B, 0xF6, 0xE4, 0x02, + 0xF5, 0xF6, 0x47, 0xF9, 0xF0, 0xF8, 0x1F, 0xE4, 0xCB, 0xF8, 0xA3, 0xCB, + 0x4C, 0xFB, 0xC9, 0xD4, 0xA8, 0xEB, 0xAF, 0xEB, 0x51, 0xD6, 0xAC, 0xF7, + 0xCE, 0xDA, 0xBF, 0x07, 0xD1, 0xF3, 0x57, 0x1D, 0x90, 0xF9, 0xE7, 0x1C, + 0x3E, 0xF4, 0x62, 0x0D, 0xD5, 0x0A, 0xDB, 0x14, 0xFC, 0x23, 0x9D, 0x2A, + 0x0B, 0x27, 0xE1, 0x2C, 0x37, 0x2B, 0x96, 0x25, 0x42, 0x2A, 0x31, 0x23, + 0xEC, 0x0A, 0x7D, 0x11, 0x7C, 0xE5, 0x94, 0xF4, 0x58, 0xD4, 0x7A, 0xE3, + 0xE0, 0xD4, 0x1B, 0xE6, 0x98, 0xEA, 0x93, 0xFF, 0x79, 0x14, 0xA1, 0x20, + 0xAD, 0x3A, 0xAE, 0x37, 0x61, 0x51, 0xF5, 0x43, 0x37, 0x61, 0x4D, 0x44, + 0xC3, 0x5D, 0x49, 0x3C, 0x1B, 0x44, 0x0F, 0x33, 0x08, 0x30, 0x28, 0x26, + 0x24, 0x20, 0x0C, 0x10, 0xF7, 0x06, 0xF4, 0xF1, 0xC0, 0xF3, 0x8C, 0xD8, + 0xC0, 0xE2, 0x02, 0xC8, 0x6C, 0xD6, 0x8D, 0xC3, 0x80, 0xDD, 0xAB, 0xD2, + 0x0A, 0xE1, 0xA6, 0xE4, 0x63, 0xDC, 0xB8, 0xF2, 0xC9, 0xDF, 0xC7, 0xFF, + 0x28, 0xE5, 0xA7, 0xFA, 0x1D, 0xEB, 0x5F, 0xF0, 0xA9, 0xF3, 0xB2, 0xFD, + 0x62, 0xFD, 0x2E, 0x15, 0x7C, 0x05, 0x14, 0x1C, 0xA6, 0x07, 0xFC, 0x14, + 0x91, 0x06, 0x32, 0x05, 0x4D, 0x04, 0xA3, 0xF4, 0x8B, 0x0A, 0x0E, 0xFC, + 0x61, 0x0C, 0x96, 0x03, 0x0A, 0x0F, 0x02, 0x04, 0xE0, 0x19, 0x79, 0x14, + 0x1E, 0x19, 0x46, 0x25, 0x05, 0x18, 0xED, 0x2B, 0x1D, 0x22, 0xCB, 0x31, + 0x45, 0x1D, 0x17, 0x28, 0xC0, 0x0E, 0xC2, 0x0D, 0xE0, 0x1D, 0x32, 0x0D, + 0x64, 0x31, 0xA4, 0x1F, 0x64, 0x29, 0x9D, 0x1E, 0x32, 0x23, 0xBD, 0x1D, + 0xCC, 0x2A, 0xE7, 0x28, 0x82, 0x21, 0x8F, 0x21, 0xC1, 0x0D, 0x65, 0x15, + 0x5F, 0x17, 0x67, 0x2B, 0x0F, 0x2D, 0x53, 0x49, 0x5B, 0x26, 0x94, 0x47, + 0x9D, 0x17, 0x2D, 0x38, 0xBB, 0x0D, 0xAA, 0x2E, 0xDD, 0xEC, 0xFE, 0x16, + 0xDC, 0xCB, 0xBB, 0xF8, 0xDE, 0xBC, 0x18, 0xE4, 0x19, 0xBA, 0x27, 0xD5, + 0x44, 0xD6, 0x6B, 0xD9, 0xCD, 0x05, 0xAA, 0xF5, 0x7B, 0x2A, 0xF0, 0x12, + 0x3B, 0x44, 0xAB, 0x22, 0x72, 0x52, 0x6B, 0x2F, 0x0A, 0x50, 0xDE, 0x3C, + 0xDA, 0x43, 0xAF, 0x42, 0x7B, 0x3A, 0xC2, 0x42, 0x65, 0x2D, 0xD3, 0x3B, + 0x38, 0x12, 0x88, 0x28, 0xCA, 0xF9, 0x0A, 0x0D, 0xD6, 0xF1, 0x57, 0xF4, + 0xAB, 0xF4, 0x78, 0xEC, 0x27, 0xFD, 0xE0, 0xF3, 0x60, 0x0B, 0xA9, 0x01, + 0x27, 0x13, 0x41, 0x0E, 0x10, 0x18, 0x60, 0x18, 0xFD, 0x21, 0x15, 0x24, + 0x96, 0x2B, 0x44, 0x30, 0x37, 0x2F, 0xD5, 0x36, 0x7D, 0x30, 0xC3, 0x34, + 0xE0, 0x3C, 0xAE, 0x2E, 0xA6, 0x45, 0xEB, 0x21, 0xCF, 0x42, 0xD6, 0x21, + 0xB1, 0x3A, 0x2B, 0x2B, 0x60, 0x2D, 0xEB, 0x27, 0x4B, 0x1E, 0x01, 0x23, + 0x9D, 0x11, 0x58, 0x1A, 0x91, 0x0F, 0xC7, 0x0D, 0xDD, 0x13, 0x46, 0x0C, + 0x8D, 0x0A, 0x15, 0x0C, 0x04, 0xF8, 0x8C, 0x04, 0x07, 0xEF, 0x1C, 0xFE, + 0xA4, 0xF3, 0x6C, 0xF8, 0xEC, 0x00, 0x93, 0xFB, 0xB1, 0x07, 0x38, 0x04, + 0xDC, 0xFA, 0xC7, 0xF8, 0x01, 0xF1, 0x9C, 0xF0, 0x4B, 0x02, 0x10, 0x0B, + 0x3A, 0x0E, 0x9A, 0x13, 0x70, 0xFF, 0xFC, 0xF9, 0x4C, 0xEB, 0xFD, 0xF4, + 0xF5, 0xE6, 0xF8, 0x04, 0x53, 0xF0, 0x63, 0x09, 0x94, 0xFA, 0x05, 0x08, + 0xCA, 0xFD, 0x89, 0x06, 0x40, 0xEC, 0x11, 0xEE, 0xE8, 0xCF, 0xD2, 0xC9, + 0x7D, 0xB8, 0x9C, 0xAE, 0x60, 0xA4, 0x63, 0xA1, 0x50, 0xA2, 0xAC, 0xAF, + 0x54, 0xB9, 0x3D, 0xD3, 0x10, 0xDA, 0x31, 0xF8, 0x59, 0xFD, 0x2B, 0x12, + 0xA6, 0x15, 0x36, 0x15, 0x79, 0x1B, 0xCF, 0x0B, 0xC0, 0x25, 0xC0, 0x0D, + 0xC7, 0x35, 0x1F, 0x16, 0x20, 0x36, 0xA0, 0x1B, 0x36, 0x2D, 0xB0, 0x1E, + 0xAF, 0x20, 0xEC, 0x19, 0x35, 0x07, 0x71, 0x06, 0xAB, 0xEB, 0x28, 0xEF, + 0x19, 0xDB, 0x26, 0xE7, 0xE1, 0xD2, 0xA0, 0xE9, 0xDA, 0xD0, 0x18, 0xE4, + 0x41, 0xD9, 0x20, 0xE1, 0x09, 0xE5, 0xD5, 0xDF, 0x8E, 0xE7, 0x63, 0xCF, + 0x25, 0xED, 0x1A, 0xD1, 0x31, 0xF7, 0x30, 0xEA, 0xFF, 0xF7, 0x91, 0xF2, + 0x53, 0xFB, 0x55, 0xF3, 0x10, 0xFB, 0x20, 0xF7, 0x69, 0xEC, 0xEA, 0xEB, + 0x2E, 0xE4, 0xD6, 0xDB, 0xE1, 0xDB, 0xC6, 0xD1, 0x35, 0xC6, 0xF7, 0xCB, + 0x83, 0xC0, 0x4D, 0xCA, 0xF9, 0xCC, 0x2E, 0xC9, 0xD1, 0xC6, 0xED, 0xC6, + 0x1B, 0xBC, 0x39, 0xCE, 0x69, 0xBE, 0xEC, 0xD6, 0x18, 0xB8, 0x6E, 0xCE, + 0xE2, 0xBA, 0x58, 0xCA, 0xF7, 0xD2, 0xEF, 0xD4, 0x95, 0xDC, 0x7A, 0xD7, + 0xCD, 0xDC, 0xE1, 0xD7, 0x25, 0xF3, 0xB1, 0xEB, 0xB9, 0x04, 0xEC, 0xF4, + 0xEC, 0x03, 0x51, 0xE7, 0xC1, 0x14, 0x38, 0xEC, 0x48, 0x30, 0x86, 0x03, + 0x2D, 0x38, 0x4B, 0x0B, 0x4C, 0x31, 0x22, 0x08, 0x42, 0x26, 0x5F, 0x08, + 0x9B, 0x09, 0xEF, 0xF5, 0x38, 0xE5, 0xBA, 0xD7, 0xCC, 0xC6, 0x17, 0xC5, + 0x42, 0xAE, 0xB0, 0xBE, 0xCE, 0xB3, 0x02, 0xCB, 0xEA, 0xD9, 0xA6, 0xE6, + 0xC9, 0xFE, 0x81, 0x03, 0x1C, 0x0A, 0xC9, 0x16, 0x91, 0x0B, 0xFB, 0x1E, + 0xCE, 0x11, 0xE4, 0x1F, 0x65, 0x18, 0x1B, 0x1D, 0x54, 0x20, 0x6A, 0x19, + 0xF0, 0x1F, 0xF8, 0x0E, 0x7E, 0x10, 0x19, 0x04, 0x94, 0xF5, 0xF6, 0xF8, + 0x15, 0xD5, 0x07, 0xEF, 0x92, 0xBF, 0xED, 0xF5, 0x09, 0xC0, 0x77, 0x03, + 0x94, 0xC5, 0x33, 0x00, 0x2C, 0xC7, 0xD0, 0xE6, 0x7A, 0xCB, 0xF9, 0xC6, + 0x77, 0xC9, 0x8E, 0xB6, 0x00, 0xC5, 0x54, 0xBA, 0x51, 0xD2, 0x4D, 0xCC, + 0xE9, 0xEE, 0x30, 0xF3, 0x93, 0x14, 0x25, 0x21, 0xD3, 0x34, 0xD9, 0x2F, + 0xBE, 0x41, 0x3C, 0x23, 0x6B, 0x43, 0xA5, 0x0E, 0xE3, 0x3F, 0x2F, 0xFF, + 0xC8, 0x2B, 0x3A, 0xFA, 0x09, 0x18, 0x72, 0xFB, 0x2D, 0x1E, 0xE6, 0x00, + 0x5A, 0x22, 0x7B, 0x01, 0x91, 0x0E, 0xBE, 0xFC, 0xB2, 0xFE, 0xA3, 0x00, + 0xB0, 0xF7, 0x68, 0x04, 0x9B, 0xE8, 0xD3, 0x00, 0xC8, 0xEB, 0x42, 0x02, + 0x69, 0x00, 0xC9, 0xFA, 0x03, 0xFB, 0x58, 0xDE, 0x3D, 0xE7, 0x92, 0xCB, + 0x17, 0xEA, 0x34, 0xD7, 0x5E, 0xEB, 0xA6, 0xE4, 0xA7, 0xDC, 0x5A, 0xE9, + 0x6C, 0xE0, 0xF1, 0xF9, 0x26, 0xF7, 0x16, 0x10, 0xEC, 0x05, 0x75, 0x18, + 0x02, 0x05, 0x40, 0x09, 0x79, 0xFE, 0x37, 0xED, 0x13, 0xED, 0xB7, 0xD1, + 0xDA, 0xCB, 0xD0, 0xB5, 0x71, 0xAA, 0x08, 0xA1, 0x8C, 0x9A, 0x19, 0x9E, + 0xDA, 0xA9, 0x08, 0xB0, 0x85, 0xCC, 0xC1, 0xCE, 0xB1, 0xE5, 0x20, 0xF0, + 0x06, 0xF4, 0xE9, 0x11, 0x89, 0xFF, 0x0E, 0x26, 0xFB, 0x02, 0x41, 0x21, + 0xEC, 0x05, 0x1C, 0x18, 0x32, 0x0F, 0x50, 0x10, 0x7E, 0x15, 0x2C, 0x04, + 0x06, 0x14, 0xA2, 0x00, 0x13, 0x0D, 0x2A, 0xFD, 0xAB, 0x00, 0xBC, 0xEE, + 0x38, 0xF2, 0x05, 0xE5, 0x10, 0xE7, 0x43, 0xE0, 0x4A, 0xE5, 0x49, 0xD6, + 0xF6, 0xE7, 0x76, 0xDA, 0x94, 0xDA, 0x91, 0xE1, 0x5A, 0xCB, 0x61, 0xD6, + 0x30, 0xD0, 0x64, 0xD5, 0x31, 0xD8, 0x4D, 0xE5, 0x12, 0xE0, 0x0C, 0xF4, + 0x8A, 0xF4, 0xA9, 0x04, 0x02, 0x0E, 0x98, 0x18, 0x7D, 0x1B, 0x06, 0x1E, + 0x21, 0x25, 0xF7, 0x22, 0x9B, 0x2A, 0x58, 0x28, 0xFA, 0x17, 0x47, 0x11, + 0x4E, 0x0B, 0x95, 0xFB, 0x3E, 0x0F, 0x7C, 0xF4, 0xD5, 0x05, 0xCE, 0xE4, + 0x23, 0x00, 0x1C, 0xE3, 0x5D, 0x07, 0xA1, 0xF1, 0xBA, 0xFE, 0x47, 0xF8, + 0x03, 0xF0, 0x03, 0xFD, 0xFC, 0xF3, 0xBB, 0x05, 0x76, 0xF4, 0xD9, 0xFD, + 0x4F, 0xE2, 0x42, 0xDF, 0xA3, 0xE5, 0x81, 0xD9, 0xCA, 0xFA, 0xC3, 0xEB, + 0x8A, 0xFB, 0xE9, 0xEC, 0x04, 0xF8, 0xE6, 0xED, 0x68, 0x05, 0x22, 0x00, + 0x27, 0x16, 0x0C, 0x12, 0x3C, 0x14, 0xC8, 0x13, 0x89, 0x0E, 0x51, 0x13, + 0xB6, 0x12, 0xDD, 0x14, 0x0D, 0x02, 0x9B, 0xFD, 0x3F, 0xE4, 0x72, 0xD7, + 0x5A, 0xD4, 0x40, 0xBF, 0x5E, 0xD6, 0xEA, 0xC2, 0xFB, 0xEC, 0x84, 0xE0, + 0x24, 0x0C, 0x7A, 0x02, 0x01, 0x29, 0x16, 0x1F, 0xD5, 0x40, 0xF6, 0x36, + 0xA1, 0x51, 0x53, 0x46, 0xF1, 0x56, 0xDC, 0x4A, 0x7D, 0x51, 0x4C, 0x4D, + 0x9E, 0x4D, 0x36, 0x48, 0x6F, 0x57, 0x56, 0x41, 0x63, 0x5E, 0x1B, 0x3A, + 0x01, 0x4B, 0xD0, 0x1F, 0x82, 0x30, 0x81, 0x0C, 0x01, 0x22, 0xF7, 0x17, + 0xA1, 0x12, 0x2D, 0x23, 0xE2, 0x05, 0x9C, 0x24, 0xBB, 0xFA, 0xF1, 0x24, + 0x3E, 0xE4, 0x62, 0x16, 0x37, 0xDC, 0xEF, 0xFF, 0x15, 0xF4, 0xB4, 0xFB, + 0x2B, 0x0D, 0xEC, 0x07, 0xB5, 0x19, 0xBB, 0x11, 0x8A, 0x24, 0xB0, 0x21, + 0x62, 0x2A, 0x46, 0x3B, 0xD9, 0x2E, 0x60, 0x49, 0x32, 0x33, 0x8D, 0x43, + 0x8C, 0x2A, 0x4C, 0x33, 0xAF, 0x1D, 0x48, 0x27, 0xBD, 0x1C, 0x21, 0x22, + 0x05, 0x20, 0x6F, 0x19, 0xE6, 0x20, 0xF4, 0x10, 0x02, 0x27, 0x97, 0x0B, + 0x9A, 0x22, 0x98, 0xF8, 0x65, 0x11, 0x64, 0xEE, 0xE0, 0x0C, 0xAD, 0x03, + 0x22, 0x0D, 0x7A, 0x14, 0x70, 0x05, 0x5F, 0x0B, 0x83, 0x04, 0x29, 0x06, + 0x7D, 0x0F, 0x3F, 0x10, 0x52, 0x0D, 0x33, 0x0B, 0x25, 0x09, 0xD5, 0x07, + 0x20, 0x1E, 0x36, 0x1C, 0x40, 0x2C, 0x3C, 0x2E, 0x45, 0x28, 0xB6, 0x3C, + 0xFE, 0x26, 0x6F, 0x47, 0xDA, 0x1C, 0x3E, 0x3B, 0xBB, 0x03, 0x97, 0x25, + 0x89, 0xEA, 0x29, 0x11, 0xA4, 0xD1, 0xCE, 0xF3, 0x0D, 0xC4, 0xDF, 0xDD, + 0x56, 0xDB, 0xCA, 0xE4, 0xD1, 0xFA, 0xFD, 0xF5, 0x7D, 0xFB, 0x37, 0xF7, + 0xB1, 0xF7, 0x8B, 0xF4, 0xC2, 0xFE, 0xCB, 0xF9, 0x88, 0xFD, 0xCA, 0x02, + 0xB7, 0xFD, 0x3F, 0x15, 0xA9, 0x04, 0x71, 0x23, 0x8E, 0xFE, 0xDC, 0x21, + 0xE5, 0xFC, 0xC4, 0x19, 0xFB, 0x09, 0x58, 0x02, 0x2C, 0x06, 0x46, 0xE1, + 0x2C, 0xFA, 0xB6, 0xD1, 0x64, 0xF8, 0x6E, 0xCA, 0x72, 0xF9, 0x13, 0xC9, + 0x08, 0xFA, 0x20, 0xD7, 0x17, 0xF1, 0x86, 0xDC, 0x7C, 0xDD, 0x57, 0xD2, + 0x86, 0xD1, 0x76, 0xD6, 0xCD, 0xD7, 0x9F, 0xEB, 0x21, 0xEC, 0x91, 0xFD, + 0x06, 0x07, 0x7C, 0x0D, 0x18, 0x1B, 0x69, 0x15, 0xFE, 0x1D, 0x10, 0x12, + 0x56, 0x19, 0x89, 0x19, 0x06, 0x18, 0x8E, 0x24, 0x6C, 0x10, 0x37, 0x1B, + 0xD2, 0x10, 0xC2, 0x19, 0xE1, 0x1C, 0x31, 0x29, 0xDB, 0x14, 0xA4, 0x26, + 0x40, 0xFD, 0x13, 0x10, 0x2A, 0xF4, 0x73, 0xF5, 0x23, 0xF3, 0x01, 0xDE, + 0xE1, 0xEF, 0xE3, 0xDB, 0x31, 0xEF, 0x4B, 0xE9, 0x9A, 0xE5, 0xF7, 0xE8, + 0xBC, 0xDA, 0x0C, 0xE6, 0x06, 0xDE, 0x83, 0xF4, 0x49, 0xE3, 0xCE, 0xFD, + 0xE8, 0xE1, 0xCD, 0xF2, 0xE1, 0xE9, 0xB6, 0xED, 0xB9, 0x00, 0xE5, 0xF4, + 0x4B, 0x16, 0x6A, 0xFD, 0x85, 0x26, 0xF1, 0x03, 0xE0, 0x26, 0x93, 0xFD, + 0x64, 0x13, 0xC6, 0xF7, 0x93, 0xFE, 0x44, 0xFF, 0x3E, 0xEC, 0x37, 0xF9, + 0x89, 0xD9, 0xFA, 0xE4, 0x44, 0xD6, 0x42, 0xDE, 0x16, 0xEB, 0xB0, 0xE4, + 0x6E, 0xF5, 0x26, 0xE4, 0xD6, 0xF6, 0x76, 0xEC, 0x45, 0xFE, 0x80, 0x01, + 0xE2, 0x01, 0x10, 0x0E, 0xDE, 0x0E, 0xBE, 0x1D, 0xAF, 0x24, 0xF3, 0x2B, + 0xBD, 0x2D, 0xD0, 0x30, 0x27, 0x23, 0x15, 0x35, 0x13, 0x14, 0x11, 0x33, + 0xFA, 0x03, 0xA6, 0x22, 0x6E, 0xF8, 0xAE, 0x10, 0xD5, 0xFB, 0x8D, 0x07, + 0xD5, 0xFB, 0x17, 0xFB, 0x84, 0xF0, 0x2A, 0xF2, 0x36, 0xE6, 0xD0, 0xF3, + 0x21, 0xDD, 0x31, 0xF3, 0x92, 0xDB, 0x2C, 0xFD, 0x9A, 0xEB, 0xE4, 0x17, + 0x43, 0x06, 0x29, 0x29, 0x0E, 0x19, 0x85, 0x2C, 0x7E, 0x25, 0x7A, 0x2D, + 0x53, 0x2C, 0xB9, 0x25, 0xF2, 0x24, 0x6B, 0x20, 0x60, 0x1E, 0x3B, 0x2F, + 0x21, 0x19, 0xBD, 0x38, 0x3E, 0x1E, 0x88, 0x36, 0x67, 0x35, 0xD9, 0x39, + 0x9C, 0x3C, 0xEC, 0x34, 0xF1, 0x23, 0x2D, 0x20, 0xE2, 0x0B, 0x3F, 0x0C, + 0xD7, 0x04, 0x33, 0xFD, 0x50, 0x03, 0xF1, 0xEE, 0xA1, 0x0C, 0xE9, 0xF1, + 0x92, 0x12, 0xA4, 0xF9, 0xF2, 0x02, 0x89, 0xED, 0xEC, 0xF7, 0x81, 0xED, + 0x8C, 0xFF, 0x5C, 0x03, 0xDE, 0xFB, 0xC4, 0x00, 0xA1, 0xF5, 0x48, 0xF2, + 0x4B, 0x04, 0x22, 0xFB, 0xA3, 0x0D, 0x96, 0xFD, 0xB7, 0x0C, 0xC3, 0xF1, + 0x7E, 0x0D, 0xAC, 0xEE, 0x40, 0xF9, 0x90, 0xE6, 0x51, 0xE1, 0x5B, 0xDF, + 0x30, 0xE8, 0x1D, 0xF1, 0xA3, 0xEC, 0x06, 0xF9, 0x7D, 0xE4, 0x26, 0xE7, + 0xFD, 0xEE, 0x50, 0xEE, 0x8C, 0xFB, 0xB6, 0x05, 0x61, 0xF6, 0xB8, 0xFF, + 0x39, 0xF7, 0xE9, 0xF6, 0xA1, 0xFE, 0x78, 0xFF, 0xF1, 0xFF, 0x23, 0x05, + 0x4E, 0x0F, 0xC3, 0x15, 0x0F, 0x22, 0x17, 0x31, 0x6B, 0x21, 0x2C, 0x3A, + 0xEC, 0x1A, 0x52, 0x3B, 0x55, 0x16, 0xFB, 0x38, 0x38, 0x0A, 0xC3, 0x25, + 0xD0, 0x02, 0x20, 0x14, 0xC8, 0x07, 0xC0, 0x08, 0xCA, 0x02, 0xC6, 0xF7, + 0xCF, 0xFC, 0x41, 0xF1, 0xEB, 0xFF, 0xB7, 0xF6, 0x8C, 0xFA, 0x76, 0xF2, + 0x99, 0xF0, 0x47, 0xE6, 0xD9, 0xF3, 0x85, 0xE5, 0x34, 0xF6, 0xCA, 0xEA, + 0x56, 0xFB, 0x4C, 0xF7, 0x2D, 0x03, 0x83, 0x01, 0x1A, 0xF6, 0xED, 0xF2, + 0x81, 0xEF, 0xF2, 0xE8, 0x0F, 0xEC, 0xF2, 0xED, 0x06, 0xE0, 0x21, 0xED, + 0x31, 0xE1, 0x31, 0xF2, 0x0E, 0xE7, 0x2E, 0xFE, 0x13, 0xE0, 0x5D, 0xF8, + 0x21, 0xD5, 0x96, 0xEF, 0x29, 0xD1, 0xB4, 0xF5, 0xDF, 0xCD, 0xB3, 0xF0, + 0x8D, 0xDA, 0xA7, 0xE5, 0xCF, 0xF1, 0x52, 0xE5, 0x3B, 0xF1, 0xDE, 0xD7, + 0xE9, 0xED, 0x24, 0xD1, 0x20, 0xFF, 0x9D, 0xEE, 0xE3, 0x01, 0x44, 0x00, + 0x6F, 0xF8, 0xF1, 0xFA, 0x8A, 0x01, 0xDD, 0x02, 0x85, 0x05, 0x44, 0x08, + 0x6B, 0x01, 0x22, 0x0D, 0x54, 0x09, 0x4B, 0x1D, 0x42, 0x0B, 0xB9, 0x17, + 0x0F, 0x02, 0x67, 0xFF, 0xD3, 0xF6, 0x4C, 0xF1, 0xD9, 0xEA, 0xF0, 0xE7, + 0x79, 0xE7, 0x4D, 0xD8, 0x04, 0xF2, 0xBE, 0xD4, 0x82, 0xFD, 0xA0, 0xDF, + 0x07, 0x06, 0xDC, 0xE6, 0xD9, 0x0D, 0x87, 0xEA, 0x64, 0x00, 0xA2, 0xE5, + 0x1B, 0xE4, 0xAE, 0xE0, 0x6D, 0xDA, 0x57, 0xEB, 0x31, 0xE5, 0x61, 0xFC, + 0xCC, 0xEF, 0x5F, 0x02, 0xF4, 0xF9, 0x7E, 0x03, 0x31, 0x07, 0x94, 0x05, + 0xD8, 0x0F, 0x89, 0x04, 0xEB, 0x11, 0x36, 0x06, 0xC5, 0x0B, 0xD6, 0x08, + 0x5D, 0x04, 0x77, 0x0E, 0x94, 0x05, 0x2E, 0x13, 0x63, 0x0B, 0x97, 0x0F, + 0x2F, 0x0F, 0x71, 0x04, 0x72, 0x11, 0x7A, 0xF3, 0x08, 0x0B, 0x81, 0xE9, + 0x7D, 0x09, 0x00, 0xF9, 0xEC, 0x0D, 0x99, 0x10, 0x59, 0x0A, 0x84, 0x1B, + 0x9B, 0x0E, 0x6E, 0x24, 0xF5, 0x13, 0x25, 0x23, 0x7C, 0x0C, 0xA9, 0x0E, + 0x19, 0x0C, 0x6C, 0x04, 0x5E, 0x15, 0x4D, 0x16, 0x6E, 0x0D, 0xCB, 0x22, + 0x3D, 0x03, 0x5E, 0x22, 0x89, 0x0B, 0x9B, 0x28, 0xBA, 0x10, 0x75, 0x23, + 0xE0, 0x0C, 0xB7, 0x0E, 0xEC, 0x0E, 0x0D, 0x0D, 0x76, 0x11, 0x76, 0x17, + 0xA6, 0x10, 0xFF, 0x0F, 0x01, 0x1B, 0xA8, 0x0D, 0x06, 0x24, 0x30, 0x14, + 0x44, 0x19, 0x14, 0x07, 0x2E, 0x0F, 0xCF, 0xF7, 0xC0, 0x16, 0xE7, 0xFF, + 0x3E, 0x1C, 0x9A, 0x0E, 0x44, 0x1B, 0xF6, 0x17, 0xD5, 0x1E, 0x43, 0x1B, + 0x10, 0x1A, 0xDC, 0x10, 0x7C, 0x0A, 0x02, 0x01, 0x70, 0xF7, 0xAB, 0xF3, + 0xC0, 0xE1, 0xE8, 0xE7, 0x88, 0xD6, 0x47, 0xE0, 0x83, 0xD5, 0xDC, 0xDB, + 0x0B, 0xD5, 0xD9, 0xD9, 0x3F, 0xD5, 0x51, 0xDD, 0x45, 0xD4, 0x48, 0xDF, + 0xBB, 0xD2, 0x94, 0xD9, 0x5E, 0xD1, 0x4F, 0xD3, 0xB6, 0xD4, 0xB7, 0xD2, + 0xE3, 0xD8, 0x38, 0xD1, 0xE5, 0xE0, 0x43, 0xD0, 0x45, 0xF0, 0x21, 0xD9, + 0x01, 0xF0, 0xD3, 0xDB, 0x3E, 0xE5, 0x9D, 0xD4, 0x74, 0xE2, 0x13, 0xD5, + 0xF5, 0xDD, 0xD8, 0xDB, 0x0B, 0xDA, 0x01, 0xE3, 0xA5, 0xDD, 0xFC, 0xE7, + 0xC8, 0xE0, 0x7D, 0xE7, 0x92, 0xE7, 0xFA, 0xE8, 0x3B, 0xF3, 0x66, 0xF0, + 0xEE, 0xFB, 0x1D, 0xF7, 0x36, 0x02, 0x1D, 0xF8, 0xD8, 0x12, 0xA0, 0xFB, + 0x0B, 0x2B, 0x47, 0x07, 0xBB, 0x2E, 0x43, 0x0E, 0xA3, 0x1A, 0x4E, 0x0A, + 0xE0, 0x06, 0x95, 0x03, 0x3E, 0xFD, 0x13, 0xFB, 0xAF, 0xF3, 0x60, 0xEF, + 0xFB, 0xEC, 0x0F, 0xEC, 0xF6, 0xE9, 0x6C, 0xF0, 0xD4, 0xDE, 0x5E, 0xEC, + 0x7A, 0xD4, 0x82, 0xE0, 0xBB, 0xD5, 0x21, 0xDF, 0xAD, 0xD4, 0x23, 0xE4, + 0xA8, 0xC9, 0x6E, 0xE3, 0x22, 0xC1, 0x50, 0xE7, 0x22, 0xC1, 0x09, 0xEE, + 0x91, 0xC4, 0x57, 0xE6, 0xB1, 0xC9, 0x82, 0xD5, 0x2A, 0xD3, 0xDD, 0xCF, + 0x1F, 0xD8, 0xD2, 0xCE, 0x77, 0xD6, 0xA5, 0xCC, 0x43, 0xD2, 0x72, 0xCB, + 0x49, 0xD3, 0xBB, 0xD0, 0x34, 0xD9, 0xCF, 0xDA, 0x35, 0xD3, 0x1E, 0xD6, + 0xA6, 0xCA, 0x10, 0xD4, 0xA7, 0xC8, 0x93, 0xDE, 0x5B, 0xCF, 0x65, 0xE5, + 0xA9, 0xE1, 0x8C, 0xEA, 0xE0, 0xF0, 0x8C, 0xF5, 0xDF, 0xF4, 0xD6, 0xFD, + 0xEA, 0xFC, 0xA7, 0xFB, 0xB7, 0x12, 0x49, 0xFF, 0x16, 0x26, 0xAD, 0x06, + 0xC7, 0x27, 0x41, 0xFC, 0xB3, 0x27, 0x87, 0xF0, 0x1D, 0x2E, 0xA8, 0xF2, + 0x6A, 0x2A, 0x29, 0xF3, 0x67, 0x20, 0x4B, 0xF1, 0x29, 0x12, 0x33, 0xF5, + 0x0B, 0x01, 0x04, 0xFC, 0xBC, 0xFD, 0x3F, 0x01, 0x5A, 0x01, 0xC7, 0x04, + 0x61, 0xFE, 0x7A, 0x07, 0x12, 0xF7, 0xC5, 0x06, 0xBA, 0xEB, 0xAD, 0x00, + 0xEB, 0xE6, 0x35, 0xFF, 0xE9, 0xF2, 0x68, 0x06, 0xF1, 0xFB, 0xC8, 0x07, + 0x75, 0xF2, 0x93, 0xFB, 0x9F, 0xEC, 0x6A, 0xEE, 0xC4, 0xF0, 0xC2, 0xE7, + 0xC0, 0xE8, 0x45, 0xE7, 0xD0, 0xDF, 0x1D, 0xED, 0x4E, 0xEC, 0x9B, 0xF6, + 0xD9, 0xFA, 0xF5, 0xF8, 0xE2, 0xFF, 0xC7, 0xF4, 0x32, 0x05, 0x52, 0xF7, + 0x07, 0x00, 0x58, 0xF4, 0x2A, 0xFB, 0x2B, 0xFA, 0x2C, 0x05, 0x55, 0x10, + 0xB8, 0x06, 0x01, 0x12, 0xB2, 0x02, 0x50, 0x0D, 0x52, 0x0E, 0xA7, 0x18, + 0xAA, 0x0F, 0xD2, 0x14, 0x0B, 0x06, 0x0C, 0x0A, 0x03, 0x12, 0x82, 0x15, + 0xDF, 0x24, 0x17, 0x1A, 0xCA, 0x28, 0xAE, 0x0C, 0x9D, 0x2C, 0x42, 0x0E, + 0xA2, 0x36, 0x50, 0x1B, 0xC4, 0x2A, 0x9D, 0x12, 0x68, 0x12, 0x83, 0x0A, + 0x00, 0x05, 0x58, 0x14, 0x58, 0xFA, 0xD4, 0x15, 0x7A, 0xF8, 0x65, 0x11, + 0x92, 0x02, 0x19, 0x10, 0xC5, 0x05, 0xB1, 0x0E, 0xCE, 0x00, 0x81, 0x0B, + 0x44, 0xFD, 0x46, 0x02, 0x91, 0xF6, 0xBE, 0xF3, 0xE1, 0xF1, 0x8D, 0xEE, + 0x14, 0xF0, 0x13, 0xF2, 0xED, 0xEB, 0x25, 0xF4, 0x03, 0xEE, 0xF4, 0xFC, + 0xC2, 0xF6, 0x4E, 0x05, 0x6C, 0xFA, 0x0E, 0x01, 0x63, 0xFD, 0xB7, 0xFF, + 0x50, 0x02, 0x0D, 0x01, 0xCA, 0x01, 0x4B, 0xF7, 0x3E, 0xFF, 0xB7, 0xEB, + 0x89, 0xF8, 0xD7, 0xE4, 0x4B, 0xED, 0x51, 0xE1, 0x52, 0xEA, 0x4F, 0xE6, + 0xC9, 0xF2, 0xFD, 0xF7, 0x0B, 0xF7, 0xD3, 0x07, 0x80, 0xF5, 0x4D, 0x05, + 0x29, 0xFB, 0xAE, 0x02, 0x13, 0xFF, 0xD0, 0x04, 0x9D, 0xF5, 0x9A, 0xF9, + 0x37, 0xF1, 0x46, 0xED, 0xBB, 0xFA, 0x22, 0xEB, 0x12, 0xFF, 0x27, 0xF2, + 0x59, 0x02, 0x99, 0x05, 0xBB, 0x06, 0x0A, 0x11, 0x01, 0x08, 0x13, 0x0A, + 0x08, 0x18, 0x21, 0x0E, 0x7D, 0x28, 0x94, 0x1A, 0x7C, 0x20, 0xCF, 0x14, + 0xF6, 0x11, 0xF1, 0x06, 0x3B, 0x10, 0xAC, 0x03, 0xCC, 0x0C, 0x7C, 0x06, + 0x36, 0xFF, 0x76, 0x01, 0xBA, 0xF9, 0x4C, 0xFE, 0x02, 0xFF, 0xEA, 0x08, + 0x68, 0x03, 0xB5, 0x15, 0x10, 0x0E, 0x18, 0x1F, 0xEC, 0x19, 0xA3, 0x22, + 0x23, 0x0E, 0xE6, 0x17, 0x0A, 0xF7, 0xA2, 0x04, 0xF0, 0xE8, 0x43, 0xF4, + 0x41, 0xE5, 0xB8, 0xE9, 0x30, 0xEC, 0x93, 0xE4, 0x67, 0xF4, 0x0D, 0xE8, + 0xDE, 0xF8, 0xA5, 0xED, 0xFE, 0xFA, 0x3C, 0xED, 0x0E, 0xF6, 0xBA, 0xEB, + 0xBC, 0xE6, 0x8D, 0xED, 0xA4, 0xDC, 0x58, 0xF2, 0x73, 0xEA, 0x9D, 0xFC, + 0x91, 0xFC, 0x30, 0x07, 0xFA, 0x01, 0x40, 0x0C, 0x65, 0x03, 0xC2, 0x13, + 0x14, 0xFD, 0x5D, 0x15, 0x2F, 0xFA, 0x19, 0x12, 0xB4, 0x08, 0xA6, 0x14, + 0xEE, 0x1F, 0x21, 0x15, 0x39, 0x2C, 0x43, 0x13, 0x9C, 0x2C, 0xF5, 0x14, + 0xE6, 0x2A, 0x3C, 0x14, 0x00, 0x20, 0xBD, 0x11, 0xD4, 0x16, 0xE3, 0x16, + 0xF7, 0x1A, 0x08, 0x20, 0x4A, 0x22, 0x86, 0x2C, 0xCE, 0x2C, 0x5C, 0x3D, + 0x3A, 0x42, 0xCE, 0x46, 0x27, 0x58, 0x08, 0x48, 0x9D, 0x5B, 0xA3, 0x4C, + 0x4B, 0x4D, 0x96, 0x4F, 0x10, 0x3F, 0xE1, 0x45, 0xB7, 0x42, 0x11, 0x3C, + 0xCA, 0x50, 0xA0, 0x32, 0x91, 0x56, 0xC0, 0x23, 0x57, 0x4E, 0xCE, 0x22, + 0x08, 0x3D, 0x22, 0x2E, 0xF5, 0x34, 0xF9, 0x34, 0x07, 0x2D, 0x89, 0x2E, + 0xC6, 0x20, 0xA9, 0x27, 0x48, 0x21, 0xE9, 0x27, 0x67, 0x17, 0x17, 0x1D, + 0x17, 0x01, 0x9F, 0x18, 0xFE, 0x06, 0xCA, 0x2D, 0x17, 0x13, 0x9B, 0x3A, + 0xB6, 0x04, 0x33, 0x36, 0xD9, 0x05, 0x19, 0x44, 0xEE, 0x16, 0xAE, 0x48, + 0xFA, 0x16, 0x2C, 0x2C, 0x46, 0x10, 0x2E, 0x13, 0xC0, 0x08, 0x40, 0x04, + 0xE1, 0xFD, 0xC7, 0xF5, 0x2C, 0x02, 0xB1, 0xF1, 0x4C, 0x1C, 0x91, 0xF9, + 0xAB, 0x27, 0xE2, 0xFD, 0xFC, 0x24, 0x26, 0x06, 0xCC, 0x24, 0x43, 0x0C, + 0xC3, 0x23, 0x67, 0x0C, 0xBD, 0x21, 0x4B, 0x15, 0xB4, 0x19, 0x4B, 0x23, + 0x5A, 0x10, 0x46, 0x2C, 0x31, 0x10, 0x73, 0x2E, 0x6A, 0x12, 0xF9, 0x2E, + 0xA6, 0x0F, 0xD4, 0x29, 0x87, 0x16, 0xC9, 0x29, 0xA1, 0x1F, 0x26, 0x31, + 0xF1, 0x18, 0xE3, 0x2B, 0xE3, 0x17, 0xE0, 0x26, 0x41, 0x1D, 0x9C, 0x28, + 0x2A, 0x0C, 0x99, 0x1B, 0xDC, 0xF7, 0x4D, 0x0B, 0xFC, 0xF2, 0x54, 0x08, + 0xEF, 0xEC, 0xC0, 0x09, 0xF9, 0xF4, 0xBE, 0x15, 0x4F, 0x0F, 0xD5, 0x22, + 0x71, 0x1A, 0xE9, 0x1E, 0xF9, 0x0F, 0x4B, 0x16, 0x3B, 0x04, 0xBB, 0x0A, + 0x8F, 0x04, 0x04, 0xFE, 0xEB, 0x02, 0xC0, 0xF5, 0xC3, 0xFB, 0x06, 0xF7, + 0x22, 0xF4, 0xE5, 0xF9, 0x37, 0xF1, 0x00, 0xF7, 0x5E, 0xFC, 0xEA, 0xFA, + 0x35, 0x05, 0x84, 0x01, 0xAD, 0x00, 0x55, 0xFB, 0xFB, 0x02, 0x60, 0xF4, + 0xF9, 0x0E, 0x06, 0xFD, 0x79, 0x15, 0x53, 0x03, 0x69, 0x15, 0xF3, 0xF9, + 0xEC, 0x0F, 0xD9, 0xF2, 0x79, 0x08, 0xC9, 0xF6, 0x75, 0xFD, 0xF1, 0xF9, + 0x05, 0xFA, 0xFB, 0x02, 0x28, 0x07, 0xF2, 0x10, 0xD8, 0x09, 0xC6, 0x0D, + 0x1F, 0xFD, 0x16, 0x00, 0x49, 0xF8, 0xE3, 0xFC, 0x4D, 0xF5, 0x29, 0xFE, + 0xA8, 0xE8, 0x63, 0xFA, 0xD0, 0xE0, 0xF1, 0xF5, 0xE2, 0xE2, 0x1B, 0xF1, + 0x36, 0xE5, 0xF0, 0xE9, 0xB7, 0xEB, 0x71, 0xDF, 0x28, 0xF1, 0x45, 0xD2, + 0x7D, 0xEC, 0x0E, 0xD2, 0xBA, 0xEB, 0x37, 0xDE, 0xDA, 0xE9, 0x92, 0xDD, + 0xCF, 0xDC, 0x93, 0xD5, 0x96, 0xDA, 0xC3, 0xD7, 0x5D, 0xE1, 0xB5, 0xDF, + 0xBC, 0xDE, 0xC2, 0xE3, 0x22, 0xDD, 0x06, 0xE7, 0x3E, 0xDD, 0xB6, 0xF1, + 0xE2, 0xD9, 0x05, 0xFC, 0x33, 0xE5, 0x19, 0x01, 0x51, 0xF7, 0xC2, 0x04, + 0xA9, 0xF0, 0x15, 0x02, 0xFA, 0xE7, 0xF9, 0xFC, 0xDE, 0xF8, 0x8D, 0xF9, + 0x5C, 0x0C, 0x54, 0xF9, 0xEB, 0x0F, 0xE8, 0x01, 0x15, 0x07, 0x29, 0x03, + 0x57, 0x00, 0x05, 0xF6, 0x3E, 0x00, 0x73, 0xF0, 0xFF, 0x04, 0xFC, 0xFB, + 0x86, 0x0C, 0x1E, 0x07, 0x7A, 0x0D, 0x80, 0x0D, 0x6C, 0x12, 0xE6, 0x19, + 0x87, 0x1D, 0x62, 0x22, 0x8F, 0x11, 0xB5, 0x1B, 0x5A, 0xFE, 0xE5, 0x19, + 0x50, 0x00, 0x54, 0x1E, 0x08, 0x02, 0xF2, 0x10, 0xCC, 0x02, 0xE0, 0x00, + 0xB5, 0x14, 0x31, 0x04, 0xA7, 0x25, 0xDE, 0x0B, 0x66, 0x1F, 0xCB, 0x07, + 0x0B, 0x19, 0xAE, 0x0C, 0xA2, 0x1D, 0x4C, 0x1B, 0x8E, 0x16, 0xF4, 0x1D, + 0x46, 0x11, 0xB8, 0x20, 0x40, 0x12, 0x7D, 0x21, 0x00, 0x08, 0xBC, 0x13, + 0x7A, 0xFF, 0x3F, 0x04, 0x52, 0x04, 0x2E, 0x00, 0xF2, 0x03, 0x04, 0x03, + 0x86, 0xFA, 0x36, 0x09, 0x67, 0xF6, 0xD0, 0x11, 0x99, 0xF7, 0xFE, 0x1B, + 0x2E, 0xF4, 0x00, 0x1D, 0x69, 0xF0, 0x93, 0x0D, 0x39, 0xF0, 0xE9, 0xF3, + 0xC9, 0xE8, 0x17, 0xDA, 0x90, 0xE5, 0x47, 0xD1, 0x87, 0xEB, 0xF1, 0xCF, + 0xBC, 0xF1, 0x4E, 0xD0, 0x77, 0xF7, 0x91, 0xDB, 0x0E, 0xF5, 0xE4, 0xE1, + 0x81, 0xF0, 0x9A, 0xE1, 0x58, 0xEF, 0x04, 0xE4, 0x99, 0xE9, 0x73, 0xE7, + 0x54, 0xDF, 0x6B, 0xEA, 0xF9, 0xD9, 0xF9, 0xE4, 0xDC, 0xDB, 0xE4, 0xD6, + 0x89, 0xE1, 0x4F, 0xCE, 0x42, 0xEC, 0x31, 0xD5, 0x72, 0xF3, 0x0E, 0xDD, + 0x3D, 0xFB, 0xB9, 0xE5, 0x57, 0x07, 0xAF, 0xF5, 0x14, 0x0A, 0x91, 0xFC, + 0x2C, 0x07, 0x4F, 0xFE, 0x5F, 0x03, 0x3C, 0x04, 0xB4, 0xF7, 0xDF, 0x01, + 0x17, 0xF4, 0x05, 0xF9, 0xD6, 0x02, 0x6C, 0x00, 0x6C, 0x0D, 0x77, 0x11, + 0x80, 0x0E, 0x31, 0x14, 0xB7, 0x0E, 0xC0, 0x12, 0x60, 0x11, 0x0B, 0x1F, + 0x40, 0x0B, 0x8F, 0x21, 0x95, 0xEF, 0xDF, 0x0B, 0x53, 0xDA, 0x25, 0xFC, + 0x82, 0xD7, 0xDF, 0xF9, 0xF3, 0xD1, 0xDE, 0xF3, 0x0F, 0xD4, 0x0E, 0xEB, + 0x11, 0xE1, 0xF5, 0xE0, 0xC4, 0xE5, 0xBC, 0xDA, 0x33, 0xE6, 0x75, 0xDC, + 0x5D, 0xF6, 0x1B, 0xE3, 0x72, 0x03, 0xB9, 0xE1, 0x07, 0xFC, 0x22, 0xD4, + 0x01, 0xF5, 0x37, 0xCD, 0x35, 0xEC, 0x74, 0xC8, 0x97, 0xD6, 0xAD, 0xB8, + 0xDE, 0xCF, 0xCE, 0xB6, 0xD2, 0xD5, 0x56, 0xBC, 0xC0, 0xCC, 0x3C, 0xB2, + 0x73, 0xC8, 0x4F, 0xB2, 0x62, 0xCC, 0x69, 0xBE, 0xDF, 0xCB, 0xD3, 0xC5, + 0xF0, 0xD5, 0x32, 0xD4, 0x60, 0xDD, 0xD8, 0xE5, 0xB3, 0xCD, 0xE8, 0xE1, + 0xB8, 0xC2, 0xC6, 0xD1, 0x9D, 0xC4, 0x0F, 0xCE, 0x78, 0xC0, 0xD6, 0xCD, + 0xA4, 0xD3, 0xBC, 0xD6, 0x43, 0xF7, 0x51, 0xE9, 0xA3, 0x01, 0x07, 0xF5, + 0x77, 0x04, 0xCB, 0x04, 0x4F, 0xFD, 0xEF, 0x0B, 0x89, 0xE4, 0x9D, 0x01, + 0x8D, 0xD6, 0x80, 0xF5, 0x19, 0xDD, 0xB9, 0xE8, 0x41, 0xEC, 0x6F, 0xDF, + 0xAA, 0xF4, 0x46, 0xE1, 0x33, 0xF7, 0xCD, 0xEE, 0x0A, 0xF0, 0xEA, 0xF5, + 0xD3, 0xF0, 0x83, 0xFD, 0x3C, 0x01, 0xAE, 0x0F, 0x36, 0x08, 0x5D, 0x19, + 0xB9, 0x05, 0x91, 0x14, 0x87, 0x0B, 0xB8, 0x13, 0xAF, 0x11, 0x5E, 0x08, + 0xA3, 0x08, 0x05, 0xF6, 0x3F, 0xFA, 0xFF, 0xF9, 0x7C, 0xF4, 0xD6, 0xF9, + 0xF8, 0xF8, 0x64, 0xF1, 0x58, 0x03, 0x50, 0xF6, 0xBA, 0x1A, 0x65, 0x0A, + 0x7C, 0x25, 0x0E, 0x1A, 0x96, 0x07, 0xE7, 0x1C, 0x22, 0xEE, 0x3C, 0x1D, + 0x2B, 0xFB, 0x00, 0x27, 0x0F, 0x07, 0x53, 0x23, 0x53, 0x0F, 0xF0, 0x0A, + 0x46, 0x25, 0x9B, 0x06, 0xE2, 0x2F, 0x45, 0x0A, 0xEB, 0x2B, 0x34, 0x02, + 0x90, 0x2E, 0x18, 0x02, 0x2C, 0x2B, 0x42, 0x09, 0xF4, 0x19, 0xCD, 0x05, + 0xCA, 0x0D, 0xEA, 0xFD, 0x66, 0x07, 0xE8, 0xF2, 0x64, 0x06, 0xFA, 0xE8, + 0xF2, 0xF9, 0xAA, 0xEA, 0x13, 0xE6, 0x0E, 0xEA, 0x02, 0xE7, 0x0A, 0xF2, + 0xC3, 0xEA, 0x35, 0x00, 0xB4, 0xED, 0x60, 0x0B, 0x34, 0xFB, 0x9A, 0x1F, + 0xD7, 0x04, 0x80, 0x29, 0xDF, 0x0D, 0x08, 0x1D, 0xC0, 0x12, 0x09, 0x05, + 0x5E, 0x0F, 0x06, 0xEF, 0x31, 0x0D, 0xC3, 0xE8, 0x91, 0x06, 0x4A, 0xEF, + 0x23, 0x0A, 0x8F, 0xFA, 0xA9, 0x15, 0x34, 0x04, 0xC1, 0x1F, 0x11, 0x16, + 0xD3, 0x26, 0x87, 0x25, 0x5C, 0x2B, 0x51, 0x29, 0x58, 0x2D, 0xC0, 0x2B, + 0x91, 0x24, 0x94, 0x24, 0x7E, 0x1F, 0x2E, 0x14, 0x48, 0x17, 0xAB, 0xFA, + 0x67, 0x06, 0x8D, 0xEB, 0x6E, 0x02, 0x84, 0xF1, 0xDA, 0x06, 0x6C, 0xF8, + 0xFA, 0x0C, 0x51, 0x05, 0x5D, 0x19, 0xD8, 0x1C, 0xE5, 0x0D, 0xCC, 0x19, + 0xF2, 0x07, 0xAB, 0x11, 0x2F, 0x06, 0x36, 0x0F, 0x1B, 0xF0, 0x1F, 0x04, + 0xCB, 0xE8, 0xBC, 0xFF, 0x68, 0xED, 0xF3, 0x03, 0xE8, 0xEE, 0xA7, 0x0F, + 0x23, 0xF3, 0xD8, 0x10, 0x60, 0xFE, 0x9A, 0x0D, 0x16, 0x09, 0x64, 0x17, + 0xAC, 0x12, 0x6A, 0x24, 0x80, 0x14, 0xE1, 0x21, 0xA1, 0x19, 0xBB, 0x1D, + 0xA9, 0x19, 0xED, 0x1D, 0x37, 0x06, 0x4E, 0x15, 0x89, 0xF7, 0xDA, 0x04, + 0xC1, 0xFB, 0x4B, 0xFE, 0xAE, 0x03, 0x4D, 0x0A, 0x19, 0x13, 0x40, 0x1A, + 0x4F, 0x21, 0x6D, 0x21, 0x82, 0x1D, 0x19, 0x1E, 0xD4, 0x1F, 0xC6, 0x16, + 0xF2, 0x1C, 0xBC, 0x05, 0x37, 0x05, 0x8F, 0xF0, 0xA6, 0xF8, 0x59, 0xEC, + 0x5E, 0xEE, 0x21, 0xE7, 0x0F, 0xE2, 0xE7, 0xDF, 0x8F, 0xF7, 0xBD, 0xE9, + 0xE5, 0x02, 0x9C, 0xF2, 0xBE, 0xF3, 0x3C, 0xFA, 0x39, 0xEF, 0x6B, 0xFD, + 0xF3, 0xEE, 0xE7, 0xF5, 0x7C, 0xE9, 0xFD, 0xEA, 0xD7, 0xDA, 0x4A, 0xDC, + 0x62, 0xD0, 0x3A, 0xCE, 0x97, 0xCC, 0x45, 0xBF, 0xFC, 0xCF, 0xC7, 0xBE, + 0x60, 0xDA, 0x1F, 0xCE, 0xDA, 0xE8, 0xCF, 0xDD, 0x13, 0xF6, 0x3D, 0xEF, + 0x6E, 0xFB, 0xD7, 0x03, 0x82, 0xF6, 0xC0, 0x07, 0x2F, 0xED, 0xA8, 0xFD, + 0x2F, 0xEE, 0x7A, 0xF8, 0x52, 0xEE, 0xD5, 0xF0, 0xA1, 0xE2, 0xD6, 0xE1, + 0xB0, 0xE5, 0x04, 0xE1, 0x31, 0xF9, 0x3F, 0xF1, 0x41, 0x02, 0xFF, 0xF9, + 0x92, 0x05, 0xD3, 0x08, 0xBA, 0x06, 0xC5, 0x18, 0x6A, 0x01, 0xA8, 0x0E, + 0x42, 0x00, 0x6D, 0xFB, 0xDF, 0x0E, 0xB3, 0xF7, 0xF0, 0x0C, 0x8D, 0xF5, + 0xEE, 0xF9, 0x41, 0xF2, 0x87, 0xFB, 0xA3, 0xFC, 0x43, 0x12, 0xA5, 0x08, + 0x8D, 0x1A, 0xAD, 0xFE, 0x10, 0x16, 0x20, 0xFB, 0x32, 0x14, 0x22, 0x05, + 0xE4, 0xF8, 0xAC, 0xF3, 0x74, 0xDA, 0x23, 0xE1, 0x19, 0xD8, 0x27, 0xEB, + 0xD9, 0xD9, 0x17, 0xEB, 0xAB, 0xD0, 0x6F, 0xE0, 0xCA, 0xD5, 0xB9, 0xE9, + 0xB9, 0xEA, 0xB7, 0xF4, 0x5A, 0xEB, 0x52, 0xEA, 0xDE, 0xE7, 0x01, 0xE8, + 0xAF, 0xE7, 0xB6, 0xF7, 0x6C, 0xDF, 0x3D, 0xF4, 0x20, 0xD9, 0xE1, 0xE7, + 0x7B, 0xD4, 0xEF, 0xE6, 0xB1, 0xDB, 0x7D, 0xE7, 0x13, 0xDF, 0x49, 0xDE, + 0x6E, 0xDA, 0x99, 0xD7, 0x74, 0xE6, 0x06, 0xDD, 0xA5, 0xF5, 0xAF, 0xE2, + 0x17, 0xF9, 0xE7, 0xED, 0xDF, 0xFC, 0x4B, 0x05, 0x94, 0xFB, 0x55, 0x15, + 0x68, 0xF1, 0x7C, 0x13, 0x50, 0xF1, 0x43, 0x0A, 0xA0, 0xFA, 0xBD, 0x01, + 0xFF, 0x02, 0xF0, 0xFD, 0x5D, 0x10, 0xF9, 0xFB, 0x7F, 0x20, 0x5F, 0xF9, + 0x10, 0x29, 0x34, 0xFD, 0xF9, 0x2A, 0x2A, 0x05, 0xE1, 0x2C, 0x46, 0x09, + 0x4B, 0x22, 0xC7, 0x10, 0xBE, 0x09, 0xAD, 0x18, 0xC8, 0x08, 0x12, 0x1C, + 0xB3, 0x17, 0xD0, 0x1A, 0x51, 0x13, 0xAD, 0x19, 0xB7, 0x12, 0x96, 0x1C, + 0x15, 0x26, 0x48, 0x19, 0xBC, 0x2A, 0xD7, 0x11, 0x4D, 0x23, 0xEE, 0x14, + 0x69, 0x22, 0xB3, 0x1F, 0x80, 0x16, 0x2C, 0x1D, 0xEE, 0x0A, 0x14, 0x1A, + 0xB5, 0x11, 0xD5, 0x23, 0x32, 0x14, 0xCA, 0x1D, 0x03, 0x11, 0xA0, 0x0B, + 0x44, 0x12, 0xF4, 0x01, 0x1C, 0x07, 0xB0, 0xF2, 0xE6, 0xFA, 0x22, 0xEC, + 0xD7, 0x01, 0x49, 0xFD, 0xE3, 0x10, 0x05, 0x12, 0x36, 0x03, 0xF3, 0x14, + 0x0D, 0xE5, 0xBC, 0x0F, 0x3B, 0xDE, 0xDE, 0x18, 0x94, 0xD4, 0x15, 0x19, + 0x83, 0xCB, 0x39, 0x0C, 0x28, 0xD7, 0xF1, 0x00, 0xF5, 0xE6, 0x15, 0xFE, + 0x21, 0xF6, 0x32, 0x06, 0xA3, 0x08, 0x0B, 0x0B, 0x43, 0x1A, 0x43, 0x0E, + 0x24, 0x1A, 0x2F, 0x13, 0x7B, 0x0A, 0x1D, 0x0F, 0x7B, 0x0F, 0xDD, 0x09, + 0x47, 0x17, 0x2F, 0x0E, 0xAD, 0x12, 0x01, 0x14, 0x2E, 0x25, 0xE2, 0x1A, + 0x21, 0x34, 0x08, 0x22, 0x2E, 0x2E, 0xE1, 0x21, 0x6B, 0x24, 0x02, 0x18, + 0x87, 0x21, 0x3E, 0x18, 0x13, 0x2C, 0x94, 0x29, 0x54, 0x2E, 0x5A, 0x2D, + 0x50, 0x2A, 0x6B, 0x27, 0x16, 0x29, 0x38, 0x25, 0x04, 0x1D, 0xFC, 0x16, + 0x3E, 0x0F, 0x65, 0x06, 0x2D, 0x11, 0xCB, 0x06, 0xE7, 0x1D, 0xBC, 0x10, + 0xCA, 0x29, 0x34, 0x17, 0x66, 0x2F, 0x91, 0x1D, 0xA9, 0x1E, 0xB9, 0x21, + 0xB8, 0xFB, 0xB8, 0x19, 0x98, 0xF1, 0x3E, 0x1A, 0x09, 0xF8, 0x04, 0x1E, + 0x3D, 0xF4, 0x8A, 0x09, 0xFD, 0xFC, 0xD7, 0xF7, 0xBA, 0x0D, 0xF9, 0xF7, + 0x8E, 0x10, 0xEF, 0xF4, 0xD8, 0x02, 0xE5, 0xEE, 0x3F, 0xEB, 0x99, 0xF7, + 0x15, 0xEE, 0xBD, 0x15, 0xCA, 0xFF, 0x36, 0x29, 0xB0, 0x0A, 0xD4, 0x2A, + 0xB2, 0x10, 0x02, 0x1A, 0xD4, 0x0B, 0xCB, 0xF1, 0x7F, 0x0B, 0xDC, 0xDF, + 0x99, 0x09, 0x8F, 0xE7, 0xC3, 0x03, 0x93, 0xE5, 0xF5, 0x0A, 0x58, 0xE4, + 0x0E, 0x1B, 0xE8, 0xEE, 0x78, 0x17, 0x07, 0xF5, 0x08, 0xFE, 0x07, 0xEE, + 0x76, 0xEC, 0xA6, 0xEF, 0x9B, 0xEB, 0x8F, 0x04, 0x15, 0x04, 0x18, 0x1F, + 0xAC, 0x1F, 0xE0, 0x2F, 0x01, 0x25, 0x32, 0x31, 0xF3, 0x22, 0xB9, 0x28, + 0x5F, 0x23, 0x4D, 0x16, 0x50, 0x1F, 0x73, 0x0D, 0x23, 0x0B, 0x55, 0x12, + 0xB9, 0x03, 0xD9, 0x16, 0x08, 0x01, 0x1E, 0x0D, 0xDB, 0xFB, 0x0F, 0x00, + 0x40, 0xF2, 0xE4, 0xED, 0x44, 0xDD, 0x9C, 0xD5, 0xBB, 0xD7, 0x91, 0xD0, + 0x12, 0xDD, 0xAE, 0xD9, 0x88, 0xED, 0xE3, 0xEB, 0x16, 0xF8, 0xA5, 0xFE, + 0xE1, 0xEA, 0x58, 0x05, 0x09, 0xD8, 0xC1, 0xFE, 0x9D, 0xC8, 0xFF, 0xF9, + 0x7F, 0xD3, 0xC7, 0x08, 0x62, 0xF3, 0x87, 0x13, 0xCA, 0x04, 0x1A, 0x0C, + 0x34, 0x07, 0xA9, 0x04, 0xA3, 0x0D, 0xFC, 0xF8, 0x89, 0x24, 0xAC, 0xF3, + 0xCB, 0x31, 0x68, 0x04, 0x19, 0x2B, 0x44, 0x19, 0xFA, 0x1C, 0x10, 0x16, + 0x4E, 0x19, 0x33, 0x12, 0x7E, 0x24, 0x71, 0x20, 0x74, 0x13, 0x15, 0x06, + 0x8F, 0x03, 0x1F, 0xE2, 0x3E, 0x1A, 0xCD, 0xEE, 0x79, 0x27, 0xA3, 0x07, + 0x5C, 0x28, 0xD6, 0x1D, 0xD6, 0x2B, 0x2A, 0x24, 0x19, 0x16, 0xD1, 0x0A, + 0x16, 0xF3, 0x85, 0xFA, 0x5C, 0xE9, 0x76, 0x02, 0xD9, 0xE2, 0x42, 0xF9, + 0x85, 0xC7, 0x78, 0xE7, 0xA1, 0xC6, 0x76, 0xF1, 0x52, 0xE4, 0x4F, 0x00, + 0x74, 0xEA, 0x46, 0xF8, 0xF4, 0xD7, 0xD9, 0xE8, 0xFF, 0xD1, 0x97, 0xE0, + 0xE1, 0xE2, 0xB9, 0xE6, 0xCA, 0xFE, 0x47, 0x08, 0x91, 0x02, 0xDB, 0x20, + 0x9F, 0xF6, 0x63, 0x15, 0xD1, 0xF0, 0xF3, 0xF7, 0x3A, 0xEE, 0x1E, 0xE5, + 0x5A, 0xFC, 0xD8, 0xEA, 0x24, 0x06, 0x3E, 0xEF, 0xC9, 0x05, 0x8E, 0xF4, + 0xF9, 0x0A, 0x4C, 0x07, 0x37, 0x07, 0xAB, 0x0F, 0x6E, 0xF0, 0x20, 0x00, + 0xE6, 0xE9, 0x10, 0xEC, 0x5B, 0xF5, 0xA1, 0xE1, 0xB7, 0xF5, 0xA9, 0xE1, + 0xCA, 0xFB, 0x8B, 0xEB, 0xDA, 0x0F, 0xA7, 0xFB, 0x3F, 0x10, 0xB2, 0xFD, + 0x3A, 0x04, 0x2F, 0xF7, 0x61, 0x0C, 0x98, 0x06, 0xD7, 0x2C, 0x11, 0x2B, + 0x67, 0x3E, 0xBA, 0x42, 0x73, 0x31, 0x87, 0x40, 0xF2, 0x2C, 0x8E, 0x38, + 0xCB, 0x2B, 0x7F, 0x31, 0xA5, 0x29, 0x0F, 0x36, 0x64, 0x26, 0x42, 0x3D, + 0x86, 0x1F, 0x07, 0x27, 0xA9, 0x18, 0x80, 0x08, 0x23, 0x1F, 0xAF, 0x0B, + 0x3B, 0x1F, 0xA1, 0x07, 0x24, 0x07, 0x6C, 0xF3, 0x61, 0xFA, 0x9E, 0xF2, + 0xD5, 0x01, 0x84, 0x04, 0x20, 0x07, 0xB1, 0x23, 0xE9, 0xFE, 0xA4, 0x26, + 0xF6, 0xF2, 0x68, 0x04, 0xEC, 0xEA, 0x0A, 0xE3, 0x96, 0xE6, 0xC8, 0xCD, + 0x0D, 0xE3, 0xBC, 0xBA, 0xE3, 0xE1, 0xD5, 0xAF, 0xE0, 0xD1, 0x08, 0xC2, + 0xA4, 0xC2, 0xB9, 0xDD, 0xEE, 0xCB, 0xF9, 0xE5, 0x86, 0xE0, 0xAB, 0xE7, + 0x61, 0xE1, 0x75, 0xDA, 0x04, 0xDE, 0x7B, 0xD1, 0x94, 0xF4, 0xA8, 0xE5, + 0x11, 0x00, 0x24, 0xF9, 0x39, 0xFB, 0x2E, 0xFB, 0xB8, 0x02, 0x91, 0xF1, + 0x32, 0x0A, 0x41, 0xF3, 0xE7, 0x05, 0x3E, 0xF9, 0x3C, 0x01, 0x40, 0xF9, + 0x32, 0xF9, 0x8B, 0xFB, 0xC5, 0xEF, 0x3E, 0xF6, 0x37, 0xE1, 0xD5, 0xEF, + 0x34, 0xD0, 0x7F, 0xE7, 0x66, 0xCA, 0xBA, 0xD1, 0x0E, 0xCF, 0x12, 0xC1, + 0xCA, 0xCE, 0x53, 0xC3, 0x94, 0xD3, 0x1C, 0xD9, 0xD8, 0xE7, 0xEB, 0xF1, + 0xCF, 0xF4, 0x87, 0xFC, 0x99, 0xF3, 0x29, 0xF7, 0xD1, 0xEC, 0x35, 0xEA, + 0x0A, 0xF1, 0x39, 0xFA, 0x49, 0xFE, 0x0A, 0x1C, 0xD6, 0x05, 0xA6, 0x24, + 0xF4, 0x07, 0x7D, 0x20, 0xC2, 0x00, 0xBB, 0x17, 0x16, 0xFA, 0x00, 0x16, + 0xAF, 0x0A, 0x60, 0x21, 0x20, 0x24, 0x8C, 0x21, 0xCE, 0x1F, 0x6C, 0x13, + 0x5C, 0xFE, 0xD5, 0x01, 0xE4, 0xE5, 0x0F, 0x00, 0xE8, 0xD2, 0x2E, 0xFB, + 0x84, 0xBD, 0xF8, 0xD8, 0xE7, 0xC5, 0x48, 0xC8, 0x70, 0xE3, 0x77, 0xD9, + 0xD4, 0xFC, 0xDD, 0xF0, 0x13, 0x09, 0xC0, 0xFC, 0x3A, 0x01, 0xC3, 0xF0, + 0xAB, 0xF4, 0x2F, 0xE0, 0x88, 0xEA, 0xCE, 0xCF, 0xEC, 0xE1, 0xEE, 0xC0, + 0x07, 0xDB, 0xDA, 0xB8, 0x02, 0xDF, 0x22, 0xB9, 0x32, 0xE9, 0x1A, 0xC0, + 0xBF, 0xF2, 0x4D, 0xC9, 0x0E, 0xFB, 0x9D, 0xD3, 0x7C, 0xF1, 0x8C, 0xD0, + 0xFB, 0xE9, 0x25, 0xD6, 0xCC, 0x03, 0x74, 0x07, 0xD2, 0x30, 0x80, 0x3A, + 0x9E, 0x3E, 0x66, 0x36, 0x0F, 0x25, 0x1F, 0x1B, 0xDB, 0x1B, 0x9C, 0x12, + 0xCE, 0x26, 0x7B, 0x0F, 0x7B, 0x11, 0xE6, 0xFD, 0x42, 0xFA, 0xD2, 0xFA, + 0x63, 0x07, 0x0A, 0x0E, 0x16, 0x10, 0x43, 0x16, 0xAD, 0x02, 0x4B, 0x16, + 0xE5, 0xEE, 0x74, 0x12, 0x41, 0xDB, 0xA2, 0xFB, 0xCF, 0xDF, 0x76, 0xEE, + 0x40, 0xF0, 0xC7, 0xF4, 0xC4, 0xF6, 0x8C, 0xF9, 0x59, 0xF4, 0x72, 0xF1, + 0x42, 0xE0, 0x32, 0xDF, 0xC7, 0xD7, 0x1E, 0xE8, 0x0F, 0xF6, 0x9D, 0x02, + 0xA2, 0x29, 0x10, 0x11, 0x7C, 0x3A, 0xDB, 0x14, 0x13, 0x28, 0xF8, 0x18, + 0x3E, 0x1D, 0x4A, 0x21, 0xED, 0x1F, 0x2C, 0x25, 0xEF, 0x2D, 0xA6, 0x2C, + 0xF8, 0x2D, 0x09, 0x28, 0x43, 0x16, 0xF2, 0x0D, 0x2A, 0x02, 0x34, 0x0B, + 0x78, 0xF7, 0xCD, 0x14, 0x3D, 0xFA, 0x72, 0x03, 0xB7, 0x0D, 0x80, 0xF9, + 0x1D, 0x1D, 0x60, 0x0B, 0x15, 0x28, 0x02, 0x21, 0x73, 0x2F, 0xF3, 0x26, + 0xA8, 0x25, 0xBB, 0x19, 0x5B, 0x1A, 0x67, 0x09, 0xA1, 0x10, 0x94, 0xF9, + 0xE2, 0xFA, 0xAE, 0xF1, 0x5E, 0xE0, 0x8F, 0xEF, 0xC0, 0xD3, 0x6F, 0xEB, + 0x0A, 0xDD, 0x77, 0xF9, 0x1D, 0xF4, 0x7C, 0x19, 0x7A, 0x02, 0x25, 0x27, + 0x24, 0xFD, 0x13, 0x12, 0x30, 0xF6, 0x23, 0xF9, 0xCD, 0x03, 0xF6, 0xFC, + 0x44, 0x1E, 0xAE, 0x0E, 0x79, 0x27, 0x3D, 0x17, 0x80, 0x11, 0xF9, 0x0E, + 0xA1, 0x05, 0xBC, 0x08, 0xAF, 0x10, 0xE3, 0x18, 0x1C, 0x04, 0x36, 0x20, + 0x84, 0x02, 0x68, 0x16, 0x29, 0x22, 0xB4, 0x09, 0x1F, 0x2C, 0xD2, 0x00, + 0x67, 0x14, 0x47, 0xFD, 0xB2, 0xEA, 0xB8, 0xE5, 0x58, 0xC6, 0x3F, 0xC7, + 0xA8, 0xB7, 0x27, 0xBF, 0x8A, 0xC2, 0x63, 0xCC, 0x2B, 0xD7, 0x87, 0xDE, + 0xDD, 0xDB, 0x51, 0xE6, 0xC2, 0xD4, 0x3A, 0xE0, 0x3D, 0xDC, 0x84, 0xE5, + 0xBC, 0xFC, 0x8D, 0x01, 0x59, 0x1E, 0x65, 0x1D, 0xB8, 0x1A, 0x90, 0x1B, + 0xC1, 0x0B, 0x54, 0x0B, 0x10, 0x0F, 0xEA, 0x05, 0x38, 0x11, 0xBE, 0xFF, + 0xAF, 0x15, 0x9B, 0x08, 0x3B, 0x19, 0x5F, 0x16, 0x81, 0x10, 0x19, 0x08, + 0xF7, 0xF9, 0x04, 0xF3, 0xF1, 0xED, 0x4D, 0xF3, 0xD4, 0xF5, 0x25, 0xF0, + 0x69, 0xF0, 0x8E, 0xD8, 0x66, 0xE6, 0x96, 0xD0, 0x98, 0xEE, 0x7B, 0xE7, + 0x8C, 0xF6, 0xD5, 0xF9, 0xD1, 0xF0, 0x5B, 0xF7, 0xCA, 0xE4, 0x4E, 0xEE, + 0x7E, 0xD2, 0x0C, 0xE4, 0x23, 0xC7, 0x43, 0xE4, 0xCA, 0xC4, 0x98, 0xDA, + 0x47, 0xB7, 0x54, 0xC0, 0xC1, 0xB2, 0xB0, 0xBA, 0x92, 0xD8, 0x86, 0xCD, + 0x19, 0x05, 0x9C, 0xE2, 0x8B, 0x08, 0xB5, 0xF1, 0xC0, 0xF9, 0xAF, 0xF6, + 0x61, 0xFE, 0x89, 0xFC, 0x95, 0x0E, 0x9D, 0x15, 0x6D, 0x1C, 0xBA, 0x36, + 0x4D, 0x1D, 0x04, 0x31, 0x84, 0x10, 0x19, 0x0A, 0xB0, 0x02, 0xC2, 0xFF, + 0x4A, 0xF7, 0x42, 0x07, 0x3C, 0x04, 0x70, 0x08, 0x89, 0x14, 0x6F, 0x06, + 0x70, 0x09, 0x5B, 0x05, 0xF5, 0xF1, 0x00, 0x01, 0x69, 0xE5, 0x0E, 0xEB, + 0xB4, 0xED, 0xE5, 0xD5, 0xAD, 0xE6, 0x9F, 0xC3, 0xC1, 0xD2, 0xD3, 0xBA, + 0xB2, 0xCF, 0x5E, 0xC5, 0xC4, 0xDD, 0xDC, 0xD6, 0x24, 0xE2, 0xC5, 0xE1, + 0x53, 0xDE, 0x6D, 0xE9, 0x68, 0xF1, 0xDB, 0xFC, 0xF0, 0x0F, 0x29, 0x1C, + 0x8E, 0x1F, 0xEA, 0x30, 0x34, 0x1E, 0x32, 0x26, 0xAB, 0x1F, 0xA8, 0x1A, + 0xEA, 0x1D, 0x8C, 0x1C, 0x7E, 0x24, 0x9D, 0x30, 0xCC, 0x44, 0x54, 0x55, + 0xE9, 0x4A, 0xCE, 0x53, 0xD8, 0x24, 0x15, 0x31, 0x49, 0x15, 0xEC, 0x28, + 0x11, 0x24, 0x19, 0x2B, 0x8A, 0x1D, 0x4A, 0x13, 0x74, 0x07, 0x38, 0x01, + 0xEC, 0x09, 0x87, 0x11, 0xE1, 0x1D, 0xE6, 0x18, 0x88, 0x24, 0xF0, 0x08, + 0x62, 0x19, 0xAB, 0xFB, 0x7B, 0x01, 0x03, 0xF1, 0x6F, 0xEE, 0xB7, 0xF2, + 0xE1, 0xE4, 0x6F, 0xF8, 0x79, 0xD6, 0xD3, 0xEE, 0xE5, 0xD1, 0xC5, 0xE1, + 0x3C, 0xE5, 0x55, 0xE6, 0x75, 0xF8, 0xC3, 0xF4, 0xB6, 0x00, 0x7F, 0x00, + 0x6B, 0x09, 0x02, 0x09, 0x44, 0x0B, 0x89, 0x09, 0x27, 0x18, 0x3E, 0x1B, + 0x56, 0x3C, 0x6E, 0x41, 0x26, 0x4E, 0xCC, 0x45, 0xCE, 0x3F, 0x8D, 0x27, + 0x87, 0x2D, 0x29, 0x22, 0xDC, 0x1E, 0xD3, 0x29, 0x06, 0x10, 0xF9, 0x1F, + 0x83, 0x15, 0xA5, 0x20, 0xFD, 0x20, 0xD3, 0x26, 0x23, 0x1B, 0x2F, 0x1E, + 0xC4, 0x0F, 0x29, 0x0E, 0x54, 0x10, 0xEB, 0x0D, 0x26, 0x18, 0x3F, 0x0F, + 0xB2, 0x17, 0x5A, 0x0C, 0x6F, 0x07, 0x22, 0x13, 0x65, 0xF8, 0xF8, 0x0E, + 0xCE, 0x06, 0xD3, 0x03, 0xB7, 0x16, 0xA1, 0xF3, 0xFB, 0x22, 0x2B, 0xF8, + 0x8D, 0x40, 0x4B, 0x21, 0x5C, 0x56, 0x3F, 0x45, 0x98, 0x53, 0xB6, 0x4B, + 0x45, 0x44, 0x98, 0x42, 0x6D, 0x26, 0xD3, 0x30, 0x1B, 0x16, 0x4B, 0x36, + 0x36, 0x23, 0xF4, 0x4E, 0x05, 0x1A, 0x2C, 0x3F, 0x2E, 0xFB, 0x81, 0x1B, + 0xAC, 0xF4, 0x9F, 0x07, 0xF5, 0xF8, 0xDD, 0xFB, 0x2F, 0xF6, 0x41, 0xF4, + 0xFB, 0xFA, 0xA4, 0xF3, 0x40, 0x0B, 0x8E, 0xFF, 0xE5, 0x0D, 0xFB, 0x09, + 0xDA, 0x01, 0xC5, 0x12, 0x37, 0xFA, 0x54, 0x0B, 0xC3, 0xEB, 0x9B, 0xF1, + 0x16, 0xCE, 0x79, 0xDF, 0x36, 0xB1, 0x51, 0xCE, 0xD9, 0xA9, 0x44, 0xC3, + 0x26, 0xBB, 0x32, 0xC6, 0x2B, 0xDD, 0x64, 0xCF, 0xCA, 0x09, 0xDF, 0xE4, + 0x22, 0x26, 0xD9, 0xFC, 0xC7, 0x20, 0x19, 0xFE, 0x33, 0x0A, 0x7C, 0xF1, + 0x0D, 0x03, 0x6C, 0xF9, 0xE9, 0x0C, 0x3E, 0x17, 0x38, 0x0E, 0x7F, 0x23, + 0x88, 0x09, 0x84, 0x1D, 0x2A, 0x13, 0x5C, 0x26, 0x44, 0x1A, 0x64, 0x26, + 0x0B, 0x10, 0xB0, 0x1C, 0xC2, 0x1A, 0xB4, 0x24, 0x1C, 0x30, 0x2C, 0x23, + 0x75, 0x28, 0x6A, 0x0D, 0xD7, 0x00, 0x66, 0xF3, 0xDF, 0xE0, 0x2A, 0xE6, + 0xE9, 0xE9, 0xE8, 0xDC, 0x35, 0xFB, 0x7E, 0xD7, 0xE3, 0xF1, 0x30, 0xDD, + 0x1E, 0xE1, 0xB8, 0xE4, 0xD3, 0xEB, 0x6C, 0xF5, 0xEA, 0xF6, 0x0C, 0xF5, + 0x32, 0x04, 0x7D, 0xF8, 0x04, 0x24, 0x05, 0x1E, 0x44, 0x2C, 0xAB, 0x31, + 0x92, 0x16, 0x67, 0x1F, 0xCF, 0x06, 0xB2, 0x0C, 0xEA, 0xFC, 0x85, 0xEE, + 0x95, 0x03, 0x81, 0xDC, 0x90, 0x1A, 0xDE, 0xF6, 0x64, 0x13, 0xA3, 0x05, + 0x2B, 0xFB, 0x5C, 0xF5, 0x00, 0xF6, 0x7E, 0xEE, 0x2E, 0xE6, 0x1F, 0xFB, + 0xCF, 0xCC, 0x98, 0xF8, 0xBC, 0xD3, 0x5F, 0xED, 0xB8, 0xE5, 0x7F, 0xEB, + 0x8B, 0xDE, 0xEC, 0xE9, 0x54, 0xD5, 0xB2, 0xF0, 0x71, 0xD5, 0x09, 0xF2, + 0xE5, 0xCE, 0x53, 0xE5, 0x2D, 0xD0, 0xF6, 0xD6, 0xFA, 0xD1, 0xBB, 0xC2, + 0x8A, 0xBD, 0x74, 0xB2, 0xC4, 0xAA, 0x89, 0xBA, 0xD4, 0xB5, 0x4E, 0xCD, + 0x9B, 0xDD, 0x19, 0xDE, 0xF9, 0xFF, 0x9B, 0xF0, 0xA7, 0x04, 0xF1, 0xF9, + 0xD9, 0xFC, 0xA0, 0xF4, 0xE0, 0x13, 0x86, 0xFB, 0x75, 0x35, 0x81, 0x17, + 0xDB, 0x33, 0x3A, 0x28, 0xC6, 0x21, 0x86, 0x27, 0xA6, 0x19, 0xEF, 0x24, + 0x98, 0x0F, 0x0E, 0x1D, 0x67, 0x06, 0x42, 0x1C, 0xD0, 0x1B, 0x5C, 0x25, + 0x7B, 0x30, 0xA8, 0x23, 0x6B, 0x20, 0xA0, 0x10, 0x7E, 0xF9, 0xC9, 0xF0, + 0xC6, 0xE6, 0x29, 0xE3, 0xAC, 0xE3, 0x7A, 0xDE, 0x76, 0xDE, 0xC5, 0xDF, + 0x98, 0xE0, 0x04, 0xEE, 0x8D, 0xDE, 0x0B, 0xF1, 0x5A, 0xDD, 0x3A, 0xF5, + 0x47, 0xDA, 0xFA, 0xFC, 0x5F, 0xEE, 0x8A, 0x06, 0x75, 0x1E, 0x4D, 0x0C, + 0x51, 0x36, 0x73, 0x0D, 0x06, 0x2A, 0xD1, 0x16, 0x78, 0x18, 0x83, 0x1A, + 0x6F, 0x0E, 0x34, 0x0E, 0x1A, 0x17, 0x51, 0x1C, 0x09, 0x2F, 0xEC, 0x3E, + 0x2C, 0x30, 0xF9, 0x37, 0x9D, 0x1D, 0xE1, 0x13, 0x05, 0x19, 0xC4, 0x0C, + 0x8D, 0x15, 0x22, 0x0D, 0xA8, 0x0A, 0x85, 0xF0, 0x8C, 0x0F, 0xC1, 0xE6, + 0xA1, 0x25, 0x78, 0xFC, 0xF1, 0x2A, 0x69, 0x0B, 0xD1, 0x22, 0x90, 0x1C, + 0xF5, 0x17, 0x73, 0x29, 0xCA, 0x09, 0xBA, 0x1C, 0x56, 0x09, 0xA1, 0x00, + 0x99, 0xF8, 0xE4, 0xE0, 0xF4, 0xCC, 0x36, 0xC9, 0xF4, 0xB7, 0x6F, 0xC6, + 0xEE, 0xD5, 0xB7, 0xD7, 0x88, 0x06, 0xC6, 0xED, 0x2F, 0x15, 0x90, 0xF9, + 0x2A, 0xFE, 0x38, 0xF2, 0xC2, 0xE9, 0xEF, 0xE7, 0x74, 0xFA, 0x60, 0xF9, + 0x53, 0x1B, 0x58, 0x1A, 0x68, 0x21, 0x38, 0x20, 0x96, 0x07, 0x37, 0x0B, + 0x1E, 0xED, 0x43, 0xF7, 0xFC, 0xE7, 0x2B, 0xF3, 0xCD, 0xEB, 0x47, 0xF9, + 0xB8, 0xE8, 0x6A, 0xFA, 0xCE, 0xE2, 0xA7, 0xF7, 0xB0, 0xE7, 0x56, 0xF3, + 0x64, 0xE4, 0x90, 0xE9, 0x73, 0xD8, 0x96, 0xDD, 0x05, 0xCD, 0xCE, 0xCD, + 0x80, 0xC8, 0xE7, 0xC0, 0x10, 0xC8, 0xFF, 0xAF, 0x32, 0xBD, 0xB7, 0xA8, + 0x39, 0xB4, 0x0B, 0xC3, 0xCC, 0xAD, 0x4F, 0xD8, 0x5C, 0xCF, 0x76, 0xF2, + 0x92, 0x10, 0x85, 0x1F, 0x67, 0x30, 0x55, 0x37, 0xD6, 0x27, 0x10, 0x2C, + 0x04, 0x18, 0xFB, 0x11, 0xDA, 0x0D, 0xC4, 0x00, 0x8E, 0x0B, 0x8A, 0x0C, + 0xAB, 0x0D, 0x6E, 0x1E, 0x4B, 0xF7, 0x63, 0x0D, 0x07, 0xDD, 0xBA, 0xED, + 0x72, 0xED, 0x5B, 0xF0, 0xD8, 0xFE, 0x89, 0xFF, 0x87, 0xEC, 0xBB, 0xF7, + 0xF6, 0xE3, 0xE6, 0xF4, 0x33, 0xFA, 0xD6, 0xF8, 0x81, 0x06, 0x73, 0xF2, + 0x82, 0xF9, 0xA3, 0xED, 0x6D, 0xE0, 0x01, 0xDF, 0x24, 0xD5, 0xBA, 0xCD, + 0x46, 0xD6, 0xC5, 0xC5, 0x2F, 0xBF, 0x1D, 0xBE, 0x96, 0xA3, 0x30, 0xBC, + 0x8C, 0xB0, 0x1A, 0xC7, 0xF2, 0xD8, 0xD6, 0xD9, 0x4B, 0xF3, 0xBA, 0xE2, + 0xD3, 0xFE, 0x7A, 0xDF, 0x3B, 0x04, 0xF6, 0xDB, 0x52, 0xFA, 0x13, 0xD8, + 0x43, 0xFC, 0x98, 0xE7, 0x8F, 0x0F, 0x9C, 0x05, 0x2C, 0x09, 0x4D, 0x03, + 0xE6, 0xF3, 0x33, 0xF3, 0xB9, 0xFC, 0xEF, 0xFB, 0xE7, 0x18, 0x33, 0x12, + 0x57, 0x27, 0xEE, 0x1F, 0xBE, 0x1C, 0xC3, 0x1A, 0x84, 0x0F, 0xDF, 0x11, + 0x6C, 0x12, 0x9E, 0x04, 0x89, 0x09, 0x90, 0xF2, 0xD9, 0xF2, 0x88, 0xF2, + 0x5C, 0xE6, 0xD1, 0xF5, 0x6C, 0xFA, 0xC2, 0xFA, 0xD8, 0x12, 0x49, 0x02, + 0x37, 0x15, 0x3F, 0x08, 0x28, 0x13, 0x30, 0x10, 0x9B, 0x15, 0x04, 0x12, + 0x1F, 0x29, 0xB8, 0x1F, 0x7F, 0x44, 0xA1, 0x3F, 0xF0, 0x55, 0xF2, 0x4D, + 0x40, 0x51, 0xD5, 0x3B, 0x27, 0x3B, 0x88, 0x2B, 0xBC, 0x2C, 0xB5, 0x2D, + 0x25, 0x39, 0x12, 0x45, 0xFD, 0x47, 0x4E, 0x5B, 0x5E, 0x3B, 0xCD, 0x4D, + 0xB2, 0x25, 0xC4, 0x2C, 0x53, 0x29, 0xAE, 0x27, 0x05, 0x25, 0x6F, 0x2D, + 0xA1, 0x02, 0xFE, 0x21, 0x1C, 0xF5, 0x53, 0x1D, 0x26, 0x08, 0x13, 0x24, + 0xEF, 0x0E, 0xF8, 0x2B, 0x4E, 0x01, 0xED, 0x2D, 0xC1, 0xFE, 0x7A, 0x19, + 0xE4, 0x08, 0xF1, 0xFF, 0x1D, 0x01, 0x5C, 0xF5, 0x6B, 0xE2, 0xBA, 0xE5, + 0x85, 0xD3, 0x08, 0xDA, 0x4D, 0xEC, 0x43, 0xE9, 0x6C, 0x0D, 0x8C, 0x05, + 0x73, 0x14, 0xA9, 0x1A, 0x0B, 0x15, 0xF4, 0x1D, 0xD6, 0x18, 0x94, 0x1B, + 0x10, 0x19, 0x6D, 0x21, 0x07, 0x30, 0xD5, 0x33, 0x0D, 0x44, 0xE2, 0x40, + 0x49, 0x2D, 0x2F, 0x29, 0x58, 0x10, 0x62, 0x08, 0x03, 0x19, 0xA2, 0x06, + 0xB6, 0x32, 0x19, 0x18, 0x1C, 0x33, 0x8C, 0x1E, 0x79, 0x27, 0x8F, 0x18, + 0xE6, 0x2A, 0x00, 0x15, 0x90, 0x23, 0x11, 0x07, 0x4D, 0x07, 0xCC, 0xF3, + 0x6D, 0xF9, 0x5C, 0xE9, 0xDE, 0xF6, 0xEC, 0xD7, 0x46, 0xF4, 0xFB, 0xD9, + 0xA5, 0xE4, 0x95, 0xEA, 0xE7, 0xD9, 0xAE, 0xF3, 0xDA, 0xDB, 0xE7, 0xF2, + 0x57, 0xE1, 0x9B, 0xF0, 0xDE, 0xF7, 0x7C, 0x05, 0x59, 0x16, 0x39, 0x1D, + 0xC0, 0x28, 0x88, 0x1A, 0x40, 0x1F, 0x47, 0x0E, 0xD9, 0x03, 0x7F, 0x04, + 0xB5, 0xE8, 0xF8, 0xF0, 0x20, 0xE9, 0xF7, 0xF4, 0x5D, 0xF6, 0xCC, 0x06, + 0x9E, 0xE4, 0x28, 0xF4, 0xA1, 0xCE, 0x23, 0xDC, 0xBB, 0xE2, 0xEE, 0xF1, + 0x36, 0xEC, 0xF5, 0xFD, 0x88, 0xD1, 0x24, 0xD9, 0xDD, 0xD2, 0x7C, 0xC7, + 0x2F, 0xE8, 0xB6, 0xDB, 0xC4, 0xE4, 0x82, 0xE7, 0x1C, 0xDE, 0x8E, 0xDF, + 0xD0, 0xE0, 0xEF, 0xD1, 0x5F, 0xE1, 0x21, 0xCC, 0x9B, 0xD8, 0xA4, 0xC1, + 0x1F, 0xCB, 0xBF, 0xAB, 0x7C, 0xC6, 0x95, 0xA6, 0x6D, 0xCB, 0xC0, 0xBA, + 0x91, 0xDA, 0xD6, 0xD6, 0x90, 0xE7, 0xC1, 0xE4, 0x43, 0xEB, 0xEF, 0xDF, + 0x78, 0xEB, 0xB7, 0xDC, 0xBB, 0xF3, 0xE8, 0xE5, 0x16, 0x0C, 0xBF, 0x01, + 0xB7, 0x13, 0x62, 0x22, 0x34, 0x00, 0x60, 0x26, 0xEE, 0xEC, 0x0B, 0x11, + 0x94, 0xE0, 0x3D, 0x03, 0x50, 0xD2, 0xD8, 0x03, 0x5B, 0xCD, 0x58, 0x00, + 0x1F, 0xD6, 0xE1, 0xEB, 0x66, 0xD9, 0x5D, 0xD7, 0xAF, 0xC6, 0x12, 0xD2, + 0x58, 0xAD, 0x6B, 0xCF, 0xA4, 0xAA, 0x14, 0xC2, 0xD2, 0xB8, 0xA8, 0xB1, + 0x3F, 0xC5, 0x32, 0xB5, 0x18, 0xC5, 0x62, 0xB8, 0x3B, 0xCD, 0xEF, 0xB9, + 0x7F, 0xD4, 0x23, 0xC0, 0x49, 0xDF, 0x4B, 0xC8, 0x03, 0xFA, 0x7B, 0xD9, + 0x29, 0x0D, 0x3F, 0xEC, 0xE4, 0x0A, 0x5A, 0xF4, 0x6B, 0x03, 0x20, 0xFA, + 0x5A, 0x01, 0x3B, 0xF3, 0x2A, 0x07, 0xE3, 0xE5, 0x08, 0x1E, 0x5C, 0xF3, + 0x5F, 0x28, 0xB3, 0xF7, 0xCF, 0x0F, 0xCA, 0xDE, 0xCA, 0xEE, 0x3B, 0xDE, + 0x4C, 0xDD, 0x8E, 0xFF, 0x73, 0xDA, 0x2F, 0x08, 0x55, 0xE8, 0x57, 0xF6, + 0x78, 0xFE, 0x3B, 0xF6, 0x9E, 0x02, 0x7C, 0x01, 0xE6, 0xF5, 0x49, 0x07, + 0xF9, 0xF4, 0x2F, 0x07, 0x8C, 0xF8, 0x6A, 0x01, 0xE9, 0xF0, 0xCC, 0xF7, + 0x3F, 0xE9, 0xC6, 0xE1, 0xC2, 0xD4, 0xA0, 0xC2, 0x96, 0xC1, 0x3C, 0xBA, + 0x8B, 0xD9, 0x3C, 0xD5, 0x89, 0x00, 0xC4, 0xF6, 0xB5, 0x0D, 0xED, 0x0A, + 0xF2, 0x04, 0xEE, 0x15, 0x2F, 0x02, 0xD6, 0x22, 0xA8, 0x15, 0xE5, 0x2F, + 0xB7, 0x2D, 0xE1, 0x3E, 0xE3, 0x30, 0x77, 0x42, 0x48, 0x27, 0xBC, 0x2B, + 0xE8, 0x26, 0xA1, 0x17, 0x20, 0x22, 0xA5, 0x1A, 0x50, 0x14, 0x4B, 0x23, + 0xAD, 0x1D, 0xC3, 0x27, 0x0A, 0x31, 0xD9, 0x28, 0x39, 0x2C, 0xD9, 0x23, + 0x31, 0x11, 0x30, 0x17, 0xD6, 0xF8, 0xD4, 0x08, 0x8E, 0xEE, 0x6C, 0xFB, + 0x8D, 0xED, 0x9F, 0xF9, 0x3B, 0xF8, 0xC3, 0x05, 0xD8, 0x02, 0xAA, 0x01, + 0x80, 0x0D, 0x00, 0x05, 0x96, 0x11, 0x04, 0x14, 0x9D, 0x28, 0x07, 0x26, + 0xF7, 0x56, 0x7F, 0x41, 0x77, 0x65, 0xFC, 0x47, 0x5A, 0x4D, 0x30, 0x39, + 0xE8, 0x3B, 0x4A, 0x34, 0x49, 0x37, 0x06, 0x2E, 0x2F, 0x37, 0xD7, 0x24, + 0x3E, 0x4B, 0xEC, 0x2E, 0x17, 0x54, 0x33, 0x2D, 0xC8, 0x32, 0xB8, 0x15, + 0xC5, 0x16, 0x0D, 0x1D, 0x1B, 0x1A, 0xF6, 0x3E, 0x27, 0x17, 0xA2, 0x3C, + 0x91, 0x0B, 0x56, 0x26, 0xE4, 0x0E, 0x69, 0x2D, 0xB4, 0x16, 0xD8, 0x32, + 0xD4, 0x12, 0x24, 0x22, 0x1B, 0x0A, 0xC6, 0x15, 0xB0, 0xFA, 0x7F, 0x0B, + 0xC5, 0xF0, 0x3D, 0x03, 0xEC, 0xF4, 0x24, 0xFD, 0xB9, 0xEB, 0x62, 0xEF, + 0x48, 0xEA, 0x68, 0xF6, 0x8A, 0x08, 0xB2, 0x10, 0xF3, 0x29, 0x92, 0x20, + 0xB8, 0x35, 0x6F, 0x22, 0xAF, 0x28, 0xAA, 0x19, 0x9E, 0x18, 0x17, 0x13, + 0x2F, 0x1A, 0xE0, 0x1B, 0x0A, 0x32, 0xAE, 0x35, 0x2D, 0x44, 0x0C, 0x32, + 0x74, 0x3B, 0x16, 0x0B, 0x71, 0x2E, 0x3D, 0xFD, 0x37, 0x21, 0xFC, 0x09, + 0xDF, 0x10, 0xA1, 0x13, 0x84, 0x18, 0xCD, 0x19, 0xD6, 0x27, 0xA0, 0x19, + 0xD1, 0x19, 0x8F, 0x0F, 0x96, 0xFD, 0xB5, 0x00, 0x92, 0xF1, 0x07, 0x02, + 0x6F, 0xE6, 0x6E, 0x0A, 0x2F, 0xDA, 0x67, 0x09, 0x31, 0xDC, 0xC5, 0x03, + 0x3E, 0xE6, 0x1B, 0xF9, 0xAD, 0xF6, 0x2B, 0xF8, 0x21, 0x03, 0xFE, 0xFD, + 0x56, 0x1F, 0x13, 0x1A, 0x87, 0x42, 0x18, 0x3F, 0xC1, 0x4B, 0x5A, 0x4A, + 0x65, 0x31, 0x73, 0x35, 0xA8, 0x11, 0x87, 0x18, 0x5A, 0x06, 0x88, 0x0B, + 0xFC, 0x13, 0x1F, 0x16, 0x00, 0x36, 0x90, 0x2F, 0x04, 0x35, 0x9E, 0x28, + 0x9C, 0x04, 0x9C, 0x01, 0xCC, 0xF2, 0x80, 0xF9, 0x0F, 0x04, 0xEE, 0x0B, + 0x80, 0xF5, 0x7D, 0xFD, 0x42, 0xDA, 0xBC, 0xE4, 0x1D, 0xD9, 0x92, 0xE9, + 0xEC, 0xE3, 0xDD, 0xF3, 0x14, 0xEB, 0x13, 0xEF, 0x18, 0xF5, 0xC9, 0xE9, + 0xC5, 0xF5, 0xE5, 0xE2, 0x85, 0xDB, 0x96, 0xCE, 0xDD, 0xBA, 0xE7, 0xBF, + 0x5C, 0xA5, 0xD6, 0xBC, 0x89, 0xA9, 0xE0, 0xC5, 0x58, 0xC3, 0xB5, 0xD7, + 0xE8, 0xDC, 0x9F, 0xE7, 0x85, 0xF1, 0xA9, 0xF3, 0x3B, 0xF3, 0xB4, 0xF5, + 0x89, 0xEB, 0x77, 0xFC, 0x96, 0xFC, 0x34, 0x15, 0x51, 0x1F, 0x38, 0x29, + 0xD5, 0x28, 0xEF, 0x13, 0x76, 0x16, 0x08, 0xEB, 0x05, 0x0B, 0x6E, 0xE1, + 0xA3, 0x0C, 0xF1, 0xF3, 0xCE, 0x08, 0x76, 0x05, 0x1E, 0xFA, 0xC4, 0x0C, + 0x73, 0xEC, 0xBD, 0x0F, 0x8E, 0xDC, 0x4B, 0x05, 0x05, 0xC9, 0xC9, 0xEB, + 0x64, 0xC8, 0xFA, 0xE1, 0x4F, 0xDC, 0x50, 0xE8, 0xA3, 0xEC, 0xC1, 0xE7, + 0x4F, 0xE5, 0xA5, 0xDA, 0x11, 0xE0, 0xF4, 0xD2, 0x4E, 0xEB, 0x54, 0xD8, + 0x20, 0xF1, 0x96, 0xDD, 0xAE, 0x01, 0x6A, 0xF8, 0xB0, 0x18, 0xFA, 0x1F, + 0xC1, 0x24, 0xC1, 0x34, 0x6C, 0x21, 0x69, 0x2D, 0x7B, 0x19, 0x23, 0x1C, + 0x67, 0x19, 0x94, 0x0D, 0x79, 0x26, 0x31, 0x05, 0x2F, 0x37, 0x11, 0x0D, + 0x7E, 0x21, 0x3B, 0x0A, 0xB1, 0xFB, 0x1E, 0xF8, 0x49, 0xFD, 0xEB, 0xF6, + 0x64, 0x0E, 0x67, 0x01, 0xA1, 0x07, 0x44, 0xF9, 0x9A, 0xFB, 0xD7, 0xF1, + 0x69, 0xFB, 0x97, 0xFA, 0x6B, 0xF7, 0x0B, 0xFE, 0xE0, 0xF2, 0xAD, 0x05, + 0x85, 0xF5, 0xCA, 0x09, 0x3C, 0xF5, 0x7C, 0xF6, 0x3D, 0xE2, 0x4C, 0xD5, + 0x9D, 0xCF, 0x6D, 0xBD, 0xBD, 0xD2, 0x89, 0xBA, 0x8C, 0xE5, 0x86, 0xD3, + 0x8D, 0xF9, 0x7B, 0xF8, 0x30, 0x01, 0xFA, 0x09, 0x2E, 0xFF, 0x55, 0x07, + 0xA9, 0xF3, 0x65, 0x01, 0x7F, 0xE3, 0x56, 0x02, 0x0C, 0xEB, 0x93, 0x12, + 0x88, 0x0D, 0x43, 0x25, 0x2D, 0x1B, 0x18, 0x1C, 0xEF, 0x07, 0xB3, 0x07, + 0x7E, 0x01, 0xC8, 0x00, 0xA7, 0x12, 0x36, 0x02, 0x86, 0x1A, 0xBB, 0x06, + 0xAE, 0x13, 0x77, 0x0C, 0x5E, 0x06, 0x9C, 0x0B, 0x71, 0xED, 0x68, 0xFB, + 0xF5, 0xD0, 0x07, 0xE2, 0xF4, 0xD2, 0xED, 0xE1, 0x1C, 0xEA, 0xE5, 0xE8, + 0xAA, 0xF2, 0x21, 0xDE, 0x7C, 0xDB, 0xF3, 0xCD, 0xBE, 0xCE, 0x5F, 0xD2, + 0x28, 0xDF, 0xA4, 0xE4, 0x6E, 0xE9, 0xA7, 0xE6, 0xDD, 0xF6, 0xEC, 0xEA, + 0xA8, 0x0C, 0x9F, 0xF3, 0x4A, 0x17, 0x7F, 0xEF, 0x8E, 0x0F, 0x9B, 0xEC, + 0x91, 0xFF, 0x0E, 0xF9, 0x07, 0xF6, 0xD3, 0x03, 0xA3, 0x01, 0x9A, 0x10, + 0xDB, 0x04, 0x3A, 0x18, 0x44, 0xE5, 0x45, 0x02, 0xF7, 0xCF, 0xE7, 0xE2, + 0xB3, 0xE5, 0xA8, 0xE2, 0x84, 0xF0, 0xB2, 0xEC, 0x47, 0xDC, 0x67, 0xE2, + 0xD3, 0xCF, 0xE3, 0xD8, 0xF4, 0xCC, 0x1C, 0xD4, 0x94, 0xC5, 0xF2, 0xCF, + 0xED, 0xC7, 0xE9, 0xD9, 0x47, 0xD6, 0x83, 0xDF, 0xF5, 0xDB, 0x15, 0xD6, + 0x5E, 0xCE, 0x68, 0xC6, 0xC2, 0xB9, 0xDF, 0xAE, 0xAC, 0xBB, 0x06, 0xAF, + 0xDA, 0xD1, 0xC6, 0xCD, 0x72, 0xE9, 0x92, 0xE9, 0xCB, 0xF5, 0x02, 0xF7, + 0x2B, 0x00, 0xBD, 0xFF, 0x75, 0x0D, 0xA6, 0x0A, 0x85, 0x18, 0xF6, 0x18, + 0x47, 0x33, 0x62, 0x27, 0x38, 0x46, 0x04, 0x20, 0x53, 0x26, 0xC2, 0xFF, + 0xFD, 0xFE, 0x94, 0xF0, 0x5A, 0x02, 0xAC, 0xF8, 0xE5, 0x16, 0x62, 0xFD, + 0x51, 0x1F, 0x4C, 0xFE, 0xF6, 0x1B, 0x18, 0x05, 0x44, 0x0D, 0x0C, 0x0B, + 0x56, 0xF1, 0x13, 0x00, 0x22, 0xDC, 0x4B, 0xFB, 0xAD, 0xD7, 0xCC, 0x06, + 0xAC, 0xDC, 0xF8, 0xFF, 0x6D, 0xE3, 0x04, 0xED, 0x56, 0xE1, 0x66, 0xDD, + 0x01, 0xF1, 0x77, 0xDD, 0xFF, 0x09, 0x6D, 0xF3, 0x17, 0x12, 0xCD, 0x12, + 0x02, 0x1B, 0xE7, 0x2D, 0xB8, 0x24, 0xA9, 0x38, 0x03, 0x24, 0x76, 0x2F, + 0xB5, 0x27, 0x3D, 0x27, 0x7D, 0x32, 0xB5, 0x30, 0xB1, 0x39, 0xA3, 0x37, + 0x50, 0x4C, 0x93, 0x41, 0xF9, 0x57, 0x7F, 0x4B, 0x33, 0x3D, 0xAE, 0x33, + 0xD2, 0x23, 0x4B, 0x14, 0xA4, 0x34, 0x86, 0x20, 0x89, 0x3E, 0xF2, 0x2E, + 0x64, 0x2C, 0x2F, 0x28, 0xDF, 0x23, 0x84, 0x34, 0xA5, 0x22, 0x41, 0x3E, + 0x57, 0x19, 0x48, 0x31, 0x0D, 0x1A, 0xE0, 0x2A, 0x5F, 0x23, 0x88, 0x26, + 0xAB, 0x1A, 0xFA, 0x11, 0x54, 0x05, 0xDB, 0xF9, 0xCA, 0xF2, 0x60, 0xE7, + 0x86, 0xEB, 0xF2, 0xE5, 0xFC, 0xFA, 0x20, 0xFC, 0x59, 0x14, 0xCC, 0x14, + 0x74, 0x14, 0xDF, 0x19, 0x05, 0x0A, 0xC4, 0x17, 0x23, 0x14, 0x7B, 0x23, + 0x5D, 0x2A, 0x05, 0x37, 0x36, 0x42, 0x80, 0x48, 0xCB, 0x49, 0xF1, 0x43, + 0xDE, 0x35, 0x5C, 0x22, 0x34, 0x1D, 0x79, 0x05, 0x29, 0x1A, 0xC2, 0x0A, + 0x9D, 0x24, 0x8B, 0x24, 0xC1, 0x2A, 0xB7, 0x33, 0x6E, 0x24, 0x4B, 0x30, + 0x29, 0x10, 0x26, 0x1E, 0xB4, 0xF7, 0xB5, 0x01, 0xAC, 0xE6, 0x97, 0xF3, + 0x89, 0xDB, 0xAF, 0xF5, 0xA6, 0xD4, 0xA1, 0xF0, 0x09, 0xDC, 0x30, 0xE9, + 0x6F, 0xE8, 0xAE, 0xDB, 0xCC, 0xF7, 0x9B, 0xD9, 0x4F, 0x06, 0x81, 0xEB, + 0x80, 0x20, 0x19, 0x07, 0xE7, 0x39, 0xC6, 0x22, 0x91, 0x35, 0xB6, 0x35, + 0x86, 0x23, 0xA9, 0x3A, 0xFD, 0x15, 0xBF, 0x31, 0x83, 0x0F, 0x74, 0x24, + 0x95, 0x14, 0xAD, 0x1E, 0xA2, 0x26, 0xB3, 0x24, 0x80, 0x25, 0xB0, 0x13, + 0x5E, 0x08, 0xBC, 0xEC, 0x9F, 0x02, 0x7F, 0xE8, 0xE9, 0x17, 0xDC, 0x03, + 0xB1, 0x14, 0x31, 0x06, 0x7C, 0xFC, 0xFF, 0xF4, 0x15, 0xF5, 0xF5, 0xF9, + 0x41, 0xF3, 0xD1, 0x06, 0x3F, 0xE0, 0xDB, 0x09, 0x86, 0xC8, 0xE8, 0xFE, + 0xAD, 0xB8, 0xA6, 0xE1, 0x5F, 0xB6, 0x5B, 0xC7, 0xBE, 0xC2, 0x96, 0xB7, + 0xA9, 0xC4, 0xDB, 0xA6, 0xC0, 0xBC, 0x5A, 0xA5, 0x1B, 0xCF, 0xFE, 0xB4, + 0xFA, 0xE9, 0xB3, 0xBD, 0xB9, 0xE1, 0x51, 0xBE, 0x6B, 0xC9, 0x69, 0xC0, + 0xC3, 0xC5, 0x86, 0xC9, 0x4D, 0xDA, 0xA9, 0xDD, 0x3B, 0x01, 0x04, 0x08, + 0x75, 0x1A, 0x74, 0x24, 0xFD, 0x0D, 0x00, 0x0A, 0xAF, 0xF7, 0x95, 0xE7, + 0xDB, 0xEF, 0xA7, 0xE4, 0x33, 0xF2, 0x79, 0xF0, 0xE2, 0xF1, 0x30, 0xFB, + 0x2D, 0xDE, 0xBA, 0xF8, 0x19, 0xC5, 0x3D, 0xE6, 0x7D, 0xC0, 0x9B, 0xD2, + 0xCD, 0xC6, 0x44, 0xD7, 0xD0, 0xBE, 0x27, 0xE4, 0xCF, 0xB4, 0xDE, 0xDC, + 0x5E, 0xBB, 0xA2, 0xD1, 0x5B, 0xC3, 0xD4, 0xC8, 0x44, 0xCC, 0x67, 0xC1, + 0x50, 0xD2, 0xE1, 0xBC, 0x4C, 0xDC, 0x70, 0xC6, 0x65, 0xED, 0x7E, 0xE3, + 0x95, 0xF0, 0x66, 0xFD, 0x79, 0xF1, 0xED, 0x06, 0x31, 0x00, 0x14, 0x08, + 0xA3, 0x0E, 0x6F, 0x00, 0x89, 0x1C, 0x55, 0xFE, 0x76, 0x2A, 0x69, 0x05, + 0x8A, 0x18, 0xB3, 0xE9, 0x71, 0xEA, 0xEB, 0xB9, 0x2D, 0xD8, 0x62, 0xBA, + 0x29, 0xE5, 0x02, 0xE0, 0x99, 0xDF, 0x83, 0xE8, 0x6C, 0xCE, 0xD8, 0xDA, + 0x49, 0xD3, 0x97, 0xDC, 0x19, 0xE4, 0x8B, 0xE9, 0x42, 0xEA, 0xA7, 0xF9, + 0x6A, 0xDB, 0x21, 0xFB, 0x66, 0xC9, 0x29, 0xE7, 0x16, 0xC8, 0x5C, 0xCE, + 0xB4, 0xC9, 0xFC, 0xB5, 0xA2, 0xC0, 0x62, 0xA6, 0x50, 0xC0, 0x24, 0xB6, + 0x64, 0xD5, 0xF8, 0xD4, 0x6D, 0xEB, 0xDC, 0xE6, 0xE3, 0xF5, 0xA0, 0xF0, + 0xDD, 0x04, 0x9F, 0xF5, 0xCE, 0x11, 0x11, 0xF3, 0x1A, 0x1C, 0xF6, 0x02, + 0x49, 0x2B, 0x56, 0x2B, 0xBE, 0x24, 0x77, 0x37, 0x18, 0x0E, 0x93, 0x1A, + 0x66, 0x0A, 0x9B, 0x02, 0x38, 0x1C, 0xF7, 0x09, 0xA4, 0x2D, 0xA5, 0x21, + 0x2D, 0x39, 0xA7, 0x36, 0xAA, 0x31, 0xD5, 0x36, 0x78, 0x15, 0xED, 0x20, + 0x01, 0xFF, 0xBF, 0x0F, 0xA6, 0xF9, 0x3E, 0x12, 0xFC, 0xF1, 0x70, 0x09, + 0x09, 0xE4, 0xB6, 0xEE, 0x2E, 0xDC, 0x18, 0xDE, 0x70, 0xDB, 0x38, 0xDD, + 0xBE, 0xE6, 0x0A, 0xEC, 0x38, 0xFB, 0x3D, 0x05, 0x92, 0x19, 0x84, 0x21, + 0x75, 0x29, 0x30, 0x2D, 0x88, 0x20, 0x24, 0x29, 0x58, 0x1A, 0x43, 0x28, + 0x5C, 0x19, 0x8D, 0x28, 0x6E, 0x19, 0xD6, 0x2B, 0x81, 0x29, 0x18, 0x3E, + 0xC1, 0x43, 0x7B, 0x49, 0xB8, 0x41, 0xD4, 0x2C, 0x89, 0x29, 0xE8, 0x06, + 0x2E, 0x2C, 0x7E, 0x08, 0x19, 0x3A, 0x3E, 0x1E, 0xA9, 0x2A, 0xF3, 0x20, + 0x6E, 0x15, 0x8E, 0x18, 0x9A, 0x15, 0xEF, 0x14, 0xFF, 0x17, 0x66, 0x1B, + 0xA4, 0x12, 0x2F, 0x28, 0x0B, 0x16, 0x78, 0x2D, 0x25, 0x15, 0x9F, 0x27, + 0x1F, 0x04, 0xB2, 0x17, 0x7F, 0xF7, 0x83, 0xFA, 0xF7, 0xF9, 0xC2, 0xE1, + 0xD8, 0x0F, 0x3B, 0xE7, 0x3A, 0x2C, 0x64, 0xFE, 0x95, 0x29, 0xD7, 0x0F, + 0x2F, 0x11, 0x5B, 0x1B, 0x57, 0x12, 0xF1, 0x2B, 0xE9, 0x29, 0x84, 0x3E, + 0x7A, 0x3F, 0x0A, 0x4F, 0x1F, 0x47, 0x8E, 0x5F, 0xAD, 0x35, 0xEA, 0x53, + 0x4E, 0x22, 0x2B, 0x30, 0xA7, 0x29, 0x17, 0x21, 0x27, 0x3B, 0x8A, 0x20, + 0x6B, 0x3F, 0x8E, 0x19, 0xC4, 0x39, 0xFA, 0x19, 0x0D, 0x20, 0xF1, 0x16, + 0xE3, 0xF5, 0xB4, 0x01, 0xFE, 0xD6, 0x12, 0xF4, 0xB9, 0xD7, 0xC8, 0x04, + 0x14, 0xE9, 0xBB, 0x0D, 0x55, 0xF0, 0xE2, 0xF9, 0x77, 0xE8, 0x7A, 0xE3, + 0xD5, 0xE9, 0xE0, 0xDF, 0xF6, 0xFF, 0x95, 0xF1, 0x4C, 0x17, 0xE9, 0x0A, + 0x3A, 0x2D, 0xF4, 0x24, 0xA1, 0x36, 0xF6, 0x34, 0x61, 0x2B, 0x86, 0x2E, + 0x76, 0x1D, 0x79, 0x22, 0x11, 0x19, 0x40, 0x23, 0x2C, 0x1D, 0xC5, 0x29, + 0x79, 0x29, 0x47, 0x36, 0xFF, 0x33, 0x9D, 0x2E, 0xEF, 0x2F, 0xCB, 0x02, + 0x8A, 0x25, 0x47, 0xE0, 0x51, 0x2D, 0x9E, 0xE5, 0xD6, 0x31, 0x00, 0xFC, + 0xAB, 0x13, 0x0F, 0x0D, 0x93, 0xF4, 0xEC, 0x1C, 0xEF, 0xE7, 0xBC, 0x1F, + 0x46, 0xDD, 0x46, 0x14, 0x2C, 0xDF, 0xF6, 0x0E, 0x55, 0xF0, 0x6B, 0x05, + 0x4A, 0xEF, 0x11, 0xE9, 0x1B, 0xD8, 0x8A, 0xCC, 0xB9, 0xCC, 0xDB, 0xBC, + 0x13, 0xD0, 0x3E, 0xB8, 0x3B, 0xD4, 0x5F, 0xC4, 0x99, 0xE0, 0xFE, 0xDD, + 0xD9, 0xE0, 0xC5, 0xED, 0xC8, 0xCA, 0xFF, 0xEA, 0x1E, 0xC9, 0x15, 0xEF, + 0xEE, 0xE6, 0x5D, 0x03, 0x3C, 0x0B, 0xF4, 0x1C, 0x87, 0x1D, 0xE2, 0x27, + 0x1E, 0x13, 0xC1, 0x09, 0x32, 0x07, 0x27, 0xE7, 0x0D, 0x12, 0x75, 0xF1, + 0x78, 0x1A, 0x23, 0x04, 0x05, 0x10, 0x92, 0x07, 0x56, 0x01, 0x27, 0x05, + 0x21, 0xF3, 0x28, 0xF0, 0x1D, 0xD9, 0x42, 0xCB, 0x63, 0xC7, 0xB2, 0xC4, + 0x02, 0xCF, 0xFF, 0xE1, 0x56, 0xD8, 0x63, 0xF3, 0x60, 0xDF, 0xF9, 0xF4, + 0xBA, 0xDE, 0xC1, 0xEE, 0xB3, 0xE1, 0x53, 0xE4, 0xCA, 0xE7, 0xF5, 0xD5, + 0x30, 0xF0, 0xCA, 0xE0, 0x8B, 0x02, 0x16, 0x0A, 0x0E, 0x11, 0xF8, 0x26, + 0x08, 0x13, 0x39, 0x23, 0xCB, 0x17, 0x8B, 0x13, 0x8F, 0x26, 0x15, 0x09, + 0x16, 0x32, 0x2B, 0x06, 0x1F, 0x38, 0xAC, 0x14, 0xCA, 0x22, 0x70, 0x12, + 0xB7, 0xF2, 0xEB, 0xF7, 0x99, 0xE0, 0xBE, 0xF6, 0xCF, 0x00, 0xF6, 0x14, + 0xD5, 0x0D, 0x8C, 0x1B, 0xF9, 0xF4, 0x3C, 0xFF, 0x3B, 0xEA, 0x12, 0xE9, + 0x7D, 0xF2, 0x75, 0xE8, 0x41, 0x02, 0x58, 0xFC, 0x2D, 0x10, 0x9E, 0x14, + 0x7B, 0x06, 0xF3, 0x18, 0xA8, 0xE9, 0x60, 0x04, 0x11, 0xD5, 0x14, 0xE9, + 0x84, 0xCB, 0x45, 0xD2, 0x07, 0xCA, 0x4D, 0xC6, 0x0F, 0xDD, 0x71, 0xCD, + 0x57, 0xF6, 0x68, 0xDD, 0x63, 0xFF, 0x81, 0xE9, 0xA8, 0xFF, 0xBA, 0xE5, + 0xAB, 0x0A, 0xA9, 0xE6, 0x53, 0x23, 0x14, 0x10, 0xA7, 0x3A, 0xE8, 0x46, + 0xC5, 0x33, 0x80, 0x4A, 0x9E, 0x10, 0xB8, 0x19, 0x76, 0x05, 0x17, 0xF6, + 0x0D, 0x1F, 0x15, 0xF2, 0x68, 0x31, 0x3A, 0xF5, 0xE7, 0x2C, 0x0A, 0xFE, + 0xC5, 0x1E, 0x3E, 0x02, 0x3B, 0x06, 0x59, 0xFA, 0x18, 0xE9, 0x96, 0xF2, + 0x6A, 0xDE, 0x2C, 0xF5, 0xC6, 0xDC, 0x35, 0xFA, 0xDE, 0xD1, 0x7A, 0xF9, + 0x00, 0xC7, 0xF1, 0xF4, 0x5E, 0xC5, 0x90, 0xEC, 0xDF, 0xD7, 0xEE, 0xE5, + 0x56, 0xF0, 0x6A, 0xE4, 0x7F, 0x07, 0x04, 0xF8, 0x2E, 0x1E, 0xB3, 0x1A, + 0xFF, 0x23, 0x47, 0x2B, 0xC0, 0x19, 0x6F, 0x23, 0x1C, 0x11, 0x2E, 0x1A, + 0xDA, 0x05, 0xC4, 0x12, 0x64, 0x01, 0xC3, 0x16, 0xD3, 0x09, 0xE1, 0x20, + 0xA4, 0xFD, 0x95, 0xFD, 0x19, 0xE0, 0xF4, 0xC7, 0x1B, 0xDE, 0x8D, 0xCC, + 0xDF, 0xF6, 0x4C, 0xFA, 0x17, 0xF7, 0x21, 0x06, 0x11, 0xE5, 0x2D, 0xF1, + 0x3C, 0xE2, 0xFA, 0xE4, 0x87, 0xE2, 0x26, 0xE4, 0xED, 0xE0, 0x5E, 0xF1, + 0x31, 0xE2, 0x79, 0x02, 0xC0, 0xDB, 0x17, 0xF7, 0x29, 0xCE, 0x3B, 0xD9, + 0xFD, 0xC4, 0x90, 0xBE, 0x4D, 0xC1, 0x0A, 0xA4, 0x06, 0xC3, 0xEA, 0xA7, + 0x44, 0xCB, 0x1D, 0xD1, 0xA2, 0xD8, 0xBE, 0xF6, 0x81, 0xDE, 0xB3, 0x02, + 0x8F, 0xDC, 0x32, 0xFA, 0x1C, 0xE8, 0x34, 0xF5, 0x72, 0x02, 0x31, 0x03, + 0x0D, 0x1A, 0x67, 0x18, 0x8C, 0x17, 0x86, 0x15, 0x04, 0x04, 0xF1, 0xF8, + 0xDB, 0x05, 0x42, 0xEC, 0xD2, 0x1D, 0x1B, 0xF9, 0xB7, 0x2C, 0x9E, 0x0C, + 0xF0, 0x22, 0x5C, 0x18, 0xBF, 0x04, 0x69, 0x04, 0x8A, 0xE8, 0x54, 0xE2, + 0xBC, 0xD8, 0xF0, 0xD4, 0x20, 0xD5, 0xD0, 0xDB, 0x16, 0xD1, 0x36, 0xDC, + 0x76, 0xD0, 0x23, 0xD7, 0x72, 0xDD, 0xDB, 0xDC, 0x46, 0xEF, 0x2F, 0xE1, + 0xDF, 0x0A, 0xF6, 0xE8, 0xDB, 0x1C, 0x5F, 0xFE, 0x51, 0x1F, 0x53, 0x18, + 0xFA, 0x24, 0xE0, 0x25, 0x18, 0x27, 0x40, 0x1D, 0xC6, 0x24, 0x42, 0x0A, + 0xF5, 0x23, 0x89, 0x01, 0x4E, 0x1B, 0x45, 0x09, 0x8A, 0x22, 0xD2, 0x2A, + 0x88, 0x3F, 0x54, 0x48, 0x13, 0x45, 0xF9, 0x30, 0x9A, 0x2E, 0x9C, 0x07, + 0x61, 0x2F, 0xF4, 0x07, 0x4E, 0x40, 0x51, 0x1F, 0x33, 0x29, 0x43, 0x1E, + 0x1F, 0x08, 0xB4, 0x12, 0xF5, 0x09, 0xAB, 0x14, 0x24, 0x15, 0xB8, 0x17, + 0xD0, 0x1A, 0xEB, 0x19, 0x37, 0x1E, 0xD8, 0x25, 0xF6, 0x0F, 0xA9, 0x2B, + 0x7A, 0xFC, 0x30, 0x23, 0xB3, 0xF0, 0x03, 0x09, 0x8B, 0xE9, 0xBA, 0xEE, + 0x35, 0xF2, 0x59, 0xF6, 0xCB, 0x02, 0x63, 0x06, 0x6D, 0x08, 0x73, 0x0B, + 0xD2, 0x04, 0x25, 0x14, 0x44, 0x0A, 0x30, 0x1F, 0xFE, 0x19, 0x81, 0x30, + 0x76, 0x29, 0xBA, 0x4F, 0xB4, 0x34, 0xCD, 0x66, 0xD8, 0x33, 0x8C, 0x59, + 0xFA, 0x2B, 0xB7, 0x35, 0x3B, 0x2D, 0xB5, 0x25, 0xE5, 0x34, 0x00, 0x2B, + 0x2F, 0x3D, 0x0A, 0x32, 0x2E, 0x3E, 0x92, 0x2F, 0xB0, 0x2E, 0x67, 0x22, + 0x99, 0x1A, 0xA0, 0x1B, 0xAC, 0x12, 0x6B, 0x1B, 0xC5, 0x16, 0xFF, 0x20, + 0x27, 0x10, 0xD6, 0x2B, 0x0A, 0x05, 0xD4, 0x2B, 0x91, 0xFA, 0x7B, 0x0E, + 0x66, 0xF5, 0xEB, 0xE9, 0x05, 0x04, 0x84, 0xDE, 0xF1, 0x16, 0x87, 0xEB, + 0x62, 0x25, 0x26, 0x0A, 0xF9, 0x2B, 0xC9, 0x23, 0xBA, 0x30, 0x8B, 0x2D, + 0x76, 0x37, 0xF0, 0x2A, 0xFC, 0x2B, 0x44, 0x19, 0x14, 0x0E, 0x17, 0x07, + 0xFD, 0x07, 0x2F, 0x19, 0x71, 0x17, 0x01, 0x34, 0xA1, 0x10, 0x88, 0x1C, + 0x41, 0xFD, 0xC2, 0xF6, 0x2D, 0x02, 0xFE, 0xF5, 0xDA, 0x0F, 0x54, 0x01, + 0x8C, 0x08, 0x96, 0x00, 0x01, 0x03, 0x3D, 0x05, 0xE1, 0x04, 0x4B, 0x06, + 0x13, 0xFD, 0x47, 0xF5, 0x75, 0xF1, 0x68, 0xEC, 0xE4, 0xE6, 0x24, 0xF8, + 0x2F, 0xDB, 0xFE, 0xF8, 0xB4, 0xCC, 0x5A, 0xE7, 0x21, 0xBC, 0x79, 0xD3, + 0xAB, 0xBE, 0xA3, 0xCE, 0xEA, 0xDF, 0x02, 0xE0, 0xF9, 0xF8, 0x2A, 0xEF, + 0xDB, 0xF1, 0x95, 0xE9, 0xE9, 0xE8, 0xE5, 0xD6, 0x33, 0xED, 0x1C, 0xCB, + 0x65, 0xF2, 0x2D, 0xD8, 0x57, 0xFE, 0x87, 0xF2, 0x9F, 0x0E, 0x4B, 0xF7, + 0x17, 0x10, 0x9E, 0xE1, 0x4B, 0x04, 0x90, 0xCF, 0x33, 0xF8, 0x3D, 0xD3, + 0x45, 0xEE, 0xD1, 0xE1, 0x57, 0xE6, 0xB5, 0xF5, 0x26, 0xDD, 0xEC, 0x08, + 0xFA, 0xCB, 0xE4, 0x00, 0x6B, 0xBA, 0x61, 0xE1, 0x53, 0xB5, 0x6A, 0xC7, + 0xD4, 0xBB, 0x52, 0xC1, 0xE4, 0xC0, 0x5A, 0xCA, 0x1D, 0xC1, 0x2D, 0xD4, + 0x94, 0xB8, 0x3F, 0xD4, 0x5C, 0xB8, 0x0A, 0xD3, 0x01, 0xC5, 0xC1, 0xD6, + 0xD8, 0xD0, 0x5C, 0xE4, 0xF0, 0xD8, 0x45, 0xF6, 0xE5, 0xD2, 0xC1, 0xF9, + 0xC7, 0xC9, 0xD3, 0xF4, 0x7E, 0xD1, 0x56, 0xF2, 0xF0, 0xDD, 0x6C, 0xEC, + 0xFA, 0xE5, 0xD8, 0xE6, 0xC6, 0x01, 0x8C, 0xF4, 0x3C, 0x1A, 0xA6, 0xFB, + 0x3A, 0x08, 0xB4, 0xEA, 0x2C, 0xEF, 0xB1, 0xD9, 0xB8, 0xEF, 0x9D, 0xCC, + 0x20, 0xED, 0xCD, 0xBF, 0x88, 0xDA, 0x97, 0xBB, 0x23, 0xDA, 0x05, 0xC6, + 0xB8, 0xE6, 0x25, 0xD0, 0xC5, 0xEA, 0xAA, 0xD9, 0xE8, 0xF5, 0xA3, 0xED, + 0xC7, 0x02, 0x4D, 0xF7, 0x67, 0xF6, 0x97, 0xE7, 0xAB, 0xD4, 0x93, 0xD1, + 0x3E, 0xB1, 0x74, 0xB8, 0x73, 0xA0, 0x13, 0xA7, 0xD6, 0xB3, 0x7C, 0xB3, + 0x34, 0xD6, 0x8F, 0xC7, 0x4B, 0xF1, 0x6B, 0xD4, 0x90, 0xFF, 0x18, 0xD6, + 0xDA, 0x00, 0x16, 0xD5, 0xD2, 0x01, 0xEB, 0xEA, 0x69, 0x0D, 0xB0, 0x0B, + 0x76, 0x18, 0x4C, 0x16, 0x2A, 0x0B, 0x7C, 0x06, 0x33, 0xF5, 0xB6, 0xFB, + 0x2E, 0xF1, 0x78, 0xF6, 0x8F, 0xF3, 0xAF, 0xE9, 0x57, 0xF7, 0xA4, 0xED, + 0xCD, 0xFD, 0x28, 0xFB, 0x2A, 0xFC, 0x37, 0xFD, 0xE6, 0xF8, 0x5F, 0xFD, + 0xED, 0xFA, 0xC2, 0xF8, 0x5B, 0xFD, 0x2A, 0xF9, 0x60, 0xF6, 0xF6, 0x07, + 0xAF, 0xE1, 0x74, 0x10, 0x5C, 0xD1, 0xB5, 0x0A, 0xF3, 0xD8, 0x26, 0x04, + 0x90, 0xEA, 0x15, 0xFF, 0x39, 0x00, 0x00, 0x02, 0x31, 0x22, 0xFB, 0x17, + 0xC9, 0x38, 0xA2, 0x30, 0x3D, 0x2D, 0xBD, 0x36, 0x86, 0x1A, 0x35, 0x31, + 0x18, 0x18, 0x00, 0x27, 0x98, 0x1F, 0xB6, 0x1B, 0x3C, 0x2F, 0xDB, 0x21, + 0xCE, 0x34, 0x18, 0x25, 0x8B, 0x23, 0x5F, 0x12, 0x04, 0x1D, 0xFC, 0x06, + 0x74, 0x32, 0xC3, 0x16, 0x86, 0x3D, 0x31, 0x2C, 0xFA, 0x2E, 0xB3, 0x2D, + 0x6E, 0x1C, 0x2A, 0x29, 0xA0, 0x08, 0x28, 0x27, 0x68, 0xFF, 0xC1, 0x26, + 0x47, 0x0B, 0x18, 0x2C, 0xBF, 0x12, 0xF3, 0x22, 0x66, 0x0B, 0xDB, 0x0C, + 0x89, 0x08, 0x61, 0xFF, 0x32, 0x0A, 0x91, 0xF1, 0x88, 0x07, 0x24, 0xE7, + 0xA6, 0x07, 0xB2, 0xF8, 0x69, 0x10, 0xC2, 0x1D, 0x40, 0x19, 0x49, 0x35, + 0xDA, 0x10, 0xA1, 0x2C, 0x7C, 0x04, 0xDF, 0x1B, 0x73, 0x0B, 0x31, 0x20, + 0xF3, 0x1C, 0x80, 0x2B, 0x91, 0x25, 0x8F, 0x31, 0x13, 0x21, 0x2F, 0x33, + 0x75, 0x24, 0xBE, 0x35, 0xA1, 0x39, 0x73, 0x3C, 0x2B, 0x50, 0x82, 0x3B, + 0xE7, 0x54, 0x6E, 0x35, 0x2E, 0x3E, 0xA3, 0x2D, 0x8E, 0x23, 0xCE, 0x22, + 0x73, 0x1C, 0x51, 0x19, 0x09, 0x22, 0x97, 0x12, 0x54, 0x2C, 0x90, 0x12, + 0x25, 0x32, 0xDA, 0x12, 0x1B, 0x28, 0x64, 0x16, 0xE1, 0x1F, 0x77, 0x26, + 0xBE, 0x1F, 0xF8, 0x33, 0x21, 0x10, 0x5E, 0x32, 0x96, 0x06, 0x56, 0x2E, + 0x22, 0x1A, 0x99, 0x31, 0x0E, 0x2A, 0xE7, 0x2F, 0x98, 0x22, 0xA7, 0x1E, + 0xB0, 0x1D, 0x7A, 0x0A, 0xBE, 0x26, 0xE5, 0x08, 0x1A, 0x33, 0x69, 0x1C, + 0x3A, 0x3E, 0x5B, 0x38, 0x94, 0x38, 0xD9, 0x3F, 0xAC, 0x20, 0x1F, 0x23, + 0xC8, 0x11, 0xFE, 0x04, 0x68, 0x11, 0x1D, 0xFF, 0x00, 0x03, 0xC1, 0xFE, + 0xA8, 0xEC, 0x01, 0xFB, 0x60, 0xE7, 0x71, 0xF8, 0x3B, 0xF1, 0x12, 0xF5, + 0xAD, 0x0A, 0x80, 0xF8, 0x2D, 0x1A, 0xD3, 0x04, 0x38, 0x0E, 0x8D, 0x0F, + 0xEE, 0xF7, 0x02, 0x14, 0x71, 0xDF, 0x57, 0x0D, 0x57, 0xD0, 0xAC, 0xF6, + 0xC3, 0xCF, 0x5F, 0xDD, 0x5F, 0xDE, 0x71, 0xD2, 0x8A, 0xF4, 0xC2, 0xCD, + 0xCE, 0xF6, 0x83, 0xCF, 0x96, 0xEE, 0xA2, 0xE2, 0x31, 0xF9, 0xFC, 0xF4, + 0xE2, 0x0E, 0x5D, 0xFA, 0x4D, 0x16, 0x3A, 0xFF, 0x0A, 0x05, 0xD9, 0x05, + 0x95, 0xEB, 0x46, 0x03, 0xF8, 0xE0, 0xEA, 0xF7, 0x59, 0xE9, 0xE8, 0xF3, + 0x79, 0xF6, 0x4E, 0xFC, 0xA0, 0xFD, 0x76, 0x04, 0xB9, 0xFD, 0x81, 0x02, + 0xC5, 0xF9, 0x01, 0xF8, 0x7E, 0xF5, 0xCE, 0xEF, 0x69, 0xF3, 0xE9, 0xEA, + 0x1E, 0xEF, 0x1E, 0xE8, 0x7D, 0xE2, 0x50, 0xED, 0x61, 0xD2, 0xE8, 0xEC, + 0xE0, 0xCB, 0xCE, 0xDD, 0x5E, 0xD2, 0xE2, 0xCD, 0x24, 0xDB, 0x73, 0xCF, + 0x57, 0xE0, 0x13, 0xE4, 0xD0, 0xDF, 0xBF, 0xFB, 0x91, 0xDC, 0xA4, 0x0D, + 0xE7, 0xE6, 0xB1, 0x0E, 0x1F, 0xFB, 0x21, 0x01, 0x90, 0x01, 0x53, 0xF6, + 0xD8, 0xF6, 0x0E, 0xF4, 0x04, 0xE9, 0x97, 0xFA, 0x65, 0xE6, 0x44, 0xF6, + 0x32, 0xF3, 0xEE, 0xDD, 0x87, 0x07, 0x6A, 0xD2, 0x77, 0x15, 0xFA, 0xE3, + 0x5E, 0x16, 0x92, 0xFE, 0x41, 0x0B, 0x8B, 0x0C, 0xB9, 0x01, 0x5B, 0x11, + 0x64, 0x06, 0xC9, 0x15, 0x98, 0x07, 0xAB, 0x14, 0x73, 0xFC, 0xD6, 0x0E, + 0xD6, 0xF7, 0x7E, 0x03, 0x80, 0x00, 0xC3, 0xF3, 0x78, 0x0A, 0x33, 0xEC, + 0x66, 0x09, 0x1F, 0xF1, 0xA6, 0x04, 0x86, 0xFA, 0x07, 0x07, 0x79, 0x04, + 0x22, 0x06, 0xF4, 0x0D, 0x5F, 0xF8, 0x82, 0x0E, 0xED, 0xF0, 0xC8, 0x02, + 0xED, 0xFD, 0x48, 0xFB, 0x7F, 0x0A, 0x51, 0xFB, 0x9B, 0x09, 0xEF, 0xFE, + 0xBB, 0x02, 0x4E, 0x0E, 0x3B, 0x02, 0x64, 0x14, 0xBD, 0x0D, 0xA1, 0x08, + 0x7D, 0x1D, 0x09, 0x06, 0x68, 0x23, 0xCD, 0x09, 0x83, 0x14, 0xC5, 0x0A, + 0x16, 0xFA, 0xAB, 0x09, 0x09, 0xEF, 0xFA, 0xFE, 0x25, 0xF0, 0xF8, 0xEA, + 0x73, 0xED, 0x2E, 0xDE, 0x9B, 0xF0, 0x5A, 0xE7, 0xC2, 0xF2, 0x14, 0xF9, + 0xE4, 0xEA, 0xBF, 0x03, 0xF0, 0xEB, 0xDD, 0x0A, 0x0F, 0xF9, 0xD8, 0x0C, + 0x60, 0x05, 0xC4, 0x07, 0xFD, 0x05, 0x3D, 0x00, 0xAB, 0xF3, 0x12, 0xFA, + 0xE3, 0xE2, 0x37, 0xF5, 0xBC, 0xEF, 0x2D, 0xEC, 0x3C, 0x0B, 0x8B, 0xE1, + 0x6F, 0x16, 0x18, 0xDD, 0x6F, 0x14, 0x60, 0xE3, 0x43, 0x14, 0x02, 0xEF, + 0x33, 0x0C, 0x43, 0xFA, 0xDF, 0xFD, 0x47, 0x05, 0xD2, 0xFE, 0x0E, 0x0F, + 0x8B, 0xFA, 0x3F, 0x12, 0x89, 0xE6, 0x8B, 0x0A, 0x45, 0xE0, 0x45, 0xF6, + 0x36, 0xEB, 0x74, 0xDB, 0x86, 0xED, 0xCA, 0xCB, 0x28, 0xE6, 0xB0, 0xD3, + 0x27, 0xEB, 0x5C, 0xEB, 0xE4, 0xED, 0x34, 0xF6, 0x65, 0xE3, 0x52, 0xEF, + 0x68, 0xDD, 0xA5, 0xE7, 0x90, 0xDF, 0xCA, 0xE3, 0xC9, 0xDF, 0xAC, 0xE6, + 0x8B, 0xD2, 0xED, 0xE8, 0xF5, 0xBE, 0x96, 0xE4, 0x77, 0xB9, 0xC4, 0xE3, + 0xC5, 0xC5, 0x44, 0xE3, 0x3E, 0xD6, 0xD0, 0xDB, 0xF2, 0xE2, 0x8C, 0xD6, + 0x4B, 0xE8, 0x78, 0xE3, 0x86, 0xE5, 0x7C, 0xF9, 0x3A, 0xE3, 0xDE, 0xF8, + 0xCB, 0xE8, 0xE6, 0xE4, 0xEF, 0xEF, 0x35, 0xD7, 0x6B, 0xEB, 0x11, 0xD4, + 0x75, 0xE2, 0x3F, 0xD9, 0x38, 0xEB, 0xAE, 0xE3, 0xDD, 0x02, 0x20, 0xE9, + 0x47, 0x12, 0x21, 0xEC, 0xC3, 0x0F, 0x24, 0xF7, 0x3E, 0x07, 0x6E, 0x03, + 0x7C, 0xFC, 0x07, 0x06, 0xB6, 0xEA, 0xF5, 0x01, 0x9B, 0xDC, 0x44, 0xFF, + 0x5A, 0xE1, 0x6C, 0xFC, 0x08, 0xF3, 0x12, 0xF4, 0x33, 0xF9, 0xBE, 0xE9, + 0xE9, 0xF9, 0xF0, 0xE2, 0x30, 0x07, 0x73, 0xE8, 0x86, 0x18, 0xF6, 0xF8, + 0xBB, 0x22, 0x59, 0x08, 0xAD, 0x29, 0x82, 0x14, 0x20, 0x2A, 0x40, 0x1A, + 0xB8, 0x1C, 0xD1, 0x12, 0xD4, 0x0A, 0xF7, 0xFF, 0xE8, 0x02, 0xBA, 0xF1, + 0x05, 0x06, 0xC1, 0xF2, 0xC7, 0x04, 0x39, 0x02, 0xE7, 0x00, 0x2E, 0x17, + 0x89, 0x0D, 0xF7, 0x22, 0x55, 0x1F, 0x6E, 0x21, 0x11, 0x1D, 0x6C, 0x21, + 0xAA, 0x0F, 0x74, 0x29, 0x10, 0x11, 0x2C, 0x26, 0x66, 0x1A, 0xFE, 0x12, + 0x9F, 0x15, 0x92, 0x03, 0x8D, 0x0E, 0x78, 0x04, 0x57, 0x16, 0xD1, 0x09, + 0x50, 0x1D, 0xEE, 0x0B, 0x1E, 0x15, 0xC4, 0x13, 0x67, 0x0E, 0xE5, 0x21, + 0x8F, 0x10, 0xD8, 0x28, 0x34, 0x14, 0x00, 0x1F, 0xF8, 0x1B, 0x34, 0x10, + 0xB0, 0x24, 0x3F, 0x06, 0x65, 0x24, 0xC1, 0x04, 0xB3, 0x1D, 0x25, 0x0C, + 0x57, 0x1E, 0x8E, 0x13, 0xF4, 0x30, 0x33, 0x1C, 0x28, 0x3A, 0xCB, 0x2A, + 0x29, 0x28, 0xC6, 0x35, 0x53, 0x1B, 0x71, 0x34, 0x0C, 0x1D, 0x07, 0x2B, + 0xF3, 0x1C, 0xDC, 0x28, 0x4B, 0x19, 0x70, 0x2B, 0x70, 0x1F, 0xBF, 0x28, + 0x4A, 0x2C, 0x60, 0x27, 0xAC, 0x2A, 0xFE, 0x24, 0x64, 0x1D, 0x1A, 0x29, + 0x51, 0x0E, 0x60, 0x36, 0x05, 0x06, 0x6F, 0x3A, 0x5F, 0x0B, 0x3D, 0x3B, + 0x39, 0x0D, 0xC8, 0x3E, 0x38, 0x05, 0xED, 0x37, 0x90, 0xFB, 0x8F, 0x23, + 0x39, 0xF6, 0xA5, 0x0A, 0x2C, 0xFE, 0x2F, 0xFA, 0xFE, 0x0D, 0x62, 0xF6, + 0x37, 0x19, 0xDA, 0xFE, 0x3E, 0x1B, 0x55, 0x08, 0xA8, 0x1B, 0x5E, 0x0C, + 0xD6, 0x20, 0x63, 0x15, 0x3E, 0x20, 0x3C, 0x1D, 0xEC, 0x18, 0x76, 0x1E, + 0xAE, 0x1B, 0x01, 0x18, 0x86, 0x23, 0x47, 0x0C, 0x87, 0x25, 0xD5, 0x0C, + 0x5C, 0x21, 0x89, 0x13, 0x1C, 0x15, 0x79, 0x10, 0x8B, 0x09, 0xF2, 0x05, + 0xCA, 0x01, 0x30, 0xFF, 0x9D, 0xFE, 0x7A, 0x0B, 0x4E, 0xFE, 0xC7, 0x19, + 0xE9, 0xFD, 0x58, 0x14, 0x51, 0xFF, 0x6E, 0x0A, 0x47, 0xFD, 0x60, 0x03, + 0xAC, 0xFE, 0x00, 0xF8, 0xC6, 0xFE, 0xC6, 0xE9, 0xEC, 0xFA, 0x1D, 0xE4, + 0xB0, 0x04, 0x2F, 0xE9, 0xA7, 0x10, 0x30, 0xEF, 0x1E, 0x0B, 0x62, 0xF9, + 0xF2, 0xF7, 0xF4, 0xFA, 0xD7, 0xE8, 0xDE, 0xE8, 0xDC, 0xE6, 0x2F, 0xD9, + 0xD5, 0xE8, 0xB1, 0xD8, 0x68, 0xEB, 0xDD, 0xDC, 0x60, 0xF3, 0x04, 0xDD, + 0x37, 0xF7, 0x42, 0xDC, 0xB3, 0xED, 0x70, 0xE4, 0x15, 0xE7, 0xEB, 0xF1, + 0x65, 0xE6, 0x5F, 0xF6, 0xBE, 0xE0, 0x4A, 0xF1, 0x32, 0xDD, 0xF3, 0xE5, + 0x9A, 0xDA, 0x4B, 0xDB, 0xC4, 0xD3, 0xFE, 0xD7, 0x8C, 0xCB, 0x37, 0xD7, + 0xDD, 0xC5, 0x85, 0xD6, 0xE7, 0xC8, 0xFA, 0xD6, 0x36, 0xC7, 0x1E, 0xD7, + 0x94, 0xBE, 0x30, 0xD3, 0x46, 0xBC, 0xB8, 0xCA, 0x69, 0xBC, 0x18, 0xC5, + 0x21, 0xB6, 0x0C, 0xC6, 0xA7, 0xB0, 0xBA, 0xCA, 0x22, 0xB8, 0x53, 0xCA, + 0x33, 0xBD, 0xFC, 0xC0, 0x29, 0xBC, 0xA3, 0xBC, 0xDF, 0xC1, 0xD4, 0xBE, + 0x23, 0xCD, 0x87, 0xC2, 0xA6, 0xD8, 0x2F, 0xCA, 0xF0, 0xD3, 0x15, 0xCF, + 0x89, 0xCD, 0xA8, 0xCF, 0x36, 0xDA, 0xE6, 0xCB, 0x05, 0xE5, 0x45, 0xC3, + 0x81, 0xE5, 0xCE, 0xBB, 0x66, 0xE3, 0x7E, 0xB9, 0x84, 0xD8, 0x01, 0xC2, + 0x6B, 0xCA, 0xA3, 0xCC, 0xD2, 0xCF, 0xC8, 0xD5, 0x77, 0xE3, 0xFE, 0xE8, + 0x7A, 0xE9, 0xA5, 0xFB, 0x2E, 0xDD, 0xE3, 0xFF, 0x03, 0xD3, 0xDB, 0xFA, + 0x5A, 0xD8, 0xE8, 0xF4, 0xDA, 0xDF, 0x68, 0xE8, 0x4C, 0xE5, 0x12, 0xDC, + 0xAC, 0xEA, 0x62, 0xD2, 0xB5, 0xF7, 0x7A, 0xD2, 0xC2, 0x09, 0x5E, 0xDD, + 0xDF, 0x0A, 0x74, 0xE8, 0xD5, 0x04, 0x3B, 0xFC, 0x2A, 0x06, 0x2B, 0x0C, + 0xD0, 0x05, 0x32, 0x09, 0x39, 0xFC, 0x27, 0x04, 0x8E, 0xF1, 0xEB, 0x09, + 0x09, 0xF9, 0x90, 0x00, 0x42, 0x0A, 0xAD, 0xEF, 0xB4, 0x11, 0x2A, 0xF4, + 0x9E, 0x10, 0x5C, 0xFC, 0xF1, 0x05, 0x14, 0x05, 0x9D, 0xFC, 0xDB, 0x11, + 0x0A, 0xFE, 0x64, 0x13, 0x34, 0x05, 0xF2, 0x15, 0x43, 0x00, 0x9D, 0x16, + 0xE0, 0xF1, 0x3C, 0x0A, 0x2F, 0xF6, 0xDB, 0x01, 0x35, 0x09, 0x73, 0x00, + 0x2E, 0x15, 0xD5, 0xFE, 0xF3, 0x0B, 0x97, 0xFF, 0x7F, 0x05, 0x20, 0x0A, + 0xA4, 0x0C, 0xCF, 0x16, 0xF7, 0x0A, 0x37, 0x21, 0x89, 0x08, 0x75, 0x29, + 0x3D, 0x12, 0xE9, 0x27, 0x02, 0x20, 0x30, 0x20, 0x81, 0x24, 0xFC, 0x1B, + 0x76, 0x15, 0x21, 0x19, 0x5E, 0x05, 0x37, 0x19, 0x0F, 0x09, 0x84, 0x1A, + 0xEB, 0x26, 0x86, 0x1E, 0x53, 0x4A, 0x2E, 0x30, 0x25, 0x53, 0x13, 0x44, + 0xA3, 0x41, 0x82, 0x48, 0x6F, 0x26, 0x48, 0x35, 0x71, 0x1A, 0x18, 0x23, + 0xA9, 0x15, 0x76, 0x24, 0x40, 0x07, 0xB0, 0x24, 0x04, 0xFE, 0xE0, 0x1C, + 0x45, 0x16, 0xEE, 0x13, 0xB3, 0x3C, 0x1D, 0x07, 0xCF, 0x4B, 0x40, 0x04, + 0x4F, 0x40, 0x17, 0x14, 0x43, 0x2E, 0x8E, 0x25, 0x66, 0x21, 0x29, 0x2A, + 0x1B, 0x13, 0x31, 0x23, 0xFE, 0x0E, 0xB8, 0x1F, 0xB2, 0x0D, 0x70, 0x18, + 0x15, 0x09, 0xC6, 0x0B, 0x01, 0x0D, 0x97, 0x04, 0xAE, 0x11, 0x31, 0x00, + 0xEC, 0x19, 0x22, 0x06, 0x98, 0x2C, 0xC9, 0x11, 0xA6, 0x2E, 0x45, 0x16, + 0xC3, 0x18, 0xF0, 0x13, 0xB9, 0xFD, 0x76, 0x0D, 0x29, 0xEC, 0x94, 0x0F, + 0x7A, 0xE9, 0xCA, 0x0D, 0x6C, 0xED, 0xA9, 0x00, 0x54, 0xF3, 0x57, 0x00, + 0xF1, 0xED, 0xBE, 0x00, 0x50, 0xE1, 0xCB, 0xF8, 0xC9, 0xE1, 0xE6, 0xF4, + 0x7A, 0xF2, 0xCA, 0xF8, 0xA8, 0x03, 0x0B, 0xFF, 0xAA, 0x0A, 0xC1, 0x06, + 0x84, 0x0F, 0x08, 0x09, 0x05, 0x10, 0x47, 0xF7, 0xD1, 0x09, 0xA8, 0xE4, + 0xEA, 0x04, 0xA0, 0xE9, 0xB1, 0x02, 0xD6, 0xF7, 0xF2, 0x04, 0xDB, 0x05, + 0x87, 0x0D, 0x31, 0x1B, 0x80, 0x11, 0x29, 0x26, 0x37, 0x0C, 0xD1, 0x11, + 0xD8, 0x0B, 0x32, 0xF8, 0xF4, 0x10, 0xE1, 0xFB, 0xAA, 0x07, 0xF9, 0xFE, + 0x18, 0xF4, 0xF1, 0xF9, 0x79, 0xE6, 0xD2, 0x00, 0xBB, 0xED, 0x7B, 0xFA, + 0x86, 0xFC, 0xE7, 0xEA, 0x9F, 0xFB, 0x6D, 0xF6, 0x0A, 0xF5, 0x72, 0x0E, + 0x2E, 0xF5, 0x75, 0x12, 0xC1, 0x01, 0xDE, 0x09, 0x92, 0x0E, 0x96, 0x03, + 0xB1, 0x0C, 0xFB, 0xF9, 0x74, 0x01, 0x02, 0xEE, 0xAD, 0xF1, 0x71, 0xE1, + 0x41, 0xE0, 0xD0, 0xD0, 0x8C, 0xE6, 0x81, 0xD9, 0xED, 0xFB, 0x55, 0xF6, + 0x69, 0x00, 0xDA, 0x08, 0xA6, 0x01, 0x70, 0x19, 0xF8, 0x07, 0xBB, 0x27, + 0x25, 0x04, 0xF0, 0x26, 0x35, 0x05, 0x97, 0x18, 0x93, 0x18, 0x6D, 0x07, + 0x75, 0x23, 0xDF, 0xFF, 0x36, 0x17, 0x95, 0xFF, 0xF3, 0x09, 0x27, 0x0A, + 0xA5, 0x0A, 0xD4, 0x1A, 0xAC, 0x16, 0xD5, 0x1B, 0xF9, 0x1A, 0x59, 0x19, + 0x07, 0x0A, 0x99, 0x1F, 0xAB, 0xF9, 0x35, 0x25, 0x71, 0xF9, 0x1D, 0x22, + 0x73, 0xFE, 0x70, 0x0C, 0x96, 0x07, 0x4C, 0xF7, 0x92, 0x12, 0x32, 0xF4, + 0x3E, 0x18, 0xB2, 0xFA, 0x59, 0x19, 0x39, 0x09, 0xFC, 0x12, 0x45, 0x13, + 0x85, 0x12, 0x19, 0x13, 0xD0, 0x18, 0x1E, 0x11, 0xEE, 0x11, 0x4F, 0x10, + 0x56, 0x12, 0x88, 0x17, 0x8E, 0x19, 0x1D, 0x1B, 0x89, 0x12, 0xB1, 0x0D, + 0x82, 0x07, 0x88, 0xFA, 0x47, 0x02, 0x0D, 0xF5, 0x5F, 0x06, 0xB5, 0x00, + 0x43, 0x01, 0x23, 0x04, 0xEF, 0xEF, 0x81, 0xFF, 0x49, 0xEB, 0xFE, 0x03, + 0x95, 0xFB, 0x21, 0x0A, 0x3C, 0x04, 0xF8, 0x05, 0xA8, 0xED, 0x5C, 0xFC, + 0x7F, 0xDA, 0x67, 0xF9, 0x21, 0xDF, 0xE6, 0xF6, 0xD1, 0xE6, 0x5F, 0xF1, + 0xCC, 0xEF, 0x2A, 0xEF, 0x15, 0xF2, 0x63, 0xE9, 0x13, 0xEB, 0x45, 0xEB, + 0x3B, 0xE6, 0x2A, 0xF9, 0x81, 0xE4, 0x0A, 0xF4, 0xFB, 0xEC, 0x0C, 0xE7, + 0xA7, 0xFA, 0x2D, 0xF1, 0xE8, 0xFA, 0xC6, 0xF6, 0x31, 0xFB, 0xCF, 0xF4, + 0xB0, 0x07, 0xF3, 0xF9, 0xDA, 0x0A, 0x79, 0xF1, 0x71, 0x0C, 0x29, 0xEB, + 0xD6, 0x15, 0x0F, 0xF9, 0xCF, 0x16, 0x6B, 0x07, 0x74, 0x0C, 0xE3, 0x08, + 0xC2, 0xFE, 0x5C, 0x06, 0x26, 0xF9, 0xC8, 0x01, 0x33, 0xF9, 0x72, 0xF6, + 0xCF, 0xF3, 0x6D, 0xEF, 0xAE, 0xEC, 0xB2, 0xF1, 0x52, 0xEE, 0xE0, 0xF4, + 0xFE, 0xFD, 0x4F, 0xFE, 0xB4, 0x04, 0xF1, 0x04, 0xFF, 0xFA, 0xC1, 0x00, + 0x2A, 0xFC, 0x22, 0x01, 0x0F, 0x01, 0xB8, 0xFC, 0x4D, 0xF7, 0x63, 0xF2, + 0xFA, 0xF0, 0x17, 0xF3, 0x97, 0xF9, 0x10, 0xF8, 0x0F, 0xFD, 0x8E, 0xF8, + 0x35, 0xFE, 0xC1, 0xFE, 0xCE, 0x08, 0xCC, 0x08, 0x37, 0x12, 0x99, 0x06, + 0x0D, 0x21, 0x3F, 0x09, 0x3C, 0x2A, 0x56, 0x12, 0x3A, 0x1C, 0x19, 0x0E, + 0x75, 0x0F, 0xB4, 0x0F, 0x58, 0x0B, 0x89, 0x0D, 0x55, 0x05, 0xFD, 0xFE, + 0xFF, 0x09, 0xEF, 0xFC, 0x07, 0x10, 0x07, 0xFF, 0x94, 0x0A, 0x9D, 0x06, + 0x38, 0x06, 0x20, 0x14, 0xCE, 0x07, 0xC7, 0x1C, 0xDE, 0xFE, 0x5A, 0x1C, + 0x69, 0xED, 0xFC, 0x10, 0x3A, 0xE9, 0x9B, 0x07, 0x80, 0xFB, 0x77, 0x09, + 0x4F, 0x0D, 0xDC, 0x0D, 0xAD, 0x09, 0xD7, 0x08, 0x26, 0x00, 0xE3, 0xF8, + 0x5D, 0xF5, 0x3A, 0xEF, 0x36, 0xED, 0x93, 0xF5, 0x2F, 0xEE, 0x02, 0xFC, + 0x49, 0x02, 0xFC, 0x08, 0xDA, 0x0E, 0xC6, 0x07, 0xEB, 0x04, 0x36, 0xF4, + 0xC5, 0x07, 0x9D, 0xF8, 0xD1, 0x07, 0x8F, 0x03, 0xC5, 0xF7, 0x43, 0xFD, + 0x57, 0xF7, 0xF0, 0xF8, 0x88, 0xFD, 0x74, 0xFB, 0x5D, 0xFA, 0xA2, 0xFE, + 0xF5, 0xEF, 0x5F, 0x05, 0x10, 0xDB, 0x2B, 0x0B, 0xD3, 0xD0, 0x1D, 0x07, + 0xE2, 0xDD, 0x3A, 0xFA, 0xD5, 0xEE, 0xAC, 0xEB, 0xD8, 0xF1, 0x91, 0xE3, + 0xEF, 0xFB, 0x5C, 0xEA, 0x34, 0x06, 0xF0, 0xE7, 0x83, 0x04, 0xF7, 0xDD, + 0x94, 0x08, 0x5B, 0xE3, 0xDE, 0x17, 0xD2, 0xF1, 0x0C, 0x20, 0x20, 0x01, + 0x7A, 0x0D, 0x00, 0xFF, 0xCF, 0xF6, 0x23, 0xF2, 0x82, 0xF5, 0x6F, 0xFB, + 0xFA, 0xF8, 0x65, 0x00, 0x82, 0xF1, 0x3A, 0xE6, 0xD2, 0xF0, 0x34, 0xD6, + 0x0D, 0xF7, 0x00, 0xE1, 0x68, 0x01, 0x9F, 0xF3, 0x54, 0x12, 0x3A, 0xFE, + 0x53, 0x17, 0x95, 0xFA, 0xE2, 0x06, 0x2B, 0xF4, 0x56, 0xF6, 0xD8, 0xF7, + 0x2E, 0xEB, 0xF0, 0xF5, 0x1A, 0xE5, 0x0C, 0xE4, 0xDF, 0xEB, 0xCE, 0xDE, + 0x8F, 0xEB, 0x85, 0xE8, 0x3D, 0xEA, 0x3B, 0xF4, 0x21, 0xF2, 0x4D, 0xF9, + 0x9F, 0xF3, 0x6E, 0xF5, 0xA1, 0xF9, 0xBE, 0xF8, 0x5D, 0x07, 0x86, 0xFB, + 0xD0, 0x0C, 0x51, 0xFA, 0x33, 0x03, 0x38, 0xFC, 0xEA, 0xEE, 0xB2, 0xFA, + 0x47, 0xE4, 0x89, 0xFC, 0xD8, 0xE7, 0x48, 0xFF, 0x7D, 0xF0, 0xEC, 0xFC, + 0xA9, 0xF9, 0xD8, 0xFD, 0xAE, 0xFF, 0x22, 0x04, 0x33, 0x09, 0xD2, 0x15, + 0x4F, 0x10, 0x26, 0x21, 0x68, 0x0C, 0x07, 0x16, 0x72, 0xFC, 0xDB, 0x03, + 0x7A, 0xE6, 0x61, 0xF9, 0x48, 0xDE, 0xD0, 0xF7, 0xAC, 0xE5, 0xD1, 0xFA, + 0x7C, 0xE2, 0xC5, 0xF9, 0xDF, 0xE0, 0x70, 0xF8, 0xA4, 0xEF, 0x89, 0xFE, + 0x31, 0xFF, 0xC9, 0x05, 0x64, 0x04, 0x2C, 0x0B, 0x49, 0xFB, 0xE2, 0x08, + 0x28, 0xF6, 0xD5, 0xFF, 0x92, 0xFD, 0xD2, 0xFC, 0x2F, 0xFC, 0xA7, 0xF6, + 0x8E, 0xE8, 0x7B, 0xE3, 0x49, 0xDF, 0xEC, 0xD0, 0x51, 0xF0, 0x4A, 0xCC, + 0x3F, 0x03, 0x08, 0xDB, 0xE2, 0x14, 0xA6, 0xFA, 0xF5, 0x1E, 0xB2, 0x13, + 0xA6, 0x0A, 0x76, 0x13, 0x35, 0xF3, 0x3B, 0x11, 0xC2, 0xF1, 0x1D, 0x0E, + 0x79, 0xF5, 0x65, 0xFD, 0x7D, 0xE9, 0x46, 0xED, 0x3C, 0xD7, 0x98, 0xE3, + 0x03, 0xCC, 0x8E, 0xDE, 0xA7, 0xD4, 0x4C, 0xED, 0x95, 0xEA, 0x57, 0x00, + 0x4D, 0xFA, 0x2F, 0x06, 0x57, 0x05, 0xA1, 0x09, 0x6A, 0x04, 0x9A, 0xFF, + 0x1C, 0x02, 0x27, 0xF5, 0xCE, 0x04, 0x62, 0xFA, 0x00, 0xFF, 0x55, 0xFB, + 0x3C, 0xFB, 0xD0, 0xEE, 0xEA, 0xFD, 0xA8, 0xE8, 0x58, 0x02, 0xF8, 0xF4, + 0x71, 0x0E, 0x6C, 0xFB, 0x03, 0x27, 0x45, 0xFF, 0x60, 0x2C, 0x2E, 0x05, + 0x86, 0x18, 0x7D, 0x01, 0xDF, 0x11, 0x61, 0x00, 0xCC, 0x0F, 0x66, 0xFD, + 0x82, 0x0B, 0xEC, 0xF4, 0x7D, 0x0E, 0x6A, 0xF2, 0xE8, 0x10, 0x90, 0xFE, + 0x2F, 0x0F, 0x68, 0x15, 0xD1, 0x07, 0x71, 0x1A, 0x08, 0x05, 0x13, 0x10, + 0x6E, 0x09, 0xA8, 0x12, 0x64, 0x0C, 0x9F, 0x1C, 0xE7, 0x09, 0x64, 0x1F, + 0x15, 0x09, 0x9C, 0x21, 0x4F, 0x0E, 0xAD, 0x23, 0x0A, 0xF9, 0x24, 0x0D, + 0x1B, 0xE1, 0x84, 0xF4, 0x52, 0xE8, 0xB6, 0xF8, 0x8B, 0xF3, 0x95, 0x03, + 0x03, 0xFA, 0x43, 0x0E, 0x50, 0x03, 0x78, 0x19, 0xC3, 0x08, 0x22, 0x16, + 0xEE, 0x09, 0xCD, 0x17, 0x09, 0x0E, 0xA9, 0x28, 0x1E, 0x0F, 0xDF, 0x30, + 0x7A, 0x08, 0xEF, 0x27, 0xDE, 0x04, 0x0A, 0x13, 0x56, 0x19, 0xA8, 0x11, + 0x8B, 0x2C, 0x57, 0x1D, 0x14, 0x24, 0x1E, 0x16, 0x86, 0x16, 0xC6, 0x10, + 0xCC, 0x16, 0xB7, 0x1A, 0xC2, 0x23, 0x47, 0x1F, 0x3B, 0x2C, 0xA0, 0x1D, + 0x05, 0x23, 0xBA, 0x19, 0x41, 0x16, 0x35, 0x0C, 0xCA, 0x18, 0xCD, 0xFC, + 0x34, 0x24, 0x12, 0xF9, 0x1A, 0x29, 0x94, 0x02, 0xE7, 0x25, 0xBB, 0x12, + 0xF8, 0x1F, 0xF6, 0x21, 0xF3, 0x18, 0xE5, 0x1F, 0xAA, 0x11, 0x1E, 0x0E, + 0x01, 0x0E, 0x72, 0x05, 0xF4, 0x17, 0x69, 0x07, 0x52, 0x2A, 0xA7, 0x0D, + 0xA3, 0x28, 0x3D, 0x13, 0x55, 0x13, 0x4D, 0x0E, 0x3B, 0x0F, 0x44, 0x0E, + 0x2D, 0x17, 0xDC, 0x12, 0x70, 0x12, 0x0D, 0x0A, 0x8B, 0x0E, 0x2B, 0x08, + 0xA5, 0x0D, 0x87, 0x16, 0x05, 0x01, 0x80, 0x1E, 0x1A, 0xF7, 0x6C, 0x1B, + 0x11, 0xF6, 0xB0, 0x0F, 0x34, 0xED, 0x46, 0x00, 0x24, 0xE8, 0x10, 0xFC, + 0x16, 0xF2, 0x57, 0x07, 0x93, 0xF9, 0x3A, 0x0D, 0xB7, 0xF1, 0xF7, 0xFE, + 0xE8, 0xE3, 0xA8, 0xED, 0x0E, 0xE5, 0x15, 0xEE, 0x21, 0xE6, 0xCC, 0xEE, + 0xF7, 0xDD, 0x96, 0xE7, 0x95, 0xE3, 0x20, 0xEB, 0xA1, 0xF6, 0x7A, 0xF1, + 0x8B, 0x09, 0xA8, 0xF1, 0x89, 0x0B, 0xB6, 0xEB, 0x3F, 0xFD, 0x71, 0xE5, + 0x21, 0xF0, 0x31, 0xE8, 0x52, 0xE3, 0x84, 0xF3, 0x2A, 0xDD, 0xE4, 0xFC, + 0x94, 0xE9, 0xBC, 0xFA, 0x36, 0xF3, 0x57, 0xEF, 0x48, 0xED, 0x3B, 0xEB, + 0xF4, 0xE9, 0xCF, 0xF3, 0x53, 0xED, 0xFF, 0xEA, 0x3C, 0xF3, 0x78, 0xD6, + 0x2F, 0xF5, 0x3B, 0xD5, 0xB9, 0xEC, 0x41, 0xE1, 0xF8, 0xDA, 0x0E, 0xEA, + 0x27, 0xC6, 0xD8, 0xEA, 0xB3, 0xC1, 0x6A, 0xE3, 0xE2, 0xCE, 0x57, 0xD6, + 0x66, 0xD8, 0xB8, 0xD1, 0x44, 0xD6, 0x0B, 0xD0, 0x5A, 0xD0, 0x64, 0xC4, + 0xD6, 0xCF, 0x29, 0xBF, 0x99, 0xD6, 0x09, 0xC5, 0x50, 0xDB, 0xDE, 0xC9, + 0xE2, 0xDE, 0x91, 0xD5, 0xBE, 0xE4, 0xB1, 0xE3, 0x0C, 0xE6, 0xDB, 0xE3, + 0x64, 0xE8, 0xF7, 0xE1, 0x16, 0xEE, 0x2C, 0xE3, 0x80, 0xF0, 0xE9, 0xDE, + 0xC3, 0xEC, 0x99, 0xDA, 0x4E, 0xE6, 0x86, 0xDB, 0xF6, 0xE1, 0x23, 0xE3, + 0xF9, 0xE1, 0xAB, 0xEA, 0x7D, 0xE6, 0x83, 0xE5, 0xE2, 0xEB, 0xF5, 0xE0, + 0x59, 0xE9, 0xA2, 0xE6, 0x8A, 0xE0, 0x77, 0xEB, 0x99, 0xE2, 0x5F, 0xEA, + 0x59, 0xEF, 0x24, 0xE3, 0x6E, 0xF7, 0xC2, 0xDE, 0x62, 0xF3, 0x39, 0xE2, + 0x25, 0xF1, 0x0F, 0xEE, 0x13, 0xF8, 0x2E, 0xF7, 0xF1, 0xF6, 0x44, 0xF1, + 0xAC, 0xF2, 0x3C, 0xE9, 0x47, 0xFB, 0x78, 0xF0, 0x5A, 0x07, 0x7F, 0x00, + 0xEC, 0x06, 0xE3, 0xFC, 0x74, 0xFD, 0x99, 0xEA, 0x28, 0xFD, 0x9B, 0xE9, + 0x74, 0x08, 0x9F, 0xFA, 0x8F, 0x15, 0x20, 0x08, 0x39, 0x17, 0x7F, 0x0B, + 0xA7, 0x0A, 0x3B, 0x11, 0x2C, 0x05, 0x49, 0x21, 0x5F, 0x0C, 0x30, 0x27, + 0x08, 0x0E, 0xE2, 0x16, 0x1E, 0x00, 0xA2, 0xFF, 0x49, 0xF8, 0x6E, 0xF7, + 0x15, 0xFF, 0x6E, 0x00, 0x48, 0xFE, 0xB3, 0x01, 0x74, 0x00, 0x9E, 0x02, + 0x61, 0x0D, 0x54, 0x0D, 0x9E, 0x0F, 0x63, 0x17, 0x67, 0x0B, 0xF2, 0x1A, + 0xEB, 0x09, 0x54, 0x13, 0xE7, 0xFD, 0x97, 0x07, 0x82, 0xE9, 0x5C, 0x01, + 0x03, 0xE9, 0xB2, 0x03, 0x72, 0x01, 0xB8, 0xFD, 0xDC, 0x19, 0x81, 0xEB, + 0x86, 0x20, 0xF6, 0xE1, 0xEB, 0x22, 0x80, 0xF6, 0xFD, 0x27, 0x53, 0x19, + 0xD3, 0x1A, 0x03, 0x28, 0xF4, 0x0B, 0xBC, 0x2D, 0xA6, 0x07, 0x4E, 0x26, + 0xCA, 0x0A, 0xB8, 0x13, 0xDD, 0x11, 0xCF, 0x06, 0xFD, 0x0D, 0xFD, 0x03, + 0xC5, 0x0C, 0x7E, 0x14, 0x13, 0x09, 0x3E, 0x1F, 0x64, 0xF9, 0x60, 0x17, + 0x33, 0xFA, 0x30, 0x14, 0x68, 0x10, 0x41, 0x20, 0xAF, 0x1A, 0x34, 0x28, + 0x39, 0x0F, 0xE9, 0x20, 0xA0, 0x0C, 0x91, 0x18, 0xA7, 0x16, 0xEC, 0x13, + 0x87, 0x15, 0x10, 0x16, 0x60, 0x08, 0xCA, 0x1B, 0x4B, 0x03, 0xDB, 0x1F, + 0xE4, 0x10, 0xDF, 0x27, 0xAD, 0x22, 0x1C, 0x31, 0x0E, 0x2D, 0x1E, 0x3A, + 0xEA, 0x2A, 0xE1, 0x3A, 0x0B, 0x1D, 0x51, 0x2D, 0x46, 0x17, 0xF7, 0x24, + 0xBD, 0x1A, 0x6B, 0x1E, 0x04, 0x1A, 0x6B, 0x16, 0xA1, 0x16, 0x60, 0x11, + 0x76, 0x1C, 0x33, 0x0F, 0x89, 0x20, 0xAC, 0x16, 0xB9, 0x15, 0xE7, 0x1B, + 0xDE, 0x13, 0x07, 0x19, 0x3D, 0x1C, 0x29, 0x14, 0xEF, 0x22, 0x8E, 0x18, + 0x81, 0x2D, 0x8D, 0x29, 0x39, 0x24, 0x41, 0x2C, 0xE3, 0x04, 0x8B, 0x16, + 0xD8, 0xFF, 0xFB, 0x01, 0x21, 0x14, 0xD5, 0xF4, 0x2D, 0x1D, 0x67, 0xF2, + 0xAA, 0x18, 0x48, 0xFF, 0x68, 0x15, 0xFB, 0x0F, 0xF9, 0x21, 0xEA, 0x1D, + 0xB9, 0x30, 0xBA, 0x19, 0x5E, 0x34, 0xAF, 0x15, 0xD9, 0x29, 0x83, 0x1B, + 0x97, 0x1C, 0xF6, 0x19, 0xDE, 0x17, 0xA6, 0x1A, 0x21, 0x0B, 0x8E, 0x1F, + 0xFA, 0xFE, 0x05, 0x26, 0x7B, 0xFB, 0x9C, 0x23, 0xE7, 0xFE, 0x57, 0x16, + 0x0C, 0x0F, 0xDF, 0x1B, 0x3B, 0x1C, 0x05, 0x29, 0x15, 0x16, 0xD2, 0x1C, + 0x09, 0x0F, 0x1F, 0x0E, 0xAD, 0x11, 0xE9, 0x0B, 0x76, 0x06, 0x31, 0x04, + 0xC7, 0xF4, 0x60, 0xF5, 0x28, 0xFD, 0x2B, 0xEF, 0x21, 0x11, 0xCD, 0xF0, + 0x37, 0x15, 0x84, 0xFC, 0x08, 0x08, 0xCB, 0x13, 0xDA, 0xF8, 0x4C, 0x17, + 0xF8, 0xF9, 0x30, 0x05, 0x24, 0x04, 0xDE, 0xF7, 0x6F, 0x0A, 0xDE, 0xF3, + 0x5D, 0x0B, 0x5E, 0xF3, 0x7E, 0x09, 0x94, 0xF7, 0x07, 0x08, 0xD1, 0x02, + 0xA4, 0x05, 0xE1, 0x0A, 0xDB, 0x03, 0xEF, 0x07, 0xE0, 0x03, 0xCC, 0xFB, + 0x5C, 0x0C, 0x3E, 0xF0, 0xA6, 0x13, 0x1C, 0xE5, 0xD8, 0x0C, 0xDA, 0xE6, + 0xBC, 0x03, 0xA2, 0xF9, 0x80, 0xF5, 0x8C, 0xF9, 0x7F, 0xEA, 0x18, 0xEC, + 0x02, 0xEA, 0x20, 0xE8, 0x06, 0xDC, 0x1F, 0xE8, 0x09, 0xD0, 0xD2, 0xF1, + 0xC8, 0xD6, 0xEE, 0xFB, 0xFB, 0xE2, 0x24, 0xFB, 0xD1, 0xEC, 0x2B, 0xF7, + 0xFF, 0xE6, 0x74, 0xEB, 0xE6, 0xDD, 0x66, 0xE3, 0xE7, 0xE6, 0x3D, 0xEB, + 0x05, 0xF3, 0xF9, 0xF3, 0x26, 0xF6, 0x16, 0xFA, 0x70, 0xF9, 0xF9, 0xFF, + 0x5D, 0xF9, 0xC4, 0xF6, 0xC6, 0xF2, 0xBC, 0xE7, 0x05, 0xEE, 0x83, 0xED, + 0x60, 0xE9, 0xFC, 0xF8, 0xC3, 0xDE, 0xDA, 0xF7, 0xFB, 0xD8, 0x95, 0xF4, + 0x5A, 0xDB, 0xEA, 0xEF, 0x23, 0xD8, 0xC7, 0xED, 0xEC, 0xD7, 0x2F, 0xEC, + 0xF1, 0xE7, 0x09, 0xE1, 0xA7, 0xF9, 0x2C, 0xDC, 0x78, 0xFA, 0x67, 0xE5, + 0x8E, 0xE8, 0x40, 0xED, 0x39, 0xDB, 0x4F, 0xE6, 0x6E, 0xE0, 0x66, 0xCF, + 0x44, 0xE8, 0xF5, 0xBA, 0x34, 0xE2, 0xB3, 0xBD, 0xBD, 0xD9, 0x00, 0xD1, + 0x64, 0xE5, 0xA2, 0xD7, 0xCD, 0xF5, 0xF8, 0xCD, 0x52, 0xF2, 0xD6, 0xC8, + 0xC4, 0xE6, 0x47, 0xCE, 0xA8, 0xE5, 0x35, 0xDB, 0xC3, 0xEB, 0xF8, 0xE6, + 0x94, 0xF8, 0xEE, 0xEC, 0x2D, 0x05, 0x1B, 0xF7, 0x25, 0xF7, 0x11, 0x00, + 0x6D, 0xE0, 0xDB, 0x03, 0x83, 0xE2, 0xDE, 0x06, 0x2F, 0xEC, 0x1C, 0x01, + 0xC0, 0xEC, 0x8C, 0xFA, 0xDA, 0xF0, 0x07, 0xFE, 0xFA, 0xFF, 0x91, 0x09, + 0xEE, 0x0D, 0x23, 0x10, 0xD2, 0x13, 0x79, 0x0B, 0xAA, 0x0D, 0x18, 0x08, + 0x5B, 0x09, 0x61, 0x0F, 0x10, 0x12, 0x6E, 0x13, 0x88, 0x18, 0x5E, 0x13, + 0x14, 0x11, 0x02, 0x18, 0xF9, 0x06, 0xC1, 0x19, 0xC7, 0x0E, 0x78, 0x14, + 0x0F, 0x1B, 0x09, 0x08, 0x9D, 0x1D, 0x92, 0xFF, 0xBB, 0x24, 0x3A, 0x07, + 0x61, 0x2E, 0x40, 0x1B, 0xEC, 0x26, 0xB4, 0x2B, 0x88, 0x18, 0x01, 0x31, + 0x37, 0x16, 0x30, 0x30, 0x7A, 0x19, 0x5E, 0x28, 0x3E, 0x21, 0xC1, 0x20, + 0x52, 0x2F, 0x25, 0x23, 0xFE, 0x32, 0x03, 0x24, 0x7E, 0x2E, 0x71, 0x26, + 0x86, 0x2E, 0x4D, 0x30, 0x85, 0x2C, 0x8E, 0x35, 0xC6, 0x1F, 0x4F, 0x30, + 0xBE, 0x05, 0xBA, 0x1F, 0x08, 0xF2, 0x9A, 0x18, 0xA2, 0xF7, 0x3A, 0x1F, + 0x10, 0x09, 0xE2, 0x1F, 0x48, 0x0F, 0xF7, 0x1F, 0xCC, 0x04, 0xA4, 0x23, + 0xDA, 0x01, 0x9A, 0x22, 0x2D, 0x17, 0xE1, 0x16, 0xA1, 0x2B, 0xE7, 0x07, + 0x62, 0x26, 0x78, 0x03, 0xCD, 0x13, 0x7D, 0x06, 0xCB, 0x09, 0x73, 0x06, + 0xE2, 0x0E, 0x47, 0x02, 0x3D, 0x15, 0x39, 0xFA, 0x6D, 0x16, 0x91, 0xF9, + 0x55, 0x0D, 0x5D, 0x01, 0x43, 0xFC, 0xF9, 0x05, 0xF1, 0xF9, 0x6C, 0x0F, + 0x85, 0x05, 0xF3, 0x12, 0x8E, 0x08, 0x57, 0x00, 0x43, 0x04, 0xBC, 0xF3, + 0x7F, 0x04, 0x7E, 0xF9, 0x2E, 0xFB, 0x4D, 0xF4, 0x6C, 0xE7, 0x7E, 0xEB, + 0x69, 0xD9, 0x31, 0xF4, 0x13, 0xD5, 0x69, 0xF6, 0x64, 0xE0, 0x55, 0xEC, + 0x6E, 0xF3, 0xD3, 0xE8, 0x08, 0xFA, 0xB5, 0xE8, 0x74, 0xF0, 0x78, 0xE4, + 0x39, 0xE5, 0xF3, 0xD9, 0x3D, 0xDE, 0xB2, 0xC7, 0x16, 0xDC, 0xAA, 0xBA, + 0x8B, 0xDA, 0xC7, 0xB8, 0x98, 0xD9, 0xB4, 0xC4, 0xD9, 0xDC, 0x95, 0xDD, + 0xD4, 0xE0, 0x62, 0xED, 0xF2, 0xE8, 0xC2, 0xED, 0x58, 0xEE, 0xBB, 0xEA, + 0xD6, 0xEA, 0x78, 0xEA, 0x55, 0xE5, 0x87, 0xEC, 0xFA, 0xDC, 0xFB, 0xE8, + 0xAF, 0xD3, 0xCA, 0xDD, 0xB9, 0xD8, 0x89, 0xDA, 0x48, 0xE3, 0x45, 0xDE, + 0x4B, 0xDC, 0x9C, 0xE1, 0xCE, 0xCD, 0xA4, 0xE8, 0x0D, 0xD6, 0xC2, 0xF4, + 0xDC, 0xED, 0xA0, 0xFC, 0xBF, 0xF3, 0x21, 0xFF, 0x47, 0xE8, 0xC1, 0x04, + 0xF9, 0xDC, 0x5E, 0x01, 0xFB, 0xD8, 0xD6, 0xEE, 0xF6, 0xDF, 0x78, 0xE0, + 0x86, 0xE7, 0x77, 0xE0, 0xEE, 0xE5, 0x2B, 0xE7, 0xE8, 0xE5, 0x58, 0xF6, + 0xBB, 0xE9, 0x04, 0x0B, 0x3C, 0xF4, 0x4E, 0x17, 0x07, 0x06, 0xB6, 0x13, + 0x94, 0x11, 0x85, 0x08, 0x2D, 0x10, 0x17, 0xFF, 0x73, 0x0D, 0x24, 0xF9, + 0x9A, 0x11, 0x64, 0xFF, 0x45, 0x10, 0xB6, 0x07, 0xCB, 0x0B, 0xC7, 0x07, + 0x5A, 0x0E, 0x66, 0x09, 0x72, 0x16, 0xD8, 0x0E, 0x72, 0x1E, 0x92, 0x12, + 0xC2, 0x21, 0x87, 0x10, 0xFB, 0x22, 0x14, 0x0B, 0xD0, 0x22, 0xDD, 0x05, + 0xF8, 0x21, 0x5B, 0x03, 0xDF, 0x1C, 0x0E, 0x00, 0xA9, 0x0D, 0xC5, 0xFC, + 0xC9, 0xFE, 0x70, 0x02, 0x7D, 0x02, 0xAC, 0x0B, 0xF7, 0x15, 0xC6, 0x16, + 0x55, 0x25, 0x9E, 0x20, 0xC7, 0x26, 0xE4, 0x1C, 0x15, 0x26, 0x96, 0x18, + 0xEE, 0x31, 0x07, 0x23, 0xBA, 0x3C, 0x5E, 0x29, 0x25, 0x38, 0x58, 0x26, + 0x91, 0x28, 0x80, 0x25, 0x2B, 0x1F, 0xAB, 0x29, 0x6C, 0x1F, 0x92, 0x32, + 0x1C, 0x22, 0x65, 0x38, 0xA4, 0x29, 0x8C, 0x34, 0xF1, 0x2D, 0x7B, 0x2C, + 0x36, 0x31, 0xB7, 0x2C, 0xBF, 0x38, 0x58, 0x33, 0xE4, 0x36, 0xC8, 0x2F, + 0x19, 0x2B, 0xF0, 0x21, 0x42, 0x20, 0xEA, 0x14, 0xCC, 0x1A, 0x62, 0x16, + 0xDD, 0x19, 0x5A, 0x26, 0xE7, 0x14, 0x51, 0x2B, 0xBF, 0x0D, 0x8B, 0x25, + 0x2E, 0x0B, 0x47, 0x24, 0x32, 0x0C, 0xD3, 0x24, 0xFB, 0x0D, 0xFB, 0x1A, + 0x2D, 0x11, 0xB5, 0x09, 0x0B, 0x12, 0x39, 0x01, 0x11, 0x0A, 0x94, 0x07, + 0x0B, 0xFA, 0x61, 0x19, 0x7F, 0xEB, 0x3C, 0x24, 0x94, 0xEB, 0x74, 0x1D, + 0xCC, 0xFB, 0x85, 0x18, 0xBC, 0x07, 0xAD, 0x21, 0xA6, 0x06, 0x5E, 0x25, + 0xE2, 0x05, 0x3A, 0x17, 0xC5, 0x06, 0x46, 0x04, 0xDE, 0x07, 0x98, 0xFB, + 0x25, 0x0B, 0x31, 0xFF, 0x50, 0x0B, 0x64, 0xFF, 0x74, 0x03, 0xB5, 0xF7, + 0x9C, 0xF4, 0x88, 0xF8, 0x16, 0xEF, 0x50, 0x07, 0x6A, 0xF9, 0x04, 0x0A, + 0xF4, 0x01, 0x47, 0xF5, 0xDF, 0x02, 0x81, 0xE5, 0xCE, 0xFE, 0x67, 0xDE, + 0xCF, 0xF8, 0xAA, 0xD9, 0xE3, 0xF9, 0x45, 0xDF, 0xF6, 0x03, 0x05, 0xE9, + 0x56, 0x09, 0x25, 0xE8, 0x5F, 0x03, 0xEA, 0xE0, 0x1D, 0xF9, 0xAF, 0xE4, + 0xA2, 0xEE, 0x36, 0xEE, 0x7D, 0xEF, 0x04, 0xF3, 0xDE, 0xFA, 0x93, 0xF1, + 0x5C, 0xFC, 0xD9, 0xED, 0x39, 0xF1, 0xE5, 0xE9, 0x9E, 0xE8, 0xC7, 0xDF, + 0x43, 0xE8, 0xAF, 0xD0, 0x73, 0xE6, 0xFD, 0xC6, 0xBD, 0xD7, 0xA7, 0xCD, + 0x88, 0xC9, 0xBD, 0xDD, 0x7C, 0xCB, 0x80, 0xE3, 0x17, 0xD1, 0xA8, 0xDE, + 0x53, 0xD1, 0x4C, 0xDD, 0x13, 0xCF, 0xFE, 0xD7, 0x50, 0xCB, 0x71, 0xCB, + 0x0D, 0xCB, 0xF1, 0xC5, 0x4B, 0xCD, 0xD6, 0xBF, 0x9A, 0xCC, 0x01, 0xBA, + 0xC6, 0xCD, 0xBB, 0xBE, 0xFE, 0xD9, 0xA7, 0xC8, 0xF6, 0xE8, 0x4C, 0xD3, + 0x21, 0xE8, 0x4F, 0xDD, 0xC1, 0xD6, 0xB8, 0xE3, 0x77, 0xC6, 0x53, 0xE6, + 0x3F, 0xC8, 0x35, 0xE5, 0x48, 0xD6, 0x40, 0xDE, 0xFB, 0xDF, 0xF6, 0xDE, + 0xB9, 0xDE, 0x34, 0xE4, 0x33, 0xDE, 0x14, 0xE1, 0xF4, 0xE3, 0xFF, 0xDE, + 0xFC, 0xE9, 0x70, 0xE2, 0xF2, 0xEE, 0x8E, 0xDF, 0x57, 0xEE, 0x67, 0xD2, + 0x10, 0xE9, 0x06, 0xCC, 0x52, 0xE8, 0xED, 0xD1, 0x69, 0xEE, 0x0F, 0xDE, + 0x90, 0xE3, 0xF7, 0xE4, 0x9F, 0xC7, 0xA2, 0xE1, 0xFE, 0xC1, 0xE3, 0xE1, + 0x25, 0xD3, 0x65, 0xE7, 0xBD, 0xD9, 0x26, 0xEA, 0x5B, 0xD8, 0xC6, 0xE7, + 0x4B, 0xDF, 0x4E, 0xE4, 0x11, 0xED, 0x71, 0xE8, 0xA1, 0xF3, 0x5E, 0xEE, + 0x63, 0xE5, 0xCD, 0xEA, 0x35, 0xD6, 0xF5, 0xE7, 0x5C, 0xDF, 0xCD, 0xED, + 0x7F, 0xF2, 0x19, 0xF7, 0xCD, 0xF6, 0xB1, 0x01, 0x13, 0xEE, 0x43, 0x02, + 0xF3, 0xE5, 0xD3, 0xF7, 0x35, 0xE6, 0xF2, 0xF4, 0xE5, 0xEF, 0x01, 0xFA, + 0x8D, 0xFC, 0x43, 0xFD, 0x8F, 0xFE, 0x85, 0xFC, 0x2A, 0xF7, 0xE2, 0xFE, + 0xDE, 0xF8, 0xCC, 0x07, 0x1E, 0x07, 0x51, 0x0C, 0x53, 0x0F, 0x32, 0x06, + 0x6D, 0x08, 0xF2, 0xFE, 0x83, 0x03, 0x30, 0xFF, 0x85, 0x06, 0x6B, 0x04, + 0xFF, 0x06, 0xA7, 0x0E, 0x71, 0x0C, 0xEA, 0x19, 0x5A, 0x1C, 0x67, 0x1D, + 0x58, 0x21, 0xF2, 0x16, 0xE4, 0x19, 0x22, 0x11, 0x66, 0x1B, 0xFB, 0x17, + 0x47, 0x27, 0xAB, 0x23, 0x44, 0x35, 0x2B, 0x2C, 0x1E, 0x40, 0x93, 0x35, + 0x86, 0x3C, 0x2D, 0x3B, 0x0B, 0x2B, 0xCD, 0x30, 0xAB, 0x1E, 0xCF, 0x20, + 0x30, 0x22, 0x4C, 0x1B, 0x8D, 0x26, 0x7B, 0x1A, 0xD1, 0x1A, 0x3E, 0x1A, + 0x15, 0x12, 0xAD, 0x21, 0x5F, 0x1E, 0xEB, 0x28, 0x0A, 0x2D, 0x0A, 0x25, + 0xF5, 0x2E, 0x18, 0x23, 0xC3, 0x21, 0xFE, 0x25, 0x41, 0x10, 0xEC, 0x2B, + 0x56, 0x0E, 0xD3, 0x34, 0x1F, 0x15, 0x5A, 0x2D, 0xDB, 0x19, 0x80, 0x15, + 0xC8, 0x21, 0x20, 0x02, 0xD0, 0x2F, 0xCF, 0x02, 0x88, 0x37, 0x36, 0x15, + 0xF2, 0x2F, 0x05, 0x26, 0x60, 0x2A, 0xB5, 0x2D, 0xD3, 0x2C, 0xE5, 0x2F, + 0x48, 0x27, 0x4C, 0x30, 0x36, 0x21, 0x02, 0x36, 0x6F, 0x29, 0xB5, 0x39, + 0x77, 0x33, 0x1A, 0x35, 0x5D, 0x32, 0xB4, 0x35, 0x3F, 0x31, 0x15, 0x3B, + 0xE9, 0x35, 0x77, 0x36, 0x2F, 0x34, 0x2E, 0x2D, 0x88, 0x2D, 0xE7, 0x28, + 0xC1, 0x2D, 0x7E, 0x25, 0xC4, 0x2F, 0x6C, 0x21, 0xDD, 0x2B, 0x95, 0x23, + 0x2A, 0x25, 0x02, 0x25, 0x6F, 0x20, 0x20, 0x1D, 0xD4, 0x1E, 0xAC, 0x14, + 0xA8, 0x18, 0x70, 0x0F, 0x26, 0x14, 0x1F, 0x0E, 0xA7, 0x1B, 0x4A, 0x14, + 0x7E, 0x1D, 0xDB, 0x1E, 0x60, 0x13, 0xF8, 0x29, 0x3E, 0x0D, 0x61, 0x2D, + 0x7A, 0x16, 0x7E, 0x22, 0x3B, 0x25, 0xF9, 0x12, 0x7A, 0x2A, 0x9C, 0x10, + 0x3A, 0x23, 0x93, 0x18, 0xF4, 0x18, 0x6F, 0x17, 0xDD, 0x1A, 0x7A, 0x10, + 0xDC, 0x24, 0x96, 0x0B, 0xF6, 0x2B, 0x85, 0x09, 0xAC, 0x21, 0xF0, 0x0A, + 0x89, 0x06, 0xC3, 0x0C, 0x9C, 0xF6, 0x74, 0x10, 0x2D, 0xFA, 0x6B, 0x14, + 0xD1, 0x01, 0xD0, 0x0F, 0xE2, 0x01, 0x3E, 0x01, 0x63, 0xFB, 0xF2, 0xF5, + 0x38, 0xFC, 0xD2, 0xF5, 0xDF, 0x05, 0x01, 0xF8, 0x9E, 0x08, 0x6B, 0xFC, + 0x47, 0x06, 0x03, 0x06, 0xF8, 0x09, 0x1A, 0x0B, 0x0A, 0x09, 0x60, 0x08, + 0xF0, 0x03, 0x23, 0x06, 0x96, 0x08, 0x0C, 0x04, 0xEF, 0x13, 0xD7, 0xFB, + 0x32, 0x19, 0x4F, 0xF2, 0x5E, 0x10, 0x15, 0xF2, 0x8C, 0xF8, 0x35, 0xF8, + 0x48, 0xE6, 0x41, 0xFD, 0x76, 0xE8, 0x5A, 0xFF, 0x05, 0xF1, 0xC6, 0x03, + 0x68, 0xF9, 0xC0, 0x0C, 0xFF, 0xF6, 0xDB, 0x0A, 0x13, 0xE8, 0x89, 0xFE, + 0x4B, 0xE1, 0xC8, 0xF7, 0x05, 0xE8, 0x74, 0xEF, 0xC2, 0xEB, 0xD2, 0xE0, + 0xBE, 0xE1, 0x5E, 0xDC, 0xA3, 0xD5, 0x99, 0xE9, 0x52, 0xD1, 0x68, 0xF9, + 0x27, 0xD0, 0x84, 0xFB, 0x5E, 0xD3, 0x18, 0xF0, 0xDD, 0xDE, 0xFD, 0xDB, + 0x94, 0xE6, 0xC9, 0xC7, 0x1C, 0xDE, 0xD8, 0xBD, 0x84, 0xD2, 0x30, 0xC2, + 0xDB, 0xD3, 0x1F, 0xCD, 0x8C, 0xDD, 0x58, 0xCE, 0xB2, 0xE2, 0x01, 0xC8, + 0x21, 0xDD, 0xC6, 0xC9, 0xAF, 0xD1, 0x14, 0xCF, 0x10, 0xC9, 0x1E, 0xCF, + 0xB9, 0xC3, 0x9C, 0xD2, 0x12, 0xC2, 0x4D, 0xDA, 0x9D, 0xCF, 0x3E, 0xDD, + 0xAB, 0xDB, 0x07, 0xD2, 0x6E, 0xDC, 0xCD, 0xC1, 0x47, 0xE2, 0x2E, 0xB9, + 0x2C, 0xE5, 0x9A, 0xB0, 0x05, 0xDB, 0x8F, 0xB2, 0xF6, 0xCB, 0x59, 0xCA, + 0x3D, 0xC1, 0xB0, 0xDC, 0xF0, 0xC0, 0xE5, 0xDD, 0x1D, 0xC6, 0x36, 0xDC, + 0x36, 0xC8, 0x5A, 0xD2, 0x3B, 0xD1, 0x2A, 0xC1, 0xFC, 0xD6, 0x7A, 0xBB, + 0x49, 0xC9, 0xA0, 0xC3, 0xBA, 0xBF, 0x24, 0xCF, 0xD5, 0xCB, 0xD7, 0xD8, + 0xB7, 0xE1, 0x50, 0xE0, 0x40, 0xF2, 0xE8, 0xE9, 0x4A, 0xF3, 0x31, 0xF5, + 0x31, 0xE2, 0x3E, 0xF6, 0xC2, 0xD0, 0xA6, 0xEC, 0xD9, 0xD6, 0x77, 0xEA, + 0xF4, 0xEB, 0x19, 0xEB, 0x3F, 0xF4, 0x15, 0xE2, 0x0A, 0xED, 0x99, 0xE0, + 0xBF, 0xE7, 0x6D, 0xEE, 0x30, 0xEC, 0x54, 0xFC, 0xA4, 0xF1, 0x33, 0xFF, + 0xAF, 0xF7, 0x77, 0xFE, 0x5D, 0xFA, 0x83, 0xFC, 0xC2, 0xF3, 0x1C, 0xF7, + 0xB2, 0xF5, 0xD5, 0xFF, 0x03, 0x00, 0xE2, 0x0D, 0xF7, 0x02, 0xDB, 0x0E, + 0x38, 0x03, 0x29, 0x12, 0xFE, 0xFF, 0x6E, 0x17, 0x0B, 0x05, 0x45, 0x18, + 0xBC, 0x1B, 0xA5, 0x1E, 0x02, 0x2E, 0xC5, 0x26, 0x48, 0x35, 0x7D, 0x23, + 0x21, 0x35, 0x31, 0x19, 0x19, 0x2A, 0x79, 0x17, 0x88, 0x1D, 0x01, 0x1E, + 0xE7, 0x1A, 0x10, 0x1D, 0xC4, 0x21, 0x7D, 0x18, 0xA1, 0x2B, 0x04, 0x20, + 0xDE, 0x28, 0x2D, 0x29, 0xA4, 0x1C, 0xAB, 0x2A, 0xF3, 0x23, 0x96, 0x30, + 0xA0, 0x30, 0xA3, 0x32, 0xFA, 0x27, 0xD7, 0x2B, 0xE3, 0x1B, 0x2D, 0x2F, + 0xBD, 0x18, 0x96, 0x32, 0x94, 0x14, 0x8E, 0x2A, 0xBA, 0x0D, 0xB7, 0x25, + 0x98, 0x14, 0x5F, 0x24, 0xFE, 0x28, 0x52, 0x1B, 0x8F, 0x2A, 0x89, 0x11, + 0x5D, 0x1B, 0xF8, 0x15, 0xEA, 0x18, 0x7B, 0x1D, 0xC8, 0x1D, 0x49, 0x1A, + 0x34, 0x1F, 0x03, 0x15, 0xE2, 0x23, 0x44, 0x10, 0x70, 0x27, 0xA0, 0x0B, + 0xF4, 0x2A, 0x87, 0x10, 0x67, 0x2C, 0xFF, 0x16, 0x20, 0x23, 0xF3, 0x17, + 0x8C, 0x1A, 0xEE, 0x1B, 0x67, 0x1B, 0xA6, 0x1C, 0x80, 0x1E, 0xAE, 0x12, + 0xA1, 0x1C, 0x3F, 0xFF, 0x78, 0x1A, 0x2F, 0xE9, 0x0E, 0x17, 0x74, 0xDB, + 0x23, 0x0C, 0x2D, 0xDB, 0x96, 0xF4, 0x92, 0xE1, 0x69, 0xDA, 0x87, 0xE4, + 0xB0, 0xD0, 0x64, 0xE2, 0x1E, 0xD5, 0x0F, 0xE2, 0x46, 0xDB, 0x2F, 0xE5, + 0x9C, 0xD7, 0xFD, 0xE2, 0x78, 0xC9, 0x12, 0xE4, 0xD0, 0xC1, 0x38, 0xEF, + 0xC4, 0xC8, 0xC7, 0xEB, 0x23, 0xD1, 0x78, 0xDA, 0x19, 0xCE, 0x0D, 0xD3, + 0xE5, 0xC9, 0xB6, 0xD5, 0xD1, 0xCD, 0x4D, 0xD8, 0xEE, 0xCB, 0xF2, 0xD7, + 0x7F, 0xC2, 0x2A, 0xDD, 0x4B, 0xC4, 0xBC, 0xEA, 0x0B, 0xD6, 0x63, 0xF6, + 0x97, 0xE6, 0x08, 0xF9, 0xF0, 0xED, 0xBB, 0xF2, 0x8D, 0xF3, 0xA0, 0xE9, + 0xE0, 0xF6, 0xD7, 0xEB, 0x9F, 0xF2, 0x45, 0xF6, 0xED, 0xF3, 0xF7, 0xF6, + 0xC8, 0xFA, 0x2E, 0xEC, 0x19, 0xF5, 0x8F, 0xE0, 0x73, 0xE9, 0x85, 0xDC, + 0x0B, 0xE8, 0x99, 0xDF, 0x5A, 0xF2, 0xD0, 0xE1, 0x72, 0xF3, 0xBD, 0xDA, + 0xCF, 0xE0, 0x0C, 0xD3, 0x56, 0xDA, 0xD4, 0xDB, 0x4D, 0xED, 0xC9, 0xE7, + 0xD0, 0xFC, 0x67, 0xE9, 0xCB, 0xF8, 0xDB, 0xE7, 0x64, 0xF8, 0xA7, 0xF4, + 0xE8, 0x04, 0xBD, 0x0A, 0x24, 0x12, 0x20, 0x13, 0x65, 0x1A, 0x0A, 0x0F, + 0xFF, 0x1B, 0x32, 0x0B, 0x38, 0x19, 0x29, 0x0B, 0xE0, 0x14, 0x16, 0x11, + 0x83, 0x0C, 0xCB, 0x14, 0x77, 0x07, 0x99, 0x10, 0xB2, 0x13, 0x1E, 0x1A, + 0xE6, 0x1D, 0xFA, 0x28, 0xEE, 0x1F, 0xAF, 0x2D, 0x2A, 0x21, 0x90, 0x30, + 0xAF, 0x16, 0xCA, 0x2B, 0xEE, 0x09, 0x1A, 0x20, 0x45, 0x0F, 0xC6, 0x1B, + 0x98, 0x23, 0x77, 0x19, 0xBD, 0x2E, 0x35, 0x12, 0xD0, 0x22, 0x12, 0x14, + 0x3C, 0x1A, 0x36, 0x25, 0x06, 0x22, 0xB2, 0x2D, 0x85, 0x26, 0x8B, 0x2A, + 0x62, 0x24, 0xB7, 0x2C, 0x11, 0x23, 0xEC, 0x29, 0x18, 0x22, 0xE4, 0x1E, + 0x7D, 0x1B, 0xF8, 0x19, 0xFB, 0x18, 0x9B, 0x24, 0x29, 0x1D, 0x53, 0x28, + 0xD4, 0x23, 0x27, 0x1F, 0x8F, 0x2A, 0x9B, 0x23, 0xA8, 0x2B, 0x8A, 0x31, + 0x29, 0x2B, 0xC0, 0x34, 0x4C, 0x2A, 0x8A, 0x32, 0xE9, 0x26, 0x5B, 0x31, + 0x35, 0x2A, 0xE9, 0x2E, 0x4A, 0x31, 0xCC, 0x2B, 0xCD, 0x29, 0xF2, 0x1D, + 0x33, 0x20, 0x4C, 0x11, 0xB7, 0x1C, 0x11, 0x14, 0x2F, 0x1D, 0xB3, 0x20, + 0xAD, 0x22, 0x59, 0x30, 0x22, 0x1D, 0xFB, 0x37, 0x1E, 0x0E, 0x8D, 0x2D, + 0x02, 0x07, 0x01, 0x12, 0x29, 0x0C, 0x9C, 0xFC, 0x23, 0x10, 0x86, 0xF6, + 0x75, 0x08, 0x63, 0xF1, 0x8D, 0x08, 0x99, 0xF3, 0x8A, 0x11, 0x7D, 0xF8, + 0x0F, 0x17, 0x28, 0xFD, 0x00, 0x1D, 0xE8, 0x0D, 0x08, 0x14, 0x6C, 0x13, + 0xD1, 0xFD, 0x81, 0x0A, 0xA6, 0xEF, 0xE2, 0x09, 0xA5, 0xE8, 0x10, 0x0B, + 0xF0, 0xE4, 0xCD, 0x04, 0xD6, 0xEA, 0xEF, 0xF9, 0xF1, 0xEF, 0x94, 0xE5, + 0x93, 0xEE, 0xC7, 0xD6, 0xC0, 0xEF, 0x76, 0xDD, 0x57, 0xF2, 0xFE, 0xED, + 0x0E, 0xF1, 0xF6, 0xFC, 0xB5, 0xE9, 0xE0, 0x01, 0xA6, 0xE6, 0xE5, 0x02, + 0x60, 0xF0, 0xBA, 0x07, 0x2C, 0xF8, 0x96, 0xFC, 0x2A, 0xF3, 0xD7, 0xE1, + 0xB0, 0xED, 0xA0, 0xD3, 0x85, 0xF9, 0x1E, 0xD6, 0xAC, 0x0B, 0x6E, 0xDC, + 0xC1, 0x09, 0x95, 0xE3, 0xEB, 0x00, 0xD5, 0xF2, 0x7B, 0xFE, 0x7D, 0x02, + 0x6A, 0xFD, 0xAF, 0x0C, 0x88, 0x05, 0x09, 0x15, 0x57, 0x08, 0x12, 0x07, + 0x06, 0xF8, 0x30, 0xE4, 0x81, 0xEA, 0xE8, 0xD4, 0x5B, 0xEE, 0x43, 0xE4, + 0x79, 0xF7, 0x44, 0xF2, 0x30, 0xFC, 0x22, 0xF2, 0xC2, 0xFA, 0x97, 0xF3, + 0x27, 0xFA, 0x4E, 0xFF, 0xE4, 0xFF, 0x48, 0x0F, 0x78, 0xF7, 0xD3, 0x0B, + 0xD1, 0xDE, 0x8A, 0xF0, 0xDD, 0xD2, 0x44, 0xDF, 0x84, 0xD6, 0x2F, 0xE2, + 0x21, 0xDF, 0xF6, 0xE6, 0xA3, 0xE3, 0x49, 0xE7, 0xBC, 0xE3, 0x7E, 0xEA, + 0x3D, 0xF8, 0xFC, 0xFA, 0x07, 0x0E, 0xB7, 0x08, 0xDD, 0x01, 0x75, 0x08, + 0x25, 0xE8, 0x1B, 0x04, 0x2B, 0xDB, 0xC7, 0xFA, 0xDB, 0xDD, 0x27, 0xE8, + 0xEE, 0xF3, 0x61, 0xD3, 0xAC, 0x0B, 0x44, 0xC5, 0xF4, 0x00, 0x36, 0xBF, + 0x9D, 0xDC, 0x93, 0xC6, 0xC8, 0xCA, 0x02, 0xDB, 0x8F, 0xD7, 0x1C, 0xEC, + 0x64, 0xE3, 0xC0, 0xEC, 0x25, 0xED, 0x33, 0xF2, 0x73, 0xF5, 0x99, 0xF5, + 0x46, 0xEB, 0xE6, 0xE4, 0xF8, 0xDA, 0xA8, 0xDB, 0xBA, 0xCB, 0x52, 0xD8, + 0xF9, 0xC5, 0x0D, 0xDA, 0x77, 0xD1, 0xEB, 0xEE, 0xA8, 0xDE, 0x05, 0xFB, + 0xF8, 0xE5, 0xB8, 0xF5, 0x2C, 0xE6, 0x20, 0xF6, 0x70, 0xE2, 0xDE, 0xFD, + 0xB3, 0xE3, 0xCD, 0xFD, 0x4E, 0xEC, 0x97, 0xF5, 0xB0, 0xEC, 0x6E, 0xE4, + 0x39, 0xE5, 0x2B, 0xD8, 0x6A, 0xEC, 0x04, 0xE6, 0x5B, 0xFA, 0x13, 0xF7, + 0x53, 0x04, 0x06, 0x06, 0xF2, 0x04, 0xE4, 0x19, 0x86, 0xFF, 0xB3, 0x26, + 0x7C, 0xFD, 0x8F, 0x1B, 0xCE, 0xFB, 0xE2, 0xF8, 0x8C, 0xF9, 0x25, 0xE0, + 0x39, 0xF8, 0xBC, 0xE0, 0x02, 0xF0, 0xE9, 0xE0, 0x35, 0xDA, 0x8B, 0xD4, + 0xA2, 0xCE, 0xB4, 0xD6, 0x59, 0xDD, 0x7A, 0xE3, 0xCA, 0xF8, 0x6E, 0xEE, + 0x0D, 0x08, 0xE6, 0xFA, 0x0A, 0xFF, 0x65, 0xFA, 0xBD, 0xF9, 0x42, 0xFB, + 0xF6, 0x05, 0x7F, 0x07, 0xC9, 0x0B, 0x43, 0xFE, 0x34, 0x09, 0xA3, 0xE2, + 0x2F, 0x0D, 0x6C, 0xDB, 0xA6, 0x08, 0x91, 0xE0, 0xA7, 0x03, 0x92, 0xF4, + 0xBC, 0x09, 0xD3, 0x16, 0xB4, 0x1A, 0xCF, 0x2A, 0x7E, 0x35, 0x45, 0x2E, + 0x01, 0x3A, 0x33, 0x25, 0x2C, 0x2D, 0x0F, 0x25, 0xDF, 0x22, 0x0F, 0x26, + 0xF5, 0x19, 0xB6, 0x16, 0xD6, 0x13, 0x27, 0x0E, 0x40, 0x15, 0xE9, 0x16, + 0x1A, 0x26, 0x2F, 0x28, 0x25, 0x31, 0xF0, 0x32, 0xF1, 0x2D, 0xFF, 0x38, + 0x5F, 0x2F, 0x28, 0x3E, 0x39, 0x2E, 0x4F, 0x3E, 0x5F, 0x22, 0xFE, 0x37, + 0xC3, 0x14, 0x9E, 0x21, 0xF8, 0x0E, 0x4C, 0x0A, 0x93, 0x0E, 0xE7, 0x01, + 0xDA, 0x15, 0xA9, 0x03, 0x2D, 0x1D, 0xE4, 0x08, 0x06, 0x23, 0xEC, 0x1C, + 0x26, 0x2F, 0x47, 0x38, 0xDE, 0x39, 0xB3, 0x47, 0x31, 0x41, 0x35, 0x4E, + 0xB3, 0x46, 0x16, 0x43, 0xEA, 0x47, 0xB5, 0x24, 0x72, 0x41, 0x2C, 0x0D, + 0x87, 0x2C, 0x5C, 0x07, 0x87, 0x15, 0x7D, 0x07, 0xFE, 0x0D, 0xB7, 0x0A, + 0xBB, 0x13, 0x57, 0x18, 0x7B, 0x1D, 0xB7, 0x2A, 0x56, 0x25, 0xD7, 0x36, + 0x40, 0x22, 0x23, 0x3C, 0xEB, 0x12, 0x20, 0x36, 0x09, 0x0E, 0x70, 0x28, + 0x1A, 0x0C, 0x66, 0x1C, 0x94, 0x05, 0x1C, 0x17, 0xC9, 0x0B, 0x57, 0x16, + 0xEA, 0x10, 0x8E, 0x11, 0x45, 0x05, 0xB5, 0x08, 0x1F, 0x07, 0x11, 0x0E, + 0x86, 0x1C, 0x61, 0x20, 0xE1, 0x2A, 0x91, 0x2F, 0x55, 0x26, 0xFF, 0x2B, + 0x3C, 0x15, 0x60, 0x19, 0xA9, 0x10, 0xFD, 0x14, 0x4B, 0x16, 0x06, 0x22, + 0x84, 0x0B, 0xDE, 0x2A, 0xAA, 0xFC, 0x86, 0x2A, 0x97, 0xFF, 0xA9, 0x26, + 0x3B, 0x08, 0x82, 0x1B, 0x97, 0x0E, 0xCE, 0x10, 0xCA, 0x18, 0xAC, 0x10, + 0xFF, 0x17, 0xD4, 0x0E, 0x03, 0x0E, 0x0E, 0x0E, 0x9A, 0x09, 0xDC, 0x12, + 0xF9, 0x05, 0x34, 0x0B, 0x6E, 0x07, 0xBA, 0xFF, 0x6B, 0xFC, 0x69, 0xF7, + 0x1B, 0xEC, 0x48, 0xF2, 0x1C, 0xEF, 0x1E, 0xF6, 0x33, 0xF3, 0xE7, 0xFC, + 0x7D, 0xF1, 0x32, 0xFF, 0x21, 0xF7, 0xD6, 0xF4, 0x0B, 0x0A, 0xDC, 0xE9, + 0x5A, 0x12, 0x1C, 0xDD, 0x2B, 0x0D, 0x52, 0xD3, 0x61, 0x03, 0xEE, 0xD9, + 0xBE, 0xF2, 0x09, 0xDC, 0xF9, 0xFA, 0x57, 0xE6, 0xCB, 0x0A, 0xCB, 0xFA, + 0x6E, 0x06, 0xBC, 0x05, 0x9D, 0x03, 0x2B, 0x05, 0x25, 0x0A, 0x58, 0xFA, + 0xA6, 0x09, 0xE2, 0xF0, 0xDE, 0xFC, 0x05, 0xF0, 0x30, 0xF6, 0xBC, 0xF7, + 0x64, 0xF5, 0x0A, 0xF7, 0x88, 0xF2, 0xD5, 0xED, 0xC0, 0xFA, 0xDB, 0xF4, + 0xFC, 0x01, 0x2D, 0x03, 0x65, 0xEA, 0xD3, 0xFE, 0xF0, 0xD5, 0xAC, 0xF6, + 0xDD, 0xDD, 0xFC, 0xF7, 0x1F, 0xE6, 0x4B, 0xF7, 0x59, 0xE9, 0x9F, 0xEE, + 0x26, 0xF3, 0x01, 0xE0, 0x0F, 0xF4, 0x10, 0xD4, 0xD4, 0xEC, 0xEE, 0xD6, + 0xF1, 0xF1, 0x55, 0xE0, 0x35, 0xFC, 0x85, 0xE6, 0x5C, 0xFA, 0x60, 0xE9, + 0x89, 0xEE, 0xCD, 0xEB, 0x02, 0xE9, 0xFF, 0xF5, 0xCA, 0xE4, 0x1B, 0xFD, + 0x0B, 0xDC, 0xAD, 0xF5, 0x75, 0xD7, 0x5C, 0xE3, 0x91, 0xD9, 0x0F, 0xD5, + 0x4E, 0xDF, 0x21, 0xDA, 0xA1, 0xD8, 0x3D, 0xE0, 0x93, 0xC8, 0x57, 0xD6, + 0x77, 0xCC, 0x2F, 0xD9, 0xEA, 0xDA, 0x89, 0xE9, 0x74, 0xD6, 0x53, 0xEC, + 0xC9, 0xCA, 0x4F, 0xEB, 0x89, 0xCE, 0x83, 0xEA, 0x25, 0xD9, 0xDA, 0xE2, + 0xDC, 0xD6, 0x16, 0xDD, 0x9C, 0xCE, 0xC6, 0xDD, 0x5B, 0xD0, 0x6D, 0xD9, + 0x44, 0xD9, 0xB2, 0xD6, 0x7B, 0xE4, 0xC7, 0xE5, 0xDA, 0xEC, 0x66, 0xF7, + 0x0D, 0xEA, 0xDC, 0xF7, 0x70, 0xE4, 0xFF, 0xED, 0x18, 0xEB, 0xC3, 0xF0, + 0x21, 0xF1, 0xEF, 0xF7, 0x41, 0xEB, 0xDD, 0xF2, 0xB6, 0xE6, 0x05, 0xE9, + 0x88, 0xF0, 0xBA, 0xE5, 0x9A, 0xFF, 0xFF, 0xE9, 0x1A, 0x00, 0x4D, 0xF3, + 0x55, 0xF2, 0x61, 0x01, 0xC0, 0xEA, 0xC6, 0x0D, 0x49, 0xF2, 0xE0, 0x12, + 0x81, 0x02, 0x21, 0x0E, 0x4A, 0x10, 0x41, 0x02, 0xF8, 0x0C, 0xF4, 0xF0, + 0xB9, 0x06, 0xF5, 0xE7, 0xDD, 0x07, 0xD3, 0xF3, 0x07, 0xFE, 0x9C, 0xFF, + 0x27, 0x00, 0x5D, 0x06, 0x28, 0x16, 0x15, 0x07, 0x3A, 0x19, 0x5F, 0xFE, + 0x9C, 0x0E, 0x90, 0xFB, 0xE4, 0x15, 0x6F, 0x04, 0x5E, 0x24, 0x88, 0x0A, + 0xB5, 0x22, 0x55, 0x04, 0x6F, 0x16, 0xDC, 0x01, 0x1F, 0x0D, 0x5D, 0x09, + 0xD4, 0x0B, 0xA4, 0x0D, 0xE6, 0x14, 0x75, 0x0C, 0x08, 0x20, 0xD2, 0x0B, + 0x78, 0x1C, 0xCA, 0x07, 0x15, 0x14, 0x13, 0x08, 0x65, 0x0F, 0x61, 0x09, + 0x46, 0x06, 0x52, 0xFD, 0x47, 0xFB, 0xCA, 0xF2, 0xE0, 0xF3, 0x5B, 0xF2, + 0x99, 0xF5, 0x5B, 0xFA, 0x14, 0xFF, 0x25, 0x08, 0xEF, 0x07, 0xA7, 0x12, + 0xEE, 0x07, 0x84, 0x1A, 0x04, 0xFC, 0x80, 0x1F, 0xF8, 0xF5, 0x85, 0x1C, + 0x4A, 0x04, 0x85, 0x17, 0xB0, 0x0D, 0xDE, 0x12, 0x21, 0x09, 0xDB, 0x0C, + 0xD1, 0x0B, 0x24, 0x0C, 0x91, 0x0B, 0x74, 0x04, 0x1A, 0x02, 0xD8, 0xF0, + 0x08, 0x00, 0xB1, 0xEB, 0x1F, 0x09, 0x54, 0x02, 0xDE, 0x0E, 0x5A, 0x1E, + 0x24, 0x05, 0x76, 0x23, 0x8B, 0xFA, 0xD8, 0x1B, 0xD2, 0xFC, 0x2B, 0x1A, + 0xD3, 0x01, 0x89, 0x18, 0x82, 0x01, 0xB2, 0x0E, 0x97, 0x02, 0xD3, 0x02, + 0x6E, 0xFF, 0x93, 0xF9, 0x57, 0xF9, 0x29, 0xF7, 0xF1, 0xFA, 0xB1, 0xFD, + 0x02, 0x00, 0xF3, 0x01, 0x38, 0xFF, 0x6F, 0xF9, 0xF2, 0xF6, 0x2B, 0xED, + 0x48, 0xF0, 0xFC, 0xE8, 0x55, 0xF0, 0x2E, 0xDF, 0x9B, 0xE7, 0x80, 0xC6, + 0xF5, 0xD3, 0x13, 0xBA, 0x60, 0xCE, 0x69, 0xC7, 0x85, 0xDB, 0xBE, 0xDD, + 0x9C, 0xED, 0x86, 0xF4, 0x70, 0xFC, 0xF2, 0x02, 0xAC, 0x01, 0x0F, 0x00, + 0x4C, 0xF7, 0xE3, 0xF0, 0x71, 0xED, 0x51, 0xE6, 0xCC, 0xE9, 0x67, 0xDB, + 0x97, 0xE5, 0x8B, 0xCD, 0x9F, 0xEA, 0xB6, 0xCA, 0x44, 0xF6, 0x74, 0xCF, + 0x23, 0x01, 0x58, 0xDC, 0xA7, 0xFE, 0xB2, 0xE9, 0x02, 0xED, 0xDE, 0xF2, + 0x2E, 0xDB, 0x40, 0xFA, 0x3C, 0xD7, 0x22, 0xFF, 0x8B, 0xE6, 0xD8, 0x00, + 0xD4, 0xF2, 0xEA, 0xF1, 0x72, 0xF4, 0x84, 0xE5, 0x02, 0xEE, 0xB0, 0xE9, + 0x0D, 0xE5, 0x4D, 0xE8, 0xD1, 0xF1, 0xAE, 0xE8, 0xC8, 0x00, 0x9A, 0xED, + 0x33, 0xFD, 0x57, 0xED, 0x3B, 0xFE, 0x72, 0xF5, 0x78, 0x0D, 0xAC, 0x0A, + 0x98, 0x19, 0x9F, 0x15, 0xF6, 0x11, 0xC5, 0x09, 0x07, 0xFC, 0xB1, 0x01, + 0x91, 0xEF, 0xCF, 0x0E, 0xC4, 0xFA, 0x1C, 0x1F, 0x31, 0x09, 0xDC, 0x20, + 0xA3, 0x0C, 0xFC, 0x1D, 0x32, 0x0F, 0x55, 0x1D, 0x47, 0x19, 0x19, 0x1F, + 0x59, 0x1D, 0xBF, 0x26, 0x67, 0x0C, 0xB7, 0x25, 0xA0, 0xFF, 0x2C, 0x1B, + 0xAB, 0x02, 0xDB, 0x14, 0xA9, 0x07, 0x0E, 0x1B, 0x9E, 0x12, 0x25, 0x28, + 0xB9, 0x1C, 0xB8, 0x2B, 0xB9, 0x18, 0x31, 0x2D, 0xD9, 0x08, 0x71, 0x2B, + 0xE4, 0x07, 0x37, 0x27, 0x3B, 0x1E, 0xB1, 0x29, 0xA4, 0x35, 0x7E, 0x29, + 0xBE, 0x3E, 0xA8, 0x21, 0xD2, 0x3B, 0x5D, 0x19, 0xC8, 0x37, 0x21, 0x12, + 0x18, 0x3A, 0xE5, 0x0F, 0x9C, 0x3C, 0x79, 0x18, 0x1E, 0x35, 0xC0, 0x25, + 0xC7, 0x2D, 0x93, 0x30, 0xB1, 0x27, 0x56, 0x2F, 0xA4, 0x23, 0xE9, 0x29, + 0x36, 0x25, 0x77, 0x29, 0x5A, 0x26, 0x5F, 0x27, 0xBC, 0x26, 0x6E, 0x22, + 0xFF, 0x22, 0xDF, 0x1B, 0x2A, 0x25, 0xE8, 0x1E, 0x60, 0x2A, 0x39, 0x28, + 0xAC, 0x21, 0x64, 0x2E, 0x09, 0x1B, 0xA0, 0x39, 0x19, 0x11, 0x6E, 0x37, + 0x41, 0x00, 0x8E, 0x23, 0xBE, 0x03, 0xF1, 0x14, 0x8D, 0x11, 0x6B, 0x0B, + 0x95, 0x14, 0x60, 0x04, 0x2F, 0x16, 0x05, 0x07, 0x3F, 0x1A, 0x17, 0x11, + 0x44, 0x19, 0x11, 0x18, 0xD9, 0x1D, 0x19, 0x1D, 0x47, 0x24, 0x26, 0x1C, + 0x70, 0x1A, 0xFF, 0x0F, 0xFB, 0x10, 0x83, 0x07, 0x8B, 0x13, 0x96, 0x08, + 0x62, 0x0E, 0x10, 0x07, 0x60, 0x09, 0x39, 0x05, 0xE0, 0x12, 0xDC, 0x01, + 0x5C, 0x1C, 0x26, 0xF7, 0xE9, 0x19, 0xF6, 0xF0, 0x29, 0x09, 0x3C, 0xF4, + 0x46, 0xF7, 0x0E, 0xF6, 0x60, 0xF0, 0x30, 0xF3, 0x82, 0xF0, 0x65, 0xF3, + 0x4A, 0xF9, 0xEF, 0xF9, 0x42, 0x09, 0x77, 0x03, 0x2F, 0x01, 0xBC, 0xFA, + 0xF0, 0xEB, 0xF0, 0xE8, 0x27, 0xEF, 0xAD, 0xED, 0x8B, 0xF6, 0x26, 0xF5, + 0xDD, 0xFC, 0x66, 0xF3, 0xF4, 0x03, 0xF5, 0xF4, 0x51, 0x03, 0xF8, 0xFE, + 0x18, 0x07, 0x4C, 0x08, 0xCB, 0x05, 0x59, 0x04, 0x0C, 0xF3, 0x52, 0xFE, + 0xDD, 0xDC, 0x61, 0xF8, 0x7D, 0xCB, 0xCD, 0xE7, 0xB7, 0xC8, 0xE1, 0xDE, + 0x68, 0xDD, 0x95, 0xE3, 0x5E, 0xF3, 0x51, 0xDD, 0xA4, 0xF3, 0x09, 0xD7, + 0x79, 0xE1, 0x86, 0xDE, 0x95, 0xD1, 0x92, 0xE4, 0x27, 0xCF, 0x76, 0xE3, + 0xBF, 0xD1, 0x43, 0xE1, 0x73, 0xCA, 0x1F, 0xDD, 0x3A, 0xC3, 0x74, 0xDA, + 0xBE, 0xC8, 0x32, 0xDF, 0x5B, 0xC4, 0x78, 0xDA, 0x23, 0xB9, 0xE4, 0xC7, + 0x45, 0xBF, 0xAE, 0xBF, 0xE3, 0xC9, 0x6D, 0xC8, 0x87, 0xD1, 0x55, 0xD2, + 0x39, 0xDF, 0xC6, 0xD1, 0xC4, 0xE8, 0xD9, 0xC7, 0xC5, 0xE7, 0x92, 0xC7, + 0xFE, 0xE1, 0x47, 0xD6, 0x3B, 0xDB, 0x07, 0xE1, 0x01, 0xD6, 0x02, 0xE1, + 0xEE, 0xD1, 0xD9, 0xDA, 0x5C, 0xCB, 0x11, 0xD7, 0x24, 0xC7, 0xCF, 0xDA, + 0xAD, 0xCE, 0xC9, 0xDF, 0xF0, 0xDC, 0xA3, 0xE0, 0xB3, 0xE5, 0x11, 0xE0, + 0xFA, 0xE4, 0x81, 0xE0, 0x1D, 0xE4, 0xCC, 0xDC, 0x1D, 0xE0, 0xA4, 0xCB, + 0xC0, 0xCF, 0x17, 0xB9, 0xFC, 0xC3, 0x8C, 0xBC, 0xD7, 0xC6, 0xA9, 0xCF, + 0x97, 0xD0, 0xB0, 0xDA, 0x82, 0xE3, 0x2F, 0xDC, 0xDC, 0xF6, 0xEB, 0xE0, + 0x16, 0xF8, 0xBE, 0xE8, 0xF2, 0xE8, 0x4D, 0xED, 0xB2, 0xDF, 0x5F, 0xF2, + 0x39, 0xE6, 0xEE, 0xF5, 0x50, 0xF4, 0x5F, 0xF4, 0x54, 0xF9, 0xE3, 0xEC, + 0x78, 0xF3, 0x4D, 0xE0, 0x16, 0xF3, 0xE5, 0xD9, 0x99, 0xFA, 0xEC, 0xE3, + 0xC1, 0x02, 0xD2, 0xF6, 0xC7, 0x08, 0x4D, 0x05, 0x41, 0x06, 0x0B, 0x0D, + 0x49, 0xFF, 0x86, 0x10, 0xF2, 0x02, 0x37, 0x0F, 0x0E, 0x0C, 0x28, 0x0A, + 0x97, 0x0F, 0xFF, 0x06, 0x1A, 0x0D, 0xDA, 0x06, 0x33, 0x08, 0xC5, 0x08, + 0x6F, 0x06, 0xD2, 0x0D, 0x7C, 0x08, 0x12, 0x10, 0xAF, 0x08, 0xCE, 0x0A, + 0x0F, 0x0B, 0x07, 0x06, 0x65, 0x0B, 0x92, 0x05, 0x73, 0x07, 0xEC, 0x08, + 0xFE, 0x0D, 0xD4, 0x0A, 0xF1, 0x1B, 0xD2, 0x04, 0x2A, 0x25, 0x2C, 0x02, + 0x23, 0x1F, 0xAD, 0x07, 0xDC, 0x10, 0x21, 0x13, 0x4A, 0x0D, 0x92, 0x20, + 0x1D, 0x13, 0x2A, 0x28, 0xB6, 0x19, 0x8B, 0x29, 0xD5, 0x1F, 0x60, 0x24, + 0xB7, 0x1E, 0x9D, 0x19, 0xC7, 0x11, 0x2D, 0x10, 0xB9, 0x06, 0x7D, 0x0E, + 0x83, 0x0A, 0x2E, 0x11, 0x87, 0x13, 0x43, 0x16, 0x69, 0x15, 0xEF, 0x1B, + 0xB2, 0x1E, 0xFC, 0x24, 0x3E, 0x25, 0x0B, 0x29, 0xB3, 0x19, 0x9E, 0x24, + 0xC4, 0x10, 0x77, 0x2A, 0xD3, 0x12, 0x24, 0x35, 0x43, 0x19, 0x92, 0x31, + 0xF7, 0x1D, 0x57, 0x27, 0xD0, 0x23, 0x93, 0x21, 0xC7, 0x2F, 0xD2, 0x19, + 0x28, 0x3A, 0xB9, 0x13, 0x78, 0x3C, 0x26, 0x16, 0x31, 0x3B, 0x76, 0x1A, + 0xFA, 0x3A, 0xC5, 0x23, 0x74, 0x32, 0x30, 0x33, 0x66, 0x22, 0x1A, 0x3B, + 0x16, 0x16, 0x58, 0x32, 0x07, 0x11, 0x34, 0x26, 0xF6, 0x16, 0x4E, 0x25, + 0x1B, 0x1E, 0xD4, 0x26, 0x88, 0x1C, 0xB5, 0x26, 0xDC, 0x1F, 0xDC, 0x2F, + 0xB1, 0x2C, 0x31, 0x38, 0x3B, 0x35, 0x0E, 0x35, 0x01, 0x30, 0x06, 0x32, + 0x32, 0x1E, 0xB1, 0x30, 0x63, 0x0C, 0xBA, 0x27, 0x02, 0x03, 0xD6, 0x1E, + 0xD2, 0x03, 0xD8, 0x24, 0xEE, 0x0D, 0x0E, 0x2E, 0x19, 0x17, 0x4F, 0x28, + 0xD1, 0x1B, 0xA9, 0x1F, 0xA3, 0x25, 0x04, 0x25, 0xB4, 0x31, 0x03, 0x2D, + 0x4B, 0x31, 0x49, 0x26, 0x49, 0x2A, 0xC7, 0x18, 0xDA, 0x24, 0x80, 0x0E, + 0xD8, 0x23, 0x16, 0x08, 0x6C, 0x2B, 0xD0, 0x0B, 0x58, 0x32, 0x6B, 0x11, + 0x01, 0x2E, 0xC8, 0x0D, 0xE9, 0x21, 0x62, 0x0B, 0xEC, 0x1B, 0x71, 0x11, + 0xF2, 0x1E, 0x2B, 0x19, 0x61, 0x21, 0x08, 0x1C, 0x3B, 0x20, 0xA2, 0x1A, + 0x4A, 0x1D, 0x1D, 0x1B, 0x6D, 0x19, 0xA5, 0x1D, 0x63, 0x0C, 0xE7, 0x13, + 0x02, 0xF8, 0x32, 0x00, 0xD5, 0xEA, 0xD5, 0xF8, 0x7F, 0xEF, 0x96, 0xFE, + 0x39, 0x02, 0x3E, 0x03, 0x77, 0x08, 0xE1, 0x02, 0xE8, 0x0C, 0x53, 0x07, + 0x50, 0x1A, 0x14, 0x08, 0x8C, 0x18, 0x12, 0xFD, 0x4F, 0x0F, 0x7F, 0xF4, + 0xC8, 0x0D, 0x5B, 0xF1, 0x95, 0x0D, 0xFF, 0xF5, 0xEE, 0x08, 0x3B, 0x00, + 0x1A, 0x06, 0xE4, 0x08, 0xDF, 0x02, 0xFF, 0x0B, 0x30, 0xFA, 0xA6, 0x06, + 0x56, 0xF5, 0xE2, 0x00, 0x63, 0xF1, 0xAD, 0xFD, 0x7B, 0xE9, 0xCD, 0xF6, + 0x3A, 0xEB, 0x6B, 0xED, 0x5A, 0xF2, 0xD1, 0xE8, 0xBE, 0xF0, 0x11, 0xEC, + 0x81, 0xEB, 0x3E, 0xF5, 0x1D, 0xE4, 0x06, 0xF7, 0x13, 0xDF, 0x6C, 0xF3, + 0xE7, 0xDE, 0x2F, 0x00, 0x4C, 0xDD, 0x94, 0x17, 0x17, 0xD6, 0xAE, 0x14, + 0x7E, 0xD7, 0xD4, 0xF6, 0x2F, 0xE9, 0x20, 0xE0, 0xBA, 0xF5, 0xFE, 0xD7, + 0xB6, 0xF6, 0xD2, 0xD6, 0x92, 0xF6, 0x8F, 0xD9, 0x53, 0xF9, 0x4B, 0xE0, + 0x7B, 0xF7, 0x23, 0xE7, 0x0C, 0xF2, 0xF8, 0xEA, 0xCA, 0xED, 0xCE, 0xEA, + 0x04, 0xE8, 0x18, 0xE5, 0x48, 0xE4, 0xCE, 0xDE, 0xD0, 0xD8, 0x2F, 0xD6, + 0x40, 0xCF, 0x56, 0xD6, 0x07, 0xD3, 0x79, 0xDC, 0xFB, 0xD1, 0xC9, 0xD7, + 0x4D, 0xCD, 0x7E, 0xD8, 0xE5, 0xD1, 0x86, 0xE6, 0xE6, 0xDE, 0x70, 0xF1, + 0x71, 0xE7, 0x96, 0xF0, 0xF4, 0xE0, 0x42, 0xE8, 0x63, 0xD3, 0x4F, 0xE4, + 0x1B, 0xC4, 0x1B, 0xE0, 0xAC, 0xB6, 0x59, 0xCF, 0xE2, 0xBC, 0xCE, 0xBE, + 0xB1, 0xD3, 0x0F, 0xC1, 0x9E, 0xE1, 0xDD, 0xD0, 0xC3, 0xDF, 0x8C, 0xE3, + 0xC2, 0xDD, 0x9C, 0xF0, 0xF4, 0xE1, 0x39, 0xEF, 0x87, 0xE7, 0xB3, 0xE7, + 0x89, 0xED, 0x6D, 0xDF, 0xAA, 0xF7, 0x0F, 0xDF, 0x76, 0x04, 0x89, 0xE6, + 0x81, 0x05, 0xEB, 0xE3, 0xA1, 0xFD, 0x71, 0xE2, 0xE7, 0xF8, 0x27, 0xEC, + 0x16, 0xF9, 0xDC, 0xF5, 0x66, 0xFE, 0x6A, 0xF6, 0x36, 0x05, 0x71, 0xF1, + 0xDE, 0x0A, 0x09, 0xF5, 0x62, 0x09, 0x88, 0xFE, 0xBE, 0x02, 0xB3, 0x02, + 0x96, 0xFB, 0xB8, 0xF6, 0x90, 0xF3, 0xD2, 0xE9, 0xB2, 0xEA, 0x24, 0xEC, + 0x48, 0xE8, 0x23, 0xED, 0x61, 0xFB, 0xE0, 0xF3, 0xD3, 0x14, 0xBC, 0x06, + 0xE2, 0x19, 0x8B, 0x11, 0xA9, 0x16, 0xD9, 0x16, 0xDF, 0x14, 0xE7, 0x16, + 0xDC, 0x0D, 0xC8, 0x10, 0x21, 0x07, 0xBC, 0x0F, 0x7E, 0x01, 0xB9, 0x10, + 0x6E, 0xFF, 0xA8, 0x13, 0x11, 0xFF, 0x97, 0x16, 0x54, 0xF8, 0xFA, 0x16, + 0xDF, 0x00, 0xEA, 0x1F, 0x2A, 0x16, 0x45, 0x28, 0x12, 0x21, 0x44, 0x29, + 0xAA, 0x21, 0x8B, 0x2A, 0xD5, 0x1C, 0x34, 0x29, 0x9C, 0x18, 0x1B, 0x21, + 0x7D, 0x14, 0x3B, 0x19, 0x2C, 0x15, 0xAF, 0x14, 0xD3, 0x1D, 0x5D, 0x14, + 0xDF, 0x1F, 0x96, 0x17, 0x74, 0x14, 0x92, 0x10, 0x89, 0x0B, 0x26, 0x05, + 0x9A, 0x09, 0x93, 0xFC, 0x1E, 0x0A, 0x98, 0xF4, 0x71, 0x10, 0x7D, 0xEF, + 0x4A, 0x14, 0xD4, 0xEB, 0x53, 0x12, 0xF7, 0xED, 0x6D, 0x08, 0x30, 0xEE, + 0xA1, 0xFB, 0x46, 0xED, 0x37, 0xF8, 0xF8, 0xEF, 0x36, 0xF7, 0x6F, 0xF0, + 0x40, 0xF5, 0x7D, 0xF8, 0x01, 0xFA, 0xC5, 0x01, 0x23, 0x0A, 0x86, 0x07, + 0x01, 0x0F, 0x98, 0x05, 0x68, 0x02, 0x40, 0xF6, 0x9E, 0xF9, 0x84, 0xE8, + 0xB7, 0xEA, 0x13, 0xDB, 0xE6, 0xD6, 0x4C, 0xD3, 0x1B, 0xD7, 0x18, 0xDB, + 0x02, 0xE6, 0xE6, 0xE4, 0xE5, 0xF0, 0x4A, 0xED, 0x8A, 0xEA, 0xB8, 0xF2, + 0x3F, 0xD0, 0x34, 0xF2, 0xE1, 0xBC, 0x2E, 0xEC, 0xAC, 0xBE, 0x00, 0xE2, + 0xB6, 0xCD, 0xBF, 0xE2, 0x79, 0xE4, 0xCB, 0xEA, 0x79, 0xEE, 0xA3, 0xE2, + 0x37, 0xE9, 0x7A, 0xD2, 0x89, 0xE2, 0x9D, 0xD0, 0x74, 0xE1, 0xAB, 0xD7, + 0xD3, 0xEC, 0x48, 0xE3, 0x51, 0xEF, 0x86, 0xF0, 0x0B, 0xDF, 0x4D, 0xF6, + 0x19, 0xE0, 0x94, 0x01, 0x19, 0xED, 0xAD, 0x00, 0xC8, 0xF0, 0xDB, 0xEF, + 0x50, 0xF5, 0xE1, 0xEE, 0xDC, 0xF3, 0xE9, 0xF4, 0x3F, 0xF0, 0xA1, 0xFA, + 0x47, 0xF5, 0xBF, 0xFE, 0x0D, 0xF8, 0x01, 0xFC, 0x73, 0xF0, 0x69, 0xFA, + 0x85, 0xE2, 0x58, 0xF6, 0x33, 0xDE, 0x9D, 0xF0, 0xFB, 0xE9, 0xD7, 0xEF, + 0xBF, 0xF4, 0xCF, 0xEC, 0xA2, 0xF9, 0x3B, 0xED, 0xED, 0xFF, 0xD8, 0xF9, + 0x56, 0xFE, 0x09, 0x03, 0x63, 0xF9, 0xB1, 0x04, 0x9E, 0xF7, 0x3F, 0x02, + 0x82, 0xF7, 0x28, 0x00, 0xB0, 0x05, 0x92, 0x0B, 0xB6, 0x10, 0xBA, 0x0F, + 0xA5, 0x0B, 0x52, 0x00, 0x06, 0x06, 0x57, 0xF8, 0x17, 0x04, 0x6F, 0xF9, + 0x9B, 0x09, 0xFE, 0xF7, 0x40, 0x14, 0xEE, 0xF5, 0x2C, 0x1E, 0x99, 0xFA, + 0x39, 0x22, 0x90, 0x0B, 0x0F, 0x1A, 0x79, 0x19, 0x48, 0x11, 0x1B, 0x20, + 0x61, 0x0D, 0x4D, 0x26, 0x2A, 0x0B, 0xA2, 0x29, 0xD7, 0x0F, 0x56, 0x2D, + 0x37, 0x19, 0x73, 0x32, 0xF1, 0x1F, 0xC6, 0x2F, 0x4D, 0x26, 0x8E, 0x1F, + 0x1D, 0x23, 0x7C, 0x12, 0x3E, 0x12, 0x37, 0x14, 0x32, 0x14, 0x57, 0x1E, + 0xAE, 0x25, 0x47, 0x1E, 0xFA, 0x2C, 0x8B, 0x18, 0x5F, 0x2E, 0x82, 0x1D, + 0xE0, 0x31, 0x01, 0x23, 0x64, 0x3A, 0xCC, 0x25, 0xD8, 0x3D, 0x37, 0x26, + 0xEA, 0x36, 0x83, 0x28, 0x54, 0x2D, 0x1E, 0x31, 0x7C, 0x27, 0x28, 0x34, + 0x37, 0x23, 0xA5, 0x2E, 0x93, 0x23, 0xE1, 0x30, 0xD6, 0x25, 0xFE, 0x37, + 0x11, 0x25, 0x92, 0x33, 0x4B, 0x28, 0xE3, 0x27, 0x10, 0x2A, 0xCD, 0x19, + 0xEF, 0x2A, 0xF1, 0x0F, 0xA8, 0x26, 0x3C, 0x07, 0x3E, 0x1C, 0xBB, 0x04, + 0x5F, 0x18, 0x5A, 0x13, 0x0A, 0x10, 0x1C, 0x21, 0x22, 0x07, 0x7B, 0x2E, + 0x09, 0x08, 0xB4, 0x3A, 0x0C, 0x0C, 0x62, 0x32, 0x8B, 0x17, 0x3E, 0x1F, + 0x7B, 0x23, 0x1D, 0x14, 0xE4, 0x23, 0xEC, 0x10, 0xC9, 0x1F, 0x25, 0x13, + 0x32, 0x21, 0x04, 0x1B, 0xCC, 0x1F, 0x43, 0x1F, 0xA4, 0x12, 0x97, 0x19, + 0x4B, 0x0F, 0xA0, 0x11, 0xAD, 0x13, 0xAA, 0x0C, 0xDF, 0x0F, 0x37, 0x0A, + 0xFC, 0x10, 0xB3, 0x08, 0x5B, 0x1A, 0xC3, 0x0A, 0x69, 0x16, 0x81, 0x0A, + 0xD7, 0x03, 0x4E, 0x06, 0x5E, 0xFB, 0x76, 0x03, 0x74, 0xFA, 0xA8, 0x01, + 0x9F, 0xFB, 0x37, 0x08, 0x5B, 0x01, 0xAC, 0x11, 0x80, 0x08, 0xEE, 0x12, + 0x98, 0x0B, 0xB2, 0x05, 0xAD, 0x05, 0x62, 0xF8, 0xB6, 0xF8, 0x20, 0xF2, + 0xAA, 0xEC, 0x0C, 0xE2, 0xF1, 0xF4, 0x08, 0xDC, 0xDA, 0x06, 0x92, 0xE6, + 0x0A, 0x0A, 0x55, 0xEE, 0x2F, 0x07, 0x21, 0xF5, 0x4A, 0x08, 0x05, 0x01, + 0xEA, 0x05, 0x32, 0x0F, 0x5C, 0xF8, 0x23, 0x16, 0x22, 0xE6, 0xC5, 0x13, + 0xF0, 0xE7, 0x2A, 0x12, 0x1E, 0xF9, 0x63, 0x0A, 0x2F, 0x07, 0xC1, 0xFE, + 0xE9, 0x12, 0x1B, 0xFE, 0xA5, 0x0B, 0x1F, 0x00, 0x80, 0x03, 0x02, 0x0E, + 0x15, 0x05, 0xB7, 0x1E, 0xBF, 0x01, 0x2A, 0x1F, 0x2F, 0x0C, 0x7E, 0x25, + 0x62, 0x1F, 0x2A, 0x34, 0xC3, 0x2B, 0x80, 0x31, 0x0D, 0x2D, 0xF3, 0x1B, + 0x75, 0x2C, 0xF9, 0x12, 0x4E, 0x29, 0x15, 0x12, 0x72, 0x15, 0xD2, 0x04, + 0xE8, 0x0A, 0xD9, 0x02, 0x35, 0x02, 0x54, 0x00, 0x8A, 0xF7, 0x7B, 0xF0, + 0x5B, 0x07, 0x17, 0xF6, 0x34, 0x1B, 0x6B, 0x06, 0x54, 0x16, 0xF0, 0xF9, + 0x3A, 0x0A, 0xD1, 0xEA, 0xDA, 0x0A, 0x6B, 0xF7, 0x16, 0xFE, 0x98, 0xF8, + 0x56, 0xE1, 0x20, 0xE3, 0x07, 0xDC, 0x21, 0xE2, 0x8A, 0xED, 0x30, 0xFB, + 0xCB, 0x15, 0xF4, 0x20, 0xAC, 0x0D, 0x6F, 0x0F, 0x80, 0xDE, 0x79, 0xE5, + 0x6E, 0xEA, 0xF2, 0xFA, 0x0D, 0xD5, 0x38, 0xE5, 0x68, 0xA0, 0x8F, 0xB0, + 0x4E, 0xB6, 0x09, 0xCB, 0xFD, 0xC9, 0xF0, 0xDC, 0x26, 0xAE, 0xFB, 0xBD, + 0x38, 0xAB, 0x70, 0xBE, 0x9B, 0xBD, 0x43, 0xC5, 0x67, 0xB5, 0x1C, 0xAC, + 0x26, 0xA5, 0xDD, 0xA0, 0x18, 0xA9, 0x2F, 0xAD, 0xB7, 0xAE, 0x03, 0xAE, + 0x9B, 0xB0, 0x33, 0xAA, 0xD7, 0xBC, 0xB3, 0xB8, 0x7E, 0xC4, 0x9C, 0xBD, + 0xB0, 0xB6, 0xEC, 0xA8, 0xBF, 0xA4, 0xC3, 0x9B, 0x11, 0xB5, 0xEB, 0xAE, + 0x14, 0xC7, 0xFD, 0xBC, 0x3B, 0xAD, 0xD2, 0xA7, 0xEF, 0x98, 0xF9, 0xA1, + 0xCD, 0xA9, 0x7C, 0xB6, 0x4D, 0xB3, 0xAB, 0xB4, 0x65, 0xA6, 0x45, 0xA5, + 0xEE, 0x9F, 0x48, 0xA4, 0x3E, 0xA6, 0x1F, 0xAD, 0xD1, 0xAB, 0x65, 0xB3, + 0xEC, 0xB0, 0x9E, 0xB6, 0x97, 0xB5, 0xDF, 0xB5, 0xE8, 0xB3, 0xB0, 0xAC, + 0x26, 0xA6, 0x52, 0xA1, 0xC7, 0xA9, 0x96, 0xB0, 0xE8, 0xC0, 0x68, 0xCA, + 0x96, 0xD3, 0x18, 0xD3, 0x94, 0xE2, 0x24, 0xD7, 0xF9, 0xE1, 0x48, 0xD1, + 0x8C, 0xCF, 0x8D, 0xBE, 0x93, 0xBF, 0x57, 0xBA, 0x46, 0xB4, 0x33, 0xC6, + 0x0F, 0xB6, 0x92, 0xD3, 0xF5, 0xD5, 0x4C, 0xEB, 0x88, 0xE1, 0x75, 0xEB, + 0xA2, 0xD0, 0x7B, 0xDA, 0x2B, 0xD8, 0xC3, 0xE7, 0x42, 0xF9, 0xFC, 0x06, + 0xED, 0x15, 0x02, 0x1E, 0xCC, 0x23, 0x36, 0x27, 0xFF, 0x2A, 0xDB, 0x2B, + 0xF3, 0x21, 0xA0, 0x26, 0x7C, 0x0D, 0xEC, 0x18, 0x46, 0x08, 0xE1, 0x17, + 0xED, 0x0D, 0xE6, 0x1A, 0xE1, 0x1E, 0xA4, 0x22, 0xAA, 0x2D, 0x1E, 0x2C, + 0x76, 0x1D, 0xA3, 0x29, 0x9C, 0xFE, 0xF8, 0x1E, 0xAA, 0xF5, 0x6D, 0x13, + 0x0F, 0x0E, 0xF8, 0x1A, 0x05, 0x34, 0x1A, 0x37, 0xB5, 0x52, 0x87, 0x52, + 0x97, 0x5D, 0x3D, 0x5E, 0xBE, 0x55, 0xF3, 0x56, 0x0A, 0x4F, 0xEB, 0x44, + 0x9B, 0x4E, 0x73, 0x37, 0x83, 0x4A, 0x3D, 0x3D, 0x03, 0x52, 0x2D, 0x58, + 0xE6, 0x56, 0xC0, 0x5E, 0x42, 0x3B, 0xA3, 0x3F, 0xCE, 0x24, 0x22, 0x30, + 0x89, 0x2C, 0xDD, 0x37, 0x39, 0x39, 0xE5, 0x39, 0xAF, 0x3B, 0x32, 0x3E, + 0x4C, 0x43, 0x1F, 0x52, 0x93, 0x57, 0x1F, 0x67, 0xB2, 0x5E, 0x49, 0x65, + 0x72, 0x5C, 0x4A, 0x5D, 0xE8, 0x5C, 0xED, 0x5E, 0xA1, 0x4A, 0x2C, 0x57, + 0x46, 0x39, 0x21, 0x4D, 0x9D, 0x42, 0x0D, 0x48, 0x70, 0x51, 0x1D, 0x43, + 0xEF, 0x4E, 0x3A, 0x43, 0xEB, 0x45, 0xC1, 0x44, 0x00, 0x4D, 0x9C, 0x45, + 0xED, 0x56, 0x2F, 0x48, 0xCF, 0x5B, 0x8F, 0x55, 0xD7, 0x5F, 0x5D, 0x62, + 0xD4, 0x5F, 0xF4, 0x60, 0x42, 0x58, 0xD7, 0x58, 0x2A, 0x41, 0x73, 0x44, + 0xE7, 0x2B, 0xC5, 0x2C, 0x37, 0x28, 0xEA, 0x25, 0x54, 0x2A, 0xB6, 0x2C, + 0xA1, 0x32, 0x68, 0x3F, 0xE6, 0x38, 0x0D, 0x4E, 0x8A, 0x3D, 0x30, 0x51, + 0xB1, 0x4A, 0x43, 0x55, 0x0B, 0x54, 0x41, 0x5A, 0x06, 0x55, 0xE0, 0x5C, + 0x4E, 0x58, 0x15, 0x5F, 0xB5, 0x57, 0x95, 0x5C, 0x52, 0x42, 0x17, 0x49, + 0x61, 0x21, 0x00, 0x29, 0x74, 0x00, 0xF0, 0x04, 0xF0, 0xFD, 0x48, 0xFD, + 0x80, 0x14, 0x60, 0x0F, 0x65, 0x25, 0x02, 0x23, 0x99, 0x35, 0x7A, 0x3D, + 0x1A, 0x38, 0xE9, 0x44, 0x98, 0x28, 0x9A, 0x35, 0x65, 0x1E, 0xEC, 0x35, + 0x48, 0x19, 0xBC, 0x3B, 0x45, 0x13, 0x7B, 0x2C, 0x49, 0x20, 0x05, 0x27, + 0xFF, 0x2B, 0xEA, 0x2D, 0xB4, 0x19, 0x28, 0x21, 0xFB, 0xFD, 0xA6, 0x07, + 0xEE, 0xEE, 0x6D, 0xFE, 0xB8, 0xE6, 0x36, 0xFD, 0xDD, 0xF1, 0x56, 0x00, + 0xDC, 0x09, 0xC1, 0x0B, 0xAA, 0x15, 0xDD, 0x0F, 0x53, 0x1C, 0xFB, 0x0F, + 0xEA, 0x15, 0x12, 0x0E, 0x4B, 0x09, 0x03, 0x0C, 0xC2, 0x0D, 0x14, 0x05, + 0x15, 0x1A, 0x26, 0xF8, 0x60, 0x1B, 0x34, 0xFE, 0xCE, 0x05, 0x42, 0x09, + 0x6E, 0xE6, 0xDD, 0xF8, 0x0B, 0xD5, 0x77, 0xD9, 0x6C, 0xE0, 0x54, 0xD6, + 0x30, 0xF9, 0x16, 0xF0, 0x06, 0x00, 0xB4, 0xF9, 0x8E, 0x03, 0x18, 0xF6, + 0xFC, 0x06, 0x63, 0xF4, 0x58, 0x00, 0xEA, 0xF0, 0x9F, 0x01, 0x2B, 0xF0, + 0xF2, 0x00, 0xA8, 0xEE, 0x1B, 0xFC, 0x7B, 0xF2, 0xF4, 0xFD, 0xA9, 0xFD, + 0x72, 0xF5, 0xDD, 0xFB, 0x41, 0xD7, 0xCD, 0xE6, 0xC0, 0xBB, 0xB2, 0xD0, + 0xEE, 0xB6, 0x6A, 0xBD, 0x6A, 0xBC, 0xE7, 0xB1, 0x7F, 0xC4, 0xEC, 0xBA, + 0x77, 0xD7, 0xEE, 0xCF, 0xEA, 0xEE, 0x2C, 0xE1, 0xDB, 0xF5, 0xBC, 0xE7, + 0xCE, 0xED, 0x19, 0xE7, 0xE4, 0xDB, 0x9D, 0xDD, 0x1D, 0xD1, 0x41, 0xD3, + 0xFD, 0xDF, 0xA5, 0xD3, 0x82, 0xF0, 0x78, 0xD3, 0x66, 0xE9, 0x2D, 0xCF, + 0x41, 0xC9, 0xC3, 0xC3, 0x6C, 0xAA, 0xAC, 0xB6, 0x9E, 0xA4, 0x6C, 0xC0, + 0x11, 0xB6, 0xDB, 0xD5, 0x8F, 0xD2, 0xFB, 0xE1, 0xBB, 0xEB, 0xFF, 0xEE, + 0x95, 0xF5, 0x75, 0xF5, 0xE1, 0xFA, 0xE6, 0xED, 0x84, 0x07, 0x5D, 0xEB, + 0xE6, 0x07, 0x5A, 0xEA, 0x63, 0xF8, 0xA7, 0xE1, 0x12, 0xF2, 0x6F, 0xDE, + 0xC1, 0xEF, 0xB7, 0xDF, 0xCE, 0xDF, 0x26, 0xDF, 0x13, 0xCA, 0x1A, 0xD5, + 0xF9, 0xC4, 0xB5, 0xBF, 0xA5, 0xD5, 0xDE, 0xBF, 0x3F, 0xE2, 0x12, 0xD4, + 0x9E, 0xF8, 0xDE, 0xEC, 0x17, 0x06, 0x27, 0xF3, 0x4D, 0x09, 0x1E, 0xEF, + 0x15, 0x18, 0x9F, 0xFD, 0xD5, 0x17, 0xE8, 0x0A, 0x96, 0x10, 0x14, 0x14, + 0xAE, 0xFB, 0x22, 0x03, 0xEC, 0xEC, 0x3A, 0xF1, 0x52, 0xF3, 0x09, 0x02, + 0x35, 0xF6, 0x5A, 0x06, 0xAB, 0x00, 0xA6, 0xFD, 0xCE, 0x06, 0xD7, 0xFB, + 0x37, 0x00, 0xFA, 0xF5, 0x08, 0x15, 0xFD, 0xFF, 0xF5, 0x2A, 0xFF, 0x0E, + 0xBF, 0x2E, 0x8A, 0x1A, 0x50, 0x2D, 0x6B, 0x28, 0x4F, 0x26, 0xA7, 0x32, + 0xF8, 0x25, 0x7A, 0x33, 0x31, 0x1D, 0x68, 0x22, 0xA1, 0x18, 0xDD, 0x0E, + 0x8B, 0x25, 0x3E, 0x06, 0xE7, 0x20, 0x68, 0x03, 0xE9, 0x0B, 0x58, 0x02, + 0x14, 0x0B, 0xB0, 0x0C, 0x8B, 0x0F, 0x79, 0x10, 0x8B, 0x1A, 0x3F, 0x22, + 0x2A, 0x32, 0x27, 0x44, 0x23, 0x39, 0xE9, 0x40, 0xC1, 0x28, 0x47, 0x27, + 0xD9, 0x19, 0xA6, 0x1F, 0x0F, 0x17, 0x6B, 0x28, 0x39, 0x0F, 0x95, 0x28, + 0x66, 0x0A, 0x57, 0x20, 0xE9, 0x0B, 0x94, 0x0F, 0x66, 0x15, 0x6D, 0x0E, + 0x38, 0x0B, 0x6C, 0x19, 0x5B, 0xE4, 0x1A, 0x13, 0xD5, 0xD9, 0x36, 0x0D, + 0xBA, 0xF2, 0xF9, 0x0F, 0xBA, 0x16, 0x1F, 0x20, 0xB6, 0x27, 0x1F, 0x31, + 0x0B, 0x1C, 0xBA, 0x2F, 0x60, 0x11, 0xFE, 0x1A, 0xD4, 0x06, 0x16, 0x01, + 0x7D, 0xF9, 0xA9, 0xF4, 0xC6, 0xE7, 0xAF, 0xF3, 0xEF, 0xE1, 0xA1, 0x01, + 0xE5, 0xF2, 0x56, 0x07, 0xF9, 0x01, 0x3B, 0xF5, 0xC8, 0x07, 0xDF, 0xE9, + 0x74, 0xF0, 0x2F, 0xE5, 0xCD, 0xDD, 0x58, 0xE1, 0x95, 0xF8, 0xE8, 0xE7, + 0xBE, 0x0D, 0x73, 0xF9, 0xF3, 0x11, 0x1A, 0x07, 0x6A, 0x12, 0x3E, 0x06, + 0x02, 0xFE, 0xD5, 0x01, 0xD3, 0xF2, 0xDD, 0x03, 0x74, 0xF5, 0x63, 0xF2, + 0xCF, 0xEB, 0xFF, 0xE0, 0x17, 0xD0, 0xFA, 0xDC, 0x4B, 0xB0, 0x7E, 0xD3, + 0xAB, 0xA1, 0x5F, 0xD9, 0x80, 0xA1, 0x62, 0xDF, 0x55, 0xB8, 0x62, 0xDB, + 0x39, 0xE0, 0xDE, 0xD6, 0x7A, 0xF6, 0x9F, 0xDC, 0xE3, 0xEE, 0xF9, 0xDC, + 0x05, 0xD7, 0x38, 0xC9, 0xD6, 0xC6, 0x6E, 0xC7, 0x14, 0xD3, 0x7C, 0xD3, + 0x65, 0xDD, 0x05, 0xD7, 0x82, 0xC9, 0x79, 0xD9, 0xAF, 0xB1, 0x29, 0xE1, + 0x31, 0xAB, 0x80, 0xDE, 0xCA, 0xAC, 0xAD, 0xC8, 0x43, 0xB0, 0x73, 0xC0, + 0x54, 0xBC, 0x5A, 0xC6, 0x46, 0xE4, 0xDA, 0xCE, 0xFB, 0x05, 0xCA, 0xE2, + 0x39, 0xEF, 0xB3, 0xED, 0x31, 0xD2, 0x05, 0xD8, 0xE1, 0xD4, 0xAA, 0xB4, + 0x0E, 0xD1, 0x5E, 0xAE, 0x26, 0xC6, 0xB5, 0xBF, 0xC1, 0xBF, 0xAB, 0xC8, + 0xDA, 0xAD, 0x2D, 0xC6, 0xC3, 0xAA, 0x25, 0xC0, 0x89, 0xBF, 0x67, 0xBF, + 0x78, 0xCF, 0xCD, 0xC4, 0x01, 0xE2, 0xAE, 0xD3, 0x23, 0x01, 0xC9, 0xE6, + 0x5C, 0x06, 0x57, 0xF8, 0x90, 0xE5, 0x3B, 0xF9, 0x13, 0xD3, 0x55, 0xDF, + 0x69, 0xD6, 0xB2, 0xC8, 0x22, 0xD7, 0x43, 0xCD, 0xD5, 0xD7, 0x17, 0xD6, + 0xAE, 0xCE, 0x5D, 0xD5, 0xAC, 0xB2, 0xD8, 0xD4, 0xB3, 0xA4, 0x3B, 0xCC, + 0x13, 0xB0, 0x24, 0xBD, 0x58, 0xC3, 0xBA, 0xBA, 0xD0, 0xD1, 0x5E, 0xC9, + 0x4E, 0xE3, 0x9E, 0xD7, 0xF7, 0xFB, 0x4E, 0xE7, 0xF8, 0xF4, 0x41, 0xF3, + 0x35, 0xDC, 0xC8, 0xEF, 0x80, 0xD6, 0xD2, 0xE5, 0x3D, 0xE9, 0x28, 0xE2, + 0xFE, 0xF8, 0x66, 0xE8, 0x96, 0xE2, 0x45, 0xE6, 0x45, 0xD5, 0xB7, 0xE1, + 0x5C, 0xE3, 0x28, 0xD4, 0x87, 0xE0, 0xF3, 0xCA, 0x76, 0xD6, 0x7F, 0xDE, + 0x30, 0xEE, 0x7F, 0xF9, 0x77, 0x20, 0xB9, 0x0D, 0x1C, 0x33, 0xC7, 0x0C, + 0xBC, 0x25, 0x70, 0x0B, 0xF1, 0x0D, 0x1E, 0x14, 0xCE, 0xF3, 0x13, 0x1E, + 0x77, 0xF7, 0x91, 0x20, 0xA4, 0x17, 0x1A, 0x20, 0xC4, 0x28, 0x8E, 0x1D, + 0xC9, 0x2A, 0x64, 0x0D, 0xEE, 0x20, 0x4B, 0x0D, 0x7F, 0x08, 0x63, 0x14, + 0xDF, 0x0E, 0xFC, 0x0A, 0x47, 0x2B, 0x3B, 0x12, 0x2C, 0x3A, 0x50, 0x38, + 0xE7, 0x30, 0xD5, 0x43, 0x16, 0x18, 0xA6, 0x1F, 0x07, 0x0C, 0x05, 0x06, + 0x4A, 0xFB, 0x6A, 0xF7, 0x27, 0xF2, 0x5E, 0xF6, 0x0B, 0x05, 0x41, 0x06, + 0x8A, 0x16, 0x16, 0x0A, 0x7D, 0x1A, 0x01, 0x01, 0x16, 0x15, 0x23, 0xF9, + 0xCA, 0x1D, 0x3C, 0x04, 0xAC, 0x1A, 0xD4, 0x0A, 0x32, 0x13, 0x43, 0x1A, + 0x50, 0x30, 0xCF, 0x34, 0x31, 0x4C, 0x05, 0x42, 0xE0, 0x4F, 0x51, 0x42, + 0x82, 0x3F, 0xB1, 0x2C, 0xDD, 0x2A, 0xAD, 0x22, 0x9F, 0x25, 0xD8, 0x36, + 0x64, 0x2C, 0xAF, 0x3D, 0x7F, 0x2F, 0x47, 0x3B, 0x5D, 0x27, 0x5A, 0x46, + 0xEC, 0x28, 0xEF, 0x46, 0xC9, 0x40, 0xA5, 0x46, 0x7E, 0x51, 0x88, 0x4D, + 0xE0, 0x51, 0xF8, 0x52, 0x36, 0x4F, 0x51, 0x47, 0xCB, 0x52, 0x88, 0x36, + 0xA2, 0x3F, 0xE5, 0x2C, 0xD4, 0x1F, 0x9E, 0x1E, 0x2C, 0x1B, 0x22, 0x0E, + 0xE2, 0x18, 0x0A, 0x02, 0x15, 0x1D, 0x25, 0x05, 0x83, 0x1A, 0x24, 0x08, + 0xFD, 0x09, 0xF4, 0x0A, 0x83, 0x10, 0x1E, 0x1B, 0x49, 0x2E, 0x3E, 0x2A, + 0x4D, 0x4E, 0x34, 0x36, 0xC6, 0x5D, 0xB7, 0x48, 0xBF, 0x5C, 0x8E, 0x4F, + 0x44, 0x5C, 0x14, 0x4C, 0x29, 0x4C, 0xA3, 0x39, 0xEA, 0x2C, 0xDF, 0x38, + 0x84, 0x17, 0xDE, 0x3A, 0xD8, 0x19, 0xCA, 0x2A, 0xED, 0x34, 0x53, 0x2D, + 0x45, 0x37, 0x86, 0x24, 0xD8, 0x22, 0x1F, 0x22, 0x32, 0x0F, 0xBA, 0x25, + 0x0F, 0x0B, 0x86, 0x29, 0x8B, 0x32, 0x7D, 0x2B, 0xA2, 0x58, 0xB6, 0x2E, + 0x06, 0x4C, 0x3A, 0x3A, 0x17, 0x4D, 0xFF, 0x40, 0x43, 0x55, 0x7F, 0x35, + 0xD7, 0x38, 0x56, 0x2B, 0xEA, 0x1C, 0x19, 0x32, 0x11, 0x1E, 0xDD, 0x3B, + 0x03, 0x2A, 0x38, 0x4A, 0x83, 0x2A, 0xA2, 0x3F, 0x3D, 0x36, 0xF7, 0x2F, + 0xAA, 0x3D, 0x6B, 0x36, 0x75, 0x42, 0x8A, 0x45, 0xCE, 0x50, 0xB7, 0x45, + 0xE6, 0x5C, 0x70, 0x3C, 0x97, 0x52, 0x3C, 0x3C, 0x1D, 0x3A, 0xD7, 0x43, + 0xB4, 0x3B, 0xA8, 0x4B, 0xDB, 0x3D, 0xC6, 0x3D, 0x0B, 0x34, 0x5E, 0x26, + 0x1E, 0x23, 0x2F, 0x1D, 0x49, 0x07, 0x3A, 0x1E, 0xCE, 0xE5, 0xF2, 0xFF, + 0x0E, 0xD7, 0x70, 0xDE, 0xBA, 0xE9, 0x86, 0xDC, 0x47, 0xFF, 0x02, 0xEF, + 0xC3, 0x0B, 0xF6, 0x05, 0x80, 0x1D, 0x86, 0x05, 0x7B, 0x17, 0x27, 0xF5, + 0xE2, 0xF7, 0x60, 0xF2, 0x75, 0xED, 0xCB, 0x02, 0x70, 0xF3, 0xEC, 0x03, + 0xFC, 0xFD, 0x18, 0xF2, 0x7C, 0x0C, 0x57, 0xED, 0x08, 0x0B, 0xB5, 0xF1, + 0x3A, 0xF5, 0x38, 0xFC, 0x26, 0xF3, 0x52, 0x14, 0xE9, 0x17, 0xDB, 0x18, + 0x41, 0x3E, 0xF9, 0x17, 0xE0, 0x46, 0x4D, 0x2B, 0xF1, 0x39, 0x17, 0x34, + 0x30, 0x22, 0x60, 0x26, 0x32, 0x11, 0x13, 0x1A, 0x6E, 0x20, 0x1F, 0x1D, + 0xE0, 0x2E, 0xCE, 0x07, 0xCE, 0x25, 0x6C, 0x00, 0xA9, 0x02, 0x43, 0x13, + 0x25, 0xF3, 0x41, 0x0C, 0x5F, 0x05, 0xBC, 0xF6, 0x05, 0x13, 0xA9, 0xF6, + 0x1E, 0x1C, 0x96, 0x09, 0x3F, 0x27, 0xED, 0x1F, 0x61, 0x2A, 0x8F, 0x30, + 0xAB, 0x2D, 0x31, 0x3B, 0x20, 0x2D, 0xA4, 0x38, 0xF2, 0x19, 0xC2, 0x26, + 0x56, 0x0C, 0x44, 0x21, 0x4C, 0x04, 0x3C, 0x17, 0x8F, 0x06, 0xFA, 0x14, + 0x7A, 0xFA, 0x67, 0x1B, 0x5C, 0xE7, 0xCE, 0x19, 0xC4, 0xD9, 0xA4, 0x0B, + 0xEE, 0xD6, 0x85, 0x06, 0xC7, 0xEF, 0xBC, 0x0B, 0xE4, 0x0F, 0x02, 0x0E, + 0xF3, 0x22, 0x91, 0x18, 0x76, 0x08, 0xFF, 0x15, 0x53, 0xE5, 0x1F, 0x08, + 0xD6, 0xD9, 0x86, 0xE4, 0xA1, 0xD8, 0xB0, 0xC6, 0xE4, 0xE1, 0x0F, 0xC9, + 0xF0, 0xD4, 0x57, 0xCD, 0x0D, 0xB0, 0xB6, 0xD2, 0x46, 0xA8, 0xF8, 0xCE, + 0x46, 0xA9, 0x3E, 0xBB, 0x1F, 0xB6, 0x2F, 0xBB, 0xF1, 0xCE, 0x06, 0xD1, + 0x6A, 0xC7, 0xDE, 0xEB, 0x84, 0xC0, 0x2D, 0xFB, 0x66, 0xC5, 0x87, 0xF2, + 0x3C, 0xCE, 0x98, 0xDF, 0xA5, 0xD3, 0xD4, 0xD7, 0xA9, 0xDF, 0x48, 0xDF, + 0xF1, 0xEC, 0xE5, 0xD8, 0xFC, 0xE3, 0xB3, 0xD4, 0x6A, 0xCB, 0xFA, 0xC1, + 0x9D, 0xB7, 0x1E, 0xB2, 0xA1, 0xAD, 0x73, 0xBC, 0x63, 0xAF, 0x0C, 0xC2, + 0xA7, 0xB9, 0x66, 0xBF, 0x7A, 0xBD, 0x97, 0xBA, 0x7D, 0xBB, 0xA2, 0xC3, + 0x85, 0xBB, 0xFD, 0xC9, 0x52, 0xC1, 0xC6, 0xC3, 0x7C, 0xC5, 0x3E, 0xC0, + 0x4E, 0xDE, 0x25, 0xCA, 0xD7, 0xEC, 0xB5, 0xC5, 0xCF, 0xD2, 0x19, 0xBC, + 0xAF, 0xBA, 0xA0, 0xBA, 0x6D, 0xC4, 0x40, 0xC0, 0x61, 0xCC, 0xB0, 0xC9, + 0x54, 0xCF, 0x9B, 0xCD, 0x0B, 0xDC, 0x82, 0xCE, 0x6C, 0xDA, 0xDE, 0xDC, + 0x77, 0xCF, 0x60, 0xF5, 0xD4, 0xC6, 0x52, 0xF2, 0xC5, 0xD7, 0xC0, 0xE7, + 0x66, 0xD7, 0x44, 0xDE, 0x4A, 0xC3, 0x09, 0xD3, 0x88, 0xC0, 0x74, 0xD2, + 0x3A, 0xC2, 0x6F, 0xDF, 0xA1, 0xBF, 0xEC, 0xD7, 0x9B, 0xB7, 0x47, 0xC4, + 0x1C, 0xB1, 0x8C, 0xBE, 0x59, 0xAF, 0xD9, 0xB8, 0x16, 0xAA, 0xDB, 0xB1, + 0xAD, 0xA4, 0x4B, 0xBD, 0x38, 0xA4, 0x0F, 0xCC, 0xA3, 0xB8, 0x74, 0xBE, + 0x0E, 0xDA, 0x1D, 0x9F, 0x87, 0xDB, 0x44, 0x9F, 0x52, 0xBE, 0x08, 0xBF, + 0xFD, 0xA6, 0xDE, 0xB9, 0xE2, 0xA5, 0x3B, 0xAF, 0x37, 0xAA, 0xC5, 0xAB, + 0x6E, 0xAC, 0x16, 0xA3, 0x3F, 0xB4, 0xCB, 0xB8, 0x56, 0xBB, 0x54, 0xD4, + 0xE0, 0xBE, 0xF8, 0xD9, 0x55, 0xC4, 0x31, 0xD5, 0xEC, 0xC4, 0x4A, 0xD7, + 0xAC, 0xC5, 0x76, 0xD1, 0x3A, 0xD3, 0x69, 0xC8, 0xC9, 0xDC, 0xC7, 0xC9, + 0x77, 0xD4, 0x6A, 0xCB, 0x85, 0xBC, 0x87, 0xC7, 0x62, 0xA7, 0xAA, 0xB3, + 0xE4, 0xA3, 0x66, 0x9F, 0x0E, 0xAF, 0xA2, 0x9F, 0x5F, 0xB9, 0x6F, 0xA8, + 0xDA, 0xC2, 0x4E, 0xC1, 0xD1, 0xCF, 0x25, 0xD5, 0x88, 0xD3, 0x1D, 0xD3, + 0xF9, 0xDA, 0x20, 0xD9, 0x76, 0xE5, 0xF3, 0xDD, 0xAB, 0xEE, 0x53, 0xE7, + 0x19, 0xF4, 0x20, 0xF2, 0x67, 0xF5, 0x8F, 0xF6, 0xDA, 0xF5, 0xFB, 0xFC, + 0xBB, 0xED, 0x94, 0xFB, 0xAD, 0xF1, 0x14, 0xF3, 0x54, 0xFB, 0xF2, 0xEA, + 0xAF, 0xF8, 0xF9, 0xF2, 0x48, 0xEA, 0xC7, 0xFF, 0x8A, 0xD7, 0xFB, 0xFB, + 0x46, 0xD4, 0xEB, 0xF4, 0xB6, 0xE3, 0x89, 0xF6, 0x25, 0xEF, 0x56, 0xEA, + 0x64, 0xE9, 0xE9, 0xE3, 0xDC, 0xD9, 0x49, 0xE3, 0x3B, 0xC9, 0xAA, 0xCB, + 0x0D, 0xB3, 0x74, 0xBD, 0x95, 0xA6, 0xA4, 0xBD, 0x4E, 0xB7, 0x96, 0xB9, + 0x5E, 0xCD, 0x81, 0xB5, 0x11, 0xD0, 0x39, 0xAD, 0x2C, 0xC9, 0x8D, 0xAC, + 0xE3, 0xCE, 0x9F, 0xC0, 0x3C, 0xD3, 0x84, 0xCE, 0x73, 0xE8, 0xF0, 0xE2, + 0xFF, 0x0D, 0xD1, 0xF3, 0xC7, 0x19, 0xBF, 0xF2, 0xA5, 0x1D, 0x56, 0xFB, + 0x01, 0x22, 0x4B, 0xFA, 0x76, 0x1A, 0xA7, 0xFB, 0xAA, 0x11, 0x69, 0x09, + 0xD9, 0x0D, 0xC9, 0x01, 0xDE, 0xFE, 0x29, 0xF0, 0xD5, 0xF2, 0xDB, 0xEF, + 0x3E, 0xF0, 0x0A, 0xEC, 0xCA, 0xF5, 0xD2, 0xF4, 0x19, 0x0B, 0xC0, 0x11, + 0x13, 0x1C, 0x30, 0x17, 0x33, 0x11, 0x64, 0x08, 0xB8, 0x0F, 0x40, 0x16, + 0x15, 0x14, 0xBE, 0x1E, 0x2B, 0x03, 0x15, 0x07, 0x34, 0xFA, 0xEC, 0x09, + 0xA8, 0x05, 0xF3, 0x1A, 0x26, 0x1E, 0xA2, 0x1C, 0x8D, 0x2B, 0x7C, 0x19, + 0xA7, 0x32, 0xC0, 0x20, 0xEE, 0x30, 0x01, 0x2D, 0x21, 0x2E, 0xF1, 0x30, + 0xB0, 0x2A, 0x2B, 0x34, 0xCA, 0x2F, 0x3A, 0x43, 0x0E, 0x33, 0x53, 0x44, + 0x41, 0x2D, 0x76, 0x30, 0xB7, 0x38, 0xB1, 0x1D, 0x31, 0x38, 0x6D, 0x1A, + 0x49, 0x2A, 0x46, 0x1F, 0x5A, 0x2E, 0xBF, 0x30, 0x91, 0x32, 0x67, 0x34, + 0xDD, 0x2D, 0x2E, 0x1D, 0xD4, 0x26, 0xD7, 0x12, 0xD9, 0x12, 0x37, 0x09, + 0x9A, 0x06, 0x5B, 0xFA, 0xEF, 0x10, 0x29, 0xF2, 0xEF, 0x1F, 0x22, 0xF2, + 0x71, 0x1D, 0x4A, 0xF2, 0xAE, 0x0E, 0x8E, 0xEB, 0x39, 0x0A, 0xE9, 0xDD, + 0x60, 0x08, 0x82, 0xDC, 0xA1, 0x05, 0x85, 0xEF, 0x66, 0x14, 0x3B, 0x07, + 0xCE, 0x27, 0x0F, 0x20, 0xE9, 0x2A, 0x5C, 0x22, 0x03, 0x28, 0xAD, 0x0E, + 0xD1, 0x34, 0x84, 0x15, 0xC6, 0x4A, 0x66, 0x24, 0x3E, 0x4F, 0x84, 0x27, + 0x9C, 0x4F, 0x1A, 0x38, 0x00, 0x4C, 0x98, 0x3F, 0x63, 0x39, 0xE7, 0x36, + 0xB1, 0x2C, 0xAD, 0x25, 0x42, 0x25, 0x42, 0x11, 0xBD, 0x10, 0x52, 0x0E, + 0x34, 0xFC, 0x23, 0x1A, 0x2B, 0xF6, 0x22, 0x1D, 0x5A, 0xFE, 0x7F, 0x19, + 0xC9, 0x1E, 0x37, 0x19, 0x6A, 0x33, 0x9E, 0x1B, 0xA9, 0x2E, 0xA8, 0x24, + 0x11, 0x33, 0xD1, 0x37, 0x56, 0x3D, 0xAB, 0x42, 0x05, 0x3C, 0x8A, 0x34, + 0xD7, 0x35, 0x91, 0x31, 0xE8, 0x3B, 0x13, 0x33, 0xDC, 0x41, 0x47, 0x30, + 0x25, 0x35, 0x45, 0x30, 0x17, 0x27, 0x1A, 0x34, 0x7F, 0x2F, 0xE8, 0x36, + 0xB7, 0x3E, 0xA7, 0x2B, 0xD8, 0x38, 0x67, 0x1E, 0x15, 0x36, 0x3C, 0x14, + 0x71, 0x37, 0x0E, 0x1F, 0xE2, 0x2F, 0xA1, 0x2B, 0xB6, 0x3F, 0x69, 0x2A, + 0x99, 0x50, 0x91, 0x1F, 0xEE, 0x46, 0x3C, 0x0A, 0x21, 0x34, 0x0E, 0x04, + 0x65, 0x1C, 0x79, 0xFA, 0xB3, 0x0D, 0x6F, 0xE3, 0x34, 0x11, 0x0C, 0xDE, + 0xDA, 0x10, 0x40, 0xEB, 0x80, 0x10, 0x1E, 0x0D, 0xA6, 0x18, 0x3B, 0x27, + 0x11, 0x1B, 0x44, 0x24, 0x20, 0x11, 0x32, 0x1A, 0x44, 0x14, 0x77, 0x1A, + 0x1C, 0x21, 0x04, 0x1E, 0x71, 0x23, 0xA9, 0x1E, 0x84, 0x24, 0xEA, 0x2A, + 0x5D, 0x21, 0x3B, 0x37, 0xDA, 0x25, 0x82, 0x3D, 0x40, 0x31, 0x76, 0x3A, + 0x95, 0x28, 0xE4, 0x37, 0xDA, 0x13, 0xB1, 0x41, 0x49, 0x18, 0x87, 0x43, + 0x99, 0x1D, 0x08, 0x3A, 0xF7, 0x19, 0xE5, 0x34, 0xA2, 0x1A, 0xD8, 0x20, + 0xF3, 0x1E, 0x9D, 0x13, 0x72, 0x24, 0xD7, 0x15, 0xC6, 0x1C, 0xF2, 0x1C, + 0x06, 0x09, 0x34, 0x22, 0x72, 0xF8, 0x10, 0x1E, 0xA7, 0xF9, 0xEC, 0x1F, + 0x60, 0x13, 0xBE, 0x15, 0xB6, 0x2B, 0x35, 0x16, 0x2B, 0x31, 0x17, 0x2B, + 0xC4, 0x39, 0xC1, 0x38, 0x7D, 0x41, 0x53, 0x40, 0x2F, 0x47, 0x51, 0x3F, + 0x8F, 0x4F, 0x82, 0x36, 0x05, 0x4F, 0x5C, 0x30, 0x93, 0x44, 0xE1, 0x2F, + 0xE0, 0x3F, 0x6A, 0x25, 0x4C, 0x37, 0xA8, 0x10, 0xC4, 0x17, 0xAD, 0x08, + 0x36, 0x08, 0xF5, 0x0B, 0x06, 0x16, 0x57, 0x0A, 0xC8, 0x22, 0xB2, 0x07, + 0xD7, 0x2A, 0x73, 0x15, 0xC7, 0x2D, 0xF1, 0x27, 0x57, 0x20, 0xBF, 0x24, + 0x0C, 0x01, 0xE4, 0x14, 0x91, 0xF0, 0x17, 0x0A, 0xC9, 0xF0, 0x7D, 0xFB, + 0xAF, 0xEE, 0xBF, 0xF3, 0x48, 0xE8, 0xC9, 0xF6, 0xA4, 0xEA, 0x17, 0xF8, + 0xFE, 0xEF, 0x31, 0xF6, 0xEB, 0xF5, 0x52, 0xFA, 0x67, 0x04, 0x3C, 0x09, + 0x18, 0x08, 0x07, 0x16, 0x39, 0xFD, 0x5D, 0x1D, 0x98, 0xEE, 0x24, 0x2A, + 0x57, 0xF0, 0xA1, 0x39, 0x23, 0xFC, 0x15, 0x35, 0x28, 0x08, 0xAC, 0x21, + 0xAB, 0x14, 0x48, 0x27, 0x30, 0x04, 0xD3, 0x25, 0x2B, 0xE2, 0x05, 0x0D, + 0xF8, 0xDB, 0x2F, 0x06, 0x1D, 0xE0, 0x56, 0x05, 0x69, 0xD5, 0xE6, 0xFF, + 0xDE, 0xD6, 0x58, 0xF7, 0x57, 0xDE, 0x47, 0xF3, 0xCE, 0xE3, 0x2A, 0xE5, + 0x19, 0xEA, 0x6E, 0xDD, 0x72, 0xDB, 0xA4, 0xE4, 0x0D, 0xD3, 0x66, 0xE0, + 0x3D, 0xE6, 0xC9, 0xE9, 0xCD, 0xFD, 0xF8, 0xF2, 0x9A, 0xFB, 0xB2, 0xEC, + 0xB8, 0xE8, 0x49, 0xE6, 0x0F, 0xEE, 0xAB, 0xE4, 0x34, 0xFF, 0xBC, 0xEC, + 0x82, 0x00, 0x40, 0xF1, 0xD5, 0x01, 0x9E, 0xF7, 0x98, 0x08, 0xE9, 0x02, + 0x05, 0xF9, 0x78, 0xFC, 0x85, 0xEC, 0x4B, 0xF2, 0xC9, 0xFA, 0xD4, 0xF4, + 0x24, 0xFA, 0x0C, 0xF6, 0xA4, 0xE2, 0x8D, 0xE2, 0x10, 0xCC, 0x1F, 0xDA, + 0xE7, 0xBB, 0x63, 0xE6, 0x12, 0xB8, 0x24, 0xD8, 0x1F, 0xC7, 0x5C, 0xCB, + 0xF9, 0xC1, 0x37, 0xC5, 0xF8, 0xAF, 0xC5, 0xB5, 0x96, 0xAE, 0x52, 0xA8, + 0x1A, 0xA8, 0x9F, 0xA6, 0xFE, 0xA1, 0x79, 0xA7, 0x07, 0xA7, 0x08, 0xAA, + 0x3A, 0xA9, 0x0A, 0xB2, 0xAE, 0xB0, 0x5A, 0xB0, 0xA2, 0xB4, 0x3D, 0xB3, + 0x6E, 0xAE, 0x11, 0xC8, 0x7B, 0xB1, 0xF7, 0xDA, 0x72, 0xBB, 0x9B, 0xD5, + 0x2B, 0xD2, 0xDD, 0xC6, 0x9A, 0xEE, 0x0A, 0xCF, 0x37, 0xED, 0x08, 0xE9, + 0x6A, 0xE2, 0x54, 0xFD, 0x47, 0xE4, 0x37, 0x08, 0x01, 0xE0, 0xFB, 0x01, + 0x3A, 0xD8, 0xAC, 0xF1, 0x22, 0xD6, 0x55, 0xE2, 0x5D, 0xD2, 0x9B, 0xCE, + 0x02, 0xC4, 0x36, 0xB7, 0x5E, 0xB4, 0xA6, 0xA6, 0xB1, 0xA7, 0x27, 0xAC, + 0x88, 0xAD, 0x17, 0xB9, 0x88, 0xC1, 0xD7, 0xB2, 0x44, 0xD3, 0x84, 0xAC, + 0xD4, 0xD8, 0xA0, 0xB7, 0xFD, 0xD6, 0x7A, 0xD5, 0x08, 0xE0, 0xC6, 0xE7, + 0x18, 0xEE, 0x4F, 0xE0, 0xDA, 0xFB, 0xD0, 0xDF, 0x78, 0xF7, 0xE6, 0xD7, + 0x30, 0xEC, 0x0F, 0xD4, 0xF8, 0xE5, 0x68, 0xE8, 0xF3, 0xE5, 0x24, 0xF8, + 0x6A, 0xF3, 0xC9, 0xF9, 0x36, 0xFC, 0xB1, 0xFF, 0x2F, 0xFD, 0xF2, 0x01, + 0xA1, 0x00, 0xBD, 0xF9, 0xF3, 0xF3, 0x31, 0xF7, 0xCD, 0xDA, 0x63, 0x05, + 0x49, 0xCF, 0x18, 0x14, 0x08, 0xD6, 0xA6, 0x12, 0x52, 0xE7, 0xCC, 0x10, + 0xDF, 0xE1, 0x50, 0x00, 0x9A, 0xC7, 0x5D, 0xE7, 0x90, 0xB0, 0x1F, 0xE1, + 0x22, 0xAA, 0xAE, 0xDE, 0x23, 0xA7, 0xD9, 0xC3, 0xC8, 0xA4, 0x4E, 0xBA, + 0x72, 0xB7, 0xB9, 0xC2, 0xD4, 0xD3, 0x75, 0xBF, 0x10, 0xE0, 0xF3, 0xCA, + 0x90, 0xE8, 0xBF, 0xEB, 0xA9, 0xED, 0xFD, 0xFD, 0x65, 0xE9, 0x69, 0xEC, + 0xB4, 0xF3, 0xA2, 0xE7, 0x35, 0x08, 0x22, 0xF1, 0x94, 0x12, 0x52, 0xF3, + 0x1B, 0x0F, 0x58, 0x02, 0x6E, 0x11, 0x57, 0x1C, 0x67, 0x1D, 0xD2, 0x26, + 0x95, 0x21, 0xAC, 0x19, 0xCB, 0x20, 0x57, 0x0C, 0xBB, 0x25, 0xC2, 0xFF, + 0xB2, 0x1A, 0xA4, 0xF6, 0x92, 0x01, 0xEF, 0x04, 0xE7, 0xF8, 0x15, 0x0C, + 0xEE, 0xFB, 0xE0, 0xF6, 0x3F, 0xFD, 0xDC, 0xDD, 0x38, 0xF0, 0x91, 0xD9, + 0x75, 0xDA, 0x45, 0xEA, 0xFD, 0xDB, 0xEE, 0xF5, 0xB9, 0xFF, 0x0B, 0x05, + 0x2A, 0x25, 0x4C, 0x16, 0xB9, 0x30, 0xE0, 0x22, 0xC8, 0x25, 0xB0, 0x27, + 0x7A, 0x1B, 0x0A, 0x23, 0x0F, 0x25, 0xA6, 0x2D, 0x34, 0x2A, 0x3E, 0x31, + 0x80, 0x2D, 0x42, 0x26, 0xFD, 0x3E, 0x76, 0x16, 0x85, 0x34, 0x1F, 0x03, + 0x24, 0x18, 0x95, 0xFA, 0x2F, 0x0D, 0x0A, 0x04, 0xD7, 0x0A, 0x31, 0x16, + 0x74, 0x0B, 0x5A, 0x0E, 0x1B, 0x08, 0x0F, 0x04, 0x6E, 0x05, 0x14, 0x19, + 0xEA, 0x07, 0xDE, 0x1C, 0x70, 0x15, 0x36, 0x06, 0xE1, 0x29, 0xE2, 0xFF, + 0x07, 0x21, 0xD1, 0xF8, 0xB0, 0xFA, 0x97, 0xEA, 0x19, 0xD9, 0xDB, 0xE0, + 0x78, 0xCF, 0xE5, 0xD1, 0xE3, 0xE4, 0x0A, 0xCF, 0x2A, 0xF9, 0x37, 0xE0, + 0xB2, 0xFB, 0xF9, 0xF6, 0x63, 0xFD, 0x3D, 0xFD, 0x60, 0x08, 0x75, 0xF6, + 0x45, 0x14, 0x59, 0xF6, 0xF9, 0x24, 0x01, 0x01, 0x2B, 0x45, 0x1D, 0x0E, + 0x8D, 0x58, 0x8C, 0x18, 0x42, 0x56, 0x9C, 0x1C, 0x46, 0x4D, 0x9D, 0x20, + 0x4E, 0x3E, 0xEE, 0x26, 0x2D, 0x28, 0x7D, 0x16, 0x39, 0x1B, 0x1F, 0xF7, + 0xE0, 0x0E, 0x86, 0xDE, 0xFC, 0x03, 0x90, 0xDD, 0x47, 0x0E, 0x91, 0xE6, + 0xCC, 0x18, 0xD1, 0xEC, 0xA1, 0x0E, 0xD5, 0xF1, 0x0E, 0x04, 0x29, 0xEF, + 0xD6, 0x0D, 0x6A, 0x02, 0x84, 0x0F, 0xB3, 0x23, 0x10, 0x13, 0xDA, 0x34, + 0x2C, 0x21, 0x85, 0x3B, 0x64, 0x18, 0x5D, 0x38, 0x4A, 0x12, 0xCE, 0x2B, + 0x89, 0x26, 0xEC, 0x27, 0xF2, 0x27, 0xF9, 0x23, 0x0B, 0x1F, 0xE3, 0x2E, + 0x93, 0x2D, 0xBF, 0x42, 0xD7, 0x3A, 0x40, 0x46, 0x5B, 0x2D, 0xAD, 0x3C, + 0xE2, 0x19, 0xF3, 0x28, 0x30, 0x1A, 0xE2, 0x14, 0x56, 0x21, 0x52, 0x00, + 0xD2, 0x2F, 0x73, 0x02, 0xF0, 0x2A, 0x02, 0x06, 0xF4, 0x1B, 0x65, 0x05, + 0x32, 0x1E, 0x4D, 0x0B, 0x6C, 0x1C, 0xDA, 0x06, 0x28, 0x11, 0x66, 0x05, + 0x6D, 0x08, 0xB0, 0x02, 0x82, 0x02, 0x12, 0xF7, 0x41, 0x03, 0xD8, 0xE8, + 0x3F, 0x08, 0x37, 0xDC, 0x44, 0x0A, 0x57, 0xE5, 0x6D, 0x06, 0x7D, 0xFC, + 0x27, 0x0B, 0x95, 0x07, 0x72, 0x21, 0x97, 0x05, 0x4D, 0x20, 0xC0, 0x09, + 0x6F, 0x14, 0x0D, 0x22, 0xCC, 0x1B, 0xDD, 0x31, 0x66, 0x25, 0x3E, 0x34, + 0x05, 0x28, 0x78, 0x3B, 0x74, 0x2C, 0x44, 0x43, 0x2C, 0x2F, 0xAE, 0x3C, + 0x03, 0x30, 0x14, 0x36, 0x8C, 0x3E, 0x9A, 0x42, 0x3C, 0x41, 0x60, 0x3E, + 0x5E, 0x2D, 0xC7, 0x28, 0x6F, 0x19, 0xEB, 0x19, 0xA1, 0x0F, 0x9F, 0x11, + 0x94, 0x01, 0x38, 0x08, 0xD4, 0xF3, 0x27, 0x08, 0xFB, 0xF8, 0x3F, 0x07, + 0xC3, 0x04, 0x80, 0xF9, 0xBD, 0x08, 0x0D, 0x07, 0xE9, 0x04, 0x66, 0x1D, + 0x54, 0x16, 0xE3, 0x23, 0x0B, 0x32, 0x58, 0x30, 0x8C, 0x42, 0x9D, 0x46, + 0xBE, 0x3D, 0x46, 0x57, 0xA1, 0x21, 0xF7, 0x5E, 0x50, 0x19, 0x00, 0x61, + 0x99, 0x35, 0xAB, 0x5A, 0x50, 0x50, 0xCC, 0x55, 0xD2, 0x50, 0x1B, 0x54, + 0x4E, 0x39, 0xFE, 0x43, 0xD3, 0x25, 0xFF, 0x36, 0x9B, 0x1E, 0x82, 0x2F, + 0x7A, 0x14, 0xE1, 0x1F, 0x63, 0x1A, 0x19, 0x28, 0x9D, 0x20, 0x2E, 0x33, + 0x99, 0x1E, 0x92, 0x2E, 0x00, 0x22, 0xC2, 0x1B, 0xAE, 0x28, 0x4F, 0x10, + 0x04, 0x1D, 0xFB, 0x0C, 0xA8, 0x09, 0xFF, 0xF3, 0x98, 0x02, 0x37, 0xE0, + 0xD2, 0xF5, 0x94, 0xD6, 0xD6, 0xEE, 0x1D, 0xDD, 0x2A, 0x04, 0xFD, 0xFA, + 0x28, 0x21, 0x7A, 0x18, 0xEA, 0x1E, 0x0C, 0x18, 0xA3, 0x0B, 0xEE, 0x08, + 0xE7, 0xFE, 0x37, 0x0B, 0xA8, 0x09, 0x6C, 0x1D, 0x62, 0x20, 0x7E, 0x31, + 0x24, 0x2D, 0x04, 0x3E, 0x1D, 0x2C, 0xD0, 0x3F, 0xDF, 0x1C, 0xE3, 0x32, + 0x6D, 0x15, 0xBD, 0x27, 0x57, 0x17, 0x46, 0x27, 0x0B, 0x1A, 0x9C, 0x2C, + 0x92, 0x14, 0xC5, 0x3C, 0x66, 0x03, 0xCC, 0x36, 0x2C, 0xEE, 0x16, 0x11, + 0xBF, 0xE3, 0xD8, 0xF7, 0x6B, 0xEA, 0x40, 0xED, 0x7F, 0xED, 0x8C, 0xE4, + 0x9D, 0xE2, 0x35, 0xEA, 0x0B, 0xD8, 0x98, 0xF6, 0x95, 0xDD, 0x93, 0xFC, + 0x50, 0xE9, 0x07, 0xF8, 0xE7, 0xFF, 0xC0, 0xF4, 0xCD, 0x15, 0xDC, 0xFB, + 0xDD, 0x23, 0x20, 0x1E, 0x52, 0x24, 0x19, 0x3A, 0xF3, 0x2B, 0xAA, 0x30, + 0xCD, 0x3A, 0xE7, 0x15, 0xF3, 0x30, 0xBD, 0x0C, 0x61, 0x26, 0x61, 0x1B, + 0x9F, 0x21, 0x6A, 0x19, 0xB6, 0x0D, 0xFA, 0x08, 0xEA, 0xF6, 0x4A, 0x03, + 0x1E, 0xF8, 0xCD, 0x06, 0x0F, 0xF7, 0x89, 0x06, 0x97, 0xE2, 0xC9, 0x05, + 0x8D, 0xD9, 0x23, 0x05, 0x98, 0xDB, 0x21, 0x06, 0xA8, 0xE3, 0x5A, 0x05, + 0xD8, 0xFB, 0x15, 0x06, 0x9B, 0x06, 0xBB, 0x02, 0x77, 0xE6, 0x33, 0xF5, + 0xD6, 0xB8, 0x12, 0xE7, 0x0A, 0x9F, 0xAF, 0xC6, 0x42, 0x9F, 0x98, 0xAF, + 0xE0, 0xB5, 0x29, 0xBE, 0x97, 0xDB, 0xFA, 0xD7, 0xB1, 0xF5, 0x76, 0xE1, + 0xE3, 0xEE, 0xF0, 0xDF, 0xD6, 0xE1, 0x6A, 0xEC, 0xEE, 0xE1, 0x3E, 0xFA, + 0x59, 0xE6, 0xBD, 0x06, 0xB3, 0xEF, 0xE0, 0x0A, 0x3A, 0xFC, 0xAF, 0x08, + 0x5A, 0xF3, 0x13, 0x0C, 0x75, 0xE2, 0x48, 0x0C, 0xE7, 0xE7, 0x78, 0x06, + 0x30, 0xF6, 0x36, 0xFD, 0x9D, 0xF6, 0xF3, 0xF7, 0xDA, 0xE8, 0x71, 0xF2, + 0x77, 0xC8, 0x61, 0xE9, 0xD7, 0xAB, 0xEC, 0xDE, 0xD8, 0xB1, 0x07, 0xD2, + 0xBB, 0xB6, 0x56, 0xCF, 0x46, 0xA8, 0x20, 0xDC, 0x8A, 0x9D, 0x8C, 0xD7, + 0x3A, 0xAA, 0x42, 0xCC, 0x3A, 0xC4, 0x2A, 0xCE, 0x17, 0xD6, 0x5A, 0xD5, + 0x00, 0xDC, 0x66, 0xE4, 0xE3, 0xE4, 0x26, 0xF8, 0x69, 0xF0, 0x25, 0xF8, + 0xD5, 0xEF, 0x07, 0xE7, 0xE9, 0xE5, 0xC3, 0xE6, 0x91, 0xD8, 0x03, 0xF2, + 0xCF, 0xE3, 0xBF, 0xFF, 0xAF, 0xFD, 0xC7, 0x01, 0x94, 0x04, 0x0D, 0xE7, + 0xEA, 0xF4, 0x02, 0xC3, 0x9F, 0xE7, 0x73, 0xC4, 0x44, 0xD9, 0xE9, 0xDF, + 0xAB, 0xC5, 0xFE, 0xD8, 0xA1, 0xC6, 0x46, 0xC9, 0xC9, 0xC7, 0xBA, 0xD2, + 0xFA, 0xBC, 0x8C, 0xCC, 0x46, 0xBE, 0x71, 0xC5, 0x81, 0xC5, 0x1E, 0xD6, + 0x8B, 0xC5, 0x45, 0xDD, 0x0E, 0xC6, 0xFB, 0xCD, 0x72, 0xBA, 0x96, 0xBD, + 0xD6, 0x9F, 0x32, 0xB8, 0x36, 0xA1, 0x7F, 0xB6, 0xC8, 0xC3, 0xA8, 0xCF, + 0xBC, 0xCE, 0x2F, 0xF1, 0x66, 0xB3, 0xF4, 0xEA, 0xD3, 0xA2, 0x46, 0xD6, + 0x6E, 0xB6, 0xEF, 0xC9, 0x1E, 0xD8, 0xA8, 0xC2, 0x10, 0xEC, 0xDE, 0xC8, + 0xCE, 0xEF, 0x33, 0xE5, 0x5B, 0xF4, 0x6A, 0xF6, 0xC3, 0xF9, 0x93, 0xEA, + 0xB4, 0xFF, 0x17, 0xE3, 0x88, 0x01, 0xF5, 0xE3, 0x94, 0xFB, 0x22, 0xE5, + 0x99, 0xFB, 0x3A, 0xE6, 0x09, 0xEE, 0xF2, 0xD4, 0x62, 0xCD, 0x90, 0xB9, + 0x3E, 0xC3, 0x39, 0xBB, 0x0D, 0xC8, 0xD5, 0xC5, 0x02, 0xC6, 0xB5, 0xB9, + 0x66, 0xBA, 0xC6, 0xAE, 0xC3, 0xBD, 0x42, 0xC9, 0xBC, 0xD0, 0xCF, 0xE6, + 0x94, 0xE3, 0x42, 0xF3, 0x6A, 0xF6, 0x01, 0x05, 0x1C, 0x06, 0x70, 0x0E, + 0x43, 0x13, 0x80, 0x0B, 0x97, 0x0E, 0xD3, 0x03, 0xFB, 0x02, 0xF1, 0x02, + 0x0B, 0x00, 0xA0, 0x03, 0xC6, 0x10, 0x2E, 0x07, 0x58, 0x2B, 0x98, 0x05, + 0x89, 0x1F, 0x88, 0xE8, 0x92, 0xF3, 0xF8, 0xCC, 0x92, 0xE7, 0x99, 0xD5, + 0x02, 0xF4, 0x7D, 0xEA, 0x59, 0x03, 0xDB, 0xEA, 0x56, 0x11, 0xAB, 0xD9, + 0x0C, 0x1A, 0x07, 0xDF, 0x9F, 0x15, 0xA1, 0xF0, 0x71, 0x0F, 0x7B, 0xFB, + 0x0A, 0x1C, 0xFD, 0x06, 0x6D, 0x17, 0x87, 0x07, 0x5E, 0x01, 0xE7, 0x0C, + 0xC8, 0xE6, 0xC5, 0xFF, 0x0E, 0xCE, 0xCE, 0xD9, 0x04, 0xD0, 0x38, 0xC9, + 0x76, 0xF0, 0x16, 0xD7, 0x49, 0x12, 0xE6, 0xE8, 0x32, 0x06, 0x48, 0xF1, + 0x1A, 0xE3, 0x6C, 0xF0, 0xCA, 0xE4, 0x26, 0xF0, 0x9A, 0xFF, 0x6B, 0x01, + 0xB2, 0x09, 0xD2, 0x14, 0x3D, 0x10, 0xA4, 0x1A, 0xAB, 0x19, 0x9C, 0x0E, + 0xFB, 0x09, 0x8F, 0xFC, 0x0C, 0x03, 0x67, 0xFD, 0x79, 0x0A, 0x84, 0x02, + 0x19, 0x05, 0x59, 0x07, 0xD5, 0x04, 0x07, 0x05, 0xCE, 0x05, 0x61, 0xEB, + 0x66, 0xFD, 0x29, 0xD0, 0x1B, 0xFB, 0xA2, 0xD0, 0x61, 0xFC, 0x45, 0xDF, + 0x32, 0xF3, 0x27, 0xD3, 0x87, 0xE4, 0x83, 0xB9, 0x3A, 0xE8, 0x25, 0xBF, + 0x75, 0xED, 0xF1, 0xD3, 0xE2, 0xE2, 0x15, 0xE9, 0x16, 0xEF, 0x99, 0xFC, + 0x15, 0x0F, 0xD4, 0xF5, 0xAB, 0x1F, 0x2D, 0xF8, 0x47, 0x17, 0xEA, 0x0B, + 0x6D, 0xFF, 0xE4, 0x12, 0x6C, 0xE7, 0x9E, 0x0B, 0x32, 0xF9, 0xBF, 0x08, + 0x2D, 0x21, 0xC7, 0x05, 0x04, 0x1A, 0x1C, 0xFC, 0x84, 0xF3, 0x4D, 0xF5, + 0x2B, 0xEB, 0x42, 0xF3, 0x11, 0xF6, 0x33, 0xE9, 0xF8, 0xEB, 0xD4, 0xD1, + 0xFE, 0xDF, 0xAC, 0xD0, 0x83, 0xD9, 0x97, 0xDD, 0x52, 0xD2, 0xB3, 0xDA, + 0x57, 0xDE, 0xF3, 0xD6, 0x3E, 0xFE, 0x60, 0xE6, 0x5A, 0x06, 0x76, 0xF5, + 0xCD, 0x02, 0x42, 0xF3, 0x32, 0xF8, 0x29, 0xDC, 0x13, 0xD3, 0x31, 0xC0, + 0x13, 0xC4, 0x49, 0xBF, 0x37, 0xE7, 0x58, 0xD7, 0x6E, 0x0F, 0xAE, 0xF1, + 0x4C, 0x0B, 0xFC, 0xFC, 0x7A, 0xF8, 0x60, 0xFE, 0x75, 0xF1, 0x25, 0x06, + 0xA4, 0xF3, 0xAC, 0x0F, 0xC8, 0x0C, 0x78, 0x11, 0x20, 0x2A, 0x45, 0x1A, + 0x20, 0x37, 0xB4, 0x2B, 0x94, 0x36, 0x2A, 0x33, 0xEA, 0x2C, 0xA5, 0x31, + 0x2A, 0x25, 0xC8, 0x2E, 0x26, 0x15, 0x78, 0x21, 0xB8, 0x05, 0x37, 0x17, + 0xC4, 0x07, 0x63, 0x0F, 0x97, 0x02, 0x71, 0xF3, 0x36, 0x02, 0xD7, 0xEC, + 0x01, 0x19, 0x5A, 0x03, 0xB3, 0x26, 0x24, 0x09, 0x42, 0x14, 0xDB, 0xFA, + 0x18, 0x04, 0x8C, 0x00, 0x0C, 0x0B, 0x2B, 0x1D, 0x2C, 0x18, 0x3F, 0x2B, + 0x10, 0x33, 0x41, 0x2D, 0x30, 0x51, 0x88, 0x2F, 0x2C, 0x58, 0xC9, 0x39, + 0x51, 0x43, 0x00, 0x47, 0xF9, 0x2F, 0xEC, 0x4C, 0x9D, 0x31, 0x45, 0x3D, + 0x90, 0x48, 0x93, 0x2B, 0x91, 0x53, 0x12, 0x38, 0xBA, 0x34, 0x1D, 0x4B, + 0x54, 0x0B, 0xAB, 0x3B, 0x8C, 0x03, 0x71, 0x22, 0x76, 0x1D, 0x17, 0x1D, + 0xEB, 0x27, 0xA7, 0x0B, 0xE3, 0x21, 0xB1, 0x01, 0x7D, 0x29, 0x7B, 0x19, + 0x73, 0x22, 0x9F, 0x2A, 0xDB, 0x1B, 0x06, 0x31, 0x2F, 0x35, 0xED, 0x39, + 0x45, 0x32, 0x2C, 0x31, 0xFA, 0x17, 0x46, 0x1A, 0x62, 0x0D, 0xAD, 0xFB, + 0x13, 0xFB, 0xCC, 0xE2, 0x97, 0xF5, 0x97, 0xEB, 0x20, 0x17, 0xD3, 0x0B, + 0xBF, 0x34, 0x20, 0x21, 0xE1, 0x31, 0xF7, 0x19, 0xED, 0x27, 0x67, 0x11, + 0x7E, 0x26, 0xEC, 0x22, 0xB3, 0x2C, 0xB6, 0x3E, 0xA2, 0x34, 0x48, 0x51, + 0x84, 0x35, 0x62, 0x4E, 0x80, 0x36, 0x02, 0x3B, 0xF5, 0x35, 0xDA, 0x33, + 0x4E, 0x2C, 0x17, 0x3F, 0x10, 0x27, 0x00, 0x4C, 0xDF, 0x2F, 0x66, 0x50, + 0x12, 0x3E, 0x85, 0x4A, 0x12, 0x3B, 0x15, 0x3A, 0xA4, 0x11, 0x47, 0x1E, + 0x51, 0xF8, 0xBA, 0x17, 0x16, 0xFE, 0xC6, 0x0D, 0x6C, 0xFF, 0x77, 0xF0, + 0x48, 0xFB, 0xD3, 0xE2, 0x8E, 0x01, 0x2E, 0xE9, 0xC1, 0x0A, 0x84, 0xF8, + 0x0B, 0x03, 0x1D, 0x09, 0x5B, 0x19, 0xDA, 0x2C, 0x58, 0x48, 0x23, 0x47, + 0xDE, 0x60, 0x9F, 0x47, 0x8F, 0x5A, 0x90, 0x43, 0x3D, 0x36, 0x81, 0x32, + 0xDC, 0x1E, 0xE1, 0x27, 0xBC, 0x28, 0x8A, 0x2C, 0xDE, 0x36, 0xCF, 0x2A, + 0x45, 0x2F, 0x9A, 0x1E, 0x84, 0x0A, 0x1C, 0x0F, 0x59, 0xFA, 0x33, 0x17, + 0xCC, 0xFE, 0xD6, 0x17, 0xBD, 0xFA, 0x37, 0x02, 0x87, 0x0E, 0xEC, 0x09, + 0x8D, 0x28, 0xFD, 0x1C, 0x43, 0x21, 0xD2, 0x23, 0xBD, 0x0D, 0x73, 0x22, + 0x5C, 0x0B, 0xBA, 0x17, 0x1D, 0xFE, 0xF5, 0x07, 0x1E, 0xEE, 0xA6, 0x01, + 0x19, 0xEB, 0x2D, 0xF1, 0x62, 0xDA, 0x01, 0xCE, 0x30, 0xD3, 0xE8, 0xC8, + 0x32, 0xF1, 0x16, 0xF2, 0x3C, 0x03, 0x51, 0x0E, 0xFB, 0xEC, 0x5F, 0xFF, + 0x1A, 0xE5, 0x81, 0xF6, 0x89, 0xF8, 0x72, 0xFD, 0xC2, 0x12, 0x3D, 0x0C, + 0x5A, 0x20, 0xAC, 0x18, 0x62, 0x25, 0x6C, 0x1C, 0xDF, 0x20, 0xF0, 0x17, + 0x5C, 0x11, 0x0C, 0x13, 0x09, 0x0B, 0x33, 0x19, 0x69, 0x13, 0x27, 0x21, + 0x7C, 0x1E, 0x6B, 0x20, 0xBD, 0x20, 0x54, 0x1D, 0xEF, 0x09, 0x6C, 0x09, + 0xCE, 0xE4, 0xA8, 0xEA, 0xC2, 0xD1, 0xD9, 0xE0, 0x11, 0xDF, 0x07, 0xEB, + 0x0A, 0xEF, 0x99, 0xF3, 0x37, 0xE0, 0xF2, 0xF1, 0xEB, 0xD4, 0x88, 0xF5, + 0x39, 0xD5, 0x8F, 0xF1, 0x17, 0xDF, 0x4A, 0xF1, 0xE1, 0xF5, 0xE8, 0xFB, + 0x40, 0x0F, 0x5A, 0x05, 0x03, 0x1C, 0x7B, 0x11, 0x95, 0x13, 0x01, 0x1F, + 0x66, 0xFF, 0x53, 0x1A, 0x3E, 0xF6, 0x21, 0x09, 0x9A, 0x0E, 0xDA, 0x0B, + 0x19, 0x31, 0x46, 0x1D, 0x7C, 0x2A, 0xEF, 0x1A, 0x5D, 0x00, 0x21, 0x02, + 0xE4, 0xE4, 0x8B, 0xF9, 0x79, 0xD7, 0xA6, 0x01, 0x9F, 0xD3, 0x02, 0x05, + 0xCC, 0xE1, 0xA0, 0x02, 0x2E, 0xF6, 0x0D, 0x05, 0x19, 0x00, 0x2E, 0x12, + 0x72, 0xF9, 0xAA, 0x1F, 0xA8, 0xF4, 0x6A, 0x24, 0x5F, 0xF4, 0x54, 0x21, + 0x0F, 0xF4, 0x11, 0x12, 0x8C, 0xED, 0x35, 0xEF, 0xE8, 0xD0, 0x46, 0xD6, + 0x62, 0xBB, 0xC3, 0xE2, 0x80, 0xD0, 0x45, 0xFD, 0x4B, 0xDE, 0x50, 0xF9, + 0xE8, 0xDB, 0x22, 0xEA, 0xB2, 0xE5, 0x0B, 0xE6, 0xEB, 0xF1, 0xF2, 0xE6, + 0x67, 0xFA, 0x60, 0xF6, 0x4B, 0xFF, 0x9A, 0x10, 0xF7, 0x10, 0xC8, 0x1E, + 0xCF, 0x21, 0x5A, 0x0C, 0xDD, 0x28, 0x76, 0xF8, 0x61, 0x28, 0x4C, 0xF9, + 0x5D, 0x1C, 0x24, 0x04, 0x52, 0x17, 0xC5, 0x0C, 0x71, 0x1A, 0x21, 0x00, + 0x0E, 0x0E, 0x50, 0xDF, 0xE5, 0xF8, 0x0E, 0xCA, 0xF8, 0xE7, 0xC8, 0xCE, + 0x03, 0xEC, 0x8C, 0xE8, 0x7F, 0xF3, 0xE9, 0xF5, 0x06, 0xE5, 0x90, 0xF4, + 0xD0, 0xE1, 0xD6, 0xFD, 0xED, 0xE5, 0xCB, 0xFC, 0x5A, 0xF1, 0xD2, 0x00, + 0xCD, 0x04, 0x1F, 0x0E, 0xDB, 0x10, 0x3C, 0x1F, 0x48, 0x15, 0x95, 0x34, + 0xDA, 0x06, 0x34, 0x2C, 0x2B, 0xE7, 0x23, 0x07, 0x62, 0xE4, 0x0A, 0xF7, + 0x1C, 0x03, 0xC8, 0x08, 0x87, 0x06, 0x3D, 0x0F, 0x41, 0xF2, 0x48, 0xFF, + 0x48, 0xED, 0x21, 0xF5, 0xA8, 0xF6, 0xB0, 0xEC, 0xB9, 0xFA, 0xB0, 0xE0, + 0xC0, 0xF4, 0x7C, 0xE7, 0xF2, 0xEA, 0x9F, 0xEE, 0xD9, 0xF3, 0xF0, 0xF4, + 0xCD, 0xF5, 0xFB, 0xF7, 0xD2, 0xE9, 0x51, 0xF0, 0x4B, 0xE7, 0xE1, 0xE3, + 0xD9, 0xE4, 0x58, 0xDE, 0x5E, 0xD6, 0xCB, 0xDE, 0x70, 0xBF, 0x81, 0xCA, + 0x30, 0xBA, 0xF0, 0xB4, 0x1C, 0xCE, 0xCB, 0xC9, 0xE8, 0xE7, 0x0C, 0xF1, + 0x8E, 0xE9, 0x32, 0xF3, 0xCE, 0xD7, 0xD1, 0xDE, 0xFA, 0xC1, 0x09, 0xCD, + 0x9E, 0xC1, 0xF7, 0xCE, 0xBB, 0xDA, 0xD1, 0xDF, 0x81, 0xFA, 0x7A, 0xF0, + 0x85, 0x08, 0x27, 0xF1, 0x5F, 0xFA, 0x44, 0xE1, 0x1D, 0xEF, 0x06, 0xDE, + 0xC5, 0xEA, 0x38, 0xD9, 0x16, 0xF0, 0x53, 0xD4, 0x15, 0x00, 0x28, 0xE2, + 0xB1, 0x02, 0xAC, 0xDC, 0xC5, 0xF9, 0x93, 0xC0, 0x7F, 0xE2, 0x53, 0xA9, + 0x58, 0xCB, 0x6E, 0xAB, 0xC7, 0xD7, 0x09, 0xC9, 0x1D, 0xE4, 0x57, 0xD4, + 0x99, 0xE1, 0xD8, 0xDE, 0xDC, 0xDD, 0xD3, 0xE5, 0x83, 0xDF, 0x5D, 0xD8, + 0x4D, 0xE1, 0x61, 0xE4, 0x3C, 0xE1, 0x53, 0x0A, 0x35, 0xFA, 0xE0, 0x21, + 0x26, 0x11, 0xD4, 0x1F, 0x5B, 0x02, 0x6C, 0x15, 0x8B, 0xE6, 0x63, 0x15, + 0x99, 0xE3, 0x80, 0x21, 0xD0, 0xF7, 0x14, 0x2B, 0xFE, 0xF7, 0x66, 0x1C, + 0x32, 0xE6, 0x47, 0xFF, 0x28, 0xE0, 0xDA, 0xEB, 0xEC, 0xD3, 0x6D, 0xD3, + 0xCD, 0xCA, 0xE8, 0xC8, 0x5C, 0xCB, 0x8C, 0xD0, 0x28, 0xDF, 0x1B, 0xDC, + 0x68, 0x05, 0x42, 0xE4, 0x14, 0x18, 0x8A, 0xE7, 0xCB, 0x15, 0x9B, 0xEC, + 0x70, 0x0E, 0x15, 0xEF, 0xF2, 0x04, 0xB4, 0xEB, 0x9A, 0xEA, 0xFE, 0xCE, + 0x9C, 0xCE, 0xFE, 0xA8, 0x70, 0xD3, 0x08, 0xA8, 0xB4, 0xE9, 0x2C, 0xC8, + 0x0E, 0xF1, 0xEB, 0xDA, 0x25, 0xED, 0x81, 0xD6, 0x32, 0xDF, 0x59, 0xD1, + 0x00, 0xD7, 0x8A, 0xE3, 0x79, 0xE6, 0xCF, 0xFD, 0xF1, 0x04, 0x29, 0x12, + 0x3D, 0x14, 0x98, 0x14, 0x5A, 0x0D, 0x7E, 0x0B, 0x87, 0xF7, 0xC9, 0x0C, + 0xDC, 0xD4, 0x91, 0x04, 0x6F, 0xCC, 0x8F, 0xF9, 0xD1, 0xE4, 0x61, 0x04, + 0x2C, 0xE9, 0xA5, 0x00, 0xE6, 0xDA, 0xEF, 0xDE, 0x1F, 0xD9, 0xEC, 0xCC, + 0x27, 0xD5, 0x70, 0xC5, 0x9E, 0xD5, 0x48, 0xC5, 0x55, 0xD3, 0xF4, 0xCC, + 0x10, 0xCF, 0x7C, 0xD5, 0x70, 0xD5, 0xB6, 0xD5, 0x3F, 0xDE, 0x03, 0xD0, + 0xF7, 0xF3, 0x15, 0xE0, 0x1D, 0x04, 0x00, 0xF2, 0x24, 0x0F, 0x1E, 0xFF, + 0xB5, 0x19, 0xE6, 0x0C, 0xBF, 0x09, 0x67, 0x09, 0xD6, 0xEF, 0x5B, 0xF8, + 0x41, 0xF6, 0x0D, 0x03, 0x5B, 0x09, 0x25, 0x1B, 0xF5, 0x05, 0xFB, 0x14, + 0x52, 0xF2, 0x9B, 0xF7, 0x8A, 0xEA, 0x9E, 0xE4, 0x4C, 0xE7, 0x88, 0xDA, + 0xB8, 0xE3, 0x26, 0xE1, 0x11, 0xE6, 0x6E, 0xF4, 0x5F, 0xE0, 0x21, 0xF2, + 0xD0, 0xEA, 0xA9, 0xE9, 0x37, 0xFF, 0x9D, 0xDB, 0xB0, 0x01, 0x3E, 0xCD, + 0x94, 0xF7, 0xC8, 0xC8, 0x3A, 0xEC, 0x29, 0xCC, 0x78, 0xDF, 0xF6, 0xCE, + 0x78, 0xC6, 0x8D, 0xB7, 0x4A, 0xB4, 0x53, 0xA4, 0xE2, 0xBE, 0x92, 0xB9, + 0x24, 0xDB, 0x0E, 0xCE, 0xF9, 0xFB, 0x0E, 0xD2, 0xD6, 0x04, 0xC6, 0xD3, + 0xE4, 0xF0, 0xDF, 0xD4, 0xCC, 0xE5, 0x4E, 0xDB, 0xFA, 0xF3, 0x1B, 0xE9, + 0x07, 0xFF, 0x50, 0xF5, 0x57, 0xFE, 0x2F, 0xF7, 0x1F, 0x05, 0x1F, 0xF8, + 0x97, 0x03, 0x0D, 0xF6, 0xDD, 0xF8, 0x2F, 0xFF, 0xD1, 0xF9, 0xD3, 0x17, + 0x00, 0xF6, 0x79, 0x1A, 0x96, 0xDF, 0x59, 0x01, 0xBF, 0xCD, 0x91, 0xF2, + 0x82, 0xCA, 0xCD, 0xF0, 0xA5, 0xD0, 0x19, 0xF0, 0x0E, 0xD6, 0x8B, 0xF0, + 0x0F, 0xDA, 0x31, 0xEE, 0xA1, 0xE8, 0x86, 0xEE, 0x48, 0xF2, 0xB8, 0xEB, + 0x81, 0xF5, 0xA6, 0xF0, 0x37, 0x01, 0x96, 0xFE, 0xC2, 0x18, 0xA1, 0x14, + 0x27, 0x2D, 0xA2, 0x28, 0x94, 0x30, 0x91, 0x1E, 0x54, 0x29, 0x50, 0x03, + 0xE5, 0x2E, 0x34, 0x03, 0x2E, 0x44, 0x5A, 0x1A, 0x42, 0x53, 0xE1, 0x24, + 0x11, 0x48, 0x29, 0x16, 0x7D, 0x35, 0xA5, 0x05, 0x90, 0x2C, 0x10, 0xFC, + 0xD1, 0x25, 0xC9, 0xF7, 0xE3, 0x1F, 0x0D, 0x07, 0xDD, 0x23, 0x23, 0x12, + 0x66, 0x36, 0xEF, 0x13, 0xAA, 0x36, 0x58, 0x20, 0xBC, 0x25, 0xC2, 0x31, + 0x1E, 0x1C, 0xF8, 0x38, 0xAD, 0x18, 0x0D, 0x3E, 0x00, 0x1F, 0x48, 0x3B, + 0x23, 0x1A, 0xCE, 0x17, 0xD5, 0x00, 0x3E, 0xF8, 0x2C, 0xF0, 0xFC, 0x04, + 0xB7, 0xEE, 0x9C, 0x1B, 0x1D, 0xF9, 0x23, 0x17, 0x2C, 0x0C, 0x60, 0x10, + 0x7D, 0x17, 0xFC, 0x12, 0xD8, 0x1E, 0x4C, 0x1E, 0x33, 0x2E, 0xCA, 0x34, + 0x6D, 0x3C, 0x80, 0x3F, 0x38, 0x42, 0x35, 0x3C, 0xF4, 0x40, 0x50, 0x37, + 0xF1, 0x3B, 0x71, 0x34, 0x57, 0x30, 0x94, 0x31, 0x2E, 0x2B, 0xE5, 0x34, + 0xEA, 0x33, 0x0B, 0x35, 0x44, 0x32, 0x0F, 0x24, 0xF2, 0x25, 0xBD, 0x10, + 0x0B, 0x1C, 0xAC, 0x02, 0xC2, 0x17, 0xD0, 0xFE, 0x75, 0x19, 0x30, 0x0A, + 0xFA, 0x14, 0x40, 0x16, 0x66, 0x10, 0x51, 0x24, 0x2D, 0x0C, 0x11, 0x27, + 0x88, 0x09, 0x8B, 0x1C, 0x4E, 0x16, 0x51, 0x23, 0xCE, 0x2A, 0x3E, 0x37, + 0x1B, 0x39, 0x26, 0x43, 0x92, 0x3A, 0xE6, 0x3E, 0x4B, 0x29, 0x8C, 0x2D, + 0x76, 0x1F, 0x0E, 0x29, 0x06, 0x2B, 0x0C, 0x38, 0x41, 0x3B, 0x13, 0x3D, + 0xF2, 0x3F, 0x5C, 0x28, 0x2A, 0x37, 0x85, 0x0E, 0xFF, 0x22, 0xBC, 0x01, + 0x23, 0x0D, 0xE8, 0x09, 0x49, 0x10, 0x9B, 0x1C, 0x3C, 0x23, 0x60, 0x19, + 0xD0, 0x37, 0xB6, 0x12, 0x4F, 0x3F, 0x0B, 0x0E, 0xE9, 0x37, 0x13, 0x0C, + 0x92, 0x28, 0x34, 0x1D, 0x34, 0x15, 0xAD, 0x31, 0xBD, 0x08, 0x79, 0x2F, + 0x82, 0x02, 0xED, 0x0A, 0x08, 0xFC, 0xDA, 0xED, 0x65, 0xFC, 0x3B, 0xFD, + 0x0C, 0x02, 0x70, 0x22, 0x19, 0xFD, 0x4F, 0x3C, 0x55, 0xFE, 0x3B, 0x3F, + 0xBA, 0x12, 0x38, 0x36, 0x6F, 0x20, 0x79, 0x2E, 0xBB, 0x1C, 0x83, 0x33, + 0x45, 0x19, 0xC6, 0x3C, 0xAE, 0x16, 0x88, 0x3F, 0x70, 0x13, 0x6B, 0x3D, + 0x4B, 0x20, 0x71, 0x37, 0xA4, 0x39, 0x86, 0x2F, 0xDF, 0x46, 0xF7, 0x2C, + 0x03, 0x3E, 0x26, 0x35, 0x00, 0x27, 0xC8, 0x25, 0xAF, 0x16, 0xEB, 0x08, + 0xE4, 0x0E, 0x1A, 0xFE, 0x06, 0x18, 0x89, 0xF9, 0x0B, 0x2A, 0x48, 0xF3, + 0x56, 0x26, 0x8F, 0xF4, 0xB9, 0x1B, 0xF8, 0x07, 0x7C, 0x11, 0x88, 0x11, + 0x4A, 0x19, 0x3B, 0x16, 0xD6, 0x3D, 0x29, 0x34, 0xCE, 0x5A, 0x51, 0x50, + 0xC3, 0x5B, 0xA9, 0x57, 0xF8, 0x4F, 0x0B, 0x55, 0x5E, 0x39, 0xAC, 0x43, + 0xE0, 0x27, 0x6C, 0x41, 0xB8, 0x28, 0x94, 0x58, 0x8B, 0x24, 0xD5, 0x60, + 0xD7, 0x17, 0x90, 0x44, 0xB9, 0x1A, 0xE4, 0x21, 0xAB, 0x24, 0xDC, 0x16, + 0x0D, 0x1D, 0x67, 0x1B, 0x47, 0x19, 0xDB, 0x2E, 0x45, 0x20, 0xF7, 0x3F, + 0x72, 0x22, 0xCB, 0x3F, 0xF5, 0x20, 0x8C, 0x31, 0x72, 0x26, 0x59, 0x22, + 0x05, 0x23, 0x0D, 0x1F, 0x25, 0x17, 0xBB, 0x24, 0xBA, 0x11, 0x02, 0x20, + 0xF5, 0x04, 0xEA, 0x0A, 0xF2, 0xF2, 0x7E, 0xF8, 0x3A, 0xF8, 0xA5, 0x03, + 0x6E, 0x0C, 0xA9, 0x18, 0xF3, 0x17, 0xB9, 0x22, 0x83, 0x24, 0xBE, 0x22, + 0x11, 0x2F, 0x3D, 0x1C, 0x38, 0x38, 0x49, 0x25, 0xF7, 0x3E, 0x86, 0x37, + 0xF2, 0x31, 0x3D, 0x3A, 0x1F, 0x23, 0x30, 0x32, 0x3C, 0x19, 0x32, 0x34, + 0xF3, 0x0C, 0x14, 0x32, 0x60, 0x0C, 0x7F, 0x29, 0xA7, 0x11, 0x99, 0x24, + 0xB2, 0x10, 0xF4, 0x1A, 0x5D, 0x00, 0x23, 0x07, 0xAF, 0xF5, 0x16, 0xF3, + 0x35, 0xF8, 0xE6, 0xE4, 0xD2, 0xF5, 0x5A, 0xDC, 0xC6, 0xF5, 0x26, 0xDF, + 0xCC, 0xF8, 0xFB, 0xE3, 0x29, 0xFF, 0x00, 0xE7, 0x12, 0xF4, 0x27, 0xE2, + 0x26, 0xE9, 0x45, 0xE3, 0x1A, 0xFC, 0x1E, 0xF4, 0x86, 0x10, 0x5D, 0x06, + 0xD6, 0x17, 0x43, 0x1A, 0x7B, 0x10, 0xCC, 0x24, 0x98, 0xFF, 0xA0, 0x13, + 0xBD, 0xFD, 0x80, 0x0A, 0x2F, 0x0B, 0x4C, 0x18, 0xF9, 0x0B, 0xCD, 0x1D, + 0x2F, 0xF6, 0x29, 0x14, 0xE1, 0xE2, 0x07, 0x0C, 0x61, 0xD8, 0x39, 0x09, + 0x9A, 0xC9, 0x2A, 0xFB, 0xB9, 0xC4, 0x93, 0xEE, 0x69, 0xCF, 0x89, 0xEE, + 0x63, 0xDC, 0xCE, 0xF2, 0xC0, 0xDC, 0xEE, 0xF3, 0x8A, 0xDC, 0x71, 0xF4, + 0xED, 0xE2, 0xD6, 0xEA, 0xD7, 0xE5, 0xC2, 0xDA, 0xFD, 0xDF, 0x13, 0xCE, + 0xAB, 0xC8, 0x45, 0xBB, 0x99, 0xB0, 0x72, 0xAB, 0x90, 0xB5, 0x08, 0xC0, + 0xEE, 0xCB, 0xD5, 0xE0, 0xF8, 0xD9, 0x58, 0xDA, 0x87, 0xE0, 0x79, 0xC5, + 0xCC, 0xDB, 0x7D, 0xB4, 0xDF, 0xDB, 0x2C, 0xBF, 0xF7, 0xE9, 0xFA, 0xE0, + 0x6F, 0xEF, 0x61, 0xF6, 0x74, 0xED, 0xA1, 0xFB, 0x06, 0xF6, 0x20, 0xF1, + 0x1B, 0x03, 0x9A, 0xE4, 0xAE, 0x0A, 0x03, 0xE3, 0x1C, 0x0A, 0x45, 0xEF, + 0x3A, 0x00, 0xB5, 0xFA, 0x78, 0xE9, 0x64, 0xF4, 0xDC, 0xCD, 0x8C, 0xDE, + 0x4C, 0xC0, 0xEA, 0xBF, 0x4D, 0xB8, 0xAA, 0xAA, 0x9A, 0xB3, 0xD4, 0xB1, + 0x48, 0xB5, 0x60, 0xC1, 0x3D, 0xC0, 0x67, 0xC7, 0xBE, 0xC9, 0x2A, 0xC5, + 0x97, 0xCA, 0x1D, 0xCB, 0xFB, 0xDD, 0x1D, 0xE1, 0x50, 0xFB, 0xF0, 0xF9, + 0xB1, 0x0D, 0x78, 0x0F, 0xC0, 0x07, 0x16, 0x19, 0x44, 0xE4, 0x8B, 0x08, + 0x89, 0xCA, 0x11, 0xEE, 0x30, 0xD4, 0xCD, 0xEA, 0xED, 0xE2, 0xB8, 0xED, + 0x64, 0xDB, 0x96, 0xE6, 0xED, 0xC9, 0x5A, 0xDA, 0xED, 0xCD, 0x50, 0xD5, + 0x34, 0xE2, 0xDC, 0xD9, 0x4C, 0xEB, 0xDA, 0xDF, 0xA0, 0xE5, 0x31, 0xE6, + 0x2A, 0xE5, 0x81, 0xEB, 0xAA, 0xE9, 0x58, 0xEC, 0x77, 0xD9, 0x0C, 0xE4, + 0xAA, 0xC6, 0xC6, 0xE1, 0x55, 0xC2, 0x41, 0xDF, 0x44, 0xBC, 0xBF, 0xC7, + 0x60, 0xB1, 0x7E, 0xA6, 0xBF, 0xB0, 0x46, 0x9C, 0x0B, 0xC0, 0x25, 0xB0, + 0x87, 0xCA, 0x50, 0xCA, 0x51, 0xD2, 0xFB, 0xD4, 0xA5, 0xE2, 0x4C, 0xD0, + 0xE2, 0xEA, 0x57, 0xC7, 0x4B, 0xED, 0x39, 0xCC, 0x2C, 0xF2, 0xA1, 0xDB, + 0x58, 0xF9, 0x0F, 0xE1, 0x15, 0xF6, 0x7B, 0xDF, 0x96, 0xE8, 0x1C, 0xE2, + 0x90, 0xD5, 0x67, 0xDB, 0x2B, 0xCD, 0xE1, 0xD1, 0x12, 0xE6, 0xD0, 0xDD, + 0x1B, 0x04, 0x60, 0xF3, 0x6F, 0xFB, 0xC9, 0xEB, 0x77, 0xDB, 0x9E, 0xD2, + 0x55, 0xCF, 0xF6, 0xC7, 0x5B, 0xD2, 0x98, 0xBE, 0x96, 0xD8, 0x3A, 0xC2, + 0x78, 0xDB, 0x1D, 0xCF, 0x4C, 0xE1, 0x6E, 0xDC, 0xE5, 0xE7, 0xFE, 0xE1, + 0x3D, 0xDD, 0xA4, 0xDF, 0xF6, 0xDA, 0x8B, 0xF2, 0x7B, 0xEC, 0x1C, 0x05, + 0xAE, 0xFE, 0x00, 0x08, 0x30, 0x01, 0x61, 0x02, 0x21, 0xEF, 0x27, 0xF9, + 0x63, 0xE8, 0x1C, 0xF9, 0xF1, 0x00, 0x88, 0x0E, 0xD2, 0x15, 0xC1, 0x21, + 0xD2, 0x07, 0x48, 0x10, 0x15, 0xED, 0x83, 0xF1, 0x4C, 0xE4, 0x1C, 0xE5, + 0x25, 0xE0, 0x58, 0xDE, 0xD9, 0xD9, 0xCE, 0xD2, 0x24, 0xE9, 0x55, 0xDB, + 0x6E, 0x00, 0xE7, 0xEB, 0x16, 0x0A, 0x02, 0xED, 0xEB, 0x04, 0xE9, 0xE6, + 0x1F, 0xF3, 0x11, 0xE4, 0xB7, 0xE7, 0xAB, 0xE7, 0x32, 0xE4, 0xFA, 0xE2, + 0x82, 0xDB, 0x35, 0xCF, 0x24, 0xD9, 0x0E, 0xC8, 0xFD, 0xDF, 0xA3, 0xD2, + 0xE7, 0xDF, 0x61, 0xDB, 0x04, 0xDA, 0x33, 0xE5, 0xFA, 0xD8, 0x13, 0xF0, + 0x1B, 0xD5, 0x0F, 0xE9, 0x10, 0xE1, 0x32, 0xE4, 0x04, 0x0B, 0xC1, 0xF6, + 0x34, 0x26, 0xC6, 0xFD, 0x85, 0x26, 0x09, 0xFB, 0x07, 0x16, 0x25, 0x02, + 0x45, 0xF6, 0x31, 0xFF, 0x63, 0xEF, 0xF7, 0xFF, 0x72, 0x06, 0x10, 0x10, + 0xC4, 0x0B, 0x03, 0x0D, 0xA0, 0xFB, 0x90, 0xF3, 0x46, 0xF4, 0x03, 0xDD, + 0x14, 0xE7, 0x09, 0xCB, 0x87, 0xD7, 0x89, 0xC9, 0x21, 0xDA, 0x13, 0xDD, + 0x7D, 0xED, 0x1C, 0xF8, 0x18, 0xFB, 0x8B, 0xFD, 0x2C, 0x02, 0x9A, 0xF5, + 0x10, 0x20, 0xBE, 0x06, 0xC6, 0x3A, 0x91, 0x26, 0x84, 0x39, 0x01, 0x39, + 0xAE, 0x30, 0x6C, 0x40, 0x86, 0x27, 0xBF, 0x3C, 0x1C, 0x0D, 0x8F, 0x1D, + 0xD1, 0x10, 0xDD, 0x1B, 0x10, 0x27, 0x86, 0x2F, 0xF2, 0x07, 0xC8, 0x12, + 0x2A, 0xEB, 0x77, 0xF5, 0x32, 0xFB, 0xB2, 0xFE, 0xB7, 0xFC, 0x58, 0xF9, + 0xD4, 0xF2, 0xC1, 0xE7, 0xAE, 0x0B, 0x76, 0xF7, 0x0C, 0x24, 0xDC, 0x0E, + 0x60, 0x1E, 0x03, 0x14, 0x1A, 0x1C, 0x96, 0x10, 0x48, 0x26, 0xBE, 0x00, + 0x26, 0x1F, 0xD1, 0xE5, 0x8B, 0xF8, 0x11, 0xCC, 0xA7, 0xD5, 0x52, 0xC3, + 0x43, 0xDC, 0x93, 0xD5, 0x88, 0xF5, 0x1A, 0xF0, 0xB5, 0x00, 0x58, 0xF9, + 0x6D, 0x0F, 0xB8, 0xFE, 0xE3, 0x25, 0xD5, 0x0E, 0x66, 0x1F, 0x99, 0x15, + 0x5E, 0x0E, 0x20, 0x1B, 0x26, 0x19, 0xCE, 0x30, 0x20, 0x1E, 0x49, 0x3B, + 0x27, 0x0A, 0x1F, 0x2D, 0x69, 0xFB, 0xB8, 0x17, 0xB9, 0x00, 0x4C, 0x08, + 0x87, 0x07, 0xE0, 0x08, 0x95, 0x00, 0x37, 0x15, 0x90, 0xF2, 0x2E, 0x18, + 0x93, 0xE1, 0x60, 0x00, 0x0C, 0xE3, 0xDA, 0xE8, 0x54, 0xEA, 0xF5, 0xD9, + 0x7D, 0xE7, 0xD9, 0xCD, 0x04, 0xF3, 0x7C, 0xE0, 0xE4, 0x10, 0x90, 0x08, + 0x47, 0x16, 0xAA, 0x0A, 0xAA, 0x07, 0x58, 0xEB, 0x4F, 0x22, 0x70, 0xF5, + 0xEF, 0x42, 0x5B, 0x10, 0x9E, 0x3B, 0x73, 0x0F, 0xA6, 0x2B, 0xCC, 0x15, + 0xE2, 0x13, 0xFC, 0x1B, 0x3E, 0xEE, 0x39, 0x06, 0xAC, 0xFE, 0x27, 0x0B, + 0xC9, 0x2E, 0xA4, 0x26, 0x5D, 0x23, 0x69, 0x1B, 0x20, 0x04, 0xA3, 0x13, + 0x95, 0x0B, 0xE5, 0x2F, 0x5D, 0x0A, 0x32, 0x2D, 0x08, 0xEC, 0xB5, 0x01, + 0xD6, 0xF0, 0xB7, 0xFD, 0xF8, 0x09, 0x34, 0x13, 0x0F, 0x0A, 0xC4, 0x11, + 0x60, 0x04, 0x86, 0x10, 0xDC, 0xFB, 0x25, 0x0D, 0x59, 0xEB, 0x3A, 0xF1, + 0x20, 0xE2, 0x9B, 0xCF, 0xE1, 0xE1, 0x8C, 0xBE, 0x4A, 0xF0, 0x45, 0xC9, + 0xF4, 0x0D, 0x5A, 0xE4, 0x43, 0x1B, 0xB8, 0xEF, 0xFD, 0x17, 0x06, 0xF4, + 0xBE, 0x18, 0x9A, 0xFB, 0xC9, 0x12, 0x73, 0xF6, 0x8D, 0x06, 0xDA, 0xF0, + 0x57, 0x0C, 0x31, 0x0B, 0xD0, 0x1C, 0x64, 0x2B, 0xF4, 0x14, 0x38, 0x20, + 0x04, 0x09, 0x1E, 0x0B, 0xE9, 0x0A, 0xF3, 0x0A, 0x7F, 0x04, 0xDC, 0x10, + 0xF8, 0xFA, 0xBA, 0x1E, 0x02, 0xF3, 0x2A, 0x2A, 0x1B, 0xF2, 0xB0, 0x1F, + 0xB4, 0xEA, 0xE0, 0xF7, 0x49, 0xD0, 0x83, 0xCC, 0x7C, 0xC4, 0x3A, 0xCA, + 0x9E, 0xD2, 0xBF, 0xE2, 0x4A, 0xF7, 0x1D, 0x03, 0xC2, 0x05, 0x53, 0x0E, + 0x4D, 0x02, 0xD0, 0x0B, 0x11, 0x17, 0x4A, 0x13, 0x00, 0x2E, 0xBA, 0x0F, + 0x1C, 0x3A, 0x24, 0x0C, 0xE3, 0x3E, 0x00, 0x1A, 0xEC, 0x24, 0x30, 0x15, + 0xAF, 0x06, 0x5B, 0x04, 0x7C, 0x24, 0x37, 0x1F, 0xE5, 0x3B, 0x16, 0x2B, + 0x9F, 0x19, 0x6D, 0x0A, 0x98, 0x0B, 0x89, 0x12, 0x95, 0x22, 0x44, 0x3D, + 0x3B, 0x1A, 0xC9, 0x2C, 0xBE, 0x16, 0xE7, 0x0D, 0xFF, 0x2B, 0xC8, 0x14, + 0xAE, 0x24, 0xF9, 0x16, 0xD1, 0x1E, 0x99, 0x22, 0x6C, 0x27, 0x0D, 0x36, + 0x00, 0x21, 0x75, 0x32, 0x58, 0x17, 0x7A, 0x24, 0x11, 0x18, 0x0B, 0x1B, + 0xE1, 0x0D, 0xE3, 0x0F, 0x12, 0x07, 0xC2, 0x20, 0x3D, 0x10, 0xB4, 0x4A, + 0xFD, 0x10, 0xE3, 0x4F, 0x59, 0x14, 0x79, 0x2E, 0x6A, 0x34, 0xDE, 0x26, + 0x34, 0x3D, 0xDA, 0x2E, 0x34, 0x25, 0xEE, 0x35, 0x13, 0x33, 0x2E, 0x56, + 0x6B, 0x46, 0x0A, 0x55, 0x0C, 0x3F, 0x44, 0x29, 0x15, 0x43, 0xFF, 0x19, + 0x05, 0x52, 0x6F, 0x2B, 0xB2, 0x49, 0x76, 0x28, 0xCF, 0x3B, 0x75, 0x1D, + 0xF9, 0x37, 0x22, 0x26, 0xAE, 0x14, 0x11, 0x17, 0xF6, 0xE5, 0x18, 0xF4, + 0x36, 0xE6, 0x82, 0xF3, 0x4C, 0xFB, 0xF2, 0x08, 0xB6, 0x0E, 0x0C, 0x21, + 0xE1, 0x13, 0xF4, 0x25, 0x1E, 0x17, 0xD6, 0x25, 0xE0, 0x1D, 0xB4, 0x2F, + 0x6E, 0x21, 0x5E, 0x3A, 0x2A, 0x36, 0x78, 0x51, 0xBD, 0x40, 0xB7, 0x5D, + 0xBE, 0x2C, 0x86, 0x4E, 0xFE, 0x18, 0x9F, 0x37, 0xD7, 0x2C, 0x6D, 0x3A, + 0xE4, 0x37, 0xBE, 0x34, 0x2F, 0x1D, 0x98, 0x17, 0x8F, 0x18, 0x59, 0x1A, + 0x6E, 0x28, 0x7B, 0x34, 0x33, 0x0B, 0x78, 0x21, 0xC6, 0xED, 0x1F, 0x03, + 0xF9, 0x04, 0x78, 0x06, 0x31, 0x1F, 0xAE, 0x07, 0x5E, 0x2C, 0x4E, 0x0C, + 0xBD, 0x2B, 0x25, 0x17, 0xED, 0x12, 0x21, 0x12, 0x80, 0xED, 0x47, 0xFC, + 0xAF, 0xDF, 0x5E, 0xED, 0x2F, 0xE9, 0x04, 0xE2, 0x0B, 0xFA, 0x90, 0xDD, + 0x68, 0x18, 0xA7, 0xFE, 0x26, 0x1D, 0xC8, 0x1A, 0x7E, 0x09, 0x62, 0x19, + 0xAC, 0x09, 0x13, 0x1C, 0x69, 0x09, 0x3A, 0x1C, 0x3D, 0x12, 0x85, 0x25, + 0x54, 0x30, 0x73, 0x3B, 0xE5, 0x2D, 0xB5, 0x34, 0x62, 0x0B, 0xC5, 0x21, + 0xF8, 0xF5, 0x65, 0x20, 0xAA, 0xED, 0xFF, 0x13, 0xCF, 0xF4, 0xDD, 0x05, + 0x5A, 0x0C, 0xFB, 0x10, 0x63, 0x19, 0x05, 0x21, 0xB1, 0xFD, 0xEF, 0x0F, + 0xFD, 0xD9, 0x24, 0xEF, 0x5F, 0xD7, 0xB6, 0xDC, 0x86, 0xF2, 0x02, 0xDC, + 0xD3, 0x17, 0xFD, 0xF4, 0x2D, 0x0D, 0xA3, 0xFB, 0x56, 0xFA, 0x2F, 0xFB, + 0xC7, 0x07, 0x5E, 0x01, 0x21, 0x1B, 0x03, 0x04, 0x38, 0x27, 0x89, 0x19, + 0x86, 0x28, 0x83, 0x33, 0xDC, 0x24, 0x23, 0x2C, 0x57, 0x29, 0x5A, 0x1A, + 0xB9, 0x33, 0xA7, 0x27, 0xA1, 0x1B, 0x42, 0x29, 0xFE, 0xFF, 0xBF, 0x15, + 0xD6, 0x1D, 0x80, 0x2B, 0x99, 0x2F, 0xD9, 0x47, 0x7A, 0xFF, 0x30, 0x32, + 0x4D, 0xE4, 0x7E, 0x22, 0xC1, 0xF1, 0xD7, 0x1E, 0xDE, 0x06, 0x7F, 0x13, + 0x6D, 0x1F, 0x35, 0x17, 0xB0, 0x22, 0x3B, 0x21, 0x4E, 0x08, 0x94, 0x16, + 0x9B, 0xEF, 0xA5, 0xFC, 0xDB, 0xDD, 0x81, 0xD8, 0x9F, 0xD0, 0x4A, 0xBD, + 0x05, 0xE4, 0x3B, 0xD0, 0x71, 0x04, 0x36, 0xF2, 0xA3, 0x17, 0xA5, 0xFD, + 0xE0, 0x1F, 0xF5, 0xFA, 0xC8, 0x08, 0x43, 0xE9, 0x0C, 0xEE, 0x5A, 0xE2, + 0x49, 0x0B, 0xE7, 0x0A, 0x2F, 0x20, 0xC2, 0x20, 0xFA, 0x11, 0xB4, 0x10, + 0x23, 0x22, 0x46, 0x11, 0xC5, 0x31, 0x9B, 0x0B, 0xE1, 0x18, 0xC4, 0xF7, + 0xBB, 0x03, 0x5D, 0x04, 0x4C, 0x05, 0x28, 0x20, 0xC2, 0x00, 0x67, 0x20, + 0x4E, 0xE5, 0xBB, 0x0A, 0x8C, 0xC5, 0xA3, 0xF1, 0xCB, 0xAF, 0x1E, 0xD7, + 0x8E, 0xB8, 0xAC, 0xD0, 0x86, 0xD8, 0x98, 0xE1, 0xF0, 0xEB, 0x05, 0xFA, + 0xBA, 0xF0, 0x12, 0x14, 0xF0, 0xE2, 0xE5, 0x12, 0x01, 0xED, 0xFF, 0x0B, + 0x48, 0x15, 0x42, 0x0F, 0x96, 0x1D, 0x2A, 0x00, 0x90, 0x13, 0x8C, 0xF5, + 0xD5, 0x22, 0x31, 0x16, 0x49, 0x1F, 0x65, 0x1D, 0x9B, 0xEF, 0x2C, 0xE2, + 0xD2, 0xE8, 0x65, 0xCE, 0x44, 0x10, 0x14, 0xF3, 0x30, 0x0B, 0xE5, 0xF0, + 0xAC, 0xFE, 0x67, 0xE2, 0x49, 0x0E, 0xE4, 0xF4, 0xA0, 0x08, 0xF2, 0xF9, + 0x18, 0x00, 0xB7, 0xF7, 0x05, 0x00, 0x5C, 0xF8, 0x18, 0xF5, 0x44, 0xEA, + 0xBA, 0xE5, 0xD3, 0xD7, 0x8F, 0xD2, 0xE6, 0xC8, 0xA1, 0xBA, 0x93, 0xB9, + 0xA3, 0xB0, 0x30, 0xB7, 0xF4, 0xBA, 0x6C, 0xCA, 0xBE, 0xC6, 0xB4, 0xE1, + 0x7C, 0xCE, 0x8E, 0xEF, 0x04, 0xCF, 0xDE, 0xE8, 0x5D, 0xD2, 0xC1, 0xE0, + 0x31, 0xE7, 0x0E, 0xED, 0x77, 0x02, 0x4B, 0xFD, 0x64, 0x10, 0x7C, 0xFD, + 0xE9, 0x0A, 0xDB, 0xEE, 0xD2, 0xF2, 0xF5, 0xDA, 0x9F, 0xD9, 0xF0, 0xCC, + 0xC5, 0xDF, 0xD9, 0xD5, 0x12, 0xF7, 0x2B, 0xEA, 0xC0, 0xFD, 0xA1, 0xEE, + 0xF3, 0xF5, 0x17, 0xE1, 0xAE, 0xDF, 0xB3, 0xC3, 0xE2, 0xBC, 0x3B, 0xA5, + 0xF5, 0xA8, 0x43, 0xA5, 0xD8, 0xBF, 0x0A, 0xCF, 0x97, 0xD1, 0x04, 0xE7, + 0x1E, 0xD7, 0x80, 0xEB, 0x1B, 0xE8, 0x52, 0xF8, 0x57, 0xED, 0xF0, 0xFA, + 0x41, 0xEA, 0xCC, 0xF8, 0x96, 0xF6, 0xC4, 0x02, 0x81, 0xF3, 0x4D, 0x02, + 0xFF, 0xE2, 0x4F, 0xFB, 0x9A, 0xE7, 0x09, 0x07, 0xA3, 0xD3, 0x2C, 0xF0, + 0xFA, 0xB8, 0x37, 0xC0, 0xC9, 0xDB, 0xC8, 0xCD, 0x6A, 0xFF, 0xEA, 0xE7, + 0x94, 0xDE, 0x6E, 0xD1, 0x22, 0xD3, 0x09, 0xCC, 0x51, 0xED, 0x0A, 0xD3, + 0x60, 0xEF, 0x27, 0xC1, 0x26, 0x00, 0xCD, 0xC1, 0x24, 0x0C, 0xE5, 0xC8, + 0xA5, 0xE2, 0xC1, 0xB5, 0x7F, 0xB5, 0x54, 0xB4, 0xFF, 0xA3, 0x52, 0xBA, + 0x9A, 0x9D, 0xD8, 0x9F, 0xDC, 0xB1, 0x6D, 0xA3, 0xC8, 0xCE, 0xF8, 0xC9, + 0x38, 0xCB, 0xDF, 0xD2, 0x78, 0xCB, 0xB9, 0xD0, 0xF8, 0xCE, 0x03, 0xC4, + 0x5F, 0xC9, 0x3F, 0xB8, 0x27, 0xDC, 0x00, 0xD8, 0x9C, 0xE9, 0x55, 0xF3, + 0x53, 0xD3, 0xB0, 0xDE, 0x9A, 0xC4, 0x71, 0xD5, 0xDB, 0xB4, 0x5C, 0xD7, + 0x82, 0xA5, 0x2B, 0xCB, 0xFA, 0xBB, 0x73, 0xD2, 0x80, 0xD9, 0xA6, 0xE5, + 0x48, 0xDB, 0x8D, 0xE3, 0xB6, 0xC6, 0xC5, 0xD1, 0x0D, 0xA3, 0xBA, 0xBE, + 0x0A, 0x9D, 0xCA, 0xB6, 0x5F, 0xCE, 0x13, 0xC1, 0x85, 0xEB, 0x64, 0xBC, + 0x55, 0xEF, 0x49, 0xC5, 0x71, 0xFD, 0x38, 0xE6, 0x9A, 0xF7, 0xFA, 0xE5, + 0x81, 0xE4, 0xE3, 0xD4, 0x46, 0xFD, 0xF0, 0xE8, 0xEC, 0x0C, 0x40, 0xF3, + 0x4F, 0x02, 0x1D, 0xF2, 0xED, 0x1D, 0x3D, 0x1C, 0x8D, 0x19, 0x26, 0x1D, + 0x7A, 0xE5, 0x97, 0xE8, 0x55, 0xF1, 0xCA, 0xE5, 0xF9, 0x22, 0x9D, 0x05, + 0x63, 0x1C, 0x8D, 0x09, 0x0D, 0x0B, 0xAC, 0x13, 0xC0, 0x16, 0x87, 0x1C, + 0xC2, 0x1B, 0x3C, 0x01, 0xD0, 0x27, 0x27, 0x06, 0xC4, 0x23, 0x40, 0x13, + 0x4E, 0xFD, 0x64, 0x00, 0x6C, 0xF1, 0x47, 0x00, 0x17, 0xF5, 0x8A, 0xF5, + 0x96, 0xE2, 0x82, 0xD2, 0xAC, 0xE3, 0xCD, 0xD7, 0x07, 0x00, 0x23, 0xF8, + 0xE1, 0x24, 0xC7, 0x02, 0x5D, 0x3B, 0x97, 0x06, 0xE3, 0x23, 0xBF, 0x12, + 0x8D, 0x01, 0xAE, 0x12, 0xCC, 0x0F, 0xD2, 0x1B, 0x32, 0x29, 0x3C, 0x23, + 0xA4, 0x1D, 0x1C, 0x19, 0x11, 0x10, 0xA7, 0x27, 0x9A, 0x01, 0xDE, 0x27, + 0x81, 0xF9, 0xF6, 0x0A, 0x7A, 0x11, 0x2D, 0x05, 0x12, 0x20, 0x79, 0x1C, + 0x53, 0x0A, 0x22, 0x20, 0xB5, 0xF8, 0xFD, 0x05, 0x9F, 0xEA, 0x60, 0xF1, + 0x4C, 0xCD, 0xFD, 0xEC, 0xDC, 0xD7, 0xB4, 0x04, 0x2C, 0xFD, 0x20, 0x10, + 0xAF, 0x12, 0xE0, 0x09, 0xB1, 0x22, 0xF2, 0x18, 0x80, 0x15, 0x71, 0x1E, + 0x38, 0xF7, 0xAA, 0x0F, 0x16, 0x02, 0x36, 0x16, 0xF7, 0x19, 0xFE, 0x15, + 0x0A, 0x1F, 0x23, 0x08, 0x41, 0x37, 0xE3, 0x18, 0x56, 0x36, 0x16, 0x11, + 0x7B, 0x0D, 0x64, 0xF0, 0xE6, 0x19, 0x8C, 0x0D, 0x7D, 0x3C, 0x34, 0x2D, + 0x6D, 0x2E, 0xD0, 0x11, 0x7E, 0x1F, 0x3A, 0x06, 0x33, 0x1C, 0x18, 0x0D, + 0x60, 0x1A, 0x3E, 0x08, 0x79, 0x1C, 0xDA, 0x02, 0x06, 0x15, 0x72, 0xF8, + 0xF0, 0x18, 0xB3, 0xF9, 0x5D, 0x1D, 0xF4, 0x02, 0x0E, 0xFA, 0xCF, 0xEA, + 0x13, 0xD4, 0x55, 0xC8, 0x1A, 0xEA, 0x9B, 0xE7, 0x85, 0x0A, 0xCB, 0x1B, + 0x72, 0x12, 0x5F, 0x2E, 0x2A, 0x18, 0xBE, 0x2E, 0x78, 0x06, 0x44, 0x10, + 0xB7, 0xF4, 0xAC, 0xFB, 0xC3, 0x05, 0x17, 0x15, 0x3C, 0x0A, 0x7C, 0x2A, + 0x21, 0x03, 0x40, 0x2D, 0xDE, 0x1C, 0x6B, 0x30, 0x29, 0x26, 0x73, 0x1D, + 0xEE, 0x17, 0xF8, 0x03, 0x36, 0x19, 0x19, 0x14, 0xD8, 0x1B, 0x93, 0x34, + 0x9F, 0x07, 0x40, 0x27, 0xCA, 0xFA, 0xB8, 0x06, 0xA3, 0xFA, 0xFF, 0xEB, + 0x84, 0xF3, 0x52, 0xE4, 0x53, 0xFE, 0x36, 0xF9, 0xFD, 0x0E, 0x5F, 0x0F, + 0x6C, 0x1D, 0x31, 0x2A, 0xAF, 0x22, 0x5F, 0x33, 0x8C, 0x24, 0xEF, 0x28, + 0x5A, 0x37, 0xD4, 0x27, 0x71, 0x3F, 0x5F, 0x25, 0x9D, 0x36, 0xFB, 0x22, + 0xC7, 0x47, 0x01, 0x38, 0x93, 0x47, 0x2B, 0x37, 0xC5, 0x17, 0xF4, 0x13, + 0xE3, 0x04, 0x44, 0x14, 0xE0, 0x1D, 0x25, 0x27, 0x36, 0x2D, 0x5E, 0x17, + 0x78, 0x29, 0x3F, 0x0E, 0x06, 0x1B, 0x0F, 0x1F, 0xCA, 0x0F, 0x82, 0x25, + 0x5C, 0x20, 0xB7, 0x1E, 0x28, 0x26, 0x99, 0x02, 0xD7, 0x19, 0x92, 0xF7, + 0x2A, 0x13, 0xB6, 0x0A, 0x55, 0xFD, 0xF4, 0xF5, 0x16, 0xE4, 0x77, 0xC8, + 0xCA, 0xEF, 0x84, 0xD7, 0x9D, 0x00, 0xB1, 0x08, 0x3F, 0x01, 0xA1, 0x1E, + 0x6C, 0x11, 0x48, 0x29, 0x0A, 0x0D, 0x6F, 0x1D, 0x4F, 0xF3, 0xEB, 0x06, + 0x42, 0xFC, 0xD4, 0x1A, 0xF3, 0x1A, 0x05, 0x40, 0x4C, 0x28, 0x9C, 0x43, + 0xED, 0x34, 0x40, 0x42, 0x5F, 0x28, 0xF8, 0x34, 0x69, 0x03, 0x85, 0x10, + 0x8E, 0x0A, 0xF2, 0x13, 0xA7, 0x20, 0x7F, 0x35, 0xF2, 0x05, 0x1E, 0x33, + 0x42, 0xDD, 0xBB, 0x17, 0xF3, 0xD1, 0x46, 0xFF, 0x88, 0xC9, 0xC9, 0xEC, + 0xD3, 0xCF, 0x50, 0xEC, 0x02, 0xE7, 0xB9, 0xEC, 0x0F, 0x03, 0x51, 0xF3, + 0x72, 0x1C, 0x0A, 0x07, 0xD3, 0x1F, 0x39, 0x10, 0x20, 0x15, 0xAF, 0x03, + 0xD5, 0x12, 0xAE, 0xF6, 0x09, 0x18, 0xD4, 0xED, 0xC4, 0x2C, 0x88, 0x02, + 0x77, 0x32, 0x61, 0x21, 0xBE, 0x13, 0x4D, 0x02, 0xA3, 0x01, 0xA3, 0xDA, + 0xA5, 0x1A, 0x50, 0xFB, 0x60, 0x2F, 0xF9, 0x25, 0x39, 0x1A, 0x85, 0x1C, + 0x4A, 0x06, 0x9A, 0x14, 0x21, 0xF8, 0x48, 0x16, 0xBF, 0xF1, 0x87, 0x10, + 0x77, 0xF2, 0x2F, 0x0C, 0x5A, 0xEE, 0x15, 0x0B, 0x89, 0xEF, 0x49, 0x05, + 0x9D, 0xDF, 0xA0, 0xE9, 0xFC, 0xC4, 0xC3, 0xCA, 0xF4, 0xBD, 0x5E, 0xC3, + 0x69, 0xDF, 0xCF, 0xE6, 0xC5, 0xFE, 0x45, 0x00, 0xE3, 0x03, 0x31, 0xF7, + 0x86, 0x03, 0x95, 0xEF, 0x65, 0xEC, 0x8C, 0xE6, 0x1B, 0xE3, 0x99, 0xF1, + 0x46, 0x06, 0xB5, 0x12, 0x70, 0x21, 0x94, 0x23, 0x82, 0x1B, 0x4A, 0x1E, + 0xD1, 0x1A, 0x39, 0x15, 0xFF, 0x1A, 0xB1, 0x0C, 0xD8, 0x0B, 0x55, 0x0A, + 0x64, 0x0B, 0x04, 0x1C, 0x84, 0x17, 0x37, 0x2A, 0x5F, 0x0B, 0x56, 0x22, + 0x9A, 0xF4, 0x3D, 0x12, 0x92, 0xE0, 0x87, 0xF9, 0x96, 0xDB, 0x80, 0xF2, + 0x65, 0xF1, 0xAC, 0x03, 0x6C, 0x14, 0xB1, 0x17, 0x21, 0x2B, 0xD9, 0x23, + 0x72, 0x22, 0xE3, 0x1B, 0x0D, 0x17, 0xDA, 0x08, 0xE4, 0x1D, 0xBC, 0x05, + 0xD7, 0x1C, 0xFA, 0x0A, 0xA9, 0x23, 0xC1, 0x26, 0x1E, 0x37, 0x31, 0x4B, + 0x45, 0x31, 0x9A, 0x37, 0xA3, 0x1E, 0xC1, 0x06, 0x74, 0x29, 0x14, 0x04, + 0x1B, 0x39, 0xD0, 0x20, 0xDC, 0x2C, 0x87, 0x2C, 0x9D, 0x35, 0xCF, 0x32, + 0x1E, 0x48, 0x93, 0x32, 0x78, 0x3C, 0x04, 0x2B, 0xB6, 0x29, 0x9C, 0x2F, + 0x8E, 0x20, 0x82, 0x32, 0xEB, 0x1B, 0x47, 0x2B, 0xE6, 0x0C, 0x02, 0x1E, + 0x63, 0xEE, 0x4D, 0xF7, 0xE9, 0xE1, 0xD5, 0xE3, 0x00, 0xFF, 0x36, 0x0B, + 0xA9, 0x10, 0x40, 0x2A, 0x6B, 0x04, 0xAE, 0x2D, 0xFF, 0x03, 0x3C, 0x38, + 0x3A, 0xFE, 0x68, 0x36, 0x2B, 0xEC, 0x21, 0x2A, 0x7C, 0xFE, 0x73, 0x37, + 0xF4, 0x22, 0xF2, 0x3F, 0xAE, 0x31, 0x7D, 0x36, 0x93, 0x27, 0x38, 0x30, + 0x79, 0x0A, 0x14, 0x1B, 0x8C, 0xF0, 0xC6, 0xFC, 0x11, 0xF9, 0x4A, 0x01, + 0xA3, 0x12, 0xCF, 0x09, 0x16, 0x1B, 0xB0, 0xF5, 0x8A, 0x0E, 0x01, 0xDC, + 0xD6, 0xEC, 0x04, 0xC0, 0x02, 0xE3, 0xDB, 0xC0, 0x32, 0xE7, 0xF8, 0xCD, + 0x56, 0xE4, 0xA5, 0xD3, 0x61, 0xF7, 0xBD, 0xE5, 0x9D, 0x09, 0xE4, 0xF1, + 0x80, 0xF4, 0x47, 0xDD, 0x5D, 0xE6, 0xEC, 0xD2, 0x01, 0xF7, 0x56, 0xEB, + 0xE9, 0x13, 0x68, 0x0E, 0xF0, 0x22, 0xB4, 0x1F, 0xA9, 0x09, 0xA4, 0x0F, + 0xFB, 0xE2, 0x95, 0xF7, 0xAD, 0xEB, 0x18, 0x02, 0xB7, 0x11, 0xE9, 0x12, + 0x2A, 0x09, 0xA1, 0xF5, 0x99, 0xF7, 0x17, 0xEC, 0x0E, 0xE9, 0x66, 0xFF, + 0x88, 0xD1, 0xC1, 0xFB, 0x61, 0xC6, 0xB4, 0xE8, 0x34, 0xC8, 0x74, 0xE7, + 0xD9, 0xD4, 0x6B, 0xF1, 0xC0, 0xD1, 0x6B, 0xDE, 0xF0, 0xBE, 0xA8, 0xBA, + 0xC0, 0xC5, 0xFA, 0xB4, 0x3F, 0xE1, 0x69, 0xCB, 0x59, 0xDE, 0x48, 0xD7, + 0x57, 0xDC, 0xB9, 0xE2, 0xA8, 0xEE, 0x36, 0xE3, 0xAB, 0xE7, 0x19, 0xD1, + 0xDD, 0xDC, 0x1D, 0xDA, 0x73, 0xFB, 0xE2, 0x0A, 0x46, 0x11, 0xE8, 0x24, + 0xE7, 0x0C, 0x42, 0x19, 0x19, 0x0A, 0x56, 0x14, 0xB0, 0xF4, 0x4A, 0x08, + 0x6E, 0xE2, 0x91, 0xF0, 0x1D, 0xF1, 0x1C, 0xEB, 0xD6, 0xF4, 0x9E, 0xEF, + 0xAA, 0xDE, 0xAF, 0xF4, 0x9F, 0xC9, 0x07, 0xE8, 0x28, 0xBA, 0xBE, 0xC6, + 0x29, 0xB4, 0x0F, 0xBA, 0x9C, 0xB3, 0x70, 0xCE, 0xBC, 0xD1, 0xA5, 0xFB, + 0x66, 0x05, 0x07, 0x0F, 0xFA, 0x21, 0xDB, 0xF8, 0xCA, 0x18, 0xC9, 0xDB, + 0xAE, 0x07, 0x61, 0xD1, 0x82, 0x05, 0xED, 0xE4, 0x06, 0x1A, 0x38, 0x0A, + 0x53, 0x24, 0x74, 0x11, 0x7C, 0x0A, 0xF3, 0xED, 0xC4, 0xFB, 0xA7, 0xD9, + 0xC9, 0x1C, 0x39, 0xF2, 0xC2, 0x21, 0x31, 0xF8, 0xEF, 0x05, 0x73, 0xF2, + 0x7B, 0x13, 0xAF, 0x08, 0xD5, 0x18, 0x19, 0x04, 0x45, 0xFF, 0x75, 0xEB, + 0x4E, 0xEE, 0x7D, 0xED, 0xE8, 0xEF, 0xAD, 0x06, 0xFF, 0xE9, 0x2B, 0x0B, + 0x53, 0xDD, 0xBD, 0xF9, 0xB0, 0xCF, 0x57, 0xE1, 0x47, 0xC8, 0x83, 0xD0, + 0x1C, 0xD3, 0xFF, 0xDE, 0xB9, 0xE8, 0x51, 0xF9, 0xAD, 0xF8, 0x66, 0x08, + 0xEE, 0xF4, 0x35, 0x12, 0x80, 0xE1, 0xAE, 0x19, 0x45, 0xDC, 0xB1, 0x10, + 0xEA, 0xF3, 0x50, 0x07, 0x69, 0x0C, 0x37, 0x0B, 0x08, 0x14, 0x7B, 0x03, + 0x29, 0x0A, 0xDF, 0xF0, 0x25, 0xEF, 0x75, 0xDE, 0x0D, 0xED, 0xE6, 0xDC, + 0xED, 0xFD, 0x87, 0xE1, 0x41, 0x00, 0x9B, 0xD9, 0x8D, 0x01, 0x8C, 0xD0, + 0xED, 0xF9, 0x96, 0xC9, 0xBE, 0xE1, 0x32, 0xCA, 0xB5, 0xC6, 0xFD, 0xC8, + 0x6E, 0xDB, 0x94, 0xE2, 0xA3, 0x03, 0x57, 0x02, 0xD3, 0x12, 0x8D, 0xFA, + 0xE0, 0x0F, 0x07, 0xEF, 0x86, 0xEE, 0xF2, 0xE7, 0xBF, 0xCB, 0xD5, 0xDC, + 0x9F, 0xE1, 0xA3, 0xF7, 0xA7, 0x0D, 0x19, 0x20, 0x14, 0x02, 0x64, 0x0C, + 0xBB, 0xE2, 0xE9, 0xE4, 0xE7, 0xF2, 0x76, 0xF8, 0xA4, 0x00, 0x5B, 0x10, + 0x87, 0xF4, 0x33, 0x09, 0x75, 0x05, 0x07, 0x18, 0x09, 0x1F, 0xE3, 0x16, + 0x93, 0x11, 0x3D, 0xE7, 0x1F, 0xF4, 0x90, 0xCE, 0x2B, 0xDD, 0x04, 0xDE, + 0x8B, 0xC7, 0x37, 0xE4, 0x3C, 0xBD, 0x44, 0xCF, 0x71, 0xB7, 0xE7, 0xAD, + 0xFD, 0xB6, 0x55, 0x9C, 0xDC, 0xC7, 0xED, 0xAB, 0xCC, 0xE2, 0x14, 0xCD, + 0x98, 0xF2, 0x76, 0xE0, 0x89, 0xEB, 0x11, 0xE2, 0x1E, 0xE9, 0x28, 0xE2, + 0xD9, 0xF2, 0xF8, 0xE1, 0x66, 0x00, 0xAF, 0xF0, 0x44, 0x07, 0x6A, 0x08, + 0x46, 0xFA, 0x2F, 0x0C, 0x2B, 0xEC, 0x0F, 0x05, 0x90, 0xDF, 0x13, 0xF6, + 0xB6, 0xD3, 0xB9, 0xDE, 0xAA, 0xD4, 0x55, 0xDD, 0x4E, 0xD4, 0xEC, 0xE9, + 0xB3, 0xD3, 0xDD, 0xE9, 0x42, 0xC7, 0xA1, 0xDA, 0x1B, 0xB2, 0xC9, 0xCB, + 0x30, 0xA0, 0x22, 0xB6, 0x09, 0xA0, 0x79, 0xAA, 0x7C, 0xC5, 0x72, 0xBE, + 0xB3, 0xE7, 0xBC, 0xC7, 0xB7, 0xF0, 0xD9, 0xBE, 0x59, 0xEF, 0x26, 0xB8, + 0xCD, 0xE9, 0x78, 0xAA, 0x5B, 0xF3, 0x20, 0xB3, 0x5C, 0x10, 0xB2, 0xE4, + 0x60, 0x11, 0x2F, 0xEF, 0x74, 0xF0, 0x74, 0xC8, 0x8A, 0xE7, 0xFB, 0xBF, + 0xEF, 0xFB, 0xCB, 0xDA, 0xF4, 0xF2, 0x49, 0xE3, 0xDA, 0xE9, 0xFA, 0xE8, + 0xAB, 0x01, 0x9C, 0x02, 0x8B, 0xFF, 0x75, 0x05, 0x10, 0xDA, 0x4E, 0xF2, + 0xF1, 0xC2, 0x9C, 0xEC, 0xE4, 0xC8, 0x86, 0xF4, 0xA7, 0xC8, 0xAD, 0xF1, + 0x7F, 0xBA, 0x0F, 0xDA, 0x9F, 0xB4, 0x8B, 0xCA, 0x95, 0xBE, 0x76, 0xD0, + 0x91, 0xC6, 0x0A, 0xDA, 0x1D, 0xCC, 0x1A, 0xEB, 0x96, 0xE4, 0xA4, 0x03, + 0x62, 0xF6, 0x5F, 0xFD, 0xDB, 0xFB, 0xFB, 0xE2, 0x96, 0x09, 0x59, 0xE2, + 0x94, 0x12, 0x67, 0xF5, 0x06, 0x00, 0xD0, 0xF1, 0xE1, 0xF3, 0xC3, 0xF1, + 0xF0, 0xFB, 0x13, 0xFB, 0xB6, 0xF4, 0x28, 0xE9, 0xFE, 0xFA, 0xE0, 0xEA, + 0x8D, 0x10, 0x6A, 0xFD, 0x07, 0x1D, 0x39, 0xF7, 0xC0, 0x1D, 0x64, 0xEC, + 0x66, 0x0A, 0x24, 0xF5, 0x58, 0xE1, 0xDD, 0xE4, 0xE3, 0xCF, 0x53, 0xCF, + 0x6E, 0xF0, 0x35, 0xF7, 0xF5, 0x09, 0xE5, 0x1B, 0xE4, 0x0A, 0xA9, 0x18, + 0x9A, 0x04, 0x2E, 0x13, 0x3F, 0xFA, 0xEA, 0x01, 0x20, 0x07, 0xF0, 0x02, + 0xD3, 0x26, 0x0F, 0x3A, 0x84, 0x27, 0x52, 0x5B, 0x7E, 0x16, 0x40, 0x3A, + 0x39, 0x22, 0x13, 0x29, 0x66, 0x28, 0xD0, 0x30, 0xFB, 0x1A, 0xF7, 0x25, + 0x32, 0x27, 0x64, 0x2C, 0x75, 0x4A, 0x11, 0x3D, 0xFA, 0x4C, 0xA7, 0x1F, + 0xBF, 0x37, 0x89, 0x01, 0x15, 0x2A, 0x20, 0x09, 0x22, 0x27, 0xDD, 0x15, + 0x96, 0x23, 0x50, 0x0F, 0xD7, 0x09, 0x18, 0xFB, 0xA4, 0xF3, 0xD2, 0xF1, + 0x5C, 0x03, 0xAE, 0xFC, 0xEC, 0x24, 0x51, 0x0E, 0xA8, 0x32, 0x80, 0x17, + 0xC9, 0x35, 0xA1, 0x31, 0xFB, 0x30, 0x70, 0x42, 0x7F, 0x23, 0xC1, 0x2F, + 0xB5, 0x28, 0xB2, 0x24, 0xEB, 0x3B, 0xB6, 0x37, 0x4A, 0x2F, 0xC9, 0x46, + 0x21, 0x1D, 0x7C, 0x4E, 0x9A, 0x1D, 0xBF, 0x4F, 0x60, 0x17, 0x8E, 0x38, + 0x05, 0x25, 0xA0, 0x32, 0xC2, 0x36, 0xB1, 0x2F, 0x24, 0x2D, 0xE4, 0x1A, + 0x9D, 0x0C, 0x68, 0x0E, 0x02, 0xF4, 0x49, 0x0F, 0x5E, 0xDD, 0x12, 0xF2, + 0xB7, 0xD9, 0x9B, 0xD6, 0xB5, 0x0A, 0xF3, 0xF7, 0x6C, 0x31, 0xE8, 0x19, + 0x70, 0x2F, 0xBE, 0x1C, 0xAD, 0x2C, 0xC8, 0x1D, 0xA7, 0x2D, 0x32, 0x0D, + 0x0E, 0x34, 0xE0, 0xFF, 0x78, 0x4C, 0xE4, 0x23, 0x69, 0x51, 0x6A, 0x3E, + 0x06, 0x37, 0x19, 0x32, 0x3C, 0x25, 0xE8, 0x2F, 0xFE, 0x37, 0x1B, 0x41, + 0x0C, 0x44, 0xA7, 0x3C, 0x9F, 0x38, 0xEC, 0x37, 0x6A, 0x3F, 0x69, 0x4F, + 0x20, 0x4C, 0x91, 0x55, 0xB0, 0x41, 0x0A, 0x41, 0xE5, 0x2F, 0x5C, 0x32, + 0x35, 0x24, 0x89, 0x2E, 0x60, 0x04, 0x51, 0x2B, 0xDC, 0xD9, 0x2E, 0x1C, + 0x46, 0xD9, 0xDF, 0x03, 0x60, 0xF9, 0xBE, 0xFB, 0x26, 0x0F, 0x15, 0x04, + 0x9E, 0x1A, 0x00, 0x11, 0x0C, 0x23, 0xFC, 0x21, 0x87, 0x1F, 0x14, 0x31, + 0x89, 0x25, 0x48, 0x35, 0x99, 0x3F, 0x18, 0x35, 0xB7, 0x51, 0x70, 0x36, + 0xF7, 0x4B, 0x62, 0x24, 0x05, 0x3D, 0x36, 0x16, 0x4B, 0x2C, 0x34, 0x23, + 0xFB, 0x23, 0x69, 0x30, 0xB3, 0x25, 0x4C, 0x23, 0x50, 0x24, 0xE6, 0x12, + 0x52, 0x17, 0xED, 0x09, 0x74, 0x05, 0xD3, 0xFD, 0xBF, 0xEF, 0xFD, 0xF7, + 0x6C, 0xCE, 0x7F, 0xE6, 0xF7, 0xD8, 0xA4, 0xE8, 0x6B, 0xF9, 0x70, 0x06, + 0xB8, 0x04, 0x63, 0x2A, 0x99, 0x05, 0xE0, 0x37, 0xC4, 0x07, 0xA8, 0x27, + 0x12, 0x07, 0x63, 0x0F, 0x07, 0x1D, 0xF8, 0x19, 0x40, 0x3D, 0x06, 0x41, + 0xCE, 0x2D, 0xCE, 0x3B, 0xBA, 0x18, 0x14, 0x1A, 0x07, 0x1D, 0x47, 0x13, + 0x41, 0x13, 0x0A, 0x1E, 0xA3, 0xFD, 0x16, 0x1B, 0xE9, 0x19, 0x86, 0x27, + 0xFD, 0x3E, 0x47, 0x33, 0xF0, 0x3D, 0x00, 0x28, 0x33, 0x31, 0x43, 0x1C, + 0xA6, 0x23, 0x64, 0x12, 0x8B, 0x14, 0x03, 0x08, 0xE9, 0xFA, 0x0A, 0xFD, + 0x01, 0xE2, 0xC0, 0xF0, 0xD8, 0xE1, 0x07, 0xE7, 0xAE, 0x03, 0x36, 0xF1, + 0xD4, 0x17, 0x8C, 0xFD, 0xCA, 0x10, 0x50, 0x02, 0x0D, 0x11, 0x72, 0x0F, + 0x61, 0x14, 0xE9, 0x14, 0x23, 0x0F, 0x87, 0x0B, 0x7E, 0x19, 0xD7, 0x22, + 0x10, 0x27, 0xC7, 0x40, 0x39, 0x1E, 0x93, 0x30, 0x26, 0x13, 0x61, 0x18, + 0xDC, 0x0E, 0x4A, 0x1B, 0x07, 0x03, 0x67, 0x1A, 0x5A, 0xF0, 0xE6, 0x06, + 0x45, 0xF7, 0xE2, 0x03, 0x99, 0xFD, 0xEE, 0xF8, 0xCE, 0xF4, 0x04, 0xEE, + 0xAE, 0xDC, 0xC9, 0xE4, 0xE4, 0xD0, 0x98, 0xD4, 0xA0, 0xED, 0x72, 0xE4, + 0x63, 0xF7, 0x04, 0x04, 0x63, 0xE8, 0xA0, 0x0A, 0xC8, 0xE3, 0x5F, 0xF4, + 0x2E, 0xE9, 0x7D, 0xE0, 0x82, 0xF7, 0x22, 0xDF, 0x45, 0x1B, 0x49, 0xFC, + 0x23, 0x2E, 0xFD, 0x1D, 0xF8, 0x13, 0x93, 0x11, 0x95, 0x09, 0x16, 0xFF, + 0xD4, 0x12, 0x91, 0x0B, 0x8A, 0xFD, 0x96, 0x0A, 0xBA, 0xF3, 0x48, 0x00, + 0xB6, 0x0A, 0x00, 0x18, 0x46, 0x08, 0x99, 0x29, 0x0F, 0xFC, 0x25, 0x20, + 0xD7, 0xF3, 0x17, 0x13, 0x61, 0xDD, 0x78, 0x02, 0xBE, 0xC6, 0x83, 0xED, + 0x4C, 0xBC, 0xEB, 0xDF, 0x4B, 0xA9, 0x02, 0xD4, 0x3B, 0xAD, 0x4F, 0xC8, + 0x57, 0xE0, 0x60, 0xCC, 0xDB, 0xF8, 0xED, 0xD0, 0x00, 0xEB, 0xC8, 0xD2, + 0xAB, 0xDD, 0xA6, 0xD9, 0xF1, 0xDA, 0xD0, 0xDE, 0x09, 0xEF, 0x9E, 0xE4, + 0x4C, 0x15, 0x9E, 0xF4, 0xDF, 0x1A, 0x09, 0xFA, 0x27, 0x0B, 0xE5, 0xF0, + 0x26, 0x07, 0xCF, 0xE5, 0xCE, 0x06, 0x79, 0xE9, 0xA9, 0xFE, 0xAF, 0xFD, + 0xBA, 0xFA, 0xB4, 0x05, 0x62, 0xF8, 0x75, 0xF3, 0x84, 0xEE, 0x52, 0xE4, + 0xB0, 0xDE, 0x58, 0xE6, 0xCE, 0xB2, 0x82, 0xD3, 0x5A, 0xB2, 0x25, 0xDB, + 0x9D, 0xE1, 0x4B, 0x00, 0x92, 0xF4, 0x0D, 0x10, 0x29, 0xEC, 0x40, 0x15, + 0xB3, 0xE0, 0xBF, 0x10, 0x64, 0xD7, 0x5D, 0xF5, 0x3D, 0xEF, 0x63, 0xF5, + 0xA1, 0x1E, 0x3B, 0x23, 0xAB, 0x1E, 0xF5, 0x2C, 0xC2, 0x09, 0x92, 0x0F, + 0x19, 0x1A, 0x40, 0x04, 0xD7, 0x26, 0x1E, 0xFD, 0xE5, 0x0E, 0x97, 0xEA, + 0x44, 0x12, 0xFF, 0x06, 0x35, 0x23, 0xFF, 0x30, 0xF3, 0x1A, 0xD3, 0x2F, + 0xA0, 0x0F, 0x91, 0x20, 0xA7, 0x04, 0x9E, 0x0E, 0xB1, 0x00, 0x92, 0x01, + 0x5F, 0x00, 0x75, 0xFA, 0xC3, 0xE4, 0x10, 0xEF, 0xD5, 0xCD, 0x7D, 0xE1, + 0x4E, 0xE4, 0x9A, 0xE3, 0xAB, 0xF4, 0x88, 0xF2, 0x17, 0xEF, 0x56, 0x07, + 0xA9, 0xF3, 0xF0, 0x19, 0x47, 0xFA, 0x64, 0x11, 0xD5, 0xF6, 0xBB, 0x01, + 0xDA, 0x0C, 0x07, 0x14, 0x65, 0x1C, 0x74, 0x23, 0x1B, 0x04, 0x3F, 0x14, + 0xCF, 0xFE, 0xE9, 0x09, 0x91, 0x08, 0xAE, 0x0B, 0x68, 0xF8, 0xD5, 0x08, + 0xD1, 0xFD, 0x63, 0x0A, 0xEC, 0x14, 0x4D, 0x05, 0x02, 0x0A, 0x2B, 0xEE, + 0x11, 0xF5, 0xDB, 0xDF, 0xA0, 0xD8, 0xD2, 0xBF, 0x7F, 0xD1, 0x4D, 0xB3, + 0x7B, 0xEA, 0x54, 0xD4, 0x28, 0xFF, 0x24, 0xE3, 0x3B, 0xFA, 0x45, 0xE7, + 0x13, 0xE8, 0x76, 0xF3, 0x47, 0xDC, 0x81, 0xE6, 0x32, 0xEC, 0x98, 0xE4, + 0xB6, 0x1B, 0xBF, 0x18, 0x40, 0x1E, 0x9A, 0x27, 0x84, 0x00, 0xF9, 0x01, + 0x64, 0x09, 0xD4, 0xFF, 0x3F, 0x0D, 0x74, 0x09, 0xB5, 0xED, 0xEE, 0xF6, + 0xBD, 0xEA, 0x30, 0x06, 0x2E, 0xFB, 0x4A, 0x1A, 0xE5, 0xF4, 0xAD, 0x01, + 0x7B, 0xEB, 0x74, 0xF5, 0xD6, 0xDA, 0x5B, 0xE4, 0x68, 0xD3, 0x97, 0xCD, + 0x5A, 0xE3, 0x3D, 0xCC, 0x47, 0xD6, 0x88, 0xBE, 0xF9, 0xB3, 0xC1, 0xA9, + 0x0F, 0xB6, 0xE9, 0xB2, 0x8C, 0xC8, 0x2B, 0xBF, 0x16, 0xD9, 0xC8, 0xB9, + 0xB6, 0xEE, 0xA0, 0xC4, 0x4F, 0xE8, 0xEB, 0xC9, 0x29, 0xCC, 0x00, 0xC3, + 0x54, 0xD6, 0xDA, 0xD9, 0x74, 0xF1, 0xA0, 0xF9, 0x34, 0xE9, 0x03, 0xFB, + 0x72, 0xDF, 0x03, 0xFB, 0x37, 0xF2, 0x6C, 0xFF, 0x12, 0x00, 0x98, 0xF0, + 0xE2, 0xFB, 0xE7, 0xEF, 0xA7, 0xED, 0x21, 0xFC, 0xB9, 0xD6, 0xE0, 0xEE, + 0x00, 0xC2, 0xA0, 0xD6, 0x31, 0xAB, 0x64, 0xBB, 0x58, 0xA9, 0x89, 0xB8, + 0xAA, 0xC1, 0x50, 0xD3, 0x32, 0xDD, 0xE4, 0xE7, 0x10, 0xE7, 0x83, 0xEB, + 0x40, 0xDF, 0x7A, 0xE8, 0x01, 0xD7, 0x73, 0xE4, 0x8A, 0xF3, 0xE5, 0xE8, + 0xE8, 0x28, 0x4E, 0x06, 0xBF, 0x22, 0xF6, 0x08, 0x7B, 0xF5, 0x93, 0xEA, + 0xEE, 0xF0, 0xB3, 0xF8, 0xE1, 0x02, 0x84, 0x0E, 0x0E, 0xFE, 0x5C, 0xF4, + 0x7A, 0x10, 0x0D, 0xF7, 0x57, 0x33, 0x99, 0x19, 0xBC, 0x2A, 0xE0, 0x16, + 0x67, 0x1A, 0x20, 0x14, 0x95, 0x0F, 0x87, 0x1B, 0x5A, 0xFB, 0xD4, 0xFE, + 0xF8, 0x04, 0x1D, 0xE7, 0xF8, 0x10, 0x05, 0xEE, 0x11, 0xF3, 0x39, 0xDF, + 0x29, 0xDD, 0x3C, 0xDA, 0xED, 0xE5, 0x93, 0xEE, 0x1E, 0xF7, 0xBB, 0xE3, + 0xC8, 0x0F, 0x92, 0xE3, 0xB9, 0x1C, 0xD0, 0x01, 0x23, 0x07, 0x3A, 0x0F, + 0x97, 0x04, 0x5B, 0x17, 0xD5, 0x13, 0x6A, 0x21, 0xBA, 0x03, 0x58, 0x0E, + 0xAB, 0x00, 0x7E, 0xFB, 0xAA, 0x18, 0x51, 0x06, 0xBD, 0x1E, 0xF6, 0x04, + 0x8C, 0x21, 0x7F, 0x04, 0xF4, 0x19, 0x24, 0x0D, 0xAB, 0xFE, 0x91, 0xF9, + 0x54, 0xF0, 0x54, 0xD8, 0x68, 0xDE, 0x0E, 0xBD, 0x07, 0xD6, 0x0E, 0xC5, + 0x9D, 0xEA, 0x27, 0xF0, 0x36, 0x00, 0xA3, 0x07, 0x81, 0x05, 0x6E, 0x00, + 0x6F, 0x03, 0x0E, 0xF9, 0x4E, 0xF1, 0x58, 0xF3, 0xC3, 0xFE, 0x2F, 0x0A, + 0x7C, 0x2D, 0x46, 0x32, 0x90, 0x28, 0x0F, 0x2A, 0x42, 0x0C, 0xA1, 0x0D, + 0xA2, 0x19, 0x75, 0x1B, 0xB8, 0x0C, 0x80, 0x19, 0x7D, 0xE5, 0x19, 0xFC, + 0xBE, 0x05, 0x23, 0x14, 0x2E, 0x1C, 0xEB, 0x2E, 0xBA, 0x07, 0x7E, 0x20, + 0xAF, 0x0C, 0x5B, 0x0A, 0xE6, 0x0E, 0x49, 0xED, 0x4B, 0xFC, 0xF7, 0xCB, + 0xD2, 0xF5, 0x55, 0xC3, 0xE6, 0xF0, 0x1E, 0xC4, 0x49, 0xDA, 0xBC, 0xB7, + 0x5E, 0xD4, 0xAE, 0xB6, 0x79, 0xDD, 0x9E, 0xC4, 0xB1, 0xE6, 0x23, 0xD5, + 0x8B, 0xFA, 0xAE, 0xDC, 0x73, 0x00, 0x10, 0xD9, 0xED, 0xF7, 0xA2, 0xE5, + 0x51, 0x0A, 0xD9, 0xFC, 0xEB, 0x0F, 0x15, 0xF9, 0xDD, 0x03, 0x26, 0xF0, + 0xC9, 0x0D, 0x11, 0x04, 0x7E, 0x0E, 0xD0, 0x0B, 0xDB, 0xFB, 0xC4, 0xF4, + 0xC2, 0x00, 0x42, 0xFE, 0x08, 0xFA, 0x4D, 0x03, 0x60, 0xD6, 0xF6, 0xE6, + 0xD6, 0xC7, 0xC2, 0xCB, 0xD8, 0xC3, 0x05, 0xB7, 0x75, 0xBA, 0xED, 0xBB, + 0x4C, 0xC6, 0x1C, 0xDE, 0xBA, 0xD4, 0xDC, 0x01, 0xD8, 0xC6, 0xBB, 0x04, + 0xAA, 0xBE, 0xC9, 0xE8, 0xD8, 0xC0, 0x69, 0xD1, 0x32, 0xD6, 0xEC, 0xE4, + 0xFC, 0xFB, 0xD3, 0x08, 0x9E, 0x00, 0xD8, 0xFC, 0xA4, 0xF1, 0x6B, 0xE1, + 0x4C, 0xF9, 0x85, 0xE9, 0x55, 0xF1, 0x9D, 0xDB, 0xF6, 0xDD, 0x43, 0xCF, + 0x6F, 0xF2, 0x80, 0xF6, 0xAA, 0xFE, 0x58, 0x0A, 0xCA, 0xF8, 0x18, 0x00, + 0xED, 0x06, 0x5B, 0xEF, 0xFF, 0x08, 0x8A, 0xCE, 0xBC, 0xF0, 0x3A, 0xC1, + 0x1F, 0xD8, 0x4E, 0xD0, 0xFF, 0xBC, 0x01, 0xC3, 0x1C, 0xB1, 0x55, 0xB4, + 0x21, 0xC8, 0x37, 0xD2, 0xCD, 0xD9, 0x2F, 0xE8, 0x73, 0xE4, 0x08, 0xEA, + 0x0C, 0xEF, 0xC9, 0xF0, 0xE1, 0xDB, 0x9C, 0xE4, 0xEE, 0xCD, 0xFD, 0xE0, + 0x7D, 0xE9, 0x90, 0x00, 0x0A, 0xFD, 0x9B, 0x07, 0xB6, 0x02, 0x10, 0xF8, + 0xBB, 0x1B, 0x67, 0xFC, 0x42, 0x22, 0xC2, 0xF8, 0xD1, 0x04, 0x39, 0xE7, + 0xE7, 0xF8, 0xDC, 0xE6, 0xA8, 0xF4, 0x44, 0xD9, 0x72, 0xEA, 0x4A, 0xCB, + 0x50, 0xD8, 0x3F, 0xBC, 0xE5, 0xC3, 0x63, 0xAA, 0x0D, 0xCE, 0x7B, 0xBE, + 0xBA, 0xEA, 0xC8, 0xF1, 0x0F, 0xED, 0x12, 0x0F, 0xD0, 0xE2, 0x36, 0x12, + 0xC0, 0xE8, 0xE9, 0x10, 0x91, 0xFD, 0xD5, 0x08, 0x43, 0x22, 0x9F, 0x22, + 0x51, 0x2C, 0x60, 0x3D, 0xE8, 0x1B, 0x94, 0x2F, 0xAA, 0x1D, 0xB1, 0x36, + 0x49, 0x1B, 0x13, 0x49, 0x30, 0xF9, 0x85, 0x33, 0x35, 0xF5, 0xC7, 0x2F, + 0xD0, 0x11, 0x71, 0x47, 0x50, 0x18, 0xF1, 0x46, 0xB9, 0x21, 0x66, 0x3C, + 0xB5, 0x20, 0x16, 0x28, 0xA7, 0x13, 0x94, 0x09, 0x1F, 0x1B, 0x26, 0xFC, + 0x90, 0x08, 0x12, 0xED, 0x6F, 0xE3, 0x1A, 0xD6, 0x9C, 0xF6, 0x8E, 0xE9, + 0x19, 0x19, 0xAC, 0xFA, 0x8F, 0x26, 0x64, 0xF3, 0xE7, 0x3B, 0x00, 0x0A, + 0x55, 0x37, 0xC0, 0x16, 0xA4, 0x1E, 0x3F, 0x08, 0xFF, 0x37, 0x26, 0x22, + 0x16, 0x4F, 0x65, 0x42, 0x72, 0x35, 0x4A, 0x35, 0xA2, 0x3C, 0x1D, 0x2D, + 0x54, 0x5D, 0x82, 0x33, 0x56, 0x49, 0x2E, 0x29, 0x8A, 0x26, 0x98, 0x2B, + 0xFC, 0x14, 0x32, 0x40, 0x6D, 0x0E, 0x73, 0x42, 0x70, 0x09, 0xA9, 0x26, + 0x57, 0xED, 0x30, 0xFB, 0x48, 0xE7, 0x2B, 0xFF, 0x50, 0x02, 0x66, 0x26, + 0x60, 0x1C, 0xED, 0x3B, 0x48, 0x27, 0x2C, 0x45, 0xE1, 0x1E, 0x6C, 0x3C, + 0xC8, 0x0D, 0x57, 0x1B, 0x41, 0x22, 0x99, 0x1C, 0x56, 0x45, 0xDD, 0x39, + 0x49, 0x33, 0xE5, 0x29, 0xB7, 0x25, 0x06, 0x24, 0x76, 0x3C, 0xB9, 0x45, + 0x15, 0x2A, 0x2E, 0x34, 0x01, 0x14, 0x7C, 0x13, 0xF6, 0x3C, 0x34, 0x31, + 0x0F, 0x4D, 0xA5, 0x4C, 0x6D, 0x4B, 0x4B, 0x58, 0xA7, 0x54, 0x79, 0x60, + 0xB8, 0x35, 0x7A, 0x3C, 0x46, 0x21, 0x19, 0x16, 0x12, 0x29, 0x73, 0x11, + 0x95, 0x14, 0x5D, 0x08, 0xA8, 0xFC, 0x70, 0x0E, 0x90, 0x0C, 0x3F, 0x28, + 0xF1, 0x1A, 0x8A, 0x2A, 0x5F, 0x23, 0xCD, 0x29, 0x8D, 0x3A, 0xDD, 0x31, + 0x10, 0x32, 0x9C, 0x2A, 0xE1, 0x23, 0x0A, 0x31, 0x3D, 0x35, 0x3B, 0x46, + 0x72, 0x2E, 0xFE, 0x37, 0x92, 0x1E, 0x79, 0x29, 0xDD, 0x2E, 0xAB, 0x34, + 0xA9, 0x3B, 0xFF, 0x2A, 0x8B, 0x3B, 0x2D, 0x1C, 0x62, 0x42, 0x0D, 0x2D, + 0xE6, 0x35, 0x3D, 0x2B, 0x51, 0x1B, 0x6A, 0x14, 0x79, 0x06, 0x30, 0xFC, + 0x50, 0xF7, 0x00, 0xDD, 0xD6, 0xFB, 0xC9, 0xE0, 0xD0, 0x1C, 0x52, 0x0C, + 0x6C, 0x31, 0x8D, 0x2E, 0x21, 0x2A, 0xBE, 0x32, 0x09, 0x1B, 0xA8, 0x29, + 0x56, 0x11, 0xF8, 0x26, 0x2C, 0x29, 0xE0, 0x3E, 0x37, 0x40, 0xB9, 0x57, + 0x8B, 0x2F, 0xD6, 0x42, 0x01, 0x28, 0xF3, 0x34, 0x45, 0x33, 0xF3, 0x45, + 0x99, 0x16, 0x80, 0x33, 0x99, 0x00, 0x48, 0x21, 0x74, 0x1B, 0x10, 0x41, + 0xD5, 0x22, 0xB6, 0x56, 0x7C, 0x25, 0xA0, 0x4E, 0x0C, 0x32, 0x5F, 0x3A, + 0xEE, 0x13, 0x93, 0x15, 0xD9, 0xEA, 0xAC, 0xFB, 0xD3, 0xE6, 0x82, 0xF2, + 0x7E, 0xEB, 0x49, 0xE1, 0x16, 0xF9, 0x0F, 0xE2, 0xD2, 0x16, 0x34, 0xFA, + 0xDC, 0x1B, 0x12, 0x02, 0x00, 0x25, 0xAD, 0x06, 0xA5, 0x2F, 0xFB, 0x01, + 0xA9, 0x1C, 0x93, 0xF1, 0xAF, 0x2A, 0xC7, 0x0F, 0xC6, 0x44, 0x96, 0x2C, + 0x76, 0x29, 0x37, 0x0C, 0x5D, 0x16, 0x7A, 0x02, 0x8B, 0x27, 0x92, 0x23, + 0x09, 0x1B, 0x1F, 0x1C, 0x4A, 0x16, 0x22, 0x13, 0xBB, 0x30, 0xC1, 0x24, + 0x95, 0x23, 0x35, 0x16, 0x3D, 0x02, 0x03, 0x03, 0x35, 0xEE, 0x1C, 0xFF, + 0xD3, 0xD7, 0xEC, 0xF8, 0xEA, 0xD5, 0x71, 0x00, 0xAF, 0xEB, 0x8B, 0x1D, + 0xEE, 0xEB, 0x63, 0x2A, 0x6C, 0xDA, 0x61, 0x14, 0xDE, 0xC8, 0x52, 0xF7, + 0xB7, 0xDB, 0x12, 0xFC, 0xD0, 0x11, 0x39, 0x1E, 0x43, 0x1C, 0x33, 0x12, + 0x5E, 0x02, 0x78, 0xE8, 0x02, 0x05, 0xF5, 0xF6, 0xBE, 0x05, 0xB8, 0x02, + 0xAB, 0xEF, 0x08, 0xEB, 0x76, 0x05, 0xA7, 0xFF, 0x90, 0x20, 0xDC, 0x28, + 0x98, 0x0F, 0xF4, 0x2D, 0x29, 0x0A, 0xB4, 0x19, 0x28, 0xFC, 0x31, 0xF9, + 0x84, 0xD3, 0x37, 0xDF, 0xED, 0xBA, 0xAB, 0xDD, 0x9E, 0xB1, 0x31, 0xDA, + 0x92, 0xB3, 0x24, 0xC9, 0xCC, 0xC9, 0xE8, 0xCC, 0xCE, 0xE2, 0x50, 0xDC, + 0xE4, 0xEB, 0x76, 0xE8, 0x29, 0xED, 0x8D, 0xF2, 0xFF, 0xE2, 0x94, 0xE3, + 0xD8, 0xDB, 0xE7, 0xDC, 0xF2, 0xEE, 0x75, 0xF8, 0xF7, 0xF8, 0x02, 0xFC, + 0x65, 0xF5, 0x7A, 0xE4, 0xB3, 0xFB, 0x72, 0xE0, 0x0E, 0xEE, 0x67, 0xE0, + 0xB8, 0xD1, 0x45, 0xDB, 0xC3, 0xD1, 0x25, 0xEB, 0xE6, 0xD2, 0xA4, 0xDE, + 0xC0, 0xE0, 0xD7, 0xBB, 0x11, 0xE4, 0x1A, 0xA7, 0xAC, 0xC6, 0x58, 0x9B, + 0x2F, 0xC0, 0x1F, 0xAC, 0xF0, 0xD5, 0x3F, 0xCE, 0x9F, 0xD9, 0xED, 0xD6, + 0xBB, 0xC7, 0xDC, 0xCA, 0x2E, 0xC1, 0x99, 0xC1, 0xA2, 0xC8, 0xE8, 0xC4, + 0x7C, 0xF5, 0xF9, 0xE8, 0x47, 0x19, 0x88, 0x06, 0x03, 0x09, 0xD0, 0xFD, + 0x5B, 0xF8, 0x7F, 0xFA, 0xFF, 0xF5, 0x73, 0x08, 0xEC, 0xDE, 0x0E, 0xFA, + 0x1D, 0xDA, 0x42, 0xFD, 0xF2, 0xF8, 0x8C, 0x1E, 0xA1, 0xFF, 0xB9, 0x1E, + 0x22, 0x01, 0xE3, 0x11, 0x13, 0xF6, 0x1E, 0xFE, 0xE2, 0xC6, 0x0B, 0xE0, + 0x02, 0xAF, 0xE5, 0xD9, 0x91, 0xBA, 0x73, 0xD8, 0xDF, 0xC4, 0x27, 0xBD, + 0x05, 0xD7, 0x72, 0xBD, 0x65, 0xF7, 0xA1, 0xDC, 0x55, 0x05, 0x61, 0xE1, + 0x00, 0x0D, 0x92, 0xE7, 0xD0, 0x17, 0xA7, 0xF3, 0x34, 0x0D, 0x71, 0xEA, + 0x91, 0x0A, 0x35, 0xF4, 0x75, 0x15, 0xF9, 0xFD, 0x60, 0x0E, 0xF8, 0xE6, + 0x33, 0x07, 0x3E, 0xE1, 0x7A, 0x0D, 0x55, 0xF8, 0x91, 0x05, 0x95, 0xFF, + 0xD1, 0x01, 0x05, 0x08, 0xCB, 0x0A, 0xB9, 0x1D, 0x3F, 0x06, 0xD4, 0x14, + 0x78, 0xF0, 0x4B, 0xFF, 0x1D, 0xD4, 0x37, 0xF1, 0x2E, 0xCC, 0x7F, 0xE6, + 0xF5, 0xE4, 0xF6, 0xF4, 0x2F, 0x05, 0x52, 0x04, 0x8C, 0xF6, 0x56, 0xFC, + 0xD1, 0xD4, 0xD7, 0xFC, 0x8A, 0xC5, 0x11, 0xFC, 0xB6, 0xDB, 0xCB, 0x06, + 0x5A, 0x11, 0x49, 0x21, 0xA8, 0x25, 0xFF, 0x19, 0x90, 0x1B, 0x03, 0x03, + 0xAE, 0x1B, 0x94, 0x12, 0x8D, 0x17, 0x8C, 0x20, 0xFB, 0x00, 0xC3, 0x0B, + 0x04, 0x0E, 0xC0, 0x1C, 0x27, 0x34, 0xF4, 0x39, 0xDA, 0x34, 0x1B, 0x2D, + 0x2F, 0x1D, 0xF0, 0x1F, 0x25, 0xFD, 0x7D, 0x11, 0x6C, 0xDE, 0x84, 0xF9, + 0x6C, 0xE2, 0xF4, 0xE9, 0x3C, 0xEF, 0x65, 0xCD, 0xD6, 0xEE, 0x6E, 0xC0, + 0x02, 0xFE, 0x48, 0xEA, 0x06, 0x03, 0x70, 0x06, 0xF2, 0x03, 0x57, 0x02, + 0xB1, 0x14, 0xB3, 0x08, 0x01, 0x05, 0xB4, 0xFB, 0xD4, 0xF1, 0x92, 0xF3, + 0x83, 0x03, 0x2C, 0x13, 0xE1, 0xFF, 0xD7, 0x0E, 0x74, 0xE2, 0x12, 0xE9, + 0x70, 0xEB, 0x17, 0xF4, 0xAB, 0xF3, 0x83, 0xFA, 0x94, 0xF0, 0x12, 0xE2, + 0xB9, 0x0B, 0xD4, 0xEA, 0x6E, 0x06, 0xE1, 0xEA, 0x67, 0xE5, 0xEF, 0xD3, + 0x41, 0xCC, 0xAE, 0xB9, 0x2C, 0xB4, 0x07, 0xA0, 0x90, 0xBA, 0x04, 0xAE, + 0xB3, 0xD8, 0xB5, 0xD5, 0x07, 0xDB, 0xE6, 0xE2, 0x04, 0xD3, 0xA3, 0xD6, + 0x70, 0xD2, 0x03, 0xBE, 0x4B, 0xCD, 0x4E, 0xBE, 0x3A, 0xE2, 0x8A, 0xF4, + 0x10, 0xF6, 0xF4, 0x11, 0xE2, 0xE0, 0x0B, 0xF0, 0x52, 0xE0, 0x54, 0xE4, + 0x6F, 0xF6, 0x9C, 0xF9, 0x8F, 0xE0, 0x7C, 0xEC, 0x04, 0xD8, 0x65, 0xEC, + 0x52, 0xFC, 0xBA, 0x15, 0xC9, 0x01, 0x09, 0x25, 0x87, 0xF5, 0x07, 0x21, + 0x92, 0xF0, 0x6E, 0x0D, 0x4B, 0xD7, 0x6D, 0xE4, 0xA2, 0xCD, 0x0B, 0xDC, + 0x9B, 0xD7, 0x8D, 0xE4, 0xC1, 0xCA, 0xF2, 0xCF, 0xD1, 0xD2, 0x7F, 0xC5, + 0xF3, 0xF0, 0x6F, 0xCC, 0x3C, 0xF3, 0x4F, 0xC7, 0xDF, 0xFA, 0x05, 0xDB, + 0xD6, 0x0C, 0x15, 0xFD, 0xB6, 0x03, 0x79, 0xF9, 0x6C, 0x12, 0x6E, 0x04, + 0x3D, 0x3B, 0xB0, 0x1E, 0x17, 0x2F, 0x40, 0x01, 0x60, 0x1C, 0xAE, 0xF3, + 0xD3, 0x26, 0x40, 0x17, 0xB0, 0x10, 0x30, 0x10, 0x04, 0x10, 0xA3, 0x06, + 0x2A, 0x32, 0xE4, 0x14, 0xB7, 0x2D, 0xE3, 0x09, 0x95, 0x15, 0x13, 0xFD, + 0x70, 0xF8, 0xBA, 0xF2, 0x4C, 0xE2, 0x2E, 0xE9, 0x99, 0xF0, 0xB6, 0xFD, + 0xEC, 0x07, 0x34, 0x25, 0x2B, 0x01, 0x84, 0x29, 0x61, 0xF3, 0x11, 0x0E, + 0x90, 0xFA, 0x01, 0xF4, 0x2C, 0x20, 0x29, 0xFD, 0xBB, 0x47, 0x35, 0x29, + 0x0C, 0x3A, 0xAF, 0x32, 0x06, 0x15, 0x74, 0x1C, 0x46, 0x1C, 0xA8, 0x2B, + 0xCB, 0x29, 0xA2, 0x36, 0x58, 0x25, 0x8B, 0x23, 0x16, 0x41, 0x4E, 0x39, + 0x8B, 0x5B, 0x0F, 0x57, 0x9B, 0x59, 0x5E, 0x52, 0x75, 0x4A, 0xF9, 0x43, + 0xB0, 0x23, 0x0F, 0x2A, 0x4B, 0xFF, 0xD0, 0x0B, 0x6D, 0xF8, 0x8F, 0x0B, + 0xB9, 0xF1, 0x54, 0x10, 0x68, 0xE6, 0xEA, 0xFA, 0x88, 0xF6, 0x6F, 0xFA, + 0x06, 0x16, 0xC9, 0x0B, 0xF3, 0x28, 0xCD, 0x10, 0x18, 0x2F, 0x61, 0x25, + 0xB8, 0x1B, 0xFC, 0x2E, 0xB1, 0x11, 0x72, 0x2B, 0xFD, 0x33, 0xD7, 0x42, + 0xB2, 0x48, 0x3F, 0x46, 0xB2, 0x3B, 0x95, 0x23, 0x57, 0x31, 0x2B, 0x14, + 0x5B, 0x1F, 0xE5, 0x11, 0xE6, 0x07, 0xE4, 0x04, 0x6C, 0x08, 0xB3, 0x03, + 0x40, 0x0A, 0xF6, 0xF5, 0x49, 0x11, 0x81, 0xDD, 0xAC, 0x0C, 0x0A, 0xCC, + 0x58, 0xF1, 0xA6, 0xC7, 0xF4, 0xEB, 0xD6, 0xDC, 0x8B, 0x01, 0x80, 0xFE, + 0xC2, 0x05, 0xA2, 0x09, 0x99, 0xF6, 0xC2, 0xFF, 0x79, 0xEE, 0x83, 0xFC, + 0xEC, 0xF3, 0x62, 0x02, 0xE4, 0x15, 0xA8, 0x18, 0xDA, 0x2E, 0xD0, 0x27, + 0xC4, 0x18, 0x6B, 0x11, 0x07, 0x05, 0x69, 0x04, 0x96, 0x08, 0x9D, 0x14, + 0xA1, 0xF7, 0x0C, 0x0A, 0x18, 0xF6, 0x42, 0x07, 0xB6, 0x15, 0xE0, 0x22, + 0xF9, 0x25, 0x4E, 0x2C, 0x46, 0x19, 0x1C, 0x1F, 0x72, 0xF9, 0xBB, 0x0B, + 0xD4, 0xDB, 0x53, 0xF9, 0x7F, 0xCD, 0x04, 0xE8, 0x08, 0xD0, 0x04, 0xDB, + 0x0F, 0xC7, 0x60, 0xC1, 0x03, 0xC3, 0xB8, 0xB5, 0x17, 0xD7, 0xF7, 0xC4, + 0x02, 0xE7, 0x78, 0xD4, 0x9A, 0xF4, 0x8F, 0xED, 0x9C, 0xF5, 0xA7, 0xFB, + 0xAD, 0xE5, 0xFE, 0xEF, 0x8A, 0xF2, 0x92, 0xF6, 0x16, 0x05, 0x81, 0x06, + 0xED, 0xF2, 0x9D, 0x01, 0x27, 0xF2, 0xDE, 0x05, 0x14, 0x04, 0x33, 0x09, + 0xCE, 0xF1, 0x4D, 0xE7, 0xB9, 0xE9, 0x48, 0xE1, 0x62, 0xE8, 0xAD, 0xF3, + 0x36, 0xCB, 0x1E, 0xD8, 0xE3, 0xBF, 0x5C, 0xB3, 0x2A, 0xC1, 0x92, 0x9D, + 0xC5, 0xC2, 0x45, 0xA0, 0x04, 0xDF, 0xCF, 0xD4, 0x9D, 0xF8, 0x3A, 0x01, + 0x8E, 0xE0, 0x13, 0xEE, 0x81, 0xC3, 0x8C, 0xDA, 0x59, 0xBB, 0x51, 0xE0, + 0x8D, 0xC9, 0xF4, 0xF1, 0x6D, 0xF0, 0xBE, 0x06, 0xB1, 0xF8, 0x77, 0xEC, + 0x44, 0xE4, 0x8B, 0xC6, 0x56, 0xEE, 0x3F, 0xE0, 0x5D, 0xF5, 0x65, 0xF9, + 0xE2, 0xE9, 0x6F, 0xEB, 0xC2, 0x11, 0xAE, 0x08, 0x7F, 0x33, 0x4A, 0x2B, + 0x49, 0x22, 0x8C, 0x24, 0xC4, 0x0D, 0xBA, 0x1B, 0x37, 0xF2, 0x27, 0x0E, + 0xDB, 0xD6, 0x85, 0xFA, 0x20, 0xD3, 0x2F, 0xF0, 0x87, 0xD0, 0x99, 0xDB, + 0x1F, 0xCB, 0xB3, 0xC3, 0x3E, 0xE1, 0x9C, 0xE2, 0x2A, 0xE5, 0x3D, 0x01, + 0x10, 0xE0, 0x85, 0xFB, 0x1E, 0xFC, 0x41, 0x06, 0xF7, 0x07, 0x81, 0x0B, + 0xEB, 0x03, 0x3C, 0x0C, 0x60, 0x13, 0xA9, 0x2C, 0x20, 0x15, 0x80, 0x30, + 0x7A, 0x06, 0x29, 0x0C, 0xEF, 0x10, 0x78, 0x0F, 0x8D, 0x0D, 0xB0, 0x0F, + 0x93, 0xF9, 0xCF, 0xF1, 0xB6, 0x0D, 0xAE, 0xFA, 0xC5, 0x15, 0x4D, 0xFD, + 0xE3, 0xFA, 0x5E, 0xE4, 0x25, 0xDF, 0x8D, 0xD4, 0x48, 0xD4, 0xC7, 0xCB, + 0x42, 0xE3, 0x80, 0xD0, 0x94, 0x03, 0x2C, 0xF8, 0x13, 0x16, 0x9E, 0x1E, + 0xAD, 0x0F, 0xA2, 0x19, 0xA2, 0x05, 0xB0, 0x0C, 0x56, 0x00, 0x21, 0x14, + 0xD8, 0x0C, 0xBF, 0x2D, 0x80, 0x12, 0x1A, 0x39, 0xB8, 0x0A, 0x02, 0x25, + 0xA6, 0x1D, 0x2D, 0x1B, 0x36, 0x2F, 0x96, 0x25, 0x36, 0x0F, 0x21, 0x0E, + 0xF5, 0x0D, 0x4D, 0x09, 0x88, 0x3B, 0xB7, 0x37, 0x90, 0x4A, 0xAB, 0x4C, + 0x52, 0x40, 0xD1, 0x47, 0x9B, 0x25, 0x19, 0x3D, 0x47, 0x04, 0x46, 0x23, + 0x78, 0xF6, 0x75, 0x0B, 0xDF, 0xF5, 0x0F, 0xFD, 0x48, 0xF0, 0x2A, 0xE5, + 0x65, 0xFB, 0xBF, 0xE7, 0x1E, 0x12, 0x20, 0x07, 0x3B, 0x1B, 0x69, 0x0E, + 0xA8, 0x2C, 0x59, 0x0B, 0x7D, 0x3E, 0x47, 0x0C, 0x33, 0x3A, 0x3E, 0x0C, + 0x8D, 0x41, 0x3D, 0x2C, 0x81, 0x4C, 0x7C, 0x4F, 0x49, 0x37, 0xC5, 0x3B, + 0x8F, 0x2E, 0x6C, 0x25, 0xA8, 0x30, 0x30, 0x29, 0xB9, 0x16, 0x99, 0x24, + 0x75, 0x13, 0x9E, 0x33, 0xC2, 0x20, 0x2F, 0x43, 0xF2, 0x1C, 0x0B, 0x30, + 0xBC, 0x14, 0x04, 0x14, 0x76, 0x06, 0x84, 0x00, 0x1C, 0xF9, 0xB8, 0xFC, + 0xEB, 0xFB, 0xBF, 0x13, 0x3E, 0x09, 0xFC, 0x35, 0xA0, 0x08, 0x75, 0x38, + 0xDC, 0x09, 0x07, 0x29, 0x1C, 0x15, 0x67, 0x14, 0xB4, 0x2C, 0x17, 0x0E, + 0x7C, 0x42, 0xE6, 0x21, 0xA7, 0x2F, 0x79, 0x1D, 0xE0, 0x20, 0xBF, 0x1A, + 0xA5, 0x3A, 0xD0, 0x3C, 0x45, 0x3A, 0x36, 0x34, 0x40, 0x26, 0x0F, 0x11, + 0xE1, 0x3C, 0x61, 0x29, 0xFE, 0x58, 0x67, 0x4D, 0xE3, 0x50, 0x9E, 0x4F, + 0x68, 0x34, 0xAC, 0x47, 0x2C, 0x17, 0x3D, 0x36, 0xDE, 0x02, 0x7C, 0x21, + 0x2B, 0xF9, 0x76, 0x20, 0x4B, 0xF5, 0xA5, 0x28, 0xDF, 0xF6, 0xF8, 0x2A, + 0xDD, 0x02, 0xB3, 0x2E, 0x64, 0x16, 0xEE, 0x2B, 0x98, 0x2B, 0x46, 0x26, + 0xC4, 0x2D, 0x8D, 0x25, 0x36, 0x1C, 0x83, 0x1C, 0x78, 0x24, 0x63, 0x22, + 0x3A, 0x37, 0x1D, 0x38, 0x33, 0x2C, 0xBB, 0x34, 0x70, 0x1D, 0x4B, 0x24, + 0x82, 0x21, 0xA3, 0x23, 0x9B, 0x18, 0xD5, 0x0D, 0x21, 0x11, 0x46, 0xF9, + 0x22, 0x12, 0x5D, 0x02, 0x84, 0x12, 0x88, 0x07, 0xD6, 0x15, 0x0D, 0xFA, + 0xFF, 0x08, 0xA7, 0xDF, 0x80, 0xFA, 0xBD, 0xCF, 0xC3, 0xF9, 0xFE, 0xDB, + 0xAB, 0x05, 0x0D, 0x04, 0x3B, 0x0B, 0xD7, 0x16, 0xDD, 0x06, 0x4A, 0x0D, + 0x07, 0xF7, 0xAC, 0x00, 0xD3, 0xFD, 0xEF, 0x06, 0xD0, 0x22, 0x1F, 0x22, + 0xAA, 0x22, 0xBE, 0x27, 0x13, 0x0B, 0x8F, 0x18, 0xF5, 0x16, 0x2D, 0x22, + 0x7E, 0x1C, 0x86, 0x29, 0xF6, 0x0F, 0x65, 0x13, 0xB4, 0x20, 0x31, 0x11, + 0x08, 0x2B, 0xF8, 0x24, 0x96, 0x22, 0x7E, 0x31, 0xA9, 0x14, 0x0E, 0x2B, + 0xC8, 0xF6, 0xDB, 0x19, 0xCF, 0xE4, 0x4D, 0x08, 0x74, 0xED, 0xD7, 0xF0, + 0xA6, 0xE5, 0x74, 0xCE, 0x48, 0xD7, 0xF6, 0xBB, 0xF7, 0xE2, 0xD2, 0xCC, + 0x61, 0xE3, 0xB1, 0xDC, 0xEE, 0xEB, 0x83, 0xE9, 0xA4, 0x10, 0xD0, 0xFB, + 0x37, 0x06, 0x22, 0xEB, 0xDF, 0xF4, 0xDA, 0xDF, 0x63, 0x17, 0xF0, 0xFB, + 0x7B, 0x1E, 0xEC, 0x01, 0x85, 0x00, 0x63, 0xF0, 0xBF, 0x06, 0x6E, 0xFF, + 0x38, 0x08, 0xC6, 0x07, 0x71, 0xEC, 0xEE, 0xF1, 0xDE, 0xE4, 0x80, 0xF2, + 0x3B, 0xD9, 0x59, 0xFA, 0x20, 0xC8, 0x33, 0xF3, 0x76, 0xB4, 0x4C, 0xD2, + 0xC1, 0xAA, 0x7C, 0xB8, 0xF8, 0xB8, 0xFA, 0xBC, 0xF6, 0xC7, 0x0A, 0xD0, + 0xDB, 0xCA, 0xF1, 0xEA, 0x2C, 0xD0, 0x92, 0xFC, 0x25, 0xCD, 0x3A, 0xE9, + 0x88, 0xBB, 0x25, 0xC7, 0xBE, 0xD0, 0xF3, 0xD1, 0x4B, 0xEB, 0x9D, 0xDA, + 0xB1, 0xDD, 0x38, 0xBB, 0x1A, 0xEB, 0xF2, 0xBB, 0x07, 0x07, 0xF1, 0xD6, + 0xD5, 0xEB, 0x82, 0xCD, 0x7E, 0xE4, 0xD4, 0xCA, 0x54, 0x13, 0xF0, 0xE4, + 0x67, 0x24, 0x12, 0xF6, 0xDE, 0x0A, 0xCA, 0xF9, 0xB5, 0xE6, 0x82, 0xEA, + 0x79, 0xC7, 0x8D, 0xD2, 0x33, 0xBC, 0x05, 0xC9, 0xE5, 0xB4, 0x7A, 0xB9, + 0x20, 0xA4, 0xA3, 0x9D, 0xB3, 0xB1, 0x3B, 0xAA, 0x7E, 0xCB, 0xF7, 0xCE, + 0x5B, 0xCC, 0x93, 0xDE, 0xB1, 0xD4, 0x6B, 0xEE, 0x81, 0xDC, 0x1E, 0xED, + 0x92, 0xD9, 0x10, 0xD5, 0x1B, 0xE9, 0xE7, 0xDD, 0xC2, 0xF4, 0xA5, 0xFC, + 0xF5, 0xE3, 0x58, 0x02, 0x20, 0xD6, 0x0B, 0xFA, 0x75, 0xD3, 0x8F, 0xE1, + 0x34, 0xD3, 0x33, 0xB7, 0x26, 0xE9, 0x9A, 0xB7, 0x1D, 0xF3, 0xBF, 0xD2, + 0x5F, 0xE3, 0xB1, 0xD8, 0x76, 0xCA, 0x45, 0xC7, 0x4C, 0xA7, 0xBD, 0xAA, + 0xA8, 0xA0, 0x69, 0xA7, 0x18, 0xC4, 0x92, 0xC1, 0x01, 0xE8, 0xB2, 0xD8, + 0x55, 0xFD, 0x31, 0xE7, 0xFF, 0x0B, 0x15, 0xF7, 0x2C, 0xFE, 0xAD, 0xF1, + 0x0F, 0xF8, 0xA8, 0xF5, 0x84, 0x09, 0xA5, 0x11, 0x88, 0xF6, 0xEE, 0x06, + 0x38, 0xE1, 0xD9, 0xF2, 0x13, 0x00, 0xD4, 0x15, 0x8B, 0x05, 0xE2, 0x1F, + 0xEA, 0xED, 0x3E, 0xF8, 0x0D, 0x0B, 0x1A, 0xFC, 0xA6, 0x2B, 0xD8, 0x18, + 0xD6, 0x25, 0x98, 0x2A, 0xC4, 0x12, 0x94, 0x37, 0x8E, 0xFC, 0xDF, 0x24, + 0x9A, 0xF8, 0x8C, 0x02, 0xA8, 0xF1, 0x1F, 0xE8, 0x13, 0xD9, 0x5D, 0xCD, + 0x7E, 0xE0, 0x5B, 0xC7, 0x02, 0xFE, 0x85, 0xDC, 0x14, 0x05, 0xF2, 0xEB, + 0x76, 0x12, 0x58, 0xF5, 0xA0, 0x2C, 0x47, 0xFF, 0x7C, 0x2E, 0x22, 0xFA, + 0xAE, 0x2E, 0xFA, 0xFC, 0x19, 0x39, 0xF2, 0x18, 0x8B, 0x2A, 0x17, 0x27, + 0xAF, 0x1A, 0x9A, 0x23, 0x91, 0x1E, 0xB5, 0x28, 0x70, 0x0B, 0x38, 0x21, + 0x9D, 0xFC, 0x12, 0x19, 0x9E, 0x0E, 0x77, 0x23, 0x19, 0x1C, 0xFB, 0x25, + 0x89, 0x1F, 0x20, 0x18, 0x00, 0x03, 0xEC, 0xEE, 0x68, 0xDB, 0x19, 0xD4, + 0x5C, 0xD8, 0x68, 0xEA, 0xB1, 0xE8, 0x7A, 0x0D, 0x6F, 0xF0, 0x6C, 0x1F, + 0x4E, 0xF2, 0x74, 0x1E, 0xFD, 0xEA, 0xBA, 0x06, 0x29, 0xEE, 0xE4, 0xF5, + 0x02, 0x0C, 0xE3, 0x05, 0x1A, 0x13, 0x51, 0x0B, 0xCB, 0xFA, 0xC8, 0xF8, + 0x08, 0x02, 0x27, 0x06, 0xF2, 0x0D, 0xA2, 0x15, 0x55, 0xFD, 0x7C, 0xF5, + 0x48, 0x1B, 0x9E, 0xF0, 0xB3, 0x3C, 0x34, 0x02, 0xF0, 0x30, 0x2A, 0x05, + 0x71, 0x22, 0x28, 0x08, 0x2D, 0x08, 0x25, 0xF7, 0x18, 0xEE, 0x65, 0xDE, + 0xAA, 0xE8, 0x17, 0xD5, 0x41, 0xDB, 0xD6, 0xCB, 0x87, 0xC8, 0xDC, 0xBE, + 0x55, 0xCC, 0xAF, 0xC6, 0xD8, 0xD1, 0x3A, 0xE2, 0x31, 0xC8, 0x2C, 0xEE, + 0x80, 0xCD, 0x48, 0xE5, 0x65, 0xD4, 0xA7, 0xD3, 0xD9, 0xD3, 0x46, 0xD3, + 0x6C, 0xF7, 0x96, 0x04, 0x31, 0x0C, 0x2E, 0x24, 0x8B, 0xEF, 0xC7, 0x0B, + 0x82, 0xE1, 0xD0, 0xFB, 0x3A, 0xE6, 0xDD, 0xFA, 0x64, 0xE6, 0xD5, 0xF3, + 0xA7, 0xEE, 0x70, 0xF9, 0xBC, 0xED, 0xEE, 0xF6, 0xC9, 0xF0, 0x11, 0xE8, + 0xAE, 0xE8, 0x36, 0xC9, 0x94, 0xC7, 0xEB, 0xA3, 0x13, 0xBE, 0x99, 0xA2, + 0xBD, 0xD1, 0xCD, 0xC5, 0xBC, 0xE6, 0x63, 0xEE, 0x95, 0xF2, 0x50, 0x00, + 0x09, 0xEA, 0x83, 0xF5, 0x8D, 0xD9, 0x64, 0xE2, 0x1C, 0xF7, 0x2A, 0xF0, + 0xB7, 0x21, 0x5E, 0x16, 0x7F, 0x17, 0x7C, 0x23, 0xC6, 0x10, 0xD1, 0x24, + 0xDC, 0x28, 0x5C, 0x2E, 0x1E, 0x16, 0x14, 0x17, 0x78, 0x0A, 0xFF, 0x06, + 0x1D, 0x27, 0x7D, 0x20, 0x80, 0x30, 0xD3, 0x3D, 0x8D, 0x31, 0x86, 0x4F, + 0x7A, 0x27, 0x0D, 0x42, 0xAD, 0x07, 0x3D, 0x1B, 0x7C, 0xFB, 0xBA, 0xFD, + 0x2F, 0x08, 0x74, 0xF3, 0x51, 0xFE, 0x03, 0xE5, 0x06, 0xF9, 0xE8, 0xDD, + 0x20, 0x0C, 0x75, 0xEA, 0x08, 0x0F, 0xEF, 0xF1, 0x28, 0x1A, 0x39, 0xFF, + 0x2F, 0x27, 0x8B, 0x05, 0xE8, 0x16, 0xE6, 0xF6, 0xD7, 0x1F, 0xA1, 0x03, + 0x41, 0x40, 0x67, 0x22, 0x8E, 0x3E, 0x37, 0x20, 0x90, 0x35, 0x3F, 0x13, + 0x6E, 0x3C, 0xAE, 0x1B, 0x86, 0x31, 0x41, 0x20, 0x44, 0x27, 0x8A, 0x29, + 0xFF, 0x20, 0x0E, 0x39, 0x78, 0x08, 0x56, 0x2E, 0xFC, 0xF8, 0xD5, 0x14, + 0x84, 0xE8, 0x47, 0xFC, 0x76, 0xDC, 0x1D, 0xF1, 0x4B, 0xFB, 0x6A, 0xFF, + 0xC0, 0x1E, 0x90, 0x1D, 0xCE, 0x17, 0xA7, 0x30, 0x5E, 0x09, 0xBF, 0x2E, + 0x76, 0xFF, 0x02, 0x1E, 0x68, 0x00, 0xF5, 0x1F, 0x03, 0x23, 0xFC, 0x39, + 0x6B, 0x34, 0xB5, 0x3D, 0x3B, 0x1A, 0x19, 0x22, 0xE1, 0x24, 0xA3, 0x20, + 0x98, 0x3C, 0x86, 0x26, 0x08, 0x26, 0x30, 0x16, 0x6B, 0x2B, 0x45, 0x28, + 0xA8, 0x42, 0xD8, 0x43, 0x3C, 0x3F, 0x75, 0x42, 0x55, 0x38, 0x1B, 0x29, + 0x22, 0x2E, 0x30, 0x04, 0xEA, 0x14, 0x97, 0xEC, 0x22, 0x05, 0xCE, 0xEE, + 0x3D, 0xFE, 0x46, 0xF0, 0x20, 0xFF, 0x0D, 0xF6, 0x2F, 0x12, 0xE6, 0x06, + 0x69, 0x17, 0xA6, 0x03, 0x49, 0x13, 0x4C, 0x02, 0x69, 0x18, 0xC0, 0x10, + 0xBE, 0x13, 0x2E, 0x12, 0x64, 0x08, 0xBB, 0x13, 0x35, 0x09, 0xC5, 0x24, + 0x34, 0x05, 0x78, 0x21, 0x0B, 0xF5, 0x71, 0x08, 0x25, 0xF6, 0x84, 0x03, + 0x22, 0xFE, 0xE1, 0x07, 0xB2, 0x01, 0x59, 0x03, 0xB8, 0x17, 0x19, 0x0C, + 0x9E, 0x19, 0x32, 0xFF, 0x9C, 0x05, 0xFB, 0xE5, 0xB8, 0xDD, 0x50, 0xCA, + 0x79, 0xB5, 0xC8, 0xB7, 0x2D, 0xC0, 0x89, 0xCC, 0x45, 0xEC, 0x91, 0xEA, + 0x69, 0x0A, 0x19, 0xF5, 0x6C, 0x09, 0x14, 0xF1, 0x07, 0xF2, 0x7B, 0xE7, + 0x21, 0xDF, 0x15, 0xEA, 0x8C, 0xEA, 0x96, 0x0F, 0xD7, 0xFF, 0x59, 0x32, + 0xEE, 0xF9, 0xBB, 0x27, 0x7B, 0xE9, 0x6D, 0x11, 0x8A, 0xF2, 0xDF, 0x13, + 0x06, 0xEB, 0x31, 0xFB, 0xBE, 0xE8, 0x8D, 0xEF, 0xF9, 0x05, 0x9B, 0x13, + 0xF0, 0x15, 0x2A, 0x26, 0x77, 0x08, 0x7F, 0x19, 0x3D, 0xE5, 0x7B, 0xF7, + 0x88, 0xDA, 0xB1, 0xDF, 0xF2, 0xE1, 0xC5, 0xD5, 0x12, 0xD5, 0xFA, 0xC6, + 0xFA, 0xC7, 0x85, 0xB8, 0x59, 0xD1, 0xB5, 0xBE, 0x44, 0xDA, 0x6F, 0xCB, + 0x09, 0xDA, 0x11, 0xCB, 0x39, 0xE8, 0x95, 0xD4, 0xD7, 0xF7, 0x7D, 0xE2, + 0x2D, 0xF2, 0xD5, 0xD9, 0x9E, 0xF5, 0x66, 0xE2, 0xBB, 0x02, 0x9F, 0xFE, + 0xB8, 0xF0, 0xBE, 0xE8, 0x98, 0xDE, 0xDA, 0xCD, 0xAB, 0xEA, 0xA6, 0xE4, + 0x20, 0xEF, 0x64, 0xEA, 0x91, 0x00, 0x93, 0xEA, 0xB2, 0x13, 0x38, 0xFD, + 0x66, 0x0C, 0x55, 0xF9, 0xD2, 0xF8, 0x1A, 0xDA, 0x33, 0xCE, 0xC3, 0xB3, + 0x1A, 0xB5, 0xBB, 0xB7, 0x6D, 0xBA, 0xB9, 0xDB, 0xDC, 0xC8, 0xC1, 0xFB, + 0x97, 0xD7, 0x53, 0x06, 0x57, 0xDB, 0x20, 0xF8, 0x27, 0xD0, 0x40, 0xE7, + 0x47, 0xDD, 0xAA, 0xF4, 0xD9, 0x05, 0x84, 0x1E, 0x04, 0x07, 0xF8, 0x28, + 0xF2, 0xEA, 0x62, 0x0C, 0xE5, 0xFD, 0xDA, 0x0F, 0x8F, 0x0E, 0xAE, 0x1C, + 0xD0, 0xF7, 0x1B, 0x05, 0x9F, 0x0B, 0x69, 0x08, 0xDA, 0x27, 0x36, 0x1B, + 0x6B, 0x1C, 0x70, 0x15, 0x21, 0x0A, 0xC9, 0x0B, 0x32, 0x02, 0x9F, 0x08, + 0x5C, 0xFC, 0x5B, 0xFE, 0x5E, 0xF8, 0xF4, 0xF3, 0xDB, 0xF7, 0xF7, 0xFD, + 0xBD, 0xE8, 0xC2, 0xF9, 0x4E, 0xDE, 0x8E, 0xEE, 0x64, 0xE4, 0x7A, 0xF7, + 0x37, 0xF3, 0xE7, 0x05, 0x39, 0x0C, 0xA8, 0x0E, 0xD8, 0x10, 0xB4, 0x04, + 0x88, 0x13, 0xA0, 0x0B, 0xC1, 0x28, 0xB1, 0x2E, 0x04, 0x23, 0x5F, 0x2B, + 0xD4, 0x1A, 0x9B, 0x0B, 0x6E, 0x30, 0x6D, 0x0D, 0x52, 0x33, 0x2E, 0x18, + 0xB5, 0x1B, 0xBB, 0x0D, 0x86, 0x17, 0xF6, 0x0F, 0x28, 0x0A, 0xE3, 0x0B, + 0x88, 0xFB, 0x9D, 0xF3, 0xB7, 0xF8, 0x50, 0xD7, 0xF9, 0xE8, 0x55, 0xCE, + 0xE0, 0xE2, 0x30, 0xE5, 0xEA, 0x00, 0x9D, 0x08, 0xEA, 0x1C, 0x58, 0x1B, + 0xFC, 0x14, 0x43, 0x17, 0x14, 0x0A, 0x3F, 0x15, 0xFE, 0x02, 0xB8, 0x1A, + 0x39, 0x20, 0x0F, 0x42, 0x08, 0x49, 0xAD, 0x61, 0xED, 0x41, 0xDD, 0x44, + 0x6C, 0x37, 0x19, 0x2C, 0x4B, 0x43, 0x6F, 0x35, 0xD9, 0x26, 0xA5, 0x28, + 0x8C, 0x06, 0x2C, 0x25, 0xEA, 0x1A, 0x07, 0x47, 0xF1, 0x27, 0x1B, 0x52, + 0x1F, 0x26, 0xB4, 0x4C, 0xBA, 0x23, 0x55, 0x42, 0xBD, 0x12, 0x80, 0x28, + 0x72, 0xFE, 0x2F, 0x13, 0x72, 0x03, 0x00, 0x0B, 0x0C, 0x0A, 0x24, 0xFE, + 0x86, 0xFE, 0x14, 0xF6, 0x04, 0xFC, 0x1D, 0xFF, 0xA5, 0x0B, 0x0E, 0x06, + 0xD0, 0x20, 0x7B, 0x0A, 0x3B, 0x2F, 0xEC, 0x0D, 0x6A, 0x2E, 0x5D, 0x06, + 0xB6, 0x30, 0x64, 0x13, 0x8C, 0x37, 0xDD, 0x2D, 0x36, 0x2E, 0x12, 0x26, + 0xAC, 0x2E, 0x80, 0x18, 0x53, 0x38, 0x98, 0x20, 0xFF, 0x2F, 0x71, 0x26, + 0x0E, 0x2A, 0xDA, 0x34, 0xF7, 0x1B, 0xE9, 0x37, 0x23, 0xFE, 0x2C, 0x1D, + 0x74, 0xE9, 0x97, 0xFB, 0x77, 0xD5, 0xB4, 0xD7, 0x11, 0xDA, 0xB6, 0xD8, + 0xD1, 0xF7, 0xC3, 0xFE, 0xA9, 0x0F, 0x92, 0x23, 0xEB, 0x14, 0x60, 0x33, + 0xA0, 0x0D, 0xD5, 0x31, 0x7E, 0xFE, 0xC9, 0x1D, 0xF1, 0x02, 0x43, 0x1B, + 0x68, 0x23, 0x45, 0x39, 0x34, 0x2B, 0x1B, 0x38, 0x42, 0x22, 0x29, 0x1B, + 0x05, 0x33, 0x0A, 0x19, 0x2E, 0x35, 0xAA, 0x0C, 0xDE, 0x1A, 0x86, 0xF2, + 0x08, 0x12, 0x6C, 0x0A, 0x02, 0x1C, 0xA2, 0x37, 0xFD, 0x2B, 0x24, 0x46, + 0x99, 0x2A, 0x7D, 0x2B, 0x6E, 0x18, 0xA1, 0x0C, 0xE0, 0x06, 0xC2, 0x02, + 0xAD, 0xF0, 0x7D, 0x01, 0x55, 0xE1, 0x9B, 0x01, 0xFE, 0xEC, 0x24, 0x0C, + 0x48, 0x01, 0x6A, 0x14, 0x68, 0x05, 0x61, 0x04, 0xE1, 0x0C, 0x58, 0xF7, + 0xE3, 0x1A, 0x2C, 0x06, 0xFB, 0x0D, 0xE0, 0x09, 0xCA, 0xFF, 0x70, 0xFE, + 0xA6, 0x08, 0x26, 0x0C, 0x67, 0xFE, 0x4F, 0x15, 0x81, 0xF4, 0xDF, 0x08, + 0xDE, 0x11, 0x11, 0x07, 0xF5, 0x25, 0x0C, 0x08, 0x26, 0x1F, 0x0C, 0xF8, + 0xB8, 0x1E, 0x7A, 0xEF, 0x58, 0x15, 0x59, 0xF0, 0x17, 0xFF, 0xD0, 0xE6, + 0x31, 0xDD, 0xCC, 0xC3, 0xD0, 0xBA, 0x79, 0xAA, 0x94, 0xBB, 0xC1, 0xBE, + 0xB6, 0xD4, 0x6C, 0xD8, 0xAE, 0xEA, 0xBC, 0xE4, 0x75, 0xFC, 0xA3, 0xF4, + 0xDC, 0xFA, 0x14, 0xF9, 0x56, 0xEF, 0xCD, 0xF9, 0x70, 0xFE, 0x26, 0x1A, + 0xBF, 0x0E, 0xDC, 0x31, 0xCB, 0xFF, 0x0F, 0x1C, 0x1D, 0xFE, 0x94, 0x0E, + 0xD2, 0x09, 0x36, 0x0F, 0x16, 0xF1, 0xCC, 0xF3, 0xE5, 0xE3, 0x82, 0xEE, + 0x66, 0xF8, 0x24, 0x0A, 0x65, 0x03, 0x52, 0x17, 0x0F, 0xFA, 0x95, 0x17, + 0x25, 0xE0, 0xE9, 0x05, 0x4E, 0xCF, 0xB6, 0xEF, 0x1E, 0xCB, 0x5C, 0xDE, + 0x20, 0xC6, 0x42, 0xCC, 0xA7, 0xC0, 0xC8, 0xB5, 0xDD, 0xC6, 0x8B, 0xAD, + 0x4F, 0xCA, 0x9F, 0xB2, 0x1B, 0xC7, 0xDC, 0xBA, 0xB2, 0xD6, 0x04, 0xCD, + 0x87, 0xED, 0xC2, 0xD3, 0x81, 0xFA, 0xB1, 0xC6, 0xD8, 0x09, 0x5C, 0xCC, + 0x79, 0x07, 0x3E, 0xE3, 0x2E, 0xED, 0x35, 0xE2, 0xA4, 0xE5, 0x28, 0xD8, + 0x6D, 0xEB, 0x60, 0xD5, 0x96, 0xEF, 0x87, 0xD6, 0xDC, 0xF9, 0x05, 0xD8, + 0x3A, 0xFA, 0xA4, 0xD7, 0x46, 0xEB, 0x7C, 0xDB, 0xEA, 0xCF, 0x85, 0xD1, + 0xF2, 0xAC, 0x2A, 0xB0, 0xE0, 0xA6, 0x61, 0xAA, 0x7C, 0xB8, 0x25, 0xC4, + 0x8D, 0xC7, 0x8E, 0xCE, 0xCE, 0xCA, 0x30, 0xC9, 0x09, 0xC4, 0xEE, 0xCA, + 0xAA, 0xBF, 0xEB, 0xC2, 0xB2, 0xDB, 0x33, 0xC2, 0xDA, 0xFD, 0x7B, 0xDE, + 0xC9, 0xF6, 0x03, 0xE7, 0x03, 0xE6, 0xF4, 0xD4, 0x07, 0xF3, 0x46, 0xE0, + 0xA7, 0xF0, 0xA9, 0xEA, 0xFD, 0xDC, 0xDD, 0xDA, 0xA4, 0xF1, 0x92, 0xE8, + 0x19, 0x06, 0xA5, 0xFC, 0x98, 0x04, 0xEB, 0xFE, 0x9B, 0xEF, 0x0F, 0xF5, + 0xDF, 0xD1, 0xAF, 0xE6, 0xF0, 0xCA, 0x36, 0xE2, 0xAE, 0xCC, 0x59, 0xDC, + 0x57, 0xCB, 0xD3, 0xD4, 0x08, 0xD1, 0xB5, 0xD1, 0x64, 0xD7, 0x0A, 0xDD, + 0x03, 0xCD, 0x0D, 0xED, 0xFD, 0xD2, 0x07, 0x00, 0x31, 0xEC, 0x72, 0x0D, + 0xBB, 0xF4, 0x35, 0xFE, 0x28, 0x03, 0x71, 0xF5, 0xF0, 0x16, 0x20, 0x0A, + 0x29, 0x0B, 0x71, 0x0D, 0xFF, 0xFC, 0x91, 0xF7, 0x47, 0x03, 0x32, 0xF2, + 0xC0, 0x07, 0x7A, 0xF3, 0x44, 0x16, 0xCC, 0xED, 0x02, 0x2B, 0x5B, 0xF1, + 0xD9, 0x18, 0x1E, 0xEE, 0xFB, 0xF4, 0xA8, 0xE0, 0x3D, 0xDE, 0x4E, 0xD0, + 0x28, 0xDB, 0x26, 0xC8, 0xCA, 0xF7, 0x02, 0xDB, 0x34, 0x18, 0x3A, 0xF9, + 0x74, 0x1F, 0x7F, 0x06, 0xFA, 0x15, 0x73, 0x05, 0x23, 0x01, 0x74, 0x01, + 0x07, 0xF6, 0x11, 0x0A, 0xD2, 0x1B, 0x36, 0x2E, 0x56, 0x43, 0x93, 0x49, + 0x68, 0x38, 0x6C, 0x40, 0xBF, 0x2B, 0x34, 0x36, 0x10, 0x2D, 0xCC, 0x37, + 0xBA, 0x0F, 0x59, 0x28, 0x12, 0x07, 0x55, 0x2C, 0x34, 0x26, 0x3B, 0x4D, + 0x59, 0x2E, 0x76, 0x5A, 0x17, 0x2C, 0x14, 0x54, 0x33, 0x24, 0x14, 0x3D, + 0xF1, 0x0B, 0xC7, 0x1F, 0x81, 0xF5, 0xA6, 0x04, 0xFC, 0xF4, 0x43, 0xEE, + 0x1D, 0xF0, 0x71, 0xD5, 0xFD, 0xE6, 0x49, 0xCF, 0xDF, 0xEC, 0x9A, 0xE3, + 0x88, 0xF9, 0xA5, 0xF4, 0x4B, 0x12, 0x8F, 0x06, 0x5C, 0x1D, 0x66, 0x08, + 0x24, 0x19, 0x26, 0xF9, 0xA2, 0x22, 0x18, 0xFE, 0x2A, 0x2B, 0x04, 0x0D, + 0xE0, 0x16, 0xD8, 0x00, 0xC2, 0x07, 0x77, 0xF3, 0xFC, 0x0C, 0xCA, 0xF6, + 0x71, 0x09, 0xF0, 0xF7, 0x9B, 0x06, 0xDC, 0x00, 0xC0, 0x07, 0x1D, 0x0A, + 0x54, 0xF2, 0x6B, 0xFC, 0x04, 0xD2, 0x39, 0xE1, 0x3E, 0xB8, 0x8F, 0xBE, + 0xFA, 0xB2, 0x7A, 0xB8, 0x96, 0xC6, 0xD2, 0xDC, 0x23, 0xDE, 0xC0, 0xF9, + 0x57, 0xE4, 0xCC, 0xF8, 0xBE, 0xD7, 0xB3, 0xEC, 0xBD, 0xBF, 0x2E, 0xD4, + 0x2F, 0xC8, 0xC0, 0xCE, 0x97, 0xFD, 0x4E, 0xEE, 0x78, 0x17, 0x60, 0xFB, + 0xD7, 0x06, 0x59, 0xF1, 0x34, 0x06, 0xE3, 0xFA, 0x41, 0x05, 0x9D, 0xFB, + 0x0E, 0xE9, 0x11, 0xE3, 0x97, 0xF0, 0xF3, 0xF1, 0x30, 0x12, 0x01, 0x15, + 0x98, 0x1C, 0xA3, 0x1F, 0x98, 0x11, 0x73, 0x13, 0x8D, 0x00, 0x4B, 0xF5, + 0xA2, 0xF5, 0xF3, 0xE0, 0xF6, 0xE5, 0x1C, 0xE1, 0x47, 0xD0, 0x9D, 0xDE, + 0x31, 0xCA, 0x9D, 0xDB, 0x58, 0xD3, 0x96, 0xE4, 0x9A, 0xDF, 0x88, 0xE7, + 0x17, 0xF7, 0x98, 0xF0, 0x9A, 0x06, 0x50, 0x0E, 0x30, 0xFB, 0x42, 0x1C, + 0x5A, 0xF4, 0xFD, 0x15, 0xA1, 0x0B, 0xCD, 0x2A, 0xCD, 0x1B, 0xCA, 0x38, + 0xB0, 0x1C, 0x18, 0x22, 0xE1, 0x26, 0x02, 0x1B, 0xC8, 0x24, 0xF6, 0x19, + 0xB1, 0x16, 0xB2, 0x01, 0xFA, 0x1E, 0xAC, 0x01, 0x53, 0x1D, 0x18, 0x0D, + 0x76, 0x09, 0xF0, 0x01, 0x96, 0xF3, 0x67, 0xE4, 0x69, 0xE3, 0xF9, 0xC3, + 0x93, 0xF2, 0xE7, 0xC2, 0x82, 0x0B, 0x34, 0xDF, 0x25, 0x24, 0x75, 0x08, + 0x7D, 0x2F, 0x5B, 0x14, 0xB6, 0x28, 0xE8, 0x04, 0x2A, 0x1A, 0xC0, 0xFA, + 0x74, 0x1D, 0x05, 0x0F, 0x91, 0x2D, 0xF8, 0x38, 0xED, 0x1E, 0xDC, 0x3E, + 0x15, 0x1C, 0x6E, 0x39, 0x4E, 0x33, 0xB5, 0x49, 0x9E, 0x23, 0xA4, 0x43, + 0x98, 0x0D, 0xB4, 0x34, 0x50, 0x2B, 0xA3, 0x4B, 0xF4, 0x43, 0x8C, 0x61, + 0xD6, 0x3B, 0x8E, 0x5C, 0x02, 0x29, 0xE0, 0x4A, 0xA1, 0x0E, 0xE3, 0x2C, + 0x4C, 0xFB, 0x3B, 0x08, 0xFF, 0xF7, 0x70, 0xF5, 0x29, 0xEE, 0x40, 0xF0, + 0x2F, 0xEE, 0xDB, 0xEF, 0xC3, 0x03, 0x4A, 0xF4, 0x69, 0x10, 0xB9, 0xF9, + 0x35, 0x25, 0x2A, 0x14, 0x45, 0x3E, 0x43, 0x2F, 0x7E, 0x3D, 0xCB, 0x24, + 0xF3, 0x42, 0xF7, 0x19, 0xE3, 0x4D, 0x9C, 0x2A, 0x77, 0x35, 0xC3, 0x29, + 0x8E, 0x23, 0xFE, 0x1E, 0x41, 0x32, 0xF2, 0x26, 0xE8, 0x38, 0x56, 0x24, + 0x14, 0x33, 0x5D, 0x1A, 0x7A, 0x30, 0xB2, 0x28, 0xC6, 0x1F, 0x06, 0x2B, + 0x91, 0x10, 0xE7, 0x1E, 0x6B, 0xF2, 0x2E, 0x0A, 0x5F, 0xDA, 0xD4, 0xF4, + 0x2D, 0xEF, 0x63, 0xF4, 0xC0, 0x06, 0x4C, 0x05, 0x18, 0x0A, 0x96, 0x1A, + 0x75, 0x08, 0x6E, 0x21, 0xCC, 0xFB, 0x1F, 0x11, 0x08, 0xE8, 0x1C, 0xFB, + 0xBD, 0x07, 0xF7, 0x15, 0xEC, 0x25, 0xB3, 0x34, 0x5D, 0x0C, 0xEA, 0x1F, + 0x41, 0x07, 0x97, 0x10, 0x68, 0x1B, 0xF3, 0x11, 0xBF, 0x0E, 0xEA, 0xFF, + 0x38, 0x0B, 0x49, 0xFD, 0xFA, 0x2B, 0x0A, 0x18, 0x5B, 0x3B, 0x81, 0x26, + 0xB1, 0x32, 0x66, 0x21, 0xAD, 0x1B, 0x94, 0x0A, 0x1E, 0xFE, 0xBB, 0xF3, + 0x9E, 0xE4, 0x17, 0xE4, 0x5C, 0xD9, 0xC2, 0xD0, 0x25, 0xDF, 0xDA, 0xC5, + 0x64, 0xE0, 0x6F, 0xCE, 0x34, 0xD9, 0xB1, 0xE1, 0x02, 0xE2, 0x6C, 0xFD, + 0xD4, 0xEC, 0x50, 0x13, 0xD9, 0xE8, 0x10, 0x12, 0xA9, 0xE8, 0x3C, 0x07, + 0x01, 0xF3, 0xD5, 0x0D, 0x5B, 0xEE, 0xEB, 0x12, 0xA8, 0xE3, 0xB4, 0x00, + 0x28, 0xEE, 0x86, 0xF2, 0xA7, 0xF3, 0xA4, 0xE8, 0x1C, 0xF2, 0x52, 0xDF, + 0xD3, 0xF4, 0x72, 0xE3, 0x2D, 0xED, 0x9D, 0xE6, 0xDA, 0xE4, 0x66, 0xD8, + 0x39, 0xE4, 0x66, 0xC4, 0x07, 0xCC, 0x2A, 0xA9, 0xEC, 0xBC, 0x24, 0x9F, + 0x67, 0xCF, 0x02, 0xAB, 0x57, 0xDB, 0x83, 0xB9, 0x31, 0xD8, 0x61, 0xCD, + 0x68, 0xCA, 0x17, 0xD3, 0x6E, 0xBA, 0xA6, 0xC5, 0x28, 0xD4, 0x85, 0xCD, + 0x31, 0x0F, 0x68, 0xF7, 0xCD, 0x1A, 0x36, 0x0C, 0x54, 0xFB, 0x3F, 0x01, + 0x6C, 0xF5, 0x23, 0x06, 0x93, 0xF6, 0x47, 0xFF, 0x9F, 0xE7, 0xB9, 0xE7, + 0x13, 0xEB, 0x49, 0xF8, 0x7C, 0xFD, 0x5C, 0x16, 0xAF, 0x09, 0x10, 0x19, + 0x7A, 0xFE, 0x30, 0x05, 0x2C, 0xDF, 0x98, 0xF0, 0x81, 0xBE, 0x9B, 0xE2, + 0x56, 0xA8, 0x21, 0xD8, 0x36, 0xA3, 0xDB, 0xCC, 0xBD, 0xA7, 0x55, 0xC1, + 0xD1, 0xBE, 0x05, 0xCE, 0x9E, 0xDE, 0x28, 0xD5, 0x7C, 0xF5, 0xC6, 0xD1, + 0x8E, 0xFF, 0x53, 0xE1, 0x04, 0xFA, 0xC2, 0xE5, 0x96, 0xF6, 0x03, 0xDF, + 0xAF, 0x07, 0x2A, 0xED, 0xAA, 0x0C, 0x27, 0xF7, 0xDE, 0x06, 0x69, 0xF4, + 0xB0, 0x07, 0xF7, 0xF7, 0xEC, 0x0A, 0x28, 0x02, 0x1E, 0x0A, 0x0B, 0xFE, + 0xC8, 0x02, 0x31, 0xFA, 0xD6, 0xF2, 0xAC, 0x06, 0xFF, 0xE0, 0x50, 0x0A, + 0xC4, 0xDD, 0x79, 0xFE, 0xE7, 0xCE, 0xF2, 0xE5, 0x81, 0xCB, 0x85, 0xE4, + 0xB0, 0xE0, 0x3F, 0xFC, 0xF3, 0xE4, 0x5F, 0x0C, 0x96, 0xDD, 0x21, 0x08, + 0x5B, 0xE1, 0x53, 0xFF, 0xCD, 0xDA, 0x45, 0xF5, 0xA4, 0xF6, 0x50, 0x03, + 0x7A, 0x32, 0x10, 0x22, 0x4D, 0x40, 0x61, 0x1D, 0xD6, 0x28, 0x17, 0x0A, + 0xAA, 0x1E, 0x5C, 0x18, 0xE1, 0x1A, 0x1D, 0x24, 0x58, 0x0B, 0x22, 0x0B, + 0x7E, 0x1E, 0xB5, 0x0A, 0x2C, 0x3F, 0x4E, 0x1D, 0x24, 0x40, 0x0A, 0x1D, + 0x9F, 0x29, 0x62, 0x0F, 0x7E, 0x14, 0xA9, 0xFE, 0x4F, 0x0F, 0x42, 0xF9, + 0x6E, 0x04, 0xD5, 0xFF, 0x41, 0xF6, 0x5A, 0x08, 0xE5, 0xFD, 0xDD, 0x0F, + 0xB5, 0x0F, 0x62, 0x13, 0xDA, 0x16, 0x77, 0x0D, 0x54, 0x20, 0x17, 0x14, + 0x91, 0x26, 0x1C, 0x23, 0x19, 0x1A, 0x60, 0x23, 0xA7, 0x11, 0x4C, 0x27, + 0x27, 0x1C, 0x4C, 0x34, 0xDA, 0x1E, 0xE4, 0x2B, 0x0A, 0x1F, 0x77, 0x19, + 0x72, 0x2A, 0x85, 0x1E, 0x28, 0x24, 0xDA, 0x2A, 0x49, 0x09, 0x3B, 0x1F, + 0x43, 0x0B, 0x6A, 0x1B, 0xC8, 0x16, 0x9E, 0x21, 0x7D, 0x0A, 0xE0, 0x12, + 0xE9, 0xF6, 0x8F, 0xEE, 0xB3, 0xEC, 0x9B, 0xD5, 0x29, 0xF3, 0x51, 0xE2, + 0x19, 0xFD, 0x7D, 0xF5, 0x02, 0x11, 0x84, 0x0B, 0xAD, 0x1D, 0x44, 0x16, + 0xCA, 0x08, 0x62, 0xFF, 0x52, 0xFA, 0x79, 0xF8, 0x5D, 0x17, 0x46, 0x26, + 0x17, 0x2F, 0x18, 0x44, 0x9D, 0x34, 0x7C, 0x33, 0xCA, 0x35, 0x82, 0x21, + 0xB0, 0x34, 0x2B, 0x25, 0x20, 0x23, 0xE1, 0x27, 0x97, 0x09, 0x42, 0x21, + 0xD2, 0x0C, 0xC4, 0x27, 0xA5, 0x1B, 0x5F, 0x33, 0xBB, 0x1F, 0x76, 0x35, + 0x05, 0x13, 0x0B, 0x20, 0xB0, 0x08, 0xC7, 0x05, 0x72, 0x05, 0x3E, 0xFF, + 0x5B, 0xFB, 0xAF, 0xF7, 0x45, 0xEE, 0xBB, 0xEC, 0x26, 0xEE, 0x51, 0xF8, + 0xF2, 0xFE, 0xBB, 0x0F, 0x53, 0x18, 0xB2, 0x1C, 0x9F, 0x2B, 0xE1, 0x1C, + 0xAD, 0x2F, 0xE1, 0x11, 0x9A, 0x24, 0xDB, 0x02, 0x03, 0x11, 0xB2, 0xFF, + 0x0D, 0x11, 0xDB, 0x08, 0x3F, 0x1E, 0xFC, 0x0B, 0xB8, 0x26, 0xB5, 0x08, + 0x6E, 0x2F, 0xEB, 0x08, 0xFE, 0x2E, 0x22, 0x0D, 0x3A, 0x21, 0xA8, 0x0F, + 0x1E, 0x21, 0x03, 0x1F, 0x27, 0x22, 0x6B, 0x30, 0x08, 0x0D, 0x02, 0x29, + 0x63, 0xEA, 0xA6, 0x00, 0xB8, 0xD6, 0xB8, 0xE2, 0x39, 0xDC, 0x24, 0xE7, + 0x45, 0xEA, 0xDB, 0xF2, 0xA8, 0xF7, 0x5D, 0x06, 0xBC, 0xF9, 0x86, 0x13, + 0x64, 0xE9, 0xC5, 0x02, 0x4F, 0xE4, 0x69, 0xFA, 0x03, 0x07, 0x29, 0x1E, + 0xA8, 0x25, 0x73, 0x32, 0x47, 0x20, 0x79, 0x19, 0xB6, 0x1A, 0xA4, 0x08, + 0x2B, 0x2A, 0xB1, 0x0F, 0x76, 0x19, 0x32, 0x04, 0xB2, 0xFA, 0x39, 0xEF, + 0x49, 0x0C, 0x3A, 0xFF, 0x01, 0x23, 0x06, 0x19, 0xF4, 0x19, 0x6E, 0x14, + 0x2E, 0x0C, 0x92, 0x00, 0x72, 0x07, 0xFB, 0xF5, 0x35, 0xFA, 0x46, 0xEB, + 0x70, 0xEF, 0xA5, 0xE1, 0x28, 0xE4, 0xE6, 0xDA, 0x2C, 0xD7, 0x9E, 0xDC, + 0x19, 0xDC, 0xFB, 0xEB, 0x49, 0xEB, 0xF4, 0xFC, 0x4F, 0xF2, 0x1C, 0x07, + 0x7F, 0xF0, 0x9F, 0xFA, 0xC6, 0xEB, 0xC1, 0xE1, 0x33, 0xF6, 0x56, 0xE4, + 0x08, 0x0D, 0x53, 0xFE, 0xF2, 0x11, 0x7D, 0x06, 0x7B, 0x0F, 0x4B, 0xFC, + 0x74, 0x04, 0x66, 0xF4, 0x21, 0xED, 0x5A, 0xEC, 0xAC, 0xE1, 0x1A, 0xEA, + 0x65, 0xE8, 0xDE, 0xF8, 0x32, 0xEC, 0xC1, 0xF4, 0x51, 0xE0, 0x41, 0xD9, + 0x22, 0xBC, 0x72, 0xB5, 0xBD, 0xA4, 0x4D, 0xA4, 0xCB, 0xB4, 0x92, 0xB0, + 0x5E, 0xCF, 0x62, 0xC2, 0x8B, 0xE6, 0xA1, 0xDA, 0x64, 0xF0, 0xA1, 0xE6, + 0xA0, 0xE4, 0xFC, 0xD5, 0x04, 0xE7, 0x03, 0xCD, 0xD6, 0x16, 0x8C, 0xF0, + 0xD2, 0x21, 0x5B, 0x02, 0x93, 0xF9, 0x2F, 0xEA, 0x6A, 0xF2, 0xAD, 0xEE, + 0xC0, 0xF1, 0x29, 0xFC, 0x43, 0xD1, 0x3A, 0xE6, 0x12, 0xCE, 0xF8, 0xE0, + 0x84, 0xF0, 0x4C, 0xF9, 0x99, 0xFF, 0xB1, 0x00, 0x4D, 0xF2, 0x03, 0xFA, + 0xD4, 0xD8, 0xAA, 0xEE, 0x34, 0xC3, 0x43, 0xE2, 0x69, 0xB8, 0x88, 0xD5, + 0x92, 0xBF, 0x8C, 0xC8, 0x28, 0xC1, 0x9D, 0xB3, 0x06, 0xC0, 0x3B, 0xA9, + 0x9F, 0xC9, 0x47, 0xB6, 0x17, 0xD7, 0xF7, 0xC0, 0xFB, 0xE1, 0xD4, 0xC1, + 0x10, 0xE4, 0x60, 0xC6, 0x8A, 0xE4, 0x06, 0xCB, 0x80, 0xF0, 0xEE, 0xD2, + 0x0C, 0x02, 0x1F, 0xE5, 0xE8, 0xFD, 0xB2, 0xE4, 0x91, 0xF4, 0x55, 0xE4, + 0xF5, 0xE8, 0xAC, 0xF5, 0xDA, 0xD2, 0xBF, 0xF8, 0x93, 0xD5, 0x1D, 0xF5, + 0x20, 0xEA, 0x36, 0x01, 0x5B, 0xE5, 0x27, 0xFE, 0x97, 0xD4, 0x9E, 0xE2, + 0x7B, 0xB9, 0xB1, 0xCC, 0x8F, 0xA5, 0x56, 0xCC, 0xA1, 0xB4, 0x3D, 0xD1, + 0xA7, 0xD1, 0x9B, 0xDE, 0xB0, 0xE4, 0x90, 0xEE, 0x0E, 0xE1, 0x13, 0xE1, + 0x67, 0xD8, 0x68, 0xD2, 0xFE, 0xE2, 0xB9, 0xE6, 0x97, 0x13, 0xEF, 0x16, + 0x8C, 0x31, 0x00, 0x27, 0x30, 0x18, 0x4E, 0x09, 0x85, 0x0E, 0x6E, 0xFA, + 0x04, 0x17, 0x0A, 0xFC, 0xEE, 0xFF, 0x75, 0xEA, 0x40, 0x00, 0xE1, 0xF1, + 0x8D, 0x2B, 0xAB, 0x25, 0x08, 0x36, 0xCB, 0x3B, 0x29, 0x27, 0x1F, 0x28, + 0x79, 0x1F, 0xB1, 0x15, 0x04, 0x17, 0x52, 0x0F, 0x01, 0x14, 0x61, 0x0A, + 0x51, 0x1F, 0x6A, 0x03, 0x8B, 0x12, 0x23, 0xF1, 0x34, 0xFF, 0x4B, 0xEE, + 0xC7, 0xFB, 0x1B, 0x00, 0xD4, 0xF3, 0x24, 0x08, 0xF8, 0xFD, 0x74, 0x10, + 0x03, 0x15, 0xC5, 0x24, 0x6F, 0x12, 0x54, 0x28, 0xCA, 0x0E, 0xDE, 0x1F, + 0x06, 0x29, 0x91, 0x2E, 0x06, 0x30, 0xC3, 0x30, 0x73, 0x21, 0x65, 0x20, + 0x1F, 0x23, 0x49, 0x28, 0x4A, 0x23, 0xF0, 0x26, 0xC5, 0x18, 0x75, 0x05, + 0xF2, 0x11, 0x07, 0xFA, 0x91, 0x06, 0xAC, 0xFB, 0x75, 0xFC, 0x9B, 0xEE, + 0x38, 0xE5, 0xD1, 0xD3, 0xB8, 0xD0, 0x6D, 0xCD, 0xF6, 0xE4, 0x16, 0xEA, + 0xD5, 0x01, 0xB1, 0x06, 0xCA, 0x09, 0x15, 0x0F, 0x33, 0x09, 0x3A, 0x08, + 0xFA, 0xF8, 0x0B, 0x01, 0xC9, 0xE3, 0x54, 0x04, 0x5E, 0xFF, 0x26, 0x22, + 0xE2, 0x21, 0x4C, 0x32, 0x57, 0x13, 0xBE, 0x1F, 0xF4, 0xFB, 0xC4, 0x15, + 0x4F, 0xFC, 0x70, 0x12, 0x89, 0xF4, 0xC5, 0xF2, 0x6F, 0xED, 0x12, 0xEC, + 0xCD, 0x0A, 0xD8, 0x14, 0x74, 0x1F, 0x16, 0x23, 0x3E, 0x0D, 0x9C, 0x09, + 0x28, 0xFB, 0x5F, 0xEF, 0x82, 0xFB, 0xC7, 0xE5, 0xC2, 0xF6, 0x11, 0xDC, + 0x81, 0xE3, 0xD8, 0xC7, 0x36, 0xCF, 0xD7, 0xB1, 0xAF, 0xCA, 0xC7, 0xB1, + 0xE9, 0xD0, 0xEE, 0xC0, 0x30, 0xE0, 0x35, 0xCD, 0x59, 0xF2, 0xF7, 0xDC, + 0x1B, 0xFB, 0x6A, 0xE7, 0xE3, 0xF9, 0x72, 0xE4, 0x57, 0x02, 0xDB, 0xF8, + 0xFE, 0x11, 0x58, 0x1C, 0x2E, 0x15, 0x33, 0x25, 0x44, 0x0F, 0xD1, 0x1D, + 0xB2, 0x13, 0x2C, 0x1D, 0xE4, 0x13, 0xAF, 0x13, 0xDD, 0xFA, 0x7C, 0xFB, + 0x95, 0xE8, 0x05, 0x00, 0x6E, 0xDB, 0x6D, 0x06, 0x02, 0xD1, 0x0E, 0xF0, + 0x27, 0xC1, 0xE2, 0xCB, 0x18, 0xBA, 0x31, 0xC1, 0x1F, 0xD1, 0xC4, 0xE3, + 0xE9, 0xEF, 0xF2, 0x0C, 0xC8, 0x05, 0x17, 0x1E, 0x53, 0x07, 0x7C, 0x1B, + 0xBF, 0xFE, 0xE3, 0x12, 0x0E, 0xFF, 0x20, 0x0A, 0x1B, 0x0F, 0x19, 0x13, + 0x6D, 0x1E, 0x75, 0x1C, 0xAC, 0x17, 0xF3, 0x0F, 0x24, 0x1B, 0x32, 0x13, + 0x23, 0x3A, 0xB6, 0x29, 0x8C, 0x36, 0x59, 0x1E, 0x23, 0x23, 0x91, 0x15, + 0x7E, 0x33, 0x5F, 0x35, 0xBC, 0x43, 0x08, 0x45, 0x19, 0x42, 0x9F, 0x3A, + 0xDC, 0x36, 0x40, 0x29, 0x0F, 0x2D, 0x1B, 0x18, 0x6A, 0x1B, 0x98, 0x0C, + 0x6F, 0xFD, 0x9F, 0xFD, 0xEE, 0xE2, 0xED, 0xEE, 0x11, 0xDC, 0xD4, 0xFB, + 0x16, 0xEE, 0x90, 0x16, 0x2A, 0x05, 0x97, 0x21, 0x1E, 0x1E, 0x1E, 0x29, + 0xCB, 0x39, 0xD1, 0x2C, 0x72, 0x38, 0x18, 0x21, 0x40, 0x2E, 0x03, 0x21, + 0x46, 0x34, 0x81, 0x2E, 0x45, 0x3A, 0x5B, 0x35, 0x73, 0x39, 0x5F, 0x33, + 0x2E, 0x33, 0x92, 0x27, 0xB4, 0x2B, 0xBB, 0x14, 0x70, 0x21, 0xF1, 0x02, + 0xBE, 0x27, 0x76, 0x04, 0x48, 0x2B, 0xAE, 0x0A, 0x75, 0x19, 0x65, 0x11, + 0x07, 0xF3, 0xFA, 0xFE, 0xD8, 0xDE, 0xC6, 0xE7, 0x27, 0xFF, 0xCC, 0xFE, + 0xEA, 0x24, 0xD9, 0x21, 0x42, 0x32, 0xE6, 0x3D, 0xA8, 0x2E, 0x4F, 0x43, + 0xD0, 0x22, 0x70, 0x2B, 0x1F, 0x16, 0x66, 0x25, 0xC5, 0x1B, 0xC1, 0x44, + 0x42, 0x1E, 0x09, 0x51, 0x21, 0x10, 0x04, 0x3B, 0x11, 0x16, 0xAD, 0x2F, + 0x8E, 0x31, 0x87, 0x38, 0x5D, 0x31, 0x4B, 0x38, 0xD8, 0x25, 0x6C, 0x3A, + 0x5C, 0x38, 0x2F, 0x47, 0xED, 0x40, 0xE1, 0x44, 0x1B, 0x36, 0x4A, 0x35, + 0x17, 0x30, 0x43, 0x16, 0x3C, 0x25, 0x93, 0xFC, 0x90, 0x0F, 0x11, 0xED, + 0x0B, 0xFC, 0x61, 0xD3, 0x85, 0xE5, 0x18, 0xC1, 0xC5, 0xD8, 0xC8, 0xC9, + 0xC5, 0xE1, 0x67, 0xDB, 0x57, 0xF7, 0xD3, 0xF2, 0xF3, 0x0E, 0x40, 0x10, + 0x46, 0x19, 0x37, 0x16, 0x26, 0x1B, 0x13, 0x0A, 0x21, 0x20, 0xEF, 0x07, + 0x52, 0x1D, 0x01, 0x06, 0xB1, 0x0D, 0x7E, 0x04, 0x2A, 0x02, 0x56, 0x0E, + 0xA5, 0xFA, 0x94, 0x0E, 0x46, 0xF0, 0x42, 0x09, 0xFF, 0xEC, 0xC3, 0x04, + 0xA5, 0xF7, 0x23, 0x07, 0x41, 0xE8, 0xD1, 0x06, 0x13, 0xD6, 0xF9, 0xFE, + 0x2E, 0xC4, 0x21, 0xDD, 0x00, 0xAE, 0xCD, 0xC0, 0xC0, 0xBF, 0x3D, 0xD2, + 0x11, 0xDE, 0x62, 0xEC, 0xD4, 0xE6, 0x90, 0xFF, 0x1D, 0xD9, 0xAB, 0xFB, + 0x89, 0xCD, 0xA8, 0xE2, 0xA8, 0xC8, 0xB5, 0xD2, 0xDB, 0xDF, 0x84, 0xF1, + 0x38, 0xFF, 0xF4, 0x14, 0xFB, 0xF2, 0x56, 0x03, 0xBA, 0xE8, 0xD1, 0xE2, + 0x70, 0xFF, 0x37, 0xDE, 0x8D, 0xFE, 0xB6, 0xE7, 0x9E, 0xF8, 0x6C, 0xF6, + 0x8D, 0x17, 0xD1, 0x12, 0xCC, 0x22, 0x92, 0x1B, 0xD0, 0x0E, 0x5D, 0xFE, + 0x5B, 0xFB, 0x2A, 0xD7, 0x32, 0xF2, 0x66, 0xC8, 0xFE, 0xE6, 0x4D, 0xC9, + 0xF6, 0xD0, 0x3E, 0xCD, 0xAC, 0xB0, 0x33, 0xCC, 0x9D, 0x9F, 0xF1, 0xC2, + 0xCA, 0xB9, 0x04, 0xC8, 0x65, 0xD9, 0x2C, 0xDF, 0x1A, 0xE6, 0x2D, 0xFB, + 0x7F, 0xEC, 0x0F, 0x09, 0x84, 0xED, 0xE7, 0xFF, 0x36, 0xF8, 0x5D, 0xEE, + 0x8C, 0x02, 0x0C, 0xE6, 0xDD, 0xEE, 0xAD, 0xE0, 0x20, 0xDF, 0x2A, 0xD5, + 0x72, 0xDB, 0x64, 0xC1, 0xAD, 0xD1, 0x14, 0xB6, 0xB9, 0xCD, 0xA1, 0xB9, + 0x9C, 0xDA, 0x7C, 0xC8, 0xDD, 0xE1, 0x0D, 0xCD, 0x19, 0xE7, 0xC8, 0xCC, + 0x67, 0xE5, 0xC5, 0xC7, 0x45, 0xD7, 0x90, 0xBF, 0xEA, 0xDE, 0xE0, 0xCB, + 0x44, 0xEF, 0x88, 0xD8, 0xE6, 0xEF, 0xB4, 0xE9, 0x44, 0xD9, 0xBB, 0xF7, + 0xD9, 0xC1, 0x6A, 0xF5, 0x00, 0xBE, 0xDF, 0xF0, 0x5E, 0xDF, 0x9F, 0x0A, + 0x41, 0xFC, 0x11, 0x29, 0x73, 0xF4, 0xE8, 0x20, 0x20, 0xF3, 0xE2, 0x0F, + 0x5D, 0xFA, 0x69, 0x12, 0xC5, 0xF2, 0xCC, 0x15, 0x56, 0xE6, 0x40, 0x11, + 0xB1, 0xF7, 0x8A, 0x23, 0x2A, 0x0F, 0x6C, 0x31, 0xEC, 0x0D, 0x4F, 0x1F, + 0x91, 0xFA, 0xD6, 0xFD, 0x06, 0xF2, 0xEC, 0xEA, 0x11, 0xFC, 0xA7, 0xE2, + 0x3C, 0xFD, 0x99, 0xD0, 0xD2, 0xEE, 0x32, 0xC8, 0x46, 0xE6, 0xA3, 0xCE, + 0xA7, 0xF8, 0x77, 0xDD, 0xE9, 0x11, 0x80, 0xEA, 0x9A, 0x24, 0x71, 0xFA, + 0x75, 0x2E, 0x78, 0x0A, 0x9E, 0x28, 0x32, 0x04, 0x44, 0x20, 0x28, 0xFC, + 0x77, 0x28, 0x07, 0x0D, 0x85, 0x3A, 0x9F, 0x1F, 0xFA, 0x31, 0x11, 0x19, + 0x73, 0x24, 0x7B, 0x16, 0x40, 0x2B, 0xA4, 0x25, 0x2A, 0x1D, 0xF1, 0x24, + 0x39, 0x03, 0x9D, 0x20, 0xB5, 0xFA, 0x53, 0x28, 0x10, 0x02, 0xDF, 0x2B, + 0x7F, 0x07, 0x09, 0x1A, 0x5E, 0xFE, 0x25, 0xFF, 0x3E, 0xFD, 0x27, 0x06, + 0x0C, 0xFE, 0x25, 0x17, 0xDD, 0xFF, 0xCD, 0x12, 0xA4, 0x06, 0xA8, 0x10, + 0x84, 0x01, 0x36, 0x12, 0xAC, 0xF5, 0x10, 0x01, 0xAD, 0x0B, 0x0F, 0x0A, + 0xEA, 0x36, 0x25, 0x32, 0xD6, 0x37, 0xCB, 0x32, 0x46, 0x1E, 0xA5, 0x1F, + 0xCB, 0x26, 0xA7, 0x29, 0x03, 0x3C, 0x0B, 0x2E, 0xA1, 0x34, 0x67, 0x19, + 0x1D, 0x36, 0xBD, 0x22, 0x7B, 0x42, 0x35, 0x3F, 0x0B, 0x3C, 0x80, 0x42, + 0xF7, 0x21, 0xB5, 0x2D, 0x13, 0x0B, 0x8F, 0x1C, 0x1B, 0xFE, 0xED, 0x1B, + 0x9C, 0xEC, 0x8A, 0x14, 0xCD, 0xDE, 0x37, 0xFB, 0xC8, 0xD7, 0x00, 0xE7, + 0xC0, 0xE3, 0xFC, 0xF0, 0xB3, 0xF9, 0x91, 0xFF, 0x12, 0x0D, 0x19, 0x10, + 0x03, 0x1A, 0x5F, 0x22, 0x2A, 0x12, 0xFD, 0x19, 0x97, 0x04, 0x58, 0x08, + 0x06, 0x08, 0x9A, 0x03, 0x70, 0x1D, 0x4B, 0x08, 0x2F, 0x30, 0xBD, 0x0A, + 0xE3, 0x2C, 0x93, 0x04, 0xB3, 0x1F, 0xB5, 0xFD, 0xE8, 0x12, 0xB6, 0xF8, + 0x31, 0x03, 0x69, 0xF4, 0xA2, 0xFF, 0x98, 0xF8, 0x8E, 0x07, 0x47, 0x02, + 0x69, 0x0D, 0x73, 0x03, 0xF3, 0xFF, 0x07, 0xE9, 0xD9, 0xFA, 0x1E, 0xE1, + 0x7E, 0x0B, 0x44, 0xF9, 0x8D, 0x1A, 0xC1, 0x0C, 0xBA, 0x18, 0x63, 0x17, + 0xAF, 0x0A, 0x04, 0x1D, 0xB4, 0xF7, 0x1E, 0x13, 0xAF, 0x00, 0x05, 0x19, + 0x6C, 0x22, 0x97, 0x36, 0x03, 0x23, 0x72, 0x35, 0x4C, 0x06, 0x34, 0x1A, + 0x19, 0x00, 0x59, 0x1B, 0x3C, 0x12, 0x60, 0x2E, 0x4E, 0x0F, 0xC3, 0x22, + 0x81, 0x0F, 0x72, 0x1E, 0xAF, 0x2A, 0xAE, 0x35, 0x74, 0x39, 0xA0, 0x39, + 0x8E, 0x2B, 0x0A, 0x1C, 0xA5, 0x1A, 0xEC, 0xFF, 0xE8, 0x0B, 0x09, 0xF5, + 0x04, 0xF7, 0xDA, 0xE7, 0x92, 0xE0, 0xDB, 0xCE, 0x5C, 0xD9, 0x0B, 0xC1, + 0x05, 0xE7, 0xB9, 0xCD, 0x3C, 0xF7, 0xB6, 0xDD, 0x26, 0x06, 0xEE, 0xE3, + 0xB9, 0x17, 0xC9, 0xF0, 0x22, 0x1E, 0x07, 0x02, 0xDB, 0x0B, 0x16, 0xFD, + 0x4E, 0x09, 0xDD, 0xFE, 0xAE, 0x20, 0x4E, 0x19, 0xFF, 0x1F, 0x2A, 0x24, + 0x95, 0x0B, 0xFC, 0x1E, 0x0C, 0xFD, 0x9C, 0x19, 0xFE, 0xEE, 0x40, 0x09, + 0x80, 0xE6, 0x58, 0xF5, 0x65, 0xE8, 0x06, 0xF7, 0x70, 0xE8, 0x3E, 0xFE, + 0x7B, 0xE5, 0x84, 0xF0, 0xA2, 0xD9, 0x40, 0xD4, 0xF7, 0xD1, 0xA7, 0xCE, + 0x69, 0xE3, 0x44, 0xEA, 0x29, 0xFE, 0xD4, 0x03, 0xA8, 0x09, 0x73, 0x01, + 0xC9, 0x02, 0xCA, 0xF4, 0xA1, 0xE4, 0x0B, 0xE4, 0xEE, 0xCF, 0xAC, 0xDB, + 0x85, 0xEF, 0xC4, 0xF5, 0x64, 0x0D, 0xF3, 0x0D, 0x36, 0xFA, 0x27, 0x00, + 0x1F, 0xEB, 0x93, 0xF5, 0x2E, 0x00, 0xAD, 0x08, 0x6F, 0x08, 0xE5, 0xFF, + 0x12, 0x0E, 0x97, 0xED, 0x3E, 0x20, 0x56, 0x09, 0xB3, 0x1F, 0x7C, 0x26, + 0xEE, 0x0C, 0xC9, 0x13, 0xDC, 0xFF, 0x08, 0xF8, 0xCD, 0xFA, 0xAD, 0xF4, + 0x32, 0xE4, 0x4F, 0xE4, 0x9C, 0xCC, 0xBD, 0xCA, 0x10, 0xC5, 0xF6, 0xBE, + 0x14, 0xC8, 0x8B, 0xC4, 0xEA, 0xC8, 0xF5, 0xCF, 0x90, 0xD4, 0x6D, 0xDC, + 0x8A, 0xED, 0x45, 0xE8, 0xE3, 0xF5, 0x3A, 0xED, 0xF5, 0xEC, 0x95, 0xE8, + 0x64, 0xEA, 0x93, 0xDF, 0xB5, 0xEC, 0xC6, 0xE2, 0xB3, 0xE2, 0x5F, 0xE6, + 0xF3, 0xDE, 0x37, 0xE7, 0xA2, 0xDE, 0x9E, 0xE2, 0x84, 0xE1, 0x5C, 0xDA, + 0x44, 0xE8, 0x87, 0xCE, 0x46, 0xEA, 0x60, 0xCF, 0x10, 0xDD, 0xFC, 0xD2, + 0x32, 0xD0, 0xB6, 0xC8, 0xEA, 0xCA, 0xCA, 0xB6, 0xF7, 0xB8, 0x78, 0x9F, + 0xB0, 0xBD, 0x4B, 0xAC, 0x3F, 0xD4, 0xA4, 0xD1, 0xE1, 0xE3, 0x8E, 0xE9, + 0xC4, 0xE5, 0xF6, 0xEC, 0xC5, 0xD0, 0xAB, 0xE3, 0x9E, 0xBA, 0xAB, 0xDC, + 0x1D, 0xCB, 0xEA, 0xF0, 0x8E, 0xE6, 0xA4, 0x0F, 0x22, 0xE1, 0xA0, 0x0D, + 0x89, 0xD4, 0xCB, 0xF5, 0x62, 0xE4, 0xBF, 0xF3, 0x56, 0xF1, 0xFD, 0xF0, + 0x09, 0xEE, 0xD7, 0xE2, 0xE8, 0xFA, 0x81, 0xF6, 0x0D, 0x07, 0x3A, 0x13, + 0x13, 0x07, 0xD0, 0x10, 0x05, 0xFD, 0x4D, 0xF2, 0x23, 0xFB, 0xD9, 0xDF, + 0xFF, 0xF9, 0x9B, 0xD9, 0xA6, 0xE6, 0x4E, 0xCA, 0x11, 0xCC, 0x56, 0xBD, + 0x43, 0xC4, 0xFC, 0xC7, 0x6F, 0xD3, 0xF7, 0xDC, 0x08, 0xE6, 0x97, 0xDE, + 0xC1, 0xFF, 0x0D, 0xE4, 0xFF, 0x1E, 0x59, 0x00, 0x06, 0x2B, 0xCF, 0x10, + 0x4A, 0x27, 0x19, 0x0C, 0x98, 0x3B, 0x80, 0x20, 0xCF, 0x44, 0x1E, 0x33, + 0x07, 0x2D, 0xA5, 0x29, 0x51, 0x1E, 0xCF, 0x25, 0x4A, 0x21, 0xFD, 0x29, + 0x8E, 0x16, 0xCB, 0x13, 0x89, 0x15, 0xED, 0x02, 0xBE, 0x1B, 0xC4, 0x11, + 0x5E, 0xFB, 0x2D, 0x15, 0x98, 0xD9, 0x8B, 0x06, 0x9E, 0xCF, 0xBC, 0xED, + 0x59, 0xDB, 0x3E, 0xEB, 0xAD, 0xF6, 0x9A, 0x05, 0x18, 0x19, 0x27, 0x29, + 0x4C, 0x24, 0x64, 0x37, 0x13, 0x13, 0xC6, 0x2A, 0xB8, 0xF7, 0xDE, 0x17, + 0x68, 0xF2, 0xE2, 0x1F, 0x30, 0x1C, 0x23, 0x42, 0x2C, 0x36, 0x5C, 0x39, + 0x6B, 0x29, 0xAC, 0x0F, 0x19, 0x24, 0x38, 0x02, 0xD8, 0x28, 0x3A, 0x0F, + 0x74, 0x1C, 0xCE, 0x13, 0x6F, 0x23, 0xBB, 0x1E, 0xB8, 0x3C, 0xA9, 0x35, + 0x95, 0x26, 0xAF, 0x32, 0x66, 0x04, 0xB8, 0x1F, 0x48, 0x03, 0xB5, 0x10, + 0xCD, 0x05, 0x66, 0x05, 0xAE, 0xF8, 0xFC, 0xF5, 0xEE, 0xE7, 0x06, 0xE1, + 0x72, 0xD6, 0x18, 0xD6, 0xBB, 0xC8, 0xD7, 0xD8, 0x43, 0xCF, 0x91, 0xE7, + 0x16, 0xE4, 0xD4, 0xFA, 0xB2, 0xF7, 0x02, 0xFF, 0x22, 0x0B, 0x5D, 0xF3, + 0x0F, 0x14, 0xEB, 0xE4, 0xD1, 0x10, 0xF0, 0xDE, 0xBA, 0x13, 0xCC, 0xEF, + 0xBA, 0x0B, 0xBB, 0xFF, 0x54, 0xF6, 0xEC, 0xFB, 0xCD, 0xEE, 0x92, 0xF7, + 0x04, 0xF5, 0xB1, 0xF3, 0x0D, 0xFD, 0xB3, 0xE1, 0x67, 0x06, 0x05, 0xDB, + 0x74, 0xF7, 0x98, 0xE1, 0xAD, 0xD9, 0x5B, 0xDE, 0x20, 0xC6, 0xBA, 0xCB, + 0xE9, 0xC3, 0xD0, 0xC3, 0x3F, 0xD6, 0xFB, 0xD6, 0x0B, 0xF1, 0x9E, 0xF6, + 0x38, 0x01, 0xAA, 0x11, 0x6C, 0xFA, 0xA9, 0x10, 0xC1, 0xE7, 0x20, 0xFF, + 0x8D, 0xD4, 0x9F, 0xF6, 0x98, 0xE3, 0xD2, 0x0F, 0xEA, 0xFF, 0x47, 0x26, + 0xAE, 0xFC, 0x9C, 0x12, 0x41, 0xF8, 0xF8, 0xF8, 0x24, 0x0F, 0xCC, 0x03, + 0xD7, 0x0F, 0xF3, 0x0A, 0xBB, 0xFC, 0x6A, 0xFD, 0x11, 0x12, 0xBA, 0x0B, + 0x00, 0x27, 0x65, 0x1B, 0xB4, 0x1C, 0xC0, 0x10, 0x6D, 0x0F, 0xF0, 0x04, + 0xEB, 0x0D, 0x85, 0x0A, 0x27, 0x02, 0x79, 0x07, 0xA1, 0xEA, 0x48, 0xF2, + 0xF0, 0xE1, 0x2A, 0xE3, 0x80, 0xEC, 0x7C, 0xE4, 0x21, 0xFA, 0x88, 0xF5, + 0x6B, 0xFE, 0xC9, 0x0A, 0x9F, 0x0C, 0x82, 0x22, 0xF8, 0x21, 0xFF, 0x33, + 0x24, 0x27, 0x59, 0x31, 0x00, 0x29, 0x17, 0x2A, 0x3E, 0x34, 0xDC, 0x2C, + 0x6D, 0x39, 0x85, 0x2F, 0x75, 0x32, 0xFF, 0x29, 0x43, 0x26, 0x2A, 0x24, + 0xEA, 0x1E, 0xF0, 0x25, 0x60, 0x13, 0xF6, 0x17, 0xBA, 0x17, 0x1D, 0x0A, + 0x18, 0x21, 0xCF, 0x0B, 0x4E, 0x13, 0x9F, 0x0F, 0xC6, 0xFA, 0x07, 0x06, + 0x3D, 0xF2, 0x5A, 0xF0, 0xA5, 0x0B, 0x64, 0xF6, 0xDC, 0x28, 0xE1, 0x14, + 0xA1, 0x31, 0x17, 0x32, 0x3C, 0x28, 0xE2, 0x43, 0x52, 0x19, 0xBD, 0x43, + 0xEF, 0x13, 0x11, 0x33, 0xA0, 0x2E, 0xC4, 0x3D, 0x2B, 0x4A, 0x3B, 0x58, + 0xE7, 0x42, 0x6D, 0x4A, 0xB0, 0x2E, 0xD2, 0x1F, 0x12, 0x28, 0x19, 0x0C, + 0x1D, 0x29, 0x9A, 0x18, 0xC5, 0x28, 0x21, 0x2A, 0x51, 0x42, 0xA0, 0x46, + 0xE8, 0x5F, 0x18, 0x5D, 0x16, 0x5F, 0x42, 0x60, 0xA3, 0x42, 0xB0, 0x4E, + 0xF7, 0x27, 0x49, 0x39, 0x59, 0x20, 0xE7, 0x38, 0x7B, 0x14, 0x47, 0x32, + 0x06, 0x03, 0x46, 0x14, 0xD6, 0xF7, 0x53, 0xFD, 0xD8, 0xF8, 0x06, 0xFF, + 0xB0, 0xFC, 0x05, 0xFC, 0xDD, 0x0A, 0x61, 0x00, 0xB8, 0x1F, 0x4D, 0x18, + 0xEF, 0x2E, 0x66, 0x25, 0x0A, 0x3A, 0x6C, 0x23, 0xDB, 0x42, 0xA5, 0x21, + 0x62, 0x45, 0x72, 0x18, 0x9E, 0x39, 0x31, 0x08, 0x86, 0x28, 0x76, 0x09, + 0x03, 0x18, 0xD4, 0x0E, 0x2E, 0x12, 0xEE, 0x11, 0x3B, 0x07, 0x0F, 0x0A, + 0x75, 0xFC, 0x06, 0xF8, 0x4A, 0xF6, 0xF0, 0xEA, 0x03, 0xE8, 0xA1, 0xEF, + 0x61, 0xD2, 0xAA, 0xF4, 0x50, 0xD0, 0x32, 0xF5, 0xD5, 0xE8, 0xE4, 0x06, + 0x3F, 0xF2, 0x70, 0x10, 0xE2, 0xE3, 0xE2, 0x00, 0x63, 0xDB, 0x58, 0xF5, + 0x2A, 0xD1, 0x6C, 0xEB, 0xAD, 0xD5, 0x05, 0xEA, 0x8F, 0x03, 0xA0, 0x08, + 0x54, 0x1A, 0xF6, 0x0E, 0xD2, 0x00, 0x9F, 0xE5, 0x21, 0xF7, 0x75, 0xCC, + 0x2F, 0x07, 0x55, 0xDA, 0x68, 0xFE, 0xD7, 0xDD, 0x62, 0xFC, 0x24, 0xE3, + 0x13, 0x19, 0x36, 0x00, 0xDE, 0x20, 0x0A, 0x12, 0x7B, 0x00, 0x63, 0x01, + 0xDD, 0xD9, 0xE8, 0xE5, 0x44, 0xCB, 0xF0, 0xE0, 0x4E, 0xC2, 0xB7, 0xDA, + 0x96, 0xB8, 0x60, 0xC8, 0x5E, 0xB3, 0x1E, 0xBB, 0x22, 0xBF, 0x78, 0xC2, + 0xC9, 0xCF, 0x7C, 0xCE, 0x7E, 0xD6, 0x7C, 0xD9, 0xA6, 0xE3, 0x66, 0xEF, + 0x56, 0xEF, 0xA4, 0xF6, 0x7A, 0xF4, 0x95, 0xEE, 0x1B, 0xF6, 0xF3, 0xED, + 0x0D, 0xFA, 0x1F, 0xFB, 0xC6, 0xF4, 0x6D, 0xFB, 0x69, 0xE7, 0x62, 0xE7, + 0xDF, 0xDF, 0xF6, 0xD9, 0xC6, 0xDE, 0xC4, 0xE0, 0x23, 0xD5, 0x1A, 0xE1, + 0x7D, 0xCD, 0xF6, 0xD3, 0xAA, 0xD4, 0xFF, 0xCD, 0xB9, 0xD1, 0x74, 0xC5, + 0x7A, 0xBA, 0xE6, 0xB1, 0x9A, 0xAE, 0x40, 0xAC, 0x7E, 0xC1, 0x64, 0xC0, + 0x83, 0xD7, 0xA2, 0xD1, 0x09, 0xDB, 0xDB, 0xD6, 0x7B, 0xD1, 0x2A, 0xD8, + 0x47, 0xCC, 0x3C, 0xD4, 0x86, 0xCF, 0x77, 0xCC, 0x23, 0xE6, 0xCB, 0xE0, + 0xEE, 0x04, 0x21, 0x09, 0x1B, 0x01, 0x72, 0x0A, 0x18, 0xE7, 0xDE, 0xF0, + 0x0B, 0xE4, 0x8E, 0xEF, 0x0E, 0xE2, 0xDD, 0xEF, 0x08, 0xD5, 0x58, 0xE6, + 0x58, 0xE6, 0x0E, 0xF7, 0xA0, 0x0F, 0x1A, 0x13, 0xD9, 0x1A, 0x71, 0x14, + 0xC0, 0x02, 0x77, 0x00, 0x70, 0xF5, 0x44, 0xF4, 0x90, 0xE9, 0x36, 0xE5, + 0x0D, 0xCC, 0xDD, 0xD3, 0x8D, 0xBB, 0x7C, 0xD0, 0x5A, 0xC2, 0xA9, 0xCC, + 0xE3, 0xD2, 0xC6, 0xC8, 0x63, 0xE3, 0x5F, 0xD0, 0x27, 0xEE, 0xBA, 0xD9, + 0x02, 0xF2, 0x63, 0xE6, 0x79, 0xF0, 0x5A, 0xF6, 0x37, 0xF6, 0x36, 0x00, + 0x7F, 0x0E, 0x36, 0x11, 0x9A, 0x1D, 0x69, 0x23, 0xEF, 0x1E, 0x57, 0x24, + 0x0D, 0x1B, 0x6D, 0x09, 0x29, 0x1A, 0x6C, 0xF7, 0xAA, 0x12, 0x22, 0xFC, + 0xA8, 0x09, 0x9C, 0x01, 0x75, 0x17, 0xFA, 0x0F, 0x47, 0x15, 0x25, 0x11, + 0x49, 0xF8, 0x89, 0xFB, 0x2C, 0xD9, 0xB5, 0xE0, 0x87, 0xDB, 0xF7, 0xE6, + 0x33, 0xF6, 0x79, 0xFE, 0xC2, 0x0D, 0x89, 0x0B, 0x83, 0x18, 0x71, 0x1A, + 0x09, 0x09, 0x14, 0x1E, 0xC7, 0xEF, 0xE2, 0x07, 0xB9, 0xF8, 0x4D, 0x00, + 0xDD, 0x25, 0xB8, 0x22, 0x56, 0x35, 0x78, 0x2C, 0xBB, 0x1E, 0x86, 0x0C, + 0x2C, 0x1C, 0xAC, 0x01, 0x44, 0x2C, 0xE0, 0x0B, 0x07, 0x27, 0x01, 0x04, + 0x5F, 0x24, 0xEE, 0x09, 0x61, 0x38, 0xF7, 0x24, 0x96, 0x45, 0x27, 0x30, + 0x3C, 0x37, 0x73, 0x27, 0x53, 0x22, 0x79, 0x1B, 0xF8, 0x25, 0x67, 0x17, + 0x7F, 0x1E, 0x69, 0x07, 0x85, 0xFD, 0x80, 0xF4, 0x61, 0xE7, 0x75, 0xFA, + 0x62, 0xDD, 0x1A, 0x0D, 0x29, 0xD9, 0x1A, 0x1B, 0x73, 0xE9, 0xBD, 0x28, + 0x71, 0x06, 0xB9, 0x34, 0xBE, 0x0E, 0x13, 0x35, 0xF9, 0x0A, 0x53, 0x27, + 0xAC, 0x18, 0x24, 0x20, 0x85, 0x22, 0x54, 0x2B, 0x69, 0x1A, 0x37, 0x38, + 0x3C, 0x1B, 0xBC, 0x36, 0xE8, 0x23, 0x9C, 0x29, 0xEC, 0x28, 0x05, 0x1D, + 0xAC, 0x27, 0x68, 0x0A, 0x24, 0x23, 0xDA, 0xFC, 0x59, 0x0E, 0xA1, 0xF6, + 0x4D, 0xF7, 0x3E, 0xEF, 0x8A, 0xE2, 0x84, 0xD4, 0x6E, 0xD5, 0xF1, 0xC3, + 0x7B, 0xEC, 0xE9, 0xDE, 0x9E, 0x13, 0x75, 0x00, 0x51, 0x21, 0x3D, 0x10, + 0x81, 0x16, 0x01, 0x13, 0xD4, 0x0E, 0xD6, 0x10, 0xD4, 0x0B, 0x26, 0x09, + 0xA6, 0x22, 0x5B, 0x1C, 0xB2, 0x45, 0x01, 0x41, 0xC3, 0x3E, 0xA2, 0x3B, + 0xC4, 0x2C, 0x71, 0x26, 0xAD, 0x32, 0x24, 0x2F, 0xA7, 0x2E, 0xFF, 0x33, + 0x8D, 0x1D, 0x72, 0x23, 0x5F, 0x29, 0x8E, 0x2B, 0x97, 0x34, 0xF5, 0x40, + 0x37, 0x20, 0x2A, 0x42, 0xA1, 0x0A, 0xF2, 0x30, 0x64, 0x0C, 0xB4, 0x1F, + 0xF0, 0x19, 0x98, 0x12, 0x4E, 0x0D, 0xD4, 0xF3, 0x27, 0xF3, 0x99, 0xD4, + 0x30, 0xE4, 0xD1, 0xD4, 0x51, 0xE7, 0x88, 0xEE, 0x9D, 0xF0, 0xCC, 0xFB, + 0x97, 0x05, 0x21, 0x05, 0x23, 0x1B, 0xD3, 0x12, 0xB3, 0x1E, 0x96, 0x10, + 0x2A, 0x23, 0x79, 0x12, 0xC3, 0x25, 0x2D, 0x22, 0xB5, 0x1C, 0x80, 0x2A, + 0x91, 0x1B, 0xB6, 0x26, 0xC9, 0x25, 0x7D, 0x1F, 0x22, 0x2A, 0x04, 0x1A, + 0x35, 0x22, 0x8F, 0x11, 0x0D, 0x15, 0x03, 0x12, 0x29, 0xFE, 0xBB, 0x14, + 0xA7, 0xDA, 0xC9, 0xFF, 0xBA, 0xC3, 0x89, 0xE8, 0xBD, 0xAF, 0xC3, 0xCC, + 0xCD, 0xB3, 0xF7, 0xC9, 0xC6, 0xDC, 0x75, 0xEC, 0x6E, 0x05, 0xB6, 0x0C, + 0xF6, 0x0C, 0x4E, 0x19, 0x10, 0xF6, 0x4F, 0x0E, 0x3B, 0xEA, 0xED, 0xF6, + 0x32, 0x03, 0x60, 0xF3, 0x8A, 0x32, 0x6D, 0x0E, 0xF4, 0x3C, 0x73, 0x16, + 0xDE, 0x14, 0xDA, 0xF4, 0x3E, 0xFF, 0xF9, 0xDC, 0x68, 0x07, 0xD2, 0xDE, + 0xB8, 0xFB, 0x25, 0xD3, 0xE8, 0xFA, 0x72, 0xE2, 0x3C, 0x1B, 0x17, 0x15, + 0x4F, 0x2D, 0x8C, 0x20, 0xFD, 0x21, 0x88, 0x05, 0xCC, 0x13, 0x1E, 0xFD, + 0x9F, 0x0F, 0x03, 0x02, 0x30, 0x05, 0x59, 0xED, 0x99, 0xF7, 0x10, 0xE0, + 0xDC, 0xE2, 0xD5, 0xEA, 0x29, 0xC6, 0x32, 0xF3, 0x95, 0xB5, 0x9C, 0xF3, + 0x89, 0xC1, 0x7D, 0xFB, 0x29, 0xDB, 0x34, 0x02, 0xB0, 0xE3, 0x8D, 0x03, + 0x90, 0xE7, 0xCF, 0x0A, 0x17, 0xFC, 0x62, 0x12, 0x52, 0x0C, 0x51, 0x10, + 0x65, 0x00, 0xE3, 0xFF, 0x51, 0xFA, 0x1B, 0xF4, 0x44, 0x04, 0x50, 0xF4, + 0xB0, 0x01, 0x81, 0xF5, 0x47, 0xF5, 0x24, 0xEA, 0x40, 0xF6, 0xF5, 0xE8, + 0x02, 0xE6, 0x84, 0xDF, 0x8D, 0xC1, 0x01, 0xBC, 0x64, 0xAA, 0x0F, 0xA2, + 0xC1, 0xA5, 0x69, 0xA5, 0xC0, 0xC1, 0xB6, 0xC1, 0xEC, 0xED, 0x45, 0xDF, + 0x3C, 0x04, 0x35, 0xEB, 0x8B, 0xF1, 0x89, 0xE1, 0x2C, 0xCB, 0x6E, 0xD1, + 0x10, 0xC1, 0x6D, 0xD3, 0xBB, 0xDF, 0x71, 0xF5, 0xFE, 0xFB, 0x3F, 0x08, + 0xF9, 0xF5, 0x47, 0xEE, 0xA0, 0xE5, 0x80, 0xD4, 0x5A, 0xDF, 0x0C, 0xD5, + 0x7B, 0xD3, 0x5B, 0xD9, 0x09, 0xCF, 0x30, 0xE4, 0x7E, 0xE7, 0x9C, 0x05, + 0x09, 0xF8, 0x3E, 0x18, 0xD4, 0xED, 0x8A, 0x08, 0xD7, 0xE2, 0xBD, 0xF1, + 0x75, 0xDD, 0x41, 0xDF, 0x7D, 0xD4, 0xD9, 0xC6, 0x0C, 0xC8, 0x83, 0xB6, + 0x66, 0xC6, 0xB9, 0xB4, 0x36, 0xC3, 0x2D, 0xB3, 0xFF, 0xC0, 0x53, 0xBB, + 0xB4, 0xCC, 0xF0, 0xD1, 0x1D, 0xDB, 0xD3, 0xE5, 0xD1, 0xE4, 0xF8, 0xED, + 0xAE, 0xEE, 0x29, 0xF1, 0x77, 0xFB, 0xA9, 0xF4, 0x5D, 0x0C, 0xF5, 0xFA, + 0x4C, 0x16, 0x0F, 0xFE, 0xE8, 0x11, 0x72, 0xFE, 0xD7, 0x16, 0x98, 0x03, + 0xA2, 0x24, 0xF6, 0x0A, 0x7F, 0x21, 0x77, 0x0C, 0x16, 0x13, 0x93, 0x0E, + 0x09, 0x04, 0x85, 0x10, 0x9C, 0xE0, 0x26, 0x02, 0xE6, 0xC0, 0xE2, 0xF1, + 0x4A, 0xB9, 0x2A, 0xE2, 0x38, 0xCE, 0xE6, 0xE7, 0x47, 0xF3, 0xE2, 0x03, + 0x74, 0x0E, 0x67, 0x15, 0xD4, 0x1B, 0x15, 0x0D, 0x59, 0x16, 0x97, 0xFA, + 0x13, 0x0D, 0x7C, 0xF9, 0x95, 0x1D, 0xDC, 0x0A, 0xD6, 0x43, 0xA8, 0x25, + 0xAC, 0x3F, 0x41, 0x23, 0xB4, 0x12, 0xE7, 0x03, 0x35, 0x04, 0x78, 0xFD, + 0x8E, 0x0C, 0xB3, 0x04, 0x4A, 0x07, 0x38, 0x00, 0x47, 0x10, 0xF2, 0x0F, + 0xBA, 0x30, 0xCB, 0x30, 0x53, 0x38, 0xF9, 0x39, 0xB0, 0x29, 0x49, 0x2C, + 0xA7, 0x21, 0xB3, 0x24, 0x16, 0x12, 0xB4, 0x1C, 0x7E, 0x06, 0x08, 0x12, + 0x51, 0x02, 0x04, 0x0B, 0x8C, 0xF2, 0xE2, 0xFB, 0x81, 0xEE, 0xF5, 0xF6, + 0x7D, 0xF6, 0x17, 0x01, 0xDC, 0xF6, 0x4A, 0x0F, 0x68, 0xEF, 0x15, 0x1E, + 0x91, 0xE6, 0x36, 0x26, 0x9E, 0xEB, 0x2D, 0x23, 0xB0, 0x07, 0x8F, 0x21, + 0xD0, 0x1F, 0x82, 0x1C, 0x79, 0x15, 0x08, 0x0F, 0xB9, 0x04, 0x6D, 0x07, + 0xF2, 0x0E, 0x4E, 0x04, 0xF5, 0x12, 0x3E, 0xFF, 0xCD, 0xFE, 0xCE, 0xF5, + 0xDE, 0xFC, 0x48, 0xF6, 0xA9, 0xF9, 0x46, 0xF0, 0x20, 0xE9, 0x46, 0xE4, + 0x90, 0xDF, 0x9E, 0xCE, 0x6D, 0xD9, 0xD1, 0xB8, 0xD6, 0xD8, 0xBD, 0xBE, + 0x4B, 0xEB, 0x5E, 0xD3, 0xE7, 0x06, 0xC6, 0xE6, 0x8F, 0x0B, 0x5B, 0xF1, + 0x4B, 0x05, 0x21, 0xF3, 0xD6, 0x09, 0x47, 0xF4, 0x47, 0x1C, 0x88, 0x06, + 0x33, 0x29, 0xD5, 0x19, 0x32, 0x0E, 0xD7, 0x0B, 0x84, 0xEB, 0x3C, 0xF8, + 0x81, 0xEB, 0x87, 0x03, 0x66, 0xE8, 0xFB, 0x04, 0x91, 0xE1, 0x66, 0xFB, + 0x04, 0xFA, 0x3F, 0x12, 0xCF, 0x10, 0x07, 0x28, 0x4B, 0xFD, 0xAA, 0x12, + 0x2C, 0xEA, 0xDC, 0xF9, 0xB1, 0xEB, 0x08, 0xFB, 0xC6, 0xEA, 0x50, 0xF6, + 0x14, 0xED, 0x52, 0xE2, 0xCF, 0xE7, 0xDB, 0xCD, 0x83, 0xDA, 0x8D, 0xC7, + 0x82, 0xDF, 0x46, 0xD4, 0xF6, 0xEB, 0x7F, 0xEC, 0xDD, 0xF3, 0x77, 0xFB, + 0x05, 0xFE, 0x2F, 0x02, 0x21, 0xF9, 0x1C, 0x0A, 0x9D, 0xF6, 0x2B, 0x08, + 0x4F, 0x10, 0xE3, 0x0A, 0x66, 0x20, 0x63, 0x14, 0xCB, 0x17, 0x56, 0x1E, + 0x16, 0x0F, 0x0A, 0x2A, 0x0C, 0x12, 0x54, 0x3A, 0x18, 0x11, 0x34, 0x30, + 0xD2, 0x0D, 0x4F, 0x10, 0x8B, 0x0E, 0xF0, 0x0B, 0xC3, 0xFD, 0x0D, 0x16, + 0xE5, 0xE5, 0x31, 0x09, 0x87, 0xD8, 0x67, 0xEA, 0xDB, 0xE0, 0x58, 0xEA, + 0xE2, 0xF5, 0x7E, 0xFD, 0xA8, 0x16, 0x20, 0x0B, 0x40, 0x36, 0x50, 0x08, + 0xD3, 0x35, 0x10, 0xFB, 0xAA, 0x20, 0x67, 0xF5, 0x26, 0x24, 0x3F, 0x07, + 0x16, 0x43, 0x70, 0x28, 0xC0, 0x3F, 0x60, 0x25, 0xF6, 0x26, 0xA2, 0x16, + 0x09, 0x26, 0xB9, 0x28, 0x73, 0x2A, 0xCD, 0x34, 0x13, 0x28, 0x09, 0x22, + 0x25, 0x37, 0xF7, 0x24, 0x5C, 0x56, 0x32, 0x44, 0xEC, 0x5C, 0x56, 0x47, + 0x02, 0x47, 0x8F, 0x33, 0x01, 0x34, 0x60, 0x2C, 0xE5, 0x2A, 0x11, 0x28, + 0x4C, 0x18, 0x2D, 0x1A, 0xA2, 0x0F, 0xEA, 0x0F, 0xB7, 0x0C, 0x49, 0x03, + 0x63, 0x00, 0xDA, 0x06, 0xB8, 0x08, 0x2E, 0x23, 0xD6, 0x1D, 0xD1, 0x36, + 0xEC, 0x20, 0x1E, 0x3A, 0x66, 0x1F, 0x35, 0x40, 0x36, 0x1D, 0xA0, 0x3D, + 0x86, 0x22, 0xB2, 0x3F, 0x99, 0x30, 0x64, 0x4B, 0x4B, 0x2E, 0x6A, 0x43, + 0xB4, 0x27, 0x37, 0x36, 0x9C, 0x31, 0x24, 0x38, 0x51, 0x35, 0xA2, 0x2D, + 0xD4, 0x21, 0x35, 0x12, 0xC9, 0x19, 0xDA, 0x13, 0x76, 0x12, 0xA1, 0x14, + 0x9C, 0x01, 0xC4, 0x07, 0x73, 0xF0, 0xF2, 0xF3, 0x82, 0xE7, 0xA2, 0xDF, + 0x21, 0xF8, 0x3D, 0xE7, 0x47, 0x18, 0x4E, 0x01, 0x60, 0x2A, 0x8A, 0x13, + 0x55, 0x1B, 0x61, 0x0B, 0xE9, 0x0B, 0x2D, 0xFC, 0xBC, 0x0A, 0xE3, 0xF9, + 0x8A, 0x1C, 0x1D, 0x10, 0x32, 0x2D, 0x87, 0x24, 0x06, 0x0B, 0x01, 0x14, + 0xDF, 0xE8, 0x3D, 0x08, 0xEE, 0xF4, 0xF8, 0x0D, 0x75, 0xF9, 0x98, 0xFE, + 0xB0, 0xF3, 0x2A, 0xF9, 0x00, 0x0E, 0xD3, 0x13, 0x3A, 0x23, 0xD6, 0x16, + 0x20, 0x1C, 0xC0, 0x00, 0xDB, 0x11, 0x1F, 0xF0, 0x40, 0x0C, 0x9F, 0xE8, + 0xD3, 0xF9, 0x30, 0xDB, 0xFF, 0xE2, 0x53, 0xCC, 0xEC, 0xD0, 0xB1, 0xC1, + 0x90, 0xC2, 0x7F, 0xC0, 0x4F, 0xCC, 0x5D, 0xD9, 0x88, 0xE0, 0x54, 0xF0, + 0x35, 0xF2, 0xB0, 0xFB, 0x32, 0xF8, 0x5C, 0xFC, 0x12, 0xF1, 0xE9, 0xF8, + 0x12, 0xED, 0x01, 0x05, 0xD6, 0xF7, 0x91, 0x16, 0xF4, 0x06, 0xD6, 0x12, + 0xC8, 0xFF, 0x27, 0xFD, 0xB7, 0xF0, 0xAE, 0xF1, 0x98, 0xEC, 0x04, 0xF7, + 0xF3, 0xE1, 0x94, 0xF2, 0xC2, 0xE2, 0xC5, 0xF1, 0x97, 0xE4, 0xCD, 0xEF, + 0xF4, 0xD4, 0x25, 0xDF, 0x1A, 0xBA, 0x73, 0xC5, 0xC1, 0xA9, 0xB9, 0xA9, + 0x0E, 0xC2, 0x09, 0xA8, 0x41, 0xE3, 0xD5, 0xBF, 0x9E, 0xF2, 0x27, 0xE2, + 0xCD, 0xEA, 0x54, 0xE9, 0x7C, 0xCB, 0x2E, 0xCB, 0x93, 0xB6, 0x6B, 0xB7, + 0x06, 0xCF, 0x32, 0xCE, 0x60, 0xF8, 0x64, 0xE9, 0xB7, 0x02, 0xD3, 0xE9, + 0x01, 0xEF, 0xE7, 0xDC, 0xE7, 0xEC, 0xA0, 0xDD, 0x3E, 0xEE, 0x32, 0xE0, + 0x68, 0xDB, 0x48, 0xD6, 0x5D, 0xE6, 0xD9, 0xE3, 0x89, 0xFF, 0xEA, 0xF9, + 0xE3, 0xFE, 0xCC, 0xF9, 0x38, 0xF4, 0xE4, 0xE9, 0x8E, 0xE8, 0x8B, 0xD7, + 0x40, 0xD5, 0xCD, 0xC7, 0x9A, 0xBA, 0xD2, 0xB7, 0x62, 0xA9, 0x6B, 0xB8, + 0xD8, 0xA4, 0x70, 0xC5, 0x6D, 0xB2, 0x7C, 0xD7, 0x02, 0xCF, 0xF6, 0xEF, + 0x70, 0xE1, 0xBE, 0xF8, 0x76, 0xF2, 0x7F, 0xF0, 0xBC, 0x00, 0x18, 0xE9, + 0x74, 0xFD, 0xB4, 0xE7, 0x3E, 0xFF, 0x81, 0xF5, 0x95, 0x03, 0x97, 0x00, + 0x8E, 0xFB, 0x15, 0xFB, 0x0D, 0xEF, 0xA5, 0xEE, 0x26, 0xEE, 0x07, 0xEA, + 0x84, 0xEB, 0x41, 0xEC, 0xA4, 0xDC, 0x4D, 0xEF, 0xDB, 0xD9, 0xEF, 0xF8, + 0x29, 0xD9, 0x4E, 0xF7, 0x6A, 0xCE, 0x5F, 0xEB, 0x03, 0xC2, 0x3D, 0xD5, + 0x10, 0xDB, 0xD0, 0xCE, 0xBC, 0x12, 0xD0, 0xE8, 0xA6, 0x2F, 0x38, 0x06, + 0x20, 0x23, 0xA9, 0x0B, 0x84, 0x07, 0x19, 0x03, 0xB5, 0xE6, 0xA7, 0xF7, + 0x9D, 0xE0, 0x5B, 0xFB, 0xBB, 0x0A, 0x0D, 0x1D, 0x6E, 0x28, 0x19, 0x2B, + 0x36, 0x19, 0x19, 0x12, 0xF8, 0x11, 0x1B, 0x0D, 0xF2, 0x1C, 0x0B, 0x18, + 0x46, 0x13, 0x3F, 0x04, 0x46, 0x0F, 0xB0, 0xFB, 0xD1, 0x23, 0x1E, 0x0D, + 0x16, 0x34, 0x69, 0x17, 0x80, 0x29, 0x21, 0x13, 0x2E, 0x1C, 0x33, 0x0A, + 0x7D, 0x1B, 0x88, 0xFF, 0x08, 0x08, 0x22, 0xF1, 0xA9, 0xE8, 0x7E, 0xEC, + 0x7D, 0xDD, 0x24, 0xF2, 0xD6, 0xEC, 0x98, 0x01, 0x33, 0x02, 0xB0, 0x11, + 0x76, 0x14, 0xEB, 0x1D, 0xE3, 0x21, 0xB7, 0x25, 0xF5, 0x27, 0x93, 0x21, + 0xC7, 0x29, 0xC1, 0x22, 0xAA, 0x21, 0x39, 0x34, 0x46, 0x14, 0x03, 0x3D, + 0x6B, 0x0E, 0xE9, 0x32, 0xFC, 0x12, 0x2E, 0x2C, 0xBD, 0x12, 0x3E, 0x20, + 0x54, 0x0A, 0x40, 0x14, 0xF9, 0xF5, 0x29, 0x15, 0xB8, 0xE9, 0x90, 0x17, + 0x09, 0xF7, 0xAE, 0x14, 0x31, 0x01, 0x9D, 0x10, 0xE2, 0xFC, 0x66, 0x05, + 0x26, 0xF8, 0xE4, 0xE8, 0x46, 0x09, 0x44, 0xE2, 0x13, 0x1B, 0x42, 0xF1, + 0xCD, 0x1D, 0x37, 0xFE, 0xEE, 0x16, 0x21, 0x05, 0x58, 0x04, 0x6E, 0xFB, + 0x30, 0xEF, 0x83, 0xEA, 0x86, 0xFA, 0x16, 0xFD, 0xC6, 0x1E, 0x3B, 0x23, + 0x9A, 0x24, 0x7A, 0x23, 0x3F, 0x1D, 0x77, 0x18, 0x06, 0x33, 0xF3, 0x21, + 0x69, 0x45, 0xFC, 0x1F, 0x87, 0x3D, 0x2E, 0x16, 0x99, 0x36, 0xE5, 0x1E, + 0x09, 0x33, 0x65, 0x2A, 0x2A, 0x2B, 0x48, 0x32, 0x7D, 0x1E, 0x3E, 0x30, + 0x1D, 0x11, 0xD7, 0x1E, 0xA3, 0x0A, 0x9D, 0x14, 0xDC, 0x03, 0xF7, 0x11, + 0x93, 0xF1, 0xC7, 0xFE, 0x46, 0xE8, 0x2D, 0xF3, 0x7A, 0xF5, 0x08, 0x08, + 0x87, 0xFF, 0x3E, 0x19, 0x99, 0x09, 0x20, 0x1E, 0xAE, 0x1D, 0x1A, 0x26, + 0x65, 0x21, 0x45, 0x1E, 0x39, 0x19, 0x90, 0x0D, 0xC0, 0x25, 0x9E, 0x12, + 0x99, 0x32, 0xFA, 0x14, 0x33, 0x32, 0x85, 0x11, 0x27, 0x28, 0x23, 0x19, + 0x27, 0x19, 0xC1, 0x21, 0x6B, 0x0C, 0x64, 0x20, 0xE0, 0x01, 0xD7, 0x18, + 0xFB, 0x0D, 0x8B, 0x1E, 0x18, 0x18, 0x40, 0x1B, 0x60, 0x09, 0xA7, 0x0D, + 0x09, 0xE9, 0x19, 0xF8, 0x4F, 0xDC, 0x7A, 0xE9, 0x9C, 0xF1, 0xD0, 0xFB, + 0x69, 0x03, 0x91, 0x10, 0x11, 0x0E, 0xC7, 0x14, 0xC5, 0x07, 0x37, 0x0E, + 0xB2, 0xEA, 0x65, 0x04, 0x5E, 0xDE, 0xB5, 0x01, 0xBE, 0xFC, 0x54, 0x14, + 0x3D, 0x1F, 0xD9, 0x22, 0x94, 0x1D, 0xB4, 0x05, 0xBB, 0x1C, 0x7C, 0xF2, + 0x4F, 0x2B, 0x3B, 0x09, 0x21, 0x25, 0xB4, 0x0B, 0xA8, 0x19, 0x3C, 0xF8, + 0x94, 0x28, 0xFB, 0x01, 0x21, 0x31, 0xCC, 0x0D, 0xFB, 0x1A, 0x44, 0xFF, + 0x66, 0x06, 0x13, 0xF9, 0xA3, 0xFF, 0xFB, 0xFC, 0x2F, 0xF4, 0x97, 0xF6, + 0x0E, 0xE0, 0xC7, 0xEA, 0x48, 0xDD, 0x17, 0xE4, 0x6D, 0xF3, 0x30, 0xE6, + 0xB5, 0x08, 0xA8, 0xF7, 0xD1, 0x09, 0xF0, 0x0E, 0x8A, 0x05, 0xF1, 0x21, + 0x00, 0x07, 0x79, 0x25, 0x2A, 0x10, 0xE8, 0x16, 0x20, 0x1D, 0x38, 0x10, + 0x63, 0x1D, 0x87, 0x1F, 0x34, 0x09, 0xBC, 0x22, 0xD9, 0xF7, 0x38, 0x13, + 0x54, 0xF3, 0x71, 0x0D, 0x00, 0xE9, 0x35, 0x09, 0x93, 0xDF, 0xC5, 0xFF, + 0xA0, 0xE4, 0x07, 0xFB, 0x0D, 0xF4, 0x26, 0xF8, 0x8E, 0xEF, 0x8E, 0xE5, + 0xD9, 0xDF, 0xA0, 0xD8, 0xCB, 0xCD, 0x47, 0xC5, 0x9B, 0xCF, 0xCD, 0xB5, + 0x0E, 0xEA, 0x65, 0xC4, 0xDE, 0x01, 0x68, 0xD9, 0x74, 0x07, 0xA3, 0xDF, + 0xD6, 0xFE, 0xF4, 0xDF, 0xD1, 0xEE, 0x46, 0xD7, 0x4C, 0xDF, 0xEF, 0xCE, + 0x0E, 0xF2, 0x60, 0xF5, 0x48, 0x09, 0x9D, 0x17, 0x60, 0xF3, 0x9F, 0xFC, + 0xCE, 0xDC, 0xC7, 0xE9, 0x07, 0xEA, 0x4E, 0xFA, 0x6C, 0xED, 0x1F, 0xF6, + 0xC0, 0xE7, 0x52, 0xF5, 0x48, 0xF0, 0x5D, 0x09, 0x9D, 0xF0, 0x91, 0x0B, + 0xD2, 0xD7, 0x94, 0xF7, 0xEB, 0xC9, 0xCA, 0xE9, 0x84, 0xD1, 0x3D, 0xE3, + 0x97, 0xC6, 0x6A, 0xD0, 0xA7, 0xBA, 0xFD, 0xBB, 0x6B, 0xBD, 0xFC, 0xA4, + 0x74, 0xC4, 0x67, 0x9B, 0x02, 0xCD, 0xE7, 0xAC, 0x9E, 0xCF, 0x81, 0xC4, + 0xCF, 0xCD, 0xCA, 0xDA, 0x65, 0xCF, 0xE1, 0xE2, 0xD7, 0xE2, 0x5C, 0xDF, + 0x62, 0xFD, 0x24, 0xE8, 0xF5, 0x06, 0xAE, 0xF8, 0x43, 0xF9, 0x68, 0xF0, + 0x98, 0xE8, 0xF7, 0xDB, 0x68, 0xE0, 0x21, 0xD7, 0x76, 0xDE, 0xAE, 0xDB, + 0xA9, 0xE9, 0xFE, 0xE7, 0xD8, 0xFE, 0x1B, 0xFD, 0xB3, 0x03, 0x2F, 0xFD, + 0x81, 0xF5, 0x4C, 0xE6, 0x66, 0xE7, 0xFB, 0xDE, 0xE3, 0xCD, 0xAC, 0xD7, + 0x4A, 0xCE, 0xBC, 0xD9, 0x8F, 0xED, 0x39, 0xF2, 0x41, 0x00, 0x64, 0x0A, + 0x6E, 0xFF, 0x15, 0x09, 0xF1, 0xF1, 0x07, 0xF1, 0x3B, 0xE1, 0xB7, 0xE7, + 0xB7, 0xEA, 0xA8, 0x02, 0x6E, 0x13, 0xC3, 0x2B, 0x18, 0x23, 0xD6, 0x2D, + 0x5A, 0x16, 0x18, 0x0C, 0xB4, 0x1F, 0x3F, 0xFF, 0x11, 0x2C, 0x4F, 0x02, + 0xBB, 0x28, 0xFB, 0xFA, 0x1A, 0x35, 0xB5, 0x02, 0xF1, 0x43, 0xCF, 0x1D, + 0xF5, 0x34, 0xCB, 0x24, 0x36, 0x1C, 0x83, 0x11, 0xFC, 0x1A, 0xDE, 0x0A, + 0x84, 0x19, 0x27, 0x0F, 0xD6, 0xFF, 0x66, 0x0B, 0xD0, 0xE6, 0x57, 0x07, + 0x3E, 0xDF, 0x59, 0x01, 0xB7, 0xE9, 0x68, 0x04, 0x82, 0xFB, 0x14, 0x18, + 0x26, 0x04, 0x99, 0x2A, 0x96, 0xFE, 0xB1, 0x35, 0x2C, 0xF9, 0x13, 0x3E, + 0xF4, 0x00, 0xFC, 0x3E, 0x42, 0x0D, 0xB7, 0x3B, 0x69, 0x17, 0xEA, 0x38, + 0x85, 0x23, 0x33, 0x32, 0xF9, 0x1D, 0x0A, 0x25, 0xFB, 0x06, 0x77, 0x15, + 0x0C, 0x07, 0xBE, 0x09, 0x3B, 0x10, 0xBA, 0xFB, 0x1C, 0x12, 0x7A, 0xF7, + 0x5F, 0x0C, 0x14, 0xF0, 0x74, 0xF8, 0x07, 0xDD, 0x60, 0xE0, 0x7A, 0xCF, + 0x65, 0xDB, 0x77, 0xCB, 0xE5, 0xF1, 0x44, 0xE0, 0x59, 0xFC, 0xDA, 0xF4, + 0xBD, 0x00, 0x36, 0xF5, 0x4E, 0x0D, 0x11, 0xF2, 0xDD, 0x07, 0xEB, 0xF5, + 0x27, 0xF8, 0x10, 0xFD, 0x65, 0x0C, 0xA1, 0x13, 0x8E, 0x36, 0xFC, 0x2D, + 0x5C, 0x33, 0x29, 0x1F, 0x85, 0x13, 0xEB, 0x04, 0x08, 0x0E, 0xE3, 0x0D, + 0x0E, 0x07, 0x75, 0x0C, 0x49, 0xF9, 0xEB, 0xF9, 0x50, 0x0C, 0x25, 0x08, + 0xCB, 0x1C, 0xAD, 0x1A, 0x55, 0x0C, 0x3F, 0x0F, 0xA9, 0xF9, 0x9A, 0xFD, + 0xBD, 0xE9, 0x97, 0xF7, 0xCC, 0xCE, 0x22, 0xF6, 0xDB, 0xBF, 0x9E, 0xF2, + 0xD8, 0xC2, 0x6B, 0xE6, 0x9A, 0xC9, 0x8A, 0xD8, 0x23, 0xDA, 0xB1, 0xD5, + 0xA7, 0xEB, 0x9D, 0xDC, 0x40, 0xEA, 0x33, 0xE8, 0xF9, 0xE2, 0xA4, 0xF0, + 0x80, 0xE9, 0xEB, 0xF2, 0xA5, 0xF7, 0xCE, 0xF7, 0xD4, 0x02, 0x4C, 0x01, + 0xDA, 0x0F, 0x89, 0x0F, 0x80, 0x12, 0x93, 0x0F, 0x03, 0x05, 0x5A, 0xF6, + 0xFB, 0xF7, 0x43, 0xDF, 0xCB, 0xF6, 0x9E, 0xE3, 0xDB, 0xF3, 0x98, 0xEE, + 0x1F, 0xF0, 0x79, 0xF7, 0x38, 0xEC, 0xD9, 0xFC, 0x87, 0xDD, 0x68, 0xF6, + 0x8A, 0xC5, 0x9A, 0xEB, 0x7B, 0xBC, 0x73, 0xE8, 0xC9, 0xDD, 0xEF, 0xFC, + 0xD8, 0xFB, 0x8A, 0x12, 0x7B, 0xFD, 0x44, 0x19, 0xCA, 0xFA, 0x9D, 0x14, + 0xE5, 0xF5, 0x56, 0x08, 0x70, 0xF6, 0x9B, 0x00, 0xD7, 0x20, 0xA8, 0x18, + 0xD6, 0x45, 0x49, 0x32, 0x6B, 0x2E, 0x48, 0x1D, 0xD9, 0x11, 0xBD, 0xF9, + 0xA4, 0x14, 0xF1, 0xF6, 0x15, 0x14, 0x19, 0x00, 0xC4, 0x18, 0x27, 0xFF, + 0x8D, 0x3A, 0x88, 0x09, 0x13, 0x54, 0x70, 0x19, 0x33, 0x51, 0xB0, 0x1A, + 0x34, 0x41, 0xFF, 0x13, 0x98, 0x30, 0xF2, 0x13, 0x1C, 0x27, 0xA2, 0x15, + 0xCB, 0x21, 0x61, 0x13, 0x1B, 0x0F, 0xB5, 0x0D, 0x71, 0xFF, 0x6E, 0x12, + 0x1F, 0x03, 0xFA, 0x22, 0xBE, 0x08, 0x19, 0x30, 0x9E, 0x0A, 0xD2, 0x38, + 0x8F, 0x12, 0x68, 0x42, 0xD5, 0x1B, 0xAB, 0x42, 0x51, 0x25, 0xDA, 0x38, + 0xC0, 0x39, 0x97, 0x39, 0xB0, 0x4B, 0x50, 0x3F, 0x5D, 0x44, 0x29, 0x38, + 0xB8, 0x28, 0xF6, 0x26, 0x11, 0x1A, 0x3A, 0x1B, 0xF5, 0x1B, 0x2A, 0x15, + 0x09, 0x18, 0x87, 0x0E, 0x59, 0x18, 0xCC, 0x0C, 0xBA, 0x19, 0x9C, 0x01, + 0x13, 0x11, 0xC0, 0xF5, 0x9C, 0xFE, 0xBA, 0xEF, 0x8A, 0xFC, 0xB0, 0xF5, + 0x7C, 0x13, 0x11, 0x12, 0x53, 0x27, 0x9F, 0x2E, 0x49, 0x31, 0x7F, 0x35, + 0xC9, 0x30, 0xE3, 0x2B, 0x65, 0x22, 0xF3, 0x24, 0xAA, 0x19, 0xC1, 0x25, + 0x43, 0x30, 0x23, 0x3A, 0xA3, 0x40, 0xBF, 0x4A, 0x86, 0x1F, 0x41, 0x2E, + 0x7D, 0xF8, 0xC8, 0x0F, 0x42, 0xF8, 0x39, 0x20, 0x34, 0x03, 0xF5, 0x2B, + 0x7C, 0x0F, 0xFF, 0x1B, 0xEE, 0x28, 0x42, 0x21, 0x7E, 0x32, 0xDB, 0x34, + 0x67, 0x1C, 0xE5, 0x2A, 0xD8, 0x06, 0x7F, 0x0F, 0x49, 0xFC, 0x76, 0xFC, + 0x65, 0xF6, 0x90, 0xF5, 0xE2, 0xED, 0x93, 0xEE, 0x42, 0xD8, 0xD3, 0xD9, + 0x39, 0xCD, 0x0D, 0xCC, 0x4A, 0xD6, 0xA7, 0xD1, 0x99, 0xE0, 0x3B, 0xE0, + 0x6A, 0xEB, 0x1A, 0xF4, 0x46, 0x04, 0x96, 0x05, 0x84, 0x17, 0x76, 0xFE, + 0xDF, 0x1C, 0xE8, 0xF4, 0x42, 0x2B, 0xA0, 0x00, 0x15, 0x35, 0x98, 0x06, + 0x48, 0x24, 0x87, 0xF8, 0x02, 0x08, 0x85, 0xE6, 0xDF, 0xF7, 0x39, 0xE9, + 0x5C, 0xE7, 0xB4, 0xF5, 0x7B, 0xD5, 0xC3, 0xF2, 0x67, 0xDD, 0xE0, 0xEF, + 0xE0, 0xD6, 0xF6, 0xE4, 0x29, 0xC1, 0x32, 0xD9, 0xF4, 0xB8, 0x9F, 0xCC, + 0xE6, 0xC0, 0xF7, 0xC7, 0xAD, 0xDA, 0xE7, 0xE1, 0xC4, 0xEF, 0x8E, 0xFA, + 0x1C, 0xF3, 0x03, 0xFD, 0xA2, 0xE8, 0xE7, 0xEA, 0xF1, 0xDB, 0x3F, 0xD0, + 0x71, 0xD8, 0x7D, 0xC7, 0xF6, 0xED, 0xE3, 0xE5, 0x23, 0xFE, 0x2F, 0xFB, + 0x59, 0xE4, 0x9B, 0xD9, 0xF9, 0xCC, 0x5C, 0xBC, 0x2D, 0xE1, 0x7D, 0xCE, + 0x67, 0xF4, 0x1F, 0xD6, 0xE7, 0xF7, 0x8E, 0xCF, 0xE2, 0x01, 0x93, 0xE6, + 0x05, 0xFE, 0xD2, 0xFD, 0x75, 0xE5, 0x16, 0xF5, 0x11, 0xD3, 0xB0, 0xE0, + 0xFE, 0xD5, 0x74, 0xDB, 0x3C, 0xD9, 0xF2, 0xD4, 0x66, 0xC8, 0x96, 0xC3, + 0xB9, 0xAB, 0x31, 0xB2, 0x23, 0x9C, 0xFF, 0xA8, 0xB1, 0xA7, 0x85, 0xB3, + 0x84, 0xC0, 0x54, 0xD1, 0x31, 0xDB, 0xD7, 0xF1, 0xF1, 0xF1, 0x97, 0xFD, + 0x73, 0xEF, 0xDA, 0xF0, 0x13, 0xE3, 0x88, 0xE4, 0xF5, 0xEB, 0x6A, 0xE8, + 0x63, 0xF1, 0x2B, 0xE8, 0x9C, 0xE2, 0x1D, 0xDA, 0x22, 0xD9, 0x8D, 0xCC, + 0x5E, 0xDD, 0x2F, 0xCC, 0x91, 0xDE, 0xD0, 0xD1, 0xD5, 0xD8, 0x15, 0xCE, + 0x91, 0xDF, 0xDB, 0xD0, 0x26, 0xE1, 0xD3, 0xCF, 0x57, 0xE4, 0x55, 0xCB, + 0xF0, 0xE4, 0x8F, 0xBF, 0xAC, 0xDF, 0x1B, 0xBB, 0xF0, 0xF3, 0x22, 0xE0, + 0x8C, 0x05, 0x47, 0x04, 0xA8, 0xFC, 0xCC, 0x0C, 0xD4, 0xE6, 0x41, 0x05, + 0x26, 0xD6, 0xEC, 0xFB, 0x89, 0xD9, 0x97, 0xFF, 0x13, 0xFB, 0x52, 0x22, + 0x3B, 0x1F, 0x12, 0x3D, 0xC5, 0x19, 0x34, 0x20, 0x53, 0x00, 0x85, 0xFF, + 0x01, 0x07, 0xE4, 0x0D, 0xF9, 0x0E, 0x36, 0x19, 0x0E, 0x08, 0x22, 0x15, + 0xBC, 0x17, 0xA9, 0x2C, 0xF1, 0x2A, 0x19, 0x3E, 0x3E, 0x19, 0xDF, 0x24, + 0xFE, 0xFA, 0x68, 0xFF, 0x16, 0xFC, 0x06, 0xF0, 0x5E, 0x08, 0xA4, 0xF3, + 0x84, 0xFB, 0xA8, 0xF5, 0x2C, 0xE1, 0x33, 0xE7, 0xCE, 0xDB, 0x80, 0xD8, + 0xE6, 0xF3, 0xE0, 0xE3, 0xBA, 0x11, 0x89, 0x03, 0x98, 0x24, 0x8D, 0x1A, + 0xF1, 0x2C, 0x8C, 0x20, 0x98, 0x1F, 0x8E, 0x16, 0x3E, 0x12, 0x6F, 0x0A, + 0x17, 0x16, 0xC7, 0x09, 0xE3, 0x1A, 0x9F, 0x13, 0x08, 0x24, 0xB8, 0x1F, + 0x58, 0x2C, 0x04, 0x18, 0x8E, 0x27, 0xC2, 0x0A, 0x46, 0x19, 0xA9, 0x0E, + 0x10, 0x0F, 0xBE, 0x16, 0xB8, 0x08, 0x12, 0x16, 0x19, 0xFE, 0xDB, 0x0C, + 0x6E, 0xF9, 0x32, 0xFB, 0x68, 0xF2, 0xDE, 0xE2, 0x51, 0xEE, 0xE7, 0xDF, + 0x55, 0x01, 0x0F, 0xFE, 0xE4, 0x0A, 0xB3, 0x13, 0x93, 0x04, 0xB6, 0x13, + 0x7A, 0x00, 0x0C, 0x10, 0x26, 0xF9, 0xDA, 0x05, 0x7B, 0xED, 0x50, 0xFF, + 0x4D, 0x05, 0x00, 0x25, 0x22, 0x31, 0x84, 0x4D, 0xA6, 0x2B, 0x9D, 0x34, + 0x90, 0x14, 0x3D, 0x0B, 0x58, 0x25, 0x8F, 0x10, 0x27, 0x2E, 0xFE, 0x1B, + 0xEB, 0x1F, 0x80, 0x18, 0xD3, 0x2D, 0x35, 0x29, 0x3F, 0x3D, 0xC6, 0x34, + 0x5F, 0x29, 0x3A, 0x23, 0xF0, 0x13, 0xDD, 0x10, 0x20, 0x16, 0xBE, 0x13, + 0xD1, 0x0E, 0xDF, 0x15, 0x04, 0xF8, 0x69, 0x04, 0xF8, 0xE8, 0x20, 0xED, + 0xD7, 0xEB, 0x09, 0xE8, 0xBD, 0x06, 0x5D, 0xFA, 0x58, 0x24, 0x51, 0x11, + 0xB7, 0x2A, 0x84, 0x29, 0x64, 0x1A, 0xA3, 0x35, 0xEA, 0x06, 0x64, 0x2B, + 0xD7, 0x05, 0xE3, 0x1A, 0x64, 0x19, 0x76, 0x18, 0x6E, 0x2F, 0xFA, 0x19, + 0xFD, 0x31, 0xE8, 0x0E, 0x36, 0x23, 0x64, 0x08, 0x40, 0x16, 0xBC, 0x0A, + 0xF7, 0x15, 0xB9, 0x11, 0xBD, 0x1D, 0x19, 0x17, 0x68, 0x2B, 0xE3, 0x18, + 0x4D, 0x2E, 0xC8, 0x0B, 0x7D, 0x14, 0x95, 0xF8, 0x7E, 0xEE, 0xA7, 0xE7, + 0xB2, 0xE5, 0xED, 0xE9, 0x10, 0x02, 0x9A, 0x10, 0x86, 0x14, 0x81, 0x29, + 0x73, 0x14, 0x6C, 0x28, 0x86, 0x07, 0x7B, 0x26, 0xB6, 0xED, 0x15, 0x23, + 0xFA, 0xE0, 0xA6, 0x1B, 0x5C, 0x04, 0x1C, 0x37, 0x30, 0x30, 0x61, 0x56, + 0x0E, 0x2C, 0x93, 0x37, 0xFC, 0x14, 0xDD, 0x0C, 0x1E, 0x13, 0xF5, 0x14, + 0x18, 0x12, 0xF0, 0x1C, 0xE7, 0x07, 0x64, 0x0D, 0x41, 0x1A, 0x3F, 0x17, + 0x32, 0x30, 0xA3, 0x20, 0x12, 0x25, 0xDC, 0x06, 0x16, 0x12, 0x85, 0xF3, + 0x83, 0x0A, 0x89, 0x03, 0xAA, 0xFE, 0x59, 0x09, 0x5C, 0xF4, 0xF5, 0xF8, + 0xFC, 0xF4, 0x23, 0xF1, 0x54, 0xFB, 0xE9, 0xEA, 0x02, 0x0C, 0x46, 0xEC, + 0x5B, 0x18, 0x3D, 0xFD, 0x25, 0x17, 0x18, 0x0A, 0x73, 0x14, 0x22, 0x0D, + 0x00, 0x11, 0xB7, 0x07, 0xAC, 0x09, 0x82, 0x03, 0x31, 0x11, 0x7F, 0x07, + 0x1F, 0x22, 0x58, 0x0C, 0x2F, 0x1E, 0xFB, 0x0D, 0xD2, 0x11, 0x53, 0x07, + 0x80, 0x0D, 0xF3, 0xF8, 0x34, 0x10, 0xB8, 0xF5, 0xEC, 0x10, 0x17, 0xFB, + 0xEA, 0x11, 0x25, 0xFE, 0xDE, 0x0A, 0xE8, 0xF7, 0xDC, 0xE7, 0x34, 0xE5, + 0x99, 0xC2, 0x3F, 0xCE, 0x93, 0xB9, 0x34, 0xC4, 0xE9, 0xD0, 0x9D, 0xDB, + 0x84, 0xF2, 0xFD, 0xF5, 0x1B, 0x02, 0x58, 0x00, 0x2B, 0xEF, 0xB2, 0x00, + 0xB7, 0xD7, 0x00, 0xF8, 0x7E, 0xD5, 0x03, 0xF1, 0x19, 0xED, 0xD2, 0x02, + 0xD4, 0x10, 0xB8, 0x1C, 0xEC, 0x12, 0x11, 0x15, 0x06, 0xF3, 0x11, 0xF4, + 0x7F, 0xE7, 0x64, 0xE9, 0x13, 0xF4, 0x39, 0xF3, 0x36, 0xEA, 0x78, 0xEC, + 0x69, 0xE9, 0x4C, 0xF2, 0xD9, 0xF8, 0x66, 0x04, 0xBF, 0xEE, 0x15, 0x07, + 0xC3, 0xD3, 0xAE, 0xF5, 0x5B, 0xD2, 0x1C, 0xE7, 0x58, 0xE7, 0xC6, 0xE9, + 0xCE, 0xDC, 0xE2, 0xDB, 0x5E, 0xBA, 0x1B, 0xBB, 0x52, 0xAE, 0x63, 0xAA, + 0x18, 0xC1, 0x3E, 0xB6, 0x13, 0xD8, 0xBF, 0xC3, 0xBB, 0xE1, 0xEA, 0xC2, + 0x77, 0xE9, 0x14, 0xC1, 0x2E, 0xE7, 0x40, 0xBF, 0xE3, 0xDA, 0x80, 0xBE, + 0xBC, 0xD6, 0x54, 0xCC, 0x27, 0xE2, 0x7B, 0xDE, 0x0A, 0xF3, 0x88, 0xE2, + 0xEB, 0xFC, 0x21, 0xDD, 0xA7, 0x00, 0xEE, 0xD4, 0xFB, 0xFA, 0xC5, 0xD4, + 0x9A, 0xF0, 0x54, 0xE4, 0xE9, 0xE6, 0x4F, 0xEE, 0x46, 0xD4, 0x21, 0xE9, + 0xDD, 0xBB, 0x5C, 0xDC, 0xFF, 0xB9, 0xE1, 0xD3, 0x48, 0xB8, 0xEF, 0xC7, + 0x07, 0xC3, 0x8B, 0xD3, 0x02, 0xE6, 0x26, 0xF8, 0x71, 0xF8, 0x46, 0x02, + 0xDA, 0xF1, 0x36, 0xF7, 0x68, 0xE3, 0x83, 0xFB, 0xF8, 0xD4, 0x99, 0x01, + 0x87, 0xD7, 0x43, 0x04, 0xB8, 0xFD, 0xE1, 0x19, 0xA6, 0x1A, 0x70, 0x24, + 0x32, 0x02, 0xC1, 0x06, 0xF6, 0xEE, 0x63, 0xEE, 0xAE, 0x01, 0x65, 0xFC, + 0x72, 0x06, 0xA4, 0x05, 0x58, 0x05, 0xC7, 0x0B, 0x10, 0x11, 0x5C, 0x23, + 0x25, 0x21, 0x5D, 0x2F, 0xF2, 0x27, 0x7C, 0x1D, 0xA7, 0x22, 0xBB, 0x0B, + 0x32, 0x1B, 0xD6, 0x05, 0xD8, 0x07, 0x05, 0xF6, 0xBE, 0xEB, 0xE7, 0xDC, + 0x6E, 0xD8, 0xCE, 0xCF, 0xFD, 0xE5, 0xA6, 0xE2, 0x19, 0x0A, 0x69, 0x08, + 0xC5, 0x20, 0xC1, 0x20, 0x9B, 0x23, 0xE4, 0x23, 0x49, 0x12, 0x53, 0x1A, + 0x1E, 0xF6, 0x61, 0x12, 0x63, 0xF0, 0xE3, 0x1B, 0x58, 0x01, 0xA5, 0x2C, + 0x28, 0x11, 0x2D, 0x29, 0x82, 0x1F, 0x36, 0x14, 0xE4, 0x24, 0x3B, 0x00, + 0x5B, 0x1C, 0xC4, 0xF4, 0x50, 0x19, 0x3F, 0xFF, 0x46, 0x21, 0x66, 0x11, + 0xE0, 0x26, 0x60, 0x11, 0xF7, 0x11, 0x08, 0xF7, 0x22, 0xF5, 0x3B, 0xE5, + 0x28, 0xDB, 0xAD, 0xDC, 0x6D, 0xDE, 0xCE, 0xD9, 0x82, 0x05, 0xE4, 0xEF, + 0x92, 0x1A, 0x55, 0x0D, 0x14, 0x0E, 0x7D, 0x15, 0x6D, 0xF2, 0x9D, 0x07, + 0x25, 0xE2, 0x93, 0x01, 0xBB, 0xEC, 0xF7, 0x06, 0x15, 0x16, 0x8D, 0x20, + 0x69, 0x36, 0x40, 0x40, 0xB3, 0x25, 0x98, 0x34, 0xE4, 0x05, 0x57, 0x17, + 0xFB, 0x01, 0xCA, 0x17, 0x82, 0x02, 0xE7, 0x12, 0xD1, 0x04, 0xA6, 0x04, + 0xFE, 0x1C, 0x68, 0x0F, 0x17, 0x2F, 0x45, 0x1F, 0x34, 0x23, 0xA8, 0x15, + 0x10, 0x07, 0x5F, 0xFF, 0x3B, 0xFA, 0xB0, 0xF3, 0x83, 0xF3, 0xF7, 0xE3, + 0x68, 0xDA, 0xDE, 0xC6, 0x93, 0xC7, 0xB1, 0xAE, 0x58, 0xD2, 0xD8, 0xAD, + 0xE0, 0xE2, 0x28, 0xBF, 0x1C, 0xF0, 0x8E, 0xD4, 0x6E, 0xFD, 0x9F, 0xE4, + 0xA7, 0xFB, 0x24, 0xE4, 0x72, 0xF2, 0xC0, 0xE0, 0x9C, 0xF2, 0x09, 0xF4, + 0xF3, 0x01, 0x6A, 0x0F, 0x86, 0x0C, 0xF9, 0x13, 0xE4, 0x01, 0x70, 0x03, + 0x17, 0xFD, 0x08, 0xF7, 0xE1, 0xFA, 0xF8, 0xEF, 0x43, 0xF7, 0xFC, 0xF9, + 0x01, 0xF4, 0x3E, 0x0E, 0x62, 0xF5, 0x2A, 0x16, 0xCD, 0xE7, 0xD3, 0xFC, + 0xEC, 0xC3, 0x65, 0xDC, 0x72, 0xB5, 0x08, 0xDC, 0x38, 0xBC, 0x66, 0xDF, + 0x39, 0xD5, 0xDD, 0xEB, 0x64, 0xF2, 0x68, 0xFD, 0x9A, 0xFC, 0x1B, 0x03, + 0x07, 0xED, 0x24, 0x06, 0x05, 0xDB, 0xBC, 0x08, 0xB9, 0xE7, 0x73, 0x03, + 0x21, 0x16, 0x1A, 0x12, 0xC4, 0x34, 0x3B, 0x32, 0xE8, 0x1C, 0x80, 0x2D, + 0xFB, 0xFA, 0x84, 0x14, 0x09, 0x08, 0x74, 0x17, 0x1F, 0x22, 0xAE, 0x19, + 0x60, 0x20, 0x89, 0x10, 0x1B, 0x31, 0xF0, 0x2B, 0xED, 0x46, 0xAE, 0x3F, + 0xAD, 0x33, 0x70, 0x20, 0x8B, 0x1D, 0x90, 0x0A, 0xD5, 0x1E, 0x12, 0x16, + 0x97, 0x20, 0x38, 0x17, 0x7E, 0x1D, 0x3D, 0x04, 0xE2, 0x17, 0xE8, 0xF4, + 0x44, 0x13, 0x09, 0xF5, 0xFA, 0x0C, 0xB5, 0x02, 0x40, 0x14, 0xF2, 0x22, + 0xBD, 0x24, 0x2C, 0x37, 0x51, 0x25, 0xE1, 0x2A, 0x3B, 0x1F, 0xFA, 0x22, + 0xAC, 0x1E, 0xA2, 0x2D, 0x6F, 0x24, 0x8B, 0x38, 0x13, 0x2B, 0x24, 0x33, + 0xC9, 0x2E, 0xF7, 0x23, 0x8A, 0x2E, 0x10, 0x18, 0xD1, 0x2D, 0xFA, 0x0B, + 0x65, 0x32, 0x78, 0x05, 0x59, 0x40, 0xC0, 0x11, 0x54, 0x47, 0xA9, 0x1D, + 0x50, 0x39, 0x54, 0x1C, 0x0A, 0x0D, 0xF8, 0x05, 0x9D, 0xE8, 0xE6, 0xF2, + 0x1F, 0xE3, 0xAE, 0xEE, 0xBD, 0xF0, 0x60, 0xFA, 0xC7, 0x12, 0x15, 0x22, + 0x4C, 0x2A, 0x27, 0x3D, 0x32, 0x23, 0xA0, 0x37, 0xBD, 0x10, 0xF8, 0x29, + 0xE5, 0x07, 0x13, 0x25, 0xFD, 0x0B, 0x60, 0x32, 0x89, 0x21, 0xC8, 0x52, + 0x63, 0x33, 0x9D, 0x5F, 0x4E, 0x1C, 0xB0, 0x3A, 0xAB, 0x07, 0x4D, 0x19, + 0x60, 0x1C, 0x0C, 0x1E, 0x36, 0x22, 0xD3, 0x1B, 0x44, 0x18, 0xB9, 0x19, + 0x5F, 0x25, 0x37, 0x24, 0x74, 0x2F, 0xDD, 0x15, 0x91, 0x23, 0x51, 0xFB, + 0x8C, 0x17, 0xC8, 0xF1, 0xE0, 0x1A, 0x76, 0xF5, 0xE0, 0x0E, 0x32, 0xEE, + 0x5D, 0xEF, 0xE4, 0xD5, 0x38, 0xD6, 0xC6, 0xB6, 0x21, 0xD4, 0x45, 0xB3, + 0x1C, 0xED, 0x88, 0xDB, 0xED, 0x0B, 0x27, 0x05, 0x6B, 0x12, 0xDE, 0x0B, + 0x5A, 0x05, 0xE8, 0xFD, 0xCF, 0xFE, 0x6B, 0xF9, 0xF8, 0x01, 0x3F, 0x03, + 0x84, 0x0C, 0x33, 0x0F, 0xC4, 0x23, 0x0B, 0x1E, 0xD6, 0x2C, 0x73, 0x1E, + 0xCC, 0x16, 0x19, 0x02, 0x37, 0x01, 0x69, 0xED, 0x39, 0x05, 0xA0, 0xFE, + 0xE2, 0x06, 0x69, 0x11, 0xF9, 0xED, 0x56, 0x08, 0xB5, 0xCD, 0xE3, 0xF6, + 0x4D, 0xB4, 0x61, 0xE8, 0x5F, 0xA3, 0x4C, 0xDA, 0xA0, 0xA0, 0xC4, 0xCD, + 0xDA, 0xC2, 0x99, 0xDD, 0x95, 0xE9, 0x82, 0xF6, 0x94, 0xF3, 0xEA, 0xFD, + 0xBA, 0xF0, 0x9A, 0xFB, 0xFA, 0xEF, 0x22, 0xF6, 0xB9, 0xE2, 0x23, 0xED, + 0xCD, 0xDD, 0xA6, 0xF3, 0xC9, 0x06, 0x16, 0x15, 0xF0, 0x12, 0x50, 0x11, + 0x8E, 0xEC, 0x75, 0xDE, 0x8F, 0xE8, 0x9D, 0xC8, 0xB7, 0xF4, 0x66, 0xD8, + 0xF2, 0xE6, 0x5A, 0xE5, 0xFD, 0xF1, 0x62, 0xEF, 0x8A, 0x0C, 0xB7, 0xF4, + 0x56, 0x07, 0x3E, 0xF0, 0x41, 0xED, 0x91, 0xE9, 0x2B, 0xD4, 0x85, 0xE7, + 0x8E, 0xBF, 0x73, 0xE1, 0x8D, 0xB5, 0x36, 0xCD, 0x03, 0xB2, 0xB4, 0xB3, + 0x93, 0xA7, 0x51, 0xA5, 0x3C, 0xAC, 0x8C, 0xB2, 0x2A, 0xCA, 0x52, 0xD0, + 0x0E, 0xDE, 0x71, 0xDA, 0x9E, 0xDC, 0x3F, 0xCD, 0xBC, 0xDB, 0x43, 0xC4, + 0x7B, 0xE1, 0xFE, 0xCA, 0xD2, 0xEC, 0xB4, 0xD6, 0x46, 0xF1, 0x43, 0xD5, + 0x66, 0xEB, 0x5D, 0xD1, 0xD6, 0xD9, 0x12, 0xC8, 0x97, 0xD0, 0xC2, 0xBC, + 0xEC, 0xDE, 0xEB, 0xC1, 0xAB, 0xF1, 0x03, 0xD8, 0x3D, 0xED, 0x0A, 0xE6, + 0x62, 0xD9, 0x79, 0xE0, 0x65, 0xC8, 0x11, 0xCA, 0x5C, 0xC2, 0xFC, 0xB6, + 0x5B, 0xC7, 0xB7, 0xB6, 0x0A, 0xD2, 0xB1, 0xC3, 0x10, 0xEC, 0x65, 0xE8, + 0x30, 0xFC, 0x1E, 0x03, 0x8D, 0xF2, 0x69, 0xF8, 0x4C, 0xE2, 0x77, 0xEC, + 0xCD, 0xDC, 0xBF, 0xFE, 0xDF, 0xDA, 0x93, 0x0E, 0x43, 0xF0, 0xC2, 0x24, + 0xAB, 0x10, 0x14, 0x43, 0xA7, 0xFA, 0x1E, 0x2A, 0x3D, 0xDA, 0xB6, 0x04, + 0xCE, 0xEB, 0x88, 0x11, 0x16, 0xFE, 0x22, 0x13, 0x19, 0x03, 0xE8, 0xFA, + 0xD1, 0x18, 0x3A, 0x00, 0xAF, 0x21, 0xD7, 0x08, 0x58, 0x0D, 0xCC, 0xF4, + 0x53, 0x03, 0xB5, 0xE5, 0x2B, 0x16, 0x75, 0xED, 0x66, 0x29, 0x3E, 0xF7, + 0x62, 0x1B, 0x69, 0xEF, 0x89, 0xF5, 0x6F, 0xD7, 0x70, 0xD5, 0xEF, 0xC3, + 0x04, 0xDC, 0xB8, 0xD9, 0xD6, 0xF9, 0x54, 0x02, 0x90, 0x09, 0xB3, 0x0E, + 0x40, 0x12, 0x5C, 0x0A, 0xAE, 0x10, 0xFF, 0x04, 0x02, 0x12, 0x81, 0x0F, + 0x80, 0x1A, 0xE8, 0x21, 0xFD, 0x1D, 0x23, 0x2A, 0xF0, 0x25, 0x78, 0x33, + 0x90, 0x28, 0x12, 0x37, 0x21, 0x1C, 0x65, 0x2D, 0xA0, 0x0F, 0x9D, 0x21, + 0xEA, 0x12, 0x4B, 0x25, 0x15, 0x16, 0x7F, 0x25, 0xE0, 0x09, 0x39, 0x0E, + 0xCE, 0xF1, 0xC7, 0xF5, 0x5A, 0xE2, 0x41, 0xE8, 0x1F, 0xE1, 0x5E, 0xDB, + 0x04, 0xE6, 0xBB, 0xDE, 0xD8, 0xFB, 0x79, 0x02, 0x72, 0x14, 0xA5, 0x1F, + 0xD7, 0x17, 0x36, 0x20, 0x8D, 0x18, 0xE0, 0x1E, 0x5B, 0x19, 0xCD, 0x1E, + 0x96, 0x0F, 0x85, 0x1B, 0xA5, 0x22, 0x4F, 0x36, 0x60, 0x3F, 0xAC, 0x50, + 0x4A, 0x33, 0x81, 0x36, 0x53, 0x2A, 0x73, 0x1D, 0xD7, 0x47, 0x69, 0x2E, + 0x15, 0x46, 0xA8, 0x2B, 0x61, 0x20, 0xBE, 0x14, 0xEA, 0x20, 0x8D, 0x23, + 0xD7, 0x2B, 0x68, 0x2C, 0x16, 0x20, 0x27, 0x16, 0x35, 0x24, 0x4A, 0x12, + 0xE5, 0x2F, 0xB1, 0x18, 0x51, 0x1C, 0xCF, 0x0A, 0x37, 0xF8, 0xB1, 0xF6, + 0x68, 0xD7, 0x79, 0xE1, 0xF6, 0xCD, 0x41, 0xD8, 0x6B, 0xEA, 0x1C, 0xF2, + 0x93, 0x0E, 0xFC, 0x0E, 0x3E, 0x1E, 0x3A, 0x13, 0xDC, 0x1F, 0x84, 0x11, + 0x91, 0x19, 0x1E, 0x11, 0x5D, 0x14, 0x13, 0x0E, 0x8F, 0x20, 0x5A, 0x17, + 0x9B, 0x28, 0xFA, 0x28, 0x36, 0x25, 0x3F, 0x32, 0xEB, 0x23, 0xCC, 0x2A, + 0x01, 0x20, 0x24, 0x18, 0x7A, 0x15, 0x70, 0x08, 0x3D, 0x17, 0x5B, 0x0C, + 0xB6, 0x16, 0x7F, 0x19, 0xEF, 0xFD, 0x36, 0x10, 0x7D, 0xE2, 0xDF, 0xF0, + 0xC4, 0xDD, 0xA9, 0xE2, 0xDD, 0xE5, 0x96, 0xF0, 0xA1, 0xF0, 0x1F, 0x06, + 0xFC, 0x07, 0x84, 0x1D, 0x56, 0x18, 0xF9, 0x2D, 0x24, 0x0F, 0x04, 0x2A, + 0x6C, 0xFA, 0xCF, 0x1E, 0x71, 0xF4, 0x00, 0x21, 0x91, 0x07, 0xE2, 0x27, + 0xFA, 0x30, 0x83, 0x37, 0xFB, 0x3F, 0x8E, 0x40, 0xA9, 0x18, 0x9D, 0x1A, + 0xC0, 0xF8, 0x85, 0xEA, 0xD1, 0x05, 0x64, 0xF0, 0x5F, 0x0D, 0x80, 0x00, + 0xF4, 0x10, 0x36, 0xFF, 0x48, 0x32, 0xE7, 0x0B, 0x6A, 0x3F, 0x13, 0x0C, + 0x1D, 0x34, 0x9C, 0xFD, 0x94, 0x27, 0x5C, 0xFD, 0x7C, 0x1C, 0xAC, 0x10, + 0xAE, 0x12, 0x11, 0x1D, 0x8D, 0xFA, 0x24, 0x07, 0x74, 0xD6, 0x9B, 0xDB, + 0x6B, 0xD2, 0x1E, 0xCA, 0xCF, 0xF7, 0xE8, 0xE4, 0x6E, 0x15, 0xA0, 0x04, + 0xAA, 0x1C, 0xC3, 0x13, 0x6F, 0x14, 0x75, 0x19, 0x0F, 0x08, 0x74, 0x17, + 0x9A, 0x0E, 0xDE, 0x1D, 0x46, 0x26, 0xF4, 0x31, 0x37, 0x33, 0x6A, 0x3C, + 0xC1, 0x2C, 0xDF, 0x37, 0x81, 0x19, 0x88, 0x22, 0xA6, 0xFD, 0x5F, 0xFE, + 0xA8, 0xEC, 0x37, 0xEE, 0x90, 0xF7, 0x92, 0x03, 0x33, 0xF5, 0x9C, 0x0A, + 0x83, 0xE2, 0xA5, 0x00, 0xCA, 0xD8, 0x94, 0xEA, 0xB9, 0xD6, 0xDA, 0xCC, + 0x84, 0xE1, 0x32, 0xD3, 0x7E, 0xEC, 0x2D, 0xF0, 0x99, 0xF7, 0x98, 0x09, + 0x19, 0xFD, 0xF1, 0x16, 0x18, 0xFB, 0xDC, 0x14, 0xEF, 0xFC, 0x22, 0x09, + 0x9D, 0xFB, 0x32, 0xFD, 0xAE, 0xF8, 0x7C, 0xFA, 0xA2, 0x04, 0x76, 0x11, + 0xDA, 0x03, 0x20, 0x1C, 0x52, 0xE9, 0x96, 0xF7, 0x95, 0xE7, 0xFC, 0xDE, + 0xB4, 0x07, 0xB3, 0xF9, 0xB7, 0x0B, 0x0E, 0xFF, 0xBD, 0xFA, 0x7D, 0xE5, + 0x8C, 0x09, 0x66, 0xED, 0xED, 0x13, 0x85, 0xF7, 0xF3, 0x03, 0x77, 0xF2, + 0xBC, 0xEF, 0x01, 0xF1, 0x49, 0xD9, 0x91, 0xE9, 0xFD, 0xC9, 0x1A, 0xDA, + 0xD6, 0xC0, 0x75, 0xC5, 0x75, 0xAB, 0x7E, 0xAA, 0xA8, 0xA1, 0x90, 0xA6, + 0x92, 0xBD, 0xB1, 0xC3, 0xFE, 0xDF, 0x52, 0xE1, 0x87, 0xF1, 0xEA, 0xF2, + 0x6F, 0xF0, 0xAE, 0xEB, 0xFF, 0xE9, 0x60, 0xD2, 0x99, 0xF6, 0xB0, 0xD2, + 0xBF, 0x0B, 0x26, 0xF3, 0x0F, 0x04, 0xA6, 0xF7, 0x64, 0xF7, 0xD3, 0xE5, + 0x3A, 0xF3, 0x3E, 0xD5, 0xF8, 0xDE, 0xB5, 0xC1, 0xC5, 0xCB, 0xCA, 0xC2, + 0x4B, 0xD4, 0x7D, 0xE0, 0x06, 0xE4, 0xBC, 0xF6, 0xCC, 0xDF, 0xA8, 0xF1, + 0xFD, 0xD2, 0x35, 0xE4, 0xDB, 0xC6, 0x71, 0xD2, 0xB9, 0xCD, 0x0D, 0xD3, + 0x2F, 0xDC, 0xC9, 0xDE, 0xEB, 0xE8, 0xDE, 0xEB, 0xE7, 0xF2, 0xA3, 0xF3, + 0x9C, 0xEC, 0xFE, 0xE8, 0x10, 0xE3, 0x56, 0xDA, 0x59, 0xE8, 0x80, 0xE0, + 0xE7, 0xE8, 0x2F, 0xF0, 0xFA, 0xF6, 0x1E, 0x05, 0xC2, 0x1E, 0x13, 0x1B, + 0xAB, 0x1B, 0x1B, 0x09, 0x12, 0xEE, 0xE8, 0xE6, 0xB8, 0xF3, 0xD2, 0xF7, + 0x6B, 0x15, 0xD4, 0x14, 0xA3, 0x0E, 0xE2, 0x06, 0xF2, 0x0F, 0x9B, 0x03, + 0x04, 0x22, 0x3D, 0x11, 0xF7, 0x0F, 0x93, 0x07, 0x93, 0xF8, 0x44, 0x00, + 0x15, 0x01, 0x89, 0x0C, 0xF8, 0x09, 0x26, 0x0E, 0xC0, 0x03, 0x21, 0xFB, + 0xC0, 0xEE, 0xFA, 0xE3, 0xEC, 0xD4, 0xBD, 0xD7, 0x3F, 0xDD, 0x2C, 0xE9, + 0xB0, 0xFB, 0x7F, 0x07, 0xF4, 0x0E, 0x19, 0x1E, 0xA1, 0x11, 0xD1, 0x1D, + 0xF1, 0x00, 0x23, 0x01, 0xEA, 0xF2, 0xA0, 0xF0, 0x3D, 0x08, 0x3E, 0x11, + 0x5A, 0x1F, 0x6B, 0x31, 0x00, 0x19, 0xC7, 0x29, 0x49, 0x14, 0x72, 0x26, + 0xB2, 0x10, 0x4E, 0x1F, 0x52, 0x02, 0xD6, 0x05, 0x87, 0x04, 0xF5, 0x09, + 0xCC, 0x19, 0xCA, 0x28, 0x3A, 0x1C, 0xDC, 0x22, 0xEF, 0x0C, 0x51, 0x04, + 0x50, 0xFA, 0x24, 0xE9, 0x05, 0xF7, 0x93, 0xDD, 0x95, 0xFF, 0x0E, 0xE8, + 0xDC, 0x06, 0x0C, 0xFC, 0x4A, 0x11, 0x4C, 0x10, 0x6A, 0x16, 0xC1, 0x1D, + 0xAA, 0x07, 0x32, 0x17, 0x7D, 0xFB, 0x92, 0x0A, 0xAD, 0xFE, 0x75, 0x0E, + 0x06, 0x14, 0x7D, 0x1A, 0x1E, 0x3E, 0x72, 0x2A, 0x58, 0x3D, 0x8A, 0x22, + 0x1B, 0x09, 0xBD, 0xFE, 0x98, 0xF3, 0x07, 0xF4, 0x19, 0x0A, 0x49, 0x0B, + 0x68, 0x0D, 0xC3, 0x08, 0xBF, 0x11, 0xFD, 0xFE, 0xD7, 0x22, 0x3B, 0x0B, + 0x5B, 0x0C, 0xDA, 0x02, 0x3D, 0xE8, 0x75, 0xF2, 0x07, 0xE5, 0x8B, 0xEE, + 0xF8, 0xEE, 0x52, 0xE5, 0x87, 0xED, 0x5B, 0xDA, 0x60, 0xE2, 0x28, 0xD4, + 0x3C, 0xCE, 0x1C, 0xC5, 0x80, 0xCE, 0x1C, 0xC7, 0xF3, 0xE6, 0xF3, 0xE3, + 0x5C, 0xED, 0x27, 0xEF, 0xB4, 0xE1, 0xFB, 0xEB, 0xF4, 0xD5, 0xF5, 0xED, + 0xC7, 0xD0, 0x63, 0xF3, 0xFE, 0xE2, 0x9C, 0x05, 0xBD, 0xFE, 0x28, 0x1F, + 0x5F, 0x01, 0x61, 0x20, 0x00, 0xF6, 0x46, 0x0B, 0x36, 0xEE, 0xB1, 0xEE, + 0x9D, 0xE6, 0xED, 0xD6, 0x8F, 0xE1, 0x12, 0xD9, 0xFE, 0xEB, 0x62, 0xEE, + 0x6A, 0xF2, 0xBE, 0xE5, 0x3E, 0xEF, 0xA8, 0xC6, 0x67, 0xDE, 0x78, 0xB3, + 0x53, 0xCC, 0xED, 0xB5, 0x6E, 0xD4, 0xB0, 0xCD, 0xB5, 0xE2, 0x29, 0xE3, + 0x80, 0xF5, 0x88, 0xF9, 0x6A, 0x0B, 0x63, 0x0D, 0x23, 0x0A, 0xE9, 0x0B, + 0x27, 0x02, 0x29, 0x06, 0xC9, 0x0D, 0xD8, 0x0C, 0x2C, 0x14, 0x2A, 0x16, + 0xCB, 0x1C, 0xB1, 0x2D, 0xEA, 0x22, 0x95, 0x3A, 0xFC, 0x0B, 0x0E, 0x1A, + 0xDA, 0x05, 0x82, 0x07, 0x10, 0x30, 0x1D, 0x2B, 0xEB, 0x38, 0x0B, 0x32, + 0x9E, 0x1E, 0xFA, 0x18, 0x37, 0x28, 0xFE, 0x26, 0x5F, 0x2A, 0x65, 0x33, + 0xF0, 0x18, 0x79, 0x29, 0xA4, 0x21, 0x07, 0x27, 0x21, 0x34, 0x9D, 0x21, + 0x11, 0x28, 0x83, 0x0A, 0xFA, 0x0F, 0xED, 0xF2, 0x53, 0xF9, 0xDD, 0xE2, + 0x9F, 0xEF, 0x4D, 0xEC, 0x0F, 0x03, 0xE9, 0x14, 0x3D, 0x18, 0x9C, 0x34, + 0x0E, 0x1E, 0x18, 0x3F, 0xB1, 0x18, 0x74, 0x37, 0x3A, 0x18, 0x33, 0x25, + 0xC5, 0x2D, 0x22, 0x29, 0xEF, 0x44, 0x11, 0x41, 0xC4, 0x3A, 0xB9, 0x3E, + 0x43, 0x33, 0xAD, 0x2F, 0x87, 0x36, 0xFE, 0x22, 0xD1, 0x24, 0xA4, 0x0D, + 0x62, 0x1A, 0xEB, 0x0E, 0x3A, 0x28, 0xA5, 0x28, 0x6E, 0x27, 0xAE, 0x2B, + 0xB3, 0x11, 0x62, 0x1B, 0x31, 0xFC, 0x2F, 0x0F, 0xBD, 0xF0, 0x3C, 0x09, + 0xE4, 0xF8, 0xE2, 0x10, 0x96, 0x08, 0x3F, 0x21, 0xA2, 0x1C, 0x85, 0x35, + 0x2D, 0x2A, 0xD4, 0x3E, 0x3F, 0x23, 0x20, 0x32, 0x3A, 0x11, 0x50, 0x19, + 0x06, 0x16, 0x33, 0x11, 0xB8, 0x2C, 0x1A, 0x19, 0xA6, 0x47, 0x6E, 0x2D, + 0xC2, 0x52, 0xE5, 0x3C, 0x23, 0x27, 0xCD, 0x1C, 0x67, 0xF7, 0x8A, 0xF5, + 0x3D, 0x05, 0x9E, 0x03, 0x5E, 0x22, 0x7D, 0x16, 0x37, 0x26, 0x92, 0x0D, + 0xDA, 0x32, 0xC8, 0x19, 0x47, 0x33, 0x1D, 0x23, 0xD0, 0x16, 0x1C, 0x0F, + 0x10, 0x08, 0x27, 0x0B, 0x13, 0x08, 0xD9, 0x10, 0x57, 0x04, 0xEA, 0x01, + 0x47, 0x05, 0xB5, 0xF3, 0xDC, 0xF5, 0x84, 0xE2, 0xEB, 0xD0, 0xB9, 0xD1, + 0xD7, 0xCE, 0x67, 0xF1, 0x5D, 0xE6, 0x9F, 0x1B, 0x0E, 0xF4, 0xBF, 0x1A, + 0xCC, 0x05, 0xDC, 0x0E, 0x52, 0x13, 0x6F, 0x08, 0x5F, 0x0D, 0x81, 0xFE, + 0xCD, 0x0F, 0x56, 0x03, 0x77, 0x15, 0x60, 0x01, 0xDC, 0x09, 0x3E, 0xE7, + 0xF2, 0xFB, 0x92, 0xD7, 0x0E, 0xEB, 0xE9, 0xD2, 0x8B, 0xDE, 0x91, 0xD0, + 0x17, 0xE8, 0x54, 0xE1, 0x35, 0xF2, 0x35, 0xF3, 0xF6, 0xE8, 0x77, 0xE8, + 0xE9, 0xE3, 0x8C, 0xD3, 0x46, 0xDA, 0x47, 0xBE, 0x54, 0xCD, 0xB3, 0xBD, + 0x76, 0xCC, 0x09, 0xD9, 0x9F, 0xD1, 0x4D, 0xF2, 0x9C, 0xDE, 0x23, 0xFA, + 0x81, 0xF2, 0x7F, 0xF4, 0x01, 0xFF, 0xF7, 0xEB, 0xBB, 0xF7, 0x2B, 0xE9, + 0xB8, 0xE2, 0x09, 0xEE, 0x31, 0xD1, 0x93, 0xF7, 0x9A, 0xE1, 0x29, 0x13, + 0xCF, 0xE5, 0x79, 0x13, 0x63, 0xBF, 0x70, 0xE5, 0x75, 0xC2, 0x27, 0xDF, + 0x9A, 0xEF, 0xBA, 0x00, 0xD9, 0xEB, 0x4A, 0xF7, 0x1B, 0xD9, 0x70, 0xE7, + 0x2F, 0xE9, 0x98, 0xF4, 0xC0, 0xDF, 0x15, 0xD9, 0x84, 0xD3, 0x70, 0xB7, + 0x4F, 0xE9, 0xCF, 0xC4, 0x7F, 0xE5, 0x71, 0xC4, 0x4D, 0xCA, 0x3E, 0xAD, + 0xD7, 0xC0, 0x27, 0xA7, 0x97, 0xAE, 0xFA, 0x9E, 0x57, 0xA1, 0x20, 0xA1, + 0x65, 0xC4, 0x1D, 0xCD, 0x8E, 0xE4, 0xEF, 0xEB, 0xDA, 0xE6, 0xEC, 0xEA, + 0x84, 0xE9, 0xC1, 0xEA, 0xDD, 0xE7, 0xD2, 0xDE, 0x67, 0xF1, 0x07, 0xDA, + 0xB8, 0x06, 0x07, 0xEF, 0x7E, 0xF6, 0x7E, 0xF2, 0x5A, 0xD4, 0x3B, 0xE6, + 0xE7, 0xCC, 0x12, 0xE3, 0x09, 0xDA, 0xF9, 0xE4, 0xB1, 0xF3, 0xCC, 0xF2, + 0xA4, 0x15, 0x63, 0x0B, 0xB3, 0x1C, 0xC2, 0x05, 0x7F, 0xFC, 0xB1, 0xDC, + 0x74, 0xD7, 0xC5, 0xC1, 0xA6, 0xB1, 0x1A, 0xB7, 0x8A, 0xAC, 0x22, 0xC8, + 0x0E, 0xC7, 0x88, 0xE2, 0xC7, 0xE5, 0xD7, 0xF1, 0x5D, 0xFD, 0x16, 0xFE, + 0x46, 0xFB, 0xEE, 0xF9, 0x3C, 0xEB, 0x5B, 0xEA, 0xC9, 0xE4, 0xD2, 0xE7, + 0xE7, 0xEC, 0x81, 0xFB, 0x69, 0x00, 0xB7, 0x19, 0x7E, 0x22, 0xA2, 0x37, + 0xD9, 0x25, 0x1C, 0x29, 0x09, 0x06, 0x0D, 0xFD, 0x92, 0x0C, 0xFA, 0x0A, + 0x12, 0x22, 0xBF, 0x2D, 0x81, 0x0F, 0x68, 0x17, 0x1C, 0x06, 0xC9, 0xFF, + 0x6D, 0x0B, 0x1D, 0x03, 0xB0, 0xF7, 0x3C, 0xFB, 0xE1, 0xEB, 0xE9, 0xFB, + 0xE3, 0xF8, 0x81, 0x0E, 0x2F, 0xFB, 0x3C, 0x13, 0xBF, 0xF2, 0xAB, 0x0F, + 0x53, 0xE4, 0x37, 0x01, 0xE7, 0xCC, 0xC7, 0xDE, 0x6F, 0xDA, 0x28, 0xE1, + 0xB9, 0x06, 0xA2, 0x0A, 0xA8, 0x16, 0xDB, 0x16, 0xB1, 0x1B, 0xAA, 0x0B, + 0x60, 0x22, 0x09, 0xFB, 0x9C, 0x11, 0x21, 0xDD, 0xDE, 0x0C, 0x6A, 0xE0, + 0xF1, 0x1B, 0x46, 0x04, 0xC3, 0x1B, 0xA1, 0x0D, 0x6A, 0x26, 0x2F, 0x0A, + 0x1D, 0x41, 0xEA, 0x0F, 0xA8, 0x3D, 0xB9, 0x0A, 0x9E, 0x28, 0xD9, 0x0A, + 0x0C, 0x28, 0xE8, 0x1F, 0x59, 0x1F, 0xC4, 0x1E, 0x3E, 0x04, 0xAD, 0x02, + 0xB9, 0xEF, 0x71, 0xEE, 0x73, 0xDD, 0x4B, 0xE1, 0xAD, 0xE2, 0x0E, 0xEC, + 0xF9, 0xF9, 0x8F, 0x08, 0x13, 0x10, 0xE0, 0x29, 0xEF, 0x1D, 0x89, 0x47, + 0x36, 0x1E, 0x2E, 0x54, 0x38, 0x1A, 0x58, 0x4B, 0x79, 0x20, 0xBD, 0x3C, + 0x64, 0x26, 0x75, 0x31, 0x87, 0x2D, 0x77, 0x2E, 0xF6, 0x3A, 0xF2, 0x35, + 0xF5, 0x1F, 0xC1, 0x20, 0xEE, 0xF2, 0x50, 0x00, 0x10, 0xFD, 0xC4, 0x12, + 0xA7, 0x1C, 0xF6, 0x2C, 0xC1, 0x16, 0xCB, 0x11, 0xD8, 0x1A, 0x30, 0x01, + 0xA7, 0x2D, 0x9C, 0x0E, 0x2B, 0x26, 0x7E, 0x0F, 0xA8, 0x1A, 0x96, 0x14, + 0x78, 0x14, 0x50, 0x1E, 0x6F, 0x0D, 0x88, 0x14, 0xE4, 0x14, 0xF1, 0x04, + 0xB0, 0x10, 0xA7, 0xF4, 0xB4, 0xEF, 0xC6, 0xE2, 0x62, 0xEB, 0x67, 0xF1, + 0xCA, 0x03, 0x53, 0x0D, 0x2F, 0x0B, 0x2C, 0x11, 0x77, 0x11, 0xA1, 0x1C, + 0x57, 0x14, 0x6D, 0x27, 0xB2, 0x05, 0xAC, 0x19, 0xC7, 0x16, 0xFD, 0x2B, + 0xAD, 0x34, 0xF5, 0x48, 0x13, 0x29, 0xBD, 0x33, 0x0D, 0x1D, 0x39, 0x1C, + 0x5D, 0x23, 0x00, 0x17, 0x26, 0x21, 0x1D, 0x09, 0xF3, 0x24, 0x7D, 0x05, + 0x0B, 0x2F, 0xB1, 0x12, 0x97, 0x0C, 0xD1, 0xFC, 0xFF, 0xDC, 0xAB, 0xDB, + 0x41, 0xCB, 0xE8, 0xD9, 0xE6, 0xCF, 0xD6, 0xE7, 0x11, 0xF0, 0x35, 0x04, + 0x0D, 0x0B, 0x3B, 0x17, 0xC1, 0x19, 0xE4, 0x1A, 0xB6, 0x24, 0x83, 0x21, + 0x6E, 0x23, 0x9A, 0x24, 0x99, 0x22, 0xCB, 0x1A, 0xB8, 0x29, 0x4A, 0x18, + 0x77, 0x22, 0xD5, 0x18, 0xAE, 0x1E, 0xF3, 0x18, 0x6E, 0x2B, 0x3B, 0x1F, + 0xB1, 0x13, 0x8F, 0x08, 0xB7, 0xF6, 0x7D, 0xF9, 0x09, 0x17, 0xB7, 0x2B, + 0x39, 0x28, 0xBB, 0x47, 0xAA, 0x0E, 0x46, 0x2D, 0x2A, 0x1A, 0x6D, 0x2D, + 0xFD, 0x2E, 0x70, 0x31, 0xBE, 0x21, 0x85, 0x19, 0x9D, 0x15, 0x71, 0x16, + 0x1A, 0x0E, 0x8E, 0x1B, 0xF5, 0xFA, 0x1C, 0x03, 0xC3, 0xE9, 0x52, 0xEE, + 0x57, 0xD1, 0xBF, 0xD9, 0xEE, 0xC3, 0x8F, 0xC3, 0xD5, 0xF0, 0xE0, 0xDD, + 0x18, 0x2A, 0x7D, 0xFB, 0x4B, 0x3B, 0x18, 0xF6, 0x00, 0x33, 0xEF, 0xF6, + 0x27, 0x14, 0x8B, 0xF0, 0x2F, 0xFF, 0x67, 0xEB, 0x77, 0x1E, 0xD4, 0x0F, + 0x9B, 0x3C, 0xC2, 0x2C, 0x44, 0x2A, 0xD6, 0x1A, 0x0D, 0x19, 0x7A, 0x0A, + 0xA1, 0x07, 0x0D, 0xFA, 0x9B, 0xE4, 0x3D, 0xE0, 0xFE, 0xDB, 0x11, 0xF0, + 0x63, 0xE8, 0xB3, 0x1C, 0x08, 0xE1, 0x5C, 0x20, 0x7F, 0xD1, 0xA2, 0x07, + 0x73, 0xC9, 0x2E, 0xF8, 0xA5, 0xCD, 0xFE, 0xEE, 0xD0, 0xE5, 0x45, 0xF3, + 0x2C, 0xED, 0x15, 0xF3, 0x9F, 0xEE, 0x4C, 0xF7, 0x8E, 0xFF, 0xA9, 0x00, + 0x3D, 0x00, 0x78, 0xF0, 0xC4, 0xE8, 0xF4, 0xDF, 0x2C, 0xDC, 0x71, 0xF0, + 0x92, 0xD5, 0xC5, 0xF2, 0x15, 0xDB, 0x01, 0xE7, 0x1B, 0xF7, 0x46, 0xF5, + 0x2E, 0xEE, 0x13, 0xED, 0x65, 0xCD, 0xF3, 0xCC, 0x3C, 0xEA, 0xD9, 0xE6, + 0x1E, 0x15, 0xF8, 0x0D, 0x2D, 0x06, 0x95, 0xF6, 0xDE, 0xF8, 0x98, 0xE2, + 0xEA, 0xFC, 0xF3, 0xDB, 0xF3, 0xF5, 0x57, 0xC5, 0xB7, 0xEB, 0xE0, 0xC0, + 0xFF, 0xE2, 0xFF, 0xCA, 0x7A, 0xD6, 0xEA, 0xCB, 0x60, 0xD8, 0x01, 0xD1, + 0x6B, 0xE5, 0x74, 0xCB, 0x78, 0xDC, 0x61, 0xB3, 0x85, 0xDC, 0xFD, 0xC3, + 0xB5, 0xE6, 0x55, 0xE5, 0x55, 0xDC, 0x54, 0xE1, 0x6A, 0xD9, 0x10, 0xDB, + 0x14, 0xDD, 0xFD, 0xE6, 0x1E, 0xD9, 0x08, 0xF0, 0xA3, 0xE8, 0xCA, 0xFF, + 0x96, 0xF3, 0x54, 0x0A, 0xF2, 0xDF, 0xDD, 0xF3, 0x2A, 0xE0, 0xE1, 0xDC, + 0xF7, 0xEC, 0x93, 0xD0, 0x9E, 0xE0, 0x66, 0xC7, 0xDA, 0xD9, 0x04, 0xDD, + 0x6C, 0xF1, 0x87, 0x02, 0x7A, 0xFA, 0xC3, 0xFE, 0xD5, 0xE7, 0xD6, 0xDF, + 0x66, 0xD3, 0xCC, 0xCA, 0xD5, 0xC7, 0xCB, 0xC1, 0xCD, 0xDD, 0xD1, 0xD7, + 0x01, 0xED, 0x5E, 0xE8, 0x2B, 0xE6, 0xF1, 0xEC, 0x99, 0xE7, 0x73, 0x02, + 0x63, 0xE3, 0xD7, 0x10, 0xD5, 0xDB, 0x4F, 0x0F, 0xF3, 0xEF, 0x20, 0x25, + 0xC1, 0x04, 0x92, 0x36, 0x22, 0x08, 0x53, 0x20, 0xAE, 0x1E, 0x7B, 0x22, + 0x9B, 0x22, 0xB9, 0x20, 0x98, 0x09, 0x76, 0xF6, 0x6D, 0x12, 0xDE, 0xF8, + 0x28, 0x2C, 0x4F, 0x1C, 0x0D, 0x13, 0x87, 0x01, 0xB1, 0xF3, 0x35, 0xDE, + 0x19, 0xFC, 0xDC, 0xE3, 0x49, 0x02, 0xD9, 0xE8, 0x5D, 0x04, 0xBC, 0xF7, + 0x01, 0x08, 0x67, 0x07, 0xFC, 0x08, 0x22, 0xFC, 0x90, 0x0C, 0xEB, 0xEB, + 0xDE, 0x03, 0xA9, 0xEB, 0x41, 0xE7, 0xB5, 0xE9, 0x3F, 0xE9, 0x15, 0xF8, + 0x3E, 0x14, 0x99, 0x1D, 0x2A, 0x2A, 0x0C, 0x21, 0xD2, 0x21, 0xF1, 0x09, + 0x5D, 0x17, 0x9A, 0x01, 0x65, 0x13, 0x5C, 0x0A, 0x20, 0x19, 0xE3, 0x27, + 0x0E, 0x26, 0x48, 0x44, 0xE6, 0x26, 0xFB, 0x38, 0x93, 0x1E, 0x3F, 0x1E, + 0x52, 0x17, 0xA9, 0x10, 0xA1, 0x03, 0xF1, 0x05, 0x21, 0xF4, 0x71, 0x0B, + 0x84, 0xFF, 0x41, 0x23, 0x43, 0x0F, 0xA0, 0x2C, 0x41, 0xF9, 0xD8, 0x12, + 0xD8, 0xD2, 0x29, 0xF3, 0x4F, 0xC9, 0x41, 0xDD, 0x01, 0xE0, 0x31, 0xE1, + 0xD4, 0xF2, 0x8F, 0xF7, 0xB8, 0xF1, 0x74, 0xF8, 0x4F, 0xF7, 0x5B, 0xFC, + 0xA4, 0x01, 0x2B, 0x09, 0x24, 0x0C, 0x40, 0x0B, 0x28, 0x15, 0xB7, 0x13, + 0xE4, 0x17, 0x96, 0x16, 0x4B, 0x15, 0x71, 0xFB, 0xBE, 0x19, 0xAF, 0xF4, + 0xD2, 0x11, 0xD5, 0x01, 0x62, 0xE9, 0xE9, 0xE7, 0x94, 0xDD, 0x6A, 0xD5, + 0x81, 0x03, 0x46, 0xF3, 0x34, 0x05, 0x78, 0xF7, 0x97, 0xDF, 0x46, 0xDF, + 0x4A, 0xD9, 0xA1, 0xEA, 0x53, 0xE6, 0xDB, 0xF9, 0x08, 0xEE, 0x96, 0xF5, + 0x94, 0xFC, 0xAF, 0xFB, 0xA4, 0x06, 0x63, 0xF9, 0xBB, 0xFA, 0xC5, 0xE5, + 0xD7, 0xE3, 0x99, 0xDB, 0x1A, 0xC1, 0x58, 0xCB, 0x81, 0xAB, 0xC5, 0xBE, + 0x95, 0xCB, 0x12, 0xD3, 0x71, 0xF1, 0xC5, 0xE1, 0x28, 0xE9, 0xE8, 0xDC, + 0xFF, 0xD7, 0x8A, 0xE0, 0x75, 0xDC, 0x63, 0xE3, 0xC2, 0xEE, 0xF4, 0xE8, + 0x9B, 0x0A, 0x69, 0x0C, 0x8C, 0x17, 0x24, 0x25, 0x82, 0x06, 0x7C, 0x10, + 0xCF, 0xFE, 0xDB, 0x04, 0xF4, 0x06, 0x1E, 0x06, 0xE5, 0x04, 0xF9, 0xFD, + 0x8C, 0x09, 0x78, 0x0B, 0xE7, 0x17, 0x83, 0x17, 0x5E, 0x0C, 0x5F, 0x0D, + 0x87, 0xE0, 0x40, 0xFB, 0x41, 0xCA, 0x9B, 0xEE, 0x31, 0xD6, 0x24, 0xF4, + 0x8B, 0xFD, 0x46, 0x15, 0x81, 0x25, 0x94, 0x26, 0x6B, 0x26, 0xE2, 0x15, + 0x85, 0x18, 0x84, 0x1A, 0x63, 0x11, 0xFE, 0x23, 0x78, 0x0E, 0xD3, 0x15, + 0x5A, 0x1A, 0xFE, 0x19, 0x34, 0x2F, 0x36, 0x25, 0x11, 0x39, 0xB7, 0x14, + 0x10, 0x4A, 0x65, 0x16, 0xD1, 0x50, 0xE5, 0x1E, 0xBB, 0x2B, 0xFA, 0x04, + 0xE1, 0x10, 0xDC, 0x04, 0x3B, 0x26, 0x0D, 0x32, 0xDE, 0x28, 0xCD, 0x39, + 0x0D, 0x18, 0xCC, 0x25, 0x09, 0x2E, 0x30, 0x24, 0x17, 0x3E, 0x3B, 0x1C, + 0xD2, 0x2F, 0xFD, 0x13, 0x4C, 0x32, 0x73, 0x21, 0xAB, 0x2F, 0x06, 0x26, + 0x72, 0x14, 0x5F, 0x1A, 0xD3, 0x00, 0x35, 0x11, 0x02, 0xF6, 0xB1, 0x00, + 0x4B, 0xF2, 0x89, 0xFC, 0x6F, 0x06, 0xF7, 0x1B, 0xA0, 0x1E, 0x4D, 0x38, + 0x42, 0x19, 0x00, 0x37, 0x08, 0x16, 0x9F, 0x2D, 0xFA, 0x15, 0xDA, 0x20, + 0xDB, 0x13, 0xF3, 0x23, 0x5E, 0x30, 0x04, 0x3D, 0xF0, 0x45, 0x71, 0x47, + 0x0A, 0x31, 0x2E, 0x3B, 0x43, 0x20, 0x4A, 0x2B, 0x6A, 0x1C, 0x41, 0x19, + 0xBA, 0x0B, 0x82, 0x10, 0x11, 0x0A, 0x5D, 0x1E, 0xB9, 0x21, 0x14, 0x2C, + 0xBF, 0x24, 0x42, 0x22, 0x37, 0x08, 0xD0, 0x02, 0x61, 0xFD, 0x27, 0xEB, + 0xA1, 0x07, 0xD2, 0xEB, 0x2B, 0x16, 0x3E, 0x04, 0xBC, 0x1B, 0x08, 0x0C, + 0x3A, 0x1F, 0xAB, 0x05, 0xE8, 0x29, 0x31, 0x12, 0x66, 0x2B, 0x21, 0x1D, + 0xC4, 0x29, 0xD4, 0x24, 0xB8, 0x2D, 0x29, 0x2B, 0xBA, 0x21, 0x72, 0x1B, + 0x06, 0x07, 0x25, 0x08, 0x74, 0x06, 0xE3, 0x13, 0xD5, 0x08, 0xB2, 0x11, + 0x19, 0xFB, 0x60, 0xEF, 0x48, 0x09, 0x47, 0xEF, 0xE3, 0x2A, 0x19, 0x0C, + 0xB9, 0x27, 0x90, 0x00, 0x08, 0x13, 0x67, 0xEE, 0xAB, 0x11, 0x6C, 0xFD, + 0xA5, 0x0D, 0xBC, 0xFF, 0x7A, 0x07, 0x99, 0xFB, 0xAD, 0x01, 0xC2, 0x00, + 0x5C, 0xE9, 0xE2, 0xFA, 0x93, 0xCD, 0xB2, 0xED, 0x80, 0xC2, 0x11, 0xE0, + 0xEB, 0xBA, 0x51, 0xD3, 0x0F, 0xC5, 0xA0, 0xD6, 0x13, 0xE5, 0x66, 0xE7, + 0xAC, 0xEC, 0xF8, 0xED, 0x1D, 0xE2, 0x05, 0xF4, 0xC1, 0xE0, 0x53, 0xFD, + 0xC2, 0xDB, 0x88, 0xF3, 0xA6, 0xE0, 0xFA, 0xFD, 0x38, 0xF5, 0x05, 0x1D, + 0xA4, 0xF8, 0x77, 0x18, 0xFF, 0xE3, 0xA4, 0x01, 0x12, 0xE1, 0x10, 0xF8, + 0x5F, 0xE9, 0xA2, 0xE4, 0x4E, 0xE3, 0x6E, 0xCC, 0x3A, 0xEB, 0x6A, 0xCF, + 0xFC, 0xEB, 0x9B, 0xCC, 0x59, 0xD1, 0x5A, 0xBF, 0xEF, 0xB1, 0xFB, 0xB6, + 0x81, 0xA8, 0xBB, 0xAC, 0x1D, 0xB4, 0x49, 0xA9, 0x93, 0xCD, 0x0A, 0xB8, + 0xB5, 0xE4, 0x3E, 0xC4, 0xEF, 0xE3, 0xED, 0xC5, 0x33, 0xDE, 0x30, 0xD8, + 0x93, 0xDA, 0xF8, 0xE9, 0x70, 0xDC, 0x45, 0xEB, 0x0C, 0xEA, 0x95, 0xED, + 0x55, 0xF9, 0x67, 0xE5, 0xAC, 0xF2, 0x34, 0xCD, 0x60, 0xF2, 0x22, 0xD6, + 0x25, 0xFD, 0x60, 0xE7, 0x8C, 0xE7, 0x8A, 0xD3, 0xC8, 0xD5, 0xD2, 0xCD, + 0x80, 0xED, 0xF9, 0xF9, 0xC6, 0xEE, 0x94, 0x01, 0xF8, 0xD7, 0xF4, 0xD4, + 0x6F, 0xDD, 0x5B, 0xD3, 0x5D, 0xE6, 0xE7, 0xEE, 0xD7, 0xE0, 0x2D, 0xF6, + 0x3E, 0xE5, 0xFB, 0xED, 0xF2, 0xEE, 0x58, 0xE3, 0x81, 0xEA, 0x8F, 0xDB, + 0xB1, 0xD9, 0xF4, 0xCC, 0x88, 0xBD, 0xED, 0xBF, 0x81, 0xB4, 0x8D, 0xC5, + 0x37, 0xCE, 0xE3, 0xD4, 0xB0, 0xDA, 0xBC, 0xDF, 0xEC, 0xD3, 0x71, 0xE9, + 0x5C, 0xDC, 0x7D, 0xF5, 0xA2, 0xE1, 0x06, 0xF5, 0xD2, 0xE3, 0xF1, 0xFF, + 0x24, 0xF9, 0x4E, 0x23, 0x48, 0xFF, 0x0F, 0x26, 0x9F, 0xF8, 0xB2, 0x03, + 0x9E, 0x02, 0x0D, 0xEB, 0xF8, 0x02, 0x3E, 0xE7, 0x1C, 0xEC, 0x76, 0xF1, + 0x0B, 0xEB, 0x0B, 0x09, 0x50, 0x05, 0xD5, 0x14, 0xD9, 0x06, 0x64, 0x0B, + 0xB2, 0xE4, 0x7C, 0xFA, 0x20, 0xC5, 0xCA, 0xE7, 0x9F, 0xC9, 0x7C, 0xE2, + 0xDE, 0xED, 0xBF, 0xEC, 0x40, 0x10, 0x26, 0xFC, 0xA0, 0x0F, 0xD4, 0xF5, + 0xA3, 0x07, 0xDF, 0xE9, 0xC9, 0x05, 0x12, 0xE4, 0xF4, 0x04, 0x1D, 0xE5, + 0x0D, 0x09, 0x4C, 0x00, 0x43, 0x0D, 0xFE, 0x18, 0x4E, 0x10, 0x14, 0x0B, + 0xE0, 0x1D, 0xD5, 0xFD, 0xAC, 0x36, 0x70, 0x12, 0x54, 0x2C, 0xC7, 0x13, + 0x05, 0x13, 0x79, 0x03, 0x00, 0x26, 0xCE, 0x1C, 0x8E, 0x38, 0xD6, 0x37, + 0x4C, 0x23, 0xAC, 0x1C, 0x67, 0x1A, 0x35, 0x0E, 0xC3, 0x21, 0x8F, 0x20, + 0x8C, 0x23, 0xE7, 0x1E, 0x04, 0x23, 0x7D, 0x13, 0x5E, 0x1B, 0x4D, 0x13, + 0x22, 0x09, 0xFB, 0x17, 0x08, 0xEC, 0x92, 0x11, 0xF4, 0xD6, 0xDA, 0x04, + 0xAA, 0xD7, 0x64, 0x06, 0xD6, 0xF8, 0x02, 0x1A, 0x0F, 0x19, 0x38, 0x26, + 0xED, 0x19, 0xC0, 0x21, 0x43, 0x14, 0xAE, 0x1F, 0x01, 0x09, 0x07, 0x1C, + 0xC6, 0xFE, 0xCA, 0x0D, 0x16, 0x16, 0x14, 0x14, 0xD6, 0x35, 0x8B, 0x28, + 0x09, 0x34, 0x1E, 0x22, 0x73, 0x30, 0x07, 0x17, 0x73, 0x30, 0x1F, 0x0F, + 0x74, 0x1A, 0x0C, 0x02, 0x8A, 0x08, 0xAD, 0xFF, 0x3F, 0x18, 0x94, 0x0E, + 0xBF, 0x1B, 0x45, 0x0F, 0xD0, 0x01, 0x63, 0x04, 0x9A, 0xEF, 0x30, 0xF8, + 0x42, 0xF3, 0x00, 0xEA, 0x7F, 0x01, 0x63, 0xEA, 0xD7, 0x0A, 0xBA, 0xF2, + 0x4B, 0x0F, 0x0F, 0x05, 0x40, 0x00, 0xF1, 0x0B, 0xB9, 0xFE, 0x39, 0x20, + 0x2D, 0x10, 0xFB, 0x3F, 0xF1, 0x1B, 0x68, 0x4D, 0xD4, 0x1C, 0xFD, 0x50, + 0xDD, 0x15, 0x97, 0x37, 0x60, 0x13, 0xC9, 0x14, 0x66, 0x24, 0xC1, 0x1A, + 0x58, 0x37, 0xEC, 0x2F, 0x8E, 0x22, 0xAB, 0x21, 0xD4, 0x0C, 0xE9, 0x07, + 0x87, 0x21, 0xAE, 0x14, 0x94, 0x29, 0x89, 0x16, 0xB0, 0x0A, 0x8C, 0xF1, + 0xDC, 0x02, 0x75, 0xF2, 0xC7, 0x11, 0xEC, 0x06, 0x9B, 0x15, 0x88, 0x09, + 0xB0, 0x1D, 0xC0, 0x13, 0x02, 0x27, 0x86, 0x1E, 0xFC, 0x17, 0x0B, 0x13, + 0x89, 0x01, 0xA3, 0x03, 0xFC, 0xF1, 0x31, 0x02, 0x00, 0xE4, 0x2F, 0x04, + 0xD8, 0xED, 0x16, 0x0F, 0x65, 0x05, 0x34, 0x13, 0xF3, 0x13, 0xB8, 0x0C, + 0x38, 0x1A, 0xAA, 0x10, 0x53, 0x13, 0x8E, 0x18, 0x80, 0x18, 0x2D, 0x1F, + 0xFC, 0x30, 0xD4, 0x26, 0x0C, 0x32, 0x8B, 0x26, 0x7E, 0x20, 0x22, 0x1E, + 0x9E, 0x1D, 0x49, 0x1E, 0x85, 0x19, 0x05, 0x14, 0x07, 0x0E, 0x4E, 0x02, + 0x36, 0x12, 0x72, 0x08, 0x99, 0x1D, 0xB2, 0x11, 0x9F, 0x0C, 0x0E, 0x03, + 0xD6, 0xFA, 0xC4, 0xF0, 0x5F, 0xF8, 0x08, 0xDE, 0x7D, 0xED, 0x2C, 0xD1, + 0x56, 0xE7, 0x28, 0xDF, 0x3E, 0xF7, 0xDD, 0x00, 0xA3, 0x0B, 0x21, 0x0F, + 0xB9, 0x12, 0xBA, 0x00, 0x87, 0x21, 0xEA, 0x06, 0x1D, 0x32, 0x89, 0x17, + 0xA9, 0x38, 0x7C, 0x24, 0x36, 0x31, 0xF2, 0x2C, 0xFE, 0x1D, 0x6E, 0x22, + 0x60, 0x06, 0x6B, 0x17, 0xDB, 0x07, 0x5E, 0x28, 0xE8, 0x18, 0x27, 0x3A, + 0x7A, 0x07, 0x94, 0x21, 0x20, 0xF8, 0xFE, 0x08, 0xFD, 0x05, 0x90, 0x17, + 0x23, 0xFF, 0x7E, 0x15, 0x68, 0xE0, 0x23, 0xFE, 0x7F, 0xE2, 0xD1, 0x0A, + 0xEE, 0xF2, 0x8B, 0x12, 0x48, 0xF7, 0xEE, 0x07, 0x45, 0xFB, 0x24, 0x03, + 0x39, 0xF6, 0x53, 0xF3, 0x8F, 0xEB, 0x0E, 0xE1, 0xA5, 0xE1, 0xD3, 0xCB, + 0x54, 0xD8, 0x99, 0xB1, 0xA9, 0xDB, 0x29, 0xAF, 0x04, 0xEB, 0x6F, 0xCA, + 0x61, 0xEA, 0xE7, 0xD7, 0x0F, 0xEA, 0xDD, 0xD9, 0x9B, 0xF5, 0x46, 0xED, + 0x3A, 0xF5, 0xBB, 0xFC, 0x77, 0xFD, 0x23, 0xFF, 0xFA, 0x14, 0x4E, 0x09, + 0x1C, 0x07, 0xC0, 0xFF, 0xB1, 0xEB, 0xFD, 0xE8, 0xD9, 0xF0, 0xFE, 0xF2, + 0x16, 0xF5, 0x62, 0xFE, 0x43, 0xF0, 0x04, 0xF8, 0xE9, 0xF8, 0x40, 0xF5, + 0x0B, 0xFB, 0x5D, 0xEF, 0x24, 0xD7, 0x26, 0xDC, 0x4D, 0xBA, 0x91, 0xCF, + 0xAB, 0xBF, 0xA4, 0xD1, 0x88, 0xCA, 0xC4, 0xCF, 0x81, 0xE1, 0x3D, 0xCF, + 0x1C, 0xF4, 0x4E, 0xDB, 0xCA, 0xF7, 0x26, 0xEA, 0x52, 0xE4, 0x24, 0xE4, + 0x4F, 0xCA, 0x42, 0xDD, 0x41, 0xD9, 0x28, 0xF4, 0x71, 0xEF, 0xB2, 0x07, + 0xE4, 0xF4, 0x6E, 0xFE, 0x1D, 0xF9, 0xF1, 0xF0, 0x2E, 0xEE, 0x03, 0xDC, + 0x37, 0xE0, 0xF7, 0xC7, 0x97, 0xF1, 0x65, 0xE5, 0x06, 0x04, 0xAD, 0x04, + 0x1A, 0xF4, 0x5E, 0xEC, 0x41, 0xEB, 0xEB, 0xD7, 0x79, 0xFF, 0x06, 0xEA, + 0x40, 0xF9, 0x94, 0xE6, 0x97, 0xE0, 0xE7, 0xD7, 0x20, 0xEB, 0xDE, 0xF2, + 0xF5, 0xF0, 0x69, 0x08, 0xB8, 0xE4, 0x16, 0x01, 0x40, 0xDB, 0xC7, 0xF4, + 0x6E, 0xCF, 0x6E, 0xEF, 0x2B, 0xCE, 0xF3, 0xF0, 0xB6, 0xCB, 0xCA, 0xE8, + 0x4F, 0xBA, 0x99, 0xCF, 0xD2, 0xC4, 0xC1, 0xD0, 0xEB, 0xE6, 0x54, 0xF2, + 0x8A, 0xF6, 0xC0, 0xF8, 0x9C, 0x01, 0xE5, 0xF5, 0xC4, 0x13, 0xBB, 0xFE, + 0x40, 0x16, 0x0A, 0xF2, 0xA9, 0x18, 0x0C, 0xED, 0x91, 0x2A, 0xDB, 0xFF, + 0x35, 0x15, 0xBF, 0xED, 0x99, 0xF7, 0xD8, 0xD8, 0xC8, 0xFE, 0x99, 0xF3, + 0xFE, 0xF7, 0xA0, 0x06, 0x4E, 0xF6, 0xC4, 0x02, 0xDF, 0x1C, 0xA6, 0x0C, + 0x5D, 0x31, 0xA3, 0x15, 0x3D, 0x1E, 0x5A, 0x09, 0x85, 0x07, 0xD8, 0x03, + 0x00, 0xF4, 0xC3, 0x04, 0xD5, 0xE3, 0x4B, 0xFF, 0xA8, 0xED, 0x6B, 0x0F, + 0x73, 0x03, 0xB4, 0x22, 0x65, 0x10, 0x62, 0x2D, 0xE3, 0x0F, 0x80, 0x30, + 0xC8, 0x06, 0x95, 0x23, 0xC2, 0x1B, 0x89, 0x2A, 0x2C, 0x3D, 0x46, 0x39, + 0xDD, 0x2E, 0xF2, 0x30, 0xAE, 0x0B, 0xCC, 0x25, 0x85, 0xFC, 0xDA, 0x13, + 0xD0, 0x00, 0x5F, 0x01, 0xB0, 0x27, 0xD9, 0x14, 0x13, 0x38, 0x18, 0x1A, + 0x6D, 0x04, 0xAD, 0xEB, 0x76, 0xE3, 0x39, 0xDA, 0xBD, 0xF9, 0xBB, 0xF8, + 0xE5, 0x00, 0xB4, 0xFB, 0x66, 0x01, 0x3D, 0xF6, 0xA2, 0x1F, 0xDE, 0x14, + 0x80, 0x29, 0xE5, 0x16, 0xC7, 0x1A, 0x40, 0x09, 0xE5, 0x0D, 0x63, 0x0E, + 0xA9, 0xFE, 0x59, 0x01, 0xCF, 0xF7, 0xF5, 0xF3, 0x4D, 0xE8, 0xBF, 0xE6, + 0xE2, 0xBF, 0xFC, 0xC7, 0x47, 0xB4, 0xDE, 0xC3, 0x15, 0xD5, 0xE4, 0xE1, + 0x11, 0xEA, 0xEA, 0xF7, 0x86, 0xE9, 0x30, 0xFE, 0x4B, 0xE3, 0xA5, 0xF7, + 0x1C, 0xDE, 0x04, 0xE9, 0x7A, 0xF3, 0xBD, 0xF4, 0x38, 0x0C, 0x63, 0x15, + 0xAC, 0x00, 0xF6, 0x0E, 0x4F, 0xFD, 0x19, 0xFA, 0xAE, 0xFD, 0xE8, 0xF9, + 0x4D, 0xE0, 0x09, 0xEF, 0xAF, 0xDC, 0xC2, 0xEE, 0x7D, 0xF0, 0xD9, 0xF2, + 0x43, 0xE6, 0x52, 0xD9, 0xC3, 0xD4, 0x4C, 0xCD, 0xA5, 0xD0, 0x58, 0xD4, + 0xA5, 0xCB, 0x24, 0xD4, 0x9D, 0xD3, 0x24, 0xD3, 0x47, 0xF2, 0x98, 0xDC, + 0x7D, 0xFE, 0xD4, 0xE2, 0xC1, 0xFB, 0xD2, 0xE5, 0xF2, 0xFF, 0x54, 0xEC, + 0x64, 0xFB, 0x57, 0xEC, 0xB0, 0x07, 0x18, 0xFB, 0x1E, 0x1B, 0x51, 0x0D, + 0xD1, 0x14, 0xF3, 0x0B, 0x67, 0x0C, 0x1A, 0x0F, 0x04, 0x01, 0xD3, 0x13, + 0x62, 0xF0, 0x8E, 0x0F, 0x07, 0x12, 0x95, 0x32, 0x60, 0x3A, 0x48, 0x53, + 0xB7, 0x1B, 0x9C, 0x29, 0xA6, 0xF1, 0x77, 0x01, 0xCE, 0xFB, 0x63, 0x0A, + 0xD3, 0xFA, 0x75, 0x00, 0x25, 0xEB, 0x09, 0xEF, 0x67, 0x0A, 0xA1, 0x04, + 0x1E, 0x1A, 0x76, 0x07, 0x15, 0x09, 0x80, 0xF6, 0x68, 0x0B, 0x70, 0x02, + 0x26, 0x14, 0x47, 0x0F, 0x32, 0x18, 0x03, 0x10, 0x88, 0x18, 0x2F, 0x0E, + 0xA9, 0x06, 0x23, 0xF2, 0xB1, 0x01, 0xF0, 0xDB, 0xE9, 0x18, 0x7B, 0xF6, + 0x6F, 0x1B, 0x8C, 0x11, 0x22, 0x09, 0xE3, 0x16, 0xD2, 0x0C, 0x8C, 0x1F, + 0xB2, 0x17, 0xB4, 0x1D, 0x74, 0x1E, 0xD3, 0x25, 0x86, 0x34, 0xE7, 0x4A, + 0xDA, 0x35, 0x21, 0x4D, 0xF9, 0x27, 0x35, 0x3A, 0x18, 0x2A, 0xD5, 0x43, + 0x2F, 0x1D, 0x0F, 0x44, 0xC0, 0x13, 0x48, 0x2F, 0xE4, 0x2B, 0x30, 0x2F, + 0x41, 0x36, 0x51, 0x2E, 0xF4, 0x23, 0xBC, 0x10, 0x56, 0x11, 0x32, 0xF4, + 0x5A, 0x03, 0x2F, 0xE3, 0xFE, 0xFD, 0xEC, 0xDF, 0x75, 0xFE, 0x6B, 0xEF, + 0xA1, 0xFA, 0xE3, 0x00, 0xAD, 0x03, 0x3A, 0x11, 0x41, 0x1C, 0x86, 0x28, + 0x57, 0x1B, 0xA3, 0x2D, 0x50, 0x22, 0x9B, 0x3A, 0xA4, 0x48, 0xCE, 0x53, + 0x15, 0x51, 0x87, 0x4B, 0x59, 0x42, 0x4B, 0x38, 0x0E, 0x3B, 0x5D, 0x2E, + 0xDB, 0x24, 0xD3, 0x1B, 0xB2, 0x24, 0x5B, 0x17, 0x9D, 0x52, 0xCE, 0x30, + 0xC1, 0x4D, 0xCD, 0x24, 0x52, 0x18, 0x90, 0xF9, 0x73, 0x0E, 0x43, 0x00, + 0x7C, 0x14, 0xBA, 0x1B, 0x01, 0xFE, 0xEE, 0x18, 0x7B, 0x08, 0x53, 0x1F, + 0x9B, 0x2C, 0x86, 0x2D, 0x5B, 0x22, 0x34, 0x23, 0x84, 0x09, 0x34, 0x1C, + 0xF8, 0xF9, 0x8C, 0x1B, 0xE9, 0xDD, 0xB9, 0x10, 0xE4, 0xC6, 0xA5, 0xFE, + 0x21, 0xCA, 0xF1, 0xE6, 0xE5, 0xD0, 0x3C, 0xCD, 0x08, 0xE8, 0x74, 0xD9, + 0x38, 0x0A, 0xCA, 0x05, 0x74, 0x12, 0x07, 0x12, 0x4B, 0x0D, 0x81, 0x00, + 0x87, 0x0C, 0x6D, 0xF2, 0x27, 0x13, 0xC2, 0xF0, 0xDD, 0x1E, 0x44, 0xFF, + 0xF1, 0x27, 0x6A, 0x09, 0x7A, 0x1D, 0x61, 0xFC, 0x4B, 0x0A, 0xD3, 0xEF, + 0xC4, 0xF0, 0x24, 0xE0, 0x8B, 0xDB, 0x66, 0xD5, 0x69, 0xE5, 0x35, 0xEF, + 0xE6, 0xF0, 0x7C, 0x0D, 0x90, 0xDA, 0x41, 0x05, 0x37, 0xC1, 0x5B, 0xF2, + 0x99, 0xBE, 0xE7, 0xE9, 0x56, 0xC4, 0x3B, 0xD6, 0x53, 0xD7, 0x3D, 0xCD, + 0xCF, 0xED, 0xCC, 0xDF, 0x3A, 0xF5, 0x13, 0xE5, 0xC1, 0xF3, 0x5F, 0xDC, + 0x72, 0xE6, 0x15, 0xDD, 0xF2, 0xD6, 0x24, 0xDB, 0x19, 0xE6, 0x53, 0xE1, + 0xD8, 0xFC, 0x1F, 0xEC, 0x9A, 0xF6, 0xF4, 0xE8, 0xBD, 0xE8, 0x6C, 0xE6, + 0x04, 0xD5, 0xF4, 0xDD, 0x1C, 0xC1, 0x18, 0xD4, 0x39, 0xDF, 0x82, 0xEA, + 0xA4, 0x08, 0xDB, 0xFA, 0xFA, 0xF2, 0xB0, 0xD1, 0xE1, 0xD9, 0xBD, 0xB4, + 0x0A, 0xDF, 0xB7, 0xCE, 0x78, 0xCD, 0x66, 0xD7, 0x3A, 0xC3, 0x51, 0xC9, + 0x17, 0xE7, 0x2F, 0xD7, 0x61, 0xFD, 0x5E, 0xE3, 0xCB, 0xF7, 0x60, 0xE0, + 0x00, 0xF2, 0xF1, 0xE8, 0x15, 0xDD, 0x34, 0xEF, 0xEE, 0xBD, 0xC5, 0xE1, + 0xE9, 0xB4, 0x57, 0xC8, 0x64, 0xB6, 0x8D, 0xB8, 0xD1, 0xB1, 0xFD, 0xBF, + 0xFF, 0xC8, 0x3C, 0xD6, 0xFB, 0xE9, 0x95, 0xE1, 0x33, 0xF0, 0x4D, 0xE0, + 0x32, 0xE3, 0x13, 0xD4, 0x5A, 0xDF, 0x02, 0xC0, 0xDF, 0xF4, 0x02, 0xC5, + 0xF1, 0x03, 0x2B, 0xE2, 0xD7, 0xFA, 0xD7, 0xF4, 0xD4, 0xEF, 0x89, 0xF8, + 0x6B, 0xE9, 0x32, 0xF6, 0xA2, 0xDF, 0x6A, 0xE7, 0x6A, 0xDF, 0xFF, 0xE0, + 0x5A, 0xF0, 0xF8, 0xF5, 0x9E, 0xF6, 0xD4, 0x03, 0x14, 0xEB, 0x78, 0xF9, + 0x45, 0xE2, 0x8A, 0xEB, 0x98, 0xD6, 0x18, 0xE1, 0x38, 0xC8, 0x79, 0xE6, + 0x93, 0xD7, 0xAC, 0x05, 0x28, 0xF3, 0x56, 0x1F, 0xB4, 0xF6, 0xD1, 0x19, + 0x02, 0xEF, 0x8A, 0x10, 0xA0, 0xF6, 0x29, 0x16, 0x6C, 0x0B, 0x3C, 0x11, + 0xDB, 0x1A, 0x09, 0x0C, 0x0D, 0x19, 0xB7, 0x14, 0x26, 0x0E, 0x59, 0x16, + 0xA1, 0x0D, 0xF4, 0x0A, 0xE3, 0x05, 0x8A, 0xFB, 0xA7, 0xF2, 0x9F, 0xF7, + 0x30, 0xEC, 0x1E, 0xFF, 0x76, 0xF0, 0xF8, 0xFE, 0x6A, 0xED, 0xC1, 0xF4, + 0xE8, 0xF0, 0x38, 0xEF, 0x91, 0xFF, 0x5B, 0xF3, 0x20, 0x04, 0x16, 0xFA, + 0x36, 0x11, 0x0E, 0x0A, 0xBC, 0x26, 0x39, 0x1D, 0xA3, 0x28, 0xDF, 0x19, + 0xAE, 0x28, 0xD9, 0x15, 0x91, 0x2E, 0x4D, 0x1A, 0xD3, 0x26, 0xF3, 0x05, + 0x7A, 0x1D, 0x7E, 0xEC, 0xA4, 0x19, 0x29, 0xEC, 0x52, 0x10, 0xC1, 0xF1, + 0x33, 0x0C, 0x1E, 0xF3, 0x59, 0x15, 0x0E, 0xFD, 0xB4, 0x19, 0x26, 0x0C, + 0x13, 0x18, 0xCD, 0x10, 0x23, 0x1B, 0xBD, 0x0B, 0xE6, 0x12, 0x65, 0x07, + 0x33, 0x05, 0x64, 0x09, 0x19, 0x06, 0x6B, 0x10, 0xDC, 0x17, 0x33, 0x1C, + 0x22, 0x20, 0x33, 0x22, 0xAE, 0x08, 0xD6, 0x1D, 0x82, 0xFA, 0xF5, 0x1F, + 0xD5, 0x07, 0x20, 0x25, 0x22, 0x0E, 0x34, 0x25, 0xF2, 0x10, 0x4B, 0x26, + 0xAA, 0x19, 0x83, 0x22, 0xC7, 0x18, 0x53, 0x15, 0x11, 0x10, 0x40, 0x0A, + 0x65, 0x0D, 0xB2, 0x0F, 0xBD, 0x0A, 0xA8, 0x1A, 0x06, 0x00, 0xE3, 0x14, + 0x5D, 0x06, 0x29, 0x09, 0x80, 0x16, 0xF2, 0x08, 0x3D, 0x11, 0xC0, 0x13, + 0xE2, 0x03, 0xBE, 0x1A, 0xE1, 0xFE, 0x4A, 0x20, 0x12, 0xFE, 0x1B, 0x29, + 0x49, 0x01, 0xD1, 0x24, 0xDA, 0x04, 0xAA, 0x18, 0xC0, 0x08, 0x98, 0x13, + 0x43, 0x1A, 0x01, 0x10, 0xB9, 0x2C, 0x40, 0x08, 0xF7, 0x2E, 0xDE, 0x01, + 0x5A, 0x23, 0xA4, 0xFB, 0xB8, 0x11, 0xEC, 0xEE, 0xE2, 0x02, 0xE4, 0xE9, + 0x03, 0xF7, 0x46, 0xF4, 0xBA, 0xF6, 0xF9, 0xF8, 0x82, 0x07, 0x10, 0xFC, + 0x2B, 0x1F, 0x97, 0x09, 0x0F, 0x25, 0xA0, 0x0C, 0xFB, 0x17, 0x71, 0x07, + 0x20, 0x0F, 0x28, 0x0B, 0x2B, 0x10, 0x00, 0x14, 0x64, 0x17, 0x69, 0x1A, + 0x55, 0x1F, 0x6B, 0x1D, 0xEC, 0x1A, 0x66, 0x1F, 0xB5, 0x0F, 0xDC, 0x1D, + 0x07, 0x11, 0x90, 0x1D, 0xCA, 0x13, 0x3A, 0x22, 0x10, 0x14, 0x6C, 0x22, + 0x96, 0x17, 0x6D, 0x23, 0x60, 0x1C, 0xE6, 0x29, 0x72, 0x22, 0x7B, 0x2D, + 0x0D, 0x28, 0xA0, 0x2B, 0x6C, 0x29, 0x2B, 0x28, 0xF4, 0x23, 0x35, 0x27, + 0x63, 0x19, 0xE7, 0x1E, 0xF3, 0x11, 0xD9, 0x15, 0x6C, 0x03, 0x4A, 0x18, + 0xDD, 0xF5, 0x2C, 0x1A, 0x58, 0xFE, 0xFE, 0x15, 0x83, 0x08, 0x6C, 0x0E, + 0x7D, 0x07, 0x48, 0x04, 0xF1, 0x06, 0xEA, 0x05, 0x1B, 0x0C, 0x0B, 0x15, + 0xE5, 0x09, 0xA3, 0x1C, 0x7C, 0x09, 0xE5, 0x1B, 0x74, 0x17, 0xB4, 0x19, + 0xF9, 0x24, 0x82, 0x1B, 0x02, 0x29, 0x8B, 0x1D, 0x52, 0x20, 0x25, 0x16, + 0xEA, 0x0F, 0x1A, 0x11, 0x38, 0x05, 0xFC, 0x0B, 0xCE, 0x03, 0x94, 0x04, + 0x79, 0x08, 0x4A, 0xFF, 0x79, 0x12, 0x95, 0xF7, 0x05, 0x1C, 0x4E, 0xFC, + 0xA4, 0x24, 0xDE, 0x0E, 0x4B, 0x2A, 0x65, 0x12, 0xDC, 0x22, 0xFE, 0x04, + 0x41, 0x0E, 0x26, 0xFD, 0xC8, 0xFA, 0x5D, 0xFC, 0x34, 0xFD, 0x7A, 0xF8, + 0xFA, 0xFF, 0xB8, 0xEE, 0x51, 0xF0, 0xD6, 0xE6, 0x0D, 0xE4, 0x8B, 0xE5, + 0x93, 0xDB, 0xB6, 0xE9, 0x3F, 0xD0, 0xC6, 0xE5, 0x1D, 0xD3, 0xD1, 0xDC, + 0x78, 0xE8, 0x0B, 0xEB, 0x18, 0xF8, 0x68, 0xF9, 0x2D, 0xFA, 0xD8, 0xF7, + 0x83, 0x02, 0x74, 0xFC, 0xBD, 0x0B, 0xC2, 0xFF, 0x79, 0x03, 0xA3, 0xF5, + 0xB8, 0xF8, 0xF1, 0xEF, 0x19, 0xF9, 0x14, 0xF5, 0x6E, 0xF3, 0xB4, 0xEF, + 0xA7, 0xEA, 0x69, 0xEB, 0x79, 0xE7, 0xE4, 0xF6, 0xAA, 0xE8, 0x3B, 0xFB, + 0xCF, 0xEE, 0x4C, 0xF7, 0xA2, 0xEB, 0xBE, 0xFB, 0x98, 0xE0, 0xB3, 0x07, + 0xF8, 0xD7, 0x2B, 0x0F, 0xFD, 0xDB, 0x39, 0x05, 0x21, 0xEA, 0x52, 0xF3, + 0xAA, 0xEF, 0xA3, 0xDF, 0xC8, 0xF4, 0xD7, 0xC6, 0xA0, 0xF3, 0x4D, 0xB2, + 0x0F, 0xE4, 0x9B, 0xB4, 0x52, 0xDE, 0x5A, 0xC3, 0x86, 0xE8, 0x76, 0xCB, + 0x54, 0xEF, 0xD9, 0xCF, 0x9E, 0xE8, 0xDB, 0xD4, 0x2B, 0xE3, 0xD4, 0xD7, + 0x69, 0xE7, 0xF2, 0xDB, 0x20, 0xF1, 0xA4, 0xEC, 0x97, 0xF7, 0x43, 0xF0, + 0xAB, 0xF4, 0xC8, 0xE1, 0x80, 0xF1, 0xF0, 0xE0, 0x4E, 0xE9, 0x9E, 0xE7, + 0x03, 0xD7, 0x90, 0xE6, 0xB1, 0xCE, 0x1B, 0xE7, 0xF6, 0xCB, 0xD2, 0xE7, + 0xFC, 0xC1, 0xB9, 0xEC, 0x21, 0xC9, 0x23, 0xFF, 0xD2, 0xDA, 0x9E, 0x07, + 0x5A, 0xE2, 0x27, 0xFC, 0xF8, 0xE9, 0x31, 0xF5, 0x67, 0xF2, 0xDD, 0xF4, + 0xBC, 0xED, 0xB2, 0xE5, 0x62, 0xE1, 0xF5, 0xDB, 0xB5, 0xD9, 0x25, 0xE3, + 0xEE, 0xD9, 0x86, 0xE6, 0x7C, 0xE2, 0xDC, 0xE8, 0x39, 0xE1, 0x63, 0xE9, + 0x4F, 0xD8, 0x9F, 0xE6, 0xB3, 0xDC, 0x21, 0xE7, 0x4F, 0xED, 0x6D, 0xEF, + 0x85, 0xF9, 0x5F, 0xF8, 0x10, 0x04, 0x8C, 0xFB, 0xEA, 0x16, 0xF4, 0xFE, + 0x97, 0x1E, 0x2E, 0x07, 0xE5, 0x16, 0x1E, 0x0D, 0x30, 0x10, 0x8D, 0x07, + 0x22, 0x10, 0x84, 0xFC, 0xC2, 0x11, 0x21, 0xFA, 0xBF, 0x0B, 0x80, 0xF8, + 0x42, 0x0B, 0x52, 0xEE, 0x61, 0x0C, 0xF9, 0xE7, 0x87, 0x00, 0xBD, 0xF3, + 0x02, 0xFD, 0xAD, 0x0C, 0xC7, 0x09, 0x56, 0x1C, 0x8E, 0x0E, 0x2C, 0x1F, + 0x32, 0x11, 0x92, 0x1F, 0xBB, 0x17, 0xED, 0x1F, 0x96, 0x16, 0xA2, 0x15, + 0x63, 0x11, 0x9B, 0x0A, 0xFF, 0x15, 0x96, 0x09, 0x44, 0x21, 0xDB, 0x07, + 0x44, 0x20, 0x45, 0x0C, 0x9D, 0x12, 0xE4, 0x0F, 0xB1, 0xFD, 0xC2, 0x06, + 0x93, 0xF8, 0x7F, 0x02, 0x1D, 0x03, 0xCA, 0x0C, 0xD5, 0x00, 0xA2, 0x11, + 0xDF, 0x05, 0xC7, 0x0E, 0x16, 0x1A, 0x9E, 0x0D, 0xE5, 0x18, 0xD7, 0x07, + 0xE2, 0x09, 0xA5, 0x01, 0x9F, 0x05, 0x70, 0x03, 0x2E, 0xFF, 0xE4, 0x04, + 0x2B, 0xF6, 0x0C, 0x08, 0xD3, 0xF2, 0x8D, 0x0F, 0x32, 0xEE, 0x2C, 0x0B, + 0x40, 0xE8, 0x6D, 0x02, 0x1A, 0xE2, 0x49, 0x06, 0xC7, 0xE2, 0xAE, 0x12, + 0xCE, 0xE5, 0x48, 0x13, 0x1F, 0xE8, 0x48, 0x03, 0x3A, 0xF6, 0x55, 0xFC, + 0x6F, 0xFD, 0x8F, 0xFB, 0x0E, 0xFA, 0xD7, 0xED, 0x69, 0xF9, 0xB4, 0xE1, + 0xB5, 0xFB, 0x8F, 0xD6, 0x4A, 0xF9, 0xD0, 0xC5, 0xD7, 0xEF, 0xB2, 0xC6, + 0xB5, 0xE3, 0xF2, 0xD2, 0xC7, 0xD6, 0x6B, 0xDB, 0xB7, 0xD5, 0xE7, 0xDC, + 0xF5, 0xE1, 0x7C, 0xD7, 0xFD, 0xF7, 0x4A, 0xDC, 0xBC, 0x05, 0x2C, 0xE0, + 0xEA, 0xFD, 0x32, 0xDD, 0x8C, 0xED, 0xF0, 0xE2, 0x7A, 0xEA, 0x10, 0xF2, + 0x62, 0xEF, 0x9C, 0xFF, 0x26, 0xFA, 0x6D, 0xFE, 0xC2, 0x07, 0xB3, 0xF8, + 0x98, 0x01, 0x80, 0xF2, 0xFA, 0xEF, 0x7D, 0xED, 0x1A, 0xE1, 0x96, 0xF1, + 0xD1, 0xD7, 0x52, 0xEC, 0x1A, 0xDE, 0x33, 0xED, 0x97, 0xF2, 0xF8, 0x03, + 0x86, 0x00, 0xEA, 0x10, 0x5F, 0x02, 0x5D, 0x10, 0xBE, 0x03, 0x32, 0x0E, + 0x52, 0x02, 0x5E, 0x0A, 0xA4, 0xFC, 0xEA, 0x05, 0x16, 0xFA, 0xB9, 0x04, + 0x94, 0xF3, 0x3C, 0x0D, 0xF3, 0xF5, 0x6A, 0x20, 0xCB, 0xFD, 0x0E, 0x23, + 0xBF, 0xFC, 0x35, 0x18, 0xCC, 0xFC, 0xF5, 0x10, 0x0D, 0x00, 0x4E, 0x0A, + 0xB6, 0x0C, 0xC2, 0x07, 0xAC, 0x1C, 0xAB, 0x0A, 0xB8, 0x1E, 0xBA, 0x0B, + 0xFF, 0x26, 0xA8, 0x12, 0x6E, 0x32, 0x62, 0x24, 0x26, 0x26, 0x77, 0x1F, + 0xD2, 0x18, 0x8C, 0x08, 0xBE, 0x1B, 0x62, 0x01, 0xF2, 0x18, 0xFA, 0x01, + 0x62, 0x06, 0xC7, 0x03, 0x99, 0xFB, 0x74, 0x14, 0x5E, 0xFC, 0x56, 0x20, + 0x86, 0x09, 0xC9, 0x23, 0xCB, 0x24, 0xA1, 0x2A, 0x33, 0x32, 0x12, 0x27, + 0x35, 0x29, 0x2F, 0x1D, 0xFA, 0x27, 0xC0, 0x21, 0xC6, 0x2A, 0x45, 0x2D, + 0x9F, 0x25, 0x92, 0x2F, 0x58, 0x1E, 0x7D, 0x24, 0x90, 0x1B, 0xCE, 0x18, + 0x3D, 0x1E, 0x23, 0x13, 0x92, 0x14, 0x6C, 0x0D, 0xDE, 0x0B, 0x55, 0x07, + 0xEF, 0x16, 0x3C, 0x01, 0xCB, 0x23, 0x70, 0x01, 0xD6, 0x28, 0x3F, 0x05, + 0x51, 0x2A, 0x13, 0x0F, 0x0C, 0x2C, 0xA0, 0x16, 0xBF, 0x2E, 0x66, 0x1C, + 0x19, 0x2D, 0xE9, 0x2C, 0xD0, 0x26, 0xFE, 0x3A, 0xF1, 0x20, 0xA6, 0x3D, + 0x00, 0x22, 0x91, 0x3C, 0x1F, 0x24, 0xE5, 0x3D, 0x6C, 0x1E, 0xC9, 0x3D, + 0xA2, 0x16, 0x38, 0x35, 0x24, 0x14, 0x1B, 0x28, 0x82, 0x19, 0x2F, 0x22, + 0xEA, 0x25, 0xD1, 0x28, 0x19, 0x31, 0x61, 0x2F, 0x38, 0x36, 0xF0, 0x22, + 0xB3, 0x3C, 0x63, 0x0F, 0xEB, 0x38, 0xC1, 0x0A, 0x33, 0x29, 0x71, 0x16, + 0xF7, 0x1B, 0x98, 0x20, 0x29, 0x14, 0xD1, 0x1C, 0xA8, 0x10, 0x7A, 0x12, + 0x5D, 0x07, 0x76, 0x0C, 0xED, 0xFB, 0x05, 0x03, 0x09, 0xF5, 0x14, 0xF7, + 0x25, 0xF2, 0x59, 0xF1, 0xB6, 0xF9, 0x46, 0xEF, 0xFC, 0x04, 0x62, 0xED, + 0x28, 0x16, 0x0D, 0xEC, 0x7B, 0x2C, 0x79, 0xF1, 0x98, 0x34, 0x42, 0xF7, + 0x3E, 0x21, 0xFD, 0xF2, 0x33, 0xFA, 0x45, 0xF4, 0x52, 0xE2, 0x6D, 0xFE, + 0xDE, 0xDD, 0xB2, 0x02, 0xC0, 0xDF, 0xF5, 0x04, 0xF3, 0xE9, 0xCA, 0x06, + 0x06, 0xF7, 0xF9, 0x05, 0x34, 0x00, 0x97, 0xFD, 0xF9, 0xFC, 0xD7, 0xF9, + 0x8A, 0xEF, 0xAD, 0xFD, 0x2B, 0xE6, 0x41, 0xF9, 0x7B, 0xE2, 0xD7, 0xF6, + 0x41, 0xE1, 0xE2, 0xFB, 0x91, 0xE4, 0xEA, 0x04, 0x18, 0xE2, 0x1C, 0x06, + 0x2D, 0xD3, 0xCF, 0xF3, 0xD0, 0xCA, 0x10, 0xE7, 0xEC, 0xCC, 0x6A, 0xE0, + 0x90, 0xCB, 0x3D, 0xD5, 0x8F, 0xCD, 0xF3, 0xD4, 0xF4, 0xD9, 0xA1, 0xD5, + 0x19, 0xEC, 0x89, 0xD8, 0x17, 0xFD, 0xCD, 0xDC, 0x58, 0xFF, 0xC8, 0xDA, + 0xA6, 0xF9, 0x04, 0xD9, 0x22, 0xF7, 0x59, 0xDA, 0xD7, 0xEC, 0x10, 0xE4, + 0x1D, 0xE0, 0xDF, 0xEB, 0xAE, 0xE1, 0xC4, 0xE3, 0x76, 0xEB, 0xB1, 0xCF, + 0xF2, 0xEB, 0x5B, 0xC5, 0x9F, 0xE3, 0x0A, 0xD2, 0x2E, 0xDD, 0xCA, 0xD9, + 0xEF, 0xDF, 0xC9, 0xD6, 0xC8, 0xE7, 0x2A, 0xDB, 0x50, 0xE4, 0x8C, 0xDE, + 0xA4, 0xE1, 0x24, 0xE1, 0x35, 0xE8, 0xA9, 0xE1, 0x58, 0xE8, 0xA6, 0xD9, + 0xDE, 0xE1, 0xFC, 0xCF, 0x20, 0xD6, 0x52, 0xD2, 0x80, 0xBA, 0x13, 0xD7, + 0xD5, 0xA8, 0x09, 0xD6, 0x0D, 0xB7, 0xE0, 0xD9, 0x6B, 0xC9, 0x0D, 0xD8, + 0xAF, 0xDA, 0x5B, 0xD8, 0xA4, 0xE9, 0x6C, 0xCF, 0xC3, 0xF4, 0x4F, 0xC6, + 0x00, 0xF3, 0xAA, 0xCF, 0xD7, 0xDC, 0x73, 0xD1, 0xC4, 0xDE, 0xC7, 0xDE, + 0x84, 0xEB, 0xD9, 0xDF, 0xF7, 0xE7, 0x5D, 0xCF, 0xA7, 0xEB, 0x43, 0xDC, + 0xBB, 0xE6, 0x63, 0xEA, 0x7F, 0xCE, 0xAC, 0xE0, 0xC9, 0xD5, 0xC7, 0xEC, + 0x90, 0xDE, 0xBB, 0xFC, 0xFA, 0xC9, 0xF4, 0xF3, 0x25, 0xD3, 0x4E, 0x03, + 0xA6, 0xF0, 0x86, 0x18, 0x48, 0xF1, 0x9B, 0x09, 0x23, 0xED, 0x61, 0xFF, + 0x7F, 0xFB, 0xEF, 0x0B, 0xF7, 0x0A, 0x91, 0x0F, 0xF9, 0x18, 0xD9, 0x11, + 0x25, 0x24, 0xAB, 0x26, 0xF1, 0x34, 0x78, 0x46, 0x77, 0x48, 0xA4, 0x5C, + 0x16, 0x4A, 0x99, 0x52, 0x90, 0x5A, 0x75, 0x54, 0x4C, 0x5E, 0xBD, 0x54, + 0x30, 0x3D, 0xF0, 0x38, 0x83, 0x45, 0xF1, 0x48, 0x3A, 0x52, 0x3A, 0x54, + 0x0E, 0x33, 0xAB, 0x2E, 0xCA, 0x31, 0x22, 0x31, 0x28, 0x53, 0x06, 0x58, + 0xA2, 0x58, 0xE2, 0x52, 0x15, 0x4C, 0x46, 0x39, 0x9B, 0x36, 0xFC, 0x25, + 0xB3, 0x0E, 0x1B, 0x0A, 0x91, 0xF9, 0x1C, 0xFC, 0xDB, 0xE9, 0x87, 0xF0, + 0x40, 0xD8, 0xBA, 0xDD, 0x47, 0xE2, 0x33, 0xDE, 0x68, 0xD8, 0x14, 0xD3, + 0x6C, 0xC9, 0x32, 0xC4, 0x9C, 0xC7, 0x62, 0xC1, 0x61, 0xB3, 0x04, 0xB3, + 0x6D, 0xB3, 0x87, 0xAF, 0x90, 0xBA, 0xEC, 0xAC, 0x48, 0xB0, 0x5B, 0xA6, + 0x13, 0xAA, 0xB6, 0xB2, 0x77, 0xBE, 0x9B, 0xCD, 0x39, 0xD9, 0x22, 0xE3, + 0x51, 0xD1, 0xDA, 0xDC, 0x14, 0xCC, 0x4C, 0xD3, 0xE8, 0xD4, 0x09, 0xD1, + 0xDF, 0xE0, 0xEA, 0xD5, 0xC9, 0xEA, 0x13, 0xEC, 0xD1, 0xF8, 0xDF, 0x0B, + 0x05, 0x1E, 0x4E, 0x39, 0xB6, 0x3F, 0x5F, 0x50, 0x17, 0x44, 0x3E, 0x3C, + 0xDA, 0x49, 0x52, 0x34, 0xB3, 0x46, 0x77, 0x3A, 0x5D, 0x2E, 0xF3, 0x31, + 0xD8, 0x30, 0x25, 0x36, 0xB8, 0x4A, 0x56, 0x4E, 0x49, 0x57, 0x94, 0x59, + 0x88, 0x50, 0x47, 0x4D, 0x8F, 0x49, 0x1A, 0x40, 0xB1, 0x45, 0x18, 0x39, + 0x35, 0x39, 0xE4, 0x19, 0xF9, 0x36, 0x3B, 0x15, 0x92, 0x38, 0x8D, 0x2F, + 0x01, 0x1C, 0x11, 0x20, 0xF1, 0x09, 0xE2, 0x0C, 0x12, 0x0C, 0x73, 0x0F, + 0x08, 0xFB, 0x67, 0x07, 0xDC, 0xEC, 0x86, 0xED, 0x77, 0xE0, 0xDE, 0xD7, + 0x3A, 0xE3, 0xF2, 0xDE, 0x32, 0xDE, 0x28, 0xD4, 0xCA, 0xB7, 0xFF, 0xAE, + 0xF2, 0xAF, 0x97, 0xAF, 0xFB, 0xAC, 0x1E, 0xBA, 0x7B, 0xA7, 0xA7, 0xB0, + 0x62, 0xC0, 0x4B, 0xB3, 0x37, 0xC9, 0x91, 0xAF, 0x7D, 0xC1, 0x39, 0xA0, + 0xC3, 0xBC, 0x30, 0x9F, 0xE7, 0xBB, 0x92, 0xAC, 0x96, 0xC2, 0x09, 0xC4, + 0x35, 0xDB, 0xBA, 0xE2, 0x5B, 0x07, 0x8C, 0x0B, 0x94, 0x20, 0x13, 0x2A, + 0x21, 0x1E, 0x86, 0x28, 0xA2, 0x20, 0xE4, 0x25, 0xBD, 0x1E, 0xB2, 0x25, + 0x37, 0x0F, 0xD4, 0x1E, 0xD3, 0x12, 0x91, 0x27, 0x6F, 0x28, 0x4D, 0x34, + 0x28, 0x27, 0x04, 0x28, 0x3F, 0x29, 0x59, 0x29, 0xDD, 0x41, 0x36, 0x3D, + 0xCE, 0x3B, 0x9E, 0x2E, 0x50, 0x2E, 0x80, 0x26, 0x3A, 0x27, 0x61, 0x2C, + 0x3F, 0x15, 0x45, 0x15, 0xC4, 0x06, 0x8A, 0xF9, 0x9F, 0x02, 0x4B, 0xF0, + 0x43, 0xFC, 0x17, 0xE1, 0x80, 0xEC, 0x63, 0xD5, 0x60, 0xD6, 0xAF, 0xD3, + 0xC1, 0xB9, 0xBF, 0xC7, 0xA2, 0xA2, 0x52, 0xB6, 0x3F, 0xA0, 0xC6, 0xB2, + 0x4C, 0xAC, 0x26, 0xBF, 0xD1, 0xB8, 0x13, 0xC5, 0x09, 0xC4, 0xAB, 0xC6, + 0xAD, 0xD6, 0x6D, 0xD3, 0x61, 0xD2, 0xD9, 0xD4, 0xB0, 0xBC, 0xD5, 0xCB, + 0xC9, 0xCC, 0xE7, 0xD0, 0xC9, 0xE1, 0x8F, 0xD5, 0x45, 0xE6, 0x6A, 0xDE, + 0x6F, 0xE3, 0xFC, 0xE6, 0x3B, 0xD4, 0x23, 0xDB, 0x87, 0xDF, 0x7D, 0xE2, + 0x18, 0xF4, 0xAA, 0xF8, 0xAC, 0xED, 0x14, 0xF5, 0xCF, 0xF0, 0x99, 0xFA, + 0x23, 0x04, 0xB0, 0x17, 0xBA, 0x06, 0x37, 0x19, 0xF4, 0x09, 0xBB, 0x0B, + 0xD0, 0x18, 0x05, 0x1B, 0x5B, 0x1D, 0x66, 0x34, 0x4E, 0x25, 0x9C, 0x3D, + 0x5F, 0x2A, 0x0E, 0x2D, 0x0E, 0x20, 0x45, 0x1C, 0xEA, 0x2B, 0x99, 0x24, + 0xB5, 0x3F, 0x14, 0x20, 0x2F, 0x40, 0xC7, 0x18, 0x42, 0x43, 0x41, 0x2E, + 0xEB, 0x40, 0xDC, 0x3A, 0x0B, 0x3A, 0xA4, 0x3B, 0x2F, 0x3B, 0xD5, 0x3B, + 0xE2, 0x2B, 0xF2, 0x1F, 0x4C, 0x1C, 0xCD, 0x0A, 0x99, 0x16, 0xC8, 0x0E, + 0x9B, 0x11, 0xC0, 0x10, 0x6B, 0x24, 0x94, 0x1E, 0xE0, 0x38, 0x5A, 0x35, + 0x6D, 0x45, 0x95, 0x4F, 0x03, 0x4C, 0x83, 0x61, 0xE3, 0x46, 0x47, 0x5D, + 0xF2, 0x4C, 0x6B, 0x58, 0x42, 0x59, 0xA4, 0x5B, 0x58, 0x52, 0xA4, 0x51, + 0xF3, 0x48, 0x04, 0x48, 0x36, 0x55, 0x3B, 0x53, 0x33, 0x5D, 0x9A, 0x5C, + 0x12, 0x59, 0x16, 0x60, 0x78, 0x56, 0x44, 0x61, 0x53, 0x5B, 0x72, 0x5B, + 0x46, 0x5A, 0xBB, 0x54, 0x1C, 0x4D, 0x33, 0x55, 0x1F, 0x45, 0x18, 0x54, + 0x21, 0x3E, 0xA4, 0x47, 0x0F, 0x37, 0x52, 0x3D, 0x55, 0x48, 0x57, 0x4D, + 0xF9, 0x4E, 0x74, 0x51, 0x20, 0x39, 0x93, 0x38, 0x9E, 0x46, 0x77, 0x38, + 0x26, 0x57, 0x66, 0x36, 0x5D, 0x41, 0x88, 0x1E, 0x87, 0x2E, 0xA6, 0x17, + 0xD2, 0x31, 0x8E, 0x26, 0xF9, 0x28, 0x88, 0x27, 0xCF, 0x19, 0xAF, 0x1F, + 0x43, 0x1C, 0x46, 0x20, 0x3D, 0x0B, 0xAA, 0x0E, 0x57, 0xFC, 0x55, 0xFF, + 0xF1, 0x03, 0x7E, 0x06, 0x7F, 0x07, 0xD7, 0x0C, 0xE2, 0x09, 0x98, 0x09, + 0x01, 0x05, 0xA9, 0xFF, 0xE3, 0xFB, 0xAD, 0xFD, 0x43, 0xF6, 0xC6, 0x03, + 0x7A, 0xEF, 0x10, 0x00, 0xA1, 0xE7, 0xC1, 0xEF, 0x00, 0xE4, 0x3C, 0xE0, + 0x31, 0xE3, 0x56, 0xD6, 0xA3, 0xD8, 0x9E, 0xC9, 0x85, 0xD8, 0x04, 0xCA, + 0x81, 0xF5, 0xA7, 0xE5, 0x93, 0xF1, 0xA0, 0xE8, 0x3D, 0xDF, 0xEB, 0xE0, + 0xE9, 0xD9, 0x0C, 0xDB, 0x6E, 0xD1, 0xC3, 0xC8, 0x68, 0xD8, 0x8B, 0xCA, + 0x6D, 0xD8, 0x73, 0xD6, 0xAC, 0xC8, 0x43, 0xD5, 0xD8, 0xC0, 0x96, 0xD2, + 0x6B, 0xBD, 0x0D, 0xD7, 0xF9, 0xB8, 0x51, 0xD5, 0x52, 0xB4, 0x76, 0xC2, + 0x34, 0xB7, 0xD4, 0xB4, 0xD9, 0xC0, 0x1C, 0xB2, 0x4F, 0xBF, 0xEC, 0xA9, + 0x94, 0xB4, 0xB4, 0xA8, 0x34, 0xA9, 0x3A, 0xAD, 0xB9, 0xA9, 0x83, 0xAD, + 0x9E, 0xB5, 0x5D, 0xAD, 0xF5, 0xB6, 0xC9, 0xAF, 0xC8, 0xAC, 0x84, 0xA9, + 0x9B, 0xA6, 0x2C, 0xA4, 0x48, 0xA0, 0x61, 0xA5, 0x76, 0x9C, 0x59, 0xA4, + 0xA1, 0xAA, 0x3C, 0xB5, 0x7B, 0xC3, 0xF3, 0xCE, 0xC3, 0xD6, 0x98, 0xDA, + 0x6C, 0xE2, 0x61, 0xE2, 0x2F, 0xEC, 0xC7, 0xF1, 0xAA, 0x01, 0xB7, 0x0F, + 0xC7, 0x10, 0x2E, 0x1F, 0x17, 0x11, 0xB0, 0x1A, 0x75, 0x10, 0xED, 0x17, + 0xCA, 0x05, 0x17, 0x0C, 0xA7, 0x03, 0xFA, 0x09, 0x61, 0x12, 0xFC, 0x15, + 0x1B, 0x1E, 0x3F, 0x1C, 0x7A, 0x25, 0x37, 0x1C, 0x71, 0x35, 0xE5, 0x1D, + 0x5D, 0x40, 0x8B, 0x22, 0x36, 0x25, 0xDB, 0x0C, 0x78, 0x11, 0xA2, 0x00, + 0xBC, 0x1C, 0x9E, 0x1A, 0xB8, 0x11, 0x56, 0x1C, 0x6E, 0x07, 0xAC, 0x0F, + 0x16, 0x12, 0x9A, 0x12, 0xC0, 0x0B, 0x5C, 0x0B, 0x14, 0xFC, 0x32, 0xFC, + 0x1B, 0xFC, 0xA0, 0xF7, 0x7B, 0xF9, 0x6C, 0xF1, 0xE0, 0xF9, 0x61, 0xF2, + 0xB9, 0x13, 0x50, 0x0E, 0x2D, 0x27, 0x96, 0x1F, 0x15, 0x20, 0x79, 0x11, + 0xF2, 0x1D, 0x0A, 0x0C, 0xE3, 0x18, 0x59, 0x0C, 0xB3, 0x10, 0x27, 0x07, + 0xFB, 0x1C, 0xEE, 0x0B, 0xD6, 0x1E, 0xEE, 0x02, 0x40, 0x19, 0xB4, 0xF7, + 0x7D, 0x22, 0x81, 0x0B, 0x57, 0x2F, 0x9F, 0x2A, 0x7A, 0x31, 0x04, 0x37, + 0x58, 0x30, 0xD9, 0x38, 0x6F, 0x30, 0xEA, 0x37, 0x93, 0x1F, 0x9F, 0x29, + 0x0C, 0x0B, 0x08, 0x17, 0x5F, 0x17, 0xE2, 0x16, 0xAE, 0x22, 0xA2, 0x19, + 0x9F, 0x11, 0x5E, 0x11, 0x02, 0xFE, 0x3F, 0x0D, 0xEF, 0xF7, 0xD8, 0x0F, + 0xEE, 0xFA, 0xCB, 0x13, 0x73, 0xFE, 0x65, 0x16, 0x5D, 0xFB, 0x3E, 0x08, + 0x53, 0xFD, 0xF8, 0xF7, 0xFC, 0x0C, 0xBA, 0xF8, 0x2C, 0x0C, 0xD0, 0xF5, + 0x94, 0xFA, 0x30, 0xF4, 0x30, 0xE8, 0x33, 0xF1, 0x3F, 0xDC, 0xCC, 0xE8, + 0xCA, 0xE4, 0xDE, 0xF1, 0xC1, 0xFC, 0x76, 0x00, 0x9D, 0xF7, 0x96, 0xF4, + 0xEE, 0xDA, 0x99, 0xDA, 0xE9, 0xCF, 0x38, 0xCD, 0xD1, 0xCF, 0xA1, 0xCA, + 0xAF, 0xCE, 0x3B, 0xCC, 0x1B, 0xC5, 0xC6, 0xC7, 0xF3, 0xBE, 0x4B, 0xBD, + 0xA6, 0xCE, 0xB2, 0xC3, 0xED, 0xD9, 0x4C, 0xCC, 0x50, 0xD5, 0x89, 0xC5, + 0x55, 0xD9, 0x95, 0xCB, 0xA1, 0xEA, 0x30, 0xE6, 0x3D, 0xF9, 0x47, 0x01, + 0x76, 0xF4, 0x64, 0x0B, 0x08, 0xFC, 0x8B, 0x0C, 0x6A, 0x0C, 0x8A, 0x0A, + 0x6B, 0x0B, 0x16, 0x08, 0x91, 0x18, 0x37, 0x1A, 0xA9, 0x18, 0x8A, 0x1D, + 0x43, 0x09, 0xFA, 0x15, 0x24, 0x00, 0x4B, 0x1A, 0xB2, 0xF6, 0x44, 0x15, + 0xDD, 0xF9, 0x25, 0x11, 0x77, 0xF2, 0x55, 0x00, 0x32, 0xE6, 0x8D, 0xE5, + 0x05, 0xE7, 0xB7, 0xD8, 0x65, 0xDD, 0x3D, 0xD4, 0xEE, 0xCA, 0xC7, 0xCE, + 0xDA, 0xC1, 0xAF, 0xCF, 0x41, 0xC2, 0x4C, 0xD2, 0xD7, 0xCA, 0x5F, 0xD2, + 0x11, 0xDC, 0x92, 0xD6, 0xA7, 0xE0, 0x15, 0xCC, 0x98, 0xD1, 0x37, 0xBC, + 0x5D, 0xC4, 0xF1, 0xC4, 0xE7, 0xC3, 0xEE, 0xDC, 0x3F, 0xD2, 0x3C, 0xF3, + 0x9E, 0xE0, 0xAB, 0xFB, 0x67, 0xE0, 0x34, 0xF7, 0x4F, 0xE4, 0xDC, 0xFE, + 0xDF, 0xE6, 0x98, 0x02, 0x13, 0xDB, 0x3C, 0xFE, 0xF3, 0xD3, 0x18, 0x01, + 0xFE, 0xCD, 0xEF, 0xF6, 0x65, 0xD1, 0x62, 0xF4, 0x4A, 0xE0, 0xFD, 0x02, + 0x66, 0xEE, 0xB3, 0x0A, 0x0B, 0x07, 0x48, 0x12, 0x36, 0x1B, 0xFC, 0x14, + 0x56, 0x17, 0x0F, 0x09, 0x43, 0x0B, 0x42, 0xFB, 0x6F, 0x00, 0x61, 0xFA, + 0x84, 0xF2, 0x4F, 0xF8, 0xF5, 0xEA, 0x42, 0xEB, 0x5A, 0xE6, 0xED, 0xE4, + 0x38, 0xDC, 0xC5, 0xDE, 0xDC, 0xDC, 0xF2, 0xDD, 0x44, 0xED, 0xF7, 0xEA, + 0x1A, 0xFC, 0xEC, 0xEF, 0x1D, 0x02, 0x44, 0xEB, 0xEA, 0xFD, 0xE0, 0xE7, + 0x6A, 0xEB, 0xD9, 0xDB, 0xD6, 0xE0, 0xC0, 0xD4, 0xA9, 0xDF, 0x91, 0xD7, + 0x75, 0xD5, 0xF3, 0xD5, 0xE5, 0xCB, 0x4B, 0xC3, 0x3B, 0xCE, 0x37, 0xAC, + 0x37, 0xCE, 0x50, 0xAD, 0x6E, 0xBF, 0xBE, 0xB3, 0xB4, 0xAF, 0x86, 0xB5, + 0x56, 0xB0, 0x27, 0xC0, 0x00, 0xB3, 0x42, 0xBF, 0xE3, 0xB4, 0x03, 0xB5, + 0xB8, 0xC5, 0x0A, 0xC2, 0x7E, 0xCD, 0x42, 0xD4, 0x26, 0xC8, 0xB2, 0xD6, + 0x06, 0xD5, 0x95, 0xDB, 0x50, 0xE5, 0x99, 0xED, 0x55, 0xDF, 0xF5, 0xF0, + 0xA5, 0xD4, 0x20, 0xDF, 0xE6, 0xE1, 0x53, 0xE4, 0x2D, 0xFE, 0x49, 0x04, + 0xB0, 0x0C, 0x66, 0x15, 0x9B, 0x28, 0x39, 0x1D, 0xE8, 0x49, 0xBF, 0x24, + 0x1C, 0x3D, 0x63, 0x13, 0x1E, 0x35, 0x55, 0x0C, 0xBB, 0x3E, 0xF0, 0x16, + 0xA2, 0x30, 0x82, 0x12, 0x72, 0x30, 0x92, 0x14, 0xC2, 0x3B, 0x7E, 0x1F, + 0x4F, 0x31, 0x84, 0x1C, 0xC2, 0x25, 0xCA, 0x16, 0xDB, 0x1D, 0xBA, 0x09, + 0x8F, 0x12, 0x47, 0xFE, 0xA7, 0xF7, 0xDF, 0xFE, 0xEE, 0xEF, 0x3E, 0x0F, + 0x06, 0x01, 0x3E, 0x18, 0x65, 0xFC, 0x81, 0xFA, 0xCE, 0x03, 0xCE, 0xE9, + 0x17, 0x14, 0x10, 0xF7, 0xF0, 0xFD, 0xDD, 0xF3, 0x2D, 0xE7, 0x17, 0xEB, + 0x05, 0xEF, 0x8B, 0xF6, 0x44, 0xF8, 0x89, 0xFC, 0xF7, 0xF1, 0xA6, 0xF5, + 0x02, 0xF8, 0x7C, 0xFF, 0x32, 0x1F, 0x3D, 0x2B, 0xB0, 0x3B, 0x26, 0x4F, + 0x17, 0x3C, 0x85, 0x4C, 0xB5, 0x4D, 0x3B, 0x52, 0xA3, 0x59, 0x68, 0x55, + 0xB8, 0x42, 0x8B, 0x3A, 0x13, 0x3A, 0x59, 0x3A, 0x4F, 0x4A, 0x95, 0x55, + 0xC4, 0x4A, 0x40, 0x56, 0x3D, 0x4A, 0x8B, 0x51, 0x60, 0x5F, 0x35, 0x58, + 0x35, 0x5D, 0x81, 0x50, 0x37, 0x4E, 0xB3, 0x54, 0xD6, 0x43, 0x24, 0x5C, + 0xF1, 0x34, 0x33, 0x4A, 0xF0, 0x43, 0x65, 0x4E, 0x16, 0x56, 0x4F, 0x5B, + 0x6D, 0x4E, 0xC8, 0x44, 0x60, 0x4C, 0x22, 0x34, 0x0B, 0x46, 0x1D, 0x3B, + 0xFE, 0x3C, 0x0B, 0x36, 0x76, 0x47, 0x51, 0x2B, 0xD4, 0x4C, 0xAD, 0x33, + 0x3D, 0x48, 0x44, 0x3F, 0x86, 0x48, 0x10, 0x3A, 0x5D, 0x40, 0x0D, 0x29, + 0x3E, 0x38, 0xBB, 0x29, 0xCD, 0x3D, 0x46, 0x30, 0xF3, 0x43, 0x33, 0x2A, + 0x58, 0x43, 0xF5, 0x2D, 0x40, 0x32, 0xEF, 0x1C, 0x8A, 0x22, 0xA1, 0xF6, + 0xE3, 0x18, 0x83, 0xE9, 0xD7, 0x0F, 0x5E, 0xF8, 0x4A, 0x06, 0x26, 0x09, + 0x0D, 0xFD, 0x96, 0x11, 0xC7, 0x01, 0x47, 0x1D, 0x3F, 0x06, 0xFA, 0x29, + 0x55, 0x03, 0x63, 0x2B, 0xE4, 0xFE, 0xC9, 0x23, 0x06, 0xFF, 0x9B, 0x1E, + 0x22, 0x10, 0x7E, 0x2A, 0xF6, 0x0E, 0x7E, 0x2D, 0x3A, 0xFA, 0x7E, 0x1F, + 0x87, 0xFE, 0xE0, 0x23, 0x63, 0x04, 0xDD, 0x28, 0x39, 0x0C, 0xA2, 0x27, + 0x11, 0x0E, 0xFE, 0x1C, 0xC6, 0x04, 0x36, 0x09, 0xE9, 0x03, 0x35, 0xF9, + 0x3C, 0x0A, 0x10, 0xF7, 0xAE, 0x06, 0xC9, 0xF7, 0x9A, 0xFB, 0x8A, 0xF6, + 0xEF, 0xF8, 0xEC, 0xF0, 0x89, 0x03, 0xF4, 0xE7, 0x1E, 0x11, 0x2E, 0xE7, + 0x52, 0x07, 0x2E, 0xD8, 0x63, 0xFE, 0x96, 0xCB, 0x3F, 0x10, 0x69, 0xDC, + 0x9F, 0x16, 0xC0, 0xE6, 0x23, 0x01, 0xF6, 0xE1, 0x10, 0xF9, 0xB3, 0xE5, + 0x05, 0xFB, 0x9E, 0xE1, 0xCD, 0xFB, 0x2B, 0xDB, 0x55, 0xFA, 0x50, 0xD9, + 0x87, 0xF4, 0xEA, 0xDB, 0x83, 0xEA, 0xFE, 0xD7, 0x2D, 0xE3, 0x3E, 0xCD, + 0xAA, 0xF1, 0xFC, 0xDB, 0xAA, 0x04, 0xB5, 0xEF, 0x79, 0xFC, 0xB9, 0xE3, + 0x19, 0xF6, 0xF7, 0xDA, 0x32, 0x03, 0x58, 0xEA, 0x3D, 0xF8, 0xF6, 0xED, + 0x58, 0xED, 0xDD, 0xF5, 0xD7, 0xF6, 0xF9, 0x10, 0xD4, 0xFF, 0x45, 0x20, + 0x10, 0x0C, 0x45, 0x1F, 0x7F, 0x18, 0xB9, 0x2A, 0x59, 0x19, 0x80, 0x39, + 0x03, 0x21, 0x4A, 0x38, 0xC5, 0x2F, 0xE9, 0x2F, 0x5A, 0x33, 0x6D, 0x26, + 0x4A, 0x33, 0xEE, 0x20, 0xC6, 0x34, 0xA9, 0x22, 0x2F, 0x2C, 0xF6, 0x26, + 0x41, 0x13, 0x94, 0x20, 0x56, 0x08, 0x91, 0x1A, 0x25, 0x1D, 0x95, 0x2B, + 0xE5, 0x27, 0xF6, 0x2F, 0xE4, 0x1A, 0xA0, 0x1F, 0x98, 0x19, 0x8E, 0x26, + 0x92, 0x25, 0xB3, 0x3A, 0xF7, 0x24, 0xFA, 0x3F, 0xB1, 0x1B, 0x39, 0x3D, + 0x4E, 0x1D, 0x2E, 0x36, 0xBA, 0x1C, 0x7C, 0x27, 0x43, 0x14, 0x75, 0x19, + 0x47, 0x0F, 0x04, 0x16, 0x4C, 0x08, 0x0B, 0x17, 0x0E, 0xFE, 0xEC, 0x12, + 0xB3, 0xF7, 0x34, 0x0E, 0x96, 0xFD, 0xEB, 0x08, 0x7D, 0x10, 0x41, 0x0E, + 0x37, 0x0C, 0xBF, 0x14, 0x16, 0xFE, 0x28, 0x12, 0xD6, 0x09, 0xD6, 0x0D, + 0x7F, 0x0D, 0xC8, 0x02, 0x16, 0x01, 0xF1, 0xFA, 0x70, 0xFF, 0xD5, 0x03, + 0x7D, 0xF5, 0x12, 0xFD, 0x8A, 0xDF, 0xC3, 0xE1, 0x75, 0xCE, 0x6B, 0xC9, + 0x59, 0xC9, 0x9B, 0xC7, 0x2E, 0xCB, 0x4C, 0xD7, 0xC4, 0xCA, 0x09, 0xD7, + 0x0F, 0xD5, 0x21, 0xDF, 0x73, 0xDA, 0xB3, 0xF7, 0xE4, 0xCC, 0x99, 0xFB, + 0xD7, 0xC7, 0xED, 0xF2, 0xB7, 0xD7, 0xCB, 0xF5, 0xE3, 0xE8, 0x21, 0xF4, + 0xB9, 0xEC, 0xCF, 0xE7, 0x1A, 0xE2, 0x73, 0xDE, 0x03, 0xC9, 0x4F, 0xDA, + 0xA2, 0xB7, 0x82, 0xDF, 0x06, 0xBA, 0x2F, 0xF5, 0x22, 0xBD, 0xB5, 0x0A, + 0x57, 0xCA, 0xD5, 0x0E, 0x3F, 0xE1, 0x8F, 0x08, 0x4E, 0xEA, 0x04, 0x07, + 0x4C, 0xE5, 0xF6, 0x09, 0x8A, 0xDE, 0x41, 0x08, 0xC5, 0xE4, 0x15, 0x08, + 0x8B, 0xF4, 0xE1, 0x0A, 0xEE, 0xFC, 0xD8, 0x0A, 0x53, 0x0B, 0x77, 0x0C, + 0x02, 0x12, 0x00, 0x04, 0x71, 0xFF, 0xAB, 0xEA, 0x25, 0xF5, 0x80, 0xDC, + 0x2F, 0xF6, 0x9A, 0xDA, 0xED, 0xEA, 0xE6, 0xCD, 0xC2, 0xEA, 0x9A, 0xD0, + 0x04, 0xF3, 0xBC, 0xE3, 0x18, 0xE1, 0x65, 0xDE, 0x8B, 0xDB, 0xD3, 0xDC, + 0x8A, 0xDE, 0x24, 0xDC, 0x37, 0xD1, 0x45, 0xC6, 0x42, 0xC7, 0x4B, 0xB7, + 0x8C, 0xB8, 0xAF, 0xB1, 0x03, 0xA3, 0x00, 0xA8, 0xC1, 0xA3, 0x1C, 0xA2, + 0xB9, 0xAF, 0x7C, 0xA8, 0x89, 0xAF, 0x5E, 0xB1, 0x36, 0xAE, 0x0D, 0xB2, + 0xD0, 0xAE, 0x03, 0xB0, 0x03, 0xB0, 0x29, 0xAE, 0xC2, 0xAB, 0x30, 0xA4, + 0xDA, 0xA5, 0x47, 0xA4, 0x30, 0xAB, 0x27, 0xB5, 0x46, 0xAF, 0x25, 0xB7, + 0xCD, 0xAE, 0x41, 0xAB, 0xB1, 0xBD, 0x7C, 0xAC, 0xB5, 0xC6, 0x8F, 0xB2, + 0xA0, 0xB8, 0x2C, 0xB5, 0x9B, 0xAF, 0x93, 0xC5, 0x08, 0xBC, 0x15, 0xE2, + 0x5E, 0xD0, 0x4C, 0xF2, 0x23, 0xD9, 0x1A, 0xED, 0xC6, 0xCB, 0x19, 0xD9, + 0x68, 0xC2, 0x46, 0xD2, 0xA5, 0xC4, 0xCB, 0xD4, 0x34, 0xCA, 0x31, 0xD0, + 0x71, 0xDA, 0x53, 0xCD, 0x50, 0xED, 0x4F, 0xD2, 0xB0, 0xFF, 0xA6, 0xE5, + 0x10, 0x08, 0x8B, 0xF2, 0xD3, 0xFA, 0xD9, 0xE3, 0xA4, 0xDD, 0x66, 0xCD, + 0xCF, 0xCF, 0x22, 0xD2, 0x11, 0xD5, 0x4F, 0xE5, 0x1A, 0xD3, 0x36, 0xE6, + 0x99, 0xDD, 0xF1, 0xE7, 0xDC, 0xE3, 0x5B, 0xE0, 0xBE, 0xE2, 0xA3, 0xD7, + 0x62, 0xFB, 0x33, 0xF1, 0xD2, 0xFE, 0x5D, 0xF6, 0xDB, 0xF0, 0x64, 0xEA, + 0x44, 0xEF, 0x3A, 0xF1, 0x73, 0xEB, 0xBF, 0xF1, 0x70, 0xE8, 0xA8, 0xE3, + 0xC0, 0xDD, 0x49, 0xD5, 0xA8, 0xC6, 0x5C, 0xCF, 0xC1, 0xBB, 0xED, 0xCF, + 0xFF, 0xC0, 0x64, 0xCF, 0x28, 0xCA, 0x22, 0xD1, 0x14, 0xC8, 0x3E, 0xD6, + 0xA4, 0xB4, 0x5D, 0xD3, 0x3E, 0xAF, 0xEA, 0xD2, 0x11, 0xBD, 0x07, 0xD8, + 0xCC, 0xCC, 0xD8, 0xDE, 0xA5, 0xD3, 0xE8, 0xDB, 0x4A, 0xD3, 0x1C, 0xDA, + 0x62, 0xD6, 0x93, 0xEC, 0xF7, 0xCD, 0x86, 0xEE, 0x45, 0xCB, 0x77, 0xE9, + 0xA8, 0xDC, 0x0E, 0xF6, 0x8C, 0xE4, 0x0A, 0xF3, 0xBF, 0xED, 0x1D, 0xEC, + 0x97, 0xFC, 0xAB, 0xF5, 0x2D, 0xF8, 0x92, 0xF5, 0xF4, 0xFB, 0xBD, 0xF3, + 0x37, 0x12, 0xD6, 0xEF, 0x1C, 0x23, 0x87, 0xEC, 0x69, 0x25, 0x50, 0xFA, + 0x3C, 0x1A, 0xB7, 0xFD, 0xFC, 0x18, 0xD4, 0xF6, 0x8D, 0x0F, 0x2E, 0xED, + 0x1C, 0x05, 0x7B, 0xEA, 0x1F, 0x0A, 0xE4, 0xEC, 0x21, 0xFF, 0x22, 0xE4, + 0xF0, 0xFC, 0x87, 0xE4, 0x05, 0x12, 0x72, 0xEB, 0x25, 0x2B, 0x31, 0xF8, + 0xEC, 0x3E, 0xDC, 0x0D, 0x51, 0x4A, 0x1E, 0x1D, 0x9B, 0x4C, 0x02, 0x23, + 0xFC, 0x4E, 0x50, 0x2D, 0xBC, 0x54, 0xC5, 0x3D, 0x49, 0x4A, 0xB6, 0x39, + 0xE1, 0x45, 0xC6, 0x36, 0x13, 0x47, 0x18, 0x3E, 0x04, 0x41, 0x80, 0x42, + 0xB8, 0x40, 0xB8, 0x48, 0xE0, 0x48, 0x0D, 0x4A, 0x33, 0x4A, 0x69, 0x3E, + 0x62, 0x4A, 0x7D, 0x3D, 0x62, 0x4A, 0xBA, 0x41, 0x41, 0x44, 0x7F, 0x32, + 0x21, 0x4E, 0x61, 0x33, 0xB1, 0x4A, 0x26, 0x3B, 0xCD, 0x36, 0x47, 0x3B, + 0xC4, 0x25, 0x8B, 0x36, 0x03, 0x19, 0xE2, 0x2D, 0x11, 0x1D, 0xCB, 0x2E, + 0xC8, 0x24, 0xB1, 0x30, 0x1F, 0x0E, 0x41, 0x1E, 0x40, 0x00, 0xA4, 0x15, + 0x4F, 0x0F, 0x8D, 0x1C, 0x55, 0x16, 0x88, 0x16, 0xEA, 0x16, 0xDC, 0x0D, + 0x17, 0x24, 0x24, 0x07, 0x13, 0x2D, 0x26, 0xF1, 0xC8, 0x1E, 0xF2, 0xD8, + 0x9C, 0x0C, 0xAE, 0xDB, 0x11, 0xFE, 0xF0, 0xE6, 0x63, 0xFE, 0x48, 0xF2, + 0x57, 0xFF, 0xF0, 0xEB, 0x0B, 0x02, 0x53, 0xE7, 0x1E, 0x10, 0x36, 0x01, + 0xE3, 0x12, 0x4E, 0x08, 0x61, 0x08, 0x4B, 0xF0, 0xFF, 0x10, 0xD5, 0xF4, + 0x12, 0x1D, 0xC1, 0x04, 0x7A, 0x14, 0xB4, 0xFD, 0x18, 0x13, 0xBF, 0x00, + 0x33, 0x1A, 0x51, 0x08, 0xDB, 0x13, 0xAE, 0x03, 0xC4, 0x11, 0x73, 0x0E, + 0xF1, 0x1A, 0xA4, 0x17, 0x7F, 0x20, 0x05, 0x0A, 0x98, 0x2E, 0xB3, 0x11, + 0xDE, 0x30, 0x81, 0x21, 0x74, 0x20, 0xB1, 0x17, 0xE3, 0x1B, 0x90, 0x0B, + 0x8B, 0x2A, 0x75, 0x13, 0x64, 0x2C, 0x58, 0x1B, 0xEF, 0x21, 0x20, 0x20, + 0x27, 0x13, 0x34, 0x21, 0x33, 0x03, 0xB6, 0x1F, 0xA8, 0xFF, 0xA8, 0x21, + 0x0F, 0xF4, 0x70, 0x11, 0x16, 0xE4, 0xBE, 0xFB, 0x4A, 0xF9, 0x6F, 0x05, + 0xA0, 0x16, 0x4C, 0x14, 0x51, 0x01, 0xE5, 0xFE, 0x7B, 0xF2, 0x3A, 0xEE, + 0x04, 0x02, 0x8F, 0xED, 0xC8, 0xF8, 0x70, 0xDD, 0x5E, 0xF2, 0x50, 0xDF, + 0xD5, 0x03, 0x9F, 0xF5, 0x1D, 0x03, 0x85, 0xF2, 0x85, 0xF8, 0x1B, 0xE2, + 0x38, 0xFD, 0x71, 0xE3, 0xA0, 0xFC, 0xD7, 0xF1, 0xED, 0xEE, 0xC6, 0xFD, + 0x1D, 0xF2, 0x5D, 0x08, 0xB7, 0xF6, 0xCF, 0x04, 0xD7, 0x01, 0xCD, 0x0B, + 0x8D, 0x1B, 0x06, 0x1D, 0x21, 0x17, 0x92, 0x0B, 0x40, 0x17, 0x43, 0x03, + 0xEB, 0x27, 0xDF, 0x08, 0xC1, 0x1A, 0x92, 0xF7, 0x14, 0x07, 0xD4, 0xEE, + 0x55, 0x12, 0x1E, 0xFC, 0x48, 0x25, 0xDB, 0x08, 0xA6, 0x24, 0xD2, 0x0E, + 0x57, 0x2D, 0x6E, 0x1E, 0x7B, 0x3B, 0x54, 0x30, 0xBA, 0x33, 0x1B, 0x36, + 0x21, 0x2F, 0x73, 0x3B, 0x4E, 0x32, 0x3A, 0x3B, 0xD6, 0x22, 0xE0, 0x26, + 0x75, 0x27, 0x7F, 0x21, 0x84, 0x42, 0x60, 0x2F, 0xDC, 0x37, 0x15, 0x28, + 0x51, 0x1E, 0x5C, 0x1E, 0x72, 0x24, 0xC3, 0x30, 0xE3, 0x29, 0x55, 0x3E, + 0x97, 0x1F, 0x85, 0x39, 0x53, 0x2D, 0x7A, 0x46, 0x13, 0x3D, 0x5A, 0x4A, + 0x67, 0x37, 0x1E, 0x32, 0x24, 0x30, 0x4C, 0x24, 0x42, 0x22, 0x3E, 0x16, + 0x68, 0x1F, 0xBB, 0x08, 0x38, 0x29, 0xC1, 0x0A, 0x2E, 0x1C, 0xB4, 0x08, + 0x0C, 0x0F, 0x1D, 0x12, 0xE3, 0x0D, 0x7C, 0x21, 0xD4, 0x03, 0x69, 0x17, + 0x9D, 0x06, 0x1A, 0x13, 0xF6, 0x11, 0x8B, 0x20, 0xC6, 0x06, 0xDE, 0x24, + 0x48, 0x00, 0x07, 0x2F, 0xEC, 0x0D, 0xAF, 0x35, 0x01, 0x13, 0xA4, 0x1C, + 0x42, 0x1C, 0x0B, 0x0F, 0x7F, 0x1F, 0x79, 0x12, 0x4E, 0x18, 0xB9, 0x11, + 0xA2, 0x0D, 0x0B, 0x08, 0xB0, 0xF8, 0x21, 0xFF, 0xE0, 0xEB, 0x12, 0x09, + 0xAF, 0xF1, 0xCE, 0x16, 0x06, 0xFE, 0x7D, 0x1D, 0xB5, 0xFB, 0x56, 0x1F, + 0x49, 0xE7, 0x35, 0x1D, 0x00, 0xDC, 0x6E, 0x1F, 0xA3, 0xD9, 0xEA, 0x16, + 0x30, 0xD5, 0xE7, 0x05, 0x91, 0xE1, 0xDD, 0x0C, 0xD7, 0xF1, 0x60, 0x1C, + 0xBC, 0xE4, 0x3C, 0x0C, 0x9F, 0xDD, 0xAE, 0xF7, 0x2F, 0xE2, 0x43, 0xEB, + 0xA7, 0xDD, 0x1B, 0xE2, 0x7A, 0xE3, 0xBF, 0xF1, 0xC7, 0xE0, 0x1A, 0xFB, + 0x03, 0xCA, 0x1B, 0xE9, 0x26, 0xC3, 0x7E, 0xE6, 0xBA, 0xD4, 0x3A, 0xFE, + 0x27, 0xD2, 0x09, 0xFC, 0xCA, 0xC6, 0x03, 0xED, 0x87, 0xDA, 0x51, 0xF7, + 0xA8, 0xE2, 0x74, 0xF9, 0x28, 0xD6, 0x69, 0xF5, 0x9F, 0xD8, 0x03, 0xFD, + 0x85, 0xD7, 0xC2, 0xFB, 0xC3, 0xCC, 0x68, 0xF6, 0xF2, 0xD7, 0x62, 0x02, + 0x14, 0xE1, 0xCD, 0x06, 0x0B, 0xD5, 0xA3, 0xFA, 0x18, 0xE4, 0xC3, 0x0B, + 0xF0, 0xE3, 0x39, 0x05, 0xCC, 0xC9, 0x3B, 0xDD, 0x1A, 0xD5, 0xAA, 0xE0, + 0x53, 0xD1, 0x48, 0xD8, 0x34, 0xB5, 0x6D, 0xB8, 0x98, 0xBC, 0x66, 0xC1, + 0x31, 0xC0, 0x58, 0xC3, 0xF1, 0xB2, 0x85, 0xB1, 0x4A, 0xBB, 0x34, 0xB8, + 0xCE, 0xB8, 0x00, 0xB8, 0xA9, 0xB3, 0x0D, 0xBA, 0x63, 0xBD, 0x68, 0xCC, + 0xDD, 0xB8, 0x87, 0xD3, 0xFF, 0xC1, 0xE7, 0xE3, 0x35, 0xCC, 0x66, 0xE4, + 0x38, 0xCD, 0x36, 0xD4, 0xEE, 0xDB, 0x37, 0xD8, 0xEE, 0xE2, 0x04, 0xE1, + 0x19, 0xE0, 0x71, 0xDB, 0xC7, 0xD3, 0x31, 0xBC, 0x1C, 0xD8, 0xCB, 0xBE, + 0x3E, 0xE3, 0x8D, 0xDB, 0xCD, 0xDC, 0xEA, 0xDA, 0xEB, 0xDF, 0x60, 0xE1, + 0xD0, 0xE5, 0xE2, 0xF5, 0xA3, 0xD7, 0x37, 0xF8, 0x01, 0xCF, 0xF4, 0xF7, + 0x55, 0xC9, 0x90, 0xEE, 0xE9, 0xC0, 0xD7, 0xD4, 0x3A, 0xDF, 0x2A, 0xDA, + 0x29, 0xE7, 0x21, 0xD7, 0xF2, 0xCE, 0x61, 0xC3, 0x0F, 0xE7, 0x38, 0xE0, + 0x84, 0xF7, 0x98, 0xF4, 0xD5, 0xD8, 0x2A, 0xD5, 0x77, 0xCF, 0x0C, 0xD1, + 0xC2, 0xDF, 0x41, 0xEC, 0x29, 0xE1, 0x6C, 0xE4, 0xF1, 0xDE, 0x57, 0xDA, + 0xF8, 0xE4, 0x55, 0xEA, 0x94, 0xEA, 0x0B, 0xED, 0x28, 0xE4, 0x58, 0xD8, + 0x02, 0xE5, 0x81, 0xCF, 0x08, 0xEC, 0xF6, 0xD0, 0x8F, 0xED, 0xB5, 0xD4, + 0x1E, 0xF5, 0x84, 0xE3, 0x90, 0xEB, 0x6F, 0xDB, 0x75, 0xE1, 0x42, 0xCF, + 0xE0, 0xE1, 0xF4, 0xDC, 0xFC, 0xD1, 0x3F, 0xE2, 0x05, 0xD9, 0x90, 0xF5, + 0x0F, 0xE5, 0xBF, 0x0D, 0xE7, 0xD6, 0x62, 0xFD, 0x56, 0xD9, 0x3A, 0xEE, + 0x30, 0xE9, 0x90, 0xF7, 0x79, 0xF3, 0xBF, 0xFD, 0x1F, 0xF4, 0x24, 0x00, + 0x1A, 0xF8, 0x01, 0x10, 0x4B, 0x04, 0xA2, 0x1A, 0x10, 0x05, 0x56, 0x11, + 0xB7, 0xFE, 0xDE, 0x05, 0x90, 0xFE, 0x35, 0x02, 0x27, 0x08, 0x9F, 0x05, + 0x6D, 0x0E, 0xEF, 0x06, 0xBF, 0x0E, 0x8F, 0x0A, 0x1A, 0x0A, 0x5C, 0x0D, + 0x1D, 0x0F, 0x8E, 0x1B, 0x2D, 0x13, 0x29, 0x20, 0x56, 0x12, 0x78, 0x11, + 0x40, 0x22, 0xB7, 0x17, 0x70, 0x2A, 0xFF, 0x19, 0xD6, 0x21, 0x06, 0x10, + 0x0B, 0x1E, 0x19, 0x15, 0x54, 0x14, 0x80, 0x15, 0x1A, 0xFB, 0xB0, 0x0D, + 0x12, 0xF7, 0xED, 0x13, 0x3D, 0x08, 0x6A, 0x18, 0x85, 0xFF, 0x75, 0x09, + 0x7C, 0xFB, 0x01, 0x0A, 0xBC, 0x14, 0x0B, 0x1D, 0xBD, 0x1C, 0x12, 0x17, + 0x60, 0x10, 0xAD, 0xFC, 0x6E, 0x09, 0xAC, 0xEC, 0xC4, 0x12, 0xD0, 0xF9, + 0xF2, 0x19, 0x9E, 0x0B, 0xD7, 0x15, 0x12, 0x05, 0x9B, 0x21, 0x91, 0x08, + 0x49, 0x1A, 0xFC, 0x0C, 0x66, 0x02, 0x3F, 0x06, 0xDE, 0xFA, 0x12, 0x01, + 0x4F, 0xF8, 0x6A, 0xFC, 0xF6, 0x09, 0x1F, 0x03, 0xA2, 0x17, 0xE2, 0x04, + 0x6C, 0x13, 0x0D, 0xF7, 0x73, 0x1B, 0xED, 0xE9, 0x30, 0x1D, 0x12, 0xDB, + 0xFF, 0x1B, 0x18, 0xD2, 0x5F, 0x20, 0xA1, 0xDB, 0xAA, 0x1C, 0xB2, 0xE6, + 0x49, 0x18, 0xD0, 0xEB, 0xA0, 0x12, 0x25, 0xF4, 0xC6, 0x12, 0x69, 0xFF, + 0xFF, 0x15, 0xE4, 0xFB, 0x57, 0x16, 0xEF, 0xED, 0x2A, 0x1B, 0xD3, 0xEF, + 0x20, 0x0D, 0x99, 0xF2, 0x80, 0xF5, 0xA2, 0xE7, 0xCE, 0xFC, 0x3E, 0xED, + 0x83, 0x17, 0x1B, 0x02, 0x1F, 0x29, 0xB2, 0x03, 0xD2, 0x20, 0x19, 0xF5, + 0x82, 0x0B, 0x81, 0xF1, 0x4F, 0xF9, 0x2D, 0xEC, 0x3F, 0xF6, 0x69, 0xE3, + 0x76, 0x09, 0xFC, 0xEA, 0xE5, 0x20, 0x31, 0xF9, 0x80, 0x25, 0x96, 0xFC, + 0x27, 0x2E, 0xE3, 0xFE, 0x8E, 0x41, 0x4A, 0x0F, 0x54, 0x37, 0x87, 0x10, + 0x57, 0x34, 0x94, 0x13, 0x01, 0x49, 0xBA, 0x23, 0x08, 0x48, 0xB5, 0x19, + 0x8C, 0x3A, 0x31, 0x12, 0xE3, 0x48, 0xD1, 0x29, 0x54, 0x48, 0x21, 0x2F, + 0x89, 0x22, 0xFC, 0x1C, 0x72, 0x1D, 0xF7, 0x29, 0x75, 0x29, 0x25, 0x41, + 0x3F, 0x29, 0x4F, 0x49, 0x83, 0x38, 0x9B, 0x4F, 0xCB, 0x4A, 0xBC, 0x50, + 0xAE, 0x45, 0xEE, 0x46, 0xAB, 0x38, 0xA2, 0x39, 0x5C, 0x2E, 0xFC, 0x2C, + 0xC0, 0x29, 0xEA, 0x1D, 0xE9, 0x2F, 0xA5, 0x17, 0x6D, 0x2C, 0x21, 0x17, + 0x77, 0x13, 0xDF, 0x0A, 0x7E, 0x03, 0x8B, 0x06, 0xAF, 0x07, 0xAE, 0x09, + 0xEF, 0x00, 0xDB, 0xFE, 0xD9, 0x05, 0x39, 0x00, 0xD5, 0x1C, 0xBF, 0x05, + 0x6B, 0x10, 0x3A, 0xEC, 0x23, 0x0F, 0xBF, 0xEB, 0x7D, 0x29, 0x5E, 0x08, + 0xC6, 0x27, 0x74, 0x02, 0xDC, 0x1B, 0xC6, 0xF6, 0x87, 0x21, 0x9E, 0xFF, + 0xBF, 0x1B, 0xA9, 0x04, 0xE3, 0x07, 0xB8, 0x0C, 0x12, 0x03, 0x6C, 0x12, + 0xCA, 0x0F, 0xD1, 0x0D, 0x20, 0x12, 0x70, 0x07, 0x02, 0x0B, 0xD0, 0x08, + 0x02, 0x11, 0x48, 0x0D, 0x3F, 0x09, 0x09, 0x0F, 0x25, 0xFB, 0x3A, 0x15, + 0x5F, 0xFC, 0xB7, 0x17, 0x8A, 0x0E, 0x68, 0x1F, 0x6E, 0x24, 0xB9, 0x22, + 0x93, 0x25, 0xD2, 0x11, 0x22, 0x1F, 0xC8, 0x0D, 0x26, 0x0E, 0x55, 0x19, + 0x00, 0xFF, 0x1B, 0x1D, 0xDA, 0x07, 0x86, 0x1E, 0x51, 0x17, 0x14, 0x25, + 0x42, 0x1D, 0x21, 0x26, 0xC5, 0x2B, 0x75, 0x2F, 0x14, 0x3E, 0x4F, 0x39, + 0xC8, 0x2C, 0xCB, 0x20, 0x02, 0x16, 0xBD, 0x0B, 0x2F, 0x15, 0x93, 0x0A, + 0xEC, 0x17, 0xFB, 0x17, 0xAA, 0x0F, 0x0C, 0x1E, 0x15, 0x0F, 0xCF, 0x16, + 0xD4, 0x17, 0x65, 0x19, 0xDA, 0x13, 0xC8, 0x1D, 0xAF, 0x11, 0x48, 0x23, + 0x98, 0x1D, 0x97, 0x2D, 0x5E, 0x26, 0xA7, 0x35, 0xE5, 0x25, 0xC8, 0x2C, + 0xF9, 0x2B, 0x69, 0x1E, 0xF7, 0x32, 0x3C, 0x16, 0xE5, 0x27, 0x0F, 0x13, + 0xD5, 0x04, 0x77, 0x03, 0x2E, 0xE7, 0x72, 0xF2, 0xCD, 0xDF, 0xB2, 0xF0, + 0x86, 0xE2, 0x1A, 0xEE, 0x1D, 0xE2, 0x96, 0xF0, 0x4C, 0xD9, 0x7E, 0xF1, + 0x6E, 0xDA, 0x4D, 0xEA, 0xE3, 0xDF, 0x97, 0xE2, 0x6B, 0xEB, 0x27, 0xE7, + 0x49, 0xFB, 0x0A, 0xEF, 0x2C, 0x0C, 0xDD, 0xF9, 0xF4, 0x14, 0x16, 0x0B, + 0x11, 0x0B, 0x24, 0x11, 0xCD, 0x09, 0x7A, 0x0E, 0xF4, 0x02, 0x14, 0x04, + 0xC4, 0xF8, 0xC9, 0xF8, 0xED, 0x02, 0x9D, 0xF8, 0x6C, 0x00, 0xD3, 0xFB, + 0x54, 0xF1, 0x0B, 0xFC, 0x7B, 0xF7, 0xA8, 0xFE, 0xB1, 0xFC, 0x4A, 0xF5, + 0xC0, 0xF8, 0xF9, 0xE8, 0x96, 0x07, 0xB0, 0xFE, 0xB4, 0x13, 0xFD, 0x18, + 0x0A, 0xFB, 0x90, 0x07, 0x54, 0xEC, 0xD9, 0xFD, 0x9B, 0xE6, 0x08, 0x07, + 0x1A, 0xCA, 0xD2, 0xFC, 0x85, 0xBF, 0x34, 0xF3, 0x48, 0xDC, 0x82, 0x04, + 0x26, 0xF6, 0xE4, 0x0F, 0xDD, 0xEA, 0x96, 0xFD, 0x22, 0xE4, 0x62, 0x00, + 0x4D, 0xF2, 0xE8, 0x19, 0x69, 0xFF, 0xB7, 0x21, 0xD3, 0x13, 0x06, 0x22, + 0x29, 0x27, 0x10, 0x29, 0xE0, 0x2A, 0xCD, 0x20, 0xA0, 0x21, 0x90, 0x0A, + 0x23, 0x14, 0x9C, 0x02, 0x3C, 0x07, 0x69, 0xFC, 0x4A, 0xFA, 0xE5, 0xF4, + 0xCD, 0xF3, 0x29, 0xFA, 0x39, 0xE7, 0xBF, 0xF5, 0xE4, 0xDF, 0xC1, 0xFA, + 0x7E, 0xD1, 0x4B, 0xEE, 0x7C, 0xC9, 0xDB, 0xD9, 0x55, 0xE2, 0x89, 0xF1, + 0x18, 0xED, 0x26, 0x08, 0x74, 0xD8, 0x00, 0xFD, 0x49, 0xC8, 0x5C, 0xF0, + 0xC6, 0xC6, 0x79, 0xFE, 0x62, 0xBD, 0x59, 0xFD, 0x01, 0xC5, 0xED, 0xFB, + 0xA9, 0xC8, 0xF3, 0xF4, 0xEA, 0xBC, 0xBA, 0xD1, 0xFA, 0xBC, 0x89, 0xC5, + 0xD6, 0xBB, 0xEB, 0xCC, 0xB5, 0xC1, 0xAC, 0xD7, 0xB5, 0xCD, 0xBF, 0xE3, + 0x62, 0xD9, 0x95, 0xE7, 0xC8, 0xDD, 0xB4, 0xE1, 0x3E, 0xDC, 0x76, 0xE2, + 0x34, 0xDE, 0x28, 0xEB, 0xF4, 0xDD, 0x33, 0xE0, 0xE0, 0xDA, 0x0C, 0xD9, + 0x59, 0xE6, 0x02, 0xF1, 0x63, 0xFC, 0x58, 0x04, 0xE1, 0xFC, 0x54, 0x06, + 0x17, 0xF3, 0x5E, 0xFF, 0xF6, 0x09, 0x16, 0x08, 0x5E, 0x1C, 0x73, 0x14, + 0x73, 0x0C, 0xA1, 0x01, 0x8F, 0x05, 0x0C, 0xF1, 0xBD, 0x18, 0x5B, 0x0B, + 0xF7, 0x1C, 0xD7, 0x1C, 0xF0, 0x12, 0x80, 0x0C, 0xD2, 0x1F, 0x75, 0x11, + 0xA5, 0x35, 0x0E, 0x26, 0x03, 0x30, 0xC2, 0x26, 0x95, 0x1D, 0xB0, 0x21, + 0x71, 0x17, 0x9A, 0x2A, 0xEF, 0x06, 0xCD, 0x23, 0xB1, 0xF8, 0x54, 0x1C, + 0xE6, 0xF3, 0x22, 0x26, 0xDA, 0xFA, 0xC3, 0x28, 0x09, 0x09, 0xF0, 0x2B, + 0xB7, 0x05, 0xA6, 0x21, 0x68, 0x07, 0xB1, 0x19, 0x59, 0x0C, 0x7B, 0x23, + 0x40, 0x00, 0x31, 0x13, 0x51, 0xFB, 0x42, 0x0B, 0x0E, 0xF7, 0x00, 0x12, + 0x96, 0xDC, 0x0E, 0xF4, 0x4E, 0xC7, 0x9E, 0xD9, 0x62, 0xD4, 0x5F, 0xE5, + 0xE7, 0xDD, 0xE2, 0xEC, 0x2F, 0xE3, 0xE3, 0xF2, 0x7F, 0xF6, 0xFA, 0x02, + 0x6B, 0xF6, 0xE5, 0x06, 0xA5, 0xE9, 0xB2, 0x01, 0xFE, 0xE1, 0x72, 0xFF, + 0x49, 0xE3, 0x99, 0x08, 0xE7, 0xEB, 0x70, 0x12, 0xFC, 0xF2, 0x83, 0x10, + 0x60, 0xED, 0xB0, 0xFF, 0x3D, 0xD7, 0x61, 0xE8, 0xB8, 0xD2, 0x61, 0xE8, + 0xEE, 0xD9, 0xAE, 0xE8, 0x4E, 0xE1, 0x6F, 0xE2, 0x11, 0xF5, 0x95, 0xF0, + 0xB3, 0x00, 0x67, 0xEC, 0x87, 0xFD, 0xCA, 0xD2, 0x2F, 0xF4, 0x80, 0xCA, + 0x68, 0xF3, 0x78, 0xD8, 0xF9, 0xFE, 0xD8, 0xE7, 0x0B, 0x02, 0x39, 0xE9, + 0x75, 0xF7, 0x7E, 0xE3, 0x00, 0xF3, 0x66, 0xE3, 0x31, 0x06, 0xEF, 0xF6, + 0xA5, 0x13, 0x93, 0xFD, 0x0C, 0x14, 0x61, 0xEF, 0xF1, 0x1A, 0x2A, 0xF8, + 0x3A, 0x1A, 0x60, 0x0B, 0x74, 0x05, 0x61, 0xFE, 0xA7, 0xF5, 0x30, 0xEA, + 0x71, 0x0C, 0x4E, 0xF7, 0x33, 0x1D, 0x42, 0x08, 0xF1, 0x0B, 0x04, 0xFB, + 0xE2, 0x0A, 0x49, 0xEA, 0x0E, 0x12, 0x70, 0xE8, 0xB7, 0xEE, 0x62, 0xDB, + 0xEB, 0xC7, 0xAA, 0xDA, 0x10, 0xB8, 0xB0, 0xDF, 0xB0, 0xBC, 0xF4, 0xDB, + 0x0C, 0xDF, 0x39, 0xE5, 0xD2, 0xE7, 0x7E, 0xE1, 0x74, 0xD4, 0xC3, 0xD3, + 0x58, 0xD4, 0x59, 0xCF, 0xE5, 0xCE, 0xFD, 0xC1, 0xD5, 0xC7, 0xD0, 0xBD, + 0x24, 0xDB, 0xBA, 0xD4, 0xE0, 0xE9, 0x2F, 0xE9, 0x21, 0xEA, 0x4C, 0xE2, + 0xC2, 0xEF, 0x1C, 0xDA, 0x3A, 0xF0, 0xF0, 0xE9, 0xB1, 0xD6, 0x74, 0xDE, + 0x93, 0xC4, 0xD1, 0xC2, 0xCB, 0xD8, 0x93, 0xC6, 0x61, 0xEA, 0xB8, 0xC7, + 0x8F, 0xE1, 0xCD, 0xBC, 0xF4, 0xE2, 0x1B, 0xC1, 0x9F, 0xEB, 0xF7, 0xC4, + 0x0E, 0xE0, 0x56, 0xC1, 0x80, 0xDD, 0x4A, 0xCD, 0x98, 0xE5, 0x91, 0xD8, + 0xF7, 0xDF, 0xA1, 0xCB, 0xA3, 0xE4, 0xDC, 0xC2, 0x31, 0xF2, 0xD0, 0xCD, + 0x53, 0xEC, 0x39, 0xC9, 0x76, 0xED, 0x46, 0xC9, 0x46, 0xFF, 0xEB, 0xD3, + 0x14, 0xF6, 0xAA, 0xC7, 0xA3, 0xEE, 0x98, 0xCB, 0xCF, 0x05, 0x7C, 0xE7, + 0x8B, 0x0A, 0xA7, 0xEA, 0x0A, 0x06, 0x4D, 0xE1, 0xE7, 0x06, 0x83, 0xE8, + 0x58, 0x02, 0xF9, 0xF6, 0x22, 0xFF, 0xF9, 0xFB, 0xC9, 0x06, 0x61, 0x03, + 0x8B, 0x0F, 0xC5, 0x0B, 0x78, 0x1B, 0xAC, 0x12, 0xC8, 0x20, 0x85, 0x1B, + 0x45, 0x15, 0x61, 0x1F, 0xDA, 0x10, 0x85, 0x1F, 0xCA, 0x0E, 0xA2, 0x1D, + 0xA5, 0x0B, 0x41, 0x1D, 0xF0, 0x08, 0x5B, 0x1C, 0xAB, 0x10, 0x5B, 0x21, + 0xE4, 0x0F, 0xD0, 0x19, 0xB7, 0xFD, 0xF2, 0x02, 0x76, 0xFD, 0xE8, 0xFF, + 0x93, 0xFB, 0xEC, 0xFD, 0x09, 0xEE, 0x21, 0xF8, 0x31, 0xF8, 0xDB, 0x08, + 0xC9, 0x03, 0xB9, 0x16, 0x0E, 0xF7, 0xD2, 0x03, 0xC3, 0xFB, 0x62, 0xF4, + 0xD8, 0x06, 0x67, 0x00, 0x3A, 0xFE, 0xEA, 0x03, 0x91, 0xF8, 0x0D, 0xFC, + 0x49, 0xFA, 0xCC, 0xFC, 0xDC, 0x02, 0x9B, 0x07, 0xC4, 0x0F, 0xE6, 0x10, + 0x4C, 0x16, 0xC7, 0x0F, 0x40, 0x1E, 0x0C, 0x15, 0x4E, 0x2A, 0x5A, 0x1C, + 0xEF, 0x2A, 0x0A, 0x1C, 0x0B, 0x1C, 0xEC, 0x09, 0x6F, 0x11, 0x4C, 0xF2, + 0x16, 0x17, 0x34, 0xF0, 0x08, 0x1D, 0x53, 0xF8, 0x38, 0x18, 0x23, 0x03, + 0x00, 0x16, 0x20, 0x0D, 0xB1, 0x1C, 0x37, 0x09, 0x17, 0x18, 0xFF, 0xF6, + 0x53, 0x0F, 0xFA, 0xF4, 0xF0, 0x19, 0x4C, 0x0C, 0xA8, 0x20, 0x08, 0x13, + 0x7A, 0x20, 0x30, 0x0C, 0x12, 0x26, 0xB6, 0x0C, 0x50, 0x25, 0x51, 0x16, + 0x93, 0x14, 0xB1, 0x20, 0x13, 0x0F, 0xE3, 0x27, 0x03, 0x1A, 0xD4, 0x32, + 0x00, 0x17, 0xAA, 0x31, 0x63, 0x10, 0xB0, 0x21, 0x59, 0x00, 0xB0, 0x02, + 0xBE, 0x03, 0xEF, 0xFB, 0x67, 0x1E, 0x73, 0x19, 0xF4, 0x18, 0x10, 0x1D, + 0x53, 0x02, 0x3F, 0x05, 0xF4, 0xFD, 0xFD, 0xF5, 0x91, 0x0A, 0x14, 0xF1, + 0xCA, 0x0D, 0x8A, 0xF3, 0x0C, 0x0E, 0xDA, 0xFC, 0x69, 0x17, 0x6B, 0xFF, + 0xCC, 0x1A, 0x45, 0x03, 0x88, 0x14, 0x29, 0x08, 0x18, 0x04, 0x4A, 0xFC, + 0xE9, 0xFD, 0x4D, 0xF8, 0xC0, 0x00, 0x5D, 0xFB, 0xAC, 0x0A, 0x76, 0xFF, + 0x8B, 0x13, 0x38, 0x0D, 0xF7, 0x05, 0xCC, 0x09, 0x37, 0x03, 0x92, 0xFE, + 0xEB, 0x09, 0xB1, 0xFD, 0x11, 0x0E, 0xFA, 0x00, 0x0E, 0x13, 0xCF, 0xFF, + 0x6C, 0x12, 0x05, 0x03, 0x8E, 0x06, 0xAB, 0x01, 0x83, 0xFD, 0xA1, 0xFC, + 0x91, 0x06, 0x7A, 0x05, 0xAF, 0x03, 0x1C, 0x00, 0x29, 0xFE, 0xB5, 0xF6, + 0x0D, 0x0B, 0xF6, 0x08, 0xA8, 0x06, 0x3E, 0x0C, 0x29, 0x06, 0xC6, 0x11, + 0xA1, 0x1E, 0xFE, 0x30, 0x8B, 0x15, 0xF7, 0x27, 0x9C, 0x02, 0xFF, 0x10, + 0xAF, 0x0E, 0xD5, 0x20, 0x91, 0x18, 0x69, 0x35, 0x45, 0x0F, 0x36, 0x35, + 0xCA, 0x07, 0x31, 0x33, 0xD2, 0x0B, 0x32, 0x32, 0xDF, 0x09, 0x92, 0x24, + 0x26, 0x15, 0x23, 0x24, 0x8A, 0x30, 0x64, 0x35, 0x0E, 0x34, 0x91, 0x32, + 0xD3, 0x1F, 0x67, 0x19, 0x8D, 0x1D, 0x3E, 0x14, 0xEE, 0x2A, 0x8C, 0x24, + 0xF1, 0x23, 0xC4, 0x2B, 0xB2, 0x1B, 0x43, 0x2E, 0xF4, 0x14, 0x4F, 0x23, + 0x1E, 0x0F, 0x9A, 0x13, 0xD1, 0x13, 0x74, 0x1C, 0xBE, 0x18, 0xEE, 0x2A, + 0xFF, 0x1C, 0xD7, 0x30, 0x34, 0x17, 0xCB, 0x30, 0x23, 0x1C, 0x33, 0x2D, + 0x7C, 0x2B, 0xC7, 0x2D, 0xDA, 0x35, 0x27, 0x33, 0x8A, 0x39, 0xC2, 0x2A, + 0x88, 0x39, 0x37, 0x26, 0xB9, 0x3B, 0xE2, 0x30, 0xB9, 0x30, 0xCA, 0x2B, + 0xF2, 0x2A, 0x4A, 0x2D, 0x3A, 0x2F, 0xBE, 0x30, 0x9B, 0x27, 0x26, 0x1D, + 0x46, 0x29, 0x52, 0x17, 0x7C, 0x33, 0x7D, 0x25, 0xD2, 0x23, 0x24, 0x20, + 0x9C, 0x0E, 0x91, 0x10, 0xEA, 0x05, 0x13, 0x17, 0x48, 0x00, 0xA8, 0x27, + 0x34, 0xFC, 0xA0, 0x2B, 0xED, 0x05, 0x10, 0x2C, 0x89, 0x1D, 0xB6, 0x30, + 0x45, 0x16, 0xDF, 0x1D, 0x4A, 0x0C, 0xE4, 0x13, 0x68, 0x0D, 0x65, 0x18, + 0x55, 0xFD, 0xE5, 0x06, 0xA4, 0x09, 0x29, 0x0C, 0xFF, 0x27, 0xC5, 0x27, + 0x92, 0x26, 0x78, 0x24, 0x0F, 0x16, 0xB8, 0x14, 0x18, 0x12, 0x5E, 0x1D, + 0xF8, 0x10, 0x84, 0x2A, 0x42, 0x08, 0x74, 0x28, 0xCC, 0x0B, 0xCC, 0x2C, + 0xA5, 0x1F, 0x2B, 0x3C, 0xD4, 0x1B, 0x4F, 0x3A, 0xF1, 0xFF, 0xFC, 0x29, + 0x89, 0x01, 0x36, 0x25, 0x7C, 0x13, 0xA1, 0x27, 0xC2, 0x08, 0xC1, 0x1B, + 0x24, 0xF1, 0x0C, 0x06, 0xD2, 0xEF, 0xBC, 0x01, 0x36, 0xF3, 0x48, 0xF2, + 0xE3, 0xFA, 0xA0, 0xDD, 0x20, 0x04, 0x86, 0xDF, 0x3E, 0xF9, 0xBA, 0xE0, + 0x10, 0xF4, 0x37, 0xE3, 0x2E, 0xF1, 0x39, 0xEA, 0xE3, 0xDC, 0x67, 0xE3, + 0x2E, 0xD5, 0x17, 0xDC, 0xD1, 0xDD, 0x51, 0xDB, 0x7B, 0xE2, 0x61, 0xD5, + 0xC5, 0xE6, 0x6F, 0xD4, 0xF2, 0xF6, 0x08, 0xEC, 0x82, 0xF6, 0x64, 0xF7, + 0x03, 0xDD, 0xDB, 0xDD, 0x6B, 0xE0, 0xD0, 0xDD, 0x0B, 0xEF, 0x15, 0xF1, + 0x76, 0xDF, 0x1E, 0xEB, 0x20, 0xD9, 0xBB, 0xE8, 0xB1, 0xF4, 0x79, 0x02, + 0xB7, 0x00, 0x52, 0x0A, 0x92, 0xF1, 0xD7, 0xFD, 0xF3, 0xEB, 0xF2, 0x02, + 0xBA, 0xE9, 0x17, 0xFC, 0x25, 0xDF, 0x68, 0xEB, 0x24, 0xED, 0x7F, 0x00, + 0x44, 0xEC, 0x77, 0x09, 0x36, 0xD0, 0x70, 0xF3, 0x57, 0xD8, 0x22, 0xF6, + 0xE4, 0xFB, 0x48, 0x13, 0x09, 0x03, 0x49, 0x1A, 0x93, 0xF5, 0xE8, 0x0C, + 0x8E, 0xFE, 0x48, 0x0F, 0xB8, 0x0F, 0xCE, 0x19, 0x2A, 0x0E, 0xC9, 0x18, + 0x5F, 0x0F, 0x5E, 0x10, 0x8C, 0x16, 0x1E, 0x04, 0xB8, 0x01, 0x15, 0xEB, + 0xE5, 0xF2, 0xBB, 0xE6, 0xE1, 0xFE, 0x2D, 0x02, 0x38, 0xF2, 0x5A, 0x01, + 0x9F, 0xDC, 0xD7, 0xE7, 0x8E, 0xDD, 0x8B, 0xE3, 0xBF, 0xD2, 0x8F, 0xE0, + 0x40, 0xD1, 0xA3, 0xE6, 0x85, 0xE6, 0xBD, 0xF5, 0xEE, 0xDF, 0xB0, 0xEC, + 0x2C, 0xD6, 0x2B, 0xEA, 0xED, 0xE5, 0xCC, 0xFD, 0x47, 0xEF, 0x47, 0x01, + 0xC1, 0xDB, 0x0F, 0xE2, 0x59, 0xD5, 0xB9, 0xD4, 0x05, 0xE8, 0x10, 0xEA, + 0xA3, 0xDF, 0x5A, 0xE5, 0x98, 0xD4, 0x50, 0xD5, 0xEF, 0xDE, 0x0F, 0xD7, + 0x57, 0xD3, 0x38, 0xD4, 0x4A, 0xBE, 0xFD, 0xCE, 0xE7, 0xBE, 0x55, 0xCB, + 0xEF, 0xCF, 0x23, 0xC5, 0x8C, 0xD8, 0xA7, 0xB7, 0xC0, 0xD8, 0x1D, 0xB3, + 0xB2, 0xD6, 0xAF, 0xBC, 0x0E, 0xCD, 0x87, 0xC7, 0xE6, 0xCA, 0xAB, 0xD5, + 0xB4, 0xC7, 0xA5, 0xDB, 0xE5, 0xBB, 0x81, 0xD9, 0xE4, 0xD4, 0x45, 0xEE, + 0xB0, 0xF4, 0x39, 0xF6, 0x91, 0xE1, 0x73, 0xD5, 0x52, 0xCE, 0x34, 0xC2, + 0xDA, 0xF5, 0x49, 0xDF, 0x7E, 0x18, 0x7B, 0xF8, 0x3A, 0x07, 0xD2, 0xE8, + 0xBA, 0xFD, 0x98, 0xEA, 0x89, 0xFB, 0x93, 0xF3, 0x08, 0xF4, 0xA5, 0xEC, + 0x58, 0xFA, 0xB4, 0xF5, 0xBD, 0x00, 0x15, 0x01, 0x0A, 0xEF, 0x21, 0xF1, + 0xC7, 0xD9, 0x08, 0xD9, 0x78, 0xE1, 0x36, 0xD4, 0xE0, 0xE6, 0x65, 0xD3, + 0x84, 0xDE, 0x11, 0xD1, 0x4A, 0xE5, 0x26, 0xD2, 0xDC, 0xEA, 0x7F, 0xCC, + 0x1E, 0xF7, 0xDA, 0xD8, 0x8E, 0x04, 0x02, 0xEE, 0x4B, 0xF1, 0x78, 0xDE, + 0xB0, 0xDC, 0xC9, 0xD1, 0xA6, 0xD7, 0x0D, 0xD9, 0x6B, 0xD8, 0xFD, 0xD5, + 0x5F, 0xDB, 0x2B, 0xD8, 0x4F, 0xE1, 0x0B, 0xDF, 0xBE, 0xEC, 0x5C, 0xDE, + 0x9D, 0xE8, 0xEF, 0xDF, 0xEB, 0xDC, 0x4E, 0xEB, 0x31, 0xDA, 0x25, 0xF0, + 0x4B, 0xDE, 0x98, 0xE5, 0xCB, 0xE9, 0x20, 0xDF, 0xE5, 0xE9, 0x15, 0xE0, + 0x7A, 0xDF, 0x10, 0xE9, 0x8A, 0xCE, 0xFC, 0xEB, 0x92, 0xC7, 0xB0, 0xE9, + 0xBF, 0xCF, 0xED, 0xE8, 0xB6, 0xCC, 0x8D, 0xE8, 0x7B, 0xBC, 0x21, 0xDF, + 0x40, 0xC2, 0x2A, 0xD9, 0x20, 0xD7, 0x81, 0xE0, 0x91, 0xDD, 0x74, 0xE5, + 0x95, 0xF2, 0xB1, 0xF4, 0x08, 0x01, 0xBA, 0xEE, 0x05, 0xEC, 0x0A, 0xCA, + 0xB3, 0xE4, 0xD7, 0xC7, 0x2F, 0x00, 0x25, 0xF3, 0x83, 0x00, 0x43, 0xFD, + 0xE6, 0xF0, 0x85, 0xE7, 0xE5, 0x09, 0x1D, 0xED, 0x6F, 0x0E, 0xC5, 0xEB, + 0x92, 0xF2, 0xE0, 0xDB, 0xBA, 0xF7, 0xCE, 0xEB, 0xF4, 0x00, 0xAD, 0xF9, + 0x36, 0xED, 0x2A, 0xEA, 0xD3, 0xEB, 0xA4, 0xE7, 0x4B, 0x0D, 0xD2, 0xF8, + 0xDE, 0x21, 0x9F, 0xFE, 0xED, 0x1A, 0xE9, 0xFB, 0x24, 0x01, 0xF9, 0xF1, + 0xC6, 0xE4, 0x04, 0xED, 0x54, 0xE0, 0x05, 0xFA, 0x05, 0xF8, 0xF0, 0x05, + 0x9E, 0x02, 0xA4, 0xFE, 0x23, 0xEF, 0x77, 0xE7, 0x58, 0xE8, 0x5F, 0xDF, + 0xAB, 0xF6, 0x12, 0xE8, 0xE4, 0x01, 0x52, 0xF6, 0xCE, 0xFD, 0xAE, 0xFB, + 0xF4, 0xEF, 0x7D, 0xEA, 0x5E, 0xE4, 0xE6, 0xD4, 0x51, 0xF1, 0x1F, 0xDC, + 0xDF, 0x05, 0xFE, 0xF3, 0xDC, 0xFE, 0xB2, 0xFC, 0x74, 0xF4, 0xFA, 0xFD, + 0x90, 0xF3, 0xCF, 0xFA, 0xFA, 0xE9, 0x56, 0xF2, 0x31, 0xEC, 0x0B, 0xFC, + 0x59, 0xFA, 0x50, 0x09, 0xD5, 0x07, 0xBE, 0x06, 0x0F, 0x0D, 0x17, 0x02, + 0x3A, 0x0C, 0x51, 0x08, 0x6F, 0x0E, 0xE7, 0x08, 0xC3, 0x16, 0x06, 0x08, + 0xB6, 0x21, 0xEB, 0x13, 0x41, 0x13, 0xA1, 0x0A, 0x52, 0x03, 0x9A, 0x03, + 0x7A, 0x22, 0x6E, 0x2A, 0xB0, 0x33, 0xC9, 0x37, 0x66, 0x18, 0x5D, 0x16, + 0x4F, 0x09, 0x34, 0x0C, 0x11, 0x16, 0x54, 0x20, 0x86, 0x20, 0xAA, 0x28, + 0xE4, 0x22, 0xD0, 0x21, 0x7D, 0x2F, 0xFE, 0x23, 0xBC, 0x2E, 0x60, 0x12, + 0x2D, 0x23, 0x03, 0xFB, 0x01, 0x2E, 0x3D, 0x06, 0xDD, 0x34, 0x0C, 0x14, + 0xA0, 0x21, 0xBC, 0x0A, 0xD8, 0x1A, 0x9B, 0x07, 0x14, 0x24, 0x22, 0x09, + 0xE7, 0x26, 0x19, 0xFC, 0xB2, 0x31, 0xD4, 0x00, 0x96, 0x36, 0x32, 0x12, + 0xF6, 0x24, 0x0C, 0x0C, 0x77, 0x1C, 0x93, 0x0C, 0x6F, 0x20, 0xE2, 0x22, + 0x59, 0x27, 0xEE, 0x2E, 0x29, 0x29, 0x82, 0x2B, 0x48, 0x25, 0x6C, 0x2C, + 0xF1, 0x1D, 0x05, 0x33, 0x36, 0x12, 0x54, 0x38, 0xB1, 0x09, 0x12, 0x35, + 0x1C, 0x0B, 0x78, 0x29, 0x96, 0x15, 0x49, 0x1F, 0x0F, 0x20, 0x21, 0x20, + 0x0F, 0x14, 0x78, 0x17, 0x55, 0xFA, 0x93, 0xFC, 0xCB, 0xFF, 0x37, 0xFD, + 0x98, 0x0D, 0xA5, 0x11, 0x3E, 0x0C, 0x52, 0x11, 0x86, 0x12, 0xE3, 0x08, + 0x2C, 0x1F, 0x01, 0x0A, 0x17, 0x19, 0x96, 0x0C, 0xF3, 0x1F, 0x8D, 0x22, + 0xE8, 0x26, 0x28, 0x2F, 0x35, 0x03, 0x54, 0x0D, 0x6C, 0xF7, 0x05, 0xFC, + 0xD0, 0x19, 0xF1, 0x19, 0xE1, 0x1E, 0xA8, 0x20, 0x7B, 0x14, 0x3B, 0x06, + 0x87, 0x1C, 0x74, 0xF5, 0x6F, 0x28, 0x28, 0xFC, 0xB5, 0x34, 0xD4, 0x15, + 0xF0, 0x34, 0xD1, 0x2A, 0x81, 0x27, 0xCB, 0x25, 0x73, 0x11, 0xF6, 0x09, + 0xC0, 0x0E, 0xA3, 0x07, 0x07, 0x1D, 0xEB, 0x20, 0x29, 0x17, 0xF9, 0x2A, + 0xE1, 0x03, 0x4D, 0x1B, 0xFF, 0xF3, 0xFA, 0x08, 0xAF, 0xDE, 0x78, 0xFA, + 0x95, 0xE2, 0x43, 0xF9, 0x61, 0x00, 0x45, 0x01, 0xE5, 0x14, 0xFE, 0x05, + 0x47, 0x11, 0x89, 0x00, 0xA9, 0x09, 0x70, 0xF7, 0x38, 0x12, 0xB1, 0xFB, + 0x5E, 0x18, 0xF4, 0x03, 0x4D, 0x22, 0x57, 0x17, 0xB5, 0x1F, 0x31, 0x1D, + 0xEF, 0x1A, 0xBC, 0x13, 0x64, 0x27, 0x21, 0x09, 0x40, 0x30, 0x2F, 0x05, + 0x1C, 0x22, 0x18, 0xFF, 0x0E, 0x0F, 0x28, 0xF5, 0x49, 0x06, 0x96, 0xF8, + 0xD0, 0xF6, 0x94, 0xFE, 0x20, 0xF2, 0x67, 0x11, 0x27, 0xFA, 0xA0, 0x24, + 0x59, 0xF8, 0x52, 0x1B, 0x4F, 0x02, 0x87, 0x18, 0x42, 0x13, 0x9A, 0x28, + 0x36, 0x0E, 0x91, 0x2A, 0x2C, 0x14, 0xC4, 0x36, 0x27, 0x1D, 0x72, 0x38, + 0x1A, 0x0B, 0xC1, 0x1B, 0x0E, 0x07, 0x89, 0x16, 0x3A, 0x2D, 0x61, 0x38, + 0xA2, 0x46, 0x51, 0x46, 0xCB, 0x36, 0x2B, 0x27, 0xF9, 0x25, 0xCE, 0x13, + 0x10, 0x27, 0x07, 0x24, 0xC8, 0x27, 0x84, 0x2E, 0x28, 0x31, 0x46, 0x31, + 0x1E, 0x45, 0x65, 0x35, 0xBE, 0x3D, 0x15, 0x2A, 0xD1, 0x2B, 0x1A, 0x27, + 0xAB, 0x2D, 0xD7, 0x32, 0xB9, 0x2E, 0x60, 0x35, 0x99, 0x21, 0xDF, 0x26, + 0x46, 0x1C, 0x9D, 0x23, 0xF7, 0x1D, 0xB3, 0x2E, 0x59, 0x1E, 0xB6, 0x2E, + 0xC8, 0x2E, 0xC3, 0x39, 0xDA, 0x2D, 0x2C, 0x39, 0xC3, 0x0E, 0x27, 0x1D, + 0x2C, 0x0C, 0x88, 0x17, 0xEC, 0x1E, 0xE0, 0x21, 0x49, 0x1A, 0x82, 0x1F, + 0x4A, 0x11, 0x77, 0x22, 0x68, 0x0E, 0x46, 0x24, 0x82, 0x07, 0x25, 0x14, + 0x82, 0x01, 0xF3, 0xFD, 0x14, 0x00, 0x65, 0xF7, 0xE8, 0xF2, 0x2F, 0xF6, + 0x89, 0xE4, 0x37, 0xF7, 0x4B, 0xDD, 0x47, 0xFB, 0xB5, 0xD1, 0xF5, 0xF3, + 0x26, 0xDF, 0x31, 0x05, 0x9E, 0x01, 0xEF, 0x26, 0xD7, 0x07, 0xAF, 0x22, + 0x3C, 0xF8, 0x97, 0x0D, 0xC1, 0xF8, 0xF7, 0x0D, 0x0D, 0xF0, 0x07, 0x07, + 0xCC, 0xEC, 0xA1, 0x01, 0xE4, 0xF8, 0xF6, 0xFA, 0xC5, 0xF0, 0x64, 0xE3, + 0xEB, 0xE8, 0xAB, 0xD9, 0xDB, 0x09, 0x24, 0xF0, 0x85, 0x1E, 0x0F, 0xF6, + 0x4E, 0x02, 0x93, 0xE0, 0xDB, 0xF5, 0xC0, 0xF3, 0xC9, 0x05, 0x18, 0x1C, + 0x6A, 0x19, 0x4C, 0x2E, 0xBA, 0x22, 0xEE, 0x2F, 0x72, 0x14, 0x0F, 0x28, + 0x7C, 0xF8, 0xD5, 0x1A, 0xAF, 0xEA, 0x79, 0x12, 0xF8, 0xF2, 0x1F, 0x16, + 0x60, 0xFF, 0x3A, 0x15, 0xC8, 0x02, 0xC7, 0x0A, 0x5F, 0x0B, 0x1E, 0x0B, + 0x7A, 0x0D, 0x96, 0x09, 0xCC, 0xFF, 0x7A, 0x07, 0xD7, 0xFE, 0xD0, 0x14, + 0x2E, 0x01, 0x19, 0x0F, 0x65, 0xFC, 0x47, 0xFA, 0x0B, 0xF3, 0xD8, 0xEF, + 0x8E, 0xE4, 0x98, 0xE8, 0xA4, 0xD4, 0xFC, 0xDA, 0xF7, 0xD9, 0xF3, 0xDA, + 0x9D, 0xF4, 0xD7, 0xE8, 0xA3, 0xF8, 0x65, 0xE8, 0x69, 0xEB, 0xF9, 0xE0, + 0xDB, 0xEC, 0x51, 0xE2, 0x0D, 0xF3, 0x77, 0xE8, 0xF8, 0xF3, 0xC0, 0xF6, + 0xAF, 0xD6, 0x02, 0xF4, 0x76, 0xBF, 0x26, 0xEE, 0xE9, 0xCB, 0x72, 0xF5, + 0x47, 0xD4, 0x3F, 0xF1, 0xA2, 0xDC, 0x85, 0xEB, 0xAD, 0xE3, 0x82, 0xEA, + 0xDA, 0xD0, 0x96, 0xD2, 0x2D, 0xD1, 0x3A, 0xC7, 0x18, 0xEC, 0x2E, 0xDE, + 0x28, 0xE4, 0xFD, 0xDF, 0x2E, 0xCC, 0xF2, 0xCD, 0x00, 0xE2, 0xA2, 0xE0, + 0x9F, 0xFF, 0x35, 0x00, 0x30, 0xE9, 0x7C, 0xF3, 0x05, 0xD4, 0xA4, 0xEB, + 0xEF, 0xD9, 0xE3, 0xFB, 0xC0, 0xEC, 0x4C, 0x03, 0xFB, 0x03, 0x69, 0x03, + 0xE5, 0x11, 0xB1, 0x04, 0x95, 0x04, 0xD6, 0xF5, 0x53, 0xF2, 0x25, 0xE5, + 0x7B, 0xFB, 0x8A, 0xEB, 0x8D, 0x0C, 0xEF, 0xF9, 0x15, 0x09, 0xA6, 0xF7, + 0x19, 0xFD, 0xD4, 0xEE, 0x33, 0xFB, 0x11, 0xF1, 0xF1, 0xF7, 0x01, 0xF4, + 0xE1, 0xF7, 0x61, 0xFF, 0x43, 0xFC, 0x9D, 0x08, 0x2A, 0xF9, 0xC3, 0xF6, + 0x73, 0xF7, 0xC4, 0xEA, 0x11, 0xFD, 0xB9, 0xFD, 0xC9, 0xFE, 0x30, 0x0E, + 0x7E, 0xFA, 0xD8, 0x0E, 0x12, 0xF6, 0xBA, 0x10, 0xD0, 0xF5, 0xB3, 0x0D, + 0x75, 0xF5, 0xB4, 0xFB, 0xF7, 0xFD, 0xA4, 0xFE, 0x9A, 0xFC, 0xC8, 0x04, + 0x4B, 0xF4, 0x09, 0xFF, 0xFC, 0xE0, 0x5D, 0xF7, 0x89, 0xD1, 0xE0, 0xF9, + 0x02, 0xE5, 0x56, 0x02, 0xE0, 0xFB, 0x04, 0xF8, 0xAA, 0x06, 0xFB, 0xF5, + 0x9C, 0x04, 0x8F, 0x00, 0x95, 0xF4, 0x27, 0xF2, 0x62, 0xF7, 0xC4, 0xEF, + 0x63, 0x09, 0x6D, 0x09, 0xCF, 0xFA, 0x5B, 0x02, 0x5D, 0xE4, 0x08, 0xF2, + 0x9E, 0xF7, 0x20, 0x02, 0x37, 0x10, 0x4D, 0x17, 0x41, 0x00, 0xE9, 0x14, + 0xD4, 0xF4, 0xC8, 0x12, 0x02, 0xF9, 0x22, 0x12, 0xD6, 0xFE, 0xBC, 0x0D, + 0xB4, 0x11, 0x2E, 0x14, 0x5B, 0x21, 0xCD, 0x17, 0x68, 0x18, 0x41, 0x08, + 0xEF, 0x07, 0xB0, 0xF6, 0x84, 0x0C, 0xE1, 0xFA, 0x12, 0x08, 0x58, 0x03, + 0x09, 0xF7, 0x2C, 0x04, 0xB4, 0xF0, 0xD3, 0x01, 0xA5, 0xE5, 0xD5, 0xFA, + 0xA7, 0xE2, 0x2D, 0xF9, 0x38, 0xFA, 0x44, 0x05, 0x64, 0x10, 0xAA, 0x09, + 0x58, 0x08, 0x35, 0xF6, 0xB8, 0xFF, 0x3A, 0xE9, 0x3D, 0x0B, 0x02, 0xEF, + 0x50, 0x0B, 0x22, 0xED, 0x52, 0x09, 0xBD, 0xE8, 0xDE, 0x0D, 0x50, 0xEB, + 0x6A, 0xFC, 0x30, 0xE2, 0xEB, 0xF2, 0x52, 0xDE, 0xF5, 0x01, 0x21, 0xE5, + 0xC5, 0xFA, 0xE7, 0xD9, 0xAD, 0xE7, 0xED, 0xCF, 0x2C, 0xD4, 0x90, 0xCB, + 0x7A, 0xC7, 0xB4, 0xCF, 0xC0, 0xCB, 0x7A, 0xDD, 0x61, 0xCF, 0xFA, 0xE2, + 0xCD, 0xD4, 0xA5, 0xE8, 0x50, 0xD6, 0xC1, 0xE6, 0x73, 0xCD, 0xE3, 0xDA, + 0xB2, 0xDD, 0x19, 0xE1, 0x26, 0xF1, 0xC5, 0xE3, 0x16, 0xD3, 0x24, 0xC8, + 0xE3, 0xCB, 0x3D, 0xCC, 0x2A, 0xFE, 0x4B, 0xFA, 0x8A, 0x10, 0x69, 0x0A, + 0x1A, 0xF0, 0x17, 0xFB, 0x1E, 0xDF, 0x2B, 0xF4, 0xFA, 0xE0, 0x00, 0xEB, + 0x64, 0xE4, 0xE8, 0xE1, 0xC2, 0xFE, 0x0A, 0xF1, 0x0D, 0x0E, 0x6C, 0xF7, + 0x14, 0xF3, 0x79, 0xDB, 0x0D, 0xE8, 0x8C, 0xCF, 0x1B, 0xF5, 0x63, 0xDD, + 0x9D, 0xE7, 0xDE, 0xDE, 0x28, 0xD8, 0xCC, 0xE4, 0x64, 0xD7, 0xBE, 0xE8, + 0xD2, 0xCB, 0xE6, 0xCE, 0xA5, 0xD0, 0x52, 0xCB, 0x94, 0xF1, 0x71, 0xEC, + 0x5B, 0xFD, 0xF0, 0xF3, 0x5C, 0xE8, 0xB3, 0xD9, 0x68, 0xE1, 0x2E, 0xD2, + 0xF3, 0xE4, 0xFD, 0xD7, 0x74, 0xE9, 0x7A, 0xD3, 0x50, 0x04, 0xD1, 0xDD, + 0x8B, 0x0E, 0x59, 0xE9, 0xA9, 0xEE, 0xA2, 0xD7, 0x62, 0xE2, 0x92, 0xDA, + 0xBD, 0xEF, 0x28, 0xF1, 0x2A, 0xF2, 0x8D, 0xE9, 0xF3, 0xE5, 0xDD, 0xD8, + 0xBF, 0xD6, 0x16, 0xD9, 0x3B, 0xDE, 0x1C, 0xE6, 0x62, 0xE3, 0xA0, 0xDB, + 0xA7, 0xDF, 0xD4, 0xCD, 0xC6, 0xE0, 0xF4, 0xD3, 0x65, 0xE1, 0x2B, 0xD4, + 0xE1, 0xF6, 0xA0, 0xE5, 0xB1, 0x1B, 0xEC, 0x05, 0x4D, 0x0C, 0xBE, 0xFC, + 0x13, 0xEA, 0x7A, 0xEF, 0x28, 0xF5, 0xFE, 0xFC, 0xD8, 0x09, 0xD0, 0xFF, + 0x23, 0x05, 0x65, 0xF8, 0x2C, 0xF3, 0x50, 0xF5, 0x83, 0xEC, 0x13, 0xF3, + 0xAA, 0xF7, 0x79, 0xF3, 0x88, 0x16, 0x5F, 0x08, 0x79, 0x36, 0xF6, 0x18, + 0xA4, 0x34, 0x61, 0x0D, 0x02, 0x1B, 0xEA, 0xFE, 0x0A, 0x16, 0xD1, 0x03, + 0x41, 0x16, 0x80, 0x11, 0x8F, 0x0B, 0xCB, 0x20, 0x27, 0x08, 0x74, 0x2A, + 0xC8, 0xF8, 0x18, 0x11, 0x5E, 0xE2, 0xB3, 0xF4, 0x3B, 0xEF, 0x5D, 0x04, + 0x45, 0x01, 0xA0, 0x10, 0x2C, 0xF3, 0x3B, 0xF7, 0xC7, 0xF0, 0x24, 0xE7, + 0xFA, 0x00, 0x07, 0xF3, 0x6F, 0x09, 0xD3, 0xFF, 0x5D, 0x11, 0xDC, 0x00, + 0x14, 0x18, 0x3A, 0xFF, 0x74, 0x06, 0xE4, 0xF3, 0x2F, 0xED, 0xD7, 0xE6, + 0x17, 0xEF, 0x85, 0xEE, 0xB9, 0xFB, 0xDF, 0xEF, 0x5F, 0xFB, 0xCB, 0xDB, + 0xA4, 0xE3, 0x68, 0xC7, 0xEE, 0xD9, 0xB9, 0xD9, 0xC6, 0xE3, 0xC1, 0xF3, + 0xA3, 0xE2, 0x80, 0xEA, 0x8B, 0xD9, 0xEF, 0xDD, 0xFE, 0xD0, 0xEA, 0xE3, + 0x4D, 0xDB, 0x91, 0xF4, 0x18, 0x0A, 0xE8, 0x10, 0xEF, 0x19, 0x8D, 0x13, + 0xBF, 0xEA, 0x21, 0xEF, 0xD8, 0xCC, 0xE2, 0xDF, 0x61, 0xF1, 0xD3, 0x00, + 0xD9, 0x18, 0x5F, 0x13, 0x0E, 0x0A, 0xF6, 0xFD, 0x93, 0xF3, 0x02, 0xF8, + 0x47, 0xEF, 0x61, 0xFC, 0xCA, 0x0A, 0xC4, 0x09, 0xA7, 0x31, 0xD0, 0x20, + 0x52, 0x2F, 0xA1, 0x1B, 0xFD, 0x0D, 0x00, 0x02, 0x62, 0x02, 0xFD, 0x02, + 0x8D, 0x10, 0x71, 0x1A, 0xC6, 0x0F, 0xD9, 0x1C, 0xA9, 0x08, 0x2C, 0x17, + 0xBC, 0x03, 0x28, 0x0A, 0x9C, 0xF7, 0x71, 0xEB, 0x88, 0xF6, 0x12, 0xE6, + 0x06, 0xFB, 0x8D, 0xF7, 0xA9, 0xF1, 0x37, 0xF4, 0x38, 0xEC, 0x13, 0xDE, + 0x79, 0xFD, 0x0C, 0xD4, 0x7E, 0x15, 0xD1, 0xDE, 0x95, 0x20, 0xA5, 0xE8, + 0xC1, 0x28, 0x4B, 0xF8, 0x67, 0x17, 0x7B, 0xF8, 0xD7, 0xF9, 0xF3, 0xF2, + 0x18, 0xF5, 0x7A, 0x0A, 0xFF, 0x00, 0x9E, 0x19, 0xC2, 0xF9, 0xB3, 0xFB, + 0x6B, 0xE7, 0xFE, 0xDD, 0xC1, 0xEF, 0xE5, 0xEE, 0x22, 0xEB, 0xDB, 0xF8, + 0x91, 0xDD, 0x24, 0xEC, 0xE6, 0xE9, 0x88, 0xEC, 0xF3, 0xF2, 0xF0, 0xEE, + 0xEC, 0xEE, 0x52, 0xF1, 0x26, 0x06, 0x1B, 0x18, 0xD7, 0x16, 0xDC, 0x28, + 0x90, 0xF7, 0x3D, 0x02, 0x08, 0xE9, 0xC5, 0xF2, 0xD0, 0x06, 0x81, 0x08, + 0x37, 0x0E, 0x47, 0x08, 0xB3, 0xF3, 0xA2, 0xEB, 0x5B, 0xEE, 0x99, 0xE2, + 0xAE, 0xFC, 0x70, 0xEB, 0x2D, 0x0D, 0x3B, 0xFB, 0x16, 0x26, 0x61, 0x15, + 0xBE, 0x26, 0x7A, 0x19, 0x83, 0x01, 0x4D, 0x07, 0xC3, 0xF6, 0x19, 0x10, + 0x16, 0x0B, 0x0E, 0x2B, 0x5C, 0x13, 0x06, 0x35, 0x86, 0x1A, 0x97, 0x33, + 0x56, 0x24, 0x78, 0x2C, 0x0D, 0x20, 0xD4, 0x17, 0xEF, 0x1B, 0x15, 0x02, + 0x4C, 0x25, 0x63, 0x02, 0x49, 0x20, 0x34, 0x04, 0x7F, 0x0F, 0x58, 0xF6, + 0xA0, 0x1A, 0x36, 0xFC, 0xF7, 0x2D, 0x33, 0x13, 0x95, 0x29, 0xF7, 0x1A, + 0xA3, 0x28, 0x59, 0x28, 0xB5, 0x29, 0x14, 0x2A, 0x53, 0x2C, 0x07, 0x1E, + 0x97, 0x28, 0x33, 0x24, 0x9B, 0x22, 0xEF, 0x3E, 0x1B, 0x22, 0xAB, 0x42, + 0x0E, 0x22, 0x70, 0x23, 0xAD, 0x3A, 0xBA, 0x28, 0x53, 0x44, 0xA5, 0x36, + 0xCD, 0x2D, 0xD6, 0x1D, 0x9B, 0x2D, 0x52, 0x18, 0x75, 0x32, 0x2E, 0x20, + 0x28, 0x26, 0x7E, 0x1C, 0x07, 0x37, 0xB6, 0x40, 0x0F, 0x42, 0x11, 0x5E, + 0xD1, 0x2C, 0xDD, 0x3F, 0x43, 0x30, 0xCC, 0x33, 0x81, 0x46, 0xA0, 0x59, + 0x01, 0x39, 0x6D, 0x5C, 0xD3, 0x20, 0xFF, 0x3A, 0xA2, 0x1E, 0xF9, 0x2F, + 0xC5, 0x26, 0x00, 0x36, 0x3D, 0x38, 0x4C, 0x45, 0xC3, 0x42, 0x6B, 0x58, + 0xE3, 0x32, 0x6E, 0x55, 0x9B, 0x14, 0xBA, 0x3B, 0x88, 0x0F, 0xB1, 0x3B, + 0x62, 0x25, 0xCF, 0x4F, 0xE3, 0x2E, 0x19, 0x49, 0x4F, 0x2C, 0x95, 0x37, + 0xBA, 0x27, 0xF0, 0x28, 0x6C, 0x0F, 0x47, 0x0B, 0xC4, 0x00, 0x77, 0xFF, + 0x29, 0x09, 0x1D, 0x0B, 0x47, 0x05, 0xE5, 0x05, 0x10, 0x01, 0xB1, 0xF6, + 0x49, 0x0A, 0xEA, 0xF5, 0xFA, 0x08, 0xE8, 0xF5, 0x5A, 0x0C, 0x06, 0x01, + 0x02, 0x1A, 0x56, 0x19, 0x40, 0x1D, 0x08, 0x1A, 0x41, 0x28, 0x12, 0x1E, + 0x6E, 0x33, 0x25, 0x2D, 0x3F, 0x2E, 0xB3, 0x2E, 0x0F, 0x1A, 0xB0, 0x0E, + 0xB7, 0x18, 0xFA, 0xF4, 0x7D, 0x2D, 0x14, 0x06, 0x75, 0x30, 0xFE, 0x0E, + 0x10, 0x25, 0x21, 0x03, 0xA9, 0x1C, 0xA4, 0x06, 0xA8, 0x06, 0xF2, 0x06, + 0xAC, 0xF8, 0x05, 0x0A, 0x7D, 0x07, 0xD4, 0x26, 0x3A, 0xF5, 0x71, 0x1F, + 0x96, 0xD4, 0x5F, 0xFD, 0xE3, 0xE3, 0xFD, 0x05, 0x69, 0x09, 0xF9, 0x30, + 0x52, 0x11, 0xC5, 0x37, 0x7A, 0x03, 0x14, 0x21, 0xF8, 0x00, 0x89, 0x1B, + 0xFA, 0x0D, 0x39, 0x26, 0xC9, 0x25, 0x8A, 0x3D, 0x9E, 0x2F, 0xC4, 0x40, + 0xA7, 0x1D, 0x7A, 0x23, 0xC8, 0x15, 0x04, 0x1B, 0xF7, 0x1C, 0x81, 0x30, + 0xB8, 0x18, 0xB5, 0x36, 0x92, 0x12, 0x86, 0x2F, 0xEE, 0x10, 0x4D, 0x24, + 0xDB, 0x08, 0x44, 0x07, 0x25, 0xFE, 0xE3, 0xF9, 0xBB, 0x07, 0x2C, 0x12, + 0x91, 0x1C, 0x61, 0x1F, 0xAA, 0x22, 0xB2, 0x15, 0x48, 0x19, 0x01, 0x11, + 0x4B, 0x12, 0x34, 0x18, 0xEA, 0x09, 0x9D, 0x16, 0x07, 0x0F, 0x24, 0x1D, + 0xFA, 0x15, 0xC2, 0x27, 0x78, 0x1D, 0x5A, 0x29, 0xBC, 0x2D, 0xBE, 0x2A, + 0xC4, 0x2B, 0x21, 0x14, 0xE8, 0x16, 0x1B, 0xF2, 0x39, 0xF8, 0xB0, 0xDF, + 0xB6, 0xEF, 0x76, 0xE8, 0xC8, 0xF7, 0xF1, 0xF7, 0xAE, 0xFF, 0xF9, 0xF6, + 0x09, 0x08, 0xE1, 0xE9, 0xE3, 0xFF, 0xC5, 0xD3, 0x6D, 0xF5, 0x8B, 0xC9, + 0x45, 0x0E, 0xBD, 0xEC, 0x0C, 0x15, 0x79, 0x04, 0x3F, 0xF2, 0xE6, 0xF4, + 0xFD, 0xE0, 0x21, 0xF3, 0x83, 0xFC, 0x94, 0x12, 0x60, 0x15, 0x77, 0x26, + 0x66, 0x0E, 0xE1, 0x16, 0xB2, 0x04, 0x6B, 0x09, 0xEB, 0xFE, 0x9D, 0x03, + 0x69, 0x03, 0x93, 0x0C, 0x16, 0x05, 0x8E, 0x1F, 0xA1, 0xF4, 0x84, 0x17, + 0xF3, 0xE6, 0xAB, 0xFD, 0x74, 0xEF, 0x40, 0xFF, 0x17, 0xF7, 0x9A, 0x09, + 0xA3, 0xF3, 0xCE, 0x06, 0x0F, 0xF0, 0x04, 0x07, 0x8F, 0xDF, 0x73, 0xFA, + 0x5E, 0xCA, 0x44, 0xE5, 0x15, 0xCE, 0x60, 0xEA, 0xA3, 0xE3, 0x91, 0xFA, + 0x80, 0xE9, 0xDA, 0xEE, 0x84, 0xE2, 0x23, 0xDB, 0x95, 0xE1, 0xAE, 0xDA, + 0xB0, 0xDE, 0xCC, 0xDB, 0x22, 0xDE, 0x57, 0xD9, 0xFD, 0xE4, 0xFF, 0xE1, + 0x04, 0xDA, 0xF1, 0xE4, 0xC4, 0xD8, 0xE7, 0xEA, 0x01, 0xE4, 0x09, 0xED, + 0x4B, 0xEF, 0x44, 0xE6, 0x85, 0xED, 0xBA, 0xD2, 0x78, 0xE1, 0x4F, 0xC8, + 0x4F, 0xDF, 0xA1, 0xDB, 0xD2, 0xDC, 0x6B, 0xDE, 0xA4, 0xE7, 0x7C, 0xD9, + 0xA9, 0xF0, 0x0C, 0xDC, 0x88, 0xDE, 0xE7, 0xD2, 0x85, 0xDB, 0x70, 0xDF, + 0x75, 0xEF, 0x6D, 0xFE, 0xBB, 0xD9, 0x43, 0xE9, 0x79, 0xB0, 0xAD, 0xC4, + 0x78, 0xAF, 0x67, 0xD4, 0x92, 0xCD, 0x86, 0xF3, 0xEB, 0xD7, 0x92, 0xEC, + 0x8D, 0xD2, 0x4C, 0xDD, 0xD0, 0xCF, 0x5D, 0xDB, 0xF2, 0xC7, 0x57, 0xD7, + 0x07, 0xDD, 0x05, 0xEB, 0x61, 0x00, 0x7E, 0x01, 0x38, 0xF9, 0x07, 0xF0, + 0x4D, 0xDB, 0xF9, 0xD3, 0x20, 0xE2, 0x2C, 0xDB, 0x74, 0xEF, 0x47, 0xE3, + 0xF9, 0xEB, 0x16, 0xE1, 0x9F, 0xE5, 0xA4, 0xE6, 0xCA, 0xD4, 0x56, 0xD6, + 0x4B, 0xD5, 0x35, 0xCC, 0x7D, 0xE5, 0xC0, 0xDA, 0xE2, 0xE2, 0xFD, 0xDF, + 0xDE, 0xDE, 0x94, 0xE1, 0x44, 0xE7, 0x37, 0xE3, 0x05, 0xEC, 0xCE, 0xDC, + 0xE4, 0xEC, 0x61, 0xE2, 0x77, 0xF1, 0x15, 0xFA, 0xB1, 0xEF, 0x70, 0xF7, + 0xDD, 0xEF, 0x97, 0xE0, 0x4A, 0xF3, 0x9C, 0xE2, 0xA1, 0xE8, 0x30, 0xEE, + 0x5D, 0xE0, 0xB2, 0xE7, 0x28, 0xDD, 0x53, 0xD3, 0x62, 0xE7, 0x9B, 0xD2, + 0xFC, 0xED, 0x28, 0xD6, 0x8A, 0xE5, 0x19, 0xD3, 0xAD, 0xDD, 0xF9, 0xCE, + 0x83, 0xD7, 0xE3, 0xB9, 0x9D, 0xD7, 0xE6, 0xAF, 0xC3, 0xE6, 0x2E, 0xDB, + 0x16, 0xE9, 0x2B, 0xFC, 0x36, 0xD3, 0x54, 0xDC, 0x5C, 0xCD, 0xB4, 0xC3, + 0x87, 0xDF, 0x93, 0xE0, 0x7E, 0xEA, 0xB0, 0xF9, 0x85, 0xE7, 0x90, 0xEF, + 0xB2, 0xF1, 0x81, 0xEC, 0xEE, 0xF8, 0x5E, 0xE9, 0xA6, 0xFE, 0x7C, 0xEE, + 0xE4, 0x0C, 0x94, 0x12, 0x08, 0x09, 0x0C, 0x21, 0x15, 0xF4, 0x31, 0xFD, + 0x69, 0xEA, 0x7F, 0xE4, 0xBB, 0xEE, 0x3A, 0xEF, 0xB4, 0xEB, 0xE3, 0xEC, + 0xE4, 0xE7, 0x17, 0xE8, 0x07, 0xDC, 0xA0, 0xEA, 0xF6, 0xC3, 0xAD, 0xDE, + 0xA1, 0xC5, 0x13, 0xE0, 0x2C, 0xE2, 0x78, 0xF5, 0x36, 0xEE, 0xF7, 0xF4, + 0x42, 0xE2, 0xE0, 0xE3, 0x39, 0xDA, 0xD9, 0xDE, 0xA4, 0xDF, 0x12, 0xDC, + 0xA6, 0xED, 0xAC, 0xDB, 0x92, 0x06, 0xD2, 0xEF, 0x41, 0x10, 0xC0, 0xFA, + 0xFD, 0x0A, 0xC7, 0xF8, 0xB5, 0x0C, 0x8F, 0xFA, 0x81, 0x0D, 0x12, 0xF2, + 0xD2, 0xF9, 0x0E, 0xD3, 0xE1, 0xEE, 0x11, 0xC5, 0x19, 0x02, 0x84, 0xD6, + 0x2A, 0x0E, 0x54, 0xD9, 0x83, 0x19, 0x7F, 0xE3, 0x86, 0x15, 0xB6, 0xEC, + 0x6F, 0xF9, 0x9E, 0xDB, 0xBB, 0x01, 0x4B, 0xED, 0x8A, 0x23, 0xB6, 0x20, + 0x1F, 0x13, 0x76, 0x20, 0x45, 0xEF, 0x01, 0xFF, 0xB0, 0xF7, 0x32, 0x00, + 0x43, 0x15, 0xAC, 0x14, 0xDC, 0x18, 0x51, 0x12, 0x77, 0x10, 0x4C, 0x0C, + 0x6D, 0x0F, 0xB6, 0x0F, 0xD0, 0x05, 0x7F, 0x0C, 0x1B, 0x0E, 0x02, 0x1D, + 0xCD, 0x1E, 0xC1, 0x2E, 0x86, 0x0E, 0x96, 0x1C, 0x79, 0x00, 0xB7, 0x0C, + 0x5C, 0x16, 0x9F, 0x1E, 0x38, 0x20, 0xE2, 0x2A, 0xBF, 0x15, 0x6F, 0x2A, + 0x1D, 0x12, 0x16, 0x2B, 0x6B, 0x07, 0x88, 0x1B, 0x1A, 0x00, 0xA8, 0x10, + 0xB0, 0x15, 0xAB, 0x21, 0x8F, 0x2F, 0x6A, 0x26, 0x08, 0x30, 0x28, 0x0B, + 0x4D, 0x21, 0xC7, 0xFA, 0xAB, 0x18, 0x04, 0x0B, 0xDF, 0x11, 0x58, 0x14, + 0x9D, 0x16, 0xB8, 0x15, 0x9B, 0x25, 0x80, 0x18, 0x03, 0x22, 0x42, 0x05, + 0x50, 0x1B, 0x76, 0xFC, 0xF6, 0x19, 0x6E, 0x02, 0x36, 0x1A, 0xD4, 0xF9, + 0xCA, 0x05, 0x7B, 0xE0, 0x39, 0xEF, 0x45, 0xE6, 0x00, 0xE4, 0xA6, 0xFB, + 0x09, 0xD8, 0xB3, 0xF3, 0xA3, 0xE0, 0xE7, 0xEA, 0xB7, 0xF4, 0x22, 0xE7, + 0xAD, 0xF3, 0x52, 0xDD, 0xA1, 0xF6, 0xC3, 0xF0, 0xB0, 0x0B, 0x5E, 0x13, + 0x22, 0xFB, 0xF1, 0x00, 0x9E, 0xE0, 0xDA, 0xEB, 0x17, 0xFD, 0x6E, 0x0E, + 0x16, 0x28, 0x55, 0x25, 0x7C, 0x22, 0x5C, 0x00, 0x1D, 0x0C, 0xB4, 0xDD, + 0xD8, 0xFE, 0x5E, 0xD4, 0x9A, 0xF7, 0x89, 0xD7, 0x3C, 0x0D, 0x93, 0xFF, + 0x76, 0x1D, 0x5B, 0x20, 0x04, 0x02, 0xF0, 0x0E, 0x4B, 0xF4, 0xC7, 0x0C, + 0x49, 0x0B, 0x45, 0x25, 0xF6, 0x0B, 0xAD, 0x18, 0x34, 0xF8, 0xAE, 0x03, + 0x67, 0xEA, 0x9E, 0x01, 0xA3, 0xE2, 0x3E, 0xFD, 0xD5, 0xED, 0x73, 0x08, + 0x17, 0x07, 0x04, 0x1D, 0xAE, 0x1A, 0x4E, 0x1B, 0xA8, 0x1A, 0x5A, 0x07, + 0x15, 0x0E, 0x21, 0xF7, 0x83, 0x09, 0xDC, 0xF6, 0x96, 0x04, 0xDA, 0xFE, + 0x03, 0xFF, 0x06, 0x07, 0xE0, 0xF3, 0xC8, 0xF6, 0x64, 0xEB, 0x97, 0xE0, + 0xDC, 0xF5, 0xC9, 0xE8, 0xCF, 0x02, 0xD3, 0xF5, 0xDF, 0xFE, 0x7B, 0xE9, + 0x43, 0xF8, 0xCF, 0xDB, 0x71, 0x05, 0xC2, 0xEB, 0xC4, 0x08, 0xEC, 0xF2, + 0x28, 0x08, 0x4B, 0xF0, 0x90, 0x0E, 0x5F, 0xFB, 0xD1, 0x06, 0x01, 0x07, + 0x48, 0x00, 0x45, 0x17, 0xB4, 0x0D, 0xA6, 0x2F, 0xC7, 0x01, 0xD9, 0x18, + 0x03, 0xE0, 0x6E, 0xE2, 0x07, 0xEC, 0xE9, 0xE6, 0x96, 0x1D, 0x75, 0x14, + 0xD9, 0x2F, 0x44, 0x1A, 0xE8, 0x1E, 0xA8, 0x06, 0xA7, 0x15, 0xE0, 0x05, + 0x82, 0x11, 0x0F, 0x04, 0x71, 0x23, 0x3E, 0x15, 0xE2, 0x40, 0x10, 0x33, + 0xC0, 0x33, 0xD5, 0x28, 0xD3, 0x01, 0x3F, 0x0E, 0x88, 0xE7, 0xE6, 0x15, + 0x8A, 0xF8, 0x3F, 0x28, 0x58, 0x14, 0x76, 0x28, 0x5F, 0x20, 0xFA, 0x25, + 0x8B, 0x1F, 0x12, 0x27, 0xDE, 0x19, 0x60, 0x26, 0x02, 0x18, 0x61, 0x2D, + 0x67, 0x1F, 0xA4, 0x33, 0x83, 0x24, 0x2C, 0x22, 0xF9, 0x26, 0xE2, 0x0E, + 0xE5, 0x2B, 0x42, 0x10, 0x0E, 0x2B, 0xEE, 0x12, 0xCD, 0x26, 0x7A, 0x14, + 0xA0, 0x19, 0x80, 0x0F, 0x25, 0x07, 0x69, 0xFD, 0xF7, 0x08, 0x89, 0x00, + 0x38, 0x10, 0xAE, 0x13, 0x97, 0x0D, 0x7D, 0x15, 0x59, 0xFD, 0x22, 0x07, + 0x4E, 0x02, 0x31, 0x18, 0x54, 0x14, 0x60, 0x2A, 0x29, 0x0A, 0x47, 0x12, + 0x72, 0xFF, 0xF3, 0x00, 0x18, 0xFE, 0x5E, 0xFD, 0x5E, 0xEA, 0xE1, 0xEC, + 0x5C, 0xEC, 0x2A, 0xFA, 0x28, 0x09, 0xCB, 0x14, 0xD7, 0x01, 0x3B, 0xFD, + 0xA0, 0xE7, 0x4C, 0xDE, 0x6F, 0xF2, 0xB2, 0xF2, 0x67, 0x17, 0x4D, 0x1E, + 0xBD, 0x13, 0x38, 0x16, 0x11, 0x04, 0x13, 0xFE, 0xA6, 0x0A, 0x94, 0x06, + 0xE7, 0x0D, 0xFE, 0x12, 0xF9, 0x1F, 0xE4, 0x27, 0x3D, 0x33, 0x05, 0x3B, + 0xDA, 0x17, 0xF6, 0x24, 0x94, 0xF0, 0x5B, 0x06, 0xC2, 0xEF, 0x2B, 0x0C, + 0x7E, 0xF3, 0xB3, 0x0E, 0x29, 0xEF, 0x92, 0x03, 0x38, 0xF2, 0x5C, 0x01, + 0xFA, 0xF4, 0x36, 0x02, 0x53, 0xF3, 0xB6, 0x02, 0x7A, 0x06, 0x9F, 0x15, + 0x32, 0x12, 0xF0, 0x18, 0x81, 0xF9, 0xF5, 0xF8, 0x54, 0xEF, 0x68, 0xED, + 0x15, 0x01, 0xAF, 0xF6, 0x94, 0x09, 0x55, 0xF3, 0xA1, 0x01, 0x79, 0xF4, + 0x06, 0xF2, 0xD5, 0xFE, 0xBB, 0xE5, 0xCD, 0x01, 0x38, 0xEC, 0x95, 0x08, + 0x30, 0x00, 0x82, 0x11, 0xD0, 0xF8, 0x4C, 0xFE, 0x1E, 0xDD, 0x4E, 0xE8, + 0xCD, 0xEA, 0x29, 0xF7, 0x45, 0x02, 0x19, 0xF8, 0xF3, 0xFB, 0xFB, 0xE3, + 0xBC, 0xF5, 0xD8, 0xE6, 0x58, 0xF3, 0x41, 0xED, 0xAD, 0xF2, 0x05, 0xE9, + 0x6F, 0x0A, 0x96, 0xF5, 0xD2, 0x08, 0x3C, 0xF2, 0xB7, 0xD6, 0x43, 0xCE, + 0xCD, 0xC8, 0x08, 0xCC, 0x6B, 0xF9, 0x29, 0xF6, 0x8E, 0x11, 0x80, 0x06, + 0x83, 0xFA, 0x5B, 0xFF, 0x82, 0xFB, 0xD2, 0x13, 0x37, 0x09, 0x99, 0x19, + 0xEB, 0x18, 0xF9, 0x19, 0x94, 0x29, 0x5D, 0x2A, 0x22, 0x1B, 0xA7, 0x20, + 0xDA, 0x00, 0x40, 0x0B, 0xE2, 0x08, 0xFC, 0x15, 0x24, 0x1D, 0x19, 0x2C, + 0x38, 0x17, 0x38, 0x33, 0xFB, 0x05, 0xE4, 0x30, 0x7E, 0xFC, 0x0F, 0x21, + 0x13, 0x00, 0x36, 0x13, 0xF7, 0x1D, 0x4C, 0x2A, 0xCE, 0x3D, 0x05, 0x49, + 0x40, 0x33, 0x9D, 0x36, 0xCE, 0x23, 0x9A, 0x21, 0x94, 0x1F, 0xDC, 0x27, + 0x95, 0x13, 0xED, 0x2B, 0x50, 0x1A, 0xC6, 0x36, 0xD5, 0x2D, 0x59, 0x42, + 0x4B, 0x2E, 0xD2, 0x34, 0xE3, 0x27, 0xB7, 0x27, 0xCD, 0x25, 0xCF, 0x2D, + 0x8C, 0x20, 0xA3, 0x25, 0x9F, 0x0A, 0xA2, 0x01, 0x36, 0x07, 0xCA, 0x06, + 0x98, 0x15, 0xD7, 0x27, 0x89, 0x0F, 0xA0, 0x1D, 0xF3, 0x0E, 0x1D, 0x07, + 0x63, 0x16, 0x73, 0xF9, 0xC1, 0x05, 0x40, 0xE7, 0x43, 0x04, 0x7B, 0xF8, + 0x68, 0x18, 0x98, 0x1C, 0x99, 0x05, 0xD5, 0x11, 0x77, 0xEC, 0xCE, 0x01, + 0x9C, 0x03, 0x5A, 0x1B, 0xF7, 0x25, 0x64, 0x33, 0xF7, 0x18, 0xAD, 0x1C, + 0xF2, 0x07, 0x05, 0x08, 0xBB, 0x09, 0x08, 0x0A, 0xA1, 0x07, 0xAC, 0x0C, + 0x54, 0x1C, 0x89, 0x1E, 0xDB, 0x30, 0xFA, 0x24, 0xF9, 0x1E, 0x85, 0x10, + 0xAD, 0x0D, 0xAC, 0x05, 0x4D, 0x1B, 0x8B, 0x0F, 0x22, 0x23, 0x3E, 0x12, + 0x71, 0x0F, 0x69, 0x04, 0xA8, 0xF1, 0xC5, 0xED, 0x13, 0xDF, 0xD1, 0xD7, + 0x59, 0xE5, 0x6D, 0xDC, 0x63, 0xFE, 0xDA, 0x00, 0x0C, 0x03, 0x67, 0x0E, + 0x39, 0xED, 0x61, 0xFA, 0x81, 0xDC, 0x78, 0xEB, 0x58, 0xDC, 0xF6, 0xE1, + 0x66, 0xE6, 0x90, 0xE4, 0xE8, 0xF1, 0xBE, 0xFE, 0x7B, 0xF6, 0x04, 0x0E, + 0x29, 0x01, 0x44, 0x0A, 0xB4, 0x05, 0xE8, 0x04, 0x0D, 0xF7, 0x76, 0x05, + 0xAC, 0xDC, 0x3C, 0xF9, 0x71, 0xD3, 0x98, 0xE5, 0xE1, 0xEF, 0x10, 0xEE, + 0x13, 0xF7, 0x05, 0xEF, 0x61, 0xE3, 0x82, 0xE5, 0x9B, 0xD8, 0x23, 0xEB, + 0x72, 0xC6, 0xAC, 0xE4, 0xEC, 0xC8, 0x0A, 0xE9, 0x17, 0xF5, 0x89, 0x0D, + 0xBF, 0xFB, 0xEA, 0x0B, 0x88, 0xDE, 0xFC, 0xE6, 0x75, 0xE2, 0x4E, 0xDA, + 0x03, 0x05, 0x70, 0xEC, 0x4B, 0x0C, 0xE0, 0xF8, 0xD1, 0xF9, 0x7A, 0xF4, + 0x28, 0x03, 0xD1, 0xF9, 0xDB, 0x09, 0x36, 0xF8, 0x10, 0x0B, 0xF0, 0x01, + 0x22, 0x1C, 0xC3, 0x18, 0x46, 0x1C, 0xCB, 0x0E, 0x2D, 0x0B, 0xD2, 0xF3, + 0x04, 0x13, 0xE4, 0xF5, 0x8B, 0x25, 0x87, 0x06, 0xAF, 0x29, 0xAD, 0x0E, + 0x3B, 0x26, 0xA8, 0x10, 0xB0, 0x18, 0xC3, 0x05, 0x74, 0x0D, 0xAD, 0xF5, + 0x2E, 0x16, 0x40, 0xF7, 0xE1, 0x21, 0xF7, 0x0A, 0xE9, 0x15, 0x76, 0x0E, + 0x16, 0x02, 0x06, 0xFD, 0xBE, 0xF8, 0x66, 0xEE, 0xCE, 0xF9, 0xE0, 0xF0, + 0x8C, 0x09, 0xD5, 0x04, 0xCD, 0x16, 0xEE, 0x13, 0x5C, 0x0F, 0x61, 0x12, + 0x95, 0x06, 0x7D, 0x0F, 0xE0, 0xF9, 0x17, 0x06, 0xDA, 0xE8, 0x4E, 0xFA, + 0x69, 0xDA, 0x6D, 0xEA, 0x02, 0xE1, 0x62, 0xE8, 0x93, 0xF0, 0x79, 0xF4, + 0xFC, 0xEE, 0xC7, 0xE9, 0x0F, 0xEB, 0x43, 0xD6, 0xA2, 0xDE, 0xDB, 0xC7, + 0xCB, 0xCE, 0x19, 0xBF, 0x36, 0xDD, 0x36, 0xD5, 0xD2, 0xE6, 0xA5, 0xF4, + 0x88, 0xC6, 0x4F, 0xEA, 0x99, 0xB3, 0x22, 0xCD, 0x90, 0xD3, 0x7D, 0xD9, + 0x02, 0xED, 0xF7, 0xF8, 0x1B, 0xD7, 0x17, 0xF0, 0xC7, 0xD0, 0x3D, 0xEC, + 0xE0, 0xD8, 0x53, 0xF7, 0x43, 0xD9, 0xE4, 0xF5, 0x7E, 0xF7, 0xDB, 0x0C, + 0xB0, 0x0C, 0x5B, 0x20, 0xB4, 0xF3, 0x53, 0x07, 0xAB, 0xE4, 0x77, 0xF5, + 0xDF, 0xF4, 0x06, 0x04, 0xA8, 0xFD, 0x91, 0x05, 0xDA, 0xFA, 0xB7, 0xF0, + 0x8A, 0xF6, 0x29, 0xDF, 0x9F, 0xEE, 0xF2, 0xD9, 0x0B, 0xEA, 0x77, 0xDD, + 0xEF, 0xF5, 0x57, 0xF0, 0x48, 0x03, 0x2E, 0xFE, 0x9F, 0xF8, 0xB2, 0xE4, + 0xFF, 0xE2, 0x1A, 0xC5, 0x8B, 0xE1, 0x24, 0xC9, 0x6F, 0xF1, 0x79, 0xDD, + 0x2A, 0xFE, 0xC8, 0xEA, 0x90, 0xFF, 0x29, 0xEA, 0xAB, 0x03, 0xBA, 0xEB, + 0xE8, 0xF4, 0xB3, 0xE3, 0x51, 0xE0, 0x7C, 0xD0, 0x93, 0xDA, 0x87, 0xC0, + 0x79, 0xD5, 0x94, 0xB7, 0xD0, 0xE3, 0xA3, 0xC2, 0x09, 0xF1, 0x81, 0xC6, + 0xAB, 0xED, 0x48, 0xC4, 0xF5, 0xE4, 0x65, 0xC9, 0xA5, 0xD2, 0x0A, 0xC6, + 0x5B, 0xC8, 0x15, 0xCE, 0xD6, 0xCD, 0xCB, 0xE2, 0x07, 0xBE, 0xAB, 0xD4, + 0x42, 0x9E, 0x54, 0xB1, 0xA2, 0xA0, 0x55, 0xB3, 0x0E, 0xC4, 0x23, 0xD3, + 0xAB, 0xCA, 0x84, 0xD4, 0x02, 0xB5, 0xA0, 0xC0, 0x9E, 0xB6, 0x44, 0xC8, + 0x91, 0xC9, 0x45, 0xD8, 0x62, 0xE0, 0xBC, 0xE5, 0xA7, 0xFA, 0x1C, 0xF4, + 0x4E, 0xF8, 0xB0, 0xDB, 0x11, 0xDC, 0xEC, 0xAF, 0xE6, 0xD8, 0x3F, 0xAF, + 0x8A, 0xE4, 0xE7, 0xC1, 0x01, 0xDC, 0xE8, 0xC7, 0x33, 0xD3, 0x1C, 0xCF, + 0xB5, 0xD5, 0x31, 0xCB, 0xA9, 0xD1, 0xB7, 0xB9, 0x6B, 0xD9, 0x3A, 0xC9, + 0x8A, 0xEB, 0xB2, 0xEF, 0x69, 0xE3, 0xC3, 0xEC, 0xE0, 0xCA, 0xBC, 0xD0, + 0x59, 0xC9, 0xBE, 0xD7, 0xA9, 0xCD, 0xD6, 0xE4, 0xC6, 0xD0, 0xB6, 0xE5, + 0xA2, 0xDA, 0xD8, 0xE2, 0x7F, 0xE4, 0x92, 0xD3, 0x1B, 0xE3, 0x6E, 0xC2, + 0x51, 0xD2, 0xDF, 0xB7, 0x93, 0xCD, 0x51, 0xB8, 0x8C, 0xC6, 0x20, 0xB4, + 0x6C, 0xC8, 0x5C, 0xC7, 0xFB, 0xD2, 0xE6, 0xE2, 0x32, 0xD9, 0x3A, 0xDF, + 0x72, 0xDD, 0xC7, 0xCC, 0x48, 0xDE, 0x6D, 0xC0, 0x21, 0xE5, 0xAC, 0xC7, + 0x6F, 0xF0, 0xFA, 0xE7, 0xEA, 0xEB, 0x44, 0xFD, 0xB3, 0xD6, 0x67, 0xE5, + 0xF2, 0xDB, 0xEF, 0xDC, 0x1E, 0x08, 0xB6, 0x0D, 0x25, 0x22, 0xA1, 0x2B, + 0x9F, 0x14, 0x81, 0x12, 0x5D, 0x11, 0x2B, 0x07, 0x5F, 0x18, 0x6E, 0x10, + 0xA6, 0x23, 0x7F, 0x23, 0xF2, 0x40, 0x4A, 0x4D, 0x6F, 0x4C, 0xA6, 0x56, + 0xDE, 0x35, 0x6F, 0x30, 0x6C, 0x28, 0x8F, 0x22, 0x51, 0x26, 0x96, 0x2B, + 0x3F, 0x12, 0x37, 0x1F, 0xFA, 0xFF, 0xB2, 0x19, 0xFE, 0xFF, 0x97, 0x23, + 0x52, 0x05, 0xEB, 0x1F, 0x21, 0x16, 0xF9, 0x21, 0xCB, 0x2B, 0x24, 0x36, + 0x54, 0x30, 0xF1, 0x3A, 0xBB, 0x2D, 0x19, 0x31, 0x1A, 0x32, 0x71, 0x2A, + 0xC4, 0x39, 0xD8, 0x1B, 0x32, 0x3C, 0xC2, 0x0D, 0xA4, 0x2C, 0x1F, 0x0B, + 0xD8, 0x12, 0x1D, 0x00, 0x98, 0x11, 0x86, 0xFA, 0x48, 0x12, 0xCE, 0xFA, + 0x38, 0x07, 0x8F, 0xFD, 0x97, 0xF8, 0xED, 0xFB, 0x56, 0xF6, 0xB9, 0xFC, + 0xEF, 0x04, 0x26, 0x07, 0x31, 0x07, 0x88, 0x00, 0x09, 0x06, 0xF2, 0xFB, + 0x9A, 0x04, 0x46, 0x02, 0x98, 0x00, 0x4E, 0x02, 0xB3, 0x0D, 0x75, 0x0F, + 0x4F, 0x1C, 0x18, 0x29, 0x58, 0x04, 0xF8, 0x1B, 0x87, 0xEC, 0xDE, 0xFD, + 0x28, 0x06, 0xDD, 0x0B, 0x4F, 0x22, 0x33, 0x29, 0xED, 0x0E, 0xD8, 0x20, + 0xA8, 0xFC, 0xCE, 0x14, 0x2A, 0x0C, 0x8E, 0x1A, 0x52, 0x1C, 0x97, 0x14, + 0x9E, 0x34, 0x4B, 0x22, 0x73, 0x3F, 0xBB, 0x33, 0xED, 0x20, 0xD8, 0x16, + 0xAB, 0x08, 0xF1, 0xF7, 0xD8, 0x0E, 0x13, 0x02, 0x3B, 0x14, 0xE3, 0x11, + 0xDE, 0x19, 0x0C, 0x15, 0x87, 0x21, 0xF2, 0x15, 0x33, 0x1A, 0x9E, 0x14, + 0x85, 0x0D, 0x45, 0x12, 0x7D, 0x13, 0x79, 0x1C, 0x51, 0x29, 0xCB, 0x24, + 0x39, 0x2F, 0x8F, 0x10, 0xA0, 0x29, 0x34, 0x05, 0x9D, 0x29, 0x49, 0x0F, + 0xAD, 0x31, 0xC8, 0x13, 0x5C, 0x3A, 0x0F, 0x17, 0xFF, 0x29, 0x48, 0x12, + 0x21, 0x07, 0xEF, 0x07, 0x86, 0xF2, 0x29, 0x0C, 0x86, 0xF3, 0x89, 0x11, + 0xD7, 0xF8, 0xEF, 0x00, 0x01, 0xF5, 0x46, 0xF0, 0x6D, 0xF9, 0xD1, 0x07, + 0x65, 0x01, 0x9E, 0x1A, 0x94, 0x09, 0x8D, 0x0F, 0xBE, 0x13, 0xC2, 0x0C, + 0x43, 0x07, 0x62, 0x07, 0x37, 0xF7, 0xD6, 0xFF, 0x49, 0x0E, 0xC7, 0x1A, + 0x5C, 0x1B, 0x2D, 0x23, 0x6E, 0x06, 0x30, 0xFF, 0xB2, 0x0A, 0x2D, 0xFA, + 0x51, 0x22, 0x29, 0x1A, 0x01, 0x1C, 0x68, 0x20, 0x14, 0x06, 0x41, 0x15, + 0x7E, 0x07, 0x91, 0x1F, 0xAF, 0x1A, 0xAE, 0x28, 0x1F, 0x3D, 0xEE, 0x32, + 0xB1, 0x5E, 0x10, 0x46, 0x43, 0x56, 0x3B, 0x40, 0xEA, 0x2A, 0x51, 0x27, + 0x27, 0x15, 0xBB, 0x28, 0xC0, 0x17, 0x8F, 0x37, 0xA6, 0x1C, 0xF9, 0x3E, + 0x18, 0x20, 0x52, 0x41, 0xBC, 0x19, 0xEC, 0x34, 0x0F, 0x13, 0xE3, 0x24, + 0xFB, 0x0E, 0x13, 0x25, 0x45, 0x14, 0x18, 0x3A, 0xDA, 0x16, 0x96, 0x3B, + 0xE8, 0x12, 0x61, 0x21, 0xA8, 0x1E, 0x1E, 0x15, 0xA1, 0x2A, 0xF4, 0x16, + 0x9A, 0x28, 0xCB, 0x18, 0xB8, 0x24, 0xBC, 0x15, 0xFB, 0x1E, 0xFE, 0x06, + 0xC7, 0x1C, 0xFA, 0x01, 0x4D, 0x17, 0x6E, 0x0A, 0xAE, 0x0E, 0xE0, 0x0F, + 0xAA, 0x06, 0xA1, 0xFF, 0x84, 0x13, 0x90, 0xFB, 0x64, 0x2D, 0x3D, 0x0D, + 0xE2, 0x2A, 0xB1, 0x0A, 0x45, 0x20, 0x9D, 0x09, 0xA7, 0x1A, 0xAE, 0x12, + 0x3B, 0x0B, 0x9D, 0x0F, 0xC7, 0x0E, 0x16, 0x22, 0x9B, 0x19, 0xF5, 0x36, + 0x2F, 0x06, 0xB3, 0x16, 0x05, 0xFD, 0x20, 0xF7, 0x3D, 0x14, 0x3B, 0x13, + 0x3F, 0x1E, 0x0E, 0x34, 0x32, 0x05, 0xCA, 0x21, 0x6E, 0xFB, 0xA9, 0x13, + 0x8F, 0x0B, 0x47, 0x1C, 0xD7, 0x22, 0xF0, 0x2B, 0x22, 0x35, 0x16, 0x45, + 0xD1, 0x29, 0x78, 0x44, 0xE8, 0x0C, 0x66, 0x1F, 0x20, 0xFC, 0x87, 0x00, + 0x13, 0x00, 0x21, 0x05, 0xF1, 0x04, 0xB0, 0x10, 0xAB, 0x01, 0xDE, 0x0F, + 0x0D, 0xFB, 0x13, 0x0C, 0x30, 0xF6, 0xBE, 0x03, 0x03, 0xF3, 0x77, 0xF7, + 0xC1, 0xFB, 0x4F, 0xFB, 0xBE, 0x09, 0x94, 0xFE, 0xB2, 0x03, 0x75, 0xED, + 0x08, 0xFB, 0x8B, 0xE8, 0x62, 0xFD, 0x20, 0xF3, 0xC7, 0xFC, 0x35, 0xF6, + 0xD9, 0x02, 0x1F, 0xFB, 0x97, 0x0E, 0xAE, 0xFC, 0x7A, 0x16, 0x88, 0xF9, + 0x64, 0x0A, 0xDD, 0xF8, 0xF7, 0xEF, 0xA4, 0xFB, 0xF6, 0xD5, 0xE1, 0xF0, + 0xE4, 0xC2, 0x38, 0xE2, 0xB5, 0xCB, 0x17, 0xF2, 0x1D, 0xD5, 0x98, 0xFB, + 0x09, 0xCC, 0x2D, 0xE9, 0x7F, 0xC7, 0xFE, 0xD8, 0xC8, 0xC6, 0x78, 0xCE, + 0x8A, 0xCB, 0x51, 0xD1, 0x18, 0xE6, 0x6B, 0xF0, 0x5A, 0xF2, 0x89, 0xF8, + 0x8A, 0xE5, 0xA6, 0xD8, 0x85, 0xE9, 0xAB, 0xD6, 0xF4, 0x03, 0x99, 0x06, + 0xF2, 0xFD, 0xF7, 0x12, 0xB2, 0xE5, 0xFB, 0xF4, 0x65, 0xED, 0x5B, 0xEA, + 0x7E, 0xFA, 0xA0, 0xEC, 0xFF, 0xFE, 0x9D, 0xF9, 0xAB, 0xFE, 0x4C, 0x0C, + 0xFF, 0xED, 0x7A, 0x04, 0x6C, 0xD7, 0x37, 0xEB, 0xC8, 0xDA, 0x72, 0xF2, + 0x66, 0xEA, 0x4B, 0x0A, 0x68, 0xEF, 0x81, 0x07, 0x3C, 0xE8, 0x3C, 0xF3, + 0x5B, 0xDA, 0x57, 0xE6, 0x2D, 0xCD, 0xE3, 0xDE, 0xC0, 0xD1, 0xE6, 0xE2, + 0x00, 0xEA, 0xCF, 0xF4, 0xEE, 0xF0, 0x9E, 0xF1, 0x05, 0xE5, 0xDD, 0xE1, + 0xB6, 0xDF, 0xB9, 0xE1, 0xC4, 0xDB, 0xC2, 0xE0, 0x21, 0xDD, 0x35, 0xD8, + 0x53, 0xE2, 0x06, 0xD6, 0x43, 0xE2, 0x84, 0xDD, 0xBB, 0xDB, 0x40, 0xDE, + 0x9F, 0xD4, 0xDA, 0xD8, 0x85, 0xDB, 0xE4, 0xDC, 0xDC, 0xD3, 0xE0, 0xD0, + 0x69, 0xD7, 0xFC, 0xD0, 0x39, 0xEC, 0x16, 0xDE, 0xCF, 0xEA, 0x43, 0xD3, + 0x0B, 0xE7, 0xF2, 0xCF, 0x40, 0xE6, 0xC1, 0xDC, 0x24, 0xDD, 0xFA, 0xE1, + 0xEA, 0xEB, 0x72, 0xF4, 0x72, 0x04, 0xFF, 0x09, 0x6F, 0xFD, 0x39, 0xFA, + 0xEE, 0xED, 0x09, 0xE7, 0xB4, 0xF5, 0xAF, 0xFC, 0x5D, 0xFA, 0x80, 0x10, + 0x10, 0xE7, 0xA2, 0xFF, 0x2C, 0xE9, 0xBB, 0xFC, 0xCF, 0xFD, 0x37, 0x0D, + 0x4E, 0x0D, 0x65, 0x1B, 0xAC, 0x17, 0xA7, 0x2A, 0xB8, 0x11, 0x15, 0x2A, + 0x27, 0xFD, 0x03, 0x10, 0x6C, 0xF1, 0x4E, 0xFC, 0x38, 0xFD, 0x35, 0x0B, + 0x8A, 0x11, 0xDA, 0x23, 0x17, 0x1D, 0x9F, 0x28, 0xB3, 0x1C, 0xB5, 0x19, + 0xD5, 0x12, 0xE8, 0x09, 0x34, 0x04, 0x3A, 0x04, 0xF6, 0x03, 0x6E, 0x09, + 0xA1, 0x0E, 0x75, 0x05, 0xA5, 0x0E, 0x24, 0xF1, 0xF3, 0x0D, 0x02, 0xE9, + 0xD3, 0x0D, 0xFB, 0xEC, 0x69, 0x0F, 0x14, 0xF0, 0x9D, 0x18, 0x22, 0xEF, + 0xFB, 0x1A, 0x8C, 0xEE, 0xFE, 0x17, 0xA8, 0x00, 0x0F, 0x08, 0x58, 0x0A, + 0x44, 0x00, 0x6C, 0x03, 0x5E, 0xFE, 0xCF, 0xF2, 0x1F, 0xF6, 0xBB, 0xE7, + 0x27, 0xFF, 0xAA, 0xF7, 0x35, 0x06, 0xF0, 0x00, 0xEF, 0x00, 0x59, 0xF2, + 0x18, 0xF9, 0xDA, 0xE3, 0x08, 0xE1, 0x84, 0xE1, 0x31, 0xD3, 0x60, 0xED, + 0x8A, 0xEE, 0xCD, 0xFC, 0xF8, 0xFB, 0x95, 0xE3, 0x42, 0xEB, 0x7C, 0xC0, + 0x00, 0xEC, 0x6C, 0xD6, 0x3C, 0xF8, 0xE5, 0x04, 0x8C, 0xE6, 0xC3, 0x07, + 0x79, 0xD6, 0x94, 0xF9, 0xF9, 0xE1, 0x7A, 0x04, 0x64, 0xEA, 0xA3, 0x10, + 0x7E, 0xFF, 0xCF, 0x1E, 0x9F, 0x14, 0x53, 0x26, 0x42, 0x00, 0xD6, 0x0B, + 0xF0, 0xE5, 0xB3, 0xF3, 0xF6, 0xEA, 0x42, 0xFF, 0xC3, 0xF4, 0x9C, 0x0A, + 0xEC, 0xF9, 0xE8, 0x0D, 0xB3, 0xF8, 0xD4, 0x0F, 0x47, 0xE6, 0xEB, 0x00, + 0x98, 0xE0, 0x43, 0xF4, 0x14, 0xEC, 0x8D, 0xF8, 0x63, 0xE9, 0x70, 0xF9, + 0x1E, 0xDB, 0x6B, 0xEC, 0x91, 0xE0, 0x92, 0xE7, 0x6C, 0xF2, 0xC0, 0xEC, + 0x77, 0xFB, 0xFC, 0xF1, 0x78, 0x07, 0x5B, 0x03, 0x5A, 0x0E, 0xC7, 0x08, + 0xE4, 0x17, 0xAA, 0x02, 0xFE, 0x20, 0x40, 0x01, 0x49, 0x13, 0x88, 0xFA, + 0xE8, 0x02, 0x3F, 0xF7, 0x86, 0xF7, 0xBA, 0xF3, 0xFC, 0xFE, 0x42, 0xFA, + 0xCC, 0x0E, 0xC8, 0xFB, 0x21, 0x16, 0xE3, 0xF3, 0x4B, 0x1D, 0xEF, 0xEB, + 0x78, 0x15, 0x71, 0xD8, 0xC3, 0x08, 0x50, 0xD3, 0x60, 0x19, 0xBF, 0xF9, + 0x5F, 0x26, 0xCE, 0x10, 0xF3, 0x13, 0x35, 0xF3, 0xCA, 0x12, 0x71, 0xE7, + 0x07, 0x2D, 0xC9, 0x05, 0x06, 0x24, 0x86, 0x13, 0xE0, 0xFA, 0xB6, 0x04, + 0xE4, 0xF5, 0x76, 0x0A, 0xF6, 0xFD, 0x1A, 0x17, 0x63, 0x03, 0x28, 0x22, + 0x44, 0x1F, 0xE8, 0x39, 0x50, 0x27, 0x9B, 0x37, 0xEC, 0x12, 0x74, 0x18, + 0x07, 0x10, 0xC3, 0x0B, 0xC7, 0x18, 0x56, 0x0F, 0x0D, 0x15, 0x26, 0x0C, + 0xDD, 0x13, 0x0B, 0x0C, 0xA0, 0x0C, 0x5F, 0x0D, 0x61, 0xF5, 0xED, 0x06, + 0x16, 0xF0, 0xC7, 0x02, 0xEF, 0xFC, 0x2B, 0x04, 0xC5, 0xFB, 0x8D, 0xFF, + 0xBF, 0xEE, 0xC7, 0xF6, 0xEC, 0xE5, 0x00, 0xF1, 0xDC, 0xE7, 0x69, 0xEB, + 0x56, 0x03, 0x37, 0xF2, 0xB0, 0x1C, 0x78, 0x01, 0xC8, 0x0F, 0x49, 0x05, + 0xF3, 0x02, 0x10, 0x0E, 0x70, 0xFD, 0x5E, 0x08, 0x06, 0xF4, 0xE6, 0xF7, + 0xEA, 0xE8, 0x17, 0xEA, 0x4C, 0xE4, 0x9D, 0xE3, 0xBC, 0xEE, 0xFA, 0xE3, + 0x21, 0xF6, 0x20, 0xD7, 0x20, 0xFE, 0x8B, 0xD2, 0x9D, 0xFB, 0xF9, 0xD3, + 0xB7, 0xE3, 0x1F, 0xC7, 0x8F, 0xF0, 0xD0, 0xD0, 0x24, 0x1C, 0xF8, 0xF5, + 0x85, 0x16, 0xA4, 0xFC, 0x33, 0xEF, 0x8F, 0xF2, 0x3F, 0xEC, 0x75, 0x00, + 0x50, 0x06, 0x9A, 0x11, 0x92, 0x02, 0xA2, 0x01, 0x82, 0xF4, 0x4F, 0xF2, + 0xB8, 0xFA, 0xED, 0xFD, 0x01, 0x03, 0x65, 0x08, 0x20, 0x14, 0x49, 0x10, + 0x6C, 0x1D, 0x41, 0x0D, 0x88, 0x0A, 0x24, 0xF7, 0x2B, 0x03, 0xDD, 0xEC, + 0x28, 0x14, 0xF6, 0xF9, 0x54, 0x16, 0x30, 0x08, 0x44, 0x05, 0x56, 0x0D, + 0x93, 0xF1, 0x5A, 0x00, 0xF4, 0xDB, 0xC3, 0xE7, 0x56, 0xD1, 0x19, 0xDC, + 0x3F, 0xD7, 0x27, 0xE1, 0x0E, 0xD5, 0xC2, 0xE4, 0x37, 0xD3, 0x89, 0xE6, + 0xA6, 0xE2, 0xFA, 0xEC, 0xEA, 0xE8, 0xA7, 0xEE, 0x39, 0xDE, 0xEC, 0xE5, + 0x8C, 0xE3, 0x7C, 0xE2, 0x46, 0xE0, 0xF2, 0xD3, 0x0F, 0xD1, 0xC8, 0xCB, + 0x73, 0xD2, 0x77, 0xD5, 0x56, 0xCE, 0x39, 0xD0, 0x66, 0xC6, 0x0D, 0xC6, + 0x48, 0xC4, 0xF3, 0xBC, 0xC3, 0xC8, 0x57, 0xBD, 0x82, 0xC8, 0xF3, 0xBA, + 0x5A, 0xC7, 0x8C, 0xB0, 0x0C, 0xCF, 0xA4, 0xAD, 0xB4, 0xC7, 0x43, 0xB0, + 0xE6, 0xC0, 0xF9, 0xBA, 0xB6, 0xE1, 0xE0, 0xDD, 0x99, 0xF2, 0x12, 0xF0, + 0x49, 0xCD, 0x9E, 0xD8, 0x30, 0xAD, 0xF5, 0xCB, 0x7A, 0xBA, 0x9E, 0xDF, + 0x03, 0xCE, 0x75, 0xE1, 0xA9, 0xD1, 0xDC, 0xC4, 0x4E, 0xDE, 0x9E, 0xC0, + 0x6A, 0xE1, 0x52, 0xCF, 0xA2, 0xE5, 0xDB, 0xE1, 0xDB, 0xFA, 0x6E, 0xF2, + 0x3F, 0xFC, 0x2C, 0xEA, 0x63, 0xEA, 0x19, 0xD7, 0x3E, 0xE2, 0x14, 0xD3, + 0xAF, 0xE0, 0x98, 0xDC, 0x38, 0xE7, 0x0D, 0xF3, 0x02, 0xF2, 0x2B, 0x05, + 0x31, 0xE6, 0xF7, 0xF6, 0x35, 0xD4, 0xBC, 0xE6, 0xD0, 0xDC, 0xCB, 0xEF, + 0xA2, 0xE8, 0x0B, 0xFA, 0x25, 0xE6, 0x7E, 0xFC, 0xBD, 0xF0, 0x39, 0x00, + 0x86, 0x05, 0x42, 0xFE, 0x56, 0x12, 0x2B, 0xFA, 0x76, 0x1D, 0x4B, 0x05, + 0x77, 0x21, 0x96, 0x11, 0x9E, 0x0E, 0x2D, 0x10, 0x0F, 0x07, 0x5D, 0x16, + 0xA1, 0x0E, 0x06, 0x15, 0xF4, 0x0C, 0x11, 0x0A, 0xE1, 0xFD, 0x95, 0xFB, + 0xE0, 0xF5, 0xEF, 0xF5, 0x29, 0x00, 0x90, 0x01, 0x6E, 0x08, 0xBA, 0x06, + 0x12, 0x14, 0x16, 0x08, 0x94, 0x15, 0xE8, 0x09, 0x72, 0x02, 0x78, 0x05, + 0x56, 0x10, 0x07, 0x12, 0xE8, 0x3A, 0x8B, 0x2B, 0xB3, 0x39, 0x21, 0x20, + 0x2E, 0x17, 0xBA, 0xFE, 0x18, 0x0F, 0xF5, 0x03, 0x95, 0x21, 0xDB, 0x28, + 0xBA, 0x20, 0x4F, 0x28, 0x30, 0x1D, 0x36, 0x15, 0xB0, 0x29, 0x3D, 0x1E, + 0x3F, 0x2C, 0xD6, 0x2C, 0x06, 0x36, 0x8D, 0x3F, 0x7A, 0x39, 0x11, 0x46, + 0xF5, 0x24, 0x26, 0x32, 0x9E, 0x13, 0x8B, 0x1E, 0xC1, 0x11, 0x63, 0x22, + 0x89, 0x0F, 0xB9, 0x33, 0xDF, 0x09, 0x7A, 0x42, 0x3B, 0x04, 0x58, 0x42, + 0x9F, 0xFB, 0x4B, 0x2F, 0x55, 0x00, 0x81, 0x20, 0x70, 0x19, 0x76, 0x1F, + 0xEB, 0x1D, 0x18, 0x18, 0xC2, 0x13, 0x46, 0x15, 0x37, 0x1F, 0x93, 0x24, + 0x90, 0x2B, 0x3B, 0x25, 0x80, 0x2B, 0xF6, 0x19, 0x4A, 0x2E, 0x97, 0x20, + 0xF2, 0x25, 0xC1, 0x22, 0x68, 0x17, 0x34, 0x20, 0xD5, 0x16, 0x9F, 0x1B, + 0x2D, 0x1B, 0x3C, 0x10, 0xB6, 0x19, 0x75, 0x07, 0xB5, 0x0D, 0xE3, 0xFD, + 0xD1, 0x13, 0xD7, 0x05, 0xE3, 0x23, 0x4A, 0x15, 0xA5, 0x28, 0xA2, 0x17, + 0x07, 0x27, 0xED, 0x14, 0xB7, 0x13, 0xA6, 0x0D, 0xEA, 0x05, 0x93, 0x0A, + 0x9F, 0x1D, 0xBD, 0x21, 0x75, 0x23, 0x36, 0x31, 0xB8, 0x00, 0x50, 0x1F, + 0xD4, 0xF4, 0xE8, 0x0E, 0x2D, 0x0F, 0x8E, 0x1B, 0xC6, 0x1B, 0x39, 0x23, + 0x70, 0x0F, 0x15, 0x0F, 0x8C, 0x16, 0x4B, 0x0C, 0x74, 0x21, 0x54, 0x17, + 0x3C, 0x2D, 0x16, 0x24, 0x49, 0x43, 0x4C, 0x37, 0xC7, 0x3A, 0xD9, 0x33, + 0x74, 0x1A, 0x07, 0x1B, 0xAB, 0x06, 0x69, 0x0C, 0xA4, 0x08, 0xBC, 0x12, + 0x44, 0x19, 0xDA, 0x1D, 0x0E, 0x1E, 0xDE, 0x1A, 0xC0, 0x11, 0x56, 0x13, + 0x47, 0x0C, 0xA6, 0x17, 0xF2, 0x18, 0xB2, 0x23, 0x84, 0x23, 0xDF, 0x29, + 0x9C, 0x22, 0xDB, 0x23, 0x64, 0x29, 0xCB, 0x20, 0x26, 0x2C, 0x9E, 0x24, + 0x2F, 0x24, 0xC2, 0x1E, 0x1E, 0x26, 0x5A, 0x16, 0x22, 0x23, 0x66, 0x13, + 0xE8, 0x09, 0x59, 0x18, 0x5F, 0x05, 0xA4, 0x28, 0x3B, 0x17, 0x0D, 0x2A, + 0x33, 0x24, 0x1F, 0x24, 0x9A, 0x1A, 0xA8, 0x18, 0x3C, 0x0D, 0x57, 0x0F, + 0xE4, 0x11, 0xBC, 0x13, 0xD4, 0x17, 0x18, 0x12, 0xD1, 0x20, 0xAE, 0x10, + 0x5D, 0x1C, 0x6C, 0x1A, 0x77, 0x01, 0x1E, 0x20, 0x13, 0x03, 0x2C, 0x26, + 0xC5, 0x20, 0x9E, 0x29, 0x40, 0x14, 0xE9, 0x0D, 0x65, 0xF6, 0x9B, 0xF3, + 0xE4, 0x08, 0xD5, 0x08, 0xCB, 0x33, 0xB2, 0x2F, 0x5D, 0x3E, 0xE4, 0x2D, + 0xA5, 0x35, 0x47, 0x1E, 0x35, 0x34, 0xFB, 0x25, 0x1B, 0x37, 0x1D, 0x31, + 0xA2, 0x4B, 0x74, 0x3F, 0x04, 0x51, 0xFE, 0x43, 0x44, 0x34, 0xF1, 0x34, + 0x54, 0x1C, 0x7E, 0x2B, 0x77, 0x16, 0x55, 0x30, 0xA4, 0x1C, 0xD3, 0x35, + 0xC1, 0x24, 0xB1, 0x36, 0x97, 0x18, 0x99, 0x31, 0x2D, 0x02, 0x1C, 0x2C, + 0x86, 0x00, 0x01, 0x2E, 0x0A, 0x10, 0x06, 0x37, 0xD6, 0x14, 0x35, 0x3A, + 0x06, 0x1D, 0xDD, 0x37, 0x82, 0x2F, 0xBD, 0x38, 0xCD, 0x30, 0xF4, 0x32, + 0x10, 0x27, 0xBC, 0x28, 0x8B, 0x24, 0x9F, 0x24, 0x11, 0x13, 0x69, 0x16, + 0x12, 0xFF, 0x8B, 0x06, 0xF0, 0x0A, 0x35, 0x05, 0x2D, 0x1D, 0xD4, 0x05, + 0xA9, 0x1F, 0xD9, 0x02, 0x51, 0x16, 0x53, 0xFB, 0x12, 0x16, 0xD4, 0x00, + 0x83, 0x0B, 0xBC, 0x05, 0x55, 0xF9, 0x79, 0xFF, 0x22, 0xFB, 0x09, 0xFE, + 0x51, 0xF1, 0x63, 0xF4, 0xC5, 0xDF, 0xCA, 0xEC, 0xA9, 0xEC, 0x21, 0xFE, + 0xCC, 0xF9, 0x3F, 0x08, 0xA2, 0xE2, 0xD4, 0xF1, 0xC4, 0xD3, 0x4D, 0xDF, + 0x16, 0xE9, 0xF2, 0xEB, 0xA7, 0xFB, 0xDE, 0xF7, 0x3C, 0xF2, 0x16, 0xE5, + 0x54, 0xF0, 0x94, 0xD8, 0x0F, 0xF7, 0xB4, 0xE2, 0x92, 0xF7, 0x83, 0xF2, + 0xB1, 0xF9, 0x5E, 0xFC, 0x0D, 0xE8, 0x72, 0xED, 0x74, 0xC9, 0x38, 0xD6, + 0x92, 0xB9, 0x88, 0xD1, 0x29, 0xC2, 0xD4, 0xDA, 0xB4, 0xD8, 0xF3, 0xDC, + 0x11, 0xEB, 0x0B, 0xD7, 0x23, 0xE8, 0xCE, 0xD1, 0xA1, 0xD8, 0x49, 0xD1, + 0x2D, 0xD9, 0xD9, 0xDB, 0x68, 0xE2, 0xDF, 0xE9, 0x3E, 0xDD, 0x40, 0xE6, + 0x2C, 0xDF, 0x84, 0xDC, 0xF6, 0xF1, 0x55, 0xD8, 0x96, 0xFF, 0x30, 0xCE, + 0x40, 0x03, 0xF6, 0xC9, 0x92, 0xF9, 0x60, 0xD6, 0xC1, 0xD7, 0xC0, 0xDC, + 0x38, 0xC6, 0xD9, 0xDF, 0x1E, 0xCE, 0x6C, 0xE3, 0xB8, 0xCF, 0x87, 0xE2, + 0xD4, 0xC3, 0x38, 0xDC, 0x5C, 0xB7, 0xAE, 0xD2, 0xA4, 0xC1, 0x88, 0xD8, + 0xED, 0xC9, 0x54, 0xDC, 0x97, 0xC9, 0xCB, 0xDE, 0x55, 0xC1, 0x37, 0xE1, + 0xF8, 0xB2, 0xAD, 0xCB, 0x0A, 0xC1, 0x12, 0xBA, 0x08, 0xE1, 0xF4, 0xC3, + 0xD5, 0xDA, 0x4E, 0xC3, 0xF1, 0xB9, 0x4B, 0xA9, 0xCE, 0xBA, 0x00, 0xA2, + 0x50, 0xDA, 0xD1, 0xBE, 0x02, 0xE0, 0x10, 0xD0, 0x28, 0xCB, 0x9A, 0xC9, + 0xE7, 0xCE, 0x34, 0xCF, 0xB6, 0xE0, 0x21, 0xD7, 0x80, 0xF3, 0x80, 0xE1, + 0xD1, 0xFB, 0xBD, 0xEF, 0x09, 0xE9, 0xFE, 0xEB, 0x98, 0xD5, 0x02, 0xE5, + 0x94, 0xD5, 0x9E, 0xED, 0xBB, 0xE3, 0xE0, 0xFF, 0xF7, 0xF2, 0xA6, 0x0D, + 0x4D, 0xF7, 0x9C, 0x0B, 0xAD, 0xEE, 0xA6, 0xF8, 0xC2, 0xEA, 0xE3, 0xE8, + 0x03, 0xF2, 0xBB, 0xEC, 0x19, 0xEE, 0x65, 0xF1, 0xD6, 0xE4, 0xF4, 0xF2, + 0xE1, 0xE9, 0xA6, 0x01, 0x50, 0xF0, 0xC4, 0x11, 0xA7, 0xF4, 0x86, 0x15, + 0xCC, 0x05, 0xA8, 0x16, 0xDC, 0x11, 0x37, 0x14, 0xA1, 0x08, 0x5F, 0x0A, + 0x4C, 0x05, 0x15, 0x03, 0x77, 0x05, 0x98, 0xF8, 0xD8, 0x04, 0x9F, 0xF8, + 0x59, 0xF9, 0x65, 0xF8, 0x28, 0xF6, 0x8A, 0xF2, 0xFF, 0x0C, 0xA0, 0xF8, + 0x3D, 0x1A, 0x74, 0xFB, 0x35, 0x18, 0x46, 0xFF, 0x8A, 0x0B, 0xE8, 0x07, + 0x0D, 0xF9, 0xA2, 0x04, 0x82, 0x00, 0x11, 0x06, 0x99, 0x14, 0x13, 0x0E, + 0xA7, 0x04, 0xBB, 0x02, 0x66, 0xEA, 0x00, 0xEE, 0x14, 0xF8, 0x3B, 0xF6, + 0x4F, 0x16, 0xF5, 0x0B, 0xCC, 0x0E, 0xCC, 0x02, 0x3B, 0xF4, 0x58, 0xF6, + 0x14, 0xEF, 0x16, 0x04, 0x74, 0x04, 0x63, 0x13, 0x64, 0x2E, 0x78, 0x27, + 0x0D, 0x35, 0xCE, 0x34, 0xEE, 0x0F, 0xF8, 0x23, 0xA9, 0xF9, 0xF6, 0x0A, + 0xE7, 0xFD, 0xC6, 0xFF, 0x96, 0x09, 0xDF, 0xFB, 0xF3, 0x14, 0x16, 0xEF, + 0x32, 0x11, 0xE9, 0xDF, 0xBA, 0xFE, 0x6D, 0xDB, 0x1D, 0xFA, 0x51, 0xE0, + 0x34, 0x01, 0x5F, 0xE7, 0x07, 0xF9, 0x35, 0xE6, 0x1F, 0xF5, 0x9F, 0xE2, + 0xEA, 0xFE, 0x2A, 0xE3, 0x67, 0xFF, 0x53, 0xEA, 0xED, 0xF3, 0x7A, 0xF1, + 0x3C, 0xF0, 0xD1, 0xF7, 0xE0, 0xF1, 0x5E, 0xFF, 0x83, 0xF8, 0xFC, 0x04, + 0x3A, 0x04, 0xE7, 0xFF, 0xF5, 0xFE, 0xEF, 0xF2, 0x85, 0xE9, 0xC4, 0xEF, + 0xFE, 0xCA, 0xDC, 0xE7, 0xDB, 0xC6, 0xD7, 0xE7, 0xEB, 0xD5, 0x2E, 0xED, + 0xA9, 0xD8, 0x93, 0xE1, 0x4B, 0xD4, 0xF3, 0xDC, 0x2B, 0xCE, 0x56, 0xE8, + 0x4E, 0xC9, 0xA8, 0xED, 0x39, 0xDB, 0x0F, 0xF6, 0x36, 0xED, 0x72, 0xFA, + 0x21, 0xDF, 0x96, 0xE1, 0x0C, 0xD4, 0x79, 0xCA, 0xDF, 0xEC, 0x1A, 0xE2, + 0x59, 0x09, 0x34, 0x04, 0xFF, 0x04, 0x75, 0x03, 0x31, 0x03, 0xF6, 0x05, + 0x97, 0x15, 0xC0, 0x18, 0x8F, 0x2F, 0xA5, 0x23, 0x82, 0x40, 0x2C, 0x28, + 0xF3, 0x32, 0xDB, 0x1B, 0x66, 0x1F, 0x81, 0x03, 0xEE, 0x21, 0x45, 0xFF, + 0x2D, 0x2A, 0x34, 0x11, 0x4D, 0x2C, 0x87, 0x22, 0x86, 0x23, 0xE2, 0x1C, + 0x38, 0x0F, 0x20, 0x05, 0xCB, 0x05, 0x6A, 0xF5, 0x0C, 0x15, 0x60, 0x02, + 0x94, 0x26, 0x7F, 0x1D, 0x17, 0x28, 0x4D, 0x26, 0x6B, 0x28, 0x74, 0x21, + 0xA3, 0x2A, 0xF8, 0x24, 0x1F, 0x25, 0x76, 0x2F, 0x42, 0x14, 0x29, 0x29, + 0x4C, 0x0A, 0x09, 0x1C, 0xB8, 0x0B, 0xCE, 0x17, 0xFB, 0x18, 0x49, 0x1E, + 0x8C, 0x25, 0xF0, 0x1E, 0x17, 0x2A, 0xDF, 0x16, 0x45, 0x1E, 0x1B, 0x07, + 0xFA, 0x05, 0x0D, 0xF7, 0x82, 0x04, 0x2B, 0x05, 0x9F, 0x0A, 0x9B, 0x14, + 0xCA, 0x03, 0x06, 0x07, 0x30, 0xFF, 0x0C, 0xF6, 0x2D, 0xFD, 0x2D, 0xEF, + 0x5E, 0xFD, 0x16, 0xF6, 0x9E, 0x0A, 0x57, 0x0F, 0x94, 0x01, 0x97, 0x0C, + 0x1C, 0xE7, 0x75, 0xEB, 0xCA, 0xEF, 0x0B, 0xEF, 0x72, 0x13, 0x9D, 0x17, + 0xFD, 0x1A, 0x66, 0x1C, 0x87, 0x04, 0x8E, 0xFC, 0x9B, 0xFF, 0xFD, 0xFF, + 0x18, 0x0A, 0xE5, 0x22, 0x92, 0x13, 0x2A, 0x3A, 0x1B, 0x16, 0x0D, 0x39, + 0x17, 0x0A, 0x40, 0x1E, 0x12, 0x04, 0x3E, 0x07, 0xF3, 0x0D, 0xE6, 0x04, + 0xC4, 0x17, 0x34, 0x02, 0x91, 0x1E, 0xBB, 0x00, 0x3B, 0x18, 0xD9, 0x02, + 0xAA, 0x0B, 0xB4, 0x00, 0x03, 0x1B, 0x3A, 0x08, 0x0A, 0x35, 0xB7, 0x19, + 0x08, 0x33, 0x6A, 0x19, 0xE2, 0x23, 0x83, 0x09, 0x57, 0x21, 0xBF, 0x04, + 0x56, 0x29, 0xF6, 0x0A, 0x53, 0x2A, 0x8B, 0x04, 0x32, 0x16, 0xBD, 0xF3, + 0x8C, 0x00, 0x2B, 0xF6, 0x55, 0xFF, 0x4F, 0x02, 0x8D, 0x0F, 0x4E, 0x07, + 0x8B, 0x16, 0x86, 0x07, 0x4C, 0x10, 0x9E, 0x0C, 0x42, 0xFB, 0x84, 0x00, + 0xB8, 0xEC, 0xDC, 0xE7, 0xAD, 0xFD, 0xC6, 0xE8, 0xDB, 0x05, 0xBA, 0xF3, + 0x1A, 0xF0, 0xDB, 0xF4, 0x9F, 0xE2, 0x49, 0xF2, 0xA2, 0xDD, 0x85, 0xE1, + 0xD9, 0xD8, 0xB9, 0xD7, 0x47, 0xDA, 0xAE, 0xE9, 0x44, 0xC8, 0x54, 0xE1, + 0xD0, 0xBC, 0xC4, 0xC9, 0x79, 0xDD, 0xD5, 0xE0, 0x4C, 0xFD, 0xAC, 0x08, + 0x53, 0xEC, 0x3D, 0x03, 0x1C, 0xD3, 0xAC, 0xEC, 0x6D, 0xDA, 0xD6, 0xEC, + 0x91, 0xEB, 0x98, 0xF2, 0x13, 0xF8, 0x36, 0xF9, 0x50, 0xF7, 0xAB, 0xF4, + 0xD8, 0xE8, 0xD6, 0xDB, 0xF8, 0xE3, 0x00, 0xD4, 0xCA, 0xE8, 0xA0, 0xE5, + 0x27, 0xE9, 0x64, 0xEA, 0x1F, 0xEA, 0xD9, 0xE0, 0x88, 0xE4, 0xC5, 0xD5, + 0xE8, 0xD8, 0x33, 0xCD, 0xC3, 0xE1, 0xCC, 0xD6, 0x5F, 0xF1, 0x8C, 0xE7, + 0x7A, 0xE7, 0xC1, 0xE0, 0xE4, 0xD1, 0x18, 0xD7, 0x01, 0xCA, 0x7B, 0xE9, + 0xA5, 0xCE, 0xD4, 0xFF, 0x56, 0xD2, 0xD1, 0xF5, 0x0E, 0xD2, 0xC3, 0xD9, + 0x79, 0xD1, 0xA2, 0xC6, 0x8C, 0xD3, 0xE1, 0xBC, 0xA4, 0xDD, 0x98, 0xC2, + 0x85, 0xE8, 0x86, 0xD5, 0x10, 0xF0, 0x3F, 0xEA, 0x5F, 0xE7, 0xBA, 0xE6, + 0x1F, 0xE4, 0x18, 0xDE, 0x8C, 0xF7, 0xD5, 0xE5, 0x3A, 0xF8, 0x8F, 0xE1, + 0x9A, 0xDC, 0xBD, 0xD2, 0xE3, 0xCB, 0x09, 0xD5, 0x85, 0xCC, 0x36, 0xDA, + 0xE2, 0xDB, 0xF0, 0xE4, 0x6D, 0xE7, 0x0F, 0xF7, 0x4B, 0xD7, 0xE1, 0xEF, + 0x66, 0xD3, 0x5F, 0xE7, 0x32, 0xFD, 0x14, 0x05, 0xC2, 0x21, 0xC0, 0x22, + 0x0E, 0x13, 0xED, 0x14, 0x11, 0xFB, 0xCE, 0x0A, 0x89, 0xFD, 0x74, 0x19, + 0x09, 0x10, 0x38, 0x26, 0x2D, 0x21, 0x61, 0x2F, 0x79, 0x17, 0xFE, 0x2B, + 0x98, 0x04, 0x42, 0x1B, 0x77, 0x0F, 0x3A, 0x19, 0xF8, 0x21, 0x35, 0x1E, + 0xF7, 0x1D, 0x73, 0x16, 0xA6, 0x16, 0xA5, 0x15, 0xD8, 0x11, 0x8E, 0x18, + 0x4B, 0x12, 0xF3, 0x19, 0xE0, 0x20, 0xDA, 0x29, 0xEA, 0x26, 0xC0, 0x32, + 0xF9, 0x1A, 0x1E, 0x16, 0x4E, 0x18, 0xA6, 0xF7, 0x85, 0x24, 0x5B, 0xFE, + 0x6F, 0x29, 0x0A, 0x17, 0xB4, 0x1F, 0x1B, 0x1F, 0x87, 0x1B, 0xDB, 0x1C, + 0x9B, 0x21, 0xDC, 0x18, 0x6C, 0x28, 0x04, 0x17, 0xED, 0x25, 0xD9, 0x18, + 0x22, 0x13, 0xEF, 0x11, 0x80, 0x02, 0xE5, 0x07, 0x06, 0xF4, 0xDC, 0xF9, + 0x2A, 0xF0, 0xCA, 0xF9, 0x6D, 0xFD, 0x4B, 0x0A, 0x17, 0xFF, 0xBD, 0x08, + 0x30, 0xF8, 0x27, 0xFD, 0x7C, 0xF9, 0x32, 0x01, 0xE5, 0xF7, 0x2E, 0x04, + 0x60, 0x00, 0x98, 0x0B, 0xD7, 0x03, 0x65, 0x09, 0x73, 0xF0, 0xE6, 0xEE, + 0x20, 0xF1, 0xC2, 0xF1, 0x43, 0x13, 0x0C, 0x21, 0x19, 0x27, 0x47, 0x36, + 0x4F, 0x1C, 0xBD, 0x1C, 0xE6, 0x12, 0x2A, 0x10, 0x80, 0x17, 0x79, 0x1B, + 0x27, 0x27, 0x34, 0x27, 0x81, 0x33, 0x51, 0x2E, 0x7D, 0x24, 0x4A, 0x29, + 0x9F, 0x11, 0xAD, 0x1E, 0xDC, 0x16, 0x49, 0x1F, 0x9D, 0x17, 0x50, 0x1B, + 0xFE, 0x0C, 0x96, 0x13, 0x48, 0x0E, 0xC4, 0x19, 0xE9, 0x0E, 0x00, 0x1C, + 0x77, 0x10, 0xC7, 0x1D, 0xAB, 0x27, 0x24, 0x2F, 0x9A, 0x39, 0xE8, 0x2C, + 0x22, 0x2A, 0xFC, 0x0E, 0xCE, 0x17, 0xEA, 0x0C, 0x85, 0x18, 0x8E, 0x25, + 0x8B, 0x1A, 0x40, 0x2D, 0x94, 0x0F, 0xA6, 0x24, 0x0C, 0x09, 0xC6, 0x22, + 0x44, 0x0B, 0x63, 0x16, 0x9C, 0x11, 0x53, 0x05, 0x26, 0x16, 0xF2, 0x04, + 0x45, 0x0D, 0xB7, 0x08, 0x0A, 0x00, 0x34, 0x08, 0x31, 0xF6, 0x3B, 0x00, + 0xBF, 0xFF, 0x83, 0x04, 0x5C, 0x10, 0x7F, 0x18, 0xF9, 0x08, 0x54, 0x1C, + 0x8E, 0x03, 0x77, 0x12, 0xBC, 0x14, 0xFB, 0x13, 0xAC, 0x1D, 0x2B, 0x1C, + 0x77, 0x1A, 0x0B, 0x29, 0xD7, 0x0C, 0x22, 0x26, 0x12, 0xF6, 0x87, 0x0D, + 0x62, 0xF7, 0xC1, 0x09, 0x21, 0x19, 0xB3, 0x20, 0xFD, 0x29, 0xF5, 0x1C, + 0x32, 0x1B, 0xBB, 0x01, 0x3B, 0x14, 0x76, 0x04, 0x03, 0x1E, 0x55, 0x1F, + 0x62, 0x2C, 0x96, 0x36, 0x48, 0x37, 0x64, 0x42, 0x61, 0x30, 0xF3, 0x37, + 0x8C, 0x25, 0x0E, 0x29, 0x00, 0x26, 0x67, 0x30, 0x22, 0x20, 0x70, 0x35, + 0xDD, 0x18, 0xE8, 0x2F, 0xBB, 0x1A, 0x2E, 0x2E, 0xA8, 0x19, 0x51, 0x28, + 0x8D, 0x21, 0x1A, 0x29, 0x35, 0x43, 0x88, 0x3A, 0x71, 0x53, 0xA7, 0x34, + 0x12, 0x3A, 0x19, 0x16, 0xA7, 0x27, 0x04, 0x13, 0x2D, 0x2B, 0x08, 0x21, + 0x68, 0x2B, 0x7F, 0x21, 0x69, 0x24, 0x18, 0x21, 0xB9, 0x23, 0x4F, 0x21, + 0x03, 0x20, 0xC1, 0x0D, 0xDC, 0x1B, 0x5C, 0x05, 0xC4, 0x19, 0x39, 0x0E, + 0x31, 0x17, 0x38, 0x0F, 0x13, 0x12, 0x4E, 0x09, 0xD5, 0x06, 0x50, 0x00, + 0x59, 0x0D, 0x71, 0x09, 0x5A, 0x13, 0x61, 0x1F, 0xC2, 0xF8, 0x56, 0x1D, + 0x69, 0xE5, 0xA2, 0x0A, 0x95, 0xF1, 0x75, 0x01, 0x1B, 0x00, 0xC4, 0x05, + 0xC2, 0x0A, 0xDA, 0x10, 0x41, 0x03, 0xAF, 0x01, 0xD1, 0xED, 0x05, 0xE4, + 0x0F, 0xFC, 0xF9, 0xEF, 0x9F, 0x22, 0xD1, 0x11, 0xAC, 0x22, 0xE3, 0x0E, + 0x29, 0x0A, 0x8C, 0xFE, 0xDC, 0x09, 0x5B, 0x0B, 0xE6, 0x15, 0x80, 0x21, + 0x7F, 0x19, 0x53, 0x2D, 0x11, 0x0D, 0x96, 0x2A, 0x70, 0xF2, 0x8A, 0x1A, + 0x63, 0xEA, 0x8B, 0x19, 0x2F, 0xFA, 0xBC, 0x25, 0x4C, 0xFF, 0x7B, 0x1A, + 0xFF, 0xF8, 0x5A, 0x09, 0x3B, 0xF1, 0xED, 0x00, 0x4E, 0xE7, 0x42, 0xED, + 0xCF, 0xF2, 0xB2, 0xE4, 0x94, 0x10, 0x2F, 0xF2, 0x04, 0x11, 0x9A, 0xF0, + 0xEB, 0x00, 0x16, 0xE8, 0x43, 0xFE, 0x39, 0xEC, 0xD4, 0xF8, 0xEE, 0xE1, + 0x6D, 0xED, 0xFF, 0xC9, 0x65, 0xE1, 0xD4, 0xC0, 0x9A, 0xDD, 0x03, 0xCA, + 0xA6, 0xD9, 0xA2, 0xC8, 0xE4, 0xD9, 0xC4, 0xC4, 0xBB, 0xDD, 0xCD, 0xC9, + 0x2F, 0xDF, 0xE3, 0xD4, 0xC1, 0xDC, 0xD3, 0xDA, 0x95, 0xDE, 0x13, 0xD4, + 0x99, 0xEE, 0x73, 0xD6, 0x8C, 0xE4, 0x28, 0xD9, 0x3E, 0xB6, 0x64, 0xCC, + 0x41, 0xA0, 0x01, 0xC1, 0x24, 0xAC, 0x74, 0xB9, 0x9F, 0xBF, 0x39, 0xBB, + 0xA4, 0xDC, 0x7D, 0xD1, 0x0F, 0xDB, 0x0D, 0xD2, 0x64, 0xBE, 0x6A, 0xBD, + 0xFF, 0xC5, 0xB2, 0xC4, 0xC5, 0xDE, 0x25, 0xD3, 0x04, 0xD6, 0xB3, 0xC8, + 0xD7, 0xC8, 0x11, 0xC7, 0x12, 0xD2, 0x26, 0xDE, 0x0A, 0xDE, 0x4E, 0xF7, + 0x63, 0xE2, 0x4E, 0x05, 0xCC, 0xD8, 0xBB, 0xF9, 0x61, 0xC7, 0xF7, 0xDB, + 0x56, 0xC4, 0xFE, 0xCB, 0x29, 0xCB, 0x2A, 0xCE, 0xB7, 0xC8, 0xF6, 0xD0, + 0xB8, 0xCB, 0xBF, 0xD7, 0x26, 0xD8, 0xA9, 0xD7, 0x34, 0xD6, 0x3A, 0xC5, + 0x29, 0xD7, 0xB3, 0xC0, 0xEE, 0xE4, 0x6B, 0xCD, 0x82, 0xDD, 0x59, 0xC6, + 0xB4, 0xD2, 0x70, 0xBD, 0x75, 0xD5, 0x82, 0xC5, 0x2B, 0xD5, 0x05, 0xCA, + 0x1B, 0xCF, 0x2A, 0xCD, 0x38, 0xC4, 0x21, 0xD4, 0x15, 0xC1, 0xB2, 0xDD, + 0x8A, 0xC2, 0xB4, 0xDD, 0x44, 0xC5, 0xD1, 0xD6, 0x1B, 0xC9, 0x14, 0xCE, + 0xF5, 0xD5, 0x1F, 0xCC, 0xBB, 0xE0, 0x0D, 0xCC, 0x25, 0xE3, 0xB9, 0xCE, + 0xC3, 0xF4, 0x06, 0xE2, 0xE5, 0xFD, 0x91, 0xE8, 0x66, 0xDF, 0x58, 0xD0, + 0x59, 0xC6, 0xB7, 0xC0, 0x3C, 0xCA, 0xB7, 0xC6, 0xCF, 0xDF, 0xD8, 0xD4, + 0x34, 0xFE, 0x6B, 0xE9, 0xFB, 0xF7, 0xAA, 0xE5, 0x76, 0xE1, 0x85, 0xDB, + 0xFA, 0xF9, 0xD1, 0xF8, 0x2D, 0x1F, 0x41, 0x16, 0x68, 0x1C, 0xE0, 0x0D, + 0x3F, 0x12, 0x19, 0x04, 0x5D, 0x1D, 0x7D, 0x0D, 0xCC, 0x2B, 0x2B, 0x1F, + 0x7B, 0x31, 0xB8, 0x32, 0x5E, 0x24, 0x81, 0x37, 0x6A, 0x0D, 0x3E, 0x2B, + 0xEB, 0x0E, 0xF8, 0x26, 0x23, 0x1C, 0xEC, 0x28, 0xA7, 0x13, 0xAE, 0x22, + 0x91, 0x09, 0xD3, 0x21, 0x76, 0x0D, 0xEF, 0x20, 0x04, 0x11, 0xD4, 0x14, + 0xA0, 0x1C, 0x12, 0x15, 0x94, 0x1F, 0x2A, 0x20, 0xC6, 0x03, 0x86, 0x1A, + 0xA1, 0xF4, 0xF1, 0x13, 0x90, 0x05, 0x10, 0x18, 0x4A, 0x0F, 0x98, 0x16, + 0xE6, 0x07, 0x74, 0x0C, 0xEA, 0x0B, 0x63, 0xFE, 0xC9, 0x1C, 0x49, 0xF2, + 0xC7, 0x1A, 0x6C, 0xE9, 0x2E, 0x08, 0xFD, 0xEB, 0x2B, 0xF7, 0xF1, 0xEF, + 0x05, 0xF9, 0xA8, 0xEC, 0x69, 0x09, 0x4F, 0xE8, 0x87, 0x0D, 0x77, 0xEB, + 0x74, 0x0D, 0x13, 0xFB, 0x2A, 0x0A, 0xD7, 0xFE, 0x42, 0xF8, 0x6B, 0xE7, + 0xF4, 0xEB, 0xF4, 0xDB, 0x3F, 0xE4, 0x7B, 0xE8, 0xA7, 0xE0, 0x68, 0xF7, + 0x1B, 0xF5, 0x1F, 0x05, 0xD2, 0xFE, 0x94, 0xF6, 0x70, 0xEC, 0x77, 0xDB, + 0x9A, 0xEA, 0x11, 0xEA, 0xF1, 0xF8, 0x0A, 0x09, 0x36, 0xF1, 0xFB, 0x07, + 0xC7, 0xE4, 0x6C, 0xFA, 0xBF, 0xF2, 0xF3, 0xFF, 0xBB, 0x03, 0x92, 0x09, + 0xE1, 0x08, 0x7C, 0x0D, 0x5A, 0x07, 0xA3, 0x12, 0xA6, 0xF7, 0x8A, 0x0A, + 0x0C, 0xF2, 0xC0, 0x05, 0x5D, 0xFF, 0x31, 0x0D, 0xA3, 0xFE, 0xB9, 0x02, + 0xC0, 0xFB, 0x85, 0xF1, 0x21, 0x05, 0xDC, 0xEE, 0x0B, 0x04, 0xEE, 0xEC, + 0xE7, 0x03, 0xD3, 0xF3, 0xBE, 0x0F, 0xB5, 0x06, 0x68, 0x11, 0x5E, 0x0A, + 0xD2, 0x0B, 0x50, 0xFE, 0x92, 0x14, 0x17, 0x01, 0xEE, 0x17, 0xC7, 0x11, + 0xB9, 0x0E, 0xD0, 0x1B, 0x94, 0x0E, 0xB5, 0x20, 0xF3, 0x10, 0x22, 0x1E, + 0x09, 0x07, 0x6C, 0x0D, 0xB0, 0x02, 0xCE, 0x03, 0xC2, 0xFE, 0xB3, 0x03, + 0xF7, 0xFB, 0xDB, 0xFF, 0x56, 0x07, 0x85, 0xFE, 0x6F, 0x0A, 0x52, 0x01, + 0x37, 0x0D, 0x9F, 0x0D, 0xE2, 0x19, 0x71, 0x11, 0x95, 0x19, 0x7C, 0xF8, + 0x7B, 0x14, 0xFC, 0xEA, 0xED, 0x19, 0x85, 0xF9, 0x43, 0x1A, 0x2E, 0x05, + 0x95, 0x1E, 0x44, 0x13, 0x1F, 0x1C, 0xBE, 0x13, 0xE6, 0x02, 0xE2, 0xFA, + 0xC2, 0xFE, 0x76, 0xFC, 0x1D, 0x17, 0xE3, 0x1D, 0xA2, 0x1C, 0xBD, 0x27, + 0xB0, 0x18, 0xE9, 0x1A, 0x77, 0x2B, 0xB3, 0x23, 0x1B, 0x36, 0x95, 0x33, + 0x0E, 0x26, 0x15, 0x36, 0x8F, 0x19, 0x22, 0x3B, 0x09, 0x13, 0x9C, 0x35, + 0x81, 0x1A, 0x14, 0x30, 0x8F, 0x2C, 0xB1, 0x37, 0xC1, 0x23, 0x47, 0x2A, + 0x9D, 0x10, 0x98, 0x0C, 0x5B, 0x0B, 0xA1, 0xFD, 0xA6, 0xFD, 0x6F, 0xFA, + 0x59, 0xF6, 0x88, 0x08, 0x70, 0x07, 0x53, 0x23, 0x8D, 0x10, 0x7D, 0x2D, + 0x9B, 0x0B, 0x97, 0x22, 0x74, 0x0B, 0x53, 0x1A, 0xC0, 0x09, 0x20, 0x13, + 0xAF, 0x06, 0x6A, 0x07, 0x8A, 0x0C, 0x7A, 0x07, 0x4D, 0x0E, 0x6E, 0x0D, + 0x2D, 0x05, 0x7F, 0x01, 0xDE, 0x0B, 0xDB, 0xF2, 0xC6, 0x17, 0xE1, 0xED, + 0xCE, 0x1F, 0x97, 0xEC, 0xE0, 0x27, 0x27, 0xF0, 0x78, 0x1D, 0xAA, 0xF3, + 0x3B, 0x14, 0xD9, 0x02, 0x33, 0x19, 0xFC, 0x10, 0xE2, 0x0D, 0x6D, 0x07, + 0x13, 0x05, 0x46, 0x03, 0x1B, 0x13, 0x37, 0x0D, 0x7F, 0x18, 0xBC, 0x11, + 0xEA, 0x1A, 0xBA, 0x20, 0xE1, 0x0B, 0xF5, 0x1A, 0xBA, 0xE1, 0x86, 0xF2, + 0xA4, 0xDC, 0x76, 0xF0, 0x18, 0x00, 0x1C, 0x18, 0x2A, 0x0A, 0xF8, 0x21, + 0xF7, 0x06, 0x41, 0x17, 0xC8, 0x19, 0x8A, 0x1E, 0x55, 0x24, 0x1D, 0x23, + 0xCB, 0x1B, 0xDE, 0x20, 0x17, 0x14, 0xDE, 0x20, 0xC1, 0x05, 0x28, 0x0F, + 0xF7, 0xFF, 0x28, 0xFF, 0xB8, 0x07, 0xC6, 0x02, 0xFC, 0xFC, 0x8D, 0xFB, + 0x2F, 0xEE, 0xFD, 0xEC, 0xB8, 0xEB, 0xB1, 0xE6, 0xD1, 0xE2, 0x26, 0xE0, + 0x6F, 0xE5, 0xF4, 0xDF, 0xF4, 0xF2, 0x11, 0xE9, 0xC4, 0xEC, 0x7C, 0xEE, + 0x01, 0xE5, 0xBE, 0xF6, 0x51, 0xEB, 0x91, 0x03, 0x59, 0xE8, 0x25, 0xFF, + 0x9B, 0xE0, 0x36, 0xF2, 0xF9, 0xE4, 0xA9, 0xED, 0xCE, 0xE1, 0x94, 0xE5, + 0x77, 0xD3, 0xC8, 0xCD, 0xD7, 0xD4, 0x35, 0xBF, 0x4F, 0xD8, 0xA4, 0xC0, + 0x66, 0xDB, 0xA6, 0xC9, 0xE2, 0xE1, 0xCB, 0xD1, 0x71, 0xD6, 0x3E, 0xD1, + 0x6E, 0xCC, 0x14, 0xD9, 0xA2, 0xCF, 0x60, 0xE0, 0xC5, 0xC2, 0x3F, 0xD4, + 0x74, 0xBC, 0xA4, 0xCB, 0x8B, 0xCD, 0x3C, 0xCB, 0x4F, 0xD6, 0x93, 0xC5, + 0x1D, 0xE4, 0x1E, 0xD5, 0x8F, 0xE7, 0x04, 0xD9, 0x9A, 0xCA, 0xA5, 0xB8, + 0x94, 0xCD, 0x15, 0xBF, 0x44, 0xF7, 0x55, 0xEA, 0x73, 0xF9, 0xBF, 0xE7, + 0x86, 0xEC, 0xA5, 0xD6, 0x5C, 0xF8, 0x4F, 0xE1, 0x9A, 0xFC, 0xB6, 0xEC, + 0xAD, 0xF9, 0x9E, 0xF7, 0x68, 0xF8, 0x66, 0xFE, 0xC0, 0xE8, 0xFB, 0xF2, + 0x91, 0xE1, 0x7E, 0xF2, 0xC9, 0xEE, 0x3D, 0x00, 0x79, 0xEF, 0xCE, 0xFC, + 0x51, 0xEA, 0xB6, 0xF6, 0x4A, 0xEB, 0x30, 0xFA, 0x46, 0xE9, 0x0E, 0xFE, + 0xC5, 0xF2, 0x27, 0x0D, 0xB5, 0xFE, 0x9A, 0x1D, 0xA3, 0xF6, 0x8B, 0x13, + 0x5B, 0xF7, 0x66, 0x0E, 0x2C, 0x09, 0xCE, 0x19, 0x70, 0x09, 0xC5, 0x10, + 0xB5, 0x07, 0x4E, 0xFF, 0x38, 0x0F, 0xB8, 0xFD, 0x11, 0x05, 0xB8, 0x01, + 0x3C, 0xF7, 0x40, 0x00, 0x78, 0x04, 0x69, 0x02, 0xE5, 0x14, 0x51, 0x02, + 0x68, 0x14, 0xFD, 0xFD, 0xAE, 0x12, 0x83, 0x00, 0x71, 0x0B, 0x29, 0x01, + 0x73, 0x0D, 0x8B, 0x02, 0x86, 0x1D, 0x51, 0x09, 0x38, 0x16, 0xD5, 0x0A, + 0x05, 0x07, 0x19, 0x12, 0xA8, 0x0F, 0xEC, 0x1D, 0x84, 0x1A, 0x20, 0x17, + 0x27, 0x2B, 0x20, 0x1C, 0x90, 0x30, 0xD8, 0x20, 0x74, 0x0C, 0x58, 0x03, + 0xF1, 0x02, 0x81, 0x01, 0x8C, 0x1F, 0x5C, 0x22, 0x87, 0x11, 0x5F, 0x21, + 0x14, 0xF2, 0x0B, 0x14, 0x34, 0xF9, 0x3C, 0x19, 0x51, 0x0A, 0xF3, 0x17, + 0x4F, 0x15, 0xF5, 0x1C, 0x1F, 0x1C, 0xB8, 0x2A, 0xEC, 0x13, 0x98, 0x27, + 0x05, 0x17, 0x3E, 0x2B, 0x1B, 0x25, 0xBC, 0x34, 0xA4, 0x19, 0x29, 0x22, + 0x2E, 0x0E, 0x3E, 0x0D, 0x3A, 0x16, 0xA9, 0x07, 0xC8, 0x18, 0xD2, 0xFE, + 0x5E, 0x21, 0x74, 0x0B, 0x52, 0x2A, 0x7A, 0x1F, 0x69, 0x1F, 0x3F, 0x11, + 0x7A, 0x18, 0x09, 0x01, 0x43, 0x1A, 0xE7, 0x05, 0x87, 0x0F, 0xC6, 0x0A, + 0x35, 0x0C, 0x6C, 0x12, 0xBB, 0x11, 0x49, 0x1B, 0x89, 0x0D, 0x1E, 0x15, + 0x4D, 0x04, 0xB5, 0x0A, 0xF2, 0xFB, 0x44, 0x09, 0xD7, 0xF4, 0x25, 0x08, + 0xD6, 0xFA, 0x3E, 0x05, 0x83, 0x07, 0xE7, 0x05, 0x85, 0x03, 0x67, 0x07, + 0x0A, 0x08, 0x30, 0x11, 0xCC, 0x1A, 0xA6, 0x1B, 0x50, 0x17, 0x15, 0x16, + 0x06, 0x03, 0x28, 0x11, 0xFD, 0xF6, 0xFD, 0x0F, 0x71, 0xF4, 0xC7, 0x05, + 0x2D, 0x06, 0x33, 0x0A, 0x32, 0x11, 0x03, 0x0F, 0x0C, 0xF8, 0xC7, 0xF5, + 0xB1, 0xF8, 0xE3, 0xEE, 0xE7, 0x1D, 0xF7, 0x06, 0x1F, 0x19, 0xDB, 0x02, + 0x0E, 0xF9, 0xA9, 0xF9, 0x0B, 0xF7, 0xDD, 0x10, 0x15, 0x04, 0x0F, 0x25, + 0x04, 0x16, 0x72, 0x2C, 0xB9, 0x26, 0x73, 0x2F, 0xF6, 0x1F, 0x18, 0x26, + 0x25, 0x1D, 0x51, 0x27, 0xF8, 0x29, 0x78, 0x30, 0x11, 0x23, 0xD3, 0x21, + 0xEF, 0x0A, 0x8B, 0x10, 0x47, 0xFF, 0xF8, 0x12, 0x06, 0x02, 0x39, 0x10, + 0xF3, 0x11, 0x71, 0x0F, 0xBC, 0x19, 0x93, 0x17, 0x9E, 0x07, 0x45, 0x0F, + 0x9F, 0x01, 0x69, 0x00, 0xA6, 0x1A, 0x43, 0x04, 0x73, 0x26, 0x26, 0x0A, + 0x77, 0x1F, 0xED, 0x12, 0x25, 0x1D, 0x90, 0x21, 0x79, 0x23, 0x9C, 0x1D, + 0xBC, 0x31, 0x40, 0x14, 0xC0, 0x33, 0xA4, 0x18, 0x08, 0x1F, 0xD0, 0x20, + 0x56, 0x15, 0xAC, 0x20, 0x87, 0x1D, 0x5A, 0x17, 0xD9, 0x16, 0x0F, 0x05, + 0x70, 0x12, 0x93, 0x08, 0xFF, 0x21, 0x29, 0x23, 0x35, 0x27, 0x39, 0x24, + 0xE9, 0x25, 0x69, 0x15, 0xF3, 0x28, 0x14, 0x13, 0xFB, 0x11, 0xE2, 0x04, + 0x13, 0x08, 0x36, 0xFF, 0x57, 0x1C, 0x53, 0x0F, 0x99, 0x10, 0x7F, 0x02, + 0xA6, 0x07, 0xE6, 0xFF, 0x2F, 0x27, 0xB1, 0x25, 0x06, 0x27, 0xDE, 0x25, + 0xCE, 0x09, 0x62, 0x09, 0xE2, 0x00, 0x1F, 0x0E, 0xA7, 0x03, 0xC7, 0x26, + 0x40, 0x0E, 0x8B, 0x35, 0xFA, 0x1A, 0x5C, 0x37, 0xAF, 0x0C, 0xAE, 0x23, + 0x50, 0xFC, 0x3F, 0x13, 0x87, 0x06, 0xE6, 0x15, 0xBC, 0x09, 0xD8, 0x0C, + 0xE4, 0x07, 0x3A, 0x00, 0xA6, 0x10, 0xD5, 0x01, 0x15, 0x0E, 0x13, 0x00, + 0xA3, 0x06, 0xF5, 0xFC, 0xC3, 0x0A, 0xF8, 0x05, 0xA7, 0x07, 0x95, 0x05, + 0x3B, 0x02, 0x54, 0x02, 0x93, 0x09, 0x62, 0x0E, 0x9B, 0x06, 0xCC, 0x10, + 0xFB, 0xFA, 0x7C, 0x07, 0x4C, 0xF9, 0x6A, 0x04, 0xC2, 0xFB, 0x68, 0xFF, + 0xD0, 0xFE, 0xE1, 0xF6, 0xF1, 0xF7, 0xED, 0xF9, 0xEB, 0xE2, 0x1A, 0x02, + 0xAD, 0xD9, 0xC4, 0xFE, 0x62, 0xEA, 0xF2, 0xF5, 0x0C, 0xF0, 0xFA, 0xE4, + 0x01, 0xEB, 0x03, 0xDF, 0x08, 0xF4, 0x75, 0xED, 0xD3, 0xF2, 0x42, 0xEC, + 0x97, 0xED, 0x7D, 0xDC, 0xA1, 0xF9, 0x1E, 0xDF, 0x83, 0xF7, 0x36, 0xDB, + 0xE7, 0xF1, 0xF8, 0xD2, 0x31, 0x00, 0x15, 0xE3, 0x9B, 0xEC, 0x32, 0xDA, + 0x11, 0xD1, 0x00, 0xC8, 0x1D, 0xEA, 0xD5, 0xE2, 0xA4, 0xF6, 0x68, 0xF3, + 0x8A, 0xDA, 0xCE, 0xD4, 0xEB, 0xD3, 0x02, 0xCD, 0x27, 0xDC, 0x7C, 0xE8, + 0x61, 0xD6, 0xBD, 0xF4, 0x14, 0xDD, 0x0D, 0xF0, 0x0F, 0xE2, 0xE3, 0xDA, + 0x5B, 0xDD, 0x3E, 0xCB, 0xF9, 0xE1, 0xF5, 0xD4, 0x6F, 0xDA, 0xA6, 0xD7, + 0xFD, 0xCE, 0x98, 0xC9, 0x10, 0xDC, 0x7F, 0xCB, 0x52, 0xE6, 0x7C, 0xD5, + 0xB6, 0xDF, 0xBA, 0xD4, 0x60, 0xE1, 0x2B, 0xD7, 0xFD, 0xD6, 0xEF, 0xC9, + 0xF1, 0xBF, 0x26, 0xB4, 0x94, 0xBB, 0x55, 0xB4, 0xCB, 0xBC, 0x17, 0xC1, + 0x25, 0xB5, 0x23, 0xC1, 0x77, 0xB5, 0x06, 0xC1, 0xA4, 0xC4, 0x18, 0xCF, + 0x79, 0xCA, 0x62, 0xD2, 0x4A, 0xC1, 0x6C, 0xCD, 0x28, 0xBF, 0x01, 0xD5, + 0xE1, 0xC3, 0xB4, 0xD9, 0xD1, 0xD4, 0xA0, 0xDA, 0x53, 0xD9, 0x90, 0xD6, + 0x5E, 0xD3, 0xEE, 0xCE, 0xFF, 0xD1, 0x1F, 0xCC, 0x86, 0xC4, 0x57, 0xC7, + 0x8B, 0xB1, 0x0B, 0xBB, 0xEB, 0xB2, 0xED, 0xB4, 0x5A, 0xC4, 0xC2, 0xB3, + 0xC8, 0xD3, 0xB3, 0xB3, 0x75, 0xE5, 0x0B, 0xBF, 0xD8, 0xDC, 0x67, 0xC7, + 0x14, 0xC0, 0x57, 0xC3, 0xC5, 0xCA, 0xFF, 0xD7, 0x69, 0xEB, 0xFF, 0xF8, + 0xE4, 0xDF, 0x86, 0xE7, 0xFF, 0xDA, 0x9B, 0xDE, 0xC0, 0xEC, 0x2F, 0xF7, + 0x89, 0xE7, 0x04, 0xFA, 0xCE, 0xE6, 0x3D, 0xEB, 0x96, 0xF4, 0x00, 0xE4, + 0x56, 0xFC, 0xDA, 0xE2, 0xC9, 0x07, 0xC9, 0xEE, 0x6C, 0x14, 0xF8, 0x01, + 0x12, 0x11, 0x9A, 0x01, 0x69, 0x0F, 0xEF, 0xFE, 0x2B, 0x1A, 0xA7, 0x0B, + 0x18, 0x18, 0x34, 0x0C, 0x6C, 0x14, 0x4C, 0x08, 0x14, 0x10, 0xE0, 0x0E, + 0x03, 0xF4, 0x15, 0x0A, 0x36, 0xEF, 0xA8, 0x10, 0x75, 0x05, 0x07, 0x20, + 0x88, 0x03, 0x0E, 0x06, 0xF7, 0x0E, 0x25, 0xFD, 0xE4, 0x29, 0xA3, 0x16, + 0x57, 0x22, 0xB5, 0x16, 0x41, 0x16, 0x31, 0x11, 0xB2, 0x17, 0x4C, 0x1D, + 0x7D, 0x17, 0x8F, 0x24, 0x42, 0x18, 0x87, 0x1E, 0xF8, 0x10, 0xB0, 0x1A, + 0x18, 0x0B, 0xB6, 0x19, 0xC5, 0x08, 0xDD, 0x12, 0xB5, 0xFF, 0x93, 0x0D, + 0x71, 0xEA, 0xC6, 0x07, 0x56, 0xEB, 0x3B, 0x02, 0xCF, 0x06, 0x50, 0x02, + 0xDF, 0x11, 0xC2, 0x00, 0xFA, 0x23, 0x73, 0x15, 0x5A, 0x21, 0x06, 0x20, + 0x0F, 0x00, 0x5B, 0x08, 0x81, 0x02, 0x12, 0x0F, 0x2E, 0x19, 0x2A, 0x28, + 0x76, 0x05, 0x38, 0x1B, 0x53, 0xF1, 0xC2, 0x07, 0xD2, 0xFD, 0x57, 0x09, + 0xBE, 0x13, 0x09, 0x10, 0xAB, 0x17, 0x08, 0x02, 0xA4, 0x0E, 0x37, 0xEF, + 0xCA, 0x09, 0x27, 0xE8, 0x4E, 0x08, 0x3E, 0xF4, 0x75, 0x05, 0x2F, 0x0A, + 0x3B, 0xF7, 0x5E, 0x06, 0xDC, 0x02, 0xE3, 0x01, 0x27, 0x11, 0xF2, 0x01, + 0x01, 0xFE, 0xF3, 0xF1, 0x1B, 0xF6, 0x86, 0xEE, 0xCD, 0xFA, 0x73, 0xF7, + 0x7A, 0xEA, 0xE8, 0xE9, 0xB6, 0xF1, 0x62, 0xEC, 0xA6, 0x0C, 0x02, 0xFF, + 0xC2, 0x13, 0x70, 0xF8, 0xC6, 0x17, 0x43, 0xF2, 0xB6, 0x17, 0x70, 0xFD, + 0xBB, 0x0B, 0xF8, 0x0A, 0x43, 0x02, 0xE3, 0x08, 0x96, 0x01, 0x6D, 0x04, + 0xE4, 0xFF, 0xD8, 0x03, 0x0B, 0x01, 0x07, 0x08, 0x2C, 0x00, 0x8D, 0x0E, + 0x1F, 0xF4, 0xF4, 0x05, 0x38, 0xF9, 0x3C, 0x06, 0x90, 0x06, 0x6E, 0x12, + 0x10, 0xF2, 0xC4, 0x0D, 0x70, 0xEB, 0x25, 0x0D, 0xB9, 0xFD, 0xB2, 0x15, + 0x59, 0xFC, 0x09, 0x0C, 0x6F, 0x04, 0xC9, 0x11, 0x69, 0x0F, 0xAB, 0x16, + 0xDF, 0x07, 0xD2, 0x00, 0xF9, 0x09, 0xD8, 0xFF, 0x25, 0x19, 0x9A, 0x16, + 0x89, 0x11, 0x70, 0x0E, 0x97, 0x0E, 0x9A, 0xF7, 0x93, 0x1D, 0x9B, 0xFA, + 0x7B, 0x2A, 0xE7, 0x08, 0xC2, 0x37, 0x1C, 0x16, 0x0B, 0x31, 0x4B, 0x12, + 0x95, 0x17, 0xB4, 0xFE, 0xCC, 0x15, 0x7D, 0x04, 0xF6, 0x1F, 0xB9, 0x1A, + 0x9D, 0x15, 0xD3, 0x1D, 0x88, 0x1A, 0xBE, 0x1B, 0x7C, 0x25, 0x59, 0x1D, + 0x9E, 0x17, 0xE4, 0x19, 0xD3, 0x0E, 0x05, 0x23, 0xF1, 0x16, 0x22, 0x33, + 0x77, 0x11, 0x2D, 0x29, 0x27, 0x12, 0x0A, 0x24, 0x0B, 0x20, 0x9E, 0x34, + 0x68, 0x16, 0x62, 0x2E, 0xE7, 0x0B, 0xE2, 0x18, 0x67, 0x15, 0x01, 0x16, + 0x39, 0x11, 0xE7, 0x11, 0xAD, 0x0E, 0xFF, 0x10, 0x21, 0x10, 0xDE, 0x0F, + 0xDA, 0x0A, 0x99, 0x02, 0x97, 0x17, 0xE6, 0x09, 0x15, 0x1B, 0x64, 0x18, + 0x74, 0x05, 0xBF, 0x15, 0xA5, 0x0B, 0x1F, 0x1A, 0x85, 0x23, 0xE0, 0x23, + 0xEF, 0x17, 0x4A, 0x1C, 0xF0, 0x02, 0xDD, 0x16, 0x5A, 0x0D, 0x60, 0x28, + 0x36, 0x11, 0x32, 0x1A, 0xE8, 0x17, 0x4B, 0x08, 0xC5, 0x28, 0xD2, 0x18, + 0x6F, 0x0E, 0xEE, 0x0E, 0x0C, 0xFE, 0x21, 0x01, 0x11, 0x1D, 0x5C, 0x1B, + 0x05, 0x23, 0x9D, 0x2A, 0xAC, 0x07, 0x97, 0x1C, 0x82, 0x09, 0x4D, 0x1C, + 0x92, 0x28, 0xAD, 0x25, 0x7B, 0x3A, 0x90, 0x29, 0x3F, 0x2A, 0x61, 0x25, + 0xDC, 0x0B, 0x1D, 0x11, 0x0A, 0x0D, 0xC8, 0x0A, 0xB1, 0x20, 0xC4, 0x1F, + 0x63, 0x13, 0x11, 0x24, 0xF0, 0x01, 0x22, 0x16, 0x87, 0x0C, 0xD0, 0x12, + 0x13, 0x11, 0x5F, 0x04, 0xF5, 0x0C, 0x30, 0xFB, 0x24, 0x15, 0xC2, 0x0E, + 0xA4, 0x14, 0x9E, 0x0B, 0x50, 0x10, 0x4F, 0xEF, 0x34, 0x1E, 0xC0, 0xF2, + 0xF8, 0x1C, 0xC2, 0xFC, 0x5D, 0x0A, 0xBA, 0xEE, 0x0D, 0x02, 0x26, 0xE9, + 0x21, 0x02, 0x67, 0xEF, 0x04, 0x06, 0x41, 0xF6, 0xAF, 0xFF, 0x8C, 0xF4, + 0x99, 0xF0, 0x90, 0xF3, 0xB6, 0xEC, 0x34, 0xFB, 0x89, 0xEC, 0x89, 0x01, + 0x18, 0xDC, 0x70, 0x02, 0xB9, 0xD2, 0x34, 0x08, 0x9C, 0xDE, 0x5B, 0x11, + 0x64, 0xDE, 0xBB, 0x02, 0x72, 0xCC, 0xBE, 0xEA, 0xB5, 0xCA, 0x17, 0xEB, + 0xB1, 0xC4, 0x09, 0xDF, 0x3C, 0xBC, 0xF1, 0xC8, 0x12, 0xCE, 0xA4, 0xCC, + 0x33, 0xD4, 0xA9, 0xCA, 0x21, 0xCA, 0x35, 0xC1, 0x71, 0xE2, 0x65, 0xD7, + 0x0F, 0x05, 0x88, 0xE9, 0x10, 0xEF, 0xD7, 0xCE, 0xAD, 0xD0, 0xAD, 0xC4, + 0x6F, 0xD1, 0xA5, 0xD5, 0xAF, 0xDF, 0x96, 0xDA, 0x81, 0xF2, 0xD1, 0xDA, + 0x51, 0xF4, 0xCC, 0xD2, 0x3F, 0xEE, 0xBE, 0xCD, 0x34, 0xF2, 0xCF, 0xDF, + 0x2E, 0xED, 0x7A, 0xE9, 0x0B, 0xE9, 0x4D, 0xE1, 0xB7, 0xEF, 0x65, 0xE3, + 0x1F, 0xE8, 0xCC, 0xE2, 0x89, 0xDD, 0xD5, 0xDD, 0x62, 0xEE, 0x77, 0xED, + 0x61, 0xF3, 0x67, 0xFA, 0xA6, 0xDB, 0xB8, 0xED, 0xDD, 0xE1, 0x1C, 0xED, + 0xD7, 0xF8, 0x7F, 0xF0, 0xAA, 0xE1, 0xCC, 0xD2, 0x90, 0xC1, 0xEB, 0xCD, + 0x96, 0xC7, 0x29, 0xEB, 0xC3, 0xDE, 0xD4, 0xF7, 0x0D, 0xF5, 0x61, 0xFC, + 0x95, 0xF7, 0xD6, 0x00, 0x8D, 0xED, 0x65, 0xFD, 0x48, 0xE9, 0x0A, 0xFC, + 0xCA, 0xE1, 0xCC, 0xF6, 0xFD, 0xE3, 0xC8, 0xF3, 0xB3, 0xFE, 0xF8, 0x04, + 0xC8, 0x11, 0x87, 0x0A, 0xB1, 0x0B, 0xA4, 0xF7, 0xC6, 0xFB, 0xB3, 0xF3, + 0x81, 0xED, 0x64, 0xFC, 0x47, 0xDF, 0xD4, 0xF6, 0x7E, 0xE6, 0xC6, 0x01, + 0x9A, 0xF9, 0x60, 0x16, 0xAF, 0xF4, 0xBE, 0x07, 0xBE, 0x08, 0x59, 0x0A, + 0x40, 0x23, 0xBB, 0x22, 0xCA, 0x11, 0xB6, 0x1A, 0x9E, 0xFF, 0x95, 0x12, + 0x33, 0x00, 0x47, 0x20, 0x4D, 0x0C, 0x7B, 0x2A, 0xAF, 0x1F, 0x6F, 0x2D, + 0x35, 0x25, 0xCE, 0x2B, 0xD6, 0x18, 0x73, 0x1F, 0xF0, 0x1B, 0x18, 0x16, + 0xBA, 0x21, 0xF7, 0x13, 0x9E, 0x0C, 0x74, 0x07, 0xB0, 0x08, 0x71, 0x01, + 0x69, 0x19, 0x66, 0x00, 0x7F, 0x18, 0x2E, 0xF9, 0x2F, 0x1C, 0x7A, 0x04, + 0xCD, 0x1F, 0xBA, 0x0D, 0x95, 0x11, 0x2B, 0x02, 0x93, 0x0D, 0x5A, 0x02, + 0xF1, 0x20, 0xB4, 0x10, 0x1C, 0x1E, 0x47, 0x0A, 0x97, 0x08, 0xC5, 0x01, + 0x13, 0x07, 0x81, 0x02, 0x6E, 0x1A, 0xB7, 0x06, 0xA0, 0x23, 0x50, 0x10, + 0xFB, 0x13, 0x22, 0x15, 0x72, 0x0C, 0x49, 0x15, 0xD5, 0x08, 0x76, 0x14, + 0x83, 0x03, 0x07, 0x14, 0xAF, 0x02, 0x43, 0x10, 0x27, 0x07, 0xC3, 0x12, + 0x25, 0x0B, 0x88, 0x14, 0x50, 0xF9, 0x56, 0x01, 0xA7, 0xEB, 0x4E, 0xFB, + 0x81, 0xEF, 0xC5, 0x01, 0x05, 0xE8, 0xEF, 0xF4, 0x81, 0xEE, 0x15, 0x01, + 0x0A, 0xF3, 0xE2, 0x0C, 0xB2, 0xE2, 0x99, 0xF6, 0xE5, 0xED, 0x07, 0xFB, + 0xDD, 0x0C, 0x1C, 0x18, 0xF2, 0x09, 0xF1, 0x0C, 0xE9, 0xFB, 0xDB, 0xF2, + 0xC2, 0x07, 0xBC, 0xFA, 0xCF, 0x10, 0xC0, 0xFE, 0xE2, 0x18, 0x87, 0x01, + 0x1D, 0x1D, 0xDF, 0x0B, 0x7A, 0x08, 0x62, 0x00, 0x12, 0x05, 0xF5, 0xFC, + 0x91, 0x14, 0xF2, 0x08, 0xC6, 0x06, 0x4A, 0x03, 0x0F, 0xFA, 0x0A, 0x00, + 0xA1, 0x04, 0x9C, 0x08, 0x1B, 0x01, 0xF1, 0x04, 0xFD, 0xFC, 0x01, 0x06, + 0x8B, 0x04, 0x39, 0x10, 0xB0, 0xFB, 0x04, 0x0A, 0xFF, 0xF5, 0xEB, 0x03, + 0x05, 0x08, 0x36, 0x12, 0x1B, 0x0E, 0x92, 0x19, 0x03, 0xFC, 0x8A, 0x0C, + 0xB8, 0xF2, 0x28, 0x06, 0xCA, 0xF7, 0x70, 0x0F, 0xED, 0xFB, 0x68, 0x14, + 0x34, 0xFB, 0x20, 0x11, 0x9A, 0xF2, 0xB3, 0x08, 0xE9, 0xFF, 0xC5, 0x0B, + 0x71, 0x11, 0xCD, 0x07, 0x43, 0x0D, 0xF6, 0xF5, 0x98, 0x1C, 0x2B, 0x04, + 0xDD, 0x33, 0x28, 0x1C, 0x46, 0x20, 0xED, 0x0B, 0xD7, 0x0C, 0xD4, 0xFD, + 0xB5, 0x17, 0x11, 0x0C, 0x95, 0x13, 0xAA, 0x0D, 0x07, 0x11, 0x29, 0x11, + 0xBF, 0x19, 0x91, 0x18, 0x3E, 0x08, 0x79, 0x00, 0x9F, 0xFD, 0xE2, 0xFC, + 0x07, 0x13, 0xF5, 0x23, 0x9E, 0x20, 0x20, 0x2B, 0x47, 0x27, 0x0F, 0x1E, + 0xFA, 0x29, 0xFD, 0x29, 0xDD, 0x2E, 0xEB, 0x39, 0xAF, 0x33, 0x87, 0x3D, + 0x86, 0x20, 0xFA, 0x35, 0x29, 0x06, 0x9B, 0x24, 0x73, 0x0D, 0xA5, 0x26, + 0xFA, 0x1D, 0x87, 0x2B, 0xAB, 0x19, 0xF9, 0x13, 0xDE, 0x1C, 0x4E, 0x02, + 0xA8, 0x23, 0xB2, 0x03, 0x61, 0x20, 0xBC, 0xFE, 0xFF, 0x28, 0xE0, 0xFE, + 0xDC, 0x2F, 0x03, 0x0A, 0x9B, 0x18, 0x52, 0x02, 0xAE, 0x05, 0x04, 0x01, + 0xED, 0x07, 0xBE, 0x15, 0x35, 0x07, 0xA8, 0x11, 0xBA, 0x05, 0x9B, 0xFB, + 0x30, 0x0E, 0x02, 0x03, 0x83, 0x0C, 0xE2, 0x0E, 0xA7, 0x07, 0xF6, 0x09, + 0x25, 0x09, 0x95, 0x09, 0xB9, 0x04, 0xDE, 0x0F, 0x7B, 0x05, 0xE1, 0x11, + 0xD1, 0x0B, 0xCB, 0x0E, 0x95, 0x0E, 0x80, 0x0A, 0x83, 0x12, 0x32, 0x0B, + 0x8C, 0x13, 0xAE, 0x14, 0x7B, 0xF5, 0x6D, 0x06, 0xC5, 0xD3, 0x34, 0xEF, + 0xB0, 0xD8, 0x0F, 0xF5, 0xE3, 0xD9, 0x45, 0xFB, 0x47, 0xE1, 0x58, 0x05, + 0xAD, 0xFC, 0xBD, 0x0C, 0x87, 0xF9, 0xFE, 0xEE, 0x63, 0xEE, 0xBD, 0xE1, + 0xD1, 0xF1, 0x5F, 0xFD, 0x2D, 0xF0, 0xC3, 0xFE, 0xCD, 0xEE, 0xF7, 0xEC, + 0x54, 0xFD, 0x77, 0xF3, 0x64, 0x11, 0xB5, 0xFD, 0xCA, 0x19, 0x24, 0xFE, + 0x70, 0x1B, 0x57, 0xF5, 0x8A, 0x0D, 0x84, 0xD8, 0xE7, 0x06, 0x1D, 0xCF, + 0xA3, 0x10, 0x20, 0xE4, 0x3D, 0x09, 0x2F, 0xE6, 0xDA, 0xFA, 0x04, 0xDD, + 0x84, 0xFC, 0xB8, 0xE4, 0x18, 0xF6, 0x72, 0xE7, 0x6E, 0xDE, 0xC3, 0xE4, + 0xDA, 0xD8, 0x49, 0xED, 0x1A, 0xE3, 0x99, 0xEB, 0xE2, 0xDB, 0xC8, 0xE1, + 0xBE, 0xD4, 0xDB, 0xEE, 0x1E, 0xD8, 0xDC, 0xF1, 0x54, 0xD6, 0xCE, 0xD0, + 0xCB, 0xD9, 0x72, 0xC1, 0x5D, 0xE7, 0x17, 0xD5, 0x54, 0xEA, 0x8D, 0xE2, + 0xEC, 0xE2, 0x87, 0xE1, 0x1B, 0xDD, 0x0D, 0xD4, 0xE9, 0xD4, 0x31, 0xC1, + 0x32, 0xD2, 0xC6, 0xC4, 0xD2, 0xCC, 0x7D, 0xCD, 0x67, 0xCB, 0x99, 0xCD, + 0xE9, 0xD9, 0xAA, 0xDD, 0x23, 0xCD, 0x20, 0xDD, 0x4E, 0xA9, 0x9D, 0xC0, + 0xE8, 0xAF, 0x97, 0xC7, 0xCD, 0xBD, 0xE3, 0xCF, 0x63, 0xC2, 0x5C, 0xCB, + 0x86, 0xDA, 0x62, 0xDB, 0x59, 0xDA, 0x57, 0xD5, 0x64, 0xC7, 0x26, 0xC5, + 0x0D, 0xCA, 0xED, 0xD8, 0x84, 0xC8, 0x69, 0xE2, 0x09, 0xB8, 0x8A, 0xCF, + 0x4D, 0xBA, 0x09, 0xD0, 0xB8, 0xD0, 0x00, 0xE0, 0x79, 0xDF, 0x9B, 0xE2, + 0xAA, 0xE0, 0x77, 0xD8, 0xD0, 0xDA, 0xD2, 0xC8, 0xC4, 0xD9, 0xF8, 0xC4, + 0xC1, 0xE2, 0x25, 0xD5, 0x4A, 0xE1, 0xCA, 0xDF, 0xF0, 0xD5, 0x49, 0xDD, + 0xCD, 0xD3, 0x78, 0xD5, 0x7F, 0xD5, 0x65, 0xCC, 0xB4, 0xD3, 0xE3, 0xD0, + 0xE8, 0xDC, 0xB2, 0xE5, 0x78, 0xEF, 0x2A, 0xE8, 0xC8, 0xFB, 0x0B, 0xDC, + 0x53, 0x0A, 0xF1, 0xEA, 0xA7, 0x13, 0x46, 0xF1, 0x71, 0x0C, 0xF2, 0xDC, + 0x80, 0x0A, 0x60, 0xD6, 0x53, 0x17, 0x41, 0xE9, 0xED, 0x15, 0x54, 0xFD, + 0xF9, 0x01, 0x40, 0x06, 0x3E, 0xF8, 0xE2, 0x02, 0x9C, 0xF4, 0xDD, 0xEE, + 0xEF, 0xF0, 0x31, 0xED, 0xFB, 0xEC, 0xC5, 0xFD, 0xA3, 0xF0, 0x50, 0x09, + 0x41, 0x10, 0x56, 0x19, 0x46, 0x26, 0xFD, 0x1A, 0x50, 0x0E, 0x3F, 0x05, + 0x37, 0x05, 0x10, 0x0E, 0x98, 0x0F, 0x5A, 0x20, 0x3A, 0x12, 0x1C, 0x19, + 0xC0, 0x1A, 0x92, 0x16, 0x8F, 0x0D, 0xD0, 0x09, 0x2D, 0xEF, 0xF6, 0xF1, + 0x80, 0xF7, 0x11, 0xFD, 0xF7, 0x07, 0x04, 0x0A, 0x88, 0xFA, 0xD6, 0xFD, + 0x87, 0xF8, 0x45, 0x0A, 0x05, 0x0A, 0x15, 0x23, 0xE7, 0x19, 0x08, 0x21, + 0xB4, 0x28, 0x4A, 0x1C, 0xC7, 0x1F, 0x2D, 0x1C, 0xAB, 0x11, 0xC8, 0x17, + 0x3E, 0x22, 0xB9, 0x1C, 0xD1, 0x1C, 0x12, 0x14, 0xD1, 0xFC, 0x03, 0xFF, + 0x44, 0xF2, 0x11, 0x00, 0xB6, 0xEE, 0xB0, 0x04, 0xD4, 0xF3, 0x1F, 0x05, + 0xCC, 0x08, 0x86, 0x08, 0xB8, 0x12, 0x84, 0x01, 0xF8, 0x12, 0x62, 0xF9, + 0x7E, 0x1A, 0xAA, 0x04, 0xF8, 0x15, 0x73, 0x06, 0x7B, 0x00, 0xDA, 0xF5, + 0x41, 0xF9, 0xFB, 0xF0, 0xFB, 0xFA, 0xA9, 0xEF, 0xAD, 0xF7, 0x08, 0xEF, + 0xC5, 0xF1, 0x2D, 0xF6, 0x1E, 0xEB, 0xD7, 0xF6, 0x08, 0xE9, 0x59, 0xF2, + 0xA4, 0xED, 0xB3, 0xF9, 0xFA, 0xF6, 0xB2, 0xFC, 0xA0, 0x08, 0xED, 0x04, + 0xDA, 0x19, 0x2D, 0x1C, 0x37, 0x1E, 0xE0, 0x21, 0xF2, 0x11, 0xE4, 0x0D, + 0x0E, 0x09, 0x4B, 0x06, 0x52, 0x05, 0x9A, 0x08, 0x39, 0x03, 0xC6, 0x09, + 0x73, 0x04, 0x7A, 0x12, 0x16, 0xF1, 0xDE, 0xFE, 0x1D, 0xDD, 0xC7, 0xE8, + 0x27, 0xEE, 0xEB, 0x06, 0x1B, 0x02, 0x37, 0x21, 0xA3, 0xFB, 0x4B, 0x10, + 0xA8, 0x01, 0x27, 0x13, 0x95, 0x1B, 0xF0, 0x2E, 0x3D, 0x24, 0xA5, 0x33, + 0x8C, 0x20, 0xCE, 0x2F, 0x11, 0x16, 0xAB, 0x28, 0x82, 0x12, 0x65, 0x1B, + 0xA7, 0x24, 0x98, 0x1F, 0x4F, 0x25, 0xC9, 0x1E, 0xCA, 0x14, 0xC4, 0x11, + 0x95, 0x0E, 0x19, 0x11, 0xB6, 0x03, 0x7A, 0x0C, 0xD4, 0xFF, 0x9E, 0x09, + 0xCE, 0x12, 0x6A, 0x16, 0x19, 0x22, 0x07, 0x18, 0xA3, 0x25, 0x9A, 0x09, + 0x93, 0x34, 0x90, 0x0E, 0x25, 0x38, 0x26, 0x14, 0x1F, 0x25, 0xEB, 0x05, + 0x60, 0x23, 0xA9, 0x09, 0xC0, 0x20, 0x76, 0x0F, 0x20, 0x18, 0x2B, 0x11, + 0xBF, 0x17, 0x9B, 0x1B, 0xC7, 0x0F, 0x5F, 0x1E, 0xEF, 0x08, 0x51, 0x17, + 0xBE, 0x15, 0x73, 0x17, 0x69, 0x1C, 0xF5, 0x14, 0x2F, 0x18, 0x13, 0x18, + 0xED, 0x21, 0x73, 0x2D, 0x8D, 0x21, 0xD2, 0x2F, 0x06, 0x10, 0xB0, 0x1C, + 0x3B, 0x12, 0x72, 0x1E, 0x30, 0x16, 0x45, 0x1F, 0xFF, 0x0F, 0xB6, 0x13, + 0xBE, 0x17, 0x85, 0x16, 0xB7, 0x10, 0x70, 0x06, 0xB2, 0xF8, 0xF0, 0xE9, + 0x34, 0x06, 0xCB, 0xF9, 0x02, 0x27, 0xD5, 0x1A, 0x75, 0x23, 0x62, 0x1A, + 0xCA, 0x26, 0xA7, 0x27, 0xEE, 0x44, 0x51, 0x40, 0x2B, 0x4D, 0x78, 0x38, + 0x4E, 0x3B, 0xEA, 0x32, 0xB1, 0x1B, 0xF2, 0x30, 0x64, 0x03, 0x07, 0x25, + 0x8E, 0x0F, 0x2F, 0x2E, 0xB6, 0x1C, 0x1F, 0x35, 0xDE, 0x0F, 0x58, 0x1E, + 0xEF, 0x04, 0x4D, 0x12, 0x80, 0x03, 0xA3, 0x11, 0x42, 0x0D, 0x6E, 0x07, + 0x81, 0x2A, 0xD6, 0x0F, 0x68, 0x3C, 0xBB, 0x20, 0xA3, 0x33, 0x1C, 0x16, + 0xF1, 0x33, 0x0C, 0x10, 0x73, 0x2C, 0x67, 0x16, 0x17, 0x0B, 0x64, 0x0F, + 0x13, 0xFD, 0xE7, 0x0D, 0x43, 0x07, 0x64, 0x11, 0xD4, 0x0C, 0x11, 0x0D, + 0xFE, 0x09, 0xBD, 0x0E, 0x3A, 0x04, 0x33, 0x18, 0x14, 0x04, 0x4D, 0x15, + 0x23, 0x11, 0x8A, 0x10, 0x3E, 0x16, 0x38, 0x13, 0x86, 0x07, 0xA5, 0x13, + 0x02, 0x02, 0x0E, 0x17, 0xC8, 0x09, 0x1F, 0x14, 0x2E, 0x06, 0x63, 0x01, + 0xE6, 0xFD, 0xB5, 0xF7, 0x80, 0xF7, 0x3B, 0xFA, 0x22, 0xF1, 0xBF, 0xF6, + 0x43, 0xF4, 0x66, 0xFA, 0x7E, 0xED, 0x8B, 0xFA, 0x73, 0xD5, 0x15, 0xEC, + 0x2D, 0xDD, 0x7E, 0xF1, 0x9B, 0x01, 0x9F, 0x03, 0x21, 0xFC, 0xD5, 0xF8, + 0xDD, 0xDD, 0x4F, 0xF0, 0x0B, 0xDC, 0x75, 0x03, 0xAD, 0xE5, 0xBF, 0x0D, + 0xD5, 0xE2, 0x63, 0x00, 0x38, 0xE1, 0xC2, 0xEE, 0x5D, 0xDA, 0x87, 0xE4, + 0xCD, 0xCF, 0xE6, 0xDF, 0xB7, 0xD6, 0x8A, 0xD6, 0x95, 0xDB, 0x4D, 0xC1, + 0x56, 0xDA, 0xAE, 0xBC, 0x2E, 0xEC, 0xF9, 0xCE, 0x1D, 0xFB, 0xD6, 0xD5, + 0xA3, 0xFC, 0xB0, 0xD8, 0xB1, 0x00, 0x82, 0xE0, 0xB4, 0xF2, 0xD1, 0xD7, + 0xEE, 0xDB, 0x7F, 0xD2, 0x90, 0xD9, 0x23, 0xDD, 0xF4, 0xCF, 0xD6, 0xD2, + 0x8E, 0xBC, 0x94, 0xC5, 0x9E, 0xC1, 0x0D, 0xD3, 0x39, 0xC9, 0x51, 0xDA, + 0x6F, 0xC4, 0x76, 0xD3, 0x85, 0xD4, 0x6E, 0xDA, 0x9B, 0xE6, 0x2F, 0xDF, + 0x89, 0xE0, 0xD4, 0xD5, 0xF9, 0xE0, 0x6D, 0xD7, 0x61, 0xE2, 0x7A, 0xD3, + 0xC9, 0xD6, 0x73, 0xCA, 0xDE, 0xD7, 0x79, 0xD5, 0x9B, 0xD8, 0x9B, 0xD6, + 0xC2, 0xCB, 0x77, 0xC3, 0xAB, 0xC6, 0x55, 0xC2, 0x54, 0xBE, 0x23, 0xC5, + 0x2C, 0xC6, 0xF8, 0xCD, 0x32, 0xE3, 0xFB, 0xDC, 0x62, 0xE8, 0x8A, 0xD2, + 0xDC, 0xE3, 0xC5, 0xCA, 0x59, 0xF7, 0x9A, 0xE4, 0x49, 0xF8, 0x74, 0xF1, + 0x6B, 0xDD, 0x80, 0xE3, 0x99, 0xE2, 0x20, 0xED, 0x67, 0xFA, 0xBE, 0x06, + 0x98, 0x00, 0x79, 0x0F, 0x2E, 0x08, 0x11, 0x0E, 0xD4, 0x03, 0x92, 0x05, + 0x05, 0xEB, 0x3D, 0xFF, 0x2A, 0xE6, 0xD3, 0x0C, 0xDD, 0xF1, 0x83, 0x14, + 0x6C, 0xFA, 0xF3, 0x0E, 0x9F, 0x08, 0xEC, 0x10, 0x07, 0x10, 0xF6, 0x0E, + 0x99, 0x09, 0xA9, 0x04, 0x92, 0x11, 0xF3, 0x01, 0x53, 0x13, 0x74, 0xFD, + 0x14, 0xFF, 0xCA, 0xFA, 0x14, 0xFA, 0xCD, 0x0A, 0x66, 0x02, 0xBB, 0x11, + 0x99, 0x01, 0xD7, 0x03, 0x6A, 0x0A, 0x8F, 0x01, 0x5E, 0x1D, 0xB0, 0x0E, + 0xA0, 0x23, 0x9A, 0x11, 0xDB, 0x2C, 0xFC, 0x11, 0xE2, 0x34, 0x16, 0x1C, + 0x1E, 0x27, 0x23, 0x20, 0x40, 0x1C, 0xC5, 0x1E, 0x15, 0x20, 0xF2, 0x19, + 0xEB, 0x1A, 0x24, 0x12, 0x56, 0x15, 0xAD, 0x15, 0xEB, 0x0C, 0xAB, 0x14, + 0x67, 0xF2, 0x97, 0x03, 0x47, 0xEC, 0x67, 0x03, 0x4B, 0xF8, 0x1E, 0x0E, + 0x25, 0xFE, 0x04, 0x19, 0xD2, 0x0E, 0xAB, 0x2F, 0xC7, 0x19, 0x12, 0x31, + 0x7F, 0x0F, 0xBA, 0x17, 0xC2, 0x19, 0xD7, 0x20, 0x5E, 0x2C, 0x8F, 0x3A, + 0x8F, 0x15, 0x8E, 0x23, 0x90, 0x01, 0x9C, 0x0A, 0x26, 0x16, 0xD1, 0x19, + 0xC5, 0x1B, 0x2B, 0x1B, 0x58, 0x0D, 0x6B, 0x08, 0xBB, 0x0B, 0x35, 0xFF, + 0xE8, 0x03, 0x0D, 0xF5, 0x99, 0xFA, 0xEB, 0xF0, 0xEE, 0x00, 0x3D, 0xFA, + 0x2D, 0x03, 0xB6, 0xFA, 0xAE, 0x07, 0x58, 0xFA, 0x43, 0x18, 0x93, 0x04, + 0x6A, 0x1C, 0xC5, 0x06, 0xA1, 0x1E, 0x5D, 0x06, 0x39, 0x1B, 0x4E, 0x04, + 0xA1, 0x07, 0xC6, 0xFD, 0x7E, 0xF8, 0xF3, 0x02, 0xBB, 0xF0, 0xC0, 0x09, + 0xDD, 0xE5, 0x08, 0x01, 0x1A, 0xE9, 0xF3, 0x00, 0x6E, 0xF9, 0x8F, 0x0E, + 0x24, 0xF4, 0xA5, 0x0C, 0xF2, 0xEA, 0x0E, 0x02, 0xA7, 0xF8, 0xE3, 0x00, + 0xF2, 0xFA, 0x45, 0xF9, 0x8D, 0xF4, 0xF4, 0xF5, 0x54, 0xFB, 0xCE, 0x00, + 0xA7, 0xF9, 0xEC, 0xFD, 0x69, 0xFB, 0x46, 0xFA, 0x54, 0xFB, 0xAA, 0xFD, + 0x2C, 0xE5, 0x30, 0xF4, 0xB8, 0xCF, 0x7C, 0xE4, 0x50, 0xD3, 0xA8, 0xE3, + 0x46, 0xE1, 0x16, 0xE7, 0xDB, 0xF6, 0xB4, 0xF4, 0xE2, 0x0C, 0x6F, 0x00, + 0x7E, 0x11, 0xC2, 0xF2, 0x7C, 0x1D, 0x39, 0xEF, 0xA1, 0x39, 0x8B, 0x0C, + 0x67, 0x31, 0xEB, 0x11, 0xC4, 0x13, 0xC8, 0xFF, 0xE6, 0x18, 0xE1, 0x07, + 0xC2, 0x20, 0x87, 0x0F, 0xBC, 0x15, 0x64, 0x07, 0x6C, 0x0A, 0xF0, 0x06, + 0x7E, 0xFD, 0x70, 0x08, 0x09, 0xFF, 0xC0, 0x0A, 0xCA, 0x14, 0xBF, 0x1A, + 0x14, 0x1D, 0x01, 0x1E, 0x5D, 0x19, 0xD2, 0x15, 0xAD, 0x28, 0x46, 0x22, + 0xFA, 0x32, 0x96, 0x2B, 0x97, 0x26, 0xDB, 0x26, 0x21, 0x24, 0xA0, 0x2B, + 0xAE, 0x13, 0x42, 0x1E, 0x69, 0xFA, 0x35, 0x08, 0xDD, 0x03, 0x53, 0x0E, + 0x18, 0x0D, 0x08, 0x0C, 0x3B, 0x0A, 0x3E, 0xFC, 0xD2, 0x1C, 0xAE, 0x03, + 0x36, 0x32, 0xA7, 0x0F, 0x15, 0x30, 0xE7, 0x0B, 0x4D, 0x2D, 0x2D, 0x14, + 0x30, 0x2D, 0x89, 0x22, 0x9D, 0x1E, 0xA0, 0x1C, 0x30, 0x19, 0x66, 0x18, + 0xCD, 0x17, 0xA8, 0x13, 0x1A, 0x0C, 0x1A, 0x0A, 0x5C, 0x04, 0x5B, 0x0D, + 0x45, 0xFB, 0xFB, 0x0F, 0x67, 0xEA, 0xEB, 0x0D, 0x8B, 0xEB, 0x4E, 0x1B, + 0x0E, 0xF4, 0xE5, 0x22, 0x9F, 0xFC, 0xD7, 0x22, 0xEE, 0x13, 0x6E, 0x28, + 0x9B, 0x10, 0xC9, 0x15, 0xF6, 0xFD, 0x2A, 0x03, 0x12, 0x0B, 0x72, 0x1A, + 0xA1, 0x19, 0x7F, 0x27, 0x23, 0x0A, 0x8F, 0x09, 0xCF, 0x05, 0x76, 0xFE, + 0x49, 0x13, 0x93, 0x0C, 0xBC, 0x02, 0x3D, 0x05, 0x13, 0xF2, 0x22, 0xFA, + 0x31, 0xFC, 0x76, 0xFB, 0x97, 0x04, 0x8E, 0xFC, 0xC4, 0x14, 0xC6, 0x0F, + 0x27, 0x29, 0x19, 0x22, 0x0E, 0x23, 0x9B, 0x14, 0xA8, 0x1A, 0x66, 0x0D, + 0x6C, 0x1D, 0xF4, 0x12, 0x06, 0x17, 0x11, 0x0C, 0x5D, 0x15, 0xAE, 0x02, + 0xE0, 0x12, 0x92, 0xF4, 0x9E, 0x06, 0xC5, 0xE5, 0x6F, 0xFC, 0xF7, 0xEA, + 0x1E, 0xF4, 0x9B, 0xF5, 0xA0, 0xE8, 0x8A, 0xED, 0x57, 0xF2, 0x76, 0xEB, + 0x60, 0x0F, 0xD6, 0xF6, 0xF0, 0x16, 0xE5, 0x01, 0x25, 0x0B, 0x38, 0x0F, + 0x2A, 0xFE, 0x50, 0x12, 0x20, 0xED, 0x59, 0x03, 0xB7, 0xE2, 0xE2, 0xF7, + 0x78, 0xD7, 0x3C, 0xEC, 0x7C, 0xC4, 0x9E, 0xD9, 0x84, 0xC3, 0x2F, 0xD8, + 0x6C, 0xC8, 0xC0, 0xD6, 0x46, 0xC7, 0xD5, 0xCB, 0x83, 0xD3, 0x38, 0xC9, + 0x5E, 0xE4, 0xB4, 0xC2, 0xE5, 0xE6, 0x62, 0xBB, 0x28, 0xED, 0xB8, 0xCB, + 0x6B, 0xEF, 0x4E, 0xD5, 0xAB, 0xDA, 0x31, 0xC0, 0x39, 0xD8, 0x04, 0xBF, + 0x9F, 0xEE, 0x02, 0xD4, 0x5E, 0xE3, 0xD7, 0xC7, 0xCA, 0xC8, 0xC5, 0xB5, + 0xF9, 0xC7, 0x94, 0xC2, 0xE1, 0xC4, 0x5B, 0xD6, 0xB8, 0xB6, 0x71, 0xDA, + 0x76, 0xBC, 0xCF, 0xD7, 0xD0, 0xCD, 0xDA, 0xD6, 0xF9, 0xD8, 0xAB, 0xE0, + 0x7A, 0xE1, 0x4D, 0xF2, 0x84, 0xDA, 0x78, 0xEF, 0x0E, 0xCB, 0x93, 0xDC, + 0x52, 0xC4, 0xCD, 0xCF, 0x57, 0xBB, 0x40, 0xD0, 0x8C, 0xBC, 0x2B, 0xDC, + 0x3E, 0xCA, 0xC0, 0xD6, 0xCA, 0xC9, 0x0E, 0xB6, 0x0B, 0xCA, 0xBD, 0xAF, + 0x6C, 0xCF, 0xC9, 0xC4, 0x44, 0xC5, 0xDE, 0xC3, 0xA5, 0xCA, 0x6D, 0xC1, + 0x96, 0xE8, 0x11, 0xD1, 0x9C, 0xF5, 0xB9, 0xE3, 0x92, 0xF5, 0x49, 0xF5, + 0xF9, 0xF5, 0x70, 0xF4, 0xEE, 0xEB, 0xD7, 0xE1, 0x9A, 0xE4, 0x34, 0xE1, + 0xD8, 0xED, 0xCB, 0xEF, 0x5B, 0xE7, 0xCC, 0xE1, 0x90, 0xE2, 0xCF, 0xD3, + 0x8D, 0xF2, 0x91, 0xE0, 0x1E, 0xF4, 0x98, 0xED, 0x89, 0xF7, 0x43, 0xFF, + 0x56, 0x0A, 0xB9, 0x0F, 0xD6, 0x0B, 0x6B, 0x0A, 0x74, 0x03, 0x01, 0x0C, + 0xA3, 0x02, 0x90, 0x18, 0x6C, 0xF6, 0xBF, 0x0A, 0x5B, 0xED, 0x16, 0xF7, + 0x8D, 0x01, 0x48, 0x02, 0xAD, 0x0B, 0x9D, 0x14, 0x20, 0xFB, 0x08, 0x14, + 0xF3, 0xFB, 0x68, 0x0F, 0x26, 0x11, 0x5D, 0x0F, 0x1D, 0x20, 0x9B, 0x10, + 0x42, 0x27, 0x32, 0x17, 0x4D, 0x27, 0x99, 0x1B, 0xD5, 0x29, 0x19, 0x1D, + 0x83, 0x38, 0x6A, 0x25, 0x2C, 0x35, 0xAA, 0x22, 0x87, 0x1C, 0x54, 0x11, + 0xF0, 0x11, 0x27, 0x08, 0x51, 0x0E, 0x75, 0x07, 0x62, 0x00, 0x31, 0x09, + 0xF8, 0xFD, 0x68, 0x12, 0x0A, 0x04, 0x1C, 0x13, 0x6B, 0x02, 0xE4, 0x09, + 0xDD, 0x09, 0x1C, 0x11, 0x53, 0x0A, 0x9A, 0x1C, 0xD1, 0xFC, 0x3F, 0x1B, + 0x03, 0x07, 0xBA, 0x20, 0xD0, 0x17, 0xD3, 0x2B, 0x3D, 0x12, 0x30, 0x29, + 0x35, 0xFF, 0xD3, 0x1A, 0x93, 0xF3, 0xF6, 0x14, 0xEE, 0xF0, 0x59, 0x18, + 0xF2, 0xF4, 0xE0, 0x18, 0xEA, 0xF2, 0xB6, 0x06, 0xE6, 0xE6, 0x42, 0xED, + 0x87, 0xEC, 0xD5, 0xE3, 0x91, 0xF9, 0x5B, 0xDF, 0x95, 0x00, 0xED, 0xDF, + 0x9A, 0x0D, 0xF5, 0xEA, 0x72, 0x14, 0xAE, 0xEC, 0x55, 0x10, 0xB1, 0xE9, + 0x5C, 0x15, 0x49, 0xF6, 0x7F, 0x0A, 0xD2, 0xF1, 0x79, 0xF0, 0xAF, 0xD8, + 0x19, 0xF6, 0x6F, 0xDB, 0xDB, 0x0D, 0x77, 0xFE, 0xD6, 0x01, 0x74, 0x04, + 0xA3, 0xF2, 0x4E, 0xF7, 0x10, 0x0A, 0x64, 0x01, 0x53, 0x20, 0x13, 0x0D, + 0xA7, 0x23, 0xE1, 0x15, 0x7E, 0x1D, 0x46, 0x1C, 0x57, 0x0C, 0x70, 0x16, + 0xFD, 0x02, 0x4F, 0x11, 0xC4, 0x04, 0x92, 0x13, 0x7E, 0xFC, 0x81, 0x0D, + 0x5D, 0xF3, 0xF5, 0xFF, 0xCB, 0xFA, 0x95, 0x00, 0xAC, 0x00, 0x28, 0x08, + 0x79, 0x01, 0xF4, 0x14, 0xB2, 0x06, 0x91, 0x22, 0x42, 0x09, 0x9C, 0x17, + 0x29, 0x12, 0xDF, 0x0D, 0x8B, 0x1B, 0xA2, 0x1B, 0xC6, 0x0B, 0xD1, 0x22, + 0xB6, 0xF9, 0xB2, 0x21, 0x83, 0x00, 0x22, 0x22, 0x5C, 0x0D, 0xA6, 0x18, + 0x9B, 0x0E, 0xA0, 0x0F, 0xCF, 0x04, 0x5B, 0x0C, 0x5D, 0x04, 0x50, 0x0C, + 0xEA, 0x14, 0x66, 0x11, 0x65, 0x25, 0xA5, 0x18, 0x0D, 0x21, 0x58, 0x16, + 0xB9, 0x17, 0x1D, 0x11, 0x3A, 0x1E, 0xAF, 0x15, 0x84, 0x1F, 0xF8, 0x14, + 0x10, 0x12, 0x2D, 0x11, 0x88, 0x0B, 0x02, 0x15, 0x0B, 0x0F, 0xF4, 0x0F, + 0x89, 0x1A, 0xCF, 0x0E, 0x67, 0x27, 0xCC, 0x16, 0x32, 0x1A, 0xD7, 0x10, + 0x2F, 0x04, 0xBA, 0x08, 0xF9, 0x10, 0xCA, 0x18, 0x82, 0x22, 0xC5, 0x2C, + 0x5F, 0x11, 0x1D, 0x22, 0x4C, 0x0D, 0xD9, 0x1B, 0x13, 0x2C, 0x4E, 0x2D, + 0x7E, 0x41, 0xCF, 0x2D, 0x98, 0x45, 0x69, 0x21, 0xAF, 0x40, 0x07, 0x1F, + 0x21, 0x34, 0xA3, 0x1B, 0x59, 0x33, 0xF8, 0x18, 0x06, 0x3C, 0x94, 0x1C, + 0x66, 0x3A, 0x6D, 0x1D, 0xDC, 0x36, 0x09, 0x1E, 0x8E, 0x37, 0x52, 0x22, + 0xEC, 0x2F, 0x7E, 0x2A, 0xEA, 0x25, 0xC9, 0x38, 0xD6, 0x18, 0x98, 0x3D, + 0x53, 0x0C, 0x3A, 0x35, 0x80, 0x16, 0x03, 0x33, 0x30, 0x1E, 0x84, 0x2F, + 0x88, 0x0F, 0x5D, 0x24, 0x15, 0x0C, 0x98, 0x29, 0x33, 0x16, 0x87, 0x34, + 0x7A, 0x18, 0xC5, 0x2E, 0x86, 0x11, 0xAC, 0x25, 0xB3, 0x0E, 0x8E, 0x26, + 0xFE, 0x10, 0x2D, 0x28, 0x62, 0x17, 0xA1, 0x26, 0xEB, 0x1F, 0xE0, 0x20, + 0xC6, 0x1B, 0xB1, 0x0F, 0x83, 0x19, 0xDE, 0x03, 0x5F, 0x18, 0xC7, 0x01, + 0xAC, 0x02, 0xFF, 0xFD, 0x7D, 0xEE, 0xEA, 0xFB, 0x1F, 0xF7, 0xDD, 0xF9, + 0xE2, 0x0A, 0xC7, 0xFA, 0x15, 0x18, 0xD3, 0x05, 0x05, 0x14, 0x1B, 0x03, + 0x9D, 0xFD, 0xF8, 0xEF, 0x99, 0xF6, 0x74, 0xF4, 0x42, 0x0A, 0x55, 0x0F, + 0xD3, 0x0C, 0x49, 0x12, 0x04, 0xFD, 0xA6, 0x04, 0x4E, 0x06, 0x86, 0x03, + 0xB5, 0x1A, 0xB4, 0xFF, 0xDF, 0x19, 0x6B, 0xF1, 0x96, 0x0D, 0x9A, 0xEA, + 0x14, 0xFE, 0xF6, 0xE9, 0xED, 0xF4, 0x7C, 0xE8, 0x06, 0xF7, 0x53, 0xEA, + 0x27, 0xEB, 0x30, 0xE7, 0xEF, 0xDA, 0x38, 0xE8, 0x6C, 0xDD, 0x67, 0xF3, + 0xF6, 0xE1, 0xAF, 0xF6, 0x7B, 0xE7, 0x44, 0xF8, 0xE0, 0xE9, 0x7A, 0xF6, + 0x3D, 0xDB, 0xE8, 0xEB, 0x42, 0xD0, 0x6D, 0xE8, 0x46, 0xD9, 0x51, 0xF1, + 0x42, 0xE0, 0x46, 0xF5, 0xCC, 0xE5, 0x86, 0xF1, 0xEE, 0xF2, 0x15, 0xEE, + 0x35, 0xEE, 0x09, 0xE1, 0xD6, 0xDD, 0x81, 0xCF, 0x65, 0xD3, 0x12, 0xC7, + 0x1F, 0xC9, 0x33, 0xC8, 0x6E, 0xCB, 0xAA, 0xCF, 0x7D, 0xDD, 0xBE, 0xD8, + 0xAB, 0xD8, 0x81, 0xD2, 0x9B, 0xCB, 0x29, 0xCD, 0xD3, 0xD0, 0x07, 0xD5, + 0x5A, 0xCC, 0x75, 0xD5, 0xFF, 0xBC, 0x54, 0xD0, 0x90, 0xC4, 0xDC, 0xD1, + 0x1D, 0xD2, 0x29, 0xCF, 0xBD, 0xCA, 0x3D, 0xCB, 0x7B, 0xC8, 0xA1, 0xD2, + 0xC3, 0xC7, 0xC4, 0xCB, 0x26, 0xC5, 0xCE, 0xBE, 0x82, 0xDA, 0x33, 0xCA, + 0x28, 0xEC, 0xF1, 0xD2, 0xFD, 0xDB, 0x2E, 0xC5, 0x4C, 0xCD, 0x11, 0xBC, + 0x94, 0xD8, 0xCE, 0xC5, 0x07, 0xE5, 0x99, 0xD1, 0x9D, 0xE6, 0x1F, 0xDA, + 0xF7, 0xDD, 0x63, 0xDB, 0x10, 0xD9, 0x64, 0xD7, 0x79, 0xE3, 0xEF, 0xDD, + 0xAD, 0xE0, 0xFA, 0xE4, 0xDF, 0xD3, 0xFF, 0xE5, 0x02, 0xE3, 0xAA, 0xEF, + 0xB9, 0xFD, 0x12, 0xFA, 0xAE, 0xFC, 0x23, 0xF7, 0x23, 0xEE, 0x18, 0xFA, + 0xC1, 0xE5, 0x37, 0x01, 0x17, 0xE1, 0x9C, 0xF9, 0x29, 0xE7, 0x5D, 0xF8, + 0xAD, 0xEF, 0xEF, 0x04, 0x9B, 0xED, 0xFE, 0x07, 0xC6, 0xF3, 0xF6, 0x04, + 0xF1, 0xFB, 0x73, 0xFD, 0x5D, 0xF7, 0x0D, 0xF9, 0x9E, 0xEE, 0x6A, 0x00, + 0x14, 0xEB, 0xB4, 0x03, 0xA2, 0xF1, 0x9F, 0x00, 0xE5, 0xF7, 0xC3, 0xFC, + 0x5B, 0xFD, 0x30, 0xFE, 0x22, 0xFD, 0xFC, 0xFB, 0xCF, 0x0B, 0x95, 0x04, + 0x86, 0x24, 0x20, 0x12, 0x34, 0x21, 0xB4, 0x0D, 0xC7, 0x17, 0x73, 0x0D, + 0x85, 0x1E, 0x28, 0x11, 0x66, 0x1E, 0x88, 0x03, 0xE2, 0x18, 0xE7, 0xF7, + 0x4C, 0x14, 0x24, 0xF8, 0xE9, 0x07, 0xB6, 0xF6, 0x0D, 0x06, 0x47, 0xF9, + 0xDD, 0x17, 0xD2, 0x0A, 0x88, 0x18, 0x6E, 0x16, 0x6C, 0x07, 0x0A, 0x10, + 0x07, 0x09, 0xB4, 0x10, 0x09, 0x13, 0x48, 0x18, 0x03, 0x14, 0x4C, 0x17, + 0xB8, 0x10, 0xD5, 0x18, 0x0F, 0x0D, 0xBF, 0x1A, 0x79, 0x19, 0xAC, 0x17, + 0xB6, 0x29, 0xC0, 0x1A, 0x8A, 0x1D, 0x85, 0x18, 0xEF, 0x11, 0x0E, 0x0F, + 0x84, 0x1A, 0x06, 0x0E, 0x53, 0x1C, 0xF0, 0x0F, 0x9B, 0x13, 0xC8, 0x0B, + 0x5A, 0x0A, 0x66, 0x09, 0xA5, 0xFD, 0xDF, 0x08, 0xE8, 0xF0, 0xF4, 0x01, + 0x6A, 0xF1, 0x9E, 0xFF, 0xF6, 0xF2, 0xD1, 0x02, 0x48, 0xF0, 0xCD, 0x02, + 0xC9, 0xFA, 0x4D, 0x02, 0x87, 0x05, 0x02, 0x01, 0x55, 0x05, 0x19, 0x08, + 0x38, 0xFF, 0x3E, 0x14, 0xCA, 0xF6, 0x32, 0x15, 0xA7, 0xF9, 0xFE, 0x0C, + 0x42, 0x04, 0x99, 0x05, 0xC9, 0xFB, 0x5E, 0x00, 0xBB, 0xE8, 0x6F, 0xFD, + 0xF4, 0xEE, 0xC7, 0x04, 0xD6, 0xFE, 0xB8, 0x04, 0xC9, 0xFF, 0xCF, 0xF2, + 0xE6, 0xFC, 0x4F, 0xEA, 0x8F, 0xF7, 0x7D, 0xEC, 0x0F, 0xEE, 0x2B, 0xE2, + 0x1A, 0xF2, 0xE0, 0xDC, 0xFF, 0xF4, 0x14, 0xE5, 0x2B, 0xEB, 0xBF, 0xE9, + 0x94, 0xF8, 0x04, 0xF5, 0x33, 0x1A, 0xBB, 0x04, 0xBF, 0x1B, 0x44, 0xFD, + 0x30, 0x01, 0xE3, 0xF2, 0x25, 0xF6, 0x85, 0x00, 0x7F, 0x06, 0x73, 0x10, + 0x04, 0x1A, 0x18, 0x16, 0x55, 0x1B, 0xEE, 0x1B, 0xCB, 0x18, 0xF1, 0x1E, + 0x8D, 0x22, 0xF9, 0x1D, 0x2D, 0x28, 0xC0, 0x17, 0x5A, 0x1B, 0x23, 0x05, + 0xAA, 0x10, 0xC4, 0x03, 0xD6, 0x11, 0x3D, 0x1E, 0x58, 0x12, 0x6A, 0x24, + 0x8B, 0x1A, 0xF3, 0x18, 0x1E, 0x1F, 0x55, 0x18, 0x56, 0x0E, 0x0F, 0x15, + 0x4B, 0x04, 0x82, 0x11, 0x8C, 0x0D, 0xC6, 0x18, 0x49, 0x14, 0x7A, 0x1B, + 0x76, 0x19, 0x1A, 0x1F, 0xEA, 0x1E, 0x09, 0x2A, 0x54, 0x21, 0x15, 0x29, + 0x08, 0x1E, 0x9B, 0x19, 0x47, 0x16, 0x48, 0x11, 0xC1, 0x14, 0x60, 0x12, + 0x84, 0x19, 0xA0, 0x0D, 0x0D, 0x1F, 0x73, 0x0F, 0xA1, 0x13, 0x8A, 0x10, + 0x62, 0x10, 0xCF, 0x17, 0xA4, 0x20, 0xE2, 0x23, 0xB4, 0x20, 0x8F, 0x1A, + 0x02, 0x1D, 0x42, 0x0E, 0x5D, 0x26, 0x0A, 0x0F, 0x6B, 0x24, 0x65, 0x0D, + 0x75, 0x16, 0xCB, 0x08, 0xCF, 0x14, 0x31, 0x10, 0xDA, 0x17, 0x20, 0x16, + 0x53, 0x14, 0xC3, 0x0F, 0xD0, 0x1E, 0x93, 0x15, 0x5F, 0x26, 0x35, 0x22, + 0xC4, 0x0A, 0xAF, 0x18, 0x64, 0xEF, 0xD0, 0x0D, 0x41, 0xF6, 0xDF, 0x11, + 0x9D, 0x07, 0x71, 0x15, 0xEF, 0x0E, 0xFC, 0x16, 0x57, 0x11, 0xE1, 0x19, + 0x1B, 0x15, 0x96, 0x16, 0x4F, 0x1C, 0xC0, 0x0D, 0x12, 0x20, 0x70, 0x00, + 0x9B, 0x1E, 0x21, 0xF7, 0x8D, 0x1C, 0x1D, 0x03, 0x76, 0x1C, 0xD5, 0x11, + 0xB2, 0x1A, 0xBC, 0x0C, 0x9A, 0x14, 0x8D, 0x0C, 0x9C, 0x0C, 0x1A, 0x18, + 0x47, 0x03, 0x4C, 0x14, 0xA7, 0xFF, 0x48, 0x0F, 0xA5, 0x0D, 0x57, 0x17, + 0x86, 0x13, 0x7F, 0x13, 0x26, 0x07, 0xA8, 0x10, 0xE3, 0xFC, 0x18, 0x19, + 0x0D, 0xFF, 0x13, 0x1B, 0xE1, 0x05, 0x84, 0x15, 0x29, 0x03, 0x83, 0x11, + 0xBC, 0xFD, 0x87, 0x13, 0xB4, 0xFB, 0xED, 0x0C, 0xED, 0xFB, 0x96, 0xFA, + 0xB1, 0xF9, 0xE2, 0xE8, 0x67, 0xFD, 0x35, 0xE9, 0xA1, 0x00, 0xB5, 0xF2, + 0xCD, 0xFD, 0x6C, 0xEE, 0x20, 0x02, 0xED, 0xE7, 0xD9, 0x07, 0xBE, 0xE8, + 0xB2, 0xFC, 0x73, 0xDE, 0xFB, 0xF3, 0x14, 0xD7, 0x92, 0xFC, 0xC0, 0xDD, + 0x90, 0xFA, 0x0E, 0xDB, 0x76, 0xE8, 0xB4, 0xD6, 0x51, 0xE1, 0xC3, 0xE1, + 0x89, 0xE0, 0x74, 0xE7, 0x46, 0xD3, 0xF8, 0xDD, 0xBE, 0xD2, 0x09, 0xDE, + 0x3D, 0xE8, 0x3E, 0xE8, 0xC9, 0xF0, 0x62, 0xE5, 0xC2, 0xE8, 0x68, 0xDA, + 0xDB, 0xE6, 0x4E, 0xD7, 0x5A, 0xE8, 0xB7, 0xDE, 0x68, 0xE6, 0x14, 0xE5, + 0xD3, 0xE5, 0xBA, 0xDF, 0xAB, 0xDE, 0x80, 0xDC, 0x3F, 0xD1, 0x54, 0xE4, + 0xC7, 0xC7, 0x93, 0xE1, 0xA8, 0xC0, 0x11, 0xD4, 0xCF, 0xB9, 0xF9, 0xD1, + 0xD3, 0xB8, 0x04, 0xDB, 0x38, 0xBC, 0xC4, 0xDE, 0xC2, 0xC0, 0x66, 0xDD, + 0x96, 0xBE, 0xD8, 0xDA, 0x4C, 0xB8, 0xA0, 0xD2, 0x70, 0xBE, 0x0B, 0xCB, + 0x73, 0xC9, 0x12, 0xC8, 0x42, 0xCF, 0x08, 0xC6, 0xB1, 0xCF, 0xB0, 0xC1, + 0x36, 0xD4, 0x9A, 0xC1, 0x1B, 0xDD, 0xAB, 0xC2, 0xE5, 0xE4, 0x9E, 0xBE, + 0xDB, 0xE8, 0xCF, 0xBD, 0xDE, 0xDF, 0x14, 0xC7, 0x4A, 0xD3, 0x43, 0xD2, + 0x81, 0xD2, 0x3A, 0xD1, 0x74, 0xD9, 0xE8, 0xCE, 0xDB, 0xDE, 0x86, 0xD4, + 0x74, 0xE3, 0x6A, 0xDC, 0x40, 0xE4, 0x06, 0xE3, 0x45, 0xE8, 0xA6, 0xE9, + 0x1E, 0xEE, 0x9F, 0xEF, 0xD1, 0xE5, 0x97, 0xEF, 0xEB, 0xDC, 0xD0, 0xEB, + 0x4D, 0xEB, 0xE4, 0xEE, 0x14, 0xFB, 0xEB, 0xF4, 0xC5, 0xFA, 0xB0, 0xF8, + 0xEF, 0xFC, 0x6C, 0xFE, 0x00, 0x03, 0xDC, 0x04, 0x37, 0x02, 0x9E, 0x04, + 0x66, 0x05, 0x30, 0xFE, 0x79, 0x0D, 0xEB, 0xFC, 0x36, 0x0B, 0x68, 0x02, + 0x1A, 0x09, 0xDB, 0x07, 0x3D, 0x12, 0xEF, 0x07, 0xDE, 0x18, 0x62, 0x03, + 0x71, 0x14, 0xCA, 0x07, 0x1C, 0x08, 0xB6, 0x0E, 0x81, 0x02, 0x1F, 0x13, + 0x09, 0x0C, 0x82, 0x21, 0x0A, 0x1D, 0x5F, 0x2D, 0x7E, 0x25, 0x17, 0x26, + 0xB4, 0x21, 0xF5, 0x1F, 0x00, 0x18, 0x3D, 0x1F, 0x34, 0x0B, 0x40, 0x15, + 0xB0, 0x02, 0x88, 0x11, 0x85, 0x01, 0x11, 0x1F, 0x4D, 0xFE, 0x10, 0x29, + 0xF6, 0xF7, 0x3B, 0x24, 0x3F, 0xFF, 0xA3, 0x23, 0x12, 0x09, 0xFD, 0x1A, + 0x4F, 0x07, 0xDA, 0x09, 0x42, 0xFC, 0x5A, 0x0D, 0x04, 0xF2, 0x05, 0x15, + 0x89, 0xF4, 0x15, 0x0C, 0x08, 0x00, 0x10, 0x05, 0xEE, 0x05, 0x3D, 0x01, + 0xD3, 0x05, 0x10, 0xF6, 0xA8, 0x0A, 0x2D, 0xEF, 0xE9, 0x10, 0x40, 0xEB, + 0xBB, 0x14, 0xC6, 0xE9, 0xD8, 0x16, 0x26, 0xF3, 0x2C, 0x12, 0x8D, 0xF9, + 0x16, 0x12, 0xFA, 0xF4, 0xF9, 0x21, 0x8A, 0xFB, 0x16, 0x21, 0x87, 0x03, + 0x34, 0x10, 0x1E, 0xFD, 0x4A, 0x0E, 0xD4, 0xF9, 0xDA, 0x13, 0x20, 0xFA, + 0x8C, 0x0A, 0x09, 0xF4, 0xA9, 0xFA, 0x86, 0xF8, 0x79, 0xF5, 0xEC, 0x07, + 0xA4, 0xFC, 0xCB, 0x0C, 0xFE, 0x0B, 0x32, 0x0E, 0x64, 0x16, 0xAA, 0x13, + 0x64, 0x0B, 0x04, 0x16, 0x45, 0xFC, 0x7E, 0x18, 0x79, 0xF9, 0x3E, 0x19, + 0xE0, 0xF7, 0x36, 0x19, 0x83, 0xF9, 0x01, 0x20, 0x7B, 0x05, 0x43, 0x23, + 0xE9, 0x0E, 0x15, 0x15, 0xE7, 0x0A, 0xF2, 0x06, 0x00, 0x00, 0x72, 0x05, + 0x56, 0xF6, 0x2F, 0x03, 0xED, 0xF1, 0xE9, 0xF6, 0x4B, 0xF9, 0xE3, 0xF0, + 0xC4, 0x05, 0x3E, 0xF9, 0xEF, 0x02, 0x42, 0x02, 0x0C, 0xFF, 0x29, 0x07, + 0xCC, 0x03, 0xB3, 0x09, 0xE7, 0x03, 0x06, 0x0E, 0xD0, 0xFF, 0xE7, 0x13, + 0xEE, 0xFE, 0x3D, 0x17, 0xE8, 0x06, 0x68, 0x18, 0xAD, 0x0D, 0x54, 0x14, + 0xC1, 0x0F, 0x7B, 0x0F, 0x70, 0x11, 0x15, 0x16, 0x6C, 0x0D, 0xC1, 0x1E, + 0xC7, 0x07, 0x8A, 0x15, 0xE1, 0x0A, 0x0F, 0x08, 0x28, 0x05, 0xE6, 0x08, + 0xF7, 0xF9, 0x63, 0x08, 0x06, 0x03, 0xA9, 0x02, 0x5A, 0x1B, 0xEC, 0x05, + 0xFA, 0x23, 0x46, 0x05, 0xD5, 0x1B, 0xB5, 0x02, 0x1B, 0x1B, 0xAC, 0x08, + 0xC7, 0x1F, 0x17, 0x0C, 0xE7, 0x1C, 0xC2, 0x0E, 0x59, 0x1A, 0x50, 0x15, + 0xF7, 0x1D, 0x8F, 0x18, 0xC3, 0x23, 0xED, 0x1D, 0x9C, 0x2B, 0xC8, 0x27, + 0xC2, 0x2F, 0x98, 0x2C, 0x8C, 0x2F, 0x87, 0x2A, 0x09, 0x35, 0x33, 0x2B, + 0x4D, 0x3B, 0x9C, 0x28, 0xA2, 0x34, 0x8F, 0x1E, 0x8F, 0x2B, 0x3B, 0x1C, + 0xEC, 0x2D, 0x81, 0x21, 0x2D, 0x32, 0xE2, 0x24, 0x86, 0x30, 0x67, 0x2B, + 0x8A, 0x26, 0x7E, 0x32, 0xC2, 0x16, 0x90, 0x30, 0x10, 0x11, 0xA1, 0x28, + 0x04, 0x18, 0x9E, 0x22, 0xA5, 0x1D, 0x0B, 0x28, 0x01, 0x1A, 0x3E, 0x32, + 0x2F, 0x18, 0x32, 0x37, 0x10, 0x1D, 0xF2, 0x34, 0xDF, 0x19, 0x48, 0x34, + 0xA0, 0x0B, 0xCC, 0x35, 0xAA, 0x06, 0xA1, 0x2A, 0x59, 0x11, 0x07, 0x19, + 0x73, 0x17, 0xBF, 0x08, 0x51, 0x11, 0xEF, 0xFA, 0x6B, 0x0B, 0x5F, 0xF7, + 0xF1, 0x10, 0x55, 0xF8, 0xB2, 0x1B, 0x13, 0xF8, 0x84, 0x25, 0x88, 0x02, + 0x1A, 0x28, 0x6C, 0x0C, 0x59, 0x20, 0x96, 0x0A, 0x24, 0x1B, 0x42, 0x0A, + 0x13, 0x1C, 0xFC, 0x0C, 0xB7, 0x15, 0xD7, 0x08, 0xFD, 0x07, 0xBC, 0x04, + 0xBD, 0x00, 0x37, 0x0A, 0x11, 0x04, 0x37, 0x11, 0x32, 0x03, 0xAB, 0x14, + 0x98, 0xF9, 0x24, 0x1B, 0x22, 0xF5, 0xCB, 0x1D, 0x52, 0xFE, 0xFA, 0x13, + 0x00, 0x0E, 0x3A, 0x0B, 0x9B, 0x14, 0xED, 0x09, 0x55, 0x0F, 0x88, 0x0D, + 0x72, 0x08, 0x72, 0x0E, 0x78, 0xFF, 0x52, 0x01, 0x99, 0xF3, 0x1F, 0xF6, + 0x14, 0xEF, 0x69, 0xF1, 0x08, 0xED, 0xAD, 0xE5, 0xEC, 0xE8, 0x7D, 0xDB, + 0x09, 0xF2, 0x56, 0xDB, 0xE2, 0xFF, 0x1A, 0xDF, 0xBB, 0xFD, 0x7F, 0xE9, + 0xD0, 0xF5, 0x12, 0xF8, 0x1C, 0xF6, 0x2D, 0xFA, 0x98, 0xF2, 0x29, 0xF4, + 0x93, 0xE8, 0x63, 0xF5, 0x94, 0xEA, 0x74, 0xF5, 0x82, 0xEE, 0x18, 0xEB, + 0x24, 0xE9, 0x71, 0xE0, 0x7E, 0xE2, 0x1D, 0xD8, 0xCF, 0xDD, 0x5A, 0xD2, + 0x42, 0xDB, 0xC3, 0xD1, 0xF6, 0xD7, 0x7F, 0xCF, 0xD2, 0xD8, 0x3F, 0xCD, + 0x05, 0xDC, 0x0D, 0xD1, 0x41, 0xD9, 0x83, 0xD5, 0xD3, 0xD6, 0x6E, 0xD5, + 0x76, 0xD9, 0xE6, 0xD6, 0x67, 0xD5, 0x7F, 0xD8, 0xBF, 0xC8, 0xC1, 0xD6, + 0xB8, 0xC2, 0xA0, 0xDB, 0x05, 0xC9, 0x43, 0xE1, 0xA2, 0xCB, 0xC9, 0xD6, + 0x33, 0xC4, 0xC0, 0xC9, 0x95, 0xC3, 0x43, 0xC6, 0x68, 0xCF, 0x37, 0xC2, + 0xC6, 0xD8, 0x31, 0xC3, 0x10, 0xDC, 0xF3, 0xD0, 0x7F, 0xDB, 0x57, 0xD7, + 0x72, 0xD6, 0xBE, 0xCC, 0x1B, 0xD5, 0x73, 0xC8, 0xDA, 0xDA, 0x07, 0xD1, + 0xDF, 0xE2, 0x7C, 0xD4, 0x42, 0xE7, 0x45, 0xD1, 0x3B, 0xE0, 0xED, 0xCE, + 0xD8, 0xD2, 0x53, 0xD1, 0x5C, 0xC9, 0x3E, 0xDA, 0xA4, 0xC5, 0x14, 0xE6, + 0xA1, 0xCD, 0x38, 0xEE, 0xF3, 0xE3, 0xCF, 0xF3, 0x4C, 0xF5, 0x63, 0xF9, + 0xEC, 0xF2, 0x6F, 0xF5, 0x95, 0xEB, 0x7B, 0xEA, 0xEA, 0xE6, 0x40, 0xE5, + 0x45, 0xDF, 0x1F, 0xE5, 0x85, 0xDE, 0x73, 0xEA, 0x00, 0xEA, 0x19, 0xF6, + 0x1E, 0xEB, 0xBB, 0xF9, 0x41, 0xE5, 0xCA, 0xF5, 0xA4, 0xEA, 0x1B, 0xF5, + 0xB1, 0xEF, 0x33, 0xED, 0xF9, 0xF3, 0x06, 0xE3, 0x59, 0xFD, 0x63, 0xE7, + 0x93, 0x07, 0xE4, 0xF7, 0xD4, 0x0D, 0xC0, 0x05, 0xD4, 0x13, 0xAA, 0x0B, + 0xCE, 0x18, 0xB3, 0x08, 0x3D, 0x1A, 0x04, 0x01, 0xCC, 0x19, 0x5D, 0x00, + 0xED, 0x13, 0xC7, 0xFF, 0x0F, 0x0D, 0x9C, 0xFC, 0x1A, 0x0E, 0x2E, 0x04, + 0x68, 0x0F, 0x19, 0x0B, 0xE3, 0x10, 0x39, 0x09, 0xDC, 0x16, 0xA3, 0x0C, + 0xDE, 0x18, 0x71, 0x13, 0xF4, 0x16, 0x23, 0x15, 0x3B, 0x15, 0x73, 0x17, + 0x48, 0x0D, 0xC4, 0x18, 0xB0, 0x02, 0xAF, 0x1A, 0xEB, 0xFF, 0x80, 0x21, + 0x01, 0x05, 0x9C, 0x25, 0xDF, 0x09, 0xDE, 0x21, 0xCF, 0x05, 0x2B, 0x1A, + 0x3D, 0xFB, 0x7E, 0x15, 0xBC, 0xF9, 0x6C, 0x0E, 0x89, 0x06, 0x84, 0x05, + 0x7D, 0x13, 0xB5, 0x05, 0x90, 0x1A, 0x50, 0x0E, 0xB6, 0x1B, 0xE0, 0x15, + 0x44, 0x19, 0xAF, 0x14, 0x03, 0x16, 0xC3, 0x0B, 0x4F, 0x11, 0x8D, 0x03, + 0xF0, 0x07, 0x73, 0xFE, 0x42, 0xFF, 0xC9, 0xFA, 0xB8, 0xFA, 0xA2, 0xF6, + 0x0E, 0xF2, 0xDA, 0xF5, 0xF5, 0xE9, 0xAD, 0xFC, 0x18, 0xE9, 0x8D, 0x03, + 0x4D, 0xEF, 0x1B, 0x03, 0x5F, 0xF9, 0x76, 0xFA, 0x3F, 0x06, 0x18, 0xF8, + 0xCE, 0x0D, 0x62, 0xFE, 0x0F, 0x05, 0x87, 0xFF, 0xFA, 0xF3, 0xF8, 0xFA, + 0xCE, 0xEC, 0xE4, 0xF1, 0x03, 0xF1, 0xE7, 0xEA, 0x3A, 0xF2, 0x1F, 0xF5, + 0x3C, 0xEC, 0x07, 0x03, 0x23, 0xE3, 0xB2, 0xFE, 0x5C, 0xE4, 0xA3, 0xF4, + 0x0D, 0xF4, 0xB2, 0xF4, 0x27, 0x00, 0x19, 0xF8, 0x69, 0x01, 0xDD, 0xF9, + 0x87, 0x01, 0x02, 0xFC, 0xE1, 0x0B, 0x79, 0xFD, 0xF9, 0x17, 0x41, 0x00, + 0x02, 0x16, 0x35, 0x02, 0xFD, 0x09, 0x5D, 0x00, 0x0D, 0x07, 0xFA, 0x00, + 0xAB, 0x08, 0x69, 0x07, 0x3D, 0xFD, 0x9A, 0x10, 0xCC, 0xF6, 0xED, 0x1C, + 0xBF, 0x01, 0x9C, 0x24, 0x3B, 0x13, 0x57, 0x1E, 0x8C, 0x20, 0xC5, 0x19, + 0x80, 0x23, 0xA2, 0x20, 0x34, 0x1F, 0xF3, 0x24, 0xAA, 0x17, 0x45, 0x1E, + 0x43, 0x12, 0x3A, 0x13, 0x9C, 0x11, 0x8A, 0x0C, 0x68, 0x14, 0x54, 0x08, + 0x4D, 0x16, 0x7E, 0x08, 0xF7, 0x17, 0x65, 0x11, 0x64, 0x19, 0xF5, 0x13, + 0xB0, 0x17, 0x4D, 0x09, 0x5A, 0x16, 0x47, 0xFF, 0x5D, 0x18, 0x24, 0x02, + 0x6F, 0x1D, 0x13, 0x0B, 0xCE, 0x23, 0x75, 0x12, 0x33, 0x27, 0x83, 0x1A, + 0x31, 0x25, 0x26, 0x25, 0x4E, 0x1F, 0xD2, 0x2A, 0x85, 0x13, 0x02, 0x22, + 0x82, 0x06, 0x30, 0x16, 0x63, 0x02, 0x33, 0x0F, 0xF4, 0x03, 0x8E, 0x0E, + 0xA9, 0x08, 0x7E, 0x13, 0x6D, 0x14, 0xFA, 0x16, 0x82, 0x1E, 0x61, 0x14, + 0x86, 0x20, 0xEF, 0x12, 0xC0, 0x22, 0x6A, 0x1C, 0x69, 0x28, 0x12, 0x26, + 0x52, 0x27, 0xF0, 0x21, 0xFE, 0x22, 0x37, 0x14, 0x88, 0x20, 0x82, 0x0C, + 0x77, 0x14, 0xAA, 0x0F, 0xF1, 0x03, 0x6C, 0x12, 0xC9, 0xF7, 0xA2, 0x13, + 0x80, 0xEF, 0x0C, 0x16, 0xF8, 0xF2, 0x66, 0x17, 0xA9, 0x00, 0x3C, 0x17, + 0x6E, 0x0F, 0x26, 0x13, 0x7F, 0x1D, 0xC6, 0x0E, 0x4C, 0x28, 0x76, 0x11, + 0x58, 0x2D, 0xFD, 0x1B, 0xBB, 0x2D, 0xFC, 0x22, 0x18, 0x2D, 0x97, 0x23, + 0xD7, 0x27, 0x42, 0x1D, 0x82, 0x19, 0x3A, 0x0F, 0xF6, 0x0B, 0xA5, 0x07, + 0x3E, 0x08, 0xC5, 0x04, 0x03, 0x0E, 0x10, 0x03, 0xBC, 0x19, 0x7C, 0x09, + 0xE1, 0x1E, 0x61, 0x12, 0xB6, 0x16, 0x9E, 0x17, 0x3E, 0x0C, 0x2A, 0x1B, + 0x2E, 0x07, 0xC0, 0x1C, 0x99, 0x04, 0xCD, 0x1B, 0x63, 0x04, 0x01, 0x18, + 0xCE, 0x09, 0xD9, 0x13, 0x18, 0x10, 0xF7, 0x0B, 0x35, 0x0B, 0x50, 0xFD, + 0xEE, 0xFC, 0x79, 0xF7, 0x94, 0xF0, 0x95, 0xFB, 0x14, 0xF1, 0xFF, 0xFA, + 0x86, 0x00, 0x5D, 0xF8, 0xDE, 0x0B, 0xD2, 0xF9, 0x3C, 0x0F, 0x59, 0xFB, + 0xF2, 0x12, 0x04, 0xF7, 0x04, 0x0A, 0x96, 0xEC, 0xEC, 0xF5, 0xD5, 0xE9, + 0x74, 0xE9, 0x22, 0xF6, 0xB8, 0xE6, 0x26, 0x01, 0x34, 0xEA, 0x94, 0xFC, + 0xEA, 0xEB, 0xB4, 0xF1, 0xA8, 0xE1, 0xF6, 0xE9, 0x06, 0xD4, 0x2A, 0xE2, + 0x81, 0xD2, 0x52, 0xE0, 0x14, 0xD5, 0x5F, 0xEA, 0xE4, 0xCF, 0x5D, 0xF9, + 0x30, 0xD6, 0x0C, 0x04, 0x3C, 0xEC, 0xBB, 0x01, 0xFA, 0xFC, 0xA8, 0xF4, + 0xE8, 0xFF, 0x9A, 0xE4, 0x29, 0xF4, 0x22, 0xD4, 0x03, 0xE4, 0x00, 0xC8, + 0x53, 0xDD, 0x65, 0xC4, 0xAC, 0xD6, 0xDA, 0xC4, 0xAE, 0xC6, 0xAB, 0xC6, + 0xD7, 0xBA, 0x6A, 0xC9, 0x5B, 0xBE, 0x3B, 0xC5, 0x62, 0xCB, 0x24, 0xBF, + 0x40, 0xCF, 0x65, 0xC2, 0xC9, 0xC8, 0xD8, 0xC6, 0x69, 0xCB, 0x0F, 0xC4, + 0x3E, 0xD8, 0x54, 0xC0, 0xCE, 0xE1, 0x07, 0xC7, 0xB8, 0xE3, 0x05, 0xDA, + 0xC8, 0xE3, 0x41, 0xE8, 0x6B, 0xE6, 0xDA, 0xE0, 0x3E, 0xE4, 0x2C, 0xCD, + 0xE7, 0xD4, 0x9B, 0xC1, 0x9D, 0xBF, 0xE7, 0xBF, 0xAE, 0xB5, 0x59, 0xBE, + 0x1C, 0xBD, 0x1A, 0xBE, 0x76, 0xCE, 0x4A, 0xC7, 0x48, 0xDA, 0x71, 0xD5, + 0x51, 0xDB, 0xF5, 0xE0, 0x5E, 0xDC, 0xD4, 0xE3, 0x0E, 0xE1, 0x10, 0xDF, + 0xB9, 0xE2, 0x35, 0xE1, 0xD0, 0xDE, 0x5A, 0xED, 0xA3, 0xDC, 0xC2, 0xF0, + 0x49, 0xE3, 0x03, 0xE9, 0xDF, 0xE8, 0x26, 0xE5, 0x77, 0xE5, 0xD1, 0xE7, + 0xCD, 0xE1, 0x2C, 0xED, 0xA4, 0xE6, 0x9A, 0xF2, 0xFD, 0xF4, 0xB0, 0xF5, + 0x9B, 0x04, 0xFB, 0xF9, 0x9F, 0x0D, 0x81, 0xFF, 0x7A, 0x11, 0x00, 0xFE, + 0xB8, 0x14, 0xDE, 0xFA, 0x4C, 0x15, 0xC0, 0xFB, 0x19, 0x10, 0x69, 0xFD, + 0x79, 0x07, 0x1E, 0x06, 0x22, 0xFF, 0x62, 0x12, 0xD2, 0xFE, 0x1B, 0x0F, + 0xDC, 0x04, 0x3A, 0x04, 0x0D, 0x05, 0x6D, 0x0A, 0x75, 0x05, 0xD0, 0x1A, + 0x84, 0x0E, 0xD0, 0x28, 0x56, 0x17, 0xD9, 0x32, 0xCE, 0x1E, 0x8D, 0x34, + 0xD1, 0x26, 0x56, 0x28, 0x12, 0x25, 0x83, 0x15, 0x9D, 0x1A, 0x1A, 0x0B, + 0x16, 0x10, 0x5A, 0x07, 0xFC, 0x02, 0x85, 0x05, 0x49, 0xFC, 0x58, 0x07, + 0x09, 0xFE, 0xFA, 0x09, 0xF8, 0xFA, 0x81, 0x08, 0xC4, 0xF5, 0xC0, 0x05, + 0x9F, 0xF5, 0x82, 0x01, 0xC1, 0xF7, 0x78, 0xFF, 0x2D, 0xFD, 0x92, 0x06, + 0xB5, 0x08, 0x83, 0x0E, 0xEF, 0x11, 0x61, 0x13, 0xAB, 0x17, 0x02, 0x1C, + 0x7C, 0x1D, 0x5B, 0x23, 0xB6, 0x1F, 0x5A, 0x20, 0xF2, 0x1E, 0x45, 0x19, + 0x09, 0x1B, 0xA9, 0x14, 0x3C, 0x0F, 0x7D, 0x0E, 0x36, 0xFE, 0xC2, 0x04, + 0x0F, 0xF7, 0x28, 0x02, 0x73, 0xFA, 0x3A, 0x08, 0x2E, 0xFE, 0xA9, 0x0B, + 0x4B, 0xFF, 0x58, 0x0D, 0xAE, 0x01, 0xF6, 0x0D, 0x41, 0x09, 0xFC, 0x04, + 0xD9, 0x12, 0x25, 0xF8, 0xE9, 0x14, 0x3E, 0xF8, 0x77, 0x12, 0x2D, 0x05, + 0x30, 0x16, 0xD2, 0x0C, 0xB0, 0x1A, 0x63, 0x07, 0xA6, 0x16, 0xA2, 0xFF, + 0x53, 0x0B, 0xEF, 0xFD, 0x1D, 0x00, 0xBD, 0xFC, 0xA7, 0xFB, 0x21, 0xF7, + 0x1C, 0x00, 0x78, 0xF3, 0x26, 0x08, 0x88, 0xF6, 0xF0, 0x0E, 0x3D, 0xFB, + 0x06, 0x13, 0xC5, 0xFC, 0xE5, 0x11, 0xA1, 0xFC, 0xB2, 0x0D, 0xC3, 0xF7, + 0xAB, 0x0B, 0xE0, 0xF1, 0xED, 0x05, 0xD8, 0xF4, 0x40, 0xFC, 0xD7, 0xFB, + 0x00, 0xF5, 0x77, 0xFF, 0xDF, 0xEE, 0xD8, 0x03, 0x40, 0xEA, 0xAF, 0x0D, + 0x70, 0xEA, 0xA6, 0x1A, 0xFA, 0xEF, 0x02, 0x25, 0xD4, 0xF6, 0xBF, 0x28, + 0x99, 0xFC, 0xF6, 0x23, 0x8D, 0xFD, 0xE2, 0x1A, 0x52, 0xF9, 0x69, 0x13, + 0x24, 0xF6, 0xB8, 0x0C, 0xC9, 0xF5, 0x40, 0x0A, 0x7D, 0xF9, 0x72, 0x08, + 0x55, 0xFD, 0x92, 0x04, 0xAF, 0xF8, 0xD6, 0x03, 0xAB, 0xF6, 0x7B, 0x02, + 0xBB, 0x05, 0x2B, 0xFC, 0xE4, 0x18, 0xC5, 0xF3, 0x43, 0x1F, 0x53, 0xF3, + 0xC4, 0x1F, 0x7F, 0xFD, 0x8C, 0x22, 0x31, 0x06, 0xD9, 0x24, 0x57, 0x06, + 0xF4, 0x27, 0xBF, 0x06, 0x36, 0x29, 0x6E, 0x0E, 0xDF, 0x26, 0xBD, 0x19, + 0x46, 0x2C, 0x82, 0x21, 0xFC, 0x34, 0x6E, 0x22, 0xC4, 0x31, 0x64, 0x1E, + 0x5D, 0x28, 0x6D, 0x1D, 0xFE, 0x1E, 0x1F, 0x26, 0xBF, 0x15, 0xF3, 0x2E, + 0x5F, 0x15, 0xD5, 0x2E, 0x17, 0x1E, 0x90, 0x27, 0x32, 0x24, 0xCE, 0x22, + 0xEB, 0x29, 0x7E, 0x22, 0xF1, 0x31, 0xB3, 0x1B, 0x2F, 0x35, 0xD9, 0x11, + 0x78, 0x33, 0x43, 0x0F, 0xA6, 0x30, 0x4B, 0x19, 0x57, 0x2B, 0x5D, 0x29, + 0xAF, 0x23, 0xB7, 0x33, 0xC8, 0x19, 0x98, 0x36, 0xB2, 0x0D, 0xFD, 0x33, + 0xE5, 0x07, 0x10, 0x2E, 0x54, 0x0D, 0x69, 0x28, 0x51, 0x11, 0xA1, 0x1F, + 0x89, 0x0E, 0x5B, 0x15, 0x2E, 0x11, 0xC5, 0x15, 0x4B, 0x17, 0x0D, 0x1D, + 0xB8, 0x1C, 0x62, 0x1D, 0x2E, 0x20, 0xA3, 0x1A, 0x2C, 0x1A, 0x3D, 0x1D, + 0xE7, 0x0F, 0x97, 0x1D, 0x2B, 0x09, 0x8C, 0x1C, 0xEF, 0x05, 0x08, 0x21, + 0x2F, 0x07, 0x4D, 0x29, 0xEF, 0x0B, 0xFF, 0x2E, 0x31, 0x0D, 0xA2, 0x2E, + 0x14, 0x0D, 0xB0, 0x28, 0xEF, 0x0B, 0xC0, 0x1A, 0xB6, 0x04, 0xAB, 0x09, + 0x38, 0xFC, 0xDF, 0xFB, 0xE7, 0xF8, 0x09, 0xF7, 0xE9, 0xF6, 0xCB, 0xFD, + 0x4C, 0xFE, 0x74, 0x07, 0x97, 0x0D, 0xCD, 0x0E, 0x79, 0x11, 0x2D, 0x10, + 0xC9, 0x0C, 0xE6, 0x05, 0xFC, 0x0A, 0xB6, 0xF4, 0xBF, 0x0B, 0x56, 0xE5, + 0xC3, 0x0E, 0xCD, 0xDE, 0x6D, 0x14, 0x0D, 0xDE, 0xD5, 0x15, 0xFD, 0xDD, + 0x9A, 0x14, 0x11, 0xE6, 0xB5, 0x12, 0x66, 0xED, 0x72, 0x0A, 0x7A, 0xE8, + 0xD9, 0x01, 0x89, 0xE3, 0x9E, 0x00, 0x29, 0xE8, 0x28, 0x02, 0xAA, 0xEB, + 0x1E, 0x01, 0x62, 0xEC, 0x2C, 0xF6, 0xB0, 0xF4, 0x57, 0xE0, 0x0C, 0xFC, + 0x8C, 0xD0, 0x15, 0xFA, 0xE8, 0xD1, 0x01, 0xFA, 0x35, 0xD9, 0x9B, 0xFA, + 0x4B, 0xDD, 0xFF, 0xF1, 0x9D, 0xDF, 0xC5, 0xE6, 0xCB, 0xD8, 0xF5, 0xDF, + 0x32, 0xCD, 0x00, 0xDD, 0x49, 0xD0, 0x45, 0xDE, 0x27, 0xD6, 0x30, 0xE2, + 0xDA, 0xD3, 0x87, 0xE4, 0x4E, 0xD4, 0x6D, 0xE1, 0xC9, 0xD4, 0x61, 0xD9, + 0x30, 0xD2, 0x92, 0xCC, 0x0A, 0xCF, 0x14, 0xC0, 0x90, 0xCC, 0x17, 0xBE, + 0x1C, 0xCD, 0xD6, 0xBE, 0x5C, 0xCF, 0x18, 0xBF, 0x3B, 0xCE, 0x59, 0xC4, + 0x0F, 0xCB, 0x93, 0xC7, 0xB7, 0xCA, 0x06, 0xC5, 0x04, 0xCE, 0x98, 0xC5, + 0x6F, 0xD8, 0x84, 0xCA, 0xE7, 0xE2, 0xB9, 0xCD, 0xD2, 0xDB, 0xFD, 0xD3, + 0x83, 0xCD, 0x25, 0xDB, 0x67, 0xD1, 0x1F, 0xD8, 0x45, 0xDC, 0x70, 0xD3, + 0x92, 0xDA, 0xBC, 0xD8, 0xDD, 0xD5, 0x00, 0xDA, 0x3F, 0xD4, 0xEA, 0xCD, + 0x4C, 0xCC, 0x75, 0xC2, 0xA7, 0xBF, 0x6A, 0xC2, 0x8B, 0xBD, 0x5D, 0xC9, + 0xB0, 0xCA, 0x44, 0xD5, 0xD1, 0xDE, 0x2C, 0xE5, 0x08, 0xF0, 0x2C, 0xF0, + 0x1B, 0xF6, 0x65, 0xF6, 0xF1, 0xEF, 0xAE, 0xF7, 0x8D, 0xE7, 0xAB, 0xF0, + 0xC9, 0xE5, 0x50, 0xEE, 0x1C, 0xEC, 0x83, 0xF6, 0x38, 0xF4, 0x9E, 0xF7, + 0x48, 0xFB, 0xA6, 0xEF, 0xDF, 0x01, 0x84, 0xEC, 0x3A, 0xFF, 0x02, 0xEE, + 0x27, 0xF5, 0x8F, 0xF4, 0xBB, 0xF3, 0x71, 0x02, 0x4D, 0xFF, 0x45, 0x0A, + 0xBA, 0x0B, 0x8B, 0x0A, 0xDE, 0x14, 0xD8, 0x13, 0x63, 0x15, 0x89, 0x22, + 0x3B, 0x0C, 0x3B, 0x28, 0x49, 0x06, 0x45, 0x26, 0x45, 0x07, 0x76, 0x24, + 0x55, 0x05, 0x6A, 0x20, 0x09, 0x02, 0xF1, 0x15, 0xBA, 0x04, 0x0A, 0x09, + 0xB7, 0x0D, 0x83, 0x05, 0x09, 0x1B, 0xCD, 0x0E, 0x62, 0x28, 0x68, 0x17, + 0xFD, 0x2B, 0xEB, 0x18, 0xDC, 0x21, 0x1E, 0x17, 0x74, 0x14, 0x7B, 0x12, + 0xEE, 0x0D, 0xC1, 0x09, 0x9E, 0x0E, 0x36, 0x00, 0x14, 0x14, 0x58, 0xFC, + 0x18, 0x18, 0xBB, 0xFC, 0xBB, 0x0F, 0xCC, 0xFA, 0x60, 0x02, 0xD5, 0xFA, + 0xA9, 0xFD, 0x47, 0xF9, 0xE4, 0x01, 0xA2, 0xF5, 0x41, 0x0A, 0xF5, 0xFA, + 0x95, 0x18, 0xA6, 0x07, 0x26, 0x25, 0xF2, 0x11, 0x9C, 0x22, 0xFB, 0x0E, + 0x75, 0x14, 0xF0, 0x09, 0x97, 0x01, 0xB4, 0x0F, 0x60, 0xF2, 0x4A, 0x13, + 0x76, 0xF0, 0x7C, 0x0D, 0x7B, 0xF6, 0x6E, 0x06, 0x1C, 0xF6, 0x98, 0x00, + 0x41, 0xEE, 0x28, 0xF8, 0x36, 0xE9, 0xA1, 0xEE, 0x78, 0xE7, 0x76, 0xEB, + 0x00, 0xE6, 0xF3, 0xF3, 0xBD, 0xE6, 0x3D, 0x01, 0x83, 0xE6, 0x81, 0x09, + 0x04, 0xE9, 0x27, 0x07, 0x2C, 0xF4, 0xDC, 0xFA, 0xD4, 0xFA, 0x9B, 0xEF, + 0x69, 0xF5, 0x64, 0xEF, 0x76, 0xF2, 0xDF, 0xF2, 0xF2, 0xF7, 0x74, 0xEF, + 0xF5, 0xF6, 0x98, 0xEB, 0x50, 0xF0, 0xDC, 0xED, 0x97, 0xF5, 0x3C, 0xEE, + 0x27, 0x09, 0x11, 0xEE, 0xC8, 0x1D, 0xDB, 0xF3, 0x1F, 0x21, 0x70, 0xFB, + 0x9D, 0x13, 0x05, 0xFA, 0x1B, 0x08, 0x17, 0xF3, 0x03, 0x03, 0xB4, 0xF6, + 0xF0, 0xFD, 0xE2, 0xFE, 0x0E, 0xF9, 0x4E, 0x05, 0x11, 0xF8, 0x6E, 0x0B, + 0xCF, 0xFA, 0x86, 0x0C, 0xCA, 0xFD, 0x5C, 0x0B, 0x3A, 0x03, 0xA5, 0x08, + 0xCC, 0x05, 0x91, 0x05, 0x61, 0x05, 0xB0, 0x08, 0x22, 0x0E, 0xC0, 0x10, + 0xF8, 0x15, 0xA9, 0x1E, 0xC0, 0x13, 0x66, 0x2B, 0x13, 0x12, 0xD2, 0x2B, + 0x37, 0x12, 0xAD, 0x1F, 0xD7, 0x10, 0x0C, 0x14, 0x46, 0x12, 0xE1, 0x0F, + 0x66, 0x10, 0x50, 0x08, 0x72, 0x0C, 0x50, 0x02, 0x82, 0x12, 0xE3, 0x05, + 0x9A, 0x1E, 0x97, 0x0D, 0xF4, 0x26, 0x02, 0x13, 0xDA, 0x2A, 0xC6, 0x17, + 0x32, 0x2B, 0x96, 0x24, 0x36, 0x26, 0x98, 0x2F, 0x0E, 0x1E, 0xA2, 0x33, + 0x8B, 0x15, 0x12, 0x3C, 0x9B, 0x14, 0x08, 0x44, 0x67, 0x18, 0x08, 0x44, + 0x0A, 0x18, 0x1C, 0x3E, 0x80, 0x1E, 0x6D, 0x35, 0xD9, 0x21, 0x4B, 0x29, + 0x36, 0x1B, 0xD7, 0x1B, 0x92, 0x1C, 0xAE, 0x16, 0x0E, 0x1A, 0xA0, 0x12, + 0xC2, 0x13, 0x0B, 0x0C, 0x75, 0x14, 0xF1, 0x0A, 0xAC, 0x16, 0xBB, 0x10, + 0x4F, 0x18, 0x8D, 0x15, 0xB5, 0x11, 0x9A, 0x0C, 0xBF, 0x08, 0x49, 0xFF, + 0xB9, 0x06, 0x07, 0xF8, 0x3F, 0xFF, 0xE5, 0xEF, 0x66, 0xF5, 0x4E, 0xE4, + 0xF1, 0xF9, 0x13, 0xE6, 0xFD, 0x06, 0x79, 0xF8, 0x4A, 0x16, 0x2C, 0x05, + 0x0E, 0x20, 0x10, 0x07, 0x1C, 0x1C, 0x82, 0x07, 0x5F, 0x15, 0xFE, 0x05, + 0xBF, 0x16, 0xDA, 0x04, 0x03, 0x1C, 0x8B, 0x08, 0x33, 0x18, 0x75, 0x0A, + 0x5C, 0x0E, 0xA9, 0x09, 0x54, 0x12, 0x89, 0x0E, 0xC2, 0x21, 0x4C, 0x16, + 0x36, 0x22, 0xCA, 0x18, 0x8A, 0x11, 0xF2, 0x18, 0xB7, 0x0B, 0x34, 0x17, + 0x67, 0x0B, 0x0D, 0x0C, 0xDC, 0x04, 0xAF, 0x05, 0xCE, 0x06, 0xC2, 0x08, + 0xE5, 0x00, 0x49, 0x14, 0xD1, 0xF5, 0x92, 0x21, 0xAD, 0xF8, 0x8E, 0x24, + 0x3C, 0x04, 0xB0, 0x29, 0x17, 0x0C, 0x20, 0x26, 0x43, 0x05, 0x1A, 0x13, + 0xCE, 0xFF, 0xDF, 0x02, 0x7F, 0x02, 0xC3, 0xF8, 0xC5, 0x02, 0x9E, 0xED, + 0x71, 0x09, 0x48, 0xED, 0x05, 0x0F, 0x48, 0xF5, 0x9D, 0x11, 0x6C, 0xF6, + 0x7B, 0x12, 0xC0, 0xF0, 0xC7, 0x06, 0xCD, 0xEA, 0xEE, 0xFA, 0xA0, 0xE9, + 0xB5, 0xF3, 0x4F, 0xEC, 0x0C, 0xF4, 0x01, 0xF7, 0x69, 0xF9, 0xC0, 0x04, + 0x32, 0xF7, 0x46, 0x0A, 0xB5, 0xED, 0x88, 0x08, 0xE8, 0xE2, 0x4F, 0xFF, + 0x4B, 0xE2, 0xA7, 0xEF, 0xF5, 0xEC, 0xA2, 0xE2, 0x94, 0xEE, 0x94, 0xDB, + 0xA7, 0xED, 0x2B, 0xDF, 0x12, 0xF5, 0x8A, 0xE5, 0x23, 0xFA, 0xE4, 0xE8, + 0x3A, 0xFA, 0xBA, 0xEF, 0x88, 0xF1, 0x6A, 0xF0, 0xAC, 0xE5, 0x22, 0xED, + 0xB0, 0xE2, 0xAF, 0xE9, 0x0E, 0xE2, 0x98, 0xE5, 0x2D, 0xE4, 0x62, 0xE9, + 0xC3, 0xE7, 0x00, 0xEE, 0x94, 0xEE, 0xB1, 0xEE, 0xCB, 0xFD, 0xB8, 0xF1, + 0x63, 0x06, 0xFC, 0xF4, 0x9D, 0xFC, 0xA2, 0xF4, 0x56, 0xF3, 0xF1, 0xF8, + 0xA4, 0xF3, 0xB4, 0x03, 0xA2, 0xEF, 0x85, 0x07, 0x30, 0xF0, 0x41, 0x07, + 0x03, 0xF3, 0x78, 0x0C, 0x58, 0xF2, 0x12, 0x0A, 0xEB, 0xF7, 0x01, 0xFE, + 0x08, 0xFB, 0xD7, 0xF7, 0xF8, 0xF2, 0xA1, 0xF3, 0x5A, 0xE8, 0xC3, 0xE9, + 0xBC, 0xE9, 0xA8, 0xDF, 0xAE, 0xEF, 0xFA, 0xDD, 0x64, 0xF2, 0xD1, 0xE6, + 0x82, 0xEC, 0xA9, 0xEA, 0x4D, 0xDA, 0xED, 0xE6, 0x2B, 0xD2, 0x47, 0xE5, + 0x16, 0xD7, 0x2A, 0xE9, 0x3B, 0xDF, 0x2F, 0xE9, 0x74, 0xE7, 0x19, 0xDE, + 0x25, 0xE7, 0xF3, 0xD8, 0x62, 0xE2, 0xDA, 0xD3, 0xC9, 0xE3, 0xEB, 0xCA, + 0x1B, 0xE0, 0x28, 0xCB, 0xB7, 0xD6, 0x6E, 0xCC, 0x17, 0xD6, 0x29, 0xCC, + 0x0C, 0xDB, 0xFF, 0xC8, 0xF1, 0xDD, 0xAB, 0xC5, 0xF5, 0xD9, 0x1C, 0xCA, + 0x3C, 0xD1, 0x17, 0xCE, 0x51, 0xD3, 0xF7, 0xD6, 0xAD, 0xDF, 0x9E, 0xE5, + 0x41, 0xE8, 0x55, 0xEF, 0xA5, 0xEA, 0x48, 0xF7, 0x1C, 0xE7, 0xDB, 0xF9, + 0xC0, 0xDA, 0xB3, 0xF4, 0x8B, 0xD6, 0xAA, 0xF1, 0xE3, 0xDD, 0x28, 0xEC, + 0xCC, 0xE8, 0x61, 0xEA, 0x6C, 0xEC, 0x30, 0xEB, 0x00, 0xE8, 0x1C, 0xE8, + 0x96, 0xE2, 0x83, 0xE6, 0x18, 0xDE, 0x76, 0xE6, 0x08, 0xE3, 0x1B, 0xE8, + 0x84, 0xE4, 0x61, 0xE5, 0x5A, 0xEC, 0xD6, 0xE7, 0xC7, 0xF0, 0xC2, 0xE5, + 0xF9, 0xE5, 0x96, 0xDA, 0x57, 0xE3, 0xE7, 0xDC, 0x94, 0xE9, 0x62, 0xEE, + 0xD0, 0xF2, 0x13, 0xFD, 0x94, 0xFD, 0x85, 0x04, 0x21, 0x09, 0xFB, 0x08, + 0x4D, 0x02, 0xB9, 0x01, 0xE1, 0xF9, 0x96, 0x06, 0x6B, 0xFA, 0xAC, 0x03, + 0xB1, 0xFC, 0xFF, 0xF4, 0x07, 0x0E, 0xAD, 0x05, 0xEE, 0x19, 0xE3, 0x18, + 0xDD, 0x16, 0x27, 0x19, 0xE5, 0x19, 0xD7, 0x13, 0x15, 0x1A, 0x8E, 0x0B, + 0xA7, 0x14, 0x31, 0x02, 0x85, 0x19, 0x2D, 0x04, 0x15, 0x1A, 0x9D, 0x08, + 0xD6, 0x1C, 0x9C, 0x0D, 0xB9, 0x1D, 0x0E, 0x15, 0x75, 0x15, 0x0A, 0x15, + 0x76, 0x14, 0x39, 0x15, 0x88, 0x22, 0x23, 0x1B, 0xD3, 0x30, 0x74, 0x19, + 0x40, 0x2C, 0x0C, 0x16, 0xEC, 0x22, 0xD6, 0x20, 0x5B, 0x1C, 0x30, 0x20, + 0x65, 0x0D, 0xA7, 0x12, 0x4A, 0x0A, 0x0F, 0x1A, 0x5B, 0x0F, 0x2C, 0x29, + 0x26, 0x13, 0x6D, 0x30, 0xED, 0x1B, 0xF6, 0x2D, 0x96, 0x22, 0x2D, 0x26, + 0x5F, 0x24, 0xC4, 0x23, 0x5C, 0x1B, 0xCC, 0x1C, 0xB9, 0x19, 0x48, 0x24, + 0xAD, 0x24, 0x3E, 0x41, 0x07, 0x24, 0x07, 0x4D, 0x23, 0x17, 0x6C, 0x3F, + 0x58, 0x12, 0x1A, 0x30, 0x8C, 0x0E, 0x97, 0x21, 0x0B, 0x0B, 0xCD, 0x15, + 0x0B, 0x10, 0xD8, 0x1A, 0x53, 0x0C, 0x5E, 0x22, 0xBC, 0x05, 0xBE, 0x1F, + 0xB1, 0x08, 0x1D, 0x18, 0x90, 0x06, 0xBE, 0x0D, 0x9A, 0xFB, 0x8D, 0x04, + 0x22, 0xFD, 0x09, 0x04, 0x21, 0x0B, 0x40, 0x08, 0xB3, 0x0F, 0x78, 0x06, + 0x0E, 0x0C, 0x6B, 0x00, 0xF7, 0x00, 0x9B, 0xEF, 0x83, 0xF6, 0x0A, 0xE7, + 0x1C, 0x04, 0x4A, 0xF2, 0x8E, 0x14, 0x30, 0xFB, 0xFF, 0x19, 0x4F, 0xFD, + 0x2D, 0x1E, 0x09, 0xFF, 0xB3, 0x15, 0x7B, 0xF8, 0xE2, 0x08, 0x61, 0xE7, + 0xAE, 0xFC, 0xC8, 0xDE, 0x28, 0xF4, 0x36, 0xE6, 0xF1, 0x00, 0xC5, 0xF8, + 0x79, 0x13, 0x02, 0x0F, 0xA4, 0x12, 0x88, 0x19, 0x0F, 0x0F, 0xCF, 0x18, + 0x12, 0x05, 0x57, 0x0F, 0x42, 0xFA, 0x0F, 0x05, 0x8C, 0xF5, 0x71, 0x04, + 0xD5, 0xF2, 0xBF, 0x05, 0x08, 0xFD, 0xCB, 0x0A, 0x26, 0x0A, 0x7C, 0x0C, + 0xDA, 0x17, 0x10, 0x04, 0xE5, 0x23, 0xF1, 0x00, 0x28, 0x23, 0x91, 0x03, + 0x28, 0x21, 0xD7, 0x05, 0x88, 0x16, 0x61, 0x02, 0x51, 0x01, 0xEA, 0xF8, + 0x21, 0xF8, 0xF0, 0xF2, 0x7E, 0xF6, 0x3F, 0xF6, 0x22, 0xFD, 0x40, 0x01, + 0x65, 0x0A, 0x43, 0x12, 0xB0, 0x0C, 0x3C, 0x1E, 0x6E, 0x02, 0x7B, 0x1E, + 0x5C, 0x07, 0xBF, 0x24, 0x0B, 0x0D, 0x8F, 0x26, 0x6B, 0x00, 0x2A, 0x1E, + 0x99, 0x00, 0xAB, 0x20, 0x99, 0x09, 0xD9, 0x20, 0x0B, 0x11, 0x32, 0x18, + 0x4C, 0x0C, 0x4A, 0x08, 0xD2, 0xF7, 0x30, 0xF9, 0x25, 0xED, 0x98, 0xF9, + 0xB3, 0xEF, 0x2D, 0xF3, 0x04, 0x01, 0xC8, 0xEE, 0x64, 0x11, 0x9F, 0xF0, + 0x3F, 0x0B, 0xBC, 0xF1, 0x7D, 0xFB, 0x9F, 0xF9, 0xB7, 0xF4, 0xA9, 0x02, + 0x0A, 0xF8, 0xC4, 0x0A, 0xCE, 0xEE, 0x52, 0x02, 0x89, 0xE9, 0x30, 0xF7, + 0xFC, 0xF0, 0x72, 0xED, 0xB4, 0x01, 0x54, 0xE8, 0xFE, 0x07, 0x56, 0xE3, + 0x1D, 0x08, 0x20, 0xEF, 0x36, 0x09, 0xF0, 0x08, 0x99, 0xFB, 0xC4, 0x07, + 0xC8, 0x08, 0x86, 0x06, 0x7F, 0x0E, 0x82, 0x02, 0x19, 0x05, 0x68, 0x01, + 0x9D, 0x11, 0x5E, 0x0E, 0xF2, 0x1B, 0x9F, 0x0F, 0xE8, 0x11, 0x32, 0x01, + 0x82, 0x03, 0x0C, 0xF9, 0xA4, 0xFA, 0x4D, 0x00, 0x55, 0xE8, 0xF7, 0xFD, + 0x18, 0xE9, 0x99, 0xFD, 0xB5, 0xF2, 0xE4, 0xFB, 0x04, 0xE2, 0x1A, 0xF0, + 0xF9, 0xDA, 0xB8, 0xFA, 0x28, 0xE9, 0x00, 0x09, 0x45, 0xF2, 0xD9, 0x02, + 0x8F, 0xF7, 0x03, 0xF9, 0x3E, 0x00, 0x3A, 0xFC, 0x6E, 0x0C, 0x51, 0x04, + 0xF0, 0x0C, 0x7D, 0xF0, 0xC6, 0x01, 0x0B, 0xD0, 0xCB, 0xFF, 0xA2, 0xC7, + 0xED, 0xF5, 0xA8, 0xC7, 0x9E, 0xD9, 0xE8, 0xC3, 0xBA, 0xD0, 0x4C, 0xCE, + 0xDA, 0xD9, 0x1F, 0xDD, 0x12, 0xE5, 0x67, 0xEA, 0xCA, 0xF1, 0x78, 0xF8, + 0x5E, 0xEC, 0x50, 0xF3, 0xEB, 0xE5, 0x0B, 0xE5, 0xEE, 0xF0, 0x56, 0xEB, + 0x8C, 0xEF, 0x03, 0xF6, 0x49, 0xDD, 0x4B, 0xF3, 0xF8, 0xDE, 0xB3, 0xFB, + 0x18, 0xEF, 0xD3, 0xFC, 0xA5, 0xFD, 0x61, 0xF6, 0xF7, 0xFF, 0xB9, 0xF9, + 0xAA, 0xF8, 0xAA, 0xFE, 0x7F, 0xF2, 0xF7, 0x07, 0x67, 0xEC, 0x9D, 0x0A, + 0x83, 0xFA, 0x0C, 0x09, 0xF2, 0x06, 0x57, 0x05, 0x9C, 0x00, 0x56, 0xFC, + 0xBC, 0x02, 0xC2, 0xFA, 0xA7, 0x0A, 0xEC, 0xFE, 0x03, 0x13, 0xCD, 0x07, + 0xF1, 0x19, 0xD8, 0x0E, 0x00, 0x1F, 0x9F, 0x0A, 0x19, 0x25, 0xA7, 0x04, + 0x75, 0x29, 0x92, 0x05, 0xC6, 0x2A, 0x6E, 0x0C, 0x7D, 0x1F, 0x24, 0x13, + 0x4C, 0x0E, 0x92, 0x12, 0xD8, 0x0C, 0xA3, 0x14, 0x30, 0x1C, 0x39, 0x1F, + 0x17, 0x18, 0xD1, 0x11, 0x44, 0x09, 0xA3, 0x04, 0xFF, 0x09, 0x87, 0x12, + 0xE0, 0x06, 0xAA, 0x14, 0x0A, 0xF9, 0x62, 0x0A, 0xDB, 0xFC, 0xD9, 0x0C, + 0x5C, 0x08, 0x59, 0x12, 0xAD, 0x00, 0x29, 0x11, 0x35, 0xF7, 0xC9, 0x0D, + 0x79, 0xEF, 0x76, 0x01, 0x11, 0xE9, 0xE3, 0xF9, 0xE6, 0xED, 0x00, 0x02, + 0xB2, 0x01, 0xE9, 0x0B, 0x6A, 0x15, 0xAF, 0x0C, 0x3F, 0x19, 0xCA, 0x05, + 0x91, 0x11, 0x90, 0xFC, 0xDE, 0x0C, 0x89, 0xFD, 0xCA, 0x06, 0x1F, 0xFF, + 0xA0, 0x00, 0xE7, 0xEC, 0x2D, 0x01, 0x50, 0xDC, 0x85, 0xF9, 0xEE, 0xD8, + 0x99, 0xEA, 0x0D, 0xDF, 0x45, 0xE3, 0xF5, 0xF0, 0x5E, 0xE5, 0x44, 0xFE, + 0x90, 0xF3, 0x96, 0x07, 0x2D, 0x00, 0x30, 0x0F, 0x64, 0xEB, 0x93, 0xFD, + 0x7C, 0xDA, 0x2F, 0xF1, 0x95, 0xED, 0x6B, 0x07, 0x71, 0xF6, 0x89, 0x15, + 0xA6, 0xEC, 0x2A, 0x0E, 0xBB, 0xE8, 0x9C, 0x02, 0x54, 0xEE, 0x7C, 0xFE, + 0x16, 0xF1, 0x23, 0xF1, 0x6A, 0xEC, 0x39, 0xE2, 0xBA, 0xE0, 0xF4, 0xE3, + 0xD6, 0xD7, 0x13, 0xE7, 0x6D, 0xDD, 0x02, 0xE9, 0xBD, 0xDF, 0x81, 0xDD, + 0x9B, 0xDB, 0x27, 0xD0, 0xF8, 0xCE, 0x42, 0xCB, 0x8F, 0xC5, 0x99, 0xC3, + 0xCE, 0xD3, 0x79, 0xC0, 0x5F, 0xE6, 0xFB, 0xCA, 0x91, 0xED, 0x58, 0xD6, + 0xE1, 0xEF, 0x62, 0xDA, 0xAF, 0x01, 0x4E, 0xE8, 0x08, 0x0C, 0x43, 0xF4, + 0xEF, 0xFF, 0xE7, 0xF4, 0x94, 0xFE, 0xBB, 0x00, 0xF2, 0xF9, 0xC0, 0x01, + 0x35, 0xFE, 0x6C, 0xF8, 0xAA, 0x0B, 0xF1, 0xF3, 0x16, 0x09, 0xD2, 0xF8, + 0x69, 0x0C, 0x4C, 0x11, 0xFD, 0x11, 0x84, 0x1C, 0xFC, 0x0C, 0x2F, 0x13, + 0xB6, 0x06, 0x51, 0x0D, 0x65, 0xFB, 0x05, 0x09, 0x62, 0xF0, 0xCE, 0x00, + 0x8E, 0xE0, 0x99, 0xF4, 0x16, 0xDD, 0x0E, 0xF7, 0x70, 0xEE, 0xE1, 0x07, + 0x3A, 0x00, 0x5C, 0x14, 0x3E, 0x0A, 0xAF, 0x12, 0xAE, 0x07, 0x0B, 0x0A, + 0x07, 0x0C, 0x10, 0x13, 0x4D, 0x18, 0xAB, 0x1B, 0x4B, 0x1C, 0x15, 0x18, + 0x0B, 0x23, 0x26, 0x1F, 0xF6, 0x27, 0xA2, 0x1F, 0xBF, 0x25, 0xCB, 0x14, + 0xDE, 0x2C, 0x4D, 0x12, 0x66, 0x2D, 0x57, 0x0E, 0xF9, 0x1B, 0xA2, 0x03, + 0x76, 0x14, 0x11, 0x02, 0xA2, 0x14, 0x73, 0xFF, 0x93, 0x11, 0x5E, 0xF7, + 0x20, 0x15, 0x83, 0xFF, 0x26, 0x10, 0xF6, 0x08, 0x34, 0x14, 0xC9, 0x1A, + 0x5B, 0x20, 0xEA, 0x2B, 0xC7, 0x0B, 0x6A, 0x17, 0xC0, 0xFE, 0xDE, 0x10, + 0x86, 0x05, 0xA0, 0x20, 0xB5, 0x02, 0xFA, 0x16, 0x49, 0x05, 0x5B, 0x0F, + 0x11, 0x11, 0x01, 0x1E, 0xD3, 0x0E, 0x21, 0x23, 0x0A, 0x08, 0x26, 0x1F, + 0xBD, 0x11, 0x9F, 0x22, 0x9E, 0x0E, 0x05, 0x13, 0x85, 0x0E, 0xD1, 0x07, + 0xCD, 0x1F, 0xD7, 0x11, 0x82, 0x26, 0xFC, 0x0D, 0x24, 0x35, 0x0F, 0x0E, + 0xC3, 0x41, 0x1D, 0x17, 0x13, 0x3F, 0x44, 0x24, 0x0E, 0x2D, 0x07, 0x2B, + 0x6F, 0x0F, 0xBB, 0x1E, 0x7F, 0x07, 0x8A, 0x11, 0x7A, 0x04, 0x1C, 0x04, + 0xC6, 0xF3, 0xB5, 0xFA, 0xD4, 0xE3, 0xA1, 0xF2, 0xDD, 0xF1, 0x8B, 0xFB, + 0xD1, 0xF9, 0xDB, 0xFE, 0xEA, 0xF2, 0x48, 0x00, 0xAF, 0xF6, 0x73, 0x12, + 0x47, 0xEC, 0x6A, 0x0B, 0xE6, 0xE1, 0x7A, 0xFA, 0xBD, 0xF2, 0xC1, 0x06, + 0x6E, 0x0C, 0x1C, 0x1C, 0x38, 0x08, 0x4B, 0x0D, 0x69, 0x12, 0x56, 0x05, + 0x53, 0x2E, 0xA7, 0x12, 0x30, 0x20, 0xFF, 0x05, 0xB5, 0x05, 0xFA, 0xF9, + 0x58, 0x01, 0x87, 0x00, 0x5F, 0x0E, 0x24, 0x0B, 0x84, 0x0B, 0xD8, 0x09, + 0xAD, 0xFE, 0xEA, 0x09, 0xB7, 0xF8, 0x42, 0x05, 0x06, 0xFE, 0xDA, 0xFE, + 0xCB, 0xFE, 0x4A, 0xFB, 0x1E, 0xF1, 0xB6, 0xF2, 0x04, 0xEA, 0xCB, 0xE9, + 0x5B, 0xE9, 0x66, 0xD8, 0xDD, 0xEA, 0x0F, 0xCD, 0x23, 0xDD, 0xA4, 0xC4, + 0x52, 0xD1, 0x70, 0xC1, 0x25, 0xD4, 0x27, 0xC5, 0x74, 0xE4, 0x65, 0xD6, + 0xF2, 0xFA, 0x7C, 0xF7, 0x83, 0xF9, 0x63, 0x06, 0x02, 0xF3, 0x13, 0x0B, + 0x07, 0xF5, 0x74, 0x11, 0x77, 0xF6, 0xE1, 0x12, 0xFD, 0xF5, 0x1A, 0x11, + 0x54, 0xF9, 0x3F, 0x13, 0x46, 0xF6, 0xC3, 0x0B, 0xB0, 0xEE, 0x49, 0xFF, + 0x61, 0xEB, 0x81, 0xFC, 0xA2, 0xDA, 0xE0, 0xEC, 0xBD, 0xD2, 0x40, 0xDD, + 0xD1, 0xD9, 0x64, 0xD5, 0x63, 0xDA, 0xC8, 0xCB, 0x82, 0xD4, 0xE1, 0xBF, + 0x03, 0xD7, 0xD3, 0xB6, 0x11, 0xE2, 0x4A, 0xB9, 0xB2, 0xEC, 0xF5, 0xCB, + 0x41, 0xF3, 0x49, 0xE1, 0x7C, 0xFE, 0x21, 0xED, 0xF9, 0x1B, 0x99, 0xFE, + 0x99, 0x32, 0xE8, 0x0F, 0x1E, 0x32, 0xC4, 0x17, 0xCE, 0x2C, 0x7C, 0x1F, + 0xC1, 0x26, 0xED, 0x22, 0x8A, 0x23, 0x4F, 0x24, 0xED, 0x2B, 0xF0, 0x2F, + 0x92, 0x2F, 0x4F, 0x38, 0xE2, 0x18, 0x60, 0x24, 0x0B, 0x0B, 0xF4, 0x10, + 0xEA, 0x16, 0x3F, 0x11, 0x1F, 0x19, 0x79, 0x0E, 0x3E, 0x19, 0x05, 0x14, + 0x9C, 0x1F, 0xDA, 0x1E, 0x29, 0x1C, 0x2F, 0x1A, 0xE7, 0x0A, 0x0A, 0x0D, + 0x4A, 0xF8, 0x14, 0x08, 0x82, 0xE6, 0x6D, 0xFF, 0x5D, 0xD6, 0x8E, 0xE8, + 0x48, 0xD2, 0xC5, 0xD7, 0xBA, 0xC9, 0xBD, 0xCB, 0x7E, 0xC1, 0xE0, 0xC8, + 0xF3, 0xC6, 0x5D, 0xCF, 0x87, 0xDE, 0xA3, 0xDA, 0x66, 0xFA, 0x1A, 0xE5, + 0x67, 0x05, 0x91, 0xED, 0xB8, 0x0E, 0xB9, 0x09, 0xF6, 0x15, 0x10, 0x25, + 0x9A, 0x1C, 0xBC, 0x2E, 0x50, 0x15, 0xE0, 0x25, 0xCF, 0x01, 0xBF, 0x1B, + 0x14, 0x07, 0x82, 0x29, 0x37, 0x0B, 0x9A, 0x27, 0xE5, 0x03, 0xBE, 0x12, + 0x12, 0x00, 0x05, 0x07, 0xBE, 0xF6, 0xB6, 0xFD, 0xAC, 0xDD, 0x16, 0xE6, + 0x15, 0xD9, 0x9F, 0xDF, 0xCF, 0xE0, 0xC0, 0xE2, 0xA4, 0xD2, 0x89, 0xD0, + 0x2B, 0xDC, 0x0C, 0xD9, 0xA1, 0xEC, 0xCC, 0xED, 0x24, 0xF5, 0x72, 0xFF, + 0x52, 0x01, 0x08, 0x0E, 0xAF, 0x14, 0x62, 0x15, 0xC0, 0x2D, 0x34, 0x1E, + 0x96, 0x43, 0x1D, 0x28, 0x42, 0x4E, 0x6C, 0x2C, 0x4F, 0x4F, 0x82, 0x2C, + 0x07, 0x59, 0x7B, 0x38, 0x0A, 0x50, 0x1A, 0x35, 0x02, 0x3B, 0x81, 0x2B, + 0x75, 0x2E, 0xD5, 0x2A, 0xCA, 0x19, 0xE3, 0x16, 0xFC, 0x0C, 0xD5, 0x01, + 0x19, 0x0B, 0x2B, 0x02, 0xCB, 0x09, 0xC6, 0x0D, 0x90, 0x09, 0x66, 0x12, + 0xB1, 0x15, 0x98, 0x1B, 0xF6, 0x11, 0x60, 0x21, 0x1E, 0xF9, 0xE6, 0x1E, + 0xFE, 0xEB, 0x8B, 0x19, 0x48, 0xE5, 0xF4, 0x04, 0x32, 0xDD, 0x84, 0xF1, + 0x86, 0xD7, 0x6A, 0xE8, 0x65, 0xDB, 0x58, 0xE9, 0x08, 0xD4, 0x97, 0xE3, + 0x2B, 0xCA, 0x31, 0xDE, 0x10, 0xD3, 0x0D, 0xE5, 0x5C, 0xD4, 0xB5, 0xDF, + 0x51, 0xD2, 0xB7, 0xD7, 0x86, 0xE8, 0x01, 0xE0, 0x6E, 0x09, 0x9F, 0xE9, + 0xA8, 0x18, 0xA6, 0xED, 0x8A, 0x21, 0x63, 0xFE, 0x01, 0x1C, 0x30, 0x05, + 0x40, 0x0A, 0x09, 0xFB, 0xF5, 0x04, 0x3C, 0xF9, 0x11, 0x02, 0x35, 0xFB, + 0xA3, 0xFA, 0x98, 0xF5, 0x09, 0xF0, 0x7E, 0xE6, 0x5E, 0xDF, 0xD0, 0xD4, + 0x95, 0xC9, 0x6E, 0xC1, 0x3F, 0xBC, 0xCF, 0xB3, 0xEB, 0xB9, 0x3E, 0xB5, + 0x25, 0xBD, 0x95, 0xC0, 0x77, 0xCC, 0xCA, 0xCD, 0xA9, 0xE2, 0x5D, 0xD3, + 0xC4, 0xF4, 0x78, 0xDE, 0xCD, 0x04, 0x1E, 0xFB, 0x7E, 0x10, 0x04, 0x15, + 0x1D, 0x18, 0xF1, 0x25, 0x25, 0x16, 0x4F, 0x2D, 0x1B, 0x11, 0x0B, 0x2F, + 0x55, 0x14, 0xCA, 0x2E, 0xC2, 0x12, 0x95, 0x1C, 0xBF, 0x0D, 0xA6, 0x0B, + 0xF2, 0x11, 0x78, 0x12, 0xD5, 0x0F, 0x7B, 0x17, 0x36, 0x02, 0x85, 0x12, + 0xF5, 0xFB, 0xE2, 0x14, 0x5B, 0x04, 0xBE, 0x1D, 0xB0, 0x0E, 0x7D, 0x20, + 0xD5, 0x13, 0x82, 0x1F, 0x5A, 0x19, 0xCB, 0x20, 0x65, 0x22, 0xE6, 0x1D, + 0xD6, 0x17, 0x14, 0x0B, 0x02, 0x04, 0x5D, 0xFD, 0xC2, 0xF5, 0x1F, 0xF5, + 0x5E, 0xE9, 0xAC, 0xE5, 0xFE, 0xEF, 0xE4, 0xE2, 0xFF, 0xF9, 0x16, 0xE8, + 0xD4, 0xF6, 0x41, 0xEE, 0xB2, 0xE9, 0xCB, 0xE8, 0x9F, 0xF1, 0xD3, 0xEA, + 0xBD, 0x04, 0xD9, 0xF4, 0xCB, 0x0B, 0xDD, 0xFD, 0x02, 0x19, 0x03, 0x1C, + 0x31, 0x20, 0x09, 0x37, 0x85, 0x26, 0xF2, 0x40, 0x15, 0x31, 0xA2, 0x34, + 0x6A, 0x37, 0x23, 0x1C, 0xC6, 0x2C, 0x89, 0x06, 0x2B, 0x1E, 0x1C, 0xF7, + 0x33, 0x0F, 0x17, 0xE4, 0xAC, 0xFC, 0xEC, 0xD2, 0x0C, 0xEC, 0x10, 0xCC, + 0x83, 0xD6, 0x2A, 0xC2, 0x94, 0xD0, 0x37, 0xBE, 0x4F, 0xDA, 0x86, 0xC7, + 0xD0, 0xDA, 0xA8, 0xDB, 0xAC, 0xC8, 0x2B, 0xE6, 0x82, 0xC7, 0xE6, 0xED, + 0x84, 0xDD, 0xC2, 0xF8, 0xEA, 0xF1, 0x0D, 0x06, 0xB8, 0xFD, 0x3C, 0x19, + 0x27, 0x0C, 0xC5, 0x2D, 0x2E, 0x13, 0xA7, 0x34, 0xB0, 0x08, 0x43, 0x26, + 0x63, 0x0A, 0x71, 0x22, 0x03, 0xFD, 0x28, 0x12, 0x24, 0xE3, 0xF4, 0xF0, + 0x28, 0xE8, 0x39, 0xEB, 0xCF, 0xF8, 0x71, 0xF9, 0x9F, 0xF0, 0x9C, 0xF4, + 0x08, 0xDA, 0xFE, 0xE6, 0xF5, 0xD1, 0x49, 0xE1, 0xD5, 0xD9, 0xD3, 0xD8, + 0x1E, 0xEB, 0x9B, 0xD9, 0x3B, 0xFA, 0xCE, 0xEA, 0xF9, 0x00, 0x35, 0xFC, + 0x9D, 0xF9, 0x62, 0xFB, 0x19, 0xE8, 0xF7, 0xF2, 0x4E, 0xD5, 0xCB, 0xE6, + 0x45, 0xD4, 0x70, 0xD4, 0x62, 0xD7, 0x6E, 0xC2, 0x38, 0xD0, 0x52, 0xBA, + 0x90, 0xD0, 0x6B, 0xBD, 0xA2, 0xD1, 0x8A, 0xBB, 0xDE, 0xD3, 0x96, 0xB7, + 0x97, 0xEC, 0x26, 0xC9, 0xAB, 0x0A, 0xE7, 0xE1, 0x71, 0x1F, 0x7F, 0xF5, + 0x35, 0x30, 0x84, 0x0E, 0x69, 0x35, 0xDA, 0x1D, 0xCE, 0x29, 0x36, 0x13, + 0x94, 0x20, 0xF3, 0x07, 0xB8, 0x1A, 0xEE, 0x02, 0xEB, 0x10, 0x90, 0x03, + 0xA6, 0x07, 0xA4, 0x0D, 0x98, 0xF4, 0x51, 0x10, 0x45, 0xD9, 0xFD, 0xFF, + 0x6C, 0xC8, 0xBA, 0xE4, 0xD1, 0xCB, 0x99, 0xD9, 0x94, 0xCD, 0x2A, 0xD3, + 0x8C, 0xD6, 0x9E, 0xD1, 0xA1, 0xED, 0x73, 0xE9, 0x94, 0xFE, 0x7B, 0x06, + 0x33, 0x09, 0x9B, 0x1A, 0xB5, 0x19, 0xC7, 0x35, 0xA8, 0x27, 0x8F, 0x4C, + 0xDB, 0x2B, 0x45, 0x4B, 0xD7, 0x32, 0x58, 0x44, 0x2E, 0x30, 0xAC, 0x40, + 0x62, 0x22, 0x1F, 0x3A, 0x13, 0x22, 0x8F, 0x35, 0xE6, 0x2A, 0x13, 0x3A, + 0xD8, 0x2A, 0xD6, 0x3A, 0x98, 0x28, 0x51, 0x35, 0x5C, 0x26, 0x9A, 0x32, + 0x8B, 0x20, 0x25, 0x2B, 0x6A, 0x1C, 0x89, 0x21, 0x52, 0x1A, 0x08, 0x1D, + 0x96, 0x25, 0xB8, 0x27, 0x0F, 0x34, 0x54, 0x35, 0xF2, 0x36, 0x47, 0x31, + 0x19, 0x38, 0xDB, 0x27, 0x1A, 0x30, 0x5F, 0x1B, 0xB0, 0x17, 0x14, 0x03, + 0x6B, 0xF8, 0xAD, 0xE5, 0xA8, 0xF2, 0x84, 0xDE, 0xE4, 0x01, 0xB0, 0xEA, + 0x16, 0x04, 0xDE, 0xEC, 0x4F, 0x0B, 0x65, 0xF1, 0xE6, 0x1E, 0xC8, 0x03, + 0xD3, 0x27, 0xD2, 0x0D, 0x4B, 0x34, 0x75, 0x1F, 0x4D, 0x43, 0xA3, 0x39, + 0xD1, 0x4F, 0xBF, 0x45, 0x1C, 0x5A, 0xE9, 0x4A, 0x77, 0x59, 0xF5, 0x57, + 0x51, 0x4B, 0xB6, 0x59, 0x5C, 0x37, 0xE0, 0x49, 0x14, 0x25, 0x2E, 0x39, + 0xE8, 0x1B, 0x11, 0x33, 0x9D, 0x1A, 0xE8, 0x2C, 0x6C, 0x10, 0x1C, 0x1E, + 0xAC, 0xF6, 0x8E, 0x0A, 0x40, 0xEA, 0xA3, 0xFA, 0xA6, 0xEF, 0x32, 0xF3, + 0xAB, 0xED, 0x17, 0xF6, 0xC6, 0xF9, 0x87, 0x0D, 0xDC, 0x06, 0x53, 0x21, + 0xB2, 0x0E, 0xAE, 0x2E, 0x13, 0x1F, 0x66, 0x3E, 0xA4, 0x26, 0xFA, 0x3A, + 0x98, 0x2B, 0xA6, 0x2A, 0x0A, 0x35, 0xEB, 0x1F, 0x56, 0x34, 0x66, 0x16, + 0x03, 0x30, 0x61, 0x12, 0xA7, 0x35, 0x00, 0x22, 0x43, 0x2F, 0x7E, 0x24, + 0x90, 0x1E, 0x42, 0x15, 0xAA, 0x1A, 0xC0, 0x11, 0x24, 0x08, 0xC6, 0xFF, + 0xCA, 0xED, 0xA8, 0xE7, 0xA2, 0xEB, 0x56, 0xE8, 0x4B, 0xE2, 0xC7, 0xE7, + 0x29, 0xD7, 0xBA, 0xE8, 0x59, 0xEE, 0x5D, 0xFD, 0x8E, 0x02, 0x4C, 0x0C, + 0x5E, 0x04, 0xA8, 0x0E, 0x80, 0x0C, 0xDE, 0x09, 0x09, 0x03, 0xAF, 0xF0, + 0xE4, 0xE3, 0xFA, 0xD2, 0x1C, 0xC3, 0xE7, 0xBC, 0xF6, 0xAA, 0xC3, 0xAC, + 0xE5, 0xA2, 0xF0, 0xAA, 0x77, 0xB1, 0x0C, 0xB7, 0x70, 0xCA, 0xB3, 0xBB, + 0x95, 0xD0, 0x31, 0xB7, 0x1B, 0xD7, 0xEF, 0xC9, 0x72, 0xE8, 0x6E, 0xDE, + 0x0D, 0xFB, 0xF4, 0xE6, 0xD4, 0x0C, 0xCC, 0xF9, 0x0B, 0x10, 0x9E, 0x0C, + 0x0F, 0x07, 0x7A, 0x0F, 0xDE, 0x03, 0x76, 0x06, 0xF9, 0xFA, 0xF5, 0xF9, + 0x79, 0xDF, 0xF2, 0xE8, 0x40, 0xD3, 0x21, 0xE8, 0x02, 0xD5, 0x99, 0xF0, + 0xCA, 0xC2, 0x31, 0xE1, 0x1A, 0xAB, 0xB7, 0xCA, 0x09, 0xA0, 0x4F, 0xBF, + 0x17, 0xA1, 0x31, 0xBD, 0x4A, 0xB0, 0x05, 0xC5, 0x95, 0xD4, 0x5C, 0xD5, + 0x7C, 0xEE, 0x03, 0xDC, 0x57, 0xF8, 0x4D, 0xE6, 0x0C, 0x01, 0x9B, 0xF6, + 0x82, 0x02, 0x76, 0xFA, 0x1D, 0x01, 0xCE, 0xF3, 0x8B, 0x01, 0x1B, 0xF4, + 0xEB, 0xF5, 0xF2, 0xF5, 0x52, 0xF1, 0x80, 0xF4, 0x44, 0xFA, 0x6D, 0xEB, + 0x5E, 0xF2, 0x53, 0xD0, 0x85, 0xEF, 0x97, 0xC7, 0xAF, 0xF0, 0xB2, 0xD3, + 0x3D, 0xE0, 0xF6, 0xDA, 0xEC, 0xD2, 0x9C, 0xE5, 0x77, 0xD9, 0x9A, 0xF0, + 0xD4, 0xDE, 0xD5, 0xEB, 0xD3, 0xE7, 0x8D, 0xF5, 0x87, 0xFE, 0x07, 0x0B, + 0x37, 0x02, 0x6C, 0xFF, 0xCF, 0xFB, 0xBB, 0xF0, 0x80, 0xF4, 0xB8, 0xF2, + 0x05, 0xD5, 0xA7, 0xE0, 0xD8, 0xAF, 0xED, 0xBD, 0x38, 0x9A, 0x87, 0xA4, + 0x74, 0x9E, 0xCC, 0xA7, 0x66, 0xBB, 0x49, 0xBE, 0x2C, 0xCE, 0x71, 0xCB, + 0x3B, 0xD0, 0x03, 0xD1, 0xCE, 0xDA, 0xF8, 0xE2, 0x94, 0xED, 0xBC, 0xFF, + 0x0B, 0xFB, 0x05, 0x14, 0x07, 0x07, 0xD9, 0x1F, 0x2E, 0x1A, 0xA2, 0x28, + 0x8D, 0x21, 0xBF, 0x1C, 0x20, 0x15, 0x7B, 0x06, 0xA2, 0xFE, 0xC4, 0xF2, + 0x30, 0xE8, 0xA8, 0xDC, 0x14, 0xF0, 0x8A, 0xDD, 0x15, 0x01, 0x71, 0xE3, + 0x97, 0x06, 0xC2, 0xE3, 0x8B, 0x07, 0x7F, 0xED, 0x9E, 0xFB, 0xBC, 0xF1, + 0xD0, 0xF5, 0x3A, 0xF2, 0x4E, 0xF8, 0xDF, 0xF0, 0x94, 0xF9, 0xB6, 0xF7, + 0xA2, 0xF2, 0x1C, 0xFC, 0x6E, 0xFD, 0x33, 0x0B, 0xDE, 0x16, 0x33, 0x20, + 0x67, 0x22, 0x22, 0x20, 0x7A, 0x32, 0x6D, 0x2C, 0xDA, 0x40, 0x22, 0x3F, + 0xE1, 0x2F, 0x19, 0x2E, 0x5F, 0x1C, 0x09, 0x1E, 0x35, 0x2E, 0xF3, 0x37, + 0xEE, 0x2E, 0xA6, 0x38, 0x40, 0x1E, 0xEA, 0x1B, 0xA8, 0x2A, 0x34, 0x18, + 0xFF, 0x34, 0xD0, 0x20, 0x1B, 0x1F, 0x0D, 0x12, 0x20, 0x13, 0x58, 0x08, + 0x46, 0x12, 0xE1, 0xFE, 0x5E, 0x16, 0x10, 0xF8, 0x2A, 0x25, 0xBC, 0x0E, + 0x11, 0x2C, 0x16, 0x27, 0x51, 0x34, 0x66, 0x35, 0x5E, 0x2F, 0xB7, 0x3A, + 0x7C, 0x0E, 0xB2, 0x28, 0x38, 0xE5, 0x48, 0x07, 0xEE, 0xCA, 0x59, 0xEF, + 0xE8, 0xBA, 0x2C, 0xD9, 0x8A, 0xC3, 0xF4, 0xD8, 0x1E, 0xE9, 0x9A, 0xFA, + 0x6F, 0xFE, 0x1C, 0x0E, 0xC2, 0x03, 0x61, 0x12, 0x91, 0x16, 0x72, 0x28, + 0xA4, 0x2B, 0x22, 0x3E, 0x05, 0x35, 0x48, 0x3D, 0x94, 0x3A, 0x40, 0x37, + 0x7A, 0x37, 0x12, 0x31, 0x4D, 0x27, 0xA8, 0x1E, 0x7F, 0x15, 0x61, 0x0A, + 0xFB, 0x0C, 0xB6, 0xFA, 0xE6, 0x06, 0x56, 0xF0, 0x34, 0xFE, 0x1D, 0xF5, + 0x94, 0xF9, 0xB8, 0xFA, 0x89, 0xF7, 0xC9, 0xF2, 0xAC, 0xFC, 0x5B, 0xF2, + 0xAC, 0xFE, 0x7B, 0xF2, 0x41, 0x00, 0x58, 0xF1, 0x69, 0x0A, 0xC7, 0xF7, + 0x37, 0x17, 0xF3, 0xFD, 0x5C, 0x13, 0xEE, 0xF7, 0xC1, 0x09, 0x79, 0xF7, + 0x8D, 0x1B, 0x25, 0x13, 0x63, 0x35, 0x95, 0x22, 0x6F, 0x4B, 0x4A, 0x28, + 0xEE, 0x55, 0x33, 0x39, 0x77, 0x3D, 0x33, 0x38, 0x48, 0x1A, 0x4B, 0x2D, + 0x0F, 0x17, 0x28, 0x37, 0xE3, 0x1B, 0xAE, 0x3B, 0xDB, 0x0B, 0x1E, 0x2A, + 0x58, 0x10, 0x15, 0x2E, 0x3F, 0x1A, 0x5E, 0x34, 0x3F, 0x09, 0x4E, 0x20, + 0x6D, 0x0B, 0x48, 0x1F, 0x92, 0x19, 0xB0, 0x2E, 0x28, 0x17, 0xE0, 0x33, + 0xA6, 0x28, 0x10, 0x4A, 0xC8, 0x42, 0x0C, 0x59, 0xCD, 0x3A, 0x76, 0x3E, + 0x9A, 0x27, 0xFD, 0x23, 0xD9, 0x16, 0x92, 0x0D, 0x37, 0xF7, 0xAC, 0xE2, + 0xAE, 0xDF, 0x62, 0xC6, 0xA8, 0xD7, 0x29, 0xC0, 0xC0, 0xD8, 0xAC, 0xC6, + 0xD2, 0xF3, 0x5A, 0xE7, 0xC5, 0x0B, 0xCF, 0x00, 0x4B, 0x0A, 0xC9, 0x08, + 0x17, 0x13, 0xD8, 0x1E, 0x4A, 0x27, 0xD8, 0x3B, 0x97, 0x2C, 0x70, 0x49, + 0xFE, 0x2C, 0xD5, 0x4C, 0xE7, 0x26, 0x55, 0x40, 0x5E, 0x1B, 0xC4, 0x2A, + 0xD7, 0x14, 0x15, 0x1C, 0x6D, 0x0C, 0x72, 0x0B, 0xC7, 0xF6, 0x7A, 0xEA, + 0x50, 0xE5, 0xB4, 0xD6, 0xB9, 0xEA, 0x86, 0xE4, 0x35, 0xEE, 0x2B, 0xEA, + 0xA3, 0xE5, 0x01, 0xE6, 0xC9, 0xDB, 0x8D, 0xE7, 0x24, 0xDF, 0x1D, 0xEC, + 0xDA, 0xE5, 0x01, 0xE7, 0x50, 0xEA, 0x6E, 0xE3, 0xA8, 0xE3, 0x9A, 0xE1, + 0xD6, 0xDD, 0x26, 0xE0, 0x1A, 0xF9, 0x8B, 0xED, 0x33, 0x1C, 0xD3, 0xFF, + 0xD3, 0x20, 0xE0, 0x05, 0x30, 0x16, 0x37, 0x01, 0xC7, 0x11, 0x8A, 0xFC, + 0xB7, 0x0B, 0x88, 0xFB, 0xE0, 0x07, 0x22, 0x01, 0x3A, 0xF8, 0xAA, 0xF2, + 0xCA, 0xDE, 0xC0, 0xD8, 0xDB, 0xE3, 0x8A, 0xE2, 0x2D, 0xE2, 0x76, 0xE9, + 0x6C, 0xC7, 0xD8, 0xD8, 0x30, 0xC4, 0xF0, 0xDD, 0xCA, 0xCF, 0x4A, 0xEC, + 0x23, 0xD0, 0x14, 0xEA, 0xA9, 0xD4, 0x1B, 0xEC, 0x5B, 0xDD, 0x79, 0xF6, + 0x60, 0xE2, 0x7F, 0xF6, 0x2F, 0xE5, 0x75, 0xE6, 0x4D, 0xDF, 0xD5, 0xD4, + 0x62, 0xC6, 0xDC, 0xC5, 0x79, 0xA6, 0xC7, 0xB2, 0x9D, 0xA2, 0x96, 0xA3, + 0xE3, 0xB7, 0x84, 0xA1, 0xD6, 0xCB, 0x86, 0xAF, 0xA5, 0xD7, 0x9A, 0xC1, + 0x6B, 0xE6, 0x67, 0xCE, 0x30, 0xF9, 0xA9, 0xDC, 0x2A, 0x04, 0x71, 0xE7, + 0x27, 0x0A, 0x89, 0xF0, 0xCC, 0x09, 0x6E, 0xF4, 0xA8, 0xFF, 0x15, 0xE9, + 0x92, 0xF3, 0x3E, 0xD8, 0xBB, 0xE7, 0xD3, 0xCB, 0x8E, 0xD8, 0x3C, 0xC8, + 0xCA, 0xC9, 0xC4, 0xD0, 0xBF, 0xC4, 0xD4, 0xDD, 0xAF, 0xD3, 0xFA, 0xEB, + 0x4E, 0xE9, 0xB9, 0xFE, 0xF1, 0xE2, 0x48, 0xFD, 0x08, 0xD6, 0xF6, 0xEB, + 0xA1, 0xE2, 0x51, 0xE8, 0xC3, 0xE8, 0x33, 0xE9, 0xF9, 0xE2, 0x8E, 0xEC, + 0x3C, 0xE4, 0xB7, 0xF4, 0x81, 0xEF, 0xA3, 0xFD, 0xF7, 0x07, 0xC9, 0x10, + 0x92, 0x17, 0x51, 0x21, 0xBA, 0x1C, 0x03, 0x27, 0x47, 0x20, 0x17, 0x24, + 0x66, 0x1C, 0x2E, 0x1C, 0x35, 0x19, 0x02, 0x15, 0x10, 0x18, 0x51, 0x08, + 0xBC, 0x11, 0x13, 0xFE, 0x20, 0x09, 0x08, 0xFC, 0xAD, 0x08, 0x18, 0x03, + 0x63, 0x0B, 0x66, 0x0A, 0xBB, 0x07, 0x61, 0x0B, 0x40, 0x0C, 0xBB, 0x18, + 0xC7, 0x10, 0x29, 0x24, 0x11, 0x0D, 0x28, 0x22, 0x86, 0x0D, 0x45, 0x27, + 0xD5, 0x0E, 0x34, 0x29, 0x98, 0x11, 0x23, 0x21, 0x85, 0x05, 0x88, 0x0E, + 0xEA, 0xE7, 0xCF, 0xE9, 0x3F, 0xD5, 0xC4, 0xC3, 0x89, 0xD4, 0x95, 0xAF, + 0x87, 0xD6, 0xFD, 0xB0, 0xC9, 0xEA, 0x0A, 0xD9, 0x38, 0x0E, 0x78, 0x0E, + 0x39, 0x26, 0xF4, 0x25, 0x59, 0x37, 0xEA, 0x36, 0x59, 0x41, 0x55, 0x4C, + 0x69, 0x3F, 0x41, 0x4C, 0x82, 0x3B, 0xEC, 0x3B, 0xEF, 0x36, 0xCC, 0x2B, + 0x43, 0x29, 0x84, 0x19, 0xA8, 0x1C, 0x9D, 0x0C, 0x01, 0x1B, 0xD9, 0x09, + 0x58, 0x20, 0xCE, 0x0A, 0x06, 0x22, 0xFA, 0x0C, 0xDC, 0x21, 0x6D, 0x14, + 0x65, 0x24, 0x80, 0x1B, 0x60, 0x1F, 0xB7, 0x13, 0x1D, 0x1A, 0x3C, 0x12, + 0xE0, 0x0B, 0x9D, 0x14, 0xD7, 0xFD, 0xC2, 0x17, 0x9C, 0x00, 0x77, 0x1B, + 0x8E, 0x0A, 0x1E, 0x16, 0x79, 0x13, 0x06, 0x13, 0x6B, 0x1A, 0xCA, 0x1D, + 0x7F, 0x2A, 0xB4, 0x36, 0xD2, 0x33, 0xC8, 0x3E, 0xE6, 0x2F, 0xCB, 0x38, + 0x3B, 0x2C, 0xD0, 0x3C, 0xC6, 0x21, 0x9C, 0x3D, 0xB7, 0x12, 0xAB, 0x31, + 0x61, 0x03, 0x02, 0x1B, 0xBC, 0xF7, 0x43, 0x02, 0x5F, 0xF9, 0x18, 0xFD, + 0x6B, 0xFA, 0x8C, 0xFC, 0x7B, 0xFC, 0x43, 0xF4, 0x4F, 0x16, 0x50, 0xFF, + 0x17, 0x2E, 0x8B, 0x0B, 0xE4, 0x37, 0xA7, 0x10, 0x13, 0x41, 0x28, 0x23, + 0x7C, 0x37, 0x50, 0x2B, 0x1B, 0x1B, 0x9F, 0x17, 0x3B, 0x08, 0x57, 0x06, + 0x41, 0xFC, 0xC8, 0xFD, 0x7E, 0xDA, 0xBD, 0xDD, 0x4A, 0xC2, 0x7D, 0xC5, + 0x5C, 0xCA, 0x3D, 0xCF, 0xDF, 0xD5, 0x8A, 0xDC, 0xC7, 0xE4, 0x44, 0xF1, + 0x2E, 0x01, 0xD9, 0x11, 0x24, 0x23, 0xF8, 0x28, 0x87, 0x37, 0x38, 0x2E, + 0xF8, 0x3B, 0xA0, 0x2D, 0x97, 0x3B, 0x48, 0x2E, 0xB3, 0x2E, 0x41, 0x27, + 0x50, 0x17, 0xAB, 0x15, 0x7C, 0x05, 0x83, 0x04, 0xEB, 0xF8, 0xEC, 0xF8, + 0xD1, 0xEB, 0xE1, 0xE8, 0xFC, 0xE3, 0x4A, 0xDB, 0x7A, 0xEC, 0x90, 0xDE, + 0x5E, 0xF9, 0x1C, 0xE9, 0x06, 0xF7, 0xCC, 0xEB, 0x9A, 0xF9, 0x83, 0xF9, + 0x39, 0xFC, 0x76, 0x08, 0x58, 0xEC, 0x95, 0x00, 0xFA, 0xE1, 0x4F, 0xF7, + 0x6E, 0xDD, 0x62, 0xF0, 0x6B, 0xD9, 0x11, 0xE5, 0x19, 0xE7, 0x51, 0xE4, + 0x89, 0xF9, 0x64, 0xF0, 0xE4, 0xFB, 0xC8, 0xF5, 0x2E, 0xFC, 0xBF, 0xF8, + 0x9D, 0xF9, 0x8C, 0xFA, 0x5F, 0xEF, 0x0C, 0xF8, 0x67, 0xEE, 0x46, 0xF9, + 0xEA, 0xE1, 0x0D, 0xE5, 0x5B, 0xC8, 0x22, 0xC8, 0x8F, 0xC6, 0xDD, 0xCB, + 0x6A, 0xC9, 0x10, 0xD5, 0xED, 0xB8, 0x46, 0xCA, 0x5D, 0xB8, 0xBD, 0xCC, + 0xD5, 0xCC, 0xCA, 0xE1, 0x81, 0xE1, 0x22, 0xF1, 0x1E, 0xF7, 0xF7, 0xF8, + 0xA3, 0x00, 0xAA, 0xFB, 0x02, 0xFB, 0xC7, 0xF8, 0x96, 0xF1, 0x6C, 0xEC, + 0x12, 0xD8, 0x1D, 0xCE, 0xA3, 0xB3, 0x7C, 0xAC, 0x2C, 0xA6, 0xB2, 0x9F, + 0x42, 0xAE, 0x4F, 0xA0, 0x53, 0xC6, 0x93, 0xAE, 0xFD, 0xE8, 0x1B, 0xCE, + 0xC2, 0x01, 0x83, 0xEC, 0x47, 0x0B, 0x66, 0x04, 0x53, 0x11, 0xC5, 0x19, + 0xFF, 0x10, 0x13, 0x1E, 0x34, 0x05, 0xF0, 0x10, 0x84, 0x02, 0x7A, 0x08, + 0x38, 0x00, 0x14, 0x00, 0xAD, 0xEE, 0x19, 0xEC, 0xC2, 0xE8, 0x20, 0xE0, + 0x3F, 0xF4, 0x05, 0xE2, 0xFE, 0xF6, 0x24, 0xE4, 0xE0, 0xF4, 0x2C, 0xEC, + 0xC0, 0xF8, 0xAA, 0xF8, 0x9D, 0xFA, 0x09, 0xFF, 0x23, 0x02, 0x05, 0x0A, + 0x52, 0x04, 0x80, 0x08, 0x07, 0xF8, 0x2F, 0xF3, 0xE3, 0xF0, 0xAD, 0xED, + 0x6E, 0xE8, 0xF6, 0xF0, 0x35, 0xE5, 0xA4, 0xF7, 0x34, 0x03, 0x9E, 0x12, + 0xDD, 0x23, 0x91, 0x25, 0x82, 0x2C, 0xCE, 0x2B, 0xA8, 0x39, 0x1D, 0x39, + 0x9B, 0x45, 0x24, 0x37, 0x65, 0x40, 0xF3, 0x2B, 0x8D, 0x31, 0x9B, 0x29, + 0xA7, 0x18, 0x84, 0x1E, 0x36, 0x00, 0x4F, 0x0A, 0x04, 0x03, 0xA4, 0x0A, + 0x3F, 0x16, 0x85, 0x14, 0x4B, 0x12, 0xDC, 0x05, 0x79, 0x08, 0xB1, 0xFE, + 0x50, 0x0F, 0xE8, 0x11, 0xC5, 0x18, 0xE1, 0x24, 0xA2, 0x12, 0xE8, 0x29, + 0x06, 0x05, 0x25, 0x2A, 0x29, 0x05, 0xE9, 0x29, 0xEB, 0x04, 0xC1, 0x15, + 0xE9, 0xF2, 0x5E, 0xEE, 0xB0, 0xE1, 0x58, 0xDF, 0x4D, 0xD2, 0x62, 0xDD, + 0xA9, 0xC0, 0x20, 0xC6, 0xA4, 0xD8, 0x29, 0xCF, 0x2C, 0x03, 0x5C, 0xF7, + 0x71, 0x14, 0xB1, 0x0E, 0x35, 0x2D, 0xC1, 0x24, 0xC2, 0x50, 0xCA, 0x42, + 0x18, 0x54, 0x95, 0x46, 0x96, 0x3D, 0x89, 0x31, 0x10, 0x26, 0x60, 0x20, + 0xDE, 0x03, 0x0B, 0x03, 0xD6, 0xEC, 0x9B, 0xE5, 0x4F, 0xE9, 0xEC, 0xDE, + 0x39, 0xE7, 0x73, 0xE3, 0x55, 0xE9, 0x5E, 0xE5, 0xD1, 0xEA, 0xB5, 0xDF, + 0x6A, 0xED, 0xD0, 0xE3, 0xF1, 0xEA, 0xC4, 0xEF, 0x53, 0xE1, 0xEB, 0xF2, + 0x80, 0xE0, 0xAB, 0xEE, 0x2D, 0xED, 0xF7, 0xF0, 0xA8, 0xF0, 0xC1, 0xF2, + 0x8D, 0xE3, 0x2E, 0xEE, 0x1C, 0xEF, 0x54, 0xFD, 0x40, 0x01, 0x09, 0x0B, + 0xD0, 0x03, 0x9A, 0x0A, 0xEB, 0x12, 0x68, 0x14, 0x3C, 0x1B, 0x84, 0x19, + 0x2D, 0x05, 0xE1, 0x01, 0xF0, 0xFC, 0x81, 0xF0, 0xED, 0x09, 0xD8, 0xF7, + 0x56, 0x01, 0x47, 0xF9, 0xF2, 0xEB, 0x29, 0xF4, 0xD4, 0xEE, 0x95, 0x00, + 0xAD, 0xFA, 0x99, 0x0E, 0x1D, 0xFC, 0x64, 0x0C, 0x87, 0x09, 0x51, 0x13, + 0x74, 0x19, 0xAB, 0x22, 0x9E, 0x20, 0xD9, 0x32, 0x39, 0x23, 0x3A, 0x40, + 0x77, 0x1E, 0x65, 0x44, 0x57, 0x1C, 0xDD, 0x42, 0x68, 0x05, 0x0B, 0x21, + 0x26, 0xD9, 0x89, 0xEA, 0x87, 0xBC, 0xAE, 0xC1, 0xA5, 0xBD, 0xD0, 0xB1, + 0x6D, 0xCD, 0xD7, 0xB2, 0x49, 0xF0, 0xBC, 0xCC, 0xAE, 0x17, 0x45, 0xF4, + 0xD7, 0x2D, 0xA1, 0x12, 0xA8, 0x4E, 0x2E, 0x40, 0x1A, 0x63, 0x07, 0x5E, + 0xDA, 0x4D, 0x4F, 0x4C, 0x74, 0x2E, 0x52, 0x2B, 0x28, 0x18, 0xEB, 0x0D, + 0x06, 0x02, 0xA7, 0xF6, 0x16, 0xEC, 0x28, 0xEB, 0x9C, 0xE6, 0xDA, 0xEB, + 0x64, 0xFB, 0xFF, 0xF8, 0xF4, 0x19, 0x9A, 0x08, 0x7D, 0x2A, 0x2D, 0x0F, + 0x50, 0x25, 0x48, 0x12, 0x7E, 0x17, 0xB8, 0x13, 0xD5, 0x08, 0x09, 0x0A, + 0xAE, 0x00, 0x13, 0x01, 0xA7, 0xFF, 0x97, 0x05, 0xCF, 0xEB, 0xDC, 0xFD, + 0xF3, 0xCE, 0x32, 0xE4, 0xE9, 0xDA, 0x2E, 0xE7, 0x94, 0x02, 0x58, 0x00, + 0x28, 0x18, 0x5C, 0x0E, 0x07, 0x22, 0x04, 0x20, 0xE9, 0x1F, 0xBF, 0x22, + 0x41, 0x12, 0xB6, 0x0F, 0x76, 0x07, 0x57, 0x06, 0x73, 0xF7, 0x45, 0x02, + 0x7E, 0xEC, 0x85, 0xFD, 0xCC, 0xF3, 0xF9, 0xFC, 0x46, 0xFD, 0xE9, 0xFB, + 0x2B, 0xFD, 0xC1, 0xF8, 0x6A, 0xF7, 0x01, 0xEE, 0x35, 0xF6, 0x28, 0xE1, + 0xBF, 0xFC, 0x48, 0xE3, 0x69, 0x09, 0x63, 0xF9, 0xA1, 0x04, 0x03, 0x01, + 0xAC, 0xF6, 0x12, 0xF6, 0x3D, 0xF1, 0x92, 0xF2, 0x5C, 0xDA, 0x25, 0xDE, + 0x3D, 0xBF, 0x51, 0xBE, 0xC4, 0xAB, 0xA3, 0xAB, 0xE5, 0x9D, 0x63, 0xA4, + 0xE5, 0xA2, 0xF6, 0xA9, 0xA3, 0xB9, 0x77, 0xBE, 0xF9, 0xD7, 0x74, 0xE2, + 0x40, 0xF5, 0xB8, 0x0A, 0x7E, 0x0D, 0xAC, 0x25, 0x80, 0x14, 0xAF, 0x26, + 0x64, 0x08, 0xD1, 0x0F, 0xA4, 0xF3, 0xBC, 0xEA, 0x75, 0xE4, 0x86, 0xCD, + 0xE4, 0xD4, 0x8C, 0xBC, 0xDE, 0xBF, 0xEE, 0xAF, 0x08, 0xC2, 0x6B, 0xB5, + 0xAC, 0xE4, 0xCB, 0xCB, 0xAA, 0xF8, 0x17, 0xD6, 0x04, 0xEE, 0x56, 0xD4, + 0x30, 0xEF, 0xD8, 0xE2, 0x25, 0xED, 0x27, 0xEC, 0xE1, 0xDD, 0x3B, 0xEA, + 0x37, 0xD4, 0xF3, 0xED, 0x08, 0xDA, 0x05, 0xF8, 0x56, 0xEC, 0x2F, 0x02, + 0xB0, 0x00, 0xB4, 0x0B, 0xC6, 0x22, 0x14, 0x25, 0x93, 0x3D, 0x08, 0x3D, + 0xFC, 0x43, 0x3B, 0x44, 0xFD, 0x42, 0x4D, 0x43, 0xC1, 0x32, 0x02, 0x36, + 0x33, 0x22, 0x5E, 0x27, 0x7A, 0x1B, 0x76, 0x20, 0xFE, 0x11, 0x51, 0x1B, + 0x8E, 0x0E, 0x78, 0x16, 0x01, 0x19, 0x9A, 0x11, 0xEB, 0x24, 0x15, 0x11, + 0xD9, 0x24, 0xD7, 0x12, 0xEE, 0x29, 0x63, 0x1E, 0xB2, 0x38, 0x0B, 0x2E, + 0xCB, 0x3F, 0x23, 0x39, 0x4F, 0x39, 0xE1, 0x3B, 0xCB, 0x34, 0xCB, 0x36, + 0xF2, 0x33, 0xA7, 0x2A, 0xE6, 0x1B, 0x73, 0x08, 0x46, 0xF5, 0xF2, 0xE6, + 0x54, 0xCF, 0xC3, 0xCE, 0x05, 0xBB, 0x6A, 0xBD, 0x20, 0xC9, 0x6C, 0xC6, + 0x20, 0xF0, 0xDF, 0xE4, 0x17, 0x20, 0x76, 0x0B, 0x2D, 0x45, 0x1B, 0x33, + 0x39, 0x5A, 0x2F, 0x57, 0x10, 0x60, 0x60, 0x68, 0x9F, 0x51, 0x05, 0x5F, + 0xC3, 0x2E, 0x88, 0x46, 0xFA, 0x08, 0x98, 0x29, 0x94, 0xF6, 0x81, 0x0F, + 0xC4, 0xEC, 0xC3, 0xF9, 0xAD, 0xE8, 0x27, 0xF4, 0xBB, 0xEF, 0xE4, 0xFD, + 0x0E, 0xF6, 0x18, 0x08, 0xD3, 0xFD, 0xB1, 0x10, 0x2C, 0x13, 0x67, 0x22, + 0x52, 0x1D, 0xD7, 0x26, 0x49, 0x18, 0x58, 0x17, 0xE7, 0x0C, 0xC5, 0x04, + 0xC5, 0xF9, 0xE4, 0xEF, 0xED, 0xF9, 0xE4, 0xE9, 0x1C, 0x15, 0xB7, 0xF9, + 0x90, 0x28, 0xAC, 0x08, 0x6F, 0x31, 0xBA, 0x17, 0x49, 0x40, 0x80, 0x2A, + 0xAE, 0x43, 0x17, 0x31, 0x78, 0x3B, 0x83, 0x33, 0x48, 0x2A, 0xC6, 0x2E, + 0xD9, 0x10, 0x11, 0x1F, 0x6E, 0x05, 0x2B, 0x11, 0x05, 0x0A, 0x57, 0x02, + 0xAC, 0x09, 0xD2, 0xF4, 0x39, 0x10, 0x9F, 0xFE, 0xBD, 0x1A, 0x89, 0x0A, + 0x03, 0x1D, 0x02, 0x07, 0x2D, 0x25, 0x91, 0x10, 0xB7, 0x20, 0x95, 0x1D, + 0x6A, 0x0A, 0xAA, 0x1B, 0xBB, 0xF7, 0x9D, 0x11, 0xE3, 0xF6, 0x79, 0x0E, + 0x31, 0xED, 0xDB, 0x04, 0xE5, 0xD2, 0x87, 0xF2, 0x6D, 0xC1, 0xB3, 0xD9, + 0x98, 0xB1, 0x5E, 0xAF, 0x32, 0xB5, 0x9D, 0xA0, 0x0D, 0xCD, 0x68, 0xB6, + 0x99, 0xED, 0xA7, 0xDE, 0x74, 0x13, 0x7D, 0x0C, 0x94, 0x2E, 0x06, 0x28, + 0x86, 0x3B, 0x25, 0x39, 0x33, 0x37, 0x04, 0x48, 0x91, 0x1D, 0x98, 0x42, + 0x01, 0xF9, 0x09, 0x20, 0x07, 0xDB, 0xBC, 0xF6, 0x98, 0xD2, 0x08, 0xE5, + 0xB2, 0xD7, 0xF0, 0xE3, 0xDF, 0xD8, 0x06, 0xE1, 0x80, 0xE7, 0x3F, 0xE8, + 0xF4, 0x01, 0xDA, 0xF5, 0xD9, 0x10, 0xE8, 0x04, 0xF3, 0x0F, 0xF5, 0x11, + 0x49, 0xFF, 0x06, 0x0F, 0x93, 0xE0, 0xA7, 0xFB, 0x13, 0xC5, 0xEF, 0xE0, + 0xB4, 0xC1, 0xB6, 0xD1, 0x14, 0xC8, 0x7B, 0xCE, 0xC7, 0xD5, 0xF2, 0xD9, + 0xC5, 0xF6, 0x7B, 0xF2, 0xA8, 0x1C, 0x51, 0x06, 0xEE, 0x2F, 0x85, 0x0D, + 0xC6, 0x2B, 0xDD, 0x07, 0x1C, 0x13, 0x7D, 0xF5, 0x0C, 0xF3, 0xCE, 0xE0, + 0x1F, 0xF0, 0xB8, 0xE0, 0x3F, 0xF6, 0x65, 0xE1, 0xF0, 0xE8, 0xD9, 0xCD, + 0xAD, 0xEB, 0x3D, 0xC6, 0x53, 0x01, 0xD7, 0xD8, 0x31, 0xFF, 0xEB, 0xE2, + 0xE9, 0xF1, 0x2E, 0xE5, 0x14, 0xF4, 0xA5, 0xF1, 0xAE, 0xFE, 0x25, 0xFF, + 0x31, 0x0C, 0xB1, 0x09, 0x1C, 0x0D, 0xB4, 0x0B, 0xC8, 0xFC, 0xCD, 0x0C, + 0xDE, 0xE1, 0xA4, 0x08, 0x97, 0xC6, 0x8A, 0xF6, 0x32, 0xB1, 0x97, 0xE3, + 0x79, 0xA3, 0x63, 0xD3, 0x47, 0xA2, 0x0D, 0xC6, 0x24, 0xB2, 0xF2, 0xC9, + 0xF3, 0xD6, 0x2D, 0xE3, 0xF2, 0x00, 0xD5, 0x01, 0x04, 0x1A, 0x16, 0x19, + 0x14, 0x2A, 0x02, 0x2C, 0x66, 0x36, 0xE9, 0x33, 0xA3, 0x2E, 0x7F, 0x1D, + 0xC4, 0x14, 0x88, 0xF3, 0x11, 0xFC, 0xB1, 0xD5, 0xB3, 0xED, 0xE8, 0xCE, + 0xEA, 0xE4, 0x0E, 0xCD, 0xE2, 0xE7, 0x8E, 0xCC, 0x71, 0xF1, 0x66, 0xDB, + 0xF3, 0xED, 0x73, 0xED, 0xE9, 0xEB, 0xC6, 0xF5, 0x63, 0xE8, 0xEF, 0xEE, + 0xC0, 0xE0, 0x3A, 0xE8, 0xDE, 0xDA, 0x90, 0xE6, 0x16, 0xD8, 0xF2, 0xE4, + 0xB3, 0xDE, 0x51, 0xE4, 0x20, 0xEA, 0x22, 0xE1, 0xC7, 0xFC, 0x09, 0xE9, + 0xEC, 0x18, 0x3C, 0x06, 0xF1, 0x2E, 0x34, 0x22, 0x2E, 0x35, 0x19, 0x27, + 0x97, 0x2C, 0x65, 0x1B, 0xA2, 0x0F, 0xCF, 0x06, 0x1B, 0xEC, 0xE7, 0xFA, + 0xA4, 0xD0, 0xE7, 0xF6, 0xC5, 0xD2, 0x5F, 0xF3, 0x75, 0xEB, 0x37, 0xF3, + 0x62, 0xFC, 0xE9, 0xFA, 0x5C, 0x00, 0xA5, 0x02, 0x36, 0x00, 0x0E, 0x04, + 0x37, 0x01, 0x03, 0x07, 0xB6, 0x06, 0x41, 0x0E, 0xB9, 0x11, 0x73, 0x17, + 0x05, 0x18, 0x8D, 0x1C, 0x34, 0x11, 0x4F, 0x19, 0x36, 0x01, 0xBE, 0x0B, + 0xD5, 0xF7, 0xF0, 0xFB, 0xB9, 0xE7, 0xF9, 0xE1, 0xAF, 0xCF, 0x53, 0xC7, + 0xAA, 0xC7, 0x76, 0xC8, 0x4E, 0xD5, 0x01, 0xDD, 0xBB, 0xF5, 0xAC, 0xFC, + 0xAE, 0x1E, 0xB9, 0x2D, 0x3E, 0x3C, 0x1D, 0x55, 0x4B, 0x4A, 0x0C, 0x61, + 0xD2, 0x47, 0xF3, 0x5D, 0x55, 0x32, 0x27, 0x4E, 0xF1, 0x18, 0x05, 0x33, + 0x98, 0x03, 0x65, 0x12, 0x5D, 0xF3, 0xB2, 0xF8, 0xC9, 0xE7, 0xBB, 0xE7, + 0xA1, 0xED, 0x09, 0xE1, 0xF9, 0x0E, 0xC6, 0xEE, 0xCB, 0x33, 0xF0, 0x03, + 0x89, 0x3F, 0x01, 0x0E, 0xE8, 0x30, 0x0F, 0x0B, 0xFF, 0x21, 0xD8, 0x08, + 0xAE, 0x0C, 0xDD, 0xFD, 0x52, 0xF2, 0x5D, 0xE6, 0xCF, 0xEC, 0x55, 0xD5, + 0xF0, 0xF6, 0x8D, 0xD2, 0x38, 0x07, 0x3F, 0xE1, 0xA7, 0x1D, 0x1C, 0xFD, + 0x80, 0x34, 0x40, 0x1E, 0xA0, 0x36, 0xDF, 0x30, 0x1E, 0x28, 0xFC, 0x32, + 0xFD, 0x13, 0x7C, 0x25, 0xFD, 0x07, 0xBF, 0x1A, 0xE8, 0x05, 0x2A, 0x20, + 0xD5, 0xFB, 0x33, 0x1C, 0xDF, 0xF3, 0xB6, 0x11, 0xC4, 0x00, 0x31, 0x18, + 0x2D, 0x0D, 0xD5, 0x1E, 0x17, 0xFE, 0x72, 0x0B, 0x62, 0xF7, 0x1A, 0x00, + 0x44, 0xF6, 0x04, 0x02, 0x28, 0xE9, 0xB7, 0xFF, 0x41, 0xE5, 0xD5, 0x02, + 0x2A, 0xE1, 0xEF, 0xFD, 0x0C, 0xDE, 0xFA, 0xF5, 0xE5, 0xDF, 0xE7, 0xF3, + 0x4B, 0xD3, 0x12, 0xE3, 0x31, 0xCE, 0xCD, 0xD1, 0x32, 0xDD, 0xE4, 0xD1, + 0x9D, 0xE8, 0x8D, 0xD4, 0xDE, 0xFC, 0x41, 0xE8, 0x4D, 0x23, 0xB5, 0x13, + 0xC2, 0x3D, 0x5A, 0x2E, 0xB8, 0x41, 0xD0, 0x2D, 0xEC, 0x46, 0xA4, 0x2D, + 0x21, 0x45, 0x20, 0x29, 0x8D, 0x36, 0xB7, 0x1B, 0x8B, 0x1E, 0xB7, 0x09, + 0xF6, 0x09, 0xA1, 0x00, 0x1C, 0x06, 0x69, 0x06, 0x36, 0x06, 0xCF, 0x03, + 0x39, 0x0E, 0x6D, 0x01, 0x4A, 0x1D, 0xAB, 0x0B, 0xA5, 0x27, 0x2E, 0x1A, + 0xD0, 0x1C, 0x2D, 0x1A, 0x7E, 0x07, 0xEB, 0x0E, 0x72, 0xFA, 0xE2, 0x0A, + 0x8D, 0xEC, 0x66, 0xFF, 0x9C, 0xE7, 0xED, 0xF5, 0x41, 0xF2, 0x7B, 0xFE, + 0xB9, 0x04, 0x04, 0x0B, 0x90, 0x1C, 0xEC, 0x19, 0x01, 0x36, 0xC3, 0x2C, + 0x03, 0x41, 0x4B, 0x37, 0x75, 0x3D, 0x8C, 0x39, 0x8A, 0x2B, 0x37, 0x30, + 0xA4, 0x14, 0xB3, 0x22, 0x36, 0x0A, 0x84, 0x1A, 0xCA, 0xFD, 0x21, 0x09, + 0xD3, 0xED, 0x5B, 0xF6, 0x11, 0xEE, 0x31, 0xFA, 0xEC, 0xF7, 0xCC, 0x07, + 0x32, 0xF7, 0x25, 0x0A, 0xC0, 0xF1, 0x0D, 0x09, 0xDA, 0xF6, 0x3E, 0x13, + 0xCB, 0xF9, 0xB4, 0x17, 0xC3, 0xF8, 0x5A, 0x12, 0x3F, 0xF8, 0x97, 0x0F, + 0x77, 0xED, 0xE4, 0x00, 0x0E, 0xDC, 0xF0, 0xEA, 0x11, 0xC2, 0xD4, 0xC9, + 0x8F, 0xAB, 0xC6, 0xA8, 0xF5, 0xA9, 0xA5, 0xA2, 0x42, 0xB5, 0x16, 0xAD, + 0xF8, 0xCA, 0x18, 0xC4, 0x61, 0xEC, 0x33, 0xE9, 0xC9, 0x06, 0x90, 0x02, + 0x71, 0x0C, 0xC0, 0xFE, 0x26, 0x0E, 0x0E, 0xF8, 0x11, 0x0D, 0x22, 0xF1, + 0xAC, 0xFC, 0xFB, 0xD6, 0x8E, 0xE9, 0x35, 0xBC, 0x2C, 0xE0, 0xAA, 0xBB, + 0x40, 0xD7, 0x46, 0xBE, 0x77, 0xD4, 0x83, 0xBC, 0x58, 0xE3, 0xB3, 0xC7, + 0x7D, 0xFD, 0x3B, 0xDB, 0xFE, 0x08, 0x19, 0xEA, 0xBA, 0xF1, 0xAA, 0xE7, + 0xF6, 0xD6, 0x7F, 0xE2, 0x6E, 0xC2, 0xD4, 0xD7, 0x8B, 0xAA, 0xA3, 0xBF, + 0xB2, 0xA5, 0x52, 0xB3, 0xFB, 0xB8, 0xEF, 0xBD, 0xEC, 0xD2, 0x3B, 0xD1, + 0x62, 0xF5, 0x3A, 0xF0, 0x3B, 0x17, 0x7E, 0x14, 0x73, 0x1D, 0x68, 0x22, + 0xA7, 0x12, 0xC4, 0x1C, 0xB8, 0x02, 0x14, 0x0B, 0x6F, 0xF6, 0x85, 0x04, + 0x62, 0xF4, 0x5F, 0x0D, 0x94, 0xF1, 0xCC, 0x0B, 0xFA, 0xF0, 0x11, 0x02, + 0xD1, 0x00, 0x13, 0x01, 0xCB, 0x0E, 0x0E, 0x04, 0xFD, 0x10, 0xEB, 0x02, + 0x42, 0x13, 0xB7, 0xFF, 0x65, 0x16, 0x9C, 0x01, 0xC3, 0x16, 0x2A, 0x0B, + 0x42, 0x0F, 0x58, 0x0F, 0x76, 0xFC, 0x6D, 0x08, 0x29, 0xE9, 0xD9, 0xFB, + 0xD3, 0xE0, 0x47, 0xEB, 0xB5, 0xD9, 0xEB, 0xD1, 0x70, 0xDB, 0x3B, 0xCC, + 0xCC, 0xEB, 0x93, 0xE5, 0xC3, 0xFB, 0xD5, 0x01, 0x25, 0x0B, 0xC1, 0x1C, + 0xD2, 0x23, 0x73, 0x38, 0xDC, 0x31, 0xEC, 0x42, 0xBE, 0x26, 0xE7, 0x3C, + 0xB9, 0x16, 0x5D, 0x36, 0x3C, 0x01, 0x1F, 0x21, 0x9C, 0xEF, 0x70, 0x05, + 0xA6, 0xEF, 0x36, 0xF4, 0x0D, 0xF8, 0xAA, 0xF1, 0x0E, 0x06, 0x18, 0xFE, + 0xBA, 0x1B, 0x1A, 0x08, 0x99, 0x32, 0x6B, 0x0A, 0xF4, 0x3B, 0x88, 0x0C, + 0xEF, 0x32, 0xB8, 0x14, 0x6E, 0x27, 0x62, 0x1B, 0xDA, 0x1B, 0x23, 0x19, + 0x3B, 0x08, 0x28, 0x13, 0x14, 0xF9, 0x81, 0x11, 0xA6, 0xF3, 0xEE, 0x0F, + 0xB1, 0xF1, 0xE6, 0x07, 0xF2, 0x03, 0x83, 0x0F, 0xC6, 0x29, 0x36, 0x2B, + 0x3B, 0x47, 0x78, 0x42, 0x05, 0x51, 0x62, 0x50, 0x8E, 0x4D, 0xAC, 0x54, + 0xB0, 0x45, 0x26, 0x4A, 0xD4, 0x3A, 0x94, 0x3D, 0x82, 0x2E, 0x99, 0x3A, + 0x94, 0x21, 0x6C, 0x32, 0xDC, 0x1F, 0xC4, 0x25, 0x83, 0x2C, 0x64, 0x23, + 0xDE, 0x2C, 0x7F, 0x1E, 0xE0, 0x25, 0xFC, 0x17, 0x07, 0x28, 0xD0, 0x15, + 0xF1, 0x26, 0xB2, 0x14, 0xD3, 0x22, 0xC4, 0x17, 0x98, 0x1E, 0x6E, 0x19, + 0xA4, 0x14, 0x1E, 0x13, 0xB4, 0x0A, 0x4A, 0x0E, 0x80, 0xFA, 0x51, 0x04, + 0x19, 0xEC, 0xD9, 0xEB, 0x1F, 0xED, 0xD7, 0xD8, 0xF6, 0xEE, 0x11, 0xD7, + 0x6B, 0xEF, 0xB9, 0xE3, 0xDA, 0xF9, 0xA6, 0xFB, 0xD0, 0x04, 0x0C, 0x10, + 0xAC, 0x07, 0x46, 0x19, 0xA2, 0x0E, 0x5A, 0x1D, 0x7C, 0x19, 0xD9, 0x1A, + 0x75, 0x17, 0x52, 0x11, 0xF8, 0x07, 0xB2, 0x00, 0x9E, 0xFD, 0x08, 0xF4, + 0x70, 0xF4, 0xCE, 0xF0, 0x76, 0xE7, 0xA8, 0xF2, 0x3A, 0xE7, 0xC2, 0xF3, + 0xD2, 0xF0, 0xAB, 0xF2, 0x3A, 0xF7, 0x1C, 0xF7, 0xDC, 0xEF, 0xCC, 0xFD, + 0x20, 0xDF, 0xD2, 0xFB, 0xD7, 0xD0, 0x07, 0xEF, 0xA7, 0xCD, 0x6B, 0xE7, + 0x06, 0xD8, 0x06, 0xE9, 0xA1, 0xE6, 0x39, 0xEB, 0x1D, 0xF9, 0x43, 0xEC, + 0x42, 0x11, 0xE9, 0xF6, 0xD4, 0x1A, 0x69, 0x04, 0xDB, 0x17, 0x0F, 0x07, + 0x72, 0x18, 0xF5, 0x04, 0x40, 0x12, 0x23, 0xFB, 0x57, 0x00, 0xAA, 0xEC, + 0x34, 0xF0, 0xD0, 0xED, 0x14, 0xE4, 0x32, 0xF8, 0x8D, 0xDE, 0xF4, 0xF9, + 0x29, 0xEF, 0xB6, 0xFA, 0x64, 0x07, 0x32, 0xFD, 0xC2, 0x0C, 0x76, 0xFA, + 0xB5, 0x03, 0x53, 0xF5, 0x51, 0xFA, 0x64, 0xEE, 0x62, 0xF4, 0x6E, 0xE9, + 0xF7, 0xEF, 0x9F, 0xE4, 0x0E, 0xEA, 0xC3, 0xDC, 0x48, 0xE6, 0xF2, 0xD7, + 0xAE, 0xE6, 0xF3, 0xDA, 0x7E, 0xDA, 0xBD, 0xD7, 0xD4, 0xCB, 0xCE, 0xCF, + 0xC8, 0xC7, 0x4C, 0xD1, 0xDF, 0xCE, 0xD4, 0xD9, 0x5E, 0xE3, 0x6E, 0xE5, + 0x33, 0xF5, 0xD2, 0xF5, 0xED, 0xFC, 0x92, 0x03, 0x02, 0xFF, 0xF4, 0xFF, + 0x86, 0xF9, 0xE6, 0xF2, 0xB6, 0xEF, 0x60, 0xED, 0x0E, 0xE8, 0xD4, 0xEE, + 0x9F, 0xE1, 0xA6, 0xF2, 0xA0, 0xDE, 0x68, 0xF9, 0x12, 0xE2, 0xCA, 0xFF, + 0xA0, 0xE9, 0x46, 0x02, 0xDF, 0xEC, 0xC3, 0x03, 0xFF, 0xF5, 0xA9, 0x03, + 0x97, 0x05, 0x76, 0x01, 0x6C, 0x02, 0x57, 0xFB, 0x26, 0xEE, 0xEC, 0xEF, + 0x93, 0xDB, 0x2D, 0xE4, 0xEB, 0xCB, 0x2A, 0xD8, 0xA2, 0xC6, 0x49, 0xCE, + 0x4B, 0xD3, 0xF4, 0xD1, 0x45, 0xE6, 0xB1, 0xDF, 0x2E, 0xF5, 0x5D, 0xED, + 0xBE, 0xF7, 0x50, 0xF7, 0xC4, 0xF1, 0x0B, 0x02, 0xAD, 0xE8, 0xCA, 0x04, + 0xEA, 0xE8, 0x1C, 0xFA, 0x06, 0xFC, 0xEE, 0xF1, 0x0D, 0x0B, 0xCB, 0xF0, + 0x73, 0x0E, 0xBE, 0xF2, 0x4D, 0x12, 0xED, 0xF6, 0x99, 0x10, 0xDA, 0xF5, + 0x42, 0x06, 0x73, 0xEF, 0x04, 0x01, 0x5B, 0xF1, 0xFE, 0x04, 0x70, 0xF4, + 0x50, 0x08, 0x77, 0xF3, 0x9B, 0x0D, 0x94, 0xFB, 0x30, 0x10, 0xF3, 0x04, + 0xF9, 0x03, 0xAB, 0x02, 0x3C, 0xFB, 0x08, 0xFF, 0xC0, 0xFB, 0xCE, 0xFE, + 0xE9, 0xF2, 0x5D, 0xFC, 0xB8, 0xE8, 0xC8, 0xFB, 0xA5, 0xF0, 0xB1, 0xFF, + 0x29, 0x03, 0x72, 0x01, 0x9E, 0x0C, 0x59, 0x01, 0x47, 0x09, 0x11, 0x06, + 0xB4, 0x07, 0xCA, 0x0D, 0x7B, 0x09, 0x10, 0x10, 0x21, 0x07, 0x74, 0x0A, + 0x74, 0x04, 0x94, 0x05, 0x33, 0x07, 0x80, 0x07, 0xFF, 0x10, 0x39, 0x08, + 0x26, 0x1B, 0xA3, 0x02, 0xA6, 0x21, 0x03, 0x00, 0xCA, 0x23, 0xD9, 0x01, + 0x15, 0x1F, 0x71, 0x01, 0xEB, 0x11, 0x30, 0xFE, 0x6D, 0x03, 0x3C, 0xFF, + 0x5C, 0xF9, 0x9C, 0x07, 0x4A, 0xF6, 0xB1, 0x0F, 0x8F, 0xF2, 0x9B, 0x10, + 0xE1, 0xEE, 0x9A, 0x0D, 0xD9, 0xF6, 0x60, 0x10, 0xE5, 0xFB, 0x97, 0x15, + 0x3F, 0xFE, 0x83, 0x1A, 0x5A, 0x04, 0x81, 0x1B, 0x2D, 0x0A, 0x4C, 0x11, + 0x94, 0x0F, 0x2B, 0x06, 0x83, 0x10, 0xF8, 0x03, 0x34, 0x0B, 0x90, 0x04, + 0xCA, 0xFF, 0x43, 0xFF, 0xD3, 0xF5, 0x74, 0xF4, 0xDD, 0xF1, 0x6A, 0xEF, + 0x7A, 0xF2, 0xC2, 0xF4, 0x5B, 0xFA, 0xE3, 0xFE, 0xBD, 0x06, 0x6F, 0x06, + 0x2A, 0x0D, 0x26, 0x07, 0x84, 0x0D, 0x12, 0x03, 0xE0, 0x03, 0x97, 0xFA, + 0x87, 0xF4, 0x41, 0xF3, 0xB8, 0xF6, 0x6F, 0xF0, 0x79, 0x07, 0x27, 0xF2, + 0x12, 0x12, 0x04, 0xF6, 0xD7, 0x0F, 0xB0, 0xFA, 0xA4, 0x05, 0x97, 0xF9, + 0xF9, 0xFC, 0xBA, 0xF7, 0x0C, 0xF8, 0xBE, 0x01, 0x3C, 0xF8, 0x8F, 0x10, + 0x27, 0x01, 0x33, 0x1B, 0xFA, 0x0C, 0x4A, 0x1D, 0xF5, 0x0E, 0xB0, 0x1A, + 0x90, 0x06, 0x4E, 0x18, 0x06, 0x01, 0x09, 0x17, 0xB6, 0x01, 0xF5, 0x16, + 0xF5, 0x02, 0xFA, 0x17, 0x03, 0x07, 0x7E, 0x19, 0xEB, 0x0A, 0x9C, 0x16, + 0x77, 0x09, 0x34, 0x0E, 0xB8, 0x0C, 0xC0, 0x11, 0x09, 0x16, 0xED, 0x1C, + 0x3B, 0x1F, 0x67, 0x1B, 0x2A, 0x21, 0xFF, 0x16, 0x7E, 0x17, 0x88, 0x1E, + 0xD4, 0x0F, 0xA7, 0x22, 0xB3, 0x14, 0xD8, 0x1A, 0x9E, 0x1E, 0xAB, 0x11, + 0x5A, 0x29, 0xAD, 0x0E, 0xD1, 0x33, 0xC9, 0x0F, 0xD0, 0x32, 0x85, 0x12, + 0x46, 0x2C, 0x63, 0x1A, 0x05, 0x26, 0xDA, 0x1C, 0x98, 0x1C, 0x15, 0x1F, + 0x23, 0x14, 0xD9, 0x27, 0x32, 0x12, 0x51, 0x27, 0x1C, 0x13, 0x86, 0x1E, + 0x91, 0x15, 0x0D, 0x1F, 0x44, 0x17, 0x5A, 0x25, 0x8C, 0x10, 0xFE, 0x20, + 0x2F, 0x0E, 0x15, 0x1D, 0x71, 0x11, 0x0C, 0x1F, 0xFE, 0x0B, 0x04, 0x1D, + 0x3F, 0x03, 0x12, 0x18, 0x3F, 0x03, 0xB3, 0x0E, 0x6C, 0x05, 0xF3, 0xFB, + 0xB0, 0x01, 0xC3, 0xEB, 0xA2, 0x00, 0x51, 0xEA, 0x23, 0xFF, 0xEE, 0xE7, + 0xC8, 0xF9, 0x80, 0xE0, 0x37, 0xFD, 0x55, 0xDD, 0x3D, 0xFF, 0x8B, 0xD9, + 0xC4, 0xF6, 0xAF, 0xD7, 0x52, 0xF1, 0x36, 0xDE, 0x85, 0xF0, 0xBF, 0xE7, + 0x09, 0xF0, 0xC1, 0xEC, 0xB9, 0xED, 0xFD, 0xE9, 0x17, 0xE8, 0xAC, 0xE5, + 0x9B, 0xDD, 0x30, 0xE6, 0xEB, 0xD3, 0x41, 0xE9, 0x1C, 0xD7, 0xE8, 0xEB, + 0x27, 0xDD, 0xF4, 0xE8, 0x47, 0xDB, 0xE8, 0xDE, 0xEA, 0xDB, 0x4F, 0xDD, + 0x94, 0xDF, 0xC9, 0xE0, 0xAE, 0xDD, 0xE2, 0xD9, 0x2B, 0xDF, 0x56, 0xD8, + 0xB5, 0xE3, 0xBD, 0xE3, 0x0F, 0xDD, 0xE2, 0xE1, 0xFD, 0xD5, 0x26, 0xDB, + 0xBC, 0xD6, 0x17, 0xDE, 0x92, 0xDC, 0xCB, 0xE2, 0xCD, 0xE5, 0x5E, 0xED, + 0x34, 0xED, 0x82, 0xF1, 0x32, 0xEA, 0x4C, 0xE6, 0x58, 0xDC, 0x6A, 0xDE, + 0x93, 0xD8, 0xD4, 0xE6, 0xDB, 0xDC, 0x65, 0xEA, 0x9A, 0xE2, 0x32, 0xE6, + 0x22, 0xF0, 0x31, 0xE8, 0xAA, 0xF8, 0xA2, 0xE0, 0xBC, 0xF2, 0x1F, 0xD5, + 0x58, 0xEC, 0x09, 0xD8, 0xDF, 0xEB, 0x64, 0xDE, 0x4A, 0xEB, 0xC0, 0xE4, + 0xDB, 0xEF, 0x86, 0xF4, 0x10, 0xF8, 0x7D, 0x02, 0xC0, 0xF4, 0x3C, 0x02, + 0x63, 0xE6, 0xEF, 0xF3, 0x7F, 0xE1, 0x23, 0xE3, 0xEA, 0xE6, 0x40, 0xE5, + 0x01, 0xE5, 0xF1, 0xEF, 0xB3, 0xE0, 0xC0, 0xF7, 0xBF, 0xE7, 0x17, 0x02, + 0x94, 0xF0, 0xC7, 0x03, 0xDA, 0xF5, 0xA1, 0x01, 0x9C, 0xFC, 0xB1, 0x01, + 0x06, 0xFD, 0xE2, 0xF9, 0x95, 0xFA, 0x85, 0xF3, 0x9B, 0xFC, 0x21, 0xFC, + 0x29, 0xF9, 0x44, 0x01, 0x7F, 0xEE, 0x3D, 0xF5, 0xE6, 0xED, 0x2C, 0xEC, + 0xC3, 0xFB, 0xE2, 0xEE, 0x56, 0x04, 0x07, 0xEE, 0x9C, 0x09, 0xCD, 0xF3, + 0x58, 0x10, 0xA7, 0x01, 0x34, 0x0E, 0xB9, 0xFE, 0xBF, 0x0B, 0x89, 0xFB, + 0xB2, 0x0F, 0x68, 0x09, 0x57, 0x14, 0x71, 0x17, 0xF1, 0x20, 0x51, 0x20, + 0xB8, 0x30, 0x09, 0x29, 0x46, 0x2D, 0x73, 0x2C, 0x30, 0x1E, 0x70, 0x27, + 0x70, 0x13, 0x1E, 0x21, 0x1F, 0x13, 0x8B, 0x21, 0xE9, 0x1A, 0x24, 0x27, + 0xB9, 0x1F, 0x96, 0x2E, 0xC1, 0x22, 0x07, 0x33, 0xDB, 0x20, 0x31, 0x2C, + 0xB5, 0x19, 0xF2, 0x21, 0x3F, 0x1B, 0xCF, 0x1B, 0x5F, 0x27, 0xE0, 0x19, + 0x43, 0x2B, 0xB1, 0x1C, 0xFF, 0x21, 0x13, 0x1D, 0x9C, 0x1C, 0x65, 0x1B, + 0xBF, 0x25, 0xCA, 0x1E, 0x14, 0x2F, 0x37, 0x1B, 0x31, 0x2C, 0x5D, 0x0F, + 0x21, 0x28, 0x16, 0x13, 0x3A, 0x23, 0x9A, 0x1A, 0x15, 0x20, 0xA7, 0x16, + 0x6E, 0x1D, 0x6C, 0x14, 0x15, 0x18, 0xA3, 0x17, 0x6B, 0x1C, 0x6E, 0x1A, + 0x07, 0x26, 0x2F, 0x17, 0xB9, 0x2D, 0x5A, 0x11, 0x6B, 0x32, 0xCE, 0x14, + 0x93, 0x2B, 0x23, 0x1E, 0x01, 0x1A, 0xD5, 0x1B, 0x6A, 0x0B, 0x4C, 0x16, + 0x3E, 0x09, 0x78, 0x1B, 0x4B, 0x07, 0x92, 0x20, 0x65, 0xFB, 0xCB, 0x22, + 0x60, 0xF3, 0x6C, 0x22, 0x0B, 0xFB, 0x10, 0x1B, 0x03, 0x04, 0x80, 0x13, + 0xB8, 0x02, 0x6C, 0x11, 0x44, 0x05, 0x7F, 0x13, 0x81, 0x0E, 0xF7, 0x12, + 0x35, 0x1A, 0x61, 0x13, 0xEE, 0x1F, 0xCF, 0x14, 0x99, 0x1B, 0x7B, 0x15, + 0x6C, 0x1B, 0x87, 0x17, 0xD7, 0x19, 0x59, 0x08, 0xAB, 0x11, 0x67, 0xF1, + 0x1F, 0x0A, 0x4B, 0xEC, 0x4D, 0x09, 0x36, 0xF4, 0xA4, 0x10, 0xF0, 0x00, + 0x1D, 0x1B, 0x22, 0x0A, 0x30, 0x25, 0x1B, 0x12, 0xBB, 0x27, 0xE4, 0x20, + 0xD0, 0x25, 0xD3, 0x2C, 0xC2, 0x28, 0x75, 0x32, 0xA0, 0x29, 0x2B, 0x31, + 0x01, 0x22, 0x22, 0x2C, 0xA0, 0x14, 0x88, 0x28, 0x84, 0x06, 0x81, 0x20, + 0x81, 0x08, 0x54, 0x18, 0x81, 0x0E, 0xEA, 0x11, 0x3E, 0x0D, 0x17, 0x14, + 0xAF, 0x11, 0x3E, 0x24, 0x6C, 0x1F, 0x0A, 0x35, 0xAF, 0x28, 0xF0, 0x35, + 0xD8, 0x2F, 0x0B, 0x35, 0x83, 0x3A, 0x50, 0x39, 0xEF, 0x3F, 0x23, 0x39, + 0xCA, 0x4B, 0x47, 0x46, 0x2E, 0x4C, 0x41, 0x4A, 0xB0, 0x3B, 0x8C, 0x33, + 0x5B, 0x38, 0x76, 0x22, 0x25, 0x2D, 0x27, 0x15, 0x6C, 0x19, 0x92, 0x05, + 0x22, 0x19, 0xB2, 0x07, 0x2E, 0x0D, 0x32, 0x02, 0x1C, 0x0C, 0x07, 0x04, + 0x95, 0x2E, 0xC9, 0x28, 0xA9, 0x20, 0xFD, 0x28, 0xB5, 0x04, 0xF5, 0x17, + 0x9F, 0x15, 0x8B, 0x23, 0xDB, 0x09, 0x8A, 0x13, 0x43, 0xEE, 0xD1, 0xFC, + 0xED, 0xDF, 0xE8, 0xF5, 0x44, 0xE7, 0xBD, 0xFD, 0x52, 0x09, 0x95, 0x1C, + 0x33, 0xEF, 0x98, 0x05, 0xD4, 0xCB, 0x63, 0xE8, 0x90, 0xDC, 0xA7, 0xF9, + 0x78, 0xC7, 0x4D, 0xDB, 0xD1, 0xA9, 0xA3, 0xB2, 0x34, 0xBE, 0x96, 0xC4, + 0x4E, 0xCA, 0x64, 0xD5, 0xA7, 0xBB, 0x16, 0xC6, 0x60, 0xBB, 0xB4, 0xBB, + 0xC7, 0xC0, 0xD4, 0xBE, 0x73, 0xAF, 0xED, 0xB1, 0xA8, 0xA7, 0x2E, 0xA5, + 0x36, 0xBC, 0xF9, 0xAC, 0xD5, 0xC6, 0x45, 0xAE, 0x48, 0xBC, 0xD6, 0xA0, + 0xAE, 0xBF, 0xB7, 0xA9, 0x98, 0xC3, 0x1B, 0xB7, 0xA1, 0xAD, 0xD2, 0xA6, + 0xA3, 0xAE, 0x3D, 0xA3, 0xBC, 0xBD, 0x9A, 0xAA, 0xA2, 0xB6, 0xEF, 0xAB, + 0x00, 0xA4, 0xDA, 0xA5, 0x53, 0xA7, 0x51, 0xA5, 0xF6, 0xBD, 0x17, 0xB3, + 0x93, 0xBA, 0x36, 0xAC, 0x7C, 0xA8, 0x66, 0x9A, 0xC1, 0xA2, 0x61, 0x9D, + 0x77, 0xA6, 0xC8, 0xAF, 0x5F, 0xAA, 0x32, 0xB8, 0xDD, 0xA9, 0x0B, 0xB1, + 0x7C, 0xA8, 0x04, 0xA8, 0xDE, 0xAF, 0x3D, 0xA9, 0x7E, 0xB9, 0xE4, 0xB2, + 0xE1, 0xBC, 0xCA, 0xBB, 0xFD, 0xC3, 0xC8, 0xC1, 0xDF, 0xCC, 0xFB, 0xC0, + 0x5F, 0xD0, 0xBA, 0xB9, 0x8D, 0xCF, 0xCA, 0xB3, 0x84, 0xC1, 0x15, 0xAC, + 0x22, 0xAF, 0x12, 0xA6, 0x23, 0xA4, 0x64, 0xA7, 0xC2, 0xA5, 0xED, 0xB1, + 0xA2, 0xC0, 0x23, 0xD0, 0xC0, 0xD0, 0x5D, 0xE4, 0xB0, 0xD7, 0x1C, 0xEF, + 0x68, 0xEE, 0xED, 0xFF, 0xCB, 0x02, 0xA7, 0x0B, 0x47, 0x03, 0xCF, 0x07, + 0x37, 0xF4, 0x62, 0xF7, 0x92, 0xE9, 0x40, 0xF0, 0xF0, 0xEA, 0xE4, 0xF6, + 0xDE, 0xFC, 0x68, 0x03, 0x3B, 0x09, 0xF4, 0x03, 0xA9, 0x08, 0xF0, 0x00, + 0x0C, 0x13, 0x30, 0x0F, 0x22, 0x1A, 0x01, 0x17, 0xA5, 0x0F, 0x4A, 0x0E, + 0x9F, 0x0B, 0xED, 0x0F, 0x13, 0x0D, 0x70, 0x17, 0xEA, 0x16, 0xB0, 0x20, + 0xEC, 0x29, 0x43, 0x2A, 0xED, 0x33, 0x24, 0x2C, 0xAE, 0x32, 0x37, 0x2C, + 0x66, 0x36, 0xB5, 0x34, 0x67, 0x3A, 0x53, 0x37, 0x7C, 0x37, 0x10, 0x2D, + 0xAF, 0x43, 0x14, 0x37, 0x80, 0x59, 0xC9, 0x4F, 0xDF, 0x60, 0x8E, 0x54, + 0x82, 0x54, 0xA9, 0x45, 0xEB, 0x48, 0xF4, 0x41, 0x41, 0x45, 0x73, 0x48, + 0xD6, 0x45, 0xF9, 0x46, 0x55, 0x4D, 0x60, 0x42, 0xED, 0x50, 0x4F, 0x3B, + 0xF6, 0x4E, 0x5C, 0x39, 0xA3, 0x4B, 0xF7, 0x44, 0x85, 0x48, 0x9E, 0x54, + 0x26, 0x51, 0xDD, 0x60, 0x97, 0x57, 0xA7, 0x5F, 0xE7, 0x57, 0x09, 0x5D, + 0x1D, 0x5C, 0x05, 0x61, 0x59, 0x5B, 0x1C, 0x5C, 0x16, 0x59, 0x40, 0x5A, + 0x1A, 0x55, 0xF3, 0x5A, 0x8E, 0x59, 0x2D, 0x57, 0x1D, 0x62, 0xCA, 0x4C, + 0xDE, 0x5C, 0x7A, 0x40, 0x2B, 0x59, 0x48, 0x42, 0x08, 0x50, 0xCA, 0x3D, + 0x10, 0x44, 0xE6, 0x34, 0x59, 0x42, 0x01, 0x37, 0xD9, 0x46, 0x89, 0x3B, + 0x10, 0x4A, 0xBC, 0x3E, 0x32, 0x47, 0xCE, 0x43, 0xA1, 0x41, 0xF6, 0x48, + 0xD6, 0x3D, 0x1A, 0x49, 0xB5, 0x42, 0x01, 0x4A, 0x34, 0x52, 0x35, 0x4F, + 0xA6, 0x5B, 0x82, 0x4D, 0xB5, 0x55, 0x9F, 0x47, 0x96, 0x43, 0x0B, 0x41, + 0x82, 0x37, 0x13, 0x3E, 0xBF, 0x2F, 0x21, 0x38, 0x87, 0x20, 0x48, 0x29, + 0x8D, 0x1D, 0x57, 0x24, 0x57, 0x29, 0xD9, 0x2A, 0x96, 0x30, 0xDD, 0x30, + 0x9C, 0x36, 0xA4, 0x3B, 0x51, 0x39, 0xD0, 0x42, 0xBA, 0x28, 0xC9, 0x37, + 0x42, 0x19, 0x42, 0x2F, 0x2F, 0x1E, 0xF0, 0x32, 0xFA, 0x23, 0xC9, 0x2C, + 0x38, 0x1D, 0x90, 0x1C, 0x9E, 0x1A, 0x60, 0x1B, 0x43, 0x16, 0x10, 0x1E, + 0x9C, 0x0E, 0x1F, 0x1C, 0x4A, 0x12, 0x70, 0x21, 0x88, 0x19, 0xE8, 0x23, + 0xC3, 0x1E, 0x98, 0x20, 0x13, 0x27, 0xAE, 0x21, 0x41, 0x29, 0xC4, 0x1F, + 0xA7, 0x24, 0x57, 0x19, 0x63, 0x19, 0xF3, 0x0C, 0xEE, 0x12, 0xA9, 0x05, + 0xE3, 0x1B, 0xBB, 0x0F, 0x41, 0x13, 0x72, 0x0D, 0x0E, 0x01, 0x0E, 0x0A, + 0xF8, 0xF2, 0x65, 0x0D, 0x81, 0xE4, 0x57, 0x03, 0x7F, 0xE6, 0x16, 0xF6, + 0xD0, 0xEB, 0x2B, 0xEA, 0x80, 0xF7, 0xAF, 0xF7, 0x66, 0x0D, 0x61, 0x16, + 0x29, 0x09, 0xC2, 0x0A, 0x87, 0x02, 0x84, 0xF2, 0xDE, 0x04, 0x86, 0xEB, + 0xC6, 0xF8, 0x99, 0xDF, 0x50, 0xF3, 0xF1, 0xDD, 0x90, 0xF1, 0x67, 0xE2, + 0xCF, 0xE9, 0x61, 0xDE, 0x6B, 0xF1, 0x11, 0xE2, 0x3F, 0xF7, 0x39, 0xE8, + 0x6E, 0xE0, 0xB5, 0xDB, 0x24, 0xD5, 0xB4, 0xD6, 0x90, 0xDE, 0x6A, 0xDC, + 0xF0, 0xD9, 0x4A, 0xD2, 0xD3, 0xDB, 0xAD, 0xD1, 0x6C, 0xE0, 0xFD, 0xD9, + 0xE1, 0xD3, 0xAB, 0xD9, 0xD1, 0xD2, 0x6D, 0xE6, 0x3C, 0xE0, 0x23, 0xF8, + 0xE5, 0xDE, 0x73, 0xF8, 0x3E, 0xCF, 0x12, 0xEF, 0x11, 0xC7, 0xBD, 0xE5, + 0xFE, 0xB7, 0x86, 0xCD, 0x6C, 0xA8, 0xED, 0xBA, 0x34, 0xAF, 0xBB, 0xC0, + 0x09, 0xB3, 0xF1, 0xB8, 0x11, 0xC4, 0x55, 0xB8, 0x5C, 0xE2, 0x0F, 0xCC, + 0xB9, 0xEA, 0x7F, 0xD0, 0x34, 0xF4, 0x82, 0xD9, 0xCB, 0xFA, 0x27, 0xE3, + 0x80, 0xF4, 0xA6, 0xD7, 0xDF, 0xF1, 0x28, 0xC9, 0x7D, 0xE0, 0xDF, 0xB9, + 0xC8, 0xC1, 0x93, 0xA9, 0x88, 0xC1, 0x14, 0xB0, 0x98, 0xD8, 0x9B, 0xC5, + 0x7A, 0xE5, 0xF5, 0xD4, 0xB7, 0x00, 0x32, 0xF2, 0xCD, 0x22, 0xC9, 0x0C, + 0x46, 0x28, 0x0A, 0x0E, 0xDE, 0x2C, 0x4C, 0x14, 0xE6, 0x2F, 0xE5, 0x13, + 0xBF, 0x09, 0x26, 0xEE, 0xD3, 0xEA, 0xDC, 0xDD, 0xC7, 0xEB, 0xC3, 0xEC, + 0x5A, 0xEC, 0xFF, 0xE9, 0x42, 0xFD, 0x48, 0xEF, 0x33, 0x07, 0x16, 0xF7, + 0x26, 0xFF, 0xE8, 0xF0, 0xB2, 0x0D, 0x11, 0xFE, 0x59, 0x1C, 0xF6, 0x0C, + 0x10, 0x14, 0x84, 0x09, 0x8C, 0x15, 0x49, 0x15, 0x5C, 0x21, 0x3D, 0x2B, + 0x7B, 0x28, 0x2A, 0x35, 0xF2, 0x38, 0x98, 0x44, 0x21, 0x41, 0x66, 0x4F, + 0x7C, 0x30, 0xBD, 0x47, 0xB8, 0x16, 0x63, 0x32, 0x7D, 0x0B, 0xF4, 0x21, + 0xCB, 0x01, 0xD0, 0x17, 0x92, 0xF3, 0xF0, 0x11, 0x98, 0xFA, 0x35, 0x1C, + 0x6B, 0x0A, 0xE6, 0x1D, 0x3E, 0x1E, 0xA4, 0x1C, 0x0D, 0x31, 0x5A, 0x2C, + 0x83, 0x31, 0xDE, 0x3A, 0x69, 0x37, 0x7B, 0x4B, 0x99, 0x3C, 0xF4, 0x4E, + 0x3F, 0x37, 0xF7, 0x40, 0xAF, 0x33, 0x42, 0x39, 0xBF, 0x1B, 0xD2, 0x1F, + 0xE6, 0x02, 0xFA, 0x02, 0xF5, 0xF1, 0x72, 0xEF, 0xB8, 0xED, 0x46, 0xED, + 0xE0, 0xF2, 0xF2, 0xF8, 0x4A, 0xFF, 0xF3, 0x06, 0x58, 0x1C, 0x82, 0x1B, + 0xFF, 0x2B, 0xA8, 0x23, 0x80, 0x3D, 0x86, 0x30, 0xF3, 0x50, 0xB1, 0x3D, + 0x1F, 0x48, 0x32, 0x2C, 0xE8, 0x34, 0x60, 0x10, 0x2D, 0x20, 0x1D, 0xF9, + 0x47, 0x01, 0x63, 0xDF, 0xD0, 0xEB, 0x86, 0xD7, 0xE0, 0xE9, 0xD7, 0xE4, + 0x57, 0xE2, 0x95, 0xE3, 0x9F, 0xE0, 0xA1, 0xE7, 0x3D, 0xEE, 0xBC, 0xFE, + 0xD3, 0xF5, 0x94, 0x0A, 0xEE, 0xFD, 0xC2, 0x11, 0xEC, 0x01, 0x08, 0x15, + 0x0F, 0xF8, 0x94, 0x0D, 0x0D, 0xF6, 0xDA, 0x0D, 0x35, 0xEB, 0xC0, 0x08, + 0xE9, 0xCB, 0xC4, 0xF6, 0x5C, 0xC3, 0xB0, 0xF2, 0x9E, 0xC8, 0x21, 0xEC, + 0x4E, 0xC6, 0xA6, 0xD8, 0x72, 0xD0, 0x11, 0xD4, 0xD5, 0xD2, 0x17, 0xD0, + 0x22, 0xC3, 0x91, 0xC0, 0x1A, 0xC5, 0xDB, 0xC4, 0x4C, 0xD0, 0x24, 0xD1, + 0xDA, 0xD6, 0x8C, 0xD7, 0x96, 0xD0, 0xB6, 0xD7, 0x8E, 0xCE, 0x38, 0xDE, + 0xA8, 0xD7, 0x9A, 0xEC, 0x56, 0xCD, 0x44, 0xEB, 0x4F, 0xB8, 0xED, 0xDF, + 0xD1, 0xB0, 0xA4, 0xDB, 0x4A, 0xB0, 0xE6, 0xD2, 0xEE, 0xAA, 0xAE, 0xBD, + 0x92, 0xB1, 0xE1, 0xB8, 0x25, 0xBB, 0x26, 0xBC, 0x07, 0xC2, 0x93, 0xBF, + 0x87, 0xD7, 0x13, 0xD1, 0xAB, 0xEE, 0xCC, 0xE0, 0xFE, 0xE8, 0xB1, 0xD7, + 0x25, 0xE1, 0xD9, 0xCF, 0xA8, 0xE1, 0x11, 0xD3, 0xE1, 0xCE, 0x08, 0xC9, + 0x5A, 0xB4, 0x64, 0xB6, 0xC4, 0xA8, 0x94, 0xAB, 0xF2, 0xA9, 0xEF, 0xA3, + 0xA1, 0xAD, 0x5E, 0xA0, 0xBF, 0xB2, 0xBE, 0xAC, 0xAC, 0xC0, 0xAD, 0xC3, + 0x9E, 0xD3, 0x4D, 0xD2, 0x2B, 0xE0, 0xB5, 0xCE, 0x21, 0xE6, 0x77, 0xC9, + 0x64, 0xDB, 0x50, 0xC6, 0xA2, 0xCB, 0xEC, 0xC2, 0x30, 0xBE, 0xC9, 0xBA, + 0x35, 0xBB, 0x52, 0xB8, 0x79, 0xC0, 0x52, 0xBD, 0x10, 0xB8, 0x4C, 0xBB, + 0xE3, 0xB5, 0x4B, 0xC2, 0xBE, 0xBF, 0xFF, 0xD0, 0x95, 0xC2, 0x4A, 0xD5, + 0x28, 0xC9, 0x9D, 0xDC, 0xD4, 0xD7, 0x4D, 0xEB, 0xE7, 0xDD, 0x6D, 0xE3, + 0xAA, 0xE6, 0xAE, 0xD7, 0xD9, 0xE6, 0xE3, 0xD9, 0x83, 0xDE, 0x13, 0xE4, + 0x7E, 0xD8, 0x00, 0xE8, 0xA8, 0xD4, 0x71, 0xE1, 0xFC, 0xD7, 0x5F, 0xE1, + 0x02, 0xDF, 0x98, 0xE5, 0x97, 0xE9, 0x6F, 0xE2, 0xA2, 0xF1, 0xED, 0xD9, + 0x2E, 0xF4, 0x3A, 0xD1, 0xE1, 0xFD, 0x58, 0xD2, 0xDA, 0x07, 0x89, 0xE3, + 0x99, 0x00, 0x7B, 0xF0, 0x57, 0xF4, 0x05, 0xEC, 0x28, 0xF9, 0xC6, 0xE3, + 0xD3, 0x08, 0x34, 0xE2, 0xC5, 0x0E, 0x87, 0xE3, 0x46, 0x1D, 0x64, 0xF3, + 0xAC, 0x23, 0x23, 0x00, 0x8B, 0x10, 0x3E, 0xFF, 0xDA, 0x06, 0xFF, 0x05, + 0x71, 0x04, 0xEB, 0x0D, 0xBA, 0xFB, 0x35, 0x0E, 0x66, 0x02, 0xB8, 0x14, + 0xE9, 0x19, 0x99, 0x1F, 0xDA, 0x29, 0x62, 0x20, 0x50, 0x32, 0x88, 0x27, + 0x6D, 0x35, 0x9D, 0x34, 0x45, 0x2D, 0x57, 0x35, 0x92, 0x11, 0x60, 0x25, + 0x8A, 0xFB, 0xE0, 0x1B, 0x9C, 0xFD, 0xBB, 0x26, 0xDA, 0x05, 0xA7, 0x32, + 0xAA, 0x0F, 0x65, 0x34, 0xB4, 0x1B, 0x27, 0x32, 0xD8, 0x22, 0x30, 0x2C, + 0x30, 0x2A, 0x7B, 0x29, 0xE1, 0x38, 0x82, 0x32, 0xFE, 0x3D, 0x7E, 0x34, + 0x96, 0x30, 0x75, 0x29, 0x7E, 0x2A, 0x37, 0x24, 0x36, 0x3A, 0xCD, 0x2C, + 0xB6, 0x43, 0xED, 0x33, 0x24, 0x42, 0x42, 0x39, 0xF2, 0x42, 0x85, 0x46, + 0x62, 0x42, 0x9D, 0x4F, 0x81, 0x3E, 0xEF, 0x47, 0x5A, 0x45, 0xB9, 0x41, + 0x2E, 0x53, 0x8C, 0x41, 0xDD, 0x51, 0x36, 0x38, 0x55, 0x4C, 0xDD, 0x31, + 0xE0, 0x4E, 0xDD, 0x39, 0xC4, 0x48, 0x09, 0x45, 0xA2, 0x39, 0x20, 0x48, + 0x1D, 0x3E, 0x1A, 0x52, 0x6D, 0x44, 0x6E, 0x56, 0x72, 0x41, 0x70, 0x4E, + 0x1E, 0x42, 0xBA, 0x49, 0x4F, 0x3E, 0xC3, 0x3F, 0x3B, 0x34, 0x63, 0x2F, + 0x20, 0x28, 0xEB, 0x1F, 0xDD, 0x25, 0x06, 0x1C, 0xDF, 0x2D, 0x05, 0x28, + 0x81, 0x39, 0x2B, 0x35, 0xA8, 0x4B, 0xF4, 0x3C, 0x6A, 0x5D, 0x11, 0x46, + 0x0A, 0x5F, 0x3E, 0x46, 0x80, 0x5A, 0xBC, 0x41, 0x44, 0x52, 0xB9, 0x3B, + 0xC5, 0x49, 0x40, 0x3A, 0xBA, 0x3E, 0x48, 0x3B, 0x5A, 0x30, 0x84, 0x35, + 0x51, 0x29, 0x25, 0x34, 0xF3, 0x21, 0xD5, 0x33, 0xBD, 0x19, 0x49, 0x2D, + 0x4A, 0x12, 0x03, 0x27, 0xB8, 0x0D, 0x2A, 0x28, 0x08, 0x03, 0xC1, 0x21, + 0x0E, 0x00, 0xB8, 0x1A, 0x4A, 0x0C, 0x5B, 0x1C, 0xE7, 0x19, 0xC0, 0x25, + 0x2F, 0x25, 0x5B, 0x2D, 0x95, 0x28, 0x11, 0x26, 0x43, 0x23, 0x6A, 0x1E, + 0x47, 0x1F, 0x30, 0x1E, 0x49, 0x21, 0x20, 0x1D, 0x12, 0x31, 0x56, 0x22, + 0x30, 0x47, 0x89, 0x2A, 0xDB, 0x4D, 0x83, 0x29, 0xBD, 0x4D, 0xA4, 0x27, + 0x07, 0x48, 0x39, 0x24, 0x57, 0x33, 0x12, 0x17, 0x3A, 0x1D, 0x43, 0x08, + 0xB7, 0x12, 0x3C, 0x01, 0x76, 0x0A, 0xC1, 0xF3, 0x55, 0x00, 0x2F, 0xE1, + 0xAC, 0xF8, 0x27, 0xDA, 0x37, 0xF3, 0x36, 0xDD, 0x3A, 0xF4, 0xDB, 0xEA, + 0xA2, 0x01, 0x0D, 0xFD, 0x9C, 0x14, 0x05, 0x08, 0x48, 0x23, 0xCA, 0x12, + 0x7E, 0x2A, 0xE3, 0x1E, 0x71, 0x24, 0x85, 0x23, 0xD1, 0x22, 0x89, 0x2A, + 0x8A, 0x26, 0x79, 0x2D, 0x13, 0x21, 0xA0, 0x29, 0xF7, 0x23, 0xF7, 0x2F, + 0x01, 0x24, 0xEE, 0x2D, 0xA7, 0x16, 0x74, 0x1E, 0x6E, 0x12, 0x01, 0x18, + 0x51, 0x1A, 0x25, 0x1C, 0xDF, 0x1F, 0xF7, 0x1C, 0xF5, 0x21, 0x30, 0x1E, + 0x4E, 0x21, 0x3C, 0x22, 0x30, 0x1E, 0x0C, 0x1E, 0x47, 0x13, 0xDD, 0x0C, + 0x9A, 0x05, 0x32, 0xF8, 0xE0, 0xFE, 0xF4, 0xE9, 0xCE, 0xF5, 0x4E, 0xDF, + 0x48, 0xF2, 0xB7, 0xDE, 0xB2, 0xF9, 0x45, 0xEB, 0x84, 0x01, 0x45, 0xF8, + 0x18, 0x12, 0x67, 0x0C, 0xB5, 0x29, 0xAC, 0x29, 0x57, 0x3C, 0x9F, 0x3D, + 0xD4, 0x4A, 0x32, 0x4C, 0x8F, 0x41, 0xFC, 0x4B, 0x4B, 0x2F, 0x72, 0x43, + 0x75, 0x25, 0x71, 0x3E, 0x55, 0x1C, 0xFE, 0x34, 0x1F, 0x11, 0x7F, 0x25, + 0xDA, 0xFD, 0xCD, 0x0F, 0xE4, 0xEB, 0x93, 0xFB, 0xE1, 0xDB, 0x60, 0xE6, + 0x06, 0xCB, 0x0F, 0xCE, 0x4C, 0xBC, 0x78, 0xBE, 0x13, 0xBD, 0x92, 0xC6, + 0x00, 0xD1, 0x77, 0xD6, 0x31, 0xE9, 0x27, 0xDE, 0x7F, 0xFE, 0xA4, 0xE7, + 0xBB, 0x0C, 0x1F, 0xF6, 0x12, 0x0E, 0x23, 0x03, 0x1B, 0x0A, 0x82, 0x0D, + 0x57, 0x08, 0x8F, 0x17, 0xED, 0x03, 0xA7, 0x17, 0x89, 0x01, 0xA4, 0x0E, + 0x21, 0xFE, 0xA2, 0x04, 0x16, 0xFB, 0xA3, 0xFF, 0x71, 0xFA, 0x6E, 0xFF, + 0xC4, 0xFA, 0x54, 0x05, 0x66, 0xF8, 0x47, 0x0A, 0x6F, 0xF7, 0x17, 0x0D, + 0xB3, 0xF6, 0xF6, 0x08, 0xB4, 0xEC, 0x24, 0xFB, 0x27, 0xDC, 0x34, 0xF0, + 0xF4, 0xC3, 0x8D, 0xE0, 0xEA, 0xAC, 0xE6, 0xC8, 0x20, 0xA5, 0xB9, 0xB0, + 0xEE, 0xA8, 0xAF, 0xA3, 0x3E, 0xAB, 0x8D, 0xA5, 0xFC, 0xB9, 0xB9, 0xBA, + 0x03, 0xCD, 0x78, 0xD5, 0x91, 0xDB, 0x3D, 0xEB, 0xAF, 0xEE, 0xE7, 0x01, + 0x8D, 0xFB, 0x34, 0x16, 0x42, 0x00, 0x6D, 0x1D, 0x70, 0xFC, 0xD5, 0x0F, + 0xB8, 0xF2, 0x8D, 0xFC, 0x2A, 0xE4, 0x44, 0xE7, 0x1A, 0xD7, 0x13, 0xD1, + 0xB0, 0xCF, 0x59, 0xBA, 0x7A, 0xC8, 0x93, 0xA9, 0xDD, 0xB7, 0xE4, 0xA1, + 0xCC, 0xA7, 0x57, 0xA1, 0x61, 0xA3, 0x49, 0xA5, 0xEC, 0xA1, 0x5E, 0xA4, + 0x27, 0xA1, 0x9E, 0xA7, 0x8B, 0xA0, 0x95, 0xB2, 0xD1, 0xA7, 0xDC, 0xBF, + 0xB2, 0xB7, 0xFF, 0xCF, 0xA7, 0xCA, 0x40, 0xE3, 0x02, 0xD1, 0x38, 0xEF, + 0xD3, 0xCC, 0xBA, 0xFA, 0xD4, 0xCE, 0xB8, 0xFE, 0x70, 0xD2, 0x9B, 0xF4, + 0xEF, 0xCC, 0xC4, 0xEA, 0x7D, 0xC5, 0x26, 0xE2, 0x7E, 0xC0, 0x17, 0xD6, + 0x23, 0xBA, 0x9A, 0xCA, 0x2E, 0xBE, 0xCF, 0xCD, 0xE2, 0xC1, 0xC5, 0xCE, + 0xC1, 0xBF, 0x7B, 0xC9, 0xFA, 0xBC, 0x5F, 0xCB, 0x49, 0xB7, 0x02, 0xC8, + 0xB6, 0xB5, 0x25, 0xC0, 0xD4, 0xAC, 0x9B, 0xB5, 0xC9, 0x9F, 0x8C, 0xA5, + 0x1B, 0x9E, 0xDA, 0x9B, 0x00, 0xA2, 0x8C, 0x9C, 0x45, 0xA6, 0x49, 0xA6, + 0xE7, 0xAE, 0xAD, 0xB9, 0xE3, 0xC5, 0xA5, 0xCF, 0xB8, 0xDE, 0xE1, 0xDF, + 0x92, 0xEF, 0x1B, 0xF0, 0xA5, 0xF9, 0xDB, 0xFA, 0x87, 0xF6, 0x88, 0xF8, + 0x09, 0xED, 0xA1, 0xF2, 0x2E, 0xE0, 0x2E, 0xE7, 0x43, 0xCD, 0x1C, 0xD7, + 0x34, 0xB7, 0xB0, 0xC2, 0x10, 0xA6, 0x78, 0xAF, 0x45, 0x9F, 0x46, 0xA5, + 0x6E, 0xA1, 0x4B, 0xA2, 0x58, 0xA3, 0x42, 0xA2, 0x00, 0xA2, 0x0A, 0xA2, + 0x91, 0xA0, 0x5E, 0xA5, 0x00, 0xA5, 0x26, 0xAF, 0xBA, 0xB2, 0xEE, 0xBB, + 0x86, 0xC7, 0x65, 0xC9, 0x88, 0xE1, 0x78, 0xD8, 0xC5, 0xF8, 0x57, 0xE7, + 0xB6, 0x02, 0x0E, 0xF1, 0xDD, 0x00, 0x17, 0xF6, 0x1D, 0xF9, 0x83, 0xFA, + 0x3C, 0xF1, 0x28, 0xFB, 0x7A, 0xEC, 0x09, 0xF6, 0xA2, 0xE7, 0xF3, 0xEC, + 0xFD, 0xE2, 0xA4, 0xDE, 0xD1, 0xE8, 0x39, 0xDD, 0x16, 0xF1, 0x2A, 0xE1, + 0xBE, 0xF2, 0x49, 0xDC, 0xF8, 0xED, 0x4B, 0xDB, 0x27, 0xDF, 0x04, 0xDD, + 0xAD, 0xD1, 0x26, 0xDE, 0xBD, 0xC1, 0x79, 0xD4, 0x36, 0xB1, 0x38, 0xC4, + 0x6B, 0xAB, 0x29, 0xBE, 0xBF, 0xA8, 0x56, 0xC0, 0x7D, 0xAC, 0xEC, 0xC7, + 0x1A, 0xBF, 0x07, 0xD6, 0xFC, 0xD3, 0x76, 0xE4, 0xD1, 0xE4, 0xE9, 0xF9, + 0x5A, 0xFE, 0x76, 0x16, 0x12, 0x20, 0x61, 0x27, 0x05, 0x36, 0x5B, 0x25, + 0xFD, 0x37, 0xEC, 0x1B, 0xEA, 0x2A, 0x1D, 0x08, 0xE0, 0x1B, 0x91, 0xEB, + 0xE3, 0x07, 0x73, 0xD2, 0x9E, 0xF1, 0x95, 0xC2, 0x9D, 0xE5, 0xF1, 0xBF, + 0xEB, 0xD5, 0xFA, 0xBC, 0x5A, 0xCD, 0x81, 0xBB, 0x33, 0xCF, 0xDD, 0xBB, + 0x5E, 0xD3, 0x77, 0xC6, 0xDD, 0xDC, 0x31, 0xDA, 0xEF, 0xEC, 0x63, 0xED, + 0xDC, 0x08, 0x0E, 0x05, 0xFA, 0x27, 0xFA, 0x1B, 0x0D, 0x35, 0xB9, 0x2C, + 0x77, 0x32, 0xB3, 0x35, 0x79, 0x37, 0xBA, 0x3A, 0x27, 0x3F, 0xC3, 0x38, + 0xF5, 0x3C, 0x75, 0x30, 0xD2, 0x32, 0xED, 0x23, 0xA4, 0x2D, 0x15, 0x1E, + 0x62, 0x2C, 0x45, 0x18, 0xB0, 0x33, 0xB6, 0x14, 0xEF, 0x3F, 0x76, 0x1E, + 0x8A, 0x41, 0xA4, 0x27, 0xF1, 0x3E, 0xDE, 0x25, 0x12, 0x33, 0x7C, 0x1A, + 0x62, 0x1C, 0x60, 0x0D, 0x40, 0x02, 0xCA, 0xF8, 0x6F, 0xE8, 0x84, 0xE6, + 0x14, 0xDC, 0x97, 0xE2, 0x3E, 0xE3, 0x52, 0xEA, 0xFF, 0xE8, 0x5E, 0xF6, + 0x7C, 0xF1, 0xCE, 0x09, 0x0D, 0x0D, 0x6E, 0x24, 0x33, 0x2A, 0x07, 0x36, + 0x74, 0x44, 0x65, 0x44, 0xCC, 0x5A, 0x66, 0x54, 0x16, 0x5F, 0x25, 0x56, + 0xDE, 0x5C, 0x72, 0x51, 0x2A, 0x4E, 0x3F, 0x44, 0x95, 0x2E, 0x79, 0x28, + 0x5A, 0x10, 0x12, 0x12, 0x8E, 0xF7, 0xF5, 0xFE, 0x3C, 0xEE, 0x7D, 0xEE, + 0xC0, 0xED, 0x90, 0xDE, 0xA7, 0xF1, 0x34, 0xD3, 0xCF, 0xF4, 0x65, 0xCF, + 0x3C, 0xF7, 0x51, 0xDA, 0x69, 0xFC, 0x6B, 0xF2, 0x58, 0x01, 0x3F, 0x00, + 0x4F, 0x18, 0xB9, 0x0E, 0x76, 0x3A, 0x10, 0x2C, 0xA1, 0x48, 0x94, 0x45, + 0x43, 0x4C, 0x33, 0x4F, 0x9B, 0x56, 0xA9, 0x53, 0x27, 0x5A, 0x3E, 0x51, + 0x7B, 0x58, 0xB9, 0x4A, 0x03, 0x5A, 0xAC, 0x47, 0xC7, 0x52, 0x7C, 0x40, + 0xE2, 0x47, 0x33, 0x37, 0xAA, 0x4B, 0x2B, 0x30, 0xEB, 0x51, 0xED, 0x2A, + 0x6C, 0x4C, 0x5D, 0x2B, 0x3C, 0x4A, 0xD0, 0x30, 0xB2, 0x4C, 0x80, 0x31, + 0xD5, 0x42, 0x59, 0x2D, 0xA8, 0x2E, 0x9F, 0x24, 0xEE, 0x19, 0xA5, 0x12, + 0xDA, 0x09, 0x40, 0xFD, 0x4E, 0x03, 0x47, 0xF6, 0xCE, 0x03, 0xBF, 0x02, + 0x0A, 0x08, 0xA0, 0x13, 0x29, 0x19, 0x10, 0x27, 0x18, 0x36, 0x18, 0x37, + 0xF4, 0x52, 0xDC, 0x41, 0xC3, 0x5F, 0xB6, 0x4D, 0x02, 0x59, 0xD2, 0x56, + 0x27, 0x54, 0xE6, 0x57, 0xCA, 0x49, 0x5D, 0x45, 0xD3, 0x30, 0xC2, 0x28, + 0x2B, 0x17, 0x98, 0x16, 0xB9, 0xF9, 0x94, 0x04, 0x51, 0xDB, 0x02, 0xED, + 0x61, 0xCB, 0x75, 0xDC, 0x8E, 0xCC, 0x81, 0xD9, 0x8E, 0xCE, 0x27, 0xDA, + 0x31, 0xD5, 0x95, 0xDC, 0x09, 0xEC, 0x7F, 0xE9, 0xC7, 0x01, 0x7A, 0xF5, + 0xBE, 0x12, 0xB2, 0x04, 0x36, 0x26, 0xD8, 0x1E, 0x5E, 0x35, 0x55, 0x34, + 0x8B, 0x3C, 0xF2, 0x3C, 0x73, 0x3F, 0xBD, 0x3F, 0x67, 0x3E, 0xD7, 0x3F, + 0xD9, 0x31, 0x59, 0x31, 0xBC, 0x22, 0x7B, 0x19, 0x2D, 0x1A, 0x2A, 0x08, + 0x96, 0x13, 0xC0, 0x04, 0x27, 0x13, 0x59, 0x0C, 0x5F, 0x14, 0xE1, 0x0E, + 0x3A, 0x12, 0x7A, 0x06, 0x0E, 0x10, 0xF7, 0xF9, 0x62, 0x0F, 0x66, 0xF3, + 0x90, 0x0B, 0x18, 0xF7, 0xD9, 0xFD, 0x5E, 0xF5, 0x0A, 0xF3, 0x8C, 0xE8, + 0x6C, 0xF3, 0xBC, 0xE1, 0x6C, 0xF2, 0x7F, 0xE6, 0xC0, 0xEA, 0x9B, 0xEB, + 0xA1, 0xEE, 0x9F, 0xF3, 0xB6, 0x06, 0x6F, 0x09, 0xFB, 0x1A, 0xD1, 0x1C, + 0x8D, 0x2B, 0x7B, 0x2A, 0x03, 0x44, 0x2E, 0x3D, 0xB9, 0x4B, 0x2A, 0x49, + 0x90, 0x42, 0xC2, 0x4A, 0xB8, 0x3B, 0x1D, 0x46, 0x16, 0x2A, 0xAF, 0x39, + 0x4B, 0x03, 0x79, 0x20, 0xAE, 0xE1, 0x0C, 0x03, 0xE1, 0xD0, 0x94, 0xE7, + 0x7E, 0xC1, 0x2B, 0xD0, 0x2A, 0xBA, 0x34, 0xCD, 0x6A, 0xBF, 0x5F, 0xD6, + 0x48, 0xD5, 0x9B, 0xE6, 0x5D, 0xEC, 0xA9, 0xF8, 0xC2, 0xF5, 0x61, 0x02, + 0xB1, 0x05, 0xE8, 0x13, 0xB9, 0x18, 0xA8, 0x28, 0x12, 0x23, 0x9B, 0x32, + 0x5B, 0x2D, 0x92, 0x3D, 0x0E, 0x36, 0x15, 0x4B, 0xFA, 0x32, 0xED, 0x4D, + 0x03, 0x2A, 0xEE, 0x44, 0x69, 0x21, 0x59, 0x37, 0x28, 0x19, 0xA4, 0x2D, + 0x9A, 0x0E, 0xE6, 0x24, 0x7B, 0x0D, 0x8D, 0x24, 0x1A, 0x10, 0x60, 0x26, + 0x7E, 0x10, 0x96, 0x22, 0xD4, 0x13, 0x94, 0x21, 0x82, 0x0F, 0x79, 0x20, + 0xDE, 0x02, 0x2E, 0x1C, 0xB9, 0xEB, 0x29, 0x0A, 0x33, 0xD9, 0x5E, 0xF3, + 0xB2, 0xCF, 0x03, 0xDD, 0x58, 0xC9, 0x71, 0xC5, 0x29, 0xCC, 0xD3, 0xC1, + 0x36, 0xD2, 0x6C, 0xDA, 0x7A, 0xE2, 0x1D, 0x02, 0xF9, 0x01, 0x8C, 0x24, + 0x2D, 0x23, 0x3E, 0x3B, 0x6B, 0x38, 0xD5, 0x45, 0x05, 0x44, 0xCC, 0x44, + 0x1C, 0x48, 0x7D, 0x3C, 0xB5, 0x36, 0x6F, 0x2C, 0x98, 0x16, 0x04, 0x1D, + 0xC5, 0xF6, 0xB1, 0x09, 0x25, 0xDC, 0x21, 0xF4, 0x5D, 0xBC, 0x02, 0xDE, + 0xAB, 0xA4, 0xB1, 0xCC, 0x9E, 0xA1, 0x8D, 0xC2, 0x73, 0xA2, 0xA4, 0xB6, + 0xBD, 0xB0, 0xBE, 0xB9, 0x29, 0xC6, 0xF9, 0xC6, 0x47, 0xD5, 0x7C, 0xD6, + 0xC1, 0xEC, 0x1A, 0xF3, 0x79, 0x0F, 0x57, 0x15, 0x9E, 0x1D, 0x5D, 0x24, + 0x41, 0x14, 0xCE, 0x27, 0x42, 0x09, 0x1F, 0x2A, 0x21, 0xFF, 0x40, 0x1F, + 0xAF, 0xF3, 0x3A, 0x08, 0x9C, 0xEA, 0x57, 0xF6, 0x8D, 0xE5, 0x4F, 0xF2, + 0x16, 0xE1, 0xCC, 0xF0, 0x15, 0xE2, 0x16, 0xEE, 0xFE, 0xE5, 0x47, 0xE8, + 0x0D, 0xF0, 0x13, 0xE8, 0x32, 0xF0, 0xD5, 0xE1, 0xEF, 0xE5, 0xC3, 0xD5, + 0x8B, 0xDA, 0x7B, 0xCE, 0xD5, 0xC1, 0x5D, 0xC1, 0x82, 0xA8, 0x5A, 0xB4, + 0x29, 0x9E, 0xB7, 0xAD, 0x29, 0xA1, 0x41, 0xAD, 0x48, 0xA3, 0xEE, 0xAE, + 0x38, 0xAF, 0x96, 0xC2, 0x5F, 0xCF, 0xCF, 0xE9, 0xA4, 0xEE, 0x3B, 0x04, + 0xDC, 0x05, 0xE8, 0x0E, 0x96, 0x12, 0x51, 0x16, 0xCA, 0x10, 0xB6, 0x19, + 0xAE, 0xFD, 0xF0, 0x0E, 0x59, 0xE2, 0x37, 0xFE, 0x9D, 0xC9, 0x47, 0xEE, + 0x7C, 0xB3, 0xCC, 0xD1, 0xAC, 0xA5, 0xC2, 0xB2, 0xF7, 0x9D, 0x44, 0xA1, + 0xE1, 0x9C, 0x06, 0x9D, 0xA8, 0x9F, 0x47, 0x9C, 0x02, 0xA1, 0x89, 0xA2, + 0x5C, 0xA6, 0x3A, 0xB3, 0x67, 0xB4, 0x77, 0xBF, 0x0C, 0xC9, 0x92, 0xC8, + 0x39, 0xE2, 0x7D, 0xE1, 0xBF, 0xF7, 0x01, 0xFB, 0x96, 0x02, 0x36, 0x01, + 0x62, 0x03, 0x17, 0x08, 0x73, 0xF6, 0x58, 0x14, 0x26, 0xE3, 0x37, 0x12, + 0x25, 0xD1, 0x30, 0xFF, 0x27, 0xC9, 0x34, 0xF5, 0x5E, 0xC8, 0x29, 0xF1, + 0x1F, 0xCF, 0x2E, 0xE8, 0xBD, 0xD6, 0xD1, 0xDF, 0x96, 0xD7, 0xE1, 0xDB, + 0xFC, 0xDD, 0x58, 0xDC, 0x25, 0xE1, 0x87, 0xD7, 0xCD, 0xDB, 0xC3, 0xD5, + 0xB4, 0xCC, 0x6D, 0xCD, 0x13, 0xB9, 0x30, 0xB6, 0x7D, 0xAD, 0xCC, 0xA5, + 0xBB, 0xA7, 0xB8, 0xA0, 0x26, 0xA8, 0xD3, 0x9C, 0x7D, 0xBC, 0xC0, 0xA6, + 0x09, 0xE5, 0x22, 0xCB, 0x49, 0x0A, 0x3B, 0xF5, 0x0E, 0x26, 0x8B, 0x19, + 0x10, 0x38, 0x32, 0x33, 0x8F, 0x3D, 0x62, 0x38, 0xC8, 0x39, 0x03, 0x2D, + 0x4B, 0x25, 0x10, 0x13, 0xEA, 0x08, 0x87, 0xF5, 0xF7, 0xE6, 0xE9, 0xD5, + 0x6B, 0xC7, 0xE8, 0xBF, 0xC7, 0xAC, 0xFB, 0xB2, 0x5D, 0x9C, 0x5C, 0xA8, + 0x27, 0xA7, 0x65, 0xAB, 0xAC, 0xB9, 0x37, 0xB0, 0xB2, 0xCE, 0x74, 0xBB, + 0xA2, 0xE4, 0x3B, 0xD2, 0x31, 0xF1, 0x10, 0xEC, 0x14, 0x02, 0x46, 0x0A, + 0x7C, 0x1C, 0xF7, 0x23, 0xD3, 0x2B, 0xB7, 0x2E, 0xF6, 0x27, 0x2B, 0x33, + 0x0E, 0x1E, 0xB5, 0x32, 0x66, 0x1A, 0x5D, 0x26, 0x6C, 0x13, 0xBE, 0x0E, + 0x1C, 0x05, 0x2B, 0xFA, 0x5F, 0xFE, 0x06, 0xF4, 0x01, 0x04, 0xDC, 0xF4, + 0x4C, 0x17, 0xD6, 0xFA, 0x3B, 0x29, 0x50, 0xFE, 0xD7, 0x35, 0x43, 0x05, + 0xF3, 0x35, 0x53, 0x08, 0xD2, 0x25, 0x4C, 0xF9, 0x1E, 0x17, 0x27, 0xE6, + 0x12, 0x05, 0x8F, 0xD5, 0x8C, 0xEE, 0x8D, 0xCD, 0x58, 0xE4, 0xED, 0xD4, + 0x40, 0xE7, 0x37, 0xE1, 0xCB, 0xF0, 0x39, 0xEC, 0x3A, 0x03, 0xEF, 0xFE, + 0x26, 0x21, 0x5C, 0x1D, 0xF6, 0x42, 0x9B, 0x3D, 0x5C, 0x57, 0x39, 0x51, + 0xFB, 0x5C, 0xB4, 0x57, 0x2B, 0x60, 0x99, 0x5C, 0x9F, 0x59, 0xB9, 0x58, + 0x4A, 0x43, 0x5B, 0x3F, 0x27, 0x29, 0x7C, 0x1D, 0xC7, 0x08, 0x60, 0xFA, + 0xFD, 0xEE, 0x07, 0xE0, 0x68, 0xE5, 0x3E, 0xD1, 0xE7, 0xE8, 0xF0, 0xCB, + 0xEA, 0xEF, 0x3E, 0xC9, 0x8D, 0xFB, 0x0D, 0xCA, 0x08, 0x1C, 0xD8, 0xE1, + 0xB4, 0x38, 0x2F, 0x03, 0x47, 0x44, 0x2C, 0x22, 0xA1, 0x49, 0xFC, 0x3C, + 0x35, 0x4E, 0x10, 0x4F, 0xEF, 0x50, 0x5F, 0x56, 0xB3, 0x4E, 0x54, 0x56, + 0x84, 0x51, 0x1B, 0x58, 0x92, 0x4F, 0x58, 0x4F, 0xB0, 0x3A, 0xFF, 0x38, + 0x25, 0x2F, 0x92, 0x30, 0x02, 0x33, 0x97, 0x31, 0xA5, 0x2E, 0x90, 0x28, + 0x35, 0x29, 0x8A, 0x20, 0xFB, 0x2B, 0x9B, 0x1F, 0x84, 0x39, 0x73, 0x25, + 0x9C, 0x43, 0x99, 0x2A, 0x6D, 0x3A, 0xCA, 0x29, 0x73, 0x21, 0xCA, 0x19, + 0x82, 0x06, 0x8B, 0xFB, 0xC9, 0xF4, 0x07, 0xE7, 0x07, 0xE8, 0x61, 0xDD, + 0x5F, 0xE5, 0x7E, 0xDA, 0x41, 0xF8, 0xD9, 0xEA, 0xB6, 0x1C, 0xE6, 0x0F, + 0x97, 0x45, 0x44, 0x34, 0xF4, 0x5F, 0x22, 0x47, 0x4E, 0x5F, 0xF9, 0x51, + 0xCC, 0x55, 0x2E, 0x58, 0x24, 0x59, 0x72, 0x4F, 0x83, 0x52, 0x21, 0x36, + 0x96, 0x39, 0x41, 0x1D, 0xCC, 0x22, 0xB6, 0x0A, 0x26, 0x13, 0xBE, 0xFA, + 0x96, 0x02, 0x52, 0xEE, 0x39, 0xE9, 0xAF, 0xDF, 0x6F, 0xDF, 0x9E, 0xDE, + 0x0A, 0xE9, 0x76, 0xEC, 0x0E, 0xFF, 0x56, 0x04, 0xC6, 0x1E, 0x6A, 0x1E, + 0x30, 0x38, 0x17, 0x32, 0xD1, 0x46, 0x6E, 0x46, 0xDC, 0x51, 0x1C, 0x58, + 0x82, 0x59, 0xAB, 0x60, 0x3C, 0x53, 0x21, 0x5F, 0xE3, 0x49, 0xA2, 0x5D, + 0x5C, 0x43, 0x9E, 0x54, 0xA7, 0x3A, 0x23, 0x3E, 0x00, 0x32, 0xAA, 0x28, + 0xEF, 0x35, 0x1F, 0x22, 0xFA, 0x3D, 0x49, 0x25, 0xBD, 0x3E, 0x6A, 0x2F, + 0xB9, 0x3D, 0xC8, 0x37, 0xFF, 0x39, 0xBC, 0x32, 0x48, 0x37, 0xE4, 0x2D, + 0x15, 0x2F, 0x4D, 0x20, 0x56, 0x27, 0xD8, 0x0C, 0xC7, 0x19, 0x91, 0xFB, + 0xE0, 0xFC, 0xFA, 0xE9, 0x22, 0xE2, 0x78, 0xE1, 0xA2, 0xD6, 0x14, 0xE6, + 0xFA, 0xDD, 0xEF, 0xF4, 0x0C, 0xF4, 0xB9, 0x05, 0x90, 0x19, 0x83, 0x1F, + 0x8E, 0x43, 0xBB, 0x42, 0xDC, 0x59, 0x80, 0x57, 0x92, 0x5B, 0xC4, 0x58, + 0x71, 0x4B, 0x85, 0x4C, 0x24, 0x2A, 0x7D, 0x36, 0xF0, 0x06, 0x4D, 0x1E, + 0x4D, 0xEC, 0xF7, 0x03, 0xFD, 0xD5, 0x01, 0xE5, 0x1B, 0xC6, 0xF2, 0xCA, + 0x9A, 0xB3, 0x51, 0xB2, 0xA1, 0xA3, 0x78, 0xA6, 0x57, 0xA2, 0x68, 0xAF, + 0xB6, 0xAD, 0x00, 0xBE, 0xED, 0xC8, 0xD4, 0xD3, 0x3B, 0xE9, 0xF7, 0xEC, + 0x06, 0x03, 0x71, 0xFE, 0x6B, 0x10, 0x58, 0x05, 0xA0, 0x19, 0x46, 0x11, + 0x36, 0x1A, 0x1B, 0x1A, 0x21, 0x0D, 0x65, 0x16, 0x55, 0xFF, 0xAE, 0x15, + 0x6C, 0xF3, 0x6F, 0x14, 0x16, 0xE4, 0x91, 0x06, 0xE6, 0xDA, 0x98, 0xF5, + 0x64, 0xDF, 0xCB, 0xEC, 0x27, 0xE2, 0x30, 0xE7, 0x51, 0xEA, 0x0F, 0xEC, + 0x1B, 0xF9, 0xF2, 0xF5, 0x55, 0x06, 0x5C, 0x02, 0xFA, 0x09, 0x42, 0x0C, + 0xC1, 0xFA, 0x44, 0x04, 0xCE, 0xE2, 0x73, 0xF0, 0x80, 0xC9, 0x1E, 0xD7, + 0xB9, 0xBA, 0x64, 0xC3, 0xB9, 0xBA, 0xBA, 0xBB, 0x15, 0xC1, 0xF1, 0xBF, + 0x72, 0xD1, 0x16, 0xD3, 0xB2, 0xEB, 0xE0, 0xEE, 0x15, 0x0E, 0xE9, 0x11, + 0x0F, 0x33, 0x21, 0x2E, 0xF1, 0x49, 0x07, 0x34, 0x9C, 0x4A, 0xC5, 0x2D, + 0x7F, 0x3A, 0xA0, 0x1F, 0xA1, 0x1C, 0x95, 0x04, 0xAA, 0xF6, 0x59, 0xE2, + 0x4D, 0xD8, 0x81, 0xC7, 0x58, 0xC6, 0xD5, 0xBE, 0xFC, 0xBA, 0xF7, 0xC4, + 0x11, 0xB1, 0x0F, 0xCD, 0xCE, 0xB3, 0x94, 0xD9, 0xA6, 0xC1, 0x78, 0xE6, + 0xA1, 0xD4, 0x47, 0xF7, 0xD9, 0xE9, 0xDA, 0x0B, 0xD1, 0xF8, 0x52, 0x1A, + 0xBC, 0xFF, 0x03, 0x29, 0x5E, 0x04, 0x6B, 0x3B, 0xAF, 0x0A, 0x7E, 0x49, + 0xDB, 0x08, 0xDB, 0x40, 0x54, 0xFE, 0xE7, 0x26, 0x75, 0xF6, 0x72, 0x18, + 0xB9, 0xF0, 0x00, 0x12, 0x81, 0xE5, 0x35, 0x04, 0xEA, 0xDF, 0x99, 0xFD, + 0x24, 0xE5, 0xAB, 0xFB, 0xBE, 0xF4, 0x19, 0xFF, 0x23, 0x0A, 0x62, 0x10, + 0xEC, 0x16, 0xCC, 0x1D, 0x2F, 0x1E, 0x60, 0x1E, 0x26, 0x1E, 0xF8, 0x0E, + 0x7B, 0x0F, 0x5F, 0xF9, 0xE8, 0xF1, 0x75, 0xE9, 0x4E, 0xCE, 0xF7, 0xDC, + 0xC8, 0xB8, 0x56, 0xD8, 0x3B, 0xBA, 0xC5, 0xD9, 0x67, 0xD2, 0x18, 0xE8, + 0xC5, 0xF2, 0x2F, 0x02, 0xE5, 0x13, 0x72, 0x17, 0x50, 0x3D, 0x0A, 0x2D, + 0xC0, 0x55, 0xCB, 0x38, 0xDA, 0x54, 0x46, 0x39, 0x02, 0x45, 0xFD, 0x39, + 0x9E, 0x27, 0x6D, 0x31, 0x76, 0x01, 0x0F, 0x14, 0xCA, 0xDF, 0xDE, 0xF2, + 0x67, 0xC5, 0x27, 0xDC, 0xB4, 0xAF, 0x6B, 0xCA, 0x79, 0xA3, 0x28, 0xBC, + 0xE1, 0x9F, 0x13, 0xBB, 0x19, 0xAB, 0x2D, 0xD3, 0x5A, 0xBF, 0x72, 0xED, + 0xF9, 0xDC, 0x90, 0x02, 0x5A, 0xFB, 0xC2, 0x11, 0xC6, 0x07, 0x98, 0x10, + 0x55, 0x09, 0x7F, 0x0E, 0x45, 0x10, 0xAD, 0x14, 0x5E, 0x15, 0xF4, 0x15, + 0x00, 0x04, 0x99, 0x0B, 0xCD, 0xE7, 0xE8, 0xFF, 0x8D, 0xDA, 0xEE, 0xFB, + 0xA6, 0xD3, 0xF3, 0xF6, 0x61, 0xCF, 0xB4, 0xF1, 0xD6, 0xD7, 0x0E, 0xF3, + 0x1D, 0xDE, 0x7A, 0xEF, 0x9A, 0xE0, 0x94, 0xEE, 0xBE, 0xE5, 0xCF, 0xFA, + 0xEF, 0xEA, 0xDB, 0x0F, 0x44, 0xEF, 0x58, 0x21, 0x54, 0xEC, 0x67, 0x1B, + 0x97, 0xE2, 0x2B, 0x04, 0x6C, 0xCB, 0x80, 0xE2, 0x2F, 0xAB, 0xAD, 0xBC, + 0x7F, 0x99, 0xAF, 0xA5, 0x9B, 0xA0, 0x71, 0xA1, 0x7E, 0xC0, 0x7B, 0xB3, + 0x0C, 0xE7, 0x9D, 0xD6, 0xC3, 0x11, 0xDF, 0x00, 0xD9, 0x3B, 0x36, 0x1E, + 0xF4, 0x4B, 0xC2, 0x21, 0xF6, 0x45, 0x48, 0x1B, 0x00, 0x30, 0x1A, 0x07, + 0xDC, 0x08, 0xA5, 0xE5, 0xDA, 0xD9, 0x76, 0xC4, 0x88, 0xBE, 0x5F, 0xB3, + 0x22, 0xAE, 0x7C, 0xA9, 0x25, 0x9F, 0x89, 0xA0, 0x19, 0xA1, 0x1E, 0xA1, + 0x12, 0xB0, 0x8B, 0xAD, 0x00, 0xC5, 0x08, 0xC2, 0x85, 0xE1, 0xB7, 0xD5, + 0xDA, 0x02, 0xA0, 0xEB, 0x37, 0x13, 0xC5, 0xFB, 0xF7, 0x0F, 0xE0, 0x01, + 0x00, 0x07, 0xF6, 0x05, 0x0B, 0x01, 0xD2, 0x0C, 0x8B, 0xF4, 0xFE, 0x03, + 0x14, 0xDD, 0x33, 0xE6, 0xB3, 0xD2, 0x3D, 0xD6, 0xCA, 0xD7, 0x7C, 0xD6, + 0x37, 0xD4, 0xE5, 0xCC, 0x16, 0xD3, 0x74, 0xC9, 0x87, 0xE6, 0x4D, 0xDA, + 0x33, 0xF7, 0xAC, 0xEC, 0x24, 0xFF, 0x6D, 0x00, 0x94, 0x06, 0x9C, 0x0C, + 0x4E, 0x07, 0xA3, 0x06, 0xA8, 0xFA, 0x4C, 0xF5, 0xC1, 0xE4, 0xCF, 0xDD, + 0x10, 0xCB, 0x6B, 0xC4, 0x53, 0xB0, 0x82, 0xAC, 0xBC, 0xA1, 0x1B, 0xA0, + 0x98, 0xA4, 0x79, 0xA2, 0xEB, 0xB9, 0x55, 0xB4, 0x16, 0xE1, 0xDF, 0xD3, + 0x72, 0x0A, 0x70, 0xEF, 0xB7, 0x2F, 0x4F, 0x09, 0x2C, 0x42, 0x40, 0x1E, + 0x97, 0x3B, 0xC4, 0x23, 0xF8, 0x2A, 0xAE, 0x1E, 0xF9, 0x0F, 0x1B, 0x09, + 0x08, 0xE7, 0x56, 0xE5, 0x52, 0xBF, 0xAA, 0xC8, 0xD4, 0xAD, 0xFE, 0xB9, + 0xA7, 0xA8, 0xCF, 0xAA, 0x73, 0xA6, 0xE7, 0x9F, 0x7C, 0xAC, 0xD7, 0x9F, + 0xA1, 0xC2, 0x34, 0xB0, 0x59, 0xDC, 0xB6, 0xC8, 0x99, 0xF0, 0x4C, 0xE0, + 0x50, 0x05, 0xF8, 0xF6, 0xBB, 0x15, 0x39, 0x02, 0xCD, 0x1B, 0x1B, 0x02, + 0x15, 0x19, 0x9A, 0xFE, 0xC9, 0x12, 0xC1, 0xFA, 0x5A, 0x02, 0x03, 0xF4, + 0xC1, 0xF0, 0x99, 0xF3, 0xF3, 0xEB, 0xFC, 0xFB, 0xF3, 0xE8, 0xD8, 0xFA, + 0xC0, 0xE0, 0x06, 0xEC, 0xD8, 0xE7, 0xBE, 0xE9, 0x93, 0x01, 0x30, 0xF8, + 0x3E, 0x17, 0x09, 0x05, 0x99, 0x20, 0x0C, 0x0E, 0xDF, 0x26, 0x56, 0x16, + 0xB5, 0x2C, 0xBA, 0x1F, 0xC8, 0x20, 0x90, 0x1E, 0xC7, 0x00, 0xF8, 0x07, + 0x08, 0xE0, 0x22, 0xE6, 0x8A, 0xC6, 0x2B, 0xC2, 0xBD, 0xB6, 0x0B, 0xA3, + 0xE5, 0xBE, 0xEA, 0x9E, 0xA4, 0xDF, 0xB7, 0xBC, 0x21, 0x06, 0xDE, 0xE9, + 0x18, 0x2A, 0xE3, 0x18, 0xF0, 0x4D, 0xFB, 0x45, 0x55, 0x5D, 0x38, 0x5A, + 0xEE, 0x55, 0xB6, 0x50, 0x6E, 0x4C, 0x6C, 0x3E, 0x6D, 0x36, 0x71, 0x1F, + 0x0F, 0x06, 0x5C, 0xED, 0xD3, 0xD5, 0x75, 0xC6, 0xD0, 0xBD, 0x93, 0xBD, + 0x79, 0xBA, 0x9C, 0xC4, 0x5B, 0xBF, 0x8D, 0xC8, 0x48, 0xCA, 0x38, 0xC7, + 0xD9, 0xE6, 0xBE, 0xD7, 0x25, 0x02, 0xF4, 0xF3, 0x38, 0x10, 0x0F, 0x09, + 0x55, 0x1F, 0x3E, 0x17, 0xB9, 0x2D, 0x4F, 0x21, 0x22, 0x2C, 0xAC, 0x25, + 0x65, 0x25, 0x34, 0x2B, 0xD6, 0x25, 0xE3, 0x2E, 0xAC, 0x18, 0xC6, 0x1A, + 0x4E, 0x07, 0xD9, 0x00, 0x94, 0x0B, 0xD1, 0xFE, 0xC2, 0x0C, 0x24, 0x00, + 0x7F, 0xFE, 0xAB, 0xF9, 0x52, 0x02, 0x86, 0x03, 0xEB, 0x17, 0x31, 0x19, + 0x4A, 0x25, 0xA3, 0x29, 0x65, 0x29, 0x4A, 0x34, 0x69, 0x36, 0x1C, 0x3E, + 0xA9, 0x45, 0x3F, 0x3F, 0xD0, 0x36, 0xD6, 0x26, 0x87, 0x0F, 0xB0, 0x00, + 0xB9, 0xEE, 0xE0, 0xE2, 0xCE, 0xDD, 0xD4, 0xD1, 0x7D, 0xE1, 0x58, 0xD4, + 0xC2, 0xFB, 0x1C, 0xED, 0xDF, 0x1B, 0x98, 0x0B, 0x36, 0x36, 0x17, 0x25, + 0xD3, 0x4F, 0x17, 0x41, 0x34, 0x5F, 0xC4, 0x57, 0x6F, 0x5E, 0xC5, 0x5D, + 0xEE, 0x58, 0xA5, 0x5A, 0xA4, 0x4F, 0xBC, 0x52, 0xEC, 0x35, 0x4E, 0x3A, + 0xDE, 0x0B, 0x93, 0x13, 0x1D, 0xE7, 0xA9, 0xF7, 0x3C, 0xD5, 0xBD, 0xE8, + 0xD5, 0xDA, 0x28, 0xDE, 0x02, 0xE4, 0x75, 0xD1, 0xAF, 0xF5, 0x78, 0xDC, + 0xCF, 0x15, 0x2C, 0x01, 0x58, 0x2B, 0xBE, 0x1B, 0x79, 0x37, 0xB4, 0x2F, + 0x94, 0x40, 0xAB, 0x41, 0x4A, 0x40, 0x67, 0x41, 0x73, 0x3F, 0xCA, 0x36, + 0xD6, 0x43, 0x32, 0x35, 0x53, 0x34, 0x23, 0x32, 0x57, 0x12, 0x41, 0x28, + 0xBF, 0x04, 0x2E, 0x29, 0x50, 0x0F, 0x9B, 0x32, 0x8F, 0x0F, 0xAC, 0x29, + 0x7E, 0x0A, 0x63, 0x1A, 0x35, 0x11, 0x3C, 0x1C, 0xF8, 0x1F, 0x37, 0x29, + 0x19, 0x30, 0x47, 0x31, 0xFD, 0x39, 0x6E, 0x33, 0x5D, 0x3E, 0x7B, 0x3C, + 0x80, 0x35, 0x9A, 0x3A, 0xF7, 0x1A, 0x69, 0x1F, 0xB4, 0xF7, 0x52, 0xFD, + 0xA0, 0xD4, 0xC4, 0xDF, 0x0F, 0xBB, 0x68, 0xC8, 0x5C, 0xBD, 0x20, 0xC9, + 0x03, 0xDE, 0xB2, 0xE3, 0xCF, 0x06, 0xD1, 0x03, 0xCB, 0x26, 0xC7, 0x23, + 0xFC, 0x43, 0x6F, 0x47, 0x35, 0x55, 0x8E, 0x58, 0x05, 0x52, 0x3E, 0x52, + 0x45, 0x40, 0xD2, 0x3E, 0x13, 0x2C, 0xEC, 0x1E, 0x07, 0x10, 0x94, 0xF0, + 0x7C, 0xEB, 0xAE, 0xCA, 0xFB, 0xCB, 0xF1, 0xBC, 0x4A, 0xB7, 0x20, 0xB8, + 0xA3, 0xB2, 0xD1, 0xB7, 0xE7, 0xBA, 0x91, 0xBE, 0xDA, 0xD5, 0xFC, 0xD6, + 0x8A, 0xF1, 0x20, 0xF1, 0x45, 0x04, 0xDF, 0x05, 0xFA, 0x13, 0x63, 0x1A, + 0x62, 0x1A, 0xCD, 0x25, 0x3B, 0x0F, 0xA1, 0x22, 0xE6, 0xFF, 0x32, 0x20, + 0x2E, 0xFB, 0x08, 0x21, 0xBE, 0xF5, 0x69, 0x10, 0x2E, 0xEC, 0x50, 0xF9, + 0xE5, 0xF0, 0xDD, 0xF8, 0x66, 0xFD, 0x5E, 0xFE, 0x94, 0x00, 0xC5, 0xF5, + 0x99, 0x09, 0x00, 0xFA, 0x99, 0x1A, 0x54, 0x0E, 0x30, 0x23, 0x7C, 0x1B, + 0x1A, 0x27, 0x99, 0x25, 0x26, 0x36, 0xDA, 0x39, 0xFF, 0x3B, 0xEF, 0x3E, + 0x85, 0x20, 0x69, 0x21, 0xAA, 0xFB, 0x34, 0xFF, 0xF7, 0xE2, 0xA7, 0xEA, + 0x33, 0xCD, 0xAD, 0xDB, 0xA0, 0xC5, 0xDF, 0xDE, 0xBD, 0xDC, 0xF9, 0xF6, + 0x7D, 0x05, 0xF9, 0x14, 0xF1, 0x29, 0x3D, 0x31, 0x1D, 0x4A, 0x22, 0x4E, + 0x5A, 0x5E, 0x8C, 0x62, 0xE9, 0x55, 0x20, 0x63, 0x99, 0x46, 0x7C, 0x5D, + 0xE6, 0x3A, 0x52, 0x51, 0x1A, 0x25, 0x90, 0x35, 0x28, 0x05, 0xC0, 0x0C, + 0x16, 0xF1, 0x6B, 0xED, 0x49, 0xE2, 0xA0, 0xD8, 0xEE, 0xD2, 0x0D, 0xCF, + 0x57, 0xCD, 0xD5, 0xD4, 0x23, 0xDC, 0xD5, 0xE6, 0xF6, 0xFA, 0xD7, 0xFC, + 0x2C, 0x12, 0x7C, 0x0D, 0xC7, 0x21, 0x47, 0x24, 0x99, 0x2C, 0xD9, 0x35, + 0x4B, 0x32, 0x69, 0x37, 0xF2, 0x34, 0x4A, 0x37, 0x95, 0x37, 0x85, 0x3F, + 0xFE, 0x2C, 0x54, 0x3C, 0x81, 0x15, 0xE4, 0x2A, 0xAA, 0x0F, 0xEA, 0x2A, + 0x48, 0x19, 0x14, 0x36, 0x72, 0x0E, 0xCC, 0x2A, 0xCB, 0x01, 0x96, 0x22, + 0x3B, 0x12, 0xF6, 0x2D, 0x35, 0x25, 0x7C, 0x2E, 0x3B, 0x28, 0xFC, 0x28, + 0x54, 0x2B, 0x6E, 0x2C, 0x91, 0x35, 0x1E, 0x39, 0x7D, 0x2D, 0x1A, 0x37, + 0x7D, 0x0E, 0x5F, 0x1E, 0x20, 0xE8, 0x48, 0x04, 0x1B, 0xC4, 0x3D, 0xEB, + 0xBF, 0xB6, 0xFC, 0xD5, 0xFB, 0xC6, 0x29, 0xD0, 0xD1, 0xE6, 0x06, 0xE1, + 0x3F, 0x0A, 0x47, 0xFE, 0xB1, 0x2E, 0xF4, 0x1E, 0x23, 0x54, 0x56, 0x49, + 0x6C, 0x64, 0xA4, 0x60, 0x1F, 0x54, 0xD9, 0x53, 0x1D, 0x37, 0x39, 0x39, + 0xA3, 0x1A, 0xC5, 0x17, 0x8F, 0xF5, 0x3E, 0xEB, 0xFE, 0xC7, 0x3A, 0xC5, + 0x22, 0xA9, 0xB4, 0xB3, 0x9D, 0xA0, 0x40, 0xAD, 0x21, 0xA6, 0x01, 0xB1, + 0x2A, 0xB5, 0x86, 0xC0, 0x09, 0xD0, 0xA0, 0xDE, 0xF6, 0xE5, 0x10, 0xF8, + 0x7B, 0xF3, 0xD5, 0x03, 0x35, 0x06, 0xD0, 0x10, 0xEB, 0x0B, 0x71, 0x1A, + 0x10, 0xFA, 0xFA, 0x15, 0x2D, 0xED, 0x87, 0x0B, 0x10, 0xEE, 0xE6, 0x03, + 0xFF, 0xE5, 0x82, 0xF4, 0xB3, 0xD4, 0x62, 0xDD, 0xF1, 0xCF, 0xA0, 0xD0, + 0xEF, 0xD3, 0xFE, 0xC7, 0xEA, 0xC8, 0xAE, 0xB3, 0xDB, 0xC7, 0x37, 0xB7, + 0xD3, 0xE0, 0x24, 0xD3, 0x81, 0xFA, 0xB7, 0xE1, 0x9F, 0x03, 0x39, 0xE1, + 0x20, 0x08, 0x4D, 0xE5, 0x38, 0x08, 0xC4, 0xED, 0xCE, 0xE9, 0x8C, 0xD8, + 0xE1, 0xC6, 0x62, 0xB9, 0xDA, 0xB3, 0xC9, 0xA9, 0x30, 0xA2, 0xB8, 0x9E, + 0xC4, 0x99, 0xEF, 0x9E, 0xD4, 0xAB, 0x72, 0xB6, 0x50, 0xCC, 0x25, 0xD6, + 0x73, 0xE6, 0xB2, 0xEE, 0x8E, 0xFD, 0x9B, 0x07, 0x3D, 0x18, 0x86, 0x23, + 0x1C, 0x1F, 0x81, 0x2B, 0xEE, 0x0B, 0x42, 0x1A, 0xC5, 0xF1, 0x40, 0x01, + 0x94, 0xD3, 0xAB, 0xE0, 0x57, 0xB4, 0xC2, 0xBB, 0x94, 0x9F, 0x28, 0xA4, + 0x27, 0x9E, 0x8C, 0x9E, 0x0D, 0xA5, 0xE4, 0xA1, 0x56, 0xA8, 0xC5, 0xA4, + 0x62, 0xB2, 0xB7, 0xAA, 0x4F, 0xD0, 0xA4, 0xC2, 0xDF, 0xEA, 0x17, 0xDE, + 0xA4, 0xF6, 0xB7, 0xF1, 0x73, 0xFD, 0x70, 0x01, 0x65, 0xF6, 0xE7, 0x02, + 0xDA, 0xE2, 0x6A, 0xEE, 0xE2, 0xD7, 0x11, 0xDA, 0x4C, 0xD6, 0xC5, 0xD5, + 0xD4, 0xCB, 0x78, 0xD0, 0x83, 0xC8, 0xBF, 0xC6, 0x81, 0xDC, 0xAE, 0xCA, + 0x0C, 0xE2, 0xEA, 0xCC, 0xEC, 0xCD, 0x81, 0xC1, 0x5A, 0xCD, 0x1E, 0xCE, + 0x0D, 0xE2, 0xF9, 0xEA, 0xB9, 0xEE, 0x9A, 0xFA, 0x08, 0xF5, 0xFB, 0x02, + 0x2E, 0x00, 0xB9, 0x10, 0x87, 0xFB, 0xFE, 0x13, 0xDE, 0xDB, 0xFE, 0xF3, + 0x0E, 0xBC, 0x88, 0xD1, 0xAC, 0xA7, 0xD4, 0xBF, 0xCB, 0x9C, 0x96, 0xAD, + 0x13, 0xA1, 0x43, 0xA8, 0x9A, 0xBA, 0xC9, 0xBB, 0xDB, 0xE0, 0x52, 0xD8, + 0x17, 0x01, 0xCE, 0xF5, 0xF6, 0x1D, 0xFE, 0x16, 0x68, 0x39, 0xB6, 0x2F, + 0xD4, 0x40, 0x0D, 0x2D, 0xDD, 0x2F, 0xDA, 0x11, 0xCA, 0x14, 0x30, 0xF3, + 0x18, 0xEF, 0x91, 0xD1, 0xE5, 0xC2, 0xB6, 0xAC, 0x3C, 0xAC, 0x25, 0x9B, + 0x6B, 0xAC, 0xBC, 0xA3, 0x16, 0xB2, 0xA0, 0xB7, 0x1A, 0xB4, 0xB0, 0xC5, + 0xD6, 0xC8, 0x9F, 0xDF, 0xDF, 0xED, 0x2C, 0xFE, 0x53, 0x01, 0x86, 0x09, + 0xDB, 0x10, 0x02, 0x17, 0xEA, 0x20, 0x0B, 0x25, 0xE3, 0x1A, 0x80, 0x1D, + 0xE5, 0x08, 0x8E, 0x0A, 0x33, 0x00, 0x40, 0x01, 0x32, 0xFA, 0x8B, 0xF8, + 0xB3, 0xEF, 0xAE, 0xE2, 0x06, 0xF3, 0x85, 0xD6, 0xCE, 0x01, 0x6C, 0xDF, + 0xF9, 0xFB, 0xDA, 0xD8, 0xE9, 0xF2, 0x46, 0xD4, 0x95, 0xFF, 0x6C, 0xEF, + 0x58, 0x10, 0x0C, 0x0C, 0xB4, 0x18, 0x70, 0x13, 0x71, 0x22, 0xDD, 0x0E, + 0x1F, 0x2F, 0x45, 0x0F, 0x88, 0x1B, 0x62, 0xFE, 0x9A, 0xED, 0xF7, 0xDA, + 0xFE, 0xD0, 0x2A, 0xC6, 0xCE, 0xC6, 0xF0, 0xBE, 0xCC, 0xBC, 0x3C, 0xB6, + 0x78, 0xC1, 0x32, 0xBD, 0x90, 0xE0, 0xFF, 0xDD, 0xC1, 0x04, 0x16, 0xFD, + 0xB0, 0x23, 0x2E, 0x1B, 0x23, 0x40, 0xDF, 0x42, 0x44, 0x4A, 0xF8, 0x54, + 0x92, 0x3A, 0x90, 0x44, 0x84, 0x21, 0xAC, 0x2C, 0xFA, 0x03, 0x0B, 0x15, + 0x02, 0xD7, 0x97, 0xEB, 0x73, 0xAF, 0xDD, 0xC0, 0xE6, 0xA7, 0x75, 0xB2, + 0x35, 0xB0, 0x12, 0xB8, 0xCB, 0xB2, 0x66, 0xBA, 0xD0, 0xB2, 0xDD, 0xB9, + 0x96, 0xD0, 0xAF, 0xD6, 0xAB, 0xFC, 0xF5, 0xFF, 0xBC, 0x17, 0x9B, 0x1D, + 0x19, 0x2E, 0xC2, 0x32, 0x80, 0x3C, 0x38, 0x30, 0x39, 0x3B, 0xA4, 0x1E, + 0xA8, 0x36, 0x9C, 0x15, 0xE4, 0x31, 0xE1, 0x0F, 0xD2, 0x1F, 0xBC, 0xFD, + 0x6A, 0x07, 0xFB, 0xEA, 0x6A, 0x05, 0x80, 0xF3, 0x7D, 0x0C, 0x6A, 0x05, + 0xD0, 0x05, 0x08, 0x03, 0x83, 0x13, 0xFA, 0x09, 0xBA, 0x33, 0x5B, 0x23, + 0x57, 0x45, 0xD0, 0x39, 0xEA, 0x43, 0x9A, 0x44, 0xEC, 0x45, 0xBF, 0x50, + 0x1D, 0x44, 0xE5, 0x52, 0x52, 0x1E, 0xD1, 0x2C, 0x54, 0xF7, 0x85, 0x02, + 0x7F, 0xEB, 0x1F, 0xF0, 0x61, 0xE7, 0x18, 0xE0, 0xC0, 0xE3, 0x7D, 0xCF, + 0x85, 0xEC, 0xA2, 0xD9, 0x97, 0x05, 0xDA, 0xFD, 0x5A, 0x24, 0x63, 0x25, + 0x95, 0x45, 0xA8, 0x48, 0x95, 0x5C, 0xEF, 0x5A, 0x58, 0x5B, 0x73, 0x56, + 0x99, 0x47, 0xF5, 0x42, 0x55, 0x2B, 0x23, 0x28, 0x4D, 0x0B, 0x0D, 0x04, + 0xE8, 0xE0, 0x22, 0xD7, 0xA2, 0xBB, 0xF4, 0xB8, 0x2F, 0xB5, 0xC9, 0xB5, + 0x51, 0xC7, 0xE6, 0xC7, 0xD5, 0xD1, 0xEA, 0xD4, 0x41, 0xDD, 0x7B, 0xE8, + 0xEA, 0xFD, 0x01, 0x13, 0xBF, 0x1C, 0x41, 0x2E, 0xF2, 0x29, 0x4E, 0x34, + 0x8A, 0x2B, 0xCE, 0x35, 0x58, 0x23, 0xA5, 0x2B, 0x9A, 0x15, 0x0C, 0x1A, + 0x11, 0x0F, 0x44, 0x12, 0x81, 0x03, 0x2F, 0x0A, 0xDC, 0xE5, 0xE0, 0xF5, + 0x78, 0xD3, 0x4C, 0xEA, 0x47, 0xE2, 0xEC, 0xEE, 0xC2, 0xEA, 0x1C, 0xE6, + 0x56, 0xEA, 0x5C, 0xE2, 0xBF, 0x03, 0xD1, 0xF7, 0xBE, 0x25, 0x81, 0x0A, + 0xA0, 0x34, 0xC8, 0x10, 0xB1, 0x38, 0xB8, 0x15, 0x57, 0x3D, 0xFC, 0x1E, + 0xEE, 0x28, 0x6C, 0x10, 0xC7, 0x01, 0x7B, 0xE5, 0xC0, 0xE5, 0x45, 0xC5, + 0x5F, 0xD6, 0xF5, 0xBC, 0x31, 0xCE, 0xF7, 0xB9, 0xA9, 0xD7, 0xCB, 0xC2, + 0xEA, 0xF8, 0x40, 0xE8, 0x2E, 0x17, 0xF7, 0x14, 0xB2, 0x2C, 0xD5, 0x36, + 0xEE, 0x49, 0x13, 0x51, 0x86, 0x5F, 0xE4, 0x5C, 0x99, 0x5A, 0x29, 0x58, + 0xEB, 0x41, 0x8F, 0x4B, 0x94, 0x23, 0x05, 0x37, 0xB4, 0xF9, 0xC8, 0x0E, + 0x82, 0xCE, 0x95, 0xE3, 0x66, 0xB9, 0x70, 0xD1, 0x53, 0xBA, 0xEF, 0xD1, + 0xCC, 0xC8, 0xF4, 0xD4, 0x75, 0xE5, 0xC2, 0xE3, 0x03, 0x0E, 0x5B, 0x09, + 0xD3, 0x28, 0x88, 0x29, 0x89, 0x3B, 0xB4, 0x3C, 0x64, 0x52, 0xCF, 0x4D, + 0x12, 0x5A, 0xBF, 0x4F, 0xC6, 0x4E, 0x96, 0x40, 0x47, 0x40, 0xCF, 0x31, + 0x8C, 0x30, 0x82, 0x25, 0xFC, 0x1B, 0x8D, 0x12, 0x6F, 0x0E, 0x11, 0x0B, + 0x0F, 0x13, 0x6B, 0x1E, 0x26, 0x15, 0xCC, 0x27, 0x69, 0x0F, 0xF7, 0x1C, + 0x07, 0x1F, 0x17, 0x26, 0xD8, 0x39, 0x27, 0x40, 0xEF, 0x43, 0xD0, 0x51, + 0x73, 0x45, 0x26, 0x58, 0x85, 0x56, 0xBE, 0x60, 0x0E, 0x58, 0x2B, 0x58, + 0x71, 0x33, 0xAF, 0x34, 0x24, 0x0F, 0x5C, 0x18, 0xDE, 0xF5, 0xE1, 0x04, + 0x31, 0xE0, 0x8F, 0xEE, 0xF0, 0xE2, 0x91, 0xE7, 0x25, 0x05, 0x4F, 0xFC, + 0x5F, 0x28, 0x67, 0x1B, 0x09, 0x3E, 0x3E, 0x33, 0x7D, 0x54, 0x1C, 0x4C, + 0x17, 0x62, 0xC7, 0x5E, 0xBB, 0x60, 0x52, 0x60, 0xAE, 0x5B, 0x98, 0x54, + 0x23, 0x4F, 0x16, 0x3D, 0x65, 0x2E, 0xD2, 0x1E, 0x94, 0x03, 0x64, 0xFF, + 0x83, 0xE9, 0x54, 0xEC, 0x91, 0xE1, 0xC7, 0xE8, 0xD6, 0xE6, 0x58, 0xEB, + 0xD0, 0xF6, 0x9F, 0xF5, 0xBE, 0x16, 0x4C, 0x15, 0xA4, 0x34, 0x7D, 0x37, + 0xA8, 0x41, 0x8F, 0x4A, 0xF8, 0x4B, 0xBA, 0x58, 0x99, 0x51, 0x8C, 0x5C, + 0xFD, 0x4C, 0xA1, 0x4F, 0x84, 0x46, 0x2F, 0x47, 0x13, 0x3E, 0xFE, 0x4B, + 0x34, 0x25, 0x7E, 0x42, 0x0F, 0x09, 0x0C, 0x27, 0x40, 0x07, 0x2D, 0x1E, + 0x32, 0x0E, 0xDE, 0x25, 0xB2, 0x07, 0x90, 0x22, 0xB2, 0x0F, 0xD9, 0x26, + 0x9B, 0x28, 0x70, 0x37, 0x0A, 0x38, 0xC7, 0x40, 0xC7, 0x39, 0xD1, 0x41, + 0x37, 0x41, 0x43, 0x48, 0x66, 0x44, 0x4B, 0x4A, 0x29, 0x28, 0x47, 0x2B, + 0x7C, 0x08, 0x80, 0x03, 0xB4, 0xF7, 0xCC, 0xEE, 0xB6, 0xE5, 0xC4, 0xDD, + 0x1C, 0xDB, 0xF7, 0xD1, 0x0A, 0xEC, 0x4F, 0xE1, 0x9B, 0x0B, 0xE8, 0x03, + 0xE2, 0x21, 0xA4, 0x21, 0x53, 0x37, 0x90, 0x3A, 0x0D, 0x4C, 0xD4, 0x50, + 0x92, 0x4B, 0x0D, 0x56, 0xF2, 0x3A, 0x72, 0x47, 0xAE, 0x20, 0x86, 0x2D, + 0x0F, 0xFE, 0x7E, 0x11, 0x56, 0xDA, 0x5E, 0xF5, 0x9A, 0xC1, 0x97, 0xDD, + 0x86, 0xB9, 0x6E, 0xCD, 0x1D, 0xBD, 0x07, 0xC7, 0x0C, 0xC5, 0xC1, 0xC6, + 0x12, 0xD5, 0xD3, 0xD0, 0x59, 0xEB, 0x61, 0xE8, 0x88, 0xF6, 0xAB, 0xF9, + 0x75, 0x01, 0xC3, 0x0C, 0x95, 0x13, 0x86, 0x25, 0x8F, 0x17, 0xDE, 0x28, + 0x1B, 0x0A, 0xB6, 0x15, 0x1B, 0x02, 0x47, 0x08, 0xE2, 0xFE, 0xA0, 0x01, + 0x49, 0xF2, 0x6D, 0xEF, 0xB9, 0xE9, 0x10, 0xE1, 0xE5, 0xE9, 0x43, 0xE8, + 0x50, 0xE2, 0xD0, 0xEF, 0x00, 0xDE, 0xDE, 0xF2, 0xE1, 0xEC, 0xF2, 0xFC, + 0xDD, 0x01, 0x32, 0x06, 0x40, 0x0B, 0x1F, 0x06, 0x9D, 0x0E, 0x03, 0x05, + 0xDA, 0x11, 0x74, 0x0B, 0x37, 0xFF, 0xAB, 0x02, 0x1E, 0xE1, 0x53, 0xE8, + 0x1E, 0xD4, 0x01, 0xD5, 0x0E, 0xD0, 0xEC, 0xC7, 0x08, 0xC7, 0x02, 0xB6, + 0x4A, 0xC0, 0xFF, 0xAC, 0x5F, 0xCD, 0x20, 0xC5, 0xF7, 0xE4, 0x7F, 0xED, + 0x66, 0xF6, 0x4F, 0x08, 0x39, 0x0F, 0x79, 0x1F, 0xBD, 0x24, 0x10, 0x36, + 0x5C, 0x22, 0xF6, 0x37, 0x60, 0x12, 0x77, 0x22, 0x1D, 0xFF, 0x38, 0x04, + 0x60, 0xE1, 0xE4, 0xDE, 0xA8, 0xBE, 0x28, 0xB8, 0x24, 0xAF, 0x17, 0xA7, + 0x61, 0xB5, 0xF4, 0xAC, 0x24, 0xC0, 0x07, 0xB9, 0x35, 0xCC, 0x24, 0xCB, + 0x1E, 0xDF, 0x55, 0xE6, 0x42, 0xEB, 0x84, 0xF9, 0xB0, 0xF3, 0xD2, 0xFF, + 0x31, 0x01, 0x33, 0x09, 0x2B, 0x06, 0xF7, 0x14, 0x7C, 0xFB, 0x64, 0x13, + 0x5E, 0xEF, 0xBC, 0x0A, 0xF3, 0xEE, 0xD6, 0x09, 0xC8, 0xEC, 0x9C, 0x05, + 0xD0, 0xE3, 0x2F, 0xF9, 0xD2, 0xE4, 0xEF, 0xF4, 0x9E, 0xE8, 0xB6, 0xED, + 0x15, 0xE3, 0x57, 0xDE, 0xBD, 0xE3, 0xBA, 0xDE, 0x55, 0xF2, 0x9B, 0xF0, + 0x1A, 0xFF, 0xFA, 0xFB, 0xBA, 0xFE, 0xB3, 0xF7, 0xE1, 0x01, 0xB8, 0xF7, + 0x5D, 0x03, 0x1B, 0xF8, 0x8D, 0xED, 0xDD, 0xE4, 0x6A, 0xD8, 0xA6, 0xC9, + 0xE0, 0xD3, 0x48, 0xBC, 0x70, 0xCE, 0xF0, 0xB8, 0x28, 0xCB, 0xF8, 0xB8, + 0x2F, 0xDD, 0x86, 0xC9, 0x62, 0xFA, 0x43, 0xE9, 0x68, 0x0B, 0xE8, 0x05, + 0x7F, 0x19, 0x9A, 0x1C, 0xE7, 0x22, 0x4F, 0x26, 0xB3, 0x18, 0x35, 0x18, + 0xD0, 0x0C, 0xEF, 0x03, 0x54, 0x05, 0xE1, 0xF9, 0x0C, 0xF0, 0x3E, 0xE9, + 0x13, 0xD0, 0x08, 0xC6, 0x3D, 0xB8, 0x14, 0xA8, 0x5C, 0xB0, 0x95, 0xA2, + 0x37, 0xB6, 0x5F, 0xAB, 0xF6, 0xC0, 0x2D, 0xB5, 0x61, 0xD0, 0xC5, 0xC1, + 0x3C, 0xE4, 0xC6, 0xD7, 0xA5, 0xF4, 0x8E, 0xF2, 0xD0, 0x02, 0xB4, 0x05, + 0xF2, 0x0B, 0x40, 0x0A, 0xEE, 0x07, 0xC5, 0xFF, 0xA8, 0x00, 0x29, 0xFB, + 0x82, 0x00, 0xF7, 0x03, 0x14, 0xF4, 0x9D, 0xFA, 0xAC, 0xDC, 0x65, 0xDC, + 0xFB, 0xD8, 0x73, 0xD2, 0xDD, 0xE0, 0x7B, 0xE2, 0x12, 0xDD, 0x9C, 0xEC, + 0xEC, 0xD7, 0x81, 0xEB, 0x74, 0xE0, 0xD4, 0xE9, 0xB4, 0xE4, 0x5B, 0xE7, + 0x5D, 0xE1, 0x45, 0xE8, 0x85, 0xEF, 0x10, 0xF8, 0x80, 0xFB, 0xFE, 0xFA, + 0x28, 0xE7, 0x68, 0xDE, 0x13, 0xCD, 0x8D, 0xC9, 0xC6, 0xC6, 0xBC, 0xCC, + 0xDF, 0xC7, 0xF6, 0xD0, 0xF9, 0xC6, 0x3C, 0xC9, 0x81, 0xC5, 0xE7, 0xBC, + 0xC3, 0xD2, 0xCB, 0xC1, 0x8A, 0xF1, 0x69, 0xDC, 0x4F, 0x0C, 0x17, 0xF2, + 0xE3, 0x17, 0x38, 0xFB, 0x13, 0x1A, 0x80, 0x04, 0x74, 0x17, 0x3A, 0x08, + 0x34, 0x0B, 0xBC, 0xF6, 0x75, 0xF3, 0xC9, 0xD4, 0x63, 0xD9, 0xFB, 0xB7, + 0xF7, 0xCD, 0x81, 0xAE, 0xD6, 0xD4, 0xFE, 0xB8, 0x8E, 0xDD, 0x9E, 0xC3, + 0x34, 0xDA, 0x4A, 0xC3, 0x58, 0xDD, 0x6C, 0xD2, 0xE8, 0xF5, 0x01, 0xF7, + 0x58, 0x0E, 0x78, 0x14, 0x8A, 0x14, 0xEC, 0x19, 0x57, 0x0D, 0xDC, 0x11, + 0xFA, 0x03, 0xCC, 0x0B, 0x64, 0x03, 0xC3, 0x08, 0x7B, 0x0A, 0x3C, 0x0A, + 0xB4, 0x09, 0xF0, 0x0C, 0x5D, 0xFE, 0xBC, 0x0A, 0x8F, 0xF4, 0x12, 0x02, + 0xA1, 0xF4, 0xBB, 0xF6, 0xE7, 0xFB, 0xD2, 0xF2, 0xF9, 0x01, 0xD9, 0xF6, + 0x2B, 0x05, 0xD1, 0xFB, 0xA2, 0x08, 0x9D, 0xFD, 0x31, 0x09, 0x94, 0xFA, + 0xE2, 0x06, 0x7A, 0xF8, 0x8B, 0x03, 0x56, 0xF7, 0x2C, 0x01, 0x23, 0xF4, + 0xB5, 0xFB, 0xB0, 0xF0, 0x49, 0xF1, 0x75, 0xEB, 0x91, 0xEA, 0x7B, 0xE6, + 0x80, 0xE8, 0xAB, 0xE1, 0xA1, 0xE9, 0xAC, 0xDC, 0xD8, 0xF0, 0x64, 0xDE, + 0x83, 0xFB, 0x2E, 0xEB, 0x77, 0x01, 0x90, 0xFB, 0xBB, 0x08, 0x98, 0x05, + 0x3E, 0x10, 0xAA, 0x04, 0x42, 0x07, 0x58, 0xF7, 0x06, 0xF8, 0x01, 0xE9, + 0x45, 0xF1, 0x69, 0xE4, 0xED, 0xE7, 0xB2, 0xE0, 0x47, 0xD8, 0xCC, 0xD7, + 0x76, 0xCC, 0xB4, 0xD1, 0x6E, 0xC9, 0xC4, 0xD0, 0x61, 0xCC, 0xF1, 0xCA, + 0x04, 0xD4, 0x3E, 0xC6, 0x1D, 0xDE, 0xA1, 0xCD, 0x22, 0xE3, 0xB1, 0xD7, + 0xB9, 0xE4, 0xBD, 0xDE, 0x49, 0xEE, 0xA8, 0xE5, 0xF8, 0xF8, 0xD7, 0xEB, + 0xFE, 0xF9, 0x2C, 0xEF, 0xD6, 0xF5, 0x9A, 0xF3, 0xB9, 0xEE, 0x64, 0xF8, + 0xB6, 0xEB, 0x19, 0xF7, 0xC3, 0xEA, 0xCA, 0xF2, 0x27, 0xE8, 0xBD, 0xEF, + 0xD5, 0xEA, 0xF3, 0xF0, 0xE4, 0xF0, 0x44, 0xF7, 0x47, 0xF8, 0xC3, 0xFE, + 0xDF, 0xFE, 0xC6, 0x06, 0x34, 0xFF, 0x4C, 0x0B, 0x44, 0xFC, 0x9A, 0x07, + 0xF4, 0xF7, 0x18, 0xFB, 0xC4, 0xEF, 0x47, 0xED, 0x92, 0xE4, 0x2D, 0xE8, + 0x98, 0xE1, 0xFD, 0xE9, 0x3D, 0xEE, 0x72, 0xEC, 0xA1, 0xF9, 0xEA, 0xEC, + 0xDC, 0xFD, 0x32, 0xF0, 0x2C, 0x01, 0xB2, 0xF4, 0x91, 0x06, 0x87, 0xF4, + 0x1F, 0x10, 0xA9, 0xF4, 0x54, 0x1E, 0xE5, 0xFB, 0x8B, 0x2E, 0x63, 0x07, + 0xC3, 0x35, 0xA8, 0x0C, 0x2E, 0x2F, 0xC4, 0x06, 0xBE, 0x21, 0x4E, 0xFF, + 0xEB, 0x12, 0x29, 0xFB, 0x7F, 0x06, 0x03, 0xF8, 0x4C, 0x00, 0xEE, 0xF4, + 0x58, 0x01, 0xCC, 0xF2, 0x82, 0x08, 0x2C, 0xF9, 0xE4, 0x0D, 0xFE, 0x03, + 0xD3, 0x0D, 0x56, 0x0F, 0x5D, 0x0B, 0xD4, 0x19, 0x6B, 0x0B, 0xDE, 0x20, + 0xE2, 0x0F, 0xAA, 0x28, 0x4D, 0x17, 0x3C, 0x2D, 0xE6, 0x1A, 0x41, 0x2A, + 0x40, 0x1B, 0x0B, 0x21, 0x73, 0x20, 0xF7, 0x1E, 0x09, 0x25, 0xFE, 0x28, + 0x7E, 0x1F, 0x28, 0x2B, 0x91, 0x12, 0xBC, 0x24, 0xAD, 0x0C, 0x65, 0x22, + 0xC5, 0x10, 0x4E, 0x1F, 0xC5, 0x14, 0xB7, 0x16, 0xAF, 0x14, 0x5F, 0x0D, + 0xA6, 0x13, 0x33, 0x0D, 0xFB, 0x14, 0xE5, 0x17, 0x7A, 0x19, 0xF1, 0x23, + 0xD3, 0x1B, 0x19, 0x29, 0x4E, 0x17, 0x9E, 0x23, 0xC0, 0x12, 0xAF, 0x1F, + 0xCA, 0x19, 0x95, 0x22, 0x13, 0x27, 0x1B, 0x20, 0xBC, 0x2D, 0xAA, 0x1B, + 0x2B, 0x32, 0x65, 0x1E, 0x0F, 0x37, 0x5E, 0x26, 0xA7, 0x39, 0xDD, 0x2F, + 0xED, 0x39, 0x97, 0x37, 0x5D, 0x39, 0xB3, 0x39, 0x43, 0x36, 0x23, 0x31, + 0xEE, 0x2F, 0x6E, 0x26, 0x90, 0x2E, 0xF0, 0x26, 0xA5, 0x29, 0xCB, 0x28, + 0x09, 0x1C, 0x55, 0x22, 0x93, 0x16, 0x1B, 0x1F, 0xEA, 0x17, 0x51, 0x23, + 0x8A, 0x19, 0x73, 0x24, 0x29, 0x22, 0x27, 0x23, 0x95, 0x2E, 0x38, 0x27, + 0x0A, 0x35, 0x9F, 0x2A, 0xA6, 0x33, 0xC7, 0x29, 0xEF, 0x31, 0xDD, 0x27, + 0x76, 0x33, 0x6F, 0x22, 0xEB, 0x36, 0x47, 0x1D, 0x22, 0x3B, 0x76, 0x1D, + 0x5E, 0x37, 0x8B, 0x1F, 0x4F, 0x2D, 0xE6, 0x21, 0x66, 0x24, 0x3F, 0x23, + 0x6E, 0x1D, 0x79, 0x24, 0x97, 0x1A, 0xB4, 0x29, 0x94, 0x18, 0x86, 0x2E, + 0x4C, 0x17, 0x22, 0x31, 0x15, 0x1A, 0xFC, 0x35, 0x94, 0x1B, 0x40, 0x3E, + 0xAF, 0x17, 0x6B, 0x3E, 0xE4, 0x11, 0xEA, 0x33, 0x12, 0x0D, 0x8B, 0x2C, + 0xBC, 0x0A, 0x89, 0x2A, 0xD0, 0x0A, 0x35, 0x2B, 0x48, 0x09, 0x36, 0x2E, + 0x36, 0x07, 0xFF, 0x2C, 0xEE, 0x0B, 0xCB, 0x25, 0x80, 0x17, 0x69, 0x1F, + 0xF2, 0x1D, 0x83, 0x18, 0x42, 0x1C, 0x81, 0x12, 0x10, 0x20, 0xB1, 0x13, + 0x66, 0x20, 0x5F, 0x13, 0x19, 0x1C, 0x9F, 0x13, 0xD5, 0x18, 0xB0, 0x15, + 0xB5, 0x09, 0xDF, 0x0B, 0xFF, 0x00, 0xF1, 0x01, 0x50, 0x08, 0xE6, 0x04, + 0xA4, 0x0B, 0x23, 0x03, 0xDF, 0x07, 0x2B, 0xF5, 0xE5, 0x08, 0x39, 0xEF, + 0xD0, 0x12, 0xC2, 0xF6, 0x41, 0x18, 0xAF, 0xFF, 0x58, 0x14, 0x94, 0x0B, + 0xC7, 0x13, 0xB0, 0x1A, 0xD0, 0x19, 0x85, 0x25, 0x50, 0x18, 0x31, 0x25, + 0x94, 0x07, 0x93, 0x1B, 0x77, 0xF9, 0xCC, 0x15, 0x46, 0xFC, 0x1D, 0x11, + 0x70, 0x07, 0x6E, 0x0C, 0x8F, 0x0B, 0xA0, 0x0E, 0xA4, 0x03, 0xE6, 0x14, + 0x0E, 0xF9, 0xEF, 0x18, 0x27, 0xFD, 0xE8, 0x1B, 0x8F, 0x11, 0x89, 0x22, + 0xF4, 0x1C, 0x4F, 0x26, 0x19, 0x1A, 0xEF, 0x20, 0x4E, 0x10, 0x0E, 0x17, + 0xF0, 0x0A, 0x8F, 0x14, 0x50, 0x0D, 0x8F, 0x19, 0x60, 0x0A, 0x46, 0x1B, + 0x76, 0x01, 0x94, 0x0B, 0x90, 0xFD, 0x87, 0xFB, 0xCA, 0x0F, 0x7E, 0x06, + 0xD1, 0x1D, 0x02, 0x13, 0x7B, 0x12, 0x00, 0x0E, 0xE0, 0x08, 0xAA, 0x06, + 0xD8, 0x0C, 0x4E, 0x08, 0xDA, 0x17, 0x45, 0x13, 0x6D, 0x1C, 0x75, 0x1D, + 0xF7, 0x10, 0x15, 0x1B, 0x7B, 0x05, 0x80, 0x12, 0x9C, 0x06, 0x70, 0x14, + 0x0A, 0x0C, 0x57, 0x1B, 0x62, 0x00, 0xC4, 0x12, 0x1A, 0xF0, 0xF1, 0x09, + 0x76, 0xF6, 0x7F, 0x14, 0x26, 0x06, 0x07, 0x26, 0xE2, 0x0D, 0xCB, 0x2B, + 0x54, 0x0D, 0x9C, 0x20, 0xED, 0x0C, 0x24, 0x11, 0xAC, 0x08, 0x21, 0x09, + 0x9E, 0xFF, 0xA0, 0x07, 0x74, 0xF8, 0x76, 0x02, 0xB2, 0xF8, 0x5A, 0xFC, + 0x0F, 0x01, 0x36, 0xFB, 0xBB, 0x08, 0xEC, 0xF9, 0xD2, 0x0D, 0xAA, 0xF4, + 0x43, 0x10, 0xE5, 0xF0, 0x0B, 0x12, 0x71, 0xF1, 0xB8, 0x0F, 0x3F, 0xF4, + 0x74, 0x09, 0x6C, 0xFE, 0x8A, 0x05, 0x30, 0x10, 0xA4, 0x08, 0x01, 0x22, + 0x62, 0x0F, 0x37, 0x25, 0x3F, 0x0E, 0xF0, 0x20, 0xE1, 0x04, 0x98, 0x1E, + 0xD7, 0xFB, 0xE8, 0x17, 0x3D, 0xF8, 0xDD, 0x0C, 0x72, 0xF5, 0x7F, 0x00, + 0xD4, 0xF1, 0x55, 0xF9, 0xC0, 0xF4, 0x02, 0xF9, 0x4F, 0xFC, 0x22, 0xFC, + 0xCF, 0x05, 0xDC, 0x04, 0x13, 0x08, 0x0C, 0x0D, 0x5E, 0x00, 0x63, 0x0D, + 0xFA, 0xFD, 0x4B, 0x08, 0x2E, 0x02, 0xB9, 0xFF, 0x88, 0x03, 0x58, 0xFA, + 0x87, 0xFE, 0xCC, 0xF4, 0xA9, 0xFA, 0xF5, 0xEE, 0xAC, 0xF8, 0xA3, 0xEE, + 0x58, 0xF0, 0x07, 0xED, 0x23, 0xE3, 0xAD, 0xE9, 0x57, 0xDE, 0x32, 0xEB, + 0x17, 0xE4, 0xF7, 0xED, 0xA3, 0xEE, 0x9D, 0xF0, 0x09, 0xF8, 0xD3, 0xF5, + 0x35, 0xF4, 0x47, 0xF6, 0x29, 0xED, 0x52, 0xF5, 0x4F, 0xEF, 0xBF, 0xF5, + 0xB2, 0xF0, 0xA4, 0xF0, 0xD5, 0xE5, 0xC8, 0xE8, 0x04, 0xD7, 0x72, 0xE3, + 0x0E, 0xD4, 0xD7, 0xDE, 0xF0, 0xD5, 0xFD, 0xD3, 0xE2, 0xD5, 0xF5, 0xD1, + 0x6B, 0xDC, 0x3A, 0xE1, 0x3A, 0xE5, 0x06, 0xF0, 0x4F, 0xE7, 0x2B, 0xFA, + 0x76, 0xE7, 0xF8, 0x02, 0xEA, 0xE5, 0xFA, 0x07, 0xFF, 0xE0, 0x8E, 0x07, + 0x3E, 0xE3, 0x9B, 0x01, 0x54, 0xF0, 0x07, 0xF7, 0xE6, 0xF7, 0x47, 0xEE, + 0x90, 0xEF, 0x2E, 0xE9, 0x4B, 0xE5, 0x97, 0xE6, 0xEF, 0xE4, 0xD4, 0xE1, + 0x98, 0xED, 0x48, 0xDD, 0x67, 0xFC, 0x68, 0xDE, 0xCB, 0x05, 0xB4, 0xDC, + 0x7B, 0x06, 0x9A, 0xDF, 0x4F, 0x09, 0x5F, 0xEF, 0xB2, 0x05, 0xEF, 0xF9, + 0x53, 0xFB, 0xBC, 0xF6, 0x0B, 0xF6, 0x18, 0xF4, 0x1A, 0xF4, 0xA3, 0xFA, + 0xA0, 0xEF, 0xE2, 0xFE, 0x37, 0xE3, 0xFA, 0xF8, 0x0B, 0xD7, 0x80, 0xF0, + 0x55, 0xD7, 0x9D, 0xEB, 0x6E, 0xE5, 0x0B, 0xEC, 0xEC, 0xF0, 0xA7, 0xF1, + 0xDD, 0xEB, 0x35, 0xF3, 0xFC, 0xE5, 0x03, 0xF4, 0x2D, 0xE9, 0x1A, 0xF7, + 0xD9, 0xEB, 0x20, 0xF1, 0xC2, 0xEC, 0xF9, 0xE7, 0x78, 0xF2, 0xF0, 0xE3, + 0x58, 0xF2, 0x74, 0xDB, 0xB4, 0xEE, 0x98, 0xD3, 0x82, 0xEC, 0x2E, 0xD5, + 0x6F, 0xE4, 0x39, 0xD9, 0x68, 0xDB, 0x9A, 0xD9, 0xBB, 0xDA, 0x7D, 0xDD, + 0xC2, 0xE0, 0x64, 0xE2, 0xAA, 0xE4, 0x70, 0xE0, 0xDD, 0xE4, 0x4A, 0xE0, + 0x3D, 0xE1, 0xF7, 0xE1, 0xC7, 0xDA, 0x9E, 0xE1, 0x65, 0xD4, 0x6A, 0xE2, + 0x9A, 0xCF, 0x91, 0xE1, 0xBA, 0xD3, 0x0E, 0xDE, 0x14, 0xDC, 0x75, 0xD7, + 0x15, 0xDA, 0xD2, 0xCB, 0x88, 0xD6, 0x1D, 0xC8, 0x74, 0xD6, 0x96, 0xCD, + 0xF1, 0xD9, 0xB9, 0xD7, 0xB1, 0xE6, 0xD3, 0xE9, 0xBD, 0xEB, 0x4F, 0xF2, + 0x8A, 0xE4, 0xAB, 0xED, 0x00, 0xDE, 0x66, 0xE9, 0x40, 0xDA, 0x99, 0xE7, + 0xD4, 0xD6, 0x0C, 0xE3, 0xC9, 0xD4, 0x02, 0xDB, 0x6C, 0xD1, 0x00, 0xCF, + 0xA5, 0xCC, 0x90, 0xC1, 0x56, 0xD1, 0x74, 0xBE, 0x60, 0xD2, 0x54, 0xBE, + 0xD3, 0xCE, 0x73, 0xBB, 0xA6, 0xD8, 0xE1, 0xBB, 0xDD, 0xE3, 0x1B, 0xBC, + 0xE6, 0xEA, 0xD2, 0xC1, 0xD9, 0xEC, 0x12, 0xCC, 0xFC, 0xE2, 0xAC, 0xCC, + 0xAE, 0xD7, 0xF7, 0xCC, 0x11, 0xD2, 0x13, 0xD0, 0x60, 0xD0, 0xE1, 0xCB, + 0x81, 0xD2, 0x2E, 0xC6, 0x44, 0xD2, 0x2F, 0xC0, 0x21, 0xCB, 0xA4, 0xB8, + 0xD4, 0xCA, 0x2D, 0xBD, 0x5F, 0xCB, 0x80, 0xC7, 0x2F, 0xC4, 0x7A, 0xC7, + 0xDA, 0xCF, 0x8A, 0xD1, 0x2A, 0xE2, 0x9E, 0xE0, 0xBA, 0xE1, 0x9E, 0xE0, + 0x7B, 0xE5, 0xC2, 0xE3, 0x4A, 0xF0, 0xA4, 0xE9, 0x29, 0xF1, 0x73, 0xE6, + 0x02, 0xF1, 0x15, 0xE2, 0x8B, 0xF0, 0xAF, 0xDC, 0xF5, 0xEA, 0x99, 0xD8, + 0xF4, 0xE3, 0x91, 0xDA, 0x5F, 0xE5, 0x61, 0xE2, 0xA4, 0xF0, 0xD4, 0xEC, + 0x5A, 0xFA, 0xD0, 0xF0, 0x40, 0x05, 0xBF, 0xF2, 0x63, 0x0E, 0x09, 0xF7, + 0x87, 0x10, 0x78, 0x00, 0x4A, 0x0C, 0x78, 0x08, 0x81, 0x03, 0x01, 0x05, + 0xD7, 0x01, 0x89, 0x03, 0x8D, 0x0B, 0x4B, 0x0D, 0x2A, 0x0F, 0xF8, 0x0F, + 0xE7, 0x0B, 0x22, 0x08, 0x97, 0x08, 0x31, 0x04, 0x33, 0x02, 0x58, 0x03, + 0x0C, 0x06, 0xED, 0x0C, 0xB4, 0x14, 0x59, 0x20, 0xB6, 0x1A, 0xE3, 0x29, + 0xBF, 0x16, 0xB5, 0x28, 0x7F, 0x19, 0xDE, 0x27, 0x42, 0x17, 0xAB, 0x1D, + 0x8A, 0x0D, 0x28, 0x0F, 0xD8, 0x05, 0x7D, 0x09, 0xD1, 0xFD, 0x29, 0x05, + 0x11, 0x02, 0x7D, 0x03, 0x65, 0x15, 0x96, 0x0A, 0x66, 0x23, 0x22, 0x12, + 0x32, 0x1F, 0x39, 0x11, 0xBF, 0x14, 0x8E, 0x0B, 0x06, 0x13, 0x54, 0x0C, + 0x65, 0x1C, 0xDB, 0x16, 0xD4, 0x20, 0x91, 0x19, 0x5D, 0x1F, 0x35, 0x13, + 0x99, 0x1D, 0x09, 0x0C, 0x92, 0x18, 0xB8, 0x07, 0x26, 0x0D, 0xAF, 0x03, + 0x6E, 0x04, 0xDC, 0x02, 0x1F, 0x0E, 0x8F, 0x09, 0x5F, 0x15, 0x63, 0x00, + 0xD8, 0x14, 0x5E, 0xF4, 0xB7, 0x16, 0x6F, 0xFB, 0xBF, 0x15, 0x47, 0x08, + 0x6E, 0x1E, 0x79, 0x17, 0x0E, 0x29, 0xE4, 0x21, 0xEB, 0x20, 0x36, 0x1D, + 0xE7, 0x15, 0x5E, 0x17, 0x58, 0x13, 0x96, 0x16, 0x0B, 0x10, 0x9A, 0x0F, + 0x64, 0x02, 0xD5, 0x00, 0xC4, 0xFC, 0xBA, 0xFE, 0xC0, 0x01, 0xCA, 0x05, + 0x06, 0x08, 0x64, 0x09, 0xDF, 0x06, 0x70, 0x06, 0xC9, 0xF8, 0x24, 0xFD, + 0x77, 0xF6, 0x6F, 0xFB, 0x2E, 0x00, 0x73, 0xFC, 0x27, 0x0E, 0xFC, 0xFF, + 0x63, 0x0D, 0xE0, 0xFD, 0xF8, 0xFE, 0xEC, 0xF4, 0x8D, 0xFD, 0x23, 0xF7, + 0x57, 0xFF, 0x1A, 0xFC, 0xE9, 0xF5, 0xFF, 0xF8, 0x9B, 0xE8, 0x84, 0xF3, + 0x9A, 0xE5, 0x4B, 0xF0, 0xCC, 0xF0, 0xD9, 0xF2, 0x59, 0xFA, 0xCA, 0xF6, + 0xB4, 0xF4, 0x42, 0xF6, 0xAA, 0xE5, 0xF5, 0xF1, 0xE1, 0xE0, 0xD1, 0xED, + 0xB4, 0xF0, 0xAD, 0xF2, 0x18, 0xFD, 0x51, 0xF4, 0xE2, 0xFF, 0x0D, 0xF3, + 0xC9, 0xFF, 0x06, 0xF4, 0x68, 0xFE, 0x30, 0xF1, 0x43, 0x00, 0x40, 0xED, + 0xE2, 0x00, 0xA6, 0xE8, 0xE7, 0x03, 0x96, 0xF0, 0xFD, 0x04, 0xAE, 0xFB, + 0x6D, 0x05, 0x9B, 0xFF, 0xAA, 0x07, 0x84, 0x03, 0x30, 0x06, 0x4F, 0x09, + 0x97, 0x04, 0x72, 0x0F, 0x75, 0x0A, 0x91, 0x11, 0x6D, 0x1A, 0xE9, 0x1A, + 0xF2, 0x27, 0xE0, 0x28, 0xEC, 0x25, 0xD2, 0x2C, 0xAF, 0x1F, 0xE1, 0x29, + 0x1E, 0x1D, 0x00, 0x26, 0x26, 0x1A, 0xCF, 0x20, 0x10, 0x17, 0xDA, 0x1A, + 0x93, 0x14, 0xBF, 0x1A, 0xA2, 0x11, 0x68, 0x19, 0x0A, 0x11, 0x57, 0x14, + 0x40, 0x12, 0xD5, 0x10, 0xDD, 0x0C, 0x59, 0x0D, 0xD5, 0x0E, 0xAB, 0x11, + 0x7A, 0x18, 0xDE, 0x19, 0x1B, 0x1B, 0x6A, 0x1F, 0x24, 0x19, 0x0F, 0x24, + 0x76, 0x11, 0x9F, 0x1C, 0x66, 0x10, 0x09, 0x11, 0x5E, 0x1A, 0xD6, 0x10, + 0x17, 0x1C, 0xBD, 0x13, 0x87, 0x13, 0x5A, 0x18, 0xE9, 0x13, 0x61, 0x21, + 0xB9, 0x1C, 0x0F, 0x25, 0x48, 0x21, 0x33, 0x20, 0x10, 0x24, 0xBA, 0x1D, + 0x9C, 0x1F, 0x94, 0x17, 0x9F, 0x1E, 0x0F, 0x13, 0x17, 0x23, 0xBF, 0x17, + 0xBE, 0x1D, 0xA0, 0x1C, 0x6F, 0x17, 0xE4, 0x22, 0x16, 0x16, 0xF3, 0x21, + 0x29, 0x10, 0x44, 0x13, 0x85, 0x0B, 0x4E, 0x0D, 0xB2, 0x12, 0x7C, 0x1D, + 0xA2, 0x18, 0x1B, 0x29, 0x54, 0x1C, 0x61, 0x27, 0x6B, 0x17, 0xFF, 0x1B, + 0xED, 0x09, 0xB0, 0x0F, 0xBD, 0x0E, 0x98, 0x16, 0x7F, 0x1B, 0x93, 0x1B, + 0xBB, 0x1A, 0x86, 0x10, 0x4C, 0x18, 0x21, 0x0E, 0x22, 0x1B, 0x6E, 0x14, + 0x7E, 0x18, 0x45, 0x12, 0xAC, 0x13, 0x5E, 0x0A, 0x9C, 0x11, 0xBD, 0x05, + 0x03, 0x0A, 0x2D, 0x07, 0x26, 0x05, 0xB2, 0x12, 0xCE, 0x05, 0x7E, 0x1A, + 0xD3, 0x04, 0x1C, 0x0F, 0xF8, 0x02, 0xA2, 0x04, 0x97, 0xFE, 0x7E, 0x06, + 0x91, 0x01, 0xF2, 0x13, 0x31, 0x07, 0x98, 0x20, 0x95, 0x05, 0x25, 0x25, + 0xFA, 0xFE, 0xB1, 0x26, 0x16, 0xFF, 0xAA, 0x24, 0x20, 0x0B, 0xF4, 0x20, + 0xFF, 0x12, 0x8A, 0x15, 0xAB, 0x14, 0x45, 0x0E, 0x1D, 0x11, 0x3B, 0x0E, + 0x2A, 0x0C, 0x36, 0x12, 0x35, 0x11, 0x7B, 0x19, 0x05, 0x1A, 0x1E, 0x18, + 0x97, 0x18, 0xDA, 0x12, 0xB0, 0x17, 0x3D, 0x15, 0x67, 0x1D, 0xA1, 0x19, + 0xD1, 0x1D, 0x9B, 0x10, 0xD8, 0x1B, 0xDF, 0x08, 0xC9, 0x1E, 0x00, 0x13, + 0x2F, 0x21, 0x13, 0x20, 0xB7, 0x1D, 0xA3, 0x23, 0xEC, 0x23, 0xD7, 0x27, + 0xC6, 0x32, 0xBE, 0x30, 0xAB, 0x3A, 0x83, 0x33, 0xE5, 0x39, 0x3D, 0x2F, + 0x22, 0x32, 0xB6, 0x28, 0x99, 0x2A, 0x3A, 0x28, 0xDC, 0x29, 0x15, 0x33, + 0xEF, 0x2A, 0x80, 0x3C, 0x58, 0x2F, 0x24, 0x3D, 0xBC, 0x33, 0x08, 0x35, + 0xD1, 0x2E, 0x7F, 0x2E, 0x57, 0x27, 0xCD, 0x31, 0xB2, 0x20, 0xA8, 0x34, + 0x67, 0x1B, 0x3F, 0x34, 0x96, 0x17, 0xD3, 0x32, 0x9A, 0x10, 0x66, 0x30, + 0x31, 0x0B, 0xCC, 0x2E, 0x5B, 0x0C, 0x9E, 0x31, 0xEF, 0x0D, 0xE0, 0x2F, + 0x0C, 0x14, 0x5D, 0x2A, 0x6B, 0x1A, 0x26, 0x20, 0x01, 0x1F, 0xE0, 0x15, + 0x38, 0x25, 0xB5, 0x1A, 0x19, 0x24, 0xA9, 0x20, 0x32, 0x21, 0xEC, 0x22, + 0x8E, 0x21, 0x72, 0x26, 0x56, 0x19, 0xC9, 0x1F, 0xC3, 0x0B, 0xAA, 0x12, + 0xEE, 0x03, 0x20, 0x0E, 0x5F, 0xFC, 0x81, 0x08, 0x4D, 0xFB, 0x6B, 0x04, + 0xA3, 0x04, 0x6B, 0x0B, 0x2E, 0x0C, 0x93, 0x0E, 0xCE, 0x10, 0x1A, 0x0D, + 0x06, 0x11, 0xFF, 0x0B, 0xA9, 0x0E, 0xE6, 0x13, 0x6D, 0x0E, 0x65, 0x20, + 0x4C, 0x09, 0xDC, 0x1B, 0x19, 0x07, 0xF1, 0x0E, 0x4D, 0x07, 0x71, 0x03, + 0x5B, 0xFE, 0x5B, 0xF9, 0xD4, 0xF6, 0x2F, 0xF4, 0xE7, 0xF5, 0x27, 0xF0, + 0x05, 0xF4, 0xAA, 0xE9, 0xC9, 0xEC, 0xB1, 0xDF, 0x6F, 0xEB, 0x40, 0xDA, + 0xDB, 0xF1, 0xED, 0xDA, 0xEB, 0xF5, 0x62, 0xD8, 0xDF, 0xF5, 0xEC, 0xD8, + 0x9E, 0xF3, 0x2A, 0xE5, 0x40, 0xEC, 0xFE, 0xED, 0x7A, 0xDD, 0x24, 0xE8, + 0x71, 0xD7, 0x29, 0xE2, 0x62, 0xDC, 0x1C, 0xE4, 0xC4, 0xDD, 0xE6, 0xE1, + 0x59, 0xD7, 0x25, 0xD9, 0xEB, 0xD1, 0xCA, 0xD7, 0xC6, 0xCE, 0x3B, 0xDB, + 0x89, 0xD0, 0x34, 0xE3, 0x24, 0xD5, 0x54, 0xEC, 0x5D, 0xD0, 0x52, 0xEB, + 0xC0, 0xCC, 0x46, 0xEA, 0x14, 0xD1, 0xA6, 0xEC, 0x6F, 0xCE, 0x6D, 0xE3, + 0xB9, 0xC7, 0xA1, 0xD1, 0xFF, 0xCE, 0xC2, 0xCA, 0x1F, 0xDB, 0x4C, 0xD3, + 0x50, 0xD9, 0x82, 0xDB, 0x5F, 0xD1, 0x68, 0xDB, 0x69, 0xD0, 0xE6, 0xDD, + 0x31, 0xDB, 0xAE, 0xE6, 0x89, 0xEA, 0xF9, 0xEA, 0xB3, 0xF0, 0x12, 0xE6, + 0x7F, 0xEF, 0x07, 0xE4, 0x38, 0xEA, 0x3F, 0xE1, 0x52, 0xE9, 0x51, 0xDB, + 0x28, 0xF1, 0xE2, 0xDF, 0xD3, 0xF3, 0x92, 0xE6, 0x82, 0xF2, 0x74, 0xE8, + 0x1D, 0xF6, 0x29, 0xEA, 0x95, 0xF7, 0x1D, 0xE5, 0xCB, 0xF5, 0x56, 0xDE, + 0x3D, 0xFA, 0xE7, 0xE4, 0x9D, 0x03, 0xB9, 0xF1, 0x5F, 0x02, 0xBC, 0xF3, + 0x2F, 0xFA, 0x73, 0xF1, 0xBF, 0xFA, 0x78, 0xF8, 0x44, 0xFF, 0x5B, 0x04, + 0x28, 0x04, 0xC5, 0x0C, 0x34, 0xFF, 0x25, 0x08, 0x4E, 0xF3, 0xDF, 0xFF, + 0x13, 0xF1, 0xCC, 0x04, 0x30, 0xF5, 0xC3, 0x0F, 0x08, 0xF8, 0xAC, 0x13, + 0xC2, 0xF4, 0x19, 0x0B, 0xA4, 0xF4, 0x69, 0x00, 0x95, 0xFD, 0xAD, 0xFC, + 0x37, 0x07, 0x7B, 0xF8, 0x0E, 0x0F, 0xD6, 0xEF, 0x33, 0x0E, 0x01, 0xE5, + 0xAB, 0x08, 0x28, 0xE4, 0x5B, 0x09, 0xA6, 0xF0, 0xFF, 0x06, 0xC7, 0xFB, + 0x3D, 0x04, 0xD4, 0x01, 0xD1, 0x09, 0x60, 0x04, 0xAD, 0x05, 0xC6, 0x00, + 0x75, 0xF3, 0xB6, 0xFD, 0x0F, 0xE6, 0xA0, 0x02, 0x17, 0xE0, 0xD9, 0x02, + 0x45, 0xE1, 0x44, 0xFE, 0xD7, 0xE8, 0xD0, 0xFF, 0xFB, 0xEF, 0x75, 0x05, + 0x3D, 0xF2, 0x58, 0x0A, 0xD4, 0xF1, 0x5E, 0x09, 0x3E, 0xF7, 0x5B, 0x09, + 0x07, 0xF4, 0x6D, 0x04, 0xDC, 0xEA, 0x50, 0xFA, 0xB6, 0xEE, 0xDD, 0xF4, + 0x37, 0xF5, 0xA6, 0xF0, 0x02, 0xF2, 0xFB, 0xEC, 0x67, 0xE8, 0xB7, 0xE7, + 0x4B, 0xEB, 0x2E, 0xE3, 0xB1, 0xFB, 0x37, 0xE3, 0x25, 0x04, 0x01, 0xE8, + 0xFD, 0xF8, 0x1F, 0xE4, 0xCF, 0xEA, 0x98, 0xDD, 0x40, 0xE7, 0xFB, 0xDF, + 0xBE, 0xE3, 0xE0, 0xDD, 0x56, 0xE4, 0x28, 0xDC, 0x3F, 0xEC, 0x04, 0xE0, + 0x4D, 0xF6, 0x00, 0xE6, 0x16, 0x01, 0xB4, 0xEC, 0xB4, 0xFE, 0x17, 0xEC, + 0x77, 0xF2, 0x99, 0xE5, 0x94, 0xEF, 0x66, 0xDE, 0x0E, 0x00, 0x32, 0xE1, + 0x42, 0x12, 0x71, 0xEE, 0x2A, 0x10, 0xAC, 0xF9, 0xF5, 0x02, 0x57, 0xFF, + 0xCD, 0xF3, 0x7E, 0xF8, 0x7A, 0xE5, 0x8D, 0xEC, 0x6D, 0xDF, 0x58, 0xF0, + 0x1D, 0xE4, 0xB9, 0xFB, 0xE0, 0xE5, 0x42, 0xF8, 0x33, 0xE2, 0x20, 0xEC, + 0x7B, 0xE5, 0x5E, 0xE8, 0x68, 0xE8, 0xB3, 0xE9, 0x22, 0xE6, 0xA8, 0xEA, + 0x51, 0xE7, 0xA2, 0xEA, 0x7B, 0xEF, 0x17, 0xEB, 0x88, 0xF0, 0xBF, 0xE9, + 0xAA, 0xE9, 0x8A, 0xE5, 0xE9, 0xE9, 0x56, 0xDF, 0x15, 0xF0, 0xD0, 0xD8, + 0x6C, 0xF7, 0x15, 0xD8, 0x91, 0xF6, 0x11, 0xD5, 0x0A, 0xF2, 0x44, 0xD1, + 0x41, 0xEE, 0x05, 0xCD, 0x04, 0xEB, 0x92, 0xC7, 0x32, 0xE8, 0xAA, 0xCA, + 0x78, 0xE0, 0x58, 0xCF, 0xF8, 0xDC, 0xD6, 0xD6, 0x9B, 0xE2, 0x05, 0xE5, + 0xAC, 0xE7, 0x01, 0xEE, 0x4A, 0xE4, 0x62, 0xEE, 0x1C, 0xD6, 0x9D, 0xE8, + 0xCF, 0xCB, 0x71, 0xE6, 0x10, 0xD6, 0x8A, 0xF1, 0x2F, 0xE4, 0x34, 0x00, + 0x14, 0xE7, 0x8E, 0x07, 0xC2, 0xE8, 0xF5, 0x05, 0xE0, 0xEF, 0xDC, 0xFE, + 0x67, 0xF1, 0x3F, 0xF5, 0x01, 0xEE, 0x89, 0xEC, 0xA0, 0xEC, 0xAD, 0xE4, + 0x79, 0xED, 0xDC, 0xDB, 0xDC, 0xF5, 0xB5, 0xDA, 0x67, 0xFE, 0x94, 0xE3, + 0x8D, 0xFA, 0xC5, 0xE7, 0x16, 0xEE, 0x00, 0xE7, 0xB2, 0xEB, 0x0C, 0xEB, + 0x93, 0xF5, 0xFD, 0xF1, 0x75, 0xFB, 0xA4, 0xF8, 0xE5, 0xF9, 0x31, 0xF9, + 0x1A, 0xF8, 0xBB, 0xEF, 0xD7, 0xFB, 0x4D, 0xEB, 0x24, 0x00, 0xD6, 0xF7, + 0x2E, 0x01, 0xAB, 0x07, 0x46, 0xFF, 0xE7, 0x07, 0xA2, 0xF9, 0x70, 0xFD, + 0xDF, 0xFE, 0xC0, 0x01, 0xF4, 0x09, 0xC1, 0x0B, 0x50, 0x05, 0x7C, 0x01, + 0x8F, 0x00, 0xCE, 0xF3, 0x9A, 0x03, 0x8F, 0xF4, 0xCC, 0x01, 0xCE, 0xFD, + 0x18, 0x00, 0x40, 0x06, 0x73, 0xFD, 0xD4, 0x04, 0x83, 0xFB, 0x6B, 0xFD, + 0xB0, 0x05, 0x69, 0xFD, 0xF9, 0x09, 0x8D, 0x00, 0x6F, 0x04, 0xB5, 0x05, + 0xF0, 0x03, 0xAE, 0x09, 0x2F, 0x08, 0x22, 0x06, 0x40, 0x10, 0xE6, 0x0A, + 0x05, 0x14, 0x1B, 0x0D, 0x6D, 0x13, 0xC4, 0xFD, 0x0E, 0x11, 0x62, 0xF1, + 0x1C, 0x0B, 0xB4, 0xF6, 0x9E, 0x05, 0xF2, 0xFD, 0x58, 0x08, 0xEA, 0xFF, + 0x00, 0x0E, 0x31, 0xFD, 0x5F, 0x0C, 0x50, 0xF7, 0xE4, 0x08, 0xFA, 0xFD, + 0x87, 0x05, 0x20, 0x0D, 0x98, 0x00, 0x76, 0x11, 0x0F, 0x00, 0x2B, 0x0B, + 0x06, 0x00, 0x12, 0x06, 0x4A, 0xFB, 0x7D, 0x08, 0xB7, 0xFA, 0x7B, 0x14, + 0xE0, 0xFC, 0x1E, 0x1D, 0x62, 0xFC, 0x22, 0x1C, 0x40, 0xFF, 0xC8, 0x1A, + 0x83, 0x00, 0x2C, 0x14, 0xF4, 0xFE, 0xE9, 0x09, 0x4B, 0xFE, 0x86, 0x06, + 0xF3, 0xF9, 0xA5, 0x06, 0x1C, 0xF7, 0x41, 0x04, 0x30, 0xF8, 0x9F, 0xFE, + 0x68, 0xFD, 0xDA, 0xFA, 0xE3, 0x06, 0x93, 0xFB, 0x5F, 0x07, 0x87, 0xFB, + 0xF5, 0x00, 0xB7, 0xFA, 0x84, 0x0A, 0xF2, 0x00, 0xC0, 0x1F, 0xC5, 0x07, + 0x7A, 0x26, 0x8A, 0x01, 0x89, 0x1E, 0xA9, 0xF9, 0x68, 0x1E, 0x17, 0xFF, + 0xE1, 0x21, 0x1C, 0x0B, 0x0F, 0x1C, 0x73, 0x16, 0xB1, 0x10, 0x43, 0x1A, + 0x6F, 0x07, 0xCC, 0x15, 0xDD, 0x0F, 0x47, 0x16, 0x6D, 0x25, 0x36, 0x1C, + 0x7C, 0x34, 0x94, 0x22, 0x05, 0x2F, 0x77, 0x26, 0xEE, 0x1D, 0x8E, 0x25, + 0xED, 0x15, 0x3F, 0x21, 0xBD, 0x19, 0xE4, 0x1E, 0x8B, 0x1E, 0xC0, 0x22, + 0x19, 0x26, 0xD5, 0x26, 0xA2, 0x32, 0x7A, 0x23, 0xB7, 0x37, 0x0C, 0x19, + 0xB0, 0x37, 0x7D, 0x15, 0xE7, 0x37, 0xAB, 0x1F, 0x60, 0x35, 0xCF, 0x29, + 0x06, 0x34, 0x57, 0x32, 0x01, 0x2F, 0xCA, 0x36, 0xB9, 0x25, 0xB9, 0x31, + 0xF7, 0x20, 0xCF, 0x2F, 0x12, 0x1F, 0xA9, 0x2D, 0xE4, 0x1E, 0x53, 0x26, + 0x3D, 0x20, 0x60, 0x23, 0x79, 0x19, 0x7C, 0x23, 0xB2, 0x10, 0x0E, 0x25, + 0xDC, 0x11, 0x7C, 0x21, 0x18, 0x18, 0xE5, 0x1B, 0x5F, 0x1D, 0x85, 0x20, + 0x1B, 0x1F, 0x7C, 0x26, 0xB3, 0x1A, 0x1F, 0x21, 0xCA, 0x16, 0x73, 0x1C, + 0xA5, 0x13, 0x93, 0x1F, 0x5F, 0x0B, 0x2B, 0x1E, 0xA9, 0x01, 0x3E, 0x12, + 0x20, 0x02, 0x64, 0x0A, 0xCA, 0x0D, 0x96, 0x10, 0x6B, 0x15, 0x8A, 0x14, + 0x1C, 0x13, 0x06, 0x10, 0xD8, 0x07, 0x3F, 0x03, 0x6D, 0xFD, 0x98, 0xF5, + 0xC5, 0xFE, 0x93, 0xF7, 0x2D, 0xFC, 0x0F, 0xFE, 0x39, 0xF6, 0x61, 0xFB, + 0x68, 0x00, 0x25, 0xFA, 0xC2, 0x0D, 0x3A, 0xFB, 0x0B, 0x0D, 0x27, 0xF8, + 0x2B, 0x06, 0xDA, 0xF0, 0x0A, 0xFC, 0x7B, 0xE7, 0x1C, 0xF7, 0x20, 0xE9, + 0x93, 0x00, 0xB4, 0xF5, 0x82, 0x07, 0x42, 0xFE, 0xA7, 0x03, 0x2C, 0x01, + 0x73, 0xFD, 0x64, 0xFF, 0xCF, 0xF9, 0x12, 0xFC, 0x4B, 0xF6, 0x55, 0xFD, + 0x97, 0xF2, 0x90, 0x04, 0x2F, 0xEF, 0x6A, 0x0C, 0x73, 0xEC, 0xE1, 0x0E, + 0x7C, 0xEA, 0x44, 0x0B, 0x70, 0xEE, 0xC1, 0x08, 0x27, 0xF7, 0xB6, 0x0B, + 0x24, 0xFC, 0xE8, 0x0E, 0xCA, 0xFE, 0x29, 0x0C, 0x0E, 0xFE, 0x23, 0x04, + 0x3A, 0xF7, 0x71, 0xFC, 0x69, 0xEE, 0x38, 0xFA, 0xAA, 0xEC, 0x5C, 0xFE, + 0x1F, 0xF5, 0xB3, 0x01, 0xEF, 0xFB, 0x0B, 0x00, 0xCB, 0xFA, 0x9B, 0xFF, + 0xA9, 0xF8, 0x7B, 0x01, 0x1E, 0xF9, 0x7A, 0xFF, 0x9E, 0xFA, 0xFC, 0xF6, + 0xC0, 0xFA, 0x3A, 0xF2, 0x3C, 0xFE, 0xEB, 0xF9, 0xB5, 0x09, 0x80, 0x04, + 0x34, 0x11, 0xCD, 0x08, 0x03, 0x10, 0x34, 0x04, 0x64, 0x0C, 0x99, 0xFB, + 0xFB, 0x06, 0x68, 0xF6, 0xDA, 0xFF, 0x70, 0xF7, 0x1D, 0xF8, 0x67, 0xFD, + 0x3D, 0xF6, 0x2B, 0x07, 0x09, 0xF9, 0xB2, 0x13, 0xEC, 0xFD, 0xCA, 0x13, + 0x01, 0x07, 0x53, 0x08, 0xF2, 0x0A, 0x1A, 0x06, 0xA3, 0x03, 0xC3, 0x0E, + 0xC2, 0xFC, 0xB1, 0x14, 0xE5, 0x01, 0x1B, 0x14, 0x0A, 0x0E, 0x36, 0x11, + 0x20, 0x14, 0xAB, 0x0A, 0x9D, 0x13, 0xB5, 0x0B, 0xCA, 0x14, 0xDB, 0x16, + 0xB2, 0x17, 0xA4, 0x1F, 0xCD, 0x17, 0x55, 0x1F, 0x24, 0x11, 0x7D, 0x18, + 0xA5, 0x0D, 0x26, 0x16, 0x20, 0x12, 0x5B, 0x17, 0x39, 0x14, 0xB2, 0x16, + 0xC4, 0x11, 0xEE, 0x15, 0x47, 0x12, 0x54, 0x1D, 0xCA, 0x18, 0x56, 0x28, + 0xC2, 0x1E, 0xD0, 0x2C, 0xB4, 0x1F, 0x1E, 0x2D, 0x09, 0x20, 0x26, 0x30, + 0xBF, 0x1F, 0xC3, 0x31, 0x60, 0x1C, 0x45, 0x2C, 0x52, 0x1A, 0x7D, 0x25, + 0xEE, 0x1C, 0xD0, 0x28, 0x25, 0x1F, 0xB0, 0x33, 0x0C, 0x1C, 0x71, 0x36, + 0x19, 0x19, 0x21, 0x33, 0x4D, 0x16, 0x17, 0x2A, 0x2F, 0x15, 0x63, 0x1B, + 0x88, 0x1C, 0x6C, 0x14, 0xD0, 0x27, 0x30, 0x18, 0x46, 0x2C, 0xA2, 0x18, + 0xF6, 0x28, 0x8D, 0x12, 0x5B, 0x23, 0x83, 0x11, 0x6C, 0x1D, 0xA5, 0x15, + 0xF5, 0x19, 0x41, 0x18, 0x29, 0x18, 0xDF, 0x1B, 0x98, 0x13, 0xE4, 0x1E, + 0x37, 0x15, 0xB6, 0x21, 0x26, 0x1E, 0xCD, 0x24, 0xBC, 0x22, 0xCA, 0x1E, + 0xE7, 0x20, 0x26, 0x16, 0x34, 0x1A, 0xCD, 0x17, 0x7A, 0x18, 0x11, 0x1E, + 0xF8, 0x1C, 0x9F, 0x1D, 0x25, 0x17, 0x47, 0x16, 0xF9, 0x08, 0xFE, 0x0B, + 0x3D, 0x01, 0xEF, 0x01, 0xCC, 0x05, 0x4B, 0xFE, 0x5A, 0x0D, 0x4E, 0x04, + 0x19, 0x08, 0x69, 0x08, 0x25, 0xF6, 0x66, 0x02, 0xBD, 0xEA, 0x0A, 0x01, + 0xA1, 0xED, 0x13, 0x01, 0xE6, 0xEF, 0x13, 0xFD, 0xD5, 0xEB, 0xA7, 0xFD, + 0x52, 0xED, 0xFB, 0x02, 0x70, 0xFA, 0x88, 0x09, 0x48, 0xFF, 0x84, 0x05, + 0x54, 0xF0, 0x81, 0xF6, 0x15, 0xE4, 0xBB, 0xEE, 0xC9, 0xE9, 0x69, 0xF1, + 0xB1, 0xF8, 0xCF, 0xF5, 0xA2, 0xFD, 0xCA, 0xF3, 0xB0, 0xF7, 0x94, 0xEC, + 0xA9, 0xF2, 0xA0, 0xE7, 0x79, 0xEF, 0xE8, 0xE3, 0x61, 0xE8, 0x89, 0xE4, + 0x3B, 0xDE, 0xF6, 0xE6, 0x8A, 0xDC, 0xD7, 0xE7, 0x3A, 0xE4, 0x44, 0xE6, + 0x17, 0xEF, 0xAE, 0xE4, 0x33, 0xF2, 0xF3, 0xEA, 0xA5, 0xE5, 0x2F, 0xEF, + 0x8D, 0xD8, 0xC0, 0xEB, 0x43, 0xDB, 0x71, 0xEC, 0xED, 0xE3, 0x68, 0xF1, + 0x66, 0xE6, 0x48, 0xF4, 0x0F, 0xEB, 0x88, 0xF0, 0x92, 0xF6, 0xAB, 0xE5, + 0xD3, 0x02, 0xCD, 0xE1, 0xA2, 0x05, 0xB0, 0xE5, 0xD6, 0xFF, 0x73, 0xE3, + 0x02, 0x01, 0x10, 0xDE, 0x99, 0x04, 0x42, 0xDD, 0xD4, 0xFC, 0xE5, 0xE2, + 0x22, 0xEE, 0x93, 0xED, 0xD1, 0xE2, 0xA7, 0xF4, 0x1D, 0xDE, 0x8B, 0xF4, + 0x8B, 0xE1, 0xD4, 0xF5, 0x60, 0xE4, 0x6D, 0xF9, 0xE2, 0xE0, 0xEC, 0xF9, + 0x7D, 0xDF, 0xA8, 0xF4, 0xDF, 0xDE, 0x1F, 0xED, 0x36, 0xE0, 0x55, 0xEC, + 0xF4, 0xE6, 0x62, 0xF4, 0xE1, 0xEC, 0x1C, 0xFA, 0x34, 0xEE, 0xB4, 0xF6, + 0x1F, 0xEB, 0x29, 0xF1, 0xE7, 0xE5, 0x3A, 0xED, 0x1B, 0xE3, 0x70, 0xE9, + 0x31, 0xE6, 0x64, 0xE6, 0x9B, 0xE9, 0xA2, 0xE1, 0x2F, 0xE9, 0x1A, 0xDE, + 0xD3, 0xE3, 0xE1, 0xDF, 0xC7, 0xDA, 0x94, 0xDE, 0x68, 0xD8, 0x30, 0xD7, + 0xDF, 0xDD, 0x03, 0xCF, 0x1B, 0xE4, 0xC5, 0xCB, 0xEC, 0xE7, 0x84, 0xD1, + 0x07, 0xE9, 0xDA, 0xD6, 0xC3, 0xEB, 0xAD, 0xD8, 0x8C, 0xEF, 0xEB, 0xDE, + 0xBD, 0xEE, 0xAF, 0xE5, 0xD1, 0xEB, 0x7A, 0xEA, 0xE0, 0xEC, 0xF2, 0xF0, + 0xEA, 0xEF, 0xD0, 0xF7, 0x98, 0xEE, 0x99, 0xF9, 0x9B, 0xE9, 0x50, 0xF5, + 0xD3, 0xE9, 0x74, 0xF4, 0x4B, 0xF0, 0xE3, 0xF4, 0x4C, 0xF5, 0x18, 0xED, + 0x03, 0xF3, 0x09, 0xE3, 0x32, 0xF1, 0x29, 0xDC, 0x63, 0xF6, 0xD6, 0xDB, + 0xD5, 0xF9, 0xC9, 0xDF, 0xA1, 0xEF, 0x8C, 0xE2, 0xF9, 0xDF, 0xF5, 0xE2, + 0x4A, 0xDD, 0xD1, 0xE2, 0x33, 0xE5, 0x6A, 0xE7, 0xD2, 0xEF, 0x8D, 0xEB, + 0x52, 0xF4, 0x62, 0xED, 0x8F, 0xEF, 0xEC, 0xEC, 0x8E, 0xEE, 0x76, 0xEA, + 0x90, 0xF3, 0xB1, 0xE9, 0x7F, 0xF8, 0x49, 0xEA, 0x4E, 0xFD, 0x0C, 0xED, + 0xD7, 0x01, 0xC9, 0xED, 0x6A, 0x02, 0x9F, 0xE9, 0x5A, 0xFA, 0x38, 0xE4, + 0x21, 0xF0, 0x36, 0xE2, 0x29, 0xEC, 0x1B, 0xE3, 0xF0, 0xEB, 0xEA, 0xE4, + 0xD9, 0xE9, 0x5B, 0xE4, 0x0C, 0xE4, 0xA8, 0xE1, 0x9D, 0xDC, 0x2C, 0xE0, + 0xEE, 0xDC, 0xF0, 0xE0, 0xC0, 0xE4, 0x4D, 0xE6, 0x25, 0xE6, 0x0E, 0xEB, + 0x9A, 0xE5, 0x0F, 0xF1, 0xA1, 0xE9, 0xD8, 0xFD, 0x6D, 0xEB, 0xAE, 0x07, + 0x49, 0xE9, 0xD8, 0x05, 0xA5, 0xE5, 0x77, 0xFD, 0x61, 0xE6, 0x2C, 0xF8, + 0x24, 0xED, 0x56, 0xF5, 0x54, 0xF6, 0x8D, 0xEE, 0x2E, 0xFA, 0xD2, 0xE2, + 0x55, 0xF5, 0xEE, 0xD7, 0x4F, 0xF1, 0x82, 0xD3, 0x1B, 0xF7, 0x4C, 0xD8, + 0xD0, 0x00, 0xAC, 0xE1, 0xC5, 0x04, 0x1C, 0xE9, 0x35, 0x03, 0x38, 0xEE, + 0xBD, 0x00, 0x16, 0xF2, 0xD0, 0xFE, 0x02, 0xF7, 0x19, 0xFB, 0x7E, 0xF8, + 0x82, 0xF0, 0xAA, 0xF5, 0xDA, 0xE5, 0xCE, 0xF7, 0x0F, 0xEC, 0x38, 0x01, + 0x54, 0xFF, 0x07, 0x0B, 0x81, 0x10, 0x3F, 0x0D, 0x20, 0x1B, 0x8B, 0x0C, + 0xA8, 0x21, 0x91, 0x0E, 0xD0, 0x1E, 0x30, 0x0A, 0x0F, 0x15, 0xF0, 0x05, + 0x74, 0x10, 0x86, 0x0B, 0x1B, 0x13, 0x82, 0x12, 0x73, 0x18, 0x06, 0x0F, + 0xA5, 0x16, 0x38, 0xFF, 0x5F, 0x0C, 0x2E, 0xF2, 0xA4, 0x04, 0xBE, 0xEF, + 0x44, 0x05, 0xB2, 0xF0, 0xD6, 0x09, 0xD4, 0xF3, 0x27, 0x0C, 0x35, 0xF7, + 0x81, 0x09, 0xCD, 0xF8, 0xBA, 0x05, 0xB7, 0xFC, 0x32, 0x07, 0x7C, 0x02, + 0xE8, 0x09, 0x1F, 0x06, 0xA1, 0x06, 0x66, 0x04, 0x52, 0x01, 0x9A, 0x01, + 0x22, 0x01, 0x73, 0x00, 0x4D, 0x04, 0x02, 0xFF, 0x1C, 0x05, 0x84, 0xFA, + 0xE2, 0x02, 0x6E, 0xF3, 0x92, 0x01, 0x10, 0xEF, 0x62, 0x00, 0x7C, 0xF0, + 0xCA, 0xF8, 0xCE, 0xF1, 0xC7, 0xED, 0x84, 0xEF, 0x83, 0xE5, 0x1A, 0xF0, + 0x19, 0xE1, 0x5F, 0xF3, 0x54, 0xE0, 0xA6, 0xF2, 0x45, 0xDD, 0x92, 0xEC, + 0x07, 0xD9, 0x16, 0xED, 0xB2, 0xD6, 0xE4, 0xF4, 0x61, 0xD0, 0x3B, 0xF2, + 0x61, 0xC8, 0x75, 0xE8, 0x42, 0xCA, 0xD0, 0xE1, 0xDC, 0xD2, 0x05, 0xD9, + 0x82, 0xD9, 0x2B, 0xD5, 0x93, 0xE0, 0xC0, 0xD8, 0x5E, 0xE8, 0x97, 0xD7, + 0x31, 0xF1, 0x28, 0xD5, 0x30, 0xF7, 0x24, 0xD3, 0x6F, 0xF7, 0x29, 0xD3, + 0x74, 0xF4, 0x2C, 0xDB, 0x5C, 0xEF, 0xE2, 0xE0, 0xEE, 0xED, 0xE6, 0xDE, + 0x06, 0xEB, 0x96, 0xDC, 0xCA, 0xE3, 0x1C, 0xDD, 0x57, 0xDE, 0xFE, 0xDB, + 0x58, 0xDA, 0x7C, 0xDD, 0x98, 0xD7, 0x19, 0xE9, 0x73, 0xDE, 0xA2, 0xF6, + 0x12, 0xED, 0x97, 0xFB, 0x06, 0xF6, 0x75, 0xFB, 0xCB, 0xF8, 0x40, 0xFC, + 0xFF, 0xF7, 0x64, 0x02, 0x6D, 0xF4, 0x43, 0x0A, 0xC9, 0xF0, 0xEA, 0x0B, + 0x03, 0xF3, 0x22, 0x06, 0x39, 0xFA, 0xE1, 0xFD, 0x3F, 0x00, 0xDC, 0xFA, + 0x90, 0x05, 0xBE, 0xF5, 0x78, 0x05, 0x34, 0xEC, 0x4F, 0x05, 0xE8, 0xE9, + 0xA5, 0x09, 0xD1, 0xEE, 0x94, 0x0A, 0x1C, 0xF4, 0x6E, 0x08, 0x4E, 0xF9, + 0xA2, 0x05, 0x66, 0x02, 0xCB, 0x05, 0xDB, 0x0F, 0x7C, 0x0B, 0xCB, 0x19, + 0x67, 0x0F, 0xF2, 0x17, 0x49, 0x0D, 0xDF, 0x0F, 0xB4, 0x0C, 0x15, 0x10, + 0xA6, 0x10, 0xD0, 0x15, 0x0E, 0x12, 0xA7, 0x15, 0x19, 0x0D, 0x80, 0x11, + 0x45, 0x09, 0xA8, 0x11, 0x26, 0x0F, 0xC2, 0x1C, 0x49, 0x18, 0x5D, 0x2C, + 0xAE, 0x19, 0x93, 0x31, 0x0F, 0x14, 0x88, 0x2B, 0x1D, 0x0E, 0x18, 0x26, + 0x0D, 0x10, 0x44, 0x27, 0xAE, 0x17, 0xAF, 0x26, 0x24, 0x1E, 0x9B, 0x22, + 0x5A, 0x22, 0x46, 0x22, 0xB7, 0x21, 0x2B, 0x22, 0x4D, 0x1C, 0x9E, 0x1D, + 0xD7, 0x15, 0xE2, 0x12, 0x2B, 0x14, 0xD4, 0x09, 0x5F, 0x18, 0xA0, 0x0B, + 0xD6, 0x23, 0xB7, 0x17, 0xED, 0x31, 0x67, 0x25, 0x93, 0x35, 0x4A, 0x28, + 0xF6, 0x30, 0x67, 0x26, 0x2C, 0x2D, 0xA8, 0x29, 0x82, 0x2D, 0x7F, 0x2E, + 0x6A, 0x32, 0x47, 0x2F, 0xFE, 0x30, 0xE9, 0x2C, 0x32, 0x27, 0xDC, 0x2C, + 0x9B, 0x20, 0x1A, 0x2D, 0x26, 0x21, 0x70, 0x2A, 0xF7, 0x27, 0x93, 0x29, + 0x9B, 0x30, 0xD4, 0x30, 0x7D, 0x2F, 0x0F, 0x3A, 0x35, 0x27, 0x1B, 0x3E, + 0x91, 0x26, 0xF0, 0x3E, 0x47, 0x2B, 0x7E, 0x3B, 0xA4, 0x2E, 0xC8, 0x38, + 0xE1, 0x2C, 0xED, 0x37, 0x49, 0x26, 0xCF, 0x32, 0xA7, 0x20, 0x10, 0x2F, + 0x9E, 0x1E, 0xDF, 0x2D, 0x40, 0x20, 0x97, 0x2A, 0x53, 0x24, 0x71, 0x23, + 0xC6, 0x2B, 0xFE, 0x18, 0x19, 0x33, 0x79, 0x12, 0xCB, 0x35, 0x9B, 0x15, + 0x39, 0x36, 0x87, 0x1A, 0x33, 0x3A, 0x2E, 0x1A, 0x11, 0x3F, 0x81, 0x19, + 0x59, 0x3C, 0x79, 0x1B, 0xD2, 0x31, 0xDA, 0x1C, 0xFA, 0x24, 0x33, 0x1C, + 0x40, 0x1C, 0x92, 0x1C, 0x1D, 0x1B, 0xD2, 0x1E, 0x43, 0x1A, 0x2E, 0x22, + 0xA2, 0x12, 0xBF, 0x26, 0x9B, 0x0A, 0x4E, 0x28, 0x39, 0x0B, 0xAD, 0x26, + 0x1E, 0x0F, 0xA8, 0x27, 0xC1, 0x10, 0x25, 0x2B, 0x69, 0x13, 0x0D, 0x2B, + 0xEA, 0x13, 0x2B, 0x24, 0x3F, 0x0F, 0x60, 0x1F, 0xD2, 0x08, 0x52, 0x21, + 0x52, 0x04, 0x56, 0x23, 0xC6, 0x02, 0x9E, 0x1F, 0x1F, 0x06, 0x64, 0x18, + 0xDB, 0x0C, 0x76, 0x14, 0xFF, 0x11, 0x8B, 0x14, 0x5C, 0x14, 0xCC, 0x10, + 0x82, 0x10, 0x5A, 0x05, 0x4E, 0x0A, 0x20, 0xFE, 0x25, 0x09, 0x96, 0x04, + 0xE8, 0x08, 0x8F, 0x0D, 0xE3, 0x07, 0x08, 0x0B, 0x7B, 0x08, 0xE0, 0x02, + 0x1B, 0x0C, 0x7D, 0x00, 0x27, 0x0E, 0x5B, 0x01, 0x0D, 0x0B, 0x6D, 0xFF, + 0x6A, 0x09, 0x7A, 0xFC, 0x13, 0x0D, 0x2D, 0xFF, 0x2E, 0x15, 0x13, 0x08, + 0x35, 0x17, 0x27, 0x0F, 0xB2, 0x0E, 0x17, 0x0D, 0x4A, 0x05, 0x68, 0x08, + 0x07, 0xFF, 0x38, 0x0A, 0x6E, 0x00, 0x01, 0x11, 0x72, 0x0A, 0xFB, 0x16, + 0xFB, 0x10, 0x7C, 0x18, 0xBD, 0x0E, 0x51, 0x17, 0x92, 0x03, 0x7E, 0x16, + 0x1B, 0xF4, 0x67, 0x14, 0x1B, 0xF0, 0x9B, 0x0E, 0x71, 0xFC, 0x4A, 0x0B, + 0xBD, 0x0C, 0x34, 0x0F, 0x31, 0x11, 0xD6, 0x11, 0xA9, 0x08, 0xC6, 0x07, + 0x25, 0xFE, 0xAA, 0xF8, 0xEB, 0xFB, 0x81, 0xF7, 0x98, 0x06, 0x11, 0x03, + 0x03, 0x16, 0x07, 0x0B, 0xB3, 0x1E, 0xC9, 0x09, 0xCF, 0x1B, 0x85, 0x06, + 0x5B, 0x11, 0x7E, 0x0A, 0x69, 0x07, 0x63, 0x15, 0xFE, 0x00, 0xE8, 0x1A, + 0x54, 0xFD, 0xFF, 0x17, 0x85, 0xFD, 0x47, 0x17, 0x08, 0xFD, 0xF8, 0x18, + 0xE7, 0xF6, 0xED, 0x14, 0xDC, 0xF0, 0x3E, 0x0C, 0x57, 0xF2, 0x3A, 0x04, + 0x1C, 0xFA, 0xAA, 0x01, 0x04, 0x01, 0xBF, 0x04, 0x3C, 0x02, 0xD2, 0x05, + 0x4F, 0xFD, 0x9E, 0x01, 0xAF, 0xF5, 0x1C, 0xFF, 0xF6, 0xF4, 0xAF, 0x02, + 0x45, 0xFF, 0x69, 0x07, 0x81, 0x06, 0x5D, 0x07, 0x70, 0x04, 0x96, 0x01, + 0x85, 0xFD, 0xA7, 0xF7, 0x9C, 0xF4, 0xE8, 0xEB, 0xAE, 0xF3, 0x0F, 0xE4, + 0xDC, 0xFC, 0x7E, 0xE4, 0xAA, 0x06, 0xEC, 0xEA, 0x47, 0x0A, 0xA2, 0xF1, + 0x7D, 0x06, 0x93, 0xF2, 0x90, 0x00, 0xF4, 0xED, 0x4F, 0xFC, 0x3F, 0xEA, + 0x61, 0xF9, 0x62, 0xE8, 0xB4, 0xF9, 0x6F, 0xE9, 0x79, 0xFE, 0x09, 0xEE, + 0x41, 0x07, 0x0F, 0xF0, 0x21, 0x0C, 0xCC, 0xEF, 0xED, 0x05, 0x5A, 0xF2, + 0xBE, 0xFA, 0x2D, 0xF6, 0x4F, 0xF0, 0xD6, 0xF6, 0x75, 0xEA, 0x87, 0xF9, + 0x22, 0xEC, 0xB1, 0x03, 0x5A, 0xEF, 0x22, 0x10, 0xB9, 0xE9, 0xC8, 0x12, + 0x36, 0xE0, 0x86, 0x09, 0x6B, 0xDF, 0x7F, 0x02, 0x06, 0xE5, 0x75, 0x06, + 0x35, 0xEC, 0x59, 0x0B, 0xFF, 0xF3, 0x4A, 0x03, 0x06, 0xFA, 0xF3, 0xF5, + 0x46, 0xFE, 0xB5, 0xEE, 0x0A, 0xFD, 0x16, 0xEB, 0xA1, 0xF7, 0xE8, 0xEB, + 0x0C, 0xF8, 0xF7, 0xF1, 0xFD, 0xFA, 0x22, 0xF7, 0x31, 0xF6, 0xDA, 0xF4, + 0xE2, 0xED, 0xDC, 0xEB, 0x78, 0xEE, 0x9F, 0xE5, 0x41, 0xF7, 0xBF, 0xEA, + 0xF2, 0xFA, 0xE5, 0xF7, 0xD3, 0xF9, 0x3E, 0xFF, 0xA0, 0xFE, 0x30, 0xFD, + 0x1E, 0x07, 0xEB, 0xFB, 0x7E, 0x07, 0x51, 0xFF, 0x1D, 0xFE, 0x35, 0x02, + 0x86, 0xF8, 0x74, 0x01, 0xD0, 0xFC, 0x22, 0xFF, 0x68, 0x02, 0x5E, 0x00, + 0xD4, 0x04, 0x39, 0x06, 0xDF, 0x05, 0xFF, 0x09, 0xF7, 0x07, 0xC5, 0x08, + 0xCA, 0x08, 0xFD, 0x05, 0x61, 0x04, 0x34, 0x02, 0xE1, 0x01, 0x82, 0xFB, + 0x60, 0x04, 0x50, 0xF4, 0x02, 0x04, 0xE7, 0xEE, 0x44, 0x02, 0xB8, 0xEC, + 0x36, 0x00, 0xC1, 0xF0, 0x92, 0xFA, 0xAB, 0xF8, 0x0F, 0xF9, 0xEC, 0xFD, + 0x59, 0x01, 0x7A, 0xFD, 0x7F, 0x0B, 0x4C, 0xFD, 0xF2, 0x10, 0x0B, 0x05, + 0xAA, 0x10, 0x46, 0x0F, 0xFC, 0x0B, 0xAF, 0x0F, 0x54, 0x09, 0xFC, 0x09, + 0xA7, 0x0C, 0x3C, 0x0A, 0x85, 0x0C, 0x48, 0x0C, 0xCD, 0x00, 0x27, 0x09, + 0xA2, 0xF3, 0x8B, 0x03, 0x1C, 0xEC, 0xAF, 0x00, 0x18, 0xE6, 0xF2, 0xFE, + 0x4C, 0xE0, 0x30, 0xF7, 0x2D, 0xDD, 0xAE, 0xEC, 0xFE, 0xE2, 0x39, 0xE8, + 0x3E, 0xEF, 0x26, 0xEB, 0xD6, 0xF5, 0x23, 0xF1, 0x2A, 0xF5, 0x3F, 0xF6, + 0x2C, 0xF5, 0xB5, 0xF8, 0x61, 0xF8, 0x15, 0xF8, 0xC6, 0xFA, 0xF7, 0xF3, + 0x7A, 0xF6, 0x8C, 0xEB, 0x15, 0xEE, 0x5E, 0xE3, 0x13, 0xEC, 0xC0, 0xDD, + 0x7A, 0xF0, 0x7D, 0xD8, 0x4F, 0xF0, 0x13, 0xD7, 0x1B, 0xE8, 0x65, 0xD7, + 0x61, 0xE1, 0x6D, 0xD2, 0x2D, 0xE0, 0xD5, 0xCB, 0xF5, 0xE2, 0x61, 0xCB, + 0xD1, 0xE6, 0xA8, 0xCF, 0xC9, 0xE5, 0x53, 0xD2, 0x81, 0xE1, 0xD3, 0xD2, + 0x44, 0xDF, 0xBB, 0xD6, 0x6B, 0xDD, 0xF4, 0xDC, 0x2A, 0xD7, 0xB2, 0xDB, + 0xF1, 0xCF, 0xAA, 0xD4, 0xEB, 0xCB, 0xFC, 0xD1, 0xE5, 0xCC, 0xE1, 0xD9, + 0x33, 0xD0, 0x08, 0xE5, 0x4F, 0xCF, 0xC3, 0xE7, 0x37, 0xCC, 0x87, 0xE4, + 0x75, 0xCD, 0xA6, 0xE1, 0xB5, 0xD2, 0xE5, 0xDF, 0x8C, 0xD6, 0xC3, 0xDD, + 0x9B, 0xD6, 0x9E, 0xD9, 0x1F, 0xD5, 0x97, 0xD1, 0x24, 0xD5, 0x01, 0xC9, + 0xE7, 0xD3, 0x7E, 0xC3, 0xA0, 0xCD, 0xF1, 0xC2, 0x0A, 0xC5, 0x61, 0xC2, + 0xE9, 0xBC, 0x6D, 0xBF, 0x0B, 0xBA, 0x54, 0xC1, 0xBB, 0xC4, 0x46, 0xC7, + 0xD0, 0xD7, 0x42, 0xCF, 0xC0, 0xE6, 0x5C, 0xD5, 0xEE, 0xED, 0xF0, 0xDA, + 0xCF, 0xF0, 0xCE, 0xE5, 0x0D, 0xEF, 0x23, 0xF0, 0xCC, 0xE8, 0x71, 0xF3, + 0x20, 0xE6, 0x40, 0xEF, 0x69, 0xE6, 0xDE, 0xE8, 0xB8, 0xE2, 0x71, 0xE3, + 0xEA, 0xE1, 0xF8, 0xDE, 0x7A, 0xEA, 0xEF, 0xDB, 0xAD, 0xF1, 0x6F, 0xDA, + 0x70, 0xEF, 0xDD, 0xDD, 0x51, 0xEB, 0x2D, 0xE7, 0x54, 0xF0, 0x3E, 0xEF, + 0xA9, 0xFB, 0x76, 0xF3, 0x96, 0x06, 0x75, 0xF7, 0x68, 0x0D, 0x9F, 0xFA, + 0xF6, 0x0D, 0xE0, 0xF7, 0x73, 0x0A, 0xB3, 0xED, 0xC7, 0x01, 0xBD, 0xE9, + 0x0F, 0xF8, 0xA1, 0xF3, 0xA4, 0xF8, 0xCD, 0x00, 0x83, 0x08, 0x11, 0x0A, + 0x7A, 0x19, 0xD1, 0x10, 0x46, 0x19, 0x2A, 0x15, 0x2D, 0x0C, 0x97, 0x12, + 0x90, 0x03, 0x3E, 0x0B, 0x37, 0x06, 0xA6, 0x0A, 0xFD, 0x0A, 0x26, 0x12, + 0xD1, 0x0B, 0xAA, 0x16, 0xBF, 0x0C, 0x3C, 0x14, 0x42, 0x10, 0x5C, 0x0D, + 0x81, 0x15, 0x26, 0x08, 0x7D, 0x15, 0x38, 0x07, 0xD0, 0x0C, 0xD4, 0x05, + 0xB0, 0x03, 0x44, 0x04, 0x91, 0x00, 0xD5, 0x06, 0xD0, 0xFF, 0x27, 0x0F, + 0x0B, 0xFD, 0xEE, 0x16, 0xA5, 0xFD, 0x6D, 0x18, 0x3A, 0x09, 0xAD, 0x18, + 0x6A, 0x18, 0x90, 0x1A, 0x92, 0x1A, 0xA8, 0x1C, 0xF9, 0x0F, 0x35, 0x1C, + 0xD5, 0x0A, 0xD1, 0x18, 0x90, 0x13, 0x78, 0x17, 0x70, 0x1E, 0x7C, 0x15, + 0x4E, 0x20, 0x80, 0x0C, 0x26, 0x1B, 0x86, 0x00, 0x3A, 0x17, 0xB2, 0xFB, + 0x05, 0x17, 0xA7, 0xFE, 0xF9, 0x16, 0x3C, 0x01, 0x88, 0x11, 0xAB, 0xFD, + 0x95, 0x0B, 0x19, 0xFD, 0x97, 0x10, 0x87, 0x08, 0x00, 0x18, 0x2D, 0x14, + 0x35, 0x17, 0xA1, 0x16, 0x4A, 0x15, 0x88, 0x13, 0x19, 0x19, 0x4A, 0x11, + 0x37, 0x1A, 0xEC, 0x0E, 0x7D, 0x11, 0x30, 0x0A, 0x07, 0x07, 0x72, 0x07, + 0x6D, 0x08, 0x6C, 0x0A, 0xA2, 0x16, 0x53, 0x0F, 0xA9, 0x21, 0x34, 0x0C, + 0xCB, 0x1D, 0x64, 0x04, 0x77, 0x13, 0xD7, 0x02, 0xB3, 0x0F, 0x69, 0x06, + 0x9C, 0x11, 0x45, 0x0B, 0xF2, 0x10, 0x01, 0x0C, 0x1D, 0x08, 0x14, 0x05, + 0x24, 0xFC, 0x42, 0x01, 0x9D, 0xF5, 0x15, 0x07, 0x24, 0xF3, 0x0D, 0x0F, + 0x90, 0xED, 0xC9, 0x0F, 0x1E, 0xE7, 0xAE, 0x06, 0xFA, 0xEB, 0x27, 0xFE, + 0xC1, 0xF7, 0xC5, 0xFB, 0x35, 0xFB, 0x58, 0xFE, 0x05, 0xFA, 0x24, 0x03, + 0x4E, 0x02, 0x0D, 0x03, 0xB3, 0x11, 0x99, 0x01, 0x65, 0x16, 0x21, 0x01, + 0x5B, 0x0B, 0x22, 0xFF, 0xFC, 0xFC, 0x9B, 0xFB, 0xE4, 0xF6, 0x79, 0xF8, + 0xBC, 0xF5, 0xF3, 0xF9, 0x32, 0xF1, 0x65, 0xFD, 0x6A, 0xEB, 0xAE, 0xFA, + 0x1C, 0xE9, 0x97, 0xF0, 0x84, 0xEA, 0x08, 0xEB, 0xE3, 0xEA, 0x5A, 0xEF, + 0xE0, 0xEA, 0xE0, 0xF3, 0x8D, 0xEF, 0x5E, 0xF3, 0xE3, 0xF6, 0xCC, 0xF1, + 0xBE, 0xF9, 0x6F, 0xF2, 0x5B, 0xF7, 0x25, 0xF5, 0xAE, 0xF9, 0xCB, 0xF9, + 0x6C, 0x05, 0x8F, 0xFE, 0xDB, 0x10, 0x1A, 0x02, 0x8D, 0x0F, 0xA9, 0x04, + 0xAA, 0x03, 0x64, 0x04, 0xCB, 0xFB, 0x17, 0x00, 0x3A, 0xFE, 0x9B, 0xFB, + 0x2C, 0x02, 0x51, 0xFD, 0x53, 0xFF, 0x05, 0x04, 0x90, 0xFC, 0xCF, 0x09, + 0x7D, 0x05, 0xAF, 0x0E, 0xAF, 0x10, 0x7C, 0x11, 0xE5, 0x0A, 0xCF, 0x0D, + 0x49, 0xF9, 0x1D, 0x04, 0xA4, 0xF1, 0x9B, 0xFB, 0x80, 0xF9, 0xB6, 0xFD, + 0x53, 0x02, 0x64, 0x06, 0x78, 0x02, 0x77, 0x0E, 0x2D, 0xFD, 0x70, 0x15, + 0x53, 0xFA, 0x78, 0x12, 0x12, 0xFE, 0x8C, 0x09, 0xC4, 0x06, 0xBA, 0x08, + 0x1B, 0x13, 0x8A, 0x0B, 0x87, 0x1F, 0x87, 0x06, 0x46, 0x23, 0xF9, 0xFC, + 0x42, 0x19, 0xBA, 0xF9, 0x06, 0x0A, 0x18, 0xFC, 0xBF, 0xFF, 0xA3, 0xFE, + 0xC1, 0xFE, 0xA2, 0x01, 0xAB, 0x04, 0xAA, 0x02, 0x2B, 0x05, 0xF1, 0x00, + 0xFF, 0xFD, 0x56, 0x03, 0xEE, 0xF8, 0xB1, 0x09, 0x4A, 0xFC, 0x42, 0x0E, + 0x3B, 0x04, 0x1D, 0x12, 0xCF, 0x09, 0xD4, 0x17, 0x26, 0x0B, 0x1F, 0x1A, + 0x05, 0x07, 0x58, 0x16, 0xC2, 0x01, 0x8A, 0x11, 0x5B, 0xFE, 0x3E, 0x0C, + 0x36, 0xFC, 0x0A, 0x05, 0x2E, 0xFC, 0x43, 0x00, 0x20, 0x00, 0xE2, 0x01, + 0xEC, 0x04, 0xCF, 0x03, 0xC6, 0x00, 0xD2, 0xFD, 0xAE, 0xF6, 0x45, 0xF4, + 0xEE, 0xF5, 0xB6, 0xF2, 0x88, 0x02, 0x43, 0xF9, 0x25, 0x0E, 0xC0, 0xFF, + 0xAF, 0x0D, 0x87, 0x02, 0xCF, 0x07, 0x12, 0x03, 0x96, 0x04, 0xD8, 0x05, + 0x6D, 0xFF, 0xF5, 0x07, 0xDC, 0xF3, 0xA3, 0x04, 0x18, 0xEB, 0x17, 0x01, + 0xAE, 0xF0, 0x42, 0x03, 0xA3, 0xFE, 0x69, 0x07, 0x7E, 0x05, 0xFA, 0x06, + 0xCE, 0x02, 0xD9, 0x02, 0x14, 0x00, 0xCD, 0x03, 0x9F, 0x04, 0x13, 0x0C, + 0x99, 0x0B, 0x4C, 0x15, 0x14, 0x10, 0x5B, 0x1A, 0x47, 0x11, 0x24, 0x19, + 0x48, 0x0C, 0x19, 0x16, 0x8B, 0x03, 0x05, 0x13, 0x83, 0xFD, 0xB7, 0x0C, + 0xC9, 0xFA, 0xDF, 0x04, 0x4F, 0xFC, 0x63, 0x01, 0xBB, 0x02, 0x62, 0x06, + 0x5F, 0x09, 0x08, 0x0F, 0x0A, 0x0D, 0x27, 0x12, 0xA2, 0x11, 0xA5, 0x0E, + 0x56, 0x1C, 0x58, 0x09, 0x53, 0x28, 0x77, 0x06, 0x0F, 0x2C, 0x2B, 0x05, + 0x56, 0x22, 0x95, 0x02, 0xBE, 0x16, 0xE1, 0x05, 0xBC, 0x17, 0xD0, 0x10, + 0x08, 0x20, 0xFB, 0x19, 0x0C, 0x24, 0x9A, 0x1A, 0xD1, 0x1F, 0xC5, 0x16, + 0x60, 0x19, 0x27, 0x19, 0x19, 0x17, 0x81, 0x20, 0x2F, 0x1A, 0xDD, 0x26, + 0x22, 0x20, 0xBE, 0x2C, 0x52, 0x26, 0xE6, 0x31, 0xFE, 0x28, 0x23, 0x35, + 0x9E, 0x23, 0x10, 0x38, 0x2A, 0x1A, 0x0E, 0x3B, 0x02, 0x12, 0x02, 0x39, + 0x33, 0x0C, 0x42, 0x30, 0x1E, 0x09, 0x2B, 0x27, 0xA8, 0x0A, 0x3F, 0x24, + 0x6F, 0x10, 0x5D, 0x27, 0x17, 0x16, 0x18, 0x2B, 0x85, 0x1B, 0x36, 0x2B, + 0x2E, 0x20, 0xBB, 0x27, 0xD4, 0x23, 0x49, 0x22, 0x8D, 0x2A, 0x49, 0x1D, + 0x2B, 0x2E, 0xEA, 0x1C, 0xB7, 0x29, 0xAF, 0x1B, 0xB2, 0x24, 0xBB, 0x16, + 0xAB, 0x20, 0x04, 0x17, 0xEC, 0x18, 0x2E, 0x19, 0xED, 0x0D, 0x7F, 0x14, + 0x4E, 0x07, 0x58, 0x0D, 0x47, 0x08, 0x26, 0x0E, 0x13, 0x0E, 0xA4, 0x16, + 0xCD, 0x15, 0xD5, 0x1A, 0x9C, 0x1A, 0xFE, 0x18, 0xEA, 0x1A, 0x40, 0x19, + 0xEA, 0x16, 0x11, 0x1B, 0x4C, 0x11, 0x25, 0x1A, 0x45, 0x0E, 0x0B, 0x14, + 0xD2, 0x0E, 0x3F, 0x0A, 0x0C, 0x0E, 0x56, 0xFE, 0xD8, 0x09, 0x84, 0xF2, + 0xDA, 0x05, 0x83, 0xEF, 0xCC, 0x03, 0x0F, 0xF5, 0x75, 0x02, 0xDC, 0xFB, + 0xF9, 0x00, 0x55, 0x01, 0x56, 0xFF, 0x5F, 0x02, 0x1D, 0x03, 0x79, 0xFD, + 0xD4, 0x0B, 0xA2, 0xF5, 0xDD, 0x09, 0x1D, 0xF0, 0xA6, 0xFB, 0xC1, 0xF1, + 0xBD, 0xEE, 0xE1, 0xF6, 0x2C, 0xE5, 0xCE, 0xF6, 0xB5, 0xDD, 0x4E, 0xF0, + 0xE0, 0xDD, 0x75, 0xED, 0xC5, 0xE3, 0xAA, 0xF4, 0xEE, 0xE9, 0xFC, 0xFA, + 0x43, 0xED, 0xCA, 0xF6, 0xDB, 0xEB, 0xE5, 0xEE, 0xC2, 0xE8, 0xA9, 0xED, + 0x10, 0xE7, 0x59, 0xF4, 0x04, 0xE8, 0x82, 0xFA, 0x03, 0xE9, 0xA0, 0xFA, + 0x32, 0xE4, 0x39, 0xF7, 0xBF, 0xDB, 0x29, 0xF3, 0x13, 0xD8, 0xE0, 0xEF, + 0xCD, 0xD8, 0x21, 0xEB, 0xE9, 0xD6, 0xCE, 0xE5, 0x27, 0xD3, 0x03, 0xE7, + 0xC0, 0xD7, 0xC8, 0xEE, 0x57, 0xE6, 0xAB, 0xF1, 0x70, 0xF0, 0xCC, 0xEB, + 0x74, 0xEF, 0xCA, 0xE4, 0x17, 0xED, 0xED, 0xE0, 0xAF, 0xF0, 0x0B, 0xDD, + 0x93, 0xF5, 0x77, 0xD6, 0x2C, 0xF5, 0x81, 0xD0, 0xC6, 0xF0, 0x3C, 0xCF, + 0xC0, 0xEF, 0x7C, 0xD5, 0xD0, 0xF4, 0xEE, 0xDC, 0xC0, 0xF8, 0xF9, 0xDE, + 0x5B, 0xF9, 0x7F, 0xE1, 0x6A, 0xF9, 0xCB, 0xE7, 0x3B, 0xF6, 0x49, 0xEE, + 0xAD, 0xF0, 0x40, 0xF2, 0x2B, 0xF0, 0x87, 0xF5, 0x3A, 0xF6, 0xD6, 0xFB, + 0x0E, 0xFE, 0x49, 0x01, 0xA1, 0x02, 0xB5, 0xFC, 0x3B, 0xFF, 0x1E, 0xF2, + 0x9A, 0xF3, 0xDA, 0xEF, 0xD1, 0xE8, 0x78, 0xF6, 0xDA, 0xEA, 0x51, 0xFA, + 0x94, 0xF4, 0x6C, 0xF6, 0xE2, 0xF8, 0xA2, 0xF2, 0xF6, 0xF5, 0xD1, 0xF7, + 0xCE, 0xF2, 0x5D, 0x03, 0xC9, 0xF5, 0x67, 0x0A, 0x05, 0xFC, 0x07, 0x05, + 0x79, 0xFE, 0x11, 0xF9, 0x60, 0xFC, 0x5F, 0xF1, 0xBD, 0xFE, 0x2C, 0xF3, + 0x57, 0x07, 0x28, 0xF9, 0x1C, 0x08, 0x94, 0xFD, 0x51, 0xFD, 0x94, 0x02, + 0xFA, 0xF6, 0x99, 0x05, 0x89, 0x00, 0xBE, 0x05, 0x0F, 0x0E, 0xDA, 0x05, + 0x0E, 0x0E, 0x1E, 0x06, 0xB0, 0x05, 0x77, 0x08, 0xC5, 0x02, 0x58, 0x0B, + 0x63, 0x08, 0xFD, 0x09, 0x92, 0x0C, 0xDF, 0x06, 0x40, 0x09, 0x2C, 0x08, + 0x31, 0x07, 0xD8, 0x0B, 0x42, 0x09, 0xB0, 0x0A, 0xF3, 0x0A, 0xF7, 0x04, + 0x40, 0x06, 0xF5, 0x01, 0x88, 0xFF, 0xD4, 0x03, 0x64, 0x00, 0xC9, 0x08, + 0x54, 0x03, 0xB0, 0x0D, 0x12, 0x02, 0x24, 0x12, 0xAC, 0xFD, 0xD1, 0x17, + 0xEE, 0xFB, 0xBE, 0x16, 0xF9, 0x03, 0x83, 0x0A, 0xE2, 0x11, 0x6F, 0xFE, + 0x33, 0x19, 0x8D, 0xF9, 0xE6, 0x14, 0x68, 0xF3, 0x9D, 0x0B, 0x27, 0xE9, + 0x65, 0x03, 0x7E, 0xE1, 0x30, 0xFD, 0x16, 0xE0, 0x69, 0xF9, 0x79, 0xE4, + 0x9E, 0xF9, 0x6F, 0xEB, 0x2D, 0xFE, 0x9C, 0xEE, 0x54, 0x01, 0xC8, 0xEF, + 0xEE, 0xFE, 0xC9, 0xF3, 0xF1, 0xF9, 0x5E, 0xF7, 0xF4, 0xF9, 0x3F, 0xFB, + 0x02, 0xFF, 0x6F, 0x00, 0x9A, 0xFD, 0x21, 0x03, 0x5F, 0xF5, 0xDD, 0x03, + 0xC1, 0xF1, 0x49, 0x04, 0x24, 0xF4, 0x12, 0x01, 0x6E, 0xF4, 0xF7, 0xFA, + 0xE5, 0xEC, 0x87, 0xF8, 0x1B, 0xE2, 0xF4, 0xF9, 0x84, 0xDF, 0x9A, 0xFA, + 0x0C, 0xE6, 0x1E, 0xFC, 0x6C, 0xEE, 0xF7, 0xFE, 0x70, 0xF4, 0xED, 0xF9, + 0x2D, 0xF6, 0x2C, 0xEB, 0xB7, 0xF4, 0xBA, 0xDB, 0xE0, 0xF2, 0x84, 0xD2, + 0xE9, 0xF1, 0xED, 0xD3, 0xB0, 0xF3, 0xB8, 0xDB, 0x3A, 0xF8, 0xF7, 0xE2, + 0xEE, 0xF9, 0xC9, 0xE7, 0xF3, 0xF6, 0xCC, 0xEB, 0x3C, 0xF5, 0x2D, 0xF3, + 0x97, 0xF8, 0x7C, 0xFB, 0x4E, 0xFC, 0x61, 0xFC, 0xC2, 0xF8, 0x18, 0xF4, + 0x79, 0xF2, 0x9C, 0xEA, 0xD8, 0xF3, 0x4F, 0xEA, 0x4C, 0xFB, 0xAE, 0xEF, + 0x7E, 0xFF, 0xF5, 0xEE, 0x7C, 0xFA, 0x98, 0xE9, 0x48, 0xF2, 0x5E, 0xE8, + 0x57, 0xE9, 0xAE, 0xEB, 0x0A, 0xDF, 0xEC, 0xEA, 0xC8, 0xD8, 0x25, 0xE9, + 0xCD, 0xD8, 0x3C, 0xF1, 0xF8, 0xDD, 0x0D, 0xFE, 0xAD, 0xE4, 0xF1, 0x05, + 0xB2, 0xE9, 0x76, 0x06, 0x67, 0xEA, 0x1E, 0x03, 0xA1, 0xEB, 0x82, 0x00, + 0x90, 0xF5, 0xC9, 0xFB, 0x92, 0x02, 0xF5, 0xF2, 0xBF, 0x05, 0x7E, 0xEA, + 0xF7, 0xFC, 0xC0, 0xE5, 0x68, 0xF4, 0x72, 0xE6, 0xE2, 0xF4, 0xE2, 0xEB, + 0xE5, 0xF5, 0x26, 0xED, 0xF8, 0xF0, 0x65, 0xE7, 0xA4, 0xED, 0x65, 0xE8, + 0x73, 0xF3, 0x29, 0xF2, 0xFE, 0xFC, 0xE5, 0xF4, 0xF0, 0x00, 0x3E, 0xED, + 0x65, 0x00, 0xFE, 0xEA, 0xEE, 0x03, 0xED, 0xF3, 0x85, 0x09, 0x64, 0xFD, + 0x69, 0x06, 0x1C, 0x00, 0x25, 0xFD, 0x31, 0xFF, 0x73, 0xF7, 0xC5, 0x00, + 0x9B, 0xF8, 0x71, 0x01, 0x75, 0xF9, 0x48, 0x00, 0x62, 0xF4, 0xEB, 0x03, + 0x4C, 0xF2, 0x7F, 0x0C, 0xAE, 0xF9, 0xF8, 0x13, 0x7A, 0x02, 0xEF, 0x14, + 0x98, 0x05, 0x3C, 0x0C, 0x75, 0x04, 0x58, 0xFA, 0x8A, 0x00, 0x1C, 0xE9, + 0x71, 0xFF, 0x5F, 0xE3, 0x8E, 0x03, 0xED, 0xE3, 0x79, 0x05, 0x61, 0xE3, + 0x6F, 0x01, 0x01, 0xE5, 0xB3, 0xFA, 0xFC, 0xEB, 0x74, 0xF6, 0xC5, 0xFA, + 0x07, 0xF5, 0xA2, 0x08, 0x75, 0xF3, 0x42, 0x0A, 0x6A, 0xF2, 0xD8, 0x02, + 0x1A, 0xF6, 0xC8, 0xFA, 0xB2, 0xFD, 0x97, 0xF9, 0x02, 0x06, 0x80, 0xFE, + 0xF3, 0x0A, 0xCC, 0x01, 0x4E, 0x08, 0xE3, 0xFF, 0xF2, 0xFF, 0x70, 0xFA, + 0xB9, 0xF4, 0xC6, 0xF5, 0x2A, 0xED, 0xB2, 0xF3, 0xBA, 0xED, 0xD1, 0xF3, + 0x7F, 0xF1, 0x70, 0xF8, 0x6D, 0xF3, 0x5A, 0xFF, 0x57, 0xF2, 0xC7, 0x00, + 0x06, 0xEE, 0x00, 0xFB, 0x95, 0xE7, 0xFE, 0xF3, 0xCA, 0xE5, 0x23, 0xEF, + 0xAF, 0xEC, 0x47, 0xEB, 0xFE, 0xF8, 0x8E, 0xEA, 0xF1, 0x01, 0xAC, 0xEA, + 0xE9, 0x00, 0x59, 0xE8, 0x93, 0xF8, 0xBB, 0xEA, 0xFE, 0xEC, 0x65, 0xF4, + 0x08, 0xE3, 0x66, 0x01, 0x44, 0xE3, 0x72, 0x0C, 0xCF, 0xEE, 0x49, 0x0D, + 0x07, 0xF7, 0x91, 0x02, 0x48, 0xF8, 0x5E, 0xF9, 0x0A, 0x00, 0x61, 0xFA, + 0x12, 0x0F, 0xCD, 0xFE, 0x4A, 0x1A, 0x8F, 0x01, 0x66, 0x1A, 0xE8, 0xFF, + 0x79, 0x14, 0x28, 0xFA, 0xE4, 0x0F, 0x3E, 0xF8, 0x70, 0x0A, 0x4F, 0xFE, + 0x99, 0x04, 0x60, 0x06, 0x04, 0xFF, 0x06, 0x0E, 0x54, 0xFA, 0xC8, 0x18, + 0xF3, 0xFD, 0x03, 0x21, 0x99, 0x06, 0xB8, 0x22, 0x44, 0x0B, 0x8E, 0x21, + 0x29, 0x11, 0x80, 0x21, 0xCA, 0x1E, 0x3A, 0x24, 0x02, 0x2F, 0x0B, 0x23, + 0xAC, 0x39, 0xB0, 0x1B, 0x44, 0x3B, 0xC1, 0x17, 0xA7, 0x35, 0x0F, 0x1B, + 0xC6, 0x2C, 0x22, 0x1F, 0xE3, 0x24, 0x3D, 0x1D, 0x51, 0x1F, 0x42, 0x18, + 0xFE, 0x1E, 0x35, 0x18, 0x57, 0x25, 0x15, 0x1C, 0xFA, 0x27, 0x12, 0x1E, + 0xE2, 0x21, 0xED, 0x1B, 0x4D, 0x1E, 0x4A, 0x1A, 0xA3, 0x21, 0xEC, 0x1F, + 0x11, 0x25, 0xEE, 0x29, 0x73, 0x27, 0x62, 0x30, 0x78, 0x2B, 0x7C, 0x2F, + 0x01, 0x2A, 0x0C, 0x2B, 0x28, 0x1C, 0x83, 0x28, 0xAA, 0x0A, 0x2A, 0x25, + 0xF7, 0x00, 0xE7, 0x1F, 0x03, 0x04, 0x4E, 0x1D, 0x38, 0x0D, 0x0A, 0x1F, + 0xF2, 0x0F, 0x18, 0x20, 0x71, 0x0D, 0x3D, 0x1B, 0x66, 0x0F, 0x9E, 0x11, + 0x8B, 0x16, 0xBF, 0x07, 0x2E, 0x1A, 0xF8, 0x02, 0xF0, 0x13, 0xAA, 0x00, + 0x44, 0x06, 0x39, 0xF9, 0x9D, 0xF7, 0x14, 0xF2, 0x6A, 0xEC, 0xD2, 0xF3, + 0x40, 0xE5, 0x82, 0xFC, 0x60, 0xE5, 0xFF, 0x03, 0xC9, 0xEE, 0xCA, 0x04, + 0x07, 0xFA, 0x6E, 0x06, 0x09, 0xFE, 0x7F, 0x0B, 0x85, 0xF9, 0xA8, 0x09, + 0xB1, 0xF8, 0x43, 0xFF, 0x00, 0x01, 0x8D, 0xF7, 0x99, 0x08, 0x2A, 0xFB, + 0xC9, 0x09, 0x90, 0x02, 0x48, 0x05, 0x74, 0x00, 0x0F, 0xFF, 0x29, 0xF2, + 0x65, 0xF9, 0x88, 0xE3, 0xBF, 0xF3, 0x5F, 0xE1, 0xB6, 0xEE, 0x1D, 0xE8, + 0x71, 0xEA, 0xFF, 0xEB, 0x1B, 0xE8, 0xFF, 0xEC, 0xB9, 0xEA, 0xD2, 0xF1, + 0xC4, 0xF0, 0xD0, 0xF8, 0x4F, 0xF4, 0xD1, 0xF9, 0xE7, 0xF4, 0xB6, 0xF1, + 0x83, 0xF6, 0x99, 0xEB, 0xF9, 0xF5, 0x43, 0xEE, 0xCA, 0xF2, 0x03, 0xEF, + 0x2C, 0xF2, 0x38, 0xEC, 0xBF, 0xF5, 0x86, 0xF1, 0xA9, 0xF8, 0xA9, 0xFA, + 0x21, 0xF5, 0x2C, 0xFD, 0xCA, 0xF1, 0x94, 0xFA, 0x37, 0xF6, 0xEE, 0xF4, + 0x09, 0xFC, 0xAD, 0xEE, 0x78, 0xF9, 0xF6, 0xEB, 0x7C, 0xF0, 0xB4, 0xED, + 0x5A, 0xEB, 0xB0, 0xF0, 0xA5, 0xEF, 0x61, 0xF1, 0x91, 0xF5, 0x3A, 0xF1, + 0x13, 0xF6, 0xA6, 0xF3, 0x27, 0xF3, 0x90, 0xF8, 0xC3, 0xEF, 0x38, 0xFB, + 0xC7, 0xEC, 0xCD, 0xFC, 0x5F, 0xE8, 0x33, 0x02, 0x96, 0xE8, 0x3D, 0x06, + 0xE3, 0xF1, 0x1B, 0x07, 0x0F, 0xFE, 0xD4, 0x07, 0xB5, 0x05, 0x85, 0x08, + 0x5E, 0x07, 0x41, 0x08, 0x45, 0x09, 0x62, 0x05, 0xE6, 0x0D, 0x4B, 0x00, + 0xBE, 0x0F, 0x3A, 0xFD, 0x65, 0x09, 0x95, 0x01, 0xA0, 0xFF, 0xDF, 0x07, + 0x5F, 0xFC, 0xFC, 0x08, 0xF8, 0xFF, 0x93, 0x08, 0x15, 0x05, 0xF1, 0x09, + 0x2D, 0x09, 0x55, 0x0C, 0x6D, 0x0F, 0x9E, 0x0E, 0xA8, 0x19, 0x5F, 0x0E, + 0xC4, 0x1E, 0x6F, 0x0C, 0xA8, 0x1A, 0x7A, 0x11, 0x68, 0x19, 0x10, 0x1D, + 0xA6, 0x21, 0x76, 0x25, 0x9E, 0x2B, 0xEC, 0x26, 0x4A, 0x2B, 0xE5, 0x25, + 0xEB, 0x1E, 0x3C, 0x26, 0x72, 0x13, 0x00, 0x23, 0x82, 0x10, 0x2A, 0x1C, + 0x80, 0x13, 0x5A, 0x1C, 0x70, 0x16, 0xCB, 0x26, 0xA9, 0x18, 0x00, 0x2B, + 0xB4, 0x1F, 0x3F, 0x22, 0xFC, 0x28, 0x5F, 0x1C, 0x96, 0x29, 0xFC, 0x1C, + 0x48, 0x1E, 0x76, 0x18, 0x5D, 0x12, 0x29, 0x11, 0xD6, 0x13, 0x8D, 0x14, + 0x29, 0x21, 0x02, 0x20, 0x8C, 0x2A, 0x25, 0x2B, 0xE8, 0x29, 0x34, 0x31, + 0x4A, 0x24, 0xF3, 0x30, 0x08, 0x1C, 0x6C, 0x2F, 0x55, 0x10, 0x79, 0x2E, + 0xE2, 0x08, 0x75, 0x2D, 0x36, 0x0E, 0xE0, 0x25, 0x7A, 0x1B, 0x41, 0x18, + 0x26, 0x25, 0x0F, 0x12, 0x74, 0x24, 0x03, 0x18, 0x30, 0x1F, 0xC7, 0x1A, + 0x11, 0x1C, 0x77, 0x13, 0xD6, 0x1A, 0x65, 0x12, 0x67, 0x19, 0x29, 0x16, + 0xA2, 0x18, 0xF9, 0x10, 0x31, 0x18, 0x21, 0x0A, 0x56, 0x18, 0x67, 0x0B, + 0x2D, 0x19, 0x48, 0x12, 0x99, 0x14, 0xE7, 0x16, 0x0A, 0x0A, 0xC0, 0x11, + 0x00, 0x02, 0x1F, 0x07, 0xC0, 0x00, 0xFF, 0x01, 0x50, 0x02, 0x7F, 0x05, + 0x3B, 0x05, 0x7C, 0x0A, 0x9F, 0x0A, 0x20, 0x09, 0x9C, 0x10, 0x3B, 0x04, + 0x14, 0x12, 0x70, 0x02, 0x21, 0x09, 0x7B, 0x06, 0x5E, 0xFA, 0xE9, 0x0C, + 0xCE, 0xF5, 0xDA, 0x0F, 0xD0, 0xFB, 0xD5, 0x0E, 0xB7, 0xFF, 0xA8, 0x0A, + 0x50, 0x02, 0x18, 0x04, 0xA0, 0x06, 0xD6, 0xFD, 0x52, 0x05, 0x4B, 0xFD, + 0x6E, 0xFA, 0xA7, 0x00, 0x6D, 0xF0, 0x5D, 0x00, 0x65, 0xF2, 0xA5, 0xFF, + 0x31, 0xFB, 0x5B, 0x01, 0xC2, 0x00, 0xF5, 0x02, 0xAF, 0x01, 0xC8, 0x02, + 0xFA, 0xFF, 0x1F, 0x02, 0xCD, 0xFE, 0x7D, 0xFE, 0x89, 0xFE, 0x64, 0xF6, + 0x0A, 0xFC, 0x8C, 0xF0, 0x22, 0xFB, 0xEB, 0xEB, 0x83, 0xFE, 0xF6, 0xE6, + 0x44, 0x01, 0xA5, 0xE3, 0xA9, 0xFF, 0xB2, 0xE1, 0xD3, 0xFC, 0x91, 0xE3, + 0xAD, 0xFD, 0xA9, 0xE9, 0xFE, 0x01, 0xE0, 0xF4, 0x96, 0x02, 0x20, 0x02, + 0x17, 0xF9, 0x26, 0x09, 0x5F, 0xEF, 0x2C, 0x08, 0xBC, 0xF1, 0xC0, 0x00, + 0x39, 0xF8, 0x0E, 0xF9, 0x95, 0xF6, 0xCD, 0xF8, 0x88, 0xEF, 0x94, 0xFB, + 0xED, 0xEB, 0xA5, 0xF9, 0xDC, 0xEF, 0x92, 0xF7, 0x08, 0xF7, 0x36, 0xFB, + 0xB4, 0xF9, 0x21, 0x01, 0x3D, 0xF5, 0x31, 0x06, 0x56, 0xF1, 0xBA, 0x06, + 0x76, 0xF4, 0xA5, 0xFF, 0x34, 0xF6, 0xF8, 0xF9, 0xE2, 0xF1, 0x62, 0xF9, + 0x38, 0xE9, 0x5C, 0xF9, 0xFD, 0xE2, 0xC9, 0xFB, 0x66, 0xE5, 0x9E, 0xFE, + 0x9F, 0xEC, 0xC5, 0xFB, 0x10, 0xF0, 0xFF, 0xF1, 0x19, 0xEC, 0x4D, 0xE6, + 0xF3, 0xE8, 0xC0, 0xDF, 0x5A, 0xEB, 0x43, 0xE1, 0x81, 0xED, 0xC0, 0xE7, + 0xA6, 0xEC, 0xF4, 0xE9, 0x31, 0xEF, 0x47, 0xE9, 0xA8, 0xF5, 0xF8, 0xED, + 0xBD, 0xFC, 0x1A, 0xF5, 0x48, 0x03, 0x74, 0xF9, 0x56, 0x03, 0x4E, 0xF6, + 0xA0, 0xFB, 0xCC, 0xED, 0x69, 0xF3, 0x1D, 0xE8, 0x8C, 0xF0, 0xFF, 0xE8, + 0x5A, 0xEF, 0x25, 0xEE, 0x40, 0xED, 0x7F, 0xF3, 0x2C, 0xEF, 0x71, 0xF8, + 0xDE, 0xF2, 0x99, 0xF8, 0x9A, 0xF3, 0x89, 0xF2, 0x2A, 0xF3, 0x73, 0xEC, + 0x7C, 0xF5, 0x84, 0xED, 0x90, 0xF4, 0xE9, 0xF0, 0x75, 0xF1, 0x62, 0xEF, + 0x6F, 0xE8, 0x3F, 0xE2, 0x83, 0xE2, 0x64, 0xD4, 0xD8, 0xEE, 0x42, 0xD2, + 0x80, 0xFC, 0x1A, 0xD0, 0x79, 0x02, 0x4A, 0xCD, 0xCB, 0xFD, 0x5C, 0xC9, + 0x5B, 0xFD, 0x64, 0xD3, 0x49, 0xF5, 0xBF, 0xDC, 0x34, 0xF0, 0x0C, 0xE4, + 0xDC, 0xFD, 0xA1, 0xFB, 0x78, 0xF0, 0xBB, 0x00, 0x71, 0xDA, 0x73, 0xFB, + 0x1B, 0xD9, 0x85, 0x02, 0x50, 0xDE, 0x5C, 0x08, 0x98, 0xD9, 0xFF, 0xFD, + 0xF3, 0xD5, 0x11, 0xF1, 0xC3, 0xDF, 0xE5, 0xF2, 0x96, 0xE4, 0xAE, 0xF5, + 0xB8, 0xDA, 0x25, 0xEF, 0x90, 0xD8, 0xC5, 0xED, 0x61, 0xEB, 0x69, 0xF7, + 0x30, 0xF5, 0x41, 0xF8, 0x55, 0xF6, 0x31, 0xF2, 0x63, 0xF5, 0x19, 0xF2, + 0x7D, 0xEB, 0x95, 0xF4, 0x8D, 0xE2, 0x83, 0xF0, 0xB8, 0xE9, 0x17, 0xED, + 0x49, 0xF4, 0xB4, 0xED, 0xEB, 0xF3, 0xD1, 0xF0, 0x1F, 0x00, 0x54, 0xFC, + 0xB7, 0x0E, 0x6B, 0x00, 0xE8, 0x06, 0x52, 0xF6, 0xCD, 0x08, 0xFA, 0xF2, + 0xC8, 0x05, 0x62, 0xF1, 0xE5, 0xFA, 0x23, 0xEC, 0xFD, 0x01, 0x4F, 0xEC, + 0x59, 0x09, 0x26, 0xF7, 0x7C, 0x09, 0xA4, 0xF3, 0xA4, 0x09, 0x2A, 0xED, + 0x89, 0x10, 0x1B, 0xEE, 0x71, 0x08, 0xEB, 0xE6, 0xED, 0x05, 0x43, 0xF1, + 0x73, 0x0B, 0xAC, 0x01, 0xFE, 0x03, 0x35, 0x0D, 0x2C, 0x07, 0x02, 0x10, + 0x0A, 0x02, 0x1C, 0x0C, 0xAA, 0xF0, 0x9F, 0x08, 0x33, 0xF2, 0x1B, 0x07, + 0xE0, 0xF4, 0x60, 0x01, 0x39, 0xF8, 0x64, 0x00, 0x5E, 0x04, 0x32, 0x0F, + 0x66, 0x05, 0xDB, 0x0F, 0x7F, 0x08, 0xC7, 0x09, 0x5A, 0x0C, 0xAB, 0x03, + 0x8B, 0x07, 0xB7, 0xF7, 0x55, 0xFF, 0xB1, 0xF1, 0x49, 0xFE, 0x6E, 0xEE, + 0x38, 0xF6, 0xAC, 0xE8, 0x22, 0xED, 0xBC, 0xEB, 0x10, 0xEE, 0x7F, 0xF3, + 0x94, 0xF0, 0xEE, 0xF8, 0xE0, 0xF7, 0x4B, 0xFE, 0xE0, 0xF1, 0xD1, 0xFA, + 0x20, 0xF0, 0x38, 0xFC, 0xB3, 0xF4, 0x9A, 0x02, 0x06, 0xF5, 0xEA, 0xFD, + 0xE4, 0xF9, 0xDF, 0xF5, 0xCE, 0xFC, 0x0C, 0xF5, 0x8E, 0xFB, 0xAA, 0xFB, + 0x01, 0xF9, 0x8D, 0x09, 0x83, 0xF4, 0xFD, 0x0B, 0xC5, 0xF6, 0x9B, 0x06, + 0x21, 0xF3, 0x61, 0xFD, 0x89, 0xE9, 0x57, 0xF2, 0x96, 0xF2, 0x64, 0xF3, + 0x94, 0xF6, 0xF0, 0xED, 0x21, 0xF1, 0xB4, 0xE9, 0x11, 0xF8, 0xF6, 0xF1, + 0x14, 0xFE, 0x15, 0xF3, 0xE8, 0xF7, 0x61, 0xE5, 0xF4, 0xF5, 0x8D, 0xDA, + 0xAB, 0xFB, 0x4E, 0xDC, 0x6E, 0xFE, 0x09, 0xE2, 0x11, 0xFF, 0x4D, 0xE6, + 0x67, 0x07, 0xE8, 0xE8, 0x2B, 0xFE, 0x93, 0xE1, 0x60, 0xEC, 0xFB, 0xE1, + 0x5A, 0xEB, 0xFC, 0xF2, 0x83, 0xF6, 0x59, 0x05, 0x53, 0x01, 0xC9, 0x0C, + 0x4F, 0xFC, 0x23, 0x0B, 0x82, 0xFB, 0x38, 0x0C, 0x62, 0xFE, 0xE3, 0x08, + 0xA2, 0xF5, 0x28, 0xFF, 0x9F, 0xF3, 0x9A, 0xFD, 0x5E, 0xF8, 0xC3, 0x01, + 0xB5, 0xF7, 0x29, 0xFC, 0x05, 0xF9, 0xE6, 0xF1, 0xBC, 0xF9, 0x43, 0xEE, + 0x94, 0xEA, 0xD1, 0xEB, 0x82, 0xE0, 0x3D, 0xEE, 0x8D, 0xF1, 0xA2, 0xFA, + 0x8B, 0x01, 0x69, 0x04, 0x7E, 0x06, 0x0A, 0x0C, 0xF0, 0x07, 0x5D, 0x0C, + 0x2A, 0x0F, 0xD6, 0x0D, 0xFC, 0x08, 0x49, 0x08, 0x45, 0x03, 0xB8, 0x03, + 0xB1, 0x06, 0xE1, 0x06, 0x0B, 0xF7, 0x3D, 0xF7, 0x48, 0xF6, 0xE5, 0xEA, + 0xB5, 0x01, 0xE9, 0xE4, 0x1A, 0xFE, 0x9C, 0xE5, 0x92, 0xF5, 0x71, 0xEF, + 0x80, 0xF4, 0x4D, 0xEF, 0x10, 0x05, 0x55, 0xF1, 0xBC, 0x0B, 0xE2, 0xF6, + 0x29, 0x06, 0xAA, 0xF8, 0x3F, 0x0C, 0xC3, 0xFC, 0x80, 0x07, 0x9E, 0xF9, + 0x0C, 0xFE, 0x46, 0xFA, 0x92, 0xFD, 0xDE, 0x03, 0x8E, 0xF8, 0x98, 0x0A, + 0xD4, 0xF8, 0xE2, 0x11, 0x78, 0xF3, 0xD4, 0x07, 0x19, 0xEF, 0x24, 0x03, + 0x65, 0xE9, 0xBD, 0x06, 0x5F, 0xE4, 0x9E, 0x03, 0x44, 0xF6, 0x5C, 0x09, + 0x88, 0x05, 0xE6, 0x0D, 0xFD, 0x07, 0x07, 0x11, 0xF5, 0xFD, 0xE1, 0x08, + 0x40, 0xF8, 0x16, 0xF8, 0x96, 0x05, 0xB6, 0xEE, 0xCA, 0x02, 0x7F, 0xDD, + 0x53, 0xFC, 0xED, 0xDC, 0x30, 0xFD, 0xF8, 0xEA, 0x61, 0xFF, 0x31, 0xF5, + 0xE4, 0x04, 0x5F, 0x00, 0xEA, 0xFB, 0x63, 0x04, 0x91, 0xF9, 0x63, 0x0C, + 0x20, 0xFD, 0xCE, 0x0D, 0x30, 0x12, 0xAC, 0x19, 0xD8, 0x19, 0xA2, 0x1C, + 0x65, 0x12, 0x3D, 0x1B, 0x3B, 0x12, 0x98, 0x20, 0xAD, 0x09, 0x12, 0x18, + 0xFE, 0x14, 0x4B, 0x27, 0xC4, 0x18, 0xD6, 0x2D, 0x7D, 0x05, 0xED, 0x1A, + 0x47, 0x09, 0xD6, 0x19, 0x9D, 0x17, 0xA8, 0x17, 0x40, 0x18, 0x02, 0x10, + 0x77, 0x19, 0x6A, 0x18, 0x06, 0x07, 0x89, 0x0E, 0x03, 0x0C, 0x5B, 0x0C, + 0x8F, 0x24, 0x7A, 0x10, 0xD9, 0x25, 0x86, 0x05, 0xEE, 0x2B, 0x22, 0x0B, + 0x70, 0x1F, 0x62, 0x01, 0xEA, 0x18, 0x22, 0xFD, 0x40, 0x1E, 0x4F, 0x09, + 0x7A, 0x18, 0xA9, 0x10, 0x8C, 0x21, 0x67, 0x24, 0x62, 0x1F, 0x08, 0x29, + 0xFC, 0x29, 0x28, 0x30, 0x2C, 0x2F, 0x96, 0x30, 0x35, 0x17, 0xD9, 0x17, + 0xEB, 0x15, 0x7F, 0x07, 0x5E, 0x13, 0xC4, 0xF7, 0x55, 0x14, 0xBB, 0xFB, + 0x23, 0x18, 0xE6, 0x09, 0x1B, 0x0A, 0xDE, 0x08, 0x07, 0x16, 0xFE, 0x1B, + 0x61, 0x29, 0x6D, 0x35, 0x3F, 0x16, 0x6A, 0x2E, 0xA4, 0x07, 0xC4, 0x20, + 0xE5, 0xF7, 0x62, 0x15, 0x13, 0xE9, 0x7B, 0x12, 0x3E, 0xE8, 0x74, 0x18, + 0xEB, 0xF2, 0x1B, 0x21, 0x23, 0x05, 0x8D, 0x22, 0x10, 0x11, 0x8F, 0x1C, + 0x16, 0x1F, 0xB7, 0x1D, 0xEF, 0x0F, 0xE5, 0x09, 0x15, 0x04, 0x25, 0xF4, + 0x21, 0x10, 0xF1, 0xF2, 0xE8, 0x11, 0x25, 0xF6, 0x76, 0x0E, 0x2F, 0xF6, + 0x56, 0x02, 0xD0, 0xF1, 0x39, 0xFB, 0x40, 0xF5, 0x6B, 0xF6, 0x4D, 0xF5, + 0x4B, 0xE7, 0x9A, 0xEE, 0x4B, 0xF2, 0x49, 0xF6, 0xA1, 0x06, 0x8A, 0x02, + 0x36, 0x0F, 0x90, 0x09, 0x5B, 0x17, 0x2C, 0x0F, 0xD9, 0x16, 0xD9, 0x10, + 0x08, 0x0D, 0x01, 0x0E, 0x4D, 0x0C, 0x72, 0x0E, 0x9B, 0x03, 0x4E, 0x0E, + 0xD8, 0xF8, 0x8C, 0x10, 0x79, 0xF3, 0xD2, 0x0F, 0x01, 0xF2, 0xC0, 0x0A, + 0x6D, 0xF8, 0x16, 0x07, 0x60, 0xF2, 0x9A, 0x02, 0xE6, 0xF2, 0xD8, 0xFE, + 0x95, 0xFD, 0x54, 0xFA, 0xFF, 0x04, 0x27, 0xFD, 0xE6, 0x05, 0xBF, 0x01, + 0xDE, 0x0B, 0xCE, 0x00, 0x2C, 0x11, 0xBE, 0xF7, 0x10, 0x0B, 0xD4, 0xF4, + 0xBF, 0x0B, 0xA9, 0xFF, 0xB3, 0x07, 0xE6, 0x0A, 0x0A, 0xF1, 0xA7, 0x09, + 0x88, 0xF0, 0xC9, 0x10, 0x9E, 0xFF, 0x2C, 0x19, 0x8A, 0x07, 0x55, 0x18, + 0xC9, 0x0D, 0x26, 0x1D, 0xD5, 0x0C, 0xC3, 0x14, 0x3D, 0x19, 0x24, 0x0E, + 0xFF, 0x1B, 0x7F, 0x05, 0xA8, 0x0D, 0xB4, 0x05, 0x5A, 0x03, 0x68, 0x10, + 0x65, 0x03, 0x86, 0x07, 0x06, 0x03, 0x85, 0xFF, 0xBA, 0x05, 0x34, 0x06, + 0x6E, 0x05, 0xE5, 0xFF, 0x1F, 0xEE, 0x8D, 0xEF, 0x77, 0xE0, 0xF8, 0xF0, + 0x3E, 0xDE, 0xBF, 0xF4, 0x8D, 0xDD, 0x88, 0xF9, 0xB1, 0xED, 0xB2, 0x00, + 0x48, 0x09, 0xC9, 0x0B, 0xC0, 0x16, 0x5B, 0x12, 0x19, 0x20, 0xC8, 0x08, + 0xEC, 0x1A, 0xCF, 0xFD, 0x8E, 0x09, 0x7E, 0xF7, 0xE5, 0x00, 0x49, 0xF4, + 0xB2, 0xFD, 0x7E, 0xF6, 0x86, 0x04, 0xAB, 0xFA, 0xA8, 0x03, 0x08, 0x02, + 0xED, 0xFA, 0x42, 0x06, 0x25, 0xFE, 0xE2, 0x08, 0x84, 0xF9, 0xF8, 0x04, + 0x3E, 0xF4, 0xF1, 0xF5, 0xB7, 0xFD, 0x9E, 0xEB, 0xBB, 0x06, 0xF1, 0xEE, + 0xDC, 0x0C, 0xFB, 0xF9, 0x8B, 0x0C, 0xA2, 0x07, 0x6A, 0x11, 0xB3, 0x10, + 0x5B, 0x1C, 0x3D, 0x0C, 0x56, 0x17, 0xA1, 0x0D, 0xE0, 0xF7, 0xD0, 0x0B, + 0x3C, 0xED, 0xF7, 0x11, 0x49, 0xEF, 0x46, 0x11, 0xBF, 0xF6, 0xEA, 0x05, + 0x52, 0x09, 0x64, 0x0A, 0x33, 0x0A, 0xCA, 0x0B, 0x2F, 0x07, 0xA1, 0x0D, + 0x1F, 0x0A, 0xDB, 0x11, 0x85, 0x0F, 0x64, 0x0E, 0x73, 0x07, 0x70, 0x0B, + 0x56, 0x0B, 0x6C, 0x0F, 0x93, 0x16, 0xD9, 0xFD, 0x08, 0x18, 0x84, 0x04, + 0x99, 0x14, 0x02, 0x1F, 0x8E, 0x1B, 0x09, 0x1A, 0x7B, 0x20, 0x3D, 0x12, + 0x76, 0x1C, 0xAE, 0x15, 0xE7, 0x12, 0x7F, 0x0A, 0xA9, 0x06, 0x64, 0x0B, + 0x9B, 0x0E, 0x46, 0x24, 0xF1, 0x1C, 0xAE, 0x22, 0x64, 0x22, 0x15, 0x14, + 0x17, 0x1A, 0x0B, 0x1C, 0xC7, 0x15, 0x6F, 0x23, 0x8D, 0x13, 0x94, 0x0F, + 0xA8, 0x08, 0x58, 0x0A, 0x00, 0xFE, 0xE5, 0x0D, 0xB4, 0xFA, 0x68, 0x00, + 0x2A, 0xEC, 0x32, 0xFA, 0xFF, 0xFB, 0xD2, 0x05, 0x36, 0x11, 0xD9, 0x06, + 0x9C, 0x02, 0x81, 0x10, 0x40, 0x0B, 0x59, 0x1C, 0x14, 0x18, 0xD2, 0x09, + 0xDF, 0x07, 0x9D, 0xF9, 0x32, 0x09, 0x31, 0xF2, 0x85, 0x08, 0x53, 0xEA, + 0x0F, 0xED, 0xF2, 0xE6, 0x59, 0xF5, 0xE1, 0xED, 0x73, 0xF6, 0x9F, 0xF9, + 0x5B, 0xE1, 0xE3, 0x0B, 0x4C, 0xE6, 0x99, 0x0F, 0x8C, 0xE8, 0xED, 0x08, + 0x72, 0xD5, 0x91, 0xFE, 0x29, 0xDC, 0x24, 0xE8, 0xC9, 0xEA, 0xDB, 0xD7, + 0xCC, 0xE7, 0x27, 0xDC, 0x74, 0xF3, 0xBE, 0xE0, 0x4D, 0xF9, 0x15, 0xE3, + 0x28, 0xE6, 0x0D, 0xF9, 0xC9, 0xDE, 0xCC, 0xF4, 0x58, 0xE0, 0x5B, 0xCA, + 0xB6, 0xCE, 0xDE, 0xBC, 0xE2, 0xC5, 0x32, 0xC2, 0x40, 0xCD, 0x41, 0xBB, + 0xCA, 0xD2, 0x48, 0xCC, 0xB2, 0xD2, 0xF6, 0xDB, 0x98, 0xD3, 0x4B, 0xE0, + 0x9A, 0xCE, 0xA5, 0xE9, 0xD9, 0xCF, 0x5B, 0xDF, 0x2A, 0xE3, 0xA5, 0xD3, + 0x0B, 0xF2, 0x2B, 0xD4, 0xEF, 0xEC, 0x0B, 0xC2, 0x1B, 0xF0, 0xF8, 0xC3, + 0xA4, 0xF3, 0x9F, 0xE0, 0x07, 0xE7, 0x15, 0xF3, 0x95, 0xE1, 0x0C, 0x02, + 0x3F, 0xE4, 0xBF, 0x06, 0xA5, 0xEB, 0x9E, 0xF7, 0x17, 0xF6, 0x6A, 0xE2, + 0x39, 0xFB, 0xD4, 0xD8, 0x8D, 0xFB, 0x11, 0xDE, 0x31, 0xFA, 0x0A, 0xE8, + 0x87, 0xF5, 0x92, 0xF5, 0x59, 0xF9, 0xA6, 0xFB, 0x21, 0xF4, 0x96, 0xEC, + 0xB4, 0xEB, 0x8F, 0xEF, 0x7D, 0xF3, 0xF2, 0xF6, 0x07, 0xFC, 0xA9, 0xEB, + 0xC9, 0xF7, 0xED, 0xF3, 0x09, 0xED, 0x3D, 0x06, 0x7B, 0xE5, 0xF6, 0x07, + 0x1B, 0xEE, 0x1D, 0x07, 0xFD, 0xF7, 0x6F, 0x05, 0xCA, 0xE2, 0x00, 0xFB, + 0x4E, 0xD4, 0xCE, 0xED, 0x43, 0xE6, 0x5F, 0xE2, 0x41, 0xF7, 0x92, 0xDB, + 0x61, 0xFA, 0xA1, 0xDC, 0x4F, 0xFB, 0x4E, 0xF2, 0x4D, 0xEF, 0x09, 0x03, + 0x75, 0xE6, 0xE7, 0x06, 0xF9, 0xED, 0x37, 0x12, 0x6E, 0xFB, 0xE1, 0x08, + 0xF5, 0x11, 0x7D, 0xF7, 0x80, 0x20, 0x70, 0x00, 0xEF, 0x14, 0x6B, 0x06, + 0xC1, 0x08, 0x24, 0x10, 0x8F, 0x09, 0xE9, 0x1C, 0x78, 0x11, 0x4E, 0x12, + 0x01, 0x24, 0x41, 0x18, 0x5F, 0x35, 0x30, 0x2B, 0x6C, 0x3C, 0xAA, 0x27, + 0x52, 0x35, 0x31, 0x27, 0xCC, 0x28, 0xDD, 0x30, 0x40, 0x1B, 0x36, 0x2B, + 0xA9, 0x12, 0x69, 0x21, 0x28, 0x18, 0xA2, 0x1F, 0x4D, 0x30, 0x2A, 0x2F, + 0x6D, 0x3F, 0xC7, 0x36, 0xAF, 0x42, 0x68, 0x26, 0x00, 0x4A, 0x8A, 0x1B, + 0xE4, 0x39, 0x0A, 0x0E, 0x0C, 0x22, 0x3F, 0x06, 0xDD, 0x1D, 0x19, 0x16, + 0x3F, 0x15, 0x0C, 0x24, 0xC3, 0xFB, 0xA9, 0x25, 0x14, 0xFD, 0x6B, 0x26, + 0x14, 0x17, 0x63, 0x18, 0xA9, 0x15, 0xE1, 0xFF, 0xA3, 0x01, 0xDA, 0xF0, + 0xE5, 0xFE, 0xA8, 0xEB, 0x19, 0xFA, 0xB0, 0xEB, 0xE0, 0xF3, 0xC6, 0xF2, + 0xB1, 0xF9, 0xB0, 0xFA, 0xF4, 0xF5, 0xE3, 0xFE, 0x3F, 0xFD, 0xF1, 0x02, + 0x9A, 0x16, 0xB3, 0x00, 0xDD, 0x06, 0x01, 0x03, 0x8E, 0xED, 0x8C, 0x14, + 0xF5, 0x04, 0x83, 0x12, 0xFC, 0x0C, 0x07, 0x05, 0xC2, 0xF1, 0xE8, 0x07, + 0xE0, 0xF4, 0x32, 0x06, 0xEC, 0x10, 0x40, 0x05, 0xB7, 0x14, 0x12, 0xFF, + 0xF9, 0x16, 0xDC, 0xEF, 0xF4, 0x10, 0xC2, 0xED, 0xF5, 0x09, 0x25, 0xFE, + 0xDD, 0x13, 0x0D, 0x01, 0xE3, 0x13, 0x04, 0x0A, 0x15, 0x09, 0xA5, 0x1E, + 0xB1, 0x09, 0x82, 0x18, 0x64, 0x0D, 0x47, 0x1A, 0x2E, 0x03, 0x51, 0x23, + 0xBE, 0x06, 0xEC, 0x19, 0x6A, 0x0F, 0x9E, 0x0D, 0xE4, 0x0C, 0xF1, 0xFF, + 0x71, 0x09, 0x9D, 0xF4, 0x33, 0xFC, 0x39, 0xFE, 0x61, 0xE8, 0x50, 0x03, + 0x5F, 0xE7, 0xD5, 0xEF, 0x62, 0xE0, 0xEF, 0xE1, 0xB8, 0xD1, 0x9E, 0xD9, + 0x1C, 0xE2, 0xF6, 0xC8, 0x57, 0xEE, 0x14, 0xCF, 0x92, 0xD6, 0x09, 0xDF, + 0x68, 0xC8, 0xA2, 0xCA, 0x30, 0xCF, 0x44, 0xB3, 0xAB, 0xD0, 0xB8, 0xB9, + 0xBB, 0xCB, 0xF4, 0xBF, 0xC0, 0xD7, 0x23, 0xD1, 0x3B, 0xE7, 0x91, 0xE4, + 0x02, 0xEC, 0x03, 0xE4, 0x98, 0xE6, 0xC5, 0xE9, 0xE5, 0xDE, 0xD7, 0xEE, + 0x66, 0xE1, 0x0E, 0xD9, 0xD7, 0xDB, 0x34, 0xCB, 0x6F, 0xE1, 0x2D, 0xE2, + 0xB5, 0xF1, 0x16, 0xEC, 0x11, 0xF5, 0x22, 0xE2, 0x94, 0xF3, 0x07, 0xDB, + 0xA6, 0xEC, 0xB0, 0xD5, 0xC8, 0xD9, 0x0B, 0xCC, 0x35, 0xD3, 0x8C, 0xC6, + 0x56, 0xDA, 0xE8, 0xCE, 0xA5, 0xDC, 0x0C, 0xDA, 0x66, 0xE2, 0x10, 0xE4, + 0xA3, 0xE8, 0xAB, 0xEA, 0x6A, 0xDE, 0xDA, 0xE8, 0x5B, 0xCC, 0x4C, 0xEC, + 0x73, 0xCD, 0xC1, 0xF3, 0x3E, 0xD3, 0x2F, 0xEB, 0x10, 0xCF, 0xF3, 0xDA, + 0x7C, 0xCD, 0xDF, 0xCB, 0x33, 0xD1, 0xC0, 0xC1, 0xDF, 0xCE, 0x4D, 0xBE, + 0x9A, 0xD2, 0x07, 0xC0, 0x0D, 0xCE, 0x02, 0xB3, 0x47, 0xB6, 0xEB, 0x9A, + 0xC2, 0xB2, 0x41, 0x9F, 0x93, 0xC0, 0x85, 0xAE, 0x40, 0xBE, 0x5D, 0xB2, + 0x2F, 0xB8, 0xBF, 0xBC, 0x58, 0xC4, 0xAE, 0xCA, 0x5A, 0xC9, 0xF3, 0xD1, + 0x1B, 0xCE, 0x50, 0xDF, 0xB6, 0xDC, 0x6B, 0xED, 0x95, 0xDF, 0xDA, 0xEF, + 0x2E, 0xEC, 0x4A, 0xFA, 0x61, 0xFB, 0x11, 0x0E, 0x94, 0xF8, 0xC0, 0x15, + 0x2B, 0xFA, 0x88, 0x14, 0xA8, 0xFC, 0x8E, 0x1A, 0xDA, 0xF8, 0x91, 0x1B, + 0x94, 0xF5, 0x84, 0x14, 0xA6, 0xEF, 0x42, 0x07, 0xF2, 0x03, 0xD4, 0x01, + 0xEA, 0x25, 0xBD, 0x08, 0x53, 0x2B, 0xC2, 0x0C, 0xB5, 0x27, 0xA9, 0x19, + 0x8C, 0x21, 0xD6, 0x25, 0x68, 0x1C, 0x3A, 0x2A, 0x24, 0x2E, 0x3F, 0x2C, + 0x2E, 0x40, 0x3E, 0x24, 0xD9, 0x38, 0x57, 0x20, 0x11, 0x31, 0x29, 0x31, + 0xB4, 0x32, 0x4A, 0x47, 0x78, 0x2D, 0x96, 0x4C, 0x2B, 0x31, 0x37, 0x4C, + 0x2B, 0x2E, 0x99, 0x43, 0x61, 0x1E, 0xA1, 0x35, 0x45, 0x28, 0xEF, 0x39, + 0x83, 0x2E, 0x64, 0x2A, 0xD9, 0x2A, 0x79, 0x0D, 0x13, 0x2B, 0xBB, 0x02, + 0xB0, 0x1B, 0x47, 0x00, 0x26, 0x07, 0xC0, 0xFB, 0x25, 0x00, 0x6A, 0xF5, + 0x27, 0xFF, 0xE3, 0x06, 0x1D, 0x0E, 0xCB, 0x19, 0x3C, 0x30, 0x88, 0x18, + 0x6F, 0x44, 0x45, 0x2D, 0xEE, 0x48, 0xFD, 0x46, 0xC4, 0x4E, 0xB6, 0x4C, + 0x6E, 0x48, 0xDF, 0x59, 0x4F, 0x35, 0xD0, 0x57, 0x27, 0x29, 0x50, 0x41, + 0xE7, 0x25, 0xC1, 0x3E, 0xB0, 0x32, 0xCE, 0x3E, 0x0C, 0x45, 0xB1, 0x22, + 0xBE, 0x45, 0x15, 0x13, 0x96, 0x48, 0x5C, 0x23, 0xCC, 0x43, 0xB9, 0x25, + 0xF7, 0x30, 0x15, 0x2B, 0xE7, 0x31, 0xF5, 0x36, 0x36, 0x3E, 0xD8, 0x2C, + 0x87, 0x3C, 0x71, 0x26, 0x73, 0x37, 0x4D, 0x2B, 0x1F, 0x40, 0x1C, 0x2F, + 0x66, 0x3C, 0xAA, 0x2F, 0x72, 0x27, 0x0A, 0x2B, 0xEB, 0x23, 0x94, 0x37, + 0xD7, 0x15, 0xD7, 0x46, 0x05, 0x01, 0x3E, 0x36, 0x6C, 0xFF, 0x84, 0x12, + 0xCC, 0xFC, 0x04, 0x05, 0x1E, 0xF8, 0xED, 0xFC, 0x93, 0xED, 0xFF, 0xE6, + 0x6A, 0xDB, 0x47, 0xE8, 0x62, 0xCF, 0x5E, 0xE4, 0x22, 0xCE, 0x53, 0xCE, + 0xBC, 0xCA, 0x4B, 0xC7, 0x90, 0xD4, 0x35, 0xC6, 0x94, 0xE7, 0x82, 0xBF, + 0x93, 0xE2, 0x57, 0xCA, 0xF5, 0xDF, 0xF8, 0xD9, 0x92, 0xF5, 0x84, 0xDA, + 0x1F, 0xF4, 0xD8, 0xDC, 0xFA, 0xE6, 0x11, 0xF8, 0xD4, 0xE3, 0x84, 0x16, + 0xA2, 0xDB, 0x6D, 0x18, 0x49, 0xE4, 0xB0, 0x07, 0x10, 0xF2, 0x2D, 0xFC, + 0x02, 0xEF, 0xAB, 0x01, 0xC2, 0xF0, 0xF1, 0x07, 0x8A, 0xF8, 0x33, 0x08, + 0x09, 0xF9, 0x92, 0x09, 0xAF, 0xFC, 0x9A, 0x0A, 0x5C, 0xFE, 0xAF, 0x03, + 0x24, 0xFA, 0x9E, 0xFD, 0xB2, 0xFA, 0x6A, 0xFD, 0x72, 0x08, 0x25, 0x05, + 0x45, 0x0C, 0xD1, 0x08, 0x59, 0x0A, 0x41, 0x0C, 0xA7, 0x04, 0x57, 0x09, + 0xFE, 0xF7, 0x73, 0x04, 0xBD, 0xFE, 0x37, 0x01, 0xB1, 0x0B, 0x0E, 0xFB, + 0xAA, 0x02, 0x65, 0xF7, 0x55, 0xF8, 0xF0, 0xE9, 0x33, 0xF7, 0x3D, 0xDB, + 0xC4, 0xEC, 0x4C, 0xCD, 0xD9, 0xD6, 0x77, 0xC2, 0xD7, 0xC8, 0x21, 0xC6, + 0x8B, 0xD6, 0x3E, 0xCA, 0x3F, 0xD2, 0xA5, 0xC1, 0xC1, 0xC0, 0xCA, 0xBC, + 0x39, 0xCF, 0x0B, 0xBE, 0x84, 0xDE, 0x47, 0xC0, 0xAA, 0xE2, 0x5F, 0xC6, + 0xF7, 0xF4, 0xE8, 0xE1, 0x42, 0x0C, 0x11, 0xFD, 0xE1, 0x17, 0x99, 0xFE, + 0x3C, 0x12, 0x43, 0x00, 0x95, 0x01, 0x66, 0x0A, 0x9E, 0xF0, 0xF6, 0x15, + 0xAF, 0xF0, 0x07, 0x19, 0xE9, 0xFA, 0x26, 0x0C, 0x87, 0xF3, 0x74, 0x08, + 0x8A, 0xEC, 0x73, 0x11, 0xE8, 0xF8, 0xDE, 0x07, 0x44, 0x0B, 0x70, 0xFD, + 0x45, 0x13, 0xD2, 0x08, 0xA3, 0x10, 0x80, 0x11, 0xED, 0x10, 0x25, 0x0E, + 0x6B, 0x19, 0xEF, 0x0D, 0x68, 0x22, 0x6C, 0x12, 0xA7, 0x25, 0xAB, 0x16, + 0x3E, 0x2A, 0xAD, 0x16, 0x2B, 0x33, 0x53, 0x22, 0x17, 0x2E, 0x5F, 0x2D, + 0xD3, 0x2B, 0x99, 0x2B, 0x5A, 0x2B, 0xB5, 0x2A, 0x8C, 0x0E, 0x21, 0x1F, + 0xDC, 0xE8, 0xE3, 0x0D, 0x80, 0xDA, 0xA9, 0x09, 0xF0, 0xE1, 0x3E, 0xFE, + 0x74, 0xF0, 0xB6, 0xE8, 0x90, 0xF2, 0x45, 0xE6, 0x08, 0xE3, 0xAD, 0xEF, + 0x24, 0xDC, 0x28, 0xF5, 0x86, 0xD9, 0xCA, 0x04, 0x1D, 0xD3, 0xFA, 0x16, + 0x9E, 0xE1, 0x3A, 0x0D, 0xFE, 0xF9, 0x14, 0x05, 0x05, 0x03, 0x6A, 0x11, + 0x02, 0x16, 0xA8, 0x1A, 0x79, 0x29, 0x86, 0x1C, 0xCF, 0x29, 0x01, 0x21, + 0xC7, 0x2B, 0x11, 0x1C, 0x2D, 0x21, 0x47, 0x0B, 0xE8, 0x08, 0xE1, 0x05, + 0x14, 0x10, 0xDB, 0x00, 0xF7, 0x1C, 0x52, 0xF3, 0x2C, 0x1A, 0x8A, 0xFF, + 0x35, 0x1D, 0x7E, 0x13, 0xE2, 0x17, 0x2F, 0x1D, 0x90, 0x0C, 0x42, 0x29, + 0x29, 0x0D, 0x16, 0x1F, 0x49, 0x1B, 0x8C, 0x11, 0xB1, 0x2A, 0x57, 0x17, + 0xDB, 0x31, 0x22, 0x1B, 0x74, 0x35, 0xD0, 0x20, 0xD8, 0x42, 0x2F, 0x3A, + 0xBE, 0x47, 0x8F, 0x3F, 0x70, 0x36, 0xE8, 0x2F, 0xD8, 0x1D, 0xB2, 0x33, + 0xCD, 0x01, 0x87, 0x2C, 0x31, 0xEE, 0x78, 0x13, 0xBE, 0xF2, 0x99, 0xFA, + 0x94, 0x00, 0x2E, 0xD4, 0x2E, 0xF8, 0xCE, 0xBB, 0xE3, 0xE6, 0x09, 0xCA, + 0x60, 0xEB, 0xF8, 0xD0, 0xD0, 0xE8, 0x0F, 0xC9, 0x02, 0xDE, 0x1F, 0xD3, + 0x42, 0xEA, 0x67, 0xD6, 0x7B, 0xF9, 0x98, 0xD7, 0x1A, 0xF6, 0xC4, 0xDF, + 0x53, 0x04, 0x42, 0xE9, 0x82, 0x19, 0x6F, 0x07, 0x57, 0x18, 0x15, 0x29, + 0x67, 0x17, 0x16, 0x3A, 0x72, 0x13, 0x3C, 0x3B, 0x49, 0x09, 0xD4, 0x23, + 0x98, 0x05, 0x3D, 0xFD, 0x59, 0x09, 0x28, 0xE7, 0xB2, 0x01, 0x32, 0xE1, + 0x99, 0xF1, 0xEF, 0xE8, 0xD7, 0xE7, 0x84, 0xF6, 0x2E, 0xEB, 0x9B, 0xF8, + 0xBA, 0xEF, 0x1A, 0xF7, 0xD2, 0xEA, 0x09, 0xFF, 0x05, 0xED, 0x25, 0x10, + 0xEB, 0xF9, 0xD5, 0x1E, 0xE5, 0xFD, 0x10, 0x1B, 0xD4, 0xFE, 0xCF, 0x0E, + 0x54, 0x09, 0x4B, 0x0D, 0x64, 0x03, 0x33, 0x0F, 0x6E, 0xF3, 0x03, 0x0C, + 0xDF, 0xF2, 0x71, 0x03, 0x57, 0xE9, 0x9F, 0xF0, 0x7C, 0xD7, 0x35, 0xD0, + 0xBB, 0xCE, 0x4C, 0xBD, 0xF9, 0xBC, 0x82, 0xC1, 0x0A, 0xB0, 0xAA, 0xBC, + 0x52, 0xA9, 0xFE, 0xAE, 0x65, 0xB3, 0x81, 0xB1, 0x69, 0xC7, 0xFF, 0xB4, + 0xED, 0xCD, 0x18, 0xB7, 0xAF, 0xDA, 0x94, 0xBD, 0xB7, 0xE1, 0x33, 0xC4, + 0xCF, 0xDB, 0xB8, 0xD0, 0xD5, 0xE2, 0x5F, 0xE2, 0x68, 0xF9, 0xEA, 0xF9, + 0xD3, 0x01, 0x98, 0x09, 0x1F, 0xFD, 0xE6, 0x16, 0x4D, 0x09, 0xAA, 0x1E, + 0x29, 0x17, 0x9A, 0x11, 0x2A, 0x0B, 0xD8, 0x05, 0x34, 0x02, 0xFE, 0x03, + 0xD6, 0x00, 0x20, 0xFB, 0x50, 0xF3, 0xAE, 0xE6, 0x6B, 0xF6, 0x9A, 0xE3, + 0x85, 0x06, 0x5A, 0xF3, 0x36, 0x0A, 0x05, 0xF9, 0x3B, 0x18, 0xB6, 0xEF, + 0x74, 0x32, 0x06, 0xEE, 0xF6, 0x2C, 0xDE, 0xFA, 0x49, 0x17, 0x13, 0x05, + 0x9B, 0x15, 0x72, 0x0D, 0xAC, 0x1C, 0xFA, 0x16, 0x43, 0x21, 0x13, 0x1F, + 0x7A, 0x20, 0xA5, 0x24, 0xAD, 0x22, 0x50, 0x26, 0x36, 0x1D, 0x63, 0x1B, + 0x2A, 0x05, 0xB3, 0x09, 0x04, 0xF1, 0x8F, 0xF8, 0xB8, 0xE3, 0xBE, 0xE6, + 0x51, 0xD3, 0x71, 0xDA, 0x2C, 0xD7, 0xE0, 0xD7, 0xAC, 0xEE, 0x93, 0xD2, + 0xE9, 0xF5, 0x34, 0xD0, 0x3B, 0xF0, 0x1E, 0xDA, 0xA2, 0xF1, 0xB6, 0xEE, + 0x64, 0xEA, 0x61, 0x00, 0x69, 0xEA, 0xA2, 0xFE, 0xCD, 0x08, 0xCB, 0x0E, + 0x28, 0x16, 0x58, 0x2D, 0x26, 0x14, 0x42, 0x36, 0x99, 0x26, 0x84, 0x32, + 0xD5, 0x30, 0xF8, 0x39, 0x79, 0x29, 0x43, 0x3D, 0x0A, 0x21, 0x40, 0x22, + 0x75, 0x0B, 0xB1, 0x11, 0x87, 0xEF, 0x3E, 0x11, 0xC8, 0xE2, 0x4C, 0xFB, + 0x42, 0xE1, 0x41, 0xEF, 0x1D, 0xEC, 0x5F, 0xF2, 0x96, 0xF7, 0x4F, 0xF3, + 0xC1, 0xF7, 0xAC, 0x11, 0xEE, 0x02, 0xFC, 0x30, 0xD6, 0x17, 0x68, 0x2F, + 0x2D, 0x14, 0x9B, 0x22, 0x10, 0x0D, 0x94, 0x1F, 0x46, 0x16, 0xEE, 0x1A, + 0x79, 0x15, 0x0A, 0x11, 0x28, 0x1B, 0x79, 0x12, 0xBE, 0x15, 0x41, 0x09, + 0x70, 0xF4, 0x07, 0xFA, 0x84, 0xD6, 0x2C, 0xEA, 0x04, 0xC9, 0x8C, 0xD1, + 0x7B, 0xBF, 0x45, 0xBC, 0x6F, 0xC3, 0x0B, 0xB3, 0x74, 0xD3, 0x76, 0xA8, + 0x1D, 0xD2, 0xC3, 0xA8, 0x1E, 0xC6, 0x45, 0xB5, 0x7E, 0xCD, 0xE4, 0xBF, + 0xD2, 0xD4, 0x44, 0xCC, 0x74, 0xD7, 0x27, 0xCC, 0x0F, 0xE1, 0x46, 0xC4, + 0x33, 0xD9, 0x19, 0xCC, 0x2A, 0xEE, 0x8E, 0xE5, 0x0A, 0x14, 0xA6, 0xF3, + 0xED, 0x25, 0xFB, 0x01, 0xD1, 0x2D, 0x65, 0x13, 0x94, 0x2D, 0x6F, 0x25, + 0x36, 0x19, 0x8A, 0x25, 0x7F, 0xF5, 0xB2, 0x02, 0x66, 0xDD, 0x01, 0xD8, + 0x9A, 0xD3, 0xB2, 0xBB, 0x92, 0xDA, 0x0D, 0xB7, 0xA2, 0xE3, 0xF0, 0xC0, + 0x63, 0xEB, 0xCD, 0xD6, 0x78, 0xF7, 0x4A, 0xE9, 0xB4, 0x03, 0x63, 0xFB, + 0x36, 0xFF, 0x65, 0x11, 0x10, 0xF9, 0x6E, 0x1D, 0x18, 0xFB, 0xC2, 0x19, + 0x74, 0x04, 0x9F, 0x1E, 0x80, 0x0A, 0x9D, 0x1E, 0x1B, 0x0C, 0x8B, 0x18, + 0x77, 0x00, 0x73, 0x18, 0xA7, 0xF3, 0x2F, 0x11, 0x60, 0xF1, 0x79, 0x05, + 0xD8, 0xDD, 0x23, 0xEA, 0xCD, 0xD5, 0x1D, 0xC4, 0x55, 0xDA, 0x43, 0xB3, + 0x35, 0xD8, 0x32, 0xC0, 0xD2, 0xCA, 0x6D, 0xC2, 0x99, 0xC7, 0xB0, 0xBC, + 0x0F, 0xD6, 0x74, 0xC9, 0xDB, 0xDA, 0xC4, 0xE3, 0x34, 0xDB, 0x6B, 0xFD, + 0xCF, 0xEA, 0xE4, 0x0B, 0x33, 0x00, 0x2E, 0x06, 0x79, 0x12, 0x2D, 0x04, + 0x53, 0x23, 0x94, 0x1A, 0x91, 0x30, 0xB8, 0x32, 0xD4, 0x3C, 0x48, 0x45, + 0x35, 0x45, 0x9E, 0x47, 0x85, 0x41, 0xAD, 0x37, 0x26, 0x1C, 0xB5, 0x19, + 0x92, 0xF9, 0xED, 0xFB, 0xFA, 0xF4, 0x5E, 0xEF, 0xDE, 0xEF, 0x17, 0xF0, + 0x6A, 0xEB, 0x6A, 0xFD, 0x18, 0xFF, 0x5C, 0x10, 0x0A, 0x19, 0x7F, 0x1F, + 0xB0, 0x1E, 0x27, 0x23, 0xA6, 0x27, 0xF1, 0x22, 0xBD, 0x36, 0xAC, 0x2C, + 0xCE, 0x3A, 0x88, 0x34, 0x85, 0x42, 0xE9, 0x3F, 0x6A, 0x41, 0x3B, 0x4E, + 0x05, 0x29, 0x5B, 0x4D, 0x85, 0x14, 0x12, 0x44, 0x1D, 0x09, 0xB6, 0x37, + 0x76, 0x08, 0x5D, 0x2E, 0x10, 0x0F, 0xE5, 0x1E, 0x21, 0x0E, 0x9B, 0xFB, + 0x01, 0x0B, 0x08, 0xDC, 0x2A, 0xFF, 0x42, 0xCF, 0xD5, 0xEF, 0x78, 0xD0, + 0xF1, 0xF0, 0x31, 0xD2, 0xEE, 0xF5, 0x4E, 0xDD, 0xA4, 0xFE, 0x9F, 0xF3, + 0xE0, 0x13, 0x7C, 0xFB, 0x71, 0x17, 0x71, 0x00, 0xF7, 0x07, 0x11, 0x07, + 0xFE, 0x0B, 0x41, 0x0C, 0x49, 0x24, 0x1C, 0x19, 0x89, 0x31, 0x28, 0x29, + 0xA5, 0x2E, 0x2A, 0x31, 0xD3, 0x2A, 0xA8, 0x35, 0x2B, 0x25, 0xF4, 0x2B, + 0xDB, 0x1E, 0x5E, 0x05, 0x6A, 0x07, 0xDE, 0xE3, 0xD7, 0xD6, 0xAB, 0xDF, + 0xD9, 0xC5, 0x83, 0xE0, 0x21, 0xDC, 0xDB, 0xDD, 0x25, 0xEF, 0x09, 0xF0, + 0x73, 0xFE, 0xC8, 0x03, 0x3D, 0x15, 0x13, 0x15, 0xAF, 0x2C, 0x22, 0x33, + 0x2F, 0x3D, 0xC2, 0x3C, 0x3A, 0x41, 0xE7, 0x30, 0x04, 0x38, 0x74, 0x27, + 0xCB, 0x2D, 0xF9, 0x18, 0xF8, 0x0C, 0x80, 0x0E, 0x44, 0xE9, 0x79, 0x15, + 0x07, 0xF4, 0x45, 0x17, 0x72, 0x0B, 0x77, 0x0C, 0x17, 0x03, 0x0D, 0x01, + 0x45, 0xE8, 0x6E, 0xF7, 0x5C, 0xCD, 0x64, 0xE6, 0x66, 0xBB, 0x64, 0xDB, + 0x80, 0xC1, 0x04, 0xDB, 0x56, 0xCF, 0x53, 0xD7, 0xC2, 0xD5, 0x80, 0xD5, + 0xE6, 0xEA, 0x5F, 0xDD, 0x9F, 0x02, 0x42, 0xF4, 0x44, 0xFD, 0x87, 0x03, + 0xA2, 0xFC, 0x4E, 0xFD, 0xCD, 0x02, 0xD6, 0xFC, 0xE1, 0xFA, 0xF4, 0x11, + 0x10, 0x00, 0xE1, 0x21, 0x1E, 0x13, 0x50, 0x23, 0x18, 0x1C, 0x75, 0x22, + 0x57, 0x13, 0x4B, 0x16, 0xE0, 0xF3, 0x4E, 0xFF, 0x8E, 0xCD, 0x1B, 0xE6, + 0xF0, 0xBF, 0xB4, 0xCA, 0x6A, 0xB7, 0xED, 0xB5, 0xDD, 0xB4, 0xD1, 0xB2, + 0x78, 0xCA, 0x00, 0xC0, 0xD9, 0xEF, 0x9B, 0xE4, 0xA1, 0x0E, 0xED, 0x08, + 0x39, 0x1F, 0xF1, 0x17, 0xA7, 0x20, 0xDD, 0x19, 0x28, 0x14, 0xDD, 0x16, + 0x11, 0x07, 0x00, 0x12, 0x56, 0xF8, 0xBD, 0x09, 0x41, 0xF4, 0xA9, 0xF1, + 0xD8, 0xFD, 0xC6, 0xCF, 0x2A, 0x05, 0xC8, 0xCF, 0x18, 0xFD, 0xDA, 0xE3, + 0x08, 0xE4, 0x33, 0xDF, 0x4A, 0xCD, 0x05, 0xCD, 0x5B, 0xBB, 0xDB, 0xC0, + 0x00, 0xA9, 0x6D, 0xB6, 0x38, 0xA9, 0x0A, 0xB1, 0x65, 0xAE, 0xC1, 0xBA, + 0xEF, 0xAF, 0x46, 0xC2, 0xCC, 0xC1, 0x18, 0xCA, 0xB2, 0xE0, 0x8A, 0xE1, + 0x0A, 0xFE, 0x76, 0xEA, 0x6D, 0x03, 0x6D, 0xEA, 0xE5, 0xFC, 0x78, 0xF7, + 0x5B, 0x04, 0x7F, 0xFD, 0xA7, 0x13, 0x9B, 0xF9, 0x79, 0x20, 0x48, 0x02, + 0x55, 0x23, 0x8C, 0x19, 0x8D, 0x1A, 0x2C, 0x27, 0x2A, 0x09, 0x04, 0x17, + 0x55, 0xEE, 0xDC, 0xF3, 0xFA, 0xCC, 0xD7, 0xD7, 0x7A, 0xC0, 0x05, 0xCC, + 0x98, 0xD5, 0xCD, 0xCF, 0x40, 0xEE, 0x73, 0xE5, 0x49, 0x02, 0xC8, 0xFD, + 0xEB, 0x1B, 0x84, 0x14, 0x36, 0x30, 0x50, 0x3A, 0x09, 0x38, 0x09, 0x54, + 0xA2, 0x42, 0x36, 0x53, 0x40, 0x4A, 0x1D, 0x46, 0x3F, 0x47, 0x42, 0x3D, + 0xB0, 0x3E, 0xD3, 0x2D, 0x0C, 0x30, 0x22, 0x20, 0xC5, 0x27, 0x05, 0x26, + 0x27, 0x31, 0x34, 0x27, 0xCD, 0x2A, 0x60, 0x1D, 0x1F, 0x11, 0x7B, 0x0E, + 0xC0, 0xFE, 0xC5, 0xFA, 0x41, 0xEF, 0x9F, 0xE9, 0x03, 0xEC, 0x8C, 0xF3, + 0xC0, 0xF3, 0xC3, 0x14, 0x2D, 0xF8, 0x91, 0x27, 0x4A, 0x09, 0x9A, 0x34, + 0xB3, 0x26, 0xAE, 0x54, 0x78, 0x2B, 0x2E, 0x5D, 0xA6, 0x25, 0x5E, 0x47, + 0x8C, 0x31, 0xC7, 0x40, 0x78, 0x43, 0x7A, 0x4C, 0x2F, 0x50, 0xEB, 0x53, + 0xF9, 0x54, 0x05, 0x53, 0xC5, 0x5B, 0xF9, 0x4E, 0xDE, 0x56, 0x96, 0x3F, + 0x58, 0x38, 0xAC, 0x32, 0x4F, 0x1E, 0x1E, 0x22, 0x1C, 0x15, 0x92, 0x00, + 0xEB, 0x08, 0x18, 0xED, 0x41, 0xFB, 0x8E, 0xF6, 0xD3, 0xFC, 0xFC, 0x03, + 0x7D, 0x11, 0xD3, 0x1B, 0xEF, 0x2D, 0x2E, 0x42, 0xBD, 0x4B, 0xD6, 0x56, + 0x77, 0x52, 0x97, 0x5A, 0x8B, 0x49, 0x2B, 0x52, 0xDA, 0x52, 0x62, 0x3D, + 0x44, 0x45, 0xEA, 0x26, 0xA6, 0x22, 0x53, 0x14, 0xCA, 0x10, 0xBA, 0x06, + 0x09, 0xFF, 0xF1, 0x00, 0x62, 0xFB, 0x19, 0x00, 0x99, 0x08, 0xEF, 0xEE, + 0x0C, 0x06, 0x91, 0xD8, 0xAB, 0xF3, 0xB2, 0xCD, 0xB6, 0xD7, 0xAE, 0xBD, + 0x06, 0xC7, 0x02, 0xBC, 0x15, 0xCE, 0x56, 0xC6, 0x92, 0xD5, 0x79, 0xBD, + 0x8D, 0xD7, 0xE1, 0xC1, 0x03, 0xE4, 0xDC, 0xE2, 0xBC, 0xF1, 0xE5, 0xF9, + 0x4C, 0xF0, 0x98, 0xFB, 0x46, 0xFC, 0x80, 0xF8, 0x32, 0x14, 0x3B, 0xFD, + 0x52, 0x0B, 0x26, 0x04, 0xC3, 0xFC, 0x04, 0x08, 0x20, 0x05, 0xB8, 0x0D, + 0x84, 0xFD, 0xD5, 0x0A, 0x00, 0xFB, 0x3C, 0xF4, 0x7D, 0xFF, 0x97, 0xD5, + 0x55, 0xD8, 0x82, 0xC1, 0x68, 0xAB, 0x8C, 0xB9, 0xD8, 0xAA, 0xB9, 0xB9, + 0x22, 0xC0, 0x26, 0xC8, 0x5C, 0xC6, 0x56, 0xDC, 0x0E, 0xD7, 0x61, 0xF6, + 0xED, 0xFD, 0xB4, 0x22, 0x01, 0x19, 0x57, 0x3B, 0xB7, 0x21, 0xF9, 0x33, + 0x41, 0x18, 0xCE, 0x29, 0x12, 0x03, 0x2B, 0x17, 0xFA, 0xE7, 0xBA, 0xFF, + 0x41, 0xCE, 0xA1, 0xF2, 0xB1, 0xC5, 0x47, 0xE7, 0x5B, 0xC8, 0x24, 0xD7, + 0xB5, 0xD1, 0xA0, 0xC8, 0xAE, 0xD3, 0xB2, 0xC5, 0xA6, 0xC0, 0x0E, 0xC2, + 0x7E, 0xAC, 0x6E, 0xAA, 0x90, 0xA8, 0x0F, 0xA0, 0x22, 0xBA, 0x41, 0xA9, + 0xFA, 0xC8, 0x51, 0xB4, 0x42, 0xCE, 0x1A, 0xC3, 0xD8, 0xF2, 0x16, 0xDB, + 0x16, 0x17, 0xB3, 0xF5, 0xFE, 0x0E, 0x3C, 0xFA, 0x63, 0xFD, 0xE4, 0xF5, + 0xFD, 0xF5, 0xA7, 0x04, 0xC4, 0xEB, 0x4F, 0x12, 0x66, 0xF0, 0x94, 0x0E, + 0x19, 0x09, 0x38, 0x11, 0x22, 0x19, 0xCA, 0x15, 0x62, 0x14, 0xB4, 0x0E, + 0x7A, 0x0E, 0x81, 0x08, 0x9B, 0x04, 0x33, 0xF5, 0x52, 0xE3, 0x34, 0xCB, + 0xBA, 0xD1, 0x7F, 0xBC, 0x90, 0xDC, 0x03, 0xD7, 0xF6, 0xE2, 0x35, 0xF2, + 0xCB, 0xF3, 0x72, 0x00, 0x65, 0x1B, 0x8D, 0x16, 0xF6, 0x38, 0x19, 0x30, + 0x11, 0x40, 0x37, 0x34, 0xCA, 0x3C, 0x4A, 0x33, 0x0F, 0x2F, 0xF7, 0x31, + 0xCF, 0x10, 0xBB, 0x1A, 0xBE, 0x06, 0x2E, 0xFE, 0xA5, 0x15, 0x79, 0xF5, + 0xA3, 0x0F, 0x0B, 0xFF, 0xFE, 0xFA, 0x80, 0x08, 0xC4, 0xF3, 0xF4, 0x01, + 0x10, 0xF4, 0xFF, 0xEB, 0xCD, 0xDC, 0x17, 0xD5, 0x8B, 0xBE, 0x5F, 0xCE, + 0x79, 0xCC, 0x76, 0xDA, 0x87, 0xED, 0xEC, 0xE3, 0x3B, 0xFA, 0x74, 0xE1, + 0xAA, 0x09, 0xAD, 0xF2, 0x01, 0x1F, 0x7C, 0x16, 0x53, 0x22, 0xDB, 0x1F, + 0xE4, 0x1C, 0x9C, 0x19, 0xFD, 0x1F, 0x39, 0x27, 0x6D, 0x21, 0xFE, 0x30, + 0x1F, 0x1E, 0xB6, 0x1C, 0x7F, 0x24, 0x0E, 0x16, 0x3A, 0x25, 0xE5, 0x26, + 0x17, 0x19, 0x93, 0x1E, 0x1D, 0x18, 0x65, 0x11, 0x63, 0x11, 0xB9, 0x08, + 0x8B, 0xED, 0xD9, 0xDD, 0x00, 0xCD, 0x6A, 0xB9, 0xB5, 0xD2, 0x79, 0xCB, + 0x33, 0xE9, 0xA2, 0xE8, 0xF6, 0xFB, 0x66, 0x06, 0xCE, 0x18, 0x90, 0x3E, + 0xE3, 0x40, 0xE7, 0x65, 0x86, 0x4F, 0xE1, 0x5C, 0xDE, 0x33, 0x29, 0x46, + 0x10, 0x1E, 0x1A, 0x35, 0xC8, 0x0B, 0x6B, 0x17, 0x31, 0xF5, 0xEC, 0x03, + 0xD3, 0xF5, 0x8D, 0x03, 0x36, 0xF3, 0xCA, 0xF7, 0xF0, 0xE2, 0x12, 0xF2, + 0xD8, 0xE0, 0xE9, 0xF9, 0x72, 0xE9, 0x69, 0x02, 0xE9, 0xDF, 0x9C, 0xFF, + 0xA1, 0xD8, 0xB0, 0xE7, 0xDA, 0xEC, 0xDB, 0xDD, 0x54, 0xF4, 0x1B, 0xEB, + 0xC8, 0xEC, 0x48, 0xE7, 0xEA, 0xFD, 0xE3, 0xE9, 0x55, 0x13, 0x44, 0x0D, + 0xB6, 0x13, 0xB6, 0x19, 0xBE, 0x05, 0xCC, 0x03, 0x91, 0x07, 0x95, 0xF6, + 0x15, 0x24, 0xF5, 0xF3, 0xB2, 0x29, 0xB7, 0xF6, 0x3A, 0x21, 0x93, 0x0C, + 0x0B, 0x34, 0xE5, 0x25, 0xE6, 0x36, 0xB5, 0x20, 0x67, 0x23, 0x7C, 0x0A, + 0x45, 0x17, 0x8A, 0xEE, 0xA7, 0xF2, 0x20, 0xC6, 0x97, 0xB9, 0xD3, 0xAD, + 0x4E, 0xAA, 0x07, 0xB3, 0x41, 0xC8, 0xB1, 0xC8, 0x2B, 0xE1, 0x78, 0xE5, + 0x04, 0xFB, 0x98, 0x01, 0xD7, 0x19, 0x1E, 0x29, 0x1D, 0x1D, 0xFF, 0x4C, + 0xCF, 0x17, 0xD7, 0x47, 0x88, 0x1E, 0x2B, 0x2E, 0xB0, 0x17, 0x77, 0x0C, + 0xF9, 0xFE, 0xE0, 0xE3, 0xD5, 0xE6, 0x9F, 0xCF, 0x3E, 0xD5, 0x75, 0xCB, + 0x88, 0xC8, 0x34, 0xCA, 0xC3, 0xC2, 0x7C, 0xC4, 0x01, 0xCC, 0x52, 0xB9, + 0x60, 0xD3, 0xE0, 0xB3, 0x73, 0xCB, 0xFB, 0xB1, 0xB4, 0xC5, 0x24, 0xBA, + 0xB2, 0xCA, 0xA4, 0xCD, 0x6A, 0xCE, 0x43, 0xD6, 0x61, 0xC7, 0x38, 0xE0, + 0x19, 0xCB, 0x7E, 0xFC, 0x7C, 0xE8, 0xA7, 0x0F, 0xA4, 0x04, 0x86, 0x0B, + 0x7E, 0x02, 0x69, 0xF6, 0x1B, 0xF2, 0x73, 0xF3, 0x39, 0xE7, 0x63, 0x0C, + 0x16, 0xE7, 0x78, 0x1B, 0x17, 0xF5, 0xAE, 0x21, 0x2D, 0xFF, 0x5E, 0x21, + 0x4B, 0x01, 0x75, 0x14, 0x94, 0x01, 0x5E, 0x05, 0x99, 0xF5, 0x1C, 0xEE, + 0xD1, 0xCF, 0xD8, 0xC7, 0x76, 0xB2, 0xED, 0xAE, 0x05, 0xC2, 0x49, 0xBA, + 0x66, 0xDD, 0xB9, 0xDC, 0x73, 0xF1, 0x64, 0x02, 0xAA, 0x1A, 0xA1, 0x29, + 0x17, 0x4E, 0xAC, 0x48, 0xC6, 0x5C, 0x7E, 0x46, 0xD9, 0x51, 0xEA, 0x34, + 0x0D, 0x3A, 0x5A, 0x25, 0x76, 0x18, 0xE8, 0x16, 0x18, 0x00, 0xA7, 0x03, + 0x69, 0xF4, 0xD1, 0xF0, 0xAA, 0xFA, 0x11, 0xF8, 0x0E, 0x0C, 0x0A, 0x0A, + 0xA5, 0x1C, 0xAF, 0x0E, 0xE7, 0x2E, 0x99, 0x0F, 0x95, 0x33, 0xF2, 0x04, + 0xEE, 0x24, 0xD5, 0xF1, 0x61, 0x17, 0xB4, 0xFC, 0x46, 0x09, 0xE8, 0x1B, + 0x1B, 0x03, 0xF4, 0x1F, 0xFA, 0x14, 0x3E, 0x11, 0xC4, 0x39, 0xC6, 0x24, + 0xB4, 0x45, 0x1F, 0x47, 0x8B, 0x32, 0x92, 0x57, 0x76, 0x2E, 0x7D, 0x5B, + 0x44, 0x36, 0x8C, 0x55, 0x02, 0x2E, 0x48, 0x47, 0x5E, 0x30, 0xB9, 0x3D, + 0x81, 0x45, 0x6A, 0x3F, 0x9C, 0x4A, 0x7D, 0x36, 0xB3, 0x3B, 0x2C, 0x1E, + 0x71, 0x18, 0x4D, 0x08, 0x0A, 0xE8, 0x99, 0xE9, 0x6A, 0xC7, 0x87, 0xC9, + 0xBF, 0xCA, 0xA5, 0xDB, 0xC5, 0xE7, 0x65, 0x05, 0x53, 0x16, 0xF0, 0x1E, + 0xA1, 0x3C, 0xB0, 0x33, 0x1B, 0x53, 0xF5, 0x4E, 0x2C, 0x5C, 0xC4, 0x58, + 0x01, 0x4A, 0xF2, 0x46, 0x57, 0x31, 0xFE, 0x32, 0x49, 0x1A, 0x14, 0x19, + 0xC1, 0xFC, 0x30, 0x03, 0x63, 0xDC, 0xF9, 0xEC, 0x08, 0xD6, 0xDF, 0xD7, + 0x78, 0xDF, 0xE6, 0xE0, 0x74, 0xE4, 0xBE, 0xF8, 0xB2, 0xF9, 0xAB, 0x02, + 0x6C, 0x02, 0xCA, 0xFF, 0x97, 0xF0, 0xB2, 0xF0, 0xE6, 0xF1, 0x99, 0xDA, + 0x2B, 0xF8, 0x71, 0xD4, 0x0A, 0xEF, 0x5D, 0xD9, 0xB3, 0xEF, 0xD0, 0xDD, + 0x1E, 0xFD, 0x1C, 0xF9, 0x7B, 0x0B, 0x07, 0x16, 0x52, 0x00, 0x33, 0x0C, + 0xE0, 0xDD, 0x4D, 0x04, 0x90, 0xD4, 0xC4, 0x0E, 0x9A, 0xEA, 0xA2, 0x0B, + 0xB0, 0x02, 0x63, 0x05, 0x59, 0x18, 0x41, 0x0D, 0xAA, 0x1A, 0xFB, 0x11, + 0x46, 0x04, 0x5A, 0x0B, 0x40, 0xF4, 0xC9, 0xF8, 0x2D, 0xE4, 0xF9, 0xD4, + 0x7E, 0xB9, 0xF2, 0xB4, 0xDA, 0x9D, 0x9F, 0xAD, 0x3B, 0xB8, 0x19, 0xBB, + 0x67, 0xDA, 0x7C, 0xD9, 0x6F, 0xF2, 0xE7, 0x02, 0xB0, 0x1A, 0xC0, 0x2A, + 0xEF, 0x34, 0x56, 0x49, 0xF1, 0x25, 0xA9, 0x47, 0xDD, 0x1B, 0xA8, 0x28, + 0x69, 0x16, 0x61, 0xFD, 0xFD, 0xFC, 0xA3, 0xCF, 0x3B, 0xDC, 0xFA, 0xAE, + 0x56, 0xC4, 0x03, 0xA8, 0x5B, 0xC7, 0x85, 0xB8, 0xC1, 0xD3, 0x9B, 0xC7, + 0xDC, 0xDE, 0xE6, 0xD5, 0x8A, 0xE1, 0x03, 0xDB, 0x86, 0xC9, 0x74, 0xC7, + 0xAE, 0xBD, 0x64, 0xBF, 0x49, 0xCC, 0xE5, 0xC6, 0x57, 0xD9, 0xB9, 0xC8, + 0x0D, 0xDE, 0xA8, 0xC8, 0xA7, 0xE7, 0x76, 0xDB, 0x55, 0xFA, 0xF4, 0x00, + 0x0F, 0xFD, 0xB5, 0x0D, 0xB9, 0xFB, 0x1A, 0x03, 0xA7, 0x08, 0x43, 0xFC, + 0xC3, 0x0B, 0x4E, 0xFE, 0x15, 0x04, 0x75, 0x0C, 0x16, 0x09, 0xBC, 0x19, + 0x46, 0x15, 0x77, 0x17, 0xD1, 0x12, 0xBE, 0x05, 0x5F, 0xFF, 0x92, 0xF0, + 0x23, 0xE5, 0xC4, 0xDD, 0xEA, 0xCF, 0xC7, 0xC3, 0xBA, 0xC8, 0x7C, 0xB3, + 0x8D, 0xD7, 0xFE, 0xCA, 0x11, 0xED, 0x22, 0xF4, 0x54, 0xFE, 0x13, 0x22, + 0xD0, 0x1C, 0x41, 0x52, 0xD0, 0x3E, 0x6C, 0x61, 0x97, 0x41, 0xBF, 0x4C, + 0x3E, 0x39, 0x4C, 0x38, 0x0C, 0x2F, 0x22, 0x1F, 0xB6, 0x0A, 0xF8, 0xFD, + 0x66, 0xDF, 0x48, 0xEB, 0xA6, 0xCE, 0x58, 0xE2, 0x58, 0xDD, 0x35, 0xE6, + 0x6F, 0xE5, 0xD1, 0xEE, 0x4A, 0xEF, 0xB3, 0xFA, 0xE1, 0x05, 0x82, 0x03, + 0x35, 0x09, 0xBC, 0xF7, 0x10, 0xFE, 0x01, 0xE3, 0x02, 0xF0, 0x37, 0xDE, + 0x5C, 0xDC, 0x38, 0xEC, 0x6C, 0xCC, 0xA8, 0xF2, 0xE9, 0xCF, 0x6B, 0xF8, + 0xCC, 0xE9, 0x56, 0x0D, 0x06, 0x0A, 0x6D, 0x16, 0xD6, 0x1C, 0x18, 0x14, + 0xF5, 0x21, 0xEF, 0x1F, 0x49, 0x20, 0xCB, 0x23, 0xF7, 0x1F, 0x38, 0x1B, + 0x8B, 0x24, 0x58, 0x19, 0x2B, 0x26, 0x14, 0x1F, 0xAC, 0x16, 0x66, 0x1F, + 0xAF, 0x0A, 0x5B, 0x0A, 0x93, 0x0E, 0x50, 0xEA, 0xFA, 0xF8, 0xFB, 0xCC, + 0xB9, 0xD1, 0xDC, 0xBA, 0x1D, 0xC7, 0x64, 0xCD, 0x88, 0xD9, 0x5E, 0xFC, + 0x24, 0xFD, 0x32, 0x20, 0x5C, 0x29, 0xA2, 0x3A, 0xF9, 0x4B, 0xFB, 0x53, + 0x78, 0x5E, 0x31, 0x5A, 0xD7, 0x54, 0x4B, 0x48, 0x8C, 0x2F, 0x89, 0x33, + 0x9E, 0x03, 0xAF, 0x0F, 0xE3, 0xE6, 0x42, 0xE6, 0x71, 0xCC, 0x28, 0xD3, + 0xB5, 0xC3, 0xC8, 0xD1, 0xA8, 0xE1, 0x87, 0xD8, 0xFF, 0xFD, 0x48, 0xE2, + 0xE3, 0x13, 0x9F, 0xED, 0xBB, 0x15, 0x1F, 0xE9, 0x01, 0xFA, 0xEC, 0xE4, + 0x42, 0xF1, 0x3A, 0xEC, 0xA7, 0xF1, 0xFE, 0xE7, 0x5F, 0xE4, 0x89, 0xE7, + 0x4D, 0xE5, 0x57, 0xE6, 0x69, 0xFB, 0x07, 0xE7, 0xC1, 0x0A, 0x41, 0xF6, + 0x8D, 0x0B, 0x09, 0xFC, 0x0C, 0x05, 0xCE, 0x03, 0xC9, 0xFB, 0xA3, 0x10, + 0xC0, 0xFB, 0x5E, 0x10, 0x78, 0x04, 0x93, 0x15, 0xE7, 0x11, 0x53, 0x1D, + 0xC3, 0x24, 0x2C, 0x12, 0xEB, 0x26, 0x6E, 0x00, 0x91, 0x11, 0x51, 0xFD, + 0x8E, 0xFB, 0x34, 0xF0, 0x03, 0xDE, 0xD6, 0xC5, 0x86, 0xBD, 0x0E, 0xB3, + 0xA8, 0xB9, 0x5B, 0xC5, 0x24, 0xCF, 0xF2, 0xE1, 0x87, 0xF0, 0x28, 0x0B, + 0x77, 0x22, 0xA9, 0x2D, 0x57, 0x46, 0x7B, 0x42, 0xD2, 0x33, 0x65, 0x48, + 0x9C, 0x11, 0x32, 0x33, 0x37, 0xF1, 0x0A, 0x08, 0x62, 0xCA, 0x63, 0xE3, + 0xA9, 0xB5, 0x86, 0xCD, 0x48, 0xB4, 0x7F, 0xC1, 0x68, 0xBA, 0x8B, 0xCC, + 0x8F, 0xC2, 0xB2, 0xDB, 0x52, 0xDA, 0x9A, 0xE6, 0x8A, 0xED, 0x94, 0xE9, + 0xCD, 0xD9, 0x7F, 0xDD, 0x80, 0xBE, 0x28, 0xD6, 0x6D, 0xBD, 0x1C, 0xD2, + 0x24, 0xCF, 0xEF, 0xC3, 0x3E, 0xE1, 0x3C, 0xB9, 0x57, 0xEB, 0x75, 0xCA, + 0x9D, 0xF6, 0x3B, 0xF3, 0xBF, 0x01, 0x87, 0x0F, 0xF0, 0x0C, 0x44, 0x1D, + 0xF5, 0x17, 0x4F, 0x21, 0x74, 0x14, 0x22, 0x12, 0x67, 0x0F, 0xF2, 0x0D, + 0x7A, 0x14, 0x62, 0x19, 0x34, 0x16, 0x1F, 0x1C, 0x80, 0x15, 0x92, 0x14, + 0xEE, 0x18, 0xD4, 0x01, 0x83, 0x0F, 0x5C, 0xE6, 0xA9, 0xEA, 0x13, 0xC8, + 0x3E, 0xCD, 0x5E, 0xBB, 0x3D, 0xD7, 0x35, 0xCB, 0x14, 0x00, 0xA3, 0xE4, + 0xB6, 0x2D, 0x9B, 0x07, 0xC9, 0x4C, 0xBF, 0x37, 0x8B, 0x5D, 0xE6, 0x5A, + 0x0C, 0x59, 0x0E, 0x5E, 0x52, 0x45, 0x6F, 0x4A, 0x68, 0x28, 0xF1, 0x27, + 0x07, 0x03, 0xFF, 0x02, 0x57, 0xEB, 0x9F, 0xF3, 0x75, 0xEB, 0x0A, 0xF7, + 0x33, 0xFF, 0x10, 0x01, 0x87, 0x10, 0x65, 0x0F, 0x30, 0x1E, 0x19, 0x26, + 0x72, 0x2C, 0x1E, 0x39, 0x7C, 0x22, 0x6C, 0x35, 0xB8, 0x17, 0x32, 0x1D, + 0x49, 0x21, 0xB9, 0x04, 0xB8, 0x19, 0xC9, 0xFC, 0xE9, 0x06, 0x04, 0x06, + 0xE7, 0x05, 0x26, 0x18, 0xD2, 0x1B, 0x1D, 0x32, 0x0F, 0x37, 0x47, 0x43, + 0xCE, 0x42, 0x88, 0x3E, 0x9E, 0x44, 0x8F, 0x39, 0x84, 0x42, 0x1E, 0x38, + 0x8E, 0x41, 0xEB, 0x3B, 0x45, 0x43, 0x5F, 0x47, 0x74, 0x49, 0xBF, 0x4A, + 0xC8, 0x49, 0x54, 0x49, 0x37, 0x34, 0xC3, 0x47, 0xBA, 0x16, 0xF6, 0x37, + 0xAD, 0xF5, 0x48, 0x13, 0xA0, 0xD9, 0xDA, 0xE6, 0x42, 0xE2, 0xBF, 0xDA, + 0xCC, 0xF5, 0x13, 0xFC, 0xAA, 0x02, 0x7B, 0x26, 0x57, 0x28, 0x12, 0x42, + 0xB2, 0x52, 0x4B, 0x54, 0xC9, 0x5D, 0x33, 0x5A, 0x83, 0x56, 0x08, 0x45, + 0x4E, 0x44, 0x08, 0x2A, 0x18, 0x20, 0x96, 0x0E, 0x81, 0x00, 0xF6, 0xE9, + 0x9D, 0xE0, 0x2A, 0xD2, 0xC6, 0xC2, 0xAA, 0xD7, 0x36, 0xC2, 0x87, 0xE7, + 0x52, 0xD4, 0x34, 0xF7, 0xA7, 0xE8, 0x29, 0x04, 0x22, 0xFF, 0x80, 0xF9, + 0xA7, 0x05, 0x44, 0xE6, 0x86, 0xF7, 0x87, 0xE1, 0x33, 0xF2, 0x11, 0xDC, + 0x5B, 0xF1, 0x73, 0xDD, 0x0E, 0xE5, 0xDF, 0xE5, 0x99, 0xE4, 0x0D, 0xE6, + 0x3B, 0xF1, 0xF2, 0xF1, 0x6D, 0xFD, 0xC7, 0xF9, 0x04, 0x08, 0x45, 0xF1, + 0x47, 0x00, 0x1B, 0xEF, 0x69, 0xF7, 0x68, 0xF9, 0x09, 0xFC, 0xA1, 0x04, + 0xB1, 0xFF, 0x4B, 0x07, 0x4B, 0x00, 0x9E, 0x04, 0x2A, 0x03, 0x6A, 0xF5, + 0x07, 0x04, 0xB8, 0xE1, 0x75, 0xEC, 0xDA, 0xCC, 0x5A, 0xC4, 0x4E, 0xAE, + 0xB8, 0xA9, 0x14, 0xAB, 0x9F, 0xAC, 0x24, 0xCA, 0x76, 0xC8, 0xE6, 0xE9, + 0xF0, 0xDF, 0xA8, 0x10, 0xC9, 0x01, 0x6B, 0x33, 0x89, 0x3A, 0x07, 0x3B, + 0xC6, 0x4A, 0xDA, 0x28, 0x63, 0x2D, 0x82, 0x08, 0xB3, 0x0A, 0xFF, 0xDD, + 0x9F, 0xEA, 0x30, 0xBC, 0xE0, 0xD0, 0x7B, 0xB3, 0x20, 0xBF, 0xB2, 0xAE, + 0x56, 0xBA, 0x94, 0xB7, 0xC3, 0xC1, 0x5F, 0xD0, 0xEB, 0xD9, 0x2F, 0xE4, + 0x24, 0xF2, 0x86, 0xF1, 0xC3, 0xF0, 0x2E, 0xF5, 0x0A, 0xE4, 0xF8, 0xEC, + 0x79, 0xD5, 0x11, 0xE3, 0x6A, 0xC3, 0x1D, 0xE0, 0x1F, 0xC5, 0x9B, 0xDA, + 0xF1, 0xE1, 0x38, 0xCD, 0x70, 0x03, 0xC6, 0xD5, 0xB5, 0x0C, 0x3B, 0xF3, + 0xC8, 0xFB, 0xD7, 0x08, 0xF3, 0xEE, 0x5E, 0x10, 0x30, 0xF1, 0xBC, 0x0F, + 0x29, 0xF0, 0xE6, 0x15, 0xEA, 0xEF, 0xE5, 0x1C, 0xE8, 0xFA, 0x4D, 0x17, + 0x4F, 0x0B, 0x27, 0x0B, 0x63, 0x13, 0x3C, 0xF9, 0xED, 0xFE, 0x5B, 0xE0, + 0xF5, 0xD9, 0x1D, 0xCB, 0x79, 0xBB, 0x3C, 0xC2, 0x25, 0xB3, 0xB5, 0xD0, + 0xB1, 0xD1, 0x34, 0xED, 0xCE, 0x0B, 0xE1, 0x0A, 0xFE, 0x36, 0x5E, 0x2D, + 0x5A, 0x48, 0x35, 0x4D, 0x39, 0x4D, 0xAD, 0x59, 0x9F, 0x42, 0xAE, 0x4A, + 0x7B, 0x2B, 0x67, 0x24, 0xB8, 0x0E, 0x35, 0xF9, 0xE2, 0xE8, 0xA9, 0xDD, + 0xA7, 0xC9, 0xFA, 0xCE, 0x73, 0xCF, 0xC9, 0xCD, 0xB1, 0xE6, 0x09, 0xDB, + 0x40, 0x01, 0x0A, 0xF1, 0xF6, 0x24, 0x06, 0x00, 0x08, 0x28, 0xAD, 0x06, + 0xA4, 0xFD, 0x00, 0x0D, 0xCC, 0xE0, 0xCD, 0x06, 0xE6, 0xDD, 0x8D, 0xEE, + 0x8E, 0xDC, 0x16, 0xD1, 0x20, 0xE0, 0xDC, 0xCA, 0x2B, 0xF2, 0x1A, 0xED, + 0x07, 0x0A, 0x9C, 0x0D, 0x78, 0x16, 0x9B, 0x0E, 0xF7, 0x0E, 0x9D, 0x0C, + 0x94, 0xFF, 0x05, 0x14, 0x8B, 0xFF, 0x3B, 0x18, 0xC3, 0x10, 0x8E, 0x13, + 0x60, 0x22, 0x3F, 0x0C, 0x5A, 0x24, 0x49, 0x04, 0xDB, 0x14, 0xD2, 0xFA, + 0x9D, 0xF9, 0xC4, 0xE9, 0x4F, 0xDA, 0xC3, 0xCF, 0x66, 0xC0, 0xB0, 0xB6, + 0x02, 0xCC, 0x88, 0xAF, 0x70, 0xF4, 0xF5, 0xC4, 0xED, 0x10, 0x1B, 0xF6, + 0x71, 0x29, 0x10, 0x2A, 0x26, 0x4D, 0x9F, 0x4C, 0x7E, 0x60, 0xCD, 0x5A, + 0xD5, 0x52, 0xF0, 0x45, 0x06, 0x36, 0x20, 0x26, 0xCC, 0x07, 0xE7, 0x0D, + 0xC9, 0xE1, 0x4C, 0xEF, 0x7F, 0xCE, 0x6A, 0xC9, 0x11, 0xC2, 0x45, 0xC1, + 0x66, 0xC7, 0x18, 0xDE, 0x73, 0xDC, 0x9F, 0x00, 0xEC, 0xED, 0x92, 0x20, + 0xED, 0xFA, 0x2E, 0x29, 0x26, 0x0A, 0x61, 0x0F, 0x7F, 0x07, 0x64, 0xF9, + 0x93, 0xF4, 0x2B, 0xF6, 0x4B, 0xE6, 0x28, 0xF1, 0x70, 0xDA, 0x96, 0xE7, + 0x76, 0xDD, 0x31, 0xE3, 0x9E, 0xEF, 0x85, 0xF4, 0xB6, 0xED, 0x6B, 0x05, + 0xE1, 0xEC, 0xF8, 0x05, 0x7C, 0xFD, 0x0B, 0x03, 0x49, 0x0D, 0xE5, 0x01, + 0x3D, 0x13, 0x8E, 0x06, 0x56, 0x14, 0x2C, 0x0C, 0x32, 0x14, 0x1A, 0x13, + 0xE7, 0x02, 0xA6, 0x10, 0xD4, 0xEA, 0x8A, 0xF8, 0x8F, 0xCE, 0x14, 0xD8, + 0xB6, 0xB4, 0x12, 0xB5, 0x20, 0xB9, 0x21, 0xA7, 0x25, 0xC7, 0x24, 0xC7, + 0xFB, 0xDA, 0x91, 0xF7, 0x4F, 0x05, 0xF2, 0x22, 0xD9, 0x31, 0x9B, 0x48, + 0xAC, 0x4E, 0xE3, 0x59, 0x98, 0x49, 0x39, 0x44, 0x34, 0x31, 0xAE, 0x17, + 0x27, 0x15, 0xEF, 0xEA, 0xEB, 0xE9, 0xB3, 0xC5, 0x09, 0xB8, 0x99, 0xAD, + 0x9A, 0x9E, 0x08, 0xA2, 0x52, 0xAF, 0x4A, 0xA9, 0x25, 0xC9, 0x12, 0xC0, + 0x84, 0xD9, 0x24, 0xD9, 0xD5, 0xE9, 0x20, 0xE4, 0xB8, 0xEF, 0xB4, 0xDE, + 0x8B, 0xE5, 0x69, 0xD6, 0xB3, 0xDB, 0x67, 0xD2, 0x2F, 0xD4, 0x98, 0xD4, + 0xA9, 0xC7, 0x43, 0xDA, 0xEE, 0xC9, 0xA5, 0xDE, 0x24, 0xE4, 0x51, 0xEF, + 0x0C, 0xF9, 0x4B, 0xFD, 0x83, 0xFD, 0x34, 0xF8, 0x16, 0xFF, 0x3F, 0xF9, + 0x46, 0x06, 0x21, 0x08, 0x02, 0x0B, 0x1F, 0x12, 0xE6, 0x0B, 0x24, 0x10, + 0x56, 0x08, 0x73, 0x09, 0x9E, 0xFC, 0x51, 0xFE, 0xDE, 0xF7, 0x2C, 0xF0, + 0x6C, 0xF8, 0x77, 0xDE, 0x85, 0xEA, 0x3B, 0xC9, 0xF0, 0xDB, 0x0E, 0xCB, + 0x06, 0xE2, 0xE7, 0xED, 0x9C, 0xF7, 0x63, 0x13, 0xC4, 0x14, 0x03, 0x31, + 0xEC, 0x35, 0xBA, 0x4C, 0x81, 0x55, 0x21, 0x5D, 0x7C, 0x5F, 0x39, 0x4D, + 0x1B, 0x59, 0x48, 0x2F, 0x32, 0x44, 0xF9, 0x18, 0x09, 0x26, 0xC0, 0x04, + 0x06, 0x07, 0x67, 0xF6, 0xE6, 0xE1, 0x28, 0xF1, 0x71, 0xD8, 0xF9, 0xFB, + 0xE5, 0xF4, 0x75, 0x0F, 0xFD, 0x1B, 0x6B, 0x22, 0xE7, 0x35, 0xE6, 0x2C, + 0x1A, 0x34, 0x9A, 0x31, 0x3B, 0x1B, 0x53, 0x3C, 0x86, 0x0A, 0x2A, 0x41, + 0x6A, 0x0E, 0xBF, 0x33, 0x50, 0x0D, 0x55, 0x20, 0xCB, 0x04, 0xE1, 0x14, + 0xC0, 0x13, 0x53, 0x1E, 0x99, 0x23, 0x0B, 0x39, 0xBC, 0x1C, 0xD8, 0x46, + 0x03, 0x27, 0x5F, 0x45, 0x6A, 0x3F, 0x52, 0x46, 0x7E, 0x43, 0xC8, 0x4B, + 0x0F, 0x39, 0xBB, 0x4E, 0x9B, 0x3A, 0x12, 0x50, 0x1C, 0x47, 0xE8, 0x41, + 0x25, 0x48, 0x7F, 0x1D, 0x7D, 0x2F, 0xA4, 0xFD, 0xEC, 0x0B, 0x07, 0xEE, + 0xB4, 0xF2, 0xD5, 0xE9, 0x39, 0xEA, 0xA4, 0xF6, 0xF0, 0xF8, 0x7E, 0x10, + 0xBD, 0x16, 0x18, 0x29, 0x8B, 0x36, 0x72, 0x3E, 0x37, 0x56, 0x49, 0x53, + 0x2B, 0x5D, 0x08, 0x58, 0xCD, 0x4B, 0x48, 0x44, 0xEC, 0x34, 0x0A, 0x21, + 0xE6, 0x0C, 0xC2, 0x00, 0x33, 0xE1, 0xCC, 0xEC, 0xB8, 0xCB, 0xFC, 0xD2, + 0xDF, 0xD2, 0x9C, 0xC7, 0x61, 0xE1, 0x04, 0xDA, 0x23, 0xF3, 0x2E, 0xF5, + 0xF1, 0x04, 0xAD, 0x10, 0xD6, 0x09, 0xC1, 0x1E, 0x17, 0x0E, 0x2E, 0x0E, + 0x76, 0x0C, 0xEC, 0xF1, 0x48, 0x04, 0x59, 0xE0, 0x4E, 0x01, 0x53, 0xD3, + 0xF5, 0xF0, 0xD0, 0xC9, 0x5C, 0xE3, 0xCB, 0xD1, 0x81, 0xF6, 0x66, 0xE5, + 0xB5, 0x05, 0x27, 0xED, 0x6E, 0x00, 0x6D, 0xFB, 0xF4, 0xFB, 0x71, 0x16, + 0xC1, 0x00, 0x2F, 0x20, 0xE3, 0x07, 0x8D, 0x13, 0x01, 0x0F, 0x3C, 0x00, + 0x90, 0x0D, 0x85, 0xFA, 0x9A, 0xF1, 0x80, 0xFD, 0xF9, 0xDC, 0x4A, 0xED, + 0xE7, 0xD4, 0xC5, 0xCD, 0x70, 0xC0, 0xAE, 0xB9, 0xF6, 0xC1, 0x0A, 0xC2, + 0x03, 0xD8, 0x6B, 0xE7, 0x14, 0xEB, 0xAE, 0x0E, 0x9D, 0x07, 0x05, 0x27, + 0x8E, 0x25, 0x03, 0x3F, 0x30, 0x2F, 0x17, 0x4B, 0xDB, 0x21, 0x27, 0x31, + 0x23, 0x06, 0x01, 0x0E, 0xDB, 0xDE, 0x68, 0xF2, 0xCC, 0xC5, 0x4F, 0xCE, + 0xDA, 0xB6, 0xDE, 0xA8, 0xFF, 0xAB, 0x4C, 0xA1, 0xC9, 0xB7, 0x71, 0xBA, + 0xAF, 0xCB, 0x69, 0xDF, 0x2E, 0xD8, 0x66, 0xFC, 0xEE, 0xDF, 0xF2, 0xFF, + 0xE0, 0xE5, 0xB3, 0xF0, 0x9A, 0xE7, 0x3A, 0xE1, 0xB0, 0xEC, 0xB1, 0xD8, + 0x2C, 0xF2, 0x02, 0xD1, 0x3F, 0xE7, 0x03, 0xC9, 0x6C, 0xE1, 0xD3, 0xCE, + 0x25, 0xF1, 0x35, 0xE6, 0x12, 0xFB, 0x0D, 0xF5, 0x4A, 0xFD, 0xD9, 0xF2, + 0x6B, 0x0A, 0x55, 0xF5, 0xE3, 0x12, 0xD5, 0x07, 0x5F, 0x02, 0x73, 0x17, + 0x71, 0xF3, 0x82, 0x18, 0xF2, 0xF9, 0x29, 0x17, 0xB5, 0xFB, 0x44, 0x12, + 0x84, 0xEF, 0xFC, 0x03, 0xBC, 0xE1, 0x58, 0xEB, 0xEF, 0xD5, 0xAF, 0xCB, + 0xA8, 0xD7, 0x55, 0xBC, 0x78, 0xE6, 0x66, 0xD2, 0xFA, 0xF3, 0x3F, 0xF9, + 0x4B, 0x0B, 0x1E, 0x1F, 0x9E, 0x31, 0x55, 0x46, 0x61, 0x51, 0x0B, 0x5E, + 0x1A, 0x4D, 0x67, 0x49, 0x79, 0x33, 0x85, 0x19, 0x27, 0x19, 0x3D, 0xF3, + 0xFA, 0xFB, 0x33, 0xDA, 0xD3, 0xE2, 0x6E, 0xC2, 0x80, 0xD3, 0x86, 0xBA, + 0xB4, 0xD4, 0x5E, 0xD2, 0x3E, 0xE0, 0xD6, 0xF2, 0x09, 0xEE, 0x56, 0x0E, + 0x45, 0xFE, 0x02, 0x1B, 0xDF, 0x10, 0x4B, 0x15, 0xE1, 0x16, 0x89, 0x09, + 0xE8, 0x07, 0xD7, 0x04, 0xF9, 0xFB, 0x99, 0x02, 0x96, 0xF5, 0xF3, 0xF2, + 0x67, 0xED, 0xAA, 0xEA, 0x4D, 0xFB, 0xD2, 0xF9, 0xCA, 0x10, 0x39, 0x05, + 0xE4, 0x15, 0x79, 0x05, 0xA7, 0x1F, 0xA4, 0x02, 0x76, 0x34, 0x22, 0x09, + 0xBC, 0x28, 0x10, 0x17, 0xD9, 0x05, 0x5A, 0x1B, 0x92, 0xF8, 0xA7, 0x1D, + 0x51, 0xF3, 0x7B, 0x1B, 0xB6, 0xEE, 0x9B, 0x03, 0x80, 0xEA, 0x6A, 0xDE, + 0x5B, 0xD6, 0x40, 0xC3, 0xA9, 0xC2, 0x09, 0xC2, 0xBD, 0xC8, 0x63, 0xE1, + 0xC4, 0xE7, 0x94, 0x09, 0xD6, 0x15, 0x59, 0x24, 0x7C, 0x3B, 0x26, 0x3C, + 0xDF, 0x55, 0x69, 0x53, 0xD0, 0x58, 0xDE, 0x51, 0x6E, 0x3D, 0x75, 0x34, + 0xD1, 0x1F, 0xC6, 0x08, 0xF1, 0x03, 0x68, 0xDC, 0x81, 0xDF, 0xC9, 0xC6, + 0xE8, 0xB6, 0xEF, 0xC6, 0x98, 0xAB, 0x72, 0xD7, 0x0E, 0xC4, 0x9B, 0xF0, + 0xF8, 0xF1, 0x57, 0x00, 0x20, 0x1B, 0xD6, 0x06, 0xEC, 0x20, 0x5A, 0x14, + 0xCD, 0x18, 0x92, 0x16, 0x34, 0x14, 0xDB, 0x00, 0x6A, 0x03, 0x4E, 0xF2, + 0x00, 0xE7, 0xB1, 0xEA, 0x3D, 0xD2, 0x1C, 0xDA, 0xF0, 0xE1, 0x2C, 0xD9, + 0x22, 0x05, 0x90, 0xE6, 0x00, 0x12, 0x28, 0xE5, 0x54, 0x0B, 0xB2, 0xE0, + 0x6D, 0x0B, 0x09, 0xF5, 0x5A, 0x11, 0x07, 0x11, 0x96, 0x02, 0x79, 0x1B, + 0x5F, 0xFA, 0xED, 0x1C, 0x49, 0x0B, 0x89, 0x0A, 0x37, 0x08, 0x7B, 0xEC, + 0xC2, 0xE5, 0xEE, 0xD4, 0xEB, 0xBE, 0xBF, 0xC0, 0xB7, 0xA1, 0xF2, 0xB6, + 0x37, 0xA7, 0xA7, 0xBC, 0x27, 0xCC, 0x57, 0xD4, 0xEC, 0xED, 0x25, 0x02, + 0x9C, 0x0B, 0x3D, 0x2C, 0x42, 0x38, 0x0D, 0x3B, 0xDE, 0x58, 0xBB, 0x36, + 0xD2, 0x4D, 0x7A, 0x1E, 0x24, 0x2C, 0xA4, 0x00, 0x39, 0xFA, 0x02, 0xE9, + 0x8C, 0xCE, 0x42, 0xCE, 0xD2, 0xB0, 0x4A, 0xAC, 0x61, 0x9C, 0xE3, 0xA3, + 0x9B, 0xA1, 0x6D, 0xBC, 0xBE, 0xB7, 0x3B, 0xD9, 0xDF, 0xD0, 0x13, 0xF1, + 0x66, 0xE8, 0xCF, 0xF7, 0x77, 0xF6, 0x5E, 0xF0, 0xBE, 0xF0, 0xA2, 0xEF, + 0x12, 0xE7, 0x30, 0xF8, 0xAB, 0xE9, 0xC9, 0xF7, 0x48, 0xE9, 0x34, 0xE7, + 0x63, 0xE8, 0x67, 0xDD, 0xD9, 0xF5, 0x23, 0xEB, 0xFE, 0xFC, 0x41, 0xFA, + 0x60, 0xF0, 0x54, 0x02, 0xE8, 0xE3, 0x0F, 0x0E, 0xD8, 0xEA, 0x0A, 0x1C, + 0x4F, 0xF5, 0x54, 0x15, 0xA4, 0x01, 0x7F, 0x02, 0x1E, 0x16, 0x6A, 0x00, + 0x1A, 0x1A, 0xE1, 0x00, 0xB0, 0x0B, 0xFC, 0xF3, 0x66, 0xFB, 0xC7, 0xDD, + 0x7E, 0xE0, 0xFD, 0xCE, 0xE4, 0xC8, 0x49, 0xD4, 0xCD, 0xD8, 0x56, 0xE9, + 0xDC, 0xFD, 0x9C, 0x03, 0xCE, 0x1A, 0x61, 0x22, 0x0A, 0x32, 0xA4, 0x43, + 0xEE, 0x4D, 0xCD, 0x5B, 0x39, 0x5D, 0xCA, 0x56, 0x53, 0x5D, 0xCE, 0x40, + 0x1F, 0x4B, 0x7B, 0x2B, 0xAD, 0x27, 0x81, 0x12, 0x3E, 0x08, 0x38, 0xF6, + 0x21, 0xEF, 0x9C, 0xE4, 0x41, 0xEB, 0xB3, 0xED, 0x44, 0xF4, 0x67, 0x04, + 0x32, 0x03, 0x3A, 0x25, 0x8E, 0x11, 0x56, 0x42, 0x91, 0x1B, 0x74, 0x48, + 0xCB, 0x27, 0xA9, 0x38, 0xBB, 0x29, 0x59, 0x21, 0x9B, 0x27, 0xA4, 0x14, + 0xC5, 0x24, 0x2E, 0x0F, 0x71, 0x20, 0x4B, 0x0D, 0x82, 0x2F, 0x28, 0x1C, + 0xDB, 0x3D, 0xC8, 0x2C, 0x68, 0x2F, 0xA9, 0x33, 0xA0, 0x1C, 0xC9, 0x3C, + 0xCF, 0x28, 0xD0, 0x45, 0x95, 0x3B, 0xC0, 0x44, 0xEB, 0x32, 0x68, 0x3B, + 0xB2, 0x31, 0xC4, 0x36, 0x3D, 0x31, 0xD8, 0x2A, 0x17, 0x21, 0x85, 0x18, + 0x73, 0x15, 0x9F, 0x01, 0x05, 0x07, 0xB3, 0xE6, 0xDA, 0xF9, 0xB7, 0xDA, + 0x39, 0x06, 0x31, 0xF1, 0xFA, 0x1D, 0xD6, 0x19, 0xAB, 0x30, 0xC0, 0x32, + 0x12, 0x45, 0x49, 0x46, 0xF2, 0x52, 0x30, 0x59, 0x52, 0x4E, 0x29, 0x55, + 0xDB, 0x40, 0xA3, 0x3E, 0x53, 0x37, 0x44, 0x1C, 0xA8, 0x2A, 0xE7, 0xF0, + 0x0B, 0x0D, 0x02, 0xD2, 0x89, 0xE1, 0x68, 0xC5, 0x35, 0xCC, 0x14, 0xCC, + 0x8C, 0xD4, 0x28, 0xE6, 0x40, 0xEA, 0x10, 0x06, 0x81, 0x0A, 0xAE, 0x0C, + 0xA0, 0x19, 0xBB, 0x00, 0x7C, 0x07, 0xDE, 0xFC, 0xAA, 0xF3, 0x3B, 0xF6, + 0x8E, 0xF0, 0xB9, 0xEC, 0x53, 0xEE, 0x18, 0xE4, 0x0B, 0xE4, 0x0E, 0xD5, + 0xFE, 0xE1, 0x84, 0xDD, 0x95, 0xE7, 0x64, 0x01, 0xE6, 0xED, 0x3F, 0x0A, + 0x37, 0xFB, 0x14, 0xF7, 0x38, 0x04, 0xA0, 0xF6, 0x94, 0xFE, 0xC7, 0x08, + 0xBB, 0xF3, 0xEE, 0x13, 0x6E, 0xEF, 0x88, 0x15, 0xAA, 0xED, 0x34, 0x0A, + 0x70, 0xE6, 0x99, 0xF2, 0x27, 0xDF, 0xC4, 0xD8, 0x3C, 0xD8, 0x4C, 0xC0, + 0x40, 0xC8, 0x89, 0xAE, 0x90, 0xCA, 0x77, 0xB7, 0x88, 0xEB, 0x40, 0xD7, + 0xC2, 0x00, 0xFE, 0xF7, 0xE8, 0x04, 0x2F, 0x1E, 0x11, 0x1B, 0x03, 0x41, + 0x1E, 0x3A, 0x92, 0x4C, 0xD5, 0x3D, 0x21, 0x33, 0x2C, 0x2E, 0xC9, 0xFF, + 0xC7, 0x0C, 0xA5, 0xD6, 0x11, 0xDA, 0x33, 0xC4, 0x94, 0xAE, 0xB9, 0xB4, + 0x9E, 0x9A, 0x45, 0xA6, 0x04, 0xA1, 0x0A, 0xAB, 0x1B, 0xBA, 0x3F, 0xC2, + 0xCA, 0xD6, 0x20, 0xDF, 0x59, 0xEA, 0x25, 0xFA, 0xBF, 0xF4, 0xB7, 0xF7, + 0xBC, 0x01, 0x83, 0xE0, 0x91, 0x07, 0x05, 0xE0, 0xD6, 0xF7, 0x82, 0xE8, + 0x49, 0xDC, 0xF6, 0xD9, 0xB1, 0xD7, 0xCB, 0xCF, 0xFF, 0xF0, 0x4F, 0xDC, + 0x7B, 0xF8, 0x6A, 0xDF, 0x99, 0xED, 0x6C, 0xE3, 0x6C, 0xF0, 0x47, 0xFA, + 0xE4, 0x04, 0x91, 0x12, 0xC0, 0x09, 0xA5, 0x1A, 0x58, 0xFD, 0x68, 0x20, + 0x88, 0x02, 0xB3, 0x28, 0x76, 0x05, 0x92, 0x16, 0x5A, 0xFB, 0x06, 0xF3, + 0xCF, 0xEF, 0x6D, 0xD0, 0xB8, 0xDF, 0x2F, 0xB2, 0xE4, 0xD5, 0x38, 0xB1, + 0x51, 0xDA, 0x68, 0xD6, 0xD0, 0xE4, 0xE9, 0x02, 0xFA, 0xF7, 0x08, 0x24, + 0xDA, 0x22, 0x13, 0x42, 0xAA, 0x4F, 0x70, 0x55, 0x4E, 0x59, 0xA2, 0x54, + 0x30, 0x41, 0xC8, 0x43, 0x02, 0x20, 0xA5, 0x28, 0x4F, 0x04, 0xFA, 0x10, + 0xDA, 0xD5, 0x06, 0xF1, 0xCF, 0xB0, 0x25, 0xD7, 0x43, 0xB4, 0x99, 0xD1, + 0xB3, 0xC3, 0x73, 0xD2, 0x15, 0xE3, 0x59, 0xE3, 0x8D, 0x04, 0xF3, 0xFA, + 0xB6, 0x09, 0xCD, 0xFE, 0x34, 0x04, 0xA5, 0xF8, 0x2F, 0x07, 0xD9, 0xFF, + 0xAC, 0x09, 0xE2, 0x08, 0xB8, 0xFA, 0x4E, 0xFA, 0x8C, 0xEF, 0x72, 0xEA, + 0x36, 0xFC, 0x48, 0xF1, 0x02, 0x0E, 0x41, 0xF5, 0x00, 0x10, 0x5A, 0xEF, + 0x98, 0x04, 0x3F, 0xF9, 0x64, 0x09, 0x67, 0x15, 0xC3, 0x17, 0x0B, 0x26, + 0x46, 0x19, 0xA3, 0x23, 0x9C, 0x1B, 0x5D, 0x1D, 0x4D, 0x11, 0x8E, 0x0E, + 0xF7, 0xF9, 0x7A, 0xFF, 0x22, 0xF4, 0xAF, 0xF5, 0xA7, 0xED, 0xC0, 0xE0, + 0x32, 0xD9, 0x63, 0xCF, 0x29, 0xD7, 0xEE, 0xDB, 0x00, 0xE6, 0xF1, 0xF6, + 0xE0, 0xF3, 0xE3, 0x08, 0xF2, 0x14, 0x9A, 0x19, 0x42, 0x48, 0x4E, 0x38, + 0x35, 0x5A, 0xEC, 0x44, 0xFD, 0x42, 0x1E, 0x37, 0x42, 0x1F, 0x0C, 0x2A, + 0x4D, 0xF8, 0x29, 0x14, 0xA0, 0xD8, 0xAA, 0xEF, 0x94, 0xBB, 0x53, 0xCD, + 0x96, 0xB1, 0xCD, 0xCB, 0xE8, 0xBC, 0x6B, 0xDC, 0xF9, 0xD7, 0x62, 0xF0, + 0x6A, 0xFF, 0xC6, 0xFE, 0xDC, 0x14, 0x5E, 0xFC, 0x59, 0x0D, 0xB6, 0xFA, + 0x04, 0x03, 0x2F, 0xF3, 0x28, 0x0C, 0x14, 0xE6, 0x85, 0x0C, 0xF6, 0xDA, + 0xED, 0xF9, 0x41, 0xCC, 0x1E, 0xF7, 0xF5, 0xCA, 0xF9, 0xF8, 0x73, 0xDF, + 0xD1, 0xEB, 0x95, 0xF5, 0x8A, 0xF6, 0x31, 0x01, 0x6F, 0x11, 0x90, 0x05, + 0x98, 0x1B, 0xD9, 0x0A, 0xE0, 0x1E, 0x41, 0x0E, 0x54, 0x1B, 0x0D, 0x12, + 0xDF, 0x10, 0x07, 0x10, 0xBE, 0x08, 0xBA, 0xF6, 0x97, 0x03, 0x76, 0xDD, + 0x85, 0xE3, 0x6A, 0xCE, 0x2E, 0xB3, 0xB6, 0xC0, 0xB0, 0xAC, 0xA4, 0xCC, + 0x43, 0xC7, 0x3A, 0xE4, 0xE9, 0xE6, 0xAA, 0xF2, 0x78, 0x03, 0xF9, 0x10, + 0x48, 0x1E, 0xEF, 0x3A, 0x52, 0x36, 0x5B, 0x54, 0x0B, 0x2E, 0x2C, 0x43, + 0x4A, 0x1C, 0x75, 0x17, 0x3A, 0x0B, 0x4A, 0xEE, 0xED, 0xE0, 0x37, 0xC7, + 0x35, 0xB3, 0x8F, 0xA9, 0x0B, 0xA4, 0x8D, 0xA2, 0x3E, 0xA4, 0xF1, 0xA9, + 0xF4, 0xAC, 0x73, 0xC6, 0xB0, 0xC5, 0xB3, 0xEC, 0x9F, 0xE0, 0x78, 0x06, + 0x7E, 0xF1, 0xC8, 0x07, 0x2D, 0x03, 0x72, 0xF4, 0x0E, 0x19, 0xDB, 0xEC, + 0xCE, 0x11, 0xA8, 0xE0, 0x9C, 0xF7, 0x0F, 0xCE, 0x32, 0xEA, 0xA5, 0xD7, + 0x06, 0xE6, 0xB9, 0xEA, 0x36, 0xE1, 0x94, 0xE3, 0x9A, 0xEC, 0x36, 0xDC, + 0x9A, 0x01, 0xA4, 0xF4, 0xA5, 0x05, 0x0A, 0x14, 0x7A, 0x02, 0xD7, 0x1A, + 0x0B, 0x0D, 0x3A, 0x1C, 0x26, 0x13, 0xFD, 0x1A, 0xFD, 0xFF, 0xE3, 0x06, + 0x04, 0xF0, 0xB9, 0xF8, 0x17, 0xEA, 0x72, 0xE4, 0x0C, 0xE5, 0x40, 0xC3, + 0x62, 0xE8, 0x83, 0xBD, 0xC5, 0xF3, 0xC3, 0xDC, 0x4C, 0x01, 0x8D, 0x04, + 0x60, 0x1B, 0x6D, 0x2E, 0x1C, 0x42, 0x97, 0x57, 0xF8, 0x5C, 0x23, 0x63, + 0x8D, 0x5F, 0xB2, 0x50, 0x21, 0x5B, 0xD2, 0x3C, 0x8D, 0x49, 0x98, 0x26, + 0x80, 0x26, 0x94, 0x06, 0x7D, 0x06, 0x7B, 0xE7, 0x64, 0xEB, 0x02, 0xD6, + 0xCD, 0xE1, 0xB4, 0xE2, 0xD7, 0xEE, 0xA0, 0x0B, 0x7A, 0x10, 0x5E, 0x36, + 0xC5, 0x30, 0xE1, 0x43, 0xB3, 0x3E, 0x9F, 0x3C, 0x5E, 0x41, 0x47, 0x35, + 0x4C, 0x3B, 0x08, 0x34, 0x3A, 0x34, 0x23, 0x3A, 0x3B, 0x26, 0x9C, 0x35, + 0x64, 0x16, 0x1D, 0x25, 0x63, 0x22, 0x97, 0x27, 0x62, 0x36, 0xB5, 0x32, + 0x5F, 0x3A, 0x7D, 0x2E, 0xF0, 0x3D, 0x59, 0x33, 0x76, 0x40, 0x03, 0x4C, + 0x68, 0x3F, 0x5D, 0x5C, 0xA8, 0x2E, 0x85, 0x58, 0xFF, 0x1D, 0x4C, 0x50, + 0x4F, 0x24, 0x0E, 0x3B, 0x25, 0x28, 0x41, 0x1C, 0xBF, 0x1F, 0x63, 0x03, + 0x0F, 0x12, 0x54, 0xE8, 0xEF, 0x04, 0x40, 0xD7, 0xB0, 0x07, 0x5C, 0xE7, + 0x49, 0x0F, 0x9F, 0x07, 0xB5, 0x12, 0x03, 0x27, 0xFB, 0x26, 0x99, 0x46, + 0x08, 0x4D, 0x2C, 0x5C, 0xBD, 0x59, 0xC3, 0x57, 0xF0, 0x4A, 0x6F, 0x3E, + 0xE8, 0x39, 0xC7, 0x24, 0x22, 0x18, 0x2D, 0x10, 0x65, 0xF4, 0x8B, 0xF7, + 0xA3, 0xDE, 0x90, 0xDD, 0x18, 0xD2, 0x65, 0xD8, 0x27, 0xD1, 0x38, 0xDF, + 0x66, 0xD8, 0xD9, 0xEF, 0x33, 0xE9, 0x3A, 0x05, 0x30, 0x01, 0xBF, 0x08, + 0x7B, 0x10, 0xF7, 0x02, 0x67, 0x0C, 0x1E, 0x05, 0xE7, 0xFD, 0x5D, 0x08, + 0x9B, 0xFA, 0xE8, 0xFB, 0x83, 0xF5, 0x23, 0xDE, 0xBA, 0xF4, 0xE4, 0xCB, + 0x75, 0xFA, 0x76, 0xCE, 0x23, 0xF5, 0x2A, 0xDE, 0x19, 0xEF, 0xDE, 0xEA, + 0x3E, 0xFA, 0xA2, 0xF4, 0x23, 0x06, 0x4E, 0x0A, 0x7C, 0x00, 0x48, 0x13, + 0xB3, 0xFA, 0xA0, 0x0A, 0xA2, 0xF3, 0x74, 0x06, 0xCB, 0xED, 0x9C, 0xFC, + 0x5A, 0xEA, 0x27, 0xDC, 0xCB, 0xD9, 0xA7, 0xBE, 0xF8, 0xBC, 0x41, 0xAB, + 0x5A, 0xB5, 0x59, 0xB3, 0x02, 0xC4, 0x38, 0xD7, 0xEA, 0xE5, 0x4F, 0xEE, + 0x1E, 0x0E, 0x02, 0x02, 0x31, 0x23, 0x9D, 0x22, 0x26, 0x2E, 0xFC, 0x3E, + 0x4C, 0x23, 0xB8, 0x3E, 0x4E, 0x0C, 0xC0, 0x22, 0x38, 0xFE, 0x80, 0xF8, + 0x5E, 0xF0, 0xCA, 0xCF, 0xE6, 0xCE, 0x92, 0xB5, 0xDB, 0xAD, 0xD7, 0xB0, + 0xCC, 0xA8, 0x72, 0xB4, 0x0A, 0xBF, 0x16, 0xC2, 0x0B, 0xDD, 0xDF, 0xD1, + 0xC3, 0xEE, 0x2F, 0xDE, 0xF0, 0xED, 0x13, 0xF3, 0x65, 0xEE, 0x54, 0xFA, + 0x1A, 0xF6, 0x33, 0xE9, 0xA7, 0xF2, 0x93, 0xD8, 0x86, 0xE1, 0x7A, 0xCF, + 0x64, 0xD8, 0x68, 0xCC, 0xE2, 0xED, 0x72, 0xDC, 0xD7, 0xFD, 0x94, 0xF0, + 0x78, 0xF4, 0x6A, 0xF9, 0xFD, 0xF0, 0x3F, 0x09, 0x2B, 0xF4, 0x83, 0x1E, + 0xBD, 0xF4, 0xB0, 0x1F, 0xAF, 0xFC, 0x84, 0x1D, 0x4A, 0x02, 0x7C, 0x1D, + 0xD3, 0xFE, 0xAD, 0x0B, 0x16, 0xEF, 0x73, 0xEE, 0x6B, 0xD6, 0x46, 0xDA, + 0x6D, 0xC5, 0xE2, 0xCA, 0x2F, 0xCB, 0x0E, 0xBC, 0x24, 0xEA, 0x7D, 0xC6, + 0x77, 0x0B, 0x64, 0xE9, 0xC0, 0x1F, 0x82, 0x12, 0xAD, 0x37, 0xB6, 0x3E, + 0xBF, 0x4E, 0xBC, 0x56, 0x51, 0x4E, 0xB0, 0x4A, 0x25, 0x42, 0x47, 0x36, + 0xED, 0x2A, 0x2A, 0x1A, 0x24, 0x13, 0x21, 0xFE, 0x6D, 0xFA, 0x78, 0xDF, + 0xCA, 0xDB, 0xED, 0xBA, 0x84, 0xCB, 0x06, 0xAF, 0xD2, 0xCD, 0xA7, 0xC7, + 0x17, 0xDD, 0x92, 0xF1, 0x18, 0xF0, 0xB7, 0x08, 0xD4, 0x04, 0xF3, 0x10, + 0x38, 0x11, 0xC4, 0x0D, 0x7B, 0x0E, 0x86, 0x07, 0xBC, 0x02, 0xF8, 0x03, + 0x1A, 0xF5, 0x7E, 0xF9, 0x24, 0xEC, 0x6A, 0xEE, 0x9C, 0xED, 0x2F, 0xF1, + 0x60, 0xEA, 0x0A, 0xF9, 0x2A, 0xE6, 0xAB, 0xF7, 0x8F, 0xF8, 0x60, 0x04, + 0x58, 0x0A, 0x3F, 0x1F, 0x91, 0x11, 0xBC, 0x25, 0x6A, 0x1C, 0x1F, 0x1E, + 0x6D, 0x19, 0xB4, 0x19, 0x9A, 0x12, 0xAA, 0x13, 0x2A, 0x0E, 0x9A, 0x07, + 0x9E, 0xFE, 0x32, 0xEF, 0x9A, 0xE6, 0xF8, 0xC8, 0xF3, 0xDC, 0xFF, 0xB5, + 0xB7, 0xE5, 0x09, 0xCA, 0x67, 0xF1, 0xC1, 0xE3, 0x90, 0x04, 0x18, 0xFB, + 0xC5, 0x1E, 0xFF, 0x27, 0xD9, 0x39, 0xF8, 0x4F, 0xFF, 0x49, 0xCE, 0x57, + 0x7A, 0x4F, 0x66, 0x50, 0xB2, 0x46, 0xCB, 0x37, 0x68, 0x23, 0x87, 0x1A, + 0x28, 0xED, 0x05, 0xFE, 0x17, 0xBF, 0x41, 0xDA, 0x7A, 0xA5, 0xC8, 0xCB, + 0xDE, 0xAA, 0x7D, 0xD4, 0x01, 0xC8, 0x07, 0xE0, 0xCD, 0xE3, 0x12, 0xF0, + 0x6F, 0x00, 0x00, 0x01, 0x92, 0x15, 0x72, 0xFF, 0x8F, 0x1E, 0x89, 0xF2, + 0xC9, 0x1C, 0xB4, 0xEF, 0x93, 0x0B, 0xE7, 0xEE, 0xAF, 0xF2, 0xBF, 0xE5, + 0xFE, 0xEA, 0x73, 0xE8, 0xB5, 0xF3, 0xD2, 0xEA, 0xF8, 0xEB, 0x91, 0xE3, + 0x0B, 0xD6, 0xBB, 0xEA, 0x49, 0xE2, 0x76, 0xFD, 0xDD, 0xFE, 0xF9, 0x06, + 0x55, 0x0D, 0x90, 0x11, 0x03, 0x14, 0x64, 0x16, 0xF9, 0x0D, 0xD9, 0x0B, + 0x41, 0x02, 0xE7, 0x01, 0xFD, 0xF6, 0x4E, 0xE7, 0xB4, 0xE2, 0x50, 0xC0, + 0x82, 0xCA, 0xCE, 0xAA, 0x7A, 0xCE, 0x82, 0xB7, 0x66, 0xD8, 0x55, 0xDB, + 0x09, 0xDC, 0x06, 0xF8, 0x11, 0xFD, 0xBE, 0x15, 0x9B, 0x23, 0xAF, 0x39, + 0x06, 0x31, 0xCF, 0x48, 0x16, 0x29, 0xB0, 0x3A, 0x95, 0x0F, 0x2D, 0x19, + 0x9C, 0xFB, 0x6C, 0xF5, 0x54, 0xEC, 0x17, 0xD3, 0xBA, 0xCB, 0x96, 0xB2, + 0xD5, 0xA9, 0x22, 0xA9, 0xFE, 0xA5, 0x14, 0xB1, 0xBD, 0xBC, 0xB2, 0xC6, + 0x00, 0xD1, 0x96, 0xDC, 0xD6, 0xEA, 0x1F, 0xE8, 0x02, 0xF8, 0x0A, 0xED, + 0x73, 0xF1, 0x51, 0xF0, 0x18, 0xF4, 0x08, 0xF1, 0x7C, 0xFA, 0x36, 0xE0, + 0x36, 0xFC, 0x04, 0xC6, 0x2B, 0xFF, 0x8B, 0xBE, 0xE6, 0xF8, 0x01, 0xD0, + 0x72, 0xE9, 0x37, 0xEA, 0xBE, 0xE2, 0x13, 0xFC, 0x46, 0xF2, 0x01, 0x0A, + 0xF8, 0x01, 0xC8, 0x22, 0x3C, 0xFA, 0x83, 0x33, 0xA4, 0xFE, 0xA0, 0x3B, + 0xB8, 0x08, 0xAA, 0x38, 0xB2, 0x04, 0xD9, 0x1B, 0x26, 0x02, 0x0C, 0xF5, + 0x16, 0xF7, 0x74, 0xD0, 0xD4, 0xE7, 0x34, 0xBB, 0x40, 0xEE, 0x1F, 0xC6, + 0xE3, 0xFE, 0xD5, 0xE3, 0x1C, 0x0E, 0xE3, 0x01, 0xE1, 0x1C, 0x87, 0x1C, + 0xBE, 0x38, 0xC0, 0x3D, 0x5A, 0x56, 0x0A, 0x59, 0x56, 0x5E, 0x15, 0x5C, + 0x11, 0x59, 0x29, 0x55, 0xCF, 0x3B, 0x88, 0x3D, 0x59, 0x1B, 0xD6, 0x1F, + 0x2A, 0xFD, 0xB3, 0x03, 0xFE, 0xE4, 0x9C, 0xEB, 0x17, 0xE2, 0xC7, 0xE0, + 0x9F, 0xF0, 0x62, 0xED, 0xE2, 0x04, 0xAA, 0x0A, 0x34, 0x14, 0x09, 0x23, + 0x8C, 0x24, 0xFC, 0x3A, 0x3B, 0x31, 0x0D, 0x40, 0xC1, 0x44, 0x7C, 0x38, + 0xDF, 0x52, 0xCC, 0x32, 0x3C, 0x46, 0x3D, 0x28, 0x3F, 0x30, 0xE5, 0x19, + 0xF6, 0x33, 0xF3, 0x16, 0xED, 0x37, 0x73, 0x1B, 0x99, 0x23, 0x37, 0x1E, + 0xDF, 0x1E, 0x31, 0x2F, 0x7B, 0x2F, 0x6D, 0x4F, 0x6C, 0x37, 0x71, 0x5A, + 0x83, 0x38, 0xDD, 0x55, 0xCC, 0x37, 0xBE, 0x58, 0xAE, 0x35, 0x2F, 0x4E, + 0x78, 0x2A, 0xD5, 0x2D, 0xE3, 0x10, 0xEF, 0x0B, 0xD0, 0xF5, 0xEC, 0xEF, + 0x4D, 0xE6, 0xE8, 0xD4, 0x04, 0xEE, 0xA1, 0xD6, 0xE8, 0xF8, 0x31, 0xF5, + 0xC3, 0x0C, 0x5E, 0x12, 0xDC, 0x2C, 0xD9, 0x31, 0x0E, 0x4C, 0x46, 0x55, + 0x2A, 0x57, 0x20, 0x5D, 0x09, 0x46, 0x72, 0x4F, 0x18, 0x34, 0x55, 0x3B, + 0xED, 0x1A, 0x72, 0x1A, 0xAB, 0xF9, 0x63, 0xF8, 0x89, 0xD7, 0x33, 0xD3, + 0x73, 0xC5, 0x11, 0xC1, 0xBC, 0xCE, 0xCA, 0xCE, 0x39, 0xDB, 0x8A, 0xE0, + 0x92, 0xE9, 0xFE, 0xF0, 0xA6, 0xFA, 0x32, 0x03, 0x78, 0x05, 0x50, 0x04, + 0xA9, 0x11, 0x67, 0xFC, 0x49, 0x1E, 0x88, 0xFB, 0x33, 0x1E, 0x42, 0xF4, + 0x4D, 0x03, 0x9B, 0xDF, 0xD0, 0xE8, 0x6E, 0xDF, 0x42, 0xE8, 0x23, 0xF1, + 0xEE, 0xE8, 0xD6, 0xEE, 0x9C, 0xE8, 0x39, 0xE9, 0xD1, 0xFC, 0x6F, 0x00, + 0x77, 0x0E, 0x5B, 0x1F, 0x56, 0x03, 0x24, 0x27, 0xCE, 0xFE, 0xB4, 0x24, + 0x53, 0x01, 0x1C, 0x19, 0xEC, 0xE9, 0x44, 0x07, 0x87, 0xCC, 0xF7, 0xEF, + 0xFB, 0xBE, 0xAB, 0xCE, 0xFA, 0xBB, 0x7D, 0xB8, 0xCD, 0xC7, 0x46, 0xB2, + 0x2D, 0xDE, 0x4F, 0xC0, 0xB8, 0xE5, 0x17, 0xE1, 0xB7, 0xF4, 0x3F, 0x08, + 0x5F, 0x17, 0xCC, 0x31, 0xF4, 0x29, 0x2E, 0x42, 0xC0, 0x21, 0x08, 0x2F, + 0x2C, 0x08, 0x25, 0x0F, 0xED, 0xE9, 0x2C, 0xEA, 0x9D, 0xD1, 0x5E, 0xC4, + 0xFD, 0xBC, 0xAF, 0xA3, 0x10, 0xAB, 0x18, 0x9F, 0x89, 0xAB, 0xA3, 0xB1, + 0xB7, 0xBF, 0x8C, 0xC1, 0x1F, 0xD0, 0x89, 0xCF, 0x79, 0xE9, 0xD6, 0xE3, + 0xEA, 0x00, 0xE6, 0xF3, 0xAB, 0x01, 0xB7, 0xFB, 0x8D, 0x03, 0xEE, 0xFB, + 0xF5, 0x07, 0xA8, 0xF1, 0xAF, 0xFA, 0x2B, 0xE4, 0xA5, 0xE5, 0xD9, 0xD7, + 0x5F, 0xE7, 0xFF, 0xD9, 0xED, 0xEA, 0x43, 0xE2, 0x1C, 0xE0, 0x1F, 0xE4, + 0x33, 0xF3, 0x12, 0xF3, 0x9F, 0x12, 0x2D, 0x09, 0xCC, 0x12, 0xE5, 0x10, + 0xBE, 0x03, 0xBE, 0x18, 0x1C, 0xFB, 0x9E, 0x27, 0x92, 0xF3, 0xCF, 0x1C, + 0x24, 0xF1, 0x88, 0xF2, 0xF4, 0xEA, 0xC5, 0xC7, 0xFB, 0xCE, 0x23, 0xB1, + 0xC9, 0xC1, 0xF0, 0xB8, 0xB7, 0xCF, 0xA9, 0xD5, 0x3B, 0xE8, 0x65, 0xF8, + 0x2A, 0x0C, 0x4F, 0x18, 0x4F, 0x32, 0x70, 0x34, 0x46, 0x4E, 0xC7, 0x50, + 0xDF, 0x47, 0x85, 0x57, 0x54, 0x36, 0x95, 0x44, 0xEF, 0x25, 0x3F, 0x1E, + 0x73, 0x02, 0xF3, 0xF5, 0xF2, 0xE1, 0xBF, 0xDB, 0x36, 0xC6, 0x85, 0xC6, + 0x8E, 0xB8, 0xEA, 0xC2, 0x47, 0xC7, 0xA2, 0xD2, 0xF0, 0xD8, 0x2F, 0xE2, + 0x4A, 0xF6, 0x11, 0xF5, 0x7D, 0x1B, 0x85, 0x08, 0x49, 0x36, 0x83, 0x12, + 0x8F, 0x41, 0x3A, 0x1A, 0x55, 0x2F, 0x1C, 0x15, 0x77, 0x12, 0x8D, 0x03, + 0xFE, 0xFB, 0xBB, 0xF9, 0x7C, 0xF7, 0xCD, 0xF9, 0xBB, 0xFF, 0x96, 0xF2, + 0x2C, 0xFE, 0x0D, 0xE7, 0x29, 0x04, 0x87, 0xF0, 0xF9, 0x0D, 0x9D, 0x12, + 0x99, 0xFE, 0xB7, 0x2A, 0xF5, 0x00, 0xD7, 0x2E, 0x2B, 0x1E, 0x8F, 0x26, + 0x28, 0x27, 0x48, 0x14, 0x91, 0x10, 0xA9, 0xFF, 0x61, 0xF0, 0x00, 0xEB, + 0xA2, 0xDB, 0x14, 0xD8, 0x81, 0xCC, 0x79, 0xC6, 0xD0, 0xD0, 0x94, 0xC9, + 0x90, 0xE6, 0x4F, 0xE9, 0x74, 0xFD, 0x41, 0x0B, 0xDF, 0x20, 0xD2, 0x2E, + 0xD4, 0x41, 0x4C, 0x54, 0x21, 0x4E, 0x71, 0x59, 0xD9, 0x4B, 0x15, 0x42, + 0xF8, 0x38, 0x63, 0x2E, 0x12, 0x14, 0x57, 0x19, 0xFD, 0xEB, 0xCB, 0xF4, + 0xAF, 0xD0, 0xA5, 0xCE, 0x4C, 0xBD, 0x53, 0xBB, 0xB2, 0xBD, 0x22, 0xC3, + 0x7B, 0xD6, 0xEF, 0xD9, 0xB3, 0xEE, 0x3B, 0xE6, 0xFF, 0x05, 0x7E, 0xEE, + 0x98, 0x11, 0xE9, 0xF0, 0xF2, 0x12, 0x68, 0xEF, 0x01, 0x0D, 0xC8, 0xF4, + 0x1E, 0xFD, 0xB6, 0xF1, 0x07, 0xF2, 0x1D, 0xE6, 0x8C, 0xEF, 0x85, 0xE2, + 0x86, 0xF4, 0x22, 0xE6, 0x4E, 0xED, 0x28, 0xE5, 0x2F, 0xDB, 0x67, 0xEE, + 0xA7, 0xE1, 0xE7, 0x0F, 0xCB, 0xF4, 0xF1, 0x20, 0x65, 0xFA, 0x4E, 0x16, + 0xFC, 0x00, 0xD2, 0x14, 0xE6, 0x0A, 0x73, 0x0C, 0x2B, 0x05, 0x4A, 0xF1, + 0xCE, 0xEE, 0xE0, 0xD3, 0x87, 0xDB, 0x01, 0xBA, 0xCD, 0xCD, 0xBB, 0xAE, + 0x06, 0xD0, 0x11, 0xB7, 0x58, 0xE9, 0x89, 0xC9, 0x4A, 0xFB, 0x4C, 0xE9, + 0x5D, 0x07, 0xF8, 0x19, 0xB1, 0x22, 0x34, 0x46, 0xD7, 0x2C, 0x2D, 0x50, + 0x21, 0x1C, 0x6A, 0x3F, 0xB0, 0x0B, 0xC9, 0x21, 0xC5, 0xF8, 0x10, 0xFB, + 0xD9, 0xE0, 0xC4, 0xE1, 0x5B, 0xCA, 0x5A, 0xCB, 0xF8, 0xC1, 0xFB, 0xB8, + 0x74, 0xC7, 0x37, 0xC1, 0x05, 0xCF, 0x06, 0xD6, 0x6E, 0xCC, 0xE7, 0xE7, + 0xEF, 0xD2, 0xDF, 0xF6, 0xED, 0xEE, 0x53, 0xFA, 0xFF, 0xF8, 0x38, 0xF3, + 0xD2, 0xEB, 0x2D, 0xED, 0xEF, 0xEF, 0x13, 0xE8, 0xDD, 0xFB, 0x8D, 0xDA, + 0x0B, 0xFB, 0x9A, 0xD2, 0xB5, 0xFD, 0x0F, 0xDE, 0x2A, 0xFD, 0xC7, 0xEC, + 0x6A, 0xEB, 0xB4, 0xF4, 0xCF, 0xE4, 0x72, 0x04, 0xD0, 0xF2, 0x82, 0x1B, + 0x9F, 0xF9, 0xEF, 0x23, 0x7B, 0xFE, 0xCB, 0x23, 0xA9, 0x0A, 0xBE, 0x21, + 0x9E, 0x09, 0xC9, 0x12, 0x4A, 0xFF, 0xD0, 0xF4, 0x1D, 0xF9, 0x6D, 0xD1, + 0x3F, 0xED, 0xE7, 0xB3, 0x07, 0xEC, 0x36, 0xB4, 0x34, 0xFF, 0x2F, 0xD5, + 0xFC, 0x16, 0xBF, 0xFD, 0x8F, 0x36, 0xF1, 0x2A, 0xA7, 0x57, 0xA2, 0x52, + 0xE9, 0x5F, 0xDA, 0x5E, 0x3E, 0x4F, 0x48, 0x5D, 0x31, 0x3F, 0x0E, 0x59, + 0x07, 0x31, 0x74, 0x3E, 0x99, 0x1F, 0x97, 0x1B, 0x3E, 0x01, 0xA4, 0xF8, + 0x24, 0xE2, 0xDE, 0xDF, 0xD1, 0xDB, 0x3A, 0xED, 0x4F, 0xF2, 0x0E, 0x0B, + 0x2D, 0x12, 0x1F, 0x10, 0x32, 0x2E, 0x0F, 0x14, 0x9F, 0x3D, 0x40, 0x2E, + 0x71, 0x3A, 0x01, 0x42, 0xFE, 0x35, 0xB5, 0x45, 0x2B, 0x38, 0xF5, 0x42, + 0xA4, 0x33, 0xFD, 0x2F, 0xB5, 0x2A, 0xF7, 0x18, 0x98, 0x29, 0xFA, 0x16, + 0xD8, 0x29, 0x0C, 0x1A, 0xA6, 0x1F, 0xAB, 0x1A, 0x7A, 0x1B, 0xC1, 0x24, + 0xCA, 0x2C, 0x01, 0x35, 0x22, 0x39, 0x6D, 0x43, 0x26, 0x3A, 0x1D, 0x55, + 0xF1, 0x3B, 0x2A, 0x5C, 0xB4, 0x38, 0x77, 0x49, 0x56, 0x29, 0xE3, 0x25, + 0xC7, 0x15, 0x4E, 0x00, 0x0A, 0x03, 0x29, 0xE7, 0x21, 0xFB, 0x62, 0xDB, + 0xB3, 0x0C, 0x15, 0xE1, 0xB7, 0x25, 0x41, 0xF9, 0x03, 0x34, 0x9D, 0x1C, + 0x07, 0x42, 0xFF, 0x43, 0x8A, 0x51, 0x9D, 0x5C, 0x77, 0x50, 0x65, 0x57, + 0x0F, 0x4A, 0xE0, 0x44, 0x7E, 0x36, 0xF6, 0x2E, 0x3D, 0x11, 0xDE, 0x17, + 0x63, 0xEE, 0x60, 0xFC, 0x57, 0xCC, 0x1C, 0xDE, 0x3D, 0xBD, 0x20, 0xD0, + 0x9D, 0xCD, 0x6E, 0xD5, 0xE2, 0xDE, 0x74, 0xE5, 0xE3, 0xE7, 0x88, 0xF6, + 0x23, 0xF9, 0xDA, 0x03, 0xC3, 0x0A, 0x93, 0x04, 0x51, 0x14, 0x0F, 0xF9, + 0xA8, 0x17, 0x1F, 0xF9, 0x85, 0x0F, 0xC5, 0xFD, 0x8C, 0xFD, 0xBB, 0xEE, + 0x85, 0xF9, 0xDE, 0xE0, 0xF4, 0xF7, 0x7F, 0xDF, 0xBF, 0xE8, 0xDA, 0xDD, + 0x20, 0xEA, 0x45, 0xE7, 0x22, 0xF3, 0x4F, 0xFF, 0xA7, 0xF3, 0x4F, 0x0D, + 0x9A, 0xFD, 0x6D, 0x0D, 0x30, 0x06, 0x5C, 0x12, 0xE8, 0x03, 0xB6, 0x15, + 0x8B, 0xFA, 0xD0, 0x09, 0x25, 0xEC, 0xBA, 0xEB, 0xAD, 0xE3, 0x1C, 0xBF, + 0x9D, 0xE1, 0xBF, 0x9E, 0x28, 0xE0, 0x58, 0xA9, 0x40, 0xE1, 0x5C, 0xC9, + 0x28, 0xEC, 0x4A, 0xE7, 0x5E, 0xFE, 0x54, 0x10, 0x38, 0x0E, 0xC2, 0x35, + 0x17, 0x0E, 0x29, 0x35, 0x8F, 0x06, 0x1D, 0x21, 0xCB, 0xFF, 0xF0, 0x0E, + 0x52, 0xE3, 0x5B, 0xE9, 0x75, 0xB8, 0xD9, 0xC4, 0x7C, 0x9E, 0x9F, 0xB3, + 0xE1, 0x9F, 0x5F, 0xA8, 0x6D, 0xAE, 0xB3, 0xAB, 0xB3, 0xC5, 0xFA, 0xBF, + 0x24, 0xDE, 0x0B, 0xD8, 0x38, 0xEC, 0xAE, 0xEF, 0x2E, 0xF6, 0xCE, 0xFB, + 0x8E, 0xFE, 0x1D, 0xF7, 0xA8, 0x02, 0x25, 0xEF, 0x96, 0xFB, 0x6F, 0xE3, + 0xFE, 0xEA, 0xE8, 0xD5, 0x12, 0xE6, 0x77, 0xDA, 0x8D, 0xF1, 0x8A, 0xE7, + 0xFC, 0xF3, 0x05, 0xE2, 0xDA, 0xE7, 0xEA, 0xE5, 0x73, 0xE4, 0xC8, 0x07, + 0x02, 0xEA, 0xEA, 0x20, 0x58, 0xF2, 0x0A, 0x26, 0xAD, 0x00, 0x2C, 0x2A, + 0x69, 0x09, 0x31, 0x2C, 0x3E, 0x05, 0x71, 0x22, 0x98, 0xFA, 0x5C, 0x06, + 0xFB, 0xE9, 0x2D, 0xDD, 0xD8, 0xD9, 0xDA, 0xBF, 0xD0, 0xDE, 0xFC, 0xC0, + 0x74, 0xED, 0xF6, 0xD6, 0x1B, 0xEF, 0x1A, 0xF0, 0xCA, 0x03, 0xBC, 0x17, + 0xE5, 0x34, 0x71, 0x44, 0x01, 0x4F, 0xC3, 0x54, 0xA8, 0x45, 0x7E, 0x48, + 0x99, 0x35, 0x0C, 0x37, 0xEF, 0x16, 0x63, 0x19, 0x85, 0xEE, 0x6D, 0xEF, + 0x81, 0xC9, 0x02, 0xCC, 0x2D, 0xB3, 0x5A, 0xB5, 0x5E, 0xBA, 0x5E, 0xB9, + 0x7F, 0xD2, 0xA4, 0xD5, 0xDD, 0xE9, 0x47, 0xF1, 0x5B, 0x01, 0xD3, 0x00, + 0x63, 0x19, 0xA5, 0x04, 0x94, 0x21, 0x79, 0x06, 0xE3, 0x1F, 0xA1, 0x0C, + 0x69, 0x1A, 0x30, 0x0A, 0x24, 0x14, 0xA4, 0xFD, 0x5F, 0x17, 0x83, 0xF3, + 0x80, 0x10, 0x17, 0xF5, 0x5A, 0xF5, 0x63, 0xFA, 0xA1, 0xE2, 0xDA, 0xFD, + 0x76, 0xEB, 0x1F, 0x07, 0x6C, 0x03, 0xBE, 0x11, 0x03, 0x0E, 0x5E, 0x1B, + 0x3A, 0x08, 0x58, 0x26, 0xAF, 0x08, 0x43, 0x2A, 0x1E, 0x0E, 0xBB, 0x1E, + 0x8F, 0x06, 0x31, 0x01, 0x1B, 0xEE, 0x0D, 0xD7, 0x75, 0xD8, 0xAC, 0xB4, + 0x21, 0xD5, 0xC5, 0xB2, 0x81, 0xDE, 0x9B, 0xD0, 0x99, 0xEA, 0x95, 0xEF, + 0x04, 0x03, 0x72, 0x11, 0x69, 0x29, 0x62, 0x3B, 0xE9, 0x43, 0x8B, 0x58, + 0x2B, 0x43, 0xDF, 0x5C, 0xBD, 0x37, 0x8A, 0x45, 0xB1, 0x1F, 0xC3, 0x14, + 0xFD, 0xF6, 0xD9, 0xE7, 0x1A, 0xD4, 0x82, 0xCC, 0x6A, 0xBD, 0x27, 0xB9, + 0xC2, 0xB5, 0xD7, 0xBE, 0x53, 0xC3, 0x2D, 0xD7, 0xBE, 0xD8, 0x88, 0xEC, + 0x1B, 0xE4, 0xF5, 0xFD, 0xAF, 0xED, 0x04, 0x0A, 0xA3, 0x02, 0xBB, 0x0A, + 0xA4, 0x1F, 0xE0, 0x03, 0x41, 0x2D, 0x43, 0xF4, 0xE9, 0x20, 0x55, 0xDF, + 0xFA, 0x0D, 0xEC, 0xDE, 0x06, 0x05, 0x75, 0xF0, 0x9D, 0xFC, 0x9B, 0xEF, + 0xA1, 0xEB, 0xE5, 0xE2, 0x54, 0xEA, 0x53, 0xE9, 0x63, 0xFB, 0x5B, 0x04, + 0x13, 0xFC, 0xA4, 0x1A, 0xDB, 0xF6, 0xC6, 0x1C, 0xD7, 0xFD, 0xF1, 0x16, + 0x44, 0x00, 0xCA, 0x0C, 0x00, 0xFD, 0x46, 0xF8, 0x1B, 0xEE, 0x46, 0xD7, + 0x6D, 0xD2, 0x30, 0xB6, 0xC5, 0xC2, 0x83, 0xAB, 0xA7, 0xC6, 0x22, 0xBD, + 0xC1, 0xCF, 0x69, 0xDF, 0x27, 0xE3, 0x94, 0x0E, 0xDE, 0x04, 0x36, 0x3E, + 0xA7, 0x1F, 0xCA, 0x56, 0xB3, 0x2A, 0xE3, 0x4C, 0xE7, 0x24, 0xA5, 0x2E, + 0xD5, 0x07, 0x4B, 0x10, 0x6B, 0xEC, 0x0A, 0xEC, 0x58, 0xDD, 0x78, 0xC6, + 0xAE, 0xBC, 0x41, 0xA9, 0xD7, 0xA2, 0x15, 0x9F, 0x87, 0xAF, 0xC5, 0xB1, + 0x31, 0xCA, 0x09, 0xD1, 0x5A, 0xDE, 0x38, 0xEA, 0x8A, 0xF0, 0x21, 0xFB, + 0x6F, 0x00, 0x2A, 0x02, 0x51, 0x12, 0x33, 0x00, 0x65, 0x21, 0xD0, 0xF7, + 0x60, 0x14, 0xDD, 0xE5, 0xCB, 0xF8, 0x25, 0xD1, 0xE2, 0xF2, 0x0E, 0xD4, + 0x8D, 0xF3, 0xDF, 0xDF, 0x4E, 0xE5, 0x81, 0xD6, 0xA4, 0xE0, 0x88, 0xD7, + 0x36, 0xF2, 0x74, 0xFB, 0x80, 0xF9, 0x7E, 0x18, 0xC8, 0xF1, 0xCD, 0x21, + 0xFE, 0xF5, 0xCB, 0x2D, 0x90, 0x05, 0xEB, 0x26, 0xB3, 0x0E, 0x77, 0x0C, + 0x11, 0x02, 0xB8, 0xEF, 0xA5, 0xEB, 0x0D, 0xCF, 0x0F, 0xED, 0x4D, 0xC3, + 0x32, 0x01, 0x61, 0xD6, 0x12, 0x09, 0x4F, 0xEB, 0xCE, 0x0A, 0x05, 0x07, + 0x2A, 0x24, 0x14, 0x38, 0x9B, 0x49, 0x45, 0x5A, 0x1F, 0x5A, 0x9E, 0x5C, + 0xB9, 0x58, 0x42, 0x54, 0xBD, 0x4B, 0x93, 0x46, 0x26, 0x2E, 0xCA, 0x2A, + 0x13, 0x12, 0x3A, 0x0C, 0x5B, 0xFB, 0x12, 0xED, 0x5F, 0xEE, 0x6C, 0xD7, + 0xC4, 0xF5, 0x9A, 0xE6, 0x1D, 0x03, 0x26, 0x09, 0x9C, 0x12, 0x6A, 0x23, + 0x5B, 0x2C, 0xF1, 0x37, 0xA5, 0x43, 0x2F, 0x4B, 0xE7, 0x46, 0x28, 0x5A, + 0xE6, 0x40, 0xBF, 0x58, 0x49, 0x37, 0xF6, 0x43, 0x7A, 0x21, 0x60, 0x31, + 0x82, 0x1A, 0x57, 0x31, 0x2C, 0x27, 0xD3, 0x33, 0xB4, 0x27, 0x54, 0x27, + 0x17, 0x20, 0x8D, 0x22, 0xB0, 0x24, 0xE8, 0x36, 0x2D, 0x31, 0x52, 0x46, + 0x85, 0x34, 0x32, 0x3C, 0xB9, 0x31, 0xB9, 0x31, 0x17, 0x29, 0x4A, 0x31, + 0xCF, 0x1D, 0x2A, 0x32, 0x4B, 0x17, 0xFF, 0x23, 0x6F, 0x0A, 0xF0, 0xF9, + 0xB8, 0xFB, 0xC3, 0xD1, 0x78, 0xFD, 0xF9, 0xD2, 0x48, 0x09, 0x0C, 0xF2, + 0x58, 0x16, 0x7B, 0x08, 0x1D, 0x2F, 0x0B, 0x21, 0xEB, 0x4C, 0x62, 0x47, + 0x8C, 0x5A, 0xB3, 0x5D, 0x7B, 0x50, 0x4C, 0x59, 0x5C, 0x3D, 0x38, 0x49, + 0xB5, 0x2B, 0x4B, 0x2D, 0x25, 0x16, 0xD3, 0x08, 0xB2, 0xEE, 0x5F, 0xDE, + 0x50, 0xC4, 0x65, 0xB8, 0x66, 0xBB, 0x50, 0xBB, 0xA2, 0xCE, 0xEF, 0xDD, + 0x6C, 0xE5, 0xBE, 0xF2, 0xD7, 0xFA, 0x33, 0xF5, 0x3F, 0x12, 0x12, 0xFB, + 0xA8, 0x23, 0xCC, 0x03, 0xB3, 0x22, 0x0B, 0x03, 0x6F, 0x0E, 0x70, 0xF9, + 0x58, 0xF6, 0x07, 0xE8, 0x3D, 0xF0, 0x32, 0xE3, 0x43, 0xF5, 0xD8, 0xFA, + 0xB9, 0xE9, 0x60, 0x06, 0xB4, 0xD9, 0xB5, 0xFB, 0x22, 0xE4, 0xA8, 0xF7, + 0xCE, 0xFC, 0xBB, 0xFF, 0xCC, 0xF6, 0x3F, 0x05, 0x8D, 0xEA, 0xB0, 0x08, + 0x29, 0xF9, 0xD1, 0x09, 0x6C, 0x03, 0x7F, 0xFF, 0xC6, 0xFB, 0xE8, 0xE9, + 0x5F, 0xE7, 0xC2, 0xCD, 0x40, 0xCA, 0xBC, 0xB5, 0x30, 0xC2, 0x1F, 0xB1, + 0x8B, 0xD7, 0x32, 0xC0, 0xE7, 0xE9, 0x5D, 0xD5, 0x87, 0xF9, 0x3C, 0xF6, + 0xF0, 0x1B, 0xE9, 0x26, 0x87, 0x38, 0xB0, 0x53, 0xD9, 0x31, 0x4E, 0x58, + 0x39, 0x1F, 0xD6, 0x2E, 0x16, 0x0D, 0x05, 0x02, 0xBB, 0xF4, 0x92, 0xE4, + 0x98, 0xD6, 0xCA, 0xC7, 0x1D, 0xB0, 0xA7, 0xAA, 0x11, 0x9C, 0x99, 0xA2, + 0x05, 0xAE, 0x25, 0xB9, 0x54, 0xCC, 0xFD, 0xD9, 0x30, 0xDD, 0x8D, 0xF3, + 0x3B, 0xED, 0x66, 0x00, 0x6D, 0x03, 0x64, 0xFE, 0xF9, 0x0D, 0x52, 0xF9, + 0xE4, 0x09, 0x7E, 0xF2, 0xC1, 0xF5, 0x15, 0xE3, 0xF3, 0xE2, 0x24, 0xDF, + 0xD3, 0xEC, 0x86, 0xEF, 0x8E, 0xEE, 0x2F, 0xF0, 0xE6, 0xDC, 0x63, 0xE1, + 0x95, 0xE0, 0xC4, 0xE8, 0xD9, 0xF2, 0xE2, 0x0C, 0xCD, 0xF5, 0x05, 0x26, + 0x62, 0xF5, 0xE6, 0x21, 0xA4, 0xFA, 0x5E, 0x1A, 0x37, 0xFD, 0x80, 0x16, + 0xE3, 0x03, 0xDD, 0x0A, 0x93, 0xFE, 0xCB, 0xEB, 0xD2, 0xE4, 0x39, 0xC3, + 0xFA, 0xDB, 0x35, 0xB0, 0x6F, 0xF0, 0x04, 0xBE, 0x0B, 0x07, 0xD9, 0xD6, + 0x8E, 0x16, 0xBD, 0xEF, 0x56, 0x28, 0x0E, 0x18, 0x57, 0x40, 0xEF, 0x49, + 0xF1, 0x45, 0x3D, 0x5F, 0x1C, 0x32, 0xFF, 0x49, 0x25, 0x1E, 0x81, 0x23, + 0xD5, 0x04, 0x2A, 0xFC, 0x88, 0xE4, 0x54, 0xDD, 0x29, 0xC4, 0xE7, 0xC6, + 0xAC, 0xB0, 0x04, 0xBB, 0x4D, 0xB9, 0x57, 0xC4, 0x5D, 0xD2, 0x24, 0xDA, + 0xB3, 0xE5, 0xD6, 0xEB, 0xE0, 0xF4, 0xA0, 0xFD, 0x80, 0x0A, 0x72, 0x0F, + 0xE5, 0x20, 0x1A, 0x18, 0x57, 0x2A, 0x9D, 0x16, 0x09, 0x1B, 0x6B, 0x0A, + 0xBE, 0x01, 0x6E, 0xF9, 0x33, 0x07, 0x9E, 0xF7, 0x67, 0x1B, 0x8B, 0xFB, + 0xA3, 0x0E, 0x52, 0xF3, 0x04, 0xF6, 0x2D, 0xF1, 0xF9, 0xFB, 0xB4, 0x00, + 0xC1, 0x0C, 0x75, 0x14, 0x2F, 0x04, 0x37, 0x20, 0x27, 0xF8, 0xAB, 0x28, + 0x27, 0xF8, 0x79, 0x28, 0x58, 0xF7, 0x2D, 0x1E, 0xBC, 0xEF, 0x21, 0x08, + 0xE1, 0xE2, 0xCD, 0xE7, 0x36, 0xDF, 0xA0, 0xCE, 0x85, 0xF3, 0xB6, 0xCE, + 0xF0, 0x02, 0x66, 0xE8, 0xF8, 0xFE, 0x18, 0x06, 0xCF, 0x0C, 0x1F, 0x20, + 0x33, 0x2F, 0x9B, 0x41, 0xF1, 0x40, 0xAD, 0x5A, 0xE5, 0x32, 0x44, 0x50, + 0x5E, 0x1B, 0x28, 0x3A, 0x94, 0x0A, 0x6D, 0x25, 0x97, 0x03, 0x08, 0x05, + 0xB5, 0xEC, 0x8E, 0xD8, 0x52, 0xC4, 0x2F, 0xB7, 0x2D, 0xB1, 0x8A, 0xBA, + 0xB6, 0xB9, 0x28, 0xD2, 0x26, 0xCF, 0xEF, 0xE0, 0x5B, 0xE8, 0xFB, 0xE5, + 0x7D, 0xFB, 0x05, 0xEB, 0x2C, 0x04, 0xA6, 0xF4, 0x19, 0x0E, 0x8F, 0xFF, + 0x85, 0x15, 0xCB, 0xFE, 0x3A, 0x0A, 0x90, 0xEA, 0x16, 0x07, 0xB1, 0xDD, + 0x78, 0x14, 0x91, 0xEC, 0x3E, 0x0D, 0x8A, 0xF2, 0xDE, 0xF9, 0xED, 0xED, + 0x6A, 0xF6, 0x1D, 0xFF, 0x5C, 0xFF, 0xBE, 0x12, 0x65, 0xFD, 0xBB, 0x0B, + 0x02, 0xF6, 0x0A, 0x03, 0xD0, 0xF1, 0xC0, 0x06, 0x4F, 0xE8, 0x2C, 0x08, + 0x17, 0xE3, 0x36, 0xFC, 0x0E, 0xE5, 0x84, 0xD8, 0x5E, 0xDD, 0x56, 0xB2, + 0x00, 0xD9, 0x44, 0xB5, 0x0A, 0xEC, 0x76, 0xD1, 0xFC, 0xFA, 0xC9, 0xDB, + 0x5A, 0xF9, 0x36, 0xEF, 0x5C, 0x04, 0x84, 0x1C, 0x29, 0x1F, 0x05, 0x42, + 0x85, 0x23, 0x3B, 0x46, 0xCF, 0x14, 0x7D, 0x2A, 0x1A, 0x04, 0x33, 0x06, + 0x8B, 0xEC, 0x81, 0xE6, 0x18, 0xD2, 0x41, 0xC5, 0xDD, 0xB0, 0x66, 0xA6, + 0x7A, 0xA1, 0xBC, 0xA0, 0xE4, 0xB4, 0x6B, 0xB0, 0xC1, 0xC9, 0x62, 0xC5, + 0x04, 0xCB, 0xA6, 0xDF, 0x81, 0xD2, 0xC0, 0xFA, 0xF0, 0xEC, 0x62, 0x06, + 0x4D, 0x05, 0xF0, 0x04, 0xA4, 0x0F, 0x1F, 0xF7, 0xE7, 0x08, 0xDE, 0xDC, + 0xDE, 0xFE, 0x89, 0xD9, 0xCE, 0x06, 0xA0, 0xF3, 0xD8, 0x08, 0xD6, 0xFB, + 0xBB, 0xF9, 0x6E, 0xF1, 0xD6, 0xF7, 0x46, 0xF6, 0x66, 0x05, 0x67, 0x0D, + 0x1D, 0x03, 0x5F, 0x1F, 0x08, 0xF7, 0x73, 0x1B, 0xD1, 0xFB, 0xF1, 0x15, + 0xA9, 0x02, 0x28, 0x19, 0x24, 0x00, 0x98, 0x14, 0x28, 0xF7, 0x04, 0xFF, + 0xFE, 0xE9, 0xEB, 0xDC, 0xA2, 0xEB, 0x7A, 0xC2, 0x79, 0x01, 0x48, 0xCB, + 0xD9, 0x12, 0x35, 0xED, 0x5E, 0x23, 0xD6, 0x11, 0xF3, 0x39, 0xBB, 0x38, + 0xFE, 0x4B, 0xF0, 0x58, 0x16, 0x4E, 0xF4, 0x5F, 0xB5, 0x3C, 0xC8, 0x53, + 0x7F, 0x2D, 0xE8, 0x46, 0x33, 0x20, 0xDA, 0x2E, 0x46, 0x0D, 0xD6, 0x0D, + 0x41, 0xF2, 0x24, 0xE9, 0x4B, 0xE1, 0xB8, 0xD0, 0x45, 0xEA, 0x4C, 0xDC, + 0x54, 0xFE, 0x96, 0xFC, 0x2B, 0x13, 0x7C, 0x1B, 0x03, 0x29, 0xD3, 0x33, + 0x1F, 0x3A, 0xE0, 0x3F, 0x3E, 0x47, 0x5C, 0x47, 0x86, 0x57, 0x63, 0x4B, + 0x71, 0x5B, 0x50, 0x3A, 0x1F, 0x4C, 0x28, 0x27, 0xE0, 0x46, 0x10, 0x33, + 0x3F, 0x4B, 0x55, 0x40, 0xE1, 0x40, 0xCA, 0x29, 0x40, 0x31, 0x7F, 0x10, + 0x37, 0x33, 0x8F, 0x17, 0x83, 0x36, 0x04, 0x2A, 0xCF, 0x26, 0x46, 0x2F, + 0xD8, 0x1C, 0xD0, 0x31, 0x84, 0x1B, 0xFA, 0x32, 0x38, 0x0E, 0x70, 0x2C, + 0xF8, 0xFB, 0x85, 0x1C, 0x25, 0xF3, 0xC7, 0xFB, 0xA3, 0xF4, 0x25, 0xDC, + 0xD5, 0x09, 0x02, 0xDE, 0x85, 0x22, 0xBE, 0xF7, 0x21, 0x23, 0x02, 0x11, + 0x3A, 0x27, 0x64, 0x2B, 0xB8, 0x45, 0xD2, 0x4A, 0x4A, 0x5A, 0xDF, 0x60, + 0x65, 0x47, 0x52, 0x54, 0x60, 0x2D, 0xD7, 0x36, 0x41, 0x16, 0x9C, 0x1E, + 0xA2, 0xFB, 0x36, 0x02, 0xA8, 0xE1, 0xB7, 0xDF, 0x1F, 0xCB, 0xC1, 0xC3, + 0x7C, 0xC8, 0x79, 0xBE, 0xCC, 0xD2, 0xEB, 0xC9, 0xC6, 0xDC, 0x1B, 0xDA, + 0x5F, 0xEB, 0x07, 0xEA, 0x00, 0x00, 0x24, 0xF2, 0x3C, 0x14, 0xF0, 0xF9, + 0x3D, 0x24, 0x38, 0x0D, 0xFE, 0x25, 0xC9, 0x1A, 0x6C, 0x12, 0xE1, 0x10, + 0x82, 0x0A, 0x05, 0x05, 0xE6, 0x0F, 0xA8, 0x07, 0x2D, 0xF6, 0xBA, 0x02, + 0x69, 0xD1, 0xCF, 0xF7, 0x86, 0xD8, 0x8D, 0xFF, 0xEA, 0xFD, 0x78, 0x0E, + 0x79, 0x0B, 0x98, 0x0D, 0x48, 0xFA, 0x24, 0x06, 0x50, 0xE7, 0xAF, 0x02, + 0xF4, 0xE1, 0xCA, 0xFB, 0x23, 0xE1, 0xFE, 0xEB, 0x7C, 0xD7, 0xF5, 0xCD, + 0x29, 0xC5, 0xD0, 0xA9, 0xD8, 0xC1, 0x05, 0xA6, 0xEA, 0xD6, 0xF6, 0xC7, + 0xFD, 0xE6, 0x3B, 0xE6, 0xB7, 0xEF, 0xA7, 0xFB, 0xD4, 0x0A, 0xFF, 0x14, + 0xB9, 0x30, 0x3B, 0x28, 0xD8, 0x2E, 0xC6, 0x2D, 0x45, 0x0D, 0xBF, 0x24, + 0x1C, 0xFB, 0xAF, 0x0A, 0xDA, 0xEE, 0x33, 0xE5, 0x47, 0xD9, 0x86, 0xC0, + 0xAF, 0xC0, 0xAF, 0xA0, 0x8C, 0xB0, 0x3E, 0x9A, 0x7C, 0xAC, 0xF1, 0xAC, + 0xEE, 0xB3, 0x76, 0xBC, 0xBA, 0xC2, 0xE0, 0xC9, 0x29, 0xD5, 0x7F, 0xDC, + 0xBD, 0xEB, 0xE2, 0xEB, 0xD9, 0x02, 0x46, 0xFA, 0x8C, 0x14, 0x4B, 0x00, + 0x85, 0x0E, 0x75, 0xEA, 0x5C, 0xF4, 0x51, 0xD8, 0x86, 0xE9, 0x91, 0xEC, + 0x6E, 0xEB, 0x1B, 0xFD, 0x1F, 0xE2, 0x7A, 0xF2, 0x27, 0xDA, 0x47, 0xF0, + 0xC3, 0xE2, 0xF4, 0x01, 0x21, 0xE8, 0xF3, 0x11, 0x51, 0xE8, 0xD2, 0x12, + 0xA8, 0xF1, 0x18, 0x09, 0x77, 0xFC, 0x2A, 0xFD, 0x48, 0x02, 0xE4, 0xEB, + 0xA8, 0x03, 0xF8, 0xD5, 0xE9, 0xEF, 0xB6, 0xC4, 0x07, 0xD5, 0xEB, 0xBD, + 0x40, 0xDF, 0xF2, 0xC6, 0xDF, 0xF9, 0x92, 0xDF, 0x3E, 0x05, 0x85, 0x00, + 0x57, 0x0E, 0x55, 0x23, 0x82, 0x22, 0xAD, 0x48, 0xEC, 0x31, 0x0D, 0x5E, + 0x49, 0x2D, 0x18, 0x4C, 0x89, 0x23, 0x8C, 0x2F, 0x1D, 0x1A, 0x15, 0x1C, + 0x90, 0x0C, 0xFD, 0xFF, 0xE9, 0xF1, 0x2C, 0xD8, 0xA1, 0xD6, 0x49, 0xBD, + 0x59, 0xD1, 0x50, 0xBF, 0x54, 0xDB, 0x63, 0xD2, 0xAA, 0xE9, 0x0F, 0xEF, + 0x3B, 0xF7, 0x39, 0x0A, 0x20, 0xFF, 0xF9, 0x0F, 0xCC, 0x0B, 0x9D, 0x0A, + 0xF9, 0x1E, 0xF4, 0x0F, 0x2B, 0x20, 0xE3, 0x13, 0x35, 0x0F, 0x8A, 0x0A, + 0x2D, 0x0C, 0xCB, 0x0C, 0xD3, 0x0F, 0x97, 0x15, 0xB7, 0xFE, 0x9E, 0x09, + 0x2A, 0xEC, 0x44, 0xFF, 0x8D, 0xF6, 0xBF, 0x0B, 0xAC, 0x06, 0xBB, 0x16, + 0xB7, 0xFE, 0xB3, 0x15, 0xFA, 0xF3, 0x0B, 0x14, 0x2F, 0xFF, 0x99, 0x0F, + 0xBD, 0x09, 0x00, 0x07, 0x75, 0xFF, 0x6A, 0xFA, 0x5C, 0xF5, 0x7B, 0xE4, + 0x02, 0xF3, 0x8D, 0xCF, 0xA3, 0xF8, 0xFF, 0xCD, 0x32, 0x09, 0x55, 0xDA, + 0x0E, 0x18, 0xA7, 0xED, 0xC3, 0x1E, 0x73, 0x0D, 0x24, 0x2B, 0x52, 0x37, + 0x86, 0x38, 0x8C, 0x59, 0x02, 0x32, 0x96, 0x57, 0xA7, 0x27, 0x03, 0x39, + 0x51, 0x19, 0x9E, 0x1B, 0xD4, 0xFB, 0xA5, 0xFF, 0x3D, 0xDF, 0x5D, 0xD9, + 0xFD, 0xD2, 0x76, 0xBB, 0xCD, 0xD3, 0x30, 0xBE, 0x3D, 0xD1, 0xF4, 0xC8, + 0xBB, 0xCD, 0x1F, 0xCD, 0xC1, 0xD9, 0x0F, 0xDC, 0x3E, 0xEE, 0x0A, 0xEC, + 0x15, 0xFB, 0x6E, 0xF0, 0x07, 0x04, 0x26, 0xF1, 0x75, 0x0A, 0xDC, 0xED, + 0x1F, 0x01, 0x6B, 0xE2, 0x92, 0xF5, 0x39, 0xE2, 0xDF, 0xFD, 0xBF, 0xF6, + 0x1C, 0x00, 0xC8, 0xFC, 0x84, 0xF0, 0x89, 0xEB, 0x39, 0xED, 0xB2, 0xE9, + 0x95, 0xF4, 0x9B, 0xFE, 0x43, 0xF6, 0x9E, 0x09, 0x3B, 0xFA, 0x11, 0x05, + 0xD7, 0x01, 0x6B, 0x06, 0xB6, 0x00, 0x4B, 0x0C, 0xEA, 0xF1, 0xC6, 0x00, + 0xFC, 0xE4, 0x9D, 0xE0, 0x83, 0xDF, 0xB7, 0xBB, 0x5F, 0xD6, 0xB8, 0xAB, + 0xC2, 0xD1, 0x33, 0xC5, 0xD8, 0xE1, 0x47, 0xF0, 0x87, 0xFC, 0x45, 0x0C, + 0x3B, 0x13, 0x65, 0x25, 0x28, 0x24, 0x92, 0x44, 0x7A, 0x1B, 0x66, 0x4D, + 0xAC, 0xFE, 0x7F, 0x3D, 0x68, 0xF0, 0x6A, 0x27, 0x18, 0xF0, 0xBC, 0x08, + 0x0A, 0xDD, 0x68, 0xE5, 0x42, 0xBD, 0x1F, 0xC5, 0x71, 0xB4, 0xC2, 0xB9, + 0x7B, 0xB9, 0x77, 0xC7, 0xD1, 0xBF, 0x28, 0xD3, 0x80, 0xCE, 0x17, 0xD4, + 0x43, 0xDE, 0xF9, 0xD2, 0x43, 0xE5, 0x48, 0xD3, 0xFC, 0xEB, 0x83, 0xDF, + 0x69, 0xF6, 0x67, 0xF5, 0x84, 0xFA, 0x75, 0xF8, 0x8A, 0xFB, 0x4F, 0xE5, + 0xD0, 0x04, 0x3D, 0xE5, 0x4D, 0x03, 0x03, 0xF7, 0xC0, 0xEB, 0xDD, 0xF8, + 0x55, 0xE0, 0x5B, 0xF8, 0xCC, 0xF2, 0xAA, 0x02, 0x31, 0x07, 0x9E, 0x0E, + 0x92, 0x09, 0x3B, 0x1E, 0xDC, 0x0D, 0x69, 0x2A, 0xC5, 0x1A, 0x18, 0x25, + 0x5D, 0x1B, 0x44, 0x11, 0x5C, 0x0F, 0x2C, 0xF8, 0xAC, 0xFE, 0x01, 0xE4, + 0x0E, 0xF5, 0xB6, 0xD6, 0xCB, 0x07, 0x63, 0xD6, 0xE2, 0x26, 0x64, 0xEA, + 0x75, 0x30, 0x85, 0x03, 0xF0, 0x30, 0x4D, 0x1B, 0x93, 0x42, 0x15, 0x3A, + 0xCF, 0x48, 0x5D, 0x57, 0x77, 0x33, 0x6D, 0x5A, 0xE3, 0x29, 0xA9, 0x48, + 0xF1, 0x2D, 0x5A, 0x38, 0xED, 0x25, 0x4B, 0x2E, 0x54, 0x12, 0x7D, 0x1F, + 0xA6, 0x07, 0xBB, 0x0D, 0x52, 0x0B, 0x04, 0x03, 0xC9, 0x0E, 0xCE, 0xFD, + 0xC3, 0x0E, 0xC7, 0x05, 0xA3, 0x14, 0xFB, 0x1A, 0x6E, 0x1D, 0x75, 0x26, + 0xB3, 0x2A, 0x57, 0x28, 0x23, 0x38, 0x1B, 0x32, 0xA7, 0x32, 0x4B, 0x37, + 0x53, 0x27, 0x23, 0x2A, 0x05, 0x2C, 0x1A, 0x25, 0x2F, 0x30, 0xB2, 0x2B, + 0x7C, 0x26, 0x8E, 0x20, 0x69, 0x23, 0x20, 0x1C, 0xF2, 0x2C, 0xBA, 0x31, + 0xCB, 0x33, 0x93, 0x43, 0xB5, 0x37, 0x66, 0x46, 0x65, 0x3E, 0x71, 0x45, + 0xAA, 0x3E, 0xFB, 0x41, 0x4D, 0x31, 0x72, 0x35, 0x09, 0x22, 0x97, 0x24, + 0x21, 0x19, 0x4A, 0x0C, 0xF0, 0x0F, 0xA0, 0xED, 0xE5, 0x05, 0x36, 0xE1, + 0x5E, 0x12, 0xA1, 0xEE, 0x02, 0x30, 0x2C, 0x04, 0xA6, 0x3A, 0x59, 0x1E, + 0xD7, 0x3A, 0x64, 0x3B, 0x4E, 0x40, 0x72, 0x52, 0x86, 0x3A, 0x58, 0x57, + 0xBA, 0x2D, 0x13, 0x4A, 0x47, 0x1C, 0x62, 0x38, 0x43, 0x05, 0xC5, 0x23, + 0x68, 0xF1, 0xF2, 0x08, 0x5A, 0xE2, 0x39, 0xF0, 0x93, 0xDC, 0xA7, 0xE9, + 0x68, 0xE2, 0x9D, 0xE6, 0x59, 0xEF, 0x18, 0xDD, 0x18, 0xF3, 0x1B, 0xE7, + 0xC6, 0xEB, 0x40, 0xF8, 0x0E, 0xF2, 0xF6, 0xF4, 0xCA, 0x05, 0x32, 0xF6, + 0xE7, 0x0E, 0x21, 0xFD, 0x77, 0x05, 0xFD, 0xF0, 0x1D, 0xFF, 0x43, 0xEA, + 0xBE, 0x06, 0x45, 0xF7, 0xB5, 0x03, 0xF9, 0xFA, 0x2E, 0xF5, 0x2B, 0xF4, + 0xD4, 0xF1, 0x16, 0xF6, 0xCF, 0xFA, 0xC4, 0xFB, 0xC5, 0x02, 0x94, 0xFC, + 0x45, 0x05, 0xD5, 0xFC, 0xD5, 0x06, 0x04, 0xFF, 0x7B, 0x00, 0xEF, 0xF8, + 0xE9, 0xEC, 0x6D, 0xEB, 0xDF, 0xD8, 0xA7, 0xE0, 0xC8, 0xCF, 0xF4, 0xD5, + 0x71, 0xCD, 0xE8, 0xC7, 0x93, 0xD0, 0x96, 0xC5, 0x4F, 0xDA, 0x41, 0xD5, + 0x16, 0xE4, 0x72, 0xE7, 0xD2, 0xED, 0xA6, 0xFD, 0xF9, 0xFC, 0xCB, 0x13, + 0xA1, 0x08, 0xD5, 0x12, 0xE7, 0x02, 0x55, 0x07, 0x2B, 0xF5, 0x88, 0x02, + 0xC2, 0xEE, 0xD0, 0xEF, 0xC8, 0xE9, 0x64, 0xD4, 0xB4, 0xE0, 0x2C, 0xC5, + 0x3F, 0xDA, 0x1B, 0xC5, 0x03, 0xCF, 0xAB, 0xD2, 0x59, 0xC1, 0x50, 0xE1, + 0xE5, 0xCA, 0x74, 0xE3, 0x42, 0xDF, 0xD7, 0xDA, 0x3D, 0xDD, 0x45, 0xD3, + 0xE6, 0xD6, 0x6A, 0xD7, 0x46, 0xDF, 0x4B, 0xE0, 0xD1, 0xE6, 0x13, 0xDE, + 0xC3, 0xEB, 0x67, 0xDA, 0xA9, 0xF3, 0x8F, 0xEA, 0x9D, 0xF1, 0x22, 0x00, + 0x8B, 0xE9, 0x06, 0x03, 0x86, 0xE7, 0x07, 0x02, 0xDB, 0xE9, 0x21, 0x0D, + 0x28, 0xF0, 0xE8, 0x13, 0xDE, 0xF7, 0x55, 0x13, 0x3C, 0xFE, 0x48, 0x1E, + 0x63, 0x02, 0x34, 0x2C, 0x7A, 0xFE, 0xBA, 0x21, 0xFB, 0xF9, 0xA9, 0xFF, + 0xB4, 0xF9, 0xDF, 0xDA, 0xFB, 0xEB, 0x9D, 0xC2, 0xD8, 0xDA, 0xD7, 0xC3, + 0xEC, 0xE0, 0xF6, 0xDA, 0xB4, 0xF2, 0xBB, 0xF2, 0x11, 0x01, 0xF1, 0x09, + 0x49, 0x11, 0xBB, 0x26, 0x4F, 0x1B, 0x93, 0x36, 0x29, 0x1B, 0x0F, 0x30, + 0xC4, 0x1D, 0x0A, 0x21, 0x49, 0x1C, 0xC8, 0x0C, 0x25, 0x0E, 0x59, 0xF9, + 0x71, 0xFE, 0xA4, 0xEB, 0xFA, 0xFD, 0xF8, 0xE5, 0xDD, 0x05, 0xDA, 0xE7, + 0x04, 0x07, 0x5D, 0xE6, 0xC8, 0x03, 0x65, 0xEB, 0xED, 0xFE, 0x3C, 0xF9, + 0x8B, 0xF2, 0xEA, 0xFE, 0x3A, 0xEC, 0xCC, 0xFF, 0x17, 0xFE, 0xFC, 0x03, + 0x3C, 0x0D, 0x23, 0x04, 0xD6, 0x08, 0xEB, 0xFC, 0x10, 0x0E, 0x6A, 0xFF, + 0xA4, 0x13, 0xAE, 0x07, 0x05, 0x05, 0xE2, 0xFC, 0x10, 0xFB, 0x85, 0xEB, + 0xB8, 0xFE, 0xC5, 0xEF, 0x06, 0xFE, 0xAE, 0x08, 0x5E, 0xF6, 0x1B, 0x1F, + 0x65, 0xF6, 0xB6, 0x29, 0x01, 0x01, 0xC6, 0x29, 0x57, 0x0A, 0xD3, 0x17, + 0x7E, 0x0A, 0x46, 0xFE, 0x4E, 0x03, 0x3C, 0xED, 0x68, 0xFE, 0x0C, 0xD8, + 0xCE, 0xFD, 0xE0, 0xC6, 0x2E, 0xF8, 0x2A, 0xD2, 0x37, 0xF3, 0xFC, 0xE8, + 0x13, 0xF9, 0x82, 0x04, 0x25, 0x09, 0xA5, 0x24, 0x60, 0x19, 0x3E, 0x30, + 0xCB, 0x18, 0xEE, 0x2B, 0x84, 0x0F, 0x31, 0x29, 0x7B, 0x0B, 0xED, 0x20, + 0xAA, 0x0A, 0xE0, 0x12, 0xBF, 0x03, 0x24, 0x06, 0x6A, 0xFD, 0x4F, 0xF9, + 0xE7, 0x02, 0xD3, 0xEC, 0x3B, 0x02, 0x22, 0xE4, 0x37, 0xF6, 0x9F, 0xDD, + 0x50, 0xEB, 0xB3, 0xDC, 0x0C, 0xE2, 0x4A, 0xDF, 0x76, 0xE0, 0xCD, 0xD8, + 0x14, 0xEC, 0x38, 0xDB, 0x38, 0xF4, 0xCD, 0xE7, 0x0F, 0xF5, 0x56, 0xE0, + 0xEF, 0xF8, 0xA9, 0xDB, 0x34, 0xF7, 0xAB, 0xED, 0xD2, 0xED, 0xFF, 0xF7, + 0xFD, 0xE8, 0xE3, 0xF3, 0x01, 0xEA, 0x6D, 0xF5, 0xC7, 0xE7, 0xC5, 0x03, + 0x77, 0xDF, 0xEA, 0x0E, 0xB4, 0xE0, 0xF3, 0x0E, 0x2D, 0xF3, 0x6D, 0x0C, + 0xEC, 0x01, 0x87, 0x04, 0x2D, 0xF9, 0x1C, 0xF6, 0x04, 0xEB, 0x62, 0xE6, + 0x15, 0xE5, 0xE8, 0xD6, 0x7A, 0xDD, 0xF2, 0xC9, 0x24, 0xDD, 0x56, 0xC7, + 0x95, 0xE6, 0xD6, 0xD7, 0x30, 0xF0, 0x65, 0xF0, 0x14, 0xFA, 0xAF, 0x03, + 0xD6, 0x05, 0x1D, 0x10, 0xE0, 0x0D, 0x2D, 0x12, 0xAA, 0x08, 0xEE, 0x12, + 0x18, 0xFA, 0xE8, 0x13, 0x2D, 0xF5, 0xC6, 0x08, 0xD0, 0xFD, 0xFE, 0xF6, + 0x90, 0xFF, 0xB5, 0xE8, 0x32, 0xFA, 0x0F, 0xDC, 0xF5, 0xF2, 0x00, 0xCD, + 0x69, 0xE7, 0x79, 0xC7, 0xAF, 0xE0, 0xD0, 0xD2, 0xA6, 0xDA, 0xAD, 0xD9, + 0x7E, 0xD1, 0xE5, 0xD4, 0x2C, 0xD9, 0x51, 0xD2, 0x1D, 0xE7, 0xAC, 0xD4, + 0x96, 0xDC, 0x9E, 0xD9, 0xEA, 0xD3, 0x75, 0xDB, 0x45, 0xEB, 0x49, 0xD7, + 0x71, 0xFC, 0x3D, 0xDA, 0x41, 0xEA, 0x90, 0xE7, 0xB6, 0xD4, 0xC1, 0xF4, + 0xD3, 0xDA, 0x47, 0x02, 0xFC, 0xF3, 0xE8, 0x08, 0xB9, 0x04, 0x94, 0x07, + 0x13, 0x04, 0xE9, 0x12, 0x9E, 0x06, 0xED, 0x23, 0xA8, 0x0C, 0xCB, 0x1D, + 0x06, 0x08, 0x8C, 0x08, 0xCE, 0x03, 0xEA, 0xF7, 0x16, 0x06, 0x18, 0xE8, + 0xCB, 0x07, 0x99, 0xE1, 0xCE, 0x08, 0x7C, 0xF1, 0x57, 0x0E, 0xF3, 0x09, + 0x9B, 0x1B, 0xFF, 0x1D, 0x4A, 0x2C, 0xE0, 0x2E, 0xFD, 0x32, 0xE2, 0x3B, + 0x8B, 0x2D, 0x15, 0x4B, 0x65, 0x29, 0xB7, 0x55, 0x62, 0x2B, 0x3C, 0x52, + 0x53, 0x2C, 0xAD, 0x43, 0x4A, 0x28, 0x3D, 0x2F, 0x4F, 0x29, 0x63, 0x2C, + 0x41, 0x29, 0x42, 0x3D, 0x53, 0x22, 0x3A, 0x48, 0xCA, 0x26, 0x1C, 0x48, + 0xA3, 0x33, 0x61, 0x41, 0xEC, 0x30, 0x64, 0x34, 0x56, 0x22, 0xED, 0x26, + 0x65, 0x1F, 0x10, 0x1F, 0x44, 0x24, 0xB7, 0x17, 0x51, 0x1F, 0x63, 0x10, + 0x77, 0x19, 0x4E, 0x10, 0xD3, 0x19, 0xA0, 0x14, 0x77, 0x1B, 0x1A, 0x17, + 0x52, 0x20, 0x01, 0x13, 0xB9, 0x23, 0x84, 0x12, 0x28, 0x21, 0x87, 0x21, + 0x40, 0x24, 0xAF, 0x33, 0x06, 0x34, 0x22, 0x40, 0x1C, 0x40, 0x65, 0x45, + 0x92, 0x3E, 0x50, 0x3B, 0x43, 0x3C, 0xF4, 0x28, 0x8B, 0x35, 0xFF, 0x1D, + 0x27, 0x21, 0x47, 0x12, 0x65, 0x10, 0x56, 0x02, 0x33, 0x0E, 0x24, 0x00, + 0x9D, 0x16, 0xC7, 0x06, 0x92, 0x20, 0x69, 0x0F, 0x20, 0x22, 0xDF, 0x25, + 0x0C, 0x23, 0x7F, 0x3A, 0x00, 0x2B, 0x8D, 0x38, 0x01, 0x2D, 0xAC, 0x26, + 0x8D, 0x23, 0x50, 0x16, 0x29, 0x1C, 0x68, 0x10, 0x2F, 0x0F, 0x77, 0x0F, + 0x77, 0xFA, 0x35, 0x0F, 0x53, 0xF2, 0xAB, 0x0C, 0xF3, 0xF2, 0xBC, 0x08, + 0x48, 0xF2, 0xE3, 0x06, 0xED, 0xF7, 0x75, 0xFF, 0x64, 0xFB, 0x55, 0xEE, + 0xD3, 0xFB, 0x4A, 0xDB, 0xA8, 0x03, 0xF5, 0xD1, 0xC7, 0x00, 0xD1, 0xD5, + 0xB1, 0xF4, 0x90, 0xDC, 0x64, 0xF6, 0x9C, 0xE0, 0x16, 0xF7, 0x12, 0xE1, + 0x56, 0xE9, 0x34, 0xDD, 0x4D, 0xDE, 0xDF, 0xDA, 0x46, 0xDE, 0x51, 0xE0, + 0x65, 0xDF, 0x57, 0xEB, 0xE3, 0xDB, 0xA6, 0xF4, 0x56, 0xDF, 0x93, 0x01, + 0x5D, 0xEF, 0xBC, 0x0F, 0x34, 0x03, 0xB0, 0x0E, 0xA0, 0x0E, 0xDA, 0x01, + 0x4A, 0x0B, 0x5E, 0xF4, 0x56, 0xFD, 0xC3, 0xE8, 0x92, 0xED, 0xBD, 0xDA, + 0x1F, 0xE6, 0x7F, 0xCB, 0xB5, 0xE5, 0xF7, 0xCC, 0x55, 0xE8, 0x9A, 0xDF, + 0x97, 0xED, 0xBA, 0xF1, 0x7A, 0xF0, 0x69, 0xFB, 0x81, 0xF0, 0x27, 0xFD, + 0x77, 0xF3, 0x08, 0xF6, 0x14, 0xF3, 0x3B, 0xEA, 0xE1, 0xEB, 0xFA, 0xE8, + 0x69, 0xE5, 0xFE, 0xEF, 0x98, 0xE0, 0x77, 0xF5, 0x39, 0xDD, 0x9F, 0xFA, + 0xEB, 0xDA, 0xFB, 0xF5, 0xDD, 0xD4, 0x0F, 0xEB, 0x84, 0xCF, 0x51, 0xE6, + 0x29, 0xD0, 0x09, 0xDD, 0x8C, 0xD2, 0xC7, 0xD1, 0x68, 0xD2, 0x59, 0xD7, + 0xA4, 0xCE, 0xE0, 0xDF, 0x06, 0xCF, 0x2B, 0xDB, 0x05, 0xD9, 0xB6, 0xDA, + 0x06, 0xEA, 0xF7, 0xE0, 0xEE, 0xF6, 0xFB, 0xE2, 0x36, 0xF5, 0x18, 0xE5, + 0x64, 0xEE, 0x7F, 0xEB, 0x13, 0xEA, 0xED, 0xFC, 0x06, 0xE7, 0xF8, 0x11, + 0x24, 0xF0, 0xBE, 0x18, 0x25, 0x08, 0xBA, 0x15, 0x3F, 0x1B, 0xF2, 0x10, + 0x7D, 0x18, 0x7E, 0x08, 0xD9, 0x0A, 0xDC, 0xF6, 0x08, 0x0A, 0xCF, 0xDE, + 0xD3, 0x12, 0xA7, 0xCE, 0xBD, 0x0E, 0x70, 0xD2, 0x8D, 0xFF, 0x36, 0xE9, + 0xC6, 0xFA, 0x0B, 0x00, 0xBB, 0x05, 0x1E, 0x0A, 0x88, 0x13, 0x8F, 0x0B, + 0xA4, 0x17, 0x80, 0x09, 0x9F, 0x12, 0xAC, 0x0A, 0xD8, 0x08, 0x28, 0x11, + 0xB9, 0x00, 0x4B, 0x12, 0x56, 0xFF, 0x40, 0x06, 0xE2, 0xFC, 0xE2, 0xF7, + 0xBC, 0xF8, 0xD4, 0xFA, 0x25, 0xF7, 0x21, 0x0C, 0xE8, 0xF9, 0xFD, 0x17, + 0x1C, 0x07, 0xC3, 0x17, 0x2C, 0x10, 0xB6, 0x10, 0x2A, 0x06, 0x18, 0x05, + 0x71, 0xF8, 0x43, 0xF9, 0xE8, 0xF2, 0x30, 0xF3, 0xD3, 0xF1, 0xB9, 0xEE, + 0x8E, 0xF5, 0x74, 0xE4, 0x63, 0x02, 0x63, 0xD8, 0x38, 0x09, 0xA1, 0xD9, + 0xCD, 0xFA, 0x17, 0xED, 0xF1, 0xE7, 0xF1, 0x04, 0xAA, 0xE9, 0x1F, 0x14, + 0xF8, 0xF8, 0x71, 0x1B, 0x8C, 0xFC, 0x18, 0x20, 0x0B, 0xFA, 0xD8, 0x26, + 0xD9, 0x00, 0x3E, 0x29, 0x93, 0x07, 0x17, 0x24, 0xFE, 0x0B, 0xF0, 0x16, + 0x07, 0x0C, 0x47, 0x05, 0x19, 0x01, 0xD7, 0xFB, 0xC3, 0xFD, 0x46, 0xF5, + 0x02, 0x05, 0x06, 0xF3, 0x9F, 0x02, 0x2F, 0xF9, 0xE7, 0xFD, 0xA1, 0xFE, + 0xE7, 0x01, 0xA8, 0x09, 0x99, 0x02, 0x06, 0x19, 0xFB, 0xFC, 0xB8, 0x19, + 0x84, 0xFA, 0xB8, 0x0C, 0x21, 0xFB, 0x22, 0x02, 0x02, 0xFA, 0x00, 0xFD, + 0xD6, 0xF4, 0xA6, 0xF6, 0xDE, 0xED, 0xDA, 0xF4, 0x87, 0xF5, 0xB8, 0xF4, + 0x69, 0x05, 0xA5, 0xED, 0xE8, 0x00, 0x6E, 0xEC, 0xAF, 0xF2, 0xB8, 0xF1, + 0x36, 0xF0, 0xDB, 0xF4, 0xA1, 0xF4, 0x3F, 0xF1, 0x04, 0xFC, 0xD5, 0xE3, + 0x91, 0x03, 0xB0, 0xD4, 0x92, 0x04, 0x67, 0xCF, 0xCF, 0x02, 0x9A, 0xD5, + 0xDF, 0xFA, 0xD3, 0xDF, 0x24, 0xF2, 0xC0, 0xE4, 0xCD, 0xF4, 0x09, 0xE0, + 0xC0, 0xF7, 0x34, 0xDF, 0x7B, 0xEF, 0x0D, 0xEA, 0x39, 0xE4, 0x9B, 0xF0, + 0x6F, 0xE4, 0xD1, 0xF5, 0xA1, 0xE9, 0x51, 0x04, 0xAB, 0xE7, 0x36, 0x0E, + 0xD4, 0xE7, 0xA8, 0x0C, 0x56, 0xEF, 0xAE, 0x06, 0xB0, 0xF1, 0x79, 0xFA, + 0x74, 0xEC, 0x5C, 0xE7, 0xB1, 0xEB, 0x95, 0xD9, 0xB6, 0xF4, 0x75, 0xD8, + 0xAB, 0xF8, 0x3C, 0xE2, 0xB5, 0xF1, 0x0F, 0xF0, 0x85, 0xEB, 0xF9, 0xF9, + 0x3F, 0xE8, 0x6C, 0xFC, 0x34, 0xE7, 0xD6, 0xF4, 0x12, 0xE7, 0x3D, 0xE7, + 0x2E, 0xE5, 0x7D, 0xE1, 0xD0, 0xE2, 0x39, 0xE5, 0x27, 0xDD, 0xD2, 0xE6, + 0x07, 0xD9, 0x63, 0xE9, 0xFA, 0xE5, 0xE1, 0xF0, 0x4A, 0xF9, 0x4E, 0xF6, + 0xBD, 0xFD, 0x4D, 0xFA, 0x07, 0xF8, 0x19, 0xFB, 0x93, 0xF3, 0xD5, 0xEE, + 0x43, 0xF1, 0x70, 0xDE, 0x78, 0xEE, 0xE3, 0xD4, 0x27, 0xED, 0x34, 0xD0, + 0x0C, 0xEB, 0xBB, 0xDA, 0xC1, 0xE8, 0x38, 0xEF, 0xA4, 0xEE, 0xC6, 0xF5, + 0x29, 0xF3, 0x8E, 0xF2, 0x9B, 0xF3, 0x95, 0xF4, 0x51, 0xF8, 0x13, 0xFC, + 0x3D, 0xF6, 0x62, 0x03, 0xE1, 0xF0, 0xF7, 0x09, 0x37, 0xF6, 0xF4, 0x14, + 0x8D, 0xFD, 0x68, 0x1B, 0xDD, 0xFB, 0x2A, 0x12, 0xD8, 0xFA, 0xEE, 0x02, + 0x8E, 0x03, 0xA7, 0xFB, 0x2E, 0x0F, 0xB6, 0xFA, 0x14, 0x16, 0xA8, 0xFA, + 0xD3, 0x17, 0xD1, 0x03, 0xCB, 0x18, 0x37, 0x14, 0xCD, 0x19, 0x26, 0x21, + 0x3F, 0x1E, 0xC7, 0x2D, 0x53, 0x2A, 0xA8, 0x35, 0x03, 0x37, 0x2F, 0x31, + 0xBC, 0x37, 0xAD, 0x29, 0x90, 0x2D, 0xB0, 0x29, 0x23, 0x29, 0x12, 0x2D, + 0x84, 0x2D, 0x53, 0x33, 0x95, 0x35, 0xD9, 0x3E, 0x8B, 0x3D, 0xBD, 0x49, + 0xEA, 0x3D, 0x01, 0x52, 0x18, 0x41, 0x30, 0x51, 0xEB, 0x4D, 0x62, 0x40, + 0xE0, 0x51, 0xE4, 0x28, 0xAB, 0x44, 0xF2, 0x1C, 0x2E, 0x33, 0xCA, 0x22, + 0x74, 0x28, 0x02, 0x2C, 0xF3, 0x26, 0x5F, 0x2B, 0xA2, 0x2C, 0x67, 0x21, + 0x2A, 0x26, 0x74, 0x19, 0x94, 0x10, 0x4B, 0x1C, 0x4E, 0x06, 0xFD, 0x21, + 0xE1, 0x0B, 0x5E, 0x25, 0x3E, 0x14, 0x82, 0x24, 0xD2, 0x17, 0xED, 0x1C, + 0x51, 0x19, 0x25, 0x18, 0xA0, 0x20, 0x46, 0x1B, 0x97, 0x22, 0x78, 0x21, + 0xA4, 0x1E, 0x31, 0x1E, 0x24, 0x29, 0x9D, 0x0C, 0xB4, 0x34, 0xDD, 0xFD, + 0x73, 0x2D, 0x07, 0xFB, 0xF7, 0x1A, 0xD4, 0x02, 0x55, 0x08, 0x61, 0x13, + 0x1D, 0x01, 0x5D, 0x1C, 0xED, 0x09, 0xCB, 0x1A, 0xAB, 0x13, 0x84, 0x1E, + 0xF1, 0x15, 0x60, 0x2A, 0x77, 0x1A, 0xE3, 0x32, 0xF1, 0x1D, 0xC4, 0x30, + 0x06, 0x18, 0xD4, 0x25, 0x8F, 0x12, 0xB8, 0x18, 0x88, 0x11, 0x65, 0x19, + 0xE1, 0x0E, 0xEE, 0x24, 0xCC, 0x0E, 0xE3, 0x22, 0x37, 0x0F, 0xBE, 0x18, + 0x88, 0x0B, 0xAA, 0x12, 0xA1, 0x08, 0x93, 0x0C, 0xBD, 0x06, 0xFB, 0x06, + 0x51, 0x08, 0x6B, 0xFD, 0xB7, 0x0E, 0x12, 0xF1, 0x56, 0x0C, 0x44, 0xEC, + 0xD9, 0xFD, 0xD8, 0xEE, 0x34, 0xEF, 0x4D, 0xEE, 0xB7, 0xE4, 0xDE, 0xE8, + 0xAF, 0xDE, 0x13, 0xE5, 0xEF, 0xDB, 0x7B, 0xE1, 0xFF, 0xD5, 0xFB, 0xE2, + 0x41, 0xCE, 0x29, 0xEB, 0x02, 0xCA, 0x1E, 0xF1, 0x74, 0xCB, 0x82, 0xF4, + 0xA2, 0xD9, 0xA8, 0xEE, 0x6B, 0xF2, 0x42, 0xDE, 0x8A, 0x02, 0x40, 0xD8, + 0x3B, 0xFD, 0x72, 0xDA, 0x29, 0xF1, 0x0C, 0xD0, 0x31, 0xED, 0xB0, 0xC2, + 0x66, 0xE8, 0xE7, 0xC6, 0x38, 0xE1, 0x42, 0xDD, 0x86, 0xE0, 0xF7, 0xF5, + 0xA9, 0xE4, 0xE1, 0x01, 0x36, 0xE6, 0x4C, 0x01, 0x2F, 0xE3, 0x0E, 0xFC, + 0xEB, 0xE3, 0x51, 0xF6, 0xE9, 0xED, 0x56, 0xF5, 0xC2, 0xF7, 0x7F, 0xF8, + 0x39, 0xFA, 0x66, 0xF3, 0xBB, 0xF7, 0x36, 0xE9, 0x5E, 0xF4, 0x7D, 0xED, + 0xC8, 0xEE, 0x3C, 0xFA, 0x6D, 0xEC, 0x0E, 0xFB, 0xFE, 0xF1, 0x9A, 0xF5, + 0x06, 0xFA, 0x36, 0xED, 0x59, 0xFC, 0x91, 0xE2, 0x68, 0xF5, 0xB6, 0xDE, + 0xFA, 0xF0, 0x37, 0xD8, 0xEB, 0xEF, 0x6E, 0xD5, 0xF7, 0xE3, 0x6F, 0xE3, + 0x47, 0xD6, 0xE0, 0xEA, 0x8B, 0xD7, 0x8C, 0xE3, 0x17, 0xE2, 0x29, 0xE2, + 0x22, 0xE8, 0xF9, 0xE7, 0x8C, 0xDF, 0x2E, 0xEE, 0xDF, 0xD3, 0x05, 0xF8, + 0xAA, 0xDA, 0x88, 0x00, 0xEE, 0xED, 0x6E, 0xFE, 0x4C, 0xF9, 0xB1, 0xF5, + 0x5E, 0xFF, 0xD2, 0xF0, 0xC1, 0x08, 0xC6, 0xEE, 0x2A, 0x0C, 0x2E, 0xE9, + 0x1A, 0x07, 0xE8, 0xE2, 0x15, 0x01, 0x93, 0xE2, 0x0E, 0x00, 0x41, 0xE8, + 0xF3, 0xFE, 0xC5, 0xF0, 0xED, 0xF8, 0x3A, 0xFC, 0xF3, 0xF8, 0x1A, 0x0A, + 0x2B, 0x07, 0x1E, 0x11, 0x3E, 0x13, 0x3A, 0x0D, 0x56, 0x10, 0x83, 0x09, + 0x5F, 0x0E, 0xA4, 0x0B, 0x7A, 0x0E, 0xB2, 0x13, 0xC1, 0x08, 0x62, 0x20, + 0x62, 0x0C, 0x66, 0x29, 0xBE, 0x15, 0x8A, 0x2D, 0x41, 0x14, 0xEA, 0x2D, + 0x9C, 0x0D, 0x15, 0x26, 0x36, 0x07, 0xA2, 0x18, 0x8F, 0x05, 0xF9, 0x08, + 0x9C, 0x07, 0x0B, 0xFA, 0xD9, 0xFF, 0x12, 0xF1, 0x23, 0xF2, 0xB8, 0xF2, + 0xBD, 0xF4, 0xE3, 0xFA, 0x68, 0x00, 0x91, 0xFC, 0xC3, 0xFA, 0x3E, 0xFA, + 0x9A, 0xEB, 0x23, 0xFB, 0x33, 0xE5, 0x86, 0xFE, 0xBD, 0xE7, 0x2C, 0x02, + 0xEB, 0xED, 0x8B, 0x02, 0xAD, 0xF1, 0x81, 0x05, 0xB1, 0xF8, 0xBC, 0x0C, + 0x88, 0x06, 0x61, 0x0F, 0x5B, 0x12, 0xB3, 0x0A, 0x48, 0x1D, 0xCC, 0xFC, + 0x25, 0x25, 0x52, 0xE9, 0xAE, 0x1F, 0x3B, 0xD8, 0xB7, 0x14, 0x8A, 0xD3, + 0xB3, 0x0A, 0x1F, 0xE2, 0x4E, 0x00, 0x21, 0xF6, 0x8C, 0xFE, 0x2E, 0x00, + 0x49, 0xFF, 0xB7, 0x00, 0x68, 0xF6, 0x8E, 0x04, 0xA5, 0xEF, 0xC0, 0x0A, + 0x19, 0xF4, 0x0C, 0x07, 0x9E, 0xFC, 0xCA, 0x00, 0xE7, 0x03, 0x0D, 0xFB, + 0xE3, 0x06, 0x4A, 0xF7, 0x53, 0xFE, 0x3B, 0x01, 0x93, 0xF3, 0xAA, 0x0C, + 0xFF, 0xF4, 0x31, 0x0D, 0x3E, 0xFD, 0x72, 0x09, 0x5D, 0x05, 0xE2, 0x00, + 0x5D, 0x0A, 0x96, 0xF8, 0xEE, 0x02, 0x3A, 0xFA, 0xFC, 0xF5, 0x9A, 0xFA, + 0xDD, 0xEE, 0x99, 0xE8, 0x69, 0xE9, 0xD0, 0xD1, 0xFE, 0xE2, 0xCB, 0xCB, + 0x3D, 0xDE, 0x02, 0xD1, 0x43, 0xDC, 0x94, 0xD5, 0x41, 0xDD, 0x90, 0xD7, + 0x89, 0xDE, 0xD8, 0xDB, 0x24, 0xDF, 0xFD, 0xE8, 0x12, 0xE4, 0xBC, 0xF9, + 0xAC, 0xED, 0xD6, 0x05, 0xE8, 0xF2, 0x1D, 0x0A, 0x3D, 0xEE, 0x74, 0x00, + 0x30, 0xE9, 0xAA, 0xF2, 0xC8, 0xE9, 0xC8, 0xEB, 0x4D, 0xED, 0x37, 0xE3, + 0xE4, 0xF2, 0x32, 0xDD, 0xB7, 0xF5, 0x18, 0xE5, 0x90, 0xF3, 0x7D, 0xEE, + 0x74, 0xEC, 0x48, 0xF5, 0xCD, 0xE2, 0x7F, 0x03, 0xE9, 0xDF, 0xBE, 0x0B, + 0x8E, 0xE7, 0x49, 0x01, 0xC7, 0xEE, 0x2E, 0xEE, 0x1D, 0xEA, 0x15, 0xE7, + 0x54, 0xDE, 0x92, 0xEB, 0x6C, 0xD6, 0xDB, 0xEA, 0x34, 0xD8, 0x1B, 0xE9, + 0xFB, 0xE1, 0x0F, 0xED, 0xCE, 0xEC, 0x87, 0xF2, 0x8E, 0xFA, 0x6F, 0xF6, + 0x29, 0x04, 0xB2, 0xFB, 0xE8, 0x03, 0x6A, 0xFA, 0x0D, 0x04, 0x36, 0xEC, + 0x6E, 0xFE, 0x25, 0xE3, 0x10, 0xF3, 0x85, 0xE7, 0xB8, 0xED, 0xEC, 0xEF, + 0x8B, 0xE9, 0x41, 0xF3, 0xF3, 0xE5, 0x0F, 0xF0, 0x99, 0xE4, 0x18, 0xEB, + 0x72, 0xE6, 0xAC, 0xF1, 0xE8, 0xF3, 0xD4, 0x04, 0x59, 0x04, 0xC7, 0x05, + 0xFF, 0x16, 0x3E, 0x0A, 0x88, 0x18, 0xF9, 0x14, 0x68, 0x0F, 0x60, 0x0D, + 0xDC, 0x36, 0xA0, 0x28, 0x5E, 0x49, 0x43, 0x3B, 0x19, 0x34, 0xDC, 0x31, + 0xEF, 0x44, 0xAE, 0x4A, 0xDA, 0x5D, 0xAF, 0x62, 0x5B, 0x61, 0x04, 0x62, + 0x61, 0x57, 0x2F, 0x56, 0xF8, 0x4B, 0x83, 0x50, 0x99, 0x43, 0x42, 0x50, + 0xB9, 0x37, 0x9A, 0x41, 0xD1, 0x28, 0x9E, 0x28, 0x31, 0x24, 0x02, 0x19, + 0xAC, 0x28, 0xA9, 0x19, 0xD7, 0x1F, 0xB9, 0x17, 0xAD, 0x18, 0xED, 0x1B, + 0x1F, 0x15, 0xE9, 0x26, 0xC9, 0x0F, 0xC3, 0x20, 0x97, 0x05, 0xDF, 0x11, + 0xDE, 0xF3, 0x45, 0x05, 0x12, 0xE9, 0x9E, 0xF8, 0x62, 0xDD, 0xBE, 0xE2, + 0x59, 0xE3, 0xA1, 0xDA, 0x5B, 0x03, 0xF3, 0xEE, 0x7B, 0x0D, 0xD8, 0xF3, + 0x4F, 0x0D, 0xC4, 0xF9, 0x31, 0x0C, 0x0E, 0x06, 0x3E, 0xF9, 0x45, 0xFF, + 0xF7, 0xE5, 0xFD, 0xF3, 0xDD, 0xF9, 0xCB, 0xFA, 0x14, 0x18, 0x89, 0x0B, + 0x42, 0x07, 0x76, 0x0D, 0x29, 0x0E, 0xC7, 0x20, 0xE1, 0x2A, 0x21, 0x31, + 0xFC, 0x30, 0x4F, 0x2E, 0xAD, 0x37, 0x7C, 0x37, 0xBA, 0x48, 0x72, 0x4A, + 0x12, 0x4A, 0x52, 0x42, 0x07, 0x2A, 0x94, 0x1A, 0x48, 0x2B, 0xF6, 0x1E, + 0xB4, 0x51, 0x3E, 0x4D, 0x0E, 0x34, 0xF1, 0x3B, 0xC4, 0xF4, 0x59, 0x0F, + 0xDF, 0x06, 0xDC, 0x2B, 0x51, 0x20, 0xDB, 0x3E, 0x6C, 0x08, 0xDB, 0x1D, + 0x0F, 0x10, 0xA3, 0x17, 0x5C, 0x22, 0xAC, 0x1C, 0x50, 0xF1, 0xAD, 0xEF, + 0x83, 0xDB, 0x4E, 0xD2, 0x96, 0xF3, 0xF1, 0xD7, 0x8C, 0xD9, 0x93, 0xD3, + 0xC0, 0xBE, 0x49, 0xDA, 0x21, 0xE6, 0x1D, 0xFB, 0xED, 0x03, 0xC3, 0x09, + 0x6C, 0xEC, 0x33, 0xEA, 0x59, 0x02, 0x82, 0xE9, 0x2D, 0x17, 0xE7, 0xF4, + 0x39, 0xEE, 0x82, 0xDD, 0xED, 0xE8, 0xAE, 0xDE, 0x15, 0x12, 0x6E, 0x02, + 0x13, 0x14, 0x06, 0x05, 0x16, 0xEB, 0xA2, 0xD8, 0x71, 0xEA, 0xDF, 0xDB, + 0x19, 0x06, 0x50, 0x0F, 0x70, 0xF8, 0x81, 0x0B, 0xF5, 0xE4, 0xDA, 0xE9, + 0x63, 0xE8, 0x78, 0xEE, 0x06, 0xE6, 0x03, 0xFD, 0xA3, 0xDF, 0x2A, 0xF3, + 0x16, 0xDD, 0xA5, 0xDE, 0xEB, 0xD2, 0x7D, 0xCD, 0x58, 0xC8, 0x9B, 0xBB, + 0xFE, 0xD5, 0x36, 0xB7, 0x23, 0xE1, 0x91, 0xBE, 0xC9, 0xD8, 0x4B, 0xC8, + 0xBA, 0xBF, 0x1B, 0xBC, 0x6A, 0xAF, 0x11, 0xAB, 0xE4, 0xB2, 0x41, 0xAC, + 0x68, 0xAD, 0x37, 0xA8, 0x02, 0xA5, 0xBF, 0xA6, 0x7D, 0xA5, 0x79, 0xA6, + 0x2C, 0xB6, 0x80, 0xA6, 0xA5, 0xC3, 0x40, 0xB1, 0x19, 0xBC, 0x14, 0xBC, + 0x4C, 0xC1, 0x99, 0xC4, 0x2C, 0xE0, 0xAA, 0xD7, 0x8E, 0xF6, 0x6B, 0xEE, + 0x66, 0xF1, 0x17, 0xF7, 0x82, 0xD8, 0xC6, 0xEF, 0x32, 0xBA, 0x1D, 0xD7, + 0x6A, 0xAA, 0xBC, 0xBA, 0xC9, 0xB0, 0x65, 0xBA, 0xE9, 0xBE, 0x31, 0xCB, + 0x73, 0xD2, 0xEC, 0xD8, 0x4D, 0xDC, 0xB5, 0xE6, 0x27, 0xD7, 0xE9, 0xF7, + 0x03, 0xE2, 0x42, 0x07, 0xEE, 0xEB, 0x49, 0xFE, 0x17, 0xE3, 0x03, 0xEC, + 0x8A, 0xE6, 0x44, 0xF3, 0x65, 0xF4, 0x5A, 0x05, 0xF9, 0xF1, 0xCD, 0x07, + 0x99, 0xF7, 0x03, 0x0B, 0xEE, 0x0F, 0x45, 0x19, 0x60, 0x10, 0x87, 0x19, + 0xF7, 0x01, 0x2E, 0x07, 0xAC, 0x0D, 0x38, 0xF8, 0x6F, 0x19, 0x11, 0xF2, + 0x04, 0x05, 0x80, 0xE6, 0x74, 0xF4, 0x0A, 0xDF, 0x89, 0xFA, 0x7E, 0xE9, + 0x30, 0x00, 0x40, 0xF8, 0xFE, 0xFA, 0x3B, 0xF9, 0xA2, 0xF4, 0x16, 0xF6, + 0x65, 0xF7, 0x8E, 0xFE, 0xBD, 0xFA, 0xA7, 0x06, 0x12, 0xFE, 0x25, 0x07, + 0xCC, 0x0E, 0xC6, 0x0D, 0x65, 0x28, 0x23, 0x23, 0xAE, 0x30, 0x4C, 0x29, + 0xA7, 0x34, 0xC0, 0x1F, 0x7C, 0x3E, 0x63, 0x25, 0x2C, 0x33, 0xD2, 0x28, + 0x33, 0x2A, 0xC6, 0x2A, 0x86, 0x2E, 0x1E, 0x33, 0x1C, 0x3A, 0x6A, 0x35, + 0x70, 0x47, 0xCB, 0x2A, 0x9A, 0x44, 0xD8, 0x2B, 0x10, 0x3A, 0x3E, 0x41, + 0x7B, 0x3C, 0x9E, 0x4E, 0xDA, 0x43, 0x62, 0x4E, 0x3E, 0x3F, 0x62, 0x46, + 0xB8, 0x3E, 0x42, 0x43, 0x2C, 0x36, 0xC2, 0x36, 0x49, 0x31, 0x49, 0x2D, + 0x3B, 0x44, 0xC7, 0x45, 0xC7, 0x4B, 0x94, 0x5C, 0xB6, 0x4E, 0xE8, 0x59, + 0xE5, 0x5A, 0x2B, 0x51, 0x40, 0x59, 0x02, 0x4A, 0xC5, 0x46, 0x2D, 0x3B, + 0x97, 0x32, 0x15, 0x2C, 0xA4, 0x33, 0x47, 0x2F, 0x5B, 0x4A, 0xC6, 0x3E, + 0x78, 0x46, 0x8C, 0x46, 0x07, 0x2F, 0x92, 0x4D, 0xF9, 0x39, 0x8A, 0x59, + 0x52, 0x52, 0x94, 0x5A, 0x51, 0x58, 0xC3, 0x56, 0x4B, 0x58, 0xDD, 0x57, + 0x7E, 0x5A, 0xAB, 0x5B, 0x52, 0x58, 0x71, 0x58, 0x7E, 0x55, 0x73, 0x4B, + 0x4A, 0x52, 0x12, 0x3E, 0xB5, 0x4C, 0x77, 0x3C, 0x23, 0x40, 0xA3, 0x3C, + 0x5F, 0x34, 0x6A, 0x35, 0x03, 0x3C, 0x4A, 0x35, 0xB5, 0x3B, 0x21, 0x2E, + 0xB5, 0x26, 0x51, 0x1D, 0xEF, 0x19, 0x86, 0x1D, 0x4D, 0x1C, 0xE5, 0x27, + 0xD8, 0x1B, 0x14, 0x21, 0x2B, 0x0A, 0x1B, 0x0E, 0x2B, 0xFD, 0x0E, 0x0F, + 0x75, 0xFE, 0x7B, 0x15, 0xFF, 0xF1, 0xFC, 0x04, 0xE5, 0xDD, 0x27, 0xF4, + 0x1E, 0xDC, 0x1E, 0xF1, 0x75, 0xDD, 0x23, 0xEA, 0xE6, 0xD1, 0x37, 0xDA, + 0xF9, 0xC8, 0x08, 0xCE, 0x50, 0xB9, 0x1B, 0xC1, 0xFF, 0xBB, 0xD9, 0xC5, + 0x58, 0xDC, 0xC7, 0xD0, 0x61, 0xE2, 0x52, 0xBE, 0x6D, 0xD3, 0x8D, 0xB4, + 0x60, 0xC4, 0x9E, 0xB7, 0x8F, 0xB9, 0xB1, 0xB3, 0x0B, 0xBF, 0xD5, 0xB7, + 0x0C, 0xC3, 0x42, 0xBA, 0x2E, 0xBC, 0x79, 0xB7, 0x89, 0xC2, 0xA8, 0xC6, + 0xA6, 0xC6, 0x40, 0xCD, 0xE1, 0xB9, 0x36, 0xBC, 0xF1, 0xB4, 0xB6, 0xB2, + 0xCC, 0xB8, 0xCF, 0xAD, 0x6B, 0xC0, 0x14, 0xB3, 0x7D, 0xC1, 0x4C, 0xC8, + 0x30, 0xB7, 0x7C, 0xCA, 0xEE, 0xBC, 0xBF, 0xB8, 0xC3, 0xCD, 0x73, 0xB7, + 0x21, 0xD0, 0x6C, 0xCB, 0x3C, 0xBF, 0x80, 0xC9, 0xF8, 0xBA, 0xCC, 0xBE, + 0xA8, 0xCD, 0x77, 0xCD, 0xDF, 0xD3, 0xF0, 0xD2, 0x9D, 0xCB, 0xCD, 0xCA, + 0x5F, 0xD2, 0xF6, 0xDB, 0x4B, 0xDC, 0x1B, 0xEB, 0x08, 0xD9, 0xDD, 0xE3, + 0xDD, 0xD8, 0x6B, 0xEC, 0x17, 0xD7, 0xCE, 0xF5, 0x41, 0xDA, 0x21, 0xF5, + 0xAA, 0xDF, 0xE6, 0xF7, 0x2B, 0xE2, 0xC8, 0xF6, 0x08, 0xF2, 0x67, 0xE8, + 0xB5, 0xF4, 0xB0, 0xCA, 0x33, 0xE0, 0x9F, 0xBD, 0x67, 0xD9, 0x0C, 0xCD, + 0x1D, 0xDD, 0xD1, 0xD1, 0xA2, 0xDB, 0x75, 0xC9, 0xEE, 0xDF, 0x82, 0xCC, + 0x7C, 0xEA, 0x29, 0xD9, 0x1C, 0xF5, 0xC2, 0xEF, 0x28, 0xFD, 0xCA, 0x0C, + 0xBE, 0xFC, 0xB1, 0x16, 0xF2, 0x03, 0x5E, 0x10, 0x57, 0x10, 0xC6, 0x12, + 0x12, 0x11, 0xDE, 0x1E, 0xBC, 0x19, 0xE7, 0x29, 0x31, 0x38, 0x97, 0x3C, + 0xE0, 0x3F, 0x66, 0x49, 0x05, 0x1D, 0xF2, 0x3B, 0xB2, 0x12, 0xD8, 0x37, + 0x3F, 0x2C, 0xC4, 0x45, 0xDF, 0x36, 0xC4, 0x45, 0x0F, 0x39, 0x1C, 0x37, + 0x0C, 0x3F, 0xBB, 0x30, 0x6D, 0x38, 0x1C, 0x30, 0x92, 0x31, 0x76, 0x1B, + 0x11, 0x2C, 0xDB, 0x07, 0xF5, 0x11, 0xF3, 0x04, 0x5B, 0xEC, 0xC9, 0xEA, + 0xAA, 0xE4, 0x8C, 0xD6, 0x64, 0xF9, 0xDD, 0xEB, 0xB7, 0xFC, 0x29, 0xF5, + 0xB1, 0xF0, 0x6C, 0xEC, 0xA1, 0xE4, 0x1A, 0xE6, 0x98, 0xD7, 0x08, 0xDC, + 0xB7, 0xD8, 0x05, 0xD0, 0xBC, 0xEA, 0xB8, 0xC4, 0x82, 0xEC, 0x34, 0xBE, + 0x22, 0xE0, 0x5E, 0xBA, 0x07, 0xE4, 0xF2, 0xBA, 0xE1, 0xDD, 0xC4, 0xB9, + 0xF1, 0xCE, 0x47, 0xB6, 0x79, 0xDE, 0xB1, 0xC4, 0x41, 0xF0, 0xDC, 0xE1, + 0xB9, 0xF2, 0x66, 0x01, 0xD4, 0xF2, 0x85, 0x15, 0xBA, 0xF7, 0x75, 0x1F, + 0x69, 0x0C, 0x87, 0x2C, 0x78, 0x2A, 0xFB, 0x33, 0x09, 0x2F, 0xEF, 0x2E, + 0x7A, 0x1F, 0x08, 0x32, 0x5F, 0x1D, 0x19, 0x38, 0x9C, 0x1A, 0xC6, 0x2D, + 0xBA, 0x22, 0x68, 0x32, 0xE4, 0x36, 0x97, 0x3C, 0x67, 0x37, 0x94, 0x2B, + 0x44, 0x33, 0xFD, 0x19, 0x83, 0x37, 0x49, 0x14, 0x30, 0x22, 0xBB, 0x05, + 0x78, 0x04, 0x08, 0xFD, 0x8C, 0x01, 0xEF, 0x01, 0x7D, 0xFF, 0x6F, 0xF9, + 0x1A, 0xFD, 0x8C, 0xEB, 0x0A, 0xFA, 0xD2, 0xE7, 0xD0, 0xED, 0x59, 0xF3, + 0xE5, 0xDE, 0xAB, 0xF9, 0x4A, 0xDC, 0x6F, 0xFB, 0xE4, 0xEE, 0x09, 0x03, + 0xB1, 0xF9, 0x3E, 0xF4, 0xD6, 0xEC, 0xE5, 0xDC, 0xD4, 0xE4, 0x0C, 0xD9, + 0xAE, 0xDB, 0x44, 0xD4, 0x53, 0xC0, 0xA5, 0xBF, 0xC5, 0xB7, 0x10, 0xC0, + 0x5A, 0xC9, 0x56, 0xD4, 0xD7, 0xD2, 0x00, 0xD5, 0x56, 0xCD, 0x94, 0xD7, + 0x2F, 0xC4, 0x06, 0xE7, 0x85, 0xC2, 0x01, 0xEC, 0x85, 0xC2, 0xAE, 0xED, + 0x3C, 0xB7, 0xC3, 0xEF, 0x14, 0xB5, 0xF7, 0xF0, 0xC8, 0xCA, 0x0D, 0xF4, + 0xA1, 0xDD, 0x53, 0xEC, 0x98, 0xEB, 0x8F, 0xE1, 0x77, 0xF4, 0x1F, 0xEA, + 0xEA, 0xEB, 0x71, 0x07, 0x57, 0xF2, 0xE8, 0x1A, 0x4E, 0x0C, 0x9B, 0x20, + 0xE1, 0x04, 0x1C, 0x15, 0x1F, 0xEB, 0x54, 0xF9, 0xF1, 0xED, 0x9C, 0xF4, + 0x6F, 0xEA, 0xB0, 0xF2, 0xD1, 0xC8, 0xC4, 0xD1, 0x0B, 0xB9, 0x90, 0xB8, + 0x52, 0xC5, 0x58, 0xC0, 0xFC, 0xC3, 0xE9, 0xC6, 0x5D, 0xBB, 0x4A, 0xC0, + 0x98, 0xC5, 0xE9, 0xCA, 0x27, 0xC8, 0xB3, 0xD6, 0x39, 0xC1, 0x4B, 0xD2, + 0x13, 0xBC, 0xCD, 0xC5, 0x71, 0xB9, 0x7E, 0xBE, 0x76, 0xBF, 0x2E, 0xC5, + 0x2F, 0xBF, 0x91, 0xBC, 0x70, 0xC3, 0x26, 0xB9, 0xE4, 0xC8, 0x02, 0xBE, + 0x0A, 0xB3, 0x77, 0xA8, 0x0A, 0xA1, 0x18, 0x9E, 0x45, 0xB9, 0x91, 0xBA, + 0x3A, 0xD9, 0xC1, 0xD0, 0x4B, 0xE4, 0xE7, 0xCD, 0xDD, 0xE6, 0x9C, 0xE3, + 0xCD, 0xF1, 0xC0, 0x12, 0x8E, 0xFD, 0x82, 0x1A, 0xDF, 0xF1, 0x1C, 0x05, + 0x00, 0xF2, 0x67, 0x04, 0x6A, 0xFE, 0x69, 0xF8, 0xBD, 0xFD, 0x1B, 0xE5, + 0xFA, 0x09, 0x81, 0xEC, 0x06, 0x10, 0x55, 0xEF, 0xA8, 0x08, 0x0C, 0xEB, + 0xF9, 0x06, 0xF4, 0xF9, 0xFC, 0x0B, 0x4A, 0x0A, 0xC4, 0xFD, 0xCB, 0xF4, + 0x73, 0xE3, 0x1B, 0xE0, 0xFF, 0xEB, 0xF1, 0xE4, 0x6B, 0xE3, 0x6B, 0xCC, + 0xC3, 0xAF, 0x6C, 0xB1, 0xEA, 0xA6, 0x45, 0xC8, 0xD3, 0xB5, 0x02, 0xD1, + 0x5A, 0xAB, 0x11, 0xB6, 0xE6, 0xBD, 0x32, 0xC2, 0xA6, 0xD5, 0x7C, 0xD7, + 0xB1, 0xCA, 0x4B, 0xCD, 0x98, 0xE0, 0x84, 0xEA, 0x1C, 0x07, 0xAE, 0x0F, + 0x09, 0x0E, 0x35, 0x07, 0x7C, 0x11, 0xCB, 0x02, 0xC0, 0x0A, 0x68, 0xFE, + 0x6E, 0xFE, 0x0F, 0xE1, 0x0F, 0xED, 0xAA, 0xC7, 0xC5, 0xE2, 0x53, 0xD5, + 0xA3, 0xF1, 0xA9, 0xE3, 0x3A, 0xFA, 0x44, 0xEB, 0xEC, 0x0B, 0x3D, 0x10, + 0x3B, 0x32, 0xBC, 0x34, 0xDA, 0x3E, 0x59, 0x46, 0x40, 0x39, 0xF5, 0x4D, + 0x94, 0x41, 0xE2, 0x4A, 0x50, 0x4F, 0x38, 0x4E, 0xA2, 0x4A, 0xF1, 0x5A, + 0xB9, 0x3A, 0x3F, 0x5D, 0x04, 0x50, 0xEC, 0x5F, 0xD2, 0x60, 0x06, 0x63, + 0xC2, 0x50, 0x33, 0x62, 0x00, 0x58, 0xF3, 0x68, 0x75, 0x64, 0x86, 0x5C, + 0x40, 0x61, 0x15, 0x42, 0x89, 0x63, 0x27, 0x48, 0x20, 0x66, 0x2F, 0x60, + 0x60, 0x4E, 0x7D, 0x5D, 0xF9, 0x35, 0x9A, 0x42, 0x7B, 0x42, 0xD8, 0x2D, + 0xE9, 0x3B, 0x1F, 0x24, 0xE3, 0x19, 0xCB, 0x1C, 0x30, 0x25, 0x17, 0x1F, + 0xCF, 0x35, 0x6F, 0x22, 0xF8, 0x27, 0x20, 0x25, 0xD1, 0x31, 0xF7, 0x2E, + 0x81, 0x49, 0x05, 0x3A, 0x45, 0x55, 0xF8, 0x4A, 0xEA, 0x5F, 0x17, 0x47, + 0xA3, 0x57, 0xAD, 0x2C, 0xFC, 0x3B, 0xC6, 0x27, 0xA9, 0x27, 0xED, 0x1E, + 0x45, 0x27, 0xF5, 0x08, 0xCA, 0x36, 0x5E, 0x0A, 0x44, 0x39, 0x0F, 0x12, + 0x61, 0x3A, 0xF4, 0x1A, 0x10, 0x42, 0xC8, 0x34, 0x83, 0x45, 0xB5, 0x56, + 0x69, 0x53, 0x19, 0x65, 0x50, 0x5F, 0x90, 0x63, 0x1B, 0x57, 0x48, 0x66, + 0x40, 0x45, 0xA8, 0x57, 0xF5, 0x32, 0x4B, 0x43, 0x95, 0x28, 0x04, 0x46, + 0x38, 0x2A, 0x39, 0x3E, 0x3B, 0x3D, 0x5E, 0x31, 0xD5, 0x43, 0x87, 0x3A, + 0x81, 0x35, 0xB5, 0x42, 0x25, 0x35, 0x78, 0x36, 0xF6, 0x2C, 0xF2, 0x16, + 0x99, 0x2E, 0x92, 0x0B, 0xCD, 0x2C, 0x52, 0x0B, 0x73, 0x04, 0x44, 0xF9, + 0xF9, 0xF1, 0x78, 0xF8, 0xF2, 0xF0, 0x1F, 0xFC, 0x7C, 0xDD, 0xDD, 0xEA, + 0xB4, 0xD0, 0xB0, 0xE8, 0x55, 0xD2, 0x90, 0xF8, 0x14, 0xE9, 0x1C, 0x04, + 0xF6, 0xFD, 0xBE, 0x06, 0x66, 0x07, 0xD1, 0x0C, 0xEF, 0x14, 0x2C, 0x0E, + 0xC6, 0x08, 0xB0, 0xFD, 0x1C, 0xEE, 0xA4, 0xF9, 0x40, 0xE0, 0xB9, 0xF1, + 0x7E, 0xDD, 0x51, 0xD4, 0x1F, 0xDB, 0x40, 0xC3, 0xC4, 0xDB, 0xAA, 0xC3, + 0x11, 0xE8, 0x92, 0xCE, 0xDC, 0xF1, 0xE8, 0xE3, 0xD4, 0xFB, 0x71, 0xF6, + 0xCD, 0x0E, 0x48, 0x02, 0x15, 0x1E, 0xC5, 0x1C, 0xA7, 0x20, 0x01, 0x32, + 0x6C, 0x24, 0x80, 0x28, 0x5B, 0x2F, 0x60, 0x1F, 0x14, 0x30, 0xE5, 0x14, + 0xB0, 0x23, 0xA7, 0xF6, 0xA5, 0x24, 0x10, 0xF2, 0x5F, 0x2D, 0xA4, 0x0A, + 0x1B, 0x2D, 0xE4, 0x1A, 0xE3, 0x32, 0xC2, 0x21, 0x2A, 0x31, 0x6B, 0x10, + 0xE5, 0x26, 0x08, 0xF8, 0x26, 0x25, 0x44, 0xE9, 0xF0, 0x19, 0xB7, 0xDC, + 0x2E, 0x04, 0xA5, 0xDE, 0xEC, 0xF0, 0x69, 0xD9, 0x11, 0xF1, 0xE4, 0xDC, + 0xC5, 0xEF, 0x77, 0xEE, 0xC3, 0xEE, 0x16, 0xF4, 0x86, 0xFB, 0x9A, 0xE8, + 0xBC, 0x01, 0x83, 0xDB, 0xF9, 0x04, 0x0B, 0xEA, 0x19, 0x07, 0xCC, 0x06, + 0xCD, 0x0A, 0x5F, 0x25, 0x21, 0x10, 0x9B, 0x3A, 0x82, 0x0E, 0x78, 0x23, + 0x7C, 0xFE, 0xFD, 0xF8, 0x19, 0xF6, 0x79, 0xF5, 0xA6, 0xFE, 0x6C, 0xF2, + 0xF6, 0xFF, 0xFB, 0xDF, 0x9D, 0xFE, 0x2F, 0xF8, 0x37, 0x02, 0x45, 0x18, + 0xFC, 0x06, 0xC3, 0x23, 0xF6, 0x0E, 0x90, 0x41, 0x95, 0x20, 0x95, 0x67, + 0xCE, 0x23, 0x22, 0x61, 0x0E, 0x0F, 0x33, 0x3E, 0xC7, 0x0B, 0x02, 0x39, + 0x3B, 0x19, 0x4F, 0x39, 0x70, 0x12, 0x14, 0x2A, 0x08, 0xFB, 0x4E, 0x27, + 0xFC, 0xF1, 0x89, 0x28, 0x05, 0xFA, 0x8D, 0x21, 0x9C, 0x05, 0x72, 0x21, + 0xA5, 0x18, 0x1D, 0x23, 0x85, 0x12, 0x50, 0x0F, 0xB4, 0xF0, 0x7E, 0x05, + 0xF8, 0xEC, 0x96, 0x13, 0xBC, 0xFB, 0xC1, 0x07, 0xD9, 0xDD, 0x2D, 0xE2, + 0x08, 0xC5, 0x52, 0xE6, 0xA8, 0xE9, 0x89, 0x0C, 0x78, 0xF7, 0x87, 0x0A, + 0x21, 0xE3, 0xB7, 0xFA, 0xF4, 0xEF, 0x41, 0xFE, 0x6F, 0x02, 0x53, 0xF8, + 0xFC, 0xF7, 0x02, 0xF6, 0x9F, 0xF3, 0x4B, 0x05, 0x5B, 0xFB, 0xF8, 0x16, + 0x4B, 0xF8, 0xD9, 0x22, 0x9D, 0xF0, 0xF7, 0x0D, 0x73, 0xEA, 0xBE, 0xDD, + 0x28, 0xDD, 0x7C, 0xC1, 0xE7, 0xC8, 0x2A, 0xB2, 0xAD, 0xD2, 0xBB, 0xB1, + 0x85, 0xF3, 0xC2, 0xD0, 0x09, 0xF8, 0x1F, 0xE7, 0x10, 0xF7, 0xAF, 0xE7, + 0xFF, 0x07, 0x7A, 0xF5, 0x02, 0x06, 0x8D, 0x09, 0x2D, 0xF5, 0x38, 0x0A, + 0xC4, 0xEA, 0x81, 0x05, 0xE0, 0xE5, 0xBA, 0x0E, 0xF8, 0xD2, 0xBB, 0x02, + 0x16, 0xBA, 0x5C, 0xDF, 0x3F, 0xB1, 0x43, 0xCD, 0x63, 0xB0, 0x4B, 0xC8, + 0x41, 0xB3, 0x6F, 0xC3, 0x14, 0xB4, 0x38, 0xBE, 0x0C, 0xB4, 0xCE, 0xB8, + 0x25, 0xB7, 0x5F, 0xB3, 0x5B, 0xB9, 0x8D, 0xB2, 0x3C, 0xB0, 0x65, 0xAF, + 0x56, 0xAA, 0x26, 0xB1, 0xD4, 0xA4, 0x7F, 0xAB, 0x56, 0xA6, 0xC8, 0xAE, + 0x60, 0xB0, 0x4C, 0xC5, 0xE7, 0xA5, 0x76, 0xBC, 0x37, 0xA6, 0x7D, 0xB5, + 0xF0, 0xC4, 0x29, 0xD3, 0xC0, 0xD8, 0xF8, 0xDF, 0x36, 0xDA, 0xAE, 0xD7, + 0x96, 0xE3, 0x56, 0xE4, 0x69, 0xE7, 0x72, 0xED, 0x24, 0xCC, 0x79, 0xD4, + 0x30, 0xAC, 0x06, 0xBC, 0x24, 0xB7, 0xCF, 0xC1, 0x73, 0xC0, 0x1E, 0xB5, + 0xA8, 0xB4, 0x7E, 0x9D, 0x0C, 0xCB, 0xAC, 0xB9, 0x5B, 0xDE, 0x79, 0xDA, + 0x6B, 0xD1, 0xE9, 0xD9, 0x41, 0xDA, 0x54, 0xEB, 0x2D, 0xF9, 0x3F, 0x11, + 0xB6, 0x03, 0x0F, 0x1C, 0x7F, 0xF3, 0x08, 0x08, 0x94, 0xF0, 0x84, 0xFE, + 0xC6, 0xF6, 0x9F, 0xF2, 0xAD, 0xD7, 0xC6, 0xC5, 0x91, 0xC5, 0xC9, 0xC2, + 0x56, 0xD2, 0xB0, 0xE6, 0xC8, 0xD4, 0x37, 0xEA, 0xE4, 0xD3, 0x94, 0xDD, + 0x23, 0xE8, 0xC5, 0xDE, 0x96, 0xE8, 0xB8, 0xD0, 0x31, 0xC6, 0x56, 0xC2, + 0x4D, 0xB9, 0x60, 0xCC, 0xE5, 0xC0, 0xB8, 0xC5, 0x98, 0xBE, 0x70, 0xB4, + 0xD4, 0xCF, 0xE2, 0xC1, 0xE8, 0xF7, 0x5D, 0xDA, 0xBD, 0xF7, 0x12, 0xDC, + 0x79, 0xDE, 0xEB, 0xD7, 0x7B, 0xE6, 0x1C, 0xDA, 0x59, 0xF7, 0xA5, 0xDF, + 0x6B, 0xE9, 0xB9, 0xE1, 0x3B, 0xEE, 0x41, 0xEF, 0xA0, 0x06, 0x6D, 0x07, + 0x45, 0xF0, 0xA6, 0x00, 0xBB, 0xD4, 0x3E, 0xE3, 0xDD, 0xD8, 0x90, 0xCC, + 0xEC, 0xC7, 0x37, 0xB3, 0x0A, 0xB0, 0x3C, 0xA2, 0x10, 0xBC, 0x64, 0xB0, + 0xC9, 0xCC, 0x21, 0xCF, 0x85, 0xCF, 0x1D, 0xE5, 0x48, 0xE1, 0x04, 0xF9, + 0xD6, 0xFB, 0x28, 0x15, 0x0F, 0xFC, 0x7E, 0x16, 0xE9, 0xF5, 0xED, 0xF8, + 0xFA, 0xF3, 0x5D, 0xE4, 0x7A, 0xE6, 0x98, 0xEE, 0xE2, 0xC7, 0xC9, 0xE6, + 0xFB, 0xBB, 0xB6, 0xCE, 0x81, 0xC2, 0xA4, 0xD1, 0x95, 0xC2, 0xD5, 0xD9, + 0x23, 0xD3, 0xEF, 0xDC, 0xB7, 0xE9, 0x22, 0xE8, 0x6F, 0xE9, 0x20, 0xE6, + 0xBC, 0xF2, 0x07, 0xD5, 0xB4, 0x0A, 0x9E, 0xD5, 0xF3, 0x08, 0x38, 0xE2, + 0x2E, 0xF2, 0xC4, 0xD9, 0xF4, 0xDB, 0x49, 0xCF, 0x68, 0xDD, 0xF2, 0xEB, + 0xF1, 0xEE, 0xF4, 0xFE, 0xB4, 0xF4, 0x58, 0xE9, 0x49, 0x04, 0xF7, 0xEB, + 0xB4, 0x2B, 0x2C, 0x0D, 0xAF, 0x45, 0x9E, 0x24, 0x4E, 0x46, 0x1A, 0x46, + 0xDA, 0x41, 0x1A, 0x62, 0xAD, 0x35, 0xD4, 0x4A, 0x67, 0x27, 0x91, 0x28, + 0x9B, 0x26, 0xEB, 0x1D, 0x99, 0x16, 0xB1, 0xFD, 0x56, 0x03, 0xEB, 0xDC, + 0x83, 0x08, 0x04, 0xE4, 0xB6, 0x15, 0xD9, 0xF2, 0x39, 0x27, 0x7F, 0x02, + 0xD7, 0x36, 0xB0, 0x1A, 0x8E, 0x46, 0xC7, 0x39, 0x1D, 0x4F, 0xBB, 0x47, + 0xA4, 0x51, 0x6B, 0x39, 0x7A, 0x53, 0x54, 0x23, 0x62, 0x43, 0x97, 0x09, + 0x52, 0x1E, 0xCD, 0xEE, 0xF3, 0x03, 0xD2, 0xE9, 0x62, 0xF7, 0x8E, 0xEC, + 0xDB, 0xEF, 0xF2, 0xEB, 0x3F, 0xF0, 0xE5, 0xEB, 0x0E, 0x07, 0x90, 0xF5, + 0xA0, 0x16, 0x9A, 0xF6, 0xD6, 0xF5, 0xF4, 0xE0, 0x15, 0xEF, 0x68, 0xEC, + 0x64, 0x00, 0x8C, 0xF2, 0xF2, 0xE3, 0x8F, 0xCB, 0xD3, 0xD8, 0xB8, 0xD2, + 0x88, 0xEC, 0xDA, 0xF6, 0x87, 0xF3, 0x9E, 0xEF, 0x7B, 0x07, 0x0C, 0xEB, + 0x0A, 0x17, 0x48, 0xF5, 0x96, 0x16, 0xCE, 0x01, 0x6D, 0x1B, 0x3E, 0x14, + 0x91, 0x2A, 0xBA, 0x24, 0x2E, 0x3E, 0xED, 0x39, 0x32, 0x41, 0x38, 0x45, + 0x79, 0x2E, 0xDB, 0x35, 0x89, 0x29, 0xBB, 0x22, 0xD1, 0x35, 0x0C, 0x15, + 0x7F, 0x22, 0x9D, 0xF7, 0x1C, 0x15, 0x70, 0xEB, 0x66, 0x2F, 0xA7, 0x02, + 0x8D, 0x3F, 0x12, 0x1F, 0xF0, 0x39, 0xAE, 0x3B, 0x28, 0x44, 0x4F, 0x54, + 0x75, 0x54, 0x08, 0x56, 0x3F, 0x59, 0xC8, 0x4C, 0x78, 0x60, 0xCD, 0x40, + 0x7D, 0x63, 0x05, 0x3C, 0xC4, 0x46, 0x4F, 0x34, 0xF7, 0x2A, 0xFE, 0x1F, + 0xCE, 0x26, 0xE8, 0x0D, 0xDC, 0x0D, 0xFC, 0xFE, 0xD8, 0x01, 0x24, 0x05, + 0xAF, 0x21, 0x22, 0x17, 0x29, 0x2E, 0xDA, 0x17, 0x61, 0x18, 0x62, 0x02, + 0xF7, 0x11, 0x1D, 0xF3, 0x8B, 0x1D, 0x6C, 0x03, 0x7A, 0x10, 0x91, 0x08, + 0xB0, 0x02, 0xC0, 0xF3, 0xC4, 0x1D, 0x2F, 0xF1, 0x3D, 0x32, 0x6B, 0xF7, + 0x86, 0x27, 0xB4, 0xED, 0x04, 0x1D, 0xDB, 0xEE, 0x89, 0x2E, 0xF9, 0x14, + 0x37, 0x41, 0x00, 0x2D, 0xC2, 0x39, 0x83, 0x1F, 0xC7, 0x3E, 0xC3, 0x28, + 0x06, 0x43, 0x70, 0x35, 0xC3, 0x2B, 0xAB, 0x1B, 0x1F, 0x13, 0x65, 0x08, + 0xDA, 0x0C, 0xCF, 0x06, 0x51, 0x0B, 0x58, 0xEF, 0x6E, 0x06, 0x65, 0xE8, + 0x42, 0xFD, 0x6D, 0x07, 0x7B, 0xFC, 0xB3, 0x1C, 0x4D, 0x01, 0xFF, 0x12, + 0xDE, 0x0C, 0x43, 0x1D, 0xC4, 0x27, 0xAB, 0x36, 0x85, 0x38, 0x65, 0x2F, + 0x41, 0x31, 0x89, 0x28, 0x58, 0x27, 0x9B, 0x2C, 0x6D, 0x16, 0x91, 0x10, + 0xFD, 0xED, 0x2D, 0xE0, 0xDB, 0xDA, 0x1C, 0xD9, 0x72, 0xDD, 0x05, 0xDA, + 0x13, 0xD3, 0xE6, 0xC9, 0x08, 0xCF, 0xB9, 0xCF, 0x65, 0xEB, 0xDE, 0xE2, + 0x69, 0x04, 0xB2, 0xE9, 0xCD, 0x07, 0xC0, 0xEC, 0xDF, 0x0E, 0x23, 0xF2, + 0xEC, 0x0D, 0x87, 0xEC, 0xEB, 0xED, 0x6D, 0xE0, 0xCF, 0xD9, 0x32, 0xEB, + 0xDA, 0xEC, 0xD8, 0x03, 0x7D, 0x06, 0x2B, 0x14, 0x67, 0x1E, 0xA4, 0x1A, + 0x88, 0x39, 0xD2, 0x22, 0xDE, 0x4E, 0x31, 0x3C, 0xB2, 0x3D, 0x0D, 0x41, + 0x01, 0x2E, 0xE6, 0x3A, 0xD5, 0x3F, 0x81, 0x45, 0x9D, 0x41, 0xCC, 0x4B, + 0x41, 0x26, 0xD9, 0x37, 0x87, 0x1A, 0x57, 0x25, 0xD6, 0x1B, 0x14, 0x1B, + 0x14, 0x06, 0x47, 0xFB, 0xA8, 0xFD, 0x91, 0xE9, 0x51, 0x10, 0xAD, 0xF7, + 0x1F, 0x1B, 0xB7, 0x0B, 0x90, 0x28, 0x47, 0x25, 0x8F, 0x39, 0x89, 0x47, + 0x31, 0x2B, 0xCA, 0x4B, 0x62, 0x1A, 0x0E, 0x38, 0xBE, 0x1E, 0xE3, 0x2F, + 0x5E, 0x14, 0xD5, 0x25, 0xE2, 0xF2, 0x70, 0x0A, 0x24, 0xDE, 0x15, 0xF0, + 0xBB, 0xD6, 0xB1, 0xE8, 0xB9, 0xD2, 0x46, 0xEE, 0xFF, 0xDE, 0xD4, 0xFC, + 0x5C, 0xE5, 0x06, 0x04, 0xFC, 0xDF, 0x7C, 0x00, 0x88, 0xDC, 0xFC, 0xFD, + 0x90, 0xCF, 0x5E, 0xF1, 0xCF, 0xC4, 0x74, 0xF0, 0x1E, 0xBB, 0x01, 0xF0, + 0x8D, 0xAD, 0xE0, 0xDB, 0x5D, 0xB5, 0x75, 0xDF, 0xA7, 0xBA, 0x47, 0xED, + 0x74, 0xAB, 0x27, 0xE2, 0xB1, 0xB3, 0x3C, 0xDA, 0xCA, 0xDA, 0x55, 0xF2, + 0x84, 0xFA, 0x32, 0x0A, 0xEF, 0xFB, 0xDF, 0x07, 0x89, 0xEF, 0xB8, 0x0D, + 0x77, 0xEF, 0x19, 0x21, 0x44, 0xDC, 0xEE, 0x07, 0x50, 0xC1, 0xC0, 0xDD, + 0xA4, 0xBF, 0xA0, 0xD3, 0xCA, 0xC0, 0x0F, 0xBF, 0x28, 0xCC, 0x79, 0xBD, + 0x3D, 0xD4, 0x16, 0xE6, 0x1A, 0xC9, 0x96, 0xFE, 0x60, 0xD6, 0xCC, 0x12, + 0xAF, 0xFC, 0x15, 0x35, 0xCF, 0x17, 0x64, 0x45, 0x2A, 0x24, 0x52, 0x32, + 0x7E, 0x1E, 0x76, 0x15, 0x66, 0x0B, 0x3C, 0x0E, 0x01, 0xF7, 0xBC, 0x0B, + 0xEA, 0xDE, 0xD7, 0xFD, 0x49, 0xCB, 0x41, 0xEF, 0x6A, 0xCB, 0x62, 0xEE, + 0x19, 0xD0, 0xE5, 0xEB, 0x79, 0xD2, 0xFE, 0xE5, 0xDE, 0xE9, 0x9B, 0xF4, + 0x3C, 0xED, 0xA7, 0xF2, 0xE9, 0xDC, 0x16, 0xE9, 0xDE, 0xE6, 0x2A, 0xEC, + 0xA1, 0xDE, 0x07, 0xD6, 0xF9, 0xB9, 0x57, 0xBB, 0x84, 0xC0, 0xD4, 0xCB, + 0x52, 0xD6, 0xB9, 0xCF, 0x2A, 0xC9, 0x86, 0xB6, 0x68, 0xC8, 0xD8, 0xC4, + 0x94, 0xE1, 0xC4, 0xDF, 0x67, 0xEE, 0x28, 0xEA, 0xD5, 0xF5, 0x08, 0x00, + 0x77, 0x09, 0xD9, 0x12, 0xD4, 0x0C, 0x18, 0x08, 0x4E, 0x01, 0xF5, 0x04, + 0xA4, 0xEE, 0x06, 0x00, 0xA0, 0xCE, 0x8A, 0xD1, 0x6A, 0xBA, 0xDE, 0xB8, + 0x3B, 0xB4, 0xC3, 0xC2, 0x0E, 0xC5, 0x5A, 0xD4, 0x19, 0xE2, 0xBD, 0xEC, + 0xD1, 0xF5, 0x6B, 0x04, 0x7A, 0x1B, 0x79, 0x25, 0x1E, 0x32, 0xD0, 0x2E, + 0x7F, 0x20, 0x41, 0x20, 0x46, 0x0E, 0xB7, 0x10, 0xDF, 0x07, 0xEC, 0x02, + 0x9C, 0xF8, 0x58, 0xF7, 0xDC, 0xD8, 0xAC, 0xDC, 0xFC, 0xBE, 0x9A, 0xC5, + 0xE5, 0xAC, 0x28, 0xC1, 0x62, 0xA2, 0x24, 0xC4, 0x57, 0xAF, 0xEC, 0xC3, + 0x4B, 0xBE, 0x23, 0xBF, 0x6D, 0xB1, 0x5C, 0xAC, 0x4D, 0xBC, 0x05, 0xAE, + 0x87, 0xD9, 0xC1, 0xCB, 0x3D, 0xC7, 0x98, 0xCD, 0xA4, 0x9F, 0x61, 0xB2, + 0x5C, 0xA8, 0xDA, 0xAB, 0xE9, 0xCB, 0xB9, 0xBE, 0x38, 0xD6, 0xEA, 0xC7, + 0x01, 0xD5, 0xE8, 0xC6, 0x89, 0xEE, 0xA3, 0xE4, 0x35, 0x05, 0x85, 0x04, + 0x26, 0x01, 0xD7, 0x0C, 0x80, 0x1A, 0x89, 0x2E, 0x9C, 0x28, 0x7D, 0x3A, + 0xED, 0x18, 0xDC, 0x20, 0x42, 0x10, 0x5C, 0x13, 0xA9, 0xEE, 0xD5, 0xFA, + 0x7A, 0xC4, 0x40, 0xD1, 0xBF, 0xCC, 0x1F, 0xCD, 0x7E, 0xF2, 0x73, 0xE7, + 0x22, 0x00, 0x1F, 0xEF, 0x4B, 0x1A, 0x02, 0x07, 0x75, 0x39, 0x65, 0x30, + 0x37, 0x39, 0x1E, 0x4A, 0x30, 0x34, 0x29, 0x4F, 0x5A, 0x29, 0xF3, 0x37, + 0xBE, 0x20, 0x64, 0x1F, 0x76, 0x17, 0x6B, 0x08, 0xB8, 0x08, 0xA6, 0xEF, + 0x4E, 0x00, 0x61, 0xEE, 0xAE, 0xF0, 0x76, 0xF2, 0x2F, 0xE7, 0x22, 0xE8, + 0x2B, 0xF2, 0x65, 0xE9, 0xB9, 0x07, 0x49, 0x00, 0xC0, 0x05, 0x31, 0xFD, + 0x98, 0xF9, 0x64, 0xF0, 0xA6, 0xFA, 0x8C, 0x05, 0x32, 0xE6, 0x4B, 0x06, + 0x74, 0xC8, 0x26, 0xDF, 0x96, 0xC9, 0x97, 0xD4, 0x66, 0xEA, 0x3D, 0xF0, + 0x77, 0xFC, 0x65, 0xEC, 0x81, 0xFA, 0xC2, 0xD8, 0xBB, 0x04, 0xEE, 0xEE, + 0xE6, 0x0B, 0xA6, 0x07, 0xC1, 0x10, 0xAC, 0x0F, 0x1C, 0x23, 0x12, 0x2A, + 0xA4, 0x31, 0xDD, 0x38, 0xF4, 0x31, 0xD2, 0x26, 0x77, 0x28, 0x06, 0x11, + 0x78, 0x1F, 0xAB, 0x03, 0xDE, 0x0D, 0x70, 0xED, 0x20, 0xE6, 0xD2, 0xCD, + 0xA3, 0xD7, 0x09, 0xD7, 0xB5, 0xF8, 0x58, 0x01, 0x94, 0x12, 0xF5, 0x15, + 0x8C, 0x28, 0xCD, 0x28, 0x36, 0x4D, 0x97, 0x4A, 0x5F, 0x59, 0xEE, 0x5A, + 0x09, 0x53, 0xF9, 0x55, 0x4A, 0x54, 0x9D, 0x43, 0x37, 0x50, 0x21, 0x29, + 0xBD, 0x31, 0x0E, 0x11, 0x8D, 0x17, 0xBC, 0x04, 0x5F, 0x0D, 0x0D, 0xFA, + 0xA5, 0x0C, 0x10, 0xFD, 0xE1, 0x23, 0x61, 0x0F, 0x21, 0x40, 0xA6, 0x15, + 0xC7, 0x3B, 0xA1, 0x0C, 0x04, 0x26, 0x01, 0x0A, 0xE2, 0x33, 0x27, 0x1A, + 0xCA, 0x3F, 0x8B, 0x19, 0x43, 0x24, 0xE9, 0xFF, 0xB6, 0x20, 0x79, 0xF6, + 0x70, 0x38, 0x5E, 0xF9, 0x26, 0x37, 0x21, 0xF0, 0x1E, 0x29, 0x48, 0xE9, + 0x6A, 0x2E, 0x6B, 0xF1, 0xD1, 0x36, 0x95, 0xFC, 0x99, 0x37, 0x12, 0x09, + 0x89, 0x52, 0x37, 0x2C, 0x97, 0x63, 0x6D, 0x40, 0x54, 0x53, 0xEC, 0x2C, + 0x02, 0x3F, 0x69, 0x17, 0x1D, 0x1D, 0x18, 0x0B, 0xD1, 0xDF, 0xD5, 0xEE, + 0xA9, 0xBB, 0x10, 0xCF, 0x56, 0xD3, 0x58, 0xC8, 0x91, 0xF6, 0x50, 0xD4, + 0xC0, 0x0E, 0x5A, 0xEC, 0x83, 0x21, 0x40, 0x0C, 0x62, 0x36, 0x84, 0x34, + 0xD9, 0x45, 0x59, 0x50, 0xED, 0x49, 0x10, 0x4E, 0x8D, 0x45, 0x0B, 0x3A, + 0xE0, 0x35, 0x1B, 0x29, 0x98, 0x12, 0x40, 0x0E, 0x8F, 0xF2, 0xBF, 0xF2, + 0x26, 0xE1, 0x5F, 0xE5, 0xA2, 0xD9, 0xFA, 0xE6, 0x73, 0xED, 0x2E, 0x00, + 0xB6, 0x0C, 0x35, 0x13, 0x7A, 0x12, 0xB3, 0x04, 0xA8, 0x0F, 0x76, 0xF5, + 0x1F, 0x0C, 0xEB, 0xF5, 0x31, 0xFC, 0xC3, 0xF3, 0x58, 0xF3, 0x00, 0xF3, + 0x36, 0xF6, 0x24, 0xF2, 0x16, 0x0E, 0x53, 0xFC, 0x24, 0x2C, 0x25, 0x0A, + 0x16, 0x2F, 0x50, 0x01, 0x3C, 0x25, 0xF8, 0xFC, 0x18, 0x25, 0x2A, 0x10, + 0x00, 0x2F, 0x7A, 0x27, 0xCC, 0x34, 0xFC, 0x32, 0xCE, 0x3C, 0x20, 0x43, + 0xE0, 0x3B, 0x8F, 0x50, 0x80, 0x24, 0x90, 0x46, 0xE2, 0x19, 0x44, 0x3E, + 0x95, 0x18, 0xE7, 0x28, 0xE5, 0x0D, 0x24, 0x03, 0x53, 0x07, 0xC9, 0xF8, + 0x7F, 0x12, 0xE5, 0x0A, 0x72, 0x29, 0xA4, 0x1D, 0x5E, 0x40, 0xEF, 0x34, + 0x93, 0x53, 0x36, 0x58, 0xFD, 0x5D, 0x58, 0x67, 0x31, 0x5C, 0xA2, 0x58, + 0x92, 0x56, 0xDE, 0x48, 0x2D, 0x51, 0x4E, 0x37, 0x35, 0x41, 0x0A, 0x1C, + 0x65, 0x2A, 0xB8, 0x12, 0x87, 0x14, 0xC2, 0x1C, 0x66, 0x0E, 0x2B, 0x24, + 0x01, 0x11, 0x9D, 0x17, 0x61, 0x1A, 0x00, 0x07, 0x60, 0x21, 0xE0, 0xFE, + 0x37, 0x0F, 0xBD, 0xFB, 0xA4, 0x00, 0x8D, 0x08, 0x07, 0x01, 0x39, 0x10, + 0x48, 0xF9, 0x39, 0x05, 0xCD, 0xE4, 0x32, 0xF7, 0xDC, 0xF0, 0x97, 0xFE, + 0x11, 0x0D, 0xDA, 0xFC, 0x9D, 0x00, 0x2C, 0xD9, 0x8A, 0xF7, 0x51, 0xD1, + 0x02, 0xF4, 0x3F, 0xDA, 0xC4, 0xEF, 0xA0, 0xE4, 0xE2, 0x02, 0xAB, 0x05, + 0x70, 0x1B, 0xB8, 0x26, 0x58, 0x17, 0x4E, 0x22, 0xB0, 0x0D, 0x30, 0x0D, + 0x6A, 0x13, 0xCE, 0x03, 0xF5, 0xEA, 0x2B, 0xE1, 0x9C, 0xB6, 0x0D, 0xC6, + 0xFE, 0xBD, 0x85, 0xDA, 0x34, 0xE7, 0x92, 0x01, 0x77, 0x01, 0x0A, 0x1D, + 0xF7, 0x13, 0xCB, 0x2F, 0x26, 0x31, 0xDA, 0x45, 0x1F, 0x3D, 0x9A, 0x50, + 0x12, 0x38, 0xFC, 0x49, 0xED, 0x36, 0x09, 0x38, 0xCB, 0x2D, 0x33, 0x23, + 0x85, 0x02, 0x37, 0x04, 0x48, 0xDC, 0x33, 0xEF, 0xD7, 0xD9, 0x76, 0xF0, + 0xB4, 0xE1, 0x9C, 0xF4, 0x9C, 0xF5, 0xDA, 0x01, 0x63, 0x0B, 0xFE, 0x0F, + 0xD2, 0x0C, 0x44, 0x12, 0x44, 0x02, 0x42, 0x14, 0xC6, 0xF7, 0x64, 0x1F, + 0xC9, 0xEB, 0x37, 0x29, 0x73, 0xE0, 0x3D, 0x1C, 0x9E, 0xE2, 0x26, 0xFC, + 0x1F, 0xFC, 0x21, 0xF1, 0x25, 0x03, 0x69, 0xEC, 0x38, 0xF4, 0x28, 0xE4, + 0x47, 0xF6, 0xCB, 0xF8, 0xAE, 0xE7, 0xEC, 0x03, 0xEB, 0xDB, 0x91, 0x00, + 0x8F, 0xF5, 0xC9, 0x07, 0xEA, 0x03, 0x3C, 0xFF, 0x64, 0x00, 0xB8, 0xEC, + 0x34, 0xF9, 0x24, 0xE0, 0x14, 0xD9, 0x31, 0xD2, 0xB2, 0xAC, 0x25, 0xC7, + 0x56, 0x96, 0x68, 0xBA, 0x65, 0xA3, 0x3E, 0xB3, 0x73, 0xBC, 0x1F, 0xB8, + 0x0C, 0xD1, 0xB7, 0xC5, 0x46, 0xEE, 0xBD, 0xE6, 0xCC, 0x06, 0x6F, 0x0D, + 0xA9, 0x04, 0x18, 0x19, 0x40, 0x09, 0x08, 0x1E, 0x94, 0x14, 0x38, 0x1E, + 0xAB, 0xFF, 0x16, 0xF7, 0xAE, 0xD7, 0xE5, 0xC3, 0xFE, 0xB6, 0xF2, 0xB3, + 0x25, 0xA3, 0x66, 0xBB, 0x71, 0xA5, 0x8B, 0xBE, 0xF9, 0xBD, 0x75, 0xC5, + 0xAE, 0xD6, 0x3F, 0xD9, 0xF2, 0xDC, 0x97, 0xE2, 0xE6, 0xD9, 0x4D, 0xE1, + 0x1C, 0xCF, 0xCD, 0xE3, 0x92, 0xBD, 0xA6, 0xE1, 0xD5, 0xB7, 0x9E, 0xD6, + 0x56, 0xBE, 0x78, 0xCE, 0x99, 0xCE, 0x19, 0xDB, 0x52, 0xD3, 0x66, 0xDB, + 0x7D, 0xD6, 0x79, 0xD2, 0x37, 0xDA, 0xA1, 0xD4, 0x70, 0xDC, 0xF6, 0xE7, + 0xBE, 0xEA, 0xCE, 0x10, 0xFF, 0xFD, 0xC4, 0x33, 0x11, 0x17, 0x69, 0x41, + 0xB2, 0x14, 0xAB, 0x25, 0xA7, 0x0B, 0x5D, 0x16, 0xEB, 0x01, 0x32, 0x1D, + 0xF3, 0xDB, 0x91, 0x02, 0x76, 0xC9, 0xAF, 0xE9, 0x89, 0xD4, 0xCB, 0xE2, + 0x99, 0xE8, 0x63, 0xE3, 0xFF, 0xFB, 0xBE, 0xF0, 0x78, 0x19, 0x77, 0x1D, + 0xD4, 0x3A, 0xA6, 0x4C, 0x75, 0x3C, 0x1D, 0x48, 0x0E, 0x3A, 0xA6, 0x40, + 0x0D, 0x42, 0x4D, 0x4A, 0xA0, 0x34, 0xBA, 0x34, 0xAE, 0x09, 0xB1, 0x01, + 0x0B, 0xE6, 0x0A, 0xE3, 0xFC, 0xDD, 0xF1, 0xDD, 0xFD, 0xE1, 0x03, 0xDF, + 0xC4, 0xF2, 0xCE, 0xF3, 0xEF, 0x0F, 0x5D, 0x16, 0x5A, 0x17, 0x16, 0x22, + 0x20, 0x03, 0xEE, 0x12, 0x4B, 0xF1, 0x00, 0x06, 0x89, 0xE5, 0x03, 0x06, + 0x66, 0xD8, 0xB8, 0x04, 0x9F, 0xD8, 0xCF, 0xFA, 0xE1, 0xF3, 0xCF, 0xF7, + 0xA9, 0x07, 0x2D, 0xF7, 0x5F, 0x04, 0x71, 0xF0, 0x91, 0x02, 0x20, 0xF2, + 0x78, 0xFF, 0x4F, 0xFC, 0xFC, 0xF6, 0x25, 0x06, 0x2E, 0xF7, 0xE6, 0x0B, + 0x1D, 0xF5, 0xA2, 0x04, 0x38, 0xF0, 0x58, 0xFF, 0x39, 0xEB, 0x85, 0xEE, + 0xC9, 0xE0, 0xB1, 0xCF, 0x03, 0xC2, 0x58, 0xB6, 0x85, 0xA1, 0xF3, 0xA1, + 0xB5, 0xA8, 0x50, 0x9E, 0x5B, 0xB6, 0x60, 0xA6, 0x29, 0xCA, 0x4C, 0xC9, + 0x38, 0xE8, 0xE4, 0xF0, 0xD0, 0xFB, 0xB7, 0x08, 0x83, 0x1E, 0xEB, 0x28, + 0x98, 0x31, 0x4D, 0x26, 0x78, 0x1C, 0x3B, 0x04, 0x36, 0xFC, 0x7A, 0xEC, + 0x41, 0xD4, 0xD6, 0xCF, 0xE7, 0xBC, 0x33, 0xC3, 0x4A, 0xBD, 0x15, 0xCB, + 0xB0, 0xCE, 0xD6, 0xD1, 0xDD, 0xEE, 0xE1, 0xDE, 0x68, 0x00, 0x3C, 0xEB, + 0x6F, 0x00, 0xC3, 0xEF, 0x9D, 0x08, 0x6A, 0x00, 0x6C, 0x04, 0x75, 0x0C, + 0x63, 0xEC, 0x30, 0x0D, 0xD7, 0xE5, 0x2F, 0x10, 0x9C, 0xF6, 0xA0, 0x04, + 0xF9, 0x05, 0x3E, 0xEB, 0x00, 0x0F, 0x94, 0xDB, 0x9E, 0x1C, 0xAA, 0xE2, + 0xF2, 0x19, 0xA6, 0xEA, 0xD1, 0x06, 0x00, 0xEF, 0x32, 0x04, 0x84, 0xF5, + 0xD8, 0x1B, 0x55, 0xFB, 0x01, 0x33, 0x07, 0x01, 0xD6, 0x21, 0x2F, 0xF7, + 0x4D, 0xF5, 0x59, 0xEC, 0x9D, 0xCC, 0xA0, 0xE4, 0xD3, 0xB0, 0x55, 0xD2, + 0x4F, 0xA8, 0x75, 0xC3, 0xC3, 0xAC, 0x9E, 0xC0, 0xBF, 0xBF, 0x4C, 0xC8, + 0xCB, 0xE8, 0xB7, 0xDB, 0x53, 0x10, 0xCA, 0xFD, 0x09, 0x1F, 0xBF, 0x1D, + 0x51, 0x2C, 0xC6, 0x2C, 0x36, 0x45, 0x3E, 0x2B, 0xDC, 0x43, 0xE6, 0x15, + 0x50, 0x14, 0x63, 0xE6, 0x40, 0xE3, 0x54, 0xB9, 0x85, 0xC0, 0x79, 0xA7, + 0xE5, 0xAF, 0xAB, 0xB0, 0x25, 0xB6, 0x3F, 0xC0, 0xD3, 0xCD, 0xDD, 0xC8, + 0x83, 0xFA, 0x50, 0xDC, 0xFD, 0x0B, 0x8C, 0xE1, 0x56, 0x08, 0x58, 0xE6, + 0xF3, 0xFC, 0x41, 0xEC, 0x3F, 0xE8, 0xFF, 0xDC, 0x78, 0xE6, 0xF8, 0xD8, + 0xCA, 0xF2, 0x9C, 0xE5, 0x90, 0xF8, 0x5C, 0xE2, 0xE7, 0xEF, 0x92, 0xC7, + 0x19, 0xF8, 0x7E, 0xCC, 0xE2, 0x0C, 0x5B, 0xEF, 0xF3, 0x12, 0x71, 0xF8, + 0xEA, 0x16, 0xEA, 0xFF, 0x4F, 0x22, 0xA2, 0x19, 0x9D, 0x2A, 0x43, 0x22, + 0x9C, 0x1F, 0x77, 0x17, 0x5F, 0x0E, 0xB5, 0x13, 0xCE, 0x02, 0xD4, 0x0B, + 0x3F, 0xEB, 0xA0, 0xF3, 0x44, 0xD7, 0xE5, 0xEA, 0xEB, 0xE4, 0x65, 0xF3, + 0x3B, 0xF8, 0x4E, 0xF6, 0x23, 0x05, 0x23, 0x03, 0x53, 0x27, 0x2B, 0x25, + 0x03, 0x3C, 0x11, 0x43, 0xFD, 0x39, 0xE3, 0x4F, 0xBA, 0x46, 0xC3, 0x46, + 0xB8, 0x4F, 0x79, 0x2A, 0x73, 0x2D, 0x22, 0x04, 0x4F, 0x00, 0xA3, 0xDF, + 0x69, 0xEF, 0x46, 0xD1, 0xAF, 0xE8, 0x9E, 0xDD, 0x68, 0xD6, 0x49, 0xDA, + 0xA0, 0xDD, 0xBF, 0xD5, 0x87, 0x04, 0x9A, 0xEB, 0x2C, 0x0D, 0x6E, 0xF4, + 0x0F, 0x0C, 0xC0, 0xFD, 0x9D, 0x0E, 0x04, 0x05, 0x38, 0xEC, 0x66, 0xF2, + 0x63, 0xCC, 0x55, 0xEC, 0x96, 0xD8, 0x68, 0xFC, 0x5E, 0xEE, 0x1E, 0xFE, + 0x18, 0xF4, 0x56, 0xEC, 0x98, 0x0C, 0xF1, 0xE7, 0xCF, 0x33, 0xF7, 0xF9, + 0xE6, 0x31, 0x38, 0x0C, 0xB8, 0x18, 0x3C, 0x16, 0x9D, 0x1E, 0xB9, 0x25, + 0x40, 0x36, 0x4D, 0x2D, 0x7D, 0x34, 0xA9, 0x16, 0x5B, 0x20, 0x16, 0xFA, + 0xBC, 0x01, 0xA3, 0xDD, 0x11, 0xDD, 0x15, 0xC3, 0xDB, 0xD9, 0x10, 0xC6, + 0x81, 0xE5, 0x89, 0xCC, 0x05, 0xEB, 0x71, 0xD4, 0xD0, 0x09, 0x41, 0x08, + 0x0C, 0x2E, 0x80, 0x36, 0x14, 0x38, 0xD0, 0x3A, 0xE6, 0x2B, 0x3B, 0x37, + 0xCA, 0x1E, 0x1E, 0x2B, 0xEF, 0x17, 0x2A, 0x18, 0x8B, 0xF9, 0x94, 0xFE, + 0x0B, 0xCE, 0xF9, 0xD6, 0x8E, 0xB5, 0x70, 0xB2, 0x13, 0xB0, 0xFA, 0xAF, + 0x51, 0xBC, 0x45, 0xCB, 0x63, 0xDA, 0xBF, 0xE0, 0xFD, 0xEA, 0xEB, 0xE8, + 0xA2, 0xEA, 0xAA, 0xF4, 0xF3, 0xF7, 0x84, 0x0A, 0x26, 0x00, 0x7A, 0x18, + 0xE0, 0xE4, 0x98, 0x0D, 0xD0, 0xD3, 0x68, 0x03, 0x9C, 0xF0, 0x96, 0x07, + 0x9B, 0x09, 0x7A, 0x02, 0x16, 0x1B, 0xE0, 0xFD, 0x05, 0x34, 0x28, 0x06, + 0x16, 0x4A, 0x09, 0x26, 0xFD, 0x49, 0x13, 0x3F, 0xAC, 0x4B, 0x80, 0x44, + 0xCA, 0x5D, 0xF2, 0x4B, 0x1B, 0x55, 0x8F, 0x42, 0xF8, 0x40, 0x2C, 0x28, + 0x81, 0x2D, 0x92, 0x14, 0xD9, 0x07, 0x1A, 0x0F, 0x09, 0xE9, 0x54, 0x0D, + 0xEE, 0xE8, 0x48, 0x07, 0x3C, 0x03, 0x85, 0x07, 0x42, 0x31, 0xCE, 0x21, + 0xEB, 0x52, 0x3F, 0x3D, 0xEA, 0x55, 0x03, 0x4C, 0xD4, 0x54, 0xA6, 0x5D, + 0xFA, 0x4C, 0xF7, 0x52, 0x3E, 0x3A, 0xB6, 0x33, 0x76, 0x1E, 0x53, 0x15, + 0x75, 0x00, 0x42, 0xF4, 0x4E, 0xE0, 0x86, 0xD2, 0x5C, 0xBE, 0x55, 0xC1, + 0x09, 0xBB, 0xD2, 0xC5, 0xF7, 0xCC, 0x73, 0xC9, 0x0D, 0xE0, 0x6A, 0xE0, + 0xC1, 0xF5, 0x48, 0xFD, 0x39, 0x07, 0x15, 0x02, 0x64, 0x11, 0x24, 0x0A, + 0x83, 0x10, 0x16, 0x11, 0x9E, 0x01, 0x94, 0x04, 0x40, 0xFD, 0x8D, 0x11, + 0xED, 0x07, 0x5F, 0x27, 0x0D, 0x0D, 0xFB, 0x15, 0x54, 0x0A, 0x90, 0x07, + 0x2F, 0x16, 0x5A, 0x11, 0x2E, 0x29, 0xA1, 0x1B, 0xD6, 0x2D, 0xAF, 0x27, + 0xFC, 0x3C, 0x42, 0x38, 0x9B, 0x4E, 0xA6, 0x44, 0xB6, 0x40, 0x45, 0x49, + 0x2C, 0x1E, 0x83, 0x3A, 0x50, 0x03, 0x38, 0x1E, 0x59, 0xEE, 0x6D, 0x15, + 0xED, 0xDB, 0x8F, 0x19, 0x71, 0xDC, 0x83, 0x0F, 0x36, 0xF1, 0x6A, 0x0F, + 0xAE, 0x13, 0xD5, 0x2D, 0xE7, 0x34, 0xF5, 0x4D, 0x1E, 0x4D, 0xCD, 0x5B, + 0xCD, 0x5B, 0x16, 0x5D, 0x14, 0x4D, 0xB6, 0x51, 0xB5, 0x2A, 0x88, 0x3D, + 0xB3, 0x07, 0x11, 0x1A, 0x61, 0xFA, 0x3C, 0x01, 0xDB, 0xF0, 0x30, 0xF1, + 0xA0, 0xDC, 0x94, 0xD4, 0x64, 0xDD, 0x08, 0xD7, 0x5D, 0xEE, 0x36, 0xF9, + 0xBE, 0xF7, 0x97, 0x07, 0xFE, 0x00, 0xD8, 0x05, 0xF6, 0x1A, 0xD3, 0x0E, + 0x40, 0x28, 0xF4, 0x12, 0x06, 0x10, 0x84, 0x02, 0x4C, 0xF7, 0x31, 0xFF, + 0x71, 0xFB, 0x0B, 0x18, 0xDC, 0xF7, 0x22, 0x13, 0x7E, 0xED, 0x0A, 0xFA, + 0x56, 0x06, 0x79, 0x05, 0x38, 0x1C, 0x2F, 0x0F, 0xCA, 0x17, 0x2D, 0x06, + 0x29, 0x1C, 0xF7, 0x12, 0x74, 0x2C, 0x65, 0x27, 0x3A, 0x2E, 0xC6, 0x22, + 0x4B, 0x1D, 0xD3, 0x16, 0xD7, 0xFD, 0x5B, 0x02, 0x2E, 0xDD, 0xE0, 0xE3, + 0x7B, 0xD2, 0xD0, 0xD6, 0x5A, 0xD4, 0xBE, 0xD5, 0xE4, 0xDE, 0xB3, 0xE0, + 0xEA, 0x03, 0x03, 0x0D, 0xC4, 0x2F, 0xA7, 0x3A, 0x1C, 0x44, 0x6C, 0x46, + 0xFA, 0x44, 0x64, 0x48, 0x0F, 0x43, 0x44, 0x4D, 0x50, 0x30, 0xF0, 0x41, + 0xCD, 0xFF, 0x6F, 0x1A, 0x5E, 0xDA, 0x6C, 0xF3, 0x7A, 0xC8, 0x9C, 0xDA, + 0x0D, 0xC7, 0xEF, 0xD3, 0x1D, 0xD2, 0x50, 0xE0, 0x72, 0xE2, 0x9D, 0xEE, + 0x76, 0xEE, 0xE6, 0xF2, 0xC1, 0xE0, 0xE8, 0xE8, 0xFE, 0xE8, 0x7B, 0xF6, + 0x36, 0x03, 0xD4, 0x0C, 0xAF, 0xFC, 0xD2, 0x03, 0xBC, 0xE3, 0xDB, 0xF6, + 0xD6, 0xDE, 0xCC, 0x00, 0xB8, 0xD9, 0x53, 0xFF, 0x40, 0xD2, 0x4E, 0xF0, + 0x3C, 0xE8, 0xDE, 0xF6, 0xD8, 0xFE, 0x66, 0x01, 0x94, 0x0F, 0x7A, 0x08, + 0x6A, 0x1B, 0x6C, 0x15, 0x08, 0x1E, 0xFE, 0x20, 0xCD, 0x20, 0xFC, 0x21, + 0x41, 0x22, 0x0D, 0x1C, 0x7A, 0x19, 0x8F, 0x0D, 0x4E, 0xF6, 0xEA, 0xED, + 0x0B, 0xD6, 0x05, 0xDE, 0x93, 0xCA, 0x95, 0xEF, 0x14, 0xC4, 0x12, 0xFC, + 0x88, 0xDB, 0x25, 0x15, 0x07, 0x0E, 0x33, 0x4C, 0x2A, 0x35, 0xED, 0x56, + 0x88, 0x51, 0x4B, 0x48, 0x78, 0x5D, 0x26, 0x57, 0x45, 0x52, 0x8D, 0x4E, + 0xB8, 0x33, 0xCE, 0x23, 0x54, 0x0C, 0x22, 0x02, 0xCD, 0xFE, 0xB0, 0xF0, + 0x62, 0xED, 0x24, 0xD8, 0x58, 0xC6, 0x5F, 0xB8, 0x10, 0xBC, 0xA3, 0xAF, + 0x20, 0xD1, 0x63, 0xC7, 0xE0, 0xD6, 0xE2, 0xDD, 0xA2, 0xD5, 0xA7, 0xEE, + 0x83, 0xEF, 0x7C, 0xFE, 0x0A, 0xFB, 0xC5, 0xF8, 0x30, 0xDF, 0x29, 0xDE, + 0xD6, 0xCE, 0xFB, 0xC9, 0xE7, 0xC1, 0xCA, 0xC1, 0x1F, 0xAF, 0xA2, 0xAE, + 0xD7, 0xAD, 0xF7, 0x9B, 0x37, 0xBA, 0xFD, 0xAB, 0x05, 0xC9, 0x3F, 0xC6, + 0x91, 0xD1, 0xB9, 0xC7, 0x63, 0xE7, 0xA0, 0xC5, 0xC8, 0xF1, 0xC1, 0xCD, + 0x01, 0xE6, 0xAA, 0xDA, 0xFA, 0xE7, 0xEB, 0xDB, 0x3F, 0xE1, 0x04, 0xC9, + 0x2A, 0xCD, 0xE8, 0xC3, 0xEE, 0xBA, 0xFF, 0xC3, 0xD9, 0xB2, 0xCF, 0xBA, + 0x51, 0xBA, 0x5E, 0xCA, 0xCA, 0xDA, 0x32, 0xFA, 0xFB, 0x13, 0xDF, 0x2C, + 0x72, 0x39, 0x59, 0x47, 0x05, 0x52, 0x16, 0x58, 0x1D, 0x5A, 0xA8, 0x4C, + 0xFE, 0x3A, 0x39, 0x1F, 0x12, 0xFD, 0x9A, 0xF2, 0x5C, 0xCB, 0x16, 0xD3, + 0x6C, 0xC1, 0x89, 0xC7, 0x3F, 0xB1, 0x63, 0xBF, 0x2B, 0xAE, 0x1B, 0xB8, + 0x81, 0xD3, 0xA5, 0xC3, 0xA6, 0xE7, 0x96, 0xD6, 0x00, 0xE2, 0xE5, 0xE1, + 0x79, 0xE0, 0xF5, 0xE7, 0xB5, 0xE0, 0x0B, 0xF2, 0xE0, 0xCD, 0xFA, 0xDF, + 0x84, 0xCD, 0xB6, 0xCB, 0xD3, 0xDC, 0xDF, 0xD8, 0x0A, 0xB7, 0x7A, 0xC5, + 0x21, 0x98, 0x2C, 0xAE, 0x7D, 0xB2, 0xD3, 0xCD, 0x2B, 0xC1, 0x1A, 0xDF, + 0xB5, 0xC4, 0xE5, 0xC3, 0x40, 0xDD, 0x9E, 0xB9, 0x57, 0xEE, 0xCF, 0xCF, + 0x81, 0xEF, 0x54, 0xDE, 0xF2, 0xDD, 0x45, 0xCB, 0x6B, 0xCB, 0x3E, 0xB6, + 0x5D, 0xCA, 0xA0, 0xBC, 0x99, 0xBE, 0x84, 0xBB, 0x14, 0xB5, 0x5E, 0xB3, + 0xE5, 0xC7, 0xA9, 0xC1, 0xAB, 0xE8, 0xBF, 0xD8, 0x1C, 0x05, 0x40, 0xF7, + 0x4D, 0x20, 0x85, 0x1C, 0xE8, 0x3C, 0xE9, 0x2C, 0x23, 0x49, 0x49, 0x22, + 0xC9, 0x39, 0x0B, 0x0C, 0x23, 0x16, 0x19, 0xED, 0xD2, 0xF0, 0x5C, 0xC8, + 0x5A, 0xC8, 0xBD, 0xB0, 0x0D, 0xA5, 0xC2, 0xB1, 0xB7, 0xA3, 0xB7, 0xB9, + 0xB8, 0xBF, 0x59, 0xC1, 0xC5, 0xCA, 0x9E, 0xCA, 0x7F, 0xCD, 0xC9, 0xD8, + 0x02, 0xF2, 0x02, 0xF4, 0xF6, 0x0E, 0x4F, 0x09, 0xC0, 0x04, 0xDA, 0xFB, + 0x34, 0xF6, 0xF2, 0xE6, 0x98, 0xF0, 0x0A, 0xEE, 0xC0, 0xD7, 0x0B, 0xF2, + 0x89, 0xBE, 0xC0, 0xE8, 0xA4, 0xD2, 0xA7, 0xEF, 0x2C, 0xEB, 0xB5, 0x03, + 0xC5, 0xF4, 0x1F, 0x06, 0xEE, 0x0E, 0x2C, 0x0A, 0x6D, 0x16, 0x2F, 0x24, + 0x11, 0x09, 0xE6, 0x1F, 0x3A, 0x12, 0x20, 0x07, 0x4E, 0x18, 0x4F, 0xFA, + 0xE6, 0x06, 0x5F, 0xE5, 0xFE, 0xF9, 0xBD, 0xD4, 0x13, 0xF5, 0xCF, 0xD0, + 0xFB, 0xF6, 0xCD, 0xE4, 0x3B, 0x09, 0x7F, 0x13, 0xCA, 0x1F, 0x93, 0x39, + 0x37, 0x35, 0x3B, 0x4E, 0x7D, 0x53, 0x37, 0x56, 0x8C, 0x61, 0xBB, 0x58, + 0x26, 0x4B, 0xBD, 0x56, 0x72, 0x35, 0x67, 0x3E, 0x41, 0x27, 0xA9, 0x1B, + 0xE5, 0x11, 0x4F, 0x03, 0x5F, 0xFD, 0x22, 0xEC, 0x65, 0xF7, 0x12, 0xE7, + 0xE8, 0x05, 0xE7, 0xF4, 0x0B, 0x0E, 0x04, 0xF5, 0x86, 0x13, 0xCA, 0xFE, + 0xF8, 0x1A, 0x40, 0x19, 0x92, 0x1A, 0x00, 0x22, 0x6F, 0x19, 0x04, 0x0F, + 0x5A, 0x13, 0x75, 0xFD, 0x9C, 0x17, 0x31, 0x08, 0x5C, 0x10, 0xAB, 0x02, + 0x67, 0x01, 0xBA, 0xEE, 0x05, 0x08, 0x3E, 0xFA, 0x76, 0x09, 0xB8, 0x0B, + 0x39, 0x08, 0x3A, 0x08, 0xE4, 0x10, 0x62, 0x09, 0x34, 0x1C, 0xF4, 0x11, + 0xB6, 0x1E, 0x55, 0x03, 0xB3, 0x15, 0xAD, 0xE5, 0xBF, 0x05, 0x47, 0xCE, + 0xB9, 0xEB, 0x19, 0xB8, 0x24, 0xDF, 0x1F, 0xA6, 0xE0, 0xD6, 0xAC, 0xA9, + 0xC7, 0xD3, 0xBA, 0xC1, 0x1D, 0xF5, 0xE7, 0xDF, 0x08, 0x17, 0x62, 0x04, + 0xA3, 0x25, 0x4A, 0x24, 0xE3, 0x34, 0x67, 0x3D, 0xAA, 0x36, 0xE6, 0x51, + 0x12, 0x2A, 0x4B, 0x4E, 0x49, 0x19, 0x02, 0x29, 0x41, 0x00, 0x51, 0xFB, + 0xC8, 0xE4, 0x75, 0xDC, 0x9D, 0xCF, 0xED, 0xC1, 0xDD, 0xCA, 0x6C, 0xBF, + 0x6F, 0xCF, 0x60, 0xD8, 0x0E, 0xDF, 0x4E, 0xE9, 0x03, 0xFF, 0x6A, 0xFC, + 0x69, 0x16, 0x62, 0x20, 0xE0, 0x17, 0x7F, 0x32, 0x77, 0x0C, 0x26, 0x27, + 0x9D, 0x13, 0x07, 0x26, 0x1D, 0x2F, 0x7C, 0x2B, 0xB4, 0x31, 0x15, 0x17, + 0xE1, 0x1F, 0x75, 0xFF, 0x60, 0x18, 0x6B, 0x0A, 0xAD, 0x18, 0xA3, 0x26, + 0x14, 0x14, 0x3A, 0x2C, 0x9F, 0x18, 0xB0, 0x31, 0x0A, 0x27, 0x72, 0x3D, + 0xDC, 0x28, 0x14, 0x30, 0x4F, 0x2B, 0x1F, 0x1C, 0xCB, 0x21, 0x28, 0x0A, + 0x9C, 0xFD, 0xD1, 0xF0, 0xAC, 0xE6, 0x2A, 0xE3, 0x2C, 0xDF, 0x15, 0xEB, + 0xEE, 0xE9, 0xED, 0xFD, 0x39, 0x0E, 0xB9, 0x0E, 0xD9, 0x2A, 0xCE, 0x1F, + 0x32, 0x3B, 0x39, 0x36, 0xCD, 0x55, 0x08, 0x50, 0xB5, 0x5E, 0xFC, 0x5D, + 0x06, 0x48, 0x5D, 0x54, 0x90, 0x33, 0x64, 0x30, 0xB6, 0x2C, 0xC4, 0x13, + 0x5B, 0x19, 0xD9, 0x07, 0x14, 0xF3, 0xAB, 0xEC, 0x6B, 0xE4, 0x01, 0xD6, + 0x73, 0xEF, 0x5B, 0xD9, 0x96, 0x05, 0xAA, 0xF3, 0x01, 0x16, 0x8A, 0x0C, + 0x2B, 0x13, 0xE0, 0x28, 0xAF, 0x22, 0x3B, 0x45, 0x2C, 0x3A, 0x72, 0x38, + 0x5E, 0x38, 0xDC, 0x1E, 0xA9, 0x36, 0xFA, 0x20, 0x4C, 0x35, 0x03, 0x2C, + 0xF6, 0x24, 0x5C, 0x1B, 0xC3, 0x1B, 0x0F, 0x13, 0xBE, 0x1E, 0x40, 0x28, + 0x8E, 0x1B, 0x5D, 0x28, 0x01, 0x1A, 0x28, 0x29, 0x34, 0x2C, 0xCF, 0x40, + 0x89, 0x2F, 0x30, 0x38, 0x24, 0x18, 0xA7, 0x17, 0x3E, 0x06, 0x97, 0x05, + 0x1A, 0xF6, 0x7C, 0xF8, 0x3A, 0xE5, 0xCA, 0xEF, 0x05, 0xE2, 0x6F, 0xEB, + 0x9A, 0xF3, 0x07, 0xEE, 0x33, 0x09, 0x07, 0xF9, 0x40, 0x23, 0x9D, 0x17, + 0xA8, 0x3F, 0x57, 0x3F, 0x02, 0x52, 0xFF, 0x55, 0x57, 0x5F, 0xD4, 0x5E, + 0x47, 0x5A, 0xDC, 0x57, 0xFF, 0x3A, 0xF1, 0x45, 0xC0, 0x12, 0x95, 0x39, + 0xCB, 0xFC, 0x46, 0x28, 0xE3, 0x01, 0xD0, 0x0B, 0xA9, 0x0A, 0x21, 0x01, + 0xB4, 0x0C, 0x23, 0x0B, 0x15, 0x18, 0x37, 0x11, 0xA8, 0x1E, 0xB2, 0x0F, + 0x36, 0x2A, 0x61, 0x29, 0x3A, 0x39, 0x69, 0x42, 0x29, 0x2E, 0xC1, 0x38, + 0x3C, 0x22, 0xCF, 0x31, 0x0E, 0x21, 0x77, 0x35, 0xBA, 0x13, 0x1B, 0x21, + 0x41, 0x09, 0xA6, 0x0A, 0xC4, 0x10, 0xEC, 0x19, 0x08, 0x19, 0xE7, 0x1E, + 0xA9, 0x19, 0xF7, 0x18, 0x5F, 0x22, 0x70, 0x30, 0x68, 0x2C, 0xEE, 0x36, + 0xB1, 0x2C, 0xF5, 0x29, 0x35, 0x29, 0xBC, 0x29, 0xEB, 0x19, 0x13, 0x1C, + 0xB0, 0x06, 0xD8, 0xF3, 0x9B, 0xF2, 0x7F, 0xD6, 0xD7, 0xE2, 0xA3, 0xCD, + 0x67, 0xEB, 0x90, 0xC4, 0x62, 0x06, 0xBB, 0xDC, 0x10, 0x1D, 0x62, 0x0B, + 0x84, 0x28, 0xA2, 0x26, 0x82, 0x25, 0xF2, 0x2D, 0xC7, 0x1C, 0x55, 0x2B, + 0x71, 0x15, 0x3E, 0x22, 0xD2, 0x02, 0xBF, 0x10, 0x87, 0xEB, 0xC4, 0x02, + 0x9F, 0xD2, 0x55, 0xEC, 0xC4, 0xB9, 0xEC, 0xC8, 0x21, 0xA6, 0x3C, 0xB4, + 0x02, 0xA5, 0x71, 0xB9, 0xED, 0xBF, 0x69, 0xC7, 0x84, 0xCC, 0x6D, 0xCB, + 0x85, 0xD6, 0x5E, 0xE3, 0xBC, 0xE4, 0x1F, 0xF9, 0x6D, 0xDE, 0x50, 0xEF, + 0xC6, 0xCE, 0xFC, 0xE4, 0xE0, 0xCB, 0x2A, 0xF0, 0x9C, 0xD7, 0x39, 0xF8, + 0x56, 0xDF, 0x8D, 0xEC, 0xAE, 0xEC, 0x82, 0xF1, 0x8C, 0x05, 0x6A, 0xFA, + 0xA7, 0x0E, 0xE5, 0xF8, 0x1E, 0x0A, 0x51, 0x0B, 0x94, 0x14, 0xB9, 0x28, + 0x30, 0x1C, 0xBD, 0x37, 0x95, 0x07, 0xCF, 0x3A, 0x0B, 0xEE, 0x20, 0x2F, + 0xE6, 0xEB, 0x94, 0x10, 0xD0, 0xE3, 0x2F, 0xF3, 0x85, 0xDF, 0xFA, 0xEA, + 0x86, 0x05, 0x50, 0xF6, 0x15, 0x2B, 0x1E, 0x12, 0x60, 0x3C, 0x94, 0x34, + 0x45, 0x4B, 0x35, 0x46, 0xDD, 0x55, 0x9C, 0x53, 0x59, 0x5E, 0x68, 0x64, + 0xCF, 0x5E, 0x8F, 0x5B, 0x23, 0x3B, 0x34, 0x32, 0x20, 0x05, 0x4E, 0x04, + 0x96, 0xE9, 0xAE, 0xE4, 0x38, 0xDE, 0xB8, 0xCC, 0x57, 0xCB, 0x8A, 0xBE, + 0x94, 0xC5, 0x6D, 0xCB, 0x96, 0xD9, 0xC3, 0xCF, 0xA7, 0xE0, 0x21, 0xC5, + 0x5D, 0xEB, 0xB3, 0xE2, 0x77, 0xFD, 0x66, 0xF7, 0x97, 0xF0, 0x4E, 0xE2, + 0xAA, 0xE2, 0xF6, 0xE0, 0x8D, 0xE1, 0x0B, 0xF7, 0xBE, 0xCF, 0x86, 0xEC, + 0x2E, 0xC0, 0xBC, 0xD1, 0xF2, 0xD0, 0xE5, 0xD6, 0xA1, 0xEE, 0x11, 0xE5, + 0xDC, 0xFB, 0xB1, 0xED, 0x7D, 0x01, 0xF3, 0x09, 0xC8, 0x0C, 0xC0, 0x27, + 0xB7, 0x17, 0xF1, 0x2D, 0xB6, 0x16, 0x62, 0x24, 0xCA, 0x03, 0xFC, 0x0D, + 0xD9, 0xEB, 0x25, 0xFB, 0x4A, 0xD4, 0x84, 0xFA, 0x58, 0xC6, 0x50, 0xF7, + 0x0A, 0xD4, 0x95, 0xF0, 0x43, 0xFD, 0x1C, 0x02, 0xB1, 0x21, 0x51, 0x14, + 0xA3, 0x39, 0xD3, 0x23, 0x2A, 0x4E, 0xE5, 0x42, 0xCA, 0x43, 0x17, 0x41, + 0x1F, 0x2C, 0xB1, 0x1A, 0x9D, 0x1C, 0xAB, 0xFC, 0xB8, 0x00, 0xC4, 0xED, + 0x8D, 0xDD, 0x21, 0xE0, 0xC3, 0xC0, 0xDD, 0xCF, 0xE9, 0xA7, 0x71, 0xC7, + 0xD7, 0x9E, 0x43, 0xD6, 0xAE, 0xB0, 0x2C, 0xEB, 0xE6, 0xC7, 0x5F, 0xF4, + 0xB0, 0xE3, 0x4A, 0xFF, 0x67, 0x01, 0xC7, 0xFA, 0xE4, 0x05, 0x3F, 0xE7, + 0x76, 0xF5, 0x42, 0xDE, 0xEB, 0xEE, 0xD6, 0xE1, 0x66, 0xE5, 0x8B, 0xDC, + 0xB0, 0xCE, 0xF8, 0xD0, 0xB2, 0xD9, 0x84, 0xD6, 0x6F, 0xED, 0xEE, 0xE0, + 0xA3, 0xEB, 0x3F, 0xED, 0xFE, 0xFA, 0x8E, 0x00, 0x0A, 0x16, 0xA8, 0x11, + 0xFB, 0x1E, 0x71, 0x11, 0x55, 0x11, 0x82, 0x03, 0xBF, 0x00, 0xC6, 0xFD, + 0x38, 0xED, 0x40, 0xF8, 0xE7, 0xD2, 0xDF, 0xE8, 0x33, 0xD9, 0x27, 0xE4, + 0x7E, 0xF1, 0x27, 0xF3, 0x98, 0x05, 0xBB, 0x05, 0xB8, 0x24, 0xA5, 0x0B, + 0x57, 0x41, 0xF0, 0x17, 0x82, 0x48, 0xE4, 0x2D, 0xCB, 0x3A, 0x48, 0x2B, + 0xD8, 0x1A, 0x4D, 0x12, 0x54, 0xF2, 0x28, 0xF0, 0x04, 0xD0, 0x48, 0xC7, + 0x05, 0xB4, 0xE8, 0xA6, 0x57, 0xA4, 0x07, 0xA3, 0xDB, 0x9D, 0x2F, 0xB2, + 0x2F, 0xB3, 0xBB, 0xCE, 0x84, 0xD6, 0x4D, 0xEF, 0xA3, 0xE4, 0x28, 0x07, + 0x37, 0xEF, 0xCB, 0x0C, 0x4C, 0xFE, 0x2A, 0xFD, 0x4C, 0xFF, 0x33, 0xEC, + 0x43, 0xF6, 0xA8, 0xDE, 0xAA, 0xF2, 0xB9, 0xCB, 0xC5, 0xE0, 0xB8, 0xB8, + 0xE4, 0xC7, 0xB4, 0xBC, 0x7C, 0xD7, 0x1C, 0xCC, 0x1B, 0xF1, 0x34, 0xD6, + 0xDF, 0xF7, 0x6F, 0xEB, 0xFF, 0x08, 0x16, 0xF6, 0x1D, 0x17, 0xC2, 0xF7, + 0x4B, 0x08, 0xDE, 0xFA, 0xE7, 0xE7, 0xB3, 0xE2, 0xE6, 0xD8, 0xFC, 0xCA, + 0xC0, 0xD2, 0x8E, 0xCE, 0x17, 0xBE, 0x7C, 0xD4, 0xC7, 0xB3, 0x20, 0xD0, + 0x9B, 0xC1, 0xB3, 0xDE, 0x7B, 0xE4, 0x24, 0x0E, 0xFB, 0x18, 0xDE, 0x37, + 0x75, 0x3E, 0xEC, 0x4A, 0x85, 0x47, 0xEF, 0x5B, 0x01, 0x4F, 0x1E, 0x57, + 0x5A, 0x45, 0xC3, 0x29, 0x3B, 0x1B, 0x33, 0xFF, 0xA3, 0xEE, 0xCB, 0xE5, + 0xFC, 0xD8, 0xE2, 0xCF, 0x08, 0xDA, 0x68, 0xBF, 0x6C, 0xE9, 0xED, 0xCB, + 0x5B, 0xFB, 0x51, 0xEF, 0x05, 0x04, 0xD2, 0x07, 0xAE, 0x0F, 0x94, 0x20, + 0xDC, 0x20, 0xF2, 0x31, 0x44, 0x1F, 0x0B, 0x20, 0x09, 0x15, 0x53, 0xFE, + 0xFB, 0x14, 0x07, 0xE6, 0x47, 0x0A, 0x58, 0xCC, 0x1F, 0xEA, 0x02, 0xBB, + 0x56, 0xD1, 0xC8, 0xBF, 0xBC, 0xD2, 0xC2, 0xC4, 0xFA, 0xE4, 0x33, 0xCD, + 0x1C, 0xF6, 0xB3, 0xD3, 0x42, 0xFC, 0x64, 0xC6, 0x6B, 0xF8, 0x52, 0xC3, + 0xC3, 0xE0, 0xC5, 0xC6, 0xCE, 0xBB, 0x83, 0xB8, 0x68, 0xA4, 0x8F, 0xAE, + 0x43, 0xA2, 0xE5, 0xAD, 0x0F, 0xA9, 0xF3, 0x9E, 0x0B, 0xB7, 0x18, 0x9E, + 0xF7, 0xCD, 0xBD, 0xD0, 0x7E, 0xE2, 0xF3, 0x0A, 0x58, 0xFB, 0x98, 0x2A, + 0x53, 0x1E, 0xD3, 0x3B, 0x63, 0x34, 0x87, 0x3B, 0x60, 0x25, 0x42, 0x11, + 0x1B, 0x07, 0x83, 0xDC, 0x09, 0xED, 0x75, 0xC4, 0x32, 0xD8, 0x6B, 0xB2, + 0xBC, 0xCC, 0x6E, 0xA7, 0x87, 0xCE, 0xCF, 0xB8, 0x90, 0xE4, 0xC7, 0xD4, + 0x94, 0xF7, 0xCF, 0xE8, 0x5C, 0xFC, 0xE9, 0x0E, 0xE7, 0x01, 0x49, 0x35, + 0x14, 0x0A, 0xFB, 0x3C, 0x1A, 0x06, 0x53, 0x30, 0x1D, 0x02, 0xD0, 0x21, + 0xC8, 0x05, 0xD5, 0x15, 0xCE, 0xFD, 0xEB, 0xFF, 0x4B, 0xF2, 0x26, 0xF4, + 0x52, 0xF7, 0x0C, 0xF5, 0x83, 0xFB, 0x9E, 0xEA, 0xFB, 0xF0, 0xE6, 0xED, + 0x3D, 0xF5, 0x0E, 0xFF, 0x9D, 0xFD, 0x28, 0xFD, 0x6D, 0xED, 0x7C, 0xEA, + 0x59, 0xCE, 0x13, 0xCE, 0x92, 0xB0, 0x84, 0xAC, 0x90, 0xA8, 0x39, 0x9E, + 0xD0, 0xAB, 0x8B, 0xA3, 0x52, 0xB8, 0x8C, 0xB1, 0xEC, 0xDE, 0x7D, 0xD0, + 0x01, 0x04, 0x3C, 0xF8, 0xA8, 0x19, 0x31, 0x20, 0xFD, 0x22, 0x6A, 0x34, + 0x2B, 0x20, 0x55, 0x31, 0xF6, 0x25, 0x02, 0x27, 0x47, 0x27, 0x49, 0x00, + 0xBF, 0x17, 0xD9, 0xCD, 0xBB, 0x04, 0x1B, 0xBF, 0x8A, 0xFC, 0xEE, 0xBD, + 0x10, 0x07, 0x5D, 0xB7, 0x93, 0x06, 0xFB, 0xCA, 0xD9, 0x02, 0xE0, 0xF2, + 0x8D, 0x12, 0xF9, 0x08, 0x65, 0x19, 0x9B, 0x16, 0xF4, 0x18, 0x4F, 0x1F, + 0x35, 0x0F, 0x75, 0x12, 0x60, 0xF5, 0xAF, 0x0C, 0x29, 0xE4, 0xB2, 0x10, + 0x6E, 0xE2, 0x67, 0x00, 0x54, 0xE7, 0xA2, 0xE8, 0x82, 0xF8, 0x43, 0xEE, + 0x75, 0x14, 0x76, 0xFA, 0x4E, 0x22, 0xA2, 0xF7, 0x84, 0x11, 0x93, 0x02, + 0x89, 0xFE, 0xFE, 0x0F, 0x1B, 0xEE, 0x3B, 0xFC, 0x61, 0xD4, 0xA8, 0xDF, + 0xA7, 0xCA, 0xCC, 0xD6, 0xDC, 0xC4, 0x27, 0xC6, 0xF3, 0xB7, 0x31, 0xB6, + 0xDB, 0xCC, 0x73, 0xCB, 0xF5, 0x02, 0xA8, 0xF4, 0x7B, 0x2D, 0xF5, 0x1B, + 0x24, 0x47, 0x22, 0x48, 0xA5, 0x50, 0x90, 0x64, 0x15, 0x47, 0x27, 0x59, + 0xE5, 0x3D, 0x50, 0x41, 0x35, 0x2C, 0x1A, 0x2A, 0xE1, 0x0A, 0x61, 0x0D, + 0x7A, 0xFD, 0xD2, 0xFA, 0x2D, 0x03, 0xBD, 0xF0, 0xD7, 0x09, 0x8D, 0xF6, + 0xAA, 0x19, 0x5A, 0x10, 0x8D, 0x32, 0x5D, 0x2C, 0x8F, 0x4F, 0x9F, 0x3D, + 0x2F, 0x5E, 0xCE, 0x43, 0x3A, 0x59, 0x58, 0x48, 0x67, 0x44, 0x40, 0x3C, + 0xE7, 0x33, 0x91, 0x39, 0xC0, 0x27, 0x13, 0x40, 0xC2, 0x10, 0xD9, 0x2B, + 0x69, 0x06, 0x64, 0x18, 0x2E, 0x1A, 0x3E, 0x23, 0x6B, 0x34, 0xB7, 0x25, + 0xF4, 0x3E, 0x74, 0x0E, 0xDD, 0x3A, 0x05, 0x09, 0xD2, 0x2F, 0x71, 0x19, + 0xE7, 0x18, 0xFB, 0x1F, 0x12, 0xF7, 0xFF, 0x0F, 0x4F, 0xEC, 0x60, 0xFE, + 0xE1, 0xF9, 0xBA, 0xF4, 0x10, 0x00, 0xD8, 0xE1, 0x63, 0xFD, 0x85, 0xDB, + 0x52, 0x09, 0xB6, 0x01, 0x9F, 0x19, 0x80, 0x2C, 0x03, 0x2D, 0x50, 0x48, + 0x71, 0x48, 0xED, 0x56, 0xA0, 0x4F, 0x4E, 0x4A, 0xAE, 0x37, 0x57, 0x35, + 0x21, 0x0E, 0x12, 0x11, 0xDC, 0xF0, 0xBE, 0xE5, 0x71, 0xE4, 0x14, 0xD6, + 0xAD, 0xD4, 0xD0, 0xCF, 0x1E, 0xD7, 0x26, 0xD1, 0xDE, 0xF2, 0x5A, 0xDF, + 0xDD, 0xFB, 0x98, 0xE5, 0x50, 0x00, 0x5D, 0xF1, 0xFC, 0x12, 0xF7, 0xFE, + 0x1C, 0x0E, 0xEA, 0x09, 0xB8, 0xFF, 0xE9, 0x15, 0x67, 0x0A, 0xAD, 0x1B, + 0x60, 0x0D, 0x40, 0x1E, 0x8D, 0xF5, 0xB2, 0x17, 0x5D, 0xE4, 0x0B, 0x11, + 0xD3, 0xF2, 0xD3, 0x27, 0xB0, 0x08, 0x78, 0x4D, 0x62, 0x1C, 0xF5, 0x56, + 0xC5, 0x3D, 0x10, 0x4F, 0xED, 0x53, 0x73, 0x56, 0x22, 0x40, 0x74, 0x48, + 0x51, 0x20, 0xDB, 0x25, 0x0B, 0x0D, 0x55, 0x11, 0x53, 0xFD, 0xBB, 0xF9, + 0xC7, 0xFD, 0x63, 0xEA, 0x50, 0x10, 0x8A, 0xFB, 0x45, 0x2A, 0x40, 0x27, + 0x99, 0x40, 0x11, 0x4B, 0xDB, 0x4F, 0x52, 0x54, 0x3B, 0x54, 0x18, 0x5C, + 0x72, 0x4E, 0xF4, 0x62, 0xAB, 0x49, 0x7E, 0x4F, 0x05, 0x2D, 0x1C, 0x30, + 0xE4, 0x00, 0x0C, 0x18, 0xC8, 0xF0, 0xB5, 0xFC, 0x73, 0xEB, 0x06, 0xE3, + 0x30, 0xEB, 0x76, 0xE2, 0x0B, 0xFE, 0xED, 0xF1, 0x43, 0x13, 0x4C, 0xFD, + 0xCD, 0x1F, 0x8B, 0x14, 0xBE, 0x26, 0xEF, 0x26, 0x10, 0x2B, 0x2D, 0x20, + 0x83, 0x1E, 0xD4, 0x22, 0xB2, 0x0B, 0x02, 0x2A, 0x01, 0x08, 0xF2, 0x17, + 0x61, 0xFC, 0x2C, 0xFC, 0xFD, 0xF2, 0x4E, 0xFC, 0x91, 0x06, 0x3D, 0x11, + 0xDC, 0x14, 0x14, 0x1E, 0xFB, 0x19, 0x37, 0x38, 0xE2, 0x31, 0x5E, 0x55, + 0xAF, 0x4B, 0xC5, 0x5E, 0xA7, 0x41, 0xE8, 0x4F, 0xF2, 0x2F, 0xEF, 0x31, + 0x46, 0x22, 0xCD, 0x09, 0xBF, 0x01, 0xD4, 0xDF, 0x1F, 0xEF, 0xD1, 0xDA, + 0x0E, 0x06, 0xD5, 0xF8, 0xC9, 0x35, 0x12, 0x23, 0xAE, 0x51, 0xF9, 0x48, + 0x8F, 0x57, 0x46, 0x64, 0x29, 0x5D, 0x9C, 0x6B, 0x69, 0x50, 0xAF, 0x57, + 0xD8, 0x37, 0x61, 0x44, 0x0A, 0x18, 0x9A, 0x28, 0x3D, 0xE9, 0x9E, 0x03, + 0x4A, 0xC5, 0x22, 0xED, 0x3A, 0xB9, 0x5D, 0xD7, 0xB4, 0xCB, 0x05, 0xD8, + 0x06, 0xE0, 0x1A, 0xEB, 0xED, 0xE8, 0x7B, 0xF5, 0xD9, 0xFD, 0x6F, 0x0C, + 0x27, 0x09, 0x92, 0x26, 0xF7, 0x07, 0xEB, 0x28, 0xDB, 0xFF, 0xFB, 0x24, + 0xB7, 0xED, 0xC5, 0x27, 0x1A, 0xDF, 0xFF, 0x13, 0x07, 0xD7, 0x1C, 0xF0, + 0xEE, 0xE1, 0xFE, 0xE8, 0x84, 0xF8, 0xB2, 0xF9, 0x07, 0x16, 0xF4, 0x0B, + 0xC2, 0x2B, 0xEB, 0x18, 0x52, 0x28, 0x4E, 0x24, 0x58, 0x2F, 0xDC, 0x37, + 0x77, 0x2B, 0xE9, 0x3C, 0x82, 0x1B, 0x08, 0x31, 0x00, 0x15, 0xFC, 0x13, + 0x8C, 0x09, 0x03, 0xF3, 0x3C, 0x07, 0xE1, 0xED, 0x8B, 0x12, 0xB4, 0x03, + 0xA2, 0x20, 0xCB, 0x24, 0x6D, 0x3C, 0x7A, 0x42, 0x0A, 0x5A, 0x3D, 0x52, + 0x32, 0x65, 0xCC, 0x54, 0x5A, 0x58, 0xB6, 0x42, 0x29, 0x30, 0x86, 0x1D, + 0x56, 0x02, 0xD8, 0xF8, 0x92, 0xDC, 0xC0, 0xDC, 0xE9, 0xC0, 0x21, 0xCA, + 0xA5, 0xBB, 0xFD, 0xBA, 0xFE, 0xC9, 0x71, 0xB8, 0xD3, 0xD3, 0x8F, 0xC3, + 0x55, 0xDC, 0x5F, 0xE0, 0xF9, 0xED, 0xAB, 0x00, 0xDB, 0xF7, 0xF7, 0x07, + 0x8C, 0xF1, 0x70, 0x02, 0xEE, 0xE9, 0x4F, 0xF4, 0xE5, 0xD2, 0x68, 0xD7, + 0xFD, 0xB5, 0x63, 0xBE, 0x93, 0xAC, 0xC9, 0xAE, 0x13, 0xB8, 0x9D, 0xB4, + 0x6D, 0xD3, 0x37, 0xCB, 0xBD, 0xE0, 0x00, 0xD3, 0xAB, 0xE9, 0x65, 0xD6, + 0xDD, 0xF6, 0xE5, 0xDB, 0xE3, 0xE8, 0x2E, 0xDA, 0xA4, 0xC4, 0x04, 0xCE, + 0x04, 0xA7, 0x57, 0xBE, 0xA1, 0x9C, 0x8B, 0xBE, 0x4D, 0x9E, 0x5F, 0xCB, + 0xE7, 0xA2, 0x53, 0xD2, 0xE6, 0xBD, 0xC0, 0xE0, 0x0A, 0xED, 0xD9, 0xF3, + 0x39, 0x1D, 0xD0, 0x0D, 0x2C, 0x38, 0xC2, 0x2A, 0x4D, 0x37, 0xB9, 0x33, + 0x49, 0x28, 0x94, 0x25, 0xA9, 0x03, 0xB5, 0x05, 0xA9, 0xCE, 0x9E, 0xE6, + 0x24, 0xAB, 0x15, 0xC5, 0xD2, 0xA4, 0x31, 0xA9, 0x8B, 0xAF, 0xF4, 0xAB, + 0x5E, 0xD1, 0x37, 0xC0, 0x92, 0xF7, 0xA9, 0xD7, 0x79, 0x01, 0x58, 0xF7, + 0xE0, 0xFD, 0xEC, 0x0D, 0x5F, 0x0B, 0x75, 0x17, 0xC8, 0x0A, 0xF5, 0x15, + 0x84, 0xF9, 0xD5, 0x07, 0x43, 0xF6, 0x4C, 0xF5, 0x56, 0xEA, 0xB9, 0xE9, + 0x7E, 0xDC, 0xC0, 0xDF, 0x40, 0xEA, 0xD5, 0xD8, 0x78, 0xFA, 0x7A, 0xD9, + 0xE4, 0xFF, 0x8E, 0xE1, 0xFD, 0x06, 0x87, 0xEB, 0xC5, 0x07, 0x7F, 0xE9, + 0x9B, 0xF9, 0x18, 0xDD, 0x0A, 0xE4, 0xF3, 0xC1, 0x79, 0xCB, 0xC7, 0xA2, + 0x51, 0xB4, 0x93, 0x9A, 0xA3, 0xAB, 0x20, 0xAF, 0x02, 0xAE, 0xE9, 0xD3, + 0xE7, 0xC5, 0x3F, 0xFD, 0x58, 0xF7, 0x21, 0x1E, 0xCD, 0x26, 0x54, 0x31, + 0x62, 0x3E, 0x73, 0x38, 0x10, 0x37, 0x0D, 0x2A, 0x2D, 0x1D, 0xBF, 0x06, + 0x5B, 0xFB, 0xC5, 0xE6, 0xC3, 0xD2, 0x34, 0xD2, 0x65, 0xBB, 0x55, 0xC6, + 0x23, 0xBD, 0x15, 0xC3, 0xED, 0xC8, 0x49, 0xC6, 0xB4, 0xE3, 0x43, 0xCD, + 0x44, 0x05, 0x85, 0xE1, 0xC3, 0x14, 0xE9, 0xFE, 0x80, 0x0A, 0x6F, 0x0C, + 0x81, 0xF5, 0xBD, 0x02, 0x05, 0xEE, 0x97, 0xF6, 0x78, 0xE6, 0xE9, 0xF8, + 0x58, 0xDB, 0xD6, 0xF1, 0xD6, 0xDE, 0xD1, 0xE4, 0x32, 0xEB, 0x6F, 0xF4, + 0x0D, 0xFD, 0x26, 0x0C, 0xE8, 0x04, 0xAE, 0x11, 0x86, 0x02, 0x4F, 0x14, + 0xE5, 0xFC, 0xF1, 0x13, 0x14, 0xF9, 0x9B, 0x0C, 0xF3, 0xF6, 0x9F, 0xF4, + 0x24, 0xE1, 0xB2, 0xCE, 0xD9, 0xCC, 0x3C, 0xB3, 0x6A, 0xD4, 0x81, 0xAD, + 0xED, 0xD9, 0x6C, 0xB3, 0x24, 0xE0, 0x84, 0xD1, 0xCC, 0xF2, 0xD6, 0x00, + 0x96, 0x0B, 0x29, 0x22, 0x6A, 0x34, 0x6D, 0x39, 0xA4, 0x49, 0xE6, 0x3A, + 0x72, 0x39, 0xD3, 0x22, 0x27, 0x17, 0xFE, 0x02, 0x50, 0xED, 0xE3, 0xE2, + 0x8E, 0xD3, 0xFA, 0xC9, 0xCC, 0xCC, 0x44, 0xC0, 0x90, 0xCE, 0x46, 0xB9, + 0x16, 0xEA, 0xB0, 0xBF, 0x56, 0x0B, 0x80, 0xD4, 0xEE, 0x1F, 0x64, 0xE8, + 0x5D, 0x29, 0x6E, 0x03, 0xF2, 0x22, 0x7A, 0x17, 0xEE, 0x11, 0x61, 0x14, + 0x34, 0x02, 0xA6, 0x11, 0xF1, 0xF4, 0xF8, 0x07, 0xA6, 0xDA, 0x56, 0xE9, + 0x5C, 0xDD, 0x9C, 0xE3, 0xB1, 0xFF, 0xF6, 0xFC, 0xA8, 0x0F, 0xAD, 0x12, + 0x96, 0x0E, 0x2F, 0x1B, 0x34, 0x0A, 0x56, 0x19, 0x81, 0x05, 0x80, 0x0C, + 0xEC, 0xF6, 0x3D, 0xEF, 0x20, 0xDE, 0x06, 0xD4, 0x1B, 0xB5, 0x27, 0xBD, + 0x5D, 0x99, 0x45, 0xAE, 0xEB, 0xB8, 0x09, 0xBA, 0xC8, 0xDA, 0x35, 0xC1, + 0x8C, 0xE7, 0x71, 0xCF, 0xB1, 0x02, 0x10, 0xF4, 0x6C, 0x25, 0xB8, 0x15, + 0x7A, 0x27, 0xEC, 0x25, 0xE5, 0x11, 0x8D, 0x20, 0x37, 0x06, 0x04, 0x10, + 0x3E, 0xF1, 0xB8, 0x02, 0xC0, 0xDF, 0xE2, 0xFD, 0x14, 0xDB, 0xCC, 0xED, + 0x50, 0xD5, 0x15, 0xDA, 0x8E, 0xE3, 0x9B, 0xDF, 0xEB, 0x04, 0x22, 0xE5, + 0x38, 0x1A, 0x1D, 0xEA, 0x9E, 0x28, 0x6A, 0x0E, 0x0E, 0x31, 0xB0, 0x24, + 0x68, 0x26, 0x7C, 0x17, 0x72, 0x1A, 0xEF, 0x17, 0xD1, 0x16, 0x7E, 0x25, + 0xBD, 0x03, 0x3D, 0x13, 0x32, 0xF9, 0xFD, 0x08, 0x9B, 0x09, 0x93, 0x16, + 0x39, 0x0E, 0x29, 0x0B, 0x62, 0x03, 0x22, 0x02, 0xD5, 0x08, 0x0B, 0x13, + 0x3F, 0x1D, 0x92, 0x28, 0x47, 0x25, 0xE6, 0x2E, 0xB9, 0x17, 0xF0, 0x16, + 0x47, 0xFB, 0xB9, 0xEC, 0x47, 0xE4, 0x94, 0xC5, 0x90, 0xE8, 0xC0, 0xC1, + 0xA1, 0xF8, 0xE7, 0xD6, 0xC3, 0x03, 0x7A, 0xEC, 0x95, 0x11, 0xEA, 0x03, + 0xA5, 0x3C, 0x50, 0x28, 0xC8, 0x63, 0x50, 0x44, 0x4C, 0x5A, 0xA2, 0x3F, + 0xD7, 0x41, 0x28, 0x33, 0x1D, 0x27, 0x96, 0x21, 0xFB, 0x09, 0x51, 0x08, + 0xA6, 0xEB, 0xD1, 0xF4, 0xCE, 0xC9, 0xF8, 0xE1, 0x7D, 0xC6, 0x00, 0xC8, + 0xF1, 0xE6, 0xCD, 0xBD, 0x31, 0x07, 0x2A, 0xCD, 0xDC, 0x1C, 0x19, 0xE2, + 0x26, 0x1B, 0xE7, 0xF6, 0x60, 0x02, 0x38, 0x06, 0xED, 0xEA, 0xD5, 0xFD, + 0x62, 0xE7, 0x3C, 0xEC, 0xA7, 0xDC, 0xEE, 0xDC, 0x65, 0xC0, 0xC8, 0xCF, + 0xC2, 0xCE, 0x98, 0xCD, 0x4B, 0xEB, 0x69, 0xD3, 0xF0, 0xEA, 0x21, 0xD9, + 0xC1, 0xFA, 0x9F, 0xE5, 0xEC, 0xFD, 0x03, 0xEC, 0xAC, 0xDD, 0xC1, 0xE7, + 0x92, 0xC7, 0x3B, 0xE9, 0xB6, 0xB8, 0xA4, 0xDB, 0x7B, 0xB0, 0x02, 0xC9, + 0xB4, 0xB4, 0xA3, 0xCF, 0x82, 0xC6, 0x62, 0xE8, 0x6B, 0xE6, 0x6D, 0x01, + 0xC5, 0x08, 0x9A, 0x12, 0x72, 0x2E, 0x1A, 0x2E, 0x52, 0x4B, 0x2B, 0x59, + 0xD2, 0x51, 0xD1, 0x69, 0x59, 0x58, 0x48, 0x5B, 0xB7, 0x4E, 0x23, 0x44, + 0x58, 0x27, 0x0A, 0x2A, 0xA0, 0x05, 0x06, 0x1B, 0x35, 0xEA, 0x2B, 0x0A, + 0x4E, 0xDD, 0xB9, 0xF1, 0xE3, 0xF0, 0xE7, 0xF2, 0x7E, 0x07, 0x6F, 0xFB, + 0xE3, 0x21, 0xB4, 0x0D, 0xA7, 0x41, 0x18, 0x2C, 0xE2, 0x4A, 0x0D, 0x34, + 0xC8, 0x3A, 0x62, 0x33, 0x52, 0x23, 0xE1, 0x30, 0xE4, 0x17, 0x9C, 0x24, + 0x72, 0xFF, 0x56, 0x02, 0xB0, 0xE9, 0x06, 0xEB, 0x08, 0xF8, 0xA5, 0xF4, + 0x09, 0x0A, 0x14, 0xF8, 0x92, 0x13, 0x4C, 0xFE, 0x9F, 0x29, 0xCE, 0x1A, + 0x00, 0x30, 0x18, 0x25, 0xAD, 0x1F, 0x10, 0x1D, 0x73, 0x14, 0x12, 0x1A, + 0x47, 0xFD, 0x99, 0x04, 0xF4, 0xDE, 0x74, 0xEE, 0xC9, 0xE4, 0x20, 0x01, + 0x33, 0x0A, 0xE5, 0x17, 0xD6, 0x19, 0x2D, 0x13, 0x5C, 0x2A, 0xA0, 0x20, + 0xA4, 0x54, 0x53, 0x3A, 0x00, 0x66, 0x66, 0x40, 0x87, 0x59, 0xCC, 0x4B, + 0x18, 0x4A, 0x9F, 0x4C, 0xF5, 0x29, 0xFA, 0x1F, 0x58, 0x07, 0x38, 0xF5, + 0x31, 0xF9, 0x70, 0xE5, 0x1B, 0xEB, 0x7B, 0xCF, 0xBD, 0xE5, 0x61, 0xD0, + 0x98, 0xE4, 0x36, 0xE9, 0x51, 0xE0, 0xE3, 0xF2, 0x07, 0xE9, 0xD4, 0xFE, + 0xCC, 0xF1, 0x26, 0x15, 0xE9, 0xF1, 0xA1, 0x18, 0xD9, 0xF0, 0x84, 0x12, + 0xC1, 0xF8, 0x9D, 0x1A, 0x9E, 0xF3, 0xB2, 0x0E, 0xF2, 0xD8, 0xF0, 0xEA, + 0x29, 0xCF, 0xA7, 0xD8, 0xDF, 0xDA, 0x2B, 0xE4, 0x1E, 0xED, 0xB0, 0xF2, + 0xD8, 0xF5, 0x99, 0xE9, 0xD6, 0xF7, 0x8A, 0xE5, 0x90, 0xF2, 0xA7, 0xEB, + 0x1C, 0xE0, 0x82, 0xEB, 0xD4, 0xD2, 0x86, 0xF1, 0x9A, 0xC2, 0xF2, 0xEE, + 0x91, 0xBE, 0xEC, 0xE3, 0x05, 0xE6, 0xDD, 0xEF, 0x82, 0x06, 0x1E, 0x05, + 0xF4, 0x11, 0x62, 0x13, 0x2A, 0x3C, 0xD9, 0x3A, 0x90, 0x5E, 0x62, 0x60, + 0x1E, 0x66, 0x0D, 0x64, 0xFD, 0x64, 0x4C, 0x56, 0xD0, 0x40, 0x2E, 0x38, + 0x6D, 0x0E, 0x24, 0x0F, 0x49, 0xF0, 0x5B, 0xE9, 0xB1, 0xE1, 0x48, 0xD5, + 0x40, 0xE1, 0x35, 0xD7, 0x51, 0xF3, 0x8C, 0xDE, 0x22, 0x06, 0x58, 0xE5, + 0x68, 0x0F, 0x29, 0x01, 0xE4, 0x21, 0x94, 0x24, 0xA8, 0x20, 0xF2, 0x31, + 0xC7, 0x01, 0x16, 0x3C, 0xA0, 0xFC, 0x72, 0x47, 0xEE, 0xFD, 0x3B, 0x33, + 0xC0, 0xEC, 0x95, 0x0A, 0xE7, 0xF2, 0x22, 0x03, 0xAD, 0x04, 0xB6, 0x14, + 0xEE, 0x07, 0xA0, 0x15, 0xD2, 0x0A, 0x51, 0x0E, 0x57, 0x1A, 0x85, 0x0D, + 0xE9, 0x2E, 0xD0, 0x13, 0x74, 0x26, 0xBA, 0x09, 0x16, 0x0B, 0x72, 0xF1, + 0xEE, 0xF1, 0x60, 0xEA, 0x31, 0xE5, 0xE6, 0xF2, 0xEF, 0xF7, 0xD7, 0x04, + 0x50, 0x0E, 0x2D, 0x19, 0xD6, 0x1A, 0x30, 0x20, 0x4B, 0x41, 0x07, 0x34, + 0x92, 0x5D, 0x19, 0x55, 0xE1, 0x55, 0xC7, 0x61, 0x4D, 0x46, 0x0C, 0x55, + 0x0B, 0x2C, 0xC0, 0x34, 0xBE, 0x11, 0xE5, 0x20, 0x78, 0xFA, 0xAD, 0x1B, + 0xBF, 0xE3, 0x88, 0x08, 0x48, 0xDD, 0x2D, 0xF9, 0xC8, 0xE5, 0xA1, 0xFE, + 0x75, 0xFB, 0xC8, 0x0A, 0x7D, 0x17, 0x76, 0x18, 0x4D, 0x20, 0x27, 0x23, + 0x7F, 0x1D, 0x64, 0x32, 0x9B, 0x1E, 0x48, 0x3E, 0xDF, 0x2A, 0x07, 0x40, + 0x34, 0x31, 0xA9, 0x36, 0x9A, 0x23, 0x06, 0x24, 0xBF, 0x1B, 0xEE, 0x1B, + 0x70, 0x22, 0x55, 0x22, 0xB0, 0x24, 0x97, 0x25, 0xE9, 0x26, 0xD0, 0x28, + 0x17, 0x31, 0x98, 0x3B, 0x4D, 0x3A, 0xCB, 0x42, 0x7F, 0x35, 0xEA, 0x2D, + 0x45, 0x1D, 0x86, 0x16, 0x34, 0x04, 0xB1, 0xFA, 0x15, 0x04, 0x31, 0xED, + 0x73, 0x0C, 0xB6, 0x01, 0x1D, 0x0A, 0x29, 0x12, 0xC5, 0x15, 0x5E, 0x1D, + 0x52, 0x3B, 0x61, 0x43, 0x0F, 0x4F, 0xFB, 0x62, 0x84, 0x42, 0x7B, 0x53, + 0x2C, 0x2D, 0x8B, 0x30, 0x40, 0x07, 0x6E, 0x1B, 0x35, 0xE1, 0x00, 0x09, + 0x0A, 0xCB, 0x41, 0xE9, 0x57, 0xB4, 0x5D, 0xCE, 0x11, 0xB4, 0xA0, 0xC8, + 0x43, 0xCC, 0x38, 0xCB, 0x82, 0xE0, 0x3F, 0xD5, 0x42, 0xF6, 0xD2, 0xEA, + 0xFD, 0x04, 0xB8, 0xF7, 0x98, 0x05, 0xFC, 0xF8, 0xEE, 0x03, 0x3B, 0x03, + 0x0A, 0x08, 0x4B, 0x10, 0xAF, 0xFB, 0x19, 0xFA, 0x82, 0xE2, 0x8C, 0xDE, + 0x92, 0xE5, 0x77, 0xE7, 0xA1, 0xF7, 0x96, 0xF2, 0x59, 0xF8, 0x61, 0xED, + 0x83, 0xF5, 0x7C, 0xF1, 0x4F, 0xFD, 0x47, 0x02, 0x73, 0xFF, 0x85, 0x00, + 0x98, 0xF4, 0x40, 0xED, 0xE3, 0xE4, 0xC3, 0xD8, 0x7A, 0xD0, 0xEE, 0xC0, + 0x4B, 0xC1, 0x6F, 0xBD, 0x25, 0xC5, 0x76, 0xCB, 0xB0, 0xD6, 0x9E, 0xD3, + 0xF3, 0xEA, 0xA3, 0xE4, 0x93, 0x04, 0xC8, 0x04, 0x4E, 0x16, 0x37, 0x15, + 0x23, 0x13, 0x40, 0x12, 0x48, 0xFF, 0x66, 0x0B, 0x33, 0xE7, 0xB3, 0xF3, + 0x9F, 0xD5, 0xA0, 0xD4, 0x85, 0xB9, 0x65, 0xC5, 0xDF, 0x9B, 0x5D, 0xB1, + 0x0E, 0xA0, 0xC1, 0x9F, 0x99, 0xB4, 0xB6, 0xAA, 0x8E, 0xCF, 0x69, 0xC3, + 0xC1, 0xEF, 0xCA, 0xD8, 0xEA, 0xFF, 0x06, 0xEB, 0x99, 0x03, 0x8F, 0xF5, + 0xDE, 0xFE, 0x93, 0xEC, 0x0A, 0xFE, 0xF9, 0xEB, 0x3D, 0xE9, 0x3B, 0xF0, + 0x99, 0xC6, 0xF5, 0xDD, 0x9D, 0xD7, 0x22, 0xD9, 0x2E, 0xFC, 0xDC, 0xE8, + 0xB1, 0x00, 0xFD, 0xE9, 0x2B, 0x08, 0x06, 0xF9, 0xD8, 0x1C, 0x4A, 0x1D, + 0x83, 0x24, 0x9B, 0x23, 0xC0, 0x1B, 0x0F, 0x11, 0xC9, 0x09, 0x02, 0xFB, + 0xB2, 0xF6, 0xE2, 0xDE, 0x54, 0xED, 0x56, 0xD6, 0x3F, 0xEC, 0x76, 0xE7, + 0x4C, 0xEC, 0x70, 0xF9, 0xD8, 0xF8, 0x34, 0x06, 0xF4, 0x18, 0x16, 0x1A, + 0x23, 0x2B, 0xAA, 0x2D, 0xCB, 0x26, 0xB8, 0x2A, 0xB3, 0x1C, 0xF2, 0x0B, + 0xF0, 0xFA, 0xEE, 0xDE, 0xA4, 0xD3, 0xFB, 0xC3, 0x4E, 0xBA, 0x23, 0xB4, + 0xAE, 0xA3, 0xF7, 0x9F, 0xBD, 0x9A, 0xC1, 0x9E, 0x4B, 0xA3, 0x67, 0xAC, + 0xCC, 0xB7, 0xEC, 0xB4, 0xD8, 0xD9, 0x11, 0xCA, 0xD6, 0xEF, 0x9B, 0xE0, + 0x28, 0xEC, 0x76, 0xDA, 0x94, 0xE7, 0xFC, 0xDC, 0x93, 0xDF, 0x32, 0xF8, + 0x79, 0xBF, 0xB6, 0xF4, 0x56, 0xA5, 0x43, 0xDE, 0x69, 0xBA, 0xDB, 0xE4, + 0xAA, 0xE3, 0xBA, 0xEC, 0xAC, 0xFD, 0x8E, 0xEE, 0x25, 0x14, 0x77, 0x04, + 0x73, 0x24, 0xE4, 0x1A, 0xB1, 0x1F, 0x44, 0x20, 0x43, 0x1A, 0x9E, 0x1B, + 0x89, 0x15, 0xCC, 0x03, 0x91, 0x07, 0xBE, 0xE4, 0x55, 0x00, 0xB6, 0xE2, + 0x42, 0x0B, 0x38, 0x01, 0xEB, 0x14, 0xB5, 0x16, 0xA6, 0x1B, 0xA0, 0x27, + 0xA5, 0x3F, 0x7F, 0x4F, 0x54, 0x59, 0x22, 0x5C, 0x4A, 0x4B, 0xF0, 0x4F, + 0x09, 0x42, 0xB5, 0x4B, 0x2C, 0x2B, 0x32, 0x25, 0xB3, 0x05, 0xB8, 0xF9, + 0x6A, 0xF2, 0x44, 0xED, 0x22, 0xDF, 0x3A, 0xE1, 0xEE, 0xD5, 0x04, 0xDF, + 0xCF, 0xD7, 0x25, 0xE6, 0x47, 0xE2, 0x2B, 0xEE, 0xD0, 0x05, 0xE0, 0xFF, + 0x89, 0x27, 0x4B, 0x17, 0x54, 0x36, 0x34, 0x22, 0xA8, 0x30, 0xBD, 0x15, + 0x04, 0x26, 0x54, 0x10, 0x20, 0x1B, 0xF3, 0x04, 0x51, 0xFD, 0xDA, 0xE9, + 0x6E, 0xEE, 0x5B, 0xF2, 0xA8, 0xF1, 0xB1, 0x03, 0x64, 0xEC, 0x0A, 0xFA, + 0x94, 0xF8, 0xDA, 0xF9, 0x54, 0x04, 0x45, 0xFC, 0xFF, 0xF9, 0xD2, 0xED, + 0xA6, 0xF2, 0x99, 0xE1, 0xF4, 0xE4, 0x33, 0xD0, 0x77, 0xD0, 0x51, 0xB4, + 0x85, 0xD1, 0xA9, 0xAF, 0xDE, 0xE0, 0x9E, 0xC8, 0xAB, 0xD9, 0x2C, 0xE0, + 0x2B, 0xDE, 0x23, 0xFC, 0x87, 0x0F, 0x03, 0x2B, 0x2F, 0x19, 0x4B, 0x40, + 0x89, 0x0C, 0xD6, 0x36, 0x79, 0x1B, 0x6A, 0x2C, 0xF6, 0x05, 0xCE, 0x1F, + 0x8C, 0xD9, 0xA9, 0x04, 0xB8, 0xC7, 0x63, 0xD2, 0xA9, 0xC6, 0x25, 0xAD, + 0x9B, 0xC6, 0xC6, 0xAF, 0x7F, 0xBF, 0x13, 0xB6, 0x20, 0xC9, 0xAA, 0xC1, + 0x70, 0xDE, 0x2D, 0xE0, 0x21, 0xF2, 0xAF, 0xF6, 0x13, 0x05, 0x95, 0x02, + 0xD7, 0xFE, 0xD6, 0x09, 0x3B, 0xF3, 0x0F, 0x04, 0xC3, 0xE8, 0x31, 0xE5, + 0xCD, 0xDC, 0x48, 0xCE, 0xC3, 0xE5, 0xF9, 0xD6, 0x38, 0xEC, 0x99, 0xD4, + 0x15, 0xE7, 0x02, 0xC7, 0xAB, 0xEA, 0xCF, 0xC6, 0x03, 0xEA, 0x9D, 0xC5, + 0x6B, 0xE2, 0xA9, 0xC5, 0xE8, 0xCE, 0xC0, 0xBF, 0x71, 0xB2, 0x0D, 0xAF, + 0x6A, 0xA3, 0xC9, 0xA0, 0x77, 0xB2, 0xD0, 0xA8, 0x5D, 0xC5, 0x0F, 0xC0, + 0xC7, 0xD2, 0x6E, 0xCB, 0x62, 0xF8, 0x2A, 0xEA, 0x02, 0x23, 0x0A, 0x24, + 0x8D, 0x2A, 0x85, 0x39, 0x19, 0x24, 0xC5, 0x2D, 0x2C, 0x21, 0x66, 0x25, + 0xD8, 0x0C, 0x83, 0x18, 0xC9, 0xF5, 0x21, 0x08, 0xE3, 0xED, 0xB9, 0xFA, + 0x4A, 0xE6, 0x9F, 0xF0, 0xEA, 0xE0, 0x9D, 0xEA, 0x65, 0xE5, 0x79, 0xEB, + 0x8A, 0xFE, 0xFF, 0xFF, 0xEA, 0x1F, 0x9F, 0x0D, 0xEA, 0x2A, 0x7A, 0x10, + 0x2D, 0x2A, 0x5D, 0x1C, 0x58, 0x2F, 0xEB, 0x1D, 0x8A, 0x32, 0xA0, 0x16, + 0x7F, 0x16, 0x01, 0x07, 0x91, 0xF0, 0x6A, 0xF8, 0x03, 0xEB, 0x6E, 0x06, + 0x99, 0xF6, 0x94, 0x14, 0xBB, 0x07, 0x70, 0x08, 0x18, 0x1F, 0xCE, 0x00, + 0x9E, 0x1D, 0xE1, 0x02, 0x92, 0x05, 0x0B, 0xFD, 0x5F, 0xED, 0xED, 0xF3, + 0xE3, 0xD1, 0x02, 0xEF, 0xC8, 0xC2, 0x76, 0xE7, 0x9E, 0xCF, 0x2A, 0xD4, + 0x67, 0xE3, 0x74, 0xCB, 0x2A, 0xF2, 0x1F, 0xE6, 0xF2, 0x08, 0xB1, 0x0E, + 0x49, 0x27, 0x27, 0x2F, 0xB6, 0x3E, 0x55, 0x46, 0xAD, 0x49, 0xCF, 0x50, + 0x61, 0x3E, 0x9D, 0x35, 0xA0, 0x1F, 0xC8, 0x0B, 0x56, 0xFD, 0x8A, 0xFA, + 0x32, 0xE7, 0x74, 0xE1, 0xE9, 0xE7, 0x9C, 0xD5, 0x0D, 0xF2, 0xBB, 0xF1, + 0x78, 0x05, 0xFE, 0x03, 0x66, 0x29, 0x1E, 0x19, 0xA3, 0x3B, 0x79, 0x32, + 0x5F, 0x3D, 0x42, 0x3D, 0xCA, 0x39, 0x02, 0x41, 0xE2, 0x3C, 0xF2, 0x49, + 0xEB, 0x42, 0x33, 0x4E, 0x15, 0x3B, 0x40, 0x31, 0x9C, 0x38, 0x61, 0x16, + 0xA3, 0x39, 0xA6, 0x1F, 0x99, 0x37, 0x27, 0x37, 0x5B, 0x36, 0x50, 0x4B, + 0xE3, 0x30, 0x99, 0x4A, 0xB9, 0x25, 0xD7, 0x31, 0x5A, 0x1C, 0x2B, 0x1A, + 0x8F, 0x0F, 0xE6, 0x0E, 0x31, 0xF7, 0x99, 0x00, 0x75, 0xEB, 0xD0, 0xE7, + 0xE2, 0xEC, 0x6E, 0xE3, 0x24, 0xEE, 0x03, 0xF9, 0xBD, 0x00, 0xB4, 0x00, + 0x34, 0x2D, 0x31, 0x17, 0xD3, 0x4E, 0x0D, 0x38, 0x01, 0x54, 0xDF, 0x32, + 0x21, 0x57, 0xF3, 0x27, 0x1C, 0x43, 0x88, 0x1F, 0xE3, 0x1B, 0x09, 0x0C, + 0x23, 0x09, 0xF5, 0xEB, 0x97, 0xED, 0xD7, 0xCA, 0x10, 0xCF, 0xF5, 0xD1, + 0xB2, 0xCE, 0x17, 0xE9, 0x63, 0xE9, 0xAF, 0xF9, 0xDB, 0x14, 0xDE, 0x16, + 0xBC, 0x2C, 0x75, 0x2B, 0x26, 0x27, 0x45, 0x2C, 0x07, 0x27, 0xF2, 0x29, + 0xCD, 0x2C, 0x15, 0x2A, 0x97, 0x23, 0xCB, 0x27, 0xAC, 0x09, 0x81, 0x18, + 0x34, 0xF8, 0x19, 0x07, 0xC6, 0xFE, 0xAE, 0x0A, 0xED, 0x0D, 0xDF, 0x13, + 0x8C, 0x21, 0x63, 0x1A, 0x37, 0x1C, 0xE2, 0x1C, 0x25, 0x07, 0x90, 0x19, + 0xC0, 0x02, 0xE5, 0x17, 0xA5, 0xE7, 0x4F, 0xFC, 0x00, 0xCA, 0x35, 0xDD, + 0x61, 0xD6, 0xC8, 0xE5, 0x0B, 0xEC, 0xCC, 0xF1, 0x81, 0xFB, 0xC8, 0xF6, + 0x02, 0x14, 0xDE, 0x14, 0x6C, 0x31, 0x17, 0x3F, 0x4F, 0x41, 0x70, 0x54, + 0x10, 0x45, 0x3D, 0x54, 0x37, 0x36, 0x77, 0x47, 0xBB, 0x1C, 0x40, 0x2C, + 0x26, 0x0D, 0xE8, 0xFF, 0x52, 0xF9, 0xC7, 0xDD, 0xCA, 0xE4, 0x61, 0xCF, + 0xDC, 0xE7, 0x2C, 0xD1, 0xB2, 0xE8, 0x3C, 0xDB, 0xD8, 0xEE, 0x84, 0xF1, + 0x3C, 0x04, 0x01, 0x0C, 0x70, 0x04, 0x52, 0x14, 0x31, 0xFA, 0x2E, 0x0F, + 0x8E, 0x03, 0xCA, 0x0D, 0x40, 0x15, 0x96, 0x17, 0x1F, 0x0A, 0x2F, 0x0E, + 0x55, 0xFA, 0x91, 0xFA, 0xB9, 0xF8, 0x91, 0x02, 0x42, 0xE6, 0x96, 0xFF, + 0x1E, 0xE7, 0xEC, 0xED, 0x0A, 0x00, 0x7C, 0xF3, 0x65, 0x00, 0xC6, 0xF9, + 0x11, 0x03, 0x68, 0xFA, 0x8E, 0x01, 0x25, 0xE8, 0x6D, 0xE9, 0xA8, 0xCB, + 0xCF, 0xDC, 0x2F, 0xD0, 0x88, 0xE0, 0x48, 0xE4, 0xFF, 0xEF, 0x41, 0xEF, + 0x3A, 0x02, 0x67, 0xFE, 0xC1, 0x20, 0x0C, 0x17, 0xD5, 0x47, 0x99, 0x2B, + 0xC1, 0x54, 0xB8, 0x3D, 0x0B, 0x49, 0x79, 0x4A, 0x7E, 0x2D, 0xBD, 0x40, + 0x67, 0x0D, 0x70, 0x35, 0x56, 0xFC, 0xD1, 0x22, 0xB7, 0xE5, 0x41, 0xEE, + 0x99, 0xD4, 0x27, 0xCE, 0x15, 0xDB, 0xDC, 0xDB, 0x8C, 0xEA, 0x10, 0xF7, + 0x49, 0x0A, 0xBF, 0x1C, 0x74, 0x1B, 0xAD, 0x32, 0x13, 0x1A, 0xBF, 0x2F, + 0xED, 0x1E, 0x89, 0x26, 0xA0, 0x1C, 0xCE, 0x1C, 0x81, 0x0B, 0x7D, 0x11, + 0x2A, 0xF2, 0xBE, 0xFF, 0xBA, 0xE8, 0x88, 0xF7, 0x7E, 0xF6, 0xB1, 0xFE, + 0xA6, 0xFE, 0x66, 0x04, 0xB2, 0x05, 0xE0, 0x0A, 0x5A, 0x0A, 0x2A, 0x0D, + 0xCB, 0x0E, 0xF3, 0x11, 0x78, 0x0F, 0x0D, 0x1B, 0xD5, 0xF9, 0x1A, 0x0F, + 0x0D, 0xF0, 0xD8, 0xFD, 0x13, 0xFB, 0x19, 0x00, 0x3E, 0x0F, 0x55, 0x0F, + 0x60, 0x2A, 0x0A, 0x19, 0x5B, 0x3A, 0x59, 0x26, 0x6F, 0x48, 0x1B, 0x4C, + 0xC1, 0x4D, 0x20, 0x62, 0xE7, 0x53, 0x95, 0x5B, 0x94, 0x56, 0xEF, 0x46, + 0x97, 0x3A, 0xBA, 0x2B, 0x99, 0x20, 0xB9, 0x25, 0x67, 0x0C, 0x47, 0x20, + 0x81, 0xEE, 0xBB, 0x05, 0x54, 0xF0, 0xBB, 0xFF, 0xE1, 0xFC, 0xDD, 0x01, + 0xBB, 0x03, 0x25, 0x07, 0x98, 0x1A, 0xD8, 0x26, 0xA3, 0x1F, 0x59, 0x34, + 0x98, 0x15, 0x9D, 0x27, 0x8C, 0x18, 0x02, 0x17, 0x15, 0x20, 0x0F, 0x08, + 0x86, 0x16, 0x0E, 0xFF, 0x11, 0xF9, 0xFF, 0xF4, 0x5F, 0xEB, 0x2C, 0xF6, + 0x74, 0xF5, 0xC5, 0xFA, 0x1F, 0xF7, 0xD1, 0xF2, 0x9A, 0xEF, 0x7B, 0xF5, + 0xC9, 0xE2, 0x8A, 0xF7, 0x88, 0xE0, 0xD7, 0xF5, 0x5F, 0xE3, 0x71, 0xEB, + 0xBB, 0xCF, 0x73, 0xC7, 0x9C, 0xC0, 0xAF, 0xBC, 0x9D, 0xBE, 0x40, 0xCC, + 0x3E, 0xC3, 0xAA, 0xD3, 0x9D, 0xE1, 0x8A, 0xD9, 0x31, 0x0B, 0x21, 0xEF, + 0x41, 0x28, 0x99, 0x17, 0x7A, 0x36, 0xC3, 0x29, 0x40, 0x36, 0x32, 0x27, + 0x0B, 0x20, 0x9D, 0x2A, 0xD9, 0xFF, 0x28, 0x1C, 0xDF, 0xE0, 0x0A, 0xF7, + 0xC9, 0xC0, 0xCF, 0xD6, 0x36, 0xB4, 0x81, 0xCC, 0x8B, 0xC4, 0x94, 0xD4, + 0xB0, 0xD5, 0x0A, 0xD5, 0x24, 0xF2, 0xFA, 0xE0, 0x7B, 0x0E, 0xA1, 0xFA, + 0xC8, 0x05, 0x01, 0x02, 0x1A, 0xF5, 0x9A, 0xF5, 0x94, 0xF3, 0xB4, 0xEB, + 0x20, 0xEA, 0x42, 0xED, 0x87, 0xD6, 0xD2, 0xDE, 0x1E, 0xCF, 0x2D, 0xCB, + 0xD7, 0xD9, 0x01, 0xDB, 0xD9, 0xDC, 0x4A, 0xE9, 0xCD, 0xD8, 0x32, 0xEB, + 0xF6, 0xD6, 0x57, 0xF2, 0xCF, 0xD6, 0x92, 0xF3, 0x64, 0xD6, 0x2F, 0xE9, + 0x87, 0xC7, 0x22, 0xC9, 0x7C, 0xC2, 0x67, 0xBA, 0xFD, 0xCA, 0x17, 0xC4, + 0x32, 0xDB, 0xB7, 0xD9, 0xFF, 0xEE, 0x68, 0xFB, 0xC3, 0xF8, 0x9D, 0x0E, + 0x92, 0x10, 0xB7, 0x2A, 0xB4, 0x29, 0x85, 0x4D, 0x17, 0x30, 0xA4, 0x44, + 0x18, 0x35, 0xE0, 0x21, 0x04, 0x2E, 0xBD, 0x04, 0x56, 0x16, 0xFF, 0xEC, + 0xBC, 0xFB, 0x9D, 0xD8, 0x1E, 0xDE, 0x2B, 0xC8, 0x52, 0xCF, 0x0E, 0xC9, + 0x90, 0xD8, 0x62, 0xD0, 0xD6, 0xE9, 0xD1, 0xD2, 0x2B, 0xFB, 0x8D, 0xE1, + 0x78, 0xFD, 0x35, 0xF1, 0xE9, 0xFA, 0xB9, 0xFE, 0xC1, 0xFE, 0x08, 0x0C, + 0xBA, 0x07, 0xAD, 0x11, 0xB5, 0x07, 0x9F, 0x06, 0xF7, 0xEE, 0x4F, 0xEA, + 0xC4, 0xE3, 0x39, 0xE2, 0x9E, 0xEE, 0x83, 0xE4, 0x80, 0xF4, 0xB8, 0xE7, + 0x38, 0xF5, 0xF5, 0x03, 0xE5, 0xF1, 0x37, 0x17, 0x29, 0x05, 0x31, 0x21, + 0xFC, 0x14, 0x3F, 0x24, 0x5B, 0xF6, 0xBB, 0xFD, 0x9F, 0xDA, 0x08, 0xD1, + 0x53, 0xD7, 0x0E, 0xC8, 0xE4, 0xE3, 0x1B, 0xDA, 0x62, 0xFE, 0x4E, 0xE4, + 0xA2, 0x1C, 0x9D, 0xED, 0x09, 0x36, 0xB9, 0x13, 0xC4, 0x3E, 0x08, 0x34, + 0x73, 0x3B, 0xD5, 0x34, 0x8C, 0x1F, 0xBD, 0x25, 0x1F, 0xFA, 0xEA, 0x1A, + 0xD4, 0xF7, 0xC7, 0x0B, 0xC6, 0xED, 0x22, 0xDB, 0x4D, 0xCE, 0x7D, 0xB4, + 0xE9, 0xC3, 0x53, 0xB9, 0x66, 0xBF, 0xEE, 0xC0, 0x27, 0xC4, 0x26, 0xD1, + 0x2A, 0xD4, 0xD8, 0xEB, 0xC1, 0xDC, 0xA5, 0xF0, 0x57, 0xDE, 0xD9, 0xE5, + 0xD6, 0xE5, 0x60, 0xEF, 0x7E, 0xF9, 0xA1, 0x06, 0x50, 0xFF, 0xCF, 0x07, + 0xB4, 0xF5, 0x89, 0xFE, 0x83, 0xFD, 0x88, 0x03, 0xF3, 0x0D, 0xBB, 0x0C, + 0x77, 0x10, 0x9A, 0x0C, 0x9A, 0x11, 0xBA, 0x0E, 0x06, 0x0F, 0x77, 0x0C, + 0x7C, 0x16, 0xFD, 0x0F, 0xDD, 0x1B, 0x29, 0x10, 0x17, 0x0A, 0xFB, 0xEF, + 0xC7, 0xFE, 0xC3, 0xD4, 0xC8, 0x05, 0xDF, 0xE0, 0x31, 0x0E, 0x08, 0xEB, + 0x37, 0x13, 0x75, 0xE5, 0x15, 0x1F, 0x11, 0xFE, 0x1A, 0x28, 0xD8, 0x1F, + 0xB3, 0x2D, 0x75, 0x2A, 0x92, 0x34, 0x1F, 0x32, 0xBC, 0x28, 0x82, 0x31, + 0xBA, 0x0D, 0x5D, 0x1C, 0xB7, 0xF3, 0x79, 0xFD, 0x83, 0xD1, 0xBB, 0xD3, + 0xDC, 0xBA, 0xAA, 0xB6, 0x1E, 0xB7, 0x6D, 0xB8, 0xE8, 0xB1, 0xB5, 0xBD, + 0x2E, 0xC3, 0xEB, 0xCB, 0x94, 0xD8, 0xE6, 0xE0, 0x34, 0xD6, 0x7D, 0xE6, + 0x01, 0xD7, 0xA9, 0xE6, 0x8F, 0xE3, 0x28, 0xF7, 0xDF, 0xDF, 0x63, 0xF9, + 0x5D, 0xCF, 0x84, 0xD8, 0x61, 0xD1, 0xB7, 0xC2, 0xFD, 0xDD, 0x6D, 0xC4, + 0x42, 0xE8, 0x0C, 0xCF, 0xBB, 0xF3, 0x14, 0xE3, 0x83, 0xF8, 0x2C, 0xEF, + 0x66, 0xFC, 0x4F, 0xEC, 0xFA, 0x00, 0x57, 0xE5, 0x0F, 0xEE, 0x91, 0xD5, + 0xBE, 0xDF, 0xD2, 0xCB, 0x60, 0xE7, 0xA9, 0xCA, 0x9C, 0xEC, 0x17, 0xCB, + 0x36, 0xF7, 0xD9, 0xD6, 0x5C, 0x07, 0x72, 0xE9, 0x0E, 0x21, 0x98, 0x0C, + 0xE4, 0x37, 0xCE, 0x27, 0xDB, 0x37, 0xC5, 0x26, 0x79, 0x25, 0x66, 0x1D, + 0x75, 0x05, 0x64, 0x0C, 0x2B, 0xEF, 0xA1, 0xFE, 0x30, 0xDC, 0xEB, 0xEA, + 0xE2, 0xBA, 0x34, 0xCB, 0x2A, 0xAE, 0x21, 0xC6, 0x06, 0xB7, 0x88, 0xD3, + 0xE2, 0xB3, 0xDF, 0xD6, 0x99, 0xBD, 0x9E, 0xE4, 0x51, 0xD4, 0x78, 0xE8, + 0xC0, 0xDD, 0xDB, 0xD0, 0xFA, 0xE4, 0x6C, 0xC8, 0xD6, 0xEF, 0x2F, 0xDA, + 0x3A, 0xE3, 0x04, 0xD4, 0xCD, 0xC9, 0x02, 0xBD, 0x69, 0xCC, 0x84, 0xC0, + 0xFA, 0xDD, 0xAE, 0xC2, 0x46, 0xE1, 0x84, 0xB8, 0x67, 0xDC, 0xB9, 0xBF, + 0x3B, 0xDD, 0x81, 0xCD, 0x03, 0xE6, 0xE1, 0xDA, 0xBA, 0xE4, 0x5A, 0xE8, + 0xAF, 0xCC, 0xF8, 0xD9, 0xCB, 0xCF, 0xD9, 0xD0, 0xAD, 0xEA, 0x93, 0xE5, + 0x42, 0xEC, 0x73, 0xF3, 0xB5, 0xEB, 0xCF, 0xF5, 0xAA, 0x00, 0x8D, 0x10, + 0xD4, 0x1E, 0xBB, 0x47, 0xFD, 0x3D, 0x26, 0x64, 0x12, 0x51, 0xB0, 0x59, + 0x21, 0x41, 0xDA, 0x45, 0x1F, 0x2D, 0x2E, 0x34, 0xB5, 0x2A, 0xAF, 0x1B, + 0x5D, 0x15, 0x06, 0x00, 0xA8, 0xED, 0x9F, 0xF1, 0x15, 0xDC, 0x61, 0xEC, + 0x9A, 0xDC, 0x3A, 0xEB, 0x15, 0xEA, 0x1D, 0x01, 0xA0, 0x05, 0xB1, 0x1B, + 0x11, 0x11, 0x85, 0x21, 0xDF, 0x05, 0x0E, 0x21, 0x23, 0x0D, 0x41, 0x27, + 0x8B, 0x26, 0x9C, 0x28, 0x15, 0x24, 0x4C, 0x0B, 0x71, 0x1D, 0xBB, 0xE9, + 0xD1, 0x2C, 0x6C, 0xED, 0x33, 0x39, 0x9A, 0x09, 0xCB, 0x24, 0x88, 0x0F, + 0x8A, 0x0F, 0x32, 0x0C, 0xCA, 0x15, 0xA6, 0x16, 0x3E, 0x18, 0xF3, 0x1C, + 0x63, 0x05, 0xCC, 0x0C, 0x57, 0xE9, 0x01, 0xE9, 0xEC, 0xEB, 0xD1, 0xE2, + 0x7F, 0x01, 0x78, 0xF2, 0x6E, 0x0B, 0x07, 0xFD, 0xBA, 0x17, 0x84, 0x1B, + 0xD4, 0x28, 0x8C, 0x46, 0x07, 0x3D, 0x95, 0x5D, 0x95, 0x52, 0x54, 0x5F, + 0xB7, 0x51, 0x25, 0x57, 0x62, 0x2E, 0xDD, 0x37, 0x61, 0x0D, 0x00, 0x0E, + 0xBF, 0x05, 0xC9, 0xFB, 0x07, 0xFB, 0x40, 0xEB, 0x9A, 0xED, 0xD8, 0xCF, + 0xC5, 0xF9, 0xF4, 0xD7, 0x93, 0x02, 0x72, 0xF2, 0x53, 0x0B, 0xD7, 0x10, + 0x34, 0x1F, 0xDA, 0x33, 0xE2, 0x23, 0x9C, 0x3E, 0xAC, 0x22, 0x60, 0x41, + 0x4A, 0x26, 0x30, 0x4F, 0xA7, 0x24, 0x22, 0x54, 0xCF, 0x19, 0x10, 0x35, + 0x4E, 0x18, 0xB4, 0x13, 0x5B, 0x1E, 0xDC, 0x13, 0x60, 0x21, 0x26, 0x14, + 0xAA, 0x25, 0x7A, 0x06, 0x67, 0x25, 0x33, 0x03, 0x27, 0x21, 0x12, 0x0C, + 0xE5, 0x15, 0xB7, 0x0C, 0xD0, 0xFA, 0x2B, 0x00, 0xCA, 0xD8, 0xA8, 0xF0, + 0x31, 0xCB, 0x76, 0xE8, 0xB3, 0xD4, 0x5D, 0xDC, 0xFB, 0xE9, 0xDF, 0xD2, + 0x50, 0xF8, 0x19, 0xDB, 0x84, 0x02, 0xFA, 0xF5, 0xB6, 0x1A, 0x00, 0x26, + 0xCE, 0x22, 0x38, 0x43, 0x0F, 0x19, 0xAA, 0x38, 0x90, 0x09, 0x49, 0x14, + 0x97, 0xFC, 0x04, 0xED, 0xB6, 0xF3, 0x93, 0xD5, 0xDC, 0xD3, 0xDA, 0xC0, + 0xCD, 0xBF, 0xC1, 0xB8, 0xC9, 0xD9, 0xBA, 0xD0, 0x7B, 0xE7, 0xAC, 0xEC, + 0x7A, 0xE7, 0xCB, 0x0A, 0x25, 0xFF, 0x18, 0x25, 0x65, 0x12, 0x5B, 0x2A, + 0x80, 0x15, 0xDE, 0x2A, 0x26, 0x20, 0x82, 0x29, 0xA7, 0x2C, 0xC1, 0x21, + 0x84, 0x27, 0xD5, 0x16, 0xE6, 0x20, 0xC9, 0x16, 0x74, 0x27, 0xD3, 0x2A, + 0xCA, 0x22, 0x22, 0x39, 0x99, 0x19, 0x2C, 0x38, 0x43, 0x25, 0x74, 0x31, + 0x51, 0x2D, 0x43, 0x25, 0x0D, 0x1A, 0x71, 0x16, 0x57, 0xF4, 0x2E, 0xF8, + 0x6B, 0xDA, 0x63, 0xDA, 0x4A, 0xDD, 0xD3, 0xDE, 0xAB, 0xEC, 0x4D, 0xE6, + 0x55, 0x08, 0x13, 0xEA, 0x15, 0x23, 0x8C, 0xF8, 0x95, 0x37, 0x41, 0x0B, + 0xB5, 0x4F, 0x3F, 0x2D, 0x30, 0x49, 0x31, 0x44, 0xC7, 0x1B, 0x99, 0x38, + 0x5E, 0xF8, 0x62, 0x22, 0x9D, 0xF4, 0x86, 0x11, 0x6D, 0xE0, 0x43, 0xFA, + 0xC8, 0xB4, 0x43, 0xD5, 0x00, 0xB5, 0xF0, 0xC5, 0xD6, 0xD6, 0x62, 0xDB, + 0x31, 0xE2, 0x70, 0xEC, 0xCA, 0xF7, 0xD2, 0x00, 0x45, 0x11, 0xB5, 0x1A, + 0xC4, 0x16, 0xF5, 0x26, 0x62, 0x25, 0xAA, 0x29, 0xBB, 0x31, 0x24, 0x2C, + 0x84, 0x21, 0x7E, 0x2A, 0x0F, 0x07, 0x09, 0x14, 0xAF, 0x0E, 0x26, 0x06, + 0x1F, 0x25, 0x5E, 0x12, 0xD9, 0x20, 0x7E, 0x16, 0x63, 0x1E, 0x05, 0x15, + 0x52, 0x2D, 0x7F, 0x29, 0xEC, 0x37, 0x87, 0x41, 0x39, 0x39, 0x5A, 0x40, + 0x17, 0x25, 0xBA, 0x25, 0x05, 0x05, 0xCA, 0x0A, 0xAD, 0xFD, 0x97, 0x07, + 0xC7, 0x06, 0x85, 0x0E, 0xE9, 0x0B, 0x5F, 0x23, 0xE7, 0x0B, 0xC8, 0x36, + 0xFA, 0x22, 0xA9, 0x40, 0x2D, 0x3E, 0x31, 0x51, 0x33, 0x35, 0x5D, 0x53, + 0x19, 0x21, 0x1C, 0x36, 0x44, 0x0C, 0xD6, 0x05, 0xEE, 0x00, 0xA3, 0xF0, + 0xFA, 0xEB, 0x90, 0xE4, 0x60, 0xBF, 0x7D, 0xC9, 0x68, 0xB6, 0xFE, 0xD1, + 0x20, 0xD6, 0xE0, 0xF9, 0x63, 0xED, 0xB4, 0x14, 0xEB, 0x00, 0x5E, 0x25, + 0x6F, 0x16, 0xDF, 0x2C, 0xE0, 0x1F, 0x77, 0x1F, 0x25, 0x20, 0x7B, 0x0C, + 0x6E, 0x28, 0x03, 0x09, 0x02, 0x2A, 0x2A, 0xF7, 0x52, 0x0F, 0x6A, 0xD6, + 0x1E, 0xFF, 0xE6, 0xD8, 0xD1, 0x13, 0xD1, 0xF9, 0x82, 0x1E, 0xD2, 0x0B, + 0x5B, 0x0F, 0x9A, 0x15, 0x53, 0x0F, 0x42, 0x2E, 0x94, 0x1A, 0x86, 0x35, + 0xA6, 0x16, 0x2C, 0x1E, 0x69, 0x06, 0x60, 0x02, 0x14, 0xF1, 0x81, 0xEE, + 0x9C, 0xE7, 0xFB, 0xEC, 0xF7, 0xF3, 0x48, 0x01, 0x28, 0x09, 0x86, 0x16, + 0xBC, 0x1B, 0x11, 0x12, 0x9B, 0x3A, 0xFE, 0x1D, 0xAC, 0x54, 0xEE, 0x47, + 0x2F, 0x48, 0xC7, 0x53, 0xFB, 0x26, 0xF4, 0x3A, 0x28, 0x05, 0x64, 0x14, + 0x1B, 0xF1, 0x65, 0xF7, 0x8E, 0xD8, 0xD4, 0xDE, 0x17, 0xBD, 0xE5, 0xBF, + 0xB3, 0xC4, 0xCA, 0xB2, 0xED, 0xD2, 0x24, 0xC5, 0x5A, 0xDA, 0xEB, 0xEA, + 0x03, 0xF4, 0xC5, 0x12, 0x20, 0x06, 0x1A, 0x2D, 0x74, 0x02, 0x95, 0x24, + 0x4F, 0x0B, 0x3D, 0x08, 0x7D, 0x26, 0xE9, 0xFD, 0x6C, 0x1B, 0x69, 0xEC, + 0xD8, 0xE8, 0x72, 0xC6, 0x1E, 0xCF, 0x6F, 0xB8, 0xE4, 0xD4, 0x92, 0xD2, + 0x63, 0xD4, 0x5A, 0xE1, 0xB2, 0xD3, 0x4E, 0xDE, 0xCC, 0xD3, 0xB2, 0xEE, + 0x51, 0xC7, 0xF0, 0xFB, 0xCF, 0xD0, 0xB8, 0xF0, 0xA8, 0xDF, 0xED, 0xD2, + 0xFE, 0xCA, 0x3B, 0xAD, 0xA0, 0xBA, 0x6D, 0xA4, 0xE6, 0xBE, 0xA9, 0xC3, + 0x37, 0xCC, 0x19, 0xEE, 0xF3, 0xE4, 0x7A, 0x03, 0x68, 0x08, 0x6A, 0x0B, + 0xD9, 0x26, 0x48, 0x1E, 0xE8, 0x2F, 0x6C, 0x2F, 0x91, 0x2A, 0x1D, 0x1C, + 0xA7, 0x13, 0x6B, 0xEE, 0xBE, 0xF2, 0x1E, 0xD4, 0x54, 0xDD, 0x15, 0xCC, + 0x64, 0xD3, 0x96, 0xBF, 0x68, 0xD2, 0x76, 0xBF, 0x64, 0xD9, 0x69, 0xD5, + 0xAA, 0xE5, 0x4A, 0xEE, 0xF4, 0xFD, 0xE1, 0x10, 0xC7, 0x15, 0x65, 0x2B, + 0x7D, 0x1C, 0xCE, 0x1F, 0x0D, 0x0C, 0x01, 0x0A, 0x39, 0xFC, 0xA2, 0x06, + 0x90, 0xFD, 0xCD, 0xF4, 0x53, 0xF0, 0x5E, 0xCB, 0x9B, 0xDF, 0x3D, 0xCC, + 0xA1, 0xE5, 0x86, 0xE8, 0x79, 0xEE, 0x8C, 0xF0, 0xDA, 0xF6, 0x86, 0x07, + 0xF4, 0xFD, 0x07, 0x23, 0xEE, 0xFE, 0xFE, 0x1E, 0xB5, 0xFA, 0x3F, 0x0D, + 0x18, 0xE5, 0x58, 0xF7, 0x34, 0xC7, 0x5F, 0xC9, 0xF8, 0xC4, 0x7A, 0xA7, + 0x81, 0xDC, 0xD8, 0xBB, 0xA6, 0xFE, 0x3F, 0xE2, 0x22, 0x17, 0x77, 0xF3, + 0xEC, 0x29, 0xC3, 0x14, 0x4F, 0x47, 0x26, 0x4E, 0x99, 0x55, 0x8B, 0x62, + 0x48, 0x4B, 0x87, 0x51, 0x7F, 0x31, 0xB3, 0x31, 0x30, 0x17, 0xE5, 0x08, + 0x4D, 0xFE, 0xDC, 0xE4, 0xE0, 0xEA, 0x6F, 0xCE, 0x0C, 0xEB, 0xE1, 0xCD, + 0x4A, 0xF0, 0x66, 0xE3, 0x83, 0xF6, 0x76, 0x0B, 0x26, 0x0D, 0x92, 0x32, + 0x4B, 0x2E, 0x90, 0x43, 0x5C, 0x39, 0xA4, 0x38, 0xD3, 0x31, 0xED, 0x22, + 0x55, 0x2E, 0x0C, 0x19, 0x44, 0x16, 0xC3, 0x08, 0x61, 0xE9, 0x9E, 0xEC, + 0x03, 0xD2, 0x05, 0xDE, 0xA8, 0xE3, 0x7C, 0xF3, 0x90, 0xFB, 0x80, 0x14, + 0xE0, 0x09, 0x01, 0x21, 0x40, 0x16, 0x6C, 0x23, 0xCA, 0x17, 0x60, 0x1E, + 0xFF, 0x0C, 0xCD, 0x11, 0x2A, 0xF0, 0xBE, 0xFA, 0xE3, 0xC5, 0x23, 0xCF, + 0xCA, 0xAE, 0x1F, 0xB2, 0x97, 0xB9, 0xA2, 0xB7, 0xFE, 0xD6, 0x14, 0xCF, + 0x94, 0xEB, 0xD3, 0xEA, 0x6D, 0x03, 0xDA, 0x0C, 0xB2, 0x2D, 0x81, 0x31, + 0x5A, 0x44, 0x4A, 0x3F, 0x56, 0x35, 0xDA, 0x31, 0x1D, 0x09, 0x72, 0x0D, + 0xFE, 0xDE, 0x0A, 0xEA, 0x90, 0xC8, 0x76, 0xD0, 0x76, 0xBD, 0x80, 0xC1, + 0xE5, 0xC0, 0x73, 0xC7, 0x43, 0xD8, 0xB0, 0xD7, 0xFD, 0xF8, 0xB5, 0xF2, + 0xD9, 0x14, 0xAD, 0x1A, 0x64, 0x29, 0x1B, 0x3C, 0x3C, 0x2A, 0xDB, 0x34, + 0x83, 0x19, 0xB6, 0x15, 0xA6, 0x14, 0x58, 0x05, 0xB8, 0x15, 0x70, 0xE7, + 0x7A, 0xF8, 0xA9, 0xB6, 0x03, 0xD0, 0x8D, 0xA8, 0x1D, 0xCF, 0xB5, 0xC6, + 0x18, 0xD8, 0xAE, 0xE0, 0x1B, 0xD2, 0xC3, 0xED, 0xE2, 0xE5, 0xA1, 0xFF, + 0x88, 0xFD, 0xD2, 0x00, 0xBA, 0xF6, 0xB1, 0xF3, 0xAF, 0xE8, 0x9E, 0xE1, + 0xEB, 0xD6, 0xAE, 0xBD, 0xC1, 0xC5, 0x36, 0xA3, 0x8D, 0xBD, 0x24, 0xAC, + 0x6B, 0xC5, 0x94, 0xCE, 0x10, 0xD9, 0x40, 0xEF, 0xCE, 0xE8, 0xF9, 0x04, + 0x54, 0x0C, 0x80, 0x1D, 0x35, 0x33, 0xBB, 0x26, 0xF1, 0x2E, 0x36, 0x13, + 0xF6, 0x06, 0x20, 0xF1, 0x76, 0xDD, 0xE6, 0xCD, 0x02, 0xC6, 0x6C, 0xBB, + 0xDD, 0xAF, 0x19, 0xBD, 0x3B, 0xA1, 0xC4, 0xCA, 0x3A, 0xB8, 0x59, 0xE8, + 0xD5, 0xD8, 0x9A, 0x06, 0x89, 0xF4, 0xEB, 0x1C, 0xA2, 0x0C, 0xDE, 0x2C, + 0x7F, 0x07, 0xD9, 0x2A, 0x65, 0xF5, 0xAA, 0x14, 0xC2, 0xFD, 0xD2, 0xF1, + 0x51, 0x0F, 0xE1, 0xD1, 0x1C, 0xFD, 0x3F, 0xB4, 0x5C, 0xE0, 0x9D, 0xA1, + 0x6E, 0xE1, 0x60, 0xB3, 0xAA, 0xEA, 0x38, 0xDF, 0xED, 0xF8, 0x24, 0x03, + 0xCA, 0x0D, 0x43, 0x0F, 0x74, 0x11, 0x90, 0x1B, 0x86, 0x06, 0x9F, 0x22, + 0x3B, 0xF7, 0x6D, 0x08, 0x20, 0xDD, 0x98, 0xE2, 0xF2, 0xC9, 0x9E, 0xD3, + 0x87, 0xCE, 0xC7, 0xD6, 0xBF, 0xED, 0xA7, 0xE8, 0x9F, 0x1B, 0x7E, 0x11, + 0xED, 0x3F, 0x9F, 0x34, 0x4F, 0x57, 0x23, 0x47, 0x35, 0x5C, 0x63, 0x5A, + 0x9C, 0x44, 0x22, 0x4F, 0x2E, 0x1A, 0x25, 0x14, 0x99, 0xF3, 0x1D, 0xDE, + 0xA5, 0xD9, 0x7B, 0xC6, 0xC6, 0xC4, 0x1A, 0xB8, 0x91, 0xBF, 0x84, 0xBF, + 0x6B, 0xD6, 0x84, 0xE8, 0x42, 0xEE, 0xD5, 0x05, 0xC2, 0xFF, 0x60, 0x19, + 0x47, 0x0C, 0x14, 0x2F, 0x2C, 0x0A, 0x41, 0x28, 0x4C, 0x01, 0xF6, 0x0D, + 0x70, 0xF9, 0x60, 0xF9, 0xF4, 0xFD, 0x29, 0xE7, 0x2D, 0x01, 0x3F, 0xCC, + 0x1E, 0xEF, 0x30, 0xB8, 0x75, 0xED, 0xD8, 0xCD, 0xA9, 0x01, 0x6B, 0xF5, + 0x62, 0x0E, 0xDC, 0x06, 0xE7, 0x16, 0xB4, 0x10, 0x4E, 0x19, 0xE5, 0x16, + 0x65, 0x0E, 0x70, 0x05, 0xCB, 0x02, 0xCE, 0xEF, 0x23, 0xF7, 0x0B, 0xE6, + 0x29, 0xE6, 0xE7, 0xDF, 0x43, 0xE4, 0x86, 0xE9, 0xD9, 0xFA, 0x2A, 0x09, + 0x11, 0x25, 0xD9, 0x37, 0xD5, 0x49, 0xE6, 0x56, 0x6B, 0x58, 0x31, 0x5C, + 0x5E, 0x55, 0x67, 0x55, 0x5A, 0x42, 0x9E, 0x39, 0x8E, 0x21, 0xF8, 0xFF, + 0x13, 0xFC, 0xB7, 0xC9, 0x42, 0xE4, 0x15, 0xBB, 0x99, 0xD5, 0x3F, 0xBB, + 0x5C, 0xD0, 0x6D, 0xC0, 0x7C, 0xE7, 0x2A, 0xDF, 0x11, 0xF9, 0xC4, 0x00, + 0x97, 0xEE, 0x3A, 0x0F, 0x2C, 0xEF, 0x40, 0x1D, 0xBF, 0xF5, 0x48, 0x28, + 0x73, 0xEC, 0xDE, 0x14, 0x3D, 0xEA, 0xB0, 0xFB, 0x7C, 0xF8, 0x66, 0x03, + 0x7D, 0xFF, 0x5F, 0x07, 0x13, 0xF8, 0x16, 0xEB, 0x07, 0xFA, 0x3A, 0xDC, + 0xC5, 0x0F, 0x7A, 0xF4, 0xC6, 0x17, 0x03, 0x0C, 0x14, 0x01, 0x47, 0x0D, + 0xAA, 0xEF, 0x70, 0x12, 0x4C, 0xEC, 0x3D, 0x12, 0x3D, 0xE1, 0x9C, 0xF3, + 0x11, 0xD5, 0x06, 0xD7, 0x44, 0xD3, 0x37, 0xD4, 0x8A, 0xE0, 0x2B, 0xE1, + 0x46, 0xFD, 0xA1, 0xFB, 0xDE, 0x25, 0xAE, 0x26, 0x10, 0x3D, 0x7D, 0x45, + 0xAB, 0x3C, 0x70, 0x44, 0x5F, 0x3A, 0x0F, 0x3B, 0x28, 0x35, 0x11, 0x2F, + 0xB1, 0x29, 0x83, 0x0E, 0xE0, 0x0C, 0x22, 0xE1, 0x98, 0xEE, 0x31, 0xCF, + 0x61, 0xDC, 0xA6, 0xDA, 0xAD, 0xCE, 0xC6, 0xE6, 0x11, 0xD3, 0xCB, 0xF2, + 0xE4, 0xE4, 0x8E, 0xFA, 0x0A, 0xEF, 0x76, 0xEF, 0x05, 0xF9, 0x79, 0xF0, + 0x9F, 0x03, 0xB2, 0x00, 0xAE, 0xFB, 0x8C, 0xF8, 0xC5, 0xE9, 0x4F, 0xEF, + 0x9A, 0xF3, 0xB6, 0xFF, 0x93, 0x09, 0x0F, 0x00, 0x5B, 0xFD, 0xB6, 0xE9, + 0x69, 0xDD, 0xD3, 0xDE, 0x4E, 0xD7, 0x10, 0xE9, 0xD2, 0xE4, 0x8F, 0xFB, + 0x73, 0xE9, 0x1C, 0xFC, 0x6D, 0xF6, 0xD7, 0xF3, 0xB8, 0x04, 0x60, 0xEC, + 0x29, 0xF8, 0xCE, 0xDA, 0x6C, 0xEA, 0xA1, 0xCD, 0x3D, 0xE2, 0x73, 0xC0, + 0x91, 0xD8, 0x6F, 0xC1, 0x94, 0xDE, 0x78, 0xE1, 0x9C, 0xFB, 0x74, 0x0A, + 0x03, 0x1A, 0xFD, 0x27, 0x67, 0x1F, 0x3C, 0x28, 0xBC, 0x24, 0xE8, 0x24, + 0x29, 0x2C, 0xA1, 0x2D, 0x42, 0x1F, 0x32, 0x2F, 0x93, 0x0D, 0x3F, 0x1E, + 0x19, 0x04, 0x0F, 0x06, 0xD3, 0x03, 0xF6, 0x03, 0xB7, 0x03, 0x34, 0x0F, + 0x6D, 0xF1, 0xCD, 0x17, 0xAD, 0xDC, 0xD5, 0x29, 0xBD, 0xDD, 0x14, 0x35, + 0xA3, 0xF7, 0x13, 0x2D, 0x58, 0x1C, 0x11, 0x2B, 0xC2, 0x29, 0xB6, 0x2B, + 0x41, 0x1C, 0xCD, 0x19, 0x20, 0x1E, 0xE3, 0x11, 0x06, 0x36, 0xA6, 0x20, + 0xBD, 0x39, 0x0E, 0x1F, 0x4A, 0x2C, 0xE6, 0x0E, 0x28, 0x34, 0x05, 0x1B, + 0x91, 0x43, 0x51, 0x3C, 0x47, 0x3B, 0x6A, 0x44, 0x19, 0x35, 0x60, 0x3B, + 0x69, 0x3E, 0xBF, 0x33, 0xB3, 0x35, 0xEC, 0x21, 0xFE, 0x1A, 0x0E, 0x0C, + 0x0A, 0x0C, 0xCB, 0xFA, 0x29, 0x09, 0xA2, 0xEE, 0x61, 0x0D, 0x6E, 0xF3, + 0xE6, 0x2A, 0xC6, 0x17, 0xD8, 0x4A, 0x50, 0x40, 0xE4, 0x4C, 0x54, 0x4B, + 0x27, 0x49, 0xD9, 0x44, 0xA6, 0x45, 0x45, 0x3E, 0x74, 0x35, 0xDF, 0x39, + 0x50, 0x1E, 0xAC, 0x2D, 0xB6, 0x04, 0x24, 0x15, 0xCD, 0xFB, 0x36, 0x08, + 0x16, 0xFF, 0x7B, 0x14, 0x99, 0xF5, 0xB6, 0x1A, 0xFF, 0xF0, 0x5E, 0x11, + 0x44, 0xF6, 0xD0, 0x11, 0x89, 0xF5, 0xE1, 0x11, 0x1A, 0x05, 0xFE, 0x10, + 0xE2, 0x26, 0x9B, 0x1D, 0x4C, 0x31, 0xD5, 0x21, 0x92, 0x28, 0xCF, 0x14, + 0x37, 0x38, 0xE1, 0x17, 0x9D, 0x41, 0x18, 0x29, 0x29, 0x28, 0x9C, 0x28, + 0x9C, 0x1A, 0xDF, 0x1F, 0xB0, 0x2C, 0x34, 0x2D, 0x93, 0x3D, 0xE7, 0x3F, + 0xA0, 0x36, 0x55, 0x34, 0xBA, 0x2C, 0xE3, 0x22, 0x9C, 0x26, 0x04, 0x20, + 0x65, 0x0C, 0xF9, 0x09, 0x64, 0xF9, 0x90, 0xEC, 0x4F, 0xF4, 0x78, 0xE3, + 0x30, 0xDF, 0xEE, 0xE0, 0x54, 0xDC, 0xC8, 0xEA, 0x12, 0xFA, 0x5E, 0x0B, + 0xA1, 0x0F, 0x1A, 0x29, 0x74, 0x0A, 0x78, 0x21, 0xEB, 0x09, 0xC8, 0x0F, + 0x7F, 0x13, 0x48, 0x0C, 0x91, 0x09, 0xCD, 0x01, 0x12, 0xFA, 0x3A, 0xEC, + 0xFB, 0xF1, 0x1B, 0xDF, 0x1A, 0xE2, 0xD1, 0xE4, 0x09, 0xD5, 0xE9, 0xEC, + 0x9A, 0xD3, 0x34, 0xEE, 0xD0, 0xDE, 0x1A, 0xF2, 0xAE, 0xE9, 0x9C, 0xE7, + 0xA5, 0xE0, 0x61, 0xD0, 0xD8, 0xE4, 0xA6, 0xDE, 0x27, 0xFC, 0x4F, 0xFC, + 0xCD, 0xFC, 0x80, 0xF4, 0xE9, 0xF6, 0xF2, 0xEE, 0xD6, 0x13, 0xE8, 0x0E, + 0x64, 0x2F, 0xDA, 0x1E, 0xA4, 0x26, 0xC8, 0x0E, 0x5D, 0x1F, 0x68, 0x16, + 0x77, 0x29, 0x96, 0x34, 0xC7, 0x25, 0x8D, 0x36, 0xBC, 0x19, 0x35, 0x2C, + 0xBA, 0x1E, 0x43, 0x33, 0x45, 0x18, 0x62, 0x26, 0xDA, 0xFD, 0x29, 0x03, + 0xC4, 0xEF, 0xED, 0xF0, 0xE5, 0xDF, 0x90, 0xE8, 0x0D, 0xC8, 0x5A, 0xE5, + 0x81, 0xCF, 0xD0, 0xF9, 0xCA, 0xF4, 0x5D, 0x15, 0x1B, 0x06, 0x5A, 0x16, + 0x3A, 0x08, 0x2A, 0x06, 0x25, 0x14, 0x44, 0xFF, 0xAC, 0x19, 0x08, 0x08, + 0xD6, 0x12, 0x65, 0x0D, 0x96, 0x01, 0x4F, 0xF4, 0x16, 0xF9, 0x00, 0xE4, + 0x00, 0xFA, 0x12, 0xF0, 0x5E, 0xF2, 0x36, 0xEC, 0x8E, 0xE2, 0x5A, 0xDC, + 0x77, 0xD1, 0x9D, 0xE1, 0x36, 0xBB, 0x49, 0xDC, 0x17, 0xBA, 0xC3, 0xCD, + 0xE3, 0xDF, 0x50, 0xDE, 0xD2, 0xF4, 0x7A, 0xEB, 0xBA, 0xE8, 0x04, 0xE1, + 0x72, 0xF5, 0xBA, 0xF5, 0xD3, 0x13, 0xD2, 0x20, 0x6C, 0x18, 0x7A, 0x22, + 0xB4, 0x13, 0x15, 0x11, 0x55, 0x20, 0x0E, 0x15, 0x94, 0x30, 0xAD, 0x1B, + 0x99, 0x2D, 0x62, 0x19, 0xEC, 0x1C, 0x8B, 0x17, 0x08, 0x0B, 0x84, 0x14, + 0xDD, 0xF8, 0xEE, 0x00, 0x5B, 0xF4, 0xB3, 0xED, 0x60, 0xF0, 0x4B, 0xEB, + 0x9B, 0xDD, 0x88, 0xEC, 0x2E, 0xDF, 0xBA, 0xF5, 0x9F, 0xFA, 0xC8, 0x0B, + 0x3B, 0x18, 0xA7, 0x20, 0x7C, 0x20, 0xF6, 0x17, 0x2A, 0x14, 0x0F, 0x01, + 0x77, 0x06, 0x71, 0xF6, 0x40, 0xFD, 0x21, 0xF6, 0x83, 0xF2, 0x2B, 0xF9, + 0xB9, 0xDD, 0x9A, 0xED, 0x3A, 0xD9, 0x6B, 0xE2, 0xB8, 0xF1, 0xF0, 0xE6, + 0x81, 0xFC, 0xB4, 0xE8, 0x1A, 0xEC, 0x2E, 0xE3, 0xD5, 0xDF, 0xFB, 0xE2, + 0x99, 0xCC, 0x88, 0xD5, 0x02, 0xC9, 0x68, 0xCD, 0x69, 0xE4, 0xF8, 0xE1, + 0xFE, 0xEE, 0x02, 0xEB, 0x03, 0xE8, 0xC7, 0xE1, 0x2F, 0xFB, 0x62, 0xF0, + 0x97, 0x0D, 0x15, 0x00, 0x77, 0xF5, 0xE6, 0xF2, 0x04, 0xE7, 0xC0, 0xF2, + 0xC4, 0xF7, 0x5E, 0x02, 0x1F, 0x03, 0x3E, 0xFF, 0x05, 0x13, 0xB0, 0xF4, + 0xDD, 0x1D, 0xDE, 0xED, 0xC2, 0x0E, 0x24, 0xE5, 0xB6, 0xF6, 0xA1, 0xD8, + 0xE8, 0xE2, 0xF3, 0xD2, 0x05, 0xD0, 0x3F, 0xD6, 0x35, 0xB9, 0xE2, 0xDB, + 0x42, 0xB4, 0x4E, 0xEE, 0xD7, 0xCD, 0x7E, 0x08, 0xAB, 0xEE, 0x16, 0x18, + 0xB8, 0x01, 0x84, 0x13, 0xF6, 0x0A, 0x48, 0x0A, 0x03, 0x12, 0xF0, 0x0B, + 0xF0, 0x18, 0x08, 0x0B, 0x9E, 0x14, 0xA7, 0x00, 0x39, 0x00, 0x46, 0xF9, + 0x34, 0xF8, 0x34, 0xFA, 0xA7, 0x03, 0xFB, 0x01, 0xB7, 0xFA, 0x15, 0x07, + 0xC2, 0xE9, 0x66, 0xFF, 0x1A, 0xEC, 0xCA, 0xE3, 0xA7, 0xDD, 0xDD, 0xBE, + 0x8B, 0xD3, 0x03, 0xC0, 0x07, 0xE4, 0xB9, 0xDB, 0xE8, 0xE1, 0x3A, 0xD9, + 0x47, 0xD7, 0xDE, 0xCD, 0x4C, 0xF1, 0x3E, 0xE2, 0x30, 0x06, 0xDB, 0xE3, + 0x33, 0xF8, 0x68, 0xC7, 0x86, 0xEB, 0xBC, 0xC7, 0x23, 0xE0, 0x53, 0xDD, + 0xA9, 0xCF, 0x32, 0xE7, 0xB2, 0xD0, 0x7C, 0xEC, 0x5A, 0xDE, 0xD5, 0xE5, + 0x51, 0xE1, 0xC7, 0xC9, 0xCE, 0xCD, 0xBE, 0xB1, 0x42, 0xB9, 0x04, 0xB1, + 0x6F, 0xB7, 0xFD, 0xB7, 0x89, 0xB9, 0xA7, 0xBD, 0xDE, 0xC1, 0x24, 0xCD, + 0x00, 0xE1, 0x58, 0xEB, 0x1D, 0x03, 0xED, 0x04, 0xB1, 0x09, 0x30, 0x02, + 0x26, 0x06, 0x4C, 0xF9, 0xCE, 0x02, 0xAB, 0xFF, 0x82, 0xFF, 0x29, 0x12, + 0x10, 0xFD, 0xB3, 0x19, 0x84, 0xFB, 0x22, 0x11, 0x0A, 0x03, 0x9F, 0x13, + 0x04, 0x07, 0x55, 0x12, 0xAF, 0x00, 0x1A, 0xF4, 0xF6, 0xFD, 0xFE, 0xE0, + 0x0F, 0xF1, 0x1F, 0xDD, 0x5C, 0xDF, 0x0F, 0xCE, 0xB6, 0xF2, 0xC6, 0xD4, + 0xF3, 0x10, 0x11, 0xEC, 0xAB, 0xFB, 0xE4, 0xE3, 0xD3, 0xDA, 0x3B, 0xDE, + 0x4A, 0xDC, 0xC9, 0xF8, 0xF4, 0xD7, 0xC4, 0x00, 0xBA, 0xD1, 0x07, 0xF4, + 0x26, 0xD9, 0x16, 0xEF, 0x0B, 0xE3, 0x89, 0xF4, 0x16, 0xF2, 0x77, 0x08, + 0x86, 0xFA, 0x53, 0x1A, 0xFE, 0xF4, 0xF6, 0x10, 0x00, 0xF0, 0x2B, 0xFA, + 0x51, 0xE7, 0x98, 0xE8, 0xEC, 0xDA, 0x3A, 0xE3, 0xC1, 0xE0, 0x9D, 0xEC, + 0x39, 0xF3, 0xF2, 0xF4, 0xF3, 0x05, 0x51, 0xFA, 0x8F, 0x22, 0x88, 0x11, + 0x47, 0x34, 0xD6, 0x22, 0x61, 0x26, 0x99, 0x14, 0xE3, 0x1D, 0x4C, 0x0C, + 0x3B, 0x30, 0x28, 0x1C, 0xD5, 0x4A, 0x37, 0x37, 0x53, 0x54, 0x0E, 0x46, + 0x02, 0x4B, 0xCC, 0x42, 0xDE, 0x40, 0x70, 0x40, 0x9A, 0x39, 0x7E, 0x3B, + 0x38, 0x2F, 0x1E, 0x2D, 0x91, 0x22, 0x32, 0x22, 0xC9, 0x0B, 0xD4, 0x16, + 0xDF, 0x00, 0xC8, 0x0A, 0xBE, 0x19, 0x3D, 0x0C, 0x24, 0x32, 0xAB, 0x15, + 0x14, 0x29, 0x6D, 0x0B, 0xAD, 0x1C, 0x51, 0x05, 0x13, 0x21, 0x53, 0x17, + 0x07, 0x1D, 0x11, 0x1B, 0x93, 0x07, 0xA3, 0x0C, 0x74, 0xF9, 0x83, 0x05, + 0x56, 0x06, 0xB3, 0x15, 0x33, 0x1D, 0xA0, 0x2F, 0x7F, 0x26, 0x3B, 0x2F, + 0x45, 0x1C, 0xEF, 0x14, 0x37, 0x07, 0xA9, 0xFB, 0x8D, 0xF1, 0x44, 0xE7, + 0xD6, 0xE1, 0xCB, 0xDD, 0x71, 0xDC, 0x81, 0xE4, 0xEE, 0xE1, 0x7A, 0xE9, + 0xE0, 0xF1, 0x27, 0xEB, 0x6B, 0x08, 0xAB, 0xF8, 0xD9, 0x1A, 0xD3, 0x05, + 0x8C, 0x17, 0xD6, 0x08, 0x28, 0x06, 0x4B, 0x0C, 0xBD, 0x06, 0x18, 0x12, + 0x7A, 0x1B, 0x71, 0x26, 0xE4, 0x1E, 0x5D, 0x35, 0x88, 0x16, 0x88, 0x29, + 0x48, 0x1E, 0x54, 0x22, 0x48, 0x1D, 0xDE, 0x1D, 0x94, 0x0D, 0x18, 0x10, + 0x2F, 0x09, 0x14, 0x05, 0x89, 0x01, 0xE4, 0xF4, 0x0F, 0xF1, 0xC9, 0xF0, + 0x1D, 0xF0, 0x9E, 0x07, 0x66, 0xF5, 0xBE, 0x17, 0x21, 0xE7, 0x21, 0x05, + 0x9A, 0xE7, 0x70, 0xF1, 0x8C, 0x0A, 0xBF, 0xEE, 0xD9, 0x1C, 0xBD, 0xE6, + 0x83, 0x0C, 0xCA, 0xDD, 0x9A, 0xF1, 0x50, 0xDA, 0x9D, 0xE5, 0xB2, 0xE7, + 0xFF, 0xF4, 0xEC, 0x04, 0xFE, 0xFF, 0x19, 0x08, 0x8B, 0xF9, 0x68, 0xF0, + 0xE5, 0xED, 0xA8, 0xD5, 0xDD, 0xD4, 0x75, 0xC2, 0x87, 0xBC, 0x5B, 0xC4, + 0xB0, 0xBA, 0x95, 0xD0, 0xC8, 0xC6, 0x8C, 0xD7, 0x5F, 0xD8, 0x85, 0xDA, + 0xF3, 0xF4, 0x86, 0xE8, 0x71, 0x0A, 0x01, 0xF5, 0xE4, 0x07, 0xC0, 0xEE, + 0x4F, 0xFF, 0x6E, 0xF2, 0x6B, 0xFB, 0x0A, 0x0A, 0xFB, 0x0C, 0xD7, 0x26, + 0xC4, 0x23, 0x18, 0x32, 0x42, 0x1C, 0x3C, 0x1F, 0xB5, 0x0F, 0x2D, 0x11, + 0x06, 0x06, 0xE6, 0x09, 0x54, 0xF6, 0xBF, 0xF7, 0x22, 0xF1, 0x6F, 0xF3, + 0xB5, 0xE9, 0x87, 0xEF, 0xAE, 0xE1, 0xD6, 0xE5, 0x93, 0xF5, 0xDA, 0xF5, + 0x0F, 0x07, 0xD0, 0xFF, 0x05, 0xF1, 0xCA, 0xE8, 0x05, 0xE5, 0xD3, 0xE2, + 0x3C, 0xFA, 0xCB, 0xF2, 0xA1, 0x08, 0x88, 0xF9, 0x26, 0x11, 0xD2, 0xFB, + 0x53, 0x17, 0xBA, 0xFA, 0x37, 0x1E, 0xB4, 0x03, 0x2C, 0x2E, 0xF3, 0x1E, + 0x1B, 0x26, 0x78, 0x26, 0xA7, 0x09, 0x7B, 0x14, 0x74, 0xF9, 0x7F, 0x04, + 0xA6, 0xEC, 0xA1, 0xFC, 0xA4, 0xE5, 0x4A, 0xFE, 0x85, 0xF0, 0x30, 0x04, + 0xA8, 0xF7, 0x6C, 0x04, 0xDE, 0xF8, 0xB5, 0x05, 0x74, 0x01, 0x9A, 0x13, + 0x35, 0x03, 0x9E, 0x1E, 0x18, 0xFE, 0x92, 0x18, 0xB8, 0x01, 0x95, 0x0E, + 0xD0, 0x0A, 0xBC, 0x10, 0x46, 0x1B, 0x2A, 0x22, 0x80, 0x2A, 0xB3, 0x2B, + 0x7B, 0x20, 0x26, 0x17, 0x75, 0x15, 0xC6, 0x04, 0xF1, 0x10, 0xBB, 0x05, + 0x6A, 0xF7, 0xA8, 0x02, 0xDC, 0xE5, 0xF1, 0x01, 0x94, 0xE1, 0x6C, 0xFD, + 0xDC, 0xD4, 0xC7, 0xED, 0xD5, 0xE7, 0xED, 0xFC, 0x8D, 0x0A, 0xC8, 0x1B, + 0x17, 0x07, 0x30, 0x12, 0x24, 0xFD, 0x4D, 0xFB, 0x5B, 0x11, 0xD4, 0xFD, + 0xA2, 0x1F, 0xE5, 0x01, 0xB7, 0x19, 0xCC, 0x00, 0xDE, 0x16, 0x52, 0x06, + 0x53, 0x1A, 0x45, 0x12, 0xC1, 0x26, 0xA6, 0x26, 0xBC, 0x32, 0xEA, 0x33, + 0x69, 0x23, 0x20, 0x2B, 0x61, 0x0B, 0x09, 0x22, 0x7B, 0xF9, 0x7D, 0x14, + 0x12, 0xF6, 0x91, 0x07, 0x75, 0x0B, 0xE4, 0x0E, 0x51, 0x18, 0xF1, 0x14, + 0x4D, 0x19, 0x39, 0x14, 0x03, 0x21, 0x21, 0x15, 0x8B, 0x22, 0xFA, 0x12, + 0x55, 0x19, 0x45, 0x0C, 0x0D, 0x09, 0x3B, 0xFC, 0x01, 0xF8, 0x50, 0xF5, + 0x63, 0xF6, 0xD2, 0xFF, 0x5A, 0x0C, 0xBB, 0x02, 0xE5, 0x23, 0xB8, 0xF4, + 0x53, 0x23, 0xD2, 0xEB, 0x5C, 0x17, 0x31, 0xFC, 0xA5, 0x07, 0xBF, 0x0A, + 0x03, 0xF5, 0x51, 0x0C, 0xC5, 0xEA, 0x54, 0x08, 0xF5, 0xDB, 0x26, 0xEF, + 0xFB, 0xD8, 0x05, 0xEC, 0x12, 0xF0, 0x24, 0x0C, 0x6F, 0xFB, 0x1E, 0x0C, + 0x29, 0xF1, 0xD5, 0xED, 0xD4, 0xF1, 0x4B, 0xE2, 0x65, 0x00, 0x80, 0xE9, + 0x94, 0x0C, 0x44, 0xF2, 0x09, 0x08, 0xA7, 0xF3, 0xF1, 0xF7, 0x5F, 0xF2, + 0x4E, 0xFE, 0x3E, 0xFD, 0x71, 0x1B, 0xC5, 0x18, 0xF7, 0x20, 0xF0, 0x26, + 0x62, 0x0B, 0x9E, 0x1B, 0x10, 0xF2, 0x3E, 0x0E, 0x67, 0xDD, 0xC0, 0x07, + 0x77, 0xE1, 0x07, 0x04, 0xE7, 0xF5, 0x8F, 0xFB, 0x62, 0xF9, 0x74, 0xF1, + 0xA4, 0xF6, 0x1F, 0xF5, 0x76, 0x00, 0x21, 0xFB, 0x89, 0x05, 0x3F, 0xFE, + 0x32, 0xF6, 0x09, 0xFF, 0x28, 0xF0, 0x5E, 0xFE, 0x75, 0x02, 0x8F, 0x03, + 0x4D, 0x17, 0x14, 0x0B, 0xAF, 0x13, 0x43, 0x02, 0xB6, 0xF5, 0x04, 0xE8, + 0x94, 0xE3, 0xD4, 0xE0, 0xCB, 0xE6, 0xC8, 0xF4, 0xCF, 0xE4, 0x31, 0xFB, + 0xF2, 0xE1, 0xA0, 0xED, 0x26, 0xDC, 0x4F, 0xDD, 0x29, 0xDC, 0xFE, 0xD7, + 0xE2, 0xFA, 0x4C, 0xEE, 0x0E, 0x05, 0x0C, 0xFB, 0xA9, 0xDD, 0xCF, 0xE0, + 0x8D, 0xCA, 0x94, 0xD4, 0x44, 0xE6, 0xED, 0xF1, 0x61, 0xFB, 0xD1, 0xFD, + 0xDC, 0xFA, 0x57, 0xE7, 0xCE, 0xF5, 0x64, 0xDC, 0xC8, 0xF2, 0xF5, 0xE1, + 0x78, 0x06, 0x21, 0xF0, 0xDB, 0x17, 0x17, 0xFC, 0x23, 0x07, 0xA4, 0xF4, + 0xE4, 0xF6, 0x03, 0xF2, 0xAF, 0xF3, 0xEE, 0xFF, 0x2B, 0xF2, 0x5B, 0x03, + 0x33, 0xFE, 0x6C, 0xFE, 0x10, 0x0E, 0x60, 0x06, 0xF6, 0x07, 0xC8, 0x13, + 0x9A, 0xF6, 0x3A, 0x18, 0x99, 0xF6, 0x83, 0x17, 0xC1, 0xFF, 0x89, 0x14, + 0xBC, 0xFF, 0x29, 0x0B, 0x90, 0x08, 0x4D, 0x10, 0xC2, 0x11, 0x56, 0x1D, + 0x45, 0x1A, 0x16, 0x24, 0xCA, 0x1F, 0xD4, 0x23, 0xD9, 0x17, 0x01, 0x1E, + 0x2F, 0x1B, 0x7C, 0x23, 0x70, 0x1F, 0xC9, 0x2A, 0xD3, 0x16, 0xE6, 0x1E, + 0xAC, 0x1B, 0xB8, 0x19, 0xC3, 0x10, 0xE1, 0x19, 0xDF, 0x00, 0xD3, 0x14, + 0x6A, 0x1A, 0xDE, 0x22, 0x19, 0x26, 0xFE, 0x27, 0xD7, 0x10, 0x9B, 0x12, + 0xBA, 0x19, 0x14, 0x18, 0xF1, 0x39, 0xD3, 0x32, 0xA7, 0x42, 0xB8, 0x30, + 0x3F, 0x3D, 0x06, 0x24, 0xD8, 0x3B, 0x19, 0x1F, 0x62, 0x3D, 0x42, 0x1F, + 0xA0, 0x42, 0xB2, 0x30, 0xAD, 0x33, 0xF2, 0x33, 0x78, 0x0F, 0x27, 0x1A, + 0x42, 0xFB, 0xFA, 0x08, 0xBC, 0xFE, 0x2A, 0x10, 0x9D, 0x06, 0x88, 0x17, + 0xE8, 0x11, 0xBB, 0x15, 0xC7, 0x20, 0xD2, 0x1D, 0x4B, 0x26, 0x43, 0x2E, + 0xD1, 0x29, 0x66, 0x38, 0x89, 0x2F, 0xAD, 0x3E, 0x70, 0x25, 0x56, 0x3C, + 0x0B, 0x1C, 0x5C, 0x34, 0x2B, 0x2A, 0x27, 0x36, 0x33, 0x3F, 0xDA, 0x44, + 0x36, 0x46, 0xF3, 0x54, 0x3D, 0x31, 0x7E, 0x49, 0x27, 0x1B, 0x10, 0x2F, + 0x61, 0x23, 0xC0, 0x21, 0x9C, 0x30, 0x56, 0x15, 0xFB, 0x1F, 0x8A, 0xFE, + 0x84, 0x09, 0x23, 0xFD, 0xDD, 0x04, 0x80, 0x09, 0x6E, 0x0C, 0x54, 0x0E, + 0xF1, 0x14, 0x1A, 0x20, 0xBE, 0x00, 0x29, 0x1F, 0x38, 0xE1, 0x86, 0xFB, + 0xB3, 0xEC, 0x4D, 0xF4, 0x81, 0x03, 0x7E, 0xFD, 0xE9, 0xF8, 0xE2, 0xF0, + 0x3D, 0xEE, 0xDE, 0xE9, 0x9D, 0xF7, 0xBF, 0xE7, 0x90, 0x00, 0x05, 0xE6, + 0xEF, 0x01, 0xA5, 0xF1, 0xD7, 0xEF, 0xCE, 0xF2, 0x55, 0xD0, 0xF8, 0xE3, + 0xD3, 0xC6, 0x9D, 0xDB, 0x8F, 0xCF, 0x96, 0xD5, 0x81, 0xCF, 0xB5, 0xCC, + 0x67, 0xCE, 0x48, 0xCA, 0x04, 0xD7, 0xB7, 0xD1, 0xE2, 0xDF, 0x92, 0xDA, + 0x8B, 0xE5, 0xCF, 0xDC, 0x25, 0xF2, 0xB7, 0xD7, 0x0A, 0xFD, 0xE2, 0xC9, + 0xF4, 0xF9, 0x31, 0xC8, 0xE6, 0xF1, 0x68, 0xDC, 0x02, 0xF7, 0x7E, 0xFC, + 0x96, 0x08, 0x5B, 0x19, 0xDB, 0x03, 0xFD, 0x0B, 0x2B, 0xF9, 0xB2, 0xF2, + 0x1B, 0xFB, 0x29, 0xF1, 0xA1, 0xF5, 0xF8, 0xE4, 0xC3, 0xF2, 0xB6, 0xD7, + 0x16, 0xF0, 0x50, 0xD7, 0xA5, 0xDE, 0x65, 0xD3, 0xE4, 0xDD, 0xAE, 0xE3, + 0xBD, 0xEC, 0x1E, 0xFC, 0x43, 0xE5, 0x01, 0xEA, 0xD2, 0xD9, 0x91, 0xCD, + 0xE2, 0xE5, 0xC1, 0xDD, 0xED, 0xEC, 0x7B, 0xF5, 0x2E, 0xDF, 0xCC, 0xF2, + 0xC5, 0xD1, 0x01, 0xED, 0x94, 0xD0, 0x3B, 0xEC, 0xEB, 0xDF, 0x69, 0xF5, + 0x43, 0xEF, 0xF7, 0x07, 0x3B, 0xF1, 0xCD, 0x06, 0x0B, 0xF3, 0xF3, 0xEE, + 0x6D, 0xEB, 0x9F, 0xD1, 0x7F, 0xD9, 0xC0, 0xC4, 0xA2, 0xD6, 0x0E, 0xD1, + 0x03, 0xDB, 0x79, 0xDB, 0xFC, 0xD6, 0x7A, 0xD3, 0x01, 0xDB, 0xDF, 0xCC, + 0x4E, 0xE2, 0xE0, 0xCE, 0x07, 0xE3, 0x90, 0xD3, 0x80, 0xE7, 0xAF, 0xD5, + 0x4C, 0xF1, 0x27, 0xD6, 0x21, 0x01, 0xC9, 0xE3, 0xF2, 0x0A, 0xAB, 0xF5, + 0x58, 0xFF, 0x33, 0xFF, 0xD3, 0xE8, 0x7F, 0x00, 0x0D, 0xDF, 0xD4, 0x02, + 0xD5, 0xDC, 0x3F, 0x05, 0x21, 0xDE, 0xB6, 0x07, 0x0B, 0xEA, 0x49, 0x0B, + 0xB1, 0xEE, 0x0C, 0x00, 0x35, 0xE7, 0xD8, 0xE7, 0xC2, 0xF1, 0xA8, 0xE5, + 0x37, 0xFE, 0xB1, 0xF3, 0xAE, 0xE6, 0xB3, 0xE8, 0x7B, 0xD8, 0x82, 0xDE, + 0xD2, 0xE8, 0x72, 0xE8, 0x9D, 0xF7, 0x55, 0xEE, 0xD4, 0xFE, 0xA9, 0xEE, + 0x9A, 0xF1, 0x5C, 0xEB, 0xAC, 0xE4, 0x66, 0xEE, 0xBC, 0xF7, 0x0E, 0x03, + 0xF6, 0x0A, 0xB1, 0x15, 0xC4, 0x07, 0x96, 0x12, 0x0E, 0xFD, 0xB5, 0xF9, + 0x18, 0xF0, 0x01, 0xDB, 0xB9, 0xE5, 0x5D, 0xC9, 0x7F, 0xE5, 0x2D, 0xC2, + 0x3D, 0xEF, 0x12, 0xC9, 0xED, 0xE5, 0x0E, 0xD2, 0x0E, 0xD2, 0xCB, 0xD2, + 0x64, 0xD4, 0x27, 0xD9, 0x02, 0xEE, 0x87, 0xF5, 0x0B, 0x04, 0x3E, 0x07, + 0xB9, 0xFF, 0xB9, 0xF8, 0x04, 0xFF, 0x07, 0x01, 0x25, 0x06, 0x23, 0x14, + 0x90, 0x0C, 0x98, 0x12, 0x9E, 0x0B, 0xE3, 0x09, 0x5F, 0xFC, 0x2B, 0x00, + 0x8E, 0xF7, 0x1B, 0x01, 0x51, 0x02, 0x89, 0x0A, 0x5B, 0xFB, 0xD1, 0xFF, + 0x12, 0xEA, 0xC9, 0xE4, 0xEC, 0xEC, 0x3F, 0xD5, 0x00, 0xF5, 0xAD, 0xD3, + 0x0D, 0xF9, 0x4E, 0xE0, 0x78, 0xEB, 0x85, 0xE7, 0x8E, 0xD4, 0xFE, 0xE5, + 0x8E, 0xE1, 0x9D, 0xF7, 0x2D, 0x02, 0x2D, 0x09, 0xA1, 0x0E, 0x54, 0x06, + 0xB2, 0x0F, 0x13, 0x09, 0x08, 0x08, 0x1E, 0x0E, 0x7F, 0x16, 0xEF, 0x19, + 0x46, 0x35, 0x06, 0x29, 0xBF, 0x2E, 0xAC, 0x27, 0x18, 0x10, 0x34, 0x21, + 0x72, 0xF4, 0x8E, 0x13, 0xEA, 0xEE, 0xAB, 0x0B, 0xCF, 0xF7, 0x90, 0x04, + 0xB6, 0x09, 0xEC, 0x02, 0x4D, 0x07, 0xE3, 0xFF, 0xEC, 0xF9, 0x0B, 0xFB, + 0x78, 0x05, 0x3C, 0x05, 0x02, 0x06, 0xAB, 0x0B, 0xC2, 0xFA, 0x6E, 0x10, + 0x5A, 0xFA, 0x28, 0x13, 0x5E, 0xF8, 0x7B, 0x09, 0x8E, 0x00, 0x69, 0x02, + 0x19, 0x0B, 0xBF, 0xF2, 0xC9, 0x03, 0xB6, 0xE1, 0x48, 0xFC, 0xCD, 0xEC, + 0x5D, 0xF0, 0xB7, 0xED, 0x65, 0xED, 0xB0, 0xE7, 0x8C, 0xF5, 0x91, 0xEA, + 0x0C, 0xF6, 0xED, 0xD9, 0x80, 0xED, 0xB0, 0xBF, 0x88, 0xF2, 0xA2, 0xD0, + 0x69, 0xF7, 0x34, 0xF0, 0xDB, 0xE3, 0xA0, 0xED, 0x82, 0xD5, 0xCE, 0xE5, + 0x74, 0xEB, 0x29, 0xF1, 0x95, 0x0F, 0x76, 0x01, 0x2C, 0x22, 0x80, 0x12, + 0x27, 0x21, 0x64, 0x20, 0x1D, 0x17, 0x00, 0x1A, 0x49, 0x1F, 0x40, 0x10, + 0xB8, 0x38, 0xEE, 0x18, 0xB7, 0x3A, 0xAE, 0x27, 0x19, 0x1C, 0x7E, 0x27, + 0x45, 0x07, 0xD8, 0x1D, 0xCC, 0x0D, 0xA2, 0x18, 0xCE, 0x11, 0x9E, 0x0D, + 0x6A, 0x17, 0x2D, 0x06, 0xE1, 0x21, 0xC6, 0x0A, 0x23, 0x0C, 0x6D, 0xFB, + 0xE7, 0xF6, 0x72, 0xEB, 0x63, 0x00, 0xD0, 0xF5, 0xFA, 0xFD, 0xFE, 0xFD, + 0x0A, 0xF4, 0x56, 0x02, 0x5D, 0xF5, 0x10, 0x09, 0x95, 0xF7, 0x75, 0x0B, + 0x69, 0xFD, 0x77, 0x0E, 0x9A, 0x04, 0x9C, 0x12, 0x98, 0x01, 0x7A, 0x0E, + 0xD8, 0xFB, 0x66, 0x00, 0xC7, 0xF7, 0x4B, 0xF4, 0x80, 0xE9, 0xF1, 0xF0, + 0x07, 0xDB, 0x1B, 0xF4, 0x17, 0xD8, 0x5E, 0xF6, 0x4F, 0xE5, 0x42, 0xFB, + 0xDC, 0x02, 0x27, 0x02, 0xEC, 0x13, 0x1A, 0xFF, 0xBB, 0x00, 0x8F, 0xF2, + 0x85, 0xFB, 0xDF, 0xF9, 0xB2, 0x0E, 0x2B, 0x08, 0xA5, 0x13, 0xE0, 0x0F, + 0xA4, 0x09, 0x3E, 0x15, 0xBA, 0x00, 0xB5, 0x09, 0x25, 0x0A, 0x78, 0x00, + 0x4F, 0x2B, 0x05, 0x15, 0x68, 0x3E, 0x65, 0x28, 0x1E, 0x30, 0x56, 0x26, + 0xF4, 0x1F, 0xE6, 0x21, 0x9B, 0x1D, 0x63, 0x1B, 0x93, 0x13, 0x39, 0x0A, + 0x36, 0x14, 0x18, 0x0C, 0x4F, 0x26, 0x00, 0x1C, 0x9E, 0x12, 0x61, 0x07, + 0x9D, 0xFC, 0x81, 0xFD, 0x59, 0xFD, 0xDD, 0x0F, 0xA8, 0xF9, 0xF8, 0x16, + 0xBA, 0xFC, 0x99, 0x1C, 0x41, 0x02, 0x82, 0x20, 0x86, 0xFF, 0x5F, 0x1E, + 0xEC, 0x00, 0xDA, 0x21, 0x43, 0x11, 0xAF, 0x27, 0x59, 0x12, 0xFD, 0x12, + 0x01, 0x06, 0x60, 0xF6, 0xFE, 0x09, 0x62, 0xFD, 0xB3, 0x04, 0x52, 0x0A, + 0xC8, 0xF8, 0x69, 0x0A, 0xF7, 0xF1, 0x8F, 0x04, 0x81, 0xEC, 0x60, 0xFA, + 0x33, 0x07, 0xD3, 0x05, 0x7C, 0x24, 0x3A, 0x0B, 0x9D, 0x16, 0xE6, 0xF2, + 0x7C, 0x08, 0x1C, 0xE5, 0x6F, 0x14, 0xDF, 0xE8, 0xCD, 0x21, 0x2B, 0xF6, + 0x20, 0x1A, 0xDB, 0xFF, 0x29, 0x05, 0xA9, 0xFE, 0x34, 0xF6, 0x74, 0xFD, + 0xE9, 0x00, 0x50, 0x0E, 0x04, 0x1F, 0xC0, 0x29, 0xE9, 0x24, 0xBA, 0x2E, + 0x71, 0x19, 0x85, 0x28, 0x7A, 0x13, 0xD4, 0x20, 0x33, 0x0E, 0xB1, 0x1C, + 0x4F, 0x0C, 0xC9, 0x1F, 0xE6, 0x1A, 0x27, 0x26, 0x4B, 0x1F, 0x53, 0x1E, + 0xA4, 0x17, 0x79, 0x0C, 0xE2, 0x1A, 0x69, 0x02, 0x86, 0x16, 0x6A, 0x01, + 0x49, 0x08, 0x19, 0x16, 0x2B, 0xF9, 0x73, 0x1D, 0xD6, 0xFB, 0xB3, 0x15, + 0xED, 0x0B, 0x72, 0x17, 0x37, 0x11, 0x0E, 0x0D, 0x8E, 0x06, 0x6F, 0xF3, + 0x2A, 0x00, 0x6F, 0xEC, 0x19, 0x0F, 0x9D, 0x01, 0x12, 0x1A, 0xE9, 0x0B, + 0x68, 0x0D, 0xF0, 0x06, 0x2C, 0x00, 0x0C, 0x0D, 0xA2, 0xED, 0xE3, 0x01, + 0xA0, 0xED, 0x32, 0xF9, 0x12, 0x06, 0xE7, 0x01, 0xA1, 0xF8, 0x0B, 0xF5, + 0xFB, 0xE1, 0x2A, 0xF3, 0x92, 0xE8, 0x98, 0x01, 0xAC, 0xFE, 0x75, 0x08, + 0xEE, 0x0C, 0xBD, 0x09, 0x67, 0x08, 0xFC, 0x06, 0x00, 0x01, 0x94, 0x02, + 0xD8, 0xFB, 0xC5, 0x06, 0x9C, 0x08, 0xB4, 0x19, 0x8F, 0x14, 0x94, 0x1A, + 0x44, 0x09, 0x2A, 0x09, 0xE4, 0xF2, 0xEC, 0xFF, 0xE2, 0xDA, 0x2D, 0xFB, + 0x45, 0xDF, 0x24, 0x03, 0x36, 0x05, 0x25, 0x1B, 0x24, 0x1C, 0x57, 0x1B, + 0x8A, 0x1F, 0xC7, 0x0A, 0x2F, 0x2B, 0xFA, 0x09, 0xEA, 0x2E, 0x91, 0x09, + 0x66, 0x2B, 0x4C, 0x12, 0xE9, 0x27, 0xC0, 0x17, 0xA5, 0x26, 0xEA, 0x12, + 0xA7, 0x1C, 0xAD, 0x0A, 0xF6, 0x10, 0xE0, 0x04, 0xE4, 0x10, 0xCF, 0x08, + 0xFB, 0x07, 0x9B, 0x09, 0x6E, 0x11, 0x14, 0x19, 0x36, 0x2F, 0xD4, 0x1B, + 0xA9, 0x30, 0x29, 0x04, 0x0E, 0x12, 0x60, 0xF7, 0xD3, 0xED, 0xA3, 0xF5, + 0x9D, 0xDC, 0xB0, 0xFB, 0x6C, 0xE2, 0xEA, 0x0C, 0xA8, 0xE1, 0x72, 0x0E, + 0x5C, 0xCF, 0xC7, 0xF3, 0x3E, 0xCE, 0x38, 0xE8, 0xE1, 0xE7, 0x68, 0xEE, + 0x3D, 0xFB, 0x83, 0xE7, 0x71, 0xF5, 0xDB, 0xDB, 0x95, 0xF2, 0x9D, 0xE0, + 0x4E, 0xF1, 0x2F, 0xE4, 0xEA, 0xEC, 0xA6, 0xE5, 0x4E, 0xF1, 0xD7, 0xF3, + 0xE2, 0xF2, 0xA1, 0xF4, 0x48, 0xFA, 0x5A, 0xF2, 0x70, 0xFD, 0xFA, 0xF8, + 0xE2, 0xF2, 0x16, 0xF8, 0xB6, 0xFA, 0x11, 0x0A, 0x2B, 0x0F, 0xF1, 0x23, + 0x9E, 0x10, 0x68, 0x1E, 0x60, 0x0F, 0x96, 0x0C, 0x3A, 0x11, 0x46, 0x07, + 0x34, 0x0A, 0x96, 0x06, 0x8D, 0x0D, 0x78, 0x02, 0x72, 0x1E, 0x5D, 0x05, + 0x8E, 0x21, 0x6B, 0x0B, 0xA2, 0x18, 0xE7, 0x16, 0x2D, 0x15, 0x67, 0x2D, + 0xF9, 0x08, 0xF8, 0x34, 0xD3, 0x00, 0xA6, 0x2D, 0x1F, 0x12, 0x86, 0x25, + 0x61, 0x14, 0x1D, 0x10, 0xE3, 0x09, 0xE5, 0xFF, 0xFD, 0xFA, 0x11, 0xF9, + 0x61, 0xDF, 0x4B, 0xEC, 0xEA, 0xE6, 0x10, 0xF4, 0x34, 0x01, 0xE6, 0xFF, + 0x94, 0xF7, 0x01, 0xED, 0x4B, 0xD1, 0x05, 0xCE, 0x8C, 0xD1, 0xD9, 0xCC, + 0x49, 0xFB, 0x57, 0xE5, 0x76, 0x0C, 0x4A, 0xE7, 0xAA, 0xFF, 0x1F, 0xD7, + 0x15, 0xE8, 0x69, 0xD6, 0x72, 0xD4, 0x7F, 0xE9, 0x7F, 0xDB, 0x1C, 0x0A, + 0xDC, 0xE7, 0x26, 0x0D, 0x9E, 0xF3, 0x8A, 0xFA, 0x2F, 0xFE, 0xC3, 0xF1, + 0x8D, 0xFD, 0xA7, 0xF1, 0xFB, 0xF4, 0xE5, 0xF3, 0x80, 0xFA, 0x70, 0xFE, + 0xA5, 0x11, 0xE5, 0x1A, 0x9B, 0x0B, 0x49, 0x12, 0x72, 0x06, 0xC6, 0xFF, + 0x84, 0x11, 0xBF, 0x10, 0x32, 0x0E, 0xD2, 0x1C, 0x63, 0x0E, 0x55, 0x18, + 0xBF, 0x13, 0xEB, 0x12, 0xF3, 0x06, 0x70, 0x13, 0x6E, 0x07, 0x1E, 0x1B, + 0xE2, 0x15, 0x78, 0x20, 0x53, 0x09, 0x99, 0x10, 0xF7, 0x0B, 0xCA, 0xF8, + 0xB8, 0x2A, 0x5C, 0xEE, 0x7B, 0x21, 0xA6, 0xE7, 0xE9, 0xFC, 0xCD, 0xE8, + 0x52, 0xF7, 0xBD, 0xED, 0x02, 0xFA, 0x6B, 0xED, 0xC4, 0xF6, 0x7D, 0xFA, + 0x62, 0xF2, 0x7D, 0xFD, 0x94, 0xD2, 0x61, 0xE2, 0x11, 0xBB, 0x8E, 0xD3, + 0x57, 0xD3, 0xA4, 0xD9, 0x52, 0xF5, 0x68, 0xD8, 0xA4, 0xF3, 0xFF, 0xD7, + 0x97, 0xD9, 0xA1, 0xDB, 0x1D, 0xD6, 0x49, 0xDF, 0xAE, 0xF3, 0x55, 0xFE, + 0x58, 0x10, 0xAF, 0x22, 0xDC, 0x05, 0xAA, 0x16, 0xFF, 0xEC, 0x14, 0xF4, + 0x5D, 0xE1, 0x37, 0xE0, 0x8C, 0xE4, 0xC1, 0xD8, 0x1D, 0xF4, 0x6E, 0xDE, + 0x5D, 0x04, 0x0F, 0x00, 0xEF, 0x02, 0xE6, 0x16, 0xC7, 0xF5, 0x4C, 0x06, + 0x1C, 0x07, 0xE2, 0x00, 0x71, 0x1D, 0xC2, 0x0D, 0xDE, 0x1B, 0xFE, 0x18, + 0xC9, 0x1B, 0x42, 0x22, 0x93, 0x1D, 0xDC, 0x28, 0xAD, 0x17, 0x72, 0x22, + 0x68, 0x1B, 0xBB, 0x1A, 0xDE, 0x20, 0x5C, 0x10, 0x1E, 0x1B, 0xF1, 0x07, + 0x97, 0x17, 0x05, 0x11, 0x8E, 0x15, 0x8F, 0x14, 0xBD, 0x02, 0x3A, 0x07, + 0x26, 0xF1, 0x62, 0xF7, 0xDA, 0xF6, 0x7A, 0xF2, 0x3C, 0xFA, 0x4A, 0xF6, + 0x99, 0xF2, 0x10, 0x0B, 0xB2, 0xD7, 0x31, 0x06, 0xDD, 0xCA, 0x8D, 0xE5, + 0xD5, 0xE6, 0xCD, 0xED, 0x02, 0x01, 0x97, 0x0C, 0x2E, 0x00, 0x16, 0x14, + 0x91, 0xFA, 0xEF, 0x0F, 0x51, 0xFA, 0x0C, 0x08, 0x9A, 0x09, 0xA9, 0x06, + 0xA1, 0x1F, 0xCC, 0x0E, 0x62, 0x1B, 0xB8, 0x12, 0x1B, 0x0C, 0xB7, 0x00, + 0x49, 0x08, 0x03, 0xE1, 0x19, 0x07, 0x9B, 0xD8, 0x80, 0xF2, 0xE5, 0xE1, + 0x05, 0xF6, 0x2F, 0x03, 0xE8, 0x10, 0x09, 0x1B, 0x82, 0x0B, 0x36, 0x07, + 0x10, 0x02, 0xC5, 0xEA, 0x39, 0x0A, 0x9A, 0xE2, 0x2E, 0x0D, 0xA3, 0xF4, + 0xD6, 0xFA, 0xDB, 0x01, 0xBC, 0xEC, 0xF0, 0xF7, 0xF7, 0xF2, 0x9F, 0xE4, + 0xF3, 0xFD, 0xD0, 0xE7, 0xB1, 0x0C, 0xC0, 0xFB, 0xAB, 0x03, 0xC7, 0xF9, + 0xEC, 0xED, 0x3D, 0xFB, 0x23, 0xF5, 0xA2, 0x0D, 0xC6, 0x00, 0x37, 0x00, + 0x05, 0x00, 0xCF, 0xE7, 0x9D, 0xF4, 0xB2, 0xEE, 0xE5, 0xF2, 0xAF, 0x00, + 0x72, 0x04, 0x73, 0x12, 0xA6, 0x03, 0xD2, 0x16, 0xE3, 0xE4, 0xE5, 0xF3, + 0xD2, 0xD6, 0x5F, 0xD7, 0x62, 0xEB, 0xD7, 0xF0, 0x89, 0xFD, 0x7F, 0x14, + 0xF6, 0x01, 0xBC, 0x0C, 0xBA, 0xF5, 0xFD, 0xEE, 0x34, 0xEB, 0x0F, 0xE7, + 0x0D, 0x06, 0x11, 0xF8, 0xAE, 0x1C, 0x9C, 0x07, 0x28, 0x00, 0x00, 0xFB, + 0x48, 0xE5, 0x45, 0xE6, 0xB3, 0xEF, 0x04, 0xDE, 0x3B, 0xF5, 0x19, 0xE3, + 0x6D, 0xEE, 0xE3, 0xEE, 0x5E, 0xFB, 0x59, 0xFE, 0x0E, 0x04, 0xA0, 0x0A, + 0x96, 0xEB, 0x1D, 0xFF, 0x1F, 0xE4, 0xFE, 0xF5, 0x60, 0xF8, 0xD3, 0xF3, + 0x66, 0x02, 0x53, 0xED, 0x63, 0xF9, 0x04, 0xE2, 0x49, 0xF3, 0x4B, 0xDF, + 0x13, 0xEC, 0x1B, 0xF2, 0x56, 0xE4, 0xEB, 0x07, 0xD2, 0xF7, 0xA0, 0x12, + 0x94, 0x05, 0xFC, 0xFE, 0x70, 0x05, 0xA5, 0xF1, 0x98, 0x05, 0x93, 0xF5, + 0x86, 0xFD, 0xB9, 0xE6, 0x1F, 0xF4, 0x0C, 0xDE, 0xD9, 0xE6, 0xBA, 0xE0, + 0x08, 0xE3, 0x3A, 0xED, 0xB1, 0xFA, 0xAD, 0x06, 0xC4, 0xFD, 0x78, 0xFE, + 0x31, 0xDE, 0x74, 0xD1, 0xDA, 0xE6, 0x55, 0xCC, 0xD3, 0x0B, 0x55, 0xF2, + 0xE3, 0x06, 0xB5, 0xFB, 0xA3, 0xF2, 0xD2, 0xE8, 0xB9, 0xED, 0xD0, 0xD7, + 0x52, 0xE7, 0xD6, 0xD6, 0xB2, 0xF0, 0x84, 0xF2, 0x55, 0x0A, 0x81, 0x04, + 0x02, 0x05, 0x46, 0xF5, 0x11, 0xF3, 0x78, 0xEF, 0xE1, 0xEF, 0x33, 0xF2, + 0x94, 0xEE, 0x8D, 0xE3, 0x1F, 0xEF, 0xDE, 0xE5, 0x15, 0xF5, 0x96, 0x0A, + 0x52, 0xEC, 0x7F, 0x13, 0x36, 0xD7, 0xCA, 0xF7, 0xFE, 0xDF, 0x56, 0xEB, + 0x92, 0xFA, 0x2E, 0xF2, 0xFF, 0xFA, 0x6B, 0xFB, 0xBC, 0xE5, 0x8D, 0x01, + 0xF0, 0xE8, 0x2F, 0xFC, 0x9B, 0x01, 0x69, 0xE5, 0x22, 0x17, 0x04, 0xEA, + 0x47, 0x14, 0xA8, 0xF9, 0xEA, 0x00, 0x0B, 0xF6, 0x3E, 0x03, 0x0B, 0x02, + 0xFA, 0x0C, 0x6F, 0x0C, 0x33, 0x00, 0x2F, 0xF5, 0x3D, 0xF3, 0x33, 0xDF, + 0xBC, 0xF1, 0x5F, 0xE5, 0xAE, 0xEC, 0x45, 0xEE, 0xC0, 0xF2, 0xB2, 0x01, + 0x76, 0xF1, 0x0D, 0x07, 0x64, 0xE2, 0xC5, 0xE9, 0xC0, 0xF8, 0xB3, 0xE7, + 0x96, 0x13, 0xD3, 0xFC, 0xE8, 0x04, 0x5C, 0x04, 0xDD, 0xF3, 0xED, 0xF9, + 0x5B, 0xFB, 0x78, 0xF2, 0xA2, 0x08, 0x50, 0x07, 0x0C, 0x10, 0x23, 0x2A, + 0xF3, 0x0A, 0x57, 0x36, 0x77, 0xF8, 0x94, 0x26, 0xB5, 0xFB, 0x0E, 0x1F, + 0xEF, 0x04, 0x1B, 0x12, 0xC4, 0xF9, 0xAC, 0x00, 0xDB, 0xFC, 0xC5, 0x0C, + 0x37, 0x13, 0xE6, 0x19, 0x2D, 0x19, 0xBF, 0x0D, 0xF8, 0x0E, 0x3D, 0x02, + 0x00, 0x05, 0x61, 0x0F, 0xF2, 0x06, 0x1E, 0x2B, 0x49, 0x0A, 0x38, 0x2A, + 0xAD, 0x05, 0xBF, 0x02, 0xB8, 0x0A, 0xF3, 0xE7, 0xD2, 0x15, 0xE9, 0xF4, + 0x21, 0x1B, 0xDC, 0x0C, 0x8D, 0x0A, 0xFB, 0x07, 0x9F, 0x01, 0xAE, 0xFD, + 0xF1, 0x19, 0x14, 0x0D, 0x34, 0x26, 0xC9, 0x15, 0x91, 0x0A, 0x8B, 0x09, + 0x8B, 0xE7, 0x0C, 0x06, 0xF3, 0xDC, 0xC7, 0x0A, 0x65, 0xE9, 0xA6, 0x0D, + 0x3B, 0x09, 0x70, 0x13, 0x4A, 0x0F, 0x7D, 0xFA, 0x83, 0xF1, 0xA5, 0xD8, + 0xDF, 0xF3, 0x9D, 0xF0, 0x6C, 0x08, 0x59, 0x12, 0x70, 0x01, 0x66, 0xFD, + 0x21, 0xFC, 0x9C, 0xE2, 0x55, 0x10, 0x03, 0xED, 0x97, 0x15, 0x8A, 0xFE, + 0x80, 0x0E, 0x7A, 0x0C, 0xB9, 0x0F, 0xFE, 0x15, 0xB8, 0x05, 0xAB, 0x13, + 0xC4, 0x0A, 0x38, 0x14, 0x4E, 0x1D, 0xF6, 0x0F, 0x10, 0x1B, 0xE1, 0xFF, + 0x41, 0x1F, 0x5D, 0x07, 0xD0, 0x39, 0xE9, 0x24, 0x6B, 0x38, 0x03, 0x2C, + 0x5A, 0x1B, 0x06, 0x28, 0x6F, 0x10, 0x35, 0x2C, 0xF6, 0x20, 0x6F, 0x33, + 0xC5, 0x34, 0x53, 0x2D, 0xAC, 0x36, 0x25, 0x1F, 0x1B, 0x2A, 0x5C, 0x1C, + 0x5A, 0x1F, 0xD4, 0x2B, 0xE3, 0x17, 0x73, 0x43, 0x15, 0x05, 0x41, 0x38, + 0x7D, 0x09, 0x2E, 0x23, 0xBB, 0x20, 0x75, 0x24, 0xB5, 0x11, 0x46, 0x20, + 0x8E, 0xEB, 0x2B, 0x09, 0xC2, 0xE2, 0x29, 0xFD, 0xD0, 0xEC, 0x59, 0xF8, + 0xFB, 0xF9, 0x37, 0xEF, 0xE1, 0x08, 0x1A, 0xF6, 0x7F, 0xF4, 0xE1, 0xEF, + 0x3F, 0xDF, 0xFB, 0xE6, 0x84, 0xF9, 0x48, 0xF9, 0x34, 0x12, 0x52, 0x07, + 0xA8, 0x00, 0x3C, 0xF3, 0x3B, 0xE8, 0xB1, 0xDD, 0x92, 0xEB, 0x3B, 0xEF, + 0x54, 0xF8, 0x78, 0x04, 0x58, 0x13, 0x2A, 0x03, 0xED, 0x2A, 0x3E, 0xF3, + 0x2C, 0x1B, 0x74, 0xE9, 0x69, 0x0C, 0x80, 0xF2, 0x7B, 0x0C, 0x97, 0xF5, + 0x29, 0x01, 0x20, 0xF0, 0x49, 0xFF, 0x77, 0xF8, 0xAD, 0x0E, 0x4B, 0x03, + 0xF3, 0xFD, 0xA5, 0xF8, 0x0C, 0xE0, 0xA9, 0xF3, 0x1A, 0xEE, 0x3F, 0x03, + 0xE3, 0x09, 0x4F, 0x0B, 0x9C, 0x09, 0x7F, 0xFD, 0x7E, 0xF3, 0x05, 0xE9, + 0x78, 0xE8, 0x1C, 0xEA, 0xF9, 0xF2, 0xD0, 0x04, 0x40, 0xF3, 0xE2, 0x15, + 0x72, 0xDC, 0x27, 0x02, 0x4B, 0xDE, 0x1A, 0xF9, 0x97, 0xF8, 0xCE, 0x08, + 0xA5, 0xF1, 0x54, 0xFC, 0x12, 0xE2, 0x13, 0xDF, 0x0B, 0xE9, 0xA5, 0xDF, + 0x71, 0xE7, 0x52, 0xE4, 0xCE, 0xEA, 0x55, 0xE3, 0xAF, 0xF0, 0x1B, 0xE5, + 0x25, 0xD0, 0x1A, 0xC7, 0x45, 0xB7, 0x2E, 0xB4, 0x79, 0xCE, 0xA7, 0xDC, + 0x36, 0xDB, 0xD9, 0xFE, 0x1F, 0xCB, 0x42, 0xE8, 0xAB, 0xCF, 0xD9, 0xD3, + 0xA8, 0xEC, 0x06, 0xE6, 0x97, 0xFF, 0x9B, 0xF7, 0x51, 0xFE, 0x80, 0xFE, + 0x52, 0xEE, 0x3A, 0xFD, 0x92, 0xDB, 0x2B, 0xEF, 0xE5, 0xE2, 0xE4, 0xDF, + 0x0A, 0xFD, 0x6F, 0xDC, 0xD3, 0x07, 0xEE, 0xE4, 0x2D, 0x04, 0xE1, 0xF2, + 0x6F, 0x08, 0xF9, 0x03, 0x9B, 0x00, 0xA5, 0x01, 0x1E, 0xEF, 0xC8, 0xFC, + 0x0E, 0xF2, 0x1C, 0x08, 0xF5, 0xFE, 0x7B, 0x0C, 0x21, 0x05, 0xA0, 0xFD, + 0xC9, 0xFB, 0x1D, 0xE6, 0x28, 0xFA, 0x04, 0xE5, 0x09, 0x04, 0x46, 0xEF, + 0x2C, 0x03, 0xF0, 0xF2, 0x21, 0xFA, 0xE8, 0xF8, 0xBC, 0xFF, 0x59, 0x0C, + 0xE9, 0x12, 0xAB, 0x1F, 0x02, 0x14, 0x88, 0x1A, 0x30, 0x04, 0x83, 0x07, + 0x91, 0xF0, 0x9B, 0x03, 0x99, 0xE0, 0xA2, 0x0B, 0x76, 0xF0, 0xE8, 0x12, + 0xF3, 0x04, 0xBE, 0x0E, 0x45, 0xE6, 0xF0, 0xE7, 0x45, 0xD2, 0x36, 0xDA, + 0xD3, 0xF6, 0x1A, 0x08, 0xF2, 0x0A, 0xCC, 0x21, 0x50, 0xF9, 0xAE, 0x05, + 0x76, 0xEF, 0xF7, 0xEC, 0x73, 0xFE, 0x4B, 0x03, 0x85, 0x02, 0x8A, 0x1D, + 0xDD, 0xF2, 0xC1, 0x22, 0x67, 0xEC, 0x56, 0x19, 0x3F, 0xF5, 0x07, 0x0D, + 0x74, 0x0C, 0x64, 0x14, 0x00, 0x26, 0x4C, 0x21, 0xF9, 0x2F, 0xCB, 0x21, + 0x35, 0x34, 0x98, 0x28, 0x4A, 0x38, 0xBF, 0x32, 0x9E, 0x28, 0x78, 0x28, + 0xB8, 0x0B, 0xB2, 0x25, 0xFE, 0x00, 0xFB, 0x2E, 0x28, 0x1D, 0x3C, 0x30, + 0x6F, 0x3D, 0xC3, 0x1A, 0x95, 0x3B, 0xBE, 0xF4, 0xCF, 0x38, 0xD4, 0xF2, + 0xBE, 0x3D, 0x4C, 0x14, 0xAE, 0x34, 0xB2, 0x27, 0x3E, 0x2E, 0x62, 0x23, + 0x35, 0x3E, 0x00, 0x2C, 0xA0, 0x3F, 0x90, 0x31, 0x46, 0x29, 0xC4, 0x23, + 0xC1, 0x25, 0x98, 0x1E, 0x95, 0x1F, 0x89, 0x15, 0xF4, 0x06, 0xA5, 0xFC, + 0xBA, 0x18, 0xB6, 0xFC, 0x08, 0x32, 0x5C, 0x04, 0x70, 0x0E, 0xE3, 0xE0, + 0xF8, 0xF8, 0x15, 0xD7, 0x7C, 0x19, 0x4B, 0x0D, 0x14, 0x1C, 0x87, 0x2D, + 0x5C, 0xF6, 0x74, 0x12, 0xC5, 0xEE, 0x84, 0xF8, 0x58, 0xFF, 0xB3, 0x06, + 0x32, 0xFE, 0x82, 0x18, 0x86, 0xFB, 0xB3, 0x22, 0xE1, 0x05, 0x6F, 0x27, + 0x21, 0x04, 0x02, 0x1F, 0xF1, 0xFC, 0xEE, 0x1C, 0x2D, 0x0E, 0x49, 0x20, + 0x75, 0x1D, 0x0D, 0x1C, 0xD2, 0x11, 0xB0, 0x1B, 0xC2, 0x0A, 0xB0, 0x23, + 0xAD, 0x07, 0xFD, 0x17, 0xB4, 0x03, 0x99, 0x01, 0xAB, 0x0E, 0x6C, 0x02, + 0xA2, 0x2A, 0x68, 0x1D, 0x06, 0x28, 0xBA, 0x27, 0xA8, 0x07, 0xCC, 0x14, + 0xE6, 0x17, 0xAF, 0x15, 0xAC, 0x35, 0x92, 0x23, 0x63, 0x24, 0x40, 0x19, + 0x67, 0x11, 0xEF, 0x0E, 0x74, 0x26, 0xD9, 0x26, 0x0D, 0x2F, 0xF6, 0x2B, + 0x7B, 0x17, 0xC2, 0x15, 0x02, 0x0C, 0xC5, 0x12, 0x20, 0x09, 0xC1, 0x0A, + 0x7B, 0x02, 0x50, 0xEF, 0x61, 0x15, 0xDB, 0xE9, 0x75, 0x18, 0x1E, 0xEB, + 0x5C, 0xD8, 0x26, 0xC2, 0xF3, 0xBA, 0x10, 0xB6, 0xC4, 0xDE, 0x9C, 0xE3, + 0xA4, 0xD8, 0xEA, 0xE9, 0xCF, 0xB7, 0xC0, 0xCA, 0x0D, 0xC9, 0xEA, 0xCA, + 0x31, 0xF6, 0xFB, 0xEE, 0xA3, 0x05, 0x32, 0x04, 0x6C, 0xFC, 0x98, 0x04, + 0x7C, 0xF8, 0xC3, 0x0B, 0x64, 0xEA, 0x95, 0x03, 0xF4, 0xE3, 0x2B, 0xF6, + 0xD8, 0xF0, 0x35, 0xFB, 0xF9, 0xEA, 0x62, 0xF7, 0x72, 0xED, 0xE7, 0xE6, + 0x70, 0x10, 0x10, 0xE7, 0xDF, 0x17, 0xE0, 0xED, 0x1C, 0xF8, 0x14, 0xEC, + 0x39, 0xF4, 0xE8, 0xFB, 0x81, 0x17, 0x6F, 0x20, 0x8A, 0x17, 0x97, 0x26, + 0xD9, 0xFC, 0x6D, 0x0E, 0xF0, 0x06, 0xE3, 0x0B, 0xB3, 0x0C, 0xE1, 0x19, + 0x95, 0x01, 0xCC, 0x18, 0x99, 0xF5, 0xD8, 0x06, 0x54, 0xF8, 0x97, 0x08, + 0x6A, 0x04, 0xE5, 0x0C, 0x7A, 0xF8, 0xBA, 0xFC, 0x1B, 0xE7, 0x99, 0xF7, + 0xF7, 0xDD, 0xB5, 0xFD, 0x65, 0xD9, 0x2E, 0xF5, 0x10, 0xF1, 0xA6, 0xF1, + 0x35, 0x0B, 0xD2, 0xF4, 0x2E, 0xE0, 0x61, 0xC7, 0x58, 0xAC, 0x76, 0xA5, + 0x14, 0xC4, 0x5E, 0xC8, 0x17, 0xDD, 0xF6, 0xD4, 0xE4, 0xC5, 0xEF, 0xB5, + 0xD2, 0xC7, 0x35, 0xB1, 0xE6, 0xEB, 0x7F, 0xCB, 0x34, 0xFA, 0x1F, 0xDC, + 0x2E, 0xF5, 0x49, 0xE0, 0xF4, 0xE8, 0x47, 0xDF, 0x46, 0xD9, 0x57, 0xD2, + 0x1F, 0xD8, 0xBE, 0xC9, 0x87, 0xEC, 0x99, 0xC9, 0x33, 0xFE, 0x6A, 0xC7, + 0x2E, 0xFD, 0xBD, 0xD0, 0xE2, 0x02, 0x1B, 0xF9, 0x8D, 0xFA, 0xEA, 0x15, + 0x2F, 0xD9, 0xEF, 0x07, 0x44, 0xDB, 0x34, 0x06, 0xEF, 0x02, 0x9F, 0x1A, + 0xB3, 0x0C, 0xE2, 0x1B, 0x57, 0xF2, 0xBE, 0x0B, 0x8F, 0xF6, 0xF7, 0x0C, + 0x24, 0x0D, 0x75, 0x1C, 0x78, 0x08, 0xC6, 0x19, 0xEB, 0xF6, 0x73, 0x0A, + 0x29, 0xF5, 0x6E, 0x12, 0x37, 0xF4, 0x0F, 0x28, 0x7A, 0xE8, 0xCE, 0x22, + 0x95, 0xEE, 0x51, 0x0B, 0x4B, 0xF8, 0x76, 0xF6, 0x9F, 0xF6, 0xB8, 0xE8, + 0xA4, 0x05, 0xF5, 0xEC, 0x78, 0x18, 0x8F, 0xF4, 0xAF, 0xEF, 0xF9, 0xD5, + 0x7F, 0xC2, 0xF8, 0xBD, 0xA5, 0xE7, 0x97, 0xE5, 0xD5, 0x07, 0xBB, 0xF9, + 0x09, 0xE8, 0x65, 0xD3, 0x4B, 0xCC, 0x28, 0xBF, 0x7C, 0xDD, 0x87, 0xDE, + 0xBB, 0xF7, 0xE5, 0xFF, 0xDE, 0xF7, 0x14, 0xF4, 0x2C, 0xEF, 0x8F, 0xDA, + 0x52, 0xEA, 0xD0, 0xC9, 0x74, 0xF3, 0x21, 0xC0, 0xC7, 0x0C, 0x9A, 0xD2, + 0x18, 0x17, 0xBF, 0xEE, 0xCB, 0x01, 0x29, 0xF1, 0x46, 0xFE, 0x70, 0xF8, + 0xD6, 0x0E, 0x67, 0x0D, 0x83, 0x03, 0x6E, 0x05, 0x92, 0xF3, 0x9E, 0xFC, + 0x5D, 0xFC, 0x8C, 0x12, 0xF8, 0x12, 0x89, 0x1F, 0x65, 0x19, 0xBF, 0x0B, + 0x18, 0x1F, 0x96, 0xFC, 0x87, 0x1D, 0x5F, 0x05, 0x3F, 0x17, 0x08, 0x18, + 0x69, 0x1D, 0xCC, 0x22, 0x7E, 0x20, 0x13, 0x29, 0x7A, 0x25, 0x48, 0x32, + 0x50, 0x1E, 0x87, 0x2A, 0xD4, 0x19, 0x2E, 0x1E, 0x49, 0x1A, 0xAD, 0x19, + 0x7C, 0x0C, 0xEB, 0x0E, 0x29, 0x09, 0x7C, 0x0F, 0x97, 0x16, 0xD0, 0x27, + 0xE0, 0x0B, 0x89, 0x23, 0x47, 0xE8, 0x22, 0x03, 0xEB, 0xE3, 0x62, 0x13, + 0x72, 0xFC, 0x61, 0x38, 0x14, 0x03, 0x32, 0x2D, 0xB5, 0xFD, 0xFB, 0x0C, + 0xE0, 0x04, 0x08, 0x0B, 0x86, 0x0C, 0x2D, 0x1F, 0x24, 0x0E, 0xC1, 0x26, + 0x52, 0x14, 0x82, 0x24, 0xFF, 0x16, 0xC2, 0x1B, 0x97, 0x07, 0xEF, 0x03, + 0x9D, 0xFD, 0x35, 0xF8, 0x11, 0x12, 0xF6, 0x03, 0x44, 0x1D, 0x90, 0xFE, + 0xC5, 0x18, 0x92, 0xEE, 0x55, 0x1E, 0x9F, 0xF3, 0xFA, 0x13, 0xA1, 0xF5, + 0x7F, 0x04, 0x91, 0xF3, 0xC9, 0x08, 0x9E, 0xFC, 0x72, 0x17, 0xB3, 0x09, + 0x7E, 0x0E, 0xCE, 0x0B, 0x3A, 0xFE, 0xCC, 0xFC, 0xD8, 0x08, 0xAD, 0xF0, + 0x16, 0x0E, 0xE7, 0xEB, 0xE5, 0x0B, 0xBD, 0xE7, 0xC0, 0x07, 0x23, 0xE1, + 0x2A, 0x05, 0x6E, 0xEC, 0x56, 0xF8, 0x2F, 0x06, 0x17, 0xDF, 0x4E, 0x07, + 0x4E, 0xDD, 0x2A, 0xFE, 0x77, 0xF3, 0x48, 0x02, 0xB4, 0x04, 0xB4, 0x03, + 0xE2, 0x0A, 0x74, 0x15, 0x5E, 0x01, 0x45, 0x24, 0xB5, 0xD7, 0x9A, 0xF8, + 0xF5, 0xC9, 0x8A, 0xD9, 0xC0, 0xF0, 0x1B, 0xF2, 0x02, 0xFB, 0xA3, 0xFD, + 0xD5, 0xD0, 0x36, 0xDF, 0x1C, 0xBB, 0xEE, 0xC8, 0x60, 0xDC, 0xD2, 0xE2, + 0x94, 0xF2, 0x94, 0xF3, 0xC5, 0xE8, 0x62, 0xE9, 0x2C, 0xE1, 0xBB, 0xE6, + 0xDA, 0xD9, 0xF9, 0xDC, 0x26, 0xD4, 0xBB, 0xCF, 0x0B, 0xE4, 0x0B, 0xD7, + 0x83, 0xEB, 0x0D, 0xDA, 0x0E, 0xDF, 0x64, 0xCA, 0xA2, 0xE0, 0xD4, 0xD2, + 0x8A, 0xE5, 0x95, 0xEF, 0xC8, 0xE1, 0xE7, 0xF6, 0x08, 0xE6, 0x62, 0xF1, + 0xB6, 0xFF, 0xBF, 0xFF, 0x4E, 0x07, 0x01, 0x0A, 0xCE, 0xF4, 0xE1, 0xF9, + 0xB1, 0xF9, 0xAE, 0xF9, 0xEE, 0x0B, 0x7E, 0x02, 0xF1, 0x1A, 0x68, 0x02, + 0x13, 0x0D, 0x61, 0xF8, 0xC6, 0xF4, 0x48, 0xF6, 0x26, 0xFC, 0x9E, 0x0A, + 0x25, 0x04, 0x7A, 0x02, 0x3A, 0x03, 0x1C, 0xF4, 0x6E, 0x07, 0x67, 0x03, + 0x11, 0x0D, 0x35, 0x04, 0xCD, 0x19, 0x45, 0x07, 0x88, 0x2F, 0x13, 0x19, + 0x2D, 0x1A, 0xA3, 0x02, 0x3C, 0xED, 0x03, 0xE5, 0x79, 0xFB, 0x81, 0xFE, + 0x52, 0x12, 0x24, 0x1F, 0x38, 0xFA, 0x04, 0x0F, 0x76, 0xE0, 0x4F, 0xF4, + 0xBD, 0xEF, 0xCA, 0x00, 0x04, 0x07, 0xCD, 0x1B, 0xA6, 0x05, 0xD4, 0x20, + 0x32, 0x08, 0x01, 0x15, 0xDC, 0x09, 0x3B, 0x04, 0x78, 0xFB, 0xC2, 0xFA, + 0xB4, 0xF7, 0xE2, 0x0B, 0x98, 0xFC, 0xD0, 0x23, 0xEF, 0xF9, 0xE1, 0x21, + 0xD5, 0x05, 0xFE, 0x1F, 0xC7, 0x14, 0x59, 0x23, 0xF4, 0x17, 0x01, 0x16, + 0xA8, 0x15, 0x91, 0x11, 0x93, 0x14, 0xD5, 0x21, 0xBE, 0x1E, 0x52, 0x2B, + 0x42, 0x19, 0x8C, 0x1A, 0x02, 0x17, 0x92, 0x12, 0x8C, 0x24, 0xB7, 0x1B, + 0x25, 0x2D, 0x28, 0x22, 0x7B, 0x22, 0xD5, 0x21, 0x4E, 0x15, 0x92, 0x1D, + 0xCF, 0x2B, 0x2B, 0x21, 0xE1, 0x36, 0x16, 0x13, 0x5C, 0x2E, 0x6B, 0xFB, + 0x48, 0x38, 0x4A, 0xFB, 0xB8, 0x3A, 0xB5, 0xFE, 0xB2, 0x2F, 0x94, 0x05, + 0xC5, 0x37, 0x9D, 0x1D, 0x40, 0x2B, 0x9B, 0x13, 0x4C, 0xFB, 0xED, 0xEA, + 0x8B, 0xF6, 0x74, 0xEC, 0x1C, 0x17, 0x6B, 0x0A, 0x37, 0x18, 0x9D, 0x14, + 0xDE, 0xF6, 0xF5, 0x04, 0xF8, 0xF2, 0x89, 0x04, 0x60, 0x19, 0xFD, 0x21, + 0xD2, 0x2C, 0xB9, 0x2A, 0x6E, 0x21, 0x45, 0x22, 0xC6, 0x0C, 0xC6, 0x2B, + 0x39, 0xFB, 0x32, 0x32, 0x46, 0xFF, 0x33, 0x29, 0x77, 0x10, 0x50, 0x28, + 0xE3, 0x0F, 0xDB, 0x1F, 0x41, 0x0C, 0x0A, 0x17, 0x9E, 0x13, 0xEE, 0x20, + 0xFE, 0x07, 0x6F, 0x1A, 0xC4, 0xFE, 0xBD, 0x10, 0xCA, 0x0C, 0xE5, 0x18, + 0xA2, 0x26, 0x36, 0x22, 0x98, 0x2C, 0x32, 0x18, 0xE5, 0x1A, 0x43, 0x0B, + 0x81, 0x15, 0xC1, 0x10, 0xD7, 0x1C, 0x32, 0x1C, 0xFC, 0x1B, 0x5B, 0x21, + 0xC6, 0x04, 0x8F, 0x0D, 0x0C, 0xFD, 0xF5, 0x02, 0xDE, 0x02, 0x7E, 0x0A, + 0xC0, 0x01, 0x83, 0xFD, 0x56, 0x0C, 0xEE, 0xF6, 0x67, 0x0B, 0xEC, 0xFA, + 0xB6, 0xF5, 0xBA, 0xFA, 0x34, 0xFC, 0xCE, 0x0D, 0xC8, 0x10, 0x67, 0x17, + 0xA7, 0xF1, 0xC5, 0xEA, 0x13, 0xD9, 0x0F, 0xCA, 0x12, 0xFA, 0x68, 0xE0, + 0x2A, 0x06, 0xD3, 0xE7, 0x82, 0xE4, 0x0B, 0xC8, 0x9C, 0xCB, 0x49, 0xBA, + 0x67, 0xD1, 0x55, 0xD6, 0x7F, 0xDD, 0x1B, 0xF8, 0xE9, 0xE5, 0x77, 0x01, + 0x26, 0xEF, 0x42, 0xF9, 0x61, 0xEF, 0x07, 0xEF, 0xE1, 0xF3, 0x93, 0xE9, + 0x41, 0x05, 0xCC, 0xF3, 0xA5, 0x01, 0x75, 0xF9, 0x0D, 0xEF, 0x21, 0xF0, + 0x85, 0xF3, 0x4F, 0xFC, 0x86, 0xFC, 0x48, 0x0C, 0x27, 0xFD, 0x99, 0x0C, + 0x0C, 0xF5, 0x63, 0x07, 0xF2, 0xF0, 0x8C, 0x06, 0x62, 0xF3, 0x64, 0x04, + 0x30, 0xF2, 0x3F, 0xF0, 0x51, 0x00, 0x55, 0xE8, 0x84, 0x00, 0xA8, 0xEE, + 0xE7, 0xEA, 0x28, 0xFA, 0xF6, 0xD7, 0x44, 0xFC, 0x2F, 0xDA, 0x20, 0xFD, + 0x4A, 0xE7, 0x15, 0x0A, 0x15, 0xDF, 0xEE, 0xFF, 0xBB, 0xD3, 0x00, 0xEF, + 0x90, 0xD2, 0xB8, 0xE9, 0x08, 0xD1, 0xBE, 0xDD, 0x69, 0xDD, 0x43, 0xDD, + 0x0E, 0xF4, 0xA7, 0xED, 0x4A, 0xEB, 0xBC, 0xD6, 0x5D, 0xDC, 0xA4, 0xAC, + 0xE0, 0xF1, 0x3E, 0xB9, 0x52, 0xFE, 0x2F, 0xDA, 0xAA, 0xDB, 0xE5, 0xD8, + 0x93, 0xC1, 0x17, 0xD1, 0x5E, 0xDF, 0x01, 0xE1, 0xF8, 0x00, 0xEB, 0xEE, + 0xE0, 0x09, 0xF3, 0xED, 0x4E, 0x0C, 0x59, 0xEB, 0x42, 0x05, 0x42, 0xF1, + 0xE2, 0xFF, 0x1B, 0xF2, 0x05, 0x0C, 0x63, 0xED, 0xCE, 0x1A, 0x3E, 0xEA, + 0xA8, 0x15, 0xF3, 0xE4, 0xDB, 0x0E, 0x74, 0xF4, 0x23, 0x07, 0x60, 0x04, + 0x32, 0xF8, 0x3E, 0x06, 0xA3, 0xF4, 0x86, 0x05, 0xE9, 0xFB, 0x87, 0x08, + 0x7B, 0x08, 0x8F, 0x13, 0xEE, 0x07, 0x75, 0x11, 0xF9, 0xF5, 0x1D, 0x12, + 0x73, 0xEB, 0x77, 0x1D, 0x05, 0xF5, 0x6E, 0x2C, 0x82, 0xF6, 0x45, 0x26, + 0x7E, 0xF2, 0xC2, 0x10, 0x3C, 0xFD, 0x87, 0x0E, 0xD6, 0xFB, 0xF0, 0x06, + 0x3C, 0xE7, 0x89, 0xFB, 0x55, 0xDD, 0xD4, 0xF7, 0xB6, 0xE5, 0x12, 0xEB, + 0x7F, 0xF2, 0x29, 0xE1, 0x8B, 0x06, 0x60, 0xEF, 0x5C, 0x07, 0xD3, 0xEF, + 0xA9, 0xE7, 0x50, 0xD9, 0x09, 0xE6, 0x04, 0xE8, 0x1D, 0xFC, 0x2A, 0x07, + 0x6F, 0xF2, 0xFF, 0xFF, 0x89, 0xD1, 0x84, 0xE5, 0xC1, 0xD8, 0xBB, 0xE8, + 0x1D, 0x05, 0xA0, 0x04, 0x93, 0x11, 0xF9, 0x12, 0x16, 0x0B, 0xE0, 0x12, + 0xD0, 0x09, 0xE0, 0x0F, 0xDC, 0x0C, 0x78, 0x04, 0x29, 0x1D, 0xA5, 0x00, + 0x28, 0x2D, 0x40, 0x12, 0xA9, 0x2B, 0x39, 0x15, 0xD4, 0x26, 0x73, 0x0D, + 0x19, 0x26, 0xEE, 0x15, 0xED, 0x1C, 0x1B, 0x18, 0x9C, 0x13, 0xC8, 0x0A, + 0x1D, 0x15, 0x4E, 0x09, 0x31, 0x1D, 0x2E, 0x21, 0xC6, 0x22, 0xFE, 0x2B, + 0x30, 0x22, 0x19, 0x27, 0x60, 0x2B, 0x5A, 0x27, 0xC0, 0x38, 0xE6, 0x25, + 0xCF, 0x2D, 0x51, 0x1E, 0xB6, 0x13, 0xB7, 0x13, 0xA6, 0x15, 0xBE, 0x17, + 0x98, 0x21, 0x0A, 0x16, 0x59, 0x14, 0xD1, 0x05, 0x80, 0x05, 0xBA, 0x06, + 0x15, 0xF9, 0x23, 0x0B, 0x81, 0xF8, 0xA5, 0x0D, 0xD2, 0x0F, 0x9A, 0x1E, + 0x0C, 0x16, 0x0F, 0x21, 0x41, 0xF6, 0xED, 0x02, 0x02, 0xEE, 0x4F, 0xF8, + 0x91, 0x10, 0x08, 0x12, 0xD5, 0x17, 0x5E, 0x1B, 0xAD, 0xF2, 0x08, 0x0B, + 0xFE, 0xDC, 0xAE, 0x08, 0xB8, 0xF5, 0xB3, 0x1D, 0xCF, 0x12, 0xAB, 0x2B, + 0x67, 0x0F, 0xA1, 0x1F, 0x3B, 0xFF, 0x9C, 0x13, 0x45, 0xFF, 0x18, 0x0F, + 0x57, 0x14, 0x03, 0x01, 0x50, 0x2C, 0x38, 0x07, 0x4A, 0x2D, 0x9D, 0x17, + 0x79, 0x1F, 0x67, 0x1A, 0xF4, 0x1B, 0xB3, 0x24, 0xEF, 0x19, 0x91, 0x2E, + 0xC8, 0x11, 0x0E, 0x1F, 0x12, 0x12, 0x7D, 0x08, 0x4D, 0x26, 0x58, 0x0F, + 0xA4, 0x35, 0xC3, 0x12, 0xB8, 0x1E, 0xAD, 0x04, 0xC3, 0x06, 0xB4, 0x08, + 0x79, 0x0C, 0x17, 0x0F, 0xAE, 0x1C, 0xB7, 0x04, 0x06, 0x1A, 0x73, 0xEE, + 0x8D, 0x09, 0xA2, 0xE7, 0x1D, 0xFE, 0x44, 0xF2, 0xDC, 0xF5, 0xF6, 0xEE, + 0xCD, 0xF5, 0x7E, 0xEB, 0x5B, 0xED, 0x9E, 0xEF, 0xF7, 0xDE, 0x8A, 0xE9, + 0x73, 0xEC, 0x38, 0xE8, 0x77, 0x01, 0xEF, 0xFA, 0x41, 0xE1, 0xF9, 0xEC, + 0x61, 0xB7, 0x38, 0xCA, 0xD2, 0xCB, 0xA4, 0xDF, 0x1F, 0xEB, 0xCC, 0x02, + 0x17, 0xDB, 0x0F, 0xF0, 0x55, 0xBD, 0x33, 0xD2, 0x89, 0xC6, 0x66, 0xE1, + 0x03, 0xE3, 0x17, 0xF6, 0x82, 0xEC, 0x10, 0xE2, 0xC6, 0xE7, 0xF9, 0xCA, + 0x17, 0xE2, 0xB1, 0xCA, 0x16, 0xE8, 0x57, 0xD1, 0x6B, 0x00, 0x53, 0xE5, + 0x19, 0x07, 0x23, 0xF3, 0x5F, 0xF0, 0x4F, 0xE9, 0x7C, 0xE1, 0xC1, 0xEE, + 0x92, 0xE5, 0xCC, 0x07, 0x83, 0xEA, 0xCC, 0x08, 0xCF, 0xF2, 0x1F, 0xF6, + 0x17, 0x0E, 0x60, 0xFA, 0x2F, 0x1C, 0x7B, 0x01, 0x66, 0x07, 0x0A, 0xFB, + 0xA0, 0x00, 0x4D, 0x0E, 0xA3, 0x03, 0xB8, 0x1A, 0x6F, 0xFD, 0xE0, 0x10, + 0x5B, 0xFC, 0x5C, 0x0A, 0x1B, 0x05, 0xBE, 0x04, 0xD5, 0x0C, 0x56, 0xFE, + 0xDB, 0x0A, 0x17, 0xED, 0xCC, 0x08, 0xCF, 0xDB, 0x4C, 0xF5, 0x1D, 0xD0, + 0x9E, 0xE1, 0x27, 0xCB, 0x84, 0xE9, 0x82, 0xD2, 0x4F, 0xFB, 0x7D, 0xEB, + 0xF1, 0xF0, 0xFD, 0xF0, 0x9F, 0xD0, 0x64, 0xD0, 0xDD, 0xD5, 0x6E, 0xD7, + 0xBE, 0xF4, 0xB8, 0x00, 0x2F, 0xF4, 0x39, 0xFD, 0x5F, 0xD8, 0x90, 0xDA, + 0xAB, 0xD3, 0x5B, 0xDD, 0xF4, 0xEC, 0xB5, 0xFF, 0xFD, 0xFE, 0xED, 0x0E, + 0xEE, 0x05, 0xAA, 0x0B, 0x94, 0x0C, 0x5A, 0x07, 0xEE, 0x0E, 0x37, 0x00, + 0x54, 0x1A, 0xC8, 0x08, 0x13, 0x27, 0xA2, 0x21, 0x87, 0x13, 0x6A, 0x25, + 0x98, 0xFD, 0xD4, 0x22, 0xA3, 0xFC, 0xDF, 0x30, 0x3C, 0xFC, 0x71, 0x2F, + 0x6F, 0x03, 0x03, 0x1D, 0xCD, 0x19, 0xD7, 0x20, 0x05, 0x30, 0x4F, 0x32, + 0x5B, 0x26, 0xBB, 0x2C, 0xFB, 0x1B, 0xE6, 0x2A, 0x19, 0x1F, 0x55, 0x35, + 0x56, 0x13, 0x32, 0x30, 0x62, 0x13, 0x74, 0x29, 0x65, 0x1D, 0xE2, 0x25, + 0x98, 0x1D, 0xD8, 0x22, 0x62, 0x15, 0xA5, 0x19, 0x54, 0x15, 0x77, 0x0A, + 0x85, 0x1B, 0x31, 0xFE, 0x42, 0x13, 0xDF, 0xF2, 0x45, 0x09, 0x20, 0xEF, + 0xD7, 0x0B, 0x25, 0x08, 0x38, 0x0B, 0x66, 0x16, 0x62, 0xF8, 0x3B, 0xE5, + 0x84, 0xF8, 0xCF, 0xC7, 0xCD, 0x1A, 0xBA, 0xE8, 0xA6, 0x24, 0x1C, 0xF5, + 0x67, 0xFF, 0x74, 0xDE, 0x98, 0xE7, 0xAA, 0xDD, 0x2E, 0xFD, 0xB9, 0xF6, + 0x5D, 0x12, 0xCB, 0x00, 0xBA, 0x13, 0x8C, 0xFB, 0x7A, 0x12, 0xC6, 0xFC, + 0x00, 0x09, 0x30, 0xF8, 0xC3, 0x01, 0x86, 0xF8, 0xED, 0x0D, 0x67, 0x0E, + 0x08, 0x11, 0x1F, 0x16, 0x9A, 0x07, 0xFE, 0x0C, 0xDE, 0x0B, 0x85, 0x16, + 0xE0, 0x0B, 0x8E, 0x21, 0x73, 0x06, 0x53, 0x1B, 0xBE, 0x0A, 0xBD, 0x1E, + 0x46, 0x0C, 0x90, 0x33, 0xE8, 0xFE, 0xDE, 0x2D, 0x37, 0xF3, 0xDA, 0x15, + 0x5F, 0x08, 0x9A, 0x16, 0xDF, 0x20, 0x84, 0x1A, 0x13, 0x27, 0x35, 0x23, + 0x81, 0x1D, 0xE7, 0x27, 0x1F, 0x14, 0x7B, 0x22, 0xC0, 0x13, 0x86, 0x21, + 0xD0, 0x06, 0xF1, 0x1A, 0x01, 0xFC, 0xFE, 0x12, 0x75, 0xFC, 0xB3, 0x04, + 0xDE, 0xF8, 0xC5, 0xEE, 0x34, 0xF8, 0x20, 0xEB, 0x51, 0xFE, 0xA6, 0xF5, + 0x59, 0xEB, 0xC6, 0xD7, 0xF0, 0xD9, 0x4D, 0xB8, 0xE0, 0xF7, 0x90, 0xDB, + 0x0F, 0x0B, 0x42, 0xFE, 0xE0, 0xED, 0x9D, 0xEB, 0xE0, 0xD6, 0x1D, 0xD2, + 0xED, 0xEB, 0x5E, 0xDA, 0x30, 0xFA, 0x8E, 0xE9, 0x84, 0xE4, 0x42, 0xE7, + 0x86, 0xD5, 0xB1, 0xE1, 0x8D, 0xDC, 0x53, 0xDE, 0x13, 0xEE, 0xAC, 0xD8, + 0x88, 0x03, 0xA8, 0xDA, 0xEE, 0x04, 0xBA, 0xE6, 0xDC, 0xF2, 0x39, 0xE9, + 0x70, 0xF5, 0xC0, 0xED, 0xF1, 0x02, 0x23, 0xF8, 0x91, 0xFB, 0x20, 0xF1, + 0x00, 0xEF, 0x6E, 0xEE, 0x84, 0xF7, 0x4D, 0x01, 0x7E, 0x04, 0x71, 0x0C, + 0x76, 0xF8, 0xB5, 0x00, 0x0F, 0xF9, 0xE6, 0x06, 0xFB, 0x0B, 0x90, 0x18, + 0x98, 0x11, 0x08, 0x17, 0x73, 0x06, 0xD9, 0x0A, 0x8D, 0xFD, 0xCE, 0xFF, + 0x51, 0x07, 0xE5, 0x03, 0x6C, 0x0E, 0x4D, 0x08, 0x29, 0x07, 0x8B, 0xF9, + 0x55, 0xF2, 0xD5, 0xE7, 0x75, 0xDD, 0x33, 0xE2, 0xE1, 0xD8, 0x79, 0xE5, + 0x8F, 0xE0, 0x9E, 0xFE, 0x27, 0xCF, 0x5D, 0x03, 0x94, 0xAE, 0xAB, 0xDD, + 0x78, 0xC5, 0xC6, 0xD8, 0x12, 0xF7, 0xC5, 0xED, 0x34, 0xF7, 0x1F, 0xED, + 0x5A, 0xCF, 0x82, 0xE6, 0x5C, 0xC5, 0xA9, 0xF2, 0x81, 0xE4, 0xA1, 0x00, + 0x2F, 0xF4, 0x95, 0xF1, 0x98, 0xF0, 0x8F, 0xE3, 0x6E, 0xEA, 0x8E, 0xDF, + 0xAA, 0xE5, 0x3C, 0xDB, 0x5A, 0xF5, 0x16, 0xEA, 0x05, 0x0B, 0x35, 0xF2, + 0xAC, 0x0C, 0x1B, 0xE1, 0xB8, 0x08, 0xFD, 0xD7, 0x10, 0x06, 0x2F, 0xE2, + 0x23, 0xF8, 0x8B, 0xE2, 0xB9, 0xED, 0x70, 0xDC, 0x8F, 0xFB, 0xE6, 0xED, + 0xB0, 0x1A, 0xB8, 0x05, 0xAF, 0x1D, 0xBB, 0x02, 0x90, 0x0B, 0x02, 0x04, + 0x5B, 0x07, 0xD0, 0x1A, 0x39, 0x04, 0x9B, 0x2D, 0xEE, 0x00, 0x15, 0x33, + 0xBC, 0x05, 0x4D, 0x22, 0xE3, 0x1B, 0x11, 0x18, 0xD2, 0x26, 0xEB, 0x1A, + 0xAD, 0x1B, 0x62, 0x18, 0x08, 0x11, 0x21, 0x1E, 0x4F, 0xFE, 0x62, 0x24, + 0x1E, 0xEA, 0x9A, 0x20, 0x56, 0xE9, 0x3F, 0x22, 0x7D, 0xF0, 0x03, 0x19, + 0x50, 0xE4, 0x06, 0xED, 0xE9, 0xEB, 0xEC, 0xDA, 0x94, 0x12, 0x0A, 0xFB, + 0x15, 0x16, 0x05, 0x0B, 0x0A, 0xEF, 0x9A, 0xF8, 0x83, 0xD9, 0xD8, 0xEA, + 0xF8, 0xED, 0xE9, 0xED, 0x66, 0xF9, 0xF4, 0xF1, 0x40, 0xEF, 0x45, 0xF3, + 0x06, 0xEB, 0xB0, 0xEB, 0x38, 0xE8, 0x13, 0xE2, 0x03, 0xF3, 0xBB, 0xE4, + 0xED, 0x0C, 0x8B, 0xEF, 0x81, 0x0B, 0xDC, 0xEF, 0x12, 0xF8, 0x65, 0xF5, + 0xCF, 0xFE, 0x6A, 0x14, 0xD6, 0x08, 0x93, 0x1B, 0xA9, 0x07, 0xEE, 0x09, + 0x4C, 0x13, 0x5A, 0x0A, 0xA3, 0x22, 0x59, 0x1C, 0x25, 0x13, 0x32, 0x21, + 0x7A, 0x01, 0xD6, 0x12, 0x77, 0x1A, 0x21, 0x12, 0x34, 0x2C, 0x8C, 0x12, + 0xAB, 0x24, 0xC0, 0x12, 0xCC, 0x1D, 0x15, 0x14, 0x2C, 0x23, 0x0D, 0x14, + 0xF4, 0x2F, 0x9A, 0x19, 0x27, 0x33, 0x56, 0x13, 0x5E, 0x29, 0x7D, 0x0B, + 0x6F, 0x18, 0xBC, 0x12, 0x78, 0x10, 0x1C, 0x17, 0x45, 0x14, 0x61, 0x15, + 0x58, 0x17, 0x82, 0x0F, 0x13, 0x06, 0x66, 0xED, 0x4A, 0xFA, 0xEB, 0xDF, + 0xFC, 0x12, 0xF6, 0x0A, 0x90, 0x1F, 0xBE, 0x26, 0xA1, 0xFE, 0x35, 0x11, + 0xF3, 0xE1, 0x63, 0xF9, 0x6A, 0xF5, 0xE3, 0x0E, 0x55, 0x0B, 0x8B, 0x2B, + 0x15, 0x06, 0x51, 0x25, 0x45, 0x00, 0x96, 0x0D, 0x30, 0xFD, 0x18, 0xFD, + 0x5A, 0xFE, 0xB6, 0x08, 0xA8, 0x0A, 0xB4, 0x1F, 0xB1, 0x0D, 0xA1, 0x24, + 0xF8, 0x05, 0xBC, 0x1D, 0x15, 0x10, 0xC6, 0x25, 0x3F, 0x14, 0xB3, 0x31, + 0xE4, 0x02, 0x26, 0x2D, 0x4F, 0x05, 0x5A, 0x28, 0x9F, 0x1C, 0xAD, 0x24, + 0x1A, 0x25, 0xE1, 0x13, 0x07, 0x1B, 0x16, 0xFB, 0xE8, 0x1E, 0x02, 0xFE, + 0x61, 0x24, 0x44, 0x0E, 0xFC, 0x1F, 0xDD, 0x10, 0x46, 0x1A, 0x84, 0x05, + 0x29, 0x1E, 0x2F, 0xF3, 0x48, 0x2E, 0xC7, 0xED, 0x64, 0x22, 0x3A, 0xE6, + 0x2C, 0x04, 0xB8, 0xE0, 0x3C, 0xF9, 0x77, 0xE2, 0x42, 0xFC, 0x77, 0xDC, + 0x49, 0xFE, 0x1A, 0xDC, 0xF3, 0x01, 0x0F, 0xEA, 0x97, 0xE7, 0x29, 0xE1, + 0xB2, 0xBF, 0xFE, 0xC6, 0xBA, 0xD2, 0xD6, 0xDC, 0xDE, 0xEA, 0x09, 0x01, + 0x3C, 0xD3, 0xE0, 0xF7, 0x1F, 0xBF, 0x4E, 0xE5, 0x8B, 0xD4, 0x5A, 0xF1, + 0x5D, 0xEA, 0xBF, 0xFF, 0x56, 0xE5, 0x4C, 0xF6, 0x08, 0xE0, 0x3F, 0xE7, + 0x11, 0xDB, 0x9D, 0xE5, 0x54, 0xE0, 0x6F, 0xF0, 0xE3, 0xF2, 0xA2, 0xF6, + 0x76, 0xFB, 0x96, 0xED, 0x80, 0xF4, 0x37, 0xE3, 0x9C, 0xEE, 0x8E, 0xF1, + 0xB2, 0xEA, 0x7F, 0xFF, 0x64, 0xD7, 0xF7, 0xF2, 0x46, 0xCA, 0xE7, 0xE4, + 0xEF, 0xDC, 0x71, 0xE5, 0x99, 0xF9, 0xCE, 0xF5, 0x0C, 0xF5, 0x6A, 0xF6, + 0x3E, 0xED, 0x0E, 0xF2, 0xF5, 0xFA, 0xB0, 0xFA, 0xB2, 0xFF, 0xB2, 0xF6, + 0x35, 0xFD, 0x9E, 0xE9, 0x6B, 0xFC, 0xDD, 0xE0, 0x4E, 0x01, 0xC9, 0xEC, + 0x64, 0xFD, 0x83, 0xF7, 0x0D, 0xF5, 0x61, 0xF6, 0x1C, 0xED, 0x34, 0xF6, + 0xCF, 0xDD, 0x9A, 0xEE, 0x74, 0xDA, 0xC4, 0xE9, 0x2A, 0xE6, 0x8A, 0xF0, + 0x5D, 0xDF, 0x93, 0xDF, 0x04, 0xC3, 0x61, 0xB3, 0x99, 0xD3, 0x8C, 0xB9, + 0x92, 0x05, 0xFA, 0xF2, 0x16, 0x06, 0x45, 0x06, 0x75, 0xDF, 0x6B, 0xDE, + 0xC8, 0xE3, 0xF0, 0xCC, 0xC3, 0x12, 0xC4, 0xF0, 0xE4, 0x1C, 0x51, 0x07, + 0x75, 0x04, 0xE2, 0x05, 0x13, 0xFA, 0xFC, 0x04, 0xA6, 0x00, 0x1E, 0xFC, + 0x9B, 0x12, 0xB5, 0xF8, 0x91, 0x1E, 0xA2, 0x0B, 0x61, 0x0F, 0x96, 0x16, + 0x34, 0xFC, 0x00, 0x0D, 0x73, 0x07, 0x32, 0x14, 0x97, 0x0D, 0x40, 0x22, + 0x82, 0xF7, 0x90, 0x1E, 0xC7, 0xF5, 0x92, 0x1F, 0x9D, 0x12, 0xBB, 0x34, + 0xE4, 0x16, 0x21, 0x37, 0x17, 0x05, 0x6E, 0x22, 0x65, 0x0B, 0x37, 0x24, + 0xA6, 0x18, 0xC4, 0x2A, 0x8A, 0x1B, 0xE4, 0x25, 0xBD, 0x14, 0x06, 0x1E, + 0xEA, 0x0F, 0xD9, 0x22, 0xF5, 0x0F, 0xB1, 0x32, 0xCE, 0x09, 0xC6, 0x39, + 0xB2, 0x0A, 0x3B, 0x37, 0xC2, 0x07, 0x0B, 0x1C, 0x5A, 0x04, 0x83, 0xFB, + 0xCF, 0x1D, 0xA6, 0xF8, 0x9A, 0x2B, 0x58, 0xFC, 0x5D, 0x08, 0x36, 0xDF, + 0x2F, 0xF9, 0x2B, 0xD1, 0x9C, 0x1C, 0xE1, 0xFE, 0xB6, 0x35, 0xBB, 0x1B, + 0x5D, 0x26, 0x04, 0x02, 0xD0, 0x16, 0x9F, 0xF4, 0x5E, 0x29, 0x1E, 0x11, + 0x63, 0x35, 0xA6, 0x1E, 0xB6, 0x2E, 0x01, 0x0F, 0x40, 0x2C, 0xF0, 0x05, + 0x99, 0x20, 0x03, 0xF6, 0x97, 0x17, 0x7C, 0xEE, 0xD6, 0x26, 0x89, 0x08, + 0x43, 0x29, 0xBC, 0x19, 0xB9, 0x09, 0x7D, 0x11, 0x61, 0x04, 0xA0, 0x16, + 0x38, 0x18, 0xDE, 0x27, 0xF0, 0x0D, 0x7A, 0x20, 0xA0, 0x05, 0xB1, 0x15, + 0xFE, 0x19, 0x4C, 0x2B, 0x1B, 0x1F, 0xAD, 0x3C, 0xB4, 0x0C, 0x53, 0x2E, + 0x1E, 0x09, 0x1A, 0x25, 0xA2, 0x07, 0xB6, 0x25, 0xDC, 0x0C, 0x8A, 0x27, + 0xF0, 0x1B, 0xC8, 0x1E, 0x89, 0x20, 0x7C, 0x12, 0xAD, 0x20, 0x98, 0x13, + 0x2D, 0x18, 0x9D, 0x13, 0x2A, 0x0D, 0x4B, 0x13, 0xE4, 0xFE, 0x5A, 0x01, + 0xEC, 0xEE, 0x1D, 0xE9, 0xB4, 0xF4, 0x2F, 0xF6, 0xBA, 0x09, 0xF4, 0x0E, + 0xE7, 0xF9, 0xAB, 0xF6, 0xE8, 0xD4, 0xF4, 0xCC, 0xC1, 0xE5, 0xB7, 0xE7, + 0x5D, 0x09, 0x70, 0x1A, 0x53, 0x02, 0x26, 0x0D, 0xFE, 0xEC, 0x5C, 0xEA, + 0xFE, 0xF4, 0x5C, 0xF9, 0xA9, 0x00, 0x1A, 0x15, 0x57, 0xFF, 0x25, 0x11, + 0x05, 0x0A, 0x97, 0x07, 0xB1, 0x02, 0x48, 0xFD, 0x2E, 0xE8, 0xDC, 0xEA, + 0xE3, 0xF1, 0x9F, 0xF1, 0xF4, 0x03, 0xCE, 0x01, 0xBC, 0xF0, 0x7B, 0xEE, + 0xEA, 0xE4, 0x69, 0xE4, 0xAE, 0xF6, 0xC7, 0xFC, 0x1F, 0x03, 0x01, 0xFD, + 0x99, 0x06, 0x37, 0xE1, 0xEB, 0x12, 0xF5, 0xE6, 0x90, 0x1D, 0x90, 0x06, + 0x1F, 0x07, 0x66, 0x07, 0xEA, 0xF4, 0x7A, 0x07, 0x44, 0xFE, 0x5A, 0x11, + 0xE3, 0x03, 0x6B, 0x09, 0x18, 0x03, 0x78, 0xF5, 0x31, 0x01, 0x26, 0xE1, + 0x7E, 0x03, 0x11, 0xE3, 0x34, 0xF6, 0x78, 0xEB, 0x71, 0xE7, 0x75, 0xF4, + 0xEA, 0xEB, 0xE7, 0xF7, 0x35, 0xEF, 0x1D, 0xE6, 0x30, 0xF7, 0x62, 0xDE, + 0x44, 0x02, 0x28, 0xF8, 0xA0, 0xEB, 0x04, 0xFF, 0x8E, 0xBF, 0x34, 0xD5, + 0x49, 0xBE, 0xAA, 0xCA, 0xA3, 0xDE, 0x4A, 0xF0, 0x08, 0xDE, 0x81, 0xFA, + 0x11, 0xC5, 0x5F, 0xE2, 0xDF, 0xCD, 0xA0, 0xEB, 0xD6, 0xE5, 0x43, 0x08, + 0xDE, 0xED, 0x48, 0x04, 0x49, 0xF9, 0x84, 0xFF, 0xC9, 0xFD, 0xB1, 0xF5, + 0x01, 0xE9, 0xD2, 0xD9, 0x95, 0xDA, 0xD4, 0xDE, 0x99, 0xE9, 0xD7, 0xFB, + 0x42, 0xEF, 0x5E, 0xF8, 0x75, 0xEE, 0xFE, 0xE9, 0xC2, 0xFE, 0x5A, 0xF1, + 0x68, 0xFE, 0xA7, 0xEE, 0xC3, 0xF5, 0xDB, 0xDF, 0x2C, 0x08, 0x33, 0xEC, + 0x60, 0x1E, 0xE4, 0x05, 0x17, 0x10, 0xBD, 0xF7, 0x6E, 0x05, 0x5F, 0xE3, + 0xD7, 0x14, 0x18, 0xED, 0x16, 0x14, 0xDC, 0xF3, 0x8D, 0x03, 0x28, 0xF4, + 0x64, 0xEB, 0x14, 0xF7, 0x8C, 0xE1, 0xF4, 0x07, 0x3C, 0xE8, 0x72, 0x13, + 0xF4, 0xED, 0xB0, 0x0D, 0x52, 0xF9, 0xB8, 0x04, 0xAF, 0x04, 0x0A, 0xF8, + 0x36, 0x07, 0xD6, 0xFA, 0xF7, 0x07, 0xC3, 0x0C, 0xCD, 0xF4, 0x13, 0x06, + 0x6F, 0xC2, 0xE6, 0xD7, 0x3A, 0xB9, 0x77, 0xC4, 0xC7, 0xE2, 0xB6, 0xEB, + 0x51, 0xEE, 0x90, 0x03, 0x5B, 0xD2, 0xE9, 0xEF, 0x80, 0xD1, 0x8D, 0xEF, + 0x6B, 0xF5, 0x7E, 0x04, 0xB9, 0x05, 0x1D, 0xFE, 0x95, 0x02, 0x82, 0xF6, + 0xC3, 0xF8, 0x2E, 0xFE, 0x42, 0xEC, 0x41, 0xF8, 0x28, 0xF9, 0x93, 0xF4, + 0x6A, 0x0E, 0xC5, 0x03, 0xFE, 0x03, 0xB0, 0x05, 0x2A, 0xF9, 0x8C, 0x03, + 0xDD, 0x10, 0x72, 0x16, 0x2F, 0x21, 0x30, 0x17, 0x59, 0x16, 0xFE, 0xFC, + 0x98, 0x19, 0x17, 0x00, 0x39, 0x33, 0xE8, 0x21, 0xC2, 0x2B, 0x28, 0x22, + 0x33, 0x10, 0x63, 0x15, 0x01, 0x17, 0x88, 0x1F, 0xE7, 0x1D, 0x4E, 0x18, + 0xB6, 0x19, 0x62, 0x09, 0x78, 0x11, 0xF9, 0x03, 0x94, 0x0D, 0x81, 0x04, + 0x29, 0x14, 0x75, 0x03, 0x33, 0x12, 0xB5, 0xFB, 0x12, 0x0F, 0x1D, 0xFC, + 0x60, 0x01, 0x59, 0xF5, 0x68, 0xF5, 0x33, 0xE5, 0x7F, 0x01, 0xE4, 0xED, + 0x90, 0x07, 0x73, 0x01, 0x40, 0xF0, 0xD1, 0xE7, 0xD7, 0xE2, 0x08, 0xC9, + 0xD4, 0x02, 0xA8, 0xE4, 0x08, 0x1A, 0xA6, 0x03, 0x2A, 0x00, 0x52, 0xF6, + 0x01, 0xE5, 0x26, 0xEC, 0xE6, 0xEF, 0x9F, 0x08, 0x0A, 0x05, 0x1A, 0x1D, + 0x62, 0x0D, 0x18, 0x1E, 0x4D, 0x10, 0x64, 0x22, 0xC7, 0x10, 0x97, 0x1B, + 0xCF, 0x0E, 0x1E, 0x19, 0x44, 0x15, 0x7B, 0x2E, 0x90, 0x16, 0x7D, 0x32, + 0x26, 0x0A, 0x99, 0x21, 0x1F, 0x17, 0xE6, 0x22, 0x74, 0x2D, 0x0E, 0x21, + 0x77, 0x1E, 0xFB, 0x13, 0xC6, 0x0A, 0xF6, 0x23, 0x6B, 0x14, 0xC4, 0x49, + 0xAC, 0x1B, 0x83, 0x51, 0xE8, 0x15, 0xB4, 0x35, 0x1B, 0x20, 0xEE, 0x27, + 0x38, 0x20, 0xC1, 0x22, 0xB4, 0x16, 0xE1, 0x13, 0x90, 0x16, 0x2D, 0x01, + 0x6D, 0x11, 0xF5, 0xF4, 0x89, 0x19, 0xA1, 0xFE, 0xA0, 0x16, 0x06, 0x0A, + 0x7F, 0xFF, 0x11, 0x0D, 0xCB, 0xF3, 0xE6, 0xFC, 0x5B, 0xF3, 0xB0, 0xE3, + 0x89, 0x01, 0xD9, 0xE1, 0xDD, 0x0B, 0xC4, 0xE9, 0x10, 0xF7, 0x6D, 0xDA, + 0x33, 0xDA, 0x65, 0xB1, 0xC5, 0xDC, 0x35, 0xAA, 0x3B, 0xEB, 0x4E, 0xCE, + 0xCB, 0xD8, 0x9D, 0xE1, 0xC8, 0xB6, 0xA4, 0xDB, 0xD6, 0xBF, 0x0A, 0xDD, + 0xEF, 0xE3, 0x0F, 0xE5, 0x1F, 0xF1, 0x10, 0xE6, 0x63, 0xF2, 0xA8, 0xE7, + 0x31, 0xEB, 0xB9, 0xE9, 0xB7, 0xD7, 0x86, 0xEA, 0x9D, 0xD2, 0x8B, 0xF2, + 0xA1, 0xD9, 0x02, 0xF1, 0x93, 0xDA, 0xCD, 0xE0, 0x7A, 0xE2, 0xA5, 0xE5, + 0x3A, 0xEE, 0xAD, 0xFC, 0x5B, 0xEB, 0x43, 0xFC, 0x30, 0xEA, 0xFC, 0xF2, + 0x65, 0xF8, 0x91, 0x02, 0xE9, 0xFD, 0xA3, 0x12, 0x34, 0xEE, 0x09, 0x07, + 0x1B, 0xE9, 0xCB, 0xF6, 0x09, 0xEA, 0xB9, 0xEF, 0xFC, 0xE6, 0xC8, 0xE8, + 0x3F, 0xF1, 0xF4, 0xED, 0x4C, 0xED, 0xFD, 0xF0, 0x44, 0xEB, 0x42, 0xF1, + 0xF1, 0xF4, 0x3D, 0xF6, 0x96, 0xF2, 0xE0, 0xEC, 0xBE, 0xEE, 0xFD, 0xE0, + 0xD7, 0xEB, 0x27, 0xDD, 0xED, 0xED, 0x4C, 0xE2, 0x5F, 0xF1, 0x19, 0xEC, + 0xC5, 0xEB, 0xA1, 0xDB, 0x3F, 0xD4, 0x71, 0xB0, 0x99, 0xC1, 0x3C, 0xAA, + 0xF9, 0xCF, 0x07, 0xD7, 0xE8, 0xD8, 0x15, 0xF1, 0x26, 0xC9, 0x1A, 0xD8, + 0x49, 0xCD, 0xA8, 0xC4, 0x5C, 0xEF, 0x66, 0xD6, 0x3F, 0x05, 0x22, 0xE5, + 0x49, 0x07, 0x97, 0xE7, 0xD4, 0x06, 0x41, 0xE8, 0x6A, 0xF7, 0xE3, 0xE4, + 0xB0, 0xE6, 0x82, 0xF0, 0xE2, 0xF2, 0xFC, 0x07, 0x1C, 0x05, 0x54, 0x0E, + 0x80, 0x0F, 0x14, 0x11, 0x6B, 0x1C, 0x78, 0x1D, 0xAF, 0x20, 0xEE, 0x1E, + 0xE0, 0x1E, 0xFA, 0x19, 0x42, 0x22, 0xDF, 0x22, 0xD1, 0x21, 0x62, 0x2C, + 0x6D, 0x16, 0xC1, 0x29, 0x9A, 0x0F, 0x1F, 0x2A, 0xF9, 0x17, 0x4F, 0x33, + 0x01, 0x1B, 0x33, 0x37, 0x4C, 0x21, 0xDC, 0x38, 0x9D, 0x1E, 0xF4, 0x28, + 0xDB, 0x20, 0x8B, 0x0F, 0xBC, 0x38, 0xD5, 0x0F, 0x22, 0x30, 0x78, 0x1A, + 0xF4, 0x12, 0xB6, 0x1D, 0xEB, 0xFE, 0xF3, 0x19, 0x9A, 0xF9, 0x83, 0x1E, + 0xEA, 0x08, 0xB2, 0x2B, 0x3F, 0x13, 0x2A, 0x28, 0xA7, 0x03, 0xCD, 0x05, + 0xA8, 0xF0, 0x57, 0xE8, 0x4F, 0xFC, 0xDC, 0xFE, 0x44, 0x0B, 0xDC, 0x19, + 0x4C, 0xFC, 0xCF, 0x03, 0xA6, 0xF4, 0xBE, 0xE9, 0x4C, 0x11, 0xAF, 0xFA, + 0x2C, 0x25, 0xD6, 0x0E, 0x98, 0x26, 0x04, 0x11, 0x00, 0x32, 0x2F, 0x13, + 0x25, 0x33, 0xD7, 0x0C, 0xC9, 0x26, 0xD5, 0x09, 0x33, 0x24, 0x32, 0x0F, + 0x26, 0x27, 0xB8, 0x07, 0x83, 0x2A, 0xE0, 0x01, 0xBE, 0x2D, 0x26, 0x0F, + 0xF9, 0x24, 0x55, 0x11, 0xEC, 0x0D, 0x81, 0x04, 0x0A, 0x0B, 0x73, 0x12, + 0xD8, 0x26, 0x28, 0x2B, 0xAB, 0x3C, 0xBB, 0x35, 0x07, 0x34, 0xC5, 0x39, + 0xB2, 0x24, 0x52, 0x3F, 0x56, 0x1F, 0x5B, 0x39, 0x17, 0x2A, 0xA0, 0x2F, + 0xD5, 0x2B, 0xD5, 0x2A, 0x07, 0x0D, 0x2C, 0x1A, 0x47, 0x04, 0x02, 0x25, + 0xB2, 0x0A, 0x65, 0x32, 0x39, 0xFD, 0x76, 0x1D, 0x81, 0xEF, 0xC8, 0x0E, + 0x38, 0xF2, 0x30, 0x0F, 0xCF, 0x03, 0x29, 0x19, 0x87, 0x16, 0xBD, 0x1F, + 0xFA, 0x0E, 0x6E, 0x09, 0x2D, 0xE7, 0x7C, 0xE0, 0xB6, 0xDD, 0xF1, 0xDB, + 0xA0, 0xF5, 0xDC, 0xFD, 0xB4, 0xED, 0x32, 0xFD, 0xED, 0xD4, 0xD9, 0xD8, + 0x29, 0xE2, 0x90, 0xD4, 0xAB, 0xFA, 0x69, 0xE9, 0x6B, 0xFB, 0xC7, 0xF6, + 0xC1, 0x01, 0xD4, 0xFD, 0xDF, 0x0A, 0x7C, 0xF8, 0xAF, 0x03, 0x51, 0xF3, + 0x06, 0x0B, 0x78, 0xFC, 0x0A, 0x1A, 0x09, 0xFF, 0xFD, 0x08, 0x06, 0xF9, + 0xD1, 0xF1, 0x82, 0xFD, 0xE0, 0xED, 0xC5, 0xFB, 0x98, 0xEB, 0x72, 0xEB, + 0x82, 0xEE, 0xE5, 0xF4, 0xFF, 0xFC, 0xBE, 0x0A, 0xED, 0x09, 0xE0, 0x06, + 0x50, 0x03, 0x3B, 0xF5, 0xD7, 0xFC, 0xE3, 0xEF, 0x86, 0xFB, 0xE1, 0xFF, + 0x1E, 0xF9, 0x69, 0x18, 0x9C, 0x03, 0x0F, 0x22, 0x35, 0x00, 0xA5, 0x03, + 0x31, 0xFF, 0x9D, 0xF4, 0xA7, 0x03, 0x2C, 0x09, 0xC9, 0xF5, 0xEC, 0x08, + 0x89, 0xE8, 0xC6, 0xF5, 0xE6, 0xE3, 0x90, 0xE2, 0xCA, 0xED, 0x6E, 0xD3, + 0xE3, 0xFF, 0xB1, 0xD2, 0x96, 0xFC, 0x7D, 0xD1, 0xE6, 0xDD, 0x27, 0xBE, + 0x67, 0xCD, 0x41, 0xC2, 0xA8, 0xDE, 0xC0, 0xEE, 0xA0, 0xE9, 0xE5, 0x00, + 0xB8, 0xD5, 0x5F, 0xE0, 0xE2, 0xCA, 0x36, 0xD5, 0xFE, 0xD5, 0x72, 0xF1, + 0xAD, 0xD8, 0x08, 0x03, 0x02, 0xE0, 0xE6, 0x03, 0xC9, 0xEA, 0xC3, 0xFC, + 0x7C, 0xEB, 0x2C, 0xF6, 0xA8, 0xEC, 0x42, 0xF5, 0x0D, 0xEF, 0xDD, 0xF6, + 0xDA, 0xEA, 0x5D, 0xF6, 0x01, 0xE9, 0xF1, 0xF9, 0x46, 0xFA, 0xE7, 0xFC, + 0x59, 0x02, 0x87, 0xEC, 0x3C, 0xFA, 0x02, 0xE9, 0xDF, 0xFE, 0xFE, 0xF8, + 0xEB, 0x08, 0x32, 0x00, 0x5E, 0x01, 0xD3, 0xFD, 0x58, 0xF3, 0x10, 0xF4, + 0x1E, 0xF6, 0x96, 0xF4, 0xAC, 0x03, 0x2D, 0xFB, 0x95, 0x1F, 0xB7, 0xFB, + 0x00, 0x2B, 0x4E, 0xE4, 0x43, 0x22, 0x7D, 0xD9, 0xE1, 0x19, 0x40, 0xF6, + 0xB6, 0x02, 0x0C, 0x01, 0xC6, 0xF3, 0x10, 0xF6, 0x4A, 0xF9, 0x9B, 0xE5, + 0xC4, 0xF7, 0x37, 0xDD, 0x49, 0xF7, 0x3F, 0xF2, 0xB9, 0x08, 0xD4, 0x0C, + 0x09, 0xFE, 0xF6, 0xFF, 0xA1, 0xD4, 0x4A, 0xE1, 0xD3, 0xD0, 0x34, 0xF7, + 0xDA, 0xE5, 0x5E, 0x23, 0xC9, 0xD5, 0xCF, 0x1B, 0x62, 0xC5, 0xC2, 0x06, + 0x72, 0xE0, 0x75, 0x0D, 0xCD, 0xFA, 0x0D, 0x10, 0xEF, 0x0B, 0x8A, 0x11, + 0xAB, 0x15, 0xF3, 0x16, 0xFF, 0x04, 0x27, 0x1A, 0x68, 0xF4, 0xA2, 0x17, + 0x7F, 0xF8, 0xB7, 0x03, 0xDA, 0x02, 0x77, 0xF3, 0xE6, 0x05, 0x05, 0xFC, + 0x9F, 0x05, 0xA5, 0x0A, 0x36, 0x01, 0x6C, 0xFC, 0x2E, 0x00, 0x4B, 0xEB, + 0x31, 0x0F, 0xD2, 0xFF, 0x46, 0x1A, 0x62, 0x12, 0xCE, 0x17, 0x69, 0x13, + 0xE1, 0x14, 0x43, 0x0D, 0x43, 0x1F, 0x26, 0x08, 0xA0, 0x28, 0x14, 0x0B, + 0xD4, 0x2E, 0xE9, 0x11, 0x3D, 0x28, 0xE8, 0x0A, 0x8F, 0x15, 0xAD, 0xF9, + 0xD3, 0x0E, 0xDC, 0x01, 0x52, 0xFF, 0x7B, 0x0B, 0x72, 0xF3, 0x3F, 0x06, + 0x64, 0xFD, 0xD3, 0x01, 0xB2, 0x04, 0x22, 0xF4, 0x09, 0x04, 0x24, 0xEA, + 0x32, 0x0E, 0x4F, 0xFB, 0x38, 0x0E, 0xF5, 0x03, 0xF9, 0xF0, 0xFD, 0xF0, + 0x87, 0xF0, 0x7A, 0xF8, 0x92, 0x16, 0x85, 0x13, 0x6D, 0x1A, 0x5F, 0x01, + 0x56, 0x03, 0x06, 0xDF, 0xE2, 0x07, 0x14, 0xEB, 0xCB, 0x0C, 0xB5, 0x08, + 0x82, 0x09, 0xDD, 0x13, 0xD2, 0x11, 0x24, 0x0E, 0xA2, 0x17, 0x51, 0x06, + 0x45, 0x15, 0x42, 0x08, 0x26, 0x0C, 0x42, 0x0A, 0x80, 0x0B, 0x8D, 0x0E, + 0x15, 0x13, 0xD7, 0x22, 0xAE, 0x17, 0xBF, 0x38, 0x8F, 0x13, 0x88, 0x2E, + 0xCC, 0x04, 0xDD, 0x17, 0x88, 0x0A, 0x0B, 0x23, 0xEB, 0x1A, 0xA7, 0x30, + 0x3D, 0x19, 0x4A, 0x29, 0x55, 0x08, 0xA2, 0x21, 0xB4, 0xFE, 0x18, 0x29, + 0xA9, 0x08, 0xD7, 0x33, 0x70, 0x1C, 0x54, 0x37, 0xD7, 0x25, 0xB3, 0x32, + 0x26, 0x16, 0x02, 0x19, 0x87, 0x14, 0x79, 0x14, 0x6C, 0x1C, 0xDE, 0x1C, + 0x51, 0x13, 0x93, 0x13, 0xD9, 0x0C, 0xC8, 0x06, 0x2F, 0x0B, 0x67, 0xF1, + 0x95, 0x06, 0x81, 0xDF, 0x3E, 0x0A, 0x9B, 0xEB, 0xB9, 0x03, 0x37, 0xF7, + 0x11, 0xE4, 0x8E, 0xD8, 0x15, 0xE3, 0x1A, 0xC1, 0x45, 0x0B, 0x92, 0xD5, + 0x74, 0x16, 0xC1, 0xDE, 0x1D, 0xF0, 0xE9, 0xC9, 0xBC, 0xDD, 0x58, 0xCF, + 0x3C, 0xE8, 0x72, 0xE4, 0xE2, 0xE3, 0x89, 0xE0, 0xD6, 0xE4, 0x3F, 0xDE, + 0x78, 0xEB, 0x1B, 0xED, 0x08, 0xE9, 0x63, 0xF7, 0x18, 0xE1, 0x3C, 0xF6, + 0x61, 0xD6, 0x90, 0xF6, 0x43, 0xD9, 0x14, 0xFF, 0xA8, 0xEA, 0xD3, 0x0A, + 0x54, 0xED, 0xDB, 0x04, 0x84, 0xD5, 0xA2, 0xE9, 0x7F, 0xD3, 0xD4, 0xE6, + 0x72, 0xF1, 0x33, 0xF3, 0x84, 0x05, 0xF0, 0xF6, 0x87, 0xFA, 0x2D, 0xF9, + 0xF6, 0xE7, 0x4E, 0xF7, 0x4B, 0xEF, 0x23, 0xFC, 0x95, 0xF8, 0x10, 0xF7, + 0x72, 0xFE, 0xA8, 0xF3, 0x4E, 0xF6, 0x2E, 0xE9, 0x91, 0xEC, 0xB4, 0xE2, + 0x08, 0xF0, 0x57, 0xEA, 0xFE, 0xEA, 0x2D, 0xD7, 0xE1, 0xE8, 0x66, 0xC9, + 0xC5, 0xE6, 0xD1, 0xCB, 0xD9, 0xDB, 0xD6, 0xC9, 0xDD, 0xDA, 0x5F, 0xD6, + 0x55, 0xE9, 0xFF, 0xDF, 0xFE, 0xDD, 0x39, 0xD0, 0xB2, 0xC7, 0x84, 0xD0, + 0x9B, 0xD7, 0x5F, 0xEF, 0x36, 0xE6, 0x8D, 0xFC, 0x03, 0xD0, 0x07, 0xE5, + 0x12, 0xC6, 0x94, 0xDA, 0xC8, 0xE0, 0xC8, 0xEF, 0x2E, 0xF2, 0xA5, 0xF7, + 0x14, 0xF8, 0x53, 0xF3, 0x43, 0xFD, 0xFD, 0xF8, 0x79, 0xFD, 0x3D, 0x03, + 0x5D, 0x02, 0x29, 0x03, 0x69, 0xFF, 0xAD, 0xF3, 0x6B, 0xF3, 0xBD, 0xF1, + 0x57, 0xFE, 0x06, 0x08, 0xDC, 0x11, 0x47, 0x0B, 0xC3, 0x03, 0xF4, 0xF1, + 0xB9, 0xFB, 0xB3, 0xF6, 0x8A, 0x0D, 0x7E, 0x16, 0x10, 0x1B, 0x53, 0x1B, + 0x14, 0x29, 0xC0, 0x0B, 0xA7, 0x1F, 0xD2, 0xFA, 0x0A, 0x0B, 0x86, 0xF7, + 0xEA, 0x01, 0x61, 0x00, 0x94, 0x0B, 0x64, 0x11, 0x2E, 0x0F, 0xC5, 0x0A, + 0x1E, 0xFB, 0x0D, 0x02, 0xD9, 0xF5, 0x06, 0x18, 0x66, 0xF1, 0x4D, 0x10, + 0x08, 0xF0, 0xF9, 0xFB, 0xE6, 0xF0, 0x63, 0xF1, 0x32, 0xE5, 0xF7, 0xE7, + 0x0A, 0xE5, 0x15, 0xF7, 0xF7, 0xF1, 0x5B, 0x14, 0xCF, 0xED, 0xBB, 0x14, + 0x95, 0xDF, 0x77, 0xFC, 0xD2, 0xEE, 0x5B, 0x03, 0x99, 0x0E, 0x83, 0x1D, + 0x59, 0x0C, 0x08, 0x16, 0xD8, 0xFA, 0xD1, 0x03, 0x08, 0x05, 0x1B, 0x06, + 0xFC, 0x11, 0x76, 0x09, 0x29, 0x22, 0xC5, 0x07, 0x78, 0x33, 0xB5, 0x04, + 0xA0, 0x28, 0xC9, 0x06, 0x1D, 0x1C, 0x01, 0x0D, 0xF8, 0x1B, 0x17, 0x06, + 0x25, 0x21, 0xEA, 0xFA, 0x06, 0x37, 0x0D, 0x08, 0x1B, 0x42, 0x82, 0x22, + 0xBA, 0x2F, 0xA9, 0x28, 0x8D, 0x1D, 0x10, 0x19, 0xEB, 0x24, 0x1A, 0x1C, + 0x72, 0x2B, 0x68, 0x2C, 0x09, 0x27, 0x21, 0x2D, 0x09, 0x20, 0x89, 0x1A, + 0x65, 0x23, 0x58, 0x18, 0x08, 0x30, 0xBE, 0x29, 0xB7, 0x38, 0x18, 0x33, + 0xBA, 0x39, 0x4D, 0x35, 0x3B, 0x29, 0x16, 0x2D, 0x95, 0x23, 0x80, 0x33, + 0x9D, 0x17, 0x42, 0x32, 0xC0, 0x05, 0xB5, 0x1F, 0x90, 0x07, 0x3D, 0x13, + 0x8D, 0x03, 0xC2, 0x04, 0xA3, 0xF0, 0x27, 0x00, 0xA4, 0xF1, 0x5C, 0x11, + 0xEE, 0xFC, 0x22, 0x16, 0x06, 0xF1, 0xFF, 0x00, 0x21, 0xF6, 0x46, 0x02, + 0xFB, 0x15, 0x7C, 0x1F, 0x6F, 0x17, 0x86, 0x20, 0x3E, 0xFF, 0x51, 0x03, + 0x46, 0x05, 0x69, 0xF8, 0x55, 0x14, 0x25, 0xFC, 0x2A, 0x12, 0x2A, 0xFC, + 0x13, 0x0C, 0xB7, 0xF9, 0x2C, 0x04, 0x42, 0xFE, 0x90, 0x05, 0x98, 0x06, + 0xB3, 0x10, 0x00, 0x0C, 0x2A, 0x14, 0xBE, 0x17, 0xE6, 0x1C, 0x57, 0x2A, + 0xA4, 0x29, 0x44, 0x31, 0xA7, 0x23, 0x78, 0x24, 0xDA, 0x0D, 0xA5, 0x12, + 0xD3, 0x09, 0x10, 0x1B, 0x14, 0x13, 0x01, 0x2E, 0x1B, 0x16, 0xBE, 0x2A, + 0xE0, 0x13, 0x31, 0x1D, 0x5B, 0x09, 0x50, 0x0B, 0x40, 0x0D, 0x91, 0x03, + 0xF4, 0x11, 0x78, 0x00, 0x45, 0x0E, 0x2F, 0xFC, 0x8B, 0xFC, 0x27, 0xEB, + 0xE7, 0xF9, 0xB4, 0xE4, 0x50, 0x06, 0x22, 0xEA, 0x5D, 0xF5, 0xF1, 0xD9, + 0x47, 0xE7, 0xA1, 0xDA, 0xF2, 0xDE, 0x02, 0xE6, 0xCC, 0xD3, 0x35, 0xDA, + 0x35, 0xE0, 0xCA, 0xDC, 0xB0, 0xE6, 0xE6, 0xE6, 0x66, 0xC9, 0xAA, 0xCE, + 0xFC, 0xB8, 0x58, 0xC2, 0x76, 0xD2, 0x6B, 0xDD, 0x05, 0xE7, 0x8C, 0xEC, + 0x8B, 0xD9, 0xC3, 0xD2, 0xFF, 0xDB, 0x05, 0xC2, 0x1E, 0xED, 0xC6, 0xCB, + 0xE9, 0xE3, 0xDB, 0xD0, 0xAF, 0xD8, 0x85, 0xDC, 0xF8, 0xCE, 0xEA, 0xEE, + 0xD6, 0xC0, 0x64, 0xF3, 0xD0, 0xBE, 0x9C, 0xEC, 0xFA, 0xC7, 0x1B, 0xE6, + 0x39, 0xDC, 0xE6, 0xEB, 0x0B, 0xF6, 0xD3, 0x02, 0x86, 0xF8, 0x9A, 0x0F, + 0x94, 0xDE, 0x88, 0x00, 0x8C, 0xDB, 0x85, 0xFA, 0x94, 0xF7, 0x6C, 0xFC, + 0xCA, 0x0A, 0x36, 0xF2, 0x3D, 0x09, 0xAC, 0xE9, 0x30, 0xF6, 0xCE, 0xE9, + 0xC1, 0xEC, 0x7C, 0xF4, 0xDA, 0xE9, 0x1B, 0xE8, 0x45, 0xF0, 0xDC, 0xDA, + 0x84, 0xF2, 0x9C, 0xD6, 0x77, 0xF0, 0xE1, 0xD0, 0x62, 0x01, 0x86, 0xE5, + 0xE4, 0xFF, 0x3F, 0xEE, 0x45, 0xF5, 0x95, 0xE4, 0x40, 0xED, 0x1F, 0xDA, + 0x25, 0xDF, 0x79, 0xD3, 0x62, 0xE2, 0x61, 0xE8, 0xB9, 0xEC, 0xCD, 0xFF, + 0x2E, 0xDB, 0x47, 0xEF, 0x30, 0xD0, 0x5E, 0xD5, 0x60, 0xF5, 0xF6, 0xE3, + 0x4D, 0x15, 0x42, 0x06, 0x99, 0xFB, 0x6B, 0x00, 0x6B, 0xDE, 0xE6, 0xE4, + 0x43, 0xF2, 0x0A, 0xF3, 0xF6, 0xFD, 0x32, 0x09, 0x15, 0xF3, 0x2D, 0x11, + 0x6D, 0xFD, 0xE3, 0x22, 0x86, 0x06, 0x24, 0x27, 0x77, 0xFD, 0x16, 0x17, + 0x3E, 0xFE, 0x47, 0x0D, 0xD4, 0x10, 0x11, 0x1C, 0xC3, 0x26, 0x91, 0x3D, + 0xF6, 0x2F, 0x2D, 0x44, 0xA1, 0x28, 0xAB, 0x27, 0x59, 0x19, 0x31, 0x0D, + 0x83, 0x20, 0x05, 0x15, 0x77, 0x2F, 0x36, 0x26, 0xC8, 0x28, 0x8B, 0x25, + 0x07, 0x12, 0x02, 0x1A, 0x43, 0x08, 0x1A, 0x12, 0xE5, 0x15, 0x03, 0x19, + 0x99, 0x26, 0x13, 0x2B, 0x1C, 0x2A, 0x8C, 0x33, 0x2E, 0x1A, 0xAF, 0x22, + 0x0A, 0x23, 0x7D, 0x23, 0x94, 0x35, 0xA8, 0x2B, 0x66, 0x33, 0x23, 0x22, + 0xB0, 0x24, 0x77, 0x16, 0x92, 0x07, 0xCE, 0x06, 0xFF, 0x04, 0x6B, 0x01, + 0x81, 0x1E, 0x11, 0x00, 0x46, 0x19, 0xBB, 0xEE, 0xFA, 0xEB, 0xFB, 0xD4, + 0x1C, 0xD9, 0x6C, 0xD7, 0xC3, 0xFD, 0x90, 0x01, 0xF6, 0x13, 0xB6, 0x09, + 0x11, 0xFE, 0x9C, 0xD9, 0xB3, 0xF9, 0xB3, 0xCD, 0x14, 0x0B, 0x27, 0xF3, + 0xFF, 0x08, 0x4F, 0x07, 0x40, 0x02, 0x5F, 0x05, 0xE5, 0x06, 0xB3, 0x04, + 0xB8, 0x05, 0x58, 0x00, 0x2B, 0xFF, 0x6F, 0xF7, 0x6E, 0x05, 0x6A, 0xFD, + 0x36, 0x09, 0xD9, 0x06, 0x68, 0xFF, 0x72, 0x03, 0x4F, 0xFE, 0xEF, 0x01, + 0x3B, 0xFB, 0xF6, 0x01, 0xF9, 0xF5, 0x47, 0x0A, 0x18, 0xFD, 0x4F, 0x17, + 0xB8, 0xFF, 0x04, 0x12, 0x34, 0xFD, 0x64, 0x0A, 0x89, 0xFB, 0x08, 0x11, + 0xF9, 0xFB, 0x6B, 0x1D, 0x5B, 0x05, 0xC7, 0x25, 0x03, 0x1F, 0x32, 0x2B, + 0x2D, 0x20, 0xD8, 0x14, 0xC7, 0x10, 0x1F, 0x09, 0x38, 0x04, 0x7D, 0x1A, + 0x86, 0xF2, 0xA2, 0x15, 0x27, 0xF1, 0xC4, 0xFC, 0xE3, 0xF3, 0x1B, 0xE2, + 0xE7, 0xF8, 0x76, 0xDD, 0x9B, 0x05, 0x17, 0xEF, 0x51, 0x05, 0xD8, 0xFE, + 0x99, 0xE5, 0x7E, 0xF4, 0x2A, 0xCF, 0x0B, 0xE3, 0xA4, 0xF4, 0xD4, 0xFA, + 0x09, 0x18, 0x07, 0x0B, 0xF9, 0x01, 0x54, 0xE0, 0xAA, 0xED, 0x54, 0xC2, + 0xD9, 0xF9, 0x0A, 0xD9, 0x33, 0xF7, 0x3D, 0xE9, 0x4E, 0xF5, 0x0E, 0xF4, + 0xC8, 0x03, 0x77, 0x06, 0x5B, 0x00, 0x1F, 0x00, 0x8E, 0xFC, 0x36, 0xF1, + 0x35, 0x07, 0x0C, 0xF5, 0x2B, 0x0D, 0x15, 0x08, 0xEC, 0x0D, 0xBF, 0x1A, + 0x8F, 0x0B, 0x60, 0x1B, 0x5B, 0x01, 0xA5, 0x0F, 0xA6, 0xF4, 0x38, 0x0A, + 0x0A, 0xF5, 0x73, 0x10, 0x41, 0x05, 0xFD, 0x1B, 0x41, 0x11, 0x8C, 0x1E, + 0xA9, 0x10, 0x37, 0x10, 0x27, 0x14, 0xB8, 0x05, 0x08, 0x0C, 0x11, 0xFD, + 0x1E, 0x07, 0x1B, 0x00, 0x01, 0x0F, 0x6D, 0x0A, 0x58, 0x07, 0xFC, 0x04, + 0x26, 0xFC, 0xA5, 0x03, 0x70, 0xEA, 0x62, 0xFA, 0x69, 0xE2, 0x24, 0xF1, + 0xEE, 0xDC, 0x57, 0xE7, 0x00, 0xD2, 0x2F, 0xD9, 0x61, 0xDF, 0xE4, 0xE3, + 0xDA, 0xDF, 0xDF, 0xE8, 0x0D, 0xC5, 0x7B, 0xD4, 0x7B, 0xBD, 0xCB, 0xC2, + 0x24, 0xDA, 0x07, 0xCA, 0xDF, 0xFA, 0xF1, 0xE0, 0x44, 0xFA, 0xBD, 0xE0, + 0xF9, 0xE8, 0xFF, 0xCD, 0xDE, 0xEB, 0xDD, 0xD4, 0x71, 0xED, 0xF0, 0xE2, + 0x82, 0xE3, 0xF5, 0xE1, 0xF2, 0xE1, 0x2E, 0xE3, 0xCF, 0xE3, 0xCF, 0xE6, + 0xD9, 0xD6, 0x11, 0xD9, 0x88, 0xD2, 0x15, 0xD3, 0x96, 0xF0, 0xA6, 0xF4, + 0x24, 0x01, 0xF7, 0x06, 0xF0, 0xFD, 0xA1, 0xFF, 0x8E, 0xF7, 0x61, 0xFC, + 0x9A, 0xED, 0x7F, 0xFA, 0xB0, 0xFE, 0xC6, 0x02, 0x7D, 0x18, 0x1C, 0x0C, + 0x2F, 0x1A, 0x6A, 0x10, 0x5E, 0x0B, 0x03, 0x0B, 0x0D, 0x06, 0x4F, 0x02, + 0xAF, 0x06, 0xA9, 0xFC, 0xBC, 0x02, 0x88, 0xFA, 0xBC, 0xFF, 0xB4, 0xFC, + 0x6A, 0xFA, 0x97, 0xFE, 0x4D, 0x00, 0x38, 0x0F, 0xB4, 0xFD, 0xA7, 0x13, + 0x0C, 0xF3, 0x4B, 0x08, 0xD0, 0xF8, 0x5A, 0x06, 0xB5, 0xF5, 0x8B, 0xF6, + 0x1C, 0xEC, 0x3D, 0xE8, 0x36, 0xF2, 0xB1, 0xFA, 0xFA, 0xE7, 0x8E, 0x00, + 0x70, 0xD4, 0xD3, 0xEA, 0xDE, 0xE6, 0x7E, 0xE8, 0x56, 0x12, 0xBF, 0x06, + 0xCF, 0x1E, 0xAE, 0x15, 0x55, 0x02, 0x91, 0x00, 0x81, 0xF9, 0x76, 0x00, + 0xA0, 0x00, 0x14, 0x0F, 0x4E, 0x02, 0x5E, 0x13, 0x19, 0x13, 0xF5, 0x1B, + 0x41, 0x20, 0x8C, 0x1D, 0x14, 0x22, 0x89, 0x1A, 0x65, 0x22, 0xBE, 0x1B, + 0x82, 0x22, 0x0B, 0x21, 0x27, 0x27, 0x1C, 0x24, 0x31, 0x31, 0xD6, 0x22, + 0xE9, 0x38, 0xBA, 0x1F, 0xDA, 0x2B, 0x5A, 0x0E, 0xD1, 0x23, 0xE5, 0x05, + 0xD8, 0x38, 0x53, 0x1A, 0x01, 0x42, 0xA8, 0x2B, 0x95, 0x28, 0xC6, 0x1C, + 0x6A, 0x25, 0x28, 0x17, 0x51, 0x40, 0x25, 0x24, 0x65, 0x4A, 0x4F, 0x24, + 0xDA, 0x46, 0xC1, 0x26, 0xBB, 0x2E, 0xEC, 0x1A, 0x1B, 0x1E, 0x1A, 0x17, + 0xEA, 0x20, 0x32, 0x24, 0xF1, 0x1A, 0x85, 0x1A, 0xCA, 0x0E, 0x8C, 0x09, + 0xFF, 0xFD, 0x23, 0x05, 0xEE, 0xF8, 0xDC, 0x0F, 0xBC, 0xFE, 0x72, 0x18, + 0xA5, 0xFF, 0x19, 0x19, 0x31, 0xE9, 0xAA, 0x08, 0x83, 0xD8, 0x23, 0xF4, + 0x74, 0xF8, 0x3A, 0x0B, 0x0D, 0x0C, 0x3E, 0x1B, 0x6F, 0xF2, 0x33, 0xFC, + 0xE5, 0xE6, 0x96, 0xF7, 0xE3, 0xEF, 0x78, 0x13, 0x3B, 0xEE, 0x73, 0x1C, + 0x92, 0xFC, 0xF1, 0x22, 0x11, 0x11, 0xC1, 0x23, 0x77, 0x0D, 0x84, 0x0E, + 0x90, 0x02, 0x07, 0xF8, 0x1A, 0xF5, 0x06, 0xEE, 0xD8, 0xF8, 0xCE, 0xF7, + 0xDD, 0x0F, 0x99, 0x05, 0x4C, 0x18, 0xE8, 0x06, 0x7E, 0x0B, 0x98, 0xFB, + 0x7B, 0x03, 0xE7, 0xF5, 0xB6, 0x0F, 0xBB, 0x05, 0x58, 0x1C, 0xA8, 0x19, + 0x1B, 0x1F, 0x7F, 0x1F, 0x11, 0x0F, 0x5A, 0x0B, 0x85, 0x08, 0xD2, 0x03, + 0x64, 0x0C, 0x1A, 0x04, 0x24, 0x0E, 0x8F, 0xF8, 0x0D, 0x06, 0x0E, 0xEE, + 0x5F, 0xF0, 0x66, 0xE9, 0x7B, 0xEA, 0xB0, 0xEC, 0xA2, 0xED, 0x26, 0xE8, + 0x9D, 0xEB, 0x27, 0xE2, 0x41, 0xDC, 0xE0, 0xDB, 0xF5, 0xCF, 0xA7, 0xDA, + 0x73, 0xDD, 0x2A, 0xED, 0xCC, 0xEA, 0xA3, 0xF6, 0x8F, 0xDE, 0x68, 0xE2, + 0x98, 0xC0, 0x26, 0xC3, 0x63, 0xBC, 0xCA, 0xC3, 0x3F, 0xE1, 0x52, 0xE2, + 0x50, 0xEC, 0x09, 0xE1, 0xDE, 0xDF, 0xAB, 0xDA, 0xF1, 0xF0, 0x62, 0xF1, + 0xBF, 0x08, 0xF8, 0xFB, 0x98, 0x0F, 0xB5, 0xF0, 0xEE, 0x0C, 0x5E, 0xED, + 0x1D, 0xF9, 0x90, 0xEF, 0x9A, 0xDA, 0x2A, 0xE5, 0xED, 0xCA, 0xC0, 0xE0, + 0x89, 0xD2, 0xFE, 0xE9, 0xE7, 0xEA, 0x5A, 0xFB, 0xC0, 0xF8, 0xE3, 0x03, + 0xD1, 0xF1, 0xDA, 0xFD, 0x58, 0xE3, 0x65, 0x01, 0xE2, 0xEF, 0xB4, 0x13, + 0xD9, 0x11, 0x6F, 0x1E, 0x6B, 0x1D, 0x16, 0x1C, 0x7C, 0x07, 0x5E, 0x0C, + 0x37, 0xFE, 0xF7, 0x0D, 0xFC, 0x02, 0x00, 0x1A, 0xAE, 0xFE, 0xCE, 0x16, + 0x2A, 0xFC, 0xE8, 0x07, 0x08, 0xF6, 0x89, 0xF4, 0x8B, 0xF9, 0x62, 0xF9, + 0x36, 0x05, 0xFA, 0xF7, 0x95, 0x10, 0xE2, 0xE2, 0x8C, 0x0A, 0xC5, 0xCD, + 0x48, 0xFC, 0x8C, 0xC4, 0x8B, 0x02, 0x75, 0xDA, 0x33, 0x05, 0x78, 0xF1, + 0xD2, 0xE5, 0x32, 0xE1, 0x46, 0xC1, 0xDC, 0xBE, 0xD5, 0xCB, 0xB3, 0xC4, + 0x3F, 0xF6, 0x7C, 0xF3, 0x5B, 0x07, 0xE1, 0x01, 0x12, 0xFA, 0x21, 0xE8, + 0xF1, 0xF9, 0xDC, 0xDF, 0x86, 0x0E, 0xD7, 0xF6, 0xC9, 0x16, 0x0F, 0x0F, + 0x5B, 0x08, 0xA4, 0x13, 0x09, 0xF8, 0x01, 0x11, 0x93, 0xF1, 0x22, 0x07, + 0x50, 0xF0, 0x76, 0x04, 0x05, 0xEC, 0x3F, 0x15, 0xBB, 0xEE, 0x5A, 0x21, + 0x9B, 0x01, 0xB9, 0x27, 0x83, 0x04, 0xE0, 0x1D, 0xA0, 0xF2, 0x0F, 0x0C, + 0x71, 0xFA, 0xED, 0x17, 0xB8, 0x11, 0xB0, 0x2C, 0x79, 0x1D, 0x2A, 0x35, + 0xE8, 0x19, 0x8A, 0x21, 0x9B, 0x19, 0xDB, 0x0A, 0xB9, 0x23, 0xD4, 0x0F, + 0xA5, 0x20, 0x9D, 0x10, 0xD6, 0x17, 0xF5, 0x0D, 0x21, 0x04, 0xB5, 0x00, + 0xFB, 0xFB, 0x16, 0xF0, 0x6D, 0x07, 0x98, 0xED, 0x33, 0x08, 0x31, 0xED, + 0xE1, 0xF9, 0x86, 0xE5, 0xD6, 0xEE, 0x5C, 0xE1, 0xEA, 0xF0, 0x4C, 0xF2, + 0x2A, 0xFB, 0x31, 0x09, 0x4E, 0xFA, 0x88, 0x00, 0x22, 0xDC, 0xFD, 0xD9, + 0xD4, 0xD2, 0xB8, 0xCA, 0x3A, 0xFA, 0x93, 0xEA, 0xF5, 0x08, 0xD5, 0x04, + 0x0D, 0xE2, 0x30, 0xF5, 0x28, 0xD7, 0x46, 0xEA, 0xDF, 0xF2, 0xC0, 0xF8, + 0xFE, 0xFE, 0x43, 0x07, 0x3C, 0xFF, 0x33, 0x0C, 0xBD, 0x0B, 0x98, 0x0F, + 0x1F, 0x14, 0x6C, 0x08, 0x4A, 0x0A, 0x01, 0xFA, 0x5F, 0x0E, 0x87, 0x00, + 0x63, 0x1D, 0x07, 0x0F, 0xFF, 0x1B, 0x18, 0x0E, 0xE5, 0x18, 0xE7, 0x03, + 0x81, 0x13, 0x51, 0x02, 0x58, 0x0E, 0xCB, 0x0D, 0x1C, 0x21, 0xD6, 0x1B, + 0x9C, 0x34, 0x8C, 0x23, 0xAB, 0x34, 0x37, 0x24, 0xB3, 0x28, 0x5F, 0x1D, + 0xCA, 0x26, 0xEF, 0x22, 0x6C, 0x24, 0xB8, 0x30, 0x48, 0x21, 0xDD, 0x32, + 0xE8, 0x1F, 0x3A, 0x1B, 0x4D, 0x1F, 0x1B, 0x10, 0x5B, 0x29, 0x4A, 0x2D, + 0xD8, 0x23, 0x8C, 0x3E, 0x74, 0x06, 0x46, 0x35, 0xEF, 0xEA, 0x64, 0x23, + 0xFB, 0xE9, 0xAC, 0x1C, 0xD0, 0x05, 0xAF, 0x27, 0xFF, 0x1A, 0xAE, 0x24, + 0x4F, 0x00, 0x14, 0xFD, 0x91, 0xE6, 0x64, 0xD8, 0xF0, 0x01, 0xCF, 0xEB, + 0x11, 0x22, 0x2E, 0x13, 0xF1, 0x11, 0xAD, 0x0B, 0x10, 0xF9, 0xD7, 0xF2, + 0xBC, 0x08, 0x61, 0xF7, 0x46, 0x1D, 0x77, 0xFF, 0x6C, 0x25, 0xA7, 0x02, + 0x40, 0x1B, 0x72, 0x05, 0xBA, 0xFD, 0x51, 0xF9, 0xFC, 0xED, 0x7C, 0xE3, + 0x2C, 0xED, 0xD1, 0xD8, 0xCF, 0xF7, 0x34, 0xE9, 0xA5, 0x02, 0x89, 0xFC, + 0xF6, 0xFF, 0xC6, 0xF8, 0xAF, 0xF6, 0x62, 0xE7, 0x77, 0xF6, 0x7A, 0xDE, + 0x1F, 0xFE, 0x2D, 0xE5, 0x73, 0xFB, 0xA2, 0xF8, 0x4F, 0xF6, 0xBB, 0x0E, + 0xBE, 0xE1, 0xC0, 0x08, 0x34, 0xD3, 0x6D, 0x04, 0x43, 0xDD, 0x24, 0x0C, + 0x47, 0xF8, 0xCA, 0x16, 0x22, 0xFC, 0x5D, 0x11, 0xC6, 0xE7, 0x47, 0xF1, + 0x61, 0xF4, 0x0F, 0xEC, 0x9D, 0xF5, 0x1E, 0xEB, 0xCC, 0xE7, 0x68, 0xE3, + 0x05, 0xDD, 0x71, 0xDD, 0xAA, 0xC4, 0xE6, 0xD0, 0xEC, 0xC2, 0x5C, 0xD6, + 0xC5, 0xE1, 0x8B, 0xE2, 0xB3, 0xD8, 0xD1, 0xCE, 0x5A, 0xAB, 0x98, 0xA9, + 0xA9, 0xB4, 0x1E, 0xAB, 0x03, 0xE1, 0x19, 0xCE, 0xA3, 0xE7, 0x72, 0xD4, + 0x61, 0xD8, 0x2D, 0xC4, 0x43, 0xE0, 0xD1, 0xC9, 0xEF, 0xF5, 0x3A, 0xE0, + 0x04, 0x05, 0x08, 0xF7, 0x00, 0x06, 0x35, 0x06, 0xD4, 0xF2, 0x8C, 0x02, + 0xA0, 0xD9, 0x09, 0xF2, 0xD3, 0xD6, 0x91, 0xEA, 0x4D, 0xE9, 0x86, 0xF3, + 0x97, 0xF2, 0x7C, 0xFE, 0x67, 0xF2, 0x50, 0xFC, 0x19, 0xF4, 0x91, 0xF1, + 0xE9, 0xF2, 0x45, 0xED, 0x8D, 0xF5, 0x12, 0xF0, 0xA6, 0xFC, 0x90, 0xF5, + 0x64, 0x09, 0x97, 0x04, 0xFC, 0x06, 0xE3, 0x07, 0x8D, 0x06, 0x82, 0x04, + 0x70, 0x15, 0xB2, 0x13, 0xBA, 0x18, 0xA2, 0x1E, 0xAD, 0x1F, 0x8C, 0x15, + 0x0A, 0x1A, 0xD2, 0xF7, 0x67, 0x14, 0xED, 0xEE, 0x26, 0x16, 0x78, 0xFA, + 0xD6, 0x08, 0xCA, 0xF8, 0x88, 0xFA, 0x40, 0xFA, 0xF3, 0xEA, 0x3A, 0xFB, + 0xD9, 0xE7, 0x31, 0xF6, 0x6C, 0x06, 0xCC, 0x01, 0xF8, 0x13, 0xFE, 0x0F, + 0x66, 0xF1, 0x32, 0x01, 0x97, 0xD9, 0x3E, 0xEA, 0x93, 0xF8, 0x0C, 0xFD, + 0xEB, 0x17, 0xED, 0x18, 0x0A, 0x07, 0xF3, 0x0E, 0x45, 0x03, 0x31, 0x0F, + 0x2A, 0x0E, 0x74, 0x27, 0xDE, 0x03, 0x8C, 0x37, 0x5A, 0x0D, 0xD5, 0x3F, + 0xA4, 0x1F, 0x9F, 0x3A, 0x0E, 0x17, 0x8E, 0x23, 0x69, 0x0D, 0x83, 0x15, + 0xAE, 0x18, 0xB5, 0x24, 0x4F, 0x1F, 0x2C, 0x34, 0xC5, 0x15, 0xD5, 0x27, + 0xA8, 0x13, 0x8C, 0x14, 0x86, 0x0E, 0x9F, 0x08, 0x26, 0x0F, 0x52, 0x04, + 0xEA, 0x2A, 0xC7, 0x0B, 0x8F, 0x48, 0x67, 0x17, 0xDE, 0x49, 0x06, 0x1C, + 0x62, 0x34, 0x1E, 0x17, 0xAE, 0x35, 0x53, 0x1D, 0x51, 0x3E, 0x32, 0x1C, + 0x29, 0x38, 0x94, 0x10, 0x68, 0x22, 0x2D, 0xFE, 0x0D, 0x17, 0x4B, 0xF4, + 0x9E, 0x17, 0xAA, 0x00, 0xC9, 0x0C, 0x23, 0x01, 0x71, 0x10, 0x07, 0x05, + 0x1E, 0x0C, 0x23, 0x0F, 0xB4, 0x01, 0x41, 0x12, 0x4C, 0x14, 0xFC, 0x1B, + 0x95, 0x23, 0x49, 0x29, 0x36, 0x03, 0xD4, 0x1B, 0xE5, 0xDE, 0x2B, 0xFC, + 0x1B, 0xEF, 0x13, 0x04, 0x46, 0x0F, 0x1C, 0x20, 0x60, 0x05, 0x73, 0x0A, + 0xFF, 0xEF, 0xA9, 0xEA, 0x6C, 0xF6, 0x3E, 0xF7, 0xCE, 0xF6, 0xCC, 0x0D, + 0x3C, 0xF9, 0xD4, 0x1F, 0xD4, 0x0F, 0x52, 0x31, 0xB9, 0x0E, 0x0F, 0x24, + 0x77, 0xFE, 0xCC, 0x07, 0x44, 0x06, 0x0B, 0x0D, 0x11, 0x07, 0x4F, 0x1D, + 0x9F, 0xF9, 0x7A, 0x1C, 0x7D, 0xF9, 0xF6, 0x0F, 0x6F, 0xFC, 0xB0, 0x00, + 0x93, 0x01, 0x1F, 0xF8, 0xB6, 0x1D, 0x7E, 0x06, 0xAD, 0x35, 0xCC, 0x1E, + 0x7A, 0x27, 0x76, 0x1E, 0xB7, 0x09, 0x6D, 0x0F, 0xBC, 0x0C, 0x23, 0x1C, + 0xAF, 0x16, 0xA2, 0x26, 0xD1, 0x12, 0xBE, 0x13, 0x89, 0x05, 0x70, 0xFF, + 0x6B, 0xFB, 0x72, 0xFA, 0x75, 0x07, 0x82, 0x05, 0x07, 0xFC, 0x00, 0xFC, + 0xA2, 0xE7, 0x17, 0xE8, 0xE2, 0xDF, 0xAE, 0xDD, 0x2E, 0xD7, 0xC4, 0xD2, + 0xB3, 0xD8, 0x80, 0xD1, 0xC7, 0xE6, 0xED, 0xDE, 0x7F, 0xE3, 0x66, 0xDE, + 0xEA, 0xC8, 0xB5, 0xC4, 0x6E, 0xD4, 0x08, 0xC3, 0xEE, 0xFC, 0x34, 0xE0, + 0x33, 0xF4, 0xFC, 0xE0, 0x83, 0xC9, 0xD8, 0xC6, 0xF1, 0xCA, 0x3B, 0xD1, + 0xCC, 0xE3, 0xF0, 0xF3, 0x1F, 0xEE, 0x2B, 0xFD, 0x01, 0x01, 0x7B, 0xF3, + 0xFD, 0x12, 0xA9, 0xEC, 0x7E, 0x10, 0xE6, 0xE8, 0x1B, 0x06, 0x1C, 0xEE, + 0x41, 0xFC, 0xAB, 0xFE, 0x1D, 0xF7, 0xDB, 0x07, 0x38, 0x02, 0x79, 0x01, + 0xA9, 0x04, 0x8E, 0xF7, 0x28, 0xF1, 0x49, 0xFB, 0xC7, 0xF1, 0xD6, 0x0A, + 0xD1, 0x07, 0x81, 0x15, 0x37, 0x0C, 0x7B, 0x10, 0x89, 0xF4, 0xD6, 0x01, + 0x88, 0xE8, 0xFB, 0x00, 0xB4, 0xFF, 0x3A, 0x12, 0x3E, 0x14, 0x97, 0x14, + 0xC9, 0x18, 0x19, 0x04, 0x18, 0x0F, 0x0C, 0xF1, 0x80, 0x05, 0x93, 0xF9, + 0xD2, 0xF2, 0xE6, 0x03, 0x14, 0xE5, 0x12, 0xF7, 0x11, 0xE1, 0x91, 0xEB, + 0x4E, 0xCC, 0xB8, 0xDA, 0x8B, 0xCE, 0x58, 0xCD, 0xAC, 0xF2, 0x3B, 0xD9, + 0x8E, 0x00, 0xFD, 0xE0, 0x5C, 0xE2, 0x3D, 0xC1, 0x53, 0xCE, 0x9E, 0xA9, + 0xF9, 0xE3, 0xBF, 0xCE, 0x07, 0xF7, 0xAB, 0xF6, 0x8B, 0xE0, 0x79, 0xE7, + 0xB7, 0xCD, 0x46, 0xDA, 0xAF, 0xDC, 0x3D, 0xE9, 0x97, 0xF2, 0xF7, 0xF5, + 0x89, 0x0D, 0x69, 0x04, 0xB7, 0x16, 0x7C, 0x0B, 0x5D, 0x02, 0x91, 0xFC, + 0xBE, 0xF2, 0xF7, 0xEE, 0x6A, 0xFB, 0x7C, 0x01, 0xDC, 0x02, 0x20, 0x1A, + 0xCA, 0xFC, 0x3C, 0x18, 0x3C, 0x01, 0xA5, 0x11, 0xD8, 0xFF, 0xB0, 0x07, + 0x70, 0xFD, 0x7B, 0xF9, 0x89, 0x10, 0x5B, 0x0D, 0xCC, 0x18, 0x4C, 0x32, + 0xCE, 0x02, 0x88, 0x30, 0xB9, 0xF8, 0x37, 0x22, 0x51, 0x0F, 0x4E, 0x2A, + 0x6A, 0x1E, 0x3E, 0x24, 0x96, 0x26, 0x00, 0x17, 0x50, 0x16, 0xBA, 0x07, + 0xF7, 0xF8, 0xB3, 0xF9, 0x24, 0xF4, 0xC5, 0x01, 0xD7, 0xF3, 0xEC, 0x01, + 0xFF, 0xF7, 0xA6, 0xF0, 0x66, 0xF6, 0x9F, 0xE4, 0xA7, 0xEB, 0x46, 0xEB, + 0x3B, 0xEE, 0x4B, 0x00, 0x01, 0xFA, 0xB3, 0x0C, 0x31, 0xEB, 0x37, 0xF0, + 0x8C, 0xE0, 0x52, 0xC8, 0x39, 0x01, 0xFB, 0xD2, 0xC3, 0x19, 0x92, 0xFB, + 0xC2, 0x00, 0xA5, 0xF9, 0x23, 0xE8, 0x1F, 0xE5, 0xED, 0xF6, 0x69, 0xF3, + 0x71, 0x07, 0xDB, 0x08, 0xB0, 0x12, 0xF1, 0x0F, 0x1F, 0x1D, 0xAB, 0x0C, + 0x12, 0x19, 0xE3, 0x00, 0x57, 0x0B, 0xB7, 0xF6, 0xF1, 0x04, 0xD8, 0x07, + 0x9C, 0x08, 0xB8, 0x23, 0x02, 0x0E, 0x01, 0x1D, 0x84, 0x1C, 0x36, 0x01, + 0xBE, 0x20, 0x61, 0xF4, 0x12, 0x16, 0x30, 0xFB, 0x0C, 0x1D, 0xF1, 0x11, + 0x1E, 0x28, 0x20, 0x2B, 0xF8, 0x1E, 0xBF, 0x2F, 0x48, 0x11, 0xBC, 0x23, + 0xAE, 0x1F, 0x69, 0x29, 0x45, 0x2F, 0x36, 0x37, 0x21, 0x2D, 0x74, 0x37, + 0xC7, 0x1F, 0xA0, 0x27, 0xBB, 0x09, 0x1B, 0x0E, 0x68, 0x10, 0xA5, 0x0D, + 0xA4, 0x20, 0x1B, 0x17, 0xD2, 0x19, 0xA8, 0x16, 0x07, 0xFB, 0x39, 0x12, + 0x07, 0xE5, 0xB1, 0x0C, 0x77, 0xEF, 0x92, 0x10, 0x16, 0x05, 0xDD, 0x1F, + 0xD8, 0x00, 0x3F, 0x17, 0x1F, 0xE6, 0x2E, 0xEE, 0x71, 0xEE, 0xAD, 0xE6, + 0x70, 0x1A, 0xFF, 0x11, 0x3D, 0x23, 0x2B, 0x20, 0x95, 0xFE, 0x80, 0x05, + 0x94, 0xE9, 0xA8, 0xF8, 0xF3, 0xED, 0x51, 0xF9, 0xE6, 0x00, 0x68, 0x06, + 0x5B, 0x16, 0x8A, 0x11, 0xDF, 0x1A, 0x16, 0x05, 0x24, 0x13, 0x39, 0xED, + 0x8B, 0x0E, 0x07, 0xE8, 0xB5, 0x12, 0xF0, 0xFB, 0x14, 0x0E, 0x40, 0x0A, + 0x11, 0xFF, 0xF2, 0xFE, 0xD4, 0xF5, 0xAE, 0xEB, 0x51, 0xF3, 0xCF, 0xDD, + 0x87, 0x07, 0x31, 0xE3, 0x7B, 0x1D, 0xB2, 0xF9, 0x1F, 0x19, 0x22, 0x05, + 0xCA, 0x02, 0x5B, 0xFC, 0x74, 0xF7, 0xCE, 0xFD, 0x1D, 0xFC, 0x34, 0x0F, + 0xC8, 0xF8, 0x4A, 0x10, 0x74, 0xF3, 0x53, 0x06, 0xC2, 0xE6, 0x81, 0xF4, + 0xF2, 0xE8, 0x9D, 0xF3, 0x46, 0xF4, 0xAF, 0x03, 0x65, 0xF1, 0x92, 0xFB, + 0x6B, 0xE9, 0x01, 0xE5, 0xAF, 0xD4, 0xB0, 0xD6, 0x6A, 0xC3, 0x08, 0xD4, + 0xAD, 0xCE, 0x9F, 0xDE, 0xC3, 0xDB, 0x9C, 0xE2, 0x85, 0xCB, 0xCB, 0xC5, + 0xE5, 0xC4, 0xD3, 0xB0, 0x5F, 0xD5, 0x64, 0xD3, 0xBC, 0xD2, 0xF4, 0xF7, + 0x5D, 0xB7, 0x3A, 0xE8, 0x47, 0xAB, 0x83, 0xCD, 0x5E, 0xC5, 0xB7, 0xCC, + 0x65, 0xEE, 0x3C, 0xDA, 0x98, 0x05, 0x8A, 0xE7, 0xF2, 0xFE, 0x70, 0xEA, + 0x9E, 0xE9, 0xB8, 0xDD, 0xE8, 0xDD, 0xF3, 0xDB, 0xF1, 0xDF, 0xAE, 0xF0, + 0xB5, 0xE5, 0x7F, 0xFB, 0x17, 0xED, 0x4F, 0xF0, 0x5A, 0xF0, 0x68, 0xE2, + 0x6D, 0xE7, 0x9E, 0xDA, 0xFF, 0xEC, 0x7F, 0xDC, 0x65, 0x08, 0x74, 0xF3, + 0x84, 0x11, 0x96, 0x05, 0x32, 0xFD, 0x82, 0xF6, 0x1F, 0xEB, 0x12, 0xE2, + 0x6A, 0xF6, 0xAE, 0xF1, 0xE6, 0xFD, 0xBB, 0x07, 0x96, 0xF9, 0xEB, 0x0E, + 0x45, 0xEF, 0x9B, 0x05, 0x8C, 0xF3, 0xE7, 0xF9, 0xCC, 0x11, 0xC1, 0x02, + 0x80, 0x19, 0x44, 0x04, 0xE6, 0x0A, 0x20, 0xFF, 0xD0, 0xF8, 0xB5, 0xFC, + 0x78, 0xE6, 0x83, 0xF4, 0x00, 0xEE, 0x48, 0xF8, 0x80, 0x12, 0x79, 0x06, + 0xDA, 0x14, 0x01, 0xF8, 0x11, 0xF0, 0xDF, 0xDA, 0x57, 0xEF, 0xEB, 0xEC, + 0xDC, 0x08, 0xF5, 0x0F, 0xC7, 0x03, 0x04, 0x09, 0x53, 0xEE, 0x32, 0xF0, + 0x55, 0xF9, 0xD9, 0xF2, 0xC2, 0x17, 0xBB, 0x12, 0x02, 0x26, 0x7E, 0x30, + 0xFF, 0x22, 0x97, 0x38, 0xF8, 0x14, 0x14, 0x2D, 0x13, 0x0B, 0x24, 0x1F, + 0x3E, 0x17, 0xF0, 0x24, 0xB9, 0x24, 0xD7, 0x37, 0x1E, 0x1F, 0x05, 0x3D, + 0xC0, 0x18, 0x24, 0x26, 0x8D, 0x18, 0xE3, 0x0C, 0x3D, 0x1A, 0xC1, 0x0D, + 0xF6, 0x20, 0xBC, 0x26, 0x54, 0x22, 0x90, 0x3B, 0xDD, 0x1D, 0xF2, 0x39, + 0x79, 0x18, 0x01, 0x26, 0xA2, 0x2B, 0xB0, 0x22, 0xEE, 0x44, 0xA5, 0x32, + 0x83, 0x48, 0xE7, 0x3A, 0x81, 0x44, 0x5E, 0x32, 0xB5, 0x34, 0x11, 0x14, + 0xB8, 0x2B, 0xC9, 0x0A, 0x27, 0x26, 0x2F, 0x10, 0x5A, 0x1F, 0xDB, 0x07, + 0x8D, 0x12, 0xFA, 0xFC, 0xBC, 0xFC, 0xB2, 0xEE, 0xD0, 0x02, 0x14, 0xED, + 0xFC, 0x24, 0x8B, 0x01, 0x85, 0x26, 0xE7, 0x01, 0xE3, 0xFF, 0xFE, 0xDC, + 0xBF, 0xF6, 0x4B, 0xDC, 0xD3, 0x0C, 0x8F, 0x0C, 0xAF, 0x0C, 0x41, 0x18, + 0x98, 0xF3, 0xEF, 0xFB, 0x00, 0xE8, 0x51, 0xF6, 0xDE, 0xF3, 0x92, 0x05, + 0xCF, 0x05, 0x3F, 0x14, 0x8B, 0x0F, 0x00, 0x23, 0x14, 0x09, 0xE8, 0x20, + 0xEC, 0x00, 0x8C, 0x0E, 0xC6, 0x06, 0x50, 0x11, 0x54, 0x10, 0xA9, 0x28, + 0x76, 0x0D, 0x39, 0x30, 0x81, 0x05, 0xC0, 0x21, 0xC1, 0xFA, 0xE9, 0x0E, + 0x71, 0xEE, 0xB8, 0x01, 0xD3, 0xF9, 0xF7, 0x0B, 0xBA, 0x0D, 0xFE, 0x1F, + 0xC9, 0x18, 0xA7, 0x24, 0x09, 0x19, 0x00, 0x19, 0x85, 0x1F, 0x77, 0x16, + 0xB1, 0x2A, 0xF2, 0x1D, 0xCD, 0x29, 0xC7, 0x1A, 0xF0, 0x23, 0xBD, 0x11, + 0x15, 0x13, 0xDD, 0xFB, 0x6E, 0x14, 0x34, 0xF5, 0xF1, 0x1C, 0xC0, 0x00, + 0x2F, 0x0B, 0xAB, 0x05, 0x8B, 0xF2, 0x08, 0x07, 0x75, 0xDE, 0xC8, 0xF6, + 0xEC, 0xD7, 0xC5, 0xDC, 0x0D, 0xF2, 0x97, 0xDF, 0xE2, 0xFC, 0xB5, 0xEA, + 0x29, 0xCF, 0x0F, 0xD9, 0x78, 0xB7, 0xE9, 0xCF, 0xC8, 0xE2, 0x19, 0xF1, + 0x92, 0x00, 0x7B, 0x01, 0x5A, 0xE7, 0x7B, 0xE2, 0xA0, 0xDE, 0xA1, 0xDA, + 0xCC, 0xEE, 0x16, 0xF2, 0x03, 0xED, 0x2A, 0xF7, 0x24, 0xEF, 0xBA, 0xF5, + 0xD2, 0xEF, 0x57, 0xF4, 0x74, 0xDD, 0x38, 0xE5, 0xA1, 0xDC, 0x18, 0xE3, + 0x16, 0xFB, 0xB4, 0xFB, 0x14, 0x09, 0x30, 0x07, 0x47, 0xFC, 0xF8, 0xEF, + 0x6A, 0xF9, 0x34, 0xDE, 0xDF, 0xF7, 0x93, 0xE2, 0x61, 0xFE, 0x44, 0xF4, + 0x84, 0x0E, 0x2F, 0x01, 0xDD, 0x14, 0x18, 0x04, 0x97, 0x05, 0xA3, 0xFF, + 0xE2, 0xF8, 0x8A, 0xFA, 0xFC, 0xFC, 0xDB, 0x01, 0xC5, 0xEF, 0x14, 0x03, + 0x0E, 0xEC, 0xC1, 0xFE, 0x2F, 0xF2, 0xFA, 0xEF, 0xF8, 0xFE, 0x91, 0xF6, + 0x73, 0x0D, 0x98, 0x0E, 0x07, 0x09, 0xFA, 0x0C, 0x88, 0xF8, 0x91, 0x05, + 0x30, 0xE1, 0x5B, 0x02, 0x34, 0xD2, 0xD7, 0xFC, 0xC9, 0xD8, 0xBE, 0x01, + 0x43, 0xE0, 0x29, 0x00, 0x9B, 0xD0, 0xEA, 0xDB, 0x36, 0xD3, 0xFE, 0xBF, + 0x89, 0xF8, 0xA1, 0xD7, 0xDA, 0x0A, 0xB3, 0xED, 0x56, 0xF5, 0xA3, 0xD3, + 0x69, 0xE8, 0x57, 0xC2, 0x89, 0xF6, 0x22, 0xD5, 0x5B, 0xFD, 0xBC, 0xDE, + 0x43, 0xFC, 0xD0, 0xE6, 0x6C, 0xF6, 0x04, 0xF9, 0xCE, 0xE5, 0x3F, 0xF0, + 0x02, 0xE1, 0xB3, 0xDC, 0xFA, 0xF3, 0xBE, 0xEA, 0xFB, 0x07, 0x45, 0x04, + 0x84, 0x0A, 0x5F, 0x04, 0xDE, 0x04, 0xE0, 0xFC, 0xF8, 0xF9, 0x1E, 0xFC, + 0x80, 0xFD, 0xCB, 0x02, 0x76, 0x12, 0x19, 0x14, 0x50, 0x16, 0x35, 0x22, + 0x3A, 0x04, 0x1A, 0x28, 0xEA, 0xED, 0x84, 0x20, 0xD4, 0xF9, 0x9A, 0x22, + 0xAB, 0x0D, 0x18, 0x25, 0xAB, 0x1C, 0xFA, 0x25, 0x32, 0x1A, 0x11, 0x1D, + 0xB5, 0x07, 0xB6, 0x0E, 0xBD, 0x11, 0xCA, 0x1A, 0x5E, 0x14, 0x6B, 0x19, + 0x5C, 0x03, 0xA5, 0x0B, 0xC0, 0xF4, 0x89, 0x01, 0xDA, 0xEB, 0xC0, 0xF1, + 0x7F, 0xED, 0xE2, 0xEA, 0x51, 0xFF, 0x27, 0xF4, 0x77, 0xFA, 0x08, 0xED, + 0x8A, 0xDF, 0x1F, 0xD6, 0x9B, 0xEC, 0x57, 0xE2, 0xB1, 0x0F, 0x48, 0xFF, + 0x7A, 0x0B, 0xA1, 0xF1, 0x1B, 0xF1, 0xC9, 0xD9, 0x34, 0xF6, 0x10, 0xF4, + 0x20, 0x07, 0xC1, 0x12, 0xED, 0x13, 0xFC, 0x13, 0x42, 0x1E, 0x66, 0x11, + 0x0B, 0x18, 0x55, 0x08, 0x16, 0x0B, 0xB5, 0xF9, 0x88, 0x05, 0xF7, 0x01, + 0x03, 0x01, 0xDF, 0x18, 0xE8, 0xF6, 0x51, 0x14, 0x76, 0xF5, 0x2D, 0xF7, + 0xDF, 0xFE, 0xDF, 0xE5, 0xF3, 0x06, 0xD0, 0xE9, 0xA8, 0x11, 0xEA, 0xFE, + 0x42, 0x0F, 0x2A, 0x0A, 0xF5, 0x0D, 0x49, 0x0D, 0x1B, 0x0A, 0x96, 0x05, + 0x8E, 0x0E, 0xFE, 0x01, 0xEB, 0x1B, 0x73, 0x0A, 0xC3, 0x1D, 0x51, 0x06, + 0x21, 0x19, 0x22, 0xF9, 0xC9, 0x03, 0xDE, 0xE9, 0x39, 0x00, 0x5B, 0xF6, + 0xE8, 0x01, 0xC3, 0xFF, 0x30, 0xF3, 0x32, 0xF3, 0xAF, 0xEF, 0xD6, 0xEE, + 0x91, 0xF9, 0x2C, 0xEE, 0x22, 0x01, 0xC3, 0xF4, 0x22, 0x0C, 0xE9, 0x12, + 0x21, 0x07, 0x91, 0x21, 0xF4, 0xE1, 0xAC, 0x04, 0x22, 0xDB, 0xC9, 0x00, + 0x8D, 0xFE, 0x3E, 0x2C, 0x3E, 0x0E, 0x7E, 0x3D, 0x12, 0xFC, 0x67, 0x20, + 0x70, 0xFE, 0x20, 0x18, 0xD9, 0x14, 0x94, 0x25, 0x54, 0x1C, 0xCC, 0x26, + 0x64, 0x17, 0xA7, 0x26, 0x90, 0x0B, 0x61, 0x22, 0xCB, 0x03, 0x69, 0x14, + 0x21, 0x06, 0x06, 0x0E, 0x92, 0x0D, 0xE1, 0x11, 0xE2, 0x19, 0x51, 0x13, + 0xBF, 0x20, 0xDC, 0x08, 0xBE, 0x12, 0x96, 0xF2, 0x08, 0x05, 0xF5, 0xE6, + 0xD0, 0x14, 0xC9, 0xF7, 0x44, 0x20, 0x16, 0x01, 0x2D, 0x24, 0x1F, 0xFF, + 0x30, 0x20, 0x87, 0xFC, 0xAD, 0x0D, 0xC8, 0xF6, 0x69, 0x0E, 0x82, 0x00, + 0x58, 0x13, 0x77, 0x03, 0x57, 0x13, 0x19, 0xFE, 0xA0, 0xFD, 0x00, 0xF2, + 0xE1, 0xF0, 0xC9, 0xFD, 0x14, 0xF8, 0x6A, 0x14, 0xD6, 0xEF, 0xBD, 0x07, + 0x81, 0xEB, 0xC2, 0xFA, 0x85, 0xEF, 0x01, 0xF9, 0x71, 0xEB, 0x7C, 0xF2, + 0x59, 0xEE, 0xF8, 0xFE, 0xBE, 0xEF, 0x51, 0x0C, 0xD3, 0xCE, 0x84, 0xE6, + 0x50, 0xC1, 0x83, 0xC5, 0x15, 0xED, 0x45, 0xE7, 0xB2, 0x0B, 0x5A, 0x08, + 0x9C, 0xF2, 0xDE, 0xF4, 0x4E, 0xDF, 0x80, 0xE7, 0x79, 0xEF, 0xC9, 0xF2, + 0xF4, 0xF9, 0x01, 0xF9, 0xF3, 0xF0, 0x08, 0xFD, 0x3D, 0xE0, 0x9F, 0xF6, + 0xBB, 0xD9, 0x99, 0xE0, 0xF9, 0xE2, 0x52, 0xD7, 0x52, 0xF5, 0xCC, 0xE9, + 0x95, 0x0A, 0x95, 0x02, 0xB1, 0x0F, 0xD7, 0x00, 0x28, 0x07, 0x7D, 0xED, + 0x76, 0x03, 0x44, 0xE9, 0x1F, 0x0C, 0xA7, 0x00, 0x5D, 0x10, 0x29, 0x22, + 0x9F, 0x00, 0x92, 0x2D, 0x5A, 0xF5, 0x4B, 0x25, 0xAD, 0xF5, 0xD2, 0x0F, + 0x6C, 0x0D, 0x59, 0x05, 0x7A, 0x1E, 0x2B, 0x02, 0x47, 0x12, 0x24, 0xFD, + 0x1E, 0xF4, 0x8A, 0xF2, 0x93, 0xE1, 0x7E, 0xE6, 0x3B, 0xF1, 0x7C, 0xEF, + 0xA9, 0xF8, 0xBB, 0xF5, 0x95, 0xF0, 0xFE, 0xF2, 0xA1, 0xE5, 0xD1, 0xEB, + 0x2A, 0xD4, 0x43, 0xDC, 0x84, 0xD0, 0x55, 0xDD, 0xA8, 0xE3, 0xA5, 0xE9, + 0xEE, 0xE0, 0x09, 0xCE, 0xFA, 0xD3, 0x39, 0xA8, 0xAC, 0xE9, 0x34, 0xBA, + 0x67, 0x04, 0x29, 0xEA, 0xE3, 0xEC, 0x5E, 0xED, 0x70, 0xC5, 0xC5, 0xD2, + 0x04, 0xD1, 0x52, 0xD5, 0x8E, 0xE3, 0xEA, 0xDD, 0xB0, 0xE5, 0x43, 0xE2, + 0xA9, 0xF6, 0xAE, 0xF6, 0x15, 0x04, 0xB6, 0x08, 0xAA, 0xF6, 0xEB, 0x03, + 0x34, 0xF0, 0xA7, 0x03, 0x82, 0x01, 0xE5, 0x18, 0x3D, 0x08, 0x17, 0x1F, + 0xE6, 0xFC, 0x90, 0x06, 0x1A, 0xF5, 0x32, 0xFA, 0xF4, 0xF2, 0xD3, 0x07, + 0x27, 0x01, 0xEF, 0x1E, 0x12, 0x0D, 0xC0, 0x28, 0xE7, 0x02, 0x05, 0x20, + 0xE8, 0xF6, 0xA2, 0x11, 0xF9, 0x08, 0xC8, 0x0F, 0x3E, 0x1B, 0x15, 0x0D, + 0xED, 0x1B, 0xB3, 0x04, 0x30, 0x1D, 0x41, 0x05, 0x0C, 0x0C, 0x53, 0xFA, + 0x3C, 0x05, 0x7F, 0xF6, 0x4A, 0x14, 0xA1, 0x00, 0xCD, 0x1A, 0x8F, 0x01, + 0x1A, 0x0F, 0xAD, 0xF6, 0xAE, 0x06, 0x16, 0xF0, 0xD3, 0x09, 0x99, 0xF9, + 0xB7, 0x15, 0xE3, 0x0C, 0x0C, 0x18, 0xAE, 0x07, 0x19, 0xFD, 0xF0, 0xDE, + 0xE2, 0xF1, 0x25, 0xD8, 0x92, 0x13, 0xD9, 0x0E, 0xC1, 0x1B, 0x9D, 0x1E, + 0xE7, 0xFD, 0xF4, 0xF8, 0x1A, 0x10, 0x2A, 0x01, 0x76, 0x30, 0xF8, 0x1A, + 0xF7, 0x2C, 0x85, 0x16, 0xB7, 0x30, 0xAB, 0x24, 0x67, 0x36, 0x8E, 0x41, + 0x00, 0x17, 0x28, 0x35, 0x43, 0xFC, 0x23, 0x1D, 0x8E, 0x0C, 0x01, 0x28, + 0xD1, 0x18, 0xD2, 0x33, 0xBF, 0x0E, 0x46, 0x29, 0xE7, 0x0D, 0x54, 0x21, + 0x6C, 0x12, 0x87, 0x1C, 0x18, 0x18, 0x09, 0x1D, 0xE0, 0x20, 0xCE, 0x2C, + 0x3D, 0x1F, 0x8D, 0x31, 0x3A, 0x13, 0x4B, 0x1F, 0x83, 0x11, 0x3E, 0x13, + 0x32, 0x1B, 0x5B, 0x18, 0xA3, 0x1B, 0x6E, 0x19, 0xB7, 0x20, 0xAC, 0x21, + 0x7A, 0x16, 0x4D, 0x1A, 0x7D, 0x09, 0x2A, 0x05, 0x5D, 0x16, 0x5F, 0x0D, + 0x5A, 0x1D, 0xC4, 0x1D, 0x1A, 0x0F, 0x26, 0x20, 0x79, 0xFE, 0xFF, 0x1A, + 0xED, 0xF5, 0x02, 0x0F, 0x36, 0x05, 0x50, 0x0B, 0xFE, 0x19, 0x7E, 0x0E, + 0x81, 0x01, 0xC4, 0xF5, 0x4A, 0xE0, 0xD2, 0xD4, 0x3B, 0xEA, 0x4E, 0xDA, + 0x80, 0xFF, 0x7B, 0xE8, 0x58, 0xF0, 0xED, 0xCB, 0x77, 0xEE, 0x04, 0xC1, + 0x57, 0x0B, 0x27, 0xE9, 0xDF, 0x00, 0x7C, 0xF0, 0x79, 0xE9, 0xD0, 0xE1, + 0xCB, 0xE4, 0x0B, 0xEC, 0xA7, 0xC6, 0xBD, 0xDD, 0xE8, 0xB0, 0x76, 0xC6, + 0xD8, 0xD0, 0x15, 0xDD, 0x9C, 0xF0, 0xC0, 0xF5, 0xF6, 0xF5, 0x9F, 0xEE, + 0x92, 0xF6, 0x39, 0xE6, 0xFA, 0xEA, 0x00, 0xE4, 0x51, 0xE3, 0x77, 0xE4, + 0xC4, 0xF4, 0xAB, 0xF2, 0xD1, 0xFA, 0xB6, 0xF6, 0x29, 0xF2, 0x3B, 0xEE, + 0x05, 0xF5, 0xF1, 0xEE, 0xF0, 0x04, 0x89, 0xFB, 0xA3, 0x05, 0x9B, 0xFD, + 0xEB, 0xFF, 0x4B, 0xFC, 0x05, 0xF1, 0xBA, 0xF8, 0xBE, 0xDE, 0x11, 0xEE, + 0x4E, 0xEE, 0xA8, 0xFC, 0x57, 0xFE, 0x93, 0x0A, 0x8E, 0xF0, 0xDC, 0x01, + 0xD0, 0xE2, 0x05, 0xFB, 0xB3, 0xE4, 0x52, 0xF7, 0x6A, 0xEF, 0x48, 0xFC, + 0xCA, 0xFF, 0xF6, 0x0E, 0x1B, 0xED, 0x2C, 0xF9, 0x69, 0xC4, 0xC9, 0xBF, + 0x04, 0xCB, 0xF5, 0xC1, 0xAF, 0xF1, 0x59, 0xF4, 0x32, 0xEF, 0xCA, 0xF1, + 0x61, 0xE0, 0xF3, 0xD3, 0xF3, 0xF9, 0x1B, 0xDA, 0x69, 0x12, 0x8E, 0xE8, + 0xDF, 0x18, 0x99, 0xFD, 0x57, 0x14, 0x3B, 0x16, 0x1F, 0x00, 0x24, 0x0C, + 0x78, 0xF2, 0x5E, 0xF0, 0x62, 0xFE, 0xB8, 0xEF, 0x6C, 0x10, 0x53, 0x01, + 0x84, 0x0B, 0x8F, 0x02, 0x15, 0x00, 0x9D, 0xFB, 0xFC, 0x07, 0xCB, 0x07, + 0x94, 0x0B, 0xD8, 0x14, 0x0B, 0x10, 0x22, 0x20, 0xFC, 0x19, 0x56, 0x22, + 0xAD, 0x1E, 0xE2, 0x1B, 0xE9, 0x1A, 0x65, 0x1B, 0x9B, 0x28, 0xB4, 0x29, + 0x75, 0x33, 0x11, 0x31, 0x7E, 0x1F, 0x96, 0x24, 0xA8, 0x04, 0x0E, 0x19, + 0x8A, 0xF1, 0xA3, 0x08, 0x8F, 0xF5, 0x8A, 0x07, 0x4B, 0xF6, 0xB9, 0x0B, + 0x70, 0xF2, 0xE4, 0x0E, 0x9B, 0xEF, 0x47, 0x14, 0xCF, 0xE7, 0x50, 0x08, + 0x7D, 0xF0, 0xD0, 0xFE, 0x94, 0x03, 0x7A, 0x04, 0x87, 0x07, 0x12, 0x09, + 0x99, 0xF6, 0x22, 0xFA, 0x3A, 0xEA, 0xEC, 0xF5, 0x7A, 0xF4, 0xA4, 0x0E, + 0x71, 0xF0, 0x3C, 0xFD, 0xB5, 0xDC, 0x33, 0xC5, 0xD4, 0xEE, 0x68, 0xC9, + 0x12, 0x0B, 0xA1, 0xF8, 0xCD, 0x04, 0x7A, 0x04, 0xD2, 0x02, 0x8C, 0x04, + 0x92, 0x11, 0x4A, 0x0B, 0xB5, 0x0C, 0x9F, 0xF7, 0x49, 0x0A, 0xBC, 0xEF, + 0xBC, 0x0D, 0x60, 0xFE, 0xB7, 0x03, 0x1F, 0x05, 0xA5, 0xF7, 0x06, 0x00, + 0x67, 0xF0, 0x75, 0xF5, 0xF6, 0xEC, 0x55, 0xEB, 0x62, 0x05, 0x66, 0xF7, + 0x0D, 0x1B, 0xBE, 0x07, 0x9A, 0x0C, 0x0F, 0xFE, 0x30, 0xFC, 0x9D, 0xF3, + 0x97, 0x04, 0x86, 0xF9, 0xD9, 0x0F, 0xB7, 0xFF, 0x4A, 0x05, 0xD2, 0xEE, + 0xDA, 0xFE, 0x21, 0xE0, 0xBA, 0xFF, 0x31, 0xE3, 0x0C, 0x06, 0xBF, 0xF5, + 0xA9, 0x02, 0xD9, 0xFE, 0x0B, 0xED, 0x15, 0xF4, 0xCF, 0xE2, 0x18, 0xF8, + 0x18, 0xEB, 0x6D, 0xFE, 0x6C, 0xFA, 0x34, 0xFC, 0x73, 0x09, 0x2E, 0x04, + 0x08, 0x10, 0x21, 0x0E, 0xF6, 0x00, 0x83, 0xF9, 0x72, 0xEB, 0x74, 0xDC, + 0xD8, 0xFB, 0xD1, 0xF7, 0xF6, 0x0D, 0xB6, 0x19, 0x4D, 0xF9, 0xC7, 0x09, + 0x6D, 0xF9, 0x78, 0x04, 0x31, 0x1F, 0xC8, 0x23, 0xDC, 0x30, 0xC0, 0x39, + 0xCD, 0x24, 0xCA, 0x34, 0x15, 0x22, 0x1F, 0x34, 0xE9, 0x16, 0x63, 0x2F, + 0x5E, 0xFC, 0x24, 0x1F, 0xBB, 0xFD, 0x76, 0x19, 0xB5, 0x11, 0x3F, 0x1A, + 0xA5, 0x17, 0xB4, 0x19, 0x09, 0x17, 0x58, 0x1D, 0x50, 0x17, 0xB5, 0x22, + 0x41, 0x16, 0x45, 0x20, 0xC6, 0x24, 0xC3, 0x2B, 0x00, 0x30, 0x11, 0x36, + 0x68, 0x22, 0x34, 0x2A, 0x6B, 0x14, 0xE4, 0x15, 0xBD, 0x20, 0x86, 0x14, + 0xF1, 0x22, 0x42, 0x0B, 0x8B, 0x1A, 0xBE, 0xF4, 0x31, 0x16, 0xB6, 0xEB, + 0xA9, 0x0A, 0xAC, 0xE8, 0xA4, 0x06, 0x96, 0xF0, 0x74, 0x05, 0x82, 0xFA, + 0x4E, 0xF7, 0xEB, 0xFC, 0x78, 0xF0, 0xE5, 0x01, 0xAE, 0xEE, 0xCB, 0xF7, + 0x67, 0xEA, 0xB8, 0xE5, 0x05, 0xF5, 0x8A, 0xEC, 0xFB, 0xED, 0x83, 0xE8, + 0xE4, 0xCE, 0xE8, 0xD0, 0x00, 0xC6, 0x65, 0xD4, 0xD8, 0xD7, 0x55, 0xE8, + 0xB7, 0xD6, 0x68, 0xD6, 0x2D, 0xD2, 0xBE, 0xBE, 0xCC, 0xF0, 0x52, 0xDA, + 0x6C, 0x10, 0x2D, 0x08, 0xDD, 0x03, 0x07, 0x0A, 0x77, 0xE9, 0x74, 0xF2, + 0xF7, 0xE8, 0xE7, 0xEB, 0xE4, 0xE4, 0x27, 0xE6, 0x67, 0xD7, 0xE0, 0xE2, + 0xAA, 0xD7, 0xC0, 0xEC, 0x05, 0xE5, 0xBA, 0xF6, 0x81, 0xF3, 0xF8, 0xF1, + 0xB6, 0xFA, 0x7B, 0xEB, 0x64, 0xF9, 0x71, 0xEB, 0x5F, 0xF4, 0xAF, 0xED, + 0x53, 0xFB, 0x02, 0xFD, 0x23, 0x03, 0xF0, 0x09, 0xA8, 0xF6, 0x1B, 0xFA, + 0xC5, 0x00, 0xF0, 0xF8, 0xE8, 0x0B, 0xB1, 0xFB, 0xC5, 0xFE, 0x36, 0xF0, + 0x15, 0xFA, 0xAE, 0xFA, 0xD7, 0xF2, 0x93, 0xFB, 0x67, 0xE8, 0x1C, 0xED, + 0xD0, 0xE2, 0x69, 0xE2, 0x7E, 0xDD, 0xA7, 0xDB, 0x0C, 0xD9, 0xE9, 0xD5, + 0x6C, 0xDF, 0x5C, 0xDB, 0x13, 0xDE, 0xED, 0xE0, 0x48, 0xD8, 0x6F, 0xE1, + 0x0F, 0xDE, 0xAB, 0xED, 0xD1, 0xCD, 0xE6, 0xDF, 0x00, 0xC0, 0x6E, 0xCD, + 0x3A, 0xE1, 0x2D, 0xE6, 0x20, 0xFF, 0xCB, 0xF1, 0xB5, 0xEE, 0x96, 0xDD, + 0x77, 0xEA, 0xB9, 0xE8, 0x3D, 0x0B, 0xE4, 0x13, 0xB9, 0x10, 0xE6, 0x18, + 0xEB, 0xFE, 0x9A, 0x06, 0x4D, 0x0E, 0xBA, 0x16, 0x7D, 0x1B, 0x5B, 0x1E, + 0x24, 0x09, 0x9F, 0x0B, 0xF7, 0x03, 0x33, 0x06, 0xEF, 0x10, 0xAA, 0x10, + 0x96, 0x16, 0xE8, 0x16, 0x34, 0x19, 0x8A, 0x1D, 0x7C, 0x13, 0x7D, 0x1C, + 0x66, 0x0D, 0x6E, 0x0C, 0x14, 0x21, 0xB5, 0x0E, 0xEB, 0x37, 0x8E, 0x26, + 0x27, 0x2E, 0x9E, 0x33, 0xB7, 0x1C, 0xDC, 0x35, 0x19, 0x1D, 0x49, 0x3E, + 0x55, 0x1E, 0x31, 0x30, 0xAF, 0x22, 0x1B, 0x1D, 0xE8, 0x1E, 0x82, 0x20, + 0x5A, 0x0D, 0x5F, 0x23, 0x5D, 0x08, 0x94, 0x1F, 0x67, 0x17, 0x7C, 0x28, + 0x8F, 0x1D, 0x6C, 0x24, 0x10, 0x13, 0x8C, 0x04, 0x75, 0x0E, 0x85, 0xFE, + 0xB4, 0x10, 0x0B, 0x10, 0xEA, 0x12, 0x73, 0x0E, 0x85, 0x0F, 0x6C, 0xF9, + 0x6F, 0x05, 0x1B, 0xDE, 0x04, 0x12, 0xE7, 0xDC, 0x82, 0x26, 0x8B, 0xF2, + 0x5F, 0x15, 0xF9, 0xEB, 0x29, 0xFF, 0x24, 0xD6, 0x02, 0x0B, 0x14, 0xEA, + 0x9B, 0x1A, 0xE4, 0x15, 0xB2, 0x13, 0x9A, 0x22, 0x7D, 0x15, 0x47, 0x20, + 0xFB, 0x15, 0xCF, 0x0F, 0x09, 0x08, 0x94, 0xFF, 0x83, 0x07, 0x8B, 0x09, + 0xE2, 0x0E, 0x45, 0x1A, 0x3D, 0x0A, 0xEF, 0x1E, 0x0C, 0x03, 0x94, 0x18, + 0x88, 0x0A, 0x67, 0x13, 0x6C, 0x10, 0x31, 0x17, 0xDD, 0x11, 0x84, 0x2C, + 0x1A, 0x1A, 0x4F, 0x3E, 0xFA, 0x1A, 0x55, 0x39, 0x75, 0x13, 0x7E, 0x2C, + 0x1F, 0x19, 0x04, 0x30, 0x21, 0x12, 0x40, 0x2A, 0x87, 0x02, 0xCF, 0x1F, + 0x58, 0x05, 0x92, 0x22, 0x08, 0xFF, 0xD1, 0x16, 0xC8, 0xF9, 0x60, 0x0B, + 0x8D, 0x06, 0x84, 0x0A, 0x42, 0x00, 0x75, 0xFE, 0x5A, 0xEB, 0x72, 0xE5, + 0xF4, 0xEB, 0xDE, 0xD9, 0x24, 0xF4, 0x78, 0xDD, 0x15, 0xF9, 0xEF, 0xE7, + 0x0E, 0xFA, 0x84, 0xEE, 0x80, 0xEC, 0x75, 0xDD, 0xC8, 0xE3, 0xF7, 0xD0, + 0x75, 0xED, 0x6E, 0xE0, 0x08, 0xE3, 0x5B, 0xE2, 0x36, 0xC7, 0xA0, 0xCB, + 0x44, 0xD0, 0x73, 0xCC, 0x9A, 0xF2, 0x95, 0xE9, 0xF9, 0xF8, 0x7B, 0xEB, + 0x59, 0xF2, 0x43, 0xE1, 0xD3, 0xEE, 0x03, 0xE4, 0x50, 0xE4, 0x9E, 0xE1, + 0xC2, 0xDE, 0x8B, 0xE5, 0xF7, 0xDF, 0x84, 0xEF, 0x4B, 0xEA, 0x33, 0xF5, + 0x4C, 0xED, 0x94, 0xF2, 0x67, 0xED, 0x1B, 0xF8, 0x7D, 0xFF, 0x26, 0x06, + 0xDF, 0x0B, 0x40, 0x09, 0xA6, 0x0D, 0xB8, 0x0B, 0x07, 0x14, 0x55, 0x0F, + 0x0F, 0x16, 0x79, 0xFF, 0x1E, 0x18, 0x94, 0xF3, 0xCC, 0x26, 0xDC, 0xFB, + 0x13, 0x2D, 0x1A, 0x03, 0x7D, 0x1E, 0x34, 0x0B, 0x3E, 0x11, 0x65, 0x11, + 0x27, 0x0B, 0x0D, 0x0B, 0x4B, 0x02, 0x57, 0x02, 0xE1, 0xF8, 0x96, 0xFB, + 0x33, 0xEE, 0x1B, 0xE8, 0xE1, 0xE7, 0xE2, 0xDE, 0x6D, 0xEA, 0x83, 0xF8, + 0x77, 0xF5, 0xB2, 0x15, 0x9D, 0xFB, 0x50, 0x13, 0xD4, 0xEB, 0xD2, 0xF3, + 0x5E, 0xDC, 0x52, 0xDC, 0xE3, 0xE7, 0x1A, 0xED, 0xDE, 0xED, 0x23, 0x06, + 0xA7, 0xD9, 0x4E, 0x03, 0x8D, 0xC4, 0xB4, 0xE4, 0xD2, 0xD1, 0x5C, 0xD8, + 0x25, 0xF4, 0x19, 0xF0, 0x64, 0xFB, 0xD8, 0xFC, 0xE7, 0xF6, 0x0B, 0xFC, + 0x46, 0xF3, 0x73, 0xF1, 0x31, 0xEA, 0x72, 0xE0, 0xBC, 0xEA, 0xA6, 0xDB, + 0xB0, 0xFA, 0xA3, 0xE4, 0x7B, 0x04, 0x64, 0xE9, 0xE3, 0xFD, 0x75, 0xDD, + 0x37, 0xF8, 0xD8, 0xD6, 0x11, 0xFB, 0x21, 0xE4, 0x1A, 0x08, 0x64, 0xFE, + 0x3A, 0x0F, 0xA0, 0x0B, 0xDB, 0x08, 0xDE, 0x06, 0xE5, 0x04, 0x65, 0xFC, + 0xFD, 0x11, 0x96, 0xF7, 0x6B, 0x19, 0xCE, 0x00, 0x56, 0x05, 0x78, 0x0A, + 0x0F, 0xFA, 0x09, 0x0B, 0x90, 0xF9, 0xB3, 0x01, 0xBB, 0xF2, 0xC2, 0xFB, + 0xFE, 0xF8, 0x7A, 0x0F, 0xB3, 0xF8, 0x68, 0x23, 0x92, 0xDF, 0x32, 0x20, + 0x9E, 0xD4, 0x20, 0x18, 0xCA, 0xE6, 0x2B, 0x13, 0x10, 0xF6, 0xA5, 0x0B, + 0x66, 0xF3, 0x92, 0xFC, 0xDA, 0xEA, 0xB1, 0xE7, 0x3B, 0xE9, 0xD7, 0xE1, + 0xE0, 0xF4, 0x0D, 0xF0, 0x1D, 0xF7, 0x0A, 0xF1, 0xAA, 0xEB, 0x1F, 0xE3, + 0x6D, 0xEC, 0xD4, 0xE6, 0x84, 0xF2, 0xA0, 0xF2, 0x01, 0xF3, 0xE4, 0xF6, + 0xB8, 0xF4, 0x67, 0xFE, 0xA3, 0xF7, 0xDA, 0x02, 0x5E, 0xFB, 0x29, 0xF9, + 0x01, 0xFF, 0x77, 0xEB, 0xE9, 0x05, 0x62, 0xEC, 0x07, 0x14, 0x7C, 0x01, + 0x44, 0x1C, 0x78, 0x1A, 0xAC, 0x0F, 0x68, 0x1C, 0x13, 0x03, 0x63, 0x10, + 0xBA, 0x08, 0xC0, 0x0F, 0x94, 0x13, 0x17, 0x17, 0xD2, 0x18, 0xEB, 0x19, + 0x3D, 0x1E, 0x81, 0x19, 0xE0, 0x27, 0xA7, 0x1C, 0x84, 0x28, 0x03, 0x14, + 0x57, 0x21, 0xBA, 0x08, 0xDA, 0x13, 0xF6, 0x0C, 0xBC, 0x07, 0x60, 0x11, + 0xC4, 0x0E, 0x8C, 0x10, 0x0F, 0x22, 0x9E, 0x12, 0xAF, 0x26, 0x88, 0x16, + 0x8C, 0x1A, 0x58, 0x14, 0x9A, 0x0C, 0xB5, 0x0A, 0xF6, 0x00, 0xBF, 0x00, + 0x9C, 0x0A, 0x89, 0x04, 0xB5, 0x14, 0x37, 0x03, 0xBC, 0x00, 0xD3, 0xEA, + 0xFD, 0xF6, 0x8F, 0xE0, 0xA4, 0x03, 0xDE, 0xEB, 0xD8, 0x06, 0xC1, 0xF2, + 0x1E, 0x00, 0xBA, 0xF5, 0xED, 0xFE, 0x28, 0xFF, 0x71, 0xFF, 0x0A, 0x11, + 0xBF, 0x01, 0xE8, 0x1C, 0x08, 0x16, 0x6F, 0x22, 0x9C, 0x28, 0xB1, 0x29, + 0x39, 0x1F, 0xA9, 0x2A, 0xFB, 0x0C, 0x3F, 0x1F, 0xBE, 0xFF, 0xC9, 0x0F, + 0x7D, 0xFB, 0xA3, 0x16, 0x08, 0x01, 0x48, 0x2C, 0x79, 0x05, 0x73, 0x30, + 0x37, 0x08, 0x16, 0x28, 0x4A, 0x0F, 0xD4, 0x22, 0x9F, 0x19, 0xDE, 0x1E, + 0x53, 0x23, 0xC8, 0x18, 0xD7, 0x2C, 0xCF, 0x13, 0xD6, 0x33, 0x7D, 0x13, + 0x05, 0x2C, 0xAB, 0x12, 0xD1, 0x1A, 0x93, 0x10, 0x7D, 0x16, 0xBA, 0x11, + 0xAC, 0x1D, 0x82, 0x0A, 0x99, 0x18, 0xF3, 0xF1, 0x79, 0x13, 0x3B, 0xE3, + 0xF1, 0x14, 0x90, 0xE7, 0x08, 0x07, 0x25, 0xEA, 0xB2, 0xF2, 0x4E, 0xEF, + 0xA2, 0xE0, 0xB5, 0xF0, 0xDB, 0xDB, 0xBF, 0xEA, 0x71, 0xE9, 0x5A, 0xE9, + 0x30, 0xF3, 0x52, 0xE9, 0xB3, 0xE8, 0x51, 0xE9, 0xDE, 0xD6, 0xB8, 0xEE, + 0x72, 0xCC, 0xCF, 0xE9, 0x22, 0xCF, 0x11, 0xDB, 0x4F, 0xDE, 0xE2, 0xDC, + 0xC8, 0xE1, 0xD9, 0xE5, 0x7D, 0xDC, 0xC1, 0xEE, 0x8C, 0xDA, 0x5F, 0xF7, + 0xF6, 0xDA, 0xD7, 0xF4, 0xA5, 0xDE, 0xD9, 0xE8, 0x8B, 0xDD, 0xE9, 0xE1, + 0xEE, 0xD4, 0xB3, 0xE2, 0xFE, 0xD3, 0x65, 0xE2, 0x2B, 0xE0, 0xA1, 0xE8, + 0x35, 0xE6, 0x7D, 0xF5, 0x79, 0xE6, 0x2C, 0xF5, 0x15, 0xF4, 0xB3, 0xE9, + 0x35, 0x00, 0x81, 0xE0, 0x67, 0xFE, 0x35, 0xDF, 0x58, 0xF9, 0x69, 0xE6, + 0x8D, 0xF0, 0x88, 0xED, 0x7F, 0xED, 0xC4, 0xF3, 0x18, 0xF6, 0xE6, 0xF7, + 0xE8, 0xFA, 0xF2, 0xFB, 0xB5, 0xFF, 0xDA, 0x03, 0xFF, 0x07, 0xDF, 0x06, + 0x20, 0x02, 0xC3, 0x03, 0x32, 0xF0, 0xBB, 0xFC, 0x09, 0xEA, 0x31, 0xF3, + 0x2E, 0xEA, 0x65, 0xEA, 0x93, 0xDB, 0xF2, 0xE0, 0x2C, 0xD1, 0xDF, 0xDE, + 0x32, 0xD7, 0x2A, 0xE5, 0xEA, 0xDA, 0x96, 0xE0, 0xDD, 0xDC, 0xDA, 0xD0, + 0x33, 0xE1, 0xC8, 0xCD, 0xDB, 0xDF, 0xA3, 0xD5, 0x6F, 0xDF, 0x7C, 0xD6, + 0x39, 0xED, 0xCF, 0xD9, 0xC4, 0xFC, 0x3E, 0xE9, 0x66, 0x00, 0xF7, 0xF7, + 0x49, 0xFA, 0x3E, 0xFB, 0xD4, 0xF8, 0x23, 0xFF, 0x2D, 0xFF, 0x17, 0x00, + 0x8D, 0x07, 0xC7, 0xFA, 0x0A, 0x0A, 0x06, 0xF9, 0x68, 0x04, 0x42, 0xFC, + 0x92, 0x02, 0x4E, 0x01, 0x7B, 0x0C, 0x6C, 0x0C, 0x3C, 0x16, 0x42, 0x1C, + 0x1F, 0x15, 0x8D, 0x22, 0xB8, 0x12, 0xA7, 0x20, 0x6C, 0x1B, 0xDC, 0x22, + 0x3F, 0x2C, 0xD5, 0x2B, 0xE2, 0x35, 0x26, 0x30, 0x36, 0x34, 0x5E, 0x30, + 0x40, 0x2D, 0x35, 0x34, 0xFE, 0x22, 0xA3, 0x36, 0x83, 0x18, 0xB2, 0x38, + 0x00, 0x14, 0xE3, 0x3B, 0x9F, 0x13, 0x1B, 0x37, 0x13, 0x15, 0x40, 0x2B, + 0x35, 0x16, 0xA1, 0x24, 0x0F, 0x1D, 0x7B, 0x27, 0xBB, 0x25, 0x07, 0x21, + 0x93, 0x21, 0xC1, 0x0F, 0x24, 0x18, 0x94, 0x0A, 0xD2, 0x0E, 0x71, 0x05, + 0x78, 0x08, 0x9F, 0xF8, 0x98, 0x02, 0xFE, 0xF6, 0x49, 0xFC, 0xB5, 0xFB, + 0x68, 0xFC, 0x7F, 0xF1, 0xEA, 0x06, 0xBA, 0xE7, 0xED, 0x0F, 0x11, 0xEB, + 0xFA, 0x07, 0xCF, 0xEF, 0xF0, 0xFD, 0xC5, 0xF9, 0x31, 0x03, 0xAC, 0x01, + 0x23, 0x17, 0x27, 0xFD, 0xB4, 0x2A, 0x06, 0xFB, 0x80, 0x2F, 0xD3, 0x06, + 0xAE, 0x20, 0x37, 0x0F, 0x02, 0x11, 0xC7, 0x12, 0xAB, 0x0F, 0xF7, 0x18, + 0x9E, 0x11, 0x16, 0x1B, 0xF9, 0x0D, 0x86, 0x19, 0xAC, 0x0D, 0x9F, 0x1B, + 0x8F, 0x19, 0x0F, 0x22, 0x73, 0x22, 0x33, 0x22, 0x8B, 0x22, 0xEA, 0x1E, + 0xCD, 0x21, 0x84, 0x20, 0x64, 0x22, 0x11, 0x2A, 0xDE, 0x22, 0xDD, 0x32, + 0x70, 0x19, 0x56, 0x2C, 0x14, 0x11, 0x8C, 0x22, 0xAB, 0x14, 0x82, 0x21, + 0xC0, 0x12, 0x79, 0x1F, 0xAB, 0x08, 0xF7, 0x1F, 0x72, 0x03, 0xF5, 0x22, + 0x5E, 0xFD, 0xDF, 0x13, 0x8D, 0xF8, 0x18, 0x00, 0x3B, 0xF7, 0xA1, 0xFB, + 0x8C, 0xF2, 0x76, 0xFD, 0xEB, 0xF3, 0xC5, 0xFB, 0xD7, 0x02, 0x4B, 0xFA, + 0x62, 0x0E, 0xAA, 0xFA, 0x0B, 0x08, 0x4A, 0xF8, 0x42, 0xFB, 0x98, 0xFC, + 0xC8, 0xF6, 0x8B, 0x03, 0x17, 0xF2, 0xB4, 0xFC, 0x9B, 0xE7, 0xF5, 0xF6, + 0x42, 0xE2, 0x64, 0xFD, 0xB4, 0xE2, 0x63, 0xFC, 0x35, 0xEE, 0xFA, 0xF4, + 0x8E, 0xFF, 0xA9, 0xF3, 0x3B, 0xFF, 0x36, 0xED, 0x4C, 0xF9, 0x35, 0xE7, + 0x6A, 0xF6, 0x19, 0xE9, 0xB6, 0xF2, 0xF9, 0xEB, 0xB2, 0xF1, 0x20, 0xE8, + 0x32, 0xEB, 0xB1, 0xD8, 0x0D, 0xEB, 0x72, 0xD7, 0x9C, 0xF7, 0xF1, 0xE9, + 0x75, 0xFB, 0x6A, 0xF5, 0x7A, 0xF4, 0x76, 0xFA, 0x34, 0xEF, 0x5D, 0x01, + 0x66, 0xF8, 0x4F, 0x01, 0x08, 0x08, 0x00, 0xF8, 0x62, 0x11, 0xD7, 0xF4, + 0xE0, 0x17, 0xF3, 0xFD, 0xA6, 0x14, 0xEB, 0x05, 0xCB, 0x0A, 0xE1, 0x04, + 0xD8, 0x06, 0x72, 0xFE, 0x49, 0xFE, 0x16, 0xFC, 0xF1, 0xE8, 0xCB, 0xFB, + 0x5C, 0xE0, 0x75, 0xF8, 0x24, 0xEB, 0x88, 0xF0, 0x73, 0xF8, 0xFF, 0xE3, + 0x59, 0x03, 0x1D, 0xDE, 0xDB, 0x01, 0xB0, 0xDD, 0x3C, 0xF5, 0xA6, 0xDB, + 0xDD, 0xE7, 0x06, 0xE1, 0x42, 0xDC, 0x58, 0xEE, 0x35, 0xD6, 0x1C, 0xF8, + 0x16, 0xD7, 0xFE, 0xFC, 0xB8, 0xD9, 0x91, 0xFB, 0xA3, 0xD8, 0xB2, 0xF3, + 0x70, 0xDD, 0x4E, 0xEF, 0xDD, 0xE8, 0x29, 0xEC, 0xE6, 0xED, 0x2E, 0xE5, + 0x57, 0xEF, 0x32, 0xE6, 0x5A, 0xEA, 0xB3, 0xEC, 0xC7, 0xE1, 0x59, 0xE9, + 0xF4, 0xE3, 0x0C, 0xE3, 0x0E, 0xEC, 0x35, 0xE3, 0x71, 0xF4, 0x86, 0xEC, + 0xCE, 0xFB, 0x5B, 0xFD, 0x77, 0xFE, 0xAA, 0x03, 0x18, 0x05, 0x91, 0xF8, + 0x77, 0x0F, 0x61, 0xF4, 0x19, 0x14, 0x40, 0xFF, 0x49, 0x16, 0xA7, 0x0B, + 0x7E, 0x10, 0x0D, 0x10, 0x0B, 0x09, 0x3E, 0x0C, 0xB3, 0x0A, 0x83, 0x08, + 0x59, 0x0F, 0x24, 0x0C, 0xFD, 0x10, 0x12, 0x14, 0x91, 0x0F, 0x59, 0x19, + 0x2B, 0x07, 0x17, 0x18, 0xDF, 0xFA, 0x75, 0x17, 0xEB, 0xF2, 0x4C, 0x18, + 0xE0, 0xF4, 0x5A, 0x0B, 0x51, 0xFC, 0xDC, 0xF4, 0xAC, 0xFC, 0x69, 0xEE, + 0xF4, 0xF5, 0x22, 0xF2, 0x9F, 0xEE, 0x4C, 0xF0, 0x6B, 0xEC, 0xF9, 0xF8, + 0x58, 0xEC, 0xB3, 0x02, 0x44, 0xEC, 0x9C, 0xFC, 0x51, 0xEF, 0x8D, 0xF4, + 0xD2, 0xEE, 0x84, 0xF0, 0xF8, 0xED, 0x24, 0xED, 0x97, 0xF0, 0x1B, 0xEF, + 0x8F, 0xEA, 0xFE, 0xF1, 0xFD, 0xE2, 0xDC, 0xEB, 0xE9, 0xE4, 0x9F, 0xEF, + 0xDE, 0xEF, 0x04, 0x02, 0x6C, 0x01, 0x1A, 0x06, 0x1F, 0x0A, 0x33, 0xFA, + 0x14, 0x09, 0x0A, 0xF8, 0x4A, 0x0B, 0x31, 0x00, 0xC1, 0x12, 0xE9, 0x05, + 0x15, 0x18, 0x90, 0x09, 0x9A, 0x1A, 0xF5, 0x0E, 0x4B, 0x1B, 0xF7, 0x0F, + 0x7B, 0x1A, 0xE8, 0x0D, 0xA0, 0x17, 0x5E, 0x0C, 0xE2, 0x14, 0x65, 0x03, + 0xD9, 0x14, 0x13, 0x02, 0x74, 0x0F, 0xA9, 0x0A, 0x67, 0x10, 0x78, 0x10, + 0x32, 0x1F, 0xA5, 0x19, 0x60, 0x21, 0x05, 0x1A, 0xD2, 0x19, 0xC2, 0x0C, + 0x95, 0x15, 0x64, 0x0A, 0x80, 0x05, 0x14, 0x0F, 0xAA, 0xFD, 0xA2, 0x0A, + 0x0E, 0x0B, 0x0F, 0x02, 0x2F, 0x12, 0xF2, 0xFC, 0x11, 0x12, 0x83, 0xFE, + 0x70, 0x15, 0x00, 0x03, 0xF5, 0x18, 0x43, 0x08, 0x44, 0x14, 0x8B, 0x0C, + 0xBC, 0x07, 0x12, 0x0A, 0x92, 0xFF, 0x98, 0x07, 0x20, 0x00, 0xDE, 0x0B, + 0xE8, 0x05, 0x86, 0x11, 0x3F, 0x04, 0x74, 0x11, 0xAE, 0x02, 0x59, 0x10, + 0xBA, 0x09, 0x5C, 0x18, 0x6D, 0x0F, 0xE0, 0x1E, 0xB1, 0x0E, 0xE9, 0x1A, + 0x30, 0x01, 0x86, 0x15, 0x24, 0xFC, 0xEC, 0x15, 0x97, 0x0B, 0xAE, 0x1C, + 0xEB, 0x19, 0xC8, 0x24, 0x88, 0x1C, 0x35, 0x22, 0x59, 0x1E, 0x02, 0x1B, + 0x15, 0x22, 0xAE, 0x1A, 0x23, 0x23, 0x74, 0x1D, 0x89, 0x21, 0x65, 0x23, + 0xDC, 0x15, 0x9E, 0x25, 0xD0, 0x0F, 0xD9, 0x21, 0x87, 0x18, 0xA0, 0x1B, + 0xE9, 0x1A, 0xEB, 0x14, 0x07, 0x1A, 0x9F, 0x15, 0x34, 0x16, 0xE5, 0x13, + 0x73, 0x06, 0xC1, 0x02, 0x17, 0x00, 0x96, 0xF1, 0x99, 0x00, 0xF3, 0xE0, + 0xF3, 0xF9, 0x53, 0xC9, 0x3A, 0xFB, 0x7F, 0xC7, 0xDE, 0xF8, 0xF1, 0xD7, + 0x82, 0xE4, 0x31, 0xDC, 0x2A, 0xD8, 0x7D, 0xDC, 0x1B, 0xD9, 0x60, 0xDC, + 0x32, 0xD9, 0xD2, 0xD6, 0x56, 0xD7, 0xB2, 0xD5, 0xED, 0xCF, 0x0E, 0xDD, + 0x25, 0xC8, 0x4D, 0xE2, 0xAB, 0xCF, 0x05, 0xDF, 0x05, 0xDD, 0x48, 0xDA, + 0x6E, 0xE1, 0xE3, 0xD4, 0x1A, 0xE2, 0x93, 0xD5, 0x6D, 0xDA, 0xBD, 0xE0, + 0x09, 0xCC, 0xEE, 0xEB, 0xAF, 0xC3, 0x11, 0xEE, 0xC9, 0xC9, 0xBB, 0xED, + 0x20, 0xD6, 0x58, 0xEF, 0x3B, 0xE5, 0x7C, 0xEE, 0x88, 0xF9, 0x82, 0xF3, + 0x5A, 0xFF, 0x63, 0xF7, 0xEA, 0xFB, 0x71, 0xF1, 0x33, 0xFB, 0x18, 0xEB, + 0x7F, 0xF5, 0x1D, 0xED, 0x6A, 0xEC, 0x31, 0xF2, 0x8C, 0xEA, 0xE6, 0xF1, + 0x43, 0xF5, 0x49, 0xF9, 0xEC, 0x01, 0xE8, 0x08, 0xDF, 0x09, 0x73, 0x0E, + 0x00, 0x09, 0x25, 0x0D, 0xB9, 0xF7, 0xB6, 0x00, 0x56, 0xE9, 0x5A, 0xE7, + 0xFA, 0xEC, 0x75, 0xDC, 0x21, 0xF1, 0xF0, 0xD9, 0x7A, 0xEF, 0x2D, 0xD4, + 0xDE, 0xEA, 0x4B, 0xD8, 0xDF, 0xD8, 0xF5, 0xDE, 0x49, 0xCD, 0xD8, 0xE1, + 0xCC, 0xD7, 0xBD, 0xE6, 0x23, 0xDA, 0xE7, 0xE9, 0x5E, 0xD7, 0x99, 0xE3, + 0x64, 0xE3, 0x7F, 0xDA, 0xF6, 0xEE, 0x96, 0xDA, 0xE1, 0xF1, 0x23, 0xE3, + 0x20, 0xF3, 0xA1, 0xEA, 0x61, 0xF1, 0x88, 0xEC, 0x98, 0xEA, 0x8C, 0xEF, + 0x19, 0xE9, 0x83, 0xF3, 0x34, 0xF3, 0xC7, 0xFB, 0x98, 0xFD, 0x3B, 0x07, + 0xAE, 0x07, 0x9F, 0x0A, 0xF8, 0x13, 0xC0, 0x08, 0x40, 0x1C, 0x1A, 0x0C, + 0x93, 0x20, 0x03, 0x18, 0xFD, 0x24, 0x20, 0x21, 0xE7, 0x21, 0x63, 0x22, + 0xD8, 0x19, 0x9A, 0x22, 0xB2, 0x20, 0x00, 0x23, 0x01, 0x28, 0x3B, 0x22, + 0xD7, 0x29, 0xDA, 0x27, 0x89, 0x30, 0xD6, 0x2F, 0x80, 0x30, 0xC9, 0x2F, + 0xC0, 0x28, 0x9B, 0x2E, 0x28, 0x22, 0xFD, 0x36, 0x2E, 0x15, 0x5D, 0x3B, + 0x4F, 0x07, 0x89, 0x2D, 0x8B, 0x0A, 0xE6, 0x1F, 0x04, 0x12, 0xFC, 0x17, + 0xB2, 0x0E, 0x84, 0x11, 0x13, 0x09, 0x7C, 0x13, 0x03, 0x0A, 0xE6, 0x12, + 0x99, 0x0C, 0x2F, 0x0A, 0x7F, 0x11, 0xE9, 0x05, 0x06, 0x18, 0x04, 0x06, + 0x12, 0x18, 0xA7, 0x06, 0x7A, 0x15, 0xFA, 0x07, 0xAD, 0x0B, 0xF9, 0xFF, + 0x4E, 0x01, 0x3B, 0xF4, 0x98, 0x02, 0x5B, 0xF2, 0x4D, 0x06, 0xEB, 0xF5, + 0x2B, 0x0D, 0x5C, 0xF7, 0x26, 0x18, 0xDC, 0xF8, 0x84, 0x1A, 0x82, 0xFD, + 0x39, 0x19, 0xCD, 0x02, 0x7B, 0x21, 0x2A, 0x06, 0xE5, 0x26, 0x76, 0x07, + 0x0E, 0x25, 0x93, 0x09, 0xE2, 0x27, 0xD2, 0x11, 0xC0, 0x20, 0xB5, 0x17, + 0x0A, 0x16, 0x16, 0x1D, 0x73, 0x15, 0xA5, 0x27, 0xD7, 0x18, 0x2C, 0x31, + 0xB2, 0x21, 0x80, 0x36, 0x11, 0x2C, 0xB5, 0x35, 0xBD, 0x2D, 0x73, 0x39, + 0xC7, 0x22, 0x6C, 0x43, 0x72, 0x1A, 0x25, 0x44, 0x68, 0x20, 0xC9, 0x43, + 0x22, 0x24, 0x95, 0x44, 0x61, 0x15, 0xC5, 0x30, 0xE0, 0x0E, 0x80, 0x1E, + 0xC5, 0x17, 0x98, 0x1A, 0x09, 0x14, 0xAE, 0x0D, 0x17, 0x0B, 0x96, 0xFF, + 0x39, 0x08, 0x61, 0xFF, 0xF2, 0x08, 0xCA, 0x0C, 0xD4, 0x12, 0xF7, 0x15, + 0x03, 0x21, 0x9C, 0x10, 0x18, 0x1C, 0xD1, 0x0A, 0x00, 0x14, 0xD3, 0x13, + 0x23, 0x0A, 0xB4, 0x14, 0x1F, 0x04, 0xB1, 0x11, 0x84, 0x1C, 0xAF, 0x1F, + 0xE2, 0x2E, 0xF3, 0x29, 0x35, 0x23, 0x17, 0x27, 0x60, 0x24, 0x67, 0x2A, + 0x3B, 0x3A, 0xAB, 0x32, 0x7E, 0x3C, 0x3D, 0x34, 0x76, 0x38, 0x2F, 0x3F, + 0x74, 0x41, 0x22, 0x46, 0x6C, 0x44, 0xC4, 0x39, 0x46, 0x42, 0x27, 0x36, + 0x01, 0x47, 0xA9, 0x40, 0xD0, 0x3C, 0x53, 0x40, 0x83, 0x21, 0x72, 0x3A, + 0x4D, 0x14, 0xA7, 0x2B, 0x52, 0x14, 0xC2, 0x1D, 0xDA, 0x23, 0xC5, 0x33, + 0xCD, 0x2C, 0x9F, 0x38, 0xE6, 0x2E, 0x06, 0x2A, 0xE8, 0x4A, 0x00, 0x3F, + 0x20, 0x49, 0xEB, 0x42, 0xB0, 0x2C, 0xB1, 0x25, 0x94, 0x1D, 0x13, 0x09, + 0x43, 0x0F, 0x6B, 0xF5, 0x44, 0x19, 0xF9, 0x01, 0xA9, 0x03, 0x0A, 0xF0, + 0xBC, 0xD5, 0xBB, 0xC8, 0x30, 0xDD, 0x2D, 0xD8, 0xAC, 0xDB, 0xE5, 0xD3, + 0x2C, 0xB9, 0xD5, 0xAF, 0x3B, 0xC2, 0x4D, 0xB3, 0x58, 0xE9, 0xD3, 0xCD, + 0x14, 0xE2, 0x91, 0xCD, 0x4C, 0xC8, 0x4A, 0xC3, 0xEC, 0xBC, 0x1F, 0xCA, + 0x52, 0xAD, 0xB4, 0xBC, 0x71, 0xA6, 0x12, 0xA7, 0xA6, 0xAC, 0x96, 0xA9, + 0xF6, 0xAD, 0x41, 0xAD, 0xDE, 0xA2, 0x91, 0xA8, 0x46, 0xA6, 0x0E, 0xAD, + 0x22, 0xB8, 0x84, 0xB6, 0xB3, 0xB1, 0x5A, 0xA6, 0xB3, 0xAD, 0xEC, 0xA2, + 0xD4, 0xC7, 0x97, 0xC0, 0xD2, 0xD8, 0xB8, 0xC7, 0x5F, 0xB9, 0xA1, 0xAB, + 0xAF, 0xA2, 0xD4, 0xA2, 0x37, 0xBA, 0x5C, 0xB6, 0x90, 0xBB, 0x5B, 0xB6, + 0xC3, 0xA6, 0xF0, 0xA6, 0x6F, 0xA2, 0xEF, 0x9C, 0xDB, 0xA5, 0x3E, 0xA4, + 0xA5, 0xAD, 0x37, 0xB4, 0x6B, 0xBB, 0xE6, 0xBA, 0x42, 0xC2, 0x09, 0xBC, + 0xC8, 0xBD, 0x90, 0xB8, 0x8B, 0xB6, 0x99, 0xB6, 0x10, 0xBB, 0x1D, 0xC3, + 0x72, 0xCF, 0x19, 0xDD, 0x70, 0xE2, 0x00, 0xEC, 0xAE, 0xE5, 0x6D, 0xE2, + 0xA6, 0xD5, 0x41, 0xD2, 0x48, 0xB8, 0x54, 0xBE, 0x13, 0xA4, 0xFB, 0xA6, + 0x70, 0xA2, 0x82, 0xA1, 0xD6, 0xA8, 0xF6, 0xAB, 0x55, 0xBF, 0xEB, 0xC9, + 0x1C, 0xD1, 0xC0, 0xE8, 0xB3, 0xD9, 0x90, 0xF0, 0xCD, 0xE6, 0x4B, 0xF0, + 0x1B, 0xED, 0x1E, 0xF2, 0x10, 0xF5, 0xC1, 0xF9, 0xAD, 0x04, 0x04, 0x02, + 0x75, 0x15, 0x7A, 0x07, 0xFD, 0x18, 0x6E, 0x04, 0xFA, 0x16, 0xEE, 0xFD, + 0x50, 0x0B, 0x23, 0xF3, 0xC5, 0xF3, 0xB7, 0xEA, 0xC7, 0xFA, 0x78, 0xFB, + 0xC8, 0x1D, 0xF9, 0x15, 0x4D, 0x2B, 0x97, 0x27, 0x8B, 0x34, 0xB1, 0x38, + 0xD5, 0x3E, 0xC7, 0x39, 0x43, 0x36, 0x75, 0x2E, 0x04, 0x39, 0xAD, 0x2B, + 0x3D, 0x49, 0xE7, 0x37, 0x91, 0x5A, 0xD7, 0x52, 0x01, 0x64, 0x1D, 0x60, + 0xE1, 0x58, 0x0D, 0x5D, 0x9E, 0x3F, 0xBC, 0x4C, 0x8C, 0x2A, 0x4A, 0x32, + 0x18, 0x28, 0x57, 0x25, 0x68, 0x37, 0xF2, 0x2A, 0x2D, 0x40, 0x2B, 0x2C, + 0x43, 0x42, 0x07, 0x2A, 0xFC, 0x40, 0x8E, 0x2C, 0x7C, 0x2E, 0x4F, 0x21, + 0x10, 0x21, 0x8C, 0x18, 0x4E, 0x2C, 0x2B, 0x29, 0xE4, 0x46, 0xDF, 0x43, + 0x7D, 0x5D, 0xC1, 0x58, 0xC0, 0x63, 0x58, 0x5C, 0xE4, 0x5F, 0x25, 0x51, + 0x90, 0x45, 0xF7, 0x3B, 0x63, 0x1D, 0x84, 0x25, 0xED, 0x0A, 0xE2, 0x25, + 0x94, 0x16, 0x5B, 0x38, 0x1C, 0x38, 0x31, 0x4E, 0x6C, 0x4E, 0x73, 0x5C, + 0xE9, 0x50, 0x77, 0x58, 0xCF, 0x47, 0xE7, 0x46, 0xA0, 0x3E, 0xAD, 0x42, + 0x53, 0x4B, 0x59, 0x53, 0xA5, 0x58, 0xA3, 0x5E, 0xCC, 0x5A, 0x91, 0x5E, + 0xD5, 0x55, 0x3F, 0x54, 0xEB, 0x46, 0xFC, 0x47, 0x7B, 0x31, 0x66, 0x3B, + 0x7A, 0x21, 0xFF, 0x2D, 0x3C, 0x26, 0x16, 0x35, 0xA1, 0x37, 0xD0, 0x50, + 0xE8, 0x45, 0x20, 0x5F, 0x09, 0x54, 0x32, 0x5C, 0xFF, 0x57, 0x04, 0x58, + 0x8D, 0x49, 0xE7, 0x4C, 0xCC, 0x38, 0xE8, 0x37, 0xC7, 0x3B, 0x77, 0x2A, + 0xAC, 0x4E, 0x43, 0x2C, 0x00, 0x4E, 0xF3, 0x25, 0xAB, 0x36, 0xFA, 0x13, + 0x93, 0x21, 0xA0, 0x07, 0xB2, 0x0D, 0x07, 0x02, 0xBC, 0xFE, 0x1B, 0x02, + 0x7B, 0x09, 0xB2, 0x08, 0x7F, 0x1F, 0x66, 0x0D, 0xD2, 0x24, 0x42, 0x0E, + 0xF7, 0x17, 0x6D, 0x11, 0x41, 0x02, 0xC5, 0x14, 0x79, 0xE0, 0xAD, 0x07, + 0xFB, 0xDF, 0x45, 0x02, 0x3F, 0x0A, 0xA9, 0x17, 0x68, 0x28, 0x4C, 0x2C, + 0xCC, 0x37, 0xBA, 0x30, 0xD0, 0x2F, 0xC1, 0x24, 0x60, 0x13, 0x6C, 0x13, + 0x54, 0xFF, 0x02, 0x09, 0x8D, 0xF9, 0x56, 0x0A, 0x02, 0x02, 0x08, 0x18, + 0xF9, 0x06, 0x59, 0x1D, 0x3F, 0x0D, 0x79, 0x18, 0x9D, 0x1C, 0x4B, 0x17, + 0x11, 0x16, 0x16, 0x0C, 0xAA, 0x01, 0xAA, 0xFA, 0xA7, 0x08, 0xB1, 0xF9, + 0x94, 0x1E, 0x8A, 0x08, 0x75, 0x24, 0xDE, 0x16, 0xE3, 0x1B, 0x3C, 0x18, + 0x9F, 0x10, 0x72, 0x1A, 0xE5, 0x08, 0xC3, 0x1E, 0xCD, 0xF6, 0x3D, 0x08, + 0xF1, 0xE4, 0xD5, 0xEE, 0xE3, 0xDF, 0x35, 0xEB, 0xED, 0xE1, 0x75, 0xEA, + 0xAA, 0xE3, 0x2D, 0xE0, 0x48, 0xCF, 0xD9, 0xC6, 0xB1, 0xB8, 0x1D, 0xB8, + 0xC8, 0xC5, 0xBD, 0xC6, 0xAA, 0xDF, 0x40, 0xDB, 0x06, 0xE5, 0xEC, 0xE8, + 0x41, 0xE3, 0xF7, 0xEB, 0x3D, 0xE2, 0x0E, 0xE2, 0xA5, 0xD4, 0xFC, 0xD6, + 0x80, 0xBD, 0x25, 0xCB, 0x7E, 0xB2, 0xCF, 0xC4, 0xE8, 0xB4, 0xFB, 0xC5, + 0x19, 0xC3, 0x17, 0xC4, 0x71, 0xD4, 0x49, 0xC6, 0xCE, 0xCF, 0xF6, 0xC6, + 0x3F, 0xC4, 0xCA, 0xBE, 0x12, 0xC4, 0xFB, 0xB8, 0x76, 0xD6, 0x63, 0xC4, + 0xFF, 0xEF, 0x31, 0xDF, 0x6A, 0x02, 0x2D, 0xF4, 0x8A, 0x07, 0xF3, 0xF4, + 0x20, 0xFA, 0xC8, 0xEA, 0xF7, 0xF0, 0x38, 0xDF, 0x0B, 0xE9, 0x5F, 0xDD, + 0x5D, 0xE3, 0xF7, 0xE5, 0xEC, 0xED, 0x89, 0xEC, 0xCD, 0xF3, 0x08, 0xEF, + 0x71, 0xF7, 0xA8, 0xF1, 0x49, 0xFB, 0x37, 0xF7, 0x94, 0xEF, 0x83, 0xF9, + 0xAA, 0xED, 0xEC, 0xFA, 0x9E, 0xFC, 0xA8, 0xFD, 0x08, 0x0B, 0xEF, 0x01, + 0x15, 0x10, 0x36, 0x07, 0x4D, 0x03, 0x79, 0xFF, 0x5C, 0xF5, 0xA3, 0xEB, + 0xD8, 0xEB, 0x51, 0xE6, 0x09, 0xDD, 0x08, 0xE9, 0x29, 0xD5, 0xB3, 0xDD, + 0x27, 0xDE, 0x6D, 0xDB, 0xA6, 0xF2, 0xCC, 0xE7, 0x62, 0xF9, 0xB7, 0xEF, + 0xE1, 0xF0, 0xC6, 0xEC, 0xB3, 0xE9, 0xB8, 0xE6, 0x6C, 0xE3, 0xDC, 0xE9, + 0xCD, 0xFE, 0x52, 0xF7, 0xDE, 0x1B, 0x34, 0x04, 0xF5, 0x17, 0x3B, 0x06, + 0x01, 0x1B, 0xAA, 0x00, 0x6F, 0x10, 0xB7, 0xFD, 0x4F, 0x0A, 0xA7, 0x03, + 0x51, 0x1B, 0xB0, 0x02, 0xC7, 0x20, 0x2A, 0x07, 0x94, 0x27, 0xE4, 0x1B, + 0xF8, 0x27, 0x34, 0x24, 0x47, 0x21, 0x7F, 0x1B, 0xC7, 0x1B, 0x59, 0x15, + 0x05, 0x17, 0x8A, 0x1F, 0xE5, 0x2A, 0x74, 0x30, 0x28, 0x43, 0x2F, 0x47, + 0x00, 0x4D, 0xD9, 0x5A, 0xD5, 0x5B, 0x72, 0x57, 0x5A, 0x53, 0xB2, 0x4B, + 0x69, 0x2E, 0xA3, 0x45, 0x4D, 0x12, 0x00, 0x35, 0x42, 0x12, 0xF3, 0x1E, + 0xBF, 0x1A, 0x6A, 0x17, 0x70, 0x12, 0x8F, 0x1C, 0xDB, 0x0B, 0xFF, 0x23, + 0xC1, 0xFB, 0x2F, 0x1D, 0x43, 0xDF, 0x19, 0x16, 0xC3, 0xE5, 0x0A, 0x06, + 0xC7, 0x05, 0x57, 0xEA, 0x71, 0x1B, 0x9D, 0xF7, 0xEE, 0x22, 0x0B, 0x1B, + 0xA8, 0x25, 0x38, 0x28, 0x57, 0x2B, 0x03, 0x22, 0x5E, 0x20, 0xEF, 0x17, + 0x84, 0xFD, 0x11, 0x0F, 0x36, 0xDB, 0xD9, 0xFF, 0xF4, 0xD4, 0x04, 0xFC, + 0xA6, 0xE7, 0x5A, 0xF3, 0x96, 0xF0, 0x65, 0xE1, 0xF5, 0xE0, 0xD8, 0xDE, + 0x9D, 0xDE, 0x53, 0xEB, 0x00, 0xF4, 0xE4, 0xFF, 0x36, 0x09, 0xFE, 0x0B, + 0x72, 0x23, 0xA4, 0x11, 0x3B, 0x2A, 0xA8, 0x12, 0x8A, 0x10, 0xDB, 0x0B, + 0x8D, 0xF2, 0x6A, 0xF5, 0x80, 0xED, 0xDD, 0xE4, 0x7B, 0xF8, 0x84, 0xE5, + 0x74, 0xF3, 0xBF, 0xEE, 0xC0, 0xE4, 0x29, 0x03, 0x9F, 0xDD, 0x83, 0x0A, + 0x23, 0xE1, 0x6B, 0xF3, 0xA4, 0xDF, 0x56, 0xD3, 0xA0, 0xCA, 0xD9, 0xC8, + 0x88, 0xCB, 0x70, 0xD5, 0x91, 0xDE, 0x73, 0xE8, 0x69, 0xDB, 0x7E, 0xF9, + 0x06, 0xE2, 0x33, 0xE9, 0x40, 0xEE, 0x44, 0xCE, 0xAB, 0xD6, 0x77, 0xD2, + 0xE2, 0xB1, 0xFF, 0xC4, 0x94, 0xB4, 0xA2, 0xA2, 0xB9, 0xC4, 0x26, 0x95, + 0x5F, 0xC7, 0x70, 0xA4, 0xFF, 0xCD, 0xB1, 0xB8, 0xB6, 0xD3, 0x4A, 0xC4, + 0x74, 0xC7, 0x9A, 0xD3, 0x7B, 0xAA, 0x76, 0xD4, 0x46, 0xA3, 0x81, 0xCA, + 0xC1, 0xB6, 0xDF, 0xCC, 0x73, 0xC2, 0x92, 0xC5, 0x62, 0xCD, 0x0B, 0xBC, + 0x2F, 0xDC, 0x1E, 0xC9, 0xF3, 0xCA, 0xFE, 0xD4, 0x1D, 0xA7, 0xBB, 0xD8, + 0x4F, 0xA3, 0x24, 0xCD, 0x3D, 0xAE, 0x3F, 0xB1, 0xBC, 0xAA, 0x4B, 0xAB, + 0xED, 0xA9, 0x4A, 0xBD, 0xB3, 0xBC, 0xD4, 0xCB, 0x95, 0xE5, 0x45, 0xDE, + 0x24, 0x03, 0x85, 0xF2, 0x5C, 0x00, 0xAF, 0xEF, 0x66, 0xEF, 0x30, 0xE7, + 0xA8, 0xED, 0x89, 0xEB, 0x78, 0xF8, 0xBA, 0xE6, 0xA5, 0xF5, 0xCB, 0xDE, + 0x23, 0xE6, 0xF3, 0xDC, 0x11, 0xD6, 0xDA, 0xCC, 0xE7, 0xD0, 0x0D, 0xBE, + 0x0E, 0xD0, 0xD3, 0xBA, 0xF8, 0xC0, 0xBF, 0xAF, 0x47, 0xB7, 0xB1, 0xB3, + 0xB7, 0xC1, 0x99, 0xC7, 0x71, 0xBA, 0xF6, 0xC5, 0x97, 0xAC, 0x81, 0xC0, + 0x0E, 0xBB, 0x04, 0xBE, 0xED, 0xD0, 0x93, 0xC3, 0x1A, 0xDC, 0x17, 0xD5, + 0x16, 0xEC, 0x4A, 0xEC, 0x46, 0xF8, 0xB1, 0xF5, 0x34, 0xE9, 0x97, 0xE3, + 0xEE, 0xD6, 0xAD, 0xD4, 0x9C, 0xC9, 0x7D, 0xD2, 0x0D, 0xA9, 0x9A, 0xD1, + 0x9C, 0xA6, 0x44, 0xD8, 0x9E, 0xDB, 0xE0, 0xE6, 0x6E, 0xF6, 0x5B, 0xE3, + 0xC7, 0xF7, 0x00, 0xE7, 0x21, 0x0C, 0xDB, 0xFC, 0xEE, 0x1A, 0x3A, 0x0D, + 0x91, 0x10, 0x16, 0x14, 0x39, 0x17, 0x67, 0x0D, 0x40, 0x2F, 0x77, 0x09, + 0x82, 0x29, 0xD2, 0x14, 0x15, 0x1F, 0xC1, 0x21, 0xB0, 0x1A, 0x4C, 0x13, + 0xF9, 0x12, 0xC1, 0x03, 0x96, 0x1F, 0x2D, 0x0D, 0xD0, 0x27, 0xBE, 0x12, + 0x76, 0x0A, 0x18, 0x17, 0x16, 0x07, 0x90, 0x1A, 0xE0, 0x28, 0xF2, 0x08, + 0x3C, 0x3C, 0xD9, 0x02, 0x6A, 0x34, 0x38, 0x1C, 0xAD, 0x17, 0x32, 0x20, + 0xD5, 0x02, 0x2A, 0x01, 0xE8, 0x11, 0x44, 0xFF, 0xD2, 0x2B, 0xEB, 0x0A, + 0x99, 0x1E, 0xE2, 0xFC, 0x3B, 0xFE, 0x76, 0xFD, 0xA4, 0xF6, 0xD4, 0x0A, + 0xB3, 0xFB, 0x20, 0x06, 0xF5, 0x07, 0x89, 0x11, 0xB5, 0x2F, 0x82, 0x3A, + 0xF0, 0x4E, 0x93, 0x3F, 0x60, 0x4A, 0xE1, 0x39, 0x4E, 0x3D, 0x41, 0x40, + 0x68, 0x3C, 0xFF, 0x2A, 0x90, 0x46, 0xA7, 0x1E, 0x9B, 0x52, 0x84, 0x3D, + 0x77, 0x59, 0x18, 0x50, 0x5D, 0x5B, 0x79, 0x46, 0x4C, 0x4E, 0xE1, 0x49, + 0xBF, 0x29, 0x5F, 0x42, 0x84, 0x1A, 0xE4, 0x3C, 0xB4, 0x2A, 0x82, 0x49, + 0x22, 0x3B, 0x26, 0x57, 0x45, 0x47, 0xE8, 0x59, 0xE1, 0x5D, 0x23, 0x59, + 0xA8, 0x5E, 0x88, 0x57, 0xA9, 0x46, 0xBE, 0x47, 0x10, 0x4D, 0x24, 0x4E, + 0xB3, 0x5E, 0x2B, 0x59, 0x9D, 0x5B, 0x09, 0x49, 0x5A, 0x52, 0x5B, 0x43, + 0x86, 0x3F, 0xD0, 0x46, 0x0E, 0x18, 0xCD, 0x3A, 0x7F, 0x08, 0x9B, 0x3E, + 0x96, 0x14, 0xDF, 0x41, 0x74, 0x1A, 0x4F, 0x1B, 0x73, 0x29, 0x1A, 0x0C, + 0x0B, 0x52, 0x2A, 0x2D, 0x76, 0x65, 0x6F, 0x2F, 0x9D, 0x48, 0xF0, 0x15, + 0x9D, 0x2B, 0x42, 0x16, 0x16, 0x20, 0x62, 0x1C, 0xBC, 0x28, 0x76, 0x18, + 0x13, 0x3D, 0xEF, 0x26, 0xC3, 0x3B, 0x49, 0x32, 0x85, 0x2E, 0x99, 0x20, + 0x89, 0x29, 0xB3, 0x15, 0xF1, 0x0B, 0x3C, 0x09, 0xC7, 0xEF, 0x83, 0x08, + 0x37, 0x13, 0x9D, 0x2A, 0x88, 0x3E, 0xC4, 0x39, 0x3A, 0x4C, 0x7A, 0x25, + 0xF4, 0x48, 0xF7, 0x14, 0x73, 0x28, 0x77, 0x1A, 0xDD, 0x17, 0xE0, 0x2A, + 0x1F, 0x2E, 0x70, 0x35, 0x5E, 0x41, 0xA8, 0x38, 0xBF, 0x3A, 0x08, 0x2E, + 0xB7, 0x26, 0x33, 0x29, 0x5F, 0x0D, 0x6F, 0x39, 0x8C, 0xF4, 0x0A, 0x28, + 0xEF, 0xF8, 0xE2, 0x08, 0x63, 0x16, 0x77, 0x13, 0x26, 0x27, 0xA6, 0x1B, + 0x02, 0x1E, 0x0C, 0x0D, 0x61, 0x12, 0x19, 0x05, 0x66, 0x10, 0xC3, 0x08, + 0x5E, 0x22, 0x91, 0x0A, 0xDC, 0x2B, 0x2D, 0x09, 0x80, 0xFB, 0x94, 0xF9, + 0x0F, 0xC7, 0xA4, 0xD5, 0xC5, 0xE6, 0xA9, 0xCE, 0xD7, 0x14, 0x89, 0xDF, + 0x7E, 0xF0, 0x50, 0xD2, 0x9F, 0xC9, 0x3B, 0xC3, 0x15, 0xD6, 0x93, 0xD6, + 0x8B, 0xE7, 0xCA, 0xE7, 0xFF, 0xFF, 0xD2, 0xFA, 0xEF, 0x17, 0x0A, 0x20, + 0x70, 0x0C, 0x41, 0x20, 0x22, 0xF7, 0x3B, 0x03, 0x0B, 0xF4, 0x59, 0xF6, + 0x1F, 0xFA, 0x10, 0xF1, 0x92, 0x11, 0xC9, 0x08, 0xD9, 0x2B, 0x06, 0x41, + 0x73, 0x1F, 0x4D, 0x4C, 0x04, 0x04, 0xD9, 0x1C, 0xE1, 0x00, 0x3A, 0x09, + 0x41, 0x11, 0x0C, 0x1D, 0xAA, 0x16, 0x6C, 0x29, 0x9D, 0x27, 0xE6, 0x2C, + 0x93, 0x4D, 0x45, 0x2C, 0x02, 0x57, 0xC0, 0x22, 0x06, 0x4F, 0x2A, 0x20, + 0x1F, 0x39, 0x01, 0x38, 0x23, 0x19, 0xEF, 0x46, 0x22, 0x21, 0x3E, 0x3B, + 0xC2, 0x40, 0x30, 0x2B, 0x47, 0x34, 0x6F, 0x0A, 0x11, 0x12, 0xA3, 0xF2, + 0xD1, 0x0E, 0x89, 0xFB, 0x9B, 0x16, 0x72, 0x07, 0xC9, 0x0B, 0xD1, 0x0F, + 0xB3, 0xEC, 0x40, 0x0B, 0xA0, 0xCD, 0x8B, 0xF0, 0x23, 0xE6, 0xCA, 0xFC, + 0xA0, 0x28, 0x52, 0x1D, 0x49, 0x2D, 0x6E, 0x10, 0x12, 0x03, 0x43, 0xF2, + 0xA4, 0xEF, 0x02, 0xEA, 0x5E, 0xE8, 0x70, 0xFF, 0xAA, 0xF1, 0xC6, 0x14, + 0xDA, 0x19, 0x63, 0x1F, 0x78, 0x26, 0xA6, 0x1A, 0x0F, 0xF8, 0x18, 0x0C, + 0x2A, 0xD0, 0x29, 0x0D, 0x78, 0xD0, 0x1B, 0x0D, 0xA7, 0xEB, 0xC1, 0x13, + 0xBD, 0x1F, 0x2B, 0x28, 0x1E, 0x3A, 0xA2, 0x23, 0x83, 0x1C, 0x4D, 0x14, + 0x97, 0x0C, 0x57, 0x1C, 0x18, 0x22, 0xBB, 0x2A, 0xB2, 0x1E, 0xFD, 0x27, + 0x0F, 0xFE, 0x39, 0x18, 0xE2, 0xF7, 0xAA, 0x08, 0xC0, 0xF4, 0xC0, 0xF6, + 0x7E, 0xED, 0xE7, 0xEF, 0x6A, 0xF0, 0x7F, 0xF9, 0x95, 0xEE, 0x28, 0xF0, + 0x4E, 0xE8, 0xA4, 0xDE, 0xE9, 0xEF, 0x6E, 0xE7, 0x35, 0xF0, 0x67, 0xE3, + 0x60, 0xCC, 0x0D, 0xD6, 0xDF, 0xBD, 0x83, 0xDA, 0xFF, 0xCC, 0xCB, 0xE3, + 0x7F, 0xCF, 0x9C, 0xF0, 0xB8, 0xC4, 0xFB, 0xD4, 0xB8, 0xAC, 0x1D, 0x9B, + 0x0F, 0xA6, 0x4F, 0x9D, 0x26, 0xBF, 0xA8, 0xD5, 0xF0, 0xBF, 0x1F, 0xD9, + 0x3D, 0xA4, 0x43, 0xAF, 0x72, 0x9C, 0x75, 0xA4, 0xB3, 0xAE, 0x9D, 0xB2, + 0x92, 0xBC, 0xCE, 0xC7, 0x1C, 0xC8, 0x4C, 0xE0, 0x20, 0xD4, 0x3C, 0xDC, + 0x93, 0xCE, 0x7A, 0xC2, 0x68, 0xC4, 0x2D, 0xBD, 0x2E, 0xB3, 0xA6, 0xB7, + 0xDF, 0xA6, 0x41, 0xB3, 0x48, 0xC1, 0x8A, 0xC5, 0xED, 0xCE, 0x7D, 0xCF, + 0x5D, 0xAE, 0xBB, 0xBA, 0xEA, 0x9F, 0xF3, 0xB5, 0xD0, 0xB6, 0x8F, 0xD5, + 0x81, 0xC6, 0xDF, 0xDF, 0xF0, 0xC7, 0xE4, 0xDE, 0xDA, 0xCD, 0xCC, 0xE8, + 0xD8, 0xCC, 0xB6, 0xDB, 0xB9, 0xCD, 0x58, 0xD7, 0x23, 0xD1, 0xDA, 0xDB, + 0x57, 0xC3, 0x77, 0xC7, 0x7A, 0xB3, 0xA5, 0xBC, 0x6B, 0xB3, 0x0F, 0xC9, + 0x21, 0xB3, 0xDE, 0xBF, 0x13, 0xAB, 0xE5, 0xA9, 0x80, 0xA5, 0x2B, 0xA7, + 0xD6, 0x9E, 0x77, 0xAD, 0x1B, 0xA5, 0x8D, 0xB8, 0xBE, 0xAF, 0x57, 0xB8, + 0x31, 0xA4, 0xD0, 0xA6, 0xBA, 0xA6, 0x00, 0xA3, 0xA0, 0xCE, 0x6B, 0xC1, + 0x45, 0xD6, 0xC3, 0xCE, 0xAC, 0xB0, 0x5F, 0xAE, 0x25, 0xA0, 0x76, 0xA5, + 0xA4, 0xAB, 0xA2, 0xB5, 0x3F, 0xA8, 0xDF, 0xAE, 0xEC, 0xA3, 0x96, 0xA2, + 0x87, 0xA8, 0x45, 0xA0, 0x26, 0xA4, 0xC8, 0x9B, 0x4B, 0xA5, 0x58, 0x9D, + 0xC6, 0xA2, 0x41, 0xA4, 0x6A, 0xA0, 0xCE, 0xA6, 0x56, 0xB5, 0x56, 0xB2, + 0x18, 0xD4, 0x3C, 0xC1, 0xB7, 0xCE, 0x9F, 0xC1, 0x4B, 0xBC, 0x98, 0xB7, + 0x01, 0xC8, 0x71, 0xB7, 0x47, 0xD3, 0x56, 0xC4, 0x1A, 0xCC, 0x98, 0xC2, + 0xC8, 0xC4, 0xE6, 0xB3, 0x46, 0xBC, 0xA2, 0xB8, 0x9B, 0xC1, 0xBC, 0xC8, + 0xFF, 0xD2, 0xB7, 0xDC, 0x15, 0xCE, 0x7E, 0xE8, 0x4D, 0xC6, 0x85, 0xE1, + 0x5E, 0xD0, 0x57, 0xE4, 0x00, 0xDC, 0x36, 0xE6, 0x0F, 0xD5, 0xAF, 0xD9, + 0x0A, 0xCE, 0x71, 0xDB, 0x66, 0xC5, 0xF3, 0xD8, 0x4D, 0xB8, 0x75, 0xDA, + 0x17, 0xB5, 0x76, 0xE2, 0x54, 0xA9, 0xF8, 0xCE, 0x5C, 0xA9, 0x97, 0xBA, + 0x16, 0xD1, 0xC2, 0xC1, 0x36, 0xDE, 0x6B, 0xC8, 0x16, 0xB4, 0xBE, 0xB7, + 0x4C, 0xA7, 0xC1, 0xB7, 0xB3, 0xD2, 0xEB, 0xCF, 0xC2, 0xF8, 0xA3, 0xDF, + 0xED, 0x00, 0x78, 0xEB, 0xA0, 0x05, 0xF0, 0xEF, 0x00, 0x00, 0x33, 0xE4, + 0xD7, 0xF3, 0x27, 0xDE, 0xBB, 0xF2, 0x5E, 0xDD, 0xE5, 0xF0, 0x67, 0xD3, + 0xAC, 0xFC, 0x72, 0xDD, 0xF2, 0x21, 0x2F, 0xFA, 0x32, 0x25, 0xCE, 0xFE, + 0x53, 0x01, 0x95, 0xEF, 0x55, 0xFE, 0xEC, 0xED, 0x14, 0x19, 0x8B, 0x00, + 0xBF, 0x33, 0xFA, 0x08, 0x3D, 0x44, 0xC5, 0x0C, 0xF9, 0x47, 0x35, 0x20, + 0x05, 0x43, 0xCE, 0x35, 0xFF, 0x3A, 0xE0, 0x3F, 0x91, 0x2C, 0xEF, 0x2C, + 0xED, 0x22, 0x60, 0x14, 0x9C, 0x2D, 0x0F, 0x19, 0x3E, 0x2D, 0xC4, 0x24, + 0x3D, 0x11, 0x1C, 0x28, 0xE4, 0x08, 0x08, 0x29, 0xD6, 0x13, 0x3E, 0x17, + 0xF3, 0x17, 0xF5, 0x0A, 0x50, 0x18, 0x6B, 0x22, 0x1E, 0x07, 0x21, 0x26, + 0xE5, 0xF5, 0x55, 0x01, 0xC3, 0x0D, 0xC5, 0x02, 0xBD, 0x2F, 0x9D, 0x1F, + 0x17, 0x18, 0x52, 0x0C, 0x19, 0xF3, 0xD0, 0xF4, 0xDB, 0x06, 0x78, 0x03, + 0x9F, 0x1B, 0x99, 0x1A, 0x57, 0x14, 0x24, 0x28, 0xBF, 0x1F, 0x59, 0x2D, + 0x8E, 0x2A, 0xC5, 0x28, 0x47, 0x2B, 0x06, 0x1F, 0x9A, 0x35, 0xEA, 0x20, + 0x0A, 0x39, 0x63, 0x1D, 0x47, 0x2F, 0x45, 0x11, 0xA4, 0x3C, 0x4B, 0x20, + 0x69, 0x4F, 0x4D, 0x28, 0xC1, 0x33, 0xB8, 0x0E, 0x19, 0x1E, 0xBA, 0x01, + 0x33, 0x34, 0xF8, 0x0D, 0x1A, 0x36, 0x3C, 0x19, 0x7C, 0x2B, 0xFD, 0x15, + 0xE2, 0x3F, 0xAB, 0x0F, 0x48, 0x4B, 0x07, 0x0A, 0x26, 0x46, 0xF1, 0x18, + 0xCE, 0x39, 0xC8, 0x28, 0xCD, 0x23, 0xCD, 0x20, 0x52, 0x26, 0x87, 0x21, + 0xBF, 0x38, 0x87, 0x2D, 0x7F, 0x28, 0x3E, 0x1F, 0x96, 0x10, 0x33, 0x06, + 0x0C, 0x17, 0x4B, 0x04, 0x5D, 0x1C, 0xB7, 0xFF, 0x33, 0x1D, 0x37, 0x02, + 0x07, 0x28, 0xDF, 0x09, 0x1A, 0x1A, 0xA7, 0xF3, 0xDF, 0x0A, 0x4D, 0xEF, + 0xAA, 0x2E, 0x6E, 0x23, 0xD1, 0x38, 0x1C, 0x31, 0x6E, 0x12, 0x51, 0xFD, + 0xA5, 0x17, 0x35, 0xF6, 0xD1, 0x41, 0x83, 0x1E, 0x2D, 0x3A, 0x14, 0x22, + 0xB3, 0x20, 0x2D, 0x1F, 0x96, 0x25, 0x53, 0x2B, 0xF0, 0x21, 0x08, 0x23, + 0xDE, 0x20, 0x70, 0x29, 0x75, 0x2B, 0x6B, 0x34, 0x9E, 0x1A, 0xD5, 0x20, + 0x02, 0x1B, 0x68, 0x23, 0xC6, 0x3A, 0x96, 0x3D, 0xB4, 0x39, 0x60, 0x34, + 0xAC, 0x35, 0x69, 0x1A, 0xAC, 0x46, 0x47, 0x2B, 0x21, 0x49, 0xDC, 0x40, + 0xD2, 0x37, 0x80, 0x30, 0x56, 0x38, 0x0B, 0x29, 0xD1, 0x4A, 0x18, 0x2C, + 0x3B, 0x51, 0xA3, 0x27, 0x7B, 0x55, 0x45, 0x34, 0x14, 0x4A, 0x34, 0x38, + 0x80, 0x36, 0xAD, 0x23, 0x65, 0x40, 0x29, 0x20, 0x2D, 0x46, 0xA5, 0x2E, + 0xF4, 0x33, 0x8C, 0x2A, 0xEF, 0x32, 0x43, 0x2B, 0x50, 0x39, 0x01, 0x32, + 0x3F, 0x44, 0x28, 0x26, 0xD3, 0x47, 0x84, 0x1A, 0x62, 0x13, 0x59, 0x06, + 0x99, 0xDE, 0x1B, 0xEE, 0x14, 0xFC, 0x7F, 0x06, 0x63, 0x27, 0x22, 0x25, + 0x63, 0x1E, 0x8B, 0x01, 0x9F, 0x15, 0xBD, 0xEC, 0x1B, 0x20, 0x80, 0x0D, + 0xBE, 0x1A, 0x37, 0x18, 0x32, 0x1D, 0x46, 0x15, 0x16, 0x2F, 0x68, 0x20, + 0x45, 0x1C, 0x30, 0x1E, 0x1E, 0x0C, 0xDA, 0x10, 0x76, 0x16, 0xCD, 0x03, + 0x6F, 0xFF, 0xB6, 0xF4, 0x00, 0xEB, 0x4C, 0xF3, 0xDE, 0xFE, 0x62, 0x13, + 0x22, 0xFB, 0xA1, 0x1D, 0xF9, 0xEB, 0x0E, 0xF3, 0xD6, 0x04, 0x72, 0xEC, + 0xFF, 0x1F, 0x71, 0x18, 0x4C, 0x11, 0xC2, 0x21, 0x5B, 0xF8, 0x25, 0x13, + 0x23, 0xFD, 0x10, 0x1A, 0x4D, 0x05, 0x37, 0x20, 0xD8, 0x12, 0x25, 0x21, + 0xDE, 0x21, 0xC1, 0x18, 0x69, 0x18, 0x2C, 0x06, 0xA5, 0x11, 0xAD, 0xFF, + 0x10, 0x0A, 0x08, 0x0B, 0xDD, 0xE9, 0xDD, 0x07, 0x97, 0xDC, 0x76, 0xF5, + 0x2A, 0xE9, 0x16, 0xF4, 0x11, 0xF2, 0x42, 0x03, 0xBC, 0xFD, 0x3D, 0x0C, + 0xEC, 0xF6, 0xC3, 0xFA, 0xD9, 0xD3, 0xE2, 0xDE, 0x32, 0xD8, 0x70, 0xE7, + 0xB7, 0x04, 0x88, 0x06, 0x54, 0xFB, 0x77, 0xF2, 0xAC, 0xD3, 0xF6, 0xD3, + 0xE1, 0xD7, 0x65, 0xE8, 0x45, 0xDF, 0x7A, 0xF8, 0x39, 0xDB, 0xCF, 0xF7, + 0x58, 0xF7, 0x0A, 0x03, 0xE5, 0x02, 0x97, 0x09, 0x00, 0xEF, 0x92, 0x08, + 0xFD, 0xE9, 0xC4, 0x17, 0x11, 0xE1, 0x2D, 0x1B, 0x9D, 0xD1, 0x28, 0x07, + 0xE9, 0xF3, 0x1B, 0x1B, 0x18, 0x29, 0xD9, 0x31, 0xD0, 0x12, 0x95, 0x12, + 0x02, 0xED, 0x7A, 0x08, 0x34, 0xFD, 0x0F, 0x23, 0x92, 0xF9, 0x12, 0x20, + 0xB6, 0xE1, 0x20, 0x03, 0x1D, 0xEE, 0xBA, 0xFC, 0x16, 0xF5, 0xA0, 0x04, + 0xD6, 0xF2, 0x50, 0x08, 0xDE, 0xFA, 0x26, 0x0A, 0xB7, 0xE6, 0x1B, 0xF5, + 0xA5, 0xD9, 0x7A, 0xEB, 0xF6, 0xF9, 0x21, 0x03, 0x29, 0x11, 0x92, 0x01, + 0x73, 0xFF, 0x13, 0xF2, 0x95, 0xEC, 0x3E, 0xFB, 0x43, 0xE7, 0x8C, 0xFD, + 0xAB, 0xE9, 0x9F, 0xFB, 0x34, 0xEB, 0x7B, 0xEB, 0x3E, 0xD9, 0x74, 0xC4, + 0xF0, 0xD3, 0x5C, 0xC2, 0xC8, 0xEF, 0xA8, 0xF1, 0x0C, 0xED, 0xEC, 0xF7, + 0xF6, 0xC9, 0x82, 0xCB, 0xCE, 0xD0, 0x58, 0xD3, 0x46, 0xEB, 0xEE, 0xFF, + 0x4E, 0xE4, 0xB7, 0x12, 0xAD, 0xD8, 0x5F, 0x27, 0x89, 0xDE, 0x0C, 0x24, + 0x94, 0xE5, 0x41, 0xFD, 0xA6, 0xF2, 0xCE, 0xFD, 0x2E, 0xFB, 0x62, 0x12, + 0x80, 0xE5, 0x75, 0x06, 0x70, 0xDB, 0x31, 0x0C, 0x87, 0xF4, 0x68, 0x2A, + 0x35, 0xE9, 0x69, 0x19, 0xDA, 0xCF, 0x89, 0xF4, 0xF9, 0xED, 0xCB, 0x00, + 0xE1, 0x07, 0x22, 0x12, 0xEB, 0xFB, 0xE5, 0x02, 0xDD, 0xF5, 0xA2, 0x08, + 0xA1, 0xFE, 0x3C, 0x10, 0x6A, 0xFB, 0xCD, 0xFA, 0x61, 0xEF, 0xC8, 0xF9, + 0x1B, 0xEA, 0x75, 0xF5, 0x2F, 0xE9, 0x48, 0xE0, 0x57, 0xF5, 0x48, 0xEB, + 0x7D, 0xFE, 0x39, 0x01, 0x9B, 0xE8, 0x9F, 0xED, 0xA9, 0xD2, 0x65, 0xD5, + 0x81, 0xD6, 0xB8, 0xD7, 0x82, 0xDA, 0x37, 0xDD, 0xAB, 0xCC, 0x0F, 0xE3, + 0x3D, 0xBF, 0x38, 0xD4, 0xAF, 0xC5, 0xC0, 0xB3, 0x7E, 0xE5, 0xC0, 0xB7, + 0xCD, 0xFA, 0x01, 0xD7, 0xEE, 0xDA, 0xE6, 0xCE, 0x68, 0xC3, 0xBE, 0xBF, + 0xC1, 0xDE, 0x60, 0xDB, 0x42, 0xEE, 0xFA, 0xED, 0xB1, 0xEE, 0xB5, 0xED, + 0x80, 0xE7, 0x20, 0xF7, 0xD8, 0xBF, 0xA4, 0xE9, 0x51, 0xB1, 0xBD, 0xD5, + 0xAE, 0xCB, 0x77, 0xE3, 0xA7, 0xD7, 0x3F, 0xDE, 0xFB, 0xD6, 0x5E, 0xCD, + 0x18, 0xE4, 0x57, 0xEF, 0xCB, 0xE3, 0x22, 0x02, 0x55, 0xCD, 0x10, 0xDE, + 0x65, 0xD9, 0x98, 0xDD, 0xED, 0xF1, 0x69, 0x07, 0x9D, 0xE1, 0x14, 0x0F, + 0xCF, 0xD0, 0x41, 0x02, 0xB0, 0xE0, 0x1F, 0xFB, 0xFD, 0xEC, 0x2D, 0xE2, + 0xB2, 0xEA, 0x9D, 0xD4, 0x5F, 0xE2, 0x4F, 0xE0, 0x0D, 0xD4, 0xC2, 0xE5, + 0x5D, 0xDB, 0xBB, 0xE7, 0x37, 0xEB, 0x3D, 0xF2, 0xFA, 0xDA, 0x62, 0xEC, + 0x94, 0xCD, 0x12, 0xD6, 0x8E, 0xDB, 0x45, 0xD0, 0x11, 0xED, 0xD6, 0xD9, + 0x24, 0x00, 0x40, 0xE8, 0x6D, 0xEF, 0xC9, 0xE1, 0x12, 0xB5, 0xF6, 0xBE, + 0x5A, 0xB5, 0x50, 0xB7, 0x89, 0xEA, 0x73, 0xCD, 0xA2, 0xE5, 0x07, 0xC9, + 0xC1, 0xC5, 0x94, 0xBE, 0x6A, 0xC9, 0xA0, 0xD2, 0x84, 0xD5, 0x31, 0xD9, + 0x99, 0xE8, 0xF9, 0xCE, 0x19, 0xFD, 0xFC, 0xD2, 0xB1, 0xEE, 0x42, 0xD3, + 0xB1, 0xE6, 0xD0, 0xDF, 0x7F, 0x07, 0x55, 0xF6, 0xBB, 0x10, 0x50, 0xEE, + 0x21, 0xFD, 0x41, 0xE2, 0x7C, 0xFD, 0x91, 0xF1, 0x98, 0xF7, 0xE0, 0xF3, + 0xB4, 0xE1, 0x66, 0xD9, 0xB8, 0xEB, 0xE3, 0xD5, 0xFA, 0x0D, 0x44, 0xF5, + 0x09, 0x17, 0x8B, 0x0E, 0x35, 0x0C, 0xFF, 0x0D, 0x2D, 0x0A, 0x82, 0x09, + 0x8F, 0x07, 0x21, 0x13, 0xED, 0x0D, 0x1E, 0x21, 0xCC, 0x1F, 0xB3, 0x1B, + 0xBD, 0x1D, 0xAA, 0x09, 0x33, 0x21, 0x66, 0x08, 0x5C, 0x2A, 0x3E, 0x11, + 0x0D, 0x0F, 0x33, 0x14, 0x6B, 0xEB, 0xEC, 0x09, 0x49, 0xDE, 0x4C, 0xF3, + 0xF7, 0xEF, 0x60, 0xE8, 0x69, 0x1A, 0x15, 0x03, 0xF1, 0x1F, 0x5C, 0x0C, + 0xD9, 0xF1, 0x38, 0xDF, 0x7A, 0xE7, 0x44, 0xDA, 0xF7, 0x13, 0x72, 0x06, + 0x65, 0x1E, 0xD9, 0x00, 0x0A, 0x0E, 0xD8, 0xEA, 0x04, 0x22, 0x6A, 0xFF, + 0x5D, 0x38, 0x39, 0x0A, 0x76, 0x2F, 0xFA, 0xFC, 0x97, 0x26, 0x37, 0xF4, + 0xD0, 0x20, 0x2B, 0xDF, 0xC6, 0x12, 0x4A, 0xDC, 0xA8, 0x16, 0xF8, 0x02, + 0x5A, 0x16, 0x8E, 0x14, 0x1E, 0x0E, 0xE2, 0x03, 0xB5, 0x2C, 0xC0, 0x07, + 0x63, 0x4B, 0x62, 0x1B, 0x17, 0x3D, 0x5B, 0x0F, 0x05, 0x37, 0x94, 0x0C, + 0xC6, 0x51, 0x33, 0x30, 0x94, 0x5F, 0xC7, 0x3D, 0xCD, 0x50, 0x01, 0x2C, + 0xB7, 0x3A, 0x4B, 0x21, 0xE4, 0x25, 0xBC, 0x1C, 0x6A, 0x22, 0x41, 0x2E, + 0xC6, 0x32, 0x38, 0x47, 0x7A, 0x35, 0x28, 0x33, 0x70, 0x2F, 0x37, 0x25, + 0xA6, 0x32, 0xAB, 0x39, 0xAF, 0x2D, 0xAB, 0x35, 0x49, 0x21, 0xD9, 0x22, + 0x1E, 0x23, 0x01, 0x25, 0x9A, 0x2C, 0xA4, 0x2B, 0x9F, 0x36, 0xD1, 0x34, + 0xA9, 0x30, 0x88, 0x38, 0xD9, 0x02, 0xAD, 0x11, 0xEE, 0xE3, 0x61, 0xEE, + 0x18, 0x05, 0xE5, 0x12, 0x28, 0x1B, 0x7E, 0x2E, 0x81, 0x0D, 0x20, 0x0F, + 0x3E, 0x1D, 0x26, 0x0E, 0x59, 0x33, 0x5D, 0x32, 0x11, 0x31, 0x01, 0x3B, + 0xCA, 0x40, 0xB0, 0x3C, 0x9F, 0x4E, 0xC3, 0x39, 0xA7, 0x3C, 0x02, 0x21, + 0x35, 0x3F, 0x7B, 0x2D, 0x01, 0x52, 0x5D, 0x4C, 0x69, 0x42, 0x24, 0x32, + 0xFD, 0x33, 0x81, 0x0E, 0xCE, 0x3B, 0xA8, 0x1A, 0xED, 0x2F, 0x18, 0x13, + 0x50, 0x1C, 0x67, 0xFC, 0xB2, 0x2B, 0x9D, 0x13, 0x8B, 0x43, 0x7C, 0x2F, + 0x7A, 0x42, 0x49, 0x32, 0x15, 0x41, 0x6B, 0x2A, 0x92, 0x41, 0x0C, 0x28, + 0xB8, 0x39, 0xAD, 0x2C, 0xD0, 0x3F, 0xB3, 0x3E, 0x72, 0x44, 0xA5, 0x3C, + 0xCA, 0x35, 0x50, 0x1D, 0xDD, 0x31, 0x1B, 0x1B, 0x3F, 0x28, 0xDA, 0x20, + 0xA0, 0x06, 0xC2, 0x0C, 0x28, 0xFB, 0x0D, 0x08, 0x4A, 0x03, 0xD5, 0x18, + 0x4B, 0x13, 0x50, 0x23, 0x6B, 0x2C, 0x06, 0x27, 0x32, 0x29, 0x52, 0x16, + 0xD1, 0x10, 0xCC, 0xEF, 0x9D, 0x21, 0x95, 0xF5, 0x8D, 0x3F, 0x36, 0x29, + 0x3B, 0x20, 0x3E, 0x28, 0xE1, 0x02, 0x31, 0x07, 0x32, 0x15, 0x08, 0x14, + 0x67, 0x1A, 0x25, 0x20, 0x80, 0x11, 0x08, 0x21, 0xC4, 0x17, 0xAA, 0x36, + 0xAE, 0x18, 0xBB, 0x39, 0xA4, 0x1C, 0x7C, 0x35, 0x4A, 0x2F, 0x87, 0x43, + 0x96, 0x2C, 0x07, 0x3F, 0xC2, 0x1A, 0x97, 0x2B, 0x56, 0x31, 0x11, 0x35, + 0xB9, 0x4D, 0xC1, 0x40, 0x1C, 0x38, 0x97, 0x35, 0xE7, 0x2C, 0x27, 0x3D, + 0x9D, 0x3B, 0x32, 0x55, 0xD2, 0x2F, 0x35, 0x53, 0xC5, 0x21, 0xCC, 0x35, + 0xC2, 0x23, 0x03, 0x20, 0x28, 0x1F, 0xC7, 0x1A, 0x8B, 0x2D, 0x00, 0x2B, + 0x40, 0x39, 0xC8, 0x44, 0x39, 0x25, 0x35, 0x3B, 0xEF, 0x2C, 0x14, 0x32, + 0x25, 0x39, 0xF6, 0x47, 0x37, 0x1F, 0x73, 0x44, 0xBF, 0x1C, 0x1B, 0x21, + 0x58, 0x32, 0x1B, 0x0D, 0x5E, 0x2A, 0xC0, 0x11, 0xBE, 0x15, 0xB4, 0x25, + 0xED, 0xFC, 0xAB, 0x22, 0x78, 0xD9, 0x55, 0xF1, 0x14, 0xE2, 0x2B, 0xDB, + 0xF4, 0x1A, 0x0C, 0xFC, 0x37, 0x16, 0x8B, 0xFE, 0xD2, 0xDC, 0xA2, 0xE0, + 0xC5, 0xE7, 0x47, 0xE3, 0xDF, 0x0E, 0x38, 0xFB, 0x5C, 0x04, 0x51, 0xFD, + 0x24, 0xFA, 0xD4, 0xFF, 0x3B, 0xF9, 0x5A, 0x0D, 0x83, 0xEC, 0xCB, 0x0B, + 0x03, 0xF9, 0xF9, 0x09, 0x7A, 0x02, 0xBB, 0x01, 0xD7, 0xE4, 0x95, 0xE6, + 0x09, 0xD6, 0x07, 0xE4, 0xA8, 0xE1, 0xC9, 0xF1, 0x40, 0xE3, 0x0B, 0xE4, + 0x69, 0xE6, 0x82, 0xE2, 0x80, 0xF3, 0x6C, 0xFF, 0x79, 0xF6, 0xA3, 0x16, + 0xB9, 0xF9, 0xC7, 0x14, 0x47, 0x03, 0x9B, 0x08, 0x44, 0xF8, 0xD9, 0x01, + 0xBD, 0xE9, 0xF2, 0x00, 0x99, 0xF4, 0xBE, 0xFF, 0xEB, 0xF9, 0xF5, 0xE7, + 0x80, 0xF8, 0x69, 0xDC, 0x80, 0x00, 0x46, 0xF2, 0xFA, 0xEB, 0x76, 0xFB, + 0xF8, 0xC3, 0x80, 0xF2, 0xD4, 0xBB, 0x3C, 0xEB, 0x00, 0xBE, 0x1C, 0xE4, + 0x63, 0xC5, 0x04, 0xE9, 0x92, 0xDA, 0x3E, 0xEA, 0xC5, 0xD1, 0x50, 0xC6, + 0x87, 0xBB, 0x26, 0xA8, 0xE2, 0xD0, 0xF8, 0xC7, 0xD0, 0xD8, 0x24, 0xEA, + 0x3F, 0xA9, 0x46, 0xC9, 0xCE, 0x9C, 0xE7, 0xB7, 0xA6, 0xC5, 0x56, 0xDC, + 0xDA, 0xDA, 0x0D, 0xD5, 0xB7, 0xD9, 0x87, 0xBF, 0xB4, 0xD0, 0x9B, 0xD5, + 0x68, 0xC1, 0xFA, 0xDC, 0x80, 0xCC, 0x36, 0xE7, 0x7B, 0xE8, 0xBF, 0x00, + 0xAD, 0xE5, 0xA4, 0xF3, 0xA4, 0xD3, 0x9B, 0xE6, 0x6B, 0xDB, 0xB7, 0x03, + 0x72, 0xD8, 0xFC, 0x08, 0x17, 0xC6, 0xB4, 0xF2, 0x9D, 0xD1, 0xBC, 0x01, + 0xD6, 0xE7, 0x3A, 0x1A, 0xE3, 0xED, 0x26, 0x10, 0xF1, 0xF1, 0x01, 0xFD, + 0x5C, 0xFA, 0xB6, 0xE9, 0xAB, 0xF4, 0x9E, 0xDA, 0x52, 0xEE, 0x21, 0xED, + 0x1F, 0xE6, 0x01, 0xFC, 0x7C, 0xD5, 0x0D, 0xEC, 0xE8, 0xEB, 0xF6, 0xE9, + 0x8C, 0x03, 0x04, 0xFB, 0x77, 0xE4, 0xAE, 0xF1, 0x4B, 0xD9, 0x88, 0xE7, + 0x42, 0xEE, 0x38, 0xF5, 0x38, 0xF8, 0xA1, 0xF7, 0xA2, 0x07, 0x0A, 0xEB, + 0x82, 0xF4, 0x8E, 0xDC, 0x21, 0xBC, 0x3D, 0xC4, 0x03, 0xC0, 0xA9, 0xC9, + 0x90, 0xE9, 0x16, 0xEC, 0x51, 0xDA, 0x7C, 0xD8, 0x30, 0xC1, 0xC4, 0xC1, + 0x51, 0xE0, 0x29, 0xF4, 0xB0, 0xFA, 0x66, 0x19, 0xC3, 0xEC, 0x94, 0x08, + 0xA5, 0xE3, 0x78, 0x09, 0x4E, 0xE6, 0x10, 0x10, 0x14, 0xEB, 0xB7, 0x08, + 0x7C, 0xFC, 0x4D, 0x12, 0x07, 0xF5, 0x23, 0x10, 0xF7, 0xD8, 0x6D, 0xFE, + 0xBD, 0xE9, 0x60, 0x13, 0x54, 0xEE, 0xA8, 0x27, 0x91, 0xD6, 0x7B, 0x09, + 0x45, 0xF6, 0x23, 0xFE, 0x8B, 0x23, 0xD0, 0x19, 0x72, 0x0D, 0xE2, 0x25, + 0xEA, 0xF0, 0x66, 0x18, 0x59, 0x0B, 0x30, 0x09, 0xE6, 0x13, 0x1F, 0xFE, + 0x05, 0x0B, 0xA8, 0x00, 0xFD, 0x11, 0x48, 0x0F, 0x50, 0x00, 0x04, 0xFE, + 0x33, 0xF8, 0xB4, 0xE4, 0xB8, 0x14, 0x3B, 0xF0, 0x15, 0x14, 0xA2, 0xEA, + 0x38, 0xFC, 0x8A, 0xD4, 0xD3, 0x02, 0x14, 0xE7, 0xD8, 0x0D, 0xFE, 0xFF, + 0xF9, 0x04, 0x29, 0xFC, 0x3D, 0xFA, 0xA0, 0xEA, 0x07, 0xE6, 0x92, 0xD0, + 0x50, 0xE8, 0xE7, 0xCD, 0x7C, 0x16, 0x73, 0xFB, 0xDC, 0x0C, 0x60, 0x08, + 0x26, 0xCE, 0xDD, 0xDB, 0x44, 0xD9, 0x1F, 0xD6, 0x55, 0x06, 0x97, 0xF2, + 0x8F, 0xF9, 0x1D, 0xEE, 0xAF, 0xF0, 0xB5, 0xED, 0x69, 0xF5, 0xDE, 0xFD, + 0xF4, 0xDB, 0x73, 0xFB, 0x6F, 0xDA, 0xFC, 0xFE, 0xAD, 0xEE, 0xF7, 0x00, + 0x19, 0xE3, 0x09, 0xE1, 0x85, 0xEF, 0xD7, 0xE2, 0x0F, 0x12, 0x1B, 0x10, + 0x30, 0xFE, 0x7F, 0x0A, 0xF3, 0xE5, 0x0F, 0xF0, 0xF6, 0xFE, 0xBD, 0xFD, + 0xDB, 0x0A, 0xE4, 0xFA, 0xAF, 0xF6, 0xA3, 0xDE, 0xD8, 0xFC, 0xDC, 0xE3, + 0xD7, 0x0C, 0x10, 0xF2, 0xD4, 0x07, 0x04, 0xEF, 0x28, 0x05, 0x3F, 0xF3, + 0x6D, 0xFD, 0x2E, 0xF3, 0xA1, 0xF1, 0x0E, 0xEC, 0xD6, 0xFF, 0xC4, 0xFD, + 0xE7, 0x05, 0xD2, 0x04, 0x4A, 0xEC, 0xBA, 0xE1, 0x2E, 0xF1, 0xC9, 0xCA, + 0x41, 0xFA, 0xFF, 0xD2, 0x5E, 0xE6, 0x65, 0xD9, 0xFD, 0xDF, 0xD1, 0xD2, + 0x12, 0xCC, 0x98, 0xBB, 0xD4, 0xB7, 0x56, 0xA7, 0x51, 0xDC, 0xE3, 0xCD, + 0x6D, 0xF6, 0x19, 0xE7, 0x7D, 0xD2, 0xFD, 0xB2, 0xBE, 0xC0, 0x40, 0xA0, + 0x43, 0xD3, 0x12, 0xC7, 0xFE, 0xCA, 0x28, 0xD2, 0xCF, 0xCD, 0xEC, 0xCB, + 0x6F, 0xE7, 0xA2, 0xD2, 0x16, 0xDC, 0x3C, 0xC8, 0x99, 0xD6, 0xD6, 0xBB, + 0xC2, 0xEB, 0xBF, 0xBF, 0x10, 0xDA, 0xBC, 0xB0, 0xA8, 0xC6, 0x48, 0xA9, + 0xA0, 0xE6, 0xAE, 0xD3, 0xB4, 0xF2, 0x83, 0xEA, 0x3D, 0xD7, 0x97, 0xD4, + 0xFF, 0xD7, 0xD7, 0xD8, 0x47, 0xEF, 0xA5, 0xE9, 0x18, 0xEB, 0xC5, 0xE1, + 0x01, 0xE1, 0x31, 0xE8, 0x6A, 0xE9, 0xCA, 0xFF, 0x28, 0xE6, 0x64, 0x02, + 0x21, 0xE6, 0x51, 0xFC, 0x3C, 0xEF, 0xD6, 0xEC, 0xED, 0xE8, 0x3D, 0xD8, + 0x9E, 0xEE, 0xEE, 0xED, 0x30, 0xF7, 0x83, 0x0D, 0xDF, 0xDE, 0xB3, 0xF7, + 0xF8, 0xD5, 0xAE, 0xE1, 0x1A, 0xE4, 0xBB, 0xEA, 0x68, 0xDF, 0xAA, 0xED, + 0x93, 0xE3, 0xB0, 0xEC, 0xA8, 0xEF, 0x42, 0xE3, 0x72, 0xE2, 0x71, 0xCA, + 0x2F, 0xEC, 0x54, 0xD2, 0xE7, 0x10, 0x9A, 0xE6, 0xDF, 0xFB, 0x72, 0xC0, + 0xCA, 0xD7, 0x38, 0xA1, 0xAA, 0xF2, 0xCC, 0xC8, 0x31, 0x10, 0x07, 0xE5, + 0xDE, 0x10, 0x28, 0xD8, 0x83, 0x0C, 0x31, 0xE1, 0xE5, 0xFF, 0xDC, 0xED, + 0xF3, 0xF9, 0x7A, 0xED, 0x40, 0x06, 0xC0, 0xFC, 0xC2, 0x0D, 0x90, 0xF5, + 0xF2, 0x15, 0xE1, 0xE7, 0x4B, 0x36, 0x7B, 0x0C, 0xE9, 0x40, 0xF3, 0x1F, + 0x42, 0x21, 0x47, 0x03, 0xAD, 0x1D, 0x57, 0x0B, 0xB7, 0x29, 0x43, 0x34, + 0x33, 0x16, 0xC8, 0x2F, 0xFC, 0x08, 0x41, 0x1B, 0xDC, 0x13, 0x27, 0x25, + 0xAD, 0x19, 0xA5, 0x24, 0xEB, 0x22, 0x00, 0x27, 0xF0, 0x27, 0x4C, 0x33, + 0x3F, 0x17, 0xCB, 0x1C, 0xD7, 0x1D, 0xEC, 0x11, 0x8C, 0x41, 0x0A, 0x33, + 0xD1, 0x36, 0xE6, 0x35, 0x03, 0x0B, 0x65, 0x24, 0xE9, 0x03, 0xCC, 0x25, + 0x72, 0x06, 0x94, 0x1C, 0xD8, 0x03, 0x93, 0x11, 0x4F, 0x0A, 0x19, 0x12, + 0xF3, 0xFC, 0x28, 0x0B, 0x5C, 0x07, 0x39, 0x0A, 0x0E, 0x39, 0x83, 0x22, + 0x27, 0x27, 0xF9, 0x1C, 0xFE, 0xED, 0x5A, 0xF8, 0x45, 0xF8, 0xCF, 0x05, + 0xF5, 0x1C, 0x95, 0x2B, 0xA4, 0x26, 0x37, 0x27, 0x12, 0x34, 0xA1, 0x25, + 0x95, 0x38, 0x30, 0x2F, 0x84, 0x29, 0xB1, 0x1C, 0xA1, 0x31, 0xDC, 0x12, + 0xCD, 0x38, 0xED, 0x10, 0xC9, 0x21, 0x05, 0x07, 0x33, 0x25, 0x50, 0x21, + 0x49, 0x3B, 0x2C, 0x41, 0x43, 0x21, 0x80, 0x21, 0x5F, 0x0E, 0x09, 0x04, + 0x93, 0x32, 0x91, 0x21, 0xF0, 0x4D, 0xED, 0x31, 0x97, 0x4A, 0xEB, 0x1B, + 0x78, 0x4A, 0x36, 0x1D, 0x48, 0x39, 0xF5, 0x33, 0xAC, 0x20, 0x2B, 0x3D, + 0xD0, 0x2F, 0x00, 0x38, 0x6B, 0x36, 0x87, 0x21, 0x23, 0x2A, 0x8B, 0x13, + 0xD6, 0x34, 0xAE, 0x2B, 0x17, 0x28, 0x9D, 0x3E, 0xE9, 0xF9, 0xD8, 0x2B, + 0x61, 0xF9, 0xBF, 0x1E, 0xCE, 0x12, 0x1F, 0x1A, 0x50, 0x1B, 0x1E, 0x19, + 0xB4, 0x21, 0x1C, 0x25, 0xA4, 0x18, 0x04, 0x1B, 0xCE, 0x06, 0x5A, 0x0C, + 0x46, 0x1D, 0x4C, 0x2D, 0x2E, 0x31, 0x0F, 0x38, 0x58, 0x0C, 0x0E, 0x04, + 0xBC, 0xF4, 0x3F, 0xF4, 0x0F, 0x03, 0x5E, 0x19, 0xBB, 0x01, 0x65, 0x25, + 0xFE, 0x08, 0x93, 0x1E, 0x8E, 0x27, 0x7F, 0x20, 0x01, 0x2A, 0x1B, 0x14, + 0x8E, 0x23, 0xFA, 0x10, 0x74, 0x22, 0x52, 0x26, 0x7C, 0x0D, 0x84, 0x21, + 0x8C, 0x14, 0xA2, 0x1F, 0xF9, 0x4B, 0x45, 0x43, 0x3D, 0x53, 0x01, 0x48, + 0x1F, 0x1F, 0x08, 0x2D, 0x22, 0x15, 0xB9, 0x31, 0x12, 0x2F, 0x93, 0x41, + 0x09, 0x39, 0x13, 0x39, 0x7B, 0x47, 0xB6, 0x38, 0xD4, 0x52, 0xD2, 0x47, + 0x77, 0x42, 0xB7, 0x4C, 0x29, 0x3A, 0xFF, 0x51, 0xD7, 0x34, 0x63, 0x4A, + 0xC5, 0x24, 0x97, 0x31, 0x00, 0x2A, 0x4C, 0x40, 0x7B, 0x39, 0x84, 0x5D, + 0xDB, 0x3A, 0xA0, 0x41, 0xA0, 0x3C, 0x35, 0x2D, 0x8D, 0x31, 0x93, 0x34, + 0x66, 0x0F, 0xF0, 0x2A, 0x3E, 0x03, 0x9E, 0x27, 0x07, 0x0A, 0xE0, 0x16, + 0x21, 0xF4, 0x1D, 0xEF, 0xF5, 0xF5, 0x15, 0xFA, 0x3F, 0x22, 0x53, 0x20, + 0x67, 0x18, 0xB0, 0x05, 0xAC, 0xF3, 0x56, 0xDD, 0x62, 0x04, 0xA4, 0xF7, + 0x0E, 0x0F, 0xA5, 0x1C, 0x42, 0x02, 0x9F, 0x18, 0x8B, 0x0E, 0x21, 0x0C, + 0x75, 0x10, 0xDE, 0xFB, 0x85, 0x0D, 0xAE, 0xEE, 0x87, 0x1B, 0xD9, 0xFC, + 0xA4, 0xFF, 0x4E, 0x00, 0x77, 0xD2, 0x3F, 0xEB, 0xE1, 0xE5, 0x98, 0xFC, + 0x6B, 0xFF, 0xFC, 0x11, 0x44, 0xE2, 0x86, 0xFA, 0xAE, 0xD6, 0x4A, 0xFB, + 0x6F, 0xF8, 0xF4, 0x17, 0xB7, 0x0F, 0xED, 0x12, 0x28, 0x08, 0x75, 0x05, + 0x1C, 0xFD, 0x6C, 0x0F, 0x2A, 0xF3, 0x05, 0x13, 0x6F, 0xF8, 0xC2, 0x19, + 0x1E, 0x06, 0xAB, 0x16, 0xEA, 0xF5, 0x3E, 0xF6, 0x71, 0xE5, 0xF0, 0xF4, + 0x55, 0xEF, 0xED, 0x09, 0x8A, 0xE1, 0x30, 0xF9, 0x7F, 0xC9, 0xE1, 0xE9, + 0xD1, 0xD6, 0x79, 0xF5, 0xBB, 0xE1, 0xBF, 0xEE, 0xCD, 0xE2, 0x69, 0xEE, + 0x2F, 0xDD, 0x43, 0xF5, 0xFB, 0xBD, 0xD9, 0xD4, 0xFA, 0xB5, 0x90, 0xBF, + 0xE6, 0xD5, 0xAC, 0xDC, 0xA3, 0xD0, 0x28, 0xD9, 0x8A, 0xB6, 0x19, 0xB0, + 0x57, 0xCB, 0x80, 0xBD, 0x00, 0xE5, 0x1F, 0xE3, 0xEE, 0xE1, 0x8B, 0xEB, + 0x6B, 0xEA, 0xC0, 0xF3, 0x6B, 0xE9, 0x19, 0xF2, 0xEE, 0xD4, 0x4C, 0xE0, + 0x5D, 0xE3, 0x7D, 0xE9, 0xEB, 0xEB, 0x20, 0xF2, 0xE5, 0xD2, 0x90, 0xE0, + 0x92, 0xD9, 0x8F, 0xF9, 0x27, 0xF8, 0x41, 0x1F, 0xB6, 0xF4, 0xED, 0xFD, + 0xA4, 0xF1, 0x83, 0xE8, 0x81, 0x0A, 0xF4, 0x0C, 0x46, 0x11, 0xBD, 0x0E, + 0x62, 0xFF, 0xB5, 0xEC, 0xDD, 0xF8, 0x24, 0xE6, 0x92, 0xFC, 0x41, 0xEB, + 0x74, 0xFD, 0x49, 0xF5, 0xEB, 0x07, 0x5D, 0x06, 0xFF, 0x03, 0x62, 0xF3, + 0xED, 0xF1, 0x1E, 0xD7, 0x75, 0xEB, 0xD4, 0xE7, 0x9D, 0xDB, 0x0C, 0xFF, + 0x18, 0xD5, 0x3E, 0xF0, 0x45, 0xF5, 0xC6, 0xE7, 0x1E, 0x06, 0x6B, 0xEC, + 0x6A, 0xFB, 0xBC, 0xEC, 0xBC, 0xEF, 0xF1, 0xF1, 0x1E, 0xD0, 0xF2, 0xDE, + 0xDC, 0xBF, 0x17, 0xC2, 0x46, 0xEF, 0xC0, 0xE0, 0xFB, 0x0E, 0xF6, 0x0B, + 0x61, 0xED, 0xF5, 0xF5, 0x7E, 0xD6, 0x03, 0xE3, 0x10, 0xE5, 0xEC, 0xF9, + 0xD2, 0xE8, 0x08, 0xFF, 0xB5, 0xE3, 0xE2, 0xFA, 0x1F, 0xE9, 0x53, 0x08, + 0x00, 0xE6, 0xBF, 0x0F, 0xB2, 0xEE, 0x46, 0x0E, 0x64, 0xFF, 0x1D, 0x0E, + 0xC1, 0xE5, 0x89, 0x02, 0xC6, 0xD0, 0x2A, 0x01, 0xF9, 0xF9, 0x4D, 0x17, + 0x4C, 0x15, 0x1E, 0x15, 0x3F, 0x00, 0xC1, 0xFB, 0x35, 0xF9, 0xCA, 0x06, + 0xE5, 0xFD, 0x65, 0x26, 0x43, 0xF5, 0x99, 0x15, 0x9B, 0xF1, 0x9E, 0xED, + 0x7E, 0xF9, 0x22, 0xE4, 0x1E, 0x00, 0x4A, 0xE6, 0x54, 0x04, 0xC2, 0xF1, + 0x1B, 0x01, 0xEA, 0xF4, 0xFB, 0x00, 0x37, 0xE8, 0xA7, 0x0F, 0x4E, 0xEB, + 0xAC, 0x1E, 0x5C, 0xF5, 0xEB, 0x14, 0xAB, 0xEB, 0xB8, 0x03, 0xE5, 0xE4, + 0x4D, 0xFA, 0x88, 0xEE, 0xD3, 0xED, 0x80, 0xF2, 0xEA, 0xE9, 0x12, 0xEF, + 0xFC, 0xDE, 0x49, 0xD0, 0xA7, 0xC2, 0x8A, 0xA8, 0xB7, 0xCF, 0xA1, 0xBC, + 0xDC, 0xFD, 0x5C, 0xF0, 0x9B, 0xF5, 0x69, 0xEA, 0x5E, 0xD7, 0xCA, 0xD0, + 0xDE, 0xEA, 0xD0, 0xDF, 0x00, 0xFD, 0x52, 0xF0, 0x2F, 0xE9, 0x5D, 0xF8, + 0x94, 0xDD, 0x3D, 0xFD, 0xAD, 0xDC, 0x73, 0xEF, 0xD9, 0xDC, 0x1C, 0xE1, + 0xC1, 0xE0, 0x92, 0xE5, 0xFD, 0xCD, 0xB1, 0xE1, 0x4B, 0xBA, 0x58, 0xDC, + 0x7E, 0xD2, 0x1E, 0x01, 0x76, 0xF3, 0xD9, 0x15, 0x28, 0xF8, 0xA2, 0xF6, + 0xE4, 0x01, 0x95, 0xE4, 0xB2, 0x0D, 0x01, 0xF2, 0x96, 0x03, 0x7A, 0xF6, + 0xE7, 0xF4, 0x0D, 0xF2, 0x6E, 0xFD, 0x79, 0xF9, 0x45, 0x11, 0xFF, 0xFA, + 0xE3, 0x1E, 0x44, 0x01, 0xC6, 0x15, 0xA3, 0xF9, 0x9B, 0xF9, 0x11, 0xE2, + 0x5F, 0xF5, 0xEF, 0xED, 0x07, 0x00, 0xBB, 0xFE, 0x30, 0xF8, 0x4F, 0xE6, + 0x44, 0xF3, 0xE9, 0xCF, 0x27, 0xFF, 0x53, 0xD7, 0x68, 0x01, 0x18, 0xE2, + 0xF3, 0xF3, 0xFD, 0xF3, 0x95, 0xDD, 0xF7, 0xF2, 0x62, 0xC3, 0x8A, 0xC6, + 0xE3, 0xCC, 0x05, 0xBB, 0xCB, 0xFC, 0x40, 0xE5, 0xAA, 0xF5, 0x20, 0xE8, + 0x96, 0xBF, 0x37, 0xC7, 0xDF, 0xAE, 0xD7, 0xCD, 0xDD, 0xB5, 0x0A, 0xE2, + 0x74, 0xC0, 0x7A, 0xD5, 0x97, 0xD8, 0x63, 0xCE, 0xE0, 0xE2, 0xCB, 0xD0, + 0x0E, 0xE5, 0xBC, 0xD3, 0x49, 0xF4, 0x91, 0xE8, 0xF9, 0xFA, 0x68, 0xE6, + 0xE7, 0xED, 0x8F, 0xCD, 0x8D, 0xED, 0x9F, 0xDC, 0x30, 0xF8, 0x48, 0xF8, + 0x39, 0xEA, 0x1D, 0xF2, 0x95, 0xE1, 0xDA, 0xED, 0x33, 0xE7, 0x4D, 0xF3, + 0xF0, 0xE3, 0xAE, 0xFE, 0x06, 0xE8, 0xD0, 0x04, 0xCB, 0xFA, 0x8E, 0xF6, + 0x83, 0x04, 0xF4, 0xE6, 0xBD, 0x0B, 0x73, 0xF3, 0xEA, 0x11, 0x30, 0x07, + 0x39, 0x00, 0x11, 0xFC, 0x5E, 0xFA, 0x07, 0xFE, 0xF5, 0x07, 0xBC, 0x13, + 0x32, 0xF9, 0x3F, 0x05, 0x60, 0xDF, 0xA3, 0xE3, 0x72, 0xD6, 0xA8, 0xDC, + 0x62, 0xD0, 0xEC, 0xDA, 0xBF, 0xD7, 0x48, 0xE2, 0x3A, 0xE5, 0x13, 0xED, + 0xA2, 0xDC, 0xC6, 0xD2, 0xC5, 0xDB, 0x25, 0xB9, 0x4C, 0x0A, 0x8F, 0xD1, + 0x2E, 0x25, 0x11, 0xE5, 0x33, 0xFD, 0xA4, 0xD3, 0x8A, 0xD9, 0x79, 0xD9, + 0xDA, 0xE7, 0x2E, 0xF4, 0xD2, 0x08, 0x42, 0xF4, 0x0A, 0x19, 0xF0, 0xE4, + 0x1A, 0x0B, 0xA7, 0xD5, 0x4B, 0xF2, 0x5B, 0xD9, 0x73, 0x00, 0x58, 0xEC, + 0xA6, 0x1D, 0xB1, 0xEC, 0x84, 0x10, 0xAB, 0xDF, 0x5F, 0x04, 0x51, 0xEA, + 0x75, 0x15, 0x6D, 0x0C, 0x49, 0x17, 0x78, 0x15, 0x0F, 0x11, 0x9D, 0x12, + 0xA3, 0x16, 0x5E, 0x20, 0xC3, 0x1F, 0x62, 0x2B, 0x53, 0x1A, 0xE1, 0x28, + 0x38, 0x03, 0x95, 0x19, 0x7D, 0xFA, 0xF8, 0x0A, 0x2E, 0x0A, 0xD1, 0x11, + 0x94, 0x16, 0xD2, 0x20, 0xB3, 0x0A, 0x34, 0x12, 0x4E, 0x02, 0x2F, 0x01, + 0xEC, 0x05, 0x75, 0x0A, 0x3C, 0xFD, 0x40, 0x11, 0x0E, 0xF2, 0x76, 0x03, + 0x32, 0xFB, 0x0F, 0xF9, 0xB1, 0x08, 0xD0, 0xFD, 0x1F, 0x25, 0xF5, 0x0E, + 0xF7, 0x33, 0x18, 0x1B, 0x08, 0x02, 0x88, 0xFD, 0x68, 0xD7, 0x49, 0xDD, + 0xE5, 0xFE, 0x08, 0xF0, 0xD1, 0x2D, 0x02, 0x02, 0x14, 0x15, 0x9E, 0xF0, + 0x26, 0xF1, 0x83, 0xEB, 0x63, 0xF6, 0x8A, 0x03, 0x61, 0x04, 0x5D, 0x16, + 0xE8, 0x12, 0x2A, 0x0F, 0x44, 0x23, 0x57, 0xFC, 0xD2, 0x27, 0x95, 0xF9, + 0x35, 0x30, 0xF5, 0x12, 0x34, 0x32, 0x7F, 0x29, 0x53, 0x23, 0xF5, 0x26, + 0xBC, 0x1B, 0x60, 0x17, 0xC6, 0x1B, 0x91, 0x16, 0xD2, 0x0C, 0x99, 0x0F, + 0xE5, 0xF9, 0x86, 0xFF, 0x4C, 0xFC, 0x72, 0x0D, 0x37, 0x15, 0x62, 0x22, + 0x98, 0x32, 0x1E, 0x2E, 0x85, 0x35, 0x16, 0x2B, 0x37, 0x2C, 0x39, 0x21, + 0x38, 0x34, 0x5F, 0x20, 0x04, 0x40, 0x3D, 0x22, 0xBA, 0x2F, 0x06, 0x1A, + 0xE2, 0x1E, 0x1B, 0x1E, 0xDF, 0x25, 0x2D, 0x2F, 0xF1, 0x22, 0x67, 0x2B, + 0x04, 0x11, 0x10, 0x22, 0x4D, 0x0F, 0xF2, 0x1C, 0xB9, 0x14, 0x2F, 0x15, + 0x05, 0x1C, 0x18, 0x1F, 0x81, 0x32, 0x47, 0x34, 0xCD, 0x2A, 0xC8, 0x22, + 0xFD, 0x06, 0xE8, 0xF7, 0x07, 0x11, 0x6F, 0x02, 0xE9, 0x33, 0x1F, 0x26, + 0x39, 0x2B, 0x24, 0x1A, 0x2C, 0x14, 0x34, 0x04, 0xAA, 0x13, 0x6F, 0x15, + 0x68, 0x23, 0x77, 0x25, 0x68, 0x2C, 0x64, 0x21, 0x3E, 0x25, 0x66, 0x1F, + 0xF0, 0x18, 0xC0, 0x0E, 0x23, 0x0A, 0x05, 0x10, 0xCC, 0x02, 0xE9, 0x2B, + 0xCD, 0x11, 0x45, 0x35, 0xE8, 0x31, 0xA8, 0x30, 0x50, 0x4C, 0x57, 0x34, + 0x8E, 0x4F, 0x8D, 0x3D, 0xB0, 0x44, 0xFA, 0x40, 0x3A, 0x43, 0x5A, 0x42, + 0x17, 0x46, 0xCC, 0x3F, 0x07, 0x49, 0xE2, 0x40, 0xDD, 0x4E, 0x87, 0x43, + 0xEC, 0x4D, 0x5A, 0x42, 0xF6, 0x44, 0xE0, 0x42, 0x8E, 0x3E, 0xAB, 0x53, + 0x59, 0x34, 0xFA, 0x65, 0x37, 0x30, 0xE9, 0x5C, 0x95, 0x3D, 0x37, 0x55, + 0x5E, 0x45, 0xA7, 0x53, 0x93, 0x3C, 0x46, 0x46, 0x4E, 0x2E, 0x5B, 0x41, + 0x14, 0x22, 0x92, 0x4A, 0x7D, 0x19, 0x39, 0x4F, 0xD5, 0x23, 0xEC, 0x55, + 0x37, 0x2D, 0x7F, 0x4B, 0x61, 0x15, 0x0E, 0x16, 0x42, 0xFE, 0x6D, 0xF7, + 0xA0, 0x0F, 0xED, 0x1C, 0x71, 0x1F, 0xA1, 0x25, 0x73, 0x19, 0x00, 0xFF, + 0xED, 0x25, 0x64, 0xFC, 0x9D, 0x42, 0x58, 0x14, 0x09, 0x4A, 0xC7, 0x1A, + 0xDF, 0x3A, 0x23, 0x19, 0x28, 0x26, 0x63, 0x12, 0x14, 0x12, 0x76, 0x04, + 0x45, 0x14, 0x86, 0x04, 0x54, 0x22, 0x94, 0x06, 0xCC, 0x1E, 0x98, 0x00, + 0xBA, 0x0F, 0x5D, 0x02, 0xB0, 0x07, 0x9B, 0x0E, 0x20, 0x06, 0xA8, 0x0C, + 0x1A, 0x0B, 0x52, 0x09, 0xF4, 0x1E, 0xB0, 0x1A, 0xC7, 0x33, 0xF2, 0x32, + 0xB6, 0x31, 0x99, 0x39, 0xB9, 0x1B, 0x76, 0x2F, 0xFA, 0xFD, 0x5B, 0x23, + 0x58, 0xEB, 0x1A, 0x17, 0xE6, 0xFA, 0x6A, 0x1A, 0x19, 0x04, 0x8A, 0x13, + 0xB3, 0xEF, 0x13, 0x0A, 0x62, 0xE2, 0xCD, 0x1A, 0xF3, 0xE8, 0x7A, 0x1F, + 0x26, 0xE8, 0xAB, 0x05, 0x23, 0xDE, 0xD3, 0xF0, 0xA0, 0xD4, 0xE2, 0xF0, + 0x3F, 0xDD, 0x0E, 0xFA, 0xCD, 0xEF, 0x09, 0xFC, 0xB3, 0xE0, 0xAD, 0xDF, + 0x0C, 0xC2, 0xE5, 0xBB, 0xFF, 0xD7, 0x71, 0xC7, 0x80, 0xFE, 0x39, 0xE2, + 0x5C, 0xE4, 0x88, 0xD9, 0x23, 0xC9, 0x73, 0xCA, 0x80, 0xE4, 0x84, 0xD5, + 0x0C, 0xFD, 0xBF, 0xEE, 0xF8, 0xF9, 0x6B, 0xF6, 0xB9, 0xF2, 0xF2, 0xF5, + 0xDA, 0xEB, 0xDB, 0xF5, 0x44, 0xEA, 0xA0, 0xF5, 0xBD, 0xF1, 0xD7, 0xF7, + 0xE3, 0xF5, 0x6D, 0xF3, 0xE5, 0xF0, 0xEB, 0xEC, 0xC1, 0xF1, 0x43, 0xEA, + 0xAC, 0xF7, 0x94, 0xE9, 0xAF, 0xEF, 0x7F, 0xEE, 0xD0, 0xE5, 0x48, 0xFD, + 0xE8, 0xEF, 0x68, 0x0A, 0xE2, 0x01, 0x6F, 0x0F, 0x0F, 0x01, 0x61, 0x01, + 0x35, 0xF1, 0x02, 0xF4, 0x4B, 0xE2, 0xD3, 0xF7, 0xF1, 0xF1, 0x3A, 0xFB, + 0x04, 0x0F, 0x67, 0xF9, 0xF4, 0x12, 0x31, 0xF9, 0x5C, 0x13, 0x36, 0xFF, + 0xF0, 0x06, 0xAC, 0x03, 0xA1, 0xEC, 0xF4, 0xFE, 0x9A, 0xEC, 0x1F, 0xF4, + 0x50, 0xF4, 0x29, 0xEC, 0x4C, 0xF6, 0x56, 0xF5, 0xB0, 0x07, 0x92, 0x06, + 0x3E, 0x05, 0xA3, 0xFB, 0x81, 0xE3, 0xBB, 0xDF, 0x9D, 0xE6, 0xB7, 0xED, + 0x39, 0x11, 0xA2, 0x1D, 0x62, 0x12, 0xF3, 0x24, 0x25, 0xF6, 0x99, 0x0B, + 0xB4, 0x00, 0x26, 0x0B, 0x96, 0x1D, 0x6B, 0x22, 0x0E, 0x13, 0x4B, 0x2E, + 0x4C, 0xF2, 0x81, 0x26, 0xE8, 0xE4, 0x24, 0x18, 0xEF, 0xE9, 0xE7, 0x13, + 0x5B, 0xFC, 0x02, 0x19, 0xF2, 0x11, 0x0B, 0x1F, 0x98, 0x19, 0xE3, 0x24, + 0xC6, 0x15, 0x01, 0x22, 0xC9, 0x0C, 0x0F, 0x1F, 0xFB, 0x0A, 0x27, 0x22, + 0x5D, 0x15, 0xCB, 0x23, 0xA9, 0x1E, 0x4C, 0x1C, 0x3B, 0x2F, 0x10, 0x17, + 0x30, 0x2F, 0xCC, 0x16, 0x00, 0x17, 0x8B, 0x0C, 0x9D, 0x05, 0x03, 0x06, + 0x55, 0x06, 0x9E, 0x05, 0xB2, 0x12, 0xFB, 0x00, 0xD7, 0x24, 0xDB, 0xFD, + 0xFF, 0x3A, 0xAE, 0x03, 0xC7, 0x35, 0xFA, 0x11, 0xDE, 0x0F, 0xA8, 0x13, + 0x62, 0xF6, 0x4F, 0x0B, 0x80, 0xF1, 0xFE, 0x08, 0xC6, 0xED, 0xCC, 0x06, + 0x26, 0x00, 0xD2, 0x09, 0x2A, 0x10, 0xBD, 0x00, 0x44, 0xF4, 0x89, 0xD6, + 0xA2, 0xDA, 0x44, 0xC6, 0x96, 0xE8, 0x8C, 0xF8, 0x04, 0xF2, 0xAC, 0x12, + 0x12, 0xDF, 0xDE, 0xF0, 0xD7, 0xDE, 0x73, 0xDF, 0x26, 0xF9, 0x8F, 0xF4, + 0xF8, 0xFF, 0x27, 0xFD, 0x2E, 0xE8, 0x76, 0xEE, 0xA4, 0xD2, 0x91, 0xE7, + 0x00, 0xD8, 0xF6, 0xE7, 0xBF, 0xE7, 0x1F, 0xE9, 0xD7, 0xF1, 0xD9, 0xF1, + 0x0B, 0xF6, 0x1F, 0xF8, 0x19, 0xE7, 0x82, 0xEF, 0x0E, 0xD1, 0x01, 0xE6, + 0xF8, 0xD4, 0x5A, 0xE4, 0xF6, 0xF0, 0xB4, 0xEC, 0xC9, 0x04, 0x50, 0xF3, + 0x4F, 0x0A, 0x57, 0xF4, 0xBB, 0x05, 0xA6, 0xF7, 0x26, 0xF5, 0x90, 0xF6, + 0x0C, 0xED, 0xA7, 0xE9, 0xD3, 0xF1, 0xAC, 0xDD, 0xA4, 0xFB, 0x2B, 0xE1, + 0xEE, 0x03, 0xAB, 0xE6, 0x56, 0xF8, 0x84, 0xE7, 0x69, 0xDC, 0x9C, 0xF0, + 0x59, 0xD1, 0xC9, 0xEC, 0xA2, 0xD1, 0xC4, 0xCB, 0x1F, 0xD1, 0xA0, 0xBC, + 0xA5, 0xCC, 0xC6, 0xCC, 0x4F, 0xD1, 0x82, 0xE6, 0x9F, 0xDF, 0x2F, 0xEC, + 0x6F, 0xC8, 0x58, 0xCA, 0x2E, 0xAA, 0x7E, 0xA0, 0xA1, 0xB8, 0x1F, 0xAC, + 0xBA, 0xC8, 0x02, 0xD7, 0x08, 0xB7, 0x32, 0xD6, 0x33, 0xA9, 0x3C, 0xBC, + 0xC7, 0xC2, 0x41, 0xB7, 0xA7, 0xDF, 0x30, 0xC0, 0xA0, 0xD2, 0xAE, 0xBD, + 0xBA, 0xB1, 0x73, 0xBB, 0x89, 0xAF, 0xBB, 0xC3, 0x09, 0xC6, 0x1A, 0xC7, + 0x28, 0xD9, 0x03, 0xC3, 0x24, 0xE5, 0x8E, 0xCA, 0xEC, 0xD4, 0xF5, 0xCE, + 0x06, 0xB5, 0x1A, 0xC7, 0x08, 0xAA, 0x83, 0xC8, 0xDA, 0xB1, 0x1E, 0xD3, + 0x32, 0xBE, 0xAD, 0xD8, 0xDF, 0xD6, 0x1E, 0xCB, 0xAC, 0xEE, 0xCD, 0xBB, + 0x76, 0xED, 0x5B, 0xC1, 0x25, 0xD6, 0x54, 0xD1, 0xB4, 0xB7, 0xD4, 0xD9, + 0x48, 0xBA, 0xB7, 0xD8, 0x01, 0xD4, 0xDE, 0xCF, 0x8C, 0xDE, 0xE6, 0xC6, + 0x12, 0xDA, 0x7B, 0xC6, 0x65, 0xCF, 0x30, 0xD2, 0x07, 0xBE, 0x94, 0xCC, + 0x2F, 0xB6, 0x10, 0xB7, 0x4E, 0xBC, 0xCA, 0xB1, 0x72, 0xC7, 0xE8, 0xC5, + 0xE7, 0xD6, 0xB2, 0xD5, 0x7A, 0xD3, 0xAF, 0xBE, 0x2E, 0xBD, 0xBF, 0x9D, + 0x7D, 0xBC, 0x1D, 0xA8, 0x30, 0xD1, 0xA3, 0xD3, 0x2A, 0xCF, 0xB2, 0xDF, + 0xF4, 0xC0, 0x32, 0xC9, 0xC0, 0xCD, 0x27, 0xBA, 0x8E, 0xED, 0x8A, 0xCE, + 0xF8, 0xF3, 0x4D, 0xEA, 0x22, 0xDD, 0xBB, 0xE7, 0xD4, 0xCF, 0x5E, 0xDC, + 0x6D, 0xD7, 0x09, 0xDB, 0xDA, 0xE4, 0x1D, 0xD9, 0xA4, 0xF2, 0xFF, 0xE1, + 0x0B, 0xF5, 0x55, 0xEE, 0x79, 0xED, 0x3F, 0xDF, 0x8E, 0xF1, 0x2C, 0xD6, + 0x07, 0xF8, 0xF3, 0xF0, 0xD5, 0xF3, 0x96, 0x08, 0x46, 0xE4, 0x6E, 0xFE, + 0x6F, 0xDF, 0x0D, 0xF1, 0x5D, 0xF1, 0xBC, 0xF8, 0xE6, 0x07, 0xF2, 0x00, + 0x3D, 0x09, 0x53, 0xF9, 0x47, 0x03, 0xB4, 0xF3, 0x98, 0x02, 0x31, 0xEF, + 0x9B, 0xFC, 0x6D, 0xE3, 0x4B, 0xF4, 0x16, 0xEB, 0x07, 0xED, 0x29, 0x03, + 0x53, 0xE6, 0xFE, 0xFB, 0x99, 0xE5, 0xD3, 0xDF, 0x41, 0xF6, 0x6E, 0xD6, + 0x64, 0x02, 0xBE, 0xE0, 0xC1, 0x03, 0x15, 0xFB, 0xCF, 0xFF, 0x10, 0x03, + 0xB9, 0xEB, 0xEE, 0xE8, 0x46, 0xDE, 0x91, 0xDD, 0x1F, 0xF3, 0xE4, 0xFB, + 0x79, 0x04, 0x09, 0x0B, 0x33, 0xF3, 0x6C, 0xF2, 0xDD, 0xED, 0xBD, 0xE2, + 0xDE, 0x0B, 0xB7, 0xFF, 0x49, 0x23, 0x1B, 0x1E, 0x0D, 0x1A, 0x9E, 0x18, + 0x25, 0x03, 0x03, 0x10, 0x21, 0x03, 0x22, 0x07, 0x04, 0x0A, 0xF8, 0xF9, + 0x88, 0x03, 0xB1, 0xF9, 0x63, 0x08, 0x59, 0x01, 0x3F, 0x09, 0x63, 0x05, + 0x76, 0xFA, 0xAB, 0x02, 0x97, 0xFB, 0x92, 0x06, 0x83, 0x18, 0xE4, 0x18, + 0x5B, 0x29, 0xBB, 0x1E, 0x98, 0x24, 0x17, 0x17, 0x3C, 0x25, 0xF1, 0x13, + 0x37, 0x25, 0x8B, 0x13, 0x6C, 0x11, 0x75, 0x11, 0x63, 0xFD, 0x22, 0x1C, + 0x4C, 0x03, 0x04, 0x23, 0x7A, 0x0A, 0xA4, 0x0A, 0xDD, 0x0C, 0x9B, 0xFE, + 0x38, 0x17, 0x41, 0x16, 0xE6, 0x16, 0xE1, 0x22, 0x7C, 0x02, 0x23, 0x14, + 0xAD, 0xFA, 0x00, 0x0A, 0x71, 0x0D, 0x5C, 0x07, 0x75, 0x2D, 0x72, 0x04, + 0x5E, 0x35, 0xBF, 0xFB, 0x8F, 0x16, 0xA1, 0xEB, 0xAC, 0x00, 0x7C, 0xE4, + 0x2D, 0x0F, 0xBF, 0xFE, 0x67, 0x16, 0x03, 0x20, 0x30, 0xF6, 0xD3, 0x13, + 0x44, 0xDE, 0x8A, 0xEF, 0x22, 0xFD, 0x08, 0xE9, 0x1F, 0x2D, 0xFD, 0x01, + 0xE6, 0x2F, 0x9C, 0x15, 0x0F, 0x17, 0x76, 0x1C, 0x4C, 0x11, 0x58, 0x24, + 0xBC, 0x13, 0xB1, 0x1A, 0xFC, 0x11, 0xB5, 0x08, 0xAF, 0x20, 0x88, 0x18, + 0x05, 0x2A, 0x77, 0x2C, 0x9D, 0x1E, 0x3D, 0x20, 0x8B, 0x19, 0x47, 0x0C, + 0xCB, 0x30, 0xA5, 0x1A, 0x44, 0x46, 0xED, 0x38, 0x90, 0x3A, 0x4D, 0x3B, + 0x43, 0x1F, 0x9E, 0x37, 0x21, 0x12, 0xB7, 0x45, 0xEE, 0x1D, 0xD6, 0x43, + 0x49, 0x28, 0x8A, 0x2F, 0xF9, 0x37, 0xBB, 0x2E, 0x01, 0x44, 0x00, 0x30, + 0x06, 0x41, 0x89, 0x2A, 0xD0, 0x39, 0x2C, 0x32, 0x74, 0x29, 0x40, 0x46, + 0x7A, 0x14, 0xA1, 0x3C, 0x8E, 0x07, 0x3F, 0x1F, 0xBC, 0x0D, 0xFB, 0x15, + 0xAB, 0x1F, 0x05, 0x19, 0x0E, 0x1C, 0x09, 0x1D, 0x03, 0xF7, 0x74, 0x0B, + 0x23, 0xDE, 0xA9, 0xE9, 0x3B, 0xFB, 0x76, 0xE9, 0xBD, 0x30, 0x56, 0x02, + 0xFC, 0x46, 0x6F, 0xFE, 0xBC, 0x31, 0x9F, 0xE7, 0x3E, 0x10, 0xC3, 0xE8, + 0xBE, 0x07, 0xDA, 0x0B, 0xCC, 0x0F, 0x80, 0x1E, 0x2A, 0x19, 0x19, 0x0A, + 0x27, 0x1E, 0x46, 0xFD, 0x01, 0x19, 0xB5, 0x00, 0xF1, 0x14, 0xD2, 0x04, + 0xF8, 0x17, 0x1D, 0x12, 0x73, 0x18, 0x3D, 0x18, 0x6E, 0x08, 0x50, 0x06, + 0x48, 0xF9, 0x10, 0xFD, 0x1C, 0x0A, 0xF9, 0x15, 0x27, 0x28, 0x8C, 0x2D, + 0xB6, 0x28, 0x7D, 0x26, 0x19, 0x1D, 0x1A, 0x1B, 0xBD, 0x20, 0x57, 0x24, + 0x58, 0x1D, 0xC5, 0x36, 0xCA, 0x07, 0x32, 0x32, 0x14, 0xFF, 0xDB, 0x25, + 0xEC, 0x04, 0x3F, 0x23, 0x5A, 0xFF, 0xED, 0x1B, 0xE3, 0xF3, 0xD8, 0x21, + 0xFE, 0xFA, 0x7C, 0x2C, 0x9C, 0x07, 0xB7, 0x18, 0xAA, 0x00, 0x9E, 0xFE, + 0xF2, 0xEB, 0x5D, 0xFF, 0x03, 0xE4, 0xB3, 0x19, 0xFD, 0xF4, 0x37, 0x28, + 0xB3, 0x06, 0x27, 0xFF, 0xF7, 0xFE, 0xFC, 0xCE, 0xE4, 0xEF, 0x3C, 0xD6, + 0x9A, 0x05, 0xE4, 0xFF, 0x5B, 0x19, 0x32, 0x0E, 0xA5, 0x05, 0xE3, 0xF7, + 0x35, 0xF9, 0x33, 0xEE, 0x27, 0x0C, 0x9D, 0xFC, 0xFB, 0x19, 0x29, 0x0B, + 0xAB, 0x10, 0x30, 0x05, 0xCD, 0x08, 0xDB, 0xF9, 0x52, 0x07, 0x8D, 0xFC, + 0x3D, 0xFB, 0x5E, 0x07, 0xF1, 0xF9, 0x75, 0x18, 0xDE, 0x09, 0x23, 0x1E, + 0x97, 0x08, 0x54, 0x0F, 0xD1, 0xFD, 0xA1, 0x04, 0xDC, 0xFE, 0xD2, 0x12, + 0xA0, 0x0B, 0x3E, 0x2B, 0xD0, 0x06, 0xD7, 0x24, 0x66, 0xF7, 0x87, 0x07, + 0x76, 0xF7, 0x1A, 0xFF, 0x5D, 0xFD, 0xAF, 0x09, 0x12, 0x03, 0xA4, 0x0E, + 0x58, 0x15, 0xA6, 0x17, 0x1D, 0x2E, 0xDE, 0x16, 0xF5, 0x1C, 0x83, 0x02, + 0x0D, 0xF8, 0x39, 0x0A, 0xB9, 0xFC, 0x72, 0x25, 0x3A, 0x15, 0xC7, 0x24, + 0x35, 0x13, 0x3C, 0x0C, 0xCD, 0x0B, 0x0E, 0x06, 0x44, 0x18, 0xF8, 0x11, + 0x0A, 0x2A, 0x5E, 0x16, 0xD0, 0x25, 0x3F, 0x17, 0xA1, 0x08, 0x4A, 0x0C, + 0xE3, 0xFD, 0x97, 0x08, 0x6F, 0x1D, 0x3A, 0x25, 0xB4, 0x3C, 0x8C, 0x3A, + 0x03, 0x35, 0xA7, 0x26, 0x03, 0x20, 0x71, 0x12, 0x2E, 0x1E, 0x76, 0x28, + 0x36, 0x25, 0x98, 0x4F, 0xBD, 0x20, 0xE3, 0x60, 0xF1, 0x21, 0xDA, 0x51, + 0x81, 0x30, 0xF2, 0x39, 0xBC, 0x36, 0xCD, 0x2A, 0x89, 0x28, 0xA1, 0x28, + 0x60, 0x1B, 0xDE, 0x38, 0xDE, 0x18, 0x9B, 0x42, 0x84, 0x12, 0x44, 0x31, + 0xE4, 0x11, 0x80, 0x24, 0xB2, 0x23, 0x26, 0x35, 0x95, 0x3B, 0x60, 0x44, + 0x38, 0x39, 0x66, 0x39, 0x1F, 0x2D, 0xF3, 0x2C, 0x19, 0x30, 0xEF, 0x28, + 0x39, 0x35, 0xFD, 0x24, 0x0D, 0x45, 0xEB, 0x25, 0x5D, 0x53, 0x79, 0x28, + 0xA8, 0x39, 0xAB, 0x1F, 0x2F, 0x1D, 0x09, 0x19, 0x4E, 0x26, 0x37, 0x29, + 0x3C, 0x30, 0x27, 0x38, 0xB5, 0x25, 0x94, 0x29, 0xDE, 0x16, 0xD3, 0x10, + 0xDC, 0x0E, 0x73, 0x08, 0xA9, 0x09, 0xAA, 0x13, 0x7C, 0x03, 0xEC, 0x20, + 0x32, 0xF6, 0x68, 0x13, 0x0D, 0xF4, 0x51, 0xFD, 0x59, 0x0A, 0xA6, 0x03, + 0xC5, 0x1A, 0x45, 0x22, 0x53, 0x0D, 0xE1, 0x2D, 0x35, 0xF0, 0x2E, 0x0F, + 0xEE, 0xE8, 0x40, 0xEF, 0x50, 0x00, 0xAB, 0xF6, 0x8B, 0x15, 0x33, 0x0F, + 0x81, 0x13, 0xEB, 0x0F, 0x8E, 0x08, 0xDE, 0x08, 0x4E, 0xF7, 0xE6, 0xFF, + 0xD4, 0xE4, 0x7F, 0xEA, 0x41, 0xEA, 0x8B, 0xF2, 0x23, 0xFF, 0xC5, 0x07, + 0x40, 0x10, 0x68, 0xFC, 0x34, 0x16, 0xB6, 0xEA, 0x8E, 0x16, 0xE7, 0xF3, + 0x62, 0x19, 0xC8, 0x08, 0x1E, 0x0A, 0x68, 0x0A, 0x9A, 0xF8, 0x34, 0xFC, + 0x0C, 0xFB, 0x80, 0xF5, 0x4C, 0x04, 0x84, 0x00, 0xCC, 0x10, 0x89, 0x0D, + 0xE4, 0x12, 0x9D, 0x0E, 0x51, 0x03, 0x04, 0xFF, 0xC3, 0xED, 0x35, 0xEC, + 0x1E, 0xDA, 0x07, 0xF1, 0x85, 0xD2, 0xE3, 0xFF, 0xDB, 0xD2, 0x1C, 0xF7, + 0x9D, 0xD1, 0x0A, 0xDD, 0x62, 0xC4, 0x2D, 0xCF, 0xAA, 0xBB, 0x25, 0xD8, + 0xEE, 0xC6, 0x7E, 0xF0, 0xD5, 0xC3, 0xA1, 0xED, 0x59, 0xAE, 0x09, 0xCC, + 0x53, 0xAA, 0xB0, 0xBD, 0x34, 0xC6, 0x7E, 0xCF, 0xC6, 0xD6, 0xDC, 0xD8, + 0x1D, 0xCA, 0x3F, 0xC5, 0xFF, 0xC5, 0xED, 0xB2, 0xC8, 0xCC, 0xB2, 0xB7, + 0x4C, 0xD0, 0xFE, 0xCB, 0x5A, 0xD5, 0x4D, 0xDB, 0x25, 0xE1, 0x4E, 0xDE, + 0x54, 0xED, 0xEF, 0xD1, 0x0B, 0xE1, 0xFD, 0xC6, 0x49, 0xD1, 0xEE, 0xD3, + 0x38, 0xDA, 0x0C, 0xE6, 0x49, 0xD8, 0xCC, 0xE5, 0x52, 0xCB, 0xE0, 0xD6, + 0x70, 0xD8, 0xE7, 0xC8, 0x10, 0xEE, 0x75, 0xCE, 0xCF, 0xEB, 0x29, 0xD7, + 0xFA, 0xDE, 0x27, 0xDA, 0x3A, 0xD4, 0x3B, 0xE1, 0xEF, 0xCE, 0x90, 0xE7, + 0xB9, 0xD3, 0x49, 0xF3, 0x2E, 0xE1, 0x5F, 0xF8, 0x86, 0xE7, 0xB7, 0xEC, + 0xAB, 0xE2, 0x5B, 0xE0, 0xA2, 0xE1, 0x16, 0xE0, 0x43, 0xDF, 0x14, 0xED, + 0xA6, 0xDF, 0x21, 0xF4, 0x20, 0xDE, 0x08, 0xE1, 0xA2, 0xCD, 0xB9, 0xC8, + 0x7A, 0xC1, 0xD8, 0xC1, 0xF9, 0xD2, 0x23, 0xD2, 0x23, 0xE0, 0x02, 0xE6, + 0x5F, 0xCD, 0x6E, 0xD8, 0xC4, 0xC9, 0xD3, 0xC8, 0x9C, 0xE6, 0x9E, 0xD3, + 0xAD, 0xEF, 0x82, 0xDE, 0xCB, 0xE3, 0x7B, 0xDE, 0x22, 0xE3, 0xF6, 0xE2, + 0xD8, 0xEC, 0x9F, 0xFA, 0x29, 0xF6, 0xDB, 0x06, 0x95, 0xF5, 0x64, 0xF6, + 0xDD, 0xFE, 0x78, 0xEF, 0x1E, 0x04, 0xD5, 0xF6, 0x8A, 0xF0, 0x50, 0xF2, + 0x73, 0xE2, 0xD4, 0xE9, 0x73, 0xEC, 0xB6, 0xF0, 0xF7, 0xF5, 0x8E, 0xF9, + 0x65, 0xF8, 0x16, 0xF1, 0x0A, 0xFA, 0x94, 0xEE, 0x8D, 0xF8, 0x1A, 0x02, + 0xAE, 0xFA, 0xDA, 0x08, 0xCB, 0x03, 0x03, 0xFB, 0x3F, 0x04, 0x55, 0xEE, + 0xCC, 0xF7, 0x4A, 0xE3, 0x6A, 0xF4, 0x5F, 0xD9, 0x8A, 0x02, 0x38, 0xDA, + 0x6C, 0x12, 0x5D, 0xE7, 0x40, 0x07, 0xBE, 0xE5, 0x7D, 0xED, 0xCF, 0xD8, + 0x3F, 0xE9, 0xE6, 0xD9, 0x96, 0xF0, 0x1D, 0xDC, 0x51, 0xED, 0x20, 0xD2, + 0x39, 0xE3, 0xB7, 0xCC, 0x68, 0xD1, 0xA1, 0xD1, 0xCD, 0xCB, 0xF3, 0xDA, + 0x45, 0xCF, 0x14, 0xE8, 0xCA, 0xC5, 0x2F, 0xEA, 0x07, 0xCB, 0xC2, 0xD4, + 0xCF, 0xDE, 0xF5, 0xCC, 0xF9, 0xE2, 0x36, 0xDE, 0xAC, 0xD8, 0xC4, 0xE9, + 0x01, 0xC7, 0x4A, 0xE8, 0x6A, 0xCD, 0x05, 0xE9, 0xA7, 0xE3, 0xD5, 0xF3, + 0xD3, 0xDD, 0x6D, 0xF5, 0xAF, 0xDE, 0x28, 0xF8, 0xCF, 0xED, 0x98, 0x03, + 0xBF, 0xF0, 0x89, 0xF6, 0x71, 0xF7, 0x2A, 0xE5, 0xF2, 0xF7, 0x91, 0xF1, + 0x74, 0xF8, 0xEA, 0xF7, 0x98, 0xFD, 0xD2, 0xE9, 0x56, 0xF1, 0x42, 0xE0, + 0x47, 0xF3, 0x8F, 0xDE, 0xDF, 0x01, 0x0D, 0xE3, 0x4F, 0x06, 0xE1, 0xF3, + 0x36, 0x0D, 0x22, 0x04, 0x93, 0x0F, 0x35, 0x04, 0x6E, 0x12, 0xDC, 0xFF, + 0x73, 0x0B, 0xFE, 0x01, 0xA6, 0xFF, 0x98, 0x08, 0xEB, 0x01, 0x0A, 0x05, + 0x7F, 0x03, 0xB7, 0xF6, 0x6F, 0x07, 0x71, 0xF7, 0xC9, 0x15, 0x7D, 0x06, + 0xF6, 0x18, 0x57, 0x0B, 0xC5, 0x13, 0xAB, 0xFA, 0xC9, 0x0A, 0xE6, 0xE5, + 0xAD, 0xF5, 0x43, 0xE8, 0xC1, 0xEF, 0x8F, 0xFB, 0x52, 0xF1, 0x03, 0xFF, + 0x24, 0xF1, 0x11, 0xF2, 0x92, 0x08, 0xB6, 0xED, 0x4C, 0x1B, 0x61, 0xF5, + 0x08, 0x06, 0xED, 0xFD, 0xBA, 0xEE, 0x20, 0xF7, 0x6D, 0xF1, 0x34, 0xEB, + 0x21, 0x01, 0x2C, 0xF2, 0x2F, 0x11, 0x77, 0xFF, 0xF0, 0x17, 0xF8, 0x09, + 0xAB, 0x13, 0x97, 0x05, 0xFE, 0x15, 0x60, 0xFD, 0x07, 0x1C, 0x3A, 0x06, + 0x0C, 0x16, 0x10, 0x0F, 0x60, 0x11, 0xD8, 0x17, 0x7B, 0x15, 0x02, 0x1A, + 0x29, 0x1C, 0x2E, 0x17, 0x01, 0x10, 0x4F, 0x13, 0x6E, 0x03, 0xE0, 0x1B, + 0x74, 0x00, 0x0F, 0x30, 0x09, 0x02, 0x05, 0x38, 0x75, 0x2B, 0x64, 0x34, + 0x2E, 0x4D, 0x24, 0x2C, 0x05, 0x3C, 0xC4, 0x27, 0x3A, 0x30, 0xB5, 0x37, + 0xAF, 0x29, 0x98, 0x47, 0x14, 0x13, 0xBF, 0x35, 0xFD, 0x05, 0x18, 0x20, + 0xDF, 0xFB, 0x9C, 0x18, 0xF2, 0xEF, 0x85, 0x0C, 0xE1, 0xF3, 0xDA, 0x06, + 0xEA, 0xFE, 0xCC, 0x04, 0x5E, 0xFC, 0xC5, 0xF0, 0xE7, 0x0A, 0x20, 0xF0, + 0xD4, 0x1C, 0x17, 0xF8, 0x6D, 0x0C, 0x37, 0xE4, 0x45, 0x03, 0x4A, 0xD1, + 0x7F, 0x0B, 0xA4, 0xD7, 0x1B, 0x0D, 0xB1, 0xED, 0x66, 0x0C, 0x1F, 0xF0, + 0x14, 0x08, 0x2E, 0xE4, 0x56, 0x04, 0xC5, 0xE9, 0x50, 0x0D, 0xEB, 0xF0, + 0xEA, 0x0C, 0x79, 0xEB, 0x6B, 0xFF, 0x7E, 0xF1, 0xF1, 0xFB, 0xB5, 0xF9, + 0x63, 0xFA, 0x0F, 0xF3, 0x5E, 0xF6, 0xCF, 0xEF, 0x9D, 0xF9, 0x35, 0xFB, + 0x04, 0xFC, 0x6B, 0xFD, 0xFA, 0xFA, 0x3C, 0xFB, 0xFE, 0xF5, 0x33, 0x05, + 0xE1, 0xF8, 0x38, 0x07, 0x40, 0xFE, 0x02, 0x0E, 0xEF, 0xF7, 0xFE, 0x12, + 0x3A, 0x01, 0x72, 0x0D, 0x67, 0x11, 0x02, 0x0C, 0xBD, 0x04, 0x6D, 0x0F, + 0x04, 0xF9, 0x51, 0x13, 0xCD, 0xF9, 0x39, 0x12, 0x66, 0xF1, 0xE4, 0x0C, + 0x68, 0xF5, 0xD9, 0x03, 0x6D, 0x04, 0x27, 0xFA, 0xF3, 0x02, 0x5F, 0xF6, + 0x2E, 0xFB, 0x63, 0x03, 0x09, 0xFA, 0xBD, 0x10, 0xAE, 0xEF, 0xE3, 0x03, + 0x00, 0xF1, 0x7A, 0xF5, 0x0E, 0x03, 0x38, 0xF3, 0x16, 0x06, 0x65, 0xE3, + 0x04, 0xFE, 0x41, 0xD9, 0x49, 0xF3, 0x41, 0xDA, 0xFE, 0xF2, 0x27, 0xDC, + 0x12, 0xFA, 0x22, 0xEF, 0x06, 0xFA, 0xF2, 0xF8, 0x07, 0x00, 0x56, 0xEF, + 0xEF, 0x0F, 0x66, 0xF6, 0x7B, 0x16, 0xD8, 0x08, 0x46, 0x10, 0x53, 0x18, + 0x9E, 0x12, 0xB6, 0x21, 0x59, 0x18, 0x63, 0x15, 0x7A, 0x0A, 0x06, 0x04, + 0xC0, 0xFE, 0x69, 0x07, 0x79, 0xFE, 0x20, 0x11, 0x5C, 0xEF, 0x2D, 0x10, + 0x15, 0xEA, 0xBC, 0x0C, 0xD6, 0x07, 0xD3, 0x12, 0x3F, 0x1F, 0x27, 0x11, + 0x99, 0x1D, 0x22, 0x05, 0xC0, 0x16, 0x94, 0x07, 0x77, 0x10, 0x99, 0x0F, + 0x12, 0x14, 0xB0, 0x11, 0x85, 0x12, 0xBB, 0x13, 0x92, 0x0E, 0x87, 0x1E, + 0xEC, 0x12, 0x27, 0x27, 0x87, 0x11, 0x3A, 0x1A, 0xBA, 0x0B, 0xA3, 0x04, + 0xE6, 0x0B, 0x0E, 0x01, 0xAE, 0x0F, 0xA7, 0x08, 0x9C, 0x13, 0x1E, 0x16, + 0x56, 0x11, 0x4D, 0x23, 0xC8, 0x07, 0xAD, 0x21, 0x6C, 0x17, 0xD1, 0x22, + 0x87, 0x2A, 0xD0, 0x2D, 0xF2, 0x21, 0xAB, 0x28, 0x69, 0x21, 0xD5, 0x14, + 0x8B, 0x28, 0x24, 0x0D, 0xF9, 0x28, 0x0E, 0x1C, 0x98, 0x23, 0xEE, 0x2D, + 0xE4, 0x21, 0xD0, 0x37, 0xFE, 0x26, 0xCB, 0x3B, 0x29, 0x29, 0x30, 0x36, + 0xAC, 0x2A, 0x2F, 0x31, 0x37, 0x22, 0x7A, 0x2F, 0x36, 0x13, 0x73, 0x2E, + 0x54, 0x0F, 0x6C, 0x2F, 0x88, 0x1F, 0x02, 0x34, 0x13, 0x38, 0x37, 0x42, + 0x56, 0x42, 0x64, 0x49, 0xA6, 0x36, 0x4C, 0x42, 0x2F, 0x21, 0xB1, 0x38, + 0xBC, 0x16, 0x46, 0x32, 0x30, 0x20, 0xA3, 0x29, 0x0A, 0x38, 0x31, 0x22, + 0x26, 0x4A, 0x78, 0x1D, 0xB4, 0x36, 0xAD, 0x16, 0xB4, 0x19, 0x8D, 0x21, + 0xE0, 0x1E, 0xD9, 0x30, 0x3C, 0x2B, 0x48, 0x3B, 0x73, 0x2A, 0xFE, 0x43, + 0xBD, 0x32, 0xE6, 0x43, 0xB0, 0x3B, 0xF0, 0x3E, 0x59, 0x33, 0xB4, 0x33, + 0x83, 0x32, 0x04, 0x2E, 0x45, 0x32, 0xE1, 0x2E, 0x00, 0x1D, 0x1A, 0x29, + 0x71, 0x18, 0xC1, 0x29, 0xD5, 0x33, 0xF0, 0x30, 0xAE, 0x33, 0xE9, 0x25, + 0x89, 0x1F, 0x31, 0x20, 0x2A, 0x1C, 0x75, 0x2B, 0x74, 0x13, 0x71, 0x2B, + 0x34, 0x14, 0xD5, 0x27, 0x87, 0x2B, 0xA8, 0x19, 0x18, 0x34, 0xD8, 0x08, + 0xD7, 0x21, 0xCE, 0x13, 0xB7, 0x19, 0xF7, 0x29, 0x04, 0x27, 0x37, 0x36, + 0xDF, 0x30, 0xFB, 0x32, 0xB0, 0x27, 0xE3, 0x20, 0x6C, 0x1D, 0xA4, 0x1C, + 0xF8, 0x23, 0x79, 0x2B, 0x2F, 0x26, 0x88, 0x22, 0xF4, 0x19, 0x49, 0x15, + 0x11, 0x0E, 0x2C, 0x2A, 0x7F, 0x13, 0xA4, 0x38, 0x6D, 0x1F, 0x5A, 0x27, + 0xA4, 0x29, 0x33, 0x17, 0xCB, 0x30, 0x15, 0x1E, 0xA5, 0x2B, 0x9E, 0x2A, + 0xCF, 0x28, 0xA2, 0x2E, 0x1D, 0x36, 0x01, 0x32, 0xF8, 0x3D, 0x04, 0x2B, + 0x1F, 0x2C, 0x17, 0x20, 0x21, 0x25, 0x08, 0x29, 0x8F, 0x27, 0xE0, 0x2B, + 0xC9, 0x03, 0x5B, 0x12, 0x20, 0xE5, 0xB0, 0xFF, 0x45, 0xF4, 0x9A, 0x0C, + 0x70, 0xED, 0x14, 0x16, 0x43, 0xD0, 0xD7, 0x0D, 0xF5, 0xD6, 0x6A, 0x09, + 0xDB, 0xED, 0x70, 0xFE, 0x13, 0xF1, 0x70, 0xE8, 0x79, 0xEB, 0x4B, 0xE4, + 0x31, 0xE7, 0x21, 0xF0, 0xDF, 0xE4, 0x5A, 0xF5, 0xAC, 0xEC, 0x96, 0xEB, + 0xBD, 0xEE, 0x48, 0xDE, 0x3C, 0xE4, 0x72, 0xE7, 0x5E, 0xDB, 0xA8, 0xEC, + 0x77, 0xDC, 0x4F, 0xE6, 0xF5, 0xEC, 0x55, 0xEC, 0xB6, 0xF9, 0xB5, 0xE9, + 0x4C, 0xEC, 0xC5, 0xDA, 0xCB, 0xE6, 0x5F, 0xDC, 0x10, 0xF8, 0xDC, 0xE1, + 0xF7, 0xF1, 0xE0, 0xD5, 0x10, 0xE2, 0xEB, 0xD9, 0x0C, 0xEF, 0x59, 0xEE, + 0xEC, 0xF9, 0x3A, 0xEE, 0x7E, 0xEB, 0xF1, 0xDE, 0xF3, 0xE1, 0xD4, 0xDD, + 0x43, 0xE6, 0x37, 0xEA, 0x7F, 0xE5, 0x6A, 0xEF, 0x00, 0xE8, 0x43, 0xF1, + 0x54, 0xF0, 0x66, 0xEE, 0x27, 0xEA, 0x1F, 0xDC, 0x85, 0xEA, 0xDA, 0xDA, + 0x6F, 0xF3, 0x73, 0xF5, 0x24, 0xE3, 0xDE, 0xFD, 0xC2, 0xDD, 0xE2, 0xF5, + 0xA5, 0xF7, 0xA7, 0xF3, 0xAE, 0xEF, 0x6A, 0xE9, 0xF4, 0xBE, 0x4D, 0xE0, + 0xCE, 0xB5, 0xA4, 0xE1, 0x28, 0xCE, 0x0E, 0xE5, 0x7E, 0xDA, 0x6E, 0xE3, + 0x0F, 0xE5, 0x84, 0xDC, 0x80, 0xE1, 0x07, 0xE3, 0xD2, 0xD7, 0x53, 0xED, + 0x0F, 0xDC, 0xB0, 0xE6, 0x1B, 0xE1, 0xF8, 0xE0, 0x0E, 0xE9, 0xCD, 0xE4, + 0x83, 0xF3, 0x85, 0xEB, 0x48, 0xF9, 0x7B, 0xF6, 0x3A, 0xFC, 0x2E, 0x02, + 0xE5, 0xFB, 0x34, 0x07, 0xEC, 0xFD, 0xFD, 0xFE, 0xD4, 0x06, 0xC6, 0x00, + 0xFD, 0x07, 0xB8, 0x0C, 0xD9, 0xFA, 0x71, 0xFF, 0xDF, 0xE5, 0xDA, 0xE6, + 0x10, 0xDA, 0x34, 0xE3, 0x28, 0xE1, 0x6E, 0xE5, 0x78, 0xEC, 0x06, 0xD9, + 0x78, 0x02, 0xA2, 0xD1, 0xD6, 0x14, 0x27, 0xDC, 0xAD, 0x06, 0x51, 0xF5, + 0xD5, 0xF5, 0x56, 0x0B, 0x28, 0x0B, 0x4C, 0x0F, 0x10, 0x23, 0x75, 0xFF, + 0xA7, 0x1B, 0xB3, 0xE6, 0xA7, 0x11, 0x71, 0xE3, 0x11, 0x0C, 0xDD, 0xEF, + 0x9B, 0xF7, 0xAC, 0xE9, 0xFC, 0xE0, 0x3D, 0xE6, 0xB6, 0xDB, 0x4D, 0xF4, + 0x3B, 0xE2, 0x9A, 0xF2, 0x12, 0xEC, 0xB1, 0xEE, 0x22, 0xF2, 0xFC, 0xF2, + 0x09, 0xE1, 0x13, 0xE2, 0xC7, 0xCE, 0x9C, 0xCF, 0x19, 0xD4, 0x12, 0xD3, + 0x19, 0xD4, 0x3B, 0xDB, 0x16, 0xCF, 0x5E, 0xE6, 0x84, 0xD9, 0x82, 0xED, + 0xF3, 0xDD, 0xC3, 0xF1, 0x5B, 0xD1, 0x6C, 0xF9, 0x56, 0xC7, 0x62, 0xF8, + 0x9A, 0xCE, 0xE0, 0xF3, 0xBC, 0xE3, 0x3D, 0xE7, 0x55, 0xE5, 0xA0, 0xD6, + 0xAB, 0xDC, 0x90, 0xE0, 0x5F, 0xDF, 0x48, 0xF0, 0x64, 0xE3, 0x63, 0xEB, + 0xD8, 0xE5, 0xAC, 0xE0, 0x4B, 0xDA, 0xD0, 0xDC, 0xD8, 0xD2, 0xA6, 0xE0, + 0xDE, 0xE9, 0xC4, 0xDE, 0x06, 0x06, 0xD9, 0xD7, 0x32, 0x05, 0xE5, 0xDE, + 0x84, 0xF7, 0x61, 0xF1, 0x7A, 0xF6, 0x0F, 0xFA, 0x70, 0x00, 0x12, 0xFA, + 0xA5, 0x07, 0x1E, 0xFA, 0x23, 0x00, 0x88, 0xF6, 0x12, 0x05, 0x0E, 0xF6, + 0xD6, 0x14, 0x9F, 0xF5, 0xAE, 0x07, 0x44, 0xED, 0x36, 0xF3, 0x55, 0xE4, + 0xAF, 0xFB, 0xA8, 0xE6, 0xF8, 0xFF, 0x80, 0xEE, 0xCC, 0xED, 0x1F, 0xF3, + 0x66, 0xE3, 0xD9, 0xF7, 0x79, 0xE1, 0x1F, 0xEE, 0x17, 0xD7, 0xDD, 0xD9, + 0xDC, 0xD2, 0x35, 0xD1, 0x28, 0xD0, 0x05, 0xC7, 0x82, 0xCB, 0xD9, 0xC0, + 0xB8, 0xD9, 0x57, 0xCB, 0xB6, 0xE8, 0xD9, 0xD8, 0x5C, 0xE5, 0xAA, 0xE5, + 0xEF, 0xE8, 0xD3, 0xEB, 0x3E, 0x00, 0x4C, 0xEB, 0xFB, 0x0F, 0x53, 0xF2, + 0x7B, 0x07, 0x66, 0xFB, 0xA3, 0xF6, 0x69, 0xF9, 0x84, 0xF4, 0x9B, 0xFB, + 0x9B, 0xFC, 0xAE, 0xFE, 0x98, 0xFC, 0x01, 0xF9, 0x3C, 0xF6, 0x36, 0xFD, + 0xD0, 0xFF, 0xC0, 0x0C, 0x7C, 0x14, 0xDB, 0x0B, 0x32, 0x16, 0x34, 0x03, + 0x86, 0x0E, 0x3B, 0x18, 0xB3, 0x0A, 0x24, 0x23, 0x74, 0x10, 0x6A, 0x13, + 0xE3, 0x1B, 0xE0, 0x17, 0xBE, 0x22, 0xE5, 0x23, 0x4A, 0x23, 0x77, 0x23, + 0xBB, 0x13, 0x45, 0x25, 0x66, 0x06, 0x98, 0x24, 0x04, 0x04, 0x9A, 0x19, + 0xC4, 0xFA, 0xBA, 0x0E, 0x6A, 0xF9, 0x39, 0x0C, 0x65, 0x03, 0x07, 0x01, + 0xA4, 0x0B, 0xAF, 0xE9, 0x46, 0x15, 0xFF, 0xE5, 0xEF, 0x0B, 0xD3, 0xE8, + 0x62, 0xF6, 0x6A, 0xD8, 0x60, 0xF0, 0xC7, 0xCE, 0xC5, 0xF0, 0xB7, 0xD5, + 0xA6, 0xF1, 0x48, 0xD3, 0x30, 0xFA, 0x40, 0xCF, 0x73, 0x07, 0x86, 0xD3, + 0xF8, 0x0A, 0xC2, 0xD5, 0xB5, 0x08, 0x87, 0xE2, 0x3E, 0x0A, 0x33, 0xF5, + 0x62, 0x02, 0xB7, 0xFD, 0x1A, 0xF9, 0xCC, 0xFB, 0xF0, 0xFB, 0xCA, 0xF2, + 0x2F, 0xFA, 0xD8, 0xEC, 0xBC, 0xEF, 0xDC, 0xEF, 0x6B, 0xE5, 0x62, 0xF9, + 0xC5, 0xDA, 0x47, 0xFE, 0x26, 0xE7, 0xCA, 0xFC, 0x60, 0x07, 0x57, 0xFE, + 0x1F, 0x07, 0xA8, 0x00, 0x42, 0xFA, 0x80, 0x07, 0x80, 0xFB, 0x74, 0x0D, + 0x6F, 0xED, 0x56, 0x07, 0xBB, 0xE3, 0xA1, 0x02, 0x05, 0xEE, 0x47, 0x02, + 0xFE, 0xEE, 0x3B, 0x03, 0xFC, 0xE9, 0x80, 0xFC, 0x06, 0xEB, 0x31, 0xEB, + 0x86, 0xF3, 0xF0, 0xEA, 0x13, 0xF7, 0x18, 0xF9, 0x96, 0xFA, 0x00, 0xFA, + 0xB1, 0x03, 0xA6, 0xE9, 0x99, 0xF6, 0x8E, 0xD4, 0x88, 0xE9, 0x96, 0xCC, + 0x94, 0xE4, 0x5F, 0xCB, 0xFE, 0xCC, 0x18, 0xC5, 0xCA, 0xC9, 0xF2, 0xC5, + 0xC3, 0xE8, 0x85, 0xCB, 0xE5, 0xF4, 0xCD, 0xCC, 0x98, 0xE8, 0xA8, 0xD1, + 0x80, 0xDF, 0x40, 0xD8, 0x9C, 0xD8, 0x2F, 0xDD, 0x5E, 0xDD, 0xAA, 0xE4, + 0x22, 0xF3, 0x6A, 0xF2, 0x0F, 0xFC, 0x3E, 0x00, 0x06, 0xED, 0x89, 0x03, + 0x23, 0xE4, 0x50, 0x04, 0x9F, 0xE4, 0x78, 0x0F, 0x85, 0xE4, 0x85, 0x1B, + 0xFD, 0xE9, 0x0C, 0x13, 0x6C, 0xF4, 0xA0, 0xFF, 0xC9, 0x02, 0x8E, 0xF6, + 0x77, 0x09, 0x83, 0xF3, 0xC2, 0xFC, 0xA8, 0xF3, 0x98, 0xED, 0x09, 0x01, + 0x08, 0xEE, 0xC1, 0x09, 0x79, 0xFC, 0x13, 0x05, 0x55, 0x1B, 0x75, 0x09, + 0xDD, 0x35, 0x31, 0x13, 0x10, 0x33, 0xCA, 0x10, 0x1B, 0x27, 0x05, 0x0E, + 0x0A, 0x2B, 0xDE, 0x16, 0xCC, 0x36, 0xF4, 0x1B, 0xC1, 0x2E, 0xA2, 0x19, + 0x60, 0x18, 0x36, 0x21, 0xDF, 0x1B, 0x9A, 0x2A, 0x93, 0x23, 0xE9, 0x1D, + 0x7F, 0x23, 0x81, 0x15, 0x36, 0x2B, 0x93, 0x19, 0x17, 0x1A, 0xDA, 0x0D, + 0xBF, 0x00, 0xBD, 0x03, 0x9B, 0x07, 0xDD, 0x14, 0xC6, 0x19, 0x11, 0x27, + 0x04, 0x29, 0x31, 0x21, 0x22, 0x2E, 0x14, 0x20, 0x47, 0x20, 0x05, 0x28, + 0xE0, 0x12, 0xB8, 0x25, 0xFF, 0x0E, 0x9A, 0x2C, 0x14, 0x14, 0x99, 0x3C, + 0x5D, 0x23, 0x6A, 0x39, 0x31, 0x2A, 0xE7, 0x2D, 0x66, 0x27, 0x4C, 0x2F, + 0xDF, 0x2F, 0xFF, 0x38, 0x72, 0x3C, 0x19, 0x3E, 0x0E, 0x34, 0x36, 0x37, + 0x9A, 0x29, 0x0D, 0x32, 0x86, 0x3C, 0xEA, 0x30, 0xAF, 0x49, 0xD8, 0x22, + 0x98, 0x3D, 0x94, 0x1D, 0x59, 0x38, 0x22, 0x31, 0xB4, 0x33, 0xA4, 0x32, + 0xD8, 0x2A, 0x6D, 0x2F, 0x6D, 0x37, 0x2D, 0x45, 0xEC, 0x41, 0x06, 0x53, + 0x59, 0x33, 0xF8, 0x4D, 0x71, 0x2B, 0x55, 0x44, 0x95, 0x35, 0x9D, 0x3D, + 0x5A, 0x3D, 0x0C, 0x33, 0xD0, 0x39, 0x01, 0x26, 0x26, 0x2C, 0x25, 0x2D, + 0x7F, 0x15, 0xAF, 0x32, 0x43, 0x07, 0x4D, 0x1F, 0xA4, 0x0E, 0x6B, 0x17, + 0xFC, 0x11, 0xF9, 0x13, 0x88, 0x08, 0xF3, 0xFC, 0x20, 0x0E, 0x90, 0xF6, + 0x63, 0x1C, 0x9E, 0xFC, 0x39, 0x18, 0x8E, 0xF6, 0xBE, 0x12, 0x13, 0xF3, + 0x69, 0x0E, 0x10, 0xF6, 0x6D, 0x05, 0xC9, 0xFA, 0xDC, 0x13, 0xFA, 0x02, + 0x32, 0x2A, 0x65, 0x11, 0xA0, 0x33, 0x36, 0x25, 0x1C, 0x33, 0x3E, 0x2B, + 0x90, 0x22, 0xD5, 0x18, 0x6B, 0x18, 0xCB, 0x13, 0xC2, 0x1B, 0xBD, 0x2A, + 0x27, 0x19, 0x33, 0x36, 0x07, 0x17, 0x46, 0x2E, 0xBD, 0x1E, 0x83, 0x2B, + 0x09, 0x23, 0x27, 0x23, 0x82, 0x1C, 0x0C, 0x1A, 0x45, 0x1A, 0xD3, 0x28, + 0x5D, 0x22, 0xC2, 0x3B, 0x57, 0x2C, 0x5D, 0x3C, 0x04, 0x3C, 0xCE, 0x39, + 0x31, 0x47, 0xAF, 0x43, 0x00, 0x37, 0xF9, 0x48, 0x65, 0x18, 0x1D, 0x38, + 0x20, 0x0C, 0x1E, 0x2C, 0x6E, 0x14, 0xB7, 0x2B, 0x35, 0x12, 0xA7, 0x21, + 0xCC, 0x03, 0x7E, 0x18, 0x69, 0xFA, 0xEA, 0x0C, 0x49, 0xF2, 0x3F, 0xF4, + 0xE5, 0xF0, 0x77, 0xEE, 0x83, 0xF6, 0x58, 0xFF, 0xCD, 0xEC, 0xB2, 0xFC, + 0x6D, 0xE9, 0x2B, 0xEE, 0x4A, 0xFE, 0xD8, 0xED, 0xBB, 0xF9, 0x56, 0xEE, + 0x40, 0xE7, 0x73, 0xEF, 0xBC, 0xF0, 0x59, 0xF3, 0xAE, 0xF1, 0xF7, 0xEC, + 0xA3, 0xEE, 0x40, 0xEA, 0x36, 0xFF, 0x00, 0xF8, 0xFC, 0xFD, 0xC0, 0x09, + 0x16, 0xEE, 0xFB, 0x0D, 0x09, 0xF1, 0xBB, 0x01, 0x86, 0xFC, 0x93, 0xF4, + 0xAB, 0x02, 0x00, 0xF4, 0x44, 0x02, 0x1E, 0xFA, 0x72, 0xF1, 0xB7, 0xF9, + 0xC7, 0xDC, 0xFF, 0xFB, 0xF5, 0xDC, 0xC2, 0x08, 0x9E, 0xF1, 0x92, 0x02, + 0xCF, 0x05, 0x0C, 0xF7, 0xA6, 0x0B, 0xCE, 0x03, 0xAF, 0x11, 0x2A, 0x0A, + 0x27, 0x1C, 0xB3, 0x09, 0xB3, 0x19, 0x56, 0x12, 0x5A, 0x12, 0x79, 0x15, + 0xE1, 0x08, 0x2B, 0x0A, 0xA1, 0x00, 0x99, 0xF9, 0xD7, 0x05, 0xDC, 0xFC, + 0x5D, 0xFF, 0x8C, 0x09, 0xED, 0xF6, 0xDB, 0x09, 0xCC, 0xFE, 0x52, 0x09, + 0x0D, 0xEE, 0x1B, 0x08, 0x1C, 0xDE, 0x62, 0x09, 0x0B, 0xF1, 0x3D, 0x16, + 0x44, 0xF4, 0xBB, 0x0B, 0x60, 0xEA, 0x10, 0xF3, 0xDE, 0xF0, 0x3C, 0xF6, + 0xED, 0xEF, 0x7F, 0x00, 0x48, 0xE1, 0x05, 0x01, 0x0C, 0xE4, 0x03, 0x01, + 0xCE, 0xEC, 0x09, 0xFC, 0x08, 0xEB, 0xBC, 0xFA, 0x2F, 0xFC, 0x89, 0x09, + 0xFC, 0x1B, 0x2A, 0x18, 0x82, 0x20, 0x2B, 0x14, 0xAE, 0x0A, 0x64, 0x05, + 0xF0, 0xFE, 0x69, 0x01, 0x47, 0x00, 0x17, 0x01, 0x18, 0xFE, 0xAF, 0xF6, + 0xC8, 0xF6, 0x89, 0xEF, 0xD7, 0xF7, 0x94, 0xED, 0x24, 0x04, 0x3A, 0xE8, + 0xC5, 0x05, 0x12, 0xE8, 0x21, 0xFF, 0xBF, 0xF0, 0xEE, 0x05, 0xAF, 0xFA, + 0xDD, 0x0D, 0x61, 0xFC, 0x32, 0x11, 0xEF, 0x04, 0xAF, 0x24, 0xF8, 0x0F, + 0x2D, 0x37, 0x1A, 0x0C, 0xED, 0x2B, 0x90, 0x09, 0x8F, 0x0D, 0x11, 0x0A, + 0x7E, 0xF3, 0xD7, 0x09, 0x01, 0xE5, 0xD1, 0x0D, 0xC2, 0xE5, 0xE5, 0x0D, + 0x44, 0xF5, 0xED, 0x0A, 0x94, 0xF1, 0xA5, 0x02, 0xC9, 0xE2, 0x02, 0xF7, + 0xF7, 0xEB, 0x21, 0x00, 0x47, 0xE1, 0x98, 0x04, 0x41, 0xC1, 0x1F, 0xF3, + 0x2F, 0xC9, 0x78, 0xF6, 0xDD, 0xDB, 0x4F, 0xFD, 0x52, 0xD9, 0xB8, 0xF0, + 0xDE, 0xE1, 0xF2, 0xED, 0x16, 0xEF, 0x6E, 0xF4, 0x03, 0xF0, 0xF3, 0xF9, + 0x28, 0xF5, 0x1C, 0x01, 0x3B, 0x06, 0x82, 0x0D, 0x11, 0x12, 0x57, 0x16, + 0x96, 0x0A, 0x1A, 0x0B, 0xC8, 0xFB, 0x18, 0xFC, 0x94, 0xEC, 0x63, 0xF5, + 0xF4, 0xED, 0xE7, 0xE4, 0x80, 0x01, 0xF3, 0xD5, 0xDD, 0x06, 0x06, 0xE3, + 0x32, 0xFD, 0x02, 0xF6, 0xEC, 0xF2, 0x57, 0xF7, 0x00, 0xF2, 0x2C, 0xF3, + 0x58, 0x06, 0x53, 0xF8, 0x41, 0x14, 0x6A, 0x06, 0xFF, 0x0A, 0x49, 0x11, + 0x2C, 0x06, 0x0F, 0x13, 0x43, 0x09, 0xA4, 0x0B, 0xBD, 0x03, 0xC6, 0xFB, + 0x5E, 0xF9, 0x7A, 0xEF, 0xC3, 0xFE, 0xDE, 0xF4, 0x2B, 0x17, 0xF9, 0xF9, + 0x68, 0x1A, 0x3D, 0xF4, 0x57, 0x04, 0x03, 0xFB, 0xA1, 0xEA, 0x8C, 0xFE, + 0x67, 0xCC, 0xF8, 0xEA, 0x93, 0xCE, 0xFB, 0xE4, 0x63, 0xE6, 0xC9, 0xE8, + 0xF2, 0xE5, 0x0A, 0xCF, 0x68, 0xE6, 0x10, 0xBC, 0xAC, 0xE3, 0x29, 0xCF, + 0x82, 0xC6, 0x14, 0xD7, 0x2F, 0xBB, 0x59, 0xCD, 0xD6, 0xCF, 0x9C, 0xD1, + 0x61, 0xE7, 0x0B, 0xD7, 0x48, 0xF8, 0x1F, 0xDB, 0xDE, 0xFF, 0x14, 0xEC, + 0xF6, 0xFF, 0x60, 0x02, 0xE0, 0xFB, 0xA2, 0x0A, 0x65, 0xF1, 0x7C, 0x06, + 0xFE, 0xE7, 0xE8, 0x08, 0xEC, 0xEA, 0x45, 0x0D, 0x32, 0xF5, 0x77, 0x07, + 0xDA, 0xF7, 0x56, 0xFA, 0xC3, 0xF0, 0x02, 0xF2, 0x86, 0xF0, 0x67, 0xFA, + 0xBD, 0xFD, 0xFD, 0xFB, 0x76, 0x07, 0x7D, 0xFA, 0xA6, 0x02, 0x45, 0x0A, + 0xE6, 0xFF, 0xC8, 0x14, 0xE2, 0x08, 0xE1, 0x15, 0xF1, 0x10, 0xEC, 0x18, + 0x72, 0x13, 0xA1, 0x1A, 0x8B, 0x17, 0xCA, 0x10, 0x51, 0x15, 0x1F, 0x07, + 0x3E, 0x0C, 0xD0, 0x0F, 0x18, 0x05, 0xD2, 0x12, 0x37, 0x01, 0xE7, 0xFE, + 0x85, 0x04, 0xE1, 0xE3, 0xDC, 0xFA, 0x61, 0xCC, 0xAE, 0xE8, 0x61, 0xD0, + 0xCF, 0xE2, 0xEA, 0xEC, 0x5F, 0xDA, 0x99, 0xE5, 0x43, 0xDB, 0x89, 0xC7, + 0xAC, 0xEA, 0x51, 0xC9, 0xF7, 0xE5, 0xB7, 0xD3, 0x2A, 0xE1, 0x2B, 0xD5, + 0xC7, 0xFB, 0xA0, 0xDB, 0x13, 0x12, 0x7E, 0xEA, 0x04, 0x0B, 0xE4, 0xF9, + 0xCD, 0xFE, 0x38, 0x08, 0xDD, 0xFD, 0x7D, 0x0D, 0xCE, 0xF3, 0xFA, 0xF9, + 0xD9, 0xE1, 0xCC, 0xEB, 0xEB, 0xE3, 0xCB, 0xF8, 0x1C, 0xF3, 0x59, 0xFB, + 0xD6, 0xFA, 0x91, 0xEE, 0xF1, 0xF7, 0x98, 0xEA, 0x4B, 0xE6, 0x49, 0xEA, + 0x61, 0xD9, 0xD1, 0xEB, 0x44, 0xE0, 0x93, 0xF6, 0xF8, 0xE4, 0xF0, 0x01, + 0x9A, 0xEC, 0xCA, 0xFE, 0x55, 0xFC, 0x41, 0xEF, 0xB3, 0xFA, 0xD8, 0xE8, + 0xB7, 0xE7, 0xD9, 0xEF, 0x48, 0xDE, 0x88, 0xF3, 0xC8, 0xEB, 0x29, 0xEE, + 0xAE, 0xF9, 0xA6, 0xE7, 0x80, 0xF2, 0x7C, 0xE4, 0x35, 0xE4, 0x31, 0xE0, + 0x8B, 0xD9, 0x2D, 0xD7, 0x0A, 0xD4, 0x14, 0xC5, 0x18, 0xC0, 0xEE, 0xA9, + 0xB7, 0xAB, 0x3D, 0xAA, 0xB3, 0xC2, 0xBA, 0xC9, 0x28, 0xD6, 0x73, 0xC8, + 0x30, 0xCA, 0x9A, 0xAC, 0x0F, 0xD0, 0x6F, 0xAF, 0xF3, 0xD6, 0x0C, 0xB7, + 0xA4, 0xC7, 0x4F, 0xAB, 0xFB, 0xC9, 0xE9, 0xAB, 0x22, 0xD4, 0xAA, 0xB9, + 0x0E, 0xC6, 0x19, 0xC6, 0x1F, 0xC3, 0xE1, 0xD0, 0x35, 0xD5, 0xCB, 0xDD, + 0xCB, 0xD7, 0x48, 0xE8, 0xBB, 0xD1, 0x56, 0xE9, 0xA0, 0xD4, 0x3E, 0xE7, + 0x9F, 0xCE, 0x1F, 0xE6, 0x0E, 0xCA, 0x3E, 0xDB, 0xD7, 0xDA, 0xD2, 0xCA, + 0x1B, 0xE5, 0x77, 0xC0, 0xE4, 0xDD, 0xAA, 0xC4, 0xFA, 0xCE, 0xF5, 0xDB, + 0xE9, 0xC8, 0x0D, 0xF0, 0x30, 0xDA, 0x41, 0xF4, 0xCB, 0xEA, 0xB2, 0xE9, + 0x4E, 0xF0, 0x1B, 0xDC, 0x9A, 0xF3, 0x67, 0xDE, 0xBA, 0xFF, 0x37, 0xE8, + 0xF6, 0x0A, 0x58, 0xEA, 0x3B, 0x05, 0x46, 0xF1, 0x3C, 0x07, 0x54, 0xFE, + 0xF7, 0x10, 0x2E, 0xF7, 0xA8, 0x09, 0x7A, 0xE5, 0xC3, 0x03, 0x72, 0xE5, + 0x3C, 0xFE, 0x06, 0xE3, 0xBA, 0xED, 0xA2, 0xD6, 0x0D, 0xF5, 0x79, 0xE3, + 0xA0, 0xFE, 0x04, 0xEC, 0xF5, 0xE8, 0x70, 0xD6, 0x6C, 0xE1, 0xA2, 0xD5, + 0x25, 0xE8, 0xF6, 0xEB, 0x55, 0xDE, 0x07, 0xF6, 0x75, 0xDF, 0x7D, 0xF8, + 0x9A, 0xF6, 0x91, 0x02, 0x78, 0x05, 0x6F, 0x06, 0xDD, 0x00, 0x33, 0x06, + 0xAF, 0xFD, 0xE7, 0x19, 0x72, 0x04, 0x85, 0x2B, 0x2F, 0x15, 0x93, 0x23, + 0x1A, 0x22, 0xFA, 0x20, 0x1B, 0x18, 0x1A, 0x26, 0xBD, 0x0B, 0x58, 0x21, + 0x90, 0x0A, 0xF6, 0x1F, 0x3B, 0x03, 0x51, 0x16, 0x4E, 0x00, 0x88, 0x06, + 0x22, 0x0F, 0xAA, 0x04, 0xF5, 0x19, 0x72, 0x0B, 0x94, 0x1A, 0xD7, 0x18, + 0xA7, 0x1B, 0xB1, 0x24, 0x62, 0x26, 0x1B, 0x2D, 0x85, 0x33, 0x4C, 0x33, + 0xA8, 0x37, 0xA5, 0x30, 0x7C, 0x33, 0xEB, 0x35, 0xF1, 0x25, 0xDC, 0x37, + 0xC8, 0x19, 0x03, 0x29, 0x2E, 0x18, 0x51, 0x23, 0x41, 0x16, 0xCF, 0x17, + 0x52, 0x1B, 0x0C, 0x09, 0xC9, 0x1E, 0xD1, 0x08, 0x4B, 0x06, 0x44, 0xFC, + 0x08, 0xFB, 0xE3, 0xF7, 0x94, 0x05, 0xCB, 0x07, 0xCA, 0xFE, 0xC1, 0xFD, + 0xC4, 0x05, 0x3C, 0xEB, 0x49, 0x1E, 0xFE, 0xF0, 0x85, 0x19, 0x4E, 0xEF, + 0xA5, 0x07, 0x6B, 0xE6, 0x19, 0x0C, 0xB5, 0xEF, 0x6B, 0x14, 0x5D, 0xF6, + 0xDA, 0x0E, 0x91, 0xEE, 0x56, 0x0E, 0xCC, 0xFD, 0xFF, 0x15, 0x7E, 0x1D, + 0x72, 0x16, 0xFB, 0x23, 0x49, 0x1F, 0x68, 0x24, 0x97, 0x30, 0x6C, 0x2D, + 0x8B, 0x36, 0x62, 0x26, 0xB8, 0x3C, 0x66, 0x1A, 0x78, 0x39, 0x9E, 0x1D, + 0x0E, 0x27, 0xD2, 0x20, 0xA6, 0x29, 0x89, 0x23, 0x63, 0x31, 0xD4, 0x2D, + 0xE6, 0x24, 0xB6, 0x33, 0xB7, 0x1C, 0x50, 0x30, 0x22, 0x25, 0x2E, 0x31, + 0x4B, 0x2D, 0x50, 0x3B, 0x5A, 0x27, 0x5D, 0x40, 0x0E, 0x26, 0xAC, 0x3F, + 0xF6, 0x2A, 0x53, 0x3C, 0x87, 0x23, 0x1B, 0x2F, 0x06, 0x1A, 0xE3, 0x22, + 0x59, 0x0D, 0x85, 0x15, 0x56, 0xFA, 0xBE, 0x05, 0x60, 0xF8, 0xBD, 0x08, + 0x54, 0xF8, 0x8C, 0x0A, 0x7F, 0xF7, 0x4E, 0x08, 0x00, 0x05, 0x31, 0x10, + 0x80, 0xFA, 0x30, 0xF8, 0x5B, 0xDC, 0x01, 0xCF, 0x89, 0xD8, 0x44, 0xD2, + 0x8C, 0xE3, 0x83, 0xE0, 0xD9, 0xEB, 0xF8, 0xD6, 0x1C, 0xFB, 0xE4, 0xDF, + 0x8C, 0x06, 0x26, 0xF6, 0xC1, 0x02, 0x6C, 0xF9, 0x6F, 0x12, 0xC6, 0x02, + 0x4B, 0x31, 0x8D, 0x18, 0x53, 0x28, 0x39, 0x1C, 0x72, 0x0C, 0x26, 0x13, + 0x1F, 0x03, 0xB1, 0x12, 0xF5, 0xF8, 0x0B, 0x0D, 0xE3, 0xF0, 0xEB, 0xF9, + 0x81, 0xF7, 0x7A, 0xF3, 0x06, 0xF9, 0x4D, 0xFF, 0xB0, 0xF3, 0xE6, 0x0E, + 0xCC, 0xFB, 0x5F, 0x16, 0xCD, 0x10, 0xCD, 0x0D, 0x0A, 0x1A, 0x00, 0x06, + 0x14, 0x17, 0x47, 0x0D, 0x31, 0x1D, 0xC2, 0x18, 0x61, 0x25, 0x9F, 0x22, + 0x08, 0x26, 0x20, 0x26, 0x70, 0x20, 0x55, 0x21, 0xFA, 0x0F, 0xDD, 0x1E, + 0xFB, 0x06, 0x5C, 0x20, 0x2A, 0x0C, 0x09, 0x14, 0xF0, 0x01, 0x32, 0x00, + 0x6F, 0xF1, 0x91, 0xFE, 0x7D, 0xED, 0x9C, 0xF6, 0x97, 0xF0, 0x9B, 0xEE, + 0x66, 0x08, 0x2A, 0x08, 0x29, 0x17, 0x01, 0x13, 0x4B, 0x00, 0x34, 0xFE, + 0xE2, 0xF5, 0x51, 0x04, 0x93, 0xF9, 0x61, 0x14, 0x4D, 0xF3, 0x5C, 0x03, + 0x9C, 0xF8, 0xF8, 0xF3, 0xB0, 0x03, 0x40, 0xFA, 0x8A, 0x00, 0x57, 0xFB, + 0xD9, 0xFF, 0x05, 0x01, 0x46, 0x12, 0x1F, 0x1C, 0x1A, 0x1C, 0x78, 0x25, + 0x9F, 0x15, 0x76, 0x18, 0xFE, 0x0F, 0xC7, 0x14, 0x5C, 0x06, 0x36, 0x10, + 0x83, 0xFA, 0x09, 0x04, 0xE4, 0xFA, 0x0F, 0xF6, 0x49, 0x02, 0x7B, 0xEA, + 0xAB, 0x08, 0x72, 0xF2, 0xB9, 0x1C, 0x77, 0x05, 0x66, 0x2E, 0x4C, 0x09, + 0x1D, 0x2A, 0xB3, 0x0A, 0xDE, 0x1F, 0x72, 0x0F, 0x2E, 0x18, 0x2E, 0x0A, + 0x61, 0x1C, 0x60, 0x06, 0x90, 0x2A, 0x0D, 0x0D, 0x80, 0x28, 0x24, 0x12, + 0xC9, 0x1A, 0x14, 0x13, 0xF3, 0x1B, 0x20, 0x22, 0x57, 0x21, 0xC6, 0x2B, + 0x5A, 0x13, 0x3A, 0x1F, 0xB9, 0x07, 0x66, 0x1D, 0xA3, 0xFE, 0x82, 0x1D, + 0x62, 0xE4, 0x5B, 0x0B, 0x88, 0xE2, 0xDD, 0x0C, 0xF7, 0xEF, 0xC1, 0x19, + 0x39, 0xDB, 0x6C, 0x07, 0xBC, 0xD1, 0xDE, 0xFC, 0x1A, 0xE6, 0xB0, 0x07, + 0x3E, 0xE8, 0xCD, 0x02, 0x45, 0xE8, 0xA1, 0x04, 0xE1, 0xFC, 0x28, 0x10, + 0x02, 0x09, 0x2C, 0x07, 0x94, 0x0B, 0x31, 0xFE, 0x5C, 0x1C, 0x3F, 0x0A, + 0x9D, 0x20, 0xFA, 0x13, 0x14, 0x10, 0x77, 0x0E, 0x0E, 0x17, 0xCB, 0x09, + 0x6D, 0x28, 0x60, 0x07, 0xD3, 0x26, 0xC4, 0xFF, 0xF1, 0x1B, 0x3B, 0xFE, + 0xDC, 0x04, 0x71, 0x01, 0x0F, 0xF4, 0x9F, 0xFF, 0x32, 0x06, 0x84, 0x06, + 0xA7, 0x1F, 0x4A, 0x13, 0x11, 0x2B, 0xE5, 0x12, 0x3F, 0x32, 0x49, 0x17, + 0x2A, 0x29, 0xD0, 0x29, 0x12, 0x13, 0x42, 0x35, 0x9B, 0x16, 0xF4, 0x37, + 0xF0, 0x2C, 0xB4, 0x36, 0x35, 0x2C, 0xE2, 0x29, 0xBD, 0x27, 0xCD, 0x1A, + 0x41, 0x28, 0x06, 0x1B, 0x0D, 0x09, 0xFF, 0x1C, 0x53, 0xEA, 0x70, 0x1D, + 0xCE, 0xE9, 0x7F, 0x1C, 0x58, 0xE3, 0x17, 0x04, 0xE3, 0xE7, 0xA8, 0xF1, + 0x9A, 0xFB, 0x2B, 0xF9, 0x82, 0xE3, 0x6F, 0xE7, 0xF3, 0xC4, 0xD1, 0xCE, + 0x13, 0xDF, 0xD6, 0xD8, 0x62, 0xF7, 0x35, 0xE2, 0x17, 0xF6, 0x25, 0xE3, + 0xED, 0x08, 0xA4, 0xE9, 0x77, 0x0F, 0xCE, 0xED, 0xE1, 0xF5, 0x78, 0xF2, + 0x5D, 0xF9, 0xB0, 0x08, 0x3D, 0x14, 0xB3, 0x25, 0x9D, 0x17, 0x08, 0x23, + 0x8A, 0x1B, 0x3B, 0x13, 0x6F, 0x22, 0x1B, 0x13, 0x2C, 0x13, 0xF9, 0x0A, + 0xD9, 0x04, 0x9D, 0x02, 0x20, 0x00, 0xA5, 0x0E, 0x58, 0xFB, 0xD6, 0x16, + 0xEC, 0x01, 0x4A, 0x19, 0x04, 0x14, 0x42, 0x26, 0xB3, 0x1E, 0xE8, 0x29, + 0xEC, 0x1B, 0xBA, 0x26, 0x79, 0x14, 0x50, 0x2D, 0x61, 0x16, 0x6D, 0x38, + 0xB0, 0x26, 0x0A, 0x41, 0x9A, 0x38, 0x90, 0x3F, 0xD8, 0x31, 0x1C, 0x33, + 0x1C, 0x17, 0x68, 0x20, 0xA0, 0x16, 0x6D, 0x11, 0x36, 0x1D, 0x20, 0x06, + 0x61, 0x09, 0x17, 0xFC, 0xFD, 0x02, 0xAD, 0xF8, 0xBE, 0x07, 0x08, 0xEE, + 0x40, 0xFF, 0x9B, 0xDF, 0x35, 0x01, 0xF9, 0xE6, 0x78, 0xFB, 0xB0, 0xEC, + 0x8F, 0xE7, 0x1C, 0xDD, 0xAB, 0xF0, 0xD8, 0xE4, 0x32, 0xFF, 0x15, 0xF5, + 0x20, 0xF6, 0x3B, 0xE4, 0xC0, 0xF1, 0x58, 0xE0, 0x96, 0xF8, 0x56, 0xF6, + 0x82, 0xF8, 0xEA, 0xF5, 0x60, 0xF1, 0x85, 0xF6, 0x8A, 0xFA, 0xF7, 0x13, + 0xA2, 0x03, 0x20, 0x18, 0x0F, 0xF5, 0x74, 0x02, 0xF6, 0xED, 0x18, 0x04, + 0x08, 0xED, 0x02, 0x03, 0x22, 0xE8, 0x9E, 0xF1, 0x7D, 0xE6, 0x85, 0xF4, + 0x76, 0xD9, 0xA1, 0xFD, 0xF3, 0xCE, 0x0D, 0xF2, 0x1F, 0xD9, 0xB6, 0xE4, + 0x19, 0xE3, 0x19, 0xD7, 0x74, 0xE3, 0x0A, 0xC9, 0xA4, 0xE1, 0x06, 0xCE, + 0x64, 0xE7, 0x93, 0xDB, 0x34, 0xF3, 0xF2, 0xE2, 0xD4, 0xF8, 0xA8, 0xE7, + 0xC9, 0xFA, 0x87, 0xEB, 0x75, 0xF4, 0x4B, 0xE3, 0x6D, 0xEC, 0xEC, 0xD6, + 0x7B, 0xEC, 0x86, 0xD6, 0x4A, 0xE1, 0xEB, 0xD3, 0x9D, 0xD0, 0x89, 0xD2, + 0xC1, 0xC7, 0xD1, 0xD5, 0xE5, 0xBE, 0x30, 0xC1, 0xA2, 0xBE, 0x63, 0xB2, + 0xC4, 0xC2, 0xF1, 0xBB, 0x3E, 0xB6, 0xEC, 0xB5, 0xC7, 0xAF, 0xCE, 0xBA, + 0xCC, 0xBB, 0x38, 0xD6, 0xB6, 0xBA, 0xE8, 0xD1, 0x10, 0xB5, 0x02, 0xBC, + 0x1B, 0xC4, 0xA6, 0xBF, 0x54, 0xCE, 0x6C, 0xC8, 0xC8, 0xC6, 0x38, 0xCD, + 0x60, 0xCB, 0x62, 0xE8, 0xC2, 0xD3, 0x1B, 0x02, 0x63, 0xC9, 0xBF, 0xEF, + 0x39, 0xD0, 0xA1, 0xD2, 0x86, 0xE5, 0x68, 0xCB, 0xDB, 0xD9, 0x53, 0xC7, + 0x68, 0xC3, 0xBA, 0xCB, 0x23, 0xBD, 0x85, 0xDC, 0x70, 0xC3, 0x43, 0xE0, + 0x66, 0xDA, 0x06, 0xDD, 0xCC, 0xEB, 0x98, 0xDF, 0xBE, 0xEB, 0x6B, 0xE0, + 0xA2, 0xF3, 0xF1, 0xE4, 0x67, 0x07, 0x8A, 0xEA, 0x9F, 0x0A, 0x0E, 0xED, + 0xDF, 0xFF, 0x0F, 0xF5, 0x2C, 0x0B, 0xFF, 0xFC, 0x90, 0x14, 0x88, 0xF4, + 0x60, 0xFF, 0x60, 0xEE, 0x14, 0xFB, 0xE3, 0xFB, 0xB2, 0x00, 0xC9, 0xFB, + 0xC7, 0xEC, 0x31, 0xED, 0x61, 0xEB, 0xED, 0xE9, 0x39, 0xF8, 0xAE, 0xDF, + 0xD0, 0xF8, 0x4C, 0xD6, 0x2D, 0xFC, 0x3A, 0xE4, 0x93, 0xEE, 0xCD, 0xE2, + 0xAC, 0xD9, 0x6B, 0xD6, 0xF6, 0xE2, 0x4F, 0xE4, 0xB0, 0xE8, 0x38, 0xEC, + 0x1C, 0xDA, 0xE4, 0xDC, 0xE0, 0xDD, 0xC3, 0xD7, 0x5E, 0xEE, 0x75, 0xE3, + 0x83, 0xF5, 0xAC, 0xF1, 0x7E, 0x01, 0x31, 0x0B, 0x62, 0x10, 0x04, 0x2A, + 0x1A, 0x0B, 0x00, 0x2A, 0x94, 0x09, 0xC1, 0x17, 0xF2, 0x16, 0x44, 0x19, + 0xD3, 0x0F, 0xCC, 0x19, 0xA4, 0x00, 0x63, 0x15, 0xD5, 0x0B, 0x8C, 0x16, + 0x84, 0x17, 0x5F, 0x06, 0x1F, 0x11, 0x7A, 0xFC, 0xD8, 0x0B, 0x71, 0x13, + 0x75, 0x02, 0x19, 0x26, 0x06, 0xFD, 0xE8, 0x23, 0xFF, 0x07, 0x15, 0x29, + 0xE9, 0x12, 0xED, 0x34, 0x51, 0x19, 0x3C, 0x33, 0x80, 0x24, 0xD9, 0x2E, + 0xC7, 0x2D, 0x7B, 0x27, 0x67, 0x27, 0x63, 0x11, 0xE6, 0x25, 0x00, 0x08, + 0x59, 0x25, 0x80, 0x11, 0xAA, 0x0E, 0xA4, 0x08, 0x1E, 0x0D, 0x66, 0xF8, + 0xC0, 0x16, 0x2E, 0xF2, 0xC1, 0x09, 0x67, 0xEA, 0xCE, 0x12, 0x6C, 0xEF, + 0x4C, 0x15, 0x91, 0xF3, 0x6B, 0xFA, 0x8D, 0xDE, 0xC5, 0x09, 0x1D, 0xDB, + 0x8D, 0x22, 0x6B, 0xE9, 0x67, 0x07, 0x40, 0xE3, 0xA3, 0xF1, 0xE7, 0xE0, + 0x46, 0x01, 0xFB, 0xE6, 0x3C, 0x09, 0x81, 0xE5, 0xD6, 0x05, 0x0C, 0xF6, + 0x05, 0x13, 0x16, 0x22, 0xC7, 0x21, 0x43, 0x39, 0x14, 0x24, 0x56, 0x28, + 0x0E, 0x26, 0x70, 0x1C, 0x5E, 0x19, 0x82, 0x1C, 0xBA, 0x01, 0xD9, 0x15, + 0x6A, 0x03, 0x2D, 0x1B, 0x82, 0x08, 0xC1, 0x23, 0x26, 0x02, 0xF3, 0x1B, + 0xEB, 0x13, 0x33, 0x1A, 0xB9, 0x25, 0x0C, 0x19, 0x0D, 0x18, 0xAF, 0x0B, + 0xAD, 0x07, 0xA7, 0x0C, 0x20, 0x04, 0x06, 0x1F, 0x69, 0x0A, 0x63, 0x26, + 0xB4, 0x18, 0xE5, 0x23, 0x14, 0x1D, 0x47, 0x20, 0xAD, 0x17, 0xBE, 0x0A, + 0x50, 0x16, 0x3B, 0xF7, 0xC4, 0x0F, 0x8E, 0xFE, 0x3D, 0xF7, 0x47, 0x02, + 0x56, 0xE6, 0x0C, 0xFF, 0x09, 0xE9, 0xDE, 0xFC, 0xBD, 0xE2, 0x4D, 0xDE, + 0x7C, 0xDE, 0x41, 0xCB, 0x6E, 0xE7, 0x4B, 0xDA, 0xDD, 0xDC, 0xA2, 0xD4, + 0x11, 0xD7, 0x7D, 0xD3, 0x38, 0xEA, 0xEC, 0xE9, 0x1C, 0xE7, 0x10, 0xE7, + 0x00, 0xDE, 0x32, 0xD5, 0x92, 0xEC, 0xFD, 0xDA, 0x25, 0xED, 0xF9, 0xE2, + 0x0A, 0xDD, 0x3A, 0xDD, 0xB5, 0xE9, 0xED, 0xEE, 0x8F, 0x06, 0xA0, 0x0B, + 0xC7, 0x05, 0x16, 0x05, 0x8E, 0xF5, 0x7F, 0xF4, 0x09, 0xF2, 0xF6, 0xEB, + 0x1D, 0xEB, 0x76, 0xD9, 0x4C, 0xDA, 0xC7, 0xD5, 0xF1, 0xD4, 0xEE, 0xE2, + 0x60, 0xE1, 0x7C, 0xDB, 0x82, 0xF7, 0xD4, 0xD3, 0x7D, 0xFF, 0x62, 0xE0, + 0xD9, 0xF8, 0x6D, 0xE9, 0xA1, 0xFB, 0x00, 0xF1, 0x20, 0x02, 0x18, 0xFC, + 0x87, 0x01, 0x46, 0xFF, 0xFA, 0xFD, 0x6D, 0x02, 0x22, 0xFF, 0xC4, 0x0D, + 0x8E, 0xFB, 0x6E, 0x09, 0xC9, 0xEF, 0x9D, 0xF6, 0x4A, 0xEF, 0xF3, 0xFA, + 0x26, 0xF5, 0xC1, 0xFE, 0xE2, 0xF8, 0x71, 0xF3, 0xF7, 0xF8, 0xAC, 0xFC, + 0x7C, 0xE3, 0xBC, 0xFD, 0xDB, 0xCF, 0xB8, 0xF0, 0xA7, 0xD8, 0xA7, 0xFC, + 0x01, 0xDB, 0x39, 0xFF, 0x5C, 0xD8, 0x69, 0xEF, 0xD2, 0xED, 0x47, 0xF0, + 0x99, 0xFB, 0x3C, 0xEB, 0x2C, 0xF2, 0x94, 0xDC, 0xF1, 0xED, 0xD5, 0xE7, + 0xAB, 0xF2, 0xBE, 0xFB, 0x59, 0xF1, 0xF5, 0xFA, 0x3F, 0xF3, 0x6B, 0xFA, + 0x85, 0x02, 0xD1, 0x03, 0xBB, 0x05, 0xA0, 0xFF, 0x86, 0x03, 0x33, 0xF6, + 0x90, 0x13, 0x1A, 0xF7, 0x09, 0x12, 0xC1, 0xF3, 0x3A, 0xFE, 0xB3, 0xF7, + 0x96, 0xFE, 0x71, 0x04, 0x0A, 0x01, 0x46, 0xFD, 0x69, 0xFB, 0xB8, 0xF7, + 0xA6, 0x04, 0x27, 0x01, 0x69, 0x16, 0x73, 0xFE, 0xFA, 0x1A, 0x56, 0x02, + 0x95, 0x1E, 0x95, 0x14, 0x0F, 0x29, 0xA2, 0x19, 0x89, 0x25, 0xDA, 0x12, + 0xBE, 0x21, 0x8D, 0x17, 0x26, 0x23, 0xF6, 0x21, 0x9C, 0x10, 0xF1, 0x16, + 0xDB, 0xFD, 0x31, 0x11, 0x7B, 0xFA, 0xF3, 0x1A, 0x5B, 0xF3, 0x6A, 0x15, + 0xC9, 0xF2, 0xFA, 0x16, 0x72, 0xF6, 0x27, 0x1C, 0x59, 0xF2, 0x17, 0x10, + 0x21, 0xF9, 0xA2, 0x1A, 0x27, 0xFC, 0xF5, 0x23, 0x04, 0xED, 0xF4, 0x09, + 0xE7, 0xF1, 0xB9, 0x03, 0x71, 0x05, 0x2C, 0x09, 0x6C, 0x01, 0x09, 0xF3, + 0x1C, 0xFE, 0x7E, 0xED, 0xF7, 0x12, 0x23, 0x01, 0x54, 0x1C, 0x71, 0x02, + 0x7D, 0x14, 0xD1, 0x06, 0x4E, 0x1C, 0x57, 0x22, 0xA8, 0x1B, 0xA0, 0x2B, + 0x11, 0x0A, 0xD9, 0x1A, 0x8D, 0x13, 0x99, 0x18, 0x3F, 0x1F, 0xF4, 0x1A, + 0x1A, 0x1C, 0xC8, 0x0D, 0x46, 0x2D, 0x2A, 0x0D, 0x2F, 0x35, 0x9A, 0x10, + 0x75, 0x1A, 0xE4, 0x09, 0xC4, 0x11, 0xE5, 0x0D, 0xCC, 0x23, 0x2E, 0x17, + 0x9E, 0x24, 0x17, 0x1A, 0x3D, 0x21, 0xA9, 0x26, 0xCB, 0x2F, 0xA6, 0x39, + 0xDA, 0x30, 0x91, 0x36, 0x0B, 0x26, 0x55, 0x2A, 0xB4, 0x25, 0x47, 0x30, + 0x8A, 0x19, 0x2F, 0x32, 0xD6, 0x0D, 0xD6, 0x2D, 0x91, 0x1C, 0x6F, 0x32, + 0xFE, 0x19, 0x54, 0x24, 0x33, 0x07, 0x29, 0x0C, 0x46, 0x02, 0x1A, 0x01, + 0xB0, 0xEC, 0xA1, 0xF4, 0x7B, 0xE2, 0x48, 0xF7, 0x2F, 0xFA, 0x57, 0x0B, + 0x42, 0xFB, 0x2D, 0x07, 0xB0, 0xF2, 0x80, 0xFB, 0xED, 0xFB, 0x63, 0x03, + 0x74, 0xF8, 0x7F, 0xF7, 0x4A, 0xF2, 0x90, 0xDE, 0x9D, 0x05, 0x42, 0xED, + 0x3C, 0x11, 0x90, 0x0B, 0x5C, 0x0A, 0x71, 0x14, 0x2A, 0x23, 0x4B, 0x1B, + 0x4A, 0x49, 0x97, 0x1C, 0xCC, 0x45, 0xE6, 0x08, 0x98, 0x2D, 0x6F, 0x07, + 0x67, 0x15, 0x05, 0x20, 0x52, 0xF8, 0x82, 0x25, 0x52, 0xF5, 0x64, 0x20, + 0xC6, 0x09, 0x37, 0x25, 0x14, 0x10, 0x52, 0x24, 0x88, 0x17, 0xCC, 0x22, + 0xBB, 0x2A, 0xD7, 0x2B, 0x44, 0x32, 0xBC, 0x38, 0x9E, 0x36, 0x08, 0x44, + 0x86, 0x41, 0x0A, 0x4E, 0x51, 0x42, 0xAC, 0x51, 0x98, 0x37, 0xEE, 0x4A, + 0xB4, 0x35, 0x53, 0x3F, 0xA6, 0x31, 0x4B, 0x31, 0xDD, 0x1E, 0x57, 0x2C, + 0xB6, 0x1F, 0x43, 0x32, 0x2E, 0x28, 0xB9, 0x30, 0xC5, 0x1F, 0x20, 0x2A, + 0x83, 0x1A, 0xAE, 0x2B, 0xD2, 0x0E, 0xF6, 0x22, 0xDF, 0x0D, 0x87, 0x0D, + 0x93, 0x2B, 0xF4, 0x0B, 0x0D, 0x2E, 0x06, 0x07, 0x07, 0x14, 0x6D, 0xF5, + 0x20, 0x10, 0x6A, 0x01, 0x3F, 0x0D, 0xBC, 0x0B, 0x6E, 0x0A, 0x9F, 0x01, + 0x9F, 0x1A, 0xE8, 0x0D, 0xCE, 0x21, 0x07, 0x24, 0x3A, 0x1C, 0xA7, 0x24, + 0xD9, 0x1D, 0x70, 0x22, 0xF2, 0x1F, 0x9F, 0x2A, 0xF4, 0x19, 0x5B, 0x2D, + 0xCD, 0x18, 0x3C, 0x2B, 0xC2, 0x1C, 0xDA, 0x27, 0x5B, 0x15, 0x1B, 0x1C, + 0xB8, 0x0A, 0x61, 0x13, 0x43, 0x0A, 0x86, 0x0B, 0x9C, 0xFF, 0x91, 0xF9, + 0x73, 0xEF, 0xAE, 0xF4, 0x73, 0xF3, 0xA2, 0xFD, 0x3E, 0x00, 0x03, 0xF9, + 0x5F, 0x0B, 0x8E, 0xF8, 0x93, 0x0A, 0xD9, 0x07, 0xE2, 0xFF, 0xFD, 0x0C, + 0xE6, 0x08, 0xAC, 0x0A, 0x5E, 0x18, 0x77, 0x14, 0xC9, 0x14, 0x4C, 0x15, + 0x43, 0x09, 0x0B, 0x01, 0x6E, 0x04, 0xAB, 0xF2, 0x2F, 0x02, 0xEF, 0xE7, + 0x6D, 0xF9, 0x56, 0xD5, 0x8A, 0xF3, 0xC9, 0xD1, 0x76, 0xE3, 0x99, 0xD7, + 0x91, 0xC3, 0x4F, 0xD6, 0x43, 0xBA, 0x06, 0xE8, 0x87, 0xC2, 0xC5, 0xEE, + 0xA7, 0xBF, 0x1D, 0xD1, 0xC8, 0xCC, 0x3C, 0xC7, 0x33, 0xDC, 0xF2, 0xCF, + 0xE3, 0xCD, 0x97, 0xCE, 0x37, 0xCB, 0xB2, 0xD6, 0xB3, 0xD3, 0x68, 0xE9, + 0x37, 0xCA, 0xF2, 0xEB, 0x2A, 0xCD, 0xE2, 0xEC, 0x63, 0xE6, 0x1B, 0xFC, + 0x59, 0xF6, 0x00, 0xF9, 0xA8, 0xF0, 0xF0, 0xEB, 0x31, 0xE1, 0xE2, 0xF0, + 0x61, 0xD3, 0x8E, 0xEF, 0x64, 0xD0, 0xBA, 0xE4, 0xFD, 0xDB, 0x14, 0xE5, + 0xC0, 0xE2, 0xD4, 0xE0, 0x07, 0xE4, 0x04, 0xDA, 0x3A, 0xFA, 0x3A, 0xE7, + 0x04, 0x10, 0x17, 0xF4, 0x56, 0x10, 0xD2, 0xEE, 0x76, 0x0C, 0x9F, 0xE9, + 0x34, 0x09, 0x6A, 0xEC, 0x3E, 0x05, 0x38, 0xF4, 0xE6, 0x0B, 0x71, 0x05, + 0x92, 0x1B, 0xEA, 0x13, 0x39, 0x20, 0x71, 0x08, 0xD2, 0x16, 0xD9, 0xF7, + 0x6E, 0x0D, 0x4D, 0xF5, 0xD6, 0x01, 0xBC, 0xF0, 0xF8, 0xFB, 0xE6, 0xF1, + 0x22, 0xFE, 0x09, 0xF9, 0x9B, 0xEE, 0x00, 0xF3, 0x37, 0xE7, 0x57, 0xF1, + 0x27, 0xF1, 0x3B, 0xEF, 0x13, 0xDF, 0x3D, 0xD8, 0x42, 0xC9, 0x15, 0xD8, + 0x15, 0xD2, 0xB8, 0xEE, 0x22, 0xD4, 0x08, 0xF0, 0x75, 0xD1, 0xE9, 0xEE, + 0x4F, 0xEB, 0x8A, 0xF6, 0x1F, 0xF9, 0x6B, 0xEE, 0x23, 0xEA, 0xFB, 0xE9, + 0x59, 0xF5, 0x70, 0x0A, 0x63, 0x13, 0x77, 0x2A, 0x06, 0x17, 0x2F, 0x2D, + 0x05, 0x0E, 0x18, 0x2E, 0xD9, 0x08, 0x23, 0x29, 0xD2, 0x02, 0x71, 0x0D, + 0xAD, 0x07, 0x51, 0xFD, 0xC3, 0x13, 0xD8, 0x03, 0xA5, 0x10, 0x5A, 0x09, + 0xA8, 0x02, 0x74, 0x19, 0x3E, 0xFD, 0xFE, 0x27, 0x43, 0x07, 0x00, 0x26, + 0xE8, 0x18, 0x76, 0x24, 0x9F, 0x22, 0x2E, 0x20, 0x20, 0x1E, 0x24, 0x20, + 0xD4, 0x18, 0x22, 0x29, 0xC5, 0x19, 0x27, 0x2A, 0x31, 0x0C, 0x1B, 0x20, + 0xD3, 0xFF, 0x37, 0x13, 0x6A, 0x0D, 0xA0, 0x09, 0x67, 0x1A, 0x6A, 0xFA, + 0xD5, 0x1F, 0x90, 0xEE, 0xC7, 0x1C, 0xBB, 0xF9, 0xC5, 0xFD, 0xD1, 0xF6, + 0x4C, 0xE7, 0x42, 0xE5, 0xE4, 0xFE, 0x00, 0xE5, 0x13, 0x0F, 0xF1, 0xD5, + 0x50, 0x05, 0x59, 0xC5, 0xC8, 0x0B, 0x01, 0xD5, 0x65, 0x0B, 0x9D, 0xDF, + 0x3B, 0xEF, 0xFA, 0xD5, 0x2A, 0xE1, 0x25, 0xD2, 0xDF, 0xE9, 0x09, 0xD6, + 0xDF, 0xE9, 0x26, 0xD8, 0x56, 0xEF, 0xFC, 0xE6, 0x9B, 0x0B, 0x44, 0x05, + 0x04, 0x20, 0x6B, 0x1B, 0xB1, 0x26, 0xB0, 0x21, 0xE2, 0x20, 0xC1, 0x20, + 0xE9, 0x03, 0xE0, 0x18, 0x4E, 0xF2, 0x74, 0x14, 0xB1, 0xF7, 0x46, 0x1A, + 0x09, 0xFB, 0x92, 0x16, 0xFA, 0xFE, 0x5F, 0x0D, 0x36, 0xFF, 0xEC, 0x06, + 0xF9, 0xF7, 0xC5, 0xFC, 0x18, 0xF9, 0xDC, 0x03, 0x03, 0xFA, 0xB4, 0x15, + 0x4D, 0xF9, 0x5A, 0x16, 0x3C, 0x10, 0xF9, 0x0E, 0x2A, 0x2B, 0x55, 0x05, + 0xAC, 0x1D, 0x1C, 0xF0, 0x09, 0x00, 0x0E, 0xE0, 0xEC, 0xFD, 0x76, 0xE9, + 0x5F, 0xF9, 0xE6, 0xF4, 0x64, 0xE8, 0xDB, 0xEF, 0x93, 0xF7, 0x08, 0xF0, + 0xA5, 0xFC, 0x38, 0xEA, 0x0C, 0xD8, 0x9C, 0xD0, 0x49, 0xCA, 0x53, 0xC9, + 0x25, 0xCE, 0xB9, 0xC8, 0x86, 0xCB, 0xC1, 0xB9, 0x36, 0xDF, 0xFB, 0xC5, + 0xE1, 0xE5, 0x16, 0xDE, 0xB9, 0xCF, 0x97, 0xDC, 0xFF, 0xCF, 0x51, 0xDE, + 0x4D, 0xE2, 0xB0, 0xE8, 0x8C, 0xE2, 0x60, 0xE5, 0xAD, 0xDA, 0x95, 0xE7, + 0x40, 0xDF, 0x30, 0xF7, 0x0E, 0xDB, 0x56, 0xF8, 0x11, 0xCD, 0x36, 0xEF, + 0x26, 0xCB, 0xB8, 0xE6, 0x40, 0xCA, 0x9D, 0xD5, 0x22, 0xD5, 0xC3, 0xCA, + 0x43, 0xEC, 0x7B, 0xD3, 0xDB, 0xEA, 0xF4, 0xD8, 0x12, 0xE2, 0xA5, 0xD8, + 0xF1, 0xE4, 0x51, 0xE1, 0x50, 0xDE, 0xEB, 0xDE, 0xE4, 0xE5, 0xE9, 0xD4, + 0x69, 0x09, 0xDC, 0xE0, 0x4F, 0x1E, 0xB9, 0xF4, 0xB4, 0x18, 0xC8, 0xFF, + 0xC9, 0x09, 0x57, 0x09, 0x0C, 0xF7, 0xB5, 0x00, 0x3C, 0xEA, 0xFE, 0xDF, + 0x01, 0xEE, 0xE9, 0xD1, 0x02, 0xF3, 0x5E, 0xDE, 0x1F, 0xEC, 0x5D, 0xE9, + 0xEA, 0xEF, 0x85, 0xFA, 0xE8, 0xF5, 0xEE, 0x0B, 0x1E, 0xE4, 0x4A, 0x07, + 0xB7, 0xDE, 0xD9, 0xFF, 0x30, 0xE5, 0xC5, 0xFC, 0x1D, 0xD7, 0xEF, 0xE9, + 0x98, 0xD9, 0x7D, 0xDC, 0xB0, 0xE7, 0xF1, 0xDC, 0xF9, 0xD1, 0x5D, 0xD2, + 0x07, 0xBB, 0x10, 0xCC, 0x48, 0xC1, 0xFD, 0xD0, 0x8F, 0xC9, 0xD7, 0xCD, + 0x53, 0xD7, 0x9F, 0xD3, 0xA4, 0xF6, 0xCE, 0xF0, 0xA7, 0x0B, 0x91, 0x00, + 0x6A, 0x06, 0xF3, 0xF4, 0xBD, 0xFD, 0xAD, 0xED, 0xF5, 0xF8, 0xD1, 0xE0, + 0x5E, 0xEC, 0x3D, 0xCF, 0x0B, 0xE8, 0xB6, 0xD5, 0xB6, 0xF0, 0x30, 0xE3, + 0xC9, 0xF6, 0x3C, 0xE7, 0xCD, 0x00, 0x98, 0xE9, 0x54, 0x04, 0x5F, 0xE8, + 0x2F, 0xFD, 0x44, 0xE9, 0x81, 0x02, 0x65, 0xF4, 0x5E, 0x12, 0x39, 0xFF, + 0xBD, 0x1C, 0x36, 0x06, 0x77, 0x17, 0x58, 0x12, 0x4A, 0x08, 0xF7, 0x1D, + 0x76, 0x01, 0xA7, 0x16, 0x9C, 0x06, 0xD1, 0x0A, 0x1F, 0x07, 0x6B, 0x0D, + 0x2F, 0xF6, 0x90, 0x0F, 0x87, 0xE1, 0xB1, 0x11, 0x93, 0xD9, 0x04, 0x11, + 0xE6, 0xD6, 0x75, 0xFD, 0x9B, 0xDE, 0xE8, 0xF1, 0xD4, 0xF4, 0x2D, 0xF8, + 0xBB, 0xF4, 0xF9, 0xEA, 0xA9, 0xEA, 0xCE, 0xDE, 0x60, 0xF8, 0x29, 0xEB, + 0x7C, 0xFF, 0x4D, 0xE4, 0x82, 0xFA, 0xFE, 0xD5, 0x7E, 0x00, 0x75, 0xE1, + 0xD4, 0x03, 0xA3, 0xEA, 0x4E, 0x02, 0x5E, 0xE7, 0xC4, 0x0B, 0xF4, 0xF1, + 0xFB, 0x09, 0xF5, 0x08, 0xB6, 0xF8, 0x77, 0x0F, 0x38, 0xFD, 0x2A, 0x08, + 0xF0, 0x10, 0x2A, 0x00, 0x4D, 0x0F, 0x80, 0xF8, 0x01, 0x02, 0x94, 0x04, + 0x74, 0x06, 0xB1, 0x16, 0x6A, 0x10, 0xBC, 0x1B, 0x14, 0x15, 0xF7, 0x27, + 0x4C, 0x15, 0x55, 0x2D, 0x23, 0x10, 0xA6, 0x21, 0x3D, 0x18, 0x3F, 0x24, + 0xDF, 0x21, 0xDB, 0x28, 0x17, 0x1D, 0xBB, 0x1F, 0xD2, 0x1A, 0x2E, 0x20, + 0x81, 0x14, 0xDC, 0x24, 0xC6, 0xFD, 0x37, 0x1F, 0xC1, 0xEF, 0xF8, 0x17, + 0x5E, 0x02, 0x62, 0x1A, 0xF7, 0x1A, 0xCD, 0x1A, 0x8C, 0x20, 0x21, 0x16, + 0x51, 0x1F, 0x47, 0x1E, 0xFF, 0x0E, 0xF6, 0x1B, 0x83, 0xF9, 0x69, 0x06, + 0x6D, 0xFB, 0x57, 0x01, 0x7C, 0xF6, 0x33, 0xFD, 0x0B, 0xE7, 0x51, 0xEA, + 0x48, 0xF9, 0xAA, 0xE9, 0x1D, 0x08, 0x33, 0xE8, 0xE8, 0xF2, 0x75, 0xDD, + 0x40, 0xF6, 0x88, 0xEC, 0xFE, 0x10, 0x11, 0xF8, 0xBE, 0x15, 0x28, 0xED, + 0x43, 0x1B, 0x1B, 0xF3, 0x60, 0x25, 0x76, 0x14, 0x95, 0x18, 0xDF, 0x32, + 0x07, 0x0D, 0x1A, 0x3F, 0x4C, 0x13, 0x4B, 0x3A, 0xBA, 0x0A, 0x44, 0x26, + 0x88, 0x01, 0xDC, 0x11, 0x6D, 0x0D, 0x7C, 0x0C, 0x3E, 0x0D, 0x89, 0x12, + 0x9C, 0x0D, 0xA1, 0x1F, 0xAB, 0x2A, 0x1B, 0x2D, 0xE4, 0x3C, 0x27, 0x28, + 0xED, 0x34, 0x96, 0x2D, 0xE3, 0x32, 0xAA, 0x44, 0x89, 0x38, 0x48, 0x43, + 0xE9, 0x39, 0x72, 0x3D, 0x88, 0x3B, 0xA2, 0x47, 0xCB, 0x3B, 0x1F, 0x4B, + 0x02, 0x3A, 0xB1, 0x3A, 0x9C, 0x40, 0x09, 0x27, 0xC1, 0x3E, 0x9A, 0x27, + 0x2A, 0x24, 0x50, 0x2C, 0x76, 0x15, 0xDA, 0x2E, 0xF0, 0x1B, 0x5B, 0x30, + 0x64, 0x17, 0x0D, 0x1F, 0x18, 0x1A, 0x6A, 0x13, 0x0F, 0x28, 0xB6, 0x1B, + 0x6C, 0x1B, 0x07, 0x1A, 0xBF, 0x16, 0x65, 0x1C, 0x0D, 0x28, 0x91, 0x23, + 0x7D, 0x1C, 0x3E, 0x13, 0x18, 0x0F, 0xF0, 0x08, 0x12, 0x19, 0x6E, 0x10, + 0x39, 0x11, 0x70, 0x05, 0x80, 0x04, 0x94, 0xF6, 0xC2, 0x10, 0x7D, 0x04, + 0x52, 0x11, 0x96, 0x0E, 0x25, 0xFD, 0xA8, 0x07, 0xC1, 0xFC, 0x86, 0x0B, + 0x4D, 0x03, 0xEA, 0x07, 0x9A, 0xFC, 0x93, 0xF3, 0x30, 0x02, 0xA8, 0xED, + 0x08, 0x09, 0x14, 0xFB, 0x92, 0xFE, 0x68, 0xFA, 0x64, 0x01, 0x1A, 0xF7, + 0x57, 0x08, 0xE1, 0x02, 0x60, 0xFE, 0x74, 0x01, 0x2C, 0x00, 0xB3, 0xFD, + 0xB3, 0x0A, 0x7F, 0x05, 0xC4, 0x04, 0xE9, 0x06, 0x55, 0x02, 0xA6, 0xFF, + 0x24, 0x0C, 0x59, 0xFF, 0x81, 0x08, 0xE6, 0x01, 0xDA, 0xF9, 0x3A, 0xF8, + 0x06, 0xFA, 0x2E, 0xF6, 0xDB, 0xF4, 0x43, 0x05, 0xC4, 0xDA, 0x38, 0x12, + 0xE1, 0xD6, 0x91, 0x19, 0x34, 0xDC, 0x03, 0x0C, 0x46, 0xD4, 0x6D, 0xEC, + 0x69, 0xD7, 0x06, 0xDD, 0x57, 0xCC, 0x1D, 0xCD, 0x96, 0xB9, 0x68, 0xBB, + 0x34, 0xC8, 0xEF, 0xCB, 0xC8, 0xD9, 0x50, 0xD6, 0xA1, 0xDD, 0x47, 0xC9, + 0x73, 0xE5, 0xDA, 0xD4, 0x35, 0xDD, 0xEF, 0xE5, 0xD4, 0xC6, 0x64, 0xDD, + 0x97, 0xD0, 0x40, 0xDD, 0x7D, 0xF3, 0x5A, 0xF3, 0x85, 0xFD, 0xFA, 0xF5, + 0xF8, 0xFA, 0x38, 0xEB, 0xFF, 0xF9, 0xAA, 0xF2, 0xC4, 0xE1, 0xDB, 0xEA, + 0x34, 0xCE, 0x88, 0xD7, 0xE2, 0xD9, 0x2E, 0xE2, 0xF5, 0xE5, 0xAF, 0xF0, + 0x6F, 0xEE, 0x45, 0xF1, 0xCA, 0x04, 0xA1, 0xFA, 0x71, 0x11, 0xE5, 0x03, + 0xCB, 0x0F, 0x7D, 0xFF, 0x67, 0x15, 0xEB, 0x01, 0x66, 0x19, 0x32, 0x10, + 0xE7, 0x1A, 0x2E, 0x19, 0xFE, 0x27, 0x8D, 0x20, 0x76, 0x2F, 0xFA, 0x25, + 0xBA, 0x28, 0xEB, 0x18, 0xF0, 0x24, 0x01, 0x03, 0xB1, 0x21, 0x65, 0xF9, + 0x70, 0x0F, 0xAC, 0xF8, 0xA8, 0xFE, 0xEA, 0x02, 0xD0, 0xF8, 0x57, 0x0F, + 0x98, 0xF1, 0x2D, 0x0A, 0x69, 0xF8, 0xBF, 0x05, 0x9B, 0xFB, 0x1A, 0x02, + 0x0E, 0xEB, 0x34, 0xF7, 0xFF, 0xF2, 0xC8, 0x03, 0x03, 0x06, 0x62, 0x11, + 0xFC, 0x06, 0xE8, 0x03, 0x66, 0x10, 0xD2, 0x01, 0xAC, 0x16, 0x3C, 0x0D, + 0xDA, 0x00, 0x7C, 0x11, 0xC2, 0xEE, 0x18, 0x1D, 0xEB, 0xF9, 0xFB, 0x36, + 0x6B, 0x0F, 0xD6, 0x41, 0xEB, 0x1D, 0xA0, 0x36, 0x29, 0x23, 0xAC, 0x35, + 0x37, 0x20, 0xF4, 0x33, 0x55, 0x1E, 0x2D, 0x23, 0xCD, 0x26, 0x3B, 0x21, + 0x71, 0x26, 0x30, 0x2D, 0x52, 0x1F, 0x58, 0x2D, 0xCB, 0x2C, 0x61, 0x25, + 0xAF, 0x33, 0x6B, 0x1F, 0x87, 0x26, 0x41, 0x23, 0x2D, 0x1F, 0x68, 0x31, + 0x7C, 0x22, 0x03, 0x39, 0x76, 0x32, 0xEC, 0x37, 0x25, 0x47, 0x36, 0x3B, + 0xDC, 0x49, 0x2E, 0x3D, 0xF8, 0x39, 0x9E, 0x34, 0xFD, 0x28, 0x61, 0x26, + 0xAB, 0x23, 0xE0, 0x1A, 0xB0, 0x2B, 0x85, 0x13, 0xBA, 0x3D, 0x84, 0x17, + 0xE9, 0x47, 0x9C, 0x22, 0x52, 0x3D, 0xD4, 0x22, 0x2B, 0x37, 0x45, 0x1E, + 0x4A, 0x2C, 0x7D, 0x0F, 0x5D, 0x0E, 0x51, 0xF7, 0x64, 0x05, 0x32, 0xF7, + 0xB8, 0x04, 0xA8, 0xFE, 0x12, 0xFB, 0x9D, 0xF7, 0xD2, 0x04, 0x3B, 0xF7, + 0x55, 0x0F, 0x2E, 0xF8, 0xD9, 0x04, 0xD2, 0xF8, 0x92, 0x00, 0xD8, 0x0E, + 0xBD, 0x11, 0x16, 0x29, 0xB7, 0x27, 0x79, 0x37, 0x97, 0x32, 0x69, 0x3C, + 0x96, 0x31, 0xF4, 0x35, 0xD8, 0x29, 0x84, 0x22, 0xF5, 0x1E, 0x54, 0x10, + 0xE1, 0x13, 0x39, 0x11, 0x64, 0x08, 0x20, 0x15, 0x51, 0xFF, 0x56, 0x1D, + 0x09, 0xFE, 0x45, 0x2E, 0xFB, 0xFD, 0x62, 0x2C, 0x75, 0x09, 0x94, 0x14, + 0x17, 0x1C, 0xFC, 0x00, 0xC2, 0x19, 0x4A, 0xF9, 0x78, 0x16, 0xA9, 0xFB, + 0x9E, 0x25, 0xEF, 0x0A, 0x58, 0x2A, 0x5B, 0x18, 0xA0, 0x1D, 0x89, 0x1E, + 0xD2, 0x0C, 0x5E, 0x1E, 0x9D, 0xF5, 0x84, 0x11, 0x02, 0xE4, 0xCC, 0xFF, + 0x65, 0xE9, 0x8F, 0xF3, 0x89, 0xF1, 0xF5, 0xE5, 0x3C, 0xE5, 0x93, 0xD9, + 0x7B, 0xE2, 0x49, 0xDE, 0x48, 0xE8, 0x94, 0xE1, 0xD4, 0xDA, 0x8D, 0xCF, + 0xAD, 0xDA, 0x00, 0xCD, 0x85, 0xE2, 0x22, 0xDE, 0x3B, 0xD4, 0xB6, 0xDD, + 0xFD, 0xD1, 0xE9, 0xDD, 0x1E, 0xDE, 0xCD, 0xDD, 0x46, 0xD6, 0x18, 0xCE, + 0x38, 0xCB, 0x29, 0xCD, 0x03, 0xD1, 0x65, 0xDA, 0xCC, 0xDC, 0x51, 0xE9, + 0x4C, 0xE2, 0x53, 0xF6, 0x4C, 0xDA, 0x85, 0xF5, 0x4F, 0xC4, 0x8D, 0xE5, + 0xA0, 0xB5, 0x68, 0xCC, 0xE1, 0xC4, 0x28, 0xBF, 0x88, 0xE1, 0x94, 0xC5, + 0x09, 0xEC, 0xAF, 0xCB, 0xF9, 0xF2, 0x24, 0xD5, 0xB1, 0x03, 0x26, 0xE1, + 0x16, 0x06, 0x5E, 0xE4, 0x82, 0xFB, 0xE4, 0xE3, 0x57, 0xE7, 0x63, 0xE0, + 0xE0, 0xDE, 0xFF, 0xE5, 0x85, 0xEE, 0xFA, 0xED, 0xE8, 0xFB, 0xA3, 0xE5, + 0x91, 0xF8, 0x26, 0xD7, 0xAC, 0xED, 0xAB, 0xD3, 0x84, 0xE0, 0xE5, 0xDB, + 0xA0, 0xD5, 0xD3, 0xEB, 0x03, 0xE3, 0x76, 0xFC, 0xB8, 0xFB, 0x15, 0x03, + 0x14, 0xFE, 0x56, 0xFA, 0xD8, 0xF0, 0x8D, 0xE9, 0x1F, 0xE5, 0x02, 0xDF, + 0x59, 0xC7, 0x09, 0xCD, 0x6E, 0xB2, 0x0D, 0xC9, 0x39, 0xBB, 0x41, 0xD7, + 0x06, 0xB7, 0xB7, 0xD3, 0x2D, 0xBC, 0x35, 0xD8, 0x7A, 0xCE, 0x58, 0xD9, + 0xC0, 0xCD, 0x23, 0xCD, 0xB5, 0xC3, 0x18, 0xCD, 0x6A, 0xC8, 0xA5, 0xD5, + 0x9F, 0xDA, 0x90, 0xDE, 0xF7, 0xF5, 0xAE, 0xE7, 0x72, 0x0F, 0xC8, 0xED, + 0x5D, 0x01, 0x5E, 0xE5, 0xD4, 0xE1, 0x6C, 0xDB, 0x3D, 0xCE, 0xF9, 0xD3, + 0x35, 0xC9, 0xB2, 0xCB, 0x08, 0xD4, 0x1D, 0xD3, 0xDA, 0xE6, 0x3A, 0xDC, + 0xD9, 0x00, 0x9F, 0xDB, 0xC6, 0x0C, 0x96, 0xE4, 0xC6, 0x0B, 0x51, 0xF9, + 0xB5, 0x0C, 0x39, 0x03, 0x71, 0x07, 0xE8, 0xFA, 0xE1, 0x12, 0xEC, 0xFE, + 0xF0, 0x0F, 0x77, 0x03, 0x20, 0xFB, 0x0A, 0xFF, 0xBC, 0xFF, 0x68, 0x07, + 0x1E, 0xF2, 0x40, 0x08, 0x6D, 0xE2, 0x8C, 0xFC, 0xFC, 0xE7, 0x00, 0xFD, + 0xB1, 0xF7, 0x64, 0x0A, 0x8F, 0xEC, 0xF1, 0x02, 0xFB, 0xCD, 0xD4, 0xEC, + 0x84, 0xDB, 0x01, 0xEE, 0xD1, 0xDA, 0xDE, 0xE8, 0x66, 0xD1, 0x22, 0xCF, + 0x62, 0xEE, 0x78, 0xD6, 0x22, 0xEE, 0x5A, 0xDA, 0x4F, 0xF0, 0xF5, 0xCD, + 0x11, 0x13, 0x66, 0xD8, 0xA6, 0x14, 0x8C, 0xE5, 0xBA, 0xF7, 0xE6, 0xEA, + 0x49, 0xFA, 0xD4, 0xF3, 0x7D, 0x09, 0x44, 0xF5, 0x67, 0xF6, 0x46, 0xEF, + 0xFC, 0xF4, 0x49, 0xF7, 0xBD, 0x01, 0xE1, 0xF9, 0x4D, 0xFC, 0x3E, 0xF2, + 0x74, 0xF8, 0x91, 0xF5, 0xA8, 0x00, 0x5C, 0x0A, 0xC5, 0x0D, 0x23, 0x19, + 0xC6, 0x22, 0x7C, 0x1B, 0xFA, 0x2E, 0x2D, 0x23, 0xC6, 0x1B, 0x07, 0x22, + 0xE6, 0x0B, 0x32, 0x21, 0x29, 0x06, 0x02, 0x2B, 0x5C, 0xFB, 0xC8, 0x30, + 0x17, 0xFA, 0x9A, 0x2E, 0x69, 0x07, 0xEC, 0x23, 0x5B, 0x13, 0xBE, 0x16, + 0xD9, 0x1A, 0xC2, 0x14, 0x59, 0x19, 0x72, 0x1B, 0x33, 0x05, 0xFC, 0x21, + 0x4B, 0xFD, 0xD0, 0x17, 0xDD, 0x0C, 0x1A, 0x0D, 0x9B, 0x0D, 0x49, 0x0C, + 0xBC, 0xFB, 0x97, 0xF1, 0x73, 0x01, 0xA5, 0xE2, 0xF2, 0x05, 0x8E, 0xF0, + 0x79, 0xE1, 0xAD, 0xE2, 0x97, 0xE0, 0xE4, 0xD0, 0x64, 0x03, 0xA3, 0xD2, + 0xD7, 0xF4, 0x04, 0xC2, 0x93, 0xEF, 0x15, 0xBE, 0x6D, 0x0D, 0x46, 0xDB, + 0xD3, 0x0D, 0xCE, 0xE9, 0xAC, 0x08, 0x3E, 0xF1, 0xAE, 0x10, 0x13, 0x03, + 0x97, 0x03, 0x80, 0x09, 0x38, 0xF8, 0x60, 0x03, 0xC3, 0x01, 0xEB, 0xFF, + 0x87, 0x01, 0xB5, 0xFE, 0x47, 0xF6, 0xBB, 0xFE, 0x65, 0xF3, 0xEB, 0x07, + 0x8E, 0xF3, 0xCA, 0x11, 0x6A, 0xE8, 0x59, 0x14, 0x38, 0xEF, 0x27, 0x1B, + 0xA3, 0x0C, 0x32, 0x24, 0xC8, 0x1E, 0x54, 0x24, 0x90, 0x1B, 0xC4, 0x1C, + 0x65, 0x0C, 0xE9, 0x16, 0xAB, 0x0F, 0x7C, 0x19, 0x7F, 0x12, 0xED, 0x14, + 0x6F, 0x07, 0xE4, 0x0F, 0x4E, 0x0F, 0x3D, 0x15, 0x9C, 0x20, 0x99, 0x17, + 0xDC, 0x2B, 0x82, 0x24, 0x99, 0x1D, 0x01, 0x2A, 0x63, 0x06, 0x17, 0x14, + 0xC8, 0x0D, 0x68, 0x01, 0xF7, 0x07, 0xD9, 0xF4, 0x19, 0xF9, 0xE2, 0xF1, + 0xE7, 0x01, 0x11, 0x00, 0xF0, 0xF8, 0x6D, 0xFA, 0x18, 0xF5, 0x6A, 0xF5, + 0x56, 0x0C, 0xC2, 0xFD, 0x4D, 0x0A, 0x46, 0xE6, 0x8B, 0xF0, 0xFF, 0xCF, + 0xDE, 0xF4, 0xD7, 0xE5, 0x1D, 0xF6, 0x73, 0xF4, 0xE6, 0xE9, 0x30, 0xF5, + 0xE6, 0xEF, 0x0D, 0xFF, 0x5D, 0xF8, 0x0C, 0xFC, 0x7C, 0xFE, 0xB7, 0xFB, + 0x01, 0xF3, 0x57, 0xFB, 0xC1, 0xE8, 0x8A, 0xF8, 0xB2, 0xEA, 0xB2, 0xF4, + 0x19, 0xF5, 0xCF, 0xEF, 0xE7, 0x06, 0xE0, 0xE9, 0xD6, 0x07, 0xD8, 0xD9, + 0x8C, 0xFB, 0xBA, 0xD8, 0x50, 0xF7, 0x4F, 0xF4, 0xF5, 0xF0, 0x5C, 0x0A, + 0x3D, 0xF9, 0xA8, 0x0B, 0x13, 0x10, 0x64, 0x01, 0x40, 0x21, 0xCB, 0xF9, + 0x64, 0x2A, 0x6D, 0x01, 0xE3, 0x25, 0x87, 0x07, 0x2C, 0x14, 0xD2, 0x08, + 0xB3, 0xF8, 0x99, 0x13, 0xF3, 0xF4, 0x14, 0x27, 0xD8, 0xF6, 0x4B, 0x25, + 0x5E, 0xF0, 0x1A, 0x14, 0xB1, 0xF2, 0xF1, 0x0F, 0x68, 0xEC, 0xBC, 0x0A, + 0x82, 0xD8, 0x80, 0xF9, 0x7A, 0xDB, 0xCA, 0xFD, 0xF6, 0xEF, 0x77, 0x09, + 0x73, 0xED, 0x58, 0xF7, 0x8B, 0xED, 0x9C, 0xEF, 0xB3, 0xEF, 0x7E, 0xEE, + 0x79, 0xDE, 0xC2, 0xD7, 0xCE, 0xEA, 0x95, 0xD5, 0x57, 0xFE, 0x2C, 0xE3, + 0xFB, 0xF6, 0x6A, 0xE6, 0x1B, 0xF7, 0x85, 0xE9, 0x60, 0xFF, 0xB7, 0xE8, + 0xE8, 0x00, 0x9D, 0xE0, 0xD4, 0xFD, 0xDD, 0xDC, 0xB6, 0x01, 0x89, 0xE8, + 0x7D, 0x05, 0x53, 0xF7, 0xE5, 0x05, 0xF8, 0xFD, 0x8E, 0x10, 0xF0, 0x08, + 0xB4, 0x13, 0xA7, 0x0A, 0x50, 0x10, 0x1F, 0x03, 0x43, 0x18, 0x0A, 0x0D, + 0x39, 0x1A, 0xD7, 0x1D, 0xDE, 0x1E, 0xC9, 0x2C, 0x62, 0x2C, 0x5D, 0x3B, + 0xF6, 0x29, 0xFB, 0x3B, 0x06, 0x21, 0x72, 0x29, 0xBE, 0x27, 0xAE, 0x20, + 0xD5, 0x33, 0xF6, 0x2A, 0x1E, 0x25, 0x5B, 0x22, 0x16, 0x1A, 0xCC, 0x1E, + 0x32, 0x1E, 0xE2, 0x2A, 0xE3, 0x0B, 0xFD, 0x1A, 0xD8, 0xFC, 0xC9, 0x04, + 0xE7, 0xFF, 0xC8, 0x12, 0x7B, 0xF5, 0xE7, 0x15, 0xA6, 0xF0, 0x74, 0x02, + 0x8E, 0x0B, 0xD7, 0x12, 0x43, 0x13, 0xB5, 0x19, 0x8D, 0xF8, 0x7B, 0xF4, + 0x5F, 0xF7, 0xB8, 0xE4, 0x56, 0xFA, 0xCF, 0xE3, 0x8C, 0xE9, 0x3F, 0xDE, + 0x5E, 0xEA, 0xA6, 0xF5, 0xA2, 0xF7, 0xB5, 0x11, 0x1A, 0x07, 0x89, 0x0C, + 0xC5, 0x0D, 0x15, 0x04, 0x61, 0x06, 0x8C, 0x13, 0x54, 0xFA, 0xC2, 0x18, + 0xA9, 0xFB, 0xC0, 0x1A, 0x27, 0x07, 0x81, 0x23, 0xCD, 0x10, 0x9A, 0x19, + 0x7A, 0x17, 0xD5, 0x0B, 0x40, 0x0C, 0x2E, 0x0C, 0x79, 0xF8, 0xDC, 0x0C, + 0xC8, 0xF8, 0xF3, 0x13, 0x6C, 0x05, 0x4F, 0x25, 0xF4, 0x0A, 0x2C, 0x29, + 0x28, 0x16, 0xFA, 0x29, 0x53, 0x16, 0x7F, 0x26, 0x55, 0x10, 0x18, 0x15, + 0x6B, 0x21, 0x23, 0x0B, 0x69, 0x2C, 0x61, 0x1A, 0xD2, 0x2A, 0x07, 0x29, + 0x0A, 0x29, 0xC5, 0x1A, 0x64, 0x2F, 0xB9, 0x16, 0xFE, 0x28, 0x01, 0x0F, + 0x16, 0x12, 0xB0, 0xEE, 0x57, 0x20, 0x5B, 0xF5, 0x93, 0x2D, 0xA2, 0x0C, + 0xA2, 0x1A, 0x4A, 0xFC, 0xD6, 0x1B, 0xA6, 0xF9, 0x26, 0x17, 0x0B, 0x08, + 0xC9, 0xF8, 0x0E, 0xF8, 0x4E, 0xF4, 0x26, 0xF0, 0x91, 0x06, 0xD6, 0xFD, + 0xEF, 0xF8, 0xB9, 0xED, 0xCF, 0xE6, 0xA7, 0xE2, 0x4F, 0xF2, 0xDB, 0xF9, + 0x70, 0xF7, 0xCC, 0xFD, 0x26, 0x00, 0x57, 0x05, 0xE5, 0x19, 0x93, 0x21, + 0x13, 0x19, 0xA5, 0x21, 0x70, 0x08, 0x10, 0x11, 0x53, 0x00, 0x5F, 0x13, + 0x83, 0xEE, 0xAC, 0x0B, 0xC2, 0xDF, 0x79, 0xF6, 0xFF, 0xE8, 0x1C, 0xFD, + 0x36, 0xFA, 0xFC, 0x08, 0x9F, 0x07, 0x97, 0x0B, 0xB3, 0x1D, 0x3B, 0x1B, + 0x36, 0x37, 0xCD, 0x23, 0x84, 0x3A, 0xCE, 0x13, 0x8B, 0x35, 0x71, 0x0B, + 0xCC, 0x2C, 0xBD, 0x0E, 0x20, 0x18, 0x24, 0x0E, 0xCA, 0x0C, 0xDD, 0x10, + 0x5A, 0x17, 0x78, 0x1D, 0x65, 0x25, 0x28, 0x21, 0xCC, 0x21, 0xB1, 0x17, + 0xFD, 0x28, 0xC0, 0x19, 0xD0, 0x20, 0x23, 0x15, 0x4C, 0xFE, 0x8F, 0x17, + 0x04, 0xF3, 0xC4, 0x2C, 0xE9, 0xED, 0xC4, 0x1C, 0x3D, 0xF5, 0x53, 0x08, + 0xFE, 0x0F, 0x24, 0x18, 0x4D, 0x0E, 0x89, 0x0F, 0xB3, 0x02, 0x6B, 0x02, + 0x0B, 0x03, 0x72, 0x10, 0x8F, 0xEF, 0x96, 0x06, 0xB5, 0xD2, 0xC2, 0xE6, + 0x05, 0xDA, 0x8F, 0xE8, 0xD3, 0xDE, 0xC0, 0xF2, 0x25, 0xD1, 0xE9, 0xE9, + 0x50, 0xE4, 0x96, 0xF7, 0xD7, 0xF4, 0x16, 0x03, 0xED, 0xE6, 0x3F, 0xF7, + 0xA1, 0xE2, 0x67, 0xF5, 0x44, 0xF1, 0x88, 0xF5, 0x2E, 0xED, 0x14, 0xD9, + 0x04, 0xF7, 0xA0, 0xCD, 0x4F, 0x12, 0x0E, 0xDE, 0x0C, 0x07, 0x47, 0xDF, + 0x33, 0x00, 0xF4, 0xE7, 0x30, 0x1A, 0x4A, 0x04, 0x0F, 0x1C, 0x70, 0x10, + 0x7E, 0x11, 0x21, 0x15, 0xE6, 0x1E, 0x0F, 0x20, 0xFD, 0x29, 0x0F, 0x17, + 0xE0, 0x1A, 0x30, 0x02, 0xAB, 0x0F, 0x56, 0x12, 0x32, 0x0E, 0x9B, 0x2E, + 0xDE, 0xFA, 0x0E, 0x24, 0xCC, 0x07, 0x30, 0x1D, 0x88, 0x1E, 0x3D, 0x1B, + 0x95, 0x1D, 0x7C, 0x0F, 0x58, 0x20, 0x01, 0x16, 0x4C, 0xFF, 0x60, 0x19, + 0x0D, 0xD3, 0xD9, 0x07, 0xC1, 0xD1, 0x00, 0xF9, 0x9F, 0xDD, 0x44, 0xEF, + 0xFB, 0xD9, 0xDB, 0xE8, 0x60, 0xEB, 0x99, 0xFA, 0xD4, 0xF7, 0x3F, 0xFC, + 0x3D, 0xE0, 0xB0, 0xDE, 0xD0, 0xE2, 0x8E, 0xDD, 0x72, 0xF4, 0xA6, 0xE7, + 0xD7, 0xFA, 0x85, 0xE7, 0x38, 0x0E, 0xBE, 0xF5, 0x78, 0x0C, 0x3C, 0x01, + 0xC3, 0xEE, 0x8A, 0xFA, 0x40, 0xF0, 0x0F, 0xF9, 0x7B, 0xEA, 0x17, 0xEB, + 0xF5, 0xC0, 0x05, 0xC7, 0x15, 0xBA, 0xB4, 0xB8, 0x94, 0xD3, 0xB2, 0xC3, + 0xD4, 0xCE, 0xC6, 0xCC, 0xAD, 0xE5, 0xF8, 0xEE, 0xF2, 0x23, 0xA1, 0x15, + 0x60, 0x30, 0xFF, 0x0A, 0x90, 0x27, 0xF0, 0x03, 0x89, 0x2A, 0xFD, 0x0D, + 0xB7, 0x15, 0x4B, 0x05, 0xFF, 0xFA, 0x30, 0x00, 0x4A, 0xFA, 0x6E, 0x0B, + 0x8F, 0xF3, 0x6C, 0x02, 0xA0, 0xE9, 0x90, 0xEA, 0xD9, 0xE0, 0x28, 0xDE, + 0x50, 0xD4, 0x94, 0xE0, 0x65, 0xD2, 0xB0, 0xE6, 0x0A, 0xDA, 0xAB, 0xE7, + 0x40, 0xE5, 0x6A, 0xEA, 0xAB, 0xE7, 0xF0, 0xDD, 0xCE, 0xEE, 0x19, 0xCE, + 0xDA, 0xFB, 0x67, 0xCE, 0x52, 0x10, 0xC2, 0xDC, 0xE1, 0x19, 0xA9, 0xE7, + 0x17, 0xFD, 0x93, 0xE9, 0x1A, 0xE4, 0x07, 0xFD, 0x21, 0xD9, 0xAF, 0xF7, + 0x39, 0xC9, 0x9D, 0xD8, 0x95, 0xE5, 0xCE, 0xEB, 0x08, 0x13, 0xEA, 0x0E, + 0x50, 0x14, 0x61, 0x13, 0xE5, 0x1A, 0x5B, 0x24, 0xEF, 0x20, 0xD4, 0x31, + 0x64, 0xFF, 0xDE, 0x0E, 0x77, 0xD8, 0x39, 0xE2, 0xEA, 0xDC, 0x05, 0xDC, + 0x6E, 0xED, 0x43, 0xE2, 0x2D, 0xF3, 0xCD, 0xF1, 0xB5, 0x0A, 0xF4, 0x15, + 0x7D, 0x09, 0xEC, 0x26, 0xBF, 0xED, 0x0D, 0x23, 0x90, 0xED, 0xE4, 0x19, + 0xE1, 0xFA, 0x81, 0x09, 0x69, 0x12, 0x57, 0x0D, 0x71, 0x22, 0x7D, 0x21, + 0xEF, 0x11, 0x78, 0x1E, 0x4F, 0xFB, 0x82, 0x06, 0x18, 0xF5, 0x78, 0xF3, + 0xEA, 0xE5, 0x46, 0xE0, 0xD8, 0xDE, 0xA8, 0xDC, 0x8B, 0xFC, 0x4E, 0xF1, + 0xA2, 0xFE, 0xA0, 0xEB, 0xA9, 0xE7, 0x59, 0xDD, 0x39, 0xDD, 0x93, 0xD4, + 0x60, 0xC5, 0xC0, 0xC4, 0x44, 0xC0, 0xCD, 0xD2, 0xD7, 0xE0, 0xC9, 0xE0, + 0x7E, 0xFD, 0xB9, 0xD2, 0x1D, 0x1C, 0x96, 0xE6, 0x79, 0x32, 0xE9, 0x02, + 0x0F, 0x17, 0x37, 0xE3, 0x23, 0x03, 0x7A, 0xDF, 0x1E, 0x1E, 0x38, 0x18, + 0xE0, 0x27, 0xE7, 0x1E, 0xAC, 0x29, 0x17, 0x19, 0xA6, 0x3C, 0xA5, 0x3D, + 0x9E, 0x27, 0xED, 0x24, 0x38, 0xF8, 0x9D, 0xE4, 0xEA, 0xE4, 0x84, 0xDD, + 0x1F, 0xD6, 0x82, 0xE9, 0xC5, 0xD8, 0x1B, 0xFA, 0xBA, 0x05, 0xD3, 0x25, + 0x1C, 0x28, 0x31, 0x38, 0xCE, 0x34, 0x19, 0x34, 0xF9, 0x39, 0x21, 0x39, + 0xD8, 0x21, 0xDE, 0x25, 0x2D, 0x16, 0xFC, 0x1C, 0x05, 0x27, 0x23, 0x31, + 0x2D, 0x2B, 0xDA, 0x3B, 0x83, 0x23, 0x73, 0x36, 0xE0, 0x17, 0xA7, 0x2A, + 0xB5, 0xF2, 0xBE, 0x07, 0xE8, 0xD1, 0x11, 0xDC, 0x24, 0xEA, 0x2C, 0xE4, + 0x94, 0x05, 0x40, 0xFD, 0xF7, 0xEF, 0x21, 0xFE, 0x00, 0xEC, 0x13, 0xFC, + 0x90, 0xF7, 0x53, 0xE6, 0xBA, 0xEE, 0x6A, 0xC6, 0xA8, 0x07, 0xFD, 0xDB, + 0x10, 0x23, 0x94, 0xF7, 0x8C, 0x0F, 0xE3, 0xEA, 0xC4, 0x10, 0xEA, 0x03, + 0x21, 0x09, 0xA6, 0x08, 0xC6, 0xD8, 0x81, 0xCC, 0x73, 0xDC, 0x35, 0xD1, + 0xB4, 0x18, 0xC4, 0x08, 0x13, 0x2E, 0x54, 0x06, 0xF6, 0x2B, 0xF7, 0x0F, + 0xFF, 0x38, 0xEC, 0x41, 0x4B, 0x0F, 0x22, 0x25, 0x8E, 0xD9, 0xB1, 0xE1, + 0xBC, 0xD0, 0xBA, 0xC7, 0x09, 0xCE, 0xA0, 0xBA, 0x58, 0xE3, 0xB4, 0xD1, + 0x05, 0x03, 0xE3, 0x00, 0x8D, 0x00, 0xEA, 0x10, 0x30, 0xF4, 0xD5, 0x0E, + 0x7D, 0xF7, 0xCB, 0x05, 0x3A, 0xFD, 0x4B, 0xEF, 0x6D, 0x06, 0x02, 0xEF, + 0xF5, 0x17, 0x3F, 0x08, 0x67, 0x17, 0x04, 0x0D, 0x3F, 0x09, 0x34, 0x03, + 0x5F, 0xF8, 0xA6, 0xF9, 0x83, 0xC1, 0x2E, 0xD1, 0xB7, 0xA0, 0xAD, 0xB6, + 0x58, 0xB3, 0x93, 0xC5, 0x39, 0xB2, 0xE0, 0xCD, 0x9A, 0xA4, 0xE2, 0xD2, + 0x0E, 0xB9, 0x6C, 0xE4, 0x57, 0xC0, 0x09, 0xC8, 0x2B, 0xA6, 0x6B, 0x9C, + 0x39, 0xBD, 0x25, 0xC2, 0x45, 0xE2, 0x7D, 0xEB, 0xC5, 0xDF, 0xAA, 0xE3, + 0x83, 0xF9, 0xE3, 0xFC, 0x0D, 0x11, 0x30, 0x06, 0x95, 0xE0, 0x11, 0xC5, + 0x9E, 0xD3, 0x26, 0xBB, 0x0C, 0xF7, 0x70, 0xE0, 0xF6, 0xFA, 0x02, 0xE9, + 0xBA, 0x0D, 0x82, 0x06, 0x21, 0x30, 0x32, 0x24, 0x25, 0x1C, 0xB2, 0x09, + 0xFC, 0xEE, 0x07, 0xDD, 0x23, 0xD2, 0x20, 0xC0, 0x93, 0xBA, 0x72, 0xB2, + 0x45, 0xC9, 0x2A, 0xD5, 0x14, 0xF8, 0x4E, 0x0B, 0x45, 0x07, 0x10, 0x18, + 0xA5, 0x13, 0x47, 0x15, 0xC7, 0x37, 0xC5, 0x19, 0x5A, 0x2A, 0x2E, 0x0D, + 0xC4, 0x17, 0x50, 0x16, 0x7B, 0x30, 0xF1, 0x32, 0x85, 0x35, 0x6A, 0x33, + 0x15, 0x1A, 0x59, 0x22, 0x86, 0x05, 0xF6, 0x0D, 0x64, 0xEC, 0x00, 0xE8, + 0xEE, 0xCD, 0xDC, 0xC8, 0x81, 0xE7, 0xD8, 0xE4, 0x76, 0x07, 0xC6, 0x03, + 0xD6, 0xF1, 0x4D, 0x04, 0xFD, 0xE8, 0x0E, 0x10, 0x46, 0xDF, 0xCD, 0xFE, + 0xCE, 0xAE, 0x07, 0xC6, 0x8E, 0xCD, 0x54, 0xCF, 0x2F, 0x1C, 0x56, 0x05, + 0x6A, 0x18, 0xBD, 0x10, 0x0E, 0x19, 0x7F, 0x1E, 0xCE, 0x44, 0xD4, 0x36, + 0x36, 0x27, 0xC0, 0x14, 0x81, 0xF9, 0x66, 0xEF, 0x8B, 0x1B, 0xEB, 0x0E, + 0xE2, 0x36, 0x2D, 0x33, 0x0C, 0x41, 0xA2, 0x42, 0xB2, 0x5E, 0xC6, 0x55, + 0xDC, 0x4B, 0x5F, 0x50, 0x5F, 0x0F, 0xFA, 0x1E, 0x23, 0xF7, 0x4A, 0xFA, + 0x71, 0xE8, 0xFC, 0xF4, 0xCB, 0xE5, 0x91, 0x01, 0x9F, 0x09, 0xB2, 0x21, + 0x75, 0x1B, 0x25, 0x34, 0x38, 0x19, 0xEA, 0x33, 0x37, 0x2C, 0xCA, 0x39, + 0xCA, 0x36, 0x77, 0x43, 0x75, 0x31, 0x44, 0x49, 0x31, 0x4C, 0x42, 0x59, + 0xB5, 0x5B, 0x0E, 0x65, 0x25, 0x40, 0x17, 0x56, 0x6C, 0x2E, 0xC9, 0x32, + 0x10, 0x11, 0x87, 0xFD, 0xF5, 0xCF, 0xBB, 0xCC, 0x55, 0xC7, 0x28, 0xCD, + 0xBF, 0xF3, 0xBA, 0xEA, 0x4E, 0x05, 0xF3, 0xFC, 0x26, 0x0B, 0xAB, 0x03, + 0x45, 0x17, 0x18, 0x0C, 0x28, 0xFA, 0xF6, 0xF1, 0xD8, 0xF6, 0xB8, 0xDE, + 0xF7, 0x2E, 0x62, 0x07, 0x39, 0x29, 0x41, 0x11, 0xBE, 0x0B, 0x97, 0xFE, + 0x44, 0x2C, 0xB4, 0x1E, 0x8A, 0x30, 0x94, 0x26, 0x2A, 0x0C, 0x2D, 0xF8, + 0x5E, 0x1B, 0xDF, 0x07, 0xE3, 0x29, 0xB9, 0x31, 0xA5, 0x19, 0xF9, 0x2A, + 0x31, 0x24, 0x23, 0x33, 0xF7, 0x28, 0xD6, 0x40, 0x7D, 0x06, 0xCB, 0x15, + 0xB2, 0xF4, 0xCF, 0xEF, 0x18, 0xEB, 0xB5, 0xEC, 0x23, 0xCF, 0x07, 0xE5, + 0xE2, 0xDF, 0xD3, 0xFE, 0xC3, 0xFD, 0x2F, 0x26, 0x55, 0xFE, 0xB4, 0x28, + 0x11, 0x1C, 0x56, 0x23, 0x04, 0x41, 0x19, 0x1D, 0xCE, 0x40, 0xF0, 0x0F, + 0x11, 0x37, 0x16, 0x10, 0xDE, 0x22, 0x96, 0x19, 0xDD, 0x0B, 0xD2, 0x19, + 0x32, 0x07, 0x17, 0xFE, 0x5B, 0x00, 0x05, 0xDD, 0x7B, 0xD5, 0x66, 0xBF, + 0xC6, 0xB6, 0x6F, 0xB1, 0x2E, 0xC4, 0x43, 0xBF, 0x47, 0xCC, 0x0A, 0xC7, + 0xE6, 0xD2, 0x1B, 0xD1, 0x59, 0xE0, 0x13, 0xEB, 0x52, 0xD5, 0x19, 0xEA, + 0xE5, 0xC2, 0x33, 0xD4, 0x9D, 0xE7, 0x60, 0xFB, 0x8D, 0xF8, 0x65, 0x14, + 0x66, 0xD8, 0x3E, 0xF3, 0xBA, 0xE4, 0x7A, 0xFA, 0xAF, 0xF3, 0xB2, 0x02, + 0x18, 0xCD, 0xD9, 0xD7, 0x6F, 0xC2, 0x54, 0xCF, 0xB9, 0xEB, 0xB5, 0xFB, + 0x28, 0xE9, 0x77, 0x01, 0xA3, 0xE9, 0x8D, 0x09, 0x58, 0x06, 0xD5, 0x1E, + 0x17, 0xF3, 0x34, 0xFC, 0x58, 0xCC, 0xFE, 0xCE, 0x57, 0xB2, 0xB4, 0xB8, + 0x52, 0xA4, 0x99, 0xA3, 0x84, 0xC9, 0x08, 0xAC, 0x3D, 0x01, 0xDD, 0xD8, + 0xF4, 0x0B, 0xB4, 0xF4, 0x1C, 0x18, 0x2C, 0x03, 0x55, 0x33, 0x38, 0x12, + 0x56, 0x26, 0x93, 0x05, 0x56, 0x10, 0x51, 0xF7, 0x7B, 0x0D, 0xC4, 0xFF, + 0xEF, 0x07, 0x43, 0x02, 0x3A, 0x08, 0xF5, 0xF9, 0x69, 0x00, 0x7F, 0xE4, + 0xE9, 0xDF, 0xEC, 0xC9, 0x26, 0xB8, 0xF0, 0xBC, 0xD8, 0xB2, 0xD6, 0xCE, + 0x49, 0xC4, 0x56, 0xE9, 0x5B, 0xD2, 0x60, 0xFE, 0x5E, 0xEE, 0x12, 0x18, + 0x29, 0xF9, 0x85, 0x12, 0xBA, 0xCE, 0xE8, 0xE6, 0x8B, 0xCE, 0x3A, 0xF1, + 0xB4, 0xF5, 0x2B, 0x17, 0x77, 0xE0, 0x11, 0x03, 0xD5, 0xD7, 0x94, 0xFE, + 0xE7, 0xF9, 0x20, 0x1A, 0x54, 0xEC, 0xC9, 0xF9, 0xE7, 0xDE, 0xD7, 0xD3, + 0x80, 0xFE, 0x30, 0xF2, 0x70, 0xFD, 0x30, 0x05, 0x7D, 0x02, 0xAB, 0x0A, + 0x9B, 0x32, 0x90, 0x29, 0x5B, 0x3B, 0xB2, 0x2B, 0x32, 0x16, 0x78, 0x07, + 0x93, 0xF7, 0xF2, 0xEB, 0xF3, 0xD3, 0x18, 0xD0, 0x2C, 0xCD, 0x47, 0xCC, + 0xE3, 0xFB, 0x10, 0xF3, 0xAA, 0x1F, 0x9F, 0x0E, 0xFD, 0x31, 0x35, 0x23, + 0x6B, 0x45, 0x5B, 0x40, 0x80, 0x46, 0x78, 0x3B, 0xAE, 0x3F, 0x24, 0x28, + 0xAA, 0x3F, 0xB2, 0x2F, 0x7F, 0x29, 0xD5, 0x30, 0x80, 0x07, 0x1D, 0x20, + 0x2C, 0xFC, 0x06, 0x0D, 0x0D, 0xEB, 0x0E, 0xEF, 0xA5, 0xC2, 0x19, 0xCC, + 0x94, 0xC0, 0x83, 0xCB, 0x5E, 0xDE, 0xF6, 0xE6, 0xAA, 0xEF, 0x18, 0xFD, + 0x71, 0x08, 0x12, 0x09, 0xE8, 0x26, 0x98, 0x10, 0xED, 0x11, 0x5E, 0xFB, + 0x84, 0x02, 0xF9, 0xF4, 0x01, 0x2E, 0xA8, 0x17, 0xDE, 0x34, 0xE2, 0x16, + 0x0F, 0x16, 0x2B, 0x04, 0x7F, 0x25, 0x18, 0x22, 0x40, 0x2D, 0x6A, 0x25, + 0xBB, 0x0E, 0xBA, 0xF9, 0x9C, 0x14, 0xF4, 0x05, 0x09, 0x20, 0x44, 0x23, + 0xB0, 0x1D, 0x69, 0x29, 0x53, 0x40, 0x42, 0x4A, 0xC4, 0x5B, 0xE2, 0x5C, + 0x28, 0x45, 0xC7, 0x46, 0x7F, 0x1F, 0x32, 0x2F, 0x77, 0xF1, 0x7E, 0x13, + 0xFE, 0xCF, 0xEA, 0xFF, 0x58, 0xF1, 0x6B, 0x17, 0x63, 0x23, 0xB8, 0x35, + 0x2F, 0x30, 0x03, 0x43, 0xCB, 0x4C, 0xC7, 0x5C, 0x24, 0x59, 0x4D, 0x5D, + 0xC8, 0x30, 0x5C, 0x36, 0xD4, 0x27, 0xA1, 0x2E, 0xDE, 0x30, 0x73, 0x2F, + 0x3E, 0x21, 0xDE, 0x1D, 0xDC, 0x1F, 0x27, 0x1B, 0x8B, 0x27, 0xB7, 0x15, + 0xA2, 0xFD, 0xC1, 0xE5, 0x43, 0xD5, 0x3D, 0xC6, 0xA6, 0xE3, 0x80, 0xE0, + 0x77, 0xF4, 0xE4, 0xF2, 0x74, 0x14, 0x63, 0x01, 0xC5, 0x3F, 0x0C, 0x25, + 0x06, 0x24, 0x06, 0x1D, 0xD2, 0xEE, 0x36, 0xF5, 0x59, 0x09, 0x6A, 0x00, + 0x56, 0x21, 0x2F, 0x05, 0x26, 0xFD, 0x96, 0xE4, 0xDB, 0x07, 0x45, 0xF6, + 0xE5, 0x25, 0xDF, 0x17, 0x3A, 0x08, 0x58, 0x06, 0xDE, 0x03, 0xB4, 0x03, + 0xE2, 0x15, 0xFC, 0x17, 0xEB, 0x04, 0xAF, 0x18, 0x8A, 0x10, 0x3F, 0x23, + 0x2D, 0x2D, 0xD9, 0x2F, 0x07, 0x19, 0x1A, 0x1A, 0x51, 0xF5, 0xD2, 0xFE, + 0x2E, 0xD9, 0x7F, 0xEC, 0xAB, 0xAE, 0x2A, 0xC9, 0x2F, 0xAB, 0x42, 0xBE, + 0xEA, 0xD7, 0x05, 0xE3, 0xA2, 0xFA, 0x3E, 0x09, 0x5A, 0x2B, 0x1F, 0x2E, + 0x7C, 0x5A, 0x23, 0x4C, 0x7F, 0x42, 0x4A, 0x37, 0xB2, 0x25, 0x4D, 0x1B, + 0x8B, 0x1F, 0xFE, 0x1A, 0x3F, 0xFB, 0x30, 0x0A, 0x60, 0xE9, 0xC7, 0xFA, + 0x70, 0xFA, 0x27, 0xFB, 0x2B, 0xE8, 0xF6, 0xE0, 0x3B, 0xB6, 0x7A, 0xB7, + 0xF7, 0xBA, 0x21, 0xBF, 0xEC, 0xD5, 0x0C, 0xD9, 0xFB, 0xE1, 0x53, 0xE5, + 0xC0, 0x0B, 0x44, 0x09, 0x58, 0x1C, 0xF0, 0x19, 0x39, 0xEF, 0xD6, 0xEF, + 0x88, 0xEC, 0x08, 0xED, 0x85, 0x06, 0x91, 0x0D, 0xD5, 0xEE, 0xD3, 0xEF, + 0x5A, 0xE8, 0xDC, 0xD0, 0x19, 0xFE, 0x30, 0xE1, 0xBD, 0xE7, 0xCD, 0xD5, + 0xF3, 0xCC, 0x45, 0xB9, 0x41, 0xD9, 0x67, 0xC8, 0x63, 0xDC, 0xBE, 0xD9, + 0x7A, 0xF1, 0x33, 0xEA, 0x59, 0x20, 0xCA, 0x0C, 0x9B, 0x18, 0xCF, 0x03, + 0x46, 0xF0, 0x67, 0xD6, 0x0F, 0xD8, 0x1B, 0xC7, 0x3D, 0xB5, 0x27, 0xB6, + 0xA7, 0x96, 0xBB, 0x9A, 0xFC, 0xBB, 0x38, 0xBF, 0xD0, 0xF6, 0x4E, 0xF9, + 0x3E, 0x04, 0x01, 0x07, 0x52, 0x17, 0x10, 0x1A, 0x43, 0x28, 0xA5, 0x23, + 0x3D, 0x16, 0x0D, 0x03, 0x9C, 0x07, 0x60, 0xF6, 0x2B, 0xEC, 0x3F, 0xFB, + 0x5F, 0xD5, 0xC8, 0xFC, 0x53, 0xD4, 0x35, 0xFC, 0x51, 0xC7, 0xED, 0xE9, + 0x91, 0xA8, 0x53, 0xBF, 0x5B, 0x9C, 0xA6, 0xB0, 0xCE, 0xB0, 0x5C, 0xCF, + 0xE6, 0xBF, 0x02, 0xDE, 0x7A, 0xD8, 0x35, 0xE5, 0xDB, 0xFF, 0x76, 0xFF, + 0x7C, 0xF2, 0x69, 0xEE, 0x84, 0xD2, 0x5A, 0xC3, 0xCA, 0xEA, 0xB1, 0xD9, + 0x75, 0xF6, 0xFE, 0xE5, 0xBA, 0xDC, 0xFB, 0xC5, 0x73, 0xF1, 0x19, 0xDB, + 0x89, 0x1A, 0xBB, 0xFA, 0x02, 0x08, 0xAC, 0xD6, 0x1C, 0xF8, 0xE5, 0xC0, + 0x4F, 0x0E, 0x1B, 0xDB, 0x60, 0x0C, 0x1B, 0xE9, 0xE6, 0x0C, 0x24, 0x07, + 0x89, 0x12, 0x1C, 0x25, 0x0F, 0xFE, 0x0F, 0x0E, 0x73, 0xEA, 0x4A, 0xF1, + 0x8E, 0xD8, 0xE8, 0xE9, 0x13, 0xB6, 0x2E, 0xD1, 0xE2, 0xC5, 0x9D, 0xDF, + 0x1E, 0x13, 0x12, 0x1F, 0x06, 0x2F, 0x54, 0x31, 0xD4, 0x2B, 0xE3, 0x33, + 0x73, 0x45, 0x75, 0x55, 0xF0, 0x36, 0x21, 0x49, 0x29, 0x11, 0xFB, 0x20, + 0xC4, 0x09, 0x6B, 0x1A, 0x57, 0x0D, 0x2F, 0x19, 0x1C, 0x01, 0x6E, 0x05, + 0xF5, 0xE8, 0xC6, 0xEC, 0x88, 0xDA, 0x0D, 0xDA, 0x8A, 0xCB, 0xB5, 0xC1, + 0x01, 0xDA, 0xAD, 0xCC, 0xAC, 0x01, 0x0D, 0xF5, 0x30, 0x0F, 0xF5, 0x08, + 0xE6, 0x16, 0x09, 0x18, 0x10, 0x1A, 0x9A, 0x1D, 0x79, 0xFF, 0xFC, 0xFA, + 0xED, 0x05, 0xAF, 0xF2, 0x6A, 0x25, 0xBE, 0x07, 0xCF, 0x08, 0xB1, 0xEF, + 0x41, 0xF0, 0x5F, 0xEC, 0x45, 0x11, 0x1E, 0x18, 0xD6, 0x0D, 0xA4, 0x0C, + 0x4E, 0xFA, 0x33, 0xEB, 0xBA, 0x19, 0xBE, 0x0A, 0xA5, 0x28, 0x08, 0x26, + 0x2E, 0x22, 0x01, 0x2C, 0x24, 0x32, 0xFA, 0x43, 0x77, 0x24, 0x56, 0x38, + 0xD3, 0xF9, 0x31, 0x0C, 0xC7, 0xE4, 0xDD, 0xF1, 0x30, 0xC5, 0xCB, 0xD7, + 0xD7, 0xAF, 0x54, 0xD2, 0x14, 0xDB, 0xFB, 0x06, 0x89, 0x0E, 0x45, 0x32, + 0x1D, 0x29, 0x59, 0x34, 0x44, 0x48, 0x32, 0x3C, 0x50, 0x44, 0x61, 0x32, + 0x90, 0x1C, 0x8D, 0x14, 0x33, 0x0E, 0x93, 0x11, 0xBA, 0x13, 0x4A, 0x15, + 0x64, 0x15, 0xD2, 0x04, 0x60, 0x12, 0x9C, 0xED, 0x89, 0x02, 0x69, 0xE2, + 0xF9, 0xD3, 0xA9, 0xC9, 0x32, 0xBF, 0x60, 0xC3, 0xE0, 0xDF, 0x2F, 0xEC, + 0x1C, 0xFF, 0xCE, 0x09, 0xA3, 0x1A, 0x82, 0x1A, 0x99, 0x39, 0x30, 0x2A, + 0xEA, 0x27, 0xEA, 0x09, 0xFC, 0x14, 0xF2, 0xF3, 0x11, 0x2B, 0xE9, 0x14, + 0x02, 0x1A, 0x0A, 0x0E, 0xA9, 0xFC, 0x1B, 0xF1, 0x1E, 0x17, 0xF9, 0x0C, + 0x97, 0x13, 0x59, 0x14, 0xB4, 0xE6, 0x3A, 0xEB, 0x22, 0xF8, 0x6E, 0xF0, + 0xBE, 0x24, 0x09, 0x09, 0x38, 0x35, 0xBB, 0x09, 0xFA, 0x49, 0x89, 0x27, + 0x7F, 0x3C, 0x99, 0x38, 0xDE, 0x04, 0xBF, 0x19, 0x4E, 0xEE, 0xDB, 0xFF, + 0x14, 0xE7, 0x04, 0xE7, 0x1C, 0xDF, 0x28, 0xD7, 0x7D, 0xFD, 0xAF, 0xFF, + 0x30, 0x24, 0x91, 0x35, 0xF8, 0x32, 0xE1, 0x3B, 0x03, 0x48, 0x89, 0x40, + 0x55, 0x53, 0xF5, 0x48, 0xAF, 0x37, 0xF9, 0x32, 0x2E, 0x25, 0x14, 0x25, + 0x13, 0x25, 0x70, 0x27, 0x77, 0x1B, 0x69, 0x1B, 0xA7, 0x07, 0xFF, 0xFC, + 0x28, 0xFF, 0x4D, 0xFB, 0x77, 0xED, 0x05, 0xF8, 0xD5, 0xD8, 0x4A, 0xE0, + 0xD9, 0xEE, 0xF5, 0xF2, 0xCF, 0x08, 0x9B, 0x18, 0x91, 0x02, 0xE9, 0x23, + 0x90, 0x01, 0xBB, 0x2C, 0xD0, 0xF9, 0x7C, 0x1A, 0xCA, 0xF4, 0x57, 0xFE, + 0x09, 0x0A, 0xDA, 0x16, 0xD3, 0x03, 0x14, 0x20, 0x8E, 0xEE, 0xE0, 0xFD, + 0xED, 0x09, 0x3E, 0x02, 0x6F, 0x1E, 0x6E, 0x14, 0x79, 0xE5, 0xD8, 0xF4, + 0xA9, 0xD3, 0x67, 0xF8, 0x5A, 0x09, 0x8B, 0x1C, 0x10, 0x1E, 0x4E, 0x0B, + 0x40, 0x25, 0x4D, 0x04, 0x61, 0x30, 0x53, 0x1D, 0x8C, 0x07, 0x03, 0xFD, + 0x85, 0xD3, 0xDC, 0xC2, 0xB5, 0xC2, 0x07, 0xB2, 0x87, 0xBA, 0x93, 0xAE, + 0x66, 0xC4, 0x9D, 0xB8, 0x5A, 0xF1, 0xBB, 0xEA, 0x2C, 0x17, 0x06, 0x12, + 0x6F, 0x28, 0xDB, 0x1A, 0xD6, 0x3C, 0xC5, 0x27, 0x88, 0x34, 0xA5, 0x18, + 0x15, 0x15, 0x6C, 0xF8, 0xB2, 0x01, 0x49, 0xEB, 0xEC, 0xFA, 0x8C, 0xDF, + 0x8D, 0xE4, 0x24, 0xBE, 0x1A, 0xC6, 0x31, 0xB2, 0x20, 0xB0, 0xE2, 0xB9, + 0x4C, 0x9F, 0xBF, 0xAC, 0xD5, 0xB1, 0x89, 0xBC, 0xEB, 0xD3, 0x88, 0xE7, + 0x28, 0xDA, 0x44, 0xF9, 0xE9, 0xE4, 0xE2, 0x07, 0xF9, 0xE5, 0x64, 0x07, + 0x82, 0xD6, 0x33, 0xEA, 0xD0, 0xE3, 0x91, 0xF2, 0x39, 0xE0, 0x3E, 0xFE, + 0x9E, 0xB0, 0x2D, 0xD4, 0xF7, 0xA7, 0xE9, 0xCB, 0x74, 0xCD, 0x28, 0xEB, + 0xBB, 0xC7, 0x09, 0xCC, 0x26, 0xC3, 0xD6, 0xB6, 0x07, 0xEF, 0x84, 0xE1, + 0x32, 0xF5, 0x59, 0xE9, 0x48, 0xE2, 0x61, 0xE8, 0x7E, 0xF6, 0xA1, 0x0D, + 0xA2, 0xF1, 0xB7, 0xFF, 0x00, 0xCA, 0x38, 0xC9, 0x32, 0xC3, 0xB7, 0xB1, + 0x2D, 0xCA, 0x66, 0xA5, 0x78, 0xC2, 0x49, 0x9E, 0xE4, 0xD0, 0xB7, 0xC4, + 0x92, 0xEF, 0x34, 0xF3, 0xCD, 0x05, 0xAE, 0xFE, 0x60, 0x20, 0x55, 0x0B, + 0x9F, 0x21, 0x45, 0x05, 0x07, 0x08, 0xE0, 0xEA, 0x48, 0xF5, 0xEC, 0xE4, + 0xEC, 0xEC, 0x5E, 0xE8, 0x14, 0xDE, 0x89, 0xD1, 0x78, 0xD1, 0xA6, 0xC4, + 0xAD, 0xCA, 0xA7, 0xD1, 0xA5, 0xBC, 0x65, 0xCF, 0x29, 0xC5, 0xDC, 0xDA, + 0x8D, 0xEA, 0x7E, 0xF4, 0x86, 0x01, 0xA8, 0xF7, 0xA1, 0x03, 0xA4, 0xFA, + 0xDF, 0xF9, 0x37, 0xFA, 0x17, 0xE5, 0xA1, 0xE4, 0x6F, 0xFF, 0xA0, 0xFB, + 0x29, 0x24, 0x37, 0x21, 0xAB, 0x09, 0x75, 0x06, 0x4E, 0xF5, 0x44, 0xFC, + 0xF0, 0x11, 0xA1, 0x25, 0xF3, 0x0C, 0xDE, 0x14, 0x7A, 0xFE, 0x2A, 0xF8, + 0xD2, 0x2A, 0xD8, 0x24, 0xD9, 0x44, 0x94, 0x31, 0x6E, 0x3D, 0x8A, 0x22, + 0x2F, 0x4D, 0x0E, 0x49, 0x47, 0x3E, 0xC1, 0x51, 0x6B, 0xF8, 0x57, 0x24, + 0x31, 0xDE, 0x73, 0x16, 0x01, 0xF4, 0x54, 0x0D, 0x27, 0xFA, 0xC1, 0xF9, + 0x46, 0x0F, 0xE1, 0x16, 0x82, 0x34, 0x5F, 0x43, 0xE3, 0x39, 0xB2, 0x50, + 0x26, 0x44, 0x3E, 0x5D, 0x79, 0x57, 0xF1, 0x57, 0x65, 0x4A, 0x89, 0x39, + 0x25, 0x33, 0x05, 0x2F, 0xCA, 0x24, 0xD4, 0x2C, 0x9A, 0x15, 0x7E, 0x12, + 0x60, 0x0B, 0xFC, 0xF1, 0x13, 0x0B, 0x9C, 0xEF, 0xEC, 0xFA, 0x02, 0xEF, + 0x35, 0xF5, 0x68, 0xF6, 0x80, 0x17, 0x99, 0x1A, 0xEC, 0x36, 0x4A, 0x37, + 0x1C, 0x42, 0x88, 0x48, 0xF0, 0x3E, 0xB3, 0x42, 0xAA, 0x27, 0x8A, 0x15, + 0x08, 0x2B, 0x76, 0x0B, 0x72, 0x42, 0xA7, 0x23, 0x7D, 0x22, 0x82, 0x0D, + 0xF9, 0xFC, 0x42, 0xFD, 0x82, 0x1D, 0x3D, 0x1F, 0x7E, 0x2C, 0x30, 0x16, + 0xDF, 0x0D, 0xB2, 0xF6, 0x5C, 0x20, 0x44, 0x19, 0x0D, 0x39, 0x63, 0x2F, + 0xF6, 0x2A, 0xDA, 0x1C, 0x24, 0x37, 0x0E, 0x37, 0x95, 0x3B, 0xF0, 0x49, + 0x6E, 0x09, 0x08, 0x20, 0xDE, 0xEA, 0xA2, 0x0B, 0xAD, 0xEE, 0xCF, 0x08, + 0x9A, 0xE3, 0xB1, 0xED, 0x96, 0xF2, 0x48, 0xFA, 0x61, 0x24, 0xC8, 0x2A, + 0x83, 0x2B, 0x2F, 0x3A, 0x9F, 0x28, 0xA6, 0x47, 0x14, 0x3D, 0x26, 0x4A, + 0xC0, 0x35, 0xA0, 0x25, 0x47, 0x1F, 0x1B, 0x09, 0xA4, 0x16, 0x82, 0x03, + 0xEE, 0x06, 0x22, 0x07, 0xA6, 0xEF, 0x41, 0x03, 0x15, 0xF4, 0x94, 0xFC, + 0x1A, 0xEF, 0xB4, 0xE9, 0xF8, 0xE8, 0xB0, 0xD7, 0x57, 0x0D, 0x01, 0xEA, + 0x98, 0x23, 0x3A, 0x08, 0x9B, 0x1E, 0xFE, 0x1D, 0x11, 0x1C, 0x08, 0x26, + 0x7B, 0xFD, 0x94, 0x04, 0xE4, 0xED, 0xDB, 0xEF, 0xCD, 0x07, 0x93, 0x06, + 0xF5, 0xFD, 0x23, 0xF9, 0x50, 0xE7, 0x76, 0xE0, 0x73, 0x0A, 0xF0, 0x04, + 0x38, 0x14, 0xD7, 0x0D, 0x9D, 0xE8, 0x8C, 0xE3, 0x21, 0xF4, 0xD3, 0xEE, + 0x06, 0x11, 0x66, 0x07, 0x7E, 0xFA, 0x31, 0xF9, 0xA8, 0x01, 0xF7, 0x06, + 0x8E, 0x1A, 0xB4, 0x12, 0xD2, 0xEE, 0xBE, 0xE0, 0x92, 0xBC, 0x02, 0xBC, + 0xA1, 0xB0, 0xBA, 0xBF, 0x49, 0xAB, 0xF4, 0xC0, 0xB9, 0xC7, 0x71, 0xD9, + 0x02, 0x05, 0xDB, 0x09, 0xCD, 0x21, 0x0A, 0x19, 0x9E, 0x28, 0xBC, 0x1F, + 0xB6, 0x22, 0x01, 0x28, 0xFB, 0x00, 0x98, 0x0F, 0xEF, 0xEC, 0x45, 0xF9, + 0x7B, 0xEB, 0x1F, 0xF0, 0x10, 0xE6, 0xC9, 0xEB, 0x7A, 0xD8, 0x90, 0xE6, + 0xCE, 0xD4, 0xF4, 0xDD, 0x0A, 0xC3, 0x87, 0xCD, 0x8A, 0xAA, 0x25, 0xCA, + 0xCD, 0xBA, 0x9E, 0xDE, 0xC4, 0xCB, 0xC4, 0xEE, 0x5C, 0xDA, 0x51, 0x04, + 0xDF, 0xFC, 0xEB, 0x15, 0x59, 0xF4, 0x9B, 0xF8, 0x71, 0xE3, 0x7D, 0xDF, + 0x2C, 0x07, 0x54, 0xF3, 0xD9, 0x00, 0xE2, 0xE3, 0x3E, 0xD6, 0x38, 0xBD, + 0xFC, 0xED, 0x34, 0xD9, 0x11, 0x08, 0x3E, 0xEC, 0x88, 0xF3, 0x5E, 0xBE, + 0x4E, 0x04, 0x58, 0xBD, 0xC5, 0x1C, 0x61, 0xE2, 0x95, 0x04, 0x30, 0xE3, + 0x41, 0x02, 0xEF, 0xFB, 0xA5, 0x13, 0xF8, 0x23, 0x0C, 0xFA, 0xCC, 0x08, + 0x2E, 0xE6, 0xB6, 0xE4, 0x4B, 0xE8, 0xF9, 0xDA, 0x20, 0xD2, 0x09, 0xC6, + 0x9F, 0xD0, 0x26, 0xD2, 0xDA, 0xFD, 0xC3, 0x0D, 0x48, 0x16, 0x1B, 0x34, + 0x8B, 0x1D, 0xD5, 0x4A, 0x75, 0x29, 0x29, 0x5B, 0x4D, 0x17, 0xC6, 0x39, + 0x6C, 0x01, 0xAF, 0x0A, 0xF3, 0xF1, 0x94, 0xF5, 0x02, 0xE1, 0x2B, 0xF0, + 0xF2, 0xDA, 0x81, 0xEC, 0xB9, 0xE5, 0x38, 0xEF, 0xE1, 0xE2, 0xB8, 0xE2, + 0xD0, 0xD9, 0x3B, 0xD4, 0x97, 0xEF, 0x89, 0xE3, 0x11, 0xFC, 0xD9, 0xE3, + 0xB2, 0xFA, 0x70, 0xE2, 0x64, 0x0D, 0x0A, 0xFB, 0x6D, 0x01, 0xF4, 0xED, + 0x04, 0xE3, 0x5F, 0xD6, 0x7D, 0x02, 0x29, 0xF4, 0xDC, 0x11, 0x51, 0xF0, + 0x25, 0xF0, 0x96, 0xC9, 0x90, 0x06, 0xE2, 0xEA, 0xDE, 0x1C, 0x87, 0x0E, + 0x54, 0xF0, 0xB5, 0xEB, 0x47, 0xEC, 0x9A, 0xE6, 0x51, 0x15, 0x86, 0x09, + 0xB6, 0x19, 0x77, 0x07, 0xB9, 0x23, 0x85, 0x15, 0x8F, 0x3A, 0x93, 0x43, + 0xA6, 0x18, 0xDE, 0x34, 0xB2, 0xE4, 0x4B, 0x10, 0x66, 0xC3, 0x0E, 0x07, + 0xB1, 0xA2, 0x07, 0xE9, 0xBF, 0xA6, 0xEB, 0xD9, 0x30, 0xE4, 0x47, 0x07, + 0x0E, 0x16, 0xA5, 0x2E, 0x08, 0x27, 0xBC, 0x3E, 0xDB, 0x33, 0x0C, 0x4E, + 0xD9, 0x2A, 0x85, 0x3C, 0x14, 0x17, 0x11, 0x1A, 0xF0, 0x08, 0x55, 0xFF, + 0xE6, 0x01, 0x32, 0xF0, 0x67, 0xF5, 0xD7, 0xE3, 0xCF, 0xEC, 0xD9, 0xD9, + 0x97, 0xE1, 0xF4, 0xCB, 0x2C, 0xCE, 0xD0, 0xCA, 0x3D, 0xDF, 0x0E, 0xF0, + 0x47, 0xFB, 0xDC, 0x08, 0xD1, 0x10, 0x85, 0x10, 0xF6, 0x32, 0xB2, 0x28, + 0x73, 0x2E, 0x37, 0x15, 0x5F, 0x0A, 0xE2, 0xE3, 0x59, 0x19, 0xD8, 0xF5, + 0x8E, 0x22, 0xC6, 0x00, 0x07, 0xFE, 0xE2, 0xE1, 0xF6, 0x07, 0xCE, 0x02, + 0xAC, 0x25, 0x67, 0x2D, 0x6B, 0xFA, 0xE8, 0x09, 0x1D, 0xDB, 0x2E, 0xF1, + 0xE6, 0xFE, 0xCF, 0x01, 0x8D, 0x0C, 0x79, 0xF7, 0xCA, 0x12, 0x89, 0xF8, + 0x82, 0x2D, 0xFB, 0x20, 0xCE, 0x11, 0xB1, 0x1D, 0xB5, 0xDA, 0x2C, 0xF8, + 0x72, 0xD5, 0xDD, 0xEC, 0x64, 0xDB, 0xEC, 0xDB, 0x61, 0xE1, 0x1A, 0xCF, + 0xDB, 0x04, 0x8F, 0xF5, 0x30, 0x26, 0xA8, 0x1D, 0x2F, 0x2C, 0x98, 0x20, + 0xAE, 0x2D, 0xB1, 0x23, 0x22, 0x24, 0x99, 0x1C, 0x83, 0x12, 0xB2, 0x06, + 0x46, 0x0C, 0xD3, 0xF2, 0x40, 0x0E, 0x12, 0xED, 0xA5, 0xFE, 0x34, 0xEF, + 0x08, 0xE6, 0x81, 0xF1, 0xA4, 0xD1, 0xF3, 0xE6, 0x81, 0xC4, 0x74, 0xD8, + 0xCD, 0xE3, 0x59, 0xEE, 0x9E, 0x05, 0xC8, 0xFE, 0x9E, 0x05, 0x64, 0x08, + 0x40, 0x0A, 0x7C, 0x2B, 0xDE, 0xF6, 0x9F, 0x22, 0x15, 0xC1, 0xAD, 0xF2, + 0xCB, 0xCE, 0x0A, 0x05, 0xB0, 0xF3, 0x81, 0x14, 0xA9, 0xDE, 0x8D, 0xE3, + 0x0F, 0xEB, 0x14, 0xE9, 0xC8, 0x0C, 0x35, 0x13, 0x0E, 0xEA, 0xA6, 0xF4, + 0x65, 0xD1, 0xED, 0xDA, 0x10, 0xF7, 0xE8, 0xF0, 0xD5, 0x06, 0xF3, 0xE7, + 0xC7, 0x0D, 0xAD, 0xE3, 0xB6, 0x32, 0x13, 0x03, 0xD7, 0x1E, 0x57, 0xF6, + 0x53, 0xD9, 0x76, 0xC7, 0x41, 0xBA, 0x8F, 0xB9, 0x4F, 0xAA, 0x4D, 0xB7, + 0xEF, 0xA9, 0x77, 0xBD, 0xCB, 0xE8, 0xD8, 0xE7, 0x4E, 0x31, 0x87, 0x14, + 0xF1, 0x4C, 0xEF, 0x25, 0x69, 0x53, 0x57, 0x31, 0xB4, 0x3C, 0xCA, 0x27, + 0xE7, 0x11, 0xBC, 0x01, 0xBB, 0xFB, 0x53, 0xE4, 0x9B, 0xF9, 0xDA, 0xE4, + 0x9A, 0xEF, 0x94, 0xE7, 0xEC, 0xE6, 0x00, 0xE7, 0xD1, 0xD8, 0x3F, 0xE0, + 0x11, 0xB5, 0x13, 0xD5, 0x27, 0xBA, 0x1C, 0xF2, 0x8D, 0xD9, 0xF8, 0x0C, + 0x78, 0xEC, 0x59, 0x0E, 0x87, 0x0F, 0x46, 0x22, 0x1B, 0x16, 0x28, 0x1A, + 0x30, 0xE9, 0x0B, 0xEC, 0x8B, 0xE4, 0xA6, 0xF2, 0x92, 0xEE, 0x47, 0xFF, + 0x0A, 0xC9, 0x57, 0xDB, 0xA9, 0xD2, 0x68, 0xE9, 0x65, 0x07, 0x2C, 0x13, + 0xF0, 0xF6, 0x42, 0xF1, 0x04, 0xDF, 0x42, 0xDA, 0x67, 0xFE, 0x4D, 0xFB, + 0x7B, 0x07, 0x51, 0xFE, 0x1D, 0x0B, 0x31, 0x02, 0xA7, 0x2A, 0x84, 0x28, + 0xED, 0x18, 0xE2, 0x1E, 0x90, 0xE7, 0x79, 0xEC, 0x27, 0xD8, 0xD9, 0xD5, + 0x50, 0xC8, 0xC8, 0xC2, 0x19, 0xC2, 0xCB, 0xB8, 0x7C, 0xF7, 0xD2, 0xE5, + 0x6B, 0x30, 0xC9, 0x1E, 0xDD, 0x39, 0x25, 0x3B, 0xCB, 0x36, 0xC7, 0x41, + 0x5E, 0x2A, 0x3F, 0x28, 0x0B, 0x09, 0x85, 0x01, 0xF3, 0xEF, 0xFD, 0xE1, + 0x8C, 0xED, 0x08, 0xDE, 0xD6, 0xE7, 0x2A, 0xE0, 0x1C, 0xE5, 0x10, 0xD8, + 0x9B, 0xD8, 0x46, 0xC6, 0xAA, 0xC3, 0xBF, 0xB6, 0x63, 0xD9, 0x95, 0xD4, + 0xC6, 0xFE, 0x29, 0xEF, 0xC4, 0x14, 0x23, 0xF8, 0x92, 0x2B, 0x72, 0x0E, + 0xC6, 0x1A, 0x3E, 0x00, 0xB7, 0xE7, 0x72, 0xDF, 0x17, 0xED, 0x2F, 0xF8, + 0x8B, 0xFA, 0xCD, 0x06, 0xB1, 0xE4, 0xB7, 0xED, 0xED, 0xFD, 0xD0, 0x08, + 0x14, 0x26, 0x75, 0x30, 0xD6, 0x05, 0x10, 0x08, 0x48, 0xED, 0x4C, 0xEB, + 0x07, 0x09, 0x10, 0x06, 0x3D, 0x08, 0x20, 0x08, 0xC3, 0x0F, 0x2B, 0x19, + 0x62, 0x3A, 0xB1, 0x42, 0x3A, 0x2A, 0xB0, 0x31, 0x3F, 0xF4, 0x76, 0x06, + 0x80, 0xD5, 0x2F, 0xF8, 0x70, 0xB8, 0x42, 0xE5, 0xFE, 0xBE, 0xC8, 0xE3, + 0x6B, 0xFC, 0x50, 0x0A, 0x5A, 0x2A, 0x88, 0x29, 0xD7, 0x36, 0x06, 0x3D, + 0x1F, 0x3E, 0x2B, 0x49, 0x26, 0x2A, 0xB4, 0x34, 0xD8, 0x06, 0x95, 0x0E, + 0xE3, 0xF9, 0x4E, 0xEE, 0xD6, 0xFF, 0x8F, 0xDE, 0xF6, 0xFF, 0xF3, 0xDA, + 0xC2, 0x06, 0xC1, 0xE5, 0x30, 0xFF, 0x93, 0xE1, 0x34, 0xEB, 0x89, 0xDF, + 0x1F, 0x05, 0xEE, 0x0A, 0xC6, 0x1C, 0x7C, 0x24, 0xBA, 0x16, 0x57, 0x2D, + 0x97, 0x1D, 0x24, 0x44, 0x4F, 0x08, 0x09, 0x23, 0x28, 0xE4, 0x9B, 0xEA, + 0x5B, 0xF7, 0xD5, 0xF6, 0x16, 0xFC, 0xB1, 0xFC, 0x42, 0xE6, 0x1B, 0xE8, + 0xDF, 0xFF, 0x33, 0x08, 0x88, 0x14, 0xE5, 0x25, 0x1F, 0xEC, 0x64, 0x01, + 0xDE, 0xED, 0x1F, 0xFB, 0x95, 0x26, 0x50, 0x15, 0xFE, 0x29, 0xC9, 0x06, + 0x49, 0x26, 0xA9, 0x10, 0x08, 0x34, 0x1D, 0x2A, 0x31, 0x08, 0x58, 0x0D, + 0xC2, 0xCF, 0x69, 0xE7, 0x5B, 0xBD, 0xA5, 0xD9, 0x18, 0xBD, 0xB0, 0xCD, + 0x96, 0xE3, 0x42, 0xE2, 0xE0, 0x26, 0x75, 0x19, 0x52, 0x4D, 0x28, 0x37, + 0x0E, 0x55, 0xCC, 0x3F, 0x5A, 0x56, 0x41, 0x4A, 0x28, 0x39, 0x90, 0x3F, + 0x23, 0x0C, 0xE1, 0x2A, 0x73, 0xFF, 0x29, 0x1B, 0xB4, 0x02, 0xA0, 0x0B, + 0x64, 0xF7, 0x7A, 0xFC, 0xEA, 0xF3, 0xEB, 0xFD, 0xC0, 0xE8, 0x6E, 0xF2, + 0xDD, 0xEE, 0xAD, 0xEE, 0x5A, 0x1A, 0xEC, 0x15, 0x3E, 0x30, 0x51, 0x29, + 0x22, 0x38, 0xB9, 0x34, 0xA3, 0x49, 0x4B, 0x47, 0x57, 0x31, 0x5B, 0x21, + 0xBB, 0x09, 0xF6, 0xFC, 0x96, 0x14, 0x35, 0x19, 0x12, 0x0E, 0xDD, 0x1B, + 0x5D, 0xFC, 0x46, 0xFD, 0x6F, 0x24, 0x03, 0x0D, 0x18, 0x36, 0xED, 0x16, + 0x94, 0x02, 0x30, 0xEF, 0x3D, 0xFD, 0x48, 0xF7, 0x36, 0x1A, 0xF3, 0x12, + 0x9D, 0x0F, 0xCB, 0x02, 0xF5, 0x23, 0x21, 0x13, 0xE8, 0x46, 0x79, 0x2E, + 0xA4, 0x29, 0xA9, 0x14, 0x94, 0x04, 0xD3, 0xF9, 0x75, 0xFA, 0xA5, 0xF1, + 0x86, 0xE0, 0x57, 0xE3, 0x4C, 0xDF, 0x59, 0xFB, 0xAD, 0x0B, 0xC0, 0x30, + 0xCB, 0x29, 0x97, 0x42, 0x6C, 0x38, 0x15, 0x42, 0x1E, 0x3E, 0x02, 0x40, + 0xDE, 0x28, 0x7D, 0x2F, 0x2B, 0x11, 0xC0, 0x14, 0x8A, 0x07, 0xA8, 0xFB, + 0x27, 0xFF, 0xA6, 0xEC, 0x99, 0xED, 0x2B, 0xE1, 0xC2, 0xE6, 0x73, 0xE4, + 0xB4, 0xE5, 0x35, 0xDF, 0x0F, 0xF5, 0x57, 0xE9, 0xF4, 0x11, 0xD4, 0x13, + 0x53, 0x0A, 0xD9, 0x23, 0x3F, 0xF8, 0x68, 0x25, 0x54, 0xFE, 0x64, 0x27, + 0x07, 0xE1, 0x59, 0xF4, 0x38, 0xD2, 0xB5, 0xD5, 0x6C, 0xFD, 0xCD, 0xF6, + 0xDC, 0xFF, 0xF3, 0xEE, 0xBA, 0xF4, 0x17, 0xDF, 0xE3, 0x1B, 0x08, 0x03, + 0x81, 0x27, 0x0A, 0x08, 0x8D, 0x05, 0xA7, 0xE5, 0xEE, 0x11, 0xD8, 0xF1, + 0xFA, 0x2D, 0xEB, 0x05, 0x87, 0x1C, 0xD1, 0xFA, 0x08, 0x15, 0xF4, 0x0C, + 0xFE, 0x0A, 0x0A, 0x1D, 0xF2, 0xD9, 0xC3, 0xF8, 0x0D, 0xC0, 0x9C, 0xD4, + 0x59, 0xC6, 0x44, 0xCD, 0x1D, 0xCB, 0xC0, 0xCA, 0x73, 0xEA, 0x30, 0xE7, + 0xAB, 0x1D, 0xAD, 0x24, 0xCF, 0x31, 0xA6, 0x45, 0x69, 0x34, 0x55, 0x4E, + 0xF4, 0x2C, 0xB3, 0x44, 0x04, 0x0B, 0x42, 0x25, 0x08, 0xE5, 0xDC, 0x05, + 0xD7, 0xD5, 0x12, 0xEE, 0xEB, 0xD1, 0xA8, 0xE0, 0xAA, 0xD0, 0x30, 0xDC, + 0xC2, 0xCF, 0x66, 0xDB, 0xC3, 0xBC, 0x19, 0xCC, 0x3E, 0xCA, 0x02, 0xD2, + 0xF9, 0xF2, 0x61, 0xED, 0xFF, 0x01, 0x9D, 0xED, 0xA9, 0x0E, 0xEB, 0xEE, + 0x60, 0x14, 0xCA, 0xF6, 0xAE, 0xEE, 0x74, 0xD7, 0x19, 0xE5, 0x3D, 0xD4, + 0x76, 0xFF, 0x2A, 0xEE, 0x71, 0xE4, 0xB3, 0xD2, 0x35, 0xCB, 0x33, 0xC9, + 0x8E, 0xE5, 0x51, 0xF1, 0x45, 0xE3, 0xA7, 0xE9, 0x1C, 0xCC, 0xD1, 0xC6, + 0xC1, 0xEE, 0x16, 0xD8, 0x93, 0x15, 0xD2, 0xE7, 0x4E, 0x16, 0xA4, 0xE3, + 0x97, 0x22, 0x98, 0x03, 0x0B, 0x11, 0x11, 0x15, 0x8E, 0xD9, 0xE5, 0xF7, + 0x9F, 0xC3, 0xA5, 0xE1, 0x25, 0xC2, 0x6A, 0xDC, 0x25, 0xBC, 0x97, 0xD8, + 0xC5, 0xD6, 0x68, 0xEE, 0x24, 0xFB, 0x89, 0x15, 0x1B, 0xFF, 0xC4, 0x2D, + 0xA8, 0x05, 0x59, 0x40, 0xCE, 0x0A, 0x91, 0x3B, 0x0A, 0x03, 0x6A, 0x1B, + 0x4B, 0xF5, 0x37, 0xF9, 0xF2, 0xE2, 0x14, 0xE8, 0x80, 0xD4, 0xFA, 0xE0, + 0xC0, 0xD8, 0xE2, 0xDF, 0x62, 0xE4, 0x77, 0xDB, 0x35, 0xE0, 0xA9, 0xCF, + 0xE8, 0xEC, 0x1D, 0xEF, 0x1F, 0x02, 0x6B, 0x15, 0xE4, 0x04, 0x9A, 0x17, + 0x15, 0x0F, 0x7A, 0x21, 0x80, 0x0C, 0x75, 0x16, 0x14, 0xF0, 0xE5, 0xE2, + 0xF7, 0x0D, 0x67, 0xE0, 0xB0, 0x2F, 0xAC, 0xF1, 0x6B, 0x0C, 0x70, 0xDF, + 0x21, 0x0D, 0xED, 0xF5, 0xB2, 0x31, 0xA8, 0x26, 0x12, 0x1B, 0x56, 0x13, + 0xF7, 0x04, 0xF3, 0xF0, 0x5E, 0x25, 0x96, 0xFB, 0x31, 0x27, 0xA3, 0xF7, + 0xCD, 0x0D, 0xE3, 0xF4, 0xE3, 0x1B, 0xC3, 0x13, 0x22, 0x1A, 0xD5, 0x15, + 0x54, 0xEF, 0x36, 0xFB, 0xFB, 0xDA, 0x99, 0xF2, 0x5E, 0xCF, 0x5C, 0xEB, + 0xD4, 0xCE, 0x39, 0xEB, 0x11, 0x05, 0xC1, 0x10, 0xD7, 0x3B, 0xAF, 0x39, + 0xF4, 0x4F, 0xCF, 0x4C, 0xDC, 0x5A, 0xEF, 0x55, 0xFB, 0x49, 0xF3, 0x40, + 0x1C, 0x1E, 0x68, 0x16, 0x62, 0xFD, 0xB3, 0xF8, 0xDE, 0xF0, 0x10, 0xF1, + 0x73, 0xDE, 0xA0, 0xEF, 0x88, 0xDB, 0xFD, 0xFA, 0xD6, 0xE1, 0xF8, 0xFC, + 0xA0, 0xE2, 0x27, 0xF2, 0xCF, 0x01, 0x31, 0x07, 0x08, 0x23, 0x6F, 0x16, + 0x3D, 0x2C, 0x1E, 0x15, 0x4A, 0x32, 0x21, 0x30, 0xD5, 0x1E, 0x5B, 0x28, + 0xE3, 0x00, 0xFD, 0x01, 0xD9, 0x01, 0x3B, 0x10, 0x2D, 0xF4, 0xFB, 0x09, + 0x9A, 0xDB, 0x13, 0xE7, 0x67, 0xF0, 0x5A, 0x03, 0x88, 0x03, 0x46, 0x22, + 0x02, 0xE8, 0x9E, 0x04, 0x19, 0xEF, 0xC5, 0x01, 0x34, 0x19, 0xF3, 0x18, + 0xD8, 0x1C, 0x18, 0x07, 0x87, 0x25, 0x9A, 0x05, 0xB4, 0x33, 0xCB, 0x18, + 0xFB, 0x0B, 0x89, 0xFD, 0x89, 0xE1, 0xF1, 0xDC, 0x8E, 0xD5, 0x91, 0xD3, + 0x19, 0xC7, 0x8B, 0xB9, 0x85, 0xCF, 0x5D, 0xBE, 0xF6, 0xF6, 0x8A, 0xFD, + 0x29, 0x18, 0x2B, 0x23, 0x8A, 0x37, 0x63, 0x29, 0x96, 0x4E, 0x16, 0x33, + 0x69, 0x39, 0x5D, 0x18, 0x85, 0x16, 0xB3, 0xE8, 0x35, 0x0D, 0x0B, 0xDA, + 0xFF, 0x03, 0xEA, 0xE2, 0xA5, 0xEF, 0x9C, 0xDF, 0xE6, 0xF4, 0x60, 0xE0, + 0x9F, 0xF2, 0x6D, 0xDB, 0x79, 0xE2, 0x36, 0xD9, 0xB8, 0xE6, 0x92, 0xFA, + 0xB6, 0xED, 0x6B, 0x16, 0x7F, 0xF4, 0x4D, 0x23, 0x57, 0xFE, 0xB3, 0x35, + 0xDB, 0xEF, 0xFE, 0x18, 0x2B, 0xE5, 0x8C, 0xF1, 0x0A, 0xF6, 0xFF, 0x02, + 0xE2, 0xDF, 0x87, 0xFC, 0x01, 0xCE, 0x32, 0xED, 0x25, 0xFA, 0xF3, 0x17, + 0xFA, 0x06, 0xD4, 0x26, 0x2C, 0xE4, 0x3C, 0xFA, 0x48, 0xEB, 0x44, 0xF4, + 0xE1, 0xFD, 0xA0, 0xFB, 0x4A, 0xFC, 0x41, 0xE8, 0x11, 0x19, 0xE9, 0x00, + 0xCC, 0x25, 0x0C, 0x20, 0xD5, 0xF3, 0xBB, 0x09, 0x71, 0xD5, 0x7B, 0xE8, + 0xFA, 0xE0, 0xE1, 0xCA, 0xEA, 0xD7, 0xB0, 0xAD, 0xFE, 0xE3, 0x14, 0xC2, + 0x60, 0x17, 0x42, 0x03, 0xF5, 0x32, 0x7D, 0x28, 0x67, 0x44, 0x37, 0x37, + 0xFF, 0x4D, 0xD2, 0x44, 0xF1, 0x31, 0xCD, 0x2C, 0x8D, 0x0A, 0x59, 0x01, + 0xE0, 0xF4, 0x0A, 0xEA, 0x95, 0xEE, 0xA3, 0xDD, 0x15, 0xE1, 0x59, 0xDA, + 0x84, 0xD2, 0xA0, 0xE6, 0x8B, 0xC9, 0x70, 0xE1, 0x31, 0xD6, 0xAF, 0xE1, + 0x48, 0xFC, 0xF1, 0xF9, 0x2F, 0x11, 0xAE, 0xFF, 0x7A, 0x0C, 0x7C, 0x06, + 0x1E, 0x04, 0x43, 0x14, 0xD1, 0xEC, 0xA4, 0xEE, 0xE8, 0xEB, 0x35, 0xD7, + 0xD9, 0x03, 0xC6, 0xF4, 0x79, 0xEF, 0xDC, 0xEE, 0x1C, 0xDF, 0xC8, 0xE6, + 0x31, 0x00, 0x2A, 0x0E, 0xD7, 0x09, 0x0A, 0x14, 0x33, 0xF9, 0x22, 0xF3, + 0xF4, 0x0A, 0xAE, 0x00, 0x70, 0x1B, 0x60, 0x12, 0x1E, 0x1B, 0xCB, 0xFF, + 0x93, 0x35, 0x5E, 0x0D, 0x0D, 0x39, 0xCF, 0x21, 0xB8, 0x05, 0x0C, 0x0C, + 0x54, 0xDF, 0x65, 0xF9, 0x7E, 0xD1, 0x20, 0xF3, 0xE7, 0xC3, 0x16, 0xE6, + 0xA4, 0xDE, 0xDB, 0xFF, 0x47, 0x16, 0xAC, 0x36, 0x1D, 0x2E, 0x66, 0x44, + 0x36, 0x3D, 0x45, 0x44, 0xEF, 0x44, 0x40, 0x44, 0xAC, 0x22, 0xB8, 0x25, + 0x86, 0xF2, 0xB6, 0xFC, 0xA4, 0xE1, 0x67, 0xEC, 0x91, 0xE3, 0xBE, 0xEA, + 0xC7, 0xEA, 0x27, 0xE1, 0xFD, 0xEB, 0x4F, 0xD4, 0x24, 0xDB, 0xF7, 0xC8, + 0xA7, 0xEC, 0x0F, 0xDA, 0xC2, 0x0D, 0xAA, 0xF8, 0xD7, 0x17, 0x4A, 0x04, + 0xDD, 0x29, 0xE7, 0x1C, 0xE9, 0x22, 0x0B, 0x25, 0x2B, 0xF8, 0x13, 0xF8, + 0xC9, 0xF8, 0xE1, 0xF3, 0x78, 0x01, 0x94, 0x00, 0x45, 0xE2, 0x91, 0xE1, + 0xAC, 0xE0, 0x35, 0xEB, 0x5C, 0xFE, 0xD5, 0x14, 0xBE, 0xEB, 0x60, 0x08, + 0x31, 0xD6, 0xFC, 0xF5, 0x36, 0xFD, 0x2A, 0x0A, 0x20, 0x15, 0x06, 0x08, + 0x63, 0x10, 0x4C, 0xFA, 0x31, 0x1B, 0xA5, 0x0F, 0x09, 0x0C, 0xB4, 0x18, + 0xC0, 0xDD, 0x68, 0xF5, 0xE4, 0xC8, 0xC0, 0xD7, 0x39, 0xBF, 0x2A, 0xCC, + 0x78, 0xBE, 0xCA, 0xBF, 0x1B, 0xF1, 0x3C, 0xD4, 0x94, 0x25, 0xB8, 0x05, + 0x00, 0x33, 0x3A, 0x27, 0x80, 0x3A, 0xE0, 0x38, 0x38, 0x37, 0xEB, 0x32, + 0xAA, 0x20, 0xAE, 0x0B, 0xFB, 0x03, 0x47, 0xE3, 0x45, 0xF0, 0x06, 0xD9, + 0x4C, 0xE1, 0xD7, 0xDD, 0x24, 0xDF, 0x07, 0xE5, 0xEF, 0xE9, 0x21, 0xE3, + 0x5D, 0xEF, 0xA2, 0xDE, 0x81, 0x07, 0xAF, 0xFD, 0xB7, 0x19, 0x3B, 0x15, + 0x7C, 0x16, 0xAC, 0x17, 0x30, 0x22, 0xE9, 0x2E, 0x38, 0x16, 0x50, 0x2E, + 0xEC, 0xF4, 0xE0, 0x17, 0x36, 0xFE, 0x70, 0x23, 0xBB, 0x01, 0xC1, 0x1B, + 0x37, 0xF7, 0xA0, 0xFE, 0x4B, 0x17, 0x5C, 0x15, 0x86, 0x1F, 0x90, 0x33, + 0x7F, 0xF1, 0x0C, 0x19, 0xDE, 0xE7, 0xD1, 0xFC, 0xBD, 0x04, 0xF2, 0xFF, + 0x64, 0x0B, 0x14, 0xF9, 0x06, 0x12, 0xAD, 0x00, 0x52, 0x2B, 0xC0, 0x1F, + 0x00, 0x23, 0x0E, 0x10, 0x13, 0xF5, 0xCA, 0xE3, 0x8C, 0xD2, 0x64, 0xD0, + 0x52, 0xBA, 0xC1, 0xC1, 0xC7, 0xC8, 0xB9, 0xCA, 0xEA, 0x0F, 0x1A, 0xFE, + 0xAC, 0x3B, 0xBF, 0x25, 0x09, 0x4A, 0xDF, 0x40, 0x37, 0x59, 0xCE, 0x58, + 0x6C, 0x41, 0x92, 0x44, 0xDF, 0x11, 0x07, 0x0D, 0x37, 0xF8, 0x69, 0xEA, + 0x48, 0xEF, 0x2D, 0xE5, 0xC1, 0xDA, 0x8E, 0xDB, 0xBF, 0xD3, 0xE4, 0xE1, + 0x66, 0xD5, 0x59, 0xE0, 0x1C, 0xE1, 0x29, 0xDB, 0x0F, 0x02, 0xDE, 0x01, + 0xFD, 0x0A, 0x34, 0x1B, 0x1A, 0x05, 0xA8, 0x1C, 0x04, 0x02, 0xB2, 0x2F, + 0xAF, 0xE5, 0xB5, 0x1C, 0x31, 0xD7, 0xB9, 0xF4, 0x8F, 0xEE, 0x92, 0xFA, + 0x0F, 0xEB, 0x53, 0xEA, 0xC4, 0xE0, 0xA6, 0xCE, 0x86, 0x00, 0x98, 0xF0, + 0xB9, 0x0A, 0x1A, 0x09, 0x02, 0xE4, 0xCD, 0xEB, 0xD5, 0xE9, 0xED, 0xE5, + 0xF1, 0x16, 0xFC, 0xF5, 0xE6, 0x18, 0x32, 0xE4, 0xE8, 0x1A, 0x4E, 0xE2, + 0x7D, 0x32, 0x67, 0x01, 0x33, 0x1E, 0xEE, 0xF7, 0xEF, 0xF4, 0xA2, 0xDE, + 0x41, 0xDF, 0x8E, 0xDF, 0xF2, 0xCC, 0x96, 0xD0, 0x85, 0xD9, 0x34, 0xD8, + 0xCB, 0x02, 0x76, 0x0A, 0xC7, 0x1D, 0x71, 0x28, 0x72, 0x36, 0x62, 0x42, + 0xC3, 0x43, 0x11, 0x57, 0x7B, 0x2C, 0x7F, 0x40, 0x31, 0x04, 0xE2, 0x1E, + 0xB1, 0xF6, 0xBC, 0x12, 0x8E, 0xEC, 0xD4, 0xFE, 0x93, 0xD3, 0xF4, 0xF0, + 0xA2, 0xCB, 0x9E, 0xF6, 0x99, 0xC4, 0x78, 0xE5, 0x99, 0xCF, 0x66, 0xE3, + 0xE8, 0xF0, 0x1D, 0xF7, 0x24, 0x04, 0x30, 0xF5, 0xD2, 0x11, 0x09, 0xF5, + 0x0B, 0x0F, 0x39, 0xF7, 0xEA, 0xF2, 0x48, 0xE3, 0x17, 0xF3, 0x5D, 0xE4, + 0x9E, 0xF9, 0xF5, 0xEB, 0x7E, 0xE6, 0x21, 0xD1, 0xF0, 0xF6, 0xF5, 0xD6, + 0xEE, 0x14, 0x4D, 0xFC, 0xF1, 0x04, 0x81, 0xF2, 0x5A, 0xF4, 0x20, 0xE3, + 0x6F, 0x06, 0x51, 0xFE, 0xBD, 0x0C, 0x2F, 0xFC, 0x14, 0x0C, 0x15, 0xE4, + 0x5E, 0x25, 0x3D, 0xF3, 0x5A, 0x1F, 0xCB, 0xF3, 0xFE, 0xE1, 0x90, 0xDD, + 0xED, 0xBB, 0xAC, 0xE7, 0x0D, 0xB8, 0x49, 0xE8, 0xF6, 0xBC, 0x1B, 0xDF, + 0xB0, 0xE6, 0xA6, 0x09, 0x01, 0x12, 0x84, 0x36, 0xCA, 0x24, 0xC9, 0x46, + 0xEE, 0x3B, 0x6C, 0x57, 0xC6, 0x3A, 0xC9, 0x4B, 0x53, 0x12, 0x43, 0x1D, + 0xE6, 0xEC, 0x43, 0xFD, 0xDC, 0xE0, 0x83, 0xF6, 0x81, 0xD0, 0xCE, 0xDE, + 0xE2, 0xC9, 0x32, 0xDA, 0x47, 0xD0, 0x05, 0xE8, 0xA5, 0xDD, 0x6D, 0xE6, + 0x76, 0xF6, 0xD3, 0xF1, 0x12, 0x06, 0xF7, 0xFF, 0x05, 0x10, 0xEA, 0x08, + 0x8B, 0x0E, 0x90, 0x18, 0x0D, 0xF9, 0x07, 0x11, 0xEA, 0xFB, 0x76, 0x03, + 0xFB, 0x24, 0xB2, 0x17, 0x3D, 0x24, 0x8C, 0x0A, 0xEE, 0x0B, 0x4F, 0xF0, + 0xD5, 0x16, 0x37, 0x09, 0x9C, 0x13, 0x1C, 0x10, 0xA7, 0xF6, 0xF0, 0xEF, + 0xEC, 0xFC, 0x26, 0xF5, 0x61, 0x10, 0x20, 0x13, 0x7E, 0x0A, 0x61, 0x0F, + 0xCE, 0x1D, 0x2F, 0x0E, 0x4D, 0x3A, 0xFF, 0x19, 0xC4, 0x21, 0x21, 0x03, + 0xD8, 0xF4, 0x35, 0xDF, 0x01, 0xDE, 0x8C, 0xD3, 0xF2, 0xD3, 0xC0, 0xC9, + 0xA3, 0xE0, 0x53, 0xD7, 0xB4, 0xFB, 0x0D, 0x02, 0xFF, 0x15, 0x14, 0x1D, + 0x0B, 0x31, 0x47, 0x2F, 0x08, 0x38, 0xE4, 0x39, 0x2E, 0x35, 0x55, 0x2F, + 0x43, 0x28, 0x62, 0x18, 0xB2, 0x10, 0xF9, 0x0B, 0xD7, 0xFB, 0x6B, 0xF9, + 0xE6, 0xF6, 0x81, 0xE5, 0x33, 0xF4, 0x98, 0xE7, 0xD0, 0xE9, 0xDA, 0xF3, + 0xD2, 0xF4, 0xDD, 0x08, 0xE7, 0x06, 0xCE, 0x17, 0x64, 0x14, 0xF3, 0x1B, + 0xBC, 0x21, 0xEE, 0x1B, 0xE8, 0x09, 0x5E, 0x0F, 0x6B, 0xDC, 0x31, 0xFD, + 0x1B, 0xE9, 0x5F, 0x06, 0x59, 0x02, 0x6A, 0x0B, 0xB1, 0xF5, 0x2B, 0xF8, + 0xB0, 0xFD, 0xA4, 0x05, 0xF8, 0x03, 0x65, 0x22, 0x6B, 0xE7, 0x6E, 0x13, + 0x9C, 0xEB, 0x47, 0xFE, 0x2F, 0x10, 0x61, 0x06, 0x03, 0x17, 0xB7, 0x04, + 0x25, 0x1B, 0x92, 0xFF, 0x35, 0x2A, 0xBC, 0x08, 0xE5, 0x1C, 0x77, 0x00, + 0x51, 0xFF, 0x2C, 0xE4, 0x7F, 0xE2, 0xD8, 0xCA, 0x10, 0xBE, 0x4B, 0xBD, + 0xD6, 0xC2, 0xF9, 0xD0, 0xBA, 0xED, 0x74, 0xF8, 0x1B, 0x07, 0x90, 0x19, + 0x47, 0x2B, 0x5C, 0x42, 0x78, 0x52, 0x7E, 0x58, 0xC5, 0x53, 0xAE, 0x47, + 0x89, 0x47, 0xB9, 0x21, 0x90, 0x3F, 0xDE, 0x0A, 0xC5, 0x1C, 0xD9, 0x05, + 0x71, 0xF2, 0xE6, 0xF1, 0x0D, 0xE5, 0xEA, 0xDC, 0x68, 0xE3, 0xDB, 0xDC, + 0x66, 0xEE, 0x46, 0xE3, 0xFF, 0xFC, 0x36, 0xE8, 0x22, 0x05, 0xBC, 0x04, + 0xDD, 0x0D, 0x7D, 0x22, 0x44, 0x0D, 0xCD, 0x1D, 0x93, 0xFD, 0xB4, 0x0E, + 0x55, 0x06, 0x16, 0x22, 0xDA, 0x0C, 0xDD, 0x2C, 0x29, 0xF8, 0xFE, 0x0C, + 0x41, 0x13, 0x2C, 0x0E, 0x99, 0x3E, 0xC9, 0x23, 0x7F, 0x18, 0x84, 0x07, + 0xAF, 0xE3, 0x06, 0xF7, 0x93, 0xE4, 0xA7, 0x14, 0x93, 0xDD, 0xDB, 0x10, + 0x83, 0xE7, 0xD3, 0x08, 0x3E, 0x16, 0xA5, 0x21, 0x7A, 0x1C, 0x8C, 0x1D, + 0x60, 0x09, 0x9C, 0x03, 0x61, 0x06, 0x1B, 0xF3, 0x58, 0xEC, 0x99, 0xDE, + 0xC5, 0xD8, 0x12, 0xE4, 0xA4, 0xF8, 0x4D, 0x0D, 0x6A, 0x13, 0x41, 0x1E, + 0x2A, 0x2B, 0x38, 0x29, 0x7E, 0x4D, 0xAF, 0x42, 0xE5, 0x40, 0x05, 0x3D, + 0x99, 0x14, 0x01, 0x21, 0xCE, 0xFF, 0x0A, 0x0B, 0x66, 0xF9, 0x9B, 0xF8, + 0x11, 0xEA, 0x85, 0xE5, 0x1B, 0xE6, 0x7F, 0xE1, 0x39, 0xE8, 0xD6, 0xDC, + 0x67, 0xF3, 0xCE, 0xD4, 0x03, 0x08, 0x2E, 0xD4, 0x8C, 0x13, 0x69, 0xDC, + 0x23, 0x17, 0xE5, 0xEF, 0x2D, 0x0C, 0x50, 0xF7, 0xC9, 0xEE, 0x59, 0xE8, + 0xFA, 0xED, 0x77, 0xEA, 0x6C, 0x05, 0xAE, 0xFE, 0xD0, 0xED, 0x48, 0xEC, + 0xD1, 0xCD, 0xC4, 0xDC, 0x36, 0xDD, 0x71, 0xFA, 0xB3, 0xE3, 0xF8, 0xFD, + 0x91, 0xD6, 0x84, 0xE3, 0x24, 0xEC, 0x70, 0xF7, 0x06, 0xFD, 0x73, 0x0A, + 0xE4, 0xF9, 0xC5, 0xEE, 0xCC, 0x16, 0x4D, 0xEF, 0x62, 0x26, 0xA1, 0x08, + 0x4C, 0x08, 0x3C, 0x00, 0x86, 0xF1, 0xBA, 0xE1, 0x21, 0xE3, 0x36, 0xC8, + 0xDE, 0xC8, 0xE5, 0xB3, 0x04, 0xCF, 0x7E, 0xC0, 0x23, 0xE9, 0x51, 0xEF, + 0xBA, 0xF4, 0xF8, 0x1C, 0xF5, 0x0B, 0x5B, 0x41, 0x53, 0x26, 0x5F, 0x4D, + 0x51, 0x2B, 0x89, 0x37, 0x4C, 0x15, 0x11, 0x0B, 0x05, 0xFD, 0xA0, 0xF0, + 0x6A, 0xEB, 0x1D, 0xDC, 0x31, 0xE1, 0xA6, 0xC6, 0x7C, 0xD5, 0x7B, 0xC5, + 0x1D, 0xCA, 0xE6, 0xCE, 0x6F, 0xCD, 0x1D, 0xDB, 0xA9, 0xD0, 0x2C, 0xDF, + 0x42, 0xDE, 0x67, 0xE6, 0x2E, 0xF2, 0x20, 0xF2, 0x55, 0xEB, 0xFA, 0xEC, + 0x11, 0xE5, 0x26, 0xE6, 0x2D, 0x02, 0xEB, 0xFD, 0xAE, 0x08, 0x76, 0x06, + 0x0F, 0xF5, 0x0C, 0xFA, 0x43, 0x0A, 0xFE, 0x12, 0x8F, 0x1D, 0x01, 0x22, + 0x02, 0xFA, 0x13, 0xFF, 0x7E, 0xE1, 0xA2, 0xF0, 0x52, 0xE8, 0x69, 0xFF, + 0x50, 0xDC, 0xA2, 0xF6, 0xE4, 0xDA, 0x17, 0xF5, 0x7B, 0xF4, 0x5D, 0x04, + 0x89, 0xF6, 0x96, 0xFC, 0xEC, 0xE4, 0xF6, 0xE4, 0x1D, 0xD7, 0xBB, 0xD1, + 0xE4, 0xBF, 0xE3, 0xC8, 0xC7, 0xC5, 0xEF, 0xD7, 0x27, 0xFC, 0xB8, 0xF3, + 0x0D, 0x27, 0x97, 0x0C, 0xB1, 0x3B, 0x74, 0x2C, 0x61, 0x4D, 0x16, 0x41, + 0xDB, 0x40, 0xA9, 0x34, 0x8B, 0x11, 0x17, 0x0B, 0x72, 0xF7, 0xAA, 0xEC, + 0x46, 0xDB, 0xD9, 0xD6, 0x42, 0xB9, 0x4E, 0xCA, 0x29, 0xC1, 0x28, 0xD6, + 0x37, 0xE7, 0x2A, 0xDE, 0x61, 0x11, 0x40, 0xE7, 0x86, 0x1E, 0x7F, 0xF3, + 0x97, 0x14, 0x11, 0xFB, 0xB0, 0x14, 0x77, 0x02, 0xBD, 0x09, 0x37, 0x02, + 0x4B, 0xF6, 0x77, 0xFE, 0x8C, 0x0B, 0x9F, 0x17, 0xBA, 0x14, 0x2B, 0x1C, + 0x94, 0x05, 0x6B, 0xFF, 0x28, 0x13, 0xE8, 0x0C, 0xC1, 0x19, 0xF3, 0x2A, + 0x24, 0xFD, 0xC3, 0x1E, 0x09, 0xED, 0xE1, 0x15, 0xA0, 0xFC, 0xB6, 0x24, + 0xDE, 0x07, 0xCF, 0x0E, 0xA1, 0x13, 0x41, 0xFD, 0xC5, 0x29, 0x78, 0x18, + 0x91, 0x2A, 0xB3, 0x1B, 0xAB, 0x14, 0x50, 0x03, 0xB9, 0x03, 0xC9, 0xF7, + 0x96, 0xEB, 0xDF, 0xE5, 0x44, 0xD6, 0x65, 0xDF, 0x65, 0xDB, 0x0D, 0xF5, + 0x84, 0xF1, 0x9D, 0x06, 0xC2, 0x1A, 0x7E, 0x20, 0xBA, 0x46, 0xE4, 0x3D, + 0xEC, 0x52, 0x51, 0x3D, 0xDE, 0x2C, 0x27, 0x22, 0x82, 0x05, 0x51, 0x14, + 0x1D, 0xF7, 0x0A, 0x07, 0x14, 0xF3, 0x84, 0xEC, 0xC5, 0xF2, 0x12, 0xE3, + 0x63, 0xF9, 0x5C, 0xE4, 0x94, 0x09, 0xB6, 0xE5, 0x3F, 0x09, 0xA6, 0xE9, + 0x45, 0xFB, 0xDD, 0xED, 0xE8, 0xF9, 0x1C, 0xE7, 0xFC, 0xF8, 0xF8, 0xDB, + 0x67, 0xE7, 0xBA, 0xD7, 0x7F, 0xF8, 0xCC, 0xF5, 0x14, 0x04, 0xAB, 0x0C, + 0x91, 0xE1, 0x21, 0xFD, 0x23, 0xEA, 0xE8, 0x0A, 0xB9, 0x0F, 0x51, 0x21, + 0x71, 0x08, 0x3C, 0x0C, 0xA4, 0x07, 0x4E, 0x07, 0x75, 0x1A, 0x67, 0x1F, + 0x92, 0x01, 0x64, 0x10, 0xA6, 0xEF, 0xB1, 0xFD, 0xC7, 0xF9, 0x64, 0x04, + 0x5D, 0xE5, 0x5A, 0xF4, 0xBB, 0xCD, 0xB3, 0xD8, 0xB9, 0xD6, 0x7A, 0xD1, + 0xF1, 0xD7, 0xAD, 0xCE, 0x49, 0xDE, 0x54, 0xD3, 0x57, 0x0B, 0xEF, 0xF0, + 0x1E, 0x26, 0xB9, 0x0A, 0x8C, 0x2A, 0x15, 0x1E, 0x91, 0x44, 0x4C, 0x40, + 0xAA, 0x54, 0x23, 0x53, 0x0E, 0x3F, 0x5C, 0x38, 0x45, 0x28, 0xCC, 0x0F, + 0x4A, 0x07, 0xC1, 0xED, 0xF1, 0xE0, 0xD3, 0xD8, 0xFC, 0xCB, 0x18, 0xDB, + 0xB1, 0xC7, 0x8E, 0xF2, 0x1C, 0xE5, 0x74, 0x18, 0xC3, 0xFC, 0xA0, 0x21, + 0xEA, 0xFF, 0x4E, 0x1A, 0x64, 0x11, 0xE2, 0x23, 0xE0, 0x09, 0x51, 0x10, + 0x08, 0xE5, 0xC0, 0xEF, 0x96, 0xF4, 0xD6, 0x0B, 0x86, 0x0B, 0x00, 0x20, + 0xA6, 0xFC, 0x40, 0x01, 0x36, 0x10, 0x9E, 0x0F, 0xCB, 0x20, 0x84, 0x28, + 0x52, 0xF2, 0xF8, 0xFD, 0x4F, 0xD9, 0x9C, 0xE8, 0xCD, 0xF8, 0x19, 0x04, + 0x3E, 0xFC, 0xA3, 0xF1, 0x61, 0xF3, 0x26, 0xE3, 0xB9, 0x06, 0xEB, 0x00, + 0x5C, 0x10, 0xB1, 0xF2, 0x61, 0x0D, 0xD5, 0xD1, 0x24, 0x05, 0xAF, 0xCD, + 0x7B, 0xF0, 0xCB, 0xC3, 0x5D, 0xE5, 0xE0, 0xC2, 0xAB, 0xF8, 0xE7, 0xDC, + 0x56, 0x10, 0xD1, 0xF1, 0x6F, 0x20, 0xC4, 0x0D, 0x35, 0x2C, 0xFE, 0x2D, + 0xB0, 0x2C, 0x3A, 0x32, 0xE4, 0x16, 0x6A, 0x2A, 0xEF, 0xF8, 0xD8, 0x22, + 0x31, 0xDF, 0x40, 0x0C, 0x7E, 0xD4, 0xCE, 0xFD, 0x65, 0xCD, 0xA0, 0xF7, + 0x03, 0xCA, 0x4C, 0xEF, 0xBA, 0xEA, 0x7C, 0x00, 0x22, 0x07, 0xC2, 0x10, + 0xCC, 0x05, 0xAA, 0x10, 0xC2, 0x03, 0x31, 0x0E, 0x32, 0xF7, 0x44, 0xFB, + 0x75, 0xD5, 0x62, 0xE2, 0x7A, 0xD4, 0x1F, 0xEE, 0x5D, 0xDF, 0xE1, 0xFA, + 0x12, 0xD4, 0x28, 0xEA, 0xA8, 0xF6, 0xE9, 0xF6, 0xBF, 0x23, 0x55, 0x13, + 0xDC, 0x0E, 0xAC, 0x06, 0x02, 0x03, 0xE4, 0x00, 0x74, 0x14, 0xB7, 0x10, + 0xFF, 0x12, 0xFD, 0x0B, 0xCB, 0x1F, 0xDE, 0x03, 0xAD, 0x2F, 0x6C, 0x05, + 0x01, 0x25, 0xF0, 0xFC, 0x58, 0x12, 0xDE, 0xDD, 0x14, 0xF5, 0x4D, 0xC5, + 0x2C, 0xD3, 0xDE, 0xC9, 0x25, 0xD5, 0x34, 0xDC, 0xCA, 0xF3, 0x15, 0xEC, + 0x44, 0x11, 0xAB, 0x05, 0xD0, 0x37, 0x39, 0x31, 0xC6, 0x4A, 0x90, 0x4E, + 0x0C, 0x35, 0x35, 0x48, 0xC0, 0x1A, 0x14, 0x2A, 0x9D, 0x12, 0x02, 0x0F, + 0x45, 0xFB, 0x18, 0xF4, 0x3C, 0xE2, 0x69, 0xE3, 0x8B, 0xDD, 0x53, 0xE2, + 0x61, 0xD2, 0xE1, 0xDC, 0x92, 0xE0, 0x56, 0xE7, 0x83, 0xF7, 0xA4, 0xF2, + 0x3A, 0xF9, 0xB3, 0xFD, 0x31, 0xF8, 0xAE, 0x07, 0xEE, 0xF8, 0x5C, 0xF2, + 0x85, 0xFD, 0xE3, 0xE3, 0x9E, 0x13, 0xF0, 0xFE, 0x0D, 0x1F, 0x76, 0x08, + 0xF5, 0x15, 0x4A, 0x01, 0x52, 0x21, 0xCF, 0x1B, 0x2B, 0x25, 0xDC, 0x26, + 0xE6, 0x07, 0xA7, 0x12, 0x41, 0xF8, 0x2C, 0x15, 0x4B, 0x05, 0xB4, 0x1D, + 0x67, 0xFF, 0xEF, 0x05, 0x76, 0xFB, 0x63, 0x03, 0x04, 0x00, 0xE1, 0x15, + 0x79, 0xE8, 0x04, 0x0E, 0x28, 0xD7, 0xCF, 0x01, 0x18, 0xD9, 0xF7, 0xED, + 0x7C, 0xD1, 0xD7, 0xCD, 0xFA, 0xD6, 0xC1, 0xD2, 0xDF, 0xFC, 0x75, 0xEF, + 0x3A, 0x1B, 0x3B, 0xFC, 0x90, 0x2D, 0xE9, 0x14, 0xE1, 0x47, 0xFB, 0x33, + 0x1D, 0x54, 0x29, 0x38, 0x82, 0x28, 0x9C, 0x1B, 0xDF, 0xFB, 0x48, 0xFF, + 0x8A, 0xE6, 0x51, 0xE8, 0x74, 0xCA, 0x9D, 0xDB, 0xFA, 0xBE, 0xEB, 0xD9, + 0x01, 0xCD, 0x15, 0xD1, 0x91, 0xEF, 0x43, 0xE6, 0x62, 0x07, 0xAD, 0xFE, + 0xF0, 0x11, 0x57, 0x00, 0xF7, 0x1A, 0x00, 0x05, 0xE6, 0x14, 0x17, 0xF9, + 0x5B, 0x06, 0x16, 0xDA, 0x3A, 0x0E, 0x1C, 0xE6, 0xF4, 0x0E, 0x0D, 0xFF, + 0x1A, 0xF3, 0x2C, 0xF5, 0x2F, 0xF0, 0xDB, 0x01, 0x07, 0x02, 0x99, 0x22, + 0x40, 0xF7, 0x18, 0x17, 0x72, 0xEF, 0x68, 0x08, 0x52, 0x03, 0xC6, 0x22, + 0x98, 0x00, 0x40, 0x20, 0x39, 0xF6, 0x11, 0x06, 0xE5, 0xFC, 0xE5, 0x06, + 0xBD, 0xFF, 0x38, 0x07, 0x35, 0x02, 0x1C, 0xF1, 0xD1, 0xF0, 0x2D, 0xD6, + 0x41, 0xCC, 0x7A, 0xC9, 0x89, 0xC0, 0x28, 0xCE, 0x68, 0xD4, 0x16, 0xE1, + 0x18, 0xED, 0xAD, 0xF6, 0xFB, 0x07, 0xCE, 0x0E, 0xEE, 0x28, 0xE5, 0x2F, + 0x74, 0x3E, 0xA7, 0x3E, 0x5F, 0x39, 0xAF, 0x2B, 0x05, 0x1C, 0x6F, 0x13, + 0x90, 0xF8, 0x72, 0xF6, 0x1B, 0xED, 0xB1, 0xE4, 0xA6, 0xDF, 0x06, 0xE6, + 0x02, 0xD0, 0xAD, 0xEA, 0x20, 0xF3, 0x34, 0xFE, 0x87, 0x0B, 0xB9, 0x05, + 0x94, 0xF8, 0xD1, 0xFF, 0x0B, 0xED, 0xCC, 0x00, 0xE3, 0xE5, 0x3E, 0xFD, + 0xAD, 0xD8, 0xE1, 0xF0, 0x22, 0xF3, 0x91, 0x01, 0x57, 0x14, 0xAC, 0x16, + 0x10, 0x0B, 0x44, 0x02, 0x21, 0x21, 0x77, 0xFE, 0x81, 0x3C, 0x92, 0x0C, + 0x79, 0x16, 0x3D, 0xFF, 0xA5, 0xF0, 0x21, 0xF2, 0xE3, 0xF0, 0x3C, 0xF7, + 0x50, 0xF7, 0x1E, 0xFF, 0xB7, 0xFE, 0x8F, 0xFD, 0x47, 0x04, 0x9C, 0xFA, + 0xF6, 0xF3, 0xD1, 0xFA, 0x88, 0xE0, 0x78, 0xEC, 0xE8, 0xDC, 0xDE, 0xD1, + 0xED, 0xCE, 0x33, 0xBD, 0x27, 0xD0, 0x7C, 0xC8, 0xBF, 0xED, 0x41, 0xE4, + 0xD2, 0x0A, 0xA8, 0x01, 0x20, 0x2A, 0xAC, 0x23, 0x7F, 0x4B, 0x0A, 0x3C, + 0xC7, 0x57, 0xF7, 0x45, 0xD3, 0x35, 0x84, 0x2C, 0xEF, 0x14, 0xD1, 0x0D, + 0x30, 0xFA, 0xBA, 0xF8, 0x05, 0xDC, 0x24, 0xE4, 0xC8, 0xCF, 0xF7, 0xD9, + 0xA9, 0xD8, 0x30, 0xED, 0x42, 0xF6, 0xAE, 0x17, 0xE1, 0x0B, 0xB0, 0x22, + 0x17, 0x0A, 0x1B, 0x19, 0x98, 0xFA, 0x38, 0x11, 0x05, 0xED, 0x6E, 0xF3, + 0xAA, 0xE7, 0xDA, 0xD7, 0x93, 0xFA, 0x8B, 0xF1, 0x02, 0x06, 0x47, 0x02, + 0x2E, 0xF6, 0xBF, 0xEE, 0xE3, 0xF6, 0x63, 0xF9, 0xEB, 0x08, 0xA0, 0x07, + 0x9F, 0xFF, 0x3F, 0xEB, 0x5B, 0xF9, 0xEF, 0xE6, 0x43, 0x0B, 0x00, 0x05, + 0xDF, 0x06, 0xC6, 0x05, 0x26, 0x00, 0x01, 0x04, 0xF2, 0x13, 0xF9, 0x0D, + 0x78, 0x1B, 0x63, 0x00, 0x7D, 0x0C, 0xDC, 0xF3, 0xB6, 0xF2, 0xCC, 0xF1, + 0xBB, 0xD8, 0x28, 0xEE, 0x07, 0xD9, 0xE7, 0xFD, 0x13, 0xE1, 0x89, 0x0A, + 0xB4, 0xE6, 0x29, 0x0A, 0x4F, 0xF9, 0x45, 0x19, 0xEB, 0x18, 0x9C, 0x37, + 0x4A, 0x28, 0x64, 0x3E, 0x84, 0x19, 0x7A, 0x22, 0x23, 0x0A, 0x14, 0x0D, + 0xE1, 0xFA, 0x67, 0xFE, 0x7D, 0xEA, 0x99, 0xED, 0x78, 0xE4, 0xF2, 0xDE, + 0xCB, 0xF7, 0x81, 0xDD, 0x40, 0x0E, 0x9D, 0xE5, 0xAF, 0x04, 0x49, 0xE7, + 0x44, 0xF5, 0xA8, 0xE8, 0x59, 0xF3, 0xB3, 0xE5, 0x6D, 0xE2, 0x5E, 0xD2, + 0x7E, 0xD9, 0xB2, 0xCA, 0xE6, 0xF7, 0x0E, 0xE5, 0x3B, 0x06, 0x84, 0xED, + 0x8E, 0x09, 0x5B, 0xE5, 0x20, 0x2D, 0xEF, 0xFF, 0xA8, 0x33, 0x7E, 0x10, + 0xDC, 0x19, 0xBB, 0xFE, 0xCF, 0x22, 0x06, 0x04, 0x52, 0x27, 0x84, 0x16, + 0xA6, 0x0D, 0x57, 0x16, 0xC3, 0x05, 0xBB, 0x1B, 0x97, 0x04, 0x30, 0x2F, + 0x53, 0xED, 0xC1, 0x28, 0xAD, 0xE1, 0x35, 0x07, 0x9E, 0xDF, 0x1F, 0xEB, + 0xE2, 0xD8, 0x72, 0xE8, 0xA1, 0xE1, 0x59, 0x01, 0xFB, 0xF2, 0x27, 0x19, + 0xE3, 0x0C, 0xAC, 0x2D, 0xD3, 0x2D, 0x87, 0x43, 0xC2, 0x40, 0x46, 0x50, + 0x1B, 0x38, 0xD3, 0x41, 0x4F, 0x29, 0x4A, 0x25, 0xAE, 0x17, 0xBD, 0x0F, + 0x6C, 0xF5, 0x01, 0xF6, 0xB0, 0xE2, 0xC0, 0xE1, 0x2D, 0xDB, 0xC3, 0xD3, + 0xA7, 0xEA, 0xB4, 0xE6, 0xA2, 0x0D, 0x5D, 0x05, 0xC4, 0x18, 0x14, 0x07, + 0x16, 0x0C, 0x7C, 0x05, 0xAE, 0xFF, 0x03, 0x02, 0x30, 0xF4, 0x80, 0xE9, + 0x2F, 0xF2, 0xFD, 0xE0, 0x11, 0x07, 0x85, 0xF7, 0xF6, 0x17, 0xE1, 0x01, + 0xDC, 0x23, 0xEC, 0x0E, 0x6B, 0x35, 0x03, 0x2D, 0x50, 0x2B, 0x46, 0x25, + 0xE4, 0xFB, 0x4B, 0xFD, 0xDC, 0xE8, 0x30, 0xF6, 0x75, 0xF2, 0xCE, 0xF3, + 0xA3, 0xF1, 0x78, 0xE7, 0x68, 0xFE, 0x70, 0xFC, 0xE9, 0x0A, 0x96, 0x13, + 0x20, 0xFE, 0xC9, 0x0B, 0xC2, 0xF5, 0x8F, 0xFD, 0xC4, 0xF2, 0xE4, 0xE3, + 0x49, 0xE1, 0xB2, 0xC9, 0xF8, 0xE2, 0x38, 0xDA, 0x54, 0xF1, 0xC4, 0xF0, + 0x8E, 0xFF, 0x74, 0x00, 0x38, 0x1C, 0x61, 0x24, 0x90, 0x2D, 0xAF, 0x3B, + 0x5E, 0x17, 0x84, 0x20, 0x13, 0x02, 0x68, 0x02, 0x4A, 0xFC, 0xE9, 0xF6, + 0x6A, 0xE9, 0x43, 0xE9, 0x27, 0xDD, 0x33, 0xE4, 0x20, 0xE8, 0x5C, 0xE8, + 0x28, 0x09, 0x2C, 0xFD, 0x9D, 0x20, 0x9C, 0x0A, 0x2A, 0x25, 0x1E, 0x0C, + 0x5F, 0x20, 0xE4, 0x0F, 0xD1, 0x06, 0x22, 0xFF, 0xB4, 0xE1, 0x43, 0xDC, + 0x20, 0xE5, 0xBF, 0xE3, 0x11, 0xF2, 0x9B, 0xFD, 0x30, 0xE3, 0x29, 0xFE, + 0xE8, 0xF9, 0xD9, 0x13, 0x52, 0x22, 0x8A, 0x31, 0xC1, 0x16, 0x74, 0x21, + 0x95, 0x08, 0xD2, 0x16, 0xE8, 0x0F, 0xF0, 0x23, 0x96, 0x04, 0xDD, 0x12, + 0x20, 0x00, 0x54, 0xFF, 0x1C, 0x12, 0x04, 0x04, 0xB9, 0x0C, 0x23, 0x04, + 0x89, 0xF0, 0x74, 0xF2, 0x22, 0xE1, 0xCE, 0xE1, 0x2C, 0xCC, 0x93, 0xCE, + 0x0B, 0xC9, 0x9B, 0xD0, 0x9A, 0xE3, 0x67, 0xF3, 0xA5, 0xF9, 0x64, 0x0A, + 0x9B, 0x13, 0x7A, 0x16, 0x15, 0x3B, 0x03, 0x2F, 0x15, 0x49, 0x66, 0x39, + 0x65, 0x26, 0x46, 0x15, 0xC8, 0x0C, 0x42, 0xF4, 0x42, 0x03, 0x5A, 0xE7, + 0x6D, 0xF2, 0x56, 0xD6, 0x27, 0xE8, 0xCB, 0xCF, 0x16, 0xF3, 0x5E, 0xE5, + 0x83, 0x02, 0x91, 0xFC, 0x35, 0x01, 0x23, 0xFF, 0x6E, 0xF8, 0x43, 0xFE, + 0xC1, 0xE7, 0x70, 0xFF, 0xFF, 0xCE, 0xC5, 0xF8, 0x55, 0xC2, 0xAB, 0xF1, + 0x36, 0xDB, 0xD2, 0xFF, 0xE7, 0xF6, 0x24, 0x04, 0xE0, 0xFC, 0x34, 0xFC, + 0xC3, 0x19, 0x9B, 0x0E, 0xCF, 0x2F, 0xD1, 0x1D, 0x1C, 0x16, 0x37, 0x0C, + 0x73, 0x02, 0x5D, 0x0C, 0x5B, 0xFB, 0xC4, 0x17, 0x16, 0xEB, 0xAE, 0x0B, + 0x78, 0xE4, 0xCF, 0x04, 0x60, 0xF9, 0x74, 0x08, 0xB6, 0x00, 0xF3, 0xF8, + 0x12, 0xF2, 0xA2, 0xE9, 0x3A, 0xE5, 0x6E, 0xE5, 0x48, 0xCE, 0x56, 0xD3, + 0x06, 0xD2, 0xA0, 0xDC, 0xDD, 0xEF, 0x1D, 0xFB, 0xF4, 0x08, 0x97, 0x11, + 0x53, 0x23, 0x98, 0x2D, 0xAE, 0x4B, 0x35, 0x51, 0xD9, 0x52, 0x6E, 0x44, + 0xC8, 0x2E, 0x8F, 0x0E, 0xC1, 0x1B, 0x55, 0xFA, 0x44, 0x0A, 0xCE, 0xE7, + 0x6D, 0xF0, 0x94, 0xD0, 0xBF, 0xE5, 0xFF, 0xD0, 0x18, 0xF1, 0x5B, 0xF1, + 0xE5, 0x00, 0x5C, 0x0F, 0xEA, 0x08, 0x8B, 0x0F, 0x99, 0x06, 0x9C, 0x05, + 0x56, 0x01, 0x81, 0xFE, 0x47, 0xEE, 0x09, 0xDF, 0x5D, 0xDE, 0x24, 0xC6, + 0x67, 0xE0, 0xB2, 0xD9, 0x2A, 0xE0, 0x3A, 0xE8, 0x91, 0xE7, 0x17, 0xF2, + 0xE9, 0x01, 0x23, 0x0B, 0x3F, 0x19, 0xF6, 0x17, 0x46, 0x13, 0xA4, 0x07, + 0xF0, 0x04, 0x94, 0x03, 0xC9, 0xFA, 0x1F, 0x0F, 0x72, 0xF7, 0x68, 0x09, + 0x40, 0xFB, 0xDE, 0xFE, 0x09, 0x03, 0xBE, 0xFD, 0x56, 0x08, 0x1C, 0xFE, + 0x61, 0x05, 0x46, 0xF6, 0x1B, 0xEE, 0xD1, 0xD7, 0xA4, 0xD5, 0x3F, 0xC5, + 0x50, 0xEA, 0xF6, 0xE6, 0x36, 0xFE, 0x8F, 0x04, 0x06, 0x08, 0xE7, 0x14, + 0xB1, 0x26, 0xA9, 0x39, 0x7F, 0x36, 0x2D, 0x4C, 0xBF, 0x19, 0x52, 0x2A, + 0x42, 0xFD, 0xAB, 0x06, 0x1E, 0xF7, 0xD2, 0xF4, 0x10, 0xE2, 0x5D, 0xDA, + 0xA2, 0xC9, 0xF0, 0xC5, 0x07, 0xCD, 0xF0, 0xC8, 0x2A, 0xF7, 0x19, 0xE3, + 0x0C, 0x1B, 0xC3, 0xF6, 0x64, 0x20, 0x3C, 0xF8, 0x6E, 0x23, 0x0F, 0xFA, + 0x7B, 0x0A, 0xEC, 0xF2, 0xF5, 0xD8, 0x0C, 0xDB, 0xDA, 0xD0, 0xD4, 0xE2, + 0x0C, 0xD5, 0xF5, 0xF5, 0x75, 0xC1, 0x8A, 0xF3, 0x62, 0xD1, 0xF4, 0x04, + 0xA0, 0x0F, 0x3B, 0x21, 0x9F, 0x1E, 0x83, 0x13, 0x91, 0x06, 0x40, 0xF8, + 0x87, 0x09, 0xC2, 0x01, 0x79, 0x00, 0xAE, 0x02, 0x81, 0xF5, 0xD3, 0xFA, + 0x89, 0x06, 0xE3, 0x0B, 0xDB, 0x16, 0xFD, 0x0F, 0x72, 0x0F, 0xB2, 0xFC, + 0x6E, 0xFD, 0x0F, 0xEA, 0xE7, 0xE9, 0x14, 0xD1, 0xCD, 0xDE, 0x65, 0xCA, + 0x91, 0xE0, 0x1E, 0xEB, 0xD9, 0xEA, 0x80, 0x19, 0xEE, 0x07, 0xE6, 0x36, + 0x5B, 0x30, 0x78, 0x44, 0x2C, 0x3F, 0x55, 0x40, 0xC6, 0x1E, 0x09, 0x18, + 0xE4, 0xF9, 0x5E, 0xF3, 0x4E, 0xE4, 0x4D, 0xDD, 0xC6, 0xE5, 0x49, 0xD3, + 0x81, 0xEF, 0xB1, 0xD7, 0x3C, 0xF5, 0x41, 0xEE, 0x0F, 0xFE, 0xA8, 0x09, + 0x24, 0x00, 0x98, 0x0C, 0xB8, 0xFA, 0x13, 0x00, 0xD5, 0xFB, 0x43, 0xFA, + 0x8E, 0xED, 0x42, 0xEF, 0x6D, 0xD7, 0x57, 0xE8, 0x57, 0xE1, 0x7C, 0xFD, + 0x81, 0xE8, 0x95, 0x01, 0xA2, 0xE6, 0x40, 0xF3, 0x33, 0x02, 0xBB, 0x06, + 0x78, 0x1F, 0x44, 0x20, 0xA6, 0x14, 0x45, 0x10, 0x02, 0x12, 0x67, 0x02, + 0xF5, 0x16, 0x4E, 0x07, 0x6F, 0xFC, 0x12, 0x04, 0x94, 0xF3, 0x9A, 0x0B, + 0xE6, 0x0C, 0x27, 0x22, 0xC6, 0x14, 0x0C, 0x25, 0xE0, 0x04, 0x5E, 0x07, + 0x50, 0xEE, 0x8D, 0xE1, 0xED, 0xD7, 0x43, 0xC6, 0xA2, 0xDD, 0x54, 0xC2, + 0xDB, 0xFE, 0x6C, 0xD7, 0x2F, 0x22, 0xE1, 0x02, 0xA3, 0x3B, 0x8D, 0x38, + 0x38, 0x50, 0xD3, 0x58, 0x54, 0x39, 0x21, 0x43, 0x85, 0x13, 0xD6, 0x1C, + 0x85, 0x00, 0x95, 0x04, 0x93, 0xE0, 0x49, 0xEA, 0xB3, 0xD0, 0x94, 0xD7, + 0x1E, 0xDC, 0x7E, 0xCF, 0x85, 0xFB, 0x21, 0xE7, 0xD1, 0x0E, 0xFD, 0xFB, + 0x34, 0x10, 0xEA, 0xF4, 0xD6, 0x10, 0xA5, 0xF6, 0x39, 0x05, 0x2E, 0xFA, + 0x8C, 0xF6, 0xBB, 0xE3, 0x23, 0x08, 0x66, 0xE0, 0xEF, 0x1A, 0xF5, 0xF6, + 0x65, 0x0B, 0xB9, 0xF1, 0xAC, 0x0F, 0xF1, 0x00, 0x70, 0x26, 0xBA, 0x2A, + 0x49, 0x1E, 0xDC, 0x2B, 0xE2, 0x09, 0xF9, 0x1B, 0x4A, 0x0B, 0x41, 0x2B, + 0xC0, 0x0A, 0xD8, 0x28, 0x51, 0x03, 0xD9, 0x0D, 0xFE, 0x09, 0x0C, 0x0D, + 0x1C, 0x08, 0xFD, 0x10, 0x57, 0xF8, 0x8A, 0x0D, 0xF0, 0xF2, 0x18, 0x0D, + 0x9F, 0xED, 0xB2, 0xF8, 0x57, 0xEC, 0xB7, 0xE2, 0xDE, 0xF1, 0x2E, 0xF3, + 0x91, 0xF4, 0x91, 0x05, 0xDD, 0x06, 0x95, 0x13, 0xD5, 0x30, 0x58, 0x3C, + 0x96, 0x4F, 0x3B, 0x54, 0xF4, 0x3E, 0x2A, 0x3A, 0x6F, 0x24, 0x0A, 0x23, + 0x59, 0x0A, 0x9B, 0x08, 0xE1, 0xEE, 0x7A, 0xE0, 0x76, 0xDA, 0x1F, 0xDC, + 0x91, 0xE2, 0x6C, 0x00, 0x36, 0x09, 0x9F, 0x26, 0x44, 0x1A, 0xD7, 0x31, + 0xE1, 0x1C, 0x1A, 0x2F, 0xC0, 0x18, 0xFD, 0x19, 0xD9, 0xFA, 0xE7, 0xFA, + 0x52, 0xD8, 0x6A, 0xF5, 0x6B, 0xE2, 0xC3, 0x06, 0x27, 0xF0, 0x70, 0x02, + 0x92, 0xE6, 0x1A, 0xED, 0xA0, 0x00, 0xD1, 0xFA, 0xC1, 0x19, 0xD7, 0x12, + 0x93, 0x05, 0xA3, 0xFE, 0xFE, 0x05, 0x68, 0xF0, 0x30, 0x23, 0x65, 0x09, + 0xDB, 0x13, 0x14, 0x0F, 0x40, 0xFE, 0xC3, 0x08, 0x90, 0x0C, 0x4A, 0x0C, + 0x67, 0x0F, 0x51, 0xFE, 0x20, 0x05, 0xBD, 0xDB, 0x68, 0xFB, 0x33, 0xC3, + 0xCE, 0xE5, 0x1B, 0xB7, 0x0F, 0xE3, 0xB2, 0xB7, 0x52, 0xF9, 0xEC, 0xD2, + 0x99, 0x03, 0x43, 0xF7, 0x8A, 0x1E, 0xDC, 0x1C, 0x07, 0x4B, 0x03, 0x41, + 0x41, 0x47, 0x45, 0x44, 0x98, 0x29, 0xF1, 0x2B, 0x81, 0x2A, 0x5A, 0x20, + 0x95, 0x11, 0xDF, 0x0E, 0x52, 0xE1, 0x1B, 0xFB, 0x7A, 0xD6, 0xBB, 0xF8, + 0x92, 0xE8, 0xD0, 0x0D, 0x51, 0xF4, 0x1F, 0x24, 0x00, 0xF3, 0xC9, 0x24, + 0x3C, 0xF3, 0x79, 0x1E, 0x68, 0xEE, 0xEB, 0x09, 0xD0, 0xE0, 0xF3, 0xE6, + 0xF8, 0xD3, 0x2C, 0xD8, 0xF6, 0xDF, 0x7B, 0xF3, 0x6E, 0xEE, 0xC0, 0x03, + 0xAF, 0xFD, 0x21, 0x05, 0x22, 0x23, 0x3E, 0x1D, 0xD2, 0x27, 0x5F, 0x1E, + 0xC9, 0x00, 0xDB, 0xFC, 0xB7, 0xF5, 0x1B, 0xEF, 0x83, 0x01, 0x2B, 0xEB, + 0x33, 0xF5, 0x2E, 0xDD, 0xED, 0xF9, 0x7D, 0xE6, 0xE7, 0x1A, 0x24, 0xF5, + 0x8F, 0x19, 0xC9, 0xE6, 0x13, 0xF3, 0xD5, 0xD5, 0x7F, 0xDE, 0x3B, 0xD3, + 0xD6, 0xD8, 0xBF, 0xCB, 0xCF, 0xDE, 0x3F, 0xD3, 0x99, 0xF2, 0x67, 0xED, + 0x0C, 0x08, 0xE8, 0x05, 0xC1, 0x2D, 0x8C, 0x26, 0xAF, 0x4B, 0xFF, 0x3A, + 0xBE, 0x38, 0xB4, 0x28, 0x2F, 0x16, 0xB9, 0x1A, 0xC8, 0xF9, 0xE1, 0x10, + 0xC4, 0xD6, 0x2E, 0xEE, 0xC8, 0xC3, 0xC1, 0xDA, 0xE2, 0xC4, 0xF9, 0xDB, + 0x62, 0xDD, 0xEE, 0xE7, 0x8E, 0xF5, 0x54, 0xF1, 0x93, 0xFC, 0x9C, 0xF2, + 0x76, 0xF7, 0x7C, 0xF6, 0xE3, 0xE6, 0x34, 0xF9, 0x50, 0xD1, 0x7C, 0xF2, + 0x7E, 0xD1, 0x98, 0xF1, 0x06, 0xE6, 0xF4, 0xEC, 0xD6, 0xE5, 0x13, 0xD5, + 0xB2, 0xED, 0xC5, 0xE0, 0x53, 0x04, 0xE6, 0x08, 0x0B, 0x01, 0xC9, 0x05, + 0xB1, 0x00, 0x3D, 0xF3, 0xD0, 0x1D, 0x09, 0x07, 0xC6, 0x20, 0x67, 0x0C, + 0xD6, 0x05, 0xB8, 0xFA, 0x2A, 0x08, 0xC3, 0x03, 0x41, 0x14, 0x1E, 0x09, + 0x61, 0x06, 0xD5, 0xF4, 0xA9, 0xF4, 0x9A, 0xE6, 0x6B, 0xE7, 0x15, 0xDD, + 0x78, 0xE6, 0x4A, 0xDF, 0xEE, 0xEE, 0x2C, 0xF5, 0x03, 0xF5, 0x96, 0x0A, + 0x00, 0x04, 0x1B, 0x27, 0x84, 0x1F, 0x95, 0x4D, 0xC0, 0x29, 0xF0, 0x50, + 0xB5, 0x15, 0xE8, 0x27, 0x7F, 0x0C, 0xC5, 0x0F, 0x1E, 0x00, 0x9C, 0xFD, + 0xA4, 0xEB, 0x19, 0xE4, 0xA3, 0xDE, 0x1A, 0xDB, 0x60, 0xED, 0xF2, 0xF0, + 0x81, 0x09, 0x3B, 0x0F, 0x26, 0x03, 0x61, 0x0E, 0xC8, 0xED, 0x2F, 0xFC, + 0x6E, 0xEE, 0x89, 0xEC, 0xB6, 0xF3, 0x84, 0xCF, 0xD3, 0xED, 0xB2, 0xB5, + 0x23, 0xF2, 0x66, 0xCC, 0x87, 0xEC, 0x2D, 0xE5, 0xCA, 0xE9, 0x7D, 0xE2, + 0x27, 0x06, 0x37, 0xF3, 0xCC, 0x1D, 0x12, 0x11, 0xA9, 0x10, 0x3E, 0x07, + 0xBF, 0x02, 0xBA, 0xF6, 0x8A, 0x08, 0x16, 0x0E, 0xC3, 0x01, 0x75, 0x18, + 0xAE, 0xF3, 0xAD, 0x09, 0xFC, 0xEF, 0x50, 0x12, 0x86, 0xEB, 0x08, 0x14, + 0x00, 0xE5, 0xD0, 0xEA, 0x5B, 0xDF, 0xE3, 0xCA, 0x20, 0xD4, 0xBE, 0xCE, + 0x61, 0xD8, 0x53, 0xDF, 0xD5, 0xEC, 0x12, 0xF1, 0xF7, 0x01, 0xE5, 0x0D, + 0x1F, 0x1D, 0x83, 0x32, 0x1B, 0x3A, 0x25, 0x51, 0x52, 0x30, 0xE3, 0x46, + 0x07, 0x1B, 0x60, 0x20, 0x98, 0x13, 0xE5, 0xFE, 0xBA, 0xF9, 0x5F, 0xE0, + 0x47, 0xDB, 0x8B, 0xCD, 0x8E, 0xD2, 0x21, 0xCF, 0x11, 0xEA, 0x1B, 0xEE, + 0x79, 0xFC, 0xD5, 0x01, 0x3C, 0x05, 0x73, 0x00, 0xC2, 0x12, 0x79, 0x00, + 0x49, 0x12, 0x3F, 0xFE, 0xCB, 0xF6, 0xD7, 0xF2, 0x28, 0xF1, 0x0C, 0xFD, + 0x8E, 0x0B, 0x12, 0x13, 0xD2, 0x13, 0xA1, 0x0F, 0x1B, 0x21, 0x5B, 0x15, + 0xDE, 0x3C, 0xD5, 0x25, 0x05, 0x30, 0x49, 0x1B, 0x1B, 0x08, 0x5E, 0x0C, + 0x88, 0x04, 0x45, 0x16, 0x4B, 0x08, 0x95, 0x1D, 0x3F, 0xF2, 0x10, 0x1C, + 0x68, 0xEC, 0x83, 0x1B, 0xC7, 0xFF, 0xA3, 0x10, 0x62, 0xFA, 0xA2, 0xF5, + 0x40, 0xE2, 0xD3, 0xD5, 0x92, 0xE6, 0x93, 0xC3, 0x91, 0xFB, 0xEB, 0xCF, + 0xC3, 0x00, 0x07, 0xF0, 0xD1, 0x04, 0x49, 0x0C, 0xE7, 0x1F, 0xA2, 0x2B, + 0x0C, 0x3F, 0xF5, 0x47, 0x08, 0x3F, 0xED, 0x3A, 0x32, 0x30, 0x1F, 0x1D, + 0xAA, 0x1F, 0xDA, 0x11, 0x2A, 0xF8, 0xC0, 0xFE, 0x50, 0xDC, 0xF4, 0xEE, + 0xF5, 0xDF, 0x56, 0xEA, 0x97, 0x07, 0x6B, 0xFA, 0x70, 0x2E, 0x4B, 0x0F, + 0xED, 0x2C, 0x00, 0x13, 0x30, 0x21, 0xB3, 0x1B, 0x21, 0x0D, 0x37, 0x1C, + 0xAF, 0xDE, 0xFD, 0xFE, 0x28, 0xC8, 0x45, 0xF1, 0xC5, 0xDC, 0x4A, 0x00, + 0xE3, 0xE3, 0x03, 0xFA, 0xDA, 0xEE, 0xED, 0xF9, 0xCC, 0x16, 0xBE, 0x1A, + 0x70, 0x1E, 0xD2, 0x17, 0xB9, 0x08, 0xAC, 0xEF, 0x2B, 0x14, 0x01, 0xE9, + 0x68, 0x24, 0x15, 0xF0, 0xE1, 0x19, 0x2B, 0xE9, 0xDB, 0x12, 0xD5, 0xF6, + 0x87, 0x14, 0xDC, 0x12, 0xE4, 0x04, 0xF9, 0x0A, 0xC2, 0xE6, 0x66, 0xE6, + 0x2A, 0xCF, 0xEE, 0xCF, 0x07, 0xCB, 0xEA, 0xCE, 0xBA, 0xD8, 0x89, 0xD8, + 0xF8, 0xF3, 0x92, 0xF4, 0x7A, 0x19, 0x1F, 0x1E, 0x6F, 0x3B, 0x1B, 0x40, + 0xD9, 0x45, 0x74, 0x52, 0x90, 0x27, 0x21, 0x41, 0xB6, 0x0C, 0x88, 0x23, + 0x9F, 0x06, 0x3F, 0x0B, 0x3A, 0xFF, 0x84, 0xF6, 0x24, 0xED, 0x23, 0xE9, + 0x2D, 0xE8, 0x5C, 0xF2, 0x9A, 0xFC, 0x04, 0x10, 0xB4, 0xFE, 0x30, 0x14, + 0xF0, 0xF8, 0x8E, 0x07, 0x48, 0xFE, 0xF4, 0x03, 0xD0, 0xED, 0xEF, 0xEF, + 0x5F, 0xD6, 0xB4, 0xCA, 0x63, 0xE8, 0xDB, 0xC9, 0x07, 0xEC, 0x64, 0xD5, + 0x80, 0xD4, 0xA9, 0xD4, 0x8C, 0xEF, 0x05, 0xF0, 0xBA, 0x1F, 0xF1, 0x0D, + 0x96, 0x1D, 0x0D, 0x02, 0x4E, 0x0D, 0x46, 0xF4, 0x27, 0x16, 0xB2, 0x00, + 0x00, 0x12, 0x4E, 0xFB, 0x17, 0x02, 0xA9, 0xE1, 0xB6, 0x03, 0xF2, 0xE6, + 0x50, 0xF9, 0x0C, 0x05, 0x03, 0xD8, 0xEC, 0x08, 0x45, 0xC2, 0x52, 0xF0, + 0xD9, 0xC6, 0x15, 0xE7, 0xA1, 0xDE, 0x3E, 0xF1, 0x4F, 0xF5, 0x8E, 0xF1, + 0x63, 0x0E, 0x96, 0x06, 0xA9, 0x26, 0x66, 0x35, 0x8E, 0x2D, 0x5E, 0x52, + 0x03, 0x1C, 0x3A, 0x4F, 0x6B, 0x03, 0x6D, 0x3D, 0xD4, 0xEE, 0x72, 0x1E, + 0x60, 0xDC, 0x41, 0xFA, 0x92, 0xD7, 0x4E, 0xE9, 0x37, 0xDA, 0x13, 0xE1, + 0xB7, 0xEE, 0x50, 0xEA, 0x1F, 0x09, 0xA9, 0xF7, 0xD3, 0x12, 0xD9, 0xF1, + 0xF2, 0x16, 0x28, 0xEE, 0xA1, 0x17, 0x8E, 0xED, 0x46, 0xFE, 0x6A, 0xD9, + 0xB2, 0xEC, 0xBC, 0xDE, 0xF6, 0xEF, 0x6D, 0xF6, 0x21, 0xE7, 0xFB, 0xE7, + 0x43, 0xF2, 0xD2, 0xEC, 0x0B, 0x10, 0xC8, 0x15, 0x4A, 0x08, 0xDD, 0x0E, + 0x49, 0xF6, 0xEA, 0xE7, 0x2F, 0x0D, 0x2A, 0xEA, 0xA2, 0x1B, 0xA0, 0xEF, + 0x6F, 0x05, 0xA5, 0xE2, 0xEE, 0xFC, 0x0C, 0xF7, 0x6B, 0x09, 0x5C, 0x16, + 0x36, 0x06, 0xF1, 0x09, 0xCF, 0xFC, 0x7A, 0xED, 0x5D, 0xFC, 0x40, 0xDF, + 0x70, 0xF5, 0x0A, 0xDC, 0xA8, 0xE9, 0xEA, 0xE5, 0x08, 0xF6, 0x23, 0x01, + 0x32, 0x16, 0x76, 0x25, 0xD4, 0x2B, 0x40, 0x42, 0xCD, 0x34, 0x69, 0x4A, + 0x67, 0x28, 0x3A, 0x30, 0x51, 0x14, 0xF6, 0x12, 0xD0, 0x01, 0x90, 0xFB, + 0xD5, 0xED, 0xC0, 0xE1, 0x82, 0xD3, 0x72, 0xD0, 0x2F, 0xD4, 0x02, 0xE3, + 0xFF, 0xEF, 0x5F, 0x01, 0xE9, 0xF5, 0xFE, 0x03, 0xE3, 0xFD, 0x3C, 0x0E, + 0x7B, 0x07, 0xFE, 0x19, 0xB2, 0xEB, 0x33, 0x01, 0x7A, 0xDF, 0xA6, 0xE7, + 0x35, 0x02, 0x2B, 0xEA, 0xEE, 0xFA, 0xF6, 0xE1, 0xF5, 0xDB, 0x85, 0xE5, + 0x61, 0xF9, 0x96, 0x0A, 0xEA, 0x1A, 0x7A, 0x15, 0x51, 0x0D, 0x8C, 0x07, + 0xC4, 0x0C, 0xF0, 0x1E, 0xDE, 0x14, 0xCE, 0x37, 0xA2, 0xF8, 0x52, 0x23, + 0xA8, 0xF0, 0xB5, 0x19, 0x4F, 0x0B, 0xDF, 0x21, 0x7C, 0x09, 0x3C, 0x0E, + 0x0B, 0xEA, 0xA4, 0xEB, 0x29, 0xD8, 0xFE, 0xD4, 0xF6, 0xD7, 0x04, 0xC5, + 0x34, 0xDB, 0xC9, 0xBE, 0x88, 0xE5, 0x63, 0xD4, 0xA2, 0x02, 0xAB, 0x05, + 0x57, 0x26, 0x82, 0x2D, 0x0F, 0x41, 0x40, 0x37, 0x7D, 0x41, 0x58, 0x2A, + 0x40, 0x2C, 0x2C, 0x1A, 0xFB, 0x09, 0x26, 0xFC, 0x96, 0xEE, 0xAE, 0xDC, + 0x84, 0xEF, 0x12, 0xD7, 0x0D, 0xFB, 0xF7, 0xDA, 0xC6, 0x02, 0x39, 0xED, + 0x51, 0xFD, 0x35, 0xFA, 0x58, 0x01, 0xB3, 0xEE, 0x26, 0x0E, 0x27, 0xE0, + 0x7F, 0x00, 0x09, 0xD4, 0xA3, 0xF0, 0xA9, 0xD9, 0xDB, 0x00, 0x0A, 0x04, + 0x0B, 0x05, 0xEE, 0x14, 0xE0, 0xFA, 0xA7, 0x03, 0x6E, 0x14, 0x06, 0x1C, + 0xBA, 0x1E, 0xE8, 0x39, 0x36, 0xF5, 0x08, 0x29, 0x35, 0xEC, 0x7D, 0x22, + 0x24, 0x0E, 0xC9, 0x32, 0x74, 0x07, 0xCE, 0x24, 0x03, 0xF8, 0x6E, 0x13, + 0x15, 0x0D, 0xCD, 0x1C, 0x27, 0x0D, 0xBD, 0x14, 0x82, 0xF1, 0x25, 0xF9, + 0x69, 0xE3, 0xC9, 0xEE, 0xF4, 0xDC, 0xA2, 0xE8, 0x8F, 0xD5, 0xD8, 0xDF, + 0xF6, 0xDB, 0x35, 0xED, 0x7B, 0x01, 0x1A, 0x11, 0x3B, 0x35, 0x62, 0x36, + 0x95, 0x50, 0xAD, 0x53, 0xCC, 0x47, 0x05, 0x4F, 0x64, 0x35, 0xF8, 0x2B, + 0xF4, 0x1D, 0x1F, 0x04, 0x30, 0xFD, 0x08, 0xE1, 0xD6, 0xE3, 0xAF, 0xD0, + 0xD0, 0xDA, 0x22, 0xD6, 0x76, 0xF7, 0x3C, 0xED, 0xA6, 0x17, 0xF7, 0xF5, + 0x3A, 0x14, 0x2E, 0xF5, 0xC2, 0x06, 0x83, 0x04, 0x70, 0xF2, 0x30, 0x02, + 0x0C, 0xDE, 0x5A, 0xEE, 0x7E, 0xF8, 0xE0, 0xF8, 0x88, 0x17, 0xF6, 0xFE, + 0x80, 0x07, 0xBE, 0xEE, 0x48, 0x06, 0x89, 0x00, 0x75, 0x16, 0x11, 0x18, + 0x56, 0xFB, 0x8D, 0xF8, 0xCC, 0xED, 0x5F, 0xDE, 0x55, 0x0E, 0x6A, 0xF4, + 0xF3, 0x08, 0xAA, 0xF9, 0x35, 0xF0, 0x33, 0xF4, 0xC6, 0x01, 0x81, 0x11, + 0x56, 0x05, 0xD1, 0x1C, 0xD5, 0xE1, 0x8E, 0xFC, 0xD9, 0xCF, 0x52, 0xEA, + 0x20, 0xD0, 0x9D, 0xE3, 0x27, 0xD6, 0x5E, 0xD8, 0xB4, 0xEC, 0x11, 0xDB, + 0xF4, 0x0B, 0x78, 0xF4, 0x9E, 0x20, 0x32, 0x18, 0xE1, 0x2D, 0x2E, 0x37, + 0x10, 0x2E, 0xA8, 0x39, 0x07, 0x1F, 0x00, 0x28, 0xCD, 0x1A, 0x11, 0x1D, + 0x4D, 0x15, 0xCA, 0x09, 0x69, 0x03, 0x32, 0xEF, 0xF3, 0xF3, 0xBE, 0xD8, + 0xA8, 0xFD, 0x89, 0xDF, 0x00, 0x06, 0xF6, 0xF6, 0x07, 0xFB, 0xAB, 0xFE, + 0x4C, 0xFE, 0xBB, 0x03, 0xC0, 0x08, 0x78, 0xFF, 0x44, 0x01, 0x34, 0xE6, + 0x76, 0xFE, 0xFE, 0xE6, 0xBA, 0xFD, 0x49, 0xFB, 0xAB, 0xE7, 0x2D, 0xF4, + 0x39, 0xE6, 0x9E, 0xF8, 0x57, 0x0B, 0x89, 0x21, 0x76, 0x11, 0x60, 0x2F, + 0x12, 0xF4, 0x9D, 0x1C, 0x61, 0xFB, 0x80, 0x26, 0xBE, 0x06, 0xA8, 0x2A, + 0x12, 0xF5, 0xB3, 0x0B, 0xCA, 0xFE, 0xF3, 0x06, 0x01, 0x19, 0x8A, 0x16, + 0xEE, 0x0D, 0x2C, 0xFD, 0x8F, 0xF0, 0x83, 0xD5, 0xC6, 0xDE, 0x1D, 0xC6, + 0x7C, 0xD7, 0xBB, 0xC2, 0x0A, 0xD9, 0x48, 0xC8, 0xDD, 0xED, 0x61, 0xE8, + 0x59, 0x0E, 0xA0, 0x16, 0x1C, 0x25, 0xDC, 0x37, 0xDF, 0x30, 0x23, 0x44, + 0x66, 0x29, 0x72, 0x37, 0xAC, 0x17, 0x8A, 0x1A, 0x1C, 0x08, 0x5B, 0xF9, + 0x64, 0xF7, 0x8B, 0xE9, 0x8E, 0xE1, 0xC7, 0xE3, 0x0D, 0xE0, 0x46, 0xE8, + 0xFE, 0xEE, 0xE2, 0xF3, 0xAC, 0xF1, 0xED, 0xEB, 0x4F, 0xF8, 0xCC, 0xE4, + 0x3B, 0xFE, 0x20, 0xEE, 0x70, 0xF1, 0x20, 0xED, 0xE7, 0xEB, 0xC1, 0xEE, + 0x1C, 0xF3, 0xF3, 0xFE, 0x48, 0xE9, 0x6E, 0xFC, 0x77, 0xE6, 0x7B, 0xF9, + 0x10, 0x07, 0xEC, 0x14, 0x93, 0x0F, 0x41, 0x1B, 0x6B, 0xF4, 0x73, 0x02, + 0x7F, 0xFF, 0xFD, 0x0C, 0x7F, 0x12, 0xFC, 0x1A, 0x53, 0xF9, 0x18, 0xFC, + 0x5D, 0xF4, 0x76, 0xF3, 0x34, 0x08, 0xA6, 0x0B, 0x1B, 0xFA, 0x06, 0x02, + 0x70, 0xE4, 0x7B, 0xE1, 0x0D, 0xE7, 0xFC, 0xD3, 0x81, 0xEB, 0xB0, 0xD5, + 0xB2, 0xEE, 0xCF, 0xDC, 0x87, 0x0A, 0x97, 0xF9, 0x71, 0x31, 0x13, 0x21, + 0xA6, 0x49, 0xE8, 0x39, 0x3A, 0x4B, 0x94, 0x3E, 0xA7, 0x35, 0xB2, 0x33, + 0xD9, 0x1C, 0x7A, 0x2C, 0x25, 0xFD, 0xDC, 0x20, 0xAE, 0xD7, 0x4A, 0x04, + 0x35, 0xC4, 0x42, 0xE5, 0x54, 0xD0, 0x0E, 0xE2, 0xC0, 0xE6, 0x92, 0xEC, + 0xB7, 0xF1, 0x05, 0xEE, 0xC4, 0xF8, 0x38, 0xF6, 0x28, 0xF9, 0xEC, 0xFB, + 0x95, 0xE9, 0xDC, 0xE8, 0xC6, 0xE6, 0x91, 0xDD, 0xD8, 0xF9, 0xBD, 0xE7, + 0xF3, 0xF4, 0xA0, 0xDD, 0x50, 0xE8, 0x5F, 0xD8, 0xFE, 0x04, 0x7F, 0xFF, + 0x9A, 0x1D, 0x99, 0x0E, 0xBD, 0x0E, 0xF8, 0xEC, 0xF0, 0x13, 0x7C, 0xF5, + 0xAE, 0x1B, 0x3D, 0x11, 0x23, 0xF8, 0x93, 0xFD, 0xDD, 0xEA, 0xC6, 0xF7, + 0xB3, 0x06, 0xE7, 0x0F, 0xA2, 0x05, 0xBC, 0x07, 0x8E, 0xEA, 0x5E, 0xEC, + 0x9F, 0xE2, 0x43, 0xE0, 0x56, 0xDE, 0x18, 0xD4, 0x25, 0xD6, 0xC5, 0xCC, + 0x79, 0xEA, 0xB7, 0xEB, 0xE0, 0x13, 0x46, 0x1D, 0xAB, 0x36, 0x3A, 0x3D, + 0xB5, 0x46, 0x4B, 0x45, 0x60, 0x33, 0xE0, 0x2C, 0xD0, 0x13, 0xCF, 0x09, + 0x27, 0x01, 0x0F, 0xF0, 0xD2, 0xF0, 0xCF, 0xDE, 0xEA, 0xD9, 0x4B, 0xD5, + 0xE6, 0xDA, 0x95, 0xE8, 0x91, 0xF2, 0xBE, 0x06, 0x31, 0xF6, 0xDA, 0x04, + 0x33, 0xF6, 0xAF, 0xF6, 0x06, 0x02, 0x3E, 0xF5, 0xA4, 0xF2, 0x27, 0xE5, + 0x78, 0xE1, 0xE4, 0xDA, 0x07, 0xFB, 0x12, 0xF8, 0x85, 0x06, 0xC7, 0x05, + 0x46, 0xF7, 0xF1, 0x02, 0x06, 0x0D, 0x7D, 0x1D, 0x58, 0x25, 0x9F, 0x27, + 0xD4, 0x06, 0xDF, 0x0A, 0x22, 0xFB, 0x57, 0x13, 0x53, 0x10, 0xD8, 0x2C, + 0xEF, 0x04, 0xEA, 0x1E, 0x61, 0xFB, 0x5D, 0x14, 0xA4, 0x14, 0x2D, 0x1F, + 0x24, 0x18, 0xFC, 0x16, 0x28, 0xF6, 0x13, 0xF7, 0x6D, 0xD9, 0x32, 0xDA, + 0xAD, 0xCF, 0xFF, 0xC8, 0x54, 0xD4, 0x0C, 0xC6, 0x53, 0xE8, 0x3E, 0xDA, + 0x54, 0x06, 0xC3, 0xFC, 0x43, 0x2E, 0xC5, 0x29, 0x2D, 0x4D, 0x1B, 0x4C, + 0x46, 0x43, 0xD5, 0x3B, 0x0A, 0x2B, 0x04, 0x1B, 0x7D, 0x19, 0x61, 0x00, + 0xED, 0xFF, 0xEC, 0xD9, 0x8B, 0xDD, 0xB9, 0xB7, 0xB9, 0xDC, 0xA6, 0xC7, + 0x47, 0xFC, 0xB9, 0xEF, 0x06, 0x01, 0xC9, 0xFA, 0x78, 0xFA, 0x49, 0xFB, + 0x30, 0x07, 0x3B, 0x07, 0x1C, 0xFB, 0xA7, 0x04, 0x6C, 0xDF, 0x14, 0xFE, + 0x0D, 0xEA, 0xC9, 0x12, 0x35, 0xF1, 0x82, 0x15, 0x8D, 0xE7, 0xBA, 0x05, + 0xF4, 0xFD, 0x83, 0x1C, 0x3E, 0x14, 0x5A, 0x38, 0xFE, 0xFC, 0x7C, 0x1D, + 0x02, 0xF5, 0x0D, 0x0F, 0x0E, 0x0B, 0xAB, 0x22, 0xE1, 0x07, 0x1A, 0x15, + 0xAA, 0xFF, 0xAF, 0x05, 0x56, 0x08, 0x41, 0x17, 0xC4, 0xFE, 0xCB, 0x0F, + 0xB4, 0xE6, 0x8A, 0xE8, 0x53, 0xE7, 0xC1, 0xD6, 0x24, 0xF6, 0xEC, 0xD8, + 0x38, 0xFE, 0xBF, 0xDE, 0x8B, 0x0C, 0xF1, 0xEF, 0xCB, 0x1F, 0x2A, 0x07, + 0xE0, 0x36, 0x9D, 0x1F, 0x0B, 0x4A, 0x2F, 0x2C, 0xE6, 0x38, 0xED, 0x12, + 0xB7, 0x1C, 0x4E, 0xF9, 0xCF, 0x11, 0xA9, 0xF0, 0x6F, 0x07, 0x8D, 0xE7, + 0x18, 0xF4, 0x38, 0xD7, 0x19, 0xF4, 0x1D, 0xD8, 0x9F, 0x07, 0x88, 0xF0, + 0x9F, 0x01, 0xBB, 0xF7, 0x1C, 0xF8, 0xDB, 0xFA, 0x5B, 0x0E, 0x9C, 0x11, + 0x27, 0x15, 0x8A, 0x13, 0x8A, 0x04, 0x0D, 0xFD, 0xB2, 0x12, 0xA0, 0x04, + 0xFC, 0x16, 0xC2, 0x0C, 0x9A, 0xF1, 0x97, 0xFD, 0x34, 0xED, 0x58, 0x0A, + 0x37, 0x00, 0x94, 0x21, 0xD5, 0xE8, 0xD0, 0x0B, 0x26, 0xEB, 0x39, 0x03, + 0x8B, 0x12, 0xB4, 0x21, 0x57, 0x06, 0x8C, 0x1E, 0x79, 0xF0, 0xBE, 0x10, + 0x61, 0x05, 0xD3, 0x26, 0x39, 0x04, 0x35, 0x26, 0x77, 0xE8, 0xD2, 0xF9, + 0xB8, 0xDD, 0x4F, 0xD9, 0xC5, 0xD4, 0x4B, 0xCF, 0xF6, 0xD3, 0x17, 0xCC, + 0x16, 0xF5, 0x16, 0xDC, 0x1D, 0x21, 0x9D, 0xF9, 0x8D, 0x3B, 0x92, 0x19, + 0x15, 0x41, 0x07, 0x3E, 0x92, 0x2B, 0x1A, 0x49, 0x3D, 0x17, 0x0B, 0x3D, + 0x93, 0x0A, 0x17, 0x2D, 0xE8, 0xFA, 0xA4, 0x19, 0xE1, 0xE9, 0x17, 0xF7, + 0xCF, 0xE7, 0x76, 0xE7, 0xC1, 0xF8, 0x0A, 0x00, 0x1C, 0xF4, 0x57, 0x06, + 0xE5, 0xEB, 0x69, 0x00, 0x18, 0xF9, 0xEB, 0x10, 0x77, 0xF1, 0x9D, 0x04, + 0xB1, 0xE0, 0x73, 0xE0, 0xEA, 0xEF, 0xAA, 0xEA, 0x36, 0xEF, 0x04, 0xF1, + 0x87, 0xD9, 0x8E, 0xD2, 0xBA, 0xF9, 0xB8, 0xE8, 0x28, 0x23, 0x7B, 0x12, + 0x40, 0x0C, 0x64, 0xF6, 0xD6, 0x01, 0x29, 0xEE, 0x8F, 0x19, 0xAE, 0x09, + 0xB1, 0x09, 0x32, 0xEA, 0x08, 0xF4, 0x91, 0xC9, 0xD6, 0x07, 0xCB, 0xDF, + 0xDE, 0x06, 0xEF, 0xDC, 0x6D, 0xDE, 0xDD, 0xBD, 0xDC, 0xD2, 0x32, 0xBF, + 0x4B, 0xE5, 0x71, 0xC8, 0x1E, 0xEF, 0x95, 0xC9, 0x01, 0x02, 0x94, 0xE7, + 0xB4, 0x20, 0x05, 0x1B, 0xA9, 0x32, 0x22, 0x42, 0xC5, 0x38, 0xFF, 0x53, + 0x85, 0x32, 0x0F, 0x4D, 0xB1, 0x18, 0xCE, 0x34, 0xDC, 0xF8, 0x7B, 0x15, + 0x12, 0xE8, 0x46, 0x01, 0xF9, 0xCF, 0x25, 0xED, 0x58, 0xBC, 0x31, 0xE8, + 0xB9, 0xC1, 0xC7, 0xF8, 0xAF, 0xC6, 0xFF, 0xF8, 0x30, 0xD8, 0x11, 0xF5, + 0x1D, 0x00, 0x2F, 0xFC, 0xB2, 0x08, 0xCF, 0xF7, 0xE6, 0xFA, 0xA7, 0xF8, + 0xC2, 0x04, 0x8C, 0x05, 0x14, 0x00, 0x1A, 0xEF, 0xB0, 0xF0, 0x84, 0xDB, + 0xAA, 0x0B, 0x5D, 0xF8, 0xC9, 0x15, 0x55, 0xFC, 0x2B, 0xEF, 0xC4, 0xD9, + 0x3F, 0xF4, 0x70, 0xE2, 0x88, 0x11, 0x2F, 0xF6, 0x9A, 0x00, 0xE5, 0xE1, + 0x74, 0xFA, 0xDF, 0xE0, 0x12, 0x11, 0x13, 0x01, 0x30, 0x08, 0x1B, 0x07, + 0x20, 0xEF, 0x9A, 0xF2, 0xCF, 0xE8, 0xC9, 0xE8, 0x4E, 0xDC, 0xDC, 0xE2, + 0x6A, 0xCA, 0x9A, 0xD9, 0x2B, 0xDB, 0x39, 0xEC, 0xA7, 0x07, 0x7F, 0x12, + 0x52, 0x2D, 0x6A, 0x32, 0xCB, 0x39, 0x80, 0x47, 0xA5, 0x31, 0x53, 0x46, + 0xC1, 0x1B, 0x03, 0x29, 0xE0, 0xFC, 0x9E, 0xFB, 0xA7, 0xE5, 0x15, 0xDB, + 0x77, 0xCD, 0x2C, 0xC1, 0x79, 0xCF, 0x22, 0xC3, 0x55, 0xE9, 0x98, 0xE0, + 0x5C, 0xF0, 0x1D, 0xF0, 0xE7, 0xEE, 0xF5, 0xF8, 0x35, 0xF0, 0x59, 0x03, + 0x38, 0xE4, 0x96, 0xFA, 0x9E, 0xE4, 0xBA, 0xEE, 0x07, 0xFF, 0x16, 0xF7, + 0x73, 0xFE, 0xCC, 0xED, 0x6C, 0xF5, 0xA8, 0xE0, 0x0E, 0x10, 0x86, 0xFE, + 0xEB, 0x15, 0xF7, 0x0E, 0xE1, 0x03, 0xB6, 0xF7, 0x88, 0x19, 0xCC, 0x04, + 0x43, 0x2F, 0x04, 0x28, 0xF9, 0x16, 0x68, 0x22, 0x8C, 0x0A, 0x0C, 0x18, + 0xE3, 0x19, 0x2D, 0x20, 0xBA, 0x01, 0xD6, 0x07, 0x74, 0xD5, 0x4B, 0xDB, + 0xA7, 0xD0, 0x00, 0xCF, 0xE9, 0xDA, 0x6D, 0xD6, 0x15, 0xDF, 0x87, 0xD9, + 0x20, 0xFD, 0xCF, 0xF0, 0x6D, 0x25, 0x52, 0x1D, 0x2E, 0x3B, 0xD9, 0x3E, + 0x16, 0x46, 0xC8, 0x49, 0xC8, 0x3F, 0x31, 0x47, 0x0C, 0x26, 0x8A, 0x3C, + 0x07, 0x0D, 0xEF, 0x26, 0xCC, 0xF7, 0x82, 0x07, 0xAF, 0xD8, 0x24, 0xDD, + 0x57, 0xDA, 0xA5, 0xD8, 0xF5, 0xE9, 0x3F, 0xEC, 0x64, 0xDE, 0xDE, 0xE4, + 0x3B, 0xE9, 0x08, 0xED, 0x38, 0x07, 0x8D, 0x06, 0x7A, 0x02, 0x3C, 0xFE, + 0x22, 0xFF, 0x81, 0xF9, 0x09, 0x19, 0xE2, 0x10, 0x04, 0x0C, 0x34, 0x00, + 0xCF, 0xF6, 0xBD, 0xF0, 0x7E, 0x14, 0x64, 0x1B, 0x92, 0x0B, 0x7D, 0x1C, + 0xBB, 0xDB, 0x08, 0xF7, 0xFF, 0xE5, 0xB6, 0x03, 0x84, 0x04, 0xDD, 0x16, + 0xC2, 0xFC, 0xA2, 0x01, 0x38, 0x04, 0x56, 0x03, 0xA4, 0x1B, 0xE8, 0x17, + 0x57, 0x06, 0xA4, 0xF7, 0x89, 0xDF, 0xE7, 0xC9, 0x06, 0xD4, 0xB3, 0xB8, + 0xB1, 0xD7, 0x11, 0xB1, 0x5D, 0xE5, 0x2E, 0xBD, 0x1A, 0x08, 0x9A, 0xEC, + 0x53, 0x2E, 0xFD, 0x19, 0xBE, 0x4A, 0x4E, 0x35, 0xE5, 0x45, 0x0B, 0x3F, + 0x7F, 0x29, 0xDE, 0x32, 0x92, 0x0F, 0x42, 0x1F, 0xAD, 0x05, 0xCC, 0x15, + 0x57, 0xF8, 0x06, 0xFF, 0xAA, 0xE1, 0x80, 0xE4, 0x8E, 0xEA, 0xE8, 0xF2, + 0x32, 0xEB, 0x2D, 0xF4, 0xCA, 0xDA, 0x11, 0xE2, 0xCF, 0xEE, 0x7B, 0xF6, + 0x80, 0x08, 0xEF, 0x11, 0x22, 0x03, 0x9A, 0x14, 0x6D, 0x10, 0x17, 0x2A, + 0x0D, 0x24, 0xBD, 0x39, 0x1E, 0x0A, 0xCF, 0x0F, 0x6B, 0x09, 0x00, 0x00, + 0xDD, 0x26, 0x75, 0x19, 0xEA, 0x0A, 0x8C, 0x09, 0x59, 0xEF, 0x51, 0x06, + 0x2B, 0x08, 0x40, 0x30, 0x5E, 0x11, 0x1F, 0x32, 0x08, 0x06, 0x94, 0x10, + 0x55, 0x13, 0x8A, 0x14, 0xCA, 0x0F, 0xA7, 0x14, 0x40, 0xE8, 0x4D, 0xEA, + 0x2E, 0xD4, 0x47, 0xCF, 0xC9, 0xD0, 0x27, 0xCE, 0x4F, 0xC7, 0xBF, 0xCA, + 0xCC, 0xDB, 0xFA, 0xDA, 0xEA, 0x0A, 0xAC, 0xFD, 0xF2, 0x31, 0xDE, 0x1D, + 0x9D, 0x4C, 0x64, 0x3A, 0xD4, 0x48, 0x1A, 0x3C, 0x6F, 0x35, 0x2F, 0x28, + 0xBF, 0x2A, 0xF4, 0x0F, 0xB5, 0x1B, 0x44, 0xFA, 0xE9, 0xEE, 0x5D, 0xD9, + 0x62, 0xD6, 0xF0, 0xCD, 0x92, 0xE3, 0xBF, 0xEB, 0xA7, 0xD8, 0x29, 0xF4, + 0x48, 0xD5, 0x34, 0xF1, 0x5D, 0xF5, 0xAA, 0x0C, 0x03, 0xFF, 0xC7, 0x18, + 0x46, 0xF9, 0xFF, 0x0C, 0xD8, 0x16, 0xE6, 0x17, 0xC1, 0x21, 0xD6, 0x15, + 0x20, 0x02, 0xBD, 0xEF, 0x7F, 0x06, 0x38, 0xEF, 0xA3, 0x11, 0x48, 0xFA, + 0x48, 0xFB, 0xF8, 0xD5, 0x46, 0x00, 0x30, 0xD1, 0xE8, 0x15, 0xBB, 0xF4, + 0xC9, 0x02, 0x95, 0xF9, 0xD7, 0xF4, 0x49, 0xFC, 0x82, 0x06, 0xE5, 0x16, + 0x72, 0xF6, 0x6E, 0x14, 0x45, 0xD6, 0x89, 0xF3, 0xE6, 0xDB, 0xDA, 0xE2, + 0xC3, 0xE7, 0xBB, 0xD5, 0x05, 0xE8, 0x8D, 0xCC, 0xFD, 0xFE, 0x66, 0xEB, + 0xBA, 0x18, 0xF0, 0x0D, 0x20, 0x1E, 0x53, 0x26, 0x0F, 0x1A, 0xA8, 0x40, + 0xFF, 0x1B, 0xEF, 0x47, 0xD6, 0x22, 0x82, 0x39, 0x69, 0x1D, 0xBA, 0x23, + 0x82, 0x0A, 0x25, 0x0A, 0x6E, 0xE6, 0x3E, 0xE1, 0x26, 0xD9, 0x65, 0xD8, + 0x9A, 0xDF, 0x31, 0xED, 0x08, 0xDB, 0x32, 0xF4, 0x7A, 0xE7, 0xBA, 0x03, + 0x8C, 0xFD, 0x55, 0x0D, 0xFA, 0x02, 0x33, 0xF9, 0x38, 0x0C, 0x34, 0xF3, + 0xF2, 0x19, 0xEA, 0xF7, 0x9F, 0xFC, 0x7B, 0xD9, 0x73, 0xE4, 0xF9, 0xD7, + 0xBC, 0xFE, 0x52, 0xFA, 0x88, 0xFA, 0x6F, 0xE6, 0x58, 0xEA, 0xFA, 0xD0, + 0x44, 0x07, 0x03, 0xF3, 0x90, 0x19, 0x38, 0xFF, 0x9B, 0x11, 0xC2, 0xF3, + 0xB4, 0x1F, 0xD0, 0x12, 0x08, 0x1E, 0x27, 0x1E, 0xF8, 0xF1, 0xFE, 0xF6, + 0x85, 0xD5, 0x73, 0xE4, 0x2E, 0xC9, 0x26, 0xDA, 0xD6, 0xB6, 0x2A, 0xC3, + 0x6C, 0xCA, 0xC7, 0xD6, 0xD6, 0xFC, 0xC7, 0x08, 0x22, 0x18, 0xE3, 0x2F, + 0x45, 0x26, 0x20, 0x50, 0x72, 0x2C, 0x04, 0x5D, 0x10, 0x22, 0xEB, 0x53, + 0x77, 0x07, 0xD2, 0x3B, 0x35, 0xF4, 0xF8, 0x21, 0x5E, 0xE7, 0x14, 0xFD, + 0x95, 0xD7, 0xC2, 0xDF, 0x17, 0xD0, 0xDE, 0xDA, 0x30, 0xCD, 0x58, 0xDA, + 0xBB, 0xDF, 0xF0, 0xE7, 0x4A, 0x03, 0x3D, 0xF8, 0xF4, 0x17, 0x70, 0xFC, + 0x66, 0x27, 0x55, 0x0B, 0x58, 0x31, 0x1C, 0x22, 0x5A, 0x15, 0xC0, 0x15, + 0x4B, 0xF4, 0xAF, 0xF5, 0x38, 0x08, 0xBB, 0xFA, 0x09, 0x11, 0xFF, 0xF8, + 0x6D, 0xF9, 0x9A, 0xE1, 0x44, 0x0E, 0x0E, 0xEB, 0x5F, 0x2B, 0xA2, 0xFC, + 0xF3, 0x17, 0x7A, 0xEF, 0xC0, 0x0F, 0xFC, 0xF0, 0x60, 0x19, 0xDF, 0x04, + 0x36, 0xFB, 0x5C, 0xF9, 0x17, 0xE1, 0xBF, 0xE8, 0xFB, 0xEA, 0x58, 0xE5, + 0x75, 0xE3, 0x0C, 0xDA, 0x7D, 0xDF, 0x45, 0xDC, 0x7D, 0x0E, 0xCF, 0x01, + 0x28, 0x38, 0x93, 0x1F, 0x3D, 0x45, 0xE4, 0x28, 0xA9, 0x44, 0xF8, 0x28, + 0x36, 0x34, 0x0D, 0x22, 0xA0, 0x1A, 0xC0, 0x16, 0x03, 0xFD, 0x5F, 0x07, + 0x93, 0xE1, 0x59, 0xFD, 0xB7, 0xC4, 0xD1, 0xF4, 0xD1, 0xC1, 0x8D, 0xF3, + 0x36, 0xD3, 0xEF, 0xEE, 0x38, 0xE5, 0xF1, 0xEF, 0xE1, 0xFF, 0x83, 0x02, + 0x95, 0x09, 0x0A, 0x0C, 0x79, 0x09, 0x99, 0x0F, 0x8B, 0x17, 0x81, 0x21, + 0x9C, 0x0D, 0xFB, 0x23, 0x00, 0xE4, 0x1A, 0x04, 0xA4, 0xE2, 0x15, 0xF8, + 0x5B, 0x02, 0xF9, 0xFC, 0x50, 0xF9, 0x35, 0xE1, 0xDC, 0xEF, 0x9A, 0xD6, + 0x35, 0x08, 0x78, 0xF4, 0xB6, 0x08, 0x34, 0x01, 0x58, 0xF9, 0x80, 0x03, + 0xA6, 0x0B, 0x91, 0x1C, 0xF1, 0x16, 0x7E, 0x1E, 0x30, 0x07, 0x0B, 0xFC, + 0xD3, 0xFC, 0x92, 0xEE, 0xB5, 0xEE, 0x89, 0xF0, 0x42, 0xD2, 0x70, 0xDD, + 0x80, 0xD2, 0x47, 0xDF, 0x03, 0xF6, 0x6E, 0x07, 0x3A, 0x15, 0xE9, 0x22, + 0x9D, 0x2B, 0xAC, 0x24, 0xD0, 0x3A, 0x1F, 0x2E, 0x3A, 0x34, 0xA5, 0x35, + 0xA6, 0x11, 0x02, 0x1C, 0xF5, 0xF1, 0x14, 0x02, 0x70, 0xD5, 0x6E, 0xEC, + 0x85, 0xC8, 0x13, 0xDA, 0x8B, 0xDA, 0xA1, 0xD4, 0x71, 0xEF, 0x42, 0xD4, + 0xBD, 0x00, 0x52, 0xDE, 0xE7, 0x07, 0xB7, 0xEC, 0x92, 0x03, 0x52, 0xEE, + 0x43, 0x0D, 0xD8, 0xF7, 0xFE, 0x15, 0x0C, 0x10, 0xB8, 0xFE, 0x6D, 0x06, + 0xC9, 0x02, 0xEE, 0xF8, 0xE1, 0x2A, 0x04, 0x0B, 0x54, 0x1D, 0xC9, 0x01, + 0x7E, 0xF8, 0x78, 0xE5, 0x1B, 0x07, 0x55, 0xF6, 0x91, 0x19, 0xD4, 0x14, + 0x61, 0x0F, 0xB3, 0x14, 0x22, 0x1B, 0x91, 0x1E, 0xFA, 0x1A, 0x5C, 0x29, + 0x94, 0xE5, 0xF9, 0x0C, 0x17, 0xBD, 0x67, 0xF6, 0xFE, 0xBA, 0xB1, 0xF6, + 0x4C, 0xBA, 0x59, 0xE4, 0x42, 0xD8, 0xBD, 0xEB, 0x2A, 0x14, 0x8F, 0x1F, + 0xCE, 0x2E, 0x64, 0x3C, 0xC7, 0x2E, 0xD6, 0x39, 0xA4, 0x3A, 0x2B, 0x43, + 0x33, 0x36, 0x87, 0x42, 0xEB, 0x0F, 0x4D, 0x20, 0x54, 0xFD, 0x83, 0x0B, + 0xF2, 0xF0, 0x8F, 0xEF, 0xE2, 0xDF, 0x9A, 0xCA, 0x67, 0xDD, 0x65, 0xBF, + 0xC3, 0xDF, 0xDD, 0xC2, 0x8A, 0xEE, 0xF7, 0xD2, 0x6F, 0x0B, 0x1C, 0xEE, + 0x1A, 0x1C, 0x3A, 0xFF, 0x85, 0x26, 0xC6, 0x13, 0x42, 0x26, 0xDD, 0x24, + 0xBB, 0xFF, 0xC9, 0x07, 0x83, 0xEC, 0xD5, 0xEE, 0x06, 0x0A, 0xDF, 0x03, + 0x2B, 0x08, 0xF6, 0xFD, 0x4A, 0xE6, 0xA5, 0xE6, 0x53, 0xF0, 0x66, 0xFF, + 0xE4, 0x0B, 0xE3, 0x14, 0x55, 0x08, 0x53, 0x03, 0xDD, 0x0C, 0xE7, 0x0B, + 0x1F, 0x13, 0x2E, 0x1E, 0x39, 0xFC, 0x35, 0xFC, 0xD0, 0xE9, 0xD8, 0xD5, + 0xF3, 0xE0, 0x66, 0xCD, 0xF0, 0xBE, 0x61, 0xBD, 0xB8, 0xB1, 0x9B, 0xC1, + 0x5A, 0xE5, 0xD6, 0xF7, 0x13, 0x16, 0xD3, 0x1D, 0xC6, 0x26, 0x16, 0x24, + 0x8B, 0x32, 0x9C, 0x32, 0x44, 0x2F, 0x44, 0x39, 0xA2, 0x0C, 0x0B, 0x16, + 0x00, 0xF3, 0x32, 0xF2, 0x03, 0xE5, 0xE4, 0xDC, 0x48, 0xD8, 0x43, 0xCA, + 0xF0, 0xE1, 0x95, 0xC7, 0xAC, 0xEF, 0x47, 0xC7, 0x5A, 0xFE, 0x69, 0xD3, + 0x1D, 0x12, 0x7E, 0xF4, 0x06, 0x15, 0x51, 0x0C, 0xB2, 0x16, 0xC8, 0x18, + 0x1F, 0x29, 0x6A, 0x29, 0xDF, 0x1D, 0xCA, 0x15, 0x36, 0xFC, 0xBF, 0xE8, + 0x10, 0xFA, 0xB1, 0xED, 0x99, 0xEF, 0x07, 0x01, 0x31, 0xD0, 0x4B, 0xEE, + 0x49, 0xDF, 0xFE, 0xEA, 0x4D, 0x0B, 0xB3, 0x0D, 0xD4, 0x0E, 0x25, 0x17, + 0xDD, 0x08, 0xDA, 0x0F, 0xA1, 0x18, 0x80, 0x22, 0x4F, 0x0B, 0x99, 0x20, + 0x79, 0xE7, 0x87, 0x01, 0x52, 0xD7, 0x8F, 0xF9, 0x29, 0xCA, 0x0C, 0xF4, + 0x5B, 0xC4, 0x70, 0xDD, 0x2A, 0xEB, 0xFA, 0xE4, 0x7D, 0x25, 0x7B, 0x07, + 0x87, 0x3A, 0xD4, 0x19, 0xF1, 0x2B, 0x8C, 0x24, 0x46, 0x29, 0x62, 0x3E, + 0xE7, 0x1F, 0x96, 0x35, 0x26, 0x05, 0xB6, 0x17, 0x6A, 0xE5, 0x8A, 0x03, + 0xA2, 0xD1, 0x5D, 0xED, 0xEC, 0xD9, 0x89, 0xE5, 0x45, 0xE0, 0xAB, 0xDF, + 0x7B, 0xE8, 0xAA, 0xDC, 0x21, 0xFA, 0xDA, 0xE8, 0x53, 0x00, 0xC4, 0xF6, + 0xBC, 0x02, 0x21, 0xFD, 0x70, 0x19, 0x34, 0x0F, 0x87, 0x17, 0x4D, 0x0E, + 0xDC, 0xF2, 0xB9, 0xF1, 0x56, 0xEF, 0x46, 0xF8, 0xCC, 0xFA, 0x2A, 0xFF, + 0x2D, 0xE6, 0x41, 0xD4, 0x8B, 0xDE, 0x70, 0xC2, 0x6B, 0x01, 0x9A, 0xED, + 0x77, 0x0D, 0x9D, 0xFB, 0x4A, 0x0D, 0xDA, 0xF6, 0x7B, 0x28, 0x65, 0x0E, + 0xD7, 0x28, 0xAD, 0x07, 0xE2, 0xFB, 0x43, 0xE4, 0xAE, 0xD3, 0xB3, 0xDC, + 0x4A, 0xBF, 0xA8, 0xD8, 0x6F, 0xC1, 0xA6, 0xCD, 0x2A, 0xF4, 0xAA, 0xE9, + 0x88, 0x34, 0x69, 0x15, 0xAF, 0x3F, 0x1F, 0x23, 0xA1, 0x2D, 0xAB, 0x2A, + 0x8C, 0x2C, 0x94, 0x3C, 0x0E, 0x18, 0x55, 0x36, 0x2F, 0xFA, 0xEE, 0x2E, + 0x81, 0xE9, 0xEC, 0x25, 0x8D, 0xE6, 0x60, 0x0E, 0x81, 0xF4, 0x62, 0xFE, + 0xDB, 0xF8, 0xD5, 0xEB, 0xC8, 0xEC, 0x3A, 0xE6, 0xEA, 0xEA, 0x31, 0x06, + 0x4F, 0xF9, 0xF7, 0x1E, 0xB5, 0x0E, 0x08, 0x1F, 0x39, 0x27, 0xDB, 0x2F, + 0xF2, 0x13, 0xF3, 0x22, 0x5E, 0xE7, 0xA6, 0xF0, 0x07, 0xEB, 0x1B, 0xEC, + 0x6D, 0xF8, 0xBA, 0xFA, 0xF9, 0xDF, 0xA6, 0xE4, 0xEA, 0xDF, 0x52, 0xE5, + 0x38, 0x0A, 0xDC, 0x0B, 0xAE, 0x10, 0x41, 0xFF, 0xCB, 0x09, 0xF6, 0xDA, + 0x19, 0x1B, 0xCF, 0xD9, 0xD7, 0x11, 0x69, 0xD5, 0x63, 0xF1, 0x97, 0xC6, + 0x3E, 0xEA, 0xCB, 0xC9, 0x2D, 0xED, 0x57, 0xCD, 0x46, 0xF0, 0x45, 0xD5, + 0x11, 0x0E, 0xC4, 0x01, 0x6D, 0x2D, 0x34, 0x30, 0xF5, 0x2F, 0xFB, 0x39, + 0xD1, 0x26, 0x9B, 0x36, 0x78, 0x23, 0xAC, 0x3C, 0xF9, 0x0F, 0xEA, 0x2C, + 0xB5, 0xFA, 0x8B, 0x13, 0x18, 0xE9, 0xAD, 0xFD, 0x09, 0xE2, 0x05, 0xEF, + 0x76, 0xF1, 0xC4, 0xF7, 0x50, 0xF1, 0x79, 0xFE, 0xB1, 0xEA, 0xB9, 0xFC, + 0xA7, 0xF9, 0x37, 0x00, 0x63, 0xFD, 0x0E, 0xFB, 0x41, 0xFC, 0x4E, 0xF8, + 0x72, 0x17, 0xD4, 0x08, 0x5A, 0x18, 0xDA, 0xFF, 0x3B, 0xFE, 0x19, 0xEA, + 0x2D, 0x09, 0x3E, 0xFB, 0xAD, 0x19, 0x0A, 0x0C, 0xA2, 0xFA, 0x94, 0xEE, + 0xA9, 0xEB, 0x49, 0xE6, 0xC6, 0x09, 0xCA, 0x09, 0xE6, 0x0E, 0x11, 0x0A, + 0x81, 0x09, 0x50, 0xFF, 0xD9, 0x12, 0xB2, 0x13, 0x40, 0x03, 0xC0, 0x10, + 0xA9, 0xE7, 0x93, 0xF4, 0x64, 0xE6, 0xF0, 0xF5, 0xE4, 0xE4, 0x7C, 0xFD, + 0x87, 0xE8, 0x17, 0xFB, 0x26, 0x15, 0x1A, 0x11, 0x0E, 0x43, 0xFF, 0x31, + 0x47, 0x35, 0x90, 0x33, 0x43, 0x1D, 0xE4, 0x37, 0x18, 0x20, 0x49, 0x43, + 0xED, 0x0D, 0x55, 0x29, 0x51, 0xF1, 0x94, 0x0C, 0x20, 0xE2, 0x05, 0xFB, + 0x8E, 0xE3, 0x0B, 0xF0, 0x33, 0xDF, 0x4A, 0xE6, 0x37, 0xDD, 0xEF, 0xDA, + 0x82, 0xF6, 0x6A, 0xDE, 0xBA, 0x07, 0x05, 0xE7, 0xE2, 0x07, 0x34, 0xE4, + 0x24, 0x22, 0x9A, 0xEF, 0xD6, 0x32, 0x7A, 0xFB, 0xAC, 0x10, 0x2D, 0xE2, + 0x7C, 0xFD, 0xB9, 0xD4, 0x8A, 0x09, 0x41, 0xF0, 0xAF, 0xF3, 0xA7, 0xF1, + 0x03, 0xD3, 0x7C, 0xD7, 0xF1, 0xED, 0x5F, 0xF3, 0xE3, 0x10, 0x83, 0x1B, + 0x44, 0x0E, 0x27, 0x17, 0x1C, 0x0E, 0x6B, 0x20, 0x39, 0x04, 0x47, 0x33, + 0x36, 0xDB, 0x52, 0x1C, 0xB0, 0xBC, 0x98, 0x01, 0xA2, 0xB7, 0xC9, 0xF6, + 0xBA, 0xBF, 0xC5, 0xE7, 0xDA, 0xE2, 0x7E, 0xF3, 0x3F, 0x17, 0x08, 0x1C, + 0x06, 0x2A, 0xDE, 0x28, 0x6E, 0x1A, 0xCB, 0x25, 0x55, 0x15, 0x01, 0x3C, + 0x1A, 0x05, 0x80, 0x2C, 0x3E, 0xF4, 0x19, 0xFE, 0x44, 0xF9, 0xC8, 0xE8, + 0xC2, 0x07, 0x86, 0xE5, 0x69, 0x10, 0x16, 0xE1, 0x75, 0x0B, 0x6F, 0xDE, + 0xB9, 0x0E, 0xE0, 0xEA, 0x8E, 0x0F, 0x92, 0xEF, 0x3B, 0x04, 0x28, 0xE6, + 0x51, 0x0D, 0x67, 0xF1, 0xB1, 0x1E, 0x21, 0x06, 0x67, 0x0F, 0xF6, 0xF0, + 0x8E, 0xFC, 0x18, 0xD2, 0xC5, 0x06, 0xDC, 0xE1, 0xCA, 0x07, 0x5B, 0xF7, + 0xB7, 0xF6, 0xFC, 0xF1, 0x24, 0x00, 0xF5, 0x03, 0x2D, 0x18, 0xF6, 0x28, + 0x15, 0x1A, 0xDF, 0x2A, 0x35, 0x1A, 0xE6, 0x19, 0x0E, 0x1E, 0x94, 0x0E, + 0xD7, 0x09, 0x51, 0xF6, 0xAC, 0xED, 0x36, 0xE4, 0x76, 0xDC, 0x02, 0xE9, + 0x94, 0xD0, 0x01, 0xE9, 0x1E, 0xD5, 0xBD, 0xF1, 0x3E, 0xED, 0x4D, 0x10, + 0x50, 0x08, 0x2E, 0x25, 0x48, 0x0E, 0x1D, 0x1A, 0x11, 0x15, 0x0C, 0x1A, + 0xF1, 0x1C, 0x00, 0x20, 0xC3, 0x13, 0x49, 0x0F, 0x6D, 0x0B, 0xCB, 0x03, + 0x09, 0x07, 0x11, 0x09, 0x96, 0x07, 0xA6, 0x12, 0x9B, 0xFE, 0x41, 0x07, + 0xB2, 0xFA, 0x67, 0xFC, 0xCE, 0x01, 0x3F, 0xFD, 0x37, 0xEB, 0xF8, 0xEA, + 0x71, 0xD4, 0x0E, 0xE0, 0x6C, 0xEF, 0x10, 0xFC, 0x21, 0x04, 0x4E, 0x05, + 0xBE, 0xF3, 0x6A, 0xF1, 0x07, 0xF6, 0xCA, 0xFE, 0x86, 0x05, 0xA2, 0x17, + 0xA9, 0xF5, 0x9D, 0x05, 0xDD, 0xEB, 0x26, 0xF7, 0x16, 0x05, 0x87, 0x09, + 0xC2, 0x14, 0x4D, 0x14, 0x58, 0x12, 0xF9, 0x15, 0x3C, 0x12, 0x85, 0x17, + 0xD1, 0x07, 0xC9, 0x10, 0xC5, 0xF0, 0xCA, 0x05, 0x19, 0xD8, 0x09, 0xF2, + 0xC0, 0xC7, 0x02, 0xD6, 0x8F, 0xD2, 0x2F, 0xCF, 0x01, 0xEC, 0x44, 0xD8, + 0x82, 0x08, 0xC6, 0xEB, 0xE8, 0x17, 0x96, 0x00, 0x74, 0x1A, 0xCA, 0x0E, + 0xD5, 0x1D, 0xD9, 0x0E, 0xF8, 0x1B, 0x80, 0x02, 0x38, 0x13, 0xE2, 0xFB, + 0x8A, 0x00, 0xE3, 0xF4, 0x2E, 0xFA, 0x48, 0xF9, 0xDF, 0x01, 0xE7, 0xFB, + 0x50, 0x01, 0x4C, 0xF0, 0x1E, 0xFD, 0xE0, 0xEE, 0xD5, 0xF6, 0xA3, 0xEF, + 0xE9, 0xF0, 0x47, 0xE9, 0x02, 0x02, 0x72, 0xFA, 0x4C, 0x19, 0x6F, 0x0D, + 0x4F, 0x19, 0xB1, 0x02, 0x11, 0x12, 0xEF, 0xFB, 0x38, 0x0D, 0x08, 0x0D, + 0xF8, 0xF3, 0xA3, 0x08, 0xA4, 0xD9, 0x4E, 0xF0, 0xDD, 0xDF, 0x56, 0xF4, + 0xD3, 0xF1, 0x61, 0x06, 0xA6, 0xFB, 0xB4, 0x12, 0xCE, 0xFE, 0xFA, 0x15, + 0xAA, 0xFF, 0x51, 0x10, 0xDF, 0xF7, 0x3A, 0x01, 0xEF, 0xDC, 0xE3, 0xE3, + 0x5F, 0xC6, 0xD8, 0xCE, 0x23, 0xD6, 0x18, 0xDC, 0x63, 0xF8, 0xD4, 0xF1, + 0xA0, 0x13, 0xDE, 0x0B, 0x7E, 0x25, 0xEA, 0x2A, 0x40, 0x29, 0x19, 0x2B, + 0x5C, 0x1B, 0xF3, 0x0B, 0x32, 0x11, 0xA0, 0xF9, 0x31, 0x0B, 0xB8, 0xF9, + 0xA3, 0xF6, 0xD1, 0xF1, 0x6B, 0xF8, 0x9B, 0x01, 0x1F, 0x0E, 0x5C, 0x18, + 0xDA, 0x11, 0x2E, 0x0C, 0x41, 0x07, 0xC4, 0xFE, 0xBC, 0xF6, 0x04, 0x01, + 0x09, 0xE7, 0xB0, 0xFD, 0xA0, 0xF9, 0x99, 0x0D, 0x22, 0x12, 0x5C, 0x1C, + 0x73, 0x04, 0x8A, 0x07, 0xE8, 0xF5, 0xF4, 0xFD, 0xC9, 0xFA, 0x48, 0x05, + 0xAF, 0xF6, 0xCE, 0xFC, 0x1F, 0xF0, 0x1A, 0xF4, 0x64, 0x00, 0xAB, 0x02, + 0xFD, 0x10, 0x41, 0x11, 0x74, 0x0B, 0x67, 0x08, 0x75, 0x08, 0xDA, 0xF9, + 0x12, 0x11, 0x9D, 0xEF, 0x48, 0x05, 0xC0, 0xE6, 0x07, 0xE1, 0x62, 0xDD, + 0xC7, 0xCE, 0xFC, 0xD3, 0xC2, 0xE1, 0xAA, 0xDB, 0xAF, 0xEB, 0xDE, 0xE4, + 0x88, 0xF4, 0x1E, 0xF2, 0xFF, 0x0A, 0x61, 0x0D, 0x80, 0x16, 0x9C, 0x1E, + 0xD2, 0x19, 0xFC, 0x17, 0x8C, 0x1C, 0x14, 0x08, 0xCA, 0x19, 0x70, 0x07, + 0xED, 0x04, 0x98, 0x10, 0x24, 0xFE, 0x13, 0x1D, 0xDC, 0x13, 0x18, 0x2A, + 0x66, 0x25, 0x37, 0x29, 0x68, 0x26, 0xAD, 0x1A, 0x84, 0x14, 0xA8, 0x04, + 0x94, 0xF0, 0x6B, 0xE4, 0xE8, 0xEC, 0x9F, 0xDA, 0xB0, 0xFD, 0x65, 0xE2, + 0xAC, 0xEF, 0x65, 0xDB, 0x32, 0xE8, 0xD2, 0xE4, 0xC8, 0xF9, 0x2B, 0xFF, + 0xAD, 0xF9, 0xF7, 0xF8, 0x09, 0xED, 0xCC, 0xE9, 0x2C, 0xFD, 0x4F, 0xFE, + 0xCA, 0x11, 0x4E, 0x1A, 0x1B, 0x17, 0x3A, 0x21, 0x72, 0x21, 0x15, 0x20, + 0x51, 0x22, 0x0D, 0x1E, 0x78, 0xFF, 0xDE, 0x0B, 0xA5, 0xD0, 0xA3, 0xEA, + 0x37, 0xBB, 0x2D, 0xD0, 0x78, 0xC9, 0x01, 0xD4, 0x0D, 0xDE, 0x81, 0xEB, + 0xC2, 0xE9, 0x16, 0x03, 0xA0, 0xFE, 0xE8, 0x17, 0x53, 0x14, 0x00, 0x27, + 0x5C, 0x16, 0x58, 0x20, 0x3C, 0x11, 0xD3, 0x12, 0xB7, 0x15, 0x69, 0x1A, + 0xE7, 0x07, 0x15, 0x21, 0x7E, 0xF9, 0xEB, 0x25, 0xE3, 0x08, 0x72, 0x24, + 0x7D, 0x16, 0x95, 0x0F, 0x2D, 0x08, 0xB9, 0xF5, 0xB1, 0xED, 0xD4, 0xD9, + 0xAE, 0xDC, 0xFF, 0xC2, 0x0E, 0xE1, 0xF7, 0xCD, 0xA8, 0xEA, 0xB9, 0xE1, + 0x63, 0xEA, 0x1A, 0xD8, 0xE3, 0xF4, 0x22, 0xD2, 0x0E, 0x04, 0xED, 0xE4, + 0x38, 0x05, 0x8F, 0xE9, 0xD5, 0x09, 0xB6, 0xE0, 0x82, 0x17, 0x32, 0xED, + 0xE7, 0x19, 0xF0, 0xFB, 0x76, 0x17, 0x69, 0x00, 0xC2, 0x18, 0xC5, 0x09, + 0x51, 0x13, 0x39, 0x12, 0xD1, 0xFF, 0x0F, 0x0C, 0x76, 0xD9, 0xDF, 0xF0, + 0xB9, 0xBC, 0xC5, 0xD7, 0xC2, 0xC7, 0x05, 0xD8, 0x8F, 0xDA, 0x77, 0xE0, + 0xCB, 0xEB, 0x84, 0xF7, 0x9D, 0x0F, 0x7F, 0x25, 0x77, 0x2D, 0x59, 0x44, + 0x8A, 0x25, 0x0B, 0x38, 0x58, 0x1A, 0xE4, 0x23, 0xFF, 0x16, 0xB2, 0x1D, + 0x74, 0xFC, 0x44, 0x14, 0x8C, 0xF9, 0xA6, 0x21, 0x63, 0x16, 0x33, 0x3A, + 0x80, 0x22, 0x6C, 0x34, 0x6B, 0x17, 0x1B, 0x26, 0x26, 0xFE, 0x47, 0x17, + 0x5F, 0xDD, 0xA4, 0xF8, 0x8A, 0xDF, 0x9F, 0xF5, 0x4D, 0xFB, 0x46, 0x01, + 0x78, 0xFD, 0x84, 0xED, 0xFA, 0xFF, 0x24, 0xF1, 0xF4, 0x0B, 0x83, 0x0C, + 0x37, 0xF4, 0xED, 0xFA, 0x3E, 0xDC, 0xD2, 0xE4, 0x4A, 0xEF, 0x7F, 0xF6, + 0x77, 0x00, 0x35, 0x07, 0x78, 0x07, 0x4B, 0x01, 0x13, 0x1A, 0x34, 0xFE, + 0xB6, 0x20, 0xE9, 0xF9, 0x9B, 0x02, 0x34, 0xDD, 0x5F, 0xE2, 0x12, 0xC4, + 0x4E, 0xE5, 0x42, 0xCB, 0xFB, 0xED, 0x91, 0xDC, 0x9F, 0xEC, 0xF2, 0xE5, + 0x2D, 0x00, 0x9F, 0xFC, 0xE1, 0x0D, 0xC4, 0x10, 0x3D, 0x02, 0xBD, 0x09, + 0xDB, 0x00, 0xF3, 0xF3, 0x64, 0x1A, 0x73, 0xF1, 0x46, 0x23, 0xA5, 0x04, + 0x9F, 0x06, 0x6B, 0x17, 0x14, 0x07, 0x05, 0x2D, 0xDC, 0x1D, 0xEA, 0x33, + 0x62, 0x15, 0x46, 0x19, 0xDD, 0x04, 0xEB, 0xFF, 0xDA, 0xFD, 0x52, 0xFC, + 0x60, 0xF3, 0x51, 0xF8, 0x53, 0xF8, 0x32, 0x00, 0x1F, 0xFF, 0x8B, 0x05, + 0x2C, 0xEF, 0x43, 0xF2, 0x08, 0xE7, 0x0B, 0xED, 0x2F, 0xEF, 0xA9, 0xF3, + 0x54, 0xED, 0xE2, 0xE2, 0x7B, 0xED, 0x6E, 0xE1, 0x3F, 0x02, 0xB2, 0xF9, + 0x9B, 0x0F, 0x9E, 0xF8, 0x2D, 0x12, 0x27, 0xF2, 0x37, 0x1D, 0x8A, 0x03, + 0x17, 0x1B, 0xF2, 0x08, 0x39, 0x0A, 0xBE, 0x07, 0x01, 0xF7, 0x19, 0x0C, + 0xCF, 0xEA, 0x5D, 0x04, 0xDC, 0xF1, 0xF5, 0xF7, 0xEA, 0x09, 0x15, 0xFC, + 0x96, 0x25, 0x75, 0x1C, 0x83, 0x33, 0x70, 0x3B, 0x3E, 0x44, 0x48, 0x52, + 0x29, 0x53, 0x66, 0x5F, 0x47, 0x55, 0x77, 0x5B, 0x47, 0x4E, 0xD5, 0x51, + 0xB2, 0x49, 0x79, 0x51, 0x74, 0x4B, 0x96, 0x56, 0xA7, 0x52, 0x36, 0x59, + 0xBD, 0x5F, 0x76, 0x61, 0x7B, 0x4D, 0x85, 0x49, 0x3B, 0x29, 0xAD, 0x20, + 0x89, 0x32, 0x95, 0x35, 0xB5, 0x4F, 0x34, 0x5D, 0x79, 0x30, 0x04, 0x38, + 0x21, 0x09, 0x7C, 0x0A, 0xD4, 0x07, 0x88, 0x06, 0xA7, 0xF6, 0x90, 0xEA, + 0x96, 0xD6, 0xF1, 0xBE, 0x4B, 0xC9, 0x8A, 0xA9, 0x5B, 0xD6, 0x4D, 0xB5, + 0xB0, 0xD3, 0x49, 0xBA, 0x50, 0xC5, 0xEA, 0xBE, 0x51, 0xCD, 0x1D, 0xD4, + 0x3F, 0xC3, 0x84, 0xC1, 0x03, 0xAD, 0xC6, 0xB1, 0xCA, 0xA9, 0x6E, 0xB9, + 0xD2, 0xAE, 0x39, 0xAC, 0xF6, 0xAA, 0xC8, 0xA3, 0xC6, 0xB8, 0x14, 0xC6, + 0x75, 0xDC, 0xBA, 0xEC, 0xF6, 0xD7, 0xE6, 0xE3, 0x11, 0xC6, 0x32, 0xD3, + 0x05, 0xC8, 0x7B, 0xD1, 0x3A, 0xCD, 0xDB, 0xCE, 0x1E, 0xD9, 0x69, 0xDF, + 0x24, 0xF2, 0x53, 0x03, 0xF0, 0x17, 0x9A, 0x27, 0x69, 0x46, 0x66, 0x4F, + 0xD2, 0x4C, 0x3B, 0x48, 0xDE, 0x2E, 0x5E, 0x1B, 0x39, 0x25, 0x9B, 0x0C, + 0x87, 0x1B, 0xA1, 0x11, 0xAD, 0x19, 0x7E, 0x19, 0x49, 0x33, 0xD0, 0x26, + 0x5F, 0x51, 0x2E, 0x3B, 0x78, 0x59, 0xAA, 0x3A, 0x8A, 0x46, 0x08, 0x1B, + 0xE1, 0x2E, 0xF8, 0x12, 0x88, 0x25, 0xE3, 0x1E, 0x50, 0x29, 0xE9, 0x1E, + 0xC7, 0x3C, 0x4A, 0x30, 0xEC, 0x43, 0xCC, 0x32, 0x38, 0x29, 0x0F, 0x0F, + 0x1D, 0x0D, 0x45, 0xF3, 0xEE, 0xEE, 0x55, 0xE9, 0xF8, 0xCC, 0x88, 0xD5, + 0x2F, 0xB1, 0x23, 0xB4, 0x65, 0xBB, 0x35, 0xBA, 0x21, 0xD3, 0x98, 0xD1, + 0x1A, 0xB8, 0x57, 0xB5, 0xC0, 0xA9, 0xD2, 0xA6, 0xDA, 0xAD, 0x3B, 0xAE, + 0x01, 0xA2, 0x1F, 0xA3, 0x24, 0xAB, 0x28, 0xB4, 0x16, 0xB9, 0x87, 0xCD, + 0x68, 0xB6, 0x2B, 0xC3, 0xAA, 0xB6, 0x04, 0xBC, 0xA6, 0xBA, 0xC9, 0xC1, + 0xBD, 0xB2, 0xD8, 0xB5, 0x3E, 0xAD, 0x9F, 0xAC, 0x21, 0xC8, 0x62, 0xBC, + 0xC3, 0xF3, 0x47, 0xDF, 0xC6, 0x09, 0x6A, 0xFD, 0x0A, 0x09, 0x06, 0xFF, + 0xF4, 0x0D, 0x94, 0xFD, 0xE7, 0x12, 0x71, 0x07, 0x47, 0xFF, 0x2A, 0x00, + 0x16, 0xFB, 0x2F, 0x05, 0xCF, 0x0C, 0xFF, 0x1F, 0x52, 0x11, 0x94, 0x27, + 0x74, 0x2C, 0x99, 0x30, 0xB5, 0x44, 0xB7, 0x35, 0xFC, 0x37, 0xAC, 0x2C, + 0x20, 0x21, 0x09, 0x2B, 0x7B, 0x07, 0x74, 0x18, 0x8A, 0xF6, 0xAB, 0xFB, + 0x02, 0xE8, 0x58, 0xF1, 0x04, 0xDC, 0x81, 0xE5, 0x47, 0xDE, 0x1D, 0xE4, + 0x2E, 0xE1, 0x20, 0xF5, 0x02, 0xD6, 0x3A, 0xEA, 0xE7, 0xBB, 0x51, 0xC3, + 0x70, 0xB0, 0xB2, 0xB5, 0xF0, 0xB7, 0x9C, 0xBA, 0xE3, 0xBC, 0x98, 0xB5, + 0xAD, 0xCD, 0xD4, 0xC1, 0x19, 0xDE, 0xDB, 0xDA, 0x7A, 0xE4, 0x88, 0xE5, + 0xCF, 0xE0, 0x38, 0xDD, 0xCE, 0xCE, 0x45, 0xBF, 0xF7, 0xD2, 0x19, 0xB3, + 0xE7, 0xE8, 0x62, 0xC9, 0x31, 0xE7, 0xDF, 0xD8, 0x41, 0xD7, 0xBC, 0xD0, + 0x6A, 0xEE, 0x11, 0xD9, 0xB1, 0x1A, 0xDA, 0xF9, 0x3C, 0x14, 0x59, 0xF8, + 0x32, 0xF9, 0x7F, 0xEA, 0xBA, 0xFC, 0x5C, 0x03, 0xA7, 0x05, 0x3D, 0x16, + 0xB9, 0x0B, 0xCA, 0x13, 0x62, 0x1D, 0x57, 0x20, 0x1B, 0x30, 0xD3, 0x31, + 0x78, 0x2D, 0x07, 0x39, 0xF4, 0x1D, 0x51, 0x40, 0x5A, 0x08, 0x46, 0x32, + 0x5B, 0x04, 0xB2, 0x25, 0x83, 0x1B, 0xF4, 0x38, 0x3B, 0x27, 0xAF, 0x40, + 0xE2, 0x31, 0x2F, 0x3E, 0x27, 0x44, 0xBA, 0x40, 0x90, 0x41, 0xEF, 0x3D, + 0x26, 0x32, 0xC9, 0x3A, 0x0E, 0x28, 0x5B, 0x33, 0x43, 0x22, 0x65, 0x26, + 0x36, 0x25, 0x27, 0x22, 0xA8, 0x34, 0xD5, 0x1C, 0x68, 0x50, 0xE9, 0x1D, + 0x6A, 0x57, 0xE1, 0x25, 0xAE, 0x53, 0xC9, 0x2F, 0xB3, 0x5B, 0x20, 0x48, + 0x75, 0x56, 0xF0, 0x56, 0x88, 0x4E, 0xB8, 0x5B, 0x1C, 0x54, 0x28, 0x64, + 0x82, 0x48, 0x5D, 0x56, 0xA5, 0x2F, 0x19, 0x37, 0x81, 0x36, 0xFC, 0x3D, + 0x2E, 0x4A, 0xAE, 0x58, 0x3B, 0x51, 0xFE, 0x5D, 0xCD, 0x5A, 0xBD, 0x61, + 0xAD, 0x62, 0xBF, 0x62, 0x43, 0x61, 0x3C, 0x5C, 0xEB, 0x60, 0x41, 0x5C, + 0xEC, 0x58, 0xF1, 0x5B, 0x13, 0x47, 0x0C, 0x51, 0x77, 0x3B, 0x91, 0x40, + 0xFA, 0x42, 0x8C, 0x3D, 0x5C, 0x51, 0x1B, 0x41, 0xF2, 0x49, 0x03, 0x2E, + 0x7A, 0x3E, 0x5B, 0x19, 0xFE, 0x40, 0x4E, 0x16, 0x45, 0x3B, 0x8E, 0x0D, + 0x71, 0x3C, 0xC1, 0x0F, 0x6E, 0x47, 0x2F, 0x27, 0xC8, 0x46, 0xDB, 0x34, + 0xAF, 0x45, 0x7B, 0x3B, 0x68, 0x4A, 0x69, 0x40, 0x78, 0x3E, 0x38, 0x39, + 0x59, 0x1A, 0x96, 0x27, 0xE7, 0x0B, 0x67, 0x1D, 0xA4, 0x19, 0x68, 0x1E, + 0x5E, 0x17, 0x6D, 0x1A, 0xF2, 0x15, 0xF6, 0x13, 0x5A, 0x1C, 0xF0, 0x08, + 0x87, 0x0F, 0xF4, 0x00, 0x8F, 0xF5, 0x79, 0xFD, 0x70, 0xDD, 0x10, 0xF1, + 0x6C, 0xCE, 0x88, 0xE5, 0x7B, 0xCD, 0x7B, 0xED, 0xE9, 0xD7, 0xD0, 0xF5, + 0x5B, 0xD8, 0x3F, 0xE2, 0xDE, 0xE6, 0x20, 0xE4, 0xFB, 0xF1, 0xAD, 0xF6, + 0xD4, 0xD4, 0xCA, 0xE5, 0xED, 0xC2, 0x4E, 0xD3, 0x55, 0xC6, 0xA4, 0xD1, + 0x36, 0xD2, 0x6E, 0xD5, 0xCD, 0xE9, 0x17, 0xE4, 0xAB, 0xF3, 0x07, 0xF5, + 0xDA, 0xE9, 0xFF, 0xF2, 0x11, 0xE2, 0x55, 0xE3, 0xBD, 0xDC, 0x34, 0xD3, + 0x12, 0xD9, 0x19, 0xCB, 0x22, 0xD2, 0x4F, 0xC7, 0x0A, 0xCA, 0x60, 0xC7, + 0x3F, 0xBC, 0x65, 0xC4, 0x97, 0xB8, 0x11, 0xC2, 0x67, 0xBB, 0xE3, 0xBD, + 0x3F, 0xB1, 0x82, 0xB2, 0x3D, 0xAF, 0xCB, 0xB2, 0x43, 0xAC, 0x04, 0xB3, + 0xDB, 0xA7, 0x64, 0xB0, 0x78, 0xAA, 0x10, 0xB1, 0x90, 0xA7, 0xC3, 0xA7, + 0x2E, 0xA5, 0x63, 0x9F, 0x4C, 0xAE, 0x61, 0xA8, 0xDB, 0xC6, 0x70, 0xBB, + 0x6A, 0xE2, 0x3B, 0xCB, 0x3A, 0xED, 0xE9, 0xD2, 0x30, 0xEB, 0xDA, 0xDB, + 0x5A, 0xF7, 0x59, 0xEA, 0x33, 0x08, 0x5B, 0xE8, 0x03, 0x0A, 0xC8, 0xDE, + 0xE3, 0x09, 0x60, 0xE7, 0x0B, 0x05, 0xA7, 0xF1, 0x8A, 0xFF, 0xDA, 0xFD, + 0x63, 0x10, 0xA6, 0x17, 0x17, 0x2A, 0x9E, 0x26, 0x7C, 0x29, 0x8B, 0x20, + 0x07, 0x2C, 0x41, 0x2C, 0xEF, 0x3D, 0x41, 0x40, 0x53, 0x35, 0xB3, 0x2E, + 0xF7, 0x26, 0xC7, 0x21, 0x9A, 0x2D, 0x35, 0x34, 0x8D, 0x25, 0x10, 0x38, + 0x4B, 0x15, 0x90, 0x29, 0x30, 0x16, 0xE3, 0x1D, 0x73, 0x0A, 0x1A, 0x0F, + 0xAA, 0xF6, 0x38, 0x08, 0xAC, 0xF3, 0xC4, 0x10, 0xE3, 0xF1, 0x28, 0x11, + 0x7A, 0xEF, 0x58, 0x0B, 0xBF, 0x01, 0x81, 0x0D, 0x7F, 0x1A, 0xD4, 0x10, + 0xFC, 0x1B, 0xFE, 0x12, 0x1C, 0x14, 0xCE, 0x16, 0x2E, 0x15, 0x59, 0x13, + 0xD9, 0x16, 0x79, 0x08, 0x94, 0x1D, 0x6D, 0x0F, 0xA3, 0x18, 0x45, 0x11, + 0xEE, 0x0E, 0x51, 0xFF, 0x55, 0x17, 0xD4, 0xF4, 0x61, 0x2B, 0x8F, 0xFD, + 0xD0, 0x34, 0xE2, 0x14, 0x53, 0x2A, 0x5F, 0x2B, 0x96, 0x24, 0x83, 0x35, + 0x64, 0x21, 0x83, 0x1F, 0xF7, 0x16, 0xFD, 0xFD, 0x5C, 0x12, 0xB7, 0xFB, + 0x46, 0x18, 0xED, 0x0A, 0xFE, 0x16, 0xE4, 0x08, 0xB4, 0x0E, 0xD0, 0xFE, + 0x2F, 0x0E, 0xF7, 0x04, 0x41, 0x0B, 0x15, 0x11, 0x16, 0x05, 0x95, 0x1A, + 0x88, 0x03, 0xF2, 0x18, 0x67, 0xFB, 0x35, 0x04, 0xFA, 0x02, 0xDF, 0xFE, + 0x91, 0x11, 0x04, 0x08, 0x73, 0x07, 0x22, 0x05, 0x64, 0xFB, 0xF9, 0x04, + 0xF7, 0xF3, 0x5F, 0x01, 0x79, 0xE6, 0xC4, 0xEF, 0x08, 0xE4, 0xC9, 0xED, + 0x07, 0xEB, 0x15, 0xF1, 0x4E, 0xDD, 0xC8, 0xD6, 0x6A, 0xC9, 0x70, 0xB9, + 0x02, 0xD0, 0x6B, 0xC0, 0xDD, 0xE1, 0x4E, 0xDB, 0xD0, 0xDB, 0x44, 0xDE, + 0x99, 0xCE, 0xB8, 0xCA, 0xCF, 0xD8, 0x5F, 0xC1, 0x5B, 0xEA, 0x1D, 0xC8, + 0x28, 0xDD, 0x26, 0xC1, 0xDB, 0xC6, 0x96, 0xB4, 0x81, 0xD2, 0x80, 0xCA, + 0x37, 0xEA, 0x23, 0xEC, 0x39, 0xF6, 0xA7, 0xFF, 0xEF, 0xFC, 0xF0, 0x15, + 0xED, 0xFE, 0xA2, 0x25, 0x6F, 0xFB, 0xAB, 0x20, 0x05, 0x0D, 0xD5, 0x24, + 0x40, 0x24, 0x4C, 0x2E, 0xB8, 0x1C, 0x86, 0x24, 0x67, 0x09, 0x72, 0x22, + 0xB6, 0xF9, 0x83, 0x26, 0x1B, 0x01, 0x4A, 0x2B, 0x0C, 0x0E, 0x4B, 0x24, + 0xB0, 0xFC, 0xDE, 0x00, 0xC2, 0xEF, 0x95, 0xED, 0x57, 0xE7, 0x17, 0xE9, + 0x9B, 0xD0, 0xCF, 0xD3, 0xB6, 0xBF, 0xB4, 0xBC, 0xC6, 0xB2, 0x4C, 0xB0, + 0x9C, 0xA9, 0x1E, 0xAE, 0x83, 0xB5, 0x3F, 0xB6, 0x0F, 0xC7, 0xAA, 0xBB, + 0x7D, 0xC3, 0x76, 0xBE, 0x32, 0xBD, 0xE2, 0xC8, 0x53, 0xC1, 0xE9, 0xCD, + 0xD0, 0xCC, 0xA6, 0xD2, 0x00, 0xDB, 0x17, 0xDE, 0x1D, 0xDA, 0x5D, 0xD5, + 0x01, 0xD7, 0x85, 0xD1, 0x4A, 0xD3, 0x1E, 0xDF, 0x19, 0xC1, 0x7A, 0xDA, + 0xAF, 0xBD, 0x64, 0xD9, 0x58, 0xC4, 0x85, 0xE7, 0xF0, 0xC9, 0x9D, 0xF7, + 0xA8, 0xD6, 0x7A, 0x07, 0x57, 0xE9, 0xE2, 0x1A, 0xF1, 0x01, 0x69, 0x2B, + 0x6D, 0x0F, 0xDD, 0x29, 0x51, 0x1A, 0x78, 0x2E, 0x6B, 0x1D, 0xE4, 0x35, + 0xE2, 0x18, 0xC2, 0x31, 0xEE, 0x0F, 0xF7, 0x2A, 0x8A, 0xFA, 0x0D, 0x1A, + 0x76, 0xEC, 0x4C, 0x05, 0x05, 0xEB, 0x79, 0xF8, 0x9A, 0xE4, 0x19, 0xEB, + 0xAD, 0xE5, 0x2A, 0xDB, 0x99, 0xF7, 0x73, 0xD2, 0x28, 0x0A, 0xBA, 0xD9, + 0x1D, 0x18, 0x95, 0xEA, 0x48, 0x12, 0x0C, 0xEA, 0x50, 0x09, 0x2C, 0xE6, + 0x49, 0x01, 0x92, 0xE4, 0xD0, 0xE6, 0xBB, 0xD2, 0x9F, 0xCE, 0xFD, 0xC8, + 0x74, 0xC3, 0xE4, 0xC6, 0x40, 0xB6, 0x80, 0xB7, 0xC1, 0xB0, 0xF6, 0xAE, + 0x56, 0xB4, 0x9E, 0xB7, 0x3C, 0xB0, 0x43, 0xBA, 0x88, 0xA4, 0xC5, 0xAE, + 0x33, 0xA2, 0xA7, 0xA2, 0xB3, 0xAF, 0xA1, 0xA2, 0xFF, 0xC1, 0xBC, 0xB1, + 0xBF, 0xD9, 0x47, 0xCE, 0x24, 0xE7, 0xFE, 0xDA, 0xD8, 0xEB, 0x38, 0xD6, + 0x86, 0xF3, 0x63, 0xDA, 0xE6, 0xE7, 0x1B, 0xD8, 0xD8, 0xDB, 0x00, 0xDE, + 0x66, 0xF6, 0x44, 0x03, 0xA2, 0x13, 0xD7, 0x1E, 0xF1, 0x1B, 0x81, 0x21, + 0x7B, 0x2A, 0xB2, 0x2B, 0x9B, 0x31, 0x11, 0x29, 0x71, 0x27, 0x48, 0x16, + 0x48, 0x2D, 0x84, 0x1E, 0xD5, 0x2E, 0x30, 0x23, 0xC1, 0x28, 0x27, 0x1B, + 0x7F, 0x2E, 0x1E, 0x1C, 0xA6, 0x2A, 0x2F, 0x0C, 0xEE, 0x23, 0xC0, 0xF7, + 0x6E, 0x12, 0x46, 0xEB, 0x31, 0xFB, 0x3A, 0xE6, 0xF3, 0xF3, 0xB1, 0xF0, + 0xA3, 0xDD, 0x1F, 0xEB, 0x77, 0xC8, 0xD2, 0xE0, 0xB2, 0xCD, 0xBF, 0xE0, + 0x3D, 0xCD, 0x19, 0xDE, 0x3A, 0xD4, 0xC2, 0xE9, 0xF6, 0xE8, 0x37, 0xF6, + 0xAE, 0xEE, 0x2E, 0xEF, 0x0D, 0xF5, 0x91, 0xF2, 0xF2, 0x0B, 0xD1, 0x04, + 0x79, 0x1C, 0x93, 0x0F, 0xEE, 0x1B, 0x0D, 0x13, 0xDA, 0x2C, 0xB6, 0x1F, + 0x87, 0x50, 0x3D, 0x37, 0x7F, 0x53, 0x14, 0x40, 0xD4, 0x43, 0x88, 0x45, + 0x4B, 0x43, 0xAF, 0x53, 0xF7, 0x31, 0xB5, 0x4F, 0x39, 0x29, 0x36, 0x4B, + 0x76, 0x4C, 0x85, 0x5E, 0xE0, 0x5D, 0xFF, 0x5C, 0x1F, 0x51, 0xAC, 0x46, + 0x9B, 0x5B, 0x65, 0x4B, 0x88, 0x59, 0x6A, 0x4D, 0x59, 0x42, 0xC9, 0x4A, + 0x82, 0x41, 0x00, 0x5A, 0x16, 0x3F, 0xD3, 0x53, 0x39, 0x3B, 0xFC, 0x3A, + 0xFF, 0x52, 0xD6, 0x2E, 0xE1, 0x61, 0x35, 0x1E, 0xC7, 0x47, 0xBA, 0x07, + 0x9B, 0x35, 0xED, 0x0C, 0x43, 0x3F, 0x27, 0x22, 0xA8, 0x43, 0xF4, 0x2B, + 0x55, 0x3D, 0x16, 0x30, 0xEB, 0x3E, 0xE6, 0x31, 0x80, 0x35, 0xEC, 0x26, + 0x7B, 0x1F, 0x47, 0x22, 0xB6, 0x21, 0xC5, 0x39, 0x68, 0x2C, 0x3C, 0x50, + 0x0E, 0x30, 0xFB, 0x57, 0xFF, 0x42, 0xEC, 0x5B, 0x6F, 0x43, 0xF4, 0x3F, + 0x90, 0x29, 0x96, 0x15, 0xE8, 0x24, 0x64, 0x14, 0xA5, 0x1F, 0x0C, 0x29, + 0x7B, 0x11, 0xEA, 0x3B, 0xD1, 0x14, 0xA6, 0x4A, 0xE5, 0x28, 0x32, 0x4E, + 0xE2, 0x35, 0xCE, 0x47, 0x95, 0x2A, 0x8F, 0x2E, 0x29, 0x1D, 0xC8, 0x15, + 0xEE, 0x14, 0xFC, 0x0B, 0x66, 0x0B, 0x10, 0x0E, 0x9B, 0x00, 0xF2, 0x1F, + 0x62, 0xF7, 0x0A, 0x2E, 0xA7, 0xFF, 0x51, 0x2A, 0xD5, 0x0B, 0xEE, 0x1E, + 0xC0, 0x14, 0x7F, 0x26, 0x22, 0x0F, 0xED, 0x22, 0x7F, 0x05, 0x82, 0x0F, + 0x9C, 0x12, 0x3A, 0x0D, 0x66, 0x29, 0x14, 0x10, 0x6E, 0x35, 0x17, 0x0B, + 0x9F, 0x2B, 0xB3, 0xFF, 0x07, 0x21, 0x19, 0xFA, 0x16, 0x12, 0x76, 0xEF, + 0xA6, 0x10, 0x82, 0xFD, 0xCF, 0x23, 0x20, 0x1C, 0x93, 0x2A, 0x25, 0x17, + 0x34, 0x3B, 0x32, 0x14, 0x8B, 0x4B, 0xE6, 0x17, 0x5D, 0x39, 0x26, 0x00, + 0x1C, 0x2D, 0xCE, 0xF7, 0xDF, 0x21, 0x7D, 0xFB, 0x74, 0x11, 0x68, 0xF5, + 0x68, 0x10, 0x33, 0xF1, 0x52, 0x00, 0xA5, 0xE6, 0x54, 0xE2, 0x20, 0xD7, + 0x84, 0xCA, 0xDE, 0xC1, 0xCA, 0xD4, 0x24, 0xC6, 0xA6, 0xFF, 0x8E, 0xEB, + 0x2A, 0x0F, 0x64, 0xF3, 0x8B, 0x01, 0xB8, 0xE4, 0xDD, 0x03, 0xCD, 0xF2, + 0x65, 0xF6, 0xD0, 0xEC, 0xB3, 0xE4, 0x6A, 0xDA, 0x1A, 0xF6, 0x63, 0xF1, + 0x1C, 0xFB, 0x32, 0xFD, 0x51, 0xF3, 0xDC, 0xF4, 0x3F, 0xFC, 0x5A, 0xFF, + 0xE9, 0x01, 0xA7, 0x04, 0xD0, 0xF4, 0x82, 0xF9, 0xF7, 0xEF, 0x98, 0xFA, + 0x07, 0xF6, 0x41, 0x00, 0xB8, 0xF6, 0x49, 0xFF, 0xF8, 0xFF, 0x4E, 0x06, + 0x1A, 0x19, 0x69, 0x16, 0x11, 0x27, 0xF5, 0x18, 0xF8, 0x1C, 0xEE, 0x10, + 0x30, 0x1A, 0x97, 0x1C, 0x9A, 0x12, 0xEF, 0x25, 0xF8, 0xFB, 0x09, 0x1D, + 0xB7, 0xF3, 0xED, 0x17, 0x3B, 0x01, 0xDB, 0x1C, 0x53, 0x13, 0xA6, 0x1D, + 0x2C, 0x12, 0x0F, 0x0B, 0x75, 0xFE, 0x60, 0xFD, 0xBE, 0xE7, 0x94, 0xFF, + 0x2C, 0xDE, 0x1E, 0xFE, 0x7E, 0xEA, 0xA1, 0xFD, 0xA6, 0xFD, 0x49, 0xFE, + 0xDE, 0x07, 0x7B, 0x02, 0x7A, 0x05, 0xA3, 0x0F, 0x21, 0xE9, 0xEF, 0x05, + 0xB9, 0xD2, 0x30, 0xF8, 0xB3, 0xCE, 0x08, 0xF8, 0xC8, 0xC7, 0xF3, 0xEE, + 0xA4, 0xD2, 0x5A, 0xEF, 0xCD, 0xE5, 0x27, 0x00, 0x03, 0xE5, 0xB6, 0x03, + 0xD6, 0xE6, 0xA2, 0xFE, 0xC9, 0xE7, 0x1D, 0xFD, 0x48, 0xD5, 0xB7, 0xE5, + 0xF5, 0xCA, 0xAD, 0xBE, 0x61, 0xDB, 0x3D, 0xB7, 0x17, 0xE7, 0xBB, 0xC6, + 0x6E, 0xDB, 0xC2, 0xCC, 0x40, 0xD4, 0xC9, 0xDC, 0x4B, 0xD2, 0x18, 0xEF, + 0xB2, 0xC0, 0xA4, 0xDD, 0x1C, 0xBA, 0x14, 0xC9, 0xCF, 0xC5, 0x87, 0xCA, + 0x43, 0xC8, 0xC1, 0xC9, 0x3B, 0xD6, 0x9B, 0xD5, 0x9B, 0xE2, 0xDF, 0xE2, + 0xCB, 0xD0, 0x2C, 0xD1, 0x99, 0xBA, 0xC0, 0xC0, 0x6A, 0xB4, 0x6E, 0xCE, + 0x4C, 0xB1, 0xDD, 0xE4, 0x52, 0xAD, 0x72, 0xF2, 0xA9, 0xC2, 0xEC, 0x01, + 0xE5, 0xD6, 0x10, 0x0C, 0x95, 0xCC, 0xA9, 0x04, 0x1E, 0xC6, 0x22, 0xFF, + 0x84, 0xC6, 0x23, 0xF7, 0x7E, 0xC4, 0x51, 0xE8, 0xE1, 0xCF, 0x3C, 0xEA, + 0xC6, 0xE4, 0xF2, 0xFD, 0x7B, 0xED, 0xED, 0x04, 0x47, 0xE0, 0x10, 0xED, + 0xF6, 0xD8, 0x02, 0xDD, 0x96, 0xE2, 0xAB, 0xE7, 0xA3, 0xE1, 0x92, 0xEA, + 0xF4, 0xE5, 0x84, 0xF3, 0xB2, 0xFD, 0xC0, 0x0B, 0xEB, 0x00, 0xF4, 0x00, + 0x74, 0xF5, 0x1B, 0xEC, 0x6F, 0xF1, 0xFD, 0xEB, 0x7A, 0xE5, 0x1F, 0xD7, + 0xD1, 0xE2, 0x4A, 0xC6, 0xD1, 0xE8, 0x95, 0xC6, 0xFD, 0xDF, 0x5B, 0xBC, + 0xC6, 0xDA, 0x0B, 0xBF, 0x4E, 0xDE, 0xA1, 0xCB, 0xD5, 0xCE, 0x91, 0xBC, + 0x65, 0xC4, 0xB8, 0xB1, 0xB5, 0xC3, 0x64, 0xB7, 0x71, 0xC0, 0xF7, 0xBB, + 0xE1, 0xC1, 0x43, 0xCE, 0x66, 0xB9, 0x9D, 0xD7, 0x76, 0xBC, 0xC8, 0xD0, + 0x47, 0xC1, 0x3D, 0xCA, 0xE3, 0xAF, 0xD8, 0xC5, 0xCC, 0xA5, 0xBD, 0xC0, + 0xD8, 0xAE, 0xD0, 0xBF, 0x4D, 0xC4, 0x9E, 0xD4, 0xF3, 0xDA, 0x60, 0xE8, + 0xFE, 0xE3, 0xE7, 0xE3, 0x80, 0xE3, 0x72, 0xE0, 0x44, 0xE3, 0x93, 0xEA, + 0xB6, 0xE1, 0xD5, 0xE6, 0x1E, 0xE2, 0x10, 0xDA, 0x2F, 0xEF, 0xB8, 0xE4, + 0x3C, 0xFD, 0xAE, 0xEF, 0xCE, 0xF6, 0x5E, 0xE1, 0xA4, 0xF7, 0x8F, 0xDE, + 0xA0, 0x0D, 0xF7, 0xF1, 0xDB, 0x17, 0x87, 0xF6, 0xC3, 0x1B, 0xEE, 0xFC, + 0x54, 0x14, 0xB9, 0x02, 0x4A, 0x07, 0xBA, 0xF2, 0xA5, 0x0D, 0x59, 0xF0, + 0x2F, 0xFC, 0x7A, 0xED, 0x56, 0xE4, 0x6C, 0xEA, 0x3B, 0xE4, 0xA8, 0xF1, + 0x44, 0xDC, 0x36, 0xED, 0xAF, 0xDF, 0x60, 0xF6, 0xB0, 0xE0, 0x7C, 0xF9, + 0x19, 0xD1, 0x9A, 0xEA, 0x36, 0xD0, 0xD2, 0xEF, 0xC2, 0xC8, 0x04, 0xEC, + 0xB3, 0xC7, 0xF2, 0xE5, 0xE5, 0xCC, 0x30, 0xEB, 0x13, 0xBC, 0xC5, 0xDA, + 0xFC, 0xBB, 0xB1, 0xCE, 0x5B, 0xCF, 0x4E, 0xD4, 0x68, 0xD7, 0xE0, 0xDA, + 0xA8, 0xD9, 0x4E, 0xE3, 0x95, 0xD4, 0x17, 0xEA, 0x0F, 0xC2, 0x13, 0xEF, + 0x08, 0xBD, 0xD3, 0xE9, 0x7A, 0xDA, 0x81, 0xE5, 0x63, 0xF2, 0x9F, 0xE4, + 0xAF, 0xF1, 0x75, 0xD9, 0x69, 0x02, 0xD4, 0xE1, 0xC3, 0x10, 0xEF, 0xED, + 0xBE, 0x0C, 0x48, 0xEC, 0x4C, 0x1B, 0x0B, 0x03, 0x07, 0x19, 0xB4, 0x13, + 0x23, 0xFF, 0xF1, 0x03, 0xF2, 0x02, 0x7F, 0xFD, 0x09, 0x02, 0x1E, 0xFA, + 0x85, 0xEC, 0xFC, 0xF7, 0xD3, 0xE6, 0xAC, 0x04, 0x91, 0xEF, 0xFC, 0x0B, + 0x56, 0x03, 0xF1, 0x06, 0x12, 0x13, 0xD1, 0xFF, 0xEA, 0x10, 0xB5, 0x0B, + 0x30, 0xFC, 0xB0, 0x0F, 0x25, 0xDE, 0x9A, 0xF4, 0x05, 0xD5, 0x75, 0xE0, + 0xF5, 0xD9, 0x50, 0xCF, 0x37, 0xD6, 0x9A, 0xB6, 0xEF, 0xD1, 0xE4, 0xAF, + 0x3C, 0xE7, 0x3D, 0xC3, 0x99, 0x13, 0x2C, 0xD7, 0xAF, 0x2D, 0x8D, 0xE5, + 0x48, 0x28, 0xE4, 0xF1, 0x6A, 0x1A, 0x57, 0xEE, 0x4F, 0x22, 0x10, 0xFA, + 0xFD, 0x35, 0x50, 0x14, 0x7D, 0x4B, 0xA9, 0x29, 0x85, 0x59, 0xB4, 0x3F, + 0x06, 0x5E, 0xE2, 0x52, 0xA5, 0x62, 0x86, 0x4F, 0xED, 0x5B, 0xF9, 0x3A, + 0x26, 0x5A, 0x28, 0x3F, 0x75, 0x58, 0x15, 0x47, 0xB3, 0x4C, 0x9C, 0x3C, + 0xA2, 0x44, 0x82, 0x37, 0x20, 0x51, 0x78, 0x42, 0xA0, 0x43, 0x54, 0x31, + 0x66, 0x17, 0xE9, 0x16, 0xFA, 0x11, 0x00, 0x23, 0x0B, 0x20, 0x2A, 0x26, + 0x77, 0x25, 0xCE, 0x16, 0x06, 0x36, 0xD0, 0x23, 0x44, 0x37, 0x98, 0x2C, + 0x9D, 0x17, 0x30, 0x0D, 0x35, 0x05, 0x9C, 0xF8, 0xFB, 0x08, 0x35, 0xF3, + 0xAD, 0x05, 0xF7, 0xD7, 0x37, 0xFF, 0x72, 0xC7, 0x43, 0x03, 0x54, 0xDC, + 0xF3, 0x01, 0xCE, 0xEA, 0x23, 0xFD, 0x60, 0xE1, 0x30, 0xF8, 0x07, 0xD5, + 0x96, 0xFB, 0x8E, 0xDA, 0x75, 0x05, 0xE4, 0xE0, 0xB5, 0x10, 0xC6, 0xE6, + 0x5D, 0x26, 0xA4, 0x08, 0x9E, 0x30, 0x23, 0x25, 0xA5, 0x1C, 0x2A, 0x1C, + 0xAD, 0x01, 0x78, 0x0C, 0x9B, 0xF9, 0xD3, 0x08, 0x26, 0x00, 0x21, 0x0B, + 0xC7, 0xFF, 0x6E, 0x0D, 0xF3, 0xF4, 0x8B, 0x0B, 0x24, 0xFE, 0x86, 0x0E, + 0xB0, 0x08, 0xFB, 0x0E, 0x8A, 0x04, 0xA9, 0x03, 0xEC, 0x08, 0xAE, 0xFC, + 0xF3, 0x16, 0x10, 0x0E, 0x20, 0x19, 0x6F, 0x21, 0x36, 0x0D, 0x77, 0x20, + 0xC6, 0x03, 0x4F, 0x17, 0x10, 0x05, 0x57, 0x14, 0xF1, 0x02, 0xBC, 0x0A, + 0xD8, 0xF8, 0x05, 0xF7, 0x08, 0x01, 0x1D, 0xF3, 0xF1, 0x03, 0x08, 0xEF, + 0x48, 0xFC, 0x37, 0xEA, 0xF8, 0xF1, 0x9C, 0xEB, 0xFA, 0xDB, 0xF4, 0xE2, + 0x5C, 0xE0, 0x81, 0xEC, 0x49, 0x03, 0xAA, 0x04, 0x52, 0x1F, 0x3E, 0x09, + 0x53, 0x2F, 0xA1, 0x06, 0xB9, 0x38, 0x52, 0x09, 0xD1, 0x3A, 0x3B, 0x10, + 0x90, 0x3C, 0xAB, 0x1E, 0xE3, 0x3B, 0xC5, 0x26, 0x1A, 0x3A, 0x10, 0x24, + 0x41, 0x38, 0x3E, 0x1E, 0x99, 0x31, 0xFD, 0x17, 0x1E, 0x29, 0x67, 0x12, + 0xCB, 0x1A, 0xEC, 0x09, 0x2C, 0x10, 0x28, 0x10, 0xEC, 0x19, 0xA7, 0x1E, + 0x1B, 0x29, 0x36, 0x1D, 0xEE, 0x3C, 0x55, 0x26, 0xDE, 0x3E, 0x7F, 0x2F, + 0xE2, 0x27, 0xF7, 0x27, 0x6B, 0x21, 0x89, 0x2B, 0xFD, 0x2B, 0x19, 0x2F, + 0xDA, 0x30, 0x89, 0x26, 0xEB, 0x24, 0xDA, 0x1A, 0xCD, 0x17, 0x24, 0x11, + 0x2C, 0x1E, 0xD1, 0x10, 0x53, 0x2A, 0xB8, 0x13, 0x6E, 0x2B, 0x80, 0x16, + 0xF3, 0x2D, 0x0A, 0x22, 0x3B, 0x34, 0x97, 0x32, 0xE3, 0x33, 0x2E, 0x39, + 0x18, 0x28, 0xDA, 0x35, 0xFF, 0x1D, 0x1B, 0x36, 0xE9, 0x20, 0xB2, 0x3A, + 0x1A, 0x2A, 0xC2, 0x3D, 0xB5, 0x32, 0x90, 0x39, 0x01, 0x35, 0xDF, 0x30, + 0xDB, 0x34, 0x74, 0x35, 0x64, 0x29, 0xB1, 0x39, 0x93, 0x25, 0xEC, 0x3A, + 0x7F, 0x33, 0xC4, 0x3D, 0xC4, 0x34, 0xAD, 0x35, 0x91, 0x1E, 0x30, 0x23, + 0xD8, 0x05, 0xF4, 0x09, 0x5F, 0x07, 0xB6, 0xFF, 0xED, 0x16, 0xF1, 0x02, + 0x0A, 0x17, 0xE1, 0xFB, 0xA2, 0x14, 0xF6, 0xFB, 0xE2, 0x14, 0xB2, 0x00, + 0xE3, 0x0E, 0xE6, 0xF0, 0x6D, 0x10, 0x41, 0xE7, 0x00, 0x17, 0xBA, 0xF6, + 0x48, 0x10, 0x6F, 0x02, 0x6C, 0x08, 0x71, 0x0C, 0xB0, 0x03, 0x1B, 0x1A, + 0x2A, 0xFA, 0x22, 0x15, 0xA3, 0xFE, 0x7E, 0x0D, 0x86, 0x06, 0xD0, 0x0A, + 0xC6, 0x0F, 0x5A, 0x0E, 0x78, 0x16, 0xF8, 0x1B, 0x8F, 0xFE, 0xFF, 0x19, + 0x26, 0xEA, 0x38, 0x1A, 0x0C, 0xFF, 0x03, 0x39, 0xE1, 0x11, 0xDE, 0x4C, + 0x50, 0x0E, 0x9B, 0x40, 0x72, 0x11, 0x4F, 0x35, 0xC5, 0x10, 0x64, 0x33, + 0x87, 0xFA, 0xF7, 0x2E, 0x54, 0xE8, 0x03, 0x27, 0x83, 0xF0, 0xC0, 0x25, + 0xAA, 0xFF, 0xBD, 0x2E, 0xCD, 0xF7, 0xC1, 0x23, 0x85, 0xE0, 0xAA, 0x04, + 0xB5, 0xD1, 0x5F, 0xFA, 0x9C, 0xC9, 0xAA, 0xF7, 0x8B, 0xCF, 0x01, 0xEA, + 0xB7, 0xD0, 0x3A, 0xD9, 0x21, 0xC5, 0x9A, 0xD1, 0x9D, 0xBB, 0x09, 0xCA, + 0x1B, 0xBA, 0x70, 0xC7, 0xD8, 0xCB, 0x94, 0xE3, 0xA0, 0xD2, 0xD1, 0xF7, + 0x71, 0xC0, 0x83, 0xEF, 0xC3, 0xBA, 0xF8, 0xEE, 0x7F, 0xC4, 0x4A, 0xF6, + 0x01, 0xC0, 0x29, 0xEE, 0xE9, 0xB5, 0xCD, 0xE4, 0x12, 0xB5, 0x5B, 0xDF, + 0xEF, 0xB7, 0x97, 0xD3, 0x2A, 0xBE, 0x3D, 0xD2, 0xA8, 0xB7, 0x4B, 0xD3, + 0x01, 0xBE, 0x7B, 0xE0, 0x86, 0xCF, 0x84, 0xF4, 0x5D, 0xBF, 0xAE, 0xEB, + 0xBF, 0xBC, 0x12, 0xEE, 0xF0, 0xC6, 0xA7, 0xF5, 0x9F, 0xB7, 0x30, 0xDD, + 0xB1, 0xBC, 0xF6, 0xCF, 0xDE, 0xD4, 0xEC, 0xD4, 0xCD, 0xD8, 0x9E, 0xCC, + 0xDF, 0xE4, 0x82, 0xCA, 0x6F, 0xEA, 0xEF, 0xC7, 0x95, 0xD7, 0xC9, 0xBF, + 0xB3, 0xD5, 0x41, 0xCD, 0x92, 0xCC, 0x2C, 0xC8, 0x18, 0xC6, 0xE6, 0xBC, + 0x63, 0xCC, 0x2F, 0xC0, 0xDF, 0xC2, 0xF5, 0xBA, 0xD5, 0xC7, 0x2B, 0xC6, + 0x06, 0xD3, 0x77, 0xD3, 0x26, 0xE1, 0xC2, 0xDB, 0x2D, 0xED, 0x68, 0xD6, + 0xA2, 0xE3, 0xD4, 0xC4, 0xDF, 0xD8, 0x31, 0xCE, 0x8B, 0xC9, 0x57, 0xDC, + 0x68, 0xBF, 0xCC, 0xDE, 0x73, 0xC3, 0x69, 0xDE, 0x51, 0xD9, 0xAC, 0xEC, + 0xAD, 0xE7, 0x6A, 0xFC, 0x49, 0xDB, 0x05, 0xF3, 0x35, 0xCF, 0x03, 0xE3, + 0xD7, 0xCF, 0x34, 0xE0, 0xD7, 0xCD, 0x59, 0xDC, 0xC5, 0xC9, 0x36, 0xD2, + 0xD4, 0xE4, 0x81, 0xE3, 0xE8, 0x02, 0x74, 0xF9, 0x67, 0xFD, 0xA7, 0xF1, + 0x0E, 0xF5, 0x6C, 0xEE, 0xD1, 0xF2, 0x67, 0xF0, 0x3A, 0xDE, 0x8A, 0xDA, + 0xF2, 0xD5, 0x30, 0xC6, 0x56, 0xDB, 0x0A, 0xC0, 0xF1, 0xDE, 0x26, 0xCB, + 0x71, 0xE0, 0x1B, 0xDA, 0x8C, 0xD6, 0xB2, 0xD4, 0xE5, 0xCA, 0xD9, 0xD0, + 0xCA, 0xC4, 0x45, 0xD5, 0xD5, 0xCC, 0xF3, 0xDE, 0xB4, 0xCF, 0xF3, 0xE3, + 0x0F, 0xC4, 0xA2, 0xD7, 0xE2, 0xC7, 0xAB, 0xCB, 0x59, 0xD0, 0x8B, 0xBD, + 0xC7, 0xD3, 0x4F, 0xB6, 0x33, 0xDB, 0x54, 0xC7, 0x3B, 0xD0, 0x6A, 0xD6, + 0xD6, 0xC1, 0x19, 0xE1, 0x93, 0xCC, 0x6C, 0xF2, 0xE6, 0xE0, 0x4D, 0xFB, + 0x77, 0xE2, 0x42, 0xF4, 0xA6, 0xD6, 0xD5, 0xE7, 0x1B, 0xE1, 0xEE, 0xEF, + 0xB2, 0xEC, 0xCD, 0xFF, 0xCC, 0xE6, 0x9E, 0x05, 0xF6, 0xF3, 0x06, 0x0F, + 0x6A, 0x12, 0x96, 0x1A, 0xB5, 0x1C, 0x25, 0x18, 0xD4, 0x25, 0xA7, 0x16, + 0xC3, 0x2F, 0x22, 0x1A, 0x9F, 0x23, 0xE4, 0x17, 0x22, 0x20, 0x52, 0x25, + 0xA5, 0x1D, 0xC8, 0x21, 0x9A, 0x0E, 0x1A, 0x07, 0x5A, 0x07, 0xCA, 0x04, + 0x69, 0x04, 0x99, 0x0C, 0x97, 0xFD, 0x38, 0xFC, 0x62, 0xFC, 0x77, 0xEC, + 0xAA, 0x00, 0xE5, 0xF2, 0xEA, 0x00, 0x41, 0xF3, 0xB2, 0x0B, 0xF3, 0xF7, + 0xAC, 0x19, 0x44, 0x05, 0x2A, 0x19, 0x06, 0x01, 0x4E, 0x14, 0x77, 0xEE, + 0x86, 0x17, 0x04, 0xEB, 0xAC, 0x0F, 0x28, 0xF4, 0xA8, 0xE8, 0x53, 0xF1, + 0xC4, 0xCC, 0xE0, 0xF1, 0x8C, 0xDF, 0x86, 0x00, 0x62, 0xF2, 0x34, 0xF7, + 0xA8, 0xF7, 0x4C, 0xE4, 0xEA, 0xFE, 0xD7, 0xE7, 0xF4, 0xFA, 0x95, 0xED, + 0xC3, 0x06, 0x55, 0x00, 0x9E, 0x15, 0x9B, 0x11, 0x9B, 0x26, 0xC7, 0x26, + 0x37, 0x3C, 0x09, 0x3F, 0x47, 0x33, 0x32, 0x35, 0xC5, 0x2C, 0x8D, 0x29, + 0x32, 0x2D, 0x78, 0x21, 0x1B, 0x21, 0xD1, 0x13, 0xF3, 0x20, 0xD8, 0x18, + 0x66, 0x2E, 0x75, 0x19, 0xD7, 0x34, 0x24, 0x05, 0x53, 0x31, 0x25, 0xFB, + 0x0F, 0x26, 0xA6, 0xFE, 0x31, 0x14, 0x95, 0xF3, 0xD3, 0x14, 0x9B, 0xE7, + 0x9C, 0x27, 0xB0, 0xEF, 0xC8, 0x28, 0xF1, 0xF7, 0x8E, 0x10, 0x62, 0xEE, + 0xB9, 0x0A, 0xC6, 0xED, 0x95, 0x1D, 0x30, 0xFC, 0x4A, 0x2E, 0x9D, 0xFD, + 0x7F, 0x2D, 0x7B, 0xEE, 0x47, 0x1B, 0x08, 0xE4, 0x80, 0x07, 0x82, 0xDF, + 0x23, 0xF6, 0x2C, 0xD7, 0xCC, 0xF9, 0xA1, 0xE2, 0x28, 0x15, 0xFD, 0xFC, + 0x3B, 0x2D, 0x12, 0x0D, 0x94, 0x37, 0x1B, 0x20, 0xF1, 0x48, 0xC9, 0x3B, + 0x1C, 0x55, 0xD0, 0x41, 0xEC, 0x4F, 0xFD, 0x3A, 0x87, 0x51, 0x4C, 0x40, + 0xBB, 0x53, 0x65, 0x3A, 0x90, 0x56, 0x1E, 0x30, 0xDC, 0x60, 0x14, 0x38, + 0x87, 0x5D, 0x43, 0x3E, 0x40, 0x4A, 0x42, 0x3B, 0x62, 0x46, 0x68, 0x42, + 0x5C, 0x46, 0x73, 0x3C, 0x81, 0x47, 0xBE, 0x2F, 0x70, 0x5C, 0x70, 0x3E, + 0xCE, 0x57, 0x06, 0x3D, 0x91, 0x3A, 0x4D, 0x29, 0x48, 0x33, 0x86, 0x28, + 0xBB, 0x2F, 0x58, 0x1F, 0x97, 0x1B, 0x90, 0x0D, 0x2E, 0x0B, 0xAE, 0x15, + 0x0C, 0x10, 0xF8, 0x22, 0xD6, 0x1A, 0x51, 0x1B, 0x48, 0x0F, 0x3C, 0xFF, + 0xB0, 0x03, 0x75, 0xE8, 0x09, 0xFC, 0xC3, 0xE2, 0x98, 0xEA, 0xC7, 0xE6, + 0x4E, 0xF0, 0x97, 0xF5, 0x3F, 0xFD, 0xA4, 0xEF, 0x5C, 0x03, 0xA4, 0xE5, + 0x45, 0x18, 0x9F, 0xF8, 0xD2, 0x17, 0xE3, 0xFF, 0x0B, 0x0A, 0x87, 0xFE, + 0x8E, 0x07, 0xC0, 0x09, 0xCD, 0x01, 0xCD, 0x0F, 0xBF, 0x04, 0x62, 0x10, + 0x9E, 0x0E, 0x83, 0x0C, 0xE4, 0x17, 0x0F, 0x05, 0x57, 0x23, 0xA5, 0x03, + 0xE9, 0x1B, 0x3F, 0xFE, 0xA4, 0x17, 0xC5, 0x05, 0x45, 0x19, 0xBC, 0x09, + 0xE0, 0xFB, 0x92, 0xF0, 0xE2, 0xDB, 0x01, 0xDF, 0x94, 0xDA, 0xC0, 0xE8, + 0x3E, 0xDD, 0xF2, 0xF2, 0xE7, 0xCA, 0xD5, 0xDF, 0x5B, 0xCB, 0x34, 0xDA, + 0xB8, 0xD8, 0x67, 0xE6, 0x8A, 0xD6, 0xE6, 0xDF, 0x45, 0xDD, 0xD4, 0xEA, + 0xEA, 0xE6, 0x3D, 0x0C, 0xBE, 0xE7, 0xBC, 0x16, 0xFC, 0xEB, 0xC0, 0x0A, + 0x96, 0xFA, 0xFE, 0x07, 0xD3, 0xF7, 0x7C, 0xFA, 0x82, 0xE5, 0x4D, 0xE9, + 0x85, 0xD9, 0xCB, 0xE3, 0xF2, 0xD6, 0xD9, 0xDC, 0x38, 0xD8, 0x28, 0xDE, + 0xC2, 0xD1, 0x76, 0xDC, 0x0B, 0xDB, 0x04, 0xE4, 0xC3, 0xF6, 0x74, 0x04, + 0x6D, 0x07, 0x5C, 0x1E, 0xEC, 0x12, 0x99, 0x27, 0x76, 0x23, 0xDD, 0x2E, + 0x4B, 0x1D, 0x22, 0x1D, 0x7E, 0x1E, 0x5A, 0x08, 0x74, 0x36, 0x5A, 0x07, + 0x8D, 0x36, 0x94, 0xFD, 0xE8, 0x26, 0x72, 0xFD, 0x7C, 0x20, 0x81, 0x08, + 0x17, 0x1A, 0xA4, 0x08, 0xDA, 0x0A, 0xEA, 0x03, 0x68, 0x0D, 0xC2, 0x10, + 0xB1, 0x0B, 0x65, 0x12, 0x94, 0xF4, 0x8F, 0xF1, 0x4B, 0xFE, 0x0F, 0xE0, + 0x4C, 0x17, 0x19, 0xE8, 0x4F, 0x0E, 0x93, 0xEC, 0x95, 0x09, 0x73, 0xF6, + 0x59, 0x22, 0x48, 0x1D, 0xE4, 0x1D, 0xA5, 0x2D, 0x02, 0x0C, 0x04, 0x1C, + 0xBC, 0x09, 0x4F, 0x15, 0x8B, 0xF0, 0x51, 0x0B, 0x48, 0xE0, 0x76, 0x07, + 0x1A, 0xE9, 0xBC, 0x13, 0x23, 0xEB, 0xEB, 0x17, 0x56, 0xFD, 0xC4, 0x19, + 0xB2, 0x13, 0xF6, 0x18, 0xF3, 0x0C, 0x20, 0x0D, 0xF0, 0x10, 0x92, 0x14, + 0x83, 0x20, 0x14, 0x34, 0xA9, 0x0D, 0x10, 0x3A, 0x4B, 0xF7, 0xBC, 0x22, + 0xF6, 0x01, 0x19, 0x1B, 0x8F, 0x09, 0x8C, 0x1C, 0x24, 0x0B, 0xA5, 0x18, + 0x55, 0x0A, 0xC0, 0x15, 0x72, 0xFD, 0x69, 0x20, 0xB3, 0x00, 0x7F, 0x36, + 0x2B, 0x0A, 0xB5, 0x3A, 0x7F, 0x07, 0xE3, 0x31, 0xC0, 0x11, 0x10, 0x35, + 0x60, 0x1D, 0x92, 0x34, 0x76, 0x1A, 0x74, 0x27, 0x19, 0x22, 0xAB, 0x26, + 0xCA, 0x27, 0x49, 0x29, 0x74, 0x12, 0x17, 0x1E, 0x22, 0x07, 0xFC, 0x19, + 0x68, 0x12, 0x72, 0x25, 0xC5, 0x1C, 0x25, 0x2D, 0x67, 0x1F, 0x91, 0x22, + 0x84, 0x22, 0x52, 0x16, 0xF7, 0x14, 0xCC, 0x02, 0xF0, 0xF7, 0x25, 0xEC, + 0xFA, 0xF5, 0x01, 0xF2, 0x7F, 0xFA, 0x72, 0xFB, 0x36, 0xFA, 0x0C, 0x02, + 0x99, 0xF7, 0x0B, 0x04, 0x94, 0x02, 0xFA, 0x09, 0xD9, 0x08, 0x39, 0x0D, + 0xCF, 0x07, 0x02, 0x12, 0xC4, 0x11, 0x5A, 0x17, 0x3A, 0x08, 0x66, 0x01, + 0xF2, 0x0F, 0x78, 0x0C, 0xC0, 0x11, 0xED, 0x24, 0xE3, 0xFB, 0xA7, 0x20, + 0x31, 0x03, 0x18, 0x26, 0xC4, 0x00, 0xE4, 0x1B, 0x5F, 0xF0, 0x56, 0x04, + 0x63, 0xF4, 0xD5, 0x02, 0xB9, 0xEA, 0x27, 0x00, 0xF1, 0xD6, 0x33, 0xF7, + 0xE9, 0xCB, 0x3C, 0xF1, 0x44, 0xBA, 0x14, 0xEA, 0x68, 0xB2, 0x2C, 0xE2, + 0xFD, 0xCB, 0xB0, 0xE3, 0x29, 0xDC, 0x4B, 0xE3, 0x4D, 0xDC, 0x03, 0xDF, + 0x66, 0xEF, 0x42, 0xEA, 0xAE, 0xF9, 0x0C, 0xEF, 0xBA, 0xEB, 0x0D, 0xDC, + 0xE9, 0xE4, 0x7A, 0xCF, 0xA0, 0xE2, 0x3C, 0xD5, 0xE4, 0xD7, 0x20, 0xD8, + 0x58, 0xD7, 0x2B, 0xD6, 0xB6, 0xDB, 0x19, 0xDC, 0x91, 0xD2, 0x2E, 0xDF, + 0x22, 0xC9, 0xB8, 0xD1, 0x4D, 0xDA, 0x39, 0xD3, 0xCB, 0xE2, 0x13, 0xE8, + 0x98, 0xDD, 0xCA, 0xFC, 0x6F, 0xE8, 0xD0, 0x11, 0xA4, 0xE4, 0x89, 0x1D, + 0x22, 0xE6, 0x41, 0x29, 0xBC, 0xF4, 0x47, 0x2A, 0xB8, 0xF0, 0xFA, 0x1B, + 0x1E, 0xF3, 0x50, 0x1B, 0x11, 0xEE, 0xF3, 0x08, 0x50, 0xDD, 0x18, 0xF1, + 0xBA, 0xE8, 0x0B, 0xFF, 0x75, 0xDF, 0xDC, 0xF4, 0x1A, 0xB0, 0x47, 0xC8, + 0x9F, 0xAA, 0x02, 0xC1, 0xC2, 0xBB, 0x1D, 0xC4, 0xCE, 0xAF, 0xE8, 0xB0, + 0x3C, 0xC0, 0xFB, 0xBE, 0x6B, 0xE8, 0x35, 0xE4, 0xFD, 0xE3, 0xCF, 0xE0, + 0xB6, 0xE2, 0xE3, 0xD1, 0xBE, 0x01, 0x66, 0xDC, 0xFC, 0x09, 0x5C, 0xE0, + 0x9C, 0xFD, 0x7E, 0xD7, 0x6A, 0xF8, 0x33, 0xCE, 0xB1, 0xEC, 0x10, 0xBD, + 0xFE, 0xD5, 0x51, 0xAE, 0x44, 0xCD, 0x4E, 0xB3, 0xF9, 0xD2, 0x88, 0xC2, + 0x5E, 0xE2, 0x93, 0xDC, 0x06, 0xEC, 0xE0, 0xF4, 0xEA, 0xEB, 0x4E, 0x08, + 0xE2, 0xEC, 0x4F, 0x18, 0x92, 0xF0, 0x36, 0x12, 0x1E, 0x05, 0x17, 0x11, + 0xF2, 0x06, 0x51, 0x11, 0x47, 0xF7, 0x41, 0x09, 0xBB, 0xF9, 0x9A, 0x11, + 0x64, 0xFA, 0xC0, 0x1F, 0xF1, 0xF3, 0x27, 0x15, 0xE4, 0xF8, 0x82, 0xFB, + 0xFD, 0x09, 0x91, 0xF1, 0xE8, 0x0E, 0x05, 0xF4, 0xAA, 0xF7, 0xEA, 0xEF, + 0xAF, 0xD5, 0x82, 0xDF, 0xE2, 0xDD, 0xF2, 0xE2, 0x90, 0xFC, 0xAB, 0xF0, + 0x11, 0xEF, 0x81, 0xDA, 0xB6, 0xE0, 0xC8, 0xC2, 0x8F, 0xF5, 0x3D, 0xD3, + 0x29, 0xEB, 0xC7, 0xCF, 0xB3, 0xD3, 0x1B, 0xBC, 0x32, 0xE0, 0x11, 0xD4, + 0x2A, 0xDD, 0xC7, 0xDC, 0x6B, 0xDD, 0xC1, 0xCB, 0x5A, 0xF6, 0x16, 0xCC, + 0x3D, 0xF1, 0x76, 0xC8, 0x57, 0xDC, 0x01, 0xC9, 0x38, 0xD1, 0x1B, 0xD7, + 0x5D, 0xC9, 0xD5, 0xD8, 0x14, 0xCF, 0x96, 0xCF, 0x1E, 0xE6, 0x7B, 0xD7, + 0x8C, 0xFB, 0x7C, 0xEA, 0x8A, 0x04, 0x43, 0xEF, 0xE0, 0x0F, 0xF8, 0xFD, + 0x6D, 0x10, 0x32, 0x12, 0x69, 0xFB, 0x7E, 0x04, 0xB9, 0xF8, 0xF7, 0xFD, + 0x28, 0x0D, 0xD0, 0x0F, 0xF4, 0x0C, 0x05, 0xF9, 0x9E, 0x05, 0x52, 0xD8, + 0x41, 0x11, 0x7C, 0xDB, 0xE4, 0x0E, 0x30, 0xDA, 0xDE, 0x06, 0xA3, 0xDC, + 0x75, 0x07, 0x0D, 0xE6, 0xEE, 0xFB, 0x58, 0xD4, 0x60, 0xFB, 0xF8, 0xC8, + 0xF8, 0x03, 0xB7, 0xD1, 0x5D, 0xF7, 0x76, 0xC2, 0x48, 0xE4, 0x4A, 0xAD, + 0x81, 0xEB, 0x51, 0xB7, 0x28, 0xFB, 0x99, 0xC3, 0x93, 0xFC, 0x58, 0xC2, + 0x94, 0x0E, 0xCF, 0xE1, 0xB1, 0x17, 0x9A, 0x05, 0x2C, 0x0C, 0x0B, 0x05, + 0x9C, 0x09, 0x91, 0x07, 0xEF, 0xFC, 0x84, 0x05, 0x5E, 0xE2, 0x8D, 0xF0, + 0x8B, 0xE2, 0x2E, 0xF1, 0x80, 0xF3, 0x4D, 0xFF, 0xE5, 0xF7, 0xB7, 0x00, + 0x91, 0xFE, 0x7B, 0x04, 0x92, 0x02, 0xC0, 0x11, 0xA2, 0xFF, 0x24, 0x17, + 0x11, 0xF9, 0x5B, 0x0E, 0x2D, 0x09, 0x8A, 0x22, 0xF8, 0x18, 0x31, 0x39, + 0x47, 0x0F, 0x3D, 0x37, 0x72, 0x1A, 0x00, 0x3C, 0xC0, 0x1F, 0x1B, 0x23, + 0xAD, 0x18, 0xAA, 0x06, 0x93, 0x19, 0x5C, 0x0D, 0x9B, 0x0C, 0x5C, 0x0C, + 0xE6, 0x00, 0x5F, 0x09, 0xA2, 0x0A, 0x98, 0x17, 0x03, 0x07, 0x23, 0x08, + 0xEF, 0xF7, 0xA9, 0xE4, 0xC8, 0x03, 0x0A, 0xEA, 0x52, 0x04, 0x16, 0xEC, + 0xCE, 0xF5, 0x71, 0xD1, 0x2F, 0xFA, 0x14, 0xD5, 0x38, 0x05, 0xE8, 0xF5, + 0xD5, 0x0A, 0x15, 0x0C, 0xD7, 0x11, 0x50, 0x1B, 0xAC, 0x26, 0xA5, 0x31, + 0xAC, 0x2E, 0xD9, 0x30, 0xEB, 0x25, 0xDF, 0x21, 0xDA, 0x1A, 0x92, 0x1D, + 0x2C, 0xFF, 0xFB, 0x03, 0x8E, 0xEB, 0x55, 0xF0, 0x2B, 0xF8, 0x2A, 0x05, + 0x7F, 0x03, 0x42, 0x14, 0x0B, 0xFF, 0x67, 0x0E, 0x8E, 0x08, 0x40, 0x13, + 0x6A, 0x1C, 0x51, 0x17, 0xC7, 0x27, 0xBD, 0x12, 0xF9, 0x38, 0xEF, 0x28, + 0x59, 0x41, 0x9B, 0x36, 0x5A, 0x33, 0x86, 0x21, 0x70, 0x37, 0x0B, 0x1F, + 0x12, 0x4C, 0xAA, 0x2C, 0x78, 0x40, 0x35, 0x26, 0x5B, 0x2E, 0x56, 0x27, + 0xA0, 0x32, 0x6B, 0x34, 0x6B, 0x28, 0xA2, 0x23, 0x20, 0x23, 0x85, 0x14, + 0x77, 0x25, 0x51, 0x0F, 0xD2, 0x19, 0xED, 0x04, 0xC6, 0x1A, 0xEF, 0x14, + 0x69, 0x24, 0x0E, 0x2B, 0x93, 0x20, 0x7C, 0x24, 0x65, 0x08, 0xCD, 0x10, + 0x04, 0x00, 0x2D, 0x0A, 0x6E, 0x09, 0xFB, 0x01, 0xD1, 0x08, 0xC4, 0xF8, + 0x62, 0x1D, 0x46, 0x07, 0xFF, 0x36, 0xB8, 0x16, 0xDF, 0x2D, 0x1F, 0x0E, + 0x3A, 0x1E, 0x45, 0x05, 0x49, 0x14, 0x6D, 0x00, 0x2E, 0xF8, 0xEF, 0xEB, + 0x0E, 0xED, 0x79, 0xE6, 0xA7, 0x09, 0x9C, 0xF3, 0x37, 0x0D, 0x19, 0xED, + 0x06, 0x05, 0x26, 0xED, 0x65, 0x21, 0x1C, 0x08, 0x7D, 0x2E, 0x60, 0x10, + 0x3B, 0x1C, 0x78, 0x0A, 0x80, 0x17, 0x7F, 0x14, 0xE6, 0x1C, 0x06, 0x16, + 0x5F, 0x18, 0xE2, 0x07, 0x02, 0x1E, 0x26, 0x07, 0x8F, 0x18, 0xD6, 0x09, + 0xCE, 0x00, 0x29, 0x0A, 0x5A, 0xF8, 0x97, 0x14, 0xEF, 0xF0, 0x08, 0x12, + 0xEA, 0xEF, 0x2B, 0x10, 0x8A, 0xFE, 0xB4, 0x26, 0xDC, 0xF3, 0xF2, 0x20, + 0xF7, 0xD7, 0x7C, 0x01, 0xAA, 0xD5, 0x5F, 0xF9, 0x2C, 0xD7, 0xA6, 0xF1, + 0x8A, 0xCB, 0x06, 0xE9, 0xDA, 0xCC, 0x5D, 0xF8, 0xCD, 0xE6, 0x93, 0x0F, + 0x26, 0xF6, 0x14, 0x06, 0xE5, 0xFA, 0x5C, 0xF5, 0x0A, 0x0E, 0x66, 0x04, + 0x8C, 0x0A, 0x83, 0x00, 0xDE, 0xF3, 0x46, 0xE8, 0x47, 0xF8, 0xC7, 0xF5, + 0xA4, 0xFD, 0x8F, 0x04, 0x03, 0xE2, 0x81, 0xEE, 0x41, 0xD8, 0xD2, 0xED, + 0x3D, 0xF2, 0x2C, 0x06, 0x91, 0xF8, 0xA2, 0xFD, 0xE2, 0xFF, 0x3C, 0xF8, + 0x7F, 0x16, 0xEE, 0x13, 0x61, 0x22, 0xA0, 0x29, 0xFF, 0x30, 0x9D, 0x33, + 0x4C, 0x48, 0x74, 0x49, 0xEA, 0x49, 0xC4, 0x51, 0x0F, 0x3C, 0xB4, 0x48, + 0xB1, 0x40, 0xC2, 0x4B, 0x0D, 0x3C, 0x17, 0x40, 0xED, 0x31, 0x58, 0x33, + 0xE0, 0x2A, 0x86, 0x2C, 0x14, 0x12, 0x3C, 0x18, 0xB4, 0x0D, 0x58, 0x14, + 0x25, 0x11, 0xAD, 0x0B, 0x6B, 0x01, 0xD8, 0xF3, 0xDC, 0x01, 0x78, 0xFB, + 0x8D, 0xFE, 0x14, 0x09, 0x8A, 0xE9, 0x98, 0x04, 0xD2, 0xE4, 0xF1, 0x0B, + 0x92, 0xF7, 0x48, 0x1A, 0xBE, 0x00, 0x02, 0x18, 0x9F, 0xFB, 0x21, 0x11, + 0xAE, 0x09, 0xC2, 0x1F, 0xD3, 0x16, 0x72, 0x26, 0x4C, 0x03, 0xBA, 0x03, + 0x54, 0xFB, 0x3F, 0xF7, 0x7C, 0x04, 0xBA, 0x08, 0x07, 0xFA, 0x36, 0x09, + 0xDA, 0xFC, 0xCC, 0x10, 0xE0, 0x0C, 0xBA, 0x1E, 0x4A, 0x0B, 0xBF, 0x21, + 0xCF, 0x04, 0xEF, 0x1F, 0xAB, 0x05, 0xEE, 0x27, 0x30, 0x0E, 0xF3, 0x30, + 0x1E, 0x19, 0xB2, 0x2F, 0x89, 0x25, 0x76, 0x3A, 0x45, 0x31, 0xCF, 0x49, + 0x80, 0x32, 0x47, 0x40, 0x34, 0x37, 0x59, 0x38, 0xC3, 0x3B, 0x62, 0x38, + 0x2F, 0x35, 0x1A, 0x29, 0x33, 0x2F, 0x94, 0x1F, 0xE8, 0x1F, 0xB8, 0x1D, + 0x1C, 0x0A, 0xE9, 0x13, 0xD9, 0x0C, 0xF7, 0x0B, 0xAA, 0x0D, 0x8C, 0x02, + 0x68, 0xFD, 0x87, 0xF7, 0xB0, 0x0B, 0x1C, 0x07, 0xCA, 0x19, 0x8E, 0x15, + 0x92, 0x01, 0x75, 0x00, 0xB1, 0xF0, 0x09, 0xF4, 0x37, 0xFE, 0x8F, 0xFC, + 0x5B, 0x07, 0x47, 0x02, 0xA7, 0x05, 0xCA, 0x08, 0x68, 0x17, 0xE0, 0x14, + 0xC0, 0x25, 0xD1, 0x17, 0x68, 0x0A, 0xB8, 0x00, 0xB5, 0xFC, 0xDF, 0xFF, + 0xD1, 0x09, 0x19, 0x0B, 0x7A, 0xF8, 0x81, 0xEF, 0x66, 0xF0, 0xDC, 0xE9, + 0x12, 0xFB, 0xBD, 0x02, 0xB4, 0xEF, 0x6A, 0x07, 0xB4, 0xEB, 0x26, 0x09, + 0x30, 0xF8, 0x7A, 0x12, 0x8D, 0x08, 0x6C, 0x1B, 0x0E, 0x18, 0xA6, 0x26, + 0x46, 0x24, 0xC5, 0x31, 0x3D, 0x26, 0xA3, 0x2E, 0xAF, 0x1D, 0x8A, 0x21, + 0x34, 0x1A, 0x10, 0x1C, 0xAE, 0x06, 0x29, 0x12, 0x77, 0x00, 0x17, 0x13, + 0x61, 0x17, 0xB8, 0x1E, 0x8D, 0x04, 0x2B, 0x05, 0x37, 0xE3, 0x4B, 0xEF, + 0x26, 0xE1, 0x53, 0xFB, 0xCF, 0xCD, 0xE7, 0xEA, 0x89, 0xB8, 0xE3, 0xD3, + 0xCF, 0xCA, 0x70, 0xE0, 0x9F, 0xD7, 0x86, 0xE4, 0xB1, 0xD9, 0x45, 0xE4, + 0xA2, 0xEB, 0x33, 0xF0, 0x9D, 0xF3, 0x6B, 0xEB, 0xFA, 0xE8, 0x3A, 0xE5, + 0x5E, 0xE3, 0xCD, 0xEA, 0x2C, 0xEB, 0x16, 0xF8, 0x1F, 0xE7, 0x64, 0xFE, + 0xE0, 0xD3, 0x6C, 0xF1, 0x6E, 0xCD, 0x01, 0xEC, 0xF9, 0xCD, 0x96, 0xE9, + 0xCC, 0xCC, 0xD4, 0xDE, 0x1B, 0xD0, 0x5C, 0xD5, 0xE6, 0xCE, 0xAE, 0xD1, + 0xCE, 0xCE, 0xC8, 0xDA, 0x5F, 0xCE, 0xA6, 0xDE, 0x92, 0xCA, 0x43, 0xD8, + 0xDB, 0xD3, 0x24, 0xDB, 0x53, 0xE4, 0x4C, 0xE5, 0xD5, 0xE6, 0x5F, 0xE7, + 0x14, 0xE5, 0xDF, 0xE5, 0x81, 0xE3, 0xA7, 0xE2, 0x63, 0xDF, 0x92, 0xD6, + 0x99, 0xDF, 0x64, 0xC9, 0x19, 0xE1, 0x58, 0xC5, 0xFB, 0xDC, 0x6D, 0xC1, + 0xD9, 0xD9, 0x58, 0xBF, 0x9A, 0xDC, 0x37, 0xC7, 0x5B, 0xD8, 0xE6, 0xC4, + 0x78, 0xC9, 0x41, 0xAF, 0x9A, 0xBB, 0xD8, 0xA1, 0xF9, 0xC3, 0x81, 0xAB, + 0xB3, 0xCB, 0xB3, 0xA6, 0xA6, 0xCB, 0x00, 0xA4, 0xF3, 0xD3, 0x9B, 0xBB, + 0x10, 0xCF, 0x94, 0xC7, 0x3E, 0xC6, 0xA7, 0xC8, 0x9D, 0xD1, 0x1D, 0xD8, + 0x18, 0xE5, 0xC6, 0xE6, 0x6D, 0xE7, 0xBE, 0xE1, 0x14, 0xD8, 0x53, 0xDD, + 0x15, 0xD3, 0x53, 0xE2, 0x87, 0xCF, 0xD3, 0xD4, 0x4D, 0xBD, 0x70, 0xBB, + 0xE8, 0xB5, 0x48, 0xBD, 0x32, 0xB9, 0xEF, 0xC0, 0xEA, 0xB8, 0x9A, 0xB1, + 0x0C, 0xBD, 0xB4, 0xB7, 0x0F, 0xCF, 0x82, 0xDA, 0x27, 0xDE, 0x8F, 0xED, + 0x83, 0xDC, 0x77, 0xE7, 0x6D, 0xEC, 0x21, 0xEF, 0x5A, 0x03, 0x52, 0xF7, + 0x61, 0x00, 0xA5, 0xF1, 0x3D, 0x03, 0x6E, 0xFE, 0x7A, 0x0F, 0x04, 0x0D, + 0xD8, 0x16, 0x66, 0x0C, 0xA2, 0x15, 0x8D, 0x0D, 0x4A, 0xF8, 0x38, 0x03, + 0x80, 0xDF, 0x4E, 0xF1, 0xE2, 0xDD, 0xE9, 0xE8, 0xD2, 0xC8, 0xED, 0xD8, + 0x98, 0xB0, 0xB0, 0xCA, 0x93, 0xCD, 0x13, 0xD9, 0x4C, 0xE8, 0x6D, 0xE0, + 0x17, 0xDE, 0xF3, 0xD5, 0x86, 0xED, 0xAB, 0xE3, 0xD0, 0x02, 0xE1, 0xF1, + 0xB4, 0xF3, 0x85, 0xE9, 0xEE, 0xEC, 0x65, 0xEF, 0xA0, 0x07, 0x45, 0x03, + 0xD8, 0x08, 0xA1, 0xF8, 0xF6, 0xEB, 0xD1, 0xDA, 0x5A, 0xEA, 0xF6, 0xDD, + 0x8A, 0xEF, 0xA7, 0xE3, 0x89, 0xD4, 0x2D, 0xCC, 0x4B, 0xCD, 0x9C, 0xD0, + 0xF7, 0xEB, 0x47, 0xEF, 0xA4, 0xEC, 0x5F, 0xE8, 0x8C, 0xEE, 0x09, 0xE2, + 0x3A, 0x09, 0xBC, 0xF5, 0xAD, 0x0F, 0xBB, 0xF8, 0x44, 0x17, 0x0D, 0xFB, + 0x19, 0x30, 0x0D, 0x09, 0xCA, 0x37, 0xF5, 0x0A, 0xAD, 0x29, 0xC5, 0x05, + 0xA7, 0x28, 0x40, 0x0D, 0x6D, 0x29, 0x38, 0x17, 0x7D, 0x1E, 0x1C, 0x16, + 0xC1, 0x14, 0xA6, 0x0E, 0xFD, 0x01, 0xAD, 0x03, 0x2A, 0xFB, 0x22, 0x01, + 0x1A, 0x0E, 0x0B, 0x0A, 0xB7, 0x18, 0xEF, 0x0A, 0xDA, 0x08, 0x27, 0x05, + 0x2C, 0x06, 0xF6, 0x10, 0x20, 0x0C, 0xD4, 0x13, 0xCD, 0xFA, 0xA7, 0xFB, + 0x01, 0xF4, 0x82, 0xF1, 0xAE, 0xFB, 0x75, 0xFF, 0x97, 0xF7, 0xB6, 0x04, + 0x14, 0xEE, 0x58, 0x07, 0x95, 0xF6, 0xC2, 0x1F, 0x84, 0xF9, 0x96, 0x20, + 0xB9, 0xF3, 0xC4, 0x09, 0x04, 0x04, 0x07, 0x07, 0x79, 0x0B, 0xC0, 0x04, + 0x57, 0xFD, 0xD9, 0xF5, 0x40, 0xF8, 0x77, 0xF3, 0xB3, 0x03, 0xF0, 0x03, + 0x00, 0x07, 0x24, 0x08, 0xA3, 0xF9, 0xEB, 0xF2, 0xC3, 0xFD, 0x4F, 0xE6, + 0x61, 0x0B, 0x1B, 0xE7, 0x99, 0x02, 0x18, 0xE0, 0x23, 0x0C, 0x94, 0xF1, + 0xB3, 0x21, 0xF3, 0x0C, 0xB4, 0x25, 0xF2, 0x09, 0x68, 0x29, 0x48, 0x04, + 0x25, 0x2B, 0x7A, 0x00, 0x28, 0x24, 0x27, 0xF1, 0x2D, 0x1C, 0x7A, 0xF0, + 0xEE, 0x18, 0xDF, 0x04, 0x64, 0x10, 0xD7, 0x06, 0xCD, 0x0D, 0x21, 0x05, + 0x19, 0x04, 0x48, 0x0B, 0x3D, 0xE3, 0x0B, 0xF8, 0x77, 0xD4, 0x55, 0xE5, + 0xF8, 0xDA, 0xD2, 0xEF, 0x4A, 0xD5, 0xE7, 0xF3, 0x2C, 0xD8, 0x1F, 0xF1, + 0x65, 0xF2, 0x7D, 0xFA, 0xD0, 0x00, 0xB8, 0xF7, 0x75, 0x07, 0xC3, 0xF2, + 0x15, 0x1E, 0x65, 0x07, 0x49, 0x27, 0xEC, 0x19, 0x83, 0x1A, 0x42, 0x16, + 0xE1, 0x12, 0xAB, 0x11, 0xD1, 0x13, 0xDC, 0x17, 0xBC, 0x0F, 0x38, 0x19, + 0xD8, 0x06, 0x1C, 0x0A, 0xB9, 0x0E, 0x54, 0x08, 0x6B, 0x1E, 0x82, 0x18, + 0x59, 0x21, 0x37, 0x21, 0x15, 0x1E, 0xC7, 0x20, 0xAB, 0x23, 0x73, 0x28, + 0x8E, 0x32, 0xB0, 0x3A, 0xA7, 0x3E, 0xE2, 0x44, 0xA5, 0x47, 0x7E, 0x42, + 0xEC, 0x49, 0x29, 0x36, 0x3B, 0x42, 0xF5, 0x2E, 0x06, 0x37, 0xA9, 0x32, + 0xF5, 0x25, 0xFB, 0x2B, 0xC1, 0x1A, 0xA0, 0x23, 0x06, 0x15, 0xDB, 0x1D, + 0x15, 0x02, 0x6E, 0x0C, 0xE6, 0xF9, 0x40, 0x08, 0x4F, 0x03, 0x50, 0x06, + 0x3D, 0xFD, 0x04, 0xE6, 0x8B, 0xF0, 0xBA, 0xD1, 0x20, 0xF3, 0x77, 0xDF, + 0xF8, 0xFB, 0x2F, 0xE8, 0x77, 0xFE, 0xE8, 0xE0, 0x10, 0x01, 0x53, 0xE1, + 0x3B, 0x0F, 0xC0, 0xEB, 0x70, 0x16, 0x68, 0xF2, 0xD1, 0x10, 0xCF, 0xEF, + 0xB8, 0x0F, 0x53, 0xE7, 0xFC, 0x0E, 0x70, 0xEA, 0xAD, 0xFD, 0x4F, 0xF0, + 0x65, 0xEE, 0x2A, 0xFC, 0x01, 0xF5, 0xBF, 0x0E, 0x15, 0xEE, 0x28, 0x05, + 0x5B, 0xDA, 0x2E, 0xEC, 0x84, 0xD5, 0x5E, 0xEB, 0xDF, 0xD6, 0xBE, 0xFC, + 0xA4, 0xE0, 0xE2, 0x0C, 0xE4, 0xF1, 0xE9, 0x17, 0xAC, 0x04, 0xCB, 0x1F, + 0xDB, 0x0C, 0xBF, 0x20, 0x1B, 0x0B, 0xAA, 0x20, 0x25, 0x18, 0xF5, 0x2F, + 0xCB, 0x25, 0x63, 0x36, 0x75, 0x2D, 0x38, 0x29, 0xB0, 0x32, 0x3C, 0x23, + 0x76, 0x24, 0x11, 0x1F, 0xFB, 0x13, 0x47, 0x11, 0xC5, 0x02, 0x9A, 0xF8, + 0xC0, 0xF3, 0x83, 0xE7, 0x6D, 0x00, 0xB8, 0xF5, 0x60, 0x05, 0x5F, 0x00, + 0xC6, 0xF5, 0xBA, 0xF5, 0x2B, 0xF4, 0x2E, 0xEC, 0x17, 0xFA, 0xC5, 0xE8, + 0x92, 0xF5, 0x8F, 0xEC, 0x18, 0xF9, 0x44, 0xF5, 0xD4, 0x05, 0x7B, 0xFA, + 0x48, 0x0D, 0x48, 0x02, 0x10, 0x18, 0xE2, 0x12, 0x12, 0x23, 0x4A, 0x22, + 0x87, 0x20, 0x48, 0x26, 0xCB, 0x1D, 0x96, 0x26, 0xEA, 0x25, 0x8A, 0x23, + 0xB2, 0x25, 0xCA, 0x16, 0xBD, 0x10, 0x49, 0x12, 0x4D, 0xF3, 0xBD, 0x0C, + 0x17, 0xF4, 0xD7, 0x03, 0xB1, 0x0C, 0x09, 0x01, 0x5F, 0x18, 0x61, 0x04, + 0xDC, 0x21, 0x08, 0x19, 0x8E, 0x23, 0xBA, 0x29, 0x08, 0x26, 0x90, 0x35, + 0x92, 0x34, 0x2E, 0x42, 0xDC, 0x3D, 0x83, 0x44, 0xAA, 0x3F, 0xA1, 0x3F, + 0xA7, 0x39, 0xAA, 0x33, 0xA0, 0x3C, 0x9D, 0x32, 0xA6, 0x47, 0x22, 0x3C, + 0x72, 0x40, 0x07, 0x3C, 0xE7, 0x2E, 0x0D, 0x3B, 0x20, 0x20, 0xBA, 0x34, + 0x04, 0x1C, 0xCA, 0x2F, 0x40, 0x1D, 0xF1, 0x37, 0x0D, 0x10, 0x94, 0x2F, + 0xCC, 0x0D, 0x86, 0x23, 0x7E, 0x21, 0xC4, 0x28, 0x94, 0x20, 0x44, 0x21, + 0x04, 0x08, 0x23, 0x10, 0x35, 0xF7, 0x47, 0x15, 0x1B, 0xED, 0x2C, 0x22, + 0x58, 0xE6, 0xD8, 0x24, 0x49, 0xF5, 0xAF, 0x32, 0x1B, 0x18, 0x36, 0x48, + 0x8C, 0x28, 0xFD, 0x3F, 0x52, 0x1B, 0x90, 0x25, 0xCC, 0x19, 0xD3, 0x23, + 0xF6, 0x1D, 0x62, 0x24, 0x49, 0x0F, 0x11, 0x13, 0x4D, 0x16, 0x2A, 0x14, + 0x7D, 0x2F, 0x8A, 0x18, 0x49, 0x23, 0xD0, 0x06, 0x67, 0x0B, 0x57, 0x00, + 0xF7, 0x15, 0x01, 0x0B, 0x4B, 0x2C, 0x97, 0x0F, 0xB4, 0x36, 0x08, 0x18, + 0xDC, 0x44, 0xD4, 0x30, 0xC6, 0x59, 0xE3, 0x4B, 0xDF, 0x57, 0xB8, 0x4F, + 0x31, 0x45, 0x42, 0x3B, 0x87, 0x49, 0x8F, 0x36, 0x24, 0x4A, 0x07, 0x34, + 0x74, 0x38, 0x4E, 0x2B, 0x39, 0x30, 0xF5, 0x29, 0x49, 0x2B, 0xF3, 0x22, + 0x30, 0x24, 0x84, 0x29, 0xF9, 0x0C, 0x88, 0x2C, 0x52, 0xED, 0x28, 0x1F, + 0x50, 0xE9, 0x35, 0x21, 0x10, 0xEE, 0xB2, 0x26, 0xB4, 0xDF, 0x50, 0x17, + 0xB7, 0xE3, 0xC8, 0x12, 0x4D, 0xFD, 0xA7, 0x1B, 0x72, 0x01, 0xF0, 0x0F, + 0xBD, 0x00, 0x0B, 0x09, 0xCA, 0x10, 0x2D, 0x15, 0x14, 0x13, 0x31, 0x17, + 0xCB, 0xFF, 0x8D, 0x0A, 0xBC, 0xF3, 0x57, 0xFB, 0x14, 0xF3, 0x10, 0xEE, + 0xB1, 0xE5, 0x24, 0xDA, 0xCC, 0xD3, 0xAC, 0xC8, 0x21, 0xDD, 0xC5, 0xD2, + 0xD0, 0xF5, 0xBD, 0xE5, 0xAC, 0x06, 0x6E, 0xEF, 0x48, 0x10, 0x5D, 0xFB, + 0xB3, 0x17, 0x50, 0x09, 0x38, 0x0D, 0x3A, 0x04, 0x97, 0x02, 0x83, 0xFC, + 0xC9, 0x14, 0xA2, 0x0F, 0xD8, 0x21, 0x8B, 0x1E, 0x6E, 0x15, 0xD9, 0x15, + 0x16, 0x0D, 0x65, 0x19, 0x92, 0x03, 0x63, 0x24, 0x7F, 0xEC, 0x0B, 0x17, + 0x44, 0xDF, 0x8F, 0x01, 0x17, 0xD9, 0x63, 0xF7, 0x8E, 0xD5, 0xA3, 0xF4, + 0x7E, 0xDC, 0x55, 0xF7, 0x64, 0xD2, 0x06, 0xF0, 0xBE, 0xBE, 0x2D, 0xE3, + 0x50, 0xC3, 0xC2, 0xE8, 0x73, 0xC5, 0x66, 0xE5, 0xF8, 0xC6, 0x80, 0xD7, + 0x72, 0xDD, 0x3B, 0xDD, 0xA3, 0xE0, 0x5D, 0xDE, 0x20, 0xCC, 0xBA, 0xCF, + 0xB2, 0xCB, 0x43, 0xCF, 0xEC, 0xDE, 0x29, 0xDC, 0x1A, 0xEF, 0x47, 0xDF, + 0x17, 0xF5, 0xBE, 0xD7, 0x58, 0xFE, 0x21, 0xD8, 0xEF, 0x05, 0xA6, 0xDC, + 0x95, 0xF6, 0x18, 0xCF, 0x75, 0xEB, 0x71, 0xC7, 0xE7, 0xF0, 0x97, 0xCD, + 0x2D, 0xF1, 0x31, 0xCB, 0xF0, 0xEA, 0x0B, 0xD1, 0x34, 0xF0, 0x79, 0xED, + 0x79, 0xFB, 0xF4, 0x02, 0x31, 0xFD, 0xDF, 0x05, 0xDB, 0xF9, 0x64, 0x0A, + 0xC0, 0xF2, 0x7B, 0x0C, 0x46, 0xE6, 0x9D, 0x02, 0x01, 0xE3, 0x05, 0xFE, + 0x82, 0xF7, 0xB5, 0x05, 0x87, 0x00, 0xF8, 0x01, 0x0C, 0xF2, 0x39, 0xF8, + 0xE5, 0xE6, 0x8C, 0xF2, 0x3C, 0xD6, 0xEF, 0xE0, 0xC7, 0xCE, 0xB3, 0xD8, + 0x8A, 0xD4, 0x70, 0xE0, 0x2B, 0xC7, 0xAE, 0xD3, 0x9A, 0xC3, 0x30, 0xC5, + 0xBB, 0xD3, 0xEC, 0xC9, 0x9A, 0xCE, 0x70, 0xC7, 0x04, 0xC2, 0xB5, 0xBF, + 0x7A, 0xD1, 0x15, 0xCD, 0xD2, 0xE7, 0xEA, 0xE3, 0xCB, 0xE8, 0x56, 0xEA, + 0x8F, 0xF3, 0x6D, 0xF7, 0x34, 0xFC, 0x64, 0x04, 0x9B, 0xE7, 0x5E, 0xF9, + 0xDC, 0xD8, 0x84, 0xEE, 0x1F, 0xD8, 0xC8, 0xE8, 0x6A, 0xD6, 0x87, 0xE1, + 0xA0, 0xCD, 0x49, 0xDE, 0x97, 0xC9, 0x41, 0xE2, 0xFC, 0xCF, 0x8C, 0xE6, + 0x59, 0xD7, 0xAD, 0xE5, 0xE0, 0xDE, 0xC2, 0xDE, 0x99, 0xE4, 0x63, 0xDB, + 0x6E, 0xF2, 0x65, 0xE5, 0xED, 0xFE, 0x65, 0xED, 0x46, 0xFE, 0x4D, 0xF1, + 0xB1, 0xFD, 0x97, 0xF9, 0xAC, 0xFC, 0xEE, 0xF5, 0xAA, 0x00, 0x32, 0xE8, + 0x10, 0x04, 0xDD, 0xDF, 0xDB, 0xF7, 0xD6, 0xDC, 0xD4, 0xE5, 0xB0, 0xDC, + 0x64, 0xD4, 0x45, 0xD0, 0x2C, 0xD1, 0xAC, 0xC0, 0x87, 0xE0, 0x8F, 0xC1, + 0x3B, 0xE6, 0xE8, 0xBE, 0xD1, 0xE0, 0xF7, 0xBB, 0x58, 0xEC, 0x6B, 0xCF, + 0xE4, 0xF3, 0x35, 0xE0, 0xE6, 0xE2, 0x02, 0xDE, 0x42, 0xE5, 0xE1, 0xE2, + 0xD5, 0xFA, 0x2E, 0xEB, 0xBF, 0xFC, 0x23, 0xEA, 0x56, 0x04, 0x90, 0xF3, + 0x1D, 0x17, 0xCC, 0x01, 0xF9, 0x12, 0x4D, 0x05, 0xB3, 0x03, 0x97, 0xFF, + 0xD2, 0xFF, 0x03, 0xF4, 0x7E, 0xFE, 0xD8, 0xEC, 0x5B, 0xF2, 0x61, 0xE9, + 0x19, 0xE4, 0x95, 0xE2, 0x69, 0xDE, 0x3C, 0xDF, 0x98, 0xDF, 0x82, 0xE1, + 0xB2, 0xE8, 0xB3, 0xE3, 0xB0, 0xE9, 0x96, 0xE0, 0x0E, 0xE3, 0x5A, 0xEA, + 0x16, 0xE6, 0x2C, 0x05, 0x22, 0xEF, 0x68, 0x0B, 0x3A, 0xF9, 0x3F, 0xFB, + 0x5E, 0x00, 0x0D, 0xF2, 0x6B, 0x03, 0xB4, 0xF8, 0x5E, 0x06, 0x08, 0x04, + 0xE5, 0x05, 0x5B, 0x03, 0xF6, 0x03, 0x77, 0xFE, 0x6B, 0xF5, 0xB5, 0xF9, + 0x07, 0xDA, 0x11, 0xF0, 0x47, 0xD7, 0x8A, 0xF3, 0x30, 0xDB, 0xE5, 0xF3, + 0xCE, 0xC7, 0x0C, 0xD8, 0x13, 0xC4, 0xF9, 0xC5, 0xD6, 0xDB, 0x6C, 0xCF, + 0x9D, 0xDD, 0x0B, 0xC6, 0xF8, 0xD3, 0xE8, 0xB2, 0x32, 0xEA, 0x61, 0xC0, + 0xA4, 0xF9, 0x21, 0xCD, 0x86, 0xEE, 0x73, 0xC5, 0x43, 0xF7, 0x74, 0xD1, + 0xD8, 0x03, 0x63, 0xE2, 0xAE, 0xF3, 0xAC, 0xDB, 0x33, 0xE4, 0x5D, 0xDA, + 0xD6, 0xE3, 0x42, 0xE4, 0x6F, 0xEB, 0x0B, 0xEA, 0x1B, 0xF7, 0xFF, 0xED, + 0x8D, 0xFC, 0x5D, 0xEF, 0x3C, 0xFC, 0xFC, 0xF4, 0x43, 0xF7, 0x44, 0xFB, + 0xAF, 0xED, 0x35, 0xF9, 0xFC, 0xFB, 0xC1, 0xFC, 0x82, 0x1E, 0x37, 0x09, + 0xF6, 0x2D, 0xD3, 0x16, 0xC5, 0x2F, 0x6B, 0x27, 0xF2, 0x2D, 0x07, 0x36, + 0x65, 0x21, 0x3E, 0x3A, 0x57, 0x18, 0x5E, 0x39, 0x2F, 0x1E, 0xA7, 0x3A, + 0xF1, 0x23, 0x2F, 0x3D, 0xA2, 0x21, 0xE6, 0x3C, 0x8B, 0x19, 0xFB, 0x2A, + 0x91, 0x18, 0x84, 0x13, 0x99, 0x26, 0xF7, 0x10, 0x04, 0x24, 0xDD, 0x0A, + 0xC5, 0x0E, 0x21, 0xFC, 0x5C, 0x12, 0x1E, 0x07, 0x44, 0x20, 0xC9, 0x15, + 0x42, 0x0D, 0x36, 0x04, 0x19, 0xF7, 0x04, 0xF8, 0x76, 0xFE, 0xE1, 0x04, + 0x1A, 0x05, 0xCD, 0x03, 0xB0, 0x01, 0x75, 0xF8, 0x8A, 0x12, 0x4F, 0x00, + 0x15, 0x26, 0x8C, 0x07, 0x6A, 0x16, 0x25, 0xFA, 0x2A, 0x06, 0x3C, 0xEB, + 0x68, 0x09, 0xBD, 0xE6, 0x86, 0xFE, 0x65, 0xE5, 0x13, 0xEE, 0xE1, 0xE6, + 0xEF, 0xF1, 0xF1, 0xF1, 0x6A, 0xFB, 0xBB, 0xFC, 0x1C, 0x01, 0x6C, 0xFC, + 0x23, 0x06, 0xA3, 0xF3, 0x53, 0x07, 0x96, 0xF7, 0x90, 0x06, 0x2F, 0x02, + 0x9D, 0x0A, 0x28, 0x08, 0xD1, 0x14, 0xC3, 0x13, 0x33, 0x15, 0x63, 0x13, + 0xB3, 0x0E, 0x48, 0x0F, 0x4D, 0x05, 0xE8, 0x15, 0x1A, 0xFE, 0x43, 0x19, + 0xE9, 0x01, 0x6F, 0x13, 0x33, 0xFB, 0x4D, 0x06, 0x0F, 0xE5, 0x00, 0xF6, + 0x4B, 0xD8, 0x7E, 0xEE, 0xFB, 0xD3, 0x45, 0xEE, 0x0E, 0xBB, 0xFD, 0xDA, + 0x98, 0xAE, 0x9C, 0xC7, 0x1D, 0xCB, 0x65, 0xCF, 0x4C, 0xD8, 0x64, 0xD3, + 0x4A, 0xD0, 0x5E, 0xCF, 0xE3, 0xDC, 0x38, 0xD9, 0x53, 0xED, 0x8E, 0xE1, + 0xF8, 0xF0, 0x71, 0xE2, 0x3A, 0xFE, 0x2F, 0xE6, 0x98, 0x11, 0x58, 0xE6, + 0x1A, 0x14, 0xE9, 0xDC, 0x14, 0x0A, 0x51, 0xDC, 0xCC, 0xF6, 0x3B, 0xEA, + 0x99, 0xDC, 0x69, 0xF7, 0xD1, 0xD3, 0x67, 0xFD, 0xF4, 0xE5, 0x40, 0xFC, + 0xA8, 0x02, 0xD4, 0xFD, 0x65, 0x0F, 0x98, 0x02, 0x88, 0x10, 0x9D, 0x09, + 0x17, 0x20, 0xA5, 0x13, 0xF0, 0x2F, 0x02, 0x19, 0x68, 0x30, 0xCF, 0x1E, + 0x53, 0x2F, 0x48, 0x27, 0x1C, 0x36, 0xEF, 0x2D, 0x3A, 0x38, 0x03, 0x33, + 0x45, 0x30, 0x49, 0x33, 0x22, 0x2F, 0x43, 0x30, 0xAE, 0x2D, 0x7F, 0x28, + 0x8F, 0x1E, 0x87, 0x1F, 0x54, 0x05, 0xD7, 0x13, 0x7B, 0xF2, 0xB2, 0x02, + 0x5E, 0xFC, 0xB8, 0xFA, 0xE8, 0x04, 0x51, 0xF3, 0x7C, 0xF8, 0xAF, 0xE6, + 0x04, 0xFD, 0x3C, 0xEC, 0x0F, 0x0D, 0x83, 0xFB, 0x1B, 0x04, 0x52, 0xF9, + 0x31, 0xF9, 0x92, 0xF3, 0x18, 0x01, 0x0D, 0xFE, 0xA6, 0x00, 0x33, 0x06, + 0x70, 0xFF, 0xEB, 0x06, 0x6C, 0x14, 0xF2, 0x12, 0xDF, 0x24, 0x68, 0x27, + 0xA8, 0x13, 0x4B, 0x2B, 0x71, 0x00, 0xF5, 0x23, 0xA1, 0x07, 0xC9, 0x24, + 0x67, 0x0F, 0x5B, 0x1D, 0x75, 0x0C, 0xA3, 0x0D, 0x9E, 0x16, 0xA9, 0x0D, + 0x42, 0x21, 0x47, 0x18, 0x5C, 0x12, 0x96, 0x14, 0xB8, 0x09, 0x6D, 0x14, + 0x5B, 0x18, 0x13, 0x28, 0x66, 0x1E, 0x87, 0x37, 0xF8, 0x21, 0xF6, 0x3F, + 0xBC, 0x3F, 0x27, 0x52, 0xEA, 0x57, 0x4C, 0x56, 0x07, 0x55, 0xA7, 0x47, + 0x01, 0x50, 0xD3, 0x51, 0x6A, 0x46, 0xD7, 0x5E, 0x66, 0x43, 0x23, 0x53, + 0x4E, 0x58, 0x43, 0x4C, 0x51, 0x58, 0xC5, 0x42, 0xA2, 0x42, 0xFF, 0x2F, + 0x74, 0x41, 0xCD, 0x2F, 0x81, 0x38, 0x09, 0x2F, 0x59, 0x1A, 0x3E, 0x1E, + 0xEF, 0x1E, 0xC1, 0x2A, 0xF4, 0x37, 0x29, 0x3F, 0xD1, 0x36, 0x2D, 0x2E, + 0x39, 0x34, 0xC1, 0x1A, 0x3E, 0x3B, 0xD2, 0x1E, 0x91, 0x34, 0x93, 0x26, + 0x9F, 0x24, 0xAE, 0x2C, 0xA9, 0x28, 0xD5, 0x41, 0x32, 0x2F, 0x4C, 0x4D, + 0xEE, 0x22, 0x9D, 0x3A, 0x3F, 0x1F, 0x66, 0x30, 0xDF, 0x19, 0x8A, 0x33, + 0x83, 0x01, 0x81, 0x24, 0xFC, 0xF8, 0xC8, 0x13, 0xC7, 0x05, 0xDD, 0x15, + 0x44, 0x0B, 0x39, 0x1A, 0x50, 0x03, 0x3B, 0x11, 0xFA, 0xFD, 0x87, 0x0B, + 0x38, 0x0E, 0x0E, 0x1A, 0xF0, 0x29, 0x5A, 0x2D, 0x44, 0x32, 0x8C, 0x38, + 0xCE, 0x2E, 0x2A, 0x42, 0xCC, 0x30, 0x9A, 0x43, 0x67, 0x2A, 0xCC, 0x33, + 0x1B, 0x24, 0x61, 0x26, 0x05, 0x23, 0x70, 0x1C, 0x08, 0x18, 0x29, 0x0F, + 0x11, 0x0C, 0x52, 0x0A, 0xFF, 0x09, 0x7D, 0x07, 0x7B, 0x11, 0x8A, 0x08, + 0xCF, 0x1C, 0x31, 0x10, 0x8A, 0x15, 0xE6, 0x06, 0x2C, 0x04, 0x81, 0xF7, + 0x3E, 0x0E, 0x0B, 0x09, 0x62, 0x16, 0x31, 0x1A, 0x7D, 0x00, 0xC5, 0x10, + 0x7E, 0xF1, 0x3E, 0x0F, 0xFF, 0xF6, 0xE5, 0x14, 0xF3, 0xF6, 0xD4, 0x0B, + 0xF4, 0xF3, 0xE5, 0x06, 0xA4, 0x04, 0x8B, 0x1E, 0x85, 0x0B, 0x62, 0x26, + 0xD9, 0xFF, 0x03, 0x1A, 0xD8, 0xFF, 0xA9, 0x1C, 0x20, 0x01, 0x26, 0x1C, + 0xEE, 0xEF, 0xCD, 0x0C, 0xF4, 0xD4, 0xB5, 0x00, 0x45, 0xD6, 0xB4, 0x06, + 0x1E, 0xEE, 0x9E, 0x10, 0x26, 0xF1, 0x3E, 0x0C, 0x0B, 0xF5, 0x5F, 0x08, + 0x14, 0x08, 0xD7, 0x08, 0xFA, 0x0D, 0x99, 0x03, 0x89, 0x0E, 0xC6, 0x03, + 0xAF, 0x1B, 0x85, 0x05, 0x39, 0x25, 0xCF, 0xFB, 0xBF, 0x2B, 0x3B, 0xF5, + 0x0D, 0x35, 0xC0, 0xF9, 0x43, 0x3A, 0x0D, 0x00, 0x47, 0x34, 0xF4, 0x03, + 0x18, 0x1C, 0x6F, 0x01, 0xC2, 0xFB, 0xD4, 0xF2, 0xF8, 0xF3, 0x43, 0xED, + 0xB0, 0x02, 0x26, 0xF9, 0x40, 0xF6, 0xC2, 0xED, 0xB1, 0xE3, 0xEC, 0xE0, + 0xAA, 0xE7, 0x5C, 0xF6, 0x7F, 0xDF, 0x5F, 0xFB, 0x02, 0xD2, 0x92, 0xE9, + 0x1C, 0xDE, 0x2C, 0xF8, 0x2E, 0xE6, 0x64, 0x0B, 0xAB, 0xE3, 0xCC, 0x01, + 0xC8, 0xF5, 0x04, 0x08, 0x93, 0x09, 0x95, 0x20, 0x56, 0xFC, 0x22, 0x16, + 0x5E, 0xE9, 0xC0, 0xFE, 0xEA, 0xE5, 0x80, 0x00, 0x0B, 0xE3, 0x13, 0x03, + 0x6A, 0xE6, 0xE5, 0xFA, 0x49, 0xEC, 0x03, 0xF0, 0xED, 0xEB, 0xAB, 0xEC, + 0xC6, 0xE2, 0xDD, 0xE6, 0x55, 0xE2, 0xF7, 0xE1, 0x10, 0xE7, 0xA2, 0xE3, + 0x54, 0xE6, 0x26, 0xEC, 0x90, 0xEF, 0x22, 0xFC, 0x27, 0x07, 0xE7, 0x0E, + 0xBA, 0x12, 0x15, 0x1B, 0x67, 0xFE, 0x63, 0x12, 0x9B, 0xEC, 0x52, 0x0A, + 0x7F, 0xE3, 0x4F, 0x05, 0x3A, 0xD7, 0x88, 0xFA, 0xDC, 0xDA, 0x10, 0xF9, + 0x21, 0xDC, 0xC0, 0xF3, 0x1D, 0xCA, 0x62, 0xDF, 0x45, 0xC9, 0xDF, 0xD2, + 0xD0, 0xD6, 0xE5, 0xCC, 0xEE, 0xCF, 0x90, 0xC1, 0x1E, 0xC4, 0xF5, 0xC0, + 0xA7, 0xCA, 0xE2, 0xD2, 0x5C, 0xC3, 0x23, 0xDB, 0xF6, 0xB0, 0xDD, 0xD2, + 0xA3, 0xBF, 0x4C, 0xD7, 0x0C, 0xDC, 0xE3, 0xE0, 0xB5, 0xEA, 0x29, 0xDF, + 0xFF, 0xFE, 0x9C, 0xE4, 0x22, 0x14, 0x03, 0xF3, 0xA9, 0x15, 0xA5, 0xF0, + 0x53, 0x0D, 0x1D, 0xDE, 0x9F, 0x09, 0xDC, 0xDB, 0xF9, 0x08, 0x85, 0xE8, + 0x91, 0xFE, 0x25, 0xE8, 0xE2, 0xF3, 0xE4, 0xE4, 0x45, 0xF3, 0xF8, 0xEB, + 0xE3, 0xF0, 0x3E, 0xEE, 0xD1, 0xE6, 0xD8, 0xEC, 0x18, 0xEB, 0x70, 0xF1, + 0x62, 0x00, 0xC7, 0xF7, 0x43, 0x14, 0x33, 0x07, 0x47, 0x1D, 0x16, 0x19, + 0xA4, 0x1A, 0x1D, 0x15, 0x46, 0x13, 0x45, 0x06, 0x2A, 0x10, 0xDE, 0x08, + 0xA6, 0x0B, 0x68, 0x15, 0x18, 0xFB, 0xC7, 0x14, 0xC6, 0xFA, 0x05, 0x16, + 0x81, 0xF8, 0x12, 0x0E, 0x37, 0xD9, 0xD3, 0xF1, 0x0F, 0xD1, 0xD0, 0xED, + 0xC8, 0xCF, 0xD3, 0xEA, 0xD1, 0xB9, 0x7B, 0xD8, 0x9E, 0xBE, 0xF7, 0xDC, + 0x0B, 0xDE, 0x0D, 0xE4, 0x1A, 0xF0, 0xDA, 0xD7, 0xA1, 0xF5, 0x85, 0xD1, + 0x1A, 0xFA, 0x0D, 0xD7, 0xD3, 0xF8, 0xD8, 0xDC, 0x1B, 0xF4, 0x53, 0xEB, + 0xA2, 0xF4, 0xA1, 0x01, 0xD9, 0xF6, 0x02, 0x0A, 0x3C, 0xF5, 0xBE, 0x03, + 0xC0, 0xEB, 0x9D, 0xF5, 0xCB, 0xE3, 0x05, 0xEA, 0x07, 0xE8, 0xA7, 0xEC, + 0x14, 0xE4, 0x1C, 0xEA, 0xF7, 0xDC, 0xE3, 0xDB, 0x79, 0xEE, 0x1A, 0xDD, + 0x27, 0x00, 0xD8, 0xDF, 0xDA, 0xFF, 0x74, 0xD9, 0x24, 0x07, 0x7C, 0xE3, + 0x32, 0x12, 0xE0, 0xF3, 0x6E, 0x15, 0x01, 0xF9, 0x1F, 0x19, 0x8E, 0x04, + 0x45, 0x19, 0x31, 0x19, 0xD6, 0x08, 0x8A, 0x1E, 0x3C, 0xFB, 0x35, 0x1D, + 0xBF, 0x03, 0x7C, 0x24, 0xFD, 0x0E, 0x78, 0x22, 0xB3, 0x0E, 0xC4, 0x13, + 0x5F, 0x06, 0x67, 0x02, 0x31, 0xF2, 0x2F, 0xE8, 0x1F, 0xEC, 0x9B, 0xE0, + 0xDC, 0x01, 0x51, 0xF5, 0x25, 0xFE, 0x86, 0xEA, 0x42, 0xF6, 0xA7, 0xDF, + 0x2C, 0x0A, 0x6B, 0xFC, 0x17, 0x00, 0x87, 0xFD, 0xA2, 0xE1, 0x3D, 0xEB, + 0x76, 0xE3, 0x30, 0xF8, 0x86, 0xF1, 0x09, 0x00, 0x9A, 0xF7, 0xC9, 0xF2, + 0xE2, 0x0E, 0x8B, 0x02, 0xDE, 0x22, 0x6D, 0x18, 0x7B, 0x10, 0x44, 0x06, + 0x94, 0xFF, 0xBE, 0xFB, 0x0B, 0x05, 0xFF, 0x05, 0x6C, 0x04, 0xFE, 0xF7, + 0x65, 0xFE, 0x45, 0xE5, 0xDB, 0xFC, 0xAC, 0xEA, 0x84, 0xF7, 0xB3, 0xF3, + 0x49, 0xED, 0xCB, 0xF5, 0x82, 0xDD, 0x42, 0xEB, 0xAD, 0xD9, 0xDF, 0xDB, + 0x91, 0xEB, 0xCF, 0xDE, 0x43, 0xF9, 0xBA, 0xE7, 0xF4, 0x05, 0x1C, 0xEF, + 0x2C, 0x1B, 0x4F, 0xFA, 0x9F, 0x1E, 0x2F, 0xF7, 0x50, 0x19, 0x67, 0xED, + 0x5F, 0x1A, 0x1E, 0xF1, 0x2D, 0x14, 0x13, 0xF2, 0x58, 0x09, 0x10, 0xE7, + 0x44, 0xF9, 0xB5, 0xD8, 0x01, 0xDE, 0x36, 0xCB, 0x83, 0xD1, 0xF5, 0xCA, + 0x2F, 0xD9, 0xBE, 0xDC, 0x10, 0xCC, 0xFF, 0xDA, 0xA5, 0xB6, 0x78, 0xC2, + 0x6B, 0xBF, 0xDA, 0xC3, 0xAF, 0xC0, 0xAB, 0xCF, 0x7E, 0xB3, 0xC5, 0xCF, + 0x24, 0xC5, 0x3B, 0xDD, 0xFA, 0xE1, 0xBF, 0xEF, 0x99, 0xE5, 0x43, 0xED, + 0x32, 0xE6, 0x9F, 0xF1, 0x24, 0xEF, 0xCA, 0x02, 0x58, 0xE3, 0x66, 0xF1, + 0xF1, 0xD5, 0xF3, 0xD5, 0x39, 0xD9, 0x58, 0xDB, 0xAA, 0xD5, 0x8B, 0xE1, + 0x8A, 0xCF, 0xA2, 0xD7, 0x94, 0xCF, 0x89, 0xC9, 0x71, 0xD8, 0xCC, 0xC2, + 0x9E, 0xEC, 0x27, 0xCD, 0x24, 0xF3, 0x7E, 0xD2, 0x8F, 0xF4, 0x0D, 0xD0, + 0x2E, 0x07, 0xAA, 0xD6, 0x97, 0x17, 0xC1, 0xDD, 0xAC, 0x23, 0x13, 0xE7, + 0x47, 0x33, 0x12, 0xFF, 0xA7, 0x2C, 0x7F, 0x12, 0x2F, 0x0C, 0x58, 0x0F, + 0xCB, 0xF8, 0xFD, 0x0C, 0xDD, 0xEE, 0xDD, 0x0A, 0x6A, 0xE4, 0x01, 0xFF, + 0x9A, 0xE7, 0xE2, 0xF3, 0x45, 0xED, 0xD4, 0xEA, 0x69, 0xE8, 0x5A, 0xE1, + 0xED, 0xED, 0x63, 0xEE, 0xA5, 0xED, 0x82, 0xFE, 0x45, 0xD7, 0xF8, 0xF2, + 0x21, 0xE3, 0xB1, 0xF6, 0x31, 0xFF, 0x25, 0x05, 0x9E, 0xF7, 0x1A, 0xFC, + 0xA6, 0xEE, 0xA3, 0xF5, 0x91, 0xF1, 0xD9, 0xF0, 0x8B, 0xE3, 0x30, 0xD9, + 0x6D, 0xDE, 0xE3, 0xD8, 0x8D, 0xF1, 0xA2, 0xF7, 0xD6, 0xF6, 0x33, 0xFD, + 0x5B, 0xF2, 0x96, 0xEB, 0xF2, 0xFF, 0x88, 0xE9, 0x59, 0x07, 0x87, 0xE5, + 0x90, 0xF9, 0xC9, 0xD9, 0x07, 0xEB, 0xB5, 0xDB, 0xC7, 0xE4, 0x9A, 0xE5, + 0x85, 0xF5, 0x4E, 0xF8, 0xAD, 0x0C, 0x2A, 0x08, 0x95, 0x16, 0x34, 0x0F, + 0xF9, 0x1F, 0xA1, 0x20, 0xC7, 0x1D, 0x97, 0x29, 0x55, 0x14, 0xA2, 0x22, + 0xC8, 0x1F, 0xEB, 0x26, 0x3B, 0x2D, 0x04, 0x2C, 0x59, 0x2A, 0xEA, 0x2B, + 0x6A, 0x22, 0xA0, 0x32, 0x1E, 0x1B, 0xDD, 0x37, 0xBA, 0x10, 0x0E, 0x33, + 0x15, 0x04, 0x8C, 0x2D, 0x3F, 0xFC, 0x80, 0x24, 0xE6, 0xF9, 0x49, 0x0C, + 0xEC, 0x0A, 0x8E, 0x02, 0x7D, 0x26, 0x8F, 0x0F, 0x4B, 0x23, 0xA8, 0x0A, + 0x35, 0x10, 0x33, 0x02, 0x38, 0x16, 0xB2, 0x16, 0x11, 0x16, 0x37, 0x18, + 0x37, 0x0A, 0x1D, 0x04, 0x42, 0x1B, 0x46, 0x0F, 0x49, 0x29, 0x1E, 0x1E, + 0xDB, 0x23, 0x01, 0x1E, 0x2B, 0x33, 0xDD, 0x2C, 0x69, 0x52, 0xBF, 0x3C, + 0x7C, 0x60, 0x29, 0x39, 0x13, 0x58, 0xA5, 0x2D, 0xE1, 0x4A, 0xFD, 0x2A, + 0x18, 0x3C, 0x2B, 0x2A, 0x65, 0x2C, 0x09, 0x23, 0xF2, 0x21, 0xDE, 0x1F, + 0x6B, 0x19, 0x4D, 0x24, 0x0B, 0x1A, 0x15, 0x2D, 0x3A, 0x2A, 0x37, 0x37, + 0x57, 0x35, 0xB6, 0x3C, 0xDE, 0x31, 0xC8, 0x38, 0x41, 0x36, 0x0C, 0x3C, + 0xFB, 0x3F, 0x50, 0x4A, 0xED, 0x41, 0x7D, 0x51, 0x1C, 0x43, 0x79, 0x49, + 0xEE, 0x3E, 0x86, 0x3B, 0xB4, 0x36, 0xE7, 0x35, 0x6C, 0x31, 0xC4, 0x2E, + 0xBE, 0x29, 0x46, 0x1F, 0x86, 0x25, 0x04, 0x1D, 0x6F, 0x18, 0x0C, 0x19, + 0xC2, 0x06, 0x88, 0x0C, 0x07, 0x08, 0x07, 0x0C, 0x02, 0x03, 0x09, 0xFC, + 0xBF, 0xEA, 0xCA, 0xD8, 0x1F, 0xED, 0x00, 0xDD, 0x55, 0xFC, 0x04, 0xFB, + 0xDC, 0xEE, 0x39, 0x00, 0x99, 0xEC, 0x77, 0x05, 0x59, 0x02, 0x8D, 0x0E, + 0x52, 0x05, 0xB2, 0xFF, 0xFF, 0x00, 0x17, 0xF5, 0xCE, 0x12, 0xC1, 0x08, + 0x21, 0x1B, 0xA6, 0x1A, 0x86, 0x11, 0x25, 0x21, 0x3E, 0x07, 0xF2, 0x1F, + 0x12, 0xFB, 0x6D, 0x12, 0x38, 0xF9, 0xE9, 0x11, 0xEB, 0xFB, 0x6C, 0x19, + 0x9E, 0xFB, 0x40, 0x19, 0xE8, 0x00, 0x49, 0x19, 0xB0, 0xFF, 0xD2, 0x12, + 0xA5, 0xFE, 0xA6, 0x10, 0x39, 0x0E, 0x97, 0x20, 0x9B, 0x24, 0x50, 0x35, + 0x80, 0x2D, 0x98, 0x3E, 0x1F, 0x29, 0xBB, 0x41, 0x8D, 0x1F, 0x8F, 0x41, + 0xDE, 0x0A, 0x75, 0x30, 0x35, 0xFE, 0xC4, 0x1B, 0xF1, 0x03, 0xAD, 0x12, + 0xDC, 0x04, 0xBA, 0x0B, 0x33, 0x05, 0x49, 0x0C, 0x1E, 0x0E, 0x91, 0x0D, + 0xD4, 0x09, 0x7A, 0xF7, 0x90, 0x03, 0x67, 0xE5, 0x89, 0x09, 0xCF, 0xED, + 0xC0, 0xFE, 0x07, 0xEE, 0x9E, 0xF7, 0xEC, 0xEF, 0xDD, 0x04, 0x9D, 0xFD, + 0x03, 0x07, 0x54, 0xF9, 0x79, 0x01, 0x31, 0xEE, 0x64, 0x08, 0x3F, 0xF0, + 0x17, 0x0E, 0xBC, 0xF0, 0x3B, 0x03, 0x21, 0xE8, 0xF8, 0x02, 0xA9, 0xF6, + 0xB2, 0x0F, 0x41, 0x12, 0xE7, 0x07, 0xC8, 0x10, 0x5D, 0xF6, 0xD8, 0x04, + 0x54, 0xE9, 0x62, 0xFA, 0x8A, 0xDB, 0x0C, 0xE2, 0x3A, 0xE2, 0x5C, 0xDF, + 0x4F, 0xEE, 0x43, 0xF4, 0x8C, 0xEF, 0x94, 0xFF, 0x40, 0xF7, 0x8F, 0x07, + 0x27, 0xF2, 0x2C, 0x06, 0x6D, 0xE7, 0xD9, 0x01, 0xC0, 0xF1, 0x1F, 0x08, + 0xFA, 0xF8, 0xD4, 0x07, 0xE6, 0xF9, 0xD7, 0x04, 0x8C, 0x07, 0x1C, 0x10, + 0x96, 0x0C, 0x5D, 0x19, 0xA0, 0x01, 0xC2, 0x18, 0xBD, 0x01, 0x33, 0x1B, + 0x21, 0x0E, 0x6F, 0x20, 0x1B, 0x0E, 0x0D, 0x20, 0x42, 0x0B, 0x38, 0x28, + 0x14, 0x05, 0xDC, 0x2B, 0xF1, 0xED, 0xB7, 0x14, 0x5F, 0xE9, 0x0F, 0x0C, + 0xD5, 0xF7, 0x84, 0x12, 0x7C, 0xE8, 0x10, 0xF5, 0x20, 0xDE, 0xB6, 0xE2, + 0x5D, 0xF6, 0x17, 0x00, 0x74, 0xF7, 0x35, 0x03, 0x72, 0xE8, 0x7C, 0xED, + 0x79, 0xF2, 0x07, 0xF4, 0xF3, 0xF8, 0x22, 0xF7, 0x07, 0xFB, 0x0B, 0xEF, + 0xE3, 0x1C, 0x75, 0x0A, 0xF8, 0x31, 0x18, 0x24, 0x7F, 0x1B, 0x11, 0x13, + 0xCE, 0x10, 0xCF, 0x07, 0xF3, 0x12, 0xF4, 0x06, 0xD9, 0xFE, 0x04, 0xF4, + 0x38, 0xEE, 0xF1, 0xE6, 0x31, 0xF2, 0xFE, 0xE9, 0xDE, 0xFB, 0x45, 0xED, + 0xFF, 0x0B, 0xCC, 0xF6, 0xFB, 0x17, 0x43, 0x03, 0xF5, 0x16, 0x85, 0x0D, + 0x36, 0x19, 0x7A, 0x19, 0xC7, 0x27, 0xFF, 0x22, 0x8D, 0x3A, 0x7E, 0x31, + 0x2C, 0x41, 0x6C, 0x3E, 0xB5, 0x39, 0xBB, 0x35, 0x4B, 0x2D, 0xFB, 0x1F, + 0xAF, 0x17, 0x3C, 0x0E, 0x0A, 0x03, 0xC4, 0x04, 0xB6, 0xFB, 0xF4, 0x02, + 0x0C, 0x05, 0x6B, 0x10, 0x0A, 0x06, 0xD2, 0x12, 0xD2, 0xF0, 0xDA, 0xFB, + 0x37, 0xEC, 0x19, 0xFB, 0x6A, 0xEA, 0x2A, 0xFB, 0x64, 0xD3, 0x94, 0xDE, + 0x41, 0xCD, 0x9E, 0xDA, 0xAC, 0xE5, 0x4F, 0xF8, 0x25, 0xF1, 0x00, 0xFF, + 0x3E, 0xE7, 0x55, 0xF3, 0x2B, 0xE2, 0x18, 0xF3, 0x2B, 0xDB, 0x31, 0xE4, + 0xD8, 0xDC, 0xD1, 0xD8, 0xA9, 0xF6, 0x58, 0xF3, 0x6A, 0x00, 0x0F, 0x04, + 0x2E, 0xEF, 0xAA, 0xF5, 0xD3, 0xE7, 0x6A, 0xF2, 0x36, 0xDF, 0x49, 0xF3, + 0x6F, 0xCC, 0x99, 0xEE, 0x8E, 0xC8, 0xB9, 0xF5, 0xA9, 0xD0, 0x4F, 0xF9, + 0x88, 0xE3, 0xBD, 0xFC, 0x03, 0xF9, 0xC8, 0x04, 0xBA, 0x01, 0x1D, 0x00, + 0xDE, 0x0B, 0xF8, 0xFA, 0xCC, 0x10, 0xAA, 0xF9, 0xE1, 0x0E, 0xFC, 0xF8, + 0x9D, 0x19, 0x0B, 0x02, 0xE8, 0x20, 0x94, 0x08, 0x03, 0x16, 0xAE, 0x02, + 0x33, 0x0A, 0xC1, 0xF8, 0x5A, 0x06, 0x7A, 0xF0, 0xDB, 0x09, 0x3C, 0xF0, + 0x8E, 0x0B, 0xC1, 0xF3, 0x3F, 0x07, 0xAB, 0xFA, 0xF6, 0xF8, 0x45, 0xFD, + 0xD9, 0xE9, 0xAF, 0xF6, 0x1D, 0xF3, 0x20, 0xFE, 0xA4, 0xF3, 0x96, 0x00, + 0xF0, 0xDD, 0xB8, 0xF1, 0xC2, 0xDA, 0x27, 0xEF, 0x29, 0xDF, 0x5C, 0xEB, + 0x36, 0xD8, 0xA1, 0xDB, 0x14, 0xE3, 0xD2, 0xE4, 0x06, 0xFC, 0x95, 0x00, + 0x73, 0xFF, 0x52, 0x00, 0xBA, 0x04, 0x29, 0xFC, 0xAE, 0x23, 0x50, 0x16, + 0xDD, 0x30, 0x6A, 0x21, 0xB0, 0x20, 0x83, 0x0D, 0x9C, 0x10, 0x67, 0xFD, + 0x0D, 0x02, 0x27, 0xF5, 0xFA, 0xF5, 0x8B, 0xF2, 0xEF, 0xF6, 0x16, 0xFC, + 0xEB, 0x00, 0xCB, 0x06, 0xC8, 0x04, 0x74, 0x09, 0x09, 0x02, 0x42, 0x0B, + 0x40, 0x03, 0x04, 0x07, 0xEC, 0x09, 0x2D, 0xFC, 0xB0, 0x09, 0x69, 0xFD, + 0x30, 0x09, 0xAF, 0x0E, 0xC0, 0x11, 0x6D, 0x16, 0xA9, 0x17, 0x69, 0x0F, + 0xCC, 0x11, 0x22, 0x07, 0x2A, 0x04, 0x10, 0xF9, 0x99, 0xFC, 0x64, 0xF1, + 0xB7, 0xF0, 0xC4, 0xEF, 0x3A, 0xE2, 0xF5, 0xE4, 0xB9, 0xE5, 0xFB, 0xDB, + 0x05, 0xE4, 0x2E, 0xD4, 0xA8, 0xCF, 0x37, 0xCB, 0xB6, 0xC2, 0x5F, 0xCB, + 0x23, 0xBE, 0xA3, 0xC9, 0xB4, 0xB8, 0x09, 0xBF, 0xDF, 0xB7, 0x09, 0xBA, + 0x4D, 0xBB, 0x13, 0xBD, 0xED, 0xBF, 0xC6, 0xBD, 0xB3, 0xCE, 0xD7, 0xC2, + 0xC4, 0xE8, 0x25, 0xD4, 0x73, 0xEE, 0xF4, 0xDA, 0x75, 0xE1, 0xF1, 0xDD, + 0x0B, 0xE6, 0x4F, 0xF5, 0xFA, 0xE9, 0x38, 0xFB, 0x0C, 0xDB, 0x64, 0xE5, + 0xD6, 0xD3, 0x7C, 0xDF, 0x7F, 0xD0, 0xBA, 0xDD, 0xD4, 0xC5, 0x40, 0xCE, + 0x9C, 0xBF, 0x49, 0xC9, 0x43, 0xBD, 0x5F, 0xCD, 0x3C, 0xC0, 0x95, 0xD0, + 0x69, 0xC8, 0xFF, 0xD4, 0xCE, 0xD5, 0x98, 0xD9, 0x30, 0xE4, 0x6F, 0xD2, + 0xD4, 0xEB, 0x19, 0xC4, 0xFF, 0xF1, 0x78, 0xC7, 0x62, 0xF3, 0x3B, 0xCF, + 0x87, 0xF8, 0xA1, 0xCF, 0xB3, 0x00, 0x5B, 0xCF, 0x41, 0xF5, 0x82, 0xC9, + 0x9A, 0xE5, 0xF8, 0xC7, 0xA2, 0xE1, 0x9C, 0xD2, 0x06, 0xD2, 0xD9, 0xD4, + 0x0E, 0xC7, 0x73, 0xD2, 0x3E, 0xD0, 0xA4, 0xD0, 0x21, 0xD0, 0x56, 0xCA, + 0x68, 0xC9, 0x1A, 0xCD, 0x4A, 0xC5, 0x13, 0xC7, 0x7D, 0xBD, 0x99, 0xB3, + 0x04, 0xBF, 0x88, 0xBB, 0xAC, 0xC8, 0x13, 0xD4, 0x3F, 0xC3, 0x6E, 0xD3, + 0x92, 0xB9, 0xCA, 0xCE, 0x7B, 0xCD, 0x8A, 0xE3, 0x28, 0xDE, 0xC8, 0xE6, + 0x18, 0xD9, 0xB3, 0xDC, 0x3B, 0xE9, 0x6E, 0xF8, 0xC0, 0xF4, 0x18, 0x05, + 0x4B, 0xE6, 0xD9, 0xEA, 0x3A, 0xEA, 0x94, 0xE6, 0xFB, 0xF5, 0x49, 0xE9, + 0x55, 0xE9, 0x17, 0xD4, 0xEF, 0xE2, 0xF2, 0xCF, 0x70, 0xEF, 0xF2, 0xDD, + 0xCE, 0xF5, 0x40, 0xDF, 0x4E, 0xF7, 0x0A, 0xE4, 0x01, 0x00, 0x1A, 0xF0, + 0x95, 0x06, 0x30, 0xEB, 0x66, 0x0F, 0x4B, 0xEB, 0x7C, 0x22, 0x7F, 0x04, + 0x64, 0x2B, 0x2E, 0x12, 0x02, 0x32, 0x1A, 0x18, 0xC9, 0x3D, 0x73, 0x23, + 0x31, 0x38, 0x88, 0x1B, 0x03, 0x28, 0x8A, 0x10, 0xE2, 0x18, 0x30, 0x16, + 0x8A, 0x01, 0xAF, 0x14, 0x1D, 0xEE, 0xB3, 0x11, 0x79, 0xE1, 0xFF, 0x13, + 0x12, 0xE0, 0x75, 0x0E, 0xA8, 0xF8, 0xCF, 0x0A, 0x39, 0x01, 0x32, 0x00, + 0x30, 0xF4, 0xE5, 0xF8, 0xCF, 0xF9, 0x62, 0x04, 0x72, 0x07, 0x88, 0x0B, + 0x6D, 0x07, 0xE0, 0x08, 0x7E, 0x09, 0xD5, 0x12, 0x43, 0x1B, 0xF5, 0x25, + 0xB3, 0x25, 0xA1, 0x22, 0x59, 0x28, 0x52, 0x1C, 0xD6, 0x36, 0x3B, 0x35, + 0x3A, 0x38, 0xD1, 0x42, 0x83, 0x2A, 0xEB, 0x30, 0xFF, 0x32, 0x4C, 0x2B, + 0xA0, 0x41, 0x96, 0x2B, 0x0A, 0x3E, 0x74, 0x1E, 0xE2, 0x3B, 0xB5, 0x1B, + 0x15, 0x3E, 0x87, 0x21, 0xF2, 0x37, 0x49, 0x1B, 0xF6, 0x36, 0xEA, 0x18, + 0xFB, 0x3D, 0x71, 0x24, 0xB8, 0x3C, 0x76, 0x31, 0x75, 0x3C, 0xF7, 0x40, + 0x3D, 0x42, 0xE0, 0x49, 0x30, 0x3F, 0xF8, 0x45, 0xE8, 0x33, 0x9E, 0x44, + 0x28, 0x2B, 0xE5, 0x41, 0x7B, 0x1F, 0x8F, 0x2F, 0xF7, 0x1A, 0xF0, 0x29, + 0xC7, 0x22, 0x46, 0x33, 0x1D, 0x19, 0x03, 0x24, 0x01, 0x0A, 0x5E, 0x1A, + 0x1C, 0x02, 0xE8, 0x1E, 0x24, 0xF5, 0x11, 0x08, 0x7C, 0xF8, 0x74, 0xF6, + 0xC5, 0x06, 0x23, 0xFB, 0xA9, 0xFE, 0xA1, 0xEB, 0xA2, 0xF5, 0x7E, 0xDE, + 0x8F, 0xF6, 0x47, 0xE7, 0xE6, 0xE5, 0xC9, 0xDC, 0x69, 0xD8, 0x16, 0xD1, + 0x3C, 0xEB, 0xC5, 0xE7, 0xA9, 0x03, 0x0D, 0xF9, 0xF3, 0x0A, 0xE3, 0xF3, + 0xE6, 0x18, 0xEC, 0x02, 0x9D, 0x2F, 0x3D, 0x18, 0x6E, 0x2E, 0x23, 0x0D, + 0xF4, 0x1D, 0xFD, 0x05, 0xCC, 0x15, 0x66, 0x12, 0x93, 0x0C, 0xC7, 0x0F, + 0x00, 0xFF, 0xC0, 0x0B, 0xAB, 0xF7, 0x5C, 0x16, 0x9E, 0xF9, 0x08, 0x16, + 0x58, 0x08, 0x71, 0x11, 0x87, 0x1E, 0x74, 0x1C, 0x77, 0x27, 0x33, 0x23, + 0x61, 0x28, 0x3D, 0x27, 0xF6, 0x2C, 0xDA, 0x31, 0x8F, 0x2C, 0x11, 0x32, + 0x2C, 0x1F, 0x00, 0x28, 0xA2, 0x0C, 0x51, 0x22, 0xA0, 0xFC, 0x83, 0x15, + 0xA2, 0xFA, 0xFD, 0x09, 0x6D, 0x00, 0x75, 0x0E, 0xC8, 0xF4, 0x1E, 0x07, + 0xBF, 0xED, 0x86, 0xF9, 0xFE, 0xF3, 0x19, 0xF2, 0x42, 0xEF, 0x50, 0xE1, + 0x2F, 0xF7, 0xBE, 0xDD, 0x83, 0x09, 0x6A, 0xE2, 0x7D, 0x04, 0x49, 0xD1, + 0x27, 0xFC, 0x86, 0xCB, 0xD5, 0xFB, 0x8D, 0xDB, 0x61, 0xF6, 0x9F, 0xDB, + 0x8F, 0xF0, 0x3B, 0xCD, 0xF7, 0xF7, 0x73, 0xD4, 0x25, 0x03, 0x0B, 0xE6, + 0x8A, 0xFD, 0x4A, 0xE5, 0xD4, 0xF9, 0x62, 0xF4, 0x36, 0xF6, 0xFF, 0x0A, + 0x07, 0xDD, 0xE6, 0xF8, 0x42, 0xCE, 0x87, 0xE5, 0x9E, 0xDD, 0x00, 0xF0, + 0x05, 0xEE, 0x3E, 0xED, 0x70, 0xF6, 0x0C, 0xE0, 0xE3, 0xFB, 0x87, 0xEB, + 0xAE, 0xF0, 0xEE, 0xF8, 0x56, 0xE0, 0xC9, 0xF9, 0x4D, 0xE7, 0xB8, 0x04, + 0x81, 0xFE, 0xE3, 0x12, 0x9D, 0x0B, 0xE0, 0x0F, 0x38, 0x11, 0x3D, 0x0E, + 0x52, 0x13, 0xA6, 0x17, 0xC6, 0x07, 0xD2, 0x19, 0x00, 0xFB, 0x36, 0x15, + 0x07, 0xFC, 0xC0, 0x12, 0xD6, 0x02, 0x83, 0x15, 0x0B, 0x08, 0x53, 0x1D, + 0xB3, 0x0B, 0xCB, 0x1C, 0x15, 0x06, 0xE5, 0x0E, 0xC2, 0xF5, 0x0C, 0x08, + 0x3A, 0xE3, 0xAC, 0x06, 0x28, 0xE3, 0x21, 0x05, 0xAE, 0xF3, 0x6C, 0x0A, + 0x3C, 0xEF, 0x20, 0x04, 0x63, 0xDE, 0x10, 0xFA, 0xAA, 0xDA, 0xB5, 0x02, + 0x29, 0xD7, 0x65, 0x07, 0x2E, 0xD7, 0x0E, 0xFB, 0x31, 0xED, 0xF1, 0xFA, + 0xBF, 0x04, 0x28, 0x08, 0x57, 0x0A, 0x0A, 0x07, 0x77, 0x13, 0x1B, 0x04, + 0x3E, 0x23, 0x02, 0x10, 0x41, 0x19, 0x39, 0x07, 0xE3, 0x09, 0xB1, 0xEE, + 0x42, 0x0F, 0x74, 0xEF, 0x17, 0x05, 0xEE, 0xF4, 0x17, 0xF3, 0xD6, 0xEA, + 0x0A, 0xFD, 0x15, 0xE1, 0x78, 0x0D, 0x23, 0xE1, 0x14, 0x11, 0xAD, 0xEA, + 0xF5, 0x1B, 0xD8, 0xF9, 0x77, 0x34, 0xB5, 0x0F, 0xEB, 0x41, 0xE6, 0x26, + 0xCE, 0x40, 0x70, 0x36, 0xE8, 0x3A, 0xCC, 0x3C, 0xD3, 0x2F, 0x2F, 0x3D, + 0xF6, 0x2F, 0x21, 0x41, 0x3D, 0x2F, 0xDD, 0x38, 0x43, 0x20, 0x62, 0x29, + 0xED, 0x18, 0x42, 0x2E, 0x2F, 0x0B, 0x80, 0x2A, 0xF4, 0xF4, 0x98, 0x19, + 0x7E, 0xEF, 0x13, 0x17, 0x38, 0xF0, 0x5F, 0x0F, 0x4F, 0xF5, 0x04, 0x04, + 0x87, 0x08, 0x0D, 0x0E, 0xCE, 0x0C, 0x0A, 0x0B, 0x7C, 0xFF, 0x16, 0xF5, + 0x55, 0xFB, 0xA7, 0xF6, 0xFC, 0xF7, 0xE5, 0xFE, 0x46, 0xF3, 0x3D, 0xF8, + 0x6D, 0xF8, 0xC5, 0xF4, 0x08, 0x0E, 0x01, 0x01, 0x45, 0x1A, 0x23, 0x01, + 0xBC, 0x0D, 0x0C, 0xF8, 0xE7, 0x0A, 0xB8, 0x0A, 0x3A, 0x09, 0x3C, 0x11, + 0xF4, 0x00, 0xF8, 0xFF, 0x8D, 0x09, 0x05, 0x07, 0x71, 0x10, 0x7C, 0x12, + 0x9B, 0x08, 0x50, 0x0B, 0x9A, 0x02, 0x2D, 0x0D, 0x55, 0xFF, 0x7F, 0x18, + 0x68, 0xFE, 0x8F, 0x1D, 0x1E, 0x08, 0x75, 0x23, 0x31, 0x13, 0xDB, 0x2D, + 0x10, 0x17, 0x62, 0x36, 0x94, 0x1E, 0xC2, 0x3C, 0xB4, 0x21, 0x92, 0x3D, + 0x67, 0x19, 0x42, 0x36, 0xC7, 0x1A, 0x6C, 0x30, 0x9D, 0x1F, 0xA8, 0x29, + 0x8B, 0x17, 0x68, 0x1C, 0x3A, 0x18, 0x17, 0x17, 0xAA, 0x1E, 0x12, 0x14, + 0x8A, 0x14, 0xC6, 0x07, 0x3A, 0x10, 0x9F, 0x04, 0xC2, 0x0C, 0x92, 0xFA, + 0x09, 0xFE, 0xF8, 0xEE, 0xFB, 0xF7, 0x98, 0xFD, 0x88, 0xF2, 0xE3, 0x00, + 0xEE, 0xE8, 0x6C, 0xEE, 0xC5, 0xEF, 0x2E, 0xF0, 0x6A, 0xFC, 0x99, 0xFF, + 0xA4, 0xF4, 0xE0, 0xFD, 0x25, 0xEF, 0xAF, 0xFE, 0x06, 0x01, 0xFC, 0x10, + 0x9C, 0x0E, 0x59, 0x16, 0x92, 0x17, 0xDE, 0x12, 0xAC, 0x32, 0xDE, 0x26, + 0xA7, 0x3C, 0x84, 0x36, 0x02, 0x22, 0x32, 0x2A, 0xF4, 0x0D, 0x03, 0x20, + 0x2B, 0x02, 0x44, 0x19, 0xD2, 0xEB, 0x6C, 0x05, 0x62, 0xEC, 0x35, 0xFB, + 0x87, 0x03, 0x71, 0x07, 0x87, 0x0D, 0xC9, 0x16, 0xEB, 0x17, 0x78, 0x24, + 0x73, 0x28, 0x82, 0x2F, 0x76, 0x2B, 0x1B, 0x36, 0x07, 0x25, 0x81, 0x35, + 0xCA, 0x26, 0x71, 0x34, 0x8F, 0x2D, 0x8D, 0x3A, 0x53, 0x2B, 0x49, 0x35, + 0xE5, 0x28, 0xA9, 0x22, 0xBB, 0x20, 0x4F, 0x10, 0x34, 0x0E, 0xF5, 0x01, + 0x77, 0x01, 0x72, 0xF4, 0x46, 0xF6, 0x07, 0xEA, 0x0C, 0xF3, 0x36, 0xEF, + 0x1E, 0xFA, 0x4F, 0xEF, 0x64, 0xFA, 0xAD, 0xE0, 0x55, 0xF8, 0x07, 0xE9, + 0xBE, 0xEF, 0x9E, 0xF6, 0xD4, 0xDE, 0x73, 0xF2, 0x3F, 0xD6, 0x9E, 0xF6, + 0x66, 0xDD, 0x7C, 0x02, 0xA8, 0xE7, 0x31, 0xFA, 0xC9, 0xE1, 0xDE, 0xDF, + 0x83, 0xD8, 0x0E, 0xD5, 0x10, 0xD5, 0x88, 0xD7, 0x03, 0xD1, 0xC5, 0xD2, + 0xFD, 0xDC, 0x93, 0xD9, 0x3F, 0xF5, 0xA9, 0xEB, 0xE3, 0xF5, 0x10, 0xE5, + 0x41, 0xE7, 0xBC, 0xD4, 0x04, 0xDC, 0xE0, 0xCC, 0xCB, 0xCA, 0xBE, 0xBF, + 0x19, 0xC2, 0x18, 0xBA, 0x70, 0xCC, 0x64, 0xC4, 0x01, 0xD6, 0xA5, 0xCC, + 0x17, 0xD9, 0x8B, 0xCF, 0xD6, 0xD9, 0x54, 0xD5, 0x10, 0xD4, 0xA5, 0xD6, + 0x5D, 0xD6, 0xEB, 0xD1, 0x1F, 0xE9, 0xD1, 0xCE, 0x60, 0xFB, 0x3B, 0xD0, + 0xC9, 0xFB, 0x76, 0xCF, 0xDE, 0xF3, 0x6D, 0xCD, 0x01, 0xEB, 0xAC, 0xCC, + 0x76, 0xD6, 0x55, 0xCA, 0xE0, 0xD0, 0x89, 0xD5, 0x33, 0xE1, 0x3C, 0xE9, + 0xAA, 0xE4, 0xED, 0xF1, 0x62, 0xDB, 0x91, 0xF1, 0x7D, 0xC8, 0xC1, 0xE1, + 0x33, 0xB3, 0x4D, 0xCC, 0x5D, 0xB3, 0x2E, 0xCB, 0x48, 0xB4, 0x81, 0xCA, + 0x44, 0xAD, 0xAA, 0xC5, 0x5A, 0xB9, 0x70, 0xD9, 0xE4, 0xC8, 0x42, 0xEC, + 0xC6, 0xC1, 0x8D, 0xDF, 0xC0, 0xB9, 0x93, 0xD6, 0x56, 0xC9, 0x9F, 0xE3, + 0xD3, 0xD3, 0xE9, 0xE3, 0x01, 0xDA, 0x3D, 0xE4, 0x89, 0xF9, 0xD6, 0xFB, + 0x34, 0x0C, 0xFB, 0xFB, 0xE5, 0xFF, 0xAF, 0xE0, 0x55, 0xF2, 0x89, 0xD2, + 0x21, 0xDD, 0x60, 0xC6, 0xC7, 0xC0, 0xB9, 0xBB, 0x38, 0xC0, 0x4F, 0xCA, + 0xA3, 0xDA, 0x5F, 0xE2, 0x0A, 0xF2, 0xDA, 0xEA, 0x74, 0x03, 0xFA, 0xF0, + 0xDF, 0x0D, 0x07, 0xFE, 0x05, 0x09, 0xFA, 0x04, 0x59, 0x07, 0xAC, 0x08, + 0x42, 0x1C, 0xEA, 0x16, 0x15, 0x2D, 0xF7, 0x22, 0x1D, 0x27, 0x29, 0x1A, + 0xB6, 0x1F, 0x9F, 0x0F, 0x63, 0x15, 0xD5, 0x05, 0xF6, 0x0D, 0x02, 0xFE, + 0xB1, 0x11, 0xF1, 0x07, 0xCB, 0x0E, 0x66, 0x14, 0x6C, 0x0E, 0xC6, 0x1A, + 0xA6, 0x0F, 0x7C, 0x17, 0xF5, 0x00, 0xB5, 0x05, 0xC2, 0xF8, 0x47, 0x00, + 0xA4, 0xF6, 0x05, 0x09, 0x7E, 0xEA, 0x2D, 0x01, 0x37, 0xF0, 0x1E, 0xF7, + 0x91, 0x03, 0x2C, 0xFD, 0x5C, 0xFD, 0xC4, 0xFB, 0x91, 0xEC, 0x3D, 0xF2, + 0x93, 0xF2, 0x10, 0xF5, 0x92, 0x00, 0xC4, 0xF8, 0x47, 0x0B, 0xD5, 0xF7, + 0x4E, 0x23, 0x2E, 0x07, 0x7A, 0x3B, 0x14, 0x1D, 0xCF, 0x36, 0x90, 0x1C, + 0x0F, 0x29, 0xBA, 0x14, 0x3A, 0x25, 0xC7, 0x17, 0xD2, 0x18, 0x3D, 0x15, + 0xD1, 0x09, 0xF4, 0x0C, 0x7A, 0x0B, 0xC8, 0x0A, 0x98, 0x14, 0x56, 0x05, + 0xA0, 0x1A, 0xC8, 0x01, 0x6B, 0x1E, 0xC3, 0x09, 0x41, 0x1F, 0xB1, 0x14, + 0x49, 0x23, 0x7A, 0x1C, 0x59, 0x2D, 0x8B, 0x1E, 0xF4, 0x37, 0x5E, 0x20, + 0xD3, 0x38, 0xB7, 0x21, 0xBD, 0x2B, 0x50, 0x1D, 0x43, 0x15, 0x5A, 0x13, + 0x9F, 0xFF, 0xD5, 0x06, 0x09, 0xFE, 0xE1, 0x07, 0xA1, 0x0C, 0x7A, 0x0F, + 0xD6, 0x18, 0xB7, 0x10, 0xF1, 0x1C, 0x4C, 0x0E, 0xF0, 0x13, 0x2C, 0xFF, + 0x3B, 0x08, 0x07, 0xF7, 0x2D, 0x02, 0x95, 0x00, 0x02, 0xF0, 0x71, 0xF6, + 0xB7, 0xDC, 0x58, 0xDF, 0x19, 0xEA, 0xC2, 0xE1, 0x61, 0xFD, 0xEC, 0xE1, + 0x53, 0xEF, 0xA9, 0xD6, 0x09, 0xDD, 0x9B, 0xE5, 0x42, 0xE2, 0xA9, 0xFE, + 0x10, 0xED, 0x6D, 0x02, 0xFB, 0x00, 0x21, 0x02, 0x71, 0x22, 0xAE, 0x0E, + 0x1E, 0x27, 0xD4, 0x10, 0x23, 0x0A, 0x3F, 0x00, 0x02, 0xF5, 0x78, 0xF4, + 0xB5, 0xEC, 0xD5, 0xF1, 0x75, 0xE3, 0x96, 0xE9, 0x56, 0xEB, 0x67, 0xE8, + 0xFF, 0xFD, 0x64, 0xF6, 0x39, 0xFE, 0x0D, 0xFA, 0x57, 0xFD, 0xCE, 0xFA, + 0x5B, 0xFE, 0x47, 0x01, 0x62, 0xF7, 0x2D, 0xFF, 0x84, 0xF6, 0x32, 0xFA, + 0x55, 0xFD, 0x71, 0xFD, 0x9F, 0x0E, 0x2A, 0x08, 0xAA, 0x17, 0x63, 0x0B, + 0x5B, 0x05, 0x4D, 0x06, 0xC6, 0xF0, 0xD2, 0x01, 0x89, 0xE2, 0x32, 0xF7, + 0x6F, 0xD7, 0x77, 0xEB, 0x54, 0xD6, 0x67, 0xE6, 0xB3, 0xD8, 0x22, 0xE5, + 0x2F, 0xDA, 0x3A, 0xE1, 0xA4, 0xDD, 0xC3, 0xCF, 0xCC, 0xE6, 0x40, 0xC9, + 0xDC, 0xEF, 0x6D, 0xDA, 0x60, 0xE4, 0x30, 0xDA, 0x3A, 0xD9, 0x71, 0xCB, + 0x97, 0xF1, 0x7B, 0xD4, 0x15, 0x01, 0xCB, 0xD8, 0xC0, 0xEF, 0x33, 0xC7, + 0x9E, 0xF1, 0x5D, 0xCF, 0x1D, 0xFC, 0x17, 0xE0, 0x78, 0xEF, 0xA9, 0xD7, + 0x89, 0xF2, 0xAA, 0xDC, 0x8E, 0x05, 0xBB, 0xF3, 0x39, 0xF6, 0x68, 0xF6, + 0xDD, 0xD6, 0x69, 0xEB, 0x3C, 0xD2, 0x7D, 0xEC, 0x5F, 0xD8, 0xC4, 0xEE, + 0x7B, 0xD9, 0x57, 0xE8, 0x4D, 0xE1, 0x8A, 0xEE, 0x0A, 0xEE, 0xC7, 0xFD, + 0x68, 0xF6, 0x7E, 0xFC, 0x19, 0xFD, 0x05, 0xFA, 0xA7, 0xFE, 0x41, 0x07, + 0x5E, 0xF8, 0xCE, 0x10, 0x77, 0xF3, 0x21, 0x06, 0xAD, 0xFA, 0xBD, 0xFC, + 0xCE, 0x06, 0x23, 0x03, 0xB9, 0xFF, 0x6B, 0x02, 0x7D, 0xED, 0xDD, 0xFA, + 0x73, 0xE8, 0xD1, 0xFA, 0x30, 0xEC, 0x5A, 0xFA, 0xD4, 0xF5, 0xD3, 0xFB, + 0xDC, 0x02, 0xAC, 0x02, 0x1C, 0x04, 0x9A, 0x05, 0x90, 0xF8, 0xB1, 0x01, + 0x2B, 0xE9, 0x2D, 0xF6, 0xAC, 0xEC, 0x85, 0xF3, 0xAF, 0xFD, 0x62, 0xFB, + 0xAE, 0xF3, 0xF8, 0xEC, 0xBC, 0xE4, 0x49, 0xDF, 0x33, 0xF0, 0x5E, 0xEF, + 0x4C, 0xF1, 0x26, 0xF1, 0xC5, 0xE5, 0xA7, 0xE7, 0xDA, 0xEF, 0xFD, 0xF7, + 0xE1, 0xFC, 0xA7, 0x05, 0xE3, 0x02, 0xD7, 0x03, 0xB1, 0x1D, 0xB7, 0x13, + 0x8F, 0x3B, 0xA5, 0x2A, 0x24, 0x34, 0xEF, 0x1E, 0xFD, 0x1A, 0xFE, 0x02, + 0x8F, 0x0E, 0x3C, 0xF9, 0x25, 0x01, 0x66, 0xEF, 0x9D, 0xF4, 0x40, 0xE0, + 0xBC, 0xFF, 0x44, 0xE9, 0xD7, 0x13, 0xDF, 0x02, 0x50, 0x1B, 0xCD, 0x15, + 0x1E, 0x20, 0xA8, 0x26, 0x83, 0x29, 0x1C, 0x35, 0xA0, 0x2C, 0x82, 0x37, + 0xEE, 0x2D, 0x49, 0x34, 0x83, 0x37, 0x64, 0x36, 0x0E, 0x40, 0xCC, 0x3D, + 0x1B, 0x3A, 0xAA, 0x43, 0xF3, 0x25, 0xC1, 0x3E, 0x6B, 0x11, 0x79, 0x2F, + 0xFD, 0x05, 0xA4, 0x21, 0xF1, 0x03, 0x86, 0x17, 0xE7, 0x08, 0xC5, 0x0F, + 0xBD, 0x0D, 0x41, 0x16, 0x91, 0x0B, 0xD0, 0x1B, 0xA7, 0x08, 0x4B, 0x13, + 0x14, 0x13, 0xE0, 0x14, 0x02, 0x1C, 0x8A, 0x15, 0xA9, 0x12, 0x28, 0x03, + 0xBF, 0x14, 0x07, 0x06, 0x8E, 0x21, 0xBE, 0x1D, 0x66, 0x17, 0x96, 0x1A, + 0x04, 0x10, 0xB4, 0x0C, 0x35, 0x1E, 0xD5, 0x0F, 0x2F, 0x1F, 0xD5, 0x0E, + 0xBC, 0x16, 0x70, 0x0A, 0x0A, 0x29, 0x2D, 0x1E, 0x0E, 0x3F, 0xB8, 0x35, + 0xC8, 0x2A, 0x0D, 0x30, 0xF7, 0x0E, 0x55, 0x25, 0x21, 0x09, 0xF6, 0x22, + 0x21, 0x01, 0x8E, 0x13, 0x6C, 0xFC, 0x71, 0x09, 0x36, 0x00, 0x2C, 0x18, + 0x72, 0x01, 0xCD, 0x24, 0x10, 0x0C, 0x60, 0x24, 0x3C, 0x1E, 0x08, 0x27, + 0x74, 0x1F, 0x28, 0x2D, 0x2C, 0x19, 0x66, 0x32, 0x1B, 0x1E, 0x20, 0x33, + 0x37, 0x27, 0xC3, 0x2D, 0x57, 0x2B, 0xAA, 0x27, 0x7E, 0x26, 0xD3, 0x1D, + 0xE4, 0x1B, 0x10, 0x0E, 0xA8, 0x14, 0x1F, 0x06, 0x11, 0x10, 0x48, 0x06, + 0xC6, 0x08, 0x19, 0x03, 0x20, 0x04, 0x40, 0x00, 0x6F, 0x08, 0x6A, 0xFF, + 0x2F, 0x03, 0x82, 0xF1, 0x3D, 0xF5, 0xD8, 0xE1, 0x2C, 0x00, 0x6B, 0xF1, + 0xD5, 0x0D, 0xAE, 0x01, 0x01, 0x04, 0x8F, 0xF9, 0xD6, 0x0B, 0xA6, 0x05, + 0x60, 0x1D, 0x83, 0x19, 0xFA, 0x12, 0x75, 0x0E, 0x15, 0x0D, 0x1C, 0x0B, + 0x52, 0x1B, 0x57, 0x20, 0x8C, 0x24, 0x0B, 0x29, 0xA5, 0x2F, 0x9A, 0x29, + 0xE8, 0x42, 0x8C, 0x37, 0xF6, 0x3E, 0xF0, 0x43, 0xAC, 0x20, 0x41, 0x3D, + 0x25, 0x14, 0xCF, 0x2E, 0x39, 0x1D, 0x9F, 0x28, 0x90, 0x1C, 0x6F, 0x28, + 0x7C, 0x13, 0x8B, 0x28, 0x93, 0x14, 0x45, 0x31, 0x8A, 0x1C, 0xA1, 0x43, + 0xC0, 0x1F, 0xA2, 0x4B, 0xFD, 0x26, 0xBB, 0x49, 0x89, 0x31, 0xEB, 0x49, + 0x06, 0x32, 0x1A, 0x4A, 0x60, 0x2A, 0x38, 0x43, 0x54, 0x25, 0x3C, 0x36, + 0xA6, 0x24, 0xEB, 0x29, 0x0C, 0x25, 0xDD, 0x19, 0xCB, 0x27, 0x34, 0x07, + 0xA3, 0x2A, 0x77, 0x02, 0x64, 0x29, 0xA7, 0x09, 0x87, 0x20, 0xA3, 0x0E, + 0x1F, 0x12, 0xEF, 0x12, 0xBD, 0x05, 0x20, 0x1A, 0x76, 0xF5, 0xA3, 0x10, + 0x9B, 0xEF, 0xA2, 0xFB, 0x0B, 0xFE, 0x35, 0xF9, 0x06, 0xF6, 0x3A, 0xF2, + 0xCC, 0xDA, 0x46, 0xD9, 0x03, 0xDC, 0xBE, 0xD5, 0x22, 0xE9, 0xA8, 0xE4, + 0x72, 0xE2, 0xC0, 0xE5, 0xB9, 0xE1, 0x25, 0xE8, 0x9D, 0xF7, 0x0E, 0xF5, + 0x6A, 0x00, 0x9A, 0xF5, 0xF5, 0xF4, 0x03, 0xF2, 0xAD, 0xF0, 0x67, 0xFB, + 0x9F, 0xED, 0x08, 0x03, 0x63, 0xDE, 0x6A, 0xF6, 0x6E, 0xD0, 0x36, 0xE1, + 0x00, 0xCF, 0xF9, 0xD3, 0xF2, 0xCE, 0xBC, 0xC7, 0xD4, 0xC5, 0xCD, 0xBC, + 0x59, 0xBF, 0xE2, 0xBD, 0xC2, 0xCC, 0x6F, 0xC8, 0x1E, 0xE7, 0xD6, 0xD4, + 0x09, 0xF9, 0x8C, 0xDC, 0x05, 0x06, 0x4E, 0xE1, 0x95, 0x0E, 0x18, 0xE4, + 0x8B, 0x04, 0x0F, 0xE0, 0x20, 0xF8, 0xED, 0xE2, 0x3E, 0xF2, 0xAE, 0xE9, + 0x87, 0xE4, 0x19, 0xE1, 0x3E, 0xD6, 0x60, 0xD8, 0xA1, 0xD5, 0x21, 0xDE, + 0xF1, 0xDB, 0x22, 0xE6, 0xCD, 0xD5, 0x3D, 0xE9, 0xF4, 0xC3, 0x71, 0xED, + 0x91, 0xBF, 0x10, 0xF7, 0x3A, 0xC1, 0x2A, 0xF2, 0x2D, 0xBE, 0x79, 0xE3, + 0xED, 0xCC, 0xE9, 0xEE, 0x7F, 0xDA, 0xFA, 0xFA, 0x85, 0xCB, 0x51, 0xEB, + 0x70, 0xCA, 0xF1, 0xE7, 0x39, 0xE5, 0x1E, 0xF0, 0xA5, 0xE5, 0xA0, 0xDB, + 0x87, 0xD0, 0x56, 0xCA, 0xDE, 0xD5, 0x63, 0xD5, 0xA3, 0xE5, 0x47, 0xD7, + 0x3E, 0xEF, 0x74, 0xD3, 0x8A, 0x07, 0x8E, 0xE4, 0x3A, 0x19, 0x5F, 0xF6, + 0x80, 0x0E, 0x0D, 0xF3, 0x52, 0x04, 0xEB, 0xEA, 0xB0, 0x05, 0x82, 0xEC, + 0xCF, 0xFD, 0x4D, 0xEE, 0x41, 0xF4, 0x3F, 0xF0, 0x9F, 0xF9, 0x37, 0xF8, + 0x75, 0x04, 0x1F, 0x00, 0x2A, 0x0A, 0xF2, 0x02, 0x39, 0x08, 0x6B, 0x04, + 0x38, 0x05, 0x9A, 0x0B, 0x12, 0x0E, 0xBF, 0x16, 0x46, 0x20, 0x58, 0x1A, + 0x01, 0x2F, 0x49, 0x1F, 0xD5, 0x31, 0xE5, 0x2B, 0x98, 0x28, 0x0C, 0x2C, + 0xE0, 0x18, 0xDB, 0x1A, 0x0B, 0x0C, 0x58, 0x0E, 0xE3, 0x06, 0x3F, 0x14, + 0x9E, 0xFE, 0x05, 0x1F, 0x80, 0xEE, 0x21, 0x22, 0x45, 0xE6, 0x24, 0x1F, + 0xE0, 0xE4, 0xA5, 0x09, 0xCC, 0xE0, 0x2F, 0xE9, 0x91, 0xE8, 0x9E, 0xE8, + 0xFD, 0xF2, 0x20, 0xF8, 0x3D, 0xEC, 0x52, 0xEF, 0xE3, 0xF9, 0xA5, 0xF0, + 0x49, 0x23, 0x0E, 0x08, 0xE7, 0x2A, 0xB7, 0x08, 0x74, 0x1A, 0x2D, 0xFF, + 0xC0, 0x23, 0x9C, 0x07, 0x5B, 0x2D, 0x74, 0x14, 0x57, 0x23, 0x5D, 0x1B, + 0x08, 0x26, 0x8B, 0x26, 0xDD, 0x30, 0xF3, 0x31, 0x9E, 0x23, 0xA6, 0x26, + 0xB2, 0x10, 0xB0, 0x12, 0xDB, 0x10, 0x72, 0x14, 0xC7, 0x0D, 0x21, 0x20, + 0xFE, 0x05, 0x0D, 0x20, 0x73, 0x10, 0xC3, 0x1C, 0x8E, 0x22, 0x1F, 0x1C, + 0xCA, 0x27, 0xB3, 0x15, 0x0C, 0x25, 0xDC, 0x12, 0xB9, 0x24, 0x18, 0x1B, + 0xD9, 0x27, 0xB8, 0x21, 0x37, 0x2A, 0x6D, 0x1D, 0x44, 0x25, 0x9E, 0x18, + 0x9A, 0x1A, 0xE3, 0x1C, 0x81, 0x11, 0xFB, 0x1C, 0xC4, 0x0C, 0xBB, 0x10, + 0x54, 0x0A, 0x76, 0x02, 0x72, 0x0F, 0x29, 0xFF, 0x68, 0x15, 0xA9, 0xFD, + 0xCE, 0x09, 0x47, 0xED, 0xCE, 0xFE, 0x74, 0xDE, 0xE4, 0xFC, 0x2F, 0xDE, + 0x3D, 0xE8, 0xD5, 0xDF, 0x21, 0xD4, 0x25, 0xEB, 0x58, 0xDC, 0x22, 0xFB, + 0x97, 0xDA, 0xDE, 0xF0, 0x9A, 0xC6, 0x19, 0xE0, 0x39, 0xCA, 0x07, 0xE5, + 0xE1, 0xD8, 0xED, 0xE7, 0x49, 0xD8, 0x53, 0xDD, 0x82, 0xE1, 0x1E, 0xE2, + 0xC8, 0xFA, 0xC5, 0xF4, 0x31, 0x02, 0xC3, 0xF5, 0xB8, 0xF8, 0xA4, 0xF1, + 0x0C, 0xFC, 0x7C, 0xFD, 0x59, 0xFD, 0xD3, 0xFE, 0xD1, 0xEE, 0x42, 0xEE, + 0x54, 0xED, 0xEC, 0xE9, 0x28, 0xF6, 0x7E, 0xE8, 0x6F, 0xE8, 0xD0, 0xD6, + 0x82, 0xD5, 0x03, 0xCB, 0x04, 0xDC, 0x5E, 0xCF, 0xCC, 0xE3, 0xAA, 0xD6, + 0xEF, 0xDE, 0xD9, 0xE2, 0x5D, 0xEA, 0x72, 0xF3, 0xB5, 0x06, 0xC3, 0xFA, + 0xCB, 0x11, 0x85, 0xF4, 0x23, 0x0B, 0x13, 0xEB, 0x7C, 0x05, 0x93, 0xEA, + 0x49, 0xF8, 0x1F, 0xEE, 0x79, 0xE8, 0x5A, 0xF2, 0xE7, 0xE1, 0x88, 0xF5, + 0x55, 0xE4, 0xCE, 0xF6, 0xC8, 0xEC, 0x68, 0xF8, 0xD5, 0xE9, 0xD3, 0xEE, + 0x61, 0xE5, 0x5D, 0xE2, 0x81, 0xED, 0xA4, 0xE1, 0xE4, 0xEB, 0x02, 0xDC, + 0x8B, 0xE4, 0x3A, 0xD3, 0x4F, 0xE7, 0xFB, 0xD5, 0x77, 0xDE, 0x2C, 0xD1, + 0x78, 0xCD, 0xDD, 0xC5, 0x56, 0xD0, 0xDF, 0xCD, 0x73, 0xD2, 0x61, 0xD9, + 0xE1, 0xC2, 0x72, 0xD1, 0xDA, 0xC0, 0xAA, 0xCB, 0x14, 0xD4, 0x17, 0xD5, + 0x22, 0xDE, 0x11, 0xDB, 0x54, 0xDF, 0x20, 0xDE, 0xC0, 0xEC, 0xFF, 0xED, + 0x66, 0xF4, 0xD6, 0xF6, 0x0A, 0xE7, 0x42, 0xE6, 0xC8, 0xDF, 0xAE, 0xD6, + 0xB6, 0xE6, 0x65, 0xD3, 0xC3, 0xE3, 0xA0, 0xD0, 0xD7, 0xDC, 0x7B, 0xD1, + 0x3D, 0xE9, 0xB7, 0xDF, 0x3E, 0xF6, 0x30, 0xF3, 0x7D, 0xEF, 0x79, 0xFE, + 0x53, 0xE9, 0xBB, 0x03, 0x01, 0xEB, 0x30, 0x08, 0x5F, 0xEA, 0xBD, 0x07, + 0x57, 0xEE, 0x69, 0x01, 0xD3, 0xF6, 0x62, 0xFE, 0xA6, 0xFA, 0x1B, 0xFE, + 0x14, 0xFD, 0x44, 0xFA, 0xE4, 0x00, 0x7D, 0xF7, 0xA5, 0xFC, 0x7B, 0xF7, + 0xDF, 0xF1, 0xF7, 0xF9, 0xA4, 0xE7, 0x28, 0xFA, 0xB3, 0xE2, 0x5F, 0xF6, + 0x0A, 0xE5, 0x7A, 0xF3, 0xE7, 0xDC, 0xF7, 0xE6, 0xBC, 0xCE, 0x85, 0xD7, + 0x23, 0xD6, 0x87, 0xD4, 0x48, 0xE4, 0x29, 0xCD, 0x39, 0xE0, 0x58, 0xBF, + 0x1A, 0xDD, 0xBA, 0xC7, 0x9E, 0xE2, 0x29, 0xDA, 0x7C, 0xE0, 0xD3, 0xD7, + 0x49, 0xE4, 0x0F, 0xD3, 0x28, 0xFB, 0x71, 0xDE, 0x23, 0x07, 0x17, 0xE7, + 0x11, 0x02, 0xF4, 0xED, 0x07, 0x06, 0x1F, 0x06, 0x3D, 0x0A, 0x9F, 0x1C, + 0x87, 0x03, 0x4E, 0x18, 0x35, 0x04, 0xCA, 0x0B, 0x7C, 0x0E, 0x80, 0x08, + 0x96, 0x0B, 0x9E, 0xFE, 0xB5, 0x03, 0x49, 0xF5, 0xF8, 0x07, 0xC0, 0x02, + 0xA0, 0x0E, 0x54, 0x15, 0xAC, 0x13, 0xF4, 0x16, 0xE6, 0x1B, 0x12, 0x15, + 0x43, 0x23, 0xD9, 0x1F, 0x42, 0x25, 0x1E, 0x28, 0x13, 0x22, 0xD7, 0x22, + 0x4F, 0x1C, 0x22, 0x1D, 0x82, 0x1B, 0x2F, 0x19, 0xAF, 0x20, 0xDB, 0x12, + 0xCC, 0x23, 0xBC, 0x0B, 0xB5, 0x23, 0xCA, 0x04, 0x96, 0x1F, 0x10, 0xFD, + 0x48, 0x14, 0x8C, 0xF4, 0x70, 0x05, 0x8B, 0xEF, 0x69, 0xFF, 0x49, 0xEE, + 0xBF, 0x02, 0x07, 0xEA, 0xD5, 0xF8, 0x95, 0xE8, 0x35, 0xEC, 0x30, 0xF7, + 0x6A, 0xF3, 0x77, 0x04, 0xF5, 0xF4, 0x48, 0xFE, 0x75, 0xE8, 0x64, 0xFB, + 0x06, 0xEA, 0x05, 0x07, 0xA3, 0xEE, 0x08, 0x0B, 0x25, 0xEB, 0x86, 0x06, + 0x1F, 0xF3, 0xBB, 0x0F, 0x03, 0xFA, 0x02, 0x1D, 0xAD, 0xF3, 0x03, 0x1C, + 0x9E, 0xF8, 0x23, 0x1D, 0x6B, 0x08, 0x94, 0x23, 0x46, 0x0B, 0x74, 0x1C, + 0x85, 0x08, 0x4A, 0x0E, 0xE8, 0x09, 0x04, 0x0A, 0xE9, 0x03, 0x47, 0x07, + 0x97, 0xFC, 0x96, 0xFB, 0x44, 0x02, 0xC3, 0xF3, 0x66, 0x12, 0x3A, 0xFA, + 0x55, 0x1A, 0x7D, 0xFE, 0x28, 0x11, 0xF0, 0xFA, 0x1A, 0x0E, 0x1F, 0x03, + 0x9B, 0x1B, 0xFC, 0x0E, 0x99, 0x26, 0x11, 0x11, 0x8D, 0x27, 0xCB, 0x0F, + 0x1C, 0x26, 0x55, 0x12, 0xB1, 0x21, 0x44, 0x15, 0xCD, 0x1D, 0xA5, 0x11, + 0x0E, 0x17, 0x7D, 0x0C, 0x0D, 0x0B, 0x5B, 0x0E, 0x6C, 0x0D, 0x07, 0x17, + 0x38, 0x19, 0xD0, 0x1C, 0x5E, 0x20, 0xBC, 0x20, 0xCC, 0x22, 0xAE, 0x25, + 0xBF, 0x13, 0x96, 0x22, 0x0F, 0x00, 0x59, 0x21, 0xDE, 0xFF, 0x7B, 0x28, + 0x52, 0x00, 0x25, 0x21, 0x9C, 0xFD, 0x7E, 0x11, 0xF8, 0x0B, 0xFD, 0x11, + 0x07, 0x1A, 0x8E, 0x19, 0xE8, 0x13, 0x3F, 0x1A, 0xA0, 0x0F, 0xF5, 0x1C, + 0x81, 0x1F, 0xCB, 0x25, 0x9D, 0x2A, 0xFD, 0x2A, 0xDF, 0x2A, 0xB7, 0x2D, + 0x0F, 0x39, 0x80, 0x35, 0x2C, 0x41, 0x96, 0x35, 0x25, 0x29, 0x58, 0x27, + 0x54, 0x0F, 0x3D, 0x20, 0x89, 0x0B, 0xB1, 0x20, 0x7F, 0x0C, 0x80, 0x1B, + 0xBA, 0x0E, 0x4D, 0x1A, 0xEB, 0x16, 0x3D, 0x1F, 0x98, 0x17, 0x0B, 0x1D, + 0xBC, 0x16, 0x84, 0x17, 0x98, 0x24, 0x95, 0x19, 0x0F, 0x31, 0x3A, 0x25, + 0x8C, 0x2D, 0x8F, 0x32, 0x6D, 0x2B, 0x35, 0x31, 0x59, 0x31, 0x9A, 0x24, + 0x6E, 0x2C, 0x36, 0x19, 0x96, 0x19, 0x16, 0x0D, 0x51, 0x09, 0xC6, 0xFE, + 0x39, 0xFD, 0x5D, 0xF1, 0x51, 0xF2, 0x33, 0xEB, 0x1C, 0xEF, 0x00, 0xEE, + 0xA4, 0xEF, 0xE9, 0xEE, 0x83, 0xF4, 0x40, 0xED, 0x0F, 0xFA, 0xB7, 0xEE, + 0x9F, 0xF0, 0x2D, 0xF2, 0x3F, 0xEA, 0x23, 0xF9, 0xE5, 0xF0, 0x77, 0xF7, + 0x37, 0xE7, 0xC2, 0xE2, 0x6C, 0xD4, 0xD9, 0xD1, 0x55, 0xD6, 0x5B, 0xD0, + 0x22, 0xDA, 0xF2, 0xD3, 0xCA, 0xCC, 0x37, 0xDC, 0x22, 0xCA, 0x2C, 0xE3, + 0x08, 0xD7, 0xC5, 0xDD, 0x14, 0xDB, 0x75, 0xD6, 0x63, 0xE6, 0xCC, 0xDD, + 0x30, 0x02, 0x60, 0xED, 0x9A, 0x08, 0xBE, 0xFA, 0xC7, 0xFF, 0x40, 0x01, + 0x50, 0x08, 0x9F, 0xFD, 0xF0, 0x0B, 0x92, 0xF7, 0x26, 0xFC, 0xED, 0xF3, + 0xA2, 0xF1, 0xCC, 0xF1, 0xE0, 0xF4, 0x28, 0xF5, 0xBC, 0xF3, 0xCC, 0xFE, + 0x5B, 0xE8, 0x09, 0x07, 0x0B, 0xE3, 0x1D, 0x0C, 0xCD, 0xE4, 0x34, 0x0F, + 0x7E, 0xE3, 0xF0, 0x0B, 0x0E, 0xE6, 0xD8, 0x09, 0x41, 0xF3, 0xDD, 0x14, + 0x33, 0xFB, 0x37, 0x1E, 0x38, 0xFB, 0x3C, 0x19, 0x95, 0x00, 0x15, 0x11, + 0x53, 0x07, 0x75, 0x07, 0x2A, 0x0C, 0xAE, 0xFF, 0xAB, 0x0D, 0x9A, 0x02, + 0x9C, 0x01, 0x55, 0x09, 0xA9, 0xF0, 0xE8, 0x0E, 0x9D, 0xE5, 0xFB, 0x06, + 0xD6, 0xD8, 0xBE, 0xF0, 0xA2, 0xD4, 0xD0, 0xE6, 0x12, 0xDE, 0xCB, 0xE0, + 0x79, 0xE5, 0x70, 0xD4, 0xA1, 0xF0, 0xFC, 0xD9, 0x87, 0x01, 0xA2, 0xEF, + 0x2D, 0x0A, 0x70, 0xF9, 0xCD, 0x11, 0xCB, 0xF4, 0xE1, 0x1F, 0x2E, 0xFB, + 0x56, 0x22, 0x6D, 0x0D, 0x42, 0x1A, 0xA3, 0x17, 0x20, 0x1D, 0x42, 0x20, + 0xFD, 0x1F, 0x11, 0x26, 0x17, 0x0F, 0xA6, 0x13, 0xA5, 0xFF, 0x29, 0xFC, + 0xDA, 0x09, 0x16, 0xFE, 0x04, 0x18, 0x79, 0x08, 0x55, 0x1A, 0xAF, 0x09, + 0xAB, 0x1D, 0xB1, 0x12, 0xD5, 0x1E, 0x5E, 0x26, 0x91, 0x14, 0x7E, 0x29, + 0x20, 0x0A, 0x80, 0x1F, 0xC2, 0x0C, 0x5B, 0x25, 0x2F, 0x18, 0xDF, 0x32, + 0x08, 0x22, 0x5D, 0x37, 0xB7, 0x24, 0x0B, 0x3D, 0x37, 0x1E, 0x77, 0x46, + 0xC7, 0x12, 0x9B, 0x42, 0x7D, 0x10, 0x1E, 0x31, 0x04, 0x19, 0x5F, 0x24, + 0xE6, 0x22, 0xC3, 0x22, 0xD2, 0x2F, 0xBE, 0x22, 0xAF, 0x3A, 0xD5, 0x1F, + 0x80, 0x38, 0x81, 0x1E, 0x6A, 0x33, 0x26, 0x1F, 0xDD, 0x34, 0x89, 0x1E, + 0x3C, 0x37, 0xFB, 0x20, 0x03, 0x38, 0xC0, 0x2A, 0x74, 0x33, 0x62, 0x2B, + 0x34, 0x27, 0x5E, 0x1F, 0xFE, 0x1D, 0x1A, 0x1E, 0x26, 0x1E, 0xBB, 0x25, + 0x68, 0x19, 0x8B, 0x22, 0x07, 0x15, 0x23, 0x1D, 0x36, 0x22, 0x11, 0x23, + 0x1C, 0x2D, 0xE6, 0x26, 0xC7, 0x29, 0x59, 0x21, 0x02, 0x2F, 0xBC, 0x1D, + 0x7B, 0x38, 0xB4, 0x20, 0x58, 0x30, 0x1E, 0x23, 0x83, 0x23, 0x2D, 0x1C, + 0x9D, 0x1B, 0xFE, 0x15, 0xF8, 0x0C, 0x43, 0x14, 0xA7, 0x00, 0xAC, 0x0B, + 0x42, 0x07, 0x72, 0x08, 0xCE, 0x12, 0x92, 0x13, 0x48, 0x13, 0xB5, 0x14, + 0x93, 0x0E, 0xA2, 0x0B, 0x5D, 0x0C, 0x07, 0x13, 0x32, 0x09, 0x0A, 0x20, + 0xEF, 0x08, 0xA3, 0x1B, 0xFE, 0x13, 0x57, 0x12, 0x2F, 0x1E, 0xF9, 0x14, + 0x19, 0x14, 0x2B, 0x18, 0x20, 0x04, 0x37, 0x16, 0x92, 0x04, 0xC6, 0x14, + 0x07, 0xFF, 0xAE, 0x0D, 0x97, 0xEA, 0x63, 0x05, 0xEC, 0xE0, 0x49, 0xFD, + 0x32, 0xE8, 0x56, 0xED, 0x3C, 0xF1, 0x6D, 0xE2, 0x75, 0xF1, 0xCD, 0xE3, + 0xB8, 0xF0, 0x91, 0xEA, 0x09, 0xF6, 0x21, 0xF5, 0x77, 0xF3, 0x6B, 0xF7, + 0x00, 0xE9, 0x07, 0xEE, 0xFF, 0xEC, 0x10, 0xE7, 0xE0, 0xFB, 0xC3, 0xE4, + 0x00, 0xFC, 0x46, 0xE1, 0x80, 0xF0, 0xC1, 0xDC, 0x4B, 0xEB, 0xC1, 0xDD, + 0x7A, 0xE1, 0x7D, 0xDE, 0x67, 0xD8, 0xE2, 0xDC, 0xD6, 0xE3, 0x0B, 0xE4, + 0xEE, 0xF1, 0x2B, 0xEB, 0x99, 0xF0, 0x23, 0xE8, 0x26, 0xEB, 0x98, 0xE2, + 0x6F, 0xE6, 0x0F, 0xE2, 0x59, 0xDC, 0x90, 0xE4, 0xBD, 0xDB, 0xB1, 0xE8, + 0x53, 0xF1, 0xF8, 0xF1, 0xD1, 0x07, 0x85, 0xFC, 0xD1, 0x06, 0x30, 0x01, + 0xBA, 0xFE, 0xE4, 0x00, 0x97, 0xFD, 0x31, 0xFD, 0x98, 0xF6, 0x24, 0xF1, + 0xDD, 0xEE, 0xE4, 0xE4, 0x0C, 0xEF, 0x1C, 0xE7, 0x81, 0xEC, 0x2B, 0xED, + 0x89, 0xE2, 0xCD, 0xE7, 0x36, 0xDF, 0x46, 0xE2, 0xA7, 0xE0, 0x06, 0xE1, + 0x64, 0xD9, 0x79, 0xDA, 0xE6, 0xD2, 0x0A, 0xD8, 0x79, 0xD4, 0xA7, 0xDE, + 0xB8, 0xD8, 0xEC, 0xDF, 0xC8, 0xDD, 0x72, 0xDB, 0xDB, 0xDD, 0x86, 0xD7, + 0x50, 0xDA, 0x4A, 0xD1, 0x55, 0xDB, 0x28, 0xC5, 0x47, 0xD8, 0x5B, 0xB6, + 0xA6, 0xCA, 0xBE, 0xAD, 0xEE, 0xBF, 0xB5, 0xAE, 0x78, 0xBE, 0x0B, 0xBA, + 0x32, 0xC3, 0x29, 0xC2, 0x7F, 0xD1, 0x69, 0xC0, 0x39, 0xE2, 0x98, 0xC8, + 0x17, 0xE1, 0x82, 0xD8, 0x0E, 0xDB, 0x72, 0xE2, 0xB0, 0xE6, 0x26, 0xE9, + 0x0A, 0xF0, 0x00, 0xEE, 0x2A, 0xE5, 0x7F, 0xEB, 0x3C, 0xDB, 0x27, 0xE5, + 0xFB, 0xD9, 0xF9, 0xE2, 0xCF, 0xD0, 0xE5, 0xE1, 0x40, 0xC9, 0x60, 0xE1, + 0x13, 0xCF, 0xC6, 0xEC, 0x85, 0xD7, 0xE4, 0xF9, 0xEE, 0xD8, 0x2D, 0xF4, + 0xB3, 0xD7, 0x6D, 0xEA, 0xEB, 0xE0, 0x33, 0xED, 0x5A, 0xF2, 0xB2, 0xEF, + 0x1A, 0xFD, 0xE4, 0xEE, 0xF5, 0x03, 0x20, 0xF7, 0xDB, 0x07, 0x30, 0xFE, + 0x0B, 0xFE, 0x4B, 0xF3, 0xCB, 0xED, 0xF5, 0xE1, 0x87, 0xE4, 0x9A, 0xDA, + 0xBB, 0xE2, 0x96, 0xD7, 0xFF, 0xE8, 0x0B, 0xD8, 0xFF, 0xEE, 0x6A, 0xDF, + 0xB5, 0xE9, 0x08, 0xE4, 0x61, 0xE5, 0x1D, 0xE5, 0x20, 0xED, 0xE9, 0xE9, + 0x18, 0xFA, 0x35, 0xF0, 0x9B, 0x07, 0x6C, 0xF4, 0x1A, 0x12, 0x69, 0xF8, + 0xC6, 0x10, 0x7B, 0xFF, 0x3D, 0x09, 0xDD, 0x05, 0xC5, 0x04, 0x25, 0x06, + 0xCC, 0xFA, 0x92, 0x03, 0xB7, 0xF1, 0x0F, 0x03, 0x37, 0xF3, 0x9F, 0x08, + 0x85, 0xF0, 0x04, 0x10, 0x0B, 0xEC, 0xE0, 0x15, 0x53, 0xF5, 0xD0, 0x18, + 0xF1, 0x02, 0x8A, 0x0F, 0x8C, 0x07, 0x7E, 0xFA, 0x88, 0x0C, 0x22, 0xED, + 0xD2, 0x16, 0x07, 0xF0, 0x68, 0x1A, 0x77, 0xF7, 0xAD, 0x14, 0xD0, 0xFD, + 0xD8, 0x12, 0x02, 0x00, 0xC2, 0x14, 0x71, 0xF8, 0x49, 0x0F, 0xC2, 0xEA, + 0x36, 0x0A, 0x48, 0xE2, 0x8E, 0x09, 0xDD, 0xE0, 0xFB, 0x05, 0xFC, 0xE3, + 0x0C, 0x06, 0x76, 0xEB, 0x57, 0x09, 0x55, 0xEF, 0xF0, 0x06, 0x4E, 0xF1, + 0xF4, 0x02, 0x96, 0xF8, 0x62, 0xFE, 0x25, 0x03, 0x70, 0xF6, 0x01, 0x12, + 0x1A, 0xEA, 0x66, 0x1E, 0x57, 0xE2, 0xD1, 0x1C, 0xB8, 0xE5, 0x4F, 0x12, + 0x7B, 0xE9, 0x8C, 0x08, 0xC0, 0xEA, 0x98, 0x05, 0x15, 0xE5, 0x70, 0x06, + 0x5E, 0xD8, 0x32, 0x04, 0xA8, 0xD6, 0x93, 0x01, 0xCC, 0xDD, 0xE0, 0xFB, + 0xA8, 0xE0, 0xE4, 0xF0, 0x02, 0xEA, 0xAA, 0xE5, 0xB8, 0x00, 0x5E, 0xE1, + 0x87, 0x0F, 0xFC, 0xE3, 0x19, 0x09, 0x44, 0xE7, 0x9E, 0xFF, 0x88, 0xF1, + 0x69, 0x00, 0x0E, 0xFC, 0x2D, 0x01, 0xC6, 0xF7, 0x41, 0x03, 0x2D, 0xF1, + 0xF9, 0x0F, 0x22, 0xF2, 0xE1, 0x16, 0x26, 0xEE, 0x05, 0x0E, 0x2B, 0xE5, + 0x9E, 0x02, 0x94, 0xE7, 0xE9, 0xFD, 0x15, 0xF0, 0x0F, 0x01, 0x01, 0xF0, + 0x54, 0x09, 0x07, 0xF4, 0xDD, 0x16, 0x56, 0x02, 0xCC, 0x23, 0xDB, 0x0D, + 0x3B, 0x26, 0x09, 0x1A, 0xBA, 0x1F, 0x36, 0x29, 0x2F, 0x18, 0x1D, 0x30, + 0x6B, 0x13, 0x90, 0x31, 0x97, 0x10, 0x30, 0x31, 0x2E, 0x10, 0xB2, 0x2D, + 0x15, 0x0F, 0xCA, 0x2D, 0x6D, 0x0D, 0xE8, 0x2F, 0xDB, 0x0A, 0xF5, 0x31, + 0xA0, 0x08, 0x59, 0x2F, 0x7A, 0x12, 0x1D, 0x25, 0x00, 0x24, 0xEA, 0x1E, + 0xF0, 0x28, 0x96, 0x20, 0x21, 0x23, 0xAB, 0x26, 0xA8, 0x1E, 0x95, 0x29, + 0xF7, 0x19, 0x29, 0x23, 0x30, 0x1A, 0xF4, 0x1C, 0xF4, 0x18, 0x72, 0x1B, + 0xAF, 0x08, 0x16, 0x17, 0x10, 0xFE, 0x8E, 0x0D, 0x42, 0x08, 0x74, 0x06, + 0x90, 0x14, 0x92, 0x07, 0xBE, 0x17, 0xD6, 0x0B, 0x7B, 0x18, 0x78, 0x0F, + 0xFF, 0x17, 0x4A, 0x13, 0x7B, 0x14, 0x3F, 0x13, 0x61, 0x11, 0xBB, 0x0F, + 0x88, 0x11, 0xE1, 0x0F, 0x93, 0x17, 0x02, 0x10, 0x42, 0x1C, 0x5F, 0x0A, + 0xCD, 0x16, 0x8D, 0x02, 0xC5, 0x0A, 0xED, 0xFB, 0xF1, 0xFD, 0x11, 0xF4, + 0xBD, 0xF2, 0x09, 0xED, 0xFF, 0xEC, 0xDA, 0xEB, 0x2C, 0xEF, 0x5D, 0xEF, + 0xA4, 0xF1, 0x60, 0xF3, 0x22, 0xF3, 0x41, 0xF4, 0x71, 0xFB, 0x8D, 0xF0, + 0x87, 0x01, 0xA2, 0xE6, 0x32, 0xF9, 0x2D, 0xDD, 0xB1, 0xEE, 0x64, 0xDB, + 0x62, 0xE6, 0x20, 0xE0, 0x4E, 0xDD, 0xC2, 0xE9, 0x20, 0xDF, 0x73, 0xED, + 0xD5, 0xE9, 0x9F, 0xE5, 0xFB, 0xE9, 0x06, 0xE0, 0xD0, 0xE0, 0xE0, 0xDE, + 0x7B, 0xDD, 0xAB, 0xD7, 0x3A, 0xE4, 0xC3, 0xD6, 0x08, 0xED, 0x4D, 0xE0, + 0x54, 0xED, 0xDE, 0xE1, 0xA5, 0xEB, 0x66, 0xDF, 0xA7, 0xEC, 0x11, 0xE3, + 0x24, 0xE6, 0x7C, 0xE3, 0x27, 0xDC, 0xE0, 0xE2, 0xBF, 0xD7, 0x2B, 0xEC, + 0xC4, 0xD5, 0x7B, 0xF8, 0x5D, 0xD0, 0x14, 0xFA, 0x4C, 0xCA, 0xF2, 0xF5, + 0x57, 0xCB, 0x62, 0xF6, 0x9C, 0xCD, 0x25, 0xF6, 0x94, 0xD1, 0x1B, 0xF4, + 0x4C, 0xE0, 0xAA, 0xF0, 0xC7, 0xF3, 0x76, 0xE9, 0x9C, 0x04, 0x72, 0xE3, + 0xB8, 0x0A, 0x37, 0xE2, 0x7A, 0x00, 0xD7, 0xE8, 0x3A, 0xF7, 0x8C, 0xF5, + 0xAD, 0xFB, 0x66, 0xF8, 0x55, 0xFC, 0x96, 0xF3, 0xFD, 0xED, 0xCA, 0xF4, + 0x86, 0xE2, 0x5D, 0xF2, 0x81, 0xE8, 0xCB, 0xE6, 0xC4, 0xF2, 0x9F, 0xE3, + 0x3E, 0xF5, 0xD4, 0xEE, 0x4A, 0xF7, 0x0C, 0xF9, 0xE4, 0xFB, 0x32, 0xFD, + 0x1C, 0x00, 0xF5, 0xFB, 0x79, 0x03, 0xF8, 0xF6, 0xDE, 0x04, 0xB1, 0xF8, + 0x73, 0x03, 0x9E, 0x02, 0x1B, 0x04, 0xAF, 0x08, 0xFC, 0x07, 0x31, 0x0B, + 0x05, 0x0B, 0x18, 0x14, 0x62, 0x0B, 0x08, 0x1D, 0x0E, 0x0C, 0x0D, 0x1F, + 0x09, 0x0D, 0x69, 0x19, 0xFC, 0x09, 0x4E, 0x0E, 0x2D, 0x08, 0x44, 0x0A, + 0xEB, 0x09, 0x46, 0x0F, 0x8B, 0x0D, 0x7C, 0x13, 0xD6, 0x11, 0x82, 0x14, + 0xF1, 0x11, 0xA3, 0x15, 0xBC, 0x0D, 0xD0, 0x16, 0x70, 0x06, 0xF7, 0x18, + 0x60, 0x05, 0x99, 0x1D, 0xFC, 0x11, 0x8F, 0x22, 0xB0, 0x22, 0xB5, 0x29, + 0xC5, 0x31, 0x38, 0x2D, 0xE4, 0x36, 0xB2, 0x26, 0x27, 0x27, 0x03, 0x1E, + 0xBB, 0x12, 0x41, 0x1D, 0xE0, 0x15, 0x66, 0x24, 0xB8, 0x27, 0x99, 0x30, + 0x59, 0x35, 0x26, 0x3E, 0xDA, 0x41, 0x6A, 0x43, 0xCF, 0x46, 0x23, 0x3E, + 0x09, 0x3E, 0x75, 0x37, 0x06, 0x34, 0x3A, 0x36, 0xDB, 0x34, 0x7F, 0x33, + 0x90, 0x3D, 0xEF, 0x33, 0x9E, 0x41, 0x98, 0x3B, 0x1C, 0x41, 0xC1, 0x3D, + 0x23, 0x40, 0xA9, 0x3B, 0x44, 0x36, 0x94, 0x39, 0xC7, 0x25, 0x7C, 0x35, + 0x9D, 0x1A, 0x5B, 0x2E, 0x31, 0x1D, 0x67, 0x27, 0xB8, 0x30, 0x3B, 0x22, + 0xAE, 0x3F, 0x28, 0x1C, 0xA6, 0x39, 0x96, 0x17, 0x38, 0x32, 0x45, 0x15, + 0xD4, 0x2D, 0x20, 0x14, 0x12, 0x22, 0x66, 0x14, 0x4F, 0x16, 0xD4, 0x18, + 0xA0, 0x11, 0x0C, 0x24, 0x26, 0x10, 0xED, 0x29, 0xCD, 0x13, 0x1F, 0x24, + 0xB7, 0x1B, 0xF7, 0x1C, 0x63, 0x1C, 0xB9, 0x18, 0xE6, 0x19, 0x85, 0x16, + 0x08, 0x19, 0x78, 0x1B, 0x0F, 0x15, 0x68, 0x23, 0x99, 0x0F, 0x5B, 0x25, + 0xBE, 0x0A, 0xE5, 0x24, 0x8E, 0x02, 0xFD, 0x20, 0x45, 0xF8, 0xFC, 0x17, + 0xDB, 0xF1, 0xD4, 0x0D, 0xFA, 0xF0, 0x33, 0x06, 0xC6, 0xF7, 0xD0, 0xFF, + 0x13, 0xFD, 0x6D, 0xFC, 0xDB, 0xFA, 0xBA, 0xFC, 0x51, 0xF9, 0x7A, 0xF7, + 0xB5, 0xFF, 0xDB, 0xF4, 0x4D, 0x08, 0x02, 0xFE, 0xB6, 0x0A, 0x1E, 0x01, + 0x57, 0x10, 0xE8, 0xF6, 0x8A, 0x1A, 0xBF, 0xEC, 0xA7, 0x19, 0x1E, 0xE5, + 0x9D, 0x0C, 0x93, 0xE6, 0xF0, 0xFE, 0xFC, 0xF4, 0x65, 0xF9, 0x66, 0x05, + 0x22, 0xFD, 0x31, 0x0C, 0xDF, 0x01, 0xBB, 0x06, 0xD3, 0xFD, 0xCE, 0x00, + 0x55, 0xF6, 0x1C, 0x03, 0x89, 0xF6, 0x3E, 0x06, 0x09, 0xF9, 0xED, 0x05, + 0x22, 0xFD, 0x91, 0x0D, 0x4E, 0x03, 0x80, 0x18, 0xD7, 0x00, 0xE9, 0x16, + 0x6E, 0xF7, 0xF0, 0x0F, 0x99, 0xF6, 0x13, 0x0E, 0x6A, 0xFF, 0xEE, 0x0B, + 0x50, 0x08, 0xA8, 0x0A, 0x08, 0x0B, 0x0C, 0x0F, 0x52, 0x03, 0xE9, 0x0F, + 0xA5, 0xFB, 0xD5, 0x06, 0x3D, 0xFA, 0xA7, 0xFE, 0xF6, 0xF3, 0xD6, 0xFD, + 0x3A, 0xEB, 0x9D, 0xFB, 0x72, 0xEA, 0xDB, 0xF4, 0x76, 0xEB, 0xA3, 0xED, + 0x44, 0xE8, 0x68, 0xE8, 0x80, 0xE7, 0xC2, 0xE3, 0x14, 0xEF, 0x55, 0xDD, + 0xDA, 0xFB, 0xDD, 0xD6, 0xC0, 0xFF, 0x52, 0xD3, 0x2D, 0xF7, 0x50, 0xDA, + 0xAB, 0xEB, 0xD9, 0xE8, 0x7D, 0xE6, 0x82, 0xF1, 0x35, 0xE8, 0x7C, 0xF0, + 0xEC, 0xE9, 0x3C, 0xEE, 0x55, 0xED, 0x7F, 0xF0, 0xA5, 0xED, 0x63, 0xF0, + 0xB1, 0xE5, 0xBC, 0xEF, 0xBF, 0xDA, 0xC7, 0xF0, 0x5C, 0xD9, 0x7F, 0xEC, + 0xFB, 0xE5, 0x00, 0xE8, 0xF9, 0xF2, 0xF1, 0xE8, 0x08, 0xFA, 0x0F, 0xE8, + 0x4B, 0xFC, 0x7B, 0xE6, 0x38, 0xFB, 0x00, 0xEE, 0x10, 0xF4, 0x02, 0xF6, + 0x72, 0xE5, 0x2C, 0xF8, 0x86, 0xDB, 0x8A, 0xFD, 0x71, 0xE3, 0x7A, 0x03, + 0x2F, 0xF2, 0xBD, 0x00, 0x36, 0xF5, 0xF9, 0xFA, 0x9A, 0xEF, 0x83, 0xF6, + 0xB3, 0xE4, 0x9B, 0xE9, 0x13, 0xD8, 0xF6, 0xD9, 0x49, 0xD9, 0x0C, 0xD7, + 0x96, 0xE6, 0x98, 0xE1, 0x9A, 0xF2, 0x65, 0xF1, 0x03, 0xFC, 0xF4, 0xF8, + 0x80, 0xFF, 0x97, 0xF5, 0x48, 0xF6, 0xF4, 0xEE, 0x9A, 0xE9, 0xBC, 0xEE, + 0xB6, 0xE4, 0x1F, 0xF5, 0x2F, 0xE4, 0x1F, 0xFB, 0xAC, 0xEB, 0xAE, 0xFF, + 0x73, 0xF9, 0x87, 0x00, 0x99, 0xFE, 0xD8, 0xF9, 0x0E, 0xFA, 0x8D, 0xEB, + 0x31, 0xF3, 0xFB, 0xE1, 0x59, 0xF2, 0x11, 0xE2, 0xC0, 0xFE, 0x0C, 0xE6, + 0x47, 0x14, 0x88, 0xEF, 0xAB, 0x1D, 0xF7, 0xFA, 0xC9, 0x13, 0x3F, 0x06, + 0xB2, 0x06, 0xB9, 0x0C, 0x59, 0xFB, 0x60, 0x06, 0xAF, 0xF1, 0x9E, 0xFF, + 0x9A, 0xF1, 0xD5, 0x02, 0x71, 0xF9, 0x8C, 0x06, 0x6E, 0xFF, 0xE9, 0x04, + 0xA5, 0xFC, 0x41, 0xFD, 0x1C, 0xF3, 0x47, 0xF3, 0xB9, 0xEC, 0x0B, 0xEB, + 0x9A, 0xEF, 0xA8, 0xE5, 0x1B, 0xFB, 0x3A, 0xE4, 0x8A, 0x07, 0x5A, 0xE8, + 0x1A, 0x10, 0x08, 0xF0, 0x6E, 0x0F, 0xC3, 0xF4, 0x97, 0x01, 0xD1, 0xF5, + 0x0C, 0xFA, 0x70, 0xF1, 0x37, 0x00, 0x76, 0xEC, 0x30, 0xFF, 0x61, 0xEB, + 0x46, 0xF3, 0x31, 0xEF, 0x82, 0xE7, 0xB0, 0xF5, 0xB2, 0xE6, 0x5D, 0xF7, + 0x60, 0xEE, 0xE9, 0xF1, 0xEC, 0xF5, 0xA9, 0xF2, 0x1A, 0xEC, 0x2E, 0x00, + 0xB3, 0xDB, 0x60, 0x0D, 0xDF, 0xDF, 0x2B, 0x13, 0xC8, 0xE7, 0x72, 0x10, + 0xAC, 0xE6, 0x8F, 0x08, 0xD7, 0xE6, 0x24, 0x03, 0xE9, 0xE6, 0xA9, 0x02, + 0xAA, 0xE1, 0x0F, 0xFF, 0x04, 0xE6, 0xEC, 0xF9, 0xB9, 0xEC, 0x3B, 0xFC, + 0x1A, 0xED, 0x1A, 0xFD, 0xA2, 0xF0, 0x65, 0xF1, 0xFC, 0xEF, 0x92, 0xE4, + 0x2E, 0xF0, 0x35, 0xE7, 0xEE, 0xF8, 0x77, 0xEE, 0x2C, 0xFB, 0x3E, 0xEC, + 0xCE, 0xF6, 0x7F, 0xE7, 0x67, 0xFE, 0xB2, 0xE5, 0xA1, 0xFF, 0x74, 0xDF, + 0x67, 0xFD, 0x74, 0xE1, 0x75, 0x02, 0x49, 0xF0, 0xF9, 0xF8, 0x14, 0xF1, + 0xC7, 0xFC, 0xCA, 0xEB, 0x7A, 0x08, 0x1E, 0xED, 0xD8, 0x03, 0xC1, 0xF0, + 0xC0, 0x03, 0xB3, 0xF7, 0x69, 0x06, 0x43, 0xFB, 0x3D, 0x10, 0x0B, 0xFD, + 0xAE, 0x1B, 0x95, 0xFD, 0x4B, 0x1F, 0xE4, 0x05, 0x17, 0x17, 0x5E, 0x11, + 0x3D, 0x0D, 0x43, 0x17, 0x15, 0x0A, 0x6F, 0x1D, 0x5E, 0xFF, 0xA2, 0x1A, + 0x49, 0xFB, 0xFD, 0x13, 0x3C, 0x00, 0x1B, 0x1F, 0xC4, 0x00, 0x92, 0x1F, + 0x54, 0x04, 0x0E, 0x19, 0xE6, 0x10, 0xD2, 0x23, 0xF8, 0x15, 0x96, 0x1F, + 0x89, 0x14, 0x76, 0x17, 0xA9, 0x10, 0x2C, 0x12, 0xE8, 0x10, 0xD8, 0x0A, + 0xF8, 0x16, 0xC6, 0x0A, 0xFA, 0x11, 0x4E, 0x17, 0x08, 0x09, 0xFB, 0x1F, + 0x81, 0x0C, 0x62, 0x1E, 0x36, 0x12, 0x9D, 0x13, 0x43, 0x09, 0xEE, 0xF9, + 0xB7, 0xFF, 0x10, 0xF2, 0xA3, 0x03, 0x0D, 0xFC, 0x6D, 0x0D, 0x54, 0x03, + 0x9B, 0x1D, 0x1E, 0x0E, 0x3C, 0x2A, 0xCD, 0x16, 0xAA, 0x21, 0x07, 0x10, + 0x61, 0x0F, 0x13, 0x03, 0x2E, 0xFF, 0xA5, 0xF7, 0x96, 0xF7, 0xB3, 0xF0, + 0x8B, 0xFF, 0x08, 0xFA, 0x34, 0x08, 0x6E, 0xFF, 0x91, 0x08, 0x1D, 0xFC, + 0xD2, 0xFF, 0x44, 0xFA, 0x11, 0xEE, 0x88, 0xEF, 0x86, 0xEF, 0x2E, 0xE3, + 0xBC, 0xFA, 0xD4, 0xD9, 0x80, 0xF7, 0x90, 0xDA, 0x61, 0xF3, 0x97, 0xE2, + 0x97, 0xEF, 0x8C, 0xE4, 0xF0, 0xF1, 0xC8, 0xEB, 0xA3, 0xEA, 0xC0, 0xEE, + 0xC4, 0xDE, 0x7F, 0xE9, 0xF5, 0xDE, 0x57, 0xEC, 0x17, 0xDF, 0xC9, 0xF4, + 0xFC, 0xE3, 0x8A, 0xF9, 0x67, 0xE4, 0x7F, 0xF6, 0xCA, 0xE2, 0x08, 0xF0, + 0x82, 0xE3, 0xF4, 0xDE, 0x51, 0xEC, 0x7F, 0xCD, 0xBA, 0xF8, 0xDE, 0xC9, + 0x91, 0xFD, 0x4E, 0xCE, 0x24, 0xFC, 0x48, 0xD9, 0x18, 0xF3, 0xB0, 0xE6, + 0x0F, 0xEC, 0x18, 0xE9, 0x88, 0xF2, 0x22, 0xE8, 0x99, 0xE4, 0x9F, 0xDF, + 0x68, 0xD1, 0x9A, 0xE1, 0x29, 0xD1, 0xFB, 0xF3, 0xD8, 0xC8, 0xD5, 0xFA, + 0xEC, 0xD0, 0xF3, 0xFF, 0x62, 0xD7, 0xA7, 0xFD, 0x1D, 0xD2, 0x28, 0xF7, + 0x85, 0xD8, 0xEE, 0xF2, 0x80, 0xE6, 0x10, 0xF1, 0x1F, 0xEF, 0xC7, 0xEA, + 0x48, 0xF3, 0xCE, 0xE8, 0x61, 0xF0, 0xFC, 0xEB, 0xAF, 0xE7, 0xCA, 0xE7, + 0xA4, 0xE7, 0x82, 0xE1, 0xB3, 0xEC, 0x87, 0xE4, 0xD6, 0xEA, 0xD0, 0xED, + 0x51, 0xEB, 0x81, 0xEE, 0x06, 0xF0, 0x8B, 0xED, 0xBB, 0xEB, 0xA9, 0xEB, + 0x68, 0xE4, 0x52, 0xEB, 0x7B, 0xE2, 0xF3, 0xEB, 0x8A, 0xE8, 0x62, 0xE8, + 0x2E, 0xF5, 0x70, 0xE7, 0xCD, 0x03, 0xA6, 0xE6, 0x4E, 0x0D, 0xF7, 0xEA, + 0xE2, 0x0A, 0x5F, 0xF6, 0x55, 0xF5, 0x76, 0xF7, 0xF4, 0xEE, 0xE5, 0xFC, + 0x8E, 0xF9, 0xD3, 0x03, 0x3F, 0xFB, 0xD4, 0x00, 0xB0, 0x01, 0x8D, 0x03, + 0x30, 0x01, 0x91, 0x03, 0xE3, 0xFF, 0x23, 0x03, 0xFB, 0x04, 0x45, 0x03, + 0xB3, 0x0E, 0xBD, 0x04, 0xF7, 0x15, 0x7F, 0x09, 0xC6, 0x11, 0xFF, 0x0D, + 0x8E, 0x09, 0xCA, 0x12, 0x15, 0x00, 0x33, 0x16, 0x1A, 0xFA, 0x6C, 0x17, + 0xFB, 0xF5, 0xF6, 0x13, 0xA6, 0xF9, 0x0B, 0x0C, 0x52, 0x07, 0x3F, 0x06, + 0x48, 0x10, 0x00, 0x09, 0x51, 0x09, 0xFA, 0x0D, 0x67, 0x07, 0x01, 0x0F, + 0x40, 0x11, 0x7D, 0x09, 0xD8, 0x1F, 0xD6, 0x09, 0xAD, 0x2C, 0x3A, 0x0E, + 0xAC, 0x35, 0x6E, 0x18, 0x9F, 0x36, 0x3B, 0x23, 0xBA, 0x30, 0x2A, 0x26, + 0x6B, 0x30, 0xEE, 0x2B, 0x08, 0x38, 0xE7, 0x32, 0x6C, 0x38, 0xD7, 0x35, + 0x99, 0x2F, 0x5C, 0x38, 0x42, 0x21, 0xE7, 0x31, 0x42, 0x1D, 0x02, 0x2C, + 0xD5, 0x1F, 0x20, 0x2D, 0x7A, 0x1A, 0x7F, 0x28, 0xA0, 0x25, 0x56, 0x2C, + 0x9F, 0x31, 0xBC, 0x31, 0xC1, 0x32, 0x18, 0x2F, 0x58, 0x37, 0xC0, 0x2C, + 0xB7, 0x35, 0x14, 0x2B, 0xA4, 0x28, 0xCA, 0x27, 0xCD, 0x19, 0xB1, 0x1F, + 0xF3, 0x1F, 0x50, 0x25, 0x16, 0x24, 0xB9, 0x29, 0x6C, 0x1C, 0x04, 0x22, + 0xA6, 0x20, 0xBA, 0x23, 0xAE, 0x18, 0x06, 0x1E, 0x2A, 0x0D, 0xA8, 0x10, + 0x95, 0x14, 0xA9, 0x0A, 0x19, 0x21, 0xB2, 0x0C, 0x18, 0x23, 0x13, 0x10, + 0x60, 0x1D, 0xF9, 0x0E, 0x2B, 0x1B, 0x6B, 0x11, 0x68, 0x16, 0xFD, 0x18, + 0x56, 0x07, 0x16, 0x1A, 0x81, 0xFA, 0x25, 0x1D, 0x70, 0xF7, 0x48, 0x26, + 0xF3, 0xF9, 0x54, 0x23, 0xEF, 0xFE, 0xAE, 0x18, 0x35, 0xFF, 0xC8, 0x0F, + 0xED, 0xFE, 0xBE, 0x06, 0x02, 0x00, 0x20, 0x00, 0x2B, 0x01, 0xFB, 0xFD, + 0x9E, 0x08, 0x8C, 0xFC, 0xDE, 0x17, 0xB8, 0xFE, 0x20, 0x22, 0x6F, 0x02, + 0x1F, 0x23, 0x33, 0x07, 0x5C, 0x1F, 0xF4, 0x07, 0x17, 0x19, 0x0C, 0x05, + 0x76, 0x10, 0x6C, 0x03, 0xA5, 0x05, 0xB0, 0x06, 0xBB, 0x02, 0xD9, 0x0E, + 0x2E, 0x06, 0x12, 0x09, 0x6D, 0x0B, 0x0F, 0xFE, 0x5C, 0x0C, 0x6E, 0xF5, + 0xDE, 0x02, 0x1E, 0xEF, 0xCD, 0xFB, 0xE3, 0xF1, 0xA3, 0x01, 0x97, 0xFD, + 0x97, 0x0C, 0x86, 0x10, 0x64, 0x0E, 0x83, 0x20, 0xC3, 0x05, 0x2C, 0x23, + 0x20, 0x02, 0x65, 0x20, 0xC8, 0xFD, 0xF2, 0x14, 0x6F, 0xF9, 0x39, 0x0B, + 0x19, 0xF8, 0x9F, 0x11, 0x8D, 0xF4, 0x2C, 0x18, 0x8A, 0xED, 0x9B, 0x17, + 0xE8, 0xE3, 0x4D, 0x0A, 0x83, 0xEB, 0x24, 0x00, 0x6D, 0xF8, 0x3A, 0xFC, + 0x01, 0xFC, 0xAB, 0xF6, 0xC8, 0xFD, 0x88, 0xF4, 0x12, 0xFD, 0xB4, 0xEF, + 0xB5, 0xFD, 0x8A, 0xE9, 0x42, 0x00, 0xD0, 0xE2, 0x71, 0xFC, 0x33, 0xDF, + 0x11, 0xF4, 0x8D, 0xDD, 0xCC, 0xF5, 0x3B, 0xDB, 0x36, 0x06, 0xF1, 0xE1, + 0xEF, 0x0C, 0x6F, 0xEC, 0xFA, 0xF7, 0xE9, 0xE8, 0x53, 0xE5, 0xE7, 0xE1, + 0x82, 0xE6, 0x59, 0xE0, 0x0D, 0xED, 0x45, 0xE0, 0xA9, 0xF2, 0x48, 0xE5, + 0x9A, 0xF2, 0x21, 0xED, 0x20, 0xF7, 0x89, 0xF7, 0x3B, 0xF7, 0x11, 0xF8, + 0x28, 0xEC, 0x36, 0xF5, 0xCA, 0xE0, 0x80, 0xFB, 0xE6, 0xD4, 0x0E, 0xF7, + 0x29, 0xDD, 0x2D, 0xF4, 0x24, 0xE9, 0x0A, 0xF4, 0xCB, 0xED, 0xEA, 0xF6, + 0x39, 0xEB, 0xCC, 0x01, 0xC2, 0xE3, 0xC1, 0x06, 0x11, 0xE5, 0x9D, 0x03, + 0x3E, 0xEA, 0x05, 0xFB, 0xED, 0xF5, 0x0C, 0xFD, 0x7E, 0xFA, 0xB7, 0x05, + 0x6C, 0xED, 0x39, 0x05, 0x4B, 0xE3, 0x77, 0x04, 0x67, 0xD9, 0x05, 0xF9, + 0x04, 0xD5, 0x96, 0xE6, 0x79, 0xF3, 0x8F, 0xF0, 0x04, 0x04, 0xF3, 0xF6, + 0x17, 0xF8, 0xE7, 0xEA, 0x5E, 0xF9, 0x8B, 0xEC, 0xEF, 0x02, 0x95, 0xF4, + 0xAE, 0x04, 0xB7, 0xF4, 0xB9, 0xFD, 0xD2, 0xF1, 0x12, 0xFE, 0x94, 0xF2, + 0xD7, 0x09, 0xD8, 0xF6, 0xFA, 0x15, 0xA4, 0xFF, 0x24, 0x18, 0xB3, 0x0C, + 0xF9, 0x07, 0xAD, 0x0D, 0x67, 0xF7, 0x3D, 0x06, 0xB9, 0xF6, 0x0C, 0x05, + 0xC3, 0x00, 0x4A, 0x0A, 0x03, 0x06, 0x17, 0x0B, 0xDF, 0x06, 0x15, 0x05, + 0xD5, 0x06, 0xE7, 0x00, 0x31, 0x01, 0x7D, 0x04, 0xC0, 0x00, 0x36, 0x0D, + 0x94, 0x05, 0x75, 0x0F, 0x5D, 0x0F, 0x05, 0x1B, 0x2B, 0x10, 0x9A, 0x26, + 0x55, 0x0B, 0xB0, 0x20, 0x5E, 0x0A, 0xE0, 0x08, 0x61, 0x0C, 0x62, 0xF2, + 0x92, 0x0A, 0xF1, 0xEC, 0x15, 0x05, 0x4C, 0xF3, 0x45, 0x0A, 0xE1, 0xFE, + 0x49, 0x0A, 0x79, 0xFB, 0xF6, 0x03, 0x5B, 0xF6, 0xED, 0x00, 0xB5, 0xF7, + 0xD3, 0x02, 0xAB, 0xEE, 0xC8, 0x0B, 0xEE, 0xE2, 0xB8, 0x19, 0x3D, 0xEC, + 0x4D, 0x1E, 0xFC, 0xFF, 0x0E, 0x1C, 0x8B, 0x0E, 0x66, 0x0C, 0x93, 0x0C, + 0x15, 0xFE, 0x75, 0x0F, 0x20, 0xF3, 0x73, 0x13, 0x41, 0xED, 0x76, 0x11, + 0x16, 0xE9, 0x49, 0x08, 0xE3, 0xE3, 0x7D, 0xFD, 0xD6, 0xE8, 0x38, 0x03, + 0x57, 0xE2, 0x93, 0x02, 0x75, 0xE0, 0xF0, 0x03, 0xA5, 0xDD, 0x60, 0xFC, + 0xFC, 0xDD, 0x95, 0xF1, 0xB0, 0xFD, 0xD5, 0x02, 0x57, 0x0B, 0x82, 0x04, + 0x61, 0x03, 0x8D, 0xFA, 0xA9, 0x00, 0xB8, 0xFD, 0x4F, 0xFF, 0x85, 0x00, + 0x33, 0xF9, 0x16, 0xF4, 0x65, 0xFF, 0xCC, 0xEB, 0x76, 0x11, 0x4D, 0xF4, + 0x5C, 0x0E, 0xF3, 0xF1, 0xCB, 0x0A, 0x15, 0xF3, 0x60, 0x13, 0xE0, 0xFD, + 0x75, 0x08, 0x8E, 0xF2, 0x40, 0x00, 0x3C, 0xE9, 0xEB, 0x1B, 0xBB, 0x02, + 0x8E, 0x28, 0x90, 0x0C, 0x79, 0x1E, 0x86, 0x03, 0xD5, 0x20, 0x2E, 0x0F, + 0x2E, 0x14, 0xA5, 0x10, 0xC1, 0xF3, 0x05, 0xFB, 0xE9, 0xED, 0x68, 0xF9, + 0x98, 0x06, 0x30, 0x11, 0xB6, 0x0B, 0x9E, 0x11, 0xE7, 0x0F, 0x3E, 0x12, + 0xE5, 0x1F, 0x66, 0x26, 0x9A, 0x13, 0x79, 0x26, 0xF9, 0xF5, 0x7D, 0x15, + 0xC1, 0xF2, 0xD0, 0x16, 0x95, 0x00, 0x62, 0x20, 0x03, 0xFF, 0x04, 0x16, + 0x23, 0x06, 0x02, 0x13, 0xEB, 0x13, 0x8C, 0x18, 0x87, 0x0A, 0x61, 0x0D, + 0x3C, 0xFA, 0x19, 0x00, 0x7C, 0xF5, 0x1F, 0xFB, 0xDC, 0xFD, 0x04, 0xFE, + 0x77, 0x0E, 0x7D, 0x0B, 0x7D, 0x1E, 0xBC, 0x20, 0xB5, 0x29, 0x54, 0x36, + 0x93, 0x1E, 0x5C, 0x34, 0x59, 0x12, 0x8E, 0x2C, 0x80, 0x1B, 0x63, 0x33, + 0x75, 0x29, 0xE6, 0x38, 0x5F, 0x2E, 0x29, 0x36, 0x73, 0x36, 0x7D, 0x3E, + 0xA1, 0x39, 0x98, 0x46, 0x1A, 0x27, 0xA2, 0x33, 0x4F, 0x16, 0xEB, 0x18, + 0x24, 0x15, 0xCE, 0x09, 0xD6, 0x1C, 0x52, 0x07, 0xC5, 0x1F, 0x40, 0x08, + 0x1E, 0x1C, 0x16, 0x0B, 0xB3, 0x06, 0x69, 0xFF, 0x07, 0xEA, 0xA8, 0xE5, + 0xF2, 0xD4, 0x37, 0xC6, 0xC9, 0xD2, 0xB3, 0xB1, 0x4D, 0xE0, 0xAA, 0xB1, + 0x2B, 0xED, 0xE0, 0xBD, 0xB6, 0xF8, 0xD3, 0xD2, 0x37, 0xFA, 0x7B, 0xDE, + 0x05, 0xFB, 0x6F, 0xE3, 0x73, 0xF6, 0x9E, 0xDE, 0xEB, 0xEB, 0xD8, 0xD6, + 0xFD, 0xE6, 0x5F, 0xDC, 0x42, 0xE7, 0x18, 0xEC, 0xFF, 0xE5, 0x64, 0xF9, + 0x6E, 0xDB, 0x57, 0xF8, 0xDA, 0xD1, 0xEF, 0xEF, 0xAA, 0xCC, 0x22, 0xE1, + 0xFF, 0xD2, 0x28, 0xD7, 0xBF, 0xDE, 0xE2, 0xD6, 0xB2, 0xE5, 0x2E, 0xDD, + 0x91, 0xF3, 0xA3, 0xF1, 0x8E, 0xFD, 0x06, 0x01, 0xCF, 0xF9, 0x1C, 0xFE, + 0x2B, 0xF4, 0x76, 0xF5, 0x87, 0xF6, 0x60, 0xF2, 0xAB, 0xF5, 0x93, 0xED, + 0xC8, 0xEE, 0xAB, 0xE9, 0x8D, 0xF0, 0x03, 0xF5, 0xB2, 0xE2, 0x7B, 0xF0, + 0x6D, 0xCC, 0xEB, 0xDD, 0x39, 0xCA, 0x6C, 0xD8, 0x86, 0xCF, 0x36, 0xD2, + 0x2F, 0xD0, 0x63, 0xC2, 0xFF, 0xD3, 0x44, 0xBE, 0x74, 0xD7, 0xB1, 0xCC, + 0x74, 0xCD, 0xD3, 0xD4, 0x04, 0xBC, 0x09, 0xC6, 0x76, 0xBA, 0x1F, 0xB5, + 0x39, 0xB6, 0x18, 0xA3, 0xD0, 0xAA, 0x61, 0x97, 0xD3, 0xB9, 0xDC, 0xAB, + 0xA6, 0xC6, 0xA7, 0xBC, 0x0C, 0xC4, 0x8B, 0xBF, 0x50, 0xC9, 0xB5, 0xCA, + 0x40, 0xDB, 0x44, 0xDB, 0xC5, 0xEC, 0x7A, 0xE7, 0x9B, 0xF4, 0x8B, 0xF3, + 0xAA, 0x03, 0xCE, 0x10, 0x07, 0x16, 0x8F, 0x2D, 0xF2, 0x1A, 0x02, 0x36, + 0x4A, 0x11, 0x0E, 0x33, 0xD1, 0x03, 0x16, 0x2D, 0xA6, 0xF6, 0x4E, 0x18, + 0x9C, 0xED, 0x41, 0xF9, 0xA4, 0xEE, 0x57, 0xEB, 0xD0, 0xF0, 0x81, 0xED, + 0xC8, 0xFC, 0x78, 0xF6, 0x88, 0x21, 0x77, 0x09, 0x33, 0x3E, 0x72, 0x13, + 0x97, 0x3E, 0x1E, 0x10, 0x11, 0x32, 0x2B, 0x0C, 0xD9, 0x22, 0x4B, 0x09, + 0x7B, 0x1D, 0xA4, 0x12, 0xB1, 0x16, 0x9F, 0x19, 0x27, 0x13, 0x1F, 0x1B, + 0x55, 0x10, 0x50, 0x17, 0xEE, 0xF6, 0xE3, 0x03, 0xC3, 0xDB, 0x3B, 0xF7, + 0xBF, 0xD0, 0x46, 0xF4, 0x45, 0xCD, 0x1B, 0xE8, 0xCF, 0xD7, 0xE0, 0xDE, + 0x0F, 0xEF, 0xD6, 0xE0, 0x1A, 0x02, 0xF5, 0xE2, 0x84, 0x0A, 0x45, 0xE6, + 0x12, 0x03, 0x76, 0xEA, 0x4B, 0xF5, 0x4D, 0xF0, 0x25, 0xF6, 0x2B, 0xFD, + 0x35, 0x0B, 0x5E, 0x12, 0x41, 0x16, 0x47, 0x18, 0xA6, 0x17, 0xD9, 0x12, + 0xE4, 0x28, 0x6D, 0x1C, 0xBF, 0x2F, 0xEE, 0x21, 0x27, 0x23, 0xAF, 0x20, + 0x54, 0x1B, 0x04, 0x29, 0x9C, 0x2B, 0x5E, 0x3F, 0x51, 0x49, 0x91, 0x56, + 0x50, 0x5B, 0x39, 0x60, 0x0E, 0x5E, 0x93, 0x60, 0x1B, 0x57, 0x05, 0x5B, + 0xCA, 0x3E, 0x60, 0x43, 0xEC, 0x1E, 0xC8, 0x22, 0x93, 0x0D, 0xB6, 0x10, + 0x8E, 0x0B, 0x1F, 0x0E, 0x53, 0x1D, 0xD5, 0x1D, 0x73, 0x38, 0x4D, 0x34, + 0xF9, 0x3A, 0x6D, 0x31, 0x4C, 0x22, 0x05, 0x15, 0x3D, 0x19, 0xB7, 0x07, + 0x96, 0x27, 0xEC, 0x0D, 0xD9, 0x30, 0xE3, 0x0F, 0x52, 0x35, 0xD4, 0x17, + 0x9B, 0x3A, 0xA6, 0x2B, 0xEF, 0x27, 0x7F, 0x27, 0x80, 0x05, 0x32, 0x0D, + 0xEC, 0xEE, 0xFD, 0xFC, 0xE8, 0xE7, 0x19, 0xFD, 0x46, 0xE2, 0x9C, 0xF9, + 0x47, 0xDC, 0x55, 0xEE, 0xEA, 0xD9, 0x34, 0xE5, 0x58, 0xCE, 0xCE, 0xD4, + 0x83, 0xCB, 0xD7, 0xCB, 0x63, 0xD7, 0x40, 0xD0, 0xCC, 0xD7, 0x3B, 0xCD, + 0x1A, 0xE0, 0x5D, 0xD6, 0x33, 0xF8, 0xF6, 0xEC, 0x9E, 0x06, 0xAA, 0xF4, + 0x41, 0x10, 0x78, 0xF6, 0x61, 0x0F, 0x0D, 0xF1, 0x62, 0x12, 0x1F, 0xF5, + 0x44, 0x1C, 0x16, 0x07, 0x03, 0x13, 0x0F, 0x0A, 0x16, 0x07, 0xB9, 0x07, + 0x79, 0x0F, 0x56, 0x15, 0xF2, 0x1F, 0xCC, 0x2A, 0xE8, 0x1D, 0x53, 0x2C, + 0xF3, 0x25, 0x5F, 0x30, 0x77, 0x27, 0x59, 0x2A, 0x60, 0x10, 0x30, 0x15, + 0x30, 0xFF, 0x2A, 0x0F, 0xC4, 0xF7, 0x33, 0x0B, 0xC7, 0xFA, 0x20, 0x03, + 0xFB, 0x0A, 0x99, 0x09, 0x27, 0x11, 0xC5, 0x15, 0xC3, 0xFD, 0x24, 0x10, + 0x70, 0xE8, 0x35, 0x00, 0x9E, 0xE2, 0x5A, 0xF5, 0x88, 0xEA, 0x39, 0xF7, + 0xAD, 0xF3, 0x42, 0xFF, 0x52, 0x02, 0x2C, 0x10, 0xF2, 0x08, 0x32, 0x18, + 0xD5, 0xFD, 0xC5, 0x0A, 0x31, 0xF6, 0xC9, 0xFE, 0xD4, 0xF2, 0xF6, 0xF9, + 0x67, 0xEE, 0x7A, 0xF7, 0x74, 0xE7, 0xD2, 0xEF, 0x22, 0xDE, 0xFD, 0xDF, + 0x62, 0xCE, 0x28, 0xC8, 0xA8, 0xCD, 0x5E, 0xC0, 0x68, 0xD4, 0xEA, 0xBD, + 0xBC, 0xD3, 0x12, 0xB3, 0xC3, 0xD4, 0xC4, 0xB1, 0xED, 0xD6, 0xE7, 0xBC, + 0x89, 0xDD, 0x55, 0xCF, 0xCC, 0xE6, 0x55, 0xDE, 0x0C, 0xF5, 0xE5, 0xEB, + 0x5A, 0xFB, 0xEB, 0xEE, 0x8F, 0x07, 0x5E, 0xF9, 0x6F, 0x0A, 0x99, 0x00, + 0x06, 0xF9, 0x40, 0xF8, 0xB3, 0xFA, 0x72, 0xFD, 0x98, 0x0B, 0xC4, 0x08, + 0xA6, 0x0E, 0x2F, 0x0B, 0x8E, 0x00, 0xF5, 0x0C, 0x7D, 0xF1, 0x67, 0x11, + 0x06, 0xDE, 0x5B, 0x00, 0x3D, 0xD8, 0x6D, 0xED, 0x8C, 0xDA, 0x1E, 0xE5, + 0xC0, 0xDB, 0x32, 0xE5, 0x7E, 0xE5, 0x60, 0xF0, 0x68, 0xFB, 0xC8, 0x06, + 0x1F, 0x03, 0x8E, 0x0F, 0x14, 0xF8, 0xCE, 0x03, 0x11, 0xF6, 0xEE, 0xFD, + 0x88, 0xF3, 0xD1, 0xFA, 0x59, 0xEC, 0x19, 0xFA, 0x6B, 0xE4, 0x51, 0xF8, + 0xF6, 0xE7, 0x3A, 0xFB, 0xC8, 0xEB, 0x40, 0xFA, 0x89, 0xEF, 0x04, 0xF6, + 0x71, 0xFB, 0x9F, 0xF2, 0xD0, 0x07, 0x57, 0xEE, 0xF6, 0x10, 0x1C, 0xF4, + 0xE9, 0x07, 0xC2, 0xF3, 0xC7, 0xF9, 0x84, 0xE8, 0x12, 0xF4, 0x1B, 0xDB, + 0x4A, 0xFA, 0x24, 0xDF, 0xF9, 0xF6, 0x36, 0xE6, 0x01, 0xF0, 0x84, 0xE8, + 0x1B, 0xE9, 0x75, 0xE1, 0xA7, 0xDE, 0x16, 0xD7, 0x47, 0xE8, 0xF0, 0xE6, + 0x0C, 0xF8, 0x87, 0xF9, 0xFB, 0xFC, 0xA6, 0xF9, 0xE7, 0x04, 0xA4, 0x00, + 0x28, 0x17, 0xD3, 0x1D, 0x80, 0x14, 0x1A, 0x27, 0xE4, 0x0D, 0x54, 0x20, + 0x6A, 0x1E, 0xF8, 0x28, 0x3D, 0x2E, 0xC6, 0x34, 0x35, 0x33, 0x60, 0x3B, + 0x2F, 0x33, 0x9E, 0x3B, 0x44, 0x27, 0x06, 0x2D, 0x15, 0x0A, 0x93, 0x0B, + 0x5F, 0xF9, 0x78, 0xF3, 0x11, 0xF7, 0xCA, 0xE9, 0x64, 0xF6, 0x1C, 0xE8, + 0x85, 0x00, 0x72, 0xF7, 0xCD, 0x18, 0xAC, 0x12, 0xEC, 0x22, 0x5D, 0x1A, + 0x0D, 0x1A, 0x87, 0x0D, 0xF1, 0x11, 0xCB, 0x02, 0x5A, 0x0C, 0x38, 0xFD, + 0xBC, 0x15, 0x67, 0x08, 0x35, 0x20, 0xFB, 0x17, 0xA3, 0x1D, 0xB2, 0x21, + 0xF5, 0x0E, 0xE7, 0x23, 0x76, 0xFA, 0x77, 0x1B, 0x5F, 0xEC, 0xE6, 0x10, + 0x3E, 0xE6, 0xC7, 0x0B, 0xC5, 0xE9, 0x98, 0x11, 0x49, 0xE5, 0xE5, 0x0C, + 0xE1, 0xDC, 0x07, 0xFE, 0xC7, 0xD7, 0x5F, 0xEE, 0xB7, 0xD9, 0xA4, 0xE9, + 0x15, 0xE2, 0x21, 0xF0, 0x84, 0xEF, 0xD4, 0xF6, 0x04, 0xF6, 0x57, 0xF2, + 0x35, 0xF1, 0xAD, 0xE9, 0x9C, 0xF1, 0xB8, 0xEC, 0x77, 0xF6, 0xAB, 0xEF, + 0xB4, 0xF4, 0x6F, 0xE8, 0xE7, 0xF9, 0x91, 0xEC, 0xEA, 0x17, 0x65, 0x07, + 0x9E, 0x28, 0xC1, 0x0D, 0x98, 0x22, 0x8B, 0x01, 0x97, 0x23, 0xDF, 0x06, + 0x30, 0x2D, 0xD8, 0x17, 0x74, 0x35, 0x44, 0x23, 0x98, 0x3F, 0xE6, 0x30, + 0x08, 0x3B, 0x9C, 0x2E, 0xA9, 0x27, 0x1C, 0x17, 0x55, 0x1D, 0x37, 0x0A, + 0x6A, 0x0C, 0x68, 0xFF, 0x21, 0xF3, 0x3C, 0xF4, 0x54, 0xF4, 0x7C, 0x03, + 0x48, 0x07, 0xB0, 0x1E, 0x97, 0x0D, 0xF2, 0x25, 0x52, 0x0C, 0xC8, 0x26, + 0x36, 0x09, 0xE7, 0x2B, 0x96, 0x10, 0x7D, 0x30, 0x3A, 0x23, 0xC9, 0x32, + 0x1D, 0x2C, 0xF3, 0x33, 0xA2, 0x29, 0xFF, 0x36, 0xCE, 0x26, 0xD1, 0x33, + 0x6A, 0x20, 0x98, 0x24, 0xFA, 0x1C, 0xB5, 0x1B, 0x6B, 0x17, 0x98, 0x13, + 0x4B, 0x19, 0x53, 0x13, 0x59, 0x1C, 0x2D, 0x17, 0xA0, 0x0C, 0x5C, 0x06, + 0xEF, 0xFB, 0x5B, 0xF6, 0xC0, 0xF5, 0x3A, 0xFA, 0xC7, 0xFA, 0xD9, 0x01, + 0xDB, 0x09, 0xA9, 0x00, 0x60, 0x11, 0xD8, 0xFA, 0x0A, 0x04, 0xC5, 0xF9, + 0x55, 0x00, 0xFC, 0x0B, 0xA4, 0x0B, 0x81, 0x20, 0x5B, 0x0D, 0x6F, 0x20, + 0x17, 0x15, 0xF1, 0x20, 0xC0, 0x29, 0x92, 0x2F, 0x13, 0x29, 0x1B, 0x2F, + 0x38, 0x17, 0x85, 0x21, 0xCB, 0x14, 0x81, 0x1C, 0x16, 0x20, 0x69, 0x18, + 0x15, 0x30, 0x28, 0x19, 0x91, 0x3D, 0xFF, 0x20, 0x10, 0x35, 0xCC, 0x1C, + 0xFA, 0x18, 0x8C, 0x08, 0xB8, 0x07, 0x5F, 0xF6, 0xBC, 0xFE, 0x51, 0xE5, + 0x45, 0xEE, 0x0B, 0xD5, 0xFE, 0xE5, 0x20, 0xDE, 0xC4, 0xED, 0x72, 0xF3, + 0x9A, 0xF5, 0xF6, 0xF9, 0x7A, 0xEF, 0x85, 0xF5, 0x89, 0xE9, 0x25, 0xF4, + 0x47, 0xED, 0x47, 0xF2, 0x0F, 0xF5, 0x0C, 0xED, 0x24, 0x00, 0xBB, 0xF1, + 0xD3, 0x05, 0xE9, 0xF4, 0x67, 0x06, 0x27, 0xF2, 0x73, 0x03, 0x81, 0xF1, + 0x26, 0xFB, 0x5D, 0xF2, 0x51, 0xE8, 0x6D, 0xEA, 0xF9, 0xDD, 0xE7, 0xE7, + 0x56, 0xDC, 0x84, 0xEC, 0x4B, 0xCB, 0xEE, 0xE5, 0x2F, 0xB7, 0x65, 0xD9, + 0xF8, 0xB7, 0xBB, 0xD2, 0xF9, 0xBE, 0xE0, 0xD2, 0x11, 0xB8, 0xAF, 0xD0, + 0x43, 0xB9, 0x14, 0xD0, 0x45, 0xC7, 0x1B, 0xC9, 0x0E, 0xD3, 0x3C, 0xC4, + 0xCE, 0xD8, 0xB7, 0xCF, 0xF3, 0xD5, 0x1D, 0xDA, 0x41, 0xCE, 0x70, 0xDC, + 0xC7, 0xDA, 0x38, 0xE4, 0x07, 0xF0, 0xBA, 0xE7, 0x3D, 0xF9, 0x87, 0xE5, + 0x30, 0xFD, 0x9B, 0xED, 0x90, 0x04, 0x89, 0xFB, 0xC5, 0x0E, 0x5D, 0x02, + 0x5F, 0x0D, 0x3D, 0x00, 0x8F, 0x04, 0x84, 0xF9, 0x19, 0xFC, 0xC9, 0xED, + 0x06, 0xF3, 0x0E, 0xE5, 0x19, 0xE1, 0x49, 0xDC, 0xB3, 0xCD, 0x0B, 0xD2, + 0x43, 0xCC, 0xB4, 0xD2, 0x1D, 0xCF, 0x31, 0xDF, 0xCA, 0xCD, 0xAF, 0xEE, + 0xF7, 0xD3, 0x93, 0xF4, 0x69, 0xE0, 0x7C, 0xF4, 0xE3, 0xEC, 0x66, 0xFB, + 0xDE, 0xF0, 0x10, 0x01, 0x37, 0xF4, 0x68, 0x03, 0x9C, 0xF6, 0x09, 0x05, + 0xAA, 0xF8, 0xB8, 0x02, 0x2E, 0x02, 0xAE, 0xFC, 0x72, 0x06, 0xEF, 0xF8, + 0x04, 0xFF, 0x0C, 0xF4, 0x3E, 0x02, 0x36, 0xF0, 0x17, 0x06, 0x5A, 0xE8, + 0x14, 0xF1, 0x88, 0xD4, 0xD7, 0xE2, 0x1C, 0xCC, 0x5C, 0xE5, 0xF0, 0xD4, + 0x78, 0xE3, 0xAA, 0xE0, 0xDD, 0xE2, 0xE9, 0xE8, 0x9E, 0xEE, 0x84, 0xEC, + 0x42, 0xEF, 0x64, 0xE7, 0x38, 0xF2, 0x09, 0xED, 0xCE, 0x06, 0x66, 0xF8, + 0xF6, 0x12, 0x2D, 0xFA, 0xA4, 0x17, 0xC8, 0x01, 0x88, 0x25, 0x7A, 0x1A, + 0x13, 0x2B, 0xD9, 0x25, 0x27, 0x20, 0x45, 0x1E, 0xAD, 0x24, 0x17, 0x27, + 0x03, 0x37, 0x00, 0x3C, 0x4A, 0x3F, 0x23, 0x51, 0x20, 0x41, 0x93, 0x5E, + 0x59, 0x45, 0xA0, 0x59, 0xEA, 0x3B, 0x67, 0x3A, 0xFA, 0x25, 0xAB, 0x1F, + 0xE6, 0x11, 0x09, 0x1A, 0x2B, 0x0C, 0xB4, 0x15, 0x88, 0x16, 0xBC, 0x15, + 0xE4, 0x1F, 0x16, 0x1D, 0x97, 0x23, 0x7C, 0x22, 0x34, 0x1F, 0xA7, 0x1B, + 0x73, 0x14, 0xAA, 0x11, 0x62, 0x14, 0xE6, 0x16, 0x77, 0x24, 0xCD, 0x24, + 0xC4, 0x31, 0x04, 0x31, 0x97, 0x2D, 0xA2, 0x35, 0x03, 0x26, 0xE6, 0x2F, + 0x23, 0x23, 0x3F, 0x24, 0x8B, 0x22, 0xC2, 0x18, 0x8C, 0x2B, 0x4F, 0x19, + 0xB4, 0x32, 0x64, 0x1F, 0x1F, 0x26, 0xB5, 0x1B, 0xA6, 0x0C, 0xC3, 0x0D, + 0xFF, 0xF6, 0x40, 0xFF, 0xF9, 0xE7, 0x71, 0xF6, 0x45, 0xEA, 0xEA, 0xFD, + 0xFD, 0xF8, 0x2A, 0x0D, 0x3C, 0x03, 0xA7, 0x16, 0x7C, 0xF9, 0x20, 0x0C, + 0x2A, 0xEC, 0x98, 0x01, 0xB8, 0xEB, 0xBF, 0x08, 0xF0, 0xEE, 0xBE, 0x03, + 0x8B, 0xF4, 0x4A, 0xF3, 0x23, 0x04, 0xDC, 0xF6, 0x3A, 0x0E, 0x2B, 0x06, + 0xC6, 0x06, 0x13, 0x03, 0xD4, 0x04, 0x5B, 0xFA, 0x58, 0x0D, 0x54, 0xF9, + 0x75, 0x1F, 0x72, 0xFA, 0x82, 0x33, 0x68, 0x02, 0x9E, 0x39, 0x32, 0x08, + 0x30, 0x2B, 0x78, 0xFC, 0xC1, 0x1B, 0x86, 0xF0, 0x69, 0x0E, 0xE9, 0xEB, + 0x8E, 0xF8, 0xF7, 0xE5, 0x2B, 0xEB, 0xBA, 0xE0, 0x1D, 0xEC, 0xEB, 0xE4, + 0x90, 0xEE, 0xA8, 0xF1, 0xD2, 0xEC, 0xD9, 0xFF, 0x26, 0xE6, 0x0B, 0x05, + 0x2D, 0xE2, 0x65, 0x03, 0xF9, 0xEC, 0xB7, 0x0B, 0xA7, 0x03, 0x77, 0x1B, + 0xF7, 0x12, 0x47, 0x25, 0x63, 0x10, 0x76, 0x2A, 0x6E, 0x08, 0x28, 0x2C, + 0xFF, 0xFF, 0x9A, 0x21, 0xD1, 0xF7, 0x73, 0x15, 0x8A, 0xED, 0xF3, 0x09, + 0x5A, 0xE9, 0x05, 0xFD, 0x67, 0xE7, 0xD1, 0xEB, 0x56, 0xE1, 0x84, 0xDD, + 0xB0, 0xD8, 0x44, 0xD0, 0x18, 0xD6, 0xB9, 0xC9, 0x71, 0xDC, 0x46, 0xD3, + 0x29, 0xE5, 0x3C, 0xDB, 0x78, 0xE3, 0xD1, 0xCF, 0xCE, 0xDF, 0x4A, 0xC2, + 0xFE, 0xF2, 0x4E, 0xC9, 0x04, 0x07, 0xD3, 0xD2, 0x80, 0x07, 0x32, 0xD7, + 0x0D, 0x00, 0xF4, 0xDE, 0xC6, 0x04, 0xAF, 0xEA, 0xCC, 0x01, 0x4C, 0xEB, + 0x69, 0xEE, 0xEB, 0xE4, 0x1B, 0xEA, 0x91, 0xE3, 0x16, 0xF6, 0x46, 0xE9, + 0xF7, 0x0A, 0x10, 0x01, 0x8C, 0x12, 0xCF, 0x18, 0x6B, 0xFE, 0x67, 0x10, + 0xFF, 0xE9, 0x06, 0xFB, 0xEC, 0xDD, 0x15, 0xF1, 0x50, 0xCF, 0x08, 0xE6, + 0x5B, 0xC8, 0xE7, 0xE1, 0x58, 0xCF, 0xC2, 0xED, 0x7C, 0xD2, 0x78, 0xFB, + 0x95, 0xCF, 0x39, 0xFD, 0xBA, 0xD0, 0x2C, 0xF2, 0x57, 0xCF, 0x20, 0xE3, + 0x06, 0xD8, 0xBC, 0xE3, 0x26, 0xEF, 0x9E, 0xF4, 0x5A, 0xF7, 0x8C, 0xF8, + 0xB3, 0xF3, 0xBB, 0xF1, 0x54, 0xFA, 0x56, 0xF5, 0x1F, 0xF7, 0x04, 0xF8, + 0x3C, 0xEF, 0x63, 0xFD, 0x90, 0xF6, 0x64, 0x06, 0xB9, 0x04, 0xC9, 0x09, + 0x34, 0xFD, 0x49, 0x02, 0x2F, 0xE1, 0x61, 0xEE, 0x1C, 0xCE, 0x82, 0xD8, + 0x4F, 0xCC, 0x81, 0xCC, 0xEA, 0xD8, 0xF7, 0xCD, 0xE6, 0xEC, 0x34, 0xD7, + 0x61, 0xFE, 0xC2, 0xDE, 0xD2, 0xF7, 0xF9, 0xD7, 0xFD, 0xEF, 0x66, 0xDE, + 0x9F, 0xF5, 0x09, 0xF5, 0xF5, 0xF6, 0xBC, 0xFE, 0xDC, 0xFD, 0xBB, 0x04, + 0x53, 0x0F, 0x11, 0x16, 0x71, 0x17, 0x0D, 0x1A, 0x73, 0x14, 0x81, 0x07, + 0xB6, 0x17, 0x68, 0x02, 0x45, 0x19, 0x93, 0x0B, 0x6B, 0x17, 0x81, 0x18, + 0x7A, 0x20, 0xA2, 0x2A, 0xD5, 0x1E, 0xAB, 0x29, 0xA7, 0x0D, 0xCF, 0x19, + 0x72, 0xFB, 0x23, 0x0A, 0x69, 0xE3, 0x42, 0xEF, 0xAC, 0xDB, 0x07, 0xD3, + 0x6D, 0xEE, 0xE1, 0xD0, 0x1B, 0x01, 0x0C, 0xE7, 0x21, 0x02, 0xDD, 0xFD, + 0x0B, 0xFC, 0x08, 0x0B, 0xFF, 0xF4, 0x0A, 0x03, 0x81, 0xF7, 0x34, 0xF7, + 0x24, 0x0A, 0x37, 0xFE, 0xC4, 0x18, 0x3C, 0x0B, 0x14, 0x1A, 0xB0, 0x0E, + 0xE2, 0x19, 0x4B, 0x11, 0x6C, 0x13, 0x13, 0x11, 0x3B, 0x0A, 0x05, 0x0B, + 0x65, 0x07, 0xFE, 0x02, 0x84, 0x09, 0x5F, 0xFF, 0xBF, 0x09, 0x23, 0xFF, + 0xC3, 0xF9, 0x4E, 0xF2, 0x2A, 0xED, 0xF8, 0xE8, 0xAD, 0xE5, 0xCD, 0xE0, + 0x5B, 0xDC, 0x8C, 0xDA, 0xBE, 0xD7, 0xA2, 0xDD, 0xB0, 0xDA, 0x46, 0xE7, + 0x22, 0xD6, 0x5F, 0xE8, 0xD5, 0xD4, 0xB0, 0xEF, 0xF1, 0xE6, 0x05, 0x06, + 0x04, 0xF0, 0x23, 0x01, 0x77, 0xF2, 0x50, 0xF1, 0xC0, 0x07, 0xD4, 0xFE, + 0x7E, 0x16, 0xE4, 0x0F, 0xF5, 0x13, 0xB9, 0x11, 0x05, 0x1C, 0xFF, 0x15, + 0xAE, 0x27, 0x5F, 0x1A, 0x39, 0x2A, 0x5C, 0x1C, 0x2D, 0x2A, 0x01, 0x24, + 0x23, 0x20, 0xCB, 0x1D, 0x23, 0x10, 0xEB, 0x08, 0x30, 0x0D, 0x1C, 0x02, + 0xC1, 0x0B, 0x6B, 0xFE, 0x4D, 0xF8, 0x5B, 0xEC, 0x82, 0xE8, 0xA4, 0xE2, + 0xF9, 0xF1, 0x46, 0xF1, 0x13, 0x06, 0x75, 0x04, 0xBB, 0x14, 0xA7, 0x0C, + 0x05, 0x15, 0x92, 0x0F, 0xA3, 0x0F, 0x51, 0x19, 0x56, 0x14, 0x44, 0x2A, + 0xE6, 0x22, 0xDB, 0x36, 0xE8, 0x2A, 0x0D, 0x3D, 0xC2, 0x2B, 0x74, 0x48, + 0x7B, 0x2A, 0xDA, 0x4B, 0x3A, 0x26, 0xB6, 0x3B, 0x89, 0x22, 0x68, 0x2A, + 0x2A, 0x1B, 0x45, 0x1E, 0x36, 0x12, 0x56, 0x15, 0xA5, 0x00, 0x8B, 0x05, + 0x9A, 0xF4, 0xD9, 0xF9, 0x41, 0xF7, 0x86, 0xFB, 0x27, 0x03, 0xD6, 0x09, + 0x26, 0x0E, 0x8B, 0x1D, 0xFA, 0x0F, 0x5E, 0x23, 0x79, 0x07, 0xAD, 0x11, + 0x39, 0x0A, 0x11, 0x08, 0xF2, 0x22, 0xC9, 0x1B, 0xC5, 0x2E, 0x6D, 0x2C, + 0x5C, 0x27, 0xC4, 0x29, 0x72, 0x2A, 0x62, 0x30, 0x5E, 0x33, 0xAC, 0x3D, + 0xEF, 0x28, 0x47, 0x35, 0xB2, 0x22, 0xE4, 0x32, 0xD1, 0x29, 0x67, 0x40, + 0xB2, 0x35, 0xD8, 0x4C, 0x47, 0x49, 0x6D, 0x53, 0xA1, 0x4A, 0x4E, 0x46, + 0x34, 0x2F, 0xA7, 0x23, 0x1F, 0x1B, 0x20, 0x05, 0x40, 0x19, 0xF3, 0xF6, + 0x45, 0x0E, 0x08, 0xEA, 0xCB, 0x00, 0xFC, 0xE7, 0x07, 0x00, 0x3F, 0xF5, + 0xDB, 0xFB, 0x45, 0xF6, 0x43, 0xF4, 0xC0, 0xEB, 0x14, 0xF3, 0x98, 0xE7, + 0xBF, 0xF2, 0xBD, 0xEB, 0x0E, 0x01, 0xDF, 0x00, 0x77, 0x18, 0x87, 0x1A, + 0xCF, 0x1E, 0xF3, 0x21, 0x33, 0x15, 0x31, 0x1C, 0x7E, 0x0A, 0x95, 0x17, + 0xD8, 0xFB, 0x87, 0x09, 0x8E, 0xF3, 0xD0, 0xF4, 0x08, 0x01, 0x9E, 0xEB, + 0x8C, 0x0D, 0xA6, 0xE5, 0x22, 0xFD, 0x2E, 0xD5, 0x7D, 0xD2, 0xCE, 0xBB, + 0x06, 0xB3, 0x44, 0xAC, 0x68, 0xB5, 0xF1, 0xAE, 0x24, 0xCB, 0x69, 0xC0, + 0x50, 0xD7, 0xA8, 0xD5, 0x1E, 0xCF, 0x77, 0xDB, 0x72, 0xC0, 0x84, 0xCC, + 0x99, 0xC5, 0xD9, 0xCB, 0x6F, 0xD5, 0xA1, 0xDE, 0xB8, 0xDA, 0xBB, 0xE5, + 0x1A, 0xE8, 0x35, 0xE6, 0x6F, 0x05, 0x13, 0xF6, 0x6A, 0x07, 0x4C, 0xFF, + 0x0E, 0xEE, 0x77, 0xF9, 0xC9, 0xE4, 0x1F, 0xFB, 0xB2, 0xE8, 0x86, 0xFA, + 0x32, 0xF4, 0x65, 0xFB, 0xBC, 0x03, 0x66, 0x03, 0x03, 0xFD, 0xDD, 0xFB, + 0xF2, 0xE4, 0xD4, 0xE8, 0x90, 0xD2, 0xB1, 0xD9, 0xA0, 0xC5, 0x45, 0xCB, + 0xAB, 0xB9, 0xBC, 0xBD, 0xC3, 0xBE, 0x33, 0xC6, 0x7C, 0xCD, 0xEC, 0xDD, + 0xCF, 0xD0, 0x9A, 0xE8, 0xBB, 0xD8, 0x35, 0xEC, 0x89, 0xE2, 0xA9, 0xE9, + 0xAA, 0xE7, 0x40, 0xED, 0x17, 0xEE, 0x59, 0x01, 0x12, 0xF5, 0xB2, 0x12, + 0x5A, 0xFD, 0xA9, 0x19, 0x81, 0x06, 0x38, 0x1F, 0xF0, 0x09, 0x92, 0x1F, + 0xAF, 0xFB, 0x79, 0x09, 0x11, 0xEC, 0x74, 0xF0, 0xF3, 0xE7, 0xA3, 0xE7, + 0x4C, 0xEB, 0x28, 0xE8, 0x0A, 0xE3, 0x93, 0xDB, 0xBF, 0xD5, 0xCC, 0xC9, + 0x9D, 0xD2, 0x9D, 0xC1, 0xF0, 0xD9, 0x6C, 0xC3, 0x3D, 0xE6, 0x37, 0xCF, + 0xDD, 0xEE, 0x22, 0xDE, 0x1A, 0xEB, 0x3C, 0xE0, 0x37, 0xEC, 0xC7, 0xE2, + 0x5D, 0x0A, 0x6C, 0x01, 0xB0, 0x20, 0xD4, 0x18, 0xBB, 0x1F, 0x55, 0x1A, + 0x06, 0x24, 0x87, 0x26, 0xFE, 0x2A, 0xEF, 0x35, 0x08, 0x24, 0x06, 0x29, + 0xDF, 0x2B, 0x84, 0x1D, 0x9A, 0x3C, 0xDC, 0x23, 0x69, 0x40, 0x3C, 0x30, + 0xC1, 0x48, 0x59, 0x44, 0xBE, 0x42, 0x04, 0x42, 0xB3, 0x20, 0xA9, 0x22, + 0xAC, 0x0A, 0x0F, 0x12, 0x55, 0x08, 0xBD, 0x11, 0x95, 0xF9, 0x1C, 0x02, + 0x9E, 0xF1, 0x93, 0xFC, 0xDE, 0x05, 0xF7, 0x13, 0x3A, 0x1A, 0x8F, 0x24, + 0xBF, 0x24, 0x69, 0x26, 0x9E, 0x2B, 0x00, 0x2B, 0xA8, 0x25, 0xD5, 0x2E, + 0x71, 0x29, 0x4A, 0x40, 0x44, 0x39, 0xE6, 0x55, 0x70, 0x39, 0x77, 0x51, + 0x5B, 0x30, 0xAE, 0x3D, 0x69, 0x35, 0xFF, 0x34, 0x98, 0x3B, 0xA0, 0x2E, + 0x97, 0x2D, 0x3A, 0x1E, 0x01, 0x1F, 0xD4, 0x19, 0x08, 0x17, 0xE5, 0x18, + 0xB9, 0x10, 0x42, 0x07, 0x0E, 0x04, 0x88, 0xE8, 0x0F, 0xFB, 0x39, 0xDA, + 0x5D, 0x00, 0x80, 0xE1, 0x0E, 0x11, 0xEA, 0xEF, 0x6A, 0x1E, 0x25, 0xFF, + 0x69, 0x16, 0xE0, 0x03, 0xD2, 0xFF, 0x46, 0xFC, 0xC2, 0xFB, 0x89, 0x05, + 0x66, 0x0F, 0xFD, 0x24, 0x0B, 0x19, 0x8C, 0x31, 0x6F, 0x1C, 0xED, 0x2D, + 0x0F, 0x2C, 0x7A, 0x38, 0xA7, 0x2D, 0xC1, 0x3E, 0xA0, 0x14, 0x92, 0x2E, + 0xB3, 0x08, 0xB3, 0x23, 0x43, 0x17, 0x3B, 0x27, 0x5D, 0x2A, 0x1E, 0x2C, + 0x15, 0x2E, 0x53, 0x27, 0x98, 0x18, 0x12, 0x0E, 0xEB, 0xF8, 0x3C, 0xEA, + 0x1A, 0xEF, 0x0F, 0xD9, 0x6C, 0xED, 0xA8, 0xD0, 0x9D, 0xDD, 0x97, 0xC1, + 0x68, 0xDD, 0x63, 0xC7, 0xEA, 0xF4, 0x9D, 0xE4, 0xD9, 0x02, 0xB0, 0xFA, + 0x9D, 0x04, 0x05, 0x06, 0x6C, 0x09, 0xA2, 0x09, 0x1A, 0x12, 0x4B, 0x03, + 0x33, 0x23, 0x8D, 0x09, 0xB5, 0x2F, 0x83, 0x20, 0xFE, 0x27, 0xB5, 0x2E, + 0x09, 0x1A, 0x7A, 0x2A, 0xA4, 0x1A, 0x4F, 0x23, 0x31, 0x12, 0x77, 0x0D, + 0xD2, 0x03, 0x53, 0xF8, 0xF0, 0xFB, 0x58, 0xFA, 0xE0, 0xEC, 0x3C, 0x04, + 0x26, 0xCC, 0x59, 0xFB, 0x69, 0xAD, 0xA9, 0xE6, 0x28, 0xB2, 0xF5, 0xE3, + 0x76, 0xCC, 0x93, 0xEC, 0x9E, 0xE2, 0xDF, 0xFC, 0x75, 0xE8, 0xDA, 0x0D, + 0x07, 0xE1, 0xB7, 0x07, 0xE4, 0xDC, 0xEC, 0xEE, 0x79, 0xF5, 0x84, 0xF2, + 0xB6, 0x0D, 0xDF, 0x03, 0x09, 0x0B, 0x47, 0xFD, 0x5F, 0x12, 0x6F, 0xFA, + 0xC3, 0x22, 0x27, 0x06, 0xBF, 0x10, 0xED, 0xFC, 0x00, 0xFA, 0x8B, 0xE8, + 0xB9, 0x06, 0x74, 0xE3, 0xA5, 0x1B, 0x9D, 0xE5, 0x82, 0x2A, 0xCD, 0xF1, + 0xEE, 0x29, 0x7B, 0xFB, 0x71, 0x05, 0x26, 0xE8, 0x75, 0xDA, 0xA5, 0xCB, + 0x28, 0xC8, 0x69, 0xBE, 0xDA, 0xB7, 0xC4, 0xB0, 0xB3, 0xAF, 0x91, 0xAD, + 0x1E, 0xBF, 0xA5, 0xC3, 0x42, 0xCD, 0xBE, 0xDB, 0x59, 0xD3, 0x53, 0xE9, + 0x54, 0xDB, 0x5D, 0xF2, 0x21, 0xDE, 0x5E, 0xF6, 0x2F, 0xE4, 0x5C, 0xFE, + 0xE6, 0xF9, 0xA5, 0x14, 0x40, 0x0C, 0xC0, 0x26, 0x20, 0x0B, 0x2B, 0x1D, + 0x66, 0x02, 0x48, 0x06, 0x87, 0xF3, 0x6D, 0xF2, 0xA8, 0xDA, 0x57, 0xD9, + 0x48, 0xCE, 0x4D, 0xC8, 0x26, 0xD2, 0x51, 0xCC, 0x80, 0xD4, 0xE0, 0xD5, + 0x88, 0xBF, 0x98, 0xC6, 0xB6, 0xA5, 0x48, 0xAE, 0xD3, 0xA8, 0xDC, 0xAA, + 0x5F, 0xC4, 0x31, 0xBB, 0xAF, 0xE4, 0x0F, 0xDA, 0x08, 0xF5, 0x4B, 0xF0, + 0x41, 0xEF, 0x1E, 0xE9, 0x29, 0xEE, 0xB9, 0xDF, 0x1D, 0x06, 0x3C, 0xF0, + 0x6B, 0x17, 0x69, 0xFE, 0x62, 0x10, 0x8C, 0xF8, 0xDA, 0x13, 0xA1, 0xFE, + 0x24, 0x20, 0x9A, 0x10, 0xB8, 0x13, 0xB9, 0x0F, 0x00, 0xFF, 0xDE, 0x06, + 0xD0, 0xFC, 0x15, 0x0B, 0xE1, 0x08, 0x78, 0x12, 0xEE, 0x1D, 0x8B, 0x14, + 0x12, 0x28, 0x90, 0x0F, 0xB4, 0x0E, 0x8D, 0x00, 0x32, 0xEC, 0x3A, 0xF8, + 0x08, 0xD9, 0xD5, 0xF7, 0x83, 0xCB, 0xA7, 0xEC, 0xB4, 0xC9, 0x2D, 0xE2, + 0x9B, 0xDC, 0x1C, 0xEE, 0x41, 0xEF, 0x45, 0xFE, 0x51, 0xF9, 0xFF, 0x01, + 0x92, 0x01, 0x5E, 0x05, 0x0F, 0xFE, 0x87, 0x07, 0x0E, 0xFE, 0x02, 0x0D, + 0xB5, 0x12, 0xEF, 0x19, 0xFD, 0x27, 0x34, 0x1B, 0x92, 0x31, 0xE1, 0x0F, + 0x5D, 0x35, 0x40, 0x10, 0x01, 0x23, 0x8B, 0x0F, 0x41, 0x00, 0xBF, 0xFD, + 0x9A, 0xEB, 0xB2, 0xEA, 0xC4, 0xEC, 0x2B, 0xE7, 0xAB, 0xED, 0x2B, 0xE8, + 0x93, 0xDB, 0x43, 0xD9, 0x6B, 0xCB, 0x1E, 0xC8, 0x9E, 0xD2, 0xBB, 0xCA, + 0x0C, 0xE7, 0x08, 0xDF, 0x38, 0xF6, 0x57, 0xF5, 0x99, 0xF5, 0x2E, 0xFF, + 0x93, 0xE3, 0xCA, 0xF3, 0x9D, 0xE5, 0xB8, 0xF3, 0x7B, 0x05, 0x0F, 0x10, + 0x5B, 0x15, 0x50, 0x22, 0x3A, 0x0C, 0x04, 0x1C, 0xAC, 0x0D, 0x4F, 0x1F, + 0xFE, 0x0D, 0x0E, 0x1E, 0x0F, 0x03, 0x2D, 0x02, 0x0C, 0x07, 0x07, 0xF1, + 0xB0, 0x13, 0x88, 0xFC, 0xC3, 0x20, 0x27, 0x12, 0xEC, 0x2C, 0x02, 0x1E, + 0xF3, 0x24, 0xBE, 0x13, 0x40, 0x0A, 0x6E, 0xF9, 0xD3, 0xF5, 0xB2, 0xE5, + 0xD9, 0xE9, 0xB0, 0xDD, 0x08, 0xDF, 0x91, 0xD5, 0x98, 0xE2, 0xB3, 0xD8, + 0xC1, 0xF5, 0x82, 0xF1, 0xBA, 0x00, 0xBC, 0x04, 0x80, 0x04, 0x5F, 0x08, + 0x73, 0x05, 0x4E, 0x02, 0xB7, 0x0C, 0x72, 0x04, 0x9C, 0x19, 0xDB, 0x1A, + 0x50, 0x1D, 0x46, 0x37, 0xD1, 0x19, 0xC5, 0x3E, 0x49, 0x1A, 0xCB, 0x2B, + 0x6E, 0x1F, 0x78, 0x1A, 0xE8, 0x11, 0x06, 0x0D, 0x85, 0xFC, 0x0E, 0x04, + 0xA8, 0xF5, 0x7F, 0x02, 0x0D, 0xFE, 0x9F, 0x04, 0xB2, 0xF7, 0xF1, 0xF4, + 0x52, 0xE1, 0xE5, 0xDA, 0xE7, 0xD9, 0x28, 0xD5, 0x30, 0xE7, 0x71, 0xE5, + 0xAE, 0xFA, 0x74, 0xFB, 0xFC, 0x0B, 0x0B, 0x0D, 0x8C, 0x0E, 0xFC, 0x0D, + 0xB2, 0x05, 0xA4, 0x02, 0xF6, 0x13, 0x5F, 0x0A, 0x3A, 0x34, 0x5C, 0x1F, + 0xE2, 0x42, 0xA0, 0x26, 0xEE, 0x47, 0x93, 0x31, 0x9B, 0x4A, 0x05, 0x48, + 0xBF, 0x31, 0x18, 0x47, 0xAB, 0x0F, 0x7A, 0x33, 0xD7, 0x0A, 0x30, 0x2E, + 0xD3, 0x20, 0xD0, 0x3B, 0x19, 0x35, 0x6A, 0x48, 0xDB, 0x3C, 0xC0, 0x4B, + 0xA6, 0x2C, 0xE3, 0x39, 0xD8, 0x0E, 0xD9, 0x1B, 0x0C, 0xFF, 0x83, 0x0C, + 0x5A, 0xF1, 0xA6, 0xFF, 0x03, 0xE5, 0x7B, 0xEF, 0x0D, 0xF4, 0x75, 0xF3, + 0x13, 0x14, 0x0A, 0x0C, 0x67, 0x1E, 0x91, 0x19, 0xA3, 0x10, 0x8A, 0x10, + 0xD3, 0x02, 0xBC, 0x01, 0x44, 0x09, 0xDA, 0xFE, 0x78, 0x24, 0x36, 0x06, + 0x90, 0x38, 0x62, 0x0C, 0x85, 0x2D, 0xB5, 0x0A, 0x48, 0x1D, 0xDA, 0x0A, + 0xA3, 0x0E, 0xA0, 0x01, 0xD2, 0xF9, 0xCF, 0xF0, 0x87, 0xEB, 0xF9, 0xE8, + 0xAD, 0xEB, 0x2B, 0xE9, 0x21, 0xF4, 0x95, 0xEC, 0x3A, 0xEA, 0x2A, 0xDD, + 0x13, 0xD4, 0x13, 0xC6, 0xDA, 0xC7, 0x1C, 0xC4, 0x92, 0xCD, 0xC2, 0xD4, + 0xE6, 0xDF, 0x28, 0xE7, 0xA6, 0xE9, 0x53, 0xF2, 0x84, 0xDD, 0xFF, 0xEF, + 0xE3, 0xD7, 0xE4, 0xEE, 0x86, 0xEB, 0xE5, 0xFC, 0xED, 0xF7, 0xA8, 0x00, + 0xBA, 0xF1, 0x3A, 0xF2, 0xDA, 0xFB, 0xB2, 0xF9, 0xBB, 0x07, 0x19, 0x0A, + 0x7F, 0xF2, 0x03, 0xF9, 0x3E, 0xDB, 0xB7, 0xE2, 0x34, 0xDD, 0xF3, 0xE3, + 0xF8, 0xF3, 0xA3, 0xF0, 0x0E, 0x0D, 0x40, 0xF8, 0x08, 0x0E, 0x11, 0xF6, + 0x2E, 0xEA, 0xB5, 0xE0, 0x57, 0xC8, 0x61, 0xC7, 0x5A, 0xBD, 0x1B, 0xB7, + 0x05, 0xB2, 0x52, 0xA8, 0xE5, 0xAC, 0x07, 0xA6, 0x19, 0xC4, 0x6C, 0xC2, + 0x68, 0xE1, 0x17, 0xE7, 0xBA, 0xE4, 0x76, 0xF2, 0x52, 0xD6, 0xBA, 0xEB, + 0xEB, 0xCE, 0x3A, 0xEA, 0x38, 0xDC, 0xA0, 0xF8, 0xD8, 0xF2, 0x7A, 0x11, + 0x51, 0x00, 0x0E, 0x24, 0x45, 0x04, 0x42, 0x21, 0xB5, 0xFF, 0xED, 0x10, + 0x32, 0xE9, 0xC4, 0xFB, 0xD7, 0xD7, 0x09, 0xEB, 0x1E, 0xD8, 0xBE, 0xDC, + 0x4E, 0xE5, 0x6C, 0xDD, 0x9A, 0xE6, 0x7A, 0xDD, 0xFB, 0xC9, 0x76, 0xC6, + 0x0C, 0xB1, 0xC0, 0xB8, 0xD0, 0xBD, 0x30, 0xC8, 0x8A, 0xE0, 0xE0, 0xDC, + 0xF9, 0x00, 0xFB, 0xEB, 0x6C, 0x0F, 0xAE, 0xED, 0xC7, 0x09, 0x9B, 0xE1, + 0x31, 0x0B, 0x2F, 0xE7, 0x25, 0x1C, 0x05, 0xFB, 0xA7, 0x20, 0x10, 0xFE, + 0x5D, 0x19, 0xC0, 0xFF, 0x7C, 0x27, 0x93, 0x17, 0x26, 0x2C, 0x97, 0x19, + 0x23, 0x1A, 0x87, 0x09, 0x3D, 0x13, 0x2C, 0x0D, 0x22, 0x20, 0x1C, 0x1A, + 0x0A, 0x37, 0x9D, 0x27, 0x0E, 0x48, 0xBA, 0x32, 0xA9, 0x3F, 0x17, 0x2F, + 0xFC, 0x19, 0xE5, 0x1F, 0x62, 0xF8, 0x8A, 0x1D, 0x0B, 0xE5, 0x8D, 0x19, + 0xD8, 0xDD, 0x1F, 0x09, 0x3C, 0xEF, 0x52, 0x0A, 0xC4, 0x11, 0x29, 0x26, + 0x09, 0x26, 0x89, 0x37, 0x2C, 0x2B, 0xF1, 0x33, 0x23, 0x28, 0x98, 0x2D, + 0xBC, 0x22, 0x7D, 0x32, 0x7B, 0x2B, 0xCF, 0x41, 0xD6, 0x3F, 0x95, 0x4F, + 0x95, 0x50, 0xEF, 0x55, 0x5C, 0x54, 0x28, 0x53, 0x14, 0x47, 0x3A, 0x45, + 0x7F, 0x2E, 0x66, 0x31, 0x00, 0x1B, 0x02, 0x1E, 0x99, 0x1C, 0x27, 0x16, + 0xEC, 0x26, 0x84, 0x1B, 0x26, 0x15, 0xCE, 0x13, 0xE9, 0xF6, 0x0D, 0xFF, + 0xAD, 0xF6, 0x61, 0xF4, 0xA4, 0x09, 0x0B, 0xFC, 0xBC, 0x15, 0x63, 0x0F, + 0xD8, 0x21, 0xEC, 0x21, 0x12, 0x24, 0x7C, 0x1D, 0x1A, 0x21, 0x80, 0x19, + 0xDC, 0x32, 0x15, 0x2C, 0xF7, 0x45, 0x25, 0x35, 0xFF, 0x3A, 0x72, 0x28, + 0x22, 0x2E, 0xEE, 0x2A, 0x10, 0x30, 0x66, 0x3D, 0xAF, 0x22, 0x9D, 0x3A, + 0x15, 0x11, 0x5D, 0x2E, 0xA3, 0x0F, 0xC8, 0x26, 0x00, 0x1C, 0x7E, 0x25, + 0x5A, 0x2C, 0x8D, 0x27, 0x67, 0x2E, 0x2F, 0x22, 0x56, 0x16, 0xF6, 0x10, + 0x17, 0xFB, 0x00, 0x01, 0x51, 0xEE, 0x48, 0xF2, 0xC1, 0xE1, 0xC5, 0xD7, + 0x4A, 0xDE, 0xD5, 0xCB, 0x98, 0xF0, 0xC3, 0xE1, 0xFB, 0x07, 0x46, 0xFE, + 0xBE, 0x15, 0x39, 0x07, 0xEB, 0x16, 0xB9, 0x05, 0x8A, 0x10, 0xBF, 0x07, + 0xDD, 0x17, 0x85, 0x12, 0x97, 0x2B, 0xEE, 0x20, 0xCA, 0x2C, 0x4C, 0x25, + 0xFD, 0x1D, 0xFA, 0x1E, 0xDA, 0x19, 0xC8, 0x17, 0x3C, 0x12, 0xA3, 0x06, + 0x54, 0x03, 0xDF, 0xF1, 0x68, 0xFA, 0x0D, 0xE7, 0x09, 0x03, 0xFF, 0xEF, + 0x4B, 0x03, 0x61, 0xF3, 0x14, 0xE5, 0x9C, 0xE0, 0x98, 0xC3, 0x2E, 0xD6, + 0x5E, 0xB9, 0x30, 0xE2, 0xE0, 0xCB, 0x8D, 0xFA, 0x28, 0xE4, 0x22, 0x0D, + 0xA9, 0xE6, 0x00, 0x0C, 0x1F, 0xD7, 0x4E, 0xFC, 0xE0, 0xE4, 0x44, 0x01, + 0x2C, 0x0A, 0x1A, 0x12, 0x23, 0x15, 0x14, 0x0F, 0x46, 0x0F, 0x19, 0x09, + 0x91, 0x19, 0xB2, 0x12, 0x9E, 0x17, 0xC6, 0x0B, 0xFD, 0xFE, 0x7C, 0xF6, + 0x0E, 0xF5, 0x7B, 0xF1, 0x68, 0x05, 0x09, 0xFA, 0xE3, 0x25, 0x22, 0x0A, + 0x07, 0x33, 0x2C, 0x0D, 0x38, 0x17, 0x2A, 0xF8, 0x5A, 0xEB, 0x88, 0xDE, + 0xFA, 0xCE, 0x6F, 0xCD, 0x1B, 0xC0, 0x77, 0xBA, 0xD2, 0xB8, 0x36, 0xAF, + 0x19, 0xC7, 0xB1, 0xC0, 0xB2, 0xE2, 0x83, 0xE1, 0xFB, 0xEF, 0x10, 0xF6, + 0x85, 0xE7, 0x6A, 0xFA, 0x22, 0xDA, 0x03, 0xF5, 0x8D, 0xE1, 0x68, 0xF5, + 0xBD, 0xFA, 0xEF, 0x00, 0x01, 0x0F, 0xE4, 0x0B, 0xC5, 0x0D, 0x35, 0x07, + 0xC2, 0x04, 0x0B, 0xFC, 0xAF, 0xF7, 0xD5, 0xEF, 0x14, 0xE1, 0x23, 0xDD, + 0xB6, 0xCF, 0x83, 0xD2, 0x1C, 0xCE, 0x98, 0xD5, 0xE0, 0xD5, 0xFF, 0xDC, + 0x98, 0xC7, 0x9E, 0xCC, 0xFF, 0xB2, 0xB9, 0xB7, 0x2A, 0xB1, 0x9B, 0xB7, + 0x2F, 0xBF, 0x28, 0xC9, 0x0E, 0xD2, 0xD2, 0xE0, 0x63, 0xE5, 0x32, 0xF4, + 0xEC, 0xE8, 0x85, 0xF5, 0x9D, 0xE9, 0x50, 0xF7, 0x55, 0xFB, 0x3B, 0x0D, + 0x5E, 0x02, 0x98, 0x10, 0xCE, 0xFD, 0x8F, 0xF7, 0x28, 0x0D, 0x09, 0xEF, + 0x9F, 0x1A, 0x80, 0xFB, 0x21, 0x0D, 0x0B, 0xFF, 0x0B, 0x07, 0x34, 0xFE, + 0x1A, 0x0D, 0x2A, 0x00, 0xFB, 0x13, 0xE9, 0x0B, 0xDF, 0x1F, 0xD0, 0x1C, + 0x07, 0x22, 0x55, 0x18, 0xFA, 0x0C, 0x30, 0xFE, 0xF4, 0xF5, 0x61, 0xEB, + 0xB7, 0xE0, 0x9C, 0xDB, 0x7C, 0xC9, 0x25, 0xC9, 0xE0, 0xC6, 0xB7, 0xCC, + 0xBB, 0xDB, 0x54, 0xE8, 0xAA, 0xF1, 0xF6, 0x03, 0x37, 0xFE, 0x24, 0x14, + 0x69, 0xFE, 0x83, 0x14, 0x2E, 0xF6, 0x18, 0x09, 0xF0, 0xF9, 0x4B, 0x08, + 0xBA, 0x0A, 0xDA, 0x15, 0xD1, 0x18, 0xB6, 0x22, 0x27, 0x1C, 0xB8, 0x1F, + 0x58, 0x17, 0x34, 0x0F, 0xA9, 0x06, 0x46, 0xF5, 0x00, 0xF6, 0x08, 0xE2, + 0x58, 0xEB, 0x23, 0xDA, 0xA9, 0xEC, 0x3C, 0xE1, 0x36, 0xEB, 0x1D, 0xDF, + 0x10, 0xE1, 0x63, 0xC9, 0x28, 0xDD, 0xAD, 0xC0, 0x1C, 0xE2, 0x46, 0xD0, + 0x99, 0xE9, 0x69, 0xE5, 0xFC, 0xF2, 0xDC, 0xF5, 0xEF, 0xF2, 0xA7, 0xFB, + 0x90, 0xEB, 0xF8, 0xF6, 0xFD, 0xF9, 0xB5, 0x00, 0xB9, 0x10, 0xD9, 0x0B, + 0x97, 0x10, 0xE0, 0xFF, 0x5B, 0x07, 0xEB, 0xF8, 0x74, 0x09, 0x5D, 0x0C, + 0x27, 0x05, 0xDA, 0x12, 0x8C, 0xFD, 0xBA, 0x00, 0xE7, 0xFD, 0xBB, 0xF3, + 0xDF, 0x02, 0x98, 0xF7, 0x25, 0x0E, 0x82, 0x08, 0x0B, 0x1A, 0x3F, 0x15, + 0x7C, 0x10, 0x4B, 0x0A, 0xDD, 0xF7, 0xA6, 0xF7, 0xBE, 0xE5, 0x23, 0xF3, + 0xB3, 0xD6, 0xB0, 0xED, 0xE8, 0xCF, 0x75, 0xE5, 0xC5, 0xDF, 0x08, 0xEE, + 0x2D, 0xFE, 0xBB, 0x00, 0xBF, 0x11, 0x1D, 0x09, 0x76, 0x10, 0x4B, 0x04, + 0x50, 0x0A, 0x96, 0xFF, 0x8C, 0x15, 0x51, 0x06, 0x36, 0x29, 0xFE, 0x10, + 0x30, 0x37, 0x1C, 0x1C, 0x12, 0x32, 0xCA, 0x21, 0x13, 0x1E, 0x2A, 0x21, + 0xBD, 0x06, 0xB1, 0x13, 0xFF, 0xF6, 0x75, 0x03, 0x92, 0xE9, 0x56, 0xFF, + 0x93, 0xE3, 0x40, 0x0A, 0x90, 0xEA, 0x16, 0x0E, 0x63, 0xE9, 0x39, 0xF9, + 0x83, 0xE2, 0x8B, 0xEC, 0xA8, 0xE2, 0x7D, 0xF6, 0x86, 0xEE, 0x2D, 0x06, + 0xA0, 0xFD, 0x8E, 0x0D, 0x69, 0x04, 0x64, 0x0C, 0xD1, 0xFF, 0xA9, 0x04, + 0xE9, 0x0B, 0x75, 0x0F, 0xE0, 0x27, 0xC0, 0x28, 0x18, 0x31, 0xDA, 0x2C, + 0xC4, 0x2B, 0x48, 0x1F, 0x5C, 0x33, 0x94, 0x1E, 0x98, 0x37, 0xAE, 0x24, + 0x0A, 0x2B, 0xB2, 0x20, 0x5B, 0x2A, 0xFB, 0x20, 0xBD, 0x37, 0x46, 0x27, + 0x93, 0x3F, 0x6D, 0x2E, 0x41, 0x3F, 0x57, 0x35, 0xFC, 0x2E, 0xE5, 0x2D, + 0x69, 0x12, 0xA5, 0x19, 0x7E, 0x05, 0x82, 0x11, 0xC6, 0xFE, 0xE5, 0x0E, + 0x38, 0xEB, 0x13, 0x03, 0xB7, 0xE6, 0x21, 0x04, 0xCB, 0xFF, 0xFE, 0x17, + 0x95, 0x14, 0x61, 0x26, 0x00, 0x19, 0xD0, 0x26, 0xC0, 0x1A, 0x20, 0x1F, + 0x0A, 0x26, 0x2D, 0x1C, 0xC4, 0x31, 0x36, 0x21, 0x2B, 0x34, 0x26, 0x29, + 0xCB, 0x29, 0xD3, 0x28, 0x7A, 0x1B, 0x43, 0x1F, 0x2D, 0x0F, 0x82, 0x0D, + 0x35, 0xFF, 0x0D, 0xF5, 0xFB, 0xF6, 0xFE, 0xE4, 0x4F, 0xF5, 0x60, 0xDD, + 0xF0, 0xF4, 0xA3, 0xDB, 0x1F, 0xE5, 0xF7, 0xCF, 0xD3, 0xD4, 0x50, 0xC1, + 0x71, 0xDA, 0x31, 0xC5, 0xE0, 0xE9, 0x83, 0xD7, 0x98, 0xF2, 0x52, 0xE9, + 0x68, 0xF5, 0xF9, 0xF3, 0x1F, 0xEE, 0x8F, 0xEA, 0x88, 0xEC, 0xB8, 0xE0, + 0x1B, 0x00, 0xBE, 0xF1, 0x76, 0x09, 0xB0, 0x00, 0xDE, 0x00, 0xD8, 0xFB, + 0x95, 0x02, 0x7D, 0x00, 0xB3, 0x02, 0x5A, 0x07, 0x40, 0xED, 0x17, 0xF5, + 0xF2, 0xDD, 0xF3, 0xE2, 0xD3, 0xE0, 0xF8, 0xE5, 0x15, 0xEC, 0xC9, 0xF2, + 0xEE, 0xFA, 0x54, 0xFC, 0x81, 0xFD, 0xD0, 0xF7, 0x3B, 0xE8, 0xD9, 0xE0, + 0x4C, 0xD1, 0x43, 0xCC, 0xE1, 0xC1, 0xB4, 0xC3, 0xB5, 0xAF, 0x53, 0xBD, + 0x43, 0xAA, 0x88, 0xC2, 0x6C, 0xC1, 0x2A, 0xDB, 0xAB, 0xDC, 0x1C, 0xED, + 0xCC, 0xE6, 0xA5, 0xE8, 0x46, 0xE2, 0x79, 0xDA, 0xC8, 0xDC, 0xC1, 0xD6, + 0x33, 0xE4, 0x64, 0xE8, 0xAF, 0xF4, 0xDA, 0x01, 0x02, 0xFD, 0xB1, 0x06, + 0xE5, 0xF8, 0x3A, 0xF6, 0x96, 0xF6, 0x1C, 0xED, 0x36, 0xE9, 0x16, 0xE6, + 0xDB, 0xDA, 0xE5, 0xE4, 0x0A, 0xD6, 0x7E, 0xEE, 0x02, 0xD8, 0xCF, 0xF8, + 0xEE, 0xCF, 0x4F, 0xEF, 0xA3, 0xB8, 0x00, 0xD6, 0xCD, 0xA9, 0x2D, 0xCA, + 0x01, 0xB2, 0x2E, 0xD1, 0xF7, 0xCB, 0xB0, 0xE0, 0x64, 0xE8, 0xCE, 0xF4, + 0xD5, 0xF0, 0x3C, 0xFA, 0xA6, 0xE8, 0x34, 0xEE, 0xA5, 0xF5, 0x72, 0xF0, + 0x55, 0x0F, 0x8A, 0xFA, 0x30, 0x16, 0x5A, 0xF2, 0xEC, 0x17, 0xCB, 0xEB, + 0x5B, 0x25, 0xF2, 0xF7, 0xEB, 0x22, 0xC3, 0xF8, 0x95, 0x11, 0xDB, 0xED, + 0xEC, 0x11, 0xB0, 0xF2, 0xAE, 0x23, 0x76, 0x03, 0x72, 0x37, 0xC6, 0x11, + 0x80, 0x40, 0xEA, 0x18, 0x98, 0x2F, 0xFD, 0x10, 0x28, 0x0D, 0x9D, 0x02, + 0x48, 0xF5, 0x41, 0xFB, 0xE2, 0xE8, 0x38, 0xF1, 0x81, 0xE7, 0x28, 0xEB, + 0xDB, 0xF8, 0x26, 0xFF, 0xC3, 0x10, 0x75, 0x24, 0x6B, 0x1B, 0xA8, 0x3D, + 0xF4, 0x16, 0xC2, 0x3D, 0xCC, 0x10, 0xC1, 0x31, 0xCB, 0x19, 0xFB, 0x32, + 0x2E, 0x2E, 0x5A, 0x3F, 0x78, 0x3D, 0x5E, 0x46, 0x0E, 0x38, 0x78, 0x3F, + 0xA8, 0x29, 0x47, 0x39, 0xF3, 0x17, 0x7A, 0x2F, 0xE9, 0x08, 0x52, 0x21, + 0xD6, 0x06, 0xE5, 0x19, 0x0D, 0x0D, 0xD1, 0x15, 0x9F, 0x17, 0x10, 0x14, + 0xF2, 0x11, 0x9E, 0x06, 0x4F, 0x05, 0x9C, 0xF7, 0x4B, 0x05, 0x9D, 0xF7, + 0xC4, 0x0F, 0xAA, 0x03, 0x66, 0x1D, 0x79, 0x15, 0xEA, 0x25, 0x9B, 0x21, + 0xD0, 0x1D, 0x79, 0x17, 0x62, 0x21, 0xAE, 0x13, 0xD4, 0x39, 0x20, 0x26, + 0xAE, 0x3D, 0x54, 0x29, 0xB8, 0x2E, 0x55, 0x1B, 0x2C, 0x34, 0xBF, 0x22, + 0x5C, 0x43, 0x41, 0x36, 0xA4, 0x3D, 0xB0, 0x35, 0xC1, 0x33, 0x74, 0x2D, + 0x31, 0x33, 0xAB, 0x2D, 0x61, 0x33, 0x83, 0x32, 0xC6, 0x31, 0x70, 0x3B, + 0x69, 0x2B, 0xDE, 0x3D, 0x9A, 0x18, 0x84, 0x29, 0xAE, 0x03, 0xAE, 0x0F, + 0x88, 0xED, 0xB6, 0x00, 0x43, 0xD1, 0x8E, 0xF4, 0xA0, 0xC6, 0x65, 0xED, + 0x18, 0xE1, 0xF2, 0xF9, 0xC2, 0x08, 0x49, 0x11, 0xC4, 0x17, 0xA3, 0x17, + 0xA7, 0x11, 0x40, 0x09, 0xC5, 0x12, 0xD0, 0xFF, 0x9A, 0x1D, 0x9B, 0x05, + 0x38, 0x26, 0x68, 0x11, 0xB8, 0x2E, 0xAD, 0x18, 0x64, 0x36, 0xCE, 0x15, + 0xBF, 0x31, 0x30, 0x0D, 0x4E, 0x16, 0x76, 0xFF, 0x68, 0xFE, 0x0D, 0xF9, + 0x07, 0xF5, 0x9A, 0xF3, 0x55, 0xF7, 0x68, 0xF2, 0x00, 0xF6, 0x12, 0xF3, + 0xD3, 0xE7, 0x8A, 0xEA, 0x3F, 0xE2, 0xCA, 0xE5, 0xBE, 0xEB, 0x2C, 0xF3, + 0x9E, 0xF3, 0x3D, 0x0B, 0x8C, 0xF3, 0x6A, 0x1B, 0xE6, 0xF0, 0x96, 0x13, + 0x4D, 0xF8, 0x71, 0x07, 0x7B, 0x12, 0xC7, 0x1C, 0x06, 0x18, 0xA0, 0x34, + 0xD4, 0xFD, 0xAB, 0x2B, 0x70, 0xF6, 0x0B, 0x1F, 0x5E, 0x0B, 0x50, 0x1E, + 0xBA, 0x0F, 0x0B, 0x0D, 0x81, 0x09, 0x1B, 0xF9, 0x2E, 0x11, 0x81, 0xFB, + 0x39, 0x1B, 0x46, 0x09, 0x38, 0x20, 0xCD, 0x14, 0x1F, 0x1D, 0xAE, 0x11, + 0x30, 0x0C, 0xD4, 0xF7, 0xF0, 0xF5, 0x93, 0xD8, 0x7B, 0xE9, 0x3A, 0xCA, + 0x29, 0xDF, 0xD4, 0xC6, 0x83, 0xD0, 0x5C, 0xC6, 0x73, 0xC9, 0x07, 0xD0, + 0xBC, 0xD8, 0xDE, 0xE6, 0xDC, 0xEC, 0xB2, 0xF0, 0xA8, 0xF3, 0xCF, 0xE5, + 0x11, 0xF8, 0x04, 0xE9, 0x42, 0xFD, 0xEA, 0x03, 0x76, 0xFB, 0x55, 0x15, + 0x8B, 0xFF, 0x49, 0x17, 0xBE, 0x06, 0xFE, 0x10, 0xE4, 0xFE, 0x5B, 0x04, + 0x28, 0xEB, 0x4C, 0xF2, 0x50, 0xDF, 0xA1, 0xE2, 0xE6, 0xD9, 0x9F, 0xD6, + 0x24, 0xD2, 0x74, 0xD0, 0x8B, 0xCC, 0xFB, 0xD3, 0x46, 0xBD, 0x1B, 0xC8, + 0x48, 0xB4, 0x93, 0xB6, 0x89, 0xC0, 0xE4, 0xB8, 0xF3, 0xD3, 0xCA, 0xCC, + 0xB7, 0xE1, 0x0B, 0xDF, 0x14, 0xE4, 0xDA, 0xDE, 0xC5, 0xDA, 0x0D, 0xCD, + 0xAC, 0xE6, 0xCA, 0xD3, 0x6B, 0x06, 0x57, 0xF1, 0x21, 0x09, 0x32, 0xF4, + 0x38, 0xF8, 0x63, 0xE7, 0x3D, 0xFC, 0xD0, 0xF3, 0x19, 0x05, 0x28, 0x04, + 0xE8, 0xFF, 0x17, 0xFE, 0xC9, 0x03, 0x2A, 0xFA, 0x23, 0x0E, 0xC3, 0xFD, + 0xC4, 0x11, 0x0E, 0x05, 0xB3, 0x0C, 0x5A, 0x0D, 0xEE, 0xF9, 0xFC, 0x09, + 0x8C, 0xDF, 0xEB, 0xFB, 0xA8, 0xD6, 0xF3, 0xF4, 0x2E, 0xDE, 0x5D, 0xF1, + 0xC6, 0xE0, 0x18, 0xE7, 0x09, 0xDE, 0xB1, 0xE4, 0xA2, 0xE5, 0x61, 0xFD, + 0x64, 0xF6, 0x5A, 0x19, 0xA7, 0xFC, 0x27, 0x14, 0xF9, 0xFE, 0x64, 0x03, + 0x11, 0x0B, 0xAE, 0x09, 0x7F, 0x14, 0xD2, 0x16, 0x54, 0x17, 0xC8, 0x1A, + 0x4F, 0x19, 0xE6, 0x17, 0xEB, 0x16, 0x87, 0x0C, 0x75, 0x0D, 0xD9, 0x00, + 0xA5, 0xFE, 0x06, 0xFA, 0x2E, 0xF2, 0xB8, 0xF6, 0x37, 0xE8, 0x16, 0xF4, + 0x5A, 0xE9, 0x0D, 0xFA, 0xF3, 0xE2, 0xA3, 0xF0, 0x4A, 0xD2, 0x0B, 0xDA, + 0x5D, 0xD3, 0x70, 0xD6, 0x40, 0xE4, 0x8A, 0xE7, 0x9E, 0xF8, 0x6A, 0xF8, + 0x35, 0x09, 0x2D, 0xFE, 0x83, 0x00, 0x9D, 0xF0, 0xE4, 0xF3, 0xD7, 0xE8, + 0x1C, 0x06, 0xB1, 0xFF, 0xF0, 0x14, 0x2F, 0x10, 0x45, 0x07, 0x9D, 0x0B, + 0x86, 0x06, 0xFE, 0x10, 0xE5, 0x1B, 0x88, 0x1C, 0xB3, 0x1D, 0x78, 0x0B, + 0xE9, 0x15, 0x25, 0xF8, 0x92, 0x18, 0x34, 0xFD, 0x43, 0x1E, 0x2D, 0x0B, + 0x4F, 0x24, 0x23, 0x14, 0xA6, 0x1E, 0x3D, 0x0C, 0xA2, 0x03, 0xC5, 0xED, + 0x76, 0xE6, 0xED, 0xD2, 0x86, 0xD4, 0x70, 0xCD, 0x06, 0xC2, 0x26, 0xCF, + 0xF7, 0xB7, 0x74, 0xD8, 0xFD, 0xD2, 0x55, 0xF6, 0x4B, 0x00, 0x47, 0x19, + 0x4A, 0x14, 0x3B, 0x24, 0x53, 0x0E, 0x61, 0x1A, 0x82, 0x14, 0x71, 0x17, + 0xC8, 0x28, 0x50, 0x1E, 0x42, 0x2D, 0x58, 0x23, 0x5A, 0x26, 0x9B, 0x21, + 0xDA, 0x20, 0xD3, 0x15, 0xE4, 0x16, 0xA8, 0x0A, 0xFB, 0xFC, 0x50, 0xFF, + 0x88, 0xE2, 0xF5, 0xF5, 0xF8, 0xD5, 0x56, 0xEE, 0xDE, 0xE0, 0x05, 0xF2, + 0x91, 0xEC, 0xFD, 0xEF, 0x1C, 0xE0, 0x7D, 0xDF, 0x6F, 0xD6, 0x8C, 0xDC, + 0x5E, 0xE8, 0x0F, 0xEE, 0xD8, 0x00, 0x53, 0x00, 0xFE, 0x0E, 0x9A, 0x06, + 0x5D, 0x0D, 0x1B, 0xFD, 0x84, 0x04, 0xE3, 0xF2, 0xA1, 0x0F, 0xDA, 0x04, + 0x06, 0x15, 0x5A, 0x19, 0x3E, 0x01, 0x3B, 0x11, 0xB1, 0x03, 0x2C, 0x0A, + 0xB3, 0x25, 0x78, 0x1F, 0xDA, 0x2A, 0x00, 0x24, 0x4D, 0x1D, 0xC6, 0x14, + 0xF5, 0x27, 0x27, 0x16, 0x96, 0x37, 0x58, 0x21, 0xE4, 0x41, 0x13, 0x2B, + 0x3F, 0x48, 0x19, 0x2C, 0x2E, 0x3B, 0x06, 0x1F, 0x5B, 0x22, 0x0E, 0x0C, + 0xB2, 0x0E, 0xA7, 0x06, 0x55, 0xF5, 0xB3, 0x05, 0xE5, 0xD8, 0xE9, 0x03, + 0xA7, 0xD5, 0xB0, 0x15, 0xC4, 0xF1, 0x2C, 0x3B, 0xCA, 0x08, 0x2F, 0x52, + 0xB8, 0x0F, 0x8B, 0x4A, 0x3F, 0x1A, 0x33, 0x37, 0x66, 0x2F, 0x50, 0x2E, + 0x08, 0x42, 0x6E, 0x2C, 0xCF, 0x4C, 0xAB, 0x2C, 0x8B, 0x4C, 0xC9, 0x28, + 0xC3, 0x40, 0x68, 0x20, 0x04, 0x2A, 0xD9, 0x13, 0x9B, 0x10, 0x44, 0x04, + 0x51, 0xFB, 0x33, 0xF8, 0x35, 0xEF, 0xE8, 0xF3, 0xA7, 0xED, 0xCC, 0xF2, + 0xD0, 0xE4, 0x8F, 0xE5, 0x46, 0xE4, 0xAD, 0xD8, 0x1E, 0xF7, 0x08, 0xDF, + 0x49, 0x09, 0xB9, 0xF4, 0xF3, 0x0C, 0xC3, 0x07, 0x0F, 0x0D, 0x00, 0x07, + 0x95, 0x0A, 0x25, 0xEF, 0x22, 0x15, 0x41, 0xF0, 0xBA, 0x29, 0x06, 0x0D, + 0x15, 0x1F, 0x54, 0x0E, 0xB6, 0xFF, 0x6D, 0xF4, 0x84, 0xFA, 0x3E, 0xF6, + 0x2B, 0xFE, 0xF2, 0x05, 0x62, 0xF7, 0x9B, 0xFD, 0x8A, 0x00, 0xF4, 0xFD, + 0xBA, 0x10, 0x11, 0x0B, 0xF4, 0x1A, 0x0D, 0x12, 0x7C, 0x1B, 0xFC, 0x13, + 0x3D, 0x06, 0xBB, 0x04, 0x84, 0xE3, 0x71, 0xDF, 0xCD, 0xCE, 0xF8, 0xC4, + 0x8B, 0xC4, 0x0C, 0xBD, 0xE9, 0xB7, 0x71, 0xB3, 0xAF, 0xB0, 0x50, 0xB1, + 0xC1, 0xB6, 0x73, 0xCA, 0x59, 0xC7, 0xA2, 0xEA, 0x94, 0xD5, 0x6E, 0xF1, + 0xC0, 0xDA, 0x9A, 0xE5, 0x7E, 0xE4, 0x79, 0xE6, 0xAC, 0xF0, 0x1E, 0xF5, + 0xEB, 0xF7, 0xD5, 0xF7, 0x73, 0xFA, 0x2B, 0xEF, 0x29, 0xF4, 0x0B, 0xE8, + 0xFA, 0xE9, 0xC3, 0xE4, 0xD8, 0xD9, 0x45, 0xDC, 0xB8, 0xD2, 0x84, 0xD2, + 0xDB, 0xCF, 0x5D, 0xC8, 0xCB, 0xCF, 0x8A, 0xC6, 0x29, 0xC7, 0x97, 0xC7, + 0x5B, 0xAC, 0x25, 0xC0, 0x8D, 0xA1, 0x09, 0xC4, 0xCA, 0xB6, 0xE0, 0xE0, + 0xB0, 0xD3, 0x1B, 0xFB, 0xAE, 0xEB, 0x99, 0x00, 0x66, 0xF1, 0x55, 0xED, + 0xF3, 0xEA, 0xC3, 0xD8, 0xC0, 0xFB, 0xB8, 0xE7, 0x69, 0x08, 0x4A, 0xFC, + 0xCF, 0xF1, 0x0A, 0xF5, 0x03, 0xE4, 0xD8, 0xEE, 0x24, 0xFA, 0x8B, 0xF5, + 0x08, 0x02, 0xFA, 0xE8, 0x67, 0xF5, 0xFC, 0xD2, 0x70, 0xF6, 0x94, 0xD9, + 0x34, 0x02, 0xD5, 0xF4, 0xB4, 0x13, 0x7A, 0x09, 0x8B, 0x25, 0x36, 0x0C, + 0x17, 0x26, 0x49, 0xF7, 0x06, 0x14, 0xFC, 0xE0, 0x29, 0x02, 0xCE, 0xDB, + 0x7D, 0xF4, 0xBD, 0xDA, 0x21, 0xE7, 0x5D, 0xE1, 0xDA, 0xEC, 0x86, 0xFE, + 0x16, 0x04, 0x87, 0x1F, 0x84, 0x10, 0x21, 0x28, 0xED, 0x09, 0xEF, 0x1E, + 0x05, 0x04, 0x32, 0x1A, 0xF9, 0x15, 0x33, 0x28, 0x98, 0x28, 0x10, 0x39, + 0x2B, 0x2E, 0x04, 0x43, 0x7B, 0x2D, 0x48, 0x43, 0x05, 0x31, 0xC5, 0x3A, + 0x10, 0x2F, 0xDB, 0x2D, 0xFF, 0x1B, 0x43, 0x20, 0xDA, 0x09, 0x17, 0x16, + 0xD6, 0x06, 0x16, 0x15, 0xD7, 0x06, 0x68, 0x19, 0xD1, 0xFA, 0xD1, 0x10, + 0x13, 0xE6, 0xAA, 0x03, 0xCC, 0xE0, 0x3B, 0x07, 0x24, 0xFE, 0x8D, 0x21, + 0x17, 0x1C, 0x38, 0x33, 0xD4, 0x23, 0x0B, 0x2A, 0x6A, 0x1A, 0x0F, 0x16, + 0x52, 0x1F, 0x35, 0x16, 0x0E, 0x32, 0x79, 0x28, 0x1E, 0x29, 0xA5, 0x1D, + 0x41, 0x14, 0x74, 0xFF, 0x6D, 0x1E, 0xBD, 0x04, 0xFA, 0x25, 0x76, 0x12, + 0x3D, 0x12, 0x4E, 0x04, 0xEE, 0x11, 0x4A, 0xFA, 0x00, 0x28, 0x29, 0x09, + 0xBA, 0x33, 0x88, 0x1C, 0xE7, 0x33, 0xA7, 0x25, 0x2F, 0x2E, 0xF4, 0x23, + 0x99, 0x1D, 0xAA, 0x12, 0xD2, 0x0D, 0x01, 0x06, 0xC3, 0xFB, 0xB7, 0x02, + 0x50, 0xE5, 0x9A, 0xF8, 0x9C, 0xDD, 0xB6, 0xF7, 0xDD, 0xF1, 0xDA, 0x13, + 0xFC, 0x0A, 0xEB, 0x30, 0xA8, 0x11, 0x99, 0x2D, 0x18, 0x14, 0x9B, 0x18, + 0x0A, 0x1D, 0x26, 0x14, 0xD7, 0x21, 0xCD, 0x1E, 0xCB, 0x20, 0x7E, 0x24, + 0x6E, 0x20, 0x9D, 0x22, 0x3D, 0x1A, 0x8E, 0x15, 0x4B, 0x14, 0xB4, 0x07, + 0xA0, 0x12, 0xB1, 0xF7, 0xEF, 0x10, 0x3C, 0xF0, 0xE1, 0x08, 0x07, 0xF4, + 0xB7, 0x01, 0x18, 0xFA, 0x7F, 0xF6, 0x78, 0xEF, 0x94, 0xEA, 0x76, 0xDC, + 0xBE, 0xE9, 0x29, 0xDE, 0x4D, 0xF9, 0xBF, 0xF2, 0xF2, 0x0B, 0x39, 0x04, + 0x6C, 0x1E, 0x12, 0x0B, 0xE7, 0x26, 0x8E, 0x00, 0xF0, 0x1A, 0x5D, 0xF3, + 0x2D, 0x1F, 0xCE, 0x0E, 0xC3, 0x1E, 0x27, 0x26, 0xEA, 0x03, 0x5A, 0x15, + 0x3A, 0x02, 0x7F, 0x12, 0x4C, 0x12, 0x2E, 0x25, 0x8F, 0x02, 0x1C, 0x1D, + 0x4E, 0xF2, 0xD7, 0x07, 0xEC, 0xF9, 0x40, 0x08, 0xE2, 0x07, 0x60, 0x1E, + 0x42, 0x0E, 0x0F, 0x32, 0x40, 0x0F, 0x11, 0x2F, 0x25, 0x04, 0xDE, 0x14, + 0xF0, 0xF7, 0x87, 0xFD, 0xFE, 0xF8, 0x5D, 0x00, 0x65, 0xE8, 0x75, 0xFB, + 0x0F, 0xDA, 0xC0, 0xEC, 0xE2, 0xE7, 0x80, 0xF3, 0x71, 0x00, 0x38, 0x08, + 0x02, 0x0F, 0x45, 0x14, 0x39, 0x06, 0x4C, 0x0B, 0x0B, 0xFC, 0x63, 0xFD, + 0xFB, 0x0B, 0x2E, 0x01, 0xDB, 0x24, 0x53, 0x07, 0x25, 0x2B, 0x51, 0x01, + 0x33, 0x1B, 0xD7, 0xFA, 0x18, 0x0E, 0x1E, 0x03, 0xC0, 0x03, 0x7D, 0x06, + 0x87, 0xF9, 0x91, 0xFF, 0xED, 0xF0, 0x12, 0xFA, 0x74, 0xE4, 0xFD, 0xF5, + 0xFB, 0xD7, 0x67, 0xF0, 0xFB, 0xC6, 0x65, 0xDC, 0x4C, 0xC2, 0x97, 0xCC, + 0x97, 0xCB, 0x1A, 0xD4, 0x82, 0xDA, 0x3D, 0xEB, 0x82, 0xE7, 0xCC, 0xF2, + 0x21, 0xF2, 0x67, 0xEB, 0x74, 0xEF, 0x6C, 0xDD, 0x8B, 0xED, 0x3F, 0xE1, + 0x71, 0xF5, 0xBC, 0xF5, 0xA3, 0xE7, 0x4F, 0xEE, 0x8B, 0xD8, 0xA5, 0xD7, + 0x11, 0xF1, 0x3C, 0xDA, 0xB0, 0x01, 0xB5, 0xDF, 0x50, 0xEE, 0x8C, 0xD5, + 0x8F, 0xE3, 0x0F, 0xD8, 0x92, 0xE6, 0x3E, 0xEA, 0x04, 0xF2, 0xC4, 0xFC, + 0x41, 0xFE, 0x9B, 0x03, 0xCC, 0xF8, 0xB2, 0xF5, 0x21, 0xE4, 0xA8, 0xD6, + 0x1C, 0xDF, 0xDB, 0xC4, 0xFD, 0xD8, 0xBF, 0xC1, 0x1A, 0xC8, 0xB3, 0xC5, + 0xF8, 0xC9, 0x5F, 0xDC, 0x45, 0xDB, 0x57, 0xFE, 0x66, 0xF1, 0xA2, 0x14, + 0xB5, 0xFD, 0x0E, 0x0D, 0x86, 0xF5, 0xD6, 0xF7, 0x55, 0xEE, 0x29, 0xF5, + 0x0D, 0xF5, 0x58, 0x02, 0xCE, 0xFD, 0x7F, 0x0D, 0x93, 0xFD, 0xF9, 0x08, + 0x27, 0xF9, 0x26, 0x00, 0x90, 0xFD, 0xCC, 0xFD, 0xCF, 0xF4, 0xA9, 0xEA, + 0x27, 0xE7, 0x50, 0xD9, 0xE4, 0xDB, 0x80, 0xD2, 0x45, 0xDD, 0x96, 0xDD, + 0x86, 0xD6, 0x93, 0xDD, 0x10, 0xBF, 0x9B, 0xC8, 0xBD, 0xC3, 0x8E, 0xC9, + 0x0B, 0xDE, 0x8C, 0xE4, 0xC5, 0xF0, 0xAB, 0xFC, 0xA9, 0xF5, 0x55, 0x02, + 0x69, 0xED, 0xE8, 0xF1, 0x24, 0xE7, 0xDD, 0xDA, 0xBC, 0x0A, 0x21, 0xEE, + 0xA2, 0x28, 0xE3, 0x03, 0x70, 0x15, 0xAA, 0xEE, 0xB6, 0x12, 0xF9, 0xF1, + 0x36, 0x24, 0x7B, 0x13, 0xED, 0x15, 0x4E, 0x0F, 0x10, 0x0E, 0x5B, 0x04, + 0x61, 0x1E, 0x44, 0x10, 0x57, 0x1F, 0xB7, 0x1B, 0xA5, 0x22, 0x75, 0x27, + 0xCC, 0x2A, 0x36, 0x26, 0x37, 0x24, 0xB6, 0x12, 0x7E, 0x0C, 0xDB, 0xFD, + 0x6D, 0xF1, 0x7F, 0xF0, 0x29, 0xE2, 0xBF, 0xE2, 0x61, 0xEA, 0xFA, 0xE1, + 0x31, 0xFA, 0x29, 0xF6, 0xCB, 0xFD, 0xAD, 0x10, 0x83, 0xFC, 0xAB, 0x1C, + 0x37, 0x00, 0x21, 0x11, 0xB3, 0x07, 0x05, 0x03, 0xAB, 0x19, 0xD6, 0x10, + 0xD0, 0x2F, 0x85, 0x2A, 0xD9, 0x37, 0xF0, 0x2E, 0x78, 0x32, 0x30, 0x27, + 0xC9, 0x25, 0x1B, 0x24, 0x07, 0x19, 0x0C, 0x21, 0xEB, 0x0B, 0x82, 0x16, + 0xD1, 0x02, 0x25, 0x0C, 0xE1, 0x09, 0x68, 0x12, 0x39, 0x09, 0x5B, 0x1B, + 0x75, 0xEE, 0x49, 0x09, 0x17, 0xE4, 0x83, 0xFA, 0xFB, 0xE5, 0xA9, 0xFB, + 0x92, 0xF2, 0xE9, 0x08, 0x6C, 0x11, 0xA7, 0x16, 0xE6, 0x1C, 0xF6, 0x12, + 0x97, 0x02, 0xC7, 0xFE, 0x43, 0xF5, 0xCE, 0xFA, 0xD3, 0x05, 0x48, 0x0B, + 0x74, 0x04, 0xF8, 0x00, 0x29, 0xFB, 0x48, 0xEB, 0x63, 0x07, 0xAF, 0xFB, + 0x63, 0x0B, 0x2F, 0x0B, 0xDB, 0xFE, 0x5E, 0xF7, 0x2D, 0xF8, 0x50, 0xE4, + 0x69, 0xF8, 0x4A, 0xE8, 0x98, 0x01, 0x64, 0xFD, 0x68, 0x0A, 0x6A, 0x06, + 0x58, 0x0C, 0xA1, 0xF8, 0x7C, 0x06, 0x87, 0xE6, 0x38, 0xF4, 0x6E, 0xD9, + 0x0B, 0xDA, 0x20, 0xCD, 0x4F, 0xC3, 0xC4, 0xC1, 0xF7, 0xBF, 0xC2, 0xC7, + 0x1C, 0xD5, 0x01, 0xE6, 0x3F, 0xEF, 0x3F, 0x07, 0xAF, 0xF9, 0xF9, 0x13, + 0xC0, 0xFC, 0x11, 0x18, 0xA5, 0xF8, 0x97, 0x16, 0x5F, 0xFF, 0x75, 0x18, + 0xB2, 0x0E, 0x59, 0x23, 0xBE, 0x02, 0x9F, 0x22, 0xE5, 0xF3, 0xAB, 0x1E, + 0x21, 0xFD, 0x85, 0x1C, 0x23, 0x04, 0x37, 0x0C, 0x04, 0x01, 0xAC, 0xFA, + 0x89, 0xF9, 0x5D, 0xF4, 0x4B, 0x01, 0x6F, 0x00, 0xA1, 0xFA, 0x53, 0xF7, + 0x3B, 0xDC, 0x8B, 0xD8, 0xC2, 0xD4, 0xFC, 0xD3, 0x96, 0xEA, 0x94, 0xE3, + 0x60, 0x0D, 0xE6, 0xF0, 0x92, 0x24, 0xAE, 0xF3, 0x4D, 0x20, 0x32, 0xED, + 0x38, 0x0E, 0x56, 0xE8, 0x26, 0x26, 0x62, 0x0C, 0x85, 0x3F, 0x0C, 0x2E, + 0x75, 0x2B, 0xF0, 0x1C, 0x8F, 0x28, 0xC7, 0x12, 0x11, 0x3D, 0x49, 0x21, + 0x9D, 0x30, 0x25, 0x1A, 0x90, 0x11, 0x54, 0x07, 0x25, 0x06, 0xE8, 0x08, + 0xF4, 0x12, 0xC8, 0x20, 0x5B, 0x2E, 0x42, 0x3B, 0xFC, 0x34, 0x82, 0x39, + 0x7B, 0x1B, 0x73, 0x1B, 0xE9, 0xF8, 0x55, 0xFA, 0x4D, 0xE6, 0xD6, 0xEB, + 0x1F, 0xDC, 0xF4, 0xEC, 0x54, 0xDF, 0xAF, 0xFB, 0x29, 0xEA, 0xD2, 0x08, + 0x55, 0xF6, 0x6A, 0x14, 0x11, 0x03, 0xE4, 0x19, 0x08, 0x01, 0x7C, 0x08, + 0x56, 0xF3, 0xDE, 0xF4, 0x11, 0xF5, 0xCF, 0xFB, 0x18, 0x0B, 0x4E, 0x0E, + 0xDE, 0x0F, 0x07, 0x0D, 0x65, 0x14, 0xA0, 0x0A, 0x83, 0x1A, 0xB8, 0x06, + 0xC9, 0x10, 0xFD, 0xFC, 0xD2, 0x09, 0x0D, 0x01, 0x72, 0x03, 0x67, 0x02, + 0x95, 0xF4, 0x7E, 0xFA, 0x52, 0xEB, 0xA6, 0xFA, 0xC1, 0xD6, 0x6C, 0xEB, + 0x1D, 0xC3, 0xF8, 0xD7, 0x25, 0xD5, 0xEF, 0xE4, 0x0B, 0xF2, 0xAD, 0x03, + 0xA2, 0xF8, 0x6A, 0x14, 0x9E, 0xFD, 0xB3, 0x1E, 0xED, 0xFD, 0x0D, 0x19, + 0xE2, 0xFB, 0x3F, 0x10, 0x7E, 0x0C, 0x1C, 0x1F, 0x95, 0x0B, 0xE6, 0x1C, + 0xDD, 0xFF, 0x4A, 0x03, 0x1A, 0x09, 0x88, 0xFC, 0xB6, 0x0C, 0xDB, 0x03, + 0x88, 0xFB, 0xF5, 0xFC, 0x10, 0xED, 0x6C, 0xF0, 0xDD, 0xEC, 0x65, 0xEF, + 0x81, 0xF8, 0xAB, 0xF7, 0x99, 0x04, 0x03, 0xF6, 0x85, 0x09, 0xB3, 0xE8, + 0x13, 0x01, 0x49, 0xD1, 0x1D, 0xE8, 0x19, 0xB7, 0x11, 0xDA, 0xA7, 0xB0, + 0x63, 0xE0, 0x9E, 0xB9, 0xA5, 0xEA, 0x25, 0xC4, 0xE1, 0xF1, 0xBA, 0xD3, + 0xA5, 0xFF, 0x01, 0xF0, 0x79, 0x09, 0x71, 0x01, 0x9A, 0x0E, 0xED, 0x04, + 0xBD, 0x0D, 0x3B, 0x06, 0x3E, 0x0A, 0x7B, 0x0D, 0x0E, 0x13, 0x21, 0x1A, + 0x35, 0x0E, 0x24, 0x18, 0x4C, 0x03, 0xF5, 0x19, 0x4D, 0xFF, 0xE4, 0x22, + 0x07, 0xF4, 0x68, 0x18, 0xB2, 0xF5, 0x72, 0x0D, 0xF2, 0x05, 0xA8, 0x0B, + 0x2D, 0x0B, 0x48, 0x0D, 0x9F, 0xF9, 0xFF, 0x06, 0x31, 0xE6, 0x5D, 0xF6, + 0x9A, 0xE8, 0x3F, 0xF3, 0x1D, 0xFA, 0x8E, 0x04, 0x24, 0x10, 0x1A, 0x1D, + 0x3B, 0x19, 0x3B, 0x24, 0xE2, 0x05, 0x35, 0x0C, 0xE3, 0xF8, 0xA4, 0xF1, + 0x2E, 0x19, 0xBE, 0xFE, 0x51, 0x31, 0x96, 0x0E, 0x07, 0x27, 0xA4, 0x09, + 0xC9, 0x24, 0xAC, 0x11, 0xEB, 0x2B, 0x7F, 0x26, 0x44, 0x21, 0x0C, 0x23, + 0x0B, 0x10, 0x77, 0x0B, 0xCF, 0x07, 0x4B, 0xFF, 0xA9, 0x0E, 0xFE, 0x08, + 0x46, 0x22, 0xCF, 0x19, 0x21, 0x29, 0xE9, 0x1B, 0xE2, 0x15, 0x83, 0x0D, + 0x9A, 0xF6, 0x51, 0xFB, 0x92, 0xE9, 0xB2, 0xF7, 0x49, 0xE8, 0x98, 0xF1, + 0xD7, 0xE5, 0x3F, 0xE7, 0x79, 0xEB, 0x43, 0xF4, 0xC7, 0xFF, 0x40, 0x17, + 0xB0, 0x0A, 0x83, 0x26, 0x93, 0x01, 0xF5, 0x15, 0x2E, 0xF6, 0x0C, 0x02, + 0x1B, 0xF4, 0xED, 0xFC, 0xBA, 0xF6, 0x09, 0xFD, 0x2B, 0xFA, 0xCB, 0xFF, + 0x17, 0xFD, 0x5E, 0x08, 0x88, 0x00, 0x12, 0x0B, 0x68, 0x03, 0x72, 0x01, + 0x86, 0xEF, 0x44, 0xE4, 0x07, 0xE2, 0xF9, 0xD0, 0xEA, 0xED, 0xFE, 0xD7, + 0x99, 0xF4, 0xFF, 0xE3, 0x10, 0xE4, 0xF9, 0xDF, 0x16, 0xD0, 0x2F, 0xD3, + 0x4C, 0xD3, 0x81, 0xD2, 0x0B, 0xF3, 0x2C, 0xE5, 0xE0, 0x10, 0xB0, 0xF7, + 0x92, 0x08, 0x19, 0xF0, 0x77, 0xE7, 0x66, 0xD8, 0xAF, 0xE1, 0x21, 0xDE, + 0x3C, 0xFD, 0xBB, 0xFF, 0x9C, 0x0D, 0x51, 0x0F, 0x35, 0x03, 0xBC, 0x00, + 0x9C, 0xFB, 0x38, 0xF6, 0x21, 0x0A, 0x1C, 0x08, 0x64, 0x08, 0x58, 0x0B, + 0x72, 0xF9, 0x5A, 0xFB, 0xE2, 0xF3, 0x86, 0xF8, 0x6D, 0xF7, 0x46, 0x08, + 0x9B, 0xFF, 0x3B, 0x17, 0x66, 0xF9, 0xEA, 0x10, 0x3C, 0xE7, 0xD8, 0xFA, + 0x8D, 0xD3, 0xF3, 0xDF, 0x81, 0xCC, 0xB8, 0xD6, 0xEF, 0xCF, 0x2E, 0xDE, + 0x4C, 0xDC, 0x3D, 0xE6, 0xD4, 0xF6, 0x83, 0xF9, 0x9F, 0x10, 0xB4, 0x12, + 0xA2, 0x1A, 0x30, 0x1B, 0xC3, 0x14, 0x4B, 0x11, 0x41, 0x0C, 0x3E, 0x0A, + 0x88, 0x18, 0xE0, 0x1A, 0x02, 0x1D, 0x80, 0x1F, 0x79, 0x15, 0x98, 0x17, + 0x39, 0x1C, 0x63, 0x1D, 0x6D, 0x19, 0x77, 0x17, 0x66, 0x06, 0x96, 0x00, + 0x4C, 0xFD, 0x9F, 0xF6, 0xB1, 0xF9, 0xE8, 0xF4, 0x79, 0xFB, 0x32, 0xFC, + 0x0A, 0x03, 0x4E, 0x06, 0xA9, 0xF7, 0x9D, 0xF4, 0xC5, 0xEF, 0xB8, 0xE4, + 0x6F, 0xFE, 0x5E, 0xF2, 0x29, 0x15, 0x43, 0x0E, 0x5E, 0x1B, 0xD8, 0x18, + 0xE3, 0x0F, 0x04, 0x0D, 0x5D, 0xFE, 0x41, 0xF8, 0x5F, 0xFC, 0xC0, 0xF9, + 0x28, 0x0C, 0xB7, 0x11, 0x10, 0x11, 0xA4, 0x15, 0xBD, 0x10, 0xC0, 0x05, + 0xFC, 0x21, 0x2C, 0x0A, 0x92, 0x2E, 0x70, 0x13, 0x83, 0x20, 0xF8, 0xFA, + 0xBC, 0x23, 0xE3, 0xEF, 0xD5, 0x38, 0x79, 0x0D, 0x40, 0x3F, 0x05, 0x31, + 0xE9, 0x3C, 0x41, 0x43, 0x34, 0x34, 0x0E, 0x40, 0x66, 0x17, 0xE5, 0x24, + 0xF9, 0xFA, 0x3F, 0x0E, 0x33, 0xF4, 0x96, 0x0A, 0x55, 0xF4, 0x3E, 0x05, + 0x4D, 0xF9, 0xCE, 0x04, 0xA5, 0x0E, 0xB4, 0x20, 0x91, 0x25, 0x4E, 0x3E, + 0xA7, 0x26, 0x1C, 0x39, 0xD2, 0x1B, 0xEF, 0x21, 0xF1, 0x1F, 0xC2, 0x1F, + 0x80, 0x2F, 0x6B, 0x2F, 0x79, 0x31, 0x1D, 0x36, 0x4E, 0x2A, 0x7C, 0x3A, + 0x0C, 0x1B, 0x8B, 0x36, 0xF8, 0x06, 0x2C, 0x23, 0xFF, 0xF3, 0x01, 0x07, + 0xE9, 0xEF, 0x9E, 0xF7, 0xFF, 0xEE, 0xF7, 0xEE, 0xFF, 0xEF, 0x19, 0xF2, + 0x8D, 0xEE, 0x17, 0xF5, 0xC1, 0xDE, 0xD3, 0xE2, 0x33, 0xD7, 0x22, 0xD9, + 0xD1, 0xE7, 0x0C, 0xEB, 0x80, 0x07, 0x31, 0x06, 0x4D, 0x0A, 0x94, 0x08, + 0x06, 0xF0, 0x73, 0xFF, 0x60, 0xD9, 0x6B, 0xFB, 0x66, 0xE2, 0x37, 0x02, + 0xB1, 0xF7, 0x2B, 0x03, 0xBD, 0xF8, 0x5A, 0xEE, 0x2D, 0xFC, 0xF0, 0xE3, + 0x7B, 0x0B, 0x32, 0xED, 0x00, 0x0F, 0x32, 0xF0, 0x35, 0xFF, 0x91, 0xE7, + 0x7E, 0xEE, 0x90, 0xE2, 0xA9, 0xF7, 0x0A, 0xF1, 0xBF, 0x13, 0x69, 0x0A, + 0x3E, 0x15, 0x14, 0x0D, 0x19, 0xFB, 0xD0, 0xF8, 0x31, 0xE4, 0x4F, 0xE1, + 0xD4, 0xD2, 0x96, 0xCA, 0xDD, 0xBC, 0x59, 0xB4, 0x88, 0xB1, 0x2E, 0xAC, + 0x7B, 0xBE, 0x41, 0xB9, 0xDB, 0xE0, 0x8B, 0xD9, 0x6D, 0xFA, 0xD4, 0xEE, + 0xB6, 0xF5, 0x35, 0xE7, 0xFA, 0xE3, 0xAA, 0xD8, 0x30, 0xE2, 0xA3, 0xDB, + 0xBC, 0xF4, 0xFD, 0xEC, 0xF6, 0x03, 0xC9, 0xFD, 0xCA, 0x03, 0xA7, 0x07, + 0x0B, 0xFC, 0xC8, 0x08, 0xEF, 0xF1, 0x21, 0x00, 0x34, 0xDB, 0xAD, 0xE8, + 0x16, 0xD2, 0x98, 0xDE, 0xFD, 0xD5, 0x9F, 0xE0, 0x1C, 0xDE, 0x5F, 0xE7, + 0x8B, 0xD8, 0x82, 0xDF, 0xED, 0xCC, 0x58, 0xD3, 0x22, 0xDB, 0x03, 0xE4, + 0xEA, 0xF9, 0x98, 0x01, 0x14, 0x0A, 0x93, 0x09, 0xFA, 0x00, 0x62, 0xFA, + 0x99, 0xEF, 0x0A, 0xE6, 0xF4, 0xF0, 0x36, 0xE4, 0xFC, 0x0C, 0x58, 0xFE, + 0x56, 0x18, 0x81, 0x09, 0x5C, 0x05, 0xF4, 0xF6, 0xB1, 0xF4, 0x3B, 0xEC, + 0x20, 0xFB, 0x0C, 0xFB, 0xED, 0xF9, 0x3C, 0xFC, 0x09, 0xE7, 0x4D, 0xEB, + 0xC1, 0xE6, 0xFB, 0xF0, 0x33, 0x05, 0x03, 0x0B, 0xC3, 0x25, 0xB7, 0x15, + 0xBC, 0x2A, 0x25, 0x09, 0x19, 0x13, 0x1A, 0xF8, 0x7F, 0xEF, 0xF8, 0xEB, + 0xF8, 0xD0, 0x4A, 0xE2, 0x36, 0xC0, 0x05, 0xDA, 0x0E, 0xC6, 0xD7, 0xDB, + 0xDE, 0xDA, 0xFA, 0xE4, 0x92, 0xF8, 0x4F, 0xF8, 0x1D, 0x08, 0xEF, 0x03, + 0xD4, 0xFE, 0x58, 0xFB, 0x28, 0xF1, 0xC7, 0xEF, 0x18, 0xFB, 0x5E, 0xFE, + 0x6F, 0x11, 0x36, 0x1B, 0x22, 0x16, 0x90, 0x26, 0x8B, 0x11, 0xBF, 0x27, + 0x0F, 0x0B, 0xE2, 0x28, 0x0E, 0xFB, 0x86, 0x21, 0x8F, 0xE3, 0xD6, 0x0B, + 0x0B, 0xDA, 0xF9, 0xF9, 0x9B, 0xE5, 0xB5, 0xFC, 0xE8, 0xF6, 0xFE, 0x08, + 0xB1, 0xEA, 0xCC, 0xF7, 0x2F, 0xDA, 0x49, 0xE8, 0x44, 0xE7, 0xF1, 0xF8, + 0xCA, 0x09, 0x45, 0x0E, 0xFE, 0x26, 0xB3, 0x10, 0x08, 0x2F, 0x87, 0x0A, + 0x1F, 0x23, 0x2B, 0xFE, 0x19, 0x23, 0x31, 0x00, 0xE8, 0x3E, 0x0A, 0x1F, + 0x84, 0x4B, 0x39, 0x2D, 0xAB, 0x3A, 0x70, 0x1B, 0x9F, 0x2F, 0x3D, 0x14, + 0x77, 0x3E, 0x41, 0x26, 0xA5, 0x3F, 0xCC, 0x24, 0x61, 0x2C, 0xE6, 0x15, + 0xC9, 0x29, 0xF3, 0x20, 0x84, 0x38, 0xA6, 0x36, 0x41, 0x40, 0xFC, 0x39, + 0xBA, 0x38, 0x5D, 0x2E, 0x6B, 0x23, 0x80, 0x1B, 0x4A, 0x09, 0x5B, 0x06, + 0x9A, 0x01, 0x8C, 0xFF, 0x35, 0xFD, 0x66, 0xFB, 0x92, 0xF4, 0x3E, 0xF8, + 0x17, 0x03, 0x86, 0x0C, 0x5E, 0x24, 0xDD, 0x2C, 0x7D, 0x2F, 0x2C, 0x36, + 0x9A, 0x18, 0x8A, 0x23, 0x05, 0x04, 0x5E, 0x11, 0x8F, 0x0F, 0x3A, 0x18, + 0x24, 0x1C, 0x45, 0x24, 0x83, 0x13, 0x0C, 0x26, 0x51, 0x07, 0x59, 0x1F, + 0x80, 0x07, 0xA7, 0x18, 0x3E, 0x06, 0x13, 0x0D, 0x04, 0xFA, 0xAF, 0xFA, + 0x9A, 0xF1, 0xBD, 0xF1, 0x78, 0xF2, 0x12, 0xF6, 0xBC, 0xFC, 0x5C, 0x00, + 0x75, 0xF0, 0xE8, 0xF2, 0x8F, 0xE4, 0xAD, 0xE4, 0x77, 0xFB, 0x70, 0xED, + 0xC0, 0x19, 0xB8, 0x01, 0x4A, 0x1B, 0xB9, 0x14, 0xC1, 0x0A, 0xC0, 0x1A, + 0xD8, 0xFE, 0x6E, 0x0C, 0xB5, 0x07, 0xC4, 0x09, 0xD2, 0x25, 0xE2, 0x22, + 0xFB, 0x2E, 0xCC, 0x2B, 0x0D, 0x15, 0x4E, 0x15, 0x72, 0x07, 0x83, 0x0D, + 0x21, 0x0E, 0x04, 0x19, 0xE9, 0x04, 0x69, 0x17, 0x14, 0xFD, 0xEF, 0x11, + 0xE4, 0x05, 0x4C, 0x13, 0x44, 0x15, 0x1E, 0x1E, 0xAA, 0x17, 0x6C, 0x22, + 0x80, 0x08, 0xE9, 0x10, 0xF1, 0xF2, 0x00, 0xF2, 0x59, 0xE5, 0x65, 0xDB, + 0x2E, 0xDC, 0xB2, 0xCE, 0xAD, 0xD4, 0xCC, 0xC4, 0x4D, 0xE2, 0xAD, 0xC4, + 0x2F, 0x01, 0x5A, 0xD6, 0x75, 0x1D, 0xBB, 0xF8, 0x23, 0x21, 0x7E, 0x09, + 0x8A, 0x17, 0xCC, 0x00, 0xBE, 0x15, 0x3A, 0x01, 0x2B, 0x14, 0x1E, 0x0C, + 0x92, 0x13, 0x6E, 0x14, 0x3A, 0x17, 0xEB, 0x18, 0xB4, 0x0E, 0xA6, 0x15, + 0xBF, 0xFD, 0x25, 0x13, 0x23, 0xE8, 0x3E, 0x08, 0x29, 0xDA, 0x62, 0xF8, + 0xFE, 0xD7, 0x0B, 0xEF, 0x9C, 0xDA, 0xA1, 0xF2, 0x76, 0xE0, 0xD3, 0x01, + 0x9A, 0xD6, 0x01, 0x02, 0x25, 0xD6, 0x2B, 0xFC, 0x20, 0xF1, 0xE4, 0xFF, + 0x32, 0x0C, 0x73, 0x07, 0x5A, 0x08, 0x58, 0x03, 0x31, 0xF6, 0x1D, 0xF7, + 0x72, 0xEB, 0x2F, 0xEF, 0x75, 0xF3, 0x55, 0xF8, 0x86, 0x0B, 0x25, 0x0A, + 0x2E, 0x15, 0x7C, 0x08, 0x80, 0xFF, 0x75, 0xEF, 0x8B, 0xEF, 0xF8, 0xE6, + 0x53, 0xFB, 0x42, 0xF7, 0xD4, 0xFF, 0x17, 0xFA, 0x9E, 0xFD, 0x76, 0xF6, + 0x33, 0x0E, 0x53, 0x06, 0x8E, 0x23, 0x81, 0x11, 0xE7, 0x23, 0xC8, 0x0A, + 0x24, 0x0C, 0x36, 0x00, 0x7F, 0xE9, 0x50, 0xF1, 0x16, 0xDE, 0x81, 0xE7, + 0xDB, 0xE4, 0x18, 0xDF, 0xA0, 0xE4, 0x01, 0xCC, 0x26, 0xE5, 0xE1, 0xC6, + 0xAC, 0xEA, 0x77, 0xDE, 0xD9, 0xF1, 0xDE, 0xFA, 0x6F, 0xF3, 0xB2, 0x02, + 0x5C, 0xEC, 0x3A, 0xFB, 0x36, 0xF1, 0x96, 0xFF, 0x4E, 0x06, 0xBC, 0x0D, + 0x88, 0x0E, 0x48, 0x10, 0x73, 0x01, 0x7F, 0x05, 0x16, 0xEF, 0x86, 0xFE, + 0x68, 0xE7, 0x16, 0x00, 0xF3, 0xDD, 0x42, 0xEF, 0x98, 0xD1, 0xB5, 0xD3, + 0x75, 0xD1, 0x8E, 0xCF, 0xB6, 0xDB, 0xA3, 0xD7, 0xB4, 0xDC, 0x03, 0xD3, + 0x96, 0xCA, 0x93, 0xC3, 0xEA, 0xCD, 0x35, 0xC4, 0x5A, 0xF2, 0xBF, 0xD5, + 0x9D, 0x17, 0xC4, 0xE9, 0x02, 0x23, 0x2A, 0xF2, 0x52, 0x18, 0x68, 0xF1, + 0x02, 0xFA, 0xD1, 0xE8, 0x6D, 0xF6, 0x36, 0xEC, 0xB8, 0x14, 0xB4, 0xF8, + 0x28, 0x16, 0x8C, 0xF1, 0x53, 0x00, 0x6F, 0xED, 0x53, 0x02, 0x24, 0xFE, + 0xA4, 0x10, 0xF1, 0x07, 0x3C, 0x0A, 0xDF, 0xF9, 0x59, 0xFB, 0xD7, 0xF1, + 0x64, 0xFA, 0xD1, 0x03, 0xBB, 0x0C, 0x90, 0x22, 0xCE, 0x16, 0xD1, 0x2D, + 0xB5, 0x09, 0xD3, 0x1F, 0x88, 0xF5, 0xB2, 0x0F, 0x30, 0xE6, 0xBE, 0x07, + 0x2E, 0xD5, 0xF9, 0xFC, 0xDC, 0xC7, 0x04, 0xE9, 0x71, 0xD4, 0x9F, 0xE6, + 0xD0, 0xF2, 0x84, 0xFA, 0x59, 0x07, 0x24, 0x0A, 0x17, 0x0B, 0x06, 0x09, + 0x2E, 0x02, 0x53, 0xFF, 0x32, 0x00, 0x15, 0x02, 0x49, 0x0F, 0xF4, 0x16, + 0xBC, 0x19, 0x71, 0x27, 0x35, 0x19, 0xB0, 0x2D, 0x39, 0x16, 0x02, 0x2D, + 0x62, 0x10, 0x91, 0x1E, 0xC8, 0xFA, 0x27, 0x02, 0xF7, 0xE1, 0xD0, 0xEB, + 0xE1, 0xE1, 0x80, 0xEB, 0x0F, 0xF1, 0xE5, 0xF4, 0xE4, 0xF2, 0x8D, 0xF9, + 0xBF, 0xE9, 0xDC, 0xEF, 0x61, 0xF3, 0x97, 0xEB, 0x5E, 0x02, 0xE9, 0xF1, + 0xF6, 0x0B, 0x89, 0xFF, 0xA5, 0x13, 0x21, 0x0B, 0xDE, 0x0D, 0x9A, 0x09, + 0xD7, 0xFE, 0x29, 0x00, 0x3A, 0x0A, 0x55, 0x0B, 0x62, 0x22, 0xAD, 0x1F, + 0xFE, 0x1D, 0xAD, 0x15, 0x3C, 0x08, 0x1F, 0xFD, 0x43, 0x07, 0xCB, 0xFE, + 0x82, 0x0E, 0xDE, 0x03, 0x8A, 0x07, 0x97, 0xF0, 0x9A, 0x09, 0x96, 0xEA, + 0xB8, 0x18, 0xF2, 0xF8, 0x12, 0x24, 0x49, 0x0B, 0xCF, 0x25, 0xCF, 0x19, + 0x73, 0x1E, 0xDB, 0x16, 0x90, 0x10, 0x56, 0x07, 0x61, 0x04, 0x7F, 0x07, + 0xE7, 0xFB, 0x29, 0x0B, 0xFC, 0xF3, 0xB0, 0xFF, 0xEA, 0xEE, 0x39, 0xFE, + 0x31, 0xF4, 0x81, 0x11, 0x21, 0x08, 0xE9, 0x27, 0xF1, 0x14, 0x67, 0x2E, + 0xD9, 0x0B, 0xE3, 0x23, 0x13, 0x0C, 0x3B, 0x1F, 0xA9, 0x1D, 0x73, 0x29, + 0xC4, 0x23, 0x09, 0x2E, 0x0F, 0x16, 0x9A, 0x26, 0xA0, 0x0A, 0x2E, 0x1F, + 0x41, 0x0E, 0xE6, 0x1B, 0x08, 0x0D, 0xDD, 0x0D, 0x61, 0x02, 0x5E, 0xFC, + 0x88, 0xFF, 0x64, 0xF9, 0x8C, 0xFB, 0xF2, 0xF6, 0xA4, 0xEB, 0x11, 0xE9, + 0x27, 0xDD, 0xC1, 0xD8, 0xEC, 0xE3, 0xE0, 0xDA, 0x9C, 0xFB, 0xCD, 0xED, + 0xE8, 0x18, 0x74, 0x03, 0xA3, 0x26, 0x05, 0x0D, 0xC4, 0x1B, 0xE0, 0x0C, + 0xE2, 0x06, 0x59, 0x03, 0xF4, 0x13, 0xC1, 0x0D, 0x00, 0x33, 0xD8, 0x25, + 0xA2, 0x28, 0x5E, 0x23, 0xFB, 0x0C, 0x6D, 0x16, 0x7E, 0x0E, 0xF8, 0x18, + 0x95, 0x17, 0xF4, 0x18, 0x0F, 0x0B, 0xBA, 0x08, 0x74, 0x0A, 0xFE, 0x07, + 0x08, 0x1C, 0x0D, 0x19, 0x59, 0x2B, 0xE8, 0x2D, 0x5E, 0x30, 0x57, 0x37, + 0x5B, 0x23, 0x1D, 0x24, 0x65, 0x10, 0x37, 0x0B, 0x85, 0x07, 0xC7, 0x03, + 0xDE, 0x01, 0x52, 0xFD, 0x5E, 0xF4, 0x60, 0xF0, 0xB9, 0xF7, 0x00, 0xF1, + 0x36, 0x10, 0x27, 0xFF, 0xD5, 0x23, 0xB0, 0x0B, 0x65, 0x25, 0x05, 0x0F, + 0xB0, 0x19, 0x30, 0x05, 0x2A, 0x17, 0x4A, 0x00, 0x7C, 0x25, 0x62, 0x0F, + 0xAE, 0x25, 0x95, 0x1C, 0x3E, 0x13, 0x20, 0x1D, 0xDD, 0x08, 0xC8, 0x18, + 0x9D, 0x0B, 0x77, 0x10, 0x56, 0x0D, 0xCF, 0x07, 0x7F, 0x09, 0xF5, 0x04, + 0x7D, 0x04, 0xF4, 0x08, 0x54, 0xF4, 0xC7, 0x0C, 0xD4, 0xE8, 0x18, 0x0D, + 0x1F, 0xDB, 0xCA, 0xF9, 0x6B, 0xD4, 0x48, 0xED, 0x29, 0xE5, 0xED, 0xFB, + 0xD7, 0x03, 0x56, 0x10, 0xE3, 0x15, 0x0C, 0x16, 0xA3, 0x06, 0x7C, 0x03, + 0x5D, 0xF0, 0x09, 0xEA, 0x7A, 0xED, 0x3F, 0xE2, 0xF7, 0xFB, 0x4E, 0xF1, + 0x8E, 0xFE, 0x83, 0xF4, 0xD1, 0xF0, 0x4D, 0xE5, 0xCC, 0xEB, 0x7B, 0xE2, + 0x59, 0xE9, 0xBF, 0xE5, 0xD7, 0xD7, 0x7C, 0xDF, 0xAE, 0xC8, 0x62, 0xD7, + 0x84, 0xD4, 0xB7, 0xDD, 0xAA, 0xEA, 0xBA, 0xE6, 0xD0, 0xFA, 0x77, 0xED, + 0x76, 0xFD, 0xAD, 0xE8, 0x32, 0xE4, 0x70, 0xCB, 0xBB, 0xC6, 0x5B, 0xB0, + 0xBF, 0xBE, 0x10, 0xAE, 0x14, 0xBB, 0x7E, 0xB4, 0x5B, 0xBB, 0x06, 0xBF, + 0x3A, 0xCB, 0x69, 0xD1, 0x63, 0xE1, 0xC4, 0xE5, 0x66, 0xE5, 0x37, 0xF4, + 0xA7, 0xCC, 0xA3, 0xE9, 0x02, 0xBB, 0x6A, 0xD9, 0xAD, 0xC9, 0xC6, 0xDF, + 0x0F, 0xE1, 0x79, 0xF7, 0x5B, 0xE3, 0x16, 0x04, 0xD8, 0xD8, 0x23, 0xFD, + 0xE8, 0xCC, 0x64, 0xEB, 0x88, 0xC7, 0xF3, 0xD9, 0x34, 0xCD, 0xDE, 0xD4, + 0x6C, 0xC5, 0x5D, 0xD2, 0x1E, 0xB8, 0x91, 0xD1, 0xBC, 0xB9, 0x78, 0xCB, + 0xB1, 0xC8, 0x97, 0xC6, 0x55, 0xCB, 0xD4, 0xC0, 0x84, 0xCF, 0xE3, 0xC1, + 0xC0, 0xE2, 0x4E, 0xD1, 0x7D, 0xF7, 0xAD, 0xE4, 0x6D, 0x07, 0x69, 0xF0, + 0x90, 0x05, 0xF2, 0xE3, 0x42, 0xFA, 0x56, 0xCE, 0x1E, 0xFD, 0xC4, 0xCF, + 0xE3, 0x11, 0x24, 0xED, 0xD5, 0x16, 0x30, 0xFB, 0x0E, 0x0C, 0x1B, 0xEC, + 0x60, 0x16, 0xC2, 0xF4, 0x4E, 0x25, 0x27, 0x12, 0xA7, 0x19, 0x23, 0x18, + 0x52, 0x05, 0x3F, 0x11, 0xE1, 0x0D, 0x9B, 0x1A, 0x5A, 0x23, 0x87, 0x2C, + 0xDE, 0x28, 0xD7, 0x3A, 0xB1, 0x23, 0xD0, 0x3A, 0x6A, 0x18, 0xC7, 0x21, + 0xB4, 0x09, 0xEA, 0x06, 0x17, 0xF7, 0x1A, 0xF9, 0x9B, 0xE6, 0x8C, 0xE8, + 0x50, 0xEB, 0xD2, 0xDF, 0xEF, 0x03, 0xFB, 0xF2, 0x79, 0x1E, 0x46, 0x16, + 0xC7, 0x27, 0x25, 0x31, 0x1B, 0x1B, 0x06, 0x2D, 0x7A, 0x0A, 0x71, 0x17, + 0x4E, 0x0D, 0x0B, 0x1A, 0x3D, 0x1A, 0xF8, 0x2A, 0x80, 0x1B, 0xBB, 0x29, + 0x13, 0x18, 0x37, 0x1E, 0xF2, 0x12, 0xA9, 0x11, 0x0E, 0x11, 0xD1, 0x0C, + 0xC6, 0x0D, 0x23, 0x0A, 0xF0, 0x04, 0xD2, 0x07, 0xF3, 0xFD, 0xC4, 0x09, + 0xA1, 0x05, 0x5F, 0x11, 0x95, 0x11, 0xBE, 0x12, 0xF1, 0x0E, 0x4B, 0x04, + 0x28, 0x0F, 0x2F, 0x09, 0x36, 0x17, 0xA8, 0x1F, 0x9F, 0x2C, 0x10, 0x37, + 0x64, 0x3B, 0x30, 0x3C, 0x0C, 0x2C, 0x60, 0x2D, 0xA8, 0x10, 0x89, 0x22, + 0x0B, 0x13, 0xB7, 0x2A, 0x5A, 0x32, 0x2A, 0x39, 0x69, 0x32, 0x79, 0x28, + 0x24, 0x1C, 0xA4, 0x11, 0xEB, 0x19, 0x9A, 0x1D, 0x0C, 0x1E, 0x51, 0x34, + 0xCB, 0x18, 0x14, 0x33, 0x92, 0x1A, 0x8E, 0x2E, 0xDB, 0x27, 0x82, 0x35, + 0x0C, 0x39, 0x83, 0x40, 0x7D, 0x40, 0x4E, 0x40, 0x18, 0x2C, 0x0F, 0x28, + 0xD9, 0x15, 0x4C, 0x0D, 0xA5, 0x13, 0x30, 0xFA, 0x4F, 0x11, 0x31, 0xEA, + 0x4F, 0x0A, 0x07, 0xE0, 0x42, 0x0E, 0x98, 0xE5, 0x9F, 0x17, 0x3E, 0xFB, + 0x5C, 0x20, 0xEA, 0x15, 0x10, 0x23, 0xD0, 0x21, 0x9F, 0x17, 0x13, 0x17, + 0xBF, 0x0D, 0x19, 0x11, 0x0A, 0x1B, 0x0E, 0x21, 0x77, 0x28, 0xEE, 0x2F, + 0x7D, 0x1B, 0x04, 0x2B, 0xE7, 0x0A, 0x2F, 0x21, 0xA8, 0xFE, 0xD1, 0x13, + 0xD2, 0xF7, 0x26, 0x06, 0x42, 0xEF, 0x61, 0xF8, 0xD3, 0xE8, 0x18, 0xEB, + 0x28, 0xE9, 0xB4, 0xE2, 0x5B, 0xF3, 0xD3, 0xE2, 0x23, 0xF8, 0x75, 0xE0, + 0x80, 0xE6, 0x87, 0xD4, 0xAC, 0xDF, 0xE0, 0xE0, 0xF1, 0xE6, 0x94, 0xFC, + 0xD2, 0xFB, 0xD1, 0x0D, 0x4D, 0x0E, 0x14, 0x0B, 0xFB, 0x04, 0xB2, 0xF8, + 0xFD, 0xEC, 0xBC, 0xE5, 0x82, 0xE8, 0x8F, 0xE5, 0x26, 0xF5, 0x93, 0xF4, + 0x3C, 0xEF, 0x8C, 0xF3, 0xB8, 0xE3, 0xF2, 0xEC, 0x0D, 0xEC, 0xFF, 0xF5, + 0xCA, 0xFB, 0xFB, 0x02, 0xD8, 0xFF, 0x4E, 0x01, 0x5B, 0xFF, 0x08, 0xFF, + 0x55, 0x00, 0xD3, 0x07, 0x70, 0x06, 0x88, 0x15, 0xF7, 0x07, 0xFE, 0x15, + 0x43, 0xFF, 0x8F, 0x04, 0xF2, 0xF8, 0x6F, 0xF3, 0xD6, 0xEE, 0x1A, 0xE0, + 0x62, 0xDD, 0x30, 0xCC, 0xE5, 0xCA, 0x7A, 0xC4, 0xA1, 0xC5, 0x6D, 0xC9, + 0x6F, 0xD6, 0x84, 0xD3, 0x4E, 0xEB, 0x35, 0xDF, 0xCE, 0xEC, 0x49, 0xE1, + 0x5E, 0xD9, 0x3A, 0xDC, 0x76, 0xCC, 0xFF, 0xDF, 0x63, 0xD7, 0x13, 0xEE, + 0xCE, 0xE5, 0xE5, 0xFA, 0xF4, 0xE5, 0x0D, 0xFA, 0x0B, 0xE2, 0x87, 0xEF, + 0xDE, 0xE2, 0x7F, 0xE0, 0xFF, 0xE7, 0xB7, 0xD9, 0x6E, 0xE0, 0x82, 0xD1, + 0xA7, 0xD1, 0x14, 0xC5, 0x62, 0xCC, 0xCD, 0xBB, 0x1B, 0xD9, 0x7A, 0xB4, + 0xAC, 0xE4, 0xDA, 0xB1, 0x2E, 0xD4, 0xC9, 0xB2, 0x67, 0xCE, 0x2C, 0xC6, + 0x88, 0xE2, 0xD5, 0xE5, 0x0D, 0xF6, 0x21, 0xFC, 0x46, 0xFD, 0x3E, 0x00, + 0xA8, 0xF7, 0x4F, 0xF3, 0xA1, 0xED, 0x5A, 0xE0, 0xDF, 0xF3, 0x09, 0xE6, + 0x0F, 0x03, 0x23, 0xF9, 0xDC, 0xFC, 0xBB, 0xF5, 0x02, 0xEC, 0x29, 0xE4, + 0x89, 0xF1, 0x25, 0xE2, 0x6A, 0x06, 0x36, 0xF0, 0x94, 0x04, 0x93, 0xEE, + 0xDA, 0xF6, 0xC7, 0xEE, 0x8E, 0xF2, 0x2B, 0x05, 0xEA, 0xED, 0x9F, 0x20, + 0x0C, 0xE6, 0x91, 0x27, 0xE9, 0xEF, 0x92, 0x1B, 0x8E, 0xFF, 0xBB, 0x0A, + 0x65, 0xF6, 0xD2, 0xF9, 0xB0, 0xE3, 0xE8, 0xF1, 0xB9, 0xD9, 0x52, 0xED, + 0x86, 0xDB, 0x16, 0xEB, 0x0F, 0xEC, 0xAE, 0xF4, 0x7B, 0x02, 0x1F, 0x0B, + 0x85, 0x0E, 0xAF, 0x16, 0x99, 0x0D, 0xC4, 0x11, 0xE4, 0x08, 0x4E, 0x14, + 0x84, 0x0C, 0x5F, 0x27, 0x0B, 0x17, 0x38, 0x33, 0x4C, 0x1C, 0x3A, 0x24, + 0x9F, 0x1C, 0xDD, 0x0E, 0xE5, 0x19, 0xD1, 0x02, 0x0B, 0x1A, 0x32, 0x06, + 0x20, 0x16, 0x56, 0x07, 0x56, 0x09, 0x83, 0xF7, 0xA0, 0xFF, 0x1A, 0xE5, + 0x27, 0xFD, 0x98, 0xDA, 0x7A, 0xFB, 0x97, 0xD8, 0x0B, 0xE9, 0x64, 0xD1, + 0xE4, 0xE3, 0x5B, 0xDC, 0xDA, 0xF5, 0x58, 0xFB, 0xF1, 0x03, 0xD1, 0x0C, + 0xC9, 0x05, 0xA1, 0x09, 0x8B, 0xF6, 0x1A, 0xFB, 0x49, 0xEA, 0x7A, 0xF5, + 0xAF, 0xFE, 0x40, 0x00, 0xA6, 0x27, 0x30, 0x13, 0x68, 0x35, 0xCB, 0x18, + 0x4B, 0x2A, 0x14, 0x0F, 0x8E, 0x28, 0xB5, 0x0D, 0xE5, 0x2E, 0xB2, 0x18, + 0x65, 0x22, 0x01, 0x19, 0x87, 0x14, 0xD3, 0x12, 0xBD, 0x1F, 0x7D, 0x21, + 0x04, 0x2C, 0xAF, 0x3A, 0xFF, 0x2C, 0x77, 0x46, 0x4D, 0x27, 0xCF, 0x42, + 0x28, 0x23, 0x92, 0x3B, 0x0B, 0x1F, 0x37, 0x34, 0xA4, 0x12, 0x84, 0x24, + 0xEC, 0x01, 0x58, 0x14, 0x0D, 0x00, 0x5D, 0x19, 0x05, 0x0D, 0x1C, 0x28, + 0x3C, 0x1B, 0x9D, 0x32, 0x7D, 0x21, 0x57, 0x32, 0x6A, 0x1D, 0x3E, 0x21, + 0xBF, 0x1C, 0xD3, 0x14, 0x0F, 0x29, 0xB2, 0x1F, 0x77, 0x34, 0x37, 0x33, + 0xD0, 0x2C, 0x16, 0x32, 0xCF, 0x28, 0x8E, 0x29, 0xF8, 0x27, 0x6F, 0x22, + 0x35, 0x1D, 0x22, 0x1A, 0x20, 0x18, 0xF1, 0x1A, 0x6B, 0x0F, 0x26, 0x16, + 0x24, 0x07, 0x69, 0x10, 0x43, 0x06, 0xE1, 0x0B, 0x64, 0x0C, 0xDA, 0x01, + 0xCE, 0x04, 0xD7, 0xF1, 0x92, 0xF3, 0x8F, 0xF0, 0x15, 0xF8, 0x77, 0x07, + 0x45, 0x06, 0x65, 0x1C, 0xDF, 0x09, 0x75, 0x21, 0x84, 0x01, 0xAB, 0x1A, + 0x9A, 0xFA, 0xCA, 0x0D, 0xEC, 0x08, 0xFD, 0x08, 0xF7, 0x2B, 0x76, 0x14, + 0x31, 0x40, 0xE0, 0x1B, 0xBF, 0x2B, 0xBB, 0x12, 0x59, 0x12, 0xD8, 0x0D, + 0x5D, 0x13, 0xAC, 0x11, 0x2D, 0x11, 0xC6, 0x04, 0x07, 0x05, 0x54, 0xF4, + 0xBB, 0x05, 0x00, 0xFB, 0xE5, 0x0A, 0xC2, 0x0B, 0xDE, 0x09, 0xD7, 0x14, + 0xA3, 0xFA, 0x14, 0x0C, 0xED, 0xEE, 0x5C, 0xFF, 0x92, 0xEF, 0x5E, 0xF4, + 0x08, 0xEB, 0x9A, 0xDE, 0x6B, 0xE7, 0x98, 0xCC, 0x09, 0xF1, 0xE0, 0xD3, + 0x2A, 0x01, 0xA2, 0xE7, 0xCE, 0x0B, 0x75, 0xF5, 0x07, 0x0F, 0xE1, 0xF6, + 0x66, 0x07, 0x6E, 0xEB, 0x6D, 0xFD, 0xA3, 0xE2, 0xAD, 0xFD, 0xC5, 0xEB, + 0xA1, 0xFF, 0x98, 0x01, 0x0D, 0xFD, 0x83, 0x13, 0x2C, 0xF8, 0x2B, 0x13, + 0x37, 0xF7, 0x76, 0x09, 0xBA, 0xF6, 0x25, 0x04, 0xBB, 0xF6, 0x22, 0x03, + 0xD0, 0xF1, 0xDF, 0xF8, 0xAA, 0xE9, 0x28, 0xED, 0x3A, 0xE0, 0x4B, 0xE5, + 0x94, 0xD3, 0x25, 0xDB, 0xB6, 0xC3, 0x3E, 0xC8, 0x3E, 0xB4, 0x26, 0xB0, + 0xDD, 0xBA, 0xBC, 0xAE, 0xBF, 0xCA, 0xC1, 0xC2, 0xAC, 0xCF, 0x0F, 0xDA, + 0xB6, 0xC9, 0xB1, 0xE3, 0xD5, 0xBF, 0xC3, 0xDA, 0xC4, 0xBD, 0xE7, 0xCE, + 0x73, 0xCF, 0x1A, 0xD5, 0xF6, 0xEA, 0x2D, 0xE4, 0x42, 0xF5, 0xFE, 0xE1, + 0xA6, 0xEE, 0xE7, 0xD4, 0xFD, 0xEE, 0x0E, 0xD7, 0x1D, 0xF6, 0xAF, 0xE0, + 0x36, 0xF0, 0xA4, 0xD8, 0xDC, 0xE2, 0xE9, 0xD0, 0xE6, 0xDA, 0x9F, 0xDB, + 0x83, 0xDE, 0xFA, 0xEC, 0x30, 0xE4, 0xE7, 0xF1, 0x00, 0xDE, 0xF3, 0xEC, + 0xB2, 0xD7, 0x36, 0xEB, 0xC9, 0xD4, 0xB2, 0xE5, 0xC0, 0xCC, 0x5A, 0xD9, + 0x00, 0xCA, 0x1E, 0xD7, 0x65, 0xD1, 0xBD, 0xE2, 0x41, 0xDA, 0x34, 0xEE, + 0xFA, 0xE8, 0x3C, 0xF8, 0x82, 0xF0, 0x41, 0xF5, 0xD3, 0xDE, 0x55, 0xE5, + 0x88, 0xD2, 0xE0, 0xE7, 0xE4, 0xE6, 0x01, 0xFF, 0xB5, 0x00, 0x8A, 0x08, + 0x97, 0x04, 0xE1, 0xFE, 0x6E, 0xF8, 0x68, 0xF7, 0xEF, 0xF0, 0x40, 0xFE, + 0xAE, 0xF8, 0x6C, 0x09, 0x50, 0x0B, 0xB6, 0x0D, 0x3E, 0x11, 0x62, 0x02, + 0x4C, 0x13, 0x99, 0xF8, 0x76, 0x0F, 0x05, 0xED, 0x6F, 0xFE, 0x57, 0xDC, + 0x06, 0xF1, 0xFF, 0xD9, 0xEA, 0xFA, 0xD5, 0xEA, 0x2C, 0x16, 0x79, 0xFF, + 0x93, 0x27, 0xF3, 0x0B, 0x03, 0x2D, 0x35, 0x13, 0xB3, 0x29, 0x69, 0x13, + 0x9D, 0x22, 0xE4, 0x11, 0x45, 0x23, 0xFA, 0x1B, 0x20, 0x34, 0x2C, 0x34, + 0x1F, 0x40, 0x62, 0x44, 0x6C, 0x31, 0x60, 0x37, 0x91, 0x21, 0x00, 0x23, + 0xB2, 0x1F, 0x68, 0x1B, 0xF6, 0x10, 0x5A, 0x0F, 0x29, 0x02, 0x40, 0x0C, + 0x0A, 0xFF, 0xD9, 0x12, 0x76, 0xFB, 0xAF, 0x11, 0xBF, 0x00, 0x7E, 0x16, + 0x26, 0x03, 0x0C, 0x1B, 0xF6, 0xFC, 0x7F, 0x15, 0xC2, 0xFA, 0x3B, 0x0C, + 0x42, 0xF8, 0x1A, 0xFF, 0xC7, 0xF6, 0x18, 0xF4, 0x2D, 0x00, 0x70, 0xF8, + 0x4C, 0x0D, 0x3B, 0x02, 0xEF, 0x16, 0x3F, 0x05, 0x43, 0x21, 0x57, 0x05, + 0x70, 0x1C, 0xF9, 0xFD, 0xEC, 0x09, 0xC5, 0xF4, 0x54, 0x09, 0xB4, 0xFE, + 0x91, 0x0E, 0x91, 0x08, 0x14, 0x09, 0x45, 0x04, 0x43, 0x00, 0x88, 0x01, + 0x23, 0xF7, 0x90, 0x03, 0x01, 0xEF, 0xAE, 0x03, 0xF1, 0xF2, 0x42, 0x05, + 0xE0, 0xFA, 0x7D, 0x03, 0xC6, 0xF6, 0xED, 0xF4, 0xD0, 0xEF, 0xF0, 0xE9, + 0x97, 0xDC, 0x45, 0xE0, 0x1C, 0xC6, 0x31, 0xD5, 0xC4, 0xC7, 0x39, 0xD6, + 0x01, 0xE0, 0x3F, 0xEB, 0xCF, 0xF2, 0xF9, 0x04, 0x52, 0xF8, 0x60, 0x10, + 0xE6, 0xEE, 0x20, 0x04, 0xAA, 0xDE, 0xA3, 0xEF, 0x5E, 0xE0, 0xA7, 0xEC, + 0xE4, 0xF3, 0x86, 0xFA, 0x8E, 0x0A, 0x3E, 0x0C, 0xB7, 0x10, 0x49, 0x0C, + 0xCA, 0x06, 0x1B, 0xFA, 0xED, 0x0A, 0x4D, 0xFA, 0x59, 0x14, 0xD6, 0x02, + 0x6C, 0x0E, 0xE0, 0xFB, 0x13, 0x10, 0x7A, 0xFE, 0xE6, 0x18, 0xDA, 0x08, + 0x9B, 0x20, 0xA9, 0x10, 0x48, 0x20, 0x74, 0x15, 0xF8, 0x10, 0x3E, 0x13, + 0xD9, 0x09, 0x13, 0x17, 0xF3, 0x0D, 0xF7, 0x1B, 0xE5, 0x16, 0xB3, 0x1C, + 0x42, 0x20, 0x36, 0x1D, 0xAF, 0x19, 0xF7, 0x16, 0xD4, 0x0A, 0x5A, 0x0F, + 0xB5, 0x10, 0xD9, 0x17, 0xCB, 0x1D, 0x4D, 0x23, 0xB8, 0x15, 0xE1, 0x1C, + 0xD4, 0x13, 0xC2, 0x19, 0x1F, 0x20, 0x05, 0x20, 0x6D, 0x31, 0x5A, 0x2E, + 0xE8, 0x3E, 0xB7, 0x3C, 0x4B, 0x37, 0x70, 0x36, 0x86, 0x2A, 0x20, 0x2D, + 0x0C, 0x28, 0xC5, 0x29, 0xEE, 0x28, 0xDE, 0x24, 0x93, 0x1F, 0x76, 0x1F, + 0x69, 0x0A, 0xD2, 0x18, 0x57, 0xFB, 0xBE, 0x11, 0x1B, 0xFB, 0x4B, 0x09, + 0xBA, 0x08, 0xD4, 0x04, 0x28, 0x17, 0x43, 0x05, 0xAD, 0x22, 0x1A, 0x10, + 0xB8, 0x2A, 0x79, 0x1D, 0x55, 0x2C, 0x75, 0x25, 0x9A, 0x2B, 0x42, 0x30, + 0x59, 0x21, 0xEA, 0x30, 0xD9, 0x0D, 0x96, 0x1F, 0xCB, 0x0E, 0x00, 0x1D, + 0x4C, 0x20, 0x4E, 0x2D, 0x73, 0x15, 0x6C, 0x24, 0x37, 0xFF, 0xC3, 0x0E, + 0x05, 0x02, 0x43, 0x0E, 0x96, 0xFC, 0x33, 0x0C, 0x8C, 0xF6, 0xEB, 0x0D, + 0xC4, 0x06, 0xBF, 0x14, 0x61, 0x12, 0x13, 0x09, 0x98, 0x18, 0xEB, 0x03, + 0xF7, 0x14, 0x2A, 0x07, 0x04, 0x03, 0xD9, 0xFC, 0x45, 0xFB, 0xDA, 0xF2, + 0x9A, 0xF8, 0x42, 0xE7, 0x0A, 0xEB, 0x8D, 0xD5, 0x64, 0xE7, 0x26, 0xD1, + 0x60, 0xF0, 0xEC, 0xD3, 0xDA, 0xF0, 0x79, 0xD2, 0x71, 0xF1, 0xE8, 0xDB, + 0xDE, 0xF2, 0xF4, 0xE4, 0x64, 0xEE, 0x92, 0xDE, 0xC9, 0xED, 0x40, 0xD9, + 0x39, 0xF9, 0x1E, 0xE1, 0x27, 0x03, 0x3C, 0xEE, 0x71, 0xF1, 0x20, 0xEA, + 0x17, 0xD4, 0xDF, 0xD9, 0x30, 0xCA, 0x0C, 0xD2, 0x8F, 0xCF, 0x58, 0xCF, + 0xD0, 0xD0, 0xFB, 0xC9, 0xD9, 0xCE, 0xDB, 0xC8, 0x56, 0xCD, 0x28, 0xCD, + 0x8F, 0xC8, 0x63, 0xCB, 0xBC, 0xC6, 0xB3, 0xC6, 0x0A, 0xC2, 0xE6, 0xBF, + 0xD0, 0xBC, 0xB4, 0xBF, 0xC2, 0xCB, 0x1F, 0xD2, 0xBD, 0xE3, 0xFC, 0xE1, + 0x81, 0xE5, 0x93, 0xDE, 0xF7, 0xD7, 0x8C, 0xD9, 0x92, 0xCC, 0x23, 0xD9, + 0x95, 0xCC, 0x2E, 0xDF, 0xE4, 0xDE, 0x88, 0xF3, 0x7A, 0xED, 0x80, 0xFF, + 0xDE, 0xEE, 0x49, 0xFC, 0x9C, 0xE2, 0x2E, 0xEB, 0x42, 0xE2, 0x0E, 0xE6, + 0x91, 0xE8, 0x0B, 0xF2, 0xA7, 0xE7, 0x8E, 0xFC, 0xDA, 0xFB, 0x83, 0x13, + 0x3E, 0x11, 0xD7, 0x28, 0xCC, 0x1D, 0x86, 0x35, 0x89, 0x24, 0xD3, 0x30, + 0x8A, 0x19, 0x7E, 0x1A, 0x9A, 0x0C, 0xF3, 0x10, 0x3C, 0x00, 0x37, 0x09, + 0x43, 0xF4, 0x70, 0xFA, 0x76, 0xF1, 0xB2, 0xF3, 0x57, 0xF7, 0x9E, 0xF5, + 0x5D, 0x00, 0xFD, 0xFB, 0x0F, 0x0A, 0xD6, 0x04, 0x17, 0x0E, 0x5E, 0x03, + 0xA0, 0x0C, 0x37, 0xFB, 0x1C, 0x19, 0x47, 0x06, 0x1D, 0x20, 0x8B, 0x10, + 0x61, 0x14, 0xC0, 0x0A, 0x67, 0x0A, 0xA6, 0x04, 0xC7, 0x02, 0x7B, 0xFE, + 0xC6, 0xFA, 0xBB, 0xF8, 0xF4, 0xFA, 0xD3, 0xF5, 0x4F, 0x00, 0xAF, 0xED, + 0x37, 0x02, 0x74, 0xE8, 0xC3, 0x07, 0x04, 0xF2, 0x41, 0x09, 0xC2, 0xF4, + 0xA7, 0x09, 0x21, 0xF2, 0x5A, 0x11, 0x8C, 0xFB, 0x0F, 0x12, 0xC6, 0x06, + 0x29, 0x18, 0x15, 0x19, 0x81, 0x22, 0x88, 0x2A, 0x39, 0x1E, 0x95, 0x27, + 0x15, 0x13, 0x36, 0x1E, 0xBF, 0x08, 0x3B, 0x14, 0xFB, 0xFE, 0x0E, 0x0C, + 0xD1, 0x06, 0x0B, 0x20, 0xA3, 0x12, 0x17, 0x3A, 0xB7, 0x0A, 0xA9, 0x36, + 0x79, 0x06, 0x3E, 0x2C, 0x9E, 0x0B, 0x22, 0x27, 0x07, 0x0D, 0x10, 0x1B, + 0x99, 0x1F, 0xBE, 0x1F, 0x5D, 0x3A, 0xB2, 0x2E, 0xC0, 0x3D, 0xF2, 0x2A, + 0x3F, 0x36, 0xA8, 0x26, 0x99, 0x2A, 0x68, 0x22, 0x67, 0x1F, 0xDD, 0x17, + 0xD9, 0x20, 0x1A, 0x10, 0x3D, 0x1B, 0x1B, 0x08, 0xDD, 0x07, 0x29, 0xFD, + 0xB8, 0x05, 0xE7, 0xFF, 0xC4, 0x04, 0x86, 0x00, 0x1D, 0xF7, 0xA2, 0xF9, + 0x78, 0xF9, 0x4A, 0xFF, 0x0D, 0x05, 0xF8, 0x01, 0x1F, 0x0D, 0x1B, 0x06, + 0x78, 0x12, 0x51, 0x11, 0xED, 0x13, 0x1D, 0x1B, 0xAC, 0x09, 0x74, 0x19, + 0x00, 0x00, 0x99, 0x15, 0x5F, 0xFA, 0xC5, 0x13, 0x68, 0xED, 0x04, 0x09, + 0xD4, 0xEE, 0x58, 0x04, 0x90, 0xF3, 0xE4, 0xF7, 0xE1, 0xED, 0xCC, 0xE8, + 0x7F, 0xF3, 0xC3, 0xF0, 0xC9, 0xF3, 0x8E, 0xF2, 0xE6, 0xF1, 0x3A, 0xEB, + 0xF2, 0xFB, 0xBF, 0xE9, 0x5C, 0x00, 0xEF, 0xE7, 0xA6, 0x01, 0x95, 0xF0, + 0x40, 0x08, 0x7B, 0x04, 0xE0, 0x0B, 0x1B, 0x0F, 0xF3, 0xFD, 0x50, 0x07, + 0x29, 0xEB, 0xC8, 0xF6, 0xD2, 0xF9, 0x21, 0xF7, 0x36, 0x1A, 0x4A, 0x02, + 0x89, 0x20, 0xBB, 0xFD, 0x3F, 0x10, 0x67, 0xF0, 0x6E, 0x05, 0x9B, 0xED, + 0x33, 0x0B, 0xE8, 0xFA, 0x2F, 0x13, 0x0B, 0x01, 0x7D, 0x12, 0x23, 0xF7, + 0x73, 0x13, 0x8E, 0xF8, 0x9B, 0x12, 0xA2, 0x08, 0x17, 0x0E, 0x4C, 0x1B, + 0xE2, 0x05, 0x7F, 0x23, 0xE7, 0xF1, 0x54, 0x16, 0x6B, 0xEA, 0x8C, 0x09, + 0x11, 0xEF, 0xE6, 0x01, 0xDF, 0xED, 0x5F, 0xF9, 0x67, 0xEB, 0x16, 0xF8, + 0x03, 0xE9, 0x41, 0xF6, 0x3F, 0xF0, 0x02, 0xF5, 0x04, 0x00, 0x5D, 0xFC, + 0xC1, 0xFD, 0x94, 0xF7, 0x80, 0xF2, 0xE5, 0xEA, 0x2F, 0xF8, 0x10, 0xEF, + 0x9D, 0xFB, 0x79, 0xF5, 0xB5, 0xF8, 0x4B, 0xF4, 0xF9, 0xFA, 0xB8, 0xF3, + 0x0E, 0xEE, 0x74, 0xEC, 0x5B, 0xDD, 0xCB, 0xE8, 0x0D, 0xE1, 0x57, 0xF0, + 0xCB, 0xE7, 0xF1, 0xEC, 0x77, 0xE2, 0xFA, 0xDC, 0x96, 0xDD, 0x8E, 0xD6, + 0x79, 0xDB, 0xA7, 0xD5, 0x57, 0xDD, 0x2D, 0xD4, 0xE4, 0xE2, 0xE1, 0xD8, + 0x14, 0xE5, 0x92, 0xE6, 0x04, 0xE9, 0xE5, 0xF8, 0xC2, 0xF1, 0xA9, 0x06, + 0xD4, 0xF9, 0xA2, 0x0B, 0xEC, 0xF5, 0xBC, 0x02, 0x0E, 0xEC, 0xA0, 0xF4, + 0x68, 0xEA, 0x8B, 0xED, 0x28, 0xF4, 0x37, 0xF0, 0xD6, 0xF7, 0xBE, 0xF0, + 0x52, 0xF2, 0xEB, 0xEC, 0xF2, 0xF5, 0xA0, 0xEC, 0x01, 0xFD, 0xCE, 0xEC, + 0xC4, 0xF6, 0x9C, 0xED, 0x81, 0xE6, 0x49, 0xF3, 0xB7, 0xE3, 0x0E, 0xFF, + 0xD8, 0xEB, 0x8F, 0x03, 0xE5, 0xEC, 0x68, 0xFE, 0x49, 0xEC, 0x6C, 0xFE, + 0xCD, 0xED, 0x6D, 0xFB, 0x4E, 0xEF, 0x8D, 0xEF, 0xAB, 0xEB, 0x71, 0xE3, + 0x9F, 0xE7, 0x11, 0xDF, 0xDD, 0xED, 0xA1, 0xE4, 0x93, 0xF9, 0xCF, 0xE9, + 0xFA, 0x08, 0x15, 0xEC, 0xAD, 0x10, 0xED, 0xEB, 0xC7, 0x0E, 0x84, 0xF0, + 0x42, 0x0D, 0x83, 0xFA, 0x43, 0x09, 0x90, 0x01, 0x52, 0x0D, 0xE8, 0x12, + 0x9B, 0x13, 0x62, 0x20, 0xC5, 0x0F, 0x02, 0x1B, 0x92, 0x09, 0x5C, 0x14, + 0x41, 0x03, 0xAF, 0x09, 0x75, 0x0A, 0xFD, 0x02, 0xC5, 0x1D, 0x4E, 0x0D, + 0x93, 0x1D, 0x37, 0x10, 0xCB, 0x0F, 0x9A, 0x0D, 0xF4, 0x0A, 0xE7, 0x0F, + 0x9B, 0x0E, 0x95, 0x0C, 0x14, 0x1A, 0x65, 0x10, 0x9F, 0x24, 0x86, 0x22, + 0x5E, 0x26, 0x20, 0x2E, 0x25, 0x25, 0xF4, 0x2B, 0xBD, 0x20, 0x98, 0x29, + 0xA8, 0x13, 0xCB, 0x22, 0x5D, 0x0A, 0x01, 0x1C, 0xA5, 0x14, 0x77, 0x22, + 0xB1, 0x26, 0x04, 0x27, 0x86, 0x27, 0x79, 0x1B, 0x69, 0x16, 0xDF, 0x0B, + 0x64, 0x0F, 0x1D, 0x0C, 0x76, 0x1B, 0x23, 0x16, 0x38, 0x20, 0x2A, 0x17, + 0xBC, 0x1B, 0xFB, 0x15, 0xED, 0x1D, 0x68, 0x1E, 0x67, 0x25, 0x35, 0x2C, + 0xA4, 0x26, 0x5D, 0x33, 0xD4, 0x1D, 0x95, 0x32, 0x56, 0x14, 0xA5, 0x28, + 0xA9, 0x17, 0xDF, 0x1B, 0xF4, 0x1D, 0x37, 0x0F, 0x9C, 0x17, 0xFF, 0x01, + 0x70, 0x0F, 0x96, 0xFD, 0xAA, 0x09, 0x74, 0xFD, 0xD0, 0x0C, 0x22, 0x03, + 0x08, 0x19, 0x8E, 0x0C, 0xE0, 0x1D, 0xA8, 0x0E, 0x0F, 0x1C, 0x25, 0x11, + 0x8E, 0x18, 0x93, 0x1C, 0x11, 0x12, 0x34, 0x29, 0x98, 0x05, 0xD2, 0x25, + 0xA8, 0x02, 0xA2, 0x22, 0x3C, 0x02, 0x8B, 0x1F, 0x4B, 0xFC, 0x5A, 0x12, + 0x13, 0xF7, 0x3E, 0x09, 0xE7, 0xF5, 0xC2, 0x0C, 0xDF, 0xF8, 0x15, 0x0A, + 0x2E, 0xFA, 0xD6, 0xF7, 0xBD, 0x02, 0x1B, 0xF4, 0x8F, 0x05, 0xF2, 0xF1, + 0x62, 0x09, 0x49, 0xF2, 0x01, 0x0B, 0xA7, 0xFB, 0x8D, 0x04, 0x7E, 0x03, + 0x12, 0x07, 0x45, 0x0D, 0xD9, 0x07, 0x83, 0x09, 0x87, 0x0D, 0x97, 0xFC, + 0x37, 0x1F, 0x9A, 0xF7, 0xE1, 0x1E, 0x63, 0xF4, 0x1A, 0x12, 0xB5, 0xF7, + 0x17, 0x0A, 0xF0, 0x06, 0x19, 0xF6, 0xF6, 0x07, 0xEF, 0xE6, 0x22, 0xFD, + 0xEB, 0xF1, 0x6F, 0xFB, 0xF3, 0x00, 0x21, 0x00, 0x9C, 0x0B, 0x64, 0x0A, + 0x12, 0x0E, 0xF2, 0x0B, 0xCE, 0x04, 0x8B, 0x04, 0xBC, 0xFE, 0xB7, 0xFE, + 0x8A, 0xFC, 0x01, 0xF6, 0x22, 0xFB, 0xD8, 0xEE, 0xC7, 0xFF, 0x66, 0xF5, + 0x33, 0xFB, 0xD9, 0xF6, 0x9E, 0xE9, 0xA7, 0xEC, 0x23, 0xDA, 0x83, 0xEA, + 0x32, 0xD7, 0xD2, 0xEC, 0xCD, 0xE2, 0xC7, 0xED, 0x18, 0xF4, 0x5C, 0xF0, + 0x0D, 0x00, 0x0C, 0xFA, 0xD6, 0x01, 0x56, 0x03, 0x8D, 0xFD, 0x21, 0x07, + 0xE2, 0xF8, 0xA2, 0x08, 0xC1, 0xF6, 0x51, 0x06, 0x4C, 0xF5, 0xD8, 0x03, + 0x04, 0xF5, 0xA7, 0x06, 0xD9, 0xF3, 0x6A, 0x07, 0x71, 0xEE, 0x8E, 0xFF, + 0x9D, 0xE6, 0x10, 0xF8, 0x0F, 0xE6, 0x75, 0xF5, 0x51, 0xE6, 0xBE, 0xEC, + 0x7A, 0xE0, 0xF9, 0xE1, 0x10, 0xE2, 0x9D, 0xE5, 0x80, 0xEF, 0x25, 0xF3, + 0xD6, 0xFB, 0xCB, 0xFC, 0x44, 0x00, 0xBF, 0xFB, 0x85, 0xFF, 0xF9, 0xF0, + 0xD5, 0xF8, 0x78, 0xEA, 0x15, 0xEB, 0x65, 0xEA, 0x48, 0xE0, 0xF5, 0xEA, + 0x0A, 0xDF, 0x87, 0xEB, 0xBE, 0xE0, 0x07, 0xE7, 0x9F, 0xEA, 0xF7, 0xE3, + 0x7B, 0xF1, 0xCA, 0xDD, 0x91, 0xE9, 0x65, 0xD3, 0x90, 0xEC, 0x1B, 0xD8, + 0xF9, 0xFA, 0xFB, 0xEB, 0x7B, 0x00, 0x6A, 0xF7, 0xE7, 0x05, 0x47, 0xF7, + 0x08, 0x07, 0x5B, 0xEE, 0x30, 0xF9, 0x14, 0xE2, 0x70, 0xEC, 0x20, 0xDF, + 0xC6, 0xED, 0x59, 0xE0, 0x74, 0xF1, 0xAC, 0xDE, 0x0F, 0xEF, 0x69, 0xDC, + 0xA6, 0xEB, 0x03, 0xDB, 0x0F, 0xE4, 0x2A, 0xD4, 0x3B, 0xE1, 0x5D, 0xD4, + 0xBD, 0xE0, 0xE7, 0xDE, 0xF7, 0xE1, 0x5B, 0xE9, 0x45, 0xEB, 0xEB, 0xF1, + 0xEA, 0xF3, 0x57, 0xF3, 0xF4, 0xF2, 0x3E, 0xED, 0xF9, 0xE7, 0xF4, 0xEB, + 0x68, 0xDB, 0x72, 0xF1, 0x14, 0xD7, 0x31, 0xF3, 0x3C, 0xE2, 0xD5, 0xF3, + 0xC9, 0xE3, 0xF3, 0xEE, 0x3E, 0xD7, 0xC4, 0xE6, 0x70, 0xD4, 0x6E, 0xE4, + 0xD0, 0xD5, 0xB7, 0xE2, 0x33, 0xDD, 0x8E, 0xE5, 0xE6, 0xED, 0x9E, 0xF0, + 0x47, 0xFC, 0xCC, 0xF8, 0x40, 0x07, 0xF4, 0xFD, 0x4F, 0x0A, 0xEE, 0x03, + 0x43, 0x01, 0xE5, 0x08, 0x3A, 0xFC, 0xBC, 0x11, 0x5A, 0xFF, 0x07, 0x14, + 0xDF, 0xFD, 0x68, 0x0C, 0x17, 0x00, 0xF2, 0x06, 0xC1, 0x05, 0x2C, 0xFD, + 0x64, 0xFF, 0xD0, 0xED, 0x64, 0xF5, 0x6C, 0xEC, 0x6D, 0xEE, 0xB0, 0xF2, + 0x7F, 0xEC, 0x8C, 0xF0, 0x4E, 0xFA, 0x95, 0xF2, 0x35, 0x0F, 0xA1, 0xF9, + 0xAB, 0x14, 0x09, 0xF9, 0x5D, 0x0B, 0xC8, 0xFB, 0x74, 0x01, 0x12, 0x03, + 0xD7, 0xF7, 0xDA, 0xFA, 0x15, 0xF5, 0xA0, 0xEF, 0xC7, 0xF1, 0x60, 0xED, + 0x73, 0xEC, 0xB0, 0xED, 0xCE, 0xEF, 0x46, 0xEE, 0xA3, 0xEB, 0x02, 0xEB, + 0x5D, 0xE1, 0x76, 0xE6, 0x61, 0xE7, 0xA3, 0xE8, 0x46, 0xFD, 0x69, 0xF2, + 0xF5, 0x14, 0xD9, 0xFA, 0x7A, 0x23, 0xC0, 0xFA, 0xD3, 0x23, 0x18, 0xFC, + 0x93, 0x13, 0xF7, 0x01, 0x6B, 0x00, 0x97, 0x04, 0xFF, 0xFA, 0x32, 0x0A, + 0xA9, 0xFF, 0x3E, 0x13, 0xAD, 0xFE, 0x91, 0x0F, 0x39, 0xF3, 0x17, 0x09, + 0xDE, 0xEC, 0xAB, 0x11, 0x46, 0xF0, 0x8F, 0x16, 0x05, 0xF8, 0x8A, 0x11, + 0x12, 0x01, 0x35, 0x12, 0x41, 0x13, 0x2C, 0x1D, 0xB3, 0x21, 0x98, 0x21, + 0x2D, 0x1C, 0x76, 0x1C, 0x06, 0x18, 0x59, 0x1C, 0x26, 0x16, 0x75, 0x1D, + 0x4D, 0x0E, 0x62, 0x1D, 0x5B, 0x0E, 0x5F, 0x1A, 0x39, 0x1A, 0xAF, 0x0E, + 0xEE, 0x1B, 0x79, 0x01, 0x6B, 0x0E, 0x04, 0x02, 0x8C, 0xFD, 0x0A, 0x0A, + 0xD1, 0xF2, 0x09, 0x0C, 0x3B, 0xFD, 0x08, 0x0D, 0x54, 0x1A, 0xF9, 0x0F, + 0xB6, 0x30, 0xBF, 0x10, 0x1B, 0x37, 0x24, 0x16, 0xA0, 0x35, 0xA7, 0x1D, + 0xEC, 0x29, 0x23, 0x1E, 0x40, 0x18, 0x33, 0x1E, 0x10, 0x10, 0x57, 0x24, + 0x64, 0x10, 0xE3, 0x25, 0x16, 0x0F, 0x77, 0x23, 0x05, 0x0C, 0x0A, 0x27, + 0xFA, 0x0B, 0x26, 0x26, 0xB0, 0x0E, 0xA4, 0x22, 0x40, 0x0F, 0x02, 0x20, + 0x3E, 0x0E, 0x87, 0x18, 0x6E, 0x16, 0xE2, 0x17, 0x51, 0x24, 0x19, 0x24, + 0xD2, 0x2C, 0x96, 0x2C, 0x97, 0x2F, 0x80, 0x2A, 0x6B, 0x26, 0x15, 0x24, + 0x59, 0x16, 0x67, 0x18, 0x2D, 0x0F, 0x00, 0x13, 0xE7, 0x0F, 0x00, 0x17, + 0x80, 0x17, 0x14, 0x1A, 0x45, 0x21, 0x49, 0x17, 0x5F, 0x28, 0xD1, 0x0F, + 0xA9, 0x30, 0x52, 0x08, 0x42, 0x3C, 0x8D, 0x04, 0xCB, 0x3F, 0xD0, 0x06, + 0xC3, 0x38, 0x7C, 0x09, 0xF5, 0x3A, 0xA6, 0x0F, 0xF8, 0x40, 0xDB, 0x1A, + 0x8A, 0x35, 0x3C, 0x1C, 0x63, 0x1E, 0x5A, 0x17, 0x82, 0x10, 0x4B, 0x18, + 0x70, 0x09, 0xA4, 0x19, 0xA7, 0x04, 0x2E, 0x15, 0x74, 0x05, 0xAF, 0x13, + 0xAB, 0x05, 0x86, 0x15, 0x48, 0x0C, 0x5F, 0x1C, 0x2E, 0x14, 0x5E, 0x24, + 0x2B, 0x18, 0x1F, 0x27, 0x26, 0x19, 0xA3, 0x27, 0xA8, 0x10, 0xA0, 0x1F, + 0xCA, 0x08, 0x5C, 0x17, 0x32, 0x05, 0x09, 0x19, 0x51, 0x00, 0x1A, 0x19, + 0xDD, 0x03, 0x4F, 0x0F, 0x68, 0x0A, 0xBD, 0x04, 0x35, 0xF8, 0xB8, 0xFA, + 0x91, 0xE0, 0xF8, 0xF4, 0x84, 0xDF, 0xBB, 0xF4, 0x60, 0xE6, 0x25, 0xF0, + 0x06, 0xEA, 0x4D, 0xEB, 0x5C, 0xEB, 0x43, 0xE6, 0xC1, 0xF1, 0xED, 0xDF, + 0xEE, 0xFA, 0xE6, 0xDA, 0xE0, 0xF9, 0xCD, 0xDD, 0x98, 0xEF, 0x52, 0xEB, + 0x60, 0xE8, 0x22, 0xF8, 0xBE, 0xE6, 0xB4, 0xF6, 0x0C, 0xE5, 0xEE, 0xEA, + 0xEF, 0xDF, 0x29, 0xE3, 0x7A, 0xD9, 0x16, 0xDF, 0xBB, 0xD6, 0x9D, 0xDC, + 0x99, 0xD4, 0x29, 0xD8, 0xC5, 0xD1, 0x3D, 0xD4, 0x61, 0xD0, 0xEE, 0xD5, + 0x67, 0xCF, 0x9B, 0xD8, 0xE8, 0xCF, 0xB4, 0xD9, 0x6F, 0xD3, 0xFA, 0xD6, + 0xE7, 0xD8, 0x60, 0xD5, 0x0A, 0xDC, 0x2B, 0xD7, 0xFF, 0xD6, 0xB0, 0xD8, + 0x35, 0xC9, 0xA9, 0xD8, 0xAD, 0xBA, 0x2F, 0xD7, 0x07, 0xBB, 0xD9, 0xD4, + 0x3E, 0xC6, 0x0C, 0xD0, 0x30, 0xCD, 0x38, 0xCE, 0xD7, 0xD4, 0xAD, 0xCE, + 0xAF, 0xE0, 0x45, 0xCE, 0x23, 0xE9, 0x91, 0xCC, 0x55, 0xEF, 0xE7, 0xCC, + 0x9D, 0xF7, 0x6B, 0xD6, 0x20, 0xFE, 0x46, 0xE3, 0xBF, 0x03, 0x1D, 0xE8, + 0x67, 0x09, 0x88, 0xE9, 0x3A, 0x03, 0xB3, 0xEF, 0xE9, 0xF6, 0x95, 0xF8, + 0x31, 0xF2, 0x60, 0xFC, 0xE1, 0xED, 0x3E, 0xF4, 0xF7, 0xE9, 0xE4, 0xEE, + 0x52, 0xEC, 0xD4, 0xF4, 0xB7, 0xEE, 0x85, 0xFB, 0x53, 0xEE, 0x5C, 0xFC, + 0x9B, 0xF6, 0x22, 0xFD, 0xE6, 0x06, 0x79, 0x01, 0x2B, 0x0C, 0x5A, 0x02, + 0x88, 0x06, 0x5A, 0x01, 0x98, 0x00, 0x25, 0x04, 0x0D, 0xFF, 0x15, 0x09, + 0x68, 0xFF, 0x43, 0x08, 0x17, 0x01, 0x5E, 0x04, 0x2A, 0x08, 0x4D, 0x03, + 0x21, 0x0A, 0x59, 0xFF, 0xB7, 0x04, 0x90, 0xFA, 0x93, 0xFE, 0x42, 0xF7, + 0x66, 0xF9, 0x27, 0xF0, 0x97, 0xFA, 0xCD, 0xEA, 0x70, 0x01, 0xFD, 0xEC, + 0x10, 0x07, 0xAD, 0xF5, 0x60, 0x05, 0xD3, 0xFB, 0x14, 0x03, 0x4E, 0x01, + 0xDF, 0xFF, 0x38, 0x05, 0xFE, 0xF6, 0x20, 0x01, 0xFA, 0xF4, 0x1C, 0x00, + 0x97, 0xFF, 0xA2, 0x07, 0x14, 0x10, 0x1C, 0x11, 0x76, 0x16, 0xA1, 0x14, + 0x26, 0x13, 0x7B, 0x13, 0x40, 0x0F, 0xD3, 0x12, 0xDD, 0x06, 0xD8, 0x0D, + 0x45, 0x04, 0x37, 0x08, 0x4B, 0x0B, 0xC5, 0x0B, 0x9F, 0x11, 0x2B, 0x14, + 0x1C, 0x16, 0x85, 0x1A, 0x22, 0x18, 0xF7, 0x1D, 0x30, 0x13, 0x38, 0x20, + 0x10, 0x07, 0xA1, 0x1F, 0x78, 0xFC, 0xD9, 0x1F, 0x7C, 0xFC, 0x80, 0x24, + 0xC2, 0x0A, 0x62, 0x29, 0x3F, 0x1A, 0x7B, 0x26, 0x0E, 0x20, 0xF0, 0x20, + 0x77, 0x1A, 0x13, 0x22, 0x55, 0x0D, 0xA1, 0x1C, 0x7C, 0x0A, 0xB3, 0x16, + 0x1A, 0x11, 0x31, 0x1D, 0xBF, 0x1A, 0xDB, 0x25, 0x9E, 0x29, 0x1B, 0x26, + 0x6E, 0x31, 0x15, 0x1F, 0x60, 0x2F, 0x43, 0x1A, 0x29, 0x25, 0x5D, 0x18, + 0x0E, 0x19, 0xE6, 0x15, 0x19, 0x14, 0x4E, 0x10, 0xA7, 0x15, 0x82, 0x0C, + 0x69, 0x1C, 0x46, 0x0F, 0xAA, 0x19, 0x7B, 0x0A, 0x91, 0x0E, 0x70, 0x03, + 0x1E, 0x07, 0xD7, 0x03, 0x90, 0x04, 0xCE, 0x00, 0x8B, 0x08, 0x9C, 0x03, + 0xCB, 0x09, 0xBC, 0x0E, 0x57, 0x04, 0x34, 0x14, 0xD8, 0x04, 0xF6, 0x0D, + 0x53, 0x0C, 0x34, 0xFF, 0x2C, 0x0C, 0x74, 0xF5, 0x7B, 0x04, 0x82, 0xF5, + 0xBA, 0xFF, 0xF9, 0xF5, 0xA3, 0x08, 0x92, 0xF7, 0x8B, 0x16, 0xEF, 0xFC, + 0x1E, 0x14, 0xB2, 0x00, 0x44, 0x03, 0xA5, 0x01, 0x4F, 0xFA, 0xC3, 0xFF, + 0x12, 0xFC, 0x35, 0xFA, 0x2E, 0xF6, 0x2A, 0xFA, 0xB5, 0xEC, 0x50, 0x04, + 0xEA, 0xEA, 0xD1, 0x06, 0x02, 0xEC, 0x67, 0xFF, 0xF1, 0xEA, 0xED, 0xFC, + 0x49, 0xEA, 0x51, 0xFE, 0x26, 0xEB, 0x81, 0x01, 0xA9, 0xE9, 0xED, 0x06, + 0xE2, 0xE4, 0xA0, 0x00, 0xA8, 0xE2, 0x3D, 0xF2, 0xD8, 0xE9, 0xC2, 0xEB, + 0x35, 0xF1, 0x01, 0xEA, 0xE1, 0xEE, 0x00, 0xEB, 0x38, 0xF0, 0x84, 0xF0, + 0x72, 0xFD, 0xD7, 0xEF, 0xA2, 0x08, 0x5D, 0xE5, 0x26, 0x05, 0x65, 0xE1, + 0x24, 0xF1, 0x80, 0xE3, 0x4F, 0xDD, 0xD2, 0xE0, 0x5E, 0xDC, 0xCB, 0xD9, + 0xED, 0xDE, 0xC1, 0xD5, 0x5D, 0xDE, 0xFA, 0xD9, 0xF1, 0xE2, 0x0A, 0xDB, + 0xEE, 0xE7, 0xDF, 0xD1, 0xF9, 0xEA, 0x21, 0xCA, 0xCE, 0xEA, 0x61, 0xCA, + 0x07, 0xEA, 0xA7, 0xCE, 0xC9, 0xE6, 0xB6, 0xD2, 0x1E, 0xE3, 0x27, 0xD9, + 0x7A, 0xE4, 0x1F, 0xDF, 0x00, 0xED, 0xC2, 0xE5, 0x86, 0xF1, 0xA4, 0xF5, + 0x19, 0xE6, 0x30, 0xFE, 0xA7, 0xDA, 0x12, 0xF7, 0xAE, 0xDF, 0x3D, 0xF1, + 0x2F, 0xEB, 0xF8, 0xEE, 0xC8, 0xE9, 0xDE, 0xED, 0x3B, 0xE2, 0x6C, 0xF0, + 0x8D, 0xDF, 0x03, 0xEB, 0x4E, 0xE9, 0xEB, 0xE6, 0x35, 0xF5, 0xD3, 0xE8, + 0x22, 0xF5, 0xC7, 0xE9, 0xFA, 0xF4, 0x9E, 0xF7, 0x9F, 0xF3, 0x5C, 0xFC, + 0x59, 0xF7, 0x19, 0xF1, 0x9E, 0xFD, 0x24, 0xED, 0x3E, 0xF5, 0xAC, 0xE9, + 0x32, 0xEB, 0x60, 0xEB, 0xC5, 0xE5, 0xA6, 0xF6, 0xFB, 0xE3, 0x73, 0xFE, + 0xC4, 0xE9, 0x51, 0x02, 0x67, 0xF0, 0xF2, 0xFF, 0x33, 0xFB, 0xA5, 0xF7, + 0x1A, 0x07, 0x26, 0xEF, 0xD8, 0x05, 0x52, 0xEB, 0x53, 0xFF, 0xB4, 0xF0, + 0x64, 0xFC, 0x80, 0xFC, 0x86, 0xF8, 0xFE, 0x06, 0x40, 0xF5, 0x27, 0x0E, + 0x89, 0xF7, 0xD2, 0x16, 0xB2, 0xF9, 0xA4, 0x19, 0x91, 0xFD, 0x3F, 0x19, + 0xE4, 0x02, 0x7D, 0x19, 0x90, 0xFF, 0xE8, 0x12, 0x7D, 0x00, 0x7C, 0x0D, + 0xFB, 0x06, 0x20, 0x0F, 0x5D, 0x08, 0x2A, 0x12, 0xF1, 0x08, 0xB7, 0x14, + 0x16, 0x0F, 0xEE, 0x14, 0xF7, 0x1C, 0x4A, 0x0D, 0x31, 0x28, 0x49, 0x00, + 0xDA, 0x24, 0xE9, 0xFD, 0xDA, 0x18, 0x16, 0x09, 0xE8, 0x12, 0x03, 0x12, + 0xED, 0x16, 0x49, 0x14, 0x7C, 0x1D, 0xA9, 0x14, 0xD0, 0x19, 0x8B, 0x11, + 0x0F, 0x0D, 0x56, 0x0E, 0xA2, 0x06, 0xA8, 0x0E, 0xE9, 0x0B, 0x2E, 0x0E, + 0x06, 0x1B, 0xF6, 0x0E, 0x8E, 0x2D, 0xD8, 0x14, 0x43, 0x38, 0x3F, 0x19, + 0x16, 0x39, 0x47, 0x15, 0x47, 0x35, 0x82, 0x12, 0x4F, 0x2D, 0xEF, 0x15, + 0xB9, 0x1E, 0x14, 0x19, 0x03, 0x13, 0xAF, 0x1E, 0x94, 0x11, 0x89, 0x1F, + 0xC3, 0x12, 0x4F, 0x1A, 0x0E, 0x16, 0x99, 0x22, 0xA5, 0x19, 0x50, 0x2B, + 0xEB, 0x17, 0xB3, 0x20, 0x04, 0x19, 0xB1, 0x1D, 0x93, 0x1E, 0x21, 0x24, + 0xF6, 0x22, 0x6F, 0x27, 0xEA, 0x26, 0x4E, 0x2B, 0x4A, 0x25, 0xE1, 0x21, + 0xCD, 0x20, 0x0B, 0x15, 0x3A, 0x19, 0x2E, 0x0F, 0xBB, 0x0F, 0xD8, 0x0C, + 0x0C, 0x09, 0x3D, 0x11, 0x7A, 0x04, 0x15, 0x16, 0xDC, 0x06, 0xA0, 0x15, + 0x01, 0x0C, 0xAE, 0x11, 0xE8, 0x12, 0x53, 0x0C, 0x6C, 0x1C, 0x83, 0x0D, + 0xB5, 0x19, 0xC5, 0x14, 0x03, 0x13, 0xB4, 0x19, 0x72, 0x1A, 0x78, 0x19, + 0x40, 0x23, 0x39, 0x13, 0xFD, 0x1E, 0xBD, 0x0B, 0xDA, 0x13, 0x94, 0x0E, + 0xE9, 0x0C, 0x8E, 0x16, 0xEC, 0x06, 0xCF, 0x17, 0xE6, 0x02, 0xAE, 0x1E, + 0xB8, 0xFC, 0x23, 0x27, 0x83, 0xF9, 0x0E, 0x23, 0xC5, 0x02, 0x39, 0x1E, + 0x38, 0x09, 0xA3, 0x1A, 0x18, 0x0B, 0x9D, 0x17, 0x7E, 0x10, 0x98, 0x19, + 0x1B, 0x12, 0xDA, 0x11, 0xE6, 0x13, 0xC8, 0x07, 0x8D, 0x1B, 0x6B, 0x0B, + 0xAE, 0x17, 0x07, 0x12, 0x89, 0x12, 0x41, 0x17, 0x2B, 0x0F, 0x5E, 0x1B, + 0x46, 0x0A, 0x42, 0x21, 0x14, 0x06, 0x1F, 0x1D, 0xC2, 0x02, 0x39, 0x0C, + 0x79, 0x03, 0x43, 0x01, 0x31, 0x03, 0xE8, 0xFE, 0x9E, 0x11, 0x8B, 0x01, + 0x23, 0x2A, 0x85, 0x06, 0xEB, 0x3F, 0xF0, 0x0C, 0x54, 0x4C, 0xF8, 0x14, + 0x4E, 0x4E, 0xC6, 0x1C, 0x16, 0x44, 0x6C, 0x1C, 0x83, 0x3D, 0x1C, 0x20, + 0xE0, 0x39, 0xFE, 0x29, 0xC7, 0x31, 0xB5, 0x35, 0x26, 0x39, 0x2A, 0x49, + 0x3B, 0x36, 0x1C, 0x4D, 0x2E, 0x28, 0xBC, 0x42, 0x2F, 0x28, 0x13, 0x3A, + 0x85, 0x29, 0x7B, 0x2C, 0x87, 0x27, 0x22, 0x20, 0xDE, 0x24, 0x2D, 0x1A, + 0x2C, 0x16, 0x34, 0x0D, 0xB4, 0x1F, 0x60, 0x1B, 0x70, 0x3A, 0xB9, 0x3B, + 0x96, 0x21, 0x22, 0x2D, 0xEE, 0x0E, 0xAA, 0x20, 0xC7, 0x20, 0x6F, 0x2F, + 0x7E, 0x0A, 0x9F, 0x1B, 0xCE, 0xDD, 0x9E, 0xF8, 0xF9, 0xC0, 0x9F, 0xE7, + 0x2D, 0xD5, 0x6B, 0xF9, 0x39, 0xFF, 0x9C, 0x0F, 0x24, 0xE5, 0x63, 0xE6, + 0x08, 0xD5, 0x53, 0xD6, 0x30, 0xE6, 0x41, 0xE9, 0xDC, 0xC8, 0x00, 0xC5, + 0xFA, 0xB2, 0x09, 0xA8, 0x1A, 0xCD, 0xBF, 0xBD, 0xA9, 0xD5, 0x1A, 0xC9, + 0xAE, 0xC1, 0x10, 0xB6, 0x4D, 0xC3, 0xEA, 0xBA, 0x0F, 0xC4, 0x7E, 0xC1, + 0x0A, 0xAA, 0xC2, 0xA7, 0x61, 0xA4, 0x0D, 0xA4, 0xAD, 0xAE, 0x55, 0xB4, + 0xFB, 0xAA, 0x0B, 0xAF, 0x76, 0xB0, 0xFA, 0xA5, 0x04, 0xC9, 0x6A, 0xBB, + 0x57, 0xCA, 0x23, 0xC2, 0xF3, 0xB1, 0x38, 0xA8, 0x05, 0xB7, 0x84, 0xA7, + 0xE7, 0xC3, 0xFD, 0xB9, 0x54, 0xB9, 0x78, 0xBA, 0xA9, 0xA3, 0xD8, 0xA9, + 0x21, 0xA4, 0xC4, 0xAE, 0x86, 0xB4, 0x80, 0xBD, 0x66, 0xAE, 0xC5, 0xB0, + 0x11, 0xA3, 0x01, 0xA2, 0xF1, 0xA2, 0xD9, 0xA5, 0x4A, 0xAB, 0x23, 0xB1, + 0x50, 0xB3, 0xC6, 0xB4, 0xAD, 0xBD, 0x72, 0xB4, 0x28, 0xCA, 0xC9, 0xB5, + 0xFB, 0xCE, 0x92, 0xB9, 0xF1, 0xCF, 0x82, 0xC1, 0xC6, 0xD0, 0xEE, 0xC9, + 0x67, 0xD2, 0x9A, 0xCF, 0x8D, 0xD2, 0x2B, 0xD6, 0xB0, 0xC7, 0x2D, 0xD9, + 0x46, 0xBB, 0x48, 0xD3, 0x73, 0xB9, 0x5D, 0xC6, 0x0A, 0xBF, 0x04, 0xBA, + 0x00, 0xBB, 0x3D, 0xB4, 0x24, 0xBC, 0x3D, 0xC0, 0xBC, 0xD6, 0x03, 0xE1, + 0x4A, 0xEF, 0x64, 0xF4, 0x81, 0x05, 0x90, 0x00, 0x5F, 0x14, 0x00, 0x0F, + 0x0A, 0x18, 0x56, 0x18, 0xF7, 0x0D, 0xEE, 0x11, 0x56, 0xFF, 0x55, 0x00, + 0x8E, 0xF8, 0x7D, 0xFE, 0xD0, 0xF5, 0x87, 0x07, 0x5C, 0xFE, 0x21, 0x12, + 0x18, 0x06, 0x7A, 0x0C, 0x7E, 0x0A, 0x41, 0x03, 0x38, 0x17, 0xC4, 0x0E, + 0x9C, 0x18, 0x64, 0x12, 0xC3, 0x14, 0xE6, 0x11, 0xA7, 0x23, 0xC5, 0x1C, + 0x65, 0x2C, 0x5B, 0x1D, 0xCB, 0x32, 0x9A, 0x24, 0xDE, 0x32, 0xA6, 0x31, + 0x7D, 0x2C, 0xB2, 0x32, 0xD5, 0x2E, 0xBB, 0x34, 0xCC, 0x32, 0x40, 0x3F, + 0xE1, 0x2F, 0x29, 0x41, 0x9C, 0x2D, 0xCE, 0x36, 0x64, 0x38, 0x76, 0x35, + 0x4A, 0x46, 0x0C, 0x41, 0xF3, 0x4A, 0x7C, 0x42, 0x29, 0x44, 0x26, 0x33, + 0x53, 0x44, 0xBB, 0x35, 0x77, 0x45, 0xAB, 0x45, 0x6A, 0x3F, 0xDF, 0x46, + 0x3C, 0x45, 0x4B, 0x44, 0xEC, 0x4B, 0xD4, 0x47, 0xAE, 0x46, 0x23, 0x4F, + 0x88, 0x42, 0x0E, 0x56, 0xF4, 0x4A, 0x03, 0x5A, 0xB7, 0x57, 0x0E, 0x5B, + 0x17, 0x52, 0x4C, 0x53, 0xB2, 0x4A, 0x8C, 0x52, 0x49, 0x49, 0x27, 0x58, + 0x91, 0x48, 0xAF, 0x54, 0x96, 0x50, 0x37, 0x54, 0x13, 0x58, 0xA0, 0x58, + 0x7F, 0x5A, 0xD9, 0x59, 0x15, 0x5B, 0x4F, 0x51, 0x11, 0x62, 0xE4, 0x4D, + 0x17, 0x62, 0xB3, 0x54, 0x48, 0x51, 0xD9, 0x4D, 0x50, 0x48, 0x6F, 0x41, + 0xDA, 0x4B, 0x2E, 0x3B, 0x48, 0x49, 0x94, 0x35, 0x80, 0x49, 0x0C, 0x32, + 0x1A, 0x4E, 0x0E, 0x32, 0x2A, 0x4C, 0x60, 0x39, 0xA8, 0x4A, 0x43, 0x47, + 0xDF, 0x4F, 0x8C, 0x50, 0x23, 0x5B, 0xAF, 0x55, 0x82, 0x5B, 0x9A, 0x57, + 0xA8, 0x52, 0xA1, 0x53, 0x97, 0x47, 0x6D, 0x45, 0xED, 0x43, 0x5D, 0x3B, + 0x4C, 0x3D, 0x9D, 0x3A, 0x96, 0x29, 0x1F, 0x35, 0x32, 0x21, 0x41, 0x2E, + 0x11, 0x2D, 0x9D, 0x2C, 0x3E, 0x36, 0x9D, 0x2A, 0xCD, 0x3B, 0x3D, 0x31, + 0x4B, 0x41, 0x0D, 0x3B, 0x8B, 0x3A, 0x62, 0x38, 0xBB, 0x30, 0xE0, 0x31, + 0xF6, 0x31, 0xAA, 0x32, 0x46, 0x2E, 0xDF, 0x2D, 0x99, 0x1D, 0xDE, 0x21, + 0x33, 0x18, 0x99, 0x25, 0x8A, 0x12, 0xA2, 0x28, 0x1B, 0x0A, 0x53, 0x26, + 0x2D, 0x0D, 0xB8, 0x26, 0x19, 0x10, 0xF4, 0x21, 0x3B, 0x10, 0xF8, 0x23, + 0x77, 0x12, 0x22, 0x2C, 0xB1, 0x1B, 0x11, 0x2E, 0xE0, 0x22, 0xC2, 0x22, + 0x32, 0x21, 0xAC, 0x15, 0xC4, 0x2B, 0x42, 0x1D, 0x39, 0x31, 0xBA, 0x25, + 0x26, 0x1B, 0x02, 0x1A, 0xD4, 0x06, 0xEC, 0x0F, 0xE5, 0x05, 0x33, 0x0E, + 0x87, 0x07, 0x7B, 0x02, 0xE4, 0x01, 0x3B, 0xF2, 0x13, 0xFD, 0x4B, 0xEE, + 0x38, 0x06, 0xEB, 0x00, 0x90, 0x0F, 0x51, 0x0D, 0x62, 0x06, 0xB2, 0xFC, + 0x87, 0x01, 0xD1, 0xEA, 0xCB, 0x03, 0xF6, 0xDE, 0xEB, 0x08, 0x28, 0xE1, + 0x68, 0x07, 0xC2, 0xEE, 0xE7, 0xF2, 0x13, 0xEF, 0x85, 0xEF, 0x38, 0xEF, + 0x5F, 0x00, 0xD4, 0xF4, 0xBB, 0xFF, 0x4E, 0xEC, 0x43, 0xF4, 0xD9, 0xE5, + 0xB0, 0xEB, 0x20, 0xEC, 0x3A, 0xE4, 0x1C, 0xF1, 0x88, 0xDE, 0xD8, 0xF0, + 0xAF, 0xD5, 0x41, 0xE8, 0x02, 0xCF, 0xD8, 0xDF, 0xE6, 0xCD, 0xF8, 0xDA, + 0xFD, 0xD4, 0xC2, 0xDF, 0x35, 0xD8, 0xDF, 0xE3, 0xC4, 0xD4, 0x7C, 0xDD, + 0x91, 0xD7, 0x62, 0xDA, 0xDE, 0xD3, 0xD3, 0xD2, 0x81, 0xC6, 0xA0, 0xC7, + 0xF0, 0xBD, 0xD8, 0xC3, 0x61, 0xC1, 0x41, 0xC5, 0x59, 0xC8, 0x40, 0xC1, + 0x3D, 0xCF, 0xB2, 0xBE, 0xCB, 0xD4, 0x07, 0xC5, 0x49, 0xD3, 0x95, 0xC4, + 0xEA, 0xD3, 0x8A, 0xC3, 0x12, 0xD4, 0x5E, 0xC6, 0x2D, 0xCE, 0x83, 0xC7, + 0x1A, 0xD0, 0xC5, 0xCF, 0x95, 0xD4, 0xDE, 0xD4, 0xEA, 0xDA, 0x30, 0xD5, + 0xB7, 0xE1, 0x7A, 0xD7, 0x9D, 0xDB, 0xF8, 0xD7, 0xE7, 0xD7, 0xA0, 0xDD, + 0xFB, 0xD7, 0xBD, 0xE0, 0x66, 0xD3, 0xD2, 0xE2, 0x3C, 0xDB, 0xE7, 0xF1, + 0x45, 0xEC, 0xD2, 0xFF, 0x05, 0xF3, 0xC5, 0xFE, 0x98, 0xEA, 0x5E, 0xF7, + 0x2A, 0xE0, 0x43, 0xF5, 0x5D, 0xE5, 0x99, 0x04, 0xCF, 0xF0, 0xD8, 0x16, + 0x0E, 0xFC, 0xB8, 0x19, 0x35, 0x01, 0x1B, 0x0F, 0xF1, 0xFC, 0x97, 0x02, + 0xC7, 0xFE, 0xE6, 0x02, 0x25, 0xFD, 0xAF, 0x00, 0x56, 0xF9, 0x6A, 0xFF, + 0x1E, 0xFD, 0x32, 0x03, 0x10, 0x06, 0xED, 0xFE, 0x6C, 0x17, 0x50, 0xFE, + 0xE5, 0x1D, 0xC2, 0xFC, 0xAF, 0x12, 0x25, 0xF8, 0x08, 0x0C, 0xDE, 0xFD, + 0x3A, 0x15, 0xF7, 0x06, 0xDA, 0x25, 0xA8, 0x0D, 0x11, 0x2D, 0x1D, 0x15, + 0x97, 0x27, 0xC9, 0x19, 0x33, 0x2B, 0xE8, 0x19, 0x6A, 0x2F, 0x79, 0x14, + 0xB1, 0x26, 0xE8, 0x17, 0x0C, 0x19, 0xCA, 0x22, 0x34, 0x10, 0xC3, 0x23, + 0x69, 0x16, 0x6F, 0x23, 0x30, 0x14, 0xD6, 0x1C, 0x39, 0x0D, 0x5D, 0x16, + 0x34, 0x09, 0x6C, 0x13, 0x57, 0x09, 0x7C, 0x14, 0x06, 0x16, 0xB9, 0x1F, + 0x2E, 0x1D, 0xA5, 0x24, 0x77, 0x1F, 0xD3, 0x27, 0xAA, 0x18, 0xE0, 0x24, + 0x15, 0x0D, 0x36, 0x18, 0xF3, 0x0C, 0x29, 0x13, 0x7C, 0x0F, 0xCD, 0x13, + 0x25, 0x0E, 0x8B, 0x12, 0x48, 0x0E, 0x84, 0x13, 0xA2, 0x0E, 0x89, 0x15, + 0xA8, 0x08, 0x5C, 0x0C, 0xC7, 0x03, 0x06, 0xFF, 0x06, 0x04, 0xE4, 0xFB, + 0xE6, 0x03, 0x3B, 0xFF, 0x62, 0x07, 0x69, 0x00, 0x23, 0x09, 0x0C, 0x00, + 0x12, 0x06, 0x0A, 0x04, 0x84, 0xFA, 0xBC, 0x01, 0x02, 0xEF, 0xD4, 0xF9, + 0xB4, 0xE8, 0x0C, 0xF4, 0x13, 0xE6, 0x36, 0xF3, 0x82, 0xE8, 0x6B, 0xFB, + 0xA0, 0xE6, 0x47, 0x07, 0x1C, 0xDF, 0x92, 0x09, 0x60, 0xD0, 0x98, 0xF8, + 0xDC, 0xCD, 0xF9, 0xEC, 0xD6, 0xD8, 0x8C, 0xEA, 0xF4, 0xDC, 0x3B, 0xE4, + 0x5D, 0xDB, 0xF1, 0xE6, 0xCC, 0xCD, 0x62, 0xE6, 0x68, 0xC0, 0xC8, 0xD7, + 0x20, 0xCA, 0xBA, 0xD3, 0xA9, 0xD3, 0x00, 0xD3, 0xCE, 0xD3, 0x82, 0xCB, + 0x87, 0xD4, 0xA9, 0xC6, 0x33, 0xDF, 0xCD, 0xD0, 0xC8, 0xE1, 0x6C, 0xD9, + 0x42, 0xD0, 0x25, 0xCD, 0xF4, 0xC7, 0xC3, 0xC2, 0x09, 0xCD, 0xDA, 0xBC, + 0xA1, 0xDC, 0xA0, 0xBE, 0xDB, 0xE7, 0xED, 0xC0, 0x53, 0xEB, 0x61, 0xBD, + 0x8F, 0xE7, 0xF0, 0xBD, 0xD9, 0xD6, 0x60, 0xBF, 0x08, 0xD8, 0x14, 0xD1, + 0xDA, 0xDE, 0xE3, 0xDD, 0x46, 0xCF, 0x37, 0xD3, 0x3F, 0xC6, 0xB0, 0xD1, + 0xA7, 0xC6, 0x79, 0xD5, 0x87, 0xBB, 0x93, 0xD0, 0x87, 0xB4, 0x15, 0xD0, + 0x8E, 0xB7, 0x57, 0xD2, 0x7C, 0xB9, 0x2C, 0xD2, 0xB8, 0xC3, 0x93, 0xDD, + 0xC7, 0xD2, 0x9F, 0xEC, 0x9C, 0xD4, 0x17, 0xEB, 0x4B, 0xD0, 0x2D, 0xE4, + 0xC6, 0xD2, 0x7B, 0xDE, 0x03, 0xD4, 0x0D, 0xD4, 0xAE, 0xD7, 0xAD, 0xD3, + 0xA9, 0xD9, 0x48, 0xD8, 0x99, 0xC7, 0x10, 0xCE, 0xA6, 0xB8, 0x66, 0xC9, + 0x64, 0xB0, 0x7B, 0xCA, 0x81, 0xAA, 0x07, 0xC5, 0x25, 0xB3, 0x19, 0xC8, + 0x02, 0xC5, 0x5B, 0xD1, 0x68, 0xD0, 0x40, 0xD0, 0xF0, 0xD1, 0x94, 0xC7, + 0x9F, 0xCE, 0x96, 0xC2, 0x7B, 0xC4, 0xB0, 0xC0, 0xB0, 0xBD, 0x96, 0xC1, + 0x4C, 0xC8, 0x58, 0xCB, 0xC6, 0xD8, 0x4B, 0xD4, 0x67, 0xDD, 0xC1, 0xCF, + 0x8E, 0xDE, 0x64, 0xCE, 0x16, 0xD9, 0x1F, 0xCF, 0x18, 0xCB, 0xC9, 0xCA, + 0xCC, 0xC8, 0x04, 0xCC, 0xD8, 0xD2, 0xD6, 0xD2, 0x32, 0xDC, 0x11, 0xD4, + 0xB8, 0xEC, 0xAA, 0xD5, 0xEA, 0xF6, 0x6F, 0xD9, 0xB1, 0xEC, 0xAE, 0xD8, + 0x62, 0xE1, 0x4A, 0xDA, 0x00, 0xDF, 0x64, 0xDD, 0x40, 0xE4, 0xF3, 0xE4, + 0xAB, 0xED, 0x85, 0xE9, 0xB7, 0xFE, 0x00, 0xEE, 0x7C, 0xFD, 0xD3, 0xF1, + 0x99, 0xEA, 0x89, 0xF2, 0x07, 0xF0, 0xF3, 0xFD, 0x37, 0x01, 0x87, 0x05, + 0x47, 0x08, 0xC1, 0x04, 0xBA, 0x13, 0x55, 0x07, 0x6E, 0x21, 0x2F, 0x0B, + 0x2F, 0x20, 0x32, 0x0F, 0x80, 0x17, 0xA1, 0x11, 0x18, 0x1E, 0xF5, 0x1C, + 0xF5, 0x26, 0x5E, 0x29, 0x27, 0x25, 0xE6, 0x2A, 0x23, 0x26, 0x25, 0x2B, + 0x09, 0x2E, 0xCC, 0x2E, 0x6A, 0x2E, 0x80, 0x30, 0x13, 0x20, 0x0F, 0x2A, + 0x11, 0x1A, 0x24, 0x2E, 0xD2, 0x21, 0x06, 0x37, 0xD7, 0x32, 0xAA, 0x39, + 0x8C, 0x49, 0x96, 0x3D, 0xA1, 0x56, 0x5A, 0x3F, 0x74, 0x54, 0xA5, 0x40, + 0x83, 0x4A, 0x27, 0x41, 0xF8, 0x48, 0xED, 0x45, 0xB3, 0x50, 0xC1, 0x48, + 0x00, 0x55, 0x90, 0x45, 0x7C, 0x56, 0xC5, 0x43, 0xA4, 0x54, 0xEB, 0x3D, + 0x4A, 0x4E, 0xDC, 0x33, 0x6D, 0x4A, 0xF4, 0x30, 0xA5, 0x46, 0xA8, 0x30, + 0xAC, 0x4A, 0x9C, 0x31, 0x6E, 0x54, 0x74, 0x36, 0x20, 0x56, 0xF2, 0x3D, + 0x74, 0x4B, 0x0F, 0x45, 0x4F, 0x3F, 0x83, 0x4C, 0x86, 0x42, 0x26, 0x55, + 0x0A, 0x44, 0xD5, 0x51, 0x61, 0x45, 0x0A, 0x50, 0x29, 0x4B, 0xEA, 0x53, + 0x3B, 0x49, 0xCD, 0x52, 0x3D, 0x43, 0xEB, 0x51, 0xFC, 0x3A, 0x0B, 0x4B, + 0xF1, 0x3B, 0xBD, 0x41, 0x90, 0x43, 0x89, 0x40, 0x5C, 0x49, 0xF1, 0x42, + 0xE9, 0x56, 0x4C, 0x4C, 0x9F, 0x5F, 0x24, 0x56, 0x4F, 0x55, 0x81, 0x51, + 0xD0, 0x4B, 0x54, 0x4B, 0x78, 0x47, 0xE5, 0x47, 0x48, 0x44, 0x6C, 0x46, + 0xD7, 0x44, 0xED, 0x45, 0xD7, 0x3E, 0x91, 0x41, 0xBC, 0x37, 0x20, 0x3F, + 0x2D, 0x39, 0x8E, 0x42, 0x1A, 0x39, 0xAE, 0x42, 0xE8, 0x3C, 0x4B, 0x44, + 0x54, 0x46, 0xC5, 0x4D, 0xF0, 0x40, 0x6D, 0x49, 0xD6, 0x45, 0xC6, 0x46, + 0x2E, 0x55, 0x57, 0x4A, 0x3D, 0x53, 0x62, 0x43, 0x67, 0x4E, 0x1B, 0x3E, + 0xA1, 0x4C, 0xD9, 0x38, 0x91, 0x4B, 0xC0, 0x35, 0x83, 0x44, 0xFB, 0x30, + 0x5C, 0x3C, 0x13, 0x2B, 0xE0, 0x3B, 0x24, 0x2D, 0x42, 0x33, 0x97, 0x24, + 0x3F, 0x29, 0x3D, 0x18, 0xDE, 0x2B, 0x9C, 0x16, 0x1B, 0x2E, 0xD4, 0x17, + 0x74, 0x26, 0xE4, 0x17, 0xF4, 0x22, 0xA3, 0x1B, 0x3A, 0x24, 0x93, 0x1F, + 0x07, 0x24, 0xF5, 0x1A, 0x4C, 0x24, 0x25, 0x12, 0x47, 0x1C, 0x74, 0x0A, + 0xD7, 0x0E, 0x90, 0x04, 0xBB, 0x04, 0xFC, 0xFF, 0x04, 0xFE, 0x96, 0xFC, + 0x70, 0xFA, 0xD6, 0xF8, 0x97, 0x02, 0x11, 0xF3, 0x98, 0x11, 0xBF, 0xF2, + 0xC2, 0x10, 0x06, 0xF3, 0xE6, 0x07, 0x97, 0xF9, 0x4F, 0xFB, 0x52, 0xFF, + 0x19, 0xEE, 0x37, 0xF9, 0x48, 0xF0, 0x2F, 0xF9, 0x33, 0xF1, 0x15, 0xF9, + 0x73, 0xE7, 0x8D, 0xF2, 0xCF, 0xDF, 0xBA, 0xED, 0x59, 0xDC, 0x20, 0xED, + 0x9C, 0xDB, 0x64, 0xF1, 0x1C, 0xE1, 0x1D, 0xF5, 0x3E, 0xEF, 0xDB, 0xF6, + 0xC0, 0xF9, 0x56, 0xF3, 0x96, 0xF6, 0x1D, 0xEC, 0x40, 0xFA, 0xC6, 0xEF, + 0x6F, 0x04, 0xCE, 0xF5, 0x20, 0x05, 0xA8, 0xF9, 0x96, 0x01, 0xB5, 0x00, + 0x4E, 0xFA, 0x41, 0x05, 0x18, 0xF2, 0xD1, 0xFF, 0x93, 0xF3, 0x13, 0xF5, + 0x1E, 0xF7, 0x5D, 0xED, 0x92, 0xF6, 0x63, 0xE7, 0x31, 0xF7, 0xC3, 0xE5, + 0xBD, 0xF3, 0x82, 0xE5, 0x99, 0xF0, 0x74, 0xE8, 0xD2, 0xF8, 0x6B, 0xEF, + 0x25, 0x00, 0x33, 0xF4, 0xBA, 0x00, 0x15, 0xF1, 0x93, 0x05, 0x6C, 0xF0, + 0x07, 0x09, 0xB1, 0xFA, 0xD8, 0xFF, 0x8F, 0x02, 0x7A, 0xF2, 0x97, 0x02, + 0x64, 0xEA, 0x1D, 0x01, 0x6F, 0xE5, 0xBA, 0x02, 0x80, 0xE2, 0xB9, 0xFF, + 0x60, 0xE0, 0x77, 0xF7, 0x75, 0xE5, 0x9B, 0xF3, 0x01, 0xE6, 0x4F, 0xF0, + 0x26, 0xE1, 0x12, 0xEF, 0x39, 0xE8, 0xAB, 0xF2, 0x9D, 0xEE, 0x30, 0xF5, + 0x11, 0xEA, 0x0E, 0xF7, 0x0F, 0xE6, 0x97, 0xFB, 0xBF, 0xE9, 0x3D, 0x01, + 0x66, 0xE8, 0x61, 0xFF, 0xBF, 0xDD, 0xE6, 0xF9, 0x28, 0xD4, 0x43, 0xF5, + 0xF8, 0xCC, 0x39, 0xE8, 0xFF, 0xD3, 0x18, 0xDF, 0xAB, 0xDF, 0x5D, 0xDE, + 0xF1, 0xDD, 0x68, 0xDA, 0xC4, 0xDA, 0xCA, 0xDA, 0x89, 0xD3, 0x33, 0xDC, + 0x4A, 0xCC, 0xF7, 0xDB, 0xAF, 0xCC, 0xCD, 0xDD, 0x12, 0xCD, 0x20, 0xDC, + 0x97, 0xCF, 0x74, 0xDA, 0xD3, 0xDA, 0x08, 0xDF, 0x3C, 0xDD, 0xD8, 0xE0, + 0x42, 0xD1, 0x98, 0xDB, 0x9F, 0xCB, 0xCB, 0xD7, 0x6B, 0xC4, 0xED, 0xD4, + 0x2D, 0xBB, 0x76, 0xD5, 0xB1, 0xB8, 0xCD, 0xD8, 0xAE, 0xC0, 0x92, 0xD7, + 0x87, 0xCE, 0xE5, 0xD3, 0x81, 0xD2, 0x59, 0xD5, 0x75, 0xCF, 0x92, 0xDF, + 0x69, 0xCA, 0x7E, 0xE4, 0x08, 0xC4, 0xCC, 0xE1, 0xBC, 0xC3, 0xDE, 0xE9, + 0xE1, 0xC3, 0xC7, 0xEE, 0x0F, 0xC5, 0xC5, 0xE8, 0xD3, 0xC4, 0x5E, 0xDF, + 0x16, 0xBF, 0xDA, 0xD0, 0xFA, 0xBA, 0xDB, 0xC4, 0x54, 0xB5, 0x4A, 0xBE, + 0x32, 0xB6, 0xCE, 0xBC, 0x82, 0xB8, 0x35, 0xB9, 0x23, 0xB9, 0x23, 0xB7, + 0xC2, 0xBF, 0x19, 0xB9, 0x5C, 0xC7, 0xE3, 0xBE, 0xF1, 0xC9, 0x55, 0xC7, + 0x8E, 0xC4, 0x76, 0xCB, 0xB0, 0xC0, 0xD8, 0xCA, 0x19, 0xC5, 0x43, 0xC5, + 0x14, 0xCB, 0xBD, 0xBF, 0x35, 0xCA, 0x36, 0xBA, 0x1B, 0xC8, 0x69, 0xB6, + 0xF3, 0xCB, 0x2B, 0xB7, 0x90, 0xC9, 0x17, 0xBA, 0x49, 0xC3, 0xAB, 0xC0, + 0x53, 0xC1, 0x7E, 0xC5, 0xFD, 0xC1, 0xE5, 0xC3, 0x9C, 0xC0, 0x06, 0xBD, + 0x66, 0xB9, 0xBA, 0xB8, 0xC2, 0xB6, 0xD2, 0xBD, 0x81, 0xB6, 0x04, 0xBF, + 0x84, 0xB6, 0xC8, 0xBA, 0xEB, 0xB7, 0x26, 0xBD, 0x4A, 0xB8, 0x03, 0xC3, + 0x30, 0xB7, 0x95, 0xC4, 0xF2, 0xAE, 0x25, 0xBF, 0x54, 0xA8, 0x80, 0xBE, + 0x1D, 0xA8, 0xB5, 0xC4, 0x11, 0xAC, 0x8E, 0xC2, 0x6E, 0xB5, 0x73, 0xBB, + 0x40, 0xBA, 0x80, 0xB8, 0xDE, 0xB6, 0x50, 0xBA, 0x8F, 0xB3, 0x33, 0xBF, + 0x9F, 0xBC, 0x52, 0xC4, 0xB3, 0xCB, 0xDA, 0xC8, 0x24, 0xCC, 0xBE, 0xC8, + 0x4D, 0xC4, 0x7B, 0xC8, 0xE3, 0xBC, 0x1F, 0xC8, 0x06, 0xB2, 0x7B, 0xBE, + 0x12, 0xAC, 0xE9, 0xB8, 0x49, 0xB3, 0xC6, 0xC1, 0x01, 0xBD, 0xC7, 0xCA, + 0xA2, 0xC0, 0xF7, 0xCD, 0x14, 0xC1, 0x27, 0xD1, 0x6E, 0xC2, 0xF4, 0xD5, + 0xE0, 0xC5, 0x09, 0xDE, 0x80, 0xC7, 0x3D, 0xE2, 0x4C, 0xC9, 0x8C, 0xDE, + 0x64, 0xD1, 0xED, 0xDC, 0xCF, 0xDA, 0x91, 0xDF, 0xE1, 0xD6, 0x43, 0xDE, + 0xB7, 0xCA, 0x00, 0xD6, 0x70, 0xC5, 0xEF, 0xCC, 0xE6, 0xCB, 0x54, 0xC4, + 0xF6, 0xD4, 0xD1, 0xBC, 0xDE, 0xDE, 0x97, 0xC3, 0xA9, 0xE4, 0x15, 0xD2, + 0xE5, 0xE2, 0xD6, 0xD7, 0xC1, 0xE7, 0x85, 0xD1, 0xF2, 0xED, 0x84, 0xC7, + 0xD2, 0xF0, 0x40, 0xC4, 0x87, 0xF5, 0x5A, 0xC7, 0xD1, 0xFB, 0x5A, 0xD0, + 0x0D, 0xFE, 0x4D, 0xD9, 0x29, 0xFF, 0x5B, 0xDD, 0x1C, 0x02, 0x36, 0xDD, + 0x05, 0x02, 0x8A, 0xDE, 0x40, 0xFD, 0x65, 0xE3, 0xE1, 0xF8, 0xA9, 0xEB, + 0x74, 0xFB, 0x39, 0xF6, 0x95, 0xFC, 0x55, 0x00, 0xE6, 0xF5, 0xD9, 0x04, + 0x5E, 0xF3, 0xC9, 0x00, 0x16, 0xFF, 0xAE, 0x02, 0x75, 0x0E, 0x73, 0x0B, + 0xA4, 0x14, 0x1B, 0x10, 0x3E, 0x15, 0x44, 0x17, 0xFF, 0x13, 0x13, 0x20, + 0xBF, 0x14, 0xE1, 0x1E, 0xFF, 0x16, 0x8B, 0x16, 0x6A, 0x14, 0xCD, 0x0F, + 0xCC, 0x14, 0x82, 0x0F, 0x00, 0x18, 0x48, 0x14, 0xA3, 0x16, 0x59, 0x14, + 0x6B, 0x11, 0xF8, 0x0F, 0xF6, 0x06, 0x18, 0x0E, 0x5D, 0x04, 0x48, 0x0B, + 0x33, 0x14, 0xB8, 0x0B, 0xD7, 0x25, 0xAF, 0x12, 0x45, 0x2D, 0x4E, 0x16, + 0xE4, 0x2D, 0x9A, 0x16, 0xAD, 0x25, 0xFF, 0x11, 0x28, 0x1E, 0x77, 0x08, + 0x84, 0x1E, 0x58, 0x03, 0xA1, 0x1B, 0xD3, 0x01, 0xDE, 0x1A, 0x29, 0x06, + 0x62, 0x1F, 0x13, 0x10, 0xD4, 0x1E, 0x93, 0x10, 0x70, 0x1F, 0xD3, 0x09, + 0x64, 0x20, 0x17, 0x05, 0xFA, 0x1B, 0xE7, 0x04, 0x61, 0x1C, 0x84, 0x06, + 0xDE, 0x21, 0x02, 0x0C, 0xD2, 0x1E, 0xAF, 0x15, 0x36, 0x17, 0x88, 0x1B, + 0x3B, 0x14, 0x6E, 0x1E, 0xC7, 0x10, 0xFF, 0x19, 0xC1, 0x10, 0xDC, 0x13, + 0x1A, 0x15, 0x7C, 0x16, 0xE6, 0x19, 0x76, 0x20, 0x54, 0x21, 0xBF, 0x29, + 0xF0, 0x26, 0x4D, 0x29, 0xDC, 0x28, 0x1D, 0x1F, 0x5D, 0x28, 0xFB, 0x11, + 0x4A, 0x24, 0x54, 0x08, 0x7F, 0x25, 0x95, 0x08, 0x82, 0x32, 0x60, 0x14, + 0x22, 0x3E, 0x4A, 0x20, 0x90, 0x40, 0x30, 0x25, 0x42, 0x45, 0xF0, 0x27, + 0x14, 0x47, 0x1D, 0x29, 0x6A, 0x3D, 0xFF, 0x29, 0x5E, 0x38, 0xC4, 0x2F, + 0x81, 0x3B, 0xEA, 0x37, 0xC5, 0x38, 0xF0, 0x38, 0xF3, 0x36, 0x82, 0x39, + 0xF6, 0x39, 0xEC, 0x3C, 0xCD, 0x3C, 0xCA, 0x3A, 0x23, 0x40, 0xAE, 0x34, + 0x1E, 0x45, 0x08, 0x31, 0xD8, 0x4A, 0xDA, 0x36, 0x40, 0x4D, 0x3B, 0x3F, + 0xF6, 0x52, 0xA6, 0x41, 0xA1, 0x57, 0x1B, 0x3B, 0x18, 0x54, 0x1D, 0x32, + 0x22, 0x54, 0x1F, 0x34, 0x60, 0x5C, 0xD4, 0x37, 0xCB, 0x5E, 0xF6, 0x31, + 0x1F, 0x58, 0x26, 0x32, 0x1A, 0x4F, 0x7C, 0x3A, 0x1E, 0x49, 0x90, 0x3B, + 0xDF, 0x47, 0x11, 0x34, 0xF9, 0x4D, 0x72, 0x2C, 0xE7, 0x55, 0xF8, 0x2E, + 0x4C, 0x51, 0xF0, 0x36, 0x2B, 0x4B, 0x56, 0x3E, 0x87, 0x4D, 0xEE, 0x45, + 0xC4, 0x4C, 0xD3, 0x45, 0x71, 0x4A, 0x41, 0x46, 0x98, 0x4B, 0x25, 0x4A, + 0xF0, 0x45, 0x52, 0x49, 0x83, 0x41, 0xC0, 0x4B, 0xEF, 0x45, 0xEF, 0x49, + 0xAD, 0x4C, 0x9C, 0x45, 0x88, 0x4D, 0xEF, 0x44, 0x02, 0x46, 0xD4, 0x42, + 0x99, 0x40, 0x25, 0x41, 0xB1, 0x3E, 0x0C, 0x3E, 0xF7, 0x3B, 0x20, 0x36, + 0x76, 0x3C, 0x67, 0x2E, 0x68, 0x3B, 0x2B, 0x2C, 0xD9, 0x34, 0xB3, 0x29, + 0x6B, 0x30, 0xEC, 0x28, 0xFA, 0x30, 0xDF, 0x29, 0x01, 0x30, 0x0A, 0x26, + 0x9E, 0x29, 0x5C, 0x22, 0xE0, 0x27, 0x8A, 0x27, 0xB2, 0x26, 0x80, 0x2A, + 0xA7, 0x20, 0xB6, 0x22, 0xD6, 0x19, 0xBC, 0x1B, 0xB5, 0x17, 0xA4, 0x16, + 0x7F, 0x19, 0x3F, 0x0F, 0x37, 0x1F, 0x37, 0x0B, 0x22, 0x28, 0x60, 0x0D, + 0xA6, 0x28, 0x28, 0x10, 0x94, 0x21, 0x1D, 0x0F, 0xBE, 0x1B, 0x77, 0x11, + 0xFD, 0x15, 0xE3, 0x15, 0xA7, 0x07, 0xBD, 0x14, 0x33, 0xFC, 0x8F, 0x16, + 0x8A, 0xFC, 0xE3, 0x18, 0x3F, 0xFE, 0x81, 0x13, 0x40, 0x00, 0x10, 0x0D, + 0x74, 0x02, 0xAE, 0x0E, 0xB1, 0xF5, 0xED, 0x0E, 0xB5, 0xE5, 0x0D, 0x08, + 0x00, 0xE6, 0xAE, 0x01, 0xC0, 0xE8, 0x57, 0xFC, 0x22, 0xED, 0xCC, 0xF7, + 0xB4, 0xF4, 0x90, 0xF6, 0xC4, 0xF3, 0x10, 0xF5, 0x3F, 0xEA, 0x87, 0xF1, + 0xC2, 0xDE, 0x7E, 0xEC, 0xB7, 0xDC, 0xFE, 0xE7, 0xBE, 0xE6, 0x9D, 0xE7, + 0x89, 0xEE, 0xF9, 0xE5, 0x46, 0xEF, 0x08, 0xEB, 0xFC, 0xE9, 0xEC, 0xF2, + 0x96, 0xDF, 0x5F, 0xF5, 0xE5, 0xD1, 0x83, 0xF6, 0xC5, 0xCC, 0xB2, 0xF5, + 0x66, 0xD2, 0x39, 0xF7, 0x77, 0xD7, 0xA9, 0xFD, 0x51, 0xDC, 0x79, 0x04, + 0x2D, 0xDB, 0x7B, 0x06, 0x64, 0xCE, 0x1F, 0x03, 0x43, 0xC3, 0x3A, 0xFB, + 0xDF, 0xC6, 0xC7, 0xF4, 0x38, 0xD2, 0xF6, 0xF0, 0x69, 0xDB, 0x86, 0xF1, + 0xDD, 0xE1, 0xB7, 0xF9, 0x87, 0xE5, 0x7B, 0x01, 0x45, 0xE3, 0xA6, 0xFF, + 0x0F, 0xDB, 0xC0, 0xF5, 0x7F, 0xD8, 0x44, 0xEF, 0xCF, 0xD8, 0x8F, 0xEC, + 0x32, 0xDB, 0x68, 0xEC, 0xD7, 0xE2, 0x4D, 0xEF, 0x41, 0xE6, 0x40, 0xF3, + 0x08, 0xEB, 0xB8, 0xF6, 0x32, 0xEF, 0x4E, 0xF5, 0xA9, 0xF0, 0x8F, 0xF5, + 0xBE, 0xF2, 0x24, 0xF7, 0xF2, 0xF1, 0x4B, 0xF3, 0xB8, 0xF1, 0xCF, 0xF3, + 0x59, 0xF5, 0xF1, 0xFA, 0x64, 0xF4, 0x2C, 0xFC, 0x57, 0xEE, 0x80, 0xF7, + 0xBA, 0xEB, 0xDD, 0xF4, 0xDA, 0xE9, 0x45, 0xF6, 0x06, 0xE8, 0x07, 0xFA, + 0xFC, 0xE9, 0x53, 0x01, 0x1A, 0xEF, 0xD3, 0x05, 0x99, 0xEB, 0xFD, 0x04, + 0x94, 0xE3, 0xD4, 0x07, 0x7F, 0xDD, 0x44, 0x07, 0x04, 0xDA, 0x35, 0x02, + 0x39, 0xE0, 0x64, 0x02, 0x7A, 0xE7, 0x0A, 0x04, 0xD6, 0xE6, 0x62, 0xFF, + 0xB7, 0xE1, 0x3B, 0xF7, 0xF8, 0xE0, 0x77, 0xF0, 0xD3, 0xE4, 0xD2, 0xEB, + 0xC4, 0xE9, 0x58, 0xE8, 0x45, 0xEF, 0x0D, 0xE8, 0x6A, 0xEE, 0x31, 0xEA, + 0xF2, 0xE9, 0x0C, 0xE9, 0x79, 0xE7, 0x39, 0xE5, 0x1D, 0xE4, 0xCD, 0xDD, + 0xCB, 0xE0, 0xF4, 0xD9, 0xED, 0xDD, 0x37, 0xDC, 0x74, 0xDE, 0xCB, 0xDD, + 0x46, 0xE5, 0xD1, 0xE0, 0x20, 0xE8, 0x12, 0xE2, 0xFC, 0xDF, 0xA0, 0xE0, + 0x00, 0xD8, 0x14, 0xE0, 0x4C, 0xD8, 0x28, 0xE2, 0x27, 0xDB, 0xC5, 0xEB, + 0xAD, 0xDB, 0x83, 0xF8, 0xC2, 0xD6, 0x0B, 0x00, 0x59, 0xD0, 0xA3, 0x01, + 0x5E, 0xD0, 0x50, 0x00, 0x59, 0xD2, 0xFB, 0xFC, 0xC9, 0xD5, 0xA0, 0xFC, + 0x20, 0xDC, 0x94, 0x03, 0x8B, 0xDB, 0x8A, 0x07, 0x58, 0xDE, 0xE6, 0x02, + 0xB9, 0xE5, 0x0C, 0xFB, 0x56, 0xDE, 0x52, 0xF2, 0xB1, 0xD1, 0x96, 0xEB, + 0x2A, 0xCD, 0xD0, 0xE5, 0x90, 0xCF, 0xEF, 0xE0, 0x22, 0xD7, 0x2E, 0xE3, + 0x5E, 0xDC, 0x5B, 0xE6, 0x63, 0xDE, 0x59, 0xE2, 0xCD, 0xDF, 0xFB, 0xDB, + 0xF2, 0xDF, 0xF9, 0xDB, 0x5C, 0xE1, 0xF5, 0xE1, 0x43, 0xE4, 0x2F, 0xE5, + 0x58, 0xE4, 0xA3, 0xE3, 0x2A, 0xE6, 0x04, 0xE0, 0xBC, 0xE9, 0x96, 0xDB, + 0x36, 0xE5, 0x99, 0xDA, 0x87, 0xE0, 0x5D, 0xDB, 0x3F, 0xE4, 0x50, 0xDC, + 0x73, 0xE4, 0x9E, 0xDD, 0xBD, 0xDE, 0x9B, 0xDE, 0x38, 0xDC, 0xB0, 0xE1, + 0x98, 0xDA, 0x17, 0xE1, 0x3C, 0xD6, 0xC9, 0xDF, 0x98, 0xD4, 0x31, 0xE1, + 0xD4, 0xDB, 0x5F, 0xDE, 0xA7, 0xE9, 0x56, 0xDC, 0x3E, 0xED, 0x41, 0xE0, + 0x28, 0xE2, 0x1C, 0xE6, 0xF8, 0xDC, 0x67, 0xE8, 0x33, 0xE0, 0xA0, 0xE2, + 0x02, 0xE1, 0xDF, 0xDC, 0x0D, 0xE0, 0x1A, 0xDD, 0x53, 0xDB, 0xA6, 0xDC, + 0x9C, 0xD7, 0x3B, 0xDE, 0xB1, 0xDA, 0x04, 0xE6, 0x80, 0xE2, 0x05, 0xF2, + 0x96, 0xEB, 0x4A, 0xF9, 0xD3, 0xF3, 0xDC, 0xF3, 0xDC, 0xFB, 0x66, 0xE8, + 0xA5, 0xFB, 0xB3, 0xDF, 0x1D, 0xF4, 0x6C, 0xDF, 0xCC, 0xEE, 0x5E, 0xE4, + 0xA3, 0xEB, 0x2B, 0xE4, 0x79, 0xED, 0xF6, 0xE0, 0x54, 0xF1, 0xA8, 0xE1, + 0x85, 0xF2, 0x37, 0xE8, 0x10, 0xEF, 0xBE, 0xF3, 0x14, 0xE9, 0x89, 0xFB, + 0xE5, 0xEC, 0x22, 0xFB, 0xFD, 0xFA, 0xA6, 0xF4, 0x1A, 0x07, 0xE1, 0xEE, + 0x56, 0x04, 0x08, 0xF0, 0x55, 0xFA, 0xD1, 0xF3, 0x04, 0xF6, 0xEF, 0xF5, + 0x7D, 0xF6, 0xA4, 0xF5, 0x3E, 0xFB, 0x1D, 0xF4, 0xED, 0xFE, 0x56, 0xF4, + 0x80, 0x02, 0x6E, 0xF0, 0xC2, 0x0A, 0xCC, 0xE7, 0x7D, 0x10, 0xFE, 0xE3, + 0xF1, 0x0D, 0x06, 0xE6, 0x79, 0x08, 0x58, 0xE9, 0x1B, 0x08, 0x12, 0xEA, + 0xB5, 0x10, 0xC9, 0xED, 0xBF, 0x19, 0xD9, 0xF5, 0x05, 0x24, 0xB2, 0xFC, + 0x64, 0x2F, 0xAF, 0xFF, 0x29, 0x31, 0xD1, 0xFD, 0x74, 0x31, 0x2D, 0xFA, + 0x37, 0x31, 0x13, 0xFA, 0x10, 0x2C, 0x64, 0x02, 0x7B, 0x26, 0x29, 0x0F, + 0xBE, 0x27, 0x2B, 0x18, 0xE2, 0x29, 0x4B, 0x1A, 0xFD, 0x28, 0x39, 0x1A, + 0x61, 0x2A, 0x8B, 0x1C, 0x15, 0x28, 0x21, 0x23, 0xA6, 0x29, 0x7D, 0x26, + 0xC6, 0x35, 0xAC, 0x20, 0x4A, 0x43, 0xE1, 0x1B, 0xEB, 0x43, 0x79, 0x1D, + 0x27, 0x37, 0x2D, 0x25, 0xE3, 0x2D, 0x0A, 0x2C, 0x31, 0x33, 0x0B, 0x2E, + 0xCC, 0x42, 0x1D, 0x31, 0xA7, 0x4C, 0x2E, 0x37, 0x94, 0x49, 0x79, 0x3D, + 0x51, 0x3F, 0xF2, 0x3C, 0xC4, 0x35, 0x20, 0x38, 0x21, 0x32, 0x1A, 0x3A, + 0x03, 0x32, 0x0F, 0x3D, 0xCC, 0x34, 0x67, 0x36, 0x7F, 0x3A, 0x31, 0x2E, + 0xC8, 0x3F, 0x9F, 0x2C, 0xB1, 0x3F, 0x9D, 0x2B, 0x19, 0x3C, 0xA4, 0x2B, + 0x48, 0x36, 0x35, 0x2E, 0xB7, 0x30, 0x9B, 0x2D, 0x94, 0x33, 0x7F, 0x2C, + 0x73, 0x3C, 0xF8, 0x2C, 0xFA, 0x3E, 0x13, 0x2C, 0x3B, 0x38, 0x3E, 0x2A, + 0x0F, 0x36, 0x3C, 0x2A, 0xF4, 0x37, 0x18, 0x28, 0x52, 0x39, 0xB6, 0x22, + 0xB3, 0x3D, 0x10, 0x20, 0x9B, 0x41, 0xBE, 0x22, 0x74, 0x44, 0xDE, 0x26, + 0x1E, 0x44, 0x95, 0x27, 0x99, 0x3F, 0x0B, 0x26, 0x4C, 0x34, 0x27, 0x27, + 0x15, 0x2C, 0x13, 0x2A, 0xA8, 0x2E, 0xE7, 0x2A, 0x8E, 0x30, 0x03, 0x2D, + 0x84, 0x2E, 0xE5, 0x2E, 0x0F, 0x2B, 0xC9, 0x2D, 0x8D, 0x28, 0x9B, 0x2B, + 0x1E, 0x24, 0xBD, 0x27, 0x72, 0x28, 0x7C, 0x27, 0xCB, 0x3A, 0x35, 0x2C, + 0xE6, 0x42, 0x7B, 0x2D, 0x40, 0x40, 0x21, 0x2D, 0x3C, 0x38, 0xA7, 0x2D, + 0x63, 0x32, 0xDC, 0x2D, 0xB4, 0x37, 0x8B, 0x2D, 0xB0, 0x3C, 0x3A, 0x2E, + 0x29, 0x3C, 0xF4, 0x33, 0xEF, 0x3A, 0x59, 0x38, 0xD3, 0x3D, 0xAB, 0x39, + 0xC3, 0x40, 0x33, 0x3D, 0xA9, 0x3D, 0xF2, 0x3E, 0xCC, 0x39, 0x2F, 0x3F, + 0x5B, 0x39, 0xDA, 0x3C, 0x74, 0x36, 0x0B, 0x35, 0xB4, 0x31, 0xFA, 0x2B, + 0x1A, 0x32, 0xD8, 0x26, 0x90, 0x38, 0xAC, 0x28, 0x9D, 0x3E, 0x66, 0x2C, + 0x87, 0x43, 0x68, 0x2C, 0x52, 0x44, 0xD9, 0x28, 0xC9, 0x3E, 0xE4, 0x23, + 0x99, 0x38, 0x01, 0x21, 0x6A, 0x2D, 0x3D, 0x22, 0x3F, 0x29, 0x5D, 0x24, + 0x15, 0x2E, 0xD0, 0x22, 0x13, 0x2E, 0x47, 0x21, 0x15, 0x27, 0x85, 0x22, + 0x82, 0x18, 0x86, 0x23, 0xF3, 0x0F, 0x16, 0x23, 0xB6, 0x13, 0x1E, 0x22, + 0xC7, 0x1E, 0x52, 0x23, 0x69, 0x24, 0x5C, 0x22, 0xEE, 0x1B, 0xB8, 0x1B, + 0xE3, 0x0E, 0x3A, 0x14, 0x9C, 0x02, 0x6D, 0x13, 0x99, 0xFC, 0x46, 0x1A, + 0x20, 0xFA, 0xA3, 0x1C, 0x04, 0x01, 0xE1, 0x17, 0x1A, 0x10, 0xC2, 0x11, + 0x43, 0x10, 0xC1, 0x0C, 0xB5, 0x05, 0xB6, 0x0B, 0x2B, 0xF8, 0x23, 0x0B, + 0x19, 0xEE, 0x56, 0x0C, 0xF5, 0xEF, 0xF5, 0x0E, 0xE7, 0xFC, 0x50, 0x0E, + 0xDB, 0x0B, 0x43, 0x0D, 0xDE, 0x11, 0x1B, 0x0A, 0x8D, 0x0D, 0x82, 0x03, + 0xAB, 0x01, 0x70, 0xFC, 0x25, 0xF6, 0x6B, 0xF5, 0x5B, 0xEC, 0xF2, 0xEE, + 0xD3, 0xE7, 0xF4, 0xEB, 0x9C, 0xF1, 0x35, 0xF0, 0xE6, 0xFC, 0x8D, 0xF6, + 0xD5, 0xFC, 0xD9, 0xFD, 0xDB, 0xF4, 0xF9, 0x05, 0x33, 0xEB, 0xF7, 0x04, + 0x62, 0xEB, 0xB8, 0xFB, 0x30, 0xF3, 0x06, 0xF4, 0x74, 0xFC, 0x2A, 0xF4, + 0x87, 0x04, 0x56, 0xF9, 0x60, 0x02, 0x82, 0x00, 0x11, 0xFA, 0x07, 0x07, + 0xC6, 0xEE, 0x37, 0x08, 0xDA, 0xE8, 0x95, 0x0A, 0xF4, 0xEE, 0xB6, 0x0D, + 0x52, 0xF7, 0x1E, 0x08, 0xE8, 0xF9, 0xCA, 0x00, 0xC6, 0xF4, 0x7B, 0xFE, + 0x76, 0xEB, 0x08, 0xFE, 0x29, 0xDE, 0x6E, 0xFC, 0xBC, 0xD4, 0xF4, 0xF8, + 0xBA, 0xD8, 0xA3, 0xF4, 0x42, 0xE3, 0xDA, 0xF1, 0x21, 0xE8, 0xCF, 0xF0, + 0xA2, 0xDE, 0x56, 0xEC, 0x2A, 0xD3, 0x9D, 0xE6, 0x43, 0xCD, 0x83, 0xE4, + 0xBF, 0xCD, 0xAE, 0xE1, 0x78, 0xD4, 0xFD, 0xDC, 0xD3, 0xD6, 0xB4, 0xDB, + 0x28, 0xD7, 0x2E, 0xDD, 0x9D, 0xD5, 0xE4, 0xDF, 0x8D, 0xD3, 0x0E, 0xE0, + 0x99, 0xD2, 0x0C, 0xDA, 0x0E, 0xD0, 0xDE, 0xD7, 0x6F, 0xCE, 0x6D, 0xDD, + 0x98, 0xCF, 0x18, 0xE2, 0xB1, 0xCE, 0xEF, 0xE3, 0x5F, 0xC7, 0x13, 0xE4, + 0x48, 0xC1, 0x89, 0xE2, 0xC3, 0xBF, 0xD0, 0xDE, 0xF1, 0xC2, 0xDE, 0xDA, + 0x83, 0xCB, 0xB7, 0xDA, 0x71, 0xD0, 0x1F, 0xDE, 0x3F, 0xCC, 0x70, 0xE0, + 0x81, 0xC5, 0x37, 0xDC, 0x7A, 0xC0, 0x48, 0xD8, 0x6C, 0xC1, 0x5B, 0xDD, + 0xBD, 0xC8, 0xB1, 0xE5, 0xF4, 0xCC, 0xEC, 0xEA, 0x88, 0xCC, 0x3F, 0xEA, + 0x66, 0xCD, 0x38, 0xE5, 0x84, 0xD1, 0x80, 0xE2, 0xFB, 0xD6, 0x74, 0xE3, + 0xFE, 0xDB, 0x0F, 0xEA, 0x36, 0xE1, 0xAA, 0xF5, 0x8D, 0xE9, 0x25, 0xFE, + 0xBF, 0xEE, 0xD9, 0xFD, 0x33, 0xEA, 0xDE, 0xF3, 0x8F, 0xE6, 0xBA, 0xE7, + 0x75, 0xE8, 0x7E, 0xE2, 0x9C, 0xEF, 0x1E, 0xE5, 0x13, 0xFB, 0x9A, 0xEA, + 0xD4, 0xFC, 0xCA, 0xED, 0x28, 0xF4, 0x32, 0xEF, 0x62, 0xE9, 0xEA, 0xF2, + 0xC7, 0xE0, 0xCF, 0xFA, 0xCB, 0xE1, 0x46, 0x05, 0xA9, 0xED, 0x28, 0x12, + 0x76, 0xF6, 0xDE, 0x1A, 0xDC, 0xF3, 0x38, 0x18, 0x7D, 0xEF, 0xCE, 0x10, + 0x80, 0xEF, 0x31, 0x0C, 0x45, 0xEF, 0x77, 0x0A, 0xB0, 0xEA, 0xE1, 0x07, + 0xF0, 0xE9, 0xDD, 0x00, 0xF7, 0xEE, 0x4B, 0xF7, 0x6E, 0xF6, 0x87, 0xF1, + 0x78, 0xFC, 0xF3, 0xF1, 0x9E, 0xF6, 0x4F, 0xF4, 0x7F, 0xEF, 0x40, 0xF5, + 0x67, 0xF3, 0xAD, 0xF0, 0x83, 0xFC, 0xAD, 0xED, 0x4E, 0xFD, 0x20, 0xF2, + 0xC0, 0xF4, 0xDD, 0xF5, 0xAB, 0xF0, 0x8A, 0xF2, 0x60, 0xF4, 0x9A, 0xEA, + 0x8C, 0xF9, 0x52, 0xE4, 0x43, 0xF8, 0x35, 0xDF, 0x1F, 0xF1, 0x37, 0xDC, + 0x51, 0xEC, 0x63, 0xE0, 0x9C, 0xE9, 0xA0, 0xE7, 0x86, 0xE3, 0x5B, 0xEB, + 0xC4, 0xDF, 0x36, 0xF2, 0x3A, 0xE5, 0x4F, 0xFB, 0xC7, 0xE9, 0x7F, 0xFE, + 0xEE, 0xED, 0x80, 0xFE, 0x5B, 0xFA, 0x06, 0x01, 0xD3, 0x00, 0x8C, 0x00, + 0xE6, 0xF9, 0xD8, 0xFA, 0x34, 0xF2, 0xCB, 0xF4, 0x99, 0xEC, 0x7C, 0xED, + 0x53, 0xE6, 0x47, 0xE9, 0x89, 0xE3, 0xED, 0xE9, 0xE5, 0xE1, 0xF1, 0xE7, + 0x43, 0xE0, 0x60, 0xE6, 0xEF, 0xE0, 0x36, 0xE8, 0x96, 0xE2, 0xD6, 0xEA, + 0xE8, 0xE2, 0x60, 0xEC, 0x8F, 0xE6, 0x82, 0xE6, 0xF8, 0xEE, 0x01, 0xDC, + 0x58, 0xF8, 0xA6, 0xD2, 0x0D, 0xFC, 0x15, 0xCD, 0x62, 0xF3, 0xF2, 0xCA, + 0xFC, 0xE7, 0x58, 0xC7, 0xC2, 0xE3, 0xEB, 0xBE, 0xFD, 0xE7, 0xA6, 0xB2, + 0xE0, 0xED, 0xEE, 0xAA, 0x30, 0xEB, 0x53, 0xAF, 0xDE, 0xE0, 0x5A, 0xBC, + 0xF7, 0xDA, 0x9B, 0xC8, 0x17, 0xDF, 0xC3, 0xCF, 0x59, 0xE3, 0x04, 0xD3, + 0x63, 0xE5, 0x8C, 0xD4, 0x6F, 0xE5, 0x8E, 0xD3, 0xEF, 0xE4, 0xF8, 0xD4, + 0xF4, 0xE2, 0xE9, 0xD7, 0x0C, 0xD8, 0x6D, 0xD7, 0x48, 0xCE, 0x46, 0xD3, + 0x5D, 0xCE, 0xDF, 0xCB, 0x99, 0xD2, 0xB8, 0xC9, 0x11, 0xD5, 0x7D, 0xCE, + 0xE9, 0xD1, 0x86, 0xD7, 0xE9, 0xCF, 0xC3, 0xE1, 0x87, 0xD2, 0x9A, 0xE5, + 0xF3, 0xD7, 0x9E, 0xE1, 0x99, 0xE0, 0x6F, 0xDA, 0x6B, 0xEB, 0xFA, 0xD5, + 0xCD, 0xF1, 0x6A, 0xD6, 0x7D, 0xF1, 0xB7, 0xD8, 0x18, 0xF0, 0x2D, 0xD6, + 0x95, 0xEF, 0xB8, 0xCE, 0x2B, 0xEC, 0xA6, 0xCE, 0x14, 0xE7, 0xFB, 0xD6, + 0xA8, 0xE4, 0x66, 0xE0, 0xD9, 0xE6, 0xAC, 0xEA, 0x1A, 0xF1, 0xD3, 0xF7, + 0x5A, 0xF8, 0x04, 0x01, 0x4A, 0xF5, 0xDF, 0x00, 0x15, 0xEE, 0x37, 0xFF, + 0xF9, 0xEB, 0xA2, 0xFE, 0xC4, 0xF3, 0xB3, 0xFD, 0xBF, 0xFC, 0xAA, 0xF9, + 0x46, 0x01, 0x0D, 0xF3, 0x3B, 0x02, 0xA9, 0xF0, 0x80, 0xFF, 0xCE, 0xF4, + 0xDF, 0xF8, 0x65, 0xFA, 0x82, 0xF4, 0xD0, 0xFC, 0x0C, 0xF5, 0xEF, 0xFD, + 0xA3, 0xFA, 0x69, 0x00, 0x4A, 0x04, 0xE8, 0x03, 0xCE, 0x0F, 0x40, 0x07, + 0x46, 0x18, 0xE1, 0x0A, 0xAB, 0x19, 0x99, 0x0D, 0x93, 0x17, 0x3C, 0x0C, + 0x02, 0x1A, 0xB3, 0x05, 0xBA, 0x20, 0x50, 0xFE, 0xF0, 0x26, 0x29, 0xF9, + 0x7E, 0x2C, 0x65, 0xFA, 0x55, 0x2F, 0x15, 0x04, 0xF5, 0x2D, 0xA2, 0x08, + 0xDC, 0x2D, 0xE8, 0x06, 0x92, 0x2E, 0xEC, 0x06, 0xD4, 0x2A, 0x97, 0x0D, + 0x26, 0x28, 0x23, 0x1B, 0xE4, 0x27, 0xF6, 0x25, 0x13, 0x28, 0xD5, 0x2B, + 0x36, 0x26, 0xAE, 0x2A, 0x51, 0x20, 0x71, 0x23, 0xAF, 0x1C, 0x7D, 0x1A, + 0xC4, 0x20, 0x28, 0x12, 0xC7, 0x24, 0x0E, 0x10, 0x78, 0x24, 0xD1, 0x18, + 0x6F, 0x21, 0xBB, 0x23, 0x91, 0x1B, 0x57, 0x25, 0x7F, 0x1B, 0x1C, 0x22, + 0xB5, 0x21, 0x9A, 0x21, 0x98, 0x26, 0x49, 0x24, 0xFE, 0x27, 0x5D, 0x28, + 0x18, 0x2A, 0x40, 0x2B, 0xE9, 0x2A, 0x86, 0x29, 0x97, 0x29, 0x15, 0x24, + 0x92, 0x2A, 0xB6, 0x1C, 0x61, 0x29, 0x2D, 0x15, 0xFB, 0x23, 0x39, 0x10, + 0x54, 0x19, 0xAB, 0x0C, 0xF9, 0x10, 0x58, 0x0B, 0xA7, 0x10, 0x80, 0x10, + 0x85, 0x11, 0x8B, 0x17, 0xFE, 0x13, 0x58, 0x1C, 0x2D, 0x1A, 0xF3, 0x1B, + 0x09, 0x20, 0xDC, 0x1B, 0x7F, 0x22, 0x73, 0x23, 0x29, 0x1E, 0x59, 0x28, + 0xD3, 0x13, 0x5F, 0x23, 0x4F, 0x0D, 0x1D, 0x1B, 0xC6, 0x0E, 0xE0, 0x14, + 0xD2, 0x12, 0x0A, 0x10, 0xCA, 0x15, 0x1E, 0x0E, 0xFC, 0x19, 0x63, 0x0E, + 0x31, 0x1C, 0xE1, 0x11, 0xB7, 0x14, 0xF0, 0x14, 0x29, 0x0B, 0x06, 0x14, + 0xF7, 0x06, 0x1F, 0x10, 0xBF, 0x04, 0x79, 0x09, 0xAE, 0x05, 0x7A, 0x04, + 0xA1, 0x0C, 0x57, 0x04, 0x1A, 0x12, 0xF8, 0x08, 0xA5, 0x0E, 0xC7, 0x09, + 0xC3, 0x0A, 0xF8, 0x04, 0x99, 0x09, 0xD5, 0xFC, 0x73, 0x05, 0x56, 0xF8, + 0x88, 0x00, 0xCA, 0xFD, 0x23, 0xFF, 0xD0, 0x05, 0x8B, 0x03, 0x41, 0x0D, + 0x14, 0x0D, 0x96, 0x13, 0x8F, 0x11, 0x45, 0x18, 0xF5, 0x0D, 0xE5, 0x1F, + 0x9F, 0x0C, 0xC7, 0x24, 0x5E, 0x0F, 0x1A, 0x1F, 0xAD, 0x10, 0xF3, 0x18, + 0x33, 0x14, 0x83, 0x16, 0x77, 0x17, 0x92, 0x12, 0x01, 0x10, 0xF5, 0x0E, + 0xEC, 0x02, 0x96, 0x0D, 0x3D, 0xFB, 0x55, 0x10, 0x75, 0xFD, 0xCA, 0x11, + 0x77, 0x0B, 0xB3, 0x10, 0x5F, 0x18, 0x60, 0x14, 0x2B, 0x18, 0xD8, 0x17, + 0x84, 0x15, 0xE8, 0x18, 0xA0, 0x13, 0x8D, 0x17, 0x52, 0x0C, 0xC1, 0x0F, + 0x50, 0x08, 0x11, 0x03, 0xC6, 0x11, 0xE0, 0xFB, 0x9B, 0x1C, 0x36, 0xFD, + 0xEE, 0x1C, 0x88, 0x00, 0x85, 0x16, 0x33, 0x02, 0x18, 0x0B, 0xF3, 0xFF, + 0xE3, 0xFE, 0xF9, 0xF7, 0x32, 0xF7, 0xBA, 0xED, 0x20, 0xF5, 0xDA, 0xEB, + 0x3F, 0xFC, 0x44, 0xF5, 0x1D, 0x06, 0xC4, 0x00, 0xD6, 0x04, 0x31, 0x08, + 0x51, 0xFC, 0x7F, 0x0B, 0x89, 0xF2, 0x78, 0x08, 0x53, 0xE8, 0x8F, 0x06, + 0xE0, 0xE3, 0x8E, 0x0D, 0x1A, 0xE3, 0x17, 0x11, 0x8D, 0xE4, 0xEA, 0x0A, + 0xF6, 0xEA, 0x92, 0x01, 0xEB, 0xF0, 0xCD, 0xF9, 0xB8, 0xF1, 0xCC, 0xF8, + 0x67, 0xF0, 0xAA, 0xFF, 0x62, 0xF8, 0xCD, 0x07, 0xE1, 0x05, 0x0F, 0x0C, + 0x1C, 0x0A, 0xE4, 0x0B, 0x28, 0x08, 0x69, 0x06, 0x91, 0x06, 0x3E, 0xFE, + 0x3E, 0x08, 0x75, 0xF9, 0x69, 0x0A, 0xF4, 0xFA, 0x21, 0x07, 0xC0, 0x00, + 0xB9, 0x01, 0x13, 0x02, 0x5D, 0xFF, 0xFF, 0xFD, 0x68, 0x01, 0x16, 0xFD, + 0x9C, 0x06, 0xBB, 0x01, 0x72, 0x0A, 0xA7, 0x09, 0x0D, 0x0D, 0x98, 0x11, + 0xEB, 0x0F, 0x96, 0x17, 0x84, 0x11, 0xE7, 0x1A, 0x29, 0x11, 0x7C, 0x1F, + 0x2E, 0x11, 0x5C, 0x25, 0xCA, 0x15, 0xF6, 0x2C, 0x27, 0x19, 0x69, 0x36, + 0xC1, 0x17, 0x72, 0x3D, 0xDA, 0x17, 0xD4, 0x3C, 0x23, 0x18, 0x10, 0x32, + 0x9E, 0x11, 0xA6, 0x27, 0x89, 0x09, 0xE5, 0x23, 0x44, 0x0A, 0xB7, 0x24, + 0x76, 0x12, 0xE3, 0x29, 0xC1, 0x1A, 0x48, 0x30, 0xAF, 0x1F, 0xF2, 0x32, + 0x3E, 0x20, 0x3B, 0x2F, 0x8C, 0x1C, 0x81, 0x24, 0x28, 0x16, 0xF1, 0x19, + 0x96, 0x0C, 0x6A, 0x17, 0x73, 0x07, 0xEB, 0x1B, 0xAD, 0x0D, 0x27, 0x22, + 0xA6, 0x17, 0x16, 0x25, 0x0E, 0x1B, 0x50, 0x24, 0xEC, 0x16, 0xAC, 0x1D, + 0x18, 0x0E, 0x97, 0x13, 0x7C, 0x0A, 0x56, 0x0B, 0x25, 0x0F, 0xB3, 0x0B, + 0x91, 0x13, 0x0C, 0x16, 0x91, 0x13, 0x83, 0x1D, 0xD6, 0x10, 0xF4, 0x1D, + 0xBC, 0x0B, 0xD4, 0x1A, 0xD9, 0x04, 0x4B, 0x19, 0x2F, 0x03, 0x65, 0x17, + 0x1F, 0x06, 0xAD, 0x11, 0xCB, 0x04, 0xC6, 0x0C, 0x05, 0x00, 0xDA, 0x09, + 0x2A, 0xF9, 0x47, 0x08, 0x18, 0xF0, 0xE1, 0x08, 0xB0, 0xEE, 0xA6, 0x08, + 0x1A, 0xF7, 0xB0, 0x07, 0x05, 0xFE, 0xE0, 0x09, 0xE5, 0xFF, 0xB9, 0x0A, + 0xA9, 0x01, 0x2B, 0x0C, 0x13, 0x02, 0x70, 0x0F, 0x7A, 0x02, 0x28, 0x0E, + 0xAC, 0x05, 0xA8, 0x08, 0x87, 0x05, 0x6C, 0x03, 0x4E, 0x00, 0x7E, 0xFD, + 0xBD, 0xFA, 0xC7, 0xF8, 0xE3, 0xF9, 0xA5, 0xF7, 0xDD, 0xFD, 0xB3, 0xF8, + 0xCC, 0xFF, 0xE4, 0xFA, 0xA6, 0x02, 0x6E, 0xF9, 0x8F, 0x08, 0xC7, 0xF2, + 0xA0, 0x07, 0x25, 0xEC, 0x9C, 0xFE, 0x40, 0xED, 0xE6, 0xF3, 0x62, 0xF3, + 0x20, 0xEE, 0x73, 0xF9, 0xA7, 0xED, 0x14, 0xFD, 0x3A, 0xEE, 0x43, 0xFB, + 0x9B, 0xEE, 0x17, 0xF6, 0xF9, 0xEC, 0xFF, 0xEF, 0xAB, 0xE5, 0x52, 0xEB, + 0x0E, 0xD9, 0x79, 0xE9, 0x00, 0xD3, 0x98, 0xEA, 0x8D, 0xDA, 0x15, 0xED, + 0xEA, 0xE6, 0xDF, 0xEB, 0x48, 0xEE, 0x21, 0xE8, 0x04, 0xF0, 0xB9, 0xE4, + 0x8E, 0xED, 0x62, 0xDC, 0x1A, 0xE3, 0xB3, 0xD1, 0x21, 0xD4, 0xAA, 0xCB, + 0x66, 0xCC, 0x7F, 0xC8, 0xC8, 0xD1, 0x19, 0xC6, 0x09, 0xDC, 0x3A, 0xC3, + 0xC7, 0xDC, 0xF7, 0xC1, 0x9A, 0xD0, 0x1D, 0xC2, 0x01, 0xC3, 0x40, 0xC3, + 0xDE, 0xBE, 0x49, 0xC8, 0x6E, 0xC1, 0x2E, 0xCD, 0xCC, 0xC8, 0x25, 0xCF, + 0x08, 0xD5, 0xA9, 0xD0, 0x72, 0xDC, 0xF9, 0xCE, 0xC9, 0xD7, 0x2F, 0xCA, + 0x4B, 0xCA, 0xE3, 0xC6, 0x7F, 0xBF, 0xFA, 0xC6, 0xF9, 0xBF, 0xE8, 0xCA, + 0x2A, 0xC2, 0xB1, 0xCD, 0xD4, 0xC0, 0x5E, 0xCB, 0xA1, 0xC0, 0xCD, 0xC5, + 0x8D, 0xC0, 0xCC, 0xC2, 0x18, 0xBD, 0x27, 0xC4, 0x7E, 0xB9, 0x8A, 0xC6, + 0xB6, 0xBF, 0x3F, 0xCA, 0x38, 0xD0, 0x14, 0xD1, 0x16, 0xDD, 0xA1, 0xD9, + 0xD7, 0xDB, 0x7F, 0xDE, 0xB5, 0xD1, 0x26, 0xE0, 0x42, 0xC5, 0x50, 0xE0, + 0x55, 0xBC, 0x9F, 0xDC, 0x25, 0xBC, 0x44, 0xD4, 0xBF, 0xC0, 0x83, 0xCC, + 0x87, 0xC4, 0x7E, 0xC6, 0x9F, 0xC6, 0xBD, 0xBE, 0x42, 0xC9, 0x85, 0xBB, + 0xB7, 0xD0, 0xFA, 0xBE, 0x80, 0xDA, 0xBA, 0xC4, 0xC7, 0xE0, 0x08, 0xC9, + 0xC3, 0xE4, 0xF7, 0xC8, 0x09, 0xE5, 0xDE, 0xC5, 0x3B, 0xE2, 0x37, 0xC4, + 0xEA, 0xDE, 0xC8, 0xC2, 0x4B, 0xD8, 0x28, 0xC1, 0x8C, 0xD0, 0xC4, 0xC4, + 0xC1, 0xCE, 0x43, 0xCB, 0xC1, 0xD1, 0x55, 0xCE, 0xB0, 0xD5, 0xA4, 0xCA, + 0x74, 0xD7, 0x8D, 0xC3, 0x51, 0xD5, 0x07, 0xC1, 0xD0, 0xD3, 0x86, 0xC5, + 0xA0, 0xD5, 0x2E, 0xCD, 0x17, 0xD9, 0x57, 0xD7, 0x2B, 0xDC, 0x08, 0xDF, + 0x79, 0xDD, 0x5B, 0xDE, 0x60, 0xD9, 0x7F, 0xD6, 0x62, 0xD2, 0x8D, 0xCC, + 0xBB, 0xCC, 0x4F, 0xC8, 0xBC, 0xC6, 0xE0, 0xC5, 0x16, 0xC4, 0x85, 0xC2, + 0x66, 0xC6, 0xC7, 0xC0, 0x1E, 0xC7, 0x57, 0xBD, 0x57, 0xC4, 0x54, 0xB8, + 0xEB, 0xBF, 0x9D, 0xB8, 0x5E, 0xC2, 0x8F, 0xC1, 0x0D, 0xCD, 0x92, 0xCF, + 0xB6, 0xD6, 0xB8, 0xDB, 0x79, 0xDF, 0x79, 0xE0, 0x7D, 0xE5, 0x76, 0xDD, + 0x94, 0xE3, 0xCF, 0xD5, 0x66, 0xDE, 0xA2, 0xD1, 0xE0, 0xD8, 0x39, 0xD7, + 0x14, 0xD7, 0x47, 0xE2, 0xC5, 0xDE, 0x02, 0xE9, 0xB8, 0xE7, 0x19, 0xE6, + 0x2A, 0xED, 0xEE, 0xDD, 0x27, 0xF1, 0xBD, 0xD8, 0x9C, 0xF4, 0x6A, 0xDA, + 0xFD, 0xF7, 0xD7, 0xE1, 0x3E, 0xF9, 0x0C, 0xED, 0x5D, 0xFA, 0x57, 0xF7, + 0x2D, 0xFE, 0x59, 0xFC, 0x28, 0x02, 0xBC, 0xFE, 0x5D, 0x04, 0x1C, 0x01, + 0x57, 0x01, 0x9F, 0x00, 0x6E, 0xFC, 0xDE, 0xFF, 0x30, 0xFC, 0x1F, 0xFE, + 0xCD, 0xFD, 0xA3, 0xFB, 0x5E, 0xFF, 0x45, 0xFF, 0xCC, 0x01, 0xF0, 0x06, + 0x51, 0x0A, 0xFD, 0x0B, 0x83, 0x19, 0xAD, 0x0D, 0x79, 0x29, 0x5B, 0x10, + 0x43, 0x35, 0x2E, 0x13, 0x07, 0x3B, 0x6D, 0x11, 0xAD, 0x3B, 0xB3, 0x10, + 0x61, 0x37, 0x19, 0x12, 0xBC, 0x2E, 0x83, 0x0F, 0x71, 0x27, 0x4F, 0x0D, + 0x01, 0x24, 0x57, 0x0E, 0x90, 0x21, 0xA1, 0x0F, 0x1D, 0x1E, 0xFF, 0x12, + 0x2E, 0x18, 0x4E, 0x19, 0xFA, 0x16, 0x97, 0x1E, 0x0C, 0x1D, 0xBA, 0x21, + 0xD0, 0x22, 0xE7, 0x24, 0x01, 0x26, 0x06, 0x2B, 0xA8, 0x28, 0x08, 0x31, + 0x06, 0x27, 0xEE, 0x2F, 0xD4, 0x1E, 0x2E, 0x27, 0x6C, 0x15, 0x7D, 0x1B, + 0x8E, 0x14, 0xFC, 0x12, 0x6F, 0x1C, 0x84, 0x0F, 0x0B, 0x24, 0x2D, 0x11, + 0xB3, 0x23, 0xBD, 0x12, 0xFF, 0x1B, 0x9A, 0x11, 0x4A, 0x16, 0x47, 0x0D, + 0x23, 0x12, 0x02, 0x06, 0x89, 0x10, 0xAB, 0x06, 0x01, 0x18, 0xD7, 0x10, + 0xA9, 0x1F, 0x4B, 0x19, 0x4A, 0x1D, 0x2C, 0x1E, 0x37, 0x10, 0xF5, 0x1B, + 0x6B, 0xFE, 0x87, 0x12, 0x5F, 0xF2, 0x18, 0x0A, 0x1B, 0xF0, 0x79, 0x02, + 0x6E, 0xF4, 0x6D, 0xFC, 0x24, 0xFE, 0xF0, 0xF9, 0xDB, 0x04, 0x58, 0xF8, + 0x00, 0x00, 0xF4, 0xF6, 0x0C, 0xF8, 0xEE, 0xF6, 0x5E, 0xF8, 0xDC, 0xF6, + 0x7D, 0xFF, 0xF2, 0xF3, 0xC4, 0x05, 0x71, 0xF1, 0xE2, 0x07, 0x52, 0xF1, + 0xE3, 0x05, 0x4E, 0xF0, 0x4A, 0x00, 0x54, 0xF0, 0x99, 0xF8, 0x42, 0xF2, + 0x38, 0xF3, 0x44, 0xEF, 0xA8, 0xF1, 0x05, 0xE7, 0x96, 0xEF, 0xB0, 0xE1, + 0x95, 0xEB, 0x7B, 0xE3, 0x7C, 0xE8, 0x1B, 0xEA, 0xBC, 0xE9, 0x89, 0xF0, + 0xBE, 0xF0, 0xCB, 0xF5, 0x01, 0xFA, 0x35, 0xF7, 0x1A, 0x03, 0xEB, 0xF6, + 0x36, 0x0E, 0x37, 0xFA, 0xBD, 0x17, 0xF3, 0xFE, 0xED, 0x18, 0xBA, 0x04, + 0xF2, 0x13, 0x1A, 0x07, 0xE1, 0x0F, 0x95, 0x05, 0xE1, 0x0F, 0xE2, 0x03, + 0xF0, 0x0F, 0xF3, 0xFF, 0x77, 0x0D, 0x18, 0x01, 0xB7, 0x0D, 0x73, 0x0A, + 0x84, 0x14, 0x0B, 0x14, 0x8E, 0x1A, 0x31, 0x1C, 0x4F, 0x1F, 0x8E, 0x20, + 0x49, 0x27, 0xB5, 0x22, 0x65, 0x2A, 0x42, 0x2A, 0x8E, 0x26, 0x45, 0x33, + 0x80, 0x25, 0x89, 0x34, 0xFF, 0x25, 0x84, 0x2F, 0x19, 0x22, 0xA5, 0x2A, + 0xEE, 0x1D, 0x2D, 0x2B, 0x0A, 0x1F, 0xC5, 0x30, 0xB5, 0x26, 0xCD, 0x30, + 0x0F, 0x2F, 0x0D, 0x2A, 0xD7, 0x31, 0x6B, 0x27, 0x66, 0x31, 0xAF, 0x28, + 0x5C, 0x33, 0x72, 0x29, 0xB8, 0x37, 0xE7, 0x2F, 0x0F, 0x3E, 0x3F, 0x39, + 0xEC, 0x44, 0xF7, 0x3A, 0x6B, 0x45, 0x9A, 0x37, 0x5D, 0x40, 0x3D, 0x32, + 0x47, 0x3D, 0x05, 0x2B, 0x8B, 0x3A, 0x15, 0x26, 0x56, 0x35, 0x70, 0x29, + 0x37, 0x30, 0xA9, 0x35, 0x96, 0x26, 0xF3, 0x44, 0x35, 0x1C, 0xCD, 0x4F, + 0x6A, 0x1C, 0x1A, 0x51, 0x73, 0x25, 0x8B, 0x4D, 0xEB, 0x2D, 0xB4, 0x4D, + 0xDF, 0x32, 0x39, 0x50, 0x15, 0x39, 0x5D, 0x4E, 0x64, 0x40, 0x46, 0x48, + 0x12, 0x42, 0x65, 0x40, 0x38, 0x3D, 0xBA, 0x3B, 0x9B, 0x3A, 0xE6, 0x3C, + 0xEB, 0x3D, 0xC1, 0x3C, 0xD9, 0x3F, 0x8D, 0x35, 0x6D, 0x3E, 0x12, 0x31, + 0xE9, 0x3A, 0x1A, 0x34, 0xA4, 0x36, 0x21, 0x37, 0x28, 0x3B, 0x96, 0x38, + 0x8D, 0x43, 0xDE, 0x38, 0x91, 0x42, 0x99, 0x3A, 0x56, 0x3E, 0x7D, 0x3E, + 0xFC, 0x3B, 0x86, 0x40, 0xDC, 0x39, 0xE4, 0x3E, 0x8A, 0x39, 0x6D, 0x3D, + 0x8D, 0x39, 0xEC, 0x3E, 0x8D, 0x39, 0xE8, 0x41, 0x12, 0x38, 0xBC, 0x42, + 0xCB, 0x33, 0x1B, 0x3F, 0xC8, 0x31, 0x05, 0x3A, 0x7D, 0x2E, 0x04, 0x37, + 0x08, 0x29, 0xA7, 0x38, 0x74, 0x28, 0x6F, 0x3E, 0x95, 0x2B, 0x9B, 0x47, + 0x45, 0x32, 0xF8, 0x4C, 0x29, 0x37, 0xC1, 0x49, 0x1B, 0x34, 0x79, 0x41, + 0xF9, 0x2B, 0x5F, 0x37, 0xE7, 0x20, 0x2A, 0x2F, 0x29, 0x17, 0x75, 0x2A, + 0x01, 0x11, 0xC1, 0x29, 0xDE, 0x0A, 0xC1, 0x28, 0x82, 0x04, 0x69, 0x21, + 0xA3, 0x03, 0xA6, 0x12, 0x3A, 0x07, 0x56, 0x03, 0x32, 0x06, 0x2A, 0xFD, + 0x45, 0x03, 0xFC, 0x03, 0xE2, 0x05, 0xCE, 0x0E, 0xB1, 0x0B, 0xC4, 0x0F, + 0x68, 0x0F, 0x5A, 0x07, 0x28, 0x0D, 0x19, 0xFA, 0xC3, 0x04, 0x26, 0xEF, + 0x31, 0xFA, 0x0F, 0xEE, 0xA6, 0xF3, 0xBD, 0xF1, 0x46, 0xF3, 0x66, 0xF3, + 0x09, 0xF4, 0xEE, 0xF2, 0x30, 0xEE, 0x13, 0xEF, 0x02, 0xE3, 0x53, 0xE9, + 0x9D, 0xD8, 0xA8, 0xE8, 0x07, 0xD2, 0x0E, 0xEC, 0x3A, 0xD2, 0xEE, 0xF3, + 0x56, 0xD5, 0x8B, 0xFF, 0x7C, 0xD6, 0x72, 0x02, 0xA5, 0xD5, 0x26, 0xFA, + 0x92, 0xD5, 0x93, 0xF1, 0x43, 0xD5, 0x79, 0xEC, 0xE5, 0xD0, 0x84, 0xE8, + 0xCB, 0xCD, 0x85, 0xE6, 0xBC, 0xD2, 0x31, 0xE5, 0xC5, 0xD8, 0xD3, 0xE3, + 0x3D, 0xD7, 0x26, 0xE1, 0xA8, 0xD4, 0xDD, 0xDC, 0x2B, 0xD7, 0x73, 0xD7, + 0x74, 0xDC, 0x01, 0xD4, 0x9D, 0xE0, 0x1E, 0xDA, 0xB2, 0xE2, 0x59, 0xE5, + 0xAE, 0xE5, 0x2A, 0xEA, 0xCF, 0xEA, 0x6B, 0xE8, 0x66, 0xEE, 0xA9, 0xE6, + 0xFB, 0xED, 0xCB, 0xE5, 0x03, 0xE9, 0x37, 0xE7, 0xA9, 0xDF, 0x2D, 0xEB, + 0xFA, 0xD7, 0x1C, 0xEE, 0xB8, 0xD3, 0x0E, 0xEE, 0x6A, 0xD2, 0x41, 0xEA, + 0xD0, 0xD1, 0x3B, 0xE5, 0x55, 0xCE, 0x3C, 0xE3, 0xC2, 0xCB, 0x40, 0xE7, + 0xCB, 0xD2, 0x6C, 0xEF, 0x82, 0xE2, 0x56, 0xF7, 0x35, 0xEC, 0xAA, 0xFA, + 0xE6, 0xEB, 0x18, 0xF8, 0x48, 0xE8, 0xA8, 0xF3, 0xC1, 0xE2, 0x71, 0xF0, + 0xAF, 0xD9, 0x24, 0xF0, 0xFE, 0xD4, 0xE9, 0xEF, 0xD4, 0xD9, 0x74, 0xEB, + 0x31, 0xDE, 0xC1, 0xE5, 0x15, 0xDC, 0x20, 0xE0, 0xEA, 0xD6, 0x58, 0xDA, + 0x63, 0xD3, 0xC8, 0xD7, 0x51, 0xD3, 0x51, 0xD9, 0xD8, 0xD7, 0xEB, 0xDD, + 0xD0, 0xE0, 0x26, 0xE2, 0x74, 0xE9, 0xCD, 0xE2, 0x41, 0xEC, 0x7A, 0xE1, + 0xED, 0xEA, 0x44, 0xDF, 0xF2, 0xEA, 0x2E, 0xDF, 0xDD, 0xED, 0x82, 0xE5, + 0x6E, 0xEF, 0xFD, 0xEC, 0x95, 0xEC, 0x59, 0xF1, 0x6E, 0xE7, 0x34, 0xF5, + 0x93, 0xE2, 0x0E, 0xF7, 0x7A, 0xDF, 0x44, 0xF3, 0x26, 0xDD, 0xD5, 0xEE, + 0xBB, 0xDA, 0x08, 0xEE, 0x49, 0xDA, 0x48, 0xF1, 0x13, 0xDF, 0x78, 0xFA, + 0x42, 0xE8, 0x2C, 0x04, 0x7E, 0xEE, 0x8A, 0x06, 0x42, 0xF0, 0x8F, 0x02, + 0x5A, 0xF3, 0x36, 0xFC, 0xE7, 0xF3, 0x48, 0xF6, 0xFC, 0xF1, 0xD4, 0xF6, + 0x51, 0xF4, 0x8C, 0xFE, 0x92, 0xF6, 0x8B, 0x05, 0xDF, 0xF4, 0x6C, 0x05, + 0x9B, 0xF6, 0xD1, 0xFF, 0x8C, 0xFE, 0x7E, 0xF6, 0x20, 0x06, 0x0D, 0xEE, + 0xCD, 0x08, 0xC6, 0xEC, 0x94, 0x08, 0xA5, 0xEF, 0x31, 0x08, 0x90, 0xF0, + 0x50, 0x09, 0x04, 0xEF, 0xAB, 0x0C, 0x68, 0xEE, 0x08, 0x0D, 0xC8, 0xEF, + 0x82, 0x06, 0xE5, 0xF6, 0x7F, 0x00, 0xF1, 0x01, 0xA0, 0x01, 0x5B, 0x05, + 0x2F, 0x04, 0x73, 0xFE, 0xA6, 0x04, 0xF6, 0xF7, 0x89, 0x03, 0x50, 0xF8, + 0x26, 0x00, 0xAF, 0xFB, 0xE2, 0xFE, 0x4C, 0xFF, 0x62, 0x00, 0xC5, 0x01, + 0x9B, 0xFE, 0xDD, 0x01, 0x9A, 0xFB, 0x0E, 0xFF, 0x62, 0xFE, 0x3E, 0xFD, + 0x26, 0x07, 0x65, 0xFF, 0x57, 0x0C, 0x8C, 0x01, 0x02, 0x06, 0xCE, 0x00, + 0xA8, 0xF9, 0xA0, 0xF8, 0x9C, 0xEF, 0xDC, 0xEC, 0x3D, 0xEC, 0x1D, 0xE6, + 0xB6, 0xF0, 0x04, 0xE8, 0x1E, 0xF7, 0x72, 0xF2, 0xB6, 0xF8, 0x26, 0xFB, + 0x5A, 0xF4, 0xB1, 0xFD, 0x21, 0xEF, 0xC2, 0xF9, 0x46, 0xEB, 0x55, 0xF0, + 0xC6, 0xE6, 0x4D, 0xEB, 0x51, 0xE6, 0xED, 0xED, 0x08, 0xEE, 0x07, 0xF2, + 0xED, 0xFB, 0x65, 0xF7, 0x73, 0x04, 0x89, 0xFB, 0x45, 0x00, 0x54, 0xF8, + 0xD9, 0xF6, 0x78, 0xF4, 0xFB, 0xF3, 0x24, 0xF3, 0x94, 0xF9, 0x7D, 0xED, + 0x3E, 0xFC, 0x0F, 0xEA, 0x53, 0xF8, 0x25, 0xED, 0xEE, 0xF2, 0x68, 0xEE, + 0x73, 0xF1, 0xCA, 0xEB, 0x32, 0xF3, 0x03, 0xEA, 0x30, 0xF3, 0xDF, 0xEB, + 0x6F, 0xF1, 0xDD, 0xED, 0x8A, 0xF0, 0x3B, 0xEF, 0xA7, 0xEF, 0x3C, 0xEF, + 0x43, 0xEC, 0xDD, 0xEC, 0x36, 0xE8, 0x24, 0xE9, 0x18, 0xEA, 0x07, 0xE3, + 0x29, 0xEF, 0x43, 0xDC, 0x6C, 0xF0, 0x19, 0xD9, 0x84, 0xF2, 0x2A, 0xDC, + 0x7C, 0xF9, 0x20, 0xE2, 0x27, 0xFF, 0x5F, 0xE8, 0x6F, 0xFF, 0xB6, 0xEB, + 0x5E, 0xFF, 0x8F, 0xE7, 0x80, 0x00, 0x1B, 0xE0, 0x57, 0xFE, 0x32, 0xDE, + 0x77, 0xF9, 0x51, 0xE4, 0x39, 0xF8, 0xD1, 0xE9, 0x3E, 0xFB, 0x0B, 0xE9, + 0x23, 0xFD, 0x64, 0xE5, 0x9A, 0xF7, 0x3E, 0xE3, 0x07, 0xEA, 0x3C, 0xE5, + 0x28, 0xDE, 0x20, 0xE8, 0x54, 0xDB, 0xE1, 0xE8, 0x70, 0xE0, 0x73, 0xE6, + 0x35, 0xE8, 0xDD, 0xE2, 0xAE, 0xF0, 0xFE, 0xE1, 0xB1, 0xF5, 0x66, 0xE3, + 0x64, 0xF3, 0x38, 0xE6, 0x02, 0xF0, 0x96, 0xEA, 0x2F, 0xF1, 0xB7, 0xE9, + 0xDE, 0xF5, 0xD0, 0xE0, 0x5B, 0xF8, 0x47, 0xD6, 0x92, 0xF7, 0x7E, 0xCF, + 0x4D, 0xF8, 0xD8, 0xCF, 0x04, 0xF9, 0x30, 0xD5, 0xD4, 0xF6, 0x3F, 0xDC, + 0x50, 0xF4, 0x86, 0xE1, 0x4F, 0xF2, 0x51, 0xE3, 0xB0, 0xED, 0x21, 0xE4, + 0xFC, 0xE4, 0x0A, 0xE7, 0x55, 0xDB, 0xE0, 0xEB, 0x9D, 0xD4, 0x0E, 0xF0, + 0x09, 0xD2, 0xC4, 0xF1, 0x07, 0xD5, 0x04, 0xF1, 0xA5, 0xDC, 0x8C, 0xF0, + 0x32, 0xE7, 0x56, 0xF0, 0xEC, 0xED, 0x86, 0xED, 0x9E, 0xEA, 0x4C, 0xE5, + 0x53, 0xE4, 0xBF, 0xDB, 0xFE, 0xDE, 0xB9, 0xD9, 0x30, 0xD9, 0x63, 0xDE, + 0x8D, 0xD6, 0xA6, 0xE0, 0x2C, 0xDF, 0xE7, 0xDD, 0x60, 0xEF, 0xA3, 0xDB, + 0xA1, 0xF4, 0x63, 0xDC, 0xF5, 0xEC, 0x5D, 0xDE, 0x61, 0xE5, 0x62, 0xE0, + 0x68, 0xE4, 0x52, 0xE1, 0x1A, 0xE8, 0x47, 0xE1, 0x13, 0xE9, 0x5F, 0xDF, + 0x7D, 0xE4, 0x47, 0xDA, 0x98, 0xDF, 0xBB, 0xD5, 0x59, 0xDF, 0xAB, 0xD6, + 0x1B, 0xE0, 0x63, 0xDC, 0xD9, 0xDE, 0xBD, 0xE2, 0x69, 0xE1, 0xCD, 0xE7, + 0xE9, 0xE6, 0x04, 0xE8, 0x6E, 0xEB, 0x82, 0xE4, 0x67, 0xEE, 0x03, 0xE3, + 0x90, 0xED, 0x09, 0xE5, 0x8F, 0xEC, 0xAC, 0xE8, 0xDA, 0xF0, 0xD6, 0xEC, + 0x89, 0xF9, 0xF6, 0xEF, 0x8D, 0x01, 0xC0, 0xF0, 0xD2, 0xFE, 0x89, 0xF3, + 0x8E, 0xF4, 0x7F, 0xF7, 0xAB, 0xED, 0x7A, 0xF4, 0x86, 0xE8, 0x4E, 0xEF, + 0xB8, 0xE7, 0x97, 0xF0, 0x37, 0xEB, 0x41, 0xF7, 0x9E, 0xEF, 0x7D, 0xFF, + 0x51, 0xF5, 0x4B, 0x05, 0x34, 0xFB, 0xEA, 0x06, 0xCE, 0x01, 0x38, 0x01, + 0xD8, 0x06, 0x43, 0xFB, 0x29, 0x0A, 0xEF, 0xF8, 0x51, 0x0D, 0x72, 0xF5, + 0x26, 0x10, 0x4B, 0xF5, 0x41, 0x14, 0x6E, 0xFB, 0xE5, 0x16, 0x46, 0x03, + 0x8D, 0x13, 0xFC, 0x04, 0x03, 0x0F, 0x5A, 0x04, 0xD6, 0x0F, 0x39, 0x06, + 0x44, 0x13, 0x2F, 0x0B, 0x70, 0x11, 0x4C, 0x11, 0xF1, 0x10, 0xB2, 0x11, + 0x45, 0x17, 0x8A, 0x0B, 0xE5, 0x1A, 0xC1, 0x05, 0xA7, 0x19, 0xFC, 0x09, + 0xA5, 0x14, 0x45, 0x17, 0xE3, 0x0F, 0xEE, 0x22, 0x06, 0x10, 0x0A, 0x28, + 0xA2, 0x13, 0x13, 0x27, 0xC1, 0x16, 0xBF, 0x21, 0xEA, 0x15, 0x5A, 0x1C, + 0x54, 0x13, 0x16, 0x19, 0x68, 0x10, 0x54, 0x15, 0x48, 0x10, 0x45, 0x13, + 0xC5, 0x13, 0xA6, 0x17, 0x3D, 0x16, 0xCC, 0x1E, 0xC0, 0x1E, 0xD4, 0x20, + 0xAE, 0x2E, 0x8C, 0x1A, 0x1B, 0x38, 0x30, 0x12, 0xC4, 0x35, 0xDF, 0x0E, + 0x16, 0x2C, 0xF1, 0x0F, 0xAB, 0x21, 0x5F, 0x11, 0x3D, 0x1A, 0x2E, 0x11, + 0x2C, 0x19, 0x0E, 0x12, 0x01, 0x1C, 0xFD, 0x13, 0x8B, 0x1B, 0xB6, 0x16, + 0xAE, 0x1A, 0xFB, 0x1C, 0xD6, 0x19, 0x47, 0x23, 0x3E, 0x18, 0xB0, 0x26, + 0xB2, 0x1B, 0xFA, 0x28, 0xC5, 0x25, 0x9B, 0x2B, 0x8D, 0x2D, 0x97, 0x2C, + 0xBD, 0x2F, 0x2A, 0x2C, 0xAD, 0x30, 0x7B, 0x2D, 0x83, 0x31, 0xBB, 0x30, + 0x6B, 0x2E, 0x9B, 0x32, 0xED, 0x28, 0x01, 0x32, 0x3F, 0x27, 0xB6, 0x32, + 0xE3, 0x26, 0xCD, 0x35, 0xD4, 0x22, 0x7C, 0x3B, 0x70, 0x1B, 0xAD, 0x41, + 0x02, 0x18, 0x7F, 0x45, 0x34, 0x19, 0x8C, 0x43, 0x8F, 0x1D, 0x4F, 0x3D, + 0xCC, 0x21, 0x6F, 0x38, 0xE7, 0x21, 0x3A, 0x30, 0xFC, 0x22, 0x96, 0x22, + 0x4D, 0x24, 0xC5, 0x17, 0xBA, 0x23, 0x3B, 0x12, 0x66, 0x20, 0x54, 0x0F, + 0xC9, 0x1A, 0x31, 0x10, 0x47, 0x15, 0xBC, 0x12, 0x29, 0x13, 0xEC, 0x16, + 0xC2, 0x18, 0x32, 0x1D, 0x31, 0x1B, 0x30, 0x1C, 0x36, 0x18, 0x86, 0x17, + 0xC1, 0x14, 0x4C, 0x19, 0x00, 0x10, 0x40, 0x1C, 0x98, 0x16, 0x33, 0x1E, + 0x5E, 0x1F, 0x65, 0x1D, 0x44, 0x1B, 0x15, 0x17, 0xE2, 0x17, 0x97, 0x12, + 0x83, 0x15, 0x80, 0x0B, 0x03, 0x0B, 0xAF, 0x01, 0x8A, 0xFE, 0x2B, 0x01, + 0xB3, 0xF6, 0x02, 0x0B, 0x85, 0xF3, 0xB5, 0x15, 0xF5, 0xF6, 0x91, 0x16, + 0xF6, 0xFB, 0x6C, 0x0F, 0x46, 0xFF, 0xF7, 0x0C, 0x62, 0x05, 0xD9, 0x12, + 0xE1, 0x08, 0x4A, 0x18, 0x1B, 0x0A, 0x33, 0x1C, 0x38, 0x11, 0xA1, 0x20, + 0x6E, 0x17, 0x84, 0x1D, 0xE4, 0x15, 0x8E, 0x14, 0x48, 0x10, 0x3D, 0x11, + 0x72, 0x0A, 0x47, 0x11, 0x85, 0x10, 0x4A, 0x14, 0xA3, 0x1F, 0xC3, 0x1C, + 0x55, 0x26, 0x03, 0x27, 0x94, 0x24, 0x74, 0x2D, 0xFC, 0x24, 0xAB, 0x2C, + 0x7A, 0x2D, 0x9A, 0x2B, 0x69, 0x36, 0x0D, 0x2D, 0x3C, 0x38, 0xA5, 0x32, + 0x19, 0x35, 0x4C, 0x38, 0x63, 0x38, 0x86, 0x38, 0x6A, 0x39, 0x21, 0x37, + 0xDF, 0x33, 0x27, 0x38, 0xA6, 0x2F, 0x6E, 0x33, 0x65, 0x2A, 0xF6, 0x30, + 0xAE, 0x29, 0x22, 0x33, 0x08, 0x32, 0xA9, 0x31, 0x24, 0x35, 0x23, 0x32, + 0x44, 0x30, 0x26, 0x37, 0x40, 0x2A, 0xC0, 0x39, 0x9B, 0x27, 0xE1, 0x38, + 0x2C, 0x29, 0x68, 0x3C, 0xEF, 0x2C, 0x8D, 0x40, 0xEC, 0x2D, 0x89, 0x42, + 0x50, 0x29, 0x8F, 0x3E, 0xCA, 0x2B, 0x50, 0x31, 0x93, 0x2E, 0x49, 0x22, + 0x12, 0x2B, 0x93, 0x1B, 0x7C, 0x25, 0x8C, 0x19, 0xA8, 0x1C, 0x2E, 0x1A, + 0x30, 0x1A, 0x1B, 0x22, 0xD9, 0x1D, 0xAD, 0x28, 0x20, 0x20, 0xF2, 0x2B, + 0xA5, 0x20, 0xED, 0x2B, 0x5E, 0x21, 0x94, 0x28, 0x93, 0x24, 0xB7, 0x2A, + 0x01, 0x25, 0xB9, 0x2A, 0xD6, 0x1F, 0x54, 0x23, 0xBE, 0x19, 0xBF, 0x1D, + 0x5F, 0x14, 0x3F, 0x1C, 0xBB, 0x11, 0xDD, 0x1E, 0x6E, 0x13, 0xB4, 0x22, + 0x1E, 0x0F, 0x8D, 0x22, 0xC7, 0x01, 0x61, 0x1B, 0x52, 0xF9, 0x58, 0x13, + 0x5B, 0xF7, 0xE0, 0x0D, 0xD7, 0xFD, 0x17, 0x0E, 0x67, 0x07, 0x08, 0x15, + 0x9C, 0x06, 0x4C, 0x1C, 0xDC, 0x03, 0xE4, 0x22, 0x55, 0x07, 0xB7, 0x21, + 0x6D, 0x0C, 0x36, 0x1A, 0x9C, 0x10, 0x73, 0x12, 0x7B, 0x0F, 0x37, 0x0A, + 0x0E, 0x09, 0xA0, 0x03, 0x96, 0x06, 0x7D, 0xFC, 0x26, 0x03, 0xA3, 0xF3, + 0x63, 0xFD, 0x5B, 0xF1, 0x0C, 0xF6, 0x53, 0xF5, 0xDD, 0xEE, 0xC8, 0xF9, + 0xC0, 0xF2, 0x29, 0xFE, 0x9C, 0xF7, 0x2C, 0xFB, 0x6D, 0xFA, 0x29, 0xF5, + 0x23, 0x02, 0x3F, 0xF5, 0xB4, 0xFD, 0x4C, 0xEE, 0xA4, 0xF4, 0x33, 0xEB, + 0x3E, 0xED, 0x6B, 0xEE, 0x2A, 0xEB, 0xE6, 0xE8, 0xF3, 0xEF, 0x3D, 0xDF, + 0xCA, 0xF2, 0x37, 0xD9, 0x90, 0xF0, 0x88, 0xD8, 0x24, 0xE3, 0xAB, 0xD9, + 0xA9, 0xD5, 0x4F, 0xE0, 0x8C, 0xCA, 0x41, 0xE6, 0x4F, 0xBD, 0x97, 0xE2, + 0x55, 0xBC, 0x68, 0xDD, 0xA2, 0xC9, 0x19, 0xDE, 0xC1, 0xCB, 0x20, 0xDB, + 0xFC, 0xBE, 0xEE, 0xD1, 0x54, 0xB7, 0x99, 0xC9, 0x19, 0xBC, 0xB3, 0xC1, + 0x17, 0xC6, 0x5C, 0xBC, 0xF8, 0xCD, 0x3E, 0xC0, 0x8F, 0xCF, 0xE0, 0xC6, + 0x22, 0xC9, 0xDF, 0xC6, 0xAE, 0xC0, 0x00, 0xC2, 0x99, 0xBE, 0xB0, 0xC0, + 0x99, 0xBD, 0x29, 0xC2, 0x49, 0xBC, 0xF8, 0xC1, 0x39, 0xC9, 0xB8, 0xCB, + 0xA7, 0xD6, 0x3C, 0xD6, 0x3B, 0xD8, 0x39, 0xD9, 0xFB, 0xD5, 0x16, 0xDC, + 0xE1, 0xD0, 0xB2, 0xD3, 0xC0, 0xCA, 0x42, 0xC4, 0x4D, 0xCF, 0x6A, 0xC1, + 0x2B, 0xD7, 0x89, 0xC1, 0x4D, 0xD5, 0x56, 0xBD, 0x3D, 0xC9, 0x88, 0xBB, + 0xFD, 0xBF, 0xEC, 0xC3, 0x78, 0xBD, 0x56, 0xCC, 0x7E, 0xBA, 0xDC, 0xD1, + 0x44, 0xB4, 0xBC, 0xD6, 0x06, 0xB5, 0xAD, 0xD8, 0x17, 0xC2, 0x71, 0xDC, + 0x6C, 0xD3, 0x59, 0xE2, 0xF4, 0xDA, 0xFD, 0xDF, 0x52, 0xD5, 0xAF, 0xD8, + 0xCA, 0xD5, 0xD0, 0xD8, 0x50, 0xD9, 0xE0, 0xCF, 0x6E, 0xE3, 0x3F, 0xCB, + 0x60, 0xE9, 0xA8, 0xD3, 0xD2, 0xE0, 0x4C, 0xD7, 0x86, 0xDF, 0xD1, 0xD9, + 0x0A, 0xE5, 0xE2, 0xDA, 0xF5, 0xEB, 0x73, 0xE2, 0x72, 0xEF, 0xD3, 0xED, + 0x21, 0xED, 0xE1, 0xEE, 0x17, 0xEC, 0x80, 0xEE, 0x3D, 0xEC, 0x0E, 0xED, + 0xCF, 0xEE, 0xB1, 0xEA, 0x99, 0xEB, 0xF3, 0xE5, 0xE1, 0xE4, 0x20, 0xDF, + 0x88, 0xEA, 0xA1, 0xDE, 0xA2, 0xED, 0x88, 0xDD, 0x40, 0xEE, 0x0C, 0xE3, + 0xAE, 0xEE, 0xC2, 0xEC, 0x26, 0xE3, 0xB5, 0xEA, 0xCB, 0xDB, 0x51, 0xE7, + 0xA2, 0xDF, 0x5D, 0xE8, 0xC4, 0xE8, 0x70, 0xED, 0x20, 0xF1, 0xAB, 0xF7, + 0x15, 0xF5, 0xED, 0xFB, 0xFB, 0xFD, 0xE5, 0xF5, 0xC8, 0x0B, 0xE8, 0xED, + 0x85, 0x0B, 0x52, 0xE3, 0xCC, 0x06, 0x61, 0xE0, 0xCD, 0xFE, 0x35, 0xDF, + 0x6D, 0xF2, 0x31, 0xDC, 0xBC, 0xEE, 0x8C, 0xE1, 0x32, 0xEB, 0xCB, 0xDF, + 0x0E, 0xE7, 0x1C, 0xE1, 0x93, 0xE2, 0x34, 0xED, 0xB1, 0xE1, 0x08, 0xF8, + 0xB3, 0xE2, 0x90, 0xFA, 0xA3, 0xE3, 0x59, 0xF8, 0xFF, 0xEA, 0x40, 0xF9, + 0x92, 0xE9, 0xFD, 0xED, 0x26, 0xE6, 0x2C, 0xE3, 0x01, 0xEB, 0x1F, 0xE4, + 0x8E, 0xE7, 0x25, 0xE1, 0x5C, 0xE1, 0xE0, 0xE0, 0xD3, 0xDC, 0x6E, 0xE1, + 0xD6, 0xD6, 0xDA, 0xD9, 0x7D, 0xD6, 0x52, 0xDA, 0x23, 0xD8, 0xB9, 0xE2, + 0x97, 0xD2, 0x88, 0xDE, 0x36, 0xD5, 0x31, 0xDC, 0x7B, 0xD9, 0x1C, 0xDD, + 0x79, 0xD6, 0xDF, 0xD4, 0x03, 0xE4, 0x55, 0xD7, 0xF5, 0xF6, 0xA3, 0xDE, + 0x30, 0x00, 0x2D, 0xDD, 0x40, 0x06, 0xD5, 0xDB, 0x79, 0x03, 0x34, 0xD9, + 0xD2, 0xF8, 0xF7, 0xD5, 0x10, 0xF1, 0x60, 0xD8, 0xFA, 0xED, 0x17, 0xDE, + 0x17, 0xEF, 0x33, 0xE2, 0xBD, 0xF7, 0x66, 0xEA, 0x62, 0xFC, 0xC0, 0xEF, + 0xF5, 0x05, 0x2C, 0xFB, 0xA4, 0x10, 0x31, 0x08, 0xCF, 0x0C, 0x93, 0x06, + 0x87, 0x0A, 0xEB, 0x05, 0x17, 0x05, 0x2F, 0x01, 0x08, 0x04, 0xD6, 0xFE, + 0xF3, 0x08, 0x61, 0x01, 0x8B, 0x09, 0xE0, 0x05, 0x25, 0x07, 0x6E, 0x0D, + 0x87, 0xFF, 0xE5, 0x0E, 0x58, 0x03, 0xF1, 0x17, 0x22, 0x11, 0x23, 0x25, + 0xB7, 0x14, 0xFE, 0x21, 0x9C, 0x16, 0xB8, 0x1E, 0x17, 0x1C, 0x37, 0x24, + 0x9B, 0x1A, 0xE7, 0x23, 0x42, 0x1A, 0xE4, 0x21, 0x3C, 0x1B, 0x77, 0x1A, + 0xB9, 0x20, 0xFB, 0x11, 0xBE, 0x26, 0x45, 0x0C, 0xBB, 0x2C, 0x5D, 0x0C, + 0xF6, 0x2C, 0xCD, 0x0D, 0x84, 0x1C, 0x09, 0x0A, 0xA6, 0x0D, 0x5F, 0x0A, + 0x46, 0x06, 0x89, 0x08, 0x98, 0x11, 0x55, 0x13, 0x8B, 0x19, 0x0F, 0x1C, + 0xEC, 0x19, 0x10, 0x1C, 0x5E, 0x16, 0xF6, 0x13, 0xC3, 0x18, 0x89, 0x0D, + 0xDA, 0x1F, 0x81, 0x0E, 0x93, 0x13, 0x3B, 0x09, 0xBC, 0x0E, 0x84, 0x12, + 0x46, 0x08, 0xEE, 0x10, 0x83, 0x04, 0xFE, 0x08, 0xC4, 0x06, 0xDE, 0x0A, + 0xF5, 0x03, 0x8E, 0x0C, 0x3F, 0x03, 0x25, 0x0B, 0x22, 0x04, 0x0B, 0x06, + 0xE5, 0x09, 0x5F, 0x0B, 0x80, 0x05, 0xD7, 0x0C, 0xBF, 0x01, 0xE7, 0x08, + 0xAA, 0x06, 0x27, 0x04, 0x4C, 0x0E, 0xCC, 0xFD, 0xFF, 0x16, 0x33, 0xFA, + 0xBF, 0x19, 0x3F, 0xF8, 0x79, 0x17, 0xA8, 0xF6, 0x40, 0x18, 0x2E, 0xF6, + 0xEA, 0x16, 0x09, 0xF6, 0xCD, 0x0E, 0x89, 0xF4, 0xD9, 0x09, 0x06, 0xF2, + 0xF0, 0x02, 0x25, 0xED, 0xE6, 0xFD, 0x89, 0xF4, 0x4F, 0xF8, 0x66, 0xFC, + 0x3B, 0xF3, 0x2D, 0xFB, 0x1B, 0x00, 0x27, 0x0A, 0xB6, 0x01, 0x0F, 0x0E, + 0x78, 0xFE, 0x4F, 0x05, 0x57, 0x05, 0x6B, 0x02, 0x44, 0x06, 0x70, 0x00, + 0x0F, 0x06, 0xB3, 0x06, 0x5F, 0xF7, 0x84, 0x04, 0xD1, 0xE8, 0x1B, 0x00, + 0x6D, 0xE9, 0xB2, 0x00, 0x43, 0xF1, 0x3C, 0x01, 0xC7, 0xF4, 0xF6, 0x01, + 0x46, 0xF5, 0x98, 0x05, 0xB1, 0xF9, 0xF5, 0x0A, 0xD8, 0x00, 0xBC, 0x0E, + 0x13, 0x09, 0x2F, 0x10, 0xAE, 0x0D, 0xC9, 0x0A, 0x42, 0x17, 0x85, 0x09, + 0x76, 0x19, 0xE6, 0x04, 0x0E, 0x1D, 0x3E, 0x02, 0x9A, 0x24, 0x13, 0x05, + 0x29, 0x1E, 0xE7, 0x01, 0x9B, 0x14, 0x73, 0xFE, 0x3D, 0x11, 0x1A, 0xF9, + 0x7D, 0x15, 0x34, 0xFB, 0xB6, 0x17, 0x14, 0x09, 0xE1, 0x12, 0x29, 0x13, + 0xF9, 0x11, 0x7A, 0x16, 0x85, 0x14, 0x9A, 0x15, 0x00, 0x1C, 0x13, 0x19, + 0xFC, 0x21, 0x28, 0x1A, 0xDB, 0x1C, 0xA7, 0x13, 0xE1, 0x18, 0xF8, 0x14, + 0x4F, 0x13, 0xA2, 0x18, 0x14, 0x0C, 0xDE, 0x18, 0xFF, 0x02, 0xA1, 0x10, + 0x37, 0x03, 0x6B, 0x0B, 0xB8, 0x09, 0x82, 0x0F, 0x68, 0x03, 0x62, 0x0C, + 0x04, 0x04, 0x69, 0x0F, 0x08, 0x02, 0xB1, 0x0C, 0xC1, 0xFB, 0x18, 0x06, + 0x2C, 0x03, 0x19, 0x0F, 0xC9, 0xFE, 0x34, 0x09, 0xCA, 0x02, 0x91, 0x07, + 0x76, 0x0F, 0x60, 0x10, 0x5C, 0x12, 0xC0, 0x16, 0x1E, 0x18, 0x6B, 0x1F, + 0x57, 0x19, 0x1A, 0x21, 0x75, 0x15, 0x8C, 0x1D, 0x8C, 0x11, 0x75, 0x17, + 0x2D, 0x11, 0xC0, 0x0E, 0x14, 0x16, 0x23, 0x0B, 0x5F, 0x1D, 0xA4, 0x0E, + 0x0F, 0x1E, 0x77, 0x12, 0xE6, 0x17, 0x62, 0x14, 0x1E, 0x10, 0xE3, 0x11, + 0x69, 0x1F, 0xC1, 0x21, 0xDD, 0x2F, 0xDF, 0x31, 0xCD, 0x30, 0x1C, 0x34, + 0xEC, 0x31, 0x86, 0x38, 0xEE, 0x22, 0xE1, 0x2C, 0xDF, 0x22, 0xF2, 0x28, + 0xD4, 0x25, 0x18, 0x24, 0xFE, 0x1A, 0x54, 0x15, 0x1D, 0x15, 0xFB, 0x11, + 0x32, 0x0F, 0x08, 0x14, 0x5E, 0x13, 0xA8, 0x21, 0x02, 0x17, 0x20, 0x28, + 0x75, 0x15, 0x2A, 0x25, 0x71, 0x10, 0xE2, 0x1F, 0x4F, 0x0F, 0x98, 0x19, + 0x45, 0x17, 0x77, 0x17, 0xA9, 0x19, 0xAB, 0x11, 0x77, 0x18, 0x2A, 0x0D, + 0xFC, 0x17, 0x42, 0x0E, 0xF9, 0x14, 0x63, 0x12, 0x71, 0x09, 0xEC, 0x0A, + 0xA4, 0x07, 0x95, 0x08, 0xFF, 0x03, 0xB6, 0x07, 0x1B, 0xF7, 0xCF, 0x02, + 0x9A, 0xF9, 0xF9, 0x09, 0xBE, 0xFC, 0x70, 0x0B, 0xC9, 0x00, 0xFD, 0x0E, + 0x77, 0xF9, 0x06, 0x0E, 0x57, 0xF7, 0xA9, 0x10, 0x71, 0x00, 0x30, 0x15, + 0x19, 0x0B, 0x71, 0x15, 0xDB, 0x10, 0xD0, 0x0E, 0xC3, 0x0D, 0xD6, 0x04, + 0x9C, 0x05, 0xBF, 0x03, 0xD3, 0xF5, 0x1F, 0xFE, 0xFC, 0xF7, 0xFB, 0xFC, + 0x1B, 0xFF, 0x62, 0xFE, 0x88, 0xFA, 0x1E, 0xFC, 0xB9, 0xF8, 0x50, 0x00, + 0x74, 0x0E, 0xD5, 0x19, 0x59, 0x10, 0xE3, 0x1A, 0x94, 0x0A, 0x30, 0x0D, + 0x39, 0x16, 0xF3, 0x12, 0xD8, 0x0B, 0xED, 0x09, 0xE2, 0x13, 0x93, 0x14, + 0x14, 0x1F, 0x58, 0x21, 0x83, 0x1C, 0xF3, 0x1D, 0x53, 0x12, 0x88, 0x12, + 0x18, 0x07, 0x78, 0x0A, 0xB5, 0x0A, 0x79, 0x12, 0x9D, 0x08, 0x4D, 0x0F, + 0x04, 0x09, 0x6B, 0x0F, 0x8D, 0x08, 0x3C, 0x18, 0x83, 0x04, 0x9D, 0x21, + 0xCB, 0x00, 0x2C, 0x22, 0x59, 0x07, 0x63, 0x1D, 0xDA, 0x13, 0x1B, 0x1C, + 0xB8, 0x16, 0xE6, 0x19, 0xA9, 0x23, 0x2F, 0x21, 0xFA, 0x2A, 0x6A, 0x20, + 0xEA, 0x16, 0x12, 0x0C, 0xC4, 0x0F, 0x7C, 0x0C, 0x27, 0x18, 0x5B, 0x1A, + 0x43, 0x0C, 0x9A, 0x10, 0xC5, 0x0D, 0xAB, 0x10, 0x02, 0x1D, 0x7E, 0x1E, + 0x14, 0x19, 0x19, 0x21, 0xDD, 0x14, 0xB8, 0x28, 0xC6, 0x0E, 0x6C, 0x2C, + 0xBD, 0x09, 0xDE, 0x26, 0x19, 0x06, 0x1B, 0x1A, 0xDD, 0x0B, 0x06, 0x16, + 0x5D, 0x16, 0x1F, 0x19, 0xD9, 0x0C, 0x47, 0x06, 0xD3, 0x0E, 0xEF, 0x01, + 0x3D, 0x17, 0x19, 0x10, 0x82, 0x0D, 0x99, 0x13, 0xAE, 0x05, 0x91, 0x16, + 0xE3, 0x05, 0xFD, 0x14, 0x4C, 0x0D, 0xE9, 0x13, 0x46, 0x0D, 0x28, 0x16, + 0x37, 0x05, 0xD9, 0x18, 0xA4, 0x0A, 0x06, 0x22, 0xA0, 0x0B, 0x01, 0x20, + 0xBA, 0x05, 0x03, 0x17, 0xBC, 0x0C, 0xD5, 0x14, 0x70, 0x0E, 0x6B, 0x0B, + 0x70, 0x0B, 0xE6, 0x04, 0x42, 0x04, 0x9C, 0xFF, 0xB7, 0x04, 0x38, 0x03, + 0x2C, 0xFB, 0xCE, 0xF7, 0x7A, 0xF5, 0xB1, 0xEE, 0xA1, 0x04, 0x9D, 0x01, + 0x7E, 0xFE, 0x98, 0x07, 0x00, 0xFC, 0x99, 0x08, 0xA1, 0xFB, 0x3A, 0x04, + 0x44, 0xF8, 0x6B, 0x04, 0x01, 0xF3, 0xAC, 0x06, 0x5A, 0xE8, 0xE1, 0xF8, + 0xE6, 0xF1, 0x6F, 0xF6, 0x3C, 0xF7, 0xDC, 0xF8, 0x74, 0xF6, 0xAB, 0xFA, + 0x81, 0xFE, 0xB0, 0x00, 0x32, 0xFD, 0xE1, 0xFC, 0xF0, 0xF9, 0xE8, 0xFB, + 0x55, 0xF2, 0xF6, 0xF6, 0x73, 0xF7, 0xCC, 0xFF, 0xEE, 0xF3, 0x26, 0x00, + 0x0A, 0xFA, 0x7A, 0xFD, 0x70, 0x0F, 0x5B, 0x04, 0x48, 0x16, 0x01, 0x05, + 0x68, 0x11, 0xA4, 0xFE, 0x2D, 0x0A, 0xF3, 0xF7, 0xBE, 0x05, 0xAB, 0xF6, + 0xAC, 0xFD, 0xF6, 0xEF, 0x80, 0xFE, 0x33, 0xF1, 0x70, 0x02, 0x4F, 0xFC, + 0xA2, 0xF7, 0x52, 0xF3, 0x2C, 0xF2, 0x96, 0xE5, 0xC0, 0xFD, 0x19, 0xF0, + 0x03, 0xFC, 0x48, 0xF8, 0x25, 0xFA, 0xD8, 0xFF, 0x13, 0x02, 0x95, 0x07, + 0x55, 0x07, 0xD7, 0x06, 0xF2, 0xF9, 0x38, 0xEE, 0x81, 0xF1, 0x04, 0xDC, + 0xB0, 0xFA, 0x12, 0xE3, 0x54, 0xFA, 0x6A, 0xE4, 0x09, 0xF2, 0x23, 0xDC, + 0x67, 0xF5, 0x04, 0xE1, 0x6C, 0xF6, 0xE3, 0xED, 0x75, 0xEF, 0xBD, 0xF0, + 0xD4, 0xF5, 0xEB, 0xF9, 0x44, 0xF7, 0x97, 0xFD, 0xC7, 0xE9, 0x21, 0xF6, + 0x27, 0xED, 0xC8, 0x00, 0x18, 0xF2, 0xBA, 0x0C, 0x28, 0xE7, 0x12, 0x04, + 0xDC, 0xDE, 0xAE, 0xF3, 0x2B, 0xDF, 0xD1, 0xEA, 0xFD, 0xE9, 0x2C, 0xF0, + 0xC9, 0xE4, 0x3C, 0xEC, 0x18, 0xDF, 0x38, 0xEF, 0x46, 0xDF, 0xAF, 0xF7, + 0x19, 0xD0, 0xF1, 0xE8, 0x71, 0xCB, 0x98, 0xDB, 0x2B, 0xD4, 0x62, 0xD9, + 0x78, 0xD5, 0xBE, 0xD2, 0x8E, 0xE2, 0x98, 0xDB, 0x9F, 0xE9, 0xFA, 0xDB, + 0x74, 0xE5, 0x7B, 0xD3, 0x09, 0xDF, 0x7A, 0xD1, 0x69, 0xD2, 0xD7, 0xC3, + 0x03, 0xD5, 0xE2, 0xBD, 0x3B, 0xD6, 0x3C, 0xBC, 0x93, 0xD8, 0xB2, 0xC6, + 0x3F, 0xD4, 0x96, 0xCC, 0xB1, 0xCF, 0xF8, 0xCF, 0x83, 0xD3, 0x5D, 0xD8, + 0x73, 0xCB, 0x7D, 0xCE, 0x53, 0xCD, 0x39, 0xCD, 0x5A, 0xDC, 0x6F, 0xD5, + 0x95, 0xE3, 0xFF, 0xD6, 0x34, 0xE7, 0x89, 0xDA, 0xC7, 0xDE, 0x7F, 0xD8, + 0x2F, 0xDD, 0x53, 0xDC, 0xCF, 0xD8, 0xC6, 0xD7, 0x9D, 0xD4, 0xCE, 0xD2, + 0x0D, 0xDE, 0xBE, 0xD9, 0xD3, 0xE2, 0x79, 0xDA, 0xB5, 0xEC, 0xD6, 0xDF, + 0xFA, 0xE8, 0x73, 0xDF, 0xF1, 0xE7, 0x4F, 0xE5, 0xB8, 0xDA, 0xA7, 0xE1, + 0xDC, 0xD3, 0x28, 0xE6, 0x62, 0xDE, 0x79, 0xF2, 0xA0, 0xE0, 0x50, 0xEB, + 0xC6, 0xEC, 0x6B, 0xEF, 0x4F, 0xE9, 0x25, 0xEA, 0x43, 0xE0, 0xF8, 0xDE, + 0x6F, 0xE3, 0x37, 0xDF, 0x77, 0xDC, 0x9F, 0xD2, 0x7B, 0xDC, 0xBD, 0xCC, + 0x85, 0xDE, 0x5C, 0xD3, 0xCC, 0xD7, 0x2B, 0xD3, 0xA5, 0xE6, 0x6A, 0xDE, + 0xA4, 0xEF, 0x8F, 0xE0, 0xDD, 0xF0, 0x9E, 0xDE, 0xB3, 0xF2, 0xB6, 0xDA, + 0x79, 0xFD, 0xF1, 0xDA, 0x78, 0xFC, 0x23, 0xD6, 0x49, 0xFA, 0xBD, 0xDA, + 0xC7, 0xF6, 0xEA, 0xE7, 0x3B, 0xE3, 0xB0, 0xE0, 0x51, 0xE7, 0xE5, 0xE5, + 0xA3, 0xDC, 0x1E, 0xD7, 0xE5, 0xDA, 0xC4, 0xD5, 0x28, 0xDF, 0x93, 0xDE, + 0x78, 0xD6, 0x15, 0xD7, 0x7A, 0xD7, 0xE6, 0xDB, 0x9C, 0xCF, 0x30, 0xDB, + 0xF8, 0xCD, 0xD4, 0xDC, 0x91, 0xD6, 0xC0, 0xDA, 0x21, 0xE5, 0x8F, 0xDC, + 0x44, 0xF4, 0x9C, 0xE4, 0xFC, 0xED, 0x08, 0xDA, 0xDA, 0xF6, 0x80, 0xDF, + 0x58, 0xFA, 0xE5, 0xE0, 0xBA, 0xF5, 0xB2, 0xDD, 0xE8, 0xFC, 0x21, 0xE7, + 0xF8, 0xFB, 0xA5, 0xE6, 0x5E, 0x02, 0x4A, 0xEF, 0x77, 0xF1, 0xF3, 0xE9, + 0x00, 0xE6, 0xC3, 0xE7, 0x78, 0xE9, 0x79, 0xE7, 0xEF, 0xEB, 0x0C, 0xE7, + 0x57, 0xF5, 0xCC, 0xF3, 0x15, 0xF3, 0xFB, 0xEF, 0x58, 0xFD, 0xB3, 0xF6, + 0xC1, 0xFA, 0xB0, 0xF7, 0x00, 0xFD, 0x4D, 0x00, 0xB9, 0x09, 0x8A, 0x0E, + 0x07, 0x00, 0x68, 0x06, 0x7F, 0x06, 0xFC, 0x0D, 0xC3, 0xFF, 0xBB, 0x0C, + 0x76, 0xF3, 0x4F, 0x0C, 0x13, 0xEF, 0x93, 0x12, 0x88, 0xEE, 0x57, 0x10, + 0xFD, 0xFB, 0x1A, 0x13, 0x6D, 0xFE, 0x15, 0x0F, 0xBB, 0x0B, 0xDA, 0x16, + 0x7E, 0x11, 0xD3, 0x14, 0xDE, 0x0F, 0x00, 0x0B, 0x1A, 0x13, 0x99, 0x0A, + 0x6B, 0x0E, 0x1A, 0x03, 0xF9, 0x0D, 0x3E, 0x05, 0xE2, 0x05, 0x92, 0x07, + 0x03, 0x05, 0xEE, 0x0B, 0x20, 0x08, 0xE5, 0x07, 0xDF, 0x06, 0x3B, 0xFB, + 0xB8, 0x12, 0xD7, 0x05, 0x67, 0x13, 0xDC, 0x0C, 0xA1, 0x10, 0x9F, 0x0C, + 0x54, 0x16, 0x04, 0x0D, 0x13, 0x17, 0xD7, 0x07, 0xF2, 0x0F, 0x23, 0xFC, + 0xF7, 0x0D, 0xA2, 0xF3, 0xD2, 0x1F, 0x34, 0x05, 0xA0, 0x17, 0x61, 0x06, + 0x34, 0x14, 0xDF, 0x0D, 0x75, 0x16, 0x4B, 0x1A, 0x0C, 0x00, 0x1B, 0x0D, + 0x0B, 0xFF, 0x72, 0x0E, 0xB8, 0x05, 0x98, 0x10, 0x9B, 0x00, 0x71, 0x0D, + 0x67, 0xF6, 0x45, 0x0A, 0xBC, 0xF1, 0x4C, 0x06, 0xFB, 0xF1, 0x18, 0x00, + 0xA0, 0xEC, 0xEE, 0xF4, 0x72, 0xF8, 0x71, 0xFF, 0xED, 0xFB, 0x09, 0x01, + 0x05, 0x05, 0x48, 0x06, 0x09, 0x11, 0xD2, 0x0A, 0x97, 0x11, 0xFB, 0x03, + 0x79, 0x13, 0x81, 0x02, 0x8D, 0x0A, 0xAD, 0xFB, 0x7C, 0x0B, 0x17, 0x00, + 0xF1, 0x11, 0x32, 0x08, 0xAD, 0x18, 0x0F, 0x0F, 0x9E, 0x23, 0x00, 0x16, + 0x5E, 0x25, 0x23, 0x13, 0x41, 0x1F, 0xB8, 0x0D, 0x32, 0x1C, 0xDE, 0x0E, + 0x6E, 0x24, 0x59, 0x16, 0xCC, 0x2B, 0x19, 0x18, 0x8C, 0x25, 0xBA, 0x10, + 0x03, 0x2B, 0x66, 0x1E, 0xAB, 0x22, 0x6F, 0x22, 0xDE, 0x1B, 0xED, 0x21, + 0xC8, 0x1D, 0x40, 0x22, 0x15, 0x1D, 0xAF, 0x1D, 0x44, 0x24, 0x0E, 0x21, + 0x7C, 0x21, 0x8E, 0x1A, 0x20, 0x22, 0x3F, 0x1B, 0x1A, 0x1D, 0x2C, 0x1F, + 0x54, 0x11, 0x57, 0x21, 0x76, 0x0D, 0x6D, 0x23, 0xA8, 0x13, 0x3A, 0x20, + 0x9B, 0x1C, 0xCF, 0x1A, 0x8A, 0x25, 0x29, 0x1E, 0x56, 0x23, 0xC0, 0x1C, + 0xB3, 0x15, 0x0F, 0x0D, 0xE1, 0x16, 0xAD, 0x07, 0x5F, 0x18, 0xB1, 0x05, + 0x5D, 0x0C, 0x9B, 0x01, 0xF3, 0x10, 0x11, 0x17, 0xFD, 0x14, 0x0F, 0x26, + 0x43, 0x0C, 0x70, 0x1A, 0x6F, 0x10, 0x79, 0x17, 0xD8, 0x0C, 0x0D, 0x11, + 0xD1, 0x0B, 0x7E, 0x0D, 0xFF, 0x14, 0x63, 0x10, 0xC8, 0x10, 0x9B, 0x08, + 0x48, 0x0E, 0xDD, 0x09, 0x72, 0x08, 0x53, 0x09, 0xD0, 0x00, 0x2F, 0x03, + 0xE7, 0xFE, 0x50, 0x02, 0x87, 0x03, 0x71, 0x09, 0x8C, 0x05, 0xC7, 0x0B, + 0x18, 0x0A, 0x64, 0x0E, 0x9C, 0x0C, 0x77, 0x10, 0x06, 0x00, 0x9B, 0x04, + 0x7E, 0x01, 0xF7, 0x03, 0xF2, 0x00, 0x57, 0xFF, 0xAA, 0x02, 0xED, 0xFF, + 0xD7, 0x0F, 0x4F, 0x0F, 0xFB, 0x0F, 0x42, 0x0E, 0xAA, 0x15, 0xD6, 0x0A, + 0x53, 0x18, 0xE7, 0x03, 0xC1, 0x14, 0x17, 0x05, 0x66, 0x11, 0xF2, 0x16, + 0x4C, 0x02, 0x38, 0x18, 0x76, 0x08, 0x66, 0x17, 0xF2, 0x19, 0xFC, 0x17, + 0x64, 0x19, 0x39, 0x15, 0x6B, 0x17, 0xA9, 0x1D, 0x73, 0x12, 0x92, 0x1D, + 0x18, 0x11, 0xD9, 0x19, 0x27, 0x0E, 0xE0, 0x16, 0xDB, 0x0F, 0x33, 0x1A, + 0xAA, 0x0B, 0x77, 0x13, 0x42, 0x07, 0xFE, 0x08, 0xEC, 0x0D, 0xA2, 0x0A, + 0x44, 0x08, 0xDB, 0x05, 0x37, 0x09, 0xEB, 0x0F, 0x54, 0x06, 0x64, 0x15, + 0xCB, 0x0B, 0xDC, 0x15, 0x30, 0x1A, 0x14, 0x18, 0x7F, 0x17, 0x7E, 0x13, + 0xC3, 0x16, 0x68, 0x1A, 0xF9, 0x0E, 0x77, 0x12, 0xB3, 0x10, 0x53, 0x09, + 0xD8, 0x17, 0x67, 0x08, 0x53, 0x10, 0x5C, 0x02, 0xAB, 0x0C, 0x83, 0x03, + 0xC7, 0x08, 0x35, 0x02, 0xE1, 0x09, 0xE5, 0x02, 0x8C, 0x09, 0xDA, 0x00, + 0xE5, 0x07, 0x36, 0x02, 0x61, 0x04, 0xB2, 0x09, 0x7D, 0xFA, 0x4F, 0x0A, + 0xC5, 0xFD, 0x0F, 0x0D, 0xAD, 0x05, 0x7A, 0x0D, 0xF0, 0x09, 0x10, 0x0D, + 0x70, 0x09, 0xAE, 0x0D, 0x5B, 0x09, 0x33, 0x13, 0x06, 0xFA, 0x68, 0x0B, + 0xB7, 0xEB, 0x3C, 0xFF, 0x41, 0xF5, 0x5C, 0x04, 0x7D, 0xF7, 0x77, 0x03, + 0xF3, 0xFD, 0x5F, 0x08, 0xDE, 0x05, 0x69, 0x0A, 0x20, 0x0C, 0xA1, 0x0D, + 0x68, 0x0B, 0xA3, 0x16, 0xD4, 0xFB, 0x96, 0x12, 0x10, 0xF8, 0xAC, 0x0E, + 0x4C, 0xFB, 0x57, 0x0C, 0x1C, 0xF8, 0x28, 0x08, 0xD4, 0xF8, 0x2A, 0x07, + 0x9E, 0x00, 0xED, 0x08, 0x28, 0xFE, 0xF2, 0x02, 0x64, 0xFE, 0x34, 0x05, + 0x7E, 0x03, 0x76, 0x0B, 0xA5, 0x04, 0x9A, 0x0B, 0xAC, 0x05, 0x44, 0x10, + 0x2D, 0x06, 0xDD, 0x18, 0xB9, 0x01, 0xC6, 0x17, 0x88, 0x08, 0x52, 0x19, + 0x38, 0x12, 0x0C, 0x1C, 0xF2, 0x14, 0xD3, 0x19, 0x54, 0x19, 0x35, 0x1C, + 0x83, 0x12, 0x10, 0x18, 0xC1, 0x14, 0x91, 0x1D, 0xAE, 0x13, 0x7A, 0x16, + 0x3E, 0x12, 0x50, 0x0A, 0x1D, 0x10, 0xED, 0x06, 0xB6, 0x04, 0xD7, 0x05, + 0xF9, 0xFB, 0x29, 0x0C, 0xDA, 0xF9, 0x72, 0x17, 0x26, 0x02, 0xBB, 0x20, + 0x04, 0x04, 0xCC, 0x12, 0x4A, 0x0F, 0xB5, 0x10, 0x59, 0x0D, 0xC3, 0x11, + 0x91, 0xFF, 0xFD, 0x0A, 0x35, 0x02, 0x96, 0x0B, 0x2C, 0x01, 0xF3, 0x04, + 0xCE, 0xFE, 0x40, 0xFA, 0xD5, 0x08, 0x98, 0xF5, 0x4C, 0x0D, 0x05, 0xED, + 0xA6, 0x0C, 0x86, 0xEB, 0x3C, 0x05, 0x33, 0xED, 0x51, 0x05, 0x71, 0xF8, + 0xE6, 0x06, 0x0B, 0x02, 0x66, 0x03, 0x45, 0x01, 0xB8, 0x0B, 0xA1, 0x0B, + 0x1E, 0x05, 0xE3, 0x08, 0xE4, 0x00, 0x96, 0x08, 0x5A, 0xFF, 0x37, 0x0C, + 0x32, 0xFD, 0x67, 0x15, 0x03, 0xF0, 0x64, 0x14, 0x07, 0xEB, 0xA7, 0x14, + 0x7A, 0xEF, 0xBA, 0x16, 0xE5, 0xE3, 0x1C, 0x04, 0x9D, 0xEB, 0x27, 0x04, + 0xB6, 0xEB, 0x92, 0x02, 0x22, 0xE5, 0x94, 0x00, 0xE6, 0xED, 0xCE, 0x0A, + 0xFB, 0xEE, 0x26, 0x07, 0x25, 0xF9, 0x3B, 0x0A, 0xC5, 0xFB, 0xEE, 0x04, + 0xD9, 0xF8, 0xDA, 0xF5, 0x62, 0xFF, 0x5C, 0xF0, 0x50, 0xFD, 0x3C, 0xEB, + 0x17, 0xFB, 0xEC, 0xF0, 0xDB, 0xF3, 0x62, 0xF0, 0x2D, 0xF3, 0xD6, 0xEB, + 0xDA, 0xF5, 0x34, 0xE6, 0x1D, 0xF8, 0x25, 0xE5, 0x91, 0xFD, 0xA7, 0xEC, + 0x19, 0xF8, 0xB1, 0xEB, 0x84, 0x00, 0xEA, 0xF9, 0x44, 0xF9, 0xEB, 0xF4, + 0xA9, 0xF1, 0x0E, 0xEE, 0x16, 0xF3, 0xD0, 0xF3, 0x7D, 0xE8, 0xFB, 0xED, + 0x14, 0xEF, 0x5B, 0xF2, 0xBE, 0xF3, 0xA5, 0xF3, 0xE5, 0xFA, 0x99, 0xFB, + 0x51, 0xFB, 0x8D, 0xFF, 0xD3, 0xF1, 0x80, 0xFC, 0x43, 0xF4, 0xD7, 0x05, + 0x50, 0xF0, 0xC2, 0xFF, 0x45, 0xF2, 0x3F, 0xF8, 0x47, 0xFC, 0xDD, 0xFF, + 0xFF, 0xF3, 0xA2, 0xFC, 0x55, 0xF3, 0x18, 0x00, 0xD1, 0xF3, 0x8E, 0x01, + 0xA4, 0xF6, 0x89, 0x04, 0x3F, 0xF9, 0x83, 0x05, 0x3D, 0xF7, 0xA1, 0x03, + 0x41, 0xFA, 0x76, 0x07, 0xCE, 0xF7, 0x49, 0x03, 0x2B, 0xFA, 0xFB, 0x03, + 0x31, 0xFC, 0xB4, 0x05, 0x95, 0xFE, 0xAE, 0x02, 0x44, 0x02, 0x84, 0xFC, + 0x4B, 0x09, 0xAE, 0xFD, 0xC7, 0x07, 0x77, 0xFA, 0xFB, 0x01, 0x9B, 0xF7, + 0xFF, 0xFD, 0x97, 0xFA, 0x38, 0xFB, 0xA7, 0xF8, 0x05, 0x06, 0xFF, 0xF7, + 0x6B, 0x10, 0x1F, 0xFC, 0x0D, 0x08, 0xF6, 0xFB, 0xF7, 0x01, 0x57, 0xFE, + 0x06, 0xFB, 0x6B, 0xF5, 0x19, 0xFA, 0xF7, 0xEF, 0xD1, 0xFE, 0xF9, 0xF4, + 0x97, 0xF6, 0x8A, 0xF1, 0x3C, 0xF0, 0xB4, 0xF2, 0x4D, 0xE7, 0x53, 0xF0, + 0x2B, 0xE2, 0x11, 0xF0, 0x5F, 0xE1, 0x3E, 0xEF, 0x9A, 0xE3, 0x2B, 0xE9, + 0xA1, 0xEE, 0x23, 0xE8, 0x30, 0xED, 0x4E, 0xE2, 0xBB, 0xE8, 0x87, 0xDB, + 0xEF, 0xED, 0x66, 0xD8, 0xEB, 0xF2, 0xF2, 0xD7, 0x66, 0xF2, 0x3E, 0xDD, + 0x3E, 0xF3, 0x75, 0xE3, 0x95, 0x01, 0x04, 0xEE, 0xF0, 0x07, 0xF1, 0xEF, + 0xBC, 0x03, 0x7C, 0xED, 0x9E, 0xFF, 0xA8, 0xF1, 0x2F, 0xED, 0x8A, 0xEB, + 0xCC, 0xE1, 0x0D, 0xEE, 0xA6, 0xDE, 0x48, 0xF4, 0x94, 0xD6, 0xBC, 0xED, + 0x94, 0xD7, 0x44, 0xE5, 0x95, 0xEB, 0xE3, 0xE9, 0xAA, 0xF7, 0x67, 0xE9, + 0xFA, 0xF1, 0x42, 0xDF, 0x0F, 0xFC, 0xFC, 0xEC, 0x60, 0xF7, 0xBA, 0xF1, + 0x1C, 0xF3, 0x61, 0xF3, 0xFF, 0xFC, 0xD1, 0xF8, 0xEC, 0xFB, 0xB1, 0xF3, + 0x6B, 0xF8, 0x79, 0xF6, 0xD7, 0xED, 0x5A, 0xF7, 0xF7, 0xE8, 0x49, 0xF8, + 0xE8, 0xEB, 0xA4, 0xF9, 0xBF, 0xEE, 0xD7, 0xF3, 0x27, 0xFA, 0x18, 0xF7, + 0x6C, 0xFE, 0xF2, 0xF8, 0xEF, 0xF1, 0xFA, 0xE8, 0xFB, 0xF8, 0x59, 0xE5, + 0x95, 0xFA, 0x4B, 0xE1, 0xAA, 0xEB, 0x90, 0xDB, 0x1A, 0xED, 0x61, 0xE9, + 0x5C, 0xEF, 0xF7, 0xED, 0xB5, 0xF1, 0xC3, 0xE9, 0xE4, 0xF2, 0x9C, 0xE6, + 0x0E, 0xF0, 0x64, 0xE5, 0x79, 0xEB, 0x2F, 0xE4, 0x1A, 0xE9, 0xB7, 0xE0, + 0x8E, 0xEA, 0xF7, 0xE1, 0xE2, 0xEA, 0x79, 0xE7, 0xF7, 0xE9, 0xE8, 0xEB, + 0x60, 0xEF, 0x82, 0xEE, 0xE9, 0xF4, 0xD4, 0xE9, 0x03, 0xFD, 0x31, 0xE8, + 0xAA, 0xFD, 0xAC, 0xE8, 0xA1, 0xF3, 0x7B, 0xE8, 0x86, 0xEE, 0xDE, 0xE9, + 0xFE, 0xE0, 0x6A, 0xDC, 0xE5, 0xDB, 0xC2, 0xDB, 0x9F, 0xDA, 0x93, 0xE5, + 0xCF, 0xCF, 0x21, 0xDF, 0x25, 0xD5, 0xFE, 0xE1, 0xB6, 0xDA, 0x3A, 0xE4, + 0x69, 0xDD, 0xD4, 0xE1, 0x22, 0xE2, 0x0A, 0xDF, 0x96, 0xE0, 0x96, 0xD8, + 0x42, 0xE7, 0x99, 0xD9, 0x96, 0xE9, 0xCC, 0xD1, 0x9A, 0xF1, 0xBF, 0xD3, + 0x53, 0xF6, 0x2D, 0xDD, 0xB3, 0xEE, 0x42, 0xE2, 0xFA, 0xEC, 0x95, 0xEB, + 0x94, 0xEE, 0xCD, 0xEE, 0x74, 0xED, 0xDC, 0xE6, 0x3E, 0xE9, 0x96, 0xE1, + 0x69, 0xEC, 0x88, 0xE9, 0x10, 0xEE, 0x4D, 0xE7, 0xE2, 0xF5, 0x12, 0xE3, + 0x47, 0x03, 0x85, 0xEE, 0x4F, 0x03, 0xC2, 0xF7, 0xB5, 0xFF, 0xB8, 0xF9, + 0x98, 0x01, 0xAA, 0xF8, 0xA9, 0x04, 0x41, 0xF3, 0x70, 0x02, 0xB0, 0xE8, + 0xDB, 0xFC, 0x8E, 0xE3, 0xDB, 0xF5, 0x09, 0xE8, 0x73, 0xE7, 0x23, 0xE3, + 0x22, 0xE9, 0xE3, 0xE7, 0xA8, 0xEE, 0x71, 0xF0, 0xD5, 0xEA, 0xC3, 0xF0, + 0xFF, 0xF4, 0xC9, 0xF9, 0x4B, 0xFF, 0x70, 0xFD, 0xEF, 0x05, 0x21, 0xFB, + 0x92, 0x07, 0xB9, 0xF6, 0x77, 0x00, 0x80, 0xF4, 0x46, 0xF1, 0x88, 0xF2, + 0x54, 0xEA, 0x31, 0xF4, 0x54, 0xE9, 0x77, 0xF0, 0xFC, 0xE7, 0xD6, 0xEA, + 0x2B, 0xE9, 0xFC, 0xED, 0xA5, 0xE5, 0xCA, 0xF0, 0xB4, 0xE6, 0xC5, 0xF4, + 0x4A, 0xE4, 0x9B, 0xF1, 0x60, 0xE9, 0x07, 0xF4, 0xC9, 0xF0, 0xD3, 0xF4, + 0x03, 0xF3, 0xDC, 0xEB, 0xA3, 0x01, 0x54, 0xF1, 0x97, 0x0A, 0x2F, 0xF7, + 0x56, 0x06, 0x17, 0xF3, 0x8E, 0x04, 0xD0, 0xF5, 0xCD, 0xFA, 0xC7, 0xF4, + 0x6A, 0xE7, 0xA0, 0xEA, 0xAB, 0xDF, 0x46, 0xE8, 0x4A, 0xE2, 0x4C, 0xEC, + 0xAC, 0xE3, 0x76, 0xEA, 0x5A, 0xE6, 0x02, 0xEA, 0x72, 0xEF, 0xB7, 0xF0, + 0x6F, 0xF5, 0x30, 0xF0, 0xBC, 0xFC, 0x7F, 0xEF, 0xEE, 0x02, 0x76, 0xF4, + 0x55, 0x05, 0x52, 0xF7, 0x89, 0x0B, 0x0A, 0xF8, 0x08, 0x10, 0xF9, 0xFA, + 0x33, 0x10, 0xC4, 0x03, 0x81, 0x03, 0xDC, 0x01, 0x75, 0xFF, 0xDF, 0x06, + 0x05, 0xFB, 0x03, 0x10, 0x7D, 0xF8, 0xD9, 0x18, 0xC5, 0x01, 0xE2, 0x20, + 0xF2, 0x05, 0x09, 0x1B, 0xD2, 0x15, 0x48, 0x22, 0xF6, 0x16, 0x36, 0x1C, + 0x9A, 0x1B, 0xBB, 0x1A, 0x49, 0x1E, 0x94, 0x1E, 0x97, 0x15, 0xC1, 0x1C, + 0x47, 0x1E, 0x38, 0x28, 0xE3, 0x1F, 0xDD, 0x22, 0xB3, 0x27, 0x61, 0x20, + 0x1E, 0x2B, 0x1E, 0x20, 0x39, 0x1B, 0x47, 0x1B, 0x5A, 0x0F, 0xAA, 0x20, + 0x43, 0x03, 0xBD, 0x1B, 0x61, 0x0B, 0x32, 0x1E, 0x94, 0x15, 0xD2, 0x1F, + 0x60, 0x26, 0x4A, 0x25, 0x3A, 0x34, 0xA3, 0x24, 0x00, 0x2F, 0x9E, 0x19, + 0xB5, 0x2E, 0xDF, 0x1F, 0xDE, 0x1C, 0xAC, 0x16, 0xBB, 0x19, 0x62, 0x17, + 0x99, 0x18, 0x55, 0x17, 0xA6, 0x13, 0xFF, 0x0E, 0x1D, 0x1C, 0xDA, 0x13, + 0xEA, 0x17, 0x02, 0x13, 0xE3, 0x0F, 0xD4, 0x16, 0x12, 0x07, 0x6C, 0x1A, + 0x03, 0x00, 0x49, 0x19, 0x15, 0x03, 0x7B, 0x18, 0x9A, 0x0E, 0x5E, 0x19, + 0xB6, 0x15, 0x2F, 0x14, 0xF6, 0x1E, 0x9E, 0x11, 0x30, 0x26, 0x92, 0x11, + 0x18, 0x21, 0x21, 0x0E, 0x22, 0x21, 0x69, 0x19, 0x65, 0x1F, 0x7A, 0x24, + 0x4E, 0x18, 0x17, 0x24, 0x3B, 0x1C, 0x7F, 0x24, 0x1A, 0x1B, 0x7D, 0x1C, + 0x65, 0x1A, 0x4D, 0x1C, 0xB4, 0x0E, 0x88, 0x1D, 0x4E, 0x06, 0x66, 0x23, + 0x98, 0x05, 0x8C, 0x22, 0xEF, 0x10, 0x75, 0x1F, 0x52, 0x1C, 0xC7, 0x1C, + 0xA3, 0x1B, 0x45, 0x16, 0xB2, 0x1B, 0x2F, 0x15, 0x44, 0x11, 0xF7, 0x0F, + 0xB0, 0x0F, 0x0A, 0x18, 0x71, 0x0F, 0xC9, 0x1D, 0xCB, 0x0C, 0x8E, 0x19, + 0x9B, 0x18, 0xBB, 0x22, 0xDC, 0x17, 0x4F, 0x22, 0xCC, 0x14, 0x54, 0x26, + 0x58, 0x17, 0xE4, 0x31, 0xC8, 0x12, 0x3F, 0x2A, 0xF3, 0x1B, 0x2E, 0x22, + 0xC3, 0x20, 0x92, 0x14, 0x2F, 0x2A, 0x15, 0x10, 0xC0, 0x2C, 0x33, 0x09, + 0x7A, 0x28, 0x27, 0x09, 0x02, 0x25, 0x86, 0x14, 0x95, 0x1E, 0xCC, 0x18, + 0x9F, 0x20, 0xA5, 0x1C, 0x4F, 0x1B, 0x85, 0x1A, 0x2C, 0x10, 0x46, 0x17, + 0xCE, 0x07, 0x07, 0x19, 0x86, 0xFD, 0xA8, 0x12, 0x1D, 0x05, 0x93, 0x11, + 0xD1, 0x0E, 0xF7, 0x0C, 0x58, 0x14, 0x9F, 0x0C, 0x17, 0x18, 0xF9, 0x12, + 0x19, 0x16, 0x0A, 0x0F, 0x6E, 0x1C, 0x99, 0x0C, 0x9F, 0x16, 0x21, 0x01, + 0x4C, 0x15, 0x44, 0x05, 0xA1, 0x11, 0x1A, 0x0A, 0x9A, 0x0B, 0xB2, 0x07, + 0xB7, 0x15, 0x5A, 0x10, 0x17, 0x20, 0xEA, 0x19, 0x7F, 0x1A, 0x9A, 0x16, + 0xD4, 0x11, 0x26, 0x14, 0xCB, 0x13, 0x94, 0x1A, 0x9A, 0x0E, 0xC1, 0x14, + 0xC7, 0x0C, 0xBA, 0x13, 0x7E, 0x0F, 0x52, 0x1C, 0x2B, 0x0B, 0x65, 0x1E, + 0x9A, 0x02, 0x18, 0x1A, 0x53, 0x00, 0x49, 0x1D, 0x5E, 0x02, 0x93, 0x24, + 0xD9, 0xFD, 0x38, 0x25, 0xB5, 0xFE, 0x3F, 0x27, 0xF4, 0x06, 0x2F, 0x28, + 0x7A, 0x10, 0x6A, 0x25, 0x71, 0x06, 0x89, 0x15, 0x83, 0x04, 0xCE, 0x14, + 0xE9, 0xFB, 0x85, 0x0E, 0xA8, 0xF2, 0x7A, 0x03, 0x8A, 0x01, 0x9C, 0x08, + 0xD6, 0x06, 0x02, 0x01, 0x35, 0x08, 0xFA, 0xFA, 0xE2, 0x0C, 0xF9, 0xFC, + 0xF3, 0x05, 0x4F, 0xF1, 0x0A, 0x07, 0xF2, 0xF0, 0x8D, 0x0D, 0x19, 0xFD, + 0x37, 0x03, 0x8E, 0xFB, 0x76, 0x07, 0x6A, 0x04, 0xD3, 0x0A, 0xA2, 0x06, + 0xB2, 0x0E, 0xB9, 0x04, 0x48, 0x10, 0x1C, 0x02, 0x54, 0x0B, 0xDE, 0xFD, + 0xAD, 0x05, 0x7B, 0xFB, 0xD5, 0x01, 0xB9, 0xFB, 0xF4, 0x02, 0x39, 0x03, + 0x08, 0x08, 0x43, 0x11, 0x84, 0x02, 0x15, 0x11, 0x92, 0xFE, 0x82, 0x0C, + 0x81, 0x07, 0x8A, 0x12, 0x53, 0x09, 0x5C, 0x13, 0x2F, 0x06, 0xE3, 0x0E, + 0xCE, 0x07, 0x9F, 0x13, 0x78, 0xFF, 0x05, 0x14, 0xE5, 0xF2, 0x04, 0x0A, + 0xB0, 0xF8, 0x6F, 0x06, 0x73, 0xF9, 0x0E, 0x01, 0xB3, 0xF3, 0x2A, 0xFF, + 0xE7, 0xED, 0xC1, 0xFB, 0x86, 0xF0, 0x50, 0xFB, 0x09, 0xF6, 0x00, 0xFE, + 0xF3, 0xF5, 0xCD, 0xFC, 0x28, 0xFD, 0xB8, 0x00, 0xCB, 0x02, 0xB7, 0x00, + 0x7E, 0x04, 0xA0, 0xFD, 0x4C, 0x08, 0x17, 0x05, 0x8B, 0x01, 0x50, 0x05, + 0x74, 0xFE, 0x65, 0xFE, 0xD3, 0x07, 0x26, 0xF8, 0xC0, 0x0C, 0x76, 0xF1, + 0x04, 0x0C, 0x1C, 0xF0, 0x83, 0x06, 0x83, 0xEF, 0xFC, 0xFF, 0x6D, 0xED, + 0x1F, 0xFB, 0xAF, 0xEB, 0x04, 0xF6, 0xC4, 0xEB, 0x4F, 0xF4, 0x4A, 0xF0, + 0xFA, 0xFF, 0x89, 0x00, 0x84, 0xFB, 0x5B, 0x00, 0xF4, 0xF6, 0x08, 0x02, + 0x55, 0xFC, 0x2A, 0x0B, 0x9E, 0xE7, 0x6C, 0xFA, 0x3D, 0xE3, 0xC6, 0xFB, + 0xA0, 0xE1, 0x6C, 0xF8, 0xAF, 0xDF, 0x9F, 0xE8, 0xDA, 0xEB, 0x05, 0xE7, + 0xD7, 0xF2, 0x01, 0xE8, 0x82, 0xF9, 0x19, 0xEC, 0x23, 0xF7, 0xA5, 0xE9, + 0xC1, 0xF7, 0x2E, 0xED, 0x4A, 0xFB, 0xF0, 0xF1, 0x1E, 0xFD, 0x8E, 0xF1, + 0x0C, 0x03, 0x1E, 0xF8, 0x03, 0x02, 0x41, 0xFB, 0xAF, 0x00, 0xE3, 0xFF, + 0x6B, 0xF5, 0x99, 0xF8, 0xE9, 0xEE, 0xC0, 0xF3, 0x4B, 0xEE, 0x13, 0xF4, + 0xC6, 0xDF, 0x7A, 0xE4, 0xEE, 0xE6, 0xD1, 0xE5, 0x4C, 0xED, 0xD9, 0xE6, + 0xAC, 0xF0, 0xAE, 0xEB, 0x4E, 0xF6, 0x54, 0xF8, 0xCA, 0xEA, 0x9A, 0xF1, + 0xAD, 0xF5, 0x13, 0xF8, 0xEB, 0xFC, 0x9E, 0xFC, 0xC7, 0xF6, 0x32, 0x01, + 0x79, 0xF5, 0x16, 0x0E, 0x0A, 0xF2, 0xB5, 0x0D, 0xFD, 0xF0, 0x90, 0x08, + 0x8E, 0xEB, 0xC7, 0xFC, 0x00, 0xEC, 0xA5, 0xF6, 0x6C, 0xEB, 0x9A, 0xF0, + 0xB7, 0xE8, 0xCB, 0xEA, 0x88, 0xF2, 0x8C, 0xF2, 0x2D, 0xF6, 0x58, 0xF7, + 0x0C, 0xF3, 0xD5, 0xF6, 0x05, 0xF9, 0x36, 0xFA, 0x6F, 0xFD, 0x75, 0xF8, + 0xBA, 0x00, 0x0C, 0xF5, 0x15, 0x02, 0x52, 0xF1, 0x02, 0x02, 0x56, 0xEF, + 0xDA, 0xFD, 0xA6, 0xF3, 0x29, 0xF1, 0x1B, 0xEF, 0x9F, 0xF0, 0xC4, 0xEF, + 0x79, 0xF0, 0xC3, 0xF2, 0xC0, 0xF2, 0xB4, 0xF7, 0xD4, 0xF9, 0x15, 0xFD, + 0xAD, 0xF4, 0xD5, 0xF5, 0x2D, 0xF6, 0x46, 0xF6, 0x24, 0xF3, 0x3D, 0xF2, + 0x7A, 0xEA, 0x37, 0xEE, 0xDC, 0xED, 0x43, 0xFA, 0x5D, 0xEC, 0xCC, 0xF8, + 0xE2, 0xF0, 0x73, 0xF5, 0x74, 0xF2, 0x4A, 0xF1, 0x27, 0xE9, 0x41, 0xE6, + 0x0B, 0xE4, 0x6B, 0xE2, 0x2B, 0xCF, 0x21, 0xD1, 0x50, 0xD0, 0x1D, 0xD8, + 0x52, 0xD4, 0xD9, 0xD9, 0x62, 0xDB, 0xF4, 0xD9, 0x22, 0xE7, 0xED, 0xE3, + 0x1E, 0xE2, 0xA0, 0xDB, 0x28, 0xEF, 0xA0, 0xE1, 0x75, 0xEC, 0x00, 0xDA, + 0x50, 0xF2, 0x39, 0xE0, 0x5C, 0xF8, 0x48, 0xE6, 0xD7, 0xF2, 0x53, 0xDF, + 0x96, 0xFB, 0xFC, 0xEA, 0x26, 0xED, 0x52, 0xE3, 0x7C, 0xE9, 0xEC, 0xE4, + 0x91, 0xE4, 0x01, 0xE3, 0x68, 0xE2, 0x3F, 0xDE, 0x74, 0xFA, 0x06, 0xEF, + 0x4E, 0x01, 0x83, 0xEF, 0x82, 0x0E, 0x43, 0xFB, 0x48, 0x0F, 0xF8, 0xFE, + 0x43, 0x04, 0x3E, 0xFE, 0xC5, 0xF8, 0x77, 0x00, 0xA9, 0xF2, 0x87, 0xFF, + 0xB7, 0xF9, 0xC3, 0x07, 0x1E, 0xF4, 0xE2, 0x00, 0x7E, 0xFC, 0xCB, 0x00, + 0x3F, 0xFD, 0xE3, 0xF7, 0xF5, 0xF3, 0x4D, 0xEC, 0xE7, 0xF6, 0x99, 0xF4, + 0x66, 0xEC, 0xE9, 0xED, 0xFF, 0xF1, 0x90, 0xF1, 0x03, 0xF5, 0x83, 0xF3, + 0x47, 0xFA, 0x43, 0xF7, 0x8F, 0x05, 0xCC, 0xFF, 0xA4, 0xFF, 0xA1, 0xF7, + 0xC8, 0x01, 0x70, 0xFE, 0xEA, 0xF4, 0xB1, 0xFD, 0x26, 0xE7, 0x9D, 0xF7, + 0xB5, 0xE7, 0xA3, 0xF3, 0x5C, 0xEB, 0xDF, 0xEE, 0x72, 0xE7, 0xDB, 0xE8, + 0xE7, 0xE6, 0x12, 0xE8, 0xE4, 0xF0, 0x34, 0xEE, 0x1A, 0xEF, 0x9B, 0xEB, + 0x61, 0xF2, 0xAF, 0xF3, 0x09, 0xF6, 0x01, 0xF9, 0x0C, 0xF4, 0x2D, 0xF1, + 0xE3, 0xFB, 0x93, 0xF5, 0xEE, 0xF4, 0x1C, 0xF6, 0x05, 0xEB, 0xE6, 0xF2, + 0xD5, 0xE5, 0x86, 0xF2, 0xFD, 0xDC, 0xED, 0xED, 0x3D, 0xDA, 0x3E, 0xE6, + 0x6C, 0xE0, 0x00, 0xE3, 0xAC, 0xEA, 0x13, 0xE2, 0xDC, 0xEE, 0xCF, 0xDA, + 0x1E, 0xF1, 0xB5, 0xD6, 0x4A, 0xF3, 0x3D, 0xD9, 0xF4, 0xF2, 0xF4, 0xD6, + 0x6F, 0xFD, 0x88, 0xD9, 0x53, 0x04, 0x09, 0xE0, 0xB2, 0x06, 0x37, 0xEB, + 0x46, 0x0C, 0x00, 0xF8, 0xC8, 0x04, 0x9E, 0xF9, 0x14, 0x00, 0xB8, 0x03, + 0xCC, 0xF1, 0xEB, 0xFE, 0x4C, 0xEC, 0x02, 0xFA, 0x98, 0xEC, 0x6D, 0xFB, + 0xF7, 0xEA, 0xCB, 0xFB, 0x55, 0xF2, 0x00, 0xFF, 0x67, 0xF5, 0x93, 0xFF, + 0xC6, 0xFB, 0xAF, 0x01, 0x69, 0x00, 0x96, 0x01, 0x43, 0x04, 0xA3, 0x04, + 0xF7, 0x04, 0x4B, 0x04, 0xC0, 0x02, 0x18, 0x04, 0xC0, 0xFF, 0x8A, 0x00, + 0x8D, 0xFB, 0xF6, 0xF6, 0x2B, 0xFF, 0x11, 0xF8, 0xC6, 0xFA, 0x4A, 0xF6, + 0x14, 0xF9, 0x5F, 0xF7, 0x3E, 0x02, 0x57, 0xFB, 0x1B, 0x03, 0x79, 0xF4, + 0x99, 0x07, 0xEB, 0xF5, 0x9D, 0xFF, 0x67, 0xE9, 0x2A, 0x07, 0x13, 0xEB, + 0xD3, 0x0C, 0xD5, 0xEE, 0xFB, 0x09, 0x72, 0xF2, 0x2E, 0x13, 0x3D, 0x00, + 0x3C, 0x0C, 0x63, 0xFC, 0xF8, 0x05, 0x38, 0xF8, 0x39, 0xFF, 0x68, 0xF2, + 0x25, 0xF5, 0x79, 0xF1, 0x35, 0xE9, 0x2A, 0xEA, 0x30, 0xEE, 0x2D, 0xEF, + 0x6F, 0xF8, 0x98, 0xF7, 0xAA, 0xF6, 0x15, 0xF2, 0x98, 0xFF, 0xF2, 0xF7, + 0xA2, 0x00, 0x65, 0xFA, 0x54, 0xFD, 0x27, 0xFE, 0xD3, 0xF9, 0x8A, 0x00, + 0x66, 0xFE, 0x9C, 0x05, 0x39, 0x05, 0xD5, 0x0E, 0xE2, 0xF8, 0x45, 0x0C, + 0xBE, 0xF6, 0xDC, 0x0B, 0xDE, 0xF9, 0x02, 0x06, 0x5F, 0xF0, 0x00, 0xF6, + 0x65, 0xFB, 0x35, 0xFE, 0x12, 0x02, 0xC0, 0x01, 0x4B, 0x03, 0xDB, 0xFE, + 0x9E, 0x07, 0xC3, 0xFD, 0xCB, 0xFF, 0xC8, 0xF5, 0xEA, 0x01, 0xA0, 0xF9, + 0xD3, 0xF9, 0x59, 0xEF, 0x4A, 0xFD, 0x36, 0xF2, 0x13, 0x03, 0x85, 0xFC, + 0x37, 0xFF, 0xF4, 0x01, 0x32, 0x03, 0x4B, 0x11, 0xD7, 0x02, 0x76, 0x15, + 0xFB, 0xF6, 0x56, 0x0A, 0x03, 0xF6, 0x89, 0x0A, 0xA8, 0x02, 0x20, 0x12, + 0x51, 0x02, 0x81, 0x09, 0x26, 0x0D, 0x61, 0x0D, 0x9B, 0x1B, 0x61, 0x17, + 0xFA, 0x13, 0x23, 0x0E, 0x03, 0x1A, 0xE1, 0x12, 0x4F, 0x1C, 0x71, 0x13, + 0xB7, 0x0F, 0xEC, 0x08, 0x93, 0x17, 0x79, 0x0F, 0xBF, 0x14, 0x29, 0x10, + 0x84, 0x0D, 0x4C, 0x17, 0x24, 0x04, 0x10, 0x16, 0x60, 0xFD, 0xDC, 0x09, + 0xEF, 0x06, 0x16, 0x05, 0x8A, 0x09, 0xEA, 0xFD, 0x20, 0x0B, 0x11, 0xFD, + 0x29, 0x13, 0x9E, 0x04, 0xA7, 0x14, 0xB5, 0x03, 0xBA, 0x11, 0x83, 0xFF, + 0x0C, 0x10, 0x29, 0x00, 0x15, 0x0E, 0x16, 0x00, 0x4A, 0x0B, 0x21, 0x05, + 0x1D, 0x0B, 0xE8, 0x09, 0x3D, 0x08, 0x5C, 0x0C, 0x04, 0x05, 0x2C, 0x11, + 0x45, 0x04, 0xB6, 0x0A, 0xD2, 0x03, 0x7A, 0x03, 0xAE, 0x10, 0xD4, 0x09, + 0x0A, 0x0D, 0x10, 0xFF, 0x1E, 0x10, 0x19, 0xFD, 0xED, 0x17, 0xAE, 0x06, + 0xBA, 0x06, 0xB1, 0x01, 0xD3, 0xFE, 0x73, 0x03, 0xB5, 0x02, 0xAE, 0x0C, + 0x4E, 0xFF, 0xC3, 0x0E, 0x88, 0xFC, 0x31, 0x15, 0x6E, 0xFF, 0x99, 0x1D, + 0x67, 0xFB, 0x13, 0x1C, 0xE0, 0xF4, 0xB6, 0x18, 0x25, 0xFB, 0x6F, 0x1A, + 0xC3, 0x04, 0x55, 0x1F, 0xD4, 0x03, 0x6A, 0x16, 0xD6, 0x07, 0x29, 0x0B, + 0xE8, 0x15, 0x01, 0x10, 0x49, 0x0E, 0x05, 0x03, 0xBA, 0x08, 0x89, 0xF8, + 0x09, 0x12, 0x3E, 0x00, 0xCD, 0x07, 0x40, 0xF5, 0xC1, 0x00, 0xAB, 0xF1, + 0x11, 0x0E, 0x00, 0x01, 0xD9, 0x0C, 0xF9, 0x02, 0xA8, 0x00, 0xB7, 0xFF, + 0x1B, 0x0C, 0x66, 0x11, 0x71, 0x0B, 0x51, 0x0F, 0x72, 0x09, 0xDF, 0x09, + 0xDF, 0x12, 0xBB, 0x11, 0xC2, 0x15, 0x4D, 0x12, 0xAF, 0x0B, 0x56, 0x0A, + 0x0D, 0x09, 0x9B, 0x0B, 0x6B, 0x12, 0xBB, 0x14, 0x08, 0x09, 0x27, 0x0B, + 0x46, 0x09, 0x05, 0x0A, 0x12, 0x15, 0x85, 0x1B, 0xEE, 0x09, 0x57, 0x1B, + 0x9C, 0x02, 0x7B, 0x18, 0x96, 0x04, 0x0D, 0x21, 0x1A, 0xFF, 0x51, 0x19, + 0x2C, 0x00, 0xC8, 0x11, 0xD7, 0x0D, 0xEE, 0x14, 0x1C, 0x16, 0x43, 0x12, + 0xE9, 0x17, 0x50, 0x12, 0x8F, 0x16, 0x28, 0x15, 0x6C, 0x05, 0xF3, 0x09, + 0xD8, 0xFF, 0x66, 0x07, 0x2F, 0xFA, 0x58, 0x0A, 0x12, 0xFF, 0x50, 0x15, + 0xB0, 0x00, 0xAD, 0x18, 0xD7, 0x00, 0xD0, 0x1A, 0x8B, 0x09, 0x5F, 0x1F, + 0xC2, 0x06, 0x4B, 0x19, 0x34, 0x0E, 0x89, 0x1E, 0xB4, 0x12, 0xD1, 0x22, + 0xDF, 0x18, 0x66, 0x25, 0x13, 0x1F, 0xEA, 0x19, 0x14, 0x26, 0x7A, 0x12, + 0x76, 0x24, 0xDD, 0x0C, 0x96, 0x1B, 0x8B, 0x02, 0x43, 0x20, 0x43, 0x0A, + 0xA1, 0x1F, 0x35, 0x0E, 0xCF, 0x17, 0xF2, 0x0C, 0x75, 0x12, 0xC2, 0x12, + 0xBF, 0x0A, 0xB2, 0x14, 0x20, 0x05, 0x0D, 0x10, 0xDC, 0x01, 0x64, 0x0D, + 0x7B, 0x09, 0xD5, 0x18, 0x22, 0x0D, 0xF0, 0x1B, 0x41, 0x0F, 0x45, 0x15, + 0xB4, 0x1C, 0xFA, 0x16, 0xD2, 0x13, 0xF4, 0x0A, 0xE6, 0x0A, 0x90, 0x07, + 0xC4, 0x0E, 0x9F, 0x0A, 0xE2, 0x07, 0xEC, 0xFF, 0x21, 0x05, 0x63, 0xFF, + 0x1C, 0x05, 0x50, 0x05, 0x3B, 0x00, 0xE0, 0x09, 0x5C, 0x04, 0xFA, 0x10, + 0xB7, 0x07, 0x16, 0x12, 0xA6, 0x0A, 0xFC, 0x13, 0x49, 0x13, 0xA6, 0x14, + 0x79, 0x10, 0xA0, 0x0B, 0xD7, 0x1A, 0x20, 0x12, 0x87, 0x19, 0xB9, 0x0D, + 0x6F, 0x08, 0x7E, 0xFF, 0x0B, 0x0D, 0x19, 0x07, 0x49, 0x02, 0xEE, 0xFE, + 0xD1, 0xFD, 0x6D, 0xFE, 0xC1, 0x09, 0x29, 0x0F, 0x83, 0x0E, 0xF3, 0x12, + 0xE4, 0x0C, 0xA8, 0x12, 0x22, 0x0A, 0x2B, 0x17, 0x4E, 0x0B, 0x46, 0x18, + 0x5F, 0x0C, 0x57, 0x13, 0xF8, 0x19, 0x5B, 0x1A, 0x40, 0x18, 0x1B, 0x16, + 0x44, 0x18, 0x4C, 0x18, 0x69, 0x1E, 0x26, 0x1B, 0x79, 0x0E, 0x7B, 0x0C, + 0xCF, 0x11, 0x40, 0x10, 0x98, 0x11, 0x17, 0x10, 0x2F, 0x0A, 0x23, 0x13, + 0x43, 0x05, 0x24, 0x15, 0xB6, 0x00, 0x06, 0x13, 0x5D, 0x08, 0xE0, 0x19, + 0x66, 0xFC, 0x5A, 0x0C, 0x5F, 0x05, 0x01, 0x16, 0xAD, 0x11, 0x2B, 0x22, + 0x41, 0x0D, 0xE2, 0x19, 0xC0, 0x1C, 0xBC, 0x21, 0x6C, 0x17, 0x73, 0x15, + 0xDE, 0x13, 0xC8, 0x09, 0x42, 0x0F, 0x0F, 0xFF, 0x0B, 0x0F, 0x7C, 0x02, + 0x67, 0x10, 0xCC, 0x0A, 0xB8, 0xFC, 0x06, 0x04, 0x8F, 0x01, 0x4A, 0x13, + 0x55, 0xFB, 0x66, 0x0D, 0x32, 0xF9, 0x6B, 0x07, 0x42, 0x0A, 0x7F, 0x0E, + 0x4A, 0x00, 0x6B, 0xFD, 0x60, 0x09, 0xEF, 0x04, 0x50, 0x09, 0x22, 0x07, + 0xD7, 0xFA, 0x16, 0x04, 0xF2, 0xF4, 0xEC, 0x04, 0xAA, 0xEB, 0xE3, 0xF7, + 0x11, 0xF1, 0x10, 0xF8, 0xA7, 0xF2, 0x4D, 0xF2, 0xCB, 0xFF, 0x67, 0xF8, + 0xB2, 0x03, 0xC8, 0xF9, 0x84, 0xF8, 0xFB, 0xF2, 0xA0, 0xEF, 0x30, 0xF1, + 0x2B, 0xE2, 0x10, 0xE9, 0xA9, 0xE6, 0xB3, 0xEC, 0xF3, 0xF5, 0xC5, 0xF2, + 0x9A, 0x09, 0x18, 0xFD, 0x49, 0x13, 0xDB, 0xFF, 0x91, 0x09, 0x43, 0xF8, + 0x2D, 0x08, 0x8D, 0xFD, 0x50, 0xF8, 0xA4, 0xEA, 0x0F, 0xF8, 0xA4, 0xE7, + 0xF2, 0x02, 0xE6, 0xF3, 0x92, 0x00, 0x0B, 0xF4, 0x9B, 0x0E, 0x09, 0x06, + 0xDE, 0x06, 0xA3, 0xFF, 0xFE, 0xFB, 0x28, 0xFF, 0xEA, 0xF3, 0x28, 0x06, + 0x1F, 0xEA, 0xAB, 0xFF, 0x6E, 0xF3, 0xBA, 0x02, 0x2A, 0xF8, 0x9F, 0xF9, + 0x8A, 0xFE, 0x8A, 0xF6, 0x09, 0xF9, 0x78, 0xF1, 0x0C, 0xEA, 0x6A, 0xE5, + 0x12, 0xF3, 0x2C, 0xED, 0x43, 0xEC, 0xFE, 0xE5, 0x5D, 0xF2, 0xDF, 0xEF, + 0x93, 0xF8, 0xD9, 0xF5, 0xA6, 0xEE, 0x15, 0xEB, 0x00, 0xEF, 0x00, 0xED, + 0xDE, 0xE1, 0xD4, 0xE2, 0xA2, 0xDF, 0xCB, 0xE7, 0xB3, 0xDF, 0xCF, 0xEB, + 0xD4, 0xE1, 0x57, 0xEE, 0xFC, 0xEE, 0x19, 0xF1, 0x95, 0xF7, 0x21, 0xE5, + 0x70, 0xF8, 0xD1, 0xE0, 0x9F, 0xF2, 0xEC, 0xE0, 0x41, 0xEB, 0x64, 0xE1, + 0xE9, 0xE7, 0xBF, 0xE4, 0x38, 0xEC, 0xC6, 0xEA, 0x28, 0xF0, 0x0B, 0xED, + 0xC3, 0xE9, 0x0F, 0xE2, 0x1A, 0xED, 0x69, 0xE0, 0xF2, 0xE8, 0xF3, 0xDE, + 0x9F, 0xDC, 0x12, 0xDB, 0xAA, 0xE1, 0x3D, 0xE9, 0x3B, 0xD7, 0x10, 0xE5, + 0xB4, 0xD3, 0x04, 0xDE, 0xF3, 0xDD, 0xD7, 0xDB, 0x42, 0xDA, 0x02, 0xCC, + 0x17, 0xE1, 0x64, 0xCE, 0x05, 0xE7, 0x78, 0xD4, 0xDF, 0xE9, 0x96, 0xDC, + 0x9E, 0xEF, 0xE6, 0xE3, 0x85, 0xED, 0x06, 0xDD, 0xDF, 0xE9, 0xB6, 0xDC, + 0x57, 0xE1, 0x1B, 0xDA, 0xD2, 0xE0, 0xC8, 0xDE, 0x07, 0xED, 0xCA, 0xEB, + 0xF5, 0xF1, 0x56, 0xEF, 0x8D, 0xF1, 0xBB, 0xF9, 0x94, 0xED, 0xAE, 0xF8, + 0x91, 0xED, 0x3E, 0xF2, 0xB5, 0xEE, 0x72, 0xF2, 0x2B, 0xEB, 0x48, 0xF3, + 0x1E, 0xF1, 0x9F, 0xFF, 0xB6, 0xF5, 0xEB, 0xFF, 0xB3, 0xFB, 0xC2, 0x00, + 0x49, 0xFC, 0xBF, 0x01, 0x81, 0xF3, 0x4A, 0xFD, 0xA7, 0xFA, 0x52, 0x0A, + 0x9E, 0xF4, 0x0A, 0x03, 0x7C, 0xF0, 0x95, 0xFC, 0xAB, 0xFA, 0x24, 0xFE, + 0x1E, 0xF4, 0x39, 0xF6, 0x19, 0xF1, 0x90, 0xF5, 0x4C, 0xF3, 0x7C, 0xF2, + 0xB9, 0xFA, 0xAF, 0xF7, 0x1D, 0xFB, 0xB8, 0xEF, 0x2B, 0x07, 0xDC, 0xF5, + 0xBD, 0x0E, 0x73, 0xFC, 0x10, 0x02, 0xE6, 0xEE, 0x7B, 0x08, 0x5C, 0xFB, + 0xA5, 0x00, 0x96, 0xF4, 0x71, 0xFC, 0xF0, 0xEF, 0x3E, 0xF9, 0x74, 0xEC, + 0x34, 0xF7, 0xAF, 0xE7, 0x0E, 0xF6, 0x46, 0xE7, 0x98, 0xED, 0x55, 0xE2, + 0xFD, 0xF3, 0x00, 0xF1, 0xB4, 0xF1, 0x7F, 0xEF, 0x28, 0xF0, 0xFE, 0xEC, + 0xF2, 0xF9, 0x3B, 0xF2, 0x18, 0xF7, 0xE1, 0xE8, 0x6A, 0xF0, 0x5B, 0xE9, + 0x16, 0xEE, 0x80, 0xF6, 0xFE, 0xE8, 0xF8, 0x02, 0xD5, 0xE7, 0x14, 0x04, + 0x64, 0xF8, 0x5D, 0x08, 0xA2, 0xF7, 0x89, 0xFE, 0x45, 0xEE, 0xE1, 0xEE, + 0x2F, 0xEF, 0x88, 0xED, 0x98, 0xE9, 0xF1, 0xE5, 0x40, 0xF0, 0xCB, 0xE5, + 0x5A, 0xF1, 0x70, 0xDE, 0x60, 0xFB, 0x52, 0xE4, 0x23, 0xFF, 0x42, 0xEB, + 0x65, 0xFB, 0x18, 0xEB, 0x13, 0x02, 0xBB, 0xF5, 0x98, 0xFC, 0x71, 0xF4, + 0xD4, 0xF5, 0x67, 0xF7, 0x56, 0xEE, 0xDD, 0xF6, 0xBF, 0xF0, 0x67, 0xF4, + 0xC4, 0xF7, 0xA4, 0xF4, 0xCD, 0xF1, 0x6D, 0xEB, 0x30, 0xF9, 0xF7, 0xF8, + 0x81, 0xF5, 0xF6, 0xFD, 0x78, 0xF5, 0xAB, 0xFB, 0xB0, 0x07, 0xDA, 0xFE, + 0x6C, 0x0D, 0x29, 0xF7, 0xF5, 0x12, 0x1B, 0xFD, 0x66, 0x0F, 0x00, 0xFE, + 0x74, 0x0A, 0xE4, 0xFC, 0xD4, 0x05, 0xE3, 0xFF, 0x2B, 0xFB, 0xFB, 0x04, + 0xEC, 0xF3, 0x63, 0x0B, 0x39, 0xF2, 0xB0, 0x08, 0x1D, 0xF4, 0xE2, 0xFF, + 0xF2, 0xF4, 0x3C, 0xF0, 0xB0, 0xFC, 0x9D, 0xEF, 0xD5, 0xF8, 0xA7, 0xEF, + 0xD4, 0xEC, 0x82, 0xE9, 0x20, 0xF2, 0x07, 0xF4, 0xF0, 0xEF, 0x07, 0xF0, + 0x61, 0xF9, 0xF2, 0xF4, 0x60, 0x02, 0xB4, 0xFA, 0x66, 0xFD, 0x92, 0xF2, + 0xF2, 0x02, 0x6D, 0xF8, 0xA9, 0x01, 0x1A, 0xF7, 0x49, 0xFD, 0xC9, 0xF4, + 0x4E, 0xF7, 0xB3, 0xEF, 0x34, 0xF4, 0x77, 0xEB, 0x1A, 0xF8, 0xE1, 0xE5, + 0xDC, 0x08, 0x0D, 0xEA, 0xC9, 0x0E, 0x29, 0xF1, 0x3D, 0x05, 0x6A, 0xF1, + 0xD9, 0x02, 0x0F, 0xF7, 0x12, 0xF9, 0xFA, 0xF0, 0x86, 0xF7, 0x26, 0xF8, + 0xF9, 0xFB, 0x58, 0x0F, 0x16, 0xF5, 0x50, 0x15, 0x05, 0xF6, 0xAA, 0x1B, + 0x4E, 0xF1, 0xA5, 0x16, 0xF8, 0xEA, 0x28, 0x08, 0x66, 0xE8, 0x68, 0x00, + 0x60, 0xEA, 0x63, 0x00, 0x27, 0xEE, 0x9C, 0xFF, 0xF0, 0xF8, 0xC8, 0xFE, + 0x3F, 0x03, 0xB0, 0xFF, 0x2E, 0xFB, 0x56, 0xF6, 0xA3, 0xFD, 0x84, 0xF9, + 0x93, 0xF6, 0xA8, 0xED, 0xC4, 0xFC, 0x67, 0xEB, 0x47, 0x0A, 0x2C, 0xF6, + 0xC4, 0x03, 0xBB, 0xEE, 0x78, 0x0B, 0x22, 0xF6, 0x7E, 0x00, 0x46, 0xF2, + 0x10, 0xF7, 0xEE, 0xEC, 0xB7, 0xFC, 0xBD, 0xF1, 0x21, 0xFA, 0x24, 0xEF, + 0x21, 0x03, 0x8E, 0xF7, 0x36, 0x04, 0x64, 0xFA, 0x44, 0x08, 0xFD, 0xFF, + 0x16, 0x0A, 0x6E, 0x04, 0x41, 0x07, 0xD1, 0x07, 0x2C, 0x00, 0xDA, 0x0A, + 0xC8, 0xF6, 0xDE, 0x09, 0x65, 0xF8, 0x15, 0x0D, 0xD1, 0xF7, 0x3A, 0x0B, + 0x2E, 0x00, 0x6E, 0x11, 0x7D, 0x00, 0x41, 0x0E, 0xDA, 0x02, 0xFE, 0x05, + 0x60, 0x0C, 0x47, 0x04, 0x38, 0x09, 0xB9, 0x00, 0xC4, 0x0B, 0x93, 0x05, + 0x4B, 0x08, 0x81, 0x06, 0x46, 0x02, 0xF9, 0x03, 0x57, 0x04, 0x4F, 0x03, + 0x5B, 0x02, 0x2B, 0xFF, 0x3A, 0x03, 0x61, 0x03, 0x8D, 0xFE, 0xA5, 0x09, + 0xEA, 0xFA, 0x87, 0x10, 0x99, 0x02, 0x4C, 0x18, 0xA3, 0x04, 0x2F, 0x10, + 0xA5, 0x02, 0xD2, 0x06, 0xA0, 0x05, 0xC7, 0x07, 0x43, 0x0E, 0x7B, 0x05, + 0xF6, 0x14, 0xB8, 0x00, 0xB6, 0x22, 0x4E, 0x08, 0xFF, 0x25, 0x6F, 0x0B, + 0xA6, 0x19, 0x4B, 0x05, 0x99, 0x1C, 0xBB, 0x0B, 0xA2, 0x16, 0x6B, 0x0D, + 0xC4, 0x10, 0xC3, 0x11, 0x01, 0x14, 0x13, 0x1B, 0x22, 0x0D, 0x92, 0x16, + 0x8F, 0x06, 0xAF, 0x13, 0xD1, 0xFF, 0x2B, 0x11, 0xC2, 0xFC, 0x70, 0x0B, + 0xB7, 0x02, 0x36, 0x0F, 0x02, 0x07, 0xA0, 0x11, 0x56, 0x07, 0xDF, 0x0B, + 0x1E, 0x12, 0x17, 0x0B, 0xF4, 0x1B, 0x3C, 0x05, 0x84, 0x1B, 0xAF, 0x04, + 0x33, 0x09, 0xD8, 0xFE, 0xB7, 0x03, 0x93, 0x04, 0x24, 0x06, 0xE5, 0x0A, + 0xFB, 0x06, 0xA1, 0x08, 0xBE, 0x13, 0xA0, 0x17, 0x58, 0x10, 0x3B, 0x14, + 0x89, 0x0E, 0x9D, 0x0D, 0x97, 0x18, 0xEF, 0x10, 0x44, 0x17, 0x0A, 0x0C, + 0x22, 0x0E, 0x07, 0x05, 0x8C, 0x0B, 0x3A, 0x07, 0x05, 0x0B, 0xF3, 0x0B, + 0x51, 0x10, 0x18, 0x11, 0x98, 0x12, 0x06, 0x18, 0x47, 0x0D, 0xFB, 0x1B, + 0xAC, 0x07, 0xFD, 0x15, 0xBB, 0x0B, 0x15, 0x19, 0x43, 0x02, 0x7F, 0x0F, + 0x68, 0x06, 0xE9, 0x12, 0x84, 0x0A, 0x4A, 0x15, 0x9C, 0x07, 0xFF, 0x0E, + 0x4E, 0x13, 0xC9, 0x17, 0x8A, 0x12, 0xFD, 0x11, 0x48, 0x17, 0x97, 0x11, + 0xC1, 0x11, 0x2D, 0x06, 0x5E, 0x0B, 0x2F, 0x00, 0x61, 0x10, 0x90, 0x08, + 0x2E, 0x09, 0x74, 0x00, 0x47, 0x10, 0x99, 0x0C, 0x89, 0x12, 0x44, 0x1B, + 0x52, 0x06, 0xA6, 0x19, 0xEB, 0x06, 0x7C, 0x1A, 0xFA, 0x05, 0x8B, 0x16, + 0xED, 0x0A, 0xCD, 0x1A, 0x17, 0x07, 0x0F, 0x13, 0x62, 0x10, 0xF9, 0x19, + 0x5F, 0x11, 0x10, 0x1A, 0x72, 0x03, 0xC1, 0x0D, 0x65, 0x06, 0x6B, 0x15, + 0xB2, 0xF9, 0x2F, 0x08, 0xA8, 0xFE, 0x98, 0x06, 0x15, 0x0D, 0x19, 0x0E, + 0x83, 0x13, 0x61, 0x13, 0xB2, 0x1A, 0x05, 0x1A, 0xAD, 0x11, 0x22, 0x13, + 0x83, 0x08, 0xDD, 0x10, 0x1C, 0xFE, 0x44, 0x09, 0xBF, 0xFA, 0x8E, 0x03, + 0x19, 0x02, 0x59, 0x03, 0x77, 0x06, 0x9D, 0xFF, 0x10, 0x12, 0x62, 0x07, + 0x6A, 0x0A, 0x23, 0x02, 0x7A, 0x01, 0x06, 0xFF, 0x07, 0xFC, 0x2D, 0xFA, + 0x27, 0xF5, 0x29, 0xF6, 0xAF, 0xF6, 0x21, 0xF8, 0xD7, 0x00, 0xD7, 0xF8, + 0x01, 0x0A, 0x12, 0xFA, 0xBF, 0x0B, 0x0B, 0xF9, 0xE0, 0x09, 0x51, 0xF8, + 0xB5, 0xFF, 0xFA, 0xF1, 0xA3, 0xFB, 0x59, 0xF3, 0xA8, 0xFF, 0x52, 0xFA, + 0xEE, 0xFE, 0x6A, 0xFE, 0xC7, 0xFD, 0xC3, 0x04, 0x47, 0x01, 0x9E, 0x07, + 0x77, 0xFF, 0xE5, 0x00, 0x49, 0x01, 0xAC, 0x00, 0xED, 0x05, 0x37, 0x0A, + 0x3F, 0x06, 0x17, 0x12, 0x58, 0x0E, 0xF5, 0x15, 0x81, 0x1A, 0x25, 0x1D, + 0x0A, 0x14, 0xC7, 0x19, 0x83, 0x12, 0x2E, 0x1E, 0x58, 0x0B, 0x68, 0x1A, + 0x7F, 0x0A, 0x43, 0x19, 0x7A, 0x10, 0xA3, 0x1A, 0xBC, 0x0B, 0x5B, 0x0E, + 0x89, 0x14, 0x1A, 0x13, 0xF0, 0x0E, 0xC0, 0x0D, 0x38, 0x06, 0xBA, 0x07, + 0xBA, 0x09, 0xB7, 0x0A, 0xBB, 0x0C, 0xAC, 0x08, 0xF0, 0x0D, 0x5F, 0x0B, + 0x95, 0x0B, 0xF3, 0x0B, 0x7C, 0x14, 0xA0, 0x15, 0x1C, 0x13, 0x50, 0x14, + 0x4D, 0x18, 0x12, 0x1A, 0xBA, 0x14, 0x91, 0x1F, 0x36, 0x07, 0x1C, 0x19, + 0x04, 0x11, 0x98, 0x1E, 0x1F, 0x03, 0xBA, 0x0A, 0xD7, 0x01, 0xF1, 0x09, + 0xBF, 0xFF, 0x11, 0x0A, 0x7D, 0xF3, 0xCE, 0x00, 0xE4, 0xFF, 0x80, 0x0E, + 0x1C, 0x04, 0x90, 0x09, 0x89, 0x10, 0x58, 0x0D, 0x35, 0x14, 0x1C, 0x0F, + 0x5A, 0x10, 0x9E, 0x0C, 0x40, 0x0D, 0xA8, 0x0E, 0xE0, 0xFD, 0x40, 0xFD, + 0x84, 0x03, 0x62, 0xFE, 0xFA, 0xFB, 0xD6, 0xFA, 0x70, 0xF6, 0xC8, 0xFA, + 0x47, 0xFD, 0x7D, 0x00, 0x1F, 0xFD, 0x82, 0xF9, 0xC1, 0x01, 0x21, 0xF9, + 0x74, 0xF7, 0x6A, 0xEE, 0x54, 0xF5, 0x46, 0xEE, 0xDB, 0xF6, 0xC4, 0xE9, + 0x4F, 0xFE, 0x58, 0xE7, 0xA8, 0x0E, 0x9B, 0xF5, 0x4C, 0x11, 0x9E, 0xFC, + 0xF5, 0x12, 0x21, 0x07, 0x1C, 0x0C, 0xB7, 0x04, 0x45, 0x05, 0xED, 0xFD, + 0x48, 0x01, 0x79, 0x00, 0xB7, 0xF8, 0x48, 0x02, 0xDA, 0xF5, 0x05, 0x0A, + 0x31, 0xF9, 0xD0, 0x0F, 0x93, 0xFF, 0xC6, 0x0D, 0xB6, 0x01, 0xC0, 0x07, + 0x7B, 0x01, 0xA5, 0x08, 0x3C, 0xFD, 0x76, 0x09, 0xD3, 0xFF, 0x43, 0x0D, + 0xAC, 0x10, 0x28, 0x1C, 0xF9, 0x16, 0xD5, 0x1A, 0x67, 0x16, 0xF1, 0x14, + 0x53, 0x13, 0x42, 0x11, 0x10, 0x01, 0xFB, 0xFD, 0xC3, 0xF8, 0xC0, 0xF9, + 0x8F, 0xFE, 0x54, 0x04, 0xBD, 0xFD, 0x79, 0x04, 0x5B, 0xFE, 0xA9, 0x03, + 0x60, 0x01, 0x47, 0xFE, 0x82, 0x00, 0xA4, 0xF1, 0x2D, 0x00, 0x08, 0xEB, + 0x2B, 0x01, 0xEF, 0xEC, 0xE1, 0x04, 0xD9, 0xEF, 0x22, 0x0E, 0xD7, 0xF8, + 0x9E, 0x12, 0x6B, 0x00, 0x19, 0x16, 0x13, 0x09, 0xCC, 0x0C, 0x44, 0x08, + 0x56, 0xFB, 0x39, 0xFE, 0x2E, 0xEF, 0xDA, 0xF7, 0xDF, 0xE6, 0x3B, 0xF0, + 0x62, 0xF0, 0xB0, 0xF4, 0xC6, 0xF1, 0x7B, 0xF5, 0xFF, 0xE3, 0x4F, 0xED, + 0xF4, 0xE5, 0x95, 0xF4, 0xD3, 0xE4, 0xF1, 0xEF, 0xBF, 0xEB, 0x20, 0xF0, + 0x69, 0xF7, 0x56, 0xFD, 0x6D, 0xF3, 0xE6, 0xFF, 0x16, 0xF2, 0x35, 0x02, + 0xC6, 0xF4, 0x5B, 0x02, 0xB2, 0xF0, 0x20, 0xFA, 0x05, 0xE9, 0x2F, 0xEC, + 0xBB, 0xEF, 0x4E, 0xED, 0x9C, 0xED, 0xF6, 0xE8, 0xDC, 0xF2, 0x29, 0xED, + 0x5F, 0xF6, 0xBE, 0xF2, 0x55, 0xF3, 0xA6, 0xED, 0xE1, 0xFA, 0xEC, 0xEB, + 0xE9, 0xF3, 0x64, 0xDF, 0x5F, 0xF3, 0xF3, 0xE1, 0x2F, 0xF6, 0x07, 0xEE, + 0x10, 0xED, 0xF2, 0xEF, 0xFB, 0xE8, 0x94, 0xF5, 0x9A, 0xE7, 0x88, 0xF4, + 0x0E, 0xEC, 0x5C, 0xF4, 0xDC, 0xF1, 0x42, 0xFB, 0xC0, 0xEF, 0xDE, 0xFA, + 0x8C, 0xED, 0xA4, 0xF7, 0x1A, 0xF2, 0x9E, 0xF9, 0x08, 0xF5, 0x59, 0xF8, + 0x7C, 0xF2, 0x6A, 0xEF, 0xE2, 0xF5, 0xC9, 0xEF, 0x16, 0xF6, 0x45, 0xF1, + 0x3D, 0xFF, 0x5E, 0xF6, 0x0A, 0x0C, 0xB0, 0xFB, 0xC2, 0x0C, 0x85, 0xF8, + 0x29, 0x08, 0x8D, 0xF7, 0xF4, 0xFC, 0x5C, 0xF6, 0x8C, 0xF9, 0x70, 0xF9, + 0x2D, 0xF6, 0xBD, 0xF8, 0xAD, 0xEE, 0x3C, 0xF6, 0x37, 0xE5, 0xF5, 0xF3, + 0x31, 0xE1, 0x87, 0xF0, 0x6E, 0xE9, 0xB3, 0xF1, 0x6A, 0xEA, 0x12, 0xEE, + 0x61, 0xEF, 0x08, 0xF2, 0x62, 0xF1, 0x34, 0xF2, 0xBC, 0xE6, 0x60, 0xE2, + 0x9F, 0xEF, 0x7E, 0xE8, 0xA8, 0xEC, 0x45, 0xE6, 0x7C, 0xEB, 0x6A, 0xE2, + 0xBF, 0x00, 0x7E, 0xF0, 0xA2, 0xFE, 0xA0, 0xE5, 0x41, 0xF2, 0xED, 0xD5, + 0x55, 0xF6, 0xD3, 0xDE, 0x06, 0xF6, 0x8F, 0xE6, 0x14, 0xEB, 0xA5, 0xE4, + 0xDC, 0xEB, 0xE7, 0xE7, 0x24, 0xF8, 0x6B, 0xED, 0x2D, 0xFF, 0xBC, 0xEC, + 0xA9, 0x00, 0x76, 0xEF, 0x01, 0x02, 0x44, 0xFA, 0x8E, 0xF6, 0xEB, 0xFA, + 0x37, 0xE9, 0x0C, 0xF5, 0x68, 0xF3, 0x2A, 0xFB, 0x42, 0xF0, 0x5E, 0xF1, + 0x41, 0xE2, 0xFD, 0xE3, 0xA3, 0xEB, 0xEE, 0xF3, 0x06, 0xF2, 0x78, 0x00, + 0xA2, 0xED, 0x96, 0xF9, 0x8D, 0xEA, 0x9D, 0xEF, 0xFE, 0xF1, 0xD8, 0xF3, + 0x7B, 0xF1, 0x2C, 0xF0, 0x9F, 0xFB, 0x08, 0xF4, 0x4B, 0x0A, 0xAE, 0xFE, + 0x04, 0xFE, 0x94, 0xF3, 0xA6, 0xF5, 0xC5, 0xE9, 0x6F, 0xF2, 0x38, 0xDF, + 0xB4, 0xF4, 0x7B, 0xDA, 0x15, 0xFB, 0xA4, 0xE5, 0x54, 0xFF, 0x2F, 0xF9, + 0xD1, 0x05, 0x31, 0x0A, 0x3C, 0xFD, 0x2E, 0x03, 0x5C, 0xF9, 0xEA, 0xFC, + 0xED, 0xF5, 0x0D, 0xF7, 0x5E, 0xFA, 0x13, 0xFC, 0x9F, 0x06, 0xA1, 0x0C, + 0x1E, 0x05, 0x29, 0x12, 0xCF, 0x09, 0xF4, 0x18, 0x92, 0x01, 0xF4, 0x07, + 0x41, 0xFC, 0x3B, 0xF7, 0xC2, 0x03, 0x4E, 0xFE, 0xC3, 0xFC, 0x68, 0x00, + 0xFA, 0xF8, 0xEF, 0x01, 0x74, 0xFC, 0xAA, 0x01, 0x1D, 0xF8, 0xAA, 0xF4, + 0x5E, 0xFF, 0x06, 0xF8, 0x29, 0xFA, 0x1B, 0xF7, 0xA8, 0xF4, 0x9A, 0xF9, + 0x7B, 0xFB, 0xB8, 0x09, 0xD4, 0xF4, 0x05, 0x0A, 0xA8, 0xF2, 0x22, 0x09, + 0x21, 0xFA, 0x47, 0x0C, 0x15, 0xF4, 0x73, 0xFD, 0x64, 0xFA, 0xDB, 0xF9, + 0x13, 0x03, 0x85, 0xFD, 0x4E, 0xF9, 0x0A, 0xF5, 0x3D, 0xFB, 0xE6, 0xF7, + 0x8C, 0x08, 0x52, 0x01, 0x39, 0x0A, 0xD9, 0xFC, 0x4B, 0x09, 0x6A, 0xF7, + 0xAA, 0x11, 0x20, 0xFE, 0x62, 0x11, 0x62, 0xFD, 0x55, 0x13, 0xE7, 0x00, + 0x08, 0x13, 0xC3, 0x03, 0x31, 0x10, 0xEE, 0x02, 0x63, 0x11, 0x16, 0x06, + 0x2C, 0x10, 0xEF, 0x09, 0x1D, 0x05, 0xD2, 0x05, 0xB2, 0xFB, 0xBA, 0x00, + 0x93, 0xF7, 0x91, 0xFD, 0x65, 0xFA, 0x77, 0x01, 0xC2, 0xF3, 0x23, 0xFB, + 0x3A, 0xED, 0xEC, 0xEF, 0x1A, 0xF7, 0x34, 0xF3, 0x41, 0xF6, 0x08, 0xF2, + 0x16, 0xFB, 0x30, 0xFC, 0xDA, 0xFD, 0x83, 0xFF, 0xE2, 0xFE, 0x08, 0xF8, + 0x55, 0x0D, 0x82, 0xFD, 0x38, 0x0A, 0xCF, 0xF8, 0xB1, 0x00, 0x31, 0xF1, + 0xC8, 0xF5, 0x7A, 0xE7, 0x6B, 0xF6, 0x70, 0xEB, 0xE6, 0x03, 0x74, 0xFE, + 0x9D, 0xFE, 0xA8, 0xFA, 0x62, 0x08, 0x27, 0x01, 0xE1, 0x02, 0xE0, 0xF9, + 0x98, 0xFA, 0xA5, 0xF2, 0x8F, 0xFB, 0x72, 0xF8, 0x27, 0xF9, 0x9D, 0xFF, + 0x5C, 0xF7, 0xC3, 0x03, 0x87, 0xF5, 0x48, 0xFD, 0xD0, 0x03, 0xA7, 0x01, + 0x9F, 0xFC, 0x6E, 0xF1, 0xC1, 0xFF, 0x36, 0xF1, 0x25, 0x06, 0x40, 0xFB, + 0xDA, 0xFC, 0xC4, 0xF4, 0xFB, 0x06, 0x0D, 0x01, 0x06, 0xFE, 0x0B, 0x01, + 0x61, 0xEB, 0x02, 0xF8, 0xF7, 0xF0, 0x3B, 0xFE, 0xAC, 0xF2, 0x90, 0xFD, + 0x89, 0xF7, 0x1A, 0x03, 0xDE, 0x04, 0x69, 0x10, 0x84, 0x06, 0x7B, 0x0C, + 0x94, 0x0A, 0xF2, 0x09, 0x32, 0x11, 0x4C, 0x11, 0x17, 0x00, 0xDD, 0x04, + 0xD0, 0xF9, 0x21, 0x02, 0xEF, 0x04, 0x33, 0x11, 0x7C, 0xFF, 0x4D, 0x0B, + 0x43, 0x00, 0x8F, 0x05, 0xD3, 0x04, 0x8C, 0x0B, 0x23, 0x07, 0xF7, 0x11, + 0xEB, 0x02, 0xAB, 0x0B, 0x7F, 0x03, 0x2C, 0x10, 0xD3, 0x03, 0x4D, 0x13, + 0x65, 0x01, 0x02, 0x08, 0x79, 0x09, 0x13, 0x0C, 0xC2, 0x11, 0xB6, 0x16, + 0xD5, 0x0B, 0x78, 0x12, 0x92, 0xFB, 0x1E, 0x04, 0xFF, 0x05, 0x26, 0x06, + 0xED, 0x0E, 0x70, 0x06, 0x45, 0x0E, 0x83, 0x06, 0xC3, 0x05, 0x8D, 0x02, + 0xB3, 0xF7, 0x58, 0x01, 0xAB, 0xF8, 0xC0, 0x09, 0xC1, 0xF6, 0x8E, 0x02, + 0x8E, 0xFA, 0xDD, 0x07, 0x88, 0xFC, 0x4D, 0x02, 0x98, 0x06, 0x60, 0xF5, + 0x60, 0x12, 0x33, 0xF9, 0x82, 0x10, 0x79, 0xF7, 0xDB, 0x0E, 0x8D, 0xF5, + 0xB6, 0x04, 0x55, 0xF0, 0xCF, 0x00, 0x69, 0xEE, 0x79, 0x02, 0x90, 0xF1, + 0xC9, 0xFE, 0xDA, 0xF0, 0xC0, 0x06, 0x07, 0xF8, 0x45, 0x0B, 0x0F, 0x04, + 0xA3, 0x09, 0x74, 0x0E, 0xE2, 0x09, 0x12, 0x14, 0x93, 0x0A, 0x4B, 0x1A, + 0x3F, 0x0D, 0x61, 0x1B, 0xAB, 0x10, 0x0C, 0x17, 0xD2, 0x16, 0x47, 0x1B, + 0xB4, 0x11, 0x40, 0x15, 0x3F, 0x19, 0x65, 0x1C, 0x7C, 0x16, 0x3E, 0x21, + 0xE0, 0x04, 0xE3, 0x11, 0x0D, 0x0A, 0x43, 0x12, 0x8E, 0x07, 0xA0, 0x0D, + 0x50, 0x06, 0xD2, 0x08, 0xC5, 0x07, 0x15, 0x0B, 0xEC, 0xF8, 0xE4, 0x01, + 0xB0, 0xFD, 0xBA, 0x02, 0x77, 0x0F, 0x1B, 0x0D, 0xC7, 0x17, 0x7B, 0x15, + 0x9F, 0x17, 0x74, 0x14, 0x5C, 0x13, 0x19, 0x14, 0xFB, 0x0F, 0xDF, 0x11, + 0x56, 0x0E, 0x0A, 0x07, 0xE3, 0x0C, 0x27, 0x04, 0xF8, 0x0E, 0xFE, 0x08, + 0xB9, 0x0A, 0x31, 0x04, 0x4F, 0x03, 0x91, 0x01, 0xD4, 0x0C, 0xA2, 0x0E, + 0x87, 0x07, 0xC3, 0x0B, 0x0D, 0xFA, 0x36, 0x00, 0xCC, 0x0A, 0x3A, 0x07, + 0x8C, 0x0C, 0x57, 0x0D, 0xA9, 0xFB, 0xE2, 0x0D, 0xF8, 0x09, 0xE4, 0x19, + 0x86, 0x15, 0xC2, 0x16, 0x0C, 0x11, 0xEE, 0x0C, 0x06, 0x0A, 0xEE, 0x0D, + 0x20, 0xFA, 0x11, 0x06, 0x08, 0x00, 0xA8, 0x06, 0xCB, 0x08, 0x63, 0x0D, + 0x4C, 0xF4, 0x1F, 0x03, 0x25, 0xF6, 0x2B, 0x08, 0x32, 0xF5, 0xFF, 0xFF, + 0x29, 0xF9, 0x57, 0xF3, 0x00, 0x06, 0x1B, 0xF7, 0x45, 0xFE, 0x78, 0xF5, + 0xCA, 0x05, 0x4E, 0xFD, 0x89, 0x0E, 0xD0, 0xFB, 0xCE, 0x19, 0x5E, 0x00, + 0x78, 0x0B, 0x3B, 0xFB, 0xD6, 0xF6, 0x64, 0xF6, 0x6C, 0xFB, 0x02, 0xF7, + 0xE0, 0xFB, 0x01, 0xF0, 0x22, 0xFF, 0x0B, 0x03, 0xCA, 0x01, 0x6E, 0x11, + 0xE8, 0x0B, 0x0E, 0x1C, 0xDA, 0x17, 0xEE, 0x24, 0x0E, 0x0E, 0x77, 0x1C, + 0x04, 0x05, 0x0F, 0x26, 0xB0, 0x00, 0xB5, 0x28, 0x9D, 0xFC, 0x56, 0x12, + 0xCC, 0x06, 0xD9, 0x15, 0x80, 0x0F, 0x26, 0x25, 0xB2, 0x08, 0x95, 0x1F, + 0x45, 0x08, 0x50, 0x17, 0xFF, 0x1B, 0x89, 0x17, 0x44, 0x0A, 0xAD, 0x09, + 0xAB, 0xF8, 0xFD, 0x0F, 0x11, 0x01, 0xD2, 0x14, 0x7D, 0xFA, 0x71, 0xF9, + 0xF1, 0x00, 0xA8, 0xF8, 0xBE, 0x04, 0xF7, 0xF7, 0x5B, 0x0A, 0x8B, 0xF5, + 0x0A, 0x22, 0xE9, 0x02, 0x6D, 0x2A, 0x70, 0x08, 0x8D, 0x14, 0xAF, 0x09, + 0x76, 0x06, 0x4B, 0x09, 0x53, 0x16, 0x86, 0x08, 0x2F, 0x11, 0x41, 0xFF, + 0x90, 0x07, 0x10, 0x04, 0x51, 0x13, 0xD4, 0x12, 0xA3, 0xFE, 0xAD, 0x01, + 0xD0, 0xFC, 0x6D, 0x00, 0xE3, 0x07, 0xA1, 0x0C, 0x51, 0xF6, 0x8C, 0x0C, + 0x02, 0xF0, 0xC8, 0x07, 0x5C, 0xF1, 0xEF, 0xFD, 0xD2, 0xF4, 0x18, 0x00, + 0x88, 0xF4, 0xD7, 0xFB, 0xF5, 0xF5, 0x11, 0x02, 0x77, 0xFF, 0x91, 0x0F, + 0x9C, 0xFF, 0x75, 0xFF, 0x9C, 0xF3, 0x63, 0xFD, 0x18, 0xFA, 0x38, 0x0B, + 0xB4, 0x0D, 0xB5, 0x02, 0x1C, 0x09, 0x2B, 0xF9, 0x96, 0x03, 0x23, 0xFC, + 0xB8, 0xFF, 0x98, 0xF7, 0x7F, 0xF4, 0x62, 0xF5, 0xFC, 0x0B, 0xE1, 0x04, + 0xBF, 0x10, 0xB0, 0xFA, 0xC3, 0xF6, 0x1C, 0xEA, 0xC2, 0xF4, 0x1E, 0xED, + 0x2D, 0xEF, 0x3E, 0xEB, 0xA4, 0xED, 0x13, 0xE8, 0x28, 0xF2, 0xE8, 0xE3, + 0xC9, 0xFC, 0xA8, 0xF5, 0x9F, 0x08, 0xF8, 0xF9, 0xD9, 0x13, 0x15, 0xF8, + 0x68, 0x10, 0x16, 0x13, 0xE2, 0xFB, 0xC0, 0x16, 0xA8, 0xFF, 0x74, 0x07, + 0x9C, 0x0E, 0x40, 0x09, 0x33, 0x12, 0x61, 0x0E, 0x9E, 0x0F, 0x27, 0x14, + 0x71, 0xFC, 0x55, 0x0F, 0xDD, 0xF3, 0x29, 0x0D, 0x2E, 0xFC, 0xB5, 0x0B, + 0x50, 0x01, 0x48, 0x02, 0x85, 0x0A, 0x1D, 0x07, 0xFA, 0xFA, 0x9F, 0xFE, + 0x5F, 0xF9, 0x6D, 0xFD, 0xB0, 0x12, 0x1D, 0x0C, 0xF9, 0x1A, 0xE4, 0x12, + 0x4E, 0x10, 0x6C, 0x0B, 0xF0, 0xFB, 0x8D, 0xFF, 0xBC, 0xF1, 0x82, 0x0A, + 0xD3, 0xF9, 0x53, 0x16, 0x15, 0x09, 0x97, 0x0A, 0x41, 0x0F, 0x8E, 0x03, + 0x31, 0x10, 0xCB, 0x01, 0x26, 0x11, 0x96, 0xFB, 0x2D, 0x00, 0xBD, 0xF5, + 0x9C, 0x02, 0xA7, 0x00, 0x2B, 0x12, 0x31, 0x0A, 0xA2, 0x08, 0xF0, 0x07, + 0xE1, 0x06, 0x66, 0x16, 0x84, 0xFF, 0x9A, 0x11, 0x57, 0xFB, 0x43, 0x02, + 0xDD, 0x01, 0xC7, 0xF7, 0xA0, 0x0E, 0x29, 0xFE, 0x7F, 0x1B, 0xA3, 0x0B, + 0xD6, 0x06, 0x16, 0x02, 0xE9, 0xF7, 0x37, 0x08, 0xC5, 0xF5, 0xD8, 0x0D, + 0x94, 0xE6, 0x96, 0xFB, 0x12, 0xEF, 0x7E, 0xF4, 0x19, 0x0E, 0xB3, 0xF7, + 0xA3, 0x1D, 0xCF, 0xF9, 0x0D, 0x15, 0xCB, 0xF5, 0xE6, 0x06, 0x56, 0xF5, + 0x46, 0xFF, 0x03, 0x0A, 0x85, 0xF1, 0x6C, 0x06, 0x64, 0xFB, 0xB9, 0xFB, + 0xF7, 0x0F, 0xAD, 0xFC, 0x34, 0xFD, 0x45, 0xF1, 0x89, 0xE9, 0x7F, 0xF0, + 0x97, 0xF8, 0x96, 0xFA, 0xF6, 0xF7, 0x47, 0xF4, 0x9C, 0xE8, 0xAC, 0xEF, + 0xCC, 0xF0, 0x19, 0xF5, 0xBE, 0xF6, 0x39, 0xF1, 0xF6, 0xFD, 0x23, 0xF5, + 0x95, 0x07, 0xB7, 0xF0, 0xCB, 0xFE, 0x7C, 0xE9, 0x57, 0xF6, 0x7A, 0xF0, + 0x86, 0xEF, 0x2D, 0xF2, 0x8B, 0xE3, 0x51, 0xFA, 0xB7, 0xD5, 0x61, 0x00, + 0xAE, 0xCF, 0x8D, 0xF6, 0xE2, 0xE5, 0x50, 0xF0, 0x5F, 0xF9, 0x16, 0xE5, + 0xEB, 0xEA, 0x0C, 0xDB, 0xAB, 0xD3, 0xA3, 0xDD, 0x87, 0xCF, 0x30, 0xD9, + 0xA6, 0xDE, 0x4E, 0xDC, 0xD4, 0xF3, 0x87, 0xEA, 0x07, 0xFB, 0x69, 0xED, + 0x9C, 0xF7, 0x66, 0xF1, 0x03, 0xED, 0xB4, 0xEE, 0x6E, 0xE4, 0x22, 0xE1, + 0xF1, 0xDE, 0x87, 0xDE, 0x58, 0xD5, 0x8F, 0xDD, 0x54, 0xDC, 0x94, 0xD7, + 0x34, 0xED, 0xF8, 0xD9, 0x9F, 0xEF, 0x60, 0xEA, 0xFF, 0xDB, 0x21, 0xF7, + 0x38, 0xD1, 0x23, 0xF7, 0x10, 0xE4, 0x41, 0xF3, 0x95, 0x00, 0xD7, 0xF4, + 0xFC, 0x05, 0x8F, 0xF9, 0xB9, 0x03, 0xAF, 0xFC, 0xF5, 0x06, 0x6B, 0x02, + 0x68, 0x00, 0x11, 0x0A, 0xCA, 0xFE, 0xF5, 0x12, 0x81, 0xF0, 0xD9, 0x0F, + 0x94, 0xEB, 0xD7, 0x03, 0xB8, 0x0A, 0x99, 0xFA, 0x42, 0x12, 0xE9, 0xF4, + 0x69, 0xFB, 0xC9, 0xF1, 0xF3, 0xF9, 0xF1, 0xE7, 0x1B, 0x0A, 0x1A, 0xE7, + 0x8F, 0x0C, 0xDC, 0xEF, 0xC6, 0x03, 0x5E, 0x00, 0xB5, 0xFC, 0x3F, 0x17, + 0xF6, 0xF7, 0x08, 0x11, 0xF3, 0x08, 0x72, 0x07, 0x3B, 0x19, 0x70, 0x04, + 0xC7, 0x11, 0x7F, 0xF3, 0x28, 0x09, 0x7B, 0xF2, 0x8F, 0xFA, 0xFC, 0xF0, + 0xC0, 0xED, 0x60, 0xE4, 0x30, 0xF5, 0x2C, 0xF6, 0x62, 0x05, 0x7C, 0x08, + 0xCD, 0x0D, 0x4F, 0xFD, 0x0D, 0x17, 0xFF, 0xF8, 0xA6, 0x1D, 0xE7, 0xFB, + 0xC8, 0x17, 0x7E, 0xF7, 0x17, 0x15, 0x4C, 0xFE, 0xCB, 0x15, 0x4D, 0x12, + 0x91, 0xFE, 0x01, 0x0C, 0xC0, 0xEE, 0x04, 0x02, 0x5B, 0xF2, 0x8A, 0x07, + 0xA3, 0xEB, 0x0F, 0x01, 0xF7, 0xEE, 0xC2, 0xF6, 0xFD, 0xFF, 0x48, 0xFC, + 0xEB, 0x02, 0x6D, 0x03, 0x3F, 0x06, 0x09, 0xFF, 0xF3, 0x1B, 0xFF, 0x07, + 0x26, 0x25, 0x04, 0x1F, 0xC1, 0x16, 0x96, 0x24, 0x2E, 0x1B, 0x85, 0x20, + 0xF1, 0x2D, 0xD4, 0x29, 0x6A, 0x21, 0x8F, 0x2E, 0xDB, 0x14, 0xC7, 0x27, + 0x5D, 0x09, 0xE6, 0x12, 0xC6, 0xF1, 0x73, 0x06, 0x84, 0xED, 0xFB, 0x0A, + 0x62, 0xF2, 0x73, 0x07, 0x75, 0xF2, 0x24, 0x02, 0x1A, 0xF2, 0xDC, 0xFA, + 0xB1, 0xFE, 0x53, 0xF5, 0x9E, 0x14, 0x4C, 0x05, 0x04, 0x14, 0x89, 0x14, + 0x06, 0x08, 0xE7, 0x0A, 0x3B, 0x0C, 0xBD, 0x0F, 0x13, 0x0B, 0x9C, 0x1D, + 0xC0, 0x04, 0x17, 0x10, 0xA7, 0x0D, 0xC3, 0xFD, 0xBB, 0x06, 0x20, 0xF9, + 0xAE, 0xF7, 0xDE, 0xF7, 0xFC, 0x02, 0xE3, 0xF3, 0x75, 0x05, 0x74, 0xEA, + 0x7D, 0xEE, 0xC9, 0xE1, 0xDB, 0xDC, 0x97, 0xE4, 0x8C, 0xE5, 0x9C, 0xEC, + 0x53, 0xF1, 0xDF, 0xEA, 0x43, 0xFB, 0xEB, 0xE2, 0xF0, 0x0E, 0x2D, 0xDB, + 0x88, 0x16, 0x14, 0xDD, 0xB2, 0x06, 0x17, 0xE5, 0xB0, 0xF2, 0x03, 0xE2, + 0xDD, 0xE9, 0xAB, 0xDD, 0xFA, 0xEB, 0x7C, 0xDC, 0x94, 0xF0, 0x3C, 0xDA, + 0x0E, 0xE6, 0xB9, 0xD0, 0x25, 0xD3, 0x59, 0xC2, 0x4B, 0xD5, 0xCA, 0xCA, + 0x67, 0xEB, 0x89, 0xE7, 0x34, 0xF4, 0x1A, 0xF1, 0x33, 0xF0, 0xD9, 0xE8, + 0xBF, 0xED, 0x54, 0xF2, 0xDC, 0xE4, 0x3D, 0xFE, 0xF9, 0xDD, 0x41, 0xFC, + 0xB9, 0xE4, 0xA7, 0xF2, 0xED, 0xE9, 0x6B, 0xF0, 0xB9, 0xF2, 0xCE, 0x01, + 0x4B, 0x06, 0xFD, 0x0B, 0xA7, 0x00, 0x26, 0x00, 0x34, 0xEB, 0xBF, 0xFC, + 0xFF, 0xDC, 0x3D, 0x03, 0xE5, 0xDF, 0xE6, 0x04, 0x9B, 0xF5, 0x43, 0x0A, + 0x87, 0xFD, 0xEC, 0x09, 0x1E, 0xFD, 0x99, 0x03, 0x22, 0x0E, 0x09, 0x0B, + 0x7E, 0x18, 0xF5, 0x10, 0x8E, 0x20, 0x8F, 0x0D, 0x32, 0x1F, 0x9A, 0x05, + 0xDC, 0x05, 0xCF, 0x00, 0x1E, 0xF3, 0x1F, 0xFD, 0xF3, 0xF5, 0x10, 0xF5, + 0x72, 0xEE, 0x64, 0xEA, 0xDF, 0xE1, 0xA2, 0xDD, 0x58, 0xF9, 0x88, 0xE3, + 0x5D, 0x0E, 0x72, 0xF3, 0xF0, 0x00, 0x7C, 0xF5, 0xF9, 0xF2, 0xEB, 0xFE, + 0x58, 0xF0, 0x6D, 0x00, 0x92, 0xF2, 0x0E, 0xEC, 0xEA, 0x00, 0x30, 0xE5, + 0x1C, 0xFC, 0x62, 0xE2, 0xF6, 0xDC, 0xF5, 0xD9, 0xCA, 0xCE, 0xF1, 0xDB, + 0xAB, 0xDF, 0xA4, 0xE5, 0xED, 0xE6, 0x9B, 0xE0, 0x50, 0xE1, 0xA4, 0xE5, + 0xD1, 0xE5, 0x41, 0xF1, 0xC6, 0xEB, 0xA6, 0xEE, 0xE8, 0xE5, 0xB3, 0xF3, + 0xF4, 0xDC, 0x28, 0xF5, 0x18, 0xE3, 0xF3, 0xF3, 0x80, 0xE9, 0x26, 0xF3, + 0xB9, 0xF8, 0xD6, 0xF1, 0x55, 0x06, 0x6F, 0xFC, 0xBC, 0xE5, 0x36, 0xF6, + 0x02, 0xD1, 0x2B, 0xE8, 0x4B, 0xEB, 0x38, 0xE7, 0x61, 0xF5, 0xBB, 0xDF, + 0x5F, 0xF5, 0x4B, 0xDF, 0x57, 0xFC, 0xF3, 0xF0, 0x7B, 0xF6, 0x50, 0xF9, + 0x58, 0xF3, 0x76, 0xFA, 0x23, 0xF6, 0xE7, 0x06, 0xF3, 0x05, 0xA2, 0x0F, + 0x51, 0x15, 0x84, 0x09, 0x37, 0x18, 0x97, 0x0C, 0xF2, 0x1A, 0x44, 0x0D, + 0xE2, 0x25, 0xAE, 0x19, 0x2B, 0x1B, 0x9A, 0x23, 0x1A, 0x18, 0x45, 0x19, + 0xB3, 0x2F, 0x68, 0x1C, 0xE9, 0x1D, 0x54, 0x22, 0xD6, 0x05, 0x2B, 0x28, + 0x43, 0x22, 0xA3, 0x37, 0x67, 0x32, 0x80, 0x2A, 0xB0, 0x38, 0x8F, 0x1B, + 0x58, 0x45, 0x3E, 0x27, 0x06, 0x45, 0xAE, 0x2C, 0xB7, 0x3F, 0xE5, 0x2D, + 0x76, 0x2E, 0x45, 0x34, 0xE4, 0x2B, 0xB2, 0x3C, 0x20, 0x2C, 0x28, 0x38, + 0xD3, 0x20, 0x70, 0x28, 0xFB, 0x21, 0x02, 0x16, 0x4E, 0x35, 0x9E, 0x1A, + 0x1C, 0x2E, 0x57, 0x2B, 0x0C, 0x19, 0xD8, 0x29, 0xFC, 0x2A, 0xBD, 0x31, + 0xFD, 0x27, 0xFD, 0x35, 0x1F, 0x03, 0xF4, 0x20, 0xEC, 0x0A, 0x53, 0x1E, + 0xCE, 0x16, 0x12, 0x17, 0xCD, 0x14, 0x2A, 0x0E, 0xEE, 0x17, 0x25, 0x15, + 0x2B, 0x0C, 0xB6, 0x03, 0x32, 0x0A, 0x0D, 0xFA, 0xDA, 0x09, 0x5B, 0x01, + 0x69, 0x02, 0x51, 0x05, 0x73, 0xFC, 0x7F, 0x0E, 0xC2, 0xED, 0x14, 0x0D, + 0x2D, 0xEC, 0x19, 0x06, 0x7E, 0xFD, 0x18, 0x07, 0xC2, 0xFA, 0x1A, 0x09, + 0x64, 0xEE, 0x70, 0x07, 0xFA, 0xF7, 0x3E, 0x0C, 0x20, 0xFF, 0x1A, 0x12, + 0x26, 0xFF, 0x1B, 0x15, 0x25, 0x09, 0x50, 0x1C, 0x0A, 0x01, 0xFD, 0x0B, + 0xE8, 0xFB, 0x18, 0xFE, 0x93, 0x17, 0x8F, 0x0C, 0x40, 0x16, 0x60, 0x06, + 0xA5, 0x04, 0x03, 0x06, 0xD9, 0x06, 0x51, 0x18, 0xBE, 0xF9, 0x9F, 0x0F, + 0xA3, 0xE8, 0x76, 0xFC, 0x7C, 0xF6, 0x69, 0x00, 0x49, 0x0F, 0xA6, 0x08, + 0x01, 0x19, 0x53, 0xFF, 0xC4, 0x17, 0x57, 0xFA, 0x5C, 0x0F, 0x84, 0xFB, + 0x3F, 0xFF, 0xFE, 0xFA, 0x41, 0x00, 0xDF, 0x0A, 0xBA, 0x08, 0xA1, 0x1E, + 0x2C, 0x07, 0x52, 0x22, 0xE8, 0x10, 0x85, 0x1C, 0x20, 0x24, 0x65, 0x19, + 0x3E, 0x33, 0xB3, 0x1E, 0xCA, 0x1E, 0x5A, 0x19, 0x4E, 0xF7, 0x95, 0x01, + 0xB5, 0xF9, 0x1A, 0xFF, 0xD1, 0x0B, 0x00, 0x12, 0xE0, 0x0E, 0xEF, 0x13, + 0x5A, 0x14, 0xBA, 0x0D, 0xF8, 0x0A, 0x43, 0x07, 0x54, 0xF5, 0x1C, 0xF7, + 0x01, 0xFA, 0xC4, 0xE8, 0xD5, 0x0F, 0xBB, 0xE6, 0x72, 0x11, 0x93, 0xF7, + 0x95, 0x02, 0xEC, 0x08, 0x77, 0xF5, 0x94, 0x05, 0x94, 0xF4, 0xB8, 0x02, + 0xAC, 0xF1, 0x50, 0x03, 0xED, 0xEA, 0x1C, 0xF6, 0xD6, 0x07, 0xB2, 0xF6, + 0xFD, 0x1C, 0x84, 0x00, 0x10, 0xFD, 0xD2, 0xEE, 0x1C, 0xDD, 0x80, 0xE2, + 0x5D, 0xDF, 0xEA, 0xF0, 0x66, 0xE0, 0x30, 0xEC, 0xCE, 0xEA, 0x1F, 0xE9, + 0xBE, 0xF5, 0xB8, 0xF1, 0x25, 0xE7, 0x53, 0xE4, 0x2B, 0xF3, 0x13, 0xE7, + 0xA6, 0x03, 0x26, 0xF5, 0x02, 0xE9, 0x29, 0xE5, 0xDD, 0xD8, 0xD5, 0xE0, + 0x44, 0xD9, 0x1B, 0xED, 0x71, 0xD3, 0xD1, 0xF3, 0x5F, 0xCD, 0x4E, 0xFB, + 0x2D, 0xCA, 0xDF, 0xF6, 0xC2, 0xDB, 0x26, 0xEC, 0xF7, 0xF6, 0x12, 0xE3, + 0xD6, 0x03, 0x01, 0xE5, 0xA4, 0xF9, 0x53, 0xF0, 0xC8, 0xED, 0xA2, 0xFB, + 0x2A, 0xEA, 0x0B, 0xFA, 0x61, 0xFC, 0x25, 0xFE, 0xAA, 0x09, 0x0D, 0x09, + 0x49, 0xF6, 0x03, 0xF7, 0xC8, 0xE8, 0x0D, 0xE5, 0xCE, 0xEC, 0xD4, 0xE6, + 0x5B, 0xF4, 0x6E, 0xE3, 0x53, 0x10, 0xB3, 0xF7, 0x26, 0x16, 0x4F, 0xFF, + 0xCC, 0xFC, 0xE3, 0xF3, 0x56, 0xFE, 0xD2, 0x08, 0x85, 0xFC, 0x2A, 0x14, + 0x2C, 0xF7, 0x58, 0x15, 0x96, 0x11, 0x97, 0x1B, 0x88, 0x30, 0x29, 0x17, + 0xF4, 0x36, 0x58, 0x12, 0xF0, 0x2A, 0x39, 0x14, 0x3A, 0x0B, 0x82, 0x0F, + 0x6F, 0xF6, 0x8C, 0x17, 0x14, 0x04, 0x64, 0x32, 0xD9, 0x14, 0xA8, 0x32, + 0xFB, 0x1E, 0x32, 0x23, 0x44, 0x2F, 0x83, 0x23, 0x76, 0x2B, 0x37, 0x1A, + 0xB0, 0x1D, 0xE1, 0x18, 0x0A, 0x22, 0xEB, 0x23, 0x38, 0x1B, 0x4B, 0x1D, + 0x5F, 0x1A, 0x4E, 0x24, 0x42, 0x2A, 0x5D, 0x38, 0x45, 0x24, 0x82, 0x40, + 0xE3, 0x12, 0x47, 0x3F, 0x71, 0x1C, 0x6D, 0x32, 0x1F, 0x2D, 0x1C, 0x20, + 0xC5, 0x2C, 0x08, 0x19, 0xC7, 0x16, 0xEF, 0x11, 0x6D, 0x05, 0x58, 0x19, + 0xA9, 0x05, 0xFE, 0x28, 0xF6, 0x0D, 0x9C, 0x22, 0x55, 0x11, 0x6F, 0x14, + 0x20, 0x17, 0x48, 0x10, 0xDB, 0x15, 0x8B, 0x0B, 0xDC, 0x06, 0x16, 0x07, + 0x4B, 0x0F, 0x49, 0x0C, 0x76, 0x12, 0xB8, 0x05, 0xF7, 0x0D, 0x3B, 0xF9, + 0x43, 0x14, 0xC5, 0xE9, 0x9B, 0x05, 0x25, 0xD6, 0x78, 0xF8, 0x06, 0xE0, + 0x51, 0xFB, 0x13, 0xEF, 0xEC, 0xEB, 0xB9, 0xE6, 0x85, 0xE3, 0x67, 0xDC, + 0xB1, 0xE7, 0x8E, 0xCA, 0x10, 0xE0, 0xC6, 0xC1, 0x45, 0xDC, 0x7B, 0xC7, + 0x43, 0xDE, 0xBC, 0xCE, 0xA8, 0xDF, 0xFD, 0xDD, 0x79, 0xE0, 0xB6, 0xE1, + 0xC9, 0xDB, 0xBA, 0xD4, 0xC3, 0xDA, 0x1C, 0xCC, 0xE3, 0xE0, 0xDD, 0xCF, + 0xF0, 0xD4, 0x11, 0xCB, 0x40, 0xBB, 0x0A, 0xBE, 0x91, 0xC3, 0xEF, 0xBF, + 0x44, 0xD5, 0x74, 0xC5, 0xA6, 0xCA, 0x7E, 0xC0, 0x94, 0xD7, 0xE3, 0xC4, + 0x7B, 0xDF, 0x68, 0xD4, 0x24, 0xD5, 0x5F, 0xDE, 0xEC, 0xE3, 0x6A, 0xE7, + 0x18, 0xE1, 0x84, 0xE8, 0x2F, 0xCE, 0x76, 0xDE, 0x65, 0xD2, 0x59, 0xE2, + 0x0F, 0xD5, 0x13, 0xEA, 0xFD, 0xC3, 0xE6, 0xE2, 0x46, 0xCB, 0x76, 0xE3, + 0x71, 0xE6, 0x11, 0xEC, 0xAB, 0xF9, 0x56, 0xF6, 0xC4, 0x06, 0x42, 0x02, + 0xBF, 0x07, 0xC7, 0x09, 0x14, 0x00, 0x34, 0x08, 0x40, 0x06, 0xE3, 0x0F, + 0x34, 0x13, 0x5B, 0x24, 0x9D, 0x1F, 0x19, 0x33, 0x63, 0x17, 0x6C, 0x26, + 0x76, 0x09, 0x4A, 0x17, 0x45, 0x14, 0x3F, 0x25, 0x8F, 0x17, 0x21, 0x2C, + 0x7E, 0x12, 0x58, 0x25, 0x08, 0x1B, 0xFF, 0x25, 0xEA, 0x20, 0xED, 0x25, + 0xD9, 0x1B, 0x2F, 0x27, 0x85, 0x13, 0x20, 0x24, 0x7B, 0x1D, 0x91, 0x2E, + 0x7C, 0x28, 0xA6, 0x3C, 0x77, 0x35, 0xE2, 0x33, 0x50, 0x4C, 0xDB, 0x33, + 0x14, 0x38, 0x7B, 0x34, 0x3E, 0x1A, 0xAD, 0x1F, 0x5D, 0x0F, 0xF7, 0x0A, + 0xE3, 0x11, 0xCC, 0x0C, 0x07, 0x16, 0x83, 0x0B, 0xAF, 0xFE, 0x3C, 0xF4, + 0x02, 0xFE, 0xB6, 0xF4, 0x89, 0x15, 0xC8, 0x06, 0x96, 0x15, 0x8D, 0xFF, + 0x6C, 0x10, 0xC1, 0xEE, 0x2A, 0x10, 0x18, 0xEE, 0x14, 0x06, 0x9B, 0xF2, + 0xA0, 0xFF, 0x64, 0xEF, 0x5E, 0xFF, 0x97, 0xEC, 0xE2, 0xF0, 0x89, 0xEA, + 0xAE, 0xF6, 0x75, 0xE9, 0x62, 0x0F, 0x82, 0xE8, 0xF0, 0x05, 0x50, 0xE7, + 0x1B, 0xF7, 0x95, 0xE6, 0xFA, 0xE8, 0x9E, 0xE4, 0x96, 0xDC, 0x75, 0xF1, + 0x46, 0xEF, 0x52, 0x03, 0x48, 0xE6, 0xF7, 0xF7, 0xF0, 0xDA, 0x4F, 0xEC, + 0x8A, 0xF8, 0x86, 0xFD, 0x42, 0x06, 0xDC, 0x10, 0x2D, 0x01, 0xC4, 0x0E, + 0x95, 0xFB, 0x12, 0x07, 0x1B, 0xF1, 0x5C, 0x04, 0x5C, 0xF2, 0x90, 0x02, + 0x2B, 0xFC, 0x35, 0x06, 0xAB, 0xF8, 0x17, 0x14, 0x57, 0xF0, 0x9B, 0x16, + 0x47, 0xF6, 0x48, 0x0C, 0xEE, 0xF2, 0x56, 0x04, 0x0A, 0x0C, 0x0E, 0x07, + 0x65, 0x26, 0x11, 0x12, 0x0F, 0x08, 0x37, 0x0D, 0x84, 0x01, 0x45, 0x0A, + 0x72, 0x19, 0xCE, 0x17, 0x53, 0x1C, 0x75, 0x0D, 0x4A, 0x1E, 0xA1, 0x01, + 0x9D, 0x28, 0x0A, 0x0C, 0xE6, 0x21, 0x1B, 0x0F, 0x16, 0x16, 0xE7, 0x10, + 0x88, 0x1A, 0x9F, 0x17, 0x7C, 0x26, 0xA1, 0x17, 0x1A, 0x2E, 0x7B, 0x0A, + 0xC2, 0x2E, 0x92, 0x03, 0xB9, 0x22, 0x71, 0x07, 0x36, 0x0D, 0x07, 0x0B, + 0xE1, 0xF8, 0x75, 0x12, 0xE9, 0x04, 0xDB, 0x15, 0xBB, 0x1E, 0x14, 0x11, + 0xE4, 0x12, 0x4F, 0x01, 0x5F, 0x02, 0x85, 0xF2, 0x78, 0x0B, 0x38, 0xFA, + 0x18, 0xF9, 0x90, 0xF4, 0x09, 0xDC, 0xD1, 0xE8, 0x5A, 0xDB, 0x2A, 0xEE, + 0x3A, 0xE2, 0x40, 0xEC, 0x25, 0xE3, 0x91, 0xEC, 0x49, 0xD7, 0x97, 0xF1, + 0x56, 0xCE, 0x40, 0xEA, 0x5B, 0xDB, 0x59, 0xE3, 0x63, 0xE5, 0xBF, 0xDA, + 0x8E, 0xCE, 0x98, 0xC3, 0x6E, 0xC4, 0xB0, 0xC8, 0x21, 0xC5, 0x88, 0xE0, + 0xC4, 0xBD, 0x30, 0xDD, 0x10, 0xCB, 0xD2, 0xD2, 0x2D, 0xCA, 0xC7, 0xC5, + 0x81, 0xBB, 0x70, 0xB6, 0x26, 0xC0, 0xE7, 0xBE, 0xC4, 0xBD, 0x28, 0xCC, + 0x2C, 0xB1, 0x5B, 0xCD, 0xBC, 0xB8, 0x4B, 0xCC, 0xB5, 0xD1, 0x4C, 0xCE, + 0x7A, 0xE7, 0xE1, 0xDB, 0x42, 0xE7, 0x86, 0xE4, 0xFC, 0xCF, 0x62, 0xE3, + 0xD3, 0xC9, 0x0D, 0xEF, 0x6F, 0xD9, 0x6F, 0xF9, 0x14, 0xD9, 0xCD, 0xE6, + 0xA3, 0xE6, 0xDF, 0xD6, 0x48, 0xFC, 0x87, 0xD3, 0xEF, 0xF8, 0x3F, 0xCF, + 0x9C, 0xF3, 0xC1, 0xD6, 0xBA, 0xED, 0x06, 0xE1, 0x68, 0xEE, 0x35, 0xE0, + 0xAA, 0xF5, 0xF4, 0xDC, 0xE4, 0xF7, 0xAD, 0xE0, 0xCF, 0xFA, 0x6D, 0xE5, + 0xBD, 0xFC, 0x8B, 0xE8, 0x11, 0xF8, 0xF0, 0xE6, 0x50, 0xF3, 0xF4, 0xE5, + 0xD5, 0xF6, 0x83, 0xEF, 0x2B, 0xFF, 0x45, 0xF6, 0x2D, 0xFD, 0x81, 0xF6, + 0x42, 0x0D, 0x08, 0x0A, 0xBE, 0x14, 0xF7, 0x13, 0x4B, 0x0C, 0x21, 0x0B, + 0x86, 0x05, 0xA0, 0x00, 0x7E, 0xF9, 0x07, 0xF4, 0x30, 0x08, 0x8E, 0xF9, + 0xE6, 0x15, 0xE9, 0x0D, 0x1A, 0x0D, 0xF7, 0x18, 0x22, 0x02, 0x8F, 0x12, + 0xD7, 0xF9, 0x1C, 0x08, 0xD1, 0xFC, 0x89, 0x0A, 0xF7, 0x00, 0xF2, 0x0C, + 0x77, 0xF8, 0x15, 0x03, 0xB0, 0xF2, 0x88, 0xFE, 0x17, 0xF6, 0xEC, 0xFC, + 0x18, 0xFB, 0xA6, 0xFE, 0xD0, 0xF7, 0x31, 0x01, 0x0E, 0xF5, 0x35, 0xFE, + 0xE1, 0xFA, 0x8E, 0x03, 0x91, 0x0C, 0x77, 0x10, 0x6E, 0x11, 0x03, 0x12, + 0x8F, 0x04, 0x19, 0x0A, 0x15, 0x02, 0x5B, 0x04, 0x58, 0x05, 0x34, 0x01, + 0x82, 0xFD, 0x08, 0xFF, 0x18, 0xF0, 0xF9, 0x03, 0x72, 0xEF, 0x0E, 0x04, + 0xF6, 0xF6, 0xEC, 0xF8, 0xBE, 0x05, 0x08, 0xFE, 0xDA, 0x0C, 0x51, 0x04, + 0x4B, 0xFA, 0xAC, 0xF3, 0xA2, 0xEC, 0xF2, 0xF2, 0x5C, 0xFF, 0xBF, 0x10, + 0x79, 0x09, 0x19, 0x14, 0x1B, 0xFE, 0xB5, 0x09, 0x9A, 0x0D, 0x01, 0x20, + 0xD0, 0x18, 0x4D, 0x23, 0x13, 0x0C, 0x55, 0x12, 0x36, 0x0D, 0xAF, 0x15, + 0x0E, 0x0E, 0x1B, 0x0E, 0x89, 0x05, 0x01, 0x05, 0xD5, 0x10, 0x8E, 0x11, + 0xC5, 0x16, 0xB1, 0x12, 0x14, 0x0D, 0x6A, 0x0E, 0xAF, 0x0C, 0xF3, 0x13, + 0xA8, 0x16, 0xB5, 0x18, 0xF3, 0x26, 0xBA, 0x1D, 0xFC, 0x33, 0xDE, 0x1D, + 0x57, 0x26, 0xB3, 0x11, 0x96, 0x0B, 0x84, 0x0B, 0x22, 0x0F, 0x9B, 0x11, + 0xAF, 0x1B, 0x31, 0x17, 0xCB, 0x18, 0x5F, 0x1A, 0x5B, 0x1B, 0x96, 0x14, + 0xCC, 0x21, 0x30, 0x13, 0x9F, 0x24, 0xC0, 0x1D, 0xED, 0x22, 0x8D, 0x23, + 0x36, 0x28, 0x76, 0x34, 0x2E, 0x34, 0x8E, 0x3D, 0xFD, 0x34, 0x10, 0x2D, + 0xC0, 0x3D, 0xC5, 0x35, 0xCD, 0x3B, 0x2A, 0x47, 0x1B, 0x27, 0x8D, 0x41, + 0x8E, 0x3B, 0xF3, 0x3E, 0x85, 0x5A, 0xD7, 0x37, 0xCD, 0x4A, 0x94, 0x2F, + 0xB7, 0x38, 0x79, 0x36, 0xD3, 0x38, 0x9E, 0x37, 0xC3, 0x2A, 0xAD, 0x32, + 0xE4, 0x1A, 0x26, 0x36, 0x0D, 0x1D, 0x07, 0x32, 0x07, 0x22, 0xDC, 0x24, + 0x43, 0x20, 0xA7, 0x1C, 0xD4, 0x1F, 0xD1, 0x1D, 0x65, 0x11, 0xDF, 0x26, + 0x5B, 0xFE, 0x83, 0x27, 0xF4, 0x0F, 0x65, 0x1F, 0x1F, 0x23, 0x6B, 0x12, + 0x90, 0x1C, 0xD3, 0x03, 0xC4, 0x03, 0x93, 0x01, 0xA3, 0xEE, 0x5A, 0x05, + 0xF2, 0xF1, 0xE8, 0xFE, 0x17, 0xFE, 0x1C, 0xFA, 0x9E, 0x05, 0x87, 0xF0, + 0xD3, 0x09, 0x5F, 0xE4, 0xD4, 0x09, 0x7A, 0xEB, 0x0C, 0xF2, 0x15, 0xF2, + 0xD7, 0xD9, 0x68, 0xEC, 0x75, 0xDF, 0x45, 0xF5, 0xA6, 0xE4, 0x59, 0xFC, + 0x9A, 0xE4, 0x2A, 0xE8, 0xCC, 0xE7, 0x9A, 0xE0, 0xC9, 0xE6, 0xB0, 0xEC, + 0x21, 0xE1, 0x86, 0xE9, 0xE8, 0xE6, 0xFA, 0xDE, 0x53, 0xF0, 0x2D, 0xDB, + 0x9E, 0xE3, 0x7B, 0xDE, 0xBF, 0xDB, 0x69, 0xE9, 0x24, 0xDF, 0x46, 0xF6, + 0xDF, 0xE0, 0x25, 0xF3, 0x19, 0xE9, 0x29, 0xE1, 0xDC, 0xF2, 0xF6, 0xD8, + 0x1E, 0xEC, 0xB7, 0xD4, 0xD3, 0xDD, 0xF3, 0xD9, 0x2B, 0xE6, 0xF3, 0xEE, + 0xE2, 0xE8, 0x2A, 0xF8, 0xB9, 0xD6, 0xAA, 0xEE, 0x47, 0xDC, 0x4F, 0xE7, + 0xDA, 0xE9, 0xCF, 0xEF, 0x6E, 0xE0, 0xF0, 0xF4, 0x53, 0xDA, 0x88, 0xF7, + 0x3E, 0xEF, 0x7D, 0x07, 0x11, 0xFC, 0xB6, 0x09, 0x2C, 0xF9, 0x73, 0x02, + 0xB4, 0x0E, 0xB9, 0x08, 0x27, 0x1D, 0xD9, 0x17, 0x2F, 0x15, 0x4F, 0x20, + 0xF1, 0x14, 0x9D, 0x27, 0x05, 0x14, 0xC1, 0x2B, 0x94, 0x17, 0xD6, 0x23, + 0x38, 0x1C, 0x54, 0x1A, 0xA1, 0x2F, 0x05, 0x24, 0x19, 0x39, 0x46, 0x28, + 0x2A, 0x25, 0x93, 0x1C, 0x46, 0x2B, 0x91, 0x1F, 0x9C, 0x2E, 0xDE, 0x1B, + 0x1C, 0x21, 0x57, 0x13, 0x97, 0x20, 0xBC, 0x15, 0x94, 0x21, 0x41, 0x14, + 0x8A, 0x1E, 0x5C, 0x10, 0x68, 0x19, 0xD0, 0x0C, 0xBD, 0x18, 0xD3, 0x00, + 0xBE, 0x17, 0xAE, 0xFC, 0x15, 0x0A, 0x21, 0xFC, 0x8D, 0x04, 0x6B, 0xFE, + 0x66, 0x00, 0x0B, 0x03, 0x21, 0xFC, 0x0C, 0x00, 0x85, 0xF1, 0xEF, 0xF7, + 0x7C, 0xE2, 0x25, 0xF7, 0x59, 0xE7, 0xDB, 0xFC, 0xFF, 0xE4, 0xB0, 0xF0, + 0x04, 0xD5, 0x8E, 0xD8, 0x97, 0xDD, 0x3E, 0xD6, 0x05, 0xEB, 0x5C, 0xE3, + 0x62, 0xEA, 0x02, 0xDF, 0xF8, 0xE9, 0xD3, 0xDA, 0x64, 0xE3, 0xED, 0xE2, + 0xB1, 0xD0, 0x89, 0xDC, 0x1D, 0xCB, 0x5C, 0xDB, 0x29, 0xDB, 0xB3, 0xE9, + 0x88, 0xCD, 0xFE, 0xD9, 0x32, 0xB9, 0xB2, 0xBF, 0x21, 0xCB, 0x40, 0xC9, + 0x16, 0xDA, 0xD3, 0xD7, 0xF3, 0xD3, 0xF8, 0xD6, 0xB6, 0xCF, 0x09, 0xDC, + 0x51, 0xE4, 0x9C, 0xE5, 0x46, 0xF7, 0xAA, 0xE7, 0x30, 0xE7, 0xBB, 0xE1, + 0xA7, 0xD3, 0x81, 0xDC, 0x0C, 0xD1, 0x09, 0xE2, 0xBC, 0xD6, 0xAF, 0xE3, + 0x48, 0xDC, 0xD8, 0xE1, 0x3B, 0xDB, 0x2C, 0xE9, 0xB4, 0xD7, 0x8F, 0xEB, + 0x45, 0xD3, 0x05, 0xEC, 0xB3, 0xDA, 0x9F, 0xF0, 0xA0, 0xDE, 0xBF, 0xED, + 0xCA, 0xD9, 0x8F, 0xEB, 0x4E, 0xE6, 0x6D, 0xF3, 0x4B, 0x00, 0x27, 0x03, + 0x6E, 0x0C, 0xB0, 0x0E, 0x40, 0xFD, 0xA1, 0x0A, 0xAC, 0xF9, 0x9F, 0x07, + 0x0F, 0x0E, 0xC6, 0x11, 0xD2, 0x10, 0xEB, 0x0E, 0xF1, 0x03, 0x66, 0x02, + 0xBF, 0x04, 0x5D, 0x0B, 0x76, 0xFE, 0x27, 0x0B, 0x49, 0xFF, 0x36, 0x08, + 0x55, 0x12, 0xDC, 0x0D, 0x95, 0x18, 0xBE, 0xFF, 0xA2, 0x16, 0xC9, 0xF5, + 0x6C, 0x1E, 0x4B, 0xFA, 0xCB, 0x13, 0x79, 0xF3, 0x4A, 0xF7, 0x1F, 0xF2, + 0x0B, 0xF2, 0x92, 0xF7, 0x5C, 0x04, 0x4C, 0xED, 0x79, 0x0E, 0xC4, 0xE0, + 0x71, 0x03, 0x22, 0xDD, 0x42, 0xF3, 0xA7, 0xDF, 0x21, 0xF0, 0x3C, 0xE4, + 0x51, 0xFA, 0x31, 0xE5, 0xBE, 0x05, 0x67, 0xE8, 0x8F, 0x00, 0x01, 0xEA, + 0x79, 0xF7, 0x1A, 0xEC, 0x08, 0xF5, 0x53, 0xF7, 0x43, 0xF4, 0x71, 0xFC, + 0xA6, 0xF1, 0x16, 0xF6, 0xDD, 0xEE, 0xD7, 0xF9, 0xC2, 0xFB, 0xF9, 0x00, + 0xD4, 0x09, 0xD4, 0x05, 0xD7, 0x01, 0x1C, 0x15, 0xC8, 0xE9, 0x79, 0x12, + 0x0B, 0xE8, 0x89, 0x0A, 0xC7, 0xF8, 0x3D, 0x13, 0x2E, 0xFD, 0x24, 0x0F, + 0x2B, 0xF2, 0xB2, 0x00, 0x1C, 0xED, 0x79, 0x05, 0x88, 0xFC, 0x19, 0x17, + 0x08, 0x0A, 0x71, 0x17, 0xAF, 0x07, 0xC0, 0x08, 0xA2, 0x16, 0xEE, 0x0B, + 0xBD, 0x27, 0x38, 0x19, 0x7F, 0x20, 0x34, 0x17, 0xB3, 0x16, 0x16, 0x15, + 0x79, 0x0C, 0x8F, 0x21, 0x0E, 0x0E, 0x88, 0x26, 0x87, 0x19, 0x11, 0x16, + 0x66, 0x25, 0xFE, 0x0A, 0xA7, 0x30, 0xF7, 0x0C, 0x57, 0x2F, 0x16, 0x14, + 0x85, 0x2A, 0xC3, 0x21, 0x01, 0x2A, 0xAA, 0x20, 0xA7, 0x2F, 0xC4, 0x19, + 0xC6, 0x30, 0x19, 0x1F, 0xC4, 0x26, 0x3D, 0x23, 0x96, 0x2E, 0xC3, 0x30, + 0xDD, 0x38, 0xC3, 0x30, 0x67, 0x3B, 0xD7, 0x20, 0x76, 0x48, 0x80, 0x2C, + 0x4A, 0x45, 0xE3, 0x3C, 0x10, 0x35, 0x15, 0x45, 0x43, 0x29, 0xE5, 0x4D, + 0xC7, 0x2D, 0x5C, 0x4F, 0x4D, 0x38, 0xAD, 0x45, 0xE2, 0x2D, 0xEC, 0x30, + 0xEE, 0x28, 0x0C, 0x27, 0xB3, 0x26, 0x6A, 0x24, 0x9F, 0x15, 0xAA, 0x24, + 0xA8, 0x15, 0x2D, 0x34, 0xA7, 0x1F, 0xD2, 0x33, 0xF1, 0x22, 0x1F, 0x26, + 0xDD, 0x23, 0x64, 0x1F, 0xBF, 0x14, 0x0C, 0x19, 0xB7, 0x06, 0x4A, 0x17, + 0x85, 0x03, 0xA8, 0x1A, 0x9C, 0x04, 0xC8, 0x16, 0xF8, 0xFF, 0xB4, 0x00, + 0x83, 0xFF, 0xFC, 0xF2, 0xC0, 0x0A, 0x3F, 0xF0, 0x84, 0x0F, 0x9A, 0xF9, + 0x0C, 0x10, 0x6A, 0x0F, 0x06, 0x0C, 0xCD, 0x0C, 0x00, 0xFA, 0xDE, 0x00, + 0x01, 0xFC, 0x57, 0x09, 0x26, 0xFE, 0x40, 0xFD, 0xE3, 0xFD, 0x5C, 0xF5, + 0x91, 0x0C, 0x18, 0x02, 0x14, 0x0D, 0xE3, 0xFA, 0xEF, 0xFA, 0xFA, 0xE6, + 0x31, 0xEE, 0x03, 0xE0, 0x56, 0xF9, 0xD0, 0xE6, 0xF2, 0xF7, 0x8E, 0xDC, + 0xD9, 0xEB, 0x70, 0xC8, 0x83, 0xF3, 0x29, 0xCC, 0x7E, 0xF5, 0x68, 0xD5, + 0xAC, 0xF1, 0x9B, 0xCF, 0xA1, 0xF7, 0x22, 0xD7, 0x50, 0xF4, 0xD8, 0xE6, + 0x79, 0xE2, 0x63, 0xDE, 0xC5, 0xD7, 0xBC, 0xD9, 0xEF, 0xEB, 0x6B, 0xEE, + 0x2B, 0xEF, 0xB6, 0xEE, 0x3D, 0xCE, 0xA3, 0xDC, 0x64, 0xC9, 0x97, 0xDF, + 0x5A, 0xCF, 0x89, 0xDE, 0x8D, 0xCA, 0x01, 0xD6, 0xDD, 0xD4, 0xD7, 0xD8, + 0xC0, 0xD9, 0x61, 0xDC, 0x81, 0xD9, 0x06, 0xE0, 0x06, 0xDD, 0xFB, 0xE1, + 0xA1, 0xDC, 0xAC, 0xF1, 0xEF, 0xD7, 0x3D, 0xFD, 0xE8, 0xCF, 0xF3, 0xEF, + 0x16, 0xD8, 0x9D, 0xEB, 0x81, 0xEB, 0x31, 0xF1, 0xDE, 0xF3, 0x8E, 0xF0, + 0x74, 0xE4, 0x0B, 0xED, 0x62, 0xD9, 0x03, 0xF1, 0xAB, 0xF3, 0xE6, 0xF8, + 0x25, 0xFB, 0x35, 0xF3, 0x11, 0xEF, 0x79, 0xED, 0x83, 0xF9, 0x43, 0xF3, + 0x18, 0xFC, 0x52, 0xF9, 0xBE, 0xF0, 0x7B, 0xF2, 0xD4, 0xF2, 0x10, 0xF1, + 0x37, 0xFF, 0x1D, 0xF7, 0x18, 0x0B, 0x49, 0xF3, 0xA2, 0x07, 0xB0, 0xF5, + 0xF8, 0x02, 0x27, 0xFA, 0x00, 0xF2, 0xD9, 0xE9, 0xAD, 0xDF, 0x60, 0xDD, + 0x50, 0xEC, 0x2A, 0xE2, 0x03, 0xF4, 0xD9, 0xE3, 0xF8, 0xE1, 0xF5, 0xDE, + 0x0D, 0xD4, 0xA3, 0xE1, 0x38, 0xEB, 0x98, 0xF1, 0x35, 0xFA, 0x40, 0xF8, + 0xC6, 0xEA, 0xE9, 0xEE, 0x98, 0xEE, 0x67, 0xF3, 0x49, 0xF3, 0x31, 0xF7, + 0x08, 0xE9, 0xB3, 0xEB, 0x41, 0xE6, 0xBF, 0xF3, 0xBC, 0xD4, 0xBD, 0xF2, + 0xD4, 0xC7, 0x62, 0xD9, 0xA9, 0xDA, 0x68, 0xDB, 0xE7, 0xFB, 0xF7, 0xED, + 0x6D, 0xF1, 0x0B, 0xDF, 0x63, 0xC0, 0x2E, 0xCA, 0xCB, 0xB8, 0x4E, 0xD0, + 0x6A, 0xD9, 0x7F, 0xD5, 0x56, 0xE6, 0xE7, 0xC9, 0x20, 0xDC, 0xCA, 0xC8, + 0x1D, 0xE4, 0x8E, 0xD9, 0x81, 0xF3, 0x00, 0xE4, 0xA8, 0xED, 0x5F, 0xDB, + 0xDE, 0xEC, 0x02, 0xD7, 0xAF, 0xF3, 0x11, 0xDB, 0xAB, 0xED, 0xF8, 0xD8, + 0xEA, 0xF4, 0xB4, 0xE5, 0xCA, 0xF4, 0xF1, 0xEE, 0x09, 0xDF, 0xA5, 0xE2, + 0xA9, 0xE5, 0x8D, 0xE7, 0x63, 0x05, 0x82, 0xF2, 0xB6, 0x16, 0x83, 0xF0, + 0x64, 0x0B, 0xE0, 0xEE, 0x0F, 0xFC, 0x29, 0xFB, 0xCB, 0x0A, 0x5C, 0x17, + 0x35, 0x1A, 0x7E, 0x21, 0xD9, 0x17, 0xE4, 0x17, 0x7E, 0x19, 0x35, 0x19, + 0x3E, 0x16, 0x9E, 0x22, 0x77, 0x16, 0x8A, 0x26, 0x01, 0x20, 0x3A, 0x2D, + 0x13, 0x20, 0x54, 0x37, 0xA6, 0x16, 0x99, 0x2C, 0x3C, 0x21, 0xA3, 0x1D, + 0x8B, 0x34, 0x13, 0x21, 0xFC, 0x24, 0xEA, 0x23, 0x65, 0x08, 0x38, 0x27, + 0xE8, 0x0B, 0x1C, 0x36, 0x09, 0x20, 0x56, 0x40, 0x26, 0x32, 0x4B, 0x3B, + 0x06, 0x34, 0x36, 0x32, 0x6F, 0x27, 0xF4, 0x33, 0x17, 0x2B, 0x20, 0x3A, + 0xD5, 0x27, 0x0E, 0x28, 0x2F, 0x22, 0x21, 0x17, 0xB2, 0x21, 0xAB, 0x17, + 0x46, 0x1D, 0x93, 0x1C, 0xB0, 0x13, 0x23, 0x20, 0xA9, 0x0F, 0xAC, 0x25, + 0x7B, 0x14, 0x32, 0x24, 0x07, 0x1A, 0x19, 0x11, 0xB6, 0x1F, 0xF7, 0x08, + 0x11, 0x24, 0x5F, 0x17, 0x45, 0x16, 0xDA, 0x16, 0x2C, 0x12, 0xD5, 0x20, + 0xE7, 0x15, 0x91, 0x33, 0x5C, 0x0C, 0xB8, 0x1E, 0x0C, 0x09, 0xF8, 0x01, + 0x44, 0x0C, 0x85, 0x08, 0x2F, 0x08, 0xEE, 0x0D, 0xE6, 0xF7, 0x13, 0xF5, + 0x5D, 0xEF, 0x83, 0xEA, 0x2A, 0xF9, 0x1D, 0xFB, 0x9E, 0x06, 0xE5, 0xF4, + 0x30, 0x12, 0xE9, 0xE6, 0xE8, 0x0F, 0x76, 0x00, 0x01, 0xF7, 0xEC, 0x11, + 0xC5, 0xF0, 0xED, 0x08, 0x59, 0xF1, 0x1E, 0x11, 0xC7, 0xED, 0x96, 0x15, + 0xEB, 0xEB, 0x87, 0xF9, 0xF8, 0xE7, 0xE7, 0xF1, 0x20, 0xF0, 0x04, 0x01, + 0x99, 0xF9, 0x2E, 0x01, 0x6F, 0x00, 0x23, 0xFF, 0x42, 0xF8, 0x11, 0xF8, + 0x6B, 0xF0, 0x67, 0xFE, 0xF5, 0x04, 0x6D, 0x16, 0x5E, 0x0B, 0x4B, 0x11, + 0x0C, 0x0A, 0x94, 0x0E, 0x1E, 0x15, 0x76, 0x16, 0x3C, 0x15, 0x02, 0x09, + 0x1A, 0x1B, 0x17, 0x0E, 0x6B, 0x21, 0xC6, 0x1D, 0x9E, 0x1F, 0x59, 0x12, + 0xFD, 0x1C, 0x6A, 0x0D, 0xE6, 0x21, 0x55, 0x12, 0x68, 0x27, 0x80, 0x02, + 0x18, 0x21, 0xFC, 0xF3, 0xC3, 0x27, 0x90, 0xF6, 0x95, 0x28, 0xDE, 0xF8, + 0xC6, 0x17, 0x97, 0xF5, 0xAA, 0x13, 0x97, 0xF4, 0x17, 0x16, 0xF5, 0xFC, + 0x76, 0x13, 0x95, 0x04, 0x08, 0x0F, 0x07, 0x06, 0x5A, 0x00, 0x48, 0x08, + 0x97, 0xF7, 0xE1, 0x0C, 0x0B, 0xEA, 0xCD, 0xFC, 0xC0, 0xE4, 0x5E, 0xF1, + 0x72, 0xEC, 0x56, 0xF1, 0xD3, 0xF0, 0xC9, 0xE8, 0x08, 0xF1, 0x62, 0xEF, + 0xDB, 0xEF, 0x81, 0xFA, 0x8C, 0xF9, 0x1C, 0xFE, 0x21, 0xFD, 0x35, 0x02, + 0x63, 0xF3, 0x65, 0xF5, 0x6B, 0xF0, 0xB5, 0xF1, 0xBD, 0xE7, 0xF2, 0xFC, + 0xB3, 0xD6, 0x1E, 0xF4, 0xEA, 0xD8, 0xC0, 0xEB, 0xAD, 0xD5, 0x96, 0xE6, + 0x46, 0xD3, 0x16, 0xDE, 0xB1, 0xED, 0x83, 0xEE, 0x59, 0x02, 0x2D, 0x05, + 0x5C, 0xEC, 0x3E, 0xEF, 0x31, 0xDD, 0xB6, 0xDB, 0x70, 0xF3, 0x6E, 0xF3, + 0xA0, 0x06, 0x1C, 0x03, 0xF7, 0xFF, 0x94, 0x00, 0x7E, 0xF4, 0x7D, 0x06, + 0x58, 0xF4, 0x2B, 0x0D, 0xF7, 0x03, 0x81, 0x17, 0xD9, 0x0A, 0xD6, 0x1A, + 0xA2, 0xFF, 0x9A, 0x11, 0x3F, 0xF3, 0x25, 0x03, 0x63, 0xEF, 0x79, 0xFE, + 0xFF, 0x00, 0x8D, 0x07, 0x60, 0x0E, 0xF0, 0x09, 0xEC, 0x0C, 0x87, 0x0C, + 0xD4, 0x0C, 0x67, 0x0F, 0x63, 0x1E, 0xE2, 0x11, 0x5A, 0x32, 0xF1, 0x14, + 0x6F, 0x1C, 0xD2, 0x10, 0x8B, 0xF4, 0xCB, 0x0F, 0x97, 0xFA, 0xE2, 0x18, + 0x4E, 0x13, 0x6E, 0x1C, 0x54, 0x1B, 0x1F, 0x13, 0xD3, 0x1E, 0x52, 0x0D, + 0x59, 0x21, 0xA4, 0x19, 0xD7, 0x27, 0xEE, 0x22, 0x87, 0x2C, 0x46, 0x19, + 0xBC, 0x27, 0x1E, 0x0C, 0x33, 0x21, 0x2C, 0x0C, 0xA6, 0x1F, 0xEE, 0x0A, + 0x47, 0x1C, 0x18, 0x01, 0x25, 0x0F, 0x7C, 0xFF, 0xAA, 0x00, 0xDB, 0xFF, + 0x86, 0x07, 0x22, 0xFA, 0x28, 0x1D, 0x73, 0xF9, 0x2F, 0x20, 0xA5, 0xFA, + 0xFF, 0x04, 0x52, 0xF4, 0xE6, 0xE7, 0xF1, 0xF1, 0xA3, 0xE5, 0x92, 0xFA, + 0x95, 0xF4, 0xAB, 0xFA, 0x97, 0xFC, 0x5F, 0xEC, 0x9C, 0xEE, 0x0B, 0xE0, + 0xA4, 0xED, 0x6E, 0xE7, 0x3A, 0xFA, 0x3C, 0xF4, 0xDC, 0xF1, 0x6A, 0xF7, + 0x66, 0xDF, 0x64, 0xFD, 0x28, 0xE1, 0x00, 0x01, 0x5E, 0xE7, 0x42, 0xEA, + 0x44, 0xE6, 0x0C, 0xDE, 0x50, 0xD8, 0xD7, 0xEA, 0xA9, 0xC2, 0x07, 0xE9, + 0x0D, 0xB9, 0x20, 0xDE, 0x1B, 0xCC, 0x75, 0xDD, 0xAA, 0xEA, 0x3C, 0xDF, + 0x3F, 0xE7, 0x54, 0xD2, 0x40, 0xD2, 0x49, 0xBF, 0x2D, 0xD6, 0x64, 0xC9, + 0x41, 0xE4, 0x96, 0xDA, 0x1F, 0xE0, 0xF9, 0xD6, 0x7A, 0xD6, 0x6F, 0xD3, + 0xCE, 0xDE, 0x1F, 0xDF, 0x20, 0xDF, 0xFD, 0xEC, 0x98, 0xD6, 0x3A, 0xF0, + 0xEE, 0xE4, 0xF9, 0xEA, 0x7C, 0xE4, 0x73, 0xD8, 0xDB, 0xE0, 0x7F, 0xCF, + 0xED, 0xEB, 0xEB, 0xDE, 0x6B, 0xEE, 0x74, 0xF2, 0x47, 0xEC, 0xD6, 0xF1, + 0x6C, 0xF7, 0x24, 0xE8, 0x16, 0x01, 0xC4, 0xE2, 0x2C, 0xF9, 0xB2, 0xE1, + 0x79, 0xF3, 0xCF, 0xE5, 0x1B, 0xF6, 0x25, 0xEF, 0xCB, 0xF9, 0x40, 0x01, + 0x47, 0xFE, 0x65, 0x15, 0x86, 0x05, 0xD4, 0x19, 0x1D, 0x0D, 0x6D, 0x10, + 0x08, 0x18, 0x6D, 0x18, 0x08, 0x1F, 0x24, 0x27, 0x78, 0x13, 0x67, 0x22, + 0xB5, 0x0F, 0x72, 0x28, 0xAD, 0x1E, 0x13, 0x2C, 0xD6, 0x26, 0xDF, 0x1D, + 0x15, 0x24, 0x55, 0x15, 0x76, 0x2A, 0x4D, 0x1B, 0x84, 0x22, 0x69, 0x26, + 0xA9, 0x0F, 0xAA, 0x2C, 0x21, 0x1A, 0x21, 0x35, 0x69, 0x1F, 0xA8, 0x35, + 0xCB, 0x0B, 0xB1, 0x26, 0x86, 0x0D, 0x24, 0x1F, 0x9A, 0x1D, 0xFE, 0x21, + 0xA4, 0x27, 0xE4, 0x1F, 0x5B, 0x2D, 0x69, 0x1A, 0xAA, 0x2C, 0x4B, 0x20, + 0x74, 0x1B, 0xC1, 0x25, 0x50, 0x0F, 0x62, 0x2A, 0x54, 0x19, 0x1F, 0x37, + 0x04, 0x15, 0xF7, 0x2B, 0x6A, 0x10, 0x10, 0x1A, 0xEC, 0x21, 0x3E, 0x21, + 0x9B, 0x29, 0xDC, 0x22, 0xDD, 0x27, 0xB1, 0x24, 0x7C, 0x18, 0x4F, 0x26, + 0xEF, 0x05, 0x56, 0x12, 0x9F, 0x18, 0xB5, 0x0A, 0x4E, 0x33, 0x36, 0x18, + 0x6C, 0x2E, 0x4F, 0x0A, 0xD9, 0x16, 0xA9, 0xE9, 0x56, 0x19, 0xAD, 0xF0, + 0x90, 0x1A, 0x0C, 0x03, 0xDA, 0x07, 0x68, 0x00, 0x27, 0x0A, 0x4A, 0xFB, + 0x37, 0x1A, 0xD7, 0xFE, 0xFD, 0x12, 0x3C, 0xFF, 0x9F, 0x0D, 0x89, 0x04, + 0x32, 0x0C, 0x00, 0x12, 0xD3, 0xF5, 0x76, 0x0B, 0xD3, 0xEC, 0xD8, 0xF4, + 0x45, 0xFF, 0x19, 0xF4, 0x2A, 0xFD, 0x65, 0xFB, 0x2E, 0xF7, 0x3F, 0xF5, + 0x68, 0x03, 0xF3, 0xF0, 0xD8, 0xF5, 0x6C, 0xF3, 0x94, 0xE9, 0x70, 0xF6, + 0x9B, 0xF9, 0x95, 0xF8, 0x4C, 0x02, 0x0D, 0xFA, 0x8B, 0x08, 0xE4, 0x01, + 0x7D, 0x08, 0x44, 0x0A, 0x8B, 0xF4, 0x00, 0x05, 0xA8, 0xED, 0xDD, 0xFD, + 0xCC, 0x04, 0xB2, 0x04, 0x34, 0x11, 0xBE, 0x07, 0x20, 0xFC, 0x34, 0x00, + 0x65, 0xFC, 0x3A, 0x00, 0xB0, 0x1F, 0xC2, 0x05, 0xA6, 0x1F, 0x70, 0x03, + 0x8F, 0x0E, 0x42, 0x06, 0x98, 0x17, 0x2F, 0x15, 0x97, 0x13, 0xED, 0x15, + 0xB8, 0x07, 0xF6, 0x11, 0x8D, 0x0B, 0xB0, 0x1B, 0xDB, 0x04, 0x7F, 0x1B, + 0xA7, 0xFF, 0x0D, 0x11, 0xEA, 0x1E, 0xF3, 0x17, 0x57, 0x23, 0x62, 0x10, + 0xB2, 0xF4, 0xD7, 0xFC, 0xCB, 0xDF, 0x06, 0x05, 0xAA, 0xEB, 0x89, 0x06, + 0x2C, 0xFA, 0xC3, 0xFA, 0x50, 0x06, 0x75, 0xFB, 0xBC, 0x06, 0x9A, 0xFD, + 0x3E, 0x00, 0x42, 0xFE, 0x00, 0xFC, 0xF5, 0x08, 0x9D, 0xE9, 0xDC, 0x06, + 0x8A, 0xD2, 0x05, 0xFC, 0x90, 0xDD, 0xD2, 0xFD, 0xAD, 0xF0, 0xCE, 0xF2, + 0x13, 0xE8, 0xF8, 0xE3, 0xAF, 0xE1, 0x79, 0xEE, 0x9F, 0xE3, 0xD2, 0xF2, + 0xC5, 0xCA, 0xAF, 0xD2, 0xE1, 0xCC, 0xE6, 0xC4, 0x31, 0xE8, 0x88, 0xD8, + 0xEB, 0xD3, 0xEE, 0xD7, 0x89, 0xBB, 0x87, 0xC9, 0x7B, 0xD1, 0x50, 0xCF, + 0xE2, 0xDD, 0xE6, 0xC9, 0x1C, 0xC9, 0x1D, 0xB4, 0x93, 0xD0, 0xCD, 0xBF, + 0x86, 0xDD, 0xF4, 0xC3, 0xB4, 0xC7, 0x8B, 0xB1, 0xD6, 0xB6, 0x90, 0xBF, + 0x43, 0xBD, 0x7E, 0xD5, 0x8A, 0xC8, 0xB2, 0xCE, 0x42, 0xD6, 0x45, 0xBB, + 0x03, 0xE1, 0xEB, 0xB0, 0x53, 0xDD, 0x8D, 0xBB, 0xE3, 0xD5, 0x14, 0xD8, + 0xBC, 0xD2, 0xC0, 0xE4, 0xA2, 0xD2, 0x6D, 0xD4, 0xF7, 0xE2, 0xE7, 0xD0, + 0xBB, 0xF7, 0x94, 0xDF, 0xE4, 0xFB, 0x08, 0xF3, 0x63, 0xEF, 0x77, 0x01, + 0xCC, 0xE5, 0x2A, 0x00, 0x95, 0xE6, 0xAE, 0xF7, 0x47, 0xEB, 0xE9, 0xEF, + 0x93, 0xFF, 0x5C, 0xF9, 0xCB, 0x03, 0xAC, 0x02, 0x8B, 0xEA, 0x89, 0xF5, + 0x32, 0xEC, 0xAE, 0xF2, 0x23, 0x02, 0x4E, 0xFD, 0xB4, 0xFA, 0xD9, 0xFA, + 0x66, 0xEA, 0xA4, 0xFB, 0xB0, 0xEB, 0x8C, 0x08, 0x32, 0xF0, 0x8E, 0x0C, + 0xC4, 0x04, 0x89, 0x0D, 0xAE, 0x1F, 0xB2, 0x0C, 0x49, 0x17, 0x61, 0xFC, + 0xDB, 0x08, 0xA4, 0xFB, 0x9D, 0x00, 0xF6, 0x06, 0x5B, 0xFE, 0x03, 0x11, + 0xA7, 0x0E, 0xF5, 0x19, 0x4B, 0x10, 0xF3, 0x0A, 0x92, 0x0C, 0x37, 0xF1, + 0xEA, 0x11, 0x73, 0xEE, 0xAE, 0x07, 0x62, 0xF2, 0xFF, 0xF9, 0xCA, 0xF0, + 0xD4, 0xF8, 0xEA, 0x04, 0xDA, 0xFE, 0xCD, 0x0F, 0xBA, 0x09, 0xF1, 0xFA, + 0x07, 0x10, 0xE5, 0xF8, 0x2A, 0x17, 0x94, 0x0F, 0x8D, 0x0A, 0xBA, 0x12, + 0x7E, 0xE8, 0x7B, 0xFD, 0x33, 0xE3, 0x7B, 0xF4, 0xE3, 0xF0, 0x93, 0xF8, + 0xAE, 0xF4, 0x28, 0xF1, 0xA9, 0xFE, 0x05, 0xF1, 0x74, 0x13, 0x2B, 0xF9, + 0xEF, 0x0A, 0x28, 0xF7, 0x9A, 0xF3, 0xCF, 0xFD, 0x71, 0xF1, 0x1D, 0x12, + 0xDB, 0xF0, 0xEA, 0x16, 0x3D, 0xEB, 0xCE, 0x09, 0x7E, 0xF0, 0xE3, 0x09, + 0x82, 0xFB, 0xF3, 0x10, 0x83, 0x01, 0x40, 0x0F, 0x11, 0xFE, 0x2B, 0x02, + 0x22, 0xF6, 0x7E, 0xFC, 0x0E, 0xF8, 0xB4, 0x18, 0xEE, 0x01, 0x13, 0x28, + 0x9F, 0x09, 0x93, 0x17, 0xA2, 0x0F, 0xAF, 0x1C, 0x10, 0x0F, 0xBE, 0x21, + 0xDD, 0x14, 0xFA, 0x1C, 0x3B, 0x30, 0x94, 0x31, 0xC0, 0x45, 0x0F, 0x3F, + 0x29, 0x38, 0xCD, 0x2E, 0x5B, 0x3A, 0xD6, 0x32, 0x35, 0x55, 0xEE, 0x44, + 0x97, 0x55, 0xC4, 0x36, 0xBA, 0x48, 0x08, 0x22, 0x6E, 0x37, 0x8D, 0x1D, + 0xB5, 0x36, 0x4E, 0x20, 0xA9, 0x42, 0xB6, 0x16, 0xC6, 0x45, 0xAF, 0x0E, + 0x3C, 0x44, 0x31, 0x16, 0x84, 0x3E, 0xA6, 0x13, 0x71, 0x3B, 0x43, 0x0D, + 0xAF, 0x40, 0xF2, 0x22, 0x0B, 0x37, 0x09, 0x2D, 0x70, 0x24, 0x46, 0x1F, + 0x11, 0x21, 0xAE, 0x1F, 0x1F, 0x26, 0xF7, 0x1F, 0x6A, 0x23, 0x32, 0x1A, + 0x1B, 0x09, 0xED, 0x17, 0xEC, 0xF8, 0xAC, 0x0E, 0xA6, 0x06, 0xA8, 0x06, + 0xC6, 0x11, 0x1A, 0x0C, 0x81, 0x09, 0x2A, 0x11, 0x8B, 0x03, 0x43, 0x10, + 0x9D, 0x05, 0x62, 0x0B, 0x90, 0xF2, 0xE4, 0x01, 0x60, 0xE8, 0x50, 0x02, + 0x56, 0xF4, 0x84, 0x14, 0x5E, 0xEC, 0xD1, 0x0B, 0x1B, 0xE0, 0x16, 0xEF, + 0x28, 0xE7, 0x8E, 0xE9, 0x39, 0xE7, 0xEE, 0xEA, 0xDB, 0xD7, 0x7D, 0xE6, + 0x2D, 0xDE, 0x15, 0xE5, 0xC6, 0xF2, 0x75, 0xE7, 0x67, 0xE8, 0x20, 0xE2, + 0xF6, 0xD9, 0x91, 0xEA, 0xD6, 0xE1, 0xD3, 0xFE, 0x36, 0xE6, 0x62, 0xFB, + 0x89, 0xDA, 0xD8, 0xEB, 0xCF, 0xE1, 0x8B, 0xEA, 0xAB, 0xF7, 0x0E, 0xF9, + 0x90, 0xED, 0xDC, 0xFC, 0x72, 0xD3, 0xF4, 0xEE, 0x46, 0xCB, 0x32, 0xE9, + 0x4D, 0xDA, 0x9D, 0xEA, 0x10, 0xEE, 0x2E, 0xEC, 0x1F, 0x00, 0xF7, 0xF1, + 0x95, 0x0B, 0x47, 0xF5, 0xED, 0xF3, 0x14, 0xF3, 0x9E, 0xE2, 0x27, 0xF9, + 0xD9, 0x01, 0x79, 0x0A, 0x2C, 0x16, 0x68, 0x0E, 0x76, 0x00, 0x9E, 0xFE, + 0xA8, 0xF5, 0x29, 0xFE, 0x2B, 0x04, 0x17, 0x17, 0xBC, 0x11, 0xFE, 0x22, + 0x1A, 0x18, 0xC4, 0x11, 0xE7, 0x0F, 0x2C, 0xFE, 0x77, 0x11, 0xA3, 0xFA, + 0xAE, 0x15, 0x74, 0xF9, 0xFE, 0x0A, 0x7D, 0xFF, 0x17, 0x0A, 0x95, 0x02, + 0x07, 0x0B, 0x29, 0xF8, 0x58, 0x07, 0x65, 0xED, 0x18, 0x1E, 0xE8, 0xED, + 0x21, 0x2F, 0xB7, 0xF4, 0xD5, 0x17, 0x3C, 0x00, 0x40, 0xFA, 0x98, 0x08, + 0xAD, 0x00, 0xED, 0x10, 0x49, 0x1A, 0xDC, 0x11, 0x6B, 0x19, 0x14, 0xFE, + 0x38, 0x09, 0xD0, 0xF2, 0x79, 0x0B, 0x75, 0xFE, 0x46, 0x04, 0x10, 0x06, + 0x7B, 0xF8, 0x26, 0x07, 0x94, 0x0F, 0xF3, 0x0D, 0x86, 0x19, 0x64, 0x04, + 0x0C, 0xFA, 0x77, 0xEF, 0x97, 0xFD, 0xE1, 0xFA, 0x00, 0x1A, 0x64, 0x1F, + 0xB7, 0xFA, 0xDA, 0x22, 0xA1, 0xE2, 0x2E, 0x0C, 0x4E, 0xFA, 0x6A, 0x0C, + 0xE8, 0xF4, 0xB7, 0x0B, 0xF2, 0xE3, 0xE4, 0xFC, 0x91, 0xEE, 0x9A, 0x02, + 0xF8, 0xF8, 0x40, 0x00, 0x61, 0xF3, 0xDE, 0xE3, 0x99, 0xF7, 0x2A, 0xE9, + 0x2C, 0x02, 0x72, 0x01, 0xD1, 0xEA, 0x2F, 0xF9, 0x77, 0xCE, 0x3A, 0xEC, + 0x97, 0xDF, 0x47, 0xF4, 0x6D, 0xF9, 0xDF, 0xFF, 0x54, 0xFC, 0xB7, 0xFE, + 0xBB, 0xFA, 0x92, 0xF3, 0xA5, 0xF4, 0xD5, 0xEE, 0x0C, 0xE8, 0xA4, 0xF9, + 0x61, 0xE6, 0x93, 0x05, 0x19, 0xFB, 0x96, 0x09, 0xE3, 0x00, 0x48, 0xFB, + 0xED, 0xFB, 0xCF, 0xE8, 0x99, 0xFB, 0xEC, 0xE9, 0x7A, 0x02, 0x28, 0xF8, + 0x2E, 0x00, 0xAB, 0xF6, 0x21, 0xEF, 0x44, 0xE7, 0x41, 0xFA, 0x68, 0xEC, + 0x54, 0x0A, 0xAD, 0x04, 0xD2, 0x10, 0x03, 0x13, 0xAC, 0x11, 0x5B, 0x10, + 0xE7, 0xFC, 0x15, 0x07, 0xF2, 0xE6, 0xBC, 0xFD, 0x48, 0xEE, 0x01, 0xFD, + 0xD4, 0xFE, 0xA7, 0xF8, 0xB3, 0xF5, 0x0E, 0xE9, 0x19, 0xF0, 0xB3, 0xE2, + 0xC5, 0xFE, 0x0A, 0xE3, 0x91, 0x04, 0x88, 0xE9, 0xD2, 0xFD, 0x89, 0xF3, + 0x88, 0xEF, 0xBB, 0xF5, 0x7F, 0xD8, 0x5A, 0xF1, 0xBA, 0xE5, 0xFE, 0xFC, + 0xCA, 0x08, 0x30, 0x0A, 0xC5, 0x02, 0x31, 0xF6, 0x28, 0xEA, 0x71, 0xE0, + 0xC4, 0xEB, 0x78, 0xE3, 0xE1, 0xF6, 0x0F, 0xE7, 0x9E, 0xF1, 0x2A, 0xE7, + 0x8B, 0xED, 0x4D, 0xF8, 0xF3, 0xE9, 0x18, 0xFB, 0x89, 0xDA, 0x80, 0xDE, + 0x14, 0xE6, 0x82, 0xE5, 0xA7, 0xFF, 0x67, 0x05, 0xA4, 0xEA, 0xD3, 0xF1, + 0x5E, 0xDA, 0x7A, 0xE5, 0x87, 0xFB, 0xAB, 0x03, 0xD8, 0x11, 0xC8, 0x06, + 0x71, 0x04, 0x09, 0xF8, 0xFD, 0x04, 0x55, 0xFD, 0x28, 0x0B, 0xD4, 0xF4, + 0x95, 0xF6, 0x05, 0xDB, 0xB9, 0xF5, 0xF9, 0xEB, 0x6C, 0x06, 0x3E, 0xFA, + 0x05, 0xFC, 0x50, 0xDE, 0xA6, 0xF3, 0x68, 0xD6, 0x6D, 0xFF, 0xAA, 0xEB, + 0x9A, 0xFA, 0x2E, 0xFB, 0x3F, 0xF0, 0x19, 0xFA, 0x7A, 0xFC, 0x76, 0xFD, + 0xB6, 0x0C, 0xDD, 0x0B, 0xEA, 0x0C, 0x17, 0x15, 0x60, 0x00, 0xD4, 0x19, + 0x24, 0x04, 0xAA, 0x1B, 0x7C, 0x04, 0x4B, 0x0C, 0xD6, 0xFA, 0x58, 0x05, + 0xFC, 0x01, 0x7B, 0x15, 0x38, 0x16, 0x6B, 0x24, 0xA5, 0x1C, 0xFF, 0x21, + 0x0C, 0x11, 0x1D, 0x1F, 0xD5, 0x10, 0x72, 0x2B, 0x79, 0x16, 0x03, 0x31, + 0x40, 0x1B, 0xD9, 0x2E, 0xED, 0x19, 0xB9, 0x22, 0x56, 0x17, 0x9A, 0x17, + 0x73, 0x1A, 0x4C, 0x1B, 0x14, 0x1E, 0xDF, 0x29, 0x07, 0x26, 0x76, 0x2C, + 0xE9, 0x23, 0x83, 0x19, 0xB2, 0x16, 0x23, 0x14, 0x06, 0x1F, 0x97, 0x1F, + 0x26, 0x29, 0xDD, 0x24, 0x93, 0x2D, 0xD2, 0x2E, 0x44, 0x26, 0xEB, 0x29, + 0x43, 0x21, 0x76, 0x25, 0x47, 0x41, 0xE8, 0x3A, 0x90, 0x58, 0x91, 0x45, + 0x93, 0x43, 0xB6, 0x3C, 0xF8, 0x27, 0xEF, 0x36, 0x10, 0x21, 0xB2, 0x31, + 0x42, 0x2B, 0xFC, 0x2E, 0x62, 0x32, 0x90, 0x2E, 0xCE, 0x29, 0xCD, 0x20, + 0x97, 0x12, 0x7A, 0x11, 0xD0, 0x06, 0x6E, 0x12, 0x23, 0x1F, 0x98, 0x24, + 0xF1, 0x27, 0x6C, 0x2D, 0x22, 0x15, 0x00, 0x19, 0x39, 0x17, 0x6B, 0x12, + 0x23, 0x28, 0x4C, 0x25, 0x6D, 0x1D, 0xFB, 0x1C, 0x0F, 0x09, 0x9C, 0x11, + 0x69, 0x09, 0xB1, 0x1A, 0x60, 0x0E, 0x9B, 0x08, 0x8F, 0x19, 0x5C, 0xF4, + 0x1B, 0x29, 0x16, 0x0A, 0x91, 0x11, 0x50, 0x08, 0x5C, 0xE0, 0x1C, 0xEB, + 0x7C, 0xDD, 0xB8, 0xEC, 0xC3, 0xFC, 0x41, 0xEE, 0x74, 0xFF, 0xAE, 0xD9, + 0x40, 0xEF, 0x93, 0xCE, 0xD9, 0xF0, 0x41, 0xD8, 0x7B, 0xF3, 0x0F, 0xEC, + 0x86, 0xEF, 0xA0, 0xF6, 0x07, 0xF9, 0xAD, 0xF5, 0xAB, 0xFE, 0x14, 0xF2, + 0xAA, 0xF4, 0xC4, 0xE3, 0x62, 0xED, 0xBB, 0xE2, 0xF2, 0xF2, 0xD3, 0xFC, + 0xF0, 0xEF, 0xA9, 0xFE, 0xF3, 0xE5, 0x74, 0xEB, 0xCC, 0xF0, 0xAC, 0xF3, + 0xE4, 0x00, 0x3E, 0xFD, 0xDA, 0xFF, 0xE4, 0xFA, 0x6E, 0xFC, 0xDC, 0xFF, + 0x60, 0xFC, 0x48, 0xF4, 0xBB, 0xF8, 0x66, 0xE9, 0xCD, 0xE9, 0x50, 0xF2, + 0xF3, 0xE0, 0xD1, 0xF5, 0x89, 0xE6, 0x9A, 0xF7, 0x40, 0xDF, 0x3E, 0xF6, + 0x8E, 0xDC, 0xC1, 0xEB, 0xC0, 0xF3, 0x9E, 0xF3, 0x77, 0xFC, 0xFC, 0xF6, + 0xAB, 0xE5, 0xAE, 0xE4, 0xDD, 0xCE, 0x83, 0xE1, 0x9A, 0xD2, 0x0F, 0xF3, + 0xC7, 0xDF, 0x3B, 0xFC, 0xC5, 0xE1, 0x25, 0xF1, 0x03, 0xEE, 0x0A, 0xE8, + 0xDC, 0xFB, 0x70, 0xE4, 0x12, 0xF0, 0xD5, 0xE3, 0xBF, 0xF4, 0xE2, 0xF4, + 0x3A, 0x01, 0x6D, 0xFE, 0x20, 0xDF, 0x06, 0xE3, 0x90, 0xCC, 0xE4, 0xCF, + 0x55, 0xF5, 0x0B, 0xEC, 0xBF, 0xFE, 0xD2, 0xEC, 0x2E, 0xCE, 0x94, 0xC3, + 0x0C, 0xBC, 0x2F, 0xC0, 0x7C, 0xD2, 0x83, 0xCE, 0xD2, 0xD9, 0xF4, 0xC7, + 0xFF, 0xDF, 0xF9, 0xC9, 0xEF, 0xEC, 0x82, 0xD0, 0x98, 0xDA, 0x52, 0xC0, + 0x20, 0xC8, 0xF6, 0xBB, 0xCA, 0xE2, 0x88, 0xDF, 0xD5, 0xDF, 0xB4, 0xE5, + 0x69, 0xA7, 0xC5, 0xC2, 0x3A, 0xA8, 0x59, 0xC1, 0x11, 0xE5, 0x65, 0xD3, + 0xFF, 0xE7, 0x46, 0xC5, 0xB2, 0xC6, 0x96, 0xB1, 0xEA, 0xD1, 0xB4, 0xBC, + 0xCB, 0xD3, 0x10, 0xCF, 0x07, 0xC3, 0xC2, 0xD8, 0x1B, 0xD2, 0x6A, 0xE8, + 0x8B, 0xD4, 0x7B, 0xEB, 0xE3, 0xBB, 0xF3, 0xD8, 0x14, 0xD0, 0xE7, 0xDC, + 0x5D, 0xFB, 0xE7, 0xF4, 0x25, 0xE4, 0xA4, 0xEC, 0x7C, 0xB9, 0x8F, 0xE1, + 0xD1, 0xCE, 0x72, 0xF6, 0x54, 0xF3, 0x8A, 0x0B, 0x56, 0xEE, 0x09, 0x0C, + 0x0E, 0xE2, 0x3D, 0x07, 0xD9, 0xEE, 0x98, 0x03, 0x96, 0xF1, 0x06, 0x01, + 0xFF, 0xEE, 0x6D, 0x0E, 0xCD, 0xFA, 0x2D, 0x17, 0x70, 0xFD, 0x0D, 0x09, + 0xBC, 0x04, 0xE8, 0xF9, 0x54, 0x22, 0xAC, 0x03, 0x6B, 0x23, 0x91, 0x12, + 0xBE, 0x03, 0xE4, 0x0C, 0xEB, 0xFC, 0x34, 0x04, 0xA1, 0x12, 0x18, 0x01, + 0x6D, 0x23, 0x32, 0xFE, 0x93, 0x26, 0x60, 0xFF, 0x33, 0x2D, 0x7F, 0xFF, + 0xBE, 0x26, 0x8A, 0xF4, 0x21, 0x16, 0x10, 0xF1, 0xF8, 0x13, 0x1B, 0xFD, + 0x01, 0x22, 0xAD, 0x12, 0xC6, 0x24, 0xDF, 0x1E, 0x66, 0x19, 0xB5, 0x09, + 0xDD, 0x10, 0x2F, 0xF8, 0x2E, 0x06, 0x58, 0x10, 0xF3, 0xF9, 0xBF, 0x16, + 0x1E, 0xF8, 0x5D, 0xFD, 0x14, 0x03, 0xDD, 0xF3, 0x34, 0x0D, 0x3B, 0xF8, + 0x33, 0x0A, 0xBC, 0x00, 0x00, 0x18, 0xDA, 0x10, 0x1B, 0x1E, 0xE1, 0x11, + 0xBC, 0xF9, 0xD4, 0xFC, 0x5F, 0xEB, 0x08, 0x00, 0xBB, 0x03, 0x47, 0x15, + 0xE5, 0x03, 0x75, 0x0C, 0xB0, 0xE1, 0x43, 0xEE, 0xA7, 0xD6, 0xCA, 0xE6, + 0xFA, 0xF3, 0x9A, 0xFE, 0x7E, 0x10, 0xD1, 0x02, 0xD7, 0x0F, 0x35, 0xF4, + 0x1D, 0xF9, 0xC7, 0xF5, 0x73, 0xF0, 0x3A, 0xFC, 0x8A, 0x05, 0xB0, 0x0C, + 0xB0, 0x20, 0x68, 0x26, 0xC6, 0x28, 0x61, 0x24, 0x12, 0x19, 0xB5, 0x14, + 0xE5, 0x13, 0x75, 0x23, 0x96, 0x2C, 0x15, 0x42, 0xDF, 0x31, 0xA1, 0x42, + 0x5D, 0x15, 0x6A, 0x2C, 0x3C, 0x0A, 0x19, 0x29, 0x34, 0x21, 0xCA, 0x32, + 0x8C, 0x30, 0xAF, 0x30, 0x9F, 0x25, 0xB3, 0x2C, 0xA8, 0x1B, 0xEA, 0x2F, + 0x64, 0x1F, 0x61, 0x2C, 0x84, 0x33, 0x8B, 0x32, 0x2E, 0x46, 0x0A, 0x3E, + 0x76, 0x3B, 0xFD, 0x36, 0x5B, 0x1D, 0x44, 0x2F, 0xE9, 0x1B, 0x80, 0x3C, + 0xA8, 0x31, 0xD0, 0x47, 0xD6, 0x2C, 0x25, 0x32, 0xA9, 0x1B, 0x6E, 0x10, + 0x09, 0x2C, 0xB5, 0x12, 0x14, 0x34, 0xFA, 0x27, 0x53, 0x1E, 0x28, 0x31, + 0x2D, 0x1D, 0x06, 0x2D, 0xF9, 0x22, 0xCC, 0x1F, 0x31, 0x18, 0x77, 0x08, + 0xF8, 0x19, 0x81, 0xF9, 0x7B, 0x25, 0xDE, 0x04, 0xFA, 0x13, 0xAC, 0x01, + 0x0A, 0xF7, 0xE5, 0xEA, 0x2A, 0x0D, 0x25, 0xF4, 0x11, 0x24, 0x12, 0x07, + 0xD7, 0xFC, 0x1D, 0xED, 0x7E, 0xDE, 0xE0, 0xD6, 0x94, 0xED, 0xFB, 0xE5, + 0x2F, 0xE9, 0x02, 0xE9, 0x9E, 0xDE, 0x7C, 0xE2, 0x59, 0xFF, 0x22, 0xF0, + 0x18, 0xFC, 0x22, 0xEF, 0xA3, 0xD9, 0xB4, 0xDA, 0xC4, 0xE8, 0x36, 0xDE, + 0xC5, 0x01, 0x7B, 0xE9, 0xBA, 0xFA, 0x4C, 0xDD, 0x83, 0xE5, 0x12, 0xCF, + 0x9F, 0xD4, 0x5C, 0xCE, 0xC4, 0xC3, 0xD9, 0xD9, 0xEA, 0xB0, 0x4B, 0xE1, + 0xDA, 0xB8, 0x84, 0xDE, 0x66, 0xCD, 0x11, 0xD2, 0x61, 0xD8, 0x50, 0xC7, + 0x58, 0xDF, 0x27, 0xCF, 0x60, 0xE9, 0x8C, 0xE3, 0x6C, 0xE3, 0x31, 0xF2, + 0x3D, 0xCF, 0x66, 0xEE, 0x30, 0xE4, 0xC6, 0xF4, 0xA6, 0x03, 0xA7, 0x01, + 0xFE, 0x05, 0xB5, 0xFA, 0x4A, 0xFF, 0xE3, 0xF8, 0x4E, 0xF5, 0x32, 0x02, + 0x49, 0xF1, 0x16, 0x0D, 0x3F, 0x00, 0x94, 0x1A, 0xCA, 0x18, 0x83, 0x1B, + 0x81, 0x1D, 0x6C, 0x0E, 0xE4, 0x0E, 0x47, 0x09, 0x59, 0x19, 0x5E, 0x1D, + 0xF6, 0x2F, 0x26, 0x2C, 0x15, 0x1B, 0xFC, 0x15, 0x46, 0x01, 0xB8, 0x02, + 0x61, 0x10, 0x11, 0x13, 0x93, 0x24, 0x6D, 0x20, 0x21, 0x29, 0x84, 0x17, + 0x76, 0x20, 0xFC, 0x09, 0x8B, 0x11, 0x21, 0x0B, 0x3C, 0x0A, 0x18, 0x21, + 0x38, 0x13, 0xCF, 0x31, 0xA3, 0x15, 0x63, 0x22, 0x82, 0x12, 0xE2, 0x18, + 0x3F, 0x17, 0xC5, 0x19, 0xF1, 0x1F, 0xFD, 0x11, 0x53, 0x31, 0x54, 0x20, + 0x08, 0x25, 0x8A, 0x19, 0xC2, 0xFB, 0x97, 0xF6, 0xCD, 0xFB, 0x7C, 0x07, + 0xC4, 0x11, 0x81, 0x22, 0xBD, 0x08, 0x9F, 0x0D, 0xBF, 0xF2, 0x8A, 0xF2, + 0xB6, 0xF4, 0xB5, 0xF1, 0xA0, 0xFC, 0x68, 0xFC, 0x9E, 0xF7, 0x0C, 0xFA, + 0x44, 0xF6, 0x65, 0xF4, 0xB2, 0xEF, 0x62, 0xF5, 0x21, 0xE7, 0x1D, 0xF1, + 0x5D, 0xFF, 0x60, 0xF9, 0x48, 0x14, 0x32, 0x0C, 0x10, 0xF0, 0x27, 0xFC, + 0xDB, 0xC0, 0xF5, 0xD8, 0x62, 0xD0, 0xB2, 0xDF, 0x24, 0xF1, 0x10, 0xEF, + 0xC3, 0xE9, 0xF1, 0xE1, 0x70, 0xE2, 0x0C, 0xE4, 0xA3, 0xE6, 0x15, 0xEA, + 0xB7, 0xE5, 0xF7, 0xE3, 0xAB, 0xEC, 0x68, 0xF0, 0xA1, 0xEE, 0xA8, 0xF5, + 0xCC, 0xE7, 0xD7, 0xE6, 0xA5, 0xF2, 0xEF, 0xE0, 0xF1, 0x0B, 0xF6, 0xE1, + 0x73, 0x0C, 0x0A, 0xE0, 0xB1, 0xF5, 0x74, 0xDE, 0x28, 0xF6, 0xCB, 0xE3, + 0x39, 0x03, 0xE2, 0xEC, 0x1D, 0x03, 0x5F, 0xED, 0x50, 0xF8, 0x97, 0xF2, + 0x32, 0xF6, 0xAA, 0xFC, 0x33, 0xF5, 0xB1, 0xF2, 0xD5, 0xF4, 0x84, 0xEC, + 0x5E, 0xFA, 0x62, 0xFE, 0xD1, 0xF4, 0x64, 0x03, 0xEC, 0xF2, 0x9F, 0xEF, + 0xEA, 0xFC, 0xB3, 0xF3, 0xF5, 0xF5, 0x19, 0xFD, 0xE9, 0xEF, 0xB3, 0xFB, + 0x35, 0xFA, 0x5F, 0xFB, 0x6F, 0xF5, 0x44, 0xEB, 0x9A, 0xEC, 0xD3, 0xEB, + 0x09, 0xE8, 0x39, 0x01, 0xB4, 0xD7, 0xFE, 0xFE, 0x26, 0xD5, 0x74, 0xEE, + 0x9F, 0xE9, 0xB3, 0xED, 0x42, 0xF5, 0xA4, 0xEC, 0xF5, 0xEA, 0xB1, 0xEE, + 0x10, 0xE5, 0x77, 0xFA, 0x42, 0xE0, 0x6F, 0xE8, 0x00, 0xD2, 0x9D, 0xD3, + 0x4E, 0xE0, 0x72, 0xEC, 0x41, 0xFE, 0xFB, 0x05, 0x16, 0xF7, 0x84, 0xF0, + 0x6A, 0xEF, 0xEE, 0xDC, 0xFC, 0xFE, 0xB1, 0xF0, 0x45, 0xFA, 0x36, 0x00, + 0xEC, 0xEE, 0xEA, 0xFE, 0xAC, 0xF7, 0xE9, 0x00, 0x79, 0xF3, 0x88, 0xFA, + 0x21, 0xEB, 0x21, 0xF6, 0xDF, 0xF5, 0x82, 0x08, 0xED, 0xF6, 0x37, 0x13, + 0x8A, 0xEB, 0x92, 0x01, 0x05, 0xF3, 0xD8, 0xF1, 0x7E, 0x08, 0x40, 0xF6, + 0x03, 0x0D, 0xEC, 0xFF, 0x53, 0x03, 0x9A, 0x04, 0xA7, 0xF5, 0x04, 0x05, + 0x85, 0xF7, 0x25, 0x0C, 0x3D, 0x0A, 0x07, 0x15, 0xD1, 0x1B, 0xC9, 0x15, + 0x02, 0x25, 0x12, 0x14, 0xA5, 0x18, 0xB7, 0x10, 0xC3, 0x12, 0xBC, 0x16, + 0x5A, 0x28, 0x78, 0x2B, 0x32, 0x32, 0x8A, 0x30, 0x3D, 0x21, 0xF3, 0x18, + 0xF0, 0x1C, 0x57, 0x0F, 0xC6, 0x2D, 0x01, 0x25, 0xBB, 0x2C, 0xAF, 0x2B, + 0xB2, 0x28, 0x82, 0x1A, 0xB2, 0x2B, 0xF6, 0x0E, 0x02, 0x26, 0x40, 0x14, + 0x5B, 0x28, 0x83, 0x20, 0xD3, 0x38, 0x56, 0x2D, 0x4B, 0x38, 0x2C, 0x2E, + 0xDB, 0x25, 0x55, 0x20, 0xDA, 0x29, 0xB3, 0x27, 0x8E, 0x41, 0xED, 0x3B, + 0x72, 0x33, 0x77, 0x38, 0xC7, 0x10, 0xC5, 0x2B, 0x6C, 0x27, 0x33, 0x36, + 0x8E, 0x48, 0x21, 0x3F, 0xF0, 0x3E, 0x48, 0x2C, 0x6D, 0x35, 0x28, 0x15, + 0x03, 0x27, 0x09, 0x13, 0x7D, 0x0F, 0xBD, 0x24, 0xE0, 0x15, 0x78, 0x3B, + 0xB9, 0x25, 0x7F, 0x4B, 0x7D, 0x18, 0xEB, 0x36, 0x77, 0x0B, 0xE7, 0x0B, + 0x44, 0x1B, 0x65, 0x06, 0xBE, 0x24, 0x2D, 0x12, 0xA3, 0x09, 0x12, 0x10, + 0x6A, 0xEB, 0xF5, 0x0C, 0xD4, 0xFA, 0xB6, 0x14, 0x3F, 0x10, 0x8B, 0x1D, + 0x50, 0x0F, 0x08, 0x19, 0xAC, 0x0A, 0x7C, 0x0B, 0x4C, 0xFC, 0x07, 0xFD, + 0xC6, 0xEC, 0xAB, 0xEC, 0x7D, 0x01, 0xB4, 0xF4, 0x0F, 0x11, 0x82, 0x0D, + 0xC5, 0xF6, 0x71, 0x06, 0x91, 0xF1, 0x0F, 0xF0, 0xA3, 0x03, 0xD8, 0xF5, + 0x11, 0x06, 0xB4, 0x01, 0x31, 0xF6, 0xFF, 0xFC, 0x74, 0xE2, 0xE0, 0xF4, + 0xA2, 0xE8, 0x25, 0xEC, 0x5F, 0xF8, 0x23, 0xEA, 0x72, 0xFF, 0x0A, 0xE9, + 0x2B, 0xFA, 0xDC, 0xD9, 0x35, 0xF8, 0xCC, 0xD2, 0xCC, 0x05, 0x5F, 0xE0, + 0x46, 0x07, 0xDC, 0xF6, 0xDC, 0xFA, 0xC9, 0x09, 0x44, 0xED, 0x0D, 0x06, + 0x46, 0xF4, 0xB1, 0xFC, 0x16, 0x05, 0x57, 0xFE, 0x89, 0x07, 0x3E, 0xF3, + 0xD9, 0x0D, 0xCA, 0xE3, 0x9C, 0x0A, 0xB2, 0xDD, 0x84, 0xFA, 0xFF, 0xDD, + 0x60, 0xF0, 0x3F, 0xF1, 0xE5, 0xEF, 0xB5, 0x09, 0xAE, 0xFE, 0x78, 0x0B, + 0x9A, 0x00, 0x72, 0xF5, 0xC7, 0xF1, 0x87, 0xE9, 0x8B, 0xE5, 0x9E, 0xF5, + 0x29, 0xE6, 0x39, 0x00, 0x1D, 0xEE, 0x5A, 0xF7, 0x37, 0xF0, 0x37, 0xF4, + 0x42, 0xF2, 0xB1, 0xFF, 0x84, 0xF0, 0x28, 0x01, 0xBC, 0xEF, 0x40, 0xFF, + 0x9B, 0xF4, 0x66, 0xFB, 0x98, 0xE2, 0x00, 0xEF, 0xD2, 0xCB, 0x48, 0xF3, + 0xC3, 0xD9, 0x31, 0x08, 0x11, 0xEE, 0xBE, 0x02, 0xFA, 0xE5, 0x3C, 0xE4, + 0x5B, 0xD4, 0x85, 0xDC, 0x73, 0xDF, 0x18, 0xF0, 0x7E, 0xF7, 0x83, 0xF9, + 0xAB, 0xE5, 0xE7, 0xE5, 0xE3, 0xD0, 0xED, 0xD5, 0x8E, 0xDD, 0x6B, 0xD7, + 0x43, 0xEA, 0x56, 0xD2, 0x53, 0xEE, 0xD4, 0xC9, 0x5B, 0xEE, 0x1D, 0xC7, + 0x67, 0xE5, 0x89, 0xBC, 0x26, 0xDD, 0x78, 0xBB, 0xA4, 0xF0, 0xBF, 0xD2, + 0x02, 0xF9, 0xB1, 0xD8, 0x5F, 0xC5, 0x7B, 0xBC, 0xBA, 0xB1, 0x7C, 0xBA, + 0x10, 0xDC, 0x17, 0xD5, 0x32, 0xE4, 0xA5, 0xCF, 0x12, 0xC4, 0x43, 0xBF, + 0x21, 0xB2, 0x13, 0xC3, 0xCB, 0xB3, 0x26, 0xCC, 0x36, 0xBC, 0xFB, 0xD2, + 0x33, 0xDE, 0x63, 0xDD, 0x70, 0xEE, 0xA2, 0xD8, 0x5C, 0xD1, 0x63, 0xC3, + 0xE9, 0xD1, 0xAF, 0xD3, 0xF3, 0xE4, 0x5A, 0xF0, 0xD4, 0xD5, 0xA2, 0xE7, + 0x8A, 0xC8, 0x61, 0xE1, 0x96, 0xDE, 0x4A, 0xF1, 0xA5, 0xF8, 0x0E, 0xF7, + 0xA4, 0xEB, 0x83, 0xED, 0x8C, 0xDF, 0xA7, 0xEC, 0x4D, 0xDC, 0x49, 0xDF, + 0x63, 0xD2, 0x8F, 0xD3, 0x36, 0xED, 0xC6, 0xED, 0x0B, 0x10, 0xDD, 0xF9, + 0x5E, 0x00, 0xE2, 0xE7, 0x4F, 0xF2, 0xC8, 0xF3, 0xEB, 0x10, 0x52, 0x1A, + 0x9C, 0x21, 0xCF, 0x22, 0x67, 0x17, 0x3C, 0x10, 0x49, 0x15, 0x17, 0x0D, + 0x77, 0x12, 0x29, 0x12, 0xC2, 0x02, 0x51, 0x15, 0x4D, 0xFA, 0xEE, 0x23, + 0x10, 0x02, 0xFF, 0x27, 0x79, 0x0C, 0x59, 0x18, 0x70, 0x1B, 0x10, 0x16, + 0xD8, 0x2A, 0x2F, 0x25, 0x65, 0x2E, 0xB6, 0x2E, 0x9B, 0x16, 0x4B, 0x26, + 0x7A, 0x08, 0x3E, 0x1F, 0xC2, 0x23, 0x7D, 0x25, 0x34, 0x2D, 0x0F, 0x21, + 0xA9, 0x1E, 0xD9, 0x1B, 0x97, 0x14, 0x4D, 0x1E, 0x3F, 0x12, 0x6F, 0x1B, + 0xB1, 0x10, 0x57, 0x17, 0xDE, 0x09, 0x94, 0x14, 0x6B, 0x11, 0x0D, 0x12, + 0x08, 0x1B, 0xCA, 0x0F, 0x62, 0x16, 0xF1, 0x09, 0x31, 0x18, 0x98, 0x10, + 0x04, 0x1E, 0x9A, 0x17, 0xE2, 0x15, 0x03, 0x09, 0x97, 0x05, 0xE6, 0xF6, + 0x46, 0x11, 0x40, 0x00, 0x96, 0x1B, 0xF7, 0x0D, 0xD3, 0x10, 0xA0, 0x05, + 0x3F, 0x13, 0x9B, 0xF5, 0x58, 0x19, 0x4B, 0xEE, 0x00, 0x0B, 0xD2, 0xF8, + 0xB1, 0xFC, 0x14, 0x0A, 0x9B, 0xF7, 0x29, 0x10, 0xB4, 0xF3, 0x44, 0x0E, + 0x4D, 0x02, 0xD0, 0x0F, 0x3C, 0x23, 0x39, 0x17, 0x4C, 0x37, 0xC6, 0x1A, + 0xDF, 0x2E, 0x7E, 0x0C, 0x7B, 0x15, 0xE0, 0x09, 0x6A, 0x03, 0x95, 0x1F, + 0xE4, 0x07, 0x9A, 0x2E, 0x98, 0x15, 0x69, 0x31, 0xDF, 0x18, 0x2B, 0x1D, + 0x8B, 0x0C, 0x44, 0x05, 0x2C, 0x00, 0x90, 0x11, 0x9C, 0x09, 0x5A, 0x1F, + 0x69, 0x18, 0x39, 0x18, 0x62, 0x17, 0x3B, 0x1A, 0xD0, 0x13, 0x44, 0x23, + 0xE4, 0x18, 0xE8, 0x27, 0xB2, 0x29, 0x58, 0x34, 0xA9, 0x2E, 0x28, 0x2C, + 0x4C, 0x18, 0x99, 0x17, 0x55, 0x12, 0x72, 0x25, 0xAE, 0x22, 0x02, 0x30, + 0x10, 0x1F, 0xC9, 0x23, 0xF7, 0x16, 0x2F, 0x18, 0x18, 0x19, 0x70, 0x12, + 0xF8, 0x12, 0xE9, 0x19, 0x60, 0x21, 0xA7, 0x27, 0xFB, 0x25, 0x0D, 0x23, + 0xEE, 0xFD, 0x47, 0x0B, 0x30, 0xF6, 0x65, 0x03, 0xD7, 0x20, 0x11, 0x0F, + 0x85, 0x28, 0x09, 0x02, 0xFC, 0x08, 0xE5, 0xE2, 0x6E, 0x03, 0x12, 0xE8, + 0x5C, 0x07, 0xFA, 0xF9, 0x52, 0x07, 0x3C, 0xF9, 0xB5, 0x03, 0x86, 0x02, + 0x1B, 0xE3, 0x8B, 0xFC, 0x0B, 0xCF, 0x3E, 0xDF, 0x3B, 0xED, 0x10, 0xE8, + 0x43, 0x09, 0x3F, 0xF9, 0x87, 0xFA, 0x12, 0xDC, 0xE9, 0xD2, 0xDC, 0xC3, + 0x4D, 0xCC, 0x70, 0xD5, 0xB7, 0xE5, 0x19, 0xE0, 0x74, 0xEB, 0xAA, 0xDC, + 0xF8, 0xDA, 0x43, 0xDD, 0x93, 0xD5, 0x2E, 0xDE, 0x31, 0xE0, 0xEE, 0xDE, + 0x8F, 0xE3, 0x6A, 0xDF, 0xE1, 0xD2, 0xB2, 0xE3, 0xBB, 0xC9, 0x12, 0xE3, + 0x4D, 0xD5, 0x67, 0xDD, 0x18, 0xED, 0x52, 0xEC, 0x1D, 0xF7, 0x18, 0xFE, + 0xD1, 0xE9, 0x35, 0xF2, 0xD2, 0xEF, 0x9B, 0xF6, 0xAF, 0xFE, 0x72, 0x0C, + 0xD6, 0x04, 0x4E, 0x0C, 0xEE, 0x02, 0x99, 0x06, 0x4B, 0x06, 0xF4, 0x0B, + 0xAA, 0x0C, 0xA9, 0x02, 0x18, 0x07, 0xA1, 0xF8, 0xEE, 0x0D, 0x9B, 0x0E, + 0xC1, 0x16, 0x91, 0x1F, 0xD4, 0x0C, 0x3D, 0x13, 0x73, 0x11, 0x35, 0x0C, + 0x10, 0x20, 0xD6, 0x16, 0x4A, 0x1F, 0x7E, 0x22, 0x24, 0x1A, 0xE0, 0x1B, + 0x8E, 0x17, 0x9F, 0x08, 0xE1, 0x22, 0x15, 0x03, 0x1E, 0x37, 0x89, 0x12, + 0x70, 0x32, 0xAA, 0x23, 0xB2, 0x21, 0x22, 0x21, 0x54, 0x2C, 0x03, 0x20, + 0xBF, 0x2D, 0xFD, 0x1C, 0x11, 0x1E, 0xBC, 0x19, 0xF7, 0x25, 0x0D, 0x26, + 0x7E, 0x16, 0xDE, 0x19, 0xC2, 0xEC, 0xBB, 0xFE, 0x33, 0xFA, 0x8D, 0x0E, + 0xF8, 0x1B, 0xF0, 0x28, 0xB5, 0x0B, 0xEB, 0x11, 0x96, 0xFA, 0xE8, 0xF6, + 0xDB, 0x0C, 0x61, 0x03, 0xA7, 0x09, 0x2F, 0x08, 0x76, 0xEC, 0x97, 0x03, + 0x60, 0xF4, 0xFC, 0x0B, 0x64, 0xFD, 0x8F, 0xFC, 0x4B, 0xDE, 0x74, 0xE1, + 0x4A, 0xDB, 0xC8, 0xEB, 0x5A, 0xEE, 0xBA, 0xF8, 0xD8, 0xD3, 0xED, 0xE3, + 0x60, 0xBB, 0xB4, 0xCF, 0xAE, 0xD8, 0x89, 0xDB, 0x9D, 0xEF, 0xF9, 0xE8, + 0xDA, 0xDA, 0xBD, 0xDA, 0x99, 0xCC, 0x7E, 0xCC, 0xE4, 0xD2, 0xC5, 0xD2, + 0xC5, 0xD8, 0xF1, 0xDE, 0xA0, 0xEA, 0x0D, 0xE5, 0xAB, 0xFA, 0x4C, 0xE3, + 0x2C, 0xEB, 0x99, 0xDC, 0xD1, 0xC9, 0x64, 0xE1, 0xBF, 0xCE, 0x6B, 0xFC, + 0xBA, 0xEF, 0x34, 0x04, 0xDD, 0xE8, 0xF9, 0xE6, 0xB0, 0xDB, 0x25, 0xDA, + 0x6D, 0xF2, 0x8A, 0xF1, 0x7B, 0xF5, 0x9B, 0x06, 0xA9, 0xE5, 0x35, 0x08, + 0xE2, 0xE9, 0xDC, 0xF9, 0x29, 0xF2, 0xDA, 0xEB, 0x86, 0xEC, 0xB6, 0xEB, + 0x91, 0xF7, 0xCF, 0xED, 0x13, 0x05, 0xD0, 0xF0, 0x99, 0xEF, 0x75, 0xF0, + 0x2F, 0xED, 0x1B, 0xF6, 0xB5, 0x0B, 0x16, 0x03, 0x51, 0x11, 0x7F, 0xFD, + 0x94, 0xF3, 0xAB, 0xEA, 0x86, 0xEF, 0x6C, 0xF0, 0xF4, 0x07, 0xAE, 0x02, + 0x8A, 0x09, 0x94, 0x01, 0x3E, 0xFF, 0x9B, 0xF6, 0x82, 0xF9, 0x4B, 0xE7, + 0x29, 0xF3, 0xB6, 0xE1, 0x35, 0xEE, 0x55, 0xEB, 0x67, 0x02, 0x38, 0xF3, + 0xF8, 0x13, 0x7F, 0xF1, 0xBA, 0xFD, 0x43, 0xDE, 0x70, 0xFE, 0x91, 0xD1, + 0x09, 0x1B, 0xD2, 0xF1, 0x75, 0x02, 0x61, 0x0A, 0xAF, 0xCE, 0x5E, 0xF8, + 0x9B, 0xCC, 0xD3, 0xF3, 0xB5, 0xF9, 0x99, 0xFE, 0xDD, 0x17, 0xDE, 0xF2, + 0x6C, 0x0F, 0xCB, 0xEC, 0x3E, 0xF9, 0x69, 0xEF, 0x67, 0xED, 0xCE, 0xE4, + 0xF6, 0xF0, 0x12, 0xEC, 0x2C, 0xF9, 0xD7, 0x06, 0x93, 0xF9, 0x32, 0x0B, + 0x28, 0xEB, 0x96, 0xF5, 0x3B, 0xE9, 0x1B, 0xEB, 0xBC, 0xF7, 0x53, 0xF7, + 0x67, 0xF3, 0xA8, 0x01, 0x1E, 0xE7, 0x94, 0xF6, 0xF1, 0xF4, 0x98, 0xF8, + 0xE7, 0x05, 0x00, 0x10, 0xD7, 0x0C, 0xB9, 0x1D, 0x20, 0x01, 0x15, 0x1C, + 0xB6, 0xF1, 0xF3, 0x0B, 0x45, 0xF6, 0x87, 0xFC, 0xDE, 0xFE, 0x54, 0x0C, + 0x0E, 0x02, 0xC3, 0x1F, 0x0F, 0x10, 0xC8, 0x1D, 0xE1, 0x24, 0x14, 0x1F, + 0xE0, 0x31, 0x4B, 0x2B, 0x60, 0x3C, 0xCF, 0x3B, 0x9B, 0x36, 0x54, 0x3F, + 0xBA, 0x28, 0x1C, 0x33, 0x3F, 0x2A, 0x72, 0x2D, 0xF6, 0x27, 0x45, 0x31, + 0xF0, 0x26, 0x7B, 0x36, 0xA0, 0x35, 0x03, 0x33, 0xE8, 0x3B, 0x79, 0x18, + 0x43, 0x3B, 0x1E, 0x0A, 0x69, 0x31, 0xCD, 0x1D, 0x79, 0x2E, 0xB1, 0x37, + 0x36, 0x38, 0xA4, 0x39, 0xDF, 0x33, 0x86, 0x30, 0x17, 0x2D, 0x13, 0x31, + 0x55, 0x3B, 0x67, 0x37, 0x60, 0x40, 0x44, 0x3A, 0xED, 0x36, 0x60, 0x2C, + 0xAC, 0x37, 0x13, 0x21, 0x6E, 0x2A, 0x36, 0x20, 0xB3, 0x1D, 0x3B, 0x20, + 0xD5, 0x2B, 0xC1, 0x23, 0x05, 0x24, 0xAC, 0x13, 0x4F, 0x07, 0x1C, 0x03, + 0xCE, 0x0B, 0x07, 0x15, 0xF0, 0x1B, 0xE5, 0x24, 0x2C, 0x0C, 0xCF, 0x15, + 0x09, 0x05, 0x0F, 0x0D, 0xDD, 0x1B, 0x2B, 0x1B, 0xE3, 0x18, 0xE5, 0x1A, + 0xC7, 0x04, 0xE0, 0x12, 0xF5, 0x06, 0xED, 0x11, 0x43, 0x06, 0x1D, 0x0B, + 0x3E, 0xF1, 0x73, 0x05, 0x4D, 0xFD, 0x06, 0x0A, 0x2F, 0x18, 0xDE, 0x07, + 0x75, 0xF1, 0x9F, 0xEF, 0xF7, 0xC7, 0x33, 0xE5, 0xDE, 0xE2, 0x46, 0xFD, + 0x8C, 0x02, 0xBE, 0x06, 0x54, 0xFB, 0x31, 0xF5, 0x64, 0xF4, 0x42, 0xF5, + 0x3F, 0xF7, 0xAC, 0x02, 0x6E, 0xF6, 0xAA, 0x08, 0xA8, 0xFE, 0xF6, 0x09, + 0x8A, 0x0A, 0x3A, 0xFB, 0xF1, 0x00, 0xE1, 0xDC, 0x3B, 0xF4, 0x65, 0xD5, + 0x1A, 0x05, 0x35, 0xED, 0x9F, 0x14, 0x25, 0xF5, 0x7B, 0x02, 0x22, 0xE8, + 0xFD, 0xFC, 0x5A, 0xE8, 0x89, 0x17, 0x57, 0xF4, 0x8D, 0x16, 0x56, 0xFB, + 0xD4, 0xFC, 0xF4, 0xFB, 0x46, 0xF0, 0x97, 0xF9, 0x3B, 0xF5, 0x2C, 0x00, + 0xDA, 0xFC, 0x77, 0x0E, 0x54, 0x01, 0x3C, 0x0D, 0xD1, 0xFA, 0xEE, 0xF3, + 0x5B, 0xE7, 0xAE, 0xDC, 0xB6, 0xE4, 0x12, 0xE7, 0x70, 0xED, 0x37, 0xFF, + 0x38, 0xEB, 0x35, 0xFD, 0x25, 0xE0, 0x2F, 0xE8, 0xAE, 0xE8, 0xDB, 0xE5, + 0xD0, 0xFB, 0xA6, 0xF5, 0xFA, 0xE7, 0x7E, 0xFE, 0x97, 0xCC, 0x5C, 0xFA, + 0x10, 0xD9, 0xDA, 0xEF, 0x3B, 0xEB, 0xA4, 0xE4, 0xFF, 0xE8, 0x20, 0xE1, + 0xB5, 0xE6, 0xF7, 0xE9, 0x91, 0xD9, 0xC6, 0xE6, 0x70, 0xBA, 0x1D, 0xCF, + 0xAE, 0xC6, 0xC6, 0xC9, 0x2D, 0xF0, 0x81, 0xD9, 0x03, 0xEF, 0x28, 0xD6, + 0x03, 0xD6, 0x78, 0xC8, 0x9C, 0xD3, 0xDE, 0xD5, 0x00, 0xDF, 0x02, 0xEB, + 0xFF, 0xD8, 0x08, 0xEF, 0x49, 0xD4, 0x9E, 0xEE, 0x11, 0xE9, 0xB8, 0xE9, + 0xD5, 0xE6, 0xCD, 0xD8, 0xC8, 0xCD, 0x73, 0xD2, 0x72, 0xD4, 0xEE, 0xE2, + 0x4D, 0xD9, 0xA1, 0xE6, 0x08, 0xC6, 0x1D, 0xD4, 0x3B, 0xCD, 0xCE, 0xCC, + 0xF7, 0xE6, 0x3D, 0xDC, 0xE2, 0xD5, 0x6E, 0xDC, 0x49, 0xC3, 0xA8, 0xD2, + 0x5A, 0xDC, 0xAE, 0xD9, 0x86, 0xE0, 0xE8, 0xDB, 0x39, 0xCE, 0x04, 0xE1, + 0xCD, 0xD6, 0xCA, 0xF5, 0x71, 0xE0, 0x88, 0xF4, 0x02, 0xE6, 0xC3, 0xE8, + 0x5C, 0xF7, 0xD2, 0xF5, 0x96, 0x04, 0xBD, 0xF7, 0x5E, 0xFF, 0xE0, 0xE1, + 0xAF, 0xF6, 0xDA, 0xE0, 0x5F, 0xFD, 0xCF, 0xF6, 0xE6, 0xF7, 0x46, 0xFC, + 0x81, 0xFA, 0x76, 0xF8, 0xB9, 0x0D, 0x5A, 0xE8, 0xB2, 0x0B, 0x68, 0xCC, + 0x5F, 0x02, 0x82, 0xD2, 0x85, 0x05, 0x77, 0xF7, 0xD8, 0x06, 0x3B, 0x0B, + 0x7B, 0x00, 0xA4, 0x04, 0x53, 0xFF, 0xD2, 0x00, 0xF3, 0x08, 0x6D, 0x06, + 0x4E, 0x1A, 0xAF, 0x07, 0xDE, 0x1D, 0x62, 0xFB, 0xCF, 0x12, 0xC2, 0xF1, + 0xDC, 0x0E, 0x63, 0xFC, 0x41, 0x12, 0x66, 0x0A, 0x22, 0x0F, 0xCD, 0x0F, + 0x8C, 0x0B, 0x35, 0x12, 0xE6, 0x06, 0xA3, 0x0E, 0xD1, 0xF6, 0xC5, 0x06, + 0x38, 0x02, 0x96, 0x11, 0x91, 0x12, 0x3B, 0x19, 0xBE, 0xF1, 0x4F, 0x00, + 0x72, 0xE0, 0x0C, 0xFA, 0x4F, 0x08, 0x17, 0x1D, 0x62, 0x22, 0x5B, 0x22, + 0x87, 0x08, 0xCE, 0x03, 0xC1, 0xF8, 0xE3, 0x08, 0x44, 0x02, 0x15, 0x1C, + 0x48, 0xFB, 0xEF, 0x0F, 0x8C, 0xFE, 0xAC, 0x0C, 0xA3, 0x05, 0xF8, 0x11, + 0x9D, 0xF7, 0xBE, 0x01, 0x73, 0x01, 0x65, 0x06, 0x93, 0x24, 0x77, 0x22, + 0x3E, 0x23, 0xE2, 0x1F, 0xCB, 0xF7, 0xE9, 0x0A, 0x34, 0xE8, 0xA6, 0x0E, + 0x8E, 0x06, 0x83, 0x1D, 0x37, 0x20, 0x1B, 0x1C, 0x0B, 0x20, 0x9C, 0x0C, + 0x83, 0x1D, 0x98, 0xFE, 0x87, 0x24, 0xDF, 0xF9, 0x20, 0x25, 0x92, 0xFD, + 0x9B, 0x1A, 0xCA, 0x0C, 0xCC, 0x0E, 0x0F, 0x1B, 0x09, 0x09, 0x1F, 0x1B, + 0x9C, 0x1A, 0x2A, 0x25, 0x61, 0x2D, 0x3B, 0x2C, 0x14, 0x24, 0x06, 0x1D, + 0x6F, 0x18, 0x88, 0x18, 0x7F, 0x20, 0xF7, 0x1F, 0xD1, 0x2B, 0xAD, 0x1E, + 0x68, 0x2F, 0x37, 0x28, 0x57, 0x2D, 0xC2, 0x31, 0x23, 0x2A, 0x96, 0x1F, + 0xD0, 0x2D, 0x94, 0x15, 0x95, 0x25, 0x1C, 0x1F, 0xA8, 0x0F, 0x88, 0x1F, + 0x67, 0x0C, 0x88, 0x19, 0x2C, 0x20, 0x7A, 0x18, 0x10, 0x30, 0x26, 0x1E, + 0x23, 0x2B, 0xBE, 0x2B, 0x52, 0x16, 0x73, 0x2F, 0x83, 0x08, 0x3A, 0x26, + 0x34, 0x16, 0xDE, 0x24, 0xDF, 0x29, 0xF5, 0x29, 0x0D, 0x23, 0x84, 0x2E, + 0xF9, 0x0C, 0x47, 0x28, 0x38, 0x03, 0xE8, 0x15, 0x9A, 0x03, 0xDB, 0x0B, + 0x68, 0x02, 0x1B, 0x0F, 0x76, 0x09, 0xA5, 0x12, 0xBA, 0x05, 0xA6, 0x06, + 0xD0, 0xF6, 0x25, 0x00, 0x4C, 0x02, 0x6F, 0x12, 0xCB, 0x10, 0x2C, 0x20, + 0x0F, 0x01, 0xBB, 0x08, 0xBD, 0xF2, 0xCA, 0xEB, 0x64, 0xF8, 0x4B, 0xE9, + 0x0A, 0xF9, 0xF3, 0xE4, 0x18, 0xFA, 0x0B, 0xE8, 0x49, 0x0C, 0x90, 0xF8, + 0xA2, 0x0D, 0xB4, 0xED, 0x6B, 0x00, 0xAB, 0xDD, 0xA2, 0x07, 0x71, 0xE8, + 0xC7, 0x00, 0x0D, 0xE2, 0x6F, 0xE2, 0x9A, 0xCB, 0xEF, 0xCD, 0xCE, 0xCB, + 0x7D, 0xD7, 0x8F, 0xD9, 0xAF, 0xEF, 0x19, 0xE1, 0x5D, 0xFB, 0x33, 0xE5, + 0xB1, 0xF1, 0x25, 0xDC, 0x3A, 0xE1, 0xDE, 0xD7, 0xCF, 0xE2, 0x04, 0xEA, + 0x1A, 0xEA, 0xE0, 0xEC, 0x71, 0xEC, 0xEE, 0xDC, 0xB2, 0xEC, 0x58, 0xD3, + 0x4F, 0xE2, 0x7F, 0xDF, 0x66, 0xD9, 0x0E, 0xF9, 0x32, 0xE9, 0x43, 0x07, + 0xB7, 0xF5, 0x34, 0xFE, 0xEF, 0xF6, 0xC5, 0xF1, 0x0B, 0xFC, 0x4B, 0xF3, + 0x84, 0xF9, 0x8C, 0x01, 0x95, 0xF8, 0x2A, 0x13, 0x73, 0xF6, 0xDF, 0x0D, + 0x04, 0xF7, 0x41, 0x01, 0xDA, 0x01, 0x5E, 0x03, 0x0D, 0x14, 0xC7, 0x04, + 0xAC, 0x23, 0x85, 0x03, 0x1F, 0x19, 0xA5, 0x0C, 0xAB, 0x06, 0x20, 0x1F, + 0xEE, 0x0D, 0xBB, 0x30, 0x3D, 0x22, 0x34, 0x2E, 0xFA, 0x1D, 0x88, 0x1A, + 0x09, 0x13, 0xC2, 0x1E, 0x25, 0x1C, 0xCC, 0x31, 0x51, 0x1C, 0x9F, 0x34, + 0xD8, 0x1D, 0xD6, 0x37, 0x58, 0x28, 0x97, 0x3A, 0xDB, 0x18, 0xCC, 0x2F, + 0xB7, 0x0B, 0xDD, 0x2B, 0x8B, 0x23, 0x98, 0x37, 0xA1, 0x22, 0xF0, 0x29, + 0x43, 0x01, 0x27, 0x0B, 0xC0, 0x08, 0xCF, 0x0B, 0xAA, 0x28, 0x62, 0x1A, + 0x85, 0x1D, 0xF3, 0x0E, 0x4A, 0xF6, 0x44, 0x04, 0x42, 0xFA, 0x0B, 0x19, + 0x56, 0x1A, 0xBA, 0x1C, 0x66, 0x23, 0xDC, 0x02, 0x66, 0x17, 0xD6, 0xF7, + 0xEB, 0xFF, 0xA5, 0xF5, 0xD3, 0xE5, 0x74, 0xEB, 0x04, 0xEB, 0xE6, 0xF5, + 0xB2, 0x06, 0x4A, 0x02, 0xE7, 0x01, 0x8A, 0xEB, 0x30, 0xE5, 0xD6, 0xC8, + 0x9E, 0xEC, 0x66, 0xC5, 0x0E, 0xFC, 0x11, 0xD3, 0x0E, 0xE1, 0x19, 0xD3, + 0xB4, 0xC1, 0x45, 0xD1, 0xD4, 0xC9, 0x27, 0xD8, 0x52, 0xE7, 0x4D, 0xE2, + 0x1A, 0xEA, 0x20, 0xE8, 0xD8, 0xD7, 0x7C, 0xE1, 0x3D, 0xDA, 0x70, 0xD4, + 0x27, 0xE7, 0x63, 0xD0, 0x66, 0xE3, 0xD7, 0xD4, 0x67, 0xE2, 0x80, 0xDD, + 0xDD, 0xE0, 0xB8, 0xE0, 0xDA, 0xD4, 0x5B, 0xD9, 0xF2, 0xE3, 0xC9, 0xD8, + 0xD1, 0xF6, 0xA4, 0xE7, 0xED, 0xE4, 0xB4, 0xF0, 0xB4, 0xD2, 0x68, 0xE7, + 0x49, 0xE4, 0x38, 0xE2, 0xC0, 0xF1, 0xEE, 0xE6, 0xB6, 0xF1, 0xCF, 0xF3, + 0x7A, 0xF8, 0x69, 0xFA, 0x38, 0xF7, 0xAC, 0xEB, 0x43, 0xF4, 0x2D, 0xE9, + 0xF0, 0xEC, 0x08, 0xFA, 0xCE, 0xDF, 0x3B, 0x00, 0x46, 0xD6, 0x45, 0xF2, + 0xDC, 0xDD, 0x59, 0xEB, 0x01, 0xF5, 0x5B, 0xF0, 0xF2, 0x02, 0x56, 0xF0, + 0x4D, 0x01, 0x18, 0xF7, 0x08, 0x07, 0x29, 0x09, 0x6B, 0x03, 0x41, 0x11, + 0x37, 0xF0, 0xFB, 0x10, 0x9C, 0xF6, 0x2D, 0x1C, 0x3D, 0x01, 0x18, 0x16, + 0x3C, 0xFC, 0xB8, 0xF7, 0x02, 0x05, 0x0E, 0xF3, 0x5C, 0x0A, 0x3A, 0xFF, + 0x50, 0xF7, 0x97, 0xEB, 0x99, 0xEC, 0xF8, 0xD4, 0xF3, 0xF5, 0x4B, 0xEA, + 0x87, 0xF9, 0xA9, 0x06, 0x24, 0x01, 0xF7, 0x0A, 0x5C, 0x02, 0x04, 0x02, + 0xCF, 0xFF, 0x5F, 0xFB, 0x91, 0x02, 0xBE, 0xF2, 0xDB, 0xF3, 0x49, 0xEC, + 0xFF, 0xF1, 0xB2, 0xF0, 0x0B, 0x04, 0x4F, 0xEC, 0x21, 0xFD, 0xA0, 0xDA, + 0x8A, 0xF1, 0x2D, 0xD8, 0x6F, 0xFA, 0xBC, 0xEF, 0x2C, 0xF3, 0x44, 0xF9, + 0x81, 0xE7, 0xDF, 0xF0, 0x65, 0xF5, 0x25, 0xFA, 0x94, 0xFF, 0x26, 0x02, + 0xA9, 0xFE, 0x73, 0x01, 0x58, 0x07, 0x17, 0x11, 0x3E, 0x0C, 0x16, 0x14, + 0x47, 0x0A, 0xD0, 0x05, 0xD8, 0x0B, 0xE4, 0x12, 0x0C, 0x0D, 0xD1, 0x2D, + 0x10, 0x0F, 0x33, 0x2C, 0x4F, 0x0D, 0x78, 0x20, 0x90, 0x0B, 0x41, 0x19, + 0x08, 0x0E, 0xE6, 0x0F, 0xE7, 0x0E, 0x33, 0x16, 0xFB, 0x15, 0xD5, 0x1F, + 0x35, 0x1E, 0xEE, 0x24, 0xF2, 0x1E, 0x32, 0x36, 0x1C, 0x2E, 0x3F, 0x4B, + 0x2B, 0x3F, 0x4B, 0x53, 0x27, 0x40, 0x09, 0x47, 0x0B, 0x41, 0xDD, 0x32, + 0xA5, 0x41, 0x72, 0x32, 0xF4, 0x35, 0x9B, 0x35, 0x7B, 0x2D, 0x02, 0x27, + 0x3F, 0x41, 0x9D, 0x28, 0xE7, 0x4E, 0x84, 0x32, 0xDE, 0x51, 0xB0, 0x2B, + 0x5E, 0x4E, 0xB8, 0x25, 0x96, 0x41, 0xCE, 0x2C, 0x4A, 0x34, 0xEE, 0x30, + 0x2E, 0x34, 0xA8, 0x36, 0xD0, 0x49, 0x16, 0x3D, 0xBB, 0x41, 0xE3, 0x25, + 0x01, 0x13, 0xB2, 0x0D, 0xC6, 0x16, 0x00, 0x2A, 0x70, 0x3A, 0x8C, 0x4A, + 0xCF, 0x27, 0x0C, 0x2B, 0xFA, 0x0A, 0x9B, 0xFE, 0xB6, 0x12, 0x7C, 0x06, + 0xBB, 0x0D, 0x26, 0x0E, 0x4D, 0x01, 0x37, 0x07, 0x28, 0x0C, 0x1A, 0x18, + 0x48, 0x07, 0xD3, 0x14, 0xD7, 0xF6, 0x7F, 0xF7, 0xF3, 0x05, 0x3A, 0xFC, + 0xDB, 0x08, 0x67, 0x05, 0x65, 0xE0, 0xB3, 0xEE, 0x9A, 0xCA, 0x2B, 0xE4, + 0xDC, 0xDE, 0xD4, 0xEE, 0x81, 0xF7, 0xFD, 0xEA, 0x98, 0xEC, 0x34, 0xD6, + 0xD9, 0xD9, 0x7B, 0xD1, 0x31, 0xE0, 0x29, 0xD6, 0x6F, 0xE9, 0xF9, 0xD7, + 0xC8, 0xEE, 0xE0, 0xE1, 0x3E, 0xED, 0xFD, 0xF1, 0xDF, 0xE8, 0x8E, 0xF5, + 0x9B, 0xF4, 0x66, 0xF1, 0x8D, 0x01, 0xDE, 0xFB, 0x0A, 0xF6, 0x45, 0x02, + 0x81, 0xE4, 0xD0, 0xFD, 0x09, 0xF6, 0x6D, 0x05, 0xA8, 0x0A, 0x4E, 0x04, + 0xC0, 0xF8, 0xFA, 0xF9, 0xC6, 0xE9, 0x46, 0x04, 0xEF, 0xEF, 0xB8, 0x11, + 0xFC, 0xFA, 0x78, 0x01, 0x75, 0x08, 0x83, 0xEB, 0x00, 0x06, 0x1E, 0xEF, + 0x72, 0xEA, 0xA3, 0xF0, 0xC9, 0xE1, 0x01, 0xF9, 0x03, 0x03, 0x78, 0x15, + 0x38, 0x12, 0x16, 0x1B, 0x36, 0xFB, 0xD8, 0x01, 0xFF, 0xFE, 0xDD, 0x00, + 0x39, 0x13, 0x41, 0x0F, 0xAD, 0x05, 0xD6, 0xFF, 0xC7, 0xED, 0xC3, 0xF3, + 0x68, 0xEA, 0x8C, 0xFC, 0x82, 0xF3, 0x8C, 0xF7, 0x08, 0xFA, 0x37, 0xE9, + 0x60, 0x11, 0xDF, 0xF4, 0xB2, 0x10, 0xEE, 0xEF, 0x4E, 0xEA, 0x9D, 0xCD, + 0xA4, 0xE4, 0x18, 0xD1, 0x88, 0xFA, 0xF1, 0xF5, 0xA1, 0xEF, 0x92, 0xF8, + 0x0A, 0xD7, 0x59, 0xDE, 0x9E, 0xE2, 0x7A, 0xD8, 0x64, 0xF1, 0x54, 0xE1, + 0x00, 0xE5, 0x0D, 0xDD, 0xE6, 0xD7, 0x68, 0xD0, 0x4B, 0xDB, 0x91, 0xCA, + 0x1D, 0xD9, 0x45, 0xC2, 0x97, 0xCC, 0x69, 0xBD, 0x3E, 0xD0, 0xAF, 0xCE, + 0x44, 0xDA, 0xD8, 0xD6, 0x02, 0xC8, 0xE5, 0xB6, 0x70, 0xB7, 0x8A, 0xAF, + 0x13, 0xBE, 0xB6, 0xCF, 0x9D, 0xB8, 0xF9, 0xD2, 0xD2, 0xB7, 0xA7, 0xCF, + 0x95, 0xCE, 0x2F, 0xDE, 0x2A, 0xCA, 0xED, 0xD1, 0x73, 0xBC, 0xF0, 0xC6, + 0x2A, 0xC5, 0x74, 0xD2, 0x0B, 0xC4, 0xFD, 0xD6, 0xD4, 0xB8, 0xDF, 0xD3, + 0xD9, 0xB9, 0x1C, 0xD8, 0x33, 0xC3, 0xC0, 0xDA, 0xB8, 0xD0, 0x37, 0xD7, + 0xB3, 0xE6, 0xDE, 0xDF, 0x28, 0xEC, 0x70, 0xF1, 0xD8, 0xE6, 0xA1, 0x00, + 0x57, 0xEF, 0x31, 0x05, 0xA4, 0xEF, 0x3F, 0x0C, 0x46, 0xEA, 0x8C, 0x16, + 0x16, 0xF2, 0x3A, 0x0A, 0x61, 0xF9, 0x9E, 0xF9, 0xCC, 0x01, 0x65, 0xF1, + 0x87, 0x0D, 0xAD, 0xE5, 0x51, 0x12, 0xAF, 0xE8, 0xC3, 0x10, 0x45, 0xF8, + 0xCA, 0x15, 0x1A, 0x04, 0xD9, 0x1B, 0x6D, 0x08, 0x60, 0x15, 0x00, 0x06, + 0x86, 0x08, 0x64, 0x05, 0x7B, 0x06, 0x57, 0x14, 0xFD, 0x13, 0xA9, 0x1D, + 0x41, 0x28, 0x89, 0x1C, 0x09, 0x27, 0xF8, 0x10, 0x95, 0x1F, 0x44, 0x04, + 0x31, 0x24, 0xF1, 0x13, 0xD4, 0x16, 0xE3, 0x11, 0x61, 0x03, 0xC5, 0xF0, + 0xFB, 0x08, 0x7A, 0xF5, 0x33, 0x1F, 0xFA, 0x1D, 0x59, 0x13, 0x73, 0x17, + 0x84, 0xFA, 0xE8, 0xFD, 0xEE, 0x04, 0x07, 0x09, 0x62, 0x0D, 0xBA, 0x0D, + 0x12, 0x0D, 0xC0, 0x14, 0xE6, 0x22, 0xEE, 0x2C, 0xC1, 0x26, 0x6D, 0x28, + 0x6E, 0xFA, 0x92, 0x0E, 0x38, 0xEE, 0x90, 0x0F, 0xCE, 0x0B, 0x3C, 0x22, + 0xB4, 0x08, 0x69, 0x0E, 0xD7, 0xEF, 0xBC, 0xE2, 0xD7, 0xF3, 0x2F, 0xE6, + 0x4B, 0x03, 0x26, 0x02, 0xC2, 0xFB, 0x66, 0x07, 0x7A, 0xF4, 0x7F, 0x07, + 0x6B, 0xF7, 0x78, 0x11, 0x3D, 0xFC, 0x17, 0x12, 0x0E, 0x06, 0xE4, 0x0D, + 0x9E, 0x13, 0x40, 0x1F, 0x04, 0x15, 0xF1, 0x2B, 0xBE, 0xFF, 0x30, 0x1F, + 0x64, 0x0B, 0xFB, 0x12, 0x14, 0x30, 0xF3, 0x08, 0xD5, 0x2C, 0x43, 0xFC, + 0xD6, 0x23, 0xB2, 0x01, 0x5A, 0x2A, 0x07, 0x19, 0x92, 0x27, 0x76, 0x1D, + 0xFD, 0x23, 0x3E, 0x10, 0x73, 0x2F, 0x82, 0x18, 0xA4, 0x37, 0x43, 0x23, + 0x22, 0x32, 0xE4, 0x22, 0xB8, 0x31, 0xF2, 0x2B, 0xE9, 0x2C, 0xC7, 0x2F, + 0x89, 0x23, 0x37, 0x29, 0x84, 0x29, 0xE6, 0x1D, 0xDF, 0x36, 0x2B, 0x11, + 0x33, 0x2F, 0x29, 0x09, 0xC1, 0x14, 0x86, 0x0D, 0x69, 0x1B, 0xE9, 0x23, + 0xA5, 0x30, 0x51, 0x30, 0xA4, 0x24, 0x4E, 0x24, 0x25, 0x17, 0x90, 0x18, + 0xAE, 0x16, 0x5C, 0x1B, 0xE6, 0x09, 0xF0, 0x1B, 0x4A, 0x0E, 0x3B, 0x27, + 0x7A, 0x16, 0xE9, 0x34, 0xB9, 0xF4, 0x48, 0x15, 0x24, 0xE3, 0x91, 0xF1, + 0x14, 0x08, 0xCF, 0xFE, 0x14, 0x1A, 0x2B, 0x09, 0xC1, 0xF6, 0x73, 0xEF, + 0x05, 0xEB, 0x9C, 0xEB, 0x5A, 0x08, 0xC9, 0xFB, 0xFB, 0x12, 0xDE, 0xFF, + 0x77, 0xFE, 0xB2, 0x03, 0x0B, 0xF2, 0xE3, 0x0F, 0x76, 0xF4, 0x0F, 0x0F, + 0x9B, 0xF1, 0x0D, 0xF7, 0x38, 0xFD, 0x39, 0xF9, 0x2F, 0xFC, 0xDA, 0x07, + 0x45, 0xD2, 0x30, 0xF6, 0xE7, 0xC6, 0xEF, 0xEA, 0x3D, 0xE7, 0xB2, 0xF7, + 0x03, 0xED, 0x01, 0xF0, 0x2B, 0xE5, 0xCB, 0xD5, 0xC4, 0xED, 0x94, 0xD8, + 0xD4, 0xEC, 0x66, 0xE1, 0xDA, 0xDE, 0xA8, 0xDB, 0xC0, 0xD9, 0x78, 0xE9, + 0x5D, 0xE2, 0xBC, 0xF8, 0x3F, 0xEE, 0x6A, 0xEF, 0xB0, 0x04, 0x59, 0xED, + 0xCF, 0x06, 0xB1, 0xF2, 0x74, 0xF7, 0xEF, 0xED, 0x87, 0xFC, 0x6E, 0xF2, + 0xB4, 0x07, 0xD8, 0x06, 0x1C, 0x00, 0xC8, 0x0A, 0x1A, 0xF2, 0x11, 0x00, + 0xE8, 0x01, 0x4D, 0xFB, 0x6C, 0x1B, 0x45, 0xF1, 0xB0, 0x15, 0xA3, 0xE8, + 0x80, 0x0E, 0xA8, 0xF3, 0xD1, 0x0B, 0x39, 0x01, 0xB6, 0x03, 0x9A, 0x0B, + 0xEE, 0x0E, 0x29, 0x1A, 0xE4, 0x1A, 0x7A, 0x1E, 0x47, 0x11, 0xAC, 0x17, + 0x12, 0x03, 0x67, 0x0B, 0x07, 0x11, 0xE8, 0x0E, 0x66, 0x22, 0x47, 0x16, + 0x13, 0x12, 0xE4, 0x0D, 0x40, 0x09, 0x39, 0x0A, 0x79, 0x1D, 0x39, 0x10, + 0xA8, 0x24, 0x0F, 0x09, 0x65, 0x20, 0x35, 0x0D, 0x80, 0x1F, 0xDA, 0x22, + 0x64, 0x11, 0xFF, 0x1E, 0x81, 0xF2, 0xFC, 0x0D, 0xB0, 0xF6, 0x18, 0x17, + 0x2A, 0x1D, 0xEA, 0x26, 0x7B, 0x0E, 0xBC, 0x11, 0xB6, 0xF9, 0x09, 0xF9, + 0x80, 0x17, 0x77, 0x09, 0x2E, 0x17, 0x00, 0x1B, 0xC1, 0xF4, 0xFE, 0x0B, + 0xD7, 0xEE, 0x45, 0x03, 0x7C, 0xF2, 0xFA, 0x05, 0x62, 0xE0, 0x8D, 0xEB, + 0xAA, 0xE6, 0x89, 0xDE, 0xAF, 0xFD, 0xBA, 0xF6, 0x35, 0xF8, 0x61, 0xF9, + 0x0A, 0xEC, 0x23, 0xEA, 0x20, 0xE7, 0x37, 0xF5, 0x08, 0xE5, 0xC7, 0x0F, + 0xC0, 0xE7, 0xAD, 0x18, 0x0E, 0xED, 0x3E, 0x0B, 0xCD, 0xEE, 0x4C, 0xFC, + 0x96, 0xE2, 0xEE, 0xF0, 0x34, 0xD6, 0xB6, 0xE1, 0x27, 0xE9, 0xCC, 0xE5, + 0xF7, 0xF8, 0xCE, 0xEB, 0x0A, 0xF0, 0xE7, 0xDC, 0xFA, 0xED, 0x45, 0xDB, + 0x93, 0xE8, 0x73, 0xEA, 0x81, 0xE2, 0x0F, 0xF0, 0xA2, 0xE7, 0x99, 0xEE, + 0x8B, 0xE8, 0xA2, 0xEF, 0x5E, 0xEE, 0x4D, 0xED, 0x89, 0xFF, 0x73, 0xEA, + 0xAC, 0x06, 0x42, 0xE9, 0xA2, 0x01, 0xD6, 0xE4, 0x0D, 0xF6, 0x96, 0xDD, + 0x41, 0xF3, 0xCE, 0xD9, 0x72, 0xFD, 0x53, 0xDE, 0x0C, 0xFE, 0x37, 0xE8, + 0x48, 0xF0, 0xFE, 0xE5, 0xBD, 0xF1, 0x8E, 0xE7, 0x14, 0xF8, 0xC1, 0xEE, + 0x59, 0xF7, 0x65, 0xED, 0x44, 0xFE, 0x80, 0xF4, 0xF9, 0xFF, 0xB6, 0xFC, + 0x88, 0xFB, 0x00, 0xF4, 0x4A, 0xF6, 0x94, 0xEA, 0xB2, 0xF3, 0x15, 0xF7, + 0x43, 0xE9, 0xF2, 0xFC, 0xBE, 0xE9, 0x95, 0xF5, 0x55, 0xEE, 0x79, 0xEB, + 0xDC, 0xDE, 0xB5, 0xDA, 0x4C, 0xD7, 0x23, 0xDF, 0x07, 0xE8, 0x27, 0x05, + 0x99, 0xEC, 0xDA, 0x08, 0xA0, 0xDC, 0xA0, 0xE6, 0x2F, 0xE4, 0x7B, 0xEC, + 0x08, 0xF0, 0x00, 0x05, 0xD4, 0xE5, 0x77, 0x06, 0x27, 0xE2, 0xF9, 0x05, + 0x29, 0xF2, 0x63, 0x0E, 0xDB, 0xEE, 0xDF, 0xF2, 0xD2, 0xEE, 0x88, 0xD4, + 0x42, 0x0B, 0x6D, 0xE6, 0x11, 0x0E, 0xE5, 0xF1, 0x60, 0xF1, 0xB0, 0xD7, + 0x3C, 0xEB, 0x60, 0xCD, 0xF8, 0x04, 0xAF, 0xE0, 0x78, 0x07, 0x36, 0xE3, + 0x4C, 0xFE, 0xFD, 0xE9, 0xC1, 0xFC, 0x3A, 0x02, 0xFB, 0xF1, 0x36, 0x05, + 0x70, 0xFE, 0x34, 0xF7, 0x83, 0x1B, 0xA5, 0x02, 0x65, 0x0F, 0x50, 0x0C, + 0xA3, 0xFA, 0x0B, 0x02, 0xF0, 0x08, 0x7A, 0x07, 0xCF, 0x10, 0xF1, 0x12, + 0x1A, 0x0A, 0xD9, 0x17, 0x47, 0x0C, 0x19, 0x13, 0x6D, 0x17, 0x72, 0x12, + 0x93, 0x15, 0x9F, 0x11, 0x3F, 0x0E, 0xB1, 0x0E, 0x3A, 0x08, 0x85, 0x16, + 0x3F, 0xFF, 0xF2, 0x1E, 0xA8, 0x06, 0xD2, 0x1F, 0xFD, 0x16, 0x02, 0x17, + 0x41, 0x11, 0xF5, 0x11, 0xD6, 0x07, 0x79, 0x19, 0x04, 0x15, 0x54, 0x18, + 0x25, 0x31, 0x09, 0x1C, 0xB7, 0x35, 0x85, 0x1D, 0x88, 0x20, 0x1B, 0x10, + 0x41, 0x21, 0xA9, 0x1F, 0xAD, 0x37, 0xF6, 0x42, 0xB5, 0x3F, 0x9D, 0x44, + 0x14, 0x34, 0x22, 0x2F, 0x5F, 0x2C, 0xBD, 0x26, 0x6B, 0x2E, 0xAD, 0x2A, + 0xB7, 0x2E, 0x3E, 0x3B, 0xFF, 0x21, 0xBA, 0x42, 0x68, 0x12, 0x8B, 0x36, + 0x7E, 0x12, 0x13, 0x2D, 0x48, 0x32, 0x79, 0x36, 0x68, 0x41, 0x0A, 0x37, + 0x24, 0x1A, 0xF5, 0x1C, 0xC0, 0x02, 0xA2, 0x11, 0x53, 0x1B, 0x35, 0x27, + 0x75, 0x30, 0xC5, 0x39, 0x9F, 0x27, 0xF2, 0x2F, 0xDB, 0x22, 0xD6, 0x2A, + 0x97, 0x18, 0x17, 0x1A, 0xD2, 0x0F, 0xC8, 0xFF, 0x00, 0x1F, 0x42, 0x0A, + 0x26, 0x10, 0x92, 0x1A, 0xAB, 0xE8, 0x67, 0x0D, 0x0E, 0xEB, 0x62, 0x02, + 0x09, 0x11, 0xFA, 0x0A, 0x40, 0x17, 0xF5, 0x00, 0x59, 0x0F, 0xC5, 0xF0, + 0x2E, 0x16, 0x88, 0xF1, 0x05, 0x11, 0x60, 0xF6, 0xE5, 0x03, 0x6A, 0xEF, + 0x9A, 0x00, 0xF2, 0xEC, 0xF1, 0x04, 0xF8, 0xFC, 0x20, 0x02, 0x54, 0xFB, + 0xFF, 0x00, 0x8C, 0xEC, 0xEC, 0x01, 0xB0, 0xF1, 0x28, 0xF6, 0xD2, 0xFD, + 0x32, 0xF2, 0x8B, 0xFA, 0x2D, 0xFE, 0xA5, 0xF9, 0x35, 0x02, 0x7E, 0xFC, + 0xF0, 0xF8, 0x5F, 0xEF, 0xCA, 0x03, 0xEC, 0xE6, 0x64, 0x1D, 0x13, 0xF1, + 0x9D, 0x11, 0x7B, 0xFA, 0x8E, 0xEF, 0x21, 0xFC, 0x32, 0xE2, 0x29, 0xFD, + 0x8E, 0xED, 0xE1, 0x01, 0x72, 0xF8, 0x7A, 0xFD, 0xD4, 0xF8, 0x29, 0xF0, + 0xA1, 0xEE, 0x72, 0xE7, 0x0F, 0xEA, 0x9F, 0xEF, 0x8E, 0xF8, 0x05, 0xFD, + 0x87, 0xF8, 0xCC, 0xFD, 0x9F, 0xE7, 0xC6, 0x02, 0xFA, 0xE3, 0xEE, 0x09, + 0x26, 0xF6, 0x2F, 0x04, 0xEF, 0x04, 0x33, 0xF8, 0xED, 0xFE, 0x1B, 0xFB, + 0xA1, 0xE7, 0x7A, 0xF3, 0x11, 0xCC, 0x1A, 0xE5, 0xB0, 0xCE, 0xA2, 0xF7, + 0x59, 0xF1, 0x5D, 0x14, 0x7B, 0xEF, 0x1D, 0x0B, 0xF1, 0xD1, 0x84, 0xF0, + 0x1C, 0xDD, 0x10, 0xFC, 0x7B, 0xF4, 0xFA, 0x0A, 0x4A, 0xEC, 0x39, 0xF4, + 0x92, 0xE0, 0x99, 0xDD, 0xE8, 0xF3, 0x11, 0xE1, 0x35, 0xF3, 0xF0, 0xD5, + 0x4C, 0xD9, 0xCA, 0xBE, 0x7B, 0xD2, 0xF8, 0xC3, 0x71, 0xD1, 0x75, 0xD0, + 0x4F, 0xC9, 0xF9, 0xC3, 0x01, 0xC4, 0xA9, 0xBA, 0x0E, 0xD0, 0xBF, 0xC9, + 0xAB, 0xD6, 0x03, 0xC6, 0xE6, 0xCF, 0x67, 0xB3, 0x2F, 0xDD, 0x8F, 0xBC, + 0x3B, 0xE6, 0x81, 0xCB, 0x26, 0xD0, 0x9F, 0xBE, 0xE0, 0xD0, 0x36, 0xC1, + 0xC5, 0xEA, 0x71, 0xDF, 0xEE, 0xEA, 0x43, 0xE4, 0xA5, 0xD5, 0x01, 0xD8, + 0x7D, 0xCF, 0x09, 0xDC, 0x5F, 0xD8, 0x61, 0xDA, 0xD7, 0xD4, 0xDB, 0xCB, + 0xF3, 0xCD, 0xA4, 0xD2, 0xA8, 0xC6, 0x97, 0xE9, 0x78, 0xC0, 0x79, 0xF2, + 0x7B, 0xDC, 0xF9, 0xF2, 0x3A, 0xF5, 0xFC, 0xED, 0x78, 0xED, 0x41, 0xE6, + 0x23, 0xE5, 0x2C, 0xEB, 0x80, 0xDF, 0x47, 0xF4, 0x45, 0xE2, 0xCE, 0xF8, + 0x44, 0xF1, 0x2F, 0xFB, 0xF0, 0xFE, 0x67, 0xF9, 0x16, 0xFA, 0xB2, 0xF4, + 0x4A, 0xF8, 0x3B, 0xFF, 0xC3, 0xFA, 0x80, 0x0B, 0xEF, 0xEE, 0x82, 0x11, + 0x98, 0xE3, 0x5E, 0x05, 0x98, 0xF6, 0xC1, 0xF5, 0x17, 0x04, 0x7F, 0xED, + 0xC0, 0xFD, 0x7C, 0xEA, 0xED, 0x13, 0x41, 0x06, 0xA7, 0x21, 0x05, 0x0F, + 0x88, 0x19, 0xA1, 0xFE, 0x03, 0x22, 0xFB, 0xFF, 0xCA, 0x38, 0x8E, 0x0E, + 0x93, 0x28, 0x2B, 0x0D, 0x8F, 0x04, 0xE1, 0xFC, 0x96, 0x0B, 0x7B, 0x09, + 0x0E, 0x11, 0xFD, 0x1C, 0x23, 0x02, 0x35, 0x0E, 0xC6, 0x0B, 0xD3, 0x00, + 0x46, 0x1E, 0xD6, 0x05, 0xAC, 0x04, 0x5A, 0xFC, 0xCC, 0xED, 0xDD, 0xF6, + 0x77, 0x05, 0x1A, 0x07, 0x6D, 0x15, 0x25, 0x0C, 0x9D, 0x06, 0xFA, 0xF6, + 0x6E, 0xF9, 0xA1, 0xEE, 0xFA, 0xF9, 0xCB, 0xFD, 0x55, 0xFE, 0x69, 0x05, + 0x91, 0x00, 0x75, 0x03, 0x84, 0xFA, 0xA1, 0x04, 0xF1, 0xEA, 0x98, 0x0D, + 0x20, 0xDC, 0x84, 0x04, 0xFF, 0xE4, 0x6E, 0xF6, 0xF1, 0xF2, 0x96, 0xF9, + 0x5E, 0xF7, 0xD2, 0xF8, 0xF9, 0x04, 0x60, 0xF0, 0xA4, 0x1B, 0x8B, 0xF9, + 0xB8, 0x21, 0xD9, 0x11, 0x65, 0x14, 0x41, 0x1B, 0xC6, 0x13, 0x27, 0x1C, + 0x41, 0x1C, 0xFF, 0x1F, 0xBA, 0x24, 0x7A, 0x24, 0xBF, 0x22, 0x78, 0x1E, + 0xB4, 0x0D, 0xD5, 0x16, 0x47, 0x07, 0xA9, 0x27, 0x7F, 0x10, 0xB3, 0x2F, + 0xA8, 0x1B, 0xDF, 0x29, 0xE2, 0x21, 0x69, 0x30, 0x66, 0x30, 0xAC, 0x3F, + 0x23, 0x43, 0x5F, 0x3E, 0x5D, 0x37, 0x0C, 0x2C, 0x17, 0x21, 0xAD, 0x2F, + 0x84, 0x23, 0xE7, 0x3E, 0x10, 0x37, 0x20, 0x41, 0xF8, 0x37, 0x90, 0x32, + 0x3C, 0x39, 0xA6, 0x2E, 0x4B, 0x3C, 0xAA, 0x2C, 0x6D, 0x36, 0x24, 0x25, + 0x93, 0x36, 0x94, 0x30, 0x9B, 0x1F, 0x36, 0x28, 0x46, 0xFD, 0x94, 0x0D, + 0xAF, 0x08, 0xB1, 0x1A, 0xED, 0x38, 0x7D, 0x3B, 0x76, 0x41, 0x12, 0x2E, + 0x27, 0x29, 0x26, 0x0C, 0xB5, 0x2D, 0x19, 0x12, 0x3D, 0x35, 0xD5, 0x1D, + 0xFD, 0x21, 0xE3, 0x0E, 0x4B, 0x12, 0x66, 0x0B, 0xA3, 0x0B, 0x9D, 0x12, + 0x72, 0xF1, 0x20, 0xFD, 0xE7, 0xE0, 0x57, 0xE7, 0x3B, 0xF1, 0x13, 0xF4, + 0x66, 0xE9, 0x03, 0xF7, 0x88, 0xCB, 0x3C, 0xDE, 0x0F, 0xDD, 0xD9, 0xDF, + 0xC9, 0xFD, 0x94, 0xEB, 0xCF, 0xF8, 0xFF, 0xDD, 0x2E, 0xF4, 0x0F, 0xD9, + 0x8D, 0xF8, 0xA2, 0xE0, 0xD8, 0xF0, 0x24, 0xE1, 0xA9, 0xDC, 0x22, 0xD1, + 0x39, 0xD2, 0x14, 0xCF, 0xDD, 0xDA, 0xF7, 0xE8, 0x4B, 0xE2, 0x84, 0xF5, + 0x84, 0xDF, 0xE9, 0xE1, 0xA0, 0xE5, 0x73, 0xD5, 0x4C, 0xED, 0x32, 0xDE, + 0xB6, 0xE0, 0xEB, 0xDC, 0x5D, 0xD4, 0x43, 0xE1, 0xF0, 0xDE, 0x15, 0xF5, + 0x63, 0xEF, 0xAC, 0xFE, 0x4A, 0xED, 0xD9, 0xF5, 0x49, 0xF4, 0xA1, 0xF4, + 0xE3, 0xFC, 0xB0, 0xF5, 0x40, 0xF4, 0x04, 0xEC, 0x58, 0xF0, 0xD1, 0xF1, + 0xE8, 0xFC, 0x55, 0x0A, 0x5C, 0x0F, 0x59, 0x1C, 0xA2, 0x02, 0xE8, 0x14, + 0x3F, 0xF3, 0xE3, 0x0F, 0x88, 0x05, 0xA3, 0x28, 0xDD, 0x16, 0x62, 0x3B, + 0x08, 0x13, 0xE6, 0x26, 0xC0, 0x17, 0x13, 0x16, 0xC0, 0x20, 0xF7, 0x18, + 0xB2, 0x1E, 0x70, 0x1A, 0xF7, 0x2B, 0x86, 0x1B, 0xB3, 0x37, 0x07, 0x19, + 0xFF, 0x1B, 0xE6, 0x0D, 0x9E, 0x06, 0x30, 0x08, 0x0C, 0x24, 0x7C, 0x21, + 0xC0, 0x28, 0x20, 0x23, 0x63, 0x04, 0xB1, 0xFF, 0xD8, 0x04, 0x23, 0x01, + 0x17, 0x2C, 0x47, 0x1F, 0x83, 0x3A, 0x1A, 0x18, 0x30, 0x2F, 0x5B, 0xFC, + 0x01, 0x2D, 0x1C, 0x0D, 0x33, 0x13, 0x97, 0x1E, 0x66, 0xF6, 0x61, 0x09, + 0xF2, 0x0C, 0x5F, 0x00, 0xEC, 0x1C, 0xF0, 0xFF, 0x53, 0xFD, 0x8F, 0xF1, + 0x92, 0xE6, 0x53, 0xF1, 0x71, 0xEF, 0xC1, 0xFB, 0x05, 0xEE, 0x74, 0xF1, + 0xF5, 0xE5, 0x2A, 0xEA, 0x11, 0xF5, 0xD3, 0xF6, 0xBB, 0x07, 0x8B, 0x02, + 0xB0, 0xF7, 0x9F, 0xF6, 0x10, 0xD4, 0x8D, 0xE3, 0x46, 0xCC, 0xA2, 0xED, + 0xB9, 0xE3, 0xEC, 0xF9, 0x7F, 0xEE, 0xB4, 0xE8, 0x4B, 0xEE, 0x86, 0xDF, + 0xF6, 0xF4, 0xF0, 0xFC, 0x19, 0xE3, 0x7A, 0x0F, 0xA4, 0xD9, 0x43, 0x0B, + 0xB4, 0xE8, 0x51, 0x09, 0x90, 0xE9, 0xE4, 0x04, 0xCE, 0xDD, 0x5B, 0xFA, + 0xCB, 0xE1, 0x62, 0xF2, 0x51, 0xF2, 0xE5, 0xF3, 0x5A, 0xE9, 0x24, 0xF3, + 0x53, 0xE1, 0xBA, 0xEA, 0x54, 0xFA, 0x2F, 0xED, 0xD2, 0x19, 0x7C, 0xF5, + 0x71, 0x1A, 0x9F, 0xE0, 0x59, 0x08, 0x04, 0xDE, 0x57, 0x05, 0xA3, 0x00, + 0x19, 0x08, 0xFE, 0x09, 0xF5, 0x08, 0xED, 0xF9, 0xDB, 0x0B, 0xD0, 0xF3, + 0x7F, 0x04, 0x37, 0xFB, 0xF3, 0xF7, 0xEF, 0xF4, 0x22, 0x06, 0x4C, 0xF4, + 0x9E, 0x11, 0x49, 0xFD, 0xFC, 0xF1, 0x6F, 0xE7, 0x97, 0xDB, 0x69, 0xD0, + 0x0B, 0xFB, 0xC6, 0xE7, 0xB6, 0x0F, 0x76, 0xF9, 0x14, 0xFB, 0x9F, 0xE0, + 0x51, 0xF4, 0x1F, 0xDC, 0xA3, 0x00, 0xB8, 0xF4, 0xE6, 0xF9, 0xAE, 0xF0, + 0x8D, 0xE4, 0xE0, 0xE7, 0xDF, 0xE0, 0x30, 0xFA, 0xA4, 0xD7, 0xC1, 0xF0, + 0x6F, 0xBE, 0x4B, 0xCC, 0x7F, 0xC6, 0x66, 0xC4, 0x1D, 0xDB, 0xA0, 0xCE, + 0x19, 0xC3, 0x05, 0xC4, 0x0E, 0xB7, 0x8D, 0xBE, 0x9E, 0xD0, 0x1E, 0xD4, + 0xC4, 0xD7, 0xD7, 0xDD, 0x6B, 0xD3, 0x6E, 0xD3, 0x9E, 0xE1, 0x2F, 0xDE, + 0x3F, 0xEE, 0x69, 0xEF, 0xBE, 0xE0, 0x17, 0xE7, 0xA4, 0xCA, 0x62, 0xE4, + 0x81, 0xCD, 0x5E, 0xFA, 0x50, 0xE5, 0xE7, 0x0A, 0xE1, 0xEE, 0x12, 0xFF, + 0xDD, 0xE8, 0x7D, 0xEC, 0xA2, 0xF0, 0xC6, 0xF1, 0x14, 0xF3, 0x90, 0xFC, + 0x41, 0xE5, 0x31, 0xF7, 0xEA, 0xF2, 0xED, 0x03, 0x68, 0x05, 0x9E, 0x1D, + 0x1E, 0xFD, 0x01, 0x14, 0xDB, 0x03, 0x3E, 0x0E, 0x4A, 0x1E, 0xFD, 0x20, + 0xFD, 0x28, 0x46, 0x1B, 0x05, 0x1D, 0xE2, 0x16, 0xF1, 0x12, 0xE5, 0x2B, + 0xB6, 0x21, 0xEC, 0x3B, 0xDA, 0x1F, 0xB4, 0x2D, 0x8D, 0x11, 0x71, 0x1E, + 0xF3, 0x27, 0xE0, 0x30, 0x74, 0x3A, 0xC5, 0x38, 0x74, 0x35, 0xF5, 0x25, + 0xD9, 0x3E, 0x98, 0x23, 0xB1, 0x40, 0x79, 0x2A, 0xC2, 0x29, 0xC1, 0x23, + 0x44, 0x2E, 0x85, 0x2A, 0xA7, 0x4A, 0x14, 0x3D, 0x0E, 0x47, 0xF8, 0x2E, + 0xFF, 0x2C, 0x69, 0x15, 0x06, 0x37, 0x0B, 0x2B, 0x65, 0x45, 0x64, 0x39, + 0x51, 0x25, 0xEB, 0x17, 0x8D, 0x18, 0x6E, 0x11, 0xDD, 0x3A, 0xBB, 0x2C, + 0x68, 0x4F, 0x7C, 0x2C, 0xA2, 0x41, 0x45, 0x14, 0x11, 0x40, 0x66, 0x1C, + 0x9E, 0x30, 0x89, 0x26, 0xE9, 0xFD, 0x02, 0x09, 0x01, 0xFD, 0x55, 0x08, + 0x2A, 0x16, 0xDB, 0x18, 0xDF, 0x05, 0x43, 0xFE, 0x71, 0xFC, 0x37, 0xEB, + 0x58, 0x12, 0x95, 0xFF, 0xE4, 0x06, 0x45, 0x02, 0x4C, 0xDF, 0xB1, 0xF3, + 0xEE, 0xE8, 0x03, 0x0C, 0xDD, 0x0E, 0xD0, 0x27, 0xD1, 0x0A, 0xF5, 0x15, + 0x18, 0xEF, 0x2E, 0xFE, 0xC7, 0xEA, 0x82, 0xFE, 0x90, 0xF5, 0x3C, 0xFC, + 0x75, 0xFF, 0x0B, 0xF8, 0x56, 0x0B, 0xAF, 0x0E, 0x87, 0x05, 0x51, 0x21, + 0xF0, 0xE9, 0x4D, 0x16, 0x58, 0xEC, 0xF2, 0x13, 0x5B, 0x07, 0x0C, 0x21, + 0xC7, 0xFE, 0x7E, 0x1A, 0xEC, 0xEA, 0xB1, 0x0A, 0xDF, 0xF7, 0x38, 0x0A, + 0xE3, 0x10, 0x67, 0x0D, 0xE1, 0x10, 0x4E, 0x01, 0xAA, 0x0B, 0xE2, 0x00, + 0x54, 0x1A, 0x80, 0x13, 0xDD, 0x23, 0x3E, 0x11, 0x26, 0x14, 0xB7, 0x01, + 0xBD, 0x03, 0xD0, 0x0C, 0x69, 0x03, 0x1A, 0x20, 0x24, 0x09, 0x0D, 0x17, + 0x72, 0x14, 0xC6, 0x03, 0xE3, 0x1F, 0x34, 0xFC, 0x05, 0x1B, 0xCB, 0xF6, + 0xFA, 0x0D, 0x38, 0xF6, 0xD1, 0x21, 0x7E, 0x0A, 0xAB, 0x2C, 0xC2, 0x19, + 0x12, 0x03, 0x17, 0xFE, 0x0F, 0xF3, 0x92, 0xE4, 0x1B, 0x13, 0x4A, 0xF9, + 0x53, 0x18, 0x70, 0x00, 0x42, 0xED, 0xA5, 0xE9, 0x17, 0xE0, 0x40, 0xEE, + 0xCF, 0x05, 0x60, 0x04, 0x7A, 0x18, 0x84, 0xFD, 0xA4, 0x12, 0xEB, 0xF0, + 0x05, 0x04, 0xD4, 0xF8, 0xA5, 0xE5, 0xA5, 0xF2, 0x6E, 0xCC, 0x3C, 0xDA, + 0xBD, 0xD6, 0xA3, 0xD7, 0x0D, 0xE6, 0x6A, 0xDE, 0x81, 0xD4, 0x3B, 0xCF, + 0x15, 0xCE, 0xEF, 0xC8, 0xC0, 0xE1, 0x2C, 0xE1, 0xBC, 0xD7, 0xF2, 0xE2, + 0xFB, 0xB8, 0x08, 0xCB, 0x65, 0xC0, 0x29, 0xD4, 0x79, 0xDB, 0x29, 0xE1, + 0xEF, 0xCD, 0x9E, 0xCA, 0xE8, 0xB2, 0xCE, 0xC4, 0xDB, 0xB7, 0x69, 0xD7, + 0x54, 0xC3, 0x59, 0xD4, 0x7B, 0xCE, 0x7B, 0xC8, 0x82, 0xE5, 0xDA, 0xCF, + 0x92, 0xE8, 0x95, 0xD8, 0x4E, 0xD5, 0x4E, 0xCF, 0x97, 0xD7, 0x87, 0xD0, + 0xF7, 0xE4, 0x51, 0xDC, 0x2C, 0xDD, 0x48, 0xD6, 0x20, 0xDB, 0xE4, 0xD3, + 0x84, 0xF3, 0x60, 0xE7, 0xE4, 0xF5, 0xA8, 0xF2, 0xEA, 0xDE, 0x34, 0xE7, + 0xC0, 0xE0, 0x10, 0xE8, 0x9E, 0xF1, 0xB3, 0xED, 0xD8, 0xF6, 0x38, 0xE9, + 0xAA, 0xE6, 0x07, 0xE3, 0xC3, 0xD7, 0x0D, 0xE0, 0x26, 0xE7, 0x57, 0xEE, + 0xDF, 0x01, 0xEC, 0xF6, 0x0B, 0x05, 0xFA, 0xF0, 0x50, 0xF8, 0x02, 0xFB, + 0x06, 0xE8, 0x7A, 0x04, 0xAA, 0xD4, 0x31, 0xFB, 0x3F, 0xDE, 0x8F, 0xFE, + 0x93, 0xF0, 0x1D, 0x04, 0x65, 0xDB, 0x58, 0xEA, 0xB8, 0xC6, 0xCE, 0xD3, + 0xF3, 0xEB, 0x39, 0xEB, 0xB2, 0xFE, 0xD9, 0xF5, 0x0D, 0xDD, 0x2A, 0xE4, + 0x83, 0xE3, 0x44, 0xF3, 0xA5, 0x03, 0x2A, 0x06, 0x09, 0x08, 0x32, 0xF4, + 0x4B, 0x08, 0xB4, 0xE6, 0xD6, 0x0D, 0x40, 0xF8, 0x4A, 0xFC, 0xF8, 0xFB, + 0x7F, 0xDC, 0xFF, 0xE8, 0x0B, 0xDF, 0x78, 0xEE, 0x09, 0xEF, 0xF1, 0xFB, + 0xBB, 0xE9, 0xE9, 0xEA, 0xB2, 0xF1, 0x67, 0xDF, 0x1C, 0x04, 0xA9, 0xEC, + 0x52, 0xF4, 0x4D, 0xF0, 0x2A, 0xD7, 0xF5, 0xEE, 0x99, 0xDC, 0xE5, 0x00, + 0x5A, 0xF0, 0x4B, 0x12, 0xC4, 0xF4, 0x6E, 0x06, 0xE9, 0xFE, 0x9D, 0xFA, + 0xDB, 0x11, 0x4C, 0x02, 0x0D, 0x16, 0x07, 0x01, 0x20, 0x05, 0x71, 0xF9, + 0x81, 0xF9, 0xC0, 0xFF, 0x4C, 0x06, 0xD7, 0x12, 0x3A, 0x0A, 0x0E, 0x11, + 0x0C, 0x09, 0x53, 0x05, 0x5E, 0x13, 0x63, 0x08, 0x88, 0x09, 0x56, 0x08, + 0xE1, 0xFA, 0xEB, 0x0B, 0x91, 0x13, 0x6D, 0x1C, 0x06, 0x21, 0xCF, 0x1E, + 0xB1, 0x0D, 0x84, 0x0D, 0x95, 0x17, 0x97, 0x12, 0x5B, 0x3A, 0x29, 0x2A, + 0x5F, 0x3F, 0xF6, 0x23, 0x7D, 0x25, 0x77, 0x18, 0x7E, 0x17, 0x0A, 0x2F, + 0xBC, 0x17, 0xA8, 0x42, 0xA4, 0x1B, 0x18, 0x3B, 0x26, 0x21, 0xAD, 0x29, + 0x6A, 0x24, 0xE0, 0x1E, 0xD3, 0x2A, 0x94, 0x19, 0x67, 0x30, 0x8A, 0x17, + 0x17, 0x35, 0x24, 0x29, 0xEA, 0x25, 0xA1, 0x31, 0xC0, 0x08, 0xA1, 0x22, + 0xC1, 0x1E, 0xA5, 0x2E, 0x7F, 0x41, 0x68, 0x38, 0xDF, 0x2E, 0x92, 0x0E, + 0xF8, 0x19, 0xD3, 0xF7, 0x72, 0x2A, 0x53, 0x17, 0xCF, 0x3F, 0x62, 0x27, + 0x14, 0x28, 0x9C, 0x14, 0x33, 0x0E, 0x4C, 0x17, 0x17, 0x19, 0x2B, 0x2C, + 0x2E, 0x12, 0xD0, 0x1A, 0x51, 0x02, 0x42, 0xFA, 0x2A, 0x07, 0x7A, 0xF9, + 0xAE, 0x03, 0xB4, 0xFC, 0xE8, 0xF5, 0xDD, 0xF0, 0xFC, 0x00, 0x31, 0xF5, + 0x99, 0x11, 0x14, 0x01, 0x62, 0xFE, 0xA9, 0xFB, 0x43, 0xF4, 0xBB, 0x08, + 0x0F, 0x0F, 0x5C, 0x28, 0x52, 0x13, 0xC1, 0x1D, 0x48, 0xF3, 0xB2, 0xFE, + 0x36, 0xE4, 0x75, 0x05, 0xAB, 0xEE, 0x82, 0x11, 0x03, 0xF6, 0x12, 0x07, + 0x64, 0xFF, 0x5A, 0x04, 0x09, 0x08, 0x85, 0x09, 0xB7, 0xFD, 0x18, 0x02, + 0xF4, 0xF8, 0xEF, 0xFB, 0x95, 0xFD, 0x0C, 0x01, 0x8D, 0xF1, 0x97, 0xF9, + 0x2B, 0xF0, 0x5D, 0xED, 0xD7, 0x04, 0xE3, 0xF3, 0x68, 0x15, 0x4E, 0xF8, + 0x3D, 0x0E, 0x35, 0xEE, 0x6A, 0xF7, 0xB5, 0xEF, 0xF7, 0xFC, 0xC1, 0x00, + 0xC2, 0x12, 0x50, 0x00, 0x5F, 0x15, 0xE7, 0xF5, 0x30, 0x15, 0x64, 0xFD, + 0xBF, 0x14, 0xBF, 0x04, 0xCC, 0xFC, 0x86, 0xFA, 0x3C, 0xF0, 0x2E, 0xF4, + 0xC3, 0x0E, 0x91, 0xFE, 0x3C, 0x19, 0x90, 0xFA, 0x9F, 0x0C, 0x42, 0xEF, + 0x25, 0x22, 0x3D, 0x0A, 0xC5, 0x25, 0x3A, 0x1F, 0x98, 0xF9, 0xD3, 0x0B, + 0x2B, 0xE2, 0x31, 0x03, 0x30, 0xF9, 0x52, 0x09, 0x42, 0x00, 0x79, 0xF3, + 0xC7, 0xDE, 0x05, 0xDB, 0x01, 0xE7, 0x77, 0x01, 0xD1, 0x09, 0x8D, 0x2B, + 0xB3, 0xF8, 0xCF, 0x13, 0x0E, 0xF2, 0x06, 0x07, 0xE5, 0x0C, 0xAB, 0x1C, + 0x28, 0xFE, 0x70, 0x0C, 0xFD, 0xE8, 0x4A, 0xF6, 0x81, 0xFE, 0x00, 0x0F, + 0xBA, 0xF9, 0xEE, 0x10, 0x6D, 0xD6, 0x0B, 0xEF, 0xA5, 0xE4, 0xCB, 0xF5, + 0x4B, 0x04, 0x53, 0x0A, 0xB6, 0xF5, 0x77, 0xF2, 0x65, 0xEA, 0xAF, 0xE4, + 0xA8, 0x01, 0xBB, 0xF7, 0xA5, 0x14, 0x68, 0xFA, 0x0F, 0x12, 0x9D, 0xF4, + 0x21, 0x0E, 0x3A, 0xFF, 0x09, 0x1D, 0x24, 0x13, 0x8D, 0x25, 0x7F, 0x14, + 0x2E, 0x2C, 0x8C, 0x0E, 0xC8, 0x3A, 0xEA, 0x19, 0xC7, 0x29, 0xC5, 0x1A, + 0xEA, 0x0C, 0x19, 0x0F, 0x65, 0x0D, 0x20, 0x11, 0x8E, 0x11, 0xD2, 0x09, + 0xA7, 0x0C, 0x9F, 0xFA, 0x30, 0x0B, 0x65, 0xF8, 0x6D, 0x08, 0x68, 0xFA, + 0xEE, 0x0B, 0x65, 0x01, 0x2B, 0x1B, 0xA9, 0x08, 0xF4, 0x1C, 0xB0, 0x0F, + 0x90, 0x0E, 0xA9, 0x10, 0x07, 0x0D, 0x82, 0x0A, 0xAD, 0x0C, 0xAC, 0xFF, + 0x55, 0x06, 0x4A, 0xF7, 0xDF, 0x02, 0x07, 0xFC, 0xAA, 0xF5, 0x45, 0xF9, + 0x45, 0xEB, 0xEE, 0xF8, 0x74, 0xEB, 0x98, 0x01, 0x01, 0xEC, 0xE9, 0xFC, + 0x05, 0xF1, 0x75, 0xF5, 0xFA, 0xF6, 0xFD, 0xF1, 0xFF, 0xF1, 0xD2, 0xEF, + 0x9B, 0xF0, 0x08, 0xF9, 0x4B, 0xF1, 0x9F, 0x04, 0x76, 0xE8, 0xD2, 0x02, + 0x42, 0xF6, 0xD0, 0x02, 0x7C, 0x07, 0xCC, 0x09, 0xC4, 0xF9, 0x1B, 0x08, + 0xDB, 0xEB, 0xC3, 0x03, 0xF5, 0xED, 0x98, 0x0B, 0xAF, 0xDF, 0x0B, 0x00, + 0x63, 0xBB, 0xBB, 0xDF, 0x0E, 0xB5, 0xEB, 0xE1, 0x02, 0xCB, 0x78, 0xE7, + 0x28, 0xD5, 0xC4, 0xD1, 0x2C, 0xD6, 0xB1, 0xC9, 0x62, 0xDA, 0xB7, 0xD5, + 0x48, 0xE6, 0xD9, 0xE3, 0x92, 0xEB, 0xBF, 0xE2, 0x62, 0xEB, 0xDF, 0xE0, + 0x74, 0xE6, 0x0F, 0xE8, 0x2D, 0xD6, 0x3D, 0xE2, 0xA7, 0xD6, 0x34, 0xD8, + 0x19, 0xDF, 0xBE, 0xD7, 0x80, 0xD5, 0x0B, 0xD6, 0xE3, 0xD8, 0x2D, 0xD8, + 0xEA, 0xE8, 0x02, 0xE5, 0x6B, 0xF1, 0x33, 0xE7, 0x13, 0xF8, 0x4B, 0xDC, + 0x1E, 0xF9, 0x56, 0xDC, 0xF7, 0xF9, 0x34, 0xDE, 0xA9, 0xFA, 0x5A, 0xDF, + 0x4A, 0xF8, 0x9C, 0xEF, 0x1C, 0xF1, 0x45, 0xF4, 0xD3, 0xF2, 0x18, 0xF3, + 0xE6, 0x01, 0x1D, 0xF5, 0x35, 0x0A, 0x09, 0xED, 0xE2, 0x04, 0xC7, 0xE9, + 0xDA, 0xF4, 0xEA, 0xE6, 0x5D, 0xF3, 0xFE, 0xE8, 0x7F, 0xF9, 0x4B, 0xF0, + 0x6A, 0xFD, 0x41, 0xFB, 0x16, 0xFC, 0x1F, 0xFD, 0x4B, 0xFB, 0x90, 0xF9, + 0x83, 0x0A, 0x46, 0xF7, 0xD4, 0x14, 0xA5, 0xED, 0xB0, 0x1F, 0x02, 0x04, + 0xF1, 0x21, 0x32, 0x15, 0x2F, 0x14, 0x9A, 0x0A, 0x59, 0x12, 0xF4, 0x19, + 0xF8, 0x10, 0xE3, 0x27, 0x5A, 0xF1, 0x83, 0x14, 0xCF, 0xE1, 0x15, 0x0C, + 0xA8, 0x07, 0x40, 0x22, 0x10, 0x20, 0x68, 0x2C, 0x82, 0x14, 0x95, 0x23, + 0x5D, 0x05, 0x42, 0x22, 0x24, 0x0B, 0x58, 0x2F, 0x59, 0x0D, 0xB8, 0x26, + 0x98, 0xFF, 0x44, 0x16, 0xC1, 0xFE, 0x0B, 0x23, 0x8C, 0xFD, 0xC3, 0x21, + 0xC8, 0xF8, 0x51, 0x15, 0x5A, 0xFA, 0x5D, 0x24, 0x1C, 0xFE, 0xED, 0x2A, + 0xC0, 0xF9, 0x69, 0x07, 0x57, 0x01, 0x1E, 0xF5, 0x92, 0x18, 0xBA, 0x00, + 0x12, 0x12, 0x97, 0xFD, 0xBE, 0xFA, 0x63, 0x00, 0x08, 0x02, 0xF2, 0x18, + 0x62, 0x1B, 0x30, 0x21, 0xF2, 0x2E, 0x6E, 0x14, 0xF2, 0x2E, 0x18, 0x11, + 0x59, 0x1F, 0xF7, 0x15, 0x51, 0x1E, 0x30, 0x14, 0x77, 0x27, 0x3C, 0x14, + 0x57, 0x26, 0x7C, 0x1B, 0x5D, 0x20, 0x1A, 0x15, 0xA1, 0x27, 0xCF, 0x0B, + 0x0D, 0x2E, 0x10, 0x0D, 0x01, 0x28, 0x34, 0x13, 0x85, 0x27, 0x86, 0x1C, + 0xC1, 0x23, 0x46, 0x20, 0x4A, 0x24, 0x7F, 0x25, 0x79, 0x21, 0x4B, 0x1B, + 0x6F, 0x19, 0x21, 0x11, 0x49, 0x1F, 0x43, 0x23, 0xE2, 0x2B, 0x8E, 0x39, + 0x34, 0x34, 0xE0, 0x41, 0xE7, 0x28, 0x41, 0x33, 0x40, 0x20, 0x53, 0x26, + 0x7C, 0x25, 0xF7, 0x21, 0x43, 0x2E, 0xD7, 0x25, 0xAF, 0x2E, 0xAC, 0x2D, + 0x35, 0x1F, 0x8C, 0x18, 0xB2, 0x1B, 0xD4, 0x0E, 0xAE, 0x31, 0xE8, 0x2D, + 0x5D, 0x2C, 0xAD, 0x2F, 0x4B, 0x0B, 0x96, 0x0F, 0x88, 0x09, 0xA0, 0x12, + 0x78, 0x14, 0x1D, 0x26, 0x3A, 0x0F, 0xA1, 0x18, 0x73, 0x0D, 0xCD, 0x10, + 0x09, 0x0D, 0x70, 0x1C, 0x38, 0xF9, 0x0E, 0x0A, 0x52, 0xE5, 0x16, 0xEC, + 0xE4, 0xEC, 0x64, 0xE6, 0xF2, 0xF4, 0xBC, 0xE3, 0x04, 0xEC, 0x6D, 0xDB, + 0x05, 0xED, 0x0F, 0xE4, 0xA0, 0xF3, 0x7A, 0xF5, 0x74, 0xF0, 0x86, 0xEA, + 0x9F, 0xE9, 0xFF, 0xD6, 0x15, 0xEE, 0x00, 0xDC, 0xC7, 0xF0, 0x00, 0xE1, + 0xF0, 0xE4, 0x0D, 0xDD, 0x55, 0xDE, 0xF8, 0xE4, 0x93, 0xD9, 0x6E, 0xEE, + 0xB8, 0xDA, 0x36, 0xE2, 0xE2, 0xE3, 0x7D, 0xD4, 0x51, 0xDF, 0xB0, 0xCC, + 0x44, 0xD9, 0x0B, 0xC1, 0xD1, 0xE2, 0xAB, 0xCC, 0x05, 0xEB, 0x1F, 0xE4, + 0xE0, 0xE9, 0xCE, 0xF0, 0x27, 0xE5, 0x2F, 0xF7, 0x27, 0xE0, 0xBC, 0xEA, + 0x7C, 0xE1, 0x6B, 0xD8, 0x3C, 0xE2, 0xA8, 0xD4, 0xF8, 0xD2, 0xD3, 0xDD, + 0xEB, 0xC2, 0x0F, 0xED, 0x1B, 0xC2, 0x9D, 0xEE, 0x3D, 0xCF, 0x31, 0xE0, + 0xC4, 0xE8, 0x2C, 0xDB, 0xD1, 0xF1, 0x2B, 0xDE, 0x80, 0xF3, 0x20, 0xE2, + 0x6F, 0xFD, 0x70, 0xEF, 0x5E, 0xFB, 0xF0, 0xFD, 0x5E, 0xF7, 0x2B, 0x07, + 0x7D, 0xE7, 0xB0, 0x03, 0x49, 0x0B, 0xDD, 0x1E, 0x7E, 0x49, 0x39, 0x36, + 0x4F, 0x37, 0xF5, 0x18, 0xAB, 0x31, 0x41, 0x26, 0x94, 0x53, 0x5F, 0x54, + 0xF1, 0x51, 0x5D, 0x5C, 0xF3, 0x3C, 0x6F, 0x51, 0xCD, 0x38, 0x2D, 0x4C, + 0x3D, 0x36, 0x98, 0x41, 0x96, 0x1F, 0x02, 0x27, 0x49, 0x09, 0xE9, 0x0D, + 0x4E, 0xFD, 0x12, 0xFC, 0x4B, 0xE9, 0x39, 0xE2, 0x56, 0xD2, 0x39, 0xD3, + 0xED, 0xD4, 0xF7, 0xDB, 0x32, 0xDF, 0xA1, 0xD8, 0x2E, 0xCF, 0x9D, 0xC9, + 0x8E, 0xC5, 0xD5, 0xC9, 0xC5, 0xC2, 0xA7, 0xC2, 0x27, 0xAA, 0xC3, 0xAB, + 0x92, 0x9F, 0x1D, 0xA5, 0x14, 0xA4, 0xF3, 0xA3, 0x86, 0xB0, 0xDB, 0xA7, + 0x57, 0xCE, 0xDA, 0xB8, 0x00, 0xE5, 0xB1, 0xC9, 0xD3, 0xE7, 0xC9, 0xDB, + 0x57, 0xD3, 0xD3, 0xDC, 0xB0, 0xC3, 0x5B, 0xD4, 0x3D, 0xD2, 0x64, 0xD9, + 0xD7, 0xEC, 0xF3, 0xE7, 0x3F, 0xED, 0xF5, 0xED, 0x31, 0xF7, 0x2F, 0xF4, + 0xF7, 0x14, 0xB0, 0xFE, 0x13, 0x13, 0xF8, 0x00, 0xB7, 0x10, 0x05, 0x08, + 0x3C, 0x1E, 0xAB, 0x1C, 0xF1, 0x37, 0xB9, 0x35, 0x44, 0x35, 0x05, 0x24, + 0xEA, 0x21, 0x33, 0x0C, 0x3F, 0x3C, 0xA4, 0x31, 0x56, 0x4D, 0x8A, 0x45, + 0x25, 0x24, 0xD4, 0x0F, 0x24, 0x17, 0x21, 0x00, 0xFB, 0x33, 0xBF, 0x27, + 0xE7, 0x1D, 0x46, 0x1D, 0x38, 0x00, 0xCE, 0x04, 0xF4, 0x0C, 0x23, 0x12, + 0x51, 0xFA, 0x37, 0x07, 0x0B, 0xD5, 0x18, 0xDF, 0x5A, 0xCF, 0x26, 0xD1, + 0xEB, 0xCB, 0x0F, 0xD5, 0x57, 0xD0, 0x69, 0xD6, 0x03, 0xDE, 0x74, 0xE4, + 0x9F, 0xE8, 0x86, 0xE7, 0x79, 0xE5, 0xE2, 0xD2, 0xE7, 0xF1, 0x05, 0xE7, + 0x8F, 0xFE, 0x76, 0x14, 0xD0, 0xDD, 0x46, 0x13, 0x39, 0xDD, 0xC0, 0x0E, + 0x2D, 0x09, 0xA8, 0x2B, 0x57, 0x19, 0xC2, 0x30, 0xE9, 0xFC, 0xEA, 0x06, + 0xB3, 0xE0, 0x77, 0xE8, 0x69, 0xF3, 0x35, 0xFF, 0x4C, 0x0E, 0x26, 0x16, + 0x92, 0x07, 0x6C, 0x07, 0x08, 0xFB, 0xF1, 0xF7, 0x19, 0xFA, 0x34, 0xF1, + 0x4D, 0xFB, 0xD7, 0xED, 0x5E, 0xE9, 0x24, 0xEE, 0x8C, 0xCF, 0x7F, 0xDB, + 0x02, 0xD1, 0xA8, 0xD0, 0x6C, 0xEA, 0x45, 0xDC, 0xB7, 0xE9, 0x9C, 0xD1, + 0xD6, 0xCA, 0x55, 0xC2, 0x83, 0xBA, 0x5C, 0xC4, 0x67, 0xB4, 0x89, 0xC1, + 0x99, 0xB1, 0x1B, 0xB4, 0xF1, 0xB2, 0xD2, 0xA2, 0x15, 0xAE, 0x5E, 0x9E, + 0x21, 0xAA, 0x86, 0xA4, 0xA0, 0xB2, 0x41, 0xA1, 0xC3, 0xC6, 0xC4, 0xAB, + 0x3A, 0xD3, 0xA5, 0xC5, 0xF8, 0xD0, 0x47, 0xC7, 0x47, 0xE4, 0xA7, 0xCB, + 0x52, 0xFD, 0x44, 0xE6, 0x54, 0xF9, 0x43, 0xF5, 0xA0, 0xDF, 0xE0, 0xEA, + 0x84, 0xCB, 0x2F, 0xDC, 0x85, 0xC9, 0xFC, 0xD1, 0xBD, 0xD2, 0xC6, 0xCD, + 0xF1, 0xE2, 0x24, 0xDF, 0xE7, 0xE9, 0x62, 0xF3, 0xCD, 0xF5, 0xE3, 0xFD, + 0x2F, 0x15, 0x63, 0x16, 0xB5, 0x1A, 0x2E, 0x2F, 0x3F, 0x07, 0x3D, 0x2D, + 0x04, 0x0F, 0x61, 0x2A, 0x87, 0x1E, 0x29, 0x33, 0xF3, 0x1A, 0x7A, 0x29, + 0x43, 0x13, 0xEC, 0x18, 0x71, 0x28, 0x49, 0x2C, 0x99, 0x51, 0x0D, 0x56, + 0x70, 0x50, 0xF7, 0x55, 0x21, 0x38, 0x03, 0x38, 0x87, 0x40, 0x33, 0x33, + 0x5C, 0x47, 0xD8, 0x2A, 0x04, 0x2F, 0xFC, 0x0A, 0x00, 0x14, 0x2C, 0xFB, + 0x08, 0x03, 0x3B, 0xFA, 0x8E, 0xFD, 0x81, 0xF4, 0x8E, 0x09, 0x5B, 0xFD, + 0xBE, 0x02, 0xB1, 0x01, 0x10, 0xEF, 0xE2, 0xF0, 0x47, 0xFA, 0x16, 0xEA, + 0xFA, 0x07, 0xCA, 0xED, 0x48, 0x0B, 0x2C, 0xF1, 0xFC, 0x13, 0xEA, 0x06, + 0x53, 0x23, 0x97, 0x2A, 0xAC, 0x29, 0x1C, 0x35, 0xA7, 0x2E, 0x61, 0x2C, + 0xB9, 0x33, 0x0B, 0x22, 0xC6, 0x2E, 0x88, 0x23, 0x0E, 0x2A, 0x83, 0x2B, + 0xA9, 0x2A, 0x7E, 0x2D, 0x7A, 0x2E, 0x01, 0x3A, 0x51, 0x2B, 0x8C, 0x44, + 0x1D, 0x31, 0xB7, 0x4A, 0x1C, 0x46, 0x0E, 0x56, 0x6D, 0x5C, 0x5F, 0x5B, + 0xCA, 0x62, 0x5B, 0x4E, 0x52, 0x5B, 0xB1, 0x47, 0xA4, 0x55, 0x8D, 0x56, + 0xB4, 0x43, 0x1C, 0x4C, 0xAD, 0x40, 0x83, 0x44, 0xAC, 0x50, 0x14, 0x5A, + 0x32, 0x56, 0x2F, 0x62, 0x39, 0x5C, 0x2C, 0x5D, 0x05, 0x61, 0xFD, 0x5B, + 0x6C, 0x58, 0x28, 0x5C, 0x22, 0x3F, 0xCA, 0x4F, 0xF2, 0x32, 0xA0, 0x4D, + 0xBF, 0x40, 0x24, 0x5D, 0x85, 0x40, 0x60, 0x4C, 0x84, 0x37, 0x0D, 0x3A, + 0x9F, 0x4E, 0x15, 0x54, 0x91, 0x62, 0x9C, 0x5B, 0x89, 0x57, 0xC4, 0x4A, + 0x1C, 0x52, 0x21, 0x56, 0x7E, 0x5C, 0x4A, 0x69, 0x8C, 0x5D, 0xAA, 0x5A, + 0xD0, 0x5E, 0x2D, 0x48, 0x1B, 0x5F, 0xFC, 0x4E, 0x9A, 0x3C, 0xA9, 0x49, + 0x7F, 0x1A, 0x11, 0x39, 0x80, 0x18, 0xC0, 0x30, 0x8C, 0x24, 0x96, 0x2E, + 0x37, 0x25, 0xC1, 0x28, 0xDB, 0x1D, 0x04, 0x1F, 0xE0, 0x22, 0x6D, 0x22, + 0xC3, 0x2A, 0xC5, 0x1F, 0x14, 0x1F, 0x75, 0x11, 0xA4, 0x0C, 0xFE, 0x12, + 0x15, 0x0D, 0x2D, 0x1B, 0xE2, 0x14, 0x6F, 0x17, 0x8B, 0x0E, 0xCD, 0x07, + 0xB7, 0xFD, 0x3B, 0xF3, 0x4B, 0xEE, 0xEC, 0xDD, 0x1E, 0xE2, 0xA8, 0xD8, + 0x4C, 0xDB, 0xBB, 0xE0, 0x3F, 0xD6, 0x12, 0xD6, 0x95, 0xC2, 0x89, 0xBA, + 0x6A, 0xBA, 0x3F, 0xB7, 0xDB, 0xD9, 0xD7, 0xD1, 0x3F, 0xDE, 0x81, 0xCF, + 0xDC, 0xBB, 0x4C, 0xB3, 0x0C, 0xAF, 0x97, 0xA6, 0x4E, 0xB2, 0x32, 0xA3, + 0xF6, 0xAD, 0x32, 0xA7, 0xE5, 0xAC, 0xB7, 0xB3, 0xEC, 0xAA, 0x06, 0xB3, + 0xD8, 0xAF, 0x9C, 0xB2, 0x9A, 0xBF, 0xC8, 0xBC, 0x36, 0xBE, 0x97, 0xBE, + 0x40, 0xA9, 0x44, 0xB5, 0xB9, 0x9D, 0x73, 0xAF, 0xE5, 0xAD, 0x39, 0xB7, + 0x07, 0xC2, 0x1D, 0xBA, 0x60, 0xC9, 0xC1, 0xB8, 0x45, 0xC6, 0x40, 0xC1, + 0xDC, 0xBC, 0xA2, 0xCF, 0xE7, 0xBD, 0x28, 0xE3, 0x87, 0xC6, 0x32, 0xF8, + 0x08, 0xB9, 0x4A, 0xEC, 0xD6, 0xAB, 0x8D, 0xCD, 0x32, 0xCD, 0xDB, 0xD4, + 0x7E, 0xE2, 0xE6, 0xDB, 0xA0, 0xCA, 0x0D, 0xCF, 0x43, 0xD4, 0xAB, 0xE8, + 0x5D, 0xFC, 0xB4, 0x09, 0x24, 0x0D, 0x5B, 0xFB, 0x97, 0x06, 0x4C, 0xE6, + 0x6D, 0xF6, 0xEA, 0xE8, 0x28, 0xDF, 0x03, 0xE2, 0x6E, 0xCD, 0xF0, 0xD0, + 0x83, 0xDA, 0x59, 0xDB, 0xB1, 0xE6, 0x8D, 0xE3, 0xD6, 0xD9, 0x1F, 0xCC, + 0xEE, 0xD7, 0xD4, 0xC1, 0xF7, 0xE3, 0xA5, 0xCF, 0xC7, 0xE9, 0x34, 0xDB, + 0xDC, 0xDE, 0xE5, 0xD6, 0x78, 0xDE, 0xA5, 0xD2, 0x59, 0xF4, 0x5C, 0xD8, + 0xD4, 0xFF, 0x56, 0xE5, 0xAD, 0xFD, 0x33, 0xFA, 0xE1, 0x06, 0x40, 0x10, + 0x92, 0x1E, 0xC7, 0x1C, 0x3A, 0x20, 0x2E, 0x17, 0x07, 0x1D, 0x7C, 0x1C, + 0x31, 0x2B, 0xBC, 0x37, 0xE5, 0x2B, 0x72, 0x45, 0x4A, 0x1C, 0x04, 0x34, + 0x94, 0x1C, 0x2A, 0x25, 0x32, 0x32, 0x12, 0x35, 0x76, 0x35, 0x75, 0x3E, + 0x7C, 0x38, 0xAA, 0x3C, 0xB0, 0x46, 0x9D, 0x3B, 0xBD, 0x39, 0x53, 0x2B, + 0x7D, 0x2E, 0x97, 0x24, 0x45, 0x3C, 0xFF, 0x31, 0xAF, 0x32, 0x2A, 0x2C, + 0x0F, 0x0D, 0xD5, 0x11, 0xE3, 0xFB, 0xF2, 0x03, 0x09, 0x0B, 0x0E, 0x04, + 0x25, 0x23, 0xE4, 0x0B, 0x6A, 0x29, 0xBE, 0x0F, 0xF0, 0x12, 0xD7, 0x01, + 0x06, 0xF6, 0x7A, 0xF1, 0xC1, 0xFD, 0x47, 0x04, 0x69, 0x0B, 0x64, 0x0A, + 0xB9, 0xFA, 0x67, 0xE0, 0x26, 0xFE, 0xCD, 0xD6, 0xB6, 0x11, 0x35, 0xEB, + 0xAE, 0x0A, 0x52, 0xE2, 0xF5, 0xF6, 0x17, 0xD1, 0x91, 0xFE, 0xAE, 0xEB, + 0xC1, 0xFA, 0xC1, 0xFB, 0xBC, 0xE4, 0x5A, 0xEC, 0xB8, 0xF5, 0x61, 0xF5, + 0x92, 0xFF, 0xF9, 0xF2, 0xFF, 0xF0, 0xAE, 0xE0, 0x95, 0xFF, 0x16, 0xF0, + 0x6E, 0x18, 0x18, 0x09, 0x1A, 0x07, 0x2D, 0x04, 0x2F, 0xF6, 0x66, 0x06, + 0x27, 0x04, 0xEC, 0x17, 0xE3, 0x17, 0x59, 0x1D, 0xD5, 0x21, 0x26, 0x1B, + 0x49, 0x1A, 0x8E, 0x17, 0xC4, 0x0A, 0x5E, 0x18, 0x67, 0xFF, 0x70, 0x20, + 0x80, 0xF8, 0xB5, 0x1A, 0xF5, 0xF0, 0x53, 0x04, 0x54, 0xFC, 0x87, 0xFD, + 0x4D, 0x06, 0xF7, 0xF8, 0xAA, 0x00, 0x96, 0xF2, 0x63, 0xED, 0x2C, 0xF2, + 0x20, 0xD5, 0xCE, 0xED, 0xF1, 0xD5, 0x21, 0xEC, 0x57, 0xE4, 0xF6, 0xE7, + 0x38, 0xF2, 0xD8, 0xE8, 0x74, 0xF3, 0x89, 0xEE, 0xA3, 0xEA, 0x0E, 0xF2, + 0x27, 0xE2, 0x42, 0xED, 0x03, 0xD8, 0x23, 0xE0, 0x52, 0xC9, 0x15, 0xD9, + 0x97, 0xC4, 0x64, 0xE8, 0x4E, 0xC7, 0xCD, 0xF6, 0x55, 0xD6, 0x68, 0xF0, + 0x67, 0xF3, 0x5F, 0xEF, 0xCC, 0xE1, 0x22, 0xE4, 0x30, 0xC4, 0x3F, 0xE7, + 0xF8, 0xD8, 0xC6, 0x06, 0x7E, 0xE0, 0x6D, 0xFB, 0x57, 0xCE, 0x5C, 0xD8, + 0xFD, 0xEA, 0x8F, 0xF1, 0xB2, 0x01, 0x38, 0x09, 0xD1, 0xDD, 0x84, 0xE9, + 0xEA, 0xD1, 0x93, 0xE5, 0xB0, 0xE7, 0xE5, 0x01, 0xE2, 0xE7, 0x74, 0x07, + 0xFA, 0xF3, 0x95, 0x0D, 0xCE, 0x1A, 0xAC, 0x17, 0xA5, 0x0D, 0xF9, 0xEA, + 0x71, 0xE1, 0xFE, 0xC2, 0x71, 0xCE, 0xCE, 0xD0, 0x32, 0xB8, 0x7B, 0xCC, + 0x52, 0xA1, 0x75, 0xAB, 0xDE, 0xA5, 0x7D, 0xA6, 0xE2, 0xB4, 0x5B, 0xBC, + 0x33, 0xAC, 0x41, 0xBA, 0x45, 0xAB, 0xA5, 0xB8, 0xD7, 0xBD, 0x86, 0xCD, + 0xD2, 0xBD, 0x22, 0xD0, 0x86, 0xBA, 0x17, 0xC4, 0x5A, 0xC0, 0x9D, 0xB9, + 0x50, 0xC6, 0x23, 0xB7, 0x66, 0xC7, 0x33, 0xC2, 0x11, 0xC7, 0xA2, 0xD2, + 0x15, 0xD4, 0x73, 0xE1, 0xBD, 0xE6, 0x54, 0xDF, 0xD3, 0xE6, 0x69, 0xCB, + 0x73, 0xDC, 0x9B, 0xC5, 0x09, 0xCB, 0x89, 0xC9, 0x8D, 0xB8, 0xB8, 0xC2, + 0x2A, 0xB3, 0x34, 0xB8, 0x54, 0xB8, 0xF3, 0xB6, 0xCD, 0xC9, 0x24, 0xCC, + 0xD9, 0xCD, 0x88, 0xDA, 0xCC, 0xD1, 0xCB, 0xE3, 0xF9, 0xD5, 0x11, 0xE5, + 0xCA, 0xCA, 0x4D, 0xD4, 0x76, 0xDB, 0xF6, 0xE1, 0x3B, 0xF2, 0x9B, 0xEF, + 0x81, 0xF0, 0x86, 0xDB, 0xB4, 0x04, 0xF8, 0xE4, 0xAB, 0x12, 0x89, 0xFC, + 0x57, 0xF9, 0xB2, 0xF3, 0xD1, 0xF7, 0xB9, 0xFF, 0x6F, 0x04, 0x18, 0x1C, + 0x34, 0xE2, 0x60, 0x03, 0xF9, 0xC0, 0x5D, 0xD2, 0xF7, 0xDD, 0xE1, 0xCD, + 0x0E, 0xF1, 0x3C, 0xCD, 0xB7, 0xC8, 0x12, 0xAA, 0x89, 0xB7, 0x7B, 0xA7, + 0x5B, 0xD1, 0xC0, 0xCE, 0xCA, 0xCB, 0xBF, 0xD4, 0x6A, 0xD5, 0x8D, 0xD8, + 0xDD, 0xF8, 0xC0, 0xE4, 0x5C, 0xE5, 0x09, 0xC0, 0xEF, 0xD4, 0xA6, 0xAE, + 0x7B, 0xE1, 0xE8, 0xC1, 0x6A, 0xCD, 0x3A, 0xB7, 0x7E, 0xC3, 0xAE, 0xB3, + 0x34, 0xF1, 0x99, 0xD9, 0x56, 0x12, 0xEE, 0xEB, 0xBA, 0x05, 0xB4, 0xE3, + 0x46, 0xF6, 0xED, 0xEF, 0xDC, 0x04, 0xFE, 0x10, 0x11, 0x18, 0xF4, 0x1D, + 0xBF, 0x22, 0x94, 0x23, 0x09, 0x36, 0x25, 0x39, 0x16, 0x42, 0xAC, 0x3E, + 0x46, 0x49, 0x09, 0x3F, 0xA5, 0x49, 0x9A, 0x45, 0x57, 0x49, 0xC6, 0x53, + 0x49, 0x50, 0x82, 0x61, 0x6F, 0x4A, 0x1F, 0x59, 0x2A, 0x4B, 0xFD, 0x51, + 0xDE, 0x50, 0xE2, 0x4D, 0x4B, 0x47, 0x89, 0x3D, 0xA6, 0x44, 0xB2, 0x3B, + 0x9F, 0x54, 0x59, 0x50, 0x66, 0x57, 0x70, 0x59, 0x52, 0x47, 0x5F, 0x59, + 0x2A, 0x43, 0x07, 0x60, 0x6F, 0x44, 0xC1, 0x5A, 0xA7, 0x39, 0x80, 0x43, + 0xC8, 0x43, 0xBC, 0x40, 0x01, 0x5A, 0xDD, 0x4B, 0xDC, 0x51, 0xC1, 0x45, + 0xA3, 0x45, 0x34, 0x47, 0xF7, 0x34, 0x88, 0x44, 0xEE, 0x2B, 0xAF, 0x44, + 0x6F, 0x48, 0x7D, 0x60, 0x95, 0x4E, 0xE1, 0x55, 0x88, 0x37, 0x7B, 0x23, + 0x59, 0x46, 0x5B, 0x20, 0xE4, 0x54, 0x37, 0x30, 0x66, 0x3E, 0x66, 0x1F, + 0x45, 0x30, 0x68, 0x1A, 0x4C, 0x35, 0x85, 0x35, 0x92, 0x41, 0x33, 0x4B, + 0x45, 0x4E, 0x02, 0x47, 0x1F, 0x59, 0xAD, 0x41, 0x45, 0x4F, 0xFE, 0x33, + 0x37, 0x40, 0x55, 0x24, 0x95, 0x42, 0xCB, 0x2A, 0x4B, 0x38, 0x99, 0x25, + 0xE6, 0x23, 0x88, 0x14, 0x94, 0x23, 0xE7, 0x15, 0xA5, 0x3A, 0x28, 0x2C, + 0x10, 0x45, 0x10, 0x38, 0x33, 0x2E, 0x50, 0x29, 0x72, 0x23, 0xEB, 0x32, + 0x67, 0x21, 0x53, 0x49, 0x94, 0x1A, 0x58, 0x46, 0x44, 0x2A, 0x64, 0x3F, + 0xCD, 0x36, 0xB5, 0x33, 0x06, 0x35, 0x07, 0x29, 0x33, 0x29, 0x1C, 0x23, + 0x31, 0x14, 0xAA, 0x16, 0x63, 0x11, 0xAC, 0x0C, 0x80, 0x0F, 0x2C, 0x0A, + 0x5C, 0xFC, 0x67, 0x09, 0x38, 0xF6, 0xB6, 0x04, 0xC2, 0x08, 0x2A, 0x03, + 0x5E, 0x0E, 0x8E, 0xFF, 0x00, 0xEC, 0x17, 0xEC, 0xAC, 0xD1, 0x33, 0xE3, + 0xB9, 0xD2, 0x6C, 0xE9, 0x9E, 0xE6, 0x35, 0xF3, 0xFE, 0x01, 0xBE, 0xFC, + 0xC8, 0x0B, 0xAE, 0xFD, 0x5C, 0x06, 0x81, 0x04, 0x3A, 0x0C, 0x70, 0x14, + 0x30, 0x2D, 0xCD, 0x1E, 0xAD, 0x34, 0xD1, 0x16, 0xCA, 0x15, 0x21, 0x0B, + 0xA2, 0x14, 0x93, 0x12, 0xD1, 0x30, 0x8B, 0x1E, 0x26, 0x36, 0xE4, 0x1E, + 0x9E, 0x16, 0x18, 0x08, 0xD8, 0xF8, 0xBA, 0xF1, 0x6B, 0x0E, 0x20, 0x07, + 0x43, 0x21, 0x39, 0x17, 0x93, 0x10, 0x88, 0x01, 0x0B, 0x19, 0xF0, 0x02, + 0x3B, 0x37, 0xC7, 0x1C, 0x3F, 0x4B, 0x56, 0x2E, 0x09, 0x56, 0xE3, 0x34, + 0x48, 0x4F, 0x96, 0x29, 0x72, 0x32, 0xA5, 0x04, 0xD6, 0x23, 0x67, 0xDE, + 0x74, 0x18, 0x6A, 0xD6, 0xED, 0xE0, 0xEA, 0xC8, 0xCC, 0xBE, 0xF3, 0xC0, + 0x21, 0xE2, 0xED, 0xDB, 0xBF, 0xFC, 0x5A, 0xE3, 0x72, 0xF5, 0xA7, 0xCE, + 0xA5, 0xF5, 0x32, 0xD2, 0x86, 0x06, 0x63, 0xF9, 0xB2, 0x13, 0xE3, 0x15, + 0x0E, 0x24, 0x71, 0x20, 0x84, 0x2E, 0x7B, 0x22, 0x1E, 0x1C, 0xCB, 0x1A, + 0x5A, 0x14, 0x5B, 0x1D, 0x93, 0x1F, 0xC0, 0x1B, 0x4C, 0x1B, 0x07, 0x11, + 0x9F, 0x09, 0x1D, 0x0B, 0x86, 0x02, 0x2C, 0x02, 0xE7, 0xF9, 0x9B, 0xFA, + 0x2B, 0xDC, 0xDD, 0xF6, 0x41, 0xC5, 0xA8, 0xF5, 0x23, 0xBC, 0xE6, 0xEC, + 0x39, 0xC2, 0x4F, 0xE6, 0x11, 0xDA, 0x71, 0xEC, 0x90, 0xEE, 0x2F, 0xF7, + 0xE8, 0xFF, 0xFB, 0x0D, 0xCF, 0x05, 0xE1, 0x22, 0x11, 0x05, 0x4F, 0x2E, + 0x23, 0x15, 0xDA, 0x3D, 0xF6, 0x23, 0x15, 0x4D, 0x0F, 0x1B, 0xC9, 0x47, + 0x97, 0x08, 0x89, 0x33, 0xC2, 0xFE, 0x0E, 0x2C, 0x48, 0xFB, 0xF2, 0x2D, + 0x9E, 0xFE, 0x87, 0x26, 0xE2, 0xF5, 0x8C, 0x12, 0x3A, 0xE8, 0x22, 0x03, + 0x76, 0xF2, 0x5E, 0x09, 0x74, 0xFF, 0xB6, 0x1E, 0x98, 0xF5, 0xEF, 0x21, + 0x89, 0xDC, 0x7E, 0x08, 0x5E, 0xD7, 0x2F, 0xF8, 0xE8, 0xE6, 0x71, 0xF5, + 0x3C, 0xF1, 0x9A, 0xEE, 0x6F, 0xFA, 0x7C, 0xF2, 0x82, 0xF9, 0x42, 0xF9, + 0xE3, 0xDB, 0xFA, 0xE0, 0xF1, 0xBE, 0x45, 0xBD, 0x69, 0xB2, 0xBC, 0xA8, + 0x52, 0xA1, 0x62, 0xA2, 0xE0, 0xA9, 0x4A, 0xB6, 0x74, 0xCC, 0xB9, 0xC6, + 0xC8, 0xD6, 0xEA, 0xBE, 0x05, 0xDD, 0xA3, 0xBA, 0x22, 0xEF, 0x1F, 0xC9, + 0x37, 0xF9, 0x7B, 0xE7, 0xCE, 0xFD, 0x44, 0x02, 0x47, 0x0C, 0x31, 0x10, + 0xE9, 0x13, 0xD9, 0x0F, 0x2C, 0xF8, 0x06, 0xFE, 0x85, 0xD3, 0xC6, 0xE7, + 0x92, 0xB5, 0x0E, 0xCB, 0x64, 0xA5, 0xD1, 0xAB, 0x83, 0xA7, 0x97, 0xA2, + 0x7E, 0xAF, 0x70, 0xA9, 0xB4, 0xB0, 0x22, 0xAB, 0x5A, 0xAB, 0x99, 0xAD, + 0x3B, 0xA9, 0xF8, 0xAB, 0xFF, 0xA9, 0x70, 0xA6, 0x2E, 0xA7, 0xFA, 0xB0, + 0xE4, 0xA5, 0x3D, 0xC1, 0x29, 0xBA, 0x81, 0xD5, 0xA6, 0xC8, 0x1A, 0xE3, + 0x0A, 0xC3, 0x8C, 0xDC, 0xF8, 0xCD, 0x48, 0xE3, 0x73, 0xE5, 0x07, 0xFB, + 0x80, 0xE7, 0x6B, 0xFF, 0x34, 0xD7, 0xFA, 0xEF, 0x7F, 0xC3, 0x1B, 0xDB, + 0x19, 0xBA, 0x6D, 0xC6, 0x05, 0xC3, 0x85, 0xBE, 0x5E, 0xD7, 0xD4, 0xCC, + 0xD2, 0xD4, 0xEB, 0xDB, 0xBF, 0xB1, 0xD7, 0xD6, 0xFC, 0xC5, 0xC7, 0xE4, + 0xB1, 0xEB, 0x58, 0xE6, 0xBD, 0xC7, 0x06, 0xBD, 0x9A, 0xAC, 0x12, 0xB2, + 0x9C, 0xCD, 0xB0, 0xD0, 0xE6, 0xF1, 0x7B, 0xE9, 0x2A, 0xF9, 0x8D, 0xEF, + 0x21, 0xF4, 0x32, 0xF5, 0x94, 0xEB, 0x11, 0xEF, 0x24, 0xD7, 0xA8, 0xC9, + 0xD4, 0xC2, 0x0A, 0xA8, 0xFF, 0xAF, 0xFB, 0x9D, 0x0A, 0xA4, 0xBE, 0xA5, + 0x92, 0xB1, 0x72, 0xC3, 0xCA, 0xDA, 0xA4, 0xEB, 0x1D, 0xFB, 0x53, 0xFE, + 0x9B, 0xFA, 0x59, 0x01, 0x0B, 0xFD, 0xDE, 0x0C, 0x94, 0x05, 0x93, 0x0E, + 0x01, 0x0D, 0x92, 0x0D, 0x53, 0x1C, 0xC4, 0x1F, 0x98, 0x1E, 0x5F, 0x2E, + 0x8F, 0x0D, 0xDD, 0x19, 0x89, 0x05, 0xC2, 0xEF, 0xBC, 0xFC, 0xBB, 0xD5, + 0x95, 0xE3, 0xD7, 0xD0, 0x04, 0xCF, 0x91, 0xCD, 0x05, 0xD3, 0x55, 0xCC, + 0x22, 0xE1, 0xF0, 0xD0, 0xAB, 0xDA, 0xB8, 0xCB, 0xDD, 0xD3, 0xCA, 0xCE, + 0xA4, 0xE0, 0xE4, 0xE2, 0x76, 0xED, 0x4E, 0xEC, 0x21, 0xEB, 0x82, 0xEE, + 0x21, 0xED, 0xC2, 0xFC, 0xD7, 0xF0, 0x7F, 0x0D, 0xE8, 0xF3, 0x53, 0x19, + 0x89, 0x0E, 0x0A, 0x2B, 0xD6, 0x1D, 0x25, 0x32, 0xEA, 0x0C, 0x9E, 0x19, + 0xE0, 0xFD, 0x65, 0xF9, 0x64, 0xE1, 0x34, 0xDF, 0x2C, 0xC6, 0x00, 0xDD, + 0xC3, 0xCF, 0xB2, 0xF0, 0x91, 0xD6, 0x42, 0xEC, 0xBD, 0xCE, 0x0F, 0xD7, + 0xC7, 0xD3, 0x07, 0xD3, 0x9D, 0xE5, 0xEC, 0xE4, 0x11, 0xE2, 0xED, 0xE4, + 0x19, 0xD6, 0x0A, 0xD4, 0x4B, 0xFE, 0xD3, 0xF0, 0xA2, 0x32, 0x85, 0x1F, + 0xC0, 0x2C, 0x7F, 0x2A, 0x33, 0x1A, 0x78, 0x29, 0x66, 0x0D, 0x94, 0x18, + 0x9F, 0xE4, 0x4A, 0xEC, 0xAF, 0xB9, 0xC3, 0xBF, 0x5C, 0xAD, 0x43, 0xA4, + 0x3E, 0xC3, 0x67, 0xB0, 0x7B, 0xE6, 0xF8, 0xDB, 0x74, 0x18, 0x7C, 0x09, + 0x77, 0x42, 0x60, 0x2E, 0x3F, 0x48, 0x9E, 0x40, 0xA2, 0x40, 0x77, 0x3F, + 0x8E, 0x44, 0x20, 0x3E, 0x9E, 0x50, 0x94, 0x42, 0xF7, 0x40, 0xDA, 0x32, + 0x33, 0x37, 0xB9, 0x18, 0x9C, 0x40, 0x86, 0x04, 0x7B, 0x18, 0xF1, 0xDF, + 0xC7, 0xEA, 0x98, 0xCB, 0xDC, 0xED, 0x56, 0xD8, 0x0A, 0xF5, 0x70, 0xE9, + 0x3A, 0xF8, 0x21, 0xF9, 0xAC, 0x05, 0xAD, 0xF1, 0xC0, 0x10, 0x47, 0xD8, + 0xD6, 0x17, 0x31, 0xD5, 0x99, 0x15, 0x57, 0xE1, 0xCA, 0x1D, 0x55, 0xF4, + 0xBD, 0x2C, 0x90, 0x04, 0x47, 0x3C, 0x74, 0x14, 0xB2, 0x45, 0xAA, 0x28, + 0x74, 0x36, 0xF9, 0x2C, 0xA5, 0x28, 0x80, 0x33, 0x29, 0x21, 0xC7, 0x31, + 0x2A, 0x23, 0x78, 0x1C, 0x03, 0x21, 0x5B, 0x0E, 0x33, 0xF6, 0x2E, 0xE9, + 0x8D, 0xE7, 0x22, 0xDB, 0x83, 0x0C, 0x21, 0x04, 0x2E, 0x07, 0x7F, 0x06, + 0xD3, 0xF0, 0xBC, 0xED, 0x94, 0xFD, 0x4B, 0xF7, 0x4F, 0x08, 0x53, 0x0D, + 0x13, 0xFE, 0x56, 0x0F, 0xFE, 0xEE, 0xB6, 0x04, 0xCC, 0xF8, 0x2C, 0x0D, + 0x8E, 0x1D, 0x05, 0x2D, 0xA7, 0x3F, 0x40, 0x3E, 0x13, 0x43, 0x76, 0x32, + 0xC1, 0x27, 0xCA, 0x26, 0x6F, 0xFD, 0x01, 0x0F, 0x4C, 0xE1, 0x85, 0xDD, + 0xF7, 0xE4, 0x79, 0xC7, 0xD0, 0xF4, 0xD3, 0xDE, 0x59, 0x0D, 0x5F, 0x07, + 0x1F, 0x3B, 0xF4, 0x38, 0xDE, 0x4C, 0x0D, 0x46, 0x49, 0x42, 0x78, 0x39, + 0x2A, 0x43, 0x13, 0x41, 0x7C, 0x3D, 0xAA, 0x47, 0xD7, 0x37, 0xAE, 0x43, + 0x7A, 0x31, 0x8A, 0x2D, 0x3B, 0x21, 0xBB, 0x0E, 0x6B, 0xFF, 0x43, 0xF7, + 0x63, 0xDE, 0x12, 0xE4, 0x5F, 0xE6, 0x18, 0xD8, 0xD5, 0xF3, 0x25, 0xD3, + 0xE3, 0xEA, 0x6E, 0xD5, 0x53, 0xE3, 0xF6, 0xD8, 0x9B, 0xE4, 0xB7, 0xD8, + 0x36, 0xEB, 0x2A, 0xD7, 0xC7, 0xF3, 0xFE, 0xD8, 0x99, 0x02, 0x7E, 0xE2, + 0x15, 0x16, 0x11, 0xF5, 0x83, 0x25, 0xA6, 0x0E, 0x9D, 0x32, 0x37, 0x2F, + 0x24, 0x3A, 0x7C, 0x4E, 0xEC, 0x30, 0x06, 0x58, 0x61, 0x29, 0x48, 0x49, + 0x0B, 0x3D, 0x7E, 0x31, 0x15, 0x43, 0x0B, 0x13, 0x66, 0x2F, 0x8C, 0xFA, + 0x46, 0x1E, 0x17, 0xF2, 0xA7, 0x16, 0xC1, 0xF8, 0x52, 0x26, 0x47, 0x1A, + 0x3A, 0x3C, 0x8B, 0x34, 0x02, 0x32, 0xDC, 0x1A, 0xE8, 0x29, 0x95, 0x02, + 0xBC, 0x3A, 0x8B, 0x0C, 0x90, 0x27, 0x65, 0x01, 0x9F, 0xFE, 0xC4, 0xEB, + 0x7A, 0x0A, 0xC5, 0x06, 0x76, 0x2A, 0x75, 0x25, 0xC9, 0x34, 0x28, 0x1F, + 0x49, 0x34, 0x5D, 0x1A, 0xF7, 0x19, 0x7A, 0x09, 0xF4, 0xED, 0x09, 0xDD, + 0x5C, 0xBC, 0xED, 0xB2, 0xB0, 0x9D, 0xF9, 0xA2, 0x1C, 0xA5, 0x4F, 0xAE, + 0xB4, 0xC8, 0x68, 0xCD, 0x2F, 0x02, 0xD5, 0xFF, 0xCB, 0x33, 0x22, 0x2D, + 0xFC, 0x3C, 0xA9, 0x33, 0xCC, 0x38, 0xAD, 0x3A, 0xFC, 0x3E, 0x36, 0x54, + 0x4F, 0x3D, 0xB8, 0x55, 0x28, 0x3B, 0x59, 0x48, 0x3D, 0x3D, 0x07, 0x42, + 0xA9, 0x40, 0x61, 0x45, 0x5D, 0x2B, 0xE4, 0x2F, 0x13, 0x01, 0x71, 0x0A, + 0xF4, 0xF0, 0xE2, 0x0D, 0xDA, 0xF4, 0x11, 0x1A, 0xBB, 0xFC, 0x01, 0x17, + 0x85, 0x15, 0xA4, 0x1A, 0x3B, 0x2A, 0xFA, 0x17, 0xFB, 0x23, 0xF1, 0x11, + 0xBA, 0x28, 0x08, 0x2A, 0x11, 0x2F, 0xED, 0x48, 0xC5, 0x21, 0xD7, 0x46, + 0xD6, 0x2E, 0x69, 0x48, 0x19, 0x40, 0x6B, 0x4E, 0x2C, 0x39, 0x29, 0x44, + 0x1E, 0x34, 0xC2, 0x3F, 0xE2, 0x33, 0x58, 0x3E, 0xCB, 0x2B, 0xDB, 0x2D, + 0x47, 0x15, 0x8B, 0x13, 0x44, 0xF5, 0x0E, 0xFD, 0x95, 0xDE, 0xEE, 0xFA, + 0x5B, 0xE5, 0xA4, 0x10, 0x53, 0xE8, 0x64, 0x12, 0x57, 0xD1, 0x3E, 0xF2, + 0xAD, 0xE3, 0xD6, 0xF1, 0x24, 0x0F, 0x91, 0x09, 0x23, 0x00, 0xFA, 0xF6, + 0xA9, 0xED, 0xEC, 0xF4, 0x2C, 0xF9, 0x59, 0x1C, 0x19, 0x06, 0xA1, 0x31, + 0xDF, 0x1B, 0xF5, 0x34, 0x69, 0x21, 0xF5, 0x27, 0xF3, 0x02, 0xB9, 0x08, + 0x65, 0xD0, 0x0A, 0xE8, 0x0B, 0xAB, 0xA2, 0xC5, 0x17, 0x9F, 0x2D, 0xA6, + 0x1B, 0xAC, 0x12, 0xA5, 0x0F, 0xC8, 0x61, 0xC2, 0xD6, 0xE2, 0x52, 0xE6, + 0x34, 0xF8, 0xC0, 0xFE, 0x37, 0x0B, 0xA3, 0x18, 0x3F, 0x0D, 0xA5, 0x29, + 0xC0, 0xF5, 0xAC, 0x15, 0x8C, 0xF8, 0xE0, 0x09, 0x81, 0xF6, 0x9E, 0xF8, + 0x9F, 0xDA, 0x6B, 0xE4, 0x76, 0xD1, 0x74, 0xF4, 0xD7, 0xB9, 0x76, 0xEA, + 0xD6, 0x9E, 0xE3, 0xC5, 0x97, 0xB2, 0xEE, 0xC4, 0xD2, 0xD4, 0x98, 0xDC, + 0xD8, 0xD3, 0x0B, 0xE1, 0x91, 0xC0, 0x30, 0xD6, 0xAC, 0xC5, 0xFC, 0xD7, + 0x5F, 0xD0, 0x14, 0xD4, 0xA7, 0xD8, 0xB8, 0xD3, 0x7D, 0xE6, 0x07, 0xF1, + 0xCA, 0xEC, 0x08, 0x15, 0x68, 0xF6, 0x0C, 0x32, 0x9A, 0xF4, 0x68, 0x35, + 0xB7, 0xF4, 0x05, 0x2F, 0x8C, 0xF2, 0xB9, 0x27, 0x56, 0xED, 0x93, 0x1A, + 0xA1, 0xEC, 0x71, 0x10, 0xE7, 0xD5, 0xEC, 0xF3, 0xFF, 0xB9, 0x97, 0xCE, + 0x2F, 0xB8, 0x95, 0xC6, 0x7B, 0xD3, 0x3E, 0xE0, 0x2E, 0xD1, 0xFA, 0xEA, + 0x7E, 0xB0, 0xC6, 0xD5, 0x22, 0xB8, 0x49, 0xD3, 0xB1, 0xDB, 0x11, 0xE1, + 0xA0, 0xE8, 0xF0, 0xDD, 0x18, 0xE2, 0x6D, 0xDD, 0x24, 0xEC, 0xF8, 0xF9, + 0x08, 0x09, 0x9C, 0x26, 0xEC, 0x19, 0x49, 0x34, 0x0D, 0x0B, 0x3B, 0x0D, + 0x64, 0xFD, 0x20, 0xEB, 0xF8, 0xEC, 0x2E, 0xD6, 0x1C, 0xC4, 0xC9, 0xB0, + 0x75, 0xAE, 0x9C, 0x9C, 0xFB, 0xBD, 0x73, 0xAC, 0x1D, 0xEE, 0xAD, 0xDB, + 0x44, 0x22, 0x87, 0x08, 0x08, 0x41, 0x5B, 0x21, 0xDD, 0x40, 0x03, 0x27, + 0x47, 0x29, 0x38, 0x25, 0x21, 0x1D, 0xD9, 0x31, 0xDC, 0x11, 0xC2, 0x29, + 0x3F, 0xFC, 0xC0, 0xFE, 0x4E, 0xE4, 0xA7, 0xD5, 0x84, 0xC6, 0x19, 0xC0, + 0x8D, 0xAA, 0x01, 0xB0, 0xD1, 0x9F, 0xCC, 0xA2, 0xCD, 0xA4, 0x11, 0xA4, + 0x08, 0xA8, 0x3E, 0xAB, 0x93, 0xC4, 0xF5, 0xC5, 0xF3, 0xDE, 0x32, 0xD6, + 0xF3, 0xD5, 0x60, 0xC9, 0xEF, 0xCC, 0xE1, 0xC9, 0x9B, 0xCD, 0xAD, 0xDA, + 0xCE, 0xD2, 0x6D, 0xED, 0x8E, 0xDB, 0x5D, 0xFE, 0x70, 0xF0, 0xDF, 0x15, + 0xF0, 0xEB, 0x6D, 0x15, 0x43, 0xE0, 0xDD, 0x02, 0x3A, 0x05, 0x41, 0x13, + 0xB2, 0x19, 0xC9, 0x16, 0xAF, 0xF9, 0xA2, 0xF7, 0x9C, 0xE4, 0x94, 0xEF, + 0xC2, 0xD6, 0x36, 0xE6, 0x21, 0xC6, 0x9A, 0xD7, 0xDD, 0xDC, 0x17, 0xED, + 0x88, 0xF5, 0x38, 0x00, 0xCE, 0xE5, 0xF9, 0xE5, 0xE0, 0xF9, 0xB6, 0xED, + 0xBD, 0x1A, 0x67, 0x0A, 0x88, 0xF9, 0x91, 0xE8, 0x2A, 0xEA, 0x30, 0xDB, + 0x2A, 0x06, 0x77, 0xFB, 0xEB, 0x13, 0x8F, 0x13, 0x82, 0x11, 0x78, 0x16, + 0xED, 0x0A, 0x8D, 0x02, 0x2F, 0xF8, 0x96, 0xDF, 0xE5, 0xDA, 0x9C, 0xC2, + 0x38, 0xBC, 0x1A, 0xB0, 0xF9, 0xA2, 0x19, 0xA1, 0xF7, 0xB4, 0x0C, 0xBC, + 0x4D, 0xE1, 0xFD, 0xF0, 0x40, 0xFF, 0x74, 0x0F, 0x37, 0x16, 0x89, 0x20, + 0x6E, 0x18, 0x97, 0x1C, 0xE2, 0x0B, 0x7E, 0x0C, 0xF2, 0x08, 0x78, 0x0B, + 0xE6, 0x08, 0x28, 0x0B, 0x2A, 0x05, 0xED, 0xF8, 0xAA, 0x00, 0xAA, 0xE1, + 0x42, 0xEA, 0xD2, 0xCE, 0x51, 0xC6, 0x91, 0xBD, 0x8F, 0xC0, 0x00, 0xC1, + 0x19, 0xD8, 0x22, 0xD8, 0x67, 0xEA, 0xBA, 0xE3, 0x54, 0x06, 0xCF, 0xEC, + 0x5E, 0x1B, 0x2E, 0xEB, 0x78, 0x12, 0x1B, 0xDD, 0xC0, 0x14, 0x05, 0xE4, + 0x81, 0x1A, 0xBB, 0xEF, 0x41, 0x0B, 0x4D, 0xF6, 0x23, 0x0F, 0x93, 0x13, + 0xF1, 0x2C, 0x6F, 0x31, 0x06, 0x34, 0xB9, 0x27, 0xD7, 0x35, 0xEA, 0x28, + 0x54, 0x43, 0x62, 0x3E, 0xEF, 0x3F, 0x14, 0x37, 0xF4, 0x34, 0x41, 0x25, + 0x11, 0x31, 0x5E, 0x1D, 0x81, 0x17, 0x6A, 0x00, 0x1C, 0x08, 0xBF, 0xF1, + 0x47, 0x2B, 0x5A, 0x15, 0xA6, 0x3D, 0xD9, 0x17, 0x7A, 0x28, 0xC0, 0xF5, + 0xBB, 0x35, 0x8D, 0x13, 0xF2, 0x47, 0xB5, 0x39, 0x9A, 0x33, 0xAC, 0x1F, + 0x7F, 0x44, 0xB5, 0x28, 0x37, 0x61, 0x44, 0x55, 0x55, 0x53, 0x9D, 0x56, + 0x28, 0x4B, 0x95, 0x4D, 0xE4, 0x55, 0x70, 0x54, 0x16, 0x43, 0x82, 0x3C, + 0x65, 0x19, 0xF2, 0x07, 0xBE, 0xFC, 0x39, 0xDF, 0x12, 0xEE, 0x61, 0xC8, + 0xD5, 0xF2, 0x60, 0xCB, 0xD6, 0x1C, 0x7C, 0x08, 0x64, 0x4B, 0xAC, 0x54, + 0x6A, 0x5A, 0xA0, 0x63, 0xBF, 0x60, 0x79, 0x4B, 0xEA, 0x65, 0x61, 0x3B, + 0x11, 0x5B, 0xE6, 0x32, 0x5C, 0x40, 0x2F, 0x20, 0x2F, 0x28, 0x87, 0x12, + 0xDD, 0x14, 0x35, 0x0E, 0xC5, 0x02, 0x1F, 0x03, 0x83, 0xF3, 0x57, 0xF3, + 0xA7, 0xE7, 0x87, 0xEA, 0x87, 0xF6, 0x80, 0xF8, 0x7C, 0x12, 0x86, 0x03, + 0xE9, 0x25, 0xA3, 0xFF, 0x68, 0x3B, 0x67, 0x04, 0xB4, 0x44, 0xD5, 0x05, + 0xF0, 0x39, 0xC2, 0x01, 0xB1, 0x31, 0x33, 0x0F, 0x19, 0x31, 0x83, 0x23, + 0x93, 0x37, 0xB6, 0x32, 0x9B, 0x44, 0x3B, 0x42, 0xA3, 0x2D, 0x31, 0x33, + 0xFE, 0x0E, 0x1C, 0x1D, 0xB2, 0x1B, 0x60, 0x27, 0x99, 0x27, 0x1D, 0x21, + 0xE1, 0x25, 0x7E, 0x0C, 0x46, 0x1C, 0xFB, 0x02, 0x51, 0xFD, 0x93, 0xED, + 0xC4, 0x00, 0x58, 0xF6, 0xEB, 0x26, 0x04, 0x1E, 0xAF, 0x1B, 0xEB, 0x1B, + 0x0F, 0xFC, 0x53, 0x0A, 0x9A, 0x10, 0xF9, 0x24, 0x90, 0x24, 0x41, 0x32, + 0x63, 0x0C, 0xEF, 0x0B, 0x5B, 0x05, 0xD6, 0x05, 0xC9, 0x15, 0xFD, 0x26, + 0xA3, 0x27, 0x3F, 0x3D, 0x9E, 0x41, 0x4F, 0x46, 0x42, 0x40, 0x58, 0x3A, + 0x97, 0x11, 0x2E, 0x13, 0xB0, 0xE8, 0x90, 0xEE, 0x7B, 0xD8, 0x6C, 0xDA, + 0x38, 0xC9, 0xDC, 0xC7, 0x33, 0xDB, 0x70, 0xD4, 0x2E, 0x1C, 0x68, 0x13, + 0x6C, 0x4B, 0x76, 0x50, 0xE2, 0x57, 0x93, 0x68, 0x31, 0x5B, 0x59, 0x60, + 0x02, 0x59, 0x32, 0x4E, 0xBD, 0x59, 0xB7, 0x4B, 0xEC, 0x4B, 0xA0, 0x3B, + 0xA1, 0x25, 0xEA, 0x17, 0xF0, 0xFF, 0xC0, 0x04, 0x3E, 0xE4, 0xA9, 0xF4, + 0x4B, 0xD5, 0xFF, 0xDC, 0x15, 0xCD, 0x2D, 0xD0, 0x39, 0xD8, 0xC8, 0xDB, + 0x72, 0xFA, 0x57, 0xEC, 0x5C, 0x0F, 0x33, 0xF3, 0x0B, 0x0A, 0x4C, 0x01, + 0xE9, 0xF5, 0xD2, 0x07, 0x09, 0xE1, 0x2B, 0xFC, 0x88, 0xD5, 0xC1, 0xF7, + 0x92, 0xD7, 0x73, 0xFD, 0xC0, 0xE3, 0x8A, 0xFA, 0x51, 0xF0, 0x25, 0xF8, + 0x57, 0xFA, 0x1A, 0x02, 0x1A, 0x10, 0xE5, 0x12, 0x76, 0x19, 0xE4, 0x15, + 0xCE, 0x06, 0x4A, 0x0E, 0xFC, 0x09, 0x24, 0x15, 0x6E, 0x04, 0xD6, 0xFA, + 0x52, 0xE4, 0xBF, 0xD1, 0x4C, 0xF0, 0x52, 0xEF, 0x99, 0x12, 0x0E, 0x19, + 0x59, 0x09, 0x9E, 0x02, 0x06, 0xFF, 0x79, 0xED, 0x92, 0x22, 0xB3, 0x07, + 0x0F, 0x23, 0xA8, 0xFD, 0x4D, 0xFF, 0x0C, 0xDD, 0x42, 0x13, 0x96, 0xF9, + 0x2B, 0x38, 0xB5, 0x1C, 0xA8, 0x2A, 0x5C, 0x16, 0x3E, 0x14, 0x1B, 0x19, + 0x38, 0x0A, 0x31, 0x1B, 0x7A, 0xEE, 0xB8, 0xF6, 0x78, 0xCD, 0xB6, 0xD4, + 0x60, 0xB5, 0x4F, 0xC4, 0x0F, 0xB0, 0xD5, 0xB9, 0xC2, 0xCD, 0xA6, 0xCD, + 0xEC, 0x01, 0x46, 0x04, 0xE7, 0x24, 0xB2, 0x30, 0x4D, 0x29, 0x90, 0x3E, + 0xDA, 0x1F, 0xFB, 0x3A, 0xF4, 0x20, 0x59, 0x37, 0xBC, 0x28, 0x53, 0x38, + 0x62, 0x0F, 0x40, 0x28, 0x1A, 0xE7, 0x23, 0x12, 0xAA, 0xC8, 0x70, 0xF7, + 0x3F, 0xB4, 0x90, 0xDA, 0xEB, 0xB2, 0xEF, 0xD6, 0xCF, 0xAD, 0x84, 0xD4, + 0xDE, 0xA7, 0x30, 0xCC, 0x77, 0xBF, 0x1A, 0xDE, 0xAC, 0xDB, 0xBD, 0xF6, + 0x53, 0xD9, 0x46, 0xF7, 0x99, 0xCE, 0x95, 0xF4, 0x29, 0xD0, 0x11, 0xF8, + 0x70, 0xDB, 0x21, 0xFD, 0x2D, 0xF3, 0xE0, 0x09, 0xFE, 0x11, 0xCE, 0x16, + 0x8C, 0x1A, 0xC4, 0x0C, 0xB5, 0x0E, 0x7D, 0xFD, 0x01, 0x0F, 0x4D, 0x10, + 0xB7, 0x0C, 0x5D, 0x27, 0x82, 0xFC, 0x6C, 0x28, 0xEE, 0xF1, 0x80, 0x1E, + 0x55, 0xE5, 0xEE, 0x00, 0x1A, 0xCF, 0xF6, 0xDD, 0x1E, 0xD0, 0x2A, 0xE0, + 0x58, 0xE3, 0x8F, 0xEE, 0x96, 0xE1, 0xAB, 0xE1, 0xB6, 0xE6, 0xA1, 0xE7, + 0x9E, 0x09, 0xAF, 0x10, 0x32, 0x12, 0x3D, 0x12, 0x9C, 0xF8, 0x5B, 0xED, + 0x6A, 0xF7, 0x17, 0xF2, 0xE9, 0x07, 0xE8, 0x12, 0x00, 0x0B, 0x10, 0x1E, + 0x18, 0x02, 0x2E, 0x11, 0xE8, 0xF9, 0xC2, 0xF9, 0x9F, 0xE8, 0xA3, 0xD9, + 0xE8, 0xBD, 0xB4, 0xBD, 0x7B, 0x9E, 0xBE, 0xBB, 0xBC, 0xA2, 0x3E, 0xC0, + 0xB2, 0xC9, 0xA8, 0xD3, 0x2D, 0xF7, 0x1A, 0xFC, 0x3F, 0x14, 0x23, 0x21, + 0x49, 0x2E, 0x4F, 0x38, 0x15, 0x33, 0x31, 0x33, 0x78, 0x2A, 0x80, 0x24, + 0x58, 0x2B, 0x5D, 0x1B, 0x9D, 0x18, 0x20, 0x06, 0xC3, 0xF0, 0xB1, 0xEF, + 0x60, 0xE2, 0x79, 0xE8, 0x35, 0xE2, 0x7A, 0xE6, 0x54, 0xCB, 0x87, 0xE2, + 0xFC, 0xBC, 0xF9, 0xE5, 0x69, 0xD1, 0xCA, 0xF5, 0x58, 0xF3, 0xA7, 0x0A, + 0x67, 0xF6, 0x71, 0x02, 0x8E, 0xEC, 0x8A, 0xEC, 0x8E, 0xF8, 0xB2, 0xF2, + 0x7C, 0xF8, 0x49, 0xFE, 0x69, 0xF6, 0x93, 0x09, 0xC5, 0x0B, 0xB0, 0x1D, + 0xD4, 0x20, 0x7C, 0x31, 0x63, 0x11, 0x42, 0x25, 0xCF, 0x03, 0x0C, 0x1C, + 0x28, 0x0E, 0xFE, 0x2E, 0x0A, 0x02, 0xE7, 0x32, 0xC6, 0xF7, 0x11, 0x30, + 0x29, 0xF8, 0x87, 0x20, 0xE4, 0xE6, 0x57, 0xFC, 0x1C, 0xDC, 0x21, 0xDF, + 0x24, 0xEE, 0xF7, 0xE6, 0x70, 0xF5, 0xB6, 0xF8, 0x62, 0xDC, 0x79, 0xF0, + 0xA2, 0xE0, 0x78, 0xFF, 0x37, 0xFD, 0x4E, 0x16, 0x04, 0xEB, 0xF7, 0xF3, + 0xFA, 0xD6, 0x25, 0xD1, 0x14, 0xEF, 0x6B, 0xD9, 0xB6, 0x02, 0x72, 0xE9, + 0x87, 0xFD, 0xDA, 0xED, 0x9C, 0xEB, 0x88, 0xE9, 0x99, 0xCA, 0x2F, 0xD4, + 0x3F, 0xAD, 0xC4, 0xB0, 0xD4, 0xAB, 0x62, 0xA2, 0xDD, 0xA4, 0x54, 0x9D, + 0x4F, 0xA5, 0xB8, 0xA8, 0x59, 0xCA, 0x0B, 0xCE, 0xE7, 0xEF, 0x42, 0xEC, + 0xB6, 0x17, 0x67, 0x0C, 0x55, 0x32, 0x0C, 0x1F, 0x45, 0x2D, 0xC1, 0x1A, + 0x48, 0x2B, 0x04, 0x19, 0x1B, 0x32, 0xC6, 0x12, 0xC9, 0x1C, 0xF5, 0xFA, + 0x90, 0xF1, 0x65, 0xE7, 0x25, 0xD6, 0xF5, 0xE2, 0x1C, 0xDB, 0x4E, 0xE3, + 0xE4, 0xE5, 0xCB, 0xDC, 0xF2, 0xDD, 0x98, 0xD0, 0xC9, 0xE9, 0x09, 0xD9, + 0x5F, 0x0D, 0x24, 0xF5, 0x9D, 0x14, 0x31, 0x01, 0xB9, 0x0B, 0x17, 0xFE, + 0x7B, 0x0D, 0x4C, 0x02, 0x6D, 0xFD, 0x14, 0xFE, 0xF3, 0xF5, 0x50, 0xF7, + 0xB7, 0x0D, 0x32, 0xFA, 0x80, 0x1C, 0x88, 0x05, 0x53, 0x03, 0x69, 0x0C, + 0x1F, 0xF3, 0xB0, 0x11, 0x1D, 0xFE, 0xEB, 0x19, 0xFA, 0xF2, 0x11, 0x0C, + 0xFC, 0xE2, 0xD8, 0xF4, 0xE8, 0xD9, 0xE7, 0xD7, 0x4F, 0xD1, 0x0C, 0xB8, + 0xA1, 0xD8, 0xEA, 0xBC, 0x13, 0xEA, 0x92, 0xD9, 0x37, 0xE4, 0x12, 0xE2, + 0x3A, 0xCD, 0x7D, 0xE5, 0x2B, 0xE8, 0x0A, 0xFE, 0xB9, 0x18, 0xDB, 0x06, + 0xEE, 0x19, 0x85, 0xEF, 0x9A, 0x11, 0xE1, 0xDE, 0x8C, 0x17, 0xCF, 0xD9, + 0x00, 0x1E, 0x0D, 0xD9, 0x67, 0x20, 0xC6, 0xEF, 0x80, 0x12, 0x5A, 0xFA, + 0x20, 0xF4, 0xFD, 0xD8, 0x33, 0xD9, 0x64, 0xBF, 0x2B, 0xBC, 0xE8, 0xAD, + 0x7F, 0xA0, 0x3B, 0x99, 0x9F, 0xAD, 0xAE, 0xAD, 0x27, 0xD6, 0x0B, 0xDC, + 0x82, 0x0E, 0x63, 0xFF, 0x2C, 0x49, 0x85, 0x19, 0x5E, 0x50, 0x62, 0x23, + 0xDB, 0x2F, 0xFF, 0x11, 0x5F, 0x29, 0x0E, 0x0C, 0xC6, 0x22, 0x90, 0x11, + 0x51, 0xF9, 0x65, 0xF3, 0x7C, 0xE2, 0xB7, 0xD4, 0x20, 0xE9, 0x13, 0xCE, + 0x10, 0xDF, 0x3C, 0xC2, 0x69, 0xC5, 0x15, 0xC1, 0x91, 0xCD, 0xEC, 0xE2, + 0xD0, 0xE7, 0xAB, 0x06, 0x3B, 0xF0, 0x48, 0x0D, 0x1E, 0xF2, 0x0E, 0xFE, + 0x7C, 0xFC, 0x0F, 0xFE, 0x5C, 0xFA, 0xF1, 0x0B, 0x8D, 0xEE, 0xCB, 0x01, + 0xDB, 0xF9, 0xF2, 0xF7, 0x04, 0x0F, 0xE3, 0x00, 0x4D, 0x15, 0x7E, 0x08, + 0x95, 0x0F, 0xF4, 0x08, 0x8E, 0x1B, 0xF9, 0x18, 0x93, 0x19, 0x2B, 0x21, + 0xCA, 0xFE, 0x7D, 0x0D, 0x55, 0x00, 0x55, 0x08, 0x38, 0x0B, 0xC1, 0x08, + 0x6A, 0xF4, 0x63, 0xE4, 0x6B, 0xEF, 0xFB, 0xCE, 0xB0, 0x0A, 0x0C, 0xED, + 0x99, 0xFB, 0x7F, 0xE9, 0xC1, 0xE7, 0x95, 0xD6, 0x37, 0x0C, 0x8F, 0x06, + 0x70, 0x1A, 0x2A, 0x27, 0x95, 0xF1, 0x35, 0x06, 0x54, 0xEE, 0x43, 0xF9, + 0x9A, 0x15, 0x73, 0xFB, 0x55, 0x26, 0xB8, 0xEC, 0x0B, 0x25, 0x2F, 0xF3, + 0x44, 0x20, 0xD7, 0x0F, 0xCD, 0xFC, 0xF9, 0x0E, 0x52, 0xCE, 0x94, 0xE6, + 0x2E, 0xBD, 0xE8, 0xC6, 0x88, 0xBA, 0x75, 0xB0, 0x92, 0xCC, 0xB1, 0xB5, + 0xA8, 0xFF, 0x53, 0xEE, 0x61, 0x34, 0x0F, 0x23, 0xC9, 0x48, 0x78, 0x38, + 0x7E, 0x43, 0xD5, 0x3A, 0x54, 0x33, 0xAB, 0x2A, 0x57, 0x18, 0x61, 0x08, + 0x74, 0x0D, 0x60, 0xF1, 0xED, 0x0A, 0x47, 0xF3, 0x3E, 0xF4, 0x6E, 0xF7, + 0xF0, 0xDF, 0x28, 0xF6, 0x7C, 0xD3, 0xEF, 0xEA, 0x45, 0xD5, 0x2C, 0xDD, + 0x9B, 0xF3, 0x97, 0xDD, 0xB4, 0x06, 0x3E, 0xE5, 0xE8, 0x0B, 0xB9, 0xF7, + 0x76, 0x12, 0xDE, 0x07, 0x2A, 0x10, 0xF7, 0x0A, 0x55, 0x04, 0x4B, 0x0C, + 0xB1, 0xF8, 0x3C, 0x0F, 0xC4, 0xFE, 0xBA, 0x11, 0x2D, 0x18, 0xCC, 0x19, + 0xF6, 0x2F, 0xE1, 0x30, 0x59, 0x2D, 0x02, 0x33, 0xA5, 0x2A, 0x74, 0x36, + 0x75, 0x2D, 0xBE, 0x4D, 0x32, 0x28, 0x92, 0x4A, 0x06, 0x33, 0x70, 0x48, + 0x7F, 0x35, 0x63, 0x47, 0xDD, 0x1D, 0x07, 0x29, 0x53, 0x28, 0x31, 0x23, + 0x42, 0x42, 0xDC, 0x3C, 0x52, 0x30, 0xA7, 0x43, 0xA7, 0x1E, 0x4F, 0x40, + 0xDD, 0x3E, 0xDC, 0x50, 0x81, 0x5F, 0xAD, 0x5B, 0x17, 0x59, 0x0C, 0x4E, + 0xF0, 0x58, 0x72, 0x4C, 0x5A, 0x5F, 0x7A, 0x58, 0x05, 0x55, 0x30, 0x52, + 0x9D, 0x51, 0xE7, 0x42, 0x5D, 0x4B, 0x4A, 0x3D, 0xA5, 0x16, 0x15, 0x22, + 0xB9, 0xDF, 0x33, 0xF4, 0x4C, 0xC5, 0xF0, 0xC6, 0xCD, 0xB5, 0x38, 0xAD, + 0xEE, 0xCA, 0xE7, 0xD3, 0xD5, 0x00, 0x31, 0x1B, 0x53, 0x32, 0x55, 0x48, + 0x7D, 0x45, 0x00, 0x55, 0x99, 0x46, 0xC4, 0x53, 0x94, 0x3A, 0xF4, 0x46, + 0x10, 0x23, 0xF9, 0x33, 0x0D, 0x14, 0x0F, 0x1F, 0x3A, 0x01, 0x1C, 0xF1, + 0xFE, 0xEA, 0x48, 0xCF, 0x4C, 0xE8, 0x6A, 0xD6, 0xA7, 0xEA, 0x9F, 0xD6, + 0xAA, 0xED, 0xEB, 0xD4, 0x34, 0xF8, 0x3F, 0xF5, 0x94, 0x02, 0xC3, 0x21, + 0x1A, 0x10, 0x38, 0x31, 0xF1, 0x18, 0xF9, 0x25, 0x6E, 0x1D, 0x4E, 0x1E, + 0x4D, 0x1C, 0x70, 0x1A, 0x0D, 0x18, 0x19, 0x1B, 0xAE, 0x14, 0x9C, 0x21, + 0xDB, 0x23, 0x86, 0x37, 0xA6, 0x2C, 0x94, 0x43, 0x7E, 0x17, 0x2A, 0x38, + 0xE2, 0x21, 0xE2, 0x3F, 0xB6, 0x40, 0x05, 0x40, 0x6E, 0x3C, 0xA8, 0x21, + 0x15, 0x24, 0x2D, 0x0F, 0xEF, 0x08, 0xCC, 0x0C, 0x0B, 0xF4, 0x58, 0xFC, + 0xE1, 0xFF, 0x83, 0xFF, 0xDC, 0x0C, 0xD9, 0x1F, 0xE7, 0xF9, 0xC2, 0x20, + 0x93, 0xFB, 0x72, 0x20, 0xBF, 0x20, 0x2B, 0x36, 0x73, 0x24, 0xDB, 0x22, + 0x77, 0x11, 0x9A, 0x09, 0x93, 0x1A, 0x4D, 0x18, 0xFF, 0x2A, 0x8C, 0x2A, + 0xC3, 0x3D, 0xDE, 0x2A, 0xEC, 0x46, 0xB5, 0x1E, 0x2F, 0x20, 0x38, 0x07, + 0xFF, 0xEB, 0x4B, 0xED, 0x33, 0xCF, 0x4B, 0xE1, 0x10, 0xB0, 0x40, 0xCD, + 0x80, 0xA3, 0xDD, 0xBE, 0x7B, 0xD2, 0x9F, 0xE0, 0xD7, 0x1C, 0x5A, 0x19, + 0xBD, 0x3F, 0x7E, 0x34, 0x03, 0x3F, 0xB0, 0x3F, 0xDC, 0x32, 0x6E, 0x46, + 0x09, 0x10, 0x33, 0x33, 0x3F, 0x02, 0x07, 0x1D, 0xF1, 0x0C, 0xFE, 0x03, + 0xE3, 0xF5, 0x23, 0xD6, 0x35, 0xE4, 0x52, 0xC2, 0x54, 0xE8, 0x7B, 0xCB, + 0xBC, 0xD9, 0xF9, 0xC5, 0x24, 0xD1, 0xEF, 0xCE, 0x78, 0xD5, 0xAA, 0xEB, + 0x35, 0xD4, 0x61, 0xF8, 0x76, 0xD9, 0x02, 0xF4, 0x60, 0xEA, 0x92, 0xED, + 0x8C, 0xF3, 0x86, 0xDF, 0x9F, 0xF1, 0x5E, 0xD5, 0x7F, 0xEF, 0xD8, 0xE4, + 0x65, 0xE8, 0x2A, 0xFB, 0xC8, 0xE1, 0x83, 0x05, 0xB9, 0xE6, 0xFE, 0x01, + 0x73, 0xEC, 0x84, 0xFB, 0xA0, 0xF2, 0xA6, 0x04, 0x69, 0xF6, 0x03, 0x0F, + 0xC7, 0xEF, 0x61, 0x04, 0x0F, 0xE2, 0x66, 0xFC, 0x0E, 0xC5, 0xB7, 0xDB, + 0x4C, 0xB8, 0x62, 0xAD, 0x27, 0xD5, 0x27, 0xBB, 0x84, 0xE4, 0x55, 0xDA, + 0xF6, 0xCD, 0xCB, 0xE3, 0xFC, 0xCB, 0xBD, 0xFF, 0x68, 0xE5, 0xED, 0x1D, + 0x85, 0xE8, 0x4F, 0x0B, 0x66, 0xF3, 0xB2, 0xF4, 0xBB, 0x0B, 0x17, 0xFA, + 0xA7, 0x10, 0x2C, 0x00, 0x59, 0x15, 0x04, 0x03, 0xA8, 0x16, 0x4E, 0x06, + 0x50, 0xFE, 0x39, 0x02, 0xAB, 0xD0, 0x74, 0xE6, 0x3A, 0xAF, 0xC8, 0xBD, + 0xAA, 0x9F, 0x91, 0xA5, 0x7F, 0xA4, 0x66, 0xAB, 0x79, 0xD8, 0x9B, 0xD4, + 0xC4, 0x11, 0x21, 0x0B, 0x80, 0x2E, 0x89, 0x30, 0xFD, 0x47, 0x2F, 0x45, + 0xE5, 0x48, 0xC5, 0x32, 0xD8, 0x33, 0x85, 0x1A, 0x40, 0x22, 0xBC, 0x1C, + 0xAF, 0x0A, 0x75, 0x00, 0xD6, 0xF2, 0x8F, 0xD4, 0x4F, 0xE6, 0x1F, 0xCE, + 0xCE, 0xE1, 0x9C, 0xD1, 0x76, 0xD6, 0x5C, 0xCE, 0x4D, 0xCD, 0x38, 0xD2, + 0xAC, 0xD7, 0x47, 0xDA, 0x93, 0xE6, 0xDD, 0xE5, 0x8F, 0xEE, 0xA9, 0xEC, + 0x5A, 0xFA, 0xED, 0xF1, 0xEF, 0xF9, 0x6B, 0xF1, 0xCC, 0xE4, 0x61, 0xE7, + 0x7F, 0xD1, 0xF8, 0xED, 0xFB, 0xC3, 0x13, 0xF6, 0x3B, 0xC6, 0x00, 0xEF, + 0xD1, 0xC3, 0xBF, 0xE4, 0xB2, 0xBD, 0x05, 0xEC, 0x84, 0xC8, 0x61, 0xFC, + 0x9F, 0xD9, 0x12, 0xF5, 0xA6, 0xDD, 0xCE, 0xDA, 0xB4, 0xCB, 0x7F, 0xBE, + 0x09, 0xB1, 0x80, 0xA5, 0xCB, 0xA7, 0xBE, 0xAC, 0x1B, 0xCC, 0x0F, 0xE0, + 0x63, 0xE2, 0xBE, 0xEC, 0x40, 0xD4, 0x0E, 0xDC, 0x27, 0xE3, 0xA2, 0xFE, + 0xFA, 0x05, 0x3C, 0x13, 0x76, 0x0F, 0xDD, 0xEF, 0xA7, 0x0B, 0x38, 0xE6, + 0x57, 0x18, 0xB8, 0x16, 0x5B, 0x21, 0x94, 0x2A, 0xA6, 0x2B, 0x1F, 0x18, + 0x93, 0x3C, 0xAE, 0x0B, 0x5D, 0x26, 0xE5, 0xE5, 0x9E, 0xF3, 0x9E, 0xB9, + 0x83, 0xC8, 0x08, 0xA9, 0x8B, 0xB6, 0x3B, 0xA7, 0x84, 0xC3, 0xB7, 0xBA, + 0x9E, 0xE6, 0x7B, 0xF3, 0x23, 0x1D, 0x4B, 0x31, 0x6C, 0x44, 0xD1, 0x47, + 0x4A, 0x51, 0xD1, 0x42, 0x6F, 0x3A, 0xB7, 0x31, 0x68, 0x11, 0x1C, 0x27, + 0x43, 0xFD, 0xA8, 0x17, 0x86, 0xE8, 0x78, 0xED, 0x1F, 0xDF, 0xC1, 0xCF, + 0xEB, 0xDD, 0xBF, 0xBD, 0x76, 0xC7, 0x22, 0xA5, 0x96, 0xC4, 0x85, 0xA8, + 0x56, 0xE0, 0x68, 0xCA, 0x39, 0xE2, 0x57, 0xEA, 0xC7, 0xDD, 0x02, 0xFF, + 0x9A, 0xF2, 0xD4, 0xFF, 0x61, 0x0B, 0x26, 0xF4, 0x1F, 0x01, 0x78, 0xDE, + 0xF4, 0xE0, 0x2F, 0xD3, 0x1C, 0xE5, 0xB7, 0xF1, 0x22, 0xE8, 0xA8, 0x0B, + 0x82, 0xE1, 0x6B, 0x0E, 0x16, 0xFB, 0x5D, 0x14, 0x68, 0x16, 0x4B, 0x17, + 0xC7, 0x15, 0x3E, 0x0E, 0xEC, 0x17, 0x32, 0xFB, 0xAE, 0x16, 0x01, 0xE5, + 0x2C, 0xFD, 0xFD, 0xD9, 0xE0, 0xE2, 0x80, 0xD1, 0xDD, 0xD9, 0x2C, 0xCF, + 0x84, 0xDD, 0xA6, 0xD7, 0x38, 0xE3, 0x0D, 0xCD, 0xBD, 0xEE, 0xBB, 0xBF, + 0x23, 0xFF, 0x44, 0xE3, 0xDB, 0xFB, 0xB3, 0x04, 0x13, 0xE2, 0x90, 0xF2, + 0x48, 0xE8, 0x9F, 0xEB, 0xC2, 0x09, 0x35, 0xFE, 0x7D, 0x1B, 0x54, 0x05, + 0x4D, 0x20, 0xF4, 0x02, 0xF5, 0x0E, 0x15, 0xFF, 0x36, 0xDF, 0x6A, 0xE7, + 0x09, 0xBB, 0xCF, 0xC8, 0x25, 0xAA, 0x49, 0xB3, 0x69, 0x9E, 0x21, 0xA0, + 0xBF, 0xC2, 0x7C, 0xB4, 0xCE, 0xF8, 0x7E, 0xF0, 0x35, 0x18, 0x87, 0x21, + 0x16, 0x35, 0x68, 0x41, 0xC1, 0x3B, 0x41, 0x4B, 0xDE, 0x2E, 0x9E, 0x40, + 0xB4, 0x21, 0xEE, 0x35, 0x7A, 0x12, 0xAC, 0x1F, 0x2A, 0x07, 0xCD, 0xF8, + 0x15, 0x03, 0x0D, 0xDB, 0x94, 0x09, 0x93, 0xD3, 0x33, 0x05, 0x7A, 0xD5, + 0x88, 0xEB, 0x86, 0xE6, 0xBE, 0xF3, 0x0D, 0x0F, 0x79, 0x11, 0x4E, 0x22, + 0xDC, 0x19, 0x7A, 0x15, 0x82, 0x25, 0x25, 0x18, 0xAE, 0x2A, 0xED, 0x1A, + 0x02, 0x15, 0x15, 0x01, 0x66, 0x09, 0x7C, 0xFF, 0xFA, 0x15, 0xC6, 0x1C, + 0x29, 0x22, 0xD5, 0x25, 0x74, 0x30, 0xF6, 0x2C, 0x0B, 0x37, 0x38, 0x33, + 0x39, 0x37, 0x84, 0x33, 0x52, 0x37, 0x88, 0x35, 0x08, 0x30, 0xC3, 0x27, + 0x0A, 0x2F, 0x20, 0x16, 0x43, 0x21, 0xF3, 0xFA, 0x26, 0x0B, 0x6D, 0xE1, + 0xB7, 0x0C, 0x9A, 0xF2, 0xE6, 0x17, 0x9E, 0x0F, 0x0C, 0x0C, 0x77, 0x0C, + 0x2E, 0x08, 0x26, 0x0C, 0xBF, 0x25, 0x68, 0x28, 0x75, 0x22, 0x06, 0x28, + 0xF5, 0x01, 0xA2, 0x04, 0xC1, 0x00, 0x9D, 0xF8, 0xDA, 0x06, 0x06, 0x02, + 0xB4, 0xFE, 0x93, 0x06, 0xAB, 0xF7, 0x6A, 0x06, 0x31, 0xF2, 0x9F, 0xF6, + 0xE5, 0xDF, 0x5F, 0xCF, 0xE7, 0xBE, 0x98, 0xB4, 0x46, 0xA7, 0x1C, 0xAA, + 0x6D, 0xA2, 0x0F, 0x9C, 0x7C, 0xB7, 0x15, 0xB1, 0x36, 0xE1, 0x84, 0xE5, + 0x2B, 0x02, 0x77, 0x0C, 0xC8, 0x17, 0xDB, 0x25, 0xE5, 0x28, 0xD7, 0x2D, + 0x95, 0x1F, 0xDD, 0x15, 0x63, 0x02, 0x1C, 0xFC, 0x62, 0xDF, 0x09, 0xF0, + 0xC4, 0xC1, 0x3C, 0xD9, 0x3F, 0xCB, 0x3E, 0xC3, 0x8C, 0xDC, 0x29, 0xBD, + 0x09, 0xD8, 0x4A, 0xBF, 0x5E, 0xE7, 0x9D, 0xCC, 0x05, 0x09, 0x05, 0xE8, + 0xDC, 0x18, 0x4A, 0xFF, 0xFD, 0x1D, 0x33, 0x0C, 0x5A, 0x2B, 0x09, 0x1D, + 0x49, 0x31, 0xF6, 0x19, 0xDC, 0x26, 0x10, 0x03, 0x12, 0x19, 0xE1, 0x05, + 0x60, 0x05, 0x4A, 0x11, 0x4D, 0xFE, 0xD0, 0x13, 0x11, 0x13, 0x7E, 0x28, + 0x4F, 0x24, 0x38, 0x3E, 0xBE, 0x22, 0xBF, 0x3D, 0x7E, 0x24, 0x0C, 0x3A, + 0xC3, 0x2B, 0x5E, 0x2D, 0x6B, 0x1E, 0x1F, 0x09, 0xF0, 0xFC, 0x6C, 0xE3, + 0x1F, 0xE6, 0x50, 0xDB, 0x79, 0xE8, 0x6B, 0xF0, 0xEA, 0xF6, 0xE6, 0xFD, + 0xB6, 0xF5, 0xCE, 0xE8, 0x29, 0xF0, 0x68, 0xE0, 0x58, 0x07, 0xC7, 0x03, + 0xDA, 0x07, 0x59, 0x13, 0xA5, 0xF1, 0x76, 0x10, 0xFB, 0x04, 0x11, 0x1D, + 0x94, 0x21, 0x38, 0x21, 0xFF, 0x2D, 0x06, 0x20, 0xDD, 0x31, 0xC2, 0x1A, + 0x88, 0x27, 0x8E, 0x03, 0x2C, 0x0D, 0x53, 0xE1, 0xE1, 0xEE, 0x27, 0xD1, + 0xAA, 0xD3, 0x21, 0xD5, 0x7D, 0xC8, 0x7C, 0xD2, 0x36, 0xE4, 0xC8, 0xE8, + 0x47, 0x1B, 0xF5, 0x1D, 0x59, 0x49, 0xB7, 0x3B, 0xBF, 0x5B, 0xA1, 0x47, + 0x00, 0x5E, 0x11, 0x5A, 0x64, 0x4E, 0x5F, 0x5A, 0x51, 0x34, 0x5F, 0x4A, + 0xED, 0x1F, 0x0F, 0x36, 0xD1, 0x12, 0xA4, 0x10, 0xDE, 0x09, 0xE6, 0xEE, + 0xD3, 0xFF, 0x42, 0xF1, 0x9E, 0xEF, 0x07, 0xFD, 0x17, 0xED, 0xF3, 0x01, + 0xBE, 0xFC, 0xFB, 0x1B, 0x0A, 0x02, 0x87, 0x32, 0x83, 0x12, 0xFB, 0x30, + 0x42, 0x29, 0x30, 0x27, 0x28, 0x1F, 0xFF, 0x14, 0x7B, 0x03, 0x4A, 0x04, + 0xE8, 0x01, 0xE6, 0x0E, 0xDD, 0x0F, 0x62, 0x2E, 0xC1, 0x14, 0xC2, 0x4C, + 0xFA, 0x1F, 0x0E, 0x58, 0xFF, 0x34, 0x53, 0x50, 0x27, 0x4B, 0x44, 0x50, + 0x8A, 0x57, 0x98, 0x53, 0xAE, 0x59, 0x2D, 0x52, 0x96, 0x4A, 0xD1, 0x45, + 0x4D, 0x37, 0xC3, 0x28, 0xE9, 0x35, 0x8F, 0x18, 0x30, 0x43, 0x92, 0x24, + 0x7F, 0x3E, 0xDE, 0x2D, 0x1C, 0x2C, 0xE0, 0x29, 0xCA, 0x44, 0xA5, 0x3C, + 0x3F, 0x65, 0x83, 0x57, 0x40, 0x55, 0x6D, 0x4E, 0xF8, 0x45, 0xC4, 0x3B, + 0x40, 0x51, 0x4E, 0x3D, 0x6C, 0x4F, 0xC7, 0x3F, 0xC7, 0x55, 0x17, 0x46, + 0xCF, 0x5E, 0x54, 0x44, 0x56, 0x45, 0xF8, 0x23, 0xAC, 0x28, 0x51, 0x0C, + 0x19, 0x0C, 0x36, 0xFD, 0xBD, 0xDD, 0xAE, 0xDF, 0xD8, 0xCF, 0x5A, 0xDF, + 0xB8, 0xF6, 0xC0, 0x00, 0x68, 0x1E, 0x0D, 0x1F, 0xF0, 0x37, 0x33, 0x3C, + 0x64, 0x50, 0xEC, 0x59, 0xB3, 0x54, 0x81, 0x5A, 0x1D, 0x43, 0x15, 0x48, + 0xBD, 0x2B, 0x96, 0x33, 0x90, 0x03, 0x0C, 0x0E, 0x67, 0xD8, 0xC6, 0xE6, + 0xEB, 0xBC, 0xDB, 0xD4, 0x5E, 0xB3, 0x23, 0xD8, 0x48, 0xBE, 0x3B, 0xE2, + 0x7E, 0xD6, 0x30, 0xF3, 0xDE, 0xE6, 0xC4, 0x00, 0x18, 0xF1, 0x5D, 0x06, + 0x39, 0xFA, 0x84, 0x09, 0x59, 0xE9, 0xB4, 0x00, 0x7A, 0xDE, 0xB9, 0xFD, + 0x3A, 0xE8, 0x1C, 0xFC, 0xC7, 0xF2, 0xF9, 0xF2, 0xBE, 0xF8, 0xC0, 0xF6, + 0x67, 0xF5, 0xA1, 0x0B, 0xA9, 0xF1, 0x60, 0x1B, 0x70, 0xF8, 0xB2, 0x1F, + 0xE0, 0x07, 0xBF, 0x2A, 0xB7, 0x08, 0xDC, 0x2C, 0x9D, 0x03, 0xAA, 0x1B, + 0x51, 0x01, 0x1E, 0x02, 0x30, 0xF8, 0xA4, 0xE3, 0x01, 0xF8, 0x51, 0xDB, + 0x24, 0x0F, 0xA9, 0xF9, 0x69, 0x17, 0x72, 0x10, 0x7D, 0x0B, 0xB0, 0x16, + 0x9D, 0x1C, 0xF4, 0x2D, 0x69, 0x33, 0x02, 0x45, 0x79, 0x22, 0x49, 0x3B, + 0x99, 0x18, 0x54, 0x27, 0x76, 0x31, 0x52, 0x27, 0x2D, 0x2C, 0x92, 0x2E, + 0xC7, 0x19, 0x1C, 0x38, 0x1A, 0x27, 0x5D, 0x3A, 0xFA, 0x23, 0xF6, 0x17, + 0x52, 0x07, 0x77, 0xED, 0x53, 0xE6, 0x77, 0xD5, 0xB6, 0xB9, 0xCE, 0xBC, + 0x0B, 0x9D, 0xF4, 0xB1, 0xEC, 0xBB, 0x46, 0xCA, 0xE6, 0x01, 0x27, 0xF2, + 0x9E, 0x30, 0xB8, 0x0B, 0x46, 0x40, 0x1F, 0x1B, 0x52, 0x46, 0xD8, 0x1C, + 0x2F, 0x28, 0x80, 0x03, 0xE1, 0xEC, 0xCC, 0xEF, 0x07, 0xC1, 0x8C, 0xE5, + 0xCC, 0xA9, 0x0D, 0xC6, 0x44, 0xA3, 0x66, 0xAC, 0x3E, 0xA2, 0x1F, 0xA6, + 0xA1, 0xA1, 0x3A, 0x9D, 0x09, 0xB3, 0x3D, 0xAC, 0x30, 0xCC, 0x0C, 0xD1, + 0x70, 0xDA, 0xD5, 0xE7, 0x61, 0xDB, 0x63, 0xEB, 0x64, 0xDA, 0xCA, 0xEA, + 0x30, 0xD6, 0xD2, 0xD9, 0xB9, 0xD1, 0x17, 0xC2, 0xAD, 0xDA, 0x57, 0xD3, + 0xFD, 0xDC, 0x93, 0xFB, 0x1D, 0xE5, 0x53, 0x1E, 0xC4, 0xF3, 0x14, 0x29, + 0x06, 0xF8, 0x5A, 0x26, 0xA1, 0xF9, 0x68, 0x1D, 0xE7, 0xF8, 0xEA, 0x0A, + 0x13, 0xF0, 0x8A, 0x03, 0x01, 0xD1, 0xE4, 0xF2, 0x23, 0xBC, 0xB6, 0xD7, + 0xF8, 0xCA, 0x66, 0xD0, 0xE0, 0xDD, 0x6C, 0xD6, 0x67, 0xE0, 0x03, 0xD9, + 0x18, 0xDD, 0x57, 0xDD, 0x7D, 0xF2, 0xCD, 0xF5, 0x6F, 0x0D, 0x5F, 0x0F, + 0x4C, 0xFE, 0x0D, 0x06, 0x51, 0xEA, 0x97, 0xFC, 0xA1, 0xF4, 0xE8, 0x03, + 0x2B, 0xFA, 0x16, 0xF8, 0xA8, 0xF8, 0x76, 0xEB, 0xEE, 0x00, 0xC3, 0xF4, + 0x5D, 0xFB, 0xD5, 0xEC, 0x7A, 0xDD, 0x53, 0xC8, 0x23, 0xBC, 0x7B, 0xAA, + 0xC7, 0xAC, 0x4E, 0x9D, 0x56, 0xB8, 0xCA, 0xA5, 0x25, 0xE2, 0x8C, 0xD9, + 0x6A, 0x13, 0x9C, 0x16, 0xE3, 0x3A, 0xDE, 0x37, 0x2B, 0x5A, 0x04, 0x4F, + 0xA9, 0x5E, 0x8F, 0x52, 0x06, 0x4F, 0xEC, 0x3C, 0x34, 0x35, 0x37, 0x20, + 0xD9, 0x0E, 0x13, 0xFE, 0x62, 0xF6, 0xBE, 0xE2, 0x65, 0xF2, 0x12, 0xD5, + 0x71, 0xEC, 0x08, 0xD0, 0x2F, 0xEE, 0x97, 0xDB, 0xE2, 0x08, 0x47, 0xF7, + 0x27, 0x1B, 0x33, 0x06, 0x6F, 0x0D, 0x64, 0x04, 0xC8, 0xFF, 0x53, 0x07, + 0xEA, 0xFB, 0xEF, 0x06, 0x57, 0xDE, 0xB1, 0xF0, 0xD3, 0xBF, 0x08, 0xDF, + 0x3F, 0xC7, 0xC6, 0xE0, 0x33, 0xCF, 0x03, 0xE0, 0x90, 0xD6, 0x4E, 0xED, + 0x93, 0xDD, 0xB6, 0xFE, 0x8A, 0xDF, 0x94, 0x0D, 0x90, 0xE6, 0x91, 0x19, + 0x92, 0xE6, 0xDB, 0x12, 0x29, 0xE6, 0x49, 0x0E, 0xC0, 0xDB, 0xC9, 0xF5, + 0x08, 0xD0, 0x48, 0xC8, 0xD9, 0xE2, 0xFB, 0xC0, 0x82, 0xF1, 0x49, 0xD3, + 0x35, 0xE0, 0x93, 0xD5, 0x72, 0xDB, 0xBA, 0xD6, 0xD5, 0xFF, 0xB9, 0xF5, + 0x12, 0x0E, 0xCF, 0x04, 0x0F, 0xF3, 0x06, 0xEB, 0x38, 0xF9, 0x13, 0xEA, + 0x3A, 0x0A, 0x66, 0xF5, 0x10, 0x06, 0x50, 0xF0, 0x6B, 0x05, 0xC4, 0xF5, + 0x83, 0xF8, 0x8C, 0xFC, 0x08, 0xE2, 0xFD, 0xED, 0x65, 0xD9, 0xC2, 0xCD, + 0xAE, 0xCD, 0x6F, 0xAE, 0x87, 0xB0, 0x9A, 0x99, 0xB5, 0xA8, 0xE6, 0x9F, + 0xD8, 0xD1, 0x89, 0xD4, 0xBD, 0x01, 0x87, 0x0D, 0x15, 0x27, 0x7D, 0x2F, + 0x0F, 0x45, 0xFA, 0x3A, 0xB8, 0x3F, 0xF9, 0x25, 0xD5, 0x29, 0x72, 0x0C, + 0x65, 0x1A, 0xE2, 0xFC, 0x72, 0xF9, 0x99, 0xEE, 0x98, 0xD7, 0x15, 0xE8, + 0x0C, 0xDC, 0x26, 0xE6, 0xDF, 0xEC, 0x74, 0xD4, 0x19, 0xEB, 0xE4, 0xC7, + 0x8A, 0xE8, 0xCC, 0xD7, 0x8C, 0xEC, 0xA8, 0xEC, 0xB4, 0xED, 0x60, 0xF9, + 0x67, 0xF0, 0x8A, 0xFC, 0x92, 0xF8, 0x28, 0xEF, 0x19, 0xF6, 0xB7, 0xD4, + 0xA6, 0xED, 0x76, 0xC8, 0x7E, 0xF3, 0x28, 0xCD, 0x9D, 0xFE, 0x04, 0xD8, + 0x64, 0xF9, 0x95, 0xEA, 0x2A, 0xE8, 0xE5, 0xFD, 0x85, 0xE0, 0x6B, 0x05, + 0xE6, 0xD6, 0x31, 0xF6, 0x5C, 0xCB, 0xF6, 0xE1, 0xEF, 0xCE, 0xF8, 0xCE, + 0xD3, 0xD0, 0xF9, 0xAE, 0xCA, 0xC4, 0xD2, 0x9A, 0xC6, 0xC4, 0x88, 0xB1, + 0xF2, 0xCB, 0xAA, 0xC9, 0x98, 0xBB, 0x42, 0xC3, 0xE7, 0xBA, 0x38, 0xC8, + 0xC5, 0xE2, 0x44, 0xE9, 0x75, 0xF4, 0xF9, 0xF7, 0xB0, 0xE4, 0xB8, 0xEA, + 0x0D, 0xEB, 0xD8, 0xF0, 0x85, 0xFB, 0x98, 0x02, 0x17, 0x00, 0xF9, 0x04, + 0x07, 0x10, 0xE6, 0x0C, 0xA8, 0x1C, 0x14, 0x0E, 0x5D, 0x05, 0xA9, 0xF2, + 0x37, 0xDB, 0xEB, 0xD6, 0xE6, 0xBB, 0xB1, 0xC1, 0x6D, 0xAD, 0xC2, 0xB8, + 0x4D, 0xC1, 0xCA, 0xD3, 0xB3, 0xF5, 0xBB, 0x05, 0xEE, 0x26, 0xBF, 0x2C, + 0x28, 0x46, 0x87, 0x3E, 0x0C, 0x5B, 0x12, 0x44, 0xFC, 0x5F, 0x46, 0x3D, + 0x11, 0x50, 0x15, 0x35, 0xF5, 0x31, 0xAD, 0x2B, 0xE7, 0x08, 0x01, 0x0A, + 0x01, 0xEF, 0xBD, 0xE9, 0x87, 0xED, 0x1A, 0xE7, 0xE0, 0xE7, 0xE0, 0xE2, + 0xFA, 0xE9, 0x94, 0xDF, 0x13, 0x01, 0x83, 0xEE, 0x4C, 0x0D, 0x68, 0xF7, + 0xAB, 0x06, 0xF1, 0xF2, 0x2B, 0x04, 0x0A, 0xED, 0x1D, 0x02, 0x69, 0xEB, + 0x47, 0xF9, 0x1C, 0xEC, 0x31, 0xFA, 0xB0, 0xF0, 0xDC, 0x07, 0xDE, 0xF8, + 0x9E, 0x21, 0xBC, 0x0D, 0x8F, 0x2E, 0x65, 0x1E, 0x97, 0x2E, 0x46, 0x2E, + 0x6B, 0x35, 0x48, 0x48, 0x0D, 0x29, 0xE5, 0x3F, 0x5C, 0x15, 0x30, 0x21, + 0x1B, 0x1C, 0x55, 0x0F, 0x89, 0x1B, 0x88, 0xF9, 0x1D, 0x00, 0x07, 0xDC, + 0xD6, 0x04, 0x8E, 0xDD, 0xE1, 0x1B, 0x36, 0xF7, 0x65, 0x03, 0xAD, 0xFD, + 0xCC, 0xF0, 0xD7, 0x0C, 0xF2, 0x0A, 0xF6, 0x2E, 0xDC, 0x0D, 0xDA, 0x23, + 0xF3, 0xF8, 0x73, 0xFF, 0x89, 0x00, 0x4A, 0xFD, 0x83, 0x03, 0x31, 0x00, + 0x3B, 0xF3, 0xEA, 0xFC, 0x15, 0xF1, 0x47, 0x06, 0x79, 0xF0, 0xC0, 0x08, + 0x8B, 0xD4, 0x2D, 0xED, 0x3D, 0xAE, 0x51, 0xC9, 0xB5, 0x9E, 0x29, 0xB4, + 0x1C, 0x9F, 0xDE, 0xA7, 0xA4, 0xAC, 0xE2, 0xB4, 0xDD, 0xD0, 0x93, 0xDE, + 0x6D, 0xF8, 0x36, 0x01, 0x20, 0x13, 0xD1, 0x14, 0x14, 0x24, 0x41, 0x1F, + 0x58, 0x2A, 0x22, 0x13, 0x59, 0x27, 0x73, 0xFC, 0xDC, 0x16, 0x9F, 0xF2, + 0x63, 0xF4, 0xDE, 0xE4, 0xEF, 0xDD, 0x1C, 0xD5, 0x7D, 0xE2, 0xCB, 0xE0, + 0x25, 0xE5, 0xA4, 0xE3, 0x4B, 0xF6, 0xD2, 0xDD, 0x57, 0x0F, 0x35, 0xEF, + 0xEE, 0x0F, 0x3B, 0xFF, 0x1C, 0x07, 0xB0, 0x04, 0xFD, 0x0C, 0xFA, 0x05, + 0xE5, 0x1A, 0xF5, 0x03, 0x69, 0x0B, 0x3B, 0xF9, 0xFE, 0x06, 0xBE, 0xFA, + 0xA7, 0x1D, 0x8B, 0x06, 0xC9, 0x28, 0x25, 0x13, 0xC3, 0x1F, 0x36, 0x1B, + 0x57, 0x15, 0x5B, 0x21, 0x7A, 0x16, 0x2E, 0x39, 0xCB, 0x19, 0xBE, 0x4B, + 0x7B, 0x25, 0xB8, 0x44, 0x6A, 0x29, 0xD5, 0x2B, 0x15, 0x13, 0x32, 0x0F, + 0xAC, 0x01, 0x9A, 0xFD, 0x51, 0x11, 0x0C, 0xFC, 0xAA, 0x19, 0x29, 0xFC, + 0xCA, 0x09, 0x02, 0x02, 0x22, 0x16, 0x35, 0x1F, 0xB7, 0x37, 0x31, 0x39, + 0x6E, 0x35, 0x29, 0x22, 0x46, 0x2C, 0x22, 0x03, 0xFE, 0x3B, 0x97, 0x07, + 0xF4, 0x3D, 0x17, 0x14, 0xAC, 0x31, 0xF5, 0x2B, 0x22, 0x2C, 0x2F, 0x43, + 0x3D, 0x22, 0xE4, 0x2D, 0x6C, 0x06, 0xE2, 0xFB, 0x6D, 0xE2, 0xC3, 0xD1, + 0xB2, 0xC9, 0x81, 0xB8, 0xA2, 0xC0, 0x0F, 0xBF, 0x15, 0xCD, 0x6A, 0xE6, + 0xE4, 0xEC, 0xA5, 0x11, 0xBA, 0x0B, 0x39, 0x25, 0x1F, 0x25, 0xCF, 0x28, + 0xDC, 0x30, 0x31, 0x23, 0x98, 0x2A, 0xB9, 0x16, 0x9E, 0x26, 0x88, 0x21, + 0x63, 0x26, 0xFF, 0x30, 0x1B, 0x1F, 0x8D, 0x29, 0x13, 0x17, 0x40, 0x26, + 0xC0, 0x0F, 0x8B, 0x23, 0xEE, 0xFC, 0xF3, 0x14, 0x18, 0xF4, 0xCB, 0x0D, + 0x44, 0x02, 0x50, 0x16, 0xDE, 0x0D, 0x48, 0x2D, 0x60, 0x17, 0xA4, 0x44, + 0xCB, 0x1F, 0x82, 0x43, 0xA0, 0x21, 0x9B, 0x34, 0xAB, 0x2C, 0x09, 0x2F, + 0x89, 0x3B, 0x5B, 0x2C, 0x9C, 0x46, 0x14, 0x36, 0x1B, 0x59, 0x12, 0x50, + 0x12, 0x56, 0x66, 0x52, 0x64, 0x4C, 0x59, 0x52, 0xA2, 0x56, 0x64, 0x5F, + 0x3B, 0x55, 0x8A, 0x58, 0x98, 0x43, 0xA9, 0x45, 0xE8, 0x33, 0x87, 0x33, + 0x0D, 0x26, 0xEA, 0x22, 0xB0, 0x18, 0x67, 0x15, 0x1C, 0x1E, 0xB0, 0x13, + 0x6C, 0x20, 0x74, 0x0E, 0x85, 0x0C, 0xFD, 0xFA, 0x69, 0x15, 0xAC, 0x04, + 0x97, 0x23, 0x80, 0x14, 0x4D, 0x10, 0x96, 0x05, 0x28, 0x0A, 0x4F, 0x06, + 0x71, 0x18, 0xD6, 0x15, 0x91, 0x26, 0x50, 0x24, 0xC3, 0x2B, 0xB7, 0x35, + 0x4F, 0x27, 0x77, 0x33, 0xDF, 0x17, 0x3E, 0x1A, 0xFF, 0xF6, 0x1F, 0xFB, + 0x0A, 0xDA, 0xCB, 0xE5, 0x9F, 0xCE, 0x84, 0xD0, 0xF8, 0xD8, 0xD7, 0xC6, + 0xA5, 0xFA, 0x06, 0xE1, 0x56, 0x1E, 0xF4, 0x09, 0xD3, 0x3B, 0x30, 0x2D, + 0xAA, 0x5A, 0xF8, 0x4A, 0xE8, 0x5C, 0xFF, 0x54, 0x42, 0x44, 0x1C, 0x46, + 0xF9, 0x37, 0x0F, 0x35, 0x76, 0x28, 0x1B, 0x28, 0xA0, 0x15, 0x06, 0x11, + 0x76, 0x14, 0x64, 0x07, 0x85, 0x08, 0x98, 0x11, 0x1D, 0xF5, 0x51, 0x12, + 0xD9, 0xF2, 0xF5, 0x0C, 0x44, 0xF2, 0x48, 0x0F, 0x70, 0xEF, 0x1C, 0x19, + 0x33, 0xDF, 0x80, 0x10, 0xB2, 0xCF, 0xB0, 0xFC, 0x81, 0xD3, 0x90, 0xF3, + 0xD3, 0xD8, 0xBB, 0xEC, 0xD0, 0xDF, 0x75, 0xEE, 0xED, 0xE4, 0xFF, 0x00, + 0xC8, 0xE3, 0x6C, 0x10, 0x72, 0xE5, 0x1E, 0x10, 0xA0, 0xF3, 0xDA, 0x1D, + 0x13, 0xF9, 0xC5, 0x2F, 0x97, 0xEE, 0x9A, 0x26, 0xF5, 0xF1, 0x19, 0x17, + 0x1D, 0xF5, 0xD0, 0x0F, 0xE7, 0xE0, 0xC3, 0xFE, 0x9D, 0xDD, 0x52, 0xF5, + 0x48, 0xF2, 0x40, 0xFE, 0x48, 0xFF, 0x60, 0xFA, 0xB0, 0x05, 0xC7, 0xE9, + 0xCB, 0x17, 0xA5, 0xF7, 0xFE, 0x1F, 0x6A, 0x16, 0x8C, 0x14, 0x92, 0x0F, + 0x81, 0x26, 0x0C, 0x02, 0x20, 0x3D, 0x31, 0x09, 0xF5, 0x3A, 0x9A, 0x19, + 0x25, 0x40, 0xBB, 0x30, 0xE8, 0x47, 0x58, 0x39, 0x21, 0x37, 0x4F, 0x29, + 0x4F, 0x18, 0x1F, 0x0D, 0xF8, 0xF8, 0x9E, 0xEE, 0x77, 0xDA, 0xB8, 0xD8, + 0xE5, 0xD0, 0x1E, 0xD3, 0xC5, 0xD6, 0xE0, 0xDA, 0xD9, 0xDF, 0xDD, 0xED, + 0x07, 0xF6, 0x68, 0x08, 0xAE, 0x0B, 0xC3, 0x17, 0xBC, 0x0D, 0xBB, 0x06, + 0x79, 0x05, 0x5B, 0xF4, 0x8D, 0x03, 0xF7, 0xF9, 0xA1, 0x0A, 0x04, 0xFA, + 0xA4, 0x0B, 0x73, 0xF0, 0x20, 0x01, 0x71, 0xED, 0x22, 0xE9, 0x09, 0xE5, + 0x93, 0xC5, 0xD0, 0xD5, 0xA0, 0xB7, 0xFD, 0xCA, 0x78, 0xBD, 0xA6, 0xC5, + 0xF4, 0xB3, 0x95, 0xC3, 0xB0, 0xA9, 0xA2, 0xC4, 0x5F, 0xAA, 0x50, 0xC3, + 0x07, 0xA8, 0x3A, 0xB0, 0x0F, 0xB4, 0x3E, 0xA8, 0x73, 0xBE, 0xAD, 0xB4, + 0x70, 0xC2, 0xA2, 0xC9, 0x65, 0xCC, 0x29, 0xDD, 0xF5, 0xD3, 0x6C, 0xE8, + 0x68, 0xE3, 0xF5, 0x00, 0xF6, 0xE6, 0x2C, 0x11, 0x04, 0xE2, 0x4C, 0x10, + 0xCC, 0xE9, 0xF9, 0x03, 0x81, 0xDC, 0x3E, 0xDC, 0x29, 0xC3, 0x3C, 0xC4, + 0xAD, 0xCA, 0xC8, 0xD6, 0x41, 0xD5, 0xCD, 0xEA, 0x0E, 0xCB, 0x3C, 0xE6, + 0x15, 0xD1, 0xEF, 0xDE, 0xAB, 0xE3, 0x9A, 0xE8, 0xE7, 0xDC, 0x77, 0xE7, + 0xB2, 0xD6, 0x4D, 0xE2, 0xC1, 0xE5, 0x57, 0xEB, 0x24, 0xF7, 0x1A, 0xF5, + 0x9E, 0x18, 0xBD, 0x0C, 0x9A, 0x3C, 0x44, 0x22, 0x6E, 0x3E, 0x4C, 0x19, + 0xE2, 0x21, 0xB4, 0x06, 0xC5, 0xFE, 0x56, 0xFB, 0xE0, 0xDA, 0x74, 0xE6, + 0x19, 0xC2, 0xF3, 0xD4, 0x09, 0xC9, 0x05, 0xDB, 0xD1, 0xE1, 0x13, 0xE1, + 0x0E, 0xF9, 0xD9, 0xEC, 0x39, 0x11, 0x7A, 0x0A, 0xA4, 0x2C, 0xA2, 0x1B, + 0x14, 0x36, 0xAB, 0x0F, 0xD6, 0x33, 0xC5, 0x06, 0x5F, 0x34, 0x2E, 0x0D, + 0x5A, 0x1F, 0x2A, 0x00, 0xE3, 0x06, 0x25, 0xED, 0x97, 0xF4, 0x10, 0xE9, + 0x31, 0xD8, 0x2F, 0xDD, 0x99, 0xC5, 0xC3, 0xD4, 0x26, 0xB8, 0xFB, 0xD3, + 0xCE, 0xB7, 0x0F, 0xCB, 0x50, 0xD8, 0x5A, 0xD1, 0xD5, 0xF2, 0xFE, 0xE0, + 0x3A, 0xF2, 0x71, 0xDE, 0x84, 0xEC, 0x9D, 0xD0, 0x68, 0xEF, 0xDC, 0xD2, + 0x38, 0xEE, 0xEA, 0xE7, 0x17, 0xF3, 0x43, 0x01, 0x9F, 0xFF, 0x65, 0x10, + 0x2E, 0x05, 0x3A, 0x11, 0x58, 0x1B, 0x49, 0x18, 0xB8, 0x28, 0xA4, 0x1B, + 0xCC, 0x17, 0xAC, 0x19, 0x7F, 0x08, 0xE7, 0x22, 0x18, 0x01, 0x42, 0x20, + 0xF4, 0x02, 0x11, 0x17, 0xA2, 0x08, 0x29, 0x21, 0x7D, 0x02, 0x46, 0x20, + 0x0A, 0xFC, 0x9C, 0x05, 0xE4, 0x02, 0x46, 0xFF, 0xD7, 0xFE, 0x94, 0x07, + 0x86, 0xE7, 0x3B, 0xF9, 0xAA, 0xDA, 0x77, 0xED, 0x0A, 0xE5, 0xE6, 0xF7, + 0x0F, 0xF6, 0xE2, 0xFD, 0xB9, 0xFE, 0x34, 0xFF, 0x2C, 0xFC, 0x31, 0x09, + 0x60, 0xF6, 0x22, 0x07, 0x74, 0xE9, 0x65, 0xE6, 0x67, 0xD1, 0x40, 0xC5, + 0xAF, 0xB9, 0x6E, 0xC3, 0xAD, 0xA5, 0xC5, 0xB9, 0xBF, 0xB8, 0x18, 0xAF, + 0x35, 0xDD, 0x01, 0xC1, 0xAD, 0xE1, 0x90, 0xD1, 0xBF, 0xE4, 0x77, 0xDD, + 0xC7, 0xF0, 0x41, 0xE6, 0x07, 0xF5, 0x42, 0xDA, 0xEB, 0xFC, 0x53, 0xD0, + 0xB4, 0x0F, 0xAD, 0xDA, 0x38, 0x0F, 0x7C, 0xDC, 0x25, 0x0D, 0x83, 0xDE, + 0x81, 0x26, 0x8A, 0xEB, 0xE6, 0x22, 0x84, 0xF0, 0xC0, 0xFE, 0xD2, 0xF5, + 0x5A, 0xF4, 0x8E, 0xFC, 0xEC, 0xF7, 0x5B, 0xF1, 0x16, 0xF7, 0xE4, 0xE0, + 0xD3, 0xF7, 0x6E, 0xDF, 0x4F, 0xEF, 0x4C, 0xDC, 0x67, 0xE8, 0x51, 0xD7, + 0x1B, 0xEB, 0x16, 0xE0, 0x0E, 0xEB, 0x48, 0xEB, 0x92, 0xEA, 0x7B, 0xF2, + 0x59, 0xEC, 0x07, 0xF6, 0x9D, 0xFC, 0x73, 0xF8, 0xB5, 0x15, 0x86, 0xF5, + 0x14, 0x17, 0xB0, 0xF4, 0x83, 0xFD, 0x2E, 0x04, 0xEC, 0xE9, 0x4C, 0x11, + 0x6A, 0xDE, 0x2A, 0x01, 0x93, 0xDA, 0x4D, 0xEF, 0xD4, 0xEC, 0xB6, 0xFF, + 0x7B, 0xEE, 0xC5, 0x07, 0xA6, 0xD4, 0x45, 0xE8, 0xAD, 0xCB, 0xFB, 0xD3, + 0xB6, 0xCE, 0x33, 0xD6, 0x74, 0xCD, 0x75, 0xD1, 0xEE, 0xD3, 0xD2, 0xD5, + 0xFB, 0xE7, 0xA8, 0xE7, 0xB1, 0xF9, 0x46, 0xE8, 0x8B, 0x0A, 0x04, 0xF0, + 0xE3, 0x2D, 0xFB, 0x1E, 0x81, 0x33, 0xD7, 0x29, 0xFE, 0x11, 0x8F, 0xFD, + 0x71, 0x02, 0x24, 0xEF, 0x9E, 0xF7, 0x0B, 0xF7, 0x51, 0xED, 0x77, 0xF1, + 0x4E, 0xFE, 0xD4, 0xF3, 0xC1, 0x0B, 0x2F, 0x01, 0x12, 0x0F, 0xF0, 0x19, + 0x7C, 0x29, 0x0A, 0x38, 0x87, 0x32, 0xF6, 0x34, 0xE8, 0x1D, 0x55, 0x1F, + 0x2C, 0x1D, 0x46, 0x14, 0xC7, 0x26, 0x39, 0x0D, 0x94, 0x2E, 0xE7, 0x0F, + 0x0E, 0x35, 0x6C, 0x10, 0x70, 0x2A, 0x6C, 0x04, 0xC2, 0x0E, 0xDA, 0xF9, + 0x4E, 0xF5, 0xDA, 0xFF, 0x08, 0xEF, 0x03, 0x05, 0x4B, 0xF2, 0x8A, 0xFE, + 0x51, 0xEB, 0xA4, 0x02, 0x0A, 0xE6, 0x54, 0x07, 0x9B, 0xF5, 0xD8, 0xFF, + 0x4D, 0x06, 0x66, 0xF4, 0x9C, 0x01, 0x11, 0xE9, 0x36, 0x01, 0xB4, 0xEB, + 0x7D, 0x12, 0xBD, 0x03, 0xDE, 0x0D, 0x3D, 0x18, 0x79, 0x0A, 0x7A, 0x1C, + 0xFE, 0x22, 0xA4, 0x10, 0xE5, 0x2B, 0x4C, 0x02, 0xDE, 0x20, 0xC4, 0x05, + 0x7E, 0x14, 0x8D, 0x0B, 0x65, 0xFB, 0x55, 0xF9, 0x79, 0xEE, 0x37, 0xED, + 0xF1, 0xF8, 0x1E, 0xEF, 0x84, 0xFA, 0xFD, 0xD9, 0xAD, 0xF0, 0xDB, 0xC4, + 0x51, 0xE3, 0x40, 0xC1, 0xBD, 0xDD, 0x62, 0xC0, 0x29, 0xDF, 0xC5, 0xC7, + 0xD9, 0xD4, 0x86, 0xD1, 0xF6, 0xD9, 0x38, 0xD7, 0xFF, 0xFC, 0x1D, 0xE3, + 0x8A, 0xFF, 0x86, 0xE7, 0xE2, 0xEA, 0x33, 0xE7, 0x3D, 0xEA, 0x3B, 0xE4, + 0x06, 0xE4, 0xB1, 0xCF, 0x35, 0xD2, 0x01, 0xC5, 0x71, 0xBD, 0x37, 0xCD, + 0x2A, 0xB0, 0x54, 0xDA, 0x9A, 0xB6, 0x86, 0xEE, 0x8E, 0xD0, 0x9F, 0x07, + 0x04, 0xF3, 0x72, 0x17, 0x61, 0xFE, 0x2F, 0x14, 0x4B, 0xFA, 0x4D, 0x0F, + 0xBC, 0x03, 0x87, 0x0F, 0xBB, 0x12, 0x10, 0x14, 0x5E, 0x16, 0xFD, 0x1D, + 0x10, 0x13, 0xF9, 0x26, 0x51, 0x0E, 0x4C, 0x1D, 0x77, 0x0B, 0x6E, 0x05, + 0x5E, 0x06, 0xC5, 0xFA, 0xCD, 0xF6, 0x9F, 0xF9, 0x56, 0xEA, 0x37, 0xFF, + 0x25, 0xE9, 0x9E, 0x07, 0x21, 0xFB, 0xCD, 0x0E, 0xD2, 0x09, 0xEC, 0x07, + 0xFC, 0xFD, 0xDE, 0xF6, 0xFC, 0xEF, 0xF8, 0xF4, 0xA0, 0xF4, 0xEC, 0xF9, + 0x63, 0x0B, 0xA4, 0x05, 0x81, 0x18, 0xDC, 0x12, 0x3C, 0x16, 0x8B, 0x14, + 0xCE, 0x21, 0xB3, 0x15, 0xE8, 0x36, 0x08, 0x16, 0xCF, 0x3D, 0xB3, 0x16, + 0x92, 0x2D, 0x39, 0x1B, 0x25, 0x1F, 0xFB, 0x26, 0x65, 0x1F, 0x7D, 0x37, + 0x97, 0x24, 0xC5, 0x3C, 0xD6, 0x30, 0xB0, 0x3C, 0x4E, 0x2F, 0x17, 0x30, + 0xC1, 0x2E, 0x00, 0x1A, 0x7F, 0x4B, 0xAD, 0x21, 0x37, 0x50, 0xAE, 0x31, + 0x67, 0x30, 0x31, 0x38, 0x14, 0x21, 0x83, 0x48, 0xFD, 0x2B, 0x5E, 0x49, + 0x37, 0x35, 0xF3, 0x32, 0xAF, 0x42, 0xF9, 0x34, 0x61, 0x50, 0x02, 0x3A, + 0xC7, 0x44, 0x4F, 0x21, 0x5D, 0x39, 0xB4, 0x17, 0xA8, 0x2E, 0x74, 0x16, + 0xAE, 0x0C, 0x2A, 0x06, 0x73, 0xEE, 0x25, 0xFC, 0x68, 0xEA, 0x06, 0xFF, + 0x3E, 0xEC, 0x5E, 0xFC, 0xA0, 0xF1, 0xBC, 0x04, 0x60, 0x00, 0x45, 0x20, + 0x7A, 0x0B, 0x92, 0x2C, 0x53, 0x06, 0x72, 0x1D, 0x14, 0xFC, 0x26, 0x04, + 0xDC, 0x03, 0x4D, 0xFC, 0x76, 0x13, 0x06, 0x00, 0x20, 0x14, 0x5B, 0xFF, + 0x4D, 0x0D, 0xDC, 0x07, 0x66, 0x00, 0x60, 0x0C, 0x79, 0xF8, 0xA5, 0x0C, + 0x59, 0x00, 0xAB, 0x17, 0xF0, 0x04, 0x21, 0x1A, 0x8D, 0x0B, 0xC4, 0x0E, + 0xAC, 0x25, 0x86, 0x13, 0xEA, 0x32, 0x3D, 0x27, 0x33, 0x26, 0x19, 0x35, + 0x8A, 0x20, 0xB1, 0x40, 0x95, 0x20, 0x2C, 0x46, 0x35, 0x26, 0x07, 0x50, + 0x83, 0x32, 0x8B, 0x58, 0x45, 0x38, 0xDF, 0x45, 0xCE, 0x33, 0x43, 0x2C, + 0xA0, 0x2C, 0x61, 0x23, 0x0C, 0x2F, 0x5F, 0x2B, 0x0B, 0x24, 0x20, 0x35, + 0x86, 0x14, 0xB5, 0x35, 0xF5, 0x0D, 0xD5, 0x25, 0xF4, 0x09, 0xB3, 0x13, + 0x54, 0x14, 0x61, 0x1B, 0xF1, 0x16, 0xD7, 0x1F, 0xBE, 0x15, 0xB6, 0x16, + 0x52, 0x13, 0x73, 0x15, 0x9D, 0x04, 0x1B, 0x1A, 0xD9, 0x09, 0xC4, 0x19, + 0x3F, 0x28, 0x01, 0x13, 0x6F, 0x35, 0x46, 0x0E, 0xDE, 0x2B, 0xF3, 0x09, + 0x1D, 0x25, 0x73, 0xFF, 0x26, 0x23, 0x1B, 0xFF, 0x88, 0x1D, 0xCB, 0x0B, + 0xEB, 0x0F, 0xB9, 0x02, 0x9E, 0x06, 0xA0, 0xF8, 0x91, 0xF9, 0x09, 0xFB, + 0x2B, 0xF3, 0x5B, 0xFC, 0xC7, 0x05, 0x4C, 0x0C, 0x9A, 0x0D, 0xDE, 0x13, + 0xC5, 0x0B, 0x9D, 0x0A, 0xA1, 0x1B, 0x71, 0x00, 0x81, 0x26, 0xD4, 0xFB, + 0xEF, 0x1A, 0x42, 0x03, 0xE1, 0x0D, 0x58, 0x03, 0x98, 0x0A, 0xE7, 0x01, + 0xD8, 0x09, 0x36, 0x0F, 0xCC, 0x04, 0x2D, 0x16, 0xC4, 0xFE, 0x78, 0x0A, + 0xCF, 0xED, 0xBD, 0xFB, 0xF9, 0xD4, 0x01, 0xFC, 0xE4, 0xD2, 0x57, 0x06, + 0xBC, 0xD7, 0xAA, 0x02, 0xE3, 0xD2, 0x10, 0xF9, 0x6C, 0xDF, 0x8C, 0x08, + 0x96, 0xE8, 0x68, 0x18, 0x55, 0xE0, 0x06, 0x15, 0x5A, 0xEC, 0x2D, 0x18, + 0xA9, 0xFC, 0x64, 0x19, 0x08, 0xF5, 0xB2, 0x18, 0x77, 0xED, 0x3D, 0x25, + 0x5A, 0xFE, 0x2D, 0x2A, 0x95, 0x14, 0x1A, 0x1D, 0x40, 0x24, 0xAB, 0x1A, + 0x5C, 0x22, 0xEF, 0x1A, 0xBA, 0x16, 0xB4, 0x0F, 0x75, 0x17, 0xFD, 0x0D, + 0xC1, 0x0E, 0xFD, 0x10, 0x62, 0x03, 0x2E, 0x0F, 0x8A, 0x00, 0x50, 0x0A, + 0xA5, 0x01, 0xA6, 0xFD, 0x2A, 0x08, 0x06, 0xF4, 0xF8, 0x02, 0x14, 0xEF, + 0xD8, 0xF8, 0x83, 0xF1, 0x1E, 0xF2, 0x4B, 0xF0, 0xD2, 0xF3, 0xB8, 0xE2, + 0xBB, 0x02, 0x7A, 0xE1, 0x55, 0x08, 0x39, 0xE3, 0x0B, 0xF8, 0xEF, 0xD7, + 0xB9, 0xE1, 0xB7, 0xC8, 0xB7, 0xCB, 0x09, 0xC2, 0x07, 0xBA, 0x8F, 0xD0, + 0x1E, 0xB5, 0xC5, 0xE2, 0xA3, 0xB7, 0x5B, 0xDC, 0x00, 0xCD, 0x36, 0xD0, + 0x05, 0xF2, 0x01, 0xD7, 0x19, 0x01, 0xFB, 0xE5, 0x2F, 0xF8, 0x6E, 0xF3, + 0x87, 0xEE, 0x37, 0xFF, 0xE6, 0xEA, 0xC5, 0x00, 0x8F, 0xED, 0x6C, 0xF2, + 0xFC, 0xEE, 0x3F, 0xE5, 0x2B, 0xEF, 0x14, 0xE8, 0x4A, 0xF8, 0x30, 0xEE, + 0xB7, 0x04, 0x53, 0xEA, 0x67, 0xFB, 0x24, 0xE3, 0x0B, 0xE8, 0x0A, 0xE5, + 0x47, 0xE9, 0x2B, 0xED, 0x81, 0xEB, 0x88, 0xED, 0x30, 0xDE, 0x16, 0xE6, + 0xFE, 0xD1, 0xA5, 0xE2, 0x00, 0xD0, 0x5E, 0xE9, 0x1C, 0xD4, 0xAA, 0xF8, + 0xEB, 0xDD, 0x2A, 0xFE, 0x64, 0xDF, 0x4C, 0xF0, 0x50, 0xE1, 0x23, 0xEE, + 0x1E, 0xE7, 0xBF, 0xF5, 0x80, 0xE7, 0x74, 0xF5, 0x6C, 0xED, 0x8F, 0xF7, + 0xF5, 0xE6, 0x9D, 0xFC, 0xD9, 0xD8, 0xE6, 0xFD, 0xC2, 0xE5, 0x7F, 0xF8, + 0xB0, 0xF6, 0x12, 0xF0, 0xEE, 0xF4, 0x48, 0xEE, 0x16, 0xF2, 0x28, 0xEE, + 0x34, 0x02, 0x5A, 0xF8, 0x3B, 0x12, 0x3F, 0x07, 0x6F, 0x05, 0x4C, 0x08, + 0xB2, 0xFE, 0x4C, 0x16, 0xE5, 0x02, 0xD3, 0x28, 0x11, 0xFF, 0x2F, 0x28, + 0x06, 0x0E, 0xA2, 0x1E, 0x46, 0x2E, 0x20, 0x17, 0x49, 0x36, 0x47, 0x19, + 0xA9, 0x33, 0xFC, 0x1A, 0xF9, 0x3C, 0x76, 0x11, 0x53, 0x2F, 0x6F, 0x00, + 0x7D, 0x10, 0xB4, 0xF4, 0x21, 0x04, 0x87, 0xFA, 0x15, 0x02, 0x07, 0x03, + 0xAC, 0xFD, 0x15, 0x00, 0x68, 0xF7, 0x4F, 0xF6, 0x78, 0xFC, 0x2F, 0xF4, + 0xA1, 0x05, 0x19, 0xFD, 0x3D, 0xFE, 0xC0, 0xF8, 0xDF, 0xFE, 0x11, 0xE8, + 0xDE, 0x04, 0xE4, 0xDB, 0x44, 0xF7, 0x7A, 0xDA, 0x25, 0xE8, 0x5E, 0xE0, + 0xB2, 0xEE, 0x36, 0xE1, 0x4A, 0xF7, 0xF0, 0xD8, 0xE8, 0xED, 0x45, 0xCD, + 0xE9, 0xE0, 0x14, 0xBF, 0xCD, 0xD2, 0xAE, 0xBC, 0x45, 0xC8, 0xCD, 0xD0, + 0x39, 0xC7, 0x7C, 0xDE, 0x84, 0xC5, 0xFF, 0xDB, 0x6F, 0xC1, 0xBA, 0xDA, + 0x9D, 0xC8, 0xF2, 0xD7, 0x77, 0xD6, 0x7A, 0xC8, 0xC8, 0xD8, 0xA0, 0xBB, + 0x01, 0xDB, 0x8D, 0xCE, 0x1F, 0xD9, 0xF8, 0xE3, 0xB1, 0xD7, 0x2B, 0xEE, + 0x13, 0xEA, 0xB7, 0x06, 0xA8, 0xF9, 0xFE, 0x0A, 0x9F, 0xF5, 0xA0, 0xF0, + 0xF7, 0xED, 0x57, 0xE4, 0xD8, 0xF0, 0x98, 0xEA, 0x35, 0xF0, 0x23, 0xEF, + 0x51, 0xED, 0x60, 0x08, 0xAE, 0xF4, 0x33, 0x2E, 0x82, 0xFD, 0xE9, 0x37, + 0xD3, 0x0A, 0x56, 0x2C, 0x9A, 0x13, 0xB0, 0x18, 0xBB, 0x09, 0x51, 0x0B, + 0x4F, 0xF2, 0x1F, 0x05, 0xBB, 0xDF, 0x1D, 0x07, 0x25, 0xEC, 0xCA, 0x0E, + 0xB6, 0xFF, 0xFE, 0xFB, 0x8F, 0x03, 0xBB, 0xDF, 0xA1, 0xFF, 0xD9, 0xD4, + 0x89, 0xF2, 0x77, 0xD0, 0xF7, 0xE6, 0x78, 0xD0, 0x49, 0xDD, 0xA3, 0xDD, + 0x89, 0xD0, 0xDD, 0xE8, 0xA0, 0xD2, 0xD2, 0xE2, 0x98, 0xE6, 0x15, 0xDC, + 0x11, 0xF3, 0xA0, 0xD2, 0x40, 0xF0, 0xC1, 0xCB, 0xBE, 0xE8, 0x8B, 0xD3, + 0x81, 0xE8, 0x00, 0xD2, 0xAC, 0xEF, 0x57, 0xCB, 0xBE, 0xF4, 0x0A, 0xCE, + 0xE4, 0xF7, 0xD2, 0xD2, 0x1A, 0x00, 0x57, 0xD5, 0xA1, 0x0D, 0xAB, 0xD5, + 0x79, 0x07, 0xCE, 0xCC, 0xDC, 0xED, 0x65, 0xC8, 0x4A, 0xDB, 0x63, 0xDC, + 0xB4, 0xCE, 0xE9, 0xEA, 0x36, 0xCE, 0x16, 0xE6, 0xF1, 0xE3, 0xE9, 0xE5, + 0x41, 0xF2, 0x05, 0xF4, 0xF4, 0xE7, 0x60, 0xF7, 0xC6, 0xE1, 0xF3, 0xF1, + 0x15, 0xDE, 0x35, 0x01, 0xB4, 0xD3, 0xCD, 0x0E, 0x5C, 0xE5, 0x99, 0x14, + 0x37, 0x0E, 0x3B, 0x1B, 0x43, 0x23, 0xD8, 0x13, 0x6E, 0x24, 0x4B, 0x0A, + 0x93, 0x24, 0x54, 0x01, 0xAC, 0x2C, 0x5F, 0x06, 0x55, 0x32, 0x9E, 0x14, + 0x83, 0x30, 0x09, 0x11, 0x55, 0x2C, 0x78, 0x13, 0xDF, 0x26, 0xC6, 0x1F, + 0x92, 0x25, 0x75, 0x21, 0x73, 0x26, 0x55, 0x20, 0x25, 0x20, 0x77, 0x26, + 0x3D, 0x16, 0x3C, 0x28, 0x2D, 0x23, 0xB5, 0x21, 0xB3, 0x3A, 0x02, 0x1D, + 0x90, 0x39, 0xF2, 0x14, 0x06, 0x2A, 0x35, 0x0B, 0x93, 0x18, 0x68, 0x05, + 0xA7, 0xFD, 0xD8, 0xFA, 0xC7, 0xE6, 0x37, 0xEA, 0x79, 0xD6, 0x1C, 0xD8, + 0x8F, 0xC5, 0x71, 0xD4, 0x59, 0xB6, 0x21, 0xD4, 0xEE, 0xBE, 0xFF, 0xCD, + 0xC4, 0xE0, 0x97, 0xD4, 0x2B, 0xE1, 0xED, 0xD6, 0xD4, 0xC9, 0xA1, 0xD9, + 0x86, 0xCC, 0x77, 0xEA, 0x77, 0xD1, 0x73, 0xEF, 0x92, 0xCD, 0x6E, 0xE7, + 0x82, 0xD7, 0xC0, 0xE5, 0xFD, 0xE9, 0xCC, 0xF1, 0x0B, 0xF8, 0x68, 0xFC, + 0x34, 0x08, 0xB3, 0xFB, 0x94, 0x17, 0xB4, 0xF8, 0xE4, 0x13, 0x6C, 0xFC, + 0xEE, 0x06, 0x8F, 0x08, 0x5A, 0x03, 0x80, 0x07, 0x95, 0xFD, 0x78, 0xF6, + 0xB2, 0xF6, 0x49, 0xF2, 0xC5, 0xF5, 0x98, 0xF3, 0x78, 0xFE, 0x40, 0xF4, + 0xC0, 0x07, 0xAE, 0xF5, 0x03, 0x08, 0xE9, 0xF7, 0xB3, 0x06, 0xBB, 0x02, + 0x85, 0x04, 0x47, 0x08, 0x1E, 0x0C, 0x61, 0x0B, 0xC8, 0x1B, 0xE7, 0x10, + 0x58, 0x18, 0xB9, 0x03, 0xCA, 0x12, 0x2D, 0xFA, 0xA3, 0x17, 0x61, 0xFD, + 0xCF, 0x07, 0x73, 0xEF, 0x44, 0xF6, 0xCC, 0xEA, 0xBA, 0xF5, 0xEA, 0x03, + 0xE8, 0xEE, 0xF5, 0x13, 0x1A, 0xDF, 0xFD, 0x09, 0x52, 0xE1, 0xC0, 0x01, + 0x7E, 0xEE, 0x59, 0xFB, 0x79, 0xEC, 0x4E, 0xEF, 0xAF, 0xEB, 0x03, 0xF2, + 0x01, 0xF7, 0x2C, 0xFD, 0x30, 0x04, 0x0B, 0xFE, 0x43, 0x0E, 0x0E, 0xF8, + 0xCB, 0x14, 0xFB, 0xF5, 0xE6, 0x12, 0x0B, 0xF1, 0x74, 0xFF, 0x94, 0xDB, + 0x03, 0xF3, 0xA1, 0xD3, 0x9B, 0xF6, 0xD6, 0xE5, 0x22, 0xF1, 0x42, 0xF9, + 0x09, 0xE6, 0xD6, 0x06, 0x78, 0xF8, 0x83, 0x19, 0x23, 0x1F, 0x47, 0x21, + 0x14, 0x29, 0xE4, 0x13, 0xD3, 0x21, 0x2B, 0x17, 0x36, 0x1C, 0xE8, 0x26, + 0xDA, 0x17, 0x43, 0x2E, 0x67, 0x18, 0xE6, 0x2E, 0xF2, 0x1A, 0x57, 0x31, + 0xE1, 0x20, 0x8A, 0x35, 0xE2, 0x21, 0x18, 0x24, 0x38, 0x19, 0xF1, 0x09, + 0x99, 0x07, 0xA3, 0xFA, 0x4E, 0xF4, 0x4D, 0xF9, 0x07, 0xE9, 0x81, 0x05, + 0x0A, 0xE7, 0xAF, 0x0C, 0x2C, 0xED, 0x9F, 0x0C, 0x2F, 0xF0, 0x28, 0x0A, + 0x89, 0xEC, 0x9A, 0x04, 0x5A, 0xEA, 0x36, 0xFD, 0x4D, 0xF1, 0x15, 0xFF, + 0xA7, 0xFA, 0x00, 0x0D, 0x7E, 0xFB, 0xDF, 0x1A, 0xCC, 0x03, 0x3C, 0x24, + 0x63, 0x1D, 0xBC, 0x1B, 0x25, 0x33, 0x80, 0xFF, 0x40, 0x38, 0x3A, 0xF0, + 0x9E, 0x2A, 0x61, 0xF5, 0x78, 0x16, 0x7C, 0x02, 0xC7, 0x18, 0x1E, 0x18, + 0xE8, 0x26, 0x78, 0x27, 0x66, 0x30, 0x67, 0x2B, 0x1E, 0x3D, 0x0F, 0x30, + 0x16, 0x43, 0xD1, 0x30, 0x5C, 0x3E, 0xB0, 0x2A, 0xB6, 0x41, 0x7D, 0x36, + 0x2E, 0x46, 0xE4, 0x51, 0x10, 0x43, 0x7C, 0x5A, 0x93, 0x4A, 0xEC, 0x4B, + 0x3D, 0x50, 0x96, 0x37, 0x5D, 0x3F, 0xD5, 0x28, 0xDC, 0x27, 0xCB, 0x19, + 0xD7, 0x1A, 0xC9, 0x0A, 0x0E, 0x13, 0x84, 0x05, 0x48, 0x0A, 0x4F, 0x06, + 0x53, 0x02, 0xCD, 0x08, 0xF1, 0x01, 0xCA, 0x0B, 0x8E, 0x09, 0x77, 0x09, + 0x8C, 0x13, 0xCF, 0xFF, 0xF5, 0x19, 0x52, 0x04, 0x1E, 0x13, 0xE2, 0x1C, + 0xAC, 0x0C, 0x38, 0x29, 0xA0, 0x19, 0x9F, 0x24, 0x77, 0x24, 0x47, 0x22, + 0x1E, 0x1C, 0x97, 0x1D, 0xBA, 0x19, 0x14, 0x14, 0x1B, 0x1C, 0x7A, 0x0D, + 0x41, 0x0B, 0xE2, 0x0D, 0x4C, 0xF3, 0x4B, 0x0E, 0x93, 0xEE, 0x50, 0x0F, + 0x8D, 0xF5, 0xA8, 0x0F, 0x70, 0xF8, 0x4B, 0x08, 0x0D, 0xF8, 0x2D, 0xFF, + 0xF9, 0xF6, 0x47, 0xFF, 0x49, 0xF2, 0x8C, 0x0B, 0x6F, 0xF3, 0x23, 0x1B, + 0xAA, 0xF9, 0xB2, 0x20, 0x14, 0xF6, 0x7B, 0x1F, 0xA5, 0xF3, 0xC6, 0x20, + 0xE0, 0xFC, 0x31, 0x1E, 0xD2, 0x08, 0xC6, 0x13, 0x36, 0x0C, 0x2C, 0x06, + 0x0A, 0x11, 0xB4, 0xFF, 0xA2, 0x1D, 0x64, 0xFF, 0x64, 0x20, 0xF8, 0xFC, + 0x3E, 0x1F, 0x30, 0x07, 0xBF, 0x20, 0x05, 0x1A, 0x76, 0x20, 0x1D, 0x24, + 0x1C, 0x23, 0x7A, 0x2A, 0x2C, 0x2E, 0x29, 0x30, 0xEB, 0x39, 0x1B, 0x2C, + 0xA8, 0x33, 0xE5, 0x22, 0x62, 0x2A, 0x0E, 0x25, 0x6C, 0x37, 0x7A, 0x33, + 0x80, 0x42, 0x9C, 0x34, 0x76, 0x39, 0xA9, 0x25, 0xDE, 0x2D, 0x1A, 0x1E, + 0x33, 0x20, 0xBC, 0x0F, 0xB6, 0x11, 0x9F, 0xF9, 0x5E, 0x09, 0x15, 0xEF, + 0x15, 0x06, 0x18, 0xEF, 0x65, 0x01, 0xEE, 0xF9, 0x96, 0xEF, 0xB1, 0x00, + 0xC5, 0xDB, 0x65, 0xF3, 0xE4, 0xE2, 0xD1, 0xEB, 0x4E, 0xEA, 0xE3, 0xE6, + 0x89, 0xDD, 0x6D, 0xD6, 0x4F, 0xDB, 0xA4, 0xD2, 0x0D, 0xDB, 0x06, 0xD8, + 0x6A, 0xD2, 0xCA, 0xD5, 0x00, 0xD1, 0xC7, 0xD2, 0xEE, 0xD9, 0xB4, 0xD9, + 0xAD, 0xE0, 0x36, 0xE4, 0xC0, 0xE1, 0x3A, 0xE7, 0x74, 0xE3, 0xA8, 0xE1, + 0x36, 0xE6, 0x1A, 0xE3, 0x87, 0xE4, 0x87, 0xEF, 0x5B, 0xD9, 0xC2, 0xF7, + 0x28, 0xD5, 0xAE, 0x02, 0xB4, 0xE0, 0x31, 0x0B, 0xD7, 0xEF, 0xBF, 0x0A, + 0x19, 0xF5, 0xF6, 0x0D, 0x05, 0xF2, 0xC1, 0x18, 0x4C, 0xFB, 0x6E, 0x2B, + 0x7D, 0x0C, 0xC7, 0x3F, 0x87, 0x0E, 0x3C, 0x47, 0x7E, 0x11, 0xBF, 0x3D, + 0x24, 0x1F, 0xB5, 0x2C, 0x19, 0x25, 0x86, 0x1D, 0x06, 0x22, 0x7C, 0x12, + 0xE8, 0x19, 0xF2, 0x0E, 0x8C, 0x11, 0xBF, 0x18, 0x3E, 0x13, 0x61, 0x28, + 0xDF, 0x14, 0x86, 0x2A, 0x5C, 0x0E, 0x7F, 0x27, 0xA0, 0x06, 0x99, 0x26, + 0xBA, 0xFF, 0x29, 0x13, 0x94, 0xF9, 0xB2, 0xFF, 0x5A, 0xF4, 0xEE, 0x08, + 0x47, 0xF1, 0x18, 0x15, 0xD2, 0xF6, 0x4C, 0x0A, 0xEA, 0xFD, 0x57, 0xF0, + 0xEC, 0x00, 0xDE, 0xD7, 0xB5, 0xFE, 0x37, 0xC7, 0x37, 0xE9, 0xC9, 0xBD, + 0xE8, 0xCC, 0xB1, 0xBD, 0xDC, 0xBA, 0xD4, 0xBB, 0xF6, 0xB6, 0xEA, 0xBC, + 0xCC, 0xBF, 0x5E, 0xC4, 0x38, 0xCE, 0xDD, 0xC3, 0xC8, 0xE2, 0xBA, 0xC3, + 0xFB, 0xF1, 0x5A, 0xD1, 0x22, 0xF8, 0x04, 0xE7, 0xD1, 0xFF, 0x1D, 0xF7, + 0xC8, 0x07, 0x40, 0x07, 0x8A, 0x0C, 0xB4, 0x14, 0xC6, 0x0F, 0x96, 0x0E, + 0x73, 0x10, 0xE6, 0x00, 0x4E, 0x07, 0x57, 0xF8, 0x29, 0xFF, 0x37, 0xF4, + 0x0A, 0x03, 0x89, 0xFB, 0x9A, 0x05, 0x5A, 0x0F, 0x99, 0x03, 0x3A, 0x17, + 0xA2, 0x09, 0x18, 0x08, 0x4C, 0x10, 0x46, 0xFA, 0x1C, 0xFC, 0xA3, 0xF3, + 0x8F, 0xDB, 0xE5, 0xF5, 0xDA, 0xD4, 0xB6, 0x05, 0x73, 0xE0, 0x6D, 0x15, + 0xB1, 0xED, 0xAA, 0x19, 0x7F, 0x00, 0x5C, 0x16, 0x89, 0x06, 0x18, 0x13, + 0x1C, 0xFA, 0x82, 0x0D, 0xD3, 0xF2, 0x86, 0xFF, 0x94, 0xF3, 0xA0, 0xF8, + 0x36, 0xF3, 0x84, 0x05, 0x49, 0xEF, 0x66, 0x07, 0xB9, 0xF6, 0x6F, 0xFE, + 0xE1, 0x07, 0xD3, 0x07, 0x52, 0x07, 0xD2, 0x11, 0x2D, 0x02, 0x55, 0x12, + 0xF4, 0x0D, 0x29, 0x13, 0x15, 0x21, 0x2B, 0x18, 0x0C, 0x29, 0xAF, 0x1C, + 0x58, 0x24, 0x18, 0x1B, 0xCB, 0x21, 0x38, 0x21, 0xC2, 0x21, 0xE1, 0x1F, + 0x81, 0x1F, 0x3D, 0x09, 0xAD, 0x15, 0x04, 0xF7, 0xA4, 0x0A, 0xCC, 0xF5, + 0x05, 0x06, 0x48, 0xF7, 0x38, 0xFE, 0x08, 0xEF, 0x41, 0xF7, 0xC1, 0xEA, + 0xD5, 0xEF, 0x74, 0xE9, 0x36, 0xE8, 0xA1, 0xDC, 0xAC, 0xE8, 0x47, 0xD3, + 0xC1, 0xF0, 0xFB, 0xDC, 0x62, 0xFC, 0x49, 0xE8, 0xD1, 0x07, 0x71, 0xEB, + 0xD9, 0x0A, 0x7F, 0xEB, 0x0E, 0x01, 0x67, 0xE6, 0x0E, 0xF6, 0xCB, 0xE7, + 0x6D, 0xEB, 0x43, 0xF2, 0xF5, 0xE7, 0xD3, 0xF8, 0xBD, 0xEB, 0x67, 0xF2, + 0x8E, 0xEF, 0x98, 0xE6, 0x0E, 0xFB, 0x3B, 0xE4, 0xA6, 0xFF, 0x86, 0xE2, + 0x65, 0xF7, 0x7C, 0xE4, 0xC0, 0xED, 0x1A, 0xF3, 0xEE, 0xE7, 0x8A, 0x01, + 0x1D, 0xE6, 0x6B, 0x05, 0xBB, 0xE0, 0xAF, 0x01, 0xF6, 0xE1, 0x8B, 0xFE, + 0x03, 0xEF, 0xCF, 0xFB, 0xAA, 0xFC, 0xAB, 0xF8, 0xD9, 0x02, 0x55, 0xF3, + 0xCF, 0x07, 0xCF, 0xF0, 0x92, 0x0D, 0x3C, 0xF6, 0xB7, 0x04, 0x9C, 0xF5, + 0xF0, 0xFC, 0xEC, 0xED, 0x8E, 0xFC, 0xF5, 0xE8, 0x42, 0xEC, 0xE5, 0xDC, + 0x56, 0xE8, 0xEF, 0xD3, 0x9F, 0xF5, 0xD0, 0xDD, 0x83, 0xEB, 0x7A, 0xEA, + 0xAD, 0xD9, 0xED, 0xEC, 0x52, 0xDE, 0x11, 0xEC, 0x2F, 0xF4, 0x6F, 0xF4, + 0x47, 0x06, 0xD0, 0x02, 0xBD, 0x10, 0x2E, 0x12, 0x84, 0x17, 0x97, 0x24, + 0xD1, 0x0D, 0x6E, 0x29, 0xDE, 0x04, 0x5E, 0x21, 0x03, 0x11, 0x62, 0x1B, + 0x63, 0x15, 0x13, 0x16, 0x76, 0x06, 0xD6, 0x0C, 0x49, 0x00, 0x6C, 0xFF, + 0x3D, 0x05, 0x76, 0xF8, 0xE2, 0x02, 0x4B, 0xFA, 0x9C, 0x03, 0x07, 0x02, + 0x1A, 0x04, 0xAA, 0x08, 0x13, 0xF8, 0x42, 0xFF, 0x8E, 0xF3, 0xE1, 0xED, + 0x7B, 0xFA, 0x24, 0xE0, 0x63, 0xFA, 0xA3, 0xE0, 0xB8, 0xF2, 0x59, 0xF4, + 0x16, 0xF0, 0xB4, 0x03, 0x19, 0xEC, 0xC7, 0xFE, 0x88, 0xE6, 0x43, 0xF4, + 0xD9, 0xED, 0x75, 0xE8, 0x77, 0xF0, 0x73, 0xD4, 0x22, 0xE4, 0x53, 0xCA, + 0x46, 0xDA, 0x95, 0xCB, 0x56, 0xD9, 0x43, 0xCA, 0x68, 0xD8, 0xA4, 0xCF, + 0x9A, 0xD2, 0x38, 0xD1, 0xEF, 0xD6, 0x82, 0xC8, 0xFF, 0xE1, 0x18, 0xCA, + 0x23, 0xE6, 0x9A, 0xDA, 0x14, 0xF1, 0xE9, 0xF1, 0x5E, 0x02, 0x07, 0x05, + 0xA8, 0x07, 0x6C, 0x15, 0x13, 0x06, 0x6D, 0x23, 0xC2, 0x07, 0x99, 0x16, + 0xFD, 0x09, 0x35, 0xFC, 0xC5, 0x10, 0x3B, 0xF9, 0x06, 0x18, 0x64, 0xFC, + 0x1D, 0x1A, 0xDE, 0xFD, 0x76, 0x20, 0xA4, 0x0E, 0x26, 0x32, 0x1F, 0x1F, + 0x86, 0x37, 0xA8, 0x1B, 0xB2, 0x29, 0xE2, 0x1C, 0x95, 0x21, 0xC7, 0x2A, + 0x10, 0x1F, 0xA9, 0x27, 0x23, 0x21, 0x2B, 0x1F, 0xB2, 0x26, 0x26, 0x23, + 0xDB, 0x23, 0xD5, 0x25, 0x8F, 0x18, 0xC8, 0x16, 0x9F, 0x0D, 0x09, 0x02, + 0x14, 0x03, 0xD8, 0xF3, 0x26, 0xF4, 0x2B, 0xE1, 0xEF, 0xDE, 0xED, 0xD3, + 0xAC, 0xCC, 0x8E, 0xD4, 0x56, 0xC1, 0xA4, 0xCD, 0x71, 0xB7, 0x8E, 0xBE, + 0xF2, 0xB6, 0xE1, 0xBC, 0x53, 0xBE, 0x45, 0xC0, 0x1B, 0xC9, 0xC0, 0xBC, + 0x3B, 0xD9, 0x10, 0xBF, 0x3B, 0xE1, 0xAC, 0xC5, 0xDA, 0xDD, 0xC0, 0xC5, + 0xFE, 0xD9, 0x84, 0xC2, 0x60, 0xD8, 0x30, 0xC2, 0xE8, 0xD3, 0x7F, 0xC1, + 0x3B, 0xC9, 0xDB, 0xC0, 0xFC, 0xBF, 0x8D, 0xC6, 0x7C, 0xC6, 0x22, 0xCD, + 0xAB, 0xDB, 0x5F, 0xD1, 0x26, 0xE4, 0x61, 0xCF, 0xA5, 0xDA, 0x29, 0xCA, + 0x99, 0xD0, 0x16, 0xCD, 0x54, 0xC8, 0x88, 0xD4, 0xF8, 0xC2, 0xB5, 0xDB, + 0x1C, 0xCC, 0x11, 0xE8, 0x3E, 0xE0, 0x1E, 0xF6, 0x54, 0xEB, 0xE3, 0xF6, + 0x4F, 0xF4, 0x00, 0xF9, 0x80, 0xFA, 0x4B, 0x07, 0xAE, 0xF5, 0x80, 0x11, + 0xBB, 0xEF, 0x8E, 0x0E, 0x2E, 0xF5, 0xDC, 0x0A, 0xC8, 0x06, 0x1F, 0x0A, + 0x93, 0x10, 0xF7, 0xFF, 0x55, 0x16, 0xB7, 0xF9, 0x0A, 0x1E, 0x24, 0x03, + 0xF3, 0x12, 0xA4, 0x05, 0xC2, 0x01, 0xF6, 0xF9, 0xA9, 0x03, 0xCC, 0x01, + 0xA2, 0x03, 0x25, 0x17, 0x11, 0xFD, 0x4A, 0x19, 0x8E, 0x0B, 0x19, 0x18, + 0x4C, 0x25, 0xFC, 0x17, 0x03, 0x2C, 0x36, 0x08, 0xDA, 0x26, 0xEA, 0xFF, + 0x7E, 0x1F, 0x14, 0x08, 0x40, 0x0D, 0x27, 0x08, 0x4E, 0x05, 0x8B, 0x04, + 0xE7, 0x0B, 0x8F, 0xFE, 0xA7, 0x04, 0xD4, 0xF0, 0x6D, 0xF5, 0x95, 0xEC, + 0x7A, 0xF4, 0xE1, 0xED, 0xEF, 0xF8, 0xE4, 0xED, 0x6F, 0xF7, 0x3F, 0xF6, + 0xDD, 0xFF, 0xC7, 0xFE, 0xCB, 0x13, 0x43, 0x01, 0x62, 0x17, 0x27, 0xFF, + 0x60, 0x10, 0x0C, 0x04, 0x35, 0x0E, 0x20, 0x17, 0xBF, 0x04, 0xE9, 0x24, + 0xCF, 0xF5, 0x82, 0x25, 0x7E, 0xF9, 0x14, 0x26, 0x3F, 0x07, 0xD6, 0x27, + 0xC9, 0xFD, 0xFC, 0x1D, 0xD7, 0xF5, 0xC0, 0x0F, 0xCA, 0x01, 0xDD, 0x08, + 0x1F, 0x0A, 0x65, 0x0E, 0xF4, 0x09, 0xD5, 0x1B, 0xD8, 0x0A, 0x86, 0x27, + 0xF4, 0x0F, 0x08, 0x34, 0x9D, 0x16, 0xC3, 0x3B, 0x25, 0x29, 0xE8, 0x3C, + 0x0C, 0x3F, 0xE8, 0x3E, 0xB3, 0x43, 0x50, 0x44, 0x0F, 0x3D, 0xF7, 0x49, + 0xBE, 0x33, 0x90, 0x42, 0x2E, 0x33, 0x79, 0x3D, 0x6F, 0x38, 0xC0, 0x3D, + 0x29, 0x40, 0xB3, 0x2C, 0x94, 0x4D, 0x14, 0x1E, 0xB4, 0x4A, 0x6A, 0x1D, + 0x9D, 0x3E, 0x71, 0x20, 0xE7, 0x38, 0x4D, 0x1C, 0x40, 0x35, 0x67, 0x18, + 0x58, 0x34, 0xB7, 0x1F, 0x37, 0x2B, 0x10, 0x1A, 0x49, 0x1D, 0x12, 0x10, + 0xAC, 0x21, 0xB1, 0x1F, 0xC8, 0x28, 0xA8, 0x2B, 0x55, 0x1E, 0x8D, 0x28, + 0x55, 0x10, 0x9F, 0x2A, 0xA5, 0xFD, 0xC3, 0x1A, 0x9C, 0xF7, 0x83, 0x01, + 0x15, 0xFC, 0x47, 0xF8, 0xA2, 0xEF, 0x1F, 0xF8, 0x92, 0xEE, 0x5E, 0x07, + 0x5C, 0x03, 0xF9, 0x1B, 0xAB, 0x10, 0xB8, 0x20, 0x9D, 0x1B, 0x84, 0x1B, + 0x23, 0x2D, 0x53, 0x1B, 0xD2, 0x2E, 0xEA, 0x19, 0xCC, 0x27, 0xFD, 0x15, + 0xB6, 0x2C, 0x1E, 0x1C, 0x3F, 0x2E, 0x28, 0x26, 0xC2, 0x20, 0x98, 0x2A, + 0xE2, 0x15, 0x2B, 0x2A, 0x42, 0x1A, 0xFE, 0x28, 0xFE, 0x20, 0x3E, 0x26, + 0x37, 0x1E, 0xAA, 0x22, 0x86, 0x15, 0xEF, 0x1E, 0x2F, 0x12, 0x5C, 0x19, + 0x80, 0x17, 0xBB, 0x14, 0xD5, 0x0F, 0x71, 0x08, 0xE8, 0xFB, 0xB0, 0xFB, + 0x1D, 0xF5, 0x26, 0x04, 0x28, 0xF5, 0xA5, 0x0F, 0x73, 0xF6, 0x9F, 0x12, + 0x13, 0xFC, 0xCF, 0x16, 0xA7, 0x00, 0x08, 0x13, 0x8D, 0x09, 0x0A, 0x0F, + 0xB6, 0x06, 0xB8, 0x09, 0xC7, 0xF6, 0x7F, 0xFC, 0x3A, 0xF7, 0x3D, 0x04, + 0x88, 0xF5, 0x45, 0x09, 0x11, 0xF2, 0x39, 0xF7, 0x2F, 0x08, 0xAC, 0xFA, + 0x6B, 0x15, 0x43, 0x07, 0xD3, 0x00, 0xAD, 0xFC, 0x31, 0xF2, 0x74, 0xF7, + 0x1D, 0xF8, 0xD4, 0x00, 0x35, 0xF5, 0x31, 0x04, 0xA1, 0xF6, 0x53, 0x07, + 0x69, 0x0C, 0x0C, 0x12, 0x44, 0x1F, 0x2A, 0x1C, 0xEA, 0x2B, 0xC3, 0x17, + 0x11, 0x32, 0xE3, 0x09, 0x7D, 0x24, 0x2C, 0x04, 0xBD, 0x0A, 0xBA, 0x06, + 0xD4, 0xFA, 0xCD, 0x09, 0xAC, 0xF6, 0xE1, 0x02, 0xD2, 0xFA, 0x97, 0xFA, + 0xAE, 0x09, 0x05, 0xFC, 0x6E, 0x11, 0x23, 0xFC, 0x1F, 0x06, 0x4E, 0xF5, + 0x34, 0x01, 0x74, 0xF9, 0x7A, 0x0B, 0xE0, 0x0B, 0x16, 0x09, 0xC1, 0x13, + 0x8E, 0xFB, 0xE6, 0x12, 0xA3, 0xFD, 0xE9, 0x0A, 0x43, 0xFC, 0xCD, 0xEF, + 0x41, 0xE5, 0x17, 0xDA, 0xA9, 0xDA, 0x79, 0xDC, 0x37, 0xDB, 0xF7, 0xE0, + 0xC6, 0xD8, 0x6D, 0xE5, 0xE2, 0xD7, 0xD2, 0xE9, 0x9C, 0xD4, 0xCC, 0xDE, + 0xE1, 0xD2, 0x42, 0xD4, 0xC3, 0xD2, 0x9D, 0xD3, 0x2C, 0xD5, 0xF3, 0xD2, + 0xA6, 0xD6, 0x1C, 0xD1, 0x34, 0xD2, 0xD5, 0xD6, 0x29, 0xD8, 0x60, 0xE4, + 0xB3, 0xE7, 0xDE, 0xE9, 0x1A, 0xF4, 0xAA, 0xF3, 0xE5, 0xF8, 0x1D, 0x04, + 0x8A, 0xEF, 0xEA, 0xFD, 0x81, 0xE8, 0x2D, 0xF3, 0xEA, 0xF1, 0xCF, 0x04, + 0x46, 0xFE, 0x34, 0x1D, 0x7E, 0xFD, 0x1B, 0x1F, 0xD0, 0xFC, 0xB1, 0x1E, + 0xEC, 0x08, 0x15, 0x26, 0xDB, 0x0E, 0x52, 0x19, 0x4E, 0x0D, 0xBF, 0x0C, + 0xC0, 0x0F, 0x34, 0x22, 0x1C, 0x09, 0x55, 0x30, 0x99, 0x04, 0xED, 0x22, + 0x68, 0x18, 0x57, 0x20, 0xD9, 0x21, 0x1C, 0x1B, 0x73, 0x15, 0x99, 0x03, + 0x37, 0x15, 0x36, 0xFE, 0x58, 0x0B, 0x19, 0x02, 0xB6, 0xEE, 0xB2, 0xFA, + 0x71, 0xDF, 0xAA, 0xF3, 0x9D, 0xD8, 0xA4, 0xEA, 0x2A, 0xDC, 0x42, 0xE1, + 0x99, 0xE8, 0x65, 0xE0, 0xE4, 0xEC, 0x20, 0xE3, 0xF0, 0xEF, 0xA2, 0xE5, + 0x68, 0xFC, 0x78, 0xEB, 0x12, 0x0D, 0x45, 0xF0, 0x8B, 0x14, 0xAF, 0xEE, + 0x1E, 0x0F, 0x64, 0xEA, 0x69, 0x0B, 0x23, 0xE8, 0x0A, 0x11, 0xAE, 0xE9, + 0x81, 0x12, 0xF7, 0xEC, 0x43, 0x09, 0xF5, 0xF2, 0xFE, 0xF6, 0x2C, 0xF6, + 0x65, 0xE6, 0xCB, 0xF3, 0x0F, 0xE1, 0x48, 0xF4, 0x3D, 0xDB, 0xD2, 0xF0, + 0x5B, 0xD2, 0xFE, 0xEE, 0x29, 0xCD, 0x43, 0xF2, 0x35, 0xCE, 0x45, 0xF7, + 0xAE, 0xD3, 0xA5, 0xFC, 0x9A, 0xD7, 0x0D, 0xFF, 0xD2, 0xDE, 0x9B, 0x06, + 0x8F, 0xF0, 0x05, 0x0B, 0xE8, 0x09, 0xE3, 0x0D, 0x93, 0x1D, 0x18, 0x18, + 0x6C, 0x16, 0x83, 0x10, 0xD5, 0x0A, 0xC0, 0x05, 0xED, 0x1A, 0x64, 0x17, + 0xAF, 0x1F, 0xCF, 0x1C, 0xA2, 0x0F, 0xB5, 0x13, 0xA3, 0x16, 0x7B, 0x1F, + 0x23, 0x2D, 0x69, 0x2B, 0xE7, 0x36, 0x6D, 0x23, 0x5D, 0x44, 0x09, 0x1F, + 0xB9, 0x52, 0x42, 0x2D, 0x62, 0x46, 0xB2, 0x34, 0xBC, 0x38, 0xB6, 0x2C, + 0x4D, 0x41, 0x6D, 0x2E, 0xD5, 0x41, 0x3A, 0x35, 0xE0, 0x21, 0xDE, 0x22, + 0x73, 0x09, 0x00, 0x09, 0x74, 0x0F, 0xE6, 0xFD, 0x15, 0x05, 0x61, 0xEA, + 0xEA, 0xEE, 0xDC, 0xD9, 0x77, 0xE0, 0x40, 0xD8, 0xEF, 0xD0, 0xA5, 0xD6, + 0xEC, 0xCC, 0xDD, 0xDA, 0x17, 0xD2, 0x9A, 0xDF, 0x44, 0xCF, 0xE8, 0xE6, + 0x6E, 0xC6, 0x76, 0xEE, 0x52, 0xCA, 0x4D, 0xE6, 0x6B, 0xD7, 0xD0, 0xD4, + 0xDF, 0xDB, 0x47, 0xCE, 0x6F, 0xD7, 0x13, 0xD3, 0x9B, 0xD6, 0xD0, 0xD0, + 0xA5, 0xD6, 0x20, 0xC4, 0x63, 0xD5, 0x17, 0xC1, 0x21, 0xDA, 0x5F, 0xCD, + 0x76, 0xDF, 0x32, 0xDA, 0xE2, 0xDE, 0x5E, 0xE8, 0xCE, 0xDC, 0x38, 0xEF, + 0x11, 0xE7, 0x14, 0xEC, 0x67, 0xEF, 0xA1, 0xEF, 0x10, 0xF1, 0x2E, 0xF9, + 0x71, 0xFE, 0x48, 0xF9, 0xCE, 0x0D, 0x20, 0xF2, 0x41, 0x19, 0xA8, 0xFC, + 0x2A, 0x1C, 0x6F, 0x08, 0x37, 0x1A, 0x49, 0x04, 0x8A, 0x17, 0x48, 0x0A, + 0x0E, 0x05, 0xC8, 0x11, 0x1D, 0xFB, 0xB9, 0x13, 0xAD, 0x05, 0x1F, 0x1C, + 0xDF, 0x01, 0x18, 0x13, 0xE1, 0xF6, 0x9A, 0xF7, 0x6A, 0x01, 0x4B, 0xEF, + 0x95, 0x07, 0x30, 0xFB, 0x12, 0xFB, 0x89, 0x04, 0x59, 0x01, 0x51, 0x0B, + 0xFB, 0x14, 0x2B, 0x13, 0x08, 0x0E, 0xD8, 0x10, 0x8B, 0x00, 0x9D, 0x09, + 0xAD, 0x05, 0xD2, 0x06, 0xD6, 0xFF, 0x0F, 0xFA, 0x78, 0xF1, 0x39, 0xEC, + 0x4F, 0xF2, 0x2B, 0xEA, 0x57, 0xE5, 0xF1, 0xDC, 0x69, 0xCA, 0xC3, 0xC4, + 0x9C, 0xC9, 0x28, 0xB9, 0x35, 0xD9, 0x30, 0xBD, 0xB9, 0xE7, 0xCD, 0xD4, + 0x62, 0xF0, 0xE0, 0xF1, 0x28, 0xEE, 0xB2, 0xF6, 0x7C, 0xE7, 0xA3, 0xF4, + 0x1A, 0xE6, 0x65, 0x01, 0xE0, 0xF3, 0x21, 0x0C, 0x7E, 0x03, 0xB7, 0x09, + 0x77, 0x13, 0x2A, 0x0C, 0xE7, 0x1E, 0x6E, 0x13, 0xA0, 0x11, 0x55, 0x09, + 0xEE, 0x02, 0xB0, 0xFA, 0x4C, 0x01, 0x4E, 0xF4, 0x48, 0xFF, 0x05, 0xED, + 0x35, 0x01, 0xD6, 0xEE, 0x85, 0x03, 0x32, 0xFB, 0x13, 0xFE, 0xBA, 0x05, + 0x9F, 0xF6, 0x91, 0x09, 0x39, 0xF1, 0xCD, 0x0B, 0x05, 0xE6, 0x17, 0x04, + 0xA2, 0xDE, 0x60, 0xF3, 0x0F, 0xEA, 0x7A, 0xEE, 0x71, 0xF6, 0x36, 0xEE, + 0x11, 0xF5, 0x2C, 0xEF, 0x35, 0xE9, 0x53, 0xF4, 0x89, 0xDB, 0x38, 0xEF, + 0xE2, 0xD4, 0xE4, 0xDC, 0x91, 0xE0, 0x5F, 0xD7, 0x5D, 0xEE, 0x09, 0xE3, + 0x13, 0xE9, 0xA6, 0xEA, 0x61, 0xED, 0x6C, 0xF3, 0xEA, 0x05, 0x8D, 0xFC, + 0x82, 0x10, 0x3B, 0xF8, 0x63, 0x0B, 0x30, 0xF5, 0xB7, 0x04, 0x3F, 0x01, + 0x30, 0xFD, 0x1A, 0x09, 0xC0, 0x03, 0x5E, 0x0B, 0x61, 0x12, 0x88, 0x16, + 0x15, 0x0E, 0x0A, 0x19, 0x3B, 0xFF, 0x63, 0x07, 0xF6, 0xFB, 0x9C, 0xF2, + 0x41, 0xF7, 0xBB, 0xDC, 0x64, 0xE5, 0xFC, 0xC8, 0x86, 0xDC, 0xB9, 0xCA, + 0x56, 0xDF, 0x15, 0xD1, 0x42, 0xE5, 0x24, 0xCC, 0x96, 0xEC, 0x1A, 0xCD, + 0x0E, 0xE6, 0x1A, 0xD7, 0x86, 0xD1, 0x92, 0xDB, 0xAE, 0xCF, 0xA2, 0xDA, + 0x66, 0xE9, 0x26, 0xE2, 0xAF, 0xF1, 0x4A, 0xE5, 0x15, 0xE4, 0x8F, 0xDD, + 0xF2, 0xEB, 0x02, 0xE1, 0xFA, 0xFC, 0x72, 0xE8, 0xCE, 0xF3, 0x6B, 0xE1, + 0x14, 0xE7, 0x4D, 0xE0, 0x3C, 0xE1, 0x68, 0xE5, 0x9D, 0xD8, 0xB6, 0xDB, + 0x86, 0xE0, 0xEE, 0xD4, 0x0C, 0xF1, 0x4E, 0xDC, 0x5C, 0xEC, 0xC7, 0xE5, + 0xF9, 0xE2, 0x52, 0xED, 0x1D, 0xEC, 0x24, 0xEE, 0x15, 0xEC, 0x7C, 0xE6, + 0x06, 0xDE, 0x00, 0xE6, 0xAE, 0xD9, 0x13, 0xF0, 0xC7, 0xD8, 0x69, 0xF2, + 0xE3, 0xD8, 0x8E, 0xF1, 0xF6, 0xE3, 0x81, 0xF5, 0xB2, 0xE7, 0x89, 0xED, + 0x03, 0xE3, 0x5F, 0xEE, 0x88, 0xEA, 0x99, 0xFB, 0x82, 0xF0, 0x9B, 0xED, + 0x3A, 0xF1, 0xAA, 0xE4, 0x21, 0xEF, 0xB3, 0xF6, 0x0D, 0xE7, 0xE5, 0xF5, + 0xFE, 0xEB, 0x3A, 0xE3, 0xC2, 0xF7, 0xA0, 0xE1, 0x67, 0xFA, 0xA9, 0xEE, + 0xF7, 0x05, 0x84, 0xFF, 0xCD, 0x20, 0x2A, 0x18, 0x9A, 0x36, 0x55, 0x2E, + 0xD0, 0x3D, 0x4E, 0x2C, 0x26, 0x3E, 0x68, 0x1F, 0xF5, 0x31, 0x22, 0x18, + 0xF9, 0x21, 0xD9, 0x08, 0x8A, 0x25, 0xAB, 0xFF, 0x48, 0x29, 0x6E, 0x11, + 0x91, 0x17, 0x21, 0x20, 0x33, 0x19, 0x5E, 0x21, 0x47, 0x35, 0xE5, 0x21, + 0x16, 0x36, 0x26, 0x18, 0x3E, 0x29, 0xE7, 0x14, 0x66, 0x28, 0x3D, 0x1C, + 0x47, 0x1B, 0xB2, 0x1B, 0x0A, 0x0C, 0x08, 0x1A, 0x35, 0x19, 0x4E, 0x1E, + 0x4D, 0x26, 0x22, 0x1F, 0x02, 0x1B, 0xCE, 0x17, 0x18, 0x15, 0x9B, 0x0A, + 0x58, 0x16, 0x23, 0xFA, 0xB8, 0x04, 0x3D, 0xF0, 0xE7, 0xEA, 0x2B, 0xEF, + 0x09, 0xDF, 0x67, 0xEE, 0xE3, 0xDE, 0x47, 0xEE, 0xFB, 0xE1, 0x99, 0xF1, + 0x2D, 0xEC, 0x22, 0xF9, 0x0B, 0xFD, 0xA9, 0xFF, 0xE1, 0x04, 0x4D, 0x07, + 0x88, 0x00, 0x60, 0x10, 0xC7, 0xFC, 0xDC, 0x12, 0x08, 0x03, 0x06, 0x1D, + 0x10, 0x0C, 0xCC, 0x24, 0x6A, 0x11, 0xD6, 0x1E, 0x70, 0x19, 0x28, 0x25, + 0x40, 0x1C, 0x32, 0x37, 0x79, 0x12, 0xEB, 0x3A, 0xC0, 0x0C, 0x77, 0x30, + 0x52, 0x19, 0xBF, 0x2B, 0x3F, 0x29, 0x69, 0x2A, 0x68, 0x2D, 0x06, 0x25, + 0xEF, 0x31, 0x9B, 0x23, 0xB4, 0x3A, 0x63, 0x29, 0x38, 0x3F, 0x54, 0x31, + 0x42, 0x42, 0xD7, 0x3E, 0xB2, 0x43, 0xF1, 0x52, 0x89, 0x3B, 0x0C, 0x55, + 0x00, 0x2E, 0xB0, 0x42, 0x96, 0x2C, 0xF7, 0x36, 0xD9, 0x26, 0x24, 0x2C, + 0x17, 0x0D, 0x47, 0x17, 0x00, 0xFD, 0xC5, 0x07, 0xCE, 0xF9, 0xD8, 0xF7, + 0xE7, 0xF5, 0x07, 0xE8, 0x04, 0xF2, 0x1F, 0xE9, 0x09, 0xF2, 0xB9, 0xEC, + 0xA9, 0xFE, 0x7F, 0xE6, 0xD1, 0x0F, 0x3A, 0xE3, 0xA9, 0x0E, 0x38, 0xE6, + 0xD9, 0xF9, 0x40, 0xE8, 0x3F, 0xEB, 0xAB, 0xEF, 0x76, 0xEC, 0x27, 0xFB, + 0xB3, 0xEE, 0x8E, 0xFA, 0x51, 0xEE, 0x49, 0xF3, 0xE1, 0xF2, 0x59, 0xF4, + 0x1B, 0xF8, 0xC6, 0xF3, 0x3C, 0xF6, 0x81, 0xE9, 0xBA, 0xEE, 0xF2, 0xE2, + 0x54, 0xE8, 0x5D, 0xE6, 0x8E, 0xEE, 0x74, 0xEA, 0x2E, 0x05, 0xD9, 0xEE, + 0xC8, 0x16, 0x70, 0xF9, 0xA0, 0x14, 0x4B, 0x01, 0xE0, 0x0E, 0xBC, 0x04, + 0xA2, 0x0F, 0x65, 0x0C, 0xF0, 0x13, 0x0B, 0x15, 0x6C, 0x13, 0x43, 0x1B, + 0x73, 0x08, 0xF1, 0x21, 0xBF, 0x01, 0x0E, 0x27, 0x4D, 0x13, 0x62, 0x29, + 0xC2, 0x25, 0x68, 0x20, 0x5A, 0x13, 0x9A, 0x11, 0x57, 0xF7, 0x4A, 0x15, + 0x89, 0xEF, 0x7E, 0x1E, 0x8C, 0xEF, 0x12, 0x19, 0x02, 0xF5, 0x58, 0x18, + 0x5A, 0x05, 0x37, 0x23, 0x0A, 0x08, 0x2B, 0x1F, 0x44, 0xFD, 0x67, 0x0F, + 0x21, 0x0A, 0x6F, 0x0A, 0x79, 0x18, 0x32, 0x0C, 0x01, 0x06, 0xDA, 0x0B, + 0x70, 0xF3, 0x99, 0x0E, 0xF8, 0xF7, 0xDE, 0x09, 0x41, 0xFC, 0xBF, 0xF6, + 0x61, 0xF1, 0xE3, 0xED, 0x47, 0xE2, 0xC1, 0xEC, 0x8D, 0xDF, 0xC3, 0xE5, + 0x12, 0xEA, 0xE0, 0xE5, 0x86, 0xF1, 0x77, 0xE6, 0xFF, 0xF7, 0xB5, 0xE5, + 0x82, 0xF8, 0xE3, 0xEE, 0x19, 0xF2, 0x31, 0xF5, 0x83, 0xF6, 0x9C, 0xEC, + 0x3D, 0xF8, 0x8D, 0xE6, 0x9B, 0xF6, 0xE5, 0xF0, 0x0A, 0xF5, 0x3A, 0xF0, + 0x3C, 0xF1, 0x4E, 0xE3, 0x10, 0xF0, 0xC9, 0xE7, 0xB4, 0xEA, 0xD2, 0xF6, + 0x25, 0xE7, 0x47, 0xF3, 0x02, 0xF1, 0xE9, 0xE3, 0x2E, 0xF9, 0xE6, 0xDD, + 0x25, 0xF1, 0xE8, 0xD3, 0x0C, 0xE9, 0x22, 0xD2, 0xA0, 0xE6, 0x50, 0xE9, + 0x03, 0xE6, 0x9E, 0xF8, 0x3B, 0xF5, 0x9E, 0xFC, 0xA2, 0x0B, 0xD6, 0x08, + 0x89, 0x14, 0xEE, 0x13, 0x74, 0x15, 0x0F, 0x11, 0x79, 0x11, 0x49, 0x05, + 0x5F, 0x0D, 0x64, 0x0E, 0x18, 0x0B, 0xC8, 0x29, 0x61, 0x04, 0x95, 0x2F, + 0x6A, 0x07, 0x96, 0x25, 0x5E, 0x18, 0x26, 0x22, 0x2A, 0x22, 0x1C, 0x1C, + 0xE4, 0x1E, 0x9F, 0x15, 0xD1, 0x1A, 0xEF, 0x1A, 0x97, 0x12, 0xC0, 0x19, + 0xC7, 0x05, 0x60, 0x11, 0x90, 0xFF, 0xAE, 0x11, 0x8A, 0x0A, 0x51, 0x15, + 0x11, 0x20, 0xB1, 0x0E, 0x87, 0x25, 0xD2, 0x02, 0xDA, 0x12, 0xD9, 0xFC, + 0x56, 0xF8, 0x84, 0xF8, 0xE8, 0xE8, 0xAC, 0xF8, 0xBA, 0xE6, 0x5A, 0xF5, + 0xCF, 0xE8, 0x03, 0xEE, 0xD1, 0xEA, 0x33, 0xF4, 0x4D, 0xE3, 0x38, 0xFD, + 0x1D, 0xD9, 0x0A, 0xFE, 0xB6, 0xDD, 0x51, 0x03, 0xDB, 0xEA, 0x40, 0x0F, + 0xE5, 0xFD, 0x6F, 0x17, 0xBD, 0x14, 0xEC, 0x15, 0xA0, 0x23, 0x1B, 0x12, + 0xC7, 0x2A, 0x61, 0x13, 0xAC, 0x30, 0x05, 0x1A, 0x74, 0x28, 0xEE, 0x25, + 0xE5, 0x10, 0x7B, 0x2F, 0x19, 0x0B, 0x65, 0x30, 0x85, 0x12, 0x5C, 0x2B, + 0x00, 0x11, 0x5F, 0x23, 0xDA, 0x12, 0xBA, 0x1B, 0x6E, 0x16, 0x59, 0x16, + 0x52, 0x0B, 0xAB, 0x0F, 0x79, 0x01, 0xED, 0x0E, 0x1D, 0x07, 0x51, 0x14, + 0x08, 0x0C, 0x4D, 0x15, 0xA9, 0x0D, 0x2F, 0x14, 0xFF, 0x16, 0xD6, 0x10, + 0x8B, 0x20, 0xE3, 0x09, 0x5B, 0x1C, 0xC3, 0x07, 0xF9, 0x19, 0x6B, 0x0B, + 0x2F, 0x1E, 0xF4, 0x00, 0x29, 0x1F, 0x8C, 0xF8, 0x63, 0x18, 0xDB, 0x05, + 0x90, 0x0E, 0x64, 0x13, 0xD9, 0x0B, 0x0F, 0x1A, 0x45, 0x0B, 0x97, 0x1F, + 0x2B, 0x0F, 0x27, 0x29, 0x19, 0x0E, 0x38, 0x2F, 0x9D, 0x08, 0x7F, 0x28, + 0xA9, 0x15, 0x95, 0x21, 0x67, 0x2D, 0x21, 0x1E, 0x9B, 0x33, 0x38, 0x13, + 0xC0, 0x1E, 0x9B, 0x03, 0x6D, 0x08, 0xFD, 0xF3, 0x0D, 0x05, 0xD9, 0xE8, + 0x92, 0xFC, 0xD9, 0xEA, 0xE5, 0xE9, 0xE6, 0xF6, 0xD7, 0xE7, 0xF4, 0x01, + 0x21, 0xF0, 0xC2, 0x05, 0x54, 0x01, 0xFE, 0x06, 0x49, 0x14, 0xDD, 0x07, + 0x5F, 0x10, 0xFE, 0x0C, 0xE2, 0x03, 0xA8, 0x17, 0x27, 0x03, 0xBF, 0x18, + 0x72, 0x0E, 0x09, 0x0E, 0x7E, 0x13, 0xFA, 0x06, 0xA5, 0x04, 0x96, 0x02, + 0xBE, 0xF9, 0x4F, 0xFB, 0x5E, 0xF8, 0x76, 0xF5, 0x3B, 0xF5, 0x46, 0xF1, + 0x1B, 0xF7, 0x45, 0xEB, 0x70, 0xF6, 0xD7, 0xE7, 0x65, 0xEE, 0x4A, 0xEA, + 0xAD, 0xEB, 0x04, 0xE8, 0xDE, 0xE6, 0x5F, 0xE0, 0x0D, 0xD2, 0x50, 0xD9, + 0x69, 0xC8, 0xD3, 0xD7, 0xED, 0xD7, 0x05, 0xD6, 0x10, 0xE3, 0xF5, 0xD2, + 0xAC, 0xDC, 0x99, 0xD9, 0x19, 0xD9, 0x87, 0xDE, 0x17, 0xE1, 0xF3, 0xD3, + 0x9B, 0xEA, 0x48, 0xD4, 0x29, 0xEF, 0x73, 0xE2, 0xFE, 0xE9, 0x79, 0xDD, + 0x40, 0xE9, 0x01, 0xD9, 0x1C, 0xF5, 0xC3, 0xE5, 0x20, 0x00, 0xAC, 0xF0, + 0xEE, 0xFE, 0xF6, 0xFE, 0x67, 0xF8, 0xA2, 0x19, 0xD8, 0xF5, 0xF8, 0x24, + 0x6B, 0xFA, 0xC8, 0x18, 0xD9, 0x06, 0xC2, 0x15, 0xD3, 0x0D, 0x38, 0x1E, + 0xBF, 0x0E, 0x66, 0x19, 0x5E, 0x0F, 0x9F, 0x07, 0xD0, 0x09, 0x1C, 0x00, + 0xC1, 0x01, 0xBD, 0x06, 0x08, 0x03, 0x2C, 0x0A, 0xE1, 0x05, 0xD3, 0x06, + 0x09, 0x07, 0xDA, 0x00, 0xFB, 0x09, 0x19, 0xF2, 0xEC, 0x05, 0x1F, 0xEB, + 0x92, 0x03, 0xF2, 0xFB, 0x50, 0x09, 0x19, 0x0D, 0x41, 0x07, 0xD8, 0x0D, + 0x92, 0x00, 0x8A, 0x09, 0xFF, 0x05, 0x5E, 0x09, 0xB6, 0x11, 0xB2, 0x04, + 0xA7, 0x17, 0xE8, 0xF5, 0x06, 0x0F, 0x06, 0xEC, 0x26, 0x06, 0x3D, 0xF4, + 0x98, 0x05, 0x86, 0xF7, 0x1D, 0x03, 0x68, 0xEB, 0xED, 0x09, 0x9D, 0xE4, + 0xDC, 0x0D, 0xCF, 0xE0, 0x43, 0x04, 0xE2, 0xE4, 0xB8, 0xFE, 0xDD, 0xF3, + 0x60, 0xF6, 0x7E, 0xF7, 0xAF, 0xEB, 0x0B, 0xF4, 0x88, 0xEC, 0x42, 0xF5, + 0xF5, 0xF0, 0x0E, 0xF4, 0x62, 0xF1, 0x88, 0xF1, 0x14, 0xF1, 0xCB, 0xF0, + 0xC6, 0xEA, 0x5A, 0xF1, 0xFA, 0xDC, 0x0C, 0xFA, 0x8C, 0xD1, 0x25, 0x00, + 0x97, 0xD2, 0xEA, 0xF4, 0x60, 0xDE, 0x2B, 0xE3, 0x08, 0xEB, 0x10, 0xDF, + 0xAA, 0xF0, 0x21, 0xE7, 0x95, 0xEC, 0xB9, 0xEF, 0x73, 0xE5, 0x16, 0xFC, + 0x1C, 0xDE, 0xD4, 0x08, 0x28, 0xDC, 0xB2, 0x0D, 0xB5, 0xE6, 0x08, 0x17, + 0x89, 0xF6, 0xC5, 0x21, 0xD5, 0x05, 0xE5, 0x1A, 0xB7, 0x0F, 0x8A, 0x10, + 0xB2, 0x06, 0xCC, 0x09, 0x4A, 0xF4, 0x41, 0xF9, 0xDD, 0xEE, 0x12, 0xE7, + 0x4B, 0xF2, 0xFB, 0xE0, 0x09, 0xF5, 0x5F, 0xDF, 0x29, 0xF6, 0x6B, 0xD6, + 0x46, 0xF7, 0xA6, 0xCF, 0xCA, 0xF8, 0x32, 0xD0, 0xF0, 0xFA, 0xAD, 0xC9, + 0x87, 0xFD, 0x53, 0xC0, 0x04, 0xF5, 0xD2, 0xC4, 0xA1, 0xE6, 0x51, 0xCF, + 0x66, 0xE4, 0x37, 0xD4, 0x9D, 0xE3, 0x8C, 0xDA, 0xEB, 0xD6, 0x92, 0xE1, + 0x4F, 0xC9, 0xC7, 0xDE, 0x4F, 0xC7, 0x54, 0xD7, 0x7A, 0xCA, 0xC8, 0xCF, + 0xD7, 0xCD, 0x29, 0xCA, 0x9F, 0xD2, 0x03, 0xC7, 0x3B, 0xD1, 0xD0, 0xC3, + 0xEE, 0xCA, 0x8F, 0xC3, 0xB2, 0xD4, 0x4F, 0xC9, 0x7C, 0xDC, 0x49, 0xCF, + 0xF4, 0xCD, 0x59, 0xD6, 0x2D, 0xCB, 0xBC, 0xDE, 0xE4, 0xD9, 0x3E, 0xDC, + 0x5C, 0xE2, 0xBC, 0xD9, 0xE3, 0xDA, 0xD2, 0xD8, 0x07, 0xDB, 0xB6, 0xDC, + 0x4A, 0xEF, 0x6F, 0xE9, 0x6B, 0x00, 0xAA, 0xF3, 0xBE, 0x07, 0x57, 0xFD, + 0xF5, 0x09, 0xFA, 0x0A, 0x3A, 0x06, 0x13, 0x1E, 0x64, 0x03, 0x10, 0x24, + 0x9F, 0x0D, 0x77, 0x1A, 0x6B, 0x19, 0xC8, 0x13, 0x98, 0x1D, 0x26, 0x0F, + 0xC8, 0x28, 0x4C, 0x0E, 0x47, 0x36, 0xFF, 0x19, 0xD3, 0x2D, 0x94, 0x2A, + 0x7F, 0x17, 0x45, 0x35, 0x77, 0x07, 0x17, 0x31, 0x26, 0xFA, 0xA5, 0x21, + 0x7C, 0xF0, 0xA8, 0x12, 0x05, 0xEF, 0x99, 0x01, 0xC4, 0xED, 0x4F, 0xF5, + 0x1B, 0xE9, 0x98, 0xEE, 0x47, 0xEB, 0xD5, 0xE8, 0xA8, 0xF0, 0x60, 0xE8, + 0xEB, 0xEA, 0xFB, 0xEF, 0x9C, 0xE1, 0xAB, 0xF9, 0x9B, 0xE5, 0x8C, 0xF5, + 0x0A, 0xF7, 0x86, 0xE5, 0x39, 0x01, 0x29, 0xD9, 0xEE, 0xFC, 0xF2, 0xDB, + 0xCC, 0xF6, 0xA0, 0xF0, 0x1F, 0xF3, 0x7A, 0x07, 0x55, 0xF8, 0x03, 0x14, + 0x95, 0x02, 0x7E, 0x12, 0x95, 0x0C, 0xFA, 0x04, 0x1D, 0x16, 0xF8, 0xF7, + 0xBB, 0x0F, 0xDF, 0xE9, 0xFB, 0x02, 0x4F, 0xDF, 0xDF, 0x01, 0x5F, 0xE6, + 0x06, 0x0A, 0xAE, 0xF8, 0x46, 0x1A, 0x40, 0x06, 0x65, 0x29, 0xDE, 0x0E, + 0xB8, 0x2C, 0x68, 0x1B, 0x83, 0x2A, 0x3E, 0x25, 0x89, 0x26, 0xD7, 0x23, + 0x01, 0x2A, 0xDE, 0x29, 0xC7, 0x2A, 0x67, 0x33, 0x6D, 0x19, 0x62, 0x2C, + 0x86, 0x16, 0xD6, 0x25, 0x06, 0x2A, 0x6D, 0x1F, 0x7F, 0x33, 0x43, 0x17, + 0xB3, 0x2A, 0x35, 0x17, 0xE7, 0x20, 0x34, 0x1F, 0xE9, 0x15, 0x4C, 0x26, + 0x33, 0x0B, 0xCD, 0x1C, 0x8F, 0x15, 0x6E, 0x16, 0x62, 0x29, 0x6E, 0x1B, + 0x72, 0x32, 0x45, 0x16, 0x42, 0x32, 0x4B, 0x0D, 0x09, 0x2B, 0x16, 0x11, + 0xD8, 0x11, 0x46, 0x15, 0x3F, 0xF3, 0xF2, 0x12, 0x78, 0xED, 0xFA, 0x10, + 0x4F, 0xF6, 0xBE, 0x0A, 0x0F, 0xF8, 0x5A, 0x00, 0x91, 0xF7, 0x63, 0x01, + 0x49, 0xF4, 0xF8, 0x0E, 0x56, 0xE8, 0x04, 0x1A, 0x86, 0xE5, 0xB0, 0x20, + 0xA2, 0xF2, 0x3E, 0x1F, 0xEB, 0x00, 0x22, 0x19, 0x6B, 0x0B, 0x7E, 0x10, + 0x92, 0x13, 0xA0, 0x07, 0x71, 0x17, 0xDA, 0x08, 0x64, 0x0E, 0x6B, 0x0C, + 0x87, 0xFB, 0x0C, 0x0A, 0xBB, 0xF3, 0x85, 0x09, 0x99, 0xF2, 0xDC, 0x0B, + 0x27, 0xEF, 0x39, 0x07, 0x9F, 0xF2, 0x0F, 0x00, 0x4C, 0xF2, 0x73, 0xFD, + 0xD3, 0xED, 0x00, 0x00, 0x07, 0xF6, 0x0E, 0x04, 0xBB, 0x04, 0x65, 0x04, + 0x05, 0x0F, 0x30, 0x02, 0x3A, 0x11, 0xCB, 0xFF, 0x68, 0x13, 0x12, 0xFD, + 0x0A, 0x22, 0x82, 0x02, 0xBF, 0x2C, 0x6C, 0x0C, 0x01, 0x28, 0x87, 0x08, + 0xA8, 0x22, 0xCB, 0xFD, 0x0E, 0x25, 0xF9, 0xFC, 0xE7, 0x29, 0x41, 0x00, + 0x34, 0x27, 0x4E, 0x02, 0x4C, 0x1D, 0xA9, 0x0D, 0xF7, 0x10, 0x8C, 0x1A, + 0x71, 0x0D, 0x4A, 0x1B, 0x18, 0x1A, 0x69, 0x1C, 0x4E, 0x24, 0xC4, 0x26, + 0x59, 0x1B, 0x1E, 0x27, 0x68, 0x0E, 0xA0, 0x1A, 0x31, 0x0A, 0x6C, 0x0D, + 0xA9, 0x03, 0xD6, 0xFB, 0x5A, 0xF1, 0x3A, 0xEA, 0x2B, 0xD8, 0x6F, 0xE8, + 0x27, 0xCC, 0x9E, 0xEE, 0x0E, 0xCF, 0xC6, 0xE8, 0x05, 0xD4, 0x80, 0xE0, + 0x4C, 0xD1, 0xBB, 0xE3, 0x2E, 0xCB, 0x48, 0xE5, 0x31, 0xD3, 0x25, 0xDE, + 0xE2, 0xE6, 0x37, 0xE3, 0x45, 0xF3, 0xC2, 0xF2, 0xDF, 0xF0, 0x07, 0xFC, + 0x41, 0xEE, 0x0D, 0x04, 0x1F, 0xF3, 0x77, 0x09, 0xEA, 0xF8, 0x09, 0x06, + 0x9F, 0x00, 0xEC, 0xFF, 0xB1, 0x09, 0x72, 0xF9, 0x5C, 0x10, 0xF6, 0xF1, + 0x44, 0x15, 0xB4, 0xEB, 0xE4, 0x14, 0x91, 0xED, 0xCB, 0x0A, 0x75, 0xFC, + 0x7F, 0x00, 0xDF, 0x05, 0xC4, 0x00, 0x78, 0x07, 0xE3, 0x04, 0x3D, 0x16, + 0x86, 0x09, 0x44, 0x1F, 0x85, 0x0E, 0x5D, 0x11, 0xEB, 0x0E, 0xFC, 0x01, + 0xBC, 0x05, 0x89, 0xF8, 0xCA, 0xF8, 0xA5, 0xF6, 0x59, 0xED, 0xCA, 0x00, + 0xE6, 0xE2, 0x04, 0x0A, 0x76, 0xE9, 0x22, 0x0B, 0x6C, 0xF9, 0x19, 0xFF, + 0xDB, 0xFA, 0xEF, 0xEA, 0xD5, 0xF8, 0x14, 0xE6, 0xC5, 0xF8, 0xF1, 0xEB, + 0x36, 0xED, 0xF5, 0xEC, 0x05, 0xEF, 0x1A, 0x01, 0x08, 0x04, 0xF6, 0x1F, + 0xBF, 0x10, 0xE5, 0x25, 0x73, 0x10, 0xA0, 0x20, 0xBD, 0x06, 0xD5, 0x12, + 0x9F, 0xF6, 0x2C, 0xFA, 0xAA, 0xEC, 0x0D, 0xEA, 0x15, 0xF6, 0x11, 0xE5, + 0xE8, 0xFD, 0x8C, 0xE1, 0xA7, 0xFF, 0x93, 0xE1, 0xF3, 0x06, 0x78, 0xE7, + 0x74, 0x12, 0x7F, 0xF0, 0xC9, 0x18, 0x0C, 0xF3, 0xB1, 0x14, 0x2B, 0xFB, + 0xBB, 0x0E, 0x29, 0x18, 0x3F, 0x0A, 0xE8, 0x2C, 0x30, 0x0A, 0x6D, 0x24, + 0x74, 0x15, 0xC9, 0x11, 0xA3, 0x21, 0xA8, 0x07, 0x61, 0x1D, 0xF7, 0x03, + 0xE0, 0x0E, 0x14, 0x0C, 0x49, 0x00, 0x88, 0x1C, 0x4B, 0xF6, 0x11, 0x21, + 0x73, 0xF3, 0x84, 0x13, 0x7C, 0xFD, 0x87, 0xFE, 0x03, 0x0B, 0x89, 0xF1, + 0xB2, 0x0F, 0x64, 0xF2, 0xF1, 0x0E, 0x36, 0xF8, 0xB6, 0x08, 0x1C, 0x06, + 0x56, 0x01, 0x6F, 0x1E, 0x67, 0xFE, 0x45, 0x27, 0xB6, 0xFA, 0x10, 0x16, + 0x58, 0xFA, 0x34, 0x10, 0x0B, 0x00, 0x0B, 0x18, 0x69, 0xFF, 0x43, 0x0E, + 0xDE, 0xF5, 0x88, 0x09, 0xAC, 0xEF, 0x9C, 0x19, 0x5B, 0xF1, 0xFE, 0x1C, + 0x42, 0xF7, 0xB1, 0x0D, 0xFF, 0x07, 0xAE, 0x0E, 0xB6, 0x1F, 0x4B, 0x1A, + 0x24, 0x33, 0x80, 0x18, 0xBD, 0x40, 0xAE, 0x22, 0x9F, 0x43, 0x70, 0x3B, + 0x44, 0x3B, 0x1F, 0x3F, 0xD5, 0x34, 0x02, 0x33, 0xD7, 0x2F, 0x42, 0x2E, + 0x9A, 0x20, 0xFC, 0x22, 0x8D, 0x14, 0xC9, 0x13, 0xE8, 0x17, 0x5B, 0x19, + 0x6B, 0x16, 0x47, 0x27, 0x57, 0x0D, 0x20, 0x25, 0x08, 0x14, 0xD0, 0x1A, + 0x33, 0x17, 0x7A, 0x17, 0x2E, 0x11, 0xC2, 0x0C, 0xBA, 0x1A, 0x48, 0xFF, + 0xE1, 0x1A, 0xD1, 0x01, 0xD8, 0x05, 0x9A, 0x08, 0xD8, 0xFD, 0x22, 0x08, + 0x13, 0x05, 0x05, 0x03, 0x9B, 0x07, 0xD7, 0xFF, 0x14, 0x00, 0x21, 0xFD, + 0x4A, 0xF1, 0xBC, 0xFB, 0xDF, 0xE5, 0xC5, 0x02, 0x99, 0xE2, 0x25, 0x05, + 0x3F, 0xEB, 0x03, 0xFE, 0xFC, 0xED, 0x66, 0xFC, 0x56, 0xE3, 0x1E, 0x00, + 0x79, 0xE8, 0x0C, 0x02, 0xFC, 0x00, 0xFE, 0xFD, 0xFF, 0x12, 0xCC, 0xF8, + 0x44, 0x15, 0x1F, 0x01, 0xA1, 0x11, 0xDC, 0x03, 0x00, 0x10, 0x70, 0xFA, + 0x78, 0x0E, 0xF1, 0xF9, 0x73, 0x09, 0x3F, 0xFD, 0xF5, 0xFF, 0xE3, 0xFB, + 0x3B, 0xF9, 0xC5, 0x02, 0xC9, 0xFB, 0xBD, 0x0F, 0x99, 0x03, 0x1E, 0x0C, + 0x79, 0x0C, 0x67, 0x04, 0x23, 0x14, 0xA6, 0x06, 0x47, 0x18, 0x0A, 0x0A, + 0xF9, 0x1E, 0x95, 0x12, 0x7C, 0x26, 0xB7, 0x22, 0xBC, 0x1F, 0x8A, 0x2A, + 0xB3, 0x1E, 0xE2, 0x25, 0x1B, 0x2D, 0xD2, 0x1E, 0x9F, 0x32, 0x29, 0x16, + 0xAF, 0x27, 0x3B, 0x10, 0x80, 0x19, 0x71, 0x0E, 0x51, 0x0F, 0xDD, 0x09, + 0x6A, 0x08, 0x46, 0x0C, 0x24, 0x09, 0x3C, 0x17, 0x30, 0x0F, 0x45, 0x1E, + 0xDC, 0x18, 0x5D, 0x1F, 0x4D, 0x21, 0x7E, 0x17, 0x3B, 0x27, 0xB8, 0x11, + 0xD7, 0x23, 0xB9, 0x12, 0x1F, 0x14, 0x37, 0x19, 0x05, 0x07, 0xD6, 0x1F, + 0xFA, 0x01, 0x4B, 0x19, 0x21, 0xFF, 0x51, 0x0D, 0x33, 0xFB, 0x6B, 0x08, + 0x45, 0xFC, 0x2C, 0x04, 0xD1, 0xF8, 0xE1, 0xF6, 0x2E, 0xEF, 0x70, 0xEF, + 0x6E, 0xE8, 0x62, 0xF3, 0x26, 0xE5, 0xF3, 0xF5, 0x7E, 0xE5, 0x9F, 0xF7, + 0xC8, 0xDF, 0x3F, 0xFB, 0xB4, 0xD8, 0x0D, 0xF8, 0x9A, 0xDB, 0xEB, 0xF2, + 0x80, 0xE3, 0x82, 0xEF, 0x66, 0xE7, 0x4C, 0xE5, 0xD9, 0xF1, 0x77, 0xE0, + 0xB0, 0x05, 0xA3, 0xE5, 0xE2, 0x0C, 0xEE, 0xE7, 0x4B, 0x0F, 0x09, 0xE5, + 0xDE, 0x18, 0x9C, 0xEB, 0xF5, 0x17, 0x88, 0xFE, 0x4D, 0x0D, 0x3F, 0x0B, + 0x01, 0x12, 0x64, 0x17, 0x51, 0x1F, 0x14, 0x23, 0xEF, 0x22, 0x09, 0x1E, + 0x14, 0x32, 0x11, 0x21, 0x13, 0x48, 0x09, 0x32, 0x64, 0x45, 0x78, 0x36, + 0xB1, 0x3B, 0x54, 0x36, 0xB1, 0x32, 0xF2, 0x31, 0x24, 0x1E, 0x8B, 0x22, + 0x32, 0x0D, 0x89, 0x13, 0x07, 0x10, 0x50, 0x00, 0x02, 0x16, 0xA2, 0xEF, + 0x6D, 0x0B, 0x64, 0xEB, 0xE3, 0x03, 0xFA, 0xE9, 0xA2, 0x00, 0xD6, 0xEB, + 0x87, 0xE7, 0x96, 0xEA, 0x72, 0xD4, 0x85, 0xEB, 0x59, 0xDA, 0xC9, 0xEE, + 0x00, 0xD6, 0x0D, 0xE4, 0x8D, 0xCA, 0x76, 0xD9, 0xB2, 0xCC, 0x06, 0xDC, + 0x52, 0xCF, 0x6E, 0xDD, 0x74, 0xC2, 0xF1, 0xD6, 0x0E, 0xBA, 0xEE, 0xD4, + 0x27, 0xC7, 0xF7, 0xCA, 0x57, 0xD1, 0xDE, 0xBA, 0xED, 0xC8, 0x3A, 0xB7, + 0x0F, 0xC1, 0x34, 0xBD, 0x08, 0xBE, 0xD1, 0xC4, 0xE5, 0xB5, 0x44, 0xC9, + 0x4B, 0xBA, 0xCC, 0xC9, 0x4E, 0xC7, 0xF5, 0xC1, 0x19, 0xC7, 0x36, 0xBD, + 0x0A, 0xBE, 0xFB, 0xC6, 0xAB, 0xBE, 0x2E, 0xD7, 0xD7, 0xC4, 0x06, 0xE4, + 0x44, 0xC5, 0x45, 0xEA, 0x08, 0xC7, 0x06, 0xE5, 0x13, 0xD0, 0x5D, 0xDC, + 0x05, 0xE8, 0xC4, 0xE0, 0x37, 0xF8, 0xF6, 0xE4, 0xE7, 0xFB, 0x57, 0xEA, + 0x85, 0x05, 0x67, 0x00, 0xFB, 0xFD, 0x64, 0x0B, 0xDC, 0x02, 0xE2, 0x09, + 0x87, 0x22, 0x1E, 0x10, 0xE6, 0x27, 0x7F, 0x13, 0x9C, 0x18, 0x94, 0x0C, + 0x35, 0x16, 0x32, 0x03, 0x2B, 0x11, 0xEA, 0xFC, 0xDD, 0xF7, 0xAB, 0xF4, + 0x52, 0xEC, 0x30, 0xF5, 0x9E, 0xEA, 0x84, 0xF7, 0xA3, 0xE6, 0x27, 0xED, + 0x97, 0xEF, 0x77, 0xE6, 0xC6, 0xFA, 0x57, 0xE5, 0x41, 0xF8, 0xFD, 0xDB, + 0x75, 0xF3, 0xED, 0xE2, 0xBC, 0xF5, 0x6E, 0xED, 0x64, 0xFA, 0x6D, 0xE7, + 0xFE, 0xFF, 0x2A, 0xE8, 0xF4, 0xF7, 0x60, 0xE8, 0x39, 0xEB, 0xE4, 0xDF, + 0xE1, 0xE3, 0x7E, 0xDE, 0x04, 0xDD, 0x3F, 0xEC, 0xDE, 0xD8, 0x53, 0xF1, + 0x76, 0xE9, 0x7D, 0xEE, 0x67, 0x03, 0xE0, 0xE2, 0xE3, 0x07, 0xDA, 0xDA, + 0x4B, 0x01, 0x81, 0xE6, 0x5A, 0xFA, 0x21, 0xEA, 0x9B, 0xF4, 0x2B, 0xEB, + 0xB1, 0xF2, 0xC4, 0xF7, 0x6A, 0xED, 0x2F, 0xFC, 0x1A, 0xEB, 0xF2, 0xF6, + 0x47, 0xEA, 0x5E, 0xF5, 0xD3, 0xE1, 0xE7, 0xEC, 0x52, 0xE4, 0x33, 0xEF, + 0xCE, 0xE9, 0xCC, 0x04, 0x95, 0xDF, 0x5C, 0x11, 0x99, 0xE7, 0x55, 0x17, + 0x9C, 0x01, 0x25, 0x14, 0xE1, 0x0C, 0x40, 0x10, 0x94, 0x15, 0xFB, 0x18, + 0x70, 0x23, 0xDE, 0x22, 0x59, 0x29, 0x46, 0x2B, 0x0B, 0x20, 0xB4, 0x31, + 0x74, 0x1E, 0xFB, 0x37, 0x4A, 0x2D, 0xA8, 0x36, 0x6E, 0x2F, 0x63, 0x24, + 0x74, 0x2F, 0x2E, 0x17, 0x95, 0x25, 0x7F, 0x0F, 0x2B, 0x11, 0xED, 0x11, + 0x24, 0x09, 0x5B, 0x1A, 0x2E, 0x0D, 0xCB, 0x18, 0x86, 0x0F, 0x37, 0x1C, + 0xCD, 0x07, 0x2C, 0x1C, 0x78, 0x0A, 0x65, 0x13, 0x2E, 0x11, 0x7B, 0x04, + 0x69, 0x0D, 0x1F, 0xF2, 0x1D, 0x0B, 0x1C, 0xEF, 0xEB, 0x0B, 0x99, 0xF4, + 0x3C, 0x0A, 0x52, 0xF5, 0x03, 0x0E, 0x76, 0xF0, 0xDC, 0x0D, 0xF7, 0xDB, + 0xFF, 0x12, 0xB2, 0xDC, 0x40, 0x0A, 0x20, 0xEE, 0x2C, 0xFB, 0x44, 0xEF, + 0x79, 0xFD, 0x8B, 0xEB, 0x2D, 0xF0, 0x1E, 0xE6, 0x7D, 0xE7, 0x4D, 0xE0, + 0x6D, 0xF7, 0x05, 0xE1, 0xAA, 0xFC, 0x49, 0xE2, 0xD1, 0xF2, 0xC7, 0xE2, + 0x5C, 0xF4, 0x41, 0xEF, 0x1E, 0xF2, 0xA8, 0xFA, 0xA5, 0xE9, 0x85, 0x04, + 0xD2, 0xEE, 0x42, 0x08, 0xD4, 0xFE, 0xD5, 0x01, 0x22, 0x09, 0xDE, 0xFD, + 0xAB, 0x0F, 0x72, 0x07, 0xF9, 0x1C, 0x2B, 0x14, 0x46, 0x27, 0xD1, 0x1C, + 0x9A, 0x21, 0x0B, 0x29, 0x7D, 0x19, 0x4B, 0x29, 0x74, 0x1E, 0x07, 0x28, + 0x00, 0x22, 0x93, 0x2B, 0x04, 0x1D, 0x9D, 0x29, 0x1B, 0x22, 0x4D, 0x2C, + 0x20, 0x20, 0x4A, 0x2E, 0xA3, 0x0C, 0x4B, 0x2A, 0x00, 0x0C, 0x64, 0x22, + 0xF3, 0x0B, 0x64, 0x0D, 0x24, 0x05, 0x55, 0xFE, 0x86, 0xFD, 0x3F, 0xFD, + 0x65, 0xF7, 0x3F, 0xF8, 0x02, 0xFE, 0x2D, 0xFB, 0xB6, 0xFD, 0xC7, 0x00, + 0x9A, 0xF3, 0xC0, 0xF8, 0xA6, 0xE6, 0x3F, 0xEA, 0x66, 0xE6, 0xCE, 0xEB, + 0xF1, 0xEA, 0xBD, 0xF6, 0xC6, 0xED, 0xAD, 0xFA, 0xE3, 0xE8, 0xF9, 0x00, + 0xE7, 0xDE, 0x55, 0x09, 0x4F, 0xE1, 0x01, 0x03, 0xDB, 0xEE, 0xF6, 0xF4, + 0x3D, 0xF7, 0x42, 0xEB, 0xE3, 0xF0, 0xE0, 0xE3, 0xF3, 0xE7, 0x1F, 0xD9, + 0xD9, 0xEB, 0xC1, 0xD1, 0x43, 0xF1, 0xF4, 0xD2, 0x03, 0xE6, 0x01, 0xD2, + 0x91, 0xDB, 0x06, 0xCF, 0x06, 0xD7, 0xBC, 0xCA, 0x84, 0xDC, 0x1B, 0xCF, + 0x72, 0xEB, 0x25, 0xDB, 0x0E, 0xEF, 0xB6, 0xE4, 0xC5, 0xEC, 0x04, 0xF2, + 0xFB, 0xF1, 0x9D, 0xF5, 0x49, 0xFA, 0x79, 0xEB, 0xB0, 0x04, 0x59, 0xEE, + 0xC4, 0xFA, 0x8F, 0xF5, 0xF1, 0xED, 0x23, 0xFA, 0x90, 0xFD, 0x50, 0x05, + 0x47, 0x0C, 0x54, 0x0B, 0xB8, 0x11, 0xBB, 0x0B, 0x8A, 0x12, 0xC0, 0x08, + 0x20, 0x0B, 0x74, 0x07, 0xBD, 0xFF, 0x31, 0x0A, 0x90, 0xF9, 0x10, 0x0F, + 0x41, 0xFC, 0xD0, 0x1B, 0x23, 0xF7, 0xDA, 0x18, 0x14, 0xF5, 0x7D, 0x0C, + 0x49, 0xFF, 0x9F, 0x04, 0xD0, 0x02, 0xF6, 0xF8, 0x48, 0xFB, 0x0C, 0xEF, + 0x29, 0xEF, 0xBE, 0xE6, 0x25, 0xF0, 0x48, 0xEB, 0xBE, 0xF6, 0x69, 0xFB, + 0x51, 0xF4, 0xBE, 0x06, 0x46, 0xF9, 0x96, 0x0D, 0x55, 0x06, 0xF9, 0x0D, + 0x97, 0x08, 0x6A, 0xF9, 0x24, 0x04, 0x85, 0xF0, 0x04, 0x00, 0x2F, 0xFA, + 0xAA, 0xF0, 0xC5, 0xF8, 0x0C, 0xE2, 0xE4, 0xF3, 0x79, 0xEA, 0x79, 0xF6, + 0xC4, 0xFA, 0xB7, 0xF5, 0x13, 0x03, 0x0D, 0xEF, 0xD8, 0x04, 0xBD, 0xEB, + 0x20, 0xFD, 0x46, 0xED, 0x8C, 0xE9, 0xEF, 0xEF, 0xDD, 0xE0, 0x2D, 0xED, + 0x44, 0xEE, 0x41, 0xF1, 0x75, 0xF3, 0xD9, 0xEC, 0xA9, 0xF5, 0x36, 0xE3, + 0x06, 0xF7, 0xB6, 0xE5, 0x72, 0xEE, 0x1C, 0xEA, 0x4D, 0xE9, 0x3D, 0xEE, + 0xFC, 0xEC, 0x62, 0xF3, 0x3C, 0xF7, 0xAA, 0xFB, 0x14, 0xF5, 0x72, 0xFD, + 0x56, 0xF0, 0xC7, 0xFB, 0x6C, 0xFD, 0x15, 0xFC, 0x0E, 0x09, 0x4D, 0xFF, + 0x0E, 0x0A, 0x36, 0x0B, 0x31, 0x07, 0xD0, 0x14, 0x84, 0x0B, 0x91, 0x18, + 0x1F, 0x14, 0x56, 0x18, 0x73, 0x13, 0xC0, 0x0E, 0xC4, 0x10, 0x00, 0x0B, + 0x09, 0x14, 0xFE, 0x0D, 0x5A, 0x19, 0xD9, 0x1D, 0xF0, 0x0B, 0x89, 0x28, + 0x1B, 0x00, 0xE4, 0x22, 0x34, 0x0D, 0x9E, 0x2C, 0x80, 0x0C, 0x3D, 0x2B, + 0x1B, 0x0C, 0xD4, 0x21, 0x36, 0x1A, 0x8A, 0x26, 0xAC, 0x10, 0x26, 0x21, + 0x90, 0x00, 0x2A, 0x0E, 0xEE, 0x0D, 0x65, 0x0C, 0xA3, 0x22, 0x79, 0x1B, + 0xBF, 0x19, 0x88, 0x15, 0xA1, 0x0B, 0x6B, 0x03, 0x4A, 0x1D, 0x41, 0x05, + 0x52, 0x24, 0xA0, 0x01, 0xB5, 0x17, 0xA3, 0xF5, 0x5F, 0x18, 0xF7, 0xFE, + 0xED, 0x07, 0x4E, 0xFD, 0xE4, 0xF8, 0xFD, 0xEE, 0xF1, 0x0A, 0x88, 0xF1, + 0x06, 0x12, 0xA6, 0xFA, 0xAB, 0x0E, 0x75, 0x04, 0x29, 0x10, 0x0D, 0x05, + 0xB3, 0x12, 0xF0, 0x05, 0xEE, 0x13, 0x7A, 0x11, 0xD9, 0x16, 0x9C, 0x1B, + 0x7A, 0x13, 0x50, 0x1A, 0x47, 0x03, 0x11, 0x0E, 0xC6, 0xFF, 0x4F, 0x0C, + 0x40, 0x07, 0xCC, 0x0C, 0x64, 0x0C, 0x56, 0x06, 0x56, 0x0C, 0x5E, 0x0F, + 0x08, 0x05, 0xEE, 0x14, 0x5A, 0x00, 0xCF, 0x05, 0xCA, 0x09, 0x68, 0x06, + 0xA2, 0x09, 0x43, 0x15, 0x78, 0xF8, 0xA6, 0x19, 0x03, 0xE6, 0xB4, 0x16, + 0xDB, 0xE6, 0xA7, 0x1C, 0xCF, 0xF2, 0x59, 0x1C, 0x2B, 0xF0, 0x79, 0x0D, + 0x88, 0xF3, 0xFA, 0x0E, 0x49, 0xF4, 0xF2, 0x0F, 0x04, 0xF7, 0x43, 0x06, + 0x30, 0x02, 0xF2, 0x00, 0xD6, 0xFC, 0x02, 0xFF, 0x2A, 0xF3, 0x12, 0x01, + 0x93, 0xF4, 0xA5, 0x01, 0x1B, 0xFE, 0x99, 0x04, 0xDE, 0x0C, 0x19, 0x06, + 0x9D, 0x1C, 0x97, 0x08, 0x5D, 0x25, 0xF7, 0x12, 0x8D, 0x28, 0x78, 0x10, + 0xD3, 0x2C, 0x31, 0x09, 0xD9, 0x21, 0xD8, 0x06, 0x8C, 0x0F, 0xA1, 0x00, + 0x9C, 0x0A, 0xAB, 0xFE, 0xB6, 0x0C, 0x22, 0x05, 0xC3, 0x0F, 0x1D, 0x05, + 0x60, 0x13, 0x20, 0x03, 0x86, 0x14, 0x2E, 0x06, 0x75, 0x0F, 0x0F, 0x03, + 0x09, 0x08, 0x7F, 0x03, 0x5D, 0xF0, 0x03, 0xFC, 0xE8, 0xDC, 0x4A, 0xF6, + 0x4C, 0xE0, 0xF7, 0xFB, 0xD2, 0xEB, 0xBC, 0x02, 0x64, 0xF4, 0x34, 0x0D, + 0xAB, 0xFD, 0x65, 0x0D, 0x13, 0x13, 0xF5, 0x00, 0xFE, 0x13, 0x2F, 0xF1, + 0x3A, 0x03, 0x08, 0xEE, 0x19, 0x02, 0x8B, 0xFD, 0x71, 0xFA, 0x05, 0x09, + 0xB0, 0xFB, 0x84, 0x11, 0x37, 0x1B, 0xD7, 0x1C, 0x99, 0x30, 0xF2, 0x26, + 0x4C, 0x22, 0xD8, 0x26, 0x2A, 0x0D, 0x48, 0x22, 0xB9, 0xFF, 0xD4, 0x17, + 0xF1, 0xED, 0xF3, 0xFB, 0xB6, 0xE7, 0xAA, 0xEA, 0x5C, 0xF2, 0xC2, 0xE4, + 0x90, 0x05, 0xD4, 0xE7, 0x38, 0x19, 0x44, 0x06, 0x7E, 0x19, 0x34, 0x17, + 0x5E, 0x19, 0xFC, 0x0D, 0xE1, 0x21, 0xCA, 0x10, 0x8B, 0x17, 0x14, 0x14, + 0xAD, 0x0B, 0xA5, 0x14, 0x25, 0x12, 0xFF, 0x25, 0xE8, 0x0C, 0x31, 0x28, + 0xA1, 0xF7, 0xA5, 0x0A, 0x01, 0xFC, 0xB5, 0xFA, 0x91, 0xFE, 0xEA, 0xF9, + 0x04, 0xE5, 0x02, 0xF9, 0xE6, 0xDE, 0x61, 0x04, 0xBC, 0xE2, 0xBE, 0x06, + 0x5F, 0xD3, 0x63, 0xF3, 0xA4, 0xCB, 0x56, 0xD8, 0x16, 0xD8, 0x1A, 0xCE, + 0x31, 0xDD, 0x2C, 0xD9, 0xA2, 0xDF, 0x98, 0xE0, 0x5E, 0xE1, 0x45, 0xD6, + 0x6D, 0xE0, 0x1D, 0xD3, 0x3C, 0xE2, 0xF1, 0xD3, 0xB9, 0xE1, 0x49, 0xCC, + 0x95, 0xE1, 0xB0, 0xCE, 0xC0, 0xE5, 0xDB, 0xDB, 0x39, 0xEE, 0x1B, 0xEF, + 0x54, 0xF1, 0x34, 0xFF, 0xB4, 0xF2, 0x2F, 0x04, 0xC9, 0xF1, 0xC4, 0xF7, + 0x69, 0xFB, 0xD2, 0xF6, 0x0C, 0x0F, 0x1F, 0x10, 0xB3, 0x36, 0xC5, 0x34, + 0xA8, 0x60, 0x96, 0x43, 0x93, 0x5D, 0x64, 0x3B, 0xED, 0x36, 0x3D, 0x2D, + 0x36, 0x0E, 0x32, 0x08, 0x1C, 0xF9, 0xE3, 0xE5, 0xB5, 0xFF, 0xF3, 0xEA, + 0xFF, 0x04, 0x50, 0xF5, 0x95, 0x04, 0x6B, 0xFB, 0x9D, 0x14, 0xF3, 0x0C, + 0x83, 0x1E, 0xD5, 0x0B, 0xDF, 0x22, 0xE7, 0xFE, 0x35, 0x2A, 0x8B, 0xFD, + 0x51, 0x27, 0x97, 0x0F, 0x97, 0x15, 0x49, 0x1E, 0x5C, 0x1F, 0x33, 0x26, + 0xB7, 0x30, 0x28, 0x27, 0xFD, 0x1F, 0x90, 0x1C, 0x40, 0x0C, 0x02, 0x13, + 0xB7, 0xFC, 0xEF, 0x08, 0x7D, 0xE8, 0xFC, 0x01, 0x9D, 0xDA, 0xB7, 0xFD, + 0x33, 0xD4, 0x2F, 0xF7, 0x9F, 0xD1, 0x64, 0xF7, 0x6B, 0xD3, 0x16, 0xFD, + 0xE4, 0xE4, 0xFB, 0x00, 0x9C, 0xF3, 0x8B, 0xF9, 0xB3, 0xE5, 0x9A, 0xEF, + 0x42, 0xE0, 0x3F, 0xFE, 0x5E, 0xE3, 0x5B, 0xFF, 0x69, 0xEA, 0x6E, 0xF8, + 0x29, 0xFA, 0xC9, 0x07, 0x03, 0x00, 0x18, 0x18, 0xB7, 0xFE, 0xC0, 0x1A, + 0xFB, 0x0B, 0x39, 0x15, 0xE2, 0x21, 0x5D, 0x15, 0xC5, 0x18, 0xCE, 0x0D, + 0x5D, 0x13, 0x70, 0x0C, 0xB0, 0x1F, 0x0B, 0x1B, 0x02, 0x24, 0x75, 0x31, + 0x71, 0x2D, 0xCD, 0x41, 0x55, 0x38, 0x71, 0x3E, 0x94, 0x30, 0xEC, 0x2F, + 0x03, 0x11, 0x49, 0x08, 0xD4, 0xF5, 0xE8, 0xD8, 0x72, 0xF6, 0x4C, 0xD5, + 0x37, 0xF0, 0x18, 0xDE, 0x51, 0xEF, 0x36, 0xE1, 0x1E, 0x09, 0xB3, 0xF1, + 0xB6, 0x13, 0x60, 0x02, 0x5F, 0x0E, 0x57, 0x0F, 0xAC, 0x0E, 0x15, 0x11, + 0x15, 0x1D, 0xF8, 0x17, 0x1D, 0x27, 0x03, 0x20, 0xC5, 0x2B, 0xDD, 0x15, + 0x24, 0x35, 0x17, 0x0A, 0x29, 0x34, 0x27, 0x0A, 0x5A, 0x1D, 0x98, 0x0B, + 0xB6, 0xF8, 0xA5, 0x04, 0x26, 0xE7, 0x2D, 0x03, 0xD6, 0xEB, 0xF0, 0x04, + 0xC0, 0xE0, 0x48, 0xEC, 0xA4, 0xD5, 0xA0, 0xC9, 0x9D, 0xDF, 0xBE, 0xC1, + 0x58, 0xD9, 0x1D, 0xBC, 0xCA, 0xD1, 0x4C, 0xB5, 0xBC, 0xDA, 0x51, 0xC7, + 0xA3, 0xD7, 0xFF, 0xE5, 0x3A, 0xC3, 0xD6, 0xEC, 0xB4, 0xB6, 0xD2, 0xE8, + 0xBE, 0xC3, 0x26, 0xF7, 0xBB, 0xDD, 0xBF, 0xFE, 0x34, 0xEA, 0xAA, 0xF3, + 0xC7, 0xE5, 0x81, 0xED, 0xF8, 0xF4, 0x76, 0xFC, 0x2C, 0x01, 0xCF, 0xF8, + 0xDE, 0x04, 0x66, 0xF2, 0xA5, 0x15, 0x1A, 0x04, 0x5E, 0x25, 0x94, 0x04, + 0x3E, 0x3A, 0x14, 0xFC, 0xE4, 0x4B, 0xBA, 0x11, 0x9D, 0x3A, 0xB9, 0x2A, + 0x08, 0xFC, 0xC4, 0x10, 0x8B, 0xB9, 0x4A, 0xD7, 0xB9, 0xA9, 0x59, 0xAF, + 0x6F, 0xC0, 0x9F, 0xA2, 0xE7, 0xC9, 0xCD, 0xB2, 0x78, 0xCA, 0x72, 0xDB, + 0x82, 0xCE, 0x2D, 0xF6, 0xEA, 0xD1, 0xF3, 0xF5, 0xE5, 0xDF, 0xF6, 0xF0, + 0x63, 0xEC, 0xEC, 0xEC, 0x37, 0xF0, 0x31, 0xF1, 0x41, 0x02, 0x9D, 0x03, + 0xE4, 0x0F, 0x47, 0x0D, 0xB1, 0x02, 0x38, 0x00, 0xEB, 0xE9, 0x59, 0xEA, + 0x9B, 0xC4, 0x7A, 0xD3, 0x6D, 0xA7, 0x8D, 0xC2, 0x3F, 0xB3, 0x72, 0xBE, + 0x86, 0xC4, 0x13, 0xB8, 0xE1, 0xBC, 0x12, 0xA3, 0x61, 0xBE, 0xFF, 0x99, + 0xAC, 0xC6, 0x73, 0xA2, 0x3C, 0xC0, 0x76, 0xAA, 0xEB, 0xCB, 0x3C, 0xC3, + 0x06, 0xEC, 0x16, 0xE0, 0x5E, 0xFE, 0x8C, 0xE6, 0x60, 0xF5, 0xB0, 0xDB, + 0x09, 0xF1, 0x62, 0xD7, 0x9B, 0x03, 0xAD, 0xED, 0x23, 0xFC, 0xA7, 0x04, + 0x67, 0xE3, 0x6C, 0x07, 0x08, 0xF7, 0xE5, 0x18, 0xCE, 0x04, 0x37, 0x20, + 0xC0, 0xEC, 0x17, 0x01, 0x9D, 0xF8, 0xAB, 0xFD, 0xDC, 0x1D, 0xD0, 0x15, + 0x39, 0x2C, 0xC3, 0x19, 0xCD, 0x31, 0xBA, 0x22, 0x67, 0x37, 0x66, 0x30, + 0xF3, 0x1E, 0xE7, 0x0A, 0xCF, 0xF4, 0x8F, 0xD8, 0x6D, 0xDE, 0x0F, 0xD1, + 0x40, 0xD6, 0x35, 0xD0, 0x35, 0xDC, 0xBC, 0xD1, 0xF5, 0xF3, 0x20, 0xE8, + 0x71, 0xF9, 0xF4, 0xF5, 0x03, 0xF1, 0xA7, 0x00, 0xF1, 0xF1, 0x6F, 0x13, + 0xC7, 0xE9, 0x88, 0x14, 0x03, 0xF2, 0x49, 0x18, 0xBA, 0x12, 0xB4, 0x27, + 0xA6, 0x27, 0x88, 0x35, 0x88, 0x1D, 0x2A, 0x2A, 0x35, 0x18, 0x71, 0x18, + 0x4A, 0x0B, 0x5A, 0x05, 0x3B, 0xDA, 0x7F, 0xD8, 0x02, 0xCE, 0x04, 0xD2, + 0xF7, 0xDF, 0xA2, 0xE7, 0xA2, 0xDC, 0x24, 0xDC, 0xC9, 0xD6, 0x63, 0xD4, + 0x94, 0xD4, 0x75, 0xE2, 0x3B, 0xCB, 0x29, 0xDF, 0x28, 0xD8, 0xF0, 0xE5, + 0xC6, 0xF8, 0xD5, 0xF7, 0x27, 0x17, 0x3C, 0x00, 0x76, 0x13, 0x98, 0x01, + 0x90, 0x06, 0xED, 0x0D, 0x2E, 0x17, 0xA5, 0x22, 0x3A, 0x1D, 0x10, 0x24, + 0x6A, 0x10, 0x84, 0x17, 0xB4, 0x1E, 0x4F, 0x23, 0x95, 0x3D, 0xC9, 0x3C, + 0xD3, 0x39, 0x0B, 0x2B, 0x00, 0x2E, 0xBA, 0x0D, 0xBF, 0x37, 0xDE, 0x16, + 0xB7, 0x2E, 0x7B, 0x21, 0x3E, 0x1F, 0x3D, 0x28, 0x1E, 0x3E, 0x7A, 0x47, + 0x5E, 0x3F, 0x57, 0x42, 0xFD, 0x02, 0x31, 0x10, 0x0F, 0xE8, 0xF2, 0xF6, + 0xA9, 0xEA, 0xFC, 0xEE, 0x52, 0xE9, 0xAE, 0xEC, 0x91, 0x07, 0x51, 0x08, + 0xCD, 0x24, 0xFD, 0x29, 0x3D, 0x1D, 0xBE, 0x34, 0x8A, 0x2A, 0x82, 0x3D, + 0x50, 0x40, 0x1A, 0x39, 0x79, 0x40, 0xDA, 0x26, 0x75, 0x48, 0xF4, 0x28, + 0xB7, 0x59, 0x62, 0x3E, 0x07, 0x57, 0x3A, 0x44, 0x6C, 0x3F, 0x59, 0x3D, + 0x07, 0x20, 0x7F, 0x32, 0xF8, 0xFA, 0x37, 0x06, 0x6E, 0xF7, 0x2C, 0xF5, + 0xBB, 0xF1, 0x72, 0xFF, 0x6F, 0xDB, 0x32, 0xF4, 0xF8, 0xD0, 0x09, 0xDE, + 0xB6, 0xC7, 0x1B, 0xD2, 0x0B, 0xC7, 0xD8, 0xD5, 0xCF, 0xE3, 0xFF, 0xE9, + 0x4C, 0x07, 0x11, 0xFE, 0x2C, 0x1C, 0x28, 0x0D, 0x9A, 0x25, 0xE5, 0x0F, + 0x23, 0x1C, 0xC8, 0xFD, 0x2C, 0x1A, 0xC7, 0x13, 0x5B, 0x16, 0x35, 0x35, + 0x95, 0x01, 0x9A, 0x1A, 0x42, 0x0B, 0xAE, 0x0D, 0xC7, 0x23, 0x39, 0x21, + 0x82, 0x0D, 0xC6, 0x07, 0x75, 0xF8, 0x8F, 0xF5, 0x6B, 0x10, 0xFA, 0x14, + 0xBC, 0x1A, 0x07, 0x20, 0xEA, 0x0D, 0xFD, 0x1C, 0x98, 0x2C, 0xCF, 0x44, + 0x77, 0x40, 0xE1, 0x4A, 0xAA, 0x1B, 0x0A, 0x0E, 0x95, 0xFF, 0xD9, 0xE5, + 0x60, 0xE5, 0x9D, 0xDE, 0x27, 0xC2, 0xF1, 0xE2, 0xBC, 0xC6, 0xCF, 0xFD, + 0xCD, 0xE7, 0xBD, 0x1C, 0xDE, 0xF3, 0xBE, 0x1F, 0xA6, 0xFC, 0x26, 0x22, + 0x9C, 0x0A, 0x37, 0x29, 0x84, 0x10, 0xA6, 0x18, 0x70, 0x25, 0xF6, 0x14, + 0xAB, 0x3B, 0x13, 0x27, 0x04, 0x3E, 0xF3, 0x2C, 0x55, 0x3E, 0xD2, 0x26, + 0x2E, 0x3E, 0x9B, 0x12, 0x32, 0x28, 0x4D, 0xEC, 0x50, 0x0A, 0xB4, 0xDA, + 0xA4, 0x05, 0xAB, 0xE2, 0xD5, 0x08, 0x25, 0xDF, 0x40, 0xFE, 0xE6, 0xD8, + 0x1D, 0xF1, 0x56, 0xDC, 0xF0, 0xF0, 0x16, 0xEC, 0x1C, 0xFE, 0x21, 0x0B, + 0x32, 0x12, 0x1D, 0x1B, 0x83, 0x30, 0xFD, 0x25, 0xCB, 0x38, 0x15, 0x35, + 0xBA, 0x15, 0x39, 0x2C, 0x39, 0x0B, 0xFB, 0x30, 0xFC, 0x1F, 0xBE, 0x3A, + 0xE2, 0x25, 0x2B, 0x1E, 0x9C, 0x33, 0x25, 0x12, 0xD7, 0x4E, 0x46, 0x34, + 0x0B, 0x31, 0x9B, 0x34, 0x85, 0x03, 0x6F, 0x1F, 0x29, 0x10, 0xCD, 0x2B, + 0x21, 0x0E, 0x9F, 0x22, 0xE2, 0xFA, 0x95, 0x10, 0xF1, 0x15, 0x18, 0x28, + 0xF0, 0x20, 0x9A, 0x2B, 0x14, 0xFB, 0xBF, 0x00, 0x85, 0xE0, 0x43, 0xE3, + 0x2E, 0xC9, 0x9C, 0xD8, 0x17, 0xB3, 0xFE, 0xCE, 0x29, 0xC9, 0x27, 0xE0, + 0x7E, 0xE7, 0x4D, 0xFA, 0x18, 0xE9, 0x8F, 0xF7, 0x3B, 0xF5, 0x7D, 0xF9, + 0x46, 0xFC, 0x89, 0x01, 0x63, 0xEB, 0x98, 0xF7, 0x88, 0xF2, 0xFF, 0xFA, + 0x58, 0x06, 0x60, 0x06, 0x32, 0xFF, 0x61, 0xFD, 0xF2, 0xF1, 0x7B, 0xF5, + 0x41, 0xE7, 0x14, 0xE9, 0xE0, 0xD1, 0x50, 0xCB, 0xB2, 0xBA, 0x9D, 0xB7, + 0x42, 0xB1, 0x1A, 0xB4, 0x15, 0xAC, 0x21, 0xB4, 0x83, 0xB0, 0xF0, 0xBB, + 0x71, 0xB5, 0xD5, 0xAD, 0x4C, 0xC0, 0x24, 0x9B, 0x99, 0xDB, 0x2D, 0xAA, + 0x18, 0xE7, 0x3D, 0xBD, 0x30, 0xEB, 0x75, 0xD1, 0x50, 0xFE, 0xEE, 0xE4, + 0xB7, 0xF1, 0xC4, 0xD5, 0x54, 0xE1, 0x4E, 0xE4, 0x38, 0xF3, 0x36, 0x13, + 0x5A, 0xE6, 0xA6, 0x0A, 0xB0, 0xD3, 0x76, 0xFC, 0x91, 0xF6, 0x7E, 0x10, + 0xAE, 0x03, 0xD3, 0x07, 0x38, 0xE1, 0x27, 0xEE, 0xB0, 0xE4, 0x03, 0xF7, + 0xD6, 0xFF, 0xBD, 0xFF, 0x5C, 0x09, 0x80, 0xFD, 0xC6, 0x20, 0x10, 0x18, + 0xE0, 0x31, 0xA4, 0x2F, 0x30, 0x15, 0x47, 0x11, 0xAB, 0xEF, 0xFB, 0xDF, + 0x50, 0xD5, 0x68, 0xBF, 0x62, 0xB8, 0x48, 0xAA, 0xF3, 0xAD, 0x51, 0xB7, + 0x7F, 0xCB, 0xE5, 0xDD, 0x3B, 0xFD, 0x34, 0xFE, 0xAA, 0x11, 0x27, 0x17, + 0x03, 0x03, 0x2C, 0x21, 0x51, 0xFB, 0x30, 0x17, 0xD6, 0x07, 0x05, 0x0E, + 0xEC, 0x1E, 0x83, 0x13, 0x61, 0x30, 0xF5, 0x1E, 0xD9, 0x2B, 0x74, 0x24, + 0x70, 0x13, 0xC5, 0x14, 0x93, 0xF7, 0xA6, 0xF3, 0xE3, 0xE5, 0xAF, 0xD2, + 0x7A, 0xE4, 0xC0, 0xC6, 0x69, 0xDE, 0xF0, 0xD8, 0xA0, 0xDA, 0xBB, 0xF7, + 0xA0, 0xD7, 0x1C, 0xFA, 0xDD, 0xCF, 0x08, 0xF1, 0x63, 0xD9, 0x91, 0x00, + 0x95, 0xEE, 0xFD, 0x07, 0xA4, 0x10, 0xBF, 0x0B, 0x26, 0x31, 0x01, 0x24, + 0xFB, 0x22, 0xAC, 0x23, 0xD9, 0x17, 0x45, 0x1A, 0x27, 0x36, 0xAB, 0x2B, + 0x4D, 0x3A, 0xB7, 0x28, 0x97, 0x28, 0xF9, 0x0A, 0xF6, 0x46, 0x76, 0x1E, + 0x15, 0x57, 0xEF, 0x41, 0x56, 0x2F, 0xA7, 0x3B, 0x14, 0x19, 0xC9, 0x3E, + 0x26, 0x1D, 0x3C, 0x4D, 0x82, 0x28, 0xD8, 0x48, 0xC7, 0x47, 0x78, 0x4D, + 0xC1, 0x61, 0xAE, 0x5A, 0x87, 0x48, 0xF2, 0x40, 0x55, 0x1A, 0x41, 0x16, + 0xE1, 0xFD, 0xD0, 0xFF, 0xB9, 0xED, 0xD7, 0xEA, 0xA0, 0xF2, 0xED, 0xEC, + 0x1B, 0x10, 0x9A, 0x17, 0xDC, 0x27, 0xA8, 0x38, 0x55, 0x36, 0x01, 0x3E, + 0x8C, 0x44, 0xE4, 0x3E, 0xB8, 0x3F, 0xA9, 0x35, 0xF2, 0x31, 0x9B, 0x2C, + 0x3E, 0x34, 0x3A, 0x36, 0xC2, 0x3F, 0x98, 0x3A, 0xF2, 0x3C, 0x24, 0x29, + 0xDE, 0x23, 0x66, 0x13, 0xFB, 0xFD, 0x8F, 0x00, 0x12, 0xE4, 0xC7, 0xEC, + 0x6B, 0xE3, 0x5A, 0xD9, 0x76, 0xED, 0x01, 0xD8, 0x04, 0xF9, 0xD5, 0xE7, + 0xCD, 0xF9, 0xA3, 0xE2, 0xFA, 0x00, 0x72, 0xDE, 0xBE, 0x13, 0x31, 0xF1, + 0x08, 0x16, 0x44, 0xFF, 0x5C, 0x10, 0x3E, 0x0E, 0xA3, 0x1B, 0xD7, 0x25, + 0x96, 0x17, 0x66, 0x1D, 0x91, 0x0D, 0x1C, 0x1A, 0x1E, 0x20, 0xA2, 0x36, + 0xBE, 0x12, 0x9E, 0x2F, 0xAC, 0xEA, 0x45, 0x14, 0x7E, 0x01, 0x7B, 0x22, + 0xF8, 0x24, 0xAF, 0x29, 0x57, 0x18, 0x9D, 0x15, 0x68, 0x15, 0x52, 0x17, + 0xF8, 0x23, 0x67, 0x1E, 0x65, 0x29, 0x8E, 0x1C, 0x1E, 0x32, 0x0C, 0x27, + 0xDD, 0x30, 0xDC, 0x2B, 0x52, 0x0C, 0xA1, 0x11, 0x4C, 0xDD, 0x0F, 0xE7, + 0xCE, 0xB8, 0xC9, 0xBF, 0xB3, 0xA1, 0x35, 0xAE, 0x79, 0xA3, 0x21, 0xC5, + 0x45, 0xB9, 0xED, 0xE8, 0x64, 0xD0, 0x70, 0x09, 0x7C, 0xEB, 0x46, 0x27, + 0x47, 0x07, 0x60, 0x25, 0xBA, 0x0D, 0x35, 0x13, 0xF3, 0x01, 0x55, 0x0B, + 0x88, 0x05, 0x50, 0x01, 0xE1, 0x1A, 0xBF, 0xFD, 0xC8, 0x19, 0x77, 0xFD, + 0x9D, 0xFB, 0x5F, 0xE5, 0xAE, 0xD1, 0xC4, 0xC0, 0x57, 0xB6, 0x77, 0xAB, + 0xF2, 0xB6, 0x26, 0xA3, 0x5B, 0xC0, 0x9C, 0xA7, 0x0C, 0xCA, 0x65, 0xBA, + 0xB0, 0xC2, 0x68, 0xC3, 0x58, 0xB5, 0xEF, 0xC7, 0x15, 0xD1, 0xB2, 0xDA, + 0x75, 0xFE, 0xC4, 0xE5, 0xDB, 0x18, 0x93, 0xF0, 0x5D, 0x21, 0x58, 0x06, + 0x52, 0x10, 0x35, 0x00, 0x9A, 0x04, 0xF1, 0xFD, 0x9C, 0x01, 0x1A, 0x08, + 0xE7, 0xE4, 0x0B, 0xF2, 0xE6, 0xD1, 0x98, 0xDC, 0xD7, 0xEA, 0x56, 0xF1, + 0x02, 0xF6, 0x63, 0xF6, 0x9F, 0xE1, 0x1A, 0xDF, 0x61, 0xDE, 0x8D, 0xE6, + 0x77, 0xE5, 0xE3, 0xFC, 0x0B, 0xE7, 0x02, 0x05, 0xBA, 0x01, 0xF0, 0x11, + 0xD2, 0x17, 0x96, 0x0D, 0x86, 0xFC, 0x93, 0xE6, 0x40, 0xD1, 0x64, 0xC0, + 0xAE, 0xAB, 0x0B, 0xA5, 0xFA, 0xA1, 0xB9, 0x9B, 0xA9, 0xBE, 0x5F, 0xB1, + 0x87, 0xDC, 0x27, 0xD6, 0xDE, 0xE8, 0x12, 0xF4, 0xFF, 0xF3, 0x65, 0x01, + 0x0E, 0xF9, 0x53, 0xFB, 0xA2, 0xF9, 0x65, 0xF2, 0x02, 0xFD, 0x00, 0xFB, + 0x13, 0xFB, 0x5C, 0x17, 0x88, 0xF3, 0x61, 0x20, 0x6F, 0xEA, 0xFF, 0x04, + 0xD1, 0xDD, 0xA0, 0xDF, 0x01, 0xC0, 0xA6, 0xB6, 0x77, 0xAA, 0x89, 0xA4, + 0x55, 0xAC, 0xEF, 0xB1, 0x67, 0xC5, 0x9C, 0xD0, 0x9C, 0xDB, 0x6B, 0xDB, + 0x4C, 0xDB, 0x66, 0xCE, 0x91, 0xDD, 0x11, 0xD0, 0xDC, 0xF5, 0x6B, 0xDD, + 0xAE, 0x14, 0x0A, 0xE8, 0xED, 0x1C, 0xA0, 0xFC, 0xD9, 0x05, 0xBD, 0x0B, + 0x55, 0xEB, 0x0F, 0x03, 0x11, 0xF9, 0xC7, 0x09, 0x89, 0x0E, 0xCE, 0x0A, + 0xB0, 0xF3, 0xA6, 0xED, 0xCD, 0xE1, 0x7D, 0xED, 0x10, 0x06, 0x7C, 0x0E, + 0x95, 0x10, 0x5D, 0x0A, 0xE6, 0x04, 0x58, 0xF8, 0x99, 0x16, 0x6A, 0x02, + 0x0D, 0x21, 0x97, 0x0E, 0x09, 0x1C, 0xCB, 0x12, 0x25, 0x2B, 0x28, 0x1C, + 0xAE, 0x2D, 0xF6, 0x17, 0x8E, 0x0A, 0x13, 0xF5, 0x35, 0xE4, 0xED, 0xD2, + 0xD2, 0xC5, 0x7C, 0xC4, 0x42, 0xC1, 0x8A, 0xCD, 0x0D, 0xDD, 0x1C, 0xF3, + 0xF8, 0xFB, 0x37, 0x1A, 0xED, 0x19, 0x78, 0x35, 0x03, 0x33, 0x74, 0x40, + 0x2B, 0x30, 0x15, 0x2A, 0x79, 0x24, 0x73, 0x0F, 0x22, 0x2B, 0x49, 0x09, + 0xB7, 0x3A, 0x36, 0x0D, 0x06, 0x30, 0x44, 0x09, 0xDA, 0x15, 0x22, 0x02, + 0x13, 0x01, 0xF3, 0xED, 0x76, 0xE2, 0x7B, 0xCF, 0xEC, 0xCC, 0x61, 0xCC, + 0x11, 0xD1, 0x6F, 0xE5, 0xD3, 0xDB, 0x69, 0x00, 0xB9, 0xDF, 0x59, 0x01, + 0x0E, 0xF0, 0x6F, 0xFD, 0x06, 0x03, 0xA5, 0x08, 0x46, 0x0F, 0x64, 0x20, + 0xBF, 0x21, 0x50, 0x36, 0xCB, 0x30, 0xD3, 0x33, 0x17, 0x27, 0xB0, 0x1C, + 0x71, 0x23, 0xD0, 0x1F, 0x1B, 0x2D, 0x99, 0x35, 0xEF, 0x1A, 0x22, 0x21, + 0x35, 0x07, 0x4F, 0x00, 0xD9, 0x19, 0x60, 0x0A, 0x83, 0x20, 0x72, 0x17, + 0x4A, 0x02, 0x6D, 0x07, 0x69, 0xF3, 0x2F, 0x04, 0x0D, 0xFC, 0xA5, 0x16, + 0x31, 0x00, 0x02, 0x1C, 0x7E, 0x0C, 0xBF, 0x28, 0x74, 0x20, 0x29, 0x36, + 0xE1, 0x11, 0x83, 0x0E, 0x92, 0xE7, 0xEF, 0xD4, 0x76, 0xBC, 0xD4, 0xB5, + 0x1B, 0xA4, 0x3C, 0xAB, 0x8B, 0xAF, 0xBC, 0xB8, 0x95, 0xD9, 0x42, 0xE2, + 0xC9, 0x09, 0x10, 0x0C, 0xA5, 0x2A, 0x75, 0x28, 0xB8, 0x26, 0xD2, 0x2A, + 0xCA, 0x0B, 0xF9, 0x15, 0x10, 0x05, 0x48, 0x0E, 0x8C, 0x10, 0x99, 0x1D, + 0xF8, 0x11, 0xCF, 0x27, 0x73, 0x0D, 0x1A, 0x1A, 0xD1, 0x0F, 0xFC, 0xFE, + 0x0C, 0x05, 0x62, 0xD5, 0x07, 0xFE, 0x64, 0xC1, 0xC5, 0x06, 0x79, 0xD0, + 0x3B, 0x16, 0x09, 0xEE, 0x99, 0x1C, 0x06, 0x0B, 0x7B, 0x19, 0x01, 0x13, + 0x6E, 0x27, 0x12, 0x11, 0xCB, 0x36, 0x0C, 0x19, 0x14, 0x37, 0x79, 0x28, + 0xC4, 0x3F, 0x07, 0x3A, 0xC0, 0x3D, 0xAD, 0x40, 0xC4, 0x29, 0x7D, 0x3B, + 0x1B, 0x31, 0xBE, 0x48, 0xAB, 0x2A, 0x70, 0x48, 0x49, 0xFE, 0x94, 0x1C, + 0x0C, 0xF6, 0xA7, 0x0A, 0xC3, 0x16, 0x32, 0x26, 0xCF, 0x11, 0xC1, 0x24, + 0x5B, 0xF9, 0x60, 0x1A, 0xE3, 0xFF, 0xCF, 0x2B, 0x5B, 0x0F, 0x7F, 0x31, + 0xB7, 0x1C, 0xDB, 0x2F, 0x9A, 0x31, 0xFD, 0x3C, 0x3E, 0x2A, 0xF3, 0x24, + 0xD4, 0xFC, 0x1B, 0xE8, 0x7E, 0xCD, 0x40, 0xBB, 0xA1, 0xA2, 0x88, 0xA0, + 0x95, 0x98, 0x1C, 0xA5, 0x15, 0xBD, 0x52, 0xCC, 0x9A, 0xE6, 0xE7, 0xF0, + 0xFC, 0x0A, 0x9E, 0x06, 0x24, 0x36, 0xD8, 0x21, 0xCC, 0x33, 0xA2, 0x1F, + 0x16, 0x0B, 0x1F, 0x06, 0xB2, 0x02, 0xE5, 0x0A, 0xBB, 0x0C, 0xF6, 0x0B, + 0x71, 0x0C, 0x2F, 0xEE, 0xCC, 0x0E, 0x23, 0xDC, 0x29, 0xFF, 0xB6, 0xCC, + 0xD5, 0xCA, 0x7F, 0xAD, 0xBC, 0xA8, 0x38, 0xB6, 0xA5, 0xAE, 0xC1, 0xD4, + 0x04, 0xC9, 0x74, 0xE4, 0x76, 0xD0, 0x1D, 0xE9, 0x96, 0xCA, 0x3D, 0xE7, + 0xA0, 0xDC, 0x66, 0xEA, 0x90, 0xF6, 0x29, 0xEC, 0x6D, 0x06, 0xCB, 0xF1, + 0x1F, 0x0F, 0x05, 0x07, 0xA4, 0xFE, 0xA3, 0x07, 0x93, 0xF3, 0x60, 0xF9, + 0x29, 0x06, 0xD6, 0xF9, 0x35, 0x00, 0x3B, 0xEA, 0xDA, 0xD9, 0xA6, 0xD1, + 0x16, 0xC6, 0x92, 0xE1, 0x03, 0xD3, 0x61, 0x01, 0x65, 0xD5, 0x54, 0xF6, + 0xC7, 0xD6, 0x6F, 0xE6, 0x64, 0xE9, 0x70, 0xEC, 0x8A, 0xFB, 0xEA, 0xF1, + 0x2F, 0x16, 0xF1, 0x07, 0x7C, 0x26, 0x4C, 0x1D, 0x3A, 0x0C, 0x7C, 0x0A, + 0xFA, 0xD8, 0x84, 0xE1, 0xE2, 0xB2, 0x71, 0xBA, 0x59, 0xAB, 0x1E, 0x9F, + 0xDA, 0xBD, 0x8C, 0xA2, 0x21, 0xD9, 0xCA, 0xC2, 0x19, 0xF2, 0x63, 0xE4, + 0x2E, 0x16, 0xE2, 0x05, 0x96, 0x27, 0xEB, 0x11, 0x83, 0x15, 0xEC, 0xFD, + 0x9C, 0x0A, 0x6D, 0xF1, 0x50, 0x0D, 0x0C, 0xFA, 0xBC, 0x04, 0x17, 0xFF, + 0x55, 0xFB, 0xB4, 0xF9, 0x00, 0x01, 0x3D, 0xFB, 0x4E, 0xE9, 0xFC, 0xE7, + 0x14, 0xC6, 0xBE, 0xCA, 0x76, 0xC9, 0x01, 0xCA, 0x5A, 0xE0, 0x11, 0xDC, + 0x05, 0xEB, 0x12, 0xEA, 0x9B, 0xE7, 0x85, 0xF1, 0xBD, 0xED, 0x4E, 0x00, + 0xBE, 0xF4, 0x11, 0x10, 0x72, 0xF7, 0x4D, 0x16, 0x20, 0x10, 0xDE, 0x21, + 0xC7, 0x1D, 0xF7, 0x29, 0xAB, 0x00, 0xFF, 0x22, 0x65, 0xFB, 0x36, 0x2C, + 0x9D, 0x11, 0x98, 0x37, 0x46, 0x07, 0xF8, 0x1F, 0x25, 0xF9, 0xEA, 0x0B, + 0x33, 0x0C, 0x3F, 0x21, 0x1D, 0x1B, 0x40, 0x2F, 0xD6, 0x17, 0x7A, 0x1F, + 0xD1, 0x20, 0x5D, 0x1B, 0xF1, 0x30, 0x06, 0x27, 0xFB, 0x3A, 0x89, 0x39, + 0xCF, 0x43, 0x87, 0x4A, 0xB2, 0x48, 0xCC, 0x39, 0xD8, 0x39, 0x04, 0x0E, + 0x0E, 0x0F, 0x41, 0xE9, 0xB6, 0xDB, 0x9C, 0xCF, 0x05, 0xC1, 0x67, 0xC7, + 0xA7, 0xCF, 0xE9, 0xDE, 0x59, 0xFB, 0xAB, 0x0D, 0x94, 0x2B, 0xE1, 0x39, + 0xA7, 0x55, 0xEC, 0x56, 0x52, 0x5A, 0x6A, 0x57, 0x8D, 0x45, 0x39, 0x4C, + 0xA5, 0x3F, 0x9D, 0x41, 0x49, 0x44, 0x9E, 0x38, 0x71, 0x40, 0x03, 0x2F, + 0xDE, 0x42, 0xFD, 0x21, 0xEE, 0x3F, 0x96, 0x0A, 0x6F, 0x19, 0x99, 0xE4, + 0x90, 0xF5, 0x35, 0xD6, 0xA8, 0xE9, 0x0C, 0xE7, 0xFD, 0xFD, 0x94, 0x0D, + 0x18, 0x13, 0xC4, 0x23, 0xED, 0x17, 0x23, 0x23, 0x52, 0x25, 0x78, 0x26, + 0x35, 0x25, 0x22, 0x23, 0xF0, 0x19, 0xFA, 0x1E, 0x1E, 0x2B, 0x77, 0x2C, + 0xB8, 0x31, 0x62, 0x24, 0x15, 0x16, 0xCE, 0x08, 0x19, 0x15, 0x4D, 0x16, + 0xA4, 0x18, 0x32, 0x20, 0xB4, 0xF9, 0xAC, 0xF2, 0xA9, 0xE9, 0xD7, 0xDA, + 0x72, 0xF2, 0x86, 0x01, 0xDE, 0xEC, 0xEA, 0x1F, 0xE7, 0xE4, 0x56, 0x1C, + 0x35, 0xF9, 0xBD, 0x1D, 0xE4, 0x12, 0xC3, 0x1D, 0x1D, 0x25, 0xB6, 0x1D, + 0xF8, 0x31, 0x34, 0x29, 0x71, 0x28, 0x13, 0x1F, 0x91, 0x0E, 0xA6, 0xFF, + 0x7B, 0xEB, 0x9D, 0xD8, 0x21, 0xC7, 0x2E, 0xB2, 0x57, 0xBB, 0x48, 0xA5, + 0x26, 0xD5, 0xE3, 0xBD, 0x74, 0xF9, 0x42, 0xEE, 0xCA, 0x10, 0x8D, 0x2C, + 0x62, 0x19, 0x04, 0x58, 0xE6, 0x0D, 0xA3, 0x4F, 0x47, 0x0B, 0x10, 0x39, + 0x84, 0x14, 0x52, 0x27, 0x3A, 0x14, 0x79, 0x1C, 0x49, 0x04, 0x23, 0x0F, + 0x12, 0x04, 0xEE, 0x05, 0xD9, 0xFC, 0xCE, 0xF3, 0x0F, 0xD8, 0xA0, 0xCF, + 0x78, 0xCC, 0xEC, 0xC4, 0xE3, 0xDD, 0x4A, 0xD7, 0x15, 0xE9, 0x8B, 0xE0, + 0xD6, 0xE6, 0xB1, 0xD1, 0x04, 0xF0, 0xD6, 0xD0, 0x0E, 0xF9, 0x2B, 0xE2, + 0x7A, 0xEC, 0xC7, 0xEC, 0x54, 0xF1, 0xFB, 0xFC, 0x09, 0x09, 0x63, 0x05, + 0x40, 0xFF, 0x1B, 0xE8, 0x45, 0xFA, 0xCC, 0xD5, 0x74, 0x1A, 0x34, 0xF0, + 0x5A, 0x0B, 0x84, 0xF6, 0x5A, 0xD7, 0xC1, 0xD8, 0xCC, 0xE1, 0x2D, 0xDE, + 0x54, 0x04, 0x18, 0xFE, 0xDB, 0xF3, 0xE1, 0xF8, 0xA2, 0xDC, 0xB0, 0xE2, + 0x0A, 0xEB, 0x7C, 0xE7, 0x44, 0xFF, 0xA5, 0xF4, 0xC7, 0x09, 0x3A, 0x02, + 0xBF, 0x09, 0x84, 0x0A, 0xAD, 0xEE, 0x82, 0xF6, 0xF9, 0xC8, 0xD4, 0xD5, + 0xCF, 0xB3, 0x05, 0xB3, 0x17, 0xB0, 0xE0, 0x9C, 0x94, 0xAD, 0x1F, 0xA7, + 0x91, 0xB6, 0x19, 0xCF, 0x84, 0xDD, 0x77, 0x01, 0x51, 0x08, 0xC4, 0x23, + 0xAE, 0x18, 0x33, 0x28, 0x64, 0x12, 0x0E, 0x1C, 0xAE, 0x09, 0xC9, 0x10, + 0xDC, 0x07, 0xD8, 0x0B, 0x10, 0x08, 0xF5, 0x0E, 0xB1, 0xF6, 0xC2, 0x04, + 0x44, 0xE8, 0x0F, 0xF5, 0xC8, 0xD7, 0xE2, 0xE0, 0xFF, 0xBD, 0xBE, 0xC6, + 0x48, 0xBA, 0x2D, 0xC0, 0x50, 0xC7, 0x6B, 0xD1, 0x4E, 0xD0, 0xB0, 0xE5, + 0xFD, 0xD2, 0x66, 0xF0, 0xD6, 0xE9, 0xDB, 0x06, 0x43, 0xFA, 0xF4, 0x0E, + 0xEA, 0xEB, 0xAC, 0x04, 0x2E, 0xEE, 0xC5, 0x10, 0xC6, 0xFC, 0x72, 0x0E, + 0x85, 0xED, 0xD3, 0xE6, 0x7E, 0xF5, 0x59, 0xEB, 0xB4, 0x11, 0x4F, 0x06, + 0xFB, 0xFD, 0xBD, 0xE6, 0x02, 0xE5, 0x3B, 0xC4, 0xDD, 0xFB, 0xC5, 0xD8, + 0x7A, 0x1B, 0xBE, 0xF6, 0xCF, 0x11, 0xA4, 0xF2, 0xB7, 0xFD, 0x69, 0xF4, + 0x8D, 0xF9, 0x04, 0x0D, 0xEA, 0x03, 0x0F, 0x1C, 0x09, 0x1F, 0x40, 0x22, + 0x14, 0x2A, 0x03, 0x18, 0xC8, 0x18, 0x57, 0xF6, 0x90, 0xF6, 0xE5, 0xD1, + 0x65, 0xD4, 0xE5, 0xB7, 0x79, 0xCA, 0xEC, 0xB1, 0xEB, 0xCE, 0x6F, 0xBE, + 0x6E, 0xE1, 0x0B, 0xDA, 0x2D, 0x0F, 0x63, 0x13, 0xBC, 0x2F, 0x11, 0x4B, + 0x93, 0x31, 0x27, 0x50, 0x59, 0x28, 0x4F, 0x3D, 0x44, 0x1E, 0xCE, 0x33, + 0x47, 0x1B, 0x0D, 0x2B, 0x58, 0x21, 0xA9, 0x21, 0xAE, 0x20, 0xCE, 0x12, + 0x93, 0x19, 0xA5, 0x02, 0x44, 0x02, 0x17, 0xEC, 0xC4, 0xEE, 0x34, 0xDA, + 0x6A, 0xF6, 0xF3, 0xE5, 0xE7, 0x04, 0xED, 0x02, 0x3F, 0x09, 0x43, 0x16, + 0xA8, 0xFB, 0x88, 0x15, 0x7A, 0xFA, 0xB7, 0x1E, 0xE6, 0xFC, 0x88, 0x1C, + 0xB3, 0x00, 0x7A, 0x12, 0xD7, 0x19, 0x41, 0x21, 0x4D, 0x1A, 0x2D, 0x1E, + 0x01, 0xF0, 0x54, 0xFF, 0x7C, 0xF1, 0x05, 0x07, 0x0C, 0x11, 0xB8, 0x1B, + 0xB7, 0xFD, 0xC0, 0x00, 0x04, 0xED, 0xCF, 0xE8, 0x6B, 0x07, 0x25, 0x02, + 0x61, 0x11, 0xA2, 0x0F, 0x34, 0x03, 0x23, 0xEB, 0xF5, 0x06, 0xE4, 0xD8, + 0x30, 0x10, 0xBD, 0xE6, 0xD3, 0x16, 0x52, 0xFB, 0x84, 0x1E, 0x1B, 0x0D, + 0x38, 0x1B, 0x39, 0x0D, 0x12, 0xFD, 0x26, 0xFE, 0xA7, 0xC3, 0xDA, 0xDE, + 0x1E, 0xA2, 0x0B, 0xBD, 0xC1, 0xB4, 0x67, 0xB7, 0xE2, 0xD8, 0xDF, 0xC4, + 0x20, 0xFC, 0x01, 0xE8, 0x7B, 0x21, 0xBE, 0x26, 0xE8, 0x34, 0xC8, 0x52, + 0x5A, 0x33, 0x88, 0x4E, 0x57, 0x2E, 0x78, 0x2E, 0xFC, 0x27, 0x14, 0x15, + 0xC2, 0x17, 0x63, 0x12, 0x00, 0xFF, 0xA5, 0x13, 0x26, 0xF3, 0xA0, 0x0A, + 0xF4, 0xFB, 0xC6, 0x07, 0xBA, 0xF0, 0xD5, 0xF6, 0xA2, 0xE8, 0xD2, 0xDE, + 0x59, 0xFA, 0x63, 0xE0, 0xF2, 0x0F, 0x16, 0xFC, 0x04, 0x12, 0x05, 0x0B, + 0x17, 0x0A, 0x4A, 0x06, 0x9E, 0x1F, 0x0A, 0x0E, 0xA3, 0x31, 0xA8, 0x11, + 0x33, 0x2F, 0xC9, 0x11, 0x06, 0x35, 0x29, 0x1D, 0xA0, 0x2B, 0x1F, 0x15, + 0x69, 0x0F, 0x6F, 0xFF, 0xE9, 0x16, 0x6A, 0x0C, 0x83, 0x2A, 0x92, 0x1A, + 0x7E, 0x18, 0xE7, 0x03, 0x36, 0x01, 0xF6, 0xF8, 0x31, 0x12, 0x2D, 0x12, + 0x61, 0x22, 0xDE, 0x1A, 0x48, 0x17, 0xC1, 0x0D, 0x84, 0x15, 0x3D, 0x17, + 0x16, 0x1F, 0x7F, 0x2D, 0xB1, 0x25, 0x87, 0x40, 0x31, 0x1C, 0xE9, 0x43, + 0x93, 0x11, 0x99, 0x33, 0xE3, 0x0A, 0xE1, 0x0F, 0x37, 0xE7, 0xFE, 0xDF, + 0x5C, 0xBB, 0x05, 0xBF, 0x56, 0xB1, 0xEE, 0xC0, 0xD3, 0xC8, 0x30, 0xD7, + 0x92, 0xF6, 0x4A, 0xF7, 0x9B, 0x23, 0x4F, 0x25, 0x50, 0x2F, 0xF6, 0x41, + 0x39, 0x24, 0xA4, 0x3A, 0x0F, 0x16, 0xA5, 0x28, 0x7A, 0x08, 0x09, 0x19, + 0xDD, 0x07, 0x25, 0x13, 0x94, 0xFF, 0x4B, 0x10, 0xE2, 0xE8, 0xE6, 0xFA, + 0x20, 0xE7, 0x17, 0xE8, 0xDE, 0xE3, 0x84, 0xCD, 0xE5, 0xD1, 0xFF, 0xB2, + 0xAD, 0xC6, 0x3C, 0xBB, 0xFA, 0xD1, 0xAF, 0xDF, 0x1C, 0xD8, 0x2A, 0xE6, + 0x20, 0xD5, 0xBA, 0xD5, 0x6D, 0xE3, 0x13, 0xDC, 0x6C, 0xEB, 0x3A, 0xE3, + 0x68, 0xEA, 0x84, 0xE4, 0xCF, 0xF3, 0x90, 0xEC, 0xD7, 0xF1, 0x13, 0xEB, + 0x6E, 0xD7, 0xDF, 0xDB, 0x18, 0xDA, 0xE1, 0xDC, 0x4C, 0xED, 0x0A, 0xE1, + 0x90, 0xE8, 0x96, 0xCB, 0x39, 0xE2, 0x71, 0xB7, 0xD5, 0xEA, 0x6D, 0xD9, + 0x3E, 0xE6, 0xF6, 0x00, 0xB0, 0xCA, 0x4E, 0xEF, 0x66, 0xC6, 0x72, 0xE0, + 0x89, 0xEA, 0x45, 0xF2, 0x94, 0x00, 0xE6, 0xFB, 0x39, 0xF3, 0x60, 0xF4, + 0x5D, 0xF0, 0xFD, 0xF1, 0xB3, 0xE2, 0x6C, 0xE4, 0x4D, 0xB7, 0x0F, 0xBF, + 0xB1, 0x9D, 0x29, 0xAB, 0xA4, 0xA8, 0xDD, 0xB5, 0xFD, 0xCB, 0xE1, 0xBF, + 0x06, 0xFF, 0x04, 0xD8, 0x66, 0x27, 0x2B, 0x03, 0x9D, 0x27, 0x6F, 0x1B, + 0x9A, 0x0F, 0xB9, 0x18, 0x8F, 0x00, 0x09, 0x0B, 0xD0, 0xFE, 0x46, 0xFB, + 0x84, 0xFE, 0xCA, 0xF1, 0xBB, 0xF1, 0x67, 0xE4, 0x39, 0xE6, 0x45, 0xD1, + 0xC1, 0xE4, 0xA1, 0xD5, 0x69, 0xDC, 0x7F, 0xD7, 0x44, 0xD8, 0x86, 0xD0, + 0x0F, 0xDD, 0x74, 0xDB, 0x3B, 0xF1, 0xC8, 0xF6, 0xEE, 0xF2, 0x65, 0xF7, + 0xD7, 0xE9, 0x68, 0xF2, 0x9B, 0xFB, 0xD6, 0x08, 0x0D, 0xFF, 0xBA, 0x11, + 0x56, 0xFC, 0xB4, 0x0E, 0x1E, 0x09, 0xC5, 0x16, 0xDA, 0xFC, 0x14, 0x0D, + 0x3D, 0xE6, 0xE4, 0xF1, 0x7C, 0xF8, 0xA6, 0xFB, 0x4D, 0x0B, 0xB8, 0x13, + 0x5A, 0xF3, 0xB7, 0x0B, 0xB8, 0xEC, 0xD9, 0x0E, 0x54, 0x11, 0xB8, 0x29, + 0x93, 0x16, 0x81, 0x21, 0x47, 0x06, 0x48, 0x0A, 0x08, 0x1C, 0x0A, 0x11, + 0xEF, 0x40, 0xA6, 0x25, 0x61, 0x48, 0x92, 0x35, 0x27, 0x31, 0xE2, 0x37, + 0xE5, 0x21, 0x58, 0x31, 0x5E, 0x10, 0x3A, 0x17, 0x43, 0xF6, 0x1E, 0xE7, + 0x20, 0xF0, 0x50, 0xCB, 0x36, 0xFE, 0xE3, 0xD9, 0x01, 0x10, 0xD2, 0xFC, + 0x25, 0x2B, 0x05, 0x26, 0x24, 0x50, 0x92, 0x4D, 0xD7, 0x62, 0x35, 0x62, + 0xE7, 0x4E, 0xA9, 0x5B, 0xA3, 0x34, 0xA0, 0x51, 0xCD, 0x35, 0x99, 0x4A, + 0x21, 0x3C, 0xAE, 0x34, 0x1F, 0x33, 0xDB, 0x20, 0xA3, 0x29, 0x9A, 0x1D, + 0x37, 0x22, 0x95, 0x18, 0x8D, 0x12, 0x08, 0x02, 0x7F, 0x06, 0xED, 0xF1, + 0x33, 0x07, 0xC4, 0xF7, 0xF7, 0x13, 0x8B, 0x0C, 0x1B, 0x0D, 0xA5, 0x0D, + 0x10, 0x04, 0x35, 0x05, 0xC2, 0x18, 0x3B, 0x0D, 0x0A, 0x25, 0xB8, 0x11, + 0xD0, 0x1E, 0xF9, 0x15, 0x47, 0x23, 0x6B, 0x21, 0xD4, 0x1F, 0x12, 0x19, + 0x30, 0x10, 0xE4, 0xFE, 0xBC, 0x19, 0xDD, 0x03, 0x35, 0x1A, 0x45, 0x0D, + 0x2C, 0xFC, 0x23, 0xF9, 0x8B, 0xFA, 0x1A, 0x00, 0x1C, 0x10, 0xEF, 0x27, + 0x8C, 0x0B, 0x8F, 0x2A, 0x74, 0x01, 0x8E, 0x18, 0xAF, 0x11, 0x4E, 0x27, + 0x1A, 0x26, 0xE4, 0x33, 0xE1, 0x2C, 0x3F, 0x35, 0x47, 0x2A, 0x66, 0x37, + 0xED, 0x1F, 0xB5, 0x2B, 0x3D, 0x06, 0x8A, 0x0D, 0x18, 0xE9, 0x21, 0xE6, + 0x03, 0xDD, 0xE2, 0xCF, 0x5B, 0xE8, 0xE7, 0xD3, 0xA4, 0x02, 0x37, 0xEB, + 0xF9, 0x1A, 0xC1, 0x13, 0xFA, 0x2D, 0x55, 0x44, 0x82, 0x30, 0x53, 0x60, + 0x1D, 0x14, 0x64, 0x57, 0xCC, 0xFD, 0x72, 0x40, 0x16, 0x07, 0x15, 0x2E, + 0xA0, 0x0B, 0x67, 0x19, 0x23, 0x00, 0x26, 0xFE, 0x83, 0xF6, 0x9E, 0xEE, + 0xBC, 0xE5, 0x1A, 0xED, 0xCF, 0xCF, 0xAF, 0xDF, 0x9C, 0xD6, 0x23, 0xDE, + 0xA2, 0xEF, 0x54, 0xEC, 0xA2, 0x05, 0x3A, 0xF6, 0xEC, 0xFC, 0x38, 0xEF, + 0xC4, 0xE8, 0x44, 0xE3, 0x7E, 0xF3, 0x51, 0xEC, 0xD0, 0x00, 0x81, 0xF3, + 0x10, 0x08, 0xC6, 0xF3, 0x55, 0x12, 0x47, 0xFE, 0x3E, 0x01, 0x2A, 0xF3, + 0x22, 0xEC, 0x78, 0xD2, 0xF5, 0x00, 0x12, 0xD4, 0xCB, 0x10, 0xE7, 0xDC, + 0xEA, 0xF4, 0x56, 0xCD, 0x74, 0xE6, 0x98, 0xDB, 0xED, 0xF5, 0xDE, 0x05, + 0xDC, 0xF4, 0x97, 0x08, 0x6D, 0xF3, 0xCC, 0xF3, 0xDD, 0x0D, 0x04, 0xF7, + 0xD7, 0x20, 0xBF, 0x04, 0xB4, 0x15, 0x75, 0x09, 0x46, 0x0D, 0x3C, 0x0A, + 0xE2, 0xFC, 0xB0, 0x06, 0x2C, 0xD1, 0xFF, 0xEE, 0xCD, 0xAB, 0x94, 0xC4, + 0x67, 0xA1, 0xF2, 0xA6, 0x99, 0xA8, 0x6C, 0xA5, 0xBB, 0xB7, 0xF7, 0xBC, + 0x8B, 0xD7, 0x6F, 0xED, 0x6D, 0x02, 0xAE, 0x22, 0x40, 0x1C, 0xC5, 0x35, + 0x08, 0x21, 0x23, 0x28, 0x8D, 0x18, 0x08, 0x1A, 0x05, 0xFD, 0xF5, 0x08, + 0xA5, 0xDF, 0x2C, 0xF3, 0xF0, 0xD7, 0x42, 0xE1, 0x95, 0xDF, 0x3B, 0xD8, + 0x87, 0xDD, 0x65, 0xD2, 0x14, 0xC8, 0x44, 0xC0, 0xE8, 0xC3, 0x46, 0xB7, + 0x2A, 0xD8, 0xD4, 0xBC, 0x4B, 0xEB, 0xDD, 0xC4, 0x1D, 0xEB, 0xA0, 0xD2, + 0x75, 0xE7, 0x5A, 0xEA, 0x53, 0xEB, 0xFB, 0x01, 0x30, 0xEE, 0x89, 0x0F, + 0xCD, 0xF7, 0xE0, 0x12, 0x91, 0x0A, 0x3E, 0x11, 0xDF, 0x04, 0xC7, 0xFC, + 0x47, 0xF4, 0x22, 0xF0, 0x70, 0xFC, 0x7E, 0x06, 0xEB, 0xFB, 0x2A, 0x08, + 0x3E, 0xE9, 0x9C, 0xEA, 0xC0, 0xE7, 0x98, 0xE1, 0xD8, 0xFE, 0x4E, 0xF9, + 0x42, 0x09, 0xF5, 0xFB, 0xF7, 0x01, 0x15, 0xEE, 0xD0, 0x11, 0x81, 0xFE, + 0x21, 0x33, 0x6B, 0x1B, 0x31, 0x36, 0x04, 0x29, 0x1D, 0x28, 0x4B, 0x2E, + 0xC7, 0x1C, 0x9C, 0x26, 0xF5, 0xFA, 0xC5, 0xFD, 0x17, 0xD1, 0x8B, 0xCB, + 0x5B, 0xC4, 0xA1, 0xB5, 0x6A, 0xD5, 0x49, 0xB3, 0x25, 0xF6, 0x12, 0xC3, + 0xB7, 0x1B, 0xCB, 0xF7, 0xCD, 0x39, 0x04, 0x37, 0xBC, 0x3A, 0xE4, 0x4E, + 0x95, 0x28, 0xF4, 0x46, 0x8B, 0x22, 0xC6, 0x3E, 0xDF, 0x0D, 0x20, 0x24, + 0x70, 0xEE, 0xB8, 0x04, 0x4A, 0xF0, 0xD5, 0xF7, 0x10, 0x02, 0x16, 0xEC, + 0x75, 0x08, 0x65, 0xDF, 0xCA, 0x01, 0x8F, 0xD5, 0x49, 0xFB, 0x47, 0xD9, + 0xA2, 0xF6, 0xA5, 0xE5, 0x5F, 0xF9, 0xE8, 0xF2, 0xB8, 0xF3, 0x33, 0xFB, + 0x62, 0xE6, 0x51, 0xFD, 0xBD, 0xE6, 0x87, 0x04, 0x3D, 0xF0, 0xF8, 0x0B, + 0xD8, 0x05, 0x8E, 0x0E, 0x44, 0x20, 0xEE, 0x1E, 0xEE, 0x11, 0xAB, 0x20, + 0x8B, 0xEF, 0x4D, 0x10, 0x67, 0xF1, 0xB6, 0x1B, 0x11, 0xF9, 0x8F, 0x21, + 0x7C, 0xEF, 0x1B, 0x09, 0xDF, 0xEF, 0x4A, 0xFE, 0x19, 0x0A, 0x04, 0x19, + 0x19, 0x1B, 0x44, 0x21, 0xA7, 0x1A, 0xCE, 0x07, 0x5D, 0x29, 0xD9, 0x00, + 0x2E, 0x3B, 0xA0, 0x1B, 0x90, 0x30, 0x13, 0x31, 0x18, 0x1E, 0xE9, 0x2F, + 0xBE, 0x16, 0x42, 0x2C, 0xBE, 0xFD, 0x7A, 0x0F, 0xDB, 0xD6, 0xD1, 0xD5, + 0xBA, 0xBE, 0x88, 0xB1, 0x2F, 0xB9, 0x07, 0xB1, 0xFB, 0xC8, 0xEF, 0xC4, + 0xB5, 0xF1, 0x87, 0xF7, 0xC1, 0x20, 0x36, 0x34, 0xFC, 0x34, 0x30, 0x4C, + 0xFE, 0x30, 0xF5, 0x42, 0xD1, 0x24, 0xE9, 0x30, 0xC7, 0xFF, 0x18, 0x10, + 0xCB, 0xDB, 0x92, 0xED, 0x50, 0xDD, 0x25, 0xE0, 0x79, 0xE5, 0x94, 0xDE, + 0xF5, 0xE4, 0x0D, 0xE1, 0x3D, 0xE3, 0x54, 0xE0, 0xDA, 0xE1, 0x01, 0xE0, + 0x65, 0xE3, 0x15, 0xE4, 0x89, 0xF5, 0x05, 0xF4, 0x8A, 0x01, 0x57, 0xFE, + 0xB7, 0x02, 0x11, 0xF5, 0x2A, 0x16, 0xBE, 0xF7, 0x02, 0x2B, 0x4F, 0x0C, + 0x22, 0x32, 0x12, 0x1A, 0x44, 0x3A, 0xB0, 0x22, 0xEB, 0x39, 0x1A, 0x1F, + 0xF0, 0x23, 0xDB, 0x06, 0x05, 0x1D, 0x3C, 0x0A, 0x9D, 0x25, 0xE3, 0x1D, + 0xC5, 0x15, 0x83, 0x0D, 0x9E, 0x03, 0x47, 0xFB, 0xDB, 0x1B, 0x5D, 0x16, + 0x08, 0x26, 0x19, 0x31, 0x16, 0x02, 0x72, 0x27, 0xBB, 0x06, 0x5F, 0x29, + 0x62, 0x37, 0x94, 0x41, 0x53, 0x40, 0x29, 0x46, 0xF9, 0x2A, 0x19, 0x3D, + 0x16, 0x1E, 0x61, 0x38, 0xE5, 0x05, 0xDC, 0x1E, 0x59, 0xDC, 0x99, 0xEF, + 0x9F, 0xC1, 0x54, 0xD1, 0xDC, 0xC1, 0xCA, 0xD2, 0x5A, 0xD0, 0x43, 0xE5, + 0x02, 0xF2, 0xED, 0x08, 0x17, 0x27, 0x8B, 0x2B, 0x8E, 0x49, 0x59, 0x38, + 0xFE, 0x3E, 0xB7, 0x2F, 0x3D, 0x23, 0x1A, 0x18, 0x03, 0x0C, 0x44, 0x03, + 0x60, 0xF1, 0x66, 0xF2, 0x9F, 0xE1, 0xCE, 0xE6, 0x37, 0xDF, 0xAE, 0xDB, + 0xDD, 0xE9, 0x3D, 0xD5, 0xBD, 0xF0, 0xDC, 0xCD, 0x35, 0xE6, 0xAE, 0xC4, + 0x7F, 0xDD, 0xF6, 0xC9, 0x8A, 0xE1, 0x02, 0xDE, 0x62, 0xE6, 0xC5, 0xE5, + 0xA1, 0xE1, 0x8A, 0xCE, 0x34, 0xEA, 0xD7, 0xCD, 0x48, 0xF3, 0xAD, 0xEB, + 0x37, 0xE5, 0x98, 0xF6, 0x95, 0xDE, 0xFF, 0xF4, 0x0F, 0xE9, 0x14, 0xF3, + 0xF7, 0xE7, 0xAE, 0xE1, 0xF9, 0xE5, 0x23, 0xDF, 0x56, 0xF2, 0xB2, 0xF4, + 0xB8, 0xF4, 0xE5, 0xF1, 0x9F, 0xDE, 0x8E, 0xD6, 0x28, 0xE3, 0xAF, 0xE1, + 0xC3, 0xF7, 0xF1, 0x04, 0x12, 0xE4, 0x86, 0xF9, 0xF3, 0xDC, 0xE2, 0xE5, + 0x04, 0x04, 0x53, 0xFA, 0x64, 0x19, 0x6F, 0x08, 0x4C, 0x08, 0xF5, 0xFB, + 0x19, 0xF4, 0x62, 0xF9, 0xEE, 0xD9, 0x93, 0xF0, 0x2C, 0xB5, 0xCD, 0xC8, + 0xE4, 0x9C, 0x84, 0xA4, 0xEB, 0xA3, 0x0B, 0x9F, 0x37, 0xC3, 0x8C, 0xAC, + 0x6E, 0xEA, 0x0E, 0xC9, 0x45, 0x16, 0xEF, 0xF5, 0x38, 0x38, 0x24, 0x19, + 0xA0, 0x36, 0x07, 0x1C, 0xA0, 0x11, 0x06, 0x07, 0x3C, 0xE9, 0x04, 0xF5, + 0xB7, 0xD0, 0xE8, 0xDE, 0xC8, 0xCC, 0x9F, 0xBD, 0xC0, 0xD3, 0x39, 0xAD, + 0x84, 0xE4, 0xFB, 0xBA, 0xF7, 0xE7, 0xF0, 0xC6, 0x2C, 0xD3, 0x91, 0xCC, + 0xC0, 0xCB, 0x40, 0xD9, 0xC7, 0xDA, 0x6D, 0xEB, 0xBE, 0xDF, 0x31, 0xF9, + 0x89, 0xD3, 0x90, 0xF2, 0xD8, 0xE0, 0x99, 0xF5, 0xFF, 0xFD, 0xBB, 0x08, + 0x33, 0x07, 0x7E, 0x0D, 0x57, 0x0B, 0xF4, 0x11, 0xF5, 0x0C, 0xFD, 0x18, + 0x9C, 0xF5, 0x71, 0x09, 0x82, 0xE7, 0xB4, 0x04, 0xEE, 0xEB, 0x25, 0x16, + 0xE5, 0xDB, 0x7C, 0x18, 0x12, 0xC9, 0x0F, 0x12, 0x78, 0xEB, 0xEF, 0x24, + 0xCA, 0x15, 0x91, 0x38, 0x53, 0x0A, 0x2E, 0x22, 0x82, 0x0E, 0x3E, 0x11, + 0x77, 0x39, 0xE9, 0x29, 0x39, 0x4E, 0xCD, 0x3D, 0xA4, 0x4D, 0x7B, 0x3D, + 0xD9, 0x4A, 0x8B, 0x43, 0x46, 0x2A, 0x21, 0x36, 0xCE, 0xF7, 0x78, 0x02, + 0x2C, 0xE4, 0x98, 0xD0, 0xDE, 0xEF, 0xDE, 0xBB, 0xC0, 0xFC, 0x07, 0xC7, + 0x0D, 0x13, 0x40, 0xF3, 0x47, 0x3E, 0xAF, 0x31, 0x45, 0x58, 0x7F, 0x5C, + 0x17, 0x52, 0xA6, 0x60, 0xA3, 0x44, 0x26, 0x51, 0xA4, 0x34, 0x8E, 0x3E, + 0xC6, 0x1F, 0x65, 0x24, 0x79, 0x19, 0xFF, 0x0C, 0x93, 0x1D, 0xC1, 0x0A, + 0xF7, 0x18, 0x6F, 0x12, 0x1D, 0x0F, 0xE1, 0x0D, 0xEE, 0x0F, 0x03, 0x08, + 0x3D, 0x1A, 0xC2, 0x06, 0xF8, 0x1D, 0x12, 0x05, 0x9E, 0x1C, 0x37, 0x07, + 0x9D, 0x18, 0xDC, 0x09, 0x54, 0x1E, 0x2D, 0x13, 0x4C, 0x28, 0x54, 0x22, + 0xE1, 0x29, 0x08, 0x31, 0xEB, 0x28, 0xCB, 0x3B, 0xE5, 0x26, 0xE7, 0x31, + 0xE6, 0x1B, 0x6F, 0x18, 0xCB, 0x1B, 0x5C, 0x1A, 0x8C, 0x1F, 0xE1, 0x23, + 0xD4, 0x09, 0x12, 0x10, 0x16, 0xF9, 0x35, 0x03, 0x9C, 0x0D, 0x82, 0x12, + 0x22, 0x23, 0xFA, 0x1A, 0x4E, 0x14, 0x1D, 0x12, 0xFC, 0x0D, 0xE6, 0x1B, + 0x31, 0x1F, 0x0B, 0x34, 0x9D, 0x20, 0x55, 0x3C, 0xBE, 0x19, 0x0E, 0x37, + 0xCB, 0x1A, 0xEF, 0x2E, 0x6E, 0x0D, 0x52, 0x11, 0x5C, 0xEC, 0x1E, 0xDD, + 0x90, 0xD7, 0x49, 0xBC, 0xA4, 0xD6, 0x4C, 0xB8, 0xFA, 0xDC, 0x82, 0xC2, + 0xD9, 0xF8, 0xFA, 0xEB, 0x0F, 0x2E, 0x2D, 0x2E, 0x8B, 0x50, 0x83, 0x53, + 0xFC, 0x4B, 0x6C, 0x4E, 0xCA, 0x36, 0xFC, 0x3D, 0xC9, 0x0F, 0x92, 0x26, + 0xF6, 0xE2, 0x0F, 0xFE, 0xD2, 0xD8, 0xFB, 0xE5, 0x79, 0xE7, 0xD8, 0xEE, + 0xCC, 0xED, 0xBA, 0xF3, 0xD0, 0xEE, 0x20, 0xEB, 0x1C, 0xF1, 0x12, 0xF0, + 0x68, 0xF8, 0x04, 0xF6, 0x3E, 0x06, 0x3C, 0xEE, 0x54, 0x0D, 0x23, 0xED, + 0xBC, 0xFC, 0x3D, 0xEB, 0xFA, 0xEC, 0xF0, 0xEE, 0xF3, 0xF1, 0xE4, 0xFE, + 0x1C, 0xFE, 0xE2, 0x09, 0x57, 0x0A, 0x11, 0x0D, 0xDF, 0x18, 0x4C, 0x04, + 0xAA, 0x17, 0xBC, 0xEB, 0x11, 0x0B, 0xCD, 0xE3, 0x7D, 0x05, 0x7E, 0xEE, + 0xFB, 0xED, 0x94, 0xE5, 0xE6, 0xD1, 0x55, 0xDB, 0xE6, 0xE2, 0xD1, 0xF0, + 0x9E, 0x02, 0x47, 0x07, 0xAA, 0xFF, 0x5A, 0xFB, 0x81, 0xF7, 0xC0, 0xF0, + 0x47, 0x02, 0x64, 0xFE, 0x7F, 0x12, 0x6C, 0x06, 0x0F, 0x1F, 0x59, 0x03, + 0x8A, 0x18, 0x80, 0x00, 0x71, 0xF8, 0xB6, 0xEF, 0xFE, 0xCA, 0xD6, 0xCD, + 0x64, 0xA4, 0x82, 0xAE, 0x4A, 0x9D, 0x2E, 0xA1, 0x5F, 0xB0, 0x8A, 0xAB, + 0xC9, 0xD1, 0x8B, 0xCD, 0xA6, 0xFA, 0xBD, 0x00, 0x41, 0x14, 0xA3, 0x29, + 0x61, 0x15, 0x4E, 0x2E, 0x40, 0x0B, 0x5D, 0x1E, 0x93, 0xF7, 0xCA, 0x0F, + 0x9C, 0xDE, 0xB9, 0xF7, 0x18, 0xCF, 0x58, 0xDD, 0xDC, 0xCB, 0x38, 0xD4, + 0x9F, 0xD5, 0xAE, 0xD5, 0x3F, 0xE4, 0x27, 0xD1, 0x5C, 0xEB, 0x62, 0xCA, + 0x9F, 0xEB, 0xEF, 0xD1, 0x62, 0xE7, 0xDA, 0xDE, 0xCF, 0xE2, 0x04, 0xEA, + 0x0B, 0xD1, 0x7A, 0xEC, 0xB6, 0xC7, 0xDE, 0xF1, 0xC6, 0xDB, 0xF9, 0x02, + 0x8A, 0xEF, 0xCA, 0x12, 0x05, 0xF9, 0x84, 0x18, 0x14, 0x09, 0x36, 0x16, + 0xBE, 0x08, 0x16, 0x09, 0x4D, 0xF5, 0x13, 0xF8, 0x13, 0xF9, 0x91, 0xFC, + 0x13, 0xFB, 0x9C, 0xFE, 0x3D, 0xE6, 0xED, 0xED, 0x30, 0xEE, 0x16, 0xEE, + 0x16, 0x13, 0x12, 0x00, 0xFA, 0x15, 0x3B, 0xF7, 0x7E, 0x09, 0x2F, 0xE6, + 0x76, 0x1A, 0xB3, 0xFE, 0x47, 0x21, 0xA2, 0x22, 0xE3, 0x0C, 0x29, 0x2A, + 0xED, 0x06, 0x58, 0x20, 0x24, 0x06, 0xE8, 0x0A, 0xFE, 0xED, 0x84, 0xE3, + 0xEA, 0xCB, 0x52, 0xBB, 0xEF, 0xB7, 0xCF, 0xA9, 0xB8, 0xBE, 0xC8, 0xB7, + 0x4E, 0xE6, 0x3A, 0xDC, 0x80, 0x1D, 0x83, 0x08, 0x29, 0x44, 0x0E, 0x34, + 0x52, 0x48, 0x4D, 0x4B, 0x62, 0x2D, 0xCA, 0x3E, 0xB8, 0x08, 0x44, 0x25, + 0x91, 0xEF, 0x74, 0x11, 0x57, 0xE5, 0xA8, 0xFA, 0x71, 0xE4, 0xEB, 0xE1, + 0x17, 0xF3, 0x25, 0xD9, 0x61, 0x07, 0xCB, 0xE3, 0x3E, 0x01, 0xE7, 0xEA, + 0xA2, 0xF5, 0xB6, 0xF4, 0x8A, 0xFC, 0x76, 0x0A, 0x2D, 0x0B, 0x11, 0x19, + 0x23, 0x0F, 0x40, 0x10, 0x95, 0x04, 0xCB, 0xFB, 0xF9, 0x05, 0x42, 0xF9, + 0x69, 0x13, 0x86, 0x09, 0xC6, 0x18, 0xF4, 0x1C, 0xD5, 0x1D, 0xFC, 0x2D, + 0x7A, 0x1D, 0x29, 0x39, 0x24, 0x02, 0x5A, 0x2F, 0xE9, 0xF7, 0xC4, 0x24, + 0x55, 0x04, 0xC8, 0x1F, 0x9D, 0xFD, 0xE3, 0x06, 0x74, 0xFF, 0x88, 0xF7, + 0x38, 0x22, 0x31, 0x0E, 0x33, 0x2D, 0x30, 0x18, 0xFD, 0x12, 0x84, 0x04, + 0x2D, 0x13, 0x35, 0x09, 0xAA, 0x2F, 0xB4, 0x1D, 0xC0, 0x34, 0x7D, 0x1F, + 0x0B, 0x2A, 0x69, 0x19, 0xB7, 0x20, 0x56, 0x11, 0xC9, 0xF7, 0xCA, 0xF4, + 0x23, 0xBC, 0x6A, 0xC7, 0xFD, 0xA1, 0xB1, 0xA7, 0x9F, 0xAE, 0xEA, 0xAB, + 0x11, 0xD2, 0xD1, 0xC8, 0xBF, 0x02, 0x72, 0xF4, 0x07, 0x2F, 0x47, 0x2D, + 0xD9, 0x43, 0xA9, 0x56, 0xAC, 0x36, 0xF7, 0x55, 0x3F, 0x1E, 0x0C, 0x3C, + 0x34, 0x13, 0x79, 0x1F, 0x67, 0x02, 0xBB, 0x01, 0x98, 0xE9, 0x07, 0xE8, + 0xB9, 0xE1, 0x54, 0xE0, 0xCC, 0xEE, 0x31, 0xEC, 0xD9, 0xFE, 0xEA, 0xF8, + 0x70, 0x08, 0x00, 0x08, 0x21, 0x09, 0xB0, 0x19, 0x09, 0x08, 0x70, 0x1D, + 0x40, 0x0B, 0x62, 0x14, 0x1B, 0x02, 0x28, 0xF9, 0xE4, 0xFD, 0x17, 0xE6, + 0x91, 0x0C, 0xF8, 0xFA, 0x88, 0x1C, 0x50, 0x19, 0xC2, 0x28, 0xD8, 0x24, + 0xE2, 0x3F, 0x14, 0x2D, 0xD3, 0x47, 0x20, 0x22, 0x04, 0x37, 0x27, 0x0B, + 0x8A, 0x2F, 0x1A, 0x0F, 0xE2, 0x27, 0x53, 0x0A, 0xBA, 0x11, 0x0B, 0xF4, + 0xF4, 0x0F, 0x39, 0x04, 0x70, 0x20, 0x88, 0x28, 0x79, 0x17, 0xF4, 0x22, + 0x20, 0x12, 0xAB, 0x19, 0x9E, 0x2B, 0xFB, 0x30, 0x52, 0x39, 0xE2, 0x40, + 0x28, 0x30, 0xBC, 0x3F, 0x85, 0x23, 0xF2, 0x40, 0x24, 0x0B, 0x1A, 0x31, + 0xE5, 0xE0, 0xE6, 0x04, 0x0E, 0xBB, 0xA1, 0xE0, 0x58, 0xB0, 0xF2, 0xD6, + 0x93, 0xCB, 0xD4, 0xD9, 0x57, 0x03, 0x7C, 0xEF, 0xCD, 0x33, 0x71, 0x19, + 0x2C, 0x48, 0x94, 0x3E, 0xF7, 0x40, 0x8D, 0x46, 0x48, 0x1E, 0x83, 0x2F, + 0xA5, 0xFC, 0x71, 0x1B, 0x18, 0xE5, 0x94, 0x0C, 0x1E, 0xCD, 0xB2, 0xF1, + 0x73, 0xC1, 0xB1, 0xDA, 0xF4, 0xCE, 0x25, 0xD7, 0x25, 0xE8, 0xFB, 0xDA, + 0x15, 0xF3, 0x99, 0xDF, 0x15, 0xF9, 0x30, 0xEF, 0x7F, 0x04, 0xEC, 0xF4, + 0x3F, 0x11, 0xE3, 0xF2, 0xB7, 0xFB, 0xF7, 0xE5, 0xE3, 0xCE, 0xA5, 0xC9, + 0xEB, 0xC3, 0x75, 0xC5, 0xBE, 0xD0, 0xB6, 0xD5, 0x52, 0xD9, 0x02, 0xDB, + 0x23, 0xEE, 0xD1, 0xE8, 0x74, 0x00, 0x2D, 0xFB, 0x56, 0xF0, 0x5B, 0xED, + 0x64, 0xE6, 0x12, 0xE4, 0x3A, 0xF3, 0xC1, 0xEA, 0xE6, 0xEC, 0x11, 0xDB, + 0xCE, 0xDF, 0x69, 0xD0, 0x08, 0xEF, 0xC9, 0xED, 0x5C, 0xED, 0x29, 0xF6, + 0x60, 0xDC, 0x2D, 0xDD, 0x9B, 0xF3, 0xB6, 0xE1, 0xB5, 0x13, 0xE6, 0xFA, + 0xD0, 0x15, 0x34, 0xFD, 0xBD, 0x0A, 0x25, 0xF6, 0x19, 0xEF, 0x68, 0xEF, + 0x35, 0xC4, 0x1B, 0xD1, 0xD1, 0xA6, 0x89, 0xAA, 0x4D, 0x9E, 0x76, 0x9B, + 0xAC, 0xAD, 0xC7, 0xA2, 0xAB, 0xD4, 0x8A, 0xBA, 0x4A, 0xFD, 0x2C, 0xE4, + 0x56, 0x15, 0xEA, 0x0F, 0x6F, 0x1D, 0x91, 0x2F, 0x57, 0x18, 0x29, 0x30, + 0xA6, 0x08, 0x08, 0x0C, 0x5F, 0xFA, 0x74, 0xE4, 0xEC, 0xE8, 0x1C, 0xC5, + 0xE5, 0xD0, 0xAF, 0xB0, 0x8D, 0xC0, 0xB7, 0xB6, 0xDD, 0xC6, 0x17, 0xCC, + 0x64, 0xDD, 0x17, 0xDF, 0xF0, 0xEF, 0xE0, 0xEE, 0x23, 0xFA, 0xCF, 0x02, + 0x52, 0xF6, 0x1E, 0x0F, 0xBC, 0xED, 0xB4, 0x0A, 0x6D, 0xDD, 0x07, 0xEB, + 0x3A, 0xD1, 0x4E, 0xCE, 0x64, 0xDF, 0x01, 0xD4, 0x40, 0xF0, 0x0D, 0xE7, + 0xD6, 0xF8, 0x2E, 0xFA, 0xEF, 0x0C, 0x0A, 0x12, 0xA0, 0x10, 0xAE, 0x1A, + 0xB1, 0xF9, 0x39, 0x15, 0x43, 0xFC, 0x3C, 0x21, 0xD6, 0x01, 0x1A, 0x22, + 0x1F, 0xEB, 0xB6, 0x04, 0xAC, 0xE9, 0x8B, 0xFC, 0xB7, 0xFE, 0xA0, 0x13, + 0x06, 0xFA, 0x20, 0x10, 0x3D, 0xFD, 0x5D, 0x03, 0x3F, 0x23, 0x40, 0x1D, + 0xB5, 0x3B, 0x47, 0x3C, 0xE5, 0x3B, 0x98, 0x3A, 0xAC, 0x40, 0xAB, 0x2E, + 0x57, 0x39, 0x3A, 0x1A, 0xAC, 0x12, 0x4B, 0xEF, 0xA1, 0xEF, 0x14, 0xCB, + 0x24, 0xE2, 0xE3, 0xC6, 0xE2, 0xE7, 0xEE, 0xDE, 0x1B, 0x07, 0xD3, 0x04, + 0x56, 0x37, 0xA6, 0x2E, 0xD2, 0x5A, 0x2A, 0x56, 0x4D, 0x64, 0x65, 0x63, + 0x48, 0x5C, 0x83, 0x50, 0xCD, 0x4B, 0x5B, 0x3D, 0x9F, 0x31, 0x4F, 0x32, + 0xE9, 0x11, 0xF3, 0x1E, 0xCB, 0x03, 0x6E, 0x0D, 0x22, 0x0E, 0x74, 0x00, + 0xAB, 0x25, 0xCF, 0x00, 0x27, 0x3A, 0xA2, 0x11, 0xC1, 0x46, 0x2E, 0x24, + 0x47, 0x46, 0x57, 0x30, 0xAE, 0x31, 0x8B, 0x2E, 0x33, 0x1F, 0x46, 0x21, + 0x9B, 0x06, 0x87, 0x02, 0x12, 0xF1, 0x45, 0xE7, 0x9C, 0xF5, 0x18, 0xE7, + 0x64, 0x00, 0xB4, 0xFB, 0x9F, 0x06, 0x53, 0x18, 0x46, 0x13, 0xE8, 0x2F, + 0x95, 0x17, 0x4A, 0x2D, 0xBB, 0x17, 0xC7, 0x21, 0xF3, 0x26, 0x56, 0x29, + 0xCE, 0x1F, 0x99, 0x1B, 0x81, 0x02, 0xBD, 0xFB, 0x41, 0xFE, 0xBD, 0x0D, + 0x56, 0xF9, 0xD2, 0x2A, 0x25, 0xE2, 0xDB, 0x1F, 0xA4, 0xF7, 0xDF, 0x23, + 0x1C, 0x2F, 0xC8, 0x33, 0xF4, 0x40, 0xA3, 0x24, 0x24, 0x30, 0x5E, 0x1B, + 0x77, 0x1C, 0x5C, 0x20, 0xDC, 0xF9, 0xB9, 0x09, 0x30, 0xD8, 0x4B, 0xE6, + 0x92, 0xD6, 0x1C, 0xD6, 0xAD, 0xDD, 0x59, 0xD2, 0xD1, 0xE0, 0x7A, 0xDD, + 0xF7, 0xF8, 0xA6, 0xFB, 0xF7, 0x21, 0x10, 0x22, 0xE3, 0x44, 0x0C, 0x45, + 0x70, 0x4A, 0xA6, 0x4F, 0x04, 0x35, 0x84, 0x3B, 0x70, 0x22, 0xA8, 0x1F, + 0xF7, 0x07, 0x5A, 0x01, 0xFA, 0xDD, 0x20, 0xE3, 0x51, 0xD3, 0xA5, 0xD7, + 0x00, 0xE7, 0xAF, 0xDB, 0xEF, 0xF9, 0xCB, 0xE9, 0x07, 0x09, 0x7A, 0xFD, + 0x7F, 0x18, 0x02, 0x13, 0xAE, 0x1E, 0xD1, 0x20, 0x87, 0x17, 0xE4, 0x1B, + 0x2F, 0x08, 0xAA, 0x02, 0x35, 0xED, 0x79, 0xD4, 0xE2, 0xDC, 0x10, 0xC0, + 0x9E, 0xD2, 0x9B, 0xCA, 0x9E, 0xD1, 0x26, 0xD6, 0x1C, 0xF5, 0x11, 0xF2, + 0x18, 0x1A, 0xE6, 0x04, 0x76, 0x1A, 0x49, 0xE9, 0xD4, 0x19, 0x1F, 0xDF, + 0xD7, 0x17, 0x4D, 0xF5, 0x97, 0xEC, 0xD6, 0xE1, 0x0C, 0xC4, 0x69, 0xC9, + 0x02, 0xD0, 0x10, 0xE7, 0x29, 0xD7, 0xC4, 0xF2, 0xD1, 0xC8, 0x39, 0xDA, + 0x14, 0xDD, 0xBE, 0xE5, 0xA3, 0xF8, 0x37, 0x02, 0xB6, 0xF4, 0x01, 0x06, + 0x86, 0xEA, 0x50, 0xFD, 0xAC, 0xE4, 0x91, 0xF0, 0x16, 0xD1, 0x7C, 0xD2, + 0xF0, 0xB8, 0x4E, 0xB2, 0x41, 0xA8, 0x00, 0xA4, 0xBB, 0xA0, 0x13, 0xA2, + 0x83, 0xAD, 0x85, 0xB4, 0x4E, 0xCC, 0x67, 0xE0, 0x54, 0xFC, 0x7C, 0x14, + 0xE0, 0x25, 0xA0, 0x3A, 0x50, 0x22, 0xA7, 0x3E, 0xD5, 0x0B, 0x84, 0x23, + 0xB7, 0x05, 0xCD, 0x03, 0xE8, 0xF0, 0xB2, 0xDD, 0xEC, 0xD2, 0x2E, 0xB5, + 0xAE, 0xD3, 0x72, 0xAB, 0xAF, 0xE1, 0x70, 0xBA, 0xDE, 0xED, 0xE8, 0xCF, + 0xCF, 0xFD, 0xE3, 0xED, 0x38, 0x0B, 0xDE, 0x0F, 0x51, 0x07, 0x8D, 0x1E, + 0x5B, 0xF9, 0x9A, 0x14, 0xCB, 0xED, 0x11, 0xFA, 0x09, 0xD5, 0x59, 0xD3, + 0xDA, 0xC1, 0xCA, 0xC5, 0xF4, 0xC1, 0x38, 0xD5, 0x06, 0xD1, 0x4B, 0xF0, + 0xCC, 0xF8, 0x48, 0x0E, 0x41, 0x28, 0xE9, 0x17, 0xD7, 0x33, 0x80, 0x0C, + 0xDC, 0x2F, 0x57, 0x17, 0x12, 0x27, 0xF6, 0x20, 0x54, 0xFF, 0x8B, 0xFA, + 0xDB, 0xE9, 0xDD, 0xDF, 0x20, 0x00, 0x93, 0xF8, 0xD8, 0x03, 0xAD, 0x06, + 0x89, 0xF3, 0x15, 0xF9, 0x99, 0x0F, 0x03, 0x11, 0x56, 0x2E, 0x69, 0x2D, + 0xED, 0x25, 0xE0, 0x24, 0xA5, 0x17, 0xA1, 0x1F, 0xB1, 0x13, 0x4E, 0x1B, + 0x94, 0x10, 0x2F, 0xF7, 0xB2, 0xF9, 0x65, 0xC8, 0x9F, 0xD6, 0x5F, 0xB9, + 0x96, 0xCB, 0x54, 0xCD, 0x62, 0xDF, 0x76, 0xEF, 0xB1, 0xFC, 0x96, 0x11, + 0xA6, 0x24, 0x33, 0x39, 0xDE, 0x4C, 0x66, 0x56, 0xFD, 0x57, 0xD9, 0x4C, + 0xB5, 0x43, 0xA2, 0x27, 0x13, 0x2D, 0xC2, 0x08, 0x64, 0x07, 0x68, 0xEA, + 0x8F, 0xD4, 0xC4, 0xD8, 0x04, 0xCC, 0x94, 0xEB, 0xE6, 0xEC, 0xF0, 0x01, + 0x18, 0x0E, 0x9E, 0x10, 0x70, 0x23, 0x72, 0x25, 0x18, 0x31, 0x7A, 0x35, + 0x72, 0x31, 0x99, 0x30, 0xA0, 0x20, 0x0A, 0x1D, 0x23, 0xFB, 0x01, 0x06, + 0x56, 0xCA, 0xE6, 0xE6, 0x7F, 0xC3, 0xFE, 0xDA, 0xA8, 0xE4, 0x63, 0xF1, + 0xC0, 0xF7, 0x4E, 0x05, 0x5D, 0x08, 0x06, 0x12, 0xA3, 0x27, 0x7B, 0x2E, + 0x0E, 0x22, 0x77, 0x32, 0xE4, 0x10, 0xF1, 0x24, 0x4E, 0x19, 0x32, 0x24, + 0x3E, 0xFF, 0x69, 0x01, 0xE8, 0xE0, 0xA6, 0xDC, 0x2A, 0xF5, 0x90, 0xE8, + 0xFD, 0xFA, 0xDD, 0xEF, 0xFC, 0xDF, 0x8A, 0xEB, 0xAC, 0xEB, 0xAA, 0x08, + 0x23, 0x12, 0xCF, 0x25, 0x22, 0x15, 0x25, 0x1B, 0xB8, 0x0A, 0x20, 0x04, + 0xDD, 0x0C, 0x71, 0xEB, 0xC6, 0xF5, 0x48, 0xC2, 0xC1, 0xC6, 0x69, 0xA2, + 0xB6, 0xA4, 0xC1, 0xA3, 0x78, 0x9E, 0xAB, 0xB7, 0x4D, 0xB8, 0xCA, 0xCE, + 0x4E, 0xED, 0xD0, 0xEF, 0xA9, 0x23, 0x47, 0x19, 0x80, 0x3C, 0x30, 0x34, + 0x4C, 0x2D, 0x94, 0x38, 0x26, 0x09, 0x94, 0x28, 0x15, 0xF0, 0x41, 0x0A, + 0x7F, 0xDC, 0x7E, 0xE5, 0x6E, 0xC8, 0xC1, 0xCA, 0x40, 0xCF, 0xE6, 0xC9, + 0x59, 0xE6, 0xE8, 0xCF, 0x6F, 0xFC, 0x3E, 0xDD, 0x3D, 0x12, 0x19, 0x00, + 0xCD, 0x1C, 0xF1, 0x1B, 0x5B, 0x1E, 0x19, 0x1C, 0xD8, 0x17, 0x39, 0x07, + 0x48, 0x09, 0xE9, 0xE8, 0x44, 0xE9, 0x54, 0xBE, 0x23, 0xDE, 0x34, 0xBA, + 0xC0, 0xF6, 0x63, 0xE1, 0x3E, 0x0F, 0x65, 0xFC, 0x99, 0x2A, 0xB5, 0x19, + 0x44, 0x42, 0xD1, 0x3D, 0x23, 0x39, 0x90, 0x3F, 0xEE, 0x30, 0x68, 0x37, + 0x20, 0x36, 0xBE, 0x35, 0xC8, 0x12, 0xFB, 0x11, 0x06, 0xF1, 0xEA, 0xFC, + 0x5E, 0xFC, 0x2B, 0x1B, 0x02, 0x02, 0xD9, 0x33, 0x6C, 0xF9, 0x63, 0x33, + 0xC3, 0x19, 0x78, 0x49, 0xE1, 0x3E, 0x41, 0x60, 0x26, 0x3C, 0x2D, 0x52, + 0xEE, 0x3E, 0x85, 0x45, 0x18, 0x3C, 0x86, 0x35, 0xDE, 0x16, 0x6A, 0x0D, + 0x9C, 0xF1, 0x72, 0xEA, 0x81, 0xDD, 0xD8, 0xD5, 0x22, 0xDA, 0x48, 0xCC, + 0xA5, 0xF3, 0xB2, 0xE1, 0xBF, 0x16, 0xFE, 0x0D, 0xBE, 0x28, 0xDA, 0x36, + 0x32, 0x2F, 0xF2, 0x52, 0x59, 0x34, 0xE6, 0x58, 0xBD, 0x2B, 0x60, 0x3F, + 0xF7, 0x10, 0x33, 0x14, 0x8A, 0xFC, 0x8D, 0xEF, 0x72, 0xEF, 0x8C, 0xD0, + 0x26, 0xE9, 0xF2, 0xC2, 0x1E, 0xF6, 0x02, 0xD7, 0x43, 0x07, 0x37, 0xF9, + 0xD3, 0x18, 0xC7, 0x1C, 0x5A, 0x25, 0x08, 0x2C, 0x23, 0x25, 0x1D, 0x20, + 0x28, 0x14, 0x3A, 0x06, 0x30, 0xF0, 0x2E, 0xE0, 0x2D, 0xC9, 0xA0, 0xB4, + 0x57, 0xC5, 0x10, 0xA7, 0xD7, 0xE3, 0xDC, 0xC1, 0x70, 0xF2, 0xB0, 0xDC, + 0xBC, 0xFF, 0xE6, 0xFC, 0x18, 0x20, 0x82, 0x26, 0x6A, 0x20, 0x56, 0x23, + 0x71, 0x0C, 0x42, 0x08, 0x1F, 0x0F, 0xC6, 0x07, 0xD8, 0xF6, 0x3D, 0xEC, + 0x0B, 0xCD, 0xC2, 0xBE, 0x1F, 0xCD, 0xCF, 0xC6, 0x11, 0xD4, 0x49, 0xE0, + 0xBA, 0xCD, 0xBA, 0xE1, 0x55, 0xE8, 0x45, 0xEE, 0xD6, 0x16, 0xF9, 0x05, + 0x09, 0x1E, 0x42, 0x04, 0x4F, 0x06, 0x17, 0xF6, 0x7E, 0xF0, 0x3D, 0xE9, + 0x9D, 0xDE, 0xC8, 0xD2, 0x04, 0xC3, 0xBA, 0xAF, 0xEB, 0xA6, 0x0A, 0x96, + 0x66, 0xA7, 0x6D, 0x9E, 0x54, 0xC1, 0xF1, 0xBA, 0x72, 0xE8, 0x28, 0xE4, + 0x9D, 0x0F, 0x10, 0x1B, 0x28, 0x18, 0xC1, 0x3B, 0x63, 0x0E, 0xD0, 0x39, + 0x2A, 0x07, 0x64, 0x1E, 0x6A, 0xFC, 0x3D, 0xF5, 0x15, 0xEC, 0xBF, 0xD6, + 0x90, 0xCF, 0xA7, 0xC2, 0x9C, 0xB4, 0x6F, 0xB9, 0x0C, 0xB9, 0x68, 0xCE, + 0x26, 0xD2, 0x51, 0xF7, 0x8B, 0xEE, 0x57, 0x21, 0x34, 0x00, 0xFB, 0x32, + 0x0E, 0x09, 0xC6, 0x27, 0xE4, 0x03, 0x5C, 0x09, 0x20, 0xEC, 0xD8, 0xE8, + 0xEF, 0xCE, 0x26, 0xD5, 0x65, 0xC0, 0x11, 0xD2, 0x68, 0xD4, 0xA5, 0xE8, + 0x5F, 0xF7, 0xBF, 0x08, 0xD4, 0x1B, 0xC5, 0x2B, 0x30, 0x35, 0xF2, 0x44, + 0x97, 0x29, 0x38, 0x36, 0xEF, 0x16, 0x10, 0x1D, 0xC1, 0x21, 0xC7, 0x21, + 0x06, 0x1F, 0x17, 0x1B, 0xBD, 0xFE, 0x1D, 0xF7, 0xBC, 0x02, 0x7E, 0xF5, + 0x40, 0x29, 0x73, 0x14, 0x64, 0x34, 0x7F, 0x17, 0x1A, 0x3B, 0x3B, 0x18, + 0xFC, 0x52, 0x4C, 0x31, 0xFA, 0x4F, 0x22, 0x3A, 0xF7, 0x39, 0xB1, 0x33, + 0x6A, 0x3C, 0xED, 0x3A, 0xDD, 0x38, 0xAF, 0x2E, 0x0F, 0x12, 0x93, 0xFF, + 0xED, 0xEF, 0xB4, 0xE1, 0x40, 0xE3, 0x2B, 0xE4, 0x7B, 0xE1, 0x0E, 0xF4, + 0x01, 0xF9, 0x27, 0x17, 0xB8, 0x25, 0x4B, 0x45, 0x8B, 0x3E, 0x11, 0x56, + 0x18, 0x4E, 0x0B, 0x56, 0x5C, 0x5F, 0xA8, 0x55, 0x64, 0x46, 0xCB, 0x36, + 0x33, 0x17, 0x57, 0x14, 0x35, 0xFC, 0xF6, 0x0A, 0x19, 0xE8, 0xA2, 0xF9, + 0x7A, 0xE3, 0xB0, 0xE7, 0x46, 0xF6, 0x93, 0xED, 0xAE, 0x11, 0x26, 0x0A, + 0x04, 0x1B, 0xCD, 0x1E, 0x70, 0x1E, 0x2E, 0x2B, 0xA1, 0x22, 0xFE, 0x2E, + 0x49, 0x15, 0xEC, 0x16, 0xCC, 0x00, 0x2F, 0xF3, 0xDA, 0xE6, 0xAD, 0xD2, + 0x51, 0xE1, 0x7D, 0xD3, 0xB0, 0xF4, 0x8B, 0xF1, 0xEC, 0x09, 0x3C, 0x15, + 0xDF, 0x15, 0x28, 0x35, 0xDD, 0x18, 0xFF, 0x42, 0x7A, 0x06, 0x03, 0x28, + 0x3C, 0xFB, 0x8C, 0x0B, 0x5D, 0xFA, 0x63, 0xF8, 0x43, 0xDB, 0xA4, 0xC7, + 0xE2, 0xC8, 0x30, 0xAF, 0xFE, 0xE4, 0x9B, 0xD2, 0x7F, 0xF7, 0xF1, 0xE9, + 0xCF, 0xF2, 0xF7, 0xE5, 0xD6, 0x04, 0x28, 0xFE, 0x6F, 0x1A, 0xFB, 0x16, + 0x61, 0x1D, 0xF4, 0x0C, 0xE4, 0x1E, 0x06, 0xFE, 0x8B, 0x15, 0x6F, 0xF7, + 0x7B, 0xEA, 0xD0, 0xE3, 0x0F, 0xBC, 0x1B, 0xCA, 0xFF, 0xBD, 0xB0, 0xCB, + 0x53, 0xD5, 0x73, 0xD5, 0xC9, 0xEF, 0x8A, 0xE9, 0x34, 0x16, 0xCE, 0x16, + 0x96, 0x2A, 0xE3, 0x35, 0x68, 0x3A, 0x47, 0x44, 0xF6, 0x4C, 0x7B, 0x45, + 0x45, 0x3D, 0x49, 0x2A, 0x8C, 0x0F, 0x43, 0x07, 0xBC, 0xEC, 0x86, 0xEE, + 0x5E, 0xE1, 0x40, 0xDA, 0x86, 0xDD, 0xB3, 0xD1, 0xAE, 0xE3, 0xE1, 0xE5, + 0x2C, 0x00, 0xA4, 0x0B, 0x5B, 0x1F, 0x61, 0x21, 0xA3, 0x30, 0x11, 0x23, + 0x81, 0x2E, 0x82, 0x14, 0xD7, 0x10, 0x25, 0xF2, 0x29, 0xF4, 0x57, 0xDA, + 0x6A, 0xDA, 0x3F, 0xC4, 0x1A, 0xD6, 0x5D, 0xBC, 0x21, 0xF4, 0x2F, 0xDE, + 0xC8, 0x06, 0xD3, 0x00, 0xD3, 0x0F, 0x9E, 0x15, 0xD8, 0x21, 0xCF, 0x25, + 0xCB, 0x16, 0xCD, 0x15, 0x26, 0xFA, 0xA9, 0xFA, 0x3B, 0xF2, 0x7B, 0xF8, + 0x65, 0xD9, 0xAE, 0xDF, 0xE8, 0xBC, 0x36, 0xBC, 0xD3, 0xDA, 0x97, 0xD6, + 0x92, 0xF7, 0x70, 0xFB, 0x7D, 0xE4, 0xC8, 0xF8, 0x18, 0xF0, 0xF0, 0x18, + 0x9A, 0x08, 0xD2, 0x3F, 0x10, 0xF7, 0xF6, 0x25, 0xCA, 0xF7, 0xFF, 0x07, + 0x61, 0x06, 0xCA, 0xFA, 0xF0, 0xEA, 0x6C, 0xD7, 0x08, 0xC5, 0x1A, 0xBA, + 0xAC, 0xAE, 0xA7, 0xB3, 0x9A, 0xA2, 0x14, 0xB6, 0x2C, 0xB9, 0xAF, 0xD1, + 0x34, 0xEA, 0x04, 0x01, 0x50, 0x0E, 0x89, 0x22, 0x5B, 0x1E, 0xBB, 0x2D, + 0x85, 0x21, 0x0E, 0x29, 0x25, 0x19, 0x39, 0x1A, 0xAA, 0x00, 0x57, 0xFE, + 0xF7, 0xE3, 0xB6, 0xE0, 0x7E, 0xCE, 0x18, 0xCD, 0x56, 0xBF, 0x3E, 0xC4, + 0xBF, 0xBE, 0xFA, 0xD2, 0x47, 0xD3, 0xFC, 0xF5, 0x13, 0xF8, 0x1F, 0x0F, + 0xFB, 0x12, 0x6C, 0x05, 0x23, 0x28, 0x88, 0x01, 0x91, 0x19, 0xC3, 0xF2, + 0x77, 0xF2, 0xC5, 0xD4, 0x59, 0xD7, 0x27, 0xC8, 0x8E, 0xC1, 0x9D, 0xC2, + 0xC4, 0xD7, 0x1E, 0xD9, 0x55, 0x09, 0xFB, 0x05, 0xDD, 0x12, 0x02, 0x1C, + 0x57, 0x09, 0x65, 0x1E, 0xF8, 0x09, 0xB6, 0x13, 0xFD, 0xFE, 0xE7, 0xF8, + 0x6D, 0xF6, 0x2A, 0xE9, 0x72, 0xF6, 0xBA, 0xE0, 0x70, 0xE5, 0x7A, 0xC9, + 0x7D, 0xDE, 0x5A, 0xC8, 0x61, 0xFA, 0x69, 0xEA, 0x0C, 0x0A, 0x13, 0xFA, + 0xBC, 0x15, 0xA6, 0x0B, 0x49, 0x2D, 0x9F, 0x34, 0x94, 0x21, 0xCA, 0x36, + 0x90, 0x08, 0xD2, 0x19, 0xCD, 0x0B, 0xB1, 0x0D, 0x38, 0x02, 0x5B, 0xF8, + 0x9C, 0xE6, 0xD5, 0xD2, 0x50, 0xD4, 0x31, 0xBA, 0x64, 0xC1, 0x59, 0xB7, + 0x20, 0xC3, 0xA6, 0xD7, 0xB0, 0xE4, 0x9B, 0x03, 0xE9, 0x05, 0x17, 0x1B, + 0x91, 0x29, 0xB1, 0x33, 0xB5, 0x54, 0x99, 0x4A, 0xD1, 0x5E, 0xA5, 0x40, + 0x82, 0x2C, 0x34, 0x1B, 0x92, 0xEF, 0xBA, 0xFE, 0xE1, 0xD2, 0x3A, 0xEF, + 0x08, 0xC3, 0x7F, 0xDE, 0x43, 0xCD, 0xEB, 0xE5, 0x73, 0xF1, 0x4F, 0xFC, + 0x6A, 0x19, 0x31, 0x16, 0xA6, 0x26, 0xBF, 0x27, 0x14, 0x25, 0xB2, 0x2A, + 0x98, 0x1F, 0xD8, 0x18, 0x80, 0x09, 0x66, 0xF4, 0xCE, 0xF5, 0x60, 0xE0, + 0xF6, 0xEB, 0x41, 0xDF, 0x6D, 0xF1, 0x12, 0xEE, 0xE1, 0x04, 0xE1, 0x07, + 0x38, 0x1B, 0x22, 0x23, 0x1A, 0x2D, 0x1B, 0x36, 0x34, 0x31, 0xE4, 0x34, + 0xEE, 0x1D, 0x72, 0x19, 0xB0, 0x0B, 0x31, 0xFE, 0x08, 0xFF, 0x59, 0xE5, + 0xD6, 0xE8, 0x80, 0xCB, 0xAE, 0xE6, 0x71, 0xD7, 0xB8, 0x03, 0x7D, 0x08, + 0xBE, 0x0C, 0xD4, 0x22, 0x6A, 0x06, 0xC7, 0x2B, 0xBA, 0x1C, 0xA5, 0x3E, + 0x7E, 0x2B, 0x52, 0x2E, 0x80, 0x27, 0x6D, 0x0B, 0x8C, 0x29, 0x18, 0x09, + 0xBF, 0x12, 0xFB, 0x03, 0xE9, 0xEB, 0xD7, 0xF4, 0x01, 0xE2, 0xB9, 0xF7, + 0xC1, 0xE1, 0xDF, 0xF0, 0x29, 0xE0, 0x4E, 0xE6, 0xAC, 0xF5, 0x10, 0x02, + 0x87, 0x0D, 0x52, 0x24, 0x57, 0x1B, 0xB1, 0x2D, 0x72, 0x3D, 0xC1, 0x3E, + 0x76, 0x5C, 0x7C, 0x4A, 0x9D, 0x48, 0x34, 0x25, 0xE5, 0x1B, 0x4B, 0xEB, + 0x37, 0x0A, 0x51, 0xD8, 0x8D, 0xF7, 0xC2, 0xCF, 0xDC, 0xDC, 0xAC, 0xC0, + 0xD0, 0xEC, 0xAB, 0xD8, 0x2B, 0x16, 0x87, 0x07, 0xBE, 0x2F, 0x57, 0x1D, + 0xBD, 0x34, 0x57, 0x1A, 0x15, 0x2D, 0x25, 0x17, 0x54, 0x15, 0xA3, 0x09, + 0xCA, 0x04, 0xFE, 0xF8, 0x80, 0xF0, 0x88, 0xED, 0x74, 0xE0, 0xB6, 0xFE, + 0x06, 0xEB, 0xC9, 0x2A, 0x60, 0xF8, 0xE6, 0x44, 0xC5, 0x06, 0x90, 0x4A, + 0x68, 0x23, 0x73, 0x43, 0x1C, 0x32, 0x64, 0x23, 0xF3, 0x21, 0xB2, 0x02, + 0x9C, 0x0B, 0xFC, 0x03, 0x08, 0xE4, 0x73, 0xFF, 0x5C, 0xCC, 0x58, 0xFD, + 0xE4, 0xF6, 0xF3, 0x25, 0xFA, 0x1C, 0x21, 0x3B, 0xDC, 0x12, 0x35, 0x25, + 0xD5, 0x1E, 0xAA, 0x30, 0xA1, 0x29, 0x28, 0x43, 0x48, 0x0A, 0x69, 0x2A, + 0x74, 0x06, 0xA4, 0x18, 0x2D, 0x15, 0xCA, 0x0D, 0x7F, 0xFE, 0x94, 0xEF, + 0x7B, 0xE8, 0x69, 0xD8, 0x57, 0xDC, 0x13, 0xC3, 0x50, 0xC4, 0xA6, 0xB3, + 0x80, 0xCA, 0xF6, 0xD0, 0xAC, 0xFC, 0xF3, 0x01, 0x85, 0x21, 0xE9, 0x16, + 0x50, 0x2E, 0xB1, 0x1F, 0xB3, 0x3A, 0xCB, 0x26, 0xF2, 0x30, 0x87, 0x13, + 0x8C, 0x09, 0xDC, 0xF0, 0x39, 0xEA, 0xBA, 0xD3, 0x5B, 0xD3, 0xD1, 0xB3, + 0xB7, 0xBC, 0x01, 0xA8, 0xC4, 0xBD, 0x7A, 0xC6, 0x8E, 0xD8, 0xD9, 0xEA, + 0x95, 0x05, 0xC5, 0x06, 0xAE, 0x22, 0xDB, 0x09, 0xFC, 0x24, 0x28, 0x01, + 0x08, 0x0D, 0xF8, 0xF8, 0x2E, 0xE6, 0x9B, 0xE3, 0x3C, 0xC5, 0x0B, 0xC6, + 0x94, 0xB7, 0x54, 0xBE, 0xD4, 0xD7, 0x46, 0xDF, 0x9B, 0xFD, 0x14, 0xF8, + 0x4F, 0x0B, 0xF1, 0x00, 0xC7, 0x19, 0xCE, 0x0E, 0xDC, 0x12, 0x3C, 0xFF, + 0x94, 0xDE, 0x40, 0xD5, 0xB4, 0xC0, 0xE7, 0xD2, 0xEC, 0xBF, 0x34, 0xD3, + 0x18, 0xB2, 0xA9, 0xB5, 0x04, 0xC2, 0xFE, 0xCE, 0xA9, 0xEB, 0x85, 0x07, + 0x64, 0xF3, 0x4D, 0x01, 0xB9, 0xF4, 0x34, 0xEC, 0x69, 0x15, 0x0D, 0x03, + 0xB7, 0x12, 0x55, 0x04, 0x09, 0xED, 0xB2, 0xF5, 0x3E, 0xE1, 0xAC, 0xFC, + 0x52, 0xDD, 0xAB, 0xE9, 0x52, 0xD7, 0xA4, 0xCC, 0x73, 0xCC, 0x33, 0xC3, + 0xE2, 0xAE, 0xA5, 0xBA, 0x76, 0xA7, 0xDD, 0xC2, 0x61, 0xCE, 0xA3, 0xD9, + 0x3B, 0xF8, 0x67, 0xE0, 0xEA, 0x14, 0x50, 0xF3, 0xF8, 0x2C, 0xFD, 0x18, + 0x99, 0x28, 0xB6, 0x20, 0x4A, 0x06, 0x8C, 0x0B, 0xFE, 0xE2, 0x14, 0xF7, + 0x22, 0xD6, 0xFE, 0xEF, 0x43, 0xD2, 0x4D, 0xEB, 0x19, 0xD1, 0x84, 0xE5, + 0x17, 0xE5, 0x33, 0xF0, 0xA2, 0x01, 0x93, 0x05, 0x04, 0x0F, 0x42, 0x18, + 0xDC, 0x0C, 0x39, 0x21, 0x03, 0x06, 0x05, 0x1D, 0x6F, 0xF9, 0x15, 0x0F, + 0x32, 0xF0, 0x3C, 0x08, 0x65, 0xE0, 0x71, 0xF5, 0xD4, 0xED, 0xBC, 0xF1, + 0x20, 0x1F, 0x13, 0x06, 0x4A, 0x3C, 0xBD, 0x0B, 0x09, 0x48, 0x33, 0x14, + 0xB1, 0x53, 0x03, 0x25, 0x4F, 0x3E, 0x0F, 0x1A, 0xEB, 0x18, 0x79, 0x0A, + 0xCC, 0x18, 0xA4, 0x16, 0x65, 0x10, 0x6D, 0x0C, 0xCF, 0x00, 0xEC, 0x03, + 0x10, 0x1E, 0x88, 0x2E, 0xD5, 0x2F, 0x68, 0x4D, 0x06, 0x21, 0x04, 0x48, + 0x80, 0x3C, 0xA4, 0x56, 0xAA, 0x58, 0x1A, 0x55, 0x04, 0x4A, 0x6B, 0x30, + 0x16, 0x43, 0xE1, 0x20, 0xA6, 0x3C, 0xDC, 0x21, 0xC2, 0x24, 0x88, 0x15, + 0xC0, 0x18, 0x3E, 0x05, 0x5E, 0x18, 0x4F, 0xFF, 0xC1, 0x01, 0x92, 0xF5, + 0xEC, 0xFB, 0x8E, 0xFC, 0x3C, 0x1E, 0x9B, 0x1E, 0x52, 0x31, 0xFE, 0x35, + 0xFA, 0x31, 0x92, 0x42, 0x9A, 0x48, 0x68, 0x59, 0x43, 0x47, 0xBC, 0x55, + 0xCF, 0x19, 0x19, 0x2D, 0x94, 0x09, 0x61, 0x13, 0xD3, 0x05, 0x4B, 0x03, + 0xCF, 0xE7, 0xC5, 0xEB, 0xEB, 0xEE, 0xA0, 0xEE, 0xC1, 0x16, 0x4E, 0x0A, + 0x05, 0x1D, 0x4E, 0x20, 0xF3, 0x14, 0x40, 0x2E, 0x53, 0x19, 0xA5, 0x39, + 0xFD, 0x05, 0x8F, 0x27, 0x14, 0xEE, 0x43, 0x03, 0x80, 0xEA, 0x1A, 0xF3, + 0x13, 0xD6, 0xB2, 0xE6, 0xFA, 0xDD, 0xC3, 0xEF, 0x9A, 0x0C, 0x0F, 0x0C, + 0x41, 0x26, 0x96, 0x17, 0x2A, 0x2F, 0x79, 0x1B, 0xBB, 0x2E, 0x5D, 0x19, + 0x07, 0x0B, 0x4C, 0xFE, 0x02, 0xED, 0xF4, 0xED, 0xC4, 0xEE, 0x3D, 0xF3, + 0x8A, 0xE5, 0x20, 0xE9, 0xD0, 0xEC, 0x05, 0xF5, 0x0A, 0x1D, 0x9C, 0x20, + 0x9C, 0x2B, 0x7F, 0x25, 0x99, 0x19, 0x12, 0x17, 0xF8, 0x2B, 0x2F, 0x2B, + 0x2D, 0x30, 0x32, 0x2C, 0x3C, 0x09, 0xE9, 0x0A, 0x22, 0x00, 0x02, 0xFD, + 0xD0, 0x0C, 0x63, 0xFF, 0xCE, 0xFB, 0x21, 0xF4, 0x97, 0xF3, 0x37, 0xEC, + 0x36, 0xF7, 0xE0, 0xEE, 0xE9, 0xDF, 0x0E, 0xEC, 0x15, 0xDE, 0xF9, 0xF2, + 0xF5, 0x00, 0xCE, 0x05, 0x17, 0x12, 0x17, 0x0C, 0x61, 0x21, 0xF3, 0x10, + 0x63, 0x43, 0x9E, 0x1E, 0x7F, 0x41, 0x15, 0x16, 0xEE, 0x14, 0x65, 0xFB, + 0xED, 0xF4, 0x32, 0xF0, 0x3C, 0xD9, 0x89, 0xE0, 0x3C, 0xB7, 0xF9, 0xCA, + 0x26, 0xBE, 0x91, 0xD2, 0x51, 0xE6, 0x12, 0xE3, 0x11, 0xFC, 0xC0, 0xEB, + 0xAA, 0xF6, 0xA0, 0xF5, 0x23, 0xF1, 0x2D, 0xFD, 0xAB, 0xE3, 0x8E, 0xEB, + 0x26, 0xD6, 0x34, 0xD6, 0xFC, 0xC8, 0x5B, 0xCB, 0x94, 0xBB, 0x00, 0xC7, + 0x95, 0xD2, 0x8B, 0xDD, 0x68, 0xEC, 0xC3, 0xF7, 0x1A, 0xE9, 0xA1, 0xF9, + 0xE1, 0xEB, 0xBC, 0xF5, 0x64, 0xE8, 0x54, 0xF5, 0xAF, 0xC2, 0x3F, 0xE3, + 0xA5, 0xBF, 0x5B, 0xD8, 0xC7, 0xD2, 0xBE, 0xD3, 0x76, 0xBD, 0x20, 0xBE, + 0x33, 0xCB, 0x72, 0xCD, 0xFB, 0x0A, 0x75, 0xFC, 0x54, 0x19, 0x9D, 0xFF, + 0x0D, 0x0A, 0x0B, 0xFC, 0xC5, 0x05, 0xFE, 0x09, 0x44, 0xF7, 0x2C, 0xFC, + 0x49, 0xF1, 0x11, 0xEA, 0x98, 0x02, 0xC4, 0xED, 0x80, 0x07, 0x6D, 0xE7, + 0xFC, 0xEF, 0x59, 0xDC, 0xCC, 0xD6, 0xB2, 0xE3, 0x56, 0xC3, 0x61, 0xDD, + 0xB6, 0xBE, 0xBD, 0xD0, 0x9F, 0xD0, 0x86, 0xE5, 0x02, 0xE5, 0xBA, 0x09, + 0x31, 0xFB, 0xC1, 0x1B, 0xD4, 0x25, 0xE5, 0x22, 0x3F, 0x3E, 0x43, 0x23, + 0xE4, 0x2B, 0x07, 0x15, 0xF9, 0x0F, 0xCF, 0xFA, 0xD7, 0xFB, 0x62, 0xE8, + 0x8F, 0xDF, 0x76, 0xD3, 0x9B, 0xD7, 0x73, 0xC6, 0x0D, 0xE9, 0x93, 0xDE, + 0x2B, 0xF3, 0x08, 0x03, 0xAB, 0x00, 0x39, 0x15, 0xB9, 0x0A, 0x9E, 0x11, + 0x8C, 0x00, 0xF2, 0x06, 0xFA, 0xE4, 0x97, 0xEC, 0x92, 0xE1, 0xB9, 0xD9, + 0x96, 0xEB, 0x8C, 0xCC, 0x9D, 0xF4, 0xF5, 0xCC, 0x06, 0x10, 0xE0, 0xF0, + 0xF1, 0x20, 0x49, 0x10, 0x84, 0x19, 0xE9, 0x1A, 0x99, 0x0E, 0x0F, 0x17, + 0x48, 0xFF, 0x5F, 0xF8, 0xB5, 0xEE, 0x9A, 0xD7, 0x5A, 0xF7, 0xF8, 0xD9, + 0x73, 0xEE, 0x32, 0xD4, 0x9B, 0xDC, 0xA1, 0xD4, 0x62, 0x02, 0x5F, 0x09, + 0xF3, 0x1B, 0x79, 0x22, 0x44, 0x09, 0xC3, 0x0F, 0xEF, 0x15, 0x26, 0x23, + 0xEB, 0x23, 0x4D, 0x38, 0xB2, 0x0E, 0xB1, 0x1B, 0x8B, 0x0D, 0xCD, 0x02, + 0xD8, 0x1B, 0xA7, 0x08, 0xB6, 0x0C, 0x1E, 0x05, 0x60, 0xF7, 0x49, 0xF8, + 0x41, 0xEC, 0xDD, 0xF4, 0xE0, 0xD7, 0x32, 0xEF, 0x09, 0xCF, 0xD9, 0xF3, + 0xBE, 0xE3, 0xEF, 0x0E, 0x4C, 0x00, 0xB0, 0x25, 0x83, 0x20, 0xF8, 0x36, + 0xE2, 0x43, 0x69, 0x49, 0xF5, 0x46, 0x9F, 0x43, 0x0D, 0x24, 0x8C, 0x2A, + 0x1E, 0x02, 0x39, 0x12, 0x45, 0xEC, 0xDD, 0xF6, 0x5D, 0xCF, 0x2E, 0xE1, + 0xC6, 0xCA, 0x46, 0xE7, 0x93, 0xE9, 0xBA, 0xF5, 0x1B, 0x0A, 0x03, 0x03, + 0x0B, 0x1D, 0xAB, 0x0F, 0x10, 0x28, 0xD8, 0x0C, 0x99, 0x1F, 0x98, 0xFA, + 0xDC, 0xFB, 0xA8, 0xE7, 0x29, 0xE5, 0xC4, 0xE5, 0xDD, 0xE3, 0x82, 0xE0, + 0x43, 0xF7, 0xF9, 0xE7, 0x6E, 0x0F, 0x2A, 0x03, 0xEE, 0x1B, 0x44, 0x12, + 0xC6, 0x29, 0xDC, 0x1A, 0x1E, 0x25, 0x0B, 0x1D, 0x24, 0x04, 0x21, 0x09, + 0x46, 0xF4, 0x27, 0x04, 0x41, 0xF4, 0xF0, 0x14, 0x78, 0xE6, 0x3D, 0x07, + 0x35, 0xF5, 0x86, 0x04, 0xD3, 0x1B, 0xEA, 0x24, 0x64, 0x16, 0xD3, 0x1E, + 0x4B, 0x11, 0xA1, 0x12, 0xB2, 0x32, 0x9E, 0x24, 0x80, 0x39, 0x33, 0x18, + 0xC6, 0x22, 0xBD, 0x06, 0x88, 0x18, 0xCD, 0x14, 0xA5, 0x13, 0x9E, 0x10, + 0xD0, 0x08, 0x13, 0xF2, 0x4F, 0x00, 0x11, 0xE7, 0x65, 0xEA, 0x0A, 0xDF, + 0x13, 0xD6, 0x26, 0xD4, 0xBA, 0xEA, 0x24, 0xEC, 0xB3, 0x0E, 0xAD, 0x13, + 0x3C, 0x30, 0xB6, 0x2A, 0xFD, 0x56, 0x22, 0x3A, 0x37, 0x64, 0x37, 0x44, + 0x30, 0x4E, 0xDD, 0x38, 0x27, 0x2F, 0x74, 0x24, 0xDA, 0x0B, 0x86, 0x1E, + 0x55, 0xEB, 0x7A, 0x15, 0xF6, 0xDE, 0x64, 0x06, 0x38, 0xE3, 0x8D, 0x08, + 0xC0, 0xF1, 0xA9, 0x14, 0x9D, 0x0C, 0xF0, 0x22, 0x7B, 0x1A, 0x26, 0x2A, + 0xB0, 0x1C, 0xE8, 0x2B, 0xD0, 0x16, 0x8F, 0x20, 0xF5, 0x03, 0x0D, 0x09, + 0x1A, 0xF7, 0x38, 0xF6, 0xF5, 0xF3, 0xDA, 0xEB, 0xE9, 0x04, 0xC4, 0xFF, + 0x4C, 0x1E, 0x2D, 0x1F, 0x17, 0x2A, 0xCF, 0x30, 0xBF, 0x21, 0x4C, 0x37, + 0xA4, 0x06, 0x12, 0x28, 0x2C, 0xEA, 0x50, 0x04, 0x96, 0xEA, 0xB0, 0xF1, + 0xC5, 0xF0, 0x10, 0xEB, 0xDB, 0xE9, 0x97, 0xD7, 0x3E, 0x06, 0x9E, 0xE9, + 0x86, 0x2C, 0xA5, 0x1B, 0x83, 0x15, 0xD8, 0x1D, 0x98, 0xFF, 0xD4, 0x12, + 0xED, 0x1C, 0xCF, 0x22, 0x2D, 0x1D, 0xC9, 0x07, 0x9C, 0x03, 0x21, 0xDA, + 0x8B, 0x00, 0xD4, 0xDC, 0x0F, 0xF3, 0x4B, 0xE1, 0x44, 0xD8, 0x89, 0xC7, + 0xF9, 0xD6, 0x45, 0xC6, 0xAF, 0xD0, 0x33, 0xCC, 0x2F, 0xBC, 0xD5, 0xC1, + 0x33, 0xC8, 0x9A, 0xD6, 0x42, 0xE5, 0x73, 0xF6, 0x0D, 0xFC, 0xF0, 0x02, + 0xF5, 0x16, 0x5C, 0x0E, 0xC2, 0x27, 0x97, 0x14, 0x13, 0x19, 0xA5, 0x02, + 0x07, 0xF9, 0x8F, 0xE7, 0xEF, 0xD4, 0x44, 0xD3, 0x1B, 0xB3, 0x35, 0xB9, + 0x30, 0xA9, 0x4B, 0xA2, 0xE7, 0xBD, 0x45, 0xAA, 0xDC, 0xD9, 0x3C, 0xC2, + 0x31, 0xEF, 0xF8, 0xD6, 0xAC, 0xFC, 0xDA, 0xEC, 0xC3, 0x00, 0xFD, 0xF7, + 0xA1, 0xEB, 0x78, 0xDB, 0x4D, 0xCE, 0x2F, 0xC3, 0xEA, 0xBC, 0x40, 0xC5, + 0x80, 0xB2, 0xC6, 0xC9, 0xFE, 0xBE, 0x41, 0xE5, 0x49, 0xE5, 0x68, 0x02, + 0xC8, 0x0B, 0x01, 0x09, 0xBD, 0x15, 0x98, 0x03, 0x08, 0x07, 0x27, 0xF0, + 0x69, 0xE3, 0xAF, 0xD4, 0x70, 0xCF, 0x0E, 0xD8, 0xF6, 0xCB, 0x55, 0xDF, + 0x60, 0xC3, 0xAC, 0xD1, 0x0E, 0xE3, 0xB2, 0xE5, 0x51, 0x0E, 0xA3, 0x03, + 0xB5, 0xFE, 0x6D, 0xF5, 0x9D, 0xEF, 0x5F, 0xF6, 0x19, 0x02, 0xC7, 0x14, + 0x9C, 0xEE, 0x85, 0x0A, 0xFC, 0xD2, 0x7E, 0xF8, 0x2F, 0xE2, 0x99, 0x08, + 0xC2, 0xED, 0x98, 0x0B, 0x66, 0xE3, 0x30, 0xF7, 0xF5, 0xE1, 0x09, 0xF6, + 0xBC, 0xDD, 0x2B, 0xED, 0x4D, 0xDA, 0xF5, 0xDA, 0xF6, 0xED, 0x2F, 0xF2, + 0x20, 0x05, 0xAA, 0x10, 0xE5, 0x17, 0x0B, 0x24, 0xD8, 0x2F, 0x28, 0x47, + 0x5A, 0x40, 0x67, 0x56, 0x72, 0x36, 0x7B, 0x30, 0x2F, 0x1C, 0xA8, 0x00, + 0x02, 0x07, 0x8A, 0xEA, 0x31, 0xF0, 0x9F, 0xD5, 0x83, 0xE5, 0xF2, 0xD0, + 0xFB, 0x05, 0x78, 0xF3, 0x95, 0x36, 0x6C, 0x10, 0x4E, 0x4E, 0x2A, 0x20, + 0x8C, 0x48, 0x94, 0x30, 0xB1, 0x37, 0x01, 0x37, 0xC8, 0x1A, 0x61, 0x1F, + 0xD8, 0x0D, 0xCE, 0x0A, 0xF5, 0x10, 0x12, 0x08, 0xC8, 0x14, 0x03, 0x0E, + 0x17, 0x2B, 0xE9, 0x28, 0x01, 0x45, 0xAB, 0x3F, 0x57, 0x4C, 0xFC, 0x44, + 0x1D, 0x44, 0x95, 0x49, 0x0F, 0x30, 0x7E, 0x3E, 0x12, 0x1E, 0x3C, 0x26, + 0x09, 0x27, 0xE0, 0x22, 0x59, 0x1E, 0x3B, 0x0D, 0x5E, 0x0D, 0x0D, 0xF6, + 0x1B, 0x2A, 0xC7, 0x1D, 0xFA, 0x3D, 0x6D, 0x44, 0x3D, 0x24, 0x77, 0x36, + 0x15, 0x1C, 0xDE, 0x3E, 0x39, 0x23, 0xD8, 0x4D, 0xFB, 0x0A, 0x91, 0x26, + 0x79, 0x04, 0x58, 0x0F, 0xC4, 0x21, 0xA4, 0x18, 0x82, 0x25, 0xDC, 0x10, + 0x46, 0x09, 0x28, 0x04, 0xDA, 0xFA, 0xD2, 0x07, 0xC0, 0xEE, 0xBA, 0xFF, + 0x14, 0xE5, 0x84, 0xF2, 0xDC, 0xFC, 0x0C, 0x0A, 0x3B, 0x1C, 0xDC, 0x2B, + 0xC8, 0x29, 0x61, 0x39, 0xCA, 0x36, 0x80, 0x45, 0xB3, 0x3F, 0xED, 0x48, + 0x37, 0x2B, 0xB0, 0x2B, 0x36, 0x03, 0x03, 0xFE, 0x52, 0xE9, 0x46, 0xDD, + 0xB0, 0xDC, 0x8B, 0xC7, 0x6E, 0xDA, 0x0A, 0xC7, 0x48, 0xF3, 0x4F, 0xE2, + 0x31, 0x15, 0xDA, 0xFB, 0xE8, 0x28, 0x8E, 0x14, 0xE8, 0x29, 0xE7, 0x28, + 0x91, 0x17, 0x63, 0x2F, 0x2A, 0xF3, 0x87, 0x1F, 0xE5, 0xE5, 0x67, 0x09, + 0xAB, 0xEB, 0x0A, 0xF7, 0x7F, 0xF6, 0x22, 0xEE, 0x33, 0x13, 0x76, 0xFF, + 0xF0, 0x25, 0x21, 0x11, 0x2D, 0x2D, 0xB6, 0x18, 0xD3, 0x2D, 0xCF, 0x20, + 0xA9, 0x19, 0x00, 0x13, 0x55, 0x0B, 0x71, 0xFC, 0x04, 0x0F, 0xF1, 0xFC, + 0x49, 0xF5, 0x27, 0xF1, 0x6C, 0xD6, 0xA9, 0xE7, 0xFA, 0xEE, 0x3B, 0x12, + 0x34, 0x10, 0x60, 0x34, 0x53, 0x0A, 0x86, 0x1A, 0x56, 0x15, 0x35, 0x12, + 0xF2, 0x27, 0x0D, 0x19, 0xF4, 0x0B, 0xEF, 0xF3, 0x45, 0xF7, 0x94, 0xD9, + 0x9F, 0x07, 0xB8, 0xE0, 0x62, 0x02, 0x49, 0xE0, 0xFC, 0xE3, 0x80, 0xCD, + 0xF0, 0xE2, 0x4A, 0xBD, 0x91, 0xE5, 0x1B, 0xB5, 0xEC, 0xD6, 0x7B, 0xB9, + 0x99, 0xDC, 0x5A, 0xD7, 0x2C, 0xF2, 0x24, 0x01, 0x6B, 0x04, 0x62, 0x28, + 0xBB, 0x0E, 0xD1, 0x3C, 0x00, 0x07, 0x33, 0x30, 0xA1, 0xEC, 0xCB, 0x0C, + 0x14, 0xD9, 0x76, 0xE2, 0x38, 0xD2, 0xF3, 0xBE, 0x7F, 0xC0, 0xDF, 0xA5, + 0x79, 0xB8, 0x6F, 0xAC, 0xE7, 0xC1, 0xF3, 0xD2, 0xF2, 0xD2, 0x5E, 0xF9, + 0x93, 0xE9, 0x27, 0x0E, 0xCD, 0xF4, 0x12, 0x0D, 0x12, 0xF4, 0x47, 0xFE, + 0xE7, 0xDF, 0xA6, 0xE2, 0xA9, 0xC9, 0x4B, 0xD3, 0xD0, 0xB7, 0x8D, 0xCB, + 0x36, 0xC0, 0x09, 0xD0, 0x39, 0xE5, 0xF0, 0xE8, 0x01, 0x03, 0x82, 0xFB, + 0xB0, 0x15, 0x2E, 0x05, 0x91, 0x12, 0x02, 0x02, 0xE7, 0xF2, 0xD0, 0xE5, + 0x5F, 0xD8, 0xDB, 0xD0, 0x7F, 0xDE, 0x26, 0xDB, 0x7F, 0xD9, 0xB4, 0xD1, + 0x94, 0xD0, 0x16, 0xCB, 0x61, 0xF2, 0xD2, 0xF9, 0xE2, 0x03, 0x45, 0x1A, + 0x90, 0xEB, 0x74, 0x08, 0xB5, 0xF3, 0x94, 0x0B, 0xD5, 0x08, 0xB0, 0x17, + 0xD4, 0xFB, 0x43, 0xF7, 0x76, 0xFA, 0x38, 0xE2, 0x98, 0x0E, 0xC0, 0xEC, + 0xA6, 0x0E, 0x62, 0xE6, 0x93, 0xFD, 0xFD, 0xDA, 0x97, 0xEF, 0x03, 0xE3, + 0xF5, 0xD0, 0xE4, 0xE3, 0x2D, 0xBC, 0x66, 0xE9, 0x28, 0xD4, 0x61, 0x00, + 0x2E, 0xFA, 0xEA, 0x0B, 0xE9, 0x1F, 0x1F, 0x10, 0x4B, 0x42, 0xCA, 0x13, + 0xF5, 0x42, 0xB3, 0x0C, 0x4A, 0x1D, 0x52, 0xFD, 0x0D, 0xF9, 0x0E, 0xED, + 0x69, 0xE3, 0x3A, 0xE7, 0xE7, 0xCF, 0x93, 0xE2, 0x95, 0xD3, 0x57, 0xE0, + 0x57, 0xE9, 0xDC, 0xF3, 0x4F, 0xFE, 0xA1, 0x0E, 0x44, 0x15, 0x34, 0x21, + 0xBA, 0x19, 0xE9, 0x22, 0x54, 0x13, 0xA8, 0x18, 0x62, 0x00, 0xF8, 0x01, + 0x5B, 0xE8, 0xF4, 0xE7, 0xA4, 0xD6, 0x51, 0xD1, 0x14, 0xDC, 0x49, 0xDE, + 0xBF, 0xF7, 0xC1, 0x07, 0x18, 0x08, 0xB1, 0x17, 0x5E, 0x18, 0x17, 0x1E, + 0xAC, 0x22, 0x26, 0x1C, 0xB3, 0x06, 0xB2, 0xF9, 0xBD, 0xE0, 0x9F, 0xE0, + 0x5A, 0xDF, 0xE9, 0xED, 0xD9, 0xD6, 0x13, 0xE2, 0x4C, 0xCF, 0x6F, 0xD5, + 0xBE, 0xFB, 0x84, 0x04, 0x87, 0x0E, 0x20, 0x1F, 0xFA, 0xF6, 0xA4, 0x06, + 0xD8, 0x04, 0x17, 0x03, 0x71, 0x18, 0xBE, 0x06, 0x2B, 0x0A, 0x75, 0xED, + 0x8B, 0x03, 0x6C, 0xEB, 0xBD, 0x06, 0x4C, 0x05, 0x05, 0x01, 0x5C, 0x09, + 0xE4, 0xFB, 0xC1, 0xFE, 0x1D, 0xF4, 0x5C, 0xF4, 0x46, 0xE1, 0x2B, 0xE5, + 0xEB, 0xDE, 0x31, 0xE6, 0x2A, 0xF5, 0xF3, 0xF8, 0x70, 0x0A, 0x25, 0x0A, + 0xA2, 0x1F, 0xF6, 0x1E, 0xF4, 0x38, 0xB8, 0x32, 0xA0, 0x40, 0x22, 0x2A, + 0x93, 0x2E, 0xC6, 0x0B, 0x66, 0x10, 0xE8, 0xED, 0x8A, 0xF0, 0x9B, 0xD4, + 0xC4, 0xDC, 0xF6, 0xCB, 0xD5, 0xE2, 0x27, 0xDB, 0x5A, 0xF0, 0x6B, 0xF4, + 0xEF, 0x01, 0x35, 0x1B, 0xAA, 0x11, 0x2E, 0x3C, 0x29, 0x0C, 0x66, 0x3A, + 0x0D, 0x08, 0x94, 0x2E, 0x32, 0x07, 0x27, 0x1A, 0x2F, 0x00, 0x87, 0xF8, + 0xE0, 0xF3, 0x8A, 0xDE, 0xC7, 0xF9, 0x2C, 0xEC, 0x78, 0x05, 0xDC, 0x0D, + 0x54, 0x10, 0xC9, 0x28, 0x7B, 0x37, 0xFA, 0x39, 0xC7, 0x4F, 0x61, 0x2B, + 0xA9, 0x34, 0x69, 0x03, 0x3A, 0x16, 0x32, 0xEA, 0x4F, 0x14, 0x1A, 0xF1, + 0xCA, 0x01, 0xD6, 0xE6, 0x70, 0xF6, 0x2D, 0xE7, 0x40, 0x21, 0xE9, 0x21, + 0xDD, 0x3E, 0xC0, 0x42, 0x63, 0x32, 0x4A, 0x2F, 0x60, 0x3B, 0xEC, 0x33, + 0x2F, 0x49, 0x21, 0x3C, 0x62, 0x32, 0x98, 0x20, 0xAD, 0x2A, 0x5D, 0x1A, + 0x05, 0x3E, 0xA1, 0x30, 0x88, 0x33, 0x46, 0x31, 0xAD, 0x0E, 0x14, 0x22, + 0x92, 0xF6, 0xF6, 0x18, 0xFC, 0xE3, 0xD5, 0x07, 0x94, 0xE4, 0x9C, 0x01, + 0x10, 0x01, 0xE1, 0x1C, 0x26, 0x1C, 0x48, 0x43, 0xD9, 0x2D, 0x94, 0x5A, + 0x3F, 0x42, 0x0B, 0x64, 0xDC, 0x4E, 0x92, 0x55, 0xF6, 0x3F, 0x8D, 0x31, + 0xF6, 0x19, 0x63, 0x17, 0x5D, 0xEA, 0x29, 0x05, 0x14, 0xC6, 0x26, 0xFA, + 0x57, 0xC4, 0x23, 0xFD, 0x98, 0xE4, 0xB8, 0x0A, 0xD2, 0x09, 0x63, 0x1D, + 0xAD, 0x22, 0xE9, 0x22, 0x3F, 0x27, 0xE5, 0x11, 0x19, 0x1C, 0xE9, 0x05, + 0xA4, 0x01, 0x9A, 0xF4, 0x94, 0xE7, 0x76, 0xDE, 0x20, 0xD4, 0x15, 0xCE, + 0x1A, 0xDB, 0x8B, 0xCA, 0x5C, 0xFD, 0x7E, 0xE0, 0x48, 0x0A, 0x31, 0xF3, + 0xF1, 0x0D, 0x68, 0xF6, 0x43, 0x12, 0x43, 0xFA, 0xF8, 0xF5, 0x68, 0xEE, + 0xFB, 0xCE, 0xA6, 0xCF, 0xA1, 0xC7, 0x56, 0xCD, 0x86, 0xB8, 0x93, 0xC7, + 0xD1, 0xA7, 0x12, 0xB0, 0xDD, 0xD5, 0x02, 0xC9, 0x0B, 0x0B, 0xD4, 0xE7, + 0x94, 0x06, 0x21, 0xD7, 0xB4, 0xFE, 0x88, 0xD7, 0x44, 0x04, 0x21, 0xEE, + 0xD7, 0xEB, 0x52, 0xE0, 0x08, 0xD8, 0x2A, 0xD6, 0x7E, 0xE5, 0x09, 0xF0, + 0x59, 0xE1, 0xF9, 0xF3, 0x3D, 0xC4, 0x11, 0xDB, 0xF5, 0xB9, 0x6A, 0xCE, + 0xF9, 0xB6, 0xBE, 0xBA, 0xC5, 0xB4, 0xCE, 0xA3, 0x33, 0xCD, 0x98, 0xB2, + 0x73, 0xF1, 0x00, 0xDA, 0x44, 0x08, 0xFD, 0xFC, 0x61, 0x15, 0x1D, 0x1E, + 0x04, 0x0F, 0x44, 0x28, 0x24, 0xEF, 0x85, 0x09, 0x39, 0xD0, 0x90, 0xE1, + 0x31, 0xB9, 0x71, 0xC0, 0xD4, 0xA7, 0xA5, 0xA8, 0xAD, 0xAC, 0xF6, 0xB0, + 0x69, 0xBF, 0x49, 0xD0, 0x97, 0xD3, 0x07, 0xE9, 0x0B, 0xF3, 0x29, 0xFB, + 0x1F, 0x0C, 0x2D, 0xFD, 0x82, 0x08, 0x81, 0xE6, 0x21, 0xEA, 0x0C, 0xC7, + 0x45, 0xD2, 0xA6, 0xB8, 0xBB, 0xC1, 0xE7, 0xAC, 0xF9, 0xC3, 0xF2, 0xBC, + 0xD7, 0xE6, 0x02, 0xF5, 0x40, 0xFD, 0x93, 0x16, 0x3D, 0x0C, 0x22, 0x2D, + 0x68, 0x20, 0xCD, 0x42, 0x40, 0x17, 0x03, 0x2E, 0xEB, 0xFF, 0x7B, 0x0B, + 0x5F, 0xFC, 0xF1, 0x08, 0x9C, 0xE3, 0xC9, 0xFF, 0x11, 0xC9, 0x17, 0xF3, + 0x06, 0xF7, 0xEC, 0x17, 0x4B, 0x32, 0xF9, 0x3E, 0x33, 0x32, 0xFF, 0x2B, + 0x5C, 0x3A, 0x42, 0x26, 0xE4, 0x4F, 0x7E, 0x3D, 0x4B, 0x2F, 0x06, 0x29, + 0x8B, 0x0E, 0x65, 0x14, 0xE2, 0x1B, 0xC4, 0x24, 0x70, 0x1B, 0xF9, 0x15, + 0x6D, 0x03, 0xEC, 0xED, 0x13, 0x09, 0xA1, 0xE9, 0x11, 0x13, 0xDE, 0xEF, + 0xEF, 0x08, 0x6F, 0xF4, 0x2A, 0x19, 0x25, 0x10, 0xD5, 0x44, 0xAB, 0x34, + 0xC5, 0x5D, 0x01, 0x4A, 0xC1, 0x64, 0xFC, 0x53, 0xC2, 0x56, 0x98, 0x50, + 0xEA, 0x2E, 0xBD, 0x3B, 0xCF, 0x11, 0x30, 0x24, 0x30, 0x04, 0x7A, 0x0E, + 0x9C, 0x02, 0xF1, 0xFD, 0xD8, 0x12, 0xFF, 0xFD, 0xEE, 0x24, 0x69, 0x0F, + 0x8D, 0x38, 0x7B, 0x22, 0xE3, 0x4D, 0xC3, 0x2C, 0x20, 0x49, 0xC0, 0x29, + 0x96, 0x2D, 0xA8, 0x1B, 0xA1, 0x0B, 0xAC, 0x07, 0x24, 0xF8, 0x4D, 0x03, + 0xC2, 0xE4, 0x8E, 0xF9, 0xAA, 0xDD, 0x66, 0xF9, 0x7F, 0x01, 0x20, 0x1B, + 0x77, 0x20, 0xF2, 0x2A, 0xA5, 0x2A, 0xEE, 0x2E, 0xD2, 0x26, 0x58, 0x2C, + 0x11, 0x0A, 0x84, 0x0B, 0x57, 0xE9, 0x46, 0xEA, 0x2F, 0xE4, 0xFC, 0xE8, + 0xEC, 0xD7, 0xEE, 0xE3, 0x78, 0xCC, 0xE2, 0xE1, 0x22, 0xF2, 0xBF, 0x08, + 0xA2, 0x0D, 0x22, 0x20, 0xC4, 0xFC, 0x28, 0x0D, 0xA0, 0xFE, 0xB5, 0x11, + 0xB9, 0x08, 0xC5, 0x23, 0xBE, 0xEB, 0xFF, 0x0D, 0x7A, 0xD8, 0xB0, 0xF9, + 0x0C, 0xEE, 0xCD, 0x06, 0x30, 0xF3, 0x9F, 0xFD, 0x61, 0xE5, 0xA3, 0xE0, + 0xBF, 0xE9, 0x69, 0xD4, 0xFD, 0xEA, 0x68, 0xC4, 0x2D, 0xED, 0x08, 0xC7, + 0x71, 0x02, 0xB3, 0xEC, 0x8A, 0x19, 0x1D, 0x10, 0x7A, 0x29, 0x43, 0x2A, + 0x63, 0x35, 0x08, 0x41, 0x33, 0x36, 0x60, 0x42, 0x8F, 0x29, 0xF9, 0x2B, + 0xEB, 0x0E, 0x04, 0x04, 0x8E, 0xED, 0xA6, 0xD6, 0x98, 0xE4, 0x0C, 0xC7, + 0x44, 0xF5, 0x4C, 0xD8, 0x7F, 0x08, 0x81, 0xF1, 0x7A, 0x1B, 0x49, 0x0E, + 0xF3, 0x27, 0x13, 0x23, 0xB5, 0x26, 0x0F, 0x2E, 0x35, 0x1B, 0x1B, 0x30, + 0xC6, 0x04, 0x49, 0x0F, 0x6C, 0xF6, 0x42, 0xED, 0xBB, 0xEC, 0xD4, 0xE5, + 0x94, 0xF6, 0xEC, 0xFB, 0xB1, 0x15, 0x95, 0x1C, 0xB8, 0x26, 0x23, 0x24, + 0x34, 0x39, 0x3C, 0x2E, 0x4C, 0x43, 0x53, 0x38, 0xED, 0x1C, 0xD3, 0x11, + 0x70, 0xF2, 0xBB, 0xE6, 0x35, 0xEF, 0x2F, 0xE2, 0xE3, 0xE6, 0x21, 0xCA, + 0x85, 0xE9, 0x01, 0xC6, 0x05, 0x13, 0xD2, 0x0D, 0xC2, 0x17, 0x2A, 0x36, + 0x96, 0xF8, 0x95, 0x22, 0x17, 0x02, 0x76, 0x27, 0x3E, 0x11, 0x9B, 0x2C, + 0xD3, 0xEA, 0x40, 0x06, 0x05, 0xD5, 0x50, 0xF3, 0xC3, 0xDC, 0x4E, 0xFA, + 0xAC, 0xC6, 0xD9, 0xE5, 0x57, 0xC5, 0x3A, 0xDC, 0xE3, 0xD7, 0xFB, 0xDC, + 0x8B, 0xD8, 0x62, 0xCA, 0x78, 0xEC, 0x02, 0xCC, 0x7B, 0x03, 0xB7, 0xE5, + 0xD7, 0xFD, 0x31, 0x00, 0x36, 0xF8, 0xAA, 0x1B, 0x7F, 0xFD, 0x34, 0x29, + 0xE4, 0xF9, 0xA1, 0x11, 0x56, 0xF6, 0x13, 0xF0, 0xD7, 0xF1, 0xB2, 0xD5, + 0xBC, 0xDB, 0x30, 0xB3, 0x5E, 0xD6, 0x73, 0xAB, 0x14, 0xEB, 0xB3, 0xC7, + 0x9D, 0xF9, 0x16, 0xE0, 0x80, 0x03, 0xAC, 0xFA, 0x45, 0x0A, 0xFC, 0x12, + 0x21, 0x02, 0x51, 0x11, 0x82, 0xEE, 0xBC, 0xF8, 0x03, 0xD7, 0x7C, 0xD8, + 0x56, 0xC4, 0xBA, 0xCF, 0x93, 0xB4, 0x3D, 0xCD, 0x7E, 0xC7, 0xC4, 0xD4, + 0x9B, 0xF1, 0x26, 0xEC, 0xD8, 0x0E, 0x39, 0xF5, 0x01, 0x2C, 0xD1, 0xFD, + 0xC1, 0x30, 0x5F, 0x06, 0xEB, 0x02, 0xA1, 0xF1, 0x99, 0xDC, 0x91, 0xE6, + 0xBB, 0xDB, 0x3A, 0xFD, 0xA8, 0xCF, 0x33, 0xF1, 0x02, 0xCE, 0x87, 0xDB, + 0xEA, 0xFD, 0xDC, 0xFC, 0x90, 0x19, 0xA3, 0x07, 0xCB, 0x0C, 0xB4, 0xF0, + 0x13, 0x14, 0x40, 0x0A, 0xE8, 0x0E, 0x20, 0x19, 0x72, 0xF0, 0x2D, 0x01, + 0x65, 0xEF, 0x6F, 0xFD, 0x1C, 0x07, 0x45, 0x03, 0x05, 0x09, 0xA2, 0xF2, + 0xCA, 0xFB, 0xAB, 0xDF, 0x07, 0xFC, 0x20, 0xDC, 0x50, 0xF6, 0x75, 0xD4, + 0x9F, 0xF7, 0x79, 0xE3, 0xD3, 0x0A, 0xA6, 0x07, 0x62, 0x13, 0x95, 0x20, + 0x30, 0x1E, 0x7B, 0x3B, 0xDC, 0x2E, 0x66, 0x4B, 0xD3, 0x2B, 0xBA, 0x3D, + 0x09, 0x11, 0x66, 0x1F, 0xCF, 0xF3, 0x10, 0xFF, 0x63, 0xE3, 0x67, 0xDB, + 0xB4, 0xED, 0xB7, 0xC4, 0x89, 0x06, 0xCE, 0xD3, 0x63, 0x07, 0xDA, 0xF0, + 0x24, 0x0A, 0x9A, 0x18, 0x22, 0x18, 0xA4, 0x40, 0x98, 0x0F, 0x06, 0x45, + 0xA2, 0xFB, 0xA1, 0x2C, 0x4A, 0xEC, 0xAD, 0x0D, 0x88, 0xE2, 0x27, 0xF7, + 0xDC, 0xD5, 0x6A, 0xDA, 0xA4, 0xE6, 0x29, 0xDB, 0x18, 0x0D, 0x31, 0x07, + 0x09, 0x19, 0x48, 0x2B, 0xDF, 0x23, 0x54, 0x40, 0x90, 0x37, 0x58, 0x40, + 0x78, 0x26, 0x90, 0x21, 0xAA, 0x05, 0x60, 0x0D, 0x97, 0xFE, 0xD0, 0x10, + 0x0B, 0xEE, 0x55, 0xF6, 0xA4, 0xEB, 0xB3, 0xE6, 0x74, 0x17, 0x62, 0x0E, + 0xB9, 0x29, 0x53, 0x13, 0xE1, 0x0D, 0xAC, 0xF2, 0x1F, 0x0F, 0x4E, 0x0F, + 0x8B, 0x1B, 0xFD, 0x29, 0xB8, 0x0B, 0xF7, 0x0B, 0x11, 0x0C, 0xA8, 0x03, + 0x95, 0x11, 0xBF, 0xFE, 0xFF, 0xFF, 0x12, 0xE4, 0xF2, 0xF4, 0xDE, 0xE5, + 0x9A, 0xF4, 0xE8, 0xF2, 0xA5, 0xEE, 0xED, 0xE6, 0x82, 0xF5, 0xB6, 0xE7, + 0xF0, 0x09, 0x8A, 0x03, 0xFF, 0x11, 0x7F, 0x23, 0x3F, 0x1B, 0xE8, 0x41, + 0xF0, 0x21, 0xD6, 0x50, 0x60, 0x0B, 0x88, 0x41, 0xF4, 0xFC, 0x14, 0x21, + 0x25, 0x02, 0x15, 0xFC, 0xA7, 0xF6, 0xD6, 0xD4, 0x95, 0xE0, 0xC6, 0xB5, + 0xD5, 0xE2, 0x4E, 0xBE, 0x40, 0xFB, 0x03, 0xEB, 0xE9, 0x0E, 0x03, 0x10, + 0x7A, 0x1A, 0x00, 0x1E, 0x15, 0x16, 0xFB, 0x12, 0x85, 0x01, 0x5D, 0x00, + 0x9A, 0xEF, 0xB7, 0xEE, 0xFD, 0xF1, 0x96, 0xD6, 0xF3, 0xFD, 0xC6, 0xC4, + 0xE6, 0x07, 0xBF, 0xD8, 0x89, 0x1A, 0x9D, 0x09, 0x6D, 0x2A, 0x00, 0x2B, + 0x5F, 0x2D, 0x2E, 0x3A, 0x95, 0x31, 0x7C, 0x3D, 0x8F, 0x20, 0x77, 0x1B, + 0x6A, 0x0A, 0xB7, 0xFE, 0x98, 0x09, 0xFE, 0x06, 0x85, 0xFB, 0x7F, 0xFF, + 0x88, 0xF4, 0xE7, 0xFC, 0x54, 0x0E, 0x63, 0x1E, 0xBC, 0x1F, 0x99, 0x2B, + 0x58, 0x1E, 0x43, 0x28, 0x25, 0x2B, 0xD3, 0x3F, 0x34, 0x2E, 0x32, 0x47, + 0x04, 0x10, 0x58, 0x2C, 0xBC, 0x01, 0x67, 0x26, 0x17, 0x0E, 0x4B, 0x2D, + 0xD3, 0x0B, 0xA1, 0x14, 0x2F, 0xFF, 0x5D, 0xF1, 0xE5, 0xF0, 0x8F, 0xDF, + 0xB3, 0xE0, 0x6D, 0xD8, 0xE9, 0xE8, 0xAD, 0xE4, 0x06, 0x03, 0x72, 0x01, + 0xDE, 0x0D, 0x1C, 0x1D, 0xE2, 0x1B, 0x7A, 0x3E, 0x1B, 0x2E, 0xA0, 0x4C, + 0x58, 0x27, 0xFB, 0x2E, 0xD7, 0x16, 0xDB, 0xF9, 0x6E, 0x0D, 0x34, 0xCA, + 0xD5, 0xF9, 0xFA, 0xB1, 0x15, 0xD9, 0x4E, 0xB9, 0xCD, 0xC9, 0x71, 0xD4, + 0xA0, 0xD4, 0xE5, 0xEF, 0x49, 0xF2, 0x90, 0x13, 0x88, 0x06, 0xD6, 0x21, + 0xA8, 0x0A, 0x67, 0x0B, 0x71, 0x02, 0xB6, 0xE7, 0x90, 0xE8, 0x93, 0xC2, + 0x4B, 0xDA, 0xF2, 0xB2, 0x40, 0xD9, 0x2B, 0xB2, 0xCA, 0xE3, 0x45, 0xCC, + 0x03, 0xF7, 0x81, 0xF1, 0x67, 0x0A, 0x2F, 0x02, 0x68, 0x16, 0x29, 0x12, + 0x0F, 0x06, 0x32, 0x11, 0xE7, 0xE0, 0x12, 0xF0, 0xC9, 0xD9, 0xC2, 0xE2, + 0xFC, 0xDF, 0x97, 0xD7, 0x0F, 0xCC, 0xAC, 0xB1, 0xB9, 0xD2, 0xC4, 0xB5, + 0xFF, 0xF9, 0xA2, 0xE5, 0xD4, 0xF6, 0xEC, 0xF8, 0x99, 0xDB, 0xED, 0xFF, + 0xE7, 0xEC, 0x17, 0x1A, 0x89, 0xEF, 0x0F, 0x0E, 0x46, 0xD4, 0x79, 0xE6, + 0xF1, 0xDE, 0xC5, 0xE0, 0x73, 0xEE, 0x7F, 0xE4, 0x12, 0xD9, 0x0A, 0xCF, + 0x09, 0xC8, 0x79, 0xC0, 0x84, 0xC4, 0x5D, 0xC8, 0x83, 0xA8, 0x08, 0xBE, + 0x74, 0xA1, 0x0E, 0xBE, 0x98, 0xD2, 0x07, 0xE2, 0x8F, 0xFF, 0x4D, 0xFC, + 0xFF, 0x0D, 0x84, 0x0A, 0x8F, 0x0F, 0x13, 0x16, 0x5B, 0xFC, 0xFC, 0x0C, + 0x3F, 0xDD, 0xEF, 0xED, 0x75, 0xCE, 0x19, 0xD1, 0x36, 0xC7, 0x20, 0xC3, + 0xF2, 0xBB, 0x23, 0xC3, 0x9C, 0xCA, 0x2B, 0xDD, 0xCD, 0xE0, 0xA4, 0x01, + 0x28, 0xE0, 0x9E, 0x19, 0xCB, 0xE3, 0xCD, 0x23, 0x0A, 0xF4, 0x79, 0x1D, + 0x17, 0xF6, 0x8D, 0xFB, 0x9B, 0xEE, 0x36, 0xD1, 0xA1, 0xE3, 0xB2, 0xBC, + 0x7B, 0xCC, 0x5C, 0xBE, 0x5B, 0xD9, 0x31, 0xEA, 0x94, 0x05, 0xE6, 0x18, + 0xC0, 0x26, 0xEA, 0x2A, 0x8F, 0x34, 0x2E, 0x3B, 0xB5, 0x26, 0x80, 0x33, + 0x8B, 0x13, 0xBE, 0x0B, 0x7C, 0x1F, 0x44, 0xF6, 0x77, 0x2B, 0xF5, 0xF6, + 0x38, 0x13, 0x3D, 0xE9, 0x4F, 0x18, 0x82, 0xF5, 0xDB, 0x40, 0x4C, 0x29, + 0xBE, 0x3D, 0x2D, 0x38, 0xA1, 0x2F, 0x10, 0x2F, 0x8D, 0x50, 0x7C, 0x4A, + 0x0E, 0x50, 0x20, 0x4E, 0xB7, 0x21, 0x6F, 0x2B, 0xA4, 0x22, 0xCE, 0x2B, + 0xB7, 0x36, 0x54, 0x3B, 0x8F, 0x20, 0xBB, 0x26, 0x56, 0x0A, 0x67, 0x08, + 0x1A, 0x0C, 0x40, 0xF9, 0x4F, 0x07, 0xD1, 0xF4, 0x85, 0x0F, 0x3B, 0x0B, + 0xC6, 0x2C, 0x99, 0x34, 0x42, 0x3F, 0x51, 0x50, 0x2C, 0x52, 0x0E, 0x5E, + 0x23, 0x62, 0x3B, 0x5F, 0x5B, 0x4F, 0x37, 0x4D, 0xA5, 0x26, 0x62, 0x26, + 0xB3, 0x03, 0xD3, 0x01, 0xE6, 0xEF, 0x16, 0xF3, 0x89, 0xF1, 0x7E, 0xF0, + 0x49, 0x03, 0xCA, 0xFA, 0x37, 0x0F, 0xA6, 0x12, 0x19, 0x1C, 0x83, 0x2F, + 0xD5, 0x23, 0x9A, 0x2B, 0xF7, 0x21, 0x49, 0x13, 0x94, 0x1A, 0x2C, 0x05, + 0x5C, 0x0A, 0xB8, 0xF1, 0x79, 0xF1, 0x27, 0xDC, 0x39, 0xDE, 0x9D, 0xE2, + 0x4B, 0xE8, 0x98, 0x06, 0xBD, 0xF6, 0x5C, 0x1B, 0x47, 0x08, 0x82, 0x28, + 0xC7, 0x20, 0xC4, 0x35, 0x36, 0x17, 0x07, 0x1C, 0x28, 0x03, 0xDA, 0xF2, + 0x53, 0x08, 0x31, 0xE2, 0x1B, 0xFC, 0xE5, 0xD9, 0xB5, 0xE1, 0x38, 0xD4, + 0x56, 0xF5, 0x04, 0xF3, 0xEA, 0x13, 0xDB, 0x22, 0x59, 0x0E, 0x32, 0x27, + 0x6F, 0x14, 0x90, 0x19, 0x01, 0x2D, 0xE3, 0x20, 0x28, 0x23, 0x02, 0x19, + 0xB9, 0x0F, 0xE1, 0x06, 0x24, 0x17, 0xB8, 0x06, 0x8B, 0x0D, 0x25, 0xFF, + 0x17, 0xF2, 0x62, 0xF2, 0xAE, 0xEF, 0x99, 0xF4, 0x41, 0xED, 0x52, 0xE8, + 0x36, 0xE9, 0x47, 0xDF, 0x58, 0xFF, 0xBF, 0xF7, 0xF7, 0x0F, 0xB6, 0x10, + 0x69, 0x21, 0xA8, 0x2F, 0xC5, 0x43, 0x36, 0x50, 0xA9, 0x41, 0xD3, 0x3F, + 0x8F, 0x1D, 0xC3, 0x17, 0x71, 0x03, 0x46, 0xFC, 0x7E, 0xEA, 0xBA, 0xE1, + 0x6F, 0xD1, 0x7B, 0xC9, 0xFB, 0xDE, 0x39, 0xC9, 0xAB, 0xF7, 0x4A, 0xD3, + 0x62, 0x00, 0xAA, 0xE1, 0xBF, 0x18, 0xD5, 0xFB, 0x71, 0x1E, 0x15, 0xFB, + 0xAB, 0xFD, 0x3D, 0xF1, 0x7F, 0xDD, 0xC0, 0xEE, 0x53, 0xD2, 0xC0, 0xE1, + 0xD9, 0xC1, 0x60, 0xCD, 0xD9, 0xBF, 0xBF, 0xD1, 0x8A, 0xDC, 0xF7, 0xF0, + 0x0F, 0xEB, 0x78, 0x0A, 0x43, 0xF1, 0xE6, 0x1D, 0xEA, 0xFC, 0x71, 0x20, + 0x4B, 0xF5, 0x7E, 0x01, 0x4E, 0xE3, 0x5A, 0xE5, 0x99, 0xDB, 0xE8, 0xE9, + 0x91, 0xBE, 0xC9, 0xD9, 0x48, 0xB0, 0x23, 0xC0, 0x41, 0xE1, 0xEF, 0xDF, + 0x65, 0xFC, 0xF0, 0xFF, 0xFA, 0xEB, 0x5A, 0xF8, 0xD3, 0xFB, 0xC6, 0x03, + 0x53, 0x09, 0x8F, 0x11, 0x4D, 0xEB, 0xD7, 0xF6, 0x2C, 0xE7, 0x4D, 0xE3, + 0xA8, 0xFF, 0x0B, 0xED, 0x68, 0xF2, 0x76, 0xED, 0xF9, 0xD7, 0x4A, 0xE1, + 0x45, 0xD4, 0xC0, 0xDC, 0x1B, 0xCA, 0xCF, 0xCF, 0xA7, 0xCC, 0xC7, 0xC2, + 0xC5, 0xEF, 0xE7, 0xD1, 0x51, 0x05, 0x6B, 0xED, 0x59, 0x0A, 0x45, 0x0C, + 0x94, 0x14, 0x49, 0x27, 0xCF, 0x0E, 0x68, 0x1D, 0x53, 0xF8, 0x35, 0xF6, + 0xE9, 0xE5, 0x22, 0xD4, 0x25, 0xD6, 0x0B, 0xBE, 0xEE, 0xC4, 0x2E, 0xB3, + 0xC1, 0xC7, 0x62, 0xC3, 0xE6, 0xDD, 0xBB, 0xE8, 0x48, 0xF7, 0x37, 0x0A, + 0x9C, 0x10, 0x6F, 0x17, 0x43, 0x18, 0xD4, 0x12, 0xBB, 0x04, 0xA8, 0x08, + 0x40, 0xE9, 0x63, 0xED, 0xCF, 0xE2, 0x3F, 0xD7, 0x39, 0xDE, 0xF2, 0xCF, + 0xE2, 0xE2, 0x96, 0xD6, 0x0F, 0xF9, 0xAE, 0xF6, 0x9E, 0x03, 0x49, 0x1E, + 0xF6, 0x12, 0x28, 0x35, 0xE9, 0x25, 0xF5, 0x2A, 0x67, 0x18, 0xB3, 0x07, + 0x34, 0xFD, 0x5A, 0xEF, 0x79, 0xF7, 0x1F, 0xF1, 0x90, 0xE8, 0xD1, 0xE7, + 0x65, 0xE0, 0x71, 0xE4, 0x8C, 0x07, 0xFF, 0x07, 0xF0, 0x24, 0x79, 0x1D, + 0x42, 0x17, 0x2C, 0x0F, 0xA7, 0x14, 0xD5, 0x0F, 0x2D, 0x16, 0xC9, 0x18, + 0x10, 0xF8, 0x8D, 0x08, 0xD0, 0xE8, 0x53, 0xFB, 0x1A, 0xFB, 0x85, 0xFE, + 0x05, 0x03, 0x06, 0xF9, 0x0E, 0xF1, 0xCD, 0xE3, 0x56, 0xDA, 0x83, 0xD5, + 0xE2, 0xC9, 0x23, 0xD3, 0x65, 0xD5, 0x51, 0xE0, 0xA6, 0xF9, 0x94, 0xF9, + 0x44, 0x18, 0x19, 0x11, 0x62, 0x29, 0xF0, 0x25, 0x5E, 0x28, 0xE4, 0x2E, + 0xC3, 0x12, 0x07, 0x20, 0x3C, 0xF4, 0x61, 0xFE, 0x26, 0xE1, 0xB8, 0xE3, + 0x2D, 0xDA, 0x40, 0xD8, 0x0B, 0xD7, 0x42, 0xD7, 0xB3, 0xDC, 0x34, 0xEA, + 0xC3, 0xE6, 0x82, 0xFE, 0x00, 0x06, 0x5A, 0x0E, 0xE4, 0x1F, 0x78, 0x13, + 0x51, 0x1A, 0x28, 0x12, 0xFB, 0x06, 0x1F, 0x0E, 0xEF, 0xEE, 0xEB, 0xFE, + 0x6C, 0xD5, 0x19, 0xE6, 0x6A, 0xD1, 0xD9, 0xD2, 0x5D, 0x02, 0xCB, 0xE9, + 0x0F, 0x33, 0xEB, 0x0A, 0x0C, 0x39, 0xAA, 0x16, 0x27, 0x30, 0xA0, 0x1C, + 0x15, 0x27, 0x30, 0x1E, 0x07, 0x06, 0xF9, 0x0B, 0x7C, 0xEF, 0x10, 0xFD, + 0x66, 0x01, 0x42, 0xF8, 0xF7, 0x02, 0x22, 0xE4, 0xCB, 0x02, 0x62, 0xED, + 0xA7, 0x1D, 0x10, 0x1C, 0x62, 0x20, 0x82, 0x2F, 0x83, 0x12, 0x04, 0x29, + 0x1A, 0x29, 0x7C, 0x36, 0x85, 0x2E, 0xB4, 0x35, 0x10, 0x05, 0x7C, 0x14, + 0x01, 0xF2, 0xF3, 0x08, 0x19, 0xFA, 0x9D, 0x0C, 0xBA, 0xF0, 0x34, 0xF1, + 0x36, 0xEE, 0x66, 0xD8, 0x6D, 0xF7, 0x49, 0xDB, 0xD4, 0xEC, 0x79, 0xDD, + 0x06, 0xF3, 0x9F, 0xEA, 0xA2, 0x1B, 0x63, 0x08, 0x4F, 0x37, 0xA2, 0x1A, + 0x6A, 0x45, 0xC2, 0x27, 0xBB, 0x4F, 0xC0, 0x34, 0x19, 0x37, 0x10, 0x2B, + 0x2E, 0x0E, 0x70, 0x12, 0x37, 0xF9, 0x2C, 0xFA, 0x70, 0xF1, 0x0F, 0xE6, + 0xB4, 0xF4, 0x37, 0xE3, 0x5A, 0x07, 0x09, 0xF8, 0xBE, 0x1B, 0x4F, 0x17, + 0x59, 0x28, 0xD3, 0x36, 0xF2, 0x1B, 0x13, 0x42, 0xC9, 0x07, 0xC8, 0x36, + 0x93, 0xFE, 0xE8, 0x1C, 0xA3, 0xF5, 0x35, 0x03, 0xF3, 0xE8, 0x8D, 0xF5, + 0x14, 0xE5, 0xBB, 0xF9, 0xE3, 0xFF, 0x9A, 0x1B, 0xD8, 0x22, 0x24, 0x3B, + 0x03, 0x35, 0x8A, 0x4D, 0x7A, 0x39, 0xDF, 0x5D, 0x2D, 0x26, 0x80, 0x50, + 0xA3, 0xFE, 0x24, 0x29, 0xD1, 0xFC, 0x52, 0x1A, 0x6A, 0x11, 0x37, 0x0D, + 0xFA, 0xFA, 0x0D, 0xE7, 0xFF, 0xF7, 0xFE, 0xEE, 0xF8, 0x1F, 0xD9, 0x18, + 0xA7, 0x23, 0x40, 0x18, 0x79, 0x18, 0x84, 0x0F, 0xE9, 0x2C, 0xFA, 0x1F, + 0x5C, 0x2C, 0x61, 0x14, 0x8B, 0x0B, 0xB0, 0xEF, 0x2E, 0x02, 0xFE, 0xF0, + 0x5B, 0xF8, 0xFF, 0xFC, 0x78, 0xD3, 0xC9, 0xE9, 0x02, 0xC4, 0xC3, 0xD5, + 0x05, 0xD0, 0x53, 0xC8, 0xC9, 0xD9, 0x16, 0xBA, 0x63, 0xEE, 0xEC, 0xC8, + 0xF1, 0x07, 0xB2, 0xEC, 0x1A, 0x13, 0x06, 0x04, 0x34, 0x22, 0xA2, 0x14, + 0x4E, 0x2B, 0x8A, 0x15, 0xED, 0x16, 0xA4, 0xFB, 0x60, 0xF4, 0x22, 0xDF, + 0x43, 0xD9, 0x24, 0xD0, 0x23, 0xC2, 0xCE, 0xC3, 0x19, 0xBE, 0x67, 0xC8, + 0x75, 0xD3, 0x66, 0xDD, 0x58, 0xED, 0x12, 0xF2, 0xDF, 0xF3, 0x12, 0xFD, + 0x59, 0xEE, 0x99, 0xFD, 0x2E, 0xE8, 0x7E, 0xF7, 0xE0, 0xD7, 0x61, 0xE1, + 0xC9, 0xCD, 0xFE, 0xC8, 0x47, 0xBE, 0x99, 0xBB, 0x63, 0xBA, 0x72, 0xCC, + 0x9E, 0xDA, 0xCC, 0xEA, 0xC5, 0xF5, 0xC8, 0xF6, 0xBD, 0xFC, 0x21, 0xFB, + 0x89, 0x08, 0x78, 0xFE, 0x8B, 0xF4, 0x3E, 0xE7, 0x32, 0xC7, 0xBB, 0xD0, + 0x35, 0xC2, 0x80, 0xDB, 0x51, 0xBF, 0x8C, 0xD1, 0x1D, 0xB8, 0x44, 0xC2, + 0x70, 0xE7, 0x8C, 0xDF, 0x45, 0x15, 0xCB, 0xEA, 0x29, 0x0A, 0xD8, 0xD5, + 0x79, 0xFB, 0x8A, 0xE6, 0xB4, 0xF2, 0xD1, 0xFE, 0x9B, 0xDA, 0xEB, 0xF0, + 0xBD, 0xDA, 0xAD, 0xEA, 0xD4, 0xEF, 0xAB, 0xF1, 0x67, 0xE8, 0x6B, 0xE5, + 0x00, 0xD1, 0x2F, 0xDA, 0x30, 0xC5, 0x4E, 0xDA, 0x4F, 0xBF, 0xD0, 0xD5, + 0x1E, 0xCB, 0x29, 0xDE, 0xA4, 0xF3, 0x22, 0x03, 0x6C, 0x15, 0xDC, 0x22, + 0x84, 0x27, 0x38, 0x33, 0x3E, 0x35, 0xFA, 0x3D, 0x7D, 0x2A, 0x0E, 0x2F, + 0x12, 0x07, 0xB5, 0x09, 0x85, 0xED, 0x10, 0xF2, 0x66, 0xE5, 0xB5, 0xE8, + 0xB2, 0xDC, 0x8E, 0xE1, 0xB6, 0xE5, 0x59, 0xF3, 0x46, 0x06, 0x8E, 0x0D, + 0xC5, 0x24, 0x49, 0x19, 0xE7, 0x2F, 0xFE, 0x1A, 0x20, 0x33, 0xED, 0x19, + 0x06, 0x26, 0xBE, 0x13, 0x87, 0x0C, 0xBD, 0x08, 0x3A, 0xFF, 0x86, 0xF7, + 0x5C, 0xFD, 0x95, 0xEA, 0x55, 0x19, 0xC8, 0xFE, 0x59, 0x3D, 0xA2, 0x1B, + 0x28, 0x45, 0xC8, 0x30, 0x39, 0x45, 0x48, 0x42, 0xF0, 0x44, 0x58, 0x3C, + 0xB6, 0x26, 0xEC, 0x17, 0xB4, 0x11, 0x3A, 0x02, 0xC0, 0x16, 0xC1, 0xFF, + 0xA0, 0x06, 0xBF, 0xF1, 0xF3, 0x07, 0xED, 0x00, 0x89, 0x34, 0x49, 0x30, + 0x34, 0x44, 0x7C, 0x3D, 0x62, 0x2E, 0x64, 0x37, 0xA6, 0x33, 0x18, 0x50, + 0xC3, 0x3A, 0x4F, 0x58, 0xD1, 0x21, 0xC8, 0x3B, 0xDE, 0x1F, 0x44, 0x34, + 0x59, 0x2F, 0x78, 0x35, 0xE0, 0x17, 0x05, 0x1C, 0x1C, 0xF4, 0xF7, 0x02, + 0x71, 0xEB, 0x16, 0xF9, 0x4A, 0xEE, 0x7D, 0xF3, 0x26, 0xFD, 0x91, 0xFE, + 0xB0, 0x21, 0x67, 0x1C, 0x03, 0x40, 0xA2, 0x34, 0x3F, 0x51, 0xAE, 0x4A, + 0x04, 0x54, 0x53, 0x55, 0x49, 0x36, 0xF6, 0x42, 0x34, 0x09, 0x24, 0x2A, + 0x33, 0xEE, 0x51, 0x15, 0x3B, 0xE1, 0x23, 0xF8, 0x6D, 0xE2, 0xAA, 0xEB, + 0x7F, 0xF9, 0x9B, 0xFF, 0x5A, 0x0F, 0xB7, 0x18, 0x71, 0x14, 0xB0, 0x23, + 0xBA, 0x1C, 0x6B, 0x25, 0x2C, 0x25, 0xAF, 0x19, 0xAD, 0x10, 0x3E, 0xF6, + 0xE3, 0xF7, 0x26, 0xDD, 0x1A, 0xED, 0x1B, 0xD7, 0x11, 0xF7, 0xAA, 0xDF, + 0x84, 0x11, 0x58, 0xF8, 0x9D, 0x22, 0x27, 0x13, 0x52, 0x29, 0xA3, 0x2A, + 0xFE, 0x29, 0x01, 0x31, 0x39, 0x17, 0x63, 0x13, 0x43, 0x00, 0x15, 0xF3, + 0xF8, 0x03, 0x1F, 0xF7, 0x20, 0xFD, 0x37, 0xF2, 0x85, 0xEB, 0x44, 0xE6, + 0x2F, 0x09, 0xAE, 0x05, 0x92, 0x2C, 0x6E, 0x1B, 0x41, 0x21, 0x48, 0x0B, + 0x8A, 0x21, 0x60, 0x1B, 0x52, 0x36, 0x85, 0x37, 0x47, 0x2A, 0x74, 0x28, + 0x87, 0x12, 0x03, 0x19, 0xAD, 0x0D, 0xD9, 0x1D, 0xB3, 0x01, 0xCF, 0x0C, + 0x61, 0xED, 0xF9, 0xEA, 0x9E, 0xE7, 0xBA, 0xD5, 0x9E, 0xE9, 0x2A, 0xC7, + 0x65, 0xF2, 0x89, 0xCA, 0x4E, 0xFE, 0x2C, 0xE3, 0x4C, 0x0C, 0x78, 0xFB, + 0x3B, 0x27, 0x7F, 0x18, 0x63, 0x34, 0xFE, 0x2F, 0x51, 0x1F, 0x0B, 0x25, + 0xF7, 0xFC, 0x9B, 0x09, 0x38, 0xDB, 0xAB, 0xF3, 0x25, 0xBF, 0xDC, 0xD6, + 0x37, 0xB2, 0x65, 0xC3, 0x77, 0xC1, 0x41, 0xD7, 0xB7, 0xD7, 0xBE, 0xEC, + 0xF3, 0xEA, 0xEE, 0xFB, 0x4D, 0xF6, 0x9C, 0x0A, 0x11, 0xF3, 0xDA, 0x07, + 0xE8, 0xDB, 0x68, 0xED, 0x48, 0xBF, 0x46, 0xCE, 0x87, 0xAA, 0x98, 0xBA, + 0xB7, 0xA2, 0x44, 0xB1, 0x66, 0xC2, 0xED, 0xC5, 0x0C, 0xE7, 0x5C, 0xE2, + 0x13, 0xFA, 0xDC, 0xEE, 0xD5, 0x0D, 0x30, 0xF9, 0x7B, 0x0D, 0x21, 0xF7, + 0x87, 0xEB, 0xF1, 0xDD, 0x71, 0xD7, 0x36, 0xD8, 0xE9, 0xCD, 0xFD, 0xD4, + 0xB7, 0xB8, 0x4F, 0xB6, 0x89, 0xD0, 0xDB, 0xC3, 0x73, 0x05, 0xE2, 0xF3, + 0x5B, 0x08, 0xD6, 0xF7, 0x16, 0xF8, 0xE4, 0xF7, 0x58, 0x0C, 0x87, 0x1E, + 0x75, 0x0F, 0x2D, 0x1C, 0xF4, 0xF6, 0x9D, 0xF3, 0x11, 0xF3, 0x85, 0xEF, + 0x64, 0xF3, 0x0A, 0xED, 0xA9, 0xE6, 0xCE, 0xCF, 0x69, 0xDC, 0x71, 0xC1, + 0x38, 0xD6, 0x03, 0xC8, 0x77, 0xD4, 0xA4, 0xD6, 0x52, 0xE3, 0x5A, 0xFB, + 0x19, 0x00, 0xF4, 0x24, 0x1F, 0x24, 0x03, 0x39, 0x12, 0x42, 0x71, 0x43, + 0x15, 0x36, 0xD8, 0x35, 0x6E, 0x10, 0x1A, 0x10, 0xA0, 0xF6, 0x87, 0xF3, + 0x65, 0xDE, 0xB9, 0xDA, 0xBA, 0xC4, 0x0A, 0xC2, 0xF0, 0xC6, 0x05, 0xCB, + 0x0E, 0xE2, 0x89, 0xEB, 0x19, 0xFB, 0x25, 0xFC, 0x05, 0x0F, 0x5A, 0xFF, + 0x15, 0x18, 0x20, 0x07, 0x91, 0x07, 0x91, 0x03, 0x1D, 0xEA, 0x9B, 0xE6, + 0x2C, 0xDB, 0x53, 0xD4, 0x9E, 0xD1, 0x49, 0xCC, 0x8D, 0xDC, 0xAF, 0xD5, + 0x99, 0xF6, 0x4D, 0xF6, 0xDD, 0x02, 0xB9, 0x0D, 0xAA, 0x12, 0x71, 0x18, + 0xBE, 0x1D, 0x90, 0x19, 0x53, 0x01, 0xCD, 0x01, 0x28, 0xE9, 0xF7, 0xF2, + 0x56, 0xEF, 0x18, 0xF8, 0x59, 0xE0, 0x94, 0xDE, 0x13, 0xE4, 0x1E, 0xD7, + 0x71, 0x0F, 0x86, 0x06, 0x22, 0x17, 0xD2, 0x1E, 0x8D, 0x06, 0x70, 0x18, + 0xC3, 0x11, 0x9A, 0x2B, 0xEB, 0x15, 0xD1, 0x30, 0xC4, 0x00, 0x98, 0x0E, + 0x34, 0xFC, 0x5C, 0x04, 0xA1, 0xFB, 0x6B, 0x0E, 0xB3, 0xED, 0x1F, 0x04, + 0x45, 0xE5, 0x88, 0xF9, 0x41, 0xDB, 0x8C, 0xF6, 0x18, 0xDA, 0x6B, 0xEC, + 0xA7, 0xF5, 0x14, 0xF0, 0x3D, 0x12, 0x6C, 0x07, 0xCD, 0x26, 0x04, 0x21, + 0x82, 0x3A, 0x4B, 0x3C, 0x4E, 0x37, 0xBF, 0x44, 0x8F, 0x21, 0xEE, 0x2A, + 0xD2, 0x10, 0x11, 0x09, 0x82, 0x02, 0x93, 0xE7, 0x85, 0xE8, 0xFE, 0xC7, + 0x1C, 0xDB, 0x61, 0xC7, 0xCE, 0xE5, 0x0B, 0xDD, 0x3D, 0xFB, 0xF6, 0xF5, + 0xA6, 0x15, 0xD3, 0x0A, 0x2B, 0x27, 0xE4, 0x11, 0x14, 0x22, 0x9F, 0x12, + 0x0B, 0x04, 0xB6, 0x00, 0xB0, 0xEE, 0x29, 0xE4, 0x13, 0xE8, 0x9F, 0xD4, + 0xCA, 0xF8, 0xF7, 0xE0, 0x24, 0x15, 0x24, 0xF9, 0x4E, 0x1F, 0x1B, 0x14, + 0x11, 0x2E, 0x67, 0x3A, 0x15, 0x35, 0x6F, 0x46, 0x39, 0x13, 0x4F, 0x2A, + 0xAD, 0xFE, 0xB7, 0x19, 0x6A, 0xFF, 0x85, 0x17, 0xA6, 0xE7, 0x62, 0xF3, + 0x05, 0xEB, 0xC1, 0xE1, 0xD7, 0x18, 0x69, 0x0D, 0x11, 0x2B, 0x5C, 0x23, + 0xB6, 0x1F, 0x7A, 0x1A, 0x33, 0x30, 0x24, 0x33, 0xC4, 0x40, 0xA2, 0x42, + 0x32, 0x2C, 0x10, 0x31, 0xD5, 0x23, 0xC9, 0x2C, 0x33, 0x22, 0x8C, 0x24, + 0x40, 0x17, 0x12, 0x13, 0x5D, 0x14, 0x96, 0xFF, 0x2F, 0x01, 0x37, 0xE9, + 0xE9, 0xF0, 0x4C, 0xEB, 0x39, 0x09, 0xE5, 0x07, 0x07, 0x2D, 0x81, 0x26, + 0x53, 0x48, 0xF8, 0x3D, 0x91, 0x60, 0x59, 0x56, 0xC3, 0x5D, 0xC9, 0x53, + 0x4D, 0x41, 0x8C, 0x35, 0xFD, 0x2B, 0xEE, 0x1B, 0x16, 0x19, 0x91, 0x00, + 0x71, 0xFC, 0x19, 0xE9, 0xB1, 0xEF, 0xB7, 0xF3, 0x45, 0x05, 0xE7, 0x18, + 0x15, 0x27, 0x72, 0x3D, 0x17, 0x41, 0x3E, 0x4F, 0xC4, 0x51, 0x92, 0x4F, + 0x4C, 0x54, 0x05, 0x49, 0x7D, 0x40, 0x9D, 0x37, 0xEA, 0x2D, 0x22, 0x25, + 0x3B, 0x23, 0x66, 0x19, 0x0B, 0x26, 0xEE, 0x23, 0x4D, 0x38, 0x63, 0x36, + 0xC4, 0x40, 0xF0, 0x3E, 0xA9, 0x4C, 0xAE, 0x4E, 0x9A, 0x55, 0x7F, 0x52, + 0x79, 0x39, 0x12, 0x30, 0x9C, 0x1E, 0xE9, 0x0E, 0xF9, 0x23, 0x73, 0x0B, + 0x5E, 0x25, 0x67, 0x08, 0xB7, 0x1D, 0xC2, 0x02, 0xED, 0x27, 0xA6, 0x1A, + 0x3C, 0x34, 0x14, 0x3B, 0x35, 0x2E, 0xFD, 0x3B, 0xA0, 0x38, 0xF9, 0x34, + 0xC8, 0x30, 0x4A, 0x15, 0x45, 0x00, 0x51, 0xDC, 0xC1, 0x07, 0x96, 0xE2, + 0x52, 0x14, 0xBE, 0xFF, 0x5C, 0xE2, 0x86, 0xE0, 0x40, 0xDE, 0xD7, 0xD6, + 0xDC, 0xE8, 0xCD, 0xDE, 0x07, 0xBB, 0x54, 0xB8, 0xB6, 0xB7, 0xFC, 0xB3, + 0x3A, 0xED, 0x0D, 0xE5, 0x56, 0x04, 0x8E, 0xF5, 0x81, 0x0C, 0x90, 0xF4, + 0xE2, 0x1D, 0x13, 0x09, 0xF1, 0x05, 0x71, 0xF8, 0x1F, 0xDA, 0xB2, 0xCB, + 0x26, 0xBD, 0xCE, 0xB3, 0x8C, 0xA6, 0x7F, 0xA7, 0xEF, 0x9F, 0xE3, 0xA4, + 0xD5, 0xA3, 0x62, 0xAD, 0x3B, 0xC2, 0xFD, 0xBE, 0xFF, 0xDB, 0xCD, 0xC6, + 0xA8, 0xCF, 0x64, 0xBB, 0x81, 0xCF, 0x69, 0xC5, 0x5E, 0xDA, 0x87, 0xDE, + 0x8C, 0xCB, 0xFE, 0xD2, 0x64, 0xA5, 0xEF, 0xAB, 0x0D, 0xA9, 0x55, 0xB4, + 0x38, 0xC1, 0xA8, 0xCA, 0x8F, 0xAF, 0x4B, 0xB7, 0x4D, 0xA2, 0x05, 0x9D, + 0x7E, 0xAB, 0xE4, 0x94, 0x03, 0xA8, 0xBD, 0x98, 0x62, 0xA0, 0xE2, 0x9B, + 0xD4, 0xA6, 0x95, 0xA8, 0xAC, 0xA2, 0x4A, 0xAB, 0x5F, 0x9B, 0x13, 0xA1, + 0xD8, 0xB5, 0x8B, 0xB5, 0xF7, 0xCB, 0x55, 0xCD, 0x77, 0xD1, 0x48, 0xD0, + 0x84, 0xF9, 0xC1, 0xE3, 0x32, 0x16, 0xF4, 0xFC, 0xE2, 0xF9, 0xE8, 0xEB, + 0x04, 0xD2, 0xF3, 0xC8, 0x9D, 0xB3, 0xB1, 0xBB, 0x05, 0x9F, 0x07, 0xAB, + 0x2D, 0xA0, 0xC4, 0xA3, 0x2B, 0xA9, 0x18, 0xB4, 0x37, 0xB4, 0x02, 0xC1, + 0x5B, 0xCC, 0xD2, 0xD6, 0xE8, 0xEB, 0x22, 0xF1, 0x59, 0x0A, 0xA2, 0x03, + 0x76, 0x23, 0xC2, 0x18, 0xB5, 0x31, 0xA8, 0x21, 0x27, 0x3E, 0x32, 0x29, + 0x20, 0x4F, 0xDE, 0x2B, 0xBF, 0x43, 0xDC, 0x16, 0xF9, 0x0E, 0x21, 0xED, + 0x70, 0xE8, 0xBE, 0xCF, 0xFE, 0xE4, 0xA8, 0xD5, 0x34, 0xF2, 0xA1, 0xE6, + 0x27, 0x15, 0x83, 0x03, 0x29, 0x30, 0x58, 0x27, 0x2B, 0x38, 0xF0, 0x3D, + 0x63, 0x2F, 0xD7, 0x39, 0x8C, 0x17, 0x6C, 0x1F, 0x07, 0x08, 0x96, 0x03, + 0x16, 0x1E, 0x6E, 0x13, 0xA6, 0x4A, 0xCF, 0x40, 0xF9, 0x5D, 0x57, 0x5B, + 0x22, 0x5B, 0xB8, 0x5B, 0xD0, 0x58, 0xEB, 0x59, 0x88, 0x46, 0xD1, 0x4D, + 0x7A, 0x29, 0xB8, 0x34, 0x28, 0x15, 0x7B, 0x20, 0xDC, 0x03, 0x9B, 0x13, + 0x31, 0x0C, 0xFE, 0x22, 0x17, 0x2A, 0x93, 0x47, 0xE2, 0x37, 0x8C, 0x56, + 0x20, 0x39, 0x7A, 0x49, 0xE4, 0x4F, 0x11, 0x4A, 0xB8, 0x62, 0x67, 0x53, + 0xBA, 0x58, 0x88, 0x56, 0x64, 0x55, 0x6C, 0x5F, 0xB7, 0x56, 0xD6, 0x5E, + 0x00, 0x54, 0xF7, 0x50, 0xFE, 0x49, 0x64, 0x42, 0xCF, 0x27, 0x1B, 0x27, + 0x0D, 0x05, 0xFB, 0x1A, 0x65, 0x06, 0x5D, 0x22, 0x4D, 0x1D, 0x84, 0x2B, + 0x84, 0x3C, 0xDD, 0x3A, 0x08, 0x60, 0x72, 0x4C, 0xA4, 0x60, 0x03, 0x55, + 0xC5, 0x47, 0xC5, 0x4C, 0xB3, 0x3B, 0xB7, 0x40, 0x27, 0x2D, 0x56, 0x33, + 0xEC, 0x21, 0x17, 0x1D, 0x00, 0x31, 0x81, 0x1C, 0x47, 0x45, 0xDC, 0x2C, + 0x94, 0x57, 0x2C, 0x3B, 0xC5, 0x5F, 0x91, 0x48, 0x09, 0x58, 0x0C, 0x4D, + 0x68, 0x4B, 0x89, 0x50, 0x3F, 0x3B, 0xE2, 0x41, 0x74, 0x26, 0xFB, 0x21, + 0xEB, 0x09, 0xFE, 0x0D, 0x70, 0x0D, 0x1A, 0x1B, 0xD8, 0x22, 0x88, 0x29, + 0x75, 0x2D, 0xE4, 0x2C, 0xBD, 0x4C, 0x16, 0x42, 0x55, 0x64, 0xB0, 0x52, + 0x4B, 0x55, 0xAF, 0x42, 0x42, 0x50, 0xFA, 0x49, 0x41, 0x4B, 0x34, 0x54, + 0x38, 0x2C, 0xC7, 0x2B, 0x94, 0x2B, 0xE8, 0x21, 0x58, 0x40, 0x2F, 0x36, + 0xC4, 0x22, 0xF0, 0x1A, 0x62, 0x05, 0x2D, 0x01, 0x59, 0x1E, 0x7B, 0x0D, + 0xB8, 0x24, 0x5A, 0x0E, 0xE4, 0x24, 0xA0, 0x0C, 0x56, 0x35, 0x4C, 0x26, + 0x74, 0x24, 0x9D, 0x2D, 0x0F, 0x0B, 0x3F, 0x19, 0xC1, 0x04, 0x68, 0x0E, + 0x17, 0xF2, 0x8F, 0xFB, 0x51, 0xEC, 0x86, 0xE6, 0xC3, 0x0E, 0xA4, 0xF7, + 0xD2, 0x21, 0xC4, 0x15, 0x0E, 0x26, 0x65, 0x27, 0xD0, 0x26, 0x19, 0x33, + 0x5C, 0x06, 0x6A, 0x2D, 0x29, 0xE5, 0x90, 0x18, 0xE0, 0xDB, 0x5F, 0xF8, + 0xAD, 0xC3, 0xDD, 0xD6, 0xF4, 0xA8, 0x64, 0xCF, 0xCD, 0xC2, 0xDD, 0xE7, + 0x02, 0xEB, 0x40, 0xF0, 0x48, 0xFA, 0xB6, 0xEF, 0x40, 0x01, 0x62, 0xFE, + 0x93, 0x02, 0x12, 0x0E, 0x34, 0x00, 0xEF, 0x0A, 0x00, 0xF4, 0x73, 0x00, + 0x45, 0xD5, 0xBB, 0xEA, 0x20, 0xC6, 0x60, 0xCB, 0xD4, 0xD4, 0x44, 0xC2, + 0xD0, 0xCD, 0x8B, 0xBF, 0x7F, 0xCC, 0x0A, 0xC1, 0xE0, 0xED, 0xD8, 0xC5, + 0x27, 0xF9, 0xC4, 0xCD, 0x32, 0xE7, 0xC7, 0xE7, 0x9E, 0xEA, 0xB9, 0xFC, + 0xD3, 0xEB, 0x6C, 0xEF, 0x75, 0xC7, 0xA6, 0xCF, 0x3E, 0xD1, 0x37, 0xC6, + 0x8F, 0xF7, 0xE6, 0xD5, 0x79, 0xEB, 0x83, 0xCE, 0x6B, 0xEA, 0xF2, 0xCB, + 0x4A, 0x04, 0xEB, 0xEF, 0x15, 0xF8, 0xFB, 0xF4, 0x74, 0xDA, 0xFF, 0xD3, + 0x29, 0xC8, 0x96, 0xC5, 0xE5, 0xB2, 0xCC, 0xC0, 0xEC, 0xAA, 0x46, 0xC0, + 0x40, 0xB2, 0x12, 0xBE, 0x25, 0xB2, 0x37, 0xB6, 0x02, 0xBF, 0xD2, 0xBC, + 0xCA, 0xE6, 0x41, 0xCE, 0x39, 0xFF, 0x13, 0xE1, 0xF5, 0x08, 0xA1, 0xF5, + 0x58, 0x18, 0xB3, 0x10, 0x62, 0x0D, 0xAF, 0x24, 0x30, 0xFB, 0x18, 0x0D, + 0x5B, 0xFE, 0x4B, 0xE6, 0x5D, 0xEC, 0x88, 0xC6, 0xE7, 0xC6, 0xB2, 0xAC, + 0x47, 0xB3, 0xD5, 0xA9, 0x21, 0xBF, 0xCD, 0xBB, 0xBB, 0xE9, 0xE2, 0xE0, + 0xE8, 0x03, 0x96, 0xF4, 0x92, 0x04, 0xCC, 0x03, 0x49, 0x0D, 0x04, 0x22, + 0x65, 0x13, 0x73, 0x15, 0x6E, 0xF0, 0x10, 0xF4, 0x85, 0xCE, 0xC9, 0xE8, + 0x40, 0xE6, 0x8D, 0xE0, 0x72, 0x0E, 0x82, 0xEF, 0xFF, 0x28, 0x7A, 0x16, + 0x38, 0x30, 0xC3, 0x1F, 0x2F, 0x1A, 0x28, 0x01, 0x73, 0xF6, 0xBD, 0xEF, + 0x28, 0xE4, 0x6B, 0xFA, 0xE1, 0xDF, 0x0A, 0xE8, 0x82, 0xEA, 0xC9, 0xCF, + 0xDD, 0x12, 0x54, 0x02, 0xD0, 0x29, 0x61, 0x37, 0x84, 0x1F, 0x39, 0x2C, + 0x09, 0x2F, 0x21, 0x24, 0x0A, 0x35, 0xB4, 0x3E, 0x18, 0x20, 0x47, 0x3F, + 0x75, 0x32, 0x60, 0x39, 0xBC, 0x3D, 0xD8, 0x42, 0x68, 0x24, 0x0F, 0x36, + 0x68, 0x09, 0x83, 0x1A, 0x25, 0xF1, 0x60, 0xFB, 0x04, 0xDC, 0xD2, 0xE5, + 0xC4, 0xDF, 0xEA, 0xF0, 0xCC, 0x09, 0x8D, 0x0B, 0xE9, 0x2D, 0xEE, 0x11, + 0xCA, 0x40, 0xA0, 0x2C, 0xD6, 0x58, 0x82, 0x49, 0x46, 0x51, 0x1D, 0x38, + 0x8C, 0x30, 0x41, 0x2D, 0x3A, 0x24, 0x55, 0x1B, 0xCD, 0x13, 0x53, 0xFA, + 0x7B, 0xF8, 0xCE, 0xFB, 0x5B, 0xF4, 0x6B, 0xF8, 0x48, 0x04, 0x86, 0x02, + 0xCD, 0x0D, 0xC2, 0x11, 0xA0, 0x11, 0xC4, 0x16, 0x8B, 0x11, 0x61, 0x26, + 0x9E, 0x0B, 0x20, 0x1A, 0xEC, 0x00, 0x63, 0x05, 0x0F, 0xF5, 0x7E, 0xF0, + 0x67, 0xF7, 0x27, 0xDC, 0x55, 0xEA, 0xEE, 0xF1, 0x84, 0xDF, 0x9C, 0x12, + 0x5A, 0x0A, 0x05, 0x13, 0xAC, 0x32, 0xBD, 0x12, 0xD1, 0x28, 0x79, 0x03, + 0xED, 0x10, 0xB5, 0xF9, 0xD4, 0xF0, 0x5D, 0xF1, 0x4B, 0xBD, 0x26, 0xD4, + 0x67, 0xA1, 0x14, 0xD3, 0x46, 0xBB, 0xA1, 0xE1, 0xDE, 0xD1, 0xE2, 0xE5, + 0x37, 0xDD, 0xDC, 0xEB, 0xF3, 0x00, 0x1A, 0xFC, 0xEE, 0x03, 0x01, 0xEF, + 0xA1, 0xED, 0xC3, 0xCD, 0x68, 0xEC, 0x7B, 0xE5, 0xC5, 0xE8, 0x42, 0x01, + 0xAA, 0xDC, 0x1A, 0xF8, 0x41, 0xC8, 0xFB, 0xF0, 0x58, 0xB1, 0xA3, 0xC5, + 0x5E, 0xAD, 0x9B, 0xA6, 0x70, 0xB4, 0x6A, 0xBE, 0x9B, 0xBC, 0xE5, 0xB8, + 0x18, 0xDB, 0xAE, 0xC3, 0xAB, 0xF1, 0x87, 0xF5, 0xA2, 0xEE, 0xD2, 0x01, + 0xC2, 0xEF, 0x14, 0xF8, 0x08, 0xE3, 0x75, 0xDE, 0x78, 0xBC, 0x2E, 0xCC, + 0x44, 0x9E, 0x3B, 0xD6, 0x10, 0xA4, 0xA9, 0xCB, 0x70, 0xBC, 0xFE, 0xC5, + 0xBC, 0xDB, 0x8F, 0xCC, 0x55, 0xF6, 0x58, 0xD0, 0x0B, 0x01, 0x0C, 0xEE, + 0xF0, 0xF0, 0x93, 0xF9, 0x78, 0xC8, 0xD4, 0xEF, 0xA3, 0xA3, 0xCA, 0xCB, + 0x85, 0xA4, 0x2E, 0xA9, 0x86, 0xBD, 0x17, 0xBF, 0x96, 0xB7, 0x4F, 0xC4, + 0x74, 0xBB, 0xCD, 0xC8, 0x99, 0xEC, 0x22, 0xF4, 0xA8, 0xFA, 0x3A, 0xF4, + 0x42, 0xD2, 0x28, 0xC7, 0xA3, 0xDB, 0x24, 0xC3, 0x80, 0xEE, 0xFE, 0xC7, + 0x4C, 0xC8, 0xA6, 0xB3, 0x9E, 0xC2, 0x7A, 0xC7, 0x83, 0xD7, 0xF7, 0xE8, + 0xCC, 0xC7, 0x0B, 0xC9, 0xBD, 0xBE, 0x29, 0xAD, 0x50, 0xCE, 0x71, 0xCF, + 0x9C, 0xD8, 0xDE, 0xD3, 0x6A, 0xDD, 0x38, 0xCE, 0x5D, 0xD8, 0x47, 0xDE, + 0x95, 0xD0, 0xE1, 0xD5, 0x65, 0xCE, 0x39, 0xBF, 0xF3, 0xCA, 0xD4, 0xA2, + 0x0A, 0xC4, 0x53, 0xA5, 0x4E, 0xD1, 0x6F, 0xD8, 0xED, 0xDB, 0x5C, 0xF1, + 0x1A, 0xE2, 0xB7, 0x03, 0xE4, 0x13, 0x0B, 0x12, 0xF6, 0x40, 0x7E, 0x06, + 0x2D, 0x28, 0xF3, 0x03, 0xC1, 0xE8, 0xBE, 0xF0, 0x31, 0xC4, 0x3B, 0xE2, + 0x49, 0xBD, 0x2C, 0xCB, 0x25, 0xB7, 0x79, 0xB7, 0x4E, 0xB2, 0xF6, 0xCB, + 0x20, 0xCC, 0x27, 0xE9, 0xA9, 0xF5, 0x6A, 0x0F, 0x6E, 0x10, 0x22, 0x19, + 0x56, 0x1F, 0x43, 0x14, 0xF1, 0x1C, 0xAC, 0x1D, 0x4F, 0x03, 0xE4, 0x02, + 0xE7, 0xF3, 0xA5, 0xE4, 0x38, 0x0B, 0x3B, 0xE5, 0x25, 0x0E, 0x7B, 0xE9, + 0x90, 0xFC, 0xFB, 0xE5, 0xC7, 0xF4, 0x8A, 0xF0, 0xB2, 0xE7, 0x60, 0x11, + 0xCD, 0xE5, 0xD8, 0x12, 0x71, 0x09, 0xD0, 0xFF, 0x3A, 0x29, 0x2D, 0x1F, + 0xE0, 0x18, 0xCC, 0x25, 0x80, 0x10, 0x22, 0x0A, 0x23, 0x2A, 0x44, 0x02, + 0x19, 0x2C, 0x79, 0x0A, 0x3B, 0x28, 0xE5, 0x26, 0x2E, 0x41, 0xD1, 0x43, + 0xB2, 0x47, 0xC5, 0x5A, 0x01, 0x47, 0xAA, 0x5B, 0x9E, 0x4D, 0x2C, 0x43, + 0xB6, 0x3B, 0xD1, 0x33, 0xA5, 0x1D, 0xF7, 0x1C, 0xBB, 0x05, 0x0A, 0xF2, + 0xE5, 0xF9, 0x2A, 0xFB, 0xC7, 0x04, 0x3F, 0x2D, 0xB1, 0x20, 0x46, 0x35, + 0x10, 0x43, 0x90, 0x39, 0xDB, 0x59, 0x4B, 0x54, 0x21, 0x61, 0x53, 0x55, + 0x7C, 0x62, 0x5E, 0x4F, 0x2B, 0x52, 0xD2, 0x57, 0xB7, 0x2F, 0x65, 0x52, + 0x0D, 0x1B, 0x73, 0x27, 0x7D, 0x18, 0x9B, 0x1C, 0xA9, 0x11, 0x58, 0x26, + 0x6E, 0x11, 0x66, 0x1F, 0x0E, 0x29, 0xF7, 0x31, 0xE5, 0x3B, 0x85, 0x32, + 0xAE, 0x4C, 0xC5, 0x34, 0xB2, 0x65, 0xAE, 0x4B, 0x62, 0x63, 0x1F, 0x44, + 0x3F, 0x4A, 0xDF, 0x34, 0x02, 0x3E, 0x73, 0x40, 0x7D, 0x33, 0x19, 0x4A, + 0x78, 0x30, 0x62, 0x45, 0xC9, 0x44, 0x90, 0x4C, 0xC8, 0x5A, 0xEA, 0x53, + 0x16, 0x5B, 0x8E, 0x41, 0x99, 0x4E, 0x10, 0x46, 0x3D, 0x52, 0xCD, 0x51, + 0x53, 0x39, 0xD5, 0x29, 0xA6, 0x13, 0x19, 0x07, 0x37, 0x20, 0x82, 0x1D, + 0xDF, 0x36, 0xE8, 0x3F, 0x43, 0x41, 0x71, 0x41, 0xE0, 0x57, 0x7F, 0x47, + 0x87, 0x6A, 0xD0, 0x55, 0x12, 0x67, 0x7B, 0x55, 0x38, 0x58, 0x79, 0x4B, + 0x22, 0x43, 0xA5, 0x48, 0x55, 0x41, 0x4A, 0x3F, 0xD7, 0x3B, 0x85, 0x17, + 0x2C, 0x23, 0x77, 0xF9, 0x68, 0x22, 0x0A, 0xEE, 0x81, 0x17, 0x5F, 0xFE, + 0x10, 0xF3, 0xE2, 0x0F, 0x28, 0x07, 0x80, 0x2D, 0x15, 0x42, 0x56, 0x51, + 0xA2, 0x5F, 0x85, 0x43, 0x05, 0x69, 0xFA, 0x3B, 0x26, 0x5C, 0x43, 0x32, + 0x47, 0x39, 0xF0, 0x14, 0xCB, 0x0E, 0x3C, 0x00, 0x49, 0xFA, 0xAB, 0xE7, + 0x5A, 0x06, 0xB4, 0xF1, 0x3B, 0x1B, 0x16, 0x1B, 0xE3, 0x24, 0x4A, 0x1F, + 0xC5, 0x21, 0xFB, 0x19, 0x54, 0x24, 0x4F, 0x09, 0x7B, 0x22, 0x8F, 0xE3, + 0x9D, 0xFD, 0xE3, 0xD8, 0xCC, 0xE0, 0x44, 0xE7, 0x78, 0xEA, 0xDF, 0xF4, + 0x9F, 0x06, 0x04, 0xF3, 0x77, 0x2A, 0xCE, 0xF8, 0x9F, 0x32, 0xD6, 0x04, + 0x63, 0x12, 0xDF, 0xEB, 0xA5, 0xF5, 0x9F, 0xF9, 0xD1, 0x02, 0x2E, 0x1E, + 0x73, 0x04, 0xD1, 0x0B, 0x4A, 0xE4, 0x19, 0x0C, 0x5A, 0xE9, 0x40, 0x07, + 0xA4, 0x0D, 0x54, 0xE5, 0x18, 0x0D, 0x79, 0xCE, 0x31, 0xFD, 0x1C, 0xDA, + 0x7A, 0x07, 0x42, 0x0E, 0x33, 0x11, 0xA6, 0x1D, 0x57, 0x1A, 0x86, 0x1A, + 0x54, 0x23, 0x4F, 0x28, 0xA2, 0x10, 0x02, 0x13, 0x4D, 0xEC, 0xBE, 0xF9, + 0x1E, 0xD5, 0xAC, 0xD7, 0xA8, 0xDB, 0x82, 0xBA, 0x80, 0xF6, 0x96, 0xD4, + 0x03, 0x06, 0x0C, 0xDD, 0x82, 0x09, 0x09, 0xF4, 0x28, 0x10, 0x8C, 0x32, + 0xD9, 0x0E, 0x53, 0x2D, 0xB8, 0x04, 0xA9, 0x10, 0xC8, 0xFC, 0x16, 0x04, + 0xC0, 0xF1, 0x22, 0xF8, 0xE0, 0xE4, 0xEE, 0xEA, 0x3E, 0xE5, 0x9F, 0xDD, + 0xE6, 0xE9, 0x9D, 0xF4, 0x2D, 0xEC, 0x24, 0x0B, 0xEF, 0xF0, 0xBD, 0x06, + 0x0B, 0xFE, 0x6B, 0x10, 0xA1, 0x17, 0xCA, 0x04, 0xEB, 0x28, 0x2D, 0xEE, + 0xC2, 0x11, 0x20, 0xE3, 0xC4, 0xE3, 0x1B, 0xD3, 0xFB, 0xBD, 0xD4, 0xD4, + 0x6D, 0xB1, 0x71, 0xD5, 0x63, 0xD1, 0x90, 0xE6, 0x40, 0x08, 0xC8, 0x07, + 0xF3, 0x1C, 0x68, 0x13, 0xF0, 0x10, 0xCC, 0x11, 0xE8, 0x19, 0x22, 0x14, + 0xAF, 0x0B, 0xD0, 0x08, 0x48, 0xDA, 0xA7, 0xF5, 0xC7, 0xE5, 0x91, 0xEA, + 0xC2, 0x01, 0xCD, 0xF2, 0x02, 0xEA, 0x4B, 0xFA, 0x76, 0xED, 0x28, 0x06, + 0x75, 0x0F, 0xE5, 0x20, 0x55, 0x03, 0x5B, 0x1E, 0x01, 0xDF, 0xDE, 0x11, + 0x90, 0xD7, 0x2A, 0x12, 0x4E, 0xE4, 0x94, 0xFC, 0x23, 0xE0, 0x7E, 0xD7, + 0x75, 0xD5, 0x0B, 0xC6, 0xD6, 0xC9, 0x7E, 0xC6, 0xF6, 0xCA, 0x7F, 0xD7, + 0x9F, 0xE1, 0x06, 0xE3, 0x96, 0xED, 0x0C, 0xEE, 0x5C, 0xFA, 0x29, 0x0D, + 0xB1, 0xFD, 0x46, 0x10, 0xEB, 0xEE, 0x50, 0x0A, 0xBC, 0xE4, 0x9F, 0x01, + 0xDD, 0xDB, 0xA9, 0xCC, 0xDC, 0xC0, 0x89, 0xAC, 0xC6, 0xA0, 0x82, 0xAA, + 0xA0, 0xA9, 0xA9, 0xBB, 0xB1, 0xCF, 0xCA, 0xCE, 0x22, 0xDA, 0x36, 0xD3, + 0xE0, 0xDE, 0xF3, 0xF1, 0x0D, 0xEC, 0xFC, 0x01, 0x69, 0xE8, 0x2F, 0xF2, + 0x2E, 0xD2, 0x29, 0xCC, 0xF8, 0xBF, 0xC2, 0xAC, 0x12, 0xB7, 0x46, 0xB2, + 0x03, 0xAB, 0x0A, 0xA9, 0x20, 0xB5, 0x29, 0xB7, 0xC9, 0xD4, 0x38, 0xE7, + 0xDD, 0xD8, 0x12, 0xEA, 0x79, 0xBB, 0x71, 0xE4, 0x1B, 0xB9, 0xA6, 0xF9, + 0x9A, 0xBE, 0x9A, 0xF1, 0x32, 0xAB, 0x44, 0xBF, 0x56, 0xB5, 0x73, 0xB3, + 0xE4, 0xCD, 0xBE, 0xE7, 0xE5, 0xC5, 0x85, 0xF1, 0x5F, 0xCC, 0x07, 0xF6, + 0x12, 0xF3, 0x3D, 0x12, 0x21, 0x01, 0x18, 0xFC, 0x97, 0xF2, 0xA3, 0xE2, + 0xC9, 0xDF, 0x7D, 0xD3, 0xF9, 0xD0, 0xCB, 0xD0, 0x5F, 0xBB, 0xE4, 0xC9, + 0x51, 0xA5, 0x34, 0xAD, 0x62, 0x9F, 0x35, 0x9D, 0x69, 0xA0, 0x16, 0xB8, + 0x00, 0xAE, 0x67, 0xD1, 0xE8, 0xD0, 0x0B, 0xD0, 0xA0, 0xF6, 0xE4, 0xDC, + 0x63, 0x01, 0x7B, 0xEA, 0x0B, 0xF9, 0x25, 0xE5, 0x23, 0xF7, 0x23, 0xE1, + 0xF1, 0xE2, 0x30, 0xD5, 0xB2, 0xB9, 0xE9, 0xC5, 0xEC, 0xA5, 0xF3, 0xB3, + 0x70, 0xA8, 0x99, 0x9C, 0x25, 0xBC, 0x0F, 0xA2, 0xCD, 0xCF, 0xFC, 0xBA, + 0x06, 0xEA, 0x98, 0xD6, 0x55, 0xF8, 0x7D, 0xD5, 0x03, 0xDD, 0x1C, 0xC6, + 0x18, 0xBB, 0x09, 0xB6, 0x73, 0xA9, 0x35, 0xA4, 0x6E, 0xA1, 0x6D, 0xAA, + 0xC2, 0xA7, 0x75, 0xB0, 0x8D, 0xC1, 0xA0, 0xB6, 0x42, 0xDF, 0xAC, 0xCC, + 0xF7, 0xE5, 0x23, 0xE0, 0x3B, 0xE1, 0x85, 0xD7, 0xFA, 0xE1, 0xF8, 0xC3, + 0x50, 0xC4, 0x7A, 0xCA, 0x5F, 0xA3, 0x14, 0xBD, 0xA8, 0xC1, 0x67, 0xBC, + 0xC5, 0xED, 0xD2, 0xD7, 0x3C, 0xDC, 0xBB, 0xC0, 0xE5, 0xCA, 0xAD, 0xB8, + 0x0B, 0xD8, 0xCC, 0xEE, 0xEB, 0xD9, 0xC9, 0x03, 0x04, 0xD5, 0xD8, 0xEF, + 0xA5, 0xDD, 0x12, 0xE8, 0x8D, 0xE8, 0xE9, 0xEE, 0x2A, 0xCE, 0x28, 0xDA, + 0xB4, 0xAF, 0x93, 0xB0, 0x66, 0xB6, 0xAE, 0xB4, 0x67, 0xC0, 0x62, 0xC4, + 0x68, 0xB6, 0x67, 0xCA, 0x3E, 0xC8, 0xEA, 0xED, 0x21, 0x0B, 0xC7, 0x10, + 0x93, 0x27, 0x64, 0x13, 0xF7, 0x14, 0x6E, 0x08, 0xC1, 0x07, 0xA1, 0xF2, + 0x44, 0xDE, 0xC3, 0xDA, 0xD2, 0xA7, 0x61, 0xCF, 0x80, 0x99, 0xB2, 0xC5, + 0xCA, 0xBA, 0x9C, 0xB8, 0xE1, 0xFA, 0x96, 0xD4, 0xB1, 0x28, 0x3B, 0xF5, + 0xA0, 0x44, 0x46, 0xF4, 0x3B, 0x48, 0x38, 0xFC, 0xB1, 0x1D, 0x5E, 0xF9, + 0xF2, 0xEB, 0x3A, 0xD0, 0x4F, 0xE4, 0xC8, 0xC7, 0x6E, 0xFE, 0xE8, 0xDE, + 0xA0, 0x06, 0x4C, 0xDA, 0xAF, 0x07, 0xB3, 0xED, 0xD0, 0x1C, 0xA0, 0x0E, + 0x8D, 0x1B, 0x25, 0x0E, 0xE5, 0x09, 0x66, 0xFE, 0xF3, 0x22, 0xF9, 0x0B, + 0xF3, 0x2A, 0xE4, 0x26, 0xC4, 0x04, 0x7B, 0x17, 0x0E, 0x07, 0x83, 0x1B, + 0x79, 0x28, 0x89, 0x2D, 0x4B, 0x22, 0xE6, 0x05, 0xA9, 0x17, 0x0F, 0x0D, + 0x95, 0x2E, 0x3A, 0x3F, 0x79, 0x35, 0xC1, 0x4B, 0xCA, 0x29, 0x35, 0x40, + 0xD1, 0x2E, 0x79, 0x23, 0xF7, 0x2B, 0xA4, 0x11, 0xE5, 0x0A, 0x12, 0xF8, + 0x9F, 0xE1, 0xEC, 0xD1, 0xE8, 0xCF, 0x55, 0xD5, 0x68, 0xE0, 0x74, 0xFA, + 0x84, 0xF9, 0x59, 0x18, 0xE6, 0x1F, 0x6C, 0x38, 0xD4, 0x51, 0x20, 0x53, + 0xA6, 0x5E, 0x60, 0x4F, 0xDC, 0x4E, 0x2F, 0x3C, 0x8E, 0x3C, 0x85, 0x23, + 0xC0, 0x26, 0xBD, 0xFB, 0x51, 0x19, 0xC7, 0xD7, 0x81, 0x06, 0x44, 0xD1, + 0xF6, 0xF2, 0xCF, 0xE8, 0x21, 0xFB, 0x16, 0x15, 0x5F, 0x0C, 0x26, 0x2C, + 0xF1, 0x22, 0x6D, 0x20, 0x4A, 0x3A, 0xEA, 0x21, 0x58, 0x3E, 0x8A, 0x23, + 0x24, 0x2B, 0xC1, 0x02, 0xE3, 0x19, 0x3E, 0xFA, 0x11, 0x1C, 0x3C, 0x07, + 0x54, 0x14, 0x44, 0xFE, 0xBA, 0x18, 0x8B, 0x01, 0xA2, 0x30, 0xE9, 0x11, + 0x00, 0x28, 0x51, 0x19, 0x84, 0x1E, 0x94, 0x1A, 0x57, 0x39, 0x7D, 0x2E, + 0xE6, 0x2D, 0x71, 0x24, 0x32, 0x01, 0xF1, 0xFB, 0x2D, 0x11, 0x82, 0x09, + 0x80, 0x3E, 0xA2, 0x1B, 0xE5, 0x35, 0x3A, 0x08, 0xD0, 0x2F, 0x7C, 0x22, + 0x1C, 0x4C, 0xEE, 0x4B, 0x6E, 0x48, 0x4F, 0x47, 0xF0, 0x2E, 0x7A, 0x3B, + 0x9F, 0x2F, 0x97, 0x3D, 0xFD, 0x34, 0x46, 0x35, 0xA8, 0x1B, 0x46, 0x18, + 0x88, 0xFA, 0x1C, 0x05, 0xA1, 0xFE, 0xF8, 0xFE, 0x52, 0x1B, 0x4B, 0x08, + 0x17, 0x2E, 0x9A, 0x08, 0x46, 0x43, 0xC8, 0x19, 0x47, 0x57, 0x65, 0x48, + 0x11, 0x5E, 0x36, 0x50, 0x97, 0x61, 0x0B, 0x4C, 0xC0, 0x5A, 0x16, 0x53, + 0x5C, 0x39, 0x4B, 0x32, 0x33, 0x1C, 0x24, 0x05, 0x8C, 0x0D, 0x79, 0xE9, + 0xF2, 0x0C, 0x33, 0xF5, 0x4D, 0x1F, 0xEB, 0x0E, 0xE5, 0x30, 0x18, 0x1C, + 0xED, 0x49, 0xAF, 0x3F, 0xFD, 0x64, 0x38, 0x45, 0x99, 0x63, 0xC1, 0x26, + 0x5A, 0x38, 0xC4, 0x08, 0x35, 0x12, 0xB4, 0x02, 0xDD, 0x09, 0x29, 0x17, + 0xE8, 0x0F, 0x91, 0x1A, 0x47, 0x31, 0x91, 0x1A, 0x1E, 0x4E, 0x7A, 0x2D, + 0xD4, 0x3B, 0x1C, 0x2F, 0x2A, 0x39, 0xCA, 0x29, 0x9F, 0x4A, 0xA3, 0x2A, + 0xF3, 0x2B, 0xBB, 0x20, 0x71, 0x1A, 0x34, 0x03, 0x51, 0x35, 0x1F, 0x05, + 0xF5, 0x31, 0x15, 0x26, 0xE6, 0x1E, 0xD9, 0x2D, 0xBC, 0x3A, 0x85, 0x2C, + 0x48, 0x4E, 0x7F, 0x2E, 0xFC, 0x31, 0x00, 0x35, 0xE6, 0x2D, 0xF2, 0x32, + 0xD1, 0x41, 0xE8, 0x2A, 0xB7, 0x34, 0xDD, 0x1C, 0x1C, 0x0B, 0x61, 0x01, + 0x0F, 0xE2, 0x4C, 0xF2, 0x25, 0xD6, 0xB8, 0xEE, 0xC2, 0xE8, 0xA9, 0xF2, + 0xD2, 0x07, 0x30, 0x05, 0x94, 0x34, 0x5F, 0x2B, 0x74, 0x53, 0x73, 0x56, + 0xA0, 0x4B, 0x0F, 0x5E, 0xDE, 0x30, 0xA8, 0x54, 0x34, 0x16, 0x83, 0x2E, + 0x01, 0x00, 0x3C, 0xF1, 0xB0, 0xF5, 0x9C, 0xE9, 0xF2, 0xF6, 0x6C, 0xF6, + 0x45, 0x05, 0x4D, 0xF2, 0x86, 0x11, 0x8D, 0xFB, 0x2C, 0x17, 0x9F, 0x13, + 0x97, 0x13, 0xEC, 0x2E, 0x22, 0x0F, 0xCB, 0x2C, 0x91, 0x0D, 0x5C, 0x23, + 0x52, 0xFA, 0xC3, 0x2B, 0x57, 0xF9, 0xCB, 0x1A, 0xAF, 0x08, 0x9C, 0xF2, + 0x77, 0x12, 0x1E, 0xEB, 0x13, 0x26, 0x4A, 0x01, 0x99, 0x2F, 0x47, 0x13, + 0x7A, 0x20, 0x64, 0x17, 0xC4, 0x25, 0x39, 0x31, 0x7F, 0x25, 0xDE, 0x3D, + 0x57, 0xFF, 0x6B, 0x0D, 0x25, 0xF9, 0xEA, 0xF6, 0xC1, 0x0C, 0x0C, 0x0A, + 0xFC, 0xF7, 0x0B, 0x08, 0x5D, 0xF1, 0x64, 0x12, 0x11, 0x1A, 0xA8, 0x38, + 0xD3, 0x20, 0x37, 0x43, 0x99, 0x0B, 0xA1, 0x39, 0x9A, 0x17, 0xDB, 0x2B, + 0xA2, 0x18, 0xBC, 0x1B, 0x4D, 0xE5, 0xBA, 0x06, 0x93, 0xBB, 0xD7, 0xF5, + 0x50, 0xAE, 0x22, 0xDF, 0x00, 0xAD, 0x97, 0xD6, 0xD5, 0xC1, 0x72, 0xEC, + 0x7B, 0xEC, 0x1A, 0x00, 0x8A, 0x16, 0x82, 0x11, 0x51, 0x1D, 0xB0, 0x1A, + 0x25, 0x05, 0x65, 0x0F, 0xA2, 0xE5, 0x7A, 0x00, 0x55, 0xCE, 0x73, 0xEF, + 0x95, 0xC9, 0xD4, 0xDC, 0xBB, 0xC6, 0x74, 0xD5, 0xF9, 0xC9, 0x75, 0xD7, + 0x6E, 0xD8, 0x97, 0xEA, 0xA3, 0xE1, 0xAD, 0xF8, 0x1B, 0xF2, 0xE0, 0xFB, + 0xE8, 0xF4, 0x26, 0xF0, 0x17, 0xF3, 0x06, 0xE7, 0x62, 0xE8, 0xBA, 0xE1, + 0xFA, 0xC7, 0xA8, 0xD4, 0xBA, 0xB0, 0x76, 0xCD, 0xA0, 0xAA, 0x0A, 0xCC, + 0x60, 0xC3, 0x8C, 0xD1, 0x27, 0xE3, 0xCE, 0xE7, 0x44, 0xE0, 0x42, 0x04, + 0x47, 0xD6, 0xB3, 0x0F, 0xD4, 0xE4, 0x3F, 0x10, 0xD3, 0xDC, 0x87, 0x01, + 0xED, 0xC2, 0x17, 0xDF, 0xA6, 0xCF, 0xC6, 0xD6, 0x45, 0xD5, 0x17, 0xDD, + 0x8C, 0xB4, 0xA3, 0xC5, 0xE8, 0xBB, 0xBA, 0xD1, 0xBE, 0xE3, 0xBC, 0xFE, + 0x3B, 0xEE, 0x55, 0xFC, 0x9C, 0xEC, 0x49, 0xE7, 0xBD, 0xEC, 0x52, 0xEF, + 0x9C, 0xD0, 0xD5, 0xE6, 0x7E, 0xA1, 0x4C, 0xC6, 0x27, 0x9A, 0x98, 0xB7, + 0xB0, 0xAD, 0x0A, 0xA8, 0x70, 0xB7, 0xBE, 0xA3, 0x0E, 0xC5, 0xAB, 0xBE, + 0xA0, 0xE8, 0x44, 0xE5, 0x31, 0x0A, 0x35, 0xFD, 0x65, 0x04, 0xBD, 0xFA, + 0x1F, 0xF3, 0x66, 0xF5, 0x73, 0xE4, 0xBD, 0xE1, 0x05, 0xCA, 0xCB, 0xC0, + 0x3E, 0xB2, 0x6B, 0xAA, 0x83, 0xA5, 0xF6, 0xA2, 0x0D, 0xAC, 0xB4, 0xB0, + 0x6B, 0xB6, 0x39, 0xBA, 0x64, 0xC9, 0x85, 0xC5, 0x5D, 0xEF, 0x2A, 0xE8, + 0x04, 0xF8, 0xCA, 0xF6, 0x54, 0xE8, 0x3A, 0xE5, 0xC0, 0xCD, 0x48, 0xD2, + 0xB3, 0xBC, 0xAA, 0xD4, 0x9E, 0xB4, 0x78, 0xC3, 0xAA, 0xA0, 0xF5, 0xBB, + 0x98, 0xA9, 0x09, 0xE1, 0xD3, 0xCC, 0xB1, 0xE3, 0x9E, 0xDE, 0x62, 0xCF, + 0x0E, 0xEA, 0x65, 0xCA, 0xD4, 0xE8, 0x69, 0xD2, 0xE8, 0xC2, 0xB6, 0xCA, + 0x0E, 0xB6, 0x21, 0xC3, 0x3B, 0xD8, 0x4B, 0xEB, 0xFE, 0xE0, 0x3E, 0xFB, + 0x30, 0xD1, 0x69, 0xF2, 0xDC, 0xE5, 0x08, 0x17, 0x26, 0xFD, 0x07, 0x27, + 0xEF, 0x05, 0xA1, 0x0F, 0x61, 0x16, 0x23, 0xFC, 0x54, 0x13, 0x38, 0xFC, + 0xFF, 0xE2, 0x4E, 0xED, 0x47, 0xB0, 0xD5, 0xCB, 0x54, 0xA6, 0x10, 0xCE, + 0x28, 0xB3, 0x37, 0xC9, 0xBB, 0xC9, 0x31, 0xCD, 0xC7, 0xE9, 0xF5, 0xF7, + 0x9C, 0x13, 0x9E, 0x18, 0x86, 0x38, 0xF0, 0x30, 0xAC, 0x3E, 0x56, 0x3C, + 0x34, 0x2D, 0x0C, 0x31, 0x4F, 0x10, 0x19, 0x16, 0x9D, 0xF5, 0x1F, 0xED, + 0xC5, 0xEB, 0xB0, 0xD9, 0x16, 0xEA, 0xD8, 0xCD, 0x5D, 0xEB, 0x27, 0xD7, + 0xD7, 0xE9, 0x3E, 0xEF, 0xAF, 0x03, 0x28, 0xFA, 0xAB, 0x2D, 0x33, 0x09, + 0x0E, 0x37, 0x82, 0x14, 0x79, 0x21, 0xB5, 0x06, 0x84, 0x08, 0xA3, 0xEA, + 0x6A, 0x01, 0x25, 0xEB, 0x7E, 0x04, 0x58, 0xED, 0x82, 0x15, 0x1D, 0xF6, + 0x62, 0x30, 0x31, 0x11, 0xB8, 0x33, 0x5B, 0x1A, 0xB2, 0x2C, 0xF1, 0x21, + 0x86, 0x37, 0x83, 0x22, 0x7B, 0x2C, 0x33, 0x0F, 0xBA, 0x03, 0x6C, 0xFB, + 0xAA, 0xF4, 0x6D, 0xF3, 0x8B, 0xFD, 0x29, 0x0F, 0x23, 0xFF, 0xF4, 0x13, + 0x7E, 0x13, 0x42, 0x03, 0x3B, 0x42, 0x84, 0x18, 0xEB, 0x4F, 0xA9, 0x2C, + 0xF8, 0x40, 0x67, 0x38, 0xF2, 0x48, 0x9D, 0x3F, 0xB0, 0x4B, 0x0B, 0x32, + 0xE4, 0x1D, 0x69, 0x14, 0x90, 0xE5, 0x5F, 0xF2, 0xB5, 0xD0, 0x3E, 0xE6, + 0x03, 0xE3, 0xA7, 0xE3, 0x1C, 0x04, 0xFA, 0xDA, 0xE5, 0x1F, 0xB9, 0xF4, + 0xCF, 0x38, 0x91, 0x21, 0xC1, 0x45, 0xC4, 0x3F, 0x15, 0x41, 0x3F, 0x40, + 0x46, 0x2C, 0x66, 0x2E, 0x14, 0x15, 0x39, 0x29, 0xE2, 0x07, 0x40, 0x14, + 0xA4, 0xFC, 0x6A, 0xF3, 0xCC, 0x07, 0x52, 0xEF, 0xCE, 0x20, 0xF2, 0xF1, + 0xE4, 0x23, 0xA1, 0xFA, 0xE6, 0x26, 0xAD, 0x11, 0xB6, 0x2B, 0x71, 0x1E, + 0xB4, 0x29, 0xC9, 0x14, 0x34, 0x1D, 0xCE, 0xE9, 0xED, 0x0E, 0x9D, 0xDC, + 0x80, 0xFF, 0xA1, 0xEB, 0x0D, 0xEC, 0x42, 0xE4, 0x8B, 0xF5, 0x8A, 0xF4, + 0x02, 0x1A, 0xCC, 0x09, 0x81, 0x23, 0x52, 0x0E, 0x9A, 0x1F, 0x8C, 0x31, + 0x3E, 0x32, 0x43, 0x46, 0x15, 0x2F, 0x3B, 0x23, 0x59, 0x1F, 0x4F, 0xFE, + 0x0E, 0x1D, 0x2B, 0xFB, 0x6F, 0x02, 0x72, 0x00, 0x22, 0xF3, 0x27, 0xF9, + 0x1C, 0x15, 0xCF, 0x13, 0x45, 0x2E, 0xA1, 0x32, 0xB4, 0x2F, 0xD0, 0x2F, + 0xE8, 0x36, 0x41, 0x44, 0xC0, 0x36, 0xFC, 0x49, 0x52, 0x18, 0xCE, 0x1B, + 0x3D, 0xF5, 0x1B, 0xF6, 0x30, 0xED, 0x1C, 0xF6, 0x3D, 0xF4, 0x41, 0xF1, + 0xF4, 0x03, 0x2B, 0xE5, 0xBD, 0x1D, 0xFE, 0xFF, 0x81, 0x3F, 0x46, 0x20, + 0xAB, 0x51, 0x9C, 0x35, 0xB6, 0x46, 0xBC, 0x4B, 0xB5, 0x3A, 0xE1, 0x3C, + 0x5C, 0x2D, 0x12, 0x1B, 0x46, 0x18, 0xF1, 0xFB, 0xA8, 0x06, 0x59, 0xE9, + 0x0C, 0xF8, 0xC3, 0xE0, 0x7C, 0x00, 0x25, 0xE1, 0x53, 0x1B, 0xBF, 0xF2, + 0xE1, 0x3A, 0xE9, 0x0E, 0x22, 0x4E, 0x0A, 0x2B, 0x33, 0x44, 0x72, 0x2D, + 0x78, 0x26, 0x19, 0x0D, 0x12, 0x03, 0x7C, 0xEE, 0x53, 0xEF, 0x9E, 0xF0, + 0xB3, 0xDF, 0x98, 0xE9, 0x5F, 0xE0, 0x41, 0xDD, 0xE7, 0x08, 0xEF, 0xEE, + 0x72, 0x2C, 0x74, 0x0D, 0x6B, 0x2F, 0x90, 0x11, 0x29, 0x2D, 0xA1, 0x1A, + 0x1F, 0x17, 0xE9, 0x24, 0x99, 0xE5, 0xA3, 0x11, 0x3E, 0xDD, 0x1D, 0x12, + 0x17, 0xFE, 0xC9, 0x1D, 0x03, 0x06, 0x2E, 0x12, 0x94, 0x09, 0xD2, 0x0B, + 0x89, 0x2D, 0x1B, 0x1F, 0xD1, 0x3B, 0xA4, 0x36, 0x10, 0x22, 0x6D, 0x2D, + 0xFA, 0x15, 0xD1, 0x28, 0xF7, 0x15, 0xB1, 0x2B, 0x57, 0x03, 0xFA, 0x08, + 0x45, 0xFA, 0x36, 0xE9, 0xDE, 0xF4, 0x12, 0xD8, 0x75, 0xE1, 0xFD, 0xD6, + 0x9A, 0xE2, 0x37, 0xF6, 0xB8, 0x02, 0x81, 0x2E, 0x45, 0x36, 0x3D, 0x55, + 0x9C, 0x5B, 0x64, 0x5C, 0x98, 0x5B, 0x04, 0x5E, 0x52, 0x44, 0xC9, 0x48, + 0x38, 0x1B, 0x0C, 0x1A, 0x76, 0xF6, 0x79, 0xF6, 0x13, 0xE4, 0x03, 0xEA, + 0xC4, 0xE5, 0x3B, 0xEF, 0x32, 0x08, 0x07, 0x03, 0xEB, 0x27, 0x85, 0x29, + 0x9D, 0x3F, 0x9D, 0x49, 0x72, 0x53, 0x14, 0x42, 0xEA, 0x44, 0x04, 0x2D, + 0xDC, 0x17, 0xF7, 0x14, 0xB0, 0xFE, 0x6B, 0x0B, 0x0C, 0xFF, 0x81, 0x0B, + 0x3E, 0xF9, 0x81, 0x05, 0xDA, 0xF8, 0x7E, 0x17, 0x7C, 0x0D, 0xBB, 0x2F, + 0xAD, 0x2A, 0x93, 0x28, 0xFF, 0x44, 0x8C, 0x21, 0xDE, 0x4C, 0xDF, 0x2A, + 0xA3, 0x25, 0x4B, 0x16, 0x89, 0xF6, 0xC8, 0x03, 0xAB, 0xF7, 0x7D, 0x18, + 0x1A, 0x05, 0xC8, 0x14, 0x4B, 0x06, 0x00, 0x00, 0x1C, 0x1F, 0x7A, 0x20, + 0x4B, 0x41, 0x5D, 0x45, 0xBB, 0x46, 0xA7, 0x3D, 0x66, 0x3E, 0xEA, 0x36, + 0x9E, 0x32, 0xDD, 0x3E, 0x3A, 0x08, 0x10, 0x28, 0x4C, 0xD2, 0x7E, 0xFF, + 0xCD, 0xC4, 0x76, 0xEE, 0x8A, 0xD3, 0xF1, 0xDA, 0xBC, 0xE3, 0x16, 0xD1, + 0xF6, 0xFA, 0xF1, 0xF6, 0x74, 0x17, 0xFE, 0x1F, 0x59, 0x2F, 0xA8, 0x2F, + 0xF2, 0x3C, 0xC4, 0x32, 0x3A, 0x3E, 0x3C, 0x33, 0x07, 0x1F, 0x48, 0x23, + 0x98, 0xE9, 0x52, 0x00, 0x55, 0xD7, 0x04, 0xED, 0xA6, 0xDD, 0xB0, 0xE9, + 0x39, 0xDE, 0x08, 0xF4, 0x6C, 0xE2, 0x6A, 0xFB, 0xB9, 0xF7, 0x93, 0x09, + 0x58, 0x15, 0xA0, 0x15, 0x61, 0x19, 0x2B, 0x0B, 0x86, 0xFE, 0xA5, 0xFD, + 0xC0, 0xD5, 0x8C, 0xE5, 0x53, 0xBA, 0x89, 0xE0, 0x9F, 0xAF, 0xE8, 0xE6, + 0xBA, 0xB0, 0x3A, 0xEA, 0x7D, 0xCA, 0x0D, 0x09, 0x15, 0xEC, 0x6F, 0x1A, + 0x81, 0xFE, 0xBA, 0x02, 0xA1, 0x12, 0x73, 0x00, 0x6D, 0x13, 0x7A, 0x1D, + 0x45, 0xDD, 0x95, 0x0F, 0x73, 0xBA, 0x5D, 0xF2, 0x73, 0xCC, 0xCB, 0xFA, + 0x23, 0xD4, 0x55, 0xF7, 0x2C, 0xDD, 0xA9, 0xE3, 0x1B, 0x09, 0xD1, 0xF4, + 0x57, 0x1C, 0xD6, 0x0F, 0xD3, 0x01, 0xF7, 0x12, 0x57, 0xFE, 0x99, 0x13, + 0xBC, 0x0C, 0x81, 0x0A, 0xFA, 0xF0, 0x84, 0xE6, 0x68, 0xBE, 0xE8, 0xC4, + 0x15, 0xA2, 0x36, 0xC4, 0xA5, 0x9E, 0xCF, 0xCB, 0x21, 0xBA, 0xFB, 0xCF, + 0x81, 0xE4, 0x24, 0xF0, 0x04, 0x0B, 0xC6, 0x0C, 0x9F, 0x23, 0x18, 0x19, + 0xD9, 0x1D, 0x9E, 0x25, 0x53, 0x0A, 0xFA, 0x10, 0xFE, 0xE9, 0x51, 0xE2, + 0x86, 0xB4, 0x94, 0xC0, 0xC8, 0x96, 0x16, 0xC0, 0x4C, 0xA7, 0x44, 0xC9, + 0x8E, 0xD3, 0xDD, 0xBD, 0xD2, 0xF7, 0xB3, 0xCA, 0x68, 0x01, 0x5F, 0xFA, + 0xFB, 0xFA, 0x86, 0x0F, 0x35, 0xEE, 0xB9, 0x05, 0x7E, 0xD8, 0x70, 0xF4, + 0x3E, 0xC8, 0x02, 0xE3, 0x51, 0xC3, 0x5A, 0xC7, 0xCB, 0xB6, 0x08, 0xB7, + 0x1D, 0xB8, 0x81, 0xC7, 0x90, 0xC8, 0xAA, 0xD3, 0x52, 0xD7, 0x12, 0xCF, + 0xEF, 0xE1, 0xD9, 0xDF, 0x55, 0xF5, 0xFA, 0x04, 0x3D, 0xFC, 0x48, 0xFE, + 0x1A, 0xE0, 0x20, 0xD9, 0x4C, 0xC4, 0x4D, 0xED, 0xFE, 0xB3, 0x91, 0x00, + 0x59, 0xB0, 0xBA, 0xDE, 0xAE, 0xCE, 0x39, 0xDA, 0x21, 0xFF, 0xEA, 0xFD, + 0x74, 0x0A, 0x6C, 0x14, 0x0A, 0xED, 0x14, 0x13, 0xF9, 0xDB, 0xED, 0x03, + 0xEC, 0xD1, 0x6C, 0xEF, 0x9A, 0xB7, 0x4E, 0xC5, 0x0B, 0xAA, 0xA8, 0xA4, + 0x0B, 0xA6, 0x0F, 0xAC, 0x9B, 0xA1, 0xC4, 0xBB, 0x76, 0xB5, 0x94, 0xCB, + 0xA8, 0xD8, 0x88, 0xE1, 0x82, 0xF8, 0x88, 0xFD, 0x6D, 0x0E, 0x83, 0x13, + 0xC5, 0x15, 0xB3, 0x16, 0x84, 0x12, 0xD3, 0x02, 0xB9, 0xFD, 0xEE, 0xDB, + 0xAE, 0xE5, 0x92, 0xBC, 0x90, 0xCF, 0x08, 0xA6, 0xF6, 0xBD, 0x88, 0xA2, + 0x04, 0xCB, 0xDF, 0xB6, 0x88, 0xE9, 0x4C, 0xCD, 0xB8, 0x04, 0x70, 0xEA, + 0x18, 0x11, 0x54, 0xFC, 0xAD, 0x0D, 0x91, 0xF9, 0x3B, 0xF2, 0x7A, 0xD8, + 0xF0, 0xC3, 0x85, 0xBB, 0x1C, 0xAB, 0x1E, 0xC5, 0x00, 0xBA, 0x31, 0xD4, + 0x6F, 0xE5, 0x74, 0xE9, 0x9B, 0x0D, 0x9B, 0xFF, 0xC3, 0x19, 0x3B, 0xFC, + 0xBF, 0x14, 0x4B, 0x03, 0x31, 0x06, 0xAA, 0x1B, 0xBD, 0xD3, 0x02, 0xFD, + 0x99, 0xB4, 0x53, 0xCC, 0x3B, 0xD6, 0x10, 0xCE, 0x0A, 0xF1, 0xBA, 0xD2, + 0x0D, 0xEF, 0xA0, 0xCF, 0x0C, 0xFA, 0x26, 0xF4, 0x88, 0x07, 0x5F, 0x1D, + 0x19, 0xF7, 0x69, 0x11, 0x6A, 0xE8, 0x92, 0x08, 0x89, 0xF8, 0xB6, 0x0A, + 0x19, 0xFD, 0xE5, 0xF2, 0x94, 0xE6, 0x58, 0xCB, 0x0E, 0xDE, 0x65, 0xB1, + 0xAB, 0xD4, 0xE8, 0xAD, 0x35, 0xC9, 0xA2, 0xA6, 0x0F, 0xDA, 0xEA, 0xBD, + 0xF1, 0xFA, 0xB2, 0xF5, 0x82, 0x1A, 0x0C, 0x11, 0x92, 0x24, 0x9E, 0x20, + 0x27, 0x19, 0x19, 0x23, 0x86, 0x06, 0xB1, 0xF8, 0x25, 0xDD, 0xE7, 0xC7, + 0x5D, 0xBC, 0x41, 0xAE, 0x8E, 0xBA, 0x22, 0xA3, 0x25, 0xD3, 0x3E, 0xAB, + 0xA1, 0xFB, 0x7A, 0xCF, 0xB2, 0x1B, 0xE8, 0xFF, 0x06, 0x28, 0x53, 0x0F, + 0x16, 0x15, 0x4C, 0xFB, 0x79, 0xED, 0xD0, 0xE9, 0x8D, 0xB9, 0x45, 0xCE, + 0xB5, 0xAF, 0x36, 0xB7, 0x52, 0xC6, 0x7F, 0xAC, 0x84, 0xCB, 0xE3, 0xB4, + 0x7D, 0xE1, 0xC0, 0xDE, 0x51, 0xFE, 0xAC, 0xFB, 0x4B, 0xFE, 0x9D, 0xFB, + 0x45, 0x07, 0x05, 0x04, 0xF8, 0x16, 0xAB, 0x0C, 0x8F, 0xFC, 0x57, 0xEE, + 0xEF, 0xE3, 0xEA, 0xD6, 0x04, 0xF7, 0x51, 0xF2, 0x36, 0xF8, 0x1B, 0xEA, + 0x26, 0xE6, 0xA2, 0xD3, 0xDA, 0xF3, 0x84, 0x02, 0x55, 0x0C, 0x35, 0x27, + 0x6D, 0x19, 0x9C, 0x22, 0x72, 0x14, 0xBC, 0x12, 0x70, 0xFD, 0x45, 0x14, + 0x3F, 0xE2, 0xC3, 0x07, 0x88, 0xD1, 0xC2, 0xD9, 0x9C, 0xD8, 0x49, 0xCC, + 0x62, 0xEC, 0x2A, 0xDC, 0xE8, 0x09, 0xE5, 0xEE, 0x6C, 0x2D, 0x08, 0x0F, + 0xAB, 0x43, 0xF1, 0x3C, 0xD9, 0x57, 0xC9, 0x56, 0xE0, 0x56, 0x82, 0x47, + 0xA9, 0x30, 0x29, 0x1F, 0xC6, 0x07, 0x64, 0xF9, 0xC4, 0xF2, 0xB6, 0xE7, + 0x38, 0xF0, 0x43, 0xD2, 0x20, 0xF2, 0xE7, 0xBF, 0xE0, 0x06, 0xF9, 0xE3, + 0x21, 0x29, 0x1E, 0x0E, 0xDB, 0x47, 0x05, 0x23, 0xE3, 0x56, 0x67, 0x30, + 0x5E, 0x4B, 0xF8, 0x31, 0x34, 0x2A, 0x4D, 0x1D, 0x3F, 0xFD, 0x9C, 0xF4, + 0x17, 0xEC, 0xC9, 0xE5, 0x74, 0xF7, 0x0D, 0xE3, 0x44, 0x0E, 0x57, 0xE6, + 0x20, 0x2B, 0x68, 0x00, 0x8E, 0x3B, 0xCE, 0x15, 0xE2, 0x28, 0x57, 0x2A, + 0x29, 0x18, 0x23, 0x41, 0x30, 0x19, 0xDC, 0x33, 0xDA, 0x00, 0x01, 0xFF, + 0x80, 0xFF, 0x12, 0xEA, 0x48, 0x1D, 0xBA, 0xFD, 0xE8, 0x1E, 0x27, 0xFF, + 0x7E, 0x1F, 0xE4, 0x19, 0xFD, 0x33, 0x78, 0x46, 0x17, 0x38, 0xB7, 0x42, + 0xA8, 0x25, 0x52, 0x35, 0x89, 0x20, 0x13, 0x32, 0x05, 0x1E, 0x1B, 0x1F, + 0x09, 0xF4, 0x83, 0xFC, 0x92, 0xCA, 0x00, 0xDB, 0xDC, 0xC5, 0x8C, 0xD4, + 0x97, 0xCC, 0x43, 0xE4, 0x48, 0xE1, 0x39, 0x07, 0x07, 0x10, 0x29, 0x33, + 0x2A, 0x45, 0x8C, 0x56, 0x4A, 0x68, 0xDD, 0x60, 0x7F, 0x58, 0x14, 0x47, + 0x10, 0x28, 0x7D, 0x28, 0x44, 0xFE, 0x56, 0x0D, 0x60, 0xDD, 0x9D, 0xEE, + 0x6F, 0xD7, 0x9E, 0xD1, 0x3E, 0xF1, 0x7E, 0xDE, 0xA8, 0x1B, 0x7B, 0x0C, + 0xD6, 0x31, 0x50, 0x10, 0x03, 0x2F, 0x2E, 0x12, 0x8B, 0x2E, 0xDF, 0x21, + 0xC0, 0x26, 0x5F, 0x1B, 0xC2, 0x00, 0x86, 0x03, 0x8F, 0xE7, 0x8C, 0xE4, + 0x03, 0xF6, 0xD2, 0xE1, 0x0C, 0x06, 0x10, 0xDF, 0x14, 0x1B, 0xA1, 0xED, + 0x87, 0x3B, 0x6E, 0x0F, 0x91, 0x41, 0xE3, 0x16, 0x19, 0x2D, 0x95, 0x1E, + 0x24, 0x2C, 0x4C, 0x2C, 0xDF, 0x1B, 0x8F, 0x20, 0x3A, 0xF6, 0x66, 0xFE, + 0x34, 0xFA, 0x0D, 0xF9, 0xD9, 0x04, 0xAD, 0xFB, 0x08, 0xF8, 0x7F, 0xF1, + 0x02, 0xFD, 0xCC, 0x0D, 0xEF, 0x1C, 0x34, 0x3B, 0x7C, 0x29, 0x50, 0x3C, + 0xAC, 0x21, 0x3F, 0x3E, 0x46, 0x1E, 0x14, 0x3D, 0x12, 0x07, 0xF7, 0x1B, + 0x6D, 0xE5, 0xC7, 0xF7, 0x34, 0xD2, 0xF8, 0xD8, 0x95, 0xD3, 0x9B, 0xC7, + 0x46, 0xEE, 0x29, 0xC3, 0x8F, 0x0E, 0x32, 0xDF, 0x4E, 0x21, 0x33, 0x1E, + 0x11, 0x24, 0x0F, 0x48, 0xA7, 0x2A, 0x1A, 0x4F, 0x75, 0x37, 0x55, 0x3F, + 0xC3, 0x2E, 0x33, 0x1E, 0x71, 0x0C, 0x4D, 0xFD, 0x57, 0xE0, 0x63, 0xDA, + 0x67, 0xC7, 0x50, 0xD6, 0x25, 0xDC, 0xD0, 0xEE, 0xCA, 0x0F, 0x6C, 0xFA, + 0x67, 0x32, 0x1F, 0x10, 0x86, 0x3E, 0x62, 0x33, 0xBE, 0x37, 0xE8, 0x40, + 0x5A, 0x18, 0x7B, 0x27, 0xB5, 0xE7, 0x2C, 0x04, 0xC9, 0xCF, 0xE5, 0xF9, + 0xC5, 0xCF, 0xFA, 0xFB, 0x5B, 0xD4, 0x6C, 0x09, 0x69, 0x01, 0xE8, 0x21, + 0x80, 0x2C, 0x5D, 0x42, 0x3E, 0x26, 0xB5, 0x51, 0xB1, 0x20, 0x15, 0x4E, + 0x99, 0x2D, 0x6D, 0x45, 0x83, 0x13, 0x43, 0x1F, 0xBC, 0xFC, 0xE4, 0xFF, + 0x8B, 0x1B, 0xD4, 0x1B, 0x18, 0x27, 0x17, 0x39, 0x56, 0x12, 0xAE, 0x32, + 0x87, 0x26, 0x96, 0x35, 0xB4, 0x49, 0xAF, 0x42, 0xC8, 0x3A, 0x0F, 0x44, + 0x0C, 0x22, 0xE3, 0x40, 0x74, 0x29, 0x51, 0x38, 0x9F, 0x24, 0x0A, 0x1D, + 0x39, 0x00, 0xE5, 0x01, 0x80, 0xEB, 0xC1, 0xF8, 0xB0, 0xEA, 0x6F, 0x01, + 0xBD, 0xF9, 0xF3, 0x07, 0xD2, 0x23, 0xE3, 0x10, 0x31, 0x4B, 0x32, 0x33, + 0x05, 0x60, 0xCA, 0x58, 0xEA, 0x61, 0xFD, 0x5F, 0x59, 0x44, 0x9C, 0x42, + 0x6B, 0x23, 0xAB, 0x1B, 0x67, 0x03, 0xD2, 0xF5, 0xC2, 0xDA, 0x4A, 0xDA, + 0x05, 0xCD, 0xCE, 0xE4, 0xFB, 0xEB, 0x5B, 0x0A, 0xA1, 0x0D, 0xB6, 0x1F, + 0x31, 0x22, 0xA6, 0x39, 0x86, 0x2D, 0xE1, 0x51, 0xE6, 0x1F, 0xC4, 0x38, + 0xD0, 0x09, 0xF6, 0x0E, 0x9A, 0xFA, 0x6C, 0xF4, 0x3D, 0x03, 0xD0, 0xE6, + 0xFF, 0x04, 0xF9, 0xE3, 0x33, 0xFA, 0xA0, 0xF6, 0x3C, 0x0D, 0x79, 0x10, + 0x5F, 0x1C, 0x5B, 0x19, 0x7B, 0x19, 0x38, 0x1B, 0xF1, 0x22, 0x6F, 0x1E, + 0x73, 0x26, 0x03, 0x11, 0xD7, 0x02, 0x54, 0xF3, 0xE1, 0xE2, 0x71, 0xEE, + 0x78, 0xEA, 0xA7, 0x04, 0x99, 0xDF, 0x9B, 0x09, 0x03, 0xD5, 0x98, 0x08, + 0x2D, 0x02, 0xDA, 0x23, 0x14, 0x22, 0x93, 0x30, 0x34, 0x24, 0x45, 0x23, + 0xB0, 0x2A, 0x5C, 0x23, 0x99, 0x1D, 0x26, 0x1F, 0xA8, 0xE5, 0xB8, 0x07, + 0xF9, 0xA6, 0x6B, 0xE4, 0xD6, 0x9F, 0xEA, 0xC9, 0x88, 0xA8, 0x77, 0xC8, + 0x4A, 0xB6, 0x21, 0xD3, 0x78, 0xEB, 0x28, 0xFB, 0xB9, 0x1C, 0x90, 0x24, + 0xDB, 0x28, 0x3F, 0x25, 0x66, 0x16, 0x1C, 0x17, 0xB5, 0x02, 0x08, 0x0E, + 0x31, 0xF7, 0x9F, 0xFB, 0xF0, 0xDD, 0x67, 0xCD, 0xA7, 0xCC, 0xB1, 0xB7, + 0x41, 0xC7, 0x37, 0xC4, 0x9A, 0xCE, 0xB4, 0xCA, 0x16, 0xE1, 0x26, 0xDA, + 0x0E, 0xFE, 0xDD, 0xFA, 0x4E, 0x0A, 0xA9, 0xFE, 0x0A, 0xF5, 0xFD, 0xEB, + 0x67, 0xE4, 0x94, 0xED, 0xDE, 0xCF, 0x8C, 0xD7, 0x4E, 0xC4, 0x04, 0xB0, + 0x4A, 0xCF, 0xC8, 0xAE, 0x5F, 0xDB, 0xB3, 0xD1, 0x5F, 0xDF, 0x73, 0xEF, + 0x32, 0xE8, 0x9E, 0xFC, 0x09, 0xFA, 0xCC, 0x00, 0x5F, 0x18, 0xA0, 0x02, + 0xEC, 0x19, 0xFF, 0xFA, 0xAC, 0xE9, 0x7C, 0xD7, 0x35, 0xCE, 0xDF, 0xC2, + 0x12, 0xDA, 0xB9, 0xE0, 0x0C, 0xD7, 0xD7, 0xE1, 0x8E, 0xC8, 0x05, 0xD3, + 0x4C, 0xDB, 0x42, 0x00, 0x7F, 0xF7, 0x4C, 0x1A, 0x10, 0xF9, 0xF1, 0xF9, + 0x57, 0xFF, 0xD7, 0xE3, 0x27, 0x01, 0x70, 0xE6, 0xAA, 0xD0, 0xE3, 0xC5, + 0x54, 0xA5, 0x3C, 0x9D, 0xA0, 0xB4, 0xA1, 0xAB, 0xE6, 0xC0, 0x35, 0xC1, + 0x7C, 0xBD, 0x65, 0xC7, 0xDC, 0xE6, 0xEA, 0xE3, 0x22, 0x14, 0x38, 0x07, + 0x6A, 0x11, 0xB2, 0x0A, 0x55, 0x03, 0x51, 0xF9, 0xB8, 0xF5, 0x40, 0xE6, + 0x0B, 0xCA, 0x82, 0xC7, 0x63, 0xA4, 0xDB, 0xAC, 0xBC, 0xAA, 0xC5, 0xA3, + 0x1A, 0xB0, 0x0B, 0xAA, 0x19, 0xB1, 0x90, 0xBC, 0xEC, 0xCF, 0x3D, 0xDD, + 0xDB, 0xF6, 0x8B, 0xF5, 0x99, 0xFA, 0x45, 0xF1, 0x0F, 0xF1, 0xC3, 0xF2, + 0x9E, 0xE4, 0xEF, 0xEC, 0xA5, 0xBA, 0x9B, 0xC1, 0x29, 0xA1, 0xFA, 0x9C, + 0x81, 0xAE, 0xF7, 0xA4, 0x2C, 0xC2, 0x22, 0xBF, 0x42, 0xD6, 0xE9, 0xD6, + 0x2C, 0xEA, 0x6F, 0xEF, 0x5B, 0xF1, 0xFA, 0xF9, 0x8B, 0xFC, 0xEC, 0xF4, + 0xD4, 0xF5, 0x65, 0xF1, 0x0B, 0xC6, 0xDE, 0xDB, 0xFB, 0xBD, 0x9D, 0xD2, + 0x21, 0xDD, 0x8E, 0xE8, 0xD0, 0xDA, 0xA1, 0xE8, 0x55, 0xD7, 0xF4, 0xF5, + 0x1A, 0xFA, 0x23, 0x22, 0x26, 0xFD, 0x11, 0x2D, 0xF6, 0xE4, 0x87, 0x16, + 0xC3, 0x02, 0x79, 0x10, 0xC9, 0x1A, 0xBA, 0x0A, 0x1A, 0xF6, 0x14, 0xDD, + 0x17, 0xD7, 0xB0, 0xB1, 0xE7, 0xD4, 0xA6, 0xB7, 0x09, 0xC4, 0xD5, 0xCA, + 0x7F, 0xC6, 0xEA, 0xDE, 0x59, 0xFC, 0xFD, 0x04, 0xAF, 0x2F, 0x0C, 0x2C, + 0x1B, 0x4C, 0xFA, 0x36, 0xDF, 0x54, 0xA3, 0x1D, 0x62, 0x42, 0xF4, 0xFA, + 0x61, 0x19, 0x17, 0xD7, 0x40, 0xEC, 0xA6, 0xBB, 0xCD, 0xD6, 0x95, 0xB4, + 0x51, 0xD2, 0x81, 0xC4, 0xA3, 0xDD, 0x9B, 0xE2, 0xD9, 0xEF, 0x68, 0x04, + 0xB5, 0x0C, 0x98, 0x1C, 0xCF, 0x29, 0xF1, 0x12, 0x9D, 0x2D, 0xC3, 0xFA, + 0x15, 0x1E, 0x4A, 0xE5, 0x40, 0xF9, 0xAF, 0xCE, 0xCA, 0xE9, 0x89, 0xDD, + 0x51, 0xE8, 0xA9, 0xF9, 0x7F, 0xE7, 0x1C, 0xF8, 0xDC, 0x01, 0x2F, 0xFC, + 0x2F, 0x0E, 0xD1, 0x1E, 0xB5, 0x02, 0x3D, 0x27, 0xF1, 0x02, 0x38, 0x0F, + 0xFB, 0x0B, 0x5B, 0x00, 0xEF, 0x00, 0x9D, 0xE0, 0x71, 0xED, 0x14, 0xD6, + 0x87, 0xF2, 0xD2, 0xF8, 0xD7, 0xF3, 0x76, 0x05, 0x3B, 0xFA, 0xA8, 0x06, + 0xC2, 0x18, 0x32, 0x26, 0xC9, 0x18, 0xE2, 0x31, 0xF4, 0x0D, 0xE1, 0x24, + 0xEA, 0x22, 0xAE, 0x16, 0x31, 0x25, 0x28, 0x0F, 0x6C, 0x03, 0xE2, 0xF7, + 0x05, 0xEE, 0xE1, 0xDE, 0xCA, 0xE3, 0x91, 0xDB, 0xA5, 0xCF, 0x89, 0xD6, + 0x59, 0xD9, 0x1F, 0xE1, 0x91, 0x00, 0xCD, 0x09, 0x1E, 0x18, 0x81, 0x30, + 0x33, 0x27, 0xC8, 0x42, 0xAE, 0x30, 0xB8, 0x37, 0xCC, 0x2A, 0x04, 0x17, + 0xCC, 0x10, 0x6A, 0xF4, 0xD6, 0xED, 0x9E, 0xCF, 0x84, 0xD8, 0x05, 0xCC, + 0x30, 0xD0, 0x2E, 0xE5, 0xEE, 0xE1, 0xD3, 0x07, 0xEE, 0xFE, 0x66, 0x1E, + 0xF0, 0x16, 0x62, 0x25, 0x73, 0x27, 0xB3, 0x16, 0x79, 0x28, 0xC4, 0xF2, + 0x8C, 0x1D, 0x4D, 0xDA, 0xE9, 0x00, 0xCA, 0xCA, 0xA6, 0xE4, 0x08, 0xCE, + 0x73, 0xE6, 0x90, 0xE4, 0x70, 0xFF, 0xAE, 0xEA, 0xB5, 0x19, 0x5A, 0xFF, + 0x3A, 0x29, 0xE7, 0x15, 0xB9, 0x22, 0xA4, 0x08, 0x90, 0x1A, 0x8F, 0x01, + 0x4E, 0x16, 0x33, 0x06, 0xB7, 0x01, 0xE3, 0xEE, 0x85, 0xFC, 0x9F, 0xDB, + 0x09, 0x04, 0x7F, 0xF7, 0xFE, 0xE1, 0xDF, 0x02, 0x31, 0xD3, 0xEF, 0x02, + 0xD6, 0x01, 0xBF, 0x1F, 0xC5, 0x1E, 0x96, 0x2A, 0xD0, 0x1C, 0xE2, 0x11, + 0x0B, 0x28, 0x4E, 0x00, 0xB4, 0x29, 0x17, 0xFD, 0x73, 0xFE, 0xC3, 0xE8, + 0xF7, 0xCF, 0xCF, 0xCE, 0x6F, 0xCA, 0xAD, 0xCF, 0x1D, 0xC6, 0x98, 0xD8, + 0xA6, 0xD2, 0xEE, 0xEA, 0x11, 0x10, 0x1B, 0x0E, 0x92, 0x32, 0x68, 0x27, + 0x6D, 0x21, 0x8E, 0x30, 0x05, 0x0C, 0xF4, 0x2A, 0xF0, 0x0D, 0x77, 0x0A, + 0xB3, 0x00, 0x88, 0xD8, 0xD9, 0xE5, 0x46, 0xBE, 0x8F, 0xE4, 0xDB, 0xC4, + 0xC6, 0xDE, 0x10, 0xDB, 0x37, 0xDA, 0xBE, 0xF2, 0x4F, 0xEF, 0xBD, 0x08, + 0x39, 0x16, 0x50, 0x1A, 0x1F, 0x2C, 0x21, 0x1F, 0xBA, 0x14, 0x70, 0x19, + 0xD3, 0xFB, 0xF5, 0x04, 0x38, 0xEB, 0x4F, 0xE4, 0x06, 0xE5, 0x48, 0xCF, + 0x62, 0xE4, 0xCD, 0xD6, 0x5C, 0xDD, 0x09, 0xF2, 0xE5, 0xF6, 0x76, 0x14, + 0x17, 0x17, 0x1C, 0x26, 0x46, 0x1C, 0xEB, 0x1C, 0xBE, 0x26, 0x0F, 0x1D, + 0x9A, 0x20, 0xDC, 0x18, 0x2A, 0xF6, 0xFB, 0xF6, 0xB0, 0xF0, 0x0B, 0xF9, + 0x07, 0x0E, 0x81, 0x1D, 0x4E, 0x09, 0xCA, 0x1E, 0x9C, 0x01, 0x60, 0x21, + 0x28, 0x25, 0x40, 0x37, 0x42, 0x38, 0x6B, 0x36, 0xB9, 0x27, 0xCA, 0x21, + 0x26, 0x2A, 0xFB, 0x11, 0xDB, 0x36, 0xC3, 0x11, 0x42, 0x20, 0x8A, 0xFC, + 0xBB, 0x00, 0xB4, 0xE9, 0xDB, 0xFA, 0xDC, 0xED, 0x4C, 0xFA, 0x89, 0xF4, + 0x12, 0x04, 0xCF, 0x0A, 0xBC, 0x27, 0x18, 0x25, 0x36, 0x4C, 0x5A, 0x48, + 0xED, 0x57, 0xAD, 0x62, 0xCC, 0x47, 0xE7, 0x5A, 0x89, 0x32, 0x42, 0x42, + 0x12, 0x21, 0xE1, 0x1A, 0xE8, 0x0E, 0xAB, 0xF5, 0xBA, 0x11, 0x44, 0xE4, + 0x03, 0x08, 0x83, 0xEF, 0x67, 0xFC, 0x36, 0x11, 0xBD, 0x1C, 0x74, 0x24, + 0x93, 0x42, 0xFE, 0x3C, 0x8A, 0x49, 0x3A, 0x41, 0xF4, 0x3B, 0x1E, 0x28, + 0xA0, 0x35, 0x30, 0x1D, 0x68, 0x1C, 0xA7, 0x0C, 0x13, 0xFE, 0xD7, 0xFB, + 0xEB, 0x03, 0xED, 0x04, 0xB0, 0x0A, 0xC1, 0x22, 0x39, 0x15, 0x57, 0x41, + 0x58, 0x2E, 0xFC, 0x55, 0xBB, 0x2A, 0x2E, 0x5D, 0xD2, 0x22, 0x2C, 0x51, + 0x2A, 0x31, 0x94, 0x38, 0xBC, 0x21, 0xF4, 0x1E, 0x26, 0x11, 0x09, 0x15, + 0xD6, 0x24, 0x71, 0x29, 0xB9, 0x22, 0xC2, 0x3D, 0x1A, 0x15, 0x2D, 0x49, + 0x46, 0x28, 0x13, 0x5C, 0x23, 0x36, 0x6A, 0x61, 0x8C, 0x22, 0xC6, 0x49, + 0xA9, 0x23, 0xB6, 0x34, 0xF5, 0x30, 0xBB, 0x32, 0xDB, 0x0D, 0xEA, 0x1A, + 0x7A, 0xF6, 0x55, 0xF1, 0x21, 0x06, 0x3E, 0xEC, 0x68, 0x08, 0x52, 0xFD, + 0xCB, 0x08, 0xC8, 0x07, 0xC6, 0x27, 0xEE, 0x27, 0x30, 0x53, 0x37, 0x52, + 0x81, 0x5D, 0xD6, 0x5E, 0x9C, 0x5A, 0xF9, 0x4B, 0x14, 0x59, 0xA1, 0x30, + 0x88, 0x38, 0x11, 0x0F, 0x1E, 0x0A, 0x65, 0xF0, 0x5E, 0xF2, 0x46, 0xF0, + 0xE5, 0xF1, 0x3C, 0xFC, 0xAF, 0xFE, 0xB0, 0x15, 0x16, 0x22, 0x70, 0x38, + 0x7F, 0x50, 0x93, 0x49, 0x70, 0x5D, 0x6E, 0x50, 0xDD, 0x48, 0x49, 0x47, + 0xD0, 0x31, 0x35, 0x27, 0xFB, 0x0A, 0x28, 0x08, 0x4B, 0xED, 0x86, 0x08, + 0xAF, 0xFB, 0xE4, 0x20, 0x1C, 0x0D, 0x46, 0x27, 0x03, 0x1D, 0xE1, 0x38, + 0xA7, 0x3B, 0x95, 0x58, 0x98, 0x48, 0xBD, 0x50, 0x07, 0x43, 0xB9, 0x44, + 0xD6, 0x3D, 0xF3, 0x42, 0xB2, 0x1D, 0x17, 0x21, 0xF9, 0x08, 0xDD, 0x11, + 0xB9, 0x25, 0x21, 0x2B, 0x06, 0x33, 0xA4, 0x32, 0x4E, 0x25, 0x7F, 0x28, + 0xBA, 0x31, 0xAA, 0x30, 0x37, 0x49, 0x6C, 0x47, 0xA9, 0x38, 0xC8, 0x3D, + 0xCC, 0x2E, 0xA9, 0x31, 0x43, 0x41, 0x12, 0x31, 0x32, 0x2C, 0xB5, 0x11, + 0x40, 0x06, 0xD3, 0xF5, 0xFF, 0xF3, 0xE6, 0xED, 0xC0, 0xDE, 0xD2, 0xF2, + 0xD5, 0xD7, 0x48, 0x06, 0xD9, 0xEE, 0x70, 0x23, 0x92, 0x26, 0xAF, 0x4D, + 0x29, 0x56, 0x53, 0x5A, 0xFC, 0x59, 0xAF, 0x47, 0xD6, 0x43, 0x0B, 0x32, + 0xED, 0x11, 0xE3, 0x06, 0x81, 0xDC, 0x1B, 0xD9, 0xC3, 0xC4, 0xA1, 0xD0, + 0x63, 0xBD, 0xB9, 0xE0, 0x4E, 0xC9, 0x25, 0xFB, 0x45, 0xE5, 0xE5, 0x17, + 0x82, 0x00, 0x6E, 0x18, 0x26, 0x18, 0x61, 0x0A, 0xB1, 0x17, 0x18, 0x03, + 0x1B, 0x01, 0x04, 0xF6, 0x9A, 0xE0, 0x42, 0xD3, 0x1D, 0xD3, 0x20, 0xD0, + 0xED, 0xDE, 0x9B, 0xED, 0x18, 0xE3, 0x28, 0xED, 0x71, 0xE9, 0xD6, 0xF3, + 0x79, 0xFF, 0xF3, 0x0E, 0x77, 0xFE, 0xD9, 0x03, 0x58, 0xF7, 0xD6, 0xF5, + 0x5A, 0x00, 0xD8, 0x0B, 0xEF, 0xED, 0x67, 0x02, 0x5F, 0xDA, 0x5F, 0xE9, + 0xE4, 0xEA, 0xF2, 0xFE, 0xCA, 0xF7, 0x66, 0x0E, 0xF9, 0xF1, 0x10, 0xFC, + 0xFE, 0xFC, 0x70, 0x06, 0x76, 0x0E, 0x21, 0x21, 0xC1, 0x04, 0x87, 0x21, + 0xB1, 0x03, 0x97, 0x13, 0xD9, 0x0D, 0x70, 0x0A, 0x65, 0xED, 0x86, 0xF0, + 0x32, 0xC3, 0xEA, 0xCA, 0x06, 0xB6, 0x0A, 0xB2, 0xDD, 0xBE, 0x26, 0xB2, + 0x45, 0xCE, 0x59, 0xCB, 0x39, 0xE4, 0x47, 0xE0, 0x02, 0x11, 0xA0, 0x00, + 0x59, 0x2F, 0x8F, 0x1F, 0x03, 0x31, 0x92, 0x1D, 0xDD, 0x27, 0x40, 0x09, + 0x08, 0x07, 0x1D, 0xE8, 0xA8, 0xE0, 0x60, 0xC0, 0x8A, 0xC1, 0xC9, 0xA6, + 0x88, 0xA7, 0xDF, 0xA3, 0xC0, 0xB8, 0x74, 0xBA, 0x6C, 0xDB, 0xAD, 0xD6, + 0x45, 0xF0, 0x00, 0xE7, 0x76, 0x00, 0xD8, 0xF4, 0xA7, 0x05, 0xAE, 0xF5, + 0xA8, 0xED, 0x6C, 0xE2, 0x01, 0xBC, 0x93, 0xC1, 0x45, 0xAE, 0xE2, 0xBB, + 0x78, 0xBB, 0xE1, 0xCF, 0x91, 0xC1, 0xC0, 0xD3, 0x1F, 0xDE, 0x9B, 0xE9, + 0xD1, 0xF5, 0x82, 0x0F, 0xE6, 0xEA, 0xC5, 0x0A, 0x15, 0xEF, 0x47, 0xFE, + 0x61, 0x04, 0x1A, 0xFD, 0x27, 0xED, 0xD2, 0xE2, 0x7E, 0xBA, 0x28, 0xCE, + 0x85, 0xB2, 0xAE, 0xDD, 0xB2, 0xBA, 0x06, 0xEC, 0xBF, 0xB9, 0x2D, 0xDF, + 0x2F, 0xD4, 0x85, 0xF8, 0x9E, 0xF7, 0xC6, 0x1E, 0x71, 0xFD, 0xA9, 0x12, + 0xD7, 0xFD, 0x0A, 0x08, 0xA0, 0x01, 0x7E, 0x06, 0xC8, 0xF0, 0x22, 0xF1, + 0xF5, 0xD1, 0x36, 0xD2, 0xFE, 0xB2, 0x1E, 0xB5, 0x32, 0xA5, 0xF7, 0xB0, + 0x16, 0xAE, 0xBC, 0xC6, 0x29, 0xCF, 0x24, 0xDE, 0x89, 0x07, 0x86, 0xF5, + 0x8D, 0x29, 0xED, 0x03, 0x74, 0x27, 0x8A, 0x0B, 0x11, 0x1B, 0x8D, 0x06, + 0x7D, 0xFD, 0x1A, 0xF2, 0x58, 0xDE, 0xC4, 0xDC, 0xDC, 0xD4, 0x69, 0xC2, + 0x5A, 0xD1, 0x2C, 0xB6, 0xB8, 0xD9, 0xF0, 0xC3, 0x4B, 0xED, 0xE6, 0xDF, + 0x8B, 0xF7, 0xA8, 0xF6, 0xBD, 0xFE, 0xD5, 0xFC, 0x05, 0x0C, 0x59, 0xFC, + 0x7E, 0x0D, 0x71, 0xEB, 0x6C, 0xE7, 0x84, 0xCB, 0x3C, 0xC5, 0xA4, 0xC5, + 0x50, 0xCB, 0xFB, 0xCE, 0x53, 0xD3, 0xE7, 0xD0, 0x51, 0xE8, 0x91, 0xE4, + 0x62, 0x08, 0x5F, 0x0D, 0x58, 0x03, 0x8A, 0x10, 0x24, 0xF6, 0x41, 0xF7, + 0x08, 0x01, 0xFB, 0xF7, 0x17, 0xF8, 0x8B, 0xE1, 0xD2, 0xDB, 0x8E, 0xC3, + 0x33, 0xE5, 0x7E, 0xDD, 0x80, 0xEC, 0x64, 0xF9, 0x35, 0xD6, 0xEE, 0xE6, + 0x3F, 0xE1, 0xD4, 0xE7, 0x34, 0xF7, 0xC9, 0x01, 0x88, 0xF3, 0x4D, 0xEE, + 0x72, 0xFD, 0x3C, 0xDB, 0xFC, 0x10, 0x3D, 0xE9, 0xE8, 0x08, 0xE5, 0xE8, + 0xE2, 0xE3, 0xDA, 0xDB, 0x41, 0xC2, 0x06, 0xD6, 0xD4, 0xBA, 0x6D, 0xD0, + 0x7F, 0xCA, 0xE3, 0xC4, 0x8C, 0xEA, 0x3E, 0xCB, 0x01, 0x0D, 0xCD, 0xEB, + 0x36, 0x29, 0x8B, 0x09, 0x14, 0x32, 0x49, 0x0D, 0x48, 0x1D, 0x40, 0xF4, + 0xC2, 0xF5, 0x75, 0xDF, 0x0D, 0xCA, 0x08, 0xE0, 0x8F, 0xAA, 0xE5, 0xD5, + 0xE5, 0xA6, 0x1C, 0xCA, 0xFF, 0xBF, 0xFE, 0xD0, 0xDF, 0xDF, 0xBF, 0xEB, + 0x64, 0xEF, 0x4A, 0x02, 0x23, 0xF6, 0x82, 0x0A, 0xD1, 0xF5, 0x08, 0x0F, + 0x27, 0xED, 0x44, 0x00, 0x5E, 0xD6, 0x4B, 0xDE, 0x64, 0xC2, 0xF8, 0xD1, + 0xFE, 0xCC, 0xC2, 0xD7, 0x7F, 0xD3, 0x10, 0xCC, 0x71, 0xE3, 0xE4, 0xCA, + 0xED, 0xFC, 0xC8, 0xE8, 0xD9, 0xF1, 0x11, 0xF8, 0x17, 0xE7, 0x73, 0xE9, + 0x69, 0x01, 0xB3, 0xEC, 0x6E, 0x0B, 0x61, 0xEA, 0x43, 0xE7, 0x44, 0xCD, + 0xFB, 0xE3, 0x7E, 0xD3, 0xC9, 0xF2, 0x8A, 0xF1, 0xE5, 0xD2, 0x55, 0xE7, + 0xE9, 0xDB, 0xA1, 0xDF, 0x68, 0x11, 0xC7, 0xF9, 0x06, 0x25, 0x9D, 0xFC, + 0x1B, 0x1F, 0xEC, 0xEB, 0x1D, 0x11, 0x10, 0xE9, 0x12, 0x08, 0x66, 0xE5, + 0x34, 0xEC, 0xE6, 0xD1, 0x80, 0xC6, 0x8C, 0xB1, 0xB8, 0xBC, 0x24, 0xAF, + 0x79, 0xC4, 0x56, 0xD0, 0x09, 0xE0, 0xAA, 0xEF, 0x83, 0x0A, 0xAE, 0x0A, + 0xDC, 0x30, 0x2E, 0x1F, 0x5F, 0x37, 0x01, 0x27, 0x2A, 0x15, 0x55, 0x1A, + 0x23, 0xFD, 0x81, 0xFB, 0x81, 0xF7, 0x61, 0xDC, 0x64, 0xE4, 0xF4, 0xC2, + 0x9A, 0xD2, 0x3A, 0xB9, 0x75, 0xDE, 0x54, 0xBF, 0xD9, 0xFD, 0x80, 0xD1, + 0xA2, 0x05, 0xC3, 0xE9, 0xA3, 0xFE, 0xB7, 0xFB, 0x49, 0x06, 0x38, 0x0D, + 0x4F, 0x13, 0xC8, 0x0E, 0x05, 0x09, 0x66, 0xF4, 0x40, 0xE9, 0xAE, 0xDE, + 0x3D, 0xE0, 0x05, 0xE4, 0x07, 0xDC, 0xE1, 0xE8, 0x61, 0xE2, 0x4B, 0xF3, + 0x9D, 0x0E, 0x5B, 0x0A, 0x6D, 0x27, 0xCF, 0x0E, 0x85, 0x1E, 0x15, 0x0C, + 0xE0, 0x1A, 0x87, 0x19, 0xC1, 0x04, 0xA4, 0x12, 0xDC, 0xDC, 0x50, 0xF0, + 0x03, 0xE2, 0xCD, 0xFD, 0x45, 0xF2, 0xBF, 0x1C, 0x7E, 0xD9, 0x7C, 0x12, + 0xD8, 0xE5, 0x2B, 0x16, 0x75, 0x1F, 0x60, 0x2E, 0xEB, 0x32, 0xF4, 0x26, + 0x2A, 0x22, 0xAC, 0x18, 0x8A, 0x15, 0xAD, 0x1B, 0xAF, 0x13, 0x3A, 0x0B, + 0x27, 0x07, 0x5E, 0xE2, 0xE4, 0xFA, 0x65, 0xC5, 0xC3, 0xF9, 0xF6, 0xC5, + 0xF6, 0xF5, 0x3D, 0xDD, 0xFA, 0xFE, 0x2F, 0xF6, 0xAE, 0x18, 0x70, 0x12, + 0x38, 0x2F, 0x9C, 0x36, 0xA9, 0x40, 0xAE, 0x3E, 0xBA, 0x45, 0x1C, 0x2B, + 0x4B, 0x43, 0x56, 0x10, 0x5A, 0x33, 0xA2, 0xF8, 0xD9, 0x0B, 0x96, 0xED, + 0xE6, 0xEF, 0x00, 0xEC, 0xBC, 0xED, 0xE1, 0xF0, 0x2F, 0x04, 0x69, 0x09, + 0x8F, 0x29, 0xD3, 0x29, 0x57, 0x4C, 0xFB, 0x3E, 0x1A, 0x60, 0x06, 0x43, + 0xAB, 0x49, 0xC3, 0x35, 0xA4, 0x17, 0x74, 0x19, 0xFF, 0xF4, 0x11, 0xFD, + 0x7F, 0xF0, 0x2C, 0xFD, 0x9D, 0xFE, 0xEE, 0x0D, 0xEB, 0x0E, 0xC2, 0x28, + 0x17, 0x2E, 0x8A, 0x47, 0x41, 0x48, 0x71, 0x47, 0x37, 0x47, 0x4A, 0x34, + 0x2F, 0x49, 0x2C, 0x2E, 0x1A, 0x35, 0xF1, 0x1D, 0x03, 0x09, 0x90, 0xF4, + 0x3E, 0x10, 0x95, 0xFE, 0x3E, 0x27, 0xC8, 0x32, 0x61, 0x10, 0x61, 0x2A, + 0x5D, 0x0D, 0x33, 0x27, 0xB7, 0x37, 0xD0, 0x46, 0xEC, 0x4B, 0xC6, 0x38, + 0xE3, 0x39, 0x3E, 0x1B, 0xB6, 0x32, 0x3C, 0x1D, 0x3F, 0x36, 0x4C, 0x24, + 0xEA, 0x1C, 0x8C, 0x08, 0xAF, 0x07, 0x8F, 0xE1, 0xF1, 0x0D, 0x1C, 0xDF, + 0x4D, 0x04, 0x87, 0xF0, 0x2B, 0xF6, 0x18, 0x08, 0xE2, 0x0F, 0x95, 0x2C, + 0xA8, 0x3F, 0xFE, 0x4E, 0x8A, 0x5E, 0x87, 0x50, 0x9D, 0x5B, 0x75, 0x39, + 0xB2, 0x40, 0xA2, 0x2A, 0xA7, 0x16, 0xD8, 0x14, 0x41, 0xE9, 0xDC, 0xF8, + 0xB9, 0xDA, 0x71, 0xED, 0x16, 0xE5, 0xB3, 0xF4, 0xD9, 0xFD, 0xC2, 0x0D, + 0xE9, 0x22, 0x88, 0x20, 0xF4, 0x3E, 0x1B, 0x2B, 0x58, 0x5A, 0x1D, 0x38, + 0xD1, 0x59, 0x7F, 0x3B, 0xEA, 0x31, 0x30, 0x2F, 0x45, 0x0C, 0xD4, 0x11, + 0x84, 0xF9, 0xA6, 0x05, 0x91, 0xF5, 0x7C, 0x0C, 0xF0, 0xF5, 0xC3, 0x17, + 0x85, 0x0E, 0x97, 0x37, 0xF4, 0x30, 0x9B, 0x4A, 0xBD, 0x3A, 0x9B, 0x3B, + 0x64, 0x47, 0xC2, 0x2D, 0x94, 0x3A, 0x5D, 0x2F, 0x45, 0x02, 0xB3, 0x1F, + 0xB4, 0xF3, 0xA2, 0x13, 0xE6, 0x1A, 0x12, 0x2E, 0xDD, 0x2C, 0x1D, 0x29, + 0xEB, 0x24, 0x92, 0x28, 0xB7, 0x37, 0xB2, 0x59, 0x55, 0x51, 0x6A, 0x5B, + 0x1F, 0x51, 0xBD, 0x30, 0x39, 0x4E, 0x37, 0x1A, 0x49, 0x42, 0x61, 0x0F, + 0xC6, 0x18, 0xC5, 0xF9, 0x29, 0xF5, 0xD5, 0xDE, 0x53, 0xE6, 0xDC, 0xDC, + 0xF6, 0xE1, 0x64, 0xEA, 0xC2, 0xE9, 0x5A, 0xF9, 0xCF, 0x03, 0xD2, 0x0F, + 0x89, 0x2E, 0xF5, 0x27, 0xC7, 0x4B, 0x00, 0x32, 0x16, 0x4D, 0xC8, 0x2D, + 0x7C, 0x42, 0xAA, 0x26, 0x4B, 0x1E, 0xAF, 0x13, 0xB8, 0xE9, 0xA9, 0xFD, + 0xDA, 0xCE, 0xDA, 0xEB, 0xCB, 0xCC, 0x63, 0xDD, 0x86, 0xDB, 0x8C, 0xDA, + 0xC2, 0xF7, 0xD9, 0xE3, 0xBC, 0x08, 0x39, 0x01, 0xF3, 0x1A, 0x36, 0x2F, + 0xEF, 0x22, 0x9C, 0x3A, 0x19, 0x0E, 0x74, 0x29, 0x58, 0xFB, 0x3F, 0x15, + 0x52, 0xE7, 0x96, 0x00, 0x5A, 0xE3, 0x15, 0xF6, 0xD4, 0xF1, 0xB6, 0xF8, + 0xAB, 0x0A, 0xA2, 0x09, 0x24, 0x24, 0x8F, 0x1E, 0xD4, 0x1A, 0xC2, 0x1E, + 0xB7, 0x13, 0x92, 0x19, 0x65, 0x11, 0x56, 0x1F, 0x6D, 0xE4, 0x5F, 0x0F, + 0x03, 0xC9, 0xB5, 0xFA, 0xF2, 0xE7, 0xB4, 0x0F, 0x7E, 0x09, 0xD1, 0x1B, + 0xC6, 0x05, 0x81, 0x12, 0xC3, 0x0E, 0x92, 0x31, 0x6D, 0x26, 0x82, 0x4E, + 0x38, 0x21, 0xCD, 0x3B, 0x14, 0x2E, 0x2F, 0x27, 0x9B, 0x3D, 0x3B, 0x22, + 0xFA, 0x1E, 0x05, 0x0A, 0xDA, 0xF9, 0xF4, 0xE9, 0x6F, 0xDC, 0x29, 0xDC, + 0x6F, 0xC9, 0x07, 0xDC, 0x1C, 0xD1, 0xC9, 0xE3, 0x30, 0xDE, 0x60, 0xFD, + 0xA2, 0xFE, 0x33, 0x23, 0x2B, 0x35, 0xCC, 0x39, 0x1B, 0x54, 0x5D, 0x3E, + 0xB2, 0x4A, 0x15, 0x32, 0xE7, 0x23, 0xC6, 0x19, 0xF2, 0xF3, 0xB4, 0x01, + 0x78, 0xDE, 0x8F, 0xE5, 0xF3, 0xDF, 0xE4, 0xD3, 0x3A, 0xED, 0xAE, 0xD8, + 0xE1, 0x0C, 0x9F, 0xED, 0x05, 0x2D, 0xE6, 0x09, 0x5B, 0x40, 0xAF, 0x1D, + 0xF2, 0x30, 0x0D, 0x1A, 0x01, 0x0E, 0xC0, 0x09, 0xF5, 0xEF, 0x00, 0xFD, + 0x3F, 0xC8, 0x4D, 0xEF, 0x58, 0xC4, 0x21, 0xE6, 0x10, 0xE8, 0xD9, 0xEA, + 0x9B, 0x04, 0xEB, 0xFE, 0x74, 0x18, 0x8A, 0x15, 0x51, 0x17, 0xF2, 0x21, + 0x5C, 0x0B, 0x7B, 0x25, 0xB6, 0x08, 0x3B, 0x1F, 0x47, 0x03, 0x35, 0x05, + 0x54, 0xF1, 0xE9, 0xDB, 0xF6, 0xEE, 0x5B, 0xDF, 0x4E, 0xFA, 0xEB, 0x00, + 0x3F, 0xDB, 0x09, 0x00, 0x2A, 0xD4, 0xE4, 0x08, 0xDB, 0x03, 0xB2, 0x2D, + 0x7D, 0x0C, 0x2D, 0x32, 0x7B, 0x14, 0x0A, 0x15, 0xCA, 0x36, 0xB2, 0x04, + 0xF2, 0x29, 0x6A, 0xF8, 0x58, 0xE9, 0xF0, 0xD1, 0x41, 0xB7, 0x3B, 0xB6, + 0x8A, 0xAE, 0x5A, 0xBA, 0x14, 0xB3, 0xE2, 0xC3, 0xA2, 0xC6, 0x20, 0xD9, + 0xC5, 0xEC, 0x02, 0xFE, 0x84, 0x08, 0xE0, 0x1A, 0x93, 0x0C, 0x83, 0x22, + 0x0C, 0x04, 0x1B, 0x1A, 0x9B, 0xF5, 0x99, 0x05, 0xF6, 0xCC, 0xE8, 0xE1, + 0x45, 0xA8, 0x77, 0xC0, 0xDA, 0xA4, 0xAD, 0xB9, 0xF9, 0xB1, 0x56, 0xB1, + 0x43, 0xC8, 0x4D, 0xB5, 0x22, 0xDA, 0x10, 0xDF, 0x0F, 0xF6, 0xB1, 0x00, + 0xAC, 0x08, 0x4E, 0x0D, 0x0B, 0xFC, 0x77, 0x0C, 0x2B, 0xE0, 0x3E, 0xF0, + 0x28, 0xB5, 0x4B, 0xCB, 0xF5, 0xA8, 0x7C, 0xC1, 0x7D, 0xBD, 0x37, 0xC7, + 0x8A, 0xCB, 0xE5, 0xD0, 0x01, 0xE4, 0x21, 0xE9, 0xDB, 0xF8, 0x76, 0xF6, + 0xDE, 0x01, 0xC8, 0xE8, 0x99, 0x08, 0x21, 0xDC, 0x01, 0x0C, 0xDE, 0xDF, + 0xF1, 0xF1, 0x42, 0xCF, 0x00, 0xDA, 0x31, 0xC6, 0xD0, 0xFE, 0x28, 0xED, + 0x66, 0x07, 0x5B, 0xF5, 0xCA, 0xF3, 0x7E, 0xEE, 0x5D, 0x0C, 0x1F, 0x05, + 0x16, 0x16, 0x87, 0x06, 0xF4, 0x0C, 0x41, 0xF6, 0x86, 0x15, 0x25, 0xF1, + 0xB5, 0x1C, 0xE3, 0xF3, 0xF6, 0xFF, 0x6C, 0xE3, 0x44, 0xCC, 0xED, 0xD0, + 0xA4, 0xBD, 0xD8, 0xD0, 0x0F, 0xC5, 0x75, 0xD0, 0x7D, 0xD6, 0x3C, 0xE1, + 0x88, 0xFB, 0x28, 0xFC, 0x33, 0x22, 0xAC, 0x18, 0xB2, 0x41, 0xB6, 0x32, + 0x47, 0x48, 0x26, 0x31, 0x0A, 0x32, 0x4A, 0x1A, 0x8E, 0x09, 0x44, 0xF7, + 0xA4, 0xE5, 0x5B, 0xDA, 0x69, 0xC9, 0x6D, 0xD6, 0xB6, 0xBF, 0xFB, 0xD8, + 0x84, 0xE5, 0xB0, 0xE9, 0x0A, 0x0A, 0xBE, 0x05, 0xB2, 0x1B, 0x14, 0x15, + 0xDD, 0x21, 0xA4, 0x19, 0x52, 0x13, 0x95, 0x15, 0xDE, 0x00, 0x96, 0x05, + 0xAE, 0xD7, 0xA0, 0xE4, 0x2E, 0xCB, 0xD4, 0xD8, 0x88, 0xE0, 0xBC, 0xEF, + 0x9A, 0xDD, 0x1C, 0xFF, 0xDB, 0xE8, 0x9F, 0x0A, 0xCE, 0xFF, 0x19, 0x18, + 0x8E, 0x00, 0xC2, 0x09, 0xDE, 0xFB, 0x75, 0xF2, 0xA4, 0x0C, 0x56, 0xF8, + 0x22, 0x05, 0x52, 0xF7, 0x73, 0xE0, 0xC9, 0xED, 0xB4, 0xE0, 0x7F, 0xFE, + 0x03, 0xEE, 0x68, 0xF8, 0x24, 0xF4, 0xDA, 0xE1, 0xF3, 0x0B, 0x8B, 0xEB, + 0x3D, 0x28, 0x44, 0xFF, 0x55, 0x2F, 0x94, 0xFF, 0xCE, 0x20, 0xDB, 0xF3, + 0x36, 0x0A, 0x38, 0xEA, 0x47, 0xE7, 0x81, 0xCD, 0x06, 0xBF, 0xC5, 0xA9, + 0x9A, 0xA4, 0xB4, 0x9D, 0xCD, 0xA3, 0xBE, 0xA7, 0x44, 0xBB, 0x54, 0xC0, + 0xE8, 0xD9, 0x64, 0xDB, 0x02, 0xF6, 0x88, 0x04, 0xF8, 0x09, 0x55, 0x20, + 0xC3, 0x19, 0xE3, 0x10, 0x01, 0x1A, 0xFD, 0xFD, 0x60, 0xFF, 0xD6, 0xE6, + 0x99, 0xD8, 0x02, 0xC4, 0xA1, 0xBC, 0xEF, 0xB4, 0x20, 0xB2, 0x20, 0xB0, + 0xFB, 0xB5, 0xEA, 0xB2, 0x0C, 0xCA, 0xF5, 0xC9, 0x1F, 0xE2, 0x2C, 0xE3, + 0xF6, 0xEA, 0x6A, 0xF8, 0x56, 0xEA, 0x1C, 0x05, 0xC7, 0xEB, 0xF2, 0xF4, + 0x3D, 0xD7, 0x4D, 0xD0, 0xD2, 0xBB, 0x1F, 0xB4, 0x1E, 0xB8, 0xC1, 0xAC, + 0xBE, 0xBD, 0x71, 0xA9, 0xA4, 0xD3, 0x8B, 0xB8, 0x39, 0xF6, 0x4D, 0xE7, + 0x44, 0x02, 0xC4, 0xF0, 0x85, 0xFE, 0xD5, 0xDB, 0x2C, 0x04, 0x36, 0xE0, + 0x96, 0xF0, 0xE9, 0xCB, 0xCE, 0xCA, 0x1A, 0xB1, 0x11, 0xD0, 0x8B, 0xD6, + 0xA2, 0xD3, 0x56, 0xEE, 0x8C, 0xC1, 0x7C, 0xD9, 0x11, 0xE2, 0xBF, 0xEB, + 0xB3, 0x0B, 0xF7, 0x08, 0x6B, 0x02, 0x89, 0xFD, 0xF9, 0xF5, 0x17, 0xED, + 0x87, 0x04, 0xCE, 0xDF, 0xB8, 0x04, 0x93, 0xD5, 0x21, 0xDD, 0x9F, 0xCD, + 0x97, 0xB3, 0xFC, 0xC0, 0x17, 0xA8, 0x43, 0xBE, 0x18, 0xAE, 0x9F, 0xC8, + 0x73, 0xCF, 0x47, 0xDD, 0x8F, 0xFC, 0x01, 0xFC, 0x2A, 0x0D, 0x5B, 0x15, + 0x34, 0x1C, 0x56, 0x19, 0x29, 0x28, 0x9F, 0x14, 0xF2, 0x17, 0x52, 0x05, + 0xEB, 0xF9, 0x5B, 0xE7, 0x14, 0xE1, 0x8B, 0xCC, 0x88, 0xD6, 0x20, 0xBC, + 0xE3, 0xD6, 0x47, 0xC6, 0x17, 0xEF, 0x05, 0xEB, 0xA8, 0x08, 0x67, 0x08, + 0x40, 0x10, 0x1F, 0x1D, 0x28, 0x0A, 0xA3, 0x1F, 0x30, 0xF2, 0x17, 0x17, + 0xBF, 0xDA, 0xA6, 0x00, 0xD3, 0xD6, 0x22, 0xE9, 0x41, 0xDC, 0xF8, 0xF4, + 0xDE, 0xDA, 0x02, 0xFA, 0x8A, 0xFC, 0xE2, 0xFC, 0x37, 0x33, 0xF5, 0x23, + 0x45, 0x35, 0x5B, 0x3A, 0x04, 0x29, 0x10, 0x35, 0x8E, 0x33, 0xD9, 0x39, + 0xEA, 0x29, 0xB9, 0x25, 0x09, 0x16, 0xE9, 0xFC, 0x60, 0x15, 0x5D, 0x02, + 0xF9, 0x0E, 0x56, 0x12, 0x95, 0xFD, 0x06, 0x06, 0x87, 0x11, 0xAC, 0x10, + 0x18, 0x37, 0xF7, 0x2D, 0x47, 0x3C, 0x98, 0x30, 0x18, 0x30, 0x41, 0x28, + 0x43, 0x2F, 0xB1, 0x21, 0x10, 0x2D, 0x69, 0x00, 0xE1, 0x17, 0x92, 0xDC, + 0x3B, 0x00, 0xCF, 0xD0, 0x9D, 0xF3, 0xE7, 0xC9, 0xC9, 0xE9, 0xC8, 0xCE, + 0x83, 0xEB, 0x8D, 0xEF, 0x7F, 0x0E, 0x59, 0x13, 0x2E, 0x3D, 0x0C, 0x23, + 0xD6, 0x4E, 0xB9, 0x25, 0x0D, 0x3B, 0x55, 0x24, 0xF4, 0x24, 0xF8, 0x18, + 0xA1, 0x0D, 0x12, 0x05, 0x52, 0xEB, 0x6A, 0xE8, 0xB6, 0xD6, 0x34, 0xCE, + 0xE7, 0xD5, 0xA3, 0xD1, 0xBF, 0xF0, 0x66, 0xEA, 0x54, 0x0F, 0x53, 0xFD, + 0xA7, 0x17, 0x34, 0x1F, 0x0D, 0x19, 0x63, 0x34, 0x56, 0x10, 0x52, 0x31, + 0x58, 0xF2, 0xA8, 0x1E, 0x7A, 0xDB, 0x41, 0xFD, 0x81, 0xE6, 0xA1, 0xFC, + 0x43, 0xED, 0xED, 0x09, 0xC2, 0xF8, 0x59, 0x19, 0x8E, 0x2B, 0x0E, 0x34, + 0x1F, 0x42, 0x99, 0x3B, 0x91, 0x2D, 0x77, 0x2F, 0xDA, 0x31, 0x1D, 0x33, + 0xA2, 0x33, 0x7F, 0x33, 0xA9, 0x12, 0xDA, 0x16, 0x1A, 0x05, 0x5E, 0x11, + 0x19, 0x12, 0xF4, 0x25, 0x85, 0x0B, 0x91, 0x21, 0xC7, 0x05, 0x99, 0x1D, + 0x38, 0x21, 0xA8, 0x32, 0x39, 0x32, 0x5B, 0x3B, 0x4F, 0x2C, 0x8E, 0x27, + 0xAD, 0x32, 0xE0, 0x2C, 0xEA, 0x31, 0x46, 0x2E, 0x30, 0x1B, 0xC6, 0xFF, + 0x3F, 0xFB, 0x6C, 0xD9, 0xED, 0xDF, 0x09, 0xDB, 0x7B, 0xE3, 0xC1, 0xEF, + 0x55, 0xFC, 0x9E, 0xF6, 0x71, 0x19, 0xD4, 0x04, 0x7B, 0x3C, 0xBD, 0x2A, + 0x30, 0x4C, 0x35, 0x43, 0xB1, 0x3B, 0x38, 0x3D, 0x73, 0x31, 0x98, 0x19, + 0x5F, 0x29, 0x16, 0xEE, 0xBD, 0x09, 0xD4, 0xD7, 0x1C, 0xE8, 0xEA, 0xD7, + 0xEB, 0xD6, 0x9C, 0xEA, 0x48, 0xE1, 0xCF, 0xFB, 0xB3, 0x03, 0x40, 0x0B, + 0x27, 0x20, 0xBC, 0x29, 0xA5, 0x27, 0x18, 0x3D, 0x7E, 0x1D, 0x51, 0x33, + 0x73, 0xFF, 0x77, 0x0D, 0xA7, 0xD8, 0x14, 0xDE, 0xE4, 0xD8, 0x69, 0xD2, + 0xD3, 0xF9, 0x7E, 0xE3, 0xDA, 0x03, 0xE8, 0xF9, 0x7F, 0x11, 0x3B, 0x1C, + 0xA2, 0x29, 0xDB, 0x2A, 0x9E, 0x20, 0x38, 0x1E, 0xB7, 0x17, 0x3F, 0x26, + 0xAF, 0x18, 0x82, 0x2D, 0x98, 0x0A, 0x03, 0x07, 0x29, 0x07, 0x0F, 0xF0, + 0xF4, 0x0D, 0xA5, 0x0A, 0xB3, 0xF9, 0xD1, 0x13, 0x7E, 0xF0, 0x41, 0x0F, + 0xDF, 0x1B, 0x42, 0x20, 0x3A, 0x2C, 0xC2, 0x22, 0xE9, 0x20, 0xA7, 0x0D, + 0x0C, 0x29, 0xDF, 0x04, 0x0E, 0x1C, 0x7F, 0x09, 0x31, 0xF0, 0x9E, 0xFC, + 0x39, 0xD6, 0x2D, 0xE5, 0x78, 0xE7, 0x73, 0xEA, 0x0D, 0xF4, 0xBE, 0xFE, + 0xDE, 0xE6, 0xB1, 0x08, 0x7A, 0xED, 0x83, 0x1A, 0x1C, 0x15, 0x90, 0x3A, + 0x66, 0x39, 0xBF, 0x44, 0xD5, 0x37, 0x6A, 0x35, 0x9D, 0x25, 0x3A, 0x26, + 0xA2, 0xFF, 0xA9, 0x04, 0xCB, 0xCC, 0x4C, 0xD9, 0xC4, 0xC7, 0xF1, 0xCE, + 0x97, 0xD4, 0x61, 0xE5, 0x60, 0xE3, 0xC7, 0x02, 0x54, 0x07, 0xBD, 0x23, + 0xF3, 0x33, 0x81, 0x37, 0xFB, 0x40, 0x2A, 0x35, 0x86, 0x26, 0x26, 0x2C, + 0x1F, 0x0F, 0x7E, 0x14, 0x65, 0xF9, 0x40, 0xE7, 0x2A, 0xF0, 0xB9, 0xD9, + 0x01, 0x08, 0x75, 0xFA, 0xAF, 0x15, 0x84, 0x0F, 0xC3, 0x22, 0x5D, 0x25, + 0xBA, 0x3B, 0xB2, 0x3D, 0x54, 0x40, 0x41, 0x2E, 0x4F, 0x4A, 0x47, 0x1B, + 0xDC, 0x4F, 0x80, 0x1C, 0x7C, 0x1B, 0x0D, 0x09, 0x34, 0xEB, 0x87, 0x0C, + 0xB2, 0x08, 0xA4, 0x3C, 0x76, 0x1D, 0x92, 0x4F, 0xD6, 0x08, 0xB2, 0x3A, + 0x06, 0x22, 0x9A, 0x45, 0xD8, 0x51, 0xDC, 0x54, 0x9A, 0x4B, 0x06, 0x3C, + 0xC8, 0x3A, 0xA3, 0x2A, 0x00, 0x34, 0xB6, 0x2E, 0x62, 0x0D, 0x94, 0x18, + 0xF7, 0xE9, 0x04, 0xEA, 0x84, 0xF4, 0xBD, 0xD7, 0x7C, 0x00, 0x3A, 0xE2, + 0x15, 0xF3, 0xDE, 0xF9, 0xE2, 0x09, 0x02, 0x22, 0x6E, 0x47, 0x70, 0x4D, + 0x09, 0x6C, 0x49, 0x56, 0xB7, 0x62, 0x00, 0x47, 0x03, 0x46, 0x54, 0x3A, + 0x70, 0x23, 0x12, 0x29, 0x5C, 0xF6, 0x5D, 0x01, 0xCB, 0xD1, 0xD5, 0xE1, + 0xBD, 0xD1, 0xC0, 0xDD, 0xD6, 0xEE, 0xF4, 0xF0, 0xC6, 0x08, 0xD1, 0x15, + 0x48, 0x1B, 0x37, 0x3A, 0x4E, 0x32, 0xBF, 0x44, 0x4D, 0x33, 0x25, 0x40, + 0xB9, 0x08, 0xFE, 0x31, 0xAF, 0xDF, 0x45, 0x10, 0xE7, 0xDB, 0x98, 0xFA, + 0xCC, 0xEE, 0xF6, 0xFC, 0x41, 0xFD, 0x4D, 0x0B, 0xC6, 0x0A, 0x51, 0x1D, + 0xC4, 0x1C, 0xAE, 0x33, 0x61, 0x16, 0x95, 0x25, 0xA0, 0x0D, 0x12, 0x10, + 0xCD, 0x19, 0xB3, 0x14, 0x36, 0x04, 0xB2, 0xF9, 0x6F, 0xE0, 0x00, 0xDD, + 0xFD, 0xE9, 0xF3, 0xF4, 0xFE, 0xF6, 0x1C, 0x00, 0xF9, 0xEB, 0x75, 0xF2, + 0x69, 0x00, 0x6F, 0x0B, 0x7F, 0x31, 0x34, 0x22, 0x84, 0x3A, 0x15, 0x04, + 0x27, 0x2C, 0x05, 0xF3, 0x22, 0x2A, 0x34, 0x01, 0x27, 0x10, 0x0A, 0xE9, + 0x4F, 0xE5, 0x83, 0xCB, 0x4E, 0xD2, 0xB4, 0xCC, 0x24, 0xCF, 0x25, 0xCB, + 0xC9, 0xD6, 0xB6, 0xD0, 0x12, 0xEE, 0x40, 0xF3, 0x75, 0x09, 0xC5, 0x1D, + 0x8D, 0x1B, 0x06, 0x2F, 0x96, 0x31, 0xAE, 0x28, 0x7A, 0x36, 0x85, 0x26, + 0x72, 0xFF, 0x88, 0x19, 0xE9, 0xBD, 0x0B, 0xF8, 0x33, 0xAB, 0x9C, 0xDD, + 0x81, 0xB5, 0x55, 0xD8, 0x23, 0xD0, 0x1C, 0xE5, 0xF7, 0xF4, 0x0B, 0xF0, + 0x03, 0x09, 0x85, 0x0D, 0xC9, 0x08, 0x50, 0x2A, 0x21, 0xFD, 0x84, 0x1A, + 0xF8, 0xF0, 0x4B, 0xF7, 0x4E, 0xE1, 0x0E, 0xD0, 0x38, 0xD2, 0xFC, 0xB5, + 0x1D, 0xCB, 0x6C, 0xB6, 0x09, 0xCB, 0x76, 0xC8, 0xA4, 0xE2, 0x57, 0xE8, + 0xA6, 0xFD, 0x1A, 0x01, 0x40, 0x06, 0xC3, 0x05, 0xE6, 0x15, 0xCB, 0x05, + 0xF2, 0x13, 0x0D, 0x03, 0x17, 0xE9, 0x00, 0xE8, 0x2A, 0xCB, 0xD9, 0xCB, + 0xF9, 0xD4, 0xC5, 0xD8, 0x21, 0xD7, 0xC9, 0xD9, 0xFF, 0xCF, 0xAB, 0xBF, + 0x79, 0xF1, 0xB0, 0xD8, 0x2C, 0xFE, 0x0E, 0x05, 0x9E, 0xEA, 0x9B, 0x05, + 0xFA, 0xFE, 0x15, 0x00, 0x91, 0x15, 0x2B, 0xF6, 0xBA, 0xFC, 0xFC, 0xC9, + 0x37, 0xD1, 0x30, 0xA9, 0x2D, 0xB0, 0x3E, 0xA9, 0xF8, 0x9F, 0xFF, 0xB2, + 0x23, 0xA1, 0xD9, 0xC5, 0x64, 0xC3, 0x43, 0xE8, 0x05, 0xFE, 0xED, 0x0A, + 0xB8, 0x1D, 0xF9, 0x1C, 0xD1, 0x19, 0x52, 0x22, 0x41, 0x09, 0xEA, 0x0A, + 0xAA, 0xE8, 0xE2, 0xDB, 0xE9, 0xBA, 0x0F, 0xBA, 0xD0, 0xA2, 0x31, 0xB2, + 0x5C, 0xA5, 0xBE, 0xB7, 0x0B, 0xB7, 0x1A, 0xC7, 0x2C, 0xD1, 0x13, 0xDD, + 0x10, 0xF4, 0xA6, 0xFF, 0xE0, 0x05, 0x21, 0x1C, 0x56, 0xF6, 0xAC, 0x10, + 0xF9, 0xDE, 0xCE, 0xE6, 0x96, 0xBE, 0xB5, 0xB3, 0x12, 0xB4, 0x79, 0xA1, + 0xE0, 0xBA, 0x98, 0xA3, 0xB7, 0xB8, 0x69, 0xA6, 0x8D, 0xD3, 0xA8, 0xC7, + 0x0E, 0xE9, 0x1E, 0xEC, 0xBF, 0xDF, 0x59, 0xF3, 0xEF, 0xF0, 0x85, 0xEA, + 0xAF, 0x10, 0xBE, 0xD7, 0x38, 0xF4, 0x48, 0xC3, 0x22, 0xC6, 0x82, 0xC8, + 0xE5, 0xDA, 0xBB, 0xE9, 0x7C, 0xE2, 0xCD, 0xEF, 0xDD, 0xC7, 0xEA, 0xDB, + 0x83, 0xDD, 0x6A, 0xE8, 0x6F, 0xFE, 0x11, 0xFC, 0xC1, 0x00, 0xE7, 0xE9, + 0xF4, 0x04, 0x2D, 0xD1, 0xA2, 0x0F, 0x6A, 0xCD, 0x1C, 0xFC, 0x5A, 0xC3, + 0x24, 0xC8, 0x11, 0xAD, 0x84, 0xA0, 0x0A, 0x9F, 0x43, 0x9E, 0x2A, 0xA6, + 0x47, 0xB3, 0xA2, 0xB8, 0x73, 0xCC, 0x15, 0xD9, 0xA4, 0xF9, 0xA7, 0x0C, + 0x80, 0x22, 0x8E, 0x25, 0x4F, 0x1F, 0xD8, 0x1E, 0x60, 0x0D, 0x1F, 0x13, + 0xE7, 0xF8, 0xDC, 0xF1, 0x35, 0xD7, 0xF9, 0xC1, 0x46, 0xB4, 0xDF, 0xA8, + 0x07, 0xA8, 0x98, 0xAB, 0x0D, 0xC5, 0x88, 0xBD, 0x97, 0xE8, 0x3B, 0xE6, + 0xA1, 0xFB, 0x5B, 0x0A, 0x67, 0x04, 0x97, 0x12, 0xE2, 0xFC, 0xE4, 0x0F, + 0xF0, 0xEB, 0x9E, 0xFE, 0xD0, 0xD2, 0x1F, 0xE6, 0x9E, 0xCA, 0xDB, 0xD9, + 0x2D, 0xCE, 0x0E, 0xD7, 0xC9, 0xC2, 0x1B, 0xE3, 0xDD, 0xCD, 0x94, 0x03, + 0x1E, 0xEF, 0xF1, 0x0A, 0xBC, 0x00, 0x45, 0xF1, 0xDF, 0x06, 0x97, 0xF3, + 0xBD, 0x08, 0x85, 0x01, 0xC5, 0xF6, 0x26, 0xEF, 0x50, 0xE5, 0x9B, 0xEE, + 0xE3, 0xF2, 0x3A, 0x03, 0x58, 0xE9, 0x24, 0xFF, 0xB5, 0xD8, 0x01, 0xF2, + 0x15, 0xF8, 0xD0, 0x06, 0xAB, 0x20, 0xB9, 0x1A, 0x84, 0x2C, 0xD1, 0x0B, + 0x6E, 0x29, 0x5C, 0x02, 0x7D, 0x2D, 0x98, 0x03, 0x8D, 0x1E, 0x4B, 0xF0, + 0x24, 0xEF, 0xCE, 0xC0, 0x09, 0xCC, 0xA2, 0xA6, 0x26, 0xCD, 0x56, 0xB5, + 0xFD, 0xE1, 0x0D, 0xC7, 0x1E, 0x05, 0x32, 0xD7, 0x49, 0x3B, 0x79, 0x0C, + 0xAA, 0x5A, 0x3D, 0x3D, 0x8A, 0x48, 0x0C, 0x33, 0xF5, 0x30, 0x7A, 0x1D, + 0x2A, 0x21, 0x7F, 0x15, 0xAD, 0x0C, 0xDC, 0xF0, 0xC0, 0xF9, 0x02, 0xD4, + 0x2E, 0xEC, 0x08, 0xD3, 0xE6, 0xE4, 0x5B, 0xDB, 0xBE, 0xEE, 0x3F, 0xF8, + 0x11, 0x08, 0x42, 0x1D, 0x85, 0x18, 0xF9, 0x34, 0x37, 0x15, 0x47, 0x34, + 0xE0, 0x0D, 0xE7, 0x21, 0x04, 0x02, 0x86, 0x01, 0xEA, 0xF2, 0xEF, 0xF4, + 0xD0, 0xED, 0x23, 0x00, 0x5E, 0xE9, 0x12, 0x08, 0xEB, 0xF8, 0xF4, 0x1B, + 0x52, 0x21, 0xD9, 0x2F, 0x85, 0x36, 0x37, 0x2D, 0xE8, 0x39, 0x7C, 0x2F, + 0xF7, 0x47, 0xC5, 0x34, 0x0D, 0x38, 0x32, 0x1D, 0x03, 0x1A, 0x34, 0x09, + 0xCC, 0x1B, 0x2F, 0x1F, 0x05, 0x10, 0xDA, 0x1E, 0x52, 0x06, 0x0A, 0x0B, + 0x32, 0x2D, 0x9E, 0x29, 0x1B, 0x53, 0x79, 0x40, 0xCD, 0x46, 0xF1, 0x2F, + 0x54, 0x3B, 0x11, 0x37, 0x53, 0x3E, 0xF3, 0x3E, 0x62, 0x1B, 0x1B, 0x1F, + 0x10, 0xF2, 0xB8, 0xFA, 0x74, 0xF0, 0xA1, 0xF1, 0x01, 0x02, 0x93, 0xF2, + 0x2A, 0x03, 0xDF, 0xF7, 0xB1, 0x04, 0xED, 0x0D, 0xCB, 0x23, 0x22, 0x2F, + 0x95, 0x35, 0x96, 0x58, 0x38, 0x34, 0xFB, 0x5F, 0xBC, 0x2F, 0x79, 0x4D, + 0xF4, 0x22, 0x61, 0x2D, 0xE5, 0x15, 0x4D, 0xFA, 0xA9, 0xFE, 0x61, 0xE3, + 0xAA, 0xEC, 0x68, 0xDC, 0x4B, 0xF1, 0x3F, 0xDF, 0xEA, 0x02, 0x20, 0xF5, + 0x60, 0x1D, 0xE8, 0x1C, 0x45, 0x32, 0xB1, 0x43, 0xB2, 0x35, 0x67, 0x3A, + 0x75, 0x1B, 0xA2, 0x0E, 0xFB, 0xFF, 0x79, 0xE5, 0x7C, 0x04, 0x94, 0xDF, + 0xA2, 0x02, 0x55, 0xE7, 0x14, 0xFB, 0x4D, 0xE5, 0x47, 0x0A, 0xE3, 0x04, + 0x29, 0x21, 0x58, 0x21, 0x56, 0x22, 0xA7, 0x23, 0x92, 0x37, 0x19, 0x26, + 0xB1, 0x57, 0x90, 0x10, 0xB6, 0x32, 0xEE, 0xED, 0x9E, 0x08, 0x92, 0xFD, + 0x9A, 0x04, 0x12, 0x2A, 0xC6, 0xF7, 0xE8, 0x16, 0x74, 0xFA, 0x27, 0xFF, + 0xD7, 0x15, 0x26, 0x28, 0x7C, 0x20, 0x33, 0x28, 0x21, 0x18, 0xFE, 0xFD, + 0x8B, 0x14, 0x48, 0x01, 0xDC, 0x13, 0x72, 0x05, 0xF3, 0xF6, 0xF3, 0xE7, + 0x39, 0xD4, 0xC4, 0xCE, 0x31, 0xCD, 0x84, 0xCA, 0x6F, 0xD6, 0x96, 0xC5, + 0xB0, 0xDD, 0x2F, 0xE3, 0xB0, 0xEE, 0x39, 0x1D, 0x2B, 0x13, 0xD5, 0x29, + 0x62, 0x2F, 0xE6, 0x2A, 0xA3, 0x3B, 0x82, 0x2D, 0x04, 0x29, 0xD3, 0x1A, + 0xD0, 0xFE, 0xAC, 0xF9, 0x22, 0xE6, 0x69, 0xCF, 0x63, 0xD9, 0xAF, 0xB9, + 0x2B, 0xCE, 0xBF, 0xC4, 0x97, 0xC3, 0x4D, 0xDB, 0x8F, 0xCC, 0x49, 0xF0, + 0x72, 0xEF, 0x43, 0x0C, 0xCF, 0x05, 0x4D, 0x27, 0xD5, 0x12, 0x4E, 0x1F, + 0xD9, 0xFF, 0x2D, 0x01, 0x94, 0xD0, 0xE6, 0xEB, 0xD7, 0xC9, 0x8A, 0xDD, + 0xD8, 0xD2, 0x72, 0xD1, 0xEB, 0xCC, 0x65, 0xE2, 0x39, 0xE4, 0x7E, 0x0B, + 0xB6, 0x08, 0x33, 0x09, 0x26, 0x0F, 0x51, 0xFD, 0xC7, 0x1B, 0x60, 0x09, + 0x54, 0x29, 0x12, 0xFB, 0xDD, 0x05, 0x2C, 0xE1, 0xF6, 0xEA, 0x4B, 0xEF, + 0x87, 0xF4, 0xAB, 0x04, 0x04, 0xE9, 0x44, 0xF9, 0xE0, 0xEF, 0x48, 0xFF, + 0x1C, 0x24, 0x98, 0x24, 0x1D, 0x36, 0xD7, 0x29, 0x3F, 0x24, 0xC3, 0x1E, + 0x9E, 0x29, 0x3D, 0x35, 0x88, 0x2B, 0xC3, 0x32, 0xD7, 0x12, 0xED, 0x0D, + 0x52, 0xFD, 0x91, 0xEE, 0x5D, 0xF4, 0xCC, 0xD8, 0x80, 0xE3, 0x97, 0xD5, + 0x8B, 0xE0, 0xC3, 0xED, 0x59, 0x04, 0xA5, 0x1F, 0xA8, 0x2A, 0xA3, 0x49, + 0xCA, 0x4B, 0xF0, 0x5D, 0xF0, 0x60, 0xC6, 0x59, 0x9E, 0x54, 0x27, 0x4A, + 0xBB, 0x2A, 0x2C, 0x33, 0x06, 0xFE, 0xBD, 0x04, 0xB5, 0xE8, 0xBC, 0xEC, + 0xBB, 0xE9, 0xA1, 0xF3, 0xDE, 0xFC, 0x28, 0xFC, 0x99, 0x1B, 0xBA, 0x0F, + 0x27, 0x39, 0x41, 0x26, 0x61, 0x45, 0x72, 0x31, 0xC6, 0x30, 0xD9, 0x2C, + 0xFF, 0x0C, 0xA8, 0x20, 0xB2, 0xF1, 0x80, 0x12, 0xF2, 0xE8, 0x74, 0x01, + 0xEA, 0xE7, 0x30, 0x00, 0xAB, 0xF1, 0x6E, 0x19, 0x85, 0x1E, 0x44, 0x33, + 0x5C, 0x35, 0xD3, 0x29, 0x7C, 0x23, 0xEC, 0x14, 0x19, 0x31, 0x25, 0x20, + 0x75, 0x3B, 0x08, 0x25, 0x82, 0x0D, 0x55, 0x06, 0x09, 0x00, 0x4E, 0x05, + 0x05, 0x19, 0xD1, 0x1C, 0xA2, 0x06, 0x68, 0x0F, 0x49, 0x01, 0x58, 0x08, + 0xF7, 0x25, 0xD8, 0x1E, 0xD3, 0x23, 0xF0, 0x24, 0x59, 0x0D, 0x3B, 0x23, + 0x2A, 0x1C, 0xED, 0x36, 0xF6, 0x29, 0x41, 0x2F, 0x8C, 0x16, 0x64, 0x03, + 0x17, 0xFB, 0x2E, 0xF0, 0x1F, 0xED, 0x9B, 0xEE, 0x8E, 0xE9, 0x1F, 0xEF, + 0x16, 0xFF, 0xA5, 0x02, 0xF8, 0x25, 0x10, 0x2C, 0xEF, 0x3C, 0x49, 0x4A, + 0xA1, 0x4A, 0xB2, 0x53, 0x17, 0x49, 0x2F, 0x54, 0xEC, 0x27, 0x40, 0x3B, + 0x1A, 0x02, 0x44, 0x13, 0x34, 0xE4, 0x87, 0xFA, 0xA0, 0xCB, 0x1F, 0xF5, + 0xAD, 0xD5, 0x83, 0xF3, 0xED, 0xFC, 0x07, 0x01, 0x81, 0x17, 0x7F, 0x23, + 0xCB, 0x2A, 0x65, 0x43, 0x1D, 0x3C, 0x3E, 0x57, 0x2E, 0x2D, 0x6F, 0x4B, + 0x36, 0x09, 0xE2, 0x1A, 0x83, 0xF7, 0x40, 0xFE, 0x9D, 0xE9, 0x90, 0xF5, + 0xA3, 0xD4, 0x2F, 0xDD, 0x3B, 0xEC, 0xBB, 0xE5, 0xCC, 0x1F, 0xF1, 0x0C, + 0x74, 0x28, 0xFE, 0x11, 0x2E, 0x20, 0xE0, 0x12, 0xFB, 0x26, 0x13, 0x21, + 0xA5, 0x10, 0xB3, 0x01, 0x42, 0xF0, 0xE1, 0xDB, 0x27, 0x02, 0x92, 0xF8, + 0xA4, 0x0A, 0x1F, 0x04, 0xA3, 0xF2, 0xC9, 0xD7, 0xC5, 0xFB, 0x06, 0xDC, + 0xF4, 0x10, 0x41, 0x05, 0xA0, 0x0B, 0xA2, 0x0A, 0xC9, 0x00, 0xDF, 0x03, + 0xB4, 0x02, 0xFB, 0x07, 0x38, 0xFD, 0x02, 0xF4, 0x1D, 0xE6, 0x68, 0xD6, + 0xED, 0xCA, 0x7B, 0xCA, 0x1D, 0xB5, 0xDF, 0xB7, 0x00, 0xAA, 0x0C, 0xBA, + 0xD4, 0xBD, 0x1A, 0xE9, 0xFB, 0xF5, 0xED, 0x1A, 0x5C, 0x2B, 0x48, 0x39, + 0x06, 0x3D, 0x43, 0x42, 0x76, 0x32, 0xC1, 0x35, 0x84, 0x09, 0xD2, 0x16, + 0x30, 0xD0, 0x0A, 0xF4, 0xD9, 0xB3, 0xB7, 0xD6, 0x78, 0xAF, 0xDA, 0xBB, + 0x51, 0xBE, 0xFD, 0xBD, 0xA0, 0xDA, 0xD9, 0xDD, 0x6F, 0xEE, 0x61, 0x00, + 0xE5, 0xF4, 0xFF, 0x1B, 0xD6, 0xF0, 0xBD, 0x25, 0xB4, 0xE1, 0x83, 0x08, + 0xEF, 0xD3, 0x61, 0xDF, 0xA6, 0xE0, 0x6D, 0xDC, 0x22, 0xE7, 0x23, 0xE0, + 0xC9, 0xD5, 0x3E, 0xD5, 0x9D, 0xE4, 0x59, 0xEA, 0xF3, 0xFF, 0xE1, 0xFD, + 0x83, 0xF1, 0x32, 0xE7, 0x2D, 0xF5, 0xB9, 0xE7, 0x24, 0x0B, 0xA8, 0xF7, + 0x17, 0xE3, 0x6D, 0xDA, 0xFD, 0xC1, 0x6A, 0xCA, 0x8B, 0xE4, 0x9B, 0xE9, + 0x12, 0xE8, 0x63, 0xEE, 0x7E, 0xCB, 0xBA, 0xDF, 0x6C, 0xE5, 0xFF, 0xFD, + 0x4C, 0x02, 0x56, 0x17, 0x19, 0xF7, 0xA8, 0x05, 0x85, 0x06, 0x69, 0x02, + 0x03, 0x25, 0xBA, 0x08, 0x80, 0x13, 0xEA, 0xEC, 0x8F, 0xEA, 0x2C, 0xC6, + 0xB3, 0xD9, 0xC4, 0xC2, 0xDB, 0xD4, 0x3F, 0xCB, 0xE8, 0xD2, 0x52, 0xD2, + 0x85, 0xF7, 0xC1, 0xF4, 0xA9, 0x29, 0xE6, 0x11, 0x85, 0x3E, 0x08, 0x18, + 0x62, 0x3B, 0x1A, 0x1E, 0x50, 0x1D, 0x28, 0x20, 0x40, 0xF1, 0x98, 0x0B, + 0xFE, 0xD7, 0xE2, 0xEB, 0x2C, 0xD4, 0x31, 0xD4, 0xC5, 0xDB, 0xB6, 0xC8, + 0xEC, 0xEC, 0xDF, 0xD2, 0xA4, 0xFB, 0xD7, 0xEC, 0x2D, 0x0B, 0x21, 0x08, + 0x8F, 0x1C, 0x3A, 0x1B, 0x31, 0x18, 0x97, 0x22, 0xC9, 0xF5, 0x4C, 0x12, + 0xC4, 0xDA, 0x9A, 0xF5, 0x81, 0xDA, 0x06, 0xEB, 0x1F, 0xD1, 0x48, 0xDE, + 0xB8, 0xD2, 0x9E, 0xD9, 0xFF, 0x05, 0xB1, 0x01, 0xAA, 0x21, 0x49, 0x13, + 0x1C, 0x11, 0x40, 0x00, 0xBA, 0x17, 0x7A, 0x0D, 0xBA, 0x15, 0xBB, 0x13, + 0x3F, 0xF3, 0xBD, 0xF2, 0x1E, 0xF7, 0xB5, 0xEC, 0xCD, 0x12, 0x8F, 0x01, + 0x05, 0xFE, 0x68, 0xFB, 0x53, 0xEA, 0x29, 0x01, 0x6B, 0xFD, 0xC8, 0x27, + 0x28, 0xFA, 0xA6, 0x23, 0xAB, 0xF0, 0x8A, 0xFC, 0x55, 0x10, 0x70, 0xFA, + 0x7B, 0x1D, 0xA4, 0xFF, 0x9F, 0xF9, 0x68, 0xEB, 0x34, 0xDF, 0x14, 0xE1, + 0xD7, 0xD6, 0x9D, 0xDF, 0x5B, 0xD2, 0x29, 0xDD, 0x4A, 0xEA, 0x9D, 0xF5, + 0x3C, 0x12, 0x3E, 0x15, 0x95, 0x39, 0xF2, 0x24, 0xAB, 0x53, 0xAB, 0x2F, + 0x06, 0x4D, 0x0E, 0x38, 0xA2, 0x23, 0x48, 0x2B, 0x3C, 0xE9, 0xCE, 0xFC, + 0x7D, 0xC7, 0xCC, 0xCF, 0xAA, 0xBF, 0x24, 0xBA, 0x00, 0xCD, 0x76, 0xC5, + 0x9F, 0xE7, 0xC5, 0xE4, 0xB6, 0x05, 0xEF, 0x01, 0xF4, 0x24, 0xDC, 0x16, + 0x03, 0x2F, 0x80, 0x1C, 0xA6, 0x1E, 0x66, 0x14, 0x13, 0xFE, 0xBA, 0xFA, + 0xAD, 0xF0, 0xCC, 0xED, 0x6B, 0xFB, 0xFE, 0xF3, 0xAE, 0x00, 0x01, 0xEB, + 0xA9, 0x16, 0x5F, 0xF1, 0xDE, 0x21, 0x91, 0xFF, 0xD8, 0x01, 0x85, 0xF6, + 0x00, 0xF2, 0xFF, 0xFA, 0x0D, 0xFF, 0x58, 0x09, 0x20, 0xF1, 0x22, 0xF0, + 0x7C, 0xE0, 0xAF, 0xDA, 0x24, 0xF9, 0x77, 0xFB, 0xB6, 0xFB, 0xD2, 0x01, + 0x5B, 0xE9, 0x51, 0xE3, 0xD1, 0xFA, 0x26, 0xE7, 0x73, 0x05, 0xE0, 0xF4, + 0xEF, 0xF4, 0x96, 0xF1, 0x7E, 0xFC, 0x9E, 0xFC, 0xF7, 0x10, 0xCF, 0x04, + 0xA9, 0x00, 0x38, 0xE5, 0x94, 0xDE, 0x9E, 0xC0, 0x03, 0xC9, 0x41, 0xB7, + 0xE8, 0xB5, 0xAE, 0xAE, 0x1C, 0xC0, 0xBA, 0xB2, 0x78, 0xEE, 0x65, 0xCF, + 0x89, 0x1E, 0x11, 0xF3, 0xC7, 0x36, 0x80, 0x11, 0x6B, 0x2E, 0x2A, 0x22, + 0x54, 0x0F, 0x07, 0x21, 0x97, 0xD6, 0x20, 0xFE, 0x43, 0xAE, 0xC1, 0xDC, + 0xF0, 0xAA, 0x98, 0xCC, 0x33, 0xB3, 0x68, 0xBA, 0x54, 0xC9, 0x42, 0xBF, + 0xD9, 0xDA, 0xE3, 0xE1, 0xA6, 0xD8, 0xC9, 0x04, 0xFA, 0xD4, 0x3A, 0x17, + 0x5A, 0xD8, 0x3C, 0x0C, 0xDE, 0xD6, 0xBB, 0xDE, 0x4C, 0xCE, 0x22, 0xB3, + 0x9C, 0xCD, 0x53, 0xB1, 0x00, 0xCB, 0xA2, 0xC1, 0xEE, 0xCE, 0xA7, 0xCD, + 0xF2, 0xF3, 0x83, 0xE3, 0xFD, 0x11, 0x41, 0xED, 0xAF, 0x0F, 0x83, 0xE8, + 0x7F, 0x0C, 0x6C, 0xF8, 0x5E, 0xF3, 0xDB, 0xF4, 0x64, 0xCB, 0xFC, 0xCF, + 0xCB, 0xD3, 0xE0, 0xCA, 0xC0, 0xE3, 0xF6, 0xCF, 0x00, 0xD4, 0x80, 0xC4, + 0x81, 0xE0, 0x88, 0xD7, 0xBE, 0x04, 0xF0, 0xFB, 0xC3, 0x0A, 0x84, 0x00, + 0x8B, 0x0A, 0xD8, 0x04, 0xBB, 0x13, 0x1A, 0x13, 0x65, 0x05, 0x51, 0x02, + 0x0F, 0xDE, 0x3D, 0xDC, 0x5E, 0xC5, 0xE6, 0xCB, 0x92, 0xBA, 0xD1, 0xC8, + 0x61, 0xB9, 0xFE, 0xC4, 0x46, 0xF0, 0xEB, 0xE2, 0xEF, 0x2B, 0xF8, 0x06, + 0x92, 0x30, 0xF8, 0x16, 0x12, 0x27, 0x2E, 0x32, 0xFE, 0x13, 0x4F, 0x41, + 0xEA, 0xE2, 0x84, 0x16, 0xF7, 0xBD, 0xC9, 0xDA, 0x99, 0xC4, 0xEB, 0xBE, + 0x48, 0xCD, 0x45, 0xB1, 0x73, 0xCE, 0xF1, 0xB0, 0x00, 0xEA, 0xD9, 0xD7, + 0x23, 0x0E, 0xC9, 0x03, 0x9E, 0x21, 0xBA, 0x12, 0xF0, 0x22, 0xF6, 0x15, + 0x87, 0x04, 0xAD, 0x0C, 0xBB, 0xD9, 0x58, 0xF2, 0xB5, 0xC8, 0xA7, 0xD6, + 0xFC, 0xCD, 0x44, 0xC8, 0xF8, 0xD9, 0xFE, 0xC4, 0x92, 0xF7, 0x3A, 0xD0, + 0x15, 0x12, 0xDC, 0xE5, 0xAB, 0x15, 0x20, 0xF5, 0x2A, 0x23, 0xEA, 0x09, + 0x45, 0x21, 0xD5, 0x13, 0x2C, 0xF5, 0x42, 0xFA, 0x54, 0xEC, 0x2C, 0xF9, + 0x4C, 0x00, 0xFE, 0x0E, 0x1F, 0xE5, 0x89, 0x02, 0x38, 0xD7, 0x08, 0xFC, + 0x32, 0xFE, 0x1D, 0x1B, 0x1B, 0x13, 0xB9, 0x27, 0x5E, 0x18, 0xAB, 0x1F, + 0x41, 0x2B, 0x84, 0x26, 0x92, 0x1C, 0xE7, 0x1D, 0x4C, 0xEC, 0x7F, 0xFF, + 0x73, 0xD6, 0xA5, 0xF1, 0x6B, 0xDA, 0x38, 0xF3, 0x70, 0xD8, 0x1E, 0xE9, + 0xBC, 0xFE, 0x2B, 0xF3, 0xB8, 0x3B, 0xAC, 0x1E, 0xD3, 0x4A, 0x9F, 0x39, + 0xB2, 0x49, 0xA5, 0x43, 0x96, 0x45, 0x6F, 0x4E, 0x78, 0x1D, 0x8F, 0x34, + 0x45, 0xEA, 0x1E, 0x0A, 0xDD, 0xD9, 0xEA, 0xF5, 0x51, 0xD4, 0x38, 0xEF, + 0x20, 0xD4, 0x82, 0xED, 0x24, 0xE9, 0x35, 0xFF, 0xA9, 0x11, 0x36, 0x2D, + 0x6A, 0x40, 0x82, 0x43, 0xB4, 0x53, 0xCD, 0x31, 0xBF, 0x3F, 0xD3, 0x20, + 0xF2, 0x12, 0x61, 0x14, 0x7D, 0xF8, 0x13, 0x0D, 0xC4, 0xF7, 0x07, 0x0D, + 0x18, 0xF7, 0xB7, 0x08, 0xD7, 0x12, 0xF9, 0x0C, 0xC6, 0x32, 0x6F, 0x17, + 0xA5, 0x33, 0xE2, 0x1D, 0x77, 0x3A, 0xDE, 0x20, 0xF5, 0x3C, 0x4F, 0x22, + 0x9A, 0x14, 0xCE, 0x09, 0x11, 0xEE, 0xE2, 0xFA, 0x63, 0xFA, 0xF8, 0x0C, + 0xB6, 0x03, 0xC5, 0x07, 0x30, 0x13, 0x68, 0xFD, 0x6E, 0x4B, 0x1A, 0x1D, + 0x53, 0x5F, 0x26, 0x3B, 0x02, 0x4A, 0x9F, 0x28, 0xC1, 0x4C, 0x2F, 0x19, + 0x5F, 0x46, 0x23, 0x18, 0xC6, 0x12, 0x98, 0x01, 0xDA, 0xE8, 0x01, 0xF1, + 0x6C, 0xDF, 0xE2, 0xF7, 0x58, 0xD6, 0xE1, 0xF5, 0x91, 0xEC, 0xE5, 0xFA, + 0x05, 0x25, 0x2F, 0x17, 0x6C, 0x49, 0x05, 0x33, 0xB4, 0x5B, 0xB5, 0x42, + 0xD7, 0x62, 0x5A, 0x55, 0xBA, 0x4C, 0x92, 0x5E, 0x97, 0x1D, 0xA7, 0x41, + 0xAE, 0xF3, 0xF9, 0x1B, 0xE8, 0xD8, 0x6D, 0x10, 0x05, 0xD6, 0xDA, 0x11, + 0x44, 0xEF, 0x4F, 0x12, 0xC2, 0x0F, 0x40, 0x27, 0xB4, 0x34, 0x22, 0x49, + 0x0D, 0x4A, 0x8D, 0x4D, 0xDF, 0x40, 0x81, 0x3F, 0x9C, 0x2A, 0x4A, 0x35, + 0x36, 0x11, 0xAA, 0x25, 0x82, 0xFA, 0xE8, 0x17, 0xA3, 0xF2, 0x89, 0x17, + 0xB3, 0x13, 0x66, 0x2C, 0x16, 0x3F, 0xE1, 0x3C, 0xB1, 0x44, 0x56, 0x36, + 0x84, 0x41, 0x66, 0x35, 0x39, 0x40, 0x52, 0x3A, 0x2A, 0x23, 0xED, 0x1E, + 0xDC, 0x07, 0x0E, 0x08, 0xEE, 0x10, 0xF4, 0x1C, 0x64, 0x0E, 0xB5, 0x28, + 0xDB, 0x03, 0x70, 0x1E, 0xD0, 0x26, 0xFC, 0x31, 0x89, 0x44, 0x5B, 0x44, + 0xE3, 0x43, 0x72, 0x28, 0x03, 0x55, 0x91, 0x21, 0x13, 0x5E, 0x18, 0x30, + 0x10, 0x41, 0x71, 0x1A, 0xC6, 0x1B, 0x4C, 0xFF, 0x97, 0x01, 0xE8, 0xF9, + 0xCE, 0xE5, 0x67, 0xEC, 0x4A, 0xE3, 0x5E, 0xE9, 0x3E, 0x1A, 0x15, 0x08, + 0x03, 0x4F, 0x5A, 0x26, 0xDA, 0x5C, 0x96, 0x35, 0xE1, 0x51, 0x02, 0x44, + 0x3B, 0x32, 0x48, 0x44, 0x77, 0x08, 0x84, 0x26, 0x85, 0xE5, 0x50, 0xFF, + 0xFD, 0xD6, 0xE3, 0xEA, 0xD3, 0xD4, 0xC9, 0xE8, 0x36, 0xE2, 0xE7, 0xEE, + 0x6C, 0x08, 0xF9, 0x07, 0x1A, 0x30, 0x87, 0x29, 0xB8, 0x36, 0xD1, 0x33, + 0x12, 0x18, 0xDC, 0x1E, 0x7C, 0xEF, 0x62, 0x06, 0xC8, 0xCE, 0x47, 0xFD, + 0xC0, 0xC1, 0x18, 0xED, 0x1B, 0xCA, 0xBC, 0xD9, 0x74, 0xE1, 0x28, 0xE8, + 0xE9, 0x04, 0xA7, 0xFD, 0xC3, 0x0F, 0x0B, 0xF9, 0x5A, 0x10, 0x3F, 0xFB, + 0x27, 0x1C, 0x6B, 0x0E, 0xEF, 0x06, 0xBD, 0xF9, 0x2D, 0xE8, 0xF6, 0xD9, + 0x5A, 0xED, 0xEA, 0xE8, 0x15, 0xE6, 0xF0, 0xE0, 0x90, 0xC9, 0x11, 0xC9, + 0xF0, 0xDB, 0xE9, 0xF1, 0xAB, 0x02, 0xC8, 0x1D, 0xF7, 0x0D, 0xF2, 0x0B, + 0xD3, 0x25, 0x43, 0x03, 0x28, 0x36, 0x14, 0x09, 0xDC, 0xFE, 0x7C, 0xEA, + 0x4F, 0xBC, 0x8F, 0xD1, 0x06, 0xA8, 0x71, 0xD3, 0x0F, 0xA5, 0x32, 0xC9, + 0x3D, 0xB2, 0x46, 0xCB, 0x40, 0xDD, 0x16, 0xF3, 0x4B, 0x07, 0xFE, 0x12, + 0x6C, 0x16, 0x60, 0x21, 0x58, 0x1C, 0xA3, 0x2F, 0xB6, 0x12, 0xD4, 0x23, + 0xC5, 0xE4, 0xEF, 0xF4, 0x18, 0xBD, 0x19, 0xCF, 0x13, 0xB1, 0x6D, 0xC2, + 0x28, 0xAC, 0xB0, 0xCA, 0x75, 0xBA, 0xD9, 0xDC, 0xD5, 0xE0, 0x45, 0xE8, + 0xC1, 0x13, 0xBF, 0xFA, 0x18, 0x2F, 0xFC, 0x09, 0xF3, 0x26, 0x32, 0x01, + 0x7F, 0x0C, 0x0A, 0xF0, 0x49, 0xEA, 0x2C, 0xE2, 0x60, 0xDA, 0xB6, 0xD3, + 0xB6, 0xDD, 0xF1, 0xCD, 0xF4, 0xEA, 0x3F, 0xE2, 0x5D, 0x04, 0x70, 0x00, + 0x9A, 0x13, 0x4A, 0x0D, 0xF9, 0x1A, 0xC3, 0x16, 0xE5, 0x2D, 0x3B, 0x27, + 0x67, 0x1E, 0x2A, 0x18, 0x6A, 0xE7, 0xDE, 0xFE, 0xE3, 0xDD, 0x9B, 0x10, + 0x28, 0xED, 0x55, 0x11, 0xF0, 0xE5, 0x67, 0xF3, 0x3C, 0x06, 0xF5, 0xFD, + 0x32, 0x3C, 0x01, 0x1B, 0x7E, 0x43, 0x99, 0x15, 0xB6, 0x40, 0xC4, 0x18, + 0xD1, 0x49, 0x89, 0x2D, 0xB5, 0x25, 0x5A, 0x1A, 0x69, 0xE9, 0x1A, 0xF5, + 0x9C, 0xD0, 0x30, 0xE5, 0xB0, 0xBB, 0x54, 0xD8, 0xE1, 0xB2, 0x02, 0xD0, + 0xCF, 0xE6, 0xCC, 0xF1, 0x1D, 0x21, 0x3B, 0x1A, 0x6B, 0x3B, 0x35, 0x29, + 0xA0, 0x51, 0x00, 0x3B, 0x45, 0x52, 0xCC, 0x3F, 0xA8, 0x24, 0x57, 0x19, + 0x8B, 0xEA, 0x73, 0xF1, 0xCD, 0xC5, 0x8D, 0xE0, 0x72, 0xBC, 0xA2, 0xD5, + 0x2D, 0xCA, 0xCA, 0xDC, 0xA1, 0xE9, 0xBD, 0xFD, 0x9E, 0x09, 0x8A, 0x2B, + 0x04, 0x27, 0x0B, 0x3A, 0x59, 0x39, 0xC1, 0x2B, 0x3F, 0x19, 0xE6, 0x0F, + 0xDF, 0xE8, 0x6E, 0xE7, 0x0D, 0xCF, 0x81, 0xCE, 0xB6, 0xBD, 0x32, 0xCB, + 0x5F, 0xC7, 0x26, 0xDB, 0x09, 0xF5, 0x76, 0xFA, 0x55, 0x17, 0x50, 0x0A, + 0xE8, 0x24, 0xA4, 0x16, 0xB7, 0x35, 0x23, 0x23, 0xAF, 0x24, 0x92, 0x02, + 0x5B, 0xF5, 0x31, 0xDD, 0x1A, 0xF7, 0xD7, 0xE7, 0x23, 0xFB, 0x64, 0xF0, + 0x28, 0xD4, 0x7A, 0xE2, 0xAA, 0xDC, 0xC9, 0x03, 0x98, 0x10, 0x83, 0x2A, + 0xFA, 0x21, 0x08, 0x1D, 0x32, 0x30, 0xA3, 0x16, 0x54, 0x4B, 0x21, 0x17, + 0x71, 0x35, 0x92, 0xF2, 0x47, 0x04, 0x95, 0xCB, 0xF6, 0xE4, 0xE4, 0xC3, + 0x6D, 0xC4, 0x57, 0xC1, 0x0A, 0xB1, 0x9F, 0xCB, 0xF5, 0xD3, 0x38, 0xFA, + 0xC6, 0x0F, 0xEA, 0x25, 0xD3, 0x35, 0xFA, 0x40, 0x6D, 0x43, 0x71, 0x4F, + 0x24, 0x35, 0x71, 0x3A, 0xDB, 0x09, 0x88, 0x05, 0x9D, 0xDE, 0xE9, 0xCA, + 0xB2, 0xB6, 0xF0, 0xB3, 0xEB, 0x9C, 0x5B, 0xBB, 0x96, 0xAF, 0xBF, 0xC3, + 0x8A, 0xDB, 0x9C, 0xD6, 0xC1, 0x07, 0xD7, 0x02, 0xBD, 0x26, 0xF5, 0x16, + 0x90, 0x1E, 0x58, 0x06, 0x4C, 0xEB, 0xD8, 0xF7, 0xDA, 0xB8, 0x13, 0xDE, + 0xBC, 0xA8, 0x27, 0xC3, 0xDF, 0xA3, 0xB9, 0xBB, 0x6D, 0xAB, 0x24, 0xC8, + 0xF7, 0xCF, 0xC1, 0xD3, 0x51, 0xE9, 0xB8, 0xD3, 0xB4, 0xF8, 0x5D, 0xE6, + 0x60, 0x14, 0xEB, 0xF7, 0x95, 0x06, 0xC5, 0xE3, 0xC6, 0xDC, 0x4B, 0xCE, + 0x5A, 0xE5, 0xF9, 0xD2, 0x5E, 0xEC, 0xFF, 0xD1, 0x89, 0xBB, 0xA1, 0xC9, + 0xEB, 0xAF, 0x34, 0xE6, 0xD0, 0xD9, 0x4B, 0x09, 0x69, 0xF0, 0x7E, 0x04, + 0x37, 0x0B, 0x65, 0x08, 0x82, 0x29, 0x0F, 0x0E, 0x93, 0x0D, 0x40, 0xE7, + 0x71, 0xD7, 0xDF, 0xC1, 0x02, 0xBA, 0x77, 0xAF, 0x02, 0xA6, 0xBA, 0xA2, + 0xC7, 0xAA, 0xA6, 0xB5, 0x10, 0xCB, 0x0A, 0xE5, 0xE4, 0xEE, 0x72, 0x06, + 0xFB, 0x12, 0x9C, 0x15, 0xE9, 0x27, 0x7C, 0x29, 0x68, 0x1E, 0x78, 0x21, + 0xB8, 0xFB, 0x43, 0xF6, 0x2E, 0xD3, 0xFF, 0xCF, 0x63, 0xB2, 0x53, 0xB6, + 0x4C, 0xA4, 0xE2, 0xBA, 0xF8, 0xB4, 0xB1, 0xCF, 0x40, 0xD0, 0x47, 0xDC, + 0x92, 0xEB, 0xAD, 0x03, 0xC8, 0x11, 0x60, 0x21, 0x41, 0x1C, 0x69, 0x15, + 0xA8, 0x01, 0xD9, 0xFD, 0x30, 0xE8, 0x05, 0xE9, 0xC2, 0xCC, 0x6C, 0xCB, + 0xC0, 0xB1, 0xC1, 0xAE, 0x24, 0xBF, 0x95, 0xC6, 0x70, 0xE8, 0x01, 0xEC, + 0xE6, 0xFF, 0x0E, 0xFC, 0x25, 0x14, 0x46, 0x22, 0x57, 0x2A, 0x43, 0x40, + 0x13, 0x17, 0x04, 0x1B, 0xE3, 0xF0, 0xF1, 0xE4, 0xD2, 0xF3, 0xE7, 0xD2, + 0xEF, 0xF6, 0x4B, 0xC2, 0xD6, 0xEB, 0x50, 0xB6, 0x20, 0x09, 0x01, 0xDA, + 0xC6, 0x2C, 0x6F, 0x03, 0x05, 0x2A, 0x3E, 0x0E, 0x4C, 0x26, 0xE1, 0x1B, + 0x90, 0x2E, 0xE0, 0x19, 0xA3, 0x1B, 0x89, 0xF9, 0x22, 0xF4, 0x14, 0xE5, + 0x2A, 0xD1, 0xA4, 0xD7, 0x4B, 0xB9, 0x64, 0xCB, 0xA1, 0xC0, 0x7C, 0xCF, + 0xC0, 0xE5, 0x97, 0xE4, 0x90, 0x0D, 0x64, 0x09, 0x4B, 0x38, 0xE7, 0x3A, + 0xAD, 0x57, 0x2A, 0x65, 0xA1, 0x4D, 0x9D, 0x58, 0xDD, 0x30, 0x67, 0x2D, + 0xD0, 0x08, 0xC3, 0x06, 0x63, 0xCF, 0x58, 0xDE, 0xB9, 0xBB, 0x55, 0xCB, + 0x16, 0xCF, 0x44, 0xD9, 0x58, 0xED, 0xBB, 0xF9, 0x6D, 0x1E, 0x2F, 0x29, + 0xF4, 0x3B, 0x14, 0x5B, 0x88, 0x2B, 0x64, 0x54, 0x14, 0x03, 0xAD, 0x16, + 0x1C, 0xE7, 0x17, 0xF5, 0xAD, 0xDD, 0xAB, 0xE8, 0xD0, 0xD5, 0x73, 0xD3, + 0xDB, 0xED, 0xF3, 0xE5, 0x35, 0x1A, 0x33, 0x09, 0xBB, 0x2F, 0x8A, 0x11, + 0xCA, 0x3C, 0x9A, 0x24, 0xAF, 0x3B, 0x6A, 0x3D, 0x9A, 0x15, 0x8F, 0x25, + 0xC1, 0xFE, 0x80, 0x0A, 0x1F, 0x13, 0xE9, 0x14, 0x4F, 0x09, 0xC0, 0x10, + 0x16, 0xEF, 0x0E, 0xFC, 0x5C, 0x03, 0x5A, 0x11, 0x12, 0x1E, 0x54, 0x2C, + 0x70, 0x25, 0x33, 0x22, 0x32, 0x36, 0x41, 0x33, 0x97, 0x48, 0xF1, 0x35, + 0xDC, 0x3B, 0x92, 0x0B, 0x04, 0x1A, 0x80, 0xED, 0x5A, 0xF7, 0x93, 0xD2, + 0x61, 0xDF, 0x9F, 0xC1, 0x8F, 0xE9, 0xBE, 0xD4, 0x94, 0x07, 0x17, 0xF7, + 0xED, 0x2A, 0x59, 0x1B, 0x84, 0x51, 0x6F, 0x3C, 0x41, 0x5D, 0x52, 0x52, + 0x32, 0x3F, 0xD9, 0x49, 0xA3, 0x15, 0x28, 0x28, 0xDF, 0xF7, 0x99, 0xFD, + 0xB0, 0xD9, 0x9B, 0xC9, 0xB6, 0xD2, 0x56, 0xB6, 0x5E, 0xF2, 0xC4, 0xC7, + 0x29, 0x15, 0xBD, 0xE0, 0xB5, 0x38, 0x05, 0xFF, 0x63, 0x4C, 0x5C, 0x28, + 0xE0, 0x2E, 0xDC, 0x37, 0x54, 0xF5, 0x9E, 0x1B, 0xDF, 0xC9, 0xF0, 0xFE, + 0x3D, 0xBA, 0x9B, 0xEB, 0x2E, 0xB8, 0x4C, 0xD0, 0x73, 0xC7, 0xFA, 0xD8, + 0xDE, 0xE2, 0x9D, 0x01, 0x51, 0xFD, 0x16, 0x12, 0x7C, 0x1C, 0x53, 0x21, + 0x4A, 0x2D, 0x78, 0x30, 0x84, 0x12, 0x53, 0x1A, 0x27, 0xFC, 0x13, 0xFC, + 0xC0, 0x02, 0xC8, 0xFC, 0x3A, 0xED, 0xE0, 0xED, 0x1C, 0xD2, 0x05, 0xDC, + 0xD7, 0xE5, 0x53, 0xFB, 0xBA, 0x00, 0x71, 0x0A, 0xCA, 0x08, 0xA5, 0x05, + 0xF2, 0x1D, 0x09, 0x1B, 0xBA, 0x27, 0x6D, 0x1B, 0xF7, 0x00, 0xFB, 0xF8, + 0x61, 0xCF, 0x79, 0xE2, 0x2F, 0xB0, 0xC9, 0xDE, 0x27, 0xAC, 0x87, 0xBF, + 0xAA, 0xC9, 0x59, 0xB1, 0x04, 0xED, 0x56, 0xDF, 0x39, 0x0C, 0xB8, 0x16, + 0xDE, 0x32, 0xEE, 0x3B, 0x4E, 0x43, 0x5D, 0x44, 0xB7, 0x29, 0xD5, 0x2E, + 0x1A, 0x01, 0x85, 0x04, 0x6D, 0xD9, 0x0C, 0xDC, 0xFB, 0xB8, 0xA3, 0xC6, + 0x22, 0xB4, 0x23, 0xC3, 0xE0, 0xD2, 0x90, 0xD1, 0xA9, 0x01, 0x5C, 0xF3, + 0x8D, 0x1D, 0x30, 0x1F, 0x67, 0x28, 0xC1, 0x2F, 0xF8, 0x1F, 0x5A, 0x0E, + 0x28, 0xF6, 0x67, 0xED, 0x61, 0xD3, 0xBD, 0xE5, 0x52, 0xC1, 0x47, 0xE0, + 0xD7, 0xC3, 0x4F, 0xD8, 0x05, 0xE7, 0x47, 0xEC, 0xAF, 0x0B, 0xB7, 0x0F, + 0x5A, 0x20, 0xD1, 0x17, 0x1D, 0x32, 0x12, 0x28, 0xFF, 0x30, 0x8E, 0x35, + 0x72, 0x0D, 0x04, 0x1D, 0x05, 0xFD, 0x6C, 0x15, 0x92, 0xF7, 0xBD, 0x1E, + 0xD2, 0xD3, 0x4F, 0x05, 0x62, 0xD6, 0x99, 0xF1, 0x8F, 0x0A, 0xC4, 0x08, + 0x77, 0x27, 0x4E, 0x0C, 0xBB, 0x2B, 0x7E, 0xFC, 0xAD, 0x34, 0xCE, 0x05, + 0x72, 0x29, 0x4C, 0x02, 0x6B, 0xFD, 0x81, 0xE4, 0x26, 0xD8, 0xD8, 0xCF, + 0x84, 0xBF, 0xCF, 0xC9, 0xEE, 0xB3, 0xB6, 0xCA, 0x21, 0xCF, 0x06, 0xE0, + 0xCC, 0x06, 0xFA, 0x09, 0x04, 0x3A, 0xBF, 0x2E, 0x39, 0x59, 0x0F, 0x36, + 0x86, 0x53, 0x0E, 0x2B, 0xE9, 0x26, 0xCD, 0x19, 0x63, 0xF2, 0xF1, 0xF6, + 0x4F, 0xC8, 0x96, 0xCC, 0x04, 0xB0, 0x8E, 0xBF, 0xCD, 0xB7, 0x18, 0xD5, + 0x57, 0xD4, 0x7C, 0xEF, 0x26, 0x05, 0xFF, 0x0A, 0xBD, 0x27, 0xD7, 0x28, + 0xA5, 0x20, 0x94, 0x34, 0xF9, 0x07, 0x2A, 0x19, 0x21, 0xEC, 0xF2, 0xFC, + 0x37, 0xDC, 0xF9, 0xF8, 0x3A, 0xCB, 0x79, 0xEB, 0x94, 0xC1, 0xCB, 0xEE, + 0x93, 0xD7, 0x1A, 0x07, 0x3D, 0xF1, 0x61, 0x0C, 0x74, 0x12, 0x4B, 0x0C, + 0x79, 0x38, 0x50, 0x1C, 0x89, 0x2A, 0xDA, 0x18, 0xD6, 0x13, 0x52, 0xFF, + 0x59, 0x1D, 0x8B, 0x03, 0xAE, 0x0D, 0x47, 0x05, 0x42, 0xEE, 0xD3, 0xF2, + 0x33, 0xFE, 0x08, 0x0B, 0x06, 0x1C, 0x5F, 0x2F, 0x2A, 0x1E, 0x61, 0x36, + 0x89, 0x2D, 0x22, 0x3B, 0x6A, 0x42, 0x96, 0x2E, 0xF3, 0x2A, 0x4C, 0x0B, + 0xB8, 0xFE, 0x9A, 0xE5, 0xD7, 0xD9, 0xE8, 0xCA, 0x9D, 0xC5, 0xAC, 0xC0, + 0x00, 0xDF, 0x00, 0xDD, 0xF7, 0x0A, 0x3F, 0x11, 0x2D, 0x2F, 0xF3, 0x3A, + 0xBC, 0x57, 0xA2, 0x5D, 0x9F, 0x63, 0xFB, 0x65, 0x7F, 0x3E, 0x8F, 0x49, + 0x2A, 0x18, 0xFE, 0x30, 0x07, 0xFB, 0x5C, 0x17, 0x78, 0xDB, 0x14, 0xF4, + 0x1D, 0xD4, 0x1A, 0xF1, 0x47, 0xDF, 0x07, 0x0B, 0xA6, 0xF0, 0x15, 0x1F, + 0xC4, 0x11, 0xA3, 0x2E, 0x8D, 0x3C, 0x00, 0x2F, 0x6A, 0x43, 0xD7, 0x0E, + 0xC5, 0x21, 0x09, 0xF2, 0xF1, 0x00, 0xCC, 0xE2, 0xEB, 0xDA, 0x18, 0xDC, + 0x36, 0xC6, 0x85, 0xE7, 0x90, 0xE6, 0x05, 0x04, 0x3A, 0x0E, 0xA7, 0x17, + 0xA0, 0x27, 0x7B, 0x26, 0xF4, 0x47, 0xE7, 0x42, 0xAF, 0x51, 0xB4, 0x42, + 0x80, 0x2E, 0xE6, 0x11, 0x24, 0x17, 0x6C, 0xFC, 0x59, 0x1C, 0xCC, 0x0A, + 0x21, 0x06, 0x3B, 0xF9, 0x20, 0xF9, 0x8D, 0xEF, 0xA1, 0x16, 0x3A, 0x17, + 0xB9, 0x25, 0x97, 0x34, 0x79, 0x26, 0xE5, 0x40, 0xBD, 0x39, 0x29, 0x50, + 0xF6, 0x39, 0x7B, 0x36, 0x71, 0x1B, 0x6F, 0x02, 0xFC, 0xF8, 0x50, 0xEC, + 0x66, 0xD4, 0x5A, 0xF3, 0x8B, 0xC7, 0x3B, 0x03, 0x88, 0xEA, 0x82, 0x1F, + 0x7C, 0x19, 0x49, 0x3C, 0xB2, 0x3F, 0xFF, 0x4F, 0x67, 0x5A, 0xE2, 0x5D, + 0xBE, 0x51, 0xB3, 0x4D, 0xF0, 0x3D, 0x29, 0x24, 0x82, 0x34, 0x74, 0x05, + 0xBF, 0x0F, 0x15, 0xF0, 0x9B, 0xDA, 0x55, 0xE8, 0xC6, 0xD2, 0x47, 0xF9, + 0x4F, 0xEA, 0x36, 0x0F, 0x79, 0x13, 0x7C, 0x2D, 0x10, 0x47, 0x5A, 0x4D, + 0x07, 0x5B, 0x1B, 0x52, 0x27, 0x45, 0x50, 0x39, 0xD5, 0x22, 0x92, 0x1A, + 0x98, 0x01, 0x88, 0xFB, 0xBF, 0xD8, 0x88, 0xE4, 0xC5, 0xCC, 0x26, 0xEF, + 0x67, 0xF4, 0x18, 0x10, 0xBD, 0x14, 0xD4, 0x24, 0x72, 0x29, 0x98, 0x32, + 0x58, 0x4E, 0x64, 0x48, 0xC4, 0x43, 0xBE, 0x34, 0xBA, 0x17, 0x04, 0x11, + 0xA7, 0x18, 0xBE, 0x12, 0x9F, 0x17, 0xC0, 0x12, 0xD7, 0xF0, 0x96, 0x05, + 0x43, 0xF3, 0x74, 0x0D, 0x51, 0x21, 0x38, 0x27, 0x7A, 0x31, 0x89, 0x2E, + 0x0D, 0x37, 0x9E, 0x1C, 0xBE, 0x41, 0xAB, 0x0C, 0x34, 0x25, 0xC0, 0xF2, + 0xCE, 0xF7, 0x91, 0xCA, 0x23, 0xD9, 0xFF, 0xAF, 0xF8, 0xC2, 0xE3, 0x9D, + 0xA4, 0xBD, 0xBD, 0xAC, 0xA3, 0xD2, 0x4A, 0xD6, 0x3E, 0xFF, 0x02, 0x02, + 0x2B, 0x33, 0x56, 0x32, 0xE5, 0x4E, 0x63, 0x42, 0x63, 0x40, 0xD7, 0x26, + 0xED, 0x1B, 0xA8, 0xFC, 0x14, 0xF1, 0xF8, 0xD3, 0x3B, 0xBF, 0x29, 0xB6, + 0x6E, 0xA8, 0x76, 0xB4, 0x56, 0xB6, 0x43, 0xCF, 0x49, 0xCA, 0x57, 0xE5, + 0x64, 0xE7, 0xA9, 0x00, 0xBF, 0x08, 0x38, 0x1A, 0x80, 0x04, 0xD6, 0x0C, + 0x1A, 0xDA, 0x38, 0xEB, 0xB5, 0xBF, 0x21, 0xD5, 0x32, 0xB3, 0x96, 0xC2, + 0xD3, 0xA1, 0x58, 0xAE, 0xD1, 0xAC, 0x4F, 0xC1, 0xD0, 0xC7, 0xC4, 0xE6, + 0x45, 0xD5, 0x0F, 0xFC, 0xFA, 0xED, 0x3D, 0x1D, 0x06, 0x09, 0xAD, 0x2D, + 0x13, 0xFF, 0x7B, 0xFC, 0xA8, 0xEA, 0x04, 0xD2, 0x7B, 0xDF, 0x80, 0xD1, + 0xA2, 0xBF, 0xBF, 0xC2, 0x7D, 0xB1, 0xB3, 0xB7, 0xF4, 0xDB, 0x33, 0xD6, + 0x2E, 0xFC, 0x95, 0xF0, 0xD1, 0xFA, 0x7E, 0xF7, 0x87, 0x09, 0x24, 0x05, + 0x4A, 0x10, 0x59, 0xF6, 0x14, 0xE9, 0x63, 0xD2, 0x80, 0xC3, 0xB1, 0xB7, + 0x61, 0xAD, 0xD6, 0x9F, 0x3D, 0x9B, 0x49, 0x9F, 0x73, 0xB1, 0x06, 0xB7, + 0xD0, 0xE2, 0xB1, 0xD4, 0xDD, 0x07, 0x9A, 0xF6, 0x65, 0x22, 0xE7, 0x15, + 0xCC, 0x2A, 0x3B, 0x1B, 0x67, 0x1A, 0xBB, 0xFB, 0xF7, 0x01, 0xF7, 0xD6, + 0x1F, 0xDC, 0xF9, 0xB6, 0xB6, 0xB7, 0xB6, 0xA0, 0xC1, 0xB6, 0x3D, 0xAC, + 0xE3, 0xCD, 0xF4, 0xC8, 0xAF, 0xEA, 0xCA, 0xED, 0xC0, 0x03, 0x25, 0x19, + 0x8D, 0x13, 0x93, 0x2C, 0x3C, 0x0E, 0x98, 0x13, 0xF7, 0xFC, 0x3F, 0xE9, + 0x6F, 0xF1, 0xF8, 0xD3, 0x97, 0xCC, 0x09, 0xC1, 0xB5, 0xA2, 0x76, 0xBF, + 0xD1, 0xB2, 0xC3, 0xE1, 0xF9, 0xD8, 0x26, 0xF8, 0x1D, 0xFC, 0xF7, 0x0D, + 0xB3, 0x26, 0x09, 0x2D, 0xB8, 0x1F, 0x5A, 0x24, 0x4D, 0xF7, 0x85, 0x07, + 0xCA, 0xF0, 0x6C, 0x0C, 0xA7, 0xEB, 0xBF, 0x0C, 0xFB, 0xDD, 0x69, 0xE9, + 0x80, 0x01, 0x89, 0xDE, 0x27, 0x32, 0x02, 0xED, 0xB3, 0x32, 0x9D, 0xF7, + 0x35, 0x31, 0x8B, 0x15, 0x68, 0x32, 0xBF, 0x24, 0x89, 0x09, 0x74, 0x0F, + 0x37, 0xE6, 0xBC, 0xF6, 0xD7, 0xD9, 0xD4, 0xDD, 0x19, 0xBE, 0xC5, 0xCA, + 0x8A, 0xB7, 0x1E, 0xCB, 0x7A, 0xD7, 0xC2, 0xE0, 0xBC, 0x06, 0x5D, 0x03, + 0x35, 0x37, 0x2D, 0x33, 0x7C, 0x49, 0x55, 0x5E, 0x64, 0x34, 0xDE, 0x59, + 0x96, 0x10, 0xF4, 0x3E, 0xDA, 0xEF, 0xC7, 0x10, 0xAC, 0xD4, 0xB4, 0xD2, + 0x6E, 0xD5, 0x07, 0xBB, 0x85, 0xF0, 0x50, 0xC0, 0x77, 0x00, 0xD7, 0xDB, + 0x7A, 0x0B, 0xE0, 0x0D, 0x59, 0x23, 0xD8, 0x3D, 0x1A, 0x28, 0x3E, 0x42, + 0x1C, 0x06, 0xF0, 0x1D, 0x90, 0xEC, 0xE6, 0x02, 0x7A, 0xE3, 0xFF, 0xDC, + 0x6D, 0xD3, 0x57, 0xBD, 0x36, 0xE2, 0x18, 0xCE, 0x51, 0x05, 0x28, 0xE9, + 0xBC, 0x16, 0xDE, 0xF8, 0xFA, 0x36, 0x53, 0x13, 0x26, 0x57, 0xA9, 0x2E, + 0x59, 0x3A, 0x6A, 0x19, 0x4A, 0x0A, 0x09, 0x0B, 0x95, 0xFA, 0x9B, 0x1A, + 0x6B, 0xE5, 0x89, 0xFF, 0xE4, 0xD3, 0x6D, 0xEC, 0x3A, 0xF5, 0x16, 0x06, + 0xBA, 0x17, 0xFB, 0x18, 0x3F, 0x26, 0xB5, 0x22, 0x81, 0x46, 0x3C, 0x2E, + 0x21, 0x50, 0xE8, 0x2E, 0x8B, 0x22, 0x2F, 0x15, 0x81, 0xEB, 0xC2, 0xF2, + 0xAD, 0xBD, 0x52, 0xD2, 0x38, 0x9E, 0x7C, 0xB7, 0x43, 0xB1, 0x65, 0xC1, + 0x30, 0xEE, 0x24, 0xE7, 0x68, 0x1F, 0x9D, 0x15, 0x89, 0x38, 0x00, 0x3D, + 0x22, 0x3C, 0x2E, 0x3D, 0x31, 0x1A, 0x9E, 0x25, 0x64, 0xEC, 0x52, 0x05, + 0x17, 0xCE, 0x69, 0xD7, 0xB7, 0xBF, 0x16, 0xB1, 0xD9, 0xC2, 0xE3, 0xA3, + 0x07, 0xE7, 0x9D, 0xB8, 0xDA, 0x16, 0x13, 0xD8, 0x12, 0x22, 0xD7, 0xFA, + 0x36, 0x17, 0x62, 0x0E, 0x06, 0x06, 0x55, 0xFB, 0xE8, 0xED, 0x77, 0xE1, + 0x65, 0xDC, 0x6E, 0xD1, 0x3C, 0xBC, 0x69, 0xC6, 0xB4, 0xA5, 0x2D, 0xCD, + 0xB6, 0xBE, 0x44, 0xDC, 0xEC, 0xD2, 0x53, 0xE3, 0xA8, 0xE1, 0x3D, 0xF5, + 0x9C, 0x05, 0xF7, 0x12, 0x87, 0x04, 0x87, 0x0F, 0x56, 0xE6, 0x74, 0xF7, + 0x9B, 0xEA, 0xA7, 0x04, 0x26, 0xE3, 0xFC, 0x08, 0xF2, 0xB7, 0x0D, 0xED, + 0x78, 0xBE, 0x89, 0xEB, 0xDC, 0xF5, 0xA7, 0xF1, 0x8E, 0x12, 0x02, 0xE5, + 0x61, 0x23, 0x5A, 0xF9, 0x35, 0x32, 0x0C, 0x1A, 0x13, 0x14, 0x0F, 0x0D, + 0xF2, 0xDD, 0x1C, 0xE4, 0x85, 0xBE, 0x05, 0xC3, 0xA0, 0xB3, 0x7C, 0xAB, + 0x56, 0xBB, 0x2C, 0xB1, 0xB0, 0xDD, 0x16, 0xDC, 0x0A, 0x0F, 0x88, 0x00, + 0x00, 0x38, 0x42, 0x18, 0x47, 0x4E, 0x67, 0x30, 0x3E, 0x45, 0x34, 0x23, + 0x6A, 0x21, 0x8A, 0xF9, 0x0F, 0x02, 0xF7, 0xDB, 0xAE, 0xEB, 0x80, 0xC9, + 0x3A, 0xD4, 0xA3, 0xC1, 0xD4, 0xCE, 0xF5, 0xD3, 0x05, 0xF0, 0x57, 0xF9, + 0xEB, 0x16, 0xC9, 0x13, 0x07, 0x2D, 0x75, 0x2C, 0x57, 0x24, 0xCC, 0x2D, + 0x7A, 0x00, 0x7A, 0x12, 0xB9, 0xE9, 0xCC, 0xF7, 0x6F, 0xD6, 0xDE, 0xD7, + 0xA4, 0xC8, 0xAE, 0xC5, 0xD9, 0xDA, 0xBE, 0xE1, 0x75, 0xEB, 0x30, 0x00, + 0x47, 0xF5, 0xA5, 0x0A, 0x18, 0x17, 0x25, 0x2B, 0xBC, 0x2C, 0xCE, 0x2E, + 0x35, 0x15, 0x65, 0xFD, 0x3C, 0x04, 0x33, 0xF7, 0x89, 0xFB, 0x89, 0x0E, + 0xE5, 0xDA, 0x06, 0xFF, 0x73, 0xDA, 0xE9, 0xF8, 0x6F, 0x09, 0xB0, 0x1E, + 0x01, 0x2B, 0xD8, 0x26, 0x70, 0x40, 0x85, 0x17, 0xC6, 0x52, 0x16, 0x1E, + 0x11, 0x3F, 0x45, 0x10, 0xA5, 0x10, 0xD7, 0xF4, 0xC6, 0xEE, 0xB0, 0xE6, + 0x2D, 0xD2, 0x49, 0xDD, 0x22, 0xCB, 0x42, 0xD4, 0x06, 0xF1, 0xD0, 0xE7, + 0x61, 0x17, 0xBF, 0x21, 0x92, 0x30, 0x87, 0x4F, 0x34, 0x48, 0x6B, 0x5D, + 0x07, 0x47, 0x03, 0x5B, 0x50, 0x2B, 0xC3, 0x3D, 0x02, 0x09, 0xC5, 0x12, + 0xAA, 0xE4, 0x3B, 0xEF, 0x1B, 0xD1, 0x4F, 0xE5, 0x28, 0xEB, 0x97, 0xF3, + 0x95, 0x1E, 0xF4, 0x09, 0x9F, 0x3C, 0x3A, 0x2C, 0xA9, 0x4D, 0x21, 0x47, + 0x88, 0x49, 0xBA, 0x47, 0xEF, 0x1E, 0xE6, 0x2A, 0x6B, 0xFC, 0x36, 0x0D, + 0xBE, 0xF2, 0x25, 0xFF, 0x90, 0xE2, 0x4C, 0xF1, 0x0F, 0xE1, 0x5B, 0xFD, + 0x27, 0x04, 0x02, 0x18, 0xE6, 0x1B, 0x17, 0x28, 0x51, 0x29, 0x4C, 0x46, + 0xBB, 0x42, 0x88, 0x54, 0x81, 0x37, 0xEC, 0x39, 0xE9, 0x21, 0x5C, 0x1C, + 0x3B, 0x2D, 0xA8, 0x23, 0x98, 0x1B, 0xBC, 0x1E, 0x33, 0xFE, 0xB8, 0x0B, + 0xA8, 0x15, 0x62, 0x2F, 0xC9, 0x34, 0x0C, 0x44, 0x0F, 0x41, 0xDC, 0x31, + 0x72, 0x5B, 0x45, 0x43, 0x9B, 0x56, 0xBE, 0x47, 0x7F, 0x20, 0x81, 0x1D, + 0xB5, 0xFB, 0x64, 0xF1, 0xBE, 0xE9, 0x81, 0xCA, 0xE8, 0xD6, 0xD3, 0xAF, + 0x3E, 0xE5, 0x0C, 0xC2, 0x02, 0x0E, 0xFD, 0x00, 0xFB, 0x34, 0x9C, 0x33, + 0xA4, 0x56, 0x0A, 0x56, 0xAD, 0x57, 0xA0, 0x5C, 0x98, 0x35, 0x30, 0x38, + 0x23, 0x10, 0xD5, 0x0B, 0x06, 0xE8, 0x11, 0xDA, 0xB0, 0xCC, 0x08, 0xBC, + 0x77, 0xD6, 0x3B, 0xD4, 0x3B, 0xF0, 0xB9, 0x00, 0xE0, 0x0D, 0xFE, 0x20, + 0x5F, 0x32, 0x7C, 0x31, 0x06, 0x41, 0x6C, 0x30, 0xFB, 0x22, 0x19, 0x17, + 0x8D, 0xFD, 0x56, 0xFD, 0xB3, 0xE7, 0x1B, 0xEB, 0x25, 0xD0, 0x84, 0xD6, + 0xA8, 0xBF, 0x42, 0xE1, 0x77, 0xC8, 0x30, 0x04, 0x6A, 0xDA, 0x99, 0x18, + 0xBD, 0xF8, 0x95, 0x25, 0x8E, 0x24, 0xB2, 0x35, 0x46, 0x27, 0x1F, 0x21, + 0x76, 0x09, 0xDF, 0xFA, 0x53, 0xF5, 0x6C, 0xFE, 0xE1, 0xD3, 0x8B, 0xF9, + 0x83, 0xBC, 0x75, 0xD8, 0xA7, 0xD9, 0xF7, 0xEE, 0xEB, 0x02, 0x70, 0x1B, + 0x4D, 0x13, 0xAA, 0x1E, 0xEA, 0x27, 0x03, 0x26, 0x29, 0x3D, 0x10, 0x2F, + 0x64, 0x1F, 0xAC, 0x0E, 0xD6, 0xE3, 0xEC, 0xE0, 0x53, 0xBB, 0xF7, 0xC6, + 0xAA, 0xA4, 0x55, 0xBA, 0x64, 0xAA, 0x43, 0xBF, 0x38, 0xD3, 0xBE, 0xE1, + 0x14, 0x04, 0xAD, 0x18, 0x30, 0x2C, 0x3B, 0x42, 0x30, 0x3C, 0x64, 0x43, + 0xB4, 0x2A, 0xEA, 0x29, 0xE6, 0x0B, 0x0B, 0x03, 0x66, 0xEA, 0x53, 0xC6, + 0xF4, 0xCE, 0x64, 0xA4, 0xA3, 0xCB, 0x88, 0xB1, 0x10, 0xE1, 0x3D, 0xC8, + 0x7D, 0x05, 0x6C, 0xE8, 0xFB, 0x28, 0x08, 0x13, 0x03, 0x3D, 0xF9, 0x2C, + 0xBD, 0x35, 0xF6, 0x1B, 0x40, 0x1A, 0xC0, 0xF8, 0xDC, 0xF3, 0xA8, 0xDB, + 0x75, 0xC4, 0xD7, 0xC1, 0x00, 0xAF, 0x97, 0xC0, 0x45, 0xC3, 0x9C, 0xCE, + 0x56, 0xE4, 0x27, 0xD5, 0x64, 0x02, 0x52, 0xEC, 0xD9, 0x18, 0x45, 0x17, + 0xE2, 0x18, 0x80, 0x23, 0x7B, 0x07, 0x03, 0x13, 0xB4, 0x05, 0x86, 0x15, + 0x81, 0xF5, 0x63, 0x01, 0xB1, 0xC0, 0xA2, 0xE0, 0xAC, 0xBE, 0xE6, 0xF8, + 0x75, 0xEB, 0xE3, 0x18, 0xE6, 0x01, 0x74, 0x1D, 0x58, 0x1E, 0xD6, 0x28, + 0xFC, 0x36, 0x16, 0x31, 0x6A, 0x19, 0x77, 0x18, 0x93, 0xE5, 0xA6, 0xF0, + 0x20, 0xC4, 0xBC, 0xC9, 0xFA, 0xAE, 0x4E, 0xA6, 0xC7, 0xAD, 0x53, 0xB0, + 0x05, 0xD2, 0x71, 0xDA, 0x7F, 0x02, 0x53, 0xF7, 0x20, 0x31, 0xBB, 0x26, + 0xE2, 0x51, 0xEF, 0x42, 0x4B, 0x43, 0x7C, 0x2D, 0xDF, 0x1C, 0x87, 0x18, + 0xA9, 0xF0, 0x38, 0xF7, 0x7E, 0xC4, 0xAE, 0xC8, 0x51, 0xB3, 0x1A, 0xB3, + 0x9E, 0xB6, 0x2C, 0xC9, 0xFB, 0xCA, 0x86, 0xE1, 0xFC, 0x00, 0x1E, 0xF1, + 0x75, 0x3D, 0x7F, 0x11, 0xAA, 0x4C, 0xBD, 0x13, 0xBB, 0x2F, 0xBB, 0x01, + 0xA2, 0x04, 0x53, 0x04, 0x85, 0xD4, 0xB0, 0xF6, 0xF3, 0xB9, 0xF5, 0xDF, + 0xC1, 0xC7, 0x8E, 0xE4, 0xFB, 0xE4, 0xDB, 0xF3, 0x8C, 0x02, 0xE9, 0x02, + 0x52, 0x2F, 0x18, 0x27, 0x89, 0x46, 0x69, 0x31, 0x0E, 0x23, 0x1C, 0x08, + 0x7F, 0x02, 0x28, 0x0B, 0x35, 0xEF, 0x10, 0x20, 0x3F, 0xD1, 0xFB, 0xFC, + 0x44, 0xE2, 0xFA, 0xEC, 0xDD, 0x15, 0x4F, 0x0F, 0x36, 0x2E, 0x66, 0x23, + 0x24, 0x45, 0x5E, 0x29, 0x27, 0x59, 0xBD, 0x36, 0x78, 0x4B, 0xBA, 0x28, + 0x3D, 0x21, 0x23, 0x0B, 0xAE, 0xE6, 0x75, 0x06, 0xE4, 0xB4, 0xAE, 0xF8, + 0x8F, 0xAD, 0x69, 0xE8, 0xC0, 0xD5, 0xD3, 0xEF, 0x90, 0x09, 0xCE, 0xF9, + 0x50, 0x30, 0x0E, 0x11, 0xB7, 0x46, 0xF5, 0x1F, 0x1B, 0x42, 0x27, 0x19, + 0xD5, 0x2D, 0xBA, 0x0E, 0xC9, 0x0F, 0xD1, 0x02, 0xF5, 0xE1, 0xBF, 0xEA, + 0x6A, 0xC4, 0xC2, 0xDE, 0x69, 0xBE, 0x04, 0xE6, 0x8F, 0xCD, 0x5D, 0xE9, + 0x9E, 0xFA, 0x9A, 0xFC, 0xF5, 0x2A, 0x90, 0x19, 0x73, 0x38, 0x5B, 0x1B, + 0xDD, 0x22, 0x6D, 0x09, 0x8A, 0x0D, 0x1F, 0xF6, 0x10, 0xEC, 0x7C, 0xD4, + 0x63, 0xB7, 0x07, 0xB7, 0x57, 0xA9, 0x35, 0xBD, 0x8E, 0xBE, 0x94, 0xD6, + 0x70, 0xE1, 0xE5, 0xE6, 0xFE, 0x16, 0x14, 0x0A, 0x39, 0x39, 0xA8, 0x25, + 0x8B, 0x26, 0xF1, 0x11, 0x7A, 0x0C, 0x52, 0x12, 0xEC, 0x01, 0x7D, 0x1D, + 0xFC, 0xD7, 0xC2, 0xFB, 0x30, 0xBB, 0xDD, 0xED, 0x95, 0xDF, 0xA3, 0x09, + 0x72, 0x06, 0x25, 0x1A, 0x92, 0x1A, 0x8F, 0x1C, 0x35, 0x30, 0x05, 0x1E, + 0x79, 0x2D, 0x7B, 0x10, 0xD8, 0x10, 0x28, 0xFA, 0xC9, 0xED, 0x35, 0xF0, + 0xC1, 0xC1, 0x8F, 0xD7, 0xB3, 0xAC, 0x3C, 0xCF, 0x62, 0xC5, 0xF6, 0xF0, + 0x51, 0xEE, 0x09, 0x12, 0x34, 0x22, 0x4F, 0x2B, 0xC2, 0x52, 0xB5, 0x39, + 0x58, 0x5D, 0x9A, 0x28, 0x9C, 0x41, 0x94, 0x17, 0x5F, 0x18, 0x12, 0x15, + 0xF7, 0xF0, 0x52, 0xFA, 0x6E, 0xDA, 0x08, 0xDA, 0x32, 0xDF, 0xB9, 0xDA, + 0x2C, 0xF1, 0x92, 0xF3, 0x1C, 0x07, 0x19, 0x09, 0xB6, 0x2E, 0x58, 0x20, + 0x76, 0x4B, 0x88, 0x2E, 0x24, 0x43, 0x1E, 0x2A, 0x52, 0x2F, 0xCE, 0x23, + 0x37, 0x10, 0xD2, 0x19, 0x32, 0xE7, 0xD6, 0xFB, 0x68, 0xDB, 0xC5, 0xEE, + 0x45, 0xEE, 0x21, 0x08, 0x9C, 0xFA, 0x1C, 0x16, 0x3B, 0x1A, 0x31, 0x23, + 0x8D, 0x4E, 0xDA, 0x39, 0x0B, 0x42, 0x0C, 0x1A, 0xC7, 0x10, 0x86, 0xF3, + 0xF4, 0xFC, 0x99, 0xF7, 0x2A, 0xE2, 0x3F, 0xEA, 0x55, 0xCE, 0x3E, 0xDF, + 0x1E, 0xF5, 0xB1, 0xFB, 0x6F, 0x1C, 0x4D, 0x16, 0x56, 0x18, 0x73, 0x18, + 0xE7, 0x2A, 0xE8, 0x28, 0xA4, 0x3C, 0x44, 0x31, 0xA9, 0x26, 0xFA, 0x0B, + 0xE7, 0x0C, 0x40, 0xE1, 0xD8, 0xE5, 0xF9, 0xC8, 0xC7, 0xBA, 0xD8, 0xB7, + 0xF3, 0xB0, 0x53, 0xBE, 0x75, 0xC9, 0xA5, 0xD7, 0x30, 0xEE, 0x03, 0xF5, + 0x90, 0x16, 0x6A, 0x19, 0xE0, 0x37, 0xD6, 0x2B, 0x68, 0x2C, 0x6E, 0x22, + 0x82, 0x08, 0x96, 0x0F, 0x7B, 0xDE, 0xB9, 0xF0, 0x98, 0xB1, 0x6E, 0xD7, + 0x06, 0xAF, 0xB9, 0xDE, 0xFA, 0xC4, 0x00, 0xE4, 0x6D, 0xDC, 0xD4, 0xE8, + 0x4C, 0xFC, 0xD7, 0x06, 0xF3, 0x16, 0x78, 0x1E, 0xB6, 0x08, 0x19, 0x0B, + 0x2D, 0xE2, 0x00, 0xE6, 0xF9, 0xDA, 0x3F, 0xD3, 0xD9, 0xBE, 0x8A, 0xBC, + 0xC7, 0x9C, 0xD8, 0xAE, 0x01, 0xB5, 0xA9, 0xC2, 0x2C, 0xCC, 0xE2, 0xCD, + 0xCB, 0xE8, 0x8C, 0xD6, 0x87, 0x20, 0xA1, 0xFF, 0xFD, 0x30, 0x91, 0x0E, + 0xB2, 0x0D, 0x3D, 0xF4, 0xD1, 0xF9, 0x78, 0xFA, 0x67, 0xEE, 0xE3, 0x00, + 0xDF, 0xB8, 0xEE, 0xDB, 0xAC, 0xAE, 0x90, 0xCD, 0x67, 0xE0, 0x85, 0xE3, + 0x25, 0xF4, 0xB9, 0xF2, 0xAC, 0x06, 0x0E, 0xFF, 0xB7, 0x1E, 0xAE, 0x0B, + 0xA4, 0x0D, 0x71, 0xF9, 0xE5, 0xE3, 0xFE, 0xD0, 0x4E, 0xBE, 0xBB, 0xC0, + 0x0D, 0xA4, 0x29, 0xC2, 0xD2, 0xA0, 0x1E, 0xCE, 0xAB, 0xC1, 0xEB, 0xEB, + 0xF1, 0xF3, 0x23, 0x14, 0x4B, 0x1D, 0xB4, 0x2D, 0xEC, 0x30, 0x67, 0x22, + 0x82, 0x27, 0x6F, 0x05, 0x64, 0x08, 0x73, 0xE6, 0x9E, 0xE0, 0x1B, 0xC8, + 0x25, 0xC4, 0x54, 0xAD, 0x6B, 0xC2, 0x8E, 0x9D, 0x98, 0xD6, 0x31, 0xA7, + 0xBB, 0xEA, 0x08, 0xC0, 0x4A, 0x07, 0xEA, 0xE8, 0xE2, 0x3A, 0xEC, 0x16, + 0x1A, 0x4A, 0x81, 0x1F, 0x81, 0x21, 0x0C, 0x0D, 0xB1, 0xF9, 0xCA, 0xFA, + 0xBD, 0xD9, 0x46, 0xF0, 0x04, 0xB7, 0xA7, 0xD2, 0x5A, 0xBD, 0x9B, 0xC7, + 0x48, 0xD9, 0x0A, 0xDF, 0xBD, 0xEF, 0x34, 0xED, 0x3E, 0x24, 0xDB, 0x10, + 0xFF, 0x46, 0x9A, 0x2E, 0xFD, 0x28, 0xA2, 0x1A, 0xA1, 0x0A, 0x04, 0x15, + 0x69, 0xFF, 0x3A, 0x22, 0x00, 0xDC, 0xAE, 0x10, 0xB0, 0xCB, 0x35, 0x06, + 0x6C, 0xF0, 0x03, 0x1F, 0xF4, 0x0F, 0x6C, 0x34, 0x33, 0x20, 0x2C, 0x38, + 0xF6, 0x3D, 0x38, 0x48, 0xBE, 0x41, 0x2D, 0x47, 0xBF, 0x21, 0xB9, 0x24, + 0x19, 0xF7, 0x1E, 0x04, 0xA4, 0xC2, 0xFE, 0xEA, 0x18, 0xAE, 0x55, 0xD8, + 0x54, 0xC7, 0x86, 0xDB, 0x29, 0xF9, 0x6A, 0xFC, 0x58, 0x35, 0x46, 0x2D, + 0x99, 0x59, 0xDC, 0x50, 0xBF, 0x60, 0x4B, 0x59, 0x90, 0x57, 0x28, 0x49, + 0x46, 0x39, 0xF2, 0x2A, 0x56, 0xFE, 0xB8, 0xFE, 0x8E, 0xC6, 0x4B, 0xD3, + 0x71, 0xC8, 0xBA, 0xD0, 0x7E, 0xE8, 0x63, 0xE1, 0x7C, 0x17, 0xD6, 0xFF, + 0x89, 0x52, 0x13, 0x2A, 0xCC, 0x66, 0xD9, 0x38, 0x73, 0x4B, 0x1E, 0x1E, + 0x73, 0x28, 0x2E, 0x01, 0x21, 0x07, 0xE7, 0xEE, 0x11, 0xDB, 0x51, 0xD2, + 0x7B, 0xD3, 0xC9, 0xC8, 0x4F, 0xF8, 0x54, 0xEC, 0x5C, 0x10, 0xF8, 0x0E, + 0x49, 0x23, 0x94, 0x1F, 0x92, 0x40, 0x44, 0x3E, 0xF1, 0x3E, 0x58, 0x3B, + 0xD4, 0x1B, 0x9E, 0x08, 0x7E, 0x1B, 0x3A, 0x05, 0xE4, 0x22, 0xE3, 0x0A, + 0x1E, 0xF6, 0x2F, 0xE7, 0x57, 0xEA, 0x55, 0xE8, 0x5F, 0x10, 0x7D, 0x0B, + 0xB7, 0x1A, 0x2D, 0x19, 0x4D, 0x27, 0x74, 0x23, 0x62, 0x3C, 0x9B, 0x46, + 0x7B, 0x28, 0x72, 0x47, 0x52, 0xF3, 0x1E, 0x1F, 0x13, 0xC3, 0x12, 0xF9, + 0x4B, 0xAD, 0xED, 0xCB, 0xD0, 0xAF, 0x25, 0xB3, 0xCA, 0xD3, 0x69, 0xC9, + 0x9A, 0x06, 0xB1, 0xF3, 0x0F, 0x39, 0x7C, 0x2B, 0x61, 0x56, 0xAB, 0x4F, + 0xD9, 0x4F, 0xF1, 0x50, 0x15, 0x2B, 0xBD, 0x2A, 0xAC, 0xEA, 0x0D, 0xED, + 0x4C, 0xB7, 0x07, 0xC3, 0x75, 0xAA, 0x96, 0xB4, 0x16, 0xC3, 0x45, 0xCC, + 0xEA, 0xE7, 0x36, 0xEA, 0x60, 0x0C, 0x4A, 0x0D, 0xAC, 0x30, 0xE9, 0x2A, + 0x7E, 0x2A, 0x13, 0x25, 0xDB, 0x01, 0x6C, 0x14, 0x70, 0xE5, 0x59, 0xFB, + 0xBD, 0xD5, 0xCD, 0xE1, 0xA1, 0xC9, 0xE4, 0xC6, 0xE0, 0xD2, 0xD7, 0xBF, + 0xB3, 0xE1, 0xA3, 0xD8, 0x63, 0xDF, 0xE2, 0xE4, 0x4E, 0xF2, 0xD3, 0x01, + 0xE2, 0x19, 0x5A, 0x27, 0x87, 0x16, 0xC3, 0x20, 0x40, 0x04, 0xD2, 0x13, + 0xE1, 0x0E, 0xE4, 0x11, 0xA8, 0xF3, 0xCA, 0xFC, 0x41, 0xCA, 0x17, 0xD9, + 0x7F, 0xE8, 0xAA, 0xD7, 0xB9, 0x15, 0x44, 0xF5, 0xB9, 0x1E, 0x3D, 0x04, + 0xD6, 0x32, 0x1F, 0x1E, 0xD1, 0x3E, 0x66, 0x31, 0xC1, 0x1A, 0x81, 0x18, + 0x55, 0xEC, 0xD3, 0xED, 0xBD, 0xD0, 0xD5, 0xC9, 0x7D, 0xB8, 0x45, 0xB1, + 0xFD, 0xC1, 0xCB, 0xAF, 0x0E, 0xF5, 0xBE, 0xE1, 0x44, 0x19, 0x03, 0x27, + 0x9E, 0x32, 0xCF, 0x53, 0x62, 0x4F, 0x50, 0x65, 0x6D, 0x4A, 0x03, 0x4B, + 0x45, 0x1A, 0x40, 0x1B, 0xE4, 0xEE, 0x4F, 0xFC, 0x56, 0xD6, 0xF9, 0xE4, + 0x36, 0xD9, 0x4E, 0xD3, 0xA5, 0xEF, 0x92, 0xC6, 0xDC, 0x03, 0x9F, 0xE0, + 0xB0, 0x1B, 0x92, 0x11, 0xE4, 0x22, 0x72, 0x27, 0xAF, 0x11, 0xD0, 0x28, + 0xF7, 0x03, 0x8B, 0x18, 0xBB, 0xF2, 0x25, 0x03, 0x9D, 0xD0, 0xE1, 0xE5, + 0x29, 0xC4, 0xCE, 0xCA, 0x36, 0xDD, 0x73, 0xCD, 0x17, 0xF6, 0xB6, 0xDC, + 0x94, 0x17, 0xCF, 0xF8, 0x4A, 0x4D, 0xBE, 0x1F, 0xB8, 0x50, 0x97, 0x2B, + 0x47, 0x19, 0xEA, 0x0B, 0x3A, 0x02, 0xB2, 0xF2, 0x6F, 0x02, 0x07, 0xFB, + 0x84, 0xDA, 0xCE, 0xEA, 0xC6, 0xDC, 0x27, 0xE6, 0xFA, 0x19, 0x6B, 0x15, + 0xAF, 0x2B, 0x46, 0x2C, 0x8A, 0x28, 0x43, 0x27, 0xAF, 0x35, 0x51, 0x38, + 0xD7, 0x1F, 0x7C, 0x3B, 0xC6, 0xF3, 0x9D, 0x19, 0x8C, 0xDD, 0x51, 0x00, + 0xD7, 0xC8, 0xAD, 0xF7, 0x13, 0xB8, 0xA9, 0xE6, 0x12, 0xCE, 0x48, 0xF3, + 0x0D, 0xF8, 0x39, 0x21, 0x6E, 0x23, 0xF6, 0x3D, 0xA9, 0x50, 0xED, 0x4A, + 0x17, 0x61, 0xEC, 0x52, 0x0C, 0x46, 0xE2, 0x49, 0x9A, 0x1D, 0x14, 0x2A, + 0xCB, 0xF5, 0x80, 0x06, 0x3B, 0xD7, 0x13, 0xF4, 0x52, 0xDC, 0xA7, 0xED, + 0x69, 0xF0, 0x88, 0xF2, 0x47, 0x16, 0x19, 0x11, 0x20, 0x48, 0xB8, 0x2D, + 0x46, 0x5C, 0xC1, 0x31, 0x7E, 0x56, 0x50, 0x27, 0x2F, 0x30, 0xED, 0x10, + 0xAE, 0xF6, 0x12, 0xED, 0xCE, 0xD8, 0xE7, 0xD2, 0x4C, 0xE5, 0x00, 0xD7, + 0x30, 0x03, 0x93, 0xF0, 0x1D, 0x1C, 0xBD, 0x10, 0x84, 0x37, 0xD1, 0x2A, + 0x75, 0x48, 0x9A, 0x40, 0x89, 0x3F, 0x2C, 0x4C, 0x6A, 0x1B, 0xB4, 0x34, + 0xDD, 0x09, 0xBE, 0x24, 0xBB, 0x16, 0x4F, 0x2C, 0x10, 0x07, 0xA3, 0x15, + 0x5E, 0x03, 0x8C, 0x08, 0x9A, 0x1A, 0xE5, 0x22, 0x04, 0x1B, 0x56, 0x2A, + 0x99, 0x1E, 0x21, 0x1E, 0x86, 0x34, 0x1E, 0x24, 0x4A, 0x2E, 0x3F, 0x1D, + 0xA6, 0xFD, 0xAB, 0xFE, 0xB2, 0xD6, 0xD8, 0xEF, 0xA9, 0xBB, 0xDA, 0xE5, + 0x16, 0xAE, 0x92, 0xDA, 0x80, 0xD8, 0xBB, 0xEB, 0xDF, 0x15, 0xD7, 0x07, + 0x0E, 0x43, 0xF5, 0x1F, 0x7A, 0x5C, 0xCA, 0x32, 0xE3, 0x5A, 0xF8, 0x34, + 0x63, 0x3D, 0x59, 0x21, 0x0F, 0x0E, 0x12, 0x00, 0x55, 0xDF, 0x59, 0xE3, + 0xDC, 0xC4, 0x2D, 0xD6, 0x67, 0xC7, 0x4A, 0xD6, 0xCF, 0xDF, 0xA0, 0xE8, + 0xBE, 0x08, 0x98, 0x04, 0x98, 0x31, 0x44, 0x14, 0xBE, 0x39, 0xBF, 0x16, + 0x74, 0x18, 0x2E, 0x12, 0xBF, 0xE9, 0x32, 0x08, 0x1B, 0xC6, 0x61, 0xF7, + 0x45, 0xB2, 0xA1, 0xE9, 0x27, 0xB9, 0x47, 0xDB, 0xA3, 0xE5, 0xB3, 0xDA, + 0xCB, 0x01, 0x85, 0xE8, 0x4E, 0xFE, 0x0F, 0xFD, 0x97, 0x07, 0x7F, 0x20, + 0xF5, 0x08, 0xF2, 0x20, 0x0E, 0xF2, 0xF7, 0xF3, 0x19, 0xEC, 0x6B, 0xE9, + 0x56, 0xE4, 0x69, 0xF2, 0x12, 0xD4, 0xD3, 0xDF, 0x85, 0xE9, 0xEE, 0xDD, + 0xCF, 0x0D, 0x9C, 0x01, 0x8D, 0x1B, 0x11, 0x16, 0x42, 0x29, 0xB5, 0x11, + 0x36, 0x2D, 0xE4, 0x1B, 0x8F, 0x04, 0xE3, 0x12, 0x40, 0xD3, 0x10, 0xEB, + 0xA5, 0xB4, 0xAD, 0xD4, 0xB6, 0xA1, 0xEB, 0xC3, 0x8A, 0xAC, 0xC1, 0xAD, + 0xCC, 0xD7, 0x5B, 0xBD, 0x90, 0xFD, 0xBC, 0xF7, 0x04, 0x1A, 0x37, 0x25, + 0x41, 0x45, 0x72, 0x38, 0x46, 0x4E, 0xA4, 0x3C, 0x3A, 0x27, 0x94, 0x1E, + 0xDF, 0xFD, 0xB3, 0xF7, 0x55, 0xD1, 0x0E, 0xDA, 0xF6, 0xA9, 0xEA, 0xB0, + 0xC8, 0xAC, 0x59, 0xA3, 0xDE, 0xD8, 0x62, 0xB8, 0x7F, 0x0E, 0x03, 0xD4, + 0x43, 0x33, 0x64, 0xEE, 0x28, 0x2F, 0xC9, 0x06, 0xDD, 0xFF, 0x19, 0x09, + 0x8A, 0xD7, 0xEB, 0xE3, 0x3F, 0xC1, 0x86, 0xCD, 0xC1, 0xAC, 0x50, 0xC9, + 0xEA, 0xB3, 0x11, 0xC4, 0xC0, 0xE4, 0xA8, 0xDE, 0xE1, 0x0F, 0x81, 0xF8, + 0xE6, 0x13, 0x20, 0x02, 0x24, 0x22, 0xF4, 0x1A, 0xB7, 0x18, 0xC5, 0x1C, + 0x33, 0xDB, 0xA7, 0xF1, 0x8E, 0xCB, 0x4A, 0xE4, 0xDE, 0xDD, 0x96, 0xF5, + 0x77, 0xD5, 0x83, 0xE1, 0x14, 0xDC, 0xF8, 0xE3, 0xBF, 0x04, 0x2D, 0x06, + 0xE8, 0x17, 0x79, 0x03, 0x8C, 0x09, 0xBD, 0x01, 0x6E, 0x09, 0x48, 0x12, + 0x39, 0x04, 0x0E, 0x09, 0x97, 0xDF, 0x51, 0xEA, 0x4E, 0xB6, 0x29, 0xD8, + 0x10, 0xA6, 0xEB, 0xCB, 0x3A, 0xA8, 0x62, 0xBB, 0xC0, 0xBA, 0x22, 0xD2, + 0xDC, 0xED, 0x7A, 0xFE, 0x6C, 0x22, 0x20, 0x17, 0x17, 0x3C, 0xAD, 0x2B, + 0x6D, 0x3C, 0x19, 0x33, 0xC7, 0x1C, 0x49, 0x1F, 0x8B, 0xE2, 0x7B, 0xF5, + 0x8B, 0xC0, 0xDE, 0xD0, 0xE6, 0xC0, 0xFC, 0xB3, 0xE7, 0xCD, 0x08, 0xB5, + 0x5B, 0xE6, 0x5F, 0xDD, 0x70, 0x06, 0xBE, 0xFE, 0xD6, 0x1D, 0x75, 0x13, + 0x1D, 0x19, 0xB5, 0x1A, 0x61, 0xFA, 0x0D, 0x09, 0x68, 0xCE, 0x29, 0xE4, + 0xA1, 0xBA, 0x96, 0xC7, 0x1F, 0xCC, 0x25, 0xB5, 0xB2, 0xED, 0x43, 0xB1, + 0xB3, 0x14, 0xDB, 0xD2, 0x0A, 0x28, 0x52, 0xF1, 0x15, 0x32, 0x16, 0x02, + 0xD5, 0x3F, 0x32, 0x23, 0xD4, 0x30, 0x44, 0x30, 0xE4, 0xFD, 0xD3, 0x05, + 0x0C, 0xE5, 0x14, 0xE8, 0x16, 0xF0, 0x48, 0xF2, 0x70, 0xE1, 0x8C, 0xDC, + 0xA0, 0xE8, 0xC7, 0xC9, 0x72, 0x18, 0xBD, 0xEE, 0x02, 0x24, 0x8D, 0x0A, + 0x47, 0x1E, 0x41, 0x0D, 0x56, 0x28, 0x00, 0x16, 0x3E, 0x19, 0x81, 0x13, + 0x35, 0xE3, 0xA8, 0xF8, 0xFA, 0xBB, 0xBF, 0xE2, 0xE0, 0xAD, 0x6A, 0xD7, + 0xF3, 0xA8, 0xBB, 0xCB, 0xAE, 0xC7, 0xBA, 0xDF, 0x57, 0xF6, 0xAB, 0x15, + 0x9F, 0x15, 0x32, 0x3D, 0x98, 0x2D, 0x42, 0x4A, 0xFD, 0x40, 0x74, 0x4B, + 0x3B, 0x2A, 0xF9, 0x26, 0xAE, 0xEE, 0x51, 0xF0, 0x9F, 0xC5, 0xE4, 0xD1, + 0x5A, 0xBA, 0x57, 0xC8, 0x96, 0xC4, 0x12, 0xC1, 0x7B, 0xDD, 0x57, 0xD2, + 0x64, 0x05, 0x47, 0x0A, 0x38, 0x26, 0x4B, 0x26, 0xDF, 0x2A, 0xBD, 0x19, + 0x36, 0x20, 0x53, 0x0A, 0x05, 0xFD, 0x2C, 0xF5, 0x1B, 0xC8, 0xC4, 0xCD, + 0x7E, 0xB0, 0x4B, 0xB4, 0xC1, 0xCD, 0xCD, 0xC9, 0xE9, 0xFA, 0x8B, 0xE7, + 0xDC, 0x19, 0x7F, 0xFC, 0x7E, 0x28, 0xFC, 0x0A, 0xCA, 0x2B, 0x52, 0x15, + 0x55, 0x2D, 0xF4, 0x20, 0xF5, 0x1A, 0xEA, 0x09, 0x66, 0x00, 0x62, 0xED, + 0xC6, 0x06, 0xF8, 0xF4, 0x4B, 0x0A, 0xE2, 0xFB, 0x53, 0xF8, 0xC7, 0xFC, + 0x7C, 0x05, 0xA6, 0x1C, 0xA7, 0x23, 0x27, 0x39, 0x5F, 0x23, 0x50, 0x27, + 0xA9, 0x16, 0xAB, 0x20, 0x8E, 0x17, 0x26, 0x31, 0xC5, 0x06, 0x84, 0x18, + 0xA0, 0xED, 0x2F, 0xEB, 0xBC, 0xE7, 0xE7, 0xD8, 0x3B, 0xE4, 0x18, 0xDD, + 0x28, 0xF0, 0x66, 0xF9, 0x30, 0x15, 0xBA, 0x23, 0x8B, 0x3C, 0xEB, 0x44, + 0x4D, 0x56, 0x6F, 0x55, 0xB5, 0x64, 0x84, 0x5F, 0x1C, 0x57, 0x65, 0x55, + 0x52, 0x25, 0xF4, 0x26, 0x16, 0xFC, 0x31, 0xFA, 0x7C, 0xE8, 0xBC, 0xE3, + 0x7B, 0xDE, 0x2F, 0xE0, 0x9F, 0xF4, 0xCB, 0xEE, 0xA4, 0x26, 0xF6, 0x09, + 0x53, 0x49, 0x02, 0x27, 0xFA, 0x46, 0x24, 0x31, 0xDA, 0x31, 0x4D, 0x2E, + 0xD2, 0x07, 0x76, 0x1F, 0x51, 0xDF, 0x77, 0x01, 0xBB, 0xDD, 0x62, 0xEF, + 0xFB, 0xE9, 0x99, 0xF0, 0x3A, 0xFA, 0x72, 0x02, 0xBD, 0x18, 0x97, 0x18, + 0xE0, 0x32, 0xEA, 0x21, 0x56, 0x34, 0xAD, 0x24, 0x10, 0x33, 0xF4, 0x22, + 0x39, 0x26, 0x4A, 0x0E, 0x48, 0x07, 0xD4, 0xEF, 0x99, 0x05, 0x02, 0xED, + 0x1A, 0x0C, 0x4D, 0xFB, 0x5C, 0xEE, 0xBE, 0xF2, 0xB0, 0xE8, 0x33, 0xFB, + 0xF4, 0x16, 0xD1, 0x25, 0x2C, 0x27, 0x01, 0x26, 0xED, 0x1B, 0xB8, 0x13, + 0x8B, 0x1E, 0xAB, 0x17, 0x9B, 0x00, 0x99, 0x02, 0xC4, 0xD0, 0x20, 0xDC, + 0xAF, 0xC0, 0xFE, 0xC3, 0x93, 0xBA, 0xB5, 0xBF, 0xB6, 0xBB, 0xEE, 0xCB, + 0xEF, 0xD7, 0x0E, 0xF4, 0xCE, 0x05, 0xE5, 0x26, 0xD7, 0x27, 0x5B, 0x3D, + 0x95, 0x2F, 0x1B, 0x3E, 0xFF, 0x23, 0x94, 0x2A, 0x0D, 0x0B, 0x13, 0x03, + 0x9C, 0xF7, 0x9B, 0xE1, 0x9B, 0xE1, 0x11, 0xC9, 0x83, 0xC3, 0xD0, 0xC1, + 0xF6, 0xBF, 0x9F, 0xD3, 0x89, 0xCF, 0x7D, 0xE8, 0x04, 0xEC, 0x30, 0xF5, + 0x66, 0x0D, 0xC8, 0xFE, 0xEE, 0x0D, 0x7E, 0x08, 0x1A, 0xF1, 0xC3, 0xFA, + 0x09, 0xDA, 0xAC, 0xDC, 0x89, 0xDC, 0x86, 0xCA, 0x3D, 0xDC, 0x3C, 0xBF, + 0xEA, 0xD7, 0x81, 0xC3, 0x22, 0xF8, 0xA3, 0xEA, 0x5F, 0x0F, 0x36, 0x07, + 0xDD, 0x0E, 0xEB, 0x09, 0x49, 0x21, 0xC9, 0x21, 0x5A, 0x1A, 0x4F, 0x25, + 0xD4, 0xEC, 0x5A, 0xEF, 0xFC, 0xE8, 0x43, 0xD7, 0x97, 0xFF, 0xCA, 0xE9, + 0x7F, 0xED, 0xF0, 0xE3, 0xC1, 0xE4, 0x08, 0xE9, 0x5A, 0x00, 0xA8, 0x07, + 0x58, 0x05, 0xF2, 0x08, 0xC3, 0xF7, 0x85, 0xF3, 0x3C, 0x00, 0x76, 0xF0, + 0xDE, 0x00, 0x5B, 0xEF, 0xBD, 0xDA, 0x87, 0xD3, 0xB8, 0xBC, 0x7C, 0xC7, + 0x6C, 0xB5, 0xC1, 0xD3, 0x6F, 0xB7, 0x52, 0xD0, 0x53, 0xD2, 0x3D, 0xD0, + 0xB2, 0xF7, 0xBE, 0xE0, 0x7F, 0x14, 0x62, 0xFA, 0xAB, 0x30, 0x98, 0x1F, + 0x6A, 0x41, 0x04, 0x31, 0xFB, 0x28, 0x77, 0x21, 0x0E, 0xFD, 0x9D, 0x02, + 0x3C, 0xE2, 0x73, 0xEA, 0x90, 0xCD, 0x78, 0xDC, 0xFC, 0xC6, 0x29, 0xDA, + 0x59, 0xDA, 0x82, 0xEC, 0x21, 0xF5, 0x89, 0xFA, 0x6D, 0x10, 0x48, 0x18, + 0x4F, 0x19, 0x0F, 0x3B, 0xFB, 0x08, 0x98, 0x2D, 0xBB, 0xEA, 0x8C, 0x0A, + 0xD5, 0xD4, 0x53, 0xF9, 0x67, 0xD2, 0xD9, 0xF6, 0x59, 0xE1, 0x1D, 0xF3, + 0x21, 0xFE, 0x2E, 0xFB, 0x5B, 0x17, 0x06, 0x19, 0x01, 0x1F, 0x6E, 0x21, + 0x5B, 0x1A, 0x76, 0x1A, 0x1E, 0x2C, 0xA1, 0x20, 0xDA, 0x38, 0xC4, 0x06, + 0x85, 0x21, 0x03, 0xDB, 0x5F, 0x23, 0x38, 0xF9, 0xCC, 0x24, 0x22, 0x28, + 0x5C, 0x09, 0x4F, 0x0F, 0x1D, 0x10, 0x0C, 0x01, 0x6F, 0x24, 0x29, 0x1C, + 0x66, 0x12, 0x62, 0x23, 0x71, 0x06, 0x15, 0x2C, 0x95, 0x1E, 0xC0, 0x42, + 0xFA, 0x1F, 0x14, 0x3D, 0x2F, 0x02, 0xA7, 0x1D, 0xB1, 0xEA, 0x3A, 0xFD, + 0x10, 0xDF, 0x77, 0xDF, 0x67, 0xE6, 0xCC, 0xDA, 0xA4, 0x01, 0x33, 0xFC, + 0xF9, 0x28, 0x5C, 0x24, 0x15, 0x4A, 0xFF, 0x46, 0x5B, 0x56, 0x34, 0x5D, + 0xFB, 0x48, 0xED, 0x51, 0x8E, 0x2A, 0x33, 0x32, 0x71, 0x06, 0x59, 0x0F, + 0xA2, 0xE6, 0x47, 0xEF, 0x0F, 0xDB, 0xD7, 0xD3, 0x65, 0xEB, 0x32, 0xD4, + 0x04, 0x0E, 0xAE, 0xF1, 0x78, 0x28, 0xC3, 0xFB, 0x2C, 0x36, 0xFF, 0x04, + 0x78, 0x3B, 0x77, 0x13, 0x67, 0x27, 0x0D, 0x0B, 0xFB, 0x05, 0xD1, 0xF6, + 0x1F, 0xF1, 0x10, 0xEB, 0x49, 0xE3, 0x0B, 0xED, 0x0C, 0xE3, 0xC7, 0xE9, + 0x3A, 0x03, 0xF8, 0xF4, 0x06, 0x28, 0xBF, 0x02, 0x7D, 0x24, 0xF6, 0x03, + 0x45, 0x1F, 0xF8, 0x1F, 0x10, 0x2B, 0xC9, 0x2D, 0xC2, 0x17, 0x01, 0x0F, + 0x6C, 0xFA, 0x9F, 0xFB, 0x40, 0xFC, 0xE4, 0x0C, 0xBF, 0xFB, 0x92, 0x14, + 0xBA, 0xE8, 0xA0, 0x03, 0x84, 0xEF, 0xF8, 0x13, 0xA9, 0x09, 0x48, 0x2B, + 0xCD, 0x05, 0x3C, 0x21, 0x73, 0x01, 0x48, 0x1E, 0xD1, 0x0F, 0x2A, 0x28, + 0x82, 0xFB, 0x18, 0x19, 0x92, 0xD1, 0x9C, 0xF5, 0x26, 0xBB, 0x74, 0xDF, + 0xD3, 0xBF, 0x0A, 0xD7, 0x71, 0xD6, 0x27, 0xD6, 0x6D, 0xF8, 0x93, 0xED, + 0x23, 0x23, 0x0D, 0x27, 0x62, 0x39, 0x76, 0x4B, 0x09, 0x35, 0x68, 0x3B, + 0x1A, 0x2B, 0x90, 0x20, 0x06, 0x11, 0x3D, 0x02, 0x00, 0xE9, 0x31, 0xD9, + 0xDE, 0xD5, 0x54, 0xC4, 0xD8, 0xCB, 0x21, 0xC7, 0x17, 0xCA, 0xF3, 0xD4, + 0x9E, 0xE2, 0xDC, 0xEC, 0xD4, 0x06, 0x6E, 0x06, 0x57, 0x15, 0xBB, 0x0C, + 0x09, 0x0B, 0x16, 0x0B, 0x0A, 0x00, 0xC0, 0x02, 0xBA, 0xEC, 0x94, 0xE0, + 0x2F, 0xD8, 0xB7, 0xC9, 0xA8, 0xD8, 0x57, 0xC8, 0xCB, 0xE0, 0x8B, 0xCA, + 0xED, 0xEC, 0xFA, 0xE3, 0xFE, 0x01, 0xDA, 0x0D, 0xBA, 0x18, 0x4B, 0x1F, + 0xCC, 0x28, 0x7C, 0x18, 0xB7, 0x1B, 0x6A, 0x18, 0x18, 0xFC, 0x37, 0x02, + 0x4C, 0xEF, 0xC1, 0xE0, 0xB9, 0xF5, 0xFF, 0xE4, 0xF6, 0xF0, 0x5D, 0xE8, + 0x68, 0xED, 0x74, 0xE7, 0x52, 0x0D, 0x80, 0x03, 0xAB, 0x24, 0x13, 0x1D, + 0xC1, 0x0D, 0x6C, 0x11, 0x1D, 0xFF, 0xFC, 0x06, 0x2F, 0x03, 0x31, 0x11, + 0xC3, 0xE7, 0xA4, 0xF6, 0x0F, 0xC5, 0x9F, 0xD1, 0x63, 0xC7, 0x5C, 0xCE, + 0x01, 0xD6, 0xED, 0xCA, 0x47, 0xDE, 0x29, 0xD5, 0x89, 0x00, 0x33, 0xF5, + 0x36, 0x35, 0xB7, 0x18, 0xD5, 0x51, 0x98, 0x33, 0x56, 0x47, 0x01, 0x37, + 0xF8, 0x27, 0x5C, 0x35, 0x79, 0xFB, 0xC4, 0x25, 0xB3, 0xC1, 0x07, 0xF5, + 0x04, 0xB2, 0x95, 0xD0, 0x13, 0xC4, 0xAE, 0xC5, 0x7B, 0xC9, 0x9B, 0xCD, + 0xA8, 0xE1, 0xA9, 0xE5, 0x48, 0x0A, 0x99, 0x03, 0x48, 0x21, 0x11, 0x1F, + 0x0D, 0x21, 0x12, 0x24, 0xC6, 0x0D, 0x1D, 0x1C, 0x2A, 0xED, 0xFE, 0xFA, + 0x7E, 0xDA, 0x9D, 0xE2, 0xFE, 0xDD, 0x55, 0xE4, 0xE5, 0xE1, 0x29, 0xE3, + 0x23, 0xFB, 0x4F, 0xF3, 0xC2, 0x28, 0xB3, 0x0B, 0x3B, 0x35, 0xBE, 0x0C, + 0x0D, 0x2B, 0x97, 0x11, 0xD4, 0x1B, 0x8F, 0x1C, 0x03, 0xFE, 0xDE, 0x0E, + 0x26, 0xF8, 0x44, 0xFB, 0xBC, 0x10, 0xDF, 0x05, 0xB5, 0x17, 0xA9, 0x15, + 0xAE, 0x0F, 0x75, 0x0F, 0x19, 0x1E, 0x86, 0x1D, 0x5E, 0x2E, 0x73, 0x29, + 0x6D, 0x29, 0x4A, 0x1D, 0x98, 0x2B, 0x30, 0x18, 0xF5, 0x2F, 0xB8, 0x1C, + 0x54, 0x14, 0xE4, 0x0A, 0x30, 0xEB, 0x3F, 0xED, 0x3E, 0xD5, 0x8C, 0xE0, + 0x65, 0xDD, 0xFF, 0xE5, 0x46, 0xF7, 0xC1, 0xF7, 0x47, 0x1F, 0x0D, 0x1C, + 0xDF, 0x4D, 0xC1, 0x43, 0xC3, 0x62, 0xA9, 0x58, 0x80, 0x4C, 0x85, 0x5F, + 0xD1, 0x29, 0xEE, 0x54, 0x8A, 0x0F, 0x58, 0x35, 0x7A, 0xF0, 0x0C, 0x00, + 0xE7, 0xDB, 0xE2, 0xD1, 0xE8, 0xE3, 0x36, 0xD2, 0xA8, 0xF1, 0xB5, 0xE7, + 0x10, 0x00, 0xA9, 0xFD, 0x41, 0x20, 0x21, 0x1F, 0x41, 0x32, 0xE2, 0x39, + 0x97, 0x1E, 0xB5, 0x38, 0xD6, 0x01, 0x42, 0x1E, 0x55, 0xE6, 0x9C, 0x00, + 0x2D, 0xE3, 0xC6, 0xEC, 0x49, 0x05, 0x75, 0xE8, 0x58, 0x21, 0x87, 0xEC, + 0x8C, 0x2D, 0x61, 0xF2, 0xD7, 0x37, 0x16, 0xFE, 0x0E, 0x2F, 0x95, 0x01, + 0x5B, 0x10, 0x5A, 0xFD, 0x38, 0x02, 0x58, 0x0C, 0x8C, 0xF6, 0xCD, 0x05, + 0xD4, 0xDC, 0x8A, 0xDF, 0xA2, 0xED, 0x6B, 0xE1, 0x22, 0x11, 0x5F, 0xF6, + 0x7A, 0x0C, 0x7B, 0xE4, 0x7B, 0x13, 0xAB, 0xE9, 0xC3, 0x29, 0x97, 0x1E, + 0x33, 0x1C, 0x44, 0x34, 0x57, 0x07, 0x02, 0x1C, 0x53, 0xFE, 0x1F, 0x14, + 0x10, 0xF5, 0xB9, 0x10, 0xBE, 0xD9, 0x96, 0xE5, 0xC4, 0xBF, 0xC6, 0xBD, + 0xE3, 0xC9, 0x60, 0xC9, 0x63, 0xDE, 0xD9, 0xEB, 0xD3, 0xF0, 0x66, 0xFD, + 0x55, 0x0B, 0x1B, 0x22, 0x3B, 0x27, 0x32, 0x47, 0x77, 0x2B, 0xAE, 0x41, + 0xFE, 0x16, 0xAE, 0x2D, 0xE1, 0xF8, 0x7E, 0x10, 0xD5, 0xD1, 0x7F, 0xE8, + 0x9F, 0xBC, 0xD1, 0xC0, 0xBF, 0xC6, 0xFB, 0xA9, 0x1C, 0xCF, 0x40, 0xB3, + 0xA0, 0xDC, 0x16, 0xD1, 0x88, 0xF4, 0x91, 0xF0, 0x9C, 0x0C, 0x2F, 0x03, + 0x91, 0x15, 0x7B, 0x07, 0x58, 0x09, 0x17, 0xF4, 0x9E, 0xF2, 0xA2, 0xCE, + 0xC4, 0xD6, 0x61, 0xBD, 0xFF, 0xD8, 0x18, 0xC4, 0x35, 0xF0, 0x2A, 0xCB, + 0x6B, 0x01, 0xC1, 0xE5, 0x15, 0x15, 0x63, 0x0F, 0x55, 0x11, 0xC5, 0x23, + 0x2D, 0xF6, 0x70, 0x1E, 0xD9, 0xE7, 0xDC, 0x17, 0x96, 0xDE, 0x9A, 0x0C, + 0xB3, 0xC6, 0xAE, 0xE4, 0x55, 0xC5, 0xA4, 0xD7, 0x77, 0xEC, 0x17, 0xE2, + 0x1B, 0xF6, 0x0D, 0xDA, 0x4C, 0xF0, 0x4E, 0xE6, 0xA5, 0x00, 0x21, 0x12, + 0x13, 0xF9, 0xDE, 0x1E, 0x29, 0xEC, 0x3A, 0x00, 0x6D, 0xF4, 0x0D, 0xEA, + 0x3F, 0xFE, 0xA2, 0xEE, 0x22, 0xF3, 0xB8, 0xE0, 0xA6, 0xD9, 0x09, 0xB7, + 0x1A, 0xDC, 0xB8, 0xA8, 0xED, 0xEC, 0x07, 0xBD, 0xC7, 0xEC, 0x08, 0xD1, + 0x85, 0xEC, 0x6F, 0xF4, 0x53, 0xFB, 0xC0, 0x29, 0xE0, 0x0C, 0x64, 0x37, + 0x9E, 0x11, 0x99, 0x24, 0x2B, 0x0B, 0x0A, 0x0E, 0x1D, 0xFD, 0x20, 0xE8, + 0x0E, 0xDF, 0x8E, 0xBC, 0x4A, 0xC9, 0x96, 0xB5, 0x0C, 0xC1, 0x3B, 0xD2, + 0xD2, 0xC9, 0x88, 0xF4, 0xF3, 0xE7, 0xD9, 0x10, 0x15, 0x04, 0x88, 0x18, + 0x9F, 0x08, 0xDD, 0x0E, 0xA8, 0xF3, 0xA5, 0x09, 0x79, 0xDA, 0x61, 0xF6, + 0x6B, 0xC4, 0x61, 0xD7, 0xE5, 0xC5, 0xAC, 0xD1, 0x8E, 0xE5, 0x82, 0xDE, + 0x10, 0xF9, 0xEC, 0xE7, 0x64, 0xFD, 0xEC, 0xFC, 0xF4, 0x06, 0x95, 0x17, + 0xB4, 0xFF, 0x1A, 0x0E, 0x37, 0xFA, 0xCF, 0xF9, 0xBE, 0x00, 0x1D, 0xF2, + 0x53, 0xF3, 0x84, 0xDC, 0x1D, 0xE9, 0x82, 0xD7, 0xB6, 0x03, 0x4F, 0xF3, + 0x79, 0x13, 0x60, 0x02, 0x53, 0x03, 0xF7, 0xFC, 0xCC, 0x0C, 0x4A, 0x04, + 0x01, 0x24, 0x59, 0x09, 0x5D, 0x11, 0xF3, 0xF0, 0x2E, 0xF9, 0x34, 0xE5, + 0xD1, 0x03, 0x8C, 0xF3, 0x98, 0x02, 0x0D, 0xFA, 0x14, 0xE8, 0x91, 0xEA, + 0xE1, 0xDE, 0x65, 0xDA, 0x44, 0xE8, 0xEE, 0xDF, 0x7C, 0xEF, 0x28, 0xEC, + 0x97, 0xFC, 0x80, 0x00, 0x2F, 0x1E, 0x48, 0x24, 0x28, 0x33, 0x74, 0x37, + 0x57, 0x29, 0x53, 0x30, 0x3E, 0x17, 0xFF, 0x1A, 0xFF, 0x02, 0xE7, 0xF6, + 0x66, 0xEF, 0xFE, 0xCE, 0x67, 0xD8, 0xAC, 0xBE, 0xD6, 0xD7, 0x8F, 0xCB, + 0x95, 0xE9, 0x67, 0xD6, 0x1D, 0xF1, 0xBE, 0xE9, 0x02, 0xF9, 0x0D, 0x12, + 0x38, 0x08, 0xF9, 0x26, 0x05, 0x1C, 0x50, 0x1A, 0x98, 0x1C, 0x2A, 0xFE, + 0x10, 0x07, 0xA8, 0xE3, 0x22, 0xED, 0xE0, 0xD4, 0x1E, 0xDB, 0xA0, 0xD7, + 0x65, 0xD9, 0x87, 0xE6, 0xE4, 0xE4, 0x09, 0xEF, 0x4A, 0x01, 0xCE, 0x04, + 0x20, 0x0C, 0xB5, 0x1D, 0x5D, 0xFD, 0x94, 0x1B, 0x5D, 0x01, 0x82, 0x14, + 0xA8, 0x03, 0x59, 0x05, 0xDD, 0xE4, 0xFD, 0xE9, 0x54, 0xDB, 0x67, 0xF1, + 0x2C, 0xFC, 0x8C, 0x10, 0xF7, 0xFF, 0x1B, 0x0F, 0x52, 0xF0, 0x2E, 0x05, + 0x3B, 0x07, 0x55, 0x20, 0x87, 0x11, 0xA4, 0x2F, 0x75, 0xFB, 0x4D, 0x1C, + 0x01, 0xFC, 0x56, 0x1C, 0x6D, 0x02, 0xEE, 0x17, 0x0F, 0xEB, 0xD9, 0xFC, + 0x0A, 0xCC, 0x41, 0xDD, 0x32, 0xC5, 0x93, 0xC4, 0xB6, 0xD0, 0xB6, 0xC3, + 0x1B, 0xDF, 0xFA, 0xDB, 0x96, 0x01, 0x62, 0x12, 0x2C, 0x22, 0xB8, 0x48, + 0xF1, 0x2F, 0x36, 0x5A, 0xBA, 0x3D, 0x66, 0x53, 0x58, 0x3C, 0x32, 0x35, + 0x52, 0x1D, 0xAB, 0x03, 0xC2, 0xF1, 0x6A, 0xDD, 0xF0, 0xDD, 0x37, 0xC7, + 0x07, 0xE2, 0xB8, 0xC0, 0x2B, 0xF7, 0xE3, 0xD4, 0x41, 0x1D, 0x27, 0x00, + 0x69, 0x39, 0x03, 0x22, 0x01, 0x3E, 0xF5, 0x25, 0xAF, 0x35, 0x57, 0x1D, + 0x8F, 0x1D, 0xC3, 0x09, 0x24, 0xFB, 0xB9, 0xEE, 0x74, 0xE5, 0x51, 0xE8, + 0x1D, 0xF7, 0x2D, 0xFF, 0xDD, 0x1D, 0xE7, 0x13, 0x5D, 0x30, 0x8D, 0x25, + 0xF4, 0x33, 0xA5, 0x3F, 0x41, 0x2E, 0x83, 0x38, 0xCC, 0x29, 0x28, 0x1E, + 0x2E, 0x32, 0xB4, 0x1F, 0x8B, 0x25, 0x6F, 0x12, 0x0B, 0x03, 0x90, 0xF5, + 0x74, 0x0E, 0x97, 0x0D, 0x4B, 0x2F, 0xB9, 0x26, 0x97, 0x1E, 0xD0, 0x19, + 0x98, 0x16, 0xCF, 0x30, 0xED, 0x27, 0x2B, 0x5F, 0xD2, 0x1F, 0xA6, 0x60, + 0x2B, 0x1B, 0x95, 0x4F, 0x81, 0x25, 0xBB, 0x4A, 0xDC, 0x22, 0x18, 0x35, + 0x4F, 0x04, 0x2E, 0x0C, 0x12, 0xE2, 0x17, 0xEA, 0xD7, 0xDA, 0xE5, 0xE0, + 0x23, 0xEB, 0x52, 0xF6, 0x2A, 0x11, 0x54, 0x12, 0xF3, 0x3A, 0x63, 0x35, + 0xE0, 0x4F, 0x27, 0x53, 0x9B, 0x54, 0xC4, 0x4D, 0x9B, 0x45, 0x36, 0x36, + 0x35, 0x19, 0x25, 0x1C, 0xAF, 0xF5, 0xEE, 0x00, 0xCB, 0xF0, 0xA5, 0xE6, + 0xBD, 0xF3, 0xB3, 0xE4, 0xAF, 0xFD, 0x72, 0xFB, 0xD9, 0x16, 0x17, 0x0D, + 0x99, 0x25, 0x1C, 0x16, 0x92, 0x1E, 0xC5, 0x18, 0x39, 0x15, 0xE4, 0x08, + 0xF9, 0x05, 0xF3, 0xF2, 0x74, 0xE9, 0x7F, 0xD9, 0x63, 0xD1, 0x41, 0xC6, + 0xA0, 0xD6, 0xD7, 0xCF, 0x0B, 0xF7, 0x7F, 0xEA, 0x63, 0x0E, 0xC1, 0x06, + 0x87, 0x14, 0xA6, 0x27, 0x02, 0x1F, 0x57, 0x40, 0x33, 0x13, 0xEA, 0x2D, + 0xB4, 0xFD, 0x04, 0x1A, 0x59, 0x09, 0xB9, 0x23, 0x8E, 0x07, 0x46, 0xFB, + 0x94, 0xF0, 0xED, 0xC6, 0xB4, 0xF9, 0xD3, 0xE0, 0x0A, 0x06, 0x63, 0xFE, + 0x26, 0xFE, 0x36, 0xF0, 0x6C, 0x07, 0xB2, 0xFA, 0xBF, 0x10, 0x2A, 0x22, + 0xF8, 0x06, 0xAA, 0x22, 0x4F, 0x04, 0x9F, 0x0C, 0x1D, 0x02, 0xB6, 0x03, + 0xD9, 0xF1, 0x46, 0xFB, 0xD4, 0xDB, 0xBB, 0xEB, 0xED, 0xC8, 0x42, 0xD7, + 0xB8, 0xC9, 0x7A, 0xD1, 0x09, 0xE9, 0x87, 0xDA, 0xC1, 0x0D, 0xC4, 0xE7, + 0xC4, 0x1E, 0x8B, 0xFE, 0x1B, 0x21, 0x99, 0x14, 0x4B, 0x23, 0xF8, 0x1E, + 0x47, 0x19, 0xFB, 0x0A, 0x62, 0xE9, 0xDB, 0xEE, 0xBD, 0xC0, 0xBD, 0xE2, + 0xE8, 0xB3, 0x04, 0xCE, 0x0D, 0xB5, 0x5A, 0xB8, 0xA8, 0xD0, 0x9E, 0xBA, + 0xD0, 0xF2, 0x3A, 0xE0, 0xFF, 0x06, 0x2D, 0x01, 0x02, 0xFD, 0xDA, 0x09, + 0xE9, 0xE4, 0xF7, 0x0C, 0xF6, 0xD6, 0xCC, 0xF3, 0x4B, 0xC3, 0x8B, 0xD0, + 0xEB, 0xB6, 0xC2, 0xB5, 0xB1, 0xCA, 0x14, 0xA4, 0xBF, 0xE8, 0x86, 0xB1, + 0x0B, 0xF8, 0xFF, 0xCC, 0x28, 0x02, 0x26, 0xF1, 0x79, 0x07, 0x4E, 0x0D, + 0xE9, 0xFA, 0x0A, 0x04, 0xAE, 0xFA, 0x35, 0xF7, 0x3F, 0x08, 0x80, 0xFD, + 0x52, 0xF2, 0x0D, 0xF3, 0xE8, 0xE1, 0x3D, 0xE5, 0x5A, 0x00, 0x26, 0xF7, + 0x3C, 0x07, 0xB2, 0x04, 0x34, 0xEB, 0x2B, 0x00, 0x19, 0xED, 0x85, 0x15, + 0x04, 0xFE, 0x31, 0x2B, 0x0B, 0xFA, 0xAB, 0x1F, 0x36, 0xF8, 0x0A, 0x12, + 0x7C, 0xFF, 0x90, 0x0A, 0x2A, 0xF4, 0xD3, 0xFC, 0x7C, 0xD4, 0x8C, 0xE3, + 0x4B, 0xC1, 0x01, 0xD5, 0xE4, 0xCE, 0x09, 0xE0, 0xAD, 0xF0, 0x79, 0xFE, + 0x21, 0x18, 0x15, 0x22, 0xC7, 0x35, 0xF2, 0x37, 0x6A, 0x42, 0x08, 0x46, + 0xC6, 0x41, 0x50, 0x42, 0xF5, 0x31, 0x03, 0x22, 0x92, 0x1A, 0xB0, 0xF9, + 0xFB, 0x02, 0x86, 0xDB, 0x46, 0xF3, 0x09, 0xD4, 0xEB, 0xEB, 0xA5, 0xDA, + 0x80, 0xE8, 0x2A, 0xEF, 0x77, 0xF6, 0x46, 0x0E, 0xAC, 0x12, 0xAC, 0x2A, + 0x21, 0x25, 0xEC, 0x37, 0x6D, 0x2A, 0x99, 0x37, 0x07, 0x26, 0x17, 0x30, + 0x13, 0x18, 0x66, 0x12, 0x11, 0x03, 0xE6, 0xF1, 0x08, 0xFB, 0x22, 0xEE, + 0x16, 0x0D, 0x7D, 0xF9, 0x8C, 0x22, 0x28, 0x06, 0x29, 0x26, 0xE4, 0x18, + 0x52, 0x21, 0xCA, 0x22, 0x31, 0x18, 0x99, 0x0E, 0x0B, 0x07, 0x77, 0xFB, + 0x0E, 0x02, 0xAB, 0xFB, 0x96, 0xF7, 0x28, 0xED, 0xFF, 0xE2, 0xAC, 0xF1, + 0xE8, 0xFC, 0x5F, 0x1B, 0x51, 0x23, 0xDD, 0x25, 0x72, 0x27, 0x0B, 0x0F, + 0x16, 0x2A, 0x00, 0x0F, 0x00, 0x2A, 0x58, 0x23, 0xBF, 0x11, 0xC1, 0x25, + 0xD1, 0xFE, 0x79, 0x17, 0x6F, 0x0C, 0x45, 0x0B, 0x52, 0x13, 0x4D, 0xFA, + 0x8F, 0xF9, 0xDD, 0xE6, 0xD3, 0xD8, 0x83, 0xD2, 0x70, 0xCD, 0x63, 0xD6, + 0xF6, 0xE0, 0x13, 0xF4, 0xBB, 0xF1, 0x23, 0x09, 0x62, 0xFF, 0x53, 0x25, + 0xA9, 0x23, 0x7D, 0x4A, 0x13, 0x33, 0xD1, 0x4A, 0x5E, 0x29, 0x65, 0x2B, + 0x75, 0x17, 0xAB, 0x14, 0x2D, 0xF5, 0xD3, 0xEC, 0xBC, 0xCE, 0xBA, 0xC6, + 0xD7, 0xC7, 0x20, 0xCA, 0x30, 0xDE, 0x3F, 0xCA, 0xE0, 0xEA, 0xD4, 0xCC, + 0xA9, 0xF9, 0x30, 0xF3, 0x9C, 0x0E, 0xDE, 0x0B, 0xD0, 0x13, 0x32, 0x05, + 0x1F, 0x07, 0x28, 0xFF, 0x0A, 0xEB, 0x53, 0xF7, 0x8A, 0xCA, 0x60, 0xE4, + 0x81, 0xC7, 0x85, 0xD5, 0x26, 0xEE, 0x67, 0xDE, 0x28, 0x16, 0xFC, 0xF1, + 0x2E, 0x25, 0xB0, 0xFA, 0xBF, 0x2C, 0x96, 0x06, 0x2C, 0x15, 0xF0, 0x01, + 0x12, 0xE8, 0x01, 0xF2, 0x03, 0xDA, 0x58, 0xF7, 0xCC, 0xC8, 0xA4, 0xEE, + 0x4B, 0xB9, 0x53, 0xDD, 0xB8, 0xE9, 0xBD, 0xF5, 0x65, 0x16, 0xE5, 0x0E, + 0x7C, 0x04, 0x1B, 0x02, 0xCE, 0xF8, 0x15, 0x0A, 0x24, 0x0B, 0x55, 0x23, + 0x4B, 0x03, 0x13, 0x1C, 0xC2, 0xF3, 0xB2, 0x06, 0x83, 0x00, 0x1F, 0x07, + 0x47, 0x08, 0x13, 0xF8, 0x5A, 0xF9, 0xE7, 0xCA, 0x9C, 0xDA, 0xC6, 0xA8, + 0x46, 0xC3, 0x66, 0x9F, 0x8B, 0xC5, 0x7F, 0xAE, 0xE2, 0xD4, 0xAB, 0xCB, + 0xEF, 0xF1, 0x5A, 0xF7, 0x9E, 0x1E, 0xD1, 0x2A, 0xA1, 0x2E, 0xDF, 0x35, + 0xDC, 0x1C, 0x27, 0x21, 0xD9, 0x09, 0x90, 0x01, 0xCA, 0xE8, 0x4C, 0xD0, + 0x51, 0xC4, 0x73, 0xB5, 0x21, 0xCA, 0x60, 0xBF, 0xFB, 0xE4, 0x26, 0xD7, + 0xE3, 0xF5, 0x50, 0xF4, 0x9D, 0x08, 0x19, 0x12, 0x3A, 0x11, 0xFB, 0x1D, + 0x00, 0x04, 0x76, 0x1B, 0x3C, 0xF7, 0x7A, 0x0F, 0xB6, 0xE8, 0x87, 0xF8, + 0xED, 0xD5, 0xBD, 0xDB, 0x7D, 0xD5, 0x81, 0xD6, 0x64, 0xE8, 0x1E, 0xEB, + 0x6B, 0xF2, 0xEB, 0xFD, 0xF0, 0xF6, 0xAF, 0x11, 0x4F, 0x07, 0xAA, 0x2F, + 0x8E, 0x06, 0x0B, 0x33, 0x6A, 0xFD, 0x72, 0x17, 0x31, 0x03, 0x4F, 0x0F, + 0x62, 0xF4, 0x95, 0xFC, 0xAD, 0xDC, 0x74, 0xD4, 0x74, 0xF6, 0xC2, 0xD5, + 0xC2, 0x13, 0x57, 0x00, 0xA3, 0x04, 0xBC, 0x10, 0xCB, 0x07, 0xCC, 0x0F, + 0xBD, 0x2C, 0x90, 0x2F, 0xC1, 0x34, 0xF5, 0x3A, 0x9D, 0x27, 0xFA, 0x14, + 0x5C, 0x27, 0xB3, 0xFB, 0x2D, 0x1A, 0x00, 0xFA, 0xF8, 0xFA, 0xAE, 0xEE, + 0xDE, 0xDB, 0xAB, 0xD8, 0x8B, 0xC8, 0xF1, 0xD3, 0xB2, 0xD7, 0xF5, 0xE4, + 0x4D, 0xFA, 0x4B, 0xFA, 0x34, 0x1C, 0x94, 0x16, 0x6F, 0x39, 0x17, 0x35, + 0x7F, 0x4A, 0xA6, 0x43, 0x93, 0x4E, 0xFE, 0x39, 0x14, 0x41, 0x2D, 0x25, + 0xF2, 0x17, 0x99, 0x14, 0x9F, 0xEE, 0x71, 0x01, 0x5C, 0xE8, 0xEF, 0xF2, + 0x37, 0xF9, 0xB9, 0xF6, 0x88, 0x01, 0x16, 0x09, 0xC0, 0x17, 0xE0, 0x22, + 0xCB, 0x3F, 0xE4, 0x27, 0x76, 0x48, 0xA4, 0x16, 0xFE, 0x3A, 0x74, 0x09, + 0x08, 0x22, 0xAD, 0xFD, 0x5D, 0xF9, 0x81, 0xEE, 0xC3, 0xDF, 0xD6, 0xE1, + 0x1E, 0xF2, 0x4E, 0xEE, 0xB9, 0x0E, 0xFD, 0x0F, 0xE6, 0x19, 0x6A, 0x28, + 0x4E, 0x23, 0xCE, 0x34, 0x4D, 0x28, 0x7A, 0x31, 0x53, 0x17, 0x2E, 0x16, + 0xDE, 0x09, 0x5E, 0x01, 0x0B, 0x06, 0x85, 0x03, 0x80, 0xEE, 0x95, 0x00, + 0xAE, 0xEF, 0xA6, 0x06, 0x53, 0x19, 0x74, 0x28, 0x03, 0x28, 0xED, 0x36, + 0xB8, 0x1B, 0x1E, 0x23, 0x2C, 0x27, 0x96, 0x1F, 0xF1, 0x2E, 0xE0, 0x26, + 0xFB, 0x17, 0xCB, 0x19, 0x0E, 0x04, 0x34, 0x0B, 0xDC, 0xFA, 0x8B, 0x0C, + 0x60, 0xE8, 0x96, 0x00, 0x65, 0xCB, 0x02, 0xE8, 0xAD, 0xBA, 0x63, 0xCB, + 0xA8, 0xC2, 0x03, 0xC2, 0x3E, 0xDF, 0xEB, 0xDE, 0xE4, 0x06, 0xB0, 0x00, + 0xCA, 0x2C, 0xBF, 0x18, 0xA7, 0x4E, 0x12, 0x2B, 0x2D, 0x4E, 0xD8, 0x2F, + 0x7E, 0x30, 0xC7, 0x1C, 0x84, 0x14, 0xB3, 0xFA, 0x79, 0xF4, 0x70, 0xDF, + 0x14, 0xDB, 0x01, 0xD5, 0xCD, 0xE0, 0xB0, 0xD3, 0x99, 0xEF, 0x5E, 0xDD, + 0x21, 0xF9, 0xA1, 0xF1, 0x2D, 0x0D, 0xB9, 0x09, 0x5A, 0x17, 0x71, 0x0B, + 0x08, 0x10, 0x3E, 0xFE, 0xC7, 0x00, 0x61, 0xF9, 0xA7, 0xE9, 0x6F, 0xEB, + 0xB3, 0xD0, 0xFF, 0xCF, 0x1E, 0xD2, 0x9B, 0xCE, 0x95, 0xEC, 0x8C, 0xF0, + 0x04, 0xF9, 0xC7, 0x03, 0x43, 0x05, 0xD3, 0x0D, 0x84, 0x17, 0xE0, 0x29, + 0xA5, 0x0B, 0x4D, 0x2A, 0x20, 0xEE, 0xB2, 0x14, 0x5F, 0xEB, 0xFB, 0x15, + 0xFC, 0xDA, 0xDD, 0x03, 0x0A, 0xC0, 0x06, 0xDA, 0x27, 0xE4, 0x5B, 0xE5, + 0xEB, 0x11, 0x5C, 0x07, 0xF1, 0x18, 0xDF, 0xFF, 0xE7, 0x28, 0x04, 0x03, + 0xFC, 0x3B, 0x3F, 0x1E, 0xEB, 0x1D, 0xE0, 0x18, 0x17, 0xEC, 0x63, 0x00, + 0x01, 0xD1, 0x98, 0xF5, 0xDC, 0xC2, 0x04, 0xE5, 0x0C, 0xB7, 0x6E, 0xC8, + 0xF2, 0xB2, 0x73, 0xB2, 0xAA, 0xB4, 0xE6, 0xA6, 0x19, 0xC3, 0xC7, 0xBA, + 0xB6, 0xDF, 0x05, 0xEA, 0x69, 0x00, 0x19, 0x0A, 0xC9, 0x26, 0x01, 0x1F, + 0xDB, 0x48, 0x8A, 0x24, 0x97, 0x47, 0x85, 0x10, 0xF3, 0x22, 0x09, 0xF2, + 0x1B, 0xFB, 0x3F, 0xCF, 0xE4, 0xE2, 0x4D, 0xAE, 0xB4, 0xD3, 0x4C, 0x9D, + 0x0D, 0xCD, 0xA2, 0xAE, 0x49, 0xD6, 0x5B, 0xD9, 0x81, 0xED, 0x41, 0x00, + 0xBA, 0xF5, 0xAF, 0x0F, 0x72, 0xE7, 0x0A, 0x05, 0xD0, 0xDB, 0x38, 0xEF, + 0x8F, 0xC9, 0x96, 0xE2, 0x0C, 0xB7, 0x56, 0xD3, 0xA7, 0xB4, 0x20, 0xC9, + 0x06, 0xDC, 0x92, 0xF0, 0xCD, 0x0C, 0x40, 0x24, 0x7E, 0x11, 0x71, 0x2F, + 0x39, 0x15, 0x1B, 0x2E, 0xE0, 0x0F, 0x35, 0x1E, 0x30, 0xE6, 0x3B, 0xFF, + 0xF3, 0xD1, 0x0B, 0xFE, 0xE2, 0xD7, 0xBA, 0xFE, 0x1A, 0xD4, 0x6D, 0xDE, + 0x76, 0xE6, 0x7F, 0xD7, 0x5F, 0x0D, 0xA4, 0xF8, 0xB2, 0x0A, 0xE8, 0x05, + 0xF5, 0xF5, 0x28, 0xFC, 0xDB, 0x0C, 0x79, 0x09, 0x9C, 0x25, 0x0A, 0x0C, + 0x4E, 0x16, 0x47, 0xF8, 0x5B, 0x05, 0xCC, 0xED, 0xF8, 0xFB, 0xB7, 0xDA, + 0x33, 0xEC, 0xE8, 0xC7, 0x00, 0xDD, 0xA6, 0xBE, 0xFC, 0xD5, 0x01, 0xBC, + 0x47, 0xDA, 0x9D, 0xCA, 0xC4, 0xEE, 0x2F, 0xEA, 0x4B, 0x07, 0xF6, 0x09, + 0x05, 0x14, 0x67, 0x22, 0x99, 0x21, 0x0E, 0x33, 0x4E, 0x2D, 0xE9, 0x38, + 0x38, 0x28, 0xFC, 0x26, 0xAC, 0x15, 0xDB, 0x09, 0x68, 0xFF, 0x3A, 0xF8, + 0xC8, 0xE6, 0xBD, 0xE6, 0xE7, 0xDA, 0xD8, 0xCF, 0x1A, 0xE5, 0x67, 0xC8, + 0x01, 0xF2, 0x15, 0xE0, 0x42, 0xFB, 0xD0, 0x00, 0x54, 0xFC, 0x33, 0x0A, + 0x61, 0xF5, 0xD3, 0x03, 0x2E, 0xED, 0xE2, 0xFC, 0x81, 0xE6, 0xBF, 0xEA, + 0x51, 0xDC, 0xCC, 0xC9, 0xFD, 0xDE, 0xEF, 0xCD, 0xCB, 0x00, 0xB7, 0xFB, + 0x5F, 0x1D, 0xC9, 0x1A, 0x78, 0x27, 0x2D, 0x2A, 0xA0, 0x34, 0x96, 0x33, + 0xE4, 0x2D, 0x3E, 0x20, 0x2F, 0x14, 0x84, 0xF8, 0xCA, 0x0D, 0x9E, 0xE8, + 0xAF, 0xF9, 0x46, 0xE2, 0xDF, 0xDE, 0xAA, 0xD5, 0x0B, 0xF7, 0x5C, 0xEF, + 0x02, 0x0B, 0x08, 0x17, 0xA1, 0xEE, 0x18, 0x1B, 0x4E, 0xE0, 0xFB, 0x1F, + 0xEE, 0xF0, 0x00, 0x33, 0x06, 0xF2, 0xFC, 0x36, 0xAE, 0xEB, 0x3B, 0x29, + 0xD6, 0xFA, 0xB9, 0x18, 0x4A, 0x0A, 0x9A, 0x09, 0x50, 0xFC, 0xA2, 0xF3, + 0xA8, 0xDC, 0xAC, 0xD6, 0xAE, 0xC3, 0x20, 0xC9, 0x28, 0xCF, 0x4F, 0xDA, + 0xDA, 0xF7, 0xDC, 0xFC, 0x8F, 0x14, 0x24, 0x20, 0x33, 0x2E, 0x20, 0x3B, + 0x92, 0x3A, 0xB8, 0x41, 0x77, 0x22, 0x94, 0x2C, 0xE6, 0x05, 0xB0, 0x02, + 0x57, 0xF8, 0x21, 0xDE, 0x60, 0xE9, 0x56, 0xD0, 0xE6, 0xDD, 0x3F, 0xD6, + 0x86, 0xE8, 0x6C, 0xE7, 0x11, 0x01, 0x2B, 0xFC, 0x74, 0x18, 0xE4, 0x0B, + 0x54, 0x23, 0xFF, 0x04, 0xE7, 0x26, 0x2D, 0xFF, 0x15, 0x25, 0xDD, 0xFC, + 0x28, 0x1A, 0xD9, 0xF7, 0x9F, 0x07, 0x95, 0xF9, 0x4C, 0xF1, 0x2F, 0xF8, + 0xB6, 0xF3, 0xB8, 0x0B, 0xB6, 0x02, 0x65, 0x30, 0x86, 0x0B, 0x45, 0x3E, + 0xD3, 0x2D, 0xC6, 0x3E, 0x3F, 0x42, 0xFF, 0x3C, 0xC2, 0x2E, 0xC7, 0x2D, + 0xC9, 0x31, 0xD4, 0x15, 0x54, 0x35, 0x46, 0xF9, 0x32, 0x0D, 0x2F, 0xDE, + 0x0E, 0xF4, 0x29, 0xE7, 0x4F, 0x0D, 0x72, 0x19, 0x83, 0x19, 0x29, 0x2F, + 0x27, 0x12, 0x76, 0x34, 0xB2, 0x2B, 0x44, 0x51, 0xEE, 0x35, 0xAE, 0x4D, + 0x2D, 0x23, 0xD7, 0x28, 0xDA, 0x23, 0x69, 0x0E, 0xD6, 0x2C, 0xB1, 0x01, + 0x95, 0x29, 0xB4, 0xF3, 0xF7, 0x0F, 0x9B, 0xEE, 0xBB, 0xEF, 0x99, 0xF8, + 0x75, 0xEB, 0xF5, 0x00, 0x62, 0x0A, 0x59, 0x10, 0xF7, 0x33, 0xAB, 0x2A, + 0x41, 0x54, 0x92, 0x48, 0x90, 0x66, 0x4A, 0x5C, 0x40, 0x59, 0x38, 0x58, + 0xF3, 0x38, 0xC1, 0x46, 0xB8, 0x15, 0x7B, 0x2A, 0x3B, 0xE9, 0x44, 0x11, + 0x8D, 0xCE, 0x4C, 0xFE, 0x13, 0xD0, 0x10, 0xF6, 0x74, 0xE8, 0x26, 0x07, + 0xB8, 0x0A, 0x54, 0x1C, 0x7C, 0x20, 0x22, 0x35, 0x3C, 0x2F, 0x7C, 0x3C, + 0x19, 0x38, 0x97, 0x2A, 0xAD, 0x29, 0xBF, 0x1C, 0xCC, 0x08, 0x2D, 0x10, + 0xFB, 0xE2, 0xE6, 0xFC, 0x04, 0xDB, 0xF5, 0xF4, 0xC3, 0xFD, 0x2A, 0x0B, + 0xA9, 0x19, 0x98, 0x24, 0x18, 0x27, 0xCE, 0x2B, 0xBB, 0x2C, 0x17, 0x30, + 0x21, 0x12, 0x0B, 0x17, 0xF3, 0xFB, 0x73, 0xF8, 0x36, 0x01, 0x4A, 0xFB, + 0x76, 0xF1, 0x77, 0xE3, 0x91, 0xE1, 0x3B, 0xC3, 0xA4, 0xF8, 0x81, 0xDD, + 0xA9, 0x11, 0x58, 0x04, 0xBD, 0x15, 0x00, 0x04, 0xBA, 0x29, 0x16, 0x0B, + 0x65, 0x45, 0x46, 0x25, 0x67, 0x37, 0x4E, 0x1E, 0x88, 0x1A, 0x3E, 0x05, + 0x45, 0x05, 0xD8, 0xFA, 0x6A, 0xE8, 0xF1, 0xEE, 0xCA, 0xD2, 0x4F, 0xDA, + 0x32, 0xC3, 0xC2, 0xC2, 0x83, 0xB5, 0xC6, 0xB0, 0xD8, 0xCE, 0x6F, 0xC7, + 0xFD, 0xF8, 0x04, 0xF3, 0x97, 0x0D, 0x36, 0x09, 0x4F, 0x21, 0x73, 0x20, + 0x09, 0x31, 0x4B, 0x36, 0x29, 0x22, 0xB2, 0x1D, 0x4F, 0xFC, 0xB4, 0xED, + 0x70, 0xD8, 0xDB, 0xD9, 0x52, 0xBA, 0x4F, 0xD1, 0x15, 0xAA, 0x28, 0xC5, + 0xB4, 0xBA, 0x47, 0xD6, 0x9A, 0xE0, 0x52, 0xF4, 0xD4, 0xFB, 0xFB, 0xFC, + 0x02, 0x00, 0x97, 0x04, 0xA7, 0xFA, 0xEC, 0x09, 0x42, 0xF3, 0xF5, 0xF3, + 0x99, 0xE5, 0x4A, 0xD1, 0xFC, 0xCF, 0xE0, 0xB8, 0xA4, 0xC4, 0x75, 0xB1, + 0xB3, 0xD5, 0xF1, 0xCC, 0xBD, 0xEF, 0x69, 0xF7, 0xBF, 0xF8, 0xC7, 0x0C, + 0x08, 0xF8, 0x83, 0x13, 0xB2, 0xF3, 0xC4, 0x07, 0x30, 0xDE, 0x91, 0xE0, + 0x33, 0xD6, 0x87, 0xCC, 0x3E, 0xE7, 0x7A, 0xD1, 0x72, 0xD6, 0xDA, 0xBF, + 0x55, 0xBF, 0xF4, 0xBB, 0x41, 0xE6, 0xA5, 0xE0, 0xA1, 0x07, 0x87, 0xEF, + 0xF3, 0xF9, 0xCD, 0xE8, 0x81, 0x02, 0x3C, 0xFF, 0x23, 0x16, 0x43, 0x08, + 0x6B, 0x10, 0xBB, 0xF4, 0xA4, 0x08, 0x0E, 0xEA, 0x81, 0xFC, 0xF0, 0xEA, + 0x65, 0xE1, 0xC2, 0xED, 0xFB, 0xC6, 0xC0, 0xED, 0x39, 0xB6, 0x3E, 0xE6, + 0xB9, 0xBA, 0xBE, 0xE3, 0x6E, 0xDC, 0x7C, 0xFD, 0x41, 0xFD, 0xCA, 0x1B, + 0xA2, 0x0D, 0xD2, 0x20, 0x57, 0x1F, 0x92, 0x21, 0xCE, 0x2C, 0xA0, 0x24, + 0x79, 0x27, 0xC3, 0x13, 0x61, 0x13, 0x29, 0xFC, 0xCD, 0xFA, 0xD3, 0xF3, + 0xEF, 0xF0, 0x7C, 0xFA, 0x5A, 0xF4, 0x78, 0xFC, 0xC5, 0xFF, 0x1D, 0xFE, + 0xC3, 0x15, 0xA2, 0x13, 0xB6, 0x26, 0x3D, 0x26, 0x1A, 0x27, 0x2A, 0x21, + 0x24, 0x18, 0x3E, 0x1F, 0xCE, 0x0C, 0xE3, 0x18, 0x3D, 0x06, 0x05, 0xFC, + 0xBA, 0xF7, 0x41, 0xE2, 0x38, 0xF1, 0x95, 0xE1, 0x17, 0x03, 0xBA, 0x00, + 0xE3, 0x0E, 0xB2, 0x23, 0x04, 0x0C, 0x27, 0x36, 0x8D, 0x15, 0x33, 0x41, + 0xDB, 0x19, 0xAB, 0x2C, 0x24, 0x10, 0x61, 0x0F, 0xD6, 0x0C, 0xDB, 0x16, + 0x5D, 0xFC, 0xA8, 0x0D, 0xA7, 0xDF, 0x8D, 0xEF, 0x89, 0xF1, 0xD7, 0xFD, + 0xED, 0x1D, 0x3A, 0x1F, 0xF1, 0x24, 0x8F, 0x17, 0xAE, 0x20, 0xC5, 0x06, + 0xB4, 0x2D, 0x2F, 0x0F, 0x61, 0x29, 0x27, 0x0E, 0x5F, 0x14, 0xBD, 0xF4, + 0x92, 0x07, 0x7D, 0xE4, 0x6E, 0xFF, 0x1B, 0xE9, 0x88, 0xF5, 0xD4, 0xE4, + 0x62, 0xEB, 0x7F, 0xDA, 0xC4, 0xD8, 0xCA, 0xD3, 0x45, 0xD2, 0x83, 0xD6, + 0xC4, 0xF7, 0x62, 0xE5, 0x88, 0x21, 0xFE, 0xF6, 0x81, 0x2B, 0x6F, 0x11, + 0x90, 0x30, 0x22, 0x2F, 0x66, 0x2E, 0x53, 0x35, 0x72, 0x13, 0x23, 0x1E, + 0x8A, 0xF3, 0x39, 0x05, 0xB1, 0xDD, 0x98, 0xF7, 0xCD, 0xD0, 0xA3, 0xEA, + 0x70, 0xD5, 0x0E, 0xE3, 0x9B, 0xE6, 0xAE, 0xEF, 0x49, 0xF7, 0xD1, 0x0C, + 0x6A, 0x05, 0xD0, 0x20, 0x41, 0x07, 0x22, 0x1B, 0x6A, 0xF6, 0x6C, 0x0F, + 0xFD, 0xD9, 0xA3, 0x00, 0x97, 0xC1, 0x92, 0xE8, 0x1E, 0xBE, 0x40, 0xD6, + 0x25, 0xE1, 0xD4, 0xDF, 0x92, 0x08, 0x5A, 0xF8, 0x08, 0x0B, 0xD0, 0x02, + 0x30, 0x0F, 0xA8, 0x14, 0xFA, 0x21, 0x54, 0x13, 0x9F, 0x1A, 0x05, 0xED, + 0xE8, 0x0C, 0x8C, 0xDD, 0x09, 0x0C, 0xA6, 0xE9, 0x18, 0xF7, 0xF1, 0xE5, + 0xFD, 0xE9, 0xE8, 0xDD, 0x1D, 0x03, 0x22, 0xF9, 0x08, 0x0D, 0x95, 0x19, + 0xC2, 0xFB, 0xC6, 0x0F, 0xA9, 0x08, 0x2B, 0x09, 0xD9, 0x29, 0xAB, 0x16, + 0x6A, 0x2F, 0x93, 0x03, 0x7E, 0x1B, 0x62, 0xE2, 0xDA, 0xF6, 0xDF, 0xD8, + 0x15, 0xD6, 0x25, 0xD9, 0x4D, 0xC5, 0x05, 0xD6, 0xAE, 0xB2, 0xEA, 0xCD, + 0x66, 0xA8, 0xD7, 0xC1, 0x21, 0xC2, 0xB6, 0xCD, 0x95, 0xED, 0x0E, 0xF2, + 0x11, 0x06, 0x3A, 0x01, 0x5F, 0x14, 0xAD, 0x0A, 0x63, 0x1D, 0x58, 0x29, + 0xF0, 0x0D, 0xE3, 0x2D, 0xA4, 0xF9, 0xCE, 0x0A, 0x5A, 0xF6, 0xE9, 0xF3, + 0xF6, 0xF2, 0x5D, 0xE9, 0x7D, 0xE6, 0x64, 0xD0, 0xED, 0xD4, 0xE7, 0xC7, + 0x35, 0xD1, 0xAE, 0xDF, 0x11, 0xE0, 0xB6, 0xF5, 0x6E, 0xEC, 0xEB, 0xFA, + 0xB6, 0xF0, 0x62, 0x06, 0x29, 0xF4, 0x44, 0x0C, 0x90, 0xEB, 0xBB, 0xFC, + 0xBB, 0xD1, 0x1A, 0xEA, 0xB2, 0xC9, 0x3E, 0xE0, 0xD0, 0xE5, 0xC2, 0xF7, + 0x14, 0x0D, 0x69, 0x10, 0x9E, 0x1E, 0x09, 0x09, 0xBF, 0x27, 0xB7, 0x0A, + 0xB2, 0x25, 0x7D, 0x0A, 0xE2, 0xFD, 0x9C, 0xFA, 0x8C, 0xE2, 0x6A, 0xF8, + 0x04, 0xEB, 0x58, 0xFB, 0xBE, 0xEE, 0x8D, 0xEA, 0x16, 0xFD, 0x9E, 0xE0, + 0x47, 0x17, 0x89, 0xF9, 0xEA, 0x08, 0xE6, 0xFD, 0x5A, 0xEA, 0x7E, 0xEF, + 0x2D, 0xF3, 0xDD, 0x0A, 0xB2, 0x0E, 0x74, 0x27, 0x0A, 0x18, 0x38, 0x27, + 0x16, 0x18, 0x1B, 0x19, 0xC8, 0x10, 0x7B, 0x06, 0x66, 0xFD, 0x0F, 0xF4, + 0xC7, 0xE5, 0x73, 0xD3, 0x81, 0xCB, 0x68, 0xB6, 0xC1, 0xC5, 0x00, 0xB6, + 0x7C, 0xE6, 0x27, 0xDA, 0x60, 0x13, 0xE0, 0x0C, 0xF9, 0x2E, 0x27, 0x34, + 0xEF, 0x45, 0x82, 0x58, 0xA7, 0x50, 0x43, 0x61, 0x16, 0x35, 0xE6, 0x45, + 0x87, 0x12, 0xF5, 0x27, 0x34, 0x04, 0xC6, 0x0C, 0x15, 0xF9, 0x96, 0xED, + 0xB3, 0xF6, 0x01, 0xDC, 0xF9, 0xFD, 0x26, 0xE5, 0x71, 0x02, 0x95, 0xFE, + 0xA3, 0x03, 0xD4, 0x13, 0xEE, 0x06, 0x33, 0x15, 0xBA, 0x0F, 0xEE, 0x0F, + 0xF4, 0x0B, 0x59, 0x09, 0x4D, 0x09, 0x3C, 0xF5, 0xFC, 0x0A, 0x3E, 0xDE, + 0x5B, 0x05, 0x85, 0xE0, 0xD9, 0x17, 0xE1, 0x02, 0x18, 0x2B, 0xB9, 0x2D, + 0x6B, 0x28, 0x65, 0x46, 0x50, 0x31, 0xA3, 0x48, 0xC0, 0x33, 0x41, 0x34, + 0xDF, 0x1F, 0x3D, 0x1D, 0x69, 0x13, 0xDD, 0x14, 0xA8, 0x0A, 0x21, 0xFC, + 0x7E, 0xF8, 0x25, 0xDA, 0x71, 0xFB, 0x5C, 0xED, 0x8F, 0x0D, 0x30, 0x20, + 0x60, 0x03, 0xCE, 0x31, 0x71, 0x03, 0x9B, 0x36, 0xFA, 0x2B, 0x42, 0x4B, + 0x40, 0x36, 0x3F, 0x4A, 0xB1, 0x1E, 0x13, 0x30, 0x66, 0x14, 0xA3, 0x1A, + 0x61, 0x0A, 0x73, 0xFF, 0xFE, 0xF4, 0xAD, 0xE8, 0x9E, 0xDE, 0x9E, 0xE4, + 0x0E, 0xCB, 0x2F, 0xE6, 0xA9, 0xD3, 0x1B, 0xF2, 0x5C, 0x01, 0x99, 0x03, + 0xDA, 0x29, 0x85, 0x12, 0x9B, 0x3F, 0xF2, 0x29, 0xA1, 0x4A, 0xD2, 0x3D, + 0x25, 0x3F, 0x87, 0x31, 0xE5, 0x1F, 0x15, 0x14, 0x86, 0x02, 0x85, 0x00, + 0x9F, 0xED, 0x1B, 0xF0, 0x2C, 0xE5, 0xA9, 0xE8, 0x07, 0xED, 0xD8, 0xEC, + 0x78, 0xF7, 0xB9, 0xF9, 0x0D, 0x01, 0xD1, 0x0E, 0x4B, 0x06, 0x4C, 0x15, + 0xFF, 0x08, 0x1B, 0x05, 0x18, 0x09, 0x59, 0xED, 0x82, 0x06, 0x69, 0xD8, + 0xBD, 0x0B, 0xD0, 0xCC, 0x1F, 0x03, 0x7A, 0xCF, 0x07, 0xFE, 0x70, 0xF8, + 0x8E, 0x0E, 0x39, 0x26, 0x5A, 0x0C, 0xBC, 0x34, 0x65, 0x0A, 0xBF, 0x40, + 0x0E, 0x18, 0x05, 0x37, 0x23, 0x10, 0x47, 0x10, 0x8A, 0x06, 0xA0, 0xF4, + 0x0A, 0x0B, 0x7F, 0xED, 0x76, 0xF6, 0x00, 0xDC, 0x8A, 0xD6, 0x1F, 0xD2, + 0xAF, 0xE9, 0x17, 0xED, 0xF9, 0x0B, 0xF8, 0xF1, 0xD3, 0x06, 0x33, 0xE2, + 0x9D, 0x0D, 0x4E, 0xF8, 0xB2, 0x1A, 0xBB, 0x0A, 0x90, 0x01, 0x11, 0xFF, + 0x19, 0xED, 0x7D, 0xF7, 0xD9, 0xF0, 0xE3, 0xF2, 0xCB, 0xEB, 0x91, 0xE3, + 0x12, 0xD9, 0xE2, 0xD0, 0xE2, 0xC8, 0x82, 0xC6, 0x22, 0xC1, 0x98, 0xCB, + 0x55, 0xC9, 0x70, 0xE4, 0xDB, 0xE4, 0x0C, 0xFD, 0xBE, 0xFD, 0xE9, 0x0D, + 0x8D, 0x0E, 0xDC, 0x2B, 0x68, 0x14, 0x68, 0x3F, 0x55, 0xFE, 0x5C, 0x29, + 0x83, 0xDE, 0x29, 0x04, 0x06, 0xC9, 0x64, 0xE6, 0xFE, 0xB8, 0xE8, 0xC8, + 0xFA, 0xB9, 0x0D, 0xC5, 0x7D, 0xCE, 0xD7, 0xD7, 0xA1, 0xE8, 0x38, 0xE4, + 0x3F, 0x04, 0x49, 0xF0, 0x4D, 0x18, 0x05, 0xF9, 0x29, 0x19, 0x7D, 0xF4, + 0x3B, 0xF9, 0x83, 0xE1, 0xCA, 0xD8, 0x9A, 0xCC, 0xEB, 0xCC, 0x74, 0xC0, + 0xB9, 0xC9, 0xB8, 0xBA, 0x22, 0xE6, 0x4F, 0xD5, 0x56, 0x04, 0xFE, 0xF8, + 0xA1, 0x0C, 0xDB, 0x01, 0x90, 0x0D, 0xDB, 0x11, 0xC0, 0x02, 0xBA, 0x17, + 0x9F, 0xFA, 0x64, 0x0B, 0x39, 0x03, 0xCE, 0x07, 0xB6, 0x03, 0x1E, 0xF2, + 0x8A, 0xEB, 0x06, 0xD8, 0x95, 0xE9, 0xD0, 0xEC, 0x9F, 0xFE, 0xF9, 0x11, + 0xDF, 0xF2, 0x31, 0x0C, 0xF9, 0xEA, 0xEA, 0x01, 0x24, 0x0B, 0x11, 0x25, + 0x23, 0x19, 0x65, 0x2C, 0x06, 0x10, 0xDE, 0x06, 0x52, 0x0F, 0x26, 0xF6, + 0x89, 0xFE, 0x55, 0xE5, 0x0D, 0xD5, 0x97, 0xD5, 0xF2, 0xB4, 0x64, 0xE1, + 0x46, 0xB2, 0x10, 0xED, 0xAF, 0xCD, 0xB4, 0xFC, 0x09, 0x00, 0x81, 0x18, + 0xAF, 0x2D, 0x2A, 0x2F, 0x87, 0x4E, 0xFA, 0x39, 0x42, 0x58, 0x73, 0x31, + 0x05, 0x39, 0x9B, 0x18, 0xCE, 0x0D, 0x4A, 0xFD, 0x8F, 0xEE, 0x45, 0xE9, + 0x98, 0xD3, 0xFB, 0xDC, 0xC4, 0xC6, 0xB0, 0xD5, 0xC6, 0xD6, 0x3B, 0xDF, + 0x44, 0xEC, 0x6B, 0xEE, 0xC9, 0xFF, 0x13, 0xF8, 0x49, 0x15, 0xDE, 0xFC, + 0xA4, 0x24, 0x64, 0xF5, 0x80, 0x1C, 0x22, 0xE5, 0x62, 0x03, 0x5D, 0xDF, + 0xA2, 0xEF, 0xDE, 0xDA, 0xF4, 0xDC, 0x30, 0xCF, 0x70, 0xE7, 0x57, 0xE2, + 0x95, 0x08, 0xFB, 0x03, 0x1F, 0x0F, 0x9D, 0x13, 0xEB, 0x0C, 0x0A, 0x16, + 0x39, 0x0F, 0xAC, 0x07, 0xB8, 0x09, 0x4A, 0xEB, 0xDD, 0x08, 0x6D, 0xDE, + 0x13, 0x02, 0x77, 0xE4, 0xD6, 0xE8, 0x12, 0xE0, 0x15, 0xE1, 0x31, 0xED, + 0x26, 0xFF, 0xDE, 0x1A, 0x11, 0x0F, 0x05, 0x28, 0xA1, 0xFF, 0xF5, 0x17, + 0xE0, 0x0F, 0x20, 0x25, 0xCB, 0x2B, 0x47, 0x28, 0x6B, 0x1D, 0x53, 0x11, + 0x4D, 0x01, 0x52, 0x06, 0x4A, 0xEB, 0x8E, 0xFA, 0x99, 0xCD, 0xF2, 0xE6, + 0x1D, 0xAE, 0x32, 0xDA, 0xEC, 0x9E, 0x83, 0xD9, 0x26, 0xB5, 0x01, 0xDF, + 0x00, 0xE5, 0x06, 0xF5, 0xC5, 0x0E, 0x07, 0x16, 0x38, 0x34, 0xAF, 0x2B, + 0x4F, 0x44, 0xE1, 0x36, 0x25, 0x33, 0x75, 0x2F, 0x40, 0x0F, 0xA7, 0x1B, + 0xE5, 0xEC, 0x75, 0x0C, 0x65, 0xDB, 0xD9, 0xF4, 0xCC, 0xDA, 0xF3, 0xDB, + 0x32, 0xEC, 0x63, 0xD0, 0xD5, 0x04, 0x7B, 0xCB, 0x41, 0x15, 0x9A, 0xD7, + 0x29, 0x17, 0xAC, 0xEA, 0x93, 0x09, 0xFF, 0xF9, 0x5E, 0xF8, 0xB4, 0x0B, + 0xEE, 0xE3, 0xC7, 0x10, 0x27, 0xD6, 0xB8, 0x06, 0x5A, 0xDE, 0xFD, 0xF7, + 0x1E, 0xF7, 0x47, 0xF9, 0x6E, 0x1B, 0xF9, 0x15, 0xA0, 0x33, 0x2E, 0x22, + 0x59, 0x3F, 0x48, 0x21, 0x84, 0x40, 0xD3, 0x23, 0xBC, 0x25, 0xA6, 0x0B, + 0x1B, 0x08, 0x69, 0x03, 0x99, 0xFE, 0x1F, 0x10, 0xBD, 0xF1, 0xC0, 0xFB, + 0xC7, 0xEB, 0x4B, 0xF4, 0x04, 0x0E, 0x49, 0x0F, 0xCF, 0x2D, 0x3A, 0x14, + 0xCD, 0x27, 0xD0, 0x01, 0xC0, 0x23, 0x69, 0x0C, 0x0D, 0x2E, 0x26, 0x2A, + 0x96, 0x2F, 0xC3, 0x2A, 0x9C, 0x20, 0xAD, 0x22, 0x4B, 0x11, 0x9F, 0x1B, + 0xF0, 0x07, 0x49, 0x0A, 0xDD, 0xF2, 0x64, 0x00, 0x6C, 0xE0, 0x94, 0xEA, + 0xCA, 0xF4, 0xFF, 0xDA, 0x72, 0x19, 0xBD, 0xF3, 0x76, 0x26, 0x36, 0x17, + 0xB1, 0x2A, 0x9F, 0x3E, 0xE5, 0x35, 0x77, 0x5E, 0x01, 0x34, 0x8D, 0x60, + 0x0A, 0x26, 0xE2, 0x51, 0x11, 0x18, 0x1C, 0x41, 0x98, 0x08, 0x70, 0x2D, + 0xC1, 0xFF, 0xCF, 0x0D, 0x0D, 0x02, 0x7C, 0xF9, 0x98, 0x05, 0x34, 0x08, + 0x6C, 0x09, 0xE8, 0x17, 0x01, 0x16, 0x02, 0x21, 0x61, 0x26, 0xDD, 0x29, + 0xA6, 0x29, 0xF1, 0x25, 0x65, 0x0E, 0xB6, 0x17, 0x35, 0xF2, 0x91, 0x0B, + 0xA8, 0xEA, 0xFE, 0xFA, 0x70, 0xF0, 0x36, 0xE8, 0x60, 0x0F, 0x19, 0xFC, + 0x5B, 0x2E, 0x31, 0x20, 0x76, 0x40, 0xF4, 0x30, 0xA7, 0x52, 0xCB, 0x35, + 0x51, 0x46, 0x3E, 0x22, 0x95, 0x26, 0xB6, 0x0C, 0x1F, 0x17, 0x64, 0x04, + 0xF9, 0x0A, 0x35, 0xEE, 0x99, 0x03, 0x3B, 0xD5, 0x0A, 0x16, 0x4D, 0xDD, + 0xA1, 0x2F, 0x78, 0x00, 0x02, 0x1C, 0x38, 0x0A, 0x7D, 0xF2, 0xEB, 0x12, + 0x5F, 0xEE, 0x7E, 0x31, 0x05, 0xEB, 0xE4, 0x30, 0x47, 0xE7, 0x3E, 0x22, + 0x27, 0xFC, 0xAB, 0x1F, 0x5F, 0x0D, 0x0E, 0x0F, 0x11, 0x0D, 0xB3, 0xEA, + 0xCC, 0xF8, 0x2A, 0xCF, 0x25, 0xDF, 0x63, 0xCE, 0xC3, 0xCE, 0x8C, 0xD8, + 0x6F, 0xDB, 0xF9, 0xEA, 0xD7, 0x00, 0x5B, 0x06, 0xDB, 0x16, 0xC6, 0x21, + 0x91, 0x17, 0x6B, 0x2E, 0x7C, 0x04, 0xD3, 0x1A, 0x0D, 0xE5, 0xA1, 0xFE, + 0x2B, 0xD3, 0x18, 0xE5, 0xA7, 0xCB, 0xB1, 0xC2, 0x1E, 0xCF, 0x84, 0xAC, + 0x7C, 0xE8, 0x60, 0xAB, 0xBF, 0x03, 0xC3, 0xBE, 0x76, 0x0E, 0x08, 0xDD, + 0x50, 0x0A, 0x44, 0xF2, 0x58, 0x00, 0xC9, 0xF9, 0x34, 0xE9, 0xE8, 0xEB, + 0x7C, 0xCD, 0x26, 0xD3, 0x3E, 0xC4, 0x95, 0xBC, 0x9C, 0xC6, 0xAB, 0xB3, + 0x48, 0xDB, 0xEE, 0xC7, 0x13, 0xF9, 0xEE, 0xE5, 0x9F, 0xFF, 0xCF, 0x00, + 0x2E, 0xF2, 0x3C, 0x1B, 0x64, 0xE5, 0x68, 0x1D, 0x3C, 0xE1, 0x7F, 0x0C, + 0x41, 0xE6, 0x94, 0x02, 0x2B, 0xEC, 0x98, 0xF2, 0xEC, 0xE3, 0x97, 0xD3, + 0xED, 0xE2, 0xDD, 0xDA, 0xC9, 0xF2, 0x02, 0xF7, 0x99, 0xE1, 0x37, 0xE9, + 0x04, 0xC4, 0x00, 0xE0, 0xB5, 0xD1, 0x6E, 0xFB, 0x98, 0xE3, 0x5C, 0x05, + 0x60, 0xDE, 0xB5, 0xEF, 0xB3, 0xE9, 0x13, 0xEF, 0x02, 0xF5, 0xE9, 0xF2, + 0xEA, 0xE0, 0x43, 0xDC, 0xB8, 0xD4, 0x72, 0xC8, 0x28, 0xD6, 0x2F, 0xBC, + 0x11, 0xD9, 0xFD, 0xC2, 0x5F, 0xED, 0xCE, 0xE7, 0x31, 0x13, 0x4B, 0x0F, + 0x05, 0x37, 0x64, 0x20, 0x05, 0x3F, 0xE8, 0x1C, 0xF3, 0x2B, 0x73, 0x10, + 0x99, 0x05, 0x65, 0xF9, 0x25, 0xDA, 0xED, 0xE2, 0x0D, 0xC7, 0x11, 0xD7, + 0xDF, 0xCF, 0x1D, 0xD6, 0x90, 0xEB, 0xB2, 0xEE, 0x2B, 0x05, 0xED, 0x16, + 0xBE, 0x11, 0x85, 0x36, 0x76, 0x1B, 0xA9, 0x3C, 0xD2, 0x1F, 0x38, 0x30, + 0x24, 0x13, 0xB0, 0x16, 0xE6, 0x0A, 0x8A, 0xF0, 0x66, 0x0E, 0x57, 0xCF, + 0x61, 0x04, 0x0F, 0xC4, 0xEF, 0xFE, 0x3E, 0xE4, 0xA5, 0x04, 0x21, 0x1B, + 0x50, 0x04, 0x1C, 0x35, 0xB2, 0x0E, 0x2C, 0x33, 0xC8, 0x17, 0xEB, 0x25, + 0x30, 0x13, 0xDE, 0x18, 0x8A, 0x13, 0x2A, 0x1F, 0x2C, 0x0B, 0x09, 0x15, + 0x9F, 0xFA, 0xBA, 0xF8, 0x41, 0x0B, 0x6D, 0x02, 0x45, 0x29, 0x8B, 0x25, + 0x41, 0x12, 0xC9, 0x28, 0xA1, 0xFB, 0x77, 0x22, 0x9E, 0x21, 0xD8, 0x34, + 0xC2, 0x2F, 0xCF, 0x35, 0x99, 0x18, 0x6A, 0x1A, 0xF4, 0x0F, 0x50, 0x08, + 0xC9, 0xFE, 0x50, 0xF2, 0x47, 0xE2, 0x11, 0xCD, 0xF7, 0xD3, 0x34, 0xC3, + 0xF4, 0xD3, 0x20, 0xD6, 0x05, 0xDF, 0xFA, 0xE7, 0x8F, 0xFD, 0xD3, 0x07, + 0x10, 0x20, 0xB5, 0x35, 0x31, 0x2B, 0x32, 0x45, 0x54, 0x29, 0x2F, 0x39, + 0x59, 0x2B, 0x4E, 0x19, 0xB9, 0x24, 0x99, 0xF0, 0xD9, 0x18, 0xE7, 0xCF, + 0x1D, 0x02, 0x3B, 0xC0, 0x1F, 0xE7, 0x04, 0xD1, 0xC1, 0xDB, 0x18, 0xE1, + 0xA1, 0xE3, 0x7D, 0xF4, 0x46, 0xF3, 0x01, 0x15, 0xF4, 0x02, 0x04, 0x21, + 0x88, 0x13, 0xC0, 0x23, 0xF0, 0x0A, 0x30, 0x1C, 0x17, 0xF6, 0x28, 0x01, + 0xFD, 0xE8, 0x6B, 0xE6, 0x06, 0xE8, 0xB1, 0xD9, 0x07, 0xFA, 0x19, 0xEC, + 0xA4, 0x08, 0x84, 0x04, 0xF9, 0x19, 0xDD, 0x0E, 0x29, 0x29, 0xAB, 0x11, + 0x30, 0x18, 0xE2, 0xFD, 0x36, 0x03, 0x18, 0xEE, 0xD7, 0xF8, 0xE3, 0xF9, + 0xCA, 0xE6, 0x26, 0xF4, 0xC8, 0xDC, 0xFC, 0xE6, 0x9B, 0xF8, 0x30, 0x0A, + 0x1E, 0x1F, 0x1F, 0x30, 0x19, 0x1D, 0x6D, 0x1F, 0x97, 0x19, 0x94, 0x0E, + 0xFC, 0x21, 0x37, 0x1D, 0xDD, 0x13, 0x4F, 0x17, 0xEF, 0x06, 0x4D, 0x01, + 0xD5, 0x02, 0x40, 0xFE, 0xB8, 0xF6, 0x4E, 0xF6, 0x35, 0xDC, 0xE6, 0xD9, + 0x0F, 0xC2, 0x7D, 0xCA, 0x3B, 0xB0, 0x66, 0xC5, 0x10, 0xA5, 0x87, 0xC7, + 0x9B, 0xB9, 0x4E, 0xEC, 0x6E, 0xE8, 0x06, 0x13, 0x56, 0x17, 0x36, 0x1C, + 0xED, 0x35, 0x5D, 0x20, 0xF6, 0x2D, 0x2E, 0x1E, 0x5D, 0x12, 0xD3, 0x03, + 0xCE, 0xFC, 0x05, 0xDC, 0xDD, 0xE8, 0x97, 0xBF, 0xDA, 0xD9, 0x9F, 0xB7, + 0x1A, 0xD1, 0x8E, 0xC2, 0x3D, 0xD3, 0xE2, 0xDF, 0x3D, 0xE1, 0x47, 0xED, + 0x4C, 0xFA, 0xF7, 0xEC, 0x54, 0x07, 0xC1, 0xEC, 0x01, 0xF8, 0xA8, 0xE2, + 0x49, 0xE4, 0xDD, 0xD1, 0xAC, 0xD0, 0xCA, 0xBE, 0x06, 0xD0, 0x15, 0xC2, + 0xBB, 0xE7, 0xCA, 0xE0, 0x37, 0xF7, 0x0B, 0xFC, 0x66, 0x06, 0xCF, 0x15, + 0xBE, 0x0D, 0x33, 0x21, 0xD4, 0x05, 0xCA, 0x12, 0x20, 0x02, 0x0E, 0x10, + 0x2E, 0xFA, 0x52, 0x0D, 0x93, 0xE2, 0x9D, 0xF0, 0x72, 0xDA, 0x3C, 0xE4, + 0xAD, 0xF8, 0x64, 0x03, 0xF8, 0xFE, 0xFE, 0x15, 0x25, 0xE6, 0xF1, 0x12, + 0x0C, 0xEE, 0x29, 0x28, 0xF9, 0x07, 0xB5, 0x3B, 0xAC, 0x11, 0xB6, 0x2F, + 0x0D, 0x0F, 0x50, 0x17, 0x0A, 0x09, 0x2A, 0x02, 0xBB, 0xF5, 0x36, 0xE8, + 0xE8, 0xDE, 0x2F, 0xC6, 0xE4, 0xDA, 0xDB, 0xAD, 0x26, 0xD7, 0x99, 0xB7, + 0xFB, 0xDB, 0xE9, 0xDF, 0x5E, 0xF8, 0xFB, 0x0B, 0xFF, 0x1D, 0x1B, 0x2C, + 0x84, 0x41, 0x0D, 0x39, 0x7E, 0x51, 0x26, 0x37, 0xAC, 0x47, 0x58, 0x25, + 0xA2, 0x2B, 0xDE, 0x09, 0xCB, 0x0C, 0xA1, 0xEE, 0x85, 0xF6, 0xCE, 0xDC, + 0x2C, 0xF0, 0x14, 0xE1, 0x69, 0x00, 0x74, 0xF6, 0xE1, 0x10, 0xFC, 0x08, + 0xB6, 0x15, 0x3C, 0x17, 0xF5, 0x20, 0x6C, 0x23, 0xEA, 0x15, 0xB0, 0x1E, + 0xC5, 0xF6, 0xD6, 0x0E, 0xB8, 0xE8, 0x6F, 0xF0, 0x1E, 0xE7, 0xD2, 0xD1, + 0x13, 0xF1, 0xCC, 0xDD, 0x6F, 0xFE, 0x01, 0x08, 0x19, 0x0A, 0x34, 0x24, + 0x70, 0x1B, 0x4A, 0x35, 0x0F, 0x28, 0xD9, 0x3C, 0x4A, 0x26, 0xFB, 0x31, + 0x75, 0x25, 0x49, 0x26, 0xE9, 0x25, 0x88, 0x1D, 0xAB, 0x13, 0x37, 0x0A, + 0x12, 0x12, 0x4F, 0x07, 0x98, 0x2F, 0x45, 0x23, 0x6C, 0x26, 0x55, 0x29, + 0x02, 0x0C, 0xF3, 0x1B, 0x8E, 0x21, 0xA2, 0x2D, 0x63, 0x2E, 0x16, 0x40, + 0x3F, 0x1B, 0x02, 0x31, 0x38, 0x22, 0x56, 0x1D, 0xE8, 0x28, 0x20, 0x0F, + 0x6E, 0xFD, 0x58, 0xF9, 0x08, 0xD1, 0xB0, 0xE0, 0xD3, 0xC7, 0xA9, 0xDE, + 0x18, 0xD1, 0x5D, 0xEC, 0x45, 0xEF, 0xFB, 0x01, 0x0C, 0x27, 0xCE, 0x30, + 0x81, 0x52, 0x27, 0x57, 0x86, 0x57, 0x6D, 0x52, 0x1A, 0x4C, 0x8E, 0x3D, + 0x23, 0x32, 0x6A, 0x2B, 0x3B, 0x11, 0x9B, 0x0D, 0x0D, 0xF3, 0x9E, 0xE8, + 0x37, 0xDD, 0xEE, 0xE5, 0xE4, 0xDF, 0x36, 0xF1, 0xB5, 0xEF, 0x8A, 0xF4, + 0x41, 0xF7, 0xBA, 0x0C, 0x25, 0xFF, 0x94, 0x17, 0x5C, 0x15, 0xC1, 0x07, + 0x99, 0x21, 0xE0, 0xFC, 0x94, 0x10, 0xD7, 0xF6, 0x7A, 0xF6, 0x14, 0xE2, + 0x41, 0xF0, 0x31, 0xCE, 0x74, 0xFF, 0x67, 0xD8, 0x7F, 0x0B, 0x4D, 0xF4, + 0x67, 0x10, 0xAA, 0x12, 0x8E, 0x18, 0x9F, 0x2B, 0x0F, 0x1C, 0x43, 0x2C, + 0x95, 0x23, 0x9F, 0x2C, 0x2B, 0x2F, 0xB9, 0x2E, 0xCA, 0x19, 0x25, 0x0A, + 0x91, 0xF4, 0x5C, 0xE7, 0x65, 0xFF, 0xDB, 0xF3, 0xD0, 0x11, 0x23, 0xFD, + 0x60, 0xFB, 0x7A, 0xEF, 0xCF, 0xFC, 0x78, 0x01, 0xC9, 0x21, 0x72, 0x22, + 0xCD, 0x26, 0xF4, 0x1C, 0xBE, 0x0C, 0xEE, 0x0D, 0xF1, 0xF7, 0x02, 0x0D, + 0xF3, 0xDB, 0x88, 0xF4, 0xFB, 0xBC, 0x55, 0xC3, 0x28, 0xB3, 0xC7, 0xA2, + 0xDC, 0xB8, 0xE5, 0xA3, 0x9F, 0xCA, 0x26, 0xBA, 0xEF, 0xF5, 0xF0, 0xEB, + 0x0C, 0x21, 0x01, 0x27, 0xF2, 0x27, 0x76, 0x40, 0x5A, 0x22, 0xEC, 0x3E, + 0xE3, 0x1C, 0x77, 0x2D, 0x3C, 0x0A, 0x80, 0x07, 0x2E, 0xF2, 0x9A, 0xD3, + 0x9A, 0xE5, 0x9E, 0xBA, 0x52, 0xE2, 0xE8, 0xBA, 0xC1, 0xDE, 0xA1, 0xC6, + 0x4B, 0xDB, 0xB5, 0xED, 0xFB, 0xD9, 0x76, 0x0F, 0x27, 0xE1, 0x48, 0x1C, + 0x21, 0xE3, 0xC3, 0x1B, 0x46, 0xD8, 0x99, 0x0A, 0x43, 0xCA, 0x85, 0xE1, + 0xA5, 0xC4, 0x9F, 0xBB, 0xDE, 0xD5, 0x1A, 0xC2, 0xBB, 0xEF, 0x2E, 0xDC, + 0x90, 0xFC, 0x0D, 0xF5, 0xCB, 0x0C, 0x3C, 0x14, 0xC6, 0x1F, 0xB0, 0x1C, + 0x88, 0x1B, 0x92, 0x11, 0x11, 0x08, 0xE9, 0x0D, 0x56, 0xEF, 0xC8, 0xFA, + 0x77, 0xD2, 0xA8, 0xCE, 0x89, 0xD8, 0xD8, 0xC4, 0xC3, 0xFA, 0xFE, 0xDF, + 0x68, 0xFA, 0xFA, 0xE7, 0x76, 0xED, 0xC1, 0xFA, 0xC0, 0x02, 0xDD, 0x28, + 0xF3, 0x17, 0x1F, 0x35, 0x23, 0x12, 0x1C, 0x1E, 0x86, 0x03, 0x03, 0x0B, + 0xB2, 0xF6, 0xFD, 0xEF, 0x99, 0xDE, 0xE1, 0xC7, 0x5E, 0xC5, 0x39, 0xB1, + 0xA1, 0xBC, 0x5B, 0xB6, 0x8E, 0xC7, 0xDE, 0xCF, 0x7B, 0xEE, 0x21, 0x04, + 0x8D, 0x15, 0x46, 0x3C, 0x4F, 0x28, 0x61, 0x52, 0x25, 0x32, 0x7D, 0x4E, + 0x0A, 0x2F, 0x04, 0x37, 0x3D, 0x1E, 0xC6, 0x06, 0x8D, 0x09, 0x67, 0xCF, + 0xCC, 0xF7, 0x1B, 0xBC, 0x65, 0xE2, 0x4A, 0xC4, 0xEF, 0xD3, 0x38, 0xCA, + 0x43, 0xE9, 0xCF, 0xE6, 0x51, 0x00, 0xF3, 0x00, 0x0E, 0x04, 0xBE, 0x01, + 0x2D, 0x0A, 0xB4, 0xFA, 0x91, 0x00, 0xD3, 0xE9, 0xB5, 0xDC, 0x01, 0xD1, + 0x8C, 0xC1, 0xDF, 0xBC, 0xD6, 0xD6, 0x56, 0xCB, 0xB2, 0x03, 0x5C, 0xE6, + 0x6E, 0x18, 0x56, 0xF9, 0x7E, 0x1A, 0x07, 0x23, 0xEC, 0x08, 0xDE, 0x3B, + 0x96, 0xF3, 0x08, 0x33, 0xF0, 0xFA, 0x39, 0x25, 0x33, 0xFB, 0x64, 0x05, + 0x15, 0xE1, 0x68, 0xD8, 0x69, 0xE0, 0xDF, 0xD1, 0x7E, 0xF7, 0x12, 0xF0, + 0xFE, 0xF3, 0xED, 0xED, 0x39, 0xE7, 0x5B, 0xE4, 0x2B, 0xFF, 0x5D, 0x11, + 0xCA, 0x12, 0x37, 0x34, 0xC7, 0x0B, 0xB6, 0x1E, 0x03, 0x11, 0x25, 0x07, + 0xEE, 0x0C, 0xD9, 0xF6, 0x93, 0xE8, 0xA1, 0xD0, 0x79, 0xCC, 0x98, 0xAE, + 0x90, 0xC8, 0xD0, 0xA6, 0xCB, 0xCD, 0x1A, 0xB0, 0x6E, 0xEC, 0xBC, 0xD0, + 0xC3, 0x1A, 0xC3, 0x09, 0xF8, 0x2C, 0x83, 0x33, 0x27, 0x2C, 0xFF, 0x36, + 0x8C, 0x2E, 0xC7, 0x28, 0x9D, 0x25, 0x5F, 0x0F, 0x71, 0x0A, 0x30, 0xF1, + 0x1D, 0xEE, 0x2F, 0xE1, 0xCD, 0xD9, 0x79, 0xE1, 0xF5, 0xD0, 0x90, 0xEA, + 0x6F, 0xDF, 0x00, 0xFE, 0xF9, 0xEB, 0xBD, 0x0E, 0x32, 0xEE, 0x3C, 0x14, + 0x46, 0xF8, 0xCC, 0x08, 0x49, 0x01, 0x65, 0xF7, 0xCE, 0xF0, 0xE8, 0xE9, + 0x48, 0xD1, 0xF5, 0xDC, 0x4E, 0xD3, 0x70, 0xE7, 0xE7, 0xF0, 0x61, 0x04, + 0xBD, 0x05, 0x3C, 0x1C, 0xBA, 0x19, 0xEA, 0x36, 0x40, 0x23, 0x8D, 0x3D, + 0x67, 0x19, 0x30, 0x2D, 0x1B, 0x18, 0x39, 0x2C, 0xBF, 0x05, 0x1A, 0x1E, + 0x43, 0xDA, 0x30, 0xF5, 0x5D, 0xE1, 0x26, 0xE6, 0x92, 0x0D, 0xAA, 0xFB, + 0xD2, 0x13, 0x42, 0xFE, 0x1A, 0x0F, 0xD4, 0xF2, 0x72, 0x27, 0x86, 0x11, + 0x2B, 0x29, 0x8E, 0x26, 0xBB, 0x10, 0x01, 0x12, 0x5F, 0x11, 0xBD, 0x04, + 0x97, 0x0F, 0x47, 0x01, 0xC4, 0xF8, 0x71, 0xEE, 0x5D, 0xEB, 0xFE, 0xD8, + 0xC9, 0xE4, 0x02, 0xD2, 0xFA, 0xE5, 0x3D, 0xD8, 0x03, 0xF9, 0x24, 0xF1, + 0xDB, 0x18, 0x4C, 0x16, 0x42, 0x38, 0x33, 0x2E, 0x5C, 0x4B, 0x01, 0x33, + 0xCC, 0x4A, 0xD0, 0x35, 0x42, 0x3B, 0xED, 0x2A, 0xAB, 0x28, 0x7A, 0x04, + 0x17, 0x0C, 0xE6, 0xE8, 0x30, 0xF4, 0xAE, 0xE8, 0xBB, 0xF0, 0x87, 0xEC, + 0xD6, 0xF3, 0xCB, 0xFB, 0xB1, 0xFA, 0x29, 0x1C, 0xC9, 0x0C, 0x65, 0x36, + 0x44, 0x1C, 0x80, 0x35, 0xF3, 0x16, 0x6E, 0x28, 0x24, 0x02, 0xBE, 0x0F, + 0xF9, 0xF7, 0x9C, 0xF0, 0x0E, 0x02, 0x1C, 0xF0, 0x56, 0x14, 0xD1, 0x05, + 0x50, 0x28, 0x37, 0x1D, 0x30, 0x3A, 0x9C, 0x3E, 0xA5, 0x37, 0x25, 0x52, + 0xE5, 0x2B, 0x01, 0x4F, 0x0F, 0x2B, 0x51, 0x4D, 0x1B, 0x1C, 0xFE, 0x3A, + 0x4D, 0xFD, 0xFE, 0x10, 0x5F, 0xF9, 0x34, 0x05, 0x42, 0x07, 0x72, 0x1D, + 0x11, 0x02, 0x93, 0x18, 0x38, 0x07, 0xC7, 0x03, 0x99, 0x27, 0x4D, 0x16, + 0xBA, 0x39, 0x07, 0x29, 0x87, 0x2E, 0xA2, 0x1D, 0x51, 0x2B, 0xD5, 0x20, + 0x87, 0x2A, 0x13, 0x23, 0x99, 0x11, 0x25, 0xFF, 0x15, 0xFE, 0xF0, 0xDD, + 0x02, 0xEB, 0x4F, 0xDE, 0x45, 0xD3, 0x5A, 0xE6, 0x0C, 0xE9, 0xF4, 0xFB, + 0xCC, 0x20, 0xC3, 0x2C, 0xD1, 0x41, 0x7E, 0x47, 0xF6, 0x48, 0x4F, 0x40, + 0x7C, 0x44, 0xFB, 0x35, 0x6B, 0x31, 0x6E, 0x18, 0xB7, 0x08, 0x40, 0xE0, + 0x83, 0xE6, 0xD2, 0xC9, 0x7E, 0xDB, 0x5A, 0xDA, 0x45, 0xD7, 0x23, 0xE2, + 0x6D, 0xE5, 0x54, 0xEE, 0x4F, 0xFE, 0xF0, 0x0A, 0xD1, 0x0B, 0x55, 0x18, + 0x9F, 0x0F, 0x10, 0x0B, 0x39, 0x0A, 0xA0, 0xF0, 0xAD, 0xF1, 0xEB, 0xC6, + 0x15, 0xCF, 0x8D, 0xAB, 0xDA, 0xC4, 0xF9, 0xC4, 0x7B, 0xD5, 0xE3, 0xE8, + 0x83, 0xE8, 0xB4, 0xF7, 0x60, 0x01, 0x57, 0x0F, 0x5E, 0x0D, 0xC3, 0x18, + 0xB1, 0x08, 0x20, 0x10, 0xE5, 0x10, 0x98, 0x0A, 0xCA, 0x08, 0xF4, 0xF3, + 0xFA, 0xEA, 0xD2, 0xDA, 0xF1, 0xED, 0x30, 0xE7, 0xC8, 0xF5, 0x2F, 0x06, + 0x3B, 0xD0, 0x40, 0x04, 0x40, 0xBC, 0x49, 0xFE, 0x9B, 0xDD, 0xF8, 0x15, + 0xCB, 0xF0, 0x41, 0x1D, 0x65, 0xEC, 0xAB, 0x09, 0xDC, 0xFC, 0x85, 0xF9, + 0x26, 0x06, 0xF0, 0xDD, 0xD1, 0xEC, 0xEC, 0xB9, 0xD4, 0xCB, 0x28, 0xAC, + 0xD4, 0xAD, 0x2B, 0xB2, 0x43, 0xA4, 0x1D, 0xC9, 0x71, 0xD1, 0x23, 0xF9, + 0xB8, 0x16, 0x1B, 0x27, 0xE8, 0x37, 0x49, 0x36, 0x92, 0x30, 0xF1, 0x2B, + 0xE4, 0x1F, 0x86, 0x13, 0x78, 0x06, 0x8C, 0xE8, 0x8B, 0xDE, 0xD0, 0xB7, + 0x41, 0xC4, 0xF7, 0xA8, 0x7F, 0xBB, 0x76, 0xB1, 0xFD, 0xBF, 0xF9, 0xBC, + 0xB4, 0xD4, 0xA3, 0xCE, 0xE0, 0xEB, 0x43, 0xE2, 0x3D, 0xFF, 0xA3, 0xED, + 0xA8, 0x0F, 0x7B, 0xEB, 0xA1, 0x0A, 0xCD, 0xDA, 0x86, 0xF2, 0x21, 0xC5, + 0x5B, 0xEB, 0x65, 0xCB, 0x96, 0xEF, 0x8E, 0xEB, 0x05, 0xED, 0xB5, 0x02, + 0x93, 0xFA, 0x0F, 0x1A, 0xC7, 0x03, 0x21, 0x31, 0xFB, 0xF5, 0xAD, 0x34, + 0x16, 0xFC, 0xAC, 0x32, 0x94, 0x06, 0xDB, 0x1F, 0xF8, 0xEB, 0x87, 0xF4, + 0x83, 0xE2, 0xB3, 0xDE, 0xB1, 0x05, 0x57, 0xF4, 0xD6, 0x07, 0xDA, 0x06, + 0x33, 0xEB, 0xF4, 0x0A, 0x6F, 0xF5, 0x0E, 0x29, 0x34, 0x12, 0xF6, 0x3C, + 0x93, 0x1A, 0x78, 0x23, 0xB7, 0x23, 0xBB, 0x05, 0x0F, 0x25, 0x60, 0xED, + 0x0D, 0x0D, 0x97, 0xD0, 0x22, 0xFA, 0x45, 0xB7, 0x2D, 0xEC, 0xFC, 0xA6, + 0x28, 0xDC, 0xA2, 0xB4, 0x5D, 0xE7, 0x38, 0xE7, 0x61, 0x0D, 0x62, 0x1D, + 0x71, 0x28, 0x19, 0x3E, 0x66, 0x42, 0x69, 0x4E, 0x3E, 0x5C, 0x84, 0x49, + 0xC3, 0x4B, 0x53, 0x2C, 0xE9, 0x22, 0x66, 0x0A, 0xC4, 0xF9, 0xFC, 0xF1, + 0x7A, 0xD2, 0x28, 0xEB, 0x68, 0xC8, 0xE6, 0x01, 0x92, 0xCD, 0xFB, 0x1D, + 0xA4, 0xD5, 0x4E, 0x26, 0x9C, 0xF1, 0xE8, 0x2B, 0xAC, 0x15, 0xB5, 0x2D, + 0x83, 0x1D, 0xBA, 0x0F, 0x4B, 0xFE, 0x87, 0xE1, 0x48, 0xE9, 0xAD, 0xCF, + 0xFF, 0xE8, 0xC2, 0xDD, 0x3F, 0xE8, 0x95, 0xF7, 0x02, 0xFA, 0xD1, 0x16, + 0xEA, 0x12, 0x97, 0x31, 0x7B, 0x15, 0x72, 0x35, 0x73, 0x15, 0x08, 0x34, + 0x27, 0x1E, 0x94, 0x29, 0x5A, 0x1B, 0x8C, 0x06, 0xD6, 0x06, 0x34, 0xF5, + 0xB1, 0x0E, 0x23, 0x05, 0x72, 0x2B, 0x69, 0xFE, 0x81, 0x1D, 0x78, 0xDF, + 0x5B, 0x05, 0x47, 0xE4, 0xC2, 0x07, 0xF8, 0x08, 0x53, 0x07, 0x42, 0x19, + 0x57, 0x08, 0x9F, 0x18, 0x3B, 0x1E, 0x29, 0x18, 0x1D, 0x28, 0x66, 0x04, + 0x15, 0x0E, 0xBF, 0xE3, 0x54, 0xE5, 0xA0, 0xC2, 0xEB, 0xC7, 0x8C, 0xB4, + 0x42, 0xCF, 0x46, 0xD2, 0x1B, 0xFB, 0xF1, 0x0C, 0x66, 0x23, 0xA0, 0x42, + 0x8D, 0x35, 0x27, 0x5E, 0x9C, 0x3B, 0x60, 0x5A, 0x4A, 0x30, 0xBF, 0x39, + 0x39, 0x16, 0x97, 0x07, 0x15, 0xFB, 0xD5, 0xDB, 0x4D, 0xE5, 0x6A, 0xBF, + 0x7C, 0xDB, 0x12, 0xBD, 0xC7, 0xDB, 0x14, 0xD9, 0x29, 0xD9, 0xC5, 0xF2, + 0x33, 0xDE, 0x96, 0x06, 0x0C, 0xF5, 0x55, 0x0F, 0xFE, 0x0B, 0xD4, 0x03, + 0xF8, 0x09, 0x26, 0xED, 0x76, 0xF1, 0xFB, 0xD2, 0xFB, 0xEB, 0xE5, 0xD2, + 0x90, 0xF0, 0xE3, 0xDE, 0x95, 0xF1, 0xB3, 0xDF, 0xA9, 0x01, 0x59, 0xF2, + 0xFF, 0xFD, 0xEE, 0x0C, 0xE3, 0xEF, 0xF2, 0x18, 0x27, 0xFE, 0x1B, 0x1E, + 0xC8, 0x02, 0x5D, 0x11, 0xEA, 0xE2, 0x3F, 0xEA, 0x34, 0xD9, 0x08, 0xD5, + 0x34, 0xF8, 0xB3, 0xDB, 0xDD, 0xF0, 0x94, 0xD2, 0x42, 0xDB, 0x7A, 0xD6, + 0x78, 0xF5, 0x6D, 0x08, 0x42, 0x08, 0x78, 0x2F, 0x86, 0x05, 0x97, 0x27, + 0x8B, 0x0A, 0xD3, 0x16, 0xDF, 0xFF, 0xDF, 0xFE, 0x9B, 0xDB, 0xB7, 0xD1, + 0xEA, 0xB9, 0xF1, 0xAD, 0xF5, 0xAC, 0xE6, 0x9B, 0x62, 0xB3, 0x04, 0xA8, + 0xA4, 0xD5, 0xC6, 0xDF, 0x74, 0x08, 0x94, 0x1A, 0x97, 0x29, 0xE3, 0x3B, + 0x9E, 0x34, 0x6F, 0x4A, 0x11, 0x30, 0xC1, 0x43, 0x6F, 0x1B, 0x0B, 0x23, + 0x8A, 0x03, 0x04, 0xF8, 0x8E, 0xEF, 0xA2, 0xDA, 0x8B, 0xDB, 0x0C, 0xD6, + 0xD0, 0xDD, 0x09, 0xE6, 0x31, 0xF3, 0xEC, 0xEE, 0x83, 0x02, 0xD1, 0xF2, + 0xD6, 0x0B, 0x8F, 0xFF, 0xBB, 0x13, 0x2A, 0x02, 0x8E, 0x04, 0x27, 0xF3, + 0x65, 0xDC, 0x2C, 0xDC, 0xA5, 0xD8, 0x67, 0xD9, 0xC5, 0xFC, 0x3A, 0xEE, + 0x9A, 0x0E, 0xEC, 0x02, 0xEB, 0x1E, 0x5F, 0x1C, 0x2F, 0x33, 0xC0, 0x2B, + 0xF3, 0x28, 0x4C, 0x2A, 0x30, 0x19, 0x7B, 0x2E, 0xE5, 0x0D, 0xAB, 0x2B, + 0xA5, 0xF2, 0xBB, 0x0F, 0x7B, 0xEA, 0xFA, 0x04, 0xF8, 0x07, 0xF0, 0x19, + 0x8B, 0x12, 0x2F, 0x16, 0x55, 0xFF, 0x7D, 0xFF, 0x62, 0x05, 0xF2, 0x0C, + 0x82, 0x13, 0x09, 0x1F, 0xD9, 0x0E, 0xCC, 0x13, 0x78, 0x17, 0x3F, 0x11, + 0x2A, 0x1E, 0xA6, 0x14, 0x29, 0x0D, 0x90, 0xFD, 0x2D, 0xFA, 0x95, 0xD8, + 0x20, 0xE7, 0x3F, 0xC4, 0xCF, 0xD7, 0x59, 0xCF, 0x10, 0xE7, 0x63, 0xF7, + 0xE0, 0x12, 0x56, 0x25, 0x47, 0x39, 0x69, 0x40, 0x7F, 0x4F, 0x9E, 0x46, + 0x92, 0x53, 0xF5, 0x3A, 0x81, 0x2D, 0x34, 0x17, 0x24, 0x01, 0xEB, 0xF3, + 0x99, 0xF8, 0x49, 0xE4, 0x23, 0xFD, 0xF9, 0xE6, 0xCC, 0x0D, 0x8B, 0xFE, + 0xC0, 0x25, 0x6A, 0x18, 0xBA, 0x29, 0xD6, 0x22, 0xC2, 0x21, 0xE9, 0x19, + 0x65, 0x1C, 0x1F, 0x10, 0x0F, 0x09, 0x58, 0x05, 0x3C, 0xE5, 0xAB, 0xEF, + 0x95, 0xDB, 0x5D, 0xF4, 0x68, 0xEF, 0x70, 0x17, 0xB8, 0xF7, 0xAE, 0x2D, + 0x59, 0x02, 0x52, 0x36, 0xC4, 0x16, 0xD9, 0x37, 0x11, 0x1C, 0x39, 0x32, + 0x72, 0x22, 0xE1, 0x32, 0xFA, 0x27, 0x4E, 0x32, 0xF0, 0x08, 0x52, 0x21, + 0xC3, 0xF8, 0xC3, 0x1A, 0x91, 0x15, 0x4C, 0x2C, 0xFB, 0x16, 0xF4, 0x21, + 0xBB, 0x00, 0x5C, 0x05, 0x07, 0x0B, 0x52, 0x11, 0x47, 0x22, 0x98, 0x27, + 0xFB, 0x27, 0x0D, 0x1F, 0x47, 0x2B, 0xD0, 0x0C, 0xDD, 0x23, 0x07, 0xFC, + 0xC8, 0x07, 0x5B, 0xE6, 0xA1, 0xF6, 0x3F, 0xCB, 0xBD, 0xEA, 0x38, 0xB9, + 0x15, 0xE2, 0x6B, 0xCA, 0x13, 0x05, 0x09, 0xF9, 0x89, 0x35, 0xCF, 0x21, + 0x2E, 0x45, 0x16, 0x32, 0xB3, 0x46, 0x4C, 0x34, 0xC9, 0x3D, 0x10, 0x2C, + 0x00, 0x21, 0x63, 0x16, 0x53, 0x02, 0x55, 0xFF, 0x1F, 0xF0, 0x1F, 0xF0, + 0x88, 0xE5, 0x3E, 0xEF, 0x0B, 0xE9, 0x51, 0xFF, 0xBC, 0xF5, 0x2A, 0x03, + 0x84, 0xFF, 0x72, 0xF7, 0x5A, 0x08, 0xC7, 0xF1, 0x36, 0x0F, 0x90, 0xEF, + 0x05, 0x0A, 0x30, 0xE7, 0x5B, 0xF1, 0x3C, 0xDA, 0x0E, 0xDD, 0xFF, 0xE4, + 0x7E, 0xD5, 0x9C, 0x03, 0xC1, 0xD8, 0x49, 0x15, 0x7C, 0xF0, 0x34, 0x17, + 0xC0, 0xFF, 0x41, 0x03, 0xB7, 0xFC, 0xC2, 0xEF, 0xCC, 0x02, 0xF0, 0xF8, + 0xFE, 0x08, 0x3B, 0x00, 0xB5, 0xF5, 0x5A, 0xEC, 0xAF, 0xED, 0x5D, 0xE7, + 0xC2, 0x0F, 0xC6, 0x04, 0xA7, 0x0F, 0xB2, 0x09, 0x26, 0xE8, 0x6B, 0xF4, + 0x9E, 0xEA, 0x34, 0xFD, 0x38, 0x01, 0x65, 0x0E, 0x76, 0x05, 0x70, 0x09, + 0x3B, 0x02, 0xC6, 0x03, 0x50, 0xF6, 0x67, 0xF6, 0xFA, 0xE1, 0x31, 0xDF, + 0x1D, 0xC8, 0x24, 0xC6, 0x67, 0xAA, 0x1B, 0xB2, 0xE3, 0x9B, 0x66, 0xB8, + 0x1A, 0xBB, 0x89, 0xE1, 0x3B, 0xF4, 0xF1, 0x0C, 0xC2, 0x15, 0x5B, 0x28, + 0xCA, 0x22, 0x7E, 0x36, 0x35, 0x1F, 0xCA, 0x2E, 0xE7, 0x01, 0x40, 0x13, + 0x5C, 0xE5, 0xB9, 0xF9, 0x0A, 0xD4, 0x02, 0xE8, 0xB3, 0xCC, 0x0F, 0xDD, + 0x68, 0xD8, 0xEC, 0xE0, 0x87, 0xE7, 0x92, 0xD4, 0x4B, 0xFA, 0xF4, 0xBC, + 0x6D, 0x10, 0xA8, 0xBF, 0x8C, 0x0E, 0x9F, 0xCB, 0xB1, 0xFB, 0x63, 0xCD, + 0x0E, 0xE7, 0x06, 0xD2, 0xE5, 0xDF, 0x7C, 0xDF, 0xAD, 0xE7, 0x9B, 0xEF, + 0x41, 0xF5, 0x23, 0xF9, 0xFF, 0x0A, 0xA7, 0x00, 0x26, 0x06, 0xC4, 0xFA, + 0x58, 0xF1, 0x34, 0xF5, 0x28, 0xFD, 0x26, 0x0D, 0x2E, 0x07, 0xF3, 0x1C, + 0xAF, 0xF0, 0x52, 0x0A, 0x0B, 0xEA, 0x86, 0xFE, 0xB4, 0x06, 0xAC, 0x0B, + 0x28, 0x07, 0xFE, 0x05, 0x4B, 0xE9, 0x8C, 0xF8, 0x91, 0xF2, 0xE2, 0x01, + 0x76, 0x0D, 0xD1, 0x0D, 0xF7, 0x08, 0x48, 0x0F, 0xCD, 0xFB, 0xBD, 0x13, + 0x36, 0xE8, 0xE9, 0x08, 0x6A, 0xD2, 0xDA, 0xEE, 0xF3, 0xCF, 0xD1, 0xDC, + 0x79, 0xCF, 0xFA, 0xC6, 0x64, 0xCE, 0x3F, 0xB8, 0x6E, 0xE4, 0xB7, 0xD2, + 0x74, 0x09, 0xE3, 0xF8, 0x4D, 0x22, 0x70, 0x03, 0xBF, 0x2D, 0x84, 0x0F, + 0xA7, 0x33, 0x14, 0x25, 0xEE, 0x23, 0x32, 0x24, 0xDB, 0x09, 0xA7, 0x0E, + 0x7F, 0xF8, 0x32, 0xFB, 0xE9, 0xE2, 0x48, 0xF2, 0x45, 0xDA, 0x57, 0xF8, + 0x84, 0xE4, 0xF7, 0xF5, 0x19, 0xF1, 0x35, 0xE4, 0x40, 0x05, 0xA6, 0xE4, + 0xDD, 0x0F, 0xE2, 0xF0, 0x8D, 0x01, 0x9B, 0xEA, 0x68, 0xE5, 0xF0, 0xD9, + 0xBD, 0xD1, 0xF5, 0xDF, 0xD6, 0xD1, 0x76, 0xF1, 0x42, 0xDE, 0x98, 0xF9, + 0x17, 0xFF, 0xCA, 0x02, 0x25, 0x18, 0xDF, 0xFD, 0x92, 0x0E, 0x4B, 0xED, + 0x2B, 0x0A, 0x1B, 0xF8, 0xAD, 0x09, 0x37, 0x0D, 0xBF, 0xE7, 0x58, 0x03, + 0x7E, 0xD5, 0xEA, 0xFB, 0xD3, 0xFD, 0x26, 0x19, 0xD2, 0x1C, 0x35, 0x1F, + 0x21, 0x12, 0xD3, 0x01, 0xA0, 0x0F, 0x72, 0xFB, 0xD3, 0x1C, 0x27, 0x06, + 0x0D, 0x13, 0x0E, 0x04, 0x17, 0x06, 0x40, 0x03, 0x5D, 0x0C, 0xFD, 0x03, + 0x1A, 0x02, 0x5A, 0xF9, 0x7B, 0xE5, 0xAE, 0xF0, 0x58, 0xC7, 0xA9, 0xE1, + 0x44, 0xB7, 0x06, 0xD1, 0x56, 0xCE, 0x2E, 0xE1, 0x12, 0xFC, 0x7A, 0x03, + 0x33, 0x26, 0x47, 0x16, 0xAD, 0x42, 0x1B, 0x25, 0x20, 0x48, 0xE1, 0x33, + 0x45, 0x34, 0x12, 0x28, 0x51, 0x12, 0x77, 0x07, 0x64, 0xFB, 0xBB, 0xF7, + 0xAF, 0xEC, 0xAF, 0xF7, 0xBC, 0xDF, 0x83, 0xF8, 0xE5, 0xE7, 0xA3, 0xF5, + 0xA8, 0xF2, 0x82, 0xEB, 0xF3, 0xF2, 0xD6, 0xEB, 0x99, 0xF3, 0x20, 0xEF, + 0xD6, 0xF3, 0xD8, 0xE5, 0x1E, 0xE4, 0x0B, 0xD3, 0x86, 0xD5, 0xB4, 0xD3, + 0x5C, 0xE4, 0x0F, 0xF4, 0xE5, 0xED, 0x77, 0x05, 0x47, 0xF4, 0xBA, 0x09, + 0x9C, 0x0D, 0x66, 0x13, 0xEC, 0x14, 0x6A, 0x0E, 0x62, 0x0E, 0x5A, 0x18, + 0x20, 0x11, 0x6A, 0x2B, 0x87, 0x03, 0x35, 0x16, 0x40, 0xF5, 0x2B, 0xF9, + 0x20, 0x0D, 0x48, 0x0F, 0xC3, 0x1B, 0x19, 0x28, 0x3F, 0xFC, 0x57, 0x0E, + 0x95, 0xEF, 0xF3, 0xFF, 0xF8, 0x10, 0x6C, 0x1E, 0x19, 0x23, 0xF4, 0x29, + 0xE2, 0x24, 0xE7, 0x1B, 0xE4, 0x2D, 0xD2, 0x0C, 0x23, 0x24, 0x9C, 0xF2, + 0x07, 0x07, 0x75, 0xDB, 0x8C, 0xE7, 0xE3, 0xCC, 0x73, 0xD3, 0xE9, 0xCA, + 0x3B, 0xE5, 0x9C, 0xE2, 0x47, 0x16, 0x41, 0x0F, 0x32, 0x37, 0x22, 0x35, + 0x49, 0x3D, 0x33, 0x44, 0xA2, 0x43, 0x58, 0x45, 0x51, 0x48, 0x77, 0x36, + 0x05, 0x3D, 0x77, 0x1D, 0x2A, 0x25, 0xA3, 0x14, 0xEC, 0x06, 0x4F, 0x18, + 0x47, 0xF6, 0x7C, 0x1D, 0xAB, 0x02, 0xF7, 0x29, 0xAC, 0x12, 0x88, 0x2C, + 0xEA, 0x1B, 0xB8, 0x22, 0xFE, 0x27, 0xBA, 0x18, 0xF3, 0x28, 0x1E, 0x13, + 0x61, 0x09, 0x03, 0x01, 0x12, 0xEB, 0xF9, 0xF4, 0xB7, 0xF2, 0x4B, 0x17, + 0x72, 0xFE, 0x41, 0x35, 0x78, 0x0A, 0xC1, 0x35, 0x61, 0x27, 0x04, 0x3E, + 0xB4, 0x2A, 0x86, 0x37, 0x60, 0x20, 0x4C, 0x2C, 0x10, 0x31, 0x77, 0x3B, + 0x63, 0x35, 0xA0, 0x2A, 0xC3, 0x25, 0xD3, 0x02, 0xB8, 0x3B, 0x67, 0x15, + 0x8E, 0x54, 0x60, 0x34, 0xC0, 0x35, 0xC8, 0x1B, 0x4D, 0x0D, 0x68, 0x0C, + 0x26, 0x0E, 0x04, 0x2F, 0x30, 0x0E, 0x51, 0x2E, 0xE0, 0xFC, 0x56, 0x0D, + 0xD3, 0xF7, 0xCE, 0x07, 0x50, 0xF7, 0x50, 0xF5, 0xE5, 0xF9, 0x18, 0xD2, + 0xC1, 0xF2, 0xAD, 0xBA, 0xF3, 0xE0, 0x63, 0xAE, 0xB4, 0xE0, 0x00, 0xC7, + 0x2F, 0xF3, 0x87, 0xFA, 0xA4, 0x0D, 0x1C, 0x27, 0xB5, 0x24, 0xE1, 0x36, + 0x1F, 0x35, 0x2A, 0x2F, 0x7A, 0x3C, 0x71, 0x24, 0xD1, 0x1D, 0xD9, 0x0A, + 0xFF, 0xF2, 0x16, 0xF0, 0xD5, 0xE1, 0x4D, 0xE4, 0xF1, 0xDB, 0xB3, 0xDE, + 0x07, 0xD7, 0xCC, 0xE6, 0x81, 0xD6, 0x49, 0xE9, 0x60, 0xE5, 0xFD, 0xE2, + 0xFC, 0xEC, 0xCB, 0xE5, 0xD4, 0xEA, 0xEF, 0xE6, 0x89, 0xE3, 0x74, 0xD2, + 0x08, 0xD1, 0xFC, 0xBC, 0xB2, 0xD6, 0xE7, 0xD1, 0x48, 0xEA, 0xD6, 0xE6, + 0xEE, 0xF5, 0x27, 0xE7, 0x54, 0xFE, 0x07, 0xF7, 0xD2, 0xEA, 0x10, 0x01, + 0x6C, 0xDB, 0x0A, 0xFF, 0xDE, 0xF0, 0x17, 0x07, 0x1D, 0xF7, 0x15, 0xFC, + 0x6B, 0xDF, 0xAC, 0xE0, 0xFA, 0xE9, 0x58, 0xEE, 0xB5, 0x0D, 0xE8, 0x05, + 0x6E, 0xFC, 0xA1, 0xEA, 0xBA, 0xD9, 0xFB, 0xD7, 0x59, 0xEE, 0x8E, 0xFC, + 0xBE, 0xFE, 0xC4, 0x12, 0x18, 0xEC, 0x4C, 0x05, 0xAE, 0xEB, 0x3C, 0xFB, + 0x3C, 0xED, 0xAE, 0xEB, 0x6C, 0xD8, 0x19, 0xD1, 0x4A, 0xC4, 0xC9, 0xBB, + 0x05, 0xB5, 0x91, 0xA5, 0x2A, 0xB8, 0x1C, 0xA6, 0x64, 0xDB, 0xA5, 0xD5, + 0x22, 0xFB, 0x80, 0x04, 0xC5, 0x08, 0xF5, 0x11, 0xB8, 0x19, 0x4D, 0x12, + 0x60, 0x2D, 0x89, 0x11, 0xDD, 0x2D, 0xD5, 0x0C, 0x70, 0x1F, 0xA0, 0x03, + 0x3D, 0x10, 0x35, 0xFA, 0xAB, 0xFE, 0xD0, 0xED, 0x27, 0xF8, 0xA1, 0xE1, + 0xD8, 0xF4, 0xEC, 0xDB, 0x2A, 0xDE, 0x01, 0xDF, 0x64, 0xCB, 0x7A, 0xE3, + 0x4B, 0xDA, 0xF1, 0xEA, 0x0F, 0xE5, 0x35, 0xE6, 0x1A, 0xD6, 0x62, 0xDA, + 0x7D, 0xD9, 0x74, 0xED, 0xC3, 0xF0, 0xBE, 0x01, 0x88, 0x02, 0x37, 0xFB, + 0x8F, 0x14, 0x34, 0x04, 0x39, 0x16, 0x38, 0x16, 0x6A, 0x07, 0x88, 0x19, + 0x68, 0x0F, 0x4A, 0x2B, 0xCE, 0x14, 0x91, 0x30, 0xE3, 0x01, 0x53, 0x10, + 0x61, 0x15, 0x27, 0x0F, 0x41, 0x39, 0x95, 0x27, 0x25, 0x1E, 0x16, 0x0F, + 0xD6, 0xF4, 0x5A, 0xF5, 0xA2, 0x03, 0x3E, 0x19, 0xCB, 0x12, 0x0F, 0x31, + 0x3C, 0x08, 0x38, 0x21, 0x6A, 0x07, 0x1A, 0x21, 0x57, 0xFE, 0x2D, 0x22, + 0x0F, 0xE9, 0x90, 0x13, 0x0A, 0xE2, 0x30, 0xFD, 0x1D, 0xE0, 0xFC, 0xDF, + 0x3F, 0xE2, 0x41, 0xDD, 0xE4, 0xFF, 0xA5, 0x00, 0xDB, 0x2B, 0x47, 0x24, + 0x77, 0x38, 0xDF, 0x32, 0xEA, 0x34, 0xC1, 0x3D, 0x2E, 0x3C, 0x6E, 0x43, + 0x13, 0x32, 0xE7, 0x2D, 0xCA, 0x19, 0x72, 0x13, 0xC7, 0x01, 0x17, 0x06, + 0xD1, 0xEB, 0x90, 0xFB, 0x32, 0xEB, 0x0B, 0xF3, 0xAD, 0xFE, 0x31, 0xE8, + 0xC0, 0x15, 0x82, 0xE0, 0x55, 0x1E, 0x6B, 0xDA, 0xEC, 0x1E, 0x45, 0xE7, + 0x5B, 0x05, 0xF3, 0xF3, 0xE5, 0xDE, 0xC3, 0xE7, 0x60, 0xF0, 0xC9, 0xE7, + 0x96, 0x12, 0x5A, 0xF2, 0x6A, 0x17, 0x94, 0xF9, 0x72, 0x16, 0xFB, 0x05, + 0xBE, 0x08, 0xBA, 0x0E, 0x76, 0xF9, 0x73, 0x19, 0xCF, 0x05, 0x4F, 0x27, + 0xA0, 0x13, 0x97, 0x26, 0x3C, 0x0B, 0x86, 0x14, 0x4A, 0x13, 0xEA, 0x14, + 0x6C, 0x2B, 0x16, 0x26, 0x61, 0x15, 0x17, 0x0B, 0x71, 0xEB, 0x16, 0xE6, + 0xEC, 0xF1, 0x00, 0x00, 0x06, 0x08, 0xF1, 0x1B, 0x3C, 0x0E, 0xC1, 0x0D, + 0x34, 0x11, 0xE9, 0x0A, 0x9D, 0x00, 0xFA, 0x0F, 0x5C, 0xDE, 0xB8, 0xF5, + 0xD5, 0xC2, 0xD0, 0xC6, 0x70, 0xAD, 0xB3, 0xA5, 0xFE, 0xB6, 0x3E, 0xAC, + 0x20, 0xEC, 0x74, 0xD3, 0xD6, 0x18, 0xFB, 0xF8, 0x9B, 0x25, 0x30, 0x0B, + 0x3F, 0x2E, 0xC1, 0x16, 0x42, 0x32, 0x4A, 0x20, 0x87, 0x20, 0x18, 0x15, + 0x31, 0x0F, 0xE6, 0x03, 0x0D, 0x08, 0xD3, 0xF5, 0x91, 0xFB, 0xEC, 0xE6, + 0x04, 0xEA, 0xE2, 0xE8, 0xF6, 0xD2, 0x98, 0xF0, 0xFD, 0xC7, 0x8D, 0xF3, + 0x49, 0xCD, 0x6F, 0xF0, 0xB3, 0xD9, 0x57, 0xF0, 0x96, 0xDA, 0x80, 0xEC, + 0x8E, 0xC9, 0x77, 0xD8, 0x36, 0xCD, 0x5C, 0xD9, 0xD6, 0xDA, 0x37, 0xE9, + 0x72, 0xDF, 0xCA, 0xE6, 0x5C, 0xF4, 0x41, 0xF0, 0x36, 0x01, 0xA2, 0x05, + 0xF8, 0xFC, 0x26, 0x11, 0x1F, 0x0B, 0x87, 0x21, 0xDB, 0x0F, 0x85, 0x1F, + 0xEB, 0xF0, 0x7C, 0xFA, 0xC7, 0xE3, 0x55, 0xED, 0x66, 0xFA, 0x59, 0xFF, + 0xFE, 0xF6, 0x82, 0xEE, 0xF9, 0xDF, 0xF6, 0xCD, 0x03, 0xF6, 0x89, 0xE6, + 0xF4, 0x12, 0x6D, 0x09, 0xFB, 0x0A, 0x1A, 0xFB, 0x02, 0x01, 0x94, 0xEC, + 0x23, 0xFF, 0x15, 0xF6, 0x0C, 0xFB, 0x93, 0xF3, 0x37, 0xED, 0x94, 0xDC, + 0x1A, 0xDC, 0x88, 0xC9, 0xCC, 0xDA, 0xA5, 0xD5, 0x0F, 0xE5, 0x5D, 0xFD, + 0x1E, 0xF8, 0x74, 0x21, 0xEE, 0x09, 0xAE, 0x34, 0x5F, 0x15, 0x2B, 0x3B, + 0xF6, 0x27, 0xE3, 0x39, 0x25, 0x2D, 0xB5, 0x2D, 0x56, 0x24, 0x12, 0x18, + 0x19, 0x1A, 0x4E, 0xFE, 0xC5, 0x09, 0x8E, 0xED, 0xB5, 0xFE, 0x90, 0xEC, + 0xB7, 0xF4, 0x55, 0xEC, 0x91, 0xF6, 0x72, 0xF0, 0x15, 0x02, 0x02, 0xFD, + 0xB8, 0x07, 0x74, 0x10, 0xBB, 0xFE, 0x5E, 0x0C, 0x59, 0xEC, 0x8E, 0xEA, + 0x56, 0xE9, 0x65, 0xDD, 0x3B, 0xEE, 0x0B, 0xDC, 0x3E, 0xF8, 0x81, 0xD8, + 0xA6, 0x0E, 0xD4, 0xE4, 0xB4, 0x18, 0x44, 0xF5, 0x3A, 0x15, 0xBC, 0x10, + 0xA9, 0x17, 0xC3, 0x39, 0x75, 0x13, 0xA3, 0x44, 0x3A, 0x0C, 0x3E, 0x1E, + 0x69, 0x20, 0xD2, 0x06, 0x80, 0x37, 0x9A, 0x12, 0x26, 0x1D, 0xB4, 0x01, + 0x5E, 0xF2, 0xF5, 0xEE, 0x3C, 0xF6, 0xF8, 0x0D, 0x47, 0x09, 0x4B, 0x27, + 0xBC, 0x07, 0x0E, 0x22, 0x18, 0x06, 0xD1, 0x1D, 0x22, 0x00, 0x94, 0x1B, + 0xD8, 0xEE, 0x6B, 0x0A, 0xD4, 0xE5, 0xC1, 0xE7, 0x7D, 0xE5, 0xAE, 0xCC, + 0x08, 0xE9, 0x4C, 0xDA, 0x0C, 0xFD, 0x59, 0x09, 0x8C, 0x1B, 0x50, 0x2D, + 0x5C, 0x2D, 0x71, 0x3D, 0x0F, 0x3A, 0x9A, 0x49, 0x6C, 0x44, 0x17, 0x47, + 0x04, 0x3F, 0x98, 0x30, 0xA4, 0x37, 0x3C, 0x1C, 0xCC, 0x29, 0xD3, 0x07, + 0x4C, 0x0A, 0x33, 0xFB, 0xA9, 0xEE, 0x40, 0x02, 0x84, 0xE9, 0xD8, 0xFA, + 0x9A, 0xFB, 0xB0, 0xF7, 0x56, 0x0A, 0x9C, 0x04, 0x99, 0x16, 0x91, 0x13, + 0x85, 0x15, 0x91, 0x15, 0x0B, 0x01, 0x62, 0xFF, 0x2C, 0x0A, 0x63, 0xFB, + 0x0C, 0x1B, 0x22, 0x04, 0x70, 0x15, 0xED, 0x04, 0x84, 0x19, 0x8E, 0x15, + 0xD4, 0x1E, 0xED, 0x22, 0x9D, 0x17, 0xCA, 0x29, 0x7D, 0x1B, 0xF3, 0x3B, + 0x96, 0x1E, 0xBC, 0x3D, 0x3A, 0x06, 0xFB, 0x1D, 0x8E, 0xFE, 0xE2, 0x0C, + 0x62, 0x1D, 0xDD, 0x21, 0x50, 0x1E, 0xCD, 0x14, 0x05, 0x02, 0xBF, 0xF3, + 0x26, 0x07, 0x14, 0x0F, 0x3A, 0x10, 0x69, 0x2F, 0x01, 0x0A, 0x65, 0x24, + 0x86, 0x0E, 0xBB, 0x14, 0xAB, 0x09, 0xFC, 0x07, 0xDD, 0xF5, 0xAD, 0xF6, + 0x37, 0xEC, 0x7C, 0xDD, 0xF4, 0xE4, 0x49, 0xC2, 0x5E, 0xDD, 0x6D, 0xBC, + 0x99, 0xF2, 0x57, 0xD2, 0x68, 0x10, 0x91, 0xF6, 0xF2, 0x16, 0x55, 0x0B, + 0x15, 0x1E, 0x41, 0x13, 0xD9, 0x26, 0xE1, 0x24, 0xF9, 0x1A, 0xCE, 0x21, + 0x90, 0x14, 0x98, 0x0C, 0x6E, 0x16, 0x2F, 0xFA, 0xDC, 0x05, 0x20, 0xE6, + 0x41, 0xF7, 0x7D, 0xE4, 0xFC, 0xF2, 0xE0, 0xD9, 0x74, 0xF0, 0x9C, 0xCC, + 0xB6, 0xEB, 0x5B, 0xDD, 0x77, 0xEE, 0x14, 0xEF, 0xB4, 0xE8, 0x15, 0xEA, + 0x43, 0xCD, 0x67, 0xDA, 0xBF, 0xC4, 0x7A, 0xDD, 0x3A, 0xC9, 0x9F, 0xDF, + 0x1D, 0xCA, 0xE3, 0xD7, 0xCA, 0xE2, 0x54, 0xED, 0x80, 0xFB, 0x67, 0x01, + 0xC2, 0xFF, 0xAC, 0x03, 0xF7, 0x14, 0xF8, 0x1C, 0x9E, 0x27, 0xB5, 0x2A, + 0x7C, 0x03, 0x7F, 0x0B, 0x7F, 0xDD, 0xFF, 0xF7, 0xE7, 0xE5, 0x4A, 0x0E, + 0x6F, 0xD8, 0x2D, 0x11, 0x37, 0xBD, 0x0A, 0xF1, 0x55, 0xD5, 0x25, 0xF6, + 0x57, 0xEF, 0xCD, 0x10, 0x83, 0xEF, 0x65, 0x07, 0x08, 0xFB, 0x33, 0xF8, + 0x1F, 0xF8, 0x74, 0xF0, 0x00, 0xE1, 0x4C, 0xE1, 0x2D, 0xDB, 0x42, 0xD0, + 0x49, 0xD5, 0x7E, 0xBC, 0x48, 0xCB, 0xEC, 0xB9, 0x8E, 0xE7, 0x0A, 0xDA, + 0x6D, 0x14, 0x00, 0xF1, 0x52, 0x22, 0x5D, 0xEF, 0x55, 0x26, 0x07, 0xFB, + 0x6F, 0x2B, 0xDE, 0x07, 0x8F, 0x18, 0x29, 0xFF, 0xFA, 0x09, 0xB2, 0xF2, + 0xD6, 0x0E, 0x05, 0xF1, 0x5E, 0xF9, 0x7B, 0xEE, 0x2E, 0xE0, 0x4C, 0xEA, + 0x96, 0xDD, 0x14, 0xE4, 0x95, 0xE3, 0x65, 0xE0, 0x2A, 0xEA, 0x4C, 0xEF, + 0xB9, 0xEF, 0x03, 0x06, 0x2A, 0xF6, 0xA6, 0x02, 0xAD, 0xEF, 0x52, 0xEF, + 0xF4, 0xE5, 0x23, 0xEC, 0x98, 0xE0, 0x28, 0xEB, 0x2F, 0xDB, 0xB9, 0xED, + 0x9F, 0xE6, 0xB7, 0xFE, 0xAD, 0xF4, 0x52, 0x03, 0xC1, 0xFA, 0xE0, 0x03, + 0xDE, 0x0C, 0xCD, 0x1A, 0x0E, 0x19, 0x5C, 0x23, 0xF5, 0x01, 0xAD, 0xFA, + 0x53, 0xF8, 0xCA, 0xE1, 0xB4, 0x0D, 0xEC, 0xFE, 0xD4, 0x01, 0x4D, 0x02, + 0x09, 0xE2, 0x49, 0xE9, 0x02, 0xF5, 0xFD, 0xFD, 0x76, 0x1E, 0xFD, 0x16, + 0xEC, 0x24, 0xDB, 0x0C, 0x7C, 0x19, 0x23, 0x06, 0x08, 0xFB, 0x60, 0x06, + 0x34, 0xCE, 0xE8, 0xFB, 0x44, 0xC0, 0x26, 0xE6, 0x61, 0xC4, 0xB5, 0xCC, + 0x14, 0xCA, 0xD6, 0xC3, 0x76, 0xE8, 0xDC, 0xDE, 0xA4, 0x0F, 0xB0, 0x02, + 0x3B, 0x17, 0xCE, 0x0A, 0x9F, 0x11, 0x2F, 0x1E, 0x3C, 0x1C, 0x78, 0x37, + 0x7F, 0x1D, 0x7E, 0x2E, 0x7C, 0x0F, 0xA9, 0x1E, 0x8C, 0x06, 0xBD, 0x13, + 0x89, 0xEB, 0x6F, 0xFE, 0xC0, 0xCB, 0xD7, 0xEC, 0x43, 0xCB, 0xFA, 0xDF, + 0x83, 0xE0, 0x12, 0xD5, 0x0E, 0xFB, 0xF6, 0xDD, 0x1A, 0x0E, 0x48, 0xEA, + 0xC1, 0x0E, 0x36, 0xE8, 0x01, 0xFB, 0x48, 0xCD, 0xA3, 0xF0, 0x78, 0xB6, + 0xDA, 0xEF, 0xA4, 0xBE, 0xF2, 0xF0, 0xC7, 0xD1, 0xB0, 0x0A, 0x18, 0xF2, + 0x1B, 0x19, 0x97, 0x09, 0x5C, 0x0D, 0x64, 0x0B, 0xEA, 0x16, 0x34, 0x19, + 0xFA, 0x2C, 0x2D, 0x25, 0x79, 0x18, 0x4A, 0x0B, 0x9A, 0xF8, 0xE9, 0xF1, + 0x7F, 0x09, 0x74, 0x03, 0x80, 0x0F, 0x4F, 0x10, 0xB9, 0xE2, 0xE2, 0xF7, + 0x0A, 0xCF, 0x3A, 0xF7, 0x1A, 0xEB, 0x30, 0x11, 0x80, 0xFD, 0x8D, 0x17, + 0xB2, 0x05, 0x1D, 0x22, 0xEB, 0x05, 0x15, 0x26, 0x3A, 0xF0, 0x2A, 0x12, + 0xE9, 0xE2, 0x37, 0xFE, 0x47, 0xD8, 0x39, 0xDD, 0x20, 0xC3, 0x29, 0xBD, + 0x7E, 0xC6, 0xFE, 0xC2, 0x2B, 0xE9, 0x7C, 0xE7, 0xB9, 0x03, 0x50, 0x06, + 0x84, 0x13, 0xEA, 0x15, 0xAC, 0x25, 0xF9, 0x2A, 0x27, 0x22, 0xF0, 0x23, + 0x00, 0x11, 0x46, 0x03, 0xC2, 0x0C, 0x19, 0xF7, 0xF4, 0x04, 0x0B, 0xF0, + 0xA9, 0xF4, 0xE4, 0xED, 0x6B, 0xF2, 0xAF, 0xFA, 0xFF, 0xF3, 0x58, 0xFC, + 0x56, 0xF9, 0xA1, 0x09, 0xFD, 0x00, 0x82, 0x18, 0x81, 0x05, 0x0E, 0x09, + 0x50, 0xFF, 0xA4, 0xE9, 0x9C, 0xF3, 0x5C, 0xD2, 0x31, 0xF2, 0x12, 0xD3, + 0xE0, 0xF6, 0xC4, 0xDA, 0xF8, 0x09, 0x57, 0xF6, 0x3C, 0x15, 0xFB, 0x1B, + 0x43, 0x07, 0x8B, 0x20, 0x89, 0x0B, 0x1F, 0x23, 0xEB, 0x2A, 0x13, 0x32, + 0x11, 0x33, 0xF2, 0x26, 0x35, 0x17, 0x1A, 0x0F, 0x3C, 0x16, 0x64, 0x19, + 0xBD, 0x28, 0x81, 0x34, 0x70, 0x17, 0x9A, 0x27, 0x6F, 0x0B, 0x92, 0x0D, + 0xA6, 0x1A, 0x44, 0x1F, 0x13, 0x1D, 0x80, 0x31, 0x4E, 0x19, 0x04, 0x31, + 0xAE, 0x1D, 0xD9, 0x2D, 0x32, 0x18, 0x52, 0x1A, 0xF1, 0x0B, 0x50, 0x04, + 0x79, 0x03, 0xA2, 0xF2, 0xE5, 0xF1, 0xE9, 0xE6, 0xA1, 0xF9, 0x7B, 0xF9, + 0xD2, 0x2A, 0xDB, 0x25, 0x8B, 0x3F, 0x6F, 0x48, 0x22, 0x36, 0x10, 0x4E, + 0xBC, 0x3E, 0xB9, 0x4C, 0xC1, 0x3E, 0xB7, 0x3F, 0x4B, 0x35, 0x26, 0x22, + 0x15, 0x42, 0xB3, 0x20, 0xC4, 0x47, 0x4B, 0x2F, 0x60, 0x2A, 0xF5, 0x21, + 0x2F, 0x11, 0x7D, 0x11, 0x87, 0x05, 0x5E, 0x0C, 0xCD, 0xED, 0xB7, 0x06, + 0x75, 0xEA, 0x84, 0x0F, 0xB0, 0x06, 0x15, 0x1A, 0x05, 0x15, 0xEB, 0x0E, + 0x05, 0x0F, 0xB0, 0xF4, 0xB1, 0x14, 0x8C, 0xEE, 0xA0, 0x18, 0x29, 0xFA, + 0x4B, 0x19, 0xC3, 0xFD, 0xA8, 0x21, 0xEB, 0x09, 0xC4, 0x15, 0x5B, 0x15, + 0x27, 0xFD, 0xA7, 0x12, 0x52, 0xFC, 0xB1, 0x19, 0x31, 0x0A, 0x04, 0x1F, + 0x16, 0x04, 0x59, 0x0D, 0xD4, 0x02, 0xDB, 0x02, 0xFF, 0x17, 0xA0, 0x1A, + 0xA3, 0x11, 0x6E, 0x26, 0xFF, 0xFA, 0x94, 0x0B, 0x34, 0xFE, 0x6A, 0x02, + 0x22, 0x0C, 0x50, 0x12, 0x5F, 0x0D, 0xA9, 0x0F, 0x76, 0xFF, 0x83, 0x04, + 0xB4, 0xEA, 0x26, 0xF7, 0x05, 0xDB, 0x52, 0xE1, 0x87, 0xD9, 0xEA, 0xD7, + 0x71, 0xD5, 0x38, 0xCC, 0x2C, 0xD0, 0xDC, 0xBE, 0x24, 0xEB, 0x78, 0xD0, + 0x21, 0x04, 0x09, 0xE4, 0x15, 0xF5, 0x1F, 0xE5, 0x25, 0xF1, 0x6B, 0xEA, + 0xC6, 0x06, 0xE5, 0xF4, 0x91, 0x04, 0x59, 0xF8, 0x45, 0x04, 0x02, 0xFF, + 0x68, 0x13, 0x71, 0x18, 0x99, 0x01, 0x22, 0x26, 0x79, 0xE1, 0x1F, 0x10, + 0x9E, 0xDC, 0x35, 0xFC, 0x08, 0xD7, 0x02, 0xE4, 0xD2, 0xD1, 0xB8, 0xD1, + 0x4D, 0xDF, 0x0A, 0xD6, 0x33, 0xE8, 0x84, 0xD5, 0xD1, 0xD6, 0xA2, 0xC9, + 0x87, 0xCA, 0xDB, 0xC1, 0x11, 0xDF, 0x0E, 0xD2, 0x9D, 0xED, 0x8E, 0xEC, + 0x72, 0xFD, 0xE5, 0x07, 0xE9, 0x0E, 0x35, 0x1E, 0xBF, 0xFE, 0x00, 0x11, + 0x65, 0xEF, 0x0B, 0xF8, 0x6C, 0xFA, 0x7E, 0xFC, 0x39, 0xFF, 0xB4, 0xFC, + 0x10, 0xF0, 0x5A, 0xED, 0x14, 0x01, 0x93, 0xFF, 0xAF, 0x29, 0x00, 0x1F, + 0x47, 0x1C, 0x4F, 0x0F, 0x97, 0xF6, 0x96, 0xEA, 0xC4, 0xF3, 0x51, 0xE4, + 0x20, 0xFB, 0xD5, 0xEC, 0x9B, 0xF2, 0xF7, 0xED, 0xAF, 0xE6, 0x4A, 0xF7, + 0xBC, 0xDD, 0xD7, 0xF8, 0x9C, 0xDB, 0x0E, 0xE6, 0x34, 0xE0, 0xEF, 0xCB, + 0x16, 0xDC, 0x38, 0xB8, 0xDF, 0xDF, 0xD1, 0xBE, 0xB3, 0xF7, 0x65, 0xDD, + 0xBD, 0xFD, 0xC4, 0xFA, 0x53, 0xF9, 0xE2, 0x01, 0x3A, 0x06, 0x83, 0x01, + 0xA1, 0x0C, 0x8F, 0x02, 0xC7, 0x02, 0xF1, 0x0A, 0x26, 0x05, 0xEA, 0x1E, + 0x91, 0x14, 0xDE, 0x2C, 0xC1, 0x0C, 0x73, 0x26, 0x16, 0xFE, 0x32, 0x13, + 0xC3, 0xF3, 0xF5, 0xFD, 0x71, 0xDC, 0xFE, 0xE8, 0x90, 0xDB, 0xC2, 0xE5, + 0xB4, 0xF3, 0x8D, 0xEE, 0x11, 0x03, 0x28, 0xF4, 0xA0, 0xF4, 0xAD, 0xE9, + 0x65, 0xEA, 0xB9, 0xDF, 0x4C, 0xFF, 0x3E, 0xE3, 0x8A, 0x15, 0xE5, 0xE8, + 0x06, 0x24, 0x83, 0xF6, 0x15, 0x23, 0x8B, 0x06, 0xD9, 0x12, 0x99, 0x01, + 0x0B, 0x14, 0xDF, 0x00, 0xC9, 0x1B, 0x2C, 0x1B, 0x27, 0x00, 0x97, 0x2B, + 0x83, 0xDF, 0x47, 0x28, 0xB5, 0xF6, 0xF0, 0x37, 0x26, 0x1E, 0xCB, 0x45, + 0xC0, 0x1B, 0x17, 0x2C, 0x24, 0x0F, 0xEF, 0x18, 0x22, 0x16, 0x45, 0x22, + 0xCB, 0x13, 0x80, 0x22, 0x89, 0x05, 0x3D, 0x1E, 0x3F, 0xF8, 0x74, 0x20, + 0xDB, 0xE9, 0x05, 0x10, 0x60, 0xE0, 0x7E, 0xF7, 0xB8, 0xDF, 0xDC, 0xE7, + 0x9D, 0xEB, 0x24, 0xDE, 0x49, 0xFB, 0xC6, 0xE5, 0x6F, 0x08, 0x62, 0xFD, + 0x46, 0x0F, 0xC6, 0x0F, 0x71, 0x09, 0xB4, 0x0E, 0xC0, 0x11, 0x34, 0x0A, + 0x0A, 0x2A, 0x80, 0x08, 0x77, 0x38, 0x9C, 0x05, 0x04, 0x3C, 0x96, 0x09, + 0xD5, 0x34, 0xB7, 0x14, 0xCB, 0x19, 0x90, 0x13, 0x3A, 0x03, 0xD1, 0x01, + 0xC6, 0x00, 0x35, 0xF0, 0xA3, 0xFE, 0x8C, 0xF0, 0x94, 0xFA, 0x04, 0xF3, + 0xC8, 0x02, 0xA1, 0xEF, 0x73, 0xFF, 0x2F, 0xE6, 0xE2, 0xDD, 0x8D, 0xCE, + 0x85, 0xD2, 0x8C, 0xC9, 0x93, 0xEA, 0x31, 0xDB, 0xA6, 0xFE, 0xC2, 0xEB, + 0xDF, 0x08, 0x01, 0xFF, 0xBA, 0x02, 0x59, 0x0E, 0xEA, 0xF2, 0x34, 0x0B, + 0xB0, 0xF6, 0xD1, 0x11, 0x67, 0x03, 0xBD, 0x21, 0xFB, 0xFE, 0x29, 0x10, + 0xDB, 0xFC, 0xF7, 0xFD, 0x7F, 0x0F, 0x9A, 0x14, 0xFC, 0x0D, 0x2B, 0x12, + 0xAF, 0xF9, 0xB6, 0xEE, 0xAD, 0xF7, 0x9D, 0xF6, 0x8A, 0x01, 0x7B, 0x1A, + 0x9B, 0xFC, 0x6D, 0x25, 0x6E, 0xF5, 0x17, 0x28, 0xD2, 0xF3, 0x52, 0x1C, + 0x30, 0xE6, 0x58, 0xF3, 0x09, 0xD9, 0x40, 0xCE, 0x51, 0xD1, 0xA4, 0xBE, + 0xDA, 0xD1, 0x13, 0xC6, 0xCE, 0xE4, 0xA3, 0xE2, 0x69, 0xFF, 0x30, 0xFD, + 0x09, 0x0D, 0x23, 0x02, 0xFD, 0x07, 0xE6, 0x02, 0x0A, 0x08, 0xC1, 0x04, + 0x2E, 0x05, 0x74, 0xFF, 0x71, 0xFB, 0xD6, 0x04, 0xB6, 0xFD, 0xBB, 0x11, + 0x63, 0xF9, 0x05, 0x11, 0x5D, 0xEE, 0x26, 0xF8, 0xE0, 0xF1, 0xCA, 0xDF, + 0x29, 0xF4, 0xA5, 0xCF, 0xCE, 0xF2, 0x3E, 0xCD, 0x53, 0xF1, 0x3C, 0xDF, + 0xF2, 0xF0, 0x97, 0xE9, 0xF4, 0xEA, 0xE2, 0xDA, 0x82, 0xE5, 0xC4, 0xC3, + 0xA0, 0xE9, 0xDE, 0xC5, 0x96, 0xE4, 0x88, 0xD5, 0x81, 0xE6, 0x00, 0xDF, + 0x4D, 0xF4, 0x08, 0xF3, 0x5C, 0xEE, 0x61, 0x01, 0x46, 0xEE, 0xE3, 0x0B, + 0xF7, 0x0E, 0x5F, 0x28, 0x4E, 0x1F, 0x40, 0x31, 0x6B, 0x0D, 0x50, 0x13, + 0x4F, 0x0B, 0x84, 0x06, 0xCE, 0x18, 0x6E, 0x17, 0x5C, 0x07, 0xDB, 0x0B, + 0xD2, 0xF1, 0x95, 0xF9, 0xC1, 0xFC, 0x28, 0x0E, 0xC5, 0x02, 0x30, 0x23, + 0xFC, 0xFA, 0x4A, 0x24, 0x85, 0x02, 0x66, 0x19, 0x16, 0x0C, 0x90, 0xFB, + 0xCB, 0x05, 0x7B, 0xD9, 0x64, 0xF4, 0xD5, 0xCD, 0x1F, 0xD7, 0xA3, 0xCF, + 0x2E, 0xC7, 0x00, 0xC8, 0x7A, 0xDE, 0xF0, 0xD2, 0x19, 0xFF, 0x4D, 0xF1, + 0x60, 0x12, 0x66, 0xF6, 0xAD, 0x23, 0xEC, 0xF8, 0x0A, 0x2E, 0x3F, 0x0F, + 0x07, 0x27, 0x67, 0x16, 0xDE, 0x1A, 0x10, 0x0F, 0xCB, 0x0F, 0xCA, 0x0E, + 0xB3, 0xFE, 0xCC, 0x13, 0x5F, 0xF1, 0xD2, 0x0B, 0x80, 0xFA, 0x13, 0x0C, + 0x07, 0x02, 0x5E, 0x18, 0x45, 0xFF, 0x5D, 0x12, 0x03, 0x03, 0xB6, 0x0F, + 0x8B, 0xFD, 0x0E, 0x09, 0x78, 0xE5, 0x19, 0xF2, 0x60, 0xD1, 0x60, 0xE2, + 0xDB, 0xE7, 0x51, 0xEE, 0xD9, 0x0C, 0xB0, 0xFF, 0xBA, 0x10, 0x9C, 0xFC, + 0xCF, 0x0D, 0xED, 0xFF, 0x79, 0x06, 0x9C, 0xFF, 0xE3, 0xF1, 0x7A, 0x00, + 0x81, 0xFC, 0xE7, 0x25, 0xC8, 0x21, 0xC1, 0x4A, 0x05, 0x27, 0x27, 0x40, + 0xA9, 0x23, 0x31, 0x2C, 0x1E, 0x38, 0xE6, 0x34, 0xAD, 0x2E, 0x01, 0x22, + 0x92, 0x0B, 0xDE, 0xF0, 0x5A, 0x16, 0x2B, 0xF9, 0x3C, 0x34, 0xCB, 0x1C, + 0x70, 0x32, 0x89, 0x28, 0x21, 0x25, 0x33, 0x30, 0xAE, 0x19, 0x76, 0x31, + 0x1A, 0x0A, 0xB5, 0x1A, 0x26, 0xF5, 0x98, 0xF7, 0x23, 0xE2, 0x7E, 0xEC, + 0x10, 0xE1, 0xC5, 0xF7, 0x3F, 0xFA, 0x7F, 0x0F, 0x7A, 0x1A, 0x3B, 0x29, + 0xD9, 0x27, 0x37, 0x2C, 0x11, 0x31, 0x38, 0x27, 0xE7, 0x35, 0x2E, 0x31, + 0x8D, 0x29, 0xE8, 0x39, 0xBB, 0x25, 0xCD, 0x37, 0xCB, 0x25, 0xC2, 0x2F, + 0x14, 0x1E, 0x32, 0x28, 0x23, 0x11, 0x5A, 0x18, 0x71, 0x04, 0x03, 0x04, + 0x32, 0x00, 0xFA, 0xFD, 0x86, 0x03, 0x32, 0x01, 0xA9, 0x13, 0x22, 0x0A, + 0x75, 0x18, 0xB3, 0x07, 0x3F, 0x07, 0x97, 0xF2, 0xFF, 0xF0, 0x08, 0xD6, + 0x60, 0xEC, 0x05, 0xCE, 0x4F, 0xF9, 0x18, 0xDC, 0x70, 0xFE, 0x96, 0xE1, + 0x5B, 0x03, 0x69, 0xEA, 0xF4, 0x0A, 0x8D, 0xF5, 0x69, 0x0B, 0x01, 0xF2, + 0x5C, 0x0F, 0x58, 0x03, 0x31, 0x1F, 0x62, 0x25, 0x27, 0x1B, 0xEA, 0x18, + 0x43, 0x03, 0x9C, 0xF7, 0xE9, 0x07, 0x0F, 0xFE, 0x87, 0x0E, 0x61, 0x0A, + 0x49, 0xF4, 0x19, 0xFD, 0xFE, 0xEF, 0xAC, 0x0B, 0xC6, 0x0E, 0x18, 0x2B, + 0x89, 0x1A, 0xF7, 0x24, 0xF7, 0x0D, 0x90, 0x13, 0x1F, 0xFB, 0xE1, 0x06, + 0x78, 0xE7, 0xA8, 0xF2, 0x76, 0xD4, 0x36, 0xD7, 0xB4, 0xC8, 0xA2, 0xC6, + 0x44, 0xC8, 0xB7, 0xC8, 0xF2, 0xCE, 0x52, 0xD0, 0xDD, 0xE2, 0x17, 0xDA, + 0x54, 0xF6, 0xDD, 0xE4, 0x1F, 0xF8, 0xAB, 0xF1, 0x9C, 0xF6, 0x5A, 0xFC, + 0x08, 0xFB, 0xD9, 0x04, 0x98, 0x0B, 0xEC, 0x10, 0x3E, 0x18, 0x18, 0x0B, + 0x35, 0x0F, 0x72, 0xF3, 0x72, 0x09, 0x36, 0xEA, 0xDA, 0x02, 0x65, 0xEC, + 0x89, 0xEF, 0xDC, 0xE7, 0xFB, 0xE3, 0x38, 0xE6, 0x07, 0xE7, 0x78, 0xEB, + 0x97, 0xE8, 0xF2, 0xEB, 0x53, 0xD5, 0xD6, 0xDE, 0xA4, 0xC4, 0x57, 0xD3, + 0x0E, 0xBE, 0x9A, 0xCC, 0x6A, 0xCC, 0xF1, 0xD7, 0x4D, 0xEE, 0x9F, 0xF8, + 0x80, 0xF6, 0x30, 0x09, 0x92, 0xEE, 0xAE, 0x0F, 0x55, 0xEE, 0x36, 0x14, + 0xD1, 0xEF, 0x8B, 0x07, 0x98, 0x00, 0x57, 0x09, 0x28, 0x17, 0xB8, 0x17, + 0xDD, 0x04, 0x6F, 0x02, 0xE4, 0xE1, 0x64, 0xE9, 0x30, 0xE9, 0x78, 0x02, + 0x68, 0xFC, 0x24, 0x1D, 0x2F, 0xF2, 0xDB, 0x02, 0xEA, 0xFC, 0xDD, 0xEE, + 0xDC, 0x24, 0x55, 0xFC, 0x33, 0x20, 0xDB, 0xF3, 0xD0, 0xFD, 0x16, 0xE2, + 0x7C, 0xE5, 0x8B, 0xDD, 0xA4, 0xD5, 0x5C, 0xDB, 0x4C, 0xD4, 0x34, 0xDD, + 0xBF, 0xE0, 0x99, 0xE2, 0x6C, 0xE9, 0x74, 0xDF, 0x9A, 0xEE, 0xCC, 0xDF, + 0x42, 0xFE, 0x19, 0xEA, 0x5A, 0x05, 0xBE, 0xE8, 0x61, 0xFA, 0x31, 0xDD, + 0xF1, 0xF6, 0xC1, 0xE3, 0x81, 0xFA, 0xD9, 0xFE, 0x20, 0x01, 0xAE, 0x17, + 0xFD, 0x14, 0x92, 0x29, 0x04, 0x21, 0xAF, 0x25, 0x17, 0x14, 0x6F, 0x13, + 0x9B, 0xFD, 0xB7, 0x0A, 0xFE, 0xE9, 0xDE, 0xFD, 0xE1, 0xE1, 0xFF, 0xF0, + 0x11, 0xE9, 0x87, 0xE9, 0xD5, 0xEA, 0x90, 0xDF, 0xBD, 0xE1, 0x3A, 0xD5, + 0xA2, 0xDE, 0xBB, 0xD6, 0x2E, 0xD5, 0xE6, 0xDD, 0x81, 0xCB, 0xB6, 0xE5, + 0xBD, 0xE6, 0x04, 0x0B, 0x7A, 0x0A, 0xCD, 0x26, 0x3C, 0x0A, 0x5F, 0x16, + 0xD3, 0x05, 0xA4, 0x09, 0x1D, 0x04, 0xF9, 0x02, 0xC1, 0x00, 0xBA, 0x00, + 0x29, 0x1A, 0x6C, 0x1B, 0xEB, 0x1E, 0xA8, 0x26, 0x23, 0xF8, 0x37, 0x05, + 0xEE, 0xF2, 0x75, 0xF9, 0x93, 0x16, 0x35, 0x12, 0xF4, 0x14, 0xDE, 0x03, + 0x14, 0xFD, 0x5F, 0xE4, 0xF2, 0x0D, 0x80, 0xF0, 0xB1, 0x11, 0xD5, 0xF8, + 0x52, 0xFB, 0x84, 0xF6, 0xBD, 0xF2, 0x54, 0x03, 0x24, 0xEC, 0xB4, 0xFD, + 0x98, 0xF2, 0xD9, 0xE6, 0xD9, 0x01, 0xAA, 0xD5, 0xB0, 0xFE, 0x27, 0xC6, + 0x1F, 0xF4, 0x11, 0xBF, 0x85, 0x00, 0x59, 0xD2, 0x4D, 0x0D, 0xD9, 0xE5, + 0x69, 0x08, 0xEA, 0xEE, 0x3A, 0x05, 0x41, 0x05, 0x5F, 0xFD, 0x97, 0x14, + 0x51, 0xF7, 0xCD, 0x14, 0xAB, 0x0E, 0xA6, 0x29, 0xB1, 0x22, 0x78, 0x36, + 0x02, 0x12, 0x6C, 0x19, 0xBB, 0x03, 0x86, 0x00, 0x51, 0xFF, 0xC2, 0xFC, + 0x8D, 0xEF, 0x3B, 0xF3, 0x2E, 0xEA, 0xAC, 0xF1, 0xFF, 0xEF, 0x03, 0xFB, + 0xDA, 0xE7, 0x66, 0xF0, 0x8F, 0xD9, 0x0D, 0xDF, 0xD6, 0xDB, 0xD1, 0xD8, + 0xE9, 0xD8, 0xD1, 0xC7, 0xDF, 0xD9, 0xE2, 0xC7, 0x72, 0xF6, 0xB4, 0xF1, + 0xF7, 0x0A, 0x56, 0x11, 0x95, 0x13, 0x24, 0x16, 0x83, 0x13, 0x1F, 0x19, + 0x4F, 0xFD, 0x2E, 0x0E, 0x60, 0xF6, 0x49, 0x10, 0xD8, 0x0E, 0x42, 0x2A, + 0x68, 0x09, 0xCC, 0x13, 0xC9, 0xE8, 0xDF, 0xEE, 0x88, 0xF5, 0x8B, 0x09, + 0xFA, 0x10, 0x0B, 0x2E, 0x33, 0x00, 0xC8, 0x1B, 0x23, 0xEA, 0x03, 0x07, + 0x9A, 0xED, 0xDB, 0x12, 0x59, 0xED, 0x07, 0x0B, 0x66, 0xF6, 0xB2, 0x09, + 0xF3, 0x0D, 0xF8, 0x18, 0xCF, 0x08, 0xDF, 0x11, 0x73, 0xF4, 0xC8, 0x0D, + 0xD9, 0xF3, 0xFD, 0x11, 0x93, 0xF0, 0x0A, 0xFF, 0xFC, 0xEE, 0xCE, 0xEC, + 0x29, 0x07, 0x3F, 0xF8, 0x33, 0x1B, 0xE7, 0xF6, 0xD5, 0x1F, 0x4E, 0xEF, + 0x59, 0x1F, 0xEE, 0xF9, 0xA6, 0x11, 0x1E, 0xF2, 0x20, 0x0F, 0x6A, 0xEC, + 0x74, 0x33, 0xF1, 0x13, 0xDB, 0x48, 0xCE, 0x32, 0x78, 0x2F, 0xF2, 0x25, + 0x03, 0x26, 0x61, 0x22, 0x33, 0x39, 0xCB, 0x21, 0x3B, 0x36, 0xDD, 0x08, + 0x63, 0x25, 0xE7, 0x03, 0x0B, 0x15, 0x8D, 0x06, 0x72, 0x09, 0xDA, 0xF8, + 0x67, 0x12, 0xF4, 0xFA, 0xB4, 0x1E, 0x23, 0x0C, 0x95, 0x18, 0xC6, 0x13, + 0x2B, 0x0E, 0x29, 0x22, 0xB0, 0x12, 0x18, 0x3F, 0x2F, 0x0D, 0xF7, 0x40, + 0xD1, 0xFE, 0x90, 0x33, 0x75, 0x0B, 0xC7, 0x31, 0xE5, 0x21, 0x36, 0x2A, + 0x28, 0x32, 0x14, 0x2E, 0x03, 0x49, 0x24, 0x55, 0x01, 0x3D, 0x2B, 0x57, + 0x68, 0x03, 0xE1, 0x24, 0x5A, 0xEA, 0xA4, 0x1C, 0x9E, 0x05, 0x9F, 0x33, + 0xD2, 0x1A, 0x91, 0x2A, 0x49, 0x1D, 0x01, 0x0F, 0x28, 0x26, 0x61, 0x05, + 0xDA, 0x29, 0xFA, 0x04, 0x0D, 0x2D, 0x9E, 0x09, 0x81, 0x3B, 0x65, 0x15, + 0x04, 0x34, 0x69, 0x0A, 0x71, 0x15, 0x52, 0xFF, 0x4C, 0x0A, 0xA0, 0x0A, + 0x17, 0x06, 0xCE, 0xFF, 0x3F, 0xF9, 0x45, 0xE3, 0x60, 0x01, 0xD7, 0xE6, + 0x13, 0xFD, 0x86, 0xF5, 0x22, 0xE3, 0x50, 0xF3, 0x77, 0xE7, 0x27, 0xF9, + 0x23, 0xF8, 0xA1, 0xFD, 0x18, 0xFD, 0xC8, 0x00, 0xF4, 0x10, 0x56, 0x1D, + 0xD3, 0x25, 0xC1, 0x2F, 0x2E, 0x0E, 0x31, 0x13, 0x80, 0xF6, 0x3B, 0xF5, + 0x9A, 0xFE, 0x3F, 0xF9, 0x51, 0xF7, 0x67, 0xFE, 0x99, 0xF7, 0x21, 0x06, + 0xFB, 0x08, 0xB5, 0x14, 0xDD, 0xFA, 0x33, 0x0B, 0x9D, 0xDD, 0x4E, 0xF4, + 0x5B, 0xD7, 0xA1, 0xE8, 0xA7, 0xCF, 0xAC, 0xDD, 0x65, 0xC0, 0x5F, 0xC8, + 0x13, 0xD7, 0x62, 0xC6, 0xC1, 0xF7, 0x01, 0xE2, 0x37, 0xF1, 0x5A, 0xF1, + 0xB4, 0xEC, 0xEF, 0xF3, 0xEE, 0xFB, 0xF7, 0xFD, 0x0A, 0xFC, 0x2A, 0x03, + 0x14, 0x05, 0x03, 0x0C, 0xA0, 0x16, 0xAF, 0x18, 0x15, 0x02, 0x67, 0x06, + 0xBE, 0xEE, 0xF6, 0xE8, 0xA7, 0x0C, 0x3F, 0xF5, 0xCE, 0x23, 0x56, 0x0E, + 0xE2, 0x07, 0x62, 0xFB, 0x3F, 0xEC, 0xDE, 0xDB, 0x47, 0xF4, 0x20, 0xE0, + 0x8B, 0x01, 0x9F, 0xE8, 0x25, 0x07, 0x25, 0xED, 0x29, 0x01, 0xD3, 0xFC, + 0xE6, 0xED, 0xD7, 0xFF, 0xF9, 0xDC, 0x6C, 0xEF, 0xE1, 0xD2, 0x8F, 0xDD, + 0x2A, 0xC9, 0x3C, 0xD4, 0x0E, 0xCB, 0x54, 0xD1, 0x4F, 0xDB, 0xCC, 0xD6, + 0x9A, 0xDD, 0xAD, 0xDA, 0x93, 0xDB, 0xEC, 0xD5, 0xF0, 0xE2, 0x28, 0xDD, + 0x0B, 0xE7, 0x9A, 0xE8, 0x6B, 0xEE, 0xA9, 0xEB, 0x25, 0x01, 0xA1, 0xEF, + 0xB6, 0x0F, 0x54, 0xF3, 0x63, 0x05, 0x00, 0xEF, 0x50, 0xF4, 0x3A, 0xE2, + 0x20, 0xFC, 0x5F, 0xED, 0xAA, 0x0A, 0x40, 0x04, 0x00, 0x0A, 0xE5, 0xFF, + 0x87, 0xFA, 0x00, 0xF5, 0x9A, 0xE0, 0x2D, 0xF5, 0x02, 0xC4, 0x2F, 0xEE, + 0x71, 0xB9, 0x03, 0xE4, 0xBF, 0xD4, 0x48, 0xEC, 0xA7, 0xE7, 0xD5, 0xE3, + 0x07, 0xE3, 0x99, 0xCD, 0x87, 0xEB, 0x4B, 0xE0, 0xFB, 0xEC, 0xA6, 0xF9, + 0x71, 0xE3, 0xE2, 0xF6, 0xAA, 0xF3, 0xCB, 0x03, 0xB0, 0x07, 0x59, 0x1A, + 0x8E, 0x09, 0x0B, 0x1A, 0x3D, 0x18, 0x91, 0x24, 0xC0, 0x22, 0xD8, 0x27, + 0xB6, 0x08, 0xF9, 0x00, 0xEB, 0x00, 0x9C, 0xF8, 0x77, 0x29, 0x60, 0x21, + 0xDA, 0x2E, 0x88, 0x1D, 0x16, 0x12, 0x05, 0xFB, 0xBE, 0x10, 0x84, 0x04, + 0x81, 0x0A, 0xBE, 0x15, 0xBC, 0xFC, 0x6C, 0x11, 0x4C, 0x02, 0x8D, 0x0F, + 0x84, 0x04, 0x01, 0x06, 0xA5, 0xF2, 0x31, 0xF2, 0x12, 0xEF, 0x8D, 0xF9, + 0xC6, 0x02, 0xB4, 0x0F, 0x75, 0x0A, 0xB7, 0x11, 0x03, 0x12, 0xCD, 0x19, + 0xBF, 0x12, 0xBD, 0x26, 0xB3, 0xFB, 0xFD, 0x21, 0x09, 0xF4, 0x66, 0x1E, + 0xB3, 0x0E, 0x1E, 0x1C, 0x77, 0x26, 0x8E, 0x0A, 0x6F, 0x2F, 0x72, 0xFB, + 0x25, 0x3C, 0xBD, 0x0B, 0x5A, 0x2E, 0xF5, 0x19, 0x41, 0x08, 0xC0, 0x0D, + 0x63, 0x00, 0xE4, 0x18, 0xBF, 0x12, 0x16, 0x32, 0x14, 0x15, 0xF8, 0x24, + 0x06, 0x11, 0xC4, 0x0A, 0xC3, 0x0C, 0x6A, 0xF5, 0x5C, 0xF8, 0xA2, 0xE1, + 0x7B, 0xE7, 0x94, 0xDD, 0x7D, 0xE8, 0x7F, 0xF0, 0x87, 0xE4, 0x13, 0xF7, + 0x87, 0xE6, 0x57, 0xE9, 0x0D, 0xFD, 0xEB, 0xF9, 0xED, 0x05, 0xF8, 0x0E, + 0xAE, 0x02, 0xBB, 0x06, 0x7D, 0x0C, 0x6A, 0xFC, 0xE7, 0x11, 0xA2, 0xF5, + 0x52, 0x0B, 0xFA, 0xED, 0x4B, 0x14, 0x60, 0xFC, 0xF3, 0x1B, 0x8C, 0x12, + 0xCF, 0x02, 0xC5, 0x06, 0x80, 0xFA, 0x45, 0xFA, 0xD0, 0x20, 0xC6, 0x18, + 0x90, 0x1F, 0xF0, 0x20, 0xEF, 0xEB, 0x2C, 0xF7, 0x9A, 0xDA, 0xD7, 0xE8, + 0x11, 0xEA, 0x8D, 0xED, 0xB1, 0xF5, 0xA6, 0xDC, 0xBA, 0x01, 0x4B, 0xDB, + 0xF6, 0x05, 0xAE, 0xEC, 0x77, 0xF1, 0xF0, 0xDE, 0x8E, 0xE5, 0x2A, 0xC9, + 0xE5, 0xEC, 0xDE, 0xD6, 0x3C, 0xEA, 0x63, 0xE9, 0x49, 0xF2, 0x3E, 0xF7, + 0xCB, 0xFF, 0xC0, 0x04, 0xF7, 0xF3, 0xB6, 0xFC, 0x68, 0xEE, 0x7B, 0xF6, + 0xD9, 0xF6, 0xCC, 0x0A, 0xBA, 0xE9, 0x32, 0x18, 0x4C, 0xDB, 0xCF, 0x08, + 0x35, 0xE1, 0x01, 0xFF, 0x1E, 0xE3, 0xAD, 0xFF, 0x7C, 0xDB, 0x66, 0xED, + 0x93, 0xE3, 0x11, 0xEA, 0x7D, 0xF6, 0x00, 0xFC, 0x56, 0x00, 0xD8, 0x00, + 0x4A, 0x01, 0x10, 0xFC, 0xB0, 0xF9, 0xC8, 0xFF, 0x51, 0xEB, 0x60, 0x04, + 0x70, 0xE4, 0x91, 0xFA, 0xD9, 0xE2, 0x0B, 0xEF, 0x87, 0xE8, 0x98, 0xE2, + 0x74, 0xF0, 0x39, 0xCB, 0x83, 0xEB, 0x95, 0xC7, 0x54, 0xF0, 0x5B, 0xD6, + 0x22, 0x03, 0x73, 0xDD, 0x1D, 0x0B, 0xE4, 0xE5, 0x74, 0x06, 0x27, 0xEE, + 0x59, 0xFF, 0x84, 0xEE, 0x67, 0xFD, 0xCD, 0xEE, 0xA6, 0x0B, 0xD0, 0x03, + 0xBE, 0x1C, 0xCC, 0x13, 0xF7, 0x08, 0x82, 0xFC, 0x98, 0xE9, 0x46, 0xEE, + 0xDA, 0xF8, 0xD7, 0x08, 0xD5, 0x0B, 0x23, 0x1A, 0x3D, 0xF6, 0x65, 0x0B, + 0x62, 0xED, 0x48, 0x09, 0x0A, 0xFA, 0xB2, 0x16, 0xEB, 0xF3, 0xC4, 0x0B, + 0xAF, 0xF3, 0xCD, 0xFD, 0x7C, 0xFF, 0x4D, 0xF6, 0x02, 0xF4, 0xBD, 0xE2, + 0x8D, 0xE9, 0xD2, 0xE1, 0x14, 0xF8, 0x77, 0x00, 0xDD, 0x07, 0xAE, 0x10, + 0x8B, 0x0A, 0x68, 0x08, 0xC9, 0x00, 0x71, 0x07, 0xB2, 0xEA, 0x59, 0x04, + 0x5A, 0xD8, 0x55, 0xF9, 0xD5, 0xEC, 0x05, 0x06, 0xF5, 0x08, 0xEB, 0x16, + 0x46, 0x04, 0x91, 0x0F, 0x61, 0x01, 0x7F, 0x0E, 0x8E, 0x0C, 0x79, 0x1A, + 0xDC, 0x11, 0x40, 0x12, 0x43, 0x17, 0x85, 0x01, 0x0F, 0x26, 0xEC, 0x0A, + 0xBF, 0x2F, 0x5B, 0x1B, 0x64, 0x21, 0x55, 0x1C, 0x61, 0x14, 0x5A, 0x1B, + 0x7A, 0x0F, 0xE4, 0x13, 0x70, 0xFF, 0xF0, 0x07, 0x87, 0xF8, 0x5C, 0x05, + 0xEB, 0xFC, 0xCF, 0x00, 0xA3, 0xF3, 0xB3, 0xED, 0xFD, 0xE8, 0xF8, 0xE2, + 0x4B, 0xEC, 0xE5, 0xEB, 0xF8, 0xFB, 0x42, 0xF7, 0xD2, 0x0B, 0x39, 0xFE, + 0x1B, 0x12, 0x02, 0x02, 0x61, 0x18, 0xC0, 0x08, 0xAF, 0x1C, 0x64, 0x13, + 0xBB, 0x2E, 0x5C, 0x2A, 0x55, 0x42, 0x7A, 0x3C, 0xB8, 0x31, 0x64, 0x1F, + 0xA9, 0x23, 0x71, 0xFF, 0x7A, 0x32, 0x3A, 0x18, 0x7B, 0x27, 0x93, 0x2E, + 0x1A, 0x11, 0xA1, 0x23, 0xA8, 0x23, 0x91, 0x25, 0x34, 0x36, 0x9E, 0x2A, + 0xDF, 0x2A, 0x89, 0x23, 0xCE, 0x21, 0x47, 0x23, 0xEE, 0x19, 0xE6, 0x1D, + 0x97, 0x06, 0xD0, 0x08, 0x7A, 0xFB, 0xDE, 0x01, 0x48, 0xF9, 0x7B, 0x07, + 0x6B, 0xFB, 0xDC, 0x0D, 0x77, 0x04, 0x3B, 0x19, 0xEF, 0x00, 0x54, 0x11, + 0xBC, 0xE7, 0xB2, 0xF2, 0xC9, 0xE1, 0x61, 0xEB, 0x77, 0xFB, 0x81, 0x06, + 0x1E, 0x13, 0xE4, 0x17, 0x4A, 0x1C, 0x02, 0x19, 0xD8, 0x1A, 0xED, 0x1D, + 0xE3, 0x15, 0x0B, 0x1B, 0x86, 0x1A, 0x52, 0x17, 0xB5, 0x2B, 0xB1, 0x18, + 0x54, 0x31, 0xAD, 0x08, 0x37, 0x2A, 0x08, 0x01, 0xF0, 0x1F, 0x23, 0x13, + 0xD4, 0x16, 0x48, 0x23, 0x71, 0x21, 0x19, 0x30, 0xDF, 0x42, 0xA7, 0x49, + 0x18, 0x56, 0x08, 0x58, 0x43, 0x50, 0x24, 0x50, 0x8E, 0x5B, 0x35, 0x5F, + 0x63, 0x4C, 0xC8, 0x5C, 0x16, 0x2E, 0x0F, 0x45, 0xA5, 0x4A, 0xF4, 0x5C, + 0xD7, 0x50, 0x86, 0x51, 0x4C, 0x26, 0xF2, 0x10, 0x0A, 0x38, 0x34, 0x22, + 0x4C, 0x65, 0x6C, 0x58, 0xEA, 0x53, 0x61, 0x52, 0x2F, 0x3F, 0x16, 0x4D, + 0x28, 0x34, 0x21, 0x48, 0x66, 0x01, 0x4B, 0x07, 0x18, 0xDF, 0x5A, 0xD2, + 0x72, 0xE4, 0x35, 0xD6, 0x96, 0xD9, 0x5B, 0xD0, 0x39, 0xB6, 0x01, 0xB5, + 0x19, 0xAF, 0x65, 0xB7, 0x5F, 0xB9, 0xD4, 0xBF, 0xE5, 0xAC, 0x11, 0xAA, + 0x1F, 0xAB, 0xF6, 0xA7, 0xAC, 0xBF, 0x06, 0xC2, 0xE1, 0xB6, 0x24, 0xB5, + 0xA3, 0x9E, 0x93, 0x97, 0xBA, 0xAB, 0x73, 0xA6, 0x32, 0xBD, 0xBB, 0xBD, + 0xE2, 0xB4, 0x12, 0xBE, 0xBA, 0xB3, 0xAB, 0xBD, 0x8C, 0xB4, 0x3A, 0xBA, + 0xE4, 0xB8, 0xF5, 0xBD, 0x9A, 0xDE, 0x8A, 0xE3, 0x28, 0xFD, 0x75, 0xFB, + 0x81, 0xF6, 0xEA, 0xEF, 0xF9, 0x0C, 0x86, 0x0F, 0x65, 0x1B, 0xEC, 0x26, + 0x00, 0x03, 0x1D, 0x10, 0xC9, 0x10, 0xD3, 0x22, 0x19, 0x24, 0x5F, 0x37, + 0x67, 0x1A, 0xF0, 0x1F, 0x29, 0x20, 0x7A, 0x1B, 0x7D, 0x34, 0x86, 0x35, + 0x6C, 0x2F, 0xB3, 0x38, 0x15, 0x1F, 0x3B, 0x1B, 0x22, 0x23, 0x8A, 0x0D, + 0x44, 0x28, 0x2F, 0x14, 0x46, 0x1C, 0x1F, 0x07, 0x27, 0x12, 0x7F, 0xF3, + 0x65, 0x14, 0xEC, 0xF0, 0x93, 0x0E, 0xCF, 0xEC, 0x9C, 0xFD, 0x6C, 0xDD, + 0x76, 0xF5, 0x67, 0xDF, 0xF1, 0xE9, 0xE8, 0xE3, 0xCE, 0xCA, 0xD0, 0xBF, + 0x93, 0xCA, 0x28, 0xBA, 0x5C, 0xE5, 0xBC, 0xE7, 0x82, 0xC8, 0x31, 0xD3, + 0x0A, 0xA1, 0x58, 0xA3, 0x88, 0xB0, 0x74, 0xB6, 0x5A, 0xC2, 0x1D, 0xD3, + 0x2D, 0xBC, 0x46, 0xC9, 0x04, 0xB3, 0x83, 0xBA, 0x73, 0xAE, 0xF7, 0xB7, + 0x08, 0xA3, 0x82, 0xA5, 0xB9, 0x9E, 0x71, 0xA0, 0x45, 0xAB, 0x9F, 0xB4, + 0x15, 0xB5, 0x97, 0xC0, 0xA1, 0xC3, 0xFD, 0xCB, 0xEF, 0xE8, 0x6A, 0xEA, + 0xDC, 0x0F, 0x54, 0x05, 0x7E, 0x1E, 0xCD, 0x06, 0xE3, 0x19, 0xF6, 0x00, + 0xB8, 0x08, 0xF9, 0xF3, 0xAF, 0xF9, 0x23, 0xEE, 0x56, 0x08, 0x97, 0x09, + 0x05, 0x18, 0x35, 0x1C, 0x12, 0x0F, 0xB6, 0x0F, 0xC0, 0x23, 0xD0, 0x1A, + 0xA2, 0x3D, 0x0D, 0x25, 0x0C, 0x2C, 0x4D, 0x0E, 0xAF, 0x25, 0x41, 0x14, + 0x8E, 0x2B, 0x2D, 0x2A, 0x4B, 0x16, 0xBD, 0x1B, 0x08, 0x06, 0xD2, 0x0B, + 0xF0, 0xFC, 0xB5, 0x01, 0xBF, 0xE7, 0xDE, 0xED, 0x55, 0xDD, 0x01, 0xEB, + 0xEF, 0xD1, 0x5B, 0xDD, 0x91, 0xBD, 0x1A, 0xB8, 0x35, 0xBE, 0xE5, 0xA6, + 0xB6, 0xCE, 0x8A, 0xB1, 0x7C, 0xC3, 0xAB, 0xB7, 0x34, 0xAD, 0x66, 0xBF, + 0xDF, 0xB2, 0xB3, 0xD8, 0xD7, 0xBD, 0xA8, 0xDF, 0x3F, 0xC1, 0x97, 0xCE, + 0xE2, 0xCF, 0xD5, 0xC9, 0xA9, 0xDF, 0x3F, 0xD1, 0xE2, 0xF1, 0x46, 0xE3, + 0x15, 0x06, 0x8C, 0xF6, 0x9C, 0xF6, 0xD3, 0xE6, 0x5F, 0xD7, 0xF6, 0xD3, + 0x21, 0xF3, 0x23, 0xFE, 0xA5, 0x20, 0xE3, 0x2B, 0x00, 0x15, 0x4B, 0x13, + 0x89, 0x10, 0xC8, 0xFE, 0x36, 0x29, 0x00, 0x16, 0xB6, 0x1D, 0x70, 0x0B, + 0x4B, 0x1B, 0x35, 0xFD, 0xB4, 0x3E, 0xC4, 0x18, 0x11, 0x44, 0x5F, 0x2D, + 0x0B, 0x27, 0x44, 0x2F, 0x5E, 0x15, 0xEF, 0x2A, 0x84, 0x1A, 0x17, 0x27, + 0x9A, 0x22, 0x40, 0x26, 0x07, 0x26, 0x74, 0x2D, 0xBA, 0x1B, 0xB2, 0x2A, + 0xF0, 0x17, 0x16, 0x26, 0xAE, 0x29, 0x69, 0x3C, 0x79, 0x31, 0x66, 0x49, + 0x91, 0x26, 0xF1, 0x3B, 0x44, 0x14, 0xE4, 0x24, 0xBA, 0x09, 0xEA, 0x11, + 0x0E, 0x12, 0xF2, 0x0B, 0x7D, 0x22, 0x6A, 0x17, 0x29, 0x35, 0x54, 0x37, + 0x55, 0x4E, 0x78, 0x52, 0xE0, 0x60, 0x05, 0x61, 0x9C, 0x5E, 0xB8, 0x62, + 0xC8, 0x53, 0x4D, 0x5B, 0xA0, 0x52, 0x86, 0x5E, 0x80, 0x47, 0xFC, 0x5A, + 0x40, 0x2E, 0x87, 0x44, 0x12, 0x3B, 0x2A, 0x47, 0xDA, 0x5E, 0xB5, 0x60, + 0xE7, 0x60, 0x49, 0x5D, 0x85, 0x55, 0x7A, 0x52, 0x21, 0x5B, 0x6D, 0x60, + 0x86, 0x5D, 0xDD, 0x61, 0xC3, 0x5A, 0x90, 0x54, 0x94, 0x5C, 0x22, 0x5C, + 0x4A, 0x54, 0x1A, 0x63, 0xE3, 0x43, 0xC4, 0x51, 0x29, 0x4D, 0x76, 0x58, + 0x33, 0x60, 0x76, 0x66, 0xDE, 0x4E, 0xB1, 0x43, 0xA2, 0x46, 0x93, 0x2D, + 0x04, 0x5E, 0x24, 0x3B, 0xDD, 0x5B, 0x54, 0x33, 0x45, 0x44, 0x9E, 0x22, + 0x1D, 0x39, 0x70, 0x2E, 0x22, 0x3E, 0x07, 0x42, 0xE7, 0x46, 0x5D, 0x44, + 0xA7, 0x4E, 0xFA, 0x3D, 0xAB, 0x43, 0xC1, 0x2D, 0x05, 0x18, 0xE6, 0x15, + 0x89, 0x00, 0xCA, 0x14, 0x1D, 0x09, 0x43, 0x21, 0x99, 0x0E, 0xA4, 0x21, + 0xE4, 0x0D, 0xAF, 0x1D, 0x09, 0x08, 0xD7, 0x10, 0x7E, 0xFF, 0xB9, 0xFB, + 0x1C, 0xFE, 0xA5, 0xF2, 0x61, 0xF6, 0x83, 0xEA, 0x7B, 0xE7, 0x72, 0xDC, + 0x42, 0xE4, 0x16, 0xE0, 0xFF, 0xDF, 0x22, 0xEB, 0xB3, 0xD3, 0xD5, 0xDA, + 0x98, 0xE9, 0x05, 0xDA, 0xDB, 0x0C, 0x48, 0xFE, 0xB8, 0xF8, 0x5C, 0xFE, + 0x7F, 0xD8, 0xFE, 0xEA, 0x7D, 0xDB, 0xDA, 0xF6, 0xED, 0xE6, 0xAE, 0x01, + 0x36, 0xF1, 0x2F, 0x05, 0x61, 0xF4, 0xE8, 0x0C, 0x36, 0xDA, 0x88, 0xFA, + 0xFA, 0xC1, 0x40, 0xD6, 0x93, 0xC4, 0x80, 0xC2, 0xAB, 0xCB, 0x50, 0xC2, + 0x88, 0xC2, 0x2E, 0xC2, 0x4F, 0xB7, 0xB2, 0xC1, 0x5A, 0xC1, 0x02, 0xC8, + 0x37, 0xC9, 0x31, 0xC6, 0x4D, 0xBE, 0xF0, 0xBA, 0x5A, 0xAF, 0x68, 0xB2, + 0x3E, 0xAD, 0x56, 0xB5, 0x38, 0xAD, 0x10, 0xBB, 0x5E, 0xAF, 0xA2, 0xC1, + 0xA7, 0xB6, 0xA6, 0xC2, 0x75, 0xAD, 0x86, 0xB0, 0x36, 0xA4, 0xFD, 0xA2, + 0xEE, 0xB9, 0xDF, 0xB2, 0x68, 0xD2, 0x3D, 0xBF, 0xC0, 0xDA, 0x8B, 0xBE, + 0x89, 0xEB, 0xFE, 0xCB, 0x0E, 0xFD, 0x52, 0xDA, 0x80, 0x12, 0xB2, 0xED, + 0x8C, 0x29, 0x13, 0x05, 0xC9, 0x1F, 0x2F, 0x05, 0x0A, 0x0B, 0xDE, 0x04, + 0xA0, 0x01, 0x26, 0x0C, 0x01, 0xFD, 0x16, 0x0B, 0x71, 0x02, 0xD2, 0x07, + 0x6A, 0x18, 0x40, 0x13, 0x4E, 0x1F, 0x4E, 0x1B, 0xD2, 0x10, 0xC0, 0x19, + 0x94, 0x1C, 0x1F, 0x30, 0x90, 0x29, 0x7F, 0x34, 0xCD, 0x1D, 0x58, 0x18, + 0x30, 0x1F, 0xD2, 0x1D, 0xD2, 0x22, 0x0E, 0x39, 0x95, 0x0F, 0xB0, 0x2B, + 0x6D, 0x05, 0x12, 0x11, 0x10, 0x06, 0x7F, 0x0A, 0x03, 0x01, 0xAD, 0x03, + 0xEC, 0xF8, 0xB5, 0xF7, 0x33, 0xF0, 0xED, 0xF6, 0xC4, 0xF0, 0x85, 0x01, + 0x85, 0xFD, 0xD3, 0x07, 0x0F, 0x12, 0xB4, 0x10, 0x6C, 0x1E, 0xB4, 0x13, + 0xB8, 0x18, 0x5E, 0x03, 0x9D, 0x18, 0x3A, 0xF0, 0xB5, 0x20, 0x89, 0xEA, + 0x71, 0x1F, 0x21, 0xF5, 0x3F, 0x1D, 0x85, 0xFE, 0x50, 0x24, 0x77, 0x02, + 0xC5, 0x2D, 0xCF, 0x0A, 0x8D, 0x30, 0x1C, 0x11, 0xB2, 0x2B, 0x34, 0x1C, + 0xBF, 0x19, 0xA3, 0x24, 0xDD, 0x03, 0xD5, 0x18, 0x17, 0x03, 0x37, 0x0D, + 0x7F, 0x15, 0x44, 0x0F, 0xB6, 0x1B, 0x3E, 0x0E, 0xFD, 0x0E, 0x34, 0x00, + 0xE9, 0x16, 0xD4, 0x06, 0x55, 0x27, 0xF5, 0x16, 0x1B, 0x14, 0xB7, 0x0A, + 0x5E, 0xFF, 0xB9, 0x02, 0xB4, 0x0B, 0x68, 0x0D, 0xF2, 0x10, 0xBC, 0x0D, + 0x89, 0xFA, 0x7B, 0x02, 0xFA, 0xE5, 0x0B, 0xFC, 0x3F, 0xD2, 0x4F, 0xF3, + 0xCD, 0xBF, 0xA3, 0xEA, 0xC9, 0xCB, 0xE1, 0xEE, 0x03, 0xDA, 0x13, 0xEF, + 0xE7, 0xD8, 0xD0, 0xE9, 0xC5, 0xDF, 0x61, 0xEA, 0x3A, 0xE8, 0xC8, 0xE0, + 0x47, 0xE6, 0xA5, 0xC2, 0x53, 0xE4, 0x56, 0xB6, 0x32, 0xE7, 0xB9, 0xC5, + 0xEF, 0xDA, 0x37, 0xCF, 0x02, 0xCF, 0x4C, 0xE4, 0x95, 0xC8, 0xE4, 0xED, + 0x8E, 0xBE, 0xFE, 0xD0, 0xB4, 0xCC, 0xCC, 0xC8, 0xB5, 0xDA, 0x6E, 0xCC, + 0x91, 0xD2, 0x15, 0xC4, 0xE1, 0xDD, 0x07, 0xD7, 0xCD, 0xFE, 0xC7, 0x00, + 0x82, 0x11, 0x07, 0x1F, 0x74, 0x14, 0xA7, 0x2B, 0x13, 0x17, 0xD4, 0x35, + 0x86, 0x07, 0x9B, 0x25, 0xAC, 0x02, 0x50, 0x14, 0xC5, 0x11, 0x77, 0x20, + 0xE9, 0xFF, 0x67, 0x16, 0xAF, 0xE4, 0x60, 0x04, 0x01, 0xE1, 0xC1, 0x07, + 0x07, 0xF4, 0x1F, 0x0D, 0xE5, 0xFE, 0xDA, 0x02, 0xE7, 0xF0, 0xE8, 0xED, + 0xA4, 0xEA, 0x14, 0xE4, 0x4C, 0xE8, 0x7A, 0xDB, 0x3A, 0xE3, 0x32, 0xD3, + 0x50, 0xE4, 0x9D, 0xDA, 0x05, 0xD6, 0xD9, 0xCF, 0xE9, 0xB6, 0x33, 0xAD, + 0xF7, 0xC1, 0x77, 0xB5, 0x0A, 0xF2, 0xC2, 0xDF, 0xFB, 0xEB, 0x2E, 0xDE, + 0xF9, 0xC7, 0x35, 0xCA, 0x7F, 0xD0, 0x94, 0xD8, 0x78, 0xDC, 0x5E, 0xEA, + 0xB1, 0xD8, 0xAA, 0xE9, 0x6C, 0xD9, 0x55, 0xE4, 0xDF, 0xCD, 0x85, 0xDF, + 0xC8, 0xCB, 0x73, 0xE2, 0x5D, 0xD6, 0xB3, 0xE6, 0x2B, 0xDF, 0x67, 0xEB, + 0x1D, 0xE8, 0xAB, 0xFB, 0xB2, 0xE2, 0xE7, 0x0D, 0xD0, 0xD3, 0x0C, 0x06, + 0x42, 0xD6, 0xB5, 0xF2, 0x47, 0xEE, 0xD6, 0xFD, 0x5A, 0xF9, 0x01, 0x01, + 0xDD, 0xF6, 0x8D, 0xF6, 0xE4, 0xFA, 0x68, 0x0A, 0x47, 0xFA, 0x2B, 0x21, + 0xDF, 0xF2, 0xC1, 0x19, 0xA9, 0xF4, 0x2F, 0x03, 0xE5, 0x01, 0x60, 0xFB, + 0xA4, 0xF9, 0xBE, 0xF1, 0x8D, 0xE4, 0x01, 0xE5, 0x8F, 0xE7, 0x32, 0xE9, + 0x08, 0xF1, 0x6D, 0xED, 0xDF, 0xF8, 0x16, 0xFC, 0xCE, 0x04, 0x17, 0x0C, + 0xF9, 0xFD, 0xE0, 0xEF, 0x6D, 0xF5, 0xA0, 0xD9, 0x99, 0xF4, 0x21, 0xE5, + 0x3C, 0xDD, 0xCE, 0xE0, 0x7B, 0xBB, 0x21, 0xC9, 0x3E, 0xBA, 0x98, 0xB4, + 0x2D, 0xD0, 0xDD, 0xB0, 0xDA, 0xC8, 0x62, 0xA8, 0x7E, 0xBA, 0x32, 0xA4, + 0xAE, 0xC4, 0xB4, 0xB5, 0x99, 0xC4, 0x2B, 0xB6, 0x68, 0xBE, 0x0D, 0xB3, + 0x6F, 0xD6, 0x22, 0xD3, 0x3B, 0xE3, 0xD3, 0xDA, 0xCC, 0xC3, 0x7F, 0xB7, + 0xAB, 0xC3, 0x39, 0xC0, 0x6A, 0xE8, 0x4C, 0xE6, 0x92, 0xDC, 0xFE, 0xD7, + 0xB5, 0xC7, 0x25, 0xC7, 0x45, 0xD9, 0x65, 0xE3, 0x86, 0xF0, 0x81, 0xFE, + 0xEC, 0x06, 0xC0, 0x10, 0x1D, 0x14, 0x95, 0x22, 0x34, 0x1E, 0x9A, 0x2E, + 0x13, 0x22, 0x25, 0x24, 0x8B, 0x1C, 0x20, 0x0F, 0x71, 0x2B, 0x8E, 0x1A, + 0x20, 0x2B, 0x42, 0x29, 0x5A, 0x12, 0xA2, 0x20, 0xA2, 0x1B, 0x34, 0x1A, + 0xC9, 0x2D, 0x68, 0x07, 0x0C, 0x3B, 0x26, 0xFD, 0xAB, 0x38, 0xDF, 0x05, + 0xFD, 0x10, 0x21, 0x00, 0xCB, 0xF4, 0x91, 0xFF, 0x82, 0xF2, 0xF1, 0x00, + 0xC9, 0xF4, 0xA2, 0xF2, 0xD4, 0xF7, 0x59, 0xE8, 0xA7, 0xF7, 0x8B, 0xE1, + 0x06, 0xFE, 0xD6, 0xDE, 0x95, 0x0A, 0x00, 0xE9, 0x57, 0x0D, 0x82, 0xEA, + 0x3F, 0x18, 0x30, 0xF3, 0x05, 0x19, 0x24, 0x02, 0xFD, 0x05, 0xE6, 0x01, + 0xA0, 0xFB, 0xD8, 0xFD, 0x51, 0x12, 0xBA, 0x11, 0x91, 0x37, 0x52, 0x3A, + 0x1C, 0x32, 0x1A, 0x49, 0xEE, 0x1F, 0x53, 0x43, 0x2C, 0x2B, 0x4E, 0x47, + 0x5D, 0x33, 0xE4, 0x4F, 0x3B, 0x22, 0x4D, 0x44, 0x1A, 0x28, 0x57, 0x45, + 0x19, 0x3C, 0x65, 0x4D, 0x5A, 0x43, 0x17, 0x3D, 0xA7, 0x56, 0x3A, 0x46, + 0x96, 0x5B, 0x41, 0x5E, 0xE6, 0x45, 0xEF, 0x59, 0x51, 0x34, 0x29, 0x4F, + 0x32, 0x2C, 0xD2, 0x45, 0x15, 0x40, 0xE8, 0x47, 0xF2, 0x51, 0x6B, 0x47, + 0x86, 0x3A, 0x4B, 0x29, 0x80, 0x31, 0xDF, 0x1D, 0x4F, 0x48, 0x0B, 0x2B, + 0x13, 0x57, 0xE2, 0x2D, 0xE2, 0x54, 0xC5, 0x2C, 0xD4, 0x4D, 0xC3, 0x2C, + 0xDC, 0x4A, 0xEE, 0x2E, 0x64, 0x49, 0x81, 0x30, 0x42, 0x3C, 0x00, 0x2B, + 0xE7, 0x2F, 0xDA, 0x29, 0xBD, 0x2B, 0x9E, 0x29, 0x31, 0x13, 0x0B, 0x10, + 0xC0, 0x08, 0xCD, 0x07, 0x1D, 0x19, 0xE3, 0x17, 0xDE, 0x16, 0x06, 0x10, + 0x9D, 0x0A, 0xCD, 0x08, 0xE3, 0x04, 0x17, 0x1B, 0xC3, 0x04, 0x59, 0x2E, + 0xFC, 0xFF, 0x2E, 0x25, 0xFE, 0x02, 0xB8, 0x26, 0xF4, 0x0D, 0xA9, 0x3A, + 0xED, 0x11, 0x78, 0x38, 0xB9, 0x18, 0xBE, 0x29, 0x85, 0x28, 0xAF, 0x23, + 0xCF, 0x35, 0x3A, 0x23, 0x52, 0x25, 0x74, 0x1D, 0xDF, 0x0E, 0xB2, 0x1B, + 0xEA, 0x10, 0x21, 0x1A, 0x18, 0x1A, 0xDB, 0x1A, 0xBB, 0x23, 0x89, 0x2E, + 0x13, 0x25, 0x3B, 0x3C, 0x8A, 0x14, 0x80, 0x28, 0x41, 0x0C, 0xA9, 0x0E, + 0x7E, 0x26, 0xB6, 0x19, 0xA1, 0x34, 0x01, 0x26, 0xE4, 0x2C, 0x58, 0x20, + 0x79, 0x37, 0x55, 0x24, 0xE9, 0x37, 0xD0, 0x17, 0x69, 0x2F, 0x22, 0x09, + 0xD1, 0x36, 0x60, 0x13, 0xF6, 0x2F, 0xA6, 0x0F, 0x07, 0x17, 0x06, 0xF8, + 0x33, 0x1D, 0xB3, 0xF7, 0xB8, 0x45, 0x20, 0x17, 0x05, 0x46, 0x67, 0x21, + 0x82, 0x17, 0x83, 0x04, 0xBF, 0x10, 0x0C, 0x04, 0x37, 0x22, 0xC2, 0x1D, + 0x24, 0x0D, 0x6E, 0x0F, 0x99, 0xFA, 0xC4, 0xF4, 0x07, 0xF6, 0x42, 0xDF, + 0x63, 0xF4, 0xDF, 0xC9, 0x33, 0x09, 0x8A, 0xD9, 0x0C, 0x0E, 0xC4, 0xEE, + 0x71, 0xF5, 0x2E, 0xED, 0x77, 0xEE, 0x0B, 0xFD, 0xB4, 0xF3, 0x0E, 0xFF, + 0xA3, 0xF0, 0x5D, 0xDD, 0x06, 0x0C, 0x3A, 0xE6, 0xDC, 0x2C, 0xAE, 0x05, + 0x5D, 0x27, 0x81, 0x05, 0xFF, 0x1C, 0x69, 0x06, 0xF7, 0x13, 0xB7, 0x0D, + 0x1E, 0x0B, 0x14, 0x0E, 0x8C, 0x16, 0xBE, 0x17, 0xF3, 0x26, 0x03, 0x2A, + 0x86, 0x1E, 0xF2, 0x1E, 0x66, 0x16, 0x29, 0x0B, 0x30, 0x26, 0x83, 0x13, + 0x7A, 0x21, 0xAA, 0x14, 0x30, 0xF4, 0xC1, 0xFC, 0xAE, 0xE0, 0xFA, 0x00, + 0x7F, 0xF1, 0x4A, 0x1E, 0x88, 0xDE, 0xF1, 0x0D, 0x00, 0xD4, 0xCA, 0xFE, + 0xBB, 0xE8, 0xE6, 0x0D, 0x4D, 0xEF, 0x20, 0x0A, 0x9B, 0xEB, 0x67, 0xF8, + 0xE4, 0xF0, 0xD3, 0xFC, 0xAF, 0xF9, 0x71, 0x0D, 0x94, 0xFC, 0x5C, 0x09, + 0x19, 0x05, 0x83, 0xF4, 0x3A, 0x0F, 0x50, 0xE7, 0x98, 0x18, 0x64, 0xEF, + 0xB8, 0x19, 0xC7, 0x07, 0x1D, 0x0A, 0xEB, 0x1F, 0x96, 0xEB, 0x09, 0x18, + 0x7D, 0xD2, 0x68, 0xFA, 0x20, 0xE9, 0x33, 0x02, 0xA2, 0x10, 0xA0, 0x1C, + 0x17, 0x01, 0x6F, 0x0D, 0x6D, 0xDF, 0x78, 0xF4, 0x87, 0xE5, 0xE3, 0xFD, + 0x81, 0xF9, 0x0D, 0x10, 0xCC, 0xF7, 0x4E, 0x05, 0xE8, 0xE0, 0x9B, 0xE3, + 0x61, 0xC7, 0x1C, 0xCA, 0xA4, 0xBE, 0x5F, 0xC9, 0xAD, 0xC0, 0x91, 0xD2, + 0x21, 0xBD, 0x8A, 0xD5, 0x84, 0xB3, 0x8E, 0xDF, 0xCC, 0xA7, 0x64, 0xDA, + 0xF2, 0x9D, 0xC7, 0xB4, 0x0C, 0xA1, 0x1A, 0xAD, 0x75, 0xAE, 0x2B, 0xC4, + 0x15, 0xB6, 0xB7, 0xC0, 0x24, 0xBE, 0x72, 0xB8, 0x55, 0xC5, 0x09, 0xC0, + 0xAB, 0xB6, 0x57, 0xC2, 0xDC, 0x9C, 0x87, 0xC7, 0x85, 0x9F, 0x81, 0xDE, + 0x44, 0xB5, 0x7F, 0xEA, 0xE7, 0xBC, 0xCA, 0xDC, 0xDF, 0xC9, 0x64, 0xE3, + 0x6B, 0xDA, 0x4C, 0xFC, 0xF5, 0xD9, 0x01, 0x02, 0x46, 0xD4, 0xE4, 0xF2, + 0xC0, 0xE5, 0xE8, 0xEA, 0x5D, 0xEF, 0xF9, 0xE2, 0x1B, 0xEB, 0xC8, 0xE1, + 0x75, 0xFB, 0x8C, 0xF4, 0x05, 0xEE, 0x7C, 0xE6, 0xED, 0xD5, 0x62, 0xD7, + 0xEB, 0xD6, 0x16, 0xDA, 0xAF, 0xD9, 0x5A, 0xDA, 0xF6, 0xD9, 0xB7, 0xE2, + 0x97, 0xE3, 0x65, 0xE6, 0x63, 0xE0, 0x98, 0xD4, 0xC6, 0xCD, 0x49, 0xC5, + 0x2F, 0xCF, 0x99, 0xD1, 0x30, 0xCE, 0xA3, 0xCF, 0x0E, 0xC7, 0x6C, 0xBB, + 0x34, 0xBD, 0x26, 0xA6, 0x06, 0xBA, 0x58, 0x9E, 0x6A, 0xD5, 0x2C, 0xBB, + 0x41, 0xE2, 0xE4, 0xC7, 0x80, 0xC8, 0x3E, 0xB3, 0x4B, 0xC7, 0x28, 0xBD, + 0x5B, 0xDC, 0x25, 0xD3, 0xD0, 0xCB, 0x77, 0xC6, 0xA1, 0xB6, 0x07, 0xBC, + 0xAE, 0xB4, 0xA7, 0xBB, 0x21, 0xAF, 0xB5, 0xB4, 0x21, 0xB3, 0xA7, 0xC7, + 0xA7, 0xB1, 0xF1, 0xD9, 0x09, 0xA4, 0x21, 0xCD, 0x8D, 0xA3, 0xF2, 0xC4, + 0x7E, 0xB4, 0x80, 0xC4, 0x7D, 0xC0, 0xCB, 0xBD, 0xC1, 0xCB, 0xB9, 0xD3, + 0x55, 0xD9, 0xE8, 0xEE, 0x08, 0xD5, 0x57, 0xED, 0x7D, 0xCD, 0x54, 0xEC, + 0xD0, 0xCC, 0x2C, 0xE5, 0xE9, 0xC8, 0x38, 0xD5, 0x60, 0xD3, 0x90, 0xD9, + 0xDD, 0xE8, 0xB6, 0xE3, 0x79, 0xED, 0xFF, 0xD3, 0x16, 0xF3, 0x24, 0xD4, + 0x37, 0xF9, 0xAC, 0xEF, 0xB7, 0xEB, 0x58, 0xF0, 0xDB, 0xDE, 0x33, 0xE4, + 0x9F, 0xE0, 0x4E, 0xE2, 0x6E, 0xEC, 0xCC, 0xE9, 0xC1, 0xEB, 0xB7, 0xEC, + 0x61, 0xEF, 0x14, 0xEF, 0x77, 0xFA, 0xA1, 0xF7, 0x01, 0xE6, 0x20, 0xEE, + 0xB3, 0xD6, 0x5B, 0xF1, 0x60, 0xDE, 0x61, 0x08, 0xA4, 0xDC, 0x98, 0x11, + 0xD7, 0xEC, 0x2A, 0x19, 0x56, 0x07, 0x7F, 0x13, 0x9B, 0x0C, 0x3C, 0x07, + 0xCF, 0x0A, 0x3F, 0x04, 0xD8, 0x0A, 0xC9, 0xFF, 0xCE, 0x0B, 0x98, 0x05, + 0xA3, 0x00, 0x06, 0x07, 0x6C, 0xF8, 0xF2, 0xFF, 0xD7, 0x13, 0x49, 0x1B, + 0xB8, 0x2B, 0x10, 0x40, 0xA8, 0x0B, 0x02, 0x28, 0xED, 0xE4, 0x67, 0xF9, + 0x6A, 0xFB, 0xBB, 0x02, 0xBF, 0x08, 0xDF, 0x0C, 0xD1, 0xEC, 0x14, 0xF3, + 0x68, 0x01, 0xD9, 0xFC, 0x3C, 0x15, 0xF8, 0x00, 0xCB, 0xFB, 0x7D, 0xE4, + 0x27, 0x00, 0x19, 0xEF, 0x21, 0x14, 0xA9, 0x04, 0xC1, 0x0E, 0x25, 0x00, + 0xD8, 0x0F, 0xBE, 0x04, 0xD7, 0x11, 0x21, 0x04, 0xE7, 0x03, 0x94, 0xFD, + 0x62, 0x0D, 0x76, 0x0B, 0xCA, 0x1B, 0x69, 0x01, 0x9B, 0x1A, 0xB0, 0xEC, + 0x59, 0x20, 0x8A, 0xFB, 0x97, 0x1E, 0x6D, 0x15, 0x55, 0xFF, 0x2F, 0x10, + 0xDF, 0xEB, 0xAF, 0x03, 0xF0, 0xF7, 0x41, 0x02, 0x55, 0xE4, 0x45, 0xDE, + 0x9E, 0xD1, 0xDB, 0xC9, 0xE5, 0xDD, 0x79, 0xD2, 0x94, 0xE6, 0xEF, 0xD2, + 0x92, 0x03, 0x35, 0xEB, 0x9C, 0x1C, 0xBB, 0x05, 0x4E, 0x11, 0x84, 0x0B, + 0xA1, 0x00, 0x29, 0x07, 0x2B, 0x1F, 0x6E, 0x14, 0x54, 0x3C, 0x78, 0x14, + 0x11, 0x32, 0xB8, 0x04, 0xC0, 0x2F, 0x07, 0x0E, 0x9B, 0x31, 0x6D, 0x15, + 0xCB, 0x2C, 0xAE, 0x17, 0x56, 0x28, 0x8C, 0x1A, 0xB3, 0x27, 0x5E, 0x1A, + 0x44, 0x2D, 0xF2, 0x1E, 0x71, 0x38, 0x4B, 0x24, 0xD8, 0x3B, 0x51, 0x25, + 0xB8, 0x45, 0xE0, 0x2C, 0x4A, 0x30, 0x18, 0x1E, 0xA1, 0x02, 0x7D, 0x03, + 0xE0, 0x0E, 0xE5, 0x18, 0xB9, 0x2E, 0x79, 0x35, 0x8A, 0x26, 0xB1, 0x26, + 0xBC, 0x1A, 0x84, 0x1C, 0x24, 0x31, 0xEA, 0x29, 0x16, 0x35, 0x35, 0x1C, + 0x37, 0x26, 0x89, 0xFF, 0x04, 0x2F, 0x11, 0xF5, 0x32, 0x2A, 0x16, 0xEE, + 0x6F, 0x11, 0x8A, 0xE7, 0x7D, 0x0C, 0x73, 0xF3, 0xA9, 0x14, 0x59, 0xFE, + 0x52, 0x1B, 0x37, 0x03, 0x36, 0x0C, 0x67, 0xF7, 0x3C, 0xF7, 0x12, 0xE5, + 0xEB, 0x02, 0x36, 0xF6, 0x60, 0x11, 0x2F, 0x04, 0x0E, 0x06, 0x25, 0xF4, + 0x97, 0x04, 0xA5, 0xFA, 0xBC, 0x0C, 0x6B, 0x0D, 0x58, 0x00, 0x99, 0xF6, + 0x2A, 0xFF, 0xD0, 0xE4, 0x83, 0x1D, 0x03, 0xFE, 0xFE, 0x1C, 0x05, 0x03, + 0xB0, 0x09, 0x40, 0xF3, 0x33, 0x1B, 0x3F, 0x07, 0xD4, 0x29, 0xAB, 0x1C, + 0x70, 0x27, 0x17, 0x13, 0xCF, 0x2C, 0x6E, 0x0F, 0xC3, 0x3B, 0x85, 0x21, + 0x5B, 0x32, 0x03, 0x25, 0xC1, 0x21, 0x4C, 0x1F, 0x90, 0x25, 0xCF, 0x2A, + 0x8F, 0x10, 0x90, 0x28, 0xCA, 0xFD, 0xC8, 0x22, 0x68, 0xFF, 0x76, 0x27, + 0xB1, 0x01, 0x0D, 0x24, 0x47, 0x12, 0xD4, 0x23, 0x46, 0x22, 0xE1, 0x28, + 0x96, 0x11, 0x4D, 0x17, 0x30, 0xF5, 0x4A, 0xF8, 0x2E, 0x01, 0x78, 0xF9, + 0x4F, 0x27, 0x77, 0x16, 0xD3, 0x2F, 0xCA, 0x22, 0x4F, 0x1C, 0xC4, 0x14, + 0xF6, 0x1A, 0x3A, 0x13, 0xBB, 0x30, 0x92, 0x2A, 0x2D, 0x3B, 0x18, 0x37, + 0xE3, 0x1E, 0xC6, 0x1F, 0xA2, 0x09, 0x35, 0x0A, 0x60, 0x1F, 0xF6, 0x14, + 0xE7, 0x2F, 0x48, 0x0F, 0x37, 0x30, 0xAD, 0xF6, 0x95, 0x27, 0x1A, 0xF1, + 0x39, 0x1E, 0xB1, 0xFE, 0xD9, 0x1A, 0xBD, 0x0B, 0x71, 0x1A, 0xA9, 0x16, + 0x4C, 0x26, 0xED, 0x2D, 0x55, 0x29, 0xA5, 0x34, 0x26, 0x1F, 0xDA, 0x20, + 0x63, 0x1C, 0x68, 0x16, 0x7F, 0x26, 0x15, 0x16, 0x02, 0x3B, 0x01, 0x1C, + 0xD7, 0x33, 0xDA, 0x18, 0x88, 0x1A, 0xB0, 0x0D, 0xDF, 0x2F, 0x6E, 0x25, + 0x79, 0x46, 0xEB, 0x30, 0xD3, 0x3B, 0x78, 0x21, 0x1F, 0x4A, 0x01, 0x39, + 0xEB, 0x50, 0xFB, 0x51, 0x46, 0x36, 0x93, 0x43, 0x6B, 0x2B, 0x21, 0x36, + 0xB7, 0x27, 0x6D, 0x37, 0xA0, 0x1E, 0x55, 0x40, 0x35, 0x20, 0xC3, 0x44, + 0x37, 0x30, 0xE9, 0x46, 0x24, 0x22, 0x22, 0x3A, 0xE7, 0x0C, 0x37, 0x2A, + 0xC7, 0x0E, 0xFE, 0x23, 0xFD, 0x04, 0x7D, 0x0C, 0x48, 0x0C, 0x6E, 0x05, + 0x4A, 0x14, 0x38, 0xFE, 0xAC, 0x14, 0x83, 0xF8, 0x93, 0x16, 0x83, 0x07, + 0x3E, 0x0E, 0x6B, 0x02, 0xA2, 0x0D, 0xCC, 0xF4, 0xB8, 0x16, 0xCC, 0xF6, + 0xF6, 0x1B, 0x6B, 0x02, 0x18, 0x19, 0x1D, 0x11, 0x15, 0x09, 0x7F, 0x09, + 0x51, 0xF9, 0xEC, 0xEF, 0x77, 0x02, 0x0F, 0xEF, 0x84, 0x22, 0xBF, 0x15, + 0xA7, 0x2B, 0x10, 0x31, 0x7D, 0x0B, 0x83, 0x22, 0x64, 0xF8, 0xD5, 0x15, + 0x14, 0x11, 0xE2, 0x1D, 0x88, 0x23, 0x93, 0x1C, 0x5E, 0x09, 0x36, 0x09, + 0x3E, 0xEE, 0x9B, 0x06, 0x3D, 0xE4, 0x81, 0x12, 0xA7, 0xDA, 0xAC, 0x12, + 0x7E, 0xEC, 0xCD, 0x22, 0xC4, 0x05, 0xF2, 0x3B, 0xCA, 0xFC, 0x8C, 0x34, + 0x0C, 0xEE, 0x91, 0x15, 0x0C, 0xDD, 0xEF, 0xF2, 0x61, 0xD0, 0x1C, 0xEC, + 0x51, 0xD5, 0x9F, 0xF2, 0x5A, 0xCF, 0x38, 0xE2, 0xE0, 0xCC, 0xC1, 0xE6, + 0xAD, 0xD9, 0x35, 0xFD, 0x95, 0xCE, 0xCF, 0xE6, 0xE9, 0xB9, 0xB6, 0xD1, + 0x13, 0xB9, 0xA9, 0xE3, 0xD9, 0xC6, 0xC9, 0xEC, 0x82, 0xCF, 0x52, 0xE7, + 0xD7, 0xD0, 0x71, 0xEA, 0x6E, 0xCD, 0x49, 0xE5, 0x27, 0xCE, 0xD4, 0xDD, + 0x7F, 0xE1, 0xD2, 0xED, 0xBD, 0xE4, 0xE4, 0xF6, 0x40, 0xCA, 0xBA, 0xE4, + 0x9C, 0xC0, 0x82, 0xE9, 0x64, 0xC4, 0x00, 0xF8, 0x6E, 0xB1, 0x3E, 0xE2, + 0x2E, 0xB2, 0x80, 0xD7, 0x85, 0xBE, 0x20, 0xD3, 0x6E, 0xB3, 0x36, 0xD1, + 0x40, 0xB5, 0xAD, 0xED, 0x15, 0xB5, 0x58, 0xEE, 0x16, 0xB5, 0x1A, 0xD7, + 0x97, 0xCA, 0x6A, 0xDF, 0x1C, 0xD5, 0xF6, 0xE2, 0xAB, 0xDD, 0xD4, 0xDB, + 0xE0, 0xDF, 0x1F, 0xDA, 0xFE, 0xBA, 0x5C, 0xB5, 0xD9, 0xA3, 0x10, 0xA1, + 0x58, 0xC2, 0x24, 0xD5, 0x38, 0xC1, 0x87, 0xEB, 0x2A, 0xA1, 0xE1, 0xC4, + 0xCD, 0xBB, 0x39, 0xC0, 0x2F, 0xE8, 0xCC, 0xD7, 0x21, 0xED, 0x18, 0xD5, + 0x1F, 0xD5, 0xA8, 0xC1, 0xC1, 0xCC, 0xFE, 0xBE, 0xD7, 0xD1, 0xE4, 0xC8, + 0x8D, 0xC6, 0x88, 0xD2, 0xBD, 0xCD, 0x9A, 0xEC, 0x8B, 0xC8, 0xB6, 0xF4, + 0x9C, 0xBB, 0xF3, 0xF0, 0x5E, 0xBB, 0x73, 0xE6, 0xA9, 0xB1, 0x7A, 0xC3, + 0x92, 0xC3, 0x11, 0xD2, 0x51, 0xCF, 0x6E, 0xED, 0x30, 0xC4, 0xFD, 0xD3, + 0x7B, 0xD6, 0x55, 0xCC, 0xF4, 0xF5, 0xBF, 0xF1, 0xB4, 0xEC, 0xF4, 0xFF, + 0x7A, 0xE0, 0x68, 0xFB, 0xBC, 0xE5, 0x4C, 0xF9, 0xCC, 0xE5, 0x90, 0xEE, + 0x52, 0xEB, 0x75, 0xE4, 0x6C, 0xE4, 0xFF, 0xD4, 0xC8, 0xDC, 0x5F, 0xD5, + 0x90, 0xE8, 0x2C, 0xE1, 0x90, 0xEC, 0x28, 0xD5, 0xB4, 0xDA, 0x63, 0xC3, + 0x1A, 0xCA, 0xAE, 0xC3, 0xCC, 0xC9, 0xA4, 0xC6, 0xED, 0xD2, 0xEB, 0xC1, + 0x79, 0xDE, 0x09, 0xC8, 0x52, 0xEC, 0x26, 0xE2, 0x8B, 0xF2, 0x8E, 0xF0, + 0x36, 0xF6, 0x83, 0xF3, 0x94, 0x00, 0xD7, 0xF9, 0x63, 0x03, 0x82, 0xF5, + 0xF9, 0x03, 0x2B, 0xF2, 0x84, 0x0B, 0xF9, 0xFA, 0x7B, 0xF6, 0x3F, 0xF9, + 0xCA, 0xE7, 0x8D, 0xF8, 0xE1, 0xED, 0x20, 0xF4, 0xFB, 0xE1, 0xF7, 0xD6, + 0x2C, 0xF2, 0x97, 0xE2, 0x16, 0x0D, 0x1D, 0x12, 0xDB, 0x01, 0xD2, 0x10, + 0xAD, 0xE7, 0x9B, 0xF1, 0x0B, 0xFB, 0x71, 0x00, 0x08, 0x1D, 0x67, 0x2A, + 0x5B, 0x08, 0x10, 0x30, 0x82, 0xFD, 0x7F, 0x30, 0xEB, 0x09, 0x92, 0x38, + 0xA1, 0x06, 0xA7, 0x2B, 0xFC, 0x08, 0xEA, 0x1D, 0xBA, 0x0F, 0xF6, 0x16, + 0x07, 0x0B, 0xAF, 0x0C, 0x0E, 0x0A, 0xCD, 0x03, 0x9D, 0x0C, 0x31, 0xFA, + 0x49, 0x0E, 0x4E, 0xFE, 0x31, 0x1F, 0x1F, 0x1E, 0x1F, 0x21, 0xD2, 0x1E, + 0x44, 0x11, 0xF4, 0x00, 0xF5, 0x10, 0xDD, 0x02, 0x22, 0x15, 0x4B, 0x0D, + 0x34, 0x06, 0x64, 0x03, 0xBC, 0x00, 0x6D, 0x09, 0x7B, 0x04, 0x4B, 0x14, + 0xC6, 0xFC, 0x98, 0x0D, 0x6D, 0x05, 0xD3, 0x10, 0x66, 0x0B, 0xA0, 0x0F, + 0xC2, 0x00, 0x2B, 0xF8, 0x6C, 0x02, 0xAE, 0xE3, 0x10, 0x15, 0xEF, 0xE3, + 0xFB, 0x10, 0x9B, 0xE4, 0xA0, 0xE6, 0xEB, 0xD8, 0xFC, 0xE8, 0xE2, 0xE1, + 0x2E, 0x0C, 0x65, 0xF4, 0x26, 0x07, 0xF5, 0xF8, 0x37, 0xFB, 0x86, 0x02, + 0x1E, 0xF7, 0xE5, 0x0D, 0xEC, 0xF0, 0x8C, 0x11, 0xBE, 0xF8, 0x8C, 0x0F, + 0x15, 0xF9, 0xCE, 0xFC, 0x83, 0xFB, 0xDA, 0xF9, 0xCF, 0x17, 0xB7, 0x0B, + 0x12, 0x29, 0xCF, 0x06, 0xB1, 0x2E, 0x64, 0x03, 0x20, 0x1D, 0x79, 0xF8, + 0x47, 0xF0, 0xA7, 0xE2, 0x6C, 0xF5, 0x9D, 0x03, 0x61, 0x1C, 0x82, 0x2F, + 0xD2, 0x20, 0x04, 0x17, 0x0A, 0x21, 0xEB, 0xF0, 0x9E, 0x43, 0xB4, 0xFF, + 0xAA, 0x52, 0xB8, 0x0B, 0x12, 0x35, 0x07, 0xF4, 0x72, 0x30, 0x8A, 0xED, + 0xE4, 0x3B, 0x67, 0xFB, 0x31, 0x27, 0xD5, 0xF6, 0xBC, 0x13, 0x75, 0xE8, + 0x72, 0x19, 0xA1, 0xE6, 0x0A, 0x24, 0xF2, 0xE6, 0x29, 0x16, 0xA9, 0xD1, + 0x0D, 0x01, 0xB4, 0xB6, 0xE2, 0xFF, 0x6B, 0xC0, 0xCA, 0xFD, 0x5C, 0xD7, + 0x20, 0x05, 0xA1, 0xE5, 0x26, 0x13, 0xD4, 0xF4, 0x28, 0x20, 0x49, 0x0D, + 0x6D, 0x24, 0xE0, 0x15, 0xA2, 0x16, 0x8F, 0x01, 0x15, 0x18, 0xF9, 0x02, + 0x2A, 0x22, 0xFA, 0x0F, 0xDC, 0x23, 0x9F, 0x0B, 0xF7, 0x24, 0x84, 0x08, + 0xA0, 0x20, 0x44, 0x07, 0xC1, 0x12, 0x84, 0x06, 0xE2, 0x14, 0x08, 0x13, + 0x37, 0x1B, 0x5A, 0x14, 0x3D, 0x12, 0x5D, 0x10, 0xA1, 0x0F, 0x7B, 0x17, + 0x98, 0x17, 0x4F, 0x1A, 0xC9, 0x1D, 0x7D, 0x1D, 0xA4, 0x17, 0xEF, 0x27, + 0x50, 0x10, 0x58, 0x2E, 0x01, 0x15, 0xAE, 0x26, 0xE2, 0x1E, 0x61, 0x22, + 0x57, 0x1F, 0x28, 0x1F, 0xAC, 0x10, 0x31, 0x11, 0x51, 0x0B, 0x63, 0x09, + 0xC0, 0x13, 0x5B, 0xFB, 0xB7, 0x24, 0xB6, 0xEC, 0xA6, 0x36, 0x21, 0x00, + 0xDE, 0x23, 0x8F, 0x07, 0x0B, 0x10, 0x8F, 0x00, 0x18, 0x31, 0xC5, 0x29, + 0xB7, 0x3E, 0x6F, 0x3E, 0x50, 0x13, 0x1E, 0x18, 0xFF, 0x0E, 0xA4, 0x15, + 0xDB, 0x31, 0xB9, 0x2F, 0xE7, 0x30, 0xB9, 0x23, 0x3E, 0x26, 0xD0, 0x1A, + 0x42, 0x22, 0x02, 0x24, 0xF4, 0x14, 0xA3, 0x18, 0x8D, 0x0E, 0x86, 0x14, + 0xA8, 0x11, 0xA5, 0x19, 0x93, 0x0E, 0xAC, 0x12, 0x0D, 0x07, 0x8A, 0x15, + 0xC8, 0x14, 0xAE, 0x1D, 0xD4, 0x1F, 0xC0, 0x12, 0x3F, 0x15, 0xA0, 0x04, + 0x0E, 0x13, 0x34, 0x06, 0x3F, 0x15, 0xDF, 0x07, 0x1D, 0x1D, 0x60, 0x14, + 0xD7, 0x29, 0xB9, 0x28, 0x12, 0x2B, 0xD0, 0x22, 0x18, 0x2C, 0x5F, 0x16, + 0x52, 0x2B, 0xD2, 0x16, 0x0C, 0x19, 0xC3, 0x16, 0x40, 0x0A, 0x09, 0x15, + 0x98, 0x12, 0x9B, 0x1C, 0xAC, 0x1F, 0x45, 0x2A, 0xC4, 0x29, 0x08, 0x37, + 0x70, 0x1E, 0x81, 0x36, 0x82, 0x0E, 0xC9, 0x30, 0x5A, 0xFF, 0x3E, 0x20, + 0xC2, 0xF7, 0x76, 0x11, 0xD2, 0x0D, 0x6D, 0x23, 0x37, 0x08, 0x49, 0x22, + 0xFB, 0xF8, 0xA1, 0x11, 0xD1, 0x0A, 0xC7, 0x1F, 0x1D, 0x1D, 0xDA, 0x2F, + 0xDB, 0x18, 0x19, 0x29, 0x0A, 0x0F, 0xDF, 0x16, 0xAB, 0x14, 0xD7, 0x06, + 0xE5, 0x1E, 0x6A, 0xFF, 0xBE, 0x2C, 0x7A, 0xFC, 0x45, 0x36, 0x56, 0x00, + 0x41, 0x1E, 0x12, 0x01, 0x6E, 0xF8, 0x6A, 0xF4, 0x62, 0xFF, 0xDA, 0xF6, + 0xB6, 0x1D, 0x64, 0x0D, 0x1A, 0x22, 0xFD, 0x23, 0x5E, 0x15, 0xFC, 0x24, + 0x51, 0x10, 0x93, 0x0E, 0x93, 0x1E, 0x51, 0xFD, 0x11, 0x1E, 0x0D, 0xF4, + 0xC7, 0x09, 0x8B, 0xEC, 0xFE, 0xF8, 0x0F, 0xE9, 0xA6, 0x01, 0x65, 0xFD, + 0xC2, 0x1F, 0x00, 0x16, 0x5B, 0x1C, 0xCB, 0x0B, 0xB1, 0x08, 0xA1, 0x06, + 0x0C, 0xFE, 0x86, 0x17, 0x77, 0xE4, 0x82, 0x09, 0x7A, 0xD8, 0xF2, 0xED, + 0x8B, 0xE7, 0x36, 0xFD, 0xDA, 0xF7, 0xB6, 0x1E, 0xE0, 0xFA, 0x76, 0x1D, + 0xC0, 0xF5, 0x69, 0xFE, 0xE2, 0xF3, 0xC1, 0xF0, 0x9D, 0xE5, 0xC5, 0xF2, + 0x5C, 0xCA, 0xBF, 0xED, 0x73, 0xB2, 0x65, 0xE6, 0xDD, 0xAF, 0x69, 0xE7, + 0x26, 0xC3, 0xDB, 0xEE, 0x07, 0xDE, 0x8D, 0xF2, 0x36, 0xEE, 0xA7, 0xF8, + 0xB5, 0xEE, 0xD3, 0x06, 0x09, 0xEC, 0xA6, 0x0C, 0xEA, 0xF0, 0x13, 0x0E, + 0x5D, 0xFC, 0x8D, 0x1A, 0xE7, 0xFE, 0x3B, 0x28, 0xE4, 0xFC, 0x3A, 0x24, + 0x65, 0x09, 0x0D, 0x1F, 0x2D, 0x1E, 0xA1, 0x21, 0x22, 0x1C, 0x92, 0x18, + 0xE9, 0x09, 0xA7, 0x12, 0x77, 0x01, 0x97, 0x0D, 0x70, 0xF3, 0x2C, 0x02, + 0xDD, 0xF3, 0x9F, 0x09, 0xF8, 0x0B, 0xCD, 0x12, 0xF6, 0x14, 0x94, 0x0B, + 0x9D, 0x13, 0xC1, 0x0C, 0xA5, 0x00, 0xD4, 0x03, 0xB9, 0xF5, 0xA6, 0xFC, + 0x22, 0xFD, 0xB8, 0x05, 0x81, 0x01, 0xD5, 0x0C, 0xE3, 0xFE, 0xEF, 0x08, + 0x1A, 0xFB, 0xA3, 0xF6, 0x4A, 0x00, 0x3E, 0xE9, 0x82, 0xFA, 0xEF, 0xE7, + 0x39, 0xEC, 0xC5, 0xE3, 0x30, 0xDA, 0xE9, 0xD7, 0x44, 0xCD, 0x2B, 0xD3, + 0xFE, 0xCB, 0x6F, 0xD2, 0xA8, 0xD3, 0xD9, 0xD5, 0xDE, 0xDF, 0x5A, 0xE8, + 0xB3, 0xDD, 0xEC, 0xFC, 0xF3, 0xD8, 0xE1, 0xFD, 0xEF, 0xD6, 0x1F, 0xEA, + 0x4A, 0xD2, 0x1A, 0xDE, 0x73, 0xCF, 0xDB, 0xEC, 0x0D, 0xC0, 0xA7, 0xEC, + 0x2E, 0xB4, 0x68, 0xD4, 0x68, 0xC2, 0x5F, 0xD8, 0x66, 0xD0, 0xD9, 0xE0, + 0xA5, 0xCA, 0x00, 0xCF, 0x02, 0xCE, 0x59, 0xD2, 0xB8, 0xD9, 0x8B, 0xE7, + 0x34, 0xDC, 0xB4, 0xEC, 0x1B, 0xDB, 0xAD, 0xE7, 0xDA, 0xD9, 0x34, 0xEA, + 0xF5, 0xDB, 0x6E, 0xFA, 0xC3, 0xE0, 0xEB, 0x02, 0x90, 0xF2, 0xFA, 0xFE, + 0x45, 0x02, 0xB8, 0xFE, 0x23, 0xFD, 0xC4, 0xFA, 0x4C, 0xF3, 0x2F, 0xEE, + 0x56, 0xE8, 0x88, 0xEB, 0xA4, 0xD6, 0x8E, 0xE9, 0xFE, 0xCF, 0x99, 0xEA, + 0xE0, 0xDB, 0xFF, 0xF9, 0x65, 0xE2, 0x22, 0x08, 0x0A, 0xEF, 0x92, 0x12, + 0xEE, 0x07, 0x18, 0x0D, 0x16, 0x0D, 0xE9, 0x02, 0xC3, 0x0A, 0x8D, 0x1A, + 0x54, 0xFB, 0x06, 0x28, 0xEB, 0xF5, 0x19, 0x1A, 0x5D, 0x12, 0xAF, 0x24, + 0xAA, 0x0E, 0xDC, 0x2C, 0x55, 0xEC, 0xA3, 0x17, 0xD4, 0xE5, 0x30, 0x0D, + 0x07, 0xEB, 0xEA, 0x04, 0xDD, 0xE4, 0x05, 0xEA, 0xFD, 0xF5, 0xDD, 0xE4, + 0xF0, 0x0D, 0x64, 0xF7, 0x69, 0x06, 0x1D, 0xFC, 0x28, 0xFD, 0x19, 0xF9, + 0x06, 0x00, 0xFE, 0x03, 0xD6, 0xFD, 0x89, 0x10, 0xDA, 0xFE, 0x79, 0x15, + 0xBA, 0x06, 0xE4, 0x0B, 0xD5, 0x07, 0xF7, 0xF8, 0xB1, 0x05, 0x80, 0xF6, + 0xB2, 0x04, 0x6B, 0xF8, 0x17, 0xF6, 0xF5, 0xEB, 0xF5, 0xFB, 0x02, 0xF4, + 0xAD, 0xFE, 0x36, 0xFE, 0x49, 0xEB, 0xF5, 0xEF, 0x5A, 0xFC, 0x03, 0xF3, + 0x99, 0x02, 0xC3, 0xF2, 0xBA, 0xED, 0x7B, 0xE9, 0x00, 0xE8, 0x00, 0xEC, + 0xFA, 0xE5, 0x87, 0xEA, 0xA6, 0xEA, 0x92, 0xEF, 0xE9, 0xF6, 0x48, 0x00, + 0xE8, 0x02, 0x1D, 0x0C, 0x69, 0x18, 0x98, 0x12, 0xB6, 0x1E, 0x76, 0x10, + 0x0C, 0x08, 0xC3, 0x07, 0x10, 0xEE, 0x46, 0xF8, 0xBD, 0xD5, 0x40, 0xE0, + 0x87, 0xD9, 0x58, 0xDD, 0x6B, 0xF8, 0x0C, 0xE4, 0xEE, 0x07, 0x61, 0xDE, + 0xE4, 0xFB, 0x49, 0xD5, 0x3B, 0xF4, 0x5B, 0xDB, 0x3D, 0xEA, 0xC3, 0xDD, + 0xFF, 0xC5, 0xED, 0xCE, 0x5D, 0xC0, 0x05, 0xD2, 0x2D, 0xD7, 0xF1, 0xD6, + 0x03, 0xEC, 0x98, 0xD0, 0xA5, 0x04, 0xCC, 0xCE, 0xA6, 0xFC, 0xBF, 0xC4, + 0x68, 0xE0, 0x81, 0xBB, 0x51, 0xCF, 0x36, 0xB9, 0x9D, 0xC5, 0x6A, 0xB5, + 0x60, 0xC8, 0xA3, 0xB9, 0xF3, 0xD9, 0x9B, 0xCC, 0x9F, 0xE3, 0xA1, 0xD7, + 0xB3, 0xDA, 0xF5, 0xD1, 0xBB, 0xDD, 0x3D, 0xDD, 0x54, 0xD8, 0x01, 0xE0, + 0x61, 0xCB, 0xBA, 0xCE, 0xC8, 0xDD, 0x8F, 0xDD, 0x59, 0xED, 0x99, 0xF2, + 0x1C, 0xEA, 0xEF, 0xE4, 0x27, 0xE5, 0x0A, 0xD1, 0x81, 0xE4, 0x85, 0xC4, + 0xE4, 0xE7, 0x7B, 0xBB, 0xE8, 0xDE, 0xDC, 0xB4, 0x15, 0xD6, 0xA1, 0xB7, + 0x89, 0xDD, 0xA6, 0xC2, 0x87, 0xE8, 0xB1, 0xC1, 0x74, 0xED, 0xE1, 0xBE, + 0x65, 0xE1, 0xA7, 0xBD, 0xAE, 0xD1, 0x50, 0xB9, 0x98, 0xD0, 0x3E, 0xB1, + 0x9B, 0xDD, 0x39, 0xB1, 0x1E, 0xE5, 0x5D, 0xC2, 0x3A, 0xEC, 0x5B, 0xD7, + 0xD6, 0xFC, 0x73, 0xE3, 0xC2, 0x03, 0x19, 0xE9, 0xB2, 0x01, 0x76, 0xED, + 0x6B, 0xF6, 0x56, 0xE6, 0xBB, 0xE9, 0x58, 0xE1, 0x35, 0xF1, 0x25, 0xED, + 0xFA, 0xFE, 0xD9, 0xF1, 0x87, 0x00, 0x8B, 0xED, 0x22, 0x01, 0xAB, 0x03, + 0x6D, 0xF1, 0xBA, 0x18, 0x0A, 0xE4, 0x20, 0x16, 0xAF, 0xF2, 0xB4, 0x11, + 0xC8, 0x08, 0x8B, 0x16, 0xD4, 0x10, 0x55, 0x1F, 0x33, 0x05, 0xC1, 0x20, + 0xF1, 0x01, 0xFD, 0x1B, 0x25, 0x03, 0x2F, 0x06, 0xF6, 0x0B, 0x24, 0xF9, + 0xC3, 0x14, 0x25, 0x02, 0x35, 0x0A, 0xF9, 0x10, 0x95, 0x01, 0x5A, 0x1F, + 0xBC, 0x0E, 0x6D, 0x2C, 0xB5, 0x12, 0xE2, 0x27, 0xD0, 0xFF, 0x8B, 0x13, + 0x0E, 0x08, 0x90, 0x10, 0x3A, 0x1C, 0xC8, 0x0D, 0x2A, 0x20, 0x48, 0x00, + 0xEA, 0x27, 0xBC, 0x02, 0xB6, 0x29, 0x54, 0x0E, 0xB5, 0x27, 0xF3, 0x14, + 0xAA, 0x28, 0x4D, 0x16, 0xBA, 0x24, 0x4F, 0x13, 0x82, 0x27, 0xE9, 0x13, + 0xD6, 0x2F, 0xCB, 0x18, 0x41, 0x2F, 0xF9, 0x1A, 0xC2, 0x1D, 0x51, 0x11, + 0x0B, 0x1A, 0xAA, 0x08, 0x07, 0x26, 0x45, 0x0B, 0x21, 0x1A, 0x41, 0x09, + 0xFE, 0x18, 0xCD, 0x16, 0xF4, 0x28, 0x84, 0x28, 0x2E, 0x2C, 0x82, 0x18, + 0x84, 0x2D, 0x7D, 0x0A, 0x8F, 0x35, 0x9D, 0x1D, 0x19, 0x29, 0x81, 0x26, + 0x01, 0x12, 0xF2, 0x1A, 0x19, 0x20, 0x5B, 0x22, 0x1D, 0x32, 0x89, 0x2C, + 0xBB, 0x1F, 0x18, 0x28, 0x12, 0x07, 0xE8, 0x21, 0x42, 0x04, 0xC7, 0x22, + 0x7B, 0x08, 0x5F, 0x1A, 0xA9, 0x14, 0x34, 0x11, 0x65, 0x20, 0x2D, 0x15, + 0x32, 0x1C, 0x5C, 0x18, 0x6B, 0x1A, 0xF3, 0x19, 0x89, 0x1F, 0x1D, 0x21, + 0x40, 0x20, 0xA4, 0x27, 0x69, 0x0C, 0x3F, 0x14, 0x56, 0xFE, 0x82, 0xFD, + 0x3E, 0x09, 0xB9, 0xF7, 0x75, 0x1D, 0x98, 0xF5, 0xA0, 0x2E, 0xE9, 0xF9, + 0x4F, 0x2C, 0x57, 0xFF, 0x56, 0x2F, 0x0C, 0x0B, 0xDD, 0x2F, 0x03, 0x10, + 0xDD, 0x22, 0x36, 0x07, 0x75, 0x21, 0xA0, 0x05, 0xFB, 0x20, 0x9F, 0x02, + 0x26, 0x20, 0x9B, 0x09, 0x0A, 0x18, 0x56, 0x15, 0x99, 0x0D, 0x6F, 0x14, + 0x8E, 0x0C, 0x5A, 0x16, 0x91, 0x01, 0x7C, 0x16, 0xB8, 0xF5, 0x62, 0x12, + 0x54, 0xFD, 0xD2, 0x10, 0x8F, 0x0A, 0xCE, 0x10, 0x01, 0x0C, 0xED, 0x0D, + 0xBE, 0x0A, 0xAC, 0x0C, 0x6E, 0xFD, 0x01, 0x0E, 0x15, 0xF1, 0x92, 0x13, + 0x2B, 0xFE, 0x7D, 0x1D, 0x63, 0x0A, 0xC1, 0x1F, 0xE8, 0x11, 0xD1, 0x19, + 0x43, 0x24, 0x10, 0x23, 0x98, 0x23, 0x5D, 0x20, 0xA7, 0x0C, 0xFA, 0x04, + 0x50, 0x03, 0x58, 0xFC, 0x50, 0xFD, 0xD5, 0xFE, 0x3D, 0xFA, 0xC0, 0x08, + 0xC3, 0x00, 0xD9, 0x14, 0x9C, 0x0D, 0xBB, 0x18, 0x50, 0x15, 0x69, 0x13, + 0x85, 0x0D, 0x5A, 0x0A, 0x4F, 0x08, 0x1C, 0x0C, 0xB9, 0x0E, 0x72, 0x08, + 0xE1, 0x14, 0xA5, 0xF8, 0xB5, 0x1C, 0x31, 0xFB, 0x48, 0x26, 0xDD, 0x19, + 0x91, 0x16, 0x95, 0x2E, 0x7A, 0x01, 0x68, 0x29, 0x5C, 0x15, 0x85, 0x27, + 0x16, 0x21, 0x66, 0x1F, 0xB0, 0x0A, 0x7D, 0x10, 0x6B, 0x02, 0x0C, 0x15, + 0xAD, 0x09, 0xC9, 0x1A, 0x03, 0x11, 0x8F, 0x17, 0xF2, 0x17, 0x6D, 0x1D, + 0x54, 0x11, 0x20, 0x26, 0x2A, 0x07, 0x57, 0x29, 0x41, 0x0D, 0x7E, 0x28, + 0x79, 0x0C, 0x40, 0x1F, 0xE2, 0x04, 0x0A, 0x1F, 0x78, 0x04, 0x4F, 0x1F, + 0xBA, 0x05, 0x4C, 0x14, 0xCC, 0x08, 0x84, 0x0E, 0x75, 0x00, 0x0F, 0xFF, + 0x5D, 0xFB, 0x44, 0xEB, 0xBB, 0x11, 0xDE, 0xFE, 0xF5, 0x17, 0x7C, 0x11, + 0x72, 0x0B, 0x11, 0x01, 0x13, 0x0C, 0xBC, 0xF6, 0x8E, 0x0F, 0x0B, 0xF7, + 0xC2, 0x06, 0x65, 0xF4, 0x8C, 0xF8, 0xE1, 0xF3, 0xED, 0x01, 0xA8, 0x05, + 0x00, 0x0E, 0xB4, 0x15, 0xE0, 0xFA, 0x64, 0x04, 0x16, 0xE9, 0x06, 0x05, + 0x64, 0xE7, 0x68, 0x22, 0x1D, 0xE9, 0xE6, 0x25, 0x62, 0xEE, 0xE3, 0x14, + 0x74, 0xF3, 0xCE, 0x08, 0x48, 0xF7, 0x28, 0x0F, 0x1E, 0xFB, 0xD5, 0x1A, + 0x63, 0x07, 0x1E, 0x29, 0x84, 0x08, 0x45, 0x2A, 0x1E, 0x03, 0x36, 0x1F, + 0x47, 0x0A, 0x30, 0x2A, 0x6D, 0x0F, 0xDE, 0x34, 0xF9, 0x12, 0x53, 0x30, + 0xC1, 0x15, 0x31, 0x22, 0x34, 0x21, 0xA1, 0x16, 0xAA, 0x29, 0x53, 0x0F, + 0xB8, 0x1C, 0x49, 0x03, 0x3B, 0x14, 0xE9, 0x02, 0x3E, 0x11, 0x58, 0x0D, + 0xBB, 0x0C, 0x31, 0x10, 0x44, 0x10, 0xEA, 0x12, 0x84, 0x10, 0x51, 0x17, + 0x6B, 0x0D, 0x6F, 0x13, 0x82, 0x14, 0x9A, 0x0F, 0x5D, 0x1C, 0xEF, 0x0E, + 0x58, 0x17, 0x57, 0x08, 0x96, 0x12, 0x38, 0x0C, 0x08, 0x0D, 0x02, 0x1C, + 0x1B, 0x07, 0x52, 0x21, 0x69, 0x14, 0x4E, 0x20, 0xE0, 0x26, 0xA9, 0x24, + 0x0F, 0x1C, 0x8A, 0x17, 0x65, 0x12, 0x62, 0xFD, 0x8A, 0x24, 0xC7, 0xFB, + 0xBD, 0x1C, 0xD1, 0xFB, 0xD9, 0xF6, 0xBB, 0xF7, 0x18, 0xEC, 0x0F, 0x07, + 0xBA, 0xFE, 0x59, 0x1A, 0x84, 0x0A, 0xA8, 0x20, 0x00, 0x0D, 0x90, 0x1D, + 0x94, 0x14, 0xA6, 0x1D, 0xB1, 0x14, 0x11, 0x1E, 0x51, 0x09, 0x88, 0x1A, + 0xED, 0x05, 0x5E, 0x16, 0xDC, 0x00, 0x33, 0x0D, 0x83, 0xF2, 0xDF, 0x0B, + 0xE3, 0xE4, 0xC9, 0x0A, 0x58, 0xEF, 0x65, 0x03, 0x12, 0x0C, 0xEF, 0xFE, + 0xBC, 0x0B, 0x30, 0xED, 0xDA, 0xFB, 0x98, 0xDB, 0x2E, 0xF6, 0x25, 0xDD, + 0xE9, 0xED, 0x73, 0xDF, 0x17, 0xEA, 0xAE, 0xE4, 0xFE, 0xED, 0x4B, 0xF3, + 0xFD, 0xE8, 0xE7, 0xF6, 0x26, 0xE8, 0x99, 0xFD, 0xA7, 0xED, 0x0C, 0x09, + 0x33, 0xE0, 0xDD, 0xF5, 0x36, 0xD0, 0x4C, 0xDA, 0xF7, 0xC3, 0x96, 0xD6, + 0x31, 0xB3, 0xDA, 0xD8, 0xFE, 0xBC, 0x55, 0xD6, 0xBB, 0xD2, 0xE2, 0xCF, + 0xB9, 0xD1, 0x2D, 0xD0, 0x1C, 0xC5, 0x5B, 0xE1, 0xAF, 0xC0, 0x2D, 0xF0, + 0xCB, 0xC5, 0xED, 0xEC, 0xD8, 0xBF, 0x46, 0xE0, 0xA4, 0xCB, 0xE4, 0xE2, + 0x8D, 0xE9, 0x9C, 0xE7, 0xD8, 0xEA, 0xF7, 0xDB, 0xFC, 0xD6, 0x9B, 0xCD, + 0xAC, 0xD0, 0xEC, 0xC8, 0xD0, 0xCA, 0xB1, 0xBC, 0xCE, 0xB6, 0xA9, 0xB2, + 0x59, 0xA6, 0x71, 0xB0, 0xE9, 0xA6, 0xA4, 0xA0, 0xF8, 0xBC, 0x42, 0x9E, + 0x82, 0xCB, 0xDD, 0xB0, 0x0D, 0xBF, 0xF4, 0xB5, 0x8D, 0xBE, 0xDB, 0xB4, + 0xA0, 0xD4, 0x93, 0xC8, 0xA9, 0xD2, 0xC8, 0xCF, 0x8E, 0xCF, 0xE1, 0xCE, + 0x0A, 0xDB, 0x9F, 0xDA, 0x31, 0xD2, 0xED, 0xD7, 0xAC, 0xD2, 0x18, 0xCF, + 0x37, 0xEA, 0xB1, 0xC7, 0x2A, 0xF0, 0xEF, 0xBE, 0x6A, 0xDF, 0xC2, 0xC2, + 0xD4, 0xD2, 0xB5, 0xCA, 0x3F, 0xD4, 0x66, 0xC6, 0x2D, 0xD8, 0x98, 0xC4, + 0x86, 0xD4, 0x91, 0xCA, 0xC7, 0xCD, 0xDB, 0xCE, 0x50, 0xCF, 0xCC, 0xDA, + 0xA4, 0xD2, 0xE4, 0xE4, 0xAA, 0xDF, 0xFB, 0xEA, 0x32, 0xED, 0xE7, 0xEF, + 0x6E, 0xE0, 0x0F, 0xE5, 0x6F, 0xD0, 0x42, 0xDF, 0x62, 0xC7, 0xB5, 0xE1, + 0x93, 0xC9, 0x27, 0xE2, 0x3B, 0xDA, 0x1A, 0xE2, 0xED, 0xDF, 0xDB, 0xD6, + 0x9C, 0xE3, 0x88, 0xD7, 0x09, 0xE8, 0xF4, 0xE0, 0x5F, 0xE6, 0xB6, 0xE1, + 0x3D, 0xEE, 0xF3, 0xED, 0xE2, 0xF9, 0x8B, 0xFB, 0x90, 0x09, 0x91, 0x00, + 0xBF, 0x10, 0xB2, 0x02, 0xAC, 0x07, 0xB0, 0xF9, 0xD0, 0x02, 0x42, 0xED, + 0x70, 0xF3, 0x4C, 0xE3, 0xB4, 0xDE, 0x4E, 0xDF, 0x03, 0xE1, 0x3E, 0xE0, + 0x6E, 0xF8, 0x1F, 0xE5, 0x03, 0x06, 0xD1, 0xEC, 0x84, 0x05, 0xF3, 0xED, + 0xDB, 0x04, 0xD1, 0xF2, 0x9D, 0xF8, 0x49, 0xF4, 0xDF, 0xF0, 0x36, 0xF0, + 0x8E, 0xF5, 0xB6, 0xF7, 0x40, 0xFB, 0xE7, 0x0A, 0xA5, 0x02, 0xAB, 0x1E, + 0xA9, 0x00, 0x54, 0x1A, 0x79, 0x08, 0x04, 0x0D, 0x43, 0x18, 0xCE, 0x03, + 0x4E, 0x0D, 0x56, 0xEC, 0x4D, 0xFD, 0x2B, 0xE3, 0x5A, 0xFE, 0xD4, 0xF0, + 0x5D, 0xFB, 0x47, 0xEF, 0x35, 0xF2, 0xD0, 0xEE, 0x04, 0xF0, 0x8D, 0x02, + 0x9A, 0xF1, 0xCB, 0x0C, 0x41, 0xF7, 0x19, 0x06, 0xD0, 0xFF, 0x90, 0xFD, + 0xED, 0x09, 0x6B, 0xFB, 0x54, 0x0C, 0xCD, 0xF9, 0x4C, 0x0A, 0xAC, 0xF5, + 0x75, 0x13, 0x40, 0xF3, 0xAA, 0x1D, 0x9A, 0xF5, 0xF5, 0x1B, 0x5B, 0xFC, + 0x7D, 0x14, 0x55, 0x06, 0xA2, 0x16, 0x7E, 0x14, 0xD2, 0x15, 0xFC, 0x17, + 0x57, 0x16, 0xDA, 0x17, 0xB4, 0x15, 0x8F, 0x19, 0x2B, 0x06, 0x64, 0x10, + 0xE6, 0x01, 0x2C, 0x06, 0xB2, 0x00, 0xEF, 0xFC, 0x4F, 0xF4, 0x90, 0xF4, + 0xE3, 0xEF, 0xD1, 0x00, 0xA9, 0xF3, 0x77, 0x19, 0xA4, 0xF6, 0x01, 0x24, + 0xB0, 0xF4, 0xE5, 0x1D, 0x1E, 0xF3, 0xD1, 0x07, 0xEC, 0xFB, 0x34, 0xF9, + 0x58, 0x04, 0xDC, 0x00, 0x74, 0xFE, 0x15, 0x00, 0x34, 0x00, 0x72, 0xFF, + 0xD2, 0x0A, 0xE7, 0x08, 0x31, 0x03, 0xF6, 0x07, 0x2B, 0xFB, 0x92, 0x07, + 0x36, 0x04, 0xCC, 0x07, 0x09, 0x08, 0x2D, 0xF5, 0x29, 0x01, 0x51, 0xDC, + 0xC3, 0xF7, 0x46, 0xCE, 0xA4, 0xFC, 0xC8, 0xD0, 0x5D, 0x0A, 0x47, 0xD4, + 0x92, 0x0F, 0xA9, 0xD2, 0x59, 0x0F, 0xE2, 0xD3, 0xFF, 0xFE, 0x1A, 0xD3, + 0xD9, 0xEF, 0x61, 0xDA, 0x1E, 0xF9, 0x06, 0xEB, 0x94, 0x04, 0x09, 0xF0, + 0xC4, 0x04, 0x2C, 0xDF, 0x0B, 0x06, 0x9E, 0xD6, 0x71, 0x08, 0x68, 0xE6, + 0xC2, 0x03, 0x65, 0xF4, 0x06, 0xF7, 0x65, 0xFB, 0xDB, 0xEC, 0xC3, 0x02, + 0x8B, 0xE8, 0x7A, 0x04, 0x7E, 0xE1, 0xC8, 0xFC, 0x5A, 0xE6, 0x8E, 0xF5, + 0x5D, 0xEC, 0x4A, 0xED, 0x24, 0xF2, 0x1E, 0xE2, 0x2F, 0x02, 0x95, 0xE4, + 0x76, 0xFA, 0xA5, 0xE8, 0xCA, 0xE0, 0x06, 0xED, 0xCB, 0xD6, 0xE4, 0xFF, + 0x06, 0xDC, 0x7C, 0x0D, 0x26, 0xF2, 0x5F, 0x1A, 0xC2, 0x03, 0x60, 0x19, + 0x30, 0x04, 0x43, 0x03, 0x7B, 0x0D, 0x87, 0x01, 0xFB, 0x12, 0x9B, 0x0B, + 0xA9, 0x0E, 0xC5, 0x0C, 0x5C, 0x14, 0x2C, 0x0D, 0x06, 0x22, 0x64, 0x16, + 0xA0, 0x27, 0xB4, 0x1D, 0xE5, 0x1C, 0x9B, 0x11, 0x4C, 0x0F, 0x66, 0x04, + 0x21, 0x02, 0xC1, 0xFF, 0xDE, 0xF3, 0xF7, 0xFD, 0x97, 0xFB, 0x8B, 0x03, + 0x3D, 0x10, 0x3B, 0x01, 0xCB, 0x1C, 0x38, 0x01, 0x28, 0x17, 0x76, 0x07, + 0xBA, 0x0B, 0x4B, 0x0C, 0xD3, 0x0C, 0xE5, 0x0F, 0x38, 0x07, 0xBD, 0x04, + 0x4E, 0x0C, 0x37, 0x02, 0xA9, 0x0F, 0xAC, 0x03, 0xB0, 0x05, 0xF0, 0x01, + 0x7F, 0x0E, 0x3D, 0x09, 0xD0, 0x12, 0xF9, 0xFD, 0xB1, 0x15, 0x0D, 0xF5, + 0x62, 0x23, 0xD3, 0x02, 0x60, 0x26, 0x6F, 0x09, 0xC7, 0x20, 0x03, 0x09, + 0x16, 0x22, 0x63, 0x0D, 0x01, 0x27, 0x2E, 0x18, 0x6A, 0x26, 0xB1, 0x29, + 0x0B, 0x29, 0x11, 0x34, 0xBA, 0x2F, 0xF6, 0x32, 0xB3, 0x25, 0x52, 0x2A, + 0x2B, 0x16, 0x70, 0x22, 0x97, 0x0B, 0xD7, 0x1C, 0x92, 0x09, 0xDF, 0x1D, + 0x8D, 0x10, 0xBD, 0x21, 0x22, 0x1A, 0xBC, 0x25, 0x22, 0x2B, 0x50, 0x32, + 0x7B, 0x30, 0x9C, 0x35, 0x3A, 0x3D, 0xD1, 0x3C, 0xD6, 0x51, 0x9C, 0x46, + 0x2E, 0x4E, 0x37, 0x44, 0xA4, 0x48, 0x31, 0x49, 0x55, 0x49, 0x52, 0x54, + 0xCD, 0x46, 0x15, 0x59, 0xC8, 0x46, 0x16, 0x4A, 0x88, 0x40, 0xA2, 0x35, + 0x00, 0x35, 0x94, 0x33, 0xE8, 0x2C, 0xB2, 0x2A, 0x50, 0x24, 0xD1, 0x1B, + 0xAD, 0x19, 0x6C, 0x1E, 0x77, 0x19, 0x91, 0x27, 0xA1, 0x25, 0xE7, 0x2E, + 0x83, 0x2F, 0x14, 0x37, 0x80, 0x33, 0x81, 0x36, 0x21, 0x3B, 0x68, 0x2D, + 0x1A, 0x43, 0x6E, 0x2C, 0x4F, 0x3E, 0xB7, 0x35, 0xD5, 0x3A, 0x4B, 0x43, + 0x0D, 0x45, 0xB9, 0x48, 0xC5, 0x54, 0x7C, 0x48, 0xE7, 0x54, 0x63, 0x45, + 0xE5, 0x39, 0x63, 0x39, 0xBA, 0x1F, 0xC1, 0x2F, 0x23, 0x1D, 0x24, 0x24, + 0xF5, 0x25, 0x0F, 0x17, 0xA9, 0x2E, 0x9B, 0x1A, 0x16, 0x37, 0xF3, 0x27, + 0xD2, 0x2D, 0x2C, 0x27, 0x07, 0x15, 0x11, 0x1B, 0x70, 0x18, 0xE7, 0x1C, + 0xF0, 0x26, 0x23, 0x26, 0x2C, 0x1F, 0x79, 0x2A, 0x25, 0x19, 0x82, 0x2A, + 0x0F, 0x1F, 0xBF, 0x24, 0x0F, 0x21, 0xA9, 0x1C, 0x6F, 0x0B, 0xF5, 0x13, + 0xD7, 0xF6, 0x8F, 0x0F, 0x4A, 0xF2, 0xB1, 0x06, 0x6F, 0xF1, 0x4E, 0x06, + 0xE0, 0x02, 0x9D, 0x16, 0x62, 0x1F, 0xAD, 0x1C, 0x0A, 0x22, 0xE7, 0x10, + 0xF1, 0x13, 0x0F, 0x04, 0x27, 0x0D, 0x8C, 0x08, 0xDD, 0xFE, 0x83, 0x0C, + 0x30, 0xE8, 0xA4, 0x03, 0x19, 0xE0, 0x1F, 0x05, 0xD2, 0xDC, 0xE5, 0x05, + 0x00, 0xDA, 0xA4, 0xFB, 0x0B, 0xEA, 0x78, 0xF7, 0x90, 0xF5, 0x2B, 0xFA, + 0xD2, 0xE4, 0xF9, 0xF9, 0x29, 0xD9, 0x1A, 0xFC, 0xDA, 0xE8, 0xFC, 0x00, + 0xA4, 0xF8, 0x33, 0xF5, 0x78, 0x09, 0xD2, 0xEE, 0xB1, 0x0E, 0x92, 0xF0, + 0xE0, 0xF5, 0xB3, 0xEA, 0xC4, 0xD9, 0x95, 0xEB, 0x63, 0xD9, 0xC8, 0xF4, + 0x22, 0xEC, 0xAD, 0xFB, 0x3A, 0xEF, 0xAE, 0xFD, 0x28, 0xED, 0xF6, 0xFF, + 0x0E, 0xFA, 0x0D, 0xFD, 0xD8, 0x03, 0xE8, 0xF4, 0x83, 0xF8, 0x23, 0xEB, + 0xFB, 0xF1, 0xED, 0xE7, 0x6F, 0xF3, 0xE8, 0xEC, 0xD6, 0xE9, 0x68, 0xF3, + 0x41, 0xEC, 0x2F, 0xFC, 0x42, 0x07, 0x3B, 0x0A, 0x98, 0x1C, 0xBB, 0x15, + 0x17, 0x0F, 0xAF, 0x10, 0xDD, 0xF7, 0x64, 0x0E, 0xC4, 0xF9, 0x80, 0x16, + 0xA5, 0xFC, 0x76, 0x12, 0x18, 0xF3, 0x8B, 0x10, 0x1A, 0xF9, 0xA1, 0x19, + 0x2E, 0x0C, 0x93, 0x19, 0x5D, 0x12, 0xE5, 0x0F, 0x91, 0x06, 0x9B, 0x07, + 0xF8, 0xF6, 0x60, 0x01, 0x00, 0xF0, 0xB7, 0xFA, 0x97, 0xF3, 0x01, 0xF6, + 0xEE, 0xFE, 0x90, 0xEE, 0xE2, 0x09, 0x49, 0xEB, 0xCE, 0x04, 0xF3, 0xF4, + 0x3B, 0xF7, 0x02, 0xF9, 0xD8, 0xF7, 0xAA, 0xF8, 0x1C, 0xFE, 0x05, 0xFF, + 0x79, 0x05, 0x12, 0x07, 0x4F, 0x09, 0xB8, 0x0D, 0x29, 0x08, 0x0E, 0x13, + 0xF0, 0x06, 0x75, 0x08, 0xD9, 0x05, 0x8B, 0xF6, 0xA0, 0x08, 0xAC, 0xF4, + 0x89, 0x09, 0xB6, 0xF6, 0xB5, 0x02, 0x42, 0xF4, 0x67, 0xFF, 0x39, 0xFE, + 0x4F, 0x04, 0x23, 0x13, 0xA2, 0x04, 0x19, 0x18, 0xE2, 0x00, 0x61, 0x19, + 0xFB, 0xF6, 0xA9, 0x1C, 0xE6, 0xF1, 0x8E, 0x10, 0x13, 0x00, 0x8D, 0x05, + 0xC3, 0xFB, 0xD0, 0x02, 0x23, 0xE4, 0x8A, 0x07, 0xE7, 0xE2, 0x9F, 0x13, + 0xE2, 0xF1, 0xAF, 0x18, 0x4E, 0xFF, 0xA9, 0x12, 0xF5, 0x02, 0xF9, 0x05, + 0x5B, 0xF9, 0xB6, 0xFC, 0xF8, 0xF1, 0xE2, 0xF5, 0x7F, 0xFB, 0xB7, 0xF0, + 0x66, 0x0B, 0x7A, 0xF9, 0x0F, 0x15, 0xF4, 0x0F, 0xFC, 0x0D, 0x14, 0x21, + 0xE2, 0xFA, 0xAC, 0x1E, 0x90, 0xF4, 0x11, 0x14, 0xA2, 0xF6, 0xFD, 0x07, + 0x41, 0xF3, 0x31, 0xF9, 0x7C, 0xF0, 0xB4, 0xF5, 0x8E, 0xEE, 0xEF, 0xF9, + 0xF3, 0xED, 0xE7, 0xF6, 0x4F, 0xEF, 0xA9, 0xF2, 0xFB, 0xF9, 0x84, 0xF7, + 0x38, 0x03, 0xCC, 0xF4, 0x15, 0x04, 0xB6, 0xF2, 0x8F, 0x00, 0xFE, 0xFB, + 0x74, 0xFC, 0xC8, 0x01, 0x96, 0x03, 0xA4, 0x09, 0xC7, 0xFF, 0x7D, 0x12, + 0x83, 0xEE, 0x4A, 0x10, 0x58, 0xEE, 0xCE, 0xFE, 0xF5, 0xFD, 0x6F, 0xEF, + 0x0A, 0x05, 0x90, 0xF0, 0x83, 0x05, 0xB0, 0xFB, 0xD9, 0x08, 0x9F, 0x07, + 0x32, 0x06, 0xE2, 0x08, 0xAF, 0xFE, 0x1E, 0xFC, 0x1B, 0xF9, 0xC9, 0xEB, + 0x88, 0xF5, 0x4C, 0xEC, 0xE0, 0xF1, 0x1C, 0xF5, 0x6B, 0xF4, 0xF2, 0xF3, + 0xE4, 0x05, 0x95, 0xF9, 0xA2, 0x0E, 0xE7, 0xFC, 0xAF, 0x03, 0xBC, 0xF6, + 0xF9, 0xF2, 0x39, 0xF5, 0xDA, 0xE2, 0x97, 0xF2, 0xEF, 0xD5, 0x97, 0xEF, + 0xDA, 0xCD, 0xD3, 0xED, 0xA3, 0xCF, 0x99, 0xEF, 0x4E, 0xCE, 0x2E, 0xF1, + 0xB0, 0xCF, 0x11, 0xEE, 0xB4, 0xDF, 0xD6, 0xE2, 0x59, 0xEC, 0xB9, 0xCD, + 0xF0, 0xEE, 0xCF, 0xBE, 0x52, 0xEC, 0xB2, 0xBE, 0x90, 0xF0, 0x0B, 0xCC, + 0x0B, 0xF0, 0xB4, 0xD7, 0x04, 0xDE, 0x81, 0xDD, 0x8F, 0xCD, 0x5A, 0xE8, + 0x54, 0xC1, 0xE2, 0xE2, 0x66, 0xBD, 0x52, 0xCC, 0x62, 0xC5, 0x65, 0xBF, + 0xEA, 0xCF, 0x0E, 0xC3, 0xBE, 0xDD, 0x43, 0xCC, 0xBF, 0xE8, 0x23, 0xC9, + 0xA8, 0xEC, 0x8C, 0xC2, 0x35, 0xE6, 0x43, 0xC2, 0x54, 0xDE, 0x05, 0xC6, + 0x32, 0xE3, 0xD3, 0xD5, 0x8C, 0xE5, 0xE4, 0xE6, 0x9E, 0xE1, 0x3F, 0xEB, + 0x0C, 0xDE, 0x0B, 0xEE, 0xDF, 0xD7, 0x70, 0xEE, 0x62, 0xCF, 0x31, 0xE5, + 0x26, 0xC8, 0x7B, 0xDC, 0x91, 0xCE, 0x09, 0xDB, 0xAE, 0xD8, 0x29, 0xD8, + 0x19, 0xDD, 0x81, 0xDB, 0x1B, 0xEA, 0x77, 0xEB, 0xE9, 0xEB, 0xB4, 0xEC, + 0x4C, 0xE3, 0xEA, 0xDD, 0x75, 0xEF, 0xA9, 0xD3, 0x14, 0xFC, 0xE0, 0xC9, + 0x9D, 0xF0, 0xE0, 0xC1, 0xDD, 0xDD, 0x64, 0xC2, 0x73, 0xDD, 0x97, 0xCD, + 0xEB, 0xD7, 0x23, 0xD4, 0x1A, 0xC4, 0xE4, 0xDD, 0x44, 0xC3, 0x92, 0xF4, + 0xC9, 0xCC, 0xE9, 0xF5, 0x35, 0xD4, 0x58, 0xDF, 0xCB, 0xE0, 0xD9, 0xD0, + 0x68, 0xE5, 0x5F, 0xD2, 0xCC, 0xE3, 0x5D, 0xDD, 0x26, 0xE7, 0xF2, 0xE4, + 0x8E, 0xED, 0x24, 0xE8, 0xB0, 0xEE, 0x1D, 0xF0, 0x1D, 0xEE, 0x04, 0xFB, + 0x82, 0xF5, 0x9D, 0x06, 0xBA, 0xF7, 0x8D, 0xFF, 0x62, 0xF9, 0x45, 0xE8, + 0x64, 0xFE, 0xBA, 0xDD, 0xE5, 0xF7, 0x6D, 0xE1, 0xAB, 0xEF, 0xE8, 0xE6, + 0x59, 0xED, 0x7F, 0xE7, 0x36, 0xF2, 0x11, 0xE8, 0x4E, 0x02, 0xD6, 0xEA, + 0x8F, 0x07, 0x73, 0xE6, 0x7E, 0x09, 0xEE, 0xE4, 0x77, 0x16, 0xF9, 0xE6, + 0xC1, 0x1D, 0x52, 0xE1, 0x9D, 0x23, 0xBD, 0xE7, 0xD7, 0x22, 0x1A, 0xF4, + 0x8C, 0x17, 0xA8, 0xFB, 0xFF, 0x13, 0x2F, 0x0E, 0x9C, 0x12, 0x6F, 0x17, + 0x7A, 0x0F, 0xEE, 0x17, 0x51, 0x0B, 0x36, 0x20, 0xC5, 0x01, 0xC1, 0x1B, + 0x2B, 0x04, 0x1F, 0x0E, 0x3D, 0x1A, 0x2B, 0x09, 0xDE, 0x2B, 0x02, 0x08, + 0x37, 0x2C, 0xD3, 0x0E, 0x6F, 0x26, 0x04, 0x20, 0xB5, 0x21, 0x51, 0x32, + 0x2C, 0x13, 0xC9, 0x34, 0x56, 0x04, 0xED, 0x28, 0x38, 0x00, 0x57, 0x27, + 0xC1, 0xF7, 0xFC, 0x2C, 0x1C, 0xF2, 0x89, 0x2E, 0xA6, 0xFB, 0xBD, 0x2D, + 0xBD, 0x0D, 0x66, 0x25, 0x21, 0x13, 0x61, 0x13, 0x53, 0x04, 0x45, 0x06, + 0x0C, 0xFE, 0x22, 0x09, 0xB4, 0x08, 0x56, 0x09, 0xE4, 0x10, 0x95, 0xFE, + 0x57, 0x16, 0xDD, 0xFA, 0xD3, 0x1C, 0x8C, 0xFD, 0xEF, 0x1C, 0xD1, 0xFD, + 0x09, 0x14, 0x65, 0xF7, 0x4B, 0x09, 0xE0, 0xEC, 0x31, 0x05, 0x08, 0xED, + 0x62, 0x06, 0xA3, 0xF9, 0x8B, 0x0C, 0xF6, 0x00, 0x2B, 0x14, 0x8E, 0xFD, + 0x4D, 0x11, 0xC5, 0xF9, 0x4C, 0xFF, 0x24, 0xF6, 0xD4, 0xEE, 0x44, 0xF6, + 0x9F, 0xED, 0xA0, 0xFD, 0x1E, 0xFC, 0xAA, 0x04, 0x6E, 0x0B, 0xB9, 0x00, + 0x6B, 0x0C, 0xA0, 0xFB, 0x82, 0x01, 0x16, 0xFE, 0x56, 0xF2, 0xF5, 0xFE, + 0x9D, 0xEE, 0x2A, 0xFC, 0x2F, 0xF4, 0x94, 0xF2, 0x78, 0xF7, 0xC0, 0xF3, + 0x82, 0xF2, 0x0E, 0x03, 0x2A, 0xF2, 0xBB, 0x0E, 0xA8, 0xF9, 0x47, 0x0F, + 0x8B, 0xEE, 0x79, 0xFC, 0xBC, 0xDA, 0xF3, 0xE5, 0xEA, 0xD7, 0x5C, 0xE1, + 0xCA, 0xDD, 0xB3, 0xE4, 0xF8, 0xE5, 0xEB, 0xE2, 0xAE, 0xEE, 0x13, 0xDE, + 0x08, 0xEF, 0x83, 0xDE, 0x16, 0xED, 0xFC, 0xE0, 0xEE, 0xF6, 0x53, 0xE7, + 0xBD, 0xF9, 0x8E, 0xEF, 0x9F, 0xEB, 0x5F, 0xEC, 0x13, 0xEE, 0x8D, 0xEC, + 0x73, 0xEE, 0xE2, 0xEA, 0x65, 0xE8, 0xDE, 0xE6, 0xFC, 0xEE, 0x63, 0xE5, + 0xF9, 0xF2, 0x99, 0xE4, 0x7A, 0xEC, 0x5D, 0xEE, 0xE1, 0xE0, 0x33, 0xF3, + 0x08, 0xE8, 0xBF, 0xF4, 0xF6, 0x02, 0x7E, 0xFD, 0x92, 0x11, 0xE8, 0xF8, + 0xF6, 0x0B, 0xD2, 0xE7, 0x2E, 0x05, 0xC7, 0xE3, 0xA6, 0x05, 0xF3, 0xEC, + 0x8E, 0x00, 0x04, 0xF6, 0xBF, 0xF3, 0xE3, 0xFF, 0x9D, 0xF2, 0x91, 0x0C, + 0xFE, 0xF9, 0xEE, 0x13, 0x08, 0xFC, 0x3C, 0x12, 0x3A, 0x03, 0x65, 0x0C, + 0x85, 0x0B, 0xE9, 0x00, 0xB3, 0x06, 0x25, 0xF3, 0xDA, 0x00, 0x3B, 0xED, + 0x32, 0x00, 0x57, 0xEA, 0x3C, 0x08, 0x62, 0xEB, 0x48, 0x16, 0xDE, 0xF0, + 0x8F, 0x1E, 0x8D, 0xF6, 0xDF, 0x1B, 0xCA, 0xFE, 0x6A, 0x0E, 0xB2, 0x06, + 0xB9, 0x04, 0x9D, 0x0A, 0x02, 0x07, 0x8D, 0x05, 0xEC, 0x0D, 0xE8, 0x01, + 0xA8, 0x0E, 0x8A, 0x0D, 0xE0, 0x08, 0xF2, 0x18, 0xF4, 0x07, 0xFB, 0x19, + 0xD9, 0x0B, 0x61, 0x16, 0x35, 0x10, 0x34, 0x1C, 0xAC, 0x0B, 0xDB, 0x20, + 0x29, 0x03, 0xDA, 0x17, 0x39, 0x10, 0xB2, 0x15, 0xA8, 0x1F, 0xEC, 0x12, + 0x58, 0x24, 0xDF, 0x09, 0xA3, 0x2C, 0xEF, 0x0A, 0x42, 0x28, 0x0A, 0x0F, + 0xF3, 0x19, 0x12, 0x13, 0x5F, 0x0E, 0xD6, 0x19, 0xE4, 0x02, 0x32, 0x23, + 0xE8, 0xFC, 0x77, 0x2C, 0x60, 0x07, 0x8A, 0x2F, 0x01, 0x1E, 0x8B, 0x2E, + 0xBD, 0x2D, 0xD2, 0x2B, 0xC7, 0x2D, 0x76, 0x2B, 0xAB, 0x26, 0x6F, 0x36, + 0xD1, 0x1A, 0x1C, 0x39, 0xA9, 0x1C, 0x5B, 0x34, 0x1E, 0x36, 0x67, 0x3E, + 0x5C, 0x43, 0x57, 0x41, 0x1A, 0x40, 0x91, 0x36, 0xFB, 0x3E, 0x1B, 0x34, + 0xE9, 0x3A, 0x94, 0x3E, 0x28, 0x27, 0x36, 0x3E, 0x3F, 0x1D, 0x9C, 0x3C, + 0x72, 0x25, 0x01, 0x41, 0x0A, 0x27, 0xB9, 0x3A, 0x41, 0x2C, 0x59, 0x31, + 0xAA, 0x30, 0x71, 0x25, 0x44, 0x23, 0x03, 0x1B, 0x13, 0x1A, 0xB5, 0x1A, + 0xDD, 0x17, 0x86, 0x15, 0xE5, 0x16, 0x52, 0x13, 0xE4, 0x19, 0x0B, 0x20, + 0xDF, 0x1F, 0xB9, 0x2C, 0xC6, 0x1E, 0x73, 0x32, 0x3F, 0x0E, 0x2F, 0x2C, + 0x79, 0x05, 0xD5, 0x25, 0xDF, 0x02, 0xA7, 0x1D, 0x43, 0xFB, 0xCB, 0x0A, + 0x47, 0xFC, 0x56, 0x06, 0xDE, 0x03, 0x81, 0x12, 0xAF, 0x16, 0x6C, 0x1E, + 0xDF, 0x2A, 0x51, 0x22, 0x61, 0x21, 0xF4, 0x20, 0x11, 0x10, 0xD0, 0x20, + 0x29, 0x10, 0xFB, 0x1D, 0x77, 0x11, 0x48, 0x10, 0xE0, 0x0E, 0xBC, 0x03, + 0x02, 0x14, 0xFC, 0x06, 0xFD, 0x1A, 0xE3, 0x06, 0x06, 0x1D, 0x57, 0x07, + 0x2C, 0x1B, 0x20, 0x10, 0xA4, 0x17, 0xED, 0x18, 0x63, 0x13, 0x7C, 0x21, + 0x3F, 0x12, 0xD6, 0x23, 0x8F, 0x21, 0xD3, 0x1D, 0x08, 0x3B, 0x32, 0x1D, + 0x63, 0x38, 0x42, 0x26, 0x15, 0x18, 0x22, 0x28, 0x25, 0x0B, 0x3C, 0x23, + 0x1B, 0x17, 0xFE, 0x1B, 0xA7, 0x12, 0x21, 0x0B, 0xFB, 0x00, 0xF0, 0xFD, + 0x06, 0x06, 0xB5, 0x06, 0x35, 0x04, 0x80, 0x0D, 0xB8, 0xF0, 0xEF, 0x09, + 0x64, 0xF0, 0x83, 0x13, 0x6A, 0xFC, 0x0C, 0x24, 0x7C, 0xF8, 0xA2, 0x26, + 0xE6, 0xE8, 0xE6, 0x1E, 0x05, 0xF2, 0x9E, 0x24, 0x6B, 0x00, 0x72, 0x24, + 0xA2, 0xF2, 0xAA, 0x15, 0xBF, 0xEB, 0x99, 0x11, 0xC5, 0xF9, 0x3E, 0x08, + 0x7A, 0x03, 0x69, 0xF7, 0x5B, 0x0A, 0xD6, 0xEE, 0x39, 0x16, 0x1F, 0xF1, + 0x05, 0x18, 0xB6, 0xF5, 0xC4, 0x07, 0xEC, 0xEF, 0x18, 0x00, 0xA6, 0xEF, + 0x3D, 0x0B, 0xE0, 0xFD, 0xA9, 0x09, 0xBD, 0x00, 0xCF, 0x02, 0xCD, 0xF8, + 0x54, 0x0E, 0x37, 0xFA, 0x42, 0x1C, 0xB1, 0xF9, 0xD5, 0x20, 0x68, 0xF5, + 0x0A, 0x1C, 0x7A, 0xF6, 0x88, 0x0C, 0x4C, 0xF6, 0xAC, 0xFD, 0xE1, 0xF9, + 0x46, 0xF8, 0x20, 0x04, 0xCC, 0xF1, 0x51, 0x0D, 0x6C, 0xEC, 0xA8, 0x15, + 0x98, 0xF1, 0x94, 0x1B, 0x83, 0xFA, 0xF6, 0x1D, 0x56, 0xFF, 0x5A, 0x1C, + 0x21, 0x0B, 0x70, 0x1D, 0xF4, 0x16, 0x16, 0x1C, 0x63, 0x0C, 0xC3, 0x17, + 0xFB, 0xF8, 0xF4, 0x18, 0xB5, 0xF2, 0xD3, 0x10, 0xDE, 0xFC, 0xB8, 0x05, + 0xE3, 0x06, 0x93, 0x07, 0x8A, 0x05, 0x54, 0x0B, 0xA7, 0xFC, 0xDA, 0x05, + 0xF1, 0xF9, 0x30, 0x01, 0x55, 0xFE, 0xEB, 0xFB, 0xC3, 0xF9, 0xAA, 0xF3, + 0xA5, 0xF1, 0x5F, 0xF9, 0x7D, 0xF7, 0x00, 0x0E, 0x5B, 0x02, 0xA3, 0x18, + 0xB4, 0xFF, 0x63, 0x10, 0xF6, 0xFE, 0x27, 0x0D, 0xD1, 0xFD, 0x8A, 0x0B, + 0x7D, 0xF7, 0x8B, 0x04, 0xA1, 0xFC, 0xC3, 0xF9, 0x9E, 0x09, 0xD4, 0xEC, + 0x80, 0x13, 0x56, 0xEA, 0x87, 0x14, 0x2F, 0xEC, 0x72, 0x0E, 0x05, 0xE8, + 0x63, 0x08, 0xC5, 0xE5, 0xAF, 0x00, 0x55, 0xEF, 0x10, 0xEB, 0x35, 0xF3, + 0x4F, 0xD8, 0xA5, 0xF5, 0xD3, 0xE5, 0x45, 0x07, 0x89, 0xFB, 0x25, 0x14, + 0xBF, 0x07, 0x2C, 0x12, 0xEB, 0x12, 0x42, 0x0B, 0x6C, 0x09, 0x3C, 0x03, + 0x0B, 0xF7, 0x0E, 0xFC, 0xC4, 0xF2, 0x6A, 0xF9, 0xDC, 0x00, 0xA7, 0x02, + 0x2A, 0x0E, 0xB2, 0x10, 0x39, 0x0B, 0x8A, 0x12, 0xCD, 0x0F, 0xC8, 0x0A, + 0x3C, 0x0E, 0xAA, 0xF9, 0x97, 0xFF, 0xAB, 0xED, 0x81, 0xF3, 0xB3, 0xF1, + 0x19, 0xEB, 0x4A, 0xF9, 0xE9, 0xE9, 0x2C, 0xFE, 0x1B, 0xF4, 0x0D, 0xFF, + 0x3D, 0x02, 0xAC, 0x00, 0x81, 0x02, 0x99, 0xFC, 0x09, 0xF2, 0xA3, 0xEC, + 0xB7, 0xEA, 0xF9, 0xE0, 0xEE, 0xF9, 0x51, 0xE4, 0x3C, 0x0A, 0xBD, 0xF0, + 0xF6, 0xFE, 0xBB, 0xF6, 0x94, 0xE8, 0xD7, 0xFD, 0x20, 0xD7, 0xE8, 0xFF, + 0xA4, 0xCA, 0xE7, 0xFF, 0xD0, 0xCF, 0x2E, 0x06, 0x5B, 0xD7, 0x64, 0x00, + 0x75, 0xE3, 0x80, 0x02, 0x0C, 0xEC, 0x33, 0x02, 0x06, 0xE7, 0x9B, 0xF1, + 0x13, 0xEC, 0x3A, 0xE3, 0xCC, 0xF3, 0xBA, 0xDB, 0x4A, 0xE9, 0xCE, 0xD4, + 0xB4, 0xD7, 0xB4, 0xD5, 0x0F, 0xD5, 0xBC, 0xE8, 0xDA, 0xE1, 0xB4, 0xEF, + 0x8C, 0xE4, 0xB2, 0xDF, 0x8A, 0xDE, 0xD3, 0xD1, 0x0F, 0xD9, 0x32, 0xC6, + 0xBF, 0xDA, 0x67, 0xC9, 0xCF, 0xE3, 0xD5, 0xDB, 0x35, 0xEA, 0x45, 0xE7, + 0xA0, 0xF0, 0x8E, 0xEF, 0x19, 0xEB, 0xFE, 0xEF, 0xDE, 0xE8, 0xC4, 0xE9, + 0x00, 0xEE, 0xAC, 0xDF, 0x8D, 0xE5, 0x92, 0xD2, 0x11, 0xE2, 0x6E, 0xD0, + 0xD9, 0xF0, 0xC8, 0xD1, 0xD7, 0xF9, 0x2B, 0xCC, 0xF6, 0xF6, 0xC5, 0xC8, + 0x65, 0xE6, 0x59, 0xC8, 0x40, 0xD3, 0xB0, 0xCD, 0x76, 0xD0, 0x08, 0xD8, + 0xAA, 0xD4, 0x8F, 0xDE, 0x9C, 0xDF, 0x56, 0xE0, 0x3F, 0xE7, 0x21, 0xDF, + 0x87, 0xE2, 0xD4, 0xDD, 0x12, 0xD7, 0x92, 0xDF, 0xD5, 0xDE, 0x41, 0xE6, + 0xA2, 0xE7, 0x55, 0xD8, 0x30, 0xE1, 0x59, 0xCC, 0xCA, 0xE3, 0x3B, 0xDC, + 0xAF, 0xDB, 0x04, 0xDD, 0x95, 0xC3, 0xDD, 0xC7, 0x98, 0xB7, 0x50, 0xBE, + 0x31, 0xB9, 0x7E, 0xBD, 0x79, 0xC1, 0xC2, 0xBC, 0x40, 0xCD, 0xB6, 0xC8, + 0x77, 0xD4, 0x02, 0xD6, 0x55, 0xD7, 0xF8, 0xD9, 0xE7, 0xD3, 0x64, 0xDD, + 0xDF, 0xD5, 0xDC, 0xDE, 0x6B, 0xDF, 0xA0, 0xD9, 0x2A, 0xE8, 0xA1, 0xD5, + 0xCF, 0xED, 0x6D, 0xCC, 0x83, 0xF3, 0x91, 0xC8, 0xD7, 0xEB, 0xB0, 0xD1, + 0x88, 0xD4, 0xD0, 0xD2, 0x49, 0xC7, 0x47, 0xC8, 0x20, 0xCB, 0x23, 0xC7, + 0xEF, 0xD3, 0x51, 0xCE, 0x3A, 0xE2, 0xE1, 0xD2, 0xB1, 0xF2, 0xB8, 0xDA, + 0x0B, 0xF9, 0x34, 0xE0, 0x59, 0xF9, 0xE0, 0xDB, 0x07, 0xF9, 0xDC, 0xD9, + 0x74, 0xF7, 0x3C, 0xE3, 0xC1, 0xEC, 0x06, 0xE4, 0x4F, 0xEC, 0xC1, 0xE0, + 0xC4, 0xFD, 0x34, 0xE9, 0x9F, 0xFF, 0xA7, 0xEF, 0x29, 0xF5, 0xDE, 0xF7, + 0xC9, 0xE7, 0xB3, 0xF9, 0x82, 0xD4, 0xE5, 0xE4, 0x67, 0xCF, 0x1B, 0xDC, + 0x05, 0xD6, 0x09, 0xEB, 0x42, 0xDD, 0xFC, 0xFB, 0x42, 0xF4, 0x42, 0x0F, + 0xA1, 0x0E, 0xE3, 0x16, 0x42, 0x1A, 0x2F, 0x16, 0x6D, 0x1B, 0x34, 0x22, + 0xD4, 0x15, 0x2A, 0x26, 0xBB, 0x14, 0x1B, 0x18, 0xFA, 0x1A, 0x8D, 0x11, + 0x42, 0x20, 0x7F, 0x16, 0xDB, 0x25, 0x48, 0x19, 0x0D, 0x22, 0xBA, 0x14, + 0x07, 0x17, 0x02, 0x08, 0xA3, 0x1B, 0x3C, 0xFC, 0xE0, 0x23, 0x98, 0xF6, + 0x4D, 0x19, 0x07, 0xF4, 0xC0, 0x12, 0xC8, 0xFA, 0x6C, 0x1E, 0xB7, 0x08, + 0x0A, 0x25, 0x8B, 0x11, 0xB4, 0x2D, 0x69, 0x1A, 0xE1, 0x34, 0x3D, 0x1D, + 0x1B, 0x29, 0xBB, 0x14, 0x2D, 0x15, 0x84, 0x0C, 0xFE, 0x0E, 0x46, 0x0E, + 0x68, 0x19, 0x95, 0x13, 0x03, 0x1A, 0x95, 0x0F, 0x46, 0x13, 0x1E, 0x0F, + 0x36, 0x0E, 0xE2, 0x0E, 0x3B, 0x04, 0x53, 0x03, 0x83, 0x01, 0x56, 0x06, + 0x8D, 0xFB, 0x03, 0x14, 0x47, 0xFB, 0x0B, 0x20, 0x16, 0x0F, 0xFA, 0x25, + 0x82, 0x15, 0x1E, 0x1E, 0x8A, 0x0D, 0xA7, 0x14, 0x42, 0x07, 0x66, 0x07, + 0x1D, 0xFD, 0x71, 0xF6, 0x5E, 0xEF, 0x18, 0xE8, 0xA5, 0xF5, 0x80, 0xF3, + 0xF0, 0xFF, 0x0E, 0x0C, 0xFD, 0xF5, 0x46, 0x0F, 0x42, 0xF3, 0xBF, 0x0A, + 0x2F, 0xFC, 0xEA, 0x04, 0xDF, 0x02, 0x8D, 0xF6, 0x6D, 0x03, 0x38, 0xE6, + 0x00, 0xFE, 0x88, 0xE8, 0x07, 0xF5, 0x71, 0xF3, 0x98, 0xE9, 0x69, 0xF7, + 0x67, 0xEC, 0xE0, 0x01, 0x83, 0xFD, 0xAB, 0x09, 0x26, 0x05, 0x6A, 0x03, + 0x10, 0x01, 0x18, 0xFC, 0xF7, 0xFF, 0xB3, 0xFA, 0x41, 0x00, 0x97, 0xF7, + 0xB5, 0x02, 0x66, 0xF8, 0x14, 0x04, 0x51, 0x04, 0x6B, 0xF3, 0xDD, 0x06, + 0x51, 0xE3, 0x19, 0x01, 0xD6, 0xE5, 0xA6, 0x02, 0xA4, 0xE5, 0xCB, 0xF9, + 0x9B, 0xE3, 0x6C, 0xEA, 0x6C, 0xF9, 0x81, 0xEB, 0x8A, 0x11, 0x79, 0xF6, + 0x54, 0x1B, 0xA3, 0x09, 0x4F, 0x21, 0x1F, 0x1A, 0x3E, 0x22, 0xC7, 0x1A, + 0xD1, 0x20, 0x20, 0x1A, 0xD3, 0x22, 0x4E, 0x18, 0x0C, 0x2A, 0xE5, 0x0B, + 0xED, 0x24, 0xE8, 0xFE, 0x7C, 0x0F, 0xC9, 0x01, 0x4F, 0xFD, 0xC8, 0x09, + 0x7F, 0xF6, 0x4F, 0x03, 0xDA, 0x00, 0xCF, 0x02, 0xFC, 0x09, 0x11, 0x08, + 0x56, 0xFA, 0x3C, 0x00, 0xDF, 0xEF, 0x80, 0x04, 0x17, 0xFC, 0xA3, 0x1A, + 0x9B, 0x0F, 0xFF, 0x25, 0x58, 0x17, 0x28, 0x16, 0xE3, 0x10, 0xE1, 0xFD, + 0x25, 0x16, 0x4C, 0xF5, 0xE0, 0x2B, 0x59, 0x01, 0x68, 0x2F, 0xD4, 0x03, + 0x62, 0x1F, 0x26, 0xFC, 0xD6, 0x0D, 0x9B, 0x05, 0xAE, 0xFC, 0xF0, 0x0A, + 0x20, 0x02, 0xEC, 0x07, 0xEC, 0x0C, 0xED, 0x04, 0x79, 0x07, 0xCC, 0x03, + 0xE7, 0xFF, 0x1F, 0x03, 0xF1, 0x00, 0x98, 0xFC, 0x39, 0x0E, 0x15, 0xFA, + 0x5A, 0x1D, 0x45, 0x05, 0x83, 0x29, 0xFC, 0x11, 0xD6, 0x24, 0xB2, 0x0B, + 0x23, 0x18, 0x40, 0x0E, 0x2D, 0x19, 0xA2, 0x1E, 0x03, 0x1F, 0x13, 0x1C, + 0xB0, 0x1F, 0x8A, 0x1C, 0xE2, 0x08, 0x3F, 0x1D, 0x6D, 0xF6, 0x11, 0x12, + 0x41, 0x08, 0x18, 0x12, 0xEC, 0x16, 0x9C, 0x12, 0xBC, 0x0F, 0x95, 0x05, + 0xD9, 0x0E, 0xAB, 0x04, 0x52, 0x1A, 0x91, 0x11, 0x5C, 0x23, 0x80, 0x1D, + 0x6D, 0x25, 0x80, 0x25, 0xF4, 0x23, 0xE5, 0x1E, 0xB3, 0x2D, 0x4A, 0x1D, + 0x66, 0x33, 0x3E, 0x2B, 0x2F, 0x29, 0xAE, 0x3A, 0xA5, 0x1B, 0xEE, 0x3B, + 0x25, 0x06, 0x16, 0x2E, 0x1F, 0xF3, 0xEF, 0x28, 0xFD, 0x00, 0xDA, 0x3A, + 0x8F, 0x28, 0xD0, 0x4C, 0x5C, 0x3B, 0x45, 0x47, 0x0A, 0x39, 0x62, 0x3F, + 0x1F, 0x35, 0x59, 0x3F, 0xBF, 0x27, 0x67, 0x3C, 0x9B, 0x1D, 0x48, 0x3B, + 0xCC, 0x27, 0x5F, 0x39, 0x35, 0x3C, 0xB0, 0x3A, 0x68, 0x48, 0xBB, 0x46, + 0x62, 0x48, 0x40, 0x4B, 0xBC, 0x39, 0xB1, 0x3C, 0x1C, 0x26, 0xCF, 0x24, + 0x0E, 0x1F, 0x1E, 0x1B, 0x8F, 0x0B, 0x2E, 0x1D, 0xF3, 0xFD, 0x45, 0x22, + 0xEF, 0x18, 0xF9, 0x2B, 0x65, 0x28, 0xC0, 0x24, 0x82, 0x23, 0xC5, 0x1C, + 0x6C, 0x25, 0xEE, 0x1E, 0xED, 0x25, 0x7A, 0x1A, 0x37, 0x20, 0x3E, 0x14, + 0xF2, 0x1F, 0xF5, 0x10, 0x31, 0x2A, 0xD0, 0x0E, 0x40, 0x36, 0xF7, 0x11, + 0x99, 0x34, 0xA5, 0x18, 0xE5, 0x1E, 0x9A, 0x14, 0xDA, 0x02, 0x60, 0x06, + 0x4D, 0xF5, 0x27, 0x05, 0x6E, 0xF9, 0x08, 0x13, 0x69, 0xFA, 0xE9, 0x15, + 0x41, 0xF1, 0xBA, 0x0B, 0xCF, 0xEB, 0x39, 0x03, 0x29, 0xEF, 0x60, 0xFD, + 0xCD, 0xF3, 0x05, 0xFD, 0xD9, 0xF2, 0x90, 0xFD, 0xA4, 0xEE, 0xD5, 0xFC, + 0x61, 0xF1, 0x1E, 0x03, 0x16, 0xF5, 0x8A, 0x0C, 0x36, 0xF3, 0x01, 0x1A, + 0xE1, 0xEB, 0x40, 0x23, 0x72, 0xE6, 0x37, 0x22, 0x38, 0xEA, 0x15, 0x19, + 0x9E, 0xF2, 0x93, 0x12, 0x44, 0xEF, 0x84, 0x11, 0x6B, 0xDD, 0x15, 0x04, + 0x1B, 0xDD, 0xC9, 0xF3, 0x48, 0xF6, 0xFF, 0xF4, 0x33, 0x07, 0x77, 0xF6, + 0x79, 0x03, 0x56, 0xEC, 0x66, 0x01, 0x54, 0xEF, 0x61, 0xFF, 0xEF, 0xF0, + 0x57, 0xFC, 0x84, 0xE1, 0x4C, 0x03, 0x63, 0xDD, 0x69, 0x05, 0xCF, 0xE8, + 0x03, 0xFC, 0x3A, 0xEB, 0x2C, 0xFC, 0xA2, 0xEB, 0x38, 0x03, 0x0B, 0xF9, + 0x67, 0xF9, 0xDA, 0xFD, 0x24, 0xE9, 0x59, 0xF6, 0xA6, 0xEB, 0x71, 0xFB, + 0x0A, 0xF7, 0x51, 0x01, 0x2A, 0xFA, 0x01, 0xFA, 0xE2, 0xFB, 0x63, 0xF7, + 0x4E, 0x07, 0x52, 0x00, 0xAA, 0x08, 0x37, 0xFE, 0x88, 0x01, 0x7F, 0xF6, + 0x8E, 0x08, 0xF4, 0xFF, 0x97, 0x07, 0x50, 0x08, 0xD6, 0xFA, 0x33, 0x09, + 0x24, 0xF2, 0x2D, 0x05, 0x98, 0xF0, 0x65, 0xFC, 0xDF, 0xE9, 0x5F, 0xF4, + 0x9A, 0xDB, 0x24, 0xF5, 0x8C, 0xD4, 0x24, 0xF7, 0xBD, 0xD1, 0x12, 0xEB, + 0xED, 0xD4, 0xBD, 0xE6, 0x67, 0xE9, 0x1F, 0xF3, 0x10, 0x05, 0x7F, 0xF8, + 0xF8, 0x0C, 0xC7, 0xEE, 0x8D, 0x03, 0x9F, 0xE7, 0x41, 0x00, 0xA9, 0xED, + 0x34, 0x02, 0xA4, 0xF2, 0x2E, 0xFB, 0x38, 0xF0, 0x27, 0xF5, 0xCB, 0xF3, + 0x67, 0xEE, 0xDF, 0xFB, 0xE3, 0xE5, 0xD8, 0x05, 0xCD, 0xDC, 0xE2, 0x0B, + 0x9E, 0xCF, 0x8F, 0x04, 0x9F, 0xC4, 0x2B, 0xF4, 0xF1, 0xCA, 0x00, 0xE8, + 0x5A, 0xE8, 0xE8, 0xED, 0x08, 0xF9, 0x6C, 0xF2, 0xEF, 0xF7, 0x8C, 0xEC, + 0xC0, 0xFA, 0xA5, 0xF3, 0x41, 0xF7, 0xD2, 0xFF, 0x64, 0xEF, 0x57, 0x07, + 0xBC, 0xF1, 0xE5, 0x09, 0xFD, 0xF5, 0xDF, 0x07, 0x32, 0xFB, 0x4B, 0x0D, + 0xBC, 0xFF, 0x90, 0x10, 0x37, 0x05, 0xA6, 0x0C, 0xFA, 0x08, 0x89, 0x07, + 0xE9, 0x01, 0x94, 0x00, 0xA3, 0x01, 0x4A, 0x00, 0x8B, 0x03, 0x00, 0xFD, + 0x1B, 0xFD, 0x11, 0xEB, 0xAF, 0x06, 0x21, 0xE3, 0xA1, 0x13, 0x08, 0xE1, + 0xBF, 0x10, 0x71, 0xD8, 0x6C, 0x13, 0xEA, 0xDD, 0x37, 0x1B, 0xD9, 0xEE, + 0x1F, 0x16, 0x8B, 0xF8, 0xB8, 0x0A, 0x26, 0xFE, 0x46, 0xFF, 0x36, 0x01, + 0x1D, 0xFC, 0xB8, 0x07, 0xD1, 0x0B, 0x50, 0x19, 0x21, 0x1A, 0xA3, 0x21, + 0x6D, 0x14, 0xA7, 0x18, 0x93, 0x01, 0xB3, 0x09, 0x02, 0x03, 0xFD, 0x05, + 0xA3, 0x15, 0xB7, 0x0F, 0xA2, 0x13, 0xBC, 0x15, 0xC0, 0x04, 0x53, 0x0F, + 0xA1, 0x02, 0x8A, 0x08, 0x13, 0x09, 0x22, 0x09, 0x06, 0x0B, 0xCD, 0x03, + 0x47, 0xFA, 0x4B, 0xF1, 0x5F, 0xE1, 0x77, 0xE3, 0x19, 0xE1, 0xEE, 0xEB, + 0x6B, 0xEB, 0xAF, 0xFB, 0x24, 0xFB, 0xB3, 0x07, 0x1E, 0x11, 0x48, 0x07, + 0xCD, 0x11, 0xE1, 0xF8, 0x36, 0xF7, 0x6F, 0xEA, 0xA4, 0xE0, 0xC1, 0xE3, + 0x33, 0xE4, 0xE3, 0xE3, 0xBD, 0xED, 0x10, 0xE5, 0x03, 0xED, 0xD9, 0xE4, + 0xDB, 0xE7, 0x3B, 0xDE, 0x3D, 0xEC, 0xBF, 0xDB, 0x71, 0xF6, 0x18, 0xE0, + 0x7F, 0xF3, 0x79, 0xDF, 0x04, 0xD9, 0x4E, 0xD7, 0xFA, 0xC1, 0xCF, 0xD6, + 0x0F, 0xC5, 0x75, 0xDE, 0x7B, 0xD4, 0x42, 0xDD, 0xC6, 0xDD, 0xD5, 0xD6, + 0xDC, 0xD3, 0x46, 0xCA, 0xFD, 0xC8, 0xC8, 0xBF, 0xFB, 0xCF, 0x54, 0xC6, + 0x5C, 0xDB, 0x54, 0xD2, 0x8E, 0xD9, 0x57, 0xD3, 0xA0, 0xCA, 0x47, 0xCE, + 0x24, 0xCB, 0x26, 0xD6, 0x34, 0xDF, 0x81, 0xDF, 0xCA, 0xEB, 0xD9, 0xE6, + 0x6B, 0xF0, 0x61, 0xF8, 0x2F, 0xF1, 0x8B, 0x08, 0xED, 0xEC, 0xF7, 0x0B, + 0xF4, 0xE6, 0x8C, 0x04, 0x27, 0xE4, 0xB4, 0xF8, 0x48, 0xE4, 0x2C, 0xEA, + 0xC2, 0xE4, 0x99, 0xE6, 0xCB, 0xDE, 0x32, 0xEE, 0x1C, 0xDA, 0x02, 0xED, + 0xD5, 0xD8, 0xFE, 0xD9, 0x74, 0xD4, 0xDE, 0xC6, 0x20, 0xDC, 0x63, 0xC5, + 0x34, 0xEB, 0xB2, 0xCE, 0x51, 0xF1, 0x84, 0xD5, 0x30, 0xFC, 0x57, 0xDB, + 0x10, 0x09, 0x69, 0xE0, 0x6D, 0x04, 0xA0, 0xE0, 0x22, 0xFC, 0x45, 0xDE, + 0xDE, 0xF8, 0xF3, 0xDC, 0x70, 0xF4, 0x88, 0xDE, 0x28, 0xF4, 0x9B, 0xE5, + 0xB9, 0xFB, 0x60, 0xED, 0xC5, 0xF8, 0x4C, 0xEB, 0x66, 0xEF, 0x19, 0xE3, + 0x1A, 0xEB, 0xFD, 0xD6, 0x40, 0xE4, 0xD5, 0xD1, 0x31, 0xDA, 0x09, 0xD4, + 0x20, 0xDA, 0xBF, 0xD8, 0xC1, 0xE4, 0xDB, 0xE0, 0x6E, 0xF2, 0x5F, 0xE9, + 0x0D, 0xFD, 0xDD, 0xF1, 0xBC, 0xF5, 0xB7, 0xF1, 0x95, 0xEA, 0x99, 0xEF, + 0x55, 0xE4, 0x8D, 0xF5, 0x9C, 0xE5, 0x87, 0xF7, 0x0B, 0xF2, 0xE9, 0xF8, + 0x4D, 0xF8, 0x8D, 0xFC, 0x4E, 0xF9, 0x2B, 0xFD, 0x37, 0xF5, 0xB4, 0xF7, + 0xA4, 0xF4, 0xE3, 0xF1, 0xF8, 0x00, 0x2A, 0xF4, 0x43, 0x0D, 0x2F, 0xFB, + 0x43, 0x1D, 0x08, 0x0B, 0x6A, 0x27, 0xB9, 0x11, 0xD0, 0x20, 0x28, 0x0A, + 0x3F, 0x19, 0x31, 0x08, 0xD2, 0x0D, 0x32, 0x06, 0x07, 0xFE, 0xEE, 0x05, + 0x5F, 0xFD, 0x3C, 0x0A, 0x2D, 0x12, 0x67, 0x09, 0x96, 0x2B, 0x9A, 0x05, + 0xB2, 0x36, 0x75, 0x03, 0xAC, 0x2B, 0xC0, 0xFE, 0xA4, 0x15, 0x67, 0xF5, + 0x40, 0x0F, 0xB0, 0xF6, 0xDF, 0x16, 0x69, 0x08, 0x19, 0x17, 0xC4, 0x20, + 0xAF, 0x15, 0x43, 0x37, 0xC2, 0x1B, 0x68, 0x3D, 0xCE, 0x23, 0x2A, 0x2F, + 0x9F, 0x21, 0xB7, 0x16, 0x07, 0x16, 0x65, 0x0E, 0x81, 0x0F, 0xB4, 0x1D, + 0x17, 0x07, 0xC2, 0x26, 0xC5, 0x0A, 0xC2, 0x29, 0xA6, 0x1E, 0x25, 0x2F, + 0x77, 0x26, 0x62, 0x2D, 0x45, 0x1C, 0x67, 0x21, 0x8E, 0x13, 0x53, 0x10, + 0x18, 0x14, 0xFB, 0x08, 0x8B, 0x17, 0x70, 0x11, 0x0E, 0x1C, 0xB2, 0x1F, + 0x30, 0x20, 0xF2, 0x2B, 0x8F, 0x24, 0x22, 0x34, 0x83, 0x28, 0x12, 0x33, + 0x7C, 0x29, 0x94, 0x2C, 0x40, 0x25, 0x41, 0x25, 0xD3, 0x17, 0x2C, 0x19, + 0x11, 0x0A, 0xA9, 0x0E, 0xAE, 0x0C, 0x73, 0x0D, 0x3E, 0x0B, 0x25, 0x0B, + 0x54, 0x00, 0x9E, 0x04, 0x0F, 0x02, 0x37, 0x00, 0xD2, 0x01, 0xCE, 0xF6, + 0xF2, 0xF7, 0x56, 0xEF, 0x4C, 0xFA, 0x29, 0xF8, 0x67, 0x00, 0xD9, 0xFF, + 0x9B, 0xF8, 0x44, 0xFD, 0xE7, 0xEE, 0x27, 0xFA, 0x1C, 0xF0, 0x8D, 0xF3, + 0x45, 0xEE, 0x9E, 0xF0, 0x78, 0xE5, 0xCC, 0xFB, 0xDF, 0xE1, 0xC2, 0xFA, + 0xC6, 0xE7, 0xF1, 0xED, 0x11, 0xF5, 0x5D, 0xEA, 0x4D, 0xFC, 0xC0, 0xE6, + 0x7D, 0xF8, 0x25, 0xD9, 0x43, 0xEC, 0x76, 0xCC, 0x85, 0xE8, 0x42, 0xCE, + 0x76, 0xED, 0x24, 0xD3, 0x25, 0xF5, 0xE8, 0xDD, 0xC7, 0xFA, 0x12, 0xE7, + 0xCE, 0xEE, 0x9B, 0xE5, 0x65, 0xE0, 0xF8, 0xE7, 0x2C, 0xE1, 0x55, 0xE9, + 0x87, 0xF4, 0xDA, 0xE7, 0x75, 0x0C, 0x1D, 0xEB, 0xFE, 0x13, 0xD5, 0xEA, + 0xC2, 0x0F, 0xFB, 0xE7, 0xA3, 0x0A, 0xA9, 0xED, 0x83, 0x00, 0x4F, 0xF9, + 0xDA, 0xF6, 0x80, 0x02, 0xFC, 0xF2, 0xF4, 0x06, 0xF0, 0xF7, 0x83, 0x10, + 0x91, 0x03, 0x20, 0x1B, 0xA4, 0x03, 0x32, 0x1D, 0x4B, 0xF7, 0xE7, 0x19, + 0xBA, 0xEE, 0xC7, 0x14, 0xC8, 0xEF, 0x86, 0x12, 0x69, 0xF8, 0x98, 0x15, + 0xEA, 0xF6, 0x3E, 0x13, 0xD7, 0xE9, 0x1B, 0x0C, 0xD0, 0xF1, 0x49, 0x0A, + 0x21, 0x04, 0x3F, 0x05, 0xBE, 0x08, 0x13, 0xFB, 0x3B, 0x07, 0xD8, 0xEF, + 0x75, 0x02, 0x90, 0xE0, 0x1F, 0x09, 0x39, 0xE7, 0x84, 0x1A, 0x9F, 0x00, + 0xB9, 0x1A, 0x47, 0x02, 0xED, 0x10, 0x9A, 0xF8, 0x99, 0x06, 0x41, 0xFB, + 0xCC, 0xFF, 0x67, 0x02, 0xE0, 0x06, 0x5A, 0x0B, 0x08, 0x10, 0xE9, 0x0C, + 0xFD, 0x0D, 0x70, 0xFE, 0x59, 0x09, 0x7D, 0xF4, 0xDA, 0x06, 0xB2, 0xF2, + 0x03, 0x04, 0xF2, 0xF2, 0xD3, 0xFF, 0x6F, 0xFA, 0x09, 0xF4, 0xF8, 0x01, + 0x5C, 0xEE, 0x95, 0x03, 0x81, 0xF9, 0x62, 0x03, 0x83, 0x0D, 0x65, 0x08, + 0x03, 0x21, 0x87, 0x0E, 0x4C, 0x1F, 0xF6, 0x0C, 0x21, 0x08, 0x1D, 0x10, + 0xB1, 0xFC, 0x98, 0x22, 0x56, 0x07, 0xBF, 0x31, 0x79, 0x15, 0x09, 0x34, + 0x87, 0x13, 0x83, 0x2B, 0x68, 0x09, 0xA6, 0x19, 0xEF, 0x0B, 0x1D, 0x11, + 0x9C, 0x14, 0xCA, 0x13, 0xAF, 0x19, 0x50, 0x16, 0x00, 0x19, 0x7D, 0x18, + 0x43, 0x18, 0xED, 0x1A, 0x5C, 0x18, 0x31, 0x21, 0x98, 0x1D, 0x70, 0x29, + 0xBE, 0x20, 0x6B, 0x30, 0x13, 0x12, 0xBE, 0x2F, 0xBE, 0x04, 0x86, 0x28, + 0xB6, 0x07, 0x9E, 0x23, 0x0F, 0x13, 0x5B, 0x1B, 0x00, 0x28, 0x9C, 0x13, + 0x4D, 0x2C, 0x4D, 0x0D, 0xF2, 0x22, 0x86, 0x0D, 0xA4, 0x22, 0x83, 0x10, + 0x01, 0x1D, 0xA3, 0x0B, 0x52, 0x14, 0x90, 0x0A, 0x3D, 0x0E, 0x5B, 0x12, + 0x05, 0x0C, 0xCA, 0x13, 0x9D, 0x0D, 0x59, 0x0C, 0x52, 0x14, 0x1F, 0x0C, + 0xAE, 0x1C, 0xA0, 0x10, 0x53, 0x1C, 0x7B, 0x15, 0xCE, 0x15, 0x74, 0x21, + 0x4C, 0x0C, 0x98, 0x26, 0xAC, 0x03, 0x61, 0x1B, 0x90, 0x07, 0x0D, 0x0B, + 0xB6, 0x16, 0x41, 0x00, 0x67, 0x20, 0xC3, 0x00, 0x9E, 0x1D, 0xF0, 0x00, + 0xA5, 0x19, 0x02, 0x00, 0x40, 0x14, 0x2E, 0x05, 0x37, 0x06, 0xFF, 0x09, + 0x1E, 0xFB, 0xC2, 0x11, 0x79, 0xFA, 0xE8, 0x1D, 0xD8, 0xFB, 0xA5, 0x23, + 0x14, 0x03, 0x93, 0x23, 0x7A, 0x0C, 0x8C, 0x1F, 0x3D, 0x05, 0xC7, 0x16, + 0x55, 0xFA, 0x03, 0x13, 0xCC, 0xFA, 0x87, 0x13, 0x18, 0x02, 0x3F, 0x13, + 0x9F, 0x06, 0xA2, 0x16, 0xDD, 0x08, 0x9E, 0x15, 0x6B, 0x0C, 0xAC, 0x09, + 0xBC, 0x0A, 0x4D, 0xFF, 0x54, 0x00, 0x2B, 0xF8, 0xDE, 0xF5, 0x1B, 0xF4, + 0x27, 0xF7, 0x9F, 0xF8, 0xCC, 0xFC, 0x76, 0xFC, 0x36, 0xFC, 0xD8, 0xF8, + 0xA1, 0xFA, 0x4C, 0xF5, 0x99, 0xFE, 0x9D, 0xFA, 0x05, 0x05, 0x0A, 0x07, + 0xE5, 0x01, 0x3D, 0x0A, 0x62, 0xF2, 0x10, 0xFB, 0xEC, 0xF1, 0x8D, 0xF3, + 0x88, 0x00, 0xD2, 0xFD, 0x25, 0x01, 0xD8, 0x04, 0xCA, 0xF6, 0x60, 0x03, + 0xD8, 0xF4, 0xD4, 0xFF, 0x4B, 0xFA, 0xDA, 0x04, 0x17, 0xFF, 0xEE, 0x16, + 0x98, 0xFD, 0x9E, 0x25, 0x10, 0xED, 0x5C, 0x25, 0x17, 0xE7, 0xD1, 0x1E, + 0xCF, 0xFB, 0x86, 0x17, 0x63, 0x10, 0xEA, 0x0E, 0xB9, 0x18, 0xE4, 0x07, + 0x94, 0x19, 0xDF, 0x00, 0xB6, 0x14, 0x68, 0xF7, 0x4E, 0x12, 0xE7, 0xF2, + 0x43, 0x10, 0x76, 0xFC, 0x98, 0x0C, 0x25, 0x09, 0xD6, 0x0A, 0x92, 0x0D, + 0x6D, 0x0B, 0xCC, 0x10, 0x65, 0x0B, 0x83, 0x14, 0x33, 0x06, 0x17, 0x17, + 0xEE, 0xF7, 0xF5, 0x14, 0xEB, 0xE9, 0xBE, 0x0F, 0x67, 0xEE, 0x03, 0x0C, + 0x81, 0x01, 0x85, 0x0C, 0x7B, 0x16, 0x58, 0x17, 0xCB, 0x18, 0x04, 0x21, + 0xA0, 0x10, 0xD1, 0x1C, 0xDD, 0x0F, 0x2B, 0x0B, 0x31, 0x11, 0x07, 0xFA, + 0xD8, 0x0D, 0xF2, 0xF9, 0xFC, 0x06, 0xBB, 0x02, 0x70, 0x04, 0xAC, 0x06, + 0x58, 0x08, 0xFB, 0x0E, 0x0A, 0x08, 0x50, 0x18, 0x7D, 0xFF, 0xF7, 0x16, + 0x8B, 0xF7, 0xC1, 0x10, 0x55, 0xF4, 0xE6, 0x09, 0xCC, 0xFB, 0xBD, 0x02, + 0xE6, 0x0E, 0x63, 0x06, 0x0F, 0x22, 0xE7, 0x18, 0x2E, 0x2C, 0x83, 0x27, + 0xA9, 0x2F, 0xFE, 0x2B, 0x1B, 0x29, 0x59, 0x2D, 0xA4, 0x23, 0x84, 0x31, + 0xA7, 0x22, 0xFC, 0x32, 0x74, 0x1D, 0xAC, 0x2A, 0xAE, 0x1C, 0x30, 0x20, + 0xE4, 0x22, 0xED, 0x12, 0xDE, 0x23, 0xA8, 0x04, 0x53, 0x19, 0x64, 0x01, + 0xD1, 0x08, 0xC2, 0x03, 0x82, 0xFC, 0x10, 0x0A, 0x82, 0x00, 0x7F, 0x15, + 0x6E, 0x15, 0xAA, 0x1B, 0x95, 0x26, 0xB6, 0x1D, 0xB0, 0x22, 0x7A, 0x1E, + 0x6C, 0x10, 0xD8, 0x15, 0xAF, 0xFE, 0xC9, 0x08, 0x5A, 0x01, 0xFE, 0x03, + 0x86, 0x0D, 0xB6, 0x03, 0x0D, 0x17, 0xA5, 0x0A, 0x89, 0x19, 0x1E, 0x14, + 0xAE, 0x0B, 0x4B, 0x19, 0x76, 0xF9, 0x04, 0x21, 0xB4, 0xED, 0xCD, 0x1C, + 0xE3, 0xEA, 0xDD, 0x07, 0x74, 0xF0, 0x77, 0xF3, 0xF5, 0x02, 0xC5, 0xE9, + 0x7A, 0x18, 0x10, 0xE9, 0x85, 0x19, 0xBC, 0xE5, 0x72, 0x07, 0xB5, 0xE0, + 0x50, 0xFB, 0x50, 0xE4, 0xCF, 0xF8, 0x24, 0xEF, 0x6F, 0xF1, 0xCE, 0xF5, + 0x07, 0xE9, 0x6D, 0xF3, 0xFD, 0xF1, 0x32, 0xF0, 0x30, 0xFD, 0x60, 0xE6, + 0xF1, 0xFD, 0xEF, 0xD8, 0xFF, 0xF0, 0x6D, 0xD6, 0x69, 0xD9, 0xD1, 0xD9, + 0x90, 0xCB, 0x2B, 0xDE, 0xE1, 0xD3, 0x31, 0xEA, 0xDF, 0xE8, 0x72, 0xF5, + 0xD2, 0xF1, 0xCF, 0xF1, 0xF7, 0xEB, 0x4A, 0xE7, 0xB6, 0xE4, 0xD2, 0xDE, + 0xB6, 0xDC, 0xE8, 0xD5, 0x06, 0xD6, 0xFF, 0xD1, 0x60, 0xD6, 0x49, 0xD3, + 0xF1, 0xD3, 0xEE, 0xD0, 0xB1, 0xCD, 0x13, 0xD0, 0x07, 0xCE, 0x29, 0xDA, + 0x39, 0xD6, 0x2D, 0xE8, 0x68, 0xCD, 0x83, 0xE0, 0xCE, 0xB9, 0x25, 0xCB, + 0xC7, 0xBD, 0xAD, 0xC4, 0x9B, 0xCC, 0x0A, 0xD0, 0x10, 0xD3, 0x10, 0xDF, + 0x91, 0xDB, 0x1A, 0xE4, 0x49, 0xE2, 0xEA, 0xE3, 0xCB, 0xD8, 0xE6, 0xE8, + 0x7E, 0xD3, 0x4F, 0xF1, 0xD7, 0xE2, 0xBA, 0xF3, 0x9E, 0xED, 0x2A, 0xE6, + 0xAE, 0xE2, 0x7A, 0xCE, 0xA5, 0xDF, 0xF3, 0xC5, 0x98, 0xF3, 0x02, 0xD2, + 0x15, 0xFA, 0xA5, 0xD6, 0x4C, 0xE4, 0x6E, 0xCC, 0x41, 0xC6, 0xE4, 0xC7, + 0x22, 0xB9, 0x19, 0xD0, 0x15, 0xC7, 0xB5, 0xD9, 0xD3, 0xDD, 0x1B, 0xDA, + 0x6B, 0xEA, 0xB8, 0xD2, 0x77, 0xEE, 0xA7, 0xCE, 0x60, 0xF2, 0x51, 0xD5, + 0x56, 0x00, 0x26, 0xDD, 0x69, 0x0E, 0x21, 0xDE, 0x4C, 0x0C, 0x77, 0xE4, + 0xF5, 0x02, 0x53, 0xF6, 0xEA, 0xFD, 0x64, 0x03, 0x65, 0xF5, 0x40, 0xFD, + 0x62, 0xEC, 0x2E, 0xF0, 0xC9, 0xE7, 0x01, 0xE9, 0xF2, 0xE5, 0x5B, 0xE6, + 0x7D, 0xEC, 0x94, 0xE6, 0x69, 0xF5, 0x68, 0xEA, 0x79, 0xF5, 0x6B, 0xEF, + 0x78, 0xEC, 0x4D, 0xF0, 0x3D, 0xE9, 0x11, 0xF5, 0x9B, 0xE9, 0x52, 0xFD, + 0x99, 0xE8, 0xAE, 0xFE, 0x6C, 0xEA, 0x9A, 0xFF, 0x8A, 0xEA, 0x67, 0x06, + 0x3E, 0xE5, 0x5C, 0x0D, 0xF0, 0xDE, 0x02, 0x0B, 0x30, 0xDF, 0xAF, 0x02, + 0xA8, 0xE2, 0x37, 0xFA, 0xB8, 0xE7, 0x03, 0xF6, 0xF6, 0xEC, 0x9F, 0xF3, + 0x3C, 0xEC, 0x59, 0xEF, 0x37, 0xEF, 0x94, 0xED, 0x37, 0xFB, 0xB3, 0xE9, + 0x71, 0xFF, 0x41, 0xDF, 0x36, 0xF9, 0x30, 0xD1, 0x12, 0xF8, 0xCA, 0xCA, + 0x31, 0xFE, 0x2F, 0xD2, 0x99, 0x03, 0xAF, 0xD8, 0xFA, 0x05, 0xF6, 0xD4, + 0xE8, 0x05, 0x7A, 0xD3, 0x71, 0xFF, 0xB4, 0xD6, 0x56, 0xF2, 0xDC, 0xD9, + 0x38, 0xEC, 0x2D, 0xE1, 0x72, 0xF1, 0x63, 0xED, 0xD0, 0xF9, 0xFD, 0xF4, + 0x07, 0x0B, 0x91, 0xFA, 0x85, 0x1B, 0x3F, 0x05, 0xA9, 0x16, 0xC6, 0x02, + 0x9B, 0x0C, 0x78, 0xF7, 0x96, 0x0F, 0xDF, 0xFA, 0x38, 0x13, 0x83, 0x03, + 0xF9, 0x09, 0x5B, 0xFF, 0x9A, 0xFC, 0xA2, 0xF3, 0xDF, 0xFA, 0xCC, 0xEF, + 0xE5, 0xF6, 0x2F, 0xF8, 0x40, 0xEA, 0xC0, 0xFA, 0x66, 0xE6, 0xC1, 0xEE, + 0xE3, 0xE9, 0x77, 0xE8, 0xBD, 0xEF, 0x9E, 0xED, 0x9C, 0xF7, 0xF0, 0xEF, + 0xA4, 0xF7, 0xD0, 0xF0, 0x41, 0xF2, 0xC0, 0xF5, 0xC9, 0xF3, 0x2E, 0xF3, + 0x56, 0x06, 0x51, 0xF3, 0x46, 0x15, 0x44, 0xF7, 0x0E, 0x0A, 0x29, 0xEF, + 0x0A, 0xFA, 0xE5, 0xE8, 0xB7, 0xF0, 0x9A, 0xF0, 0x85, 0xE3, 0x83, 0xF6, + 0xB3, 0xDC, 0x9E, 0xF7, 0xFD, 0xE0, 0x4B, 0xFA, 0xED, 0xE1, 0x60, 0xF5, + 0x2E, 0xE2, 0xD2, 0xEB, 0x32, 0xE9, 0xCC, 0xEB, 0xC9, 0xF7, 0x01, 0xF2, + 0xA2, 0xFB, 0xD5, 0xF0, 0x25, 0xEF, 0x5D, 0xED, 0x49, 0xED, 0x5D, 0xF0, + 0x4F, 0xEE, 0xD6, 0xF5, 0xC4, 0xE1, 0xFD, 0xF6, 0x87, 0xDB, 0xA1, 0xF4, + 0xDC, 0xDC, 0x00, 0xE9, 0x2F, 0xDD, 0x5C, 0xDD, 0xC6, 0xE3, 0xF4, 0xE5, + 0x38, 0xE9, 0x39, 0xF0, 0xB0, 0xE9, 0x71, 0xEC, 0xF9, 0xEB, 0xF5, 0xE1, + 0x18, 0xF9, 0xF5, 0xDB, 0x84, 0x0A, 0x55, 0xE1, 0x06, 0x0E, 0x80, 0xEA, + 0x40, 0x06, 0x62, 0xEA, 0xDB, 0xFB, 0xDC, 0xE0, 0x92, 0xF3, 0xA6, 0xDC, + 0x4C, 0xED, 0x52, 0xDB, 0xC4, 0xE6, 0x49, 0xD6, 0x09, 0xE4, 0x1D, 0xD8, + 0x9B, 0xED, 0x87, 0xE1, 0xA9, 0xF6, 0x3B, 0xEF, 0x23, 0xF2, 0xD0, 0x00, + 0x17, 0xED, 0xB1, 0x11, 0x3C, 0xEC, 0x02, 0x1A, 0xDE, 0xEE, 0x69, 0x1A, + 0xBE, 0xF8, 0xBD, 0x1B, 0x27, 0xFE, 0x47, 0x19, 0x8A, 0x00, 0x13, 0x12, + 0x2B, 0x02, 0x4E, 0x0C, 0x37, 0x08, 0xEE, 0x0B, 0xD8, 0x12, 0x9C, 0x0A, + 0x99, 0x10, 0x30, 0x08, 0x86, 0x08, 0xE8, 0x0B, 0x46, 0x00, 0xF0, 0x08, + 0x90, 0xFA, 0x0E, 0xFF, 0x9A, 0xFD, 0xAD, 0xFB, 0xED, 0x05, 0x1D, 0xFD, + 0x55, 0x0F, 0xEC, 0x01, 0x60, 0x0F, 0xCC, 0x0B, 0x42, 0x14, 0x2C, 0x1A, + 0xCD, 0x23, 0x13, 0x23, 0x1C, 0x23, 0x46, 0x1F, 0xE0, 0x1D, 0x5E, 0x16, + 0x6F, 0x26, 0xDA, 0x0E, 0xBB, 0x33, 0x40, 0x0F, 0x69, 0x37, 0xA7, 0x0F, + 0x6C, 0x30, 0x7E, 0x0A, 0x90, 0x26, 0xEB, 0x0D, 0x21, 0x1C, 0x23, 0x19, + 0xDA, 0x1A, 0xFD, 0x1E, 0xA6, 0x29, 0xAA, 0x27, 0xB1, 0x36, 0xD5, 0x30, + 0x86, 0x2F, 0x42, 0x2D, 0xAE, 0x24, 0x35, 0x27, 0x69, 0x24, 0x1E, 0x25, + 0x37, 0x1C, 0x7C, 0x1A, 0x2E, 0x15, 0xCC, 0x10, 0xB0, 0x1C, 0xED, 0x1A, + 0x1F, 0x2A, 0xAC, 0x33, 0x5E, 0x32, 0x27, 0x45, 0x92, 0x2D, 0x69, 0x49, + 0x1D, 0x22, 0xBA, 0x46, 0xB3, 0x0C, 0x5C, 0x38, 0x8A, 0xFE, 0xB7, 0x2A, + 0x26, 0x0A, 0xF7, 0x2C, 0x4C, 0x19, 0x47, 0x38, 0x14, 0x23, 0x79, 0x3E, + 0x97, 0x2E, 0x34, 0x42, 0x96, 0x2F, 0xD7, 0x42, 0x91, 0x28, 0x37, 0x38, + 0x98, 0x25, 0xE0, 0x28, 0x32, 0x27, 0x1A, 0x1F, 0x7A, 0x2A, 0x1D, 0x1B, + 0xAD, 0x2D, 0xCA, 0x1C, 0xCA, 0x39, 0xE6, 0x2B, 0x67, 0x40, 0x14, 0x32, + 0x40, 0x39, 0x71, 0x22, 0xC1, 0x33, 0x79, 0x1E, 0x87, 0x2F, 0x24, 0x31, + 0xF6, 0x32, 0x8F, 0x46, 0x9F, 0x39, 0xD7, 0x4E, 0xD4, 0x3D, 0x3F, 0x48, + 0xF5, 0x46, 0x4D, 0x3F, 0x1C, 0x47, 0x00, 0x3B, 0x4B, 0x41, 0xEE, 0x3B, + 0x6B, 0x40, 0xD6, 0x39, 0x52, 0x36, 0x79, 0x31, 0x5D, 0x25, 0x8B, 0x30, + 0x74, 0x26, 0x1E, 0x3A, 0x26, 0x2D, 0xAB, 0x38, 0x78, 0x1B, 0x48, 0x22, + 0xAE, 0x07, 0x68, 0x15, 0x02, 0xFB, 0x82, 0x15, 0x4A, 0xF8, 0xDE, 0x13, + 0xBF, 0x05, 0x82, 0x14, 0x64, 0x11, 0xBA, 0x17, 0x4B, 0x12, 0x95, 0x1E, + 0xFE, 0x04, 0x6B, 0x22, 0x12, 0xFF, 0xFE, 0x1C, 0x29, 0x04, 0x4A, 0x0E, + 0x89, 0x04, 0x86, 0xFA, 0xB3, 0x07, 0x31, 0xEF, 0x39, 0x09, 0x39, 0xF3, + 0xC2, 0x02, 0x38, 0xF9, 0x4C, 0xF9, 0xF4, 0xF8, 0xD6, 0xF1, 0x36, 0xF9, + 0xFE, 0xE9, 0xA2, 0xF8, 0x64, 0xE6, 0x3D, 0xF7, 0x2F, 0xE8, 0x5C, 0xF1, + 0x2E, 0xE9, 0xE4, 0xE6, 0xBA, 0xF4, 0xEC, 0xE2, 0x06, 0x02, 0x5D, 0xE2, + 0x37, 0x01, 0xEF, 0xDB, 0x08, 0x01, 0xA5, 0xD3, 0xBF, 0x02, 0x48, 0xD5, + 0x85, 0xFA, 0x16, 0xDD, 0x48, 0xED, 0xBB, 0xE5, 0x64, 0xE6, 0x49, 0xF2, + 0x18, 0xEC, 0x72, 0xFC, 0x50, 0xF6, 0xEA, 0xFF, 0x9A, 0xF2, 0xC4, 0xFB, + 0xA8, 0xE3, 0x8D, 0xFA, 0x5B, 0xDA, 0x27, 0x05, 0xB4, 0xE0, 0x3D, 0x0A, + 0x6A, 0xF6, 0x7F, 0x08, 0xC6, 0x05, 0x28, 0x0C, 0xED, 0x05, 0xB2, 0x0D, + 0xEB, 0x04, 0x85, 0x0F, 0x65, 0xFB, 0x4E, 0x0F, 0x98, 0xEA, 0x90, 0x06, + 0x85, 0xE7, 0xC7, 0xFD, 0xCB, 0xF0, 0x10, 0xFB, 0x11, 0xFA, 0xA6, 0xFC, + 0x00, 0xFD, 0xC0, 0xFC, 0x35, 0xFA, 0x67, 0xFA, 0x1E, 0xFA, 0x55, 0xFE, + 0xEC, 0xF9, 0x00, 0x08, 0x29, 0xF9, 0x06, 0x09, 0xCC, 0x02, 0x62, 0x06, + 0xF0, 0x0F, 0x8A, 0x08, 0x00, 0x21, 0xBA, 0x0E, 0xF0, 0x2B, 0x1B, 0x17, + 0xDA, 0x1F, 0x10, 0x19, 0x9B, 0x0B, 0x19, 0x13, 0xB7, 0xFF, 0x63, 0x0A, + 0x24, 0xFF, 0x2D, 0x01, 0xAE, 0xFE, 0x91, 0x01, 0x92, 0xFD, 0x0A, 0x06, + 0x3A, 0xFF, 0x5F, 0x03, 0xDE, 0xFB, 0x8E, 0x06, 0x46, 0xF6, 0x4B, 0x0F, + 0x91, 0xF6, 0xC3, 0x14, 0x46, 0xFB, 0xB6, 0x16, 0x0B, 0xFE, 0xE0, 0x19, + 0x5D, 0xFD, 0x9A, 0x1A, 0x72, 0x06, 0x60, 0x15, 0x3A, 0x13, 0x9D, 0x0E, + 0xD5, 0x0F, 0x9F, 0x01, 0x8F, 0x0E, 0x19, 0xF6, 0x51, 0x17, 0xA7, 0xF3, + 0xBC, 0x17, 0x5A, 0xF7, 0x9E, 0x0F, 0xF9, 0xFE, 0x5A, 0x02, 0x9E, 0x00, + 0x1B, 0xF8, 0x5A, 0x00, 0x17, 0xFA, 0x51, 0x05, 0x88, 0x03, 0x1B, 0x07, + 0x1C, 0x16, 0x19, 0x06, 0xF3, 0x1D, 0x5F, 0x01, 0xE5, 0x0C, 0xA2, 0xF7, + 0x11, 0x02, 0x08, 0xEC, 0xFC, 0x02, 0x85, 0xE3, 0xEC, 0xFC, 0xBC, 0xE5, + 0xB2, 0xF7, 0x35, 0xF2, 0xE0, 0xF7, 0xBC, 0xFA, 0xDF, 0xF8, 0xFA, 0xFF, + 0x71, 0xF4, 0x06, 0x08, 0x43, 0xE8, 0x9B, 0x0A, 0x62, 0xE2, 0xBF, 0x05, + 0x44, 0xE3, 0x9F, 0x02, 0x98, 0xEC, 0xA2, 0x0B, 0x19, 0xFB, 0x88, 0x16, + 0x9D, 0xFB, 0xA6, 0x16, 0x84, 0xF5, 0x9B, 0x16, 0x09, 0xEE, 0x1E, 0x11, + 0x1E, 0xE9, 0x9A, 0x01, 0x64, 0xEE, 0x77, 0xFA, 0x3D, 0xF0, 0x29, 0xFC, + 0xB9, 0xEB, 0xB9, 0xF6, 0x09, 0xE8, 0x7D, 0xE3, 0xB9, 0xEF, 0x47, 0xD6, + 0x2E, 0xF9, 0x65, 0xD5, 0x6F, 0xF6, 0xD1, 0xD6, 0x05, 0xF9, 0xAC, 0xDE, + 0x54, 0x02, 0xF0, 0xE8, 0x71, 0x0C, 0x46, 0xEF, 0x07, 0x14, 0xEE, 0xF5, + 0x34, 0x10, 0x2A, 0xF9, 0xA6, 0x06, 0x3C, 0xF1, 0xA0, 0x01, 0xB4, 0xE6, + 0x84, 0x02, 0xEC, 0xE7, 0xEC, 0x06, 0x83, 0xF2, 0x6D, 0x06, 0x84, 0xF6, + 0xD8, 0xFC, 0x9C, 0xF4, 0xC0, 0xF9, 0x31, 0xF8, 0xA1, 0xF8, 0x89, 0xFC, + 0x23, 0xEB, 0xA8, 0xF9, 0xE9, 0xE2, 0x80, 0xF5, 0xC8, 0xE4, 0x4D, 0xF2, + 0x16, 0xE7, 0xE4, 0xED, 0xCB, 0xE7, 0xB6, 0xEC, 0x7B, 0xE0, 0x83, 0xEF, + 0x05, 0xD4, 0xC3, 0xF1, 0xBE, 0xCD, 0x5B, 0xF6, 0x2B, 0xD6, 0x8D, 0xF9, + 0x15, 0xEC, 0x81, 0xF2, 0x2A, 0xFB, 0x1D, 0xE3, 0xCD, 0xF9, 0x63, 0xD8, + 0xA5, 0xEC, 0xC1, 0xD7, 0xB8, 0xDD, 0xBA, 0xDD, 0x9C, 0xDD, 0x23, 0xE8, + 0xC0, 0xE2, 0x44, 0xF0, 0xD5, 0xDB, 0xAE, 0xF7, 0x7E, 0xD5, 0x8F, 0xFD, + 0xDB, 0xDB, 0xA0, 0xFC, 0x52, 0xE6, 0x2C, 0xF2, 0x7D, 0xEA, 0x5D, 0xE0, + 0x98, 0xEB, 0x73, 0xD7, 0x60, 0xF2, 0x71, 0xDC, 0xFC, 0xF7, 0xCE, 0xE1, + 0x4E, 0xF3, 0x7B, 0xE4, 0x56, 0xE5, 0xF3, 0xE4, 0xBE, 0xDB, 0x47, 0xE5, + 0x98, 0xE0, 0xF5, 0xE8, 0xF4, 0xF0, 0x48, 0xEF, 0x4F, 0x01, 0x12, 0xF3, + 0x9F, 0x01, 0xBB, 0xE9, 0x22, 0xF4, 0x47, 0xD9, 0x8F, 0xEC, 0x7A, 0xD7, + 0xB8, 0xEE, 0x72, 0xE4, 0x71, 0xF2, 0x11, 0xF0, 0x40, 0xF6, 0xED, 0xF8, + 0x3E, 0xFA, 0xD0, 0xFF, 0x80, 0xFA, 0xE4, 0xFE, 0x12, 0xFD, 0xBC, 0xFA, + 0xC3, 0xFA, 0x29, 0xF2, 0x84, 0xF2, 0x22, 0xE3, 0xDC, 0xEF, 0xD8, 0xDB, + 0xA0, 0xF0, 0xC9, 0xE5, 0xCA, 0xF2, 0xBD, 0xF8, 0x43, 0xF2, 0x8B, 0xFF, + 0x6C, 0xEF, 0x86, 0xF5, 0x5D, 0xED, 0x80, 0xEE, 0x72, 0xEE, 0x3A, 0xF0, + 0xAB, 0xF8, 0x36, 0xFA, 0x39, 0x0E, 0x14, 0x09, 0x85, 0x1C, 0xD7, 0x0B, + 0xC6, 0x1E, 0xB1, 0x07, 0xD2, 0x23, 0x74, 0x09, 0x18, 0x22, 0xF5, 0x0B, + 0xFE, 0x16, 0x92, 0x09, 0x3E, 0x0C, 0x54, 0x06, 0x42, 0x04, 0xD5, 0x0E, + 0xA4, 0x01, 0xAB, 0x1B, 0x2A, 0x06, 0x32, 0x1E, 0x7B, 0x0F, 0xB1, 0x17, + 0x3B, 0x12, 0xA3, 0x0D, 0xAD, 0x08, 0x67, 0x03, 0x53, 0xFD, 0x15, 0x02, + 0xAA, 0xFE, 0x5A, 0x0C, 0x39, 0x08, 0x7A, 0x14, 0x65, 0x13, 0xF0, 0x18, + 0x43, 0x24, 0xCF, 0x1C, 0x9D, 0x2B, 0x40, 0x1A, 0xE5, 0x26, 0xA9, 0x0F, + 0x34, 0x24, 0xB3, 0x09, 0xAA, 0x16, 0xAE, 0x0D, 0x1E, 0x02, 0x2F, 0x13, + 0xF2, 0xFC, 0x2B, 0x1B, 0xC8, 0x03, 0xC5, 0x26, 0xBD, 0x07, 0x67, 0x27, + 0x5B, 0x06, 0xF1, 0x19, 0x13, 0x0C, 0x0B, 0x0F, 0xCF, 0x18, 0xFD, 0x0C, + 0x82, 0x1A, 0x16, 0x04, 0xCD, 0x19, 0xAA, 0xF8, 0xF7, 0x1E, 0xBE, 0xFC, + 0x26, 0x1C, 0x08, 0x05, 0xCE, 0x16, 0x39, 0x08, 0xD9, 0x10, 0x53, 0x00, + 0xC8, 0x07, 0x43, 0xF3, 0xD3, 0x04, 0x4A, 0xF8, 0xC4, 0x03, 0x95, 0x0A, + 0x33, 0x01, 0xEB, 0x15, 0x3F, 0xFF, 0x5F, 0x15, 0x8A, 0xFC, 0x07, 0x10, + 0xB2, 0xF7, 0x5E, 0x0A, 0xBC, 0xF3, 0x3C, 0x05, 0xA6, 0xF8, 0xF3, 0x00, + 0x56, 0x08, 0x19, 0xFF, 0x1D, 0x12, 0xAF, 0x00, 0x86, 0x04, 0xE3, 0x03, + 0x0C, 0xF2, 0xC1, 0x06, 0xF5, 0xEB, 0xB6, 0x00, 0x46, 0xEC, 0x41, 0xF2, + 0x90, 0xF1, 0xDC, 0xED, 0xC8, 0xF2, 0x2C, 0xF2, 0x52, 0xEB, 0x18, 0xF5, + 0x15, 0xE2, 0xE2, 0xF4, 0x37, 0xDE, 0x7D, 0xF0, 0x7C, 0xE5, 0x28, 0xED, + 0x5D, 0xF2, 0xB2, 0xEA, 0x22, 0x02, 0xCB, 0xEC, 0xF2, 0x04, 0xDF, 0xEF, + 0x0C, 0xFF, 0xB0, 0xED, 0xA4, 0x01, 0x83, 0xEC, 0x2B, 0x02, 0xE9, 0xE8, + 0xFD, 0xFB, 0x45, 0xDF, 0x48, 0xF0, 0xB0, 0xD1, 0xAF, 0xE8, 0xAD, 0xC6, + 0x22, 0xE6, 0x0C, 0xC5, 0x36, 0xE4, 0xCA, 0xCB, 0x71, 0xE5, 0xA9, 0xD4, + 0xC6, 0xE3, 0x20, 0xD6, 0x0C, 0xE0, 0x85, 0xCF, 0xA4, 0xDE, 0x63, 0xCD, + 0xFE, 0xD9, 0x0E, 0xD1, 0x43, 0xD0, 0x94, 0xD0, 0x50, 0xCE, 0xB7, 0xCA, + 0xF8, 0xE0, 0x27, 0xC9, 0xFD, 0xF5, 0xBA, 0xD3, 0xBE, 0xF6, 0x24, 0xE1, + 0x14, 0xE2, 0x4F, 0xE4, 0x0F, 0xCD, 0xC7, 0xE0, 0x7C, 0xCA, 0xD7, 0xE0, + 0xFB, 0xD7, 0x46, 0xE7, 0x41, 0xEB, 0xA0, 0xED, 0x64, 0xED, 0x4E, 0xF1, + 0x16, 0xDC, 0x35, 0xF5, 0xC3, 0xD6, 0x27, 0xFD, 0xF4, 0xE3, 0x52, 0xFE, + 0xC9, 0xF1, 0xDC, 0xF2, 0xA2, 0xF9, 0xF4, 0xE9, 0xAC, 0xFB, 0x40, 0xE3, + 0x6F, 0xFD, 0x7A, 0xDC, 0x2C, 0x02, 0x2A, 0xDB, 0xC5, 0x02, 0xD8, 0xDE, + 0x89, 0xFD, 0x28, 0xE4, 0xCC, 0xFF, 0x7D, 0xEA, 0x62, 0x0E, 0x9D, 0xF6, + 0xD3, 0x13, 0xBB, 0x00, 0x61, 0x05, 0xE3, 0xFF, 0xCC, 0xF1, 0xA3, 0xFD, + 0xB7, 0xE6, 0x6D, 0xFF, 0xE7, 0xED, 0xB9, 0x02, 0xC4, 0xF8, 0x98, 0x05, + 0x49, 0xFB, 0x84, 0x09, 0x17, 0xFC, 0x05, 0x0D, 0x0A, 0xF6, 0x16, 0x0B, + 0xF0, 0xF0, 0x04, 0x09, 0xA6, 0xF4, 0x69, 0x07, 0x2D, 0xF4, 0xD0, 0x00, + 0xF5, 0xF2, 0x42, 0xFC, 0x4F, 0xF7, 0xEB, 0xFE, 0x98, 0xF7, 0x87, 0x07, + 0x98, 0xFA, 0xA8, 0x0C, 0x33, 0x01, 0xBA, 0x08, 0x91, 0xFF, 0x3F, 0x08, + 0x08, 0xFE, 0xB7, 0x13, 0xD3, 0x02, 0xFB, 0x21, 0x74, 0x0C, 0xE5, 0x28, + 0xEC, 0x0F, 0x42, 0x27, 0x07, 0x0B, 0xD4, 0x19, 0xAD, 0x10, 0x87, 0x09, + 0xE0, 0x18, 0x42, 0xFF, 0x1B, 0x17, 0x68, 0xF9, 0xEB, 0x14, 0x98, 0xFF, + 0xCA, 0x0E, 0x81, 0x08, 0x75, 0x0C, 0xE4, 0x07, 0x53, 0x19, 0x3E, 0x04, + 0x36, 0x1D, 0xFD, 0xFE, 0x26, 0x0E, 0x54, 0xFB, 0x61, 0x00, 0xFF, 0xFF, + 0x08, 0x01, 0x6E, 0x09, 0x27, 0x0B, 0x3D, 0x12, 0x12, 0x11, 0x87, 0x12, + 0x60, 0x14, 0xC6, 0x0A, 0x1B, 0x1A, 0x7F, 0x07, 0xAD, 0x18, 0xB5, 0x02, + 0x6D, 0x1A, 0x37, 0xFD, 0x3F, 0x22, 0x70, 0xFF, 0x6C, 0x17, 0xEB, 0xFE, + 0x31, 0xFC, 0x75, 0xF8, 0x9F, 0xED, 0xE7, 0xFC, 0x71, 0xF0, 0xF1, 0x0A, + 0xFA, 0xF3, 0x7D, 0x0E, 0x15, 0xF9, 0x53, 0x0F, 0xFB, 0xFF, 0xAE, 0x13, + 0xC8, 0x05, 0x41, 0x15, 0xA5, 0x08, 0xE4, 0x0C, 0xE2, 0x05, 0x4F, 0xFE, + 0xB8, 0x01, 0x3A, 0xFB, 0x62, 0x03, 0x80, 0xFD, 0xA8, 0x0F, 0x08, 0x06, + 0x71, 0x1A, 0x49, 0x17, 0x9A, 0x15, 0x7D, 0x1D, 0x1C, 0x06, 0x3E, 0x18, + 0xB9, 0xF6, 0x11, 0x15, 0x59, 0xEE, 0x2D, 0x14, 0xFC, 0xF0, 0x6F, 0x13, + 0x6A, 0xF9, 0x68, 0x17, 0xC0, 0xFC, 0xF4, 0x16, 0x53, 0xFE, 0xC3, 0x0B, + 0x15, 0x06, 0x70, 0x0B, 0x93, 0x07, 0x6E, 0x11, 0x47, 0xFF, 0x57, 0x0C, + 0xF7, 0xFB, 0x67, 0x07, 0xD6, 0xFC, 0xBA, 0x05, 0xEB, 0xFD, 0x5F, 0x02, + 0x96, 0x02, 0x1E, 0xF5, 0x50, 0x07, 0x93, 0xE0, 0x26, 0x05, 0x2E, 0xD3, + 0x54, 0xFB, 0x19, 0xD6, 0x2C, 0xF7, 0x1F, 0xEB, 0xB2, 0x01, 0x4D, 0xFC, + 0x3B, 0x11, 0xE4, 0x00, 0x91, 0x19, 0x16, 0x0A, 0xB8, 0x13, 0x9D, 0x12, + 0xCF, 0x04, 0xC9, 0x0D, 0x81, 0xFF, 0x3B, 0x07, 0xED, 0x04, 0x81, 0x03, + 0x5D, 0x05, 0xF9, 0xFA, 0x73, 0xFF, 0xA2, 0xF8, 0x90, 0xFB, 0xFA, 0x03, + 0x79, 0xF9, 0x6E, 0x0D, 0x76, 0xF4, 0xED, 0x0A, 0x7E, 0xEB, 0xEB, 0x00, + 0x39, 0xE8, 0xC2, 0xFA, 0x71, 0xF0, 0x8C, 0xFA, 0x6A, 0xFD, 0x62, 0xFD, + 0xC8, 0x0A, 0x30, 0x03, 0x90, 0x12, 0x65, 0x05, 0x9E, 0x11, 0x53, 0x04, + 0x02, 0x10, 0xB4, 0x07, 0x5B, 0x15, 0x9F, 0x10, 0x5D, 0x16, 0x02, 0x13, + 0x66, 0x14, 0x99, 0x13, 0x5C, 0x19, 0xD0, 0x1B, 0x0E, 0x19, 0x9B, 0x1A, + 0x67, 0x0C, 0x22, 0x0B, 0x24, 0x00, 0x38, 0xFF, 0x90, 0xFB, 0x79, 0x03, + 0xB8, 0xF9, 0xCC, 0x15, 0x83, 0xFB, 0xC8, 0x28, 0xE3, 0x05, 0xC1, 0x30, + 0x52, 0x16, 0xCF, 0x32, 0x84, 0x1E, 0xCA, 0x30, 0xD3, 0x1F, 0xBD, 0x27, + 0x39, 0x23, 0xC8, 0x21, 0x43, 0x21, 0x43, 0x22, 0x9E, 0x1E, 0x41, 0x2C, + 0x8B, 0x28, 0x6D, 0x3A, 0x1B, 0x32, 0xFA, 0x39, 0xC4, 0x30, 0x48, 0x2F, + 0x84, 0x2B, 0x70, 0x24, 0x3F, 0x21, 0xAC, 0x1E, 0x2B, 0x17, 0xC5, 0x1E, + 0x78, 0x14, 0x3E, 0x1E, 0x30, 0x21, 0x8B, 0x24, 0x2A, 0x33, 0x73, 0x2A, + 0x66, 0x3A, 0x44, 0x27, 0xB3, 0x35, 0xF9, 0x25, 0x28, 0x27, 0xBA, 0x25, + 0x30, 0x24, 0x81, 0x26, 0x5D, 0x30, 0x97, 0x2C, 0xF5, 0x39, 0x4C, 0x34, + 0xBD, 0x38, 0x31, 0x33, 0xF4, 0x30, 0x81, 0x26, 0x15, 0x2B, 0xD8, 0x19, + 0x82, 0x29, 0x48, 0x0F, 0xE3, 0x2F, 0xF0, 0x0F, 0x4B, 0x34, 0x93, 0x24, + 0x8D, 0x2B, 0xB3, 0x37, 0xB6, 0x25, 0x8C, 0x40, 0xFE, 0x22, 0x8E, 0x49, + 0x2E, 0x21, 0x8B, 0x52, 0x3D, 0x2A, 0x70, 0x55, 0x6A, 0x37, 0x78, 0x4A, + 0x26, 0x3A, 0x00, 0x37, 0xE8, 0x35, 0x11, 0x34, 0x51, 0x30, 0x67, 0x42, + 0x7E, 0x29, 0xC0, 0x46, 0x4D, 0x25, 0xAF, 0x39, 0xB9, 0x22, 0x6E, 0x2B, + 0xC1, 0x24, 0x94, 0x28, 0xBB, 0x23, 0x45, 0x2C, 0x4B, 0x18, 0xAE, 0x27, + 0x34, 0x11, 0x78, 0x1E, 0x4A, 0x0E, 0x6B, 0x19, 0xF4, 0x0C, 0x90, 0x19, + 0x36, 0x19, 0x84, 0x1E, 0xCD, 0x23, 0x27, 0x1A, 0xB8, 0x21, 0x2C, 0x0D, + 0x20, 0x1D, 0x5B, 0x06, 0x79, 0x1E, 0xAD, 0x02, 0xEC, 0x23, 0xD8, 0x00, + 0x1B, 0x1B, 0xD4, 0xFD, 0xDF, 0x02, 0x83, 0xF4, 0x31, 0xF0, 0x5E, 0xF0, + 0xC9, 0xE8, 0x53, 0xED, 0x12, 0xED, 0xFC, 0xEA, 0xAD, 0xF3, 0x36, 0xF2, + 0x79, 0xF1, 0x1B, 0xFB, 0x12, 0xED, 0x58, 0xFC, 0xCF, 0xED, 0x63, 0xF8, + 0xE8, 0xF0, 0x22, 0xF6, 0x81, 0xEB, 0xF4, 0xEE, 0xF4, 0xE7, 0x17, 0xE4, + 0x46, 0xF2, 0xB6, 0xE1, 0xAC, 0xF9, 0x11, 0xE7, 0x49, 0xF6, 0x60, 0xEE, + 0xF2, 0xED, 0x45, 0xF2, 0x1E, 0xE2, 0x98, 0xF1, 0x95, 0xD5, 0xA6, 0xEC, + 0xEB, 0xCD, 0x63, 0xE2, 0xD0, 0xD1, 0x88, 0xDD, 0x99, 0xD5, 0x61, 0xE1, + 0xE2, 0xCE, 0x7E, 0xDF, 0xC6, 0xD5, 0xEA, 0xDA, 0xC2, 0xE6, 0x6A, 0xDC, + 0xF9, 0xE7, 0x04, 0xDD, 0xAD, 0xE2, 0x29, 0xD2, 0x50, 0xE4, 0x83, 0xCE, + 0x26, 0xE9, 0x82, 0xD9, 0x68, 0xEE, 0x32, 0xD5, 0x4D, 0xEB, 0x85, 0xC9, + 0xE8, 0xDF, 0x44, 0xCD, 0xB9, 0xD4, 0x29, 0xD2, 0x7B, 0xCC, 0xD4, 0xCF, + 0xA7, 0xCC, 0x28, 0xD2, 0x00, 0xCD, 0x45, 0xD8, 0x63, 0xC9, 0x8F, 0xD9, + 0xA5, 0xCF, 0x35, 0xDF, 0x32, 0xDC, 0xBA, 0xEA, 0xAD, 0xE4, 0x48, 0xE7, + 0x66, 0xEB, 0xFE, 0xDE, 0x7F, 0xE8, 0x70, 0xDA, 0x94, 0xE3, 0xF4, 0xD6, + 0xAA, 0xE6, 0x0A, 0xDF, 0xAA, 0xE9, 0x6B, 0xE8, 0x0F, 0xEB, 0x85, 0xE9, + 0x03, 0xE8, 0xCD, 0xE7, 0x59, 0xE0, 0x51, 0xE8, 0xC6, 0xDB, 0x4D, 0xE4, + 0x3C, 0xDA, 0x4C, 0xDE, 0x8C, 0xD6, 0x28, 0xDD, 0xC8, 0xD7, 0x25, 0xDF, + 0x55, 0xE2, 0x91, 0xE9, 0x86, 0xF2, 0xD2, 0xF6, 0x16, 0x01, 0xD6, 0xF7, + 0x29, 0xFA, 0xF4, 0xED, 0x6F, 0xE6, 0xC3, 0xE6, 0x45, 0xE1, 0xDA, 0xE3, + 0xE3, 0xE7, 0x36, 0xE1, 0x9A, 0xEF, 0x16, 0xE4, 0x1F, 0xEF, 0x5D, 0xE9, + 0x3D, 0xE8, 0x54, 0xEC, 0xAD, 0xE2, 0xE5, 0xF3, 0xA0, 0xDD, 0xAC, 0xF9, + 0xC3, 0xE1, 0xB0, 0xFA, 0x2F, 0xEE, 0xD7, 0xF8, 0xF3, 0xFF, 0x02, 0xF8, + 0x71, 0x0B, 0x78, 0xF5, 0x75, 0x0A, 0xE1, 0xEE, 0x8F, 0x03, 0x4B, 0xEA, + 0x50, 0xF9, 0xE9, 0xE5, 0xA5, 0xF4, 0xF3, 0xE6, 0xCF, 0xF7, 0x85, 0xED, + 0x74, 0x01, 0x60, 0xF6, 0x7C, 0x03, 0x16, 0xFF, 0xC9, 0xF3, 0x05, 0xFE, + 0x43, 0xE8, 0xA8, 0xF3, 0xEF, 0xE5, 0x3D, 0xEA, 0xFA, 0xE8, 0x2E, 0xE9, + 0x14, 0xF4, 0xAE, 0xF5, 0x28, 0xFC, 0xE0, 0x05, 0x10, 0x00, 0x60, 0x0E, + 0xB4, 0x00, 0x22, 0x0F, 0x9C, 0x02, 0x96, 0x0A, 0x3E, 0x08, 0x03, 0x03, + 0x18, 0x07, 0x7C, 0xF2, 0x46, 0xFF, 0x53, 0xE2, 0x85, 0xF5, 0x24, 0xE0, + 0xA0, 0xF3, 0x85, 0xE5, 0x61, 0xFC, 0x2F, 0xEB, 0x14, 0xFE, 0x96, 0xE9, + 0xE6, 0xF7, 0x40, 0xE9, 0xE0, 0xEE, 0x85, 0xF5, 0xCD, 0xE9, 0xA3, 0x01, + 0x3B, 0xEE, 0xCA, 0x01, 0x6B, 0xF4, 0x52, 0xF9, 0xA0, 0xFE, 0xD7, 0xF6, + 0x74, 0x08, 0x78, 0xFD, 0xCA, 0x08, 0xCA, 0xFD, 0x48, 0xFF, 0xF6, 0xF7, + 0x1B, 0xF0, 0xD6, 0xF2, 0x3D, 0xE9, 0x20, 0xF2, 0x85, 0xF0, 0xD7, 0xF8, + 0x25, 0xFA, 0xAC, 0xF8, 0x2F, 0x00, 0xFA, 0xF2, 0x0A, 0x02, 0x92, 0xF9, + 0x28, 0xFC, 0xF4, 0x04, 0x80, 0xF0, 0x21, 0x08, 0xCF, 0xE4, 0xF9, 0x02, + 0xA9, 0xE0, 0xCE, 0xFE, 0x09, 0xE7, 0x8D, 0x00, 0x01, 0xF2, 0x58, 0x01, + 0x6B, 0xF9, 0xE6, 0xFC, 0x5B, 0xF5, 0xBD, 0xEE, 0x44, 0xEF, 0x62, 0xD8, + 0x82, 0xEF, 0xC6, 0xC8, 0x65, 0xEF, 0x00, 0xCC, 0xF6, 0xED, 0x98, 0xD7, + 0xCC, 0xF0, 0x81, 0xDE, 0xE1, 0xF9, 0x9F, 0xE6, 0xCA, 0xFF, 0x28, 0xEE, + 0x4C, 0xF7, 0x56, 0xEC, 0xB7, 0xED, 0xD2, 0xE2, 0x76, 0xEE, 0xA2, 0xDC, + 0x4A, 0xF0, 0xFB, 0xDD, 0xF4, 0xF7, 0x69, 0xE4, 0xBA, 0x03, 0x11, 0xEC, + 0x80, 0x0A, 0x4D, 0xED, 0x78, 0x09, 0x0A, 0xE8, 0x5F, 0xFA, 0x5B, 0xE4, + 0x55, 0xE7, 0x8C, 0xE4, 0x37, 0xDC, 0x42, 0xE9, 0x3A, 0xD7, 0x38, 0xF5, + 0xAD, 0xD2, 0xC2, 0xFD, 0xD2, 0xD0, 0x84, 0x01, 0xFF, 0xD3, 0x24, 0x05, + 0xE1, 0xD2, 0xB0, 0x02, 0x7D, 0xCF, 0xD4, 0xFD, 0x85, 0xD5, 0x65, 0x00, + 0x38, 0xE4, 0x31, 0x09, 0xF8, 0xF0, 0x9B, 0x0A, 0x81, 0xF9, 0x84, 0x05, + 0x69, 0xFD, 0x9E, 0xFA, 0xD7, 0xFC, 0x30, 0xE9, 0x7C, 0x04, 0xBB, 0xE4, + 0xCD, 0x0B, 0x28, 0xE8, 0x74, 0x04, 0xE0, 0xE3, 0x6C, 0xFE, 0xDF, 0xDE, + 0x25, 0x02, 0xDE, 0xDB, 0x10, 0x01, 0x22, 0xD9, 0x99, 0xFF, 0x5B, 0xE2, + 0x82, 0xFC, 0xE7, 0xEC, 0xFB, 0xF3, 0x6A, 0xEC, 0x50, 0xFB, 0xE9, 0xF1, + 0x26, 0x0A, 0xE7, 0xFB, 0x32, 0x14, 0x86, 0x03, 0xC1, 0x1A, 0x07, 0x08, + 0x77, 0x1B, 0x3F, 0x06, 0x31, 0x1C, 0xF4, 0x06, 0xE2, 0x21, 0x52, 0x16, + 0xB8, 0x26, 0x1C, 0x26, 0x02, 0x27, 0x19, 0x20, 0x20, 0x23, 0xA2, 0x16, + 0x0F, 0x16, 0xC6, 0x1D, 0x32, 0x0B, 0xA1, 0x29, 0x35, 0x08, 0x2F, 0x2B, + 0x35, 0x05, 0x7F, 0x25, 0x2B, 0x01, 0xFB, 0x1F, 0x3C, 0x06, 0xD1, 0x1F, + 0xB3, 0x1D, 0x8D, 0x2B, 0x9F, 0x2F, 0xC1, 0x2F, 0x2F, 0x31, 0xDE, 0x2D, + 0x1A, 0x33, 0x73, 0x3C, 0x31, 0x38, 0xB5, 0x4C, 0xC7, 0x3C, 0x39, 0x50, + 0x5D, 0x38, 0x50, 0x4E, 0xB6, 0x27, 0xA8, 0x43, 0x60, 0x15, 0xD4, 0x2E, + 0x33, 0x09, 0x1D, 0x20, 0xEE, 0x0A, 0x2B, 0x1B, 0x8D, 0x18, 0x01, 0x16, + 0x0F, 0x24, 0x8A, 0x16, 0x8E, 0x25, 0x03, 0x1E, 0xEA, 0x2A, 0x52, 0x24, + 0x7D, 0x38, 0x57, 0x2A, 0xBB, 0x34, 0x68, 0x2A, 0x50, 0x2C, 0x24, 0x29, + 0x3D, 0x39, 0xD8, 0x2F, 0xA6, 0x3C, 0xDA, 0x30, 0x35, 0x2F, 0x7C, 0x2D, + 0x33, 0x2C, 0x6B, 0x2A, 0x72, 0x28, 0x85, 0x1E, 0xBD, 0x1D, 0xBB, 0x17, + 0x50, 0x14, 0x52, 0x1B, 0xCB, 0x0B, 0xCB, 0x1A, 0x2F, 0x07, 0x1B, 0x15, + 0x75, 0x0B, 0x6F, 0x14, 0x0F, 0x0F, 0x7A, 0x11, 0xFF, 0x0F, 0x7E, 0x08, + 0x36, 0x0F, 0x7D, 0x01, 0xBD, 0x0B, 0xFF, 0x02, 0x76, 0x09, 0x4D, 0x0C, + 0x4C, 0x07, 0xA1, 0x0D, 0x42, 0x14, 0x71, 0x0A, 0x87, 0x23, 0xDC, 0x04, + 0x24, 0x19, 0xEA, 0xFA, 0x30, 0x07, 0xDD, 0xFD, 0x1C, 0x03, 0xA4, 0x0C, + 0xB9, 0x05, 0x14, 0x16, 0xE6, 0x08, 0xF5, 0x15, 0x11, 0x12, 0x09, 0x14, + 0x68, 0x19, 0x4C, 0x18, 0x59, 0x12, 0x3F, 0x17, 0x93, 0x02, 0x75, 0x08, + 0x24, 0xFD, 0x3A, 0x07, 0x55, 0xFB, 0xDA, 0x0E, 0xDA, 0xF5, 0x44, 0x07, + 0xA4, 0xFE, 0x25, 0x06, 0xF5, 0x0E, 0xEE, 0x0E, 0x19, 0x11, 0x42, 0x0B, + 0xD6, 0x06, 0xEB, 0x00, 0x7F, 0xF7, 0x81, 0xFD, 0x65, 0xE7, 0x2B, 0xF8, + 0xAD, 0xDA, 0xAE, 0xEC, 0xCD, 0xCB, 0x57, 0xE1, 0x8C, 0xC3, 0x54, 0xD6, + 0xF4, 0xCD, 0x20, 0xCC, 0xD2, 0xDD, 0x0B, 0xCA, 0x74, 0xE8, 0x7F, 0xCD, + 0x75, 0xE9, 0xB7, 0xC9, 0x35, 0xE4, 0xEE, 0xCB, 0x1B, 0xE3, 0x1D, 0xDC, + 0x2F, 0xE9, 0x16, 0xE7, 0x62, 0xF0, 0x4E, 0xEB, 0x46, 0xF1, 0x0F, 0xEE, + 0xFA, 0xF1, 0x2F, 0xEE, 0x6B, 0xF5, 0xA5, 0xEE, 0xB7, 0xF5, 0xF4, 0xEF, + 0x55, 0xEF, 0xA2, 0xEA, 0x51, 0xE5, 0x0D, 0xE0, 0xD2, 0xE1, 0x42, 0xDC, + 0x6E, 0xE2, 0xA4, 0xD8, 0x92, 0xE4, 0x91, 0xD2, 0xC6, 0xE8, 0x9E, 0xD4, + 0x17, 0xEB, 0xDA, 0xDB, 0xB0, 0xE8, 0xC4, 0xDD, 0x99, 0xE9, 0x7E, 0xE2, + 0x1B, 0xF6, 0x52, 0xF2, 0x8D, 0x02, 0x29, 0x03, 0xD3, 0x08, 0x16, 0x10, + 0xE7, 0x0A, 0xEA, 0x16, 0x69, 0x0A, 0x04, 0x1B, 0x5D, 0x09, 0x12, 0x23, + 0x3A, 0x06, 0xCE, 0x2B, 0xA4, 0xFD, 0x92, 0x2A, 0xB1, 0xF4, 0x5D, 0x1D, + 0x3B, 0xFA, 0x87, 0x13, 0x99, 0x0B, 0xE1, 0x10, 0x9C, 0x12, 0x28, 0x09, + 0x1D, 0x09, 0xC7, 0x00, 0xD7, 0xFF, 0xE1, 0x06, 0x24, 0xFA, 0xED, 0x0F, + 0x3B, 0xF9, 0xB5, 0x14, 0x4E, 0xFE, 0xE5, 0x1C, 0x34, 0x01, 0x79, 0x22, + 0x0A, 0x08, 0x9E, 0x27, 0x02, 0x0E, 0x1A, 0x28, 0xF7, 0x10, 0x4A, 0x20, + 0xCE, 0x13, 0x8B, 0x15, 0x8A, 0x07, 0x13, 0x05, 0x46, 0xF9, 0x38, 0xF9, + 0xB1, 0xFA, 0x6A, 0xF6, 0x20, 0xFB, 0xFA, 0xEE, 0x63, 0xFC, 0xC1, 0xE9, + 0xAA, 0x08, 0x4D, 0xEE, 0x0B, 0x0F, 0xFA, 0xF3, 0xED, 0x09, 0x58, 0xF8, + 0x37, 0x04, 0xA5, 0xF7, 0xDE, 0x01, 0xF2, 0xF5, 0x87, 0x01, 0x77, 0xFB, + 0x04, 0x05, 0xBA, 0x00, 0x38, 0x0C, 0xF9, 0x04, 0xF0, 0x0D, 0xA4, 0x0C, + 0xC9, 0xFE, 0x28, 0x06, 0x2E, 0xF2, 0xB9, 0xFB, 0xA8, 0xF2, 0xE0, 0xFF, + 0x0D, 0xF4, 0xEC, 0x00, 0xAA, 0xFF, 0x78, 0xFB, 0x0B, 0x13, 0x69, 0xFA, + 0x1D, 0x19, 0x2A, 0xFC, 0x41, 0x11, 0x7C, 0x01, 0x53, 0x01, 0x49, 0x06, + 0x50, 0xF4, 0x7F, 0x07, 0xE0, 0xF3, 0x03, 0x09, 0x8A, 0xF8, 0x38, 0x0C, + 0x19, 0x01, 0x27, 0x14, 0x75, 0x09, 0x81, 0x19, 0x56, 0x04, 0x21, 0x11, + 0xBB, 0x02, 0x66, 0x06, 0x55, 0x11, 0xE9, 0x01, 0x2D, 0x1E, 0xB3, 0xFD, + 0xB5, 0x23, 0x0C, 0xFC, 0xE0, 0x24, 0xBF, 0xFC, 0xDA, 0x1D, 0x3F, 0x00, + 0x97, 0x08, 0x69, 0x02, 0xAD, 0xF4, 0x44, 0xFC, 0x45, 0xF4, 0x0F, 0xF5, + 0x4A, 0xF9, 0xC5, 0xF0, 0x3D, 0x00, 0xE2, 0xF9, 0x2E, 0x0E, 0x43, 0x12, + 0xAA, 0x0E, 0x65, 0x1E, 0xE2, 0xFC, 0xDB, 0x19, 0x34, 0xEF, 0x2E, 0x11, + 0x0C, 0xF4, 0x4D, 0x0B, 0x04, 0xFC, 0x01, 0x09, 0x5D, 0xF6, 0x60, 0x05, + 0x9E, 0xEC, 0x0A, 0xFB, 0x05, 0xE8, 0xE7, 0xE9, 0xD5, 0xE1, 0x7F, 0xE0, + 0xB9, 0xD4, 0x7E, 0xDF, 0x2F, 0xC8, 0xC6, 0xDB, 0xEC, 0xC3, 0x33, 0xDC, + 0xEB, 0xCB, 0xF1, 0xE5, 0x64, 0xDF, 0x88, 0xF2, 0x28, 0xF6, 0x6A, 0x01, + 0x41, 0xFD, 0xA2, 0x0B, 0x7F, 0xF5, 0x02, 0x07, 0x5C, 0xF8, 0x6A, 0x03, + 0x53, 0x03, 0x48, 0x09, 0xD0, 0x03, 0x7A, 0x04, 0xB3, 0x02, 0x77, 0xF2, + 0x0E, 0x0B, 0x01, 0xE7, 0xF4, 0x09, 0xE8, 0xE2, 0x16, 0xFD, 0x65, 0xE3, + 0x81, 0xF2, 0xE2, 0xE4, 0x82, 0xE8, 0xE6, 0xDE, 0xB6, 0xDC, 0x41, 0xDB, + 0x06, 0xD4, 0x85, 0xE1, 0xB0, 0xDF, 0x2B, 0xF6, 0x14, 0xF2, 0xDB, 0x05, + 0xC7, 0xF5, 0x8F, 0x02, 0x53, 0xFD, 0x53, 0x07, 0xC7, 0x09, 0xA8, 0x12, + 0x7B, 0x0D, 0x4D, 0x11, 0x6D, 0x16, 0xAF, 0x10, 0xCA, 0x1C, 0x94, 0x0F, + 0xDF, 0x13, 0x19, 0x06, 0x96, 0x11, 0x3B, 0x00, 0xCE, 0x1A, 0x33, 0x03, + 0xA5, 0x1B, 0x7A, 0x05, 0x91, 0x0C, 0xDA, 0x02, 0x3F, 0x01, 0xB8, 0x05, + 0x51, 0x06, 0xC6, 0x0C, 0x01, 0x09, 0x54, 0x0D, 0xF8, 0x09, 0xC8, 0x0F, + 0x6E, 0x16, 0x5F, 0x1E, 0xF2, 0x24, 0x0A, 0x27, 0x9B, 0x2D, 0x00, 0x23, + 0xC2, 0x2F, 0x36, 0x1C, 0x2E, 0x2A, 0x9D, 0x13, 0x38, 0x19, 0x34, 0x0A, + 0xFD, 0x04, 0x6F, 0x00, 0xE8, 0xFC, 0x72, 0xFF, 0x43, 0xFB, 0x12, 0x07, + 0x94, 0xF9, 0x6A, 0x08, 0xD4, 0xFA, 0x99, 0x01, 0x62, 0xFE, 0x57, 0x01, + 0xDB, 0xFD, 0x30, 0x0C, 0x69, 0xFE, 0xD9, 0x12, 0xC5, 0x07, 0x46, 0x14, + 0x6E, 0x13, 0xA9, 0x1B, 0xF4, 0x1D, 0x12, 0x22, 0x8A, 0x21, 0x03, 0x1E, + 0x01, 0x1B, 0xFE, 0x16, 0x05, 0x0D, 0x9F, 0x0D, 0x5F, 0x02, 0xCA, 0x01, + 0x1F, 0x01, 0xD3, 0xFB, 0x50, 0x09, 0x5F, 0xFF, 0x83, 0x14, 0xD6, 0x02, + 0xB6, 0x16, 0xC7, 0x04, 0xC5, 0x0D, 0xDF, 0x0A, 0xA3, 0x04, 0xD8, 0x0F, + 0x88, 0x07, 0xE3, 0x13, 0xE3, 0x07, 0xE1, 0x11, 0x1F, 0x0E, 0x54, 0x16, + 0xD2, 0x24, 0x76, 0x27, 0x46, 0x34, 0xCC, 0x2E, 0xA5, 0x3A, 0xF4, 0x31, + 0x9C, 0x3C, 0x59, 0x32, 0x21, 0x3B, 0x0B, 0x27, 0x50, 0x3E, 0xF6, 0x20, + 0x32, 0x42, 0xF3, 0x1F, 0xD5, 0x3F, 0xE8, 0x1F, 0xAF, 0x2D, 0x3A, 0x1F, + 0x5C, 0x16, 0x8F, 0x23, 0xA9, 0x0B, 0x93, 0x2B, 0x24, 0x06, 0x6B, 0x24, + 0xE1, 0x07, 0x56, 0x1C, 0x12, 0x18, 0xDF, 0x1B, 0xB9, 0x24, 0x38, 0x1A, + 0x13, 0x24, 0x19, 0x1E, 0xE8, 0x24, 0x6E, 0x25, 0x5B, 0x24, 0xE8, 0x21, + 0x75, 0x1D, 0xE1, 0x17, 0xE2, 0x12, 0xC6, 0x13, 0x74, 0x09, 0x04, 0x14, + 0xA9, 0x05, 0x2F, 0x17, 0x8F, 0xFB, 0x4A, 0x10, 0x58, 0xEC, 0xB0, 0xF8, + 0x87, 0xE3, 0x0E, 0xEC, 0x9D, 0xD9, 0x6E, 0xE5, 0xA0, 0xC7, 0xEB, 0xD7, + 0x0B, 0xC0, 0x4D, 0xDB, 0x66, 0xCB, 0x49, 0xEE, 0x24, 0xDF, 0xBC, 0xF9, + 0x21, 0xF3, 0xED, 0xFE, 0xB1, 0x01, 0xD0, 0x08, 0x57, 0xFF, 0xC6, 0x05, + 0x3B, 0xEF, 0x93, 0xF3, 0x77, 0xE7, 0x51, 0xE7, 0x19, 0xED, 0xCC, 0xDB, + 0x12, 0xEF, 0x44, 0xD2, 0x2A, 0xE6, 0x6A, 0xD6, 0x27, 0xDA, 0xFB, 0xD7, + 0xBA, 0xCE, 0x41, 0xCB, 0xBA, 0xC6, 0x4F, 0xC0, 0x34, 0xCA, 0xCC, 0xBF, + 0x38, 0xD2, 0x23, 0xBF, 0x4C, 0xD5, 0xE1, 0xC2, 0x72, 0xD5, 0xBB, 0xC7, + 0x2C, 0xE1, 0xE2, 0xCA, 0xE3, 0xF1, 0x75, 0xD0, 0x45, 0xEE, 0x82, 0xC8, + 0xD4, 0xF8, 0x61, 0xC9, 0xB9, 0x08, 0x65, 0xDA, 0x61, 0xFD, 0x07, 0xE6, + 0xE1, 0xEF, 0x06, 0xEE, 0x50, 0xEC, 0x68, 0xF2, 0xA8 +}; diff --git a/src/lib/CherryUSB/demo/usb_host.c b/src/lib/CherryUSB/demo/usb_host.c new file mode 100644 index 000000000..89e78018b --- /dev/null +++ b/src/lib/CherryUSB/demo/usb_host.c @@ -0,0 +1,391 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_cdc_acm.h" +#include "usbh_hid.h" +#include "usbh_msc.h" +#include "usbh_video.h" +#include "usbh_audio.h" + +#ifndef CONFIG_TEST_USBH_CDC_ACM +#define CONFIG_TEST_USBH_CDC_ACM 1 +#endif +#ifndef TEST_USBH_CDC_SPEED +#define TEST_USBH_CDC_SPEED 0 +#endif +#ifndef CONFIG_TEST_USBH_HID +#define CONFIG_TEST_USBH_HID 1 +#endif +#ifndef CONFIG_TEST_USBH_MSC +#define CONFIG_TEST_USBH_MSC 1 +#endif +#ifndef TEST_USBH_MSC_FATFS +#define TEST_USBH_MSC_FATFS 0 +#endif +#ifndef TEST_USBH_MSC_FATFS_SPEED +#define TEST_USBH_MSC_FATFS_SPEED 0 +#endif +#ifndef CONFIG_TEST_USBH_AUDIO +#define CONFIG_TEST_USBH_AUDIO 0 +#endif +#ifndef CONFIG_TEST_USBH_VIDEO +#define CONFIG_TEST_USBH_VIDEO 0 +#endif + +#if defined(TEST_USBH_CDC_ECM) || defined(TEST_USBH_CDC_RNDIS) || defined(TEST_USBH_ASIX) || defined(TEST_USBH_RTL8152) +#error we have move those class implements into platform/none/usbh_lwip.c, and you should call tcpip_init(NULL, NULL) in your app +#endif + +#if CONFIG_TEST_USBH_CDC_ACM +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t cdc_buffer[4096]; + +#if TEST_USBH_CDC_SPEED +#define TEST_LEN (16 * 1024) +#define TEST_COUNT (10240) + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t cdc_speed_buffer[TEST_LEN]; +#endif + +void usbh_cdc_acm_callback(void *arg, int nbytes) +{ + //struct usbh_cdc_acm *cdc_acm_class = (struct usbh_cdc_acm *)arg; + + if (nbytes > 0) { + for (size_t i = 0; i < nbytes; i++) { + USB_LOG_RAW("0x%02x ", cdc_buffer[i]); + } + USB_LOG_RAW("nbytes:%d\r\n", (unsigned int)nbytes); + } +} + +static void usbh_cdc_acm_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + int ret; + struct usbh_cdc_acm *cdc_acm_class = (struct usbh_cdc_acm *)CONFIG_USB_OSAL_THREAD_GET_ARGV; + + /* test with only one buffer, if you have more cdc acm class, modify by yourself */ +#if TEST_USBH_CDC_SPEED + const uint32_t test_len[] = { 512, 1 * 1024, 2 * 1024, 4 * 1024, 8 * 1024, 16 * 1024 }; + + memset(cdc_speed_buffer, 0xAA, TEST_LEN); + + for (uint8_t j = 0; j < 6; j++) { + uint32_t start_time = (uint32_t)xTaskGetTickCount(); + for (uint32_t i = 0; i < TEST_COUNT; i++) { + usbh_bulk_urb_fill(&cdc_acm_class->bulkout_urb, cdc_acm_class->hport, cdc_acm_class->bulkout, cdc_speed_buffer, test_len[j], 0XFFFFFFF, NULL, NULL); + ret = usbh_submit_urb(&cdc_acm_class->bulkout_urb); + if (ret < 0) { + USB_LOG_RAW("bulk out error,ret:%d\r\n", ret); + while (1) { + } + } else { + } + } + uint32_t time_ms = xTaskGetTickCount() - start_time; + USB_LOG_RAW("per packet len:%d, out speed:%f MB/S\r\n", (unsigned int)test_len[j], (test_len[j] * TEST_COUNT / 1024 / 1024) * 1000 / ((float)time_ms)); + } +#endif + memset(cdc_buffer, 0x55, 4096); + + /* for common, we use timeout with 0xffffffff, this is just a test */ + usbh_bulk_urb_fill(&cdc_acm_class->bulkout_urb, cdc_acm_class->hport, cdc_acm_class->bulkout, cdc_buffer, sizeof(cdc_buffer), 3000, NULL, NULL); + ret = usbh_submit_urb(&cdc_acm_class->bulkout_urb); + if (ret < 0) { + USB_LOG_RAW("bulk out error,ret:%d\r\n", ret); + goto delete; + } else { + USB_LOG_RAW("send over:%d\r\n", (unsigned int)cdc_acm_class->bulkout_urb.actual_length); + } + + /* we can change cdc_acm_class->bulkin->wMaxPacketSize with 4096 for testing zlp, default is ep mps */ + usbh_bulk_urb_fill(&cdc_acm_class->bulkin_urb, cdc_acm_class->hport, cdc_acm_class->bulkin, cdc_buffer, cdc_acm_class->bulkin->wMaxPacketSize, 0xffffffff, usbh_cdc_acm_callback, cdc_acm_class); + ret = usbh_submit_urb(&cdc_acm_class->bulkin_urb); + if (ret < 0) { + USB_LOG_RAW("bulk in error,ret:%d\r\n", ret); + goto delete; + } else { + } + // clang-format off +delete: + usb_osal_thread_delete(NULL); + // clang-format on +} +#endif + +#if CONFIG_TEST_USBH_HID +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t hid_buffer[128]; + +void usbh_hid_callback(void *arg, int nbytes) +{ + struct usbh_hid *hid_class = (struct usbh_hid *)arg; + + if (nbytes > 0) { + for (int i = 0; i < nbytes; i++) { + USB_LOG_RAW("0x%02x ", hid_buffer[i]); + } + USB_LOG_RAW("nbytes:%d\r\n", (unsigned int)nbytes); + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_buffer, hid_class->intin->wMaxPacketSize, 0, usbh_hid_callback, hid_class); + usbh_submit_urb(&hid_class->intin_urb); + } else if (nbytes == -USB_ERR_NAK) { /* only dwc2 should do this */ + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_buffer, hid_class->intin->wMaxPacketSize, 0, usbh_hid_callback, hid_class); + usbh_submit_urb(&hid_class->intin_urb); + } else { + } +} + +static void usbh_hid_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + int ret; + struct usbh_hid *hid_class = (struct usbh_hid *)CONFIG_USB_OSAL_THREAD_GET_ARGV; + ; + + /* test with only one buffer, if you have more hid class, modify by yourself */ + + /* Suggest you to use timer for int transfer and use ep interval */ + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_buffer, hid_class->intin->wMaxPacketSize, 0, usbh_hid_callback, hid_class); + ret = usbh_submit_urb(&hid_class->intin_urb); + if (ret < 0) { + goto delete; + } + // clang-format off +delete: + usb_osal_thread_delete(NULL); + // clang-format on +} +#endif + +#if CONFIG_TEST_USBH_MSC + +#if TEST_USBH_MSC_FATFS +#include "ff.h" + +#if TEST_USBH_MSC_FATFS_SPEED +#define WRITE_SIZE_MB (128UL) +#define WRITE_SIZE (1024UL * 1024UL * WRITE_SIZE_MB) +#define BUF_SIZE (1024UL * 128UL) +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_write_buffer[BUF_SIZE]; +#else +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_write_buffer[25 * 100]; +#endif + +USB_NOCACHE_RAM_SECTION FATFS fs; +USB_NOCACHE_RAM_SECTION FIL fnew; +UINT fnum; +FRESULT res_sd = 0; + +int usb_msc_fatfs_test() +{ + const char *tmp_data = "cherryusb fatfs demo...\r\n"; + + USB_LOG_RAW("data len:%d\r\n", (unsigned int)strlen(tmp_data)); + for (uint32_t i = 0; i < 100; i++) { + memcpy(&read_write_buffer[i * 25], tmp_data, strlen(tmp_data)); + } + + res_sd = f_mount(&fs, "2:", 1); + if (res_sd != FR_OK) { + USB_LOG_RAW("mount fail,res:%d\r\n", (unsigned int)res_sd); + return -1; + } + + USB_LOG_RAW("test fatfs write\r\n"); + res_sd = f_open(&fnew, "2:test.txt", FA_CREATE_ALWAYS | FA_WRITE); + if (res_sd == FR_OK) { + res_sd = f_write(&fnew, read_write_buffer, sizeof(read_write_buffer), &fnum); + if (res_sd == FR_OK) { + USB_LOG_RAW("write success, write len:%d\n", fnum); + } else { + USB_LOG_RAW("write fail\r\n"); + goto unmount; + } + f_close(&fnew); + } else { + USB_LOG_RAW("open fail\r\n"); + goto unmount; + } + USB_LOG_RAW("test fatfs read\r\n"); + + res_sd = f_open(&fnew, "2:test.txt", FA_OPEN_EXISTING | FA_READ); + if (res_sd == FR_OK) { + res_sd = f_read(&fnew, read_write_buffer, sizeof(read_write_buffer), &fnum); + if (res_sd == FR_OK) { + USB_LOG_RAW("read success, read len:%d\n", fnum); + } else { + USB_LOG_RAW("read fail\r\n"); + goto unmount; + } + f_close(&fnew); + } else { + USB_LOG_RAW("open fail\r\n"); + goto unmount; + } + +#if TEST_USBH_MSC_FATFS_SPEED + for (uint32_t i = 0; i < BUF_SIZE; i++) { + read_write_buffer[i] = i % 256; + } + + USB_LOG_RAW("test fatfs write speed\r\n"); + res_sd = f_open(&fnew, "2:cherryusb_msc_test.bin", FA_OPEN_ALWAYS | FA_WRITE); + if (res_sd == FR_OK) { + uint32_t write_size = WRITE_SIZE; + uint32_t start_time = (uint32_t)xTaskGetTickCount(); + while (write_size > 0) { + res_sd = f_write(&fnew, read_write_buffer, BUF_SIZE, (UINT*)&fnum); + if (res_sd != FR_OK) { + USB_LOG_RAW("Write file failed, cause: %s\n", res_sd); + goto unmount; + } + write_size -= BUF_SIZE; + } + if (res_sd == FR_OK) { + uint32_t time_ms = xTaskGetTickCount() - start_time; + USB_LOG_RAW("Fatfs write speed:%f MB/S\r\n", (WRITE_SIZE_MB * 1000 / (float)time_ms)); + } else { + USB_LOG_RAW("write fail\r\n"); + goto unmount; + } + f_close(&fnew); + } else { + USB_LOG_RAW("open fail\r\n"); + goto unmount; + } + USB_LOG_RAW("test fatfs read speed\r\n"); + + res_sd = f_open(&fnew, "2:cherryusb_msc_test.bin", FA_OPEN_EXISTING | FA_READ); + if (res_sd == FR_OK) { + uint32_t write_size = WRITE_SIZE; + uint32_t start_time = (uint32_t)xTaskGetTickCount(); + while (write_size > 0) { + res_sd = f_read(&fnew, read_write_buffer, BUF_SIZE, (UINT*)&fnum); + if (res_sd != FR_OK) { + USB_LOG_RAW("Read file failed, cause: %s\n", res_sd); + goto unmount; + } + write_size -= BUF_SIZE; + } + if (res_sd == FR_OK) { + uint32_t time_ms = xTaskGetTickCount() - start_time; + USB_LOG_RAW("Fatfs read speed:%f MB/S\r\n", (WRITE_SIZE_MB * 1000 / (float)time_ms)); + } else { + USB_LOG_RAW("read fail\r\n"); + goto unmount; + } + f_close(&fnew); + } else { + USB_LOG_RAW("open fail\r\n"); + goto unmount; + } +#endif + f_mount(NULL, "2:", 1); + return 0; +unmount: + f_mount(NULL, "2:", 1); + return -1; +} +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t partition_table[512]; + +static void usbh_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + int ret; + struct usbh_msc *msc_class = (struct usbh_msc *)CONFIG_USB_OSAL_THREAD_GET_ARGV; + + /* test with only one buffer, if you have more msc class, modify by yourself */ +#if TEST_USBH_MSC_FATFS == 0 + ret = usbh_msc_scsi_init(msc_class); + if (ret < 0) { + USB_LOG_RAW("scsi_init error,ret:%d\r\n", ret); + goto delete; + } + /* get the partition table */ + ret = usbh_msc_scsi_read10(msc_class, 0, partition_table, 1); + if (ret < 0) { + USB_LOG_RAW("scsi_read10 error,ret:%d\r\n", ret); + goto delete; + } + for (uint32_t i = 0; i < 512; i++) { + if (i % 16 == 0) { + USB_LOG_RAW("\r\n"); + } + USB_LOG_RAW("%02x ", partition_table[i]); + } + USB_LOG_RAW("\r\n"); +#else + usb_msc_fatfs_test(); +#endif + + // clang-format off +delete: + usb_osal_thread_delete(NULL); + // clang-format on +} +#endif + +#if CONFIG_TEST_USBH_CDC_ACM +void usbh_cdc_acm_run(struct usbh_cdc_acm *cdc_acm_class) +{ + usb_osal_thread_create("usbh_cdc", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_cdc_acm_thread, cdc_acm_class); +} + +void usbh_cdc_acm_stop(struct usbh_cdc_acm *cdc_acm_class) +{ +} +#endif + +#if CONFIG_TEST_USBH_HID +void usbh_hid_run(struct usbh_hid *hid_class) +{ + usb_osal_thread_create("usbh_hid", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_hid_thread, hid_class); +} + +void usbh_hid_stop(struct usbh_hid *hid_class) +{ +} +#endif + +#if CONFIG_TEST_USBH_MSC +void usbh_msc_run(struct usbh_msc *msc_class) +{ + usb_osal_thread_create("usbh_msc", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_msc_thread, msc_class); +} + +void usbh_msc_stop(struct usbh_msc *msc_class) +{ +} +#endif + +#if CONFIG_TEST_USBH_AUDIO +#error "commercial charge" +#endif + +#if CONFIG_TEST_USBH_VIDEO +#error "commercial charge" +#endif + +#if 0 +#include "usbh_aoa.h" + +static struct aoa_string_info deviceinfo = { + .acc_manufacturer = "CherryUSB", + .acc_model = "CherryUSB", + .acc_description = "Android Open Accessory CherryUSB", + .acc_version = "1.0", + .acc_uri = "http://developer.android.com/tools/adk/index.html", + .acc_serial = "CherryUSB" +}; + +int aoa_switch(int argc, char **argv) +{ + struct usbh_hubport *hport = usbh_find_hubport(0, 1, 1); + + usbh_aoa_switch(hport, &deviceinfo); + return 0; +} + +SHELL_CMD_EXPORT_ALIAS(aoa_switch, aoa_switch, aoa_switch); +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/usbh_bl616_wifi_cli.c b/src/lib/CherryUSB/demo/usbh_bl616_wifi_cli.c new file mode 100644 index 000000000..125a26394 --- /dev/null +++ b/src/lib/CherryUSB/demo/usbh_bl616_wifi_cli.c @@ -0,0 +1,182 @@ +#include "usbh_core.h" +#include "usbh_cdc_acm.h" +#include "shell.h" + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t cdc_buffer[8 * 1024]; + +int wifi_scan(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_scan\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi scan failed1, ret:%d\r\n", ret); + return -1; + } + + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi scan failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_scan, wifi_scan); + +int wifi_scan_result(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_scan_result {\"offset\":0, \"count\":0}\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi scan failed1, ret:%d\r\n", ret); + return -1; + } + + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi scan failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_scan_result, wifi_scan_result); + +int wifi_connect(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + if (argc < 3) { + printf("please input correct command: wifi_connect ssid password\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_connect {\"ssid\":\"%s\", \"password\":\"%s\"}\r\n", argv[1], argv[2]); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi connect failed1, ret:%d\r\n", ret); + return -1; + } + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi connect failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_connect, wifi_connect); + +int wifi_disconnect(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_disconnect\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi disconnect failed1, ret:%d\r\n", ret); + return -1; + } + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi disconnect failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_disconnect, wifi_disconnect); + +int wifi_status(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_status\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi status failed1, ret:%d\r\n", ret); + return -1; + } + + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi status failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_status, wifi_status); + +int wifi_version(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "sys_version\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi status failed1, ret:%d\r\n", ret); + return -1; + } + + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi status failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_version, wifi_version); \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/video_audiov1_hid_template.c b/src/lib/CherryUSB/demo/video_audiov1_hid_template.c new file mode 100644 index 000000000..12cd2ae1f --- /dev/null +++ b/src/lib/CherryUSB/demo/video_audiov1_hid_template.c @@ -0,0 +1,583 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_video.h" +#include "usbd_audio.h" +#include "usbd_hid.h" +#include "cherryusb_mjpeg.h" + +#define MAX_PACKETS_IN_ONE_TRANSFER 1 + +#define VIDEO_IN_EP 0x81 +#define VIDEO_INT_EP 0x86 + +#ifdef CONFIG_USB_HS +#define MAX_PAYLOAD_SIZE 1024 // for high speed with one transcations every one micro frame +#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) + +// #define MAX_PAYLOAD_SIZE 2048 // for high speed with two transcations every one micro frame +// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 2)) | (0x01 << 11)) + +// #define MAX_PAYLOAD_SIZE 3072 // for high speed with three transcations every one micro frame +// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 3)) | (0x02 << 11)) + +#else +#define MAX_PAYLOAD_SIZE 1020 +#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) +#endif + +#define WIDTH (unsigned int)(640) +#define HEIGHT (unsigned int)(480) + +#define CAM_FPS (30) +#define INTERVAL (unsigned long)(10000000 / CAM_FPS) +#define MIN_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) //16 bit +#define MAX_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) +#define MAX_FRAME_SIZE (unsigned long)(WIDTH * HEIGHT * 2) + +#define VS_HEADER_SIZ (unsigned int)(VIDEO_SIZEOF_VS_INPUT_HEADER_DESC(1, 1) + VIDEO_SIZEOF_VS_FORMAT_MJPEG_DESC + VIDEO_SIZEOF_VS_FRAME_MJPEG_DESC(1)) + +#define USB_VIDEO_DESC_SIZ (unsigned long)(9 + \ + VIDEO_VC_NOEP_DESCRIPTOR_LEN + \ + 9 + \ + VS_HEADER_SIZ + \ + 9 + \ + 7 + \ + AUDIO_AC_DESCRIPTOR_LEN(2) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_AS_DESCRIPTOR_LEN(1) + \ + AUDIO_AS_DESCRIPTOR_LEN(1) + \ + 25) + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USB_HS +#define EP_INTERVAL 0x04 +#else +#define EP_INTERVAL 0x01 +#endif + +#define AUDIO_IN_EP 0x82 +#define AUDIO_OUT_EP 0x03 + +#define AUDIO_IN_FU_ID 0x02 +#define AUDIO_OUT_FU_ID 0x05 + +/* AUDIO Class Config */ +#define AUDIO_SPEAKER_FREQ 16000U +#define AUDIO_SPEAKER_FRAME_SIZE_BYTE 2u +#define AUDIO_SPEAKER_RESOLUTION_BIT 16u +#define AUDIO_MIC_FREQ 16000U +#define AUDIO_MIC_FRAME_SIZE_BYTE 2u +#define AUDIO_MIC_RESOLUTION_BIT 16u + +#define AUDIO_SAMPLE_FREQ(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16)) + +/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */ +#define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_SPEAKER_FREQ * AUDIO_SPEAKER_FRAME_SIZE_BYTE * 2) / 1000)) +/* 16bit(2 Bytes) 双声道(Mono:2) */ +#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_MIC_FREQ * AUDIO_MIC_FRAME_SIZE_BYTE * 2) / 1000)) + +#define AUDIO_AC_SIZ (AUDIO_SIZEOF_AC_HEADER_DESC(2) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC) + +#define HID_INT_EP 0x84 +#define HID_INT_EP_SIZE 8 +#define HID_INT_EP_INTERVAL 10 + +#define HID_KEYBOARD_REPORT_DESC_SIZE 63 + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x06, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), + VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), + VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_INIT(0x01, 0x01), + VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, MAX_FRAME_SIZE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), + /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ + USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), + AUDIO_AC_DESCRIPTOR_INIT(0x02, 0x03, AUDIO_AC_SIZ, 0x00, 0x03, 0x04), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, 0x02, 0x0003), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x02, 0x01, 0x01, 0x03, 0x00, 0x00), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, 0x02), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x02, 0x0003), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x05, 0x04, 0x01, 0x03, 0x00, 0x00), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_OUTTERM_SPEAKER, 0x05), + AUDIO_AS_DESCRIPTOR_INIT(0x03, 0x04, 0x02, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), + AUDIO_AS_DESCRIPTOR_INIT(0x04, 0x03, 0x02, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)), + HID_KEYBOARD_DESCRIPTOR_INIT(0x05, 0x01, HID_KEYBOARD_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UVC UAC HID DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor video_audio_hid_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t video_audio_hid_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x06, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), + VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), + VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_INIT(0x01, 0x01), + VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, MAX_FRAME_SIZE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), + /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ + USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), + AUDIO_AC_DESCRIPTOR_INIT(0x02, 0x03, AUDIO_AC_SIZ, 0x00, 0x03, 0x04), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, 0x02, 0x0003), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x02, 0x01, 0x01, 0x03, 0x00, 0x00), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, 0x02), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x02, 0x0003), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x05, 0x04, 0x01, 0x03, 0x00, 0x00), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_OUTTERM_SPEAKER, 0x05), + AUDIO_AS_DESCRIPTOR_INIT(0x03, 0x04, 0x02, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), + AUDIO_AS_DESCRIPTOR_INIT(0x04, 0x03, 0x02, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)), + /************** Descriptor of Joystick Mouse interface ****************/ + /* 09 */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ + 0x05, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints */ + 0x03, /* bInterfaceClass: HID */ + 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ + 0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ + 0, /* iInterface: Index of string descriptor */ + /******************** Descriptor of Joystick Mouse HID ********************/ + /* 18 */ + 0x09, /* bLength: HID Descriptor size */ + HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ + 0x11, /* bcdHID: HID Class Spec release number */ + 0x01, + 0x00, /* bCountryCode: Hardware target country */ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ + 0x22, /* bDescriptorType */ + HID_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ + 0x00, + /******************** Descriptor of Mouse endpoint ********************/ + /* 27 */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ + HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ + 0x00, + HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ + /* 34 */ + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'A', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '4', 0x00, /* wcChar3 */ + '0', 0x00, /* wcChar4 */ + '3', 0x00, /* wcChar5 */ + '1', 0x00, /* wcChar6 */ + '0', 0x00, /* wcChar7 */ + '0', 0x00, /* wcChar8 */ + '0', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +static const uint8_t hid_keyboard_report_desc[HID_KEYBOARD_REPORT_DESC_SIZE] = { + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x06, // USAGE (Keyboard) + 0xa1, 0x01, // COLLECTION (Application) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) + 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x75, 0x01, // REPORT_SIZE (1) + 0x95, 0x08, // REPORT_COUNT (8) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) + 0x95, 0x05, // REPORT_COUNT (5) + 0x75, 0x01, // REPORT_SIZE (1) + 0x05, 0x08, // USAGE_PAGE (LEDs) + 0x19, 0x01, // USAGE_MINIMUM (Num Lock) + 0x29, 0x05, // USAGE_MAXIMUM (Kana) + 0x91, 0x02, // OUTPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x03, // REPORT_SIZE (3) + 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) + 0x95, 0x06, // REPORT_COUNT (6) + 0x75, 0x08, // REPORT_SIZE (8) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0xFF, // LOGICAL_MAXIMUM (255) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) + 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) + 0x81, 0x00, // INPUT (Data,Ary,Abs) + 0xc0 // END_COLLECTION +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t audio_read_buffer[AUDIO_OUT_PACKET]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t audio_write_buffer[AUDIO_IN_PACKET]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t video_packet_buffer[2][MAX_PACKETS_IN_ONE_TRANSFER * MAX_PAYLOAD_SIZE]; + +volatile bool video_tx_flag = 0; +volatile bool audio_tx_flag = 0; +volatile bool audio_rx_flag = 0; +volatile bool video_iso_tx_busy = false; +volatile bool audio_iso_tx_busy = false; + +#define HID_STATE_IDLE 0 +#define HID_STATE_BUSY 1 + +/*!< hid state ! Data can be sent only when state is idle */ +static volatile uint8_t hid_state = HID_STATE_IDLE; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + video_tx_flag = 0; + audio_tx_flag = 0; + audio_rx_flag = 0; + video_iso_tx_busy = false; + audio_iso_tx_busy = false; + hid_state = HID_STATE_IDLE; + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_video_open(uint8_t busid, uint8_t intf) +{ + if (intf == 1) { + video_tx_flag = 1; + USB_LOG_RAW("OPEN\r\n"); + video_iso_tx_busy = false; + } +} +void usbd_video_close(uint8_t busid, uint8_t intf) +{ + if (intf == 1) { + USB_LOG_RAW("CLOSE\r\n"); + video_tx_flag = 0; + video_iso_tx_busy = false; + } +} + +void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + if (nbytes == 0) { + return; + } + + if (usbd_video_stream_split_transfer(busid, ep)) { + /* one frame has done */ + video_iso_tx_busy = false; + } +} + +static struct usbd_endpoint video_in_ep = { + .ep_cb = usbd_video_iso_callback, + .ep_addr = VIDEO_IN_EP +}; + +void usbd_audio_open(uint8_t busid, uint8_t intf) +{ + if (intf == 3) { + audio_rx_flag = 1; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, AUDIO_OUT_EP, audio_read_buffer, AUDIO_OUT_PACKET); + USB_LOG_RAW("OPEN1\r\n"); + } else if (intf == 4) { + audio_tx_flag = 1; + audio_iso_tx_busy = false; + USB_LOG_RAW("OPEN2\r\n"); + } +} + +void usbd_audio_close(uint8_t busid, uint8_t intf) +{ + if (intf == 3) { + audio_rx_flag = 0; + USB_LOG_RAW("CLOSE1\r\n"); + } else if (intf == 4) { + audio_tx_flag = 0; + audio_iso_tx_busy = false; + USB_LOG_RAW("CLOSE2\r\n"); + } +} + +void usbd_audio_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + usbd_ep_start_read(busid, AUDIO_OUT_EP, audio_read_buffer, AUDIO_OUT_PACKET); +} + +void usbd_audio_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + audio_iso_tx_busy = false; +} + +static struct usbd_endpoint audio_in_ep = { + .ep_cb = usbd_audio_in_callback, + .ep_addr = AUDIO_IN_EP +}; + +static struct usbd_endpoint audio_out_ep = { + .ep_cb = usbd_audio_out_callback, + .ep_addr = AUDIO_OUT_EP +}; + +void usbd_hid_int_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + hid_state = HID_STATE_IDLE; +} + +static struct usbd_endpoint hid_in_ep = { + .ep_cb = usbd_hid_int_callback, + .ep_addr = HID_INT_EP +}; + +struct usbd_interface intf0; +struct usbd_interface intf1; + +struct usbd_interface intf2; +struct usbd_interface intf3; +struct usbd_interface intf4; + +struct usbd_interface intf5; + +struct audio_entity_info audio_entity_table[] = { + { .bEntityId = AUDIO_IN_FU_ID, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .ep = AUDIO_IN_EP }, + { .bEntityId = AUDIO_OUT_FU_ID, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .ep = AUDIO_OUT_EP }, +}; + +void composite_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &video_audio_hid_descriptor); +#else + usbd_desc_register(busid, video_audio_hid_descriptor); +#endif + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_endpoint(busid, &video_in_ep); + + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf2, 0x0100, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf3, 0x0100, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf4, 0x0100, audio_entity_table, 2)); + usbd_add_endpoint(busid, &audio_in_ep); + usbd_add_endpoint(busid, &audio_out_ep); + + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &hid_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +/* just for test, rewrite by yourself */ +void audio_test(uint8_t busid) +{ + while (1) { + if (audio_tx_flag) { + memset(audio_write_buffer, 'a', AUDIO_IN_PACKET); + audio_iso_tx_busy = true; + usbd_ep_start_write(busid, AUDIO_IN_EP, audio_write_buffer, AUDIO_IN_PACKET); + while (audio_iso_tx_busy) { + if (audio_tx_flag == false) { + break; + } + } + } + } +} + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t hid_write_buffer[64]; + +void hid_keyboard_test(uint8_t busid) +{ + const uint8_t sendbuffer[8] = { 0x00, 0x00, HID_KBD_USAGE_A, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + if(usb_device_is_configured(busid) == false) { + return; + } + + memcpy(hid_write_buffer, sendbuffer, 8); + hid_state = HID_STATE_BUSY; + usbd_ep_start_write(busid, HID_INT_EP, hid_write_buffer, 8); + while (hid_state == HID_STATE_BUSY) { + } +} + +void video_test(uint8_t busid) +{ + memset(video_packet_buffer, 0, sizeof(video_packet_buffer)); + + while (1) { + if (video_tx_flag) { + video_iso_tx_busy = true; + usbd_video_stream_start_write(busid, VIDEO_IN_EP, &video_packet_buffer[0][0], &video_packet_buffer[1][0], MAX_PACKETS_IN_ONE_TRANSFER * MAX_PAYLOAD_SIZE, (uint8_t *)cherryusb_mjpeg, sizeof(cherryusb_mjpeg)); + while (video_iso_tx_busy) { + if (video_tx_flag == 0) { + break; + } + } + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/video_static_h264_template.c b/src/lib/CherryUSB/demo/video_static_h264_template.c new file mode 100644 index 000000000..7337f5f7e --- /dev/null +++ b/src/lib/CherryUSB/demo/video_static_h264_template.c @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_video.h" +#include "cherryusb_h264.h" + +#define VIDEO_IN_EP 0x81 +#define VIDEO_INT_EP 0x83 + +#ifdef CONFIG_USB_HS +#define MAX_PAYLOAD_SIZE 1024 // for high speed with one transcations every one micro frame +#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) + +// #define MAX_PAYLOAD_SIZE 2048 // for high speed with two transcations every one micro frame +// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 2)) | (0x01 << 11)) + +// #define MAX_PAYLOAD_SIZE 3072 // for high speed with three transcations every one micro frame +// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 3)) | (0x02 << 11)) + +#else +#define MAX_PAYLOAD_SIZE 1020 +#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) +#endif + +#define WIDTH (unsigned int)(640) +#define HEIGHT (unsigned int)(480) + +#define CAM_FPS (30) +#define INTERVAL (unsigned long)(10000000 / CAM_FPS) +#define MIN_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) //16 bit +#define MAX_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) +#define MAX_FRAME_SIZE (unsigned long)(WIDTH * HEIGHT * 2) + +#define VS_HEADER_SIZ (unsigned int)(VIDEO_SIZEOF_VS_INPUT_HEADER_DESC(1,1) + VIDEO_SIZEOF_VS_FORMAT_H264_DESC + VIDEO_SIZEOF_VS_FRAME_H264_DESC(1)) + +#define USB_VIDEO_DESC_SIZ (unsigned long)(9 + \ + VIDEO_VC_NOEP_DESCRIPTOR_LEN + \ + 9 + \ + VS_HEADER_SIZ + \ + 9 + \ + 7) + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), + VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), + VIDEO_VS_FORMAT_H264_DESCRIPTOR_INIT(0x01, 0x01), + VIDEO_VS_FRAME_H264_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), + /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ + USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UVC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor video_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t video_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), + VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), + VIDEO_VS_FORMAT_H264_DESCRIPTOR_INIT(0x01, 0x01), + VIDEO_VS_FRAME_H264_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), + /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ + USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), + + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'V', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '0', 0x00, /* wcChar4 */ + '3', 0x00, /* wcChar5 */ + '1', 0x00, /* wcChar6 */ + '0', 0x00, /* wcChar7 */ + '0', 0x00, /* wcChar8 */ + '0', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +volatile bool tx_flag = 0; +volatile bool iso_tx_busy = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + tx_flag = 0; + iso_tx_busy = false; + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_video_open(uint8_t busid, uint8_t intf) +{ + tx_flag = 1; + USB_LOG_RAW("OPEN\r\n"); + iso_tx_busy = false; +} +void usbd_video_close(uint8_t busid, uint8_t intf) +{ + USB_LOG_RAW("CLOSE\r\n"); + tx_flag = 0; + iso_tx_busy = false; +} + +void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + if (nbytes == 0) { + return; + } + + if (usbd_video_stream_split_transfer(busid, ep)) { + /* one frame has done */ + iso_tx_busy = false; + } +} + +static struct usbd_endpoint video_in_ep = { + .ep_cb = usbd_video_iso_callback, + .ep_addr = VIDEO_IN_EP +}; + +struct usbd_interface intf0; +struct usbd_interface intf1; + +void video_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &video_descriptor); +#else + usbd_desc_register(busid, video_descriptor); +#endif + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_endpoint(busid, &video_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t packet_buffer[MAX_PAYLOAD_SIZE]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t frame_buffer[32 * 1024]; + +void video_test(uint8_t busid) +{ + uint32_t out_len; + uint32_t packets; + + (void)packets; + memset(packet_buffer, 0, sizeof(packet_buffer)); + while (1) { + if (tx_flag) { + iso_tx_busy = true; + memcpy(frame_buffer, cherryusb_h264, sizeof(cherryusb_h264)); // cherryusb_h264 is a static yuyv frame buffer, so we need copy it to frame_buffer + usbd_video_stream_start_write(busid, VIDEO_IN_EP, packet_buffer, (uint8_t *)frame_buffer, sizeof(cherryusb_h264), false); + while (iso_tx_busy) { + if (tx_flag == 0) { + break; + } + } + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/video_static_mjpeg_template.c b/src/lib/CherryUSB/demo/video_static_mjpeg_template.c new file mode 100644 index 000000000..3fc923f8d --- /dev/null +++ b/src/lib/CherryUSB/demo/video_static_mjpeg_template.c @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_video.h" +#include "cherryusb_mjpeg.h" + +#define VIDEO_IN_EP 0x81 +#define VIDEO_INT_EP 0x83 + +#ifdef CONFIG_USB_HS +#define MAX_PAYLOAD_SIZE 1024 // for high speed with one transcations every one micro frame +#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) + +// #define MAX_PAYLOAD_SIZE 2048 // for high speed with two transcations every one micro frame +// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 2)) | (0x01 << 11)) + +// #define MAX_PAYLOAD_SIZE 3072 // for high speed with three transcations every one micro frame +// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 3)) | (0x02 << 11)) + +#else +#define MAX_PAYLOAD_SIZE 1020 +#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) +#endif + +#define WIDTH (unsigned int)(640) +#define HEIGHT (unsigned int)(480) + +#define CAM_FPS (30) +#define INTERVAL (unsigned long)(10000000 / CAM_FPS) +#define MIN_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) //16 bit +#define MAX_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) +#define MAX_FRAME_SIZE (unsigned long)(WIDTH * HEIGHT * 2) + +#define VS_HEADER_SIZ (unsigned int)(VIDEO_SIZEOF_VS_INPUT_HEADER_DESC(1, 1) + VIDEO_SIZEOF_VS_FORMAT_MJPEG_DESC + VIDEO_SIZEOF_VS_FRAME_MJPEG_DESC(1)) + +#define USB_VIDEO_DESC_SIZ (unsigned long)(9 + \ + VIDEO_VC_NOEP_DESCRIPTOR_LEN + \ + 9 + \ + VS_HEADER_SIZ + \ + 9 + \ + 7) + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), + VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), + VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_INIT(0x01, 0x01), + VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, MAX_FRAME_SIZE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), + /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ + USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UVC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor video_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t video_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), + VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), + VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_INIT(0x01, 0x01), + VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, MAX_FRAME_SIZE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), + /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ + USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), + + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'V', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '0', 0x00, /* wcChar4 */ + '3', 0x00, /* wcChar5 */ + '1', 0x00, /* wcChar6 */ + '0', 0x00, /* wcChar7 */ + '0', 0x00, /* wcChar8 */ + '0', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +volatile bool tx_flag = 0; +volatile bool iso_tx_busy = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + tx_flag = 0; + iso_tx_busy = false; + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_video_open(uint8_t busid, uint8_t intf) +{ + tx_flag = 1; + USB_LOG_RAW("OPEN\r\n"); + iso_tx_busy = false; +} +void usbd_video_close(uint8_t busid, uint8_t intf) +{ + USB_LOG_RAW("CLOSE\r\n"); + tx_flag = 0; + iso_tx_busy = false; +} + +void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + if (nbytes == 0) { + return; + } + + if (usbd_video_stream_split_transfer(busid, ep)) { + /* one frame has done */ + iso_tx_busy = false; + } +} + +static struct usbd_endpoint video_in_ep = { + .ep_cb = usbd_video_iso_callback, + .ep_addr = VIDEO_IN_EP +}; + +struct usbd_interface intf0; +struct usbd_interface intf1; + +void video_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &video_descriptor); +#else + usbd_desc_register(busid, video_descriptor); +#endif + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_endpoint(busid, &video_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t packet_buffer[MAX_PAYLOAD_SIZE]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t frame_buffer[32 * 1024]; + +void video_test(uint8_t busid) +{ + memset(packet_buffer, 0, sizeof(packet_buffer)); + + while (1) { + if (tx_flag) { + iso_tx_busy = true; + memcpy(frame_buffer, cherryusb_mjpeg, sizeof(cherryusb_mjpeg)); // cherryusb_mjpeg is a static MJPEG frame buffer, so we need copy it to frame_buffer + usbd_video_stream_start_write(busid, VIDEO_IN_EP, packet_buffer, (uint8_t *)frame_buffer, sizeof(cherryusb_mjpeg), false); + while (iso_tx_busy) { + if (tx_flag == 0) { + break; + } + } + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/video_static_yuyv_template.c b/src/lib/CherryUSB/demo/video_static_yuyv_template.c new file mode 100644 index 000000000..7c7d17899 --- /dev/null +++ b/src/lib/CherryUSB/demo/video_static_yuyv_template.c @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_video.h" +#include "cherryusb_yuyv.h" + +#define VIDEO_IN_EP 0x81 +#define VIDEO_INT_EP 0x83 + +#ifdef CONFIG_USB_HS +#define MAX_PAYLOAD_SIZE 1024 // for high speed with one transcations every one micro frame +#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) + +// #define MAX_PAYLOAD_SIZE 2048 // for high speed with two transcations every one micro frame +// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 2)) | (0x01 << 11)) + +// #define MAX_PAYLOAD_SIZE 3072 // for high speed with three transcations every one micro frame +// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 3)) | (0x02 << 11)) + +#else +#define MAX_PAYLOAD_SIZE 1020 +#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) +#endif + +#define WIDTH (unsigned int)(64) +#define HEIGHT (unsigned int)(48) + +#define CAM_FPS (30) +#define INTERVAL (unsigned long)(10000000 / CAM_FPS) +#define MIN_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) //16 bit +#define MAX_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) +#define MAX_FRAME_SIZE (unsigned long)(WIDTH * HEIGHT * 2) + +#define VS_HEADER_SIZ (unsigned int)(VIDEO_SIZEOF_VS_INPUT_HEADER_DESC(1,1) + VIDEO_SIZEOF_VS_FORMAT_UNCOMPRESSED_DESC + VIDEO_SIZEOF_VS_FRAME_UNCOMPRESSED_DESC(1)) + +#define USB_VIDEO_DESC_SIZ (unsigned long)(9 + \ + VIDEO_VC_NOEP_DESCRIPTOR_LEN + \ + 9 + \ + VS_HEADER_SIZ + \ + 6 + \ + 9 + \ + 7) + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), + VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), + VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_INIT(0x01, 0x01, VIDEO_GUID_YUY2), + VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, MAX_FRAME_SIZE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), + VIDEO_VS_COLOR_MATCHING_DESCRIPTOR_INIT(), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), + /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ + USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), + +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB UVC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor video_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +const uint8_t video_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), + VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), + VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_INIT(0x01, 0x01, VIDEO_GUID_YUY2), + VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, MAX_FRAME_SIZE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), + VIDEO_VS_COLOR_MATCHING_DESCRIPTOR_INIT(), + VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), + /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ + USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), + + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'V', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '0', 0x00, /* wcChar4 */ + '3', 0x00, /* wcChar5 */ + '1', 0x00, /* wcChar6 */ + '0', 0x00, /* wcChar7 */ + '0', 0x00, /* wcChar8 */ + '0', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +volatile bool tx_flag = 0; +volatile bool iso_tx_busy = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + tx_flag = 0; + iso_tx_busy = false; + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_video_open(uint8_t busid, uint8_t intf) +{ + tx_flag = 1; + USB_LOG_RAW("OPEN\r\n"); + iso_tx_busy = false; +} +void usbd_video_close(uint8_t busid, uint8_t intf) +{ + USB_LOG_RAW("CLOSE\r\n"); + tx_flag = 0; + iso_tx_busy = false; +} + +void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + if (nbytes == 0) { + return; + } + + if (usbd_video_stream_split_transfer(busid, ep)) { + /* one frame has done */ + iso_tx_busy = false; + } +} + +static struct usbd_endpoint video_in_ep = { + .ep_cb = usbd_video_iso_callback, + .ep_addr = VIDEO_IN_EP +}; + +struct usbd_interface intf0; +struct usbd_interface intf1; + +void video_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &video_descriptor); +#else + usbd_desc_register(busid, video_descriptor); +#endif + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_endpoint(busid, &video_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t packet_buffer[MAX_PAYLOAD_SIZE]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t frame_buffer[32 * 1024]; + +void video_test(uint8_t busid) +{ + memset(packet_buffer, 0, sizeof(packet_buffer)); + + while (1) { + if (tx_flag) { + iso_tx_busy = true; + memcpy(frame_buffer, cherryusb_yuyv, sizeof(cherryusb_yuyv)); // cherryusb_yuyv is a static yuyv frame buffer, so we need copy it to frame_buffer + usbd_video_stream_start_write(busid, VIDEO_IN_EP, packet_buffer, (uint8_t *)frame_buffer, sizeof(cherryusb_yuyv), false); + while (iso_tx_busy) { + if (tx_flag == 0) { + break; + } + } + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/webusb_hid_template.c b/src/lib/CherryUSB/demo/webusb_hid_template.c new file mode 100644 index 000000000..b8f863c4e --- /dev/null +++ b/src/lib/CherryUSB/demo/webusb_hid_template.c @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_hid.h" + +#define WEBUSB_VENDOR_CODE (0x22) +#define WINUSB_VENDOR_CODE (0x21) + +#define URL_DESCRIPTOR_LENGTH (3 + 36) + +#define WEBUSB_INTF_NUM 0x01 + +#define WEBUSB_URL_STRINGS \ + 'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', \ + 'c', 'h', 'e', 'r', 'r', 'y', '-', 'e', 'm', 'b', 'e', 'd', 'd', 'e', 'd', '/', 'C', 'h', 'e', 'r', 'r', 'y', 'U', 'S', 'B', + +const uint8_t USBD_WebUSBURLDescriptor[URL_DESCRIPTOR_LENGTH] = { + URL_DESCRIPTOR_LENGTH, + WEBUSB_URL_TYPE, + WEBUSB_URL_SCHEME_HTTPS, + WEBUSB_URL_STRINGS +}; + +const uint8_t WINUSB_WCIDDescriptor[] = { + USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(WEBUSB_INTF_NUM), +}; + +__ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[] = { + USB_BOS_HEADER_DESCRIPTOR_INIT(5 + USB_BOS_CAP_PLATFORM_WEBUSB_DESCRIPTOR_LEN + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_LEN, 2), + USB_BOS_CAP_PLATFORM_WEBUSB_DESCRIPTOR_INIT(WEBUSB_VENDOR_CODE, 0x01), + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_INIT(WINUSB_VENDOR_CODE, sizeof(WINUSB_WCIDDescriptor)), +}; + +struct usb_webusb_descriptor webusb_url_desc = { + .vendor_code = WEBUSB_VENDOR_CODE, + .string = USBD_WebUSBURLDescriptor, + .string_len = URL_DESCRIPTOR_LENGTH +}; + +struct usb_msosv2_descriptor msosv2_desc = { + .vendor_code = WINUSB_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .compat_id_len = sizeof(WINUSB_WCIDDescriptor), +}; + +struct usb_bos_descriptor bos_desc = { + .string = USBD_BinaryObjectStoreDescriptor, + .string_len = sizeof(USBD_BinaryObjectStoreDescriptor) +}; + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#define HID_INT_EP 0x81 +#define HID_INT_EP_SIZE 8 +#define HID_INT_EP_INTERVAL 10 + +#define USB_CONFIG_SIZE (34 + 9) +#define HID_KEYBOARD_REPORT_DESC_SIZE 63 + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_KEYBOARD_DESCRIPTOR_INIT(0x00, 0x01, HID_KEYBOARD_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), + USB_INTERFACE_DESCRIPTOR_INIT(WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB WEBUSB HID DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor webusb_hid_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .msosv2_descriptor = &msosv2_desc, + .webusb_url_descriptor = &webusb_url_desc, + .bos_descriptor = &bos_desc +}; +#else +static const uint8_t webusb_hid_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_KEYBOARD_DESCRIPTOR_INIT(0x00, 0x01, HID_KEYBOARD_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), + USB_INTERFACE_DESCRIPTOR_INIT(WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x2C, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'W', 0x00, /* wcChar10 */ + 'E', 0x00, /* wcChar11 */ + 'B', 0x00, /* wcChar12 */ + 'U', 0x00, /* wcChar13 */ + 'S', 0x00, /* wcChar14 */ + 'B', 0x00, /* wcChar15 */ + ' ', 0x00, /* wcChar16 */ + 'D', 0x00, /* wcChar17 */ + 'E', 0x00, /* wcChar18 */ + 'M', 0x00, /* wcChar19 */ + 'O', 0x00, /* wcChar20 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +/* USB HID device Configuration Descriptor */ +static uint8_t hid_desc[9] __ALIGN_END = { + /* 18 */ + 0x09, /* bLength: HID Descriptor size */ + HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ + 0x11, /* bcdHID: HID Class Spec release number */ + 0x01, + 0x00, /* bCountryCode: Hardware target country */ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ + 0x22, /* bDescriptorType */ + HID_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ + 0x00, +}; + +static const uint8_t hid_keyboard_report_desc[HID_KEYBOARD_REPORT_DESC_SIZE] = { + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x06, // USAGE (Keyboard) + 0xa1, 0x01, // COLLECTION (Application) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) + 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x75, 0x01, // REPORT_SIZE (1) + 0x95, 0x08, // REPORT_COUNT (8) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) + 0x95, 0x05, // REPORT_COUNT (5) + 0x75, 0x01, // REPORT_SIZE (1) + 0x05, 0x08, // USAGE_PAGE (LEDs) + 0x19, 0x01, // USAGE_MINIMUM (Num Lock) + 0x29, 0x05, // USAGE_MAXIMUM (Kana) + 0x91, 0x02, // OUTPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x03, // REPORT_SIZE (3) + 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) + 0x95, 0x06, // REPORT_COUNT (6) + 0x75, 0x08, // REPORT_SIZE (8) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0xFF, // LOGICAL_MAXIMUM (255) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) + 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) + 0x81, 0x00, // INPUT (Data,Ary,Abs) + 0xc0 // END_COLLECTION +}; + +#define HID_STATE_IDLE 0 +#define HID_STATE_BUSY 1 + +/*!< hid state ! Data can be sent only when state is idle */ +static volatile uint8_t hid_state = HID_STATE_IDLE; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + hid_state = HID_STATE_IDLE; + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_hid_int_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + hid_state = HID_STATE_IDLE; +} + +static struct usbd_endpoint hid_in_ep = { + .ep_cb = usbd_hid_int_callback, + .ep_addr = HID_INT_EP +}; + +static struct usbd_interface intf0; + +void webusb_hid_keyboard_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &webusb_hid_descriptor); +#else + usbd_desc_register(busid, webusb_hid_descriptor); +#endif +#ifndef CONFIG_USBDEV_ADVANCE_DESC + usbd_bos_desc_register(busid, &bos_desc); + usbd_msosv2_desc_register(busid, &msosv2_desc); + usbd_webusb_desc_register(busid, &webusb_url_desc); +#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &hid_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[64]; + +void hid_keyboard_test(uint8_t busid) +{ + const uint8_t sendbuffer[8] = { 0x00, 0x00, HID_KBD_USAGE_A, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + if (usb_device_is_configured(busid) == false) { + return; + } + + memcpy(write_buffer, sendbuffer, 8); + hid_state = HID_STATE_BUSY; + usbd_ep_start_write(busid, HID_INT_EP, write_buffer, 8); + while (hid_state == HID_STATE_BUSY) { + } +} diff --git a/src/lib/CherryUSB/demo/winusb1.0_template.c b/src/lib/CherryUSB/demo/winusb1.0_template.c new file mode 100644 index 000000000..c540f6e77 --- /dev/null +++ b/src/lib/CherryUSB/demo/winusb1.0_template.c @@ -0,0 +1,485 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" + +#define WINUSB_VENDOR_CODE 0x17 + +#define WINUSB_NUM 1 + +const uint8_t WCID_StringDescriptor_MSOS[18] = { + USB_MSOSV1_STRING_DESCRIPTOR_INIT(WINUSB_VENDOR_CODE) +}; + +const uint8_t WINUSB_WCIDDescriptor[] = { + USB_MSOSV1_COMP_ID_HEADER_DESCRIPTOR_INIT(WINUSB_NUM), + USB_MSOSV1_COMP_ID_FUNCTION_WINUSB_DESCRIPTOR_INIT(0), +#if WINUSB_NUM == 2 + USB_MSOSV1_COMP_ID_FUNCTION_WINUSB_DESCRIPTOR_INIT(1), +#endif +}; + +const uint8_t WINUSB_IF0_WCIDProperties[142] = { + /////////////////////////////////////// + /// WCID property descriptor + /////////////////////////////////////// + 0x8e, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x05, 0x00, /* wIndex */ + 0x01, 0x00, /* wCount */ + + /////////////////////////////////////// + /// registry propter descriptor + /////////////////////////////////////// + 0x84, 0x00, 0x00, 0x00, /* dwSize */ + 0x01, 0x00, 0x00, 0x00, /* dwPropertyDataType */ + 0x28, 0x00, /* wPropertyNameLength */ + /* DeviceInterfaceGUID */ + 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, /* wcName_20 */ + 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, /* wcName_20 */ + 't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00, /* wcName_20 */ + 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, /* wcName_20 */ + 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00, /* wcName_20 */ + 0x4e, 0x00, 0x00, 0x00, /* dwPropertyDataLength */ + /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */ + '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00, /* wcData_39 */ + 'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00, /* wcData_39 */ + '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00, /* wcData_39 */ + '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00, /* wcData_39 */ + '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00, /* wcData_39 */ + 'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00, /* wcData_39 */ + '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00, /* wcData_39 */ + 'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00, /* wcData_39 */ + 'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00, /* wcData_39 */ + '6', 0x00, '}', 0x00, 0x00, 0x00, /* wcData_39 */ +}; + +#if WINUSB_NUM == 2 +#define WINUSB_IF1_WCID_PROPERTIES_SIZE (142) +const uint8_t WINUSB_IF1_WCIDProperties[142] = { + /////////////////////////////////////// + /// WCID property descriptor + /////////////////////////////////////// + 0x8e, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x05, 0x00, /* wIndex */ + 0x01, 0x00, /* wCount */ + + /////////////////////////////////////// + /// registry propter descriptor + /////////////////////////////////////// + 0x84, 0x00, 0x00, 0x00, /* dwSize */ + 0x01, 0x00, 0x00, 0x00, /* dwPropertyDataType */ + 0x28, 0x00, /* wPropertyNameLength */ + /* DeviceInterfaceGUID */ + 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, /* wcName_20 */ + 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, /* wcName_20 */ + 't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00, /* wcName_20 */ + 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, /* wcName_20 */ + 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00, /* wcName_20 */ + 0x4e, 0x00, 0x00, 0x00, /* dwPropertyDataLength */ + /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */ + '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00, /* wcData_39 */ + 'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00, /* wcData_39 */ + '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00, /* wcData_39 */ + '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00, /* wcData_39 */ + '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00, /* wcData_39 */ + 'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00, /* wcData_39 */ + '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00, /* wcData_39 */ + 'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00, /* wcData_39 */ + 'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00, /* wcData_39 */ + '6', 0x00, '}', 0x00, 0x00, 0x00, /* wcData_39 */ +}; +#endif + +const uint8_t *WINUSB_IFx_WCIDProperties[] = { + WINUSB_IF0_WCIDProperties, +#if WINUSB_NUM == 2 + WINUSB_IF1_WCIDProperties, +#endif +}; + +struct usb_msosv1_descriptor msosv1_desc = { + .string = WCID_StringDescriptor_MSOS, + .vendor_code = WINUSB_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .comp_id_property = WINUSB_IFx_WCIDProperties, +}; + +#define WINUSB_IN_EP 0x81 +#define WINUSB_OUT_EP 0x02 + +#define USBD_VID 0xFFFE +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#if WINUSB_NUM == 1 +#define USB_CONFIG_SIZE (9 + 9 + 7 + 7) +#define INTF_NUM 1 +#else +#define WINUSB_IN_EP2 0x83 +#define WINUSB_OUT_EP2 0x04 + +#define USB_CONFIG_SIZE (9 + 9 + 7 + 7 + 9 + 7 + 7) +#define INTF_NUM 2 +#endif + +#ifdef CONFIG_USB_HS +#define WINUSB_EP_MPS 512 +#else +#define WINUSB_EP_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x04), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, 0x02, WINUSB_EP_MPS, 0x00), +#if WINUSB_NUM == 2 + USB_INTERFACE_DESCRIPTOR_INIT(0x01, 0x00, 0x02, 0xff, 0xff, 0x00, 0x05), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP2, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP2, 0x02, WINUSB_EP_MPS, 0x00), +#endif +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB WINUSB DEMO", /* Product */ + "2022123456", /* Serial Number */ + "CherryUSB WINUSB DEMO 1", /* STRING4 */ + "CherryUSB WINUSB DEMO 2", /* STRING5 */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 5) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor winusbv1_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .msosv1_descriptor = &msosv1_desc +}; +#else +const uint8_t winusbv1_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x04), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, 0x02, WINUSB_EP_MPS, 0x00), +#if WINUSB_NUM == 2 + USB_INTERFACE_DESCRIPTOR_INIT(0x01, 0x00, 0x02, 0xff, 0xff, 0x00, 0x05), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP2, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP2, 0x02, WINUSB_EP_MPS, 0x00), +#endif + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x2C, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'W', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'N', 0x00, /* wcChar12 */ + 'U', 0x00, /* wcChar13 */ + 'S', 0x00, /* wcChar14 */ + 'B', 0x00, /* wcChar15 */ + ' ', 0x00, /* wcChar16 */ + 'D', 0x00, /* wcChar17 */ + 'E', 0x00, /* wcChar18 */ + 'M', 0x00, /* wcChar19 */ + 'O', 0x00, /* wcChar20 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ + /////////////////////////////////////// + /// string4 descriptor + /////////////////////////////////////// + 0x30, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'W', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'N', 0x00, /* wcChar12 */ + 'U', 0x00, /* wcChar13 */ + 'S', 0x00, /* wcChar14 */ + 'B', 0x00, /* wcChar15 */ + ' ', 0x00, /* wcChar16 */ + 'D', 0x00, /* wcChar17 */ + 'E', 0x00, /* wcChar18 */ + 'M', 0x00, /* wcChar19 */ + 'O', 0x00, /* wcChar20 */ + ' ', 0x00, /* wcChar16 */ + '1', 0x00, /* wcChar21 */ + /////////////////////////////////////// + /// string5 descriptor + /////////////////////////////////////// + 0x30, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'W', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'N', 0x00, /* wcChar12 */ + 'U', 0x00, /* wcChar13 */ + 'S', 0x00, /* wcChar14 */ + 'B', 0x00, /* wcChar15 */ + ' ', 0x00, /* wcChar16 */ + 'D', 0x00, /* wcChar17 */ + 'E', 0x00, /* wcChar18 */ + 'M', 0x00, /* wcChar19 */ + 'O', 0x00, /* wcChar20 */ + ' ', 0x00, /* wcChar16 */ + '2', 0x00, /* wcChar21 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); +#if WINUSB_NUM == 2 + usbd_ep_start_read(busid, WINUSB_OUT_EP2, read_buffer, 2048); +#endif + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_winusb_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + usbd_ep_start_write(busid, WINUSB_IN_EP, read_buffer, nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); +} + +void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % WINUSB_EP_MPS) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, WINUSB_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +struct usbd_endpoint winusb_out_ep1 = { + .ep_addr = WINUSB_OUT_EP, + .ep_cb = usbd_winusb_out +}; + +struct usbd_endpoint winusb_in_ep1 = { + .ep_addr = WINUSB_IN_EP, + .ep_cb = usbd_winusb_in +}; + +struct usbd_interface intf0; + +#if WINUSB_NUM == 2 + +void usbd_winusb_out2(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + usbd_ep_start_write(busid, WINUSB_IN_EP2, read_buffer, nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP2, read_buffer, 2048); +} + +void usbd_winusb_in2(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, WINUSB_IN_EP2, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +struct usbd_endpoint winusb_out_ep2 = { + .ep_addr = WINUSB_OUT_EP2, + .ep_cb = usbd_winusb_out2 +}; + +struct usbd_endpoint winusb_in_ep2 = { + .ep_addr = WINUSB_IN_EP2, + .ep_cb = usbd_winusb_in2 +}; + +struct usbd_interface intf1; + +#endif + +void winusbv1_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &winusbv1_descriptor); +#else + usbd_desc_register(busid, winusbv1_descriptor); +#endif +#ifndef CONFIG_USBDEV_ADVANCE_DESC + usbd_msosv1_desc_register(busid, &msosv1_desc); +#endif + usbd_add_interface(busid, &intf0); + usbd_add_endpoint(busid, &winusb_out_ep1); + usbd_add_endpoint(busid, &winusb_in_ep1); +#if WINUSB_NUM == 2 + usbd_add_interface(busid, &intf1); + usbd_add_endpoint(busid, &winusb_out_ep2); + usbd_add_endpoint(busid, &winusb_in_ep2); +#endif + usbd_initialize(busid, reg_base, usbd_event_handler); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/winusb2.0_cdc_template.c b/src/lib/CherryUSB/demo/winusb2.0_cdc_template.c new file mode 100644 index 000000000..d83da498c --- /dev/null +++ b/src/lib/CherryUSB/demo/winusb2.0_cdc_template.c @@ -0,0 +1,360 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_cdc_acm.h" + +#define WINUSB_VENDOR_CODE 0x17 + +const uint8_t WINUSB_WCIDDescriptor[] = { + USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x00), +}; + +__ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[] = { + USB_BOS_HEADER_DESCRIPTOR_INIT(5 + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_LEN, 1), + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_INIT(WINUSB_VENDOR_CODE, sizeof(WINUSB_WCIDDescriptor)), +}; + +const struct usb_msosv2_descriptor msosv2_desc = { + .vendor_code = WINUSB_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .compat_id_len = sizeof(WINUSB_WCIDDescriptor), +}; + +const struct usb_bos_descriptor bos_desc = { + .string = USBD_BinaryObjectStoreDescriptor, + .string_len = sizeof(USBD_BinaryObjectStoreDescriptor), +}; + +#define WINUSB_IN_EP 0x81 +#define WINUSB_OUT_EP 0x02 + +#define CDC_IN_EP 0x83 +#define CDC_OUT_EP 0x04 +#define CDC_INT_EP 0x85 + +#define USBD_VID 0xFFFE +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 500 +#define USBD_LANGID_STRING 1033 + +#define USB_CONFIG_SIZE (9 + 9 + 7 + 7 + CDC_ACM_DESCRIPTOR_LEN) +#define INTF_NUM 3 + +#ifdef CONFIG_USB_HS +#define WINUSB_EP_MPS 512 +#else +#define WINUSB_EP_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + /* Configuration 0 */ + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + /* Interface 0 */ + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), + /* Endpoint OUT 2 */ + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), + /* Endpoint IN 1 */ + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, WINUSB_EP_MPS, 0x00) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x10, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB WINUSB DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor winusbv2_cdc_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .msosv2_descriptor = &msosv2_desc, + .bos_descriptor = &bos_desc +}; +#else +const uint8_t winusbv2_cdc_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + /* Configuration 0 */ + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + /* Interface 0 */ + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), + /* Endpoint OUT 2 */ + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), + /* Endpoint IN 1 */ + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, WINUSB_EP_MPS, 0x00), + /* String 0 (LANGID) */ + USB_LANGID_INIT(USBD_LANGID_STRING), + /* String 1 (Manufacturer) */ + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x2C, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'W', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'N', 0x00, /* wcChar12 */ + 'U', 0x00, /* wcChar13 */ + 'S', 0x00, /* wcChar14 */ + 'B', 0x00, /* wcChar15 */ + ' ', 0x00, /* wcChar16 */ + 'D', 0x00, /* wcChar17 */ + 'E', 0x00, /* wcChar18 */ + 'M', 0x00, /* wcChar19 */ + 'O', 0x00, /* wcChar20 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /* Device Qualifier */ + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x10, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + /* End */ + 0x00 +}; +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_winusb_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + usbd_ep_start_write(busid, WINUSB_IN_EP, read_buffer, nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); +} + +void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, WINUSB_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +void usbd_cdc_acm_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + usbd_ep_start_write(busid, CDC_IN_EP, read_buffer, nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); +} + +void usbd_cdc_acm_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +struct usbd_endpoint winusb_out_ep1 = { + .ep_addr = WINUSB_OUT_EP, + .ep_cb = usbd_winusb_out +}; + +struct usbd_endpoint winusb_in_ep1 = { + .ep_addr = WINUSB_IN_EP, + .ep_cb = usbd_winusb_in +}; + +static struct usbd_endpoint cdc_out_ep = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_out +}; + +static struct usbd_endpoint cdc_in_ep = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_in +}; + +struct usbd_interface winusb_intf; +struct usbd_interface intf1; +struct usbd_interface intf2; + +void winusbv2_cdc_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &winusbv2_cdc_descriptor); +#else + usbd_desc_register(busid, winusbv2_cdc_descriptor); +#endif +#ifndef CONFIG_USBDEV_ADVANCE_DESC + usbd_bos_desc_register(busid, &bos_desc); + usbd_msosv2_desc_register(busid, &msosv2_desc); +#endif + /*!< winusb */ + usbd_add_interface(busid, &winusb_intf); + usbd_add_endpoint(busid, &winusb_out_ep1); + usbd_add_endpoint(busid, &winusb_in_ep1); + + /*!< cdc acm */ + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf2)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +volatile uint8_t dtr_enable = 0; + +void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) +{ + if (dtr) { + dtr_enable = 1; + } else { + dtr_enable = 0; + } +} + +void cdc_acm_data_send_with_dtr_test(uint8_t busid) +{ + if (dtr_enable) { + memset(&write_buffer[10], 'a', 2038); + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048); + while (ep_tx_busy_flag) { + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/demo/winusb2.0_template.c b/src/lib/CherryUSB/demo/winusb2.0_template.c new file mode 100644 index 000000000..f6ed9590c --- /dev/null +++ b/src/lib/CherryUSB/demo/winusb2.0_template.c @@ -0,0 +1,416 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" + +#define WINUSB_VENDOR_CODE 0x17 + +#define WINUSB_NUM 1 + +// note that if device is composite device, you should use USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT +const uint8_t WINUSB_WCIDDescriptor[] = { +#if WINUSB_NUM == 1 + USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_LEN), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT(), +#else + USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + WINUSB_NUM * USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x00), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x01), +#endif +}; + +const uint8_t USBD_BinaryObjectStoreDescriptor[] = { + USB_BOS_HEADER_DESCRIPTOR_INIT(5 + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_LEN, 1), + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_INIT(WINUSB_VENDOR_CODE, sizeof(WINUSB_WCIDDescriptor)), +}; + +const struct usb_msosv2_descriptor msosv2_desc = { + .vendor_code = WINUSB_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .compat_id_len = sizeof(WINUSB_WCIDDescriptor), +}; + +const struct usb_bos_descriptor bos_desc = { + .string = USBD_BinaryObjectStoreDescriptor, + .string_len = sizeof(USBD_BinaryObjectStoreDescriptor), +}; + +#define WINUSB_IN_EP 0x81 +#define WINUSB_OUT_EP 0x02 + +#define USBD_VID 0xFFFE +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#if WINUSB_NUM == 1 +#define USB_CONFIG_SIZE (9 + 9 + 7 + 7) +#define INTF_NUM 1 +#else +#define WINUSB_IN_EP2 0x83 +#define WINUSB_OUT_EP2 0x04 + +#define USB_CONFIG_SIZE (9 + 9 + 7 + 7 + 9 + 7 + 7) +#define INTF_NUM 2 +#endif + +#ifdef CONFIG_USB_HS +#define WINUSB_EP_MPS 512 +#else +#define WINUSB_EP_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x04), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, 0x02, WINUSB_EP_MPS, 0x00), +#if WINUSB_NUM == 2 + USB_INTERFACE_DESCRIPTOR_INIT(0x01, 0x00, 0x02, 0xff, 0xff, 0x00, 0x05), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP2, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP2, 0x02, WINUSB_EP_MPS, 0x00), +#endif +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB WINUSB DEMO", /* Product */ + "2022123456", /* Serial Number */ + "CherryUSB WINUSB DEMO 1", /* STRING4 */ + "CherryUSB WINUSB DEMO 2", /* STRING5 */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 5) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor winusbv2_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .msosv2_descriptor = &msosv2_desc, + .bos_descriptor = &bos_desc, +}; +#else +const uint8_t winusbv2_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x04), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, 0x02, WINUSB_EP_MPS, 0x00), +#if WINUSB_NUM == 2 + USB_INTERFACE_DESCRIPTOR_INIT(0x01, 0x00, 0x02, 0xff, 0xff, 0x00, 0x05), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP2, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP2, 0x02, WINUSB_EP_MPS, 0x00), +#endif + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x2C, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'W', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'N', 0x00, /* wcChar12 */ + 'U', 0x00, /* wcChar13 */ + 'S', 0x00, /* wcChar14 */ + 'B', 0x00, /* wcChar15 */ + ' ', 0x00, /* wcChar16 */ + 'D', 0x00, /* wcChar17 */ + 'E', 0x00, /* wcChar18 */ + 'M', 0x00, /* wcChar19 */ + 'O', 0x00, /* wcChar20 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ + /////////////////////////////////////// + /// string4 descriptor + /////////////////////////////////////// + 0x30, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'W', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'N', 0x00, /* wcChar12 */ + 'U', 0x00, /* wcChar13 */ + 'S', 0x00, /* wcChar14 */ + 'B', 0x00, /* wcChar15 */ + ' ', 0x00, /* wcChar16 */ + 'D', 0x00, /* wcChar17 */ + 'E', 0x00, /* wcChar18 */ + 'M', 0x00, /* wcChar19 */ + 'O', 0x00, /* wcChar20 */ + ' ', 0x00, /* wcChar16 */ + '1', 0x00, /* wcChar21 */ + /////////////////////////////////////// + /// string5 descriptor + /////////////////////////////////////// + 0x30, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'W', 0x00, /* wcChar10 */ + 'I', 0x00, /* wcChar11 */ + 'N', 0x00, /* wcChar12 */ + 'U', 0x00, /* wcChar13 */ + 'S', 0x00, /* wcChar14 */ + 'B', 0x00, /* wcChar15 */ + ' ', 0x00, /* wcChar16 */ + 'D', 0x00, /* wcChar17 */ + 'E', 0x00, /* wcChar18 */ + 'M', 0x00, /* wcChar19 */ + 'O', 0x00, /* wcChar20 */ + ' ', 0x00, /* wcChar16 */ + '2', 0x00, /* wcChar21 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); +#if WINUSB_NUM == 2 + usbd_ep_start_read(busid, WINUSB_OUT_EP2, read_buffer, 2048); +#endif + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_winusb_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + usbd_ep_start_write(busid, WINUSB_IN_EP, read_buffer, nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); +} + +void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % WINUSB_EP_MPS) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, WINUSB_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +struct usbd_endpoint winusb_out_ep1 = { + .ep_addr = WINUSB_OUT_EP, + .ep_cb = usbd_winusb_out +}; + +struct usbd_endpoint winusb_in_ep1 = { + .ep_addr = WINUSB_IN_EP, + .ep_cb = usbd_winusb_in +}; + +struct usbd_interface intf0; + +#if WINUSB_NUM == 2 + +void usbd_winusb_out2(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + usbd_ep_start_write(busid, WINUSB_IN_EP2, read_buffer, nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP2, read_buffer, 2048); +} + +void usbd_winusb_in2(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, WINUSB_IN_EP2, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +struct usbd_endpoint winusb_out_ep2 = { + .ep_addr = WINUSB_OUT_EP2, + .ep_cb = usbd_winusb_out2 +}; + +struct usbd_endpoint winusb_in_ep2 = { + .ep_addr = WINUSB_IN_EP2, + .ep_cb = usbd_winusb_in2 +}; + +struct usbd_interface intf1; + +#endif + +void winusbv2_init(uint8_t busid, uintptr_t reg_base) +{ +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &winusbv2_descriptor); +#else + usbd_desc_register(busid, winusbv2_descriptor); +#endif +#ifndef CONFIG_USBDEV_ADVANCE_DESC + usbd_bos_desc_register(busid, &bos_desc); + usbd_msosv2_desc_register(busid, &msosv2_desc); +#endif + usbd_add_interface(busid, &intf0); + usbd_add_endpoint(busid, &winusb_out_ep1); + usbd_add_endpoint(busid, &winusb_in_ep1); +#if WINUSB_NUM == 2 + usbd_add_interface(busid, &intf1); + usbd_add_endpoint(busid, &winusb_out_ep2); + usbd_add_endpoint(busid, &winusb_in_ep2); +#endif + usbd_initialize(busid, reg_base, usbd_event_handler); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/.gitignore b/src/lib/CherryUSB/docs/.gitignore new file mode 100644 index 000000000..c809c12d6 --- /dev/null +++ b/src/lib/CherryUSB/docs/.gitignore @@ -0,0 +1 @@ +*build \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/Makefile b/src/lib/CherryUSB/docs/Makefile new file mode 100644 index 000000000..d0c3cbf10 --- /dev/null +++ b/src/lib/CherryUSB/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/src/lib/CherryUSB/docs/assets/actions.jpg b/src/lib/CherryUSB/docs/assets/actions.jpg new file mode 100644 index 000000000..46e349b36 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/actions.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/artinchip.jpg b/src/lib/CherryUSB/docs/assets/artinchip.jpg new file mode 100644 index 000000000..4d6ad5047 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/artinchip.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/bekencorp.jpg b/src/lib/CherryUSB/docs/assets/bekencorp.jpg new file mode 100644 index 000000000..54d4fbe81 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/bekencorp.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/bouffalolab.jpg b/src/lib/CherryUSB/docs/assets/bouffalolab.jpg new file mode 100644 index 000000000..dfb6884e5 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/bouffalolab.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/canaan.jpg b/src/lib/CherryUSB/docs/assets/canaan.jpg new file mode 100644 index 000000000..1e16c303e Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/canaan.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/eastsoft.jpg b/src/lib/CherryUSB/docs/assets/eastsoft.jpg new file mode 100644 index 000000000..d59c653ce Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/eastsoft.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/espressif.png b/src/lib/CherryUSB/docs/assets/espressif.png new file mode 100644 index 000000000..ba0a217a6 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/espressif.png differ diff --git a/src/lib/CherryUSB/docs/assets/hpmicro.jpg b/src/lib/CherryUSB/docs/assets/hpmicro.jpg new file mode 100644 index 000000000..1602c7d10 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/hpmicro.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/nationstech.jpg b/src/lib/CherryUSB/docs/assets/nationstech.jpg new file mode 100644 index 000000000..2c48f6b97 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/nationstech.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/nuvoton.jpg b/src/lib/CherryUSB/docs/assets/nuvoton.jpg new file mode 100644 index 000000000..f52d6ab5c Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/nuvoton.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/nxp.png b/src/lib/CherryUSB/docs/assets/nxp.png new file mode 100644 index 000000000..b48681e7f Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/nxp.png differ diff --git a/src/lib/CherryUSB/docs/assets/phytium.jpg b/src/lib/CherryUSB/docs/assets/phytium.jpg new file mode 100644 index 000000000..3f05db734 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/phytium.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/rtthread.jpg b/src/lib/CherryUSB/docs/assets/rtthread.jpg new file mode 100644 index 000000000..1a493602e Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/rtthread.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/sifli.jpg b/src/lib/CherryUSB/docs/assets/sifli.jpg new file mode 100644 index 000000000..a74cf7d3d Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/sifli.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/sophgo.jpg b/src/lib/CherryUSB/docs/assets/sophgo.jpg new file mode 100644 index 000000000..467837d15 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/sophgo.jpg differ diff --git a/src/lib/CherryUSB/docs/assets/thead.jpg b/src/lib/CherryUSB/docs/assets/thead.jpg new file mode 100644 index 000000000..791fe8716 Binary files /dev/null and b/src/lib/CherryUSB/docs/assets/thead.jpg differ diff --git a/src/lib/CherryUSB/docs/make.bat b/src/lib/CherryUSB/docs/make.bat new file mode 100644 index 000000000..6247f7e23 --- /dev/null +++ b/src/lib/CherryUSB/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/src/lib/CherryUSB/docs/requirements.txt b/src/lib/CherryUSB/docs/requirements.txt new file mode 100644 index 000000000..03cfbf106 --- /dev/null +++ b/src/lib/CherryUSB/docs/requirements.txt @@ -0,0 +1,9 @@ +# markdown suport +recommonmark +# markdown table suport +sphinx-markdown-tables + +# theme default rtd + +# crate-docs-theme +sphinx-rtd-theme \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/api/api_config.rst b/src/lib/CherryUSB/docs/source/api/api_config.rst new file mode 100644 index 000000000..6b2ed8eb1 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/api/api_config.rst @@ -0,0 +1,158 @@ +USB CONFIG 说明 +========================= + +通用 CONFIG +--------------------- + +CONFIG_USB_PRINTF +^^^^^^^^^^^^^^^^^^^^ + +USB log 功能,默认重定向到 printf,需要注意,USB log 会在中断中使用,因此重定向的 api 不允许阻塞。举例,如果使用的是 rt-thread,请更换成 rt-kprintf + +CONFIG_USB_DBG_LEVEL +^^^^^^^^^^^^^^^^^^^^^^ + +控制 log 的打印级别 + +CONFIG_USB_PRINTF_COLOR_ENABLE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +控制 log 颜色打印,默认开启 + +CONFIG_USB_ALIGN_SIZE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +USB buffer 的对齐大小,默认是 4。IP 在 dma 模式下可能对输入的 buffer有对齐要求,一般是4,如果是其他对齐方式,请修改此值。 + +USB_NOCACHE_RAM_SECTION +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +如果芯片没有 cache 功能,此宏无效。如果有,则 USB 的输入输出 buffer 必须放在 nocache ram 中,保证数据一致性。 + +设备协议栈 CONFIG +--------------------- + +CONFIG_USBDEV_REQUEST_BUFFER_LEN +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +控制传输接收和发送的 buffer 最大长度,默认是 512。 + +CONFIG_USBDEV_SETUP_LOG_PRINT +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +使能或者关闭 setup 包的 dump 信息,默认关闭。 + +CONFIG_USBDEV_DESC_CHECK +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +暂时没有实现 + +CONFIG_USBDEV_TEST_MODE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +使能或者关闭 usb test mode + +CONFIG_USBDEV_MSC_MAX_BUFSIZE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +msc 缓存的最大长度,缓存越大,USB 的速度越高,因为介质一般多个 block 读写速度比单个 block 高很多,比如 sd 卡。 +默认 512 ,如果是 flash 需要改成 4K, 缓存的大小需要是介质的一个 block size 的整数倍。 + +CONFIG_USBDEV_MSC_MANUFACTURER_STRING +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +CONFIG_USBDEV_MSC_PRODUCT_STRING +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +CONFIG_USBDEV_MSC_VERSION_STRING +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +CONFIG_USBDEV_MSC_POLLING +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +将 usbd_msc_sector_read 和 usbd_msc_sector_write 操作放在 while1 中运行,裸机下使用。 + +CONFIG_USBDEV_MSC_THREAD +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +使能或者关闭 msc 线程,默认关闭。usbd_msc_sector_read 和 usbd_msc_sector_write 默认是在中断中执行,所以如果开启了 os 建议开启此宏,那么, +usbd_msc_sector_read 和 usbd_msc_sector_write 就会在线程中执行。 + +CONFIG_USBDEV_MSC_PRIO +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +MSC 读写线程的优先级,默认是 4,数值越小,优先级越高 + +CONFIG_USBDEV_MSC_STACKSIZE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +MSC 读写线程的堆栈大小,默认 2K 字节 + +CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +rndis 控制传输最大接收和发送的长度,根据 RNDIS options list 决定最小长度,默认要大于等于 156 + +CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +rndis 以太网帧的最大长度,默认 1580 + +CONFIG_USBDEV_RNDIS_VENDOR_ID +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +CONFIG_USBDEV_RNDIS_VENDOR_DESC +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +CONFIG_USBDEV_RNDIS_USING_LWIP +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +rndis 与 lwip 接口的对接 + +主机协议栈 CONFIG +--------------------- + +以下参数决定了支持的最大外部hub数量,接口数,每个接口的端点数和 altsetting 数量,更改此值会影响 ram 的大小,建议根据实际情况更改。 + +.. code-block:: C + + #define CONFIG_USBHOST_MAX_RHPORTS 1 + #define CONFIG_USBHOST_MAX_EXTHUBS 1 + #define CONFIG_USBHOST_MAX_EHPORTS 4 + #define CONFIG_USBHOST_MAX_INTERFACES 6 + #define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 1 + #define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +以下参数决定了支持的 class 数目,更改此值会影响 ram 的大小,建议根据实际情况更改。 + +.. code-block:: C + + #define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 + #define CONFIG_USBHOST_MAX_HID_CLASS 4 + #define CONFIG_USBHOST_MAX_MSC_CLASS 2 + #define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 + #define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +CONFIG_USBHOST_PSC_PRIO +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +主机插拔线程的优先级,默认是 0,数值越小,优先级越高 + +CONFIG_USBHOST_PSC_STACKSIZE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +主机插拔线程的堆栈大小,默认 2K 字节 + +CONFIG_USBHOST_REQUEST_BUFFER_LEN +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +控制传输能够接收或者发送的最大长度 + +CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +控制传输发送或者接收的超时时间,默认 1s + +CONFIG_USBHOST_MSC_TIMEOUT +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +MSC 读写传输的超时时间,默认 5s \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/api/api_device.rst b/src/lib/CherryUSB/docs/source/api/api_device.rst new file mode 100644 index 000000000..29c2b4380 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/api/api_device.rst @@ -0,0 +1,483 @@ +设备协议栈 +========================= + +设备协议栈主要负责枚举和驱动加载,枚举这边就不说了,驱动加载,也就是接口驱动加载,主要是依靠 `usbd_add_interface` 函数,用于记录传入的接口驱动并保存到接口数组表,当主机进行类请求时就可以查找接口表进行访问了。 +在调用 `usbd_desc_register` 以后需要进行接口注册和端点注册,口诀如下: + +- 有多少个接口就调用多少次 `usbd_add_interface`,参数填相关 `xxx_init_intf`, 如果没有支持的,手动创建一个 intf 填入 +- 有多少个端点就调用多少次 `usbd_add_endpoint`,当中断完成时,会调用到注册的端点回调中。 + +参考下面这张图: + +.. figure:: img/api_device1.png + +CORE +----------------- + +.. note:: 请注意,v1.1 版本开始增加 busid 形参,其余保持不变,所以 API 说明不做更新 + +端点结构体 +"""""""""""""""""""""""""""""""""""" + +端点结构体主要用于注册不同端点地址的中断完成回调函数。 + +.. code-block:: C + + struct usbd_endpoint { + uint8_t ep_addr; + usbd_endpoint_callback ep_cb; + }; + +- **list** 端点的链表节点 +- **ep_addr** 端点地址(带方向) +- **ep_cb** 端点完成中断回调函数。 + +.. note:: 总结一句话:in 回调函数等价于 dma 发送完成中断回调函数;out 回调函数等价于 dma 接收完成中断回调函数 + +接口结构体 +"""""""""""""""""""""""""""""""""""" + +接口结构体主要用于注册不同类设备除了标准设备请求外的其他请求,包括类设备请求、厂商设备请求和自定义设备请求。以及协议栈中的相关通知回调函数。 + +.. code-block:: C + + struct usbd_interface { + usbd_request_handler class_interface_handler; + usbd_request_handler class_endpoint_handler; + usbd_request_handler vendor_handler; + usbd_notify_handler notify_handler; + const uint8_t *hid_report_descriptor; + uint32_t hid_report_descriptor_len; + uint8_t intf_num; + }; + +- **class_interface_handler** class setup 请求回调函数,接收者为接口 +- **class_endpoint_handler** class setup 请求回调函数,接收者为端点 +- **vendor_handler** vendor setup 请求回调函数 +- **notify_handler** 中断标志、协议栈相关状态回调函数 +- **hid_report_descriptor** hid 报告描述符 +- **hid_report_descriptor_len** hid 报告描述符长度 +- **intf_num** 当前接口偏移 +- **ep_list** 端点的链表节点 + +usbd_desc_register +"""""""""""""""""""""""""""""""""""" + +``usbd_desc_register`` 用来注册 USB 描述符,描述符种类包括:设备描述符、配置描述符(包含配置描述符、接口描述符、class 类描述符、端点描述符)、字符串描述符、设备限定描述符。 + +.. code-block:: C + + void usbd_desc_register(const uint8_t *desc); + +- **desc** 描述符的句柄 + +.. note:: 当前 API 仅支持一种速度,如果需要更高级的速度切换功能,请开启 CONFIG_USBDEV_ADVANCE_DESC,并且包含了下面所有描述符注册功能 + + +usbd_msosv1_desc_register +"""""""""""""""""""""""""""""""""""" + +``usbd_msosv1_desc_register`` 用来注册一个 WINUSB 1.0 描述符。 + +.. code-block:: C + + void usbd_msosv1_desc_register(struct usb_msosv1_descriptor *desc); + +- **desc** 描述符句柄 + +usbd_msosv2_desc_register +"""""""""""""""""""""""""""""""""""" + +``usbd_msosv2_desc_register`` 用来注册一个 WINUSB 2.0 描述符。 + +.. code-block:: C + + void usbd_msosv2_desc_register(struct usb_msosv2_descriptor *desc); + +- **desc** 描述符句柄 + +usbd_bos_desc_register +"""""""""""""""""""""""""""""""""""" + +``usbd_bos_desc_register`` 用来注册一个 BOS 描述符, USB 2.1 版本以上必须注册。 + +.. code-block:: C + + void usbd_bos_desc_register(struct usb_bos_descriptor *desc); + +- **desc** 描述符句柄 + +usbd_add_interface +"""""""""""""""""""""""""""""""""""" + +``usbd_add_interface`` 添加一个接口驱动。 **添加顺序必须按照描述符顺序**。 + +.. code-block:: C + + void usbd_add_interface(struct usbd_interface *intf); + +- **intf** 接口驱动句柄,通常从不同 class 的 `xxx_init_intf` 函数获取 + +usbd_add_endpoint +"""""""""""""""""""""""""""""""""""" + +``usbd_add_endpoint`` 添加一个端点中断完成回调函数。 + +.. code-block:: C + + void usbd_add_endpoint(struct usbd_endpoint *ep);; + +- **ep** 端点句柄 + +usbd_initialize +"""""""""""""""""""""""""""""""""""" + +``usbd_initialize`` 用来初始化 usb device 寄存器配置、usb 时钟、中断等,需要注意,此函数必须在所有列出的 API 最后。 **如果使用 os,必须放在线程中执行**。 + +.. code-block:: C + + int usbd_initialize(void); + +usbd_event_handler +"""""""""""""""""""""""""""""""""""" + +``usbd_event_handler`` 是协议栈中中断或者协议栈一些状态的回调函数。大部分 IP 仅支持 USBD_EVENT_RESET 和 USBD_EVENT_CONFIGURED + +.. code-block:: C + + void usbd_event_handler(uint8_t event); + +CDC ACM +----------------- + +usbd_cdc_acm_init_intf +"""""""""""""""""""""""""""""""""""" + +``usbd_cdc_acm_init_intf`` 用来初始化 USB CDC ACM 类接口,并实现该接口相关的函数。 + +- ``cdc_acm_class_interface_request_handler`` 用来处理 USB CDC ACM 类 Setup 请求。 +- ``cdc_notify_handler`` 用来处理 USB CDC 其他中断回调函数。 + +.. code-block:: C + + struct usbd_interface *usbd_cdc_acm_init_intf(struct usbd_interface *intf); + +- **return** 接口句柄 + +usbd_cdc_acm_set_line_coding +"""""""""""""""""""""""""""""""""""" + +``usbd_cdc_acm_set_line_coding`` 用来对串口进行配置,如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。 + +.. code-block:: C + + void usbd_cdc_acm_set_line_coding(uint8_t intf, struct cdc_line_coding *line_coding); + +- **intf** 控制接口号 +- **line_coding** 串口配置 + +usbd_cdc_acm_get_line_coding +"""""""""""""""""""""""""""""""""""" + +``usbd_cdc_acm_get_line_coding`` 用来获取串口进行配置,如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。 + +.. code-block:: C + + void usbd_cdc_acm_get_line_coding(uint8_t intf, struct cdc_line_coding *line_coding); + +- **intf** 控制接口号 +- **line_coding** 串口配置 + +usbd_cdc_acm_set_dtr +"""""""""""""""""""""""""""""""""""" + +``usbd_cdc_acm_set_dtr`` 用来控制串口 DTR 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。 + +.. code-block:: C + + void usbd_cdc_acm_set_dtr(uint8_t intf, bool dtr); + +- **intf** 控制接口号 +- **dtr** dtr 为1表示拉低电平,为0表示拉高电平 + +usbd_cdc_acm_set_rts +"""""""""""""""""""""""""""""""""""" + +``usbd_cdc_acm_set_rts`` 用来控制串口 RTS 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。 + +.. code-block:: C + + void usbd_cdc_acm_set_rts(uint8_t intf, bool rts); + +- **intf** 控制接口号 +- **rts** rts 为1表示拉低电平,为0表示拉高电平 + +CDC_ACM_DESCRIPTOR_INIT +"""""""""""""""""""""""""""""""""""" + +``CDC_ACM_DESCRIPTOR_INIT`` 配置了默认的 cdc acm 需要的描述符以及参数,方便用户使用。总长度为 `CDC_ACM_DESCRIPTOR_LEN` 。 + +.. code-block:: C + + CDC_ACM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, str_idx); + +- **bFirstInterface** 表示该 cdc acm 第一个接口所在所有接口的偏移 +- **int_ep** 表示中断端点地址(带方向) +- **out_ep** 表示 bulk out 端点地址(带方向) +- **in_ep** 表示 bulk in 端点地址(带方向) +- **str_idx** 控制接口对应的字符串 id + +HID +----------------- + +usbd_hid_init_intf +"""""""""""""""""""""""""""""""""""" + +``usbd_hid_init_intf`` 用来初始化 USB HID 类接口,并实现该接口相关的函数: + +- ``hid_class_interface_request_handler`` 用来处理 USB HID 类的 Setup 请求。 +- ``hid_notify_handler`` 用来处理 USB HID 其他中断回调函数。 + +.. code-block:: C + + struct usbd_interface *usbd_hid_init_intf(struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len); + +- **desc** 报告描述符 +- **desc_len** 报告描述符长度 + +MSC +----------------- + +usbd_msc_init_intf +"""""""""""""""""""""""""""""""""""" +``usbd_msc_init_intf`` 用来初始化 MSC 类接口,并实现该接口相关函数,并且注册端点回调函数。(因为 msc bot 协议是固定的,所以不需要用于实现,因此端点回调函数自然不需要用户实现)。 + +- ``msc_storage_class_interface_request_handler`` 用于处理 USB MSC Setup 中断请求。 +- ``msc_storage_notify_handler`` 用于实现 USB MSC 其他中断回调函数。 + +- ``mass_storage_bulk_out`` 用于处理 USB MSC 端点 out 中断。 +- ``mass_storage_bulk_in`` 用于处理 USB MSC 端点 in 中断。 + +.. code-block:: C + + struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uint8_t out_ep, const uint8_t in_ep); + +- **out_ep** out 端点地址 +- **in_ep** in 端点地址 + +usbd_msc_get_cap +"""""""""""""""""""""""""""""""""""" + +``usbd_msc_get_cap`` 用来获取存储器的 lun、扇区个数和每个扇区大小。用户必须实现该函数。 + +.. code-block:: C + + void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size); + +- **lun** 存储逻辑单元,暂时无用,默认支持一个 +- **block_num** 存储扇区个数 +- **block_size** 存储扇区大小 + +usbd_msc_sector_read +"""""""""""""""""""""""""""""""""""" + +``usbd_msc_sector_read`` 用来对存储器某个扇区开始的地址进行数据读取。用户必须实现该函数。 + +.. code-block:: C + + int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length); + +- **sector** 扇区偏移 +- **buffer** 存储读取的数据的指针 +- **length** 读取长度 + + +usbd_msc_sector_write +"""""""""""""""""""""""""""""""""""" + +``usbd_msc_sector_write`` 用来对存储器某个扇区开始写入数据。用户必须实现该函数。 + +.. code-block:: C + + int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length); + +- **sector** 扇区偏移 +- **buffer** 写入数据指针 +- **length** 写入长度 + +UAC +----------------- + +usbd_audio_init_intf +"""""""""""""""""""""""""""""""""""" +``usbd_audio_init_intf`` 用来初始化 USB Audio 类接口,并实现该接口相关的函数: + +- ``audio_class_interface_request_handler`` 用于处理 USB Audio Setup 接口接收者中断请求。 +- ``audio_class_endpoint_request_handler`` 用于处理 USB Audio Setup 端点接收者中断请求。 +- ``audio_notify_handler`` 用于实现 USB Audio 其他中断回调函数。 + +.. code-block:: C + + struct usbd_interface *usbd_audio_init_intf(struct usbd_interface *intf); + +- **class** 类的句柄 +- **intf** 接口句柄 + +usbd_audio_open +"""""""""""""""""""""""""""""""""""" + +``usbd_audio_open`` 用来开启音频数据传输。 + +.. code-block:: C + + void usbd_audio_open(uint8_t intf); + +- **intf** 开启的接口号 + +usbd_audio_close +"""""""""""""""""""""""""""""""""""" + +``usbd_audio_close`` 用来关闭音频数据传输。 + +.. code-block:: C + + void usbd_audio_close(uint8_t intf); + +- **intf** 关闭的接口号 + +usbd_audio_add_entity +"""""""""""""""""""""""""""""""""""" + +``usbd_audio_add_entity`` 用来添加 unit 相关控制,例如 feature unit、clock source。 + +.. code-block:: C + + void usbd_audio_add_entity(uint8_t entity_id, uint16_t bDescriptorSubtype); + +- **entity_id** 要添加的 unit id +- **bDescriptorSubtype** entity_id 的描述符子类型 + +usbd_audio_set_mute +"""""""""""""""""""""""""""""""""""" + +``usbd_audio_set_mute`` 用来设置静音。 + +.. code-block:: C + + void usbd_audio_set_mute(uint8_t ch, uint8_t enable); + +- **ch** 要设置静音的通道 +- **enable** 为1 表示静音,0相反 + +usbd_audio_set_volume +"""""""""""""""""""""""""""""""""""" + +``usbd_audio_set_volume`` 用来设置音量。 + +.. code-block:: C + + void usbd_audio_set_volume(uint8_t ch, float dB); + +- **ch** 要设置音量的通道 +- **dB** 要设置音量的分贝,其中 UAC1.0范围从 -127 ~ +127dB,UAC2.0 从 0 ~ 256dB + +usbd_audio_set_sampling_freq +"""""""""""""""""""""""""""""""""""" + +``usbd_audio_set_sampling_freq`` 用来设置设备上音频模块的采样率 + +.. code-block:: C + + void usbd_audio_set_sampling_freq(uint8_t ep_ch, uint32_t sampling_freq); + +- **ch** 要设置采样率的端点或者通道,UAC1.0为端点,UAC2.0 为通道 +- **dB** 要设置的采样率 + +usbd_audio_get_sampling_freq_table +"""""""""""""""""""""""""""""""""""" + +``usbd_audio_get_sampling_freq_table`` 用来获取支持的采样率列表,如果函数没有实现,则使用默认采样率列表。 + +.. code-block:: C + + void usbd_audio_get_sampling_freq_table(uint8_t **sampling_freq_table); + +- **sampling_freq_table** 采样率列表地址,格式参考默认采样率列表 + +usbd_audio_set_pitch +"""""""""""""""""""""""""""""""""""" + +``usbd_audio_set_pitch`` 用来设置音频音调,仅 UAC1.0 有这功能。 + +.. code-block:: C + + void usbd_audio_set_pitch(uint8_t ep, bool enable); + +- **ep** 要设置音调的端点 +- **enable** 开启或关闭音调 + +UVC +----------------- + +usbd_video_init_intf +"""""""""""""""""""""""""""""""""""" +``usbd_video_init_intf`` 用来初始化 USB Video 类接口,并实现该接口相关的函数: + +- ``video_class_interface_request_handler`` 用于处理 USB Video Setup 中断请求。 +- ``video_notify_handler`` 用于实现 USB Video 其他中断回调函数。 + +.. code-block:: C + + struct usbd_interface *usbd_video_init_intf(struct usbd_interface *intf, + uint32_t dwFrameInterval, + uint32_t dwMaxVideoFrameSize, + uint32_t dwMaxPayloadTransferSize); + +- **class** 类的句柄 +- **intf** 接口句柄 + +usbd_video_open +"""""""""""""""""""""""""""""""""""" + +``usbd_video_open`` 用来开启视频数据传输。 + +.. code-block:: C + + void usbd_video_open(uint8_t intf); + +- **intf** 开启的接口号 + +usbd_video_close +"""""""""""""""""""""""""""""""""""" + +``usbd_video_close`` 用来关闭视频数据传输。 + +.. code-block:: C + + void usbd_video_open(uint8_t intf); + +- **intf** 关闭的接口号 + +usbd_video_payload_fill +"""""""""""""""""""""""""""""""""""" + +``usbd_video_payload_fill`` 用来填充 mjpeg 到新的 buffer中,其中会对 mjpeg 数据按帧进行切分,切分大小由 ``dwMaxPayloadTransferSize`` 控制,并添加头部信息,当前头部字节数为 2。头部信息见 ``struct video_mjpeg_payload_header`` + +.. code-block:: C + + uint32_t usbd_video_payload_fill(uint8_t *input, uint32_t input_len, uint8_t *output, uint32_t *out_len); + +- **input** mjpeg 格式的数据包,从 FFD8~FFD9结束 +- **input_len** mjpeg数据包大小 +- **output** 输出缓冲区 +- **out_len** 输出实际要发送的长度大小 +- **return** 返回 usb 按照 ``dwMaxPayloadTransferSize`` 大小要发多少帧 + +DFU +----------------- + +PRINTER +----------------- + +MTP +----------------- \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/api/api_host.rst b/src/lib/CherryUSB/docs/source/api/api_host.rst new file mode 100644 index 000000000..3368f47f5 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/api/api_host.rst @@ -0,0 +1,166 @@ +主机协议栈 +========================= + +关于主机协议栈中结构体的命名、分类、成员组成,参考下面这两张图: + +.. figure:: img/api_host1.png +.. figure:: img/api_host2.png + +CORE +----------------- + +CLASS 驱动信息结构体 +"""""""""""""""""""""""""""""""""""" + +.. code-block:: C + + struct usbh_class_info { + uint8_t match_flags; /* Used for product specific matches; range is inclusive */ + uint8_t bInterfaceClass; /* Base device class code */ + uint8_t bInterfaceSubClass; /* Sub-class, depends on base class. Eg. */ + uint8_t bInterfaceProtocol; /* Protocol, depends on base class. Eg. */ + const uint16_t (*id_table)[2]; /* List of Vendor/Product ID pairs */ + const struct usbh_class_driver *class_driver; + }; + +端点结构体 +"""""""""""""""""""""""""""""""""""" + +.. code-block:: C + + struct usbh_endpoint { + struct usb_endpoint_descriptor ep_desc; + }; + +接口备用结构体 +"""""""""""""""""""""""""""""""""""" + +.. code-block:: C + + struct usbh_interface_altsetting { + struct usb_interface_descriptor intf_desc; + struct usbh_endpoint ep[CONFIG_USBHOST_MAX_ENDPOINTS]; + }; + +接口结构体 +"""""""""""""""""""""""""""""""""""" + +.. code-block:: C + + struct usbh_interface { + char devname[CONFIG_USBHOST_DEV_NAMELEN]; + struct usbh_class_driver *class_driver; + void *priv; + struct usbh_interface_altsetting altsetting[CONFIG_USBHOST_MAX_INTF_ALTSETTINGS]; + uint8_t altsetting_num; + }; + +配置结构体 +"""""""""""""""""""""""""""""""""""" + +.. code-block:: C + + struct usbh_configuration { + struct usb_configuration_descriptor config_desc; + struct usbh_interface intf[CONFIG_USBHOST_MAX_INTERFACES]; + }; + +hubport 结构体 +"""""""""""""""""""""""""""""""""""" + +.. code-block:: C + + struct usbh_hubport { + bool connected; /* True: device connected; false: disconnected */ + uint8_t port; /* Hub port index */ + uint8_t dev_addr; /* device address */ + uint8_t speed; /* device speed */ + uint8_t depth; /* distance from root hub */ + uint8_t route; /* route string */ + uint8_t slot_id; /* slot id */ + struct usb_device_descriptor device_desc; + struct usbh_configuration config; + const char *iManufacturer; + const char *iProduct; + const char *iSerialNumber; + uint8_t *raw_config_desc; + struct usb_setup_packet *setup; + struct usbh_hub *parent; + struct usbh_hub *self; /* if this hubport is a hub */ + struct usbh_bus *bus; + struct usb_endpoint_descriptor ep0; + struct usbh_urb ep0_urb; + usb_osal_mutex_t mutex; + }; + +hub 结构体 +"""""""""""""""""""""""""""""""""""" + +.. code-block:: C + + struct usbh_hub { + bool connected; + bool is_roothub; + uint8_t index; + uint8_t hub_addr; + uint8_t speed; + uint8_t nports; + uint8_t powerdelay; + uint8_t tt_think; + bool ismtt; + struct usb_hub_descriptor hub_desc; /* USB 2.0 only */ + struct usb_hub_ss_descriptor hub_ss_desc; /* USB 3.0 only */ + struct usbh_hubport child[CONFIG_USBHOST_MAX_EHPORTS]; + struct usbh_hubport *parent; + struct usbh_bus *bus; + struct usb_endpoint_descriptor *intin; + struct usbh_urb intin_urb; + uint8_t *int_buffer; + struct usb_osal_timer *int_timer; + }; + +usbh_initialize +"""""""""""""""""""""""""""""""""""" + +``usbh_initialize`` 用来初始化 usb 主机协议栈,包括:初始化 usb 主机控制器,创建 roothub 设备,创建 hub 检测线程。 + +.. code-block:: C + + int usbh_initialize(uint8_t busid, uint32_t reg_base); + +- **busid** bus id,从 0开始,不能超过 `CONFIG_USBHOST_MAX_BUS` +- **reg_base** hcd 寄存器基地址 +- **return** 0 表示正常其他表示错误 + +usbh_find_class_instance +"""""""""""""""""""""""""""""""""""" + +``usbh_find_class_instance`` 根据注册的 class 名称查找对应的 class 结构体句柄。 + +.. code-block:: C + + void *usbh_find_class_instance(const char *devname); + +- **devname** class 名称 +- **return** class 结构体句柄 + +lsusb +"""""""""""""""""""""""""""""""""""" + +``lsusb`` 用来查看和操作 hub 上的设备信息。需要借助 shell 插件使用。 + +.. code-block:: C + + int lsusb(int argc, char **argv); + +CDC ACM +----------------- + +HID +----------------- + +MSC +----------------- + +RNDIS +----------------- \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/api/api_port.rst b/src/lib/CherryUSB/docs/source/api/api_port.rst new file mode 100644 index 000000000..c214daa70 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/api/api_port.rst @@ -0,0 +1,266 @@ +主从驱动 +========================= + +.. note:: 请注意,v1.1 版本开始增加 busid 形参,其余保持不变,所以 API 说明不做更新 + +device controller(dcd) +------------------------- + +usb_dc_init +"""""""""""""""""""""""""""""""""""" + +``usb_dc_init`` 用于初始化 usb device controller 寄存器,设置 usb 引脚、时钟、中断等等。 **此函数不对用户开放**。 + +.. code-block:: C + + int usb_dc_init(void); + +- **return** 返回 0 表示正确,其他表示错误 + +usb_dc_deinit +"""""""""""""""""""""""""""""""""""" + +``usb_dc_deinit`` 用于反初始化 usb device controller 寄存器。 **此函数不对用户开放**。 + +.. code-block:: C + + int usb_dc_deinit(void); + +- **return** 返回 0 表示正确,其他表示错误 + +usbd_set_address +"""""""""""""""""""""""""""""""""""" + +``usbd_set_address`` 设置设备地址。 **此函数不对用户开放**。 + +.. code-block:: C + + int usbd_set_address(const uint8_t addr); + +- **addr** 设备地址 +- **return** 返回 0 表示正确,其他表示错误 + +usbd_ep_open +"""""""""""""""""""""""""""""""""""" + +``usbd_ep_open`` 设置端点的属性,开启对应端点的中断。 **此函数不对用户开放**。 + +.. code-block:: C + + int usbd_ep_open(const struct usb_endpoint_descriptor *ep); + +- **ep** 端点描述符 +- **return** 返回 0 表示正确,其他表示错误 + +usbd_ep_close +"""""""""""""""""""""""""""""""""""" + +``usbd_ep_close`` 关闭端点。 **此函数不对用户开放**。 + +.. code-block:: C + + int usbd_ep_close(const uint8_t ep); + +- **ep** 端点地址 +- **return** 返回 0 表示正确,其他表示错误 + +usbd_ep_set_stall +"""""""""""""""""""""""""""""""""""" + +``usbd_ep_set_stall`` 将端点设置成 stall 状态并发送 stall 握手包。 **此函数对用户开放**。 + +.. code-block:: C + + int usbd_ep_set_stall(const uint8_t ep); + +- **ep** 端点地址 +- **return** 返回 0 表示正确,其他表示错误 + +usbd_ep_clear_stall +"""""""""""""""""""""""""""""""""""" + +``usbd_ep_clear_stall`` 清除端点的 stall 状态。 **此函数不对用户开放**。 + +.. code-block:: C + + int usbd_ep_clear_stall(const uint8_t ep); + +- **ep** 端点地址 +- **return** 返回 0 表示正确,其他表示错误 + +usbd_ep_is_stalled +"""""""""""""""""""""""""""""""""""" + +``usbd_ep_is_stalled`` 读取当前端点的 stall 状态。 **此函数不对用户开放**。 + +.. code-block:: C + + int usbd_ep_is_stalled(const uint8_t ep, uint8_t *stalled); + +- **ep** 端点地址 +- **return** 返回 1 表示 stalled,0 表示没有 stall + +usbd_ep_start_write +"""""""""""""""""""""""""""""""""""" + +``usbd_ep_start_write`` 启动端点发送,发送完成以后,会调用注册的 in 端点传输完成中断回调函数。该函数为异步发送。 **此函数对用户开放**。 + +.. code-block:: C + + int usbd_ep_start_write(const uint8_t ep, const uint8_t *data, uint32_t data_len); + +- **ep** in 端点地址 +- **data** 发送数据缓冲区 +- **data_len** 发送长度,原则上无限长,推荐 16K 字节以内 +- **return** 返回 0 表示正确,其他表示错误 + +usbd_ep_start_read +"""""""""""""""""""""""""""""""""""" + +``usbd_ep_start_read`` 启动端点接收,接收完成以后,会调用注册的 out 端点传输完成中断回调函数。该函数为异步接收。 **此函数对用户开放**。 + +.. code-block:: C + + int usbd_ep_start_read(const uint8_t ep, uint8_t *data, uint32_t data_len); + +- **ep** out 端点地址 +- **data** 接收数据缓冲区 +- **data_len** 接收长度,原则上无限长,推荐 16K 字节以内,并且推荐是最大包长的整数倍 +- **return** 返回 0 表示正确,其他表示错误 + +.. note:: 启动接收以后,以下两种情况,会进入传输完成中断:1、最后一包为短包(小于 EP MPS);2、接收总长度等于 data_len + +.. note:: 对于 bulk 传输,data_len 通常设计为 EP MPS,以下三种情况可以修改为多个 EP MPS: 固定长度;自定义协议并携带长度(MSC); 主机手动发送 ZLP 或者短包(RNDIS) + +host controller(hcd) +------------------------ + +usb_hc_init +"""""""""""""""""""""""""""""""""""" + +``usb_hc_init`` 用于初始化 usb host controller 寄存器,设置 usb 引脚、时钟、中断等等。 **此函数不对用户开放**。 + +.. code-block:: C + + int usb_hc_init(void); + +- **return** 返回 0 表示正确,其他表示错误 + +usb_hc_deinit +"""""""""""""""""""""""""""""""""""" + +``usb_hc_deinit`` 用于反初始化 usb host controller 寄存器。 **此函数不对用户开放**。 + +.. code-block:: C + + int usb_hc_deinit(void); + +- **return** 返回 0 表示正确,其他表示错误 + +usbh_roothub_control +"""""""""""""""""""""""""""""""""""" + +``usbh_roothub_control`` 用来对 roothub 发起请求, **此函数不对用户开放**。 + +.. code-block:: C + + int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf); + +- **setup** 请求 +- **buf** 接收缓冲区 +- **return** 返回 0 表示正确,其他表示错误 + +usbh_submit_urb +"""""""""""""""""""""""""""""""""""" + +``usbh_submit_urb`` 对某个地址上的端点进行数据请求。 **此函数对用户开放**。 + +.. code-block:: C + + int usbh_submit_urb(struct usbh_urb *urb); + +- **urb** usb 请求块 +- **return** 返回 0 表示正确,其他表示错误 + +其中, `urb` 结构体信息如下: + +.. code-block:: C + + struct usbh_urb { + usb_slist_t list; + void *hcpriv; + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *ep; + uint8_t data_toggle; + uint8_t interval; + struct usb_setup_packet *setup; + uint8_t *transfer_buffer; + uint32_t transfer_buffer_length; + int transfer_flags; + uint32_t actual_length; + uint32_t timeout; + int errorcode; + uint32_t num_of_iso_packets; + uint32_t start_frame; + usbh_complete_callback_t complete; + void *arg; + #if defined(__ICCARM__) || defined(__ICCRISCV__) || defined(__ICCRX__) + struct usbh_iso_frame_packet *iso_packet; + #else + struct usbh_iso_frame_packet iso_packet[0]; + #endif + }; + +- **hcpriv** 主机控制器驱动私有成员 +- **hport** 当前 urb 使用的 hport +- **ep** 当前 urb 使用的 ep +- **data_toggle** 当前 data toggle +- **interval** urb 传输间隔,单位 us,如果 interval 大于 1000us,则需要使用软件定时器来维护 +- **setup** setup 请求缓冲区,端点0使用 +- **transfer_buffer** 传输的数据缓冲区 +- **transfer_buffer_length** 传输长度 +- **transfer_flags** 传输时携带的 flag +- **actual_length** 实际传输长度 +- **timeout** 传输超时时间,为 0 该函数则为非阻塞,可在中断中使用 +- **errorcode** 错误码 +- **num_of_iso_packets** iso 帧或者微帧个数 +- **complete** 传输完成回调函数 +- **arg** 传输完成时携带的参数 +- **iso_packet** iso 数据包 + +.. note:: timeout 如何没有特别对时间的要求,必须设置成 0xffffffff,原则上不允许超时,如果超时了,一般不能再继续工作 + +`errorcode` 可以返回以下值: + +.. code-block:: C + + #define USB_ERR_NOMEM 1 + #define USB_ERR_INVAL 2 + #define USB_ERR_NODEV 3 + #define USB_ERR_NOTCONN 4 + #define USB_ERR_NOTSUPP 5 + #define USB_ERR_BUSY 6 + #define USB_ERR_RANGE 7 + #define USB_ERR_STALL 8 + #define USB_ERR_BABBLE 9 + #define USB_ERR_NAK 10 + #define USB_ERR_DT 11 + #define USB_ERR_IO 12 + #define USB_ERR_SHUTDOWN 13 + #define USB_ERR_TIMEOUT 14 + +其中 `iso_packet` 结构体信息如下: + +.. code-block:: C + + struct usbh_iso_frame_packet { + uint8_t *transfer_buffer; + uint32_t transfer_buffer_length; + uint32_t actual_length; + int errorcode; + }; + +- **transfer_buffer** 传输的数据缓冲区 +- **transfer_buffer_length** 传输长度 +- **actual_length** 实际传输长度 +- **errorcode** 错误码 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/api/img/api_device1.png b/src/lib/CherryUSB/docs/source/api/img/api_device1.png new file mode 100644 index 000000000..ba218b656 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/api/img/api_device1.png differ diff --git a/src/lib/CherryUSB/docs/source/api/img/api_host1.png b/src/lib/CherryUSB/docs/source/api/img/api_host1.png new file mode 100644 index 000000000..82932f50c Binary files /dev/null and b/src/lib/CherryUSB/docs/source/api/img/api_host1.png differ diff --git a/src/lib/CherryUSB/docs/source/api/img/api_host2.png b/src/lib/CherryUSB/docs/source/api/img/api_host2.png new file mode 100644 index 000000000..7f6d60b87 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/api/img/api_host2.png differ diff --git a/src/lib/CherryUSB/docs/source/class/class_audio.rst b/src/lib/CherryUSB/docs/source/class/class_audio.rst new file mode 100644 index 000000000..d1a9e2076 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/class/class_audio.rst @@ -0,0 +1,4 @@ +UAC +========================= + +参考官方 audio 相关 pdf \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/class/class_cdc.rst b/src/lib/CherryUSB/docs/source/class/class_cdc.rst new file mode 100644 index 000000000..d3ed560f8 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/class/class_cdc.rst @@ -0,0 +1,4 @@ +CDC +========================= + +参考官方 cdc 相关 pdf \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/class/class_hid.rst b/src/lib/CherryUSB/docs/source/class/class_hid.rst new file mode 100644 index 000000000..0f9ef13dc --- /dev/null +++ b/src/lib/CherryUSB/docs/source/class/class_hid.rst @@ -0,0 +1,4 @@ +HID +========================= + +参考官方 hid 相关 pdf \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/class/class_msc.rst b/src/lib/CherryUSB/docs/source/class/class_msc.rst new file mode 100644 index 000000000..c01a359c7 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/class/class_msc.rst @@ -0,0 +1,4 @@ +MSC +========================= + +参考官方 msc 相关 pdf \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/class/class_video.rst b/src/lib/CherryUSB/docs/source/class/class_video.rst new file mode 100644 index 000000000..cabe51733 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/class/class_video.rst @@ -0,0 +1,4 @@ +UVC +========================= + +参考官方 video 相关 pdf \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/class/winusb.rst b/src/lib/CherryUSB/docs/source/class/winusb.rst new file mode 100644 index 000000000..8c74d3b75 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/class/winusb.rst @@ -0,0 +1,2 @@ +WINUSB +========================= diff --git a/src/lib/CherryUSB/docs/source/conf.py b/src/lib/CherryUSB/docs/source/conf.py new file mode 100644 index 000000000..6269e54de --- /dev/null +++ b/src/lib/CherryUSB/docs/source/conf.py @@ -0,0 +1,37 @@ +# Configuration file for the Sphinx documentation builder. + +# -- Project information + +project = 'CherryUSB' +copyright = '2022 ~ 2025, sakumisu' +author = 'sakumisu' + +release = '1.5.3' +version = '1.5.3' + +# -- General configuration + +extensions = [ + 'sphinx.ext.duration', + 'sphinx.ext.doctest', + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', + 'recommonmark', + 'sphinx_markdown_tables' +] + +intersphinx_mapping = { +# 'python': ('https://docs.python.org/3/', None), +# 'sphinx': ('https://www.sphinx-doc.org/en/master/', None), +} +intersphinx_disabled_domains = ['std'] + +templates_path = ['_templates'] + +# -- Options for HTML output + +html_theme = 'sphinx_rtd_theme' + +# -- Options for EPUB output +epub_show_urls = 'footnote' diff --git a/src/lib/CherryUSB/docs/source/demo/img/cherryadb.png b/src/lib/CherryUSB/docs/source/demo/img/cherryadb.png new file mode 100644 index 000000000..512586b95 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/demo/img/cherryadb.png differ diff --git a/src/lib/CherryUSB/docs/source/demo/img/otg.png b/src/lib/CherryUSB/docs/source/demo/img/otg.png new file mode 100644 index 000000000..9605176aa Binary files /dev/null and b/src/lib/CherryUSB/docs/source/demo/img/otg.png differ diff --git a/src/lib/CherryUSB/docs/source/demo/img/rtt_adb_shell1.png b/src/lib/CherryUSB/docs/source/demo/img/rtt_adb_shell1.png new file mode 100644 index 000000000..df4964a2d Binary files /dev/null and b/src/lib/CherryUSB/docs/source/demo/img/rtt_adb_shell1.png differ diff --git a/src/lib/CherryUSB/docs/source/demo/img/rtt_adb_shell2.png b/src/lib/CherryUSB/docs/source/demo/img/rtt_adb_shell2.png new file mode 100644 index 000000000..88d99a6af Binary files /dev/null and b/src/lib/CherryUSB/docs/source/demo/img/rtt_adb_shell2.png differ diff --git a/src/lib/CherryUSB/docs/source/demo/usb_otg.rst b/src/lib/CherryUSB/docs/source/demo/usb_otg.rst new file mode 100644 index 000000000..78692cc01 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usb_otg.rst @@ -0,0 +1,15 @@ +OTG 功能的使用 +========================= + +如果需要使用 OTG 功能,首先使用的芯片需要支持 ID 检测功能,然后使能 ``CONFIG_USB_OTG_ENABLE`` 宏,将之前的例程中 ``usbh_initialize`` 或者 ``usbh_initialize`` +替换成 ``usbotg_initialize`` 即可。 + +ID 检测电路根据不同的 USB 接口类型有所不同,常见的有 micro-USB 和 USB-C 两种接口类型。 + +- 如果是 micro-USB 接口,则将 ID 线连接到芯片的 ID 引脚,并使能 ID 功能即可。 +- 如果是 USB-C 接口,由于没有 ID 引脚,则需要借助 CC 电路转换成 ID 然后连接到芯片的 ID 引脚,常见电路图如下所示(DNP 表示不焊接): + +.. figure:: img/otg.png + + +.. note:: 除 ID 引脚以外,还需要增加 VBUS 输出开关控制,当工作在 host 时,开启 VBUS 供电,当工作在 device 时,关闭 VBUS 供电。 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_adb.rst b/src/lib/CherryUSB/docs/source/demo/usbd_adb.rst new file mode 100644 index 000000000..92a3043e4 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_adb.rst @@ -0,0 +1,28 @@ +usbd_adb +=============== + +本节主要介绍如何使用 adb device。支持 **cherrysh** 和 rt-thread **msh**,只需要在 main 中添加以下初始化即可。 + +.. code-block:: C + + cherryadb_init(0, xxxxx); + +如果使用 rt-thread,还需要在 menuconfig 中使能 adb device。 + +.. figure:: img/rtt_adb_shell1.png + +进入 adb +-------------- + +- 使用 **cherrysh** 时枚举完成以后自动进入 adb 模式 +- 使用 **msh** 需要在 **msh** 中输入 ``adb_enter`` 进入 adb 模式 + +退出 adb +-------------- + +- 使用 **cherrysh** 时输入 ``exit`` 退出 adb 模式 +- 使用 **msh** 需要在 **msh** 中输入 ``adb_exit`` 退出 adb 模式 + +.. figure:: img/cherryadb.png + +.. figure:: img/rtt_adb_shell2.png diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_audiov1.rst b/src/lib/CherryUSB/docs/source/demo/usbd_audiov1.rst new file mode 100644 index 000000000..794ac8f6e --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_audiov1.rst @@ -0,0 +1,7 @@ +usbd_audiov1 +=============== + +在使用 UAC1.0 时,需要注意以下几点: + +- 在使用windows 时,当修改描述符任意参数时,必须同步修改字符串描述符,并且卸载驱动,否则windows会认为设备未更改,继续使用旧的驱动,导致无法识别设备。Linux 不受此限制。 +- QQ 群文件中下载 RemoveGhostDev64.exe 可以自动删除所有 USB 注册的驱动信息,无需第一步 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_audiov2.rst b/src/lib/CherryUSB/docs/source/demo/usbd_audiov2.rst new file mode 100644 index 000000000..0390f17da --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_audiov2.rst @@ -0,0 +1,9 @@ +usbd_audiov2 +=============== + +在使用 UAC2.0 时,需要注意以下几点: + +- 在使用windows 时,当修改描述符任意参数时,必须同步修改字符串描述符,并且卸载驱动,否则windows会认为设备未更改,继续使用旧的驱动,导致无法识别设备。Linux 不受此限制。 +- QQ 群文件中下载 RemoveGhostDev64.exe 可以自动删除所有 USB 注册的驱动信息,无需第一步 +- windows 10 uac2.0 功能不完善,请使用 windows 11 测试uac2.0 功能。Linux 不受此限制 +- windows 中设置的采样率表范围在多通道时(通道数大于2)计算有误,比如设置 8K~96K,那么实际是大于等于8K 小于96K,而非小于等于96K。Linux 不受此限制 diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_cdc_acm.rst b/src/lib/CherryUSB/docs/source/demo/usbd_cdc_acm.rst new file mode 100644 index 000000000..be330b4cc --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_cdc_acm.rst @@ -0,0 +1,104 @@ +usbd_cdc_acm +=============== + +本 demo 主要用于演示 cdc acm 功能,包含收发测试,DTR 控制,ZLP 测试,性能测试。 + +- 开辟读写 buffer,用于收发数据,并且buffer需要用 nocache 修饰,这里我们读写都是用 2048字节,是为了后面的 ZLP 测试和性能测试使用。 + +.. code-block:: C + + USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; /* 2048 is only for test speed , please use CDC_MAX_MPS for common*/ + USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; + + +- 在协议栈事件回调中,我们需要在枚举完成后启动第一次传输,并清除相关 flag,可以在 reset 事件中清除,也可以在 configured 事件中清除。 + +.. code-block:: C + + static void usbd_event_handler(uint8_t busid, uint8_t event) + { + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } + } + +- 在接收完成中断中继续发起接收;在发送完成中断中判断是否需要发送 ZLP。 + +.. code-block:: C + + void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) + { + USB_LOG_RAW("actual out len:%d\r\n", nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); + } + + void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) + { + USB_LOG_RAW("actual in len:%d\r\n", nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } + } + +- 以下是为了测试 DTR 功能并控制 USB 发送,DTR 和 RTS 只用于搭配 UART 使用,如果是纯 USB,没什么用,这里仅做测试。DTR 开关使用任意串口上位机并勾选 DTR。 + +.. code-block:: C + + void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) + { + if (dtr) { + dtr_enable = 1; + } else { + dtr_enable = 0; + } + } + +- 在主函数中一直调用发送即可 + +.. code-block:: C + + void cdc_acm_data_send_with_dtr_test(uint8_t busid) + { + if (dtr_enable) { + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048); + while (ep_tx_busy_flag) { + } + } + } + +- 上述我们需要注意,长度设置为 2048 是为了测试 ZLP 功能,通常实际使用时,接收长度应该使用 CDC_MAX_MPS 。具体原因参考 :ref:`usb_ext` +- 如果需要做性能测试,使用 tools/test_srcipts/test_cdc_speed.py 进行测试,并在测试之前删除 `usbd_cdc_acm_bulk_out` 和 `usbd_cdc_acm_bulk_in` 中的打印,否则会影响测试结果。 + + +此外,对于 CDC ACM 搭配 OS 的情况,通常我们 read 使用异步并将数据存储到 ringbuffer 中,write 使用同步搭配 sem 使用。 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_ecm.rst b/src/lib/CherryUSB/docs/source/demo/usbd_ecm.rst new file mode 100644 index 000000000..c4c64ab54 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_ecm.rst @@ -0,0 +1,2 @@ +usbd_cdc_ecm +=============== diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_hid.rst b/src/lib/CherryUSB/docs/source/demo/usbd_hid.rst new file mode 100644 index 000000000..68b6b285b --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_hid.rst @@ -0,0 +1,4 @@ +usbd_hid +=============== + +HID 功能比较简单,因此不作赘述,需要注意,使用 hid custom 例程时,需要搭配 `tools/test_srcipts/test_hid_inout.py` 使用。 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_msc.rst b/src/lib/CherryUSB/docs/source/demo/usbd_msc.rst new file mode 100644 index 000000000..ff59aadae --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_msc.rst @@ -0,0 +1,39 @@ +usbd_msc +=============== + +本节主要演示 USB 模拟 U 盘功能。默认使用RAM 作为存储介质模拟 U 盘。 + +- 实现 U 盘的读写和获取容量接口,注意,容量 block_num 为虚拟的,实际没有这么多 block,读写的数据超过 BLOCK_COUNT 会丢弃。 + +block_size 一般为 512/2048/4096。 + +.. code-block:: C + + void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size) + { + *block_num = 1000; //Pretend having so many buffer,not has actually. + *block_size = BLOCK_SIZE; + } + int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) + { + if (sector < BLOCK_COUNT) + memcpy(buffer, mass_block[sector].BlockSpace, length); + return 0; + } + + int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) + { + if (sector < BLOCK_COUNT) + memcpy(mass_block[sector].BlockSpace, buffer, length); + return 0; + } + +- 默认上述 API 在中断中执行,如果需要在非中断中执行,可以选择如下: + +1,裸机下开启 `CONFIG_USBDEV_MSC_POLLING` 并在 while1 中调用 `usbd_msc_polling`,则读写函数在 while1 中执行。 + +2, OS 下开启 `CONFIG_USBDEV_MSC_THREAD`,则读写函数在线程中执行。 + +- 修改 `CONFIG_USBDEV_MSC_BUFSIZE` 会影响 U 盘的读写速度,必须是 block_size 的整数倍,当然,也会增加 RAM 的占用。 + +- 如果 RAM 例程可以用,但是介质更换成 SD 或者 FLASH 后不可用,则一定是介质驱动问题。 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_rndis.rst b/src/lib/CherryUSB/docs/source/demo/usbd_rndis.rst new file mode 100644 index 000000000..40fba402a --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_rndis.rst @@ -0,0 +1,2 @@ +usbd_rndis +=============== diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_vendor.rst b/src/lib/CherryUSB/docs/source/demo/usbd_vendor.rst new file mode 100644 index 000000000..b38631b11 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_vendor.rst @@ -0,0 +1,44 @@ +vendor device 驱动编写 +=========================== + +本节主要介绍如何编写一个 vendor device 驱动。 + +- 首先复制一份 class/template/usbd_xxx.c 文件 +- 实现以下三个回调函数,通常来说,vendor 驱动只需要实现 vendor_handler + +.. code-block:: C + + intf->class_interface_handler = xxx_class_interface_request_handler; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = xxx_notify_handler; + +- 举例如下 + +case1 演示对于主机 IN 数据的处理,将数据拷贝到 *data 中,并指定*len 的长度。协议栈会自动发送给主机,不需要用户手动调用发送 API。 + +case2 演示对于主机 OUT 数据的处理,当执行到此函数时,说明数据都已经接收完成,可以直接读取 *data 中的数据,长度为 *len。 + +.. code-block:: C + + static int xxx_vendor_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) + { + USB_LOG_WRN("XXX Class request: " + "bRequest 0x%02x\r\n", + setup->bRequest); + + switch (setup->bRequest) { + case 1: + memcpy(*data, xxx, sizeof(xxx)); + *len = sizeof(xxx); + case 2: + hexdump(*data, *len); + default: + USB_LOG_WRN("Unhandled XXX Class bRequest 0x%02x\r\n", setup->bRequest); + return -1; + } + + return 0; + } + +- 最后使用形如 usbd_add_interface(busid, usbd_xxx_init_intf(&intf)) 注册接口 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_video.rst b/src/lib/CherryUSB/docs/source/demo/usbd_video.rst new file mode 100644 index 000000000..e215abde8 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_video.rst @@ -0,0 +1,83 @@ +usbd_video +=============== + +本节主要演示 USB UAC 功能,支持 YUYV, MJPEG, H264 格式。为了方便演示,都采用的静态图。 + +demo 包含 **video_static_yuyv_template**, **video_static_mjpeg_template**, **video_static_h264_template**, 仅描述符和图片数据不同。 + +- 在高速模式下,默认最大是1024字节,但是如果芯片支持 additional transcations,可以配置为最高 2048字节或者3072字节,这样可以提高传输效率。 + +.. code-block:: C + + #ifdef CONFIG_USB_HS + #define MAX_PAYLOAD_SIZE 1024 // for high speed with one transcations every one micro frame + #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) + + // #define MAX_PAYLOAD_SIZE 2048 // for high speed with two transcations every one micro frame + // #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 2)) | (0x01 << 11)) + + // #define MAX_PAYLOAD_SIZE 3072 // for high speed with three transcations every one micro frame + // #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 3)) | (0x02 << 11)) + + #else + #define MAX_PAYLOAD_SIZE 1020 + #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11)) + #endif + +- 通常只需要修改 WIDTH 和 HEIGHT + +.. code-block:: C + + #define WIDTH (unsigned int)(640) + #define HEIGHT (unsigned int)(480) + + #define CAM_FPS (30) + #define INTERVAL (unsigned long)(10000000 / CAM_FPS) + #define MIN_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) //16 bit + #define MAX_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) + #define MAX_FRAME_SIZE (unsigned long)(WIDTH * HEIGHT * 2) + +- USB 端点配置,默认 interval 为 1,也就是全速模式下 1ms,高速模式下 125us。同步类型使用异步模式。 + +.. code-block:: C + + /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ + USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), + + +- 使用 `usbd_video_stream_start_write` 传输数据, 最后 **do_copy** 选项表示是否将数据 copy 到 packet_buffer, +如果不选择 copy, 则会直接在原图像数据中填充头部信息,并直接发送,达到 zero copy 功能。 + +- 因为提供的是静态数据,不能被修改,因此需要重新给一个 frame_buffer 用于图像传输,在实际对接 camera 场景中是动态数据,直接使用 camera 的数据缓冲区即可。 + + +.. code-block:: C + + void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) + { + if (usbd_video_stream_split_transfer(busid, ep)) { + /* one frame has done */ + iso_tx_busy = false; + } + } + + USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t packet_buffer[MAX_PAYLOAD_SIZE]; + USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t frame_buffer[32 * 1024]; + + void video_test(uint8_t busid) + { + memset(packet_buffer, 0, sizeof(packet_buffer)); + + while (1) { + if (tx_flag) { + iso_tx_busy = true; + memcpy(frame_buffer, cherryusb_mjpeg, sizeof(cherryusb_mjpeg)); // cherryusb_mjpeg is a static MJPEG frame buffer, so we need copy it to frame_buffer + usbd_video_stream_start_write(busid, VIDEO_IN_EP, packet_buffer, (uint8_t *)frame_buffer, sizeof(cherryusb_mjpeg), false); + while (iso_tx_busy) { + if (tx_flag == 0) { + break; + } + } + } + } + } \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_webusb.rst b/src/lib/CherryUSB/docs/source/demo/usbd_webusb.rst new file mode 100644 index 000000000..74a22101d --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_webusb.rst @@ -0,0 +1,21 @@ +usbd_webusb +=============== + +本 demo 主要演示 webusb 功能,webusb 主要用于弹出网页并对 USB 设备进行访问。示例使用 webusb_hid_template.c。 + +- 在注册描述符时注册 BOS, MSOSV2, WEBUSB 描述符即可。 + +.. code-block:: C + + usbd_bos_desc_register(busid, &bos_desc); + usbd_msosv2_desc_register(busid, &msosv2_desc); + usbd_webusb_desc_register(busid, &webusb_url_desc); + +- 增加一个接口描述符用于 webusb + +.. code-block:: C + +USB_INTERFACE_DESCRIPTOR_INIT(USBD_WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00) + +- 其余使用 hid 描述符,不再赘述 +- 枚举完成后,电脑右下角会弹出网页信息,点击即可打开网页 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbd_winusb.rst b/src/lib/CherryUSB/docs/source/demo/usbd_winusb.rst new file mode 100644 index 000000000..a3d028520 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbd_winusb.rst @@ -0,0 +1,32 @@ +usbd_winusb +=============== + +本节主要介绍 winusb 驱动。winusb 是 windows 为了让用户友好的访问 USB 自定义类设备提供的一套通用驱动,其实本质就是 CDC ACM。 +WINUSB 版本根据 USB 版本分为 V1/V2 版本,V2 版本需要包含 BOS 描述符,V1 版本不需要。V2 版本需要在设备描述符中设置为 USB2.1 的版本号。 + +- V1 版本注册描述符 + +.. code-block:: C + + usbd_msosv1_desc_register(busid, &msosv1_desc); + +- V2 版本注册描述符 + +.. code-block:: C + + usbd_bos_desc_register(busid, &bos_desc); + usbd_msosv2_desc_register(busid, &msosv2_desc); + + +- 接口描述符注册 + +.. code-block:: C + + /* Interface 0 */ + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), + /* Endpoint OUT 2 */ + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), + /* Endpoint IN 1 */ + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), + +- 其余操作与 CDC ACM 相同,不再赘述 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbh_bluetooth.rst b/src/lib/CherryUSB/docs/source/demo/usbh_bluetooth.rst new file mode 100644 index 000000000..a93844eab --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbh_bluetooth.rst @@ -0,0 +1,2 @@ +usbh_bluetooth +=============== diff --git a/src/lib/CherryUSB/docs/source/demo/usbh_hid.rst b/src/lib/CherryUSB/docs/source/demo/usbh_hid.rst new file mode 100644 index 000000000..6d519319b --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbh_hid.rst @@ -0,0 +1,55 @@ +usbh_hid +=============== + +本节主要介绍 HID 类的使用。 + +- HID 枚举完成回调中创建一次性线程 + +.. code-block:: C + + + void usbh_hid_run(struct usbh_hid *hid_class) + { + usb_osal_thread_create("usbh_hid", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_hid_thread, hid_class); + } + + void usbh_hid_stop(struct usbh_hid *hid_class) + { + } + + +- 这里我们使用 usbh_submit_urb 的异步操作,在中断中处理数据并继续接收下一次数据。 + +.. code-block:: C + + static void usbh_hid_thread(void *argument) + { + int ret; + struct usbh_hid *hid_class = (struct usbh_hid *)argument; + ; + + /* test with only one buffer, if you have more hid class, modify by yourself */ + + /* Suggest you to use timer for int transfer and use ep interval */ + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_buffer, hid_class->intin->wMaxPacketSize, 0, usbh_hid_callback, hid_class); + ret = usbh_submit_urb(&hid_class->intin_urb); + if (ret < 0) { + goto delete; + } + // clang-format off + delete: + usb_osal_thread_delete(NULL); + // clang-format on + } + +- 当然,也可以不使用异步操作,而是使用 timeout 的同步操作。 +- HID 使用的是中断传输,因此正常来说,我们需要根据 **bInterval** 来设置定时器,定时触发中断传输,demo 这里没有使用,如果对时间有精确要求,可以选择使用定时器来触发异步发送。 +- 以 hub 通信为例,采用的是一次性定时器,也可以使用周期性定时器。 + +.. code-block:: C + + hub->int_timer = usb_osal_timer_create("hubint_tim", USBH_GET_URB_INTERVAL(hub->intin->bInterval, hport->speed) / 1000, hub_int_timeout, hub, 0); + +.. note:: + + 这里的 `USBH_GET_URB_INTERVAL` 是一个宏定义,用于根据 binterval 计算 URB 的传输间隔时间, 单位是 us,而定时器最低是 ms ,因此需要除以 1000。对于小于等于 1ms 的不需要使用定时器。 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbh_msc.rst b/src/lib/CherryUSB/docs/source/demo/usbh_msc.rst new file mode 100644 index 000000000..83956cc23 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbh_msc.rst @@ -0,0 +1,56 @@ +usbh_msc +=============== + +本节主要介绍主机 MSC 使用。借助 FATFS 实现读写功能。 + +- 在 msc 枚举完成的回调中注册一个线程,用于读写操作。 + +.. code-block:: C + + void usbh_msc_run(struct usbh_msc *msc_class) + { + usb_osal_thread_create("usbh_msc", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_msc_thread, msc_class); + } + + void usbh_msc_stop(struct usbh_msc *msc_class) + { + } + + +- 不使用 fatfs,则直接使用 usbh_msc_scsi_read10 或者 usbh_msc_scsi_write10 函数进行读写操作。 +- 如果使用 fatfs,则需要在 usbh_msc_thread 中调用 fatfs 的接口进行读写操作。msc读写适配fatfs 参考 `platform/fatfs/usbh_fatfs.c` + +.. code-block:: C + + static void usbh_msc_thread(void *argument) + { + int ret; + struct usbh_msc *msc_class = (struct usbh_msc *)argument; + + /* test with only one buffer, if you have more msc class, modify by yourself */ + #if 1 + /* get the partition table */ + ret = usbh_msc_scsi_read10(msc_class, 0, partition_table, 1); + if (ret < 0) { + USB_LOG_RAW("scsi_read10 error,ret:%d\r\n", ret); + goto delete; + } + for (uint32_t i = 0; i < 512; i++) { + if (i % 16 == 0) { + USB_LOG_RAW("\r\n"); + } + USB_LOG_RAW("%02x ", partition_table[i]); + } + USB_LOG_RAW("\r\n"); + #endif + + #if TEST_USBH_MSC_FATFS + usb_msc_fatfs_test(); + #endif + // clang-format off + delete: + usb_osal_thread_delete(NULL); + // clang-format on + } + +- 最后处理完成或者失败后,删除线程。 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbh_net.rst b/src/lib/CherryUSB/docs/source/demo/usbh_net.rst new file mode 100644 index 000000000..b2656dcad --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbh_net.rst @@ -0,0 +1,108 @@ +usbh_net +=============== + +本节主要介绍 USB 网卡的使用,USB 网卡推荐采用 AIR780(RNDIS),EC20(ECM/RNDIS), 手机(RNDIS),RTL8152 USB 网卡,AX88772 USB 网卡。 + +USB 网卡传输层面已经对接好了 LWIP 的收发接口,因此,用户只需要包含 **platform/XXX/usbh_lwip.c** 并根据需要开启对应的网卡类的宏即可。 + +- 当前支持以下网卡类: + +.. code-block:: C + + // #define CONFIG_USBHOST_PLATFORM_CDC_ECM + // #define CONFIG_USBHOST_PLATFORM_CDC_RNDIS + // #define CONFIG_USBHOST_PLATFORM_CDC_NCM + // #define CONFIG_USBHOST_PLATFORM_ASIX + // #define CONFIG_USBHOST_PLATFORM_RTL8152 + // #define CONFIG_USBHOST_PLATFORM_BL616 + +- 包含了对接 LWIP 的输入输出接口,举例如下 + +.. code-block:: C + + static err_t usbh_cdc_ecm_linkoutput(struct netif *netif, struct pbuf *p) + { + int ret; + (void)netif; + + usbh_lwip_eth_output_common(p, usbh_cdc_ecm_get_eth_txbuf()); + ret = usbh_cdc_ecm_eth_output(p->tot_len); + if (ret < 0) { + return ERR_BUF; + } else { + return ERR_OK; + } + } + + void usbh_cdc_ecm_eth_input(uint8_t *buf, uint32_t buflen) + { + usbh_lwip_eth_input_common(&g_cdc_ecm_netif, buf, buflen); + } + + +- 网卡类枚举完成后,注册 netif,并且创建网卡接收线程(因此使用 RTTHREAD 时不需要使用 RTT 的接收线程模块)。 +- 必须开启 DHCP client 服务,用于从 USB 网卡获取 IP 地址。 + +.. code-block:: C + + void usbh_cdc_ecm_run(struct usbh_cdc_ecm *cdc_ecm_class) + { + struct netif *netif = &g_cdc_ecm_netif; + + netif->hwaddr_len = 6; + memcpy(netif->hwaddr, cdc_ecm_class->mac, 6); + + IP4_ADDR(&g_ipaddr, 0, 0, 0, 0); + IP4_ADDR(&g_netmask, 0, 0, 0, 0); + IP4_ADDR(&g_gateway, 0, 0, 0, 0); + + netif = netif_add(netif, &g_ipaddr, &g_netmask, &g_gateway, NULL, usbh_cdc_ecm_if_init, tcpip_input); + netif_set_default(netif); + while (!netif_is_up(netif)) { + } + + dhcp_handle = usb_osal_timer_create("dhcp", 200, dhcp_timeout, netif, true); + if (dhcp_handle == NULL) { + USB_LOG_ERR("timer creation failed! \r\n"); + while (1) { + } + } + + usb_osal_thread_create("usbh_cdc_ecm_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_cdc_ecm_rx_thread, NULL); + #if LWIP_DHCP + dhcp_start(netif); + usb_osal_timer_start(dhcp_handle); + #endif + } + +- 获取到 IP 以后,就与 USB 没有关系了,直接使用 LWIP 的接口即可。 + +- 需要注意以下参数 + +LWIP_TCPIP_CORE_LOCKING_INPUT 用于不使用 lwip 内置的 tcpip 线程,而使用 USB 自己的处理线程。 + +LWIP_TCPIP_CORE_LOCKING 在现在 lwip 版本中默认是打开的,也推荐必须打开。 + +PBUF_POOL_BUFSIZE 推荐大于1600,搭配 LWIP_TCPIP_CORE_LOCKING_INPUT 使用,因为我们提供了使用 zero mempy 的方式,使用静态 pbuf,而不是把数据 copy 到 pbuf 中。 + +TCPIP_THREAD_STACKSIZE 推荐大于 1K,防止栈溢出。 + +.. code-block:: C + + #if LWIP_TCPIP_CORE_LOCKING_INPUT != 1 + #warning suggest you to set LWIP_TCPIP_CORE_LOCKING_INPUT to 1, usb handles eth input with own thread + #endif + + #if LWIP_TCPIP_CORE_LOCKING != 1 + #error must set LWIP_TCPIP_CORE_LOCKING to 1 + #endif + + #if PBUF_POOL_BUFSIZE < 1600 + #error PBUF_POOL_BUFSIZE must be larger than 1600 + #endif + + #if TCPIP_THREAD_STACKSIZE < 1024 + #error TCPIP_THREAD_STACKSIZE must be >= 1024 + #endif + +- 具体移植文章可以参考 https://club.rt-thread.org/ask/article/5cf3e9e0b2d95800.html \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbh_serial.rst b/src/lib/CherryUSB/docs/source/demo/usbh_serial.rst new file mode 100644 index 000000000..58355cfe0 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbh_serial.rst @@ -0,0 +1,4 @@ +usbh_serial +=============== + +当前仅支持 rt-thread device 框架,包括 cdc acm, ftdi, cp210x, ch34x, pl2303, 具体使用方式参考 rt-thread device api 即可。 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbh_vendor.rst b/src/lib/CherryUSB/docs/source/demo/usbh_vendor.rst new file mode 100644 index 000000000..b86bda60d --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbh_vendor.rst @@ -0,0 +1,127 @@ +vendor host 驱动编写 +=========================== + +本节主要介绍如何编写一个 vendor host 驱动。 + +- 首先复制一份 class/template/usbh_xxx.c 文件 + +- 定义 class 驱动并使用 CLASS_INFO_DEFINE 前缀,这样,枚举完成后,协议栈自动通过 usbd_class_find_driver 来查找对应的驱动。 + +.. code-block:: C + + static const struct usbh_class_driver xxx_class_driver = { + .driver_name = "xxx", + .connect = usbh_xxx_connect, + .disconnect = usbh_xxx_disconnect + }; + + CLASS_INFO_DEFINE const struct usbh_class_info xxx_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = 0, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .id_table = NULL, + .class_driver = &xxx_class_driver + }; + + +- 实现 connect 和 disconnect 函数, 在 connect 函数中,需要分配一个 xxx_class 结构体,在 disconnect 函数中释放 urb 和 xxx_class。 + +.. code-block:: C + + struct usbh_xxx { + struct usbh_hubport *hport; + struct usb_endpoint_descriptor *xxxin; + struct usb_endpoint_descriptor *xxxout; + struct usbh_urb xxxin_urb; + struct usbh_urb xxxout_urb; + + uint8_t intf; /* interface number */ + uint8_t minor; + + void *user_data; + }; + + static int usbh_xxx_connect(struct usbh_hubport *hport, uint8_t intf) + { + struct usb_endpoint_descriptor *ep_desc; + int ret; + + struct usbh_xxx *xxx_class = usbh_xxx_class_alloc(); + if (xxx_class == NULL) { + USB_LOG_ERR("Fail to alloc xxx_class\r\n"); + return -USB_ERR_NOMEM; + } + + return ret; + } + + + static int usbh_xxx_disconnect(struct usbh_hubport *hport, uint8_t intf) + { + int ret = 0; + + struct usbh_xxx *xxx_class = (struct usbh_xxx *)hport->config.intf[intf].priv; + + if (xxx_class) { + if (xxx_class->xxxin) { + usbh_kill_urb(&xxx_class->xxxin_urb); + } + + if (xxx_class->xxxout) { + usbh_kill_urb(&xxx_class->xxxout_urb); + } + + if (hport->config.intf[intf].devname[0] != '\0') { + USB_LOG_INFO("Unregister xxx Class:%s\r\n", hport->config.intf[intf].devname); + usbh_xxx_stop(xxx_class); + } + + usbh_xxx_class_free(xxx_class); + } + + return ret; + } + +- 初始化端点 + +.. code-block:: C + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(xxx_class->intin, ep_desc); + } else { + USBH_EP_INIT(xxx_class->intout, ep_desc); + } + } + +- 最后设计收发 API,根据实际情况设计成同步 or 异步。 + +.. code-block:: C + + int usbh_xxx_in_transfer(struct usbh_xxx *xxx_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) + { + int ret; + struct usbh_urb *urb = &xxx_class->xxxin_urb; + + usbh_xxx_urb_fill(urb, xxx_class->hport, xxx_class->xxxin, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; + } + + int usbh_xxx_out_transfer(struct usbh_xxx *xxx_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) + { + int ret; + struct usbh_urb *urb = &xxx_class->xxxout_urb; + + usbh_xxx_urb_fill(urb, xxx_class->hport, xxx_class->xxxout, buffer, buflen, timeout, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; + } \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/demo/usbh_wifi.rst b/src/lib/CherryUSB/docs/source/demo/usbh_wifi.rst new file mode 100644 index 000000000..be148c7d6 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/demo/usbh_wifi.rst @@ -0,0 +1,2 @@ +usbh_wifi +=============== diff --git a/src/lib/CherryUSB/docs/source/index.rst b/src/lib/CherryUSB/docs/source/index.rst new file mode 100644 index 000000000..8cdb78cd1 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/index.rst @@ -0,0 +1,156 @@ +.. CherryUSB 使用指南 documentation master file, created by + sphinx-quickstart on Thu Nov 21 10:50:33 2019. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +CherryUSB 使用指南 +====================================================== + +CherryUSB 是一个小而美的、可移植性高的、用于嵌入式系统的 USB 主从协议栈。同时 CherryUSB 具有以下优点: + +**易于学习 USB** + +为了方便用户学习 USB 基本知识、枚举、驱动加载、IP 驱动,因此,编写的代码具备以下优点: + +- 代码精简,逻辑简单,无复杂 C 语言语法 +- 树状化编程,代码层层递进 +- Class 驱动和 porting 驱动模板化、精简化 +- API 分类清晰(从机:初始化、注册类、命令回调类、数据收发类;主机:初始化、查找类、数据收发类) + +**易于使用 USB** + +为了方便用户使用 USB 接口,考虑到用户学习过 uart 和 dma,因此,设计的数据收发类接口具备以下优点: + +- 等价于使用 uart tx dma/uart rx dma +- 收发长度没有限制,用户不需要关心 USB 分包过程(porting 驱动做分包过程) + +**易于发挥 USB 性能** + +考虑到 USB 性能问题,尽量达到 USB 硬件理论带宽,因此,设计的数据收发类接口具备以下优点: + +- Porting 驱动直接对接寄存器,无抽象层封装 +- Memory zero copy +- IP 如果带 DMA 则使用 DMA 模式(DMA 带硬件分包功能) +- 长度无限制,方便对接硬件 DMA 并且发挥 DMA 的优势 +- 分包功能在中断中处理 + +**从机协议栈整体执行流程** + +.. figure:: usbdev.svg + +**主机协议栈整体执行流程** + +.. figure:: usbhost.svg + +**其他相关链接** + +- **视频教程**: https://www.bilibili.com/cheese/play/ss707687201 +- **github** : https://github.com/sakumisu/CherryUSB +- **CherryUSB原理性分析和应用实践-汉斯期刊**: https://www.hanspub.org/journal/paperinformation?paperid=126903 + +.. toctree:: + :maxdepth: 1 + :caption: 快速上手 + + quick_start/start + quick_start/demo + quick_start/transplant + quick_start/rtthread + quick_start/q&a + quick_start/share + quick_start/opensource + +.. toctree:: + :maxdepth: 1 + :caption: USB 基本知识点 + + usb/usb2.0_basic + usb/usb3.0_basic + usb/usb_desc + usb/usb_request + usb/usb_enum + usb/usb_ext + +.. toctree:: + :maxdepth: 1 + :caption: API 手册 + + api/api_device + api/api_host + api/api_port + api/api_config + +.. toctree:: + :maxdepth: 1 + :caption: Class 指南 + + class/class_cdc + class/class_hid + class/class_msc + class/class_audio + class/class_video + class/winusb + +.. toctree:: + :maxdepth: 1 + :caption: 例程说明 + + demo/usbd_cdc_acm + demo/usbd_hid + demo/usbd_msc + demo/usbd_rndis + demo/usbd_ecm + demo/usbd_audiov1 + demo/usbd_audiov2 + demo/usbd_video + demo/usbd_winusb + demo/usbd_webusb + demo/usbd_adb + demo/usbh_serial + demo/usbh_hid + demo/usbh_msc + demo/usbh_net + demo/usbh_bluetooth + demo/usbh_wifi + demo/usbd_vendor + demo/usbh_vendor + demo/usb_otg + +.. toctree:: + :maxdepth: 1 + :caption: USBIP 介绍 + + usbip/ohci + usbip/ehci + usbip/xhci + usbip/chipidea + usbip/dwc2 + usbip/musb + usbip/fotg210 + usbip/cdns2 + usbip/cdns3 + usbip/dwc3 + +.. toctree:: + :maxdepth: 1 + :caption: 工具使用 + + tools/index + +.. toctree:: + :maxdepth: 1 + :caption: 版本说明 + + version + +.. toctree:: + :maxdepth: 1 + :caption: 性能展示 + + show/index + +.. toctree:: + :maxdepth: 1 + :caption: 商业支持 + + support/index \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/quick_start/demo.rst b/src/lib/CherryUSB/docs/source/quick_start/demo.rst new file mode 100644 index 000000000..926e318e6 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/quick_start/demo.rst @@ -0,0 +1,224 @@ +基于现有 demo 快速验证 +========================= + +在学习 USB 或者是学习 CherryUSB 代码之前,我们需要先基于现有的 demo 进行快速验证,为什么?是为了提升对 USB 的兴趣,能有信心进行下一步的动作,如果 demo 都跑不起来,或者自己摸索写代码,或者先看 USB 基本概念,结果看到最后, +发现一点都看不懂,概念好多,根本记不住,从而丧失对 USB 的兴趣。因此,先跑 demo 非常重要。下面我将给大家罗列目前支持的 demo 仓库。 + +基于 bouffalolab 系列芯片(官方 SDK 支持) +------------------------------------------ + +仓库参考:https://github.com/CherryUSB/cherryusb_bouffalolab + +- BL616/BL808:USB2.0 内置 HS phy 芯片,支持主从机。device 支持 5 个端点(包括端点0),不支持双向同时使用。 +- USB 的相关应用位于 `examples/usbdev` 和 `examples/usbhost` 目录下,根据官方环境搭建完成后,即可编译使用。 + +基于 HPMicro 系列芯片(官方 SDK 支持) +----------------------------------------------------- + +仓库参考:https://github.com/CherryUSB/cherryusb_hpmicro + +- HPM 系列: USB2.0 内置 HS phy 芯片,支持主从机。device 支持 8/16 端点(包括端点0),并且可以同时使用双向,不同芯片个数有差异。 +- USB 的相关应用位于 `samples/cherryusb` ,根据官方环境搭建完成后,即可编译使用。 + +基于 esp32s2/s3/p4 系列芯片(官方 SDK 即将支持) +------------------------------------------------- + +仓库参考:https://github.com/CherryUSB/cherryusb_esp32 + +- esp32s2/s3:USB2.0 内置全速 PHY 芯片,支持主从机,device 支持 7 个端点(包括端点0),并且可以同时使用双向。 +- esp32p4:一个 USB2.0 内置全速 PHY 芯片,一个 USB2.0 内置高速 PHY 芯片,支持主从机。 +- 默认 demo 采用组件库安装的形式,在 https://components.espressif.com/ 中搜索 cherryusb 即可 + +ESP-Registry 可以参考官方文档,推荐使用 vscode + esp-idf 的开发环境。 + +- ctrl + shift + p 选择 ESP-IDF 欢迎界面,然后选择 Component mananger + +.. figure:: img/esp1.png + +- 找到 cherryusb 并安装 + +.. figure:: img/esp2.png + +- 打开 menuconfig,并打开 cherryusb 的配置,根据实际情况选择主机或者从机模式 + +.. figure:: img/esp3.png +.. figure:: img/esp4.png + +基于飞腾派系列芯片(官方 SDK 支持) +----------------------------------- + +仓库参考:https://gitee.com/phytium_embedded/phytium-free-rtos-sdk + +- 飞腾派支持两个 USB3.0 主机(采用 XHCI), 两个 USB2.0 主从机 +- USB 的相关应用位于 `example/peripheral/usb` ,根据官方环境搭建完成后,即可编译使用。 + +基于 Essemi 系列芯片(官方 SDK 支持) +----------------------------------------- + +仓库参考:https://github.com/CherryUSB/cherryusb_es32 + +- 支持全速和高速主从机。device 支持 6 个端点(包括端点0),并且可以同时使用双向。 + +基于 Artinchip 系列芯片(官方 SDK 支持) +----------------------------------------------- + +仓库参考:https://gitee.com/artinchip/luban-lite + +- 支持全速和高速主从机,主机采用 EHCI + OHCI。device 支持 8 个端点(包括端点0),并且可以同时使用双向。 + +基于 canmv-k230 芯片(官方 SDK 支持) +--------------------------------------------- + +仓库参考:https://github.com/CherryUSB/k230_sdk + +- K230: 两个 USB2.0 内置 HS PHY 芯片,支持主从机。device 支持 16 个端点(包括端点0),并且可以同时使用双向。 + +基于 NXP MCX系列芯片 +--------------------------- + +仓库参考:https://github.com/CherryUSB/cherryusb_mcx 或者 https://github.com/RT-Thread/rt-thread/tree/master/bsp/nxp/mcx + +- 支持全速 IP 和高速 IP, 高速 IP 支持主机和从机。device 支持 8 个端点(包括端点0),并且可以同时使用双向。 + +基于 RP2040/RP2035 芯片(官方 SDK 即将支持) +-------------------------------------------- + +仓库参考: https://github.com/CherryUSB/pico-examples 和 https://github.com/CherryUSB/pico-sdk + +基于 ST 系列芯片 +--------------------------- + +仓库参考:https://github.com/CherryUSB/cherryusb_stm32 + +默认提供以下 demo 工程: + +- F103 使用 fsdev ip +- F429 主从使用 USB1, 引脚 pb14/pb15, 默认从机没有开启 DMA 模式 +- H7 设备使用 USB0, 引脚 pa11/pa12,没有开 DMA 模式。主机使用 USB1 ,引脚 pb14/pb15,并且需要做 nocache 处理 + +demo 底下提供了 **stm32xxx.ioc** 文件,双击打开,点击 **Generate Code** 即可。 + +.. caution:: 生成完以后,请使用 git reset 功能将被覆盖的 `main.c` 和 `stm32xxx_it.c` 文件撤回,禁止被 cubemx 覆盖。 + +涵盖 F1/F4/H7,其余芯片基本类似,不再赘述,具体区别有: + +- usb ip 区别:F1使用 fsdev,F4/H7使用 dwc2 +- dwc2 ip 区别: USB0 (引脚是 PA11/PA12) 和 USB1 (引脚是 PB14/PB15), 其中 USB1 默认全速,可以接外部PHY 形成高速主机,并且带 dma 功能 +- F4 无 cache,H7 有 cache + +如果是 STM32F7/STM32H7 这种带 cache 功能,需要将 usb 使用到的 ram 定位到 no cache ram 区域。举例如下 + +.. code-block:: C + + cpu_mpu_config(0, MPU_Normal_NonCache, 0x24070000, MPU_REGION_SIZE_64KB); + +对应 keil 中的 sct 脚本修改: + +.. code-block:: C + + LR_IROM1 0x08000000 0x00200000 { ; load region size_region + ER_IROM1 0x08000000 0x00200000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM2 0x24000000 0x00070000 { ; RW data + .ANY (+RW +ZI) + } + USB_NOCACHERAM 0x24070000 0x00010000 { ; RW data + *(.noncacheable) + } + } + +USB Device 移植要点 +^^^^^^^^^^^^^^^^^^^^^^ + +- 使用 **stm32cubemx** 创建工程,配置基本的 RCC、UART (作为log使用) + +.. figure:: img/stm32_1.png +.. figure:: img/stm32_2.png + +- 如果使用 fsdev ip,勾选 **USB** 。如果使用 dwc2 ip,勾选 **USB_OTG_FS** 或者勾选 **USB_OTG_HS**。开启 USB 中断,其他配置对我们没用,代码中不会使用任何 st 的 usb 库。 + +.. figure:: img/stm32_3_1.png +.. figure:: img/stm32_3_2.png + +- 配置 usb clock 为 48M + +.. figure:: img/stm32_4_1.png +.. figure:: img/stm32_4_2.png + +- 选择好工程,这里我们选择 keil,设置好 stack 和 heap,如果使用 msc 可以推荐设置大点,然后点击 **Generate Code**。 + +.. figure:: img/stm32_5.png + +- 添加 CherryUSB 必须要的源码( **usbd_core.c** 、 **dwc2/usb_dc_dwc2.c** 或者是 **fsdev/usb_dc_fsdev.c** ),以及想要使用的 class 驱动,可以将对应的 class template 添加方便测试。 + +.. figure:: img/stm32_6.png + +- 头文件该加的加 + +.. figure:: img/stm32_7.png + +- 复制一份 **cherryusb_config_template.h**,放到 `Core/Inc` 目录下,并命名为 `usb_config.h` + +.. figure:: img/stm32_8.png + +- 如果使用 fsdev ip,(V1.5.0 开始需要增加 **fsdev/usb_glue_st.c**) 在 `usb_config.h` 中实现以下宏,具体数值不同芯片不一样: + +.. code-block:: C + + #define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 + +- 编译器推荐使用 **AC6**。勾选 **Microlib**,并实现 **printf** ,方便后续查看 log。 + +.. figure:: img/stm32_10.png +.. figure:: img/stm32_11.png + +.. note :: 以下两个步骤从 V1.5.0 开始不再需要,**fsdev/usb_glue_st.c**, **dwc2/usb_glue_st.c** 文件中已经实现 + +- 拷贝 **xxx_msp.c** 中的 **HAL_PCD_MspInit** 函数中的内容到 **usb_dc_low_level_init** 函数中,屏蔽 st 生成的 usb 初始化 + +.. figure:: img/stm32_12.png +.. figure:: img/stm32_14.png + +- 在中断函数中调用 `USBD_IRQHandler`,并传入 `busid` + +.. figure:: img/stm32_13.png + +- 如果芯片带 cache,cache 修改参考 :ref:`usb_cache` 章节 + +- 调用 template 的内容初始化,并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBDEV_MAX_BUS` + +.. figure:: img/stm32_15.png + +USB Host 移植要点 +^^^^^^^^^^^^^^^^^^^^^^ + +前面 6 步与 Device 一样。需要注意,host 驱动只支持带 dma 的 hs port (引脚是 PB14/PB15),所以 fs port (引脚是 PA11/PA12)不做支持(没有 dma 你玩什么主机)。 + +- 添加 CherryUSB 必须要的源码( **usbh_core.c** 、 **usbh_hub.c** 、 **usb_hc_dwc2.c** 、 **usb_glue_st.c** 以及 **osal** 目录下的适配层文件),以及想要使用的 class 驱动,并且可以将对应的 **usb host.c** 添加方便测试。 + +.. figure:: img/stm32_16.png + +- 编译器推荐使用 **AC6**。勾选 **Microlib**,并实现 **printf** ,方便后续查看 log。 + +.. figure:: img/stm32_10.png +.. figure:: img/stm32_11.png + +- 复制一份 **cherryusb_config_template.h**,放到 `Core/Inc` 目录下,并命名为 `usb_config.h` + +.. note :: 以下两个步骤从 V1.5.0 开始不再需要,**fsdev/usb_glue_st.c**, **dwc2/usb_glue_st.c** 文件中已经实现 + +- 拷贝 **xxx_msp.c** 中的 `HAL_HCD_MspInit` 函数中的内容到 `usb_hc_low_level_init` 函数中,屏蔽 st 生成的 usb 初始化 +- 在中断函数中调用 `USBH_IRQHandler`,并传入 `busid` + +.. figure:: img/stm32_19.png + +- 链接脚本修改参考 :ref:`usbh_link_script` 章节 +- 如果芯片带 cache,cache 修改参考 :ref:`usb_cache` 章节 +- 调用 `usbh_initialize` 并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` +- 启动线程 + +.. figure:: img/stm32_18.png diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/env0.png b/src/lib/CherryUSB/docs/source/quick_start/img/env0.png new file mode 100644 index 000000000..c0a8b03fb Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/env0.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/env1.png b/src/lib/CherryUSB/docs/source/quick_start/img/env1.png new file mode 100644 index 000000000..2a68e052d Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/env1.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/env2.png b/src/lib/CherryUSB/docs/source/quick_start/img/env2.png new file mode 100644 index 000000000..ee37101ab Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/env2.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/esp1.png b/src/lib/CherryUSB/docs/source/quick_start/img/esp1.png new file mode 100644 index 000000000..1f059e714 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/esp1.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/esp2.png b/src/lib/CherryUSB/docs/source/quick_start/img/esp2.png new file mode 100644 index 000000000..fd20e9ce4 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/esp2.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/esp3.png b/src/lib/CherryUSB/docs/source/quick_start/img/esp3.png new file mode 100644 index 000000000..82a7162f0 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/esp3.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/esp4.png b/src/lib/CherryUSB/docs/source/quick_start/img/esp4.png new file mode 100644 index 000000000..ffb2882a0 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/esp4.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/question1.png b/src/lib/CherryUSB/docs/source/quick_start/img/question1.png new file mode 100644 index 000000000..a852e6aad Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/question1.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/question2.png b/src/lib/CherryUSB/docs/source/quick_start/img/question2.png new file mode 100644 index 000000000..e00b3bfa3 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/question2.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_1.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_1.png new file mode 100644 index 000000000..b91044a56 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_1.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_10.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_10.png new file mode 100644 index 000000000..d55b38e78 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_10.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_11.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_11.png new file mode 100644 index 000000000..3ad5b074a Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_11.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_12.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_12.png new file mode 100644 index 000000000..84aaffe8a Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_12.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_13.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_13.png new file mode 100644 index 000000000..f12fad75f Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_13.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_14.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_14.png new file mode 100644 index 000000000..e5aa5b199 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_14.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_15.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_15.png new file mode 100644 index 000000000..7c293287b Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_15.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_16.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_16.png new file mode 100644 index 000000000..70f2e63c0 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_16.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_18.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_18.png new file mode 100644 index 000000000..456df1896 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_18.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_19.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_19.png new file mode 100644 index 000000000..a796dc75e Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_19.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_2.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_2.png new file mode 100644 index 000000000..671b1b82a Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_2.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_3_1.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_3_1.png new file mode 100644 index 000000000..9e42196df Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_3_1.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_3_2.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_3_2.png new file mode 100644 index 000000000..492d67391 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_3_2.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_4_1.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_4_1.png new file mode 100644 index 000000000..e81437bcd Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_4_1.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_4_2.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_4_2.png new file mode 100644 index 000000000..dd90f5b86 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_4_2.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_5.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_5.png new file mode 100644 index 000000000..5bec9878b Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_5.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_6.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_6.png new file mode 100644 index 000000000..f0ad9a0b6 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_6.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_7.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_7.png new file mode 100644 index 000000000..8aef0bfa8 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_7.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/img/stm32_8.png b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_8.png new file mode 100644 index 000000000..08d2e724f Binary files /dev/null and b/src/lib/CherryUSB/docs/source/quick_start/img/stm32_8.png differ diff --git a/src/lib/CherryUSB/docs/source/quick_start/opensource.rst b/src/lib/CherryUSB/docs/source/quick_start/opensource.rst new file mode 100644 index 000000000..7990538e0 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/quick_start/opensource.rst @@ -0,0 +1,62 @@ +官方开源项目分享 +==================== + +除了基本的厂家 SDK 支持以外,我们还对一些火热的开源项目进行了支持,以便于开发者更好的使用这些项目。下面列举适配的 demo 工程链接,具体适配层参考 https://github.com/cherry-embedded/CherryUSB/tree/master/platform 。 + +DAPLINK +-------------- + +适配链接:https://github.com/cherry-embedded/CherryDAP + +Blackmagic +-------------- + +适配链接:https://github.com/zhangjiance/bmp-hpm-port + +RT-Thread +-------------- + +适配链接:https://github.com/RT-Thread/rt-thread + +NUTTX/VELA +-------------- + +适配链接:https://github.com/CherryUSB/cherryusb_nuttx + +Zephyr +-------------- + +适配链接:https://github.com/hpmicro/zephyr_sdk_glue + +Cangaroo +-------------- + +Cangaroo is an open source can bus analyzer software. We provide four-channel CANFD analyzer based on hpmicro hpm5361 + +适配上位机链接:https://github.com/RCSN/cangaroo_hpmicro_canfd_analyzer +适配下位机链接:https://github.com/RCSN/hpm_sdk_extra/tree/main/demos/cangaroo_hpmicro + +LVGL +-------------- + +适配链接:https://github.com/cherry-embedded/CherryUSB/tree/master/platform/lvgl + +QMK +-------------- + +QMK is an open-source keyboard firmware for Atmel AVR and Arm USB families. + +适配链接:待开放 + +Klipper +-------------- + +Klipper is a 3d-printer firmware. + +适配链接:待开放 + + +MAKCU/KMBOX +-------------- + +懂的都懂,不开放 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/quick_start/q&a.rst b/src/lib/CherryUSB/docs/source/quick_start/q&a.rst new file mode 100644 index 000000000..dfdbac85d --- /dev/null +++ b/src/lib/CherryUSB/docs/source/quick_start/q&a.rst @@ -0,0 +1,124 @@ +Q & A +============================== + +移植提问模板 +---------------- + +请在下列途径提交问题: +- RT-Thread 官方论坛: https://club.rt-thread.org/ask/tag/5f5f851966917b14.html +- Github issue: https://github.com/cherry-embedded/CherryUSB/issues/new/choose + +提问中请包含以下信息: + +- 使用的版本 +- 使用的板子,引脚,USB IP +- 是否配置 USB 中断,USB 时钟,USB 引脚,USB phy 配置,以及 USB 寄存器地址是否正确,截图 +- 是否能进 USB 中断 +- 芯片是否带有 cache功能,是否做了 no cache 处理,截图 +- USB 电路是否画正确,是否使用杜邦线连接,是否直连,如果正常,请说明正常原因 +- 如果能进中断,配置 **#define CONFIG_USB_DBG_LEVEL USB_DBG_LOG** 并提供 log,仅限商业 IP, 其余 IP 禁止开启 log,否则无法枚举 +- 是否流片并销售 + +其余问题提问模板 +------------------ + +具体说明现象,复现方式,使用我提供的 demo 再测试,以及提供完整 log + +CherryUSB 性能能到多少 +---------------------------------------------------------------- + +参考 :ref:`performace_show` + +ST IP 命名问题 +------------------ + +ST 命名为 USB_OTG_FS, USB_OTG_HS,并不是说明本身是高速或者全速,只是代表可以支持到高速,但是本身都是全速,需要外挂高速phy。因此,提问禁止说这两个词,请使用 USB0(PA11/PA12),USB1(PB14/PB15) 代替。其余国产厂家同理。 + +GD IP 问题 +------------------ + +GD IP 采用 DWC2,但是读取的硬件参数都是 0(我也不懂为什么不给人知道),因此需要用户自行知道硬件信息,从 1.5.0 开始由于需要读取硬件信息,因此无法直接使用。 + +其次 GD 复位以后无法使用 EPDIS 功能关闭端点,需要用户删除 reset 中断中的以下代码: + +.. code-block:: C + + USB_OTG_INEP(i)->DIEPCTL = (USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK); + USB_OTG_OUTEP(i)->DOEPCTL = (USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK); + +除此之外可能存在其他未知 BUG,请自行测试。 + +开启 USB_LOG_DBG 后无法枚举 +---------------------------------------------------------------- + +有且仅有商业性 IP 开启后可以枚举,其余 IP 禁止开启,否则无法枚举。懂得都懂。 + +USB3 CV测试用哪个版本 +------------------------------ + +1.4.3 版本及以上 + +Ep addr XXX fifo overflow +------------------------------ + +.. figure:: img/question1.png + +该错误表示该端点默认设置的 fifo 空间不够用,需要增大 fifo 空间,通常见于 DWC2/MUSB IP。FIFO 设置参考相关的 glue 文件。 + +Ep addr XXX overflow +------------------------------ + +.. figure:: img/question2.png + +该错误表示该 IP 硬件上没有这么多端点, 请更换 IP or 减少端点使用。 +当然也可以修改为双向端点,考虑到不是所有的 IP 都支持双向端点,因此默认 demo 不做双向功能,举例默认是 81 02 这样的而不是 81 01,如果支持,自行修改。某些 IP 双向端点可能会占用相同的硬件信息,不一定能同时使用,自行检查。 + +This dwc2 version does not support dma mode, so stop working +---------------------------------------------------------------- + +该 DWC2 版本不支持 dma 模式,禁止使用。不使用 DMA 模式会频繁触发 NAK 中断(大概几十us一次),CPU 占用率过高。 + +OTG 有哪些芯片支持 +------------------------------ + +当前主线仅 HPM 芯片支持 OTG 功能,通过 ID 引脚自动切换主从模式,其他芯片请使用手动切换模式 OR 自行实现添加 ID 识别的驱动。 + +PC 识别的 COM 口如何更改名称 +---------------------------------------------------------------- + +这是微软对 CDC ACM 的驱动问题,无法修改,如需修改,请联系微软并缴纳费用+编写驱动后即可更改。 + +connect 和 disconnect event 不触发 +---------------------------------------------------------------- + +当前仅 hpm 芯片支持 connect 和 disconnect 事件,其他芯片请使用 USB 检测 vbus 电路。DWC2 IP 支持,但是由于需要占用引脚,并且大多是log 口,然后不同使能的配置也不一样,因此不做支持。 + +__has_include 报错 +------------------------------------------------------------------ +如果报错,需要编译器支持 c99 语法,如果是 keil,请用 ac6 编译器 + +CONFIG_USB_HS 何时使用 +---------------------------------------------------------------- + +当你的芯片硬件支持高速,并想初始化成高速模式时开启,相关 IP 会根据该宏配置内部或者外部 高速 PHY。 + +Failed to enable port +---------------------------------------------------------------- + +供电不足或者硬件 USB 电路问题 + +移植 usb host 出现 urb 返回 -12/-14 +---------------------------------------------------------------- + +检查 phy 配置,cache 配置(如果有),电源供电(建议自供电) + +USB_ERR_NAK 说明 +---------------------------------------------------------------- + +USB_ERR_NAK 只存在于 DWC2 buffer dma 模式,DWC2 在 buffer dma模式下对于中断传输不支持硬件处理 NAK 中断,因此需要软件处理,导致 NAK 中断非常多,建议搭配定时器使用。 +DWC2 scatter/gather dma 模式下全部由硬件处理,但是不支持 split 传输。总结, **半斤 IP**。 + +USB host 连接 USB 网卡问题 +---------------------------------------------------------------- + +表现为能识别网卡并且分配到 IP 地址,但是无法 ping 通,这是因为网卡自身需要开启自动拨号,通常需要使用 AT 口设置。具体为 EC20/ML307 等模块。 diff --git a/src/lib/CherryUSB/docs/source/quick_start/rtthread.rst b/src/lib/CherryUSB/docs/source/quick_start/rtthread.rst new file mode 100644 index 000000000..e9c4df5b0 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/quick_start/rtthread.rst @@ -0,0 +1,62 @@ +基于 RT-Thread 软件包开发指南 +=============================== + +.. note:: CherryUSB 已经加入 RT-Thread 主线,可以选择使用主线版本,配置方式相同。 + +本节主要介绍使用 RT-Thread 提供的软件包管理器来配置工程,以 env 作为演示。本节操作不同芯片都一样,后续不再重复讲解。打开 env 以后使用 menuconfig 进入包管理器,并在如图所示路径中选择 CherryUSB。 + +.. figure:: img/env0.png + +从机配置 +-------------------------- + +* 选择 Enable usb device mode 并敲回车进入。 +* 首先第一个配置是配置 USB 的速度,分为 **FS、HS**,表示使用全速还是高速功能。高速功能要求内置高速 PHY 或者外接 PHY +* 其次第二个配置则是选择 USB device ip,不清楚自己芯片是哪个 ip 的可以参考 **port** 目录下对应的 readme。 +* 选择你想使用的 class +* 选择是否使用 demo 模板 + +.. figure:: img/env1.png + +* 最后退出保存即可。 +* 拷贝 `cherryusb_config_template.h` 文件到自己工程目录下,命名为 `usb_config.h`,并添加相应的目录头文件路径,并修改以下内容: + +.. code-block:: C + + #include "rtthread.h" + + #define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) + +* USB IP 相关的 config 需要用户自己根据芯片实际情况修改 +* 在代码中实现 `usb_dc_low_level_init` 函数 +* 在 USB 中断函数中调用 `USBD_IRQHandler`,并传入 `busid` +* 调用 `usbd_initialize` 并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBDEV_MAX_BUS` +* 使用 `scons --target=mdk5` 或者 `scons` 进行编译,如果是mdk,需要使用 AC6 编译器 +* 如果芯片带 cache,cache 修改参考 :ref:`usb_cache` 章节 + +主机配置 +-------------------------- + +* 选择 Enable usb host mode 并敲回车进入 +* 选择 USB host ip,不清楚自己芯片是哪个 ip 的可以参考 **port** 目录下对应的 readme +* 根据需要勾选 class 驱动 +* 选择是否开启模板 demo,推荐不用 + +.. figure:: img/env2.png + +* 最后退出保存即可。 +* 拷贝 `cherryusb_config_template.h` 文件到自己工程目录下,命名为 `usb_config.h`,并添加相应的目录头文件路径,并实现以下内容: + +.. code-block:: C + + #include "rtthread.h" + + #define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) + +* USB IP 相关的 config 需要用户自己根据芯片实际情况修改 +* 在代码中实现 `usb_hc_low_level_init` 函数 +* 在 USB 中断函数中调用 `USBH_IRQHandler`,并传入 `busid` +* 调用 `usbh_initialize` 并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` +* 使用 `scons --target=mdk5` 或者 `scons` 进行编译,如果是mdk,需要使用 AC6 编译器 +* 链接脚本修改参考 :ref:`usbh_link_script` 章节 +* 如果芯片带 cache,cache 修改参考 :ref:`usb_cache` 章节 diff --git a/src/lib/CherryUSB/docs/source/quick_start/share.rst b/src/lib/CherryUSB/docs/source/quick_start/share.rst new file mode 100644 index 000000000..a57a8e1e0 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/quick_start/share.rst @@ -0,0 +1,27 @@ +开发者经验/开源项目分享 +======================== + +- `RT-Thread-CherryUSB - RT-Thread `_ + +- `[HPM-DIY]hpm6750 USB开源协议栈性能对比-cherryusb or tinyusb? `_ + +- `RT-Thread-CherryUSB移植笔记(一):APM32F407VGT6 DWC2移植 Port.A Full-Speed + Por.B High-SpeedRT-Thread问答社区 - RT-Thread `_ + +- `华大HC32F460XXX移植cherryusb协议栈,实现USB CDC ACM_cherryusb移植教程-CSDN博客 `_ + +- `rt-thread使用cherryusb实现虚拟串口-CSDN博客 `_ + +- `F1C100S+rtt+CherryUSB的USB HOST成功读到U盘 / 全志 SOC / WhyCan Forum(哇酷开发者社区) `_ + +- `模仿stm32标准库风格写的库文件(f1c100s/f1c200s),且已移植了rt-thread、lvgl、fatfs、cherryusb / 全志 SOC / WhyCan Forum(哇酷开发者社区) `_ + +- `printalyzer-timer: F-Stop enlarging timer and print exposure meter `_ + +- `MiSTeryNano: Atari STE MiSTery core for the Tang Nano 20k FPGA `_ + +- `Cherryuf2 `_ + +- `PicoPiFi: Driverless RNDIS USB WIFI Dongle `_ + +- `phobia: Phobia Motor Controller `_ + diff --git a/src/lib/CherryUSB/docs/source/quick_start/start.rst b/src/lib/CherryUSB/docs/source/quick_start/start.rst new file mode 100644 index 000000000..c6223b619 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/quick_start/start.rst @@ -0,0 +1,53 @@ +入门必看 +================== + +首先欢迎大家来到 usb 的世界,在这里你可以学习到 usb 各种知识以及 cherryusb 的移植使用进阶等等。但是呢,刚进来的你,一定很懵懂,因为 USB 很难(其实当你学会了 cherryusb以后,你会发现,USB 一点都不难), +那么这种情况下,你的学习路线,应该是怎么样呢?在这里,我推荐大家是按照我得学习路线来学习,这样对你的 USB 成长是最有帮助的,并且你也不会中途放弃。 + +首先,不允许上来就看概念,有句古诗说的好, **纸上得来终觉浅,绝知此事要躬行** ,光看纸面上的东西,你是学不到什么的,只有当自己实践了,你才能更深入的了解这些概念。那么作为初学者,你应该怎么做呢?请看以下步骤。 + + +第一步 +------------- + +你需要学过 C 语言,UART, DMA,这是基础,如果没学过,请去学习,不然你会很吃力。你会问 USB 跟 UART/DMA 有什么关系? 我只能说两个字, **等价** + +第二步 +------------- + +下载 demo 工程并跑通能运行, **建议学习慢的,使用 demo 同型号芯片**,学习快的,可以选择自己移植相关支持的型号的芯片。你连 demo 都跑不通,你学什么 USB,你说对不对? + +第三步 +--------- + +非常好,到这步,说明你已经能熟练移植和跑通所有示例了,那么接下来,你应该学习什么呢? **事务**, **请求** 和 **描述符** (在 USB 的学习过程中,你只需要知道这三个,其余都不需要知道)。 + +第四步 +---------- + +首先我们需要知道 USB 事务包含 SETUP/IN/OUT,其实就是等价于发送命令,发送数据和接收数据,很简单。至于下面枚举中你在外面的网络中所听到的控制阶段,数据阶段,状态阶段,他不是事务,他只是用多个事务代表了一个阶段而已。 + +第五步 +---------- + +然后你再去看 **USB 枚举** 章节并且知道了一个概念: **描述符** ,这个时候,你就可以去简单看看什么是描述符,有哪些描述符,然后你需要记住, **设备、配置、接口、端点描述符的组成**,并背下来,其余的你都不需要知道,因为其他都是固定的,后续都是 CV 。群文件有各类设备枚举的抓包,可以下下来看看。 + +第六步 +---------- + +然后呢,你可以再去看看什么是 **请求** ,请求结构体的组成,看看有哪些请求,简单了解即可,为什么呢?因为它不过就是 8 字节的数据格式,大家都会写一个 UART + 自定义协议,那么 USB 的请求也是一样的,只不过是规定好了而已。 + +第七步 +---------- + +这个时候,你该去熟悉下协议栈的一些 API 了,参考 **API 手册** 章节。并且你需要知道中断完成的条件是什么,什么时候算接收完成,什么时候算发送完成,可以参考 **USB 知识点拓展** 章节。 + +第八步 +---------- + +到这步呢,你肯定已经非常懂了,然后就可以开始你的一些小功能小项目了,在此期间呢,请循环查看 **USB 知识点拓展** 章节,直到你真的理解了,因为这些内容是非常重要的,会影响我们代码的执行结果。 + +第九步 +---------- + +都到这步了,你应该不需要我了,这个时候,你可以去看看 USB 概念,看看 USB 的一些细节,看看 CherryUSB 的代码流程了。然后就是巩固巩固再巩固了。恭喜你,出师了!!! diff --git a/src/lib/CherryUSB/docs/source/quick_start/transplant.rst b/src/lib/CherryUSB/docs/source/quick_start/transplant.rst new file mode 100644 index 000000000..a6dcf14ed --- /dev/null +++ b/src/lib/CherryUSB/docs/source/quick_start/transplant.rst @@ -0,0 +1,137 @@ +芯片通用移植指南 +========================= + +本节主要介绍所有带 USB IP 的芯片,移植 CherryUSB 主从协议栈时的通用步骤和注意事项。在移植之前,需要 **你准备好一个可以打印 helloworld 的基本工程** ,默认打印使用 `printf`, 如果是主机模式, **则需要准备好可以正常执行 os 调度的基本工程**。 + +USB Device 移植要点 +----------------------- + +- 拷贝 CherryUSB 源码到工程目录下,并按需添加源文件和头文件路径,头文件路径建议全部添加。其中 `usbd_core.c` 和 `usb_dc_xxx.c` 为必须添加项。而 `usb_dc_xxx.c` 是芯片所对应的 USB IP dcd 部分驱动,如果不知道自己芯片属于那个 USB IP,参考 **port** 目录下的不同 USB IP 的 readme。如果使用的 USB IP 没有支持,只能自己实现了 +- 拷贝 `cherryusb_config_template.h` 文件到自己工程目录下,命名为 `usb_config.h`,并添加相应的目录头文件路径 +- 实现 `usb_dc_low_level_init` 函数(该函数主要负责 USB 时钟、引脚、中断的初始化)。该函数可以放在你想要放的任何参与编译的 c 文件中。如何进行 USB 的时钟、引脚、中断等初始化,请自行根据你使用的芯片原厂提供的源码中进行添加。 +- 在中断函数中调用 `USBD_IRQHandler`,并传入 `busid`, 如果你的 SDK 中中断入口已经存在 `USBD_IRQHandler` ,请更改 USB 协议栈中的名称 +- 如果芯片带 cache,cache 修改参考 :ref:`usb_cache` 章节 +- 注册描述符并调用 `usbd_initialize`,填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBDEV_MAX_BUS`,可以直接使用 demo 下的 template + +USB Host 移植要点 +----------------------- + +- 拷贝 CherryUSB 源码到工程目录下,并按需添加源文件和头文件路径,头文件路径建议全部添加。其中 `usbh_core.c` 、 `usb_hc_xxx.c` 以及 **osal** 目录下源文件(根据不同的 os 选择对应的源文件)为必须添加项。而 `usb_hc_xxx.c` 是芯片所对应的 USB IP hcd 部分驱动,如果不知道自己芯片属于那个 USB IP,参考 **port** 目录下的不同 USB IP 的 readme。如果使用的 USB IP 没有支持,只能自己实现了 +- 拷贝 `cherryusb_config_template.h` 文件到自己工程目录下,命名为 `usb_config.h`,并添加相应的目录头文件路径 +- 实现 `usb_hc_low_level_init` 函数(该函数主要负责 USB 时钟、引脚、中断的初始化)。该函数可以放在你想要放的任何参与编译的 c 文件中。如何进行 USB 的时钟、引脚、中断等初始化,请自行根据你使用的芯片原厂提供的源码中进行添加。 +- 调用 `usbh_initialize` 并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` +- 在中断函数中调用 `USBH_IRQHandler`,并传入 `busid`, 如果你的 SDK 中中断入口已经存在 `USBH_IRQHandler` ,请更改 USB 协议栈中的名称 +- 链接脚本修改参考 :ref:`usbh_link_script` 章节 +- 如果芯片带 cache,cache 修改参考 :ref:`usb_cache` 章节 +- 调用 `usbh_initialize` ,填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` 。基础的 cdc + hid + msc 参考 `usb_host.c` 文件,其余参考 **platform** 目录下适配 + +.. _usbh_link_script: + +主机链接脚本修改 +----------------------- + +在使用主机时,如果没有修改链接脚本,会报 `__usbh_class_info_start__` 和 `__usbh_class_info_end__` 未定义的错误。因为主机协议栈需要在链接脚本中添加一个 section 来存储 class 信息。 + +- 如果使用的是 KEIL 无需修改 + +- 如果使用的是 GCC ,需要在链接脚本中添加如下代码(需要放在 flash 位置,建议放最后): + +.. code-block:: C + + // 在 ld 文件中添加如下代码 + . = ALIGN(4); + __usbh_class_info_start__ = .; + KEEP(*(.usbh_class_info)) + __usbh_class_info_end__ = .; + +GCC 举例如下: + +.. code-block:: C + + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + __usbh_class_info_start__ = .; + KEEP(*(.usbh_class_info)) + __usbh_class_info_end__ = .; + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } > FLASH + +- Segger Embedded Studio 举例如下: + +.. code-block:: C + + define block cherryusb_usbh_class_info { section .usbh_class_info }; + + define exported symbol __usbh_class_info_start__ = start of block cherryusb_usbh_class_info; + define exported symbol __usbh_class_info_end__ = end of block cherryusb_usbh_class_info + 1; + + place in AXI_SRAM { block cherryusb_usbh_class_info }; + keep { section .usbh_class_info}; + + +.. _usb_cache: + +cache 配置修改 +------------------------------- + +对于带 cache 的芯片,协议栈以及 port 中不会对 cache 区域的 ram 进行 clean 或者 invalid,所以需要使用一块非 cache 区域的 ram 来维护。 +`USB_NOCACHE_RAM_SECTION` 宏表示将变量指定到非 cache ram上,默认 `USB_NOCACHE_RAM_SECTION` 定义为 `__attribute__((section(".noncacheable")))`。 +因此,用户需要在对应的链接脚本中添加 no cache ram 的 section,并且 section 段包含 `.noncacheable`。 + +.. note:: 需要注意,光修改链接脚本中的 nocache section 是不够的,还需要配置该 section 中的 ram 是真的 nocache,一般需要配置 mpu 属性(arm 的参考 stm32h7 demo)。 + +GCC: + +.. code-block:: C + + MEMORY + { + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K - 64K + RAM_nocache (xrw) : ORIGIN = 0x20030000, LENGTH = 64K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K + } + + ._nocache_ram : + { + . = ALIGN(4); + *(.noncacheable) + } >RAM_nocache + + +SCT: + +.. code-block:: C + + LR_IROM1 0x08000000 0x00200000 { ; load region size_region + ER_IROM1 0x08000000 0x00200000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM2 0x24000000 0x00070000 { ; RW data + .ANY (+RW +ZI) + } + USB_NOCACHERAM 0x24070000 0x00010000 { ; RW data + *(.noncacheable) + } + } + +ICF: + +.. code-block:: C + + define region NONCACHEABLE_RAM = [from 0x1140000 size 256K]; + place in NONCACHEABLE_RAM { section .noncacheable, section .noncacheable.init, section .noncacheable.bss }; // Noncacheable diff --git a/src/lib/CherryUSB/docs/source/show/img/usbdev_msc.png b/src/lib/CherryUSB/docs/source/show/img/usbdev_msc.png new file mode 100644 index 000000000..30f223835 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbdev_msc.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_linux.png b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_linux.png new file mode 100644 index 000000000..94b97312a Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_linux.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_lwip.png b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_lwip.png new file mode 100644 index 000000000..f4cfd0b3c Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_lwip.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_lwip2.png b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_lwip2.png new file mode 100644 index 000000000..3fde91f9c Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_lwip2.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_wifi.png b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_wifi.png new file mode 100644 index 000000000..d6817876e Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_wifi.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_wifi2.png b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_wifi2.png new file mode 100644 index 000000000..dba9f3ddd Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_wifi2.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_win.png b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_win.png new file mode 100644 index 000000000..5293023a0 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbdev_rndis_win.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbdev_uvc_mjpeg.png b/src/lib/CherryUSB/docs/source/show/img/usbdev_uvc_mjpeg.png new file mode 100644 index 000000000..a2321c157 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbdev_uvc_mjpeg.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbdev_uvc_yuv.png b/src/lib/CherryUSB/docs/source/show/img/usbdev_uvc_yuv.png new file mode 100644 index 000000000..a630cd672 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbdev_uvc_yuv.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbhost_ax88772_1.png b/src/lib/CherryUSB/docs/source/show/img/usbhost_ax88772_1.png new file mode 100644 index 000000000..a267b292e Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbhost_ax88772_1.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbhost_ax88772_2.png b/src/lib/CherryUSB/docs/source/show/img/usbhost_ax88772_2.png new file mode 100644 index 000000000..fc6e96fcd Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbhost_ax88772_2.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbhost_hub.png b/src/lib/CherryUSB/docs/source/show/img/usbhost_hub.png new file mode 100644 index 000000000..011468c79 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbhost_hub.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbhost_hub2.png b/src/lib/CherryUSB/docs/source/show/img/usbhost_hub2.png new file mode 100644 index 000000000..00c09d6f9 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbhost_hub2.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbhost_msc.png b/src/lib/CherryUSB/docs/source/show/img/usbhost_msc.png new file mode 100644 index 000000000..ec546a8d0 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbhost_msc.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbhost_msc_xhci.png b/src/lib/CherryUSB/docs/source/show/img/usbhost_msc_xhci.png new file mode 100644 index 000000000..084250f26 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbhost_msc_xhci.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbhost_rndis.png b/src/lib/CherryUSB/docs/source/show/img/usbhost_rndis.png new file mode 100644 index 000000000..12ab1a4e5 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbhost_rndis.png differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbhost_uvc.gif b/src/lib/CherryUSB/docs/source/show/img/usbhost_uvc.gif new file mode 100644 index 000000000..c4df04e07 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbhost_uvc.gif differ diff --git a/src/lib/CherryUSB/docs/source/show/img/usbhost_wifi.png b/src/lib/CherryUSB/docs/source/show/img/usbhost_wifi.png new file mode 100644 index 000000000..e57fd85ba Binary files /dev/null and b/src/lib/CherryUSB/docs/source/show/img/usbhost_wifi.png differ diff --git a/src/lib/CherryUSB/docs/source/show/index.rst b/src/lib/CherryUSB/docs/source/show/index.rst new file mode 100644 index 000000000..c5d3f7087 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/show/index.rst @@ -0,0 +1,103 @@ +.. _performace_show: + +性能展示 +============================== + +以下演示了 CherryUSB 在不同应用中的性能表现。主要演示高速模式,全速看不出什么性能差异。 + +CDC ACM 通信 +---------------- + +可以达到硬件极限性能,当然需要硬件理论支持到这速度,CherryUSB 就支持到这速度,举例如下: + +- HPM 系列(从机可以到 42MB/S, 主机 44MB/S, 已经达到硬件极限) +- BL 系列(从机 32MB/S, 主机 25MB/S, 已经达到硬件极限) +- STM32F4 全速(从机 900KB/S, 主机 1.12MB/S, 已经达到硬件极限) + +从机测速demo: cdc_acm_template.c 并且关闭 log,脚本使用 `tools/test_srcipts/test_cdc_speed.py` +主机测速demo: usb_host.c 中 TEST_USBH_CDC_SPEED=1 + +USB Device MSC +----------------- + +演示 USB Device MSC 使用 SDXC3.0 + EMMC 测试。 + +.. figure:: img/usbdev_msc.png + +USB Device RNDIS +----------------------- + +.. note:: 默认 rndis 仅支持单包,因此下面速度为最低速度。多包支持需要联系作者。 + +演示 USB Device RNDIS 局域网下搭配 lwip 的速度。 + +作为 client + +.. figure:: img/usbdev_rndis_lwip.png + +作为 server + +.. figure:: img/usbdev_rndis_lwip2.png + +演示 USB Device RNDIS + WIFI 透传测试。 + +.. figure:: img/usbdev_rndis_wifi.png +.. figure:: img/usbdev_rndis_wifi2.png + +演示 USB Device RNDIS + 百兆以太网透传测试。 + +.. figure:: img/usbdev_rndis_win.png +.. figure:: img/usbdev_rndis_linux.png + +USB Device UVC +----------------------- + +演示 USB Device UVC + 摄像头传输 YUYV/MJPEG 640 * 480 图像。FPS 30。 + +.. figure:: img/usbdev_uvc_mjpeg.png +.. figure:: img/usbdev_uvc_yuv.png + +USB Host HUB +----------------------- + +多级 hub 支持,演示 1托 7 HUB + +.. figure:: img/usbhost_hub.png +.. figure:: img/usbhost_hub2.png + +USB Host MSC +----------------------- + +演示 USB Host MSC 在 USB2.0 和 USB3.0 下的速度,U盘推荐使用固态测试。 + +.. figure:: img/usbhost_msc.png +.. figure:: img/usbhost_msc_xhci.png + +USB Host UVC +----------------------- + +演示 USB Host UVC 驱动 648 * 480 YUV 摄像头。FPS 30。 + +.. figure:: img/usbhost_uvc.gif + +USB Host ASIX 网卡 +----------------------- + +演示 USB Host 驱动 AX88772 USB 以太网模块。 + +.. figure:: img/usbhost_ax88772_1.png +.. figure:: img/usbhost_ax88772_2.png + +USB Host RNDIS 网卡 +----------------------- + +演示 USB Host 驱动手机,手机开启 USB 共享网络即可使用 RNDIS 。 + +.. figure:: img/usbhost_rndis.png + +USB Host WIFI +----------------------- + +演示 USB Host 驱动 BL616 USB WIFI。 + +.. figure:: img/usbhost_wifi.png diff --git a/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuac.png b/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuac.png new file mode 100644 index 000000000..6050f531d Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuac.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuvc1.png b/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuvc1.png new file mode 100644 index 000000000..70b4dd1a2 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuvc1.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuvc2.png b/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuvc2.png new file mode 100644 index 000000000..8885e90ec Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuvc2.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuvc3.png b/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuvc3.png new file mode 100644 index 000000000..fb3e1eef1 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/dwc2_hostuvc3.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/ehci_hostuvc1.png b/src/lib/CherryUSB/docs/source/support/img/ehci_hostuvc1.png new file mode 100644 index 000000000..2bd6590a2 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/ehci_hostuvc1.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/ehci_hostuvc2.png b/src/lib/CherryUSB/docs/source/support/img/ehci_hostuvc2.png new file mode 100644 index 000000000..f44fa68c7 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/ehci_hostuvc2.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/mtpdev.png b/src/lib/CherryUSB/docs/source/support/img/mtpdev.png new file mode 100644 index 000000000..513b8ac97 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/mtpdev.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/ohci.png b/src/lib/CherryUSB/docs/source/support/img/ohci.png new file mode 100644 index 000000000..171f77be3 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/ohci.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/rndisrx.png b/src/lib/CherryUSB/docs/source/support/img/rndisrx.png new file mode 100644 index 000000000..ce1133ede Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/rndisrx.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/rndistx.png b/src/lib/CherryUSB/docs/source/support/img/rndistx.png new file mode 100644 index 000000000..69e45db81 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/rndistx.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/tmcdev1.png b/src/lib/CherryUSB/docs/source/support/img/tmcdev1.png new file mode 100644 index 000000000..1eaf71556 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/tmcdev1.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/tmcdev2.png b/src/lib/CherryUSB/docs/source/support/img/tmcdev2.png new file mode 100644 index 000000000..97c8297bb Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/tmcdev2.png differ diff --git a/src/lib/CherryUSB/docs/source/support/img/usbhost_uvc.gif b/src/lib/CherryUSB/docs/source/support/img/usbhost_uvc.gif new file mode 100644 index 000000000..c4df04e07 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/support/img/usbhost_uvc.gif differ diff --git a/src/lib/CherryUSB/docs/source/support/index.rst b/src/lib/CherryUSB/docs/source/support/index.rst new file mode 100644 index 000000000..e30c4bb05 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/support/index.rst @@ -0,0 +1,43 @@ +商业支持 +============================== + +以下内容为商业收费类,如需支持,请邮件到 1203593632@qq.com。 + +- OHCI 驱动 + +.. figure:: img/ohci.png + +- EHCI IP 中 ISO 驱动和 UAC/UVC 框架,搭配主机 UVC & UAC 类(这部分是开源的)使用。iso 支持一个微帧 1/2/3 包,支持 MJPEG 和 YUV 摄像头 + +.. figure:: img/ehci_hostuvc1.png +.. figure:: img/ehci_hostuvc2.png + +演示 USB Host UVC 驱动 648 * 480 YUV 摄像头。FPS 30。 + +.. figure:: img/usbhost_uvc.gif + +- DWC2 IP 中 ISO 驱动和 UAC/UVC 框架,搭配主机 UVC & UAC 类(这部分是开源的)使用。iso 支持一个微帧 1/2/3 包,支持 MJPEG 和 YUV 摄像头 + +.. figure:: img/dwc2_hostuvc1.png +.. figure:: img/dwc2_hostuvc2.png +.. figure:: img/dwc2_hostuvc3.png +.. figure:: img/dwc2_hostuac.png + +- MUSB IP 中 ISO 驱动和 UAC/UVC 框架,搭配主机 UVC & UAC 类(这部分是开源的)使用。MUSB 需要为 mentor 公司制定的标准 IP + +- 从机 MTP 类驱动, 支持多文件和多文件夹,支持 MCU 端增删文件并与 PC 同步 + +.. figure:: img/mtpdev.png + +- 从机 TMC 类驱动 + +.. figure:: img/tmcdev1.png +.. figure:: img/tmcdev2.png + +- USB 网卡类高性能版本优化,包含 CDC-NCM, CDC-RNDIS, 私有类驱动(支持多包发送和接收),下面举例 RNDIS + +.. figure:: img/rndistx.png +.. figure:: img/rndisrx.png + +- 定制化 class 驱动或者 IP 驱动适配 +- 技术支持相关 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/tools/img/chrytool1.png b/src/lib/CherryUSB/docs/source/tools/img/chrytool1.png new file mode 100644 index 000000000..8717316a4 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/tools/img/chrytool1.png differ diff --git a/src/lib/CherryUSB/docs/source/tools/img/chrytool2.png b/src/lib/CherryUSB/docs/source/tools/img/chrytool2.png new file mode 100644 index 000000000..a0eb41928 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/tools/img/chrytool2.png differ diff --git a/src/lib/CherryUSB/docs/source/tools/img/chrytool3.png b/src/lib/CherryUSB/docs/source/tools/img/chrytool3.png new file mode 100644 index 000000000..52a3556b8 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/tools/img/chrytool3.png differ diff --git a/src/lib/CherryUSB/docs/source/tools/img/chrytool4.png b/src/lib/CherryUSB/docs/source/tools/img/chrytool4.png new file mode 100644 index 000000000..8ad68400a Binary files /dev/null and b/src/lib/CherryUSB/docs/source/tools/img/chrytool4.png differ diff --git a/src/lib/CherryUSB/docs/source/tools/img/chrytool5.png b/src/lib/CherryUSB/docs/source/tools/img/chrytool5.png new file mode 100644 index 000000000..178493240 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/tools/img/chrytool5.png differ diff --git a/src/lib/CherryUSB/docs/source/tools/img/chrytool6.png b/src/lib/CherryUSB/docs/source/tools/img/chrytool6.png new file mode 100644 index 000000000..931ccad81 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/tools/img/chrytool6.png differ diff --git a/src/lib/CherryUSB/docs/source/tools/img/chrytool7.png b/src/lib/CherryUSB/docs/source/tools/img/chrytool7.png new file mode 100644 index 000000000..283a7fc93 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/tools/img/chrytool7.png differ diff --git a/src/lib/CherryUSB/docs/source/tools/index.rst b/src/lib/CherryUSB/docs/source/tools/index.rst new file mode 100644 index 000000000..0ebfb31d2 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/tools/index.rst @@ -0,0 +1,50 @@ +chryusb_configurator +-------------------------- + +`chryusb_configurator `_ 主要服务在使用设备协议栈时,生成描述符数组,从而调用 `usbd_desc_register` 进行注册。 + +- 首先我们从 github 下载 chryusb_configurator.exe,然后一路安装就可以了。然后双击打开,点击 `工程`,并点击 `新建工程` + +.. figure:: img/chrytool1.png + +- 新建完成以后,会生成默认的描述符配置,包含 **设备描述符**、 **配置描述符**、 **字符串描述符**,并且 **字符串描述符** 默认支持三个 + +.. figure:: img/chrytool2.png + +- 然后我们可以根据需要修改相关描述符的信息,比如 **设备描述符** 中的 vid、pid,class 参数, **配置描述符** 中的 **Power** 等等 + +- 然后是 class 的添加,需要点击 `文件`,并点击 `新建文件` + +.. figure:: img/chrytool3.png + +- 然后右侧提供了一些 class 的描述符模板,选择一个进行初始化 + +.. figure:: img/chrytool4.png + +- 如果是多个 class ,则上述两步重复操作就可以了 + +- 然后我们根据需要修改相关端点的参数,比如方向、地址、size、interval + +.. figure:: img/chrytool5.png + +- 最后点击 `文件` 并保存文件,后缀为 `.chry` +- 切换到工程文件,后缀是 `.chrybase`, 然后点击 `添加分组配置` 导入刚刚配置好的 class 文件 + +.. figure:: img/chrytool6.png + +- 点击 `工程` 并点击 `保存工程` +- 点击 `编译`,生成描述符数组 + +.. figure:: img/chrytool7.png + +- 复制编译后的文件到自己的工程中使用即可 + + +力科 USB Protocol Suite +-------------------------- + +Wireshark +-------------------------- + +Audacity +-------------------------- diff --git a/src/lib/CherryUSB/docs/source/usb/img/1.png b/src/lib/CherryUSB/docs/source/usb/img/1.png new file mode 100644 index 000000000..e85ddf7af Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/1.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/10.png b/src/lib/CherryUSB/docs/source/usb/img/10.png new file mode 100644 index 000000000..bb57645ec Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/10.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/11.png b/src/lib/CherryUSB/docs/source/usb/img/11.png new file mode 100644 index 000000000..11056e33c Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/11.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/12.png b/src/lib/CherryUSB/docs/source/usb/img/12.png new file mode 100644 index 000000000..4149d81ef Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/12.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/13.png b/src/lib/CherryUSB/docs/source/usb/img/13.png new file mode 100644 index 000000000..29a544b2f Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/13.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/14.png b/src/lib/CherryUSB/docs/source/usb/img/14.png new file mode 100644 index 000000000..8ca094a40 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/14.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/15.png b/src/lib/CherryUSB/docs/source/usb/img/15.png new file mode 100644 index 000000000..eba7b89b9 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/15.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/16.png b/src/lib/CherryUSB/docs/source/usb/img/16.png new file mode 100644 index 000000000..259336caf Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/16.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/17.png b/src/lib/CherryUSB/docs/source/usb/img/17.png new file mode 100644 index 000000000..c42de3905 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/17.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/18.png b/src/lib/CherryUSB/docs/source/usb/img/18.png new file mode 100644 index 000000000..f08b63543 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/18.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/19.png b/src/lib/CherryUSB/docs/source/usb/img/19.png new file mode 100644 index 000000000..2e6eb9ce7 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/19.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/2.png b/src/lib/CherryUSB/docs/source/usb/img/2.png new file mode 100644 index 000000000..5b4f5f20d Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/2.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/20.png b/src/lib/CherryUSB/docs/source/usb/img/20.png new file mode 100644 index 000000000..a44898a8c Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/20.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/21.png b/src/lib/CherryUSB/docs/source/usb/img/21.png new file mode 100644 index 000000000..7aa81e955 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/21.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/22.png b/src/lib/CherryUSB/docs/source/usb/img/22.png new file mode 100644 index 000000000..370d39f99 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/22.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/23.png b/src/lib/CherryUSB/docs/source/usb/img/23.png new file mode 100644 index 000000000..e08db16e1 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/23.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/24.png b/src/lib/CherryUSB/docs/source/usb/img/24.png new file mode 100644 index 000000000..fec98d49a Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/24.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/25.png b/src/lib/CherryUSB/docs/source/usb/img/25.png new file mode 100644 index 000000000..9bcaf151d Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/25.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/26.png b/src/lib/CherryUSB/docs/source/usb/img/26.png new file mode 100644 index 000000000..d439b7c48 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/26.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/27.png b/src/lib/CherryUSB/docs/source/usb/img/27.png new file mode 100644 index 000000000..1047da1b0 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/27.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/28.png b/src/lib/CherryUSB/docs/source/usb/img/28.png new file mode 100644 index 000000000..95b760c5f Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/28.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/29.png b/src/lib/CherryUSB/docs/source/usb/img/29.png new file mode 100644 index 000000000..09538d161 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/29.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/3.png b/src/lib/CherryUSB/docs/source/usb/img/3.png new file mode 100644 index 000000000..b8ef08230 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/3.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/30.png b/src/lib/CherryUSB/docs/source/usb/img/30.png new file mode 100644 index 000000000..d3014f953 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/30.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/4.png b/src/lib/CherryUSB/docs/source/usb/img/4.png new file mode 100644 index 000000000..f80c53667 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/4.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/5.png b/src/lib/CherryUSB/docs/source/usb/img/5.png new file mode 100644 index 000000000..ec6a4ba20 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/5.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/6.png b/src/lib/CherryUSB/docs/source/usb/img/6.png new file mode 100644 index 000000000..2d280398a Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/6.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/7.png b/src/lib/CherryUSB/docs/source/usb/img/7.png new file mode 100644 index 000000000..e7562f118 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/7.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/8.png b/src/lib/CherryUSB/docs/source/usb/img/8.png new file mode 100644 index 000000000..a4ac6ad4c Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/8.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/9.png b/src/lib/CherryUSB/docs/source/usb/img/9.png new file mode 100644 index 000000000..a8b5b2a3b Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/9.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/overview1.png b/src/lib/CherryUSB/docs/source/usb/img/overview1.png new file mode 100644 index 000000000..fbaf5a193 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/overview1.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/overview2.png b/src/lib/CherryUSB/docs/source/usb/img/overview2.png new file mode 100644 index 000000000..c8b3b779b Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/overview2.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/usb_enum.png b/src/lib/CherryUSB/docs/source/usb/img/usb_enum.png new file mode 100644 index 000000000..01c67c156 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/usb_enum.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/usb_request.png b/src/lib/CherryUSB/docs/source/usb/img/usb_request.png new file mode 100644 index 000000000..bb9f26378 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/usb_request.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/img/usbstruct.png b/src/lib/CherryUSB/docs/source/usb/img/usbstruct.png new file mode 100644 index 000000000..bd062ca39 Binary files /dev/null and b/src/lib/CherryUSB/docs/source/usb/img/usbstruct.png differ diff --git a/src/lib/CherryUSB/docs/source/usb/usb2.0_basic.rst b/src/lib/CherryUSB/docs/source/usb/usb2.0_basic.rst new file mode 100644 index 000000000..1c2b599e7 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usb/usb2.0_basic.rst @@ -0,0 +1,296 @@ +USB 基本概念(2.0 为主) +=========================== + +本文主要对 USB 官方手册 `usb2.0.pdf `_ 中提供的第五章、第七章、第八章、第九章进行讲解。 +如果是初学 usb 的同学,推荐先不要看本节,而是将示例 demo 能够跑通了,熟悉了使用,再来看。 + +简介 +--------- + +USB 是什么?干什么用的?有什么优点?这些大家可以百度,我就不提了。主要先说 USB 的接口和速度根据不同的 USB 版本的分类,如图所示: + +.. figure:: img/overview1.png + +其次是 USB 需要满足的电平标准,有了电平标准后,下面说的信号状态就可以进行分类了。USB2.0 和 USB3.0 支持的电压范围和最大电流如下: + +.. figure:: img/overview2.png + +USB 信号状态 +----------------- + +首先我们需要了解的是 USB 的电气特性中的 Signaling Level,也就是信号状态。USB 主要是靠 D+ 和 D- 来实现不同的信号状态,然后进行通信。官方手册 7.1.7 中列举出了低速、全速和高速时的信号状态对应的 D+ 和 D- 需要满足的要求。 + +.. figure:: img/1.png +.. figure:: img/2.png +.. figure:: img/3.png + +- **差分 0 和差分 1**: 这两个状态用于通过 USB 进行的通用数据通信。当 D+线为高电平、 D-线为低电平时,该状态为差分 1。当 D+线为低电平、 D-线为高电平时,该状态为差分 0。 +- **J 状态和 K 状态**: 除了差分信号外, USB 规范还定义了其他两个差分状态: J 状态和 K 状态。它们的定义由设备速度决定。在全速和高速设备上, J 状态为差分 1 而 K 状态是差分 0。在低速设备上,该情况则相反。 +- **单端 0( SE0)**: 在 D+和 D-均为低电平时所发生的状态。该状态表示一个复位、断连或数据包的结束。 +- **单端 1( SE1)**: 在 D+和 D-均为高电平时发生的状态。不会故意生成该状态,并且不能在 USB 设计中出现。 +- **闲置**: 必须在发送一个数据包的前后发生的状态。如果一个数据线为低电平,而另一个数据线为高电平,则表示闲置状态。高电平和低电平的定义由设备的速度决定。在全速设备上,闲置状态是指 D+为高电平、 D-为低电平。在低速设备上,该情况则相反。 +- **恢复**: 用于使设备从挂起状态唤醒。通过发送一个 K 状态实现该操作。 +- **数据包的开始( SOP)**: 当 D+和 D-线从闲置状态转换到 K 状态时,将在开始低速或全速数据包前发生。 +- **数据包的结束( EOP)**: 在低速或全速数据包结束时发生。当 SE0 状态持续两位时间(后面的内容将介绍位时间)以及 J 状态持续 1 位时间时,将发生 EOP。 +- **复位**: 在 SE0 状态持续 10 ms 时发生。在 SE0 至少持续 2.5 ms 后,该设备会复位,并开始进入复位状态。 +- **保持活动( Keep Alive)**: 在低速设备中使用的信号。低速设备缺少了一个帧起始数据包(用于防止挂起状态)。每次经过 1 ms,它们都会使用一个 EOP 来防止设备进入挂起状态。 + +.. note::这里需要注意的一点就是, J K状态和差分0/1,对于低速来说,和全速/高速是相反的。 + +下面我们通过一个波形,来区分这些信号状态: + +.. figure:: img/4.png + +- 第一个红框,可以看出是一个数据包的开始,并且假设这是一个全速设备,那么D+ 为高,D- 为低,是一个闲置状态。 +- 第二个红框,D+为低,D- 为高,说明是一个 K 状态,由 闲置转 K 状态说明他是一个 SOP。 +- 第三个红框开始表示数据,表示 JKJKJKJKJK。 +- 第四个红框表示 SE0 ,因为D+和 D-均为低电平。 +- 第五个红框,而 SE0 持续了一段时间后,变成了 D+高,D- 低,说明他是一个 J 状态,从 SE0 切换成 J 状态,说明他是一个 EOP。 + +USB 速度识别 +--------------------- + +USB 的速度是如何判定的? 这个见手册 7.1.5.1。USB 的速度检测主要是靠 D+ 和 D-线上拉 1.5K决定,如果 D+上拉1.5k,则该设备为全速设备,如果 D-上拉1.5k,则为低速设备。而高速设备初始是以一个全速设备的身份出现,和全速设备一样,D+线上有一个1.5k的上拉电阻。USB2.0的hub把它当作一个全速设备,之后,hub 和设备通过一系列握手信号确认双方的身份,最终判定该设备为高速设备。 + +.. figure:: img/5.png + +USB 连接与断开检测 +--------------------- + +那么 当我们的设备插上 USB 主机时,主机是如何知道有设备插入或者拔出呢?手册 7.1.7.3 给出了答案,如图所示: + +.. figure:: img/6.png +.. figure:: img/7.png + +首先是连接检测,主机检测到某一个数据线电平拉高保持了一段时间,就认为有设备连接上来了。低速设备连接时,主机会检测到D-线被拉高,全速/高速设备连接时,主机会检测到D+线被拉高。 +而断开检测,则是主机端D+、D-数据线上的下拉电阻起作用,断开后使得二者都在低电平;当低电平持续 TDDIS 时间就会被主机认为是断开状态。上图中,TDDIS在2到2.5us之间。 + +USB 电源 +--------------------- + +作为 USB 电源时, USB 设备可被划分为两种设备类型:总线供电和自供电。 + +- 总线供电是 USB 设计的一个优势。由于设备通过总线供电,因此不需要使用笨重的内部或外部电源,它仍能够维持自身操作。总线可由主机或集线器供电。使用某个总线供电的设备时,用户将设备配置为某种状态前必须考虑其功耗。 +- 自供电设备通过使用外部电源(如直流电源适配器或电池)为自己供电。自供电设备在进行设计的过程中需要考虑到一些注意事项。 USB 规范要求自供电设备一直监控自己的 VBUS 线。 VBUS 不存在的时间内,设备必须断开提供给 D+/D-线上的上拉电阻的电源,从而防止向主机或集线器供电。 否则,会导致 USB 合规性测试发生失败。但是自供电集线器能够从总线获得最多 100 mA 的电流。 + +USB 设备状态 +--------------------- + +在 USB 插上主机的那一刻, USB 设备本身的设备状态是会变化的。而这个设备状态,后面如果学习到枚举过程,可以知道,其实这段变化描述的就是枚举过程。这部分见手册 9.1.1。 + +.. figure:: img/9.png + +- 连接状态: 当将某个设备插入到主机/集线器,但主机/集线器不给 VBUS 线供电时,会出现这种状态。它通常在集线器检测到一个过流事件时出现。虽然仍连接着设备,但主机移除了供给它的电源。 +- 供电: 某个设备被连接到 USB 上并得到供电,但仍未接收到一个复位请求。 +- 默认: 某个设备被连接到 USB 上、得到供电,并且由主机进行了复位。这时,设备没有任何设备地址。 设备会响应地址 0。 +- 地址: 某个设备被连接到 USB、得到供电、被复位,并且有一个唯一的地址。但是设备仍未得到配置。 +- 配置: 设备已经连接到 USB、得到供电、被复位、具有唯一的地址、得到配置,但尚未进入挂起状态。此时,总线供电设备能够消耗超过 100 mA 的电流。 +- 挂起: 如上面所述,设备已经建立好了连接,并且得到配置,但在 3 ms 时间内不会进行任意总线操作。 + +翻译成中文图就是: + +.. figure:: img/10.png + +USB 编码与位填充 +--------------------- + +首先,USB 的数据是串行发送的,就像 UART、I2C、SPI 等等,连续的01 信号只通过一根数据线发送给接受者。但是因为发送者和接收者运行的频率不一样,信号的同步就是个问题,比如,接受者接收到了一个持续一段时间的低电平,无法得知这究竟是代表了 5 个 0 还是 1000 个 0。一个解决办法,就是在传输数据信号的同时,附加一个时钟信号,用来同步两端的传输,接受者在时钟信号的辅助下对数据信号采样,就可以正确解析出发送的数据了,比如 I2C 就是这样做的,SDA 来传输数据,SCL 来传输同步时钟: + +.. figure:: img/11.png + +虽然这样解决了问题,但是却需要附加一根时钟信号线来传输时钟。因为USB没有时钟信号,有没有不需要附加的时钟信号,也能保持两端的同步呢? +有的,这就是 RZ 编码(Return-to-zero Code),也叫做归零编码。 + +RZ 编码(Return-to-zero Code) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +RZ 编码(Return-to-zero Code),也叫做归零编码。在 RZ 编码中,正电平代表逻辑 1,负电平代表逻辑 0,并且,每传输完一位数据,信号返回到零电平,也就是说,信号线上会出现 3 种电平:正电平、负电平、零电平。 + +.. figure:: img/12.png + +从图上就可以看出来,因为每位传输之后都要归零,所以接受者只要在信号归零后采样即可,这样就不在需要单独的时钟信号。实际上, RZ 编码就是相当于把时钟信号用归零编码在了数据之内。这样的信号也叫做自同步(self-clocking)信号。 +这样虽然省了时钟数据线,但是还是有缺点的,因为在 RZ 编码中,大部分的数据带宽,都用来传输“归零”而浪费掉了。 + +NRZ 编码(Non-return-to-zero Code) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +去掉这个归零步骤,NRZ 编码(Non-return-to-zero Code)就出现了,和 RZ 的区别就是 NRZ 是不需要归零的。 + +.. figure:: img/13.png + +NRZI 编码(Non-Return-to-Zero Inverted Code) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +NRZI 编码(Non-Return-to-Zero Inverted Code)和 NRZ 的区别就是 NRZI 用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑。这个见手册 7.1.8。 + +.. figure:: img/14.png + +如图所示,可以得出一个简单的记忆方式:遇到 0 的边沿电平就翻转,遇到 1 的边沿则不变。 + +位填充(bit-stuffing) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是 1000 个逻辑 1,经过 USB 的 NRZI 编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者 999 个 1了。 +USB 对这个问题的解决办法,就是强制插 0,也就是(位填充)bit-stuffing,如果要传输的数据中有 6个连续的 1,发送前就会在第 6 个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。 +接受者只要删除 6 个连续 1 之后的 0,就可以恢复原始的数据了。这部分见手册 7.1.9。 + +.. figure:: img/15.png +.. figure:: img/16.png +.. figure:: img/17.png + +在数据被NRZI编码之前,在数据流中每六个连续的1之后插入一个0,以强制NRZI数据流中的过渡,这使接收器逻辑至少每七位有一次数据转换,以保证数据和时钟的锁定。比特填充是从同步模式开始启用。结束同步模式的数据 "一 "被算作是序列中的第一个 "一"。序列中的第一个。除了高速EOP期间,发射器的位填充总是被强制执行。如果需要按照 +位填充规则的要求,零位将被插入,即使它是数据包结束(EOP)信号前的最后一位。接收器必须对NRZI数据进行解码,识别填充位,并将其丢弃。 + +.. caution:: 以下内容可以用一张图概括,了解即可,没有必要死记硬背 + +.. figure:: img/usbstruct.png + +USB 字段(域) +--------------------- + +USB 字段构成了 USB 通信中最基本也是最小的单元,后面的包、事务,最根本都是由字段构成,而字段又是由比特构成。字段部分见手册 8.1。 + +.. note:: USB 的比特先行模式是按照 LSB 先行原则。 + +同步字段 +^^^^^^^^^^^^^^^^^^^^^^^^ + +在 USB 系统中,主机和设备不是共享一个时钟,这使得接收方没办法准确知道发送方什么时候发送数据,尽管能检测到SOP,但是远远不够,所有这个时候就需要同步字段,使得接收方和发送方收发过程中保持同步,所以任何一个包都要以同步字段开始。同步字段0x01,经过编码以后就是01010100B。 + +.. figure:: img/18.png + +包标识符字段 +^^^^^^^^^^^^^^^^^^^^^^^^ + +PID 由一个四位数据包类型字段和一个四位校验字段组成,占用 8 个bit,如图所示。 PID指示数据包的类型,并通过推断,数据包的格式和应用于数据包的错误检测类型包。 PID的四位校验字段是通过执行分组类型字段的一个补码来生成,从而确保PID的可靠解码,以便正确解释分组的其余部分,如果四个PID校验位不是它们各自的分组标识符位的补码,则存在PID错误。 + +.. figure:: img/19.png + +既然是 4个比特,说明了 PID 类型可以分为16种,从16种中,又细分成4类:令牌 PID,数据 PID,握手 PID 和特殊 PID。 + +.. figure:: img/20.png + +地址字段 +^^^^^^^^^^^^^^^^^^^^^^^^ + +地址字段又分为设备地址字段和端点地址字段,其中设备地址字段占用 7 个bit,除去0 地址,主机可以分配的地址有 127个。 + +.. figure:: img/21.png + +端点地址字段占用 4个 bit,总共可以提供 16 个端点。 + +.. figure:: img/22.png + +帧号字段 +^^^^^^^^^^^^^^^^^^^^^^^^ + +帧号字段占用 11 个bit,主机每发出一个帧,帧号都会加1,如图所示。而高速设备中,帧中又包含微帧,1帧=8微帧,微帧则是加0.1。关于帧和微帧的概念,后续补充。 + +.. figure:: img/23.png + +数据字段 +^^^^^^^^^^^^^^^^^^^^^^^^ + +根据传输类型不同,数据字段中的数据长度也是不定的,从 0-1024不等。 + +.. figure:: img/24.png + +CRC 字段 +^^^^^^^^^^^^^^^^^^^^^^^^ + +循环冗余校验(CRC)用于保护令牌和数据包中的所有非PID字段。PID不包含在包含CRC的分组的CRC校验中。 在执行比特填充之前,在发送器中的各个字段上生成所有CRC。 类似地,在去除填充位之后,在接收器中对CRC进行解码。令牌和数据包CRC为所有单比特和双比特错误提供100%的覆盖。 CRC失败被认为表示一个或多个受保护字段已损坏并导致接收器忽略这些字段,并且在大多数情况下,忽略整个数据包。 + +.. figure:: img/24.png + +- 令牌CRC + +为令牌提供五位CRC字段,并覆盖IN,SETUP和OUT令牌的ADDR和ENDP字段或SOF令牌的时间戳字段。 PING和SPLIT特殊令牌还包括一个五位CRC字段。 + +生成多项式为: G(X)= X^5 + X^2 + 1 +表示该多项式的二进制位模式是00101B。 如果接收到所有令牌位而没有错误,则接收器处的五位校验和将为01100B。 + +- 数据CRC + +数据CRC是应用于数据分组的数据字段的16位多项式。 + +生成多项式是:G(X)= X^16 + X^15 + X^2 + 1 +表示该多项式的二进制位模式是1000000000000101B。 如果没有错误地接收到所有数据和CRC位,则16位校验和将为1000000000001101B。 + +USB 包 +--------------------- + +包由字段组成,根据 PID 类型,包分为四大类:令牌包、数据包、握手包、特殊包。此节内容见官方 8.4.1。 + +.. figure:: img/25.png + +算上 SOP,则如图,组成一个完整的包。 + +.. figure:: img/26.png + +令牌包 +^^^^^^^^^^^^^^^^^^^^^^^^ + +令牌包分为:SETUP、IN、OUT、SOF,其中 SETUP、IN、OUT的字段组成一样,如图: + +.. figure:: img/27.png + +- PID 字段:定义了数据传输方向为USB主机到USB设备。 +- ADDR 字段:指明了USB设备地址。 +- ENDP 字段:指明了接收数据的端点号。 +- CRC 字段:用于ADDR字段和ENDP字段进行循环冗余校验。 + +SOF 包的字段组成,如图: + +.. figure:: img/28.png + +- PID 字段:定义了数据传输方向为USB主机到USB设备。 +- 帧号 字段:指明了USB传输的帧号,其11位。 +- CRC 字段:用于ADDR字段和ENDP字段进行循环冗余校验。 + +数据包 +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. figure:: img/29.png + +- PID 字段:用于指明不同的数据包类型。支持 4 种数据包,分别为: DATAO 、 DATA1 、DATA2 和MDATA。 +- 数据 字段:其中包含了传输的数据。其数据的大小根据数据传输类吧和川户需要而定。根据 USB 协议的规定,对于低速 USB 数据传输, 最大长度为8字节对于全速SB 数据传输,其最大长度为 1023 字节;对于高速 USB 数据传输,数据最大长度为 1024 。 +- CRC 字段:这里使用 16 位的循环冗余校验来对数据字段进行保护。 + +握手包 +^^^^^^^^^^^^^^^^^^^^^^^^ + +握手包由8位的PID构成,用于数据传输的末位报告本次数据传输的状成。握手包之后使是整个事务处理的结束信号EOP. + +.. figure:: img/30.png + +特殊包 +^^^^^^^^^^^^^^^^^^^^^^^^ + +USB 事务 +--------------------- + +USB 常用事务共有三种:SETUP、IN、OUT,除了控制传输使用三个事务,其他传输都使用两个事务。特殊事务则是不携带数据的事务。 + +SETUP 事务 +^^^^^^^^^^^^^^^^^^^^^^^^ + +IN 事务 +^^^^^^^^^^^^^^^^^^^^^^^^ + +OUT 事务 +^^^^^^^^^^^^^^^^^^^^^^^^ + +特殊事务 +^^^^^^^^^^^^^^^^^^^^^^^^ + +USB 传输 +--------------------- + +控制传输 +^^^^^^^^^^^^^^^^^^^^^^^^ + +批量传输 +^^^^^^^^^^^^^^^^^^^^^^^^ + +中断传输 +^^^^^^^^^^^^^^^^^^^^^^^^ + +同步传输 +^^^^^^^^^^^^^^^^^^^^^^^^ \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usb/usb3.0_basic.rst b/src/lib/CherryUSB/docs/source/usb/usb3.0_basic.rst new file mode 100644 index 000000000..1dbbd8152 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usb/usb3.0_basic.rst @@ -0,0 +1,33 @@ +USB 基本概念(3.0 为主) +=========================== + + +简介 +------------ + + + +与 USB 2.0 相同和不同点 +-------------------------- + + +Link Layer +-------------------- + +LCW +^^^^^^^^^^ + +Protocol Layer +-------------------- + +LMP +^^^^^^^^^^^^^^^^^^^^^^^^ + +TP +^^^^^^^^^^^^^^^^^^^^^^^^ + +DP +^^^^^^^^^^^^^^^^^^^^^^^^ + +ITP +^^^^^^^^^^^^^^^^^^^^^^^^ \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usb/usb_desc.rst b/src/lib/CherryUSB/docs/source/usb/usb_desc.rst new file mode 100644 index 000000000..f0bcc7fec --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usb/usb_desc.rst @@ -0,0 +1,37 @@ +USB 描述符 +=========================== + +本节参考官方 usb2.0 pdf 9.5 节即可。 + +设备描述符 +--------------------- + +配置描述符 +--------------------- + +接口描述符 +--------------------- + +端点描述符 +--------------------- + +字符串描述符 +--------------------- + +接口关联描述符 +--------------------- + +设备限定描述符 +--------------------- + +其他速度描述符 +--------------------- + +BOS 描述符 +--------------------- + +超高速端点伴随描述符 +--------------------- + +增加型超高速同步端点伴随描述符 +------------------------------- diff --git a/src/lib/CherryUSB/docs/source/usb/usb_enum.rst b/src/lib/CherryUSB/docs/source/usb/usb_enum.rst new file mode 100644 index 000000000..1434424f5 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usb/usb_enum.rst @@ -0,0 +1,22 @@ +USB 枚举 +=========================== + +当我们了解了 usb 设备请求以后,就可以来学习下 USB 设备的整个枚举过程了,看看是如何枚举出一个串口、鼠标、u盘等设备了。枚举过程中主机会发送设备请求来获取相关信息(也就是描述符),具体发送哪些,参考下图。 + +.. figure:: img/usb_enum.png + +- 首先设备接上 USB 线,然后插上电脑 +- 设备插上以后上电,处于供电状态 +- 主机通过 D+/D- 识别到设备插入 +- 对设备进行复位 +- 主机发送 **获取设备描述符请求** +- 可选的复位操作 +- 主机发送 **设置设备地址请求** +- 主机发送 **获取配置描述符请求**,可能会获取多次,无所谓 +- 主机发送 **获取字符串描述符请求**,正常会获取3个字符串,如果后面的描述符中指定了字符串,则继续获取指定的字符串 +- 主机发送 **获取设备限定描述符请求**,用来获取在设备工作在其他速度上的请求,如果设备只能工作在全速模式,则必须回复 stall,并且协议栈中一定会打印该请求告诉你此命令设备不支持。 +- 主机发送 **设置配置请求**,对设备的端点进行配置,通常是根据端点描述符中的配置进行设置。 +- 到此标准的设备请求结束 +- 主机根据接口描述符加载对应支持的 class 驱动,如果主机不支持,则会提示该设备找不到驱动 +- 加载完成以后,开始执行该 class 相关的请求 +- 最终进行 class 的数据流传输 \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usb/usb_ext.rst b/src/lib/CherryUSB/docs/source/usb/usb_ext.rst new file mode 100644 index 000000000..86b87a53a --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usb/usb_ext.rst @@ -0,0 +1,39 @@ +.. _usb_ext: + +USB 知识点拓展 +=========================== + +什么是分包 +------------- + +由于 USB 协议中规定了每个包的最大长度,所以当我们发送的数据长度超过了最大包长度时,就需要分包发送,这就是分包。比如 ep mps 为 64,数据长度为 129,则 USB 会按照 64 + 64 + 1 的形式传输。 +而对于 USB IP 来说,分包分为软件分包和硬件分包,软件分包就是用户代码自行分包,这种 ip 一般都使用 FIFO 来进行,因为 FIFO 深度是有限的;第二种 +则是使用硬件分包,这种 USB IP 一般带 DMA 或者描述符 DMA 功能,那么这种 IP 的效率无疑是最高的,cherryusb 中充分利用了这点,使得 USB 速度能够达到最高。 + +对于软件分包来说,一次发送的长度即使是 16K, **内部也是通过软件分包的,在这种情况下,发送长度的多少不会对速度有任何提升**。 +对于硬件分包来说,发送的长度会影响速度,因为硬件分包是通过 DMA 来进行的, **一次发送的长度越大,DMA 的效率就越高,速度也就越快**。(当然,其他协议栈虽然使用了 dma,但是部分代码实现还是按照一个包进行,等于没用,这也是速度低的一个原因) + +什么是短包 +---------------- + +在上面我们讲了分包之后,短包就是分包的最后一个包(并且长度小于 EP MPS).比如发送 129 字节的数据,那么 USB 会按照 64 + 64 + 1 的形式传输,最后一个包是1个字节,这1个字节就是短包。 + +什么是 ZLP +------------- + +ZLP,顾名思义,零长度数据包,也就是数据长度为0 的短包。是 USB 设备在数据传输结束时,如果数据长度正好是最大包长度的整数倍,那么就需要发送一个 ZLP 数据包,用来告诉对方数据传输结束。 + +.. caution:: ZLP 功能仅限于 CONTROL 和 BULK 传输 + +什么时候算中断完成 +-------------------- + +从机接收:接收的长度与设置的长度相等;接收的最后一个包为短包。 +从机发送:发送的长度与设置的长度相等,如果发送的长度是 EP MPS 的整数倍, **通常** 需要再发送一个 ZLP(仅限 control 和 bulk 传输)。 + +.. note:: 对于从机接收,并且是 bulk 传输,接收长度通常设计为 EP MPS,以下三种情况可以修改为多个 EP MPS: 固定长度;自定义协议并携带长度(例如 MSC); 主机手动发送 ZLP 或者短包(例如 RNDIS) + +.. note:: 对于从机发送,并且是 bulk 传输,发送长度没有限制,但是如果是 EP MPS 整数倍,通常需要发送 ZLP。自定义协议则不需要发送 ZLP,例如 MSC。 + +主机接收:同从机接收 +主机发送:发送的长度与设置的长度相等 diff --git a/src/lib/CherryUSB/docs/source/usb/usb_request.rst b/src/lib/CherryUSB/docs/source/usb/usb_request.rst new file mode 100644 index 000000000..8e42565d3 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usb/usb_request.rst @@ -0,0 +1,6 @@ +USB 设备请求 +=========================== + +本节参考官方 usb2.0 pdf 9.3、9.4 节即可。 + +.. figure:: img/usb_request.png diff --git a/src/lib/CherryUSB/docs/source/usbdev.svg b/src/lib/CherryUSB/docs/source/usbdev.svg new file mode 100644 index 000000000..8f7872890 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbdev.svg @@ -0,0 +1,4 @@ + + + +
usbd_desc_register
usbd_add_interface
usbd_add_endpoint
    struct usbd_tx_rx_msg tx_msg[16];
    struct usbd_tx_rx_msg rx_msg[16];
struct usbd_interface *intf[16];
usbd_initialize
USBD_IRQHandler
usbd_event_reset_handler
usbd_event_ep0_setup_complete_handler
usbd_event_ep_in_complete_handler
usbd_event_ep_out_complete_handler
usbd_setup_request_handler
tx_msg[ep & 0x7f].cb
rx_msg[ep & 0x7f].cb
usbd_event_ep0_in_complete_handler
tx_msg[ep & 0x7f].cb (ep != 0)
usbd_event_ep0_out_complete_handler
rx_msg[ep & 0x7f].cb (ep != 0)
usbd_standard_request_handler
usbd_class_request_handler
usbd_vendor_request_handler
\ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usbhost.svg b/src/lib/CherryUSB/docs/source/usbhost.svg new file mode 100644 index 000000000..b7d537b56 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbhost.svg @@ -0,0 +1,9 @@ +
usbh_initialize
usbh_initialize
usbh_hub_initialize
usbh_hub_initialize
usbh_roothub_register
usbh_roothub_register
create usbh_hub_thread
create usbh_hub_thread
usb_hc_init
usb_hc_init
usbh_roothub_thread_wakeup
usbh_roothub_thread_wakeup +
hub_int_complete_callback
hub_int_complete_callback +
wakeup
wakeup
wakeup
wakeup
usbh_enumerate
usbh_enumerate +
search all ports
search all ports
usbh_hub_events
usbh_hub_events +
CLASS_CONNECT
CLASS_CONNECT +
search all interface drivers
search all interface drivers
usbh_find_class_driver
usbh_find_class_driver +
if hub class?
if hub class?
usbh_int_urb_fill


usbh_submit_urb
usbh_int_urb_fill...
Class Register
Class Register +
USBH_IRQHandler
USBH_IRQHandler +
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usbip/cdns2.rst b/src/lib/CherryUSB/docs/source/usbip/cdns2.rst new file mode 100644 index 000000000..88afc8d25 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/cdns2.rst @@ -0,0 +1,2 @@ +CDNS2 +=============== diff --git a/src/lib/CherryUSB/docs/source/usbip/cdns3.rst b/src/lib/CherryUSB/docs/source/usbip/cdns3.rst new file mode 100644 index 000000000..c2132d1a5 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/cdns3.rst @@ -0,0 +1,2 @@ +CDNS3 +=============== diff --git a/src/lib/CherryUSB/docs/source/usbip/chipidea.rst b/src/lib/CherryUSB/docs/source/usbip/chipidea.rst new file mode 100644 index 000000000..57c46ec09 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/chipidea.rst @@ -0,0 +1,2 @@ +CHIPIDEA +================= \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usbip/dwc2.rst b/src/lib/CherryUSB/docs/source/usbip/dwc2.rst new file mode 100644 index 000000000..6c5a8c085 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/dwc2.rst @@ -0,0 +1,2 @@ +DWC2 +================= \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usbip/dwc3.rst b/src/lib/CherryUSB/docs/source/usbip/dwc3.rst new file mode 100644 index 000000000..746bbee67 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/dwc3.rst @@ -0,0 +1,2 @@ +DWC3 +=============== diff --git a/src/lib/CherryUSB/docs/source/usbip/ehci.rst b/src/lib/CherryUSB/docs/source/usbip/ehci.rst new file mode 100644 index 000000000..637bbe691 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/ehci.rst @@ -0,0 +1,2 @@ +EHCI +================= \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usbip/fotg210.rst b/src/lib/CherryUSB/docs/source/usbip/fotg210.rst new file mode 100644 index 000000000..f6e566a89 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/fotg210.rst @@ -0,0 +1,2 @@ +FOTG210 +=============== diff --git a/src/lib/CherryUSB/docs/source/usbip/musb.rst b/src/lib/CherryUSB/docs/source/usbip/musb.rst new file mode 100644 index 000000000..597876c04 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/musb.rst @@ -0,0 +1,2 @@ +MUSB +================= \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usbip/ohci.rst b/src/lib/CherryUSB/docs/source/usbip/ohci.rst new file mode 100644 index 000000000..8467233b3 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/ohci.rst @@ -0,0 +1,2 @@ +OHCI +================= \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/usbip/xhci.rst b/src/lib/CherryUSB/docs/source/usbip/xhci.rst new file mode 100644 index 000000000..0c16c2e29 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/usbip/xhci.rst @@ -0,0 +1,2 @@ +XHCI +================= \ No newline at end of file diff --git a/src/lib/CherryUSB/docs/source/version.rst b/src/lib/CherryUSB/docs/source/version.rst new file mode 100644 index 000000000..6de257e90 --- /dev/null +++ b/src/lib/CherryUSB/docs/source/version.rst @@ -0,0 +1,165 @@ +版本说明 +============================== + +如果没有特别情况,请使用最新版本。下面只列举比较重要的更新,详细更新说明请参考 https://github.com/cherry-embedded/CherryUSB/releases。 + +<= v0.10.2 初代版本 +---------------------- + +- **用于定基本的主从机框架,仅支持单 USB IP**。 +- **host 驱动每个 ep 占用一个 硬件 pipe,不支持动态使用硬件 pipe**。 +- 相关 porting 需要使用此版本,后续不再支持(比如 ch32,rp2040),以及旧版本pusb2 和 xhci(新版本不再提供源码)。 + +v1.0.0 过度版本 +---------------------- + +- **host 支持动态使用硬件 pipe,不再固定** + +v1.1.0 过度版本 +---------------------- + +- **主从机支持多 USB IP 且要相同 IP** +- **host 增加 bluetooth, ch340, ftdi, cp210x, asix 驱动** +- device msc 支持多 lun,并且 CONFIG_USBDEV_MSC_BLOCK_SIZE 修改为 CONFIG_USBDEV_MSC_MAX_BUFSIZE + +v1.2.0 +---------------------- + +- **host 增加 rtl8152,cdc ncm 驱动** +- host 增加 timer 去控制中断传输(hub修改为 timer 控制) +- porting 增加 esp,aic 主机驱动 +- **优化 DWC2 优化代码方便阅读,并增加一些 FIFO 配置宏给用户(因为 dwc2 fifo 大小有限,以及配置方式很多,所以导出给用户配置,方便合理控制性能)** +- 优化 ehci 驱动(qtd不再使用动态申请,绑定 qh),方便代码运行的更快 + +v1.3.0 +---------------------- + +- **device 支持多种速度描述符自动选择功能(开启 CONFIG_USBDEV_ADVANCE_DESC)** +- device core 代码统一 ep0 buffer 的使用,用于美化代码 +- host 增加 pl2303 驱动;采用 id table 来支持多个 vid,pid;增加 user_data 给用户使用 +- host 网络 class 驱动增加 tx、rx buffer 的宏,增加 LWIP_TCPIP_CORE_LOCKING_INPUT 的使用,以便实现数据的零拷贝 +- porting 导入 bouffalo,aic,stm32f723 device驱动 +- **porting 中主机部分 urb->timeout 清0 的处理有点问题(大数据量传输时会出现 no pipe alloc 异常,主要原因是刚启动传输就完成了,还没判断 timeout就被修改为0了,没有进入 take sem 流程),此版本已修复** +- ehci enable iaad in usbh_kill_urb,read ehci hcor offset from hccr caplength,enable ohci for ehci +- 适配 nuttx os + +v1.3.1 +---------------------- + +- bugfix(audio,video,cdc ecm 相关宏,结构体,api) +- **host hub 枚举线程删除,使用 psc 线程,枚举方式更改为队列模式,取消同时枚举多个设备的功能** +- host 扫描驱动信息和 instance 采用递归模式,删除链表扫描 +- host 网络 class 驱动优化,支持接收 16K 以上的数据(cdc ecm 不支持),采用高级 memcpy api +- **device 协议栈中打印删除(中断中不再做打印)** +- porting 中 musb fifo配置修改为从 fifo table 获取(此代码参考 linux),适配 es32,sunxi,beken + +v1.4.0 +---------------------- + +- **device 开始支持 remote wakeup 功能, hid request(0x21),完善 GET STATUS 请求(此版本开始可以通过 USB3CV 测试)** +- device 增加 UF2, ADB, WEBUSB 功能; msc 增加裸机的读写 polling 功能,将读写放在 while1中执行; usbd_cdc 改名为 usbd_cdc_acm +- host 增加 usbwifi(bl616), xbox驱动; **重构 USB3.0 枚举逻辑** +- **host 中 cdc_acm,hid,msc,serial 传输共享 buffer,如果存在多个相同的设备会有问题,修改为单独的 buffer** +- **porting 重构 XHCI/PUSB2 驱动,不开源**;ehci 和 ohci 文件改名;增加 remote wakeup api +- esp 组件库支持 +- **chipidea 从机驱动支持,nxp mcx 系列主从支持** +- threadx os 支持 + +v1.4.1 +---------------------- + +- **修复device 模式下使用多个 altsetting 时重复关闭端点问题,改成 altsetting 为0时关闭** +- **重构主机 audio 解析描述符** +- **增加 kinetis usbip** +- 主机下 usbh_msc_get_maxlun 请求部分 U 盘不支持,不做错误返回 +- 主机下 usbh_hid_get_report_descriptor 导出给用户调用 +- 静态代码检查 +- github action 功能 + +v1.4.2 +---------------------- + +- device 实现 USB_REQUEST_GET_INTERFACE 请求 +- **device video 传输重构,增加双缓冲功能** +- device ecm 重构,保持和 rndis 类似 API +- device 和 host audio 音量配置功能重构 +- host 增加 AOA 驱动 +- 兼容 C++ 相关修改 +- fsdev 不支持 ISO 和 DWC2 高速 hub 不支持全速低速检查 +- **通用 OHCI 代码更新** + +v1.4.3 +---------------------- + +- **device ep0 处理增加线程模式** +- device audio feedback 宏和demo +- device rndis 增加透传功能(无LWIP) +- **host msc 将 scsi 初始化从枚举线程中移出,在mount阶段调用,并增加了testunity 多次尝试,兼容一部分 U 盘** +- rp2040 主从支持 +- **nuttx fs,serial,net 组件支持** +- dwc2、ehci、ohci 主机 dcache功能支持(v1.5.0 完善) +- t113、MCXA156、CH585 、 **stm32h7r 支持** +- 修复 v1.4.1 中 altsetting 为0时应该关闭所有端点的问题 + +v1.5.0 +---------------------- + +- **协议栈内部全局 buffer 需要使用 USB_ALIGN_UP 对齐, 用于开启 dcache 并且不使能 nocache 时使用** +- **完善 ehci/ohci dcache 模式下的处理**, add CONFIG_USB_EHCI_DESC_DCACHE_ENABLE for qh&qtd&itd, add CONFIG_USB_OHCI_DESC_DCACHE_ENABLE for ed&td +- **平台代码更新,平台相关转移到 platform,增加 lvgl 键鼠支持,blackmagic 支持,filex 支持, zephyr disk支持,esp-idf netif支持** +- **device sof callback 支持** +- **dwc2 、fsdev st 下实现底层 API 和中断,直接调用 HAL_PCD_MSP 和 HAL_HCD_MSP,不需要用户复制粘贴** +- **DWC2 实现 SPLIT 功能,高速模式下支持外部高速 hub 对接 FS/LS 设备** +- liteos-m, zephyr os 支持 +- device msc 裸机读写采用变量模式,而不是ringbuffer +- ehci qtd 使用 qtd alloc & free,节省内存,目前是 qh 携带 qtd +- rndis/ECM device, msc demo 更新,支持 rt-thread 下免修改 +- **memcpy 全部使用 usb_memcpy 替换,arm 库存在非对其访问问题** +- **重构 device mtp 驱动(收费使用)** +- **device tmc 驱动(收费使用)** +- **重构device video 传输,直接在图像数据中填充 uvc header,达到zero memcpy** +- **增加 usb_osal_thread_schedule_other api,用于在释放 class 资源之前,先释放所有 class 线程,避免释放 class 资源以后线程还在使用该 class 资源** +- **dwc2 device 增加 dcache 功能,可用于 cortex-M7/ESP32P4** +- **bouffalo/hpm/esp/st/nxp dcache api 支持** +- ch32 device iso 更新,IP 目录重新分类 +- cmake,scons,kconfig 更新 +- 使用 USB_ASSERT_MSG 对部分代码检查,全面性 warning 修复 +- N32H4/MM32F5 device 支持 +- 默认使能 CONFIG_USBDEV_ADVANCE_DESC + +v1.5.1 +---------------------- + +- 支持 rt-thread 下使用 adb shell,host serial/device cdc_acm 对接 rtdevice 框架 +- **dwc2 增加多个 usbport 不同参数的配置功能,比如一个全速一个高速,fifo配置和phy配置不同** +- **ehci 在控制传输中如果没有 nodata 阶段会导致 data qtd 未释放,导致内存泄漏** +- **dwc2 读取 setup 使用 usbd_get_next_ep0_state 去判断,避免 setup 和 ep0 out 使用在 USB_OTG_DOEPINT_XFRC 状态下冲突** +- sifli usb device 初步支持 + +v1.5.2 +---------------------- + +- 对 1.5.1 下 rt-thread 组件的一些 bugfix +- idf timer osal 替换为 esp timer,freertos timer会有启动失败的可能性;xTaskCreate 使用 xTaskCreatePinnedToCore 替换,方便多核使用 +- 主机枚举中,删除描述符溢出相关的 ASSERT 操作,改成返回错误。获取字符串描述符改成支持才获取。2 ms 延时改成 10ms,因为一些 os 使用的是 100hz,会造成延时失效 +- **dwc2 ep mult 支持,split 传输代码优化,对 split 相关的 cache 处理修改** +- **dwc2 halt 中不能清除 USB_OTG_HCCHAR_EPDIR,reset port 中使用超时机制,防止在枚举时由于拔出而造成死等** +- 更新 DWC2 中 at32,stm32,kendryte,espressif glue 代码 +- musb 对于标准的 IP 结构采用独立 EP 控制寄存器组,不使用 EPIDX 寄存器去控制 +- 删除所有 CONFIG_USBDEV_EP_NUM & CONFIG_USBHOST_PIPE_NUM,不再使用,因为 IP 本身会携带这些信息,或者厂家 SDK 提供了对应的宏 +- CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 默认使用 2 减少内存,只有 UVC 和UAC 使用(商业收费),所以不需要开很大 +- urb interval 从 u8 改 u32,最大支持 2^15 * 125us + +v1.5.3 +---------------------- + +- 增加 mongoose demo +- **从机支持自定义 ep0 mps,仅支持商业性 IP** +- 主机增加 UVC bulk支持, **接口号匹配驱动功能**, **主机分配地址功能改成循环自增模式** ,重构 lsusb 命令 +- 主机控制传输增加 retry 机制,部分 device 通信不稳定,retry 次数参考 linux +- **主机 rndis 驱动增加非标 02/02/ff 接口驱动匹配** +- musb IP 关闭 multipoint feature 支持 +- hpmicro、chipidea dcache 支持 +- idf host msc 支持 +- otg 框架重构,当前 port 仅支持 hpmicro +- CI 编译功能,支持 hpmicro/espressif/bouffalolab \ No newline at end of file diff --git a/src/lib/CherryUSB/idf_component.yml b/src/lib/CherryUSB/idf_component.yml new file mode 100644 index 000000000..9642e0e20 --- /dev/null +++ b/src/lib/CherryUSB/idf_component.yml @@ -0,0 +1,25 @@ +version: "1.5.3" +description: CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP +tags: + - usb + - usb-device + - usb-host + - cdc_acm + - cdc_ecm + - cdc_ncm + - hid + - msc + - rndis + - uvc + - uac + - winusb +url: https://github.com/cherry-embedded/CherryUSB +repository: https://github.com/cherry-embedded/CherryUSB.git +documentation: https://cherryusb.readthedocs.io/ +issues: https://github.com/cherry-embedded/CherryUSB/issues +dependencies: + idf: ">=4.4.1" +targets: + - esp32s2 + - esp32s3 + - esp32p4 \ No newline at end of file diff --git a/src/lib/CherryUSB/osal/idf/linker.lf b/src/lib/CherryUSB/osal/idf/linker.lf new file mode 100644 index 000000000..24c8b27ad --- /dev/null +++ b/src/lib/CherryUSB/osal/idf/linker.lf @@ -0,0 +1,13 @@ +[sections:usbh_class_info] +entries: + .usbh_class_info+ + +[scheme:usbh_class_info_array] +entries: + usbh_class_info -> flash_rodata + +[mapping:usbh_class_info_table] +archive: * +entries: + * (usbh_class_info_array); + usbh_class_info -> flash_rodata KEEP() SURROUND(usbh_class_info) \ No newline at end of file diff --git a/src/lib/CherryUSB/osal/idf/usb_config.h b/src/lib/CherryUSB/osal/idf/usb_config.h new file mode 100644 index 000000000..3eca2e796 --- /dev/null +++ b/src/lib/CherryUSB/osal/idf/usb_config.h @@ -0,0 +1,275 @@ +/* + * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "sdkconfig.h" +#include "esp_rom_sys.h" +#include "esp_attr.h" + +/* ================ USB common Configuration ================ */ + +#define CONFIG_USB_PRINTF(...) esp_rom_printf(__VA_ARGS__) + +#ifndef CONFIG_USB_DBG_LEVEL +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* data align size when use dma or use dcache */ +#ifndef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +// #define CONFIG_USB_DCACHE_ENABLE + +/* attribute data into no cache ram +* DRAM_DMA_ALIGNED_ATTR was introduced in IDF 5.3. If not defined, it falls back to DMA_ATTR +*/ +#ifndef DRAM_DMA_ALIGNED_ATTR +#define DRAM_DMA_ALIGNED_ATTR DMA_ATTR +#endif +#define USB_NOCACHE_RAM_SECTION DRAM_DMA_ALIGNED_ATTR + +/* use usb_memcpy default for high performance but cost more flash memory. + * And, arm libc has a bug that memcpy() may cause data misalignment when the size is not a multiple of 4. +*/ +// #define CONFIG_USB_MEMCPY_DISABLE + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +// #define CONFIG_USBDEV_SETUP_LOG_PRINT + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +/* enable advance desc register api */ +#define CONFIG_USBDEV_ADVANCE_DESC + +/* move ep0 setup handler from isr to thread */ +// #define CONFIG_USBDEV_EP0_THREAD + +#ifndef CONFIG_USBDEV_EP0_PRIO +#define CONFIG_USBDEV_EP0_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_EP0_STACKSIZE +#define CONFIG_USBDEV_EP0_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */ +// #define CONFIG_USBDEV_MSC_POLLING + +/* move msc read & write from isr to thread */ +#define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_BUFSIZE +#define CONFIG_USBDEV_MTP_MAX_BUFSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_OBJECTS +#define CONFIG_USBDEV_MTP_MAX_OBJECTS 256 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_PATHNAME +#define CONFIG_USBDEV_MTP_MAX_PATHNAME 256 +#endif + +#define CONFIG_USBDEV_MTP_THREAD + +#ifndef CONFIG_USBDEV_MTP_PRIO +#define CONFIG_USBDEV_MTP_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MTP_STACKSIZE +#define CONFIG_USBDEV_MTP_STACKSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 4096 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 2048 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 +#define ESP_USB_FS0_BASE 0x60080000 +#define ESP_USBD_BASE ESP_USB_FS0_BASE +#define ESP_USBH_BASE ESP_USB_FS0_BASE +#define CONFIG_USBDEV_MAX_BUS 1 +#define CONFIG_USBHOST_MAX_BUS 1 +#elif CONFIG_IDF_TARGET_ESP32P4 +#define ESP_USB_HS0_BASE 0x50000000 +#define ESP_USB_FS0_BASE 0x50040000 +#define ESP_USBD_BASE ESP_USB_HS0_BASE +#define ESP_USBH_BASE ESP_USB_HS0_BASE +#define CONFIG_USBDEV_MAX_BUS 2 +#define CONFIG_USBHOST_MAX_BUS 2 +#define CONFIG_USB_HS +#else +#error "Unsupported SoC" +#endif + +#if CONFIG_IDF_TARGET_ESP32P4 +#define CONFIG_USB_DCACHE_ENABLE + +#undef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE CONFIG_CACHE_L1_CACHE_LINE_SIZE + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/osal/idf/usb_osal_idf.c b/src/lib/CherryUSB/osal/idf/usb_osal_idf.c new file mode 100644 index 000000000..b87db74f1 --- /dev/null +++ b/src/lib/CherryUSB/osal/idf/usb_osal_idf.c @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_osal.h" +#include "usb_errno.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/timers.h" +#include "freertos/event_groups.h" +#include "esp_timer.h" + +static portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED; + +usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args) +{ + TaskHandle_t htask = NULL; + stack_size /= sizeof(StackType_t); + xTaskCreatePinnedToCore(entry, name, stack_size, args, configMAX_PRIORITIES - 1 - prio, &htask, CONFIG_ESP_TIMER_TASK_AFFINITY); + return (usb_osal_thread_t)htask; +} + +void usb_osal_thread_delete(usb_osal_thread_t thread) +{ + vTaskDelete(thread); +} + +void usb_osal_thread_schedule_other(void) +{ + TaskHandle_t xCurrentTask = xTaskGetCurrentTaskHandle(); + const UBaseType_t old_priority = uxTaskPriorityGet(xCurrentTask); + + vTaskPrioritySet(xCurrentTask, tskIDLE_PRIORITY); + + taskYIELD(); + + vTaskPrioritySet(xCurrentTask, old_priority); +} + +usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count) +{ + return (usb_osal_sem_t)xSemaphoreCreateCounting(1, initial_count); +} + +void usb_osal_sem_delete(usb_osal_sem_t sem) +{ + vSemaphoreDelete((SemaphoreHandle_t)sem); +} + +int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout) +{ + if (timeout == USB_OSAL_WAITING_FOREVER) { + return (xSemaphoreTake((SemaphoreHandle_t)sem, portMAX_DELAY) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } else { + return (xSemaphoreTake((SemaphoreHandle_t)sem, pdMS_TO_TICKS(timeout)) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } +} + +int usb_osal_sem_give(usb_osal_sem_t sem) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + int ret; + + if (xPortInIsrContext()) { + ret = xSemaphoreGiveFromISR((SemaphoreHandle_t)sem, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } else { + ret = xSemaphoreGive((SemaphoreHandle_t)sem); + } + + return (ret == pdPASS) ? 0 : -USB_ERR_TIMEOUT; +} + +void usb_osal_sem_reset(usb_osal_sem_t sem) +{ + xQueueReset((QueueHandle_t)sem); +} + +usb_osal_mutex_t usb_osal_mutex_create(void) +{ + return (usb_osal_mutex_t)xSemaphoreCreateMutex(); +} + +void usb_osal_mutex_delete(usb_osal_mutex_t mutex) +{ + vSemaphoreDelete((SemaphoreHandle_t)mutex); +} + +int usb_osal_mutex_take(usb_osal_mutex_t mutex) +{ + return (xSemaphoreTake((SemaphoreHandle_t)mutex, portMAX_DELAY) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; +} + +int usb_osal_mutex_give(usb_osal_mutex_t mutex) +{ + return (xSemaphoreGive((SemaphoreHandle_t)mutex) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; +} + +usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs) +{ + return (usb_osal_mq_t)xQueueCreate(max_msgs, sizeof(uintptr_t)); +} + +void usb_osal_mq_delete(usb_osal_mq_t mq) +{ + vQueueDelete((QueueHandle_t)mq); +} + +int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + int ret; + + if (xPortInIsrContext()) { + ret = xQueueSendFromISR((usb_osal_mq_t)mq, &addr, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } else { + ret = xQueueSend((usb_osal_mq_t)mq, &addr, 0xffffffff); + } + + return (ret == pdPASS) ? 0 : -USB_ERR_TIMEOUT; +} + +int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + int ret; + + if (xPortInIsrContext()) { + ret = xQueueReceiveFromISR((usb_osal_mq_t)mq, addr, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + return (ret == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } else { + if (timeout == USB_OSAL_WAITING_FOREVER) { + return (xQueueReceive((usb_osal_mq_t)mq, addr, portMAX_DELAY) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } else { + return (xQueueReceive((usb_osal_mq_t)mq, addr, pdMS_TO_TICKS(timeout)) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } + } +} + +static void usb_timeout(void *arg) +{ + struct usb_osal_timer *timer = (struct usb_osal_timer *)arg; + + timer->handler(timer->argument); +} + +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period) +{ + struct usb_osal_timer *timer; + + timer = pvPortMalloc(sizeof(struct usb_osal_timer)); + + if (timer == NULL) { + return NULL; + } + + esp_timer_create_args_t timer_args = { + .callback = usb_timeout, + // argument specified here will be passed to timer callback function + .arg = (void *)timer, + .dispatch_method = ESP_TIMER_TASK, + .name = name, + .skip_unhandled_events = true + }; + + timer->handler = handler; + timer->argument = argument; + timer->is_period = is_period; + timer->timeout_ms = timeout_ms; + + if (esp_timer_create(&timer_args, (esp_timer_handle_t *)&timer->timer) != ESP_OK) { + vPortFree(timer); + return NULL; + } + + return timer; +} + +void usb_osal_timer_delete(struct usb_osal_timer *timer) +{ + esp_timer_stop((esp_timer_handle_t)timer->timer); + esp_timer_delete((esp_timer_handle_t)timer->timer); + vPortFree(timer); +} + +void usb_osal_timer_start(struct usb_osal_timer *timer) +{ + esp_timer_stop((esp_timer_handle_t)timer->timer); + + if (timer->is_period) { + esp_timer_start_periodic((esp_timer_handle_t)timer->timer, ((uint64_t)timer->timeout_ms) * 1000); + } else { + esp_timer_start_once((esp_timer_handle_t)timer->timer, ((uint64_t)timer->timeout_ms) * 1000); + } +} + +void usb_osal_timer_stop(struct usb_osal_timer *timer) +{ + esp_timer_stop((esp_timer_handle_t)timer->timer); +} + +size_t usb_osal_enter_critical_section(void) +{ + portENTER_CRITICAL_SAFE(&spinlock); + return 0; +} + +void usb_osal_leave_critical_section(size_t flag) +{ + portEXIT_CRITICAL_SAFE(&spinlock); +} + +void usb_osal_msleep(uint32_t delay) +{ + vTaskDelay(pdMS_TO_TICKS(delay)); +} + +void *usb_osal_malloc(size_t size) +{ + return malloc(size); +} + +void usb_osal_free(void *ptr) +{ + free(ptr); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/osal/idf/usbh_class_info.ld b/src/lib/CherryUSB/osal/idf/usbh_class_info.ld new file mode 100644 index 000000000..117bfd8dd --- /dev/null +++ b/src/lib/CherryUSB/osal/idf/usbh_class_info.ld @@ -0,0 +1,2 @@ +__usbh_class_info_start__ = _usbh_class_info_start; +__usbh_class_info_end__ = _usbh_class_info_end; \ No newline at end of file diff --git a/src/lib/CherryUSB/osal/usb_osal_freertos.c b/src/lib/CherryUSB/osal/usb_osal_freertos.c new file mode 100644 index 000000000..6bdd883b7 --- /dev/null +++ b/src/lib/CherryUSB/osal/usb_osal_freertos.c @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_osal.h" +#include "usb_errno.h" +#include "usb_config.h" +#include "usb_log.h" +#include +#include "semphr.h" +#include "timers.h" +#include "event_groups.h" + +usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args) +{ + TaskHandle_t htask = NULL; + stack_size /= sizeof(StackType_t); + xTaskCreate(entry, name, stack_size, args, configMAX_PRIORITIES - 1 - prio, &htask); + if (htask == NULL) { + USB_LOG_ERR("Create thread %s failed\r\n", name); + while (1) { + } + } + return (usb_osal_thread_t)htask; +} + +void usb_osal_thread_delete(usb_osal_thread_t thread) +{ + vTaskDelete(thread); +} + +void usb_osal_thread_schedule_other(void) +{ + TaskHandle_t xCurrentTask = xTaskGetCurrentTaskHandle(); + const UBaseType_t old_priority = uxTaskPriorityGet(xCurrentTask); + + vTaskPrioritySet(xCurrentTask, tskIDLE_PRIORITY); + + taskYIELD(); + + vTaskPrioritySet(xCurrentTask, old_priority); +} + +usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count) +{ + usb_osal_sem_t sem = (usb_osal_sem_t)xSemaphoreCreateCounting(1, initial_count); + if (sem == NULL) { + USB_LOG_ERR("Create semaphore failed\r\n"); + while (1) { + } + } + return sem; +} + +void usb_osal_sem_delete(usb_osal_sem_t sem) +{ + vSemaphoreDelete((SemaphoreHandle_t)sem); +} + +int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout) +{ + if (timeout == USB_OSAL_WAITING_FOREVER) { + return (xSemaphoreTake((SemaphoreHandle_t)sem, portMAX_DELAY) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } else { + return (xSemaphoreTake((SemaphoreHandle_t)sem, pdMS_TO_TICKS(timeout)) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } +} + +int usb_osal_sem_give(usb_osal_sem_t sem) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + int ret; + + if (xPortIsInsideInterrupt()) { + ret = xSemaphoreGiveFromISR((SemaphoreHandle_t)sem, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } else { + ret = xSemaphoreGive((SemaphoreHandle_t)sem); + } + + return (ret == pdPASS) ? 0 : -USB_ERR_TIMEOUT; +} + +void usb_osal_sem_reset(usb_osal_sem_t sem) +{ + xQueueReset((QueueHandle_t)sem); +} + +usb_osal_mutex_t usb_osal_mutex_create(void) +{ + usb_osal_mutex_t mutex = (usb_osal_mutex_t)xSemaphoreCreateMutex(); + if (mutex == NULL) { + USB_LOG_ERR("Create mutex failed\r\n"); + while (1) { + } + } + return mutex; +} + +void usb_osal_mutex_delete(usb_osal_mutex_t mutex) +{ + vSemaphoreDelete((SemaphoreHandle_t)mutex); +} + +int usb_osal_mutex_take(usb_osal_mutex_t mutex) +{ + return (xSemaphoreTake((SemaphoreHandle_t)mutex, portMAX_DELAY) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; +} + +int usb_osal_mutex_give(usb_osal_mutex_t mutex) +{ + return (xSemaphoreGive((SemaphoreHandle_t)mutex) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; +} + +usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs) +{ + return (usb_osal_mq_t)xQueueCreate(max_msgs, sizeof(uintptr_t)); +} + +void usb_osal_mq_delete(usb_osal_mq_t mq) +{ + vQueueDelete((QueueHandle_t)mq); +} + +int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + int ret; + + if (xPortIsInsideInterrupt()) { + ret = xQueueSendFromISR((usb_osal_mq_t)mq, &addr, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } else { + ret = xQueueSend((usb_osal_mq_t)mq, &addr, 0xffffffff); + } + + return (ret == pdPASS) ? 0 : -USB_ERR_TIMEOUT; +} + +int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + int ret; + + if (xPortIsInsideInterrupt()) { + ret = xQueueReceiveFromISR((usb_osal_mq_t)mq, addr, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + return (ret == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } else { + if (timeout == USB_OSAL_WAITING_FOREVER) { + return (xQueueReceive((usb_osal_mq_t)mq, addr, portMAX_DELAY) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } else { + return (xQueueReceive((usb_osal_mq_t)mq, addr, pdMS_TO_TICKS(timeout)) == pdPASS) ? 0 : -USB_ERR_TIMEOUT; + } + } +} + +static void __usb_timeout(TimerHandle_t *handle) +{ + struct usb_osal_timer *timer = (struct usb_osal_timer *)pvTimerGetTimerID((TimerHandle_t)handle); + + timer->handler(timer->argument); +} + +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period) +{ + struct usb_osal_timer *timer; + (void)name; + + timer = pvPortMalloc(sizeof(struct usb_osal_timer)); + + if (timer == NULL) { + USB_LOG_ERR("Create usb_osal_timer failed\r\n"); + while (1) { + } + } + memset(timer, 0, sizeof(struct usb_osal_timer)); + + timer->handler = handler; + timer->argument = argument; + + timer->timer = (void *)xTimerCreate("usb_tim", pdMS_TO_TICKS(timeout_ms), is_period, timer, (TimerCallbackFunction_t)__usb_timeout); + if (timer->timer == NULL) { + USB_LOG_ERR("Create timer failed\r\n"); + while (1) { + } + } + return timer; +} + +void usb_osal_timer_delete(struct usb_osal_timer *timer) +{ + xTimerStop(timer->timer, 0); + xTimerDelete(timer->timer, 0); + vPortFree(timer); +} + +void usb_osal_timer_start(struct usb_osal_timer *timer) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + int ret; + + if (xPortIsInsideInterrupt()) { + ret = xTimerStartFromISR(timer->timer, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } else { + xTimerStart(timer->timer, 0); + } +} + +void usb_osal_timer_stop(struct usb_osal_timer *timer) +{ + xTimerStop(timer->timer, 0); +} + +size_t usb_osal_enter_critical_section(void) +{ + size_t ret; + + if (xPortIsInsideInterrupt()) { + ret = taskENTER_CRITICAL_FROM_ISR(); + } else { + taskENTER_CRITICAL(); + ret = 1; + } + + return ret; +} + +void usb_osal_leave_critical_section(size_t flag) +{ + if (xPortIsInsideInterrupt()) { + taskEXIT_CRITICAL_FROM_ISR(flag); + } else { + taskEXIT_CRITICAL(); + } +} + +void usb_osal_msleep(uint32_t delay) +{ + vTaskDelay(pdMS_TO_TICKS(delay)); +} + +void *usb_osal_malloc(size_t size) +{ + return pvPortMalloc(size); +} + +void usb_osal_free(void *ptr) +{ + vPortFree(ptr); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/osal/usb_osal_liteos_m.c b/src/lib/CherryUSB/osal/usb_osal_liteos_m.c new file mode 100644 index 000000000..cda86665e --- /dev/null +++ b/src/lib/CherryUSB/osal/usb_osal_liteos_m.c @@ -0,0 +1,338 @@ +/* + * Copyright (c) 2025, HPMicro + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_osal.h" +#include "usb_errno.h" +#include "usb_config.h" +#include "usb_log.h" + +#include "los_interrupt.h" +#include "los_task.h" +#include "los_queue.h" +#include "los_sem.h" +#include "los_mux.h" +#include "los_memory.h" +#include "los_swtmr.h" + +usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args) +{ + UINT32 task_id; + UINT32 ret; + + TSK_INIT_PARAM_S task_init_param = { + .usTaskPrio = prio, + .pfnTaskEntry = (TSK_ENTRY_FUNC)entry, + .uwStackSize = stack_size, + .uwArg = (UINT32)args, + .pcName = name + }; + + ret = LOS_TaskCreate(&task_id, &task_init_param); + if (ret != LOS_OK) { + USB_LOG_ERR("Create task[%s] failed code[%u]\r\n", name, ret); + while (1) { + } + } + + return (usb_osal_thread_t)task_id; +} + +void usb_osal_thread_delete(usb_osal_thread_t thread) +{ + UINT32 task_id = (UINT32)thread; + UINT32 ret; + + if (thread == NULL) { + task_id = LOS_CurTaskIDGet(); + } + + ret = LOS_TaskDelete(task_id); + if (ret != LOS_OK) { + USB_LOG_ERR("Delete task id[%u] failed code[%u]\r\n", task_id, ret); + while (1) { + } + } +} + +void usb_osal_thread_schedule_other(void) +{ + UINT32 task_id = LOS_CurTaskIDGet(); + const UINT16 old_priority = LOS_TaskPriGet(task_id); + + LOS_TaskPriSet(task_id, OS_TASK_PRIORITY_LOWEST); + + LOS_TaskYield(); + + LOS_TaskPriSet(task_id, old_priority); +} + +usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count) +{ + UINT32 sem_handle; + UINT32 ret; + + ret = LOS_SemCreate(initial_count, &sem_handle); + if (ret != LOS_OK) { + USB_LOG_ERR("Create Sem failed code[%u]\r\n", ret); + while (1) { + } + } + return (usb_osal_sem_t)sem_handle; +} + +void usb_osal_sem_delete(usb_osal_sem_t sem) +{ + UINT32 sem_handle = (UINT32)sem; + UINT32 ret; + + ret = LOS_SemDelete(sem_handle); + if (ret != LOS_OK) { + USB_LOG_ERR("Delete sem handle[%u] failed code[%u]\r\n", + sem_handle, ret); + while (1) { + } + } +} + +int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout) +{ + UINT32 sem_handle = (UINT32)sem; + UINT32 ret; + + ret = LOS_SemPend(sem_handle, + timeout == USB_OSAL_WAITING_FOREVER ? + LOS_WAIT_FOREVER : + timeout); + + return ret == LOS_OK ? 0 : -USB_ERR_TIMEOUT; +} + +int usb_osal_sem_give(usb_osal_sem_t sem) +{ + UINT32 sem_handle = (UINT32)sem; + UINT32 ret; + + ret = LOS_SemPost(sem_handle); + + return ret == LOS_OK ? 0 : -USB_ERR_TIMEOUT; +} + +void usb_osal_sem_reset(usb_osal_sem_t sem) +{ +} + +usb_osal_mutex_t usb_osal_mutex_create(void) +{ + UINT32 mux_handle; + UINT32 ret; + + ret = LOS_MuxCreate(&mux_handle); + if (ret != LOS_OK) { + USB_LOG_ERR("Create mux failed code[%u]\r\n", ret); + while (1) { + } + } + return (usb_osal_mutex_t)mux_handle; +} + +void usb_osal_mutex_delete(usb_osal_mutex_t mutex) +{ + UINT32 mux_handle = (UINT32)mutex; + UINT32 ret; + + ret = LOS_MuxDelete(mux_handle); + if (ret != LOS_OK) { + USB_LOG_ERR("Delete mux handle[%u] failed code[%u]\r\n", + mux_handle, ret); + while (1) { + } + } +} + +int usb_osal_mutex_take(usb_osal_mutex_t mutex) +{ + UINT32 mux_handle = (UINT32)mutex; + UINT32 ret; + + ret = LOS_MuxPend(mux_handle, LOS_WAIT_FOREVER); + + return ret == LOS_OK ? 0 : -USB_ERR_TIMEOUT; +} + +int usb_osal_mutex_give(usb_osal_mutex_t mutex) +{ + UINT32 mux_handle = (UINT32)mutex; + UINT32 ret; + + ret = LOS_MuxPost(mux_handle); + + return ret == LOS_OK ? 0 : -USB_ERR_TIMEOUT; +} + +usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs) +{ + UINT32 queue_id; + UINT32 ret; + + ret = LOS_QueueCreate(NULL, max_msgs, &queue_id, 0, sizeof(uintptr_t)); + if (ret != LOS_OK) { + USB_LOG_ERR("Create queue failed code[%u]\r\n", ret); + while (1) { + } + } + return (usb_osal_mq_t)queue_id; +} + +void usb_osal_mq_delete(usb_osal_mq_t mq) +{ + UINT32 queue_id = (UINT32)mq; + UINT32 ret; + + ret = LOS_QueueDelete(queue_id); + if (ret != LOS_OK) { + USB_LOG_ERR("Delete queue id[%u] failed code[%u]\r\n", + queue_id, ret); + while (1) { + } + } +} + +int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr) +{ + UINT32 queue_id = (UINT32)mq; + UINT32 ret; + UINT32 timeout; + + if (OS_INT_ACTIVE) + timeout = LOS_NO_WAIT; + else + timeout = LOS_WAIT_FOREVER; + + ret = LOS_QueueWrite(queue_id, addr, sizeof(uintptr_t), timeout); + + return ret == LOS_OK ? 0 : -USB_ERR_TIMEOUT; +} + +int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout) +{ + UINT32 queue_id = (UINT32)mq; + UINT32 ret; + UINT32 _timeout; + + if (OS_INT_ACTIVE) + _timeout = LOS_NO_WAIT; + else + _timeout = timeout == USB_OSAL_WAITING_FOREVER ? LOS_WAIT_FOREVER : timeout; + + ret = LOS_QueueRead(queue_id, addr, sizeof(uintptr_t), _timeout); + return ret == LOS_OK ? 0 : -USB_ERR_TIMEOUT; +} + +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period) +{ + UINT32 timer_id; + UINT32 ret; + struct usb_osal_timer *timer_handle; + + timer_handle = usb_osal_malloc(sizeof(struct usb_osal_timer)); + if (timer_handle == NULL) { + USB_LOG_ERR("Malloc usb_osal_timer failed\r\n"); + while (1) { + } + } + memset(timer_handle, 0x00, sizeof(struct usb_osal_timer)); + + ret = LOS_SwtmrCreate(timeout_ms, + is_period ? LOS_SWTMR_MODE_PERIOD : LOS_SWTMR_MODE_NO_SELFDELETE, + (SWTMR_PROC_FUNC)handler, &timer_id, (UINT32)argument +#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1) + , + OS_SWTMR_ROUSES_IGNORE, OS_SWTMR_ALIGN_INSENSITIVE +#endif + ); + + if (ret != LOS_OK) { + USB_LOG_ERR("Create software timer failed code[%u]\r\n", ret); + while (1) { + } + } + + timer_handle->handler = handler; + timer_handle->argument = argument; + timer_handle->is_period = is_period; + timer_handle->timeout_ms = timeout_ms; + timer_handle->timer = (void *)timer_id; + + return timer_handle; +} + +void usb_osal_timer_delete(struct usb_osal_timer *timer) +{ + UINT32 timer_id = (UINT32)timer->timer; + UINT32 ret; + + ret = LOS_SwtmrDelete(timer_id); + if (ret != LOS_OK) { + USB_LOG_ERR("Delete software timer id[%u] failed code[%u]\r\n", + timer_id, ret); + while (1) { + } + } + usb_osal_free(timer); +} + +void usb_osal_timer_start(struct usb_osal_timer *timer) +{ + UINT32 timer_id = (UINT32)timer->timer; + UINT32 ret; + + ret = LOS_SwtmrStart(timer_id); + if (ret != LOS_OK) { + USB_LOG_ERR("Start software timer id[%u] failed code[%u]\r\n", + timer_id, ret); + while (1) { + } + } +} + +void usb_osal_timer_stop(struct usb_osal_timer *timer) +{ + UINT32 timer_id = (UINT32)timer->timer; + UINT32 ret; + + ret = LOS_SwtmrStop(timer_id); + if (ret != LOS_OK) { + USB_LOG_ERR("Stop software timer id[%u] failed code[%u]\r\n", + timer_id, ret); + while (1) { + } + } +} + +size_t usb_osal_enter_critical_section(void) +{ + return LOS_IntLock(); +} + +void usb_osal_leave_critical_section(size_t flag) +{ + LOS_IntRestore(flag); +} + +void usb_osal_msleep(uint32_t delay) +{ + LOS_Msleep(delay); +} + +void *usb_osal_malloc(size_t size) +{ + return LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, size); +} + +void usb_osal_free(void *ptr) +{ + if (ptr != NULL) { + LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, ptr); + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/osal/usb_osal_nuttx.c b/src/lib/CherryUSB/osal/usb_osal_nuttx.c new file mode 100644 index 000000000..499115730 --- /dev/null +++ b/src/lib/CherryUSB/osal/usb_osal_nuttx.c @@ -0,0 +1,384 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_osal.h" +#include "usb_errno.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct mq_adpt { + struct file mq; /* Message queue handle */ + uint32_t msgsize; /* Message size */ + char name[16]; /* Message queue name */ +}; + +usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args) +{ + int pid; + char *argv[2]; + char arg1[32]; + + snprintf(arg1, 16, "%p", args); + argv[0] = arg1; + argv[1] = NULL; + + pid = kthread_create(name, CONFIG_SCHED_HPWORKPRIORITY - prio, stack_size, (void *)entry, + argv); + if (pid > 0) { + return (usb_osal_thread_t)pid; + } else { + return NULL; + } +} + +void usb_osal_thread_delete(usb_osal_thread_t thread) +{ + pid_t pid = (pid_t)((uintptr_t)thread); + + kthread_delete(pid); +} + +void usb_osal_thread_schedule_other(void) +{ + struct tcb_s *tcb = nxsched_self(); + const int old_priority = tcb->sched_priority; + + nxsched_set_priority(tcb, SCHED_PRIORITY_MIN); + + sched_yield(); + + nxsched_set_priority(tcb, old_priority); +} + +usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count) +{ + int ret; + sem_t *sem; + int tmp; + + tmp = sizeof(sem_t); + sem = kmm_malloc(tmp); + if (!sem) { + //printf("ERROR: Failed to alloc %d memory\n", tmp); + return NULL; + } + + ret = nxsem_init(sem, 0, initial_count); + if (ret) { + //printf("ERROR: Failed to initialize sem error=%d\n", ret); + kmm_free(sem); + return NULL; + } + return (usb_osal_sem_t)sem; +} + +void usb_osal_sem_delete(usb_osal_sem_t sem) +{ + sem_t *__sem = (sem_t *)sem; + + nxsem_destroy(__sem); + kmm_free(__sem); +} + +int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout) +{ + int ret; + sem_t *__sem = (sem_t *)sem; + + if (timeout == 0xffffffff) { + ret = nxsem_wait(__sem); + } else { + ret = nxsem_tickwait(__sem, MSEC2TICK(timeout)); + } + + if (ret) { + return -USB_ERR_TIMEOUT; + } else { + return 0; + } +} + +int usb_osal_sem_give(usb_osal_sem_t sem) +{ + int ret; + sem_t *__sem = (sem_t *)sem; + + ret = nxsem_post(__sem); + if (ret) { + return -USB_ERR_INVAL; + } else { + return 0; + } +} + +void usb_osal_sem_reset(usb_osal_sem_t sem) +{ + nxsem_reset((sem_t *)sem, 0); +} + +usb_osal_mutex_t usb_osal_mutex_create(void) +{ + int ret; + mutex_t *mutex; + int tmp; + + tmp = sizeof(mutex_t); + mutex = kmm_malloc(tmp); + if (!mutex) { + //printf("ERROR: Failed to alloc %d memory\n", tmp); + return NULL; + } + + ret = nxmutex_init(mutex); + if (ret) { + //printf("ERROR: Failed to initialize mutex error=%d\n", ret); + kmm_free(mutex); + return NULL; + } + + return (usb_osal_mutex_t)mutex; +} + +void usb_osal_mutex_delete(usb_osal_mutex_t mutex) +{ + mutex_t *__mutex = (mutex_t *)mutex; + + nxmutex_destroy(__mutex); + kmm_free(__mutex); +} + +int usb_osal_mutex_take(usb_osal_mutex_t mutex) +{ + int ret; + mutex_t *__mutex = (mutex_t *)mutex; + + ret = nxmutex_lock(__mutex); + if (ret) { + return -USB_ERR_INVAL; + } else { + return 0; + } +} + +int usb_osal_mutex_give(usb_osal_mutex_t mutex) +{ + int ret; + mutex_t *__mutex = (mutex_t *)mutex; + + ret = nxmutex_unlock(__mutex); + if (ret) { + return -USB_ERR_INVAL; + } else { + return 0; + } +} + +usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs) +{ + struct mq_attr attr; + struct mq_adpt *mq_adpt; + int ret; + + mq_adpt = (struct mq_adpt *)kmm_malloc(sizeof(struct mq_adpt)); + + if (!mq_adpt) { + //printf("ERROR: Failed to kmm_malloc\n"); + return NULL; + } + + snprintf(mq_adpt->name, sizeof(mq_adpt->name), + "/tmp/%p", mq_adpt); + + attr.mq_maxmsg = max_msgs; + attr.mq_msgsize = sizeof(uintptr_t); + attr.mq_curmsgs = 0; + attr.mq_flags = 0; + + ret = file_mq_open(&mq_adpt->mq, mq_adpt->name, + O_RDWR | O_CREAT, 0644, &attr); + + if (ret < 0) { + //printf("ERROR: Failed to create mqueue\n"); + kmm_free(mq_adpt); + return NULL; + } + + mq_adpt->msgsize = sizeof(uintptr_t); + return (usb_osal_mq_t)mq_adpt; +} + +void usb_osal_mq_delete(usb_osal_mq_t mq) +{ + struct mq_adpt *mq_adpt = (struct mq_adpt *)mq; + + file_mq_close(&mq_adpt->mq); + file_mq_unlink(mq_adpt->name); + kmm_free(mq_adpt); +} + +int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr) +{ + struct mq_adpt *mq_adpt = (struct mq_adpt *)mq; + int ret; + + /* send mq from isr, do not use timeout*/ + ret = file_mq_send(&mq_adpt->mq, (const char *)&addr, mq_adpt->msgsize, 0); + if (ret < 0) { + return -USB_ERR_INVAL; + } else { + return 0; + } +} + +static void msec2spec(struct timespec *timespec, uint32_t ticks) +{ + uint32_t tmp; + + tmp = TICK2SEC(ticks); + timespec->tv_sec += tmp; + + ticks -= SEC2TICK(tmp); + tmp = TICK2NSEC(ticks); + + timespec->tv_nsec += tmp; +} + +int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout) +{ + struct mq_adpt *mq_adpt = (struct mq_adpt *)mq; + struct timespec __timeout; + int ret; + + if (timeout == 0xffffffff) + return file_mq_receive(&mq_adpt->mq, (char *)addr, mq_adpt->msgsize, 0); + else { + ret = clock_gettime(CLOCK_REALTIME, &__timeout); + + if (ret < 0) { + //printf("ERROR: Failed to get time\n"); + return -USB_ERR_INVAL; + } + + if (timeout) { + msec2spec(&__timeout, timeout); + } + + return file_mq_timedreceive(&mq_adpt->mq, + (char *)addr, + mq_adpt->msgsize, + 0, + &__timeout); + } +} + +static void os_timer_callback(wdparm_t arg) +{ + struct usb_osal_timer *timer; + + timer = (struct usb_osal_timer *)arg; + + if (timer->handler) { + timer->handler(timer->argument); + } + + if (timer->is_period) { + wd_start(timer->timer, timer->timeout_ms, os_timer_callback, arg); + } +} + +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period) +{ + struct usb_osal_timer *timer = kmm_malloc(sizeof(struct usb_osal_timer)); + struct wdog_s *wdog = kmm_malloc(sizeof(struct wdog_s)); + + (void)name; + + if (!timer || !wdog) { + return NULL; + } + + memset((void *)timer, 0, sizeof(struct usb_osal_timer)); + memset((void *)wdog, 0, sizeof(struct wdog_s)); + + timer->handler = handler; + timer->argument = argument; + timer->timeout_ms = MSEC2TICK(timeout_ms); + timer->is_period = is_period; + timer->timer = (void *)wdog; + + return (struct usb_osal_timer *)timer; +} + +void usb_osal_timer_delete(struct usb_osal_timer *timer) +{ + wd_cancel(timer->timer); + + kmm_free(timer->timer); + kmm_free(timer); +} + +void usb_osal_timer_start(struct usb_osal_timer *timer) +{ + wd_start(timer->timer, timer->timeout_ms, os_timer_callback, (wdparm_t)timer); +} + +void usb_osal_timer_stop(struct usb_osal_timer *timer) +{ + wd_cancel(timer->timer); +} + +size_t usb_osal_enter_critical_section(void) +{ + irqstate_t flags; + + flags = enter_critical_section(); + + return (size_t)flags; +} + +void usb_osal_leave_critical_section(size_t flag) +{ + leave_critical_section(flag); +} + +void usb_osal_msleep(uint32_t delay) +{ + useconds_t usec = delay * 1000; + + nxsig_usleep(usec); +} + +void *usb_osal_malloc(size_t size) +{ + return kmm_malloc(size); +} + +void usb_osal_free(void *ptr) +{ + kmm_free(ptr); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/osal/usb_osal_rtthread.c b/src/lib/CherryUSB/osal/usb_osal_rtthread.c new file mode 100644 index 000000000..8454283f0 --- /dev/null +++ b/src/lib/CherryUSB/osal/usb_osal_rtthread.c @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_osal.h" +#include "usb_errno.h" +#include "usb_config.h" +#include "usb_log.h" +#include +#include + +usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args) +{ + rt_thread_t htask; + htask = rt_thread_create(name, entry, args, stack_size, prio, 10); + if (htask == NULL) { + USB_LOG_ERR("Create thread %s failed\r\n", name); + while (1) { + } + } + rt_thread_startup(htask); + return (usb_osal_thread_t)htask; +} + +void usb_osal_thread_delete(usb_osal_thread_t thread) +{ + if (thread == NULL) { + rt_thread_t self = rt_thread_self(); + rt_thread_control(self, RT_THREAD_CTRL_CLOSE, RT_NULL); + return; + } + + rt_thread_delete(thread); +} + +void usb_osal_thread_schedule_other(void) +{ + rt_thread_t self = rt_thread_self(); + rt_uint8_t priority; +#if (RTTHREAD_VERSION >= RT_VERSION_CHECK(5, 2, 0)) + const rt_uint8_t old_priority = RT_SCHED_PRIV(self).current_priority; +#else + const rt_uint8_t old_priority = self->current_priority; +#endif + priority = RT_THREAD_PRIORITY_MAX - 1; + rt_thread_control(self, RT_THREAD_CTRL_CHANGE_PRIORITY, (void *)&priority); + + rt_thread_yield(); + + rt_thread_control(self, RT_THREAD_CTRL_CHANGE_PRIORITY, (void *)&old_priority); +} + +usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count) +{ + usb_osal_sem_t sem = (usb_osal_sem_t)rt_sem_create("usbh_sem", initial_count, RT_IPC_FLAG_FIFO); + if (sem == NULL) { + USB_LOG_ERR("Create semaphore failed\r\n"); + while (1) { + } + } + return sem; +} + +void usb_osal_sem_delete(usb_osal_sem_t sem) +{ + rt_sem_delete((rt_sem_t)sem); +} + +int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout) +{ + int ret = 0; + rt_err_t result = RT_EOK; + + if (timeout == USB_OSAL_WAITING_FOREVER) { + result = rt_sem_take((rt_sem_t)sem, RT_WAITING_FOREVER); + } else { + result = rt_sem_take((rt_sem_t)sem, rt_tick_from_millisecond(timeout)); + } + if (result == -RT_ETIMEOUT) { + ret = -USB_ERR_TIMEOUT; + } else if (result == -RT_ERROR) { + ret = -USB_ERR_INVAL; + } else { + ret = 0; + } + + return (int)ret; +} + +int usb_osal_sem_give(usb_osal_sem_t sem) +{ + return (int)rt_sem_release((rt_sem_t)sem); +} + +void usb_osal_sem_reset(usb_osal_sem_t sem) +{ + rt_sem_control((rt_sem_t)sem, RT_IPC_CMD_RESET, (void *)0); +} + +usb_osal_mutex_t usb_osal_mutex_create(void) +{ + usb_osal_mutex_t mutex = (usb_osal_mutex_t)rt_mutex_create("usbh_mutex", RT_IPC_FLAG_FIFO); + if (mutex == NULL) { + USB_LOG_ERR("Create mutex failed\r\n"); + while (1) { + } + } + return mutex; +} + +void usb_osal_mutex_delete(usb_osal_mutex_t mutex) +{ + rt_mutex_delete((rt_mutex_t)mutex); +} + +int usb_osal_mutex_take(usb_osal_mutex_t mutex) +{ + return (int)rt_mutex_take((rt_mutex_t)mutex, RT_WAITING_FOREVER); +} + +int usb_osal_mutex_give(usb_osal_mutex_t mutex) +{ + return (int)rt_mutex_release((rt_mutex_t)mutex); +} + +usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs) +{ + return (usb_osal_mq_t)rt_mq_create("usbh_mq", sizeof(uintptr_t), max_msgs, RT_IPC_FLAG_FIFO); +} + +void usb_osal_mq_delete(usb_osal_mq_t mq) +{ + rt_mq_delete((rt_mq_t)mq); +} + +int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr) +{ + return rt_mq_send((rt_mq_t)mq, &addr, sizeof(uintptr_t)); +} + +int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout) +{ + int ret = 0; + rt_err_t result = RT_EOK; + + if (timeout == USB_OSAL_WAITING_FOREVER) { + result = rt_mq_recv((rt_mq_t)mq, addr, sizeof(uintptr_t), RT_WAITING_FOREVER); + } else { + result = rt_mq_recv((rt_mq_t)mq, addr, sizeof(uintptr_t), rt_tick_from_millisecond(timeout)); + } + if (result == -RT_ETIMEOUT) { + ret = -USB_ERR_TIMEOUT; + } else if (result == -RT_ERROR) { + ret = -USB_ERR_INVAL; + } else { + ret = 0; + } + + return (int)ret; +} + +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period) +{ + struct usb_osal_timer *timer; + + timer = rt_malloc(sizeof(struct usb_osal_timer)); + if (timer == NULL) { + USB_LOG_ERR("Create usb_osal_timer failed\r\n"); + while (1) { + } + } + memset(timer, 0, sizeof(struct usb_osal_timer)); + + timer->timer = (void *)rt_timer_create(name, handler, argument, timeout_ms, is_period ? (RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER) : (RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER)); + if (timer->timer == NULL) { + USB_LOG_ERR("Create timer failed\r\n"); + while (1) { + } + } + return timer; +} + +void usb_osal_timer_delete(struct usb_osal_timer *timer) +{ + rt_timer_stop(timer->timer); + rt_timer_delete(timer->timer); + rt_free(timer); +} + +void usb_osal_timer_start(struct usb_osal_timer *timer) +{ + rt_timer_start(timer->timer); +} + +void usb_osal_timer_stop(struct usb_osal_timer *timer) +{ + rt_timer_stop(timer->timer); +} + +size_t usb_osal_enter_critical_section(void) +{ + return rt_hw_interrupt_disable(); +} + +void usb_osal_leave_critical_section(size_t flag) +{ + rt_hw_interrupt_enable(flag); +} + +void usb_osal_msleep(uint32_t delay) +{ + rt_thread_mdelay(delay); +} + +void *usb_osal_malloc(size_t size) +{ + return rt_malloc(size); +} + +void usb_osal_free(void *ptr) +{ + rt_free(ptr); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/osal/usb_osal_threadx.c b/src/lib/CherryUSB/osal/usb_osal_threadx.c new file mode 100644 index 000000000..8d6d7c6bc --- /dev/null +++ b/src/lib/CherryUSB/osal/usb_osal_threadx.c @@ -0,0 +1,324 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_osal.h" +#include "usb_errno.h" +#include "usb_config.h" +#include "usb_log.h" +#include "tx_api.h" + +extern TX_BYTE_POOL usb_byte_pool; // define usb_byte_pool and call usb_osal_init first + +usb_osal_mq_t usb_osal_mq; + +usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args) +{ + TX_THREAD *thread_ptr = TX_NULL; + + tx_byte_allocate(&usb_byte_pool, (VOID **)&thread_ptr, USB_ALIGN_UP(sizeof(TX_THREAD), 4) + stack_size, TX_NO_WAIT); + if (thread_ptr == TX_NULL) { + USB_LOG_ERR("Create thread %s failed\r\n", name); + while (1) { + } + } + + tx_thread_create(thread_ptr, (CHAR *)name, (VOID(*)(ULONG))entry, (uintptr_t)args, + ((CHAR *)thread_ptr + USB_ALIGN_UP(sizeof(TX_THREAD), 4)), stack_size, + prio, prio, TX_NO_TIME_SLICE, TX_AUTO_START); + + return (usb_osal_thread_t)thread_ptr; +} + +void usb_osal_thread_delete(usb_osal_thread_t thread) +{ + if (thread == NULL) { + thread = tx_thread_identify(); + + usb_osal_mq_send(usb_osal_mq, (uintptr_t)thread); + + tx_thread_terminate(thread); + return; + } + + tx_thread_terminate(thread); + tx_thread_delete(thread); + tx_byte_release(thread); +} + +void usb_osal_thread_schedule_other(void) +{ + TX_THREAD *current_thread = tx_thread_identify(); + const UINT old_priority = current_thread->tx_thread_priority; + + tx_thread_priority_change(current_thread, TX_MAX_PRIORITIES - 1, &old_priority); + + tx_thread_relinquish(); + + tx_thread_priority_change(current_thread, old_priority, &old_priority); +} + +usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count) +{ + TX_SEMAPHORE *sem_ptr = TX_NULL; + + tx_byte_allocate(&usb_byte_pool, (VOID **)&sem_ptr, sizeof(TX_SEMAPHORE), TX_NO_WAIT); + if (sem_ptr == TX_NULL) { + USB_LOG_ERR("Create semaphore failed\r\n"); + while (1) { + } + } + + tx_semaphore_create(sem_ptr, "usbh_sem", initial_count); + return (usb_osal_sem_t)sem_ptr; +} + +void usb_osal_sem_delete(usb_osal_sem_t sem) +{ + tx_semaphore_delete((TX_SEMAPHORE *)sem); + tx_byte_release(sem); +} + +int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout) +{ + int ret = 0; + + ret = tx_semaphore_get((TX_SEMAPHORE *)sem, timeout); + if (ret == TX_SUCCESS) { + ret = 0; + } else if ((ret == TX_WAIT_ABORTED) || (ret == TX_NO_INSTANCE)) { + ret = -USB_ERR_TIMEOUT; + } else { + ret = -USB_ERR_INVAL; + } + + return (int)ret; +} + +int usb_osal_sem_give(usb_osal_sem_t sem) +{ + return (tx_semaphore_put((TX_SEMAPHORE *)sem) == TX_SUCCESS) ? 0 : -USB_ERR_INVAL; +} + +void usb_osal_sem_reset(usb_osal_sem_t sem) +{ + tx_semaphore_get((TX_SEMAPHORE *)sem, 0); +} + +usb_osal_mutex_t usb_osal_mutex_create(void) +{ + TX_MUTEX *mutex_ptr = TX_NULL; + + tx_byte_allocate(&usb_byte_pool, (VOID **)&mutex_ptr, sizeof(TX_MUTEX), TX_NO_WAIT); + if (mutex_ptr == TX_NULL) { + USB_LOG_ERR("Create mutex failed\r\n"); + while (1) { + } + } + + tx_mutex_create(mutex_ptr, "usbh_mutex", TX_INHERIT); + return (usb_osal_mutex_t)mutex_ptr; +} + +void usb_osal_mutex_delete(usb_osal_mutex_t mutex) +{ + tx_mutex_delete((TX_MUTEX *)mutex); + tx_byte_release(mutex); +} + +int usb_osal_mutex_take(usb_osal_mutex_t mutex) +{ + int ret = 0; + + ret = tx_mutex_get((TX_MUTEX *)mutex, TX_WAIT_FOREVER); + if (ret == TX_SUCCESS) { + ret = 0; + } else if ((ret == TX_WAIT_ABORTED) || (ret == TX_NO_INSTANCE)) { + ret = -USB_ERR_TIMEOUT; + } else { + ret = -USB_ERR_INVAL; + } + + return (int)ret; +} + +int usb_osal_mutex_give(usb_osal_mutex_t mutex) +{ + return (tx_mutex_put((TX_MUTEX *)mutex) == TX_SUCCESS) ? 0 : -USB_ERR_INVAL; +} + +usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs) +{ + TX_QUEUE *queue_ptr = TX_NULL; + + tx_byte_allocate(&usb_byte_pool, (VOID **)&queue_ptr, USB_ALIGN_UP(sizeof(TX_QUEUE), 4) + sizeof(uintptr_t) * max_msgs, TX_NO_WAIT); + if (queue_ptr == TX_NULL) { + USB_LOG_ERR("Create TX_QUEUE failed\r\n"); + while (1) { + } + } + + tx_queue_create(queue_ptr, "usbh_mq", sizeof(uintptr_t) / 4, (CHAR *)queue_ptr + USB_ALIGN_UP(sizeof(TX_QUEUE), 4), sizeof(uintptr_t) * max_msgs); + return (usb_osal_mq_t)queue_ptr; +} + +void usb_osal_mq_delete(usb_osal_mq_t mq) +{ + tx_queue_delete((TX_QUEUE *)mq); + tx_byte_release(mq); +} + +int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr) +{ + return (tx_queue_send((TX_QUEUE *)mq, &addr, TX_NO_WAIT) == TX_SUCCESS) ? 0 : -USB_ERR_INVAL; +} + +int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout) +{ + int ret = 0; + + ret = tx_queue_receive((TX_QUEUE *)mq, addr, timeout); + if (ret == TX_SUCCESS) { + ret = 0; + } else if (ret == TX_QUEUE_EMPTY) { + ret = -USB_ERR_TIMEOUT; + } else { + ret = -USB_ERR_INVAL; + } + + return (int)ret; +} + +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period) +{ + TX_TIMER *timer_ptr = TX_NULL; + struct usb_osal_timer *timer; + + tx_byte_allocate(&usb_byte_pool, (VOID **)&timer, sizeof(struct usb_osal_timer), TX_NO_WAIT); + if (timer == TX_NULL) { + USB_LOG_ERR("Create usb_osal_timer failed\r\n"); + while (1) { + } + } + memset(timer, 0, sizeof(struct usb_osal_timer)); + + tx_byte_allocate(&usb_byte_pool, (VOID **)&timer_ptr, sizeof(TX_TIMER), TX_NO_WAIT); + if (timer_ptr == TX_NULL) { + USB_LOG_ERR("Create TX_TIMER failed\r\n"); + while (1) { + } + } + + timer->timer = timer_ptr; + timer->timeout_ms = timeout_ms; + timer->is_period = is_period; + if (tx_timer_create(timer_ptr, (CHAR *)name, (void (*)(ULONG))handler, (uintptr_t)argument, 1, is_period ? 1 : 0, + TX_NO_ACTIVATE) != TX_SUCCESS) { + return NULL; + } + return timer; +} + +void usb_osal_timer_delete(struct usb_osal_timer *timer) +{ + tx_timer_deactivate((TX_TIMER *)timer->timer); + tx_timer_delete((TX_TIMER *)timer->timer); + tx_byte_release(timer->timer); + tx_byte_release(timer); +} + +void usb_osal_timer_start(struct usb_osal_timer *timer) +{ + if (tx_timer_change((TX_TIMER *)timer->timer, timer->timeout_ms, timer->is_period ? timer->timeout_ms : 0) == TX_SUCCESS) { + /* Call the tx_timer_activate to activates the specified application + timer. The expiration routines of timers that expire at the same + time are executed in the order they were activated. */ + if (tx_timer_activate((TX_TIMER *)timer->timer) == TX_SUCCESS) { + /* Return osOK for success */ + } else { + /* Return osErrorResource in case of error */ + } + } else { + } +} + +void usb_osal_timer_stop(struct usb_osal_timer *timer) +{ + tx_timer_deactivate((TX_TIMER *)timer->timer); +} + +size_t usb_osal_enter_critical_section(void) +{ + TX_INTERRUPT_SAVE_AREA + + TX_DISABLE + + return interrupt_save; +} + +void usb_osal_leave_critical_section(size_t flag) +{ + TX_INTERRUPT_SAVE_AREA + + interrupt_save = flag; + TX_RESTORE +} + +void usb_osal_msleep(uint32_t delay) +{ +#if TX_TIMER_TICKS_PER_SECOND != 1000 +#error "TX_TIMER_TICKS_PER_SECOND must be 1000" +#endif + tx_thread_sleep(delay); +} + +void *usb_osal_malloc(size_t size) +{ + CHAR *pointer = TX_NULL; + + tx_byte_allocate(&usb_byte_pool, (VOID **)&pointer, size, TX_WAIT_FOREVER); + + return pointer; +} + +void usb_osal_free(void *ptr) +{ + tx_byte_release(ptr); +} + +static void usb_osal_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + int ret; + usb_osal_thread_t thread; + + while (1) { + ret = usb_osal_mq_recv(usb_osal_mq, (uintptr_t *)&thread, TX_WAIT_FOREVER); + if (ret < 0) { + continue; + } + tx_thread_delete(thread); + tx_byte_release(thread); + } +} + +void usb_osal_init(uint8_t *mem, uint32_t mem_size) +{ + usb_osal_thread_t thread; + + tx_byte_pool_create(&usb_byte_pool, "usb byte pool", mem, mem_size); + + thread = usb_osal_thread_create("usb_osal", 2048, 10, usb_osal_thread, NULL); + if (thread == NULL) { + USB_LOG_ERR("Create usb_osal_thread failed\r\n"); + while (1) { + } + } + + usb_osal_mq = usb_osal_mq_create(32); + if (usb_osal_mq == NULL) { + USB_LOG_ERR("Create usb_osal_mq failed\r\n"); + while (1) { + } + } +} diff --git a/src/lib/CherryUSB/osal/usb_osal_zephyr.c b/src/lib/CherryUSB/osal/usb_osal_zephyr.c new file mode 100644 index 000000000..ce214e6e6 --- /dev/null +++ b/src/lib/CherryUSB/osal/usb_osal_zephyr.c @@ -0,0 +1,303 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_osal.h" +#include "usb_errno.h" +#include "usb_config.h" +#include "usb_log.h" + +#include +#if (KERNELVERSION >= 0x3020000) +#include +#else +#include +#endif + +struct release_thread_work { + struct k_work work; + usb_osal_thread_t thread; +}; + +usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args) +{ + k_tid_t tid = NULL; + struct k_thread *thread = (struct k_thread *)k_aligned_alloc(8, sizeof(struct k_thread) + stack_size); + k_thread_stack_t *stack = (k_thread_stack_t *)thread; + + if (thread == NULL) { + USB_LOG_ERR("Create thread faild\r\n"); + return NULL; + } + + tid = k_thread_create(thread, (k_thread_stack_t *)&stack[sizeof(struct k_thread)], + stack_size, + (k_thread_entry_t)entry, + args, NULL, NULL, + prio, + 0, + K_NO_WAIT); + +#if defined(CONFIG_THREAD_NAME) + k_thread_name_set(tid, name); +#endif + + return (usb_osal_thread_t)tid; +} + +static void release_thread_handler(struct k_work *work) +{ + struct release_thread_work *release_work = (struct release_thread_work *)work; + k_free(release_work->thread); + k_work_cancel(work); + k_free(release_work); +} + +void usb_osal_thread_delete(usb_osal_thread_t thread) +{ + struct release_thread_work *release_work; + if (thread == NULL) { +#if (KERNELVERSION >= 0x3070000) + thread = k_sched_current_thread_query(); +#else + thread = z_current_get(); +#endif + release_work = k_malloc(sizeof(struct release_thread_work)); + release_work->thread = thread; + k_work_init(&release_work->work, release_thread_handler); + k_work_submit(&release_work->work); + k_thread_abort(thread); + return; + } + k_thread_abort(thread); + k_free(thread); +} + +void usb_osal_thread_schedule_other(void) +{ +#if (KERNELVERSION >= 0x3070000) + struct k_thread *current_thread = k_sched_current_thread_query(); +#else + struct k_thread *current_thread = z_current_get(); +#endif + const int old_priority = k_thread_priority_get(current_thread); + + k_thread_priority_set(current_thread, K_LOWEST_APPLICATION_THREAD_PRIO); + + k_yield(); + + k_thread_priority_set(current_thread, old_priority); +} + +usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count) +{ + struct k_sem *sem; + + sem = k_malloc(sizeof(struct k_sem)); + if (sem == NULL) { + USB_LOG_ERR("Create semaphore faild\r\n"); + return NULL; + } + k_sem_init(sem, initial_count, 1); + + return (usb_osal_sem_t)sem; +} + +void usb_osal_sem_delete(usb_osal_sem_t sem) +{ + while (k_sem_take((struct k_sem *)sem, K_NO_WAIT) != 0) { + break; + } + k_free((struct k_sem *)sem); +} + +int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout) +{ + if (timeout == USB_OSAL_WAITING_FOREVER) { + return (k_sem_take((struct k_sem *)sem, K_FOREVER) == 0) ? 0 : -USB_ERR_TIMEOUT; + } else { + return (k_sem_take((struct k_sem *)sem, K_MSEC(timeout)) == 0) ? 0 : -USB_ERR_TIMEOUT; + } +} + +int usb_osal_sem_give(usb_osal_sem_t sem) +{ + k_sem_give((struct k_sem *)sem); + + return 0; +} + +void usb_osal_sem_reset(usb_osal_sem_t sem) +{ + k_sem_reset((struct k_sem *)sem); +} + +usb_osal_mutex_t usb_osal_mutex_create(void) +{ + struct k_mutex *mutex; + + mutex = k_malloc(sizeof(struct k_mutex)); + if (mutex == NULL) { + USB_LOG_ERR("Create mutex faild\r\n"); + return NULL; + } + k_mutex_init(mutex); + + return (usb_osal_mutex_t)mutex; +} + +void usb_osal_mutex_delete(usb_osal_mutex_t mutex) +{ + k_free((struct k_mutex *)mutex); +} + +int usb_osal_mutex_take(usb_osal_mutex_t mutex) +{ + return (k_mutex_lock((struct k_mutex *)mutex, K_FOREVER) == 0) ? 0 : -USB_ERR_TIMEOUT; +} + +int usb_osal_mutex_give(usb_osal_mutex_t mutex) +{ + return (k_mutex_unlock((struct k_mutex *)mutex) == 0) ? 0 : -USB_ERR_INVAL; +} + +usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs) +{ + struct k_msgq *msgq; + + msgq = k_malloc(sizeof(struct k_msgq)); + if (msgq == NULL) { + USB_LOG_ERR("Create message queue faild\r\n"); + return NULL; + } + if (k_msgq_alloc_init(msgq, sizeof(uintptr_t), max_msgs) != 0) { + return NULL; + } + + return (usb_osal_mq_t)msgq; +} + +void usb_osal_mq_delete(usb_osal_mq_t mq) +{ + struct k_msgq *msgq; + + msgq = (struct k_msgq *)mq; + + k_msgq_purge(msgq); + k_free(msgq->buffer_start); + k_free(msgq); +} + +int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr) +{ + struct k_msgq *msgq; + + msgq = (struct k_msgq *)mq; + + if (k_is_in_isr()) { + return (k_msgq_put(msgq, &addr, K_NO_WAIT) == 0) ? 0 : -USB_ERR_TIMEOUT; + } else { + return (k_msgq_put(msgq, &addr, K_FOREVER) == 0) ? 0 : -USB_ERR_TIMEOUT; + } +} + +int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout) +{ + struct k_msgq *msgq; + + msgq = (struct k_msgq *)mq; + + if (k_is_in_isr()) { + return (k_msgq_get(msgq, addr, K_NO_WAIT) == 0) ? 0 : -USB_ERR_TIMEOUT; + } else { + if (timeout == USB_OSAL_WAITING_FOREVER) { + return (k_msgq_get(msgq, addr, K_FOREVER) == 0) ? 0 : -USB_ERR_TIMEOUT; + } else { + return (k_msgq_get(msgq, addr, K_MSEC(timeout)) == 0) ? 0 : -USB_ERR_TIMEOUT; + } + } +} + +static void zephyr_timer_wrapper(struct k_timer *ktimer) +{ + struct usb_osal_timer *timer = (struct usb_osal_timer *)ktimer->user_data; + + timer->handler(timer->argument); +} + +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period) +{ + struct usb_osal_timer *timer; + + (void)name; + + timer = k_malloc(sizeof(struct usb_osal_timer)); + if (timer == NULL) { + USB_LOG_ERR("Create timer faild\r\n"); + return NULL; + } + memset(timer, 0, sizeof(struct usb_osal_timer)); + + timer->timer = k_malloc(sizeof(struct k_timer)); + if (timer->timer == NULL) { + USB_LOG_ERR("Create timer faild\r\n"); + return NULL; + } + + timer->handler = handler; + timer->argument = argument; + timer->is_period = is_period; + timer->timeout_ms = timeout_ms; + + k_timer_init(timer->timer, zephyr_timer_wrapper, NULL); + k_timer_user_data_set(timer->timer, timer); + + return timer; +} + +void usb_osal_timer_delete(struct usb_osal_timer *timer) +{ + k_timer_stop(timer->timer); + k_free(timer->timer); + k_free(timer); +} + +void usb_osal_timer_start(struct usb_osal_timer *timer) +{ + if (timer->is_period) { + k_timer_start(timer->timer, K_MSEC(timer->timeout_ms), K_MSEC(timer->timeout_ms)); + } else { + k_timer_start(timer->timer, K_MSEC(timer->timeout_ms), K_NO_WAIT); + } +} + +void usb_osal_timer_stop(struct usb_osal_timer *timer) +{ + k_timer_stop(timer->timer); +} + +size_t usb_osal_enter_critical_section(void) +{ + return irq_lock(); +} + +void usb_osal_leave_critical_section(size_t flag) +{ + irq_unlock(flag); +} + +void usb_osal_msleep(uint32_t delay) +{ + k_sleep(K_MSEC(delay)); +} + +void *usb_osal_malloc(size_t size) +{ + return k_malloc(size); +} + +void usb_osal_free(void *ptr) +{ + k_free(ptr); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/README.md b/src/lib/CherryUSB/platform/README.md new file mode 100644 index 000000000..3d7d8808f --- /dev/null +++ b/src/lib/CherryUSB/platform/README.md @@ -0,0 +1,59 @@ +# Platform Support + +This is a platform support for other opensource projects. + + +## Fatfs + +- Fatfs support with usb host msc. +- Fatfs support with usb device mtp. + +## lwip + +lwip support with usb host net class(cdc_ecm/cdc_ncm/cdc_rndis/asix/rtl8152/bl616_wifi). + +## RT-Thread + +- rt_device support with usb device msc. +- DFS support with usb host msc. +- lwip support with usb host net class(cdc_ecm/cdc_ncm/cdc_rndis/asix/rtl8152/bl616_wifi). +- msh support with lsusb +- device char support with host cdc_acm/ftdi/ch34x/cp210x/pl2303 +- shell support with adb + +## Nuttx + +- char device support fowithr usb device cdc acm. +- char device support with usb host cdc acm. +- fs support with usb device msc. +- fs support with usb host msc. +- net support with usb host net class(cdc_rndis). + +## Threadx + +- filx support with usb host msc. + +## Zephyr + +- shell support with lsusb +- disk support with usb host msc + +## LVGL + +- lvgl indev support with usb host mouse and keyboard. support both LVGL8.x.x and LVGL9.x.x + +## Blackmagic + +Blackmagic support with usb device cdc acm. + +## DAPLINK + +DAPLINK v2.1 support with usb device cdc acm + winusb(hid and msc optional). + +## UF2 + +UF2 support with usb device msc. + +## QMK + +QMK support with usb device hid. \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/blackmagic/bmp_port_cdc_acm.c b/src/lib/CherryUSB/platform/blackmagic/bmp_port_cdc_acm.c new file mode 100644 index 000000000..ae4e54574 --- /dev/null +++ b/src/lib/CherryUSB/platform/blackmagic/bmp_port_cdc_acm.c @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2025, A_Stupid_Liberal + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "usbd_core.h" +#include "usbd_cdc_acm.h" +#include "general.h" +#include "gdb_if.h" +#include "hpm_l1c_drv.h" + +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x01 +#define CDC_INT_EP 0x83 + +#define CDC_MAX_PACKET_SIZE 512 + +#ifdef CONFIG_USB_HS +#if CDC_MAX_PACKET_SIZE != 512 +#error "CDC_MAX_PACKET_SIZE must be 512 in hs" +#endif +#else +#if CDC_MAX_PACKET_SIZE != 64 +#error "CDC_MAX_PACKET_SIZE must be 64 in fs" +#endif +#endif + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN) + +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor_hs[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, USB_BULK_EP_MPS_HS, 0x02), +}; + +static const uint8_t config_descriptor_fs[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, USB_BULK_EP_MPS_FS, 0x02), +}; + +static const uint8_t device_quality_descriptor[] = { + USB_DEVICE_QUALIFIER_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, 0x01), +}; + +static const uint8_t other_speed_config_descriptor_hs[] = { + USB_OTHER_SPEED_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, USB_BULK_EP_MPS_FS, 0x02), +}; + +static const uint8_t other_speed_config_descriptor_fs[] = { + USB_OTHER_SPEED_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, USB_BULK_EP_MPS_HS, 0x02), +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB BMP DEMO", /* Product */ + "20250501", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + (void)speed; + + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + if (speed == USB_SPEED_HIGH) { + return config_descriptor_hs; + } else if (speed == USB_SPEED_FULL) { + return config_descriptor_fs; + } else { + return NULL; + } +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + (void)speed; + + return device_quality_descriptor; +} + +static const uint8_t *other_speed_config_descriptor_callback(uint8_t speed) +{ + if (speed == USB_SPEED_HIGH) { + return other_speed_config_descriptor_hs; + } else if (speed == USB_SPEED_FULL) { + return other_speed_config_descriptor_fs; + } else { + return NULL; + } +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + (void)speed; + + if (index >= (sizeof(string_descriptors) / sizeof(char *))) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .other_speed_descriptor_callback = other_speed_config_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, +}; + +#define USB_RX_BUFFER_SIZE 16384 +__attribute__((aligned(64))) uint8_t g_usb_write_buffer[USB_RX_BUFFER_SIZE]; +__attribute__((aligned(64))) uint8_t g_usb_read_buffer[USB_RX_BUFFER_SIZE]; + +volatile bool g_usb_tx_busy_flag = false; +volatile uint32_t g_usb_tx_count = 0; +volatile uint32_t g_usb_rx_count = 0; +volatile uint32_t g_usb_rx_offset = 0; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + g_usb_tx_busy_flag = false; + g_usb_rx_offset = 0; + g_usb_rx_count = 0; + g_usb_tx_count = 0; + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + g_usb_tx_busy_flag = false; + g_usb_rx_offset = 0; + g_usb_rx_count = 0; + g_usb_tx_count = 0; + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, g_usb_read_buffer, USB_RX_BUFFER_SIZE); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + + usb_dcache_invalidate((uint32_t)g_usb_read_buffer, USB_ALIGN_UP(nbytes, 64)); + g_usb_rx_count = nbytes; + g_usb_rx_offset = 0; +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); + } else { + g_usb_tx_busy_flag = false; + } +} + +/*!< endpoint call back */ +struct usbd_endpoint cdc_out_ep = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +static struct usbd_interface intf0; +static struct usbd_interface intf1; + +/* function ------------------------------------------------------------------*/ + +void cdc_acm_init(uint8_t busid, uint32_t reg_base) +{ + usbd_desc_register(busid, &cdc_descriptor); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +volatile bool dtr_enable = false; + +void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) +{ + if (dtr) { + //printf("remote attach \r\n"); + } else { + //printf("remote detach \r\n"); + } + + dtr_enable = dtr; +} + +void gdb_if_putchar(const char c, const bool flush) +{ + g_usb_write_buffer[g_usb_tx_count++] = c; + + if (flush) { + g_usb_tx_busy_flag = true; + usb_dcache_clean((uint32_t)g_usb_write_buffer, USB_ALIGN_UP(g_usb_tx_count, 64)); + usbd_ep_start_write(0, CDC_IN_EP, (uint8_t *)core_local_mem_to_sys_address(0, (uint32_t)g_usb_write_buffer), g_usb_tx_count); + while (g_usb_tx_busy_flag) { + } + g_usb_tx_count = 0; + } +} + +void gdb_if_flush(const bool force) +{ + g_usb_tx_busy_flag = true; + usb_dcache_clean((uint32_t)g_usb_write_buffer, USB_ALIGN_UP(g_usb_tx_count, 64)); + usbd_ep_start_write(0, CDC_IN_EP, (uint8_t *)core_local_mem_to_sys_address(0, (uint32_t)g_usb_write_buffer), g_usb_tx_count); + while (g_usb_tx_busy_flag) { + } + g_usb_tx_count = 0; +} + +static int __gdb_if_getchar(void) +{ + if (dtr_enable == false) { + return '\04'; + } + + if (g_usb_rx_count > 0) { + if (g_usb_rx_offset < g_usb_rx_count) { + return g_usb_read_buffer[g_usb_rx_offset++]; + } else { + g_usb_rx_count = 0; + /* setup first out ep read transfer */ + usbd_ep_start_read(0, CDC_OUT_EP, g_usb_read_buffer, USB_RX_BUFFER_SIZE); + return -1; + } + } else { + return -1; + } +} + +char gdb_if_getchar(void) +{ + int c; + + while ((c = __gdb_if_getchar()) == -1) { + } + + return (char)c; +} + +char gdb_if_getchar_to(const uint32_t timeout) +{ + int c = 0; + platform_timeout_s receive_timeout; + platform_timeout_set(&receive_timeout, timeout); + + /* Wait while we need more data or until the timeout expires */ + while (!platform_timeout_is_expired(&receive_timeout)) { + c = __gdb_if_getchar(); + if (c != -1) { + return (char)c; + } + } + return -1; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/daplink/dap_main.c b/src/lib/CherryUSB/platform/daplink/dap_main.c new file mode 100644 index 000000000..27e0355b1 --- /dev/null +++ b/src/lib/CherryUSB/platform/daplink/dap_main.c @@ -0,0 +1,749 @@ +/* + * Copyright (c) 2023 ~ 2025, sakumisu + * Copyright (c) 2023 ~ 2025, HalfSweet + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "dap_main.h" + +#define CMSIS_DAP_INTERFACE_SIZE (9 + 7 + 7) +#define CUSTOM_HID_LEN (9 + 9 + 7 + 7) + +#define HIDRAW_INTERVAL 4 + +#define HID_CUSTOM_REPORT_DESC_SIZE 53 + +#define USBD_WINUSB_VENDOR_CODE 0x20 +#define USBD_WEBUSB_VENDOR_CODE 0x21 + +#define USBD_WEBUSB_ENABLE 1 +#define USBD_BULK_ENABLE 1 +#define USBD_WINUSB_ENABLE 1 + +/* WinUSB Microsoft OS 2.0 descriptor sizes */ +#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10 +#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8 +#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20 + +#define FUNCTION_SUBSET_LEN 160 +#define DEVICE_INTERFACE_GUIDS_FEATURE_LEN 132 + +#define USBD_WINUSB_DESC_SET_LEN (WINUSB_DESCRIPTOR_SET_HEADER_SIZE + USBD_WEBUSB_ENABLE * FUNCTION_SUBSET_LEN + USBD_BULK_ENABLE * FUNCTION_SUBSET_LEN) + +#define USBD_NUM_DEV_CAPABILITIES (USBD_WEBUSB_ENABLE + USBD_WINUSB_ENABLE) + +#define USBD_WEBUSB_DESC_LEN 24 +#define USBD_WINUSB_DESC_LEN 28 + +#define USBD_BOS_WTOTALLENGTH (0x05 + \ + USBD_WEBUSB_DESC_LEN * USBD_WEBUSB_ENABLE + \ + USBD_WINUSB_DESC_LEN * USBD_WINUSB_ENABLE) + +#define USB_CONFIG_SIZE (9 + CMSIS_DAP_INTERFACE_SIZE + CDC_ACM_DESCRIPTOR_LEN + \ + CONFIG_CHERRYDAP_USE_CUSTOM_HID * CUSTOM_HID_LEN + \ + CONFIG_CHERRYDAP_USE_MSC * MSC_DESCRIPTOR_LEN + USBD_WEBUSB_ENABLE * 9) + +#define INTF_NUM (1 + 2 + CONFIG_CHERRYDAP_USE_CUSTOM_HID + CONFIG_CHERRYDAP_USE_MSC + USBD_WEBUSB_ENABLE) + +#define MSC_INTF_NUM (3 + CONFIG_CHERRYDAP_USE_CUSTOM_HID) + +#define WEBUSB_INTF_NUM (3 + CONFIG_CHERRYDAP_USE_CUSTOM_HID + CONFIG_CHERRYDAP_USE_MSC) + +#define WEBUSB_URL_STRINGS \ + 'c', 'h', 'e', 'r', 'r', 'y', 'd', 'a', 'p', '.', 'c', 'h', 'e', 'r', 'r', 'y', '-', 'e', 'm', 'b', 'e', 'd', 'd', 'e', 'd', '.', 'o', 'r', 'g', + +__ALIGN_BEGIN const uint8_t USBD_WinUSBDescriptorSetDescriptor[] = { + WBVAL(WINUSB_DESCRIPTOR_SET_HEADER_SIZE), /* wLength */ + WBVAL(WINUSB_SET_HEADER_DESCRIPTOR_TYPE), /* wDescriptorType */ + 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ + WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ +#if (USBD_WEBUSB_ENABLE) + WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), // wLength + WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), // wDescriptorType + WEBUSB_INTF_NUM, // bFirstInterface USBD_WINUSB_IF_NUM + 0, // bReserved + WBVAL(FUNCTION_SUBSET_LEN), // wSubsetLength + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), // wLength + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), // wDescriptorType + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, // CompatibleId + 0, 0, 0, 0, 0, 0, 0, 0, // SubCompatibleId + WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), // wLength + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), // wDescriptorType + WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), // wPropertyDataType + WBVAL(42), // wPropertyNameLength + 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, + 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, + 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, + WBVAL(80), // wPropertyDataLength + '{', 0, + '9', 0, '2', 0, 'C', 0, 'E', 0, '6', 0, '4', 0, '6', 0, '2', 0, '-', 0, + '9', 0, 'C', 0, '7', 0, '7', 0, '-', 0, + '4', 0, '6', 0, 'F', 0, 'E', 0, '-', 0, + '9', 0, '3', 0, '3', 0, 'B', 0, '-', + 0, '3', 0, '1', 0, 'C', 0, 'B', 0, '9', 0, 'C', 0, '5', 0, 'A', 0, 'A', 0, '3', 0, 'B', 0, '9', 0, + '}', 0, 0, 0, 0, 0, +#endif +#if USBD_BULK_ENABLE + WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), /* wLength */ + WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), /* wDescriptorType */ + 0, /* bFirstInterface USBD_BULK_IF_NUM*/ + 0, /* bReserved */ + WBVAL(FUNCTION_SUBSET_LEN), /* wSubsetLength */ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ + 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ + WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), /* wLength */ + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ + WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), /* wPropertyDataType */ + WBVAL(42), /* wPropertyNameLength */ + 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, + 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, + 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, + WBVAL(80), /* wPropertyDataLength */ + '{', 0, + 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0, + '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, + '4', 0, '6', 0, '6', 0, '3', 0, '-', 0, + 'A', 0, 'A', 0, '3', 0, '6', 0, '-', + 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, + '}', 0, 0, 0, 0, 0 +#endif +}; + +__ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[] = { + 0x05, /* bLength */ + 0x0f, /* bDescriptorType */ + WBVAL(USBD_BOS_WTOTALLENGTH), /* wTotalLength */ + USBD_NUM_DEV_CAPABILITIES, /* bNumDeviceCaps */ +#if (USBD_WEBUSB_ENABLE) + USBD_WEBUSB_DESC_LEN, /* bLength */ + 0x10, /* bDescriptorType */ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ + 0x00, /* bReserved */ + 0x38, 0xB6, 0x08, 0x34, /* PlatformCapabilityUUID */ + 0xA9, 0x09, 0xA0, 0x47, + 0x8B, 0xFD, 0xA0, 0x76, + 0x88, 0x15, 0xB6, 0x65, + WBVAL(0x0100), /* 1.00 */ /* bcdVersion */ + USBD_WEBUSB_VENDOR_CODE, /* bVendorCode */ + 1, /* iLandingPage */ +#endif +#if (USBD_WINUSB_ENABLE) + USBD_WINUSB_DESC_LEN, /* bLength */ + 0x10, /* bDescriptorType */ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ + 0x00, /* bReserved */ + 0xDF, 0x60, 0xDD, 0xD8, /* PlatformCapabilityUUID */ + 0x89, 0x45, 0xC7, 0x4C, + 0x9C, 0xD2, 0x65, 0x9D, + 0x9E, 0x64, 0x8A, 0x9F, + 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ + WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ + USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ + 0, /* bAltEnumCode */ +#endif +}; + +#define URL_DESCRIPTOR_LENGTH (3 + 29) + +const uint8_t USBD_WebUSBURLDescriptor[URL_DESCRIPTOR_LENGTH] = { + URL_DESCRIPTOR_LENGTH, + WEBUSB_URL_TYPE, + WEBUSB_URL_SCHEME_HTTPS, + WEBUSB_URL_STRINGS +}; + +// clang-format off +#define HID_DESC() \ + /************** Descriptor of Custom interface *****************/ \ + 0x09, /* bLength: Interface Descriptor size */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ \ + 0X03, /* bInterfaceNumber: Number of Interface */ \ + 0x00, /* bAlternateSetting: Alternate setting */ \ + 0x02, /* bNumEndpoints */ \ + 0x03, /* bInterfaceClass: HID */ \ + 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ \ + 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ \ + 0, /* iInterface: Index of string descriptor */ /******************** Descriptor of Custom HID ********************/ \ + 0x09, /* bLength: HID Descriptor size */ \ + HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ \ + 0x11, /* bcdHID: HID Class Spec release number */ \ + 0x01, \ + 0x00, /* bCountryCode: Hardware target country */ \ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ \ + 0x22, /* bDescriptorType */ \ + HID_CUSTOM_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ \ + 0x00, /******************** Descriptor of Custom in endpoint ********************/ \ + 0x07, /* bLength: Endpoint Descriptor size */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ + HID_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ \ + 0x03, /* bmAttributes: Interrupt endpoint */ \ + WBVAL(HID_PACKET_SIZE), /* wMaxPacketSize: 4 Byte max */ \ + HIDRAW_INTERVAL, /* bInterval: Polling Interval */ /******************** Descriptor of Custom out endpoint ********************/ \ + 0x07, /* bLength: Endpoint Descriptor size */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ + HID_OUT_EP, /* bEndpointAddress: Endpoint Address (IN) */ \ + 0x03, /* bmAttributes: Interrupt endpoint */ \ + WBVAL(HID_PACKET_SIZE), /* wMaxPacketSize: 4 Byte max */ \ + HIDRAW_INTERVAL /* bInterval: Polling Interval */ +// clang-format on + +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + /* Interface 0 */ + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), + /* Endpoint OUT 2 */ + USB_ENDPOINT_DESCRIPTOR_INIT(DAP_OUT_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), + /* Endpoint IN 1 */ + USB_ENDPOINT_DESCRIPTOR_INIT(DAP_IN_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, DAP_PACKET_SIZE, 0x00), +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID + HID_DESC(), +#endif +#if CONFIG_CHERRYDAP_USE_MSC + MSC_DESCRIPTOR_INIT(MSC_INTF_NUM, MSC_OUT_EP, MSC_IN_EP, DAP_PACKET_SIZE, 0x00), +#endif +#if USBD_WEBUSB_ENABLE + USB_INTERFACE_DESCRIPTOR_INIT(WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x04), +#endif +}; + +static const uint8_t other_speed_config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + /* Interface 0 */ + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), + /* Endpoint OUT 2 */ + USB_ENDPOINT_DESCRIPTOR_INIT(DAP_OUT_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), + /* Endpoint IN 1 */ + USB_ENDPOINT_DESCRIPTOR_INIT(DAP_IN_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, DAP_PACKET_SIZE, 0x00), +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID + HID_DESC(), +#endif +#if CONFIG_CHERRYDAP_USE_MSC + MSC_DESCRIPTOR_INIT(0x04, MSC_OUT_EP, MSC_IN_EP, DAP_PACKET_SIZE, 0x00), +#endif +#if USBD_WEBUSB_ENABLE + USB_INTERFACE_DESCRIPTOR_INIT(WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x04), +#endif +}; + +/*!< custom hid report descriptor */ +const uint8_t hid_custom_report_desc[HID_CUSTOM_REPORT_DESC_SIZE] = { + /* USER CODE BEGIN 0 */ + 0x06, 0x00, 0xff, /* USAGE_PAGE (Vendor Defined Page 1) */ + 0x09, 0x01, /* USAGE (Vendor Usage 1) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + 0x85, 0x02, /* REPORT ID (0x02) */ + 0x09, 0x02, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /*LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0xff, 0x03, /* REPORT_COUNT (1023) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + /* <___________________________________________________> */ + 0x85, 0x01, /* REPORT ID (0x01) */ + 0x09, 0x03, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0xff, 0x03, /* REPORT_COUNT (1023) */ + 0x91, 0x02, /* OUTPUT (Data,Var,Abs) */ + + /* <___________________________________________________> */ + 0x85, 0x03, /* REPORT ID (0x03) */ + 0x09, 0x04, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0xff, 0x03, /* REPORT_COUNT (1023) */ + 0xb1, 0x02, /* FEATURE (Data,Var,Abs) */ + /* USER CODE END 0 */ + 0xC0 /* END_COLLECTION */ +}; + +char serial_number_dynamic[36] = "00000000000000000123456789ABCDEF"; // Dynamic serial number + +char *string_descriptors[] = { + (char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CMSIS-DAP", /* Product */ + "00000000000000000123456789ABCDEF", /* Serial Number */ + "CherryUSB WebUSB", +}; + +static const uint8_t device_quality_descriptor[] = { + USB_DEVICE_QUALIFIER_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, 0x01), +}; + +__WEAK const uint8_t *device_descriptor_callback(uint8_t speed) +{ + (void)speed; + return device_descriptor; +} + +__WEAK const uint8_t *config_descriptor_callback(uint8_t speed) +{ + (void)speed; + return config_descriptor; +} + +__WEAK const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + (void)speed; + return device_quality_descriptor; +} + +__WEAK const uint8_t *other_speed_config_descriptor_callback(uint8_t speed) +{ + (void)speed; + return other_speed_config_descriptor; +} + +__WEAK const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + (void)speed; + + if (index == 3) { + return serial_number_dynamic; + } + + if (index >= (sizeof(string_descriptors) / sizeof(char *))) { + return NULL; + } + return string_descriptors[index]; +} + +static volatile uint16_t USB_RequestIndexI = 0; // Request Index In +static volatile uint16_t USB_RequestIndexO = 0; // Request Index Out +static volatile uint16_t USB_RequestCountI = 0; // Request Count In +static volatile uint16_t USB_RequestCountO = 0; // Request Count Out +static volatile uint8_t USB_RequestIdle = 1; // Request Idle Flag + +static volatile uint16_t USB_ResponseIndexI = 0; // Response Index In +static volatile uint16_t USB_ResponseIndexO = 0; // Response Index Out +static volatile uint16_t USB_ResponseCountI = 0; // Response Count In +static volatile uint16_t USB_ResponseCountO = 0; // Response Count Out +static volatile uint8_t USB_ResponseIdle = 1; // Response Idle Flag + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t USB_Request[DAP_PACKET_COUNT][DAP_PACKET_SIZE]; // Request Buffer +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t USB_Response[DAP_PACKET_COUNT][DAP_PACKET_SIZE]; // Response Buffer +static uint16_t USB_RespSize[DAP_PACKET_COUNT]; // Response Size + +volatile struct cdc_line_coding g_cdc_lincoding; +volatile uint8_t config_uart = 0; +volatile uint8_t config_uart_transfer = 0; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t uartrx_ringbuffer[CONFIG_UARTRX_RINGBUF_SIZE]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t usbrx_ringbuffer[CONFIG_USBRX_RINGBUF_SIZE]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t usb_tmpbuffer[DAP_PACKET_SIZE]; + +static volatile uint8_t usbrx_idle_flag = 0; +static volatile uint8_t usbtx_idle_flag = 0; +static volatile uint8_t uarttx_idle_flag = 0; + +USB_NOCACHE_RAM_SECTION chry_ringbuffer_t g_uartrx; +USB_NOCACHE_RAM_SECTION chry_ringbuffer_t g_usbrx; + +void usbd_event_handler(uint8_t busid, uint8_t event) +{ + (void)busid; + switch (event) { + case USBD_EVENT_RESET: + usbrx_idle_flag = 0; + usbtx_idle_flag = 0; + uarttx_idle_flag = 0; + config_uart_transfer = 0; + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + /* setup first out ep read transfer */ + USB_RequestIdle = 0U; + + usbd_ep_start_read(0, DAP_OUT_EP, USB_Request[0], DAP_PACKET_SIZE); + usbd_ep_start_read(0, CDC_OUT_EP, usb_tmpbuffer, DAP_PACKET_SIZE); + + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void dap_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + if (USB_Request[USB_RequestIndexI][0] == ID_DAP_TransferAbort) { + DAP_TransferAbort = 1U; + } else { + USB_RequestIndexI++; + if (USB_RequestIndexI == DAP_PACKET_COUNT) { + USB_RequestIndexI = 0U; + } + USB_RequestCountI++; + } + + // Start reception of next request packet + if ((uint16_t)(USB_RequestCountI - USB_RequestCountO) != DAP_PACKET_COUNT) { + usbd_ep_start_read(0, DAP_OUT_EP, USB_Request[USB_RequestIndexI], DAP_PACKET_SIZE); + } else { + USB_RequestIdle = 1U; + } +} + +void dap_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + if (USB_ResponseCountI != USB_ResponseCountO) { + // Load data from response buffer to be sent back + usbd_ep_start_write(0, DAP_IN_EP, USB_Response[USB_ResponseIndexO], USB_RespSize[USB_ResponseIndexO]); + USB_ResponseIndexO++; + if (USB_ResponseIndexO == DAP_PACKET_COUNT) { + USB_ResponseIndexO = 0U; + } + USB_ResponseCountO++; + } else { + USB_ResponseIdle = 1U; + } +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + chry_ringbuffer_write(&g_usbrx, usb_tmpbuffer, nbytes); + if (chry_ringbuffer_get_free(&g_usbrx) >= DAP_PACKET_SIZE) { + usbd_ep_start_read(0, CDC_OUT_EP, usb_tmpbuffer, DAP_PACKET_SIZE); + } else { + usbrx_idle_flag = 1; + } +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + (void)busid; + uint32_t size; + uint8_t *buffer; + + chry_ringbuffer_linear_read_done(&g_uartrx, nbytes); + if ((nbytes % DAP_PACKET_SIZE) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(0, CDC_IN_EP, NULL, 0); + } else { + if (chry_ringbuffer_get_used(&g_uartrx)) { + buffer = chry_ringbuffer_linear_read_setup(&g_uartrx, &size); + usbd_ep_start_write(0, CDC_IN_EP, buffer, size); + } else { + usbtx_idle_flag = 1; + } + } +} + +struct usbd_endpoint dap_out_ep = { + .ep_addr = DAP_OUT_EP, + .ep_cb = dap_out_callback +}; + +struct usbd_endpoint dap_in_ep = { + .ep_addr = DAP_IN_EP, + .ep_cb = dap_in_callback +}; + +struct usbd_endpoint cdc_out_ep = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID +struct usbd_endpoint hid_custom_in_ep = { + .ep_addr = HID_IN_EP, + .ep_cb = usbd_hid_custom_in_callback, +}; + +struct usbd_endpoint hid_custom_out_ep = { + .ep_addr = HID_OUT_EP, + .ep_cb = usbd_hid_custom_out_callback, +}; +#endif + +struct usbd_interface dap_intf; +struct usbd_interface intf1; +struct usbd_interface intf2; +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID +struct usbd_interface hid_intf; +#endif + +#if CONFIG_CHERRYDAP_USE_MSC +struct usbd_interface intf3; +#endif + +struct usb_msosv2_descriptor msosv2_desc = { + .vendor_code = USBD_WINUSB_VENDOR_CODE, + .compat_id = USBD_WinUSBDescriptorSetDescriptor, + .compat_id_len = USBD_WINUSB_DESC_SET_LEN, +}; + +struct usb_bos_descriptor bos_desc = { + .string = USBD_BinaryObjectStoreDescriptor, + .string_len = USBD_BOS_WTOTALLENGTH +}; + +struct usb_webusb_descriptor webusb_url_desc = { + .vendor_code = USBD_WEBUSB_VENDOR_CODE, + .string = USBD_WebUSBURLDescriptor, + .string_len = URL_DESCRIPTOR_LENGTH +}; + +const struct usb_descriptor cmsisdap_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .other_speed_descriptor_callback = other_speed_config_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .bos_descriptor = &bos_desc, + .msosv2_descriptor = &msosv2_desc, + .webusb_url_descriptor = &webusb_url_desc +}; + +void chry_dap_init(uint8_t busid, uint32_t reg_base) +{ + chry_ringbuffer_init(&g_uartrx, uartrx_ringbuffer, CONFIG_UARTRX_RINGBUF_SIZE); + chry_ringbuffer_init(&g_usbrx, usbrx_ringbuffer, CONFIG_USBRX_RINGBUF_SIZE); + + DAP_Setup(); + + usbd_desc_register(0, &cmsisdap_descriptor); + + /*!< winusb */ + usbd_add_interface(0, &dap_intf); + usbd_add_endpoint(0, &dap_out_ep); + usbd_add_endpoint(0, &dap_in_ep); + + /*!< cdc acm */ + usbd_add_interface(0, usbd_cdc_acm_init_intf(0, &intf1)); + usbd_add_interface(0, usbd_cdc_acm_init_intf(0, &intf2)); + usbd_add_endpoint(0, &cdc_out_ep); + usbd_add_endpoint(0, &cdc_in_ep); + +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID + /*!< hid */ + usbd_add_interface(0, usbd_hid_init_intf(0, &hid_intf, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE)); + hid_intf.notify_handler = hid_custom_notify_handler; + usbd_add_endpoint(0, &hid_custom_in_ep); + usbd_add_endpoint(0, &hid_custom_out_ep); +#endif + +#if CONFIG_CHERRYDAP_USE_MSC + usbd_add_interface(0, usbd_msc_init_intf(0, &intf3, MSC_OUT_EP, MSC_IN_EP)); +#endif + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +void chry_dap_handle(void) +{ + uint32_t n; + + // Process pending requests + while (USB_RequestCountI != USB_RequestCountO) { + // Handle Queue Commands + n = USB_RequestIndexO; + while (USB_Request[n][0] == ID_DAP_QueueCommands) { + USB_Request[n][0] = ID_DAP_ExecuteCommands; + n++; + if (n == DAP_PACKET_COUNT) { + n = 0U; + } + if (n == USB_RequestIndexI) { + // flags = osThreadFlagsWait(0x81U, osFlagsWaitAny, osWaitForever); + // if (flags & 0x80U) { + // break; + // } + } + } + + // Execute DAP Command (process request and prepare response) + USB_RespSize[USB_ResponseIndexI] = + (uint16_t)DAP_ExecuteCommand(USB_Request[USB_RequestIndexO], USB_Response[USB_ResponseIndexI]); + + // Update Request Index and Count + USB_RequestIndexO++; + if (USB_RequestIndexO == DAP_PACKET_COUNT) { + USB_RequestIndexO = 0U; + } + USB_RequestCountO++; + + if (USB_RequestIdle) { + if ((uint16_t)(USB_RequestCountI - USB_RequestCountO) != DAP_PACKET_COUNT) { + USB_RequestIdle = 0U; + usbd_ep_start_read(0, DAP_OUT_EP, USB_Request[USB_RequestIndexI], DAP_PACKET_SIZE); + } + } + + // Update Response Index and Count + USB_ResponseIndexI++; + if (USB_ResponseIndexI == DAP_PACKET_COUNT) { + USB_ResponseIndexI = 0U; + } + USB_ResponseCountI++; + + if (USB_ResponseIdle) { + if (USB_ResponseCountI != USB_ResponseCountO) { + // Load data from response buffer to be sent back + n = USB_ResponseIndexO++; + if (USB_ResponseIndexO == DAP_PACKET_COUNT) { + USB_ResponseIndexO = 0U; + } + USB_ResponseCountO++; + USB_ResponseIdle = 0U; + usbd_ep_start_write(0, DAP_IN_EP, USB_Response[n], USB_RespSize[n]); + } + } + } +} + +void usbd_cdc_acm_set_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding) +{ + (void)busid; + if (memcmp(line_coding, (uint8_t *)&g_cdc_lincoding, sizeof(struct cdc_line_coding)) != 0) { + memcpy((uint8_t *)&g_cdc_lincoding, line_coding, sizeof(struct cdc_line_coding)); + config_uart = 1; + config_uart_transfer = 0; + } +} + +void usbd_cdc_acm_get_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding) +{ + (void)busid; + memcpy(line_coding, (uint8_t *)&g_cdc_lincoding, sizeof(struct cdc_line_coding)); +} + +void chry_dap_usb2uart_handle(void) +{ + uint32_t size; + uint8_t *buffer; + + if (config_uart) { + /* disable irq here */ + config_uart = 0; + /* config uart here */ + chry_dap_usb2uart_uart_config_callback((struct cdc_line_coding *)&g_cdc_lincoding); + usbtx_idle_flag = 1; + uarttx_idle_flag = 1; + config_uart_transfer = 1; + //chry_ringbuffer_reset_read(&g_uartrx); + /* enable irq here */ + } + + if (config_uart_transfer == 0) { + return; + } + + /* why we use chry_ringbuffer_linear_read_setup? + * becase we use dma and we do not want to use temp buffer to memcpy from ringbuffer + * + */ + + /* uartrx to usb tx */ + if (usbtx_idle_flag) { + if (chry_ringbuffer_get_used(&g_uartrx)) { + usbtx_idle_flag = 0; + /* start first transfer */ + buffer = chry_ringbuffer_linear_read_setup(&g_uartrx, &size); + usbd_ep_start_write(0, CDC_IN_EP, buffer, size); + } + } + + /* usbrx to uart tx */ + if (uarttx_idle_flag) { + if (chry_ringbuffer_get_used(&g_usbrx)) { + uarttx_idle_flag = 0; + /* start first transfer */ + buffer = chry_ringbuffer_linear_read_setup(&g_usbrx, &size); + chry_dap_usb2uart_uart_send_bydma(buffer, size); + } + } + + /* check whether usb rx ringbuffer have space to store */ + if (usbrx_idle_flag) { + if (chry_ringbuffer_get_free(&g_usbrx) >= DAP_PACKET_SIZE) { + usbrx_idle_flag = 0; + usbd_ep_start_read(0, CDC_OUT_EP, usb_tmpbuffer, DAP_PACKET_SIZE); + } + } +} + +/* implment by user */ +__WEAK void chry_dap_usb2uart_uart_config_callback(struct cdc_line_coding *line_coding) +{ +} + +/* called by user */ +void chry_dap_usb2uart_uart_send_complete(uint32_t size) +{ + uint8_t *buffer; + + chry_ringbuffer_linear_read_done(&g_usbrx, size); + + if (chry_ringbuffer_get_used(&g_usbrx)) { + buffer = chry_ringbuffer_linear_read_setup(&g_usbrx, &size); + chry_dap_usb2uart_uart_send_bydma(buffer, size); + } else { + uarttx_idle_flag = 1; + } +} + +/* implment by user */ +__WEAK void chry_dap_usb2uart_uart_send_bydma(uint8_t *data, uint16_t len) +{ +} + +#if CONFIG_CHERRYDAP_USE_MSC +#define BLOCK_SIZE 512 +#define BLOCK_COUNT 10 + +typedef struct +{ + uint8_t BlockSpace[BLOCK_SIZE]; +} BLOCK_TYPE; + +BLOCK_TYPE mass_block[BLOCK_COUNT]; + +void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size) +{ + *block_num = 1000; //Pretend having so many buffer,not has actually. + *block_size = BLOCK_SIZE; +} +int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (sector < 10) + memcpy(buffer, mass_block[sector].BlockSpace, length); + return 0; +} + +int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (sector < 10) + memcpy(mass_block[sector].BlockSpace, buffer, length); + return 0; +} +#endif diff --git a/src/lib/CherryUSB/platform/daplink/dap_main.h b/src/lib/CherryUSB/platform/daplink/dap_main.h new file mode 100644 index 000000000..596f7a47e --- /dev/null +++ b/src/lib/CherryUSB/platform/daplink/dap_main.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2023 ~ 2025, sakumisu + * Copyright (c) 2023 ~ 2025, HalfSweet + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef DAP_MAIN_H +#define DAP_MAIN_H + +#include "usbd_core.h" +#include "usbd_cdc.h" +#include "usbd_msc.h" +#include "usbd_hid.h" +#include "chry_ringbuffer.h" +#include "DAP_config.h" +#include "DAP.h" + +#define DAP_IN_EP 0x81 +#define DAP_OUT_EP 0x02 + +#define CDC_IN_EP 0x83 +#define CDC_OUT_EP 0x04 +#define CDC_INT_EP 0x85 + +#define MSC_IN_EP 0x86 +#define MSC_OUT_EP 0x07 + +#define HID_IN_EP 0x88 +#define HID_OUT_EP 0x09 + +#define USBD_VID 0x0D28 +#define USBD_PID 0x0204 +#define USBD_MAX_POWER 500 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USB_HS +#if DAP_PACKET_SIZE != 512 +#error "DAP_PACKET_SIZE must be 512 in hs" +#endif +#else +#if DAP_PACKET_SIZE != 64 +#error "DAP_PACKET_SIZE must be 64 in fs" +#endif +#endif + +#ifdef CONFIG_USB_HS +#define HID_PACKET_SIZE 1024 +#else +#define HID_PACKET_SIZE 64 +#endif + +#define CONFIG_UARTRX_RINGBUF_SIZE (8 * 1024) +#define CONFIG_USBRX_RINGBUF_SIZE (8 * 1024) + +#ifndef CONFIG_CHERRYDAP_USE_MSC +#define CONFIG_CHERRYDAP_USE_MSC 0 +#endif + +#ifndef CONFIG_CHERRYDAP_USE_CUSTOM_HID +#define CONFIG_CHERRYDAP_USE_CUSTOM_HID 0 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +extern char serial_number_dynamic[36]; + +extern struct usbd_interface hid_intf; + +extern chry_ringbuffer_t g_uartrx; +extern chry_ringbuffer_t g_usbrx; + +void chry_dap_init(uint8_t busid, uint32_t reg_base); + +void chry_dap_handle(void); + +void chry_dap_usb2uart_handle(void); + +/* implment by user */ +extern void chry_dap_usb2uart_uart_config_callback(struct cdc_line_coding *line_coding); + +/* implment by user */ +extern void chry_dap_usb2uart_uart_send_bydma(uint8_t *data, uint16_t len); + +void chry_dap_usb2uart_uart_send_complete(uint32_t size); + +/* implment by user */ +extern void hid_custom_notify_handler(uint8_t busid, uint8_t event, void *arg); + +/* implment by user */ +extern void usbd_hid_custom_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes); + +/* implment by user */ +extern void usbd_hid_custom_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/fatfs/usbd_fatfs_mtp.c b/src/lib/CherryUSB/platform/fatfs/usbd_fatfs_mtp.c new file mode 100644 index 000000000..10de53952 --- /dev/null +++ b/src/lib/CherryUSB/platform/fatfs/usbd_fatfs_mtp.c @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "ff.h" +#include "diskio.h" +#include "usbd_core.h" +#include "usb_osal.h" +#include "usbd_mtp.h" + +FATFS s_sd_disk; +FIL s_file; +BYTE work[FF_MAX_SS]; + +const TCHAR driver_num_buf[3] = { '0', ':', '\0' }; + +const char *show_error_string(FRESULT fresult); + +static FRESULT sd_mount_fs(void) +{ + FRESULT fresult = f_mount(&s_sd_disk, driver_num_buf, 1); + if (fresult == FR_OK) { + printf("SD card has been mounted successfully\n"); + } else { + printf("Failed to mount SD card, cause: %s\n", show_error_string(fresult)); + } + + return fresult; +} + +#if 0 +static FRESULT sd_mkfs(void) +{ + printf("Formatting the SD card, depending on the SD card capacity, the formatting process may take a long time\n"); + FRESULT fresult = f_mkfs(driver_num_buf, NULL, work, sizeof(work)); + if (fresult != FR_OK) { + printf("Making File system failed, cause: %s\n", show_error_string(fresult)); + } else { + printf("Making file system is successful\n"); + } + + return fresult; +} +#endif + +static FRESULT sd_write_file(void) +{ + FRESULT fresult = f_open(&s_file, "0:/readme.txt", FA_WRITE | FA_CREATE_ALWAYS); + if (fresult != FR_OK) { + printf("Create new file failed, cause: %d\n", show_error_string(fresult)); + } else { + printf("Create new file successfully, status=%d\n", fresult); + } + char hello_str[] = "Hello, this is SD card FATFS demo\n"; + UINT byte_written; + fresult = f_write(&s_file, hello_str, sizeof(hello_str), &byte_written); + if (fresult != FR_OK) { + printf("Write file failed, cause: %s\n", show_error_string(fresult)); + } else { + printf("Write file operation is successfully\n"); + } + + f_close(&s_file); + + return fresult; +} + +const char *show_error_string(FRESULT fresult) +{ + const char *result_str; + + switch (fresult) { + case FR_OK: + result_str = "succeeded"; + break; + case FR_DISK_ERR: + result_str = "A hard error occurred in the low level disk I/O level"; + break; + case FR_INT_ERR: + result_str = "Assertion failed"; + break; + case FR_NOT_READY: + result_str = "The physical drive cannot work"; + break; + case FR_NO_FILE: + result_str = "Could not find the file"; + break; + case FR_NO_PATH: + result_str = "Could not find the path"; + break; + case FR_INVALID_NAME: + result_str = "Tha path name format is invalid"; + break; + case FR_DENIED: + result_str = "Access denied due to prohibited access or directory full"; + break; + case FR_EXIST: + result_str = "Access denied due to prohibited access"; + break; + case FR_INVALID_OBJECT: + result_str = "The file/directory object is invalid"; + break; + case FR_WRITE_PROTECTED: + result_str = "The physical drive is write protected"; + break; + case FR_INVALID_DRIVE: + result_str = "The logical driver number is invalid"; + break; + case FR_NOT_ENABLED: + result_str = "The volume has no work area"; + break; + case FR_NO_FILESYSTEM: + result_str = "There is no valid FAT volume"; + break; + case FR_MKFS_ABORTED: + result_str = "THe f_mkfs() aborted due to any problem"; + break; + case FR_TIMEOUT: + result_str = "Could not get a grant to access the volume within defined period"; + break; + case FR_LOCKED: + result_str = "The operation is rejected according to the file sharing policy"; + break; + case FR_NOT_ENOUGH_CORE: + result_str = "LFN working buffer could not be allocated"; + break; + case FR_TOO_MANY_OPEN_FILES: + result_str = "Number of open files > FF_FS_LOCK"; + break; + case FR_INVALID_PARAMETER: + result_str = "Given parameter is invalid"; + break; + default: + result_str = "Unknown error"; + break; + } + return result_str; +} + +const char *usbd_mtp_fs_root_path(void) +{ + return driver_num_buf; +} + +const char *usbd_mtp_fs_description(void) +{ + return "CherryUSB MTP"; +} + +int usbd_mtp_mkdir(const char *path) +{ + FRESULT result = f_mkdir(path); + if (result != FR_OK) { + printf("f_mkdir failed, cause: %s\n", show_error_string(result)); + return -1; + } + return 0; // Directory created successfully +} + +int usbd_mtp_rmdir(const char *path) +{ + FRESULT result = f_rmdir(path); + if (result != FR_OK) { + printf("f_mkdir failed, cause: %s\n", show_error_string(result)); + return -1; + } + return 0; // Directory created successfully +} + +MTP_DIR *usbd_mtp_opendir(const char *name) +{ + FRESULT result; + DIR *dir; + + dir = usb_osal_malloc(sizeof(DIR)); + result = f_opendir(dir, name); + if (result != FR_OK) { + printf("f_opendir failed, cause: %s\n", show_error_string(result)); + usb_osal_free(dir); + return NULL; // Failed to open directory + } + return (MTP_DIR *)dir; +} + +int usbd_mtp_closedir(MTP_DIR *dir) +{ + FRESULT result; + result = f_closedir((DIR *)dir); + if (result != FR_OK) { + printf("f_closedir failed, cause: %s\n", show_error_string(result)); + return -1; // Failed to close directory + } + usb_osal_free(dir); // Free the directory structure + return result; +} + +struct mtp_dirent *usbd_mtp_readdir(MTP_DIR *dir) +{ + FILINFO fno; + FRESULT result; + + result = f_readdir((DIR *)dir, &fno); + if (result != FR_OK || fno.fname[0] == 0) + return NULL; + + static struct mtp_dirent dirent; + memset(&dirent, 0, sizeof(struct mtp_dirent)); + strncpy(dirent.d_name, fno.fname, sizeof(dirent.d_name) - 1); + dirent.d_name[sizeof(dirent.d_name) - 1] = '\0'; + dirent.d_namlen = strlen(dirent.d_name); + + return &dirent; +} + +#undef SS +#if FF_MAX_SS == FF_MIN_SS +#define SS(fs) ((UINT)FF_MAX_SS) /* Fixed sector size */ +#else +#define SS(fs) ((fs)->ssize) /* Variable sector size */ +#endif + +int usbd_mtp_stat(const char *path, struct stat *buf) +{ + FILINFO file_info; + FRESULT result; + FATFS *f; + f = &s_sd_disk; + + result = f_stat(path, &file_info); + if (result != FR_OK) { + printf("f_stat failed, cause: %s\n", show_error_string(result)); + return -1; + } + buf->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH | + S_IWUSR | S_IWGRP | S_IWOTH; + if (file_info.fattrib & AM_DIR) { + buf->st_mode &= ~S_IFREG; + buf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; + } + if (file_info.fattrib & AM_RDO) + buf->st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); + + buf->st_size = file_info.fsize; + buf->st_blksize = f->csize * SS(f); + if (file_info.fattrib & AM_ARC) { + buf->st_blocks = file_info.fsize ? ((file_info.fsize - 1) / SS(f) / f->csize + 1) : 0; + buf->st_blocks *= (buf->st_blksize / 512); // man say st_blocks is number of 512B blocks allocated + } else { + buf->st_blocks = f->csize; + } + return 0; +} + +int usbd_mtp_statfs(const char *path, struct mtp_statfs *buf) +{ + FATFS *f; + FRESULT res; + DWORD fre_clust, fre_sect, tot_sect; + + f = &s_sd_disk; + + res = f_getfree(path, &fre_clust, &f); + if (res != FR_OK) { + printf("f_getfree failed, cause: %s\n", show_error_string(res)); + return -1; + } + tot_sect = (f->n_fatent - 2) * f->csize; + fre_sect = fre_clust * f->csize; + + buf->f_blocks = tot_sect; + buf->f_bfree = fre_sect; +#if FF_MAX_SS != FF_MIN_SS + buf->f_bsize = f->ssize; +#else + buf->f_bsize = FF_MIN_SS; +#endif + return 0; +} + +int usbd_mtp_open(const char *path, uint8_t mode) +{ + BYTE flags; + + if (mode == O_RDONLY) { + flags = FA_READ | FA_OPEN_EXISTING; + } else if (mode == O_WRONLY) { + flags = FA_WRITE | FA_OPEN_ALWAYS; + } else if (mode == O_RDWR) { + flags = FA_READ | FA_WRITE | FA_OPEN_ALWAYS; + } else { + return -1; // Invalid mode + } + + FRESULT result = f_open(&s_file, path, flags); + if (result != FR_OK) { + printf("f_open failed, cause: %s\n", show_error_string(result)); + return -1; + } + return 0; +} + +int usbd_mtp_close(int fd) +{ + FRESULT result = f_close(&s_file); + if (result != FR_OK) { + printf("f_close failed, cause: %s\n", show_error_string(result)); + return -1; + } + return 0; +} + +int usbd_mtp_read(int fd, void *buf, size_t len) +{ + UINT bytes_read; + FRESULT result = f_read(&s_file, buf, len, &bytes_read); + if (result != FR_OK) { + printf("f_read failed, cause: %s\n", show_error_string(result)); + return -1; + } + return bytes_read; // Return number of bytes read +} + +int usbd_mtp_write(int fd, const void *buf, size_t len) +{ + UINT bytes_written; + FRESULT result = f_write(&s_file, buf, len, &bytes_written); + if (result != FR_OK) { + printf("f_write failed, cause: %s\n", show_error_string(result)); + return -1; + } + return bytes_written; // Return number of bytes written +} + +int usbd_mtp_unlink(const char *path) +{ + FRESULT result = f_unlink(path); + if (result != FR_OK) { + printf("f_unlink failed, cause: %s\n", show_error_string(result)); + return -1; + } + return 0; // File deleted successfully +} + +void usbd_mtp_mount() +{ + sd_mount_fs(); + + // write a file to test the SD card + sd_write_file(); +} diff --git a/src/lib/CherryUSB/platform/fatfs/usbh_fatfs.c b/src/lib/CherryUSB/platform/fatfs/usbh_fatfs.c new file mode 100644 index 000000000..abb7181bf --- /dev/null +++ b/src/lib/CherryUSB/platform/fatfs/usbh_fatfs.c @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "ff.h" +#include "diskio.h" +#include "usbh_core.h" +#include "usbh_msc.h" + +struct usbh_msc *active_msc_class; + +int USB_disk_initialize(void) +{ + active_msc_class = (struct usbh_msc *)usbh_find_class_instance("/dev/sda"); + if (active_msc_class == NULL) { + printf("do not find /dev/sda\r\n"); + return RES_NOTRDY; + } + if (usbh_msc_scsi_init(active_msc_class) < 0) { + return RES_NOTRDY; + } + return RES_OK; +} + +int USB_disk_status(void) +{ + return RES_OK; +} + +int USB_disk_read(BYTE *buff, LBA_t sector, UINT count) +{ + int ret; + uint8_t *align_buf; + + align_buf = (uint8_t *)buff; + + if ((uint32_t)buff & (CONFIG_USB_ALIGN_SIZE - 1)) { + align_buf = (uint8_t *)aligned_alloc(CONFIG_USB_ALIGN_SIZE, count * active_msc_class->blocksize); + if (!align_buf) { + printf("msc get align buf failed\r\n"); + return -USB_ERR_NOMEM; + } + } + + ret = usbh_msc_scsi_read10(active_msc_class, sector, align_buf, count); + if (ret < 0) { + ret = RES_ERROR; + } else { + ret = RES_OK; + } + + if ((uint32_t)buff & (CONFIG_USB_ALIGN_SIZE - 1)) { + usb_memcpy(buff, align_buf, count * active_msc_class->blocksize); + free(align_buf); + } + + return ret; +} + +int USB_disk_write(const BYTE *buff, LBA_t sector, UINT count) +{ + int ret; + uint8_t *align_buf; + + align_buf = (uint8_t *)buff; + + if ((uint32_t)buff & (CONFIG_USB_ALIGN_SIZE - 1)) { + align_buf = (uint8_t *)aligned_alloc(CONFIG_USB_ALIGN_SIZE, count * active_msc_class->blocksize); + if (!align_buf) { + printf("msc get align buf failed\r\n"); + return -USB_ERR_NOMEM; + } + usb_memcpy(align_buf, buff, count * active_msc_class->blocksize); + } + + ret = usbh_msc_scsi_write10(active_msc_class, sector, align_buf, count); + if (ret < 0) { + ret = RES_ERROR; + } else { + ret = RES_OK; + } + + if ((uint32_t)buff & (CONFIG_USB_ALIGN_SIZE - 1)) { + free(align_buf); + } + + return ret; +} + +int USB_disk_ioctl(BYTE cmd, void *buff) +{ + int result = 0; + + switch (cmd) { + case CTRL_SYNC: + result = RES_OK; + break; + + case GET_SECTOR_SIZE: + *(WORD *)buff = active_msc_class->blocksize; + result = RES_OK; + break; + + case GET_BLOCK_SIZE: + *(DWORD *)buff = 1; + result = RES_OK; + break; + + case GET_SECTOR_COUNT: + *(DWORD *)buff = active_msc_class->blocknum; + result = RES_OK; + break; + + default: + result = RES_PARERR; + break; + } + + return result; +} diff --git a/src/lib/CherryUSB/platform/idf/usbh_fatfs.c b/src/lib/CherryUSB/platform/idf/usbh_fatfs.c new file mode 100644 index 000000000..185aa56b6 --- /dev/null +++ b/src/lib/CherryUSB/platform/idf/usbh_fatfs.c @@ -0,0 +1,296 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include +#include +#include +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_check.h" +#include "diskio_impl.h" +#include "ffconf.h" +#include "ff.h" +#include "esp_vfs_fat.h" + +#include "usbh_core.h" +#include "usbh_msc.h" + +static char *TAG = "MSC"; + +#define DRIVE_STR_LEN 3 + +typedef struct msc_host_vfs { + uint8_t pdrv; + FATFS *fs; + char base_path[0]; +} msc_host_vfs_t; + +static struct usbh_msc *s_mscs[FF_VOLUMES] = { NULL }; + +static DSTATUS usb_disk_initialize(BYTE pdrv) +{ + return RES_OK; +} + +static DSTATUS usb_disk_status(BYTE pdrv) +{ + return RES_OK; +} + +static DRESULT usb_disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count) +{ + struct usbh_msc *msc_class; + assert(pdrv < FF_VOLUMES); + + msc_class = s_mscs[pdrv]; + assert(msc_class); + if (sector >= msc_class->blocknum - count) { + ESP_LOGW(TAG, "%s: sector 0x%"PRIX32" out of range", __FUNCTION__, (uint32_t)sector); + return RES_PARERR; + } + + uint8_t *dma_buff = buff; + size_t len = msc_class->blocksize * count; + + if (((uint32_t)dma_buff & (CONFIG_USB_ALIGN_SIZE - 1)) || (len & (CONFIG_USB_ALIGN_SIZE - 1))) { + dma_buff = heap_caps_aligned_alloc(CONFIG_USB_ALIGN_SIZE, len, MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + if (dma_buff == NULL) { + return RES_ERROR; + } + } + + int ret = usbh_msc_scsi_read10(msc_class, sector, dma_buff, count); + if (dma_buff != buff) { + if (ret == 0) { + memcpy(buff, dma_buff, len); + } + heap_caps_free(dma_buff); + } + if (ret != 0) { + ESP_LOGE(TAG, "usbh_msc_scsi_read10 failed (%d)", ret); + return RES_ERROR; + } + + return RES_OK; +} + +static DRESULT usb_disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count) +{ + struct usbh_msc *msc_class; + assert(pdrv < FF_VOLUMES); + + msc_class = s_mscs[pdrv]; + assert(msc_class); + if (sector >= msc_class->blocknum - count) { + ESP_LOGW(TAG, "%s: sector 0x%"PRIX32" out of range", __FUNCTION__, (uint32_t)sector); + return RES_PARERR; + } + + const uint8_t *dma_buff = buff; + size_t len = msc_class->blocksize * count; + + if (((uint32_t)dma_buff & (CONFIG_USB_ALIGN_SIZE - 1)) || (len & (CONFIG_USB_ALIGN_SIZE - 1))) { + dma_buff = heap_caps_aligned_alloc(CONFIG_USB_ALIGN_SIZE, len, MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + if (dma_buff == NULL) { + return RES_ERROR; + } + memcpy((uint8_t *)dma_buff, buff, len); + } + + int ret = usbh_msc_scsi_write10(msc_class, sector, dma_buff, count); + if (dma_buff != buff) { + heap_caps_free((uint8_t *)dma_buff); + } + if (ret != ESP_OK) { + ESP_LOGE(TAG, "usbh_msc_scsi_write10 failed (%d)", ret); + return RES_ERROR; + } + return RES_OK; +} + +static DRESULT usb_disk_ioctl(BYTE pdrv, BYTE cmd, void *buff) +{ + struct usbh_msc *msc_class; + assert(pdrv < FF_VOLUMES); + + msc_class = s_mscs[pdrv]; + assert(msc_class); + + switch (cmd) { + case CTRL_SYNC: + return RES_OK; + case GET_SECTOR_COUNT: + *((DWORD *) buff) = msc_class->blocknum; + return RES_OK; + case GET_SECTOR_SIZE: + *((WORD *) buff) = msc_class->blocksize; + return RES_OK; + case GET_BLOCK_SIZE: + return RES_ERROR; + } + return RES_ERROR; +} + +void ff_diskio_register_msc(BYTE pdrv, struct usbh_msc *msc_class) +{ + assert(pdrv < FF_VOLUMES); + + static const ff_diskio_impl_t usb_disk_impl = { + .init = &usb_disk_initialize, + .status = &usb_disk_status, + .read = &usb_disk_read, + .write = &usb_disk_write, + .ioctl = &usb_disk_ioctl + }; + s_mscs[pdrv] = msc_class; + ff_diskio_register(pdrv, &usb_disk_impl); +} + +BYTE ff_diskio_get_pdrv_disk(const struct usbh_msc *msc_class) +{ + for (int i = 0; i < FF_VOLUMES; i++) { + if (msc_class == s_mscs[i]) { + return i; + } + } + return 0xff; +} + +static esp_err_t msc_host_format(struct usbh_msc *msc_class, size_t allocation_size) +{ + ESP_RETURN_ON_FALSE((msc_class != NULL && msc_class->user_data != NULL), ESP_ERR_INVALID_ARG, TAG, ""); + void *workbuf = NULL; + const size_t workbuf_size = 4096; + msc_host_vfs_t *vfs = (msc_host_vfs_t *)msc_class->user_data; + + char drive[DRIVE_STR_LEN] = {(char)('0' + vfs->pdrv), ':', 0}; + ESP_RETURN_ON_FALSE((workbuf = ff_memalloc(workbuf_size)), ESP_ERR_NO_MEM, TAG, ""); + + // Valid value of cluster size is between sector_size and 128 * sector_size. + size_t cluster_size = MIN(MAX(allocation_size, msc_class->blocksize), 128 * msc_class->blocksize); + + ESP_LOGW(TAG, "Formatting card, allocation unit size=%d", cluster_size); + f_mount(0, drive, 0); + +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0) + FRESULT err = f_mkfs(drive, FM_ANY | FM_SFD, cluster_size, workbuf, workbuf_size); +#else + const MKFS_PARM opt = {(BYTE)(FM_ANY | FM_SFD), 0, 0, 0, cluster_size}; + FRESULT err = f_mkfs(drive, &opt, workbuf, workbuf_size); +#endif + + free(workbuf); + if (err != FR_OK || (err = f_mount(vfs->fs, drive, 0)) != FR_OK) { + ESP_LOGE(TAG, "Formatting failed with error: %d", err); + return ESP_FAIL; + } + return ESP_OK; +} + +esp_err_t msc_host_vfs_register(struct usbh_msc *msc_class, + const char *base_path, + const esp_vfs_fat_mount_config_t *mount_config) +{ + ESP_RETURN_ON_FALSE((msc_class != NULL && msc_class->user_data == NULL && base_path != NULL && mount_config != NULL), ESP_ERR_INVALID_ARG, TAG, ""); + + FATFS *fs = NULL; + BYTE pdrv; + + if (ff_diskio_get_drive(&pdrv) != ESP_OK) { + ESP_LOGW(TAG, "the maximum count of volumes is already mounted"); + return ESP_ERR_NO_MEM; + } + + esp_err_t ret; + + msc_host_vfs_t *vfs = malloc(sizeof(msc_host_vfs_t) + strlen(base_path) + 1); + ESP_RETURN_ON_FALSE(vfs != NULL, ESP_ERR_NO_MEM, TAG, ""); + + ff_diskio_register_msc(pdrv, msc_class); + char drive[DRIVE_STR_LEN] = {(char)('0' + pdrv), ':', 0}; + strcpy(vfs->base_path, base_path); + vfs->pdrv = pdrv; + + ret = esp_vfs_fat_register(base_path, drive, mount_config->max_files, &fs); + ESP_GOTO_ON_ERROR(ret, fail, TAG, "Failed to register filesystem, error=%s", esp_err_to_name(ret)); + vfs->fs = fs; + + msc_class->user_data = vfs; + if (f_mount(fs, drive, 1) != FR_OK) { + if ((!mount_config->format_if_mount_failed) || msc_host_format(msc_class, mount_config->allocation_unit_size) != ESP_OK) { + ret = ESP_FAIL; + goto fail; + } + } + return ESP_OK; + +fail: + msc_class->user_data = NULL; + if (fs) { + f_mount(NULL, drive, 0); + } + esp_vfs_fat_unregister_path(base_path); + ff_diskio_unregister(pdrv); + s_mscs[pdrv] = NULL; + return ret; +} + +esp_err_t msc_host_vfs_unregister(struct usbh_msc *msc_class) +{ + ESP_RETURN_ON_FALSE((msc_class != NULL && ff_diskio_get_pdrv_disk(msc_class) != 0XFF), ESP_ERR_INVALID_ARG, TAG, ""); + msc_host_vfs_t *vfs = (msc_host_vfs_t *)msc_class->user_data; + msc_class->user_data = NULL; + + char drive[DRIVE_STR_LEN] = {(char)('0' + vfs->pdrv), ':', 0}; + f_mount(NULL, drive, 0); + ff_diskio_unregister(vfs->pdrv); + s_mscs[vfs->pdrv] = NULL; + esp_vfs_fat_unregister_path(vfs->base_path); + heap_caps_free(vfs); + return ESP_OK; +} + +static void usbh_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + struct usbh_msc *msc_class = (struct usbh_msc *)CONFIG_USB_OSAL_THREAD_GET_ARGV; + int ret; + + ret = usbh_msc_scsi_init(msc_class); + if (ret < 0) { + ESP_LOGE(TAG, "scsi_init error,ret:%d", ret); + return; + } + + esp_vfs_fat_sdmmc_mount_config_t mount_config = { +#ifdef CONFIG_EXAMPLE_FORMAT_IF_MOUNT_FAILED + .format_if_mount_failed = true, +#else + .format_if_mount_failed = false, +#endif // EXAMPLE_FORMAT_IF_MOUNT_FAILED + .max_files = 5, + .allocation_unit_size = 4 * 1024 + }; + ESP_LOGI(TAG, "Mounting msc host filesystem"); + + if (msc_host_vfs_register(msc_class, "/usb", &mount_config) != ESP_OK) { + ESP_LOGE(TAG, "msc_host_vfs_register fail"); + return; + } + ESP_LOGI(TAG, "MSC host filesystem mounted"); + + usb_osal_thread_delete(NULL); +} + +void usbh_msc_run(struct usbh_msc *msc_class) +{ + usb_osal_thread_create("usbh_msc", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_msc_thread, msc_class); +} + +void usbh_msc_stop(struct usbh_msc *msc_class) +{ + msc_host_vfs_unregister(msc_class); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/idf/usbh_net.c b/src/lib/CherryUSB/platform/idf/usbh_net.c new file mode 100644 index 000000000..b4febf761 --- /dev/null +++ b/src/lib/CherryUSB/platform/idf/usbh_net.c @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2025, Loogg + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "lwip/netif.h" +#include "esp_log.h" +#include "esp_event.h" +#include "esp_check.h" +#include "esp_netif.h" +#include "usbh_core.h" + +#if TCPIP_THREAD_STACKSIZE < 1024 +#error TCPIP_THREAD_STACKSIZE must be >= 1024 +#endif + +// #define CONFIG_USBHOST_PLATFORM_CDC_ECM +// #define CONFIG_USBHOST_PLATFORM_CDC_RNDIS +// #define CONFIG_USBHOST_PLATFORM_CDC_NCM +// #define CONFIG_USBHOST_PLATFORM_ASIX +// #define CONFIG_USBHOST_PLATFORM_RTL8152 + +struct usbh_net_netif_glue { + esp_netif_driver_base_t base; + esp_event_handler_instance_t ins_got_ip; + void *usbh_class; + esp_err_t (*transmit)(void *h, void *buffer, size_t len); +}; + +static void usbh_net_input_common(struct usbh_net_netif_glue *netif_glue, uint8_t *buf, uint32_t len) +{ + uint8_t *input_buf = buf; + +#if !LWIP_TCPIP_CORE_LOCKING_INPUT + input_buf = usb_osal_malloc(len); + if (input_buf == NULL) { + USB_LOG_ERR("No memory to alloc input buffer\r\n"); + return; + } + usb_memcpy(input_buf, buf, len); +#endif + + esp_netif_receive(netif_glue->base.netif, input_buf, len, NULL); +} + +static void usbh_net_free(void *h, void *buffer) +{ +#if !LWIP_TCPIP_CORE_LOCKING_INPUT + usb_osal_free(buffer); +#endif +} + +static esp_err_t usbh_net_post_attach(esp_netif_t *esp_netif, void *args) +{ + struct usbh_net_netif_glue *netif_glue = (struct usbh_net_netif_glue *)args; + + netif_glue->base.netif = esp_netif; + + // set driver related config to esp-netif + esp_netif_driver_ifconfig_t driver_ifconfig = { + .handle = netif_glue, + .transmit = netif_glue->transmit, + .driver_free_rx_buffer = usbh_net_free, + }; + + ESP_ERROR_CHECK(esp_netif_set_driver_config(esp_netif, &driver_ifconfig)); + + return ESP_OK; +} + +static void usbh_net_action_got_ip(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + struct usbh_net_netif_glue *netif_glue = (struct usbh_net_netif_glue *)handler_args; + ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data; + const esp_netif_ip_info_t *ip_info = &event->ip_info; + USB_LOG_INFO("NETIF %s Got IP Address\r\n", esp_netif_get_ifkey(netif_glue->base.netif)); + USB_LOG_INFO("IP:" IPSTR "\r\n", IP2STR(&ip_info->ip)); + USB_LOG_INFO("MASK:" IPSTR "\r\n", IP2STR(&ip_info->netmask)); + USB_LOG_INFO("GW:" IPSTR "\r\n\r\n", IP2STR(&ip_info->gw)); +} + +static esp_err_t usbh_net_netif_glue_init_common(struct usbh_net_netif_glue *netif_glue, void *usbh_class, esp_err_t (*transmit)(void *h, void *buffer, size_t len)) +{ + netif_glue->usbh_class = usbh_class; + netif_glue->transmit = transmit; + netif_glue->base.post_attach = usbh_net_post_attach; + + return esp_event_handler_instance_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, usbh_net_action_got_ip, netif_glue, &netif_glue->ins_got_ip); +} + +static esp_err_t usbh_net_netif_glue_deinit_common(struct usbh_net_netif_glue *netif_glue) +{ + return esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_ETH_GOT_IP, netif_glue->ins_got_ip); +} + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_ECM +#include "usbh_cdc_ecm.h" + +struct usbh_net_netif_glue g_cdc_ecm_netif_glue; + +static esp_err_t usbh_cdc_ecm_transmit(void *h, void *buffer, size_t len) +{ + int ret; + (void)h; + + usb_memcpy(usbh_cdc_ecm_get_eth_txbuf(), buffer, len); + ret = usbh_cdc_ecm_eth_output(len); + if (ret < 0) { + return ESP_FAIL; + } + + return ESP_OK; +} + +void usbh_cdc_ecm_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_net_input_common(&g_cdc_ecm_netif_glue, buf, buflen); +} + +void usbh_cdc_ecm_run(struct usbh_cdc_ecm *cdc_ecm_class) +{ + memset(&g_cdc_ecm_netif_glue, 0, sizeof(struct usbh_net_netif_glue)); + + esp_netif_inherent_config_t base_cfg = ESP_NETIF_INHERENT_DEFAULT_ETH(); + base_cfg.if_key = "u0"; + base_cfg.if_desc = "usbh cdc ecm"; + + esp_netif_config_t netif_cfg = ESP_NETIF_DEFAULT_ETH(); + netif_cfg.base = &base_cfg; + esp_netif_t *esp_netif = esp_netif_new(&netif_cfg); + + usbh_net_netif_glue_init_common(&g_cdc_ecm_netif_glue, cdc_ecm_class, usbh_cdc_ecm_transmit); + esp_netif_attach(esp_netif, &g_cdc_ecm_netif_glue.base); + + esp_netif_set_mac(esp_netif, cdc_ecm_class->mac); + + esp_netif_action_start(esp_netif, NULL, 0, NULL); + esp_netif_action_connected(esp_netif, NULL, 0, NULL); + + usb_osal_thread_create("usbh_cdc_ecm_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_cdc_ecm_rx_thread, NULL); +} + +void usbh_cdc_ecm_stop(struct usbh_cdc_ecm *cdc_ecm_class) +{ + (void)cdc_ecm_class; + + usbh_net_netif_glue_deinit_common(&g_cdc_ecm_netif_glue); + esp_netif_action_stop(g_cdc_ecm_netif_glue.base.netif, NULL, 0, NULL); + esp_netif_destroy(g_cdc_ecm_netif_glue.base.netif); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_RNDIS +#include "usbh_rndis.h" + +struct usb_osal_timer *timer_handle; + +static void rndis_dev_keepalive_timeout(void *arg) +{ + struct usbh_rndis *rndis_class = (struct usbh_rndis *)arg; + usbh_rndis_keepalive(rndis_class); +} + +void timer_init(struct usbh_rndis *rndis_class) +{ + timer_handle = usb_osal_timer_create("rndis_keepalive", 5000, rndis_dev_keepalive_timeout, rndis_class, true); + if (NULL != timer_handle) { + usb_osal_timer_start(timer_handle); + } else { + USB_LOG_ERR("timer creation failed! \r\n"); + for (;;) { + ; + } + } +} + +struct usbh_net_netif_glue g_rndis_netif_glue; + +static esp_err_t usbh_rndis_transmit(void *h, void *buffer, size_t len) +{ + int ret; + (void)h; + + usb_memcpy(usbh_rndis_get_eth_txbuf(), buffer, len); + ret = usbh_rndis_eth_output(len); + if (ret < 0) { + return ESP_FAIL; + } + + return ESP_OK; +} + +void usbh_rndis_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_net_input_common(&g_rndis_netif_glue, buf, buflen); +} + +void usbh_rndis_run(struct usbh_rndis *rndis_class) +{ + memset(&g_rndis_netif_glue, 0, sizeof(struct usbh_net_netif_glue)); + + esp_netif_inherent_config_t base_cfg = ESP_NETIF_INHERENT_DEFAULT_ETH(); + base_cfg.if_key = "u2"; + base_cfg.if_desc = "usbh rndis"; + + esp_netif_config_t netif_cfg = ESP_NETIF_DEFAULT_ETH(); + netif_cfg.base = &base_cfg; + esp_netif_t *esp_netif = esp_netif_new(&netif_cfg); + + usbh_net_netif_glue_init_common(&g_rndis_netif_glue, rndis_class, usbh_rndis_transmit); + esp_netif_attach(esp_netif, &g_rndis_netif_glue.base); + + esp_netif_set_mac(esp_netif, rndis_class->mac); + + esp_netif_action_start(esp_netif, NULL, 0, NULL); + esp_netif_action_connected(esp_netif, NULL, 0, NULL); + + usb_osal_thread_create("usbh_rndis_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_rndis_rx_thread, NULL); + + //timer_init(rndis_class); +} + +void usbh_rndis_stop(struct usbh_rndis *rndis_class) +{ + (void)rndis_class; + + usbh_net_netif_glue_deinit_common(&g_rndis_netif_glue); + esp_netif_action_stop(g_rndis_netif_glue.base.netif, NULL, 0, NULL); + esp_netif_destroy(g_rndis_netif_glue.base.netif); + + // xTimerStop(timer_handle, 0); + // xTimerDelete(timer_handle, 0); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_NCM +#include "usbh_cdc_ncm.h" + +struct usbh_net_netif_glue g_cdc_ncm_netif_glue; + +static esp_err_t usbh_cdc_ncm_transmit(void *h, void *buffer, size_t len) +{ + int ret; + (void)h; + + usb_memcpy(usbh_cdc_ncm_get_eth_txbuf(), buffer, len); + ret = usbh_cdc_ncm_eth_output(len); + if (ret < 0) { + return ESP_FAIL; + } + + return ESP_OK; +} + +void usbh_cdc_ncm_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_net_input_common(&g_cdc_ncm_netif_glue, buf, buflen); +} + +void usbh_cdc_ncm_run(struct usbh_cdc_ncm *cdc_ncm_class) +{ + memset(&g_cdc_ncm_netif_glue, 0, sizeof(struct usbh_net_netif_glue)); + + esp_netif_inherent_config_t base_cfg = ESP_NETIF_INHERENT_DEFAULT_ETH(); + base_cfg.if_key = "u1"; + base_cfg.if_desc = "usbh cdc ncm"; + + esp_netif_config_t netif_cfg = ESP_NETIF_DEFAULT_ETH(); + netif_cfg.base = &base_cfg; + esp_netif_t *esp_netif = esp_netif_new(&netif_cfg); + + usbh_net_netif_glue_init_common(&g_cdc_ncm_netif_glue, cdc_ncm_class, usbh_cdc_ncm_transmit); + esp_netif_attach(esp_netif, &g_cdc_ncm_netif_glue.base); + + esp_netif_set_mac(esp_netif, cdc_ncm_class->mac); + + esp_netif_action_start(esp_netif, NULL, 0, NULL); + esp_netif_action_connected(esp_netif, NULL, 0, NULL); + + usb_osal_thread_create("usbh_cdc_ncm_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_cdc_ncm_rx_thread, NULL); +} + +void usbh_cdc_ncm_stop(struct usbh_cdc_ncm *cdc_ncm_class) +{ + (void)cdc_ncm_class; + + usbh_net_netif_glue_deinit_common(&g_cdc_ncm_netif_glue); + esp_netif_action_stop(g_cdc_ncm_netif_glue.base.netif, NULL, 0, NULL); + esp_netif_destroy(g_cdc_ncm_netif_glue.base.netif); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_ASIX +#include "usbh_asix.h" + +struct usbh_net_netif_glue g_asix_netif_glue; + +static esp_err_t usbh_asix_transmit(void *h, void *buffer, size_t len) +{ + int ret; + (void)h; + + usb_memcpy(usbh_asix_get_eth_txbuf(), buffer, len); + ret = usbh_asix_eth_output(len); + if (ret < 0) { + return ESP_FAIL; + } + + return ESP_OK; +} + +void usbh_asix_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_net_input_common(&g_asix_netif_glue, buf, buflen); +} + +void usbh_asix_run(struct usbh_asix *asix_class) +{ + memset(&g_asix_netif_glue, 0, sizeof(struct usbh_net_netif_glue)); + + esp_netif_inherent_config_t base_cfg = ESP_NETIF_INHERENT_DEFAULT_ETH(); + base_cfg.if_key = "u3"; + base_cfg.if_desc = "usbh asix"; + + esp_netif_config_t netif_cfg = ESP_NETIF_DEFAULT_ETH(); + netif_cfg.base = &base_cfg; + esp_netif_t *esp_netif = esp_netif_new(&netif_cfg); + + usbh_net_netif_glue_init_common(&g_asix_netif_glue, asix_class, usbh_asix_transmit); + esp_netif_attach(esp_netif, &g_asix_netif_glue.base); + + esp_netif_set_mac(esp_netif, asix_class->mac); + + esp_netif_action_start(esp_netif, NULL, 0, NULL); + esp_netif_action_connected(esp_netif, NULL, 0, NULL); + + usb_osal_thread_create("usbh_asix_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_asix_rx_thread, NULL); +} + +void usbh_asix_stop(struct usbh_asix *asix_class) +{ + (void)asix_class; + + usbh_net_netif_glue_deinit_common(&g_asix_netif_glue); + esp_netif_action_stop(g_asix_netif_glue.base.netif, NULL, 0, NULL); + esp_netif_destroy(g_asix_netif_glue.base.netif); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_RTL8152 +#include "usbh_rtl8152.h" + +struct usbh_net_netif_glue g_rtl8152_netif_glue; + +static esp_err_t usbh_rtl8152_transmit(void *h, void *buffer, size_t len) +{ + int ret; + (void)h; + + usb_memcpy(usbh_rtl8152_get_eth_txbuf(), buffer, len); + ret = usbh_rtl8152_eth_output(len); + if (ret < 0) { + return ESP_FAIL; + } + + return ESP_OK; +} + +void usbh_rtl8152_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_net_input_common(&g_rtl8152_netif_glue, buf, buflen); +} + +void usbh_rtl8152_run(struct usbh_rtl8152 *rtl8152_class) +{ + memset(&g_rtl8152_netif_glue, 0, sizeof(struct usbh_net_netif_glue)); + + esp_netif_inherent_config_t base_cfg = ESP_NETIF_INHERENT_DEFAULT_ETH(); + base_cfg.if_key = "u4"; + base_cfg.if_desc = "usbh rtl8152"; + + esp_netif_config_t netif_cfg = ESP_NETIF_DEFAULT_ETH(); + netif_cfg.base = &base_cfg; + esp_netif_t *esp_netif = esp_netif_new(&netif_cfg); + + usbh_net_netif_glue_init_common(&g_rtl8152_netif_glue, rtl8152_class, usbh_rtl8152_transmit); + esp_netif_attach(esp_netif, &g_rtl8152_netif_glue.base); + + esp_netif_set_mac(esp_netif, rtl8152_class->mac); + + esp_netif_action_start(esp_netif, NULL, 0, NULL); + esp_netif_action_connected(esp_netif, NULL, 0, NULL); + + usb_osal_thread_create("usbh_rtl8152_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_rtl8152_rx_thread, NULL); +} + +void usbh_rtl8152_stop(struct usbh_rtl8152 *rtl8152_class) +{ + (void)rtl8152_class; + + usbh_net_netif_glue_deinit_common(&g_rtl8152_netif_glue); + esp_netif_action_stop(g_rtl8152_netif_glue.base.netif, NULL, 0, NULL); + esp_netif_destroy(g_rtl8152_netif_glue.base.netif); +} +#endif diff --git a/src/lib/CherryUSB/platform/lvgl/image_cursor.c b/src/lib/CherryUSB/platform/lvgl/image_cursor.c new file mode 100644 index 000000000..205930efe --- /dev/null +++ b/src/lib/CherryUSB/platform/lvgl/image_cursor.c @@ -0,0 +1,172 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * Copyright (c) 2025 RCSN + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifdef __has_include +#if __has_include("lvgl.h") +#ifndef LV_LVGL_H_INCLUDE_SIMPLE +#define LV_LVGL_H_INCLUDE_SIMPLE +#endif +#endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_DUST +#define LV_ATTRIBUTE_IMG_DUST +#endif + +#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9) +static const +LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_DUST +uint8_t img_cursor_20px_map[] = { + + 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0xfc, 0x5b, 0x5b, 0x5b, 0xf1, 0x93, 0x93, 0x93, 0xfc, 0x41, 0x41, 0x41, 0xf9, 0x1e, 0x1e, 0x1e, 0xfe, 0x06, 0x06, 0x06, 0xf4, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0xe4, 0x93, 0x93, 0x93, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xe3, 0xe3, 0xf9, 0xc8, 0xc8, 0xc8, 0xfe, 0x6c, 0x6c, 0x6c, 0xf3, 0x20, 0x20, 0x20, 0xfe, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xae, 0x41, 0x41, 0x41, 0xf9, 0xe3, 0xe3, 0xe3, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfa, 0xac, 0xac, 0xac, 0xf0, 0x6f, 0x6f, 0x6f, 0xfb, 0x26, 0x26, 0x26, 0xf9, 0x0f, 0x0f, 0x0f, 0xff, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x1e, 0x1e, 0x1e, 0xfe, 0xc8, 0xc8, 0xc8, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfb, 0xd4, 0xd4, 0xd4, 0xf9, 0xae, 0xae, 0xae, 0xf6, 0x48, 0x48, 0x48, 0xf5, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x06, 0x06, 0x06, 0xf4, 0x6c, 0x6c, 0x6c, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf2, 0xf2, 0xf5, 0x7e, 0x7e, 0x7e, 0xf5, 0x12, 0x12, 0x12, 0xfd, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x20, 0x20, 0x20, 0xfe, 0xfb, 0xfb, 0xfb, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xef, 0xf4, 0x73, 0x73, 0x73, 0xfc, 0x12, 0x12, 0x12, 0xfd, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0xf8, 0xac, 0xac, 0xac, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xc8, 0xc8, 0xf9, 0x2e, 0x2e, 0x2e, 0xfd, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xd7, 0x6f, 0x6f, 0x6f, 0xfb, 0xfc, 0xfc, 0xfc, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xc8, 0xc8, 0xf9, 0x2e, 0x2e, 0x2e, 0xfd, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x9c, 0x26, 0x26, 0x26, 0xf9, 0xd4, 0xd4, 0xd4, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0xca, 0xca, 0xfa, 0x2b, 0x2b, 0x2b, 0xfc, 0x03, 0x03, 0x03, 0xdd, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x0f, 0x0f, 0x0f, 0xff, 0xae, 0xae, 0xae, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xb0, 0xb0, 0xfa, 0x2b, 0x2b, 0x2b, 0xfc, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xe8, 0x48, 0x48, 0x48, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xc8, 0xc8, 0xf9, 0xc8, 0xc8, 0xc8, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0xca, 0xca, 0xfa, 0x2b, 0x2b, 0x2b, 0xfd, 0x03, 0x03, 0x03, 0xdd, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x1f, 0x1f, 0x1f, 0xff, 0xf2, 0xf2, 0xf2, 0xf5, 0xf0, 0xf0, 0xf0, 0xf4, 0x2e, 0x2e, 0x2e, 0xfd, 0x2e, 0x2e, 0x2e, 0xfd, 0xca, 0xca, 0xca, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xb0, 0xb0, 0xfa, 0x2b, 0x2b, 0x2b, 0xfc, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x2c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0xf0, 0x7e, 0x7e, 0x7e, 0xf5, 0x73, 0x73, 0x73, 0xfc, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xdd, 0x2b, 0x2b, 0x2b, 0xfc, 0xb0, 0xb0, 0xb0, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xb1, 0xb1, 0xef, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xd7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xcb, 0x12, 0x12, 0x12, 0xfd, 0x12, 0x12, 0x12, 0xfd, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x37, 0x03, 0x03, 0x03, 0xdd, 0x2b, 0x2b, 0x2b, 0xfd, 0xca, 0xca, 0xca, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0x86, 0x86, 0x86, 0xf2, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xb6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xc2, 0x2b, 0x2b, 0x2b, 0xfc, 0xb0, 0xb0, 0xb0, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0x74, 0x74, 0x74, 0xf8, 0x06, 0x06, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x03, 0x03, 0x03, 0xdd, 0x2b, 0x2b, 0x2b, 0xfc, 0xb1, 0xb1, 0xb1, 0xef, 0x86, 0x86, 0x86, 0xf2, 0x06, 0x06, 0x06, 0xfe, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + +}; + +const lv_img_dsc_t img_cursor = { + .header.magic = LV_IMAGE_HEADER_MAGIC, + .header.cf = LV_COLOR_FORMAT_ARGB8888, + .header.flags = 0, + .header.w = 20, + .header.h = 20, + .header.stride = 80, + .data_size = 1600, + .data = img_cursor_20px_map, +}; +#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8) +const uint8_t mouse_cursor_icon_map[] = { +#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8 + /*Pixel format: Alpha 8 bit, Red: 3 bit, Green: 3 bit, Blue: 2 bit*/ + 0x24, 0xb8, 0x24, 0xc8, 0x00, 0x13, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xcc, 0xdb, 0xff, 0x49, 0xcc, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xc8, 0xff, 0xff, 0xff, 0xff, 0x49, 0xe0, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xcb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x6d, 0xf3, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0xff, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0xff, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff, 0x24, 0xab, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x24, 0xbb, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x49, 0xd8, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xef, 0x00, 0x4f, 0x00, 0x00, + 0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0xff, 0x00, 0x6b, + 0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x92, 0xf7, 0x92, 0xf8, 0x6e, 0xfb, 0x92, 0xf8, 0x6d, 0xff, 0x00, 0xb3, + 0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x24, 0xb7, 0x00, 0x1b, 0x00, 0x14, 0x00, 0x13, 0x00, 0x0c, 0x25, 0x07, + 0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0xf0, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0x49, 0xd8, 0x00, 0x78, 0x92, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0xd3, 0xff, 0xff, 0x6d, 0xef, 0x00, 0x34, 0x00, 0x00, 0x49, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xdc, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x49, 0xe0, 0x6d, 0xff, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff, 0x00, 0x78, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x68, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x49, 0xd0, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x6d, 0xd8, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xb7, 0xff, 0xff, 0xff, 0x92, 0xff, 0x49, 0xac, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x25, 0xd7, 0x49, 0xc7, 0x00, 0x47, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +#endif +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0 + /*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit*/ + 0xc3, 0x18, 0xb8, 0xe4, 0x20, 0xc8, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x4a, 0xcc, 0x96, 0xb5, 0xff, 0xc7, 0x39, 0xcc, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x39, 0xc8, 0xbf, 0xff, 0xff, 0xfb, 0xde, 0xff, 0x28, 0x42, 0xe0, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x39, 0xcb, 0x3d, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x3d, 0xef, 0xff, 0xcb, 0x5a, 0xf3, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x39, 0xcb, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x8e, 0x73, 0xff, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x41, 0xcb, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0x8c, 0xff, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x9c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x41, 0xcb, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0xa5, 0xff, 0xa2, 0x10, 0xab, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x42, 0xcb, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xbd, 0xff, 0x04, 0x21, 0xbb, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x42, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0xff, 0xe8, 0x41, 0xd8, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x42, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe6, 0xff, 0xab, 0x5a, 0xef, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, + 0x08, 0x42, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0xff, 0xaf, 0x7b, 0xff, 0x00, 0x00, 0x6b, + 0x28, 0x42, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xd6, 0xff, 0x10, 0x84, 0xf7, 0xae, 0x73, 0xf8, 0x6e, 0x73, 0xfb, 0x8e, 0x73, 0xf8, 0xcb, 0x5a, 0xff, 0x61, 0x08, 0xb3, + 0x28, 0x42, 0xcc, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0xff, 0xa2, 0x10, 0xb7, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x14, 0x00, 0x00, 0x13, 0x00, 0x00, 0x0c, 0x45, 0x29, 0x07, + 0x29, 0x4a, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0xff, 0xec, 0x62, 0xff, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x63, 0xf0, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x29, 0x4a, 0xcc, 0xdf, 0xff, 0xff, 0x7d, 0xef, 0xff, 0x49, 0x4a, 0xd8, 0x00, 0x00, 0x78, 0x51, 0x8c, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x38, 0xc6, 0xff, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xcb, 0x5a, 0xd3, 0xdb, 0xde, 0xff, 0xec, 0x62, 0xef, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xc7, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0xff, 0xaa, 0x52, 0xdc, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xe8, 0x41, 0xe0, 0xaa, 0x52, 0xff, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x72, 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0xb5, 0xff, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x61, 0x08, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x68, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x69, 0x4a, 0xd0, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xfc, 0xbe, 0xf7, 0xff, 0xaa, 0x52, 0xd8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x75, 0xad, 0xff, 0xbf, 0xff, 0xff, 0x10, 0x84, 0xff, 0x86, 0x31, 0xac, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x08, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x66, 0x31, 0xd7, 0xc7, 0x39, 0xc7, 0x00, 0x00, 0x47, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +#endif +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0 + /*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 color bytes are swapped*/ + 0x18, 0xc3, 0xb8, 0x20, 0xe4, 0xc8, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x49, 0xcc, 0xb5, 0x96, 0xff, 0x39, 0xc7, 0xcc, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x39, 0xe7, 0xc8, 0xff, 0xbf, 0xff, 0xde, 0xfb, 0xff, 0x42, 0x28, 0xe0, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x39, 0xe7, 0xcb, 0xef, 0x3d, 0xff, 0xff, 0xff, 0xfc, 0xef, 0x3d, 0xff, 0x5a, 0xcb, 0xf3, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x39, 0xe7, 0xcb, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x73, 0x8e, 0xff, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0xe8, 0xcb, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8c, 0x51, 0xff, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0xd3, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0xe8, 0xcb, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x14, 0xff, 0x10, 0xa2, 0xab, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x08, 0xcb, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xd7, 0xff, 0x21, 0x04, 0xbb, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x08, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x59, 0xff, 0x41, 0xe8, 0xd8, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x08, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xfc, 0xff, 0x5a, 0xab, 0xef, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, + 0x42, 0x08, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbe, 0xff, 0x7b, 0xaf, 0xff, 0x00, 0x00, 0x6b, + 0x42, 0x28, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x7a, 0xff, 0x84, 0x10, 0xf7, 0x73, 0xae, 0xf8, 0x73, 0x6e, 0xfb, 0x73, 0x8e, 0xf8, 0x5a, 0xcb, 0xff, 0x08, 0x61, 0xb3, + 0x42, 0x28, 0xcc, 0xef, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x59, 0xff, 0x10, 0xa2, 0xb7, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x14, 0x00, 0x00, 0x13, 0x00, 0x00, 0x0c, 0x29, 0x45, 0x07, + 0x4a, 0x29, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xde, 0xdb, 0xff, 0x62, 0xec, 0xff, 0xe7, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0x0c, 0xf0, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x29, 0xcc, 0xff, 0xdf, 0xff, 0xef, 0x7d, 0xff, 0x4a, 0x49, 0xd8, 0x00, 0x00, 0x78, 0x8c, 0x51, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x38, 0xff, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5a, 0xcb, 0xd3, 0xde, 0xdb, 0xff, 0x62, 0xec, 0xef, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x39, 0xe7, 0xc7, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbe, 0xff, 0x52, 0xaa, 0xdc, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x41, 0xe8, 0xe0, 0x52, 0xaa, 0xff, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x94, 0x72, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x96, 0xff, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x08, 0x61, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x68, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x4a, 0x69, 0xd0, 0xef, 0x7d, 0xff, 0xff, 0xff, 0xfc, 0xf7, 0xbe, 0xff, 0x52, 0xaa, 0xd8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe4, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xad, 0x75, 0xff, 0xff, 0xbf, 0xff, 0x84, 0x10, 0xff, 0x31, 0x86, 0xac, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x41, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x31, 0x66, 0xd7, 0x39, 0xc7, 0xc7, 0x00, 0x00, 0x47, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +#endif +#if LV_COLOR_DEPTH == 32 + 0x19, 0x19, 0x19, 0xb8, 0x1e, 0x1e, 0x1e, 0xc8, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x48, 0x48, 0xcc, 0xb2, 0xb2, 0xb2, 0xff, 0x3a, 0x3a, 0x3a, 0xcc, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3b, 0x3b, 0x3b, 0xc8, 0xf6, 0xf6, 0xf6, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0x43, 0x43, 0x43, 0xe0, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3b, 0x3b, 0x3b, 0xcb, 0xe6, 0xe6, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe5, 0xe5, 0xe5, 0xff, 0x59, 0x59, 0x59, 0xf3, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x3c, 0x3c, 0xcb, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf5, 0xf5, 0xff, 0x72, 0x72, 0x72, 0xff, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3d, 0x3d, 0x3d, 0xcb, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0x8a, 0x8a, 0xff, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x3e, 0x3e, 0xcb, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0xa2, 0xa2, 0xff, 0x13, 0x13, 0x13, 0xab, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x3f, 0x3f, 0xcb, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xb7, 0xb7, 0xff, 0x1f, 0x1f, 0x1f, 0xbb, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x41, 0x41, 0xcc, 0xea, 0xea, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0xca, 0xca, 0xff, 0x3d, 0x3d, 0x3d, 0xd8, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x41, 0x41, 0xcc, 0xea, 0xea, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xde, 0xde, 0xde, 0xff, 0x56, 0x56, 0x56, 0xef, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x42, 0x42, 0xcc, 0xea, 0xea, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf3, 0xf3, 0xff, 0x76, 0x76, 0x76, 0xff, 0x00, 0x00, 0x00, 0x6b, + 0x43, 0x43, 0x43, 0xcc, 0xea, 0xea, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xce, 0xce, 0xff, 0x80, 0x80, 0x80, 0xf7, 0x74, 0x74, 0x74, 0xf8, 0x6d, 0x6d, 0x6d, 0xfb, 0x72, 0x72, 0x72, 0xf8, 0x57, 0x57, 0x57, 0xff, 0x0c, 0x0c, 0x0c, 0xb3, + 0x44, 0x44, 0x44, 0xcc, 0xeb, 0xeb, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xfb, 0xfb, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x13, 0x13, 0x13, 0xb7, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x29, 0x29, 0x29, 0x07, + 0x45, 0x45, 0x45, 0xcc, 0xe8, 0xe8, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0xd9, 0xd9, 0xff, 0x5e, 0x5e, 0x5e, 0xff, 0xe2, 0xe2, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x62, 0x62, 0x62, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x45, 0x45, 0x45, 0xcc, 0xf9, 0xf9, 0xf9, 0xff, 0xec, 0xec, 0xec, 0xff, 0x4a, 0x4a, 0x4a, 0xd8, 0x00, 0x00, 0x00, 0x78, 0x8a, 0x8a, 0x8a, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xc3, 0xc3, 0xff, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x58, 0x58, 0xd3, 0xd9, 0xd9, 0xd9, 0xff, 0x5e, 0x5e, 0x5e, 0xef, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x3b, 0x3b, 0xc7, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf4, 0xf4, 0xff, 0x54, 0x54, 0x54, 0xdc, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x3e, 0x3e, 0xe0, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x8e, 0x8e, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xb0, 0xb0, 0xff, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x4c, 0x4c, 0x4c, 0xd0, 0xec, 0xec, 0xec, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf4, 0xf4, 0xf4, 0xff, 0x53, 0x53, 0x53, 0xd8, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1e, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xab, 0xab, 0xab, 0xff, 0xf6, 0xf6, 0xf6, 0xff, 0x80, 0x80, 0x80, 0xff, 0x31, 0x31, 0x31, 0xac, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x09, 0x09, 0x03, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x2e, 0x2e, 0x2e, 0xd7, 0x38, 0x38, 0x38, 0xc7, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +#endif +}; + +const lv_img_dsc_t img_cursor = { + .header.always_zero = 0, + .header.w = 14, + .header.h = 20, + .data_size = 280 * LV_IMG_PX_SIZE_ALPHA_BYTE, + .header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA, + .data = mouse_cursor_icon_map, +}; +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/lvgl/usbh_hid_lvgl.c b/src/lib/CherryUSB/platform/lvgl/usbh_hid_lvgl.c new file mode 100644 index 000000000..958dbd44f --- /dev/null +++ b/src/lib/CherryUSB/platform/lvgl/usbh_hid_lvgl.c @@ -0,0 +1,455 @@ +/* + * Copyright (c) 2025, sakumisu + * Copyright (c) 2025, RCSN + * + * SPDX-License-Identifier: Apache-2.0 + */ + +//Refer to https://github.com/espressif/esp-bsp/blob/master/components/esp_lvgl_port/src/lvgl9/esp_lvgl_port_usbhid.c + +#include "usbh_core.h" +#include "usbh_hid.h" +#include "usbh_hid_lvgl.h" + +/* LVGL image of cursor */ +LV_IMG_DECLARE(img_cursor) + +const uint8_t keycode2ascii[57][2] = { + {0, 0}, /* HID_KEY_NO_PRESS */ + {0, 0}, /* HID_KEY_ROLLOVER */ + {0, 0}, /* HID_KEY_POST_FAIL */ + {0, 0}, /* HID_KEY_ERROR_UNDEFINED */ + {'a', 'A'}, /* HID_KEY_A */ + {'b', 'B'}, /* HID_KEY_B */ + {'c', 'C'}, /* HID_KEY_C */ + {'d', 'D'}, /* HID_KEY_D */ + {'e', 'E'}, /* HID_KEY_E */ + {'f', 'F'}, /* HID_KEY_F */ + {'g', 'G'}, /* HID_KEY_G */ + {'h', 'H'}, /* HID_KEY_H */ + {'i', 'I'}, /* HID_KEY_I */ + {'j', 'J'}, /* HID_KEY_J */ + {'k', 'K'}, /* HID_KEY_K */ + {'l', 'L'}, /* HID_KEY_L */ + {'m', 'M'}, /* HID_KEY_M */ + {'n', 'N'}, /* HID_KEY_N */ + {'o', 'O'}, /* HID_KEY_O */ + {'p', 'P'}, /* HID_KEY_P */ + {'q', 'Q'}, /* HID_KEY_Q */ + {'r', 'R'}, /* HID_KEY_R */ + {'s', 'S'}, /* HID_KEY_S */ + {'t', 'T'}, /* HID_KEY_T */ + {'u', 'U'}, /* HID_KEY_U */ + {'v', 'V'}, /* HID_KEY_V */ + {'w', 'W'}, /* HID_KEY_W */ + {'x', 'X'}, /* HID_KEY_X */ + {'y', 'Y'}, /* HID_KEY_Y */ + {'z', 'Z'}, /* HID_KEY_Z */ + {'1', '!'}, /* HID_KEY_1 */ + {'2', '@'}, /* HID_KEY_2 */ + {'3', '#'}, /* HID_KEY_3 */ + {'4', '$'}, /* HID_KEY_4 */ + {'5', '%'}, /* HID_KEY_5 */ + {'6', '^'}, /* HID_KEY_6 */ + {'7', '&'}, /* HID_KEY_7 */ + {'8', '*'}, /* HID_KEY_8 */ + {'9', '('}, /* HID_KEY_9 */ + {'0', ')'}, /* HID_KEY_0 */ + {'\r', '\r'}, /* HID_KEY_ENTER */ + {0, 0}, /* HID_KEY_ESC */ + {'\b', 0}, /* HID_KEY_DEL */ + {0, 0}, /* HID_KEY_TAB */ + {' ', ' '}, /* HID_KEY_SPACE */ + {'-', '_'}, /* HID_KEY_MINUS */ + {'=', '+'}, /* HID_KEY_EQUAL */ + {'[', '{'}, /* HID_KEY_OPEN_BRACKET */ + {']', '}'}, /* HID_KEY_CLOSE_BRACKET */ + {'\\', '|'}, /* HID_KEY_BACK_SLASH */ + {'\\', '|'}, /* HID_KEY_SHARP */ + {';', ':'}, /* HID_KEY_COLON */ + {'\'', '"'}, /* HID_KEY_QUOTE */ + {'`', '~'}, /* HID_KEY_TILDE */ + {',', '<'}, /* HID_KEY_LESS */ + {'.', '>'}, /* HID_KEY_GREATER */ + {'/', '?'} /* HID_KEY_SLASH */ +}; + +struct usbh_hid_lvgl { + struct { + lv_indev_t *indev; /* LVGL mouse input device driver */ + uint8_t sensitivity; /* Mouse sensitivity (cannot be zero) */ + int16_t x; /* Mouse X coordinate */ + int16_t y; /* Mouse Y coordinate */ + bool left_button; /* Mouse left button state */ + } mouse; + struct { + lv_indev_t *indev; /* LVGL keyboard input device driver */ + uint32_t last_key; + bool pressed; + } kb; +}; + +static struct usbh_hid_lvgl g_hid_lvgl; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t hid_mouse_buffer[64]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t hid_keyboard_buffer[64]; + +#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9) +static void usbh_hid_lvgl_read_mouse(lv_indev_t *indev_drv, lv_indev_data_t *data) +{ + int16_t width = 0; + int16_t height = 0; + struct usbh_hid_lvgl *ctx = &g_hid_lvgl; + + lv_display_t *disp = lv_indev_get_display(indev_drv); + if (lv_display_get_rotation(disp) == LV_DISPLAY_ROTATION_0 || lv_display_get_rotation(disp) == LV_DISPLAY_ROTATION_180) { + width = lv_display_get_physical_horizontal_resolution(disp); + height = lv_display_get_vertical_resolution(disp); + } else { + width = lv_display_get_vertical_resolution(disp); + height = lv_display_get_physical_horizontal_resolution(disp); + } + + /* Screen borders */ + if (ctx->mouse.x < 0) { + ctx->mouse.x = 0; + } else if (ctx->mouse.x >= width * ctx->mouse.sensitivity) { + ctx->mouse.x = (width * ctx->mouse.sensitivity) - 1; + } + if (ctx->mouse.y < 0) { + ctx->mouse.y = 0; + } else if (ctx->mouse.y >= height * ctx->mouse.sensitivity) { + ctx->mouse.y = (height * ctx->mouse.sensitivity) - 1; + } + + /* Get coordinates by rotation with sensitivity */ + switch (lv_display_get_rotation(disp)) { + case LV_DISPLAY_ROTATION_0: + data->point.x = ctx->mouse.x / ctx->mouse.sensitivity; + data->point.y = ctx->mouse.y / ctx->mouse.sensitivity; + break; + case LV_DISPLAY_ROTATION_90: + data->point.y = width - ctx->mouse.x / ctx->mouse.sensitivity; + data->point.x = ctx->mouse.y / ctx->mouse.sensitivity; + break; + case LV_DISPLAY_ROTATION_180: + data->point.x = width - ctx->mouse.x / ctx->mouse.sensitivity; + data->point.y = height - ctx->mouse.y / ctx->mouse.sensitivity; + break; + case LV_DISPLAY_ROTATION_270: + data->point.y = ctx->mouse.x / ctx->mouse.sensitivity; + data->point.x = height - ctx->mouse.y / ctx->mouse.sensitivity; + break; + } + + if (ctx->mouse.left_button) { + data->state = LV_INDEV_STATE_PRESSED; + } else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +static void usbh_hid_lvgl_read_keyboard(lv_indev_t *indev_drv, lv_indev_data_t *data) +{ + (void)indev_drv; + struct usbh_hid_lvgl *ctx = &g_hid_lvgl; + + data->key = ctx->kb.last_key; + if (ctx->kb.pressed) { + data->state = LV_INDEV_STATE_PRESSED; + ctx->kb.pressed = false; + } else { + data->state = LV_INDEV_STATE_RELEASED; + ctx->kb.last_key = 0; + } +} + +#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8) +static lv_indev_drv_t indev_drv; +static lv_indev_drv_t keyboard_drv; +static void hpm_lvgl_indev_read_cb(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) +{ + int16_t width = 0; + int16_t height = 0; + struct usbh_hid_lvgl *ctx = &g_hid_lvgl; + + if ((indev_drv->disp->driver->rotated == LV_DISP_ROT_NONE) || (indev_drv->disp->driver->rotated == LV_DISP_ROT_180)) { + width = indev_drv->disp->driver->hor_res; + height = indev_drv->disp->driver->ver_res; + } else { + width = indev_drv->disp->driver->ver_res; + height = indev_drv->disp->driver->hor_res; + } + + + /* Screen borders */ + if (ctx->mouse.x < 0) { + ctx->mouse.x = 0; + } else if (ctx->mouse.x >= width * ctx->mouse.sensitivity) { + ctx->mouse.x = (width * ctx->mouse.sensitivity) - 1; + } + if (ctx->mouse.y < 0) { + ctx->mouse.y = 0; + } else if (ctx->mouse.y >= height * ctx->mouse.sensitivity) { + ctx->mouse.y = (height * ctx->mouse.sensitivity) - 1; + } + + /* Get coordinates by rotation with sensitivity */ + switch (indev_drv->disp->driver->rotated) { + case LV_DISP_ROT_NONE: + data->point.x = ctx->mouse.x / ctx->mouse.sensitivity; + data->point.y = ctx->mouse.y / ctx->mouse.sensitivity; + break; + case LV_DISP_ROT_90: + data->point.y = width - ctx->mouse.x / ctx->mouse.sensitivity; + data->point.x = ctx->mouse.y / ctx->mouse.sensitivity; + break; + case LV_DISP_ROT_180: + data->point.x = width - ctx->mouse.x / ctx->mouse.sensitivity; + data->point.y = height - ctx->mouse.y / ctx->mouse.sensitivity; + break; + case LV_DISP_ROT_270: + data->point.y = ctx->mouse.x / ctx->mouse.sensitivity; + data->point.x = height - ctx->mouse.y / ctx->mouse.sensitivity; + break; + } + + if (ctx->mouse.left_button) { + data->state = LV_INDEV_STATE_PRESSED; + } else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +static void usbh_hid_lvgl_read_keyboard(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) +{ + (void)indev_drv; + struct usbh_hid_lvgl *ctx = &g_hid_lvgl; + + data->key = ctx->kb.last_key; + if (ctx->kb.pressed) { + data->state = LV_INDEV_STATE_PRESSED; + ctx->kb.pressed = false; + } else { + data->state = LV_INDEV_STATE_RELEASED; + ctx->kb.last_key = 0; + } +} +#endif + +lv_indev_t *usbh_hid_lvgl_add_mouse(uint8_t sensitivity) +{ + int32_t ver_res, hor_res; + lv_indev_t *indev; + + /* Initialize USB HID */ + struct usbh_hid_lvgl *hid_ctx = &g_hid_lvgl; + + /* Mouse sensitivity cannot be zero */ + hid_ctx->mouse.sensitivity = (sensitivity == 0 ? 1 : sensitivity); + +#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9) + ver_res = lv_display_get_vertical_resolution(lv_display_get_default()); + hor_res = lv_display_get_physical_horizontal_resolution(lv_display_get_default()); +#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8) + lv_disp_t * disp = lv_disp_get_default(); + ver_res = disp->driver->hor_res; + hor_res = disp->driver->ver_res; +#endif + /* Default coordinates to screen center */ + hid_ctx->mouse.x = (hor_res * hid_ctx->mouse.sensitivity) / 2; + hid_ctx->mouse.y = (ver_res * hid_ctx->mouse.sensitivity) / 2; + + /* Register a mouse input device */ +#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9) + indev = lv_indev_create(); + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, usbh_hid_lvgl_read_mouse); + lv_indev_set_driver_data(indev, hid_ctx); + hid_ctx->mouse.indev = indev; +#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8) + lv_indev_drv_init(&indev_drv); + indev_drv.read_cb = hpm_lvgl_indev_read_cb; + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.user_data = (void *)hid_ctx; + indev = lv_indev_drv_register(&indev_drv); +#endif + /* Set image of cursor */ + lv_obj_t *cursor; + cursor = lv_img_create(lv_scr_act()); + lv_img_set_src(cursor, &img_cursor); + lv_indev_set_cursor(indev, cursor); + + return indev; +} + +lv_indev_t *usbh_hid_lvgl_add_keyboard(void) +{ + lv_indev_t *indev; + + /* Initialize USB HID */ + struct usbh_hid_lvgl *hid_ctx = &g_hid_lvgl; + + /* Register a keyboard input device */ +#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9) + indev = lv_indev_create(); + lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(indev, usbh_hid_lvgl_read_keyboard); + lv_indev_set_driver_data(indev, hid_ctx); + hid_ctx->kb.indev = indev; +#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8) + lv_indev_drv_init(&keyboard_drv); + keyboard_drv.read_cb = usbh_hid_lvgl_read_keyboard; + keyboard_drv.type = LV_INDEV_TYPE_KEYPAD; + keyboard_drv.user_data = (void *)hid_ctx; + indev = lv_indev_drv_register(&keyboard_drv); +#endif + return indev; +} + +void usbh_hid_mouse_callback(void *arg, int nbytes) +{ + struct usbh_hid *hid_class = (struct usbh_hid *)arg; + + if (nbytes > 0) { + struct usbh_hid_lvgl *hid_ctx = &g_hid_lvgl; + + hid_ctx->mouse.left_button = hid_mouse_buffer[0]; + hid_ctx->mouse.x += (int8_t)hid_mouse_buffer[1]; + hid_ctx->mouse.y += (int8_t)hid_mouse_buffer[2]; + + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_mouse_buffer, hid_class->intin->wMaxPacketSize, 0, + usbh_hid_mouse_callback, hid_class); + usbh_submit_urb(&hid_class->intin_urb); + } else if (nbytes == -USB_ERR_NAK) { /* only dwc2 should do this */ + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_mouse_buffer, hid_class->intin->wMaxPacketSize, 0, + usbh_hid_mouse_callback, hid_class); + usbh_submit_urb(&hid_class->intin_urb); + } else { + } +} + +static char usb_hid_get_keyboard_char(uint8_t key, uint8_t shift) +{ + char ret_key = 0; + static bool cap_lock = false; + + if (shift > 1) { + shift = 1; + } + + if ((key >= HID_KBD_USAGE_A) && (key <= HID_KBD_USAGE_QUESTION)) { + ret_key = (cap_lock == false) ? keycode2ascii[key][0] : keycode2ascii[key][1]; + } else if ((key >= HID_KBD_USAGE_1) && (key <= HID_KBD_USAGE_QUESTION)) { + ret_key = keycode2ascii[key][shift]; + } else if ((key >= HID_KBD_USAGE_KPD1) && (key <= HID_KBD_USAGE_KPD0)) { + ret_key = keycode2ascii[(key - HID_KBD_USAGE_KPD1) + HID_KBD_USAGE_1][0]; + } else if ((key >= HID_KBD_USAGE_KPDDIV) && (key <= HID_KBD_USAGE_KPDEMTER)) { + switch (key) { + case HID_KBD_USAGE_KPDDIV: + ret_key = '/'; + break; + case HID_KBD_USAGE_KPDMUL: + ret_key = '*'; + break; + case HID_KBD_USAGE_KPDHMINUS: + ret_key = '-'; + break; + case HID_KBD_USAGE_KPDPLUS: + ret_key = '+'; + break; + default: + break; + } + } else if (key == HID_KBD_USAGE_KPDDELETE) { + ret_key = '.'; + } else if (key == HID_KBD_USAGE_CAPSLOCK) { + cap_lock = !cap_lock; + } + + return ret_key; +} + +void usbh_hid_keyboard_callback(void *arg, int nbytes) +{ + struct usbh_hid *hid_class = (struct usbh_hid *)arg; + + if (nbytes > 0) { + struct usbh_hid_lvgl *hid_ctx = &g_hid_lvgl; + struct usb_hid_kbd_report *keyboard = (struct usb_hid_kbd_report *)hid_keyboard_buffer; + + for (int i = 0; i < 6; i++) { + if ((keyboard->key[i] <= HID_KBD_USAGE_MAX) && (keyboard->key[i] > HID_KBD_USAGE_NONE)) { + char key = 0; + + /* LVGL special keys */ + if (keyboard->key[i] == HID_KBD_USAGE_TAB) { + if (((keyboard->modifier & HID_MODIFIER_LSHIFT) || (keyboard->modifier & HID_MODIFIER_RSHIFT))) { + key = LV_KEY_PREV; + } else { + key = LV_KEY_NEXT; + } + } else if (keyboard->key[i] == HID_KBD_USAGE_RIGHT) { + key = LV_KEY_RIGHT; + } else if (keyboard->key[i] == HID_KBD_USAGE_LEFT) { + key = LV_KEY_LEFT; + } else if (keyboard->key[i] == HID_KBD_USAGE_DOWN) { + key = LV_KEY_DOWN; + } else if (keyboard->key[i] == HID_KBD_USAGE_UP) { + key = LV_KEY_UP; + } else if (keyboard->key[i] == HID_KBD_USAGE_ENTER || keyboard->key[i] == HID_KBD_USAGE_KPDEMTER) { + key = LV_KEY_ENTER; + } else if (keyboard->key[i] == HID_KBD_USAGE_DELETE) { + key = LV_KEY_BACKSPACE; + } else if (keyboard->key[i] == HID_KBD_USAGE_HOME) { + key = LV_KEY_HOME; + } else if (keyboard->key[i] == HID_KBD_USAGE_END) { + key = LV_KEY_END; + } else if (keyboard->key[i] == HID_KBD_USAGE_DELFWD) { + key = LV_KEY_DEL; + } else { + /* Get ASCII char */ + key = usb_hid_get_keyboard_char(keyboard->key[i], ((keyboard->modifier & HID_MODIFIER_LSHIFT) || (keyboard->modifier & HID_MODIFIER_RSHIFT))); + } + + if (key == 0) { + USB_LOG_ERR("Not recognized key: %c (%d)\r\n", keyboard->key[i], keyboard->key[i]); + } + hid_ctx->kb.last_key = key; + hid_ctx->kb.pressed = true; + } + } + + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_keyboard_buffer, hid_class->intin->wMaxPacketSize, 0, + usbh_hid_keyboard_callback, hid_class); + usbh_submit_urb(&hid_class->intin_urb); + } else if (nbytes == -USB_ERR_NAK) { /* only dwc2 should do this */ + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_keyboard_buffer, hid_class->intin->wMaxPacketSize, 0, + usbh_hid_keyboard_callback, hid_class); + usbh_submit_urb(&hid_class->intin_urb); + } else { + } +} + +extern int usbh_hid_set_protocol(struct usbh_hid *hid_class, uint8_t protocol); + +void usbh_hid_run(struct usbh_hid *hid_class) +{ + usbh_hid_set_protocol(hid_class, 0); + + if (hid_class->hport->config.intf[hid_class->intf].altsetting[0].intf_desc.bInterfaceProtocol == HID_PROTOCOL_KEYBOARD) { + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_keyboard_buffer, hid_class->intin->wMaxPacketSize, 0, + usbh_hid_keyboard_callback, hid_class); + usbh_submit_urb(&hid_class->intin_urb); + } else if (hid_class->hport->config.intf[hid_class->intf].altsetting[0].intf_desc.bInterfaceProtocol == HID_PROTOCOL_MOUSE) { + usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_mouse_buffer, hid_class->intin->wMaxPacketSize, 0, + usbh_hid_mouse_callback, hid_class); + usbh_submit_urb(&hid_class->intin_urb); + } else { + } +} + +void usbh_hid_stop(struct usbh_hid *hid_class) +{ + (void)hid_class; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/lvgl/usbh_hid_lvgl.h b/src/lib/CherryUSB/platform/lvgl/usbh_hid_lvgl.h new file mode 100644 index 000000000..50d05093a --- /dev/null +++ b/src/lib/CherryUSB/platform/lvgl/usbh_hid_lvgl.h @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_HID_LVGL_H +#define USBH_HID_LVGL_H + +#include "lvgl.h" + +lv_indev_t *usbh_hid_lvgl_add_mouse(uint8_t sensitivity); +lv_indev_t *usbh_hid_lvgl_add_keyboard(void); + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/lwip/usbh_lwip.c b/src/lib/CherryUSB/platform/lwip/usbh_lwip.c new file mode 100644 index 000000000..02eef59fd --- /dev/null +++ b/src/lib/CherryUSB/platform/lwip/usbh_lwip.c @@ -0,0 +1,546 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "netif/etharp.h" +#include "lwip/netif.h" +#include "lwip/pbuf.h" +#include "lwip/tcpip.h" +#if LWIP_DHCP +#include "lwip/dhcp.h" +#include "lwip/prot/dhcp.h" +#endif + +#include "usbh_core.h" + +#if LWIP_TCPIP_CORE_LOCKING_INPUT != 1 +#warning suggest you to set LWIP_TCPIP_CORE_LOCKING_INPUT to 1, usb handles eth input with own thread +#endif + +#if LWIP_TCPIP_CORE_LOCKING != 1 +#error must set LWIP_TCPIP_CORE_LOCKING to 1 +#endif + +#if PBUF_POOL_BUFSIZE < 1600 +#error PBUF_POOL_BUFSIZE must be larger than 1600 +#endif + +#if TCPIP_THREAD_STACKSIZE < 1024 +#error TCPIP_THREAD_STACKSIZE must be >= 1024 +#endif + +// #define CONFIG_USBHOST_PLATFORM_CDC_ECM +// #define CONFIG_USBHOST_PLATFORM_CDC_RNDIS +// #define CONFIG_USBHOST_PLATFORM_CDC_NCM +// #define CONFIG_USBHOST_PLATFORM_ASIX +// #define CONFIG_USBHOST_PLATFORM_RTL8152 + +ip_addr_t g_ipaddr; +ip_addr_t g_netmask; +ip_addr_t g_gateway; + +void usbh_lwip_eth_output_common(struct pbuf *p, uint8_t *buf) +{ + struct pbuf *q; + uint8_t *buffer; + + buffer = buf; + for (q = p; q != NULL; q = q->next) { + usb_memcpy(buffer, q->payload, q->len); + buffer += q->len; + } +} + +void usbh_lwip_eth_input_common(struct netif *netif, uint8_t *buf, uint32_t len) +{ +#if LWIP_TCPIP_CORE_LOCKING_INPUT + pbuf_type type = PBUF_REF; +#else + pbuf_type type = PBUF_POOL; +#endif + err_t err; + struct pbuf *p; + + p = pbuf_alloc(PBUF_RAW, len, type); + if (p != NULL) { +#if LWIP_TCPIP_CORE_LOCKING_INPUT + p->payload = buf; +#else + usb_memcpy(p->payload, buf, len); +#endif + err = netif->input(p, netif); + if (err != ERR_OK) { + pbuf_free(p); + } + } else { + USB_LOG_ERR("No memory to alloc pbuf\r\n"); + } +} + +struct usb_osal_timer *dhcp_handle; + +static void dhcp_timeout(void *arg) +{ + struct netif *netif = (struct netif *)arg; +#if LWIP_DHCP + struct dhcp *dhcp; +#endif + if (netif_is_up(netif)) { +#if LWIP_DHCP + dhcp = netif_dhcp_data(netif); + + if (dhcp && (dhcp->state == DHCP_STATE_BOUND)) { +#endif + USB_LOG_INFO("IPv4 Address : %s\r\n", ipaddr_ntoa(&netif->ip_addr)); + USB_LOG_INFO("IPv4 Subnet mask : %s\r\n", ipaddr_ntoa(&netif->netmask)); + USB_LOG_INFO("IPv4 Gateway : %s\r\n\r\n", ipaddr_ntoa(&netif->gw)); + + usb_osal_timer_stop(dhcp_handle); +#if LWIP_DHCP + } +#endif + } else { + } +} + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_ECM +#include "usbh_cdc_ecm.h" + +struct netif g_cdc_ecm_netif; + +static err_t usbh_cdc_ecm_linkoutput(struct netif *netif, struct pbuf *p) +{ + int ret; + (void)netif; + + usbh_lwip_eth_output_common(p, usbh_cdc_ecm_get_eth_txbuf()); + ret = usbh_cdc_ecm_eth_output(p->tot_len); + if (ret < 0) { + return ERR_BUF; + } else { + return ERR_OK; + } +} + +void usbh_cdc_ecm_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(&g_cdc_ecm_netif, buf, buflen); +} + +static err_t usbh_cdc_ecm_if_init(struct netif *netif) +{ + LWIP_ASSERT("netif != NULL", (netif != NULL)); + + netif->mtu = 1500; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP; + netif->state = NULL; + netif->name[0] = 'E'; + netif->name[1] = 'X'; + netif->output = etharp_output; + netif->linkoutput = usbh_cdc_ecm_linkoutput; + return ERR_OK; +} + +void usbh_cdc_ecm_run(struct usbh_cdc_ecm *cdc_ecm_class) +{ + struct netif *netif = &g_cdc_ecm_netif; + + netif->hwaddr_len = 6; + memcpy(netif->hwaddr, cdc_ecm_class->mac, 6); + + IP4_ADDR(&g_ipaddr, 0, 0, 0, 0); + IP4_ADDR(&g_netmask, 0, 0, 0, 0); + IP4_ADDR(&g_gateway, 0, 0, 0, 0); + + netif = netif_add(netif, &g_ipaddr, &g_netmask, &g_gateway, NULL, usbh_cdc_ecm_if_init, tcpip_input); + netif_set_default(netif); + while (!netif_is_up(netif)) { + } + + dhcp_handle = usb_osal_timer_create("dhcp", 200, dhcp_timeout, netif, true); + if (dhcp_handle == NULL) { + USB_LOG_ERR("timer creation failed! \r\n"); + while (1) { + } + } + + usb_osal_thread_create("usbh_cdc_ecm_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_cdc_ecm_rx_thread, NULL); +#if LWIP_DHCP + dhcp_start(netif); + usb_osal_timer_start(dhcp_handle); +#endif +} + +void usbh_cdc_ecm_stop(struct usbh_cdc_ecm *cdc_ecm_class) +{ + struct netif *netif = &g_cdc_ecm_netif; + (void)cdc_ecm_class; + +#if LWIP_DHCP + dhcp_stop(netif); + dhcp_cleanup(netif); + usb_osal_timer_delete(dhcp_handle); +#endif + netif_set_down(netif); + netif_remove(netif); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_RNDIS +#include "usbh_rndis.h" + +struct usb_osal_timer *timer_handle; + +static void rndis_dev_keepalive_timeout(void *arg) +{ + struct usbh_rndis *rndis_class = (struct usbh_rndis *)arg; + usbh_rndis_keepalive(rndis_class); +} + +void timer_init(struct usbh_rndis *rndis_class) +{ + timer_handle = usb_osal_timer_create("rndis_keepalive", 5000, rndis_dev_keepalive_timeout, rndis_class, true); + if (NULL != timer_handle) { + usb_osal_timer_start(timer_handle); + } else { + USB_LOG_ERR("timer creation failed! \r\n"); + for (;;) { + ; + } + } +} + +struct netif g_rndis_netif; + +static err_t usbh_rndis_linkoutput(struct netif *netif, struct pbuf *p) +{ + int ret; + (void)netif; + + usbh_lwip_eth_output_common(p, usbh_rndis_get_eth_txbuf()); + ret = usbh_rndis_eth_output(p->tot_len); + if (ret < 0) { + return ERR_BUF; + } else { + return ERR_OK; + } +} + +void usbh_rndis_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(&g_rndis_netif, buf, buflen); +} + +static err_t usbh_rndis_if_init(struct netif *netif) +{ + LWIP_ASSERT("netif != NULL", (netif != NULL)); + + netif->mtu = 1500; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP; + netif->state = NULL; + netif->name[0] = 'E'; + netif->name[1] = 'X'; + netif->output = etharp_output; + netif->linkoutput = usbh_rndis_linkoutput; + return ERR_OK; +} + +void usbh_rndis_run(struct usbh_rndis *rndis_class) +{ + struct netif *netif = &g_rndis_netif; + + netif->hwaddr_len = 6; + memcpy(netif->hwaddr, rndis_class->mac, 6); + + IP4_ADDR(&g_ipaddr, 0, 0, 0, 0); + IP4_ADDR(&g_netmask, 0, 0, 0, 0); + IP4_ADDR(&g_gateway, 0, 0, 0, 0); + + netif = netif_add(netif, &g_ipaddr, &g_netmask, &g_gateway, NULL, usbh_rndis_if_init, tcpip_input); + netif_set_default(netif); + while (!netif_is_up(netif)) { + } + + dhcp_handle = usb_osal_timer_create("dhcp", 200, dhcp_timeout, netif, true); + if (dhcp_handle == NULL) { + USB_LOG_ERR("timer creation failed! \r\n"); + while (1) { + } + } + + usb_osal_thread_create("usbh_rndis_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_rndis_rx_thread, NULL); + + //timer_init(rndis_class); + +#if LWIP_DHCP + dhcp_start(netif); + usb_osal_timer_start(dhcp_handle); +#endif +} + +void usbh_rndis_stop(struct usbh_rndis *rndis_class) +{ + struct netif *netif = &g_rndis_netif; + (void)rndis_class; + +#if LWIP_DHCP + dhcp_stop(netif); + dhcp_cleanup(netif); + usb_osal_timer_delete(dhcp_handle); +#endif + netif_set_down(netif); + netif_remove(netif); + // xTimerStop(timer_handle, 0); + // xTimerDelete(timer_handle, 0); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_NCM +#include "usbh_cdc_ncm.h" + +struct netif g_cdc_ncm_netif; + +static err_t usbh_cdc_ncm_linkoutput(struct netif *netif, struct pbuf *p) +{ + int ret; + (void)netif; + + usbh_lwip_eth_output_common(p, usbh_cdc_ncm_get_eth_txbuf()); + ret = usbh_cdc_ncm_eth_output(p->tot_len); + if (ret < 0) { + return ERR_BUF; + } else { + return ERR_OK; + } +} + +void usbh_cdc_ncm_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(&g_cdc_ncm_netif, buf, buflen); +} + +static err_t usbh_cdc_ncm_if_init(struct netif *netif) +{ + LWIP_ASSERT("netif != NULL", (netif != NULL)); + + netif->mtu = 1500; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP; + netif->state = NULL; + netif->name[0] = 'E'; + netif->name[1] = 'X'; + netif->output = etharp_output; + netif->linkoutput = usbh_cdc_ncm_linkoutput; + return ERR_OK; +} + +void usbh_cdc_ncm_run(struct usbh_cdc_ncm *cdc_ncm_class) +{ + struct netif *netif = &g_cdc_ncm_netif; + + netif->hwaddr_len = 6; + memcpy(netif->hwaddr, cdc_ncm_class->mac, 6); + + IP4_ADDR(&g_ipaddr, 0, 0, 0, 0); + IP4_ADDR(&g_netmask, 0, 0, 0, 0); + IP4_ADDR(&g_gateway, 0, 0, 0, 0); + + netif = netif_add(netif, &g_ipaddr, &g_netmask, &g_gateway, NULL, usbh_cdc_ncm_if_init, tcpip_input); + netif_set_default(netif); + while (!netif_is_up(netif)) { + } + + dhcp_handle = usb_osal_timer_create("dhcp", 200, dhcp_timeout, netif, true); + if (dhcp_handle == NULL) { + USB_LOG_ERR("timer creation failed! \r\n"); + while (1) { + } + } + + usb_osal_thread_create("usbh_cdc_ncm_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_cdc_ncm_rx_thread, NULL); +#if LWIP_DHCP + dhcp_start(netif); + usb_osal_timer_start(dhcp_handle); +#endif +} + +void usbh_cdc_ncm_stop(struct usbh_cdc_ncm *cdc_ncm_class) +{ + struct netif *netif = &g_cdc_ncm_netif; + (void)cdc_ncm_class; + +#if LWIP_DHCP + dhcp_stop(netif); + dhcp_cleanup(netif); + usb_osal_timer_delete(dhcp_handle); +#endif + netif_set_down(netif); + netif_remove(netif); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_ASIX +#include "usbh_asix.h" + +struct netif g_asix_netif; + +static err_t usbh_asix_linkoutput(struct netif *netif, struct pbuf *p) +{ + int ret; + (void)netif; + + usbh_lwip_eth_output_common(p, usbh_asix_get_eth_txbuf()); + ret = usbh_asix_eth_output(p->tot_len); + if (ret < 0) { + return ERR_BUF; + } else { + return ERR_OK; + } +} + +void usbh_asix_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(&g_asix_netif, buf, buflen); +} + +static err_t usbh_asix_if_init(struct netif *netif) +{ + LWIP_ASSERT("netif != NULL", (netif != NULL)); + + netif->mtu = 1500; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP; + netif->state = NULL; + netif->name[0] = 'E'; + netif->name[1] = 'X'; + netif->output = etharp_output; + netif->linkoutput = usbh_asix_linkoutput; + return ERR_OK; +} + +void usbh_asix_run(struct usbh_asix *asix_class) +{ + struct netif *netif = &g_asix_netif; + + netif->hwaddr_len = 6; + memcpy(netif->hwaddr, asix_class->mac, 6); + + IP4_ADDR(&g_ipaddr, 0, 0, 0, 0); + IP4_ADDR(&g_netmask, 0, 0, 0, 0); + IP4_ADDR(&g_gateway, 0, 0, 0, 0); + + netif = netif_add(netif, &g_ipaddr, &g_netmask, &g_gateway, NULL, usbh_asix_if_init, tcpip_input); + netif_set_default(netif); + while (!netif_is_up(netif)) { + } + + dhcp_handle = usb_osal_timer_create("dhcp", 200, dhcp_timeout, netif, true); + if (dhcp_handle == NULL) { + USB_LOG_ERR("timer creation failed! \r\n"); + while (1) { + } + } + + usb_osal_thread_create("usbh_asix_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_asix_rx_thread, NULL); +#if LWIP_DHCP + dhcp_start(netif); + usb_osal_timer_start(dhcp_handle); +#endif +} + +void usbh_asix_stop(struct usbh_asix *asix_class) +{ + struct netif *netif = &g_asix_netif; + (void)asix_class; + +#if LWIP_DHCP + dhcp_stop(netif); + dhcp_cleanup(netif); + usb_osal_timer_delete(dhcp_handle); +#endif + netif_set_down(netif); + netif_remove(netif); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_RTL8152 +#include "usbh_rtl8152.h" + +struct netif g_rtl8152_netif; + +static err_t usbh_rtl8152_linkoutput(struct netif *netif, struct pbuf *p) +{ + int ret; + (void)netif; + + usbh_lwip_eth_output_common(p, usbh_rtl8152_get_eth_txbuf()); + ret = usbh_rtl8152_eth_output(p->tot_len); + if (ret < 0) { + return ERR_BUF; + } else { + return ERR_OK; + } +} + +void usbh_rtl8152_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(&g_rtl8152_netif, buf, buflen); +} + +static err_t usbh_rtl8152_if_init(struct netif *netif) +{ + LWIP_ASSERT("netif != NULL", (netif != NULL)); + + netif->mtu = 1500; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP; + netif->state = NULL; + netif->name[0] = 'E'; + netif->name[1] = 'X'; + netif->output = etharp_output; + netif->linkoutput = usbh_rtl8152_linkoutput; + return ERR_OK; +} + +void usbh_rtl8152_run(struct usbh_rtl8152 *rtl8152_class) +{ + struct netif *netif = &g_rtl8152_netif; + + netif->hwaddr_len = 6; + memcpy(netif->hwaddr, rtl8152_class->mac, 6); + + IP4_ADDR(&g_ipaddr, 0, 0, 0, 0); + IP4_ADDR(&g_netmask, 0, 0, 0, 0); + IP4_ADDR(&g_gateway, 0, 0, 0, 0); + + netif = netif_add(netif, &g_ipaddr, &g_netmask, &g_gateway, NULL, usbh_rtl8152_if_init, tcpip_input); + netif_set_default(netif); + while (!netif_is_up(netif)) { + } + + dhcp_handle = usb_osal_timer_create("dhcp", 200, dhcp_timeout, netif, true); + if (dhcp_handle == NULL) { + USB_LOG_ERR("timer creation failed! \r\n"); + while (1) { + } + } + + usb_osal_thread_create("usbh_rtl8152_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_rtl8152_rx_thread, NULL); +#if LWIP_DHCP + dhcp_start(netif); + usb_osal_timer_start(dhcp_handle); +#endif +} + +void usbh_rtl8152_stop(struct usbh_rtl8152 *rtl8152_class) +{ + struct netif *netif = &g_rtl8152_netif; + (void)rtl8152_class; + +#if LWIP_DHCP + dhcp_stop(netif); + dhcp_cleanup(netif); + usb_osal_timer_delete(dhcp_handle); +#endif + netif_set_down(netif); + netif_remove(netif); +} +#endif diff --git a/src/lib/CherryUSB/platform/nuttx/usbd_cdcacm.c b/src/lib/CherryUSB/platform/nuttx/usbd_cdcacm.c new file mode 100644 index 000000000..0dd96bed7 --- /dev/null +++ b/src/lib/CherryUSB/platform/nuttx/usbd_cdcacm.c @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include + +#include "usbd_core.h" +#include "usbd_cdc_acm.h" + +#include + +#ifndef CONFIG_USBDEV_CDCACM_RXBUFSIZE +#define CONFIG_USBDEV_CDCACM_RXBUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_CDCACM_TXBUFSIZE +#define CONFIG_USBDEV_CDCACM_TXBUFSIZE 512 +#endif + +USB_NOCACHE_RAM_SECTION struct usbdev_serial_s { + char name[16]; + struct circbuf_s circ; + uint8_t inep; + uint8_t outep; + struct usbd_interface ctrl_intf; + struct usbd_interface data_intf; + __attribute__((aligned(32))) uint8_t cache_tempbuffer[512]; + __attribute__((aligned(32))) uint8_t cache_rxbuffer[CONFIG_USBDEV_CDCACM_RXBUFSIZE]; + __attribute__((aligned(32))) uint8_t cache_txbuffer[CONFIG_USBDEV_CDCACM_TXBUFSIZE]; +}; + +struct usbdev_serial_ep_s { + uint32_t rxlen; + int error; + sem_t txdone_sem; + sem_t rxdone_sem; + bool used; +}; + +struct usbdev_serial_s *g_usb_cdcacm_serial[8] = { 0 }; +struct usbdev_serial_ep_s g_usb_cdcacm_serial_ep[2][8] = { 0 }; + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + g_usb_cdcacm_serial_ep[0][ep & 0x0f].error = 0; + g_usb_cdcacm_serial_ep[0][ep & 0x0f].rxlen = nbytes; + nxsem_post(&g_usb_cdcacm_serial_ep[0][ep & 0x0f].rxdone_sem); +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, ep, NULL, 0); + } else { + nxsem_post(&g_usb_cdcacm_serial_ep[1][ep & 0x0f].txdone_sem); + } +} + +/* Character driver methods */ + +static int usbdev_open(FAR struct file *filep); +static int usbdev_close(FAR struct file *filep); +static ssize_t usbdev_read(FAR struct file *filep, FAR char *buffer, + size_t buflen); +static ssize_t usbdev_write(FAR struct file *filep, + FAR const char *buffer, size_t buflen); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct file_operations g_usbdevops = { + usbdev_open, /* open */ + usbdev_close, /* close */ + usbdev_read, /* read */ + usbdev_write, /* write */ + NULL, /* seek */ + NULL, /* ioctl */ + NULL, /* mmap */ + NULL, /* truncate */ + NULL /* poll */ +}; + +static int usbdev_open(FAR struct file *filep) +{ + FAR struct inode *inode = filep->f_inode; + + DEBUGASSERT(inode->i_private); + + if (usb_device_is_configured(0)) { + return OK; + } else { + return -ENODEV; + } +} + +static int usbdev_close(FAR struct file *filep) +{ + FAR struct inode *inode = filep->f_inode; + + DEBUGASSERT(inode->i_private); + + if (!usb_device_is_configured(0)) { + return -ENODEV; + } + + return 0; +} + +static ssize_t usbdev_read(FAR struct file *filep, FAR char *buffer, + size_t buflen) +{ + FAR struct inode *inode = filep->f_inode; + struct usbdev_serial_s *serial; + int ret; + + DEBUGASSERT(inode->i_private); + serial = (struct usbdev_serial_s *)inode->i_private; + + if (!usb_device_is_configured(0)) { + return -ENODEV; + } + + while (circbuf_used(&serial->circ) == 0) { + nxsem_reset(&g_usb_cdcacm_serial_ep[0][serial->outep & 0x0f].rxdone_sem, 0); + usbd_ep_start_read(0, serial->outep, serial->cache_tempbuffer, usbd_get_ep_mps(0, serial->outep)); + ret = nxsem_wait(&g_usb_cdcacm_serial_ep[0][serial->outep & 0x0f].rxdone_sem); + if (ret < 0) { + return ret; + } + if (g_usb_cdcacm_serial_ep[0][serial->outep & 0x0f].error < 0) { + return g_usb_cdcacm_serial_ep[0][serial->outep & 0x0f].error; + } +#if defined(CONFIG_ARCH_DCACHE) && !defined(CONFIG_USB_DCACHE_ENABLE) + up_invalidate_dcache((uintptr_t)serial->cache_tempbuffer, (uintptr_t)(serial->cache_tempbuffer + USB_ALIGN_UP(g_usb_cdcacm_serial_ep[0][serial->outep & 0x0f].rxlen, 64))); +#endif + circbuf_overwrite(&serial->circ, serial->cache_tempbuffer, g_usb_cdcacm_serial_ep[0][serial->outep & 0x0f].rxlen); + } + return circbuf_read(&serial->circ, buffer, buflen); +} + +static ssize_t usbdev_write(FAR struct file *filep, FAR const char *buffer, + size_t buflen) +{ + FAR struct inode *inode = filep->f_inode; + struct usbdev_serial_s *serial; + int ret; + + DEBUGASSERT(inode->i_private); + serial = (struct usbdev_serial_s *)inode->i_private; + + if (!usb_device_is_configured(0)) { + return -ENODEV; + } + +#ifdef CONFIG_ARCH_DCACHE + uint32_t write_len = 0; + + while (write_len < buflen) { + uint32_t len = buflen - write_len; + if (len > CONFIG_USBDEV_CDCACM_TXBUFSIZE) { + len = CONFIG_USBDEV_CDCACM_TXBUFSIZE; + } + memcpy(serial->cache_txbuffer, buffer + write_len, len); +#ifndef CONFIG_USB_DCACHE_ENABLE + up_clean_dcache((uintptr_t)serial->cache_txbuffer, (uintptr_t)(serial->cache_txbuffer + USB_ALIGN_UP(len, 64))); +#endif + nxsem_reset(&g_usb_cdcacm_serial_ep[0][serial->inep & 0x0f].txdone_sem, 0); + usbd_ep_start_write(0, serial->inep, serial->cache_txbuffer, len); + ret = nxsem_wait(&g_usb_cdcacm_serial_ep[0][serial->inep & 0x0f].txdone_sem); + if (ret < 0) { + return ret; + } else { + if (g_usb_cdcacm_serial_ep[1][serial->inep & 0x0f].error < 0) { + return g_usb_cdcacm_serial_ep[1][serial->inep & 0x0f].error; + } + write_len += len; + } + } + return buflen; +#else + nxsem_reset(&g_usb_cdcacm_serial_ep[0][outep & 0x0f].txdone_sem, 0); + usbd_ep_start_write(0, serial->inep, buffer, buflen); + ret = nxsem_wait(&g_usb_cdcacm_serial_ep[0][outep & 0x0f].txdone_sem); + if (ret < 0) { + return ret; + } else { + if (g_usb_cdcacm_serial_ep[1][serial->inep & 0x0f].error < 0) { + return g_usb_cdcacm_serial_ep[1][serial->inep & 0x0f].error; + } + return buflen; + } +#endif +} + +static struct usbd_endpoint cdc_out_ep[8] = { 0 }; +static struct usbd_endpoint cdc_in_ep[8] = { 0 }; + +static void cdcacm_notify_handler(uint8_t busid, uint8_t event, void *arg) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_DISCONNECTED: + for (size_t i = 0; i < 8; i++) { + if (g_usb_cdcacm_serial_ep[0][i & 0x0f].used) { + g_usb_cdcacm_serial_ep[0][i & 0x0f].error = -ESHUTDOWN; + nxsem_post(&g_usb_cdcacm_serial_ep[0][i & 0x0f].rxdone_sem); + } + if (g_usb_cdcacm_serial_ep[1][i & 0x0f].used) { + g_usb_cdcacm_serial_ep[1][i & 0x0f].error = -ESHUTDOWN; + nxsem_post(&g_usb_cdcacm_serial_ep[1][i & 0x0f].txdone_sem); + } + } + break; + case USBD_EVENT_CONFIGURED: + for (size_t i = 0; i < 8; i++) { + if (g_usb_cdcacm_serial_ep[0][i & 0x0f].used) { + g_usb_cdcacm_serial_ep[0][i & 0x0f].error = 0; + nxsem_post(&g_usb_cdcacm_serial_ep[0][i & 0x0f].rxdone_sem); + } + if (g_usb_cdcacm_serial_ep[1][i & 0x0f].used) { + g_usb_cdcacm_serial_ep[1][i & 0x0f].error = 0; + nxsem_post(&g_usb_cdcacm_serial_ep[1][i & 0x0f].txdone_sem); + } + } + break; + default: + break; + } +} + +void usbd_cdcacm_init(uint8_t busid, uint8_t id, const char *path, uint8_t outep, uint8_t inep) +{ + g_usb_cdcacm_serial[id] = kmm_malloc(sizeof(struct usbdev_serial_s)); + DEBUGASSERT(g_usb_cdcacm_serial[id]); + + memset(g_usb_cdcacm_serial[id], 0, sizeof(struct usbdev_serial_s)); + strncpy(g_usb_cdcacm_serial[id]->name, path, sizeof(g_usb_cdcacm_serial[id]->name) - 1); + + circbuf_init(&g_usb_cdcacm_serial[id]->circ, g_usb_cdcacm_serial[id]->cache_rxbuffer, CONFIG_USBDEV_CDCACM_RXBUFSIZE); + + nxsem_init(&g_usb_cdcacm_serial_ep[0][outep & 0x0f].rxdone_sem, 0, 0); + nxsem_init(&g_usb_cdcacm_serial_ep[1][inep & 0x0f].txdone_sem, 0, 0); + g_usb_cdcacm_serial_ep[0][outep & 0x0f].used = true; + g_usb_cdcacm_serial_ep[1][inep & 0x0f].used = true; + + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &g_usb_cdcacm_serial[id]->ctrl_intf)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &g_usb_cdcacm_serial[id]->data_intf)); + g_usb_cdcacm_serial[id]->ctrl_intf.notify_handler = cdcacm_notify_handler; + g_usb_cdcacm_serial[id]->outep = outep; + g_usb_cdcacm_serial[id]->inep = inep; + + cdc_out_ep[id].ep_addr = outep; + cdc_out_ep[id].ep_cb = usbd_cdc_acm_bulk_out; + cdc_in_ep[id].ep_addr = inep; + cdc_in_ep[id].ep_cb = usbd_cdc_acm_bulk_in; + + usbd_add_endpoint(busid, &cdc_out_ep[id]); + usbd_add_endpoint(busid, &cdc_in_ep[id]); + + register_driver(path, &g_usbdevops, 0666, g_usb_cdcacm_serial[id]); +} + +void usbd_cdcacm_deinit(uint8_t busid, uint8_t id) +{ + unregister_driver(g_usb_cdcacm_serial[id]->name); + + kmm_free(g_usb_cdcacm_serial[id]); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/nuttx/usbd_fs.c b/src/lib/CherryUSB/platform/nuttx/usbd_fs.c new file mode 100644 index 000000000..3110dc6bb --- /dev/null +++ b/src/lib/CherryUSB/platform/nuttx/usbd_fs.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include + +#include "usbd_core.h" +#include "usbd_msc.h" + +#ifndef CONFIG_USBDEV_MSC_THREAD +#error "CONFIG_USBDEV_MSC_THREAD must be enabled" +#endif + +static FAR struct inode *inode; +static struct geometry geo; +static char devpath[32]; + +void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size) +{ + int ret; + + /* Open the block driver */ + + ret = open_blockdriver(devpath, 0, &inode); + if (ret < 0) { + *block_num = 0; + *block_size = 0; + return; + } + + /* Get the drive geometry */ + + if (!inode || !inode->u.i_bops || !inode->u.i_bops->geometry || + inode->u.i_bops->geometry(inode, &geo) != OK || !geo.geo_available) { + *block_num = 0; + *block_size = 0; + return; + } + + *block_num = geo.geo_nsectors; + *block_size = geo.geo_sectorsize; + + USB_LOG_INFO("block_num: %ld, block_size: %ld\n", *block_num, *block_size); +} + +int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (inode->u.i_bops->read) { + inode->u.i_bops->read(inode, buffer, sector, length / geo.geo_sectorsize); + } + + return 0; +} + +int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) +{ + if (inode->u.i_bops->write) { + inode->u.i_bops->write(inode, buffer, sector, length / geo.geo_sectorsize); + } + + return 0; +} + +static struct usbd_interface intf0; + +void usbd_msc_init(uint8_t busid, char *path, uint8_t outep, uint8_t inep) +{ + memset(devpath, 0, sizeof(devpath)); + strncpy(devpath, path, sizeof(devpath) - 1); + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf0, outep, inep)); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/nuttx/usbh_fs.c b/src/lib/CherryUSB/platform/nuttx/usbh_fs.c new file mode 100644 index 000000000..bd5afc67d --- /dev/null +++ b/src/lib/CherryUSB/platform/nuttx/usbh_fs.c @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include + +#include "usbh_core.h" +#include "usbh_msc.h" + +#ifndef CONFIG_FS_FAT +#error "CONFIG_FS_FAT must be enabled" +#endif + +#ifdef CONFIG_ARCH_DCACHE +#ifndef CONFIG_FAT_DMAMEMORY +#error "USBH MSC requires CONFIG_FAT_DMAMEMORY" +#endif +#endif + +#define DEV_FORMAT "/dev/sd%c" + +static int nuttx_errorcode(int error) +{ + int err = 0; + + switch (error) { + case -USB_ERR_NOMEM: + err = -EIO; + break; + case -USB_ERR_INVAL: + err = -EINVAL; + break; + case -USB_ERR_NODEV: + err = -ENODEV; + break; + case -USB_ERR_NOTCONN: + err = -ENOTCONN; + break; + case -USB_ERR_NOTSUPP: + err = -EIO; + break; + case -USB_ERR_BUSY: + err = -EBUSY; + break; + case -USB_ERR_RANGE: + err = -ERANGE; + break; + case -USB_ERR_STALL: + err = -EPERM; + break; + case -USB_ERR_NAK: + err = -EAGAIN; + break; + case -USB_ERR_DT: + err = -EIO; + break; + case -USB_ERR_IO: + err = -EIO; + break; + case -USB_ERR_SHUTDOWN: + err = -ESHUTDOWN; + break; + case -USB_ERR_TIMEOUT: + err = -ETIMEDOUT; + break; + + default: + break; + } + return err; +} + +static int usbhost_open(FAR struct inode *inode); +static int usbhost_close(FAR struct inode *inode); +static ssize_t usbhost_read(FAR struct inode *inode, unsigned char *buffer, + blkcnt_t startsector, unsigned int nsectors); +static ssize_t usbhost_write(FAR struct inode *inode, + FAR const unsigned char *buffer, + blkcnt_t startsector, unsigned int nsectors); +static int usbhost_geometry(FAR struct inode *inode, + FAR struct geometry *geometry); +static int usbhost_ioctl(FAR struct inode *inode, int cmd, unsigned long arg); +/* Block driver operations. This is the interface exposed to NuttX by the + * class that permits it to behave like a block driver. + */ + +static const struct block_operations g_bops = { + usbhost_open, /* open */ + usbhost_close, /* close */ + usbhost_read, /* read */ + usbhost_write, /* write */ + usbhost_geometry, /* geometry */ + usbhost_ioctl /* ioctl */ +}; + +static int usbhost_open(FAR struct inode *inode) +{ + struct usbh_msc *msc_class; + + DEBUGASSERT(inode->i_private); + msc_class = (struct usbh_msc *)inode->i_private; + + if (usbh_msc_scsi_init(msc_class) < 0) { + return -ENODEV; + } + + return OK; +} + +static int usbhost_close(FAR struct inode *inode) +{ + DEBUGASSERT(inode->i_private); + return 0; +} + +static ssize_t usbhost_read(FAR struct inode *inode, unsigned char *buffer, + blkcnt_t startsector, unsigned int nsectors) +{ + struct usbh_msc *msc_class; + int ret; + + DEBUGASSERT(inode->i_private); + msc_class = (struct usbh_msc *)inode->i_private; + + ret = usbh_msc_scsi_read10(msc_class, startsector, (uint8_t *)buffer, nsectors); + if (ret < 0) { + return nuttx_errorcode(ret); + } else { +#if defined(CONFIG_ARCH_DCACHE) && !defined(CONFIG_USB_DCACHE_ENABLE) + up_invalidate_dcache((uintptr_t)buffer, (uintptr_t)(buffer + nsectors * msc_class->blocksize)); +#endif + return nsectors; + } +} + +static ssize_t usbhost_write(FAR struct inode *inode, + FAR const unsigned char *buffer, + blkcnt_t startsector, unsigned int nsectors) +{ + struct usbh_msc *msc_class; + int ret; + + DEBUGASSERT(inode->i_private); + msc_class = (struct usbh_msc *)inode->i_private; + +#if defined(CONFIG_ARCH_DCACHE) && !defined(CONFIG_USB_DCACHE_ENABLE) + up_clean_dcache((uintptr_t)buffer, (uintptr_t)(buffer + nsectors * msc_class->blocksize)); +#endif + ret = usbh_msc_scsi_write10(msc_class, startsector, (uint8_t *)buffer, nsectors); + if (ret < 0) { + return nuttx_errorcode(ret); + } else { + return nsectors; + } +} + +static int usbhost_geometry(FAR struct inode *inode, + FAR struct geometry *geometry) +{ + struct usbh_msc *msc_class; + + DEBUGASSERT(inode->i_private); + msc_class = (struct usbh_msc *)inode->i_private; + + if (msc_class->hport && msc_class->hport->connected) { + memset(geometry, 0, sizeof(*geometry)); + + geometry->geo_available = true; + geometry->geo_mediachanged = false; + geometry->geo_writeenabled = true; + geometry->geo_nsectors = msc_class->blocknum; + geometry->geo_sectorsize = msc_class->blocksize; + + USB_LOG_DBG("nsectors: %ld, sectorsize: %ld\n", + geometry->geo_nsectors, geometry->geo_sectorsize); + return OK; + } else { + return -ENODEV; + } + + return 0; +} + +static int usbhost_ioctl(FAR struct inode *inode, int cmd, unsigned long arg) +{ + struct usbh_msc *msc_class; + + DEBUGASSERT(inode->i_private); + msc_class = (struct usbh_msc *)inode->i_private; + + if (msc_class->hport && msc_class->hport->connected) { + return -ENOTTY; + } else { + return -ENODEV; + } + + return 0; +} + +void usbh_msc_run(struct usbh_msc *msc_class) +{ + char devname[32]; + + snprintf(devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, msc_class->sdchar); + + register_blockdriver(devname, &g_bops, 0, msc_class); +} + +void usbh_msc_stop(struct usbh_msc *msc_class) +{ + char devname[32]; + + snprintf(devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, msc_class->sdchar); + + unregister_blockdriver(devname); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/nuttx/usbh_net.c b/src/lib/CherryUSB/platform/nuttx/usbh_net.c new file mode 100644 index 000000000..c7af90f99 --- /dev/null +++ b/src/lib/CherryUSB/platform/nuttx/usbh_net.c @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include + +#include "usbh_core.h" + +#if CONFIG_NET_ETH_PKTSIZE < 1514 +#error "CONFIG_NET_ETH_PKTSIZE must be at least 1514" +#endif + +#if CONFIG_IOB_BUFSIZE < 1514 +#error "CONFIG_IOB_BUFSIZE must be at least 1514" +#endif + +#ifndef CONFIG_NETDEV_LATEINIT +#error "CONFIG_NETDEV_LATEINIT must be enabled" +#endif + +#ifndef CONFIG_NETUTILS_DHCPC +#error "CONFIG_NETUTILS_DHCPC must be enabled" +#endif + +#ifndef CONFIG_NETINIT_DHCPC +#error "CONFIG_NETINIT_DHCPC must be enabled" +#endif + +// #define CONFIG_USBHOST_PLATFORM_CDC_ECM +#define CONFIG_USBHOST_PLATFORM_CDC_RNDIS +// #define CONFIG_USBHOST_PLATFORM_CDC_NCM +// #define CONFIG_USBHOST_PLATFORM_ASIX +// #define CONFIG_USBHOST_PLATFORM_RTL8152 + +struct usbh_net { + struct net_driver_s netdev; + struct work_s txpollwork; + bool linkup; +}; + +void usbh_net_eth_output_common(struct net_driver_s *dev, uint8_t *buf) +{ + usb_memcpy(buf, dev->d_buf, dev->d_len); +} + +void usbh_net_eth_input_common(struct net_driver_s *dev, uint8_t *buf, size_t len, uint8_t* (*eth_input)(void), int (*eth_output)(uint32_t buflen)) +{ + FAR struct eth_hdr_s *hdr; + + net_lock(); + + NETDEV_RXPACKETS(dev); + + /* Any ACK or other response packet generated by the network stack + * will always be shorter than the received packet, therefore it is + * safe to pass the received frame buffer directly. + */ + + dev->d_buf = buf; + dev->d_len = len; + + hdr = (FAR struct eth_hdr_s *)dev->d_buf; +#ifdef CONFIG_NET_IPv4 + if (hdr->type == HTONS(ETHTYPE_IP)) { + NETDEV_RXIPV4(dev); + + /* Receive an IPv4 packet from the network device */ + + ipv4_input(dev); + if (dev->d_len > 0) { + /* And send the packet */ + usbh_net_eth_output_common(dev, eth_input()); + eth_output(dev->d_len); + } + } else +#endif +#ifdef CONFIG_NET_IPv6 + if (hdr->type == HTONS(ETHTYPE_IP6)) { + NETDEV_RXIPV6(dev); + + /* Give the IPv6 packet to the network layer */ + + ipv6_input(dev); + + if (dev->d_len > 0) { + /* And send the packet */ + usbh_net_eth_output_common(dev, eth_input()); + eth_output(dev->d_len); + } + } else +#endif +#ifdef CONFIG_NET_ARP + if (hdr->type == HTONS(ETHTYPE_ARP)) { + NETDEV_RXARP(dev); + + arp_input(dev); + if (dev->d_len > 0) { + usbh_net_eth_output_common(dev, eth_input()); + eth_output(dev->d_len); + } + } else +#endif + { + NETDEV_RXDROPPED(dev); + } + + net_unlock(); +} + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_RNDIS +#include "usbh_rndis.h" + +struct usbh_net g_rndis_dev; + +static int rndis_ifup(struct net_driver_s *dev) +{ + printf("rndis if up\r\n"); + g_rndis_dev.linkup = true; + usb_osal_thread_create("usbh_rndis_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_rndis_rx_thread, NULL); + return OK; +} + +static int rndis_ifdown(struct net_driver_s *dev) +{ + printf("rndis if down\r\n"); + g_rndis_dev.linkup = false; + return OK; +} + +static int rndis_txpoll(struct net_driver_s *dev) +{ + usbh_net_eth_output_common(&g_rndis_dev.netdev, usbh_rndis_get_eth_txbuf()); + return usbh_rndis_eth_output(g_rndis_dev.netdev.d_len); +} + +static void rndis_txavail_work(void *arg) +{ + net_lock(); + + if (g_rndis_dev.linkup) { + devif_poll(&g_rndis_dev.netdev, rndis_txpoll); + } else { + } + + net_unlock(); +} + +static int rndis_txavail(struct net_driver_s *dev) +{ + if (work_available(&g_rndis_dev.txpollwork)) { + work_queue(LPWORK, &g_rndis_dev.txpollwork, rndis_txavail_work, NULL, 0); + } else { + return -1; + } + + return OK; +} + +void usbh_rndis_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_net_eth_input_common(&g_rndis_dev.netdev, buf, buflen, usbh_rndis_get_eth_txbuf, usbh_rndis_eth_output); +} + +void usbh_rndis_run(struct usbh_rndis *rndis_class) +{ + memset(&g_rndis_dev.netdev, 0, sizeof(struct net_driver_s)); + + g_rndis_dev.netdev.d_ifup = rndis_ifup; + g_rndis_dev.netdev.d_ifdown = rndis_ifdown; + g_rndis_dev.netdev.d_txavail = rndis_txavail; + g_rndis_dev.netdev.d_private = rndis_class; + + for (uint8_t j = 0; j < 6; j++) { + g_rndis_dev.netdev.d_mac.ether.ether_addr_octet[j] = rndis_class->mac[j]; + } + netdev_register(&g_rndis_dev.netdev, NET_LL_ETHERNET); + + netinit_bringup(); +} + +void usbh_rndis_stop(struct usbh_rndis *rndis_class) +{ +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/nuttx/usbh_serial.c b/src/lib/CherryUSB/platform/nuttx/usbh_serial.c new file mode 100644 index 000000000..1538714cd --- /dev/null +++ b/src/lib/CherryUSB/platform/nuttx/usbh_serial.c @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include + +#include "usbh_core.h" +#include "usbh_cdc_acm.h" + +#include + +#define DEV_FORMAT "/dev/ttyACM%d" + +#ifndef CONFIG_USBHOST_CDCACM_RXBUFSIZE +#define CONFIG_USBHOST_CDCACM_RXBUFSIZE 512 +#endif + +#ifndef CONFIG_USBHOST_CDCACM_TXBUFSIZE +#define CONFIG_USBHOST_CDCACM_TXBUFSIZE 512 +#endif + +struct usbhost_serial_s { + struct circbuf_s circ; + __attribute__((aligned(32))) uint8_t cache_rxbuffer[CONFIG_USBHOST_CDCACM_RXBUFSIZE]; + __attribute__((aligned(32))) uint8_t cache_txbuffer[CONFIG_USBHOST_CDCACM_TXBUFSIZE]; +}; + +static int nuttx_errorcode(int error) +{ + int err = 0; + + switch (error) { + case -USB_ERR_NOMEM: + err = -EIO; + break; + case -USB_ERR_INVAL: + err = -EINVAL; + break; + case -USB_ERR_NODEV: + err = -ENODEV; + break; + case -USB_ERR_NOTCONN: + err = -ENOTCONN; + break; + case -USB_ERR_NOTSUPP: + err = -EIO; + break; + case -USB_ERR_BUSY: + err = -EBUSY; + break; + case -USB_ERR_RANGE: + err = -ERANGE; + break; + case -USB_ERR_STALL: + err = -EPERM; + break; + case -USB_ERR_NAK: + err = -EAGAIN; + break; + case -USB_ERR_DT: + err = -EIO; + break; + case -USB_ERR_IO: + err = -EIO; + break; + case -USB_ERR_SHUTDOWN: + err = -ESHUTDOWN; + break; + case -USB_ERR_TIMEOUT: + err = -ETIMEDOUT; + break; + + default: + break; + } + return err; +} + +/* Character driver methods */ + +static int usbhost_open(FAR struct file *filep); +static int usbhost_close(FAR struct file *filep); +static ssize_t usbhost_read(FAR struct file *filep, FAR char *buffer, + size_t buflen); +static ssize_t usbhost_write(FAR struct file *filep, + FAR const char *buffer, size_t buflen); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct file_operations g_usbhostops = { + usbhost_open, /* open */ + usbhost_close, /* close */ + usbhost_read, /* read */ + usbhost_write, /* write */ + NULL, /* seek */ + NULL, /* ioctl */ + NULL, /* mmap */ + NULL, /* truncate */ + NULL /* poll */ +}; + +static int usbhost_open(FAR struct file *filep) +{ + struct usbh_cdc_acm *cdc_acm_class; + FAR struct inode *inode = filep->f_inode; + + DEBUGASSERT(inode->i_private); + cdc_acm_class = (struct usbh_cdc_acm *)inode->i_private; + + if (cdc_acm_class->hport && cdc_acm_class->hport->connected) { + return OK; + } else { + return -ENODEV; + } +} + +static int usbhost_close(FAR struct file *filep) +{ + FAR struct inode *inode = filep->f_inode; + + DEBUGASSERT(inode->i_private); + return 0; +} + +static ssize_t usbhost_read(FAR struct file *filep, FAR char *buffer, + size_t buflen) +{ + struct usbh_cdc_acm *cdc_acm_class; + FAR struct inode *inode = filep->f_inode; + struct usbhost_serial_s *serial; + __attribute__((aligned(32))) uint8_t cache_tempbuffer[512]; + int ret; + + DEBUGASSERT(inode->i_private || cdc_acm_class->user_data); + cdc_acm_class = (struct usbh_cdc_acm *)inode->i_private; + serial = cdc_acm_class->user_data; + + while (circbuf_used(&serial->circ) == 0) { + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cache_tempbuffer, cdc_acm_class->bulkin->wMaxPacketSize, 0xffffffff); + if (ret < 0) { + return nuttx_errorcode(ret); + } +#if defined(CONFIG_ARCH_DCACHE) && !defined(CONFIG_USB_DCACHE_ENABLE) + up_invalidate_dcache((uintptr_t)cache_tempbuffer, (uintptr_t)(cache_tempbuffer + cdc_acm_class->bulkin->wMaxPacketSize)); +#endif + circbuf_overwrite(&serial->circ, cache_tempbuffer, USB_ALIGN_UP(ret, 64)); + } + return circbuf_read(&serial->circ, buffer, buflen); +} + +static ssize_t usbhost_write(FAR struct file *filep, FAR const char *buffer, + size_t buflen) +{ + struct usbh_cdc_acm *cdc_acm_class; + FAR struct inode *inode = filep->f_inode; + struct usbhost_serial_s *serial; + int ret; + + DEBUGASSERT(inode->i_private || cdc_acm_class->user_data); + cdc_acm_class = (struct usbh_cdc_acm *)inode->i_private; + serial = cdc_acm_class->user_data; + +#ifdef CONFIG_ARCH_DCACHE + uint32_t write_len = 0; + + while (write_len < buflen) { + uint32_t len = buflen - write_len; + if (len > CONFIG_USBHOST_CDCACM_TXBUFSIZE) { + len = CONFIG_USBHOST_CDCACM_TXBUFSIZE; + } + memcpy(serial->cache_txbuffer, buffer + write_len, len); +#ifndef CONFIG_USB_DCACHE_ENABLE + up_clean_dcache((uintptr_t)serial->cache_txbuffer, (uintptr_t)(serial->cache_txbuffer + USB_ALIGN_UP(len, 64))); +#endif + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, serial->cache_txbuffer, len, 0xffffffff); + if (ret < 0) { + return nuttx_errorcode(ret); + } else { + write_len += len; + } + } + return buflen; +#else + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, (uint8_t *)buffer, buflen, 0xffffffff); + if (ret < 0) { + return nuttx_errorcode(ret); + } else { + return buflen; + } +#endif +} + +void usbh_cdc_acm_run(struct usbh_cdc_acm *cdc_acm_class) +{ + char devname[32]; + struct usbhost_serial_s *serial; + + snprintf(devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, cdc_acm_class->minor); + + serial = kmm_malloc(sizeof(struct usbhost_serial_s)); + DEBUGASSERT(serial); + + memset(serial, 0, sizeof(struct usbhost_serial_s)); + + circbuf_init(&serial->circ, serial->cache_rxbuffer, CONFIG_USBHOST_CDCACM_RXBUFSIZE); + + cdc_acm_class->user_data = serial; + + struct cdc_line_coding linecoding; + + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_cdc_acm_set_line_coding(cdc_acm_class, &linecoding); + usbh_cdc_acm_set_line_state(cdc_acm_class, true, false); + + register_driver(devname, &g_usbhostops, 0666, cdc_acm_class); +} + +void usbh_cdc_acm_stop(struct usbh_cdc_acm *cdc_acm_class) +{ + char devname[32]; + struct usbhost_serial_s *serial; + + snprintf(devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, cdc_acm_class->minor); + unregister_driver(devname); + + serial = cdc_acm_class->user_data; + + kmm_free(serial); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/qmk/.gitkeep b/src/lib/CherryUSB/platform/qmk/.gitkeep new file mode 100644 index 000000000..91fe8b9b0 --- /dev/null +++ b/src/lib/CherryUSB/platform/qmk/.gitkeep @@ -0,0 +1 @@ +TODO Release \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/rtthread/usb_check.c b/src/lib/CherryUSB/platform/rtthread/usb_check.c new file mode 100644 index 000000000..154d89f0b --- /dev/null +++ b/src/lib/CherryUSB/platform/rtthread/usb_check.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022 ~ 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "rtthread.h" +#include "usb_config.h" + +#if defined(PKG_CHERRYUSB_HOST) || defined(RT_CHERRYUSB_HOST) + +#ifndef RT_USING_TIMER_SOFT +#error must enable RT_USING_TIMER_SOFT to support timer callback in thread +#endif + +#if RT_TIMER_THREAD_STACK_SIZE < 1024 +#error "RT_TIMER_THREAD_STACK_SIZE must be >= 1024" +#endif +#endif + +#if defined(ARCH_ARM_CORTEX_M7) || \ + defined(ARCH_ARM_CORTEX_A) || \ + defined(ARCH_RISCV64) || \ + defined(SOC_HPM6200) || defined(SOC_HPM6300) || defined(SOC_HPM6700) || defined(SOC_HPM6800) || \ + defined(SOC_HPM6E00) || defined(SOC_HPM6P00) || \ + defined(BSP_USING_BL61X) || defined(BSP_USING_BL808) +#ifndef RT_USING_CACHE +#error RT_USING_CACHE must be enabled in this chip +#endif +#endif + +#ifdef RT_USING_CACHE +#ifndef CONFIG_USB_DCACHE_ENABLE +#error CONFIG_USB_DCACHE_ENABLE must be enabled if you do not config nocache ram +#endif +#endif diff --git a/src/lib/CherryUSB/platform/rtthread/usb_msh.c b/src/lib/CherryUSB/platform/rtthread/usb_msh.c new file mode 100644 index 000000000..a153ed053 --- /dev/null +++ b/src/lib/CherryUSB/platform/rtthread/usb_msh.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "rtthread.h" + +#if defined(PKG_CHERRYUSB_HOST) || defined(RT_CHERRYUSB_HOST) + +#include "usbh_core.h" + +int usbh_init(int argc, char **argv) +{ + uint8_t busid; + uint32_t reg_base; + + if (argc < 3) { + USB_LOG_ERR("please input correct command: usbh_init \r\n"); + return -1; + } + + busid = atoi(argv[1]); + reg_base = strtoll(argv[2], NULL, 16); + usbh_initialize(busid, reg_base); + + return 0; +} + +int usbh_deinit(int argc, char **argv) +{ + uint8_t busid; + + if (argc < 2) { + USB_LOG_ERR("please input correct command: usbh_deinit \r\n"); + return -1; + } + + busid = atoi(argv[1]); + usbh_deinitialize(busid); + + return 0; +} + +MSH_CMD_EXPORT(usbh_init, init usb host); +MSH_CMD_EXPORT(usbh_deinit, deinit usb host); +MSH_CMD_EXPORT(lsusb, ls usb devices); +#endif diff --git a/src/lib/CherryUSB/platform/rtthread/usbd_adb_shell.c b/src/lib/CherryUSB/platform/rtthread/usbd_adb_shell.c new file mode 100644 index 000000000..4ab7f59af --- /dev/null +++ b/src/lib/CherryUSB/platform/rtthread/usbd_adb_shell.c @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include + +#include "usbd_core.h" +#include "usbd_adb.h" + +#ifndef CONFIG_USBDEV_SHELL_RX_BUFSIZE +#define CONFIG_USBDEV_SHELL_RX_BUFSIZE (2048) +#endif + +struct usbd_adb_shell { + struct rt_device parent; + usb_osal_sem_t tx_done; + struct rt_ringbuffer rx_rb; + rt_uint8_t rx_rb_buffer[CONFIG_USBDEV_SHELL_RX_BUFSIZE]; +} g_usbd_adb_shell; + +void usbd_adb_notify_shell_read(uint8_t *data, uint32_t len) +{ + rt_ringbuffer_put(&g_usbd_adb_shell.rx_rb, data, len); + + if (g_usbd_adb_shell.parent.rx_indicate) { + g_usbd_adb_shell.parent.rx_indicate(&g_usbd_adb_shell.parent, len); + } +} + +void usbd_adb_notify_write_done(void) +{ + if (g_usbd_adb_shell.tx_done) { + usb_osal_sem_give(g_usbd_adb_shell.tx_done); + } +} + +static rt_err_t usbd_adb_shell_open(struct rt_device *dev, rt_uint16_t oflag) +{ + while (!usb_device_is_configured(0)) { + rt_thread_mdelay(10); + } + return RT_EOK; +} + +static rt_err_t usbd_adb_shell_close(struct rt_device *dev) +{ + if (g_usbd_adb_shell.tx_done) { + usb_osal_sem_give(g_usbd_adb_shell.tx_done); + } + + return RT_EOK; +} + +static rt_ssize_t usbd_adb_shell_read(struct rt_device *dev, + rt_off_t pos, + void *buffer, + rt_size_t size) +{ + return rt_ringbuffer_get(&g_usbd_adb_shell.rx_rb, (rt_uint8_t *)buffer, size); +} + +static rt_ssize_t usbd_adb_shell_write(struct rt_device *dev, + rt_off_t pos, + const void *buffer, + rt_size_t size) +{ + int ret = 0; + + RT_ASSERT(dev != RT_NULL); + + if (!usb_device_is_configured(0)) { + return size; + } + + if (usbd_adb_can_write() && size) { + usb_osal_sem_reset(g_usbd_adb_shell.tx_done); + usbd_abd_write(ADB_SHELL_LOALID, buffer, size); + usb_osal_sem_take(g_usbd_adb_shell.tx_done, 0xffffffff); + } + + return size; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops usbd_adb_shell_ops = { + NULL, + usbd_adb_shell_open, + usbd_adb_shell_close, + usbd_adb_shell_read, + usbd_adb_shell_write, + NULL +}; +#endif + +void usbd_adb_shell_init(uint8_t in_ep, uint8_t out_ep) +{ + rt_err_t ret; + struct rt_device *device; + + device = &(g_usbd_adb_shell.parent); + + device->type = RT_Device_Class_Char; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = &usbd_adb_shell_ops; +#else + device->init = NULL; + device->open = usbd_adb_shell_open; + device->close = usbd_adb_shell_close; + device->read = usbd_adb_shell_read; + device->write = usbd_adb_shell_write; + device->control = NULL; +#endif + device->user_data = NULL; + + /* register a character device */ + ret = rt_device_register(device, "adb-sh", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE); + +#ifdef RT_USING_POSIX_DEVIO + /* set fops */ + device->fops = NULL; +#endif + + g_usbd_adb_shell.tx_done = usb_osal_sem_create(0); + rt_ringbuffer_init(&g_usbd_adb_shell.rx_rb, g_usbd_adb_shell.rx_rb_buffer, sizeof(g_usbd_adb_shell.rx_rb_buffer)); +} + +static int adb_enter(int argc, char **argv) +{ + (void)argc; + (void)argv; + + finsh_set_device("adb-sh"); + rt_console_set_device("adb-sh"); + + return 0; +} +MSH_CMD_EXPORT(adb_enter, adb_enter); + +static int adb_exit(int argc, char **argv) +{ + (void)argc; + (void)argv; + + usbd_adb_close(ADB_SHELL_LOALID); + + finsh_set_device(RT_CONSOLE_DEVICE_NAME); + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); + + return 0; +} +MSH_CMD_EXPORT(adb_exit, adb_exit); diff --git a/src/lib/CherryUSB/platform/rtthread/usbd_serial.c b/src/lib/CherryUSB/platform/rtthread/usbd_serial.c new file mode 100644 index 000000000..2f6d484bc --- /dev/null +++ b/src/lib/CherryUSB/platform/rtthread/usbd_serial.c @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include + +#include "usbd_core.h" +#include "usbd_cdc_acm.h" + +#define DEV_FORMAT_CDC_ACM "usb-acm%d" + +#ifndef CONFIG_USBDEV_MAX_CDC_ACM_CLASS +#define CONFIG_USBDEV_MAX_CDC_ACM_CLASS (4) +#endif + +#ifndef CONFIG_USBDEV_SERIAL_RX_BUFSIZE +#define CONFIG_USBDEV_SERIAL_RX_BUFSIZE (2048) +#endif + +struct usbd_serial { + struct rt_device parent; + uint8_t busid; + uint8_t in_ep; + uint8_t out_ep; + struct usbd_interface intf_ctrl; + struct usbd_interface intf_data; + usb_osal_sem_t tx_done; + uint8_t minor; + char name[32]; + struct rt_ringbuffer rx_rb; + rt_uint8_t rx_rb_buffer[CONFIG_USBDEV_SERIAL_RX_BUFSIZE]; +}; + +static uint32_t g_devinuse = 0; + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_usbd_serial_cdc_acm_rx_buf[CONFIG_USBDEV_MAX_CDC_ACM_CLASS][USB_ALIGN_UP(512, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbd_serial g_usbd_serial_cdc_acm[CONFIG_USBDEV_MAX_CDC_ACM_CLASS]; + +static struct usbd_serial *usbd_serial_alloc(void) +{ + uint8_t devno; + struct usbd_serial *serial; + + for (devno = 0; devno < CONFIG_USBDEV_MAX_CDC_ACM_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + + serial = &g_usbd_serial_cdc_acm[devno]; + memset(serial, 0, sizeof(struct usbd_serial)); + serial->minor = devno; + snprintf(serial->name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT_CDC_ACM, serial->minor); + return serial; + } + } + return NULL; +} + +static void usbd_serial_free(struct usbd_serial *serial) +{ + uint8_t devno = serial->minor; + + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + memset(serial, 0, sizeof(struct usbd_serial)); +} + +static rt_err_t usbd_serial_open(struct rt_device *dev, rt_uint16_t oflag) +{ + struct usbd_serial *serial; + + RT_ASSERT(dev != RT_NULL); + + serial = (struct usbd_serial *)dev; + + while(!usb_device_is_configured(serial->busid)) { + rt_thread_mdelay(10); + } + + usbd_ep_start_read(serial->busid, serial->out_ep, + g_usbd_serial_cdc_acm_rx_buf[serial->minor], + usbd_get_ep_mps(serial->busid, serial->out_ep)); + return RT_EOK; +} + +static rt_ssize_t usbd_serial_read(struct rt_device *dev, + rt_off_t pos, + void *buffer, + rt_size_t size) +{ + struct usbd_serial *serial; + + RT_ASSERT(dev != RT_NULL); + + serial = (struct usbd_serial *)dev; + + if (!usb_device_is_configured(serial->busid)) { + return -RT_EPERM; + } + + return rt_ringbuffer_get(&serial->rx_rb, (rt_uint8_t *)buffer, size); +} + +static rt_ssize_t usbd_serial_write(struct rt_device *dev, + rt_off_t pos, + const void *buffer, + rt_size_t size) +{ + struct usbd_serial *serial; + int ret = 0; + rt_uint8_t *align_buf; + + RT_ASSERT(dev != RT_NULL); + + serial = (struct usbd_serial *)dev; + + if (!usb_device_is_configured(serial->busid)) { + return -RT_EPERM; + } + align_buf = (rt_uint8_t *)buffer; + + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { + align_buf = rt_malloc_align(USB_ALIGN_UP(size, CONFIG_USB_ALIGN_SIZE), CONFIG_USB_ALIGN_SIZE); + if (!align_buf) { + USB_LOG_ERR("serial get align buf failed\n"); + return 0; + } + + usb_memcpy(align_buf, buffer, size); + } + + usb_osal_sem_reset(serial->tx_done); + usbd_ep_start_write(serial->busid, serial->in_ep, align_buf, size); + ret = usb_osal_sem_take(serial->tx_done, 3000); + if (ret < 0) { + USB_LOG_ERR("serial write timeout\n"); + ret = -RT_ETIMEOUT; + } else { + ret = size; + } + + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { + rt_free_align(align_buf); + } + + return ret; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops usbd_serial_ops = { + NULL, + usbd_serial_open, + NULL, + usbd_serial_read, + usbd_serial_write, + NULL +}; +#endif + +rt_err_t usbd_serial_register(struct usbd_serial *serial, + void *data) +{ + rt_err_t ret; + struct rt_device *device; + RT_ASSERT(serial != RT_NULL); + + device = &(serial->parent); + + device->type = RT_Device_Class_Char; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = &usbd_serial_ops; +#else + device->init = NULL; + device->open = usbd_serial_open; + device->close = NULL; + device->read = usbd_serial_read; + device->write = usbd_serial_write; + device->control = NULL; +#endif + device->user_data = data; + + /* register a character device */ + ret = rt_device_register(device, serial->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_REMOVABLE); + +#ifdef RT_USING_POSIX_DEVIO + /* set fops */ + device->fops = NULL; +#endif + rt_ringbuffer_init(&serial->rx_rb, serial->rx_rb_buffer, sizeof(serial->rx_rb_buffer)); + + return ret; +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + struct usbd_serial *serial; + + for (uint8_t devno = 0; devno < CONFIG_USBDEV_MAX_CDC_ACM_CLASS; devno++) { + serial = &g_usbd_serial_cdc_acm[devno]; + if (serial->out_ep == ep) { + rt_ringbuffer_put(&serial->rx_rb, g_usbd_serial_cdc_acm_rx_buf[serial->minor], nbytes); + usbd_ep_start_read(serial->busid, serial->out_ep, + g_usbd_serial_cdc_acm_rx_buf[serial->minor], + usbd_get_ep_mps(serial->busid, serial->out_ep)); + + if (serial->parent.rx_indicate) { + serial->parent.rx_indicate(&serial->parent, nbytes); + } + break; + } + } +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + struct usbd_serial *serial; + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, ep, NULL, 0); + } else { + for (uint8_t devno = 0; devno < CONFIG_USBDEV_MAX_CDC_ACM_CLASS; devno++) { + serial = &g_usbd_serial_cdc_acm[devno]; + if ((serial->in_ep == ep) && serial->tx_done) { + usb_osal_sem_give(serial->tx_done); + break; + } + } + } +} + +void usbd_cdc_acm_serial_init(uint8_t busid, uint8_t in_ep, uint8_t out_ep) +{ + struct usbd_serial *serial; + + struct usbd_endpoint cdc_out_ep = { + .ep_addr = out_ep, + .ep_cb = usbd_cdc_acm_bulk_out + }; + + struct usbd_endpoint cdc_in_ep = { + .ep_addr = in_ep, + .ep_cb = usbd_cdc_acm_bulk_in + }; + + serial = usbd_serial_alloc(); + if (serial == NULL) { + USB_LOG_ERR("No more serial device available\n"); + return; + } + + serial->busid = busid; + serial->in_ep = in_ep; + serial->out_ep = out_ep; + serial->tx_done = usb_osal_sem_create(0); + + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &serial->intf_ctrl)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &serial->intf_data)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + + if (usbd_serial_register(serial, NULL) != RT_EOK) { + USB_LOG_ERR("Failed to register serial device\n"); + usbd_serial_free(serial); + return; + } + + USB_LOG_INFO("USB CDC ACM Serial Device %s initialized\n", serial->name); +} diff --git a/src/lib/CherryUSB/platform/rtthread/usbh_dfs.c b/src/lib/CherryUSB/platform/rtthread/usbh_dfs.c new file mode 100644 index 000000000..778466652 --- /dev/null +++ b/src/lib/CherryUSB/platform/rtthread/usbh_dfs.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_msc.h" + +#include "rtthread.h" +#include + +#define DEV_FORMAT "/dev/sd%c" + +#ifndef RT_USING_DFS_ELMFAT +#error "RT_USING_DFS_ELMFAT must be enabled to use USB mass storage device" +#endif + +#ifndef CONFIG_USB_DFS_MOUNT_POINT +#define CONFIG_USB_DFS_MOUNT_POINT "/" +#endif + +static rt_err_t rt_udisk_init(rt_device_t dev) +{ + struct usbh_msc *msc_class = (struct usbh_msc *)dev->user_data; + + if (usbh_msc_scsi_init(msc_class) < 0) { + return -RT_ERROR; + } + + return RT_EOK; +} + +static rt_ssize_t rt_udisk_read(rt_device_t dev, rt_off_t pos, void *buffer, + rt_size_t size) +{ + struct usbh_msc *msc_class = (struct usbh_msc *)dev->user_data; + int ret; + rt_uint8_t *align_buf; + + align_buf = (rt_uint8_t *)buffer; + + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { + align_buf = rt_malloc_align(size * msc_class->blocksize, CONFIG_USB_ALIGN_SIZE); + if (!align_buf) { + rt_kprintf("msc get align buf failed\n"); + return 0; + } + } else { + } + + ret = usbh_msc_scsi_read10(msc_class, pos, (uint8_t *)align_buf, size); + if (ret < 0) { + rt_kprintf("usb mass_storage read failed\n"); + return 0; + } + + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { + usb_memcpy(buffer, align_buf, size * msc_class->blocksize); + rt_free_align(align_buf); + } + + return size; +} + +static rt_ssize_t rt_udisk_write(rt_device_t dev, rt_off_t pos, const void *buffer, + rt_size_t size) +{ + struct usbh_msc *msc_class = (struct usbh_msc *)dev->user_data; + int ret; + rt_uint8_t *align_buf; + + align_buf = (rt_uint8_t *)buffer; + + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { + align_buf = rt_malloc_align(size * msc_class->blocksize, CONFIG_USB_ALIGN_SIZE); + if (!align_buf) { + rt_kprintf("msc get align buf failed\n"); + return 0; + } + + usb_memcpy(align_buf, buffer, size * msc_class->blocksize); + } + + ret = usbh_msc_scsi_write10(msc_class, pos, (uint8_t *)align_buf, size); + if (ret < 0) { + rt_kprintf("usb mass_storage write failed\n"); + return 0; + } + + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { + rt_free_align(align_buf); + } + + return size; +} + +static rt_err_t rt_udisk_control(rt_device_t dev, int cmd, void *args) +{ + /* check parameter */ + RT_ASSERT(dev != RT_NULL); + struct usbh_msc *msc_class = (struct usbh_msc *)dev->user_data; + + if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME) { + struct rt_device_blk_geometry *geometry; + + geometry = (struct rt_device_blk_geometry *)args; + if (geometry == RT_NULL) + return -RT_ERROR; + + geometry->bytes_per_sector = msc_class->blocksize; + geometry->block_size = msc_class->blocksize; + geometry->sector_count = msc_class->blocknum; + } + + return RT_EOK; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops udisk_device_ops = { + rt_udisk_init, + RT_NULL, + RT_NULL, + rt_udisk_read, + rt_udisk_write, + rt_udisk_control +}; +#endif + +static void usbh_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) +{ + struct usbh_msc *msc_class = (struct usbh_msc *)CONFIG_USB_OSAL_THREAD_GET_ARGV; + char name[CONFIG_USBHOST_DEV_NAMELEN]; + char mount_point[CONFIG_USBHOST_DEV_NAMELEN]; + int ret; + + snprintf(name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, msc_class->sdchar); + snprintf(mount_point, CONFIG_USBHOST_DEV_NAMELEN, CONFIG_USB_DFS_MOUNT_POINT, msc_class->sdchar); + + ret = dfs_mount(name, mount_point, "elm", 0, 0); + if (ret == 0) { + rt_kprintf("udisk: %s mount successfully\n", name); + } else { + rt_kprintf("udisk: %s mount failed, ret = %d\n", name, ret); + } + + usb_osal_thread_delete(NULL); +} + +void usbh_msc_run(struct usbh_msc *msc_class) +{ + struct rt_device *dev; + char name[CONFIG_USBHOST_DEV_NAMELEN]; + + dev = rt_malloc(sizeof(struct rt_device)); + memset(dev, 0, sizeof(struct rt_device)); + + snprintf(name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, msc_class->sdchar); + + dev->type = RT_Device_Class_Block; +#ifdef RT_USING_DEVICE_OPS + dev->ops = &udisk_device_ops; +#else + dev->init = rt_udisk_init; + dev->read = rt_udisk_read; + dev->write = rt_udisk_write; + dev->control = rt_udisk_control; +#endif + dev->user_data = msc_class; + + rt_device_register(dev, name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); + + usb_osal_thread_create("usbh_msc", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_msc_thread, msc_class); +} + +void usbh_msc_stop(struct usbh_msc *msc_class) +{ + struct rt_device *dev; + + char name[CONFIG_USBHOST_DEV_NAMELEN]; + char mount_point[CONFIG_USBHOST_DEV_NAMELEN]; + + snprintf(name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, msc_class->sdchar); + snprintf(mount_point, CONFIG_USBHOST_DEV_NAMELEN, CONFIG_USB_DFS_MOUNT_POINT, msc_class->sdchar); + + dfs_unmount(mount_point); + dev = rt_device_find(name); + if (dev) { + rt_device_unregister(dev); + rt_free(dev); + } +} diff --git a/src/lib/CherryUSB/platform/rtthread/usbh_lwip.c b/src/lib/CherryUSB/platform/rtthread/usbh_lwip.c new file mode 100644 index 000000000..712847c45 --- /dev/null +++ b/src/lib/CherryUSB/platform/rtthread/usbh_lwip.c @@ -0,0 +1,461 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "netif/etharp.h" +#include "lwip/netif.h" +#include "lwip/pbuf.h" +#include "lwip/tcpip.h" +#if LWIP_DHCP +#include "lwip/dhcp.h" +#include "lwip/prot/dhcp.h" +#endif + +#include +#include +#include + +#include "usbh_core.h" + +#include "lwip/opt.h" + +#ifndef RT_USING_LWIP212 +#error must enable RT_USING_LWIP212 +#endif + +#ifndef LWIP_NO_RX_THREAD +#warning suggest you to enable LWIP_NO_RX_THREAD, we do not use rtthread eth rx thread +#endif + +#ifndef LWIP_NO_TX_THREAD +#warning suggest you to enable LWIP_NO_TX_THREAD, we do not use rtthread eth tx thread +#endif + +#if LWIP_TCPIP_CORE_LOCKING_INPUT != 1 +#warning suggest you to set LWIP_TCPIP_CORE_LOCKING_INPUT to 1 for better performance, usb handles eth input with own thread +#endif + +#if LWIP_TCPIP_CORE_LOCKING != 1 +#error must set LWIP_TCPIP_CORE_LOCKING to 1 +#endif + +#if PBUF_POOL_BUFSIZE < 1600 +#error PBUF_POOL_BUFSIZE must be larger than 1600 +#endif + +#if RT_LWIP_TCPTHREAD_STACKSIZE < 2048 +#error RT_LWIP_TCPTHREAD_STACKSIZE must be >= 2048 +#endif + +// #define CONFIG_USBHOST_PLATFORM_CDC_ECM +// #define CONFIG_USBHOST_PLATFORM_CDC_RNDIS +// #define CONFIG_USBHOST_PLATFORM_CDC_NCM +// #define CONFIG_USBHOST_PLATFORM_ASIX +// #define CONFIG_USBHOST_PLATFORM_RTL8152 + +void usbh_lwip_eth_output_common(struct pbuf *p, uint8_t *buf) +{ + struct pbuf *q; + uint8_t *buffer; + + buffer = buf; + for (q = p; q != NULL; q = q->next) { + usb_memcpy(buffer, q->payload, q->len); + buffer += q->len; + } +} + +void usbh_lwip_eth_input_common(struct netif *netif, uint8_t *buf, uint32_t len) +{ +#if LWIP_TCPIP_CORE_LOCKING_INPUT + pbuf_type type = PBUF_REF; +#else + pbuf_type type = PBUF_POOL; +#endif + err_t err; + struct pbuf *p; + + p = pbuf_alloc(PBUF_RAW, len, type); + if (p != NULL) { +#if LWIP_TCPIP_CORE_LOCKING_INPUT + p->payload = buf; +#else + usb_memcpy(p->payload, buf, len); +#endif + err = netif->input(p, netif); + if (err != ERR_OK) { + pbuf_free(p); + } + } else { + USB_LOG_ERR("No memory to alloc pbuf\r\n"); + } +} + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_ECM +#include "usbh_cdc_ecm.h" + +static struct eth_device g_cdc_ecm_dev; + +static rt_err_t rt_usbh_cdc_ecm_control(rt_device_t dev, int cmd, void *args) +{ + struct usbh_cdc_ecm *cdc_ecm_class = (struct usbh_cdc_ecm *)dev->user_data; + + switch (cmd) { + case NIOCTL_GADDR: + + /* get mac address */ + if (args) + rt_memcpy(args, cdc_ecm_class->mac, 6); + else + return -RT_ERROR; + + break; + + default: + break; + } + + return RT_EOK; +} + +static rt_err_t rt_usbh_cdc_ecm_eth_tx(rt_device_t dev, struct pbuf *p) +{ + int ret; + (void)dev; + + usbh_lwip_eth_output_common(p, usbh_cdc_ecm_get_eth_txbuf()); + ret = usbh_cdc_ecm_eth_output(p->tot_len); + if (ret < 0) { + return -RT_ERROR; + } else { + return RT_EOK; + } +} + +void usbh_cdc_ecm_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(g_cdc_ecm_dev.netif, buf, buflen); +} + +void usbh_cdc_ecm_run(struct usbh_cdc_ecm *cdc_ecm_class) +{ + memset(&g_cdc_ecm_dev, 0, sizeof(struct eth_device)); + + g_cdc_ecm_dev.parent.control = rt_usbh_cdc_ecm_control; + g_cdc_ecm_dev.eth_rx = NULL; + g_cdc_ecm_dev.eth_tx = rt_usbh_cdc_ecm_eth_tx; + g_cdc_ecm_dev.parent.user_data = cdc_ecm_class; + + eth_device_init(&g_cdc_ecm_dev, "u0"); + eth_device_linkchange(&g_cdc_ecm_dev, RT_TRUE); + + usb_osal_thread_create("usbh_cdc_ecm_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_cdc_ecm_rx_thread, NULL); +} + +void usbh_cdc_ecm_stop(struct usbh_cdc_ecm *cdc_ecm_class) +{ + (void)cdc_ecm_class; + + eth_device_deinit(&g_cdc_ecm_dev); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_RNDIS +#include "usbh_rndis.h" + +static struct eth_device g_rndis_dev; + +static rt_timer_t keep_timer = RT_NULL; + +static void rndis_dev_keepalive_timeout(void *parameter) +{ + struct usbh_rndis *rndis_class = (struct usbh_rndis *)parameter; + usbh_rndis_keepalive(rndis_class); +} + +static void timer_init(struct usbh_rndis *rndis_class) +{ + keep_timer = rt_timer_create("keep", + rndis_dev_keepalive_timeout, + rndis_class, + 5000, + RT_TIMER_FLAG_PERIODIC | + RT_TIMER_FLAG_SOFT_TIMER); + + rt_timer_start(keep_timer); +} + +static rt_err_t rt_usbh_rndis_control(rt_device_t dev, int cmd, void *args) +{ + struct usbh_rndis *rndis_class = (struct usbh_rndis *)dev->user_data; + + switch (cmd) { + case NIOCTL_GADDR: + + /* get mac address */ + if (args) + rt_memcpy(args, rndis_class->mac, 6); + else + return -RT_ERROR; + + break; + + default: + break; + } + + return RT_EOK; +} + +static rt_err_t rt_usbh_rndis_eth_tx(rt_device_t dev, struct pbuf *p) +{ + int ret; + (void)dev; + + usbh_lwip_eth_output_common(p, usbh_rndis_get_eth_txbuf()); + ret = usbh_rndis_eth_output(p->tot_len); + if (ret < 0) { + return -RT_ERROR; + } else { + return RT_EOK; + } +} + +void usbh_rndis_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(g_rndis_dev.netif, buf, buflen); +} + +void usbh_rndis_run(struct usbh_rndis *rndis_class) +{ + memset(&g_rndis_dev, 0, sizeof(struct eth_device)); + + g_rndis_dev.parent.control = rt_usbh_rndis_control; + g_rndis_dev.eth_rx = NULL; + g_rndis_dev.eth_tx = rt_usbh_rndis_eth_tx; + g_rndis_dev.parent.user_data = rndis_class; + + eth_device_init(&g_rndis_dev, "u2"); + eth_device_linkchange(&g_rndis_dev, RT_TRUE); + + usb_osal_thread_create("usbh_rndis_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_rndis_rx_thread, NULL); + //timer_init(rndis_class); +} + +void usbh_rndis_stop(struct usbh_rndis *rndis_class) +{ + (void)rndis_class; + + eth_device_deinit(&g_rndis_dev); + // rt_timer_stop(keep_timer); + // rt_timer_delete(keep_timer); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_CDC_NCM +#include "usbh_cdc_ncm.h" + +static struct eth_device g_cdc_ncm_dev; + +static rt_err_t rt_usbh_cdc_ncm_control(rt_device_t dev, int cmd, void *args) +{ + struct usbh_cdc_ncm *cdc_ncm_class = (struct usbh_cdc_ncm *)dev->user_data; + + switch (cmd) { + case NIOCTL_GADDR: + + /* get mac address */ + if (args) + rt_memcpy(args, cdc_ncm_class->mac, 6); + else + return -RT_ERROR; + + break; + + default: + break; + } + + return RT_EOK; +} + +static rt_err_t rt_usbh_cdc_ncm_eth_tx(rt_device_t dev, struct pbuf *p) +{ + int ret; + (void)dev; + + usbh_lwip_eth_output_common(p, usbh_cdc_ncm_get_eth_txbuf()); + ret = usbh_cdc_ncm_eth_output(p->tot_len); + if (ret < 0) { + return -RT_ERROR; + } else { + return RT_EOK; + } +} + +void usbh_cdc_ncm_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(g_cdc_ncm_dev.netif, buf, buflen); +} + +void usbh_cdc_ncm_run(struct usbh_cdc_ncm *cdc_ncm_class) +{ + memset(&g_cdc_ncm_dev, 0, sizeof(struct eth_device)); + + g_cdc_ncm_dev.parent.control = rt_usbh_cdc_ncm_control; + g_cdc_ncm_dev.eth_rx = NULL; + g_cdc_ncm_dev.eth_tx = rt_usbh_cdc_ncm_eth_tx; + g_cdc_ncm_dev.parent.user_data = cdc_ncm_class; + + eth_device_init(&g_cdc_ncm_dev, "u1"); + eth_device_linkchange(&g_cdc_ncm_dev, RT_TRUE); + + usb_osal_thread_create("usbh_cdc_ncm_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_cdc_ncm_rx_thread, NULL); +} + +void usbh_cdc_ncm_stop(struct usbh_cdc_ncm *cdc_ncm_class) +{ + (void)cdc_ncm_class; + + eth_device_deinit(&g_cdc_ncm_dev); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_ASIX +#include "usbh_asix.h" + +static struct eth_device g_asix_dev; + +static rt_err_t rt_usbh_asix_control(rt_device_t dev, int cmd, void *args) +{ + struct usbh_asix *asix_class = (struct usbh_asix *)dev->user_data; + + switch (cmd) { + case NIOCTL_GADDR: + + /* get mac address */ + if (args) + rt_memcpy(args, asix_class->mac, 6); + else + return -RT_ERROR; + + break; + + default: + break; + } + + return RT_EOK; +} + +static rt_err_t rt_usbh_asix_eth_tx(rt_device_t dev, struct pbuf *p) +{ + int ret; + (void)dev; + + usbh_lwip_eth_output_common(p, usbh_asix_get_eth_txbuf()); + ret = usbh_asix_eth_output(p->tot_len); + if (ret < 0) { + return -RT_ERROR; + } else { + return RT_EOK; + } +} + +void usbh_asix_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(g_asix_dev.netif, buf, buflen); +} + +void usbh_asix_run(struct usbh_asix *asix_class) +{ + memset(&g_asix_dev, 0, sizeof(struct eth_device)); + + g_asix_dev.parent.control = rt_usbh_asix_control; + g_asix_dev.eth_rx = NULL; + g_asix_dev.eth_tx = rt_usbh_asix_eth_tx; + g_asix_dev.parent.user_data = asix_class; + + eth_device_init(&g_asix_dev, "u3"); + eth_device_linkchange(&g_asix_dev, RT_TRUE); + + usb_osal_thread_create("usbh_asix_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_asix_rx_thread, NULL); +} + +void usbh_asix_stop(struct usbh_asix *asix_class) +{ + (void)asix_class; + + eth_device_deinit(&g_asix_dev); +} +#endif + +#ifdef CONFIG_USBHOST_PLATFORM_RTL8152 +#include "usbh_rtl8152.h" + +static struct eth_device g_rtl8152_dev; + +static rt_err_t rt_usbh_rtl8152_control(rt_device_t dev, int cmd, void *args) +{ + struct usbh_rtl8152 *rtl8152_class = (struct usbh_rtl8152 *)dev->user_data; + + switch (cmd) { + case NIOCTL_GADDR: + + /* get mac address */ + if (args) + rt_memcpy(args, rtl8152_class->mac, 6); + else + return -RT_ERROR; + + break; + + default: + break; + } + + return RT_EOK; +} + +static rt_err_t rt_usbh_rtl8152_eth_tx(rt_device_t dev, struct pbuf *p) +{ + int ret; + (void)dev; + + usbh_lwip_eth_output_common(p, usbh_rtl8152_get_eth_txbuf()); + ret = usbh_rtl8152_eth_output(p->tot_len); + if (ret < 0) { + return -RT_ERROR; + } else { + return RT_EOK; + } +} + +void usbh_rtl8152_eth_input(uint8_t *buf, uint32_t buflen) +{ + usbh_lwip_eth_input_common(g_rtl8152_dev.netif, buf, buflen); +} + +void usbh_rtl8152_run(struct usbh_rtl8152 *rtl8152_class) +{ + memset(&g_rtl8152_dev, 0, sizeof(struct eth_device)); + + g_rtl8152_dev.parent.control = rt_usbh_rtl8152_control; + g_rtl8152_dev.eth_rx = NULL; + g_rtl8152_dev.eth_tx = rt_usbh_rtl8152_eth_tx; + g_rtl8152_dev.parent.user_data = rtl8152_class; + + eth_device_init(&g_rtl8152_dev, "u4"); + eth_device_linkchange(&g_rtl8152_dev, RT_TRUE); + + usb_osal_thread_create("usbh_rtl8152_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_rtl8152_rx_thread, NULL); +} + +void usbh_rtl8152_stop(struct usbh_rtl8152 *rtl8152_class) +{ + (void)rtl8152_class; + + eth_device_deinit(&g_rtl8152_dev); +} +#endif diff --git a/src/lib/CherryUSB/platform/rtthread/usbh_serial.c b/src/lib/CherryUSB/platform/rtthread/usbh_serial.c new file mode 100644 index 000000000..912258e04 --- /dev/null +++ b/src/lib/CherryUSB/platform/rtthread/usbh_serial.c @@ -0,0 +1,899 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include + +#include "usbh_core.h" +#include "usbh_cdc_acm.h" +#include "usbh_ftdi.h" +#include "usbh_cp210x.h" +#include "usbh_ch34x.h" +#include "usbh_pl2303.h" + +#define DEV_FORMAT_VENDOR "ttyUSB%d" +#define DEV_FORMAT_CDC_ACM "ttyACM%d" + +#define USBH_RX_MAX_SIZE 2048 + +#ifndef CONFIG_USBHOST_MAX_VENDOR_SERIAL_CLASS +#define CONFIG_USBHOST_MAX_VENDOR_SERIAL_CLASS (4) +#endif + +#ifndef CONFIG_USBHOST_SERIAL_RX_BUFSIZE +#define CONFIG_USBHOST_SERIAL_RX_BUFSIZE (USBH_RX_MAX_SIZE * 2) +#endif + +enum usbh_serial_type { + USBH_SERIAL_TYPE_CDC_ACM = 0, + USBH_SERIAL_TYPE_FTDI, + USBH_SERIAL_TYPE_CP210X, + USBH_SERIAL_TYPE_CH34X, + USBH_SERIAL_TYPE_PL2303, +}; + +struct usbh_serial { + struct rt_device parent; + enum usbh_serial_type type; + uint8_t minor; + char name[CONFIG_USBHOST_DEV_NAMELEN]; + struct rt_ringbuffer rx_rb; + rt_uint8_t rx_rb_buffer[CONFIG_USBHOST_SERIAL_RX_BUFSIZE]; +}; + +static uint32_t g_devinuse_vendor = 0; +static uint32_t g_devinuse_cdc_acm = 0; + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_usbh_serial_vendor_rx_buf[CONFIG_USBHOST_MAX_VENDOR_SERIAL_CLASS][USB_ALIGN_UP(USBH_RX_MAX_SIZE, CONFIG_USB_ALIGN_SIZE)]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_usbh_serial_cdc_acm_rx_buf[CONFIG_USBHOST_MAX_CDC_ACM_CLASS][USB_ALIGN_UP(USBH_RX_MAX_SIZE, CONFIG_USB_ALIGN_SIZE)]; + +static struct usbh_serial *usbh_serial_alloc(uint8_t type) +{ + uint8_t devno; + struct usbh_serial *serial; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_VENDOR_SERIAL_CLASS; devno++) { + if ((g_devinuse_vendor & (1U << devno)) == 0) { + g_devinuse_vendor |= (1U << devno); + + serial = rt_malloc(sizeof(struct usbh_serial)); + memset(serial, 0, sizeof(struct usbh_serial)); + serial->type = type; + serial->minor = devno; + snprintf(serial->name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT_VENDOR, serial->minor); + return serial; + } + } + return NULL; +} + +static void usbh_serial_free(struct usbh_serial *serial) +{ + uint8_t devno = serial->minor; + + if (devno < 32) { + g_devinuse_vendor &= ~(1U << devno); + } + memset(serial, 0, sizeof(struct usbh_serial)); + rt_free(serial); +} + +static struct usbh_serial *usbh_serial_cdc_acm_alloc(uint8_t type) +{ + uint8_t devno; + struct usbh_serial *serial; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_CDC_ACM_CLASS; devno++) { + if ((g_devinuse_cdc_acm & (1U << devno)) == 0) { + g_devinuse_cdc_acm |= (1U << devno); + + serial = rt_malloc(sizeof(struct usbh_serial)); + memset(serial, 0, sizeof(struct usbh_serial)); + serial->type = type; + serial->minor = devno; + snprintf(serial->name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT_CDC_ACM, serial->minor); + return serial; + } + } + return NULL; +} + +static void usbh_serial_cdc_acm_free(struct usbh_serial *serial) +{ + uint8_t devno = serial->minor; + + if (devno < 32) { + g_devinuse_cdc_acm &= ~(1U << devno); + } + memset(serial, 0, sizeof(struct usbh_serial)); + rt_free(serial); +} + +static rt_err_t usbh_serial_open(struct rt_device *dev, rt_uint16_t oflag) +{ + struct usbh_serial *serial; + + RT_ASSERT(dev != RT_NULL); + + serial = (struct usbh_serial *)dev; + + switch (serial->type) { + case USBH_SERIAL_TYPE_CDC_ACM: + break; + case USBH_SERIAL_TYPE_FTDI: + break; + case USBH_SERIAL_TYPE_CP210X: + break; + case USBH_SERIAL_TYPE_CH34X: + break; + case USBH_SERIAL_TYPE_PL2303: + break; + + default: + break; + } + + return RT_EOK; +} + +static rt_err_t usbh_serial_close(struct rt_device *dev) +{ + struct usbh_serial *serial; + + RT_ASSERT(dev != RT_NULL); + + serial = (struct usbh_serial *)dev; + + switch (serial->type) { + case USBH_SERIAL_TYPE_CDC_ACM: + break; + case USBH_SERIAL_TYPE_FTDI: + break; + case USBH_SERIAL_TYPE_CP210X: + break; + case USBH_SERIAL_TYPE_CH34X: + break; + case USBH_SERIAL_TYPE_PL2303: + break; + + default: + break; + } + + return RT_EOK; +} + +static rt_ssize_t usbh_serial_read(struct rt_device *dev, + rt_off_t pos, + void *buffer, + rt_size_t size) +{ + struct usbh_serial *serial; + + RT_ASSERT(dev != RT_NULL); + + serial = (struct usbh_serial *)dev; + + return rt_ringbuffer_get(&serial->rx_rb, (rt_uint8_t *)buffer, size); +} + +static rt_ssize_t usbh_serial_write(struct rt_device *dev, + rt_off_t pos, + const void *buffer, + rt_size_t size) +{ + struct usbh_serial *serial; + int ret = 0; + rt_uint8_t *align_buf; + + RT_ASSERT(dev != RT_NULL); + + serial = (struct usbh_serial *)dev; + + align_buf = (rt_uint8_t *)buffer; + + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { + align_buf = rt_malloc_align(USB_ALIGN_UP(size, CONFIG_USB_ALIGN_SIZE), CONFIG_USB_ALIGN_SIZE); + if (!align_buf) { + USB_LOG_ERR("serial get align buf failed\n"); + return 0; + } + + usb_memcpy(align_buf, buffer, size); + } + + switch (serial->type) { +#if defined(PKG_CHERRYUSB_HOST_CDC_ACM) || defined(RT_CHERRYUSB_HOST_CDC_ACM) + case USBH_SERIAL_TYPE_CDC_ACM: + ret = usbh_cdc_acm_bulk_out_transfer((struct usbh_cdc_acm *)dev->user_data, (uint8_t *)align_buf, size, RT_WAITING_FOREVER); + if (ret < 0) { + USB_LOG_ERR("usbh_cdc_acm_bulk_out_transfer failed: %d\n", ret); + ret = 0; + } + break; +#endif +#if defined(PKG_CHERRYUSB_HOST_FTDI) || defined(RT_CHERRYUSB_HOST_FTDI) + case USBH_SERIAL_TYPE_FTDI: + ret = usbh_ftdi_bulk_out_transfer((struct usbh_ftdi *)dev->user_data, (uint8_t *)align_buf, size, RT_WAITING_FOREVER); + if (ret < 0) { + USB_LOG_ERR("usbh_ftdi_bulk_out_transfer failed: %d\n", ret); + ret = 0; + } + break; +#endif +#if defined(PKG_CHERRYUSB_HOST_CH34X) || defined(RT_CHERRYUSB_HOST_CH34X) + case USBH_SERIAL_TYPE_CH34X: + ret = usbh_ch34x_bulk_out_transfer((struct usbh_ch34x *)dev->user_data, (uint8_t *)align_buf, size, RT_WAITING_FOREVER); + if (ret < 0) { + USB_LOG_ERR("usbh_ch34x_bulk_out_transfer failed: %d\n", ret); + ret = 0; + } + break; +#endif +#if defined(PKG_CHERRYUSB_HOST_PL2303) || defined(RT_CHERRYUSB_HOST_PL2303) + case USBH_SERIAL_TYPE_PL2303: + ret = usbh_pl2303_bulk_out_transfer((struct usbh_pl2303 *)dev->user_data, (uint8_t *)align_buf, size, RT_WAITING_FOREVER); + if (ret < 0) { + USB_LOG_ERR("usbh_pl2303_bulk_out_transfer failed: %d\n", ret); + ret = 0; + } + break; +#endif + default: + break; + } + + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { + rt_free_align(align_buf); + } + + return ret; +} + +static rt_err_t usbh_serial_control(struct rt_device *dev, + int cmd, + void *args) +{ + struct usbh_serial *serial; + struct serial_configure *config; + struct cdc_line_coding line_coding; + int ret = -RT_EINVAL; + + RT_ASSERT(dev != RT_NULL); + + serial = (struct usbh_serial *)dev; + + switch (serial->type) { +#if defined(PKG_CHERRYUSB_HOST_CDC_ACM) || defined(RT_CHERRYUSB_HOST_CDC_ACM) + case USBH_SERIAL_TYPE_CDC_ACM: + if (cmd == RT_DEVICE_CTRL_CONFIG) { + struct usbh_cdc_acm *cdc_acm_class; + cdc_acm_class = (struct usbh_cdc_acm *)dev->user_data; + + config = (struct serial_configure *)args; + + line_coding.dwDTERate = config->baud_rate; + line_coding.bDataBits = config->data_bits; + line_coding.bCharFormat = 0; // STOP_BITS_1 + line_coding.bParityType = config->parity; + + usbh_cdc_acm_set_line_coding(cdc_acm_class, &line_coding); + } + + ret = RT_EOK; + break; +#endif +#if defined(PKG_CHERRYUSB_HOST_FTDI) || defined(RT_CHERRYUSB_HOST_FTDI) + case USBH_SERIAL_TYPE_FTDI: + if (cmd == RT_DEVICE_CTRL_CONFIG) { + struct usbh_ftdi *ftdi_class; + ftdi_class = (struct usbh_ftdi *)dev->user_data; + + config = (struct serial_configure *)args; + + line_coding.dwDTERate = config->baud_rate; + line_coding.bDataBits = config->data_bits; + line_coding.bCharFormat = 0; // STOP_BITS_1 + line_coding.bParityType = config->parity; + + usbh_ftdi_set_line_coding(ftdi_class, &line_coding); + } + + ret = RT_EOK; + break; +#endif +#if defined(PKG_CHERRYUSB_HOST_CP210X) || defined(RT_CHERRYUSB_HOST_CP210X) + case USBH_SERIAL_TYPE_CP210X: + if (cmd == RT_DEVICE_CTRL_CONFIG) { + struct usbh_cp210x *cp210x_class; + cp210x_class = (struct usbh_cp210x *)dev->user_data; + + config = (struct serial_configure *)args; + + line_coding.dwDTERate = config->baud_rate; + line_coding.bDataBits = config->data_bits; + line_coding.bCharFormat = 0; // STOP_BITS_1 + line_coding.bParityType = config->parity; + + usbh_cp210x_set_line_coding(cp210x_class, &line_coding); + } + + ret = RT_EOK; + break; +#endif +#if defined(PKG_CHERRYUSB_HOST_CH34X) || defined(RT_CHERRYUSB_HOST_CH34X) + case USBH_SERIAL_TYPE_CH34X: + if (cmd == RT_DEVICE_CTRL_CONFIG) { + struct usbh_ch34x *ch34x_class; + ch34x_class = (struct usbh_ch34x *)dev->user_data; + + config = (struct serial_configure *)args; + + line_coding.dwDTERate = config->baud_rate; + line_coding.bDataBits = config->data_bits; + line_coding.bCharFormat = 0; // STOP_BITS_1 + line_coding.bParityType = config->parity; + + usbh_ch34x_set_line_coding(ch34x_class, &line_coding); + } + + ret = RT_EOK; + break; +#endif +#if defined(PKG_CHERRYUSB_HOST_PL2303) || defined(RT_CHERRYUSB_HOST_PL2303) + case USBH_SERIAL_TYPE_PL2303: + if (cmd == RT_DEVICE_CTRL_CONFIG) { + struct usbh_pl2303 *pl2303_class; + pl2303_class = (struct usbh_pl2303 *)dev->user_data; + + config = (struct serial_configure *)args; + + line_coding.dwDTERate = config->baud_rate; + line_coding.bDataBits = config->data_bits; + line_coding.bCharFormat = 0; // STOP_BITS_1 + line_coding.bParityType = config->parity; + + usbh_pl2303_set_line_coding(pl2303_class, &line_coding); + } + + ret = RT_EOK; + break; +#endif + default: + break; + } + + return ret; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops usbh_serial_ops = { + NULL, + usbh_serial_open, + usbh_serial_close, + usbh_serial_read, + usbh_serial_write, + usbh_serial_control +}; +#endif + +#ifdef RT_USING_POSIX_DEVIO +#include +#include +#include +#include +#include + +#ifdef RT_USING_POSIX_TERMIOS +#include +#endif + +static rt_err_t usbh_serial_fops_rx_ind(rt_device_t dev, rt_size_t size) +{ + rt_wqueue_wakeup(&(dev->wait_queue), (void*)POLLIN); + + return RT_EOK; +} + +/* fops for serial */ +static int usbh_serial_fops_open(struct dfs_file *fd) +{ + rt_err_t ret = 0; + rt_uint16_t flags = 0; + rt_device_t device; + + device = (rt_device_t)fd->vnode->data; + RT_ASSERT(device != RT_NULL); + + switch (fd->flags & O_ACCMODE) + { + case O_RDONLY: + USB_LOG_DBG("fops open: O_RDONLY!"); + flags = RT_DEVICE_FLAG_RDONLY; + break; + case O_WRONLY: + USB_LOG_DBG("fops open: O_WRONLY!"); + flags = RT_DEVICE_FLAG_WRONLY; + break; + case O_RDWR: + USB_LOG_DBG("fops open: O_RDWR!"); + flags = RT_DEVICE_FLAG_RDWR; + break; + default: + USB_LOG_ERR("fops open: unknown mode - %d!", fd->flags & O_ACCMODE); + break; + } + + if ((fd->flags & O_ACCMODE) != O_WRONLY) + rt_device_set_rx_indicate(device, usbh_serial_fops_rx_ind); + ret = rt_device_open(device, flags); + if (ret == RT_EOK) return 0; + + return ret; +} + +static int usbh_serial_fops_close(struct dfs_file *fd) +{ + rt_device_t device; + + device = (rt_device_t)fd->vnode->data; + + rt_device_set_rx_indicate(device, RT_NULL); + rt_device_close(device); + + return 0; +} + +static int usbh_serial_fops_ioctl(struct dfs_file *fd, int cmd, void *args) +{ + rt_device_t device; + int flags = (int)(rt_base_t)args; + int mask = O_NONBLOCK | O_APPEND; + + device = (rt_device_t)fd->vnode->data; + switch (cmd) + { + case FIONREAD: + break; + case FIONWRITE: + break; + case F_SETFL: + flags &= mask; + fd->flags &= ~mask; + fd->flags |= flags; + break; + } + + return rt_device_control(device, cmd, args); +} + +static int usbh_serial_fops_read(struct dfs_file *fd, void *buf, size_t count) +{ + int size = 0; + rt_device_t device; + + device = (rt_device_t)fd->vnode->data; + + do + { + size = rt_device_read(device, -1, buf, count); + if (size <= 0) + { + if (fd->flags & O_NONBLOCK) + { + size = -EAGAIN; + break; + } + + rt_wqueue_wait(&(device->wait_queue), 0, RT_WAITING_FOREVER); + } + }while (size <= 0); + + return size; +} + +static int usbh_serial_fops_write(struct dfs_file *fd, const void *buf, size_t count) +{ + rt_device_t device; + + device = (rt_device_t)fd->vnode->data; + return rt_device_write(device, -1, buf, count); +} + +static int usbh_serial_fops_poll(struct dfs_file *fd, struct rt_pollreq *req) +{ + int mask = 0; + int flags = 0; + rt_device_t device; + struct usbh_serial *serial; + + device = (rt_device_t)fd->vnode->data; + RT_ASSERT(device != RT_NULL); + + serial = (struct usbh_serial *)device; + + /* only support POLLIN */ + flags = fd->flags & O_ACCMODE; + if (flags == O_RDONLY || flags == O_RDWR) + { + rt_base_t level; + + rt_poll_add(&(device->wait_queue), req); + + level = rt_hw_interrupt_disable(); + + if (rt_ringbuffer_data_len(&serial->rx_rb)) + mask |= POLLIN; + rt_hw_interrupt_enable(level); + } + // mask|=POLLOUT; + return mask; +} + +const static struct dfs_file_ops usbh_serial_fops = +{ + usbh_serial_fops_open, + usbh_serial_fops_close, + usbh_serial_fops_ioctl, + usbh_serial_fops_read, + usbh_serial_fops_write, + RT_NULL, /* flush */ + RT_NULL, /* lseek */ + RT_NULL, /* getdents */ + usbh_serial_fops_poll, +}; +#endif /* RT_USING_POSIX_DEVIO */ + +rt_err_t usbh_serial_register(struct usbh_serial *serial, + void *data) +{ + rt_err_t ret; + struct rt_device *device; + RT_ASSERT(serial != RT_NULL); + + device = &(serial->parent); + + device->type = RT_Device_Class_Char; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = &usbh_serial_ops; +#else + device->init = NULL; + device->open = usbh_serial_open; + device->close = usbh_serial_close; + device->read = usbh_serial_read; + device->write = usbh_serial_write; + device->control = usbh_serial_control; +#endif + device->user_data = data; + + /* register a character device */ + ret = rt_device_register(device, serial->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_REMOVABLE); + +#ifdef RT_USING_POSIX_DEVIO + /* set fops */ + device->fops = &usbh_serial_fops; +#endif + rt_ringbuffer_init(&serial->rx_rb, serial->rx_rb_buffer, sizeof(serial->rx_rb_buffer)); + + return ret; +} + +void usbh_serial_unregister(struct usbh_serial *serial) +{ + RT_ASSERT(serial != NULL); + + rt_device_unregister(&serial->parent); + + if (serial->type == USBH_SERIAL_TYPE_CDC_ACM) { + usbh_serial_cdc_acm_free(serial); + } else { + usbh_serial_free(serial); + } +} + +#if defined(PKG_CHERRYUSB_HOST_CDC_ACM) || defined(RT_CHERRYUSB_HOST_CDC_ACM) +void usbh_cdc_acm_callback(void *arg, int nbytes) +{ + struct usbh_cdc_acm *cdc_acm_class = (struct usbh_cdc_acm *)arg; + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &cdc_acm_class->bulkin_urb; + + if (nbytes > 0) { + serial = (struct usbh_serial *)cdc_acm_class->user_data; + rt_ringbuffer_put(&serial->rx_rb, g_usbh_serial_cdc_acm_rx_buf[serial->minor], nbytes); + + if (serial->parent.rx_indicate) { + serial->parent.rx_indicate(&serial->parent, nbytes); + } + + usbh_bulk_urb_fill(urb, cdc_acm_class->hport, cdc_acm_class->bulkin, g_usbh_serial_cdc_acm_rx_buf[serial->minor], sizeof(g_usbh_serial_cdc_acm_rx_buf[serial->minor]), 0, usbh_cdc_acm_callback, cdc_acm_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + } + } +} + +void usbh_cdc_acm_run(struct usbh_cdc_acm *cdc_acm_class) +{ + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &cdc_acm_class->bulkin_urb; + + serial = usbh_serial_cdc_acm_alloc(USBH_SERIAL_TYPE_CDC_ACM); + cdc_acm_class->user_data = serial; + + usbh_serial_register(serial, cdc_acm_class); + + struct cdc_line_coding linecoding; + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_cdc_acm_set_line_coding(cdc_acm_class, &linecoding); + + usbh_bulk_urb_fill(urb, cdc_acm_class->hport, cdc_acm_class->bulkin, g_usbh_serial_cdc_acm_rx_buf[serial->minor], sizeof(g_usbh_serial_cdc_acm_rx_buf[serial->minor]), 0, usbh_cdc_acm_callback, cdc_acm_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + usbh_serial_unregister(serial); + return; + } +} + +void usbh_cdc_acm_stop(struct usbh_cdc_acm *cdc_acm_class) +{ + struct usbh_serial *serial; + + serial = (struct usbh_serial *)cdc_acm_class->user_data; + usbh_serial_unregister(serial); +} +#endif + +#if defined(PKG_CHERRYUSB_HOST_FTDI) || defined(RT_CHERRYUSB_HOST_FTDI) +void usbh_ftdi_callback(void *arg, int nbytes) +{ + struct usbh_ftdi *ftdi_class = (struct usbh_ftdi *)arg; + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &ftdi_class->bulkin_urb; + + if (nbytes >= 2) { + serial = (struct usbh_serial *)ftdi_class->user_data; + + nbytes -= 2; // Skip the first two bytes (header) + rt_ringbuffer_put(&serial->rx_rb, &g_usbh_serial_vendor_rx_buf[serial->minor][2], nbytes); + + if (serial->parent.rx_indicate && nbytes) { + serial->parent.rx_indicate(&serial->parent, nbytes); + } + + usbh_bulk_urb_fill(urb, ftdi_class->hport, ftdi_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_ftdi_callback, ftdi_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + } + } +} + +void usbh_ftdi_run(struct usbh_ftdi *ftdi_class) +{ + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &ftdi_class->bulkin_urb; + + serial = usbh_serial_alloc(USBH_SERIAL_TYPE_FTDI); + ftdi_class->user_data = serial; + + usbh_serial_register(serial, ftdi_class); + + struct cdc_line_coding linecoding; + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_ftdi_set_line_coding(ftdi_class, &linecoding); + + usbh_bulk_urb_fill(urb, ftdi_class->hport, ftdi_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_ftdi_callback, ftdi_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + usbh_serial_unregister(serial); + return; + } +} + +void usbh_ftdi_stop(struct usbh_ftdi *ftdi_class) +{ + struct usbh_serial *serial; + + serial = (struct usbh_serial *)ftdi_class->user_data; + usbh_serial_unregister(serial); +} +#endif + +#if defined(PKG_CHERRYUSB_HOST_CH34X) || defined(RT_CHERRYUSB_HOST_CH34X) +void usbh_ch34x_callback(void *arg, int nbytes) +{ + struct usbh_ch34x *ch34x_class = (struct usbh_ch34x *)arg; + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &ch34x_class->bulkin_urb; + + if (nbytes > 0) { + serial = (struct usbh_serial *)ch34x_class->user_data; + rt_ringbuffer_put(&serial->rx_rb, g_usbh_serial_vendor_rx_buf[serial->minor], nbytes); + + if (serial->parent.rx_indicate) { + serial->parent.rx_indicate(&serial->parent, nbytes); + } + + usbh_bulk_urb_fill(urb, ch34x_class->hport, ch34x_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_ch34x_callback, ch34x_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + } + } +} + +void usbh_ch34x_run(struct usbh_ch34x *ch34x_class) +{ + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &ch34x_class->bulkin_urb; + + serial = usbh_serial_alloc(USBH_SERIAL_TYPE_CH34X); + ch34x_class->user_data = serial; + + usbh_serial_register(serial, ch34x_class); + + struct cdc_line_coding linecoding; + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_ch34x_set_line_coding(ch34x_class, &linecoding); + + usbh_bulk_urb_fill(urb, ch34x_class->hport, ch34x_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_ch34x_callback, ch34x_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + usbh_serial_unregister(serial); + return; + } +} + +void usbh_ch34x_stop(struct usbh_ch34x *ch34x_class) +{ + struct usbh_serial *serial; + + serial = (struct usbh_serial *)ch34x_class->user_data; + usbh_serial_unregister(serial); +} +#endif + +#if defined(PKG_CHERRYUSB_HOST_CP210X) || defined(RT_CHERRYUSB_HOST_CP210X) +void usbh_cp210x_callback(void *arg, int nbytes) +{ + struct usbh_cp210x *cp210x_class = (struct usbh_cp210x *)arg; + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &cp210x_class->bulkin_urb; + + if (nbytes > 0) { + serial = (struct usbh_serial *)cp210x_class->user_data; + rt_ringbuffer_put(&serial->rx_rb, g_usbh_serial_vendor_rx_buf[serial->minor], nbytes); + + if (serial->parent.rx_indicate) { + serial->parent.rx_indicate(&serial->parent, nbytes); + } + + usbh_bulk_urb_fill(urb, cp210x_class->hport, cp210x_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_cp210x_callback, cp210x_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + } + } +} + +void usbh_cp210x_run(struct usbh_cp210x *cp210x_class) +{ + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &cp210x_class->bulkin_urb; + + serial = usbh_serial_alloc(USBH_SERIAL_TYPE_CP210X); + cp210x_class->user_data = serial; + + usbh_serial_register(serial, cp210x_class); + + struct cdc_line_coding linecoding; + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_cp210x_set_line_coding(cp210x_class, &linecoding); + + usbh_bulk_urb_fill(urb, cp210x_class->hport, cp210x_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_cp210x_callback, cp210x_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + usbh_serial_unregister(serial); + return; + } +} + +void usbh_cp210x_stop(struct usbh_cp210x *cp210x_class) +{ + struct usbh_serial *serial; + + serial = (struct usbh_serial *)cp210x_class->user_data; + usbh_serial_unregister(serial); +} +#endif + +#if defined(PKG_CHERRYUSB_HOST_PL2303) || defined(RT_CHERRYUSB_HOST_PL2303) +void usbh_pl2303_callback(void *arg, int nbytes) +{ + struct usbh_pl2303 *pl2303_class = (struct usbh_pl2303 *)arg; + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &pl2303_class->bulkin_urb; + + if (nbytes > 0) { + serial = (struct usbh_serial *)pl2303_class->user_data; + rt_ringbuffer_put(&serial->rx_rb, g_usbh_serial_vendor_rx_buf[serial->minor], nbytes); + + if (serial->parent.rx_indicate) { + serial->parent.rx_indicate(&serial->parent, nbytes); + } + + usbh_bulk_urb_fill(urb, pl2303_class->hport, pl2303_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_pl2303_callback, pl2303_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + } + } +} + +void usbh_pl2303_run(struct usbh_pl2303 *pl2303_class) +{ + struct usbh_serial *serial; + int ret; + struct usbh_urb *urb = &pl2303_class->bulkin_urb; + + serial = usbh_serial_alloc(USBH_SERIAL_TYPE_PL2303); + pl2303_class->user_data = serial; + + usbh_serial_register(serial, pl2303_class); + + struct cdc_line_coding linecoding; + linecoding.dwDTERate = 115200; + linecoding.bDataBits = 8; + linecoding.bParityType = 0; + linecoding.bCharFormat = 0; + usbh_pl2303_set_line_coding(pl2303_class, &linecoding); + + usbh_bulk_urb_fill(urb, pl2303_class->hport, pl2303_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_pl2303_callback, pl2303_class); + ret = usbh_submit_urb(urb); + if (ret < 0) { + USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); + usbh_serial_unregister(serial); + return; + } +} + +void usbh_pl2303_stop(struct usbh_pl2303 *pl2303_class) +{ + struct usbh_serial *serial; + + serial = (struct usbh_serial *)pl2303_class->user_data; + usbh_serial_unregister(serial); +} +#endif diff --git a/src/lib/CherryUSB/platform/threadx/usbh_msc_filex.c b/src/lib/CherryUSB/platform/threadx/usbh_msc_filex.c new file mode 100644 index 000000000..a9c275471 --- /dev/null +++ b/src/lib/CherryUSB/platform/threadx/usbh_msc_filex.c @@ -0,0 +1,297 @@ +/*************************************************************************** + * Copyright (c) 2024 Microsoft Corporation + * + * This program and the accompanying materials are made available under the + * terms of the MIT License which is available at + * https://opensource.org/licenses/MIT. + * + * SPDX-License-Identifier: MIT + **************************************************************************/ + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** FileX Component */ +/** */ +/** RAM Disk Driver */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* Include necessary system files. */ + +#include "fx_api.h" +#include "usbh_core.h" +#include "usbh_msc.h" + +/* The RAM driver relies on the fx_media_format call to be made prior to + the fx_media_open call. The following call will format the default + 32KB RAM drive, with a sector size of 128 bytes per sector. + + fx_media_format(&ram_disk, + _fx_usbh_msc_driver, // Driver entry + NULL, // RAM disk memory pointer + media_memory, // Media buffer pointer + sizeof(media_memory), // Media buffer size + "MY_RAM_DISK", // Volume Name + 2, // Number of FATs + 128, // Directory Entries + 0, // Hidden sectors + 256, // Total sectors + 128, // Sector size + 1, // Sectors per cluster + 1, // Heads + 1); // Sectors per track + + */ + +VOID _fx_usbh_msc_driver(FX_MEDIA *media_ptr); + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _fx_ram_driver PORTABLE C */ +/* 6.1.5 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is the entry point to the generic RAM disk driver */ +/* that is delivered with all versions of FileX. The format of the */ +/* RAM disk is easily modified by calling fx_media_format prior */ +/* to opening the media. */ +/* */ +/* This driver also serves as a template for developing FileX drivers */ +/* for actual devices. Simply replace the read/write sector logic with */ +/* calls to read/write from the appropriate physical device */ +/* */ +/* FileX RAM/FLASH structures look like the following: */ +/* */ +/* Physical Sector Contents */ +/* */ +/* 0 Boot record */ +/* 1 FAT Area Start */ +/* +FAT Sectors Root Directory Start */ +/* +Directory Sectors Data Sector Start */ +/* */ +/* */ +/* INPUT */ +/* */ +/* media_ptr Media control block pointer */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _fx_utility_memory_copy Copy sector memory */ +/* _fx_utility_16_unsigned_read Read 16-bit unsigned */ +/* */ +/* CALLED BY */ +/* */ +/* FileX System Functions */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +/* 09-30-2020 William E. Lamie Modified comment(s), */ +/* resulting in version 6.1 */ +/* 03-02-2021 William E. Lamie Modified comment(s), */ +/* resulting in version 6.1.5 */ +/* */ +/**************************************************************************/ +VOID _fx_usbh_msc_driver(FX_MEDIA *media_ptr) +{ + struct usbh_msc *msc_class; + int ret; + + /* There are several useful/important pieces of information contained in + the media structure, some of which are supplied by FileX and others + are for the driver to setup. The following is a summary of the + necessary FX_MEDIA structure members: + + FX_MEDIA Member Meaning + + fx_media_driver_request FileX request type. Valid requests from + FileX are as follows: + + FX_DRIVER_READ + FX_DRIVER_WRITE + FX_DRIVER_FLUSH + FX_DRIVER_ABORT + FX_DRIVER_INIT + FX_DRIVER_BOOT_READ + FX_DRIVER_RELEASE_SECTORS + FX_DRIVER_BOOT_WRITE + FX_DRIVER_UNINIT + + fx_media_driver_status This value is RETURNED by the driver. + If the operation is successful, this + field should be set to FX_SUCCESS for + before returning. Otherwise, if an + error occurred, this field should be + set to FX_IO_ERROR. + + fx_media_driver_buffer Pointer to buffer to read or write + sector data. This is supplied by + FileX. + + fx_media_driver_logical_sector Logical sector FileX is requesting. + + fx_media_driver_sectors Number of sectors FileX is requesting. + + + The following is a summary of the optional FX_MEDIA structure members: + + FX_MEDIA Member Meaning + + fx_media_driver_info Pointer to any additional information + or memory. This is optional for the + driver use and is setup from the + fx_media_open call. The RAM disk uses + this pointer for the RAM disk memory + itself. + + fx_media_driver_write_protect The DRIVER sets this to FX_TRUE when + media is write protected. This is + typically done in initialization, + but can be done anytime. + + fx_media_driver_free_sector_update The DRIVER sets this to FX_TRUE when + it needs to know when clusters are + released. This is important for FLASH + wear-leveling drivers. + + fx_media_driver_system_write FileX sets this flag to FX_TRUE if the + sector being written is a system sector, + e.g., a boot, FAT, or directory sector. + The driver may choose to use this to + initiate error recovery logic for greater + fault tolerance. + + fx_media_driver_data_sector_read FileX sets this flag to FX_TRUE if the + sector(s) being read are file data sectors, + i.e., NOT system sectors. + + fx_media_driver_sector_type FileX sets this variable to the specific + type of sector being read or written. The + following sector types are identified: + + FX_UNKNOWN_SECTOR + FX_BOOT_SECTOR + FX_FAT_SECTOR + FX_DIRECTORY_SECTOR + FX_DATA_SECTOR + */ + + /* Process the driver request specified in the media control block. */ + switch (media_ptr->fx_media_driver_request) { + case FX_DRIVER_READ: { + msc_class = (struct usbh_msc *)media_ptr->fx_media_driver_info; + + ret = usbh_msc_scsi_read10(msc_class, media_ptr->fx_media_driver_logical_sector + media_ptr->fx_media_hidden_sectors, media_ptr->fx_media_driver_buffer, + media_ptr->fx_media_driver_sectors); + + if (ret < 0) { + media_ptr->fx_media_driver_status = FX_IO_ERROR; + return; + } + /* Successful driver request. */ + media_ptr->fx_media_driver_status = FX_SUCCESS; + break; + } + + case FX_DRIVER_WRITE: { + msc_class = (struct usbh_msc *)media_ptr->fx_media_driver_info; + + ret = usbh_msc_scsi_write10(msc_class, media_ptr->fx_media_driver_logical_sector + media_ptr->fx_media_hidden_sectors, + media_ptr->fx_media_driver_buffer, media_ptr->fx_media_driver_sectors); + if (ret < 0) { + media_ptr->fx_media_driver_status = FX_IO_ERROR; + return; + } + /* Successful driver request. */ + media_ptr->fx_media_driver_status = FX_SUCCESS; + break; + } + + case FX_DRIVER_FLUSH: { + /* Return driver success. */ + media_ptr->fx_media_driver_status = FX_SUCCESS; + break; + } + + case FX_DRIVER_ABORT: { + /* Return driver success. */ + media_ptr->fx_media_driver_status = FX_SUCCESS; + break; + } + + case FX_DRIVER_INIT: { + msc_class = usbh_find_class_instance(media_ptr->fx_media_name); + if (!msc_class) { + USB_LOG_ERR("No instance found for %s", media_ptr->fx_media_name); + media_ptr->fx_media_driver_status = FX_MEDIA_INVALID; + return; + } + + if (usbh_msc_scsi_init(msc_class) < 0) { + media_ptr->fx_media_driver_status = FX_MEDIA_INVALID; + return; + } + + media_ptr->fx_media_driver_info = msc_class; + /* Successful driver request. */ + media_ptr->fx_media_driver_status = FX_SUCCESS; + break; + } + + case FX_DRIVER_UNINIT: { + /* There is nothing to do in this case for the RAM driver. For actual + devices some shutdown processing may be necessary. */ + + /* Successful driver request. */ + media_ptr->fx_media_driver_status = FX_SUCCESS; + break; + } + + case FX_DRIVER_BOOT_READ: { + msc_class = (struct usbh_msc *)media_ptr->fx_media_driver_info; + + ret = usbh_msc_scsi_read10(msc_class, 0, media_ptr->fx_media_driver_buffer, 1); + if (ret < 0) { + media_ptr->fx_media_driver_status = FX_IO_ERROR; + return; + } + + /* Successful driver request. */ + media_ptr->fx_media_driver_status = FX_SUCCESS; + break; + } + + case FX_DRIVER_BOOT_WRITE: { + msc_class = (struct usbh_msc *)media_ptr->fx_media_driver_info; + + ret = usbh_msc_scsi_write10(msc_class, 0, media_ptr->fx_media_driver_buffer, 1); + if (ret < 0) { + media_ptr->fx_media_driver_status = FX_IO_ERROR; + return; + } + /* Successful driver request. */ + media_ptr->fx_media_driver_status = FX_SUCCESS; + break; + } + + default: { + /* Invalid driver request. */ + media_ptr->fx_media_driver_status = FX_IO_ERROR; + break; + } + } +} diff --git a/src/lib/CherryUSB/platform/uf2/bootuf2.c b/src/lib/CherryUSB/platform/uf2/bootuf2.c new file mode 100644 index 000000000..80de5592d --- /dev/null +++ b/src/lib/CherryUSB/platform/uf2/bootuf2.c @@ -0,0 +1,463 @@ +/* + * Copyright (c) 2024, sakumisu + * Copyright (c) 2024, Egahp + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "bootuf2.h" +#include "usbd_core.h" + +char file_INFO[] = { + "CherryUSB UF2 BOOT\r\n" + "Model: " CONFIG_PRODUCT "\r\n" + "Board-ID: " CONFIG_BOARD "\r\n" +}; + +const char file_IDEX[] = { + "\n" + "" + "" + "" + "" + "\n" +}; + +const char file_JOIN[] = { + "\n" + "" + "" + "" + "" + "\n" +}; + +const char file_ID__[12] = BOOTUF2_FAMILYID_ARRAY; + +static struct bootuf2_FILE files[] = { + [0] = { .Name = file_ID__, .Content = NULL, .FileSize = 0 }, + [1] = { .Name = "INFO_UF2TXT", .Content = file_INFO, .FileSize = sizeof(file_INFO) - 1 }, + [2] = { .Name = "INDEX HTM", .Content = file_IDEX, .FileSize = sizeof(file_IDEX) - 1 }, + [3] = { .Name = "JOIN HTM", .Content = file_JOIN, .FileSize = sizeof(file_JOIN) - 1 }, +}; + +struct bootuf2_data { + const struct bootuf2_DBR *const DBR; + struct bootuf2_STATE *const STATE; + uint8_t *const fbuff; + uint8_t *const erase; + size_t page_count; + uint8_t *const cache; + const size_t cache_size; + uint32_t cached_address; + size_t cached_bytes; +}; + +/*!< define DBRs */ +static const struct bootuf2_DBR bootuf2_DBR = { + .JMPInstruction = { 0xEB, 0x3C, 0x90 }, + .OEM = "UF2 UF2 ", + .BPB = { + .BytesPerSector = CONFIG_BOOTUF2_SECTOR_SIZE, + .SectorsPerCluster = CONFIG_BOOTUF2_SECTOR_PER_CLUSTER, + .ReservedSectors = CONFIG_BOOTUF2_SECTOR_RESERVED, + .NumberOfFAT = CONFIG_BOOTUF2_NUM_OF_FAT, + .RootEntries = CONFIG_BOOTUF2_ROOT_ENTRIES, + .Sectors = (BOOTUF2_SECTORS(0) > 0xFFFF) ? 0 : BOOTUF2_SECTORS(0), + .MediaDescriptor = 0xF8, + .SectorsPerFAT = BOOTUF2_SECTORS_PER_FAT(0), + .SectorsPerTrack = 1, + .Heads = 1, + .HiddenSectors = 0, + .SectorsOver32MB = (BOOTUF2_SECTORS(0) > 0xFFFF) ? BOOTUF2_SECTORS(0) : 0, + .BIOSDrive = 0x80, + .Reserved = 0, + .ExtendBootSignature = 0x29, + .VolumeSerialNumber = 0x00420042, + .VolumeLabel = "CHERRYUF2", + .FileSystem = "FAT16 ", + }, +}; + +/*!< define mask */ +static uint8_t __attribute__((aligned(4))) bootuf2_mask[BOOTUF2_BLOCKSMAX / 8 + 1] = { 0 }; + +/*!< define state */ +static struct bootuf2_STATE bootuf2_STATE = { + .NumberOfBlock = 0, + .NumberOfWritten = 0, + .Mask = bootuf2_mask, + .Enable = 1, +}; + +/*!< define flash cache */ +static uint8_t __attribute__((aligned(4))) bootuf2_disk_cache[CONFIG_BOOTUF2_CACHE_SIZE]; + +/*!< define flash buff */ +static uint8_t __attribute__((aligned(4))) bootuf2_disk_fbuff[256]; + +/*!< define erase flag buff */ +static uint8_t __attribute__((aligned(4))) bootuf2_disk_erase[BOOTUF2_DIVCEIL(CONFIG_BOOTUF2_PAGE_COUNTMAX, 8)]; + +/*!< define disk */ +static struct bootuf2_data bootuf2_disk = { + .DBR = &bootuf2_DBR, + .STATE = &bootuf2_STATE, + .fbuff = bootuf2_disk_fbuff, + .erase = bootuf2_disk_erase, + .cache = bootuf2_disk_cache, + .cache_size = sizeof(bootuf2_disk_cache), +}; + +static void fname_copy(char *dst, char const *src, uint16_t len) +{ + for (size_t i = 0; i < len; ++i) { + if (*src) + *dst++ = *src++; + else + *dst++ = ' '; + } +} + +static void fcalculate_cluster(struct bootuf2_data *ctx) +{ + /*!< init files cluster */ + uint16_t cluster_beg = 2; + for (int i = 0; i < ARRAY_SIZE(files); i++) { + files[i].ClusterBeg = cluster_beg; + files[i].ClusterEnd = -1 + cluster_beg + + BOOTUF2_DIVCEIL(files[i].FileSize, + ctx->DBR->BPB.BytesPerSector * + ctx->DBR->BPB.SectorsPerCluster); + cluster_beg = files[i].ClusterEnd + 1; + } +} + +static int ffind_by_cluster(uint32_t cluster) +{ + if (cluster >= 0xFFF0) { + return -1; + } + + for (uint32_t i = 0; i < ARRAY_SIZE(files); i++) { + if ((files[i].ClusterBeg <= cluster) && + (cluster <= files[i].ClusterEnd)) { + return i; + } + } + + return -1; +} + +static bool bootuf2block_check_writable(struct bootuf2_STATE *STATE, + struct bootuf2_BLOCK *uf2, uint32_t block_max) +{ + if (uf2->NumberOfBlock) { + if (uf2->BlockIndex < block_max) { + uint8_t mask = 1 << (uf2->BlockIndex % 8); + uint32_t pos = uf2->BlockIndex / 8; + + if ((STATE->Mask[pos] & mask) == 0) { + return true; + } + } + } + + return false; +} + +static void bootuf2block_state_update(struct bootuf2_STATE *STATE, + struct bootuf2_BLOCK *uf2, uint32_t block_max) +{ + if (uf2->NumberOfBlock) { + if (STATE->NumberOfBlock != uf2->NumberOfBlock) { + if ((uf2->NumberOfBlock >= BOOTUF2_BLOCKSMAX) || + STATE->NumberOfBlock) { + /*!< uf2 block only can be update once */ + /*!< this will cause never auto reboot */ + STATE->NumberOfBlock = 0xffffffff; + } else { + STATE->NumberOfBlock = uf2->NumberOfBlock; + } + } + + if (uf2->BlockIndex < block_max) { + uint8_t mask = 1 << (uf2->BlockIndex % 8); + uint32_t pos = uf2->BlockIndex / 8; + + if ((STATE->Mask[pos] & mask) == 0) { + STATE->Mask[pos] |= mask; + STATE->NumberOfWritten++; + } + } + } + + USB_LOG_DBG("UF2 block total %d written %d index %d\r\n", + uf2->NumberOfBllock, STATE->NumberOfWritten, uf2->BlockIndex); +} + +static bool bootuf2block_state_check(struct bootuf2_STATE *STATE) +{ + return (STATE->NumberOfWritten >= STATE->NumberOfBlock) && + STATE->NumberOfBlock; +} + +static int bootuf2_flash_flush(struct bootuf2_data *ctx) +{ + int err; + + if (ctx->cached_bytes == 0) { + return 0; + } + + err = bootuf2_flash_write(ctx->cached_address, ctx->cache, ctx->cached_bytes); + + if (err) { + USB_LOG_ERR("UF2 slot flash write error %d at offset %08lx len %d\r\n", + err, ctx->cached_address, ctx->cached_bytes); + return -1; + } + + ctx->cached_bytes = 0; + + return 0; +} + +int bootuf2_flash_write_internal(struct bootuf2_data *ctx, struct bootuf2_BLOCK *uf2) +{ + /*!< 1.cache not empty and address not continue */ + /*!< 2.cache full */ + if ((ctx->cached_bytes && ((ctx->cached_address + ctx->cached_bytes) != uf2->TargetAddress)) || + (ctx->cached_bytes == ctx->cache_size)) { + int err = bootuf2_flash_flush(ctx); + if (err) + return err; + } + + /*!< write len always is 256, cache_size always is a multiple of 256 */ + memcpy(ctx->cache + ctx->cached_bytes, uf2->Data, uf2->PayloadSize); + + ctx->cached_address = uf2->TargetAddress - ctx->cached_bytes; + ctx->cached_bytes += uf2->PayloadSize; + + return 0; +} + +void bootuf2_init(void) +{ + struct bootuf2_data *ctx; + + ctx = &bootuf2_disk; + + fcalculate_cluster(ctx); + + ctx->cached_bytes = 0; + ctx->cached_address = 0; +} + +int boot2uf2_read_sector(uint32_t start_sector, uint8_t *buff, uint32_t sector_count) +{ + struct bootuf2_data *ctx; + + ctx = &bootuf2_disk; + + while (sector_count) { + memset(buff, 0, ctx->DBR->BPB.BytesPerSector); + + uint32_t sector_relative = start_sector; + + /*!< DBR sector */ + if (start_sector == BOOTUF2_SECTOR_DBR_END) { + memcpy(buff, ctx->DBR, sizeof(struct bootuf2_DBR)); + buff[510] = 0x55; + buff[511] = 0xaa; + } + /*!< FAT sector */ + else if (start_sector < BOOTUF2_SECTOR_FAT_END(ctx->DBR)) { + uint16_t *buff16 = (uint16_t *)buff; + + sector_relative -= BOOTUF2_SECTOR_RSVD_END(ctx->DBR); + + /*!< Perform the same operation on all FAT tables */ + while (sector_relative >= ctx->DBR->BPB.SectorsPerFAT) { + sector_relative -= ctx->DBR->BPB.SectorsPerFAT; + } + + uint16_t cluster_unused = files[ARRAY_SIZE(files) - 1].ClusterEnd + 1; + uint16_t cluster_absolute_first = sector_relative * + BOOTUF2_FAT16_PER_SECTOR(ctx->DBR); + + /*!< cluster used link to chain, or unsed */ + for (uint16_t i = 0, cluster_absolute = cluster_absolute_first; + i < BOOTUF2_FAT16_PER_SECTOR(ctx->DBR); + i++, cluster_absolute++) { + if (cluster_absolute >= cluster_unused) + buff16[i] = 0; + else + buff16[i] = cluster_absolute + 1; + } + + /*!< cluster 0 and 1 */ + if (sector_relative == 0) { + buff[0] = ctx->DBR->BPB.MediaDescriptor; + buff[1] = 0xff; + buff16[1] = 0xffff; + } + + /*!< cluster end of file */ + for (uint32_t i = 0; i < ARRAY_SIZE(files); i++) { + uint16_t cluster_file_last = files[i].ClusterEnd; + + if (cluster_file_last >= cluster_absolute_first) { + uint16_t idx = cluster_file_last - cluster_absolute_first; + if (idx < BOOTUF2_FAT16_PER_SECTOR(ctx->DBR)) { + buff16[idx] = 0xffff; + } + } + } + } + /*!< root entries */ + else if (start_sector < BOOTUF2_SECTOR_ROOT_END(ctx->DBR)) { + sector_relative -= BOOTUF2_SECTOR_FAT_END(ctx->DBR); + + struct bootuf2_ENTRY *ent = (void *)buff; + int remain_entries = BOOTUF2_ENTRY_PER_SECTOR(ctx->DBR); + + uint32_t file_index_first; + + /*!< volume label entry */ + if (sector_relative == 0) { + fname_copy(ent->Name, (char const *)ctx->DBR->BPB.VolumeLabel, 11); + ent->Attribute = 0x28; + ent++; + remain_entries--; + file_index_first = 0; + } else { + /*!< -1 to account for volume label in first sector */ + file_index_first = sector_relative * BOOTUF2_ENTRY_PER_SECTOR(ctx->DBR) - 1; + } + + for (uint32_t idx = file_index_first; + (remain_entries > 0) && (idx < ARRAY_SIZE(files)); + idx++, ent++) { + const uint32_t cluster_beg = files[idx].ClusterBeg; + + const struct bootuf2_FILE *f = &files[idx]; + + if ((0 == f->FileSize) && + (0 != idx)) { + continue; + } + + fname_copy(ent->Name, f->Name, 11); + ent->Attribute = 0x05; + ent->CreateTimeTeenth = BOOTUF2_SECONDS_INT % 2 * 100; + ent->CreateTime = BOOTUF2_DOS_TIME; + ent->CreateDate = BOOTUF2_DOS_DATE; + ent->LastAccessDate = BOOTUF2_DOS_DATE; + ent->FirstClustH16 = cluster_beg >> 16; + ent->UpdateTime = BOOTUF2_DOS_TIME; + ent->UpdateDate = BOOTUF2_DOS_DATE; + ent->FirstClustL16 = cluster_beg & 0xffff; + ent->FileSize = f->FileSize; + } + } + /*!< data */ + else if (start_sector < BOOTUF2_SECTOR_DATA_END(ctx->DBR)) { + sector_relative -= BOOTUF2_SECTOR_ROOT_END(ctx->DBR); + + int fid = ffind_by_cluster(2 + sector_relative / ctx->DBR->BPB.SectorsPerCluster); + + if (fid >= 0) { + const struct bootuf2_FILE *f = &files[fid]; + + uint32_t sector_relative_file = + sector_relative - + (files[fid].ClusterBeg - 2) * ctx->DBR->BPB.SectorsPerCluster; + + size_t fcontent_offset = sector_relative_file * ctx->DBR->BPB.BytesPerSector; + size_t fcontent_length = f->FileSize; + + if (fcontent_length > fcontent_offset) { + const void *src = (void *)((uint8_t *)(f->Content) + fcontent_offset); + size_t copy_size = fcontent_length - fcontent_offset; + + if (copy_size > ctx->DBR->BPB.BytesPerSector) { + copy_size = ctx->DBR->BPB.BytesPerSector; + } + + memcpy(buff, src, copy_size); + } + } + } + /*!< unknown sector, ignore */ + + start_sector++; + sector_count--; + buff += ctx->DBR->BPB.BytesPerSector; + } + + return 0; +} + +int bootuf2_write_sector(uint32_t start_sector, const uint8_t *buff, uint32_t sector_count) +{ + struct bootuf2_data *ctx; + + ctx = &bootuf2_disk; + + while (sector_count) { + struct bootuf2_BLOCK *uf2 = (void *)buff; + + if (!((uf2->MagicStart0 == BOOTUF2_MAGIC_START0) && + (uf2->MagicStart1 == BOOTUF2_MAGIC_START1) && + (uf2->MagicEnd == BOOTUF2_MAGIC_END) && + (uf2->Flags & BOOTUF2_FLAG_FAMILID_PRESENT) && + !(uf2->Flags & BOOTUF2_FLAG_NOT_MAIN_FLASH))) { + goto next; + } + + if (uf2->FamilyID == CONFIG_BOOTUF2_FAMILYID) { + if (bootuf2block_check_writable(ctx->STATE, uf2, CONFIG_BOOTUF2_FLASHMAX)) { + bootuf2_flash_write_internal(ctx, uf2); + bootuf2block_state_update(ctx->STATE, uf2, CONFIG_BOOTUF2_FLASHMAX); + } else { + USB_LOG_DBG("UF2 block %d already written\r\n", + uf2->BlockIndex); + } + } else { + USB_LOG_DBG("UF2 block illegal id %08x\r\n", uf2->FamilyID); + } + + next: + start_sector++; + sector_count--; + buff += ctx->DBR->BPB.BytesPerSector; + } + + return 0; +} + +uint16_t bootuf2_get_sector_size(void) +{ + return bootuf2_disk.DBR->BPB.BytesPerSector; +} + +uint32_t bootuf2_get_sector_count(void) +{ + return bootuf2_disk.DBR->BPB.SectorsOver32MB + bootuf2_disk.DBR->BPB.Sectors; +} + +bool bootuf2_is_write_done(void) +{ + if (bootuf2block_state_check(bootuf2_disk.STATE)) { + bootuf2_flash_flush(&bootuf2_disk); + USB_LOG_DBG("UF2 update ok\r\n"); + return true; + } else { + return false; + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/uf2/bootuf2.h b/src/lib/CherryUSB/platform/uf2/bootuf2.h new file mode 100644 index 000000000..ec31d3ea7 --- /dev/null +++ b/src/lib/CherryUSB/platform/uf2/bootuf2.h @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2024, sakumisu + * Copyright (c) 2024, Egahp + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef BOOTUF2_H +#define BOOTUF2_H + +#include +#include +#include +#include +#include +#include + +#ifndef __PACKED +#define __PACKED __attribute__((packed)) +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(array) \ + ((int)((sizeof(array) / sizeof((array)[0])))) +#endif + +struct bootuf2_BLOCK +{ + // 32 byte header + uint32_t MagicStart0; + uint32_t MagicStart1; + uint32_t Flags; + uint32_t TargetAddress; + uint32_t PayloadSize; + uint32_t BlockIndex; + uint32_t NumberOfBlock; + uint32_t FamilyID; // or file_size + uint8_t Data[476]; + uint32_t MagicEnd; +} __PACKED; +//BUILD_ASSERT(sizeof(struct bootuf2_BLOCK) == 512, "bootuf2_BLOCK not sector sized"); + +struct bootuf2_STATE +{ + uint32_t NumberOfBlock; + uint32_t NumberOfWritten; + uint8_t *const Mask; + uint8_t Enable; +}; + +struct bootuf2_DBR +{ + /*!< offset 0 */ + uint8_t JMPInstruction[3]; + /*!< offset 3 */ + uint8_t OEM[8]; + /*!< offset 11 */ + struct + { + uint16_t BytesPerSector; + uint8_t SectorsPerCluster; + uint16_t ReservedSectors; + uint8_t NumberOfFAT; + uint16_t RootEntries; + uint16_t Sectors; + uint8_t MediaDescriptor; + uint16_t SectorsPerFAT; + uint16_t SectorsPerTrack; + uint16_t Heads; + uint32_t HiddenSectors; + uint32_t SectorsOver32MB; + uint8_t BIOSDrive; + uint8_t Reserved; + uint8_t ExtendBootSignature; + uint32_t VolumeSerialNumber; + uint8_t VolumeLabel[11]; + uint8_t FileSystem[8]; + } __PACKED BPB; + /*!< offset 62 */ + /*!< BootLoader */ + /*!< offset 511 */ + /*!< 0x55 0xAA */ +} __PACKED; +//BUILD_ASSERT(sizeof(struct bootuf2_DBR) == 62, "bootuf2_DBR size must be 62 byte"); + +struct bootuf2_ENTRY +{ + char Name[11]; + uint8_t Attribute; + uint8_t NTReserved; + uint8_t CreateTimeTeenth; + uint16_t CreateTime; + uint16_t CreateDate; + uint16_t LastAccessDate; + uint16_t FirstClustH16; + uint16_t UpdateTime; + uint16_t UpdateDate; + uint16_t FirstClustL16; + uint32_t FileSize; +} __PACKED; +//BUILD_ASSERT(sizeof(struct bootuf2_ENTRY) == 32, "bootuf2_ENTRY size must be 32 byte"); + +struct bootuf2_FILE +{ + const char *const Name; + const void *const Content; + uint32_t FileSize; + uint16_t ClusterBeg; + uint16_t ClusterEnd; +}; + +#define BOOTUF2_DIVCEIL(_v, _d) (((_v) / (_d)) + ((_v) % (_d) ? 1 : 0)) + +#define BOOTUF2_MAGIC_START0 0x0A324655u +#define BOOTUF2_MAGIC_START1 0x9E5D5157u +#define BOOTUF2_MAGIC_SERIAL 0x251B18BDu +#define BOOTUF2_MAGIC_END 0x0AB16F30u + +#define BOOTUF2_FLAG_NOT_MAIN_FLASH 0x00000001u +#define BOOTUF2_FLAG_FILE_CONTAINER 0x00001000u +#define BOOTUF2_FLAG_FAMILID_PRESENT 0x00002000u +#define BOOTUF2_FLAG_MD5_PRESENT 0x00004000u + +#define BOOTUF2_CMD_READ 0 +#define BOOTUF2_CMD_SYNC 1 + +#define BOOTUF2_BLOCKSMAX (((CONFIG_BOOTUF2_FLASHMAX) / 256) + (((CONFIG_BOOTUF2_FLASHMAX) % 256) ? 1 : 0)) + +#define BOOTUF2_FAMILYID_POSNUM(n) (((CONFIG_BOOTUF2_FAMILYID) / (0x10000000 >> ((n) * 4))) % 0x10) +#define BOOTUF2_FAMILYID_ARRAY \ + { \ + ((BOOTUF2_FAMILYID_POSNUM(0) >= 10) ? BOOTUF2_FAMILYID_POSNUM(0) - 10 + 'A' : BOOTUF2_FAMILYID_POSNUM(0) + '0'), \ + ((BOOTUF2_FAMILYID_POSNUM(1) >= 10) ? BOOTUF2_FAMILYID_POSNUM(1) - 10 + 'A' : BOOTUF2_FAMILYID_POSNUM(1) + '0'), \ + ((BOOTUF2_FAMILYID_POSNUM(2) >= 10) ? BOOTUF2_FAMILYID_POSNUM(2) - 10 + 'A' : BOOTUF2_FAMILYID_POSNUM(2) + '0'), \ + ((BOOTUF2_FAMILYID_POSNUM(3) >= 10) ? BOOTUF2_FAMILYID_POSNUM(3) - 10 + 'A' : BOOTUF2_FAMILYID_POSNUM(3) + '0'), \ + ((BOOTUF2_FAMILYID_POSNUM(4) >= 10) ? BOOTUF2_FAMILYID_POSNUM(4) - 10 + 'A' : BOOTUF2_FAMILYID_POSNUM(4) + '0'), \ + ((BOOTUF2_FAMILYID_POSNUM(5) >= 10) ? BOOTUF2_FAMILYID_POSNUM(5) - 10 + 'A' : BOOTUF2_FAMILYID_POSNUM(5) + '0'), \ + ((BOOTUF2_FAMILYID_POSNUM(6) >= 10) ? BOOTUF2_FAMILYID_POSNUM(6) - 10 + 'A' : BOOTUF2_FAMILYID_POSNUM(6) + '0'), \ + ((BOOTUF2_FAMILYID_POSNUM(7) >= 10) ? BOOTUF2_FAMILYID_POSNUM(7) - 10 + 'A' : BOOTUF2_FAMILYID_POSNUM(7) + '0'), \ + ('I'), \ + ('D'), \ + (' '), \ + ('\0'), \ + }; + +#define BOOTUF2_FAT16_PER_SECTOR(pDBR) (pDBR->BPB.BytesPerSector / 2) +#define BOOTUF2_ENTRY_PER_SECTOR(pDBR) (pDBR->BPB.BytesPerSector / sizeof(struct bootuf2_ENTRY)) +#define BOOTUF2_CLUSTERSMAX (0xFFF0 - 2) +#define BOOTUF2_SECTOR_DBR_END (0) +#define BOOTUF2_SECTOR_RSVD_END(pDBR) BOOTUF2_SECTOR_DBR_END + (pDBR->BPB.ReservedSectors) +#define BOOTUF2_SECTOR_FAT_END(pDBR) BOOTUF2_SECTOR_RSVD_END(pDBR) + (pDBR->BPB.SectorsPerFAT * pDBR->BPB.NumberOfFAT) +#define BOOTUF2_SECTOR_ROOT_END(pDBR) BOOTUF2_SECTOR_FAT_END(pDBR) + (pDBR->BPB.RootEntries / (pDBR->BPB.BytesPerSector / sizeof(struct bootuf2_ENTRY))) +#define BOOTUF2_SECTOR_DATA_END(pDBR) (pDBR->BPB.Sectors + pDBR->BPB.SectorsOver32MB) + +#define BOOTUF2_SECTORS_PER_FAT(n) \ + BOOTUF2_DIVCEIL(BOOTUF2_CLUSTERSMAX, (CONFIG_BOOTUF2_SECTOR_SIZE / 2)) +#define BOOTUF2_SECTORS_FOR_ENTRIES(n) \ + (CONFIG_BOOTUF2_ROOT_ENTRIES / (CONFIG_BOOTUF2_SECTOR_SIZE / sizeof(struct bootuf2_ENTRY))) +#define BOOTUF2_SECTORS(n) \ + (CONFIG_BOOTUF2_SECTOR_RESERVED + \ + CONFIG_BOOTUF2_NUM_OF_FAT * BOOTUF2_SECTORS_PER_FAT(n) + \ + BOOTUF2_SECTORS_FOR_ENTRIES(n) + \ + BOOTUF2_CLUSTERSMAX * CONFIG_BOOTUF2_SECTOR_PER_CLUSTER) + +#define BOOTUF2_YEAR_INT ( \ + (__DATE__[7u] - '0') * 1000u + \ + (__DATE__[8u] - '0') * 100u + \ + (__DATE__[9u] - '0') * 10u + \ + (__DATE__[10u] - '0') * 1u) + +#define BOOTUF2_MONTH_INT ( \ + (__DATE__[2u] == 'n' && __DATE__[1u] == 'a') ? 1u /*Jan*/ \ + : (__DATE__[2u] == 'b') ? 2u /*Feb*/ \ + : (__DATE__[2u] == 'r' && __DATE__[1u] == 'a') ? 3u /*Mar*/ \ + : (__DATE__[2u] == 'r') ? 4u /*Apr*/ \ + : (__DATE__[2u] == 'y') ? 5u /*May*/ \ + : (__DATE__[2u] == 'n') ? 6u /*Jun*/ \ + : (__DATE__[2u] == 'l') ? 7u /*Jul*/ \ + : (__DATE__[2u] == 'g') ? 8u /*Aug*/ \ + : (__DATE__[2u] == 'p') ? 9u /*Sep*/ \ + : (__DATE__[2u] == 't') ? 10u /*Oct*/ \ + : (__DATE__[2u] == 'v') ? 11u /*Nov*/ \ + : 12u /*Dec*/) + +#define BOOTUF2_DAY_INT ( \ + (__DATE__[4u] == ' ' ? 0 : __DATE__[4u] - '0') * 10u + \ + (__DATE__[5u] - '0')) + +#define BOOTUF2_HOUR_INT ( \ + (__TIME__[0u] == '?' ? 0 : __TIME__[0u] - '0') * 10u + (__TIME__[1u] == '?' ? 0 : __TIME__[1u] - '0')) + +#define BOOTUF2_MINUTE_INT ( \ + (__TIME__[3u] == '?' ? 0 : __TIME__[3u] - '0') * 10u + (__TIME__[4u] == '?' ? 0 : __TIME__[4u] - '0')) + +#define BOOTUF2_SECONDS_INT ( \ + (__TIME__[6u] == '?' ? 0 : __TIME__[6u] - '0') * 10u + (__TIME__[7u] == '?' ? 0 : __TIME__[7u] - '0')) + +#define BOOTUF2_DOS_DATE ( \ + ((BOOTUF2_YEAR_INT - 1980u) << 9u) | \ + (BOOTUF2_MONTH_INT << 5u) | \ + (BOOTUF2_DAY_INT << 0u)) + +#define BOOTUF2_DOS_TIME ( \ + (BOOTUF2_HOUR_INT << 11u) | \ + (BOOTUF2_MINUTE_INT << 5u) | \ + (BOOTUF2_SECONDS_INT << 0u)) + +void bootuf2_init(void); +int boot2uf2_read_sector(uint32_t start_sector, uint8_t *buff, uint32_t sector_count); +int bootuf2_write_sector(uint32_t start_sector, const uint8_t *buff, uint32_t sector_count); +uint16_t bootuf2_get_sector_size(void); +uint32_t bootuf2_get_sector_count(void); + +bool bootuf2_is_write_done(void); + +void boot2uf2_flash_init(void); +int bootuf2_flash_write(uint32_t address, const uint8_t *data, size_t size); + +#endif /* BOOTUF2_H */ diff --git a/src/lib/CherryUSB/platform/zephyr/usb_cmd.c b/src/lib/CherryUSB/platform/zephyr/usb_cmd.c new file mode 100644 index 000000000..402b57412 --- /dev/null +++ b/src/lib/CherryUSB/platform/zephyr/usb_cmd.c @@ -0,0 +1,12 @@ +#include + +#if CONFIG_CHERRYUSB_HOST +#include "usbh_core.h" +static void shell_lsusb_handle(const struct shell *sh, size_t argc, char **argv) +{ + ARG_UNUSED(sh); + lsusb(argc, argv); +} + +SHELL_CMD_REGISTER(lsusb, NULL, "Usage: lsusb [options]...\r\n", shell_lsusb_handle); +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/platform/zephyr/usbh_msc_disk.c b/src/lib/CherryUSB/platform/zephyr/usbh_msc_disk.c new file mode 100644 index 000000000..6890f985b --- /dev/null +++ b/src/lib/CherryUSB/platform/zephyr/usbh_msc_disk.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include "usbh_core.h" +#include "usbh_msc.h" + +#ifdef CONFIG_DCACHE +#ifndef CONFIG_USB_DCACHE_ENABLE +#error CONFIG_USB_DCACHE_ENABLE must be enabled to use msc disk +#endif +#endif + +struct usbh_msc *active_msc_class; + +static int disk_msc_access_init(struct disk_info *disk) +{ + active_msc_class = (struct usbh_msc *)usbh_find_class_instance("/dev/sda"); + if (active_msc_class == NULL) { + printf("do not find /dev/sda\r\n"); + return -ENODEV; + } + if (usbh_msc_scsi_init(active_msc_class) < 0) { + return -EIO; + } + return 0; +} + +static int disk_msc_access_status(struct disk_info *disk) +{ + return DISK_STATUS_OK; +} + +static int disk_msc_access_read(struct disk_info *disk, uint8_t *buff, + uint32_t sector, uint32_t count) +{ + int ret; + uint8_t *align_buf; + + align_buf = (uint8_t *)buff; +#ifdef CONFIG_DCACHE + if ((uint32_t)buff & (CONFIG_USB_ALIGN_SIZE - 1)) { + align_buf = (uint8_t *)k_aligned_alloc(CONFIG_USB_ALIGN_SIZE, count * active_msc_class->blocksize); + if (!align_buf) { + printf("msc get align buf failed\r\n"); + return -ENOMEM; + } + } +#endif + if (usbh_msc_scsi_read10(active_msc_class, sector, align_buf, count) < 0) { + ret = -EIO; + } else { + ret = 0; + } +#ifdef CONFIG_DCACHE + if ((uint32_t)buff & (CONFIG_USB_ALIGN_SIZE - 1)) { + usb_memcpy(buff, align_buf, count * active_msc_class->blocksize); + k_free(align_buf); + } +#endif + return ret; +} + +static int disk_msc_access_write(struct disk_info *disk, const uint8_t *buff, + uint32_t sector, uint32_t count) +{ + int ret; + uint8_t *align_buf; + + align_buf = (uint8_t *)buff; +#ifdef CONFIG_DCACHE + if ((uint32_t)buff & (CONFIG_USB_ALIGN_SIZE - 1)) { + align_buf = (uint8_t *)k_aligned_alloc(CONFIG_USB_ALIGN_SIZE, count * active_msc_class->blocksize); + if (!align_buf) { + printf("msc get align buf failed\r\n"); + return -ENOMEM; + } + usb_memcpy(align_buf, buff, count * active_msc_class->blocksize); + } +#endif + if (usbh_msc_scsi_write10(active_msc_class, sector, align_buf, count) < 0) { + ret = -EIO; + } else { + ret = 0; + } +#ifdef CONFIG_DCACHE + if ((uint32_t)buff & (CONFIG_USB_ALIGN_SIZE - 1)) { + k_free(align_buf); + } +#endif + return ret; +} + +static int disk_msc_access_ioctl(struct disk_info *disk, uint8_t cmd, void *buff) +{ + switch (cmd) { + case DISK_IOCTL_CTRL_SYNC: + break; + case DISK_IOCTL_GET_SECTOR_COUNT: + *(uint32_t *)buff = active_msc_class->blocknum; + break; + case DISK_IOCTL_GET_SECTOR_SIZE: + *(uint32_t *)buff = active_msc_class->blocksize; + break; + case DISK_IOCTL_GET_ERASE_BLOCK_SZ: + *(uint32_t *)buff = 1U; + break; + case DISK_IOCTL_CTRL_INIT: + return disk_msc_access_init(disk); + case DISK_IOCTL_CTRL_DEINIT: + break; + default: + return -EINVAL; + } + + return 0; +} + +static const struct disk_operations msc_disk_ops = { + .init = disk_msc_access_init, + .status = disk_msc_access_status, + .read = disk_msc_access_read, + .write = disk_msc_access_write, + .ioctl = disk_msc_access_ioctl, +}; + +static struct disk_info usbh_msc_disk = { + .name = "USB", + .ops = &msc_disk_ops, +}; + +void usbh_msc_run(struct usbh_msc *msc_class) +{ + disk_access_register(&usbh_msc_disk); +} + +void usbh_msc_stop(struct usbh_msc *msc_class) +{ + disk_access_unregister(&usbh_msc_disk); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/aic/usb_dc_aic.c b/src/lib/CherryUSB/port/aic/usb_dc_aic.c new file mode 100644 index 000000000..fafa6118d --- /dev/null +++ b/src/lib/CherryUSB/port/aic/usb_dc_aic.c @@ -0,0 +1,1661 @@ +/* + * Copyright (c) 2023-2024, ArtInChip Technology Co., Ltd + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "usbd_core.h" +#include "usb_dc_aic_reg.h" + +// clang-format off +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +// clang-format on + +#define FS_PORT 0 +#define HS_PORT 1 + +#ifndef CONFIG_USB_AIC_DC_PORT +#error "please select CONFIG_USB_AIC_DC_PORT with FS_PORT or HS_PORT" +#endif + +#ifndef USB_BASE +#define USB_BASE CONFIG_USB_AIC_DC_BASE +#endif + +#ifdef LPKG_CHERRYUSB_DEVICE_HID_IO_TEMPLATE +#define USB_RAM_SIZE 1024 /* define with maximum value*/ +#else +#define USB_RAM_SIZE 512 /* define with maximum value*/ +#endif + +#ifndef USB_NUM_BIDIR_ENDPOINTS +#define USB_NUM_BIDIR_ENDPOINTS 5 /* define with minimum value*/ +#endif + +/* USB_P_TXFIFO_NUM: + * There are only 2 Periodic_TXFIFO, and each Interrupt/Isochronous In ep + * needs to request one P_TXFIFO. So, only two Interrupt/Isochronous In ep + * can be requested for at most. + */ +#define USB_P_TXFIFO_NUM 2 + +#define AIC_UDC_REG ((AIC_UDC_RegDef *)(USB_BASE)) +#define AIC_EP_FIFO(i) *(__IO uint32_t *)(USB_BASE + AIC_EP_FIFO_BASE + ((i)*AIC_EP_FIFO_SIZE)) + +/* Endpoint state */ +struct aic_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t *xfer_buf; +#ifdef CONFIG_USB_AIC_DMA_ENABLE + uint8_t *xfer_align_buf; + uint32_t xfer_align_len; +#endif + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +extern uint32_t usbd_clk; + +/* Driver state */ +/*USB_NOCACHE_RAM_SECTION*/ struct aic_udc { + USB_MEM_ALIGNX struct usb_setup_packet setup; + USB_MEM_ALIGNX struct aic_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ + struct aic_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ + struct usb_endpoint_descriptor in_ep_desc[USB_NUM_BIDIR_ENDPOINTS]; + uint32_t p_txfifo_map; /* map which periodic_txfifo is used */ + uint32_t np_txfifo_map; /* map no-periodic_txfifo is used */ +} g_aic_udc; + +#define AIC_EP0_SETUP 1 +#define AIC_EP0_DATA_IN 2 +#define AIC_EP0_STATUS_OUT 3 +#define AIC_EP0_DATA_OUT 12 +#define AIC_EP0_STATUS_IN 13 + +uint8_t ep0_ctrl_stage = 0; /* 1 = setup stage, 2 = data stage, 3 = status stage */ + +#ifdef CONFIG_USB_AIC_DMA_ENABLE +static uint8_t g_aic_udc_ibuf[USB_RAM_SIZE] __ALIGNED(CACHE_LINE_SIZE); +static uint8_t g_aic_udc_obuf[USB_RAM_SIZE] __ALIGNED(CACHE_LINE_SIZE); + +void aic_udc_dcache_clean(uintptr_t addr, uint32_t len) +{ + aicos_dcache_clean_range((size_t *)addr, len); +} + +void aic_udc_dcache_invalidate(uintptr_t addr, uint32_t len) +{ + aicos_dcache_invalid_range((size_t *)addr, len); +} + +void aic_udc_dcache_clean_invalidate(uintptr_t addr, uint32_t len) +{ + aicos_dcache_clean_invalid_range((size_t *)addr, len); +} + +static int aic_udc_ep_buf_alloc(struct aic_ep_state *ep, uint32_t len, + uint8_t *sbuf) +{ + ep->xfer_len = len; + if (len % CACHE_LINE_SIZE) + ep->xfer_align_len = ALIGN_UP(len, CACHE_LINE_SIZE); + else + ep->xfer_align_len = len; + + if (ep->xfer_align_len > USB_RAM_SIZE) { + ep->xfer_align_buf = aicos_malloc_align(0, ep->xfer_align_len, + CACHE_LINE_SIZE); + USB_LOG_DBG("aicos_malloc_align %d bytes.", ep->xfer_align_len); + if (!ep->xfer_align_buf) { + USB_LOG_ERR("alloc error.\r\n"); + return -5; + } + } else { + ep->xfer_align_buf = sbuf; + } + + return 0; +} + +static void aic_udc_ep_buf_free(struct aic_ep_state *ep, uint8_t *sbuf) +{ + if (!ep->xfer_align_buf) + return; + + /* Whether the buf is allocated dynamically */ + if (ep->xfer_align_buf != sbuf) { + USB_LOG_DBG("aicos_free_align %d bytes.", ep->xfer_align_len); + aicos_free_align(0, ep->xfer_align_buf); + } + + ep->xfer_align_buf = NULL; + ep->xfer_align_len = 0; +} + +static int aic_udc_ibuf_alloc(struct aic_ep_state *ep, uint32_t len) +{ + return aic_udc_ep_buf_alloc(ep, len, g_aic_udc_ibuf); +} + +static int aic_udc_obuf_alloc(struct aic_ep_state *ep, uint32_t len) +{ + return aic_udc_ep_buf_alloc(ep, len, g_aic_udc_obuf); +} + +static void aic_udc_ibuf_free(struct aic_ep_state *ep) +{ + aic_udc_ep_buf_free(ep, g_aic_udc_ibuf); +} + +static void aic_udc_obuf_free(struct aic_ep_state *ep) +{ + aic_udc_ep_buf_free(ep, g_aic_udc_obuf); +} +#else +#define aic_udc_dcache_clean(addr, len) +#define aic_udc_dcache_invalidate(addr, len) +#define aic_udc_dcache_clean_invalidate(addr, len) +#endif + +static void aic_set_dma_nextep(void) +{ + uint32_t i; + uint32_t inepcfg = 0; + + /* dma to set the next-endpoint pointer. */ + for (i = 0; i < USB_NUM_BIDIR_ENDPOINTS; i++) { + uint32_t next = ((i + 1) % USB_NUM_BIDIR_ENDPOINTS) << DEPCTL_NEXT_EP_BIT; + + inepcfg = readl(&AIC_UDC_REG->inepcfg[i]); + inepcfg &= ~DEPCTL_NEXT_EP_MASK; + inepcfg |= next; + writel(inepcfg, &AIC_UDC_REG->inepcfg[i]); + } +} + +static inline int aic_reset(void) +{ + uint32_t count = 0U; + uint32_t tmpreg = 0; + + /* Wait for AHB master IDLE state. */ + do { + if (++count > 200000U) { + return -1; + } + tmpreg = readl(&AIC_UDC_REG->ahbbasic); + } while ((tmpreg & AHBBASIC_AHBIDLE) == 0U); + + /* Core Soft Reset */ + count = 0U; + tmpreg = readl(&AIC_UDC_REG->usbdevinit); + tmpreg |= USBDEVINIT_CSFTRST; + writel(tmpreg, &AIC_UDC_REG->usbdevinit); + + do { + if (++count > 200000U) { + return -1; + } + tmpreg = readl(&AIC_UDC_REG->usbdevinit); + } while ((tmpreg & USBDEVINIT_CSFTRST) == USBDEVINIT_CSFTRST); + + return 0; +} + +static inline int aic_core_init(void) +{ + int ret; + uint32_t usb_gusbcfg = + 0 << 19 /* ULPI Clock SuspendM */ + | 0 << 18 /* ULPI Phy Auto Resume */ + | 0 << 15 /* PHY Low Power Clock sel */ + | 0x5 << 10 /* USB Turnaround time (0x5 for HS phy) */ + | 0 << 7 /* ULPI DDR sel 0:single 8bit, 1:double 4bit */ + /*| 0 << 6 0: high speed utmi+, 1: full speed serial*/ +#ifdef FPGA_BOARD_ARTINCHIP + | 1 << 4 /* 0: utmi+, 1:ulpi*/ +#else + | 0 << 4 /* 0: utmi+, 1:ulpi*/ +#endif + | 0 << 3 /* UTMI+ PHY 0:8bit, 1:16bit (ULPI PHY set 8bit) */ + | 0x7 << 0; /* HS/FS timeout calibration**/ + + /* Activate the USB Transceiver */ + writel(usb_gusbcfg, &AIC_UDC_REG->usbphyif); + + /* Reset after a PHY select */ + ret = aic_reset(); + + aic_set_dma_nextep(); + + return ret; +} + +static inline int aic_flush_rxfifo(void) +{ + uint32_t count = 0; + uint32_t tmpreg = 0; + + tmpreg = readl(&AIC_UDC_REG->usbdevinit); + tmpreg |= USBDEVINIT_RXFFLSH; + writel(tmpreg, &AIC_UDC_REG->usbdevinit); + + do { + if (++count > 200000U) { + return -1; + } + tmpreg = readl(&AIC_UDC_REG->usbdevinit); + } while ((tmpreg & USBDEVINIT_RXFFLSH) == USBDEVINIT_RXFFLSH); + + return 0; +} + +static inline int aic_flush_txfifo(uint32_t num) +{ + uint32_t count = 0U; + uint32_t tmpreg = 0; + + tmpreg = readl(&AIC_UDC_REG->usbdevinit); + tmpreg &= ~ USBDEVINIT_TXFNUM(USBDEVINIT_TXFNUM_LIMIT); + tmpreg |= USBDEVINIT_TXFNUM(num & USBDEVINIT_TXFNUM_LIMIT) + | USBDEVINIT_TXFFLSH; + writel(tmpreg, &AIC_UDC_REG->usbdevinit); + + do { + if (++count > 200000U) { + return -1; + } + tmpreg = readl(&AIC_UDC_REG->usbdevinit); + } while ((tmpreg & USBDEVINIT_TXFFLSH) == USBDEVINIT_TXFFLSH); + + return 0; +} + +static void aic_set_turnaroundtime(uint32_t hclk, uint8_t speed) +{ + uint32_t UsbTrd; + uint32_t tmpreg = 0; + + /* The USBTRD is configured according to the tables below, depending on AHB frequency + used by application. In the low AHB frequency range it is used to stretch enough the USB response + time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access + latency to the Data FIFO */ + if (speed == USB_ENUM_SPEED_FULL) { + if ((hclk >= 14200000U) && (hclk < 15000000U)) { + /* hclk Clock Range between 14.2-15 MHz */ + UsbTrd = 0xFU; + } else if ((hclk >= 15000000U) && (hclk < 16000000U)) { + /* hclk Clock Range between 15-16 MHz */ + UsbTrd = 0xEU; + } else if ((hclk >= 16000000U) && (hclk < 17200000U)) { + /* hclk Clock Range between 16-17.2 MHz */ + UsbTrd = 0xDU; + } else if ((hclk >= 17200000U) && (hclk < 18500000U)) { + /* hclk Clock Range between 17.2-18.5 MHz */ + UsbTrd = 0xCU; + } else if ((hclk >= 18500000U) && (hclk < 20000000U)) { + /* hclk Clock Range between 18.5-20 MHz */ + UsbTrd = 0xBU; + } else if ((hclk >= 20000000U) && (hclk < 21800000U)) { + /* hclk Clock Range between 20-21.8 MHz */ + UsbTrd = 0xAU; + } else if ((hclk >= 21800000U) && (hclk < 24000000U)) { + /* hclk Clock Range between 21.8-24 MHz */ + UsbTrd = 0x9U; + } else if ((hclk >= 24000000U) && (hclk < 27700000U)) { + /* hclk Clock Range between 24-27.7 MHz */ + UsbTrd = 0x8U; + } else if ((hclk >= 27700000U) && (hclk < 32000000U)) { + /* hclk Clock Range between 27.7-32 MHz */ + UsbTrd = 0x7U; + } else {/* if(hclk >= 32000000) */ + /* hclk Clock Range between 32-200 MHz */ + UsbTrd = 0x6U; + } + } else if (speed == USB_ENUM_SPEED_HIGH) { + UsbTrd = USBPHYIF_HS_TRDT_VALUE; + } else { + UsbTrd = USBPHYIF_DEFAULT_TRDT_VALUE; + } + + tmpreg = readl(&AIC_UDC_REG->usbphyif); + tmpreg |= USBPHYIF_TOUTCAL_LIMIT; + tmpreg &= ~USBPHYIF_USBTRDTIM_MASK; + tmpreg |= (uint32_t)((UsbTrd << USBPHYIF_USBTRDTIM_SHIFT) + & USBPHYIF_USBTRDTIM_MASK); + writel(tmpreg, &AIC_UDC_REG->usbphyif); +} + +#if 0 +static void aic_set_txfifo(uint8_t fifo, uint16_t size) +{ + uint8_t i; + uint32_t Tx_Offset; + + /* TXn min size = 16 words. (n : Transmit FIFO index) + When a TxFIFO is not used, the Configuration should be as follows: + case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) + --> Txm can use the space allocated for Txn. + case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) + --> Txn should be configured with the minimum space of 16 words + The FIFO is used optimally when used TxFIFOs are allocated in the top + of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. + When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */ + + Tx_Offset = AIC_UDC_REG->rxfifosiz; + + if (fifo == 0U) { + AIC_UDC_REG->nptxfifosiz = ((uint32_t)size << 16) | Tx_Offset; + } else { + Tx_Offset += (AIC_UDC_REG->nptxfifosiz) >> 16; + for (i = 0U; i < (fifo - 1U); i++) { + Tx_Offset += (AIC_UDC_REG->txfifosiz[i] >> 16); + } + + /* Multiply Tx_Size by 2 to get higher performance */ + AIC_UDC_REG->txfifosiz[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset; + } +} +#endif + +static uint8_t aic_get_devspeed(void) +{ + uint8_t speed; + uint32_t DevEnumSpeed = readl(&AIC_UDC_REG->usblinests); + + DevEnumSpeed &= USB_ENUM_SPEED_MASK; + if (DevEnumSpeed == USB_HIGH_30_60MHZ) { + speed = USB_ENUM_SPEED_HIGH; + } else if (DevEnumSpeed == USB_FULL_30_60MHZ) { + speed = USB_ENUM_SPEED_FULL; + } else { + speed = 0xFU; + } + + return speed; +} + +static void aic_ep0_start_read_setup(uint8_t *psetup) +{ + uint32_t outepcfg = 0; + + g_aic_udc.out_ep[0].xfer_buf = psetup; + g_aic_udc.out_ep[0].xfer_len = 8; + ep0_ctrl_stage = AIC_EP0_SETUP; + + USB_LOG_DBG("\r\n"); + USB_LOG_DBG("[1]: Control transfer start read setup."); + + aic_udc_dcache_invalidate((uintptr_t)psetup, CACHE_LINE_SIZE); + + writel((1<<29) | (DXEPTSIZ_PKT_CNT_MASK & (1U << 19)) | (8U), &AIC_UDC_REG->outeptsfsiz[0]); + +#ifdef CONFIG_USB_AIC_DMA_ENABLE + writel((uint32_t)(uintptr_t)psetup, &AIC_UDC_REG->outepdmaaddr[0]); +#endif + writel(0xFFFFFFFFU, &AIC_UDC_REG->outepint[0]); + + /* EP enable */ + outepcfg = readl(&AIC_UDC_REG->outepcfg[0]); + outepcfg |= DEPCTL_CNAK | DEPCTL_EPENA | DEPCTL_USBACTEP; + writel(outepcfg, &AIC_UDC_REG->outepcfg[0]); +} + +void aic_ep_write(uint8_t ep_idx, uint8_t *src, uint16_t len) +{ + uint32_t *pSrc = (uint32_t *)src; + uint32_t count32b, i; + + count32b = ((uint32_t)len + 3U) / 4U; + for (i = 0U; i < count32b; i++) { + AIC_EP_FIFO(ep_idx) = __UNALIGNED_UINT32_READ(pSrc); + pSrc++; + } +} + +void aic_ep_read(uint8_t *dest, uint16_t len) +{ + uint32_t *pDest = (uint32_t *)dest; + uint32_t i; + uint32_t count32b = ((uint32_t)len + 3U) / 4U; + + for (i = 0U; i < count32b; i++) { + __UNALIGNED_UINT32_WRITE(pDest, AIC_EP_FIFO(0U)); + pDest++; + } +} + +#ifndef CONFIG_USB_AIC_DMA_ENABLE +static void aic_tx_fifo_empty_procecss(uint8_t ep_idx) +{ + uint32_t len; + //uint32_t len32b; + + len = g_aic_udc.in_ep[ep_idx].xfer_len - g_aic_udc.in_ep[ep_idx].actual_xfer_len; + if (len > g_aic_udc.in_ep[ep_idx].ep_mps) { + len = g_aic_udc.in_ep[ep_idx].ep_mps; + } + + //len32b = (len + 3U) / 4U; + + while (/*((AIC_UDC_REG->ineptxsts[ep_idx] & INEPTXSTS_IN_EP_TXFIFO_STS) >= len32b) &&*/ + (g_aic_udc.in_ep[ep_idx].actual_xfer_len < g_aic_udc.in_ep[ep_idx].xfer_len) && (g_aic_udc.in_ep[ep_idx].xfer_len != 0U)) { + /* Write the FIFO */ + len = g_aic_udc.in_ep[ep_idx].xfer_len - g_aic_udc.in_ep[ep_idx].actual_xfer_len; + if (len > g_aic_udc.in_ep[ep_idx].ep_mps) { + len = g_aic_udc.in_ep[ep_idx].ep_mps; + } + + aic_ep_write(ep_idx, g_aic_udc.in_ep[ep_idx].xfer_buf, len); + g_aic_udc.in_ep[ep_idx].xfer_buf += len; + g_aic_udc.in_ep[ep_idx].actual_xfer_len += len; + } +} +#endif + +/** + * @brief aic_get_glb_intstatus: return the global USB interrupt status + * @retval status + */ +static inline uint32_t aic_get_glb_intstatus(void) +{ + uint32_t tmpreg; + uint32_t mask; + + tmpreg = readl(&AIC_UDC_REG->usbintsts); + mask = readl(&AIC_UDC_REG->usbintmsk); + + return tmpreg & mask; +} + +/** + * @brief aic_get_outeps_intstatus: return the USB device OUT endpoints interrupt status + * @retval status + */ +static inline uint32_t aic_get_outeps_intstatus(void) +{ + uint32_t tmpreg; + uint32_t mask; + + tmpreg = readl(&AIC_UDC_REG->usbepint); + mask = readl(&AIC_UDC_REG->usbepintmsk); + + return (((tmpreg & mask) & 0xffff0000U) >> 16); +} + +/** + * @brief aic_get_ineps_intstatus: return the USB device IN endpoints interrupt status + * @retval status + */ +static inline uint32_t aic_get_ineps_intstatus(void) +{ + uint32_t tmpreg; + uint32_t mask; + + tmpreg = readl(&AIC_UDC_REG->usbepint); + mask = readl(&AIC_UDC_REG->usbepintmsk); + + return ((tmpreg & mask) & 0xFFFFU); +} + +/** + * @brief Returns Device OUT EP Interrupt register + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device OUT EP Interrupt register + */ +static inline uint32_t aic_get_outep_intstatus(uint8_t epnum) +{ + uint32_t tmpreg; + uint32_t mask; + + tmpreg = readl(&AIC_UDC_REG->outepint[epnum]); + USB_LOG_DBG("[int]: Out ep%d outepint = 0x%x [%d].", epnum, tmpreg, ep0_ctrl_stage); + mask = readl(&AIC_UDC_REG->outepintmsk); + + return tmpreg & mask; +} + +/** + * @brief Returns Device IN EP Interrupt register + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device IN EP Interrupt register + */ +static inline uint32_t aic_get_inep_intstatus(uint8_t epnum) +{ + uint32_t tmpreg; + uint32_t mask; + + tmpreg = readl(&AIC_UDC_REG->inepint[epnum]); + USB_LOG_DBG("[int]: In ep%d inepint = 0x%x [%d].", epnum, tmpreg, ep0_ctrl_stage); + mask = readl(&AIC_UDC_REG->inepintmsk); + + return tmpreg & mask; +} + +__WEAK void usb_dc_low_level_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + +int usb_dc_rst(void) +{ + uint32_t outepintmsk = 0; + uint32_t inepintmsk = 0; + + USB_LOG_DBG("usb_dc_rst.\n"); + + usbd_set_address(0); + + aic_flush_txfifo(0x10U); + aic_flush_rxfifo(); + + for (uint8_t i = 0U; i < USB_NUM_BIDIR_ENDPOINTS; i++) { + if (i == 0U) { + writel(DEPCTL_SNAK, &AIC_UDC_REG->inepcfg[i]); + writel(DEPCTL_SNAK, &AIC_UDC_REG->outepcfg[i]); + } else { + usbd_ep_close(i); + usbd_ep_close(i | 0x80); + } + + writel(0U, &AIC_UDC_REG->ineptsfsiz[i]); + writel(0xFFFFFFFFU, &AIC_UDC_REG->inepint[i]); + writel(0U, &AIC_UDC_REG->outeptsfsiz[i]); + writel(0xFFFFFFFFU, &AIC_UDC_REG->outepint[i]); + } + + writel(0, &AIC_UDC_REG->usbepintmsk); + outepintmsk = TRANSFER_DONE | CTRL_OUT_EP_SETUP_PHASE_DONE | CTRL_OUT_EP_STATUS_PHASE_RCVD; + inepintmsk = TRANSFER_DONE | NON_ISO_IN_EP_TIMEOUT | INTKNEPMIS; +#ifndef CONFIG_USB_AIC_DMA_ENABLE + outepintmsk |= CTRL_OUT_EP_SETUP_PHASE_DONE; + inepintmsk |= INTKN_TXFEMP; +#endif + writel(outepintmsk, &AIC_UDC_REG->outepintmsk); + writel(inepintmsk, &AIC_UDC_REG->inepintmsk); + + aic_set_dma_nextep(); + +#ifdef CONFIG_USB_AIC_DMA_ENABLE + for (uint8_t i = 0U; i < USB_NUM_BIDIR_ENDPOINTS; i++) { + aic_udc_obuf_free(&g_aic_udc.out_ep[i]); + aic_udc_ibuf_free(&g_aic_udc.in_ep[i]); + } +#endif + + memset(&g_aic_udc, 0, sizeof(struct aic_udc)); + usbd_event_reset_handler(0); + /* Start reading setup */ + aic_ep0_start_read_setup((uint8_t *)&g_aic_udc.setup); + + return 0; +} + +int usb_dc_init(uint8_t busid) +{ + int ret; + uint32_t base = 0; + uint32_t tmpreg = 0; + + memset(&g_aic_udc, 0, sizeof(struct aic_udc)); + + usb_dc_low_level_init(); + + /* Disconnect */ + tmpreg = readl(&AIC_UDC_REG->usbdevfunc); + tmpreg |= USBDEVFUNC_SFTDISCON; + writel(tmpreg, &AIC_UDC_REG->usbdevfunc); + /* Disable Interrupt */ + tmpreg = readl(&AIC_UDC_REG->usbdevinit); + tmpreg &= ~USBDEVINIT_GLBL_INTR_EN; + writel(tmpreg, &AIC_UDC_REG->usbdevinit); + + ret = aic_core_init(); + + for (uint8_t i = 0U; i < 2U; i++) { + writel(0, &AIC_UDC_REG->txfifosiz[i]); + } + + /* Device mode configuration */ + tmpreg = readl(&AIC_UDC_REG->usbdevconf); + tmpreg |= PERIOD_FRAME_INTERVAL_80; + +#if defined(CONFIG_USB_HS) + /* Set Core speed to High speed mode */ + tmpreg |= DEV_SPEED_HIGH_SPEED_20; +#else + tmpreg |= DEV_SPEED_FULL_SPEED_20; +#endif + writel(tmpreg, &AIC_UDC_REG->usbdevconf); + + ret = aic_flush_txfifo(0x10U); + ret = aic_flush_rxfifo(); + + /* Clear all pending Device Interrupts */ + writel(0, &AIC_UDC_REG->inepintmsk); + writel(0, &AIC_UDC_REG->outepintmsk); + writel(0, &AIC_UDC_REG->usbepintmsk); + + /* Disable all interrupts. */ + writel(0, &AIC_UDC_REG->usbintmsk); + /* Clear any pending interrupts */ + writel(0xBFFFFFFFU, &AIC_UDC_REG->usbintsts); + + /* Enable interrupts matching to the Device mode ONLY */ + tmpreg = INT_RESET | INT_ENUMDONE | + INT_OUT_EP | INT_IN_EP | + INT_INCOMP_ISO_IN_INT | INT_INCOMP_ISO_OUT_INT | INT_SUSPEND; + writel(tmpreg, &AIC_UDC_REG->usbintmsk); + +#ifdef CONFIG_USB_AIC_DMA_ENABLE + tmpreg = readl(&AIC_UDC_REG->usbdevinit); + tmpreg |= (USBDEVINIT_HBSTLEN_INCR4 << USBDEVINIT_HBSTLEN_SHIFT); + tmpreg |= USBDEVINIT_DMA_EN; + writel(tmpreg, &AIC_UDC_REG->usbdevinit); +#else + tmpreg = readl(&AIC_UDC_REG->usbintmsk); + tmpreg |= INT_RX_FIFO_NOT_EMPTY; + writel(tmpreg, &AIC_UDC_REG->usbintmsk); +#endif + + /* Assign FIFO */ + base = 0; + writel(AIC_RX_FIFO_SIZE, &AIC_UDC_REG->rxfifosiz); + base += AIC_RX_FIFO_SIZE; + writel((AIC_NP_TX_FIFO_SIZE << 16) | base, &AIC_UDC_REG->nptxfifosiz); + base += AIC_NP_TX_FIFO_SIZE; + writel((AIC_PERIOD_TX_FIFO1_SIZE << 16) | base, &AIC_UDC_REG->txfifosiz[0]); + base += AIC_PERIOD_TX_FIFO1_SIZE; + writel((AIC_PERIOD_TX_FIFO2_SIZE << 16) | base, &AIC_UDC_REG->txfifosiz[1]); + + usb_dc_rst(); + + /* Enable Interrupt */ + tmpreg = readl(&AIC_UDC_REG->usbdevinit); + tmpreg |= USBDEVINIT_GLBL_INTR_EN; + writel(tmpreg, &AIC_UDC_REG->usbdevinit); + /* Connect */ + tmpreg = readl(&AIC_UDC_REG->usbdevfunc); + tmpreg &= ~USBDEVFUNC_SFTDISCON; + writel(tmpreg, &AIC_UDC_REG->usbdevfunc); + + return ret; +} + +int usb_dc_deinit(uint8_t busid) +{ + uint32_t tmpreg = 0; + + usbd_event_suspend_handler(); + + /* Clear Pending interrupt */ + for (uint8_t i = 0U; i < USB_NUM_BIDIR_ENDPOINTS; i++) { + writel(0xFB7FU, &AIC_UDC_REG->outepint[i]); + writel(0xFB7FU, &AIC_UDC_REG->inepint[i]); + } + + /* Clear interrupt masks */ + writel(0, &AIC_UDC_REG->inepintmsk); + writel(0, &AIC_UDC_REG->outepintmsk); + writel(0, &AIC_UDC_REG->usbepintmsk); + + /* Flush the FIFO */ + aic_flush_txfifo(0x10U); + aic_flush_rxfifo(); + + tmpreg = readl(&AIC_UDC_REG->usbdevfunc); + tmpreg |= USBDEVFUNC_SFTDISCON; + writel(tmpreg, &AIC_UDC_REG->usbdevfunc); + + usb_dc_low_level_deinit(); + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + uint32_t tmpreg = 0; + + tmpreg = readl(&AIC_UDC_REG->usbdevconf); + tmpreg &= ~(DEVICE_ADDRESS_MASK); + tmpreg |= ((uint32_t)addr << 4) & DEVICE_ADDRESS_MASK; + writel(tmpreg, &AIC_UDC_REG->usbdevconf); + + return 0; +} + +uint8_t usbd_get_port_speed(uint8_t busid, const uint8_t port) +{ + uint8_t speed; + uint32_t DevEnumSpeed = readl(&AIC_UDC_REG->usblinests); + + DevEnumSpeed &= USB_ENUM_SPEED_MASK; + + if (DevEnumSpeed == USB_HIGH_30_60MHZ) { + speed = USB_SPEED_HIGH; + } else if (DevEnumSpeed == USB_FULL_30_60MHZ) { + speed = USB_SPEED_FULL; + } else { + speed = USB_SPEED_FULL; + } + + return speed; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + uint16_t ep_mps; + uint8_t tx_fifo_num = 0; + uint32_t i; + uint32_t usbepintmsk = 0; + uint32_t epcfg = 0; + + if (ep_idx > (USB_NUM_BIDIR_ENDPOINTS - 1)) { + USB_LOG_ERR("Ep addr %d overflow\r\n", ep->bEndpointAddress); + return -1; + } + + ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + if (ep_idx == 0) { + switch (ep_mps) { + case 8: + ep_mps = DEPCTL0_MPS_8; + break; + case 16: + ep_mps = DEPCTL0_MPS_16; + break; + case 32: + ep_mps = DEPCTL0_MPS_32; + break; + case 64: + ep_mps = DEPCTL0_MPS_64; + break; + } + } + + usbepintmsk = readl(&AIC_UDC_REG->usbepintmsk); + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_aic_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_aic_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + + usbepintmsk |= DAINT_OUT_MASK & (uint32_t)(1UL << (16 + ep_idx)); + writel(usbepintmsk, &AIC_UDC_REG->usbepintmsk); + epcfg = readl(&AIC_UDC_REG->outepcfg[ep_idx]); + epcfg |= (ep_mps & DEPCTL_MPS_MASK) | + ((uint32_t)USB_GET_ENDPOINT_TYPE(ep->bmAttributes) << 18) | + DEPCTL_SETD0PID | + DEPCTL_USBACTEP; + writel(epcfg, &AIC_UDC_REG->outepcfg[ep_idx]); + } else { + g_aic_udc.in_ep_desc[ep_idx] = *ep; + g_aic_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_aic_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + + usbepintmsk |= DAINT_IN_MASK & (uint32_t)(1UL << ep_idx); + writel(usbepintmsk, &AIC_UDC_REG->usbepintmsk); + + /* Period IN EP alloc fifo num */ + if ((USB_GET_ENDPOINT_TYPE(ep->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) || + (USB_GET_ENDPOINT_TYPE(ep->bmAttributes) == USB_ENDPOINT_TYPE_ISOCHRONOUS)) { + for (i = 1; i <= USB_P_TXFIFO_NUM; i++) { + if (g_aic_udc.p_txfifo_map & (1 << i)) + continue; + g_aic_udc.p_txfifo_map |= (1 << i); + tx_fifo_num = i; + break; + } + + if (tx_fifo_num == 0) + return -1; + + aic_flush_txfifo(tx_fifo_num); + } else { + g_aic_udc.np_txfifo_map |= (1 << ep_idx); + } + + epcfg = readl(&AIC_UDC_REG->inepcfg[ep_idx]); + epcfg |= (ep_mps & DEPCTL_MPS_MASK) | + ((uint32_t)USB_GET_ENDPOINT_TYPE(ep->bmAttributes) << 18) | + (tx_fifo_num << 22) | + DEPCTL_SETD0PID | + DEPCTL_USBACTEP; + writel(epcfg, &AIC_UDC_REG->inepcfg[ep_idx]); + } + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint8_t tx_fifo_num = 0; + int i = 0; + uint32_t outepcfg = 0; + uint32_t outepint = 0; + uint32_t inepcfg = 0; + uint32_t inepint = 0; + uint32_t usbintsts = 0; + uint32_t usbdevfunc = 0; + uint32_t usbepintmsk = 0; + + #define DIS_EP_TIMOUT 100 + + if (USB_EP_DIR_IS_OUT(ep)) { + outepcfg = readl(&AIC_UDC_REG->outepcfg[ep_idx]); + if (outepcfg & DEPCTL_EPENA) { + /* (1) Wait for global nak to take effect */ + usbintsts = readl(&AIC_UDC_REG->usbintsts); + if (!(usbintsts & INT_GOUTNAKEFF)) { + usbdevfunc = readl(&AIC_UDC_REG->usbdevfunc); + usbdevfunc |= USBDEVFUNC_SGOUTNAK; + writel(usbdevfunc, &AIC_UDC_REG->usbdevfunc); + } + + for (i = 0; i < DIS_EP_TIMOUT; i++) { + usbintsts = readl(&AIC_UDC_REG->usbintsts); + if (usbintsts & INT_GOUTNAKEFF) + break; + aic_udelay(1); + } + + if (i == DIS_EP_TIMOUT) + USB_LOG_ERR("%s: timeout USBINTSTS.GOUTNAKEFF\n", __func__); + + /* (2) Disable ep */ + outepcfg = readl(&AIC_UDC_REG->outepcfg[ep_idx]); + outepcfg |= DEPCTL_SNAK; + outepcfg |= DEPCTL_EPDIS; + writel(outepcfg, &AIC_UDC_REG->outepcfg[ep_idx]); + + for (i = 0; i < DIS_EP_TIMOUT*10; i++) { + outepint = readl(&AIC_UDC_REG->outepint[ep_idx]); + if (outepint & EPDISBLD) + break; + aic_udelay(1); + } + + if (i == DIS_EP_TIMOUT) + USB_LOG_ERR("%s: timeout OUTEPCFG.EPDisable\n", __func__); + + /* Clear EPDISBLD interrupt */ + outepint = readl(&AIC_UDC_REG->outepint[ep_idx]); + outepint |= EPDISBLD; + writel(outepint, &AIC_UDC_REG->outepint[ep_idx]); + + /* (3) Remove global NAKs */ + usbdevfunc = readl(&AIC_UDC_REG->usbdevfunc); + usbdevfunc |= USBDEVFUNC_CGOUTNAK; + writel(usbdevfunc, &AIC_UDC_REG->usbdevfunc); + } + + usbepintmsk = readl(&AIC_UDC_REG->usbepintmsk); + usbepintmsk &= ~(DAINT_OUT_MASK & (uint32_t)(1UL << (16 + ep_idx))); + writel(usbepintmsk, &AIC_UDC_REG->usbepintmsk); + writel(0, &AIC_UDC_REG->outepcfg[ep_idx]); + } else { + inepcfg = readl(&AIC_UDC_REG->inepcfg[ep_idx]); + tx_fifo_num = (inepcfg & DEPCTL_TXFIFONUM_MASK) >> DEPCTL_TXFIFONUM_SHIFT; + + inepcfg = readl(&AIC_UDC_REG->inepcfg[ep_idx]); + if (inepcfg & DEPCTL_EPENA) { + if (tx_fifo_num) { + /* (1) Wait for Nak effect */ + inepcfg |= DEPCTL_SNAK; + writel(inepcfg, &AIC_UDC_REG->inepcfg[ep_idx]); + + for (i = 0; i < DIS_EP_TIMOUT; i++) { + inepint = readl(&AIC_UDC_REG->inepint[ep_idx]); + if (inepint & INEP_NAKEFF) + break; + aic_udelay(1); + } + + if (i == DIS_EP_TIMOUT) + USB_LOG_ERR("%s: timeout INEPINT.NAKEFF\n", __func__); + } else { + /* (1) Wait for Nak effect */ + usbdevfunc = readl(&AIC_UDC_REG->usbdevfunc); + usbdevfunc |= USBDEVFUNC_SGNPINNAK; + writel(usbdevfunc, &AIC_UDC_REG->usbdevfunc); + + for (i = 0; i < DIS_EP_TIMOUT; i++) { + usbintsts = readl(&AIC_UDC_REG->usbintsts); + if (usbintsts & INT_GINNAKEFF) + break; + aic_udelay(1); + } + + if (i == DIS_EP_TIMOUT) + USB_LOG_ERR("%s: timeout USBINTSTS.GOUTNAKEFF\n", __func__); + } + + /* (2) Disable ep */ + inepcfg = readl(&AIC_UDC_REG->inepcfg[ep_idx]); + inepcfg |= DEPCTL_SNAK; + inepcfg |= DEPCTL_EPDIS; + writel(inepcfg, &AIC_UDC_REG->inepcfg[ep_idx]); + + for (i = 0; i < DIS_EP_TIMOUT; i++) { + inepint = readl(&AIC_UDC_REG->inepint[ep_idx]); + if (inepint & EPDISBLD) + break; + aic_udelay(1); + } + + if (i == DIS_EP_TIMOUT) + USB_LOG_ERR("%s: timeout OUTEPCFG.EPDisable\n", __func__); + + /* Clear EPDISBLD interrupt */ + inepint = readl(&AIC_UDC_REG->inepint[ep_idx]); + inepint |= EPDISBLD; + writel(inepint, &AIC_UDC_REG->inepint[ep_idx]); + + /* (3) Flush TX FIFO */ + aic_flush_txfifo(tx_fifo_num); + + /* Period IN EP free fifo num */ + if (tx_fifo_num > 0) + g_aic_udc.p_txfifo_map &= ~(1 << tx_fifo_num); + else + g_aic_udc.np_txfifo_map &= ~(1 << ep_idx); + + /* (4) Clear Global In NP NAK in Shared FIFO for non periodic ep */ + if (!tx_fifo_num) { + usbdevfunc = readl(&AIC_UDC_REG->usbdevfunc); + usbdevfunc |= USBDEVFUNC_CGNPINNAK; + writel(usbdevfunc, &AIC_UDC_REG->usbdevfunc); + } + } + + usbepintmsk = readl(&AIC_UDC_REG->usbepintmsk); + usbepintmsk &= ~(DAINT_OUT_MASK & (uint32_t)(1UL << ep_idx)); + writel(usbepintmsk, &AIC_UDC_REG->usbepintmsk); + writel(0, &AIC_UDC_REG->inepcfg[ep_idx]); + } + +#ifdef CONFIG_USB_AIC_DMA_ENABLE + if (USB_EP_DIR_IS_OUT(ep)) { + aic_udc_obuf_free(&g_aic_udc.out_ep[ep_idx]); + } else { + aic_udc_ibuf_free(&g_aic_udc.in_ep[ep_idx]); + } +#endif + + return 0; +} + +int usbd_npinep_rewrite(const uint8_t ep) +{ + int i = 0; + int j = 0; + int fail = 0; + unsigned int pending_map = 0; + //int data_len = 0; + uint32_t tmpreg = 0; + + for (i = 0U, j = 0; i < USB_NUM_BIDIR_ENDPOINTS; i++) { + tmpreg = readl(&AIC_UDC_REG->inepcfg[i]); + if (!((g_aic_udc.np_txfifo_map & (1 << i)) && + (tmpreg & DEPCTL_EPENA))) + continue; + + j++; + + pending_map |= (1 << i); + } + if (j <= 1) + return 0; + + /* (1) close all no-periodic ep */ + /* (1.1) Set Global In NP NAK in Shared FIFO for non periodic ep */ + tmpreg = readl(&AIC_UDC_REG->usbdevfunc); + tmpreg |= USBDEVFUNC_SGNPINNAK; + writel(tmpreg, &AIC_UDC_REG->usbdevfunc); + + for (i = 0; i < DIS_EP_TIMOUT; i++) { + tmpreg = readl(&AIC_UDC_REG->usbintsts); + if (tmpreg & INT_GINNAKEFF) + break; + aic_udelay(1); + } + + if (i == DIS_EP_TIMOUT) + USB_LOG_ERR("%s: timeout USBINTSTS.GOUTNAKEFF\n", __func__); + + /* (1.2) Disable ep */ + for (i = 0U; i < USB_NUM_BIDIR_ENDPOINTS; i++) { + tmpreg = readl(&AIC_UDC_REG->inepcfg[i]); + if (!((g_aic_udc.np_txfifo_map & (1 << i)) && + (tmpreg & DEPCTL_EPENA))) + continue; + + tmpreg |= DEPCTL_SNAK; + tmpreg |= DEPCTL_EPDIS; + writel(tmpreg, &AIC_UDC_REG->inepcfg[i]); + + /* remain data */ + #if 0 + tmpreg = readl(&AIC_UDC_REG->ineptsfsiz[i]); + data_len = tmpreg & DXEPTSIZ_XFER_SIZE_MASK; + g_aic_udc.in_ep[ep].xfer_buf += g_aic_udc.in_ep[ep].xfer_len - data_len; + g_aic_udc.in_ep[ep].xfer_len = data_len; + #endif + + //pending_map |= (1 << i); + } + + for (j = 0; j < DIS_EP_TIMOUT; j++) { + fail = 0; + for (i = 0U; i < USB_NUM_BIDIR_ENDPOINTS; i++) { + if (!(pending_map & (1 << i))) + continue; + tmpreg = readl(&AIC_UDC_REG->inepint[i]); + if (!(tmpreg & EPDISBLD)) { + fail = i+1; + break; + } + } + if (!fail) + break; + aic_udelay(1); + } + + if (j == DIS_EP_TIMOUT) + USB_LOG_ERR("%s: ep%d timeout OUTEPCFG.EPDisable\n", __func__, fail-1); + + /* Clear EPDISBLD interrupt */ + for (i = 0U; i < USB_NUM_BIDIR_ENDPOINTS; i++) { + if (!(pending_map & (1 << i))) + continue; + tmpreg = readl(&AIC_UDC_REG->inepint[i]); + tmpreg |= EPDISBLD; + writel(tmpreg, &AIC_UDC_REG->inepint[i]); + } + + /* (1.3) Flush TX FIFO0 */ + aic_flush_txfifo(0); + + /* (1.4) Clear Global In NP NAK in Shared FIFO for non periodic ep */ + tmpreg = readl(&AIC_UDC_REG->usbdevfunc); + tmpreg |= USBDEVFUNC_CGNPINNAK; + writel(tmpreg, &AIC_UDC_REG->usbdevfunc); + + /* (2) reopen current ep */ + usbd_ep_open(&g_aic_udc.in_ep_desc[ep]); + + /* (3) rewrite current ep */ + if (pending_map & (1 << ep)) { + usbd_ep_start_write(ep, g_aic_udc.in_ep[ep].xfer_buf, + g_aic_udc.in_ep[ep].xfer_len); + } + + /* (4) reopen & rewrite other ep, let's receive ep mismtach interrupt */ + for (i = 0U; i < USB_NUM_BIDIR_ENDPOINTS; i++) { + if (!(pending_map & (1 << i)) || + (i == ep)) + continue; + usbd_ep_open(&g_aic_udc.in_ep_desc[i]); + usbd_ep_start_write(i, g_aic_udc.in_ep[i].xfer_buf, + g_aic_udc.in_ep[i].xfer_len); + } + + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint32_t tmpreg = 0; + + if (USB_EP_DIR_IS_OUT(ep)) { + tmpreg = readl(&AIC_UDC_REG->outepcfg[ep_idx]); + if (((tmpreg & DEPCTL_EPENA) == 0U) && (ep_idx != 0U)) { + tmpreg &= ~(DEPCTL_EPDIS); + } + tmpreg |= DEPCTL_STALL; + writel(tmpreg, &AIC_UDC_REG->outepcfg[ep_idx]); + } else { + tmpreg = readl(&AIC_UDC_REG->inepcfg[ep_idx]); + if (((tmpreg & DEPCTL_EPENA) == 0U) && (ep_idx != 0U)) { + tmpreg &= ~(DEPCTL_EPDIS); + } + tmpreg |= DEPCTL_STALL; + writel(tmpreg, &AIC_UDC_REG->inepcfg[ep_idx]); + } + +#ifdef CONFIG_USB_AIC_DMA_ENABLE + if (ep_idx == 0) { + aic_ep0_start_read_setup((uint8_t *)&g_aic_udc.setup); + } +#endif + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint32_t tmpreg = 0; + + if (USB_EP_DIR_IS_OUT(ep)) { + tmpreg = readl(&AIC_UDC_REG->outepcfg[ep_idx]); + tmpreg &= ~DEPCTL_STALL; + if ((g_aic_udc.out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_INTERRUPT) || + (g_aic_udc.out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_BULK)) { + tmpreg |= DEPCTL_SETD0PID; /* DATA0 */ + } + writel(tmpreg, &AIC_UDC_REG->outepcfg[ep_idx]); + } else { + tmpreg = readl(&AIC_UDC_REG->inepcfg[ep_idx]); + tmpreg &= ~DEPCTL_STALL; + if ((g_aic_udc.in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_INTERRUPT) || + (g_aic_udc.in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_BULK)) { + tmpreg |= DEPCTL_SETD0PID; /* DATA0 */ + } + writel(tmpreg, &AIC_UDC_REG->inepcfg[ep_idx]); + } + + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + if (USB_EP_DIR_IS_OUT(ep)) { + } else { + } + return 0; +} + +int usbd_ep_start_write_raw(const uint8_t ep, const uint8_t *data, uint32_t data_len, uint8_t cache_align) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint32_t pktcnt = 0; + uint32_t inepcfg = 0; + uint32_t ineptsfsiz = 0; + uint32_t usblinests = 0; + + if (!data && data_len) { + return -1; + } + inepcfg = readl(&AIC_UDC_REG->inepcfg[ep_idx]); + if (inepcfg & DEPCTL_EPENA) { + return -2; + } + if (ep_idx && !(inepcfg & DEPCTL_MPS_MASK)) { + return -3; + } + if ((uint32_t)(uintptr_t)data & 0x03) { + return -4; + } + + g_aic_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_aic_udc.in_ep[ep_idx].xfer_len = data_len; + g_aic_udc.in_ep[ep_idx].actual_xfer_len = 0; + +#ifdef CONFIG_USB_AIC_DMA_ENABLE + if (cache_align && (ep_idx != 0) && (data_len > 0) && + ((((uint32_t)(uintptr_t)data % CACHE_LINE_SIZE) != 0) || + (((uint32_t)(uintptr_t)(data + data_len) % CACHE_LINE_SIZE) != 0))) { + + if (g_aic_udc.in_ep[ep_idx].xfer_align_len != data_len) { + int ret = 0; + + aic_udc_ibuf_free(&g_aic_udc.in_ep[ep_idx]); + ret = aic_udc_ibuf_alloc(&g_aic_udc.in_ep[ep_idx], data_len); + if (ret) + return ret; + } + memcpy(g_aic_udc.in_ep[ep_idx].xfer_align_buf, data, data_len); + data = g_aic_udc.in_ep[ep_idx].xfer_align_buf; + } else { + aic_udc_ibuf_free(&g_aic_udc.in_ep[ep_idx]); + } + + if (data_len>0) + aic_udc_dcache_clean((uintptr_t)data, ALIGN_UP(data_len, CACHE_LINE_SIZE)); +#endif + + ineptsfsiz = readl(&AIC_UDC_REG->ineptsfsiz[ep_idx]); + ineptsfsiz &= ~(DXEPTSIZ_PKT_CNT_MASK); + ineptsfsiz &= ~(DXEPTSIZ_XFER_SIZE_MASK); + + if (data_len == 0) { + ineptsfsiz |= (DXEPTSIZ_PKT_CNT_MASK & (1U << 19)); + writel(ineptsfsiz, &AIC_UDC_REG->ineptsfsiz[ep_idx]); + inepcfg |= (DEPCTL_CNAK | DEPCTL_EPENA); + writel(inepcfg, &AIC_UDC_REG->inepcfg[ep_idx]); + return 0; + } + + if (ep_idx == 0) { + if (data_len > g_aic_udc.in_ep[ep_idx].ep_mps) { + data_len = g_aic_udc.in_ep[ep_idx].ep_mps; + } + g_aic_udc.in_ep[ep_idx].xfer_len = data_len; + ineptsfsiz |= (DXEPTSIZ_PKT_CNT_MASK & (1U << 19)); + ineptsfsiz |= (DXEPTSIZ_XFER_SIZE_MASK & data_len); + } else { + pktcnt = (uint16_t)((data_len + g_aic_udc.in_ep[ep_idx].ep_mps - 1U) / g_aic_udc.in_ep[ep_idx].ep_mps); + + ineptsfsiz |= (DXEPTSIZ_PKT_CNT_MASK & (pktcnt << 19)); + ineptsfsiz |= (DXEPTSIZ_XFER_SIZE_MASK & data_len); + } + + if (g_aic_udc.in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + usblinests = readl(&AIC_UDC_REG->usblinests); + if ((usblinests & (1U << 8)) == 0U) { + inepcfg &= ~DEPCTL_SETD0PID; + inepcfg |= DEPCTL_SETD1PID; + } else { + inepcfg &= ~DEPCTL_SETD1PID; + inepcfg |= DEPCTL_SETD0PID; + } + ineptsfsiz &= ~(DXEPTSIZ_MULCNT_MASK); + ineptsfsiz |= ((pktcnt << DXEPTSIZ_MULCNT_SHIFT) & DXEPTSIZ_MULCNT_MASK); + } else if (g_aic_udc.in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_INTERRUPT) { + ineptsfsiz &= ~(DXEPTSIZ_MULCNT_MASK); + ineptsfsiz |= (1U << DXEPTSIZ_MULCNT_SHIFT); + } + writel(ineptsfsiz, &AIC_UDC_REG->ineptsfsiz[ep_idx]); + +#ifdef CONFIG_USB_AIC_DMA_ENABLE + writel((uint32_t)(uintptr_t)data, &AIC_UDC_REG->inepdmaaddr[ep_idx]); +#endif + + writel(0xFFFFFFFFU, &AIC_UDC_REG->inepint[ep_idx]); + + inepcfg |= (DEPCTL_CNAK | DEPCTL_EPENA); + writel(inepcfg, &AIC_UDC_REG->inepcfg[ep_idx]); + + return 0; +} + + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + return usbd_ep_start_write_raw(ep, data, data_len, 1); +} + +int usbd_ep_start_read_raw(const uint8_t ep, uint8_t *data, uint32_t data_len, uint8_t cache_align) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint32_t pktcnt = 0; + uint32_t i = 0; + uint32_t outepcfg = 0; + uint32_t outeptsfsiz = 0; + uint32_t usblinests = 0; + + if (!data && data_len) { + return -1; + } + outepcfg = readl(&AIC_UDC_REG->outepcfg[ep_idx]); + if (outepcfg & DEPCTL_EPENA) { + for (i = 0; i < 100000; i++) { + outepcfg = readl(&AIC_UDC_REG->outepcfg[ep_idx]); + if (!(outepcfg & DEPCTL_EPENA)) + break; + } + if (i == 1000000) { + g_aic_udc.out_ep[ep_idx].xfer_len = data_len; + USB_LOG_ERR("ep%d AIC_UDC_REG->outepcfg[ep_idx] = 0x%x.\n", + (unsigned int)ep_idx, (unsigned int)outepcfg); + return -2; + } + } + if (ep_idx && !(outepcfg & DEPCTL_MPS_MASK)) { + return -3; + } + if (((uint32_t)(uintptr_t)data) & 0x03) { + return -4; + } + + g_aic_udc.out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_aic_udc.out_ep[ep_idx].xfer_len = data_len; + g_aic_udc.out_ep[ep_idx].actual_xfer_len = 0; + +#ifdef CONFIG_USB_AIC_DMA_ENABLE + if (cache_align && (ep_idx != 0) && (data_len > 0) && + ((((uint32_t)(uintptr_t)data % CACHE_LINE_SIZE) != 0) || + (((uint32_t)(uintptr_t)(data + data_len) % CACHE_LINE_SIZE) != 0))) { + + if (g_aic_udc.out_ep[ep_idx].xfer_align_len != data_len) { + int ret = 0; + + aic_udc_obuf_free(&g_aic_udc.out_ep[ep_idx]); + ret = aic_udc_obuf_alloc(&g_aic_udc.out_ep[ep_idx], data_len); + if (ret) + return ret; + } + data = g_aic_udc.out_ep[ep_idx].xfer_align_buf; + } else { + aic_udc_obuf_free(&g_aic_udc.out_ep[ep_idx]); + } + + if (data_len > 0) + aic_udc_dcache_invalidate((uintptr_t)data, ALIGN_UP(data_len, CACHE_LINE_SIZE)); +#endif + + outeptsfsiz = readl(&AIC_UDC_REG->outeptsfsiz[ep_idx]); + outeptsfsiz &= ~(DXEPTSIZ_PKT_CNT_MASK); + outeptsfsiz &= ~(DXEPTSIZ_XFER_SIZE_MASK); + outeptsfsiz &= ~(DXEPTSIZ_MULCNT_MASK); + + if (data_len == 0) { + outeptsfsiz |= (DXEPTSIZ_PKT_CNT_MASK & (1 << 19)); + outeptsfsiz |= (DXEPTSIZ_XFER_SIZE_MASK & g_aic_udc.out_ep[ep_idx].ep_mps); + writel(outeptsfsiz, &AIC_UDC_REG->outeptsfsiz[ep_idx]); + outepcfg |= (DEPCTL_CNAK | DEPCTL_EPENA); + writel(outepcfg, &AIC_UDC_REG->outepcfg[ep_idx]); + return 0; + } + + if (ep_idx == 0) { + if (data_len > g_aic_udc.out_ep[ep_idx].ep_mps) { + data_len = g_aic_udc.out_ep[ep_idx].ep_mps; + } + g_aic_udc.out_ep[ep_idx].xfer_len = data_len; + outeptsfsiz |= (DXEPTSIZ_PKT_CNT_MASK & (1U << 19)); + outeptsfsiz |= (DXEPTSIZ_XFER_SIZE_MASK & data_len); + writel(outeptsfsiz, &AIC_UDC_REG->outeptsfsiz[ep_idx]); + } else { + pktcnt = (uint16_t)((data_len + g_aic_udc.out_ep[ep_idx].ep_mps - 1U) / g_aic_udc.out_ep[ep_idx].ep_mps); + + outeptsfsiz |= (DXEPTSIZ_PKT_CNT_MASK & (pktcnt << 19)); + outeptsfsiz |= (DXEPTSIZ_XFER_SIZE_MASK & data_len); + writel(outeptsfsiz, &AIC_UDC_REG->outeptsfsiz[ep_idx]); + } + +#ifdef CONFIG_USB_AIC_DMA_ENABLE + writel((uint32_t)(uintptr_t)data, &AIC_UDC_REG->outepdmaaddr[ep_idx]); +#endif + if (g_aic_udc.out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + usblinests = readl(&AIC_UDC_REG->usblinests); + if ((usblinests & (1U << 8)) == 0U) { + outepcfg &= ~DEPCTL_SETD0PID; + outepcfg |= DEPCTL_SETD1PID; + } else { + outepcfg &= ~DEPCTL_SETD1PID; + outepcfg |= DEPCTL_SETD0PID; + } + } + writel(0xFFFFFFFFU, &AIC_UDC_REG->outepint[ep_idx]); + outepcfg |= (DEPCTL_CNAK | DEPCTL_EPENA); + writel(outepcfg, &AIC_UDC_REG->outepcfg[ep_idx]); + + return 0; +} + + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + return usbd_ep_start_read_raw(ep, data, data_len, 1); +} + +void USBD_IRQHandler(void) +{ + uint32_t gint_status, ep_idx, ep_intr, epint, daintmask, tmpreg, tmpreg01; + gint_status = aic_get_glb_intstatus(); + + /* Avoid spurious interrupt */ + if (gint_status == 0) { + return; + } + +#ifndef CONFIG_USB_AIC_DMA_ENABLE + uint32_t temp; + uint32_t read_count; + + /* Handle RxQLevel Interrupt */ + if (gint_status & INT_RX_FIFO_NOT_EMPTY) { + tmpreg = readl(&AIC_UDC_REG->usbintmsk); + tmpreg &= ~(INT_RX_FIFO_NOT_EMPTY); + writel(tmpreg, &AIC_UDC_REG->usbintmsk); + + temp = readl(&AIC_UDC_REG->rxfifosts_pop); + ep_idx = temp & RXFIFOSTS_EPNUM_MASK; + + if ((temp & RXFIFOSTS_PKTSTS_MASK) == PKTSTS_OUT_DATA_PKT_REC) { + read_count = (temp & RXFIFOSTS_BCNT_MASK) >> 4; + if (read_count != 0) { + aic_ep_read(g_aic_udc.out_ep[ep_idx].xfer_buf, read_count); + g_aic_udc.out_ep[ep_idx].xfer_buf += read_count; + } + } else if ((temp & RXFIFOSTS_PKTSTS_MASK) == PKTSTS_SETUP_DATA_PKT_REC) { + read_count = (temp & RXFIFOSTS_BCNT_MASK) >> 4; + aic_ep_read((uint8_t *)&g_aic_udc.setup, read_count); + } else { + /* ... */ + } + tmpreg = readl(&AIC_UDC_REG->usbintmsk); + tmpreg |= INT_RX_FIFO_NOT_EMPTY; + writel(tmpreg, &AIC_UDC_REG->usbintmsk); + } +#endif + if (gint_status & INT_OUT_EP) { + ep_idx = 0; + ep_intr = aic_get_outeps_intstatus(); + while (ep_intr != 0U) { + if ((ep_intr & 0x1U) != 0U) { + epint = aic_get_outep_intstatus(ep_idx); + writel(epint, &AIC_UDC_REG->outepint[ep_idx]); + + struct aic_ep_state *ep = &g_aic_udc.out_ep[ep_idx]; + + if ((ep_idx == 0)) { + #ifdef CONFIG_USB_AIC_DMA_ENABLE + extern void usb_dc_sync_dma(void); + usb_dc_sync_dma(); + if (ep->xfer_align_buf) + memcpy(ep->xfer_buf, ep->xfer_align_buf, ep->xfer_len); + #endif + + if (ep0_ctrl_stage == AIC_EP0_SETUP) { + /* Setup data-out will send STATUS_PHASE_RCVD interrupt when next setup. + Attemp to re-read setup data. */ + if (epint & CTRL_OUT_EP_STATUS_PHASE_RCVD) { + aic_ep0_start_read_setup((uint8_t *)&g_aic_udc.setup); + } + + /* Normal setup handle */ + if (epint & CTRL_OUT_EP_SETUP_PHASE_DONE) { + if (g_aic_udc.setup.wLength) + if ((g_aic_udc.setup.bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_OUT) + ep0_ctrl_stage = AIC_EP0_DATA_OUT; + else + ep0_ctrl_stage = AIC_EP0_DATA_IN; + else + ep0_ctrl_stage = AIC_EP0_STATUS_IN; + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_aic_udc.setup); + } + } else { + if ((epint & TRANSFER_DONE) == TRANSFER_DONE) { + if (ep->xfer_len == 0) { + /* Out status, start reading setup */ + aic_ep0_start_read_setup((uint8_t *)&g_aic_udc.setup); + } else { + //ep->actual_xfer_len = ep->xfer_len - ((AIC_UDC_REG->outeptsfsiz[ep_idx]) & DXEPTSIZ_XFER_SIZE_MASK); + ep->actual_xfer_len = ep->xfer_len; + ep->xfer_len = 0; + usbd_event_ep_out_complete_handler(0, 0x00, ep->actual_xfer_len); + } + } + } + } else { + #ifdef CONFIG_USB_AIC_DMA_ENABLE + extern void usb_dc_sync_dma(void); + usb_dc_sync_dma(); + if (ep->xfer_align_buf) + memcpy(ep->xfer_buf, ep->xfer_align_buf, ep->xfer_len); + #endif + tmpreg = readl(&AIC_UDC_REG->outeptsfsiz[ep_idx]); + ep->actual_xfer_len = ep->xfer_len - (tmpreg & DXEPTSIZ_XFER_SIZE_MASK); + ep->xfer_len = 0; + usbd_event_ep_out_complete_handler(0, ep_idx, ep->actual_xfer_len); + } + +#ifndef CONFIG_USB_AIC_DMA_ENABLE + if ((epint & CTRL_OUT_EP_SETUP_PHASE_DONE) == CTRL_OUT_EP_SETUP_PHASE_DONE) { + if (ep0_ctrl_stage == 1) { + ep0_ctrl_stage = 2; + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_aic_udc.setup); + } + } +#endif + } + ep_intr >>= 1U; + ep_idx++; + } + } + +#ifndef CONFIG_USB_AIC_DMA_ENABLE + if (gint_status & INT_NP_TX_FIFO_EMPTY) { + tmpreg = readl(&AIC_UDC_REG->usbintmsk); + tmpreg &= ~(INT_NP_TX_FIFO_EMPTY); + writel(tmpreg, &AIC_UDC_REG->usbintmsk); + aic_tx_fifo_empty_procecss(0); + } +#endif + + if (gint_status & INT_IN_EP) { + ep_idx = 0U; + ep_intr = aic_get_ineps_intstatus(); + while (ep_intr != 0U) { + if ((ep_intr & 0x1U) != 0U) { + epint = aic_get_inep_intstatus(ep_idx); + writel(epint, &AIC_UDC_REG->inepint[ep_idx]); + + if (epint & INTKNEPMIS) { + aic_udelay(100); + usbd_npinep_rewrite(ep_idx); + } + + if ((epint & TRANSFER_DONE) == TRANSFER_DONE) { + if (ep_idx == 0) { + if (g_aic_udc.setup.wLength && ((g_aic_udc.setup.bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_OUT)) { + /* In status, start reading setup */ + aic_ep0_start_read_setup((uint8_t *)&g_aic_udc.setup); + } else if (g_aic_udc.setup.wLength == 0) { + /* In status, start reading setup */ + aic_ep0_start_read_setup((uint8_t *)&g_aic_udc.setup); + } else { + g_aic_udc.in_ep[ep_idx].actual_xfer_len = g_aic_udc.in_ep[ep_idx].xfer_len - ((AIC_UDC_REG->ineptsfsiz[ep_idx]) & DXEPTSIZ_XFER_SIZE_MASK); + g_aic_udc.in_ep[ep_idx].xfer_len = 0; + usbd_event_ep_in_complete_handler(0, 0x80, g_aic_udc.in_ep[ep_idx].actual_xfer_len); + } + } else { + tmpreg = readl(&AIC_UDC_REG->ineptsfsiz[ep_idx]); + g_aic_udc.in_ep[ep_idx].actual_xfer_len = g_aic_udc.in_ep[ep_idx].xfer_len - (tmpreg & DXEPTSIZ_XFER_SIZE_MASK); + g_aic_udc.in_ep[ep_idx].xfer_len = 0; + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_aic_udc.in_ep[ep_idx].actual_xfer_len); + } + } + + #ifndef CONFIG_USB_AIC_DMA_ENABLE + if ((epint & INTKN_TXFEMP) == INTKN_TXFEMP) { + aic_tx_fifo_empty_procecss(ep_idx); + } + #endif + } + ep_intr >>= 1U; + ep_idx++; + } + } + if (gint_status & INT_RESET) { + writel(INT_RESET, &AIC_UDC_REG->usbintsts); + tmpreg = readl(&AIC_UDC_REG->usbdevfunc); + tmpreg &= ~USBDEVFUNC_RMTWKUPSIG; + writel(tmpreg, &AIC_UDC_REG->usbdevfunc); + + usb_dc_rst(); + } + + if (gint_status & INT_ENUMDONE) { + writel(INT_ENUMDONE, &AIC_UDC_REG->usbintsts); + aic_set_turnaroundtime(usbd_clk, aic_get_devspeed()); + + tmpreg = readl(&AIC_UDC_REG->usbdevfunc); + tmpreg |= USBDEVFUNC_CGNPINNAK; + writel(tmpreg, &AIC_UDC_REG->usbdevfunc); + } + if (gint_status & INT_INCOMP_ISO_OUT_INT) { + daintmask = readl(&AIC_UDC_REG->usbepintmsk); + daintmask >>= 16; + + for (ep_idx = 1; ep_idx < USB_NUM_BIDIR_ENDPOINTS; ep_idx++) { + if ((BIT(ep_idx) & ~daintmask) || (g_aic_udc.out_ep[ep_idx].ep_type != USB_ENDPOINT_TYPE_ISOCHRONOUS)) + continue; + + tmpreg = readl(&AIC_UDC_REG->outepcfg[ep_idx]); + if (!(tmpreg & DEPCTL_USBACTEP)) + continue; + tmpreg01 = readl(&AIC_UDC_REG->usblinests); + if ((tmpreg01 & (1U << 8)) != 0U) { + tmpreg |= DEPCTL_SETD0PID; + tmpreg &= ~DEPCTL_SETD1PID; + } else { + tmpreg &= ~DEPCTL_SETD0PID; + tmpreg |= DEPCTL_SETD1PID; + } + writel(tmpreg, &AIC_UDC_REG->outepcfg[ep_idx]); + } + + writel(INT_INCOMP_ISO_OUT_INT, &AIC_UDC_REG->usbintsts); + } + + if (gint_status & INT_INCOMP_ISO_IN_INT) { + daintmask = readl(&AIC_UDC_REG->usbepintmsk); + daintmask &= 0xFFFF; + + for (ep_idx = 1; ep_idx < USB_NUM_BIDIR_ENDPOINTS; ep_idx++) { + if (((BIT(ep_idx) & ~daintmask)) || (g_aic_udc.in_ep[ep_idx].ep_type != USB_ENDPOINT_TYPE_ISOCHRONOUS)) + continue; + + tmpreg = readl(&AIC_UDC_REG->inepcfg[ep_idx]); + if (!(tmpreg & DEPCTL_USBACTEP)) + continue; + tmpreg01 = readl(&AIC_UDC_REG->usblinests); + if ((tmpreg01 & (1U << 8)) != 0U) { + tmpreg |= DEPCTL_SETD0PID; + tmpreg &= ~DEPCTL_SETD1PID; + } else { + tmpreg &= ~DEPCTL_SETD0PID; + tmpreg |= DEPCTL_SETD1PID; + } + writel(tmpreg, &AIC_UDC_REG->inepcfg[ep_idx]); + } + + writel(INT_INCOMP_ISO_IN_INT, &AIC_UDC_REG->usbintsts); + } + + if (gint_status & INT_SOF) { + writel(INT_SOF, &AIC_UDC_REG->usbintsts); + } + if (gint_status & INT_SUSPEND) { + writel(INT_SUSPEND, &AIC_UDC_REG->usbintsts); + usbd_event_suspend_handler(0); + } + if (gint_status & INT_RESUME) { + writel(INT_RESUME, &AIC_UDC_REG->usbintsts); + } +} diff --git a/src/lib/CherryUSB/port/aic/usb_dc_aic_ll.c b/src/lib/CherryUSB/port/aic/usb_dc_aic_ll.c new file mode 100644 index 000000000..e9b5b692f --- /dev/null +++ b/src/lib/CherryUSB/port/aic/usb_dc_aic_ll.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2022-2024, ArtInChip Technology Co., Ltd + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "usbd_core.h" +#include "usb_dc_aic_reg.h" + +extern irqreturn_t USBD_IRQHandler(int irq, void * data); + +uint32_t usbd_clk; +static unsigned char dma_sync_buffer[CACHE_LINE_SIZE] __attribute__((aligned(CACHE_LINE_SIZE))); + +void usb_dc_sync_dma(void) +{ + asm volatile("sw t0, (%0)" : : "r"(dma_sync_buffer)); + csi_dcache_clean_range((phy_addr_t)(ptr_t)dma_sync_buffer, CACHE_LINE_SIZE); +} + +void usb_dc_low_level_init(void) +{ + /* set usb0 phy switch: Host/Device */ +#if defined(AIC_USING_USB0_DEVICE) || defined(AIC_USING_USB0_OTG) + hal_syscfg_usb_phy0_sw_host(0); +#endif + /* set pin-mux */ + + /* enable clock */ + hal_clk_enable(CONFIG_USB_AIC_DC_PHY_CLK); + hal_clk_enable(CONFIG_USB_AIC_DC_CLK); + aicos_udelay(300); + hal_reset_assert(CONFIG_USB_AIC_DC_PHY_RESET); + hal_reset_assert(CONFIG_USB_AIC_DC_RESET); + aicos_udelay(300); + hal_reset_deassert(CONFIG_USB_AIC_DC_PHY_RESET); + hal_reset_deassert(CONFIG_USB_AIC_DC_RESET); + aicos_udelay(300); + + usbd_clk = hal_clk_get_freq(CONFIG_USB_AIC_DC_CLK); + + /* register interrupt callback */ + aicos_request_irq(CONFIG_USB_AIC_DC_IRQ_NUM, USBD_IRQHandler, + 0, "usb_device", NULL); + aicos_irq_enable(CONFIG_USB_AIC_DC_IRQ_NUM); +} + +void usb_dc_low_level_deinit(void) +{ + aicos_irq_disable(CONFIG_USB_AIC_DC_IRQ_NUM); + + hal_reset_assert(CONFIG_USB_AIC_DC_PHY_RESET); + hal_reset_assert(CONFIG_USB_AIC_DC_RESET); + hal_clk_disable(CONFIG_USB_AIC_DC_PHY_CLK); + hal_clk_disable(CONFIG_USB_AIC_DC_CLK); +} + diff --git a/src/lib/CherryUSB/port/aic/usb_dc_aic_reg.h b/src/lib/CherryUSB/port/aic/usb_dc_aic_reg.h new file mode 100644 index 000000000..b35b8d4fc --- /dev/null +++ b/src/lib/CherryUSB/port/aic/usb_dc_aic_reg.h @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2022-2024, Artinchip Technology Co., Ltd + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef __USB_DC_AIC_REG_H__ +#define __USB_DC_AIC_REG_H__ + +#define __IO volatile /*!< Defines 'read / write' permissions */ + +typedef struct { + __IO uint32_t ahbbasic; /* 0x0000: AHBBASIC */ + __IO uint32_t usbdevinit; /* 0x0004: USBDEVINIT */ + __IO uint32_t usbphyif; /* 0x0008: USBPHYIF */ + __IO uint32_t usbulpiphy; /* 0x000C: USBULPIPHY */ + __IO uint32_t usbintsts; /* 0x0010: USBINTSTS */ + __IO uint32_t usbintmsk; /* 0x0014: USBINTMSK */ + __IO uint32_t rxfifosiz; /* 0x0018: RXFIFOSIZ */ + __IO uint32_t rxfifosts_pop; /* 0x001C: RXFIFOSTS pop */ + __IO uint32_t nptxfifosiz; /* 0x0020: NPTXFIFOSIZ */ + __IO uint32_t nptxfifosts; /* 0x0024: NPTXFIFOSTS */ + __IO uint32_t txfifosiz[2]; /* 0x0028 - 0x002C: TXFIFOSIZ() */ + __IO uint32_t rxfifosts_dbg; /* 0x0030: RXFIFOSTS_DBG */ + uint8_t res0[0x1cc]; + __IO uint32_t usbdevconf; /* 0x0200: USBDEVCONF */ + __IO uint32_t usbdevfunc; /* 0x0204: USBDEVFUNC */ + __IO uint32_t usblinests; /* 0x0208: USBLINESTS */ + __IO uint32_t inepintmsk; /* 0x020C: INEPINTMSK */ + __IO uint32_t outepintmsk; /* 0x0210: OUTEPINTMSK */ + __IO uint32_t usbepint; /* 0x0214: USBEPINT */ + __IO uint32_t usbepintmsk; /* 0x0218: USBEPINTMSK */ + uint8_t res1[4]; + __IO uint32_t inepcfg[5]; /* 0x0220 - 0x0230: INEPCFG() */ + uint8_t res2[0xc]; + __IO uint32_t outepcfg[5]; /* 0x0240 - 0x0250: OUTEPCFG() */ + uint8_t res3[0xc]; + __IO uint32_t inepint[5]; /* 0x0260 - 0x0270: INEPINT() */ + uint8_t res4[0xc]; + __IO uint32_t outepint[5]; /* 0x0280 - 0x0290: OUTEPINT() */ + uint8_t res5[0xc]; + __IO uint32_t ineptsfsiz[5]; /* 0x02A0 - 0x02B0: INEPTSFSIZ() */ + uint8_t res6[0xc]; + __IO uint32_t outeptsfsiz[5]; /* 0x02C0 - 0x02D0: OUTEPTSFSIZ() */ + uint8_t res7[0x2c]; + __IO uint32_t inepdmaaddr[5]; /* 0x0300 - 0x0310: INEPDMAADDR() */ + uint8_t res8[0xc]; + __IO uint32_t outepdmaaddr[5]; /* 0x0320 - 0x0330: OUTEPDMAADDR() */ + uint8_t res9[0xc]; + __IO uint32_t ineptxsts[5]; /* 0x0340 - 0x0350: INEPTXSTS() */ + uint8_t res10[0xc]; + __IO uint32_t dtknqr1; /* 0x0360: DTKNQR1 */ + __IO uint32_t dtknqr2; /* 0x0364: DTKNQR2 */ + __IO uint32_t dtknqr3; /* 0x0368: DTKNQR3 */ + __IO uint32_t dtknqr4; /* 0x036C: DTKNQR4 */ +}AIC_UDC_RegDef; + +/*===================================================================== */ +/*definitions related to CSR setting */ + +/* AHBBASIC */ +#define AHBBASIC_NOTI_ALL_DMA_WRIT (1 << 8) +#define AHBBASIC_REM_MEM_SUPP (1 << 7) +#define AHBBASIC_INV_DESC_ENDIANNESS (1 << 6) +#define AHBBASIC_AHB_SINGLE (1 << 5) +#define AHBBASIC_TXENDDELAY (1 << 3) +#define AHBBASIC_AHBIDLE (1 << 2) +#define AHBBASIC_DMAREQ (1 << 1) + +/* USBDEVINIT */ +#define USBDEVINIT_HBSTLEN_MASK (0xf << 12) +#define USBDEVINIT_HBSTLEN_SHIFT 12 +#define USBDEVINIT_HBSTLEN_SINGLE 0 +#define USBDEVINIT_HBSTLEN_INCR 1 +#define USBDEVINIT_HBSTLEN_INCR4 3 +#define USBDEVINIT_HBSTLEN_INCR8 5 +#define USBDEVINIT_HBSTLEN_INCR16 7 +#define USBDEVINIT_DMA_EN (1 << 11) +#define USBDEVINIT_NP_TXF_EMP_LVL (1 << 10) +#define USBDEVINIT_GLBL_INTR_EN (1 << 9) +#define USBDEVINIT_CTRL_MASK (USBDEVINIT_NP_TXF_EMP_LVL | \ + USBDEVINIT_DMA_EN | \ + USBDEVINIT_GLBL_INTR_EN) +#define USBDEVINIT_IN_TKNQ_FLSH (1 << 8) +#define USBDEVINIT_TXFNUM_MASK (0x1f << 3) +#define USBDEVINIT_TXFNUM_SHIFT 3 +#define USBDEVINIT_TXFNUM_LIMIT 0x1f +#define USBDEVINIT_TXFNUM(_x) ((_x) << 3) +#define USBDEVINIT_TXFFLSH (1 << 2) +#define USBDEVINIT_RXFFLSH (1 << 1) +#define USBDEVINIT_CSFTRST (1 << 0) + +/* USBPHYIF */ +#define USBPHYIF_ULPI_CLK_SUSP_M (1 << 19) +#define USBPHYIF_ULPI_AUTO_RES (1 << 18) +#define USBPHYIF_PHY_LP_CLK_SEL (1 << 15) +#define USBPHYIF_USBTRDTIM_MASK (0xf << 10) +#define USBPHYIF_USBTRDTIM_SHIFT 10 +#ifndef USBPHYIF_HS_TRDT_VALUE +#define USBPHYIF_HS_TRDT_VALUE 9U +#endif /* USBD_HS_TRDT_VALUE */ +#ifndef USBPHYIF_FS_TRDT_VALUE +#define USBPHYIF_FS_TRDT_VALUE 5U +#define USBPHYIF_DEFAULT_TRDT_VALUE 9U +#endif /* USBD_HS_TRDT_VALUE */ +#define USBPHYIF_DDRSEL (1 << 7) +#define USBPHYIF_ULPI_UTMI_SEL (1 << 4) +#define USBPHYIF_PHYIF16 (1 << 3) +#define USBPHYIF_PHYIF8 (0 << 3) +#define USBPHYIF_TOUTCAL_MASK (0x7 << 0) +#define USBPHYIF_TOUTCAL_SHIFT 0 +#define USBPHYIF_TOUTCAL_LIMIT 0x7 +#define USBPHYIF_TOUTCAL(_x) ((_x) << 0) + +/* USBINTSTS/USBINTMSK interrupt register */ +#define INT_RESUME (1u << 31) +#define INT_INCOMP_ISO_OUT_INT (0x1 << 21) +#define INT_INCOMP_ISO_IN_INT (0x1 << 20) +#define INT_OUT_EP (0x1 << 19) +#define INT_IN_EP (0x1 << 18) +#define INT_ENUMDONE (0x1 << 13) +#define INT_RESET (0x1 << 12) +#define INT_SUSPEND (0x1 << 11) +#define INT_EARLY_SUSPEND (0x1 << 10) +#define INT_GOUTNAKEFF (0x1 << 7) +#define INT_GINNAKEFF (0x1 << 6) +#define INT_NP_TX_FIFO_EMPTY (0x1 << 5) +#define INT_RX_FIFO_NOT_EMPTY (0x1 << 4) +#define INT_SOF (0x1 << 3) + +#define FULL_SPEED_CONTROL_PKT_SIZE 8 +#define FULL_SPEED_BULK_PKT_SIZE 64 + +#define HIGH_SPEED_CONTROL_PKT_SIZE 64 +#define HIGH_SPEED_BULK_PKT_SIZE 512 + +#define RX_FIFO_SIZE (1024) +#define NPTX_FIFO_SIZE (1024) +#define PTX_FIFO_SIZE (384) + +/* fifo size configure */ +#define EPS_NUM 5 +#define PERIOD_IN_EP_NUM 2 +#define TOTAL_FIFO_SIZE 0x3f6 +#ifdef LPKG_CHERRYUSB_DEVICE_VIDEO_DVP_TEMPLATE +/* video_dvp_template must use 2K Bytes period_tx_fifo */ +#define AIC_RX_FIFO_SIZE 0x99 +#define AIC_NP_TX_FIFO_SIZE 0x100 +#define AIC_PERIOD_TX_FIFO1_SIZE 0x200 +#define AIC_PERIOD_TX_FIFO2_SIZE 0x0 +#else +/* default configuration */ +#define AIC_RX_FIFO_SIZE 0x119 +#define AIC_NP_TX_FIFO_SIZE 0x100 +#define AIC_PERIOD_TX_FIFO1_SIZE 0x100 +#define AIC_PERIOD_TX_FIFO2_SIZE 0xDD +#endif + +#define DEPCTL_TXFNUM_0 (0x0 << 22) +#define DEPCTL_TXFNUM_1 (0x1 << 22) +#define DEPCTL_TXFNUM_2 (0x2 << 22) +#define DEPCTL_TXFNUM_3 (0x3 << 22) +#define DEPCTL_TXFNUM_4 (0x4 << 22) + +/* RXFIFOSTS */ +#define RXFIFOSTS_EPNUM_MASK (0xFU << 0) +#define RXFIFOSTS_BCNT_MASK (0x7FFU << 4) +#define RXFIFOSTS_DPID_MASK (0x3U << 15) +#define RXFIFOSTS_PKTSTS_SHIFT (17) +#define RXFIFOSTS_PKTSTS_MASK (0xFU << RXFIFOSTS_PKTSTS_SHIFT) +#define PKTSTS_GLOBAL_OUT_NAK (0x1 << RXFIFOSTS_PKTSTS_SHIFT) +#define PKTSTS_OUT_DATA_PKT_REC (0x2 << RXFIFOSTS_PKTSTS_SHIFT) +#define PKTSTS_OUT_TRANSFER_COMP (0x3 << RXFIFOSTS_PKTSTS_SHIFT) +#define PKTSTS_SETUP_TRANSACTION_COMP (0x4 << RXFIFOSTS_PKTSTS_SHIFT) +#define PKTSTS_SETUP_DATA_PKT_REC (0x6 << RXFIFOSTS_PKTSTS_SHIFT) +#define RXFIFOSTS_FN_MASK (0xFU << 21) + +/* USBDEVCONF */ +#define DEV_SPEED_HIGH_SPEED_20 (0x0 << 0) +#define DEV_SPEED_FULL_SPEED_20 (0x1 << 0) +#define DEV_SPEED_LOW_SPEED_11 (0x2 << 0) +#define DEV_SPEED_FULL_SPEED_11 (0x3 << 0) +#define EP_MISS_CNT(x) (x << 18) +#define DEVICE_ADDRESS_MASK (0x7F << 4) +#define DEVICE_ADDRESS(x) (x << 4) +#define PERIOD_FRAME_INTERVAL_80 (0 << 11) +#define PERIOD_FRAME_INTERVAL_85 (1 << 11) +#define PERIOD_FRAME_INTERVAL_90 (2 << 11) +#define PERIOD_FRAME_INTERVAL_95 (3 << 11) + +/* USBDEVFUNC */ +#define NORMAL_OPERATION (0x1 << 0) +#define SOFT_DISCONNECT (0x1 << 1) +#define USBDEVFUNC_SERVICE_INTERVAL_SUPPORTED (1 << 19) +#define USBDEVFUNC_PWRONPRGDONE (1 << 11) +#define USBDEVFUNC_CGOUTNAK (1 << 10) +#define USBDEVFUNC_SGOUTNAK (1 << 9) +#define USBDEVFUNC_CGNPINNAK (1 << 8) +#define USBDEVFUNC_SGNPINNAK (1 << 7) +#define USBDEVFUNC_TSTCTL_MASK (0x7 << 4) +#define USBDEVFUNC_TSTCTL_SHIFT (4) +#define USBDEVFUNC_GOUTNAKSTS (1 << 3) +#define USBDEVFUNC_GNPINNAKSTS (1 << 2) +#define USBDEVFUNC_SFTDISCON (1 << 1) +#define USBDEVFUNC_RMTWKUPSIG (1 << 0) + +/* USBLINESTS: Enumeration speed */ +#define USB_ENUM_SPEED_SHIFT 1 +#define USB_ENUM_SPEED_MASK (0x3 << USB_ENUM_SPEED_SHIFT) +#define USB_ENUM_SPEED_HIGH 0 +#define USB_ENUM_SPEED_FULL 1 +#define USB_HIGH_30_60MHZ (0x0 << USB_ENUM_SPEED_SHIFT) +#define USB_FULL_30_60MHZ (0x1 << USB_ENUM_SPEED_SHIFT) +#define USB_LOW_6MHZ (0x2 << USB_ENUM_SPEED_SHIFT) +#define USB_FULL_48MHZ (0x3 << USB_ENUM_SPEED_SHIFT) + +/* USBEPINT endpoint interrupt register */ +#define DAINT_OUT_BIT (16) +#define DAINT_IN_MASK (0xFFFF) +#define DAINT_OUT_MASK (0xFFFFU << DAINT_OUT_BIT) + +/* INEPCFG()/OUTEPCFG() + * devicecontrol IN/OUT endpoint 0 control register + */ +#define DEPCTL_EPENA (1u << 31) +#define DEPCTL_EPDIS (0x1 << 30) +#define DEPCTL_SETD1PID (0x1 << 29) +#define DEPCTL_SETD0PID (0x1 << 28) +#define DEPCTL_SNAK (0x1 << 27) +#define DEPCTL_CNAK (0x1 << 26) +#define DEPCTL_TXFIFONUM_SHIFT 22 +#define DEPCTL_TXFIFONUM_MASK (0xF << 22) +#define DEPCTL_STALL (0x1 << 21) +#define DEPCTL_TYPE_BIT (18) +#define DEPCTL_TYPE_MASK (0x3 << 18) +#define DEPCTL_CTRL_TYPE (0x0 << 18) +#define DEPCTL_ISO_TYPE (0x1 << 18) +#define DEPCTL_BULK_TYPE (0x2 << 18) +#define DEPCTL_INTR_TYPE (0x3 << 18) +#define DEPCTL_USBACTEP (0x1 << 15) +#define DEPCTL_NEXT_EP_BIT (11) +#define DEPCTL_NEXT_EP_MASK (0xFU << DEPCTL_NEXT_EP_BIT) +#define DEPCTL_MPS_BIT (0) +#define DEPCTL_MPS_MASK (0x7FF) + +#define DEPCTL0_MPS_64 (0x0 << 0) +#define DEPCTL0_MPS_32 (0x1 << 0) +#define DEPCTL0_MPS_16 (0x2 << 0) +#define DEPCTL0_MPS_8 (0x3 << 0) +#define DEPCTL_MPS_BULK_512 (512 << 0) +#define DEPCTL_MPS_INT_MPS_16 (16 << 0) + +#define DIEPCTL0_NEXT_EP_BIT (11) + +/* INEPINT/OUTEPINT device IN/OUT endpoint interrupt register */ +#define CTRL_OUT_EP_SETUP_RCVD (0x1 << 15) +#define TXFIFO_EMP_INT (0x1 << 7) +#define INEP_NAKEFF (0x1 << 6) +#define BACK2BACK_SETUP_RECEIVED (0x1 << 6) +#define CTRL_OUT_EP_STATUS_PHASE_RCVD (0x1 << 5) +#define INTKNEPMIS (0x1 << 5) +#define INTKN_TXFEMP (0x1 << 4) +#define NON_ISO_IN_EP_TIMEOUT (0x1 << 3) +#define CTRL_OUT_EP_SETUP_PHASE_DONE (0x1 << 3) +#define AHB_ERROR (0x1 << 2) +#define EPDISBLD (0x1 << 1) +#define TRANSFER_DONE (0x1 << 0) + +/* Masks definitions */ +#define GINTMSK_INIT (INT_OUT_EP | INT_IN_EP | INT_RESUME | INT_ENUMDONE\ + | INT_RESET | INT_SUSPEND) +#define DOEPMSK_INIT (CTRL_OUT_EP_SETUP_PHASE_DONE |\ + AHB_ERROR | TRANSFER_DONE) +#define DIEPMSK_INIT (NON_ISO_IN_EP_TIMEOUT | AHB_ERROR | TRANSFER_DONE) +#define GAHBCFG_INIT (USBDEVINIT_DMA_EN | USBDEVINIT_GLBL_INTR_EN\ + | (USBDEVINIT_HBSTLEN_INCR4 <<\ + USBDEVINIT_HBSTLEN_SHIFT)) + +/* INEPTSFSIZ/OUTEPTSFSIZ */ +#define DXEPTSIZ_MULCNT_SHIFT 29 +#define DXEPTSIZ_MULCNT_MASK (0x3U << DXEPTSIZ_MULCNT_SHIFT) +#define DXEPTSIZ_PKT_CNT_SHIFT 19 +#define DXEPTSIZ_PKT_CNT_MASK (0x3FFU << DXEPTSIZ_PKT_CNT_SHIFT) +#define DXEPTSIZ_XFER_SIZE_SHIFT 0 +#define DXEPTSIZ_XFER_SIZE_MASK (0x7FFFFU << DXEPTSIZ_XFER_SIZE_SHIFT) + +/* Device Endpoint X Transfer Size Register INEPTSFSIZ() */ +#define DIEPT_SIZ_PKT_CNT(x) (x << 19) +#define DIEPT_SIZ_XFER_SIZE(x) (x << 0) + +/* Device OUT Endpoint X Transfer Size Register OUTEPTSFSIZ() */ +#define DOEPT_SIZ_PKT_CNT(x) (x << 19) +#define DOEPT_SIZ_XFER_SIZE(x) (x << 0) +#define DOEPT_SIZ_XFER_SIZE_MAX_EP0 (0x7F << 0) +#define DOEPT_SIZ_XFER_SIZE_MAX_EP (0x7FFF << 0) + +/* Device Endpoint-N Control Register INEPCFG()/OUTEPCFG() */ +#define DIEPCTL_TX_FIFO_NUM(x) (x << 22) +#define DIEPCTL_TX_FIFO_NUM_MASK (~DIEPCTL_TX_FIFO_NUM(0xF)) + +/* Device ALL Endpoints Interrupt Register (USBEPINT) */ +#define DAINT_IN_EP_INT(x) (x << 0) +#define DAINT_OUT_EP_INT(x) (x << 16) + +#define AIC_EP_FIFO_BASE 0x1000UL +#define AIC_EP_FIFO_SIZE 0x1000UL + +/* In EPn Txfifo Status (INEPTXSTS) */ +#define INEPTXSTS_IN_EP_TXFIFO_STS (0xFFFFU << 0) + + +#endif diff --git a/src/lib/CherryUSB/port/bouffalolab/README.md b/src/lib/CherryUSB/port/bouffalolab/README.md new file mode 100644 index 000000000..7779b2bbd --- /dev/null +++ b/src/lib/CherryUSB/port/bouffalolab/README.md @@ -0,0 +1,5 @@ +# Note + +## Support Chip List + +- BL616/BL808 diff --git a/src/lib/CherryUSB/port/bouffalolab/usb_dc_bl.c b/src/lib/CherryUSB/port/bouffalolab/usb_dc_bl.c new file mode 100644 index 000000000..18cba9302 --- /dev/null +++ b/src/lib/CherryUSB/port/bouffalolab/usb_dc_bl.c @@ -0,0 +1,1157 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "bflb_core.h" +#include "usbd_core.h" +#include "hardware/usb_v2_reg.h" + +/* select only one mode */ +// #define CONFIG_USB_PINGPONG_ENABLE +// #define CONFIG_USB_TRIPLE_ENABLE + +#define BFLB_USB_BASE ((uint32_t)0x20072000) +#define BFLB_PDS_BASE ((uint32_t)0x2000e000) + +#define PDS_USB_CTL_OFFSET (0x500) /* usb_ctl */ +#define PDS_USB_PHY_CTRL_OFFSET (0x504) /* usb_phy_ctrl */ + +/* 0x500 : usb_ctl */ +#define PDS_REG_USB_SW_RST_N (1 << 0U) +#define PDS_REG_USB_EXT_SUSP_N (1 << 1U) +#define PDS_REG_USB_WAKEUP (1 << 2U) +#define PDS_REG_USB_L1_WAKEUP (1 << 3U) +#define PDS_REG_USB_DRVBUS_POL (1 << 4U) +#define PDS_REG_USB_IDDIG (1 << 5U) + +/* 0x504 : usb_phy_ctrl */ +#define PDS_REG_USB_PHY_PONRST (1 << 0U) +#define PDS_REG_USB_PHY_OSCOUTEN (1 << 1U) +#define PDS_REG_USB_PHY_XTLSEL_SHIFT (2U) +#define PDS_REG_USB_PHY_XTLSEL_MASK (0x3 << PDS_REG_USB_PHY_XTLSEL_SHIFT) +#define PDS_REG_USB_PHY_OUTCLKSEL (1 << 4U) +#define PDS_REG_USB_PHY_PLLALIV (1 << 5U) +#define PDS_REG_PU_USB20_PSW (1 << 6U) + +#define USB_SOF_TIMER_MASK_AFTER_RESET_HS (0x44C) +#define USB_SOF_TIMER_MASK_AFTER_RESET_FS (0x2710) + +extern void USBD_IRQHandler(uint8_t busid); + +void USBD_IRQ(int irq, void *arg) +{ + USBD_IRQHandler(0); +} + +static void bflb_usb_phy_init(void) +{ + uint32_t regval; + + /* USB_PHY_CTRL[3:2] reg_usb_phy_xtlsel=0 */ + /* 2000e504 = 0x40; #100; USB_PHY_CTRL[6] reg_pu_usb20_psw=1 (VCC33A) */ + /* 2000e504 = 0x41; #500; USB_PHY_CTRL[0] reg_usb_phy_ponrst=1 */ + /* 2000e500 = 0x20; #100; USB_CTL[0] reg_usb_sw_rst_n=0 */ + /* 2000e500 = 0x22; #500; USB_CTL[1] reg_usb_ext_susp_n=1 */ + /* 2000e500 = 0x23; #100; USB_CTL[0] reg_usb_sw_rst_n=1 */ + /* #1.2ms; wait UCLK */ + /* wait(soc616_b0.usb_uclk); */ + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + regval &= ~PDS_REG_USB_PHY_XTLSEL_MASK; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + regval |= PDS_REG_PU_USB20_PSW; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + regval |= PDS_REG_USB_PHY_PONRST; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + + /* greater than 5T */ + bflb_mtimer_delay_us(1); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + regval &= ~PDS_REG_USB_SW_RST_N; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + + /* greater than 5T */ + bflb_mtimer_delay_us(1); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + regval |= PDS_REG_USB_EXT_SUSP_N; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + + /* wait UCLK 1.2ms */ + bflb_mtimer_delay_ms(3); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + regval |= PDS_REG_USB_SW_RST_N; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + + bflb_mtimer_delay_ms(2); +} + +#define USB_FIFO_F0 0 +#define USB_FIFO_F1 1 +#define USB_FIFO_F2 2 +#define USB_FIFO_F3 3 +#define USB_FIFO_CXF 0xff + +#define USB_FIFO_DIR_OUT 0 +#define USB_FIFO_DIR_IN 1 +#define USB_FIFO_DIR_BID 2 + +#define USB_VDMA_DIR_FIFO2MEM 0 +#define USB_VDMA_DIR_MEM2FIFO 1 + +#define USB_NUM_BIDIR_ENDPOINTS 5 + +/* Endpoint state */ +struct bl_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + bool ep_active; + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +struct bl_udc { + struct bl_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters */ + struct bl_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ +} g_bl_udc; + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_setup_buffer[8]; + +static void bflb_usb_reset_fifo(uint8_t fifo) +{ + uint32_t regval; + + if (fifo == USB_FIFO_CXF) { + regval = getreg32(BFLB_USB_BASE + USB_DEV_CXCFE_OFFSET); + regval |= USB_CX_CLR; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CXCFE_OFFSET); + } else { + regval = getreg32(BFLB_USB_BASE + USB_DEV_FIBC0_OFFSET + 4 * fifo); + regval |= USB_FFRST0_HOV; + putreg32(regval, BFLB_USB_BASE + USB_DEV_FIBC0_OFFSET + 4 * fifo); + } +} + +void bflb_usb_get_setup_packet(uint32_t setup[2]) +{ + uint32_t regval; + + regval = getreg32(BFLB_USB_BASE + USB_DMA_TFN_OFFSET); + regval |= USB_ACC_CXF_HOV; + putreg32(regval, BFLB_USB_BASE + USB_DMA_TFN_OFFSET); + + setup[0] = getreg32(BFLB_USB_BASE + USB_DMA_CPS3_OFFSET); + setup[1] = getreg32(BFLB_USB_BASE + USB_DMA_CPS3_OFFSET); + + regval = getreg32(BFLB_USB_BASE + USB_DMA_TFN_OFFSET); + regval &= ~USB_ACC_CXF_HOV; + putreg32(regval, BFLB_USB_BASE + USB_DMA_TFN_OFFSET); +} + +static void bflb_usb_set_ep_fifomap(uint8_t ep_idx, uint8_t fifo) +{ + uint32_t regval; + + if (ep_idx < 5) { + regval = getreg32(BFLB_USB_BASE + USB_DEV_EPMAP0_OFFSET); + regval &= ~(0xff << ((ep_idx - 1) * 8)); + regval |= (fifo << ((ep_idx - 1) * 8)); + regval |= (fifo << ((ep_idx - 1) * 8 + 4)); + putreg32(regval, BFLB_USB_BASE + USB_DEV_EPMAP0_OFFSET); + } else { + regval = getreg32(BFLB_USB_BASE + USB_DEV_EPMAP1_OFFSET); + regval &= ~(0xff << ((ep_idx - 4 - 1) * 8)); + regval |= (fifo << ((ep_idx - 4 - 1) * 8)); + regval |= (fifo << ((ep_idx - 4 - 1) * 8 + 4)); + putreg32(regval, BFLB_USB_BASE + USB_DEV_EPMAP1_OFFSET); + } +} + +static void bflb_usb_set_fifo_epmap(uint8_t fifo, uint8_t ep_idx, uint8_t dir) +{ + uint32_t regval; + + regval = getreg32(BFLB_USB_BASE + USB_DEV_FMAP_OFFSET); + regval &= ~(0x3f << (fifo * 8)); + regval |= (ep_idx << (fifo * 8)); + regval |= (dir << (fifo * 8 + 4)); + putreg32(regval, BFLB_USB_BASE + USB_DEV_FMAP_OFFSET); +} + +static void bflb_usb_set_outep_mps(uint8_t ep_idx, uint16_t ep_mps) +{ + uint32_t regval; + + regval = getreg32(BFLB_USB_BASE + USB_DEV_OUTMPS1_OFFSET + (ep_idx - 1) * 4); + regval &= ~USB_MAXPS_OEP1_MASK; + regval |= ep_mps; + putreg32(regval, BFLB_USB_BASE + USB_DEV_OUTMPS1_OFFSET + (ep_idx - 1) * 4); +} + +static void bflb_usb_set_inep_mps(uint8_t ep_idx, uint16_t ep_mps) +{ + uint32_t regval; + + regval = getreg32(BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); + regval &= ~USB_MAXPS_IEP1_MASK; + regval |= ep_mps; + putreg32(regval, BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); +} + +static uint8_t bflb_usb_get_fifo_ep(uint8_t fifo) +{ + uint32_t regval; + + regval = (getreg32(BFLB_USB_BASE + USB_DEV_FMAP_OFFSET) & (0xf << (fifo * 8))); + regval >>= (fifo * 8); + return regval; +} + +static void bflb_usb_fifo_config(uint8_t fifo, uint8_t ep_type, uint16_t block_size, uint8_t block_num, bool fifo_en) +{ + uint32_t regval; + + if (fifo < 4) { + regval = getreg32(BFLB_USB_BASE + USB_DEV_FCFG_OFFSET); + regval &= ~(0x3f << (fifo * 8)); + regval |= (ep_type << (fifo * 8 + 0)); + regval |= ((block_num - 1) << (fifo * 8 + 2)); + if (block_size == 1024) { + regval |= (1 << (fifo * 8 + 4)); + } + + if (fifo_en) { + regval |= (1 << (fifo * 8 + 5)); + } + putreg32(regval, BFLB_USB_BASE + USB_DEV_FCFG_OFFSET); + } +} + +static void bflb_usb_vdma_start_write(uint8_t fifo, const uint8_t *data, uint32_t len) +{ + uint32_t regval; + + if (fifo == USB_FIFO_CXF) { + regval = getreg32(BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET); + regval &= ~USB_VDMA_LEN_CXF_MASK; + regval &= ~USB_VDMA_IO_CXF; + regval |= USB_VDMA_TYPE_CXF; + regval |= (len << USB_VDMA_LEN_CXF_SHIFT); + putreg32(regval, BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET); + + putreg32((uint32_t)data, BFLB_USB_BASE + USB_VDMA_CXFPS2_OFFSET); + + regval = getreg32(BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET); + regval |= USB_VDMA_START_CXF; + putreg32(regval, BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET); + } else { + regval = getreg32(BFLB_USB_BASE + USB_VDMA_F0PS1_OFFSET + fifo * 8); + regval &= ~USB_VDMA_LEN_CXF_MASK; + regval &= ~USB_VDMA_IO_CXF; + regval |= USB_VDMA_TYPE_CXF; + regval |= (len << USB_VDMA_LEN_CXF_SHIFT); + putreg32(regval, BFLB_USB_BASE + USB_VDMA_F0PS1_OFFSET + fifo * 8); + + putreg32((uint32_t)data, BFLB_USB_BASE + USB_VDMA_F0PS2_OFFSET + fifo * 8); + + regval = getreg32(BFLB_USB_BASE + USB_VDMA_F0PS1_OFFSET + fifo * 8); + regval |= USB_VDMA_START_CXF; + putreg32(regval, BFLB_USB_BASE + USB_VDMA_F0PS1_OFFSET + fifo * 8); + } +} + +static void bflb_usb_vdma_start_read(uint8_t fifo, uint8_t *data, uint32_t len) +{ + uint32_t regval; + + if (fifo == USB_FIFO_CXF) { + regval = getreg32(BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET); + regval &= ~USB_VDMA_LEN_CXF_MASK; + regval &= ~USB_VDMA_IO_CXF; + regval &= ~USB_VDMA_TYPE_CXF; + regval |= (len << USB_VDMA_LEN_CXF_SHIFT); + putreg32(regval, BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET); + + putreg32((uint32_t)data, BFLB_USB_BASE + USB_VDMA_CXFPS2_OFFSET); + + regval = getreg32(BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET); + regval |= USB_VDMA_START_CXF; + putreg32(regval, BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET); + } else { + regval = getreg32(BFLB_USB_BASE + USB_VDMA_F0PS1_OFFSET + fifo * 8); + regval &= ~USB_VDMA_LEN_CXF_MASK; + regval &= ~USB_VDMA_IO_CXF; + regval &= ~USB_VDMA_TYPE_CXF; + regval |= (len << USB_VDMA_LEN_CXF_SHIFT); + putreg32(regval, BFLB_USB_BASE + USB_VDMA_F0PS1_OFFSET + fifo * 8); + + putreg32((uint32_t)data, BFLB_USB_BASE + USB_VDMA_F0PS2_OFFSET + fifo * 8); + + regval = getreg32(BFLB_USB_BASE + USB_VDMA_F0PS1_OFFSET + fifo * 8); + regval |= USB_VDMA_START_CXF; + putreg32(regval, BFLB_USB_BASE + USB_VDMA_F0PS1_OFFSET + fifo * 8); + } +} + +static uint32_t bflb_usb_vdma_get_remain_size(uint8_t fifo) +{ + uint32_t regval; + + if (fifo == USB_FIFO_CXF) { + regval = (getreg32(BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET) & USB_VDMA_LEN_CXF_MASK); + regval >>= USB_VDMA_LEN_CXF_SHIFT; + + } else { + regval = (getreg32(BFLB_USB_BASE + USB_VDMA_F0PS1_OFFSET + fifo * 8) & USB_VDMA_LEN_CXF_MASK); + regval >>= USB_VDMA_LEN_CXF_SHIFT; + } + + return regval; +} + +static inline void bflb_usb_control_transfer_done(void) +{ + uint32_t regval; + + regval = getreg32(BFLB_USB_BASE + USB_DEV_CXCFE_OFFSET); + regval |= USB_CX_DONE; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CXCFE_OFFSET); +} + +static inline void bflb_usb_set_mult(uint8_t ep_idx, uint8_t mult) +{ + uint32_t regval; + + regval = getreg32(BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); + regval &= ~USB_TX_NUM_HBW_IEP1_MASK; + regval |= (mult << USB_TX_NUM_HBW_IEP1_SHIFT); + putreg32(regval, BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); +} + +static inline void bflb_usb_send_zlp(uint8_t ep_idx) +{ + uint32_t regval; + + regval = getreg32(BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); + regval |= USB_TX0BYTE_IEP1; + putreg32(regval, BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); +} + +static inline uint32_t bflb_usb_get_tx_zlp_intstatus(void) +{ + return getreg32(BFLB_USB_BASE + USB_DEV_TXZ_OFFSET); +} + +static inline uint32_t bflb_usb_get_rx_zlp_intstatus(void) +{ + return getreg32(BFLB_USB_BASE + USB_DEV_RXZ_OFFSET); +} + +static inline void bflb_usb_clear_tx_zlp_intstatus(uint8_t ep_idx) +{ + putreg32((1 << (ep_idx - 1)), BFLB_USB_BASE + USB_DEV_TXZ_OFFSET); +} + +static inline void bflb_usb_clear_rx_zlp_intstatus(uint8_t ep_idx) +{ + putreg32((1 << (ep_idx - 1)), BFLB_USB_BASE + USB_DEV_RXZ_OFFSET); +} + +static uint32_t bflb_usb_get_source_group_intstatus(uint8_t group) +{ + switch (group) { + case 0: + return (getreg32(BFLB_USB_BASE + USB_DEV_ISG0_OFFSET) & ~getreg32(BFLB_USB_BASE + USB_DEV_MISG0_OFFSET)); + case 1: + return (getreg32(BFLB_USB_BASE + USB_DEV_ISG1_OFFSET) & ~getreg32(BFLB_USB_BASE + USB_DEV_MISG1_OFFSET)); + case 2: + return (getreg32(BFLB_USB_BASE + USB_DEV_ISG2_OFFSET) & ~getreg32(BFLB_USB_BASE + USB_DEV_MISG2_OFFSET)); + case 3: + return (getreg32(BFLB_USB_BASE + USB_DEV_ISG3_OFFSET) & ~getreg32(BFLB_USB_BASE + USB_DEV_MISG3_OFFSET)); + case 4: + return (getreg32(BFLB_USB_BASE + USB_DEV_ISG4_OFFSET) & ~getreg32(BFLB_USB_BASE + USB_DEV_MISG4_OFFSET)); + default: + break; + } + return 0; +} + +static void bflb_usb_source_group_int_clear(uint8_t group, uint32_t int_clear) +{ + switch (group) { + case 0: + putreg32(int_clear, BFLB_USB_BASE + USB_DEV_ISG0_OFFSET); + break; + case 1: + putreg32(int_clear, BFLB_USB_BASE + USB_DEV_ISG1_OFFSET); + break; + case 2: + putreg32(int_clear, BFLB_USB_BASE + USB_DEV_ISG2_OFFSET); + break; + case 3: + putreg32(int_clear, BFLB_USB_BASE + USB_DEV_ISG3_OFFSET); + break; + case 4: + putreg32(int_clear, BFLB_USB_BASE + USB_DEV_ISG4_OFFSET); + break; + + default: + break; + } +} + +static uint8_t usb_get_transfer_fifo(uint8_t ep_idx) +{ + uint8_t target_fifo_id; + + if ((g_bl_udc.out_ep[ep_idx].ep_mps > 512) || (g_bl_udc.in_ep[ep_idx].ep_mps > 512)) { +#if defined(CONFIG_USB_PINGPONG_ENABLE) + target_fifo_id = USB_FIFO_F0; +#elif defined(CONFIG_USB_TRIPLE_ENABLE) + while (1) { + } +#else + if (ep_idx == 1) { + target_fifo_id = USB_FIFO_F0; + } else { + target_fifo_id = USB_FIFO_F2; + } +#endif + } else { +#if defined(CONFIG_USB_PINGPONG_ENABLE) + if (ep_idx == 1) { + target_fifo_id = USB_FIFO_F0; + } else { + target_fifo_id = USB_FIFO_F2; + } +#elif defined(CONFIG_USB_TRIPLE_ENABLE) + if (ep_idx == 1) { + target_fifo_id = USB_FIFO_F0; + } else { + target_fifo_id = USB_FIFO_F3; + } +#else + target_fifo_id = (ep_idx - 1); +#endif + } + + return target_fifo_id; +} + +int usb_dc_init(uint8_t busid) +{ + uint32_t regval; + + bflb_usb_phy_init(); + + bflb_irq_attach(37, USBD_IRQ, NULL); + bflb_irq_enable(37); + + /* disable device-A for device */ + regval = getreg32(BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + regval |= PDS_REG_USB_IDDIG; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + + /* disable global irq */ + regval = getreg32(BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + regval &= ~USB_GLINT_EN_HOV; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + + regval = getreg32(BFLB_USB_BASE + USB_PHY_TST_OFFSET); + regval |= USB_UNPLUG; + putreg32(regval, BFLB_USB_BASE + USB_PHY_TST_OFFSET); + + regval = getreg32(BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + regval &= ~USB_CAP_RMWAKUP; + regval |= USB_CHIP_EN_HOV; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + + regval = getreg32(BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + regval |= USB_SFRST_HOV; +#ifdef CONFIG_USB_HS + regval &= ~USB_FORCE_FS; +#else + regval |= USB_FORCE_FS; +#endif + putreg32(regval, BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + + while (getreg32(BFLB_USB_BASE + USB_DEV_CTL_OFFSET) & USB_SFRST_HOV) { + } + + regval = getreg32(BFLB_USB_BASE + USB_DEV_ADR_OFFSET); + regval &= ~USB_AFT_CONF; + putreg32(regval, BFLB_USB_BASE + USB_DEV_ADR_OFFSET); + + regval = getreg32(BFLB_USB_BASE + USB_DEV_SMT_OFFSET); + regval &= ~USB_SOFMT_MASK; +#ifdef CONFIG_USB_HS + regval |= USB_SOF_TIMER_MASK_AFTER_RESET_HS; +#else + regval |= USB_SOF_TIMER_MASK_AFTER_RESET_FS; +#endif + putreg32(regval, BFLB_USB_BASE + USB_DEV_SMT_OFFSET); + + /* enable setup irq in source group0 */ + regval = getreg32(BFLB_USB_BASE + USB_DEV_MISG0_OFFSET); + regval &= ~USB_MCX_SETUP_INT; + regval |= USB_MCX_IN_INT; + regval |= (1 << 3); + regval |= USB_MCX_OUT_INT; + regval |= USB_MCX_IN_INT; + regval |= USB_MCX_COMFAIL_INT; + regval |= USB_MCX_COMABORT_INT; + putreg32(regval, BFLB_USB_BASE + USB_DEV_MISG0_OFFSET); + + /* disable all fifo irq in source group1 */ + putreg32(0xffffffff, BFLB_USB_BASE + USB_DEV_MISG1_OFFSET); + + /* enable rst/tx0/rx0 irq in source group2 */ + regval = 0xffffffff; + regval &= ~USB_MUSBRST_INT; + regval &= ~USB_MSUSP_INT; + regval &= ~USB_MRESM_INT; + regval &= ~USB_MTX0BYTE_INT; + regval &= ~USB_MRX0BYTE_INT; + putreg32(regval, BFLB_USB_BASE + USB_DEV_MISG2_OFFSET); + + /* enable vdma cmplt and error irq in source group3 */ + regval = 0xffffffff; + regval &= ~(USB_MVDMA_CMPLT_CXF | + USB_MVDMA_CMPLT_F0 | + USB_MVDMA_CMPLT_F1 | + USB_MVDMA_CMPLT_F2 | + USB_MVDMA_CMPLT_F3); + // regval &= ~(USB_MVDMA_ERROR_CXF | + // USB_MVDMA_ERROR_F0 | + // USB_MVDMA_ERROR_F1 | + // USB_MVDMA_ERROR_F2 | + // USB_MVDMA_ERROR_F3); + putreg32(regval, BFLB_USB_BASE + USB_DEV_MISG3_OFFSET); + + /* enable group irq */ + regval = getreg32(BFLB_USB_BASE + USB_DEV_MIGR_OFFSET); + regval &= ~USB_MINT_G0; + regval &= ~USB_MINT_G1; + regval &= ~USB_MINT_G2; + regval &= ~USB_MINT_G3; + regval &= ~USB_MINT_G4; + putreg32(regval, BFLB_USB_BASE + USB_DEV_MIGR_OFFSET); + + /* enable device irq */ + regval = getreg32(BFLB_USB_BASE + USB_GLB_INT_OFFSET); + regval |= USB_MHC_INT; + regval |= USB_MOTG_INT; + regval &= ~USB_MDEV_INT; + putreg32(regval, BFLB_USB_BASE + USB_GLB_INT_OFFSET); + + bflb_usb_source_group_int_clear(2, 0x3ff); + bflb_usb_source_group_int_clear(3, 0xffffffff); + + for (uint8_t i = 1; i < 9; i++) { + bflb_usb_set_ep_fifomap(i, 15); + bflb_usb_set_fifo_epmap(i, 15, 0); + } + + /* enable vdma */ + regval = getreg32(BFLB_USB_BASE + USB_VDMA_CTRL_OFFSET); + regval |= USB_VDMA_EN; + putreg32(regval, BFLB_USB_BASE + USB_VDMA_CTRL_OFFSET); + + regval = getreg32(BFLB_USB_BASE + USB_PHY_TST_OFFSET); + regval &= ~USB_UNPLUG; + putreg32(regval, BFLB_USB_BASE + USB_PHY_TST_OFFSET); + + /* enable global irq */ + regval = getreg32(BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + regval |= USB_GLINT_EN_HOV; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + uint32_t regval; + + /* disable global irq */ + regval = getreg32(BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + regval &= ~USB_GLINT_EN_HOV; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + + regval = getreg32(BFLB_USB_BASE + USB_PHY_TST_OFFSET); + regval |= USB_UNPLUG; + putreg32(regval, BFLB_USB_BASE + USB_PHY_TST_OFFSET); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + regval &= ~PDS_REG_USB_PHY_XTLSEL_MASK; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + regval &= ~PDS_REG_PU_USB20_PSW; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + regval &= ~PDS_REG_USB_PHY_PONRST; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + regval &= ~PDS_REG_USB_EXT_SUSP_N; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + uint32_t regval; + + regval = getreg32(BFLB_USB_BASE + USB_DEV_ADR_OFFSET); + regval &= ~USB_DEVADR_MASK; + regval |= addr; + putreg32(regval, BFLB_USB_BASE + USB_DEV_ADR_OFFSET); + + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + uint32_t regval; + + regval = getreg32(BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + regval |= USB_CAP_RMWAKUP; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + + bflb_mtimer_delay_ms(10); + + regval = getreg32(BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + regval &= ~USB_CAP_RMWAKUP; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CTL_OFFSET); + + return 0; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + uint8_t speed = 3; + + speed = (getreg32(BFLB_USB_BASE + USB_OTG_CSR_OFFSET) & USB_SPD_TYP_HOV_POV_MASK) >> USB_SPD_TYP_HOV_POV_SHIFT; + + if (speed == 0) { + return USB_SPEED_FULL; + } else if (speed == 1) { + return USB_SPEED_LOW; + } else if (speed == 2) { + return USB_SPEED_HIGH; + } + return USB_SPEED_HIGH; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_addr; + uint32_t regval; + + ep_addr = ep->bEndpointAddress; + + uint8_t ep_idx = USB_EP_GET_IDX(ep_addr); + + if (ep_idx > 4) { + return 0; + } + + if (USB_EP_DIR_IS_OUT(ep_addr)) { + g_bl_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_bl_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_bl_udc.out_ep[ep_idx].ep_enable = 1U; + bflb_usb_set_outep_mps(ep_idx, USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize)); + } else { + g_bl_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_bl_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_bl_udc.in_ep[ep_idx].ep_enable = 1U; + bflb_usb_set_inep_mps(ep_idx, USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize)); + bflb_usb_set_mult(ep_idx, 0); + } + + if (ep_idx != 0) { +#if !defined(CONFIG_USB_PINGPONG_ENABLE) && !defined(CONFIG_USB_TRIPLE_ENABLE) + if (USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize) > 512) { + bflb_usb_set_ep_fifomap(1, USB_FIFO_F0); + bflb_usb_set_ep_fifomap(2, USB_FIFO_F2); + + bflb_usb_set_fifo_epmap(USB_FIFO_F0, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F1, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F2, 2, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F3, 2, USB_FIFO_DIR_BID); + + if (ep_idx == 1) { + bflb_usb_fifo_config(USB_FIFO_F0, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 1024, 1, true); + bflb_usb_fifo_config(USB_FIFO_F1, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 1024, 1, false); + } else if (ep_idx == 2) { + bflb_usb_fifo_config(USB_FIFO_F2, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 1024, 1, true); + bflb_usb_fifo_config(USB_FIFO_F3, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 1024, 1, false); + } else { + return -1; + } + } else { + bflb_usb_set_ep_fifomap(1, USB_FIFO_F0); + bflb_usb_set_ep_fifomap(2, USB_FIFO_F1); + bflb_usb_set_ep_fifomap(3, USB_FIFO_F2); + bflb_usb_set_ep_fifomap(4, USB_FIFO_F3); + + bflb_usb_set_fifo_epmap(USB_FIFO_F0, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F1, 2, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F2, 3, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F3, 4, USB_FIFO_DIR_BID); + + if (ep_idx == 1) { + bflb_usb_fifo_config(USB_FIFO_F0, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 1, true); + } else if (ep_idx == 2) { + bflb_usb_fifo_config(USB_FIFO_F1, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 1, true); + } else if (ep_idx == 3) { + bflb_usb_fifo_config(USB_FIFO_F2, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 1, true); + } else if (ep_idx == 4) { + bflb_usb_fifo_config(USB_FIFO_F3, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 1, true); + } else { + return -1; + } + } +#elif defined(CONFIG_USB_PINGPONG_ENABLE) + if (USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize) > 512) { + bflb_usb_set_ep_fifomap(1, USB_FIFO_F0); + + bflb_usb_set_fifo_epmap(USB_FIFO_F0, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F1, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F2, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F3, 1, USB_FIFO_DIR_BID); + + if (ep_idx == 1) { + bflb_usb_fifo_config(USB_FIFO_F0, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 1024, 2, true); + bflb_usb_fifo_config(USB_FIFO_F1, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 1024, 2, false); + bflb_usb_fifo_config(USB_FIFO_F2, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 1024, 2, false); + bflb_usb_fifo_config(USB_FIFO_F3, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 1024, 2, false); + } else { + return -1; + } + } else { + bflb_usb_set_ep_fifomap(1, USB_FIFO_F0); + bflb_usb_set_ep_fifomap(2, USB_FIFO_F2); + + bflb_usb_set_fifo_epmap(USB_FIFO_F0, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F1, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F2, 2, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F3, 2, USB_FIFO_DIR_BID); + + if (ep_idx == 1) { + bflb_usb_fifo_config(USB_FIFO_F0, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 2, true); + bflb_usb_fifo_config(USB_FIFO_F1, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 2, false); + } else if (ep_idx == 2) { + bflb_usb_fifo_config(USB_FIFO_F2, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 2, true); + bflb_usb_fifo_config(USB_FIFO_F3, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 2, false); + } else { + return -1; + } + } +#elif defined(CONFIG_USB_TRIPLE_ENABLE) + if (USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize) > 512) { + return -1; + } else { + bflb_usb_set_ep_fifomap(1, USB_FIFO_F0); + bflb_usb_set_ep_fifomap(2, USB_FIFO_F3); + + bflb_usb_set_fifo_epmap(USB_FIFO_F0, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F1, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F2, 1, USB_FIFO_DIR_BID); + bflb_usb_set_fifo_epmap(USB_FIFO_F3, 2, USB_FIFO_DIR_BID); + + if (ep_idx == 1) { + bflb_usb_fifo_config(USB_FIFO_F0, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 3, true); + bflb_usb_fifo_config(USB_FIFO_F1, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 3, false); + bflb_usb_fifo_config(USB_FIFO_F2, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 3, false); + } else if (ep_idx == 2) { + bflb_usb_fifo_config(USB_FIFO_F3, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), 512, 1, true); + } else { + return -1; + } + } +#endif + regval = getreg32(BFLB_USB_BASE + USB_DEV_ADR_OFFSET); + regval |= USB_AFT_CONF; + putreg32(regval, BFLB_USB_BASE + USB_DEV_ADR_OFFSET); + } + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + uint32_t regval; + + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (ep_idx == 0) { + regval = getreg32(BFLB_USB_BASE + USB_DEV_CXCFE_OFFSET); + regval |= USB_CX_STL; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CXCFE_OFFSET); + } else { + if (USB_EP_DIR_IS_OUT(ep)) { + regval = getreg32(BFLB_USB_BASE + USB_DEV_OUTMPS1_OFFSET + (ep_idx - 1) * 4); + regval |= USB_STL_OEP1; + //regval |= USB_RSTG_OEP1; + putreg32(regval, BFLB_USB_BASE + USB_DEV_OUTMPS1_OFFSET + (ep_idx - 1) * 4); + } else { + regval = getreg32(BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); + regval |= USB_STL_IEP1; + //regval |= USB_RSTG_IEP1; + putreg32(regval, BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); + } + } + + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint32_t regval; + + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (ep_idx == 0) { + } else { + if (USB_EP_DIR_IS_OUT(ep)) { + regval = getreg32(BFLB_USB_BASE + USB_DEV_OUTMPS1_OFFSET + (ep_idx - 1) * 4); + //regval &= ~USB_RSTG_OEP1; + regval &= ~USB_STL_OEP1; + putreg32(regval, BFLB_USB_BASE + USB_DEV_OUTMPS1_OFFSET + (ep_idx - 1) * 4); + } else { + regval = getreg32(BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); + //regval &= ~USB_RSTG_IEP1; + regval &= ~USB_STL_IEP1; + putreg32(regval, BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); + } + } + + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + uint32_t regval; + + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (ep_idx == 0) { + } else { + if (USB_EP_DIR_IS_OUT(ep)) { + regval = getreg32(BFLB_USB_BASE + USB_DEV_OUTMPS1_OFFSET + (ep_idx - 1) * 4); + if (regval & USB_STL_OEP1) { + *stalled = 1; + } else { + *stalled = 0; + } + } else { + regval = getreg32(BFLB_USB_BASE + USB_DEV_INMPS1_OFFSET + (ep_idx - 1) * 4); + if (regval & USB_STL_IEP1) { + *stalled = 1; + } else { + *stalled = 0; + } + } + } + + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + + if (!g_bl_udc.in_ep[ep_idx].ep_enable) { + return -2; + } + + g_bl_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_bl_udc.in_ep[ep_idx].xfer_len = data_len; + g_bl_udc.in_ep[ep_idx].actual_xfer_len = 0; + g_bl_udc.in_ep[ep_idx].ep_active = true; + + if (ep_idx == 0) { + if (data_len == 0) { + g_bl_udc.in_ep[ep_idx].ep_active = false; + bflb_usb_control_transfer_done(); + } else { + data_len = MIN(data_len, g_bl_udc.in_ep[ep_idx].ep_mps); + g_bl_udc.in_ep[ep_idx].xfer_len = data_len; + bflb_usb_vdma_start_write(USB_FIFO_CXF, data, data_len); + } + } else { + if (data_len == 0) { + bflb_usb_send_zlp(ep_idx); + } else { + bflb_usb_vdma_start_write(usb_get_transfer_fifo(ep_idx), data, data_len); + } + } + + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + + if (!g_bl_udc.out_ep[ep_idx].ep_enable) { + return -2; + } + + if (data_len == 0) { + return 0; + } + + g_bl_udc.out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_bl_udc.out_ep[ep_idx].xfer_len = data_len; + g_bl_udc.out_ep[ep_idx].actual_xfer_len = 0; + g_bl_udc.out_ep[ep_idx].ep_active = true; + + if (ep_idx == 0) { + data_len = MIN(data_len, g_bl_udc.out_ep[ep_idx].ep_mps); + g_bl_udc.out_ep[ep_idx].xfer_len = data_len; + bflb_usb_vdma_start_read(USB_FIFO_CXF, data, data_len); + } else { + bflb_usb_vdma_start_read(usb_get_transfer_fifo(ep_idx), data, data_len); + } + return 0; +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint32_t glb_intstatus; + uint32_t dev_intstatus; + uint32_t subgroup_intstatus; + uint32_t regval; + uint8_t ep_idx; + + glb_intstatus = getreg32(BFLB_USB_BASE + USB_GLB_ISR_OFFSET); + + if (glb_intstatus & USB_DEV_INT) { + dev_intstatus = getreg32(BFLB_USB_BASE + USB_DEV_IGR_OFFSET); + if (dev_intstatus & USB_INT_G0) { + subgroup_intstatus = bflb_usb_get_source_group_intstatus(0); + + if (subgroup_intstatus & USB_CX_SETUP_INT) { + bflb_usb_vdma_start_read(USB_FIFO_CXF, g_setup_buffer, 8); + while (getreg32(BFLB_USB_BASE + USB_VDMA_CXFPS1_OFFSET) & USB_VDMA_START_CXF) { + } + + bflb_usb_source_group_int_clear(3, USB_VDMA_CMPLT_CXF); + + usbd_event_ep0_setup_complete_handler(0, g_setup_buffer); + } + } + if (dev_intstatus & USB_INT_G1) { + } + if (dev_intstatus & USB_INT_G2) { + subgroup_intstatus = bflb_usb_get_source_group_intstatus(2); + + if (subgroup_intstatus & USB_SUSP_INT) { + bflb_usb_source_group_int_clear(2, USB_SUSP_INT); + + bflb_usb_reset_fifo(USB_FIFO_F0); + bflb_usb_reset_fifo(USB_FIFO_F1); + bflb_usb_reset_fifo(USB_FIFO_F2); + bflb_usb_reset_fifo(USB_FIFO_F3); + bflb_usb_reset_fifo(USB_FIFO_CXF); + + usbd_event_suspend_handler(0); + } + if (subgroup_intstatus & USB_RESM_INT) { + bflb_usb_source_group_int_clear(2, USB_RESM_INT); + usbd_event_resume_handler(0); + } + if (subgroup_intstatus & USB_TX0BYTE_INT) { + for (uint8_t i = 1; i < 5; i++) { + if (bflb_usb_get_tx_zlp_intstatus() & (1 << (i - 1))) { + bflb_usb_clear_tx_zlp_intstatus(i); + usbd_event_ep_in_complete_handler(0, i | 0x80, 0); + } + } + bflb_usb_source_group_int_clear(2, USB_TX0BYTE_INT); + } + if (subgroup_intstatus & USB_RX0BYTE_INT) { + for (uint8_t i = 1; i < 5; i++) { + if (bflb_usb_get_rx_zlp_intstatus() & (1 << (i - 1))) { + bflb_usb_clear_rx_zlp_intstatus(i); + usbd_event_ep_out_complete_handler(0, i, 0); + } + } + + bflb_usb_source_group_int_clear(2, USB_RX0BYTE_INT); + } + if (subgroup_intstatus & USBRST_INT) { + bflb_usb_source_group_int_clear(2, USBRST_INT); + + bflb_usb_reset_fifo(USB_FIFO_F0); + bflb_usb_reset_fifo(USB_FIFO_F1); + bflb_usb_reset_fifo(USB_FIFO_F2); + bflb_usb_reset_fifo(USB_FIFO_F3); + bflb_usb_reset_fifo(USB_FIFO_CXF); + + regval = getreg32(BFLB_USB_BASE + USB_DEV_SMT_OFFSET); + regval &= ~USB_SOFMT_MASK; +#ifdef CONFIG_USB_HS + regval |= USB_SOF_TIMER_MASK_AFTER_RESET_HS; +#else + regval |= USB_SOF_TIMER_MASK_AFTER_RESET_FS; +#endif + putreg32(regval, BFLB_USB_BASE + USB_DEV_SMT_OFFSET); + + memset(&g_bl_udc, 0, sizeof(g_bl_udc)); + + usbd_event_reset_handler(0); + } + } + if (dev_intstatus & USB_INT_G3) { + subgroup_intstatus = bflb_usb_get_source_group_intstatus(3); + bflb_usb_source_group_int_clear(3, subgroup_intstatus); + if (subgroup_intstatus & USB_VDMA_CMPLT_CXF) { + if (g_bl_udc.in_ep[0].ep_active) { + g_bl_udc.in_ep[0].ep_active = false; + g_bl_udc.in_ep[0].actual_xfer_len = g_bl_udc.in_ep[0].xfer_len - bflb_usb_vdma_get_remain_size(USB_FIFO_CXF); + if (g_bl_udc.in_ep[0].actual_xfer_len < g_bl_udc.in_ep[0].ep_mps) { + bflb_usb_control_transfer_done(); + } + usbd_event_ep_in_complete_handler(0, 0x80, g_bl_udc.in_ep[0].actual_xfer_len); + } else { + g_bl_udc.out_ep[0].ep_active = false; + g_bl_udc.out_ep[0].actual_xfer_len = g_bl_udc.out_ep[0].xfer_len - bflb_usb_vdma_get_remain_size(USB_FIFO_CXF); + usbd_event_ep_out_complete_handler(0, 0x00, g_bl_udc.out_ep[0].actual_xfer_len); + } + } + + for (uint8_t i = 0; i < 4; i++) { + if (subgroup_intstatus & (1 << (i + 1))) { + ep_idx = bflb_usb_get_fifo_ep(i); + if (g_bl_udc.in_ep[ep_idx].ep_active) { + g_bl_udc.in_ep[ep_idx].ep_active = 0; + g_bl_udc.in_ep[ep_idx].actual_xfer_len = g_bl_udc.in_ep[ep_idx].xfer_len - bflb_usb_vdma_get_remain_size(i); + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_bl_udc.in_ep[ep_idx].actual_xfer_len); + } else if (g_bl_udc.out_ep[ep_idx].ep_active) { + g_bl_udc.out_ep[ep_idx].ep_active = 0; + g_bl_udc.out_ep[ep_idx].actual_xfer_len = g_bl_udc.out_ep[ep_idx].xfer_len - bflb_usb_vdma_get_remain_size(i); + usbd_event_ep_out_complete_handler(0, ep_idx & 0x7f, g_bl_udc.out_ep[ep_idx].actual_xfer_len); + } + } + } + } + if (dev_intstatus & USB_INT_G4) { + } + } +} + +#ifdef CONFIG_USBDEV_TEST_MODE +void usbd_execute_test_mode(uint8_t busid, uint8_t test_mode) +{ + uint32_t regval; + + switch (test_mode) { + case 1: // Test_J + { + regval = getreg32(BFLB_USB_BASE + USB_PHY_TST_OFFSET); + regval |= USB_TST_JSTA; + putreg32(regval, BFLB_USB_BASE + USB_PHY_TST_OFFSET); + bflb_usb_control_transfer_done(); + } break; + case 2: // Test_K + { + regval = getreg32(BFLB_USB_BASE + USB_PHY_TST_OFFSET); + regval |= USB_TST_KSTA; + putreg32(regval, BFLB_USB_BASE + USB_PHY_TST_OFFSET); + + bflb_usb_control_transfer_done(); + } break; + case 3: // TEST_SE0_NAK + { + regval = getreg32(BFLB_USB_BASE + USB_PHY_TST_OFFSET); + regval |= USB_TST_SE0NAK; + putreg32(regval, BFLB_USB_BASE + USB_PHY_TST_OFFSET); + + bflb_usb_control_transfer_done(); + } break; + case 4: // Test_Packet + { + bflb_usb_control_transfer_done(); + regval = getreg32(BFLB_USB_BASE + USB_PHY_TST_OFFSET); + regval |= USB_TST_PKT; + putreg32(regval, BFLB_USB_BASE + USB_PHY_TST_OFFSET); + + __attribute__((aligned(32))) uint8_t temp[53]; + uint8_t *pp; + uint8_t i; + pp = temp; + + for (i = 0; i < 9; i++) /*JKJKJKJK x 9*/ + *pp++ = 0x00; + + for (i = 0; i < 8; i++) /* 8*AA */ + *pp++ = 0xAA; + + for (i = 0; i < 8; i++) /* 8*EE */ + *pp++ = 0xEE; + + *pp++ = 0xFE; + + for (i = 0; i < 11; i++) /* 11*FF */ + *pp++ = 0xFF; + + *pp++ = 0x7F; + *pp++ = 0xBF; + *pp++ = 0xDF; + *pp++ = 0xEF; + *pp++ = 0xF7; + *pp++ = 0xFB; + *pp++ = 0xFD; + *pp++ = 0xFC; + *pp++ = 0x7E; + *pp++ = 0xBF; + *pp++ = 0xDF; + *pp++ = 0xEF; + *pp++ = 0xF7; + *pp++ = 0xFB; + *pp++ = 0xFD; + *pp++ = 0x7E; + + bflb_usb_vdma_start_write(USB_FIFO_CXF, temp, 53); + + regval = getreg32(BFLB_USB_BASE + USB_DEV_CXCFE_OFFSET); + regval |= USB_TST_PKDONE; + putreg32(regval, BFLB_USB_BASE + USB_DEV_CXCFE_OFFSET); + + } break; + case 5: // Test_Force_Enable + break; + + default: + break; + } +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ch32/README.md b/src/lib/CherryUSB/port/ch32/README.md new file mode 100644 index 000000000..68a1ab76c --- /dev/null +++ b/src/lib/CherryUSB/port/ch32/README.md @@ -0,0 +1,16 @@ +# Note + +## Support Chip List + +## CH32FS + +- CH32V30X/CH32V20X/CH32V10X/CH32X035 + +## CH32HS + +- CH32V30X + +## CH58X + +- CH57X/CH58X(usbfs) +- CH585(usbhs) diff --git a/src/lib/CherryUSB/port/ch32/ch32fs/usb_ch32_usbfs_reg.h b/src/lib/CherryUSB/port/ch32/ch32fs/usb_ch32_usbfs_reg.h new file mode 100644 index 000000000..34a960725 --- /dev/null +++ b/src/lib/CherryUSB/port/ch32/ch32fs/usb_ch32_usbfs_reg.h @@ -0,0 +1,409 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef _USB_CH32_USBFS_REG_H +#define _USB_CH32_USBFS_REG_H + +#define __IO volatile /* defines 'read / write' permissions */ + +/* USBOTG_FS Registers */ +typedef struct +{ + __IO uint8_t BASE_CTRL; + __IO uint8_t UDEV_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_ADDR; + __IO uint8_t Reserve0; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint16_t RX_LEN; + __IO uint16_t Reserve1; + __IO uint8_t UEP4_1_MOD; + __IO uint8_t UEP2_3_MOD; + __IO uint8_t UEP5_6_MOD; + __IO uint8_t UEP7_MOD; + __IO uint32_t UEP0_DMA; + __IO uint32_t UEP1_DMA; + __IO uint32_t UEP2_DMA; + __IO uint32_t UEP3_DMA; + __IO uint32_t UEP4_DMA; + __IO uint32_t UEP5_DMA; + __IO uint32_t UEP6_DMA; + __IO uint32_t UEP7_DMA; + __IO uint16_t UEP0_TX_LEN; + __IO uint8_t UEP0_TX_CTRL; + __IO uint8_t UEP0_RX_CTRL; + __IO uint16_t UEP1_TX_LEN; + __IO uint8_t UEP1_TX_CTRL; + __IO uint8_t UEP1_RX_CTRL; + __IO uint16_t UEP2_TX_LEN; + __IO uint8_t UEP2_TX_CTRL; + __IO uint8_t UEP2_RX_CTRL; + __IO uint16_t UEP3_TX_LEN; + __IO uint8_t UEP3_TX_CTRL; + __IO uint8_t UEP3_RX_CTRL; + __IO uint16_t UEP4_TX_LEN; + __IO uint8_t UEP4_TX_CTRL; + __IO uint8_t UEP4_RX_CTRL; + __IO uint16_t UEP5_TX_LEN; + __IO uint8_t UEP5_TX_CTRL; + __IO uint8_t UEP5_RX_CTRL; + __IO uint16_t UEP6_TX_LEN; + __IO uint8_t UEP6_TX_CTRL; + __IO uint8_t UEP6_RX_CTRL; + __IO uint16_t UEP7_TX_LEN; + __IO uint8_t UEP7_TX_CTRL; + __IO uint8_t UEP7_RX_CTRL; + __IO uint32_t Reserve2; + __IO uint32_t OTG_CR; + __IO uint32_t OTG_SR; +} USBOTG_FS_TypeDef; + +typedef struct __attribute__((packed)) { + __IO uint8_t BASE_CTRL; + __IO uint8_t HOST_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_ADDR; + __IO uint8_t Reserve0; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint16_t RX_LEN; + __IO uint16_t Reserve1; + __IO uint8_t Reserve2; + __IO uint8_t HOST_EP_MOD; + __IO uint16_t Reserve3; + __IO uint32_t Reserve4; + __IO uint32_t Reserve5; + __IO uint32_t HOST_RX_DMA; + __IO uint32_t HOST_TX_DMA; + __IO uint32_t Reserve6; + __IO uint32_t Reserve7; + __IO uint32_t Reserve8; + __IO uint32_t Reserve9; + __IO uint32_t Reserve10; + __IO uint16_t Reserve11; + __IO uint16_t HOST_SETUP; + __IO uint8_t HOST_EP_PID; + __IO uint8_t Reserve12; + __IO uint8_t Reserve13; + __IO uint8_t HOST_RX_CTRL; + __IO uint16_t HOST_TX_LEN; + __IO uint8_t HOST_TX_CTRL; + __IO uint8_t Reserve14; + __IO uint32_t Reserve15; + __IO uint32_t Reserve16; + __IO uint32_t Reserve17; + __IO uint32_t Reserve18; + __IO uint32_t Reserve19; + __IO uint32_t OTG_CR; + __IO uint32_t OTG_SR; +} USBOTGH_FS_TypeDef; + +typedef struct +{ + __IO uint8_t BASE_CTRL; /*!< 0x40008000 */ + __IO uint8_t HOST_CTRL; /*!< 0x40008001 */ + __IO uint8_t INT_EN; /*!< 0x40008002 */ + __IO uint8_t DEV_ADDR; /*!< 0x40008003 */ + __IO uint8_t USB_STATUS0; /*!< 0x40008004 */ + __IO uint8_t MIS_ST; /*!< 0x40008005 */ + __IO uint8_t INT_FG; /*!< 0x40008006 */ + __IO uint8_t INT_ST; /*!< 0x40008007 */ + __IO uint8_t RX_LEN; /*!< 0x40008008 */ + __IO uint8_t Reserve1; /*!< 0x40008009 */ + __IO uint8_t Reserve2; /*!< 0x4000800a */ + __IO uint8_t Reserve3; /*!< 0x4000800b */ + __IO uint8_t UEP4_1_MOD; /*!< 0x4000800c */ + __IO uint8_t HOST_EP_MOD; /*!< 0x4000800d */ + __IO uint8_t UEP567_MOD; /*!< 0x4000800e */ + __IO uint8_t Reserve4; /*!< 0x4000800f */ + __IO uint16_t UEP0_DMA; /*!< 0x40008010 */ + __IO uint16_t Reserve5; /*!< 0x40008012 */ + __IO uint16_t UEP1_DMA; /*!< 0x40008014 */ + __IO uint16_t Reserve6; /*!< 0x40008016 */ + __IO uint16_t HOST_RX_DMA; /*!< 0x40008018 */ + __IO uint16_t Reserve7; /*!< 0x4000801a */ + __IO uint16_t HOST_TX_DMA; /*!< 0x4000801c */ + __IO uint16_t Reserve8; /*!< 0x4000801e */ + __IO uint8_t UEP0_T_LEN; /*!< 0x40008020 */ + __IO uint8_t Reserve9; /*!< 0x40008021 */ + __IO uint8_t UEP0_CTRL; /*!< 0x40008022 */ + __IO uint8_t Reserve10; /*!< 0x40008023 */ + __IO uint8_t UEP1_T_LEN; /*!< 0x40008024 */ + __IO uint8_t Reserve11; /*!< 0x40008025 */ + __IO uint8_t HOST_SETUP; /*!< 0x40008026 */ + __IO uint8_t Reserve12; /*!< 0x40008027 */ + __IO uint8_t HOST_EP_PID; /*!< 0x40008028 */ + __IO uint8_t Reserve13; /*!< 0x40008029 */ + __IO uint8_t HOST_RX_CTRL; /*!< 0x4000802a */ + __IO uint8_t Reserve14; /*!< 0x4000802b */ + __IO uint8_t HOST_TX_LEN; /*!< 0x4000802c */ + __IO uint8_t Reserve15; /*!< 0x4000802d */ + __IO uint8_t HOST_TX_CTRL; /*!< 0x4000802e */ + __IO uint8_t Reserve16; /*!< 0x4000802f */ + __IO uint8_t UEP4_T_LEN; /*!< 0x40008030 */ + __IO uint8_t Reserve17; /*!< 0x40008031 */ + __IO uint8_t UEP4_CTRL; /*!< 0x40008032 */ + __IO uint8_t Reserve18[33]; /*!< 0x40008033 */ + __IO uint16_t UEP5_DMA; /*!< 0x40008054 */ + __IO uint16_t Reserve19; /*!< 0x40008056 */ + __IO uint16_t UEP6_DMA; /*!< 0x40008058 */ + __IO uint16_t Reserve20; /*!< 0x4000805a */ + __IO uint16_t UEP7_DMA; /*!< 0x4000805c */ + __IO uint8_t Reserve21[6]; /*!< 0x4000805e */ + __IO uint8_t UEP5_T_LEN; /*!< 0x40008064 */ + __IO uint8_t Reserve22; /*!< 0x40008065 */ + __IO uint8_t UEP5_CTRL; /*!< 0x40008066 */ + __IO uint8_t Reserve23; /*!< 0x40008067 */ + __IO uint8_t UEP6_T_LEN; /*!< 0x40008068 */ + __IO uint8_t Reserve24; /*!< 0x40008069 */ + __IO uint8_t UEP6_CTRL; /*!< 0x4000806a */ + __IO uint8_t Reserve25; /*!< 0x4000806b */ + __IO uint8_t UEP7_T_LEN; /*!< 0x4000806c */ + __IO uint8_t Reserve26; /*!< 0x4000806d */ + __IO uint8_t UEP7_CTRL; /*!< 0x4000806e */ +} USB_FS_TypeDef; + +#define USBFS_BASE ((uint32_t)0x50000000) + +#define USBFS_DEVICE ((USBOTG_FS_TypeDef *)USBFS_BASE) +#define USBFS_HOST ((USBOTGH_FS_TypeDef *)USBFS_BASE) + +/******************* GLOBAL ******************/ + +/* BASE USB_CTRL */ +#define USBFS_BASE_CTRL_OFFSET 0x00 // USB base control +#define USBFS_UC_HOST_MODE 0x80 // enable USB host mode: 0=device mode, 1=host mode +#define USBFS_UC_LOW_SPEED 0x40 // enable USB low speed: 0=12Mbps, 1=1.5Mbps +#define USBFS_UC_DEV_PU_EN 0x20 // USB device enable and internal pullup resistance enable +#define USBFS_UC_SYS_CTRL1 0x20 // USB system control high bit +#define USBFS_UC_SYS_CTRL0 0x10 // USB system control low bit +#define USBFS_UC_SYS_CTRL_MASK 0x30 // bit mask of USB system control +// UC_HOST_MODE & UC_SYS_CTRL1 & UC_SYS_CTRL0: USB system control +// 0 00: disable USB device and disable internal pullup resistance +// 0 01: enable USB device and disable internal pullup resistance, need external pullup resistance +// 0 1x: enable USB device and enable internal pullup resistance +// 1 00: enable USB host and normal status +// 1 01: enable USB host and force UDP/UDM output SE0 state +// 1 10: enable USB host and force UDP/UDM output J state +// 1 11: enable USB host and force UDP/UDM output resume or K state +#define USBFS_UC_INT_BUSY 0x08 // enable automatic responding busy for device mode or automatic pause for host mode during interrupt flag UIF_TRANSFER valid +#define USBFS_UC_RESET_SIE 0x04 // force reset USB SIE, need software clear +#define USBFS_UC_CLR_ALL 0x02 // force clear FIFO and count of USB +#define USBFS_UC_DMA_EN 0x01 // DMA enable and DMA interrupt enable for USB + +/* USB INT EN */ +#define USBFS_INT_EN_OFFSET 0x02 +#define USBFS_UIE_DEV_SOF 0x80 // enable interrupt for SOF received for USB device mode +#define USBFS_UIE_DEV_NAK 0x40 // enable interrupt for NAK responded for USB device mode +#define USBFS_UIE_FIFO_OV 0x10 // enable interrupt for FIFO overflow +#define USBFS_UIE_HST_SOF 0x08 // enable interrupt for host SOF timer action for USB host mode +#define USBFS_UIE_SUSPEND 0x04 // enable interrupt for USB suspend or resume event +#define USBFS_UIE_TRANSFER 0x02 // enable interrupt for USB transfer completion +#define USBFS_UIE_DETECT 0x01 // enable interrupt for USB device detected event for USB host mode +#define USBFS_UIE_BUS_RST 0x01 // enable interrupt for USB bus reset event for USB device mode +/* USB_DEV_ADDR */ +#define USBFS_DEV_ADDR_OFFSET 0x03 +#define USBFS_UDA_GP_BIT 0x80 // general purpose bit +#define USBFS_USB_ADDR_MASK 0x7F // bit mask for USB device address + +/* USB_STATUS */ +#define USBFS_USB_STATUS_OFFSET 0x04 + +/* USB_MIS_ST */ +#define USBFS_MIS_ST_OFFSET 0x05 +#define USBFS_UMS_SOF_PRES 0x80 // RO, indicate host SOF timer presage status +#define USBFS_UMS_SOF_ACT 0x40 // RO, indicate host SOF timer action status for USB host +#define USBFS_UMS_SIE_FREE 0x20 // RO, indicate USB SIE free status +#define USBFS_UMS_R_FIFO_RDY 0x10 // RO, indicate USB receiving FIFO ready status (not empty) +#define USBFS_UMS_BUS_RESET 0x08 // RO, indicate USB bus reset status +#define USBFS_UMS_SUSPEND 0x04 // RO, indicate USB suspend status +#define USBFS_UMS_DM_LEVEL 0x02 // RO, indicate UDM level saved at device attached to USB host +#define USBFS_UMS_DEV_ATTACH 0x01 // RO, indicate device attached status on USB host + +/* USB_INT_FG */ +#define USBFS_INT_FG_OFFSET 0x06 +#define USBFS_U_IS_NAK 0x80 // RO, indicate current USB transfer is NAK received +#define USBFS_U_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK +#define USBFS_U_SIE_FREE 0x20 // RO, indicate USB SIE free status +#define USBFS_UIF_FIFO_OV 0x10 // FIFO overflow interrupt flag for USB, direct bit address clear or write 1 to clear +#define USBFS_UIF_HST_SOF 0x08 // host SOF timer interrupt flag for USB host, direct bit address clear or write 1 to clear +#define USBFS_UIF_SUSPEND 0x04 // USB suspend or resume event interrupt flag, direct bit address clear or write 1 to clear +#define USBFS_UIF_TRANSFER 0x02 // USB transfer completion interrupt flag, direct bit address clear or write 1 to clear +#define USBFS_UIF_DETECT 0x01 // device detected event interrupt flag for USB host mode, direct bit address clear or write 1 to clear +#define USBFS_UIF_BUS_RST 0x01 // bus reset event interrupt flag for USB device mode, direct bit address clear or write 1 to clear + +/* USB_INT_ST */ +#define USBFS_INT_ST_OFFSET 0x07 +#define USBFS_UIS_IS_SETUP 0x80 // RO, indicate current USB transfer is setup received for USB device mode +#define USBFS_UIS_IS_NAK 0x80 // RO, indicate current USB transfer is NAK received for USB device mode +#define USBFS_UIS_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK +#define USBFS_UIS_TOKEN1 0x20 // RO, current token PID code bit 1 received for USB device mode +#define USBFS_UIS_TOKEN0 0x10 // RO, current token PID code bit 0 received for USB device mode +#define USBFS_UIS_TOKEN_MASK 0x30 // RO, bit mask of current token PID code received for USB device mode +#define USBFS_UIS_TOKEN_OUT 0x00 +#define USBFS_UIS_TOKEN_SOF 0x10 +#define USBFS_UIS_TOKEN_IN 0x20 +#define USBFS_UIS_TOKEN_SETUP 0x30 +// UIS_TOKEN1 & UIS_TOKEN0: current token PID code received for USB device mode +// 00: OUT token PID received +// 01: SOF token PID received +// 10: IN token PID received +// 11: SETUP token PID received +#define USBFS_UIS_ENDP_MASK 0x0F // RO, bit mask of current transfer endpoint number for USB device mode +/* USB_RX_LEN */ +#define USBFS_RX_LEN_OFFSET 0x08 + +/******************* DEVICE ******************/ + +/* UDEV_CTRL */ +#define USBFS_UDEV_CTRL_OFFSET 0x01 +#define USBFS_UD_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable +#define USBFS_UD_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level +#define USBFS_UD_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level +#define USBFS_UD_LOW_SPEED 0x04 // enable USB physical port low speed: 0=full speed, 1=low speed +#define USBFS_UD_GP_BIT 0x02 // general purpose bit +#define USBFS_UD_PORT_EN 0x01 // enable USB physical port I/O: 0=disable, 1=enable + +/* UEP4_1_MOD */ +#define USBFS_UEP4_1_MOD_OFFSET 0x0C +#define USBFS_UEP1_RX_EN 0x80 // enable USB endpoint 1 receiving (OUT) +#define USBFS_UEP1_TX_EN 0x40 // enable USB endpoint 1 transmittal (IN) +#define USBFS_UEP1_BUF_MOD 0x10 // buffer mode of USB endpoint 1 +// UEPn_RX_EN & UEPn_TX_EN & UEPn_BUF_MOD: USB endpoint 1/2/3 buffer mode, buffer start address is UEPn_DMA +// 0 0 x: disable endpoint and disable buffer +// 1 0 0: 64 bytes buffer for receiving (OUT endpoint) +// 1 0 1: dual 64 bytes buffer by toggle bit bUEP_R_TOG selection for receiving (OUT endpoint), total=128bytes +// 0 1 0: 64 bytes buffer for transmittal (IN endpoint) +// 0 1 1: dual 64 bytes buffer by toggle bit bUEP_T_TOG selection for transmittal (IN endpoint), total=128bytes +// 1 1 0: 64 bytes buffer for receiving (OUT endpoint) + 64 bytes buffer for transmittal (IN endpoint), total=128bytes +// 1 1 1: dual 64 bytes buffer by bUEP_R_TOG selection for receiving (OUT endpoint) + dual 64 bytes buffer by bUEP_T_TOG selection for transmittal (IN endpoint), total=256bytes +#define USBFS_UEP4_RX_EN 0x08 // enable USB endpoint 4 receiving (OUT) +#define USBFS_UEP4_TX_EN 0x04 // enable USB endpoint 4 transmittal (IN) +// UEP4_RX_EN & UEP4_TX_EN: USB endpoint 4 buffer mode, buffer start address is UEP0_DMA +// 0 0: single 64 bytes buffer for endpoint 0 receiving & transmittal (OUT & IN endpoint) +// 1 0: single 64 bytes buffer for endpoint 0 receiving & transmittal (OUT & IN endpoint) + 64 bytes buffer for endpoint 4 receiving (OUT endpoint), total=128bytes +// 0 1: single 64 bytes buffer for endpoint 0 receiving & transmittal (OUT & IN endpoint) + 64 bytes buffer for endpoint 4 transmittal (IN endpoint), total=128bytes +// 1 1: single 64 bytes buffer for endpoint 0 receiving & transmittal (OUT & IN endpoint) +// + 64 bytes buffer for endpoint 4 receiving (OUT endpoint) + 64 bytes buffer for endpoint 4 transmittal (IN endpoint), total=192bytes + +/* UEP2_3_MOD */ +#define USBFS_UEP2_3_MOD_OFFSET 0x0D +#define USBFS_UEP3_RX_EN 0x80 // enable USB endpoint 3 receiving (OUT) +#define USBFS_UEP3_TX_EN 0x40 // enable USB endpoint 3 transmittal (IN) +#define USBFS_UEP3_BUF_MOD 0x10 // buffer mode of USB endpoint 3 +#define USBFS_UEP2_RX_EN 0x08 // enable USB endpoint 2 receiving (OUT) +#define USBFS_UEP2_TX_EN 0x04 // enable USB endpoint 2 transmittal (IN) +#define USBFS_UEP2_BUF_MOD 0x01 // buffer mode of USB endpoint 2 + +/* UEP5_6_MOD */ +#define USBFS_UEP5_6_MOD_OFFSET 0x0E +#define USBFS_UEP6_RX_EN 0x80 // enable USB endpoint 6 receiving (OUT) +#define USBFS_UEP6_TX_EN 0x40 // enable USB endpoint 6 transmittal (IN) +#define USBFS_UEP6_BUF_MOD 0x10 // buffer mode of USB endpoint 6 +#define USBFS_UEP5_RX_EN 0x08 // enable USB endpoint 5 receiving (OUT) +#define USBFS_UEP5_TX_EN 0x04 // enable USB endpoint 5 transmittal (IN) +#define USBFS_UEP5_BUF_MOD 0x01 // buffer mode of USB endpoint 5 + +/* UEP7_MOD */ +#define USBFS_UEP7_MOD_OFFSET 0x0F +#define USBFS_UEP7_RX_EN 0x08 // enable USB endpoint 7 receiving (OUT) +#define USBFS_UEP7_TX_EN 0x04 // enable USB endpoint 7 transmittal (IN) +#define USBFS_UEP7_BUF_MOD 0x01 // buffer mode of USB endpoint 7 + +/* USB_DMA */ +#define USBFS_UEPx_DMA_OFFSET(n) (0x10 + 4 * (n)) // endpoint x DMA buffer address +#define USBFS_UEP0_DMA_OFFSET 0x10 // endpoint 0 DMA buffer address +#define USBFS_UEP1_DMA_OFFSET 0x14 // endpoint 1 DMA buffer address +#define USBFS_UEP2_DMA_OFFSET 0x18 // endpoint 2 DMA buffer address +#define USBFS_UEP3_DMA_OFFSET 0x1c // endpoint 3 DMA buffer address +#define USBFS_UEP4_DMA_OFFSET 0x20 // endpoint 4 DMA buffer address +#define USBFS_UEP5_DMA_OFFSET 0x24 // endpoint 5 DMA buffer address +#define USBFS_UEP6_DMA_OFFSET 0x28 // endpoint 6 DMA buffer address +#define USBFS_UEP7_DMA_OFFSET 0x2c // endpoint 7 DMA buffer address +/* USB_EP_CTRL */ +#define USBFS_UEPx_T_LEN_OFFSET(n) (0x30 + 4 * (n)) // endpoint x DMA buffer address +#define USBFS_UEPx_TX_CTRL_OFFSET(n) (0x30 + 4 * (n) + 2) // endpoint x DMA buffer address +#define USBFS_UEPx_RX_CTRL_OFFSET(n) (0x30 + 4 * (n) + 3) // endpoint x DMA buffer address + +#define USBFS_UEP_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion on endpoint 1/2/3: 0=manual toggle, 1=automatic toggle +#define USBFS_UEP_R_TOG 0x04 // expected data toggle flag of USB endpoint X receiving (OUT): 0=DATA0, 1=DATA1 +#define USBFS_UEP_T_TOG 0x04 // prepared data toggle flag of USB endpoint X transmittal (IN): 0=DATA0, 1=DATA1 + +#define USBFS_UEP_R_RES1 0x02 // handshake response type high bit for USB endpoint X receiving (OUT) +#define USBFS_UEP_R_RES0 0x01 // handshake response type low bit for USB endpoint X receiving (OUT) +#define USBFS_UEP_R_RES_MASK 0x03 // bit mask of handshake response type for USB endpoint X receiving (OUT) +#define USBFS_UEP_R_RES_ACK 0x00 +#define USBFS_UEP_R_RES_TOUT 0x01 +#define USBFS_UEP_R_RES_NAK 0x02 +#define USBFS_UEP_R_RES_STALL 0x03 +// RB_UEP_R_RES1 & RB_UEP_R_RES0: handshake response type for USB endpoint X receiving (OUT) +// 00: ACK (ready) +// 01: no response, time out to host, for non-zero endpoint isochronous transactions +// 10: NAK (busy) +// 11: STALL (error) +#define USBFS_UEP_T_RES1 0x02 // handshake response type high bit for USB endpoint X transmittal (IN) +#define USBFS_UEP_T_RES0 0x01 // handshake response type low bit for USB endpoint X transmittal (IN) +#define USBFS_UEP_T_RES_MASK 0x03 // bit mask of handshake response type for USB endpoint X transmittal (IN) +#define USBFS_UEP_T_RES_ACK 0x00 +#define USBFS_UEP_T_RES_TOUT 0x01 +#define USBFS_UEP_T_RES_NAK 0x02 +#define USBFS_UEP_T_RES_STALL 0x03 +// bUEP_T_RES1 & bUEP_T_RES0: handshake response type for USB endpoint X transmittal (IN) +// 00: DATA0 or DATA1 then expecting ACK (ready) +// 01: DATA0 or DATA1 then expecting no response, time out from host, for non-zero endpoint isochronous transactions +// 10: NAK (busy) +// 11: TALL (error) + +/******************* HOST ******************/ + +#define USBFS_UHOST_CTRL_OFFSET 0x01 // USB host physical prot control +#define USBFS_UH_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable +#define USBFS_UH_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level +#define USBFS_UH_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level +#define USBFS_UH_LOW_SPEED 0x04 // enable USB port low speed: 0=full speed, 1=low speed +#define USBFS_UH_BUS_RESET 0x02 // control USB bus reset: 0=normal, 1=force bus reset +#define USBFS_UH_PORT_EN 0x01 // enable USB port: 0=disable, 1=enable port, automatic disabled if USB device detached + +#define USBFS_UH_EP_MOD_OFFSET USBFS_UEP2_3_MOD_OFFSET +#define USBFS_UH_EP_TX_EN 0x40 // enable USB host OUT endpoint transmittal +#define USBFS_UH_EP_TBUF_MOD 0x10 // buffer mode of USB host OUT endpoint +// bUH_EP_TX_EN & bUH_EP_TBUF_MOD: USB host OUT endpoint buffer mode, buffer start address is UH_TX_DMA +// 0 x: disable endpoint and disable buffer +// 1 0: 64 bytes buffer for transmittal (OUT endpoint) +// 1 1: dual 64 bytes buffer by toggle bit bUH_T_TOG selection for transmittal (OUT endpoint), total=128bytes +#define USBFS_UH_EP_RX_EN 0x08 // enable USB host IN endpoint receiving +#define USBFS_UH_EP_RBUF_MOD 0x01 // buffer mode of USB host IN endpoint +// bUH_EP_RX_EN & bUH_EP_RBUF_MOD: USB host IN endpoint buffer mode, buffer start address is UH_RX_DMA +// 0 x: disable endpoint and disable buffer +// 1 0: 64 bytes buffer for receiving (IN endpoint) +// 1 1: dual 64 bytes buffer by toggle bit bUH_R_TOG selection for receiving (IN endpoint), total=128bytes + +#define USBFS_UH_RX_DMA_OFFSET USBFS_UEPx_DMA_OFFSET(2) // host rx endpoint buffer high address +#define USBFS_UH_TX_DMA_OFFSET USBFS_UEPx_DMA_OFFSET(3) // host tx endpoint buffer high address + +#define USBFS_UH_SETUP_OFFSET USBFS_UEPx_TX_CTRL_OFFSET(1) +#define USBFS_UH_PRE_PID_EN 0x0400 // USB host PRE PID enable for low speed device via hub +#define USBFS_UH_SOF_EN 0x04 // USB host automatic SOF enable + +#define USBFS_UH_EP_PID_OFFSET USBFS_UEPx_T_LEN_OFFSET(2) +#define USBFS_UH_TOKEN_MASK 0xF0 // bit mask of token PID for USB host transfer +#define USBFS_UH_ENDP_MASK 0x0F // bit mask of endpoint number for USB host transfer + +#define USBFS_UH_RX_CTRL_OFFSET USBFS_UEPx_RX_CTRL_OFFSET(2) // host receiver endpoint control +#define USBFS_UH_R_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle +#define USBFS_UH_R_TOG 0x04 // expected data toggle flag of host receiving (IN): 0=DATA0, 1=DATA1 +#define USBFS_UH_R_RES 0x01 // prepared handshake response type for host receiving (IN): 0=ACK (ready), 1=no response, time out to device, for isochronous transactions + +#define USBFS_UH_TX_LEN_OFFSET USBFS_UEPx_T_LEN_OFFSET(3) + +#define USBFS_UH_TX_CTRL_OFFSET USBFS_UEPx_TX_CTRL_OFFSET(3) // host transmittal endpoint control +#define USBFS_UH_T_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle +#define USBFS_UH_T_TOG 0x04 // prepared data toggle flag of host transmittal (SETUP/OUT): 0=DATA0, 1=DATA1 +#define USBFS_UH_T_RES 0x01 // expected handshake response type for host transmittal (SETUP/OUT): 0=ACK (ready), 1=no response, time out from device, for isochronous transactions + +#endif diff --git a/src/lib/CherryUSB/port/ch32/ch32fs/usb_dc_usbfs.c b/src/lib/CherryUSB/port/ch32/ch32fs/usb_dc_usbfs.c new file mode 100644 index 000000000..8047d42d9 --- /dev/null +++ b/src/lib/CherryUSB/port/ch32/ch32fs/usb_dc_usbfs.c @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usb_ch32_usbfs_reg.h" + +#ifdef CONFIG_USB_HS +#error "usb fs do not support hs" +#endif + +#ifndef USB_NUM_BIDIR_ENDPOINTS +#define USB_NUM_BIDIR_ENDPOINTS 8 +#endif + +#define USB_SET_DMA(ep_idx, addr) (*(volatile uint32_t *)((uint32_t)(&USBFS_DEVICE->UEP0_DMA) + 4 * ep_idx) = addr) +#define USB_SET_TX_LEN(ep_idx, len) (*(volatile uint16_t *)((uint32_t)(&USBFS_DEVICE->UEP0_TX_LEN) + 4 * ep_idx) = len) +#define USB_GET_TX_LEN(ep_idx) (*(volatile uint16_t *)((uint32_t)(&USBFS_DEVICE->UEP0_TX_LEN) + 4 * ep_idx)) +#define USB_SET_TX_CTRL(ep_idx, val) (*(volatile uint8_t *)((uint32_t)(&USBFS_DEVICE->UEP0_TX_CTRL) + 4 * ep_idx) = val) +#define USB_GET_TX_CTRL(ep_idx) (*(volatile uint8_t *)((uint32_t)(&USBFS_DEVICE->UEP0_TX_CTRL) + 4 * ep_idx)) +#define USB_SET_RX_CTRL(ep_idx, val) (*(volatile uint8_t *)((uint32_t)(&USBFS_DEVICE->UEP0_RX_CTRL) + 4 * ep_idx) = val) +#define USB_GET_RX_CTRL(ep_idx) (*(volatile uint8_t *)((uint32_t)(&USBFS_DEVICE->UEP0_RX_CTRL) + 4 * ep_idx)) + +/* Endpoint state */ +struct ch32_usbfs_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +/* Driver state */ +struct ch32_usbfs_udc { + __attribute__((aligned(4))) struct usb_setup_packet setup; + volatile uint8_t dev_addr; + struct ch32_usbfs_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ + struct ch32_usbfs_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ + __attribute__((aligned(4))) uint8_t ep_databuf[USB_NUM_BIDIR_ENDPOINTS - 1][64 + 64]; //epx_out(64)+epx_in(64) +} g_ch32_usbfs_udc; + +volatile bool ep0_rx_data_toggle; +volatile bool ep0_tx_data_toggle; + +__WEAK void usb_dc_low_level_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + +int usb_dc_init(uint8_t busid) +{ + usb_dc_low_level_init(); + + USBFS_DEVICE->BASE_CTRL = 0x00; + + USBFS_DEVICE->UEP4_1_MOD = USBFS_UEP4_RX_EN | USBFS_UEP4_TX_EN | USBFS_UEP1_RX_EN | USBFS_UEP1_TX_EN; + USBFS_DEVICE->UEP2_3_MOD = USBFS_UEP2_RX_EN | USBFS_UEP2_TX_EN | USBFS_UEP3_RX_EN | USBFS_UEP3_TX_EN; + USBFS_DEVICE->UEP5_6_MOD = USBFS_UEP5_RX_EN | USBFS_UEP5_TX_EN | USBFS_UEP6_RX_EN | USBFS_UEP6_TX_EN; + USBFS_DEVICE->UEP7_MOD = USBFS_UEP7_RX_EN | USBFS_UEP7_TX_EN; + + USBFS_DEVICE->UEP1_DMA = (uint32_t)g_ch32_usbfs_udc.ep_databuf[0]; + USBFS_DEVICE->UEP2_DMA = (uint32_t)g_ch32_usbfs_udc.ep_databuf[1]; + USBFS_DEVICE->UEP3_DMA = (uint32_t)g_ch32_usbfs_udc.ep_databuf[2]; + USBFS_DEVICE->UEP4_DMA = (uint32_t)g_ch32_usbfs_udc.ep_databuf[3]; + USBFS_DEVICE->UEP5_DMA = (uint32_t)g_ch32_usbfs_udc.ep_databuf[4]; + USBFS_DEVICE->UEP6_DMA = (uint32_t)g_ch32_usbfs_udc.ep_databuf[5]; + USBFS_DEVICE->UEP7_DMA = (uint32_t)g_ch32_usbfs_udc.ep_databuf[6]; + + USBFS_DEVICE->INT_FG = 0xFF; + USBFS_DEVICE->INT_EN = USBFS_UIE_SUSPEND | USBFS_UIE_BUS_RST | USBFS_UIE_TRANSFER; + USBFS_DEVICE->DEV_ADDR = 0x00; + + USBFS_DEVICE->BASE_CTRL = USBFS_UC_DEV_PU_EN | USBFS_UC_INT_BUSY | USBFS_UC_DMA_EN; + USBFS_DEVICE->UDEV_CTRL = USBFS_UD_PD_DIS | USBFS_UD_PORT_EN; + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + if (addr == 0) { + USBFS_DEVICE->DEV_ADDR = (USBFS_DEVICE->DEV_ADDR & USBFS_UDA_GP_BIT) | 0; + } + g_ch32_usbfs_udc.dev_addr = addr; + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + return -1; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + return USB_SPEED_FULL; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_ch32_usbfs_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_ch32_usbfs_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_ch32_usbfs_udc.out_ep[ep_idx].ep_enable = true; + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_NAK | USBFS_UEP_AUTO_TOG); + } else { + g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_ch32_usbfs_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_ch32_usbfs_udc.in_ep[ep_idx].ep_enable = true; + USB_SET_TX_CTRL(ep_idx, USBFS_UEP_T_RES_NAK | USBFS_UEP_AUTO_TOG); + } + return 0; +} +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + return 0; +} +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + if (ep_idx == 0) { + USBFS_DEVICE->UEP0_RX_CTRL = USBFS_UEP_R_TOG | USBFS_UEP_R_RES_STALL; + } else { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBFS_UEP_R_RES_MASK) | USBFS_UEP_R_RES_STALL); + } + } else { + if (ep_idx == 0) { + USBFS_DEVICE->UEP0_TX_CTRL = USBFS_UEP_T_TOG | USBFS_UEP_T_RES_STALL; + } else { + USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBFS_UEP_T_RES_MASK) | USBFS_UEP_T_RES_STALL); + } + } + + if (ep_idx == 0) { + USB_SET_DMA(ep_idx, (uint32_t)&g_ch32_usbfs_udc.setup); + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_ACK); + } + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (ep_idx == 0) { + return 0; + } + + if (USB_EP_DIR_IS_OUT(ep)) { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~(USBFS_UEP_R_TOG | USBFS_UEP_R_RES_MASK)) | USBFS_UEP_R_RES_ACK); + } else { + USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~(USBFS_UEP_T_TOG | USBFS_UEP_T_RES_MASK)) | USBFS_UEP_T_RES_NAK); + } + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_ch32_usbfs_udc.in_ep[ep_idx].ep_enable) { + return -2; + } + + if ((uint32_t)data & 0x03) { + printf("data do not align4\r\n"); + return -3; + } + + g_ch32_usbfs_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len = data_len; + g_ch32_usbfs_udc.in_ep[ep_idx].actual_xfer_len = 0; + + if (ep_idx == 0) { + if (data_len == 0) { + USB_SET_TX_LEN(ep_idx, 0); + } else { + data_len = MIN(data_len, g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps); + USB_SET_TX_LEN(ep_idx, data_len); + USB_SET_DMA(ep_idx, (uint32_t)data); + } + if (ep0_tx_data_toggle) { + USB_SET_TX_CTRL(ep_idx, USBFS_UEP_T_TOG | USBFS_UEP_T_RES_ACK); + } else { + USB_SET_TX_CTRL(ep_idx, USBFS_UEP_T_RES_ACK); + } + + } else { + if (data_len == 0) { + USB_SET_TX_LEN(ep_idx, 0); + } else { + data_len = MIN(data_len, g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps); + USB_SET_TX_LEN(ep_idx, data_len); + memcpy(&g_ch32_usbfs_udc.ep_databuf[ep_idx - 1][64], data, data_len); + } + USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBFS_UEP_T_RES_MASK) | USBFS_UEP_T_RES_ACK); + } + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_ch32_usbfs_udc.out_ep[ep_idx].ep_enable) { + return -2; + } + if ((uint32_t)data & 0x03) { + printf("data do not align4\r\n"); + return -3; + } + + g_ch32_usbfs_udc.out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_ch32_usbfs_udc.out_ep[ep_idx].xfer_len = data_len; + g_ch32_usbfs_udc.out_ep[ep_idx].actual_xfer_len = 0; + + if (ep_idx == 0) { + if (data_len == 0) { + } else { + USB_SET_DMA(ep_idx, (uint32_t)data); + } + if (ep0_rx_data_toggle) { + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_TOG | USBFS_UEP_R_RES_ACK); + } else { + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_ACK); + } + return 0; + } else { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBFS_UEP_R_RES_MASK) | USBFS_UEP_R_RES_ACK); + } + + return 0; +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint32_t ep_idx = 0, token, write_count, read_count; + uint8_t intflag = 0; + + intflag = USBFS_DEVICE->INT_FG; + + if (intflag & USBFS_UIF_TRANSFER) { + token = USBFS_DEVICE->INT_ST & USBFS_UIS_TOKEN_MASK; + ep_idx = USBFS_DEVICE->INT_ST & USBFS_UIS_ENDP_MASK; + + USBFS_DEVICE->INT_FG = USBFS_UIF_TRANSFER; + + switch (token) { + case USBFS_UIS_TOKEN_SETUP: + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_NAK); + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_ch32_usbfs_udc.setup); + break; + + case USBFS_UIS_TOKEN_IN: + if (ep_idx == 0x00) { + if (g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len >= g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps) { + g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len -= g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps; + g_ch32_usbfs_udc.in_ep[ep_idx].actual_xfer_len += g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps; + ep0_tx_data_toggle ^= 1; + } else { + g_ch32_usbfs_udc.in_ep[ep_idx].actual_xfer_len += g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len; + g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len = 0; + ep0_tx_data_toggle = true; + } + + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_ch32_usbfs_udc.in_ep[ep_idx].actual_xfer_len); + + if (g_ch32_usbfs_udc.dev_addr > 0) { + USBFS_DEVICE->DEV_ADDR = (USBFS_DEVICE->DEV_ADDR & USBFS_UDA_GP_BIT) | g_ch32_usbfs_udc.dev_addr; + g_ch32_usbfs_udc.dev_addr = 0; + } + + if (g_ch32_usbfs_udc.setup.wLength && ((g_ch32_usbfs_udc.setup.bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_OUT)) { + /* In status, start reading setup */ + USB_SET_DMA(ep_idx, (uint32_t)&g_ch32_usbfs_udc.setup); + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_ACK); + ep0_tx_data_toggle = true; + + } else if (g_ch32_usbfs_udc.setup.wLength == 0) { + /* In status, start reading setup */ + USB_SET_DMA(ep_idx, (uint32_t)&g_ch32_usbfs_udc.setup); + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_ACK); + ep0_tx_data_toggle = true; + } + } else { + USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBFS_UEP_T_RES_MASK) | USBFS_UEP_T_RES_NAK); + + if (g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len > g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps) { + g_ch32_usbfs_udc.in_ep[ep_idx].xfer_buf += g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps; + g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len -= g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps; + g_ch32_usbfs_udc.in_ep[ep_idx].actual_xfer_len += g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps; + + write_count = MIN(g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len, g_ch32_usbfs_udc.in_ep[ep_idx].ep_mps); + USB_SET_TX_LEN(ep_idx, write_count); + memcpy(&g_ch32_usbfs_udc.ep_databuf[ep_idx - 1][64], g_ch32_usbfs_udc.in_ep[ep_idx].xfer_buf, write_count); + + USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBFS_UEP_T_RES_MASK) | USBFS_UEP_T_RES_ACK); + } else { + g_ch32_usbfs_udc.in_ep[ep_idx].actual_xfer_len += g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len; + g_ch32_usbfs_udc.in_ep[ep_idx].xfer_len = 0; + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_ch32_usbfs_udc.in_ep[ep_idx].actual_xfer_len); + } + } + break; + case USBFS_UIS_TOKEN_OUT: + if (ep_idx == 0x00) { + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_NAK); + + read_count = USBFS_DEVICE->RX_LEN; + + g_ch32_usbfs_udc.out_ep[ep_idx].actual_xfer_len += read_count; + g_ch32_usbfs_udc.out_ep[ep_idx].xfer_len -= read_count; + + usbd_event_ep_out_complete_handler(0, 0x00, g_ch32_usbfs_udc.out_ep[ep_idx].actual_xfer_len); + + if (read_count == 0) { + /* Out status, start reading setup */ + USB_SET_DMA(ep_idx, (uint32_t)&g_ch32_usbfs_udc.setup); + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_ACK); + ep0_rx_data_toggle = true; + ep0_tx_data_toggle = true; + } else { + ep0_rx_data_toggle ^= 1; + } + } else { + if (USBFS_DEVICE->INT_ST & USBFS_UIS_TOG_OK) { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBFS_UEP_R_RES_MASK) | USBFS_UEP_R_RES_NAK); + read_count = USBFS_DEVICE->RX_LEN; + + memcpy(g_ch32_usbfs_udc.out_ep[ep_idx].xfer_buf, &g_ch32_usbfs_udc.ep_databuf[ep_idx - 1][0], read_count); + + g_ch32_usbfs_udc.out_ep[ep_idx].xfer_buf += read_count; + g_ch32_usbfs_udc.out_ep[ep_idx].actual_xfer_len += read_count; + g_ch32_usbfs_udc.out_ep[ep_idx].xfer_len -= read_count; + + if ((read_count < g_ch32_usbfs_udc.out_ep[ep_idx].ep_mps) || (g_ch32_usbfs_udc.out_ep[ep_idx].xfer_len == 0)) { + usbd_event_ep_out_complete_handler(0, ep_idx, g_ch32_usbfs_udc.out_ep[ep_idx].actual_xfer_len); + } else { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBFS_UEP_R_RES_MASK) | USBFS_UEP_R_RES_ACK); + } + } + } + break; + + case USBFS_UIS_TOKEN_SOF: + + break; + + default: + break; + } + + } else if (intflag & USBFS_UIF_BUS_RST) { + USBFS_DEVICE->INT_FG = USBFS_UIF_BUS_RST; + + USBFS_DEVICE->UEP0_TX_LEN = 0; + USBFS_DEVICE->UEP0_TX_CTRL = USBFS_UEP_T_RES_NAK; + USBFS_DEVICE->UEP0_RX_CTRL = USBFS_UEP_R_RES_NAK; + + for (uint8_t ep_idx = 1; ep_idx < USB_NUM_BIDIR_ENDPOINTS; ep_idx++) { + USB_SET_TX_LEN(ep_idx, 0); + USB_SET_TX_CTRL(ep_idx, USBFS_UEP_T_RES_NAK | USBFS_UEP_AUTO_TOG); + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_NAK | USBFS_UEP_AUTO_TOG); + } + + ep0_tx_data_toggle = true; + ep0_rx_data_toggle = true; + + memset(&g_ch32_usbfs_udc, 0, sizeof(struct ch32_usbfs_udc)); + usbd_event_reset_handler(0); + USB_SET_DMA(ep_idx, (uint32_t)&g_ch32_usbfs_udc.setup); + USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_ACK); + } else if (intflag & USBFS_UIF_SUSPEND) { + if (USBFS_DEVICE->MIS_ST & USBFS_UMS_SUSPEND) { + } else { + } + USBFS_DEVICE->INT_FG = USBFS_UIF_SUSPEND; + } else { + USBFS_DEVICE->INT_FG = intflag; + } +} + +void USBFS_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +void USBFS_IRQHandler(void) +{ + extern void USBD_IRQHandler(uint8_t busid); + USBD_IRQHandler(0); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ch32/ch32hs/usb_ch32_usbhs_reg.h b/src/lib/CherryUSB/port/ch32/ch32hs/usb_ch32_usbhs_reg.h new file mode 100644 index 000000000..1dca5d1b8 --- /dev/null +++ b/src/lib/CherryUSB/port/ch32/ch32hs/usb_ch32_usbhs_reg.h @@ -0,0 +1,564 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef _USB_CH32_USBHS_REG_H +#define _USB_CH32_USBHS_REG_H + +#define __IO volatile /* defines 'read / write' permissions */ + +/* USBHS Registers */ +typedef struct +{ + __IO uint8_t CONTROL; + __IO uint8_t HOST_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_AD; + __IO uint16_t FRAME_NO; + __IO uint8_t SUSPEND; + __IO uint8_t RESERVED0; + __IO uint8_t SPEED_TYPE; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint16_t RX_LEN; + __IO uint16_t RESERVED1; + __IO uint32_t ENDP_CONFIG; + __IO uint32_t ENDP_TYPE; + __IO uint32_t BUF_MODE; + __IO uint32_t UEP0_DMA; + __IO uint32_t UEP1_RX_DMA; + __IO uint32_t UEP2_RX_DMA; + __IO uint32_t UEP3_RX_DMA; + __IO uint32_t UEP4_RX_DMA; + __IO uint32_t UEP5_RX_DMA; + __IO uint32_t UEP6_RX_DMA; + __IO uint32_t UEP7_RX_DMA; + __IO uint32_t UEP8_RX_DMA; + __IO uint32_t UEP9_RX_DMA; + __IO uint32_t UEP10_RX_DMA; + __IO uint32_t UEP11_RX_DMA; + __IO uint32_t UEP12_RX_DMA; + __IO uint32_t UEP13_RX_DMA; + __IO uint32_t UEP14_RX_DMA; + __IO uint32_t UEP15_RX_DMA; + __IO uint32_t UEP1_TX_DMA; + __IO uint32_t UEP2_TX_DMA; + __IO uint32_t UEP3_TX_DMA; + __IO uint32_t UEP4_TX_DMA; + __IO uint32_t UEP5_TX_DMA; + __IO uint32_t UEP6_TX_DMA; + __IO uint32_t UEP7_TX_DMA; + __IO uint32_t UEP8_TX_DMA; + __IO uint32_t UEP9_TX_DMA; + __IO uint32_t UEP10_TX_DMA; + __IO uint32_t UEP11_TX_DMA; + __IO uint32_t UEP12_TX_DMA; + __IO uint32_t UEP13_TX_DMA; + __IO uint32_t UEP14_TX_DMA; + __IO uint32_t UEP15_TX_DMA; + __IO uint16_t UEP0_MAX_LEN; + __IO uint16_t RESERVED2; + __IO uint16_t UEP1_MAX_LEN; + __IO uint16_t RESERVED3; + __IO uint16_t UEP2_MAX_LEN; + __IO uint16_t RESERVED4; + __IO uint16_t UEP3_MAX_LEN; + __IO uint16_t RESERVED5; + __IO uint16_t UEP4_MAX_LEN; + __IO uint16_t RESERVED6; + __IO uint16_t UEP5_MAX_LEN; + __IO uint16_t RESERVED7; + __IO uint16_t UEP6_MAX_LEN; + __IO uint16_t RESERVED8; + __IO uint16_t UEP7_MAX_LEN; + __IO uint16_t RESERVED9; + __IO uint16_t UEP8_MAX_LEN; + __IO uint16_t RESERVED10; + __IO uint16_t UEP9_MAX_LEN; + __IO uint16_t RESERVED11; + __IO uint16_t UEP10_MAX_LEN; + __IO uint16_t RESERVED12; + __IO uint16_t UEP11_MAX_LEN; + __IO uint16_t RESERVED13; + __IO uint16_t UEP12_MAX_LEN; + __IO uint16_t RESERVED14; + __IO uint16_t UEP13_MAX_LEN; + __IO uint16_t RESERVED15; + __IO uint16_t UEP14_MAX_LEN; + __IO uint16_t RESERVED16; + __IO uint16_t UEP15_MAX_LEN; + __IO uint16_t RESERVED17; + __IO uint16_t UEP0_TX_LEN; + __IO uint8_t UEP0_TX_CTRL; + __IO uint8_t UEP0_RX_CTRL; + __IO uint16_t UEP1_TX_LEN; + __IO uint8_t UEP1_TX_CTRL; + __IO uint8_t UEP1_RX_CTRL; + __IO uint16_t UEP2_TX_LEN; + __IO uint8_t UEP2_TX_CTRL; + __IO uint8_t UEP2_RX_CTRL; + __IO uint16_t UEP3_TX_LEN; + __IO uint8_t UEP3_TX_CTRL; + __IO uint8_t UEP3_RX_CTRL; + __IO uint16_t UEP4_TX_LEN; + __IO uint8_t UEP4_TX_CTRL; + __IO uint8_t UEP4_RX_CTRL; + __IO uint16_t UEP5_TX_LEN; + __IO uint8_t UEP5_TX_CTRL; + __IO uint8_t UEP5_RX_CTRL; + __IO uint16_t UEP6_TX_LEN; + __IO uint8_t UEP6_TX_CTRL; + __IO uint8_t UEP6_RX_CTRL; + __IO uint16_t UEP7_TX_LEN; + __IO uint8_t UEP7_TX_CTRL; + __IO uint8_t UEP7_RX_CTRL; + __IO uint16_t UEP8_TX_LEN; + __IO uint8_t UEP8_TX_CTRL; + __IO uint8_t UEP8_RX_CTRL; + __IO uint16_t UEP9_TX_LEN; + __IO uint8_t UEP9_TX_CTRL; + __IO uint8_t UEP9_RX_CTRL; + __IO uint16_t UEP10_TX_LEN; + __IO uint8_t UEP10_TX_CTRL; + __IO uint8_t UEP10_RX_CTRL; + __IO uint16_t UEP11_TX_LEN; + __IO uint8_t UEP11_TX_CTRL; + __IO uint8_t UEP11_RX_CTRL; + __IO uint16_t UEP12_TX_LEN; + __IO uint8_t UEP12_TX_CTRL; + __IO uint8_t UEP12_RX_CTRL; + __IO uint16_t UEP13_TX_LEN; + __IO uint8_t UEP13_TX_CTRL; + __IO uint8_t UEP13_RX_CTRL; + __IO uint16_t UEP14_TX_LEN; + __IO uint8_t UEP14_TX_CTRL; + __IO uint8_t UEP14_RX_CTRL; + __IO uint16_t UEP15_TX_LEN; + __IO uint8_t UEP15_TX_CTRL; + __IO uint8_t UEP15_RX_CTRL; +} USBHSD_TypeDef; + +typedef struct __attribute__((packed)) { + __IO uint8_t CONTROL; + __IO uint8_t HOST_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_AD; + __IO uint16_t FRAME_NO; + __IO uint8_t SUSPEND; + __IO uint8_t RESERVED0; + __IO uint8_t SPEED_TYPE; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint16_t RX_LEN; + __IO uint16_t RESERVED1; + __IO uint32_t HOST_EP_CONFIG; + __IO uint32_t HOST_EP_TYPE; + __IO uint32_t RESERVED2; + __IO uint32_t RESERVED3; + __IO uint32_t RESERVED4; + __IO uint32_t HOST_RX_DMA; + __IO uint32_t RESERVED5; + __IO uint32_t RESERVED6; + __IO uint32_t RESERVED7; + __IO uint32_t RESERVED8; + __IO uint32_t RESERVED9; + __IO uint32_t RESERVED10; + __IO uint32_t RESERVED11; + __IO uint32_t RESERVED12; + __IO uint32_t RESERVED13; + __IO uint32_t RESERVED14; + __IO uint32_t RESERVED15; + __IO uint32_t RESERVED16; + __IO uint32_t RESERVED17; + __IO uint32_t RESERVED18; + __IO uint32_t RESERVED19; + __IO uint32_t HOST_TX_DMA; + __IO uint32_t RESERVED20; + __IO uint32_t RESERVED21; + __IO uint32_t RESERVED22; + __IO uint32_t RESERVED23; + __IO uint32_t RESERVED24; + __IO uint32_t RESERVED25; + __IO uint32_t RESERVED26; + __IO uint32_t RESERVED27; + __IO uint32_t RESERVED28; + __IO uint32_t RESERVED29; + __IO uint32_t RESERVED30; + __IO uint32_t RESERVED31; + __IO uint32_t RESERVED32; + __IO uint32_t RESERVED33; + __IO uint16_t HOST_RX_MAX_LEN; + __IO uint16_t RESERVED34; + __IO uint32_t RESERVED35; + __IO uint32_t RESERVED36; + __IO uint32_t RESERVED37; + __IO uint32_t RESERVED38; + __IO uint32_t RESERVED39; + __IO uint32_t RESERVED40; + __IO uint32_t RESERVED41; + __IO uint32_t RESERVED42; + __IO uint32_t RESERVED43; + __IO uint32_t RESERVED44; + __IO uint32_t RESERVED45; + __IO uint32_t RESERVED46; + __IO uint32_t RESERVED47; + __IO uint32_t RESERVED48; + __IO uint32_t RESERVED49; + __IO uint8_t HOST_EP_PID; + __IO uint8_t RESERVED50; + __IO uint8_t RESERVED51; + __IO uint8_t HOST_RX_CTRL; + __IO uint16_t HOST_TX_LEN; + __IO uint8_t HOST_TX_CTRL; + __IO uint8_t RESERVED52; + __IO uint16_t HOST_SPLIT_DATA; +} USBHSH_TypeDef; + +#define USBHS_BASE ((uint32_t)(0x40000000 + 0x23400)) + +#define USBHS_DEVICE ((USBHSD_TypeDef *)USBHS_BASE) +#define USBHS_HOST ((USBHSH_TypeDef *)USBHS_BASE) + +/******************* GLOBAL ******************/ + +// USB CONTROL +#define USBHS_CONTROL_OFFSET 0x00 +#define USBHS_DMA_EN (1 << 0) +#define USBHS_ALL_CLR (1 << 1) +#define USBHS_FORCE_RST (1 << 2) +#define USBHS_INT_BUSY_EN (1 << 3) +#define USBHS_DEV_PU_EN (1 << 4) +#define USBHS_SPEED_MASK (3 << 5) +#define USBHS_FULL_SPEED (0 << 5) +#define USBHS_HIGH_SPEED (1 << 5) +#define USBHS_LOW_SPEED (2 << 5) +#define USBHS_HOST_MODE (1 << 7) + +// USB_INT_EN +#define USBHS_INT_EN_OFFSET 0x02 +#define USBHS_BUS_RST_EN (1 << 0) +#define USBHS_DETECT_EN (1 << 0) +#define USBHS_TRANSFER_EN (1 << 1) +#define USBHS_SUSPEND_EN (1 << 2) +#define USBHS_SOF_ACT_EN (1 << 3) +#define USBHS_FIFO_OV_EN (1 << 4) +#define USBHS_SETUP_ACT_EN (1 << 5) +#define USBHS_ISO_ACT_EN (1 << 6) +#define USBHS_DEV_NAK_EN (1 << 7) + +// USB DEV AD +#define USBHS_DEV_AD_OFFSET 0x03 +// USB FRAME_NO +#define USBHS_FRAME_NO_OFFSET 0x04 +// USB SUSPEND +#define USBHS_SUSPEND_OFFSET 0x06 +#define USBHS_DEV_REMOTE_WAKEUP (1 << 2) +#define USBHS_LINESTATE_MASK (2 << 4) /* Read Only */ + +// RESERVED0 + +// USB SPEED TYPE +#define USBHS_SPEED_TYPE_OFFSET 0x08 +#define USBSPEED_MASK (0x03) + +// USB_MIS_ST +#define USBHS_MIS_ST_OFFSET 0x09 +#define USBHS_SPLIT_CAN (1 << 0) +#define USBHS_ATTACH (1 << 1) +#define USBHS_SUSPEND (1 << 2) +#define USBHS_BUS_RESET (1 << 3) +#define USBHS_R_FIFO_RDY (1 << 4) +#define USBHS_SIE_FREE (1 << 5) +#define USBHS_SOF_ACT (1 << 6) +#define USBHS_SOF_PRES (1 << 7) + +// INT_FLAG +#define USBHS_INT_FLAG_OFFSET 0x0A +#define USBHS_BUS_RST_FLAG (1 << 0) +#define USBHS_DETECT_FLAG (1 << 0) +#define USBHS_TRANSFER_FLAG (1 << 1) +#define USBHS_SUSPEND_FLAG (1 << 2) +#define USBHS_HST_SOF_FLAG (1 << 3) +#define USBHS_FIFO_OV_FLAG (1 << 4) +#define USBHS_SETUP_FLAG (1 << 5) +#define USBHS_ISO_ACT_FLAG (1 << 6) + +// INT_ST +#define USBHS_INT_ST_OFFSET 0x0B +#define USBHS_DEV_UIS_IS_NAK (1 << 7) +#define USBHS_DEV_UIS_TOG_OK (1 << 6) +#define MASK_UIS_TOKEN (3 << 4) +#define MASK_UIS_ENDP (0x0F) +#define MASK_UIS_H_RES (0x0F) + +#define USBHS_TOGGLE_OK (0x40) +#define USBHS_HOST_RES (0x0f) + +//USB_RX_LEN +#define USBHS_RX_LEN_OFFSET 0x0C +/******************* DEVICE ******************/ + +//UEP_CONFIG +#define USBHS_UEP_CONFIG_OFFSET 0x10 +#define USBHS_EP0_T_EN (1 << 0) +#define USBHS_EP0_R_EN (1 << 16) + +#define USBHS_EP1_T_EN (1 << 1) +#define USBHS_EP1_R_EN (1 << 17) + +#define USBHS_EP2_T_EN (1 << 2) +#define USBHS_EP2_R_EN (1 << 18) + +#define USBHS_EP3_T_EN (1 << 3) +#define USBHS_EP3_R_EN (1 << 19) + +#define USBHS_EP4_T_EN (1 << 4) +#define USBHS_EP4_R_EN (1 << 20) + +#define USBHS_EP5_T_EN (1 << 5) +#define USBHS_EP5_R_EN (1 << 21) + +#define USBHS_EP6_T_EN (1 << 6) +#define USBHS_EP6_R_EN (1 << 22) + +#define USBHS_EP7_T_EN (1 << 7) +#define USBHS_EP7_R_EN (1 << 23) + +#define USBHS_EP8_T_EN (1 << 8) +#define USBHS_EP8_R_EN (1 << 24) + +#define USBHS_EP9_T_EN (1 << 9) +#define USBHS_EP9_R_EN (1 << 25) + +#define USBHS_EP10_T_EN (1 << 10) +#define USBHS_EP10_R_EN (1 << 26) + +#define USBHS_EP11_T_EN (1 << 11) +#define USBHS_EP11_R_EN (1 << 27) + +#define USBHS_EP12_T_EN (1 << 12) +#define USBHS_EP12_R_EN (1 << 28) + +#define USBHS_EP13_T_EN (1 << 13) +#define USBHS_EP13_R_EN (1 << 29) + +#define USBHS_EP14_T_EN (1 << 14) +#define USBHS_EP14_R_EN (1 << 30) + +#define USBHS_EP15_T_EN (1 << 15) +#define USBHS_EP15_R_EN (1 << 31) + +//UEP_TYPE +#define USBHS_UEP_TYPE_OFFSET 0x14 +#define USBHS_EP0_T_TYP (1 << 0) +#define USBHS_EP0_R_TYP (1 << 16) + +#define USBHS_EP1_T_TYP (1 << 1) +#define USBHS_EP1_R_TYP (1 << 17) + +#define USBHS_EP2_T_TYP (1 << 2) +#define USBHS_EP2_R_TYP (1 << 18) + +#define USBHS_EP3_T_TYP (1 << 3) +#define USBHS_EP3_R_TYP (1 << 19) + +#define USBHS_EP4_T_TYP (1 << 4) +#define USBHS_EP4_R_TYP (1 << 20) + +#define USBHS_EP5_T_TYP (1 << 5) +#define USBHS_EP5_R_TYP (1 << 21) + +#define USBHS_EP6_T_TYP (1 << 6) +#define USBHS_EP6_R_TYP (1 << 22) + +#define USBHS_EP7_T_TYP (1 << 7) +#define USBHS_EP7_R_TYP (1 << 23) + +#define USBHS_EP8_T_TYP (1 << 8) +#define USBHS_EP8_R_TYP (1 << 24) + +#define USBHS_EP9_T_TYP (1 << 8) +#define USBHS_EP9_R_TYP (1 << 25) + +#define USBHS_EP10_T_TYP (1 << 10) +#define USBHS_EP10_R_TYP (1 << 26) + +#define USBHS_EP11_T_TYP (1 << 11) +#define USBHS_EP11_R_TYP (1 << 27) + +#define USBHS_EP12_T_TYP (1 << 12) +#define USBHS_EP12_R_TYP (1 << 28) + +#define USBHS_EP13_T_TYP (1 << 13) +#define USBHS_EP13_R_TYP (1 << 29) + +#define USBHS_EP14_T_TYP (1 << 14) +#define USBHS_EP14_R_TYP (1 << 30) + +#define USBHS_EP15_T_TYP (1 << 15) +#define USBHS_EP15_R_TYP (1 << 31) + +/* BUF_MOD UEP1~15 */ +#define USBHS_BUF_MOD_OFFSET 0x18 +#define USBHS_EP0_BUF_MOD (1 << 0) +#define USBHS_EP0_ISO_BUF_MOD (1 << 16) + +#define USBHS_EP1_BUF_MOD (1 << 1) +#define USBHS_EP1_ISO_BUF_MOD (1 << 17) + +#define USBHS_EP2_BUF_MOD (1 << 2) +#define USBHS_EP2_ISO_BUF_MOD (1 << 18) + +#define USBHS_EP3_BUF_MOD (1 << 3) +#define USBHS_EP3_ISO_BUF_MOD (1 << 19) + +#define USBHS_EP4_BUF_MOD (1 << 4) +#define USBHS_EP4_ISO_BUF_MOD (1 << 20) + +#define USBHS_EP5_BUF_MOD (1 << 5) +#define USBHS_EP5_ISO_BUF_MOD (1 << 21) + +#define USBHS_EP6_BUF_MOD (1 << 6) +#define USBHS_EP6_ISO_BUF_MOD (1 << 22) + +#define USBHS_EP7_BUF_MOD (1 << 7) +#define USBHS_EP7_ISO_BUF_MOD (1 << 23) + +#define USBHS_EP8_BUF_MOD (1 << 8) +#define USBHS_EP8_ISO_BUF_MOD (1 << 24) + +#define USBHS_EP9_BUF_MOD (1 << 9) +#define USBHS_EP9_ISO_BUF_MOD (1 << 25) + +#define USBHS_EP10_BUF_MOD (1 << 10) +#define USBHS_EP10_ISO_BUF_MOD (1 << 26) + +#define USBHS_EP11_BUF_MOD (1 << 11) +#define USBHS_EP11_ISO_BUF_MOD (1 << 27) + +#define USBHS_EP12_BUF_MOD (1 << 12) +#define USBHS_EP12_ISO_BUF_MOD (1 << 28) + +#define USBHS_EP13_BUF_MOD (1 << 13) +#define USBHS_EP13_ISO_BUF_MOD (1 << 29) + +#define USBHS_EP14_BUF_MOD (1 << 14) +#define USBHS_EP14_ISO_BUF_MOD (1 << 30) + +#define USBHS_EP15_BUF_MOD (1 << 15) +#define USBHS_EP15_ISO_BUF_MOD (1 << 31) +//USBHS_EPn_T_EN USBHS_EPn_R_EN USBHS_EPn_BUF_MOD 锟斤拷锟斤拷锟斤拷锟斤拷UEPn_DMA为锟斤拷始锟斤拷址锟缴碉拷锟斤拷锟斤拷锟斤拷锟� +// 0 0 x 锟剿点被锟斤拷锟矫o拷未锟矫碉拷UEPn_*_DMA锟斤拷锟斤拷锟斤拷锟斤拷 +// 1 0 0 锟斤拷锟秸o拷OUT锟斤拷锟斤拷锟斤拷锟斤拷锟阶碉拷址为UEPn_RX_DMA +// 1 0 1 bUEPn_RX_TOG[0]=0,使锟矫伙拷锟斤拷锟斤拷UEPn_RX_DMA锟斤拷bUEPn_RX_TOG[0]=1,使锟矫伙拷锟斤拷锟斤拷UEPn_TX_DMA +// 0 1 0 锟斤拷锟斤拷(IN)锟斤拷锟斤拷锟斤拷锟阶碉拷址为UEPn_TX_DMA锟斤拷 +// 0 1 1 bUEPn_TX_TOG[0]=0,使锟矫伙拷锟斤拷锟斤拷UEPn_TX_DMA锟斤拷bUEPn_TX_TOG[0]=1,使锟矫伙拷锟斤拷锟斤拷UEPn_RX_DMA + +/* USB0_DMA */ +#define USBHS_UEP0_DMA_OFFSET(n) (0x1C) // endpoint 0 DMA buffer address + +/* USBX_RX_DMA */ +#define USBHS_UEPx_RX_DMA_OFFSET(n) (0x1C + 4 * (n)) // endpoint x DMA buffer address + +#define USBHS_UEPx_TX_DMA_OFFSET(n) (0x58 + 4 * (n)) // endpoint x DMA buffer address + +#define USBHS_UEPx_MAX_LEN_OFFSET(n) (0x98 + 4 * (n)) // endpoint x DMA buffer address + +#define USBHS_UEPx_T_LEN_OFFSET(n) (0xD8 + 4 * (n)) // endpoint x DMA buffer address +#define USBHS_UEPx_TX_CTRL_OFFSET(n) (0xD8 + 4 * (n) + 2) // endpoint x DMA buffer address +#define USBHS_UEPx_RX_CTRL_OFFSET(n) (0xD8 + 4 * (n) + 3) // endpoint x DMA buffer address + +// UEPn_T_LEN +#define USBHS_EP_T_LEN_MASK (0x7FF) + +//UEPn_TX_CTRL +#define USBHS_EP_T_RES_MASK (3 << 0) +#define USBHS_EP_T_RES_ACK (0 << 0) +#define USBHS_EP_T_RES_NYET (1 << 0) +#define USBHS_EP_T_RES_NAK (2 << 0) +#define USBHS_EP_T_RES_STALL (3 << 0) + +#define USBHS_EP_T_TOG_MASK (3 << 3) +#define USBHS_EP_T_TOG_0 (0 << 3) +#define USBHS_EP_T_TOG_1 (1 << 3) +#define USBHS_EP_T_TOG_2 (2 << 3) +#define USBHS_EP_T_TOG_M (3 << 3) + +#define USBHS_EP_T_AUTOTOG (1 << 5) + +//UEPn_RX_CTRL +#define USBHS_EP_R_RES_MASK (3 << 0) +#define USBHS_EP_R_RES_ACK (0 << 0) +#define USBHS_EP_R_RES_NYET (1 << 0) +#define USBHS_EP_R_RES_NAK (2 << 0) +#define USBHS_EP_R_RES_STALL (3 << 0) + +#define USBHS_EP_R_TOG_MASK (3 << 3) +#define USBHS_EP_R_TOG_0 (0 << 3) +#define USBHS_EP_R_TOG_1 (1 << 3) +#define USBHS_EP_R_TOG_2 (2 << 3) +#define USBHS_EP_R_TOG_M (3 << 3) + +#define USBHS_EP_R_AUTOTOG (1 << 5) + +#define USBHS_TOG_MATCH (1 << 6) + +/******************* HOST ******************/ +// USB HOST_CTRL +#define USBHS_SEND_BUS_RESET (1 << 0) +#define USBHS_SEND_BUS_SUSPEND (1 << 1) +#define USBHS_SEND_BUS_RESUME (1 << 2) +#define USBHS_REMOTE_WAKE (1 << 3) +#define USBHS_PHY_SUSPENDM (1 << 4) +#define USBHS_UH_SOFT_FREE (1 << 6) +#define USBHS_SEND_SOF_EN (1 << 7) + +//UH_CONFIG +#define USBHS_HOST_TX_EN (1 << 3) +#define USBHS_HOST_RX_EN (1 << 18) + +// HOST_EP_TYPE +#define USBHS_ENDP_TX_ISO (1 << 3) +#define USBHS_ENDP_RX_ISO (1 << (16 + 2)) + +// R32_UH_EP_PID +#define USBHS_HOST_MASK_TOKEN (0x0f) +#define USBHS_HOST_MASK_ENDP (0x0f << 4) + +//R8_UH_RX_CTRL +#define USBHS_EP_R_RES_MASK (3 << 0) +#define USBHS_EP_R_RES_ACK (0 << 0) +#define USBHS_EP_R_RES_NYET (1 << 0) +#define USBHS_EP_R_RES_NAK (2 << 0) +#define USBHS_EP_R_RES_STALL (3 << 0) + +#define USBHS_UH_R_RES_NO (1 << 2) +#define USBHS_UH_R_TOG_1 (1 << 3) +#define USBHS_UH_R_TOG_2 (2 << 3) +#define USBHS_UH_R_TOG_3 (3 << 3) +#define USBHS_UH_R_TOG_AUTO (1 << 5) +#define USBHS_UH_R_DATA_NO (1 << 6) +//R8_UH_TX_CTRL +#define USBHS_UH_T_RES_MASK (3 << 0) +#define USBHS_UH_T_RES_ACK (0 << 0) +#define USBHS_UH_T_RES_NYET (1 << 0) +#define USBHS_UH_T_RES_NAK (2 << 0) +#define USBHS_UH_T_RES_STALL (3 << 0) + +#define USBHS_UH_T_RES_NO (1 << 2) +#define USBHS_UH_T_TOG_1 (1 << 3) +#define USBHS_UH_T_TOG_2 (2 << 3) +#define USBHS_UH_T_TOG_3 (3 << 3) +#define USBHS_UH_T_TOG_AUTO (1 << 5) +#define USBHS_UH_T_DATA_NO (1 << 6) + +// 00: OUT, 01:SOF, 10:IN, 11:SETUP +#define PID_OUT 0 +#define PID_SOF 1 +#define PID_IN 2 +#define PID_SETUP 3 + +#endif diff --git a/src/lib/CherryUSB/port/ch32/ch32hs/usb_dc_usbhs.c b/src/lib/CherryUSB/port/ch32/ch32hs/usb_dc_usbhs.c new file mode 100644 index 000000000..b882baf64 --- /dev/null +++ b/src/lib/CherryUSB/port/ch32/ch32hs/usb_dc_usbhs.c @@ -0,0 +1,428 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usb_ch32_usbhs_reg.h" + +#ifndef USB_NUM_BIDIR_ENDPOINTS +#define USB_NUM_BIDIR_ENDPOINTS 16 +#endif + +#define USB_SET_RX_DMA(ep_idx, addr) (*(volatile uint32_t *)((uint32_t)(&USBHS_DEVICE->UEP1_RX_DMA) + 4 * (ep_idx - 1)) = addr) +#define USB_SET_TX_DMA(ep_idx, addr) (*(volatile uint32_t *)((uint32_t)(&USBHS_DEVICE->UEP1_TX_DMA) + 4 * (ep_idx - 1)) = addr) +#define USB_SET_MAX_LEN(ep_idx, len) (*(volatile uint16_t *)((uint32_t)(&USBHS_DEVICE->UEP0_MAX_LEN) + 4 * ep_idx) = len) +#define USB_SET_TX_LEN(ep_idx, len) (*(volatile uint16_t *)((uint32_t)(&USBHS_DEVICE->UEP0_TX_LEN) + 4 * ep_idx) = len) +#define USB_GET_TX_LEN(ep_idx) (*(volatile uint16_t *)((uint32_t)(&USBHS_DEVICE->UEP0_TX_LEN) + 4 * ep_idx)) +#define USB_SET_TX_CTRL(ep_idx, val) (*(volatile uint8_t *)((uint32_t)(&USBHS_DEVICE->UEP0_TX_CTRL) + 4 * ep_idx) = val) +#define USB_GET_TX_CTRL(ep_idx) (*(volatile uint8_t *)((uint32_t)(&USBHS_DEVICE->UEP0_TX_CTRL) + 4 * ep_idx)) +#define USB_SET_RX_CTRL(ep_idx, val) (*(volatile uint8_t *)((uint32_t)(&USBHS_DEVICE->UEP0_RX_CTRL) + 4 * ep_idx) = val) +#define USB_GET_RX_CTRL(ep_idx) (*(volatile uint8_t *)((uint32_t)(&USBHS_DEVICE->UEP0_RX_CTRL) + 4 * ep_idx)) + +/* Endpoint state */ +struct ch32_usbhs_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +/* Driver state */ +struct ch32_usbhs_udc { + __attribute__((aligned(4))) struct usb_setup_packet setup; + volatile uint8_t dev_addr; + struct ch32_usbhs_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ + struct ch32_usbhs_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ +} g_ch32_usbhs_udc; + +volatile uint8_t mps_over_flag = 0; +volatile bool ep0_rx_data_toggle; +volatile bool ep0_tx_data_toggle; +volatile bool epx_tx_data_toggle[USB_NUM_BIDIR_ENDPOINTS - 1]; + +__WEAK void usb_dc_low_level_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + +int usb_dc_init(uint8_t busid) +{ + usb_dc_low_level_init(); + + USBHS_DEVICE->HOST_CTRL = 0x00; + USBHS_DEVICE->HOST_CTRL = USBHS_PHY_SUSPENDM; + + USBHS_DEVICE->CONTROL = 0; +#ifdef CONFIG_USB_HS + USBHS_DEVICE->CONTROL = USBHS_DMA_EN | USBHS_INT_BUSY_EN | USBHS_HIGH_SPEED; +#else + USBHS_DEVICE->CONTROL = USBHS_DMA_EN | USBHS_INT_BUSY_EN | USBHS_FULL_SPEED; +#endif + + USBHS_DEVICE->INT_FG = 0xff; + USBHS_DEVICE->INT_EN = 0; + USBHS_DEVICE->INT_EN = USBHS_SETUP_ACT_EN | USBHS_TRANSFER_EN | USBHS_DETECT_EN; + + USBHS_DEVICE->ENDP_TYPE = 0x00; + USBHS_DEVICE->BUF_MODE = 0x00; + + USBHS_DEVICE->CONTROL |= USBHS_DEV_PU_EN; + + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + if (addr == 0) { + USBHS_DEVICE->DEV_AD = addr & 0xff; + } + g_ch32_usbhs_udc.dev_addr = addr; + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + return -1; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + return USB_SPEED_HIGH; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_ch32_usbhs_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_ch32_usbhs_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_ch32_usbhs_udc.out_ep[ep_idx].ep_enable = true; + if (g_ch32_usbhs_udc.out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + USBHS_DEVICE->ENDP_TYPE |= (1 << (ep_idx + 16)); + } else { + USBHS_DEVICE->ENDP_TYPE &= ~(1 << (ep_idx + 16)); + } + USBHS_DEVICE->ENDP_CONFIG |= (1 << (ep_idx + 16)); + USB_SET_RX_CTRL(ep_idx, USBHS_EP_R_RES_NAK | USBHS_EP_R_TOG_0 | USBHS_EP_R_AUTOTOG); + } else { + g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_ch32_usbhs_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_ch32_usbhs_udc.in_ep[ep_idx].ep_enable = true; + if (g_ch32_usbhs_udc.in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + USBHS_DEVICE->ENDP_TYPE |= (1 << (ep_idx)); + USB_SET_TX_CTRL(ep_idx, USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0); + } else { + USBHS_DEVICE->ENDP_TYPE &= ~(1 << (ep_idx)); + USB_SET_TX_CTRL(ep_idx, USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0 | USBHS_EP_T_AUTOTOG); + } + USBHS_DEVICE->ENDP_CONFIG |= (1 << (ep_idx)); + } + USB_SET_MAX_LEN(ep_idx, USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize)); + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + if (USB_EP_DIR_IS_OUT(ep)) { + USBHS_DEVICE->ENDP_CONFIG &= ~(1 << (ep_idx + 16)); + } else { + USBHS_DEVICE->ENDP_CONFIG &= ~(1 << (ep_idx)); + } + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + if (ep_idx == 0) { + USBHS_DEVICE->UEP0_RX_CTRL = USBHS_EP_R_RES_STALL; + } else { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBHS_EP_R_RES_MASK) | USBHS_EP_R_RES_STALL); + } + } else { + if (ep_idx == 0) { + USBHS_DEVICE->UEP0_TX_CTRL = USBHS_EP_T_RES_STALL; + } else { + USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBHS_EP_T_RES_MASK) | USBHS_EP_T_RES_STALL); + } + } + + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + USB_SET_RX_CTRL(ep_idx, USBHS_EP_R_RES_ACK | USBHS_EP_R_TOG_0); + } else { + USB_SET_TX_CTRL(ep_idx, USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0); + } + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + *stalled = USB_GET_RX_CTRL(ep_idx) & USBHS_EP_R_RES_STALL ? 1 : 0; + } else { + *stalled = USB_GET_TX_CTRL(ep_idx) & USBHS_EP_T_RES_STALL ? 1 : 0; + } + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint32_t tmp; + + if (!data && data_len) { + return -1; + } + if (!g_ch32_usbhs_udc.in_ep[ep_idx].ep_enable) { + return -2; + } + if ((uint32_t)data & 0x03) { + return -3; + } + + g_ch32_usbhs_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len = data_len; + g_ch32_usbhs_udc.in_ep[ep_idx].actual_xfer_len = 0; + + if (ep_idx == 0) { + if (data_len == 0) { + USB_SET_TX_LEN(ep_idx, 0); + } else { + data_len = MIN(data_len, g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps); + USB_SET_TX_LEN(ep_idx, data_len); + USBHS_DEVICE->UEP0_DMA = (uint32_t)data; + } + tmp = ep0_tx_data_toggle ? USBHS_EP_T_TOG_1 : USBHS_EP_T_TOG_0; + USBHS_DEVICE->UEP0_TX_CTRL = USBHS_EP_T_RES_ACK | tmp; + } else { + if (data_len == 0) { + USB_SET_TX_LEN(ep_idx, 0); + } else { + data_len = MIN(data_len, g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps); + USB_SET_TX_LEN(ep_idx, data_len); + USB_SET_TX_DMA(ep_idx, (uint32_t)data); + } + tmp = USB_GET_TX_CTRL(ep_idx); + tmp &= ~(USBHS_EP_T_RES_MASK | USBHS_EP_T_TOG_MASK); + tmp |= USBHS_EP_T_RES_ACK; + if (g_ch32_usbhs_udc.in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + tmp |= USBHS_EP_T_TOG_0; + } else { + tmp |= (epx_tx_data_toggle[ep_idx - 1] ? USBHS_EP_T_TOG_1 : USBHS_EP_T_TOG_0); + } + USB_SET_TX_CTRL(ep_idx, tmp); + } + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_ch32_usbhs_udc.out_ep[ep_idx].ep_enable) { + return -2; + } + if ((uint32_t)data & 0x03) { + return -3; + } + + g_ch32_usbhs_udc.out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_ch32_usbhs_udc.out_ep[ep_idx].xfer_len = data_len; + g_ch32_usbhs_udc.out_ep[ep_idx].actual_xfer_len = 0; + + if (ep_idx == 0) { + if (data_len == 0) { + USBHS_DEVICE->UEP0_RX_CTRL = USBHS_EP_R_RES_ACK | USBHS_EP_R_TOG_1; + } else { + USBHS_DEVICE->UEP0_DMA = (uint32_t)data; + USBHS_DEVICE->UEP0_RX_CTRL = USBHS_EP_R_RES_ACK | (ep0_rx_data_toggle ? USBHS_EP_R_TOG_1 : USBHS_EP_R_TOG_0); + } + return 0; + } else { + USB_SET_RX_DMA(ep_idx, (uint32_t)data); + if (g_ch32_usbhs_udc.out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~(USBHS_EP_R_RES_MASK | USBHS_EP_R_TOG_MASK)) | USBHS_EP_R_RES_ACK | USBHS_EP_R_TOG_0); + } else { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBHS_EP_R_RES_MASK) | USBHS_EP_R_RES_ACK); + } + } + + return 0; +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint32_t ep_idx, token, write_count, read_count; + uint8_t intflag = 0; + + intflag = USBHS_DEVICE->INT_FG; + + if (intflag & USBHS_TRANSFER_FLAG) { + ep_idx = (USBHS_DEVICE->INT_ST) & MASK_UIS_ENDP; + token = (((USBHS_DEVICE->INT_ST) & MASK_UIS_TOKEN) >> 4) & 0x03; + + USBHS_DEVICE->INT_FG = USBHS_TRANSFER_FLAG; + + if (token == PID_IN) { + USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~(USBHS_EP_T_RES_MASK | USBHS_EP_T_TOG_MASK)) | USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0); + if (ep_idx == 0x00) { + if (g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len >= g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps) { + g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len -= g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps; + g_ch32_usbhs_udc.in_ep[ep_idx].actual_xfer_len += g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps; + ep0_tx_data_toggle ^= 1; + } else { + g_ch32_usbhs_udc.in_ep[ep_idx].actual_xfer_len += g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len; + g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len = 0; + ep0_tx_data_toggle = true; + } + + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_ch32_usbhs_udc.in_ep[ep_idx].actual_xfer_len); + + if (g_ch32_usbhs_udc.dev_addr > 0) { + USBHS_DEVICE->DEV_AD = g_ch32_usbhs_udc.dev_addr & 0xff; + g_ch32_usbhs_udc.dev_addr = 0; + } + + if (g_ch32_usbhs_udc.setup.wLength && ((g_ch32_usbhs_udc.setup.bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_OUT)) { + /* In status, start reading setup */ + USBHS_DEVICE->UEP0_DMA = (uint32_t)&g_ch32_usbhs_udc.setup; + USBHS_DEVICE->UEP0_RX_CTRL = USBHS_EP_R_RES_ACK; + ep0_tx_data_toggle = true; + + } else if (g_ch32_usbhs_udc.setup.wLength == 0) { + /* In status, start reading setup */ + USBHS_DEVICE->UEP0_DMA = (uint32_t)&g_ch32_usbhs_udc.setup; + USBHS_DEVICE->UEP0_RX_CTRL = USBHS_EP_R_RES_ACK; + ep0_tx_data_toggle = true; + } + } else { + if (g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len > g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps) { + g_ch32_usbhs_udc.in_ep[ep_idx].xfer_buf += g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps; + g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len -= g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps; + g_ch32_usbhs_udc.in_ep[ep_idx].actual_xfer_len += g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps; + epx_tx_data_toggle[ep_idx - 1] ^= 1; + + write_count = MIN(g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len, g_ch32_usbhs_udc.in_ep[ep_idx].ep_mps); + USB_SET_TX_LEN(ep_idx, write_count); + USB_SET_TX_DMA(ep_idx, (uint32_t)g_ch32_usbhs_udc.in_ep[ep_idx].xfer_buf); + + uint32_t tmp = USB_GET_TX_CTRL(ep_idx); + tmp &= ~(USBHS_EP_T_RES_MASK | USBHS_EP_T_TOG_MASK); + tmp |= USBHS_EP_T_RES_ACK; + + if (g_ch32_usbhs_udc.in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + tmp |= USBHS_EP_T_TOG_0; + } else { + tmp |= (epx_tx_data_toggle[ep_idx - 1] ? USBHS_EP_T_TOG_1 : USBHS_EP_T_TOG_0); + } + + USB_SET_TX_CTRL(ep_idx, tmp); + } else { + g_ch32_usbhs_udc.in_ep[ep_idx].actual_xfer_len += g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len; + g_ch32_usbhs_udc.in_ep[ep_idx].xfer_len = 0; + epx_tx_data_toggle[ep_idx - 1] ^= 1; + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_ch32_usbhs_udc.in_ep[ep_idx].actual_xfer_len); + } + } + } else if (token == PID_OUT) { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBHS_EP_R_RES_MASK) | USBHS_EP_R_RES_NAK); + if (ep_idx == 0x00) { + read_count = USBHS_DEVICE->RX_LEN; + + g_ch32_usbhs_udc.out_ep[ep_idx].actual_xfer_len += read_count; + g_ch32_usbhs_udc.out_ep[ep_idx].xfer_len -= read_count; + + usbd_event_ep_out_complete_handler(0, 0x00, g_ch32_usbhs_udc.out_ep[ep_idx].actual_xfer_len); + + if (read_count == 0) { + /* Out status, start reading setup */ + USBHS_DEVICE->UEP0_DMA = (uint32_t)&g_ch32_usbhs_udc.setup; + USBHS_DEVICE->UEP0_RX_CTRL = USBHS_EP_R_RES_ACK; + ep0_rx_data_toggle = true; + ep0_tx_data_toggle = true; + } else { + ep0_rx_data_toggle ^= 1; + } + } else { + if (USBHS_DEVICE->INT_ST & USBHS_DEV_UIS_TOG_OK) { + read_count = USBHS_DEVICE->RX_LEN; + + g_ch32_usbhs_udc.out_ep[ep_idx].xfer_buf += read_count; + g_ch32_usbhs_udc.out_ep[ep_idx].actual_xfer_len += read_count; + g_ch32_usbhs_udc.out_ep[ep_idx].xfer_len -= read_count; + + if ((read_count < g_ch32_usbhs_udc.out_ep[ep_idx].ep_mps) || (g_ch32_usbhs_udc.out_ep[ep_idx].xfer_len == 0)) { + usbd_event_ep_out_complete_handler(0, ep_idx, g_ch32_usbhs_udc.out_ep[ep_idx].actual_xfer_len); + } else { + USB_SET_RX_DMA(ep_idx, (uint32_t)g_ch32_usbhs_udc.out_ep[ep_idx].xfer_buf); + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBHS_EP_R_RES_MASK) | USBHS_EP_R_RES_ACK); + } + } + } + } + } + + if (intflag & USBHS_SETUP_FLAG) { + USBHS_DEVICE->INT_FG = USBHS_SETUP_FLAG; + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_ch32_usbhs_udc.setup); + } + + if (intflag & USBHS_DETECT_FLAG) { + USBHS_DEVICE->INT_FG = USBHS_DETECT_FLAG; + + USBHS_DEVICE->ENDP_CONFIG = USBHS_EP0_T_EN | USBHS_EP0_R_EN; + + USBHS_DEVICE->UEP0_TX_LEN = 0; + USBHS_DEVICE->UEP0_TX_CTRL = USBHS_EP_T_RES_NAK; + + ep0_tx_data_toggle = true; + ep0_rx_data_toggle = true; + + for (uint8_t ep_idx = 1; ep_idx < USB_NUM_BIDIR_ENDPOINTS; ep_idx++) { + USB_SET_TX_LEN(ep_idx, 0); + USB_SET_TX_CTRL(ep_idx, USBHS_EP_T_AUTOTOG | USBHS_EP_T_RES_NAK); // autotog does not work + USB_SET_RX_CTRL(ep_idx, USBHS_EP_R_AUTOTOG | USBHS_EP_R_RES_NAK); + epx_tx_data_toggle[ep_idx - 1] = false; + } + + memset(&g_ch32_usbhs_udc, 0, sizeof(struct ch32_usbhs_udc)); + usbd_event_reset_handler(0); + USBHS_DEVICE->UEP0_DMA = (uint32_t)&g_ch32_usbhs_udc.setup; + USBHS_DEVICE->UEP0_RX_CTRL = USBHS_EP_R_RES_ACK; + } +} + +void USBHS_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +void USBHS_IRQHandler(void) +{ + extern void USBD_IRQHandler(uint8_t busid); + USBD_IRQHandler(0); +} diff --git a/src/lib/CherryUSB/port/ch32/ch58x/usb_ch585_usbhs_dc.c b/src/lib/CherryUSB/port/ch32/ch58x/usb_ch585_usbhs_dc.c new file mode 100644 index 000000000..2e6724c2e --- /dev/null +++ b/src/lib/CherryUSB/port/ch32/ch58x/usb_ch585_usbhs_dc.c @@ -0,0 +1,526 @@ +#include "usbd_core.h" +#include "usb_ch585_usbhs_reg.h" + +/** + * @brief Related register macro + */ +#define USB_BASE 0x40009000u +#define CH585_USBHS_DEV ((USBHSD_TypeDef *)USB_BASE) + +#define R16_PIN_CONFIG (*((PUINT16V)0x4000101A)) +#define R32_PIN_CONFIG (*((PUINT32V)0x40001018)) // RW, I/O pin configuration +#define RB_PIN_USB2_EN 0x20 + +#define USB_SET_RX_DMA(ep_idx, addr) (*(volatile uint32_t *)((uint32_t)(&CH585_USBHS_DEV->UEP1_RX_DMA) + 4 * (ep_idx - 1)) = addr) +#define USB_SET_TX_DMA(ep_idx, addr) (*(volatile uint32_t *)((uint32_t)(&CH585_USBHS_DEV->UEP1_TX_DMA) + 4 * (ep_idx - 1)) = addr) + +#define USB_SET_MAX_LEN(ep_idx, len) (*(volatile uint16_t *)((uint32_t)(&CH585_USBHS_DEV->UEP0_MAX_LEN) + 4 * ep_idx) = len) +#define USB_SET_TX_LEN(ep_idx, len) (*(volatile uint16_t *)((uint32_t)(&CH585_USBHS_DEV->UEP0_TX_LEN) + 4 * ep_idx) = len) +#define USB_GET_TX_LEN(ep_idx) (*(volatile uint16_t *)((uint32_t)(&CH585_USBHS_DEV->UEP0_TX_LEN) + 4 * ep_idx)) +#define USB_SET_TX_CTRL(ep_idx, val) (*(volatile uint8_t *)((uint32_t)(&CH585_USBHS_DEV->UEP0_TX_CTRL) + 4 * ep_idx) = val) +#define USB_GET_TX_CTRL(ep_idx) (*(volatile uint8_t *)((uint32_t)(&CH585_USBHS_DEV->UEP0_TX_CTRL) + 4 * ep_idx)) +#define USB_SET_RX_CTRL(ep_idx, val) (*(volatile uint8_t *)((uint32_t)(&CH585_USBHS_DEV->UEP0_RX_CTRL) + 4 * ep_idx) = val) +#define USB_GET_RX_CTRL(ep_idx) (*(volatile uint8_t *)((uint32_t)(&CH585_USBHS_DEV->UEP0_RX_CTRL) + 4 * ep_idx)) +#define EPn_SET_TX_NAK(ep_idx) USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_NAK) +#define EPn_SET_TX_VALID(ep_idx) USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_ACK) +#define EPn_SET_RX_NAK(ep_idx) USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_NAK) +#define EPn_SET_RX_VALID(ep_idx) USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_ACK) +#define EPn_GET_RX_LEN(ep_idx) (*(volatile uint16_t *)((uint32_t)(&CH585_USBHS_DEV->USB_EP0_RX_LEN) + 4 * ep_idx)) +#define EPn_SET_TX_LEN(ep_idx, len) (*(volatile uint16_t *)((uint32_t)(&CH585_USBHS_DEV->UEP0_TX_LEN) + 4 * ep_idx) = len) +#define EPn_CLEAR_TX_DONE(ep_idx) USB_SET_TX_CTRL(ep_idx, USB_GET_TX_CTRL(ep_idx) & ~USBHS_UEP_T_DONE) +#define EPn_CLEAR_RX_DONE(ep_idx) USB_SET_RX_CTRL(ep_idx, USB_GET_RX_CTRL(ep_idx) & ~USBHS_UEP_R_DONE) +#define EPn_SET_TX_ISO_VALID(ep_idx) +#define EPn_SET_RX_ISO_VALID(ep_idx) + +/* ep nums */ +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 8 +#endif + +/** + * @brief Endpoint information structure + */ +typedef struct _usbd_ep_info { + uint8_t mps; /* Maximum packet length of endpoint */ + uint8_t eptype; /* Endpoint Type */ + uint8_t ep_enable; /* Endpoint enable */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +} usbd_ep_info; + +/* ch58x usb */ +static struct _ch58x_core_prvi { + uint8_t address; /* Address */ + usbd_ep_info ep_in[CONFIG_USBDEV_EP_NUM]; + usbd_ep_info ep_out[CONFIG_USBDEV_EP_NUM]; + struct usb_setup_packet setup; +} usb_dc_cfg; + +__WEAK void usb_dc_low_level_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + +/** + * @brief USB initialization + * @pre None + * @param[in] None + * @retval >=0 success otherwise failure + */ +int usb_dc_init(uint8_t busid) +{ + R8_USBHS_PLL_CTRL = USBHS_PLL_EN; + R16_PIN_CONFIG |= RB_PIN_USB2_EN; + CH585_USBHS_DEV->CONTROL = USBHS_UD_RST_LINK | USBHS_UD_PHY_SUSPENDM; + CH585_USBHS_DEV->INT_EN = USBHS_UDIE_BUS_RST | USBHS_UDIE_SUSPEND | USBHS_UDIE_BUS_SLEEP | USBHS_UDIE_LPM_ACT | USBHS_UDIE_TRANSFER | USBHS_UDIE_LINK_RDY; + /* Enable all end points */ + CH585_USBHS_DEV->UEP_TX_EN = 0xffff; + CH585_USBHS_DEV->UEP_RX_EN = 0xffff; + + CH585_USBHS_DEV->BASE_MODE = USBHS_UD_SPEED_HIGH; + CH585_USBHS_DEV->CONTROL = USBHS_UD_DEV_EN | USBHS_UD_DMA_EN | USBHS_UD_LPM_EN | USBHS_UD_PHY_SUSPENDM; + + CH585_USBHS_DEV->UEP_T_TOG_AUTO = 0xfe; + CH585_USBHS_DEV->UEP_R_TOG_AUTO = 0xfe; + usb_dc_low_level_init(); + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + R8_USBHS_PLL_CTRL &= ~USBHS_PLL_EN; + R32_PIN_CONFIG &= ~RB_PIN_USB2_EN; + + CH585_USBHS_DEV->CONTROL |= USBHS_UD_RST_SIE; + CH585_USBHS_DEV->CONTROL &= ~USBHS_UD_RST_SIE; + usb_dc_low_level_deinit(); + return 0; +} + +/** + * @brief Set address + * @pre None + * @param[in] address :8-bit valid address + * @retval >=0 success otherwise failure + */ +int usbd_set_address(uint8_t busid, const uint8_t address) +{ + if (address == 0) { + CH585_USBHS_DEV->DEV_AD = (CH585_USBHS_DEV->DEV_AD & 0x80) | address; + } + usb_dc_cfg.address = address; + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + return -1; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + return USB_SPEED_HIGH; +} + +/** + * @brief Open endpoint + * @pre None + * @param[in] ep_cfg : Endpoint configuration structure pointer + * @retval >=0 success otherwise failure + */ +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t epid = USB_EP_GET_IDX(ep->bEndpointAddress); + if (epid > (CONFIG_USBDEV_EP_NUM - 1)) { + /** + * If you use ch58x, you can change the CONFIG_USBDEV_EP_NUM set to 8 + */ + USB_LOG_ERR("Ep addr %02x overflow\r\n", ep->bEndpointAddress); + return -1; + } + + uint8_t mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + USB_SET_MAX_LEN(epid, mps); + + if (USB_EP_DIR_IS_IN(ep->bEndpointAddress)) { + usb_dc_cfg.ep_in[epid].ep_enable = true; + usb_dc_cfg.ep_in[epid].mps = mps; + usb_dc_cfg.ep_in[epid].eptype = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + USB_SET_TX_CTRL(epid, USBHS_UEP_T_RES_NAK); + EPn_CLEAR_TX_DONE(epid); + } else if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + usb_dc_cfg.ep_out[epid].ep_enable = true; + usb_dc_cfg.ep_out[epid].mps = mps; + usb_dc_cfg.ep_out[epid].eptype = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + USB_SET_RX_CTRL(epid, USBHS_UEP_R_RES_NAK); + } + + return 0; +} + +/** + * @brief Close endpoint + * @pre None + * @param[in] ep : Endpoint address + * @retval >=0 success otherwise failure + */ +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + uint8_t epid = USB_EP_GET_IDX(ep); + if (USB_EP_DIR_IS_IN(ep)) { + usb_dc_cfg.ep_in[epid].ep_enable = false; + } else if (USB_EP_DIR_IS_OUT(ep)) { + usb_dc_cfg.ep_out[epid].ep_enable = false; + } + return 0; +} + +/** + * @brief Endpoint setting stall + * @pre None + * @param[in] ep : Endpoint address + * @retval >=0 success otherwise failure + */ +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + if (USB_EP_DIR_IS_OUT(ep)) { + if (ep_idx == 0) { + CH585_USBHS_DEV->UEP0_RX_CTRL = USBHS_UEP_R_RES_STALL; + } else { + USB_SET_RX_CTRL(ep_idx, (USB_GET_RX_CTRL(ep_idx) & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_STALL); + } + } else { + if (ep_idx == 0) { + CH585_USBHS_DEV->UEP0_TX_CTRL = USBHS_UEP_T_RES_STALL; + } else { + USB_SET_TX_CTRL(ep_idx, (USB_GET_TX_CTRL(ep_idx) & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_STALL); + } + } + return 0; +} + +/** + * @brief Endpoint clear stall + * @pre None + * @param[in] ep : Endpoint address + * @retval >=0 success otherwise failure + */ +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + USB_SET_RX_CTRL(ep_idx, USBHS_UEP_R_RES_ACK | USBHS_UEP_R_TOG_DATA0); + } else { + USB_SET_TX_CTRL(ep_idx, USBHS_UEP_T_RES_NAK | USBHS_UEP_T_TOG_DATA0); + } + return 0; +} + +/** + * @brief Check endpoint status + * @pre None + * @param[in] ep : Endpoint address + * @param[out] stalled : Outgoing endpoint status + * @retval >=0 success otherwise failure + */ +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + if (USB_EP_DIR_IS_OUT(ep)) { + } else { + } + return 0; +} + +/** + * @brief Setup in ep transfer setting and start transfer. + * + * This function is asynchronous. + * This function is similar to uart with tx dma. + * + * This function is called to write data to the specified endpoint. The + * supplied usbd_endpoint_callback function will be called when data is transmitted + * out. + * + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] data Pointer to data to write + * @param[in] data_len Length of the data requested to write. This may + * be zero for a zero length status packet. + * @return 0 on success, negative errno code on fail. + */ +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!usb_dc_cfg.ep_in[ep_idx].ep_enable) { + return -2; + } + if ((uint32_t)data & 0x03) { + return -3; + } + + usb_dc_cfg.ep_in[ep_idx].xfer_buf = (uint8_t *)data; + usb_dc_cfg.ep_in[ep_idx].xfer_len = data_len; + usb_dc_cfg.ep_in[ep_idx].actual_xfer_len = 0; + + if (ep_idx == 0) { + if (data_len == 0) { + USB_SET_TX_LEN(ep_idx, 0); + } else { + data_len = MIN(data_len, usb_dc_cfg.ep_in[ep_idx].mps); + USB_SET_TX_LEN(ep_idx, data_len); + CH585_USBHS_DEV->UEP0_DMA = (uint32_t)data; + } + } else { + if (data_len == 0) { + USB_SET_TX_LEN(ep_idx, 0); + } else { + data_len = MIN(data_len, usb_dc_cfg.ep_in[ep_idx].mps); + USB_SET_TX_LEN(ep_idx, data_len); + USB_SET_TX_DMA(ep_idx, (uint32_t)data); + } + } + + EPn_SET_TX_VALID(ep_idx); + return 0; +} + +/** + * @brief Setup out ep transfer setting and start transfer. + * + * This function is asynchronous. + * This function is similar to uart with rx dma. + * + * This function is called to read data to the specified endpoint. The + * supplied usbd_endpoint_callback function will be called when data is received + * in. + * + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] data Pointer to data to read + * @param[in] data_len Max length of the data requested to read. + * + * @return 0 on success, negative errno code on fail. + */ +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!usb_dc_cfg.ep_out[ep_idx].ep_enable) { + return -2; + } + if ((uint32_t)data & 0x03) { + return -3; + } + + usb_dc_cfg.ep_out[ep_idx].xfer_buf = (uint8_t *)data; + usb_dc_cfg.ep_out[ep_idx].xfer_len = data_len; + usb_dc_cfg.ep_out[ep_idx].actual_xfer_len = 0; + + if (ep_idx == 0) { + if (data_len == 0) { + } else { + CH585_USBHS_DEV->UEP0_DMA = (uint32_t)data; + } + } else { + USB_SET_RX_DMA(ep_idx, (uint32_t)data); + } + + EPn_SET_RX_VALID(ep_idx); + return 0; +} + +static inline void handle_ep0_in(void) +{ + switch (usb_dc_cfg.setup.bmRequestType >> USB_REQUEST_DIR_SHIFT) { + case 1: + CH585_USBHS_DEV->UEP0_TX_CTRL ^= USBHS_UEP_T_TOG_DATA1; + EPn_SET_TX_NAK(0); + if (usb_dc_cfg.ep_in[0].xfer_len > usb_dc_cfg.ep_in[0].mps) { + usb_dc_cfg.ep_in[0].xfer_len -= usb_dc_cfg.ep_in[0].mps; + usb_dc_cfg.ep_in[0].actual_xfer_len += usb_dc_cfg.ep_in[0].mps; + usbd_event_ep_in_complete_handler(0, 0 | 0x80, usb_dc_cfg.ep_in[0].actual_xfer_len); + } else { + usb_dc_cfg.ep_in[0].actual_xfer_len += usb_dc_cfg.ep_in[0].xfer_len; + usb_dc_cfg.ep_in[0].xfer_len = 0; + usbd_event_ep_in_complete_handler(0, 0 | 0x80, usb_dc_cfg.ep_in[0].actual_xfer_len); + } + break; + case 0: + /* Set */ + switch (usb_dc_cfg.setup.bRequest) { + case USB_REQUEST_SET_ADDRESS: + /* Fill in the equipment address */ + CH585_USBHS_DEV->DEV_AD = usb_dc_cfg.address; + CH585_USBHS_DEV->UEP0_DMA = (uint32_t)&usb_dc_cfg.setup; + EPn_SET_TX_NAK(0); + EPn_SET_RX_VALID(0); + break; + default: + /* Normal out state phase */ + CH585_USBHS_DEV->UEP0_DMA = (uint32_t)&usb_dc_cfg.setup; + EPn_SET_TX_NAK(0); + EPn_SET_RX_VALID(0); + break; + } + break; + } +} + +static inline void handle_non_ep0_in(uint8_t epid) +{ + EPn_SET_TX_NAK(epid); + if (usb_dc_cfg.ep_in[epid].xfer_len > usb_dc_cfg.ep_in[epid].mps) { + /* Need start in again */ + usb_dc_cfg.ep_in[epid].xfer_buf += usb_dc_cfg.ep_in[epid].mps; + usb_dc_cfg.ep_in[epid].xfer_len -= usb_dc_cfg.ep_in[epid].mps; + usb_dc_cfg.ep_in[epid].actual_xfer_len += usb_dc_cfg.ep_in[epid].mps; + + uint32_t write_count = MIN(usb_dc_cfg.ep_in[epid].xfer_len, usb_dc_cfg.ep_in[epid].mps); + USB_SET_TX_LEN(epid, write_count); + USB_SET_TX_DMA(epid, (uint32_t)usb_dc_cfg.ep_in[epid].xfer_buf); + + if (usb_dc_cfg.ep_in[epid].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + EPn_SET_TX_VALID(epid); + } else { + EPn_SET_TX_ISO_VALID(epid); + } + } else { + usb_dc_cfg.ep_in[epid].actual_xfer_len += usb_dc_cfg.ep_in[epid].xfer_len; + usb_dc_cfg.ep_in[epid].xfer_len = 0; + usbd_event_ep_in_complete_handler(0, epid | 0x80, usb_dc_cfg.ep_in[epid].actual_xfer_len); + } +} + +static inline void usb_process_ep_in(uint8_t epid) +{ + if (epid == 0) { + handle_ep0_in(); + } else { + handle_non_ep0_in(epid); + } + + EPn_CLEAR_TX_DONE(epid); +} + +static inline void usb_process_ep_out(uint8_t epid) +{ + EPn_SET_RX_NAK(epid); + if (epid == 0) { + if (CH585_USBHS_DEV->UEP0_RX_CTRL & USBHS_UEP_R_SETUP_IS) { + CH585_USBHS_DEV->UEP0_RX_CTRL |= USBHS_UEP_R_TOG_DATA1; + CH585_USBHS_DEV->UEP0_TX_CTRL |= USBHS_UEP_T_TOG_DATA1; + if (usb_dc_cfg.setup.bmRequestType >> USB_REQUEST_DIR_SHIFT == 0) { + /** + * Ep0 The next in must be the status stage. + * The device must reply to the host data 0 length packet. + * Here, set the transmission length to 0 and the transmission status to ACK, + * and wait for the host to send the in token to retrieve + */ + EPn_SET_TX_LEN(0, 0); + EPn_SET_TX_VALID(0); + } + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&usb_dc_cfg.setup); + } else { + CH585_USBHS_DEV->UEP0_RX_CTRL ^= USBHS_UEP_R_TOG_DATA1; + uint32_t read_count = EPn_GET_RX_LEN(0); + usb_dc_cfg.ep_out[0].actual_xfer_len += read_count; + usb_dc_cfg.ep_out[0].xfer_len -= read_count; + usbd_event_ep_out_complete_handler(0, 0x00, usb_dc_cfg.ep_out[0].actual_xfer_len); + if (read_count == 0) { + /* Out status, start reading setup */ + CH585_USBHS_DEV->UEP0_DMA = (uint32_t)&usb_dc_cfg.setup; + EPn_SET_RX_VALID(0); + } + } + } else { + if (USB_GET_RX_CTRL(epid) & USBHS_UEP_R_TOG_MATCH) { + uint32_t read_count = EPn_GET_RX_LEN(epid); + usb_dc_cfg.ep_out[epid].xfer_buf += read_count; + usb_dc_cfg.ep_out[epid].actual_xfer_len += read_count; + usb_dc_cfg.ep_out[epid].xfer_len -= read_count; + + if ((read_count < usb_dc_cfg.ep_out[epid].mps) || (usb_dc_cfg.ep_out[epid].xfer_len == 0)) { + usbd_event_ep_out_complete_handler(0, ((epid) & 0x7f), usb_dc_cfg.ep_out[epid].actual_xfer_len); + } else { + USB_SET_RX_DMA(epid, (uint32_t)usb_dc_cfg.ep_out[epid].xfer_buf); + if (usb_dc_cfg.ep_out[epid].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + EPn_SET_RX_VALID(epid); + } else { + EPn_SET_RX_ISO_VALID(epid); + } + } + } + } + + EPn_CLEAR_RX_DONE(epid); +} + +static inline void usb_trans_end_process(void) +{ + uint8_t epid = (CH585_USBHS_DEV->INT_ST & USBHS_UDIS_EP_ID_MASK); + switch (CH585_USBHS_DEV->INT_ST & USBHS_UDIS_EP_DIR) { + case USBHS_UDIS_EP_DIR: /* in */ + usb_process_ep_in(epid); + break; + case 0: /* setup or out */ + usb_process_ep_out(epid); + break; + default: + break; + } +} + +/** + * @brief USB interrupt processing function + * @pre None + * @param[in] None + * @retval None + */ +void USBD_IRQHandler(uint8_t busid) +{ + volatile uint8_t intflag = 0; + intflag = CH585_USBHS_DEV->INT_FG; + + if (intflag & USBHS_UDIF_TRANSFER) { + usb_trans_end_process(); + } else if (intflag & USBHS_UDIF_BUS_RST) { + /* Reset */ + CH585_USBHS_DEV->DEV_AD = 0; + usbd_event_reset_handler(0); + /* Set ep0 rx vaild to start receive setup packet */ + CH585_USBHS_DEV->UEP0_DMA = (uint32_t)&usb_dc_cfg.setup; + // EPn_SET_RX_VALID(0); + R8_U2EP0_TX_CTRL = USBHS_UEP_T_RES_NAK; + R8_U2EP0_RX_CTRL = USBHS_UEP_R_RES_ACK; + CH585_USBHS_DEV->INT_FG = USBHS_UDIF_BUS_RST; + } else if (intflag & USBHS_UDIF_SUSPEND) { + if (CH585_USBHS_DEV->MIS_ST & USBHS_UDMS_SUSPEND) { + /* Suspend */ + } else { + /* Wake up */ + } + CH585_USBHS_DEV->INT_FG = USBHS_UDIF_SUSPEND; + } else { + CH585_USBHS_DEV->INT_FG = intflag; + } +} + +void USB2_DEVICE_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))); +void USB2_DEVICE_IRQHandler(void) +{ + extern void USBD_IRQHandler(uint8_t busid); + USBD_IRQHandler(0); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ch32/ch58x/usb_ch585_usbhs_reg.h b/src/lib/CherryUSB/port/ch32/ch58x/usb_ch585_usbhs_reg.h new file mode 100644 index 000000000..cfec7f758 --- /dev/null +++ b/src/lib/CherryUSB/port/ch32/ch58x/usb_ch585_usbhs_reg.h @@ -0,0 +1,455 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +/**********************************/ +/*********USB high speed**********/ +/**********************************/ +typedef volatile unsigned short *PUINT16V; +typedef volatile unsigned long *PUINT32V; +typedef volatile unsigned char *PUINT8V; + +/* USB high speed device register */ +#define R8_USB2_CTRL (*((PUINT8V)0x40009000)) // RW, USB_high_speed control register +#define USBHS_UD_LPM_EN 0x80 // RW, enable LPM +#define USBHS_UD_DEV_EN 0x20 // RW, enable USB equipment +#define USBHS_UD_DMA_EN 0x10 // RW, enable DMA transmit +#define USBHS_UD_PHY_SUSPENDM 0x08 // RW, suspeng USB PHY +#define USBHS_UD_CLR_ALL 0x04 // RW, clear all interupt flag +#define USBHS_UD_RST_SIE 0x02 // RW, reset USB protocol processor,including end point register +#define USBHS_UD_RST_LINK 0x01 // RW, enable LNK layer reset +#define R8_USB2_BASE_MODE (*((PUINT8V)0x40009001)) // RW, USB_high_speed mode control register +#define USBHS_UD_SPEED_FULL 0x00 +#define USBHS_UD_SPEED_HIGH 0x01 +#define USBHS_UD_SPEED_LOW 0x02 +#define USBHS_UD_SPEED_TYPE 0x03 // RW, speed mode excpeted by the equipment,00:full speed, 01:high speed, 10:low speed +#define R8_USB2_INT_EN (*((PUINT8V)0x40009002)) // RW, USB_high_speed intreurpt enable register +#define USBHS_UDIE_FIFO_OVER 0x80 // RW, enable fifo overflow interupt +#define USBHS_UDIE_LINK_RDY 0x40 // RW, enable USB conect interupt +#define USBHS_UDIE_SOF_ACT 0x20 // RW, enable SOF package received interupt +#define USBHS_UDIE_TRANSFER 0x10 // RW, enable USB transmit end interupt +#define USBHS_UDIE_LPM_ACT 0x08 // RW, enable lpm transmit end interupt +#define USBHS_UDIE_BUS_SLEEP 0x04 // RW, enable usb bus sleep interupt +#define USBHS_UDIE_SUSPEND 0x02 // RW, enable usb bus suspend interupt +#define USBHS_UDIE_BUS_RST 0x01 // RW, enable usb bus reset interupt +#define R8_USB2_DEV_AD (*((PUINT8V)0x40009003)) // RW, USB_high_speed device adress register +#define USBHS_UD_DEV_ADDR 0x7F // RW, adress of usb equipment +#define R8_USB2_WAKE_CTRL (*((PUINT8V)0x40009004)) // RW, USB_high_speed wake up remotely register +#define USBHS_UD_UD_REMOTE_WKUP 0x01 // RW1, wake up remotely and auto reset hardware +#define R8_USB2_TEST_MODE (*((PUINT8V)0x40009005)) // RW, USB_high_speed test mode register +#define USBHS_UD_TEST_EN 0x80 // RW, enable test mode +#define USBHS_UD_TEST_SE0NAK 0x08 // RW, output SE0 when in test mode +#define USBHS_UD_TEST_PKT 0x04 // RW, output one package(including DATA0,data and length of end pont4) when in test mode,not work on virtual equipment +#define USBHS_UD_TEST_K 0x02 // RW, output K when in test mode +#define USBHS_UD_TEST_J 0x01 // RW, output J when in test mode +#define R16_USB2_LPM_DATA (*((PUINT16V)0x40009006)) // RW, USB_high_speed power control register +#define USBHS_UD_LPM_BUSY 0x8000 // RW, power control busy +#define USBHS_UD_LPM_DATA 0x07FF // RO, power control data +#define R8_USB2_INT_FG (*((PUINT8V)0x40009008)) // RW, USB_high_speed interupt flag register +#define USBHS_UDIF_FIFO_OV 0x80 // RW1, clear fifo overflow interupt flag +#define USBHS_UDIF_LINK_RDY 0x40 // RW1, clear USB conect interupt flag +#define USBHS_UDIF_RX_SOF 0x20 // RW1, clear SOF package received interupt flag +#define USBHS_UDIF_TRANSFER 0x10 // RO, USB transmit end interupt flag,cleared by USBHS_UDMS_HS_MOD +#define USBHS_UDIF_LPM_ACT 0x08 // RW1, clear lpm transmit end interupt flag +#define USBHS_UDIF_BUS_SLEEP 0x04 // RW1, clear usb bus sleep interupt flag +#define USBHS_UDIF_SUSPEND 0x02 // RW1, clear usb bus suspend interupt flag +#define USBHS_UDIF_BUS_RST 0x01 // RW1, clear usb bus reset interupt flag +#define R8_USB2_INT_ST (*((PUINT8V)0x40009009)) // RW, USB_high_speed interupt status register +#define USBHS_UDIS_EP_DIR 0x10 // RO, end point tranfer diector of data +#define USBHS_UDIS_EP_ID_MASK 0x07 // RO, number of end point which data transmission occured +#define R8_USB2_MIS_ST (*((PUINT8V)0x4000900A)) // RW, USB_high_speed miscellaneous register +#define USBHS_UDMS_HS_MOD 0x80 // RO, host with high speed +#define USBHS_UDMS_SUSP_REQ 0x10 // RO, requirment of suspending USB +#define USBHS_UDMS_SIE_FREE 0x08 // RO, USB free state +#define USBHS_UDMS_SLEEP 0x04 // RO, USB sleep state +#define USBHS_UDMS_SUSPEND 0x02 // RO, USB in suspend state +#define USBHS_UDMS_READY 0x01 // RO, USB in connected state +#define R16_USB2_FRAME_NO (*((PUINT16V)0x4000900C)) // RW, USB_high_speed frame number register +#define USBHS_UD_MFRAME_NO 0xE000 +#define USBHS_UD_FRAME_NO 0x07FF +#define R16_USB2_BUS (*((PUINT16V)0x4000900E)) // RW, USB_high_speed bus status register +#define USBHS_USB_DM_ST 0x08 +#define USBHS_USB_DP_ST 0x04 +#define USB_WAKEUP 0x01 +#define R16_U2EP_TX_EN (*((PUINT16V)0x40009010)) // RW, USB_high_speed end point transmit enable register +/* Bit definition for R16_U2EP_TX_EN & R16_U2EP_RX_EN register */ +#define RB_EP0_EN 0x0001 +#define RB_EP1_EN 0x0002 +#define RB_EP2_EN 0x0004 +#define RB_EP3_EN 0x0008 +#define RB_EP4_EN 0x0010 +#define RB_EP5_EN 0x0020 +#define RB_EP6_EN 0x0040 +#define RB_EP7_EN 0x0080 +#define RB_EP8_EN 0x0100 +#define RB_EP9_EN 0x0200 +#define RB_EP10_EN 0x0400 +#define RB_EP11_EN 0x0800 +#define RB_EP12_EN 0x1000 +#define RB_EP13_EN 0x2000 +#define RB_EP14_EN 0x4000 +#define RB_EP15_EN 0x8000 + +#define R16_U2EP_RX_EN (*((PUINT16V)0x40009012)) // RW, USB_high_speed end point receive enableregister +#define USBHS_UEP_RX_EN 0xFFFF +#define R16_U2EP_T_TOG_AUTO (*((PUINT16V)0x40009014)) // RW, USB_high_speed end point transmit auto toggle enable register +#define USBHS_UEP_T_TOG_AUTO 0xFF +#define R16_U2EP_R_TOG_AUTO (*((PUINT16V)0x40009016)) // RW, USB_high_speed end point receive auto toggle enable register +#define USBHS_UEP_R_TOG_AUTO 0xFF +#define R8_U2EP_T_BURST (*((PUINT8V)0x40009018)) // RW, USB_high_speed end point transmit burst register +#define USBHS_UEP_T_BURST_EN 0xFF +#define R8_U2EP_T_BURST_MODE (*((PUINT8V)0x40009019)) // RW, USB_high_speed end point transmit burst mode register +#define USBHS_UEP_T_BURST_MODE 0xFF +#define R8_U2EP_R_BURST (*((PUINT8V)0x4000901A)) // RW, USB_high_speed end point receive burst register +#define USBHS_UEP_R_BURST_EN 0xFF +#define R8_U2EP_R_RES_MODE (*((PUINT8V)0x4000901B)) // RW, USB_high_speed end point transmit reply mode register +#define USBHS_UEP_R_RES_MODE 0xFF +#define R32_U2EP_AF_MODE (*((PUINT32V)0x4000901C)) // RW, USB_high_speed end point multiplexing register +#define USBHS_UEP_T_AF 0xFE +#define R32_U2EP0_DMA (*((PUINT32V)0x40009020)) // RW, USB_high_speed end point0 begin adress of DMA buffer register +#define UEPn_DMA 0x01FFFF +#define R32_U2EP1_RX_DMA (*((PUINT32V)0x40009024)) // RW, USB_high_speed end point1 begin adress of DMA receive buffer register +#define R32_U2EP2_RX_DMA (*((PUINT32V)0x40009028)) // RW, USB_high_speed end point2 begin adress of DMA receive buffer register +#define R32_U2EP3_RX_DMA (*((PUINT32V)0x4000902C)) // RW, USB_high_speed end point3 begin adress of DMA receive buffer register +#define R32_U2EP4_RX_DMA (*((PUINT32V)0x40009030)) // RW, USB_high_speed end point4 begin adress of DMA receive buffer register +#define R32_U2EP5_RX_DMA (*((PUINT32V)0x40009034)) // RW, USB_high_speed end point5 begin adress of DMA receive buffer register +#define R32_U2EP6_RX_DMA (*((PUINT32V)0x40009038)) // RW, USB_high_speed end point6 begin adress of DMA receive buffer register +#define R32_U2EP7_RX_DMA (*((PUINT32V)0x4000903C)) // RW, USB_high_speed end point7 begin adress of DMA receive buffer register +#define UEPn_RX_DMA 0x01FFFF +#define R32_U2EP1_TX_DMA (*((PUINT32V)0x40009040)) // RW, USB_high_speed end point1 begin adress of DMA transmit buffer register +#define R32_U2EP2_TX_DMA (*((PUINT32V)0x40009044)) // RW, USB_high_speed end point2 begin adress of DMA transmit buffer register +#define R32_U2EP3_TX_DMA (*((PUINT32V)0x40009048)) // RW, USB_high_speed end point3 begin adress of DMA transmit buffer register +#define R32_U2EP4_TX_DMA (*((PUINT32V)0x4000904C)) // RW, USB_high_speed end point4 begin adress of DMA transmit buffer register +#define R32_U2EP5_TX_DMA (*((PUINT32V)0x40009050)) // RW, USB_high_speed end point5 begin adress of DMA transmit buffer register +#define R32_U2EP6_TX_DMA (*((PUINT32V)0x40009054)) // RW, USB_high_speed end point6 begin adress of DMA transmit buffer register +#define R32_U2EP7_TX_DMA (*((PUINT32V)0x40009058)) // RW, USB_high_speed end point7 begin adress of DMA transmit buffer register +#define UEPn_TX_DMA 0x01FFFF +#define R32_U2EP0_MAX_LEN (*((PUINT32V)0x4000905C)) // RW, USB_high_speed end point0 max length package register +#define R32_U2EP1_MAX_LEN (*((PUINT32V)0x40009060)) // RW, USB_high_speed end point1 max length package register +#define R32_U2EP2_MAX_LEN (*((PUINT32V)0x40009064)) // RW, USB_high_speed end point2 max length package register +#define R32_U2EP3_MAX_LEN (*((PUINT32V)0x40009068)) // RW, USB_high_speed end point3 max length package register +#define R32_U2EP4_MAX_LEN (*((PUINT32V)0x4000906C)) // RW, USB_high_speed end point4 max length package register +#define R32_U2EP5_MAX_LEN (*((PUINT32V)0x40009070)) // RW, USB_high_speed end point5 max length package register +#define R32_U2EP6_MAX_LEN (*((PUINT32V)0x40009074)) // RW, USB_high_speed end point6 max length package register +#define R32_U2EP7_MAX_LEN (*((PUINT32V)0x40009078)) // RW, USB_high_speed end point7 max length package register +#define UEPn_MAX_LEN 0x007F +#define R16_U2EP0_RX_LEN (*((PUINT16V)0x4000907C)) // RW, USB_high_speed end point0 length of receive register +#define UEP0_RX_LEN 0x007F +#define R16_U2EP1_RX_LEN (*((PUINT16V)0x40009080)) // RW, USB_high_speed end point1 single received length register +#define R16_U2EP1_R_SIZE (*((PUINT16V)0x40009082)) // RW, USB_high_speed end point1 total received length register +#define R16_U2EP2_RX_LEN (*((PUINT16V)0x40009084)) // RW, USB_high_speed end point2 single received length register +#define R16_U2EP2_R_SIZE (*((PUINT16V)0x40009086)) // RW, USB_high_speed end point2 total received length register +#define R16_U2EP3_RX_LEN (*((PUINT16V)0x40009088)) // RW, USB_high_speed end point3 single received length register +#define R16_U2EP3_R_SIZE (*((PUINT16V)0x4000908A)) // RW, USB_high_speed end point3 total received length register +#define R16_U2EP4_RX_LEN (*((PUINT16V)0x4000908C)) // RW, USB_high_speed end point4 single received length register +#define R16_U2EP4_R_SIZE (*((PUINT16V)0x4000908E)) // RW, USB_high_speed end point4 total received length register +#define R16_U2EP5_RX_LEN (*((PUINT16V)0x40009090)) // RW, USB_high_speed end point5 single received length register +#define R16_U2EP5_R_SIZE (*((PUINT16V)0x40009092)) // RW, USB_high_speed end point5 total received length register +#define R16_U2EP6_RX_LEN (*((PUINT16V)0x40009094)) // RW, USB_high_speed end point6 single received length register +#define R16_U2EP6_R_SIZE (*((PUINT16V)0x40009096)) // RW, USB_high_speed end point6 total received length register +#define R16_U2EP7_RX_LEN (*((PUINT16V)0x40009098)) // RW, USB_high_speed end point7 single received length register +#define R16_U2EP7_R_SIZE (*((PUINT16V)0x4000909A)) // RW, USB_high_speed end point7 total received length register +#define UEPn_RX_LEN 0xFFFF +#define UEPn_R_SIZE 0xFFFF +#define R16_U2EP0_T_LEN (*((PUINT16V)0x4000909C)) // RW, USB_high_speed end point0 length of transmission register +#define UEP0_T_LEN 0x7F +#define R8_U2EP0_TX_CTRL (*((PUINT8V)0x4000909E)) // RW, USB_high_speed end point0 transmit control register +#define R8_U2EP0_RX_CTRL (*((PUINT8V)0x4000909F)) // RW, USB_high_speed end point0 receive control register +#define R16_U2EP1_T_LEN (*((PUINT16V)0x400090A0)) // RW, USB_high_speed end point1 length of transmission register +#define R8_U2EP1_TX_CTRL (*((PUINT8V)0x400090A2)) // RW, USB_high_speed end point1 transmit control register +#define R8_U2EP1_RX_CTRL (*((PUINT8V)0x400090A3)) // RW, USB_high_speed end point1 receive control register +#define R16_U2EP2_T_LEN (*((PUINT16V)0x400090A4)) // RW, USB_high_speed end point2 length of transmission register +#define R8_U2EP2_TX_CTRL (*((PUINT8V)0x400090A6)) // RW, USB_high_speed end point2 transmit control register +#define R8_U2EP2_RX_CTRL (*((PUINT8V)0x400090A7)) // RW, USB_high_speed end point2 receive control register +#define R16_U2EP3_T_LEN (*((PUINT16V)0x400090A8)) // RW, USB_high_speed end point3 length of transmission register +#define R8_U2EP3_TX_CTRL (*((PUINT8V)0x400090AA)) // RW, USB_high_speed end point3 transmit control register +#define R8_U2EP3_RX_CTRL (*((PUINT8V)0x400090AB)) // RW, USB_high_speed end point3 receive control register +#define R16_U2EP4_T_LEN (*((PUINT16V)0x400090AC)) // RW, USB_high_speed end point4 length of transmission register +#define R8_U2EP4_TX_CTRL (*((PUINT8V)0x400090AE)) // RW, USB_high_speed end point4 transmit control register +#define R8_U2EP4_RX_CTRL (*((PUINT8V)0x400090AF)) // RW, USB_high_speed end point4 receive control register +#define R16_U2EP5_T_LEN (*((PUINT16V)0x400090B0)) // RW, USB_high_speed end point5 length of transmission register +#define R8_U2EP5_TX_CTRL (*((PUINT8V)0x400090B2)) // RW, USB_high_speed end point5 transmit control register +#define R8_U2EP5_RX_CTRL (*((PUINT8V)0x400090B3)) // RW, USB_high_speed end point5 receive control register +#define R16_U2EP6_T_LEN (*((PUINT16V)0x400090B4)) // RW, USB_high_speed end point6 length of transmission register +#define R8_U2EP6_TX_CTRL (*((PUINT8V)0x400090B6)) // RW, USB_high_speed end point6 transmit control register +#define R8_U2EP6_RX_CTRL (*((PUINT8V)0x400090B7)) // RW, USB_high_speed end point6 receive control register +#define R16_U2EP7_T_LEN (*((PUINT16V)0x400090B8)) // RW, USB_high_speed end point7 length of transmission register +#define R8_U2EP7_TX_CTRL (*((PUINT8V)0x400090BA)) // RW, USB_high_speed end point7 transmit control register +#define R8_U2EP7_RX_CTRL (*((PUINT8V)0x400090BB)) // RW, USB_high_speed end point7 receive control register +/**R16_UEPn_T_LEN**/ +#define UEPn_T_LEN 0xFFFF +/**R8_UEPn_TX_CTRL**/ +#define USBHS_UEP_T_DONE 0x80 +#define USBHS_UEP_T_NAK_ACT 0x40 +#define USBHS_UEP_T_TOG_MASK 0x0C +#define USBHS_UEP_T_TOG_MDATA 0x0C +#define USBHS_UEP_T_TOG_DATA2 0x08 +#define USBHS_UEP_T_TOG_DATA1 0x04 +#define USBHS_UEP_T_TOG_DATA0 0x00 +#define USBHS_UEP_T_RES_MASK 0x03 +#define USBHS_UEP_T_RES_ACK 0x02 +#define USBHS_UEP_T_RES_STALL 0x01 +#define USBHS_UEP_T_RES_NAK 0x00 + +/**R8_UEPn_RX_CTRL**/ +#define USBHS_UEP_R_DONE 0x80 +#define USBHS_UEP_R_NAK_ACT 0x40 +#define USBHS_UEP_R_NAK_TOG 0x20 +#define USBHS_UEP_R_TOG_MATCH 0x10 +#define USBHS_UEP_R_SETUP_IS 0x08 +#define USBHS_UEP_R_TOG_MASK 0x0C +#define USBHS_UEP_R_TOG_MDATA 0x0C +#define USBHS_UEP_R_TOG_DATA2 0x08 +#define USBHS_UEP_R_TOG_DATA1 0x04 +#define USBHS_UEP_R_TOG_DATA0 0x00 +#define USBHS_UEP_R_RES_MASK 0x03 +#define USBHS_UEP_R_RES_ACK 0x02 +#define USBHS_UEP_R_RES_STALL 0x01 +#define USBHS_UEP_R_RES_NAK 0x00 + +#define R16_U2EP_T_ISO (*((PUINT16V)0x400090BC)) // RW, USB_high_speed end point transmit sync mode register +#define USBHS_UEP1_T_ISO_EN 0x02 +#define USBHS_UEP2_T_ISO_EN 0x04 +#define USBHS_UEP3_T_ISO_EN 0x08 +#define USBHS_UEP4_T_ISO_EN 0x10 +#define USBHS_UEP5_T_ISO_EN 0x20 +#define USBHS_UEP6_T_ISO_EN 0x40 +#define USBHS_UEP7_T_ISO_EN 0x80 +#define R16_U2EP_R_ISO (*((PUINT16V)0x400090BE)) // RW, USB_high_speed end point receive sync mode register +#define USBHS_UEP1_R_ISO_EN 0x02 +#define USBHS_UEP2_R_ISO_EN 0x04 +#define USBHS_UEP3_R_ISO_EN 0x08 +#define USBHS_UEP4_R_ISO_EN 0x10 +#define USBHS_UEP5_R_ISO_EN 0x20 +#define USBHS_UEP6_R_ISO_EN 0x40 +#define USBHS_UEP7_R_ISO_EN 0x80 + +/* USB high speed host register */ +#define R8_U2H_CFG (*((PUINT8V)0x40009100)) // RW, USB_high_speed register +#define USBHS_UH_LPM_EN 0x80 +#define USBHS_UH_FORCE_FS 0x40 +#define USBHS_UH_SOF_EN 0x20 +#define USBHS_UH_DMA_EN 0x10 +#define USBHS_UH_PHY_SUSPENDM 0x08 +#define USBHS_UH_CLR_ALL 0x04 +#define USBHS_RST_SIE 0x02 +#define USBHS_RST_LINK 0x01 +#define R8_U2H_INT_EN (*((PUINT8V)0x40009102)) // RW, USB_high_speed register +#define USBHS_UHIE_FIFO_OVER 0x80 +#define USBHS_UHIE_TX_HALT 0x40 +#define USBHS_UHIE_SOF_ACT 0x20 +#define USBHS_UHIE_TRANSFER 0x10 +#define USBHS_UHIE_RESUME_ACT 0x08 +#define USBHS_UHIE_WKUP_ACT 0x04 +#define R8_U2H_DEV_AD (*((PUINT8V)0x40009103)) // RW, USB_high_speed register +#define USBHS_UH_DEV_ADDR 0xFF +#define R32_U2H_CONTROL (*((PUINT32V)0x40009104)) // RW, USB_high_speed register +#define USBHS_UH_RX_NO_RES 0x800000 +#define USBHS_UH_TX_NO_RES 0x400000 +#define USBHS_UH_RX_NO_DATA 0x200000 +#define USBHS_UH_TX_NO_DATA 0x100000 +#define USBHS_UH_PRE_PID_EN 0x080000 +#define USBHS_UH_SPLIT_VALID 0x040000 +#define USBHS_UH_LPM_VALID 0x020000 +#define USBHS_UH_HOST_ACTION 0x010000 +#define USBHS_UH_BUF_MODE 0x0400 +#define USBHS_UH_T_TOG_MASK 0x0300 +#define USBHS_UH_T_TOG_MDATA 0x0300 +#define USBHS_UH_T_TOG_DATA2 0x0200 +#define USBHS_UH_T_TOG_DATA1 0x0100 +#define USBHS_UH_T_TOG_DATA0 0x0000 +#define USBHS_UH_T_ENDP_MASK 0xF0 +#define USBHS_UH_T_TOKEN_MASK 0x0F + +#define R8_U2H_INT_FLAG (*((PUINT8V)0x40009108)) // RW, USB_high_speed register +#define USBHS_UHIF_FIFO_OVER 0x80 +#define USBHS_UHIF_TX_HALT 0x40 +#define USBHS_UHIF_SOF_ACT 0x20 +#define USBHS_UHIF_TRANSFER 0x10 +#define USBHS_UHIF_RESUME_ACT 0x08 +#define USBHS_UHIF_WKUP_ACT 0x04 +#define R8_U2H_INT_ST (*((PUINT8V)0x40009109)) // RW, USB_high_speed register +#define USBHS_UHIF_PORT_RX_RESUME 0x10 +#define USBHS_UH_R_TOKEN_MASK 0x0F +#define R8_U2H_MIS_ST (*((PUINT8V)0x4000910A)) // RW, USB_high_speed register +#define USBHS_UHMS_BUS_SE0 0x80 +#define USBHS_UHMS_BUS_J 0x40 +#define USBHS_UHMS_LINESTATE 0x30 +#define USBHS_UHMS_USB_WAKEUP 0x08 +#define USBHS_UHMS_SOF_ACT 0x04 +#define USBHS_UHMS_SOF_PRE 0x02 +#define USBHS_UHMS_SOF_FREE 0x01 +#define R32_U2H_LPM_DATA (*((PUINT32V)0x4000910C)) // RW, USB_high_speed register +#define USBHS_UH_LPM_DATA 0x07FF +#define R32_U2H_SPLIT_DATA (*((PUINT32V)0x40009110)) // RW, USB_high_speed register +#define USBHS_UH_SPLIT_DATA 0x07FFFF +#define R32_U2H_FRAME (*((PUINT32V)0x40009114)) // RW, USB_high_speed register +#define USBHS_UH_SOF_CNT_CLR 0x02000000 +#define USBHS_UH_SOF_CNT_EN 0x01000000 +#define USBHS_UH_MFRAME_NO 0x070000 +#define USBHS_UH_FRAME_NO 0x07FF +#define R32_U2H_TX_LEN (*((PUINT32V)0x40009118)) // RW, USB_high_speed register +#define USBHS_UH_TX_LEN 0x07FF +#define R32_U2H_RX_LEN (*((PUINT32V)0x4000911C)) // RW, USB_high_speed register +#define USBHS_UH_RX_LEN 0x07FF +#define R32_U2H_RX_MAX_LEN (*((PUINT32V)0x40009120)) // RW, USB_high_speed register +#define USBHS_UH_RX_MAX_LEN 0x07FF +#define R32_U2H_RX_DMA (*((PUINT32V)0x40009124)) // RW, USB_high_speed register +#define USBHS_R32_UH_RX_DMA 0x01FFFF +#define R32_U2H_TX_DMA (*((PUINT32V)0x40009128)) // RW, USB_high_speed register +#define USBHS_R32_UH_TX_DMA 0x01FFFF +#define R32_U2H_PORT_CTRL (*((PUINT32V)0x4000912C)) // RW, USB_high_speed register +#define USBHS_UH_BUS_RST_LONG 0x010000 +#define USBHS_UH_PORT_SLEEP_BESL 0xF000 +#define USBHS_UH_CLR_PORT_SLEEP 0x0100 +#define USBHS_UH_CLR_PORT_CONNECT 0x20 +#define USBHS_UH_CLR_PORT_EN 0x10 +#define USBHS_UH_SET_PORT_SLEEP 0x08 +#define USBHS_UH_CLR_PORT_SUSP 0x04 +#define USBHS_UH_SET_PORT_SUSP 0x02 +#define USBHS_UH_SET_PORT_RESET 0x01 +#define R8_U2H_PORT_CFG (*((PUINT8V)0x40009130)) // RW, USB_high_speed register +#define USBHS_UH_PD_EN 0x80 +#define USBHS_UH_HOST_EN 0x01 +#define R8_U2H_PORT_INT_EN (*((PUINT8V)0x40009132)) // RW, USB_high_speed register +#define USBHS_UHIE_PORT_SLP 0x20 +#define USBHS_UHIE_PORT_RESET 0x10 +#define USBHS_UHIE_PORT_SUSP 0x04 +#define USBHS_UHIE_PORT_EN 0x02 +#define USBHS_UHIE_PORT_CONNECT 0x01 +#define R8_U2H_PORT_TEST_CT (*((PUINT8V)0x40009133)) // RW, USB_high_speed register +#define USBHS_UH_TEST_FORCE_EN 0x04 +#define USBHS_UH_TEST_K 0x02 +#define USBHS_UH_TEST_J 0x01 +#define R16_U2H_PORT_ST (*((PUINT16V)0x40009134)) // RW, USB_high_speed register +#define USBHS_UHIS_PORT_TEST 0x0800 +#define USBHS_UHIS_PORT_SPEED_MASK 0x0600 +#define USBHS_UHIS_PORT_HS 0x0400 +#define USBHS_UHIS_PORT_LS 0x0200 +#define USBHS_UHIS_PORT_FS 0x0000 +#define USBHS_UHIS_PORT_SLP 0x20 +#define USBHS_UHIS_PORT_RST 0x10 +#define USBHS_UHIS_PORT_SUSP 0x04 +#define USBHS_UHIS_PORT_EN 0x02 +#define USBHS_UHIS_PORT_CONNECT 0x01 +#define R8_U2H_PORT_CHG (*((PUINT8V)0x40009136)) +#define USBHS_UHIF_PORT_SLP 0x20 +#define USBHS_UHIF_PORT_RESET 0x10 +#define USBHS_UHIF_PORT_SUSP 0x04 +#define USBHS_UHIF_PORT_EN 0x02 +#define USBHS_UHIF_PORT_CONNECT 0x01 +#define R32_U2H_BC_CTRL (*((PUINT32V)0x4000913C)) +#define UDM_VSRC_ACT 0x0400 +#define UDM_BC_VSRC 0x0200 +#define UDP_BC_VSRC 0x0100 +#define BC_AUTO_MODE 0x40 +#define UDM_BC_CMPE 0x20 +#define UDP_BC_CMPE 0x10 +#define UDM_BC_CMPO 0x02 +#define UDP_BC_CMPO 0x01 +#define R8_USBHS_PLL_CTRL (*((PUINT8V)0x40009200)) +#define USBHS_PLL_EN 0x04 +#define USBHS_PLL_LOWPOW 0x02 +#define USBHS_PLL_CKSEL 0x01 + +#define __IO volatile /* defines 'read / write' permissions */ + +typedef struct +{ + __IO uint8_t CONTROL; /* 0x40009000 */ + __IO uint8_t BASE_MODE; /* 0x40009001 */ + __IO uint8_t INT_EN; /* 0x40009002 */ + __IO uint8_t DEV_AD; /* 0x40009003 */ + __IO uint8_t WAKE_CTRL; /* 0x40009004 远程唤醒寄存器 */ + __IO uint8_t TEST_MODE; /* 0x40009005 测试模式寄存器 */ + __IO uint16_t LPM_DATA; /* 0x40009006 */ + __IO uint8_t INT_FG; /* 0x40009008 */ + __IO uint8_t INT_ST; /* 0x40009009 */ + __IO uint8_t MIS_ST; /* 0x4000900a */ + __IO uint8_t RESERVE0; /* 0x4000900b */ + __IO uint16_t FRAME_NO; /* 0x4000900c */ + __IO uint16_t USB_BUS; /* 0x4000900e */ + __IO uint16_t UEP_TX_EN; /* 0x40009010 */ + __IO uint16_t UEP_RX_EN; /* 0x40009012 */ + + __IO uint16_t UEP_T_TOG_AUTO; /* 0x40009014 */ + __IO uint16_t UEP_R_TOG_AUTO; /* 0x40009016 */ + __IO uint8_t UEP_T_BURST; /* 0x40009018 */ + __IO uint8_t UEP_T_BURST_MODE; /* 0x40009019 */ + __IO uint8_t UEP_R_BURST; /* 0x4000901a */ + __IO uint8_t UEP_R_RES_MODE; /* 0x4000901b */ + __IO uint32_t UEP_AF_MODE; /* 0x4000901c */ + + __IO uint32_t UEP0_DMA; /* 0x40009020 */ + __IO uint32_t UEP1_RX_DMA; /* 0x40009024 */ + __IO uint32_t UEP2_RX_DMA; /* 0x40009028 */ + __IO uint32_t UEP3_RX_DMA; /* 0x4000902c */ + __IO uint32_t UEP4_RX_DMA; /* 0x40009030 */ + __IO uint32_t UEP5_RX_DMA; /* 0x40009034 */ + __IO uint32_t UEP6_RX_DMA; /* 0x40009038 */ + __IO uint32_t UEP7_RX_DMA; /* 0x4000903c */ + + __IO uint32_t UEP1_TX_DMA; /* 0x40009040 */ + __IO uint32_t UEP2_TX_DMA; /* 0x40009044 */ + __IO uint32_t UEP3_TX_DMA; /* 0x40009048 */ + __IO uint32_t UEP4_TX_DMA; /* 0x4000904c */ + __IO uint32_t UEP5_TX_DMA; /* 0x40009050 */ + __IO uint32_t UEP6_TX_DMA; /* 0x40009054 */ + __IO uint32_t UEP7_TX_DMA; /* 0x40009058 */ + + __IO uint32_t UEP0_MAX_LEN; /* 0x4000905c */ + __IO uint32_t UEP1_MAX_LEN; /* 0x40009060 */ + __IO uint32_t UEP2_MAX_LEN; /* 0x40009064 */ + __IO uint32_t UEP3_MAX_LEN; /* 0x40009068 */ + __IO uint32_t UEP4_MAX_LEN; /* 0x4000906c */ + __IO uint32_t UEP5_MAX_LEN; /* 0x40009070 */ + __IO uint32_t UEP6_MAX_LEN; /* 0x40009074 */ + __IO uint32_t UEP7_MAX_LEN; /* 0x40009078 */ + + __IO uint16_t USB_EP0_RX_LEN; /* 0x4000907c */ + __IO uint16_t RESERVE1; /* 0x4000907e */ + __IO uint16_t UEP1_RX_LEN; /* 0x40009080 */ + __IO uint16_t UEP1_R_SIZE; /* 0x40009082 */ + __IO uint16_t UEP2_RX_LEN; /* 0x40009084 */ + __IO uint16_t UEP2_R_SIZE; /* 0x40009086 */ + __IO uint16_t UEP3_RX_LEN; /* 0x40009088 */ + __IO uint16_t UEP3_R_SIZE; /* 0x4000908a */ + __IO uint16_t UEP4_RX_LEN; /* 0x4000908c */ + __IO uint16_t UEP4_R_SIZE; /* 0x4000908e */ + __IO uint16_t UEP5_RX_LEN; /* 0x40009090 */ + __IO uint16_t UEP5_R_SIZE; /* 0x40009092 */ + __IO uint16_t UEP6_RX_LEN; /* 0x40009094 */ + __IO uint16_t UEP6_R_SIZE; /* 0x40009096 */ + __IO uint16_t UEP7_RX_LEN; /* 0x40009098 */ + __IO uint16_t UEP7_R_SIZE; /* 0x4000909a */ + + __IO uint16_t UEP0_TX_LEN; /* 0x4000909c */ + __IO uint8_t UEP0_TX_CTRL; /* 0x4000909e */ + __IO uint8_t UEP0_RX_CTRL; /* 0x4000909f */ + __IO uint16_t UEP1_TX_LEN; /* 0x400090a0 */ + __IO uint8_t UEP1_TX_CTRL; /* 0x400090a2 */ + __IO uint8_t UEP1_RX_CTRL; /* 0x400090a3 */ + __IO uint16_t UEP2_TX_LEN; /* 0x400090a4 */ + __IO uint8_t UEP2_TX_CTRL; /* 0x400090a6 */ + __IO uint8_t UEP2_RX_CTRL; /* 0x400090a7 */ + __IO uint16_t UEP3_TX_LEN; /* 0x400090a8 */ + __IO uint8_t UEP3_TX_CTRL; /* 0x400090aa */ + __IO uint8_t UEP3_RX_CTRL; /* 0x400090ab */ + __IO uint16_t UEP4_TX_LEN; /* 0x400090ac */ + __IO uint8_t UEP4_TX_CTRL; /* 0x400090ae */ + __IO uint8_t UEP4_RX_CTRL; /* 0x400090af */ + __IO uint16_t UEP5_TX_LEN; /* 0x400090b0 */ + __IO uint8_t UEP5_TX_CTRL; /* 0x400090b2 */ + __IO uint8_t UEP5_RX_CTRL; /* 0x400090b3 */ + __IO uint16_t UEP6_TX_LEN; /* 0x400090b4 */ + __IO uint8_t UEP6_TX_CTRL; /* 0x400090b6 */ + __IO uint8_t UEP6_RX_CTRL; /* 0x400090b7 */ + __IO uint16_t UEP7_TX_LEN; /* 0x400090b8 */ + __IO uint8_t UEP7_TX_CTRL; /* 0x400090ba */ + __IO uint8_t UEP7_RX_CTRL; /* 0x400090bb */ + __IO uint16_t UEP_TX_ISO; /* 0x400090bc */ + __IO uint16_t UEP_RX_ISO; /* 0x400090be */ +} USBHSD_TypeDef; \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ch32/ch58x/usb_ch58x_dc_usbfs.c b/src/lib/CherryUSB/port/ch32/ch58x/usb_ch58x_dc_usbfs.c new file mode 100644 index 000000000..e86f41889 --- /dev/null +++ b/src/lib/CherryUSB/port/ch32/ch58x/usb_ch58x_dc_usbfs.c @@ -0,0 +1,640 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usb_ch58x_usbfs_reg.h" + +/** + * @brief Related register macro + */ +#define USB0_BASE 0x40008000u +#define USB1_BASE 0x40008400u + +#ifndef USBD +#define USBD USB0_BASE +#endif +#define CH58x_USBFS_DEV ((USB_FS_TypeDef *)USBD) + +/*!< 8-bit value of endpoint control register */ +#define EPn_CTRL(epid) \ + *(volatile uint8_t *)(&(CH58x_USBFS_DEV->UEP0_CTRL) + epid * 4 + (epid / 5) * 48) + +/*!< The length register value of the endpoint send buffer */ +#define EPn_TX_LEN(epid) \ + *(volatile uint8_t *)(&(CH58x_USBFS_DEV->UEP0_T_LEN) + epid * 4 + (epid / 5) * 48) + +/*!< Read setup packet to use in ep0 in */ +#define GET_SETUP_PACKET(data_add) \ + *(struct usb_setup_packet *)data_add + +/*!< Set epid ep tx valid // Not an isochronous endpoint */ +#define EPn_SET_TX_VALID(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_T_RES) | UEP_T_RES_ACK; +/*!< Set epid ep rx valid // Not an isochronous endpoint */ +#define EPn_SET_RX_VALID(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_R_RES) | UEP_R_RES_ACK; +/*!< Set epid ep tx valid // Isochronous endpoint */ +#define EPn_SET_TX_ISO_VALID(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_T_RES) | UEP_T_RES_TOUT; +/*!< Set epid ep rx valid // Isochronous endpoint */ +#define EPn_SET_RX_ISO_VALID(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_R_RES) | UEP_R_RES_TOUT; +/*!< Set epid ep tx nak */ +#define EPn_SET_TX_NAK(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_T_RES) | UEP_T_RES_NAK; +/*!< Set epid ep rx nak */ +#define EPn_SET_RX_NAK(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_R_RES) | UEP_R_RES_NAK; +/*!< Set epid ep tx stall */ +#define EPn_SET_TX_STALL(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_T_RES) | UEP_T_RES_STALL +/*!< Set epid ep rx stall */ +#define EPn_SET_RX_STALL(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_R_RES) | UEP_R_RES_STALL +/*!< Clear epid ep tx stall */ +#define EPn_CLR_TX_STALL(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~(RB_UEP_T_TOG | MASK_UEP_T_RES)) | UEP_T_RES_NAK +/*!< Clear epid ep rx stall */ +#define EPn_CLR_RX_STALL(epid) \ + EPn_CTRL(epid) = (EPn_CTRL(epid) & ~(RB_UEP_R_TOG | MASK_UEP_R_RES)) | UEP_R_RES_ACK +/*!< Set epid ep tx len */ +#define EPn_SET_TX_LEN(epid, len) \ + EPn_TX_LEN(epid) = len +/*!< Get epid ep rx len */ +#define EPn_GET_RX_LEN(epid) \ + CH58x_USBFS_DEV->USB_RX_LEN + +/*!< ep nums */ +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 5 +#endif +/*!< ep mps */ +#define EP_MPS 64 +/*!< set ep4 in mps 64 */ +#define EP4_IN_MPS EP_MPS +/*!< set ep4 out mps 64 */ +#define EP4_OUT_MPS EP_MPS + +/*!< User defined assignment endpoint RAM */ +__attribute__((aligned(4))) uint8_t ep0_data_buff[64 + EP4_OUT_MPS + EP4_IN_MPS]; /*!< ep0(64)+ep4_out(64)+ep4_in(64) */ +__attribute__((aligned(4))) uint8_t ep1_data_buff[64 + 64]; /*!< ep1_out(64)+ep1_in(64) */ +__attribute__((aligned(4))) uint8_t ep2_data_buff[64 + 64]; /*!< ep2_out(64)+ep2_in(64) */ +__attribute__((aligned(4))) uint8_t ep3_data_buff[64 + 64]; /*!< ep3_out(64)+ep3_in(64) */ +#if (CONFIG_USBDEV_EP_NUM == 8) +/** + * This dcd porting can be used on ch581, ch582, ch583, + * and also on ch571, ch572, and ch573. Note that only five endpoints are available for ch571, ch572, and ch573. + */ +__attribute__((aligned(4))) uint8_t ep5_data_buff[64 + 64]; /*!< ep5_out(64)+ep5_in(64) */ +__attribute__((aligned(4))) uint8_t ep6_data_buff[64 + 64]; /*!< ep6_out(64)+ep6_in(64) */ +__attribute__((aligned(4))) uint8_t ep7_data_buff[64 + 64]; /*!< ep7_out(64)+ep7_in(64) */ +#endif +/** + * @brief Endpoint information structure + */ +typedef struct _usbd_ep_info { + uint8_t mps; /*!< Maximum packet length of endpoint */ + uint8_t eptype; /*!< Endpoint Type */ + uint8_t *ep_ram_addr; /*!< Endpoint buffer address */ + + uint8_t ep_enable; /* Endpoint enable */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +} usbd_ep_info; + +/*!< ch58x usb */ +static struct _ch58x_core_prvi { + uint8_t address; /*!< Address */ + usbd_ep_info ep_in[CONFIG_USBDEV_EP_NUM]; + usbd_ep_info ep_out[CONFIG_USBDEV_EP_NUM]; + struct usb_setup_packet setup; +} usb_dc_cfg; + +__WEAK void usb_dc_low_level_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + +/** + * @brief USB initialization + * @pre None + * @param[in] None + * @retval >=0 success otherwise failure + */ +int usb_dc_init(uint8_t busid) +{ + usb_dc_cfg.ep_in[0].ep_ram_addr = ep0_data_buff; + usb_dc_cfg.ep_out[0].ep_ram_addr = ep0_data_buff; + + usb_dc_cfg.ep_in[1].ep_ram_addr = ep1_data_buff + 64; + usb_dc_cfg.ep_out[1].ep_ram_addr = ep1_data_buff; + + usb_dc_cfg.ep_in[2].ep_ram_addr = ep2_data_buff + 64; + usb_dc_cfg.ep_out[2].ep_ram_addr = ep2_data_buff; + + usb_dc_cfg.ep_in[3].ep_ram_addr = ep3_data_buff + 64; + usb_dc_cfg.ep_out[3].ep_ram_addr = ep3_data_buff; + + usb_dc_cfg.ep_in[4].ep_ram_addr = ep0_data_buff + 64 + EP4_OUT_MPS; + usb_dc_cfg.ep_out[4].ep_ram_addr = ep0_data_buff + 64; +#if (CONFIG_USBDEV_EP_NUM == 8) + usb_dc_cfg.ep_in[5].ep_ram_addr = ep5_data_buff + 64; + usb_dc_cfg.ep_out[5].ep_ram_addr = ep5_data_buff; + + usb_dc_cfg.ep_in[6].ep_ram_addr = ep6_data_buff + 64; + usb_dc_cfg.ep_out[6].ep_ram_addr = ep6_data_buff; + + usb_dc_cfg.ep_in[7].ep_ram_addr = ep7_data_buff + 64; + usb_dc_cfg.ep_out[7].ep_ram_addr = ep7_data_buff; +#endif + /*!< Set the mode first and cancel RB_UC_CLR_ALL */ + CH58x_USBFS_DEV->USB_CTRL = 0x00; + CH58x_USBFS_DEV->UEP4_1_MOD = RB_UEP4_RX_EN | RB_UEP4_TX_EN | RB_UEP1_RX_EN | RB_UEP1_TX_EN; /*!< EP4 OUT+IN EP1 OUT+IN */ + CH58x_USBFS_DEV->UEP2_3_MOD = RB_UEP2_RX_EN | RB_UEP2_TX_EN | RB_UEP3_RX_EN | RB_UEP3_TX_EN; /*!< EP2 OUT+IN EP3 OUT+IN */ +#if (CONFIG_USBDEV_EP_NUM == 8) + CH58x_USBFS_DEV->UEP567_MOD = RB_UEP5_RX_EN | RB_UEP5_TX_EN | RB_UEP6_RX_EN | RB_UEP6_TX_EN | RB_UEP7_RX_EN | RB_UEP7_TX_EN; /*!< EP5 EP6 EP7 OUT+IN */ +#endif + CH58x_USBFS_DEV->UEP0_DMA = (uint16_t)(uint32_t)ep0_data_buff; + CH58x_USBFS_DEV->UEP1_DMA = (uint16_t)(uint32_t)ep1_data_buff; + CH58x_USBFS_DEV->UEP2_DMA = (uint16_t)(uint32_t)ep2_data_buff; + CH58x_USBFS_DEV->UEP3_DMA = (uint16_t)(uint32_t)ep3_data_buff; +#if (CONFIG_USBDEV_EP_NUM == 8) + CH58x_USBFS_DEV->UEP5_DMA = (uint16_t)(uint32_t)ep5_data_buff; + CH58x_USBFS_DEV->UEP6_DMA = (uint16_t)(uint32_t)ep6_data_buff; + CH58x_USBFS_DEV->UEP7_DMA = (uint16_t)(uint32_t)ep7_data_buff; +#endif + CH58x_USBFS_DEV->UEP0_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK; + CH58x_USBFS_DEV->UEP1_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG; + CH58x_USBFS_DEV->UEP2_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG; + CH58x_USBFS_DEV->UEP3_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG; + CH58x_USBFS_DEV->UEP4_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK; +#if (CONFIG_USBDEV_EP_NUM == 8) + CH58x_USBFS_DEV->UEP5_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG; + CH58x_USBFS_DEV->UEP6_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG; + CH58x_USBFS_DEV->UEP7_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG; +#endif + CH58x_USBFS_DEV->USB_DEV_AD = 0x00; + + /*!< Start the USB device and DMA, and automatically return to NAK before the interrupt flag is cleared during the interrupt */ + CH58x_USBFS_DEV->USB_CTRL = RB_UC_DEV_PU_EN | RB_UC_INT_BUSY | RB_UC_DMA_EN; + if ((uint32_t) & (CH58x_USBFS_DEV->USB_CTRL) == (uint32_t)USB0_BASE) { + /*!< USB0 */ + R16_PIN_ANALOG_IE |= RB_PIN_USB_IE | RB_PIN_USB_DP_PU; + } else if ((uint32_t) & (CH58x_USBFS_DEV->USB_CTRL) == (uint32_t)USB1_BASE) { + /*!< USB1 */ + R16_PIN_ANALOG_IE |= RB_PIN_USB2_IE | RB_PIN_USB2_DP_PU; + } + + CH58x_USBFS_DEV->USB_INT_FG = 0xff; /*!< Clear interrupt flag */ + CH58x_USBFS_DEV->UDEV_CTRL = RB_UD_PD_DIS | RB_UD_PORT_EN; /*!< Allow USB port */ + CH58x_USBFS_DEV->USB_INT_EN = RB_UIE_SUSPEND | RB_UIE_BUS_RST | RB_UIE_TRANSFER; + + usb_dc_low_level_init(); + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + return 0; +} + +/** + * @brief Set address + * @pre None + * @param[in] address :8-bit valid address + * @retval >=0 success otherwise failure + */ +int usbd_set_address(uint8_t busid, const uint8_t address) +{ + if (address == 0) { + CH58x_USBFS_DEV->USB_DEV_AD = (CH58x_USBFS_DEV->USB_DEV_AD & 0x80) | address; + } + usb_dc_cfg.address = address; + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + return -1; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + return USB_SPEED_FULL; +} + +/** + * @brief Open endpoint + * @pre None + * @param[in] ep_cfg : Endpoint configuration structure pointer + * @retval >=0 success otherwise failure + */ +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + /*!< ep id */ + uint8_t epid = USB_EP_GET_IDX(ep->bEndpointAddress); + if (epid > (CONFIG_USBDEV_EP_NUM - 1)) { + /** + * If you use ch58x, you can change the CONFIG_USBDEV_EP_NUM set to 8 + */ + USB_LOG_ERR("Ep addr %02x overflow\r\n", ep->bEndpointAddress); + return -1; + } + + /*!< ep max packet length */ + uint8_t mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + /*!< update ep max packet length */ + if (USB_EP_DIR_IS_IN(ep->bEndpointAddress)) { + /*!< in */ + usb_dc_cfg.ep_in[epid].ep_enable = true; + usb_dc_cfg.ep_in[epid].mps = mps; + usb_dc_cfg.ep_in[epid].eptype = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + } else if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + /*!< out */ + usb_dc_cfg.ep_out[epid].ep_enable = true; + usb_dc_cfg.ep_out[epid].mps = mps; + usb_dc_cfg.ep_out[epid].eptype = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + } + return 0; +} + +/** + * @brief Close endpoint + * @pre None + * @param[in] ep : Endpoint address + * @retval >=0 success otherwise failure + */ +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + /*!< ep id */ + uint8_t epid = USB_EP_GET_IDX(ep); + if (USB_EP_DIR_IS_IN(ep)) { + /*!< in */ + usb_dc_cfg.ep_in[epid].ep_enable = false; + } else if (USB_EP_DIR_IS_OUT(ep)) { + /*!< out */ + usb_dc_cfg.ep_out[epid].ep_enable = false; + } + return 0; +} + + +/** + * @brief Endpoint setting stall + * @pre None + * @param[in] ep : Endpoint address + * @retval >=0 success otherwise failure + */ +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + /*!< ep id */ + uint8_t epid = USB_EP_GET_IDX(ep); + if (USB_EP_DIR_IS_OUT(ep)) { + EPn_SET_RX_STALL(epid); + } else { + EPn_SET_TX_STALL(epid); + } + return 0; +} + +/** + * @brief Endpoint clear stall + * @pre None + * @param[in] ep : Endpoint address + * @retval >=0 success otherwise failure + */ +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t epid = USB_EP_GET_IDX(ep); + if (USB_EP_DIR_IS_OUT(ep)) { + EPn_CLR_RX_STALL(epid); + } else { + EPn_CLR_TX_STALL(epid); + } + return 0; +} + +/** + * @brief Check endpoint status + * @pre None + * @param[in] ep : Endpoint address + * @param[out] stalled : Outgoing endpoint status + * @retval >=0 success otherwise failure + */ +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + if (USB_EP_DIR_IS_OUT(ep)) { + } else { + } + return 0; +} + +/** + * @brief Setup in ep transfer setting and start transfer. + * + * This function is asynchronous. + * This function is similar to uart with tx dma. + * + * This function is called to write data to the specified endpoint. The + * supplied usbd_endpoint_callback function will be called when data is transmitted + * out. + * + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] data Pointer to data to write + * @param[in] data_len Length of the data requested to write. This may + * be zero for a zero length status packet. + * @return 0 on success, negative errno code on fail. + */ +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!usb_dc_cfg.ep_in[ep_idx].ep_enable) { + return -2; + } + if ((uint32_t)data & 0x03) { + return -3; + } + + usb_dc_cfg.ep_in[ep_idx].xfer_buf = (uint8_t *)data; + usb_dc_cfg.ep_in[ep_idx].xfer_len = data_len; + usb_dc_cfg.ep_in[ep_idx].actual_xfer_len = 0; + + if (data_len == 0) { + /*!< write 0 len data */ + EPn_SET_TX_LEN(ep_idx, 0); + /*!< enable tx */ + if (usb_dc_cfg.ep_in[ep_idx].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + EPn_SET_TX_VALID(ep_idx); + } else { + EPn_SET_TX_ISO_VALID(ep_idx); + } + /*!< return */ + return 0; + } else { + /*!< Not zlp */ + data_len = MIN(data_len, usb_dc_cfg.ep_in[ep_idx].mps); + /*!< write buff */ + memcpy(usb_dc_cfg.ep_in[ep_idx].ep_ram_addr, data, data_len); + /*!< write real_wt_nums len data */ + EPn_SET_TX_LEN(ep_idx, data_len); + /*!< enable tx */ + if (usb_dc_cfg.ep_in[ep_idx].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + EPn_SET_TX_VALID(ep_idx); + } else { + EPn_SET_TX_ISO_VALID(ep_idx); + } + } + return 0; +} + +/** + * @brief Setup out ep transfer setting and start transfer. + * + * This function is asynchronous. + * This function is similar to uart with rx dma. + * + * This function is called to read data to the specified endpoint. The + * supplied usbd_endpoint_callback function will be called when data is received + * in. + * + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] data Pointer to data to read + * @param[in] data_len Max length of the data requested to read. + * + * @return 0 on success, negative errno code on fail. + */ +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!usb_dc_cfg.ep_out[ep_idx].ep_enable) { + return -2; + } + if ((uint32_t)data & 0x03) { + return -3; + } + + usb_dc_cfg.ep_out[ep_idx].xfer_buf = (uint8_t *)data; + usb_dc_cfg.ep_out[ep_idx].xfer_len = data_len; + usb_dc_cfg.ep_out[ep_idx].actual_xfer_len = 0; + + if (data_len == 0) { + } else { + data_len = MIN(data_len, usb_dc_cfg.ep_out[ep_idx].mps); + } + + if (usb_dc_cfg.ep_out[ep_idx].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + EPn_SET_RX_VALID(ep_idx); + } else { + EPn_SET_RX_ISO_VALID(ep_idx); + } + return 0; +} + +/** + * @brief USB interrupt processing function + * @pre None + * @param[in] None + * @retval None + */ +void USBD_IRQHandler(uint8_t busid) +{ + volatile uint8_t intflag = 0; + intflag = CH58x_USBFS_DEV->USB_INT_FG; + + if (intflag & RB_UIF_TRANSFER) { + if ((CH58x_USBFS_DEV->USB_INT_ST & MASK_UIS_TOKEN) != MASK_UIS_TOKEN) { + uint8_t epid = ((CH58x_USBFS_DEV->USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP)) & 0x0f); + switch ((CH58x_USBFS_DEV->USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP)) & 0xf0) { + case UIS_TOKEN_IN: + if (epid == 0) { + /** + * IN The host takes away the data that has been stored in FIFO + */ + switch (usb_dc_cfg.setup.bmRequestType >> USB_REQUEST_DIR_SHIFT) { + case 1: + /*!< Get */ + CH58x_USBFS_DEV->UEP0_CTRL ^= RB_UEP_T_TOG; + /** + * Here is to take away the last data, and the IN interrupt will be triggered only after it is successfully taken away. + * Therefore, the status of the in endpoint is set to NAK here. If there is data transmission, + * the endpoint status will be set to ack again in the in handler of EP0. + */ + EPn_SET_TX_NAK(0); + + /*!< IN */ + if (usb_dc_cfg.ep_in[0].xfer_len > usb_dc_cfg.ep_in[0].mps) { + usb_dc_cfg.ep_in[0].xfer_len -= usb_dc_cfg.ep_in[0].mps; + usb_dc_cfg.ep_in[0].actual_xfer_len += usb_dc_cfg.ep_in[0].mps; + usbd_event_ep_in_complete_handler(0, 0 | 0x80, usb_dc_cfg.ep_in[0].actual_xfer_len); + } else { + usb_dc_cfg.ep_in[0].actual_xfer_len += usb_dc_cfg.ep_in[0].xfer_len; + usb_dc_cfg.ep_in[0].xfer_len = 0; + usbd_event_ep_in_complete_handler(0, 0 | 0x80, usb_dc_cfg.ep_in[0].actual_xfer_len); + } + break; + case 0: + /*!< Set */ + switch (usb_dc_cfg.setup.bRequest) { + case USB_REQUEST_SET_ADDRESS: + /*!< Fill in the equipment address */ + CH58x_USBFS_DEV->USB_DEV_AD = (CH58x_USBFS_DEV->USB_DEV_AD & RB_UDA_GP_BIT) | usb_dc_cfg.address; + /** + * In the state phase after setting the address, the host has sent an in token packet of data1 to take the packet of 0 length, + * Ch58x USB IP needs to manually set the status of the in endpoint to NAK + */ + EPn_SET_TX_NAK(0); + EPn_SET_RX_VALID(0); + break; + default: + /*!< Normal out state phase */ + /** + * The host has sent an in token packet of data1 and taken the packet of 0 length. + * Here, you only need to set the status of the in endpoint to NAK and out endpoint ACK + */ + EPn_SET_TX_NAK(0); + EPn_SET_RX_VALID(0); + break; + } + break; + } + } else { + if (epid == 4) { + CH58x_USBFS_DEV->UEP4_CTRL ^= RB_UEP_T_TOG; + } + EPn_SET_TX_NAK(epid); + if (usb_dc_cfg.ep_in[epid].xfer_len > usb_dc_cfg.ep_in[epid].mps) { + /*!< Need start in again */ + usb_dc_cfg.ep_in[epid].xfer_buf += usb_dc_cfg.ep_in[epid].mps; + usb_dc_cfg.ep_in[epid].xfer_len -= usb_dc_cfg.ep_in[epid].mps; + usb_dc_cfg.ep_in[epid].actual_xfer_len += usb_dc_cfg.ep_in[epid].mps; + if (usb_dc_cfg.ep_in[epid].xfer_len > usb_dc_cfg.ep_in[epid].mps) { + memcpy(usb_dc_cfg.ep_in[epid].ep_ram_addr, usb_dc_cfg.ep_in[epid].xfer_buf, usb_dc_cfg.ep_in[epid].mps); + EPn_SET_TX_LEN(epid, usb_dc_cfg.ep_in[epid].mps); + } else { + memcpy(usb_dc_cfg.ep_in[epid].ep_ram_addr, usb_dc_cfg.ep_in[epid].xfer_buf, usb_dc_cfg.ep_in[epid].xfer_len); + EPn_SET_TX_LEN(epid, usb_dc_cfg.ep_in[epid].xfer_len); + } + if (usb_dc_cfg.ep_in[epid].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + EPn_SET_TX_VALID(epid); + } else { + EPn_SET_TX_ISO_VALID(epid); + } + } else { + usb_dc_cfg.ep_in[epid].actual_xfer_len += usb_dc_cfg.ep_in[epid].xfer_len; + usb_dc_cfg.ep_in[epid].xfer_len = 0; + usbd_event_ep_in_complete_handler(0, epid | 0x80, usb_dc_cfg.ep_in[epid].actual_xfer_len); + } + } + break; + case UIS_TOKEN_OUT: + if (epid == 0) { + /*!< ep0 out */ + CH58x_USBFS_DEV->UEP0_CTRL ^= RB_UEP_R_TOG; + EPn_SET_RX_NAK(epid); + uint32_t read_count = EPn_GET_RX_LEN(0); + memcpy(usb_dc_cfg.ep_out[epid].xfer_buf, usb_dc_cfg.ep_out[epid].ep_ram_addr, read_count); + + usb_dc_cfg.ep_out[0].actual_xfer_len += read_count; + usb_dc_cfg.ep_out[0].xfer_len -= read_count; + usbd_event_ep_out_complete_handler(0, 0x00, usb_dc_cfg.ep_out[0].actual_xfer_len); + if (read_count == 0) { + /*!< Out status, start reading setup */ + EPn_SET_RX_VALID(0); + } + } else { + if ((CH58x_USBFS_DEV->USB_INT_ST) & RB_UIS_TOG_OK) { + if (epid == 4) { + CH58x_USBFS_DEV->UEP4_CTRL ^= RB_UEP_R_TOG; + } + EPn_SET_RX_NAK(epid); + uint32_t read_count = EPn_GET_RX_LEN(epid); + memcpy(usb_dc_cfg.ep_out[epid].xfer_buf, usb_dc_cfg.ep_out[epid].ep_ram_addr, read_count); + usb_dc_cfg.ep_out[epid].xfer_buf += read_count; + usb_dc_cfg.ep_out[epid].actual_xfer_len += read_count; + usb_dc_cfg.ep_out[epid].xfer_len -= read_count; + + if ((read_count < usb_dc_cfg.ep_out[epid].mps) || (usb_dc_cfg.ep_out[epid].xfer_len == 0)) { + usbd_event_ep_out_complete_handler(0, ((epid)&0x7f), usb_dc_cfg.ep_out[epid].actual_xfer_len); + } else { + if (usb_dc_cfg.ep_out[epid].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + EPn_SET_RX_VALID(epid); + } else { + EPn_SET_RX_ISO_VALID(epid); + } + } + } + } + break; + default: + break; + } + CH58x_USBFS_DEV->USB_INT_FG = RB_UIF_TRANSFER; + } + + if (CH58x_USBFS_DEV->USB_INT_ST & RB_UIS_SETUP_ACT) { + /*!< Setup */ + /** + * Setup the device must respond with ACK, and the next data phase is DATA1 + * If it is sent, the data1 packet will be sent. + * If it is received, the data1 packet is expected to be received. + * If it is in, the host will send the data1 out packet to complete the status phase after the in completes. + * If it is out, the host will send the data1 in packet to complete the status phase after the out completes. + */ + CH58x_USBFS_DEV->UEP0_CTRL = RB_UEP_R_TOG | RB_UEP_T_TOG | UEP_T_RES_NAK; + /*!< get setup packet */ + usb_dc_cfg.setup = GET_SETUP_PACKET(usb_dc_cfg.ep_out[0].ep_ram_addr); + if (usb_dc_cfg.setup.bmRequestType >> USB_REQUEST_DIR_SHIFT == 0) { + /** + * Ep0 The next in must be the status stage. + * The device must reply to the host data 0 length packet. + * Here, set the transmission length to 0 and the transmission status to ACK, + * and wait for the host to send the in token to retrieve + */ + EPn_SET_TX_LEN(0, 0); + EPn_SET_TX_VALID(0); + } + EPn_SET_RX_NAK(0); + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&(usb_dc_cfg.setup)); + CH58x_USBFS_DEV->USB_INT_FG = RB_UIF_TRANSFER; + } + } else if (intflag & RB_UIF_BUS_RST) { + /*!< Reset */ + CH58x_USBFS_DEV->USB_DEV_AD = 0; + usbd_event_reset_handler(0); + /*!< Set ep0 rx vaild to start receive setup packet */ + EPn_SET_RX_VALID(0); + CH58x_USBFS_DEV->USB_INT_FG = RB_UIF_BUS_RST; + } else if (intflag & RB_UIF_SUSPEND) { + if (CH58x_USBFS_DEV->USB_MIS_ST & RB_UMS_SUSPEND) { + /*!< Suspend */ + } else { + /*!< Wake up */ + } + CH58x_USBFS_DEV->USB_INT_FG = RB_UIF_SUSPEND; + } else { + CH58x_USBFS_DEV->USB_INT_FG = intflag; + } +} + +void USB_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))); +void USB_IRQHandler(void) +{ + extern void USBD_IRQHandler(uint8_t busid); + USBD_IRQHandler(0); +} diff --git a/src/lib/CherryUSB/port/ch32/ch58x/usb_ch58x_usbfs_reg.h b/src/lib/CherryUSB/port/ch32/ch58x/usb_ch58x_usbfs_reg.h new file mode 100644 index 000000000..f7fda8c62 --- /dev/null +++ b/src/lib/CherryUSB/port/ch32/ch58x/usb_ch58x_usbfs_reg.h @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#define __IO volatile +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define RB_UC_HOST_MODE 0x80 // enable USB host mode: 0=device mode, 1=host mode +#define RB_UC_LOW_SPEED 0x40 // enable USB low speed: 0=12Mbps, 1=1.5Mbps +#define RB_UC_DEV_PU_EN 0x20 // USB device enable and internal pullup resistance enable +#define RB_UC_SYS_CTRL1 0x20 // USB system control high bit +#define RB_UC_SYS_CTRL0 0x10 // USB system control low bit +#define MASK_UC_SYS_CTRL 0x30 // bit mask of USB system control +#define RB_UC_INT_BUSY 0x08 // enable automatic responding busy for device mode or automatic pause for host mode during interrupt flag UIF_TRANSFER valid +#define RB_UC_RESET_SIE 0x04 // force reset USB SIE, need software clear +#define RB_UC_CLR_ALL 0x02 // force clear FIFO and count of USB +#define RB_UC_DMA_EN 0x01 // DMA enable and DMA interrupt enable for USB + +#define RB_UD_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable +#define RB_UD_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level +#define RB_UD_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level +#define RB_UD_LOW_SPEED 0x04 // enable USB physical port low speed: 0=full speed, 1=low speed +#define RB_UD_GP_BIT 0x02 // general purpose bit +#define RB_UD_PORT_EN 0x01 // enable USB physical port I/O: 0=disable, 1=enable + +#define RB_UH_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable +#define RB_UH_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level +#define RB_UH_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level +#define RB_UH_LOW_SPEED 0x04 // enable USB port low speed: 0=full speed, 1=low speed +#define RB_UH_BUS_RESET 0x02 // control USB bus reset: 0=normal, 1=force bus reset +#define RB_UH_PORT_EN 0x01 // enable USB port: 0=disable, 1=enable port, automatic disabled if USB device detached + +#define RB_UIE_DEV_SOF 0x80 // enable interrupt for SOF received for USB device mode +#define RB_UIE_DEV_NAK 0x40 // enable interrupt for NAK responded for USB device mode +#define RB_UIE_FIFO_OV 0x10 // enable interrupt for FIFO overflow +#define RB_UIE_HST_SOF 0x08 // enable interrupt for host SOF timer action for USB host mode +#define RB_UIE_SUSPEND 0x04 // enable interrupt for USB suspend or resume event +#define RB_UIE_TRANSFER 0x02 // enable interrupt for USB transfer completion +#define RB_UIE_DETECT 0x01 // enable interrupt for USB device detected event for USB host mode +#define RB_UIE_BUS_RST 0x01 // enable interrupt for USB bus reset event for USB device mode + +#define RB_UDA_GP_BIT 0x80 // general purpose bit +#define MASK_USB_ADDR 0x7F // bit mask for USB device address + +#define RB_UMS_SOF_PRES 0x80 // RO, indicate host SOF timer presage status +#define RB_UMS_SOF_ACT 0x40 // RO, indicate host SOF timer action status for USB host +#define RB_UMS_SIE_FREE 0x20 // RO, indicate USB SIE free status +#define RB_UMS_R_FIFO_RDY 0x10 // RO, indicate USB receiving FIFO ready status (not empty) +#define RB_UMS_BUS_RESET 0x08 // RO, indicate USB bus reset status +#define RB_UMS_SUSPEND 0x04 // RO, indicate USB suspend status +#define RB_UMS_DM_LEVEL 0x02 // RO, indicate UDM level saved at device attached to USB host +#define RB_UMS_DEV_ATTACH 0x01 // RO, indicate device attached status on USB host + +#define RB_U_IS_NAK 0x80 // RO, indicate current USB transfer is NAK received +#define RB_U_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK +#define RB_U_SIE_FREE 0x20 // RO, indicate USB SIE free status +#define RB_UIF_FIFO_OV 0x10 // FIFO overflow interrupt flag for USB, direct bit address clear or write 1 to clear +#define RB_UIF_HST_SOF 0x08 // host SOF timer interrupt flag for USB host, direct bit address clear or write 1 to clear +#define RB_UIF_SUSPEND 0x04 // USB suspend or resume event interrupt flag, direct bit address clear or write 1 to clear +#define RB_UIF_TRANSFER 0x02 // USB transfer completion interrupt flag, direct bit address clear or write 1 to clear +#define RB_UIF_DETECT 0x01 // device detected event interrupt flag for USB host mode, direct bit address clear or write 1 to clear +#define RB_UIF_BUS_RST 0x01 // bus reset event interrupt flag for USB device mode, direct bit address clear or write 1 to clear + +#define RB_UIS_SETUP_ACT 0x80 // RO, indicate SETUP token & 8 bytes setup request received for USB device mode +#define RB_UIS_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK +#define RB_UIS_TOKEN1 0x20 // RO, current token PID code bit 1 received for USB device mode +#define RB_UIS_TOKEN0 0x10 // RO, current token PID code bit 0 received for USB device mode +#define MASK_UIS_TOKEN 0x30 // RO, bit mask of current token PID code received for USB device mode +#define UIS_TOKEN_OUT 0x00 +#define UIS_TOKEN_SOF 0x10 +#define UIS_TOKEN_IN 0x20 +#define UIS_TOKEN_SETUP 0x30 + +#define MASK_UIS_ENDP 0x0F // RO, bit mask of current transfer endpoint number for USB device mode +#define MASK_UIS_H_RES 0x0F // RO, bit mask of current transfer handshake response for USB host mode: 0000=no response, time out from device, others=handshake response PID received + +#define R8_USB_RX_LEN (*((uint8_t *)0x40008008)) // USB receiving length +#define RB_UEP1_RX_EN 0x80 // enable USB endpoint 1 receiving (OUT) +#define RB_UEP1_TX_EN 0x40 // enable USB endpoint 1 transmittal (IN) +#define RB_UEP1_BUF_MOD 0x10 // buffer mode of USB endpoint 1 + +#define RB_UEP4_RX_EN 0x08 // enable USB endpoint 4 receiving (OUT) +#define RB_UEP4_TX_EN 0x04 // enable USB endpoint 4 transmittal (IN) + +#define RB_UEP3_RX_EN 0x80 // enable USB endpoint 3 receiving (OUT) +#define RB_UEP3_TX_EN 0x40 // enable USB endpoint 3 transmittal (IN) +#define RB_UEP3_BUF_MOD 0x10 // buffer mode of USB endpoint 3 +#define RB_UEP2_RX_EN 0x08 // enable USB endpoint 2 receiving (OUT) +#define RB_UEP2_TX_EN 0x04 // enable USB endpoint 2 transmittal (IN) +#define RB_UEP2_BUF_MOD 0x01 // buffer mode of USB endpoint 2 + +#define RB_UEP7_RX_EN 0x20 // enable USB endpoint 7 receiving (OUT) +#define RB_UEP7_TX_EN 0x10 // enable USB endpoint 7 transmittal (IN) +#define RB_UEP6_RX_EN 0x08 // enable USB endpoint 6 receiving (OUT) +#define RB_UEP6_TX_EN 0x04 // enable USB endpoint 6 transmittal (IN) +#define RB_UEP5_RX_EN 0x02 // enable USB endpoint 5 receiving (OUT) +#define RB_UEP5_TX_EN 0x01 // enable USB endpoint 5 transmittal (IN) + +#define RB_UH_EP_TX_EN 0x40 // enable USB host OUT endpoint transmittal +#define RB_UH_EP_TBUF_MOD 0x10 // buffer mode of USB host OUT endpoint + +#define RB_UH_EP_RX_EN 0x08 // enable USB host IN endpoint receiving +#define RB_UH_EP_RBUF_MOD 0x01 // buffer mode of USB host IN endpoint + +#define RB_UEP_R_TOG 0x80 // expected data toggle flag of USB endpoint X receiving (OUT): 0=DATA0, 1=DATA1 +#define RB_UEP_T_TOG 0x40 // prepared data toggle flag of USB endpoint X transmittal (IN): 0=DATA0, 1=DATA1 +#define RB_UEP_AUTO_TOG 0x10 // enable automatic toggle after successful transfer completion on endpoint 1/2/3: 0=manual toggle, 1=automatic toggle +#define RB_UEP_R_RES1 0x08 // handshake response type high bit for USB endpoint X receiving (OUT) +#define RB_UEP_R_RES0 0x04 // handshake response type low bit for USB endpoint X receiving (OUT) +#define MASK_UEP_R_RES 0x0C // bit mask of handshake response type for USB endpoint X receiving (OUT) +#define UEP_R_RES_ACK 0x00 +#define UEP_R_RES_TOUT 0x04 +#define UEP_R_RES_NAK 0x08 +#define UEP_R_RES_STALL 0x0C + +#define RB_UEP_T_RES1 0x02 // handshake response type high bit for USB endpoint X transmittal (IN) +#define RB_UEP_T_RES0 0x01 // handshake response type low bit for USB endpoint X transmittal (IN) +#define MASK_UEP_T_RES 0x03 // bit mask of handshake response type for USB endpoint X transmittal (IN) +#define UEP_T_RES_ACK 0x00 +#define UEP_T_RES_TOUT 0x01 +#define UEP_T_RES_NAK 0x02 +#define UEP_T_RES_STALL 0x03 + +#define RB_UH_PRE_PID_EN 0x80 // USB host PRE PID enable for low speed device via hub +#define RB_UH_SOF_EN 0x40 // USB host automatic SOF enable + +#define R8_UH_EP_PID R8_UEP2_T_LEN // host endpoint and PID +#define MASK_UH_TOKEN 0xF0 // bit mask of token PID for USB host transfer +#define MASK_UH_ENDP 0x0F // bit mask of endpoint number for USB host transfer + +#define R8_UH_RX_CTRL R8_UEP2_CTRL // host receiver endpoint control +#define RB_UH_R_TOG 0x80 // expected data toggle flag of host receiving (IN): 0=DATA0, 1=DATA1 +#define RB_UH_R_AUTO_TOG 0x10 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle +#define RB_UH_R_RES 0x04 // prepared handshake response type for host receiving (IN): 0=ACK (ready), 1=no response, time out to device, for isochronous transactions + +#define R8_UH_TX_LEN R8_UEP3_T_LEN // host transmittal endpoint transmittal length + +#define RB_UH_T_TOG 0x40 // prepared data toggle flag of host transmittal (SETUP/OUT): 0=DATA0, 1=DATA1 +#define RB_UH_T_AUTO_TOG 0x10 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle +#define RB_UH_T_RES 0x01 // expected handshake response type for host transmittal (SETUP/OUT): 0=ACK (ready), 1=no response, time out from device, for isochronous transactions + +#define R16_PIN_ANALOG_IE (*((uint16_t *)0x4000101A)) // RW, analog pin enable and digital input disable +#define RB_PIN_USB_IE 0x80 // RW, USB analog I/O enable: 0=analog I/O disable, 1=analog I/O enable +#define RB_PIN_USB_DP_PU 0x40 // RW, USB UDP internal pullup resistance enable: 0=enable/disable by RB_UC_DEV_PU_EN, 1=enable pullup, replace RB_UC_DEV_PU_EN under sleep mode +#define RB_PIN_USB2_IE 0x20 // RW, USB2 analog I/O enable: 0=analog I/O disable, 1=analog I/O enable +#define RB_PIN_USB2_DP_PU 0x10 // RW, USB2 UDP internal pullup resistance enable: 0=enable/disable by RB_UC_DEV_PU_EN, 1=enable pullup, replace RB_UC_DEV_PU_EN under sleep mode +/*!< USB Regs */ +typedef struct +{ + __IO uint8_t USB_CTRL; /*!< 0x40008000 */ + union { + __IO uint8_t UDEV_CTRL; /*!< 0x40008001 */ + __IO uint8_t UHOST_CTRL; /*!< 0x40008001 */ + }; + __IO uint8_t USB_INT_EN; /*!< 0x40008002 */ + __IO uint8_t USB_DEV_AD; /*!< 0x40008003 */ + __IO uint8_t USB_STATUS0; /*!< 0x40008004 */ + __IO uint8_t USB_MIS_ST; /*!< 0x40008005 */ + __IO uint8_t USB_INT_FG; /*!< 0x40008006 */ + __IO uint8_t USB_INT_ST; /*!< 0x40008007 */ + __IO uint8_t USB_RX_LEN; /*!< 0x40008008 */ + __IO uint8_t Reserve1; /*!< 0x40008009 */ + __IO uint8_t Reserve2; /*!< 0x4000800a */ + __IO uint8_t Reserve3; /*!< 0x4000800b */ + __IO uint8_t UEP4_1_MOD; /*!< 0x4000800c */ + union { + __IO uint8_t UEP2_3_MOD; /*!< 0x4000800d */ + __IO uint8_t UH_EP_MOD; /*!< 0x4000800d */ + }; + __IO uint8_t UEP567_MOD; /*!< 0x4000800e */ + __IO uint8_t Reserve4; /*!< 0x4000800f */ + __IO uint16_t UEP0_DMA; /*!< 0x40008010 */ + __IO uint16_t Reserve5; /*!< 0x40008012 */ + __IO uint16_t UEP1_DMA; /*!< 0x40008014 */ + __IO uint16_t Reserve6; /*!< 0x40008016 */ + union { + __IO uint16_t UEP2_DMA; /*!< 0x40008018 */ + __IO uint16_t UH_RX_DMA; /*!< 0x40008018 */ + }; + __IO uint16_t Reserve7; /*!< 0x4000801a */ + union { + __IO uint16_t UEP3_DMA; /*!< 0x4000801c */ + __IO uint16_t UH_TX_DMA; /*!< 0x4000801c */ + }; + __IO uint16_t Reserve8; /*!< 0x4000801e */ + __IO uint8_t UEP0_T_LEN; /*!< 0x40008020 */ + __IO uint8_t Reserve9; /*!< 0x40008021 */ + __IO uint8_t UEP0_CTRL; /*!< 0x40008022 */ + __IO uint8_t Reserve10; /*!< 0x40008023 */ + __IO uint8_t UEP1_T_LEN; /*!< 0x40008024 */ + __IO uint8_t Reserve11; /*!< 0x40008025 */ + union { + __IO uint8_t UEP1_CTRL; /*!< 0x40008026 */ + __IO uint8_t UH_SETUP; /*!< 0x40008026 */ + }; + __IO uint8_t Reserve12; /*!< 0x40008027 */ + union { + __IO uint8_t UEP2_T_LEN; /*!< 0x40008028 */ + __IO uint8_t UH_EP_PID; /*!< 0x40008028 */ + }; + __IO uint8_t Reserve13; /*!< 0x40008029 */ + union { + __IO uint8_t UEP2_CTRL; /*!< 0x4000802a */ + __IO uint8_t UH_RX_CTRL; /*!< 0x4000802a */ + }; + __IO uint8_t Reserve14; /*!< 0x4000802b */ + union { + __IO uint8_t UEP3_T_LEN; /*!< 0x4000802c */ + __IO uint8_t UH_TX_LEN; /*!< 0x4000802c */ + }; + __IO uint8_t Reserve15; /*!< 0x4000802d */ + union { + __IO uint8_t UEP3_CTRL; /*!< 0x4000802e */ + __IO uint8_t UH_TX_CTRL; /*!< 0x4000802e */ + }; + __IO uint8_t Reserve16; /*!< 0x4000802f */ + __IO uint8_t UEP4_T_LEN; /*!< 0x40008030 */ + __IO uint8_t Reserve17; /*!< 0x40008031 */ + __IO uint8_t UEP4_CTRL; /*!< 0x40008032 */ + __IO uint8_t Reserve18[33]; /*!< 0x40008033 */ + __IO uint16_t UEP5_DMA; /*!< 0x40008054 */ + __IO uint16_t Reserve19; /*!< 0x40008056 */ + __IO uint16_t UEP6_DMA; /*!< 0x40008058 */ + __IO uint16_t Reserve20; /*!< 0x4000805a */ + __IO uint16_t UEP7_DMA; /*!< 0x4000805c */ + __IO uint8_t Reserve21[6]; /*!< 0x4000805e */ + __IO uint8_t UEP5_T_LEN; /*!< 0x40008064 */ + __IO uint8_t Reserve22; /*!< 0x40008065 */ + __IO uint8_t UEP5_CTRL; /*!< 0x40008066 */ + __IO uint8_t Reserve23; /*!< 0x40008067 */ + __IO uint8_t UEP6_T_LEN; /*!< 0x40008068 */ + __IO uint8_t Reserve24; /*!< 0x40008069 */ + __IO uint8_t UEP6_CTRL; /*!< 0x4000806a */ + __IO uint8_t Reserve25; /*!< 0x4000806b */ + __IO uint8_t UEP7_T_LEN; /*!< 0x4000806c */ + __IO uint8_t Reserve26; /*!< 0x4000806d */ + __IO uint8_t UEP7_CTRL; /*!< 0x4000806e */ +} USB_FS_TypeDef; + +#ifdef __cplusplus +} +#endif diff --git a/src/lib/CherryUSB/port/chipidea/README.md b/src/lib/CherryUSB/port/chipidea/README.md new file mode 100644 index 000000000..c2c216025 --- /dev/null +++ b/src/lib/CherryUSB/port/chipidea/README.md @@ -0,0 +1,14 @@ +# Note + +## Support Chip List + +### NXP + +Modify USB_NOCACHE_RAM_SECTION + +``` +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".NonCacheable"))) +``` + +- IMRT10XX/IMRT11XX (chipidea + EHCI) +- MCXN9XX/MCXN236 (chipidea + EHCI) diff --git a/src/lib/CherryUSB/port/chipidea/usb_chipidea_reg.h b/src/lib/CherryUSB/port/chipidea/usb_chipidea_reg.h new file mode 100644 index 000000000..4867ef599 --- /dev/null +++ b/src/lib/CherryUSB/port/chipidea/usb_chipidea_reg.h @@ -0,0 +1,2249 @@ +/* + * Copyright (c) 2021-2024 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + + +#ifndef HPM_USB_H +#define HPM_USB_H + +#define __R volatile const /* Define "read-only" permission */ +#define __RW volatile /* Define "read-write" permission */ +#define __W volatile /* Define "write-only" permission */ + +typedef struct { + __R uint8_t RESERVED0[128]; /* 0x0 - 0x7F: Reserved */ + __RW uint32_t GPTIMER0LD; /* 0x80: General Purpose Timer #0 Load Register */ + __RW uint32_t GPTIMER0CTRL; /* 0x84: General Purpose Timer #0 Controller Register */ + __RW uint32_t GPTIMER1LD; /* 0x88: General Purpose Timer #1 Load Register */ + __RW uint32_t GPTIMER1CTRL; /* 0x8C: General Purpose Timer #1 Controller Register */ + __RW uint32_t SBUSCFG; /* 0x90: System Bus Config Register */ + __R uint8_t RESERVED1[172]; /* 0x94 - 0x13F: Reserved */ + __RW uint32_t USBCMD; /* 0x140: USB Command Register */ + __RW uint32_t USBSTS; /* 0x144: USB Status Register */ + __RW uint32_t USBINTR; /* 0x148: Interrupt Enable Register */ + __RW uint32_t FRINDEX; /* 0x14C: USB Frame Index Register */ + __R uint8_t RESERVED2[4]; /* 0x150 - 0x153: Reserved */ + union { + __RW uint32_t DEVICEADDR; /* 0x154: Device Address Register */ + __RW uint32_t PERIODICLISTBASE; /* 0x154: Frame List Base Address Register */ + }; + union { + __RW uint32_t ASYNCLISTADDR; /* 0x158: Next Asynch. Address Register */ + __RW uint32_t ENDPTLISTADDR; /* 0x158: Endpoint List Address Register */ + }; + __R uint8_t RESERVED3[4]; /* 0x15C - 0x15F: Reserved */ + __RW uint32_t BURSTSIZE; /* 0x160: Programmable Burst Size Register */ + __RW uint32_t TXFILLTUNING; /* 0x164: TX FIFO Fill Tuning Register */ + __R uint8_t RESERVED4[16]; /* 0x168 - 0x177: Reserved */ + __RW uint32_t ENDPTNAK; /* 0x178: Endpoint NAK Register */ + __RW uint32_t ENDPTNAKEN; /* 0x17C: Endpoint NAK Enable Register */ + __R uint8_t RESERVED5[4]; /* 0x180 - 0x183: Reserved */ + __RW uint32_t PORTSC1; /* 0x184: Port Status & Control */ + __R uint8_t RESERVED6[28]; /* 0x188 - 0x1A3: Reserved */ + __RW uint32_t OTGSC; /* 0x1A4: On-The-Go Status & control Register */ + __RW uint32_t USBMODE; /* 0x1A8: USB Device Mode Register */ + __RW uint32_t ENDPTSETUPSTAT; /* 0x1AC: Endpoint Setup Status Register */ + __RW uint32_t ENDPTPRIME; /* 0x1B0: Endpoint Prime Register */ + __RW uint32_t ENDPTFLUSH; /* 0x1B4: Endpoint Flush Register */ + __R uint32_t ENDPTSTAT; /* 0x1B8: Endpoint Status Register */ + __RW uint32_t ENDPTCOMPLETE; /* 0x1BC: Endpoint Complete Register */ + __RW uint32_t ENDPTCTRL[8]; /* 0x1C0 - 0x1DC: Endpoint Control0 Register... Endpoint Control7 Register */ +} CHIPIDEA_TypeDef; + + +/* Bitfield definition for register: GPTIMER0LD */ +/* + * GPTLD (RW) + * + * GPTLD + * General Purpose Timer Load Value + * These bit fields are loaded to GPTCNT bits when GPTRST bit is set '1b'. + * This value represents the time in microseconds minus 1 for the timer duration. + * Example: for a one millisecond timer, load 1000-1=999 or 0x0003E7. + * NOTE: Max value is 0xFFFFFF or 16.777215 seconds. + */ +#define USB_GPTIMER0LD_GPTLD_MASK (0xFFFFFFUL) +#define USB_GPTIMER0LD_GPTLD_SHIFT (0U) +#define USB_GPTIMER0LD_GPTLD_SET(x) (((uint32_t)(x) << USB_GPTIMER0LD_GPTLD_SHIFT) & USB_GPTIMER0LD_GPTLD_MASK) +#define USB_GPTIMER0LD_GPTLD_GET(x) (((uint32_t)(x) & USB_GPTIMER0LD_GPTLD_MASK) >> USB_GPTIMER0LD_GPTLD_SHIFT) + +/* Bitfield definition for register: GPTIMER0CTRL */ +/* + * GPTRUN (RW) + * + * GPTRUN + * General Purpose Timer Run + * GPTCNT bits are not effected when setting or clearing this bit. + * 0 - Stop counting + * 1 - Run + */ +#define USB_GPTIMER0CTRL_GPTRUN_MASK (0x80000000UL) +#define USB_GPTIMER0CTRL_GPTRUN_SHIFT (31U) +#define USB_GPTIMER0CTRL_GPTRUN_SET(x) (((uint32_t)(x) << USB_GPTIMER0CTRL_GPTRUN_SHIFT) & USB_GPTIMER0CTRL_GPTRUN_MASK) +#define USB_GPTIMER0CTRL_GPTRUN_GET(x) (((uint32_t)(x) & USB_GPTIMER0CTRL_GPTRUN_MASK) >> USB_GPTIMER0CTRL_GPTRUN_SHIFT) + +/* + * GPTRST (WO) + * + * GPTRST + * General Purpose Timer Reset + * 0 - No action + * 1 - Load counter value from GPTLD bits in n_GPTIMER0LD + */ +#define USB_GPTIMER0CTRL_GPTRST_MASK (0x40000000UL) +#define USB_GPTIMER0CTRL_GPTRST_SHIFT (30U) +#define USB_GPTIMER0CTRL_GPTRST_SET(x) (((uint32_t)(x) << USB_GPTIMER0CTRL_GPTRST_SHIFT) & USB_GPTIMER0CTRL_GPTRST_MASK) +#define USB_GPTIMER0CTRL_GPTRST_GET(x) (((uint32_t)(x) & USB_GPTIMER0CTRL_GPTRST_MASK) >> USB_GPTIMER0CTRL_GPTRST_SHIFT) + +/* + * GPTMODE (RW) + * + * GPTMODE + * General Purpose Timer Mode + * In one shot mode, the timer will count down to zero, generate an interrupt, and stop until the counter is + * reset by software; + * In repeat mode, the timer will count down to zero, generate an interrupt and automatically reload the + * counter value from GPTLD bits to start again. + * 0 - One Shot Mode + * 1 - Repeat Mode + */ +#define USB_GPTIMER0CTRL_GPTMODE_MASK (0x1000000UL) +#define USB_GPTIMER0CTRL_GPTMODE_SHIFT (24U) +#define USB_GPTIMER0CTRL_GPTMODE_SET(x) (((uint32_t)(x) << USB_GPTIMER0CTRL_GPTMODE_SHIFT) & USB_GPTIMER0CTRL_GPTMODE_MASK) +#define USB_GPTIMER0CTRL_GPTMODE_GET(x) (((uint32_t)(x) & USB_GPTIMER0CTRL_GPTMODE_MASK) >> USB_GPTIMER0CTRL_GPTMODE_SHIFT) + +/* + * GPTCNT (RO) + * + * GPTCNT + * General Purpose Timer Counter. + * This field is the count value of the countdown timer. + */ +#define USB_GPTIMER0CTRL_GPTCNT_MASK (0xFFFFFFUL) +#define USB_GPTIMER0CTRL_GPTCNT_SHIFT (0U) +#define USB_GPTIMER0CTRL_GPTCNT_GET(x) (((uint32_t)(x) & USB_GPTIMER0CTRL_GPTCNT_MASK) >> USB_GPTIMER0CTRL_GPTCNT_SHIFT) + +/* Bitfield definition for register: GPTIMER1LD */ +/* + * GPTLD (RW) + * + * GPTLD + * General Purpose Timer Load Value + * These bit fields are loaded to GPTCNT bits when GPTRST bit is set '1b'. + * This value represents the time in microseconds minus 1 for the timer duration. + * Example: for a one millisecond timer, load 1000-1=999 or 0x0003E7. + * NOTE: Max value is 0xFFFFFF or 16.777215 seconds. + */ +#define USB_GPTIMER1LD_GPTLD_MASK (0xFFFFFFUL) +#define USB_GPTIMER1LD_GPTLD_SHIFT (0U) +#define USB_GPTIMER1LD_GPTLD_SET(x) (((uint32_t)(x) << USB_GPTIMER1LD_GPTLD_SHIFT) & USB_GPTIMER1LD_GPTLD_MASK) +#define USB_GPTIMER1LD_GPTLD_GET(x) (((uint32_t)(x) & USB_GPTIMER1LD_GPTLD_MASK) >> USB_GPTIMER1LD_GPTLD_SHIFT) + +/* Bitfield definition for register: GPTIMER1CTRL */ +/* + * GPTRUN (RW) + * + * GPTRUN + * General Purpose Timer Run + * GPTCNT bits are not effected when setting or clearing this bit. + * 0 - Stop counting + * 1 - Run + */ +#define USB_GPTIMER1CTRL_GPTRUN_MASK (0x80000000UL) +#define USB_GPTIMER1CTRL_GPTRUN_SHIFT (31U) +#define USB_GPTIMER1CTRL_GPTRUN_SET(x) (((uint32_t)(x) << USB_GPTIMER1CTRL_GPTRUN_SHIFT) & USB_GPTIMER1CTRL_GPTRUN_MASK) +#define USB_GPTIMER1CTRL_GPTRUN_GET(x) (((uint32_t)(x) & USB_GPTIMER1CTRL_GPTRUN_MASK) >> USB_GPTIMER1CTRL_GPTRUN_SHIFT) + +/* + * GPTRST (WO) + * + * GPTRST + * General Purpose Timer Reset + * 0 - No action + * 1 - Load counter value from GPTLD bits in USB_n_GPTIMER1LD + */ +#define USB_GPTIMER1CTRL_GPTRST_MASK (0x40000000UL) +#define USB_GPTIMER1CTRL_GPTRST_SHIFT (30U) +#define USB_GPTIMER1CTRL_GPTRST_SET(x) (((uint32_t)(x) << USB_GPTIMER1CTRL_GPTRST_SHIFT) & USB_GPTIMER1CTRL_GPTRST_MASK) +#define USB_GPTIMER1CTRL_GPTRST_GET(x) (((uint32_t)(x) & USB_GPTIMER1CTRL_GPTRST_MASK) >> USB_GPTIMER1CTRL_GPTRST_SHIFT) + +/* + * GPTMODE (RW) + * + * GPTMODE + * General Purpose Timer Mode + * In one shot mode, the timer will count down to zero, generate an interrupt, and stop until the counter is + * reset by software. In repeat mode, the timer will count down to zero, generate an interrupt and + * automatically reload the counter value from GPTLD bits to start again. + * 0 - One Shot Mode + * 1 - Repeat Mode + */ +#define USB_GPTIMER1CTRL_GPTMODE_MASK (0x1000000UL) +#define USB_GPTIMER1CTRL_GPTMODE_SHIFT (24U) +#define USB_GPTIMER1CTRL_GPTMODE_SET(x) (((uint32_t)(x) << USB_GPTIMER1CTRL_GPTMODE_SHIFT) & USB_GPTIMER1CTRL_GPTMODE_MASK) +#define USB_GPTIMER1CTRL_GPTMODE_GET(x) (((uint32_t)(x) & USB_GPTIMER1CTRL_GPTMODE_MASK) >> USB_GPTIMER1CTRL_GPTMODE_SHIFT) + +/* + * GPTCNT (RO) + * + * GPTCNT + * General Purpose Timer Counter. + * This field is the count value of the countdown timer. + */ +#define USB_GPTIMER1CTRL_GPTCNT_MASK (0xFFFFFFUL) +#define USB_GPTIMER1CTRL_GPTCNT_SHIFT (0U) +#define USB_GPTIMER1CTRL_GPTCNT_GET(x) (((uint32_t)(x) & USB_GPTIMER1CTRL_GPTCNT_MASK) >> USB_GPTIMER1CTRL_GPTCNT_SHIFT) + +/* Bitfield definition for register: SBUSCFG */ +/* + * AHBBRST (RW) + * + * AHBBRST + * AHB master interface Burst configuration + * These bits control AHB master transfer type sequence (or priority). + * NOTE: This register overrides n_BURSTSIZE register when its value is not zero. + * 000 - Incremental burst of unspecified length only + * 001 - INCR4 burst, then single transfer + * 010 - INCR8 burst, INCR4 burst, then single transfer + * 011 - INCR16 burst, INCR8 burst, INCR4 burst, then single transfer + * 100 - Reserved, don't use + * 101 - INCR4 burst, then incremental burst of unspecified length + * 110 - INCR8 burst, INCR4 burst, then incremental burst of unspecified length + * 111 - INCR16 burst, INCR8 burst, INCR4 burst, then incremental burst of unspecified length + */ +#define USB_SBUSCFG_AHBBRST_MASK (0x7U) +#define USB_SBUSCFG_AHBBRST_SHIFT (0U) +#define USB_SBUSCFG_AHBBRST_SET(x) (((uint32_t)(x) << USB_SBUSCFG_AHBBRST_SHIFT) & USB_SBUSCFG_AHBBRST_MASK) +#define USB_SBUSCFG_AHBBRST_GET(x) (((uint32_t)(x) & USB_SBUSCFG_AHBBRST_MASK) >> USB_SBUSCFG_AHBBRST_SHIFT) + +/* Bitfield definition for register: USBCMD */ +/* + * ITC (RW) + * + * ITC + * Interrupt Threshold Control -Read/Write. + * The system software uses this field to set the maximum rate at which the host/device controller will issue interrupts. + * ITC contains the maximum interrupt interval measured in micro-frames. Valid values are + * shown below. + * Value Maximum Interrupt Interval + * 00000000 - Immediate (no threshold) + * 00000001 - 1 micro-frame + * 00000010 - 2 micro-frames + * 00000100 - 4 micro-frames + * 00001000 - 8 micro-frames + * 00010000 - 16 micro-frames + * 00100000 - 32 micro-frames + * 01000000 - 64 micro-frames + */ +#define USB_USBCMD_ITC_MASK (0xFF0000UL) +#define USB_USBCMD_ITC_SHIFT (16U) +#define USB_USBCMD_ITC_SET(x) (((uint32_t)(x) << USB_USBCMD_ITC_SHIFT) & USB_USBCMD_ITC_MASK) +#define USB_USBCMD_ITC_GET(x) (((uint32_t)(x) & USB_USBCMD_ITC_MASK) >> USB_USBCMD_ITC_SHIFT) + +/* + * FS_2 (RW) + * + * FS_2 + * Frame List Size - (Read/Write or Read Only). [host mode only] + * This field is Read/Write only if Programmable Frame List Flag in the HCCPARAMS registers is set to one. + * This field specifies the size of the frame list that controls which bits in the Frame Index Register should be used for the Frame List Current index. + * NOTE: This field is made up from USBCMD bits 15, 3 and 2. + * Value Meaning + * 0b000 - 1024 elements (4096 bytes) Default value + * 0b001 - 512 elements (2048 bytes) + * 0b010 - 256 elements (1024 bytes) + * 0b011 - 128 elements (512 bytes) + * 0b100 - 64 elements (256 bytes) + * 0b101 - 32 elements (128 bytes) + * 0b110 - 16 elements (64 bytes) + * 0b111 - 8 elements (32 bytes) + */ +#define USB_USBCMD_FS_2_MASK (0x8000U) +#define USB_USBCMD_FS_2_SHIFT (15U) +#define USB_USBCMD_FS_2_SET(x) (((uint32_t)(x) << USB_USBCMD_FS_2_SHIFT) & USB_USBCMD_FS_2_MASK) +#define USB_USBCMD_FS_2_GET(x) (((uint32_t)(x) & USB_USBCMD_FS_2_MASK) >> USB_USBCMD_FS_2_SHIFT) + +/* + * ATDTW (RW) + * + * ATDTW + * Add dTD TripWire - Read/Write. [device mode only] + * This bit is used as a semaphore to ensure proper addition of a new dTD to an active (primed) endpoint's + * linked list. This bit is set and cleared by software. + * This bit would also be cleared by hardware when state machine is hazard region for which adding a dTD + * to a primed endpoint may go unrecognized. + */ +#define USB_USBCMD_ATDTW_MASK (0x4000U) +#define USB_USBCMD_ATDTW_SHIFT (14U) +#define USB_USBCMD_ATDTW_SET(x) (((uint32_t)(x) << USB_USBCMD_ATDTW_SHIFT) & USB_USBCMD_ATDTW_MASK) +#define USB_USBCMD_ATDTW_GET(x) (((uint32_t)(x) & USB_USBCMD_ATDTW_MASK) >> USB_USBCMD_ATDTW_SHIFT) + +/* + * SUTW (RW) + * + * SUTW + * Setup TripWire - Read/Write. [device mode only] + * This bit is used as a semaphore to ensure that the setup data payload of 8 bytes is extracted from a QH by the DCD without being corrupted. + * If the setup lockout mode is off (SLOM bit in USB core register n_USBMODE, see USBMODE ) then + * there is a hazard when new setup data arrives while the DCD is copying the setup data payload + * from the QH for a previous setup packet. This bit is set and cleared by software. + * This bit would also be cleared by hardware when a hazard detected. + */ +#define USB_USBCMD_SUTW_MASK (0x2000U) +#define USB_USBCMD_SUTW_SHIFT (13U) +#define USB_USBCMD_SUTW_SET(x) (((uint32_t)(x) << USB_USBCMD_SUTW_SHIFT) & USB_USBCMD_SUTW_MASK) +#define USB_USBCMD_SUTW_GET(x) (((uint32_t)(x) & USB_USBCMD_SUTW_MASK) >> USB_USBCMD_SUTW_SHIFT) + +/* + * ASPE (RW) + * + * ASPE + * Asynchronous Schedule Park Mode Enable - Read/Write. + * If the Asynchronous Park Capability bit in the HCCPARAMS register is a one, then this bit defaults to a 1h and is R/W. + * Otherwise the bit must be a zero and is RO. Software uses this bit to enable or disable Park mode. + * When this bit is one, Park mode is enabled. When this bit is a zero, Park mode is disabled. + * NOTE: ASPE bit reset value: '0b' for OTG controller . + */ +#define USB_USBCMD_ASPE_MASK (0x800U) +#define USB_USBCMD_ASPE_SHIFT (11U) +#define USB_USBCMD_ASPE_SET(x) (((uint32_t)(x) << USB_USBCMD_ASPE_SHIFT) & USB_USBCMD_ASPE_MASK) +#define USB_USBCMD_ASPE_GET(x) (((uint32_t)(x) & USB_USBCMD_ASPE_MASK) >> USB_USBCMD_ASPE_SHIFT) + +/* + * ASP (RW) + * + * ASP + * Asynchronous Schedule Park Mode Count - Read/Write. + * If the Asynchronous Park Capability bit in the HCCPARAMS register is a one, then this field defaults to 3h and is R/W. Otherwise it defaults to zero and is Read-Only. + * It contains a count of the number of successive transactions the host controller is allowed to + * execute from a high-speed queue head on the Asynchronous schedule before continuing traversal of the Asynchronous schedule. + * Valid values are 1h to 3h. Software must not write a zero to this bit when Park Mode Enable is a one as this will result in undefined behavior. + * This field is set to 3h in all controller core. + */ +#define USB_USBCMD_ASP_MASK (0x300U) +#define USB_USBCMD_ASP_SHIFT (8U) +#define USB_USBCMD_ASP_SET(x) (((uint32_t)(x) << USB_USBCMD_ASP_SHIFT) & USB_USBCMD_ASP_MASK) +#define USB_USBCMD_ASP_GET(x) (((uint32_t)(x) & USB_USBCMD_ASP_MASK) >> USB_USBCMD_ASP_SHIFT) + +/* + * IAA (RW) + * + * IAA + * Interrupt on Async Advance Doorbell - Read/Write. + * This bit is used as a doorbell by software to tell the host controller to issue an interrupt the next time it advances asynchronous schedule. Software must write a 1 to this bit to ring the doorbell. + * When the host controller has evicted all appropriate cached schedule states, + * it sets the Interrupt on Async Advance status bit in the USBSTS register. + * If the Interrupt on Sync Advance Enable bit in the USBINTR register is one, then the host controller will assert an interrupt at the next interrupt threshold. + * The host controller sets this bit to zero after it has set the Interrupt on Sync Advance status bit in the USBSTS register to one. + * Software should not write a one to this bit when the asynchronous schedule is inactive. Doing so will yield undefined results. + * This bit is only used in host mode. Writing a one to this bit when device mode is selected will have undefined results. + */ +#define USB_USBCMD_IAA_MASK (0x40U) +#define USB_USBCMD_IAA_SHIFT (6U) +#define USB_USBCMD_IAA_SET(x) (((uint32_t)(x) << USB_USBCMD_IAA_SHIFT) & USB_USBCMD_IAA_MASK) +#define USB_USBCMD_IAA_GET(x) (((uint32_t)(x) & USB_USBCMD_IAA_MASK) >> USB_USBCMD_IAA_SHIFT) + +/* + * ASE (RW) + * + * ASE + * Asynchronous Schedule Enable - Read/Write. Default 0b. + * This bit controls whether the host controller skips processing the Asynchronous Schedule. + * Only the host controller uses this bit. + * Values Meaning + * 0 - Do not process the Asynchronous Schedule. + * 1 - Use the ASYNCLISTADDR register to access the Asynchronous Schedule. + */ +#define USB_USBCMD_ASE_MASK (0x20U) +#define USB_USBCMD_ASE_SHIFT (5U) +#define USB_USBCMD_ASE_SET(x) (((uint32_t)(x) << USB_USBCMD_ASE_SHIFT) & USB_USBCMD_ASE_MASK) +#define USB_USBCMD_ASE_GET(x) (((uint32_t)(x) & USB_USBCMD_ASE_MASK) >> USB_USBCMD_ASE_SHIFT) + +/* + * PSE (RW) + * + * PSE + * Periodic Schedule Enable- Read/Write. Default 0b. + * This bit controls whether the host controller skips processing the Periodic Schedule. + * Only the host controller uses this bit. + * Values Meaning + * 0 - Do not process the Periodic Schedule + * 1 - Use the PERIODICLISTBASE register to access the Periodic Schedule. + */ +#define USB_USBCMD_PSE_MASK (0x10U) +#define USB_USBCMD_PSE_SHIFT (4U) +#define USB_USBCMD_PSE_SET(x) (((uint32_t)(x) << USB_USBCMD_PSE_SHIFT) & USB_USBCMD_PSE_MASK) +#define USB_USBCMD_PSE_GET(x) (((uint32_t)(x) & USB_USBCMD_PSE_MASK) >> USB_USBCMD_PSE_SHIFT) + +/* + * FS_1 (RW) + * + * FS_1 + * See description at bit 15 + */ +#define USB_USBCMD_FS_1_MASK (0xCU) +#define USB_USBCMD_FS_1_SHIFT (2U) +#define USB_USBCMD_FS_1_SET(x) (((uint32_t)(x) << USB_USBCMD_FS_1_SHIFT) & USB_USBCMD_FS_1_MASK) +#define USB_USBCMD_FS_1_GET(x) (((uint32_t)(x) & USB_USBCMD_FS_1_MASK) >> USB_USBCMD_FS_1_SHIFT) + +/* + * RST (RW) + * + * RST + * Controller Reset (RESET) - Read/Write. Software uses this bit to reset the controller. + * This bit is set to zero by the Host/Device Controller when the reset process is complete. Software cannot terminate the reset process early by writing a zero to this register. + * Host operation mode: + * When software writes a one to this bit, the Controller resets its internal pipelines, timers, counters, state machines etc. to their initial value. + * Any transaction currently in progress on USB is immediately terminated. A USB reset is not driven on downstream ports. + * Software should not set this bit to a one when the HCHalted bit in the USBSTS register is a zero. + * Attempting to reset an actively running host controller will result in undefined behavior. + * Device operation mode: + * When software writes a one to this bit, the Controller resets its internal pipelines, timers, counters, state machines etc. to their initial value. + * Writing a one to this bit when the device is in the attached state is not recommended, because the effect on an attached host is undefined. + * In order to ensure that the device is not in an attached state before initiating a device controller reset, all primed endpoints should be flushed and the USBCMD Run/Stop bit should be set to 0. + */ +#define USB_USBCMD_RST_MASK (0x2U) +#define USB_USBCMD_RST_SHIFT (1U) +#define USB_USBCMD_RST_SET(x) (((uint32_t)(x) << USB_USBCMD_RST_SHIFT) & USB_USBCMD_RST_MASK) +#define USB_USBCMD_RST_GET(x) (((uint32_t)(x) & USB_USBCMD_RST_MASK) >> USB_USBCMD_RST_SHIFT) + +/* + * RS (RW) + * + * RS + * Run/Stop (RS) - Read/Write. Default 0b. 1=Run. 0=Stop. + * Host operation mode: + * When set to '1b', the Controller proceeds with the execution of the schedule. The Controller continues execution as long as this bit is set to a one. + * When this bit is set to 0, the Host Controller completes the current transaction on the USB and then halts. + * The HC Halted bit in the status register indicates when the Controller has finished the transaction and has entered the stopped state. + * Software should not write a one to this field unless the controller is in the Halted state (that is, HCHalted in the USBSTS register is a one). + * Device operation mode: + * Writing a one to this bit will cause the controller to enable a pull-up on D+ and initiate an attach event. + * This control bit is not directly connected to the pull-up enable, as the pull-up will become disabled upon transitioning into high-speed mode. + * Software should use this bit to prevent an attach event before the controller has been properly initialized. Writing a 0 to this will cause a detach event. + */ +#define USB_USBCMD_RS_MASK (0x1U) +#define USB_USBCMD_RS_SHIFT (0U) +#define USB_USBCMD_RS_SET(x) (((uint32_t)(x) << USB_USBCMD_RS_SHIFT) & USB_USBCMD_RS_MASK) +#define USB_USBCMD_RS_GET(x) (((uint32_t)(x) & USB_USBCMD_RS_MASK) >> USB_USBCMD_RS_SHIFT) + +/* Bitfield definition for register: USBSTS */ +/* + * TI1 (RWC) + * + * TI1 + * General Purpose Timer Interrupt 1(GPTINT1)--R/WC. + * This bit is set when the counter in the GPTIMER1CTRL register transitions to zero, writing a one to this + * bit will clear it. + */ +#define USB_USBSTS_TI1_MASK (0x2000000UL) +#define USB_USBSTS_TI1_SHIFT (25U) +#define USB_USBSTS_TI1_SET(x) (((uint32_t)(x) << USB_USBSTS_TI1_SHIFT) & USB_USBSTS_TI1_MASK) +#define USB_USBSTS_TI1_GET(x) (((uint32_t)(x) & USB_USBSTS_TI1_MASK) >> USB_USBSTS_TI1_SHIFT) + +/* + * TI0 (RWC) + * + * TI0 + * General Purpose Timer Interrupt 0(GPTINT0)--R/WC. + * This bit is set when the counter in the GPTIMER0CTRL register transitions to zero, writing a one to this + * bit clears it. + */ +#define USB_USBSTS_TI0_MASK (0x1000000UL) +#define USB_USBSTS_TI0_SHIFT (24U) +#define USB_USBSTS_TI0_SET(x) (((uint32_t)(x) << USB_USBSTS_TI0_SHIFT) & USB_USBSTS_TI0_MASK) +#define USB_USBSTS_TI0_GET(x) (((uint32_t)(x) & USB_USBSTS_TI0_MASK) >> USB_USBSTS_TI0_SHIFT) + +/* + * UPI (RWC) + * + * USB Host Periodic Interrupt – RWC. Default = 0b. + * This bit is set by the Host Controller when the cause of an interrupt is a completion of a USB transaction + * where the Transfer Descriptor (TD) has an interrupt on complete (IOC) bit set and the TD was from the periodic schedule. + * This bit is also set by the Host Controller when a short packet is detected and the packet is on the periodic schedule. + * A short packet is when the actual number of bytes received was less than expected. + * This bit is not used by the device controller and will always be zero. + */ +#define USB_USBSTS_UPI_MASK (0x80000UL) +#define USB_USBSTS_UPI_SHIFT (19U) +#define USB_USBSTS_UPI_SET(x) (((uint32_t)(x) << USB_USBSTS_UPI_SHIFT) & USB_USBSTS_UPI_MASK) +#define USB_USBSTS_UPI_GET(x) (((uint32_t)(x) & USB_USBSTS_UPI_MASK) >> USB_USBSTS_UPI_SHIFT) + +/* + * UAI (RWC) + * + * USB Host Asynchronous Interrupt – RWC. Default = 0b. + * This bit is set by the Host Controller when the cause of an interrupt is a completion of a USB transaction + * where the Transfer Descriptor (TD) has an interrupt on complete (IOC) bit set AND the TD was from the asynchronous schedule. + * This bit is also set by the Host when a short packet is detected and the packet is on the asynchronous schedule. + * A short packet is when the actual number of bytes received was less than expected. + * This bit is not used by the device controller and will always be zero + */ +#define USB_USBSTS_UAI_MASK (0x40000UL) +#define USB_USBSTS_UAI_SHIFT (18U) +#define USB_USBSTS_UAI_SET(x) (((uint32_t)(x) << USB_USBSTS_UAI_SHIFT) & USB_USBSTS_UAI_MASK) +#define USB_USBSTS_UAI_GET(x) (((uint32_t)(x) & USB_USBSTS_UAI_MASK) >> USB_USBSTS_UAI_SHIFT) + +/* + * NAKI (RO) + * + * NAKI + * NAK Interrupt Bit--RO. + * This bit is set by hardware when for a particular endpoint both the TX/RX Endpoint NAK bit and + * corresponding TX/RX Endpoint NAK Enable bit are set. This bit is automatically cleared by hardware + * when all Enabled TX/RX Endpoint NAK bits are cleared. + */ +#define USB_USBSTS_NAKI_MASK (0x10000UL) +#define USB_USBSTS_NAKI_SHIFT (16U) +#define USB_USBSTS_NAKI_GET(x) (((uint32_t)(x) & USB_USBSTS_NAKI_MASK) >> USB_USBSTS_NAKI_SHIFT) + +/* + * AS (RO) + * + * AS + * Asynchronous Schedule Status - Read Only. + * This bit reports the current real status of the Asynchronous Schedule. When set to zero the asynchronous schedule status is disabled and if set to one the status is enabled. + * The Host Controller is not required to immediately disable or enable the Asynchronous Schedule when software transitions the Asynchronous Schedule Enable bit in the USBCMD register. + * When this bit and the Asynchronous Schedule Enable bit are the same value, the Asynchronous Schedule is either enabled (1) or disabled (0). + * Only used in the host operation mode. + */ +#define USB_USBSTS_AS_MASK (0x8000U) +#define USB_USBSTS_AS_SHIFT (15U) +#define USB_USBSTS_AS_GET(x) (((uint32_t)(x) & USB_USBSTS_AS_MASK) >> USB_USBSTS_AS_SHIFT) + +/* + * PS (RO) + * + * PS + * Periodic Schedule Status - Read Only. + * This bit reports the current real status of the Periodic Schedule. When set to zero the periodic schedule is disabled, and if set to one the status is enabled. + * The Host Controller is not required to immediately disable or enable the Periodic Schedule when software transitions the Periodic Schedule Enable bit in the USBCMD register. + * When this bit and the Periodic Schedule Enable bit are the same value, the Periodic Schedule is either enabled (1) or disabled (0). + * Only used in the host operation mode. + */ +#define USB_USBSTS_PS_MASK (0x4000U) +#define USB_USBSTS_PS_SHIFT (14U) +#define USB_USBSTS_PS_GET(x) (((uint32_t)(x) & USB_USBSTS_PS_MASK) >> USB_USBSTS_PS_SHIFT) + +/* + * RCL (RO) + * + * RCL + * Reclamation - Read Only. + * This is a read-only status bit used to detect an empty asynchronous schedule. + * Only used in the host operation mode. + */ +#define USB_USBSTS_RCL_MASK (0x2000U) +#define USB_USBSTS_RCL_SHIFT (13U) +#define USB_USBSTS_RCL_GET(x) (((uint32_t)(x) & USB_USBSTS_RCL_MASK) >> USB_USBSTS_RCL_SHIFT) + +/* + * HCH (RO) + * + * HCH + * HCHaIted - Read Only. + * This bit is a zero whenever the Run/Stop bit is a one. + * The Controller sets this bit to one after it has stopped executing because of the Run/Stop bit being set to 0, + * either by software or by the Controller hardware (for example, an internal error). + * Only used in the host operation mode. + * Default value is '0b' for OTG core . + * This is because OTG core is not operating as host in default. Please see CM bit in USB_n_USBMODE + * register. + * NOTE: HCH bit reset value: '0b' for OTG controller core . + */ +#define USB_USBSTS_HCH_MASK (0x1000U) +#define USB_USBSTS_HCH_SHIFT (12U) +#define USB_USBSTS_HCH_GET(x) (((uint32_t)(x) & USB_USBSTS_HCH_MASK) >> USB_USBSTS_HCH_SHIFT) + +/* + * SLI (RWC) + * + * SLI + * DCSuspend - R/WC. + * When a controller enters a suspend state from an active state, this bit will be set to a one. The device controller clears the bit upon exiting from a suspend state. + * Only used in device operation mode. + */ +#define USB_USBSTS_SLI_MASK (0x100U) +#define USB_USBSTS_SLI_SHIFT (8U) +#define USB_USBSTS_SLI_SET(x) (((uint32_t)(x) << USB_USBSTS_SLI_SHIFT) & USB_USBSTS_SLI_MASK) +#define USB_USBSTS_SLI_GET(x) (((uint32_t)(x) & USB_USBSTS_SLI_MASK) >> USB_USBSTS_SLI_SHIFT) + +/* + * SRI (RWC) + * + * SRI + * SOF Received - R/WC. + * When the device controller detects a Start Of (micro) Frame, this bit will be set to a one. + * When a SOF is extremely late, the device controller will automatically set this bit to indicate that an SOF was expected. + * Therefore, this bit will be set roughly every 1ms in device FS mode and every 125ms in HS mode and will be synchronized to the actual SOF that is received. + * Because the device controller is initialized to FS before connect, this bit will be set at an interval of 1ms during the prelude to connect and chirp. + * In host mode, this bit will be set every 125us and can be used by host controller driver as a time base. + * Software writes a 1 to this bit to clear it. + */ +#define USB_USBSTS_SRI_MASK (0x80U) +#define USB_USBSTS_SRI_SHIFT (7U) +#define USB_USBSTS_SRI_SET(x) (((uint32_t)(x) << USB_USBSTS_SRI_SHIFT) & USB_USBSTS_SRI_MASK) +#define USB_USBSTS_SRI_GET(x) (((uint32_t)(x) & USB_USBSTS_SRI_MASK) >> USB_USBSTS_SRI_SHIFT) + +/* + * URI (RWC) + * + * URI + * USB Reset Received - R/WC. + * When the device controller detects a USB Reset and enters the default state, this bit will be set to a one. + * Software can write a 1 to this bit to clear the USB Reset Received status bit. + * Only used in device operation mode. + */ +#define USB_USBSTS_URI_MASK (0x40U) +#define USB_USBSTS_URI_SHIFT (6U) +#define USB_USBSTS_URI_SET(x) (((uint32_t)(x) << USB_USBSTS_URI_SHIFT) & USB_USBSTS_URI_MASK) +#define USB_USBSTS_URI_GET(x) (((uint32_t)(x) & USB_USBSTS_URI_MASK) >> USB_USBSTS_URI_SHIFT) + +/* + * AAI (RWC) + * + * AAI + * Interrupt on Async Advance - R/WC. + * System software can force the host controller to issue an interrupt the next time the host controller advances the asynchronous schedule + * by writing a one to the Interrupt on Async Advance Doorbell bit in the n_USBCMD register. This status bit indicates the assertion of that interrupt source. + * Only used in host operation mode. + */ +#define USB_USBSTS_AAI_MASK (0x20U) +#define USB_USBSTS_AAI_SHIFT (5U) +#define USB_USBSTS_AAI_SET(x) (((uint32_t)(x) << USB_USBSTS_AAI_SHIFT) & USB_USBSTS_AAI_MASK) +#define USB_USBSTS_AAI_GET(x) (((uint32_t)(x) & USB_USBSTS_AAI_MASK) >> USB_USBSTS_AAI_SHIFT) + +/* + * SEI (RWC) + * + * System Error – RWC. Default = 0b. + * In the BVCI implementation of the USBHS core, this bit is not used, and will always be cleared to '0b'. + * In the AMBA implementation, this bit will be set to '1b' when an Error response is seen by the master interface (HRESP[1:0]=ERROR) + */ +#define USB_USBSTS_SEI_MASK (0x10U) +#define USB_USBSTS_SEI_SHIFT (4U) +#define USB_USBSTS_SEI_SET(x) (((uint32_t)(x) << USB_USBSTS_SEI_SHIFT) & USB_USBSTS_SEI_MASK) +#define USB_USBSTS_SEI_GET(x) (((uint32_t)(x) & USB_USBSTS_SEI_MASK) >> USB_USBSTS_SEI_SHIFT) + +/* + * FRI (RWC) + * + * FRI + * Frame List Rollover - R/WC. + * The Host Controller sets this bit to a one when the Frame List Index rolls over from its maximum value to + * zero. The exact value at which the rollover occurs depends on the frame list size. For example. If the + * frame list size (as programmed in the Frame List Size field of the USB_n_USBCMD register) is 1024, the + * Frame Index Register rolls over every time FRINDEX [13] toggles. Similarly, if the size is 512, the Host + * Controller sets this bit to a one every time FHINDEX [12] toggles. + * Only used in host operation mode. + */ +#define USB_USBSTS_FRI_MASK (0x8U) +#define USB_USBSTS_FRI_SHIFT (3U) +#define USB_USBSTS_FRI_SET(x) (((uint32_t)(x) << USB_USBSTS_FRI_SHIFT) & USB_USBSTS_FRI_MASK) +#define USB_USBSTS_FRI_GET(x) (((uint32_t)(x) & USB_USBSTS_FRI_MASK) >> USB_USBSTS_FRI_SHIFT) + +/* + * PCI (RWC) + * + * PCI + * Port Change Detect - R/WC. + * The Host Controller sets this bit to a one when on any port a Connect Status occurs, a Port Enable/Disable Change occurs, + * or the Force Port Resume bit is set as the result of a J-K transition on the suspended port. + * The Device Controller sets this bit to a one when the port controller enters the full or high-speed operational state. + * When the port controller exits the full or high-speed operation states due to Reset or Suspend events, + * the notification mechanisms are the USB Reset Received bit and the DCSuspend bits Respectively. + */ +#define USB_USBSTS_PCI_MASK (0x4U) +#define USB_USBSTS_PCI_SHIFT (2U) +#define USB_USBSTS_PCI_SET(x) (((uint32_t)(x) << USB_USBSTS_PCI_SHIFT) & USB_USBSTS_PCI_MASK) +#define USB_USBSTS_PCI_GET(x) (((uint32_t)(x) & USB_USBSTS_PCI_MASK) >> USB_USBSTS_PCI_SHIFT) + +/* + * UEI (RWC) + * + * UEI + * USB Error Interrupt (USBERRINT) - R/WC. + * When completion of a USB transaction results in an error condition, this bit is set by the Host/Device Controller. + * This bit is set along with the USBINT bit, if the TD on which the error interrupt occurred also had its interrupt on complete (IOC) bit set. + */ +#define USB_USBSTS_UEI_MASK (0x2U) +#define USB_USBSTS_UEI_SHIFT (1U) +#define USB_USBSTS_UEI_SET(x) (((uint32_t)(x) << USB_USBSTS_UEI_SHIFT) & USB_USBSTS_UEI_MASK) +#define USB_USBSTS_UEI_GET(x) (((uint32_t)(x) & USB_USBSTS_UEI_MASK) >> USB_USBSTS_UEI_SHIFT) + +/* + * UI (RWC) + * + * UI + * USB Interrupt (USBINT) - R/WC. + * This bit is set by the Host/Device Controller when the cause of an interrupt is a completion of a USB + * transaction where the Transfer Descriptor (TD) has an interrupt on complete (IOC) bit set. + * This bit is also set by the Host/Device Controller when a short packet is detected. A short packet is when + * the actual number of bytes received was less than the expected number of bytes. + */ +#define USB_USBSTS_UI_MASK (0x1U) +#define USB_USBSTS_UI_SHIFT (0U) +#define USB_USBSTS_UI_SET(x) (((uint32_t)(x) << USB_USBSTS_UI_SHIFT) & USB_USBSTS_UI_MASK) +#define USB_USBSTS_UI_GET(x) (((uint32_t)(x) & USB_USBSTS_UI_MASK) >> USB_USBSTS_UI_SHIFT) + +/* Bitfield definition for register: USBINTR */ +/* + * TIE1 (RW) + * + * TIE1 + * General Purpose Timer #1 Interrupt Enable + * When this bit is one and the TI1 bit in n_USBSTS register is a one the controller will issue an interrupt. + */ +#define USB_USBINTR_TIE1_MASK (0x2000000UL) +#define USB_USBINTR_TIE1_SHIFT (25U) +#define USB_USBINTR_TIE1_SET(x) (((uint32_t)(x) << USB_USBINTR_TIE1_SHIFT) & USB_USBINTR_TIE1_MASK) +#define USB_USBINTR_TIE1_GET(x) (((uint32_t)(x) & USB_USBINTR_TIE1_MASK) >> USB_USBINTR_TIE1_SHIFT) + +/* + * TIE0 (RW) + * + * TIE0 + * General Purpose Timer #0 Interrupt Enable + * When this bit is one and the TI0 bit in n_USBSTS register is a one the controller will issue an interrupt. + */ +#define USB_USBINTR_TIE0_MASK (0x1000000UL) +#define USB_USBINTR_TIE0_SHIFT (24U) +#define USB_USBINTR_TIE0_SET(x) (((uint32_t)(x) << USB_USBINTR_TIE0_SHIFT) & USB_USBINTR_TIE0_MASK) +#define USB_USBINTR_TIE0_GET(x) (((uint32_t)(x) & USB_USBINTR_TIE0_MASK) >> USB_USBINTR_TIE0_SHIFT) + +/* + * UPIE (RW) + * + * UPIE + * USB Host Periodic Interrupt Enable + * When this bit is one, and the UPI bit in the n_USBSTS register is one, host controller will issue an + * interrupt at the next interrupt threshold. + */ +#define USB_USBINTR_UPIE_MASK (0x80000UL) +#define USB_USBINTR_UPIE_SHIFT (19U) +#define USB_USBINTR_UPIE_SET(x) (((uint32_t)(x) << USB_USBINTR_UPIE_SHIFT) & USB_USBINTR_UPIE_MASK) +#define USB_USBINTR_UPIE_GET(x) (((uint32_t)(x) & USB_USBINTR_UPIE_MASK) >> USB_USBINTR_UPIE_SHIFT) + +/* + * UAIE (RW) + * + * UAIE + * USB Host Asynchronous Interrupt Enable + * When this bit is one, and the UAI bit in the n_USBSTS register is one, host controller will issue an + * interrupt at the next interrupt threshold. + */ +#define USB_USBINTR_UAIE_MASK (0x40000UL) +#define USB_USBINTR_UAIE_SHIFT (18U) +#define USB_USBINTR_UAIE_SET(x) (((uint32_t)(x) << USB_USBINTR_UAIE_SHIFT) & USB_USBINTR_UAIE_MASK) +#define USB_USBINTR_UAIE_GET(x) (((uint32_t)(x) & USB_USBINTR_UAIE_MASK) >> USB_USBINTR_UAIE_SHIFT) + +/* + * NAKE (RO) + * + * NAKE + * NAK Interrupt Enable + * When this bit is one and the NAKI bit in n_USBSTS register is a one the controller will issue an interrupt. + */ +#define USB_USBINTR_NAKE_MASK (0x10000UL) +#define USB_USBINTR_NAKE_SHIFT (16U) +#define USB_USBINTR_NAKE_GET(x) (((uint32_t)(x) & USB_USBINTR_NAKE_MASK) >> USB_USBINTR_NAKE_SHIFT) + +/* + * SLE (RW) + * + * SLE + * Sleep Interrupt Enable + * When this bit is one and the SLI bit in n_n_USBSTS register is a one the controller will issue an interrupt. + * Only used in device operation mode. + */ +#define USB_USBINTR_SLE_MASK (0x100U) +#define USB_USBINTR_SLE_SHIFT (8U) +#define USB_USBINTR_SLE_SET(x) (((uint32_t)(x) << USB_USBINTR_SLE_SHIFT) & USB_USBINTR_SLE_MASK) +#define USB_USBINTR_SLE_GET(x) (((uint32_t)(x) & USB_USBINTR_SLE_MASK) >> USB_USBINTR_SLE_SHIFT) + +/* + * SRE (RW) + * + * SRE + * SOF Received Interrupt Enable + * When this bit is one and the SRI bit in n_USBSTS register is a one the controller will issue an interrupt. + */ +#define USB_USBINTR_SRE_MASK (0x80U) +#define USB_USBINTR_SRE_SHIFT (7U) +#define USB_USBINTR_SRE_SET(x) (((uint32_t)(x) << USB_USBINTR_SRE_SHIFT) & USB_USBINTR_SRE_MASK) +#define USB_USBINTR_SRE_GET(x) (((uint32_t)(x) & USB_USBINTR_SRE_MASK) >> USB_USBINTR_SRE_SHIFT) + +/* + * URE (RW) + * + * URE + * USB Reset Interrupt Enable + * When this bit is one and the URI bit in n_USBSTS register is a one the controller will issue an interrupt. + * Only used in device operation mode. + */ +#define USB_USBINTR_URE_MASK (0x40U) +#define USB_USBINTR_URE_SHIFT (6U) +#define USB_USBINTR_URE_SET(x) (((uint32_t)(x) << USB_USBINTR_URE_SHIFT) & USB_USBINTR_URE_MASK) +#define USB_USBINTR_URE_GET(x) (((uint32_t)(x) & USB_USBINTR_URE_MASK) >> USB_USBINTR_URE_SHIFT) + +/* + * AAE (RW) + * + * AAE + * Async Advance Interrupt Enable + * When this bit is one and the AAI bit in n_USBSTS register is a one the controller will issue an interrupt. + * Only used in host operation mode. + */ +#define USB_USBINTR_AAE_MASK (0x20U) +#define USB_USBINTR_AAE_SHIFT (5U) +#define USB_USBINTR_AAE_SET(x) (((uint32_t)(x) << USB_USBINTR_AAE_SHIFT) & USB_USBINTR_AAE_MASK) +#define USB_USBINTR_AAE_GET(x) (((uint32_t)(x) & USB_USBINTR_AAE_MASK) >> USB_USBINTR_AAE_SHIFT) + +/* + * SEE (RW) + * + * SEE + * System Error Interrupt Enable + * When this bit is one and the SEI bit in n_USBSTS register is a one the controller will issue an interrupt. + * Only used in host operation mode. + */ +#define USB_USBINTR_SEE_MASK (0x10U) +#define USB_USBINTR_SEE_SHIFT (4U) +#define USB_USBINTR_SEE_SET(x) (((uint32_t)(x) << USB_USBINTR_SEE_SHIFT) & USB_USBINTR_SEE_MASK) +#define USB_USBINTR_SEE_GET(x) (((uint32_t)(x) & USB_USBINTR_SEE_MASK) >> USB_USBINTR_SEE_SHIFT) + +/* + * FRE (RW) + * + * FRE + * Frame List Rollover Interrupt Enable + * When this bit is one and the FRI bit in n_USBSTS register is a one the controller will issue an interrupt. + * Only used in host operation mode. + */ +#define USB_USBINTR_FRE_MASK (0x8U) +#define USB_USBINTR_FRE_SHIFT (3U) +#define USB_USBINTR_FRE_SET(x) (((uint32_t)(x) << USB_USBINTR_FRE_SHIFT) & USB_USBINTR_FRE_MASK) +#define USB_USBINTR_FRE_GET(x) (((uint32_t)(x) & USB_USBINTR_FRE_MASK) >> USB_USBINTR_FRE_SHIFT) + +/* + * PCE (RW) + * + * PCE + * Port Change Detect Interrupt Enable + * When this bit is one and the PCI bit in n_USBSTS register is a one the controller will issue an interrupt. + */ +#define USB_USBINTR_PCE_MASK (0x4U) +#define USB_USBINTR_PCE_SHIFT (2U) +#define USB_USBINTR_PCE_SET(x) (((uint32_t)(x) << USB_USBINTR_PCE_SHIFT) & USB_USBINTR_PCE_MASK) +#define USB_USBINTR_PCE_GET(x) (((uint32_t)(x) & USB_USBINTR_PCE_MASK) >> USB_USBINTR_PCE_SHIFT) + +/* + * UEE (RWC) + * + * UEE + * USB Error Interrupt Enable + * When this bit is one and the UEI bit in n_USBSTS register is a one the controller will issue an interrupt. + */ +#define USB_USBINTR_UEE_MASK (0x2U) +#define USB_USBINTR_UEE_SHIFT (1U) +#define USB_USBINTR_UEE_SET(x) (((uint32_t)(x) << USB_USBINTR_UEE_SHIFT) & USB_USBINTR_UEE_MASK) +#define USB_USBINTR_UEE_GET(x) (((uint32_t)(x) & USB_USBINTR_UEE_MASK) >> USB_USBINTR_UEE_SHIFT) + +/* + * UE (RW) + * + * UE + * USB Interrupt Enable + * When this bit is one and the UI bit in n_USBSTS register is a one the controller will issue an interrupt. + */ +#define USB_USBINTR_UE_MASK (0x1U) +#define USB_USBINTR_UE_SHIFT (0U) +#define USB_USBINTR_UE_SET(x) (((uint32_t)(x) << USB_USBINTR_UE_SHIFT) & USB_USBINTR_UE_MASK) +#define USB_USBINTR_UE_GET(x) (((uint32_t)(x) & USB_USBINTR_UE_MASK) >> USB_USBINTR_UE_SHIFT) + +/* Bitfield definition for register: FRINDEX */ +/* + * FRINDEX (RW) + * + * FRINDEX + * Frame Index. + * The value, in this register, increments at the end of each time frame (micro-frame). Bits [N: 3] are used for the Frame List current index. + * This means that each location of the frame list is accessed 8 times (frames or micro-frames) before moving to the next index. + * The following illustrates values of N based on the value of the Frame List Size field in the USBCMD register, when used in host mode. + * USBCMD [Frame List Size] Number Elements N + * In device mode the value is the current frame number of the last frame transmitted. It is not used as an index. + * In either mode bits 2:0 indicate the current microframe. + * The bit field values description below is represented as (Frame List Size) Number Elements N. + * 00000000000000 - (1024) 12 + * 00000000000001 - (512) 11 + * 00000000000010 - (256) 10 + * 00000000000011 - (128) 9 + * 00000000000100 - (64) 8 + * 00000000000101 - (32) 7 + * 00000000000110 - (16) 6 + * 00000000000111 - (8) 5 + */ +#define USB_FRINDEX_FRINDEX_MASK (0x3FFFU) +#define USB_FRINDEX_FRINDEX_SHIFT (0U) +#define USB_FRINDEX_FRINDEX_SET(x) (((uint32_t)(x) << USB_FRINDEX_FRINDEX_SHIFT) & USB_FRINDEX_FRINDEX_MASK) +#define USB_FRINDEX_FRINDEX_GET(x) (((uint32_t)(x) & USB_FRINDEX_FRINDEX_MASK) >> USB_FRINDEX_FRINDEX_SHIFT) + +/* Bitfield definition for register: DEVICEADDR */ +/* + * USBADR (RW) + * + * USBADR + * Device Address. + * These bits correspond to the USB device address + */ +#define USB_DEVICEADDR_USBADR_MASK (0xFE000000UL) +#define USB_DEVICEADDR_USBADR_SHIFT (25U) +#define USB_DEVICEADDR_USBADR_SET(x) (((uint32_t)(x) << USB_DEVICEADDR_USBADR_SHIFT) & USB_DEVICEADDR_USBADR_MASK) +#define USB_DEVICEADDR_USBADR_GET(x) (((uint32_t)(x) & USB_DEVICEADDR_USBADR_MASK) >> USB_DEVICEADDR_USBADR_SHIFT) + +/* + * USBADRA (RW) + * + * USBADRA + * Device Address Advance. Default=0. + * When this bit is '0', any writes to USBADR are instantaneous. + * When this bit is written to a '1' at the same time or before USBADR is written, the write to the USBADR field is staged and held in a hidden register. + * After an IN occurs on endpoint 0 and is ACKed, USBADR will be loaded from the holding register. + * Hardware will automatically clear this bit on the following conditions: + * 1) IN is ACKed to endpoint 0. (USBADR is updated from staging register). + * 2) OUT/SETUP occur to endpoint 0. (USBADR is not updated). + * 3) Device Reset occurs (USBADR is reset to 0). + * NOTE: After the status phase of the SET_ADDRESS descriptor, the DCD has 2 ms to program the USBADR field. + * This mechanism will ensure this specification is met when the DCD can not write of the device address within 2ms from the SET_ADDRESS status phase. + * If the DCD writes the USBADR with USBADRA=1 after the SET_ADDRESS data phase (before the prime of the status phase), + * the USBADR will be programmed instantly at the correct time and meet the 2ms USB requirement. + */ +#define USB_DEVICEADDR_USBADRA_MASK (0x1000000UL) +#define USB_DEVICEADDR_USBADRA_SHIFT (24U) +#define USB_DEVICEADDR_USBADRA_SET(x) (((uint32_t)(x) << USB_DEVICEADDR_USBADRA_SHIFT) & USB_DEVICEADDR_USBADRA_MASK) +#define USB_DEVICEADDR_USBADRA_GET(x) (((uint32_t)(x) & USB_DEVICEADDR_USBADRA_MASK) >> USB_DEVICEADDR_USBADRA_SHIFT) + +/* Bitfield definition for register: PERIODICLISTBASE */ +/* + * BASEADR (RW) + * + * BASEADR + * Base Address (Low). + * These bits correspond to memory address signals [31:12], respectively. + * Only used by the host controller. + */ +#define USB_PERIODICLISTBASE_BASEADR_MASK (0xFFFFF000UL) +#define USB_PERIODICLISTBASE_BASEADR_SHIFT (12U) +#define USB_PERIODICLISTBASE_BASEADR_SET(x) (((uint32_t)(x) << USB_PERIODICLISTBASE_BASEADR_SHIFT) & USB_PERIODICLISTBASE_BASEADR_MASK) +#define USB_PERIODICLISTBASE_BASEADR_GET(x) (((uint32_t)(x) & USB_PERIODICLISTBASE_BASEADR_MASK) >> USB_PERIODICLISTBASE_BASEADR_SHIFT) + +/* Bitfield definition for register: ASYNCLISTADDR */ +/* + * ASYBASE (RW) + * + * ASYBASE + * Link Pointer Low (LPL). + * These bits correspond to memory address signals [31:5], respectively. This field may only reference a + * Queue Head (QH). + * Only used by the host controller. + */ +#define USB_ASYNCLISTADDR_ASYBASE_MASK (0xFFFFFFE0UL) +#define USB_ASYNCLISTADDR_ASYBASE_SHIFT (5U) +#define USB_ASYNCLISTADDR_ASYBASE_SET(x) (((uint32_t)(x) << USB_ASYNCLISTADDR_ASYBASE_SHIFT) & USB_ASYNCLISTADDR_ASYBASE_MASK) +#define USB_ASYNCLISTADDR_ASYBASE_GET(x) (((uint32_t)(x) & USB_ASYNCLISTADDR_ASYBASE_MASK) >> USB_ASYNCLISTADDR_ASYBASE_SHIFT) + +/* Bitfield definition for register: ENDPTLISTADDR */ +/* + * EPBASE (RW) + * + * EPBASE + * Endpoint List Pointer(Low). These bits correspond to memory address signals [31:11], respectively. + * This field will reference a list of up to 32 Queue Head (QH) (that is, one queue head per endpoint & direction). + */ +#define USB_ENDPTLISTADDR_EPBASE_MASK (0xFFFFF800UL) +#define USB_ENDPTLISTADDR_EPBASE_SHIFT (11U) +#define USB_ENDPTLISTADDR_EPBASE_SET(x) (((uint32_t)(x) << USB_ENDPTLISTADDR_EPBASE_SHIFT) & USB_ENDPTLISTADDR_EPBASE_MASK) +#define USB_ENDPTLISTADDR_EPBASE_GET(x) (((uint32_t)(x) & USB_ENDPTLISTADDR_EPBASE_MASK) >> USB_ENDPTLISTADDR_EPBASE_SHIFT) + +/* Bitfield definition for register: BURSTSIZE */ +/* + * TXPBURST (RW) + * + * TXPBURST + * Programmable TX Burst Size. + * Default value is determined by TXBURST bits in n_HWTXBUF. + * This register represents the maximum length of a the burst in 32-bit words while moving data from system + * memory to the USB bus. + */ +#define USB_BURSTSIZE_TXPBURST_MASK (0xFF00U) +#define USB_BURSTSIZE_TXPBURST_SHIFT (8U) +#define USB_BURSTSIZE_TXPBURST_SET(x) (((uint32_t)(x) << USB_BURSTSIZE_TXPBURST_SHIFT) & USB_BURSTSIZE_TXPBURST_MASK) +#define USB_BURSTSIZE_TXPBURST_GET(x) (((uint32_t)(x) & USB_BURSTSIZE_TXPBURST_MASK) >> USB_BURSTSIZE_TXPBURST_SHIFT) + +/* + * RXPBURST (RW) + * + * RXPBURST + * Programmable RX Burst Size. + * Default value is determined by TXBURST bits in n_HWRXBUF. + * This register represents the maximum length of a the burst in 32-bit words while moving data from the + * USB bus to system memory. + */ +#define USB_BURSTSIZE_RXPBURST_MASK (0xFFU) +#define USB_BURSTSIZE_RXPBURST_SHIFT (0U) +#define USB_BURSTSIZE_RXPBURST_SET(x) (((uint32_t)(x) << USB_BURSTSIZE_RXPBURST_SHIFT) & USB_BURSTSIZE_RXPBURST_MASK) +#define USB_BURSTSIZE_RXPBURST_GET(x) (((uint32_t)(x) & USB_BURSTSIZE_RXPBURST_MASK) >> USB_BURSTSIZE_RXPBURST_SHIFT) + +/* Bitfield definition for register: TXFILLTUNING */ +/* + * TXFIFOTHRES (RW) + * + * TXFIFOTHRES + * FIFO Burst Threshold. (Read/Write) + * This register controls the number of data bursts that are posted to the TX latency FIFO in host mode before the packet begins on to the bus. + * The minimum value is 2 and this value should be a low as possible to maximize USB performance. + * A higher value can be used in systems with unpredictable latency and/or insufficient bandwidth + * where the FIFO may underrun because the data transferred from the latency FIFO to USB occurs before it can be replenished from system memory. + * This value is ignored if the Stream Disable bit in USB_n_USBMODE register is set. + */ +#define USB_TXFILLTUNING_TXFIFOTHRES_MASK (0x3F0000UL) +#define USB_TXFILLTUNING_TXFIFOTHRES_SHIFT (16U) +#define USB_TXFILLTUNING_TXFIFOTHRES_SET(x) (((uint32_t)(x) << USB_TXFILLTUNING_TXFIFOTHRES_SHIFT) & USB_TXFILLTUNING_TXFIFOTHRES_MASK) +#define USB_TXFILLTUNING_TXFIFOTHRES_GET(x) (((uint32_t)(x) & USB_TXFILLTUNING_TXFIFOTHRES_MASK) >> USB_TXFILLTUNING_TXFIFOTHRES_SHIFT) + +/* + * TXSCHHEALTH (RWC) + * + * TXSCHHEALTH + * Scheduler Health Counter. (Read/Write To Clear) + * Table continues on the next page + * This register increments when the host controller fails to fill the TX latency FIFO to the level programmed by TXFIFOTHRES + * before running out of time to send the packet before the next Start-Of-Frame. + * This health counter measures the number of times this occurs to provide feedback to selecting a proper TXSCHOH. + * Writing to this register will clear the counter and this counter will max. at 31. + */ +#define USB_TXFILLTUNING_TXSCHHEALTH_MASK (0x1F00U) +#define USB_TXFILLTUNING_TXSCHHEALTH_SHIFT (8U) +#define USB_TXFILLTUNING_TXSCHHEALTH_SET(x) (((uint32_t)(x) << USB_TXFILLTUNING_TXSCHHEALTH_SHIFT) & USB_TXFILLTUNING_TXSCHHEALTH_MASK) +#define USB_TXFILLTUNING_TXSCHHEALTH_GET(x) (((uint32_t)(x) & USB_TXFILLTUNING_TXSCHHEALTH_MASK) >> USB_TXFILLTUNING_TXSCHHEALTH_SHIFT) + +/* + * TXSCHOH (RW) + * + * TXSCHOH + * Scheduler Overhead. (Read/Write) [Default = 0] + * This register adds an additional fixed offset to the schedule time estimator described above as Tff. + * As an approximation, the value chosen for this register should limit the number of back-off events captured + * in the TXSCHHEALTH to less than 10 per second in a highly utilized bus. + * Choosing a value that is too high for this register is not desired as it can needlessly reduce USB utilization. + * The time unit represented in this register is 1.267us when a device is connected in High-Speed Mode. + * The time unit represented in this register is 6.333us when a device is connected in Low/Full Speed Mode. + * Default value is '08h' for OTG controller core . + */ +#define USB_TXFILLTUNING_TXSCHOH_MASK (0x7FU) +#define USB_TXFILLTUNING_TXSCHOH_SHIFT (0U) +#define USB_TXFILLTUNING_TXSCHOH_SET(x) (((uint32_t)(x) << USB_TXFILLTUNING_TXSCHOH_SHIFT) & USB_TXFILLTUNING_TXSCHOH_MASK) +#define USB_TXFILLTUNING_TXSCHOH_GET(x) (((uint32_t)(x) & USB_TXFILLTUNING_TXSCHOH_MASK) >> USB_TXFILLTUNING_TXSCHOH_SHIFT) + +/* Bitfield definition for register: ENDPTNAK */ +/* + * EPTN (RWC) + * + * EPTN + * TX Endpoint NAK - R/WC. + * Each TX endpoint has 1 bit in this field. The bit is set when the + * device sends a NAK handshake on a received IN token for the corresponding endpoint. + * Bit [N] - Endpoint #[N], N is 0-7 + */ +#define USB_ENDPTNAK_EPTN_MASK (0xFFFF0000UL) +#define USB_ENDPTNAK_EPTN_SHIFT (16U) +#define USB_ENDPTNAK_EPTN_SET(x) (((uint32_t)(x) << USB_ENDPTNAK_EPTN_SHIFT) & USB_ENDPTNAK_EPTN_MASK) +#define USB_ENDPTNAK_EPTN_GET(x) (((uint32_t)(x) & USB_ENDPTNAK_EPTN_MASK) >> USB_ENDPTNAK_EPTN_SHIFT) + +/* + * EPRN (RWC) + * + * EPRN + * RX Endpoint NAK - R/WC. + * Each RX endpoint has 1 bit in this field. The bit is set when the + * device sends a NAK handshake on a received OUT or PING token for the corresponding endpoint. + * Bit [N] - Endpoint #[N], N is 0-7 + */ +#define USB_ENDPTNAK_EPRN_MASK (0xFFFFU) +#define USB_ENDPTNAK_EPRN_SHIFT (0U) +#define USB_ENDPTNAK_EPRN_SET(x) (((uint32_t)(x) << USB_ENDPTNAK_EPRN_SHIFT) & USB_ENDPTNAK_EPRN_MASK) +#define USB_ENDPTNAK_EPRN_GET(x) (((uint32_t)(x) & USB_ENDPTNAK_EPRN_MASK) >> USB_ENDPTNAK_EPRN_SHIFT) + +/* Bitfield definition for register: ENDPTNAKEN */ +/* + * EPTNE (RW) + * + * EPTNE + * TX Endpoint NAK Enable - R/W. + * Each bit is an enable bit for the corresponding TX Endpoint NAK bit. If this bit is set and the + * corresponding TX Endpoint NAK bit is set, the NAK Interrupt bit is set. + * Bit [N] - Endpoint #[N], N is 0-7 + */ +#define USB_ENDPTNAKEN_EPTNE_MASK (0xFFFF0000UL) +#define USB_ENDPTNAKEN_EPTNE_SHIFT (16U) +#define USB_ENDPTNAKEN_EPTNE_SET(x) (((uint32_t)(x) << USB_ENDPTNAKEN_EPTNE_SHIFT) & USB_ENDPTNAKEN_EPTNE_MASK) +#define USB_ENDPTNAKEN_EPTNE_GET(x) (((uint32_t)(x) & USB_ENDPTNAKEN_EPTNE_MASK) >> USB_ENDPTNAKEN_EPTNE_SHIFT) + +/* + * EPRNE (RW) + * + * EPRNE + * RX Endpoint NAK Enable - R/W. + * Each bit is an enable bit for the corresponding RX Endpoint NAK bit. If this bit is set and the + * corresponding RX Endpoint NAK bit is set, the NAK Interrupt bit is set. + * Bit [N] - Endpoint #[N], N is 0-7 + */ +#define USB_ENDPTNAKEN_EPRNE_MASK (0xFFFFU) +#define USB_ENDPTNAKEN_EPRNE_SHIFT (0U) +#define USB_ENDPTNAKEN_EPRNE_SET(x) (((uint32_t)(x) << USB_ENDPTNAKEN_EPRNE_SHIFT) & USB_ENDPTNAKEN_EPRNE_MASK) +#define USB_ENDPTNAKEN_EPRNE_GET(x) (((uint32_t)(x) & USB_ENDPTNAKEN_EPRNE_MASK) >> USB_ENDPTNAKEN_EPRNE_SHIFT) + +/* Bitfield definition for register: PORTSC1 */ +/* + * STS (RW) + * + * STS + * Serial Transceiver Select + * 1 Serial Interface Engine is selected + * 0 Parallel Interface signals is selected + * Serial Interface Engine can be used in combination with UTMI+/ULPI physical interface to provide FS/LS signaling instead of the parallel interface signals. + * When this bit is set '1b', serial interface engine will be used instead of parallel interface signals. + */ +#define USB_PORTSC1_STS_MASK (0x20000000UL) +#define USB_PORTSC1_STS_SHIFT (29U) +#define USB_PORTSC1_STS_SET(x) (((uint32_t)(x) << USB_PORTSC1_STS_SHIFT) & USB_PORTSC1_STS_MASK) +#define USB_PORTSC1_STS_GET(x) (((uint32_t)(x) & USB_PORTSC1_STS_MASK) >> USB_PORTSC1_STS_SHIFT) + +/* + * PTW (RW) + * + * PTW + * Parallel Transceiver Width + * This bit has no effect if serial interface engine is used. + * 0 - Select the 8-bit UTMI interface [60MHz] + * 1 - Select the 16-bit UTMI interface [30MHz] + */ +#define USB_PORTSC1_PTW_MASK (0x10000000UL) +#define USB_PORTSC1_PTW_SHIFT (28U) +#define USB_PORTSC1_PTW_SET(x) (((uint32_t)(x) << USB_PORTSC1_PTW_SHIFT) & USB_PORTSC1_PTW_MASK) +#define USB_PORTSC1_PTW_GET(x) (((uint32_t)(x) & USB_PORTSC1_PTW_MASK) >> USB_PORTSC1_PTW_SHIFT) + +/* + * PSPD (RO) + * + * PSPD + * Port Speed - Read Only. + * This register field indicates the speed at which the port is operating. + * 00 - Full Speed + * 01 - Low Speed + * 10 - High Speed + * 11 - Undefined + */ +#define USB_PORTSC1_PSPD_MASK (0xC000000UL) +#define USB_PORTSC1_PSPD_SHIFT (26U) +#define USB_PORTSC1_PSPD_GET(x) (((uint32_t)(x) & USB_PORTSC1_PSPD_MASK) >> USB_PORTSC1_PSPD_SHIFT) + +/* + * PFSC (RW) + * + * PFSC + * Port Force Full Speed Connect - Read/Write. Default = 0b. + * When this bit is set to '1b', the port will be forced to only connect at Full Speed, It disables the chirp + * sequence that allows the port to identify itself as High Speed. + * 0 - Normal operation + * 1 - Forced to full speed + */ +#define USB_PORTSC1_PFSC_MASK (0x1000000UL) +#define USB_PORTSC1_PFSC_SHIFT (24U) +#define USB_PORTSC1_PFSC_SET(x) (((uint32_t)(x) << USB_PORTSC1_PFSC_SHIFT) & USB_PORTSC1_PFSC_MASK) +#define USB_PORTSC1_PFSC_GET(x) (((uint32_t)(x) & USB_PORTSC1_PFSC_MASK) >> USB_PORTSC1_PFSC_SHIFT) + +/* + * PHCD (RW) + * + * PHCD + * PHY Low Power Suspend - Clock Disable (PLPSCD) - Read/Write. Default = 0b. + * When this bit is set to '1b', the PHY clock is disabled. Reading this bit will indicate the status of the PHY + * clock. + * NOTE: The PHY clock cannot be disabled if it is being used as the system clock. + * In device mode, The PHY can be put into Low Power Suspend when the device is not running (USBCMD + * Run/Stop=0b) or the host has signalled suspend (PORTSC1 SUSPEND=1b). PHY Low power suspend + * will be cleared automatically when the host initials resume. Before forcing a resume from the device, the + * device controller driver must clear this bit. + * In host mode, the PHY can be put into Low Power Suspend when the downstream device has been put + * into suspend mode or when no downstream device is connected. Low power suspend is completely + * under the control of software. + * 0 - Enable PHY clock + * 1 - Disable PHY clock + */ +#define USB_PORTSC1_PHCD_MASK (0x800000UL) +#define USB_PORTSC1_PHCD_SHIFT (23U) +#define USB_PORTSC1_PHCD_SET(x) (((uint32_t)(x) << USB_PORTSC1_PHCD_SHIFT) & USB_PORTSC1_PHCD_MASK) +#define USB_PORTSC1_PHCD_GET(x) (((uint32_t)(x) & USB_PORTSC1_PHCD_MASK) >> USB_PORTSC1_PHCD_SHIFT) + +/* + * WKOC (RW) + * + * WKOC + * Wake on Over-current Enable (WKOC_E) - Read/Write. Default = 0b. + * Writing this bit to a one enables the port to be sensitive to over-current conditions as wake-up events. + * This field is zero if Port Power(PORTSC1) is zero. + */ +#define USB_PORTSC1_WKOC_MASK (0x400000UL) +#define USB_PORTSC1_WKOC_SHIFT (22U) +#define USB_PORTSC1_WKOC_SET(x) (((uint32_t)(x) << USB_PORTSC1_WKOC_SHIFT) & USB_PORTSC1_WKOC_MASK) +#define USB_PORTSC1_WKOC_GET(x) (((uint32_t)(x) & USB_PORTSC1_WKOC_MASK) >> USB_PORTSC1_WKOC_SHIFT) + +/* + * WKDC (RW) + * + * WKDC + * Wake on Disconnect Enable (WKDSCNNT_E) - Read/Write. Default=0b. Writing this bit to a one enables + * the port to be sensitive to device disconnects as wake-up events. + * This field is zero if Port Power(PORTSC1) is zero or in device mode. + */ +#define USB_PORTSC1_WKDC_MASK (0x200000UL) +#define USB_PORTSC1_WKDC_SHIFT (21U) +#define USB_PORTSC1_WKDC_SET(x) (((uint32_t)(x) << USB_PORTSC1_WKDC_SHIFT) & USB_PORTSC1_WKDC_MASK) +#define USB_PORTSC1_WKDC_GET(x) (((uint32_t)(x) & USB_PORTSC1_WKDC_MASK) >> USB_PORTSC1_WKDC_SHIFT) + +/* + * WKCN (RW) + * + * WKCN + * Wake on Connect Enable (WKCNNT_E) - Read/Write. Default=0b. + * Writing this bit to a one enables the port to be sensitive to device connects as wake-up events. + * This field is zero if Port Power(PORTSC1) is zero or in device mode. + */ +#define USB_PORTSC1_WKCN_MASK (0x100000UL) +#define USB_PORTSC1_WKCN_SHIFT (20U) +#define USB_PORTSC1_WKCN_SET(x) (((uint32_t)(x) << USB_PORTSC1_WKCN_SHIFT) & USB_PORTSC1_WKCN_MASK) +#define USB_PORTSC1_WKCN_GET(x) (((uint32_t)(x) & USB_PORTSC1_WKCN_MASK) >> USB_PORTSC1_WKCN_SHIFT) + +/* + * PTC (RW) + * + * PTC + * Port Test Control - Read/Write. Default = 0000b. + * Refer to Port Test Mode for the operational model for using these test modes and the USB Specification Revision 2.0, Chapter 7 for details on each test mode. + * The FORCE_ENABLE_FS and FORCE ENABLE_LS are extensions to the test mode support specified in the EHCI specification. + * Writing the PTC field to any of the FORCE_ENABLE_{HS/FS/LS} values will force the port into the connected and enabled state at the selected speed. + * Writing the PTC field back to TEST_MODE_DISABLE will allow the port state machines to progress normally from that point. + * NOTE: Low speed operations are not supported as a peripheral device. + * Any other value than zero indicates that the port is operating in test mode. + * Value Specific Test + * 0000 - TEST_MODE_DISABLE + * 0001 - J_STATE + * 0010 - K_STATE + * 0011 - SE0 (host) / NAK (device) + * 0100 - Packet + * 0101 - FORCE_ENABLE_HS + * 0110 - FORCE_ENABLE_FS + * 0111 - FORCE_ENABLE_LS + * 1000-1111 - Reserved + */ +#define USB_PORTSC1_PTC_MASK (0xF0000UL) +#define USB_PORTSC1_PTC_SHIFT (16U) +#define USB_PORTSC1_PTC_SET(x) (((uint32_t)(x) << USB_PORTSC1_PTC_SHIFT) & USB_PORTSC1_PTC_MASK) +#define USB_PORTSC1_PTC_GET(x) (((uint32_t)(x) & USB_PORTSC1_PTC_MASK) >> USB_PORTSC1_PTC_SHIFT) + +/* + * PP (RW) + * + * PP + * Port Power (PP)-Read/Write or Read Only. + * The function of this bit depends on the value of the Port Power Switching (PPC) field in the HCSPARAMS register. The behavior is as follows: + * PPC + * PP Operation + * 0 + * 1b Read Only - Host controller does not have port power control switches. Each port is hard-wired to power. + * 1 + * 1b/0b - Read/Write. OTG controller requires port power control switches. This bit represents the current setting of the switch (0=off, 1=on). + * When power is not available on a port (that is, PP equals a 0), the port is non-functional and will not report attaches, detaches, etc. + * When an over-current condition is detected on a powered port and PPC is a one, + * the PP bit in each affected port may be transitional by the host controller driver from a one to a zero (removing power from the port). + * This feature is implemented in all controller cores (PPC = 1). + */ +#define USB_PORTSC1_PP_MASK (0x1000U) +#define USB_PORTSC1_PP_SHIFT (12U) +#define USB_PORTSC1_PP_SET(x) (((uint32_t)(x) << USB_PORTSC1_PP_SHIFT) & USB_PORTSC1_PP_MASK) +#define USB_PORTSC1_PP_GET(x) (((uint32_t)(x) & USB_PORTSC1_PP_MASK) >> USB_PORTSC1_PP_SHIFT) + +/* + * LS (RO) + * + * LS + * Line Status-Read Only. These bits reflect the current logical levels of the D+ (bit 11) and D- (bit 10) signal + * lines. + * In host mode, the use of linestate by the host controller driver is not necessary (unlike EHCI), because + * the port controller state machine and the port routing manage the connection of LS and FS. + * In device mode, the use of linestate by the device controller driver is not necessary. + * The encoding of the bits are: + * Bits [11:10] Meaning + * 00 - SE0 + * 01 - K-state + * 10 - J-state + * 11 - Undefined + */ +#define USB_PORTSC1_LS_MASK (0xC00U) +#define USB_PORTSC1_LS_SHIFT (10U) +#define USB_PORTSC1_LS_GET(x) (((uint32_t)(x) & USB_PORTSC1_LS_MASK) >> USB_PORTSC1_LS_SHIFT) + +/* + * HSP (RO) + * + * HSP + * High-Speed Port - Read Only. Default = 0b. + * When the bit is one, the host/device connected to the port is in high-speed mode and if set to zero, the + * host/device connected to the port is not in a high-speed mode. + * NOTE: HSP is redundant with PSPD(bit 27, 26) but remained for compatibility. + */ +#define USB_PORTSC1_HSP_MASK (0x200U) +#define USB_PORTSC1_HSP_SHIFT (9U) +#define USB_PORTSC1_HSP_GET(x) (((uint32_t)(x) & USB_PORTSC1_HSP_MASK) >> USB_PORTSC1_HSP_SHIFT) + +/* + * PR (RW) + * + * PR + * Port Reset - Read/Write or Read Only. Default = 0b. + * In Host Mode: Read/Write. 1=Port is in Reset. 0=Port is not in Reset. Default 0. + * When software writes a one to this bit the bus-reset sequence as defined in the USB Specification Revision 2.0 is started. + * This bit will automatically change to zero after the reset sequence is complete. + * This behavior is different from EHCI where the host controller driver is required to set this bit to a zero after the reset duration is timed in the driver. + * In Device Mode: This bit is a read only status bit. Device reset from the USB bus is also indicated in the USBSTS register. + */ +#define USB_PORTSC1_PR_MASK (0x100U) +#define USB_PORTSC1_PR_SHIFT (8U) +#define USB_PORTSC1_PR_SET(x) (((uint32_t)(x) << USB_PORTSC1_PR_SHIFT) & USB_PORTSC1_PR_MASK) +#define USB_PORTSC1_PR_GET(x) (((uint32_t)(x) & USB_PORTSC1_PR_MASK) >> USB_PORTSC1_PR_SHIFT) + +/* + * SUSP (RW) + * + * SUSP + * Suspend - Read/Write or Read Only. Default = 0b. + * 1=Port in suspend state. 0=Port not in suspend state. + * In Host Mode: Read/Write. + * Port Enabled Bit and Suspend bit of this register define the port states as follows: + * Bits [Port Enabled, Suspend] Port State + * 0x Disable + * 10 Enable + * 11 Suspend + * When in suspend state, downstream propagation of data is blocked on this port, except for port reset. + * The blocking occurs at the end of the current transaction if a transaction was in progress when this bit was written to 1. + * In the suspend state, the port is sensitive to resume detection. + * Note that the bit status does not change until the port is suspended and that there may be a delay in suspending a port if there is a transaction currently in progress on the USB. + * The host controller will unconditionally set this bit to zero when software sets the Force Port Resume bit to zero. The host controller ignores a write of zero to this bit. + * If host software sets this bit to a one when the port is not enabled (that is, Port enabled bit is a zero) the results are undefined. + * This field is zero if Port Power(PORTSC1) is zero in host mode. + * In Device Mode: Read Only. + * In device mode this bit is a read only status bit. + */ +#define USB_PORTSC1_SUSP_MASK (0x80U) +#define USB_PORTSC1_SUSP_SHIFT (7U) +#define USB_PORTSC1_SUSP_SET(x) (((uint32_t)(x) << USB_PORTSC1_SUSP_SHIFT) & USB_PORTSC1_SUSP_MASK) +#define USB_PORTSC1_SUSP_GET(x) (((uint32_t)(x) & USB_PORTSC1_SUSP_MASK) >> USB_PORTSC1_SUSP_SHIFT) + +/* + * FPR (RW) + * + * FPR + * Force Port Resume -Read/Write. 1= Resume detected/driven on port. 0=No resume (K-state) detected driven on port. Default = 0. + * In Host Mode: + * Software sets this bit to one to drive resume signaling. The Host Controller sets this bit to one if a J-to-K transition is detected while the port is in the Suspend state. + * When this bit transitions to a one because a J-to-K transition is detected, the Port Change Detect bit in the USBSTS register is also set to one. + * This bit will automatically change to zero after the resume sequence is complete. + * This behavior is different from EHCI where the host controller driver is required to set this bit to a zero after the resume duration is timed in the driver. + * Note that when the Host controller owns the port, the resume sequence follows the defined sequence documented in the USB Specification Revision 2.0. + * The resume signaling (Full-speed 'K') is driven on the port as long as this bit remains a one. This bit will remain a one until the port has switched to the high-speed idle. + * Writing a zero has no effect because the port controller will time the resume operation, clear the bit the port control state switches to HS or FS idle. + * This field is zero if Port Power(PORTSC1) is zero in host mode. + * This bit is not-EHCI compatible. + * In Device mode: + * After the device has been in Suspend State for 5ms or more, software must set this bit to one to drive resume signaling before clearing. + * The Device Controller will set this bit to one if a J-to-K transition is detected while the port is in the Suspend state. + * The bit will be cleared when the device returns to normal operation. + * Also, when this bit wil be cleared because a K-to-J transition detected, the Port Change Detect bit in the USBSTS register is also set to one. + */ +#define USB_PORTSC1_FPR_MASK (0x40U) +#define USB_PORTSC1_FPR_SHIFT (6U) +#define USB_PORTSC1_FPR_SET(x) (((uint32_t)(x) << USB_PORTSC1_FPR_SHIFT) & USB_PORTSC1_FPR_MASK) +#define USB_PORTSC1_FPR_GET(x) (((uint32_t)(x) & USB_PORTSC1_FPR_MASK) >> USB_PORTSC1_FPR_SHIFT) + +/* + * OCC (RW) + * + * OCC + * Over-current Change-R/WC. Default=0. + * This bit is set '1b' by hardware when there is a change to Over-current Active. Software can clear this bit by writing a one to this bit position. + */ +#define USB_PORTSC1_OCC_MASK (0x20U) +#define USB_PORTSC1_OCC_SHIFT (5U) +#define USB_PORTSC1_OCC_SET(x) (((uint32_t)(x) << USB_PORTSC1_OCC_SHIFT) & USB_PORTSC1_OCC_MASK) +#define USB_PORTSC1_OCC_GET(x) (((uint32_t)(x) & USB_PORTSC1_OCC_MASK) >> USB_PORTSC1_OCC_SHIFT) + +/* + * OCA (RO) + * + * OCA + * Over-current Active-Read Only. Default 0. + * This bit will automatically transition from one to zero when the over current condition is removed. + * 0 - This port does not have an over-current condition. + * 1 - This port currently has an over-current condition + */ +#define USB_PORTSC1_OCA_MASK (0x10U) +#define USB_PORTSC1_OCA_SHIFT (4U) +#define USB_PORTSC1_OCA_GET(x) (((uint32_t)(x) & USB_PORTSC1_OCA_MASK) >> USB_PORTSC1_OCA_SHIFT) + +/* + * PEC (RWC) + * + * PEC + * Port Enable/Disable Change-R/WC. 1=Port enabled/disabled status has changed. 0=No change. Default = 0. + * In Host Mode: + * For the root hub, this bit is set to a one only when a port is disabled due to disconnect on the port or + * due to the appropriate conditions existing at the EOF2 point (See Chapter 11 of the USB Specification). + * Software clears this by writing a one to it. + * This field is zero if Port Power(PORTSC1) is zero. + * In Device mode: + * The device port is always enabled, so this bit is always '0b'. + */ +#define USB_PORTSC1_PEC_MASK (0x8U) +#define USB_PORTSC1_PEC_SHIFT (3U) +#define USB_PORTSC1_PEC_SET(x) (((uint32_t)(x) << USB_PORTSC1_PEC_SHIFT) & USB_PORTSC1_PEC_MASK) +#define USB_PORTSC1_PEC_GET(x) (((uint32_t)(x) & USB_PORTSC1_PEC_MASK) >> USB_PORTSC1_PEC_SHIFT) + +/* + * PE (RWC) + * + * PE + * Port Enabled/Disabled-Read/Write. 1=Enable. 0=Disable. Default 0. + * In Host Mode: + * Ports can only be enabled by the host controller as a part of the reset and enable. Software cannot enable a port by writing a one to this field. + * Ports can be disabled by either a fault condition (disconnect event or other fault condition) or by the host software. + * Note that the bit status does not change until the port state actually changes. There may be a delay in disabling or enabling a port due to other host controller and bus events. + * When the port is disabled, (0b) downstream propagation of data is blocked except for reset. + * This field is zero if Port Power(PORTSC1) is zero in host mode. + * In Device Mode: + * The device port is always enabled, so this bit is always '1b'. + */ +#define USB_PORTSC1_PE_MASK (0x4U) +#define USB_PORTSC1_PE_SHIFT (2U) +#define USB_PORTSC1_PE_SET(x) (((uint32_t)(x) << USB_PORTSC1_PE_SHIFT) & USB_PORTSC1_PE_MASK) +#define USB_PORTSC1_PE_GET(x) (((uint32_t)(x) & USB_PORTSC1_PE_MASK) >> USB_PORTSC1_PE_SHIFT) + +/* + * CSC (RWC) + * + * CSC + * Connect Status Change-R/WC. 1 =Change in Current Connect Status. 0=No change. Default 0. + * In Host Mode: + * Indicates a change has occurred in the port's Current Connect Status. + * The host/device controller sets this bit for all changes to the port device connect status, even if system software has not cleared an existing connect status change. + * For example, the insertion status changes twice before system software has cleared the changed condition, + * hub hardware will be 'setting' an already-set bit (that is, the bit will remain set). Software clears this bit by writing a one to it. + * This field is zero if Port Power(PORTSC1) is zero in host mode. + * In Device Mode: + * This bit is undefined in device controller mode. + */ +#define USB_PORTSC1_CSC_MASK (0x2U) +#define USB_PORTSC1_CSC_SHIFT (1U) +#define USB_PORTSC1_CSC_SET(x) (((uint32_t)(x) << USB_PORTSC1_CSC_SHIFT) & USB_PORTSC1_CSC_MASK) +#define USB_PORTSC1_CSC_GET(x) (((uint32_t)(x) & USB_PORTSC1_CSC_MASK) >> USB_PORTSC1_CSC_SHIFT) + +/* + * CCS (RWC) + * + * CCS + * Current Connect Status-Read Only. + * In Host Mode: + * 1=Device is present on port. 0=No device is present. Default = 0. + * This value reflects the current state of the port, and may not correspond directly to the event that caused the Connect Status Change bit (Bit 1) to be set. + * This field is zero if Port Power(PORTSC1) is zero in host mode. + * In Device Mode: + * 1=Attached. 0=Not Attached. Default=0. + * A one indicates that the device successfully attached and is operating in either high speed or full speed as indicated by the High Speed Port bit in this register. + * A zero indicates that the device did not attach successfully or was forcibly disconnected by the software writing a zero to the Run bit in the USBCMD register. + * It does not state the device being disconnected or Suspended. + */ +#define USB_PORTSC1_CCS_MASK (0x1U) +#define USB_PORTSC1_CCS_SHIFT (0U) +#define USB_PORTSC1_CCS_SET(x) (((uint32_t)(x) << USB_PORTSC1_CCS_SHIFT) & USB_PORTSC1_CCS_MASK) +#define USB_PORTSC1_CCS_GET(x) (((uint32_t)(x) & USB_PORTSC1_CCS_MASK) >> USB_PORTSC1_CCS_SHIFT) + +/* Bitfield definition for register: OTGSC */ +/* + * ASVIE (RW) + * + * ASVIE + * A Session Valid Interrupt Enable - Read/Write. + */ +#define USB_OTGSC_ASVIE_MASK (0x4000000UL) +#define USB_OTGSC_ASVIE_SHIFT (26U) +#define USB_OTGSC_ASVIE_SET(x) (((uint32_t)(x) << USB_OTGSC_ASVIE_SHIFT) & USB_OTGSC_ASVIE_MASK) +#define USB_OTGSC_ASVIE_GET(x) (((uint32_t)(x) & USB_OTGSC_ASVIE_MASK) >> USB_OTGSC_ASVIE_SHIFT) + +/* + * AVVIE (RW) + * + * AVVIE + * A VBus Valid Interrupt Enable - Read/Write. + * Setting this bit enables the A VBus valid interrupt. + */ +#define USB_OTGSC_AVVIE_MASK (0x2000000UL) +#define USB_OTGSC_AVVIE_SHIFT (25U) +#define USB_OTGSC_AVVIE_SET(x) (((uint32_t)(x) << USB_OTGSC_AVVIE_SHIFT) & USB_OTGSC_AVVIE_MASK) +#define USB_OTGSC_AVVIE_GET(x) (((uint32_t)(x) & USB_OTGSC_AVVIE_MASK) >> USB_OTGSC_AVVIE_SHIFT) + +/* + * IDIE (RW) + * + * IDIE + * USB ID Interrupt Enable - Read/Write. + * Setting this bit enables the USB ID interrupt. + */ +#define USB_OTGSC_IDIE_MASK (0x1000000UL) +#define USB_OTGSC_IDIE_SHIFT (24U) +#define USB_OTGSC_IDIE_SET(x) (((uint32_t)(x) << USB_OTGSC_IDIE_SHIFT) & USB_OTGSC_IDIE_MASK) +#define USB_OTGSC_IDIE_GET(x) (((uint32_t)(x) & USB_OTGSC_IDIE_MASK) >> USB_OTGSC_IDIE_SHIFT) + +/* + * ASVIS (RWC) + * + * ASVIS + * A Session Valid Interrupt Status - Read/Write to Clear. + * This bit is set when VBus has either risen above or fallen below the A session valid threshold. + * Software must write a one to clear this bit. + */ +#define USB_OTGSC_ASVIS_MASK (0x40000UL) +#define USB_OTGSC_ASVIS_SHIFT (18U) +#define USB_OTGSC_ASVIS_SET(x) (((uint32_t)(x) << USB_OTGSC_ASVIS_SHIFT) & USB_OTGSC_ASVIS_MASK) +#define USB_OTGSC_ASVIS_GET(x) (((uint32_t)(x) & USB_OTGSC_ASVIS_MASK) >> USB_OTGSC_ASVIS_SHIFT) + +/* + * AVVIS (RWC) + * + * AVVIS + * A VBus Valid Interrupt Status - Read/Write to Clear. + * This bit is set when VBus has either risen above or fallen below the VBus valid threshold on an A device. + * Software must write a one to clear this bit. + */ +#define USB_OTGSC_AVVIS_MASK (0x20000UL) +#define USB_OTGSC_AVVIS_SHIFT (17U) +#define USB_OTGSC_AVVIS_SET(x) (((uint32_t)(x) << USB_OTGSC_AVVIS_SHIFT) & USB_OTGSC_AVVIS_MASK) +#define USB_OTGSC_AVVIS_GET(x) (((uint32_t)(x) & USB_OTGSC_AVVIS_MASK) >> USB_OTGSC_AVVIS_SHIFT) + +/* + * IDIS (RWC) + * + * IDIS + * USB ID Interrupt Status - Read/Write. + * This bit is set when a change on the ID input has been detected. + * Software must write a one to clear this bit. + */ +#define USB_OTGSC_IDIS_MASK (0x10000UL) +#define USB_OTGSC_IDIS_SHIFT (16U) +#define USB_OTGSC_IDIS_SET(x) (((uint32_t)(x) << USB_OTGSC_IDIS_SHIFT) & USB_OTGSC_IDIS_MASK) +#define USB_OTGSC_IDIS_GET(x) (((uint32_t)(x) & USB_OTGSC_IDIS_MASK) >> USB_OTGSC_IDIS_SHIFT) + +/* + * ASV (RO) + * + * ASV + * A Session Valid - Read Only. + * Indicates VBus is above the A session valid threshold. + */ +#define USB_OTGSC_ASV_MASK (0x400U) +#define USB_OTGSC_ASV_SHIFT (10U) +#define USB_OTGSC_ASV_GET(x) (((uint32_t)(x) & USB_OTGSC_ASV_MASK) >> USB_OTGSC_ASV_SHIFT) + +/* + * AVV (RO) + * + * AVV + * A VBus Valid - Read Only. + * Indicates VBus is above the A VBus valid threshold. + */ +#define USB_OTGSC_AVV_MASK (0x200U) +#define USB_OTGSC_AVV_SHIFT (9U) +#define USB_OTGSC_AVV_GET(x) (((uint32_t)(x) & USB_OTGSC_AVV_MASK) >> USB_OTGSC_AVV_SHIFT) + +/* + * ID (RO) + * + * ID + * USB ID - Read Only. + * 0 = A device, 1 = B device + */ +#define USB_OTGSC_ID_MASK (0x100U) +#define USB_OTGSC_ID_SHIFT (8U) +#define USB_OTGSC_ID_GET(x) (((uint32_t)(x) & USB_OTGSC_ID_MASK) >> USB_OTGSC_ID_SHIFT) + +/* + * IDPU (RW) + * + * IDPU + * ID Pullup - Read/Write + * This bit provide control over the ID pull-up resistor; 0 = off, 1 = on [default]. When this bit is 0, the ID input + * will not be sampled. + */ +#define USB_OTGSC_IDPU_MASK (0x20U) +#define USB_OTGSC_IDPU_SHIFT (5U) +#define USB_OTGSC_IDPU_SET(x) (((uint32_t)(x) << USB_OTGSC_IDPU_SHIFT) & USB_OTGSC_IDPU_MASK) +#define USB_OTGSC_IDPU_GET(x) (((uint32_t)(x) & USB_OTGSC_IDPU_MASK) >> USB_OTGSC_IDPU_SHIFT) + +/* + * VC (RW) + * + * VC + * VBUS Charge - Read/Write. + * Setting this bit causes the VBus line to be charged. This is used for VBus pulsing during SRP. + */ +#define USB_OTGSC_VC_MASK (0x2U) +#define USB_OTGSC_VC_SHIFT (1U) +#define USB_OTGSC_VC_SET(x) (((uint32_t)(x) << USB_OTGSC_VC_SHIFT) & USB_OTGSC_VC_MASK) +#define USB_OTGSC_VC_GET(x) (((uint32_t)(x) & USB_OTGSC_VC_MASK) >> USB_OTGSC_VC_SHIFT) + +/* + * VD (RW) + * + * VD + * VBUS_Discharge - Read/Write. + * Setting this bit causes VBus to discharge through a resistor. + */ +#define USB_OTGSC_VD_MASK (0x1U) +#define USB_OTGSC_VD_SHIFT (0U) +#define USB_OTGSC_VD_SET(x) (((uint32_t)(x) << USB_OTGSC_VD_SHIFT) & USB_OTGSC_VD_MASK) +#define USB_OTGSC_VD_GET(x) (((uint32_t)(x) & USB_OTGSC_VD_MASK) >> USB_OTGSC_VD_SHIFT) + +/* Bitfield definition for register: USBMODE */ +/* + * SDIS (RW) + * + * SDIS + * Stream Disable Mode. (0 - Inactive [default]; 1 - Active) + * Device Mode: Setting to a '1' disables double priming on both RX and TX for low bandwidth systems. + * This mode ensures that when the RX and TX buffers are sufficient to contain an entire packet that the standard double buffering scheme is disabled to prevent overruns/underruns in bandwidth limited systems. + * Note: In High Speed Mode, all packets received are responded to with a NYET handshake when stream disable is active. + * Host Mode: Setting to a '1' ensures that overruns/underruns of the latency FIFO are eliminated for low bandwidth systems + * where the RX and TX buffers are sufficient to contain the entire packet. Enabling stream disable also has the effect of ensuring the TX latency is filled to capacity before the packet is launched onto the USB. + * NOTE: Time duration to pre-fill the FIFO becomes significant when stream disable is active. See TXFILLTUNING and TXTTFILLTUNING [MPH Only] to characterize the adjustments needed for + * the scheduler when using this feature. + * NOTE: The use of this feature substantially limits of the overall USB performance that can be achieved. + */ +#define USB_USBMODE_SDIS_MASK (0x10U) +#define USB_USBMODE_SDIS_SHIFT (4U) +#define USB_USBMODE_SDIS_SET(x) (((uint32_t)(x) << USB_USBMODE_SDIS_SHIFT) & USB_USBMODE_SDIS_MASK) +#define USB_USBMODE_SDIS_GET(x) (((uint32_t)(x) & USB_USBMODE_SDIS_MASK) >> USB_USBMODE_SDIS_SHIFT) + +/* + * SLOM (RW) + * + * SLOM + * Setup Lockout Mode. In device mode, this bit controls behavior of the setup lock mechanism. See Control Endpoint Operation Model . + * 0 - Setup Lockouts On (default); + * 1 - Setup Lockouts Off. DCD requires use of Setup Data Buffer Tripwire in USBCMD. + */ +#define USB_USBMODE_SLOM_MASK (0x8U) +#define USB_USBMODE_SLOM_SHIFT (3U) +#define USB_USBMODE_SLOM_SET(x) (((uint32_t)(x) << USB_USBMODE_SLOM_SHIFT) & USB_USBMODE_SLOM_MASK) +#define USB_USBMODE_SLOM_GET(x) (((uint32_t)(x) & USB_USBMODE_SLOM_MASK) >> USB_USBMODE_SLOM_SHIFT) + +/* + * ES (RW) + * + * ES + * Endian Select - Read/Write. This bit can change the byte alignment of the transfer buffers to match the + * host microprocessor. The bit fields in the microprocessor interface and the data structures are unaffected + * by the value of this bit because they are based upon the 32-bit word. + * Bit Meaning + * 0 - Little Endian [Default] + * 1 - Big Endian + */ +#define USB_USBMODE_ES_MASK (0x4U) +#define USB_USBMODE_ES_SHIFT (2U) +#define USB_USBMODE_ES_SET(x) (((uint32_t)(x) << USB_USBMODE_ES_SHIFT) & USB_USBMODE_ES_MASK) +#define USB_USBMODE_ES_GET(x) (((uint32_t)(x) & USB_USBMODE_ES_MASK) >> USB_USBMODE_ES_SHIFT) + +/* + * CM (RW) + * + * CM + * Controller Mode - R/WO. Controller mode is defaulted to the proper mode for host only and device only + * implementations. For those designs that contain both host & device capability, the controller defaults to + * an idle state and needs to be initialized to the desired operating mode after reset. For combination host/ + * device controllers, this register can only be written once after reset. If it is necessary to switch modes, + * software must reset the controller by writing to the RESET bit in the USBCMD register before + * reprogramming this register. + * For OTG controller core, reset value is '00b'. + * 00 - Idle [Default for combination host/device] + * 01 - Reserved + * 10 - Device Controller [Default for device only controller] + * 11 - Host Controller [Default for host only controller] + */ +#define USB_USBMODE_CM_MASK (0x3U) +#define USB_USBMODE_CM_SHIFT (0U) +#define USB_USBMODE_CM_SET(x) (((uint32_t)(x) << USB_USBMODE_CM_SHIFT) & USB_USBMODE_CM_MASK) +#define USB_USBMODE_CM_GET(x) (((uint32_t)(x) & USB_USBMODE_CM_MASK) >> USB_USBMODE_CM_SHIFT) + +/* Bitfield definition for register: ENDPTSETUPSTAT */ +/* + * ENDPTSETUPSTAT (RWC) + * + * ENDPTSETUPSTAT + * Setup Endpoint Status. For every setup transaction that is received, a corresponding bit in this register is set to one. + * Software must clear or acknowledge the setup transfer by writing a one to a respective bit after it has read the setup data from Queue head. + * The response to a setup packet as in the order of operations and total response time is crucial to limit bus time outs while the setup lock out mechanism is engaged. + * This register is only used in device mode. + */ +#define USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_MASK (0xFFFFU) +#define USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SHIFT (0U) +#define USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SET(x) (((uint32_t)(x) << USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SHIFT) & USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_MASK) +#define USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_GET(x) (((uint32_t)(x) & USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_MASK) >> USB_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SHIFT) + +/* Bitfield definition for register: ENDPTPRIME */ +/* + * PETB (RWS) + * + * PETB + * Prime Endpoint Transmit Buffer - R/WS. For each endpoint a corresponding bit is used to request that a + * buffer is prepared for a transmit operation in order to respond to a USB IN/INTERRUPT transaction. + * Software should write a one to the corresponding bit when posting a new transfer descriptor to an + * endpoint queue head. Hardware automatically uses this bit to begin parsing for a new transfer descriptor + * from the queue head and prepare a transmit buffer. Hardware clears this bit when the associated + * endpoint(s) is (are) successfully primed. + * NOTE: These bits are momentarily set by hardware during hardware re-priming operations when a dTD + * is retired, and the dQH is updated. + * PETB[N] - Endpoint #N, N is in 0..7 + */ +#define USB_ENDPTPRIME_PETB_MASK (0xFFFF0000UL) +#define USB_ENDPTPRIME_PETB_SHIFT (16U) +#define USB_ENDPTPRIME_PETB_SET(x) (((uint32_t)(x) << USB_ENDPTPRIME_PETB_SHIFT) & USB_ENDPTPRIME_PETB_MASK) +#define USB_ENDPTPRIME_PETB_GET(x) (((uint32_t)(x) & USB_ENDPTPRIME_PETB_MASK) >> USB_ENDPTPRIME_PETB_SHIFT) + +/* + * PERB (RWS) + * + * PERB + * Prime Endpoint Receive Buffer - R/WS. For each endpoint, a corresponding bit is used to request a buffer prepare for a receive operation for when a USB host initiates a USB OUT transaction. + * Software should write a one to the corresponding bit whenever posting a new transfer descriptor to an endpoint queue head. + * Hardware automatically uses this bit to begin parsing for a new transfer descriptor from the queue head and prepare a receive buffer. + * Hardware clears this bit when the associated endpoint(s) is (are) successfully primed. + * NOTE: These bits are momentarily set by hardware during hardware re-priming operations when a dTD + * is retired, and the dQH is updated. + * PERB[N] - Endpoint #N, N is in 0..7 + */ +#define USB_ENDPTPRIME_PERB_MASK (0xFFFFU) +#define USB_ENDPTPRIME_PERB_SHIFT (0U) +#define USB_ENDPTPRIME_PERB_SET(x) (((uint32_t)(x) << USB_ENDPTPRIME_PERB_SHIFT) & USB_ENDPTPRIME_PERB_MASK) +#define USB_ENDPTPRIME_PERB_GET(x) (((uint32_t)(x) & USB_ENDPTPRIME_PERB_MASK) >> USB_ENDPTPRIME_PERB_SHIFT) + +/* Bitfield definition for register: ENDPTFLUSH */ +/* + * FETB (RWS) + * + * FETB + * Flush Endpoint Transmit Buffer - R/WS. Writing one to a bit(s) in this register causes the associated endpoint(s) to clear any primed buffers. + * If a packet is in progress for one of the associated endpoints, then that transfer continues until completion. + * Hardware clears this register after the endpoint flush operation is successful. + * FETB[N] - Endpoint #N, N is in 0..7 + */ +#define USB_ENDPTFLUSH_FETB_MASK (0xFFFF0000UL) +#define USB_ENDPTFLUSH_FETB_SHIFT (16U) +#define USB_ENDPTFLUSH_FETB_SET(x) (((uint32_t)(x) << USB_ENDPTFLUSH_FETB_SHIFT) & USB_ENDPTFLUSH_FETB_MASK) +#define USB_ENDPTFLUSH_FETB_GET(x) (((uint32_t)(x) & USB_ENDPTFLUSH_FETB_MASK) >> USB_ENDPTFLUSH_FETB_SHIFT) + +/* + * FERB (RWS) + * + * FERB + * Flush Endpoint Receive Buffer - R/WS. Writing one to a bit(s) causes the associated endpoint(s) to clear any primed buffers. + * If a packet is in progress for one of the associated endpoints, then that transfer continues until completion. + * Hardware clears this register after the endpoint flush operation is successful. + * FERB[N] - Endpoint #N, N is in 0..7 + */ +#define USB_ENDPTFLUSH_FERB_MASK (0xFFFFU) +#define USB_ENDPTFLUSH_FERB_SHIFT (0U) +#define USB_ENDPTFLUSH_FERB_SET(x) (((uint32_t)(x) << USB_ENDPTFLUSH_FERB_SHIFT) & USB_ENDPTFLUSH_FERB_MASK) +#define USB_ENDPTFLUSH_FERB_GET(x) (((uint32_t)(x) & USB_ENDPTFLUSH_FERB_MASK) >> USB_ENDPTFLUSH_FERB_SHIFT) + +/* Bitfield definition for register: ENDPTSTAT */ +/* + * ETBR (RO) + * + * ETBR + * Endpoint Transmit Buffer Ready -- Read Only. One bit for each endpoint indicates status of the respective endpoint buffer. + * This bit is set to one by the hardware as a response to receiving a command from a corresponding bit in the ENDPTPRIME register. + * There is always a delay between setting a bit in the ENDPTPRIME register and endpoint indicating ready. + * This delay time varies based upon the current USB traffic and the number of bits set in the ENDPRIME register. + * Buffer ready is cleared by USB reset, by the USB DMA system, or through the ENDPTFLUSH register. + * NOTE: These bits are momentarily cleared by hardware during hardware endpoint re-priming operations when a dTD is retired, and the dQH is updated. + * ETBR[N] - Endpoint #N, N is in 0..7 + */ +#define USB_ENDPTSTAT_ETBR_MASK (0xFFFF0000UL) +#define USB_ENDPTSTAT_ETBR_SHIFT (16U) +#define USB_ENDPTSTAT_ETBR_GET(x) (((uint32_t)(x) & USB_ENDPTSTAT_ETBR_MASK) >> USB_ENDPTSTAT_ETBR_SHIFT) + +/* + * ERBR (RO) + * + * ERBR + * Endpoint Receive Buffer Ready -- Read Only. One bit for each endpoint indicates status of the respective + * endpoint buffer. This bit is set to a one by the hardware as a response to receiving a command from a + * corresponding bit in the ENDPRIME register. There is always a delay between setting a bit in the + * ENDPRIME register and endpoint indicating ready. This delay time varies based upon the current USB + * traffic and the number of bits set in the ENDPRIME register. Buffer ready is cleared by USB reset, by the + * USB DMA system, or through the ENDPTFLUSH register. + * NOTE: These bits are momentarily cleared by hardware during hardware endpoint re-priming operations + * when a dTD is retired, and the dQH is updated. + * ERBR[N] - Endpoint #N, N is in 0..7 + */ +#define USB_ENDPTSTAT_ERBR_MASK (0xFFFFU) +#define USB_ENDPTSTAT_ERBR_SHIFT (0U) +#define USB_ENDPTSTAT_ERBR_GET(x) (((uint32_t)(x) & USB_ENDPTSTAT_ERBR_MASK) >> USB_ENDPTSTAT_ERBR_SHIFT) + +/* Bitfield definition for register: ENDPTCOMPLETE */ +/* + * ETCE (RWC) + * + * ETCE + * Endpoint Transmit Complete Event - R/WC. Each bit indicates a transmit event (IN/INTERRUPT) occurred and software should read the corresponding endpoint queue to determine the endpoint status. + * If the corresponding IOC bit is set in the Transfer Descriptor, then this bit is set simultaneously with the USBINT . Writing one clears the corresponding bit in this register. + * ETCE[N] - Endpoint #N, N is in 0..7 + */ +#define USB_ENDPTCOMPLETE_ETCE_MASK (0xFFFF0000UL) +#define USB_ENDPTCOMPLETE_ETCE_SHIFT (16U) +#define USB_ENDPTCOMPLETE_ETCE_SET(x) (((uint32_t)(x) << USB_ENDPTCOMPLETE_ETCE_SHIFT) & USB_ENDPTCOMPLETE_ETCE_MASK) +#define USB_ENDPTCOMPLETE_ETCE_GET(x) (((uint32_t)(x) & USB_ENDPTCOMPLETE_ETCE_MASK) >> USB_ENDPTCOMPLETE_ETCE_SHIFT) + +/* + * ERCE (RWC) + * + * ERCE + * Endpoint Receive Complete Event - RW/C. Each bit indicates a received event (OUT/SETUP) occurred + * and software should read the corresponding endpoint queue to determine the transfer status. If the + * corresponding IOC bit is set in the Transfer Descriptor, then this bit is set simultaneously with the + * USBINT . Writing one clears the corresponding bit in this register. + * ERCE[N] - Endpoint #N, N is in 0..7 + */ +#define USB_ENDPTCOMPLETE_ERCE_MASK (0xFFFFU) +#define USB_ENDPTCOMPLETE_ERCE_SHIFT (0U) +#define USB_ENDPTCOMPLETE_ERCE_SET(x) (((uint32_t)(x) << USB_ENDPTCOMPLETE_ERCE_SHIFT) & USB_ENDPTCOMPLETE_ERCE_MASK) +#define USB_ENDPTCOMPLETE_ERCE_GET(x) (((uint32_t)(x) & USB_ENDPTCOMPLETE_ERCE_MASK) >> USB_ENDPTCOMPLETE_ERCE_SHIFT) + +/* Bitfield definition for register array: ENDPTCTRL */ +/* + * TXE (RW) + * + * TXE + * TX Endpoint Enable + * 0 Disabled [Default] + * 1 Enabled + * An Endpoint should be enabled only after it has been configured. + */ +#define USB_ENDPTCTRL_TXE_MASK (0x800000UL) +#define USB_ENDPTCTRL_TXE_SHIFT (23U) +#define USB_ENDPTCTRL_TXE_SET(x) (((uint32_t)(x) << USB_ENDPTCTRL_TXE_SHIFT) & USB_ENDPTCTRL_TXE_MASK) +#define USB_ENDPTCTRL_TXE_GET(x) (((uint32_t)(x) & USB_ENDPTCTRL_TXE_MASK) >> USB_ENDPTCTRL_TXE_SHIFT) + +/* + * TXR (WS) + * + * TXR + * TX Data Toggle Reset (WS) + * Write 1 - Reset PID Sequence + * Whenever a configuration event is received for this Endpoint, software must write a one to this bit in order + * to synchronize the data PID's between the Host and device. + */ +#define USB_ENDPTCTRL_TXR_MASK (0x400000UL) +#define USB_ENDPTCTRL_TXR_SHIFT (22U) +#define USB_ENDPTCTRL_TXR_SET(x) (((uint32_t)(x) << USB_ENDPTCTRL_TXR_SHIFT) & USB_ENDPTCTRL_TXR_MASK) +#define USB_ENDPTCTRL_TXR_GET(x) (((uint32_t)(x) & USB_ENDPTCTRL_TXR_MASK) >> USB_ENDPTCTRL_TXR_SHIFT) + +/* + * TXT (RW) + * + * TXT + * TX Endpoint Type - Read/Write + * 00 Control + * 01 Isochronous + * 10 Bulk + * 11 Interrupt + */ +#define USB_ENDPTCTRL_TXT_MASK (0xC0000UL) +#define USB_ENDPTCTRL_TXT_SHIFT (18U) +#define USB_ENDPTCTRL_TXT_SET(x) (((uint32_t)(x) << USB_ENDPTCTRL_TXT_SHIFT) & USB_ENDPTCTRL_TXT_MASK) +#define USB_ENDPTCTRL_TXT_GET(x) (((uint32_t)(x) & USB_ENDPTCTRL_TXT_MASK) >> USB_ENDPTCTRL_TXT_SHIFT) + +/* + * TXS (RW) + * + * TXS + * TX Endpoint Stall - Read/Write + * 0 End Point OK + * 1 End Point Stalled + * This bit will be cleared automatically upon receipt of a SETUP request if this Endpoint is configured + * as a Control Endpoint and this bit will continue to be cleared by hardware until the associated ENDPTSETUPSTAT bit is cleared. + * Software can write a one to this bit to force the endpoint to return a STALL handshake to the Host. + * This control will continue to STALL until this bit is either cleared by software or automatically cleared as above for control endpoints. + * NOTE: [CONTROL ENDPOINT TYPES ONLY]: there is a slight delay (50 clocks max) between the ENDPTSETUPSTAT begin cleared and hardware continuing to clear this bit. + * In most systems, it is unlikely the DCD software will observe this delay. However, should the DCD observe that the stall bit is not set after writing a one to it then follow this procedure: + * continually write this stall bit until it is set or until a new setup has been received by checking the associated endptsetupstat Bit. + */ +#define USB_ENDPTCTRL_TXS_MASK (0x10000UL) +#define USB_ENDPTCTRL_TXS_SHIFT (16U) +#define USB_ENDPTCTRL_TXS_SET(x) (((uint32_t)(x) << USB_ENDPTCTRL_TXS_SHIFT) & USB_ENDPTCTRL_TXS_MASK) +#define USB_ENDPTCTRL_TXS_GET(x) (((uint32_t)(x) & USB_ENDPTCTRL_TXS_MASK) >> USB_ENDPTCTRL_TXS_SHIFT) + +/* + * RXE (RW) + * + * RXE + * RX Endpoint Enable + * 0 Disabled [Default] + * 1 Enabled + * An Endpoint should be enabled only after it has been configured. + */ +#define USB_ENDPTCTRL_RXE_MASK (0x80U) +#define USB_ENDPTCTRL_RXE_SHIFT (7U) +#define USB_ENDPTCTRL_RXE_SET(x) (((uint32_t)(x) << USB_ENDPTCTRL_RXE_SHIFT) & USB_ENDPTCTRL_RXE_MASK) +#define USB_ENDPTCTRL_RXE_GET(x) (((uint32_t)(x) & USB_ENDPTCTRL_RXE_MASK) >> USB_ENDPTCTRL_RXE_SHIFT) + +/* + * RXR (WS) + * + * RXR + * RX Data Toggle Reset (WS) + * Write 1 - Reset PID Sequence + * Whenever a configuration event is received for this Endpoint, software must write a one to this bit in order + * to synchronize the data PID's between the host and device. + */ +#define USB_ENDPTCTRL_RXR_MASK (0x40U) +#define USB_ENDPTCTRL_RXR_SHIFT (6U) +#define USB_ENDPTCTRL_RXR_SET(x) (((uint32_t)(x) << USB_ENDPTCTRL_RXR_SHIFT) & USB_ENDPTCTRL_RXR_MASK) +#define USB_ENDPTCTRL_RXR_GET(x) (((uint32_t)(x) & USB_ENDPTCTRL_RXR_MASK) >> USB_ENDPTCTRL_RXR_SHIFT) + +/* + * RXT (RW) + * + * RXT + * RX Endpoint Type - Read/Write + * 00 Control + * 01 Isochronous + * 10 Bulk + * 11 Interrupt + */ +#define USB_ENDPTCTRL_RXT_MASK (0xCU) +#define USB_ENDPTCTRL_RXT_SHIFT (2U) +#define USB_ENDPTCTRL_RXT_SET(x) (((uint32_t)(x) << USB_ENDPTCTRL_RXT_SHIFT) & USB_ENDPTCTRL_RXT_MASK) +#define USB_ENDPTCTRL_RXT_GET(x) (((uint32_t)(x) & USB_ENDPTCTRL_RXT_MASK) >> USB_ENDPTCTRL_RXT_SHIFT) + +/* + * RXS (RW) + * + * RXS + * RX Endpoint Stall - Read/Write + * 0 End Point OK. [Default] + * 1 End Point Stalled + * This bit is set automatically upon receipt of a SETUP request if this Endpoint is configured as a Control + * Endpointand this bit will continue to be cleared by hardware until the associated ENDPTSETUPSTAT bit + * is cleared. + * Software can write a one to this bit to force the endpoint to return a STALL handshake to the Host. This + * control will continue to STALL until this bit is either cleared by software or automatically cleared as above + * for control endpoints. + * NOTE: [CONTROL ENDPOINT TYPES ONLY]: there is a slight delay (50 clocks max) between the + * ENDPTSETUPSTAT begin cleared and hardware continuing to clear this bit. In most systems, it + * is unlikely the DCD software will observe this delay. However, should the DCD observe that the + * stall bit is not set after writing a one to it then follow this procedure: continually write this stall bit + * until it is set or until a new setup has been received by checking the associated endptsetupstat + * Bit. + */ +#define USB_ENDPTCTRL_RXS_MASK (0x1U) +#define USB_ENDPTCTRL_RXS_SHIFT (0U) +#define USB_ENDPTCTRL_RXS_SET(x) (((uint32_t)(x) << USB_ENDPTCTRL_RXS_SHIFT) & USB_ENDPTCTRL_RXS_MASK) +#define USB_ENDPTCTRL_RXS_GET(x) (((uint32_t)(x) & USB_ENDPTCTRL_RXS_MASK) >> USB_ENDPTCTRL_RXS_SHIFT) + +/* Bitfield definition for register: OTG_CTRL0 */ +/* + * OTG_WKDPDMCHG_EN (RW) + * + */ +#define USB_OTG_CTRL0_OTG_WKDPDMCHG_EN_MASK (0x2000000UL) +#define USB_OTG_CTRL0_OTG_WKDPDMCHG_EN_SHIFT (25U) +#define USB_OTG_CTRL0_OTG_WKDPDMCHG_EN_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_WKDPDMCHG_EN_SHIFT) & USB_OTG_CTRL0_OTG_WKDPDMCHG_EN_MASK) +#define USB_OTG_CTRL0_OTG_WKDPDMCHG_EN_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_WKDPDMCHG_EN_MASK) >> USB_OTG_CTRL0_OTG_WKDPDMCHG_EN_SHIFT) + +/* + * AUTORESUME_EN (RW) + * + */ +#define USB_OTG_CTRL0_AUTORESUME_EN_MASK (0x80000UL) +#define USB_OTG_CTRL0_AUTORESUME_EN_SHIFT (19U) +#define USB_OTG_CTRL0_AUTORESUME_EN_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_AUTORESUME_EN_SHIFT) & USB_OTG_CTRL0_AUTORESUME_EN_MASK) +#define USB_OTG_CTRL0_AUTORESUME_EN_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_AUTORESUME_EN_MASK) >> USB_OTG_CTRL0_AUTORESUME_EN_SHIFT) + +/* + * OTG_VBUS_WAKEUP_EN (RW) + * + */ +#define USB_OTG_CTRL0_OTG_VBUS_WAKEUP_EN_MASK (0x20000UL) +#define USB_OTG_CTRL0_OTG_VBUS_WAKEUP_EN_SHIFT (17U) +#define USB_OTG_CTRL0_OTG_VBUS_WAKEUP_EN_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_VBUS_WAKEUP_EN_SHIFT) & USB_OTG_CTRL0_OTG_VBUS_WAKEUP_EN_MASK) +#define USB_OTG_CTRL0_OTG_VBUS_WAKEUP_EN_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_VBUS_WAKEUP_EN_MASK) >> USB_OTG_CTRL0_OTG_VBUS_WAKEUP_EN_SHIFT) + +/* + * OTG_ID_WAKEUP_EN (RW) + * + */ +#define USB_OTG_CTRL0_OTG_ID_WAKEUP_EN_MASK (0x10000UL) +#define USB_OTG_CTRL0_OTG_ID_WAKEUP_EN_SHIFT (16U) +#define USB_OTG_CTRL0_OTG_ID_WAKEUP_EN_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_ID_WAKEUP_EN_SHIFT) & USB_OTG_CTRL0_OTG_ID_WAKEUP_EN_MASK) +#define USB_OTG_CTRL0_OTG_ID_WAKEUP_EN_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_ID_WAKEUP_EN_MASK) >> USB_OTG_CTRL0_OTG_ID_WAKEUP_EN_SHIFT) + +/* + * OTG_VBUS_SOURCE_SEL (RW) + * + */ +#define USB_OTG_CTRL0_OTG_VBUS_SOURCE_SEL_MASK (0x2000U) +#define USB_OTG_CTRL0_OTG_VBUS_SOURCE_SEL_SHIFT (13U) +#define USB_OTG_CTRL0_OTG_VBUS_SOURCE_SEL_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_VBUS_SOURCE_SEL_SHIFT) & USB_OTG_CTRL0_OTG_VBUS_SOURCE_SEL_MASK) +#define USB_OTG_CTRL0_OTG_VBUS_SOURCE_SEL_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_VBUS_SOURCE_SEL_MASK) >> USB_OTG_CTRL0_OTG_VBUS_SOURCE_SEL_SHIFT) + +/* + * OTG_UTMI_SUSPENDM_SW (RW) + * + * default 0 for naneng usbphy + */ +#define USB_OTG_CTRL0_OTG_UTMI_SUSPENDM_SW_MASK (0x1000U) +#define USB_OTG_CTRL0_OTG_UTMI_SUSPENDM_SW_SHIFT (12U) +#define USB_OTG_CTRL0_OTG_UTMI_SUSPENDM_SW_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_UTMI_SUSPENDM_SW_SHIFT) & USB_OTG_CTRL0_OTG_UTMI_SUSPENDM_SW_MASK) +#define USB_OTG_CTRL0_OTG_UTMI_SUSPENDM_SW_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_UTMI_SUSPENDM_SW_MASK) >> USB_OTG_CTRL0_OTG_UTMI_SUSPENDM_SW_SHIFT) + +/* + * OTG_UTMI_RESET_SW (RW) + * + * default 1 for naneng usbphy + */ +#define USB_OTG_CTRL0_OTG_UTMI_RESET_SW_MASK (0x800U) +#define USB_OTG_CTRL0_OTG_UTMI_RESET_SW_SHIFT (11U) +#define USB_OTG_CTRL0_OTG_UTMI_RESET_SW_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_UTMI_RESET_SW_SHIFT) & USB_OTG_CTRL0_OTG_UTMI_RESET_SW_MASK) +#define USB_OTG_CTRL0_OTG_UTMI_RESET_SW_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_UTMI_RESET_SW_MASK) >> USB_OTG_CTRL0_OTG_UTMI_RESET_SW_SHIFT) + +/* + * OTG_WAKEUP_INT_ENABLE (RW) + * + */ +#define USB_OTG_CTRL0_OTG_WAKEUP_INT_ENABLE_MASK (0x400U) +#define USB_OTG_CTRL0_OTG_WAKEUP_INT_ENABLE_SHIFT (10U) +#define USB_OTG_CTRL0_OTG_WAKEUP_INT_ENABLE_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_WAKEUP_INT_ENABLE_SHIFT) & USB_OTG_CTRL0_OTG_WAKEUP_INT_ENABLE_MASK) +#define USB_OTG_CTRL0_OTG_WAKEUP_INT_ENABLE_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_WAKEUP_INT_ENABLE_MASK) >> USB_OTG_CTRL0_OTG_WAKEUP_INT_ENABLE_SHIFT) + +/* + * OTG_POWER_MASK (RW) + * + */ +#define USB_OTG_CTRL0_OTG_POWER_MASK_MASK (0x200U) +#define USB_OTG_CTRL0_OTG_POWER_MASK_SHIFT (9U) +#define USB_OTG_CTRL0_OTG_POWER_MASK_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_POWER_MASK_SHIFT) & USB_OTG_CTRL0_OTG_POWER_MASK_MASK) +#define USB_OTG_CTRL0_OTG_POWER_MASK_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_POWER_MASK_MASK) >> USB_OTG_CTRL0_OTG_POWER_MASK_SHIFT) + +/* + * OTG_OVER_CUR_POL (RW) + * + */ +#define USB_OTG_CTRL0_OTG_OVER_CUR_POL_MASK (0x100U) +#define USB_OTG_CTRL0_OTG_OVER_CUR_POL_SHIFT (8U) +#define USB_OTG_CTRL0_OTG_OVER_CUR_POL_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_OVER_CUR_POL_SHIFT) & USB_OTG_CTRL0_OTG_OVER_CUR_POL_MASK) +#define USB_OTG_CTRL0_OTG_OVER_CUR_POL_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_OVER_CUR_POL_MASK) >> USB_OTG_CTRL0_OTG_OVER_CUR_POL_SHIFT) + +/* + * OTG_OVER_CUR_DIS (RW) + * + */ +#define USB_OTG_CTRL0_OTG_OVER_CUR_DIS_MASK (0x80U) +#define USB_OTG_CTRL0_OTG_OVER_CUR_DIS_SHIFT (7U) +#define USB_OTG_CTRL0_OTG_OVER_CUR_DIS_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_OTG_OVER_CUR_DIS_SHIFT) & USB_OTG_CTRL0_OTG_OVER_CUR_DIS_MASK) +#define USB_OTG_CTRL0_OTG_OVER_CUR_DIS_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_OTG_OVER_CUR_DIS_MASK) >> USB_OTG_CTRL0_OTG_OVER_CUR_DIS_SHIFT) + +/* + * SER_MODE_SUSPEND_EN (RW) + * + * for naneng usbphy, only switch to serial mode when suspend + */ +#define USB_OTG_CTRL0_SER_MODE_SUSPEND_EN_MASK (0x10U) +#define USB_OTG_CTRL0_SER_MODE_SUSPEND_EN_SHIFT (4U) +#define USB_OTG_CTRL0_SER_MODE_SUSPEND_EN_SET(x) (((uint32_t)(x) << USB_OTG_CTRL0_SER_MODE_SUSPEND_EN_SHIFT) & USB_OTG_CTRL0_SER_MODE_SUSPEND_EN_MASK) +#define USB_OTG_CTRL0_SER_MODE_SUSPEND_EN_GET(x) (((uint32_t)(x) & USB_OTG_CTRL0_SER_MODE_SUSPEND_EN_MASK) >> USB_OTG_CTRL0_SER_MODE_SUSPEND_EN_SHIFT) + +/* Bitfield definition for register: PHY_CTRL0 */ +/* + * GPIO_ID_SEL_N (RW) + * + */ +#define USB_PHY_CTRL0_GPIO_ID_SEL_N_MASK (0x2000000UL) +#define USB_PHY_CTRL0_GPIO_ID_SEL_N_SHIFT (25U) +#define USB_PHY_CTRL0_GPIO_ID_SEL_N_SET(x) (((uint32_t)(x) << USB_PHY_CTRL0_GPIO_ID_SEL_N_SHIFT) & USB_PHY_CTRL0_GPIO_ID_SEL_N_MASK) +#define USB_PHY_CTRL0_GPIO_ID_SEL_N_GET(x) (((uint32_t)(x) & USB_PHY_CTRL0_GPIO_ID_SEL_N_MASK) >> USB_PHY_CTRL0_GPIO_ID_SEL_N_SHIFT) + +/* + * ID_DIG_OVERRIDE (RW) + * + */ +#define USB_PHY_CTRL0_ID_DIG_OVERRIDE_MASK (0x4000U) +#define USB_PHY_CTRL0_ID_DIG_OVERRIDE_SHIFT (14U) +#define USB_PHY_CTRL0_ID_DIG_OVERRIDE_SET(x) (((uint32_t)(x) << USB_PHY_CTRL0_ID_DIG_OVERRIDE_SHIFT) & USB_PHY_CTRL0_ID_DIG_OVERRIDE_MASK) +#define USB_PHY_CTRL0_ID_DIG_OVERRIDE_GET(x) (((uint32_t)(x) & USB_PHY_CTRL0_ID_DIG_OVERRIDE_MASK) >> USB_PHY_CTRL0_ID_DIG_OVERRIDE_SHIFT) + +/* + * SESS_VALID_OVERRIDE (RW) + * + */ +#define USB_PHY_CTRL0_SESS_VALID_OVERRIDE_MASK (0x2000U) +#define USB_PHY_CTRL0_SESS_VALID_OVERRIDE_SHIFT (13U) +#define USB_PHY_CTRL0_SESS_VALID_OVERRIDE_SET(x) (((uint32_t)(x) << USB_PHY_CTRL0_SESS_VALID_OVERRIDE_SHIFT) & USB_PHY_CTRL0_SESS_VALID_OVERRIDE_MASK) +#define USB_PHY_CTRL0_SESS_VALID_OVERRIDE_GET(x) (((uint32_t)(x) & USB_PHY_CTRL0_SESS_VALID_OVERRIDE_MASK) >> USB_PHY_CTRL0_SESS_VALID_OVERRIDE_SHIFT) + +/* + * VBUS_VALID_OVERRIDE (RW) + * + */ +#define USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_MASK (0x1000U) +#define USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_SHIFT (12U) +#define USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_SET(x) (((uint32_t)(x) << USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_SHIFT) & USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_MASK) +#define USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_GET(x) (((uint32_t)(x) & USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_MASK) >> USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_SHIFT) + +/* + * ID_DIG_OVERRIDE_EN (RW) + * + */ +#define USB_PHY_CTRL0_ID_DIG_OVERRIDE_EN_MASK (0x4U) +#define USB_PHY_CTRL0_ID_DIG_OVERRIDE_EN_SHIFT (2U) +#define USB_PHY_CTRL0_ID_DIG_OVERRIDE_EN_SET(x) (((uint32_t)(x) << USB_PHY_CTRL0_ID_DIG_OVERRIDE_EN_SHIFT) & USB_PHY_CTRL0_ID_DIG_OVERRIDE_EN_MASK) +#define USB_PHY_CTRL0_ID_DIG_OVERRIDE_EN_GET(x) (((uint32_t)(x) & USB_PHY_CTRL0_ID_DIG_OVERRIDE_EN_MASK) >> USB_PHY_CTRL0_ID_DIG_OVERRIDE_EN_SHIFT) + +/* + * SESS_VALID_OVERRIDE_EN (RW) + * + */ +#define USB_PHY_CTRL0_SESS_VALID_OVERRIDE_EN_MASK (0x2U) +#define USB_PHY_CTRL0_SESS_VALID_OVERRIDE_EN_SHIFT (1U) +#define USB_PHY_CTRL0_SESS_VALID_OVERRIDE_EN_SET(x) (((uint32_t)(x) << USB_PHY_CTRL0_SESS_VALID_OVERRIDE_EN_SHIFT) & USB_PHY_CTRL0_SESS_VALID_OVERRIDE_EN_MASK) +#define USB_PHY_CTRL0_SESS_VALID_OVERRIDE_EN_GET(x) (((uint32_t)(x) & USB_PHY_CTRL0_SESS_VALID_OVERRIDE_EN_MASK) >> USB_PHY_CTRL0_SESS_VALID_OVERRIDE_EN_SHIFT) + +/* + * VBUS_VALID_OVERRIDE_EN (RW) + * + */ +#define USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_EN_MASK (0x1U) +#define USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_EN_SHIFT (0U) +#define USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_EN_SET(x) (((uint32_t)(x) << USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_EN_SHIFT) & USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_EN_MASK) +#define USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_EN_GET(x) (((uint32_t)(x) & USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_EN_MASK) >> USB_PHY_CTRL0_VBUS_VALID_OVERRIDE_EN_SHIFT) + +/* Bitfield definition for register: PHY_CTRL1 */ +/* + * UTMI_CFG_RST_N (RW) + * + */ +#define USB_PHY_CTRL1_UTMI_CFG_RST_N_MASK (0x100000UL) +#define USB_PHY_CTRL1_UTMI_CFG_RST_N_SHIFT (20U) +#define USB_PHY_CTRL1_UTMI_CFG_RST_N_SET(x) (((uint32_t)(x) << USB_PHY_CTRL1_UTMI_CFG_RST_N_SHIFT) & USB_PHY_CTRL1_UTMI_CFG_RST_N_MASK) +#define USB_PHY_CTRL1_UTMI_CFG_RST_N_GET(x) (((uint32_t)(x) & USB_PHY_CTRL1_UTMI_CFG_RST_N_MASK) >> USB_PHY_CTRL1_UTMI_CFG_RST_N_SHIFT) + +/* + * UTMI_OTG_SUSPENDM (RW) + * + * OTG suspend, not utmi_suspendm + */ +#define USB_PHY_CTRL1_UTMI_OTG_SUSPENDM_MASK (0x2U) +#define USB_PHY_CTRL1_UTMI_OTG_SUSPENDM_SHIFT (1U) +#define USB_PHY_CTRL1_UTMI_OTG_SUSPENDM_SET(x) (((uint32_t)(x) << USB_PHY_CTRL1_UTMI_OTG_SUSPENDM_SHIFT) & USB_PHY_CTRL1_UTMI_OTG_SUSPENDM_MASK) +#define USB_PHY_CTRL1_UTMI_OTG_SUSPENDM_GET(x) (((uint32_t)(x) & USB_PHY_CTRL1_UTMI_OTG_SUSPENDM_MASK) >> USB_PHY_CTRL1_UTMI_OTG_SUSPENDM_SHIFT) + +/* Bitfield definition for register: TOP_STATUS */ +/* + * WAKEUP_INT_STATUS (RW) + * + */ +#define USB_TOP_STATUS_WAKEUP_INT_STATUS_MASK (0x80000000UL) +#define USB_TOP_STATUS_WAKEUP_INT_STATUS_SHIFT (31U) +#define USB_TOP_STATUS_WAKEUP_INT_STATUS_SET(x) (((uint32_t)(x) << USB_TOP_STATUS_WAKEUP_INT_STATUS_SHIFT) & USB_TOP_STATUS_WAKEUP_INT_STATUS_MASK) +#define USB_TOP_STATUS_WAKEUP_INT_STATUS_GET(x) (((uint32_t)(x) & USB_TOP_STATUS_WAKEUP_INT_STATUS_MASK) >> USB_TOP_STATUS_WAKEUP_INT_STATUS_SHIFT) + +/* Bitfield definition for register: PHY_STATUS */ +/* + * UTMI_CLK_VALID (RW) + * + */ +#define USB_PHY_STATUS_UTMI_CLK_VALID_MASK (0x80000000UL) +#define USB_PHY_STATUS_UTMI_CLK_VALID_SHIFT (31U) +#define USB_PHY_STATUS_UTMI_CLK_VALID_SET(x) (((uint32_t)(x) << USB_PHY_STATUS_UTMI_CLK_VALID_SHIFT) & USB_PHY_STATUS_UTMI_CLK_VALID_MASK) +#define USB_PHY_STATUS_UTMI_CLK_VALID_GET(x) (((uint32_t)(x) & USB_PHY_STATUS_UTMI_CLK_VALID_MASK) >> USB_PHY_STATUS_UTMI_CLK_VALID_SHIFT) + +/* + * LINE_STATE (RW) + * + */ +#define USB_PHY_STATUS_LINE_STATE_MASK (0xC0U) +#define USB_PHY_STATUS_LINE_STATE_SHIFT (6U) +#define USB_PHY_STATUS_LINE_STATE_SET(x) (((uint32_t)(x) << USB_PHY_STATUS_LINE_STATE_SHIFT) & USB_PHY_STATUS_LINE_STATE_MASK) +#define USB_PHY_STATUS_LINE_STATE_GET(x) (((uint32_t)(x) & USB_PHY_STATUS_LINE_STATE_MASK) >> USB_PHY_STATUS_LINE_STATE_SHIFT) + +/* + * HOST_DISCONNECT (RW) + * + */ +#define USB_PHY_STATUS_HOST_DISCONNECT_MASK (0x20U) +#define USB_PHY_STATUS_HOST_DISCONNECT_SHIFT (5U) +#define USB_PHY_STATUS_HOST_DISCONNECT_SET(x) (((uint32_t)(x) << USB_PHY_STATUS_HOST_DISCONNECT_SHIFT) & USB_PHY_STATUS_HOST_DISCONNECT_MASK) +#define USB_PHY_STATUS_HOST_DISCONNECT_GET(x) (((uint32_t)(x) & USB_PHY_STATUS_HOST_DISCONNECT_MASK) >> USB_PHY_STATUS_HOST_DISCONNECT_SHIFT) + +/* + * ID_DIG (RW) + * + */ +#define USB_PHY_STATUS_ID_DIG_MASK (0x10U) +#define USB_PHY_STATUS_ID_DIG_SHIFT (4U) +#define USB_PHY_STATUS_ID_DIG_SET(x) (((uint32_t)(x) << USB_PHY_STATUS_ID_DIG_SHIFT) & USB_PHY_STATUS_ID_DIG_MASK) +#define USB_PHY_STATUS_ID_DIG_GET(x) (((uint32_t)(x) & USB_PHY_STATUS_ID_DIG_MASK) >> USB_PHY_STATUS_ID_DIG_SHIFT) + +/* + * UTMI_SESS_VALID (RW) + * + */ +#define USB_PHY_STATUS_UTMI_SESS_VALID_MASK (0x4U) +#define USB_PHY_STATUS_UTMI_SESS_VALID_SHIFT (2U) +#define USB_PHY_STATUS_UTMI_SESS_VALID_SET(x) (((uint32_t)(x) << USB_PHY_STATUS_UTMI_SESS_VALID_SHIFT) & USB_PHY_STATUS_UTMI_SESS_VALID_MASK) +#define USB_PHY_STATUS_UTMI_SESS_VALID_GET(x) (((uint32_t)(x) & USB_PHY_STATUS_UTMI_SESS_VALID_MASK) >> USB_PHY_STATUS_UTMI_SESS_VALID_SHIFT) + +/* + * VBUS_VALID (RW) + * + */ +#define USB_PHY_STATUS_VBUS_VALID_MASK (0x1U) +#define USB_PHY_STATUS_VBUS_VALID_SHIFT (0U) +#define USB_PHY_STATUS_VBUS_VALID_SET(x) (((uint32_t)(x) << USB_PHY_STATUS_VBUS_VALID_SHIFT) & USB_PHY_STATUS_VBUS_VALID_MASK) +#define USB_PHY_STATUS_VBUS_VALID_GET(x) (((uint32_t)(x) & USB_PHY_STATUS_VBUS_VALID_MASK) >> USB_PHY_STATUS_VBUS_VALID_SHIFT) + + + +/* ENDPTCTRL register group index macro definition */ +#define USB_ENDPTCTRL_ENDPTCTRL0 (0UL) +#define USB_ENDPTCTRL_ENDPTCTRL1 (1UL) +#define USB_ENDPTCTRL_ENDPTCTRL2 (2UL) +#define USB_ENDPTCTRL_ENDPTCTRL3 (3UL) +#define USB_ENDPTCTRL_ENDPTCTRL4 (4UL) +#define USB_ENDPTCTRL_ENDPTCTRL5 (5UL) +#define USB_ENDPTCTRL_ENDPTCTRL6 (6UL) +#define USB_ENDPTCTRL_ENDPTCTRL7 (7UL) + + +#endif /* HPM_USB_H */ diff --git a/src/lib/CherryUSB/port/chipidea/usb_dc_chipidea.c b/src/lib/CherryUSB/port/chipidea/usb_dc_chipidea.c new file mode 100644 index 000000000..ddead2b9d --- /dev/null +++ b/src/lib/CherryUSB/port/chipidea/usb_dc_chipidea.c @@ -0,0 +1,740 @@ +/* + * Copyright (c) 2021-2024 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usb_chipidea_reg.h" + +#define USB_OTG_DEV ((CHIPIDEA_TypeDef *)g_usbdev_bus[busid].reg_base) + +#define CHIPIDEA_BITSMASK(val, offset) ((uint32_t)(val) << (offset)) +#define QTD_COUNT_EACH_ENDPOINT (8U) + +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 8 +#endif + +/* ENDPTCTRL */ +enum { + ENDPTCTRL_STALL = CHIPIDEA_BITSMASK(1, 0), + ENDPTCTRL_TYPE = CHIPIDEA_BITSMASK(3, 2), + ENDPTCTRL_TOGGLE_INHIBIT = CHIPIDEA_BITSMASK(1, 5), + ENDPTCTRL_TOGGLE_RESET = CHIPIDEA_BITSMASK(1, 6), + ENDPTCTRL_ENABLE = CHIPIDEA_BITSMASK(1, 7), +}; + +/* USBSTS, USBINTR */ +enum { + intr_usb = CHIPIDEA_BITSMASK(1, 0), + intr_error = CHIPIDEA_BITSMASK(1, 1), + intr_port_change = CHIPIDEA_BITSMASK(1, 2), + intr_reset = CHIPIDEA_BITSMASK(1, 6), + intr_sof = CHIPIDEA_BITSMASK(1, 7), + intr_suspend = CHIPIDEA_BITSMASK(1, 8), + intr_nak = CHIPIDEA_BITSMASK(1, 16) +}; + +/* Queue Transfer Descriptor */ +typedef struct { + /* Word 0: Next QTD Pointer */ + volatile uint32_t next; /* Next link pointer This field contains the physical memory address of the next dTD to be processed */ + + /* Word 1: qTQ Token */ + volatile uint32_t : 3; + volatile uint32_t xact_err : 1; + volatile uint32_t : 1; + volatile uint32_t buffer_err : 1; + volatile uint32_t halted : 1; + volatile uint32_t active : 1; + volatile uint32_t : 2; + volatile uint32_t iso_mult_override : 2; /* This field can be used for transmit ISOs to override the MULT field in the dQH. This field must be zero for all packet types that are not transmit-ISO. */ + volatile uint32_t : 3; + volatile uint32_t int_on_complete : 1; + volatile uint32_t total_bytes : 15; + volatile uint32_t : 0; + + /* Word 2-6: Buffer Page Pointer List, Each element in the list is a 4K page aligned, physical memory address. The lower 12 bits in each pointer are reserved (except for the first one) as each memory pointer must reference the start of a 4K page */ + volatile uint32_t buffer[5]; + + /*------------- DCD Area -------------*/ + volatile uint16_t expected_bytes; + volatile uint8_t reserved[2]; +} dcd_qtd_t; + +/* Queue Head */ +typedef struct { + /* Word 0: Capabilities and Characteristics */ + + volatile uint32_t : 15; /* Number of packets executed per transaction descriptor 00 - Execute N transactions as demonstrated by the USB variable length protocol where N is computed using Max_packet_length and the Total_bytes field in the dTD. 01 - Execute one transaction 10 - Execute two transactions 11 - Execute three transactions Remark: Non-isochronous endpoints must set MULT = 00. Remark: Isochronous endpoints must set MULT = 01, 10, or 11 as needed. */ + volatile uint32_t int_on_setup : 1; /* Interrupt on setup This bit is used on control type endpoints to indicate if USBINT is set in response to a setup being received. */ + volatile uint32_t max_packet_size : 11; /* This directly corresponds to the maximum packet size of the associated endpoint (wMaxPacketSize) */ + volatile uint32_t : 2; + volatile uint32_t zero_length_termination : 1; /* This bit is used for non-isochronous endpoints to indicate when a zero-length packet is received to terminate transfers in case the total transfer length is “multiple”. 0 - Enable zero-length packet to terminate transfers equal to a multiple of Max_packet_length (default). 1 - Disable zero-length packet on transfers that are equal in length to a multiple Max_packet_length. */ + volatile uint32_t iso_mult : 2; + volatile uint32_t : 0; + + /* Word 1: Current qTD Pointer */ + volatile uint32_t qtd_addr; + + /* Word 2-9: Transfer Overlay */ + volatile dcd_qtd_t qtd_overlay; + + /* Word 10-11: Setup request (control OUT only) */ + volatile struct usb_setup_packet setup_request; + + /*-------------------------------------------------------------------- + * Due to the fact QHD is 64 bytes aligned but occupies only 48 bytes + * thus there are 16 bytes padding free that we can make use of. + *-------------------------------------------------------------------- + */ + volatile uint8_t reserved[16]; +} dcd_qhd_t; + +typedef struct { + dcd_qhd_t qhd[CONFIG_USBDEV_EP_NUM * 2]; + dcd_qtd_t qtd[CONFIG_USBDEV_EP_NUM * 2 * QTD_COUNT_EACH_ENDPOINT]; +} dcd_data_t; + +/* Endpoint state */ +struct chipidea_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +/* Driver state */ +struct chipidea_udc { + dcd_data_t *dcd_data; + bool is_suspend; + struct chipidea_ep_state in_ep[CONFIG_USBDEV_EP_NUM]; /*!< IN endpoint parameters*/ + struct chipidea_ep_state out_ep[CONFIG_USBDEV_EP_NUM]; /*!< OUT endpoint parameters */ +} g_chipidea_udc[CONFIG_USBDEV_MAX_BUS]; + +static USB_NOCACHE_RAM_SECTION __attribute__((aligned(2048))) dcd_data_t _dcd_data0; +#if CONFIG_USBDEV_MAX_BUS == 2 +static USB_NOCACHE_RAM_SECTION __attribute__((aligned(2048))) dcd_data_t _dcd_data1; +#endif + +static dcd_data_t *g_dcd_data[CONFIG_USBDEV_MAX_BUS] = { + &_dcd_data0, +#if CONFIG_USBDEV_MAX_BUS == 2 + &_dcd_data1 +#endif +}; + +/* Index to bit position in register */ +static inline uint8_t ep_idx2bit(uint8_t ep_idx) +{ + return ep_idx / 2 + ((ep_idx % 2) ? 16 : 0); +} + +static void __chipidea_bus_reset(CHIPIDEA_TypeDef *ptr) +{ + /* The reset value for all endpoint types is the control endpoint. If one endpoint + * direction is enabled and the paired endpoint of opposite direction is disabled, then the + * endpoint type of the unused direction must be changed from the control type to any other + * type (e.g. bulk). Leaving an un-configured endpoint control will cause undefined behavior + * for the data PID tracking on the active endpoint. + */ + + for (uint32_t i = 1; i < CONFIG_USBDEV_EP_NUM; i++) { + ptr->ENDPTCTRL[i] = USB_ENDPTCTRL_TXT_SET(USB_ENDPOINT_TYPE_BULK) | USB_ENDPTCTRL_RXT_SET(USB_ENDPOINT_TYPE_BULK); + } + + /* Clear All Registers */ + ptr->ENDPTNAK = ptr->ENDPTNAK; + ptr->ENDPTNAKEN = 0; + ptr->USBSTS = ptr->USBSTS; + ptr->ENDPTSETUPSTAT = ptr->ENDPTSETUPSTAT; + ptr->ENDPTCOMPLETE = ptr->ENDPTCOMPLETE; + + while (ptr->ENDPTPRIME) { + } + ptr->ENDPTFLUSH = 0xFFFFFFFF; + while (ptr->ENDPTFLUSH) { + } +} + +static void chipidea_init(CHIPIDEA_TypeDef *ptr) +{ + /* Reset controller */ + ptr->USBCMD |= USB_USBCMD_RST_MASK; + while (USB_USBCMD_RST_GET(ptr->USBCMD)) { + } + + /* Set mode to device, must be set immediately after reset */ + ptr->USBMODE &= ~USB_USBMODE_CM_MASK; + ptr->USBMODE |= USB_USBMODE_CM_SET(2); + + /* Disable setup lockout, please refer to "Control Endpoint Operation" section in RM. */ + ptr->USBMODE &= ~USB_USBMODE_SLOM_MASK; + + /* Set the endian */ + ptr->USBMODE &= ~USB_USBMODE_ES_MASK; + + /* Set parallel interface signal */ + ptr->PORTSC1 &= ~USB_PORTSC1_STS_MASK; + + /* Set parallel transceiver width */ + ptr->PORTSC1 &= ~USB_PORTSC1_PTW_MASK; + + /* Set usb forced to full speed mode */ + //ptr->PORTSC1 |= USB_PORTSC1_PFSC_MASK; + + /* Not use interrupt threshold. */ + ptr->USBCMD &= ~USB_USBCMD_ITC_MASK; + + /* Enable VBUS discharge */ + ptr->OTGSC |= USB_OTGSC_VD_MASK; +} + +static void chipidea_deinit(CHIPIDEA_TypeDef *ptr) +{ + /* Stop */ + ptr->USBCMD &= ~USB_USBCMD_RS_MASK; + + /* Reset controller */ + ptr->USBCMD |= USB_USBCMD_RST_MASK; + while (USB_USBCMD_RST_GET(ptr->USBCMD)) { + } + + /* Reset endpoint list address register */ + ptr->ENDPTLISTADDR = 0; + + /* Reset status register */ + ptr->USBSTS = ptr->USBSTS; + + /* Reset interrupt enable register */ + ptr->USBINTR = 0; +} + +/*--------------------------------------------------------------------- + * Endpoint API + *--------------------------------------------------------------------- + */ +static void __chipidea_edpt_open(CHIPIDEA_TypeDef *ptr, uint8_t ep_addr, uint8_t ep_type) +{ + uint8_t const epnum = ep_addr & 0x0f; + uint8_t const dir = (ep_addr & 0x80) >> 7; + + /* Enable EP Control */ + uint32_t temp = ptr->ENDPTCTRL[epnum]; + temp &= ~((0x03 << 2) << (dir ? 16 : 0)); + temp |= ((ep_type << 2) | ENDPTCTRL_ENABLE | ENDPTCTRL_TOGGLE_RESET) << (dir ? 16 : 0); + ptr->ENDPTCTRL[epnum] = temp; +} + +static void chipidea_edpt_xfer(CHIPIDEA_TypeDef *ptr, uint8_t ep_idx) +{ + uint32_t offset = ep_idx / 2 + ((ep_idx % 2) ? 16 : 0); + + /* Start transfer */ + ptr->ENDPTPRIME = 1 << offset; +} + +static void chipidea_edpt_stall(CHIPIDEA_TypeDef *ptr, uint8_t ep_addr) +{ + uint8_t const epnum = ep_addr & 0x0f; + uint8_t const dir = (ep_addr & 0x80) >> 7; + + ptr->ENDPTCTRL[epnum] |= ENDPTCTRL_STALL << (dir ? 16 : 0); +} + +static void chipidea_edpt_clear_stall(CHIPIDEA_TypeDef *ptr, uint8_t ep_addr) +{ + uint8_t const epnum = ep_addr & 0x0f; + uint8_t const dir = (ep_addr & 0x80) >> 7; + + /* data toggle also need to be reset */ + ptr->ENDPTCTRL[epnum] |= ENDPTCTRL_TOGGLE_RESET << (dir ? 16 : 0); + ptr->ENDPTCTRL[epnum] &= ~(ENDPTCTRL_STALL << (dir ? 16 : 0)); +} + +static bool chipidea_edpt_check_stall(CHIPIDEA_TypeDef *ptr, uint8_t ep_addr) +{ + uint8_t const epnum = ep_addr & 0x0f; + uint8_t const dir = (ep_addr & 0x80) >> 7; + + return (ptr->ENDPTCTRL[epnum] & (ENDPTCTRL_STALL << (dir ? 16 : 0))) ? true : false; +} + +static void chipidea_edpt_close(CHIPIDEA_TypeDef *ptr, uint8_t ep_addr) +{ + uint8_t const epnum = ep_addr & 0x0f; + uint8_t const dir = (ep_addr & 0x80) >> 7; + + uint32_t primebit = CHIPIDEA_BITSMASK(1, epnum) << (dir ? 16 : 0); + + /* Flush the endpoint to stop a transfer. */ + do { + /* Set the corresponding bit(s) in the ENDPTFLUSH register */ + ptr->ENDPTFLUSH |= primebit; + + /* Wait until all bits in the ENDPTFLUSH register are cleared. */ + while (0U != (ptr->ENDPTFLUSH & primebit)) { + } + /* + * Read the ENDPTSTAT register to ensure that for all endpoints + * commanded to be flushed, that the corresponding bits + * are now cleared. + */ + } while (0U != (ptr->ENDPTSTAT & primebit)); + + /* Disable the endpoint */ + ptr->ENDPTCTRL[epnum] &= ~((ENDPTCTRL_TYPE | ENDPTCTRL_ENABLE | ENDPTCTRL_STALL) << (dir ? 16 : 0)); + ptr->ENDPTCTRL[epnum] |= (USB_ENDPOINT_TYPE_BULK << 2) << (dir ? 16 : 0); +} + +/* Initialize qtd */ +static void usb_qtd_init(dcd_qtd_t *p_qtd, void *data_ptr, uint16_t total_bytes) +{ + memset(p_qtd, 0, sizeof(dcd_qtd_t)); + + p_qtd->next = 1; + p_qtd->active = 1; + p_qtd->total_bytes = p_qtd->expected_bytes = total_bytes; + + if (data_ptr != NULL) { + p_qtd->buffer[0] = (uint32_t)data_ptr; + for (uint8_t i = 1; i < 5; i++) { + p_qtd->buffer[i] = ((p_qtd->buffer[i - 1]) & 0xFFFFF000UL) + 4096U; + } + } +} + +static dcd_qhd_t *chipidea_qhd_get(uint8_t busid, uint8_t ep_idx) +{ + dcd_data_t *dcd_data; + + dcd_data = g_chipidea_udc[busid].dcd_data; + return &dcd_data->qhd[ep_idx]; +} + +static dcd_qtd_t *chipidea_qtd_get(uint8_t busid, uint8_t ep_idx) +{ + dcd_data_t *dcd_data; + + dcd_data = g_chipidea_udc[busid].dcd_data; + return &dcd_data->qtd[ep_idx * QTD_COUNT_EACH_ENDPOINT]; +} + +static void chipidea_bus_reset(uint8_t busid, uint16_t ep0_max_packet_size) +{ + dcd_data_t *dcd_data; + + dcd_data = g_chipidea_udc[busid].dcd_data; + __chipidea_bus_reset(USB_OTG_DEV); + + /* Queue Head & Queue TD */ + memset(dcd_data, 0, sizeof(dcd_data_t)); + + /* Set up Control Endpoints (0 OUT, 1 IN) */ + dcd_data->qhd[0].zero_length_termination = dcd_data->qhd[1].zero_length_termination = 1; + dcd_data->qhd[0].max_packet_size = dcd_data->qhd[1].max_packet_size = ep0_max_packet_size; + dcd_data->qhd[0].qtd_overlay.next = dcd_data->qhd[1].qtd_overlay.next = 1; + + /* OUT only */ + dcd_data->qhd[0].int_on_setup = 1; +} + +static void chipidea_edpt_open(uint8_t busid, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps) +{ + uint8_t const epnum = ep_addr & 0x0f; + uint8_t const dir = (ep_addr & 0x80) >> 7; + uint8_t const ep_idx = 2 * epnum + dir; + dcd_data_t *dcd_data; + dcd_qhd_t *p_qhd; + + /* Prepare Queue Head */ + dcd_data = g_chipidea_udc[busid].dcd_data; + p_qhd = &dcd_data->qhd[ep_idx]; + memset(p_qhd, 0, sizeof(dcd_qhd_t)); + + p_qhd->zero_length_termination = 1; + p_qhd->max_packet_size = ep_mps & 0x7FFu; + p_qhd->qtd_overlay.next = 1; + if (ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + p_qhd->iso_mult = ((ep_mps >> 11u) & 0x3u) + 1u; + } + + __chipidea_edpt_open(USB_OTG_DEV, ep_addr, ep_type); +} + +static bool chipidea_start_xfer(uint8_t busid, uint8_t ep_addr, uint8_t *buffer, uint32_t total_bytes) +{ + uint8_t const epnum = ep_addr & 0x0f; + uint8_t const dir = (ep_addr & 0x80) >> 7; + uint8_t const ep_idx = 2 * epnum + dir; + uint8_t qtd_num; + uint8_t i; + uint32_t xfer_len; + dcd_qhd_t *p_qhd; + dcd_qtd_t *p_qtd; + dcd_qtd_t *first_p_qtd = NULL; + dcd_qtd_t *prev_p_qtd = NULL; + dcd_data_t *dcd_data; + + dcd_data = g_chipidea_udc[busid].dcd_data; + + if (epnum == 0) { + /* follows UM Setup packet handling using setup lockout mechanism + * wait until ENDPTSETUPSTAT before priming data/status in response TODO add time out + */ + while (USB_OTG_DEV->ENDPTSETUPSTAT & CHIPIDEA_BITSMASK(1, 0)) { + } + } + + qtd_num = (total_bytes + 0x3fff) / 0x4000; + if (qtd_num > QTD_COUNT_EACH_ENDPOINT) { + return false; + } + + if (buffer != NULL) { + buffer = (uint8_t *)buffer; + } + p_qhd = &dcd_data->qhd[ep_idx]; + i = 0; + do { + p_qtd = &dcd_data->qtd[ep_idx * QTD_COUNT_EACH_ENDPOINT + i]; + i++; + + if (total_bytes > 0x4000) { + xfer_len = 0x4000; + total_bytes -= 0x4000; + } else { + xfer_len = total_bytes; + total_bytes = 0; + } + + usb_qtd_init(p_qtd, (void *)buffer, xfer_len); + if (total_bytes == 0) { + p_qtd->int_on_complete = true; + } + buffer += xfer_len; + + if (prev_p_qtd) { + prev_p_qtd->next = (uint32_t)p_qtd; + } else { + first_p_qtd = p_qtd; + } + prev_p_qtd = p_qtd; + } while (total_bytes > 0); + + p_qhd->qtd_overlay.next = (uint32_t)first_p_qtd; /* link qtd to qhd */ + + chipidea_edpt_xfer(USB_OTG_DEV, ep_idx); + + return true; +} + +__WEAK void usb_dc_low_level_init(uint8_t busid) +{ +} + +__WEAK void usb_dc_low_level_deinit(uint8_t busid) +{ +} + +int usb_dc_init(uint8_t busid) +{ + uint32_t int_mask; + int_mask = (USB_USBINTR_UE_MASK | USB_USBINTR_UEE_MASK | USB_USBINTR_SLE_MASK | + USB_USBINTR_PCE_MASK | USB_USBINTR_URE_MASK); + + usb_dc_low_level_init(busid); + + memset(&g_chipidea_udc[busid], 0, sizeof(struct chipidea_udc)); + g_chipidea_udc[busid].dcd_data = g_dcd_data[busid]; + memset(g_chipidea_udc[busid].dcd_data, 0, sizeof(dcd_data_t)); + + chipidea_init(USB_OTG_DEV); + + /* Set endpoint list address */ + USB_OTG_DEV->ENDPTLISTADDR = ((uint32_t)g_chipidea_udc[busid].dcd_data->qhd) & USB_ENDPTLISTADDR_EPBASE_MASK; + + /* Clear status */ + USB_OTG_DEV->USBSTS = USB_OTG_DEV->USBSTS; + +#ifdef CONFIG_USBDEV_SOF_ENABLE + int_mask |= USB_USBINTR_SRE_MASK; +#endif + + /* Enable interrupt mask */ + USB_OTG_DEV->USBINTR |= int_mask; + + /* Connect by enabling internal pull-up resistor on D+/D- */ + USB_OTG_DEV->USBCMD |= USB_USBCMD_RS_MASK; + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + chipidea_deinit(USB_OTG_DEV); + + for (uint32_t i = 0; i < CONFIG_USBDEV_EP_NUM; i++) { + chipidea_edpt_close(USB_OTG_DEV, (i | 0x80)); + chipidea_edpt_close(USB_OTG_DEV, (i | 0x00)); + } + + usb_dc_low_level_deinit(busid); + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + USB_OTG_DEV->DEVICEADDR = USB_DEVICEADDR_USBADR_SET(addr) | USB_DEVICEADDR_USBADRA_MASK; + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + if (!USB_PORTSC1_SUSP_GET(USB_OTG_DEV->PORTSC1)) { + return -1; + } + + USB_OTG_DEV->PORTSC1 |= USB_PORTSC1_FPR_MASK; + while (USB_OTG_DEV->PORTSC1 & USB_PORTSC1_FPR_MASK) { + } + + return 0; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + uint8_t speed; + + speed = USB_PORTSC1_PSPD_GET(USB_OTG_DEV->PORTSC1); + + if (speed == 0x00) { + return USB_SPEED_FULL; + } + if (speed == 0x01) { + return USB_SPEED_LOW; + } + if (speed == 0x02) { + return USB_SPEED_HIGH; + } + + return 0; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + + USB_ASSERT_MSG(ep_idx < CONFIG_USBDEV_EP_NUM, "Ep addr %02x overflow", ep->bEndpointAddress); + + chipidea_edpt_open(busid, ep->bEndpointAddress, USB_GET_ENDPOINT_TYPE(ep->bmAttributes), ep->wMaxPacketSize); + + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_chipidea_udc[busid].out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_chipidea_udc[busid].out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_chipidea_udc[busid].out_ep[ep_idx].ep_enable = true; + } else { + g_chipidea_udc[busid].in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_chipidea_udc[busid].in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_chipidea_udc[busid].in_ep[ep_idx].ep_enable = true; + } + + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + g_chipidea_udc[busid].out_ep[ep_idx].ep_enable = false; + } else { + g_chipidea_udc[busid].in_ep[ep_idx].ep_enable = false; + } + + chipidea_edpt_close(USB_OTG_DEV, ep); + + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + chipidea_edpt_stall(USB_OTG_DEV, ep); + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + chipidea_edpt_clear_stall(USB_OTG_DEV, ep); + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + *stalled = chipidea_edpt_check_stall(USB_OTG_DEV, ep); + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_chipidea_udc[busid].in_ep[ep_idx].ep_enable) { + return -2; + } + +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)data % CONFIG_USB_ALIGN_SIZE), "data is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + + g_chipidea_udc[busid].in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_chipidea_udc[busid].in_ep[ep_idx].xfer_len = data_len; + g_chipidea_udc[busid].in_ep[ep_idx].actual_xfer_len = 0; + + usb_dcache_clean((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); + chipidea_start_xfer(busid, ep, (uint8_t *)data, data_len); + + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_chipidea_udc[busid].out_ep[ep_idx].ep_enable) { + return -2; + } + +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)data % CONFIG_USB_ALIGN_SIZE), "data is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + + g_chipidea_udc[busid].out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_chipidea_udc[busid].out_ep[ep_idx].xfer_len = data_len; + g_chipidea_udc[busid].out_ep[ep_idx].actual_xfer_len = 0; + + usb_dcache_invalidate((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); + chipidea_start_xfer(busid, ep, data, data_len); + + return 0; +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint32_t int_status; + uint32_t transfer_len; + bool ep_cb_req; + + /* Acknowledge handled interrupt */ + int_status = USB_OTG_DEV->USBSTS; + int_status &= USB_OTG_DEV->USBINTR; + USB_OTG_DEV->USBSTS = int_status; + + if (int_status & intr_error) { + USB_LOG_ERR("usbd intr error!\r\n"); + } + +#ifdef CONFIG_USBDEV_SOF_ENABLE + if (int_status & intr_sof) { + usbd_event_sof_handler(busid); + } +#endif + + if (int_status & intr_reset) { + g_chipidea_udc[busid].is_suspend = false; + memset(g_chipidea_udc[busid].in_ep, 0, sizeof(struct chipidea_ep_state) * CONFIG_USBDEV_EP_NUM); + memset(g_chipidea_udc[busid].out_ep, 0, sizeof(struct chipidea_ep_state) * CONFIG_USBDEV_EP_NUM); + usbd_event_reset_handler(busid); + chipidea_bus_reset(busid, g_chipidea_udc[busid].in_ep[0].ep_mps); + } + + if (int_status & intr_suspend) { + if (USB_PORTSC1_SUSP_GET(USB_OTG_DEV->PORTSC1)) { + /* Note: Host may delay more than 3 ms before and/or after bus reset before doing enumeration. */ + if (USB_DEVICEADDR_USBADR_GET(USB_OTG_DEV->DEVICEADDR)) { + g_chipidea_udc[busid].is_suspend = true; + usbd_event_suspend_handler(busid); + } + } else { + } + } + + if (int_status & intr_port_change) { + if (!USB_PORTSC1_CCS_GET(USB_OTG_DEV->PORTSC1)) { + usbd_event_disconnect_handler(busid); + } else { + if (g_chipidea_udc[busid].is_suspend) { + g_chipidea_udc[busid].is_suspend = false; + usbd_event_resume_handler(busid); + } + usbd_event_connect_handler(busid); + } + } + + if (int_status & intr_usb) { + uint32_t const edpt_complete = USB_OTG_DEV->ENDPTCOMPLETE; + uint32_t edpt_setup_status = USB_OTG_DEV->ENDPTSETUPSTAT; + + if (edpt_complete) { + USB_OTG_DEV->ENDPTCOMPLETE = edpt_complete; + for (uint8_t ep_idx = 0; ep_idx < (CONFIG_USBDEV_EP_NUM * 2); ep_idx++) { + if (edpt_complete & (1 << ep_idx2bit(ep_idx))) { + transfer_len = 0; + ep_cb_req = true; + + /* Failed QTD also get ENDPTCOMPLETE set */ + dcd_qtd_t *p_qtd = chipidea_qtd_get(busid, ep_idx); + while (1) { + if (p_qtd->halted || p_qtd->xact_err || p_qtd->buffer_err) { + USB_LOG_ERR("usbd transfer error!\r\n"); + ep_cb_req = false; + break; + } else if (p_qtd->active) { + ep_cb_req = false; + break; + } else { + transfer_len += p_qtd->expected_bytes - p_qtd->total_bytes; + } + + if (p_qtd->next == 1) { + break; + } else { + p_qtd = (dcd_qtd_t *)p_qtd->next; + } + } + + if (ep_cb_req) { + uint8_t const ep_addr = (ep_idx / 2) | ((ep_idx & 0x01) ? 0x80 : 0); + if (ep_addr & 0x80) { + usbd_event_ep_in_complete_handler(busid, ep_addr, transfer_len); + } else { + usb_dcache_invalidate((uintptr_t)g_chipidea_udc[busid].out_ep[ep_idx].xfer_buf, USB_ALIGN_UP(transfer_len, CONFIG_USB_ALIGN_SIZE)); + usbd_event_ep_out_complete_handler(busid, ep_addr, transfer_len); + } + } + } + } + } + + if (edpt_setup_status) { + /*------------- Set up Received -------------*/ + USB_OTG_DEV->ENDPTSETUPSTAT = edpt_setup_status; + dcd_qhd_t *qhd0 = chipidea_qhd_get(busid, 0); + usbd_event_ep0_setup_complete_handler(busid, (uint8_t *)&qhd0->setup_request); + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/dwc2/README.md b/src/lib/CherryUSB/port/dwc2/README.md new file mode 100644 index 000000000..2861cde73 --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/README.md @@ -0,0 +1,51 @@ +# Note + +Please note that host must support dma mode. + +## Support Chip List + +### STM32 + +**有且仅有 PB14/PB15 引脚支持 host 模式, 部分 F7/H7 可能 PA11/PA12 也支持**。 + +- STM32F105xc、STM32F107xc +- STM32F205xx、STM32F207xx、STM32F215xx、STM32F217xx +- STM32F401xc、STM32F401xe、STM32F405xx、STM32F407xx、STM32F411xe、STM32F412cx、STM32F412rx、STM32F412vx、STM32F412zx、STM32F413xx、STM32F415xx、STM32F417xx、STM32F423xx、STM32F423xx、STM32F429xx、STM32F437xx、STM32F439xx、STM32F446xx、STM32F469xx、STM32F479xx +- STM32F7xx +- STM32H7xx +- STM32L4xx +- STM32U5xx + +### AT32 + +**有且仅有 AT32F405xx PB14/PB15引脚支持 host 模式**。 + +- AT32F402xx、AT32F405xx、AT32F415xx、AT32F423xx、AT32F425xx、AT32F435xx、AT32F437xx + +### GD32 + +**由于无法读取 DWC2 配置信息,并且有部分寄存器是非标准的,因此暂时无法支持 GD 系列**。 + +- GD32F30X_CL +- GD32F405、GD32F407 +- GD32F350、GD32F450 + +### HC32 + +- HC32F4A0 + +### Espressif + +- ESP32S2、ESP32S3、ESP32P4 + +### Sophgo + +- CV18xx + +### Kendryte + +- K230 + +### Nationstech + +- N32H4X \ No newline at end of file diff --git a/src/lib/CherryUSB/port/dwc2/usb_dc_dwc2.c b/src/lib/CherryUSB/port/dwc2/usb_dc_dwc2.c new file mode 100644 index 000000000..0234d9e8d --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_dc_dwc2.c @@ -0,0 +1,1222 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usb_dwc2_reg.h" +#include "usb_dwc2_param.h" + +// clang-format off +#if defined ( __CC_ARM ) +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#elif defined (__ICCARM__) +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#elif defined ( __GNUC__ ) +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#endif +// clang-format on + +#define USBD_BASE (g_usbdev_bus[busid].reg_base) + +#define USB_OTG_GLB ((DWC2_GlobalTypeDef *)(USBD_BASE)) +#define USB_OTG_DEV ((DWC2_DeviceTypeDef *)(USBD_BASE + USB_OTG_DEVICE_BASE)) +#define USB_OTG_PCGCCTL *(__IO uint32_t *)((uint32_t)USBD_BASE + USB_OTG_PCGCCTL_BASE) +#define USB_OTG_INEP(i) ((DWC2_INEndpointTypeDef *)(USBD_BASE + USB_OTG_IN_ENDPOINT_BASE + ((i)*USB_OTG_EP_REG_SIZE))) +#define USB_OTG_OUTEP(i) ((DWC2_OUTEndpointTypeDef *)(USBD_BASE + USB_OTG_OUT_ENDPOINT_BASE + ((i)*USB_OTG_EP_REG_SIZE))) +#define USB_OTG_FIFO(i) *(__IO uint32_t *)(USBD_BASE + USB_OTG_FIFO_BASE + ((i)*USB_OTG_FIFO_SIZE)) + +extern uint32_t SystemCoreClock; + +/* Endpoint state */ +struct dwc2_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +/* Driver state */ +USB_NOCACHE_RAM_SECTION struct dwc2_udc { + USB_MEM_ALIGNX struct usb_setup_packet setup; + USB_MEM_ALIGNX uint8_t pad; /* Pad to CONFIG_USB_ALIGN_SIZE bytes */ + struct dwc2_hw_params hw_params; + struct dwc2_user_params user_params; + struct dwc2_ep_state in_ep[16]; /*!< IN endpoint parameters*/ + struct dwc2_ep_state out_ep[16]; /*!< OUT endpoint parameters */ +} g_dwc2_udc[CONFIG_USBDEV_MAX_BUS]; + +static inline int dwc2_reset(uint8_t busid) +{ + volatile uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + /* Core Soft Reset */ + count = 0U; + USB_OTG_GLB->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; + + if (g_dwc2_udc[busid].hw_params.snpsid < 0x4F54420AU) { + do { + if (++count > 200000U) { + USB_LOG_ERR("DWC2 reset timeout\r\n"); + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST); + } else { + do { + if (++count > 200000U) { + USB_LOG_ERR("DWC2 reset timeout\r\n"); + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_CSRSTDONE) != USB_OTG_GRSTCTL_CSRSTDONE); + + USB_OTG_GLB->GRSTCTL &= ~USB_OTG_GRSTCTL_CSRST; + USB_OTG_GLB->GRSTCTL |= USB_OTG_GRSTCTL_CSRSTDONE; + } + + return 0; +} + +static inline int dwc2_core_init(uint8_t busid) +{ + int ret; + uint32_t regval; + + if (g_dwc2_udc[busid].user_params.phy_type == DWC2_PHY_TYPE_PARAM_FS) { + /* Select FS Embedded PHY */ + USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL; + } else { + regval = USB_OTG_GLB->GUSBCFG; + regval &= ~USB_OTG_GUSBCFG_PHYSEL; + /* disable external vbus source */ + regval &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); + /* disable ULPI FS/LS */ + regval &= ~(USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_ULPICSM); + + switch (g_dwc2_udc[busid].user_params.phy_type) { + case DWC2_PHY_TYPE_PARAM_ULPI: + regval |= USB_OTG_GUSBCFG_ULPI_UTMI_SEL; + regval &= ~USB_OTG_GUSBCFG_PHYIF16; + regval &= ~USB_OTG_GUSBCFG_DDR_SEL; + + if (g_dwc2_udc[busid].user_params.phy_utmi_width == 16) { + regval |= USB_OTG_GUSBCFG_PHYIF16; + } + break; + case DWC2_PHY_TYPE_PARAM_UTMI: + regval &= ~USB_OTG_GUSBCFG_ULPI_UTMI_SEL; + regval &= ~USB_OTG_GUSBCFG_PHYIF16; + break; + + default: + break; + } + USB_OTG_GLB->GUSBCFG = regval; + } + + /* Reset after a PHY select */ + ret = dwc2_reset(busid); + return ret; +} + +static inline void dwc2_set_mode(uint8_t busid, uint8_t mode) +{ + USB_OTG_GLB->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD); + + if (mode == USB_OTG_MODE_HOST) { + USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD; + } else if (mode == USB_OTG_MODE_DEVICE) { + USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD; + } + + while (1) { + if ((USB_OTG_GLB->GINTSTS & 0x1U) == USB_OTG_MODE_DEVICE) { + break; + } + usbd_dwc2_delay_ms(10); + } +} + +static inline int dwc2_flush_rxfifo(uint8_t busid) +{ + volatile uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + count = 0; + USB_OTG_GLB->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; + + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH); + + return 0; +} + +static inline int dwc2_flush_txfifo(uint8_t busid, uint32_t num) +{ + volatile uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + count = 0; + USB_OTG_GLB->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6)); + + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH); + + return 0; +} + +static void dwc2_set_turnaroundtime(uint8_t busid, uint32_t hclk, uint8_t speed) +{ + uint32_t UsbTrd; + + /* The USBTRD is configured according to the tables below, depending on AHB frequency + used by application. In the low AHB frequency range it is used to stretch enough the USB response + time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access + latency to the Data FIFO */ + if (speed == USB_OTG_SPEED_FULL) { + if ((hclk >= 14200000U) && (hclk < 15000000U)) { + /* hclk Clock Range between 14.2-15 MHz */ + UsbTrd = 0xFU; + } else if ((hclk >= 15000000U) && (hclk < 16000000U)) { + /* hclk Clock Range between 15-16 MHz */ + UsbTrd = 0xEU; + } else if ((hclk >= 16000000U) && (hclk < 17200000U)) { + /* hclk Clock Range between 16-17.2 MHz */ + UsbTrd = 0xDU; + } else if ((hclk >= 17200000U) && (hclk < 18500000U)) { + /* hclk Clock Range between 17.2-18.5 MHz */ + UsbTrd = 0xCU; + } else if ((hclk >= 18500000U) && (hclk < 20000000U)) { + /* hclk Clock Range between 18.5-20 MHz */ + UsbTrd = 0xBU; + } else if ((hclk >= 20000000U) && (hclk < 21800000U)) { + /* hclk Clock Range between 20-21.8 MHz */ + UsbTrd = 0xAU; + } else if ((hclk >= 21800000U) && (hclk < 24000000U)) { + /* hclk Clock Range between 21.8-24 MHz */ + UsbTrd = 0x9U; + } else if ((hclk >= 24000000U) && (hclk < 27700000U)) { + /* hclk Clock Range between 24-27.7 MHz */ + UsbTrd = 0x8U; + } else if ((hclk >= 27700000U) && (hclk < 32000000U)) { + /* hclk Clock Range between 27.7-32 MHz */ + UsbTrd = 0x7U; + } else /* if(hclk >= 32000000) */ + { + /* hclk Clock Range between 32-200 MHz */ + UsbTrd = 0x6U; + } + } else if (speed == USB_OTG_SPEED_HIGH) { + UsbTrd = USBD_HS_TRDT_VALUE; + } else { + UsbTrd = USBD_DEFAULT_TRDT_VALUE; + } + + USB_OTG_GLB->GUSBCFG &= ~USB_OTG_GUSBCFG_TRDT; + USB_OTG_GLB->GUSBCFG |= (uint32_t)((UsbTrd << USB_OTG_GUSBCFG_TRDT_Pos) & USB_OTG_GUSBCFG_TRDT); +} + +static void dwc2_set_txfifo(uint8_t busid, uint8_t fifo, uint16_t size) +{ + uint8_t i; + uint32_t tx_offset; + + /* TXn min size = 16 words. (n : Transmit FIFO index) + When a TxFIFO is not used, the Configuration should be as follows: + case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) + --> Txm can use the space allocated for Txn. + case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) + --> Txn should be configured with the minimum space of 16 words + The FIFO is used optimally when used TxFIFOs are allocated in the top + of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. + When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */ + + tx_offset = USB_OTG_GLB->GRXFSIZ; + + if (fifo == 0U) { + USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | tx_offset; + } else { + tx_offset += (USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ) >> 16; + for (i = 0U; i < (fifo - 1U); i++) { + tx_offset += (USB_OTG_GLB->DIEPTXF[i] >> 16); + } + + /* Multiply Tx_Size by 2 to get higher performance */ + USB_OTG_GLB->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | tx_offset; + } + + USB_LOG_INFO("fifo%d size:%04x, offset:%04x\r\n", fifo, size, tx_offset); +} + +static uint8_t dwc2_get_devspeed(uint8_t busid) +{ + uint8_t speed; + uint32_t DevEnumSpeed = USB_OTG_DEV->DSTS & USB_OTG_DSTS_ENUMSPD; + + if (DevEnumSpeed == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) { + speed = USB_OTG_SPEED_HIGH; + } else if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || + (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) { + speed = USB_OTG_SPEED_FULL; + } else { + speed = 0xFU; + } + + return speed; +} + +static void dwc2_ep0_start_read_setup(uint8_t busid, uint8_t *psetup) +{ + USB_OTG_OUTEP(0U)->DOEPTSIZ = 0U; + USB_OTG_OUTEP(0U)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); + USB_OTG_OUTEP(0U)->DOEPTSIZ |= (3U * 8U); + USB_OTG_OUTEP(0U)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_STUPCNT; + + if (g_dwc2_udc[busid].user_params.device_dma_enable) { + usb_dcache_invalidate((uintptr_t)&g_dwc2_udc[busid].setup, USB_ALIGN_UP(8, CONFIG_USB_ALIGN_SIZE)); + + USB_OTG_OUTEP(0U)->DOEPDMA = (uint32_t)psetup; + /* EP enable */ + USB_OTG_OUTEP(0U)->DOEPCTL |= USB_OTG_DOEPCTL_EPENA | USB_OTG_DOEPCTL_USBAEP; + } +} + +void dwc2_ep_write(uint8_t busid, uint8_t ep_idx, uint8_t *src, uint16_t len) +{ + uint32_t *pSrc = (uint32_t *)src; + uint32_t count32b, i; + + count32b = ((uint32_t)len + 3U) / 4U; + for (i = 0U; i < count32b; i++) { + USB_OTG_FIFO((uint32_t)ep_idx) = __UNALIGNED_UINT32_READ(pSrc); + pSrc++; + } +} + +void dwc2_ep_read(uint8_t busid, uint8_t *dest, uint16_t len) +{ + uint32_t *pDest = (uint32_t *)dest; + uint32_t i; + uint32_t count32b = ((uint32_t)len + 3U) / 4U; + + for (i = 0U; i < count32b; i++) { + __UNALIGNED_UINT32_WRITE(pDest, USB_OTG_FIFO(0U)); + pDest++; + } +} + +static void dwc2_tx_fifo_empty_procecss(uint8_t busid, uint8_t ep_idx) +{ + uint32_t len; + uint32_t len32b; + uint32_t fifoemptymsk; + + len = g_dwc2_udc[busid].in_ep[ep_idx].xfer_len - g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len; + if (len > g_dwc2_udc[busid].in_ep[ep_idx].ep_mps) { + len = g_dwc2_udc[busid].in_ep[ep_idx].ep_mps; + } + + len32b = (len + 3U) / 4U; + + while (((USB_OTG_INEP(ep_idx)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b) && + (g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len < g_dwc2_udc[busid].in_ep[ep_idx].xfer_len) && (g_dwc2_udc[busid].in_ep[ep_idx].xfer_len != 0U)) { + /* Write the FIFO */ + len = g_dwc2_udc[busid].in_ep[ep_idx].xfer_len - g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len; + if (len > g_dwc2_udc[busid].in_ep[ep_idx].ep_mps) { + len = g_dwc2_udc[busid].in_ep[ep_idx].ep_mps; + } + if (g_dwc2_udc[busid].in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + if ((USB_OTG_DEV->DSTS & (1U << 8)) == 0U) { + USB_OTG_INEP(ep_idx)->DIEPCTL &= ~USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + USB_OTG_INEP(ep_idx)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } else { + USB_OTG_INEP(ep_idx)->DIEPCTL &= ~USB_OTG_DIEPCTL_SODDFRM; + USB_OTG_INEP(ep_idx)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + USB_OTG_INEP(ep_idx)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT); + USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1U << 29)); + } + + dwc2_ep_write(busid, ep_idx, g_dwc2_udc[busid].in_ep[ep_idx].xfer_buf, len); + g_dwc2_udc[busid].in_ep[ep_idx].xfer_buf += len; + g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len += len; + } + + if (g_dwc2_udc[busid].in_ep[ep_idx].xfer_len <= g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len) { + fifoemptymsk = (uint32_t)(0x1UL << (ep_idx & 0x0f)); + USB_OTG_DEV->DIEPEMPMSK &= ~fifoemptymsk; + } +} + +/** + * @brief dwc2_get_glb_intstatus: return the global USB interrupt status + * @retval status + */ +static inline uint32_t dwc2_get_glb_intstatus(uint8_t busid) +{ + uint32_t tmpreg; + + tmpreg = USB_OTG_GLB->GINTSTS; + tmpreg &= USB_OTG_GLB->GINTMSK; + + return tmpreg; +} + +/** + * @brief dwc2_get_outeps_intstatus: return the USB device OUT endpoints interrupt status + * @retval status + */ +static inline uint32_t dwc2_get_outeps_intstatus(uint8_t busid) +{ + uint32_t tmpreg; + + tmpreg = USB_OTG_DEV->DAINT; + tmpreg &= USB_OTG_DEV->DAINTMSK; + + return ((tmpreg & 0xffff0000U) >> 16); +} + +/** + * @brief dwc2_get_ineps_intstatus: return the USB device IN endpoints interrupt status + * @retval status + */ +static inline uint32_t dwc2_get_ineps_intstatus(uint8_t busid) +{ + uint32_t tmpreg; + + tmpreg = USB_OTG_DEV->DAINT; + tmpreg &= USB_OTG_DEV->DAINTMSK; + + return ((tmpreg & 0xFFFFU)); +} + +/** + * @brief Returns Device OUT EP Interrupt register + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device OUT EP Interrupt register + */ +static inline uint32_t dwc2_get_outep_intstatus(uint8_t busid, uint8_t epnum) +{ + uint32_t tmpreg; + + tmpreg = USB_OTG_OUTEP((uint32_t)epnum)->DOEPINT; + USB_OTG_OUTEP((uint32_t)epnum)->DOEPINT = tmpreg; + tmpreg = tmpreg & USB_OTG_DEV->DOEPMSK; + + return tmpreg; +} + +/** + * @brief Returns Device IN EP Interrupt register + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device IN EP Interrupt register + */ +static inline uint32_t dwc2_get_inep_intstatus(uint8_t busid, uint8_t epnum) +{ + uint32_t tmpreg, msk, emp; + + msk = USB_OTG_DEV->DIEPMSK; + emp = USB_OTG_DEV->DIEPEMPMSK; + msk |= ((emp >> (epnum & 0x0F)) & 0x1U) << 7; + + tmpreg = USB_OTG_INEP((uint32_t)epnum)->DIEPINT; + USB_OTG_INEP((uint32_t)epnum)->DIEPINT = tmpreg; + tmpreg = tmpreg & msk; + + return tmpreg; +} + +int usb_dc_init(uint8_t busid) +{ + int ret; + uint32_t fifo_num; + + memset(&g_dwc2_udc[busid], 0, sizeof(struct dwc2_udc)); + + usb_dc_low_level_init(busid); + + USB_LOG_INFO("========== dwc2 dcd params ==========\r\n"); + USB_LOG_INFO("CID:%08x\r\n", (unsigned int)USB_OTG_GLB->CID); + USB_LOG_INFO("GSNPSID:%08x\r\n", (unsigned int)USB_OTG_GLB->GSNPSID); + USB_LOG_INFO("GHWCFG1:%08x\r\n", (unsigned int)USB_OTG_GLB->GHWCFG1); + USB_LOG_INFO("GHWCFG2:%08x\r\n", (unsigned int)USB_OTG_GLB->GHWCFG2); + USB_LOG_INFO("GHWCFG3:%08x\r\n", (unsigned int)USB_OTG_GLB->GHWCFG3); + USB_LOG_INFO("GHWCFG4:%08x\r\n", (unsigned int)USB_OTG_GLB->GHWCFG4); + + dwc2_get_hwparams(USBD_BASE, &g_dwc2_udc[busid].hw_params); + dwc2_get_user_params(USBD_BASE, &g_dwc2_udc[busid].user_params); + + if (g_dwc2_udc[busid].user_params.phy_utmi_width == 0) { + g_dwc2_udc[busid].user_params.phy_utmi_width = 8; + } + if (g_dwc2_udc[busid].user_params.total_fifo_size == 0) { + g_dwc2_udc[busid].user_params.total_fifo_size = g_dwc2_udc[busid].hw_params.total_fifo_size; + } + + USB_LOG_INFO("dwc2 has %d endpoints and dfifo depth(32-bit words) is %d\r\n", + g_dwc2_udc[busid].hw_params.num_dev_ep + 1, + g_dwc2_udc[busid].user_params.total_fifo_size); + + USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; + + USB_OTG_DEV->DCTL |= USB_OTG_DCTL_SDIS; + + /* This is vendor register */ + USB_OTG_GLB->GCCFG = g_dwc2_udc[busid].user_params.device_gccfg; + + ret = dwc2_core_init(busid); + + /* Force Device Mode*/ + dwc2_set_mode(busid, USB_OTG_MODE_DEVICE); + + if (g_dwc2_udc[busid].user_params.b_session_valid_override) { + /* B-peripheral session valid override enable */ + USB_OTG_GLB->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN; + USB_OTG_GLB->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL; + } + + USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_TOCAL; + + for (uint8_t i = 0U; i < 15U; i++) { + USB_OTG_GLB->DIEPTXF[i] = 0U; + } + + /* Restart the Phy Clock */ + USB_OTG_PCGCCTL = 0U; + + /* Device speed configuration */ + USB_OTG_DEV->DCFG &= ~USB_OTG_DCFG_DSPD; + + if (g_dwc2_udc[busid].user_params.phy_type != DWC2_PHY_TYPE_PARAM_FS) { + USB_ASSERT_MSG(g_dwc2_udc[busid].hw_params.hs_phy_type != 0, "This dwc2 version does not support hs, so stop working"); + USB_OTG_DEV->DCFG |= USB_OTG_SPEED_HIGH; + } else { + if (g_dwc2_udc[busid].hw_params.hs_phy_type == 0) { + USB_OTG_DEV->DCFG |= USB_OTG_SPEED_FULL; + } else { + USB_OTG_DEV->DCFG |= USB_OTG_SPEED_HIGH_IN_FULL; + } + } + + /* Clear all pending Device Interrupts */ + USB_OTG_DEV->DIEPMSK = 0U; + USB_OTG_DEV->DOEPMSK = 0U; + USB_OTG_DEV->DAINTMSK = 0U; + + /* Disable all interrupts. */ + USB_OTG_GLB->GINTMSK = 0U; + /* Clear any pending interrupts */ + USB_OTG_GLB->GINTSTS = 0xBFFFFFFFU; + + /* Enable interrupts matching to the Device mode ONLY */ + USB_OTG_GLB->GINTMSK = USB_OTG_GINTMSK_USBRST | USB_OTG_GINTMSK_ENUMDNEM | + USB_OTG_GINTMSK_OEPINT | USB_OTG_GINTMSK_IEPINT | + USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_WUIM; + + if (g_dwc2_udc[busid].user_params.device_dma_enable) { + USB_ASSERT_MSG(g_dwc2_udc[busid].hw_params.arch == GHWCFG2_INT_DMA_ARCH, "This dwc2 version does not support dma mode, so stop working"); + + USB_OTG_DEV->DCFG &= ~USB_OTG_DCFG_DESCDMA; + USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_HBSTLEN; + USB_OTG_GLB->GAHBCFG |= (USB_OTG_GAHBCFG_DMAEN | USB_OTG_GAHBCFG_HBSTLEN_4); + } else { + USB_OTG_GLB->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; + } + +#ifdef CONFIG_USBDEV_SOF_ENABLE + USB_OTG_GLB->GINTMSK |= USB_OTG_GINTMSK_SOFM; +#endif + + USB_OTG_GLB->GRXFSIZ = g_dwc2_udc[busid].user_params.device_rx_fifo_size; + + fifo_num = g_dwc2_udc[busid].user_params.device_rx_fifo_size; + for (uint8_t i = 0; i < (g_dwc2_udc[busid].hw_params.num_dev_ep + 1); i++) { + dwc2_set_txfifo(busid, i, g_dwc2_udc[busid].user_params.device_tx_fifo_size[i]); + fifo_num += g_dwc2_udc[busid].user_params.device_tx_fifo_size[i]; + + USB_ASSERT_MSG(fifo_num <= g_dwc2_udc[busid].user_params.total_fifo_size, "Your fifo config is overflow, please check"); + } + + if (g_dwc2_udc[busid].user_params.phy_type != DWC2_PHY_TYPE_PARAM_FS) { + USB_ASSERT_MSG(g_dwc2_udc[busid].user_params.device_rx_fifo_size >= (5 + 8 + 512 / 4 + 1 + 2 * 8 + 1), "Your rx fifo size config is invalid, please check"); + } else { + USB_ASSERT_MSG(g_dwc2_udc[busid].user_params.device_rx_fifo_size >= (5 + 8 + 64 / 4 + 1 + 2 * 8 + 1), "Your rx fifo size config is invalid, please check"); + } + + ret = dwc2_flush_txfifo(busid, 0x10U); + ret = dwc2_flush_rxfifo(busid); + + USB_OTG_GLB->GAHBCFG |= USB_OTG_GAHBCFG_GINT; + USB_OTG_DEV->DCTL &= ~USB_OTG_DCTL_SDIS; + + return ret; +} + +int usb_dc_deinit(uint8_t busid) +{ + USB_OTG_GLB->GAHBCFG |= USB_OTG_GAHBCFG_GINT; + USB_OTG_DEV->DCTL |= USB_OTG_DCTL_SDIS; + + /* Clear Pending interrupt */ + for (uint8_t i = 0U; i < 15U; i++) { + USB_OTG_INEP(i)->DIEPINT = 0xFB7FU; + USB_OTG_OUTEP(i)->DOEPINT = 0xFB7FU; + } + + /* Clear interrupt masks */ + USB_OTG_DEV->DIEPMSK = 0U; + USB_OTG_DEV->DOEPMSK = 0U; + USB_OTG_DEV->DAINTMSK = 0U; + + /* Flush the FIFO */ + dwc2_flush_txfifo(busid, 0x10U); + dwc2_flush_rxfifo(busid); + + usb_dc_low_level_deinit(busid); + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + USB_OTG_DEV->DCFG &= ~(USB_OTG_DCFG_DAD); + USB_OTG_DEV->DCFG |= ((uint32_t)addr << 4) & USB_OTG_DCFG_DAD; + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + if (!(USB_OTG_DEV->DSTS & USB_OTG_DSTS_SUSPSTS)) { + return -1; + } + USB_OTG_DEV->DCTL |= USB_OTG_DCTL_RWUSIG; + usbd_dwc2_delay_ms(10); + USB_OTG_DEV->DCTL &= ~USB_OTG_DCTL_RWUSIG; + return 0; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + uint8_t speed; + uint32_t DevEnumSpeed = USB_OTG_DEV->DSTS & USB_OTG_DSTS_ENUMSPD; + + if (DevEnumSpeed == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) { + speed = USB_SPEED_HIGH; + } else if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || + (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) { + speed = USB_SPEED_FULL; + } else { + speed = USB_SPEED_FULL; + } + + return speed; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + uint16_t ep_mps; + + USB_ASSERT_MSG(ep_idx < (g_dwc2_udc[busid].hw_params.num_dev_ep + 1), "Ep addr %02x overflow", ep->bEndpointAddress); + + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_dwc2_udc[busid].out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_dwc2_udc[busid].out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + + ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + if (ep_idx == 0) { + switch (ep_mps) { + case 64: + ep_mps = EP_MPS_64; + break; + case 32: + ep_mps = EP_MPS_32; + break; + case 16: + ep_mps = EP_MPS_16; + break; + case 8: + ep_mps = EP_MPS_8; + break; + + default: + ep_mps = EP_MPS_64; + break; + } + } + + USB_OTG_DEV->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & (uint32_t)(1UL << (16 + ep_idx)); + + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= (ep_mps & USB_OTG_DOEPCTL_MPSIZ) | + ((uint32_t)USB_GET_ENDPOINT_TYPE(ep->bmAttributes) << 18) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DOEPCTL_USBAEP; + } else { + uint16_t fifo_size; + if (ep_idx == 0) { + fifo_size = (USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ >> 16); + } else { + fifo_size = (USB_OTG_GLB->DIEPTXF[ep_idx - 1U] >> 16); + } + + USB_ASSERT_MSG((fifo_size * 4) >= USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize), "Ep addr %02x fifo overflow", ep->bEndpointAddress); + + g_dwc2_udc[busid].in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_dwc2_udc[busid].in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + + ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + if (ep_idx == 0) { + switch (ep_mps) { + case 64: + ep_mps = EP_MPS_64; + break; + case 32: + ep_mps = EP_MPS_32; + break; + case 16: + ep_mps = EP_MPS_16; + break; + case 8: + ep_mps = EP_MPS_8; + break; + + default: + ep_mps = EP_MPS_64; + break; + } + } + + USB_OTG_DEV->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << ep_idx); + + USB_OTG_INEP(ep_idx)->DIEPCTL |= (ep_mps & USB_OTG_DIEPCTL_MPSIZ) | + ((uint32_t)USB_GET_ENDPOINT_TYPE(ep->bmAttributes) << 18) | (ep_idx << 22) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DIEPCTL_USBAEP; + dwc2_flush_txfifo(busid, ep_idx); + } + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + volatile uint32_t count = 0U; + + if (USB_EP_DIR_IS_OUT(ep)) { + if (USB_OTG_OUTEP(ep_idx)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) { + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + + /* Wait for endpoint disabled interrupt */ + count = 0; + do { + if (++count > 50000) { + break; + } + } while ((USB_OTG_OUTEP(ep_idx)->DOEPINT & USB_OTG_DOEPINT_EPDISD) != USB_OTG_DOEPINT_EPDISD); + + /* Clear and unmask endpoint disabled interrupt */ + USB_OTG_OUTEP(ep_idx)->DOEPINT = USB_OTG_DOEPINT_EPDISD; + } + + USB_OTG_DEV->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep_idx & 0x07)) << 16)); + USB_OTG_DEV->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep_idx & 0x07)) << 16)); + USB_OTG_OUTEP(ep_idx)->DOEPCTL = 0; + } else { + if (USB_OTG_INEP(ep_idx)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) { + USB_OTG_INEP(ep_idx)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USB_OTG_INEP(ep_idx)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + + /* Wait for endpoint disabled interrupt */ + count = 0; + do { + if (++count > 50000) { + break; + } + } while ((USB_OTG_INEP(ep_idx)->DIEPINT & USB_OTG_DIEPINT_EPDISD) != USB_OTG_DIEPINT_EPDISD); + + /* Clear and unmask endpoint disabled interrupt */ + USB_OTG_INEP(ep_idx)->DIEPINT = USB_OTG_DIEPINT_EPDISD; + } + + USB_OTG_DEV->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep_idx & 0x07))); + USB_OTG_DEV->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep_idx & 0x07))); + USB_OTG_INEP(ep_idx)->DIEPCTL = 0; + } + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + if (((USB_OTG_OUTEP(ep_idx)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == 0U) && (ep_idx != 0U)) { + USB_OTG_OUTEP(ep_idx)->DOEPCTL &= ~(USB_OTG_DOEPCTL_EPDIS); + } + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= USB_OTG_DOEPCTL_STALL; + } else { + if (((USB_OTG_INEP(ep_idx)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == 0U) && (ep_idx != 0U)) { + USB_OTG_INEP(ep_idx)->DIEPCTL &= ~(USB_OTG_DIEPCTL_EPDIS); + } + USB_OTG_INEP(ep_idx)->DIEPCTL |= USB_OTG_DIEPCTL_STALL; + } + + if ((ep_idx == 0) && g_dwc2_udc[busid].user_params.device_dma_enable) { + dwc2_ep0_start_read_setup(busid, (uint8_t *)&g_dwc2_udc[busid].setup); + } + + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + USB_OTG_OUTEP(ep_idx)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; + if ((g_dwc2_udc[busid].out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_INTERRUPT) || + (g_dwc2_udc[busid].out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_BULK)) { + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; /* DATA0 */ + } + } else { + USB_OTG_INEP(ep_idx)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; + if ((g_dwc2_udc[busid].in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_INTERRUPT) || + (g_dwc2_udc[busid].in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_BULK)) { + USB_OTG_INEP(ep_idx)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; /* DATA0 */ + } + } + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + if (USB_OTG_OUTEP(ep_idx)->DOEPCTL & USB_OTG_DOEPCTL_STALL) { + *stalled = 1; + } else { + *stalled = 0; + } + } else { + if (USB_OTG_INEP(ep_idx)->DIEPCTL & USB_OTG_DIEPCTL_STALL) { + *stalled = 1; + } else { + *stalled = 0; + } + } + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint32_t pktcnt = 0; + + USB_ASSERT_MSG(!((uint32_t)data % 0x04), "dwc2 data must be 4-byte aligned"); + + if (g_dwc2_udc[busid].user_params.device_dma_enable) { + USB_ASSERT_MSG(!((uint32_t)data % CONFIG_USB_ALIGN_SIZE), "dwc2 data must be %d-byte aligned", CONFIG_USB_ALIGN_SIZE); + } + + if (!data && data_len) { + return -1; + } + + if (ep_idx && !(USB_OTG_INEP(ep_idx)->DIEPCTL & USB_OTG_DIEPCTL_MPSIZ)) { + return -2; + } + + g_dwc2_udc[busid].in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_dwc2_udc[busid].in_ep[ep_idx].xfer_len = data_len; + g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len = 0; + + USB_OTG_INEP(ep_idx)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); + USB_OTG_INEP(ep_idx)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); + + if (data_len == 0) { + USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USB_OTG_INEP(ep_idx)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + return 0; + } + + if (ep_idx == 0) { + if (data_len > g_dwc2_udc[busid].in_ep[ep_idx].ep_mps) { + data_len = g_dwc2_udc[busid].in_ep[ep_idx].ep_mps; + } + g_dwc2_udc[busid].in_ep[ep_idx].xfer_len = data_len; + USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & data_len); + } else { + pktcnt = (uint16_t)((data_len + g_dwc2_udc[busid].in_ep[ep_idx].ep_mps - 1U) / g_dwc2_udc[busid].in_ep[ep_idx].ep_mps); + + USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (pktcnt << 19)); + USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & data_len); + } + + if (g_dwc2_udc[busid].in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + if ((USB_OTG_DEV->DSTS & (1U << 8)) == 0U) { + USB_OTG_INEP(ep_idx)->DIEPCTL &= ~USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + USB_OTG_INEP(ep_idx)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } else { + USB_OTG_INEP(ep_idx)->DIEPCTL &= ~USB_OTG_DIEPCTL_SODDFRM; + USB_OTG_INEP(ep_idx)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + } + + if (g_dwc2_udc[busid].in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS || + g_dwc2_udc[busid].in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_INTERRUPT) { + USB_OTG_INEP(ep_idx)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT); + USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & ((usbd_get_ep_mult(busid, ep) + 1) << 29)); + } + + if (g_dwc2_udc[busid].user_params.device_dma_enable) { + usb_dcache_clean((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); + USB_OTG_INEP(ep_idx)->DIEPDMA = (uint32_t)data; + + USB_OTG_INEP(ep_idx)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + } else { + USB_OTG_INEP(ep_idx)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (data_len > 0U) { + USB_OTG_DEV->DIEPEMPMSK |= 1UL << (ep_idx & 0x0f); + } + } + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint32_t pktcnt = 0; + + USB_ASSERT_MSG(!((uint32_t)data % 0x04), "dwc2 data must be 4-byte aligned"); + + if (g_dwc2_udc[busid].user_params.device_dma_enable) { + USB_ASSERT_MSG(!((uint32_t)data % CONFIG_USB_ALIGN_SIZE), "dwc2 data must be %d-byte aligned", CONFIG_USB_ALIGN_SIZE); + } + + if (!data && data_len) { + return -1; + } + + if (ep_idx && !(USB_OTG_OUTEP(ep_idx)->DOEPCTL & USB_OTG_DOEPCTL_MPSIZ)) { + return -2; + } + + g_dwc2_udc[busid].out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_dwc2_udc[busid].out_ep[ep_idx].xfer_len = data_len; + g_dwc2_udc[busid].out_ep[ep_idx].actual_xfer_len = 0; + + USB_OTG_OUTEP(ep_idx)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT); + USB_OTG_OUTEP(ep_idx)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ); + if (data_len == 0) { + USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19)); + USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & g_dwc2_udc[busid].out_ep[ep_idx].ep_mps); + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); + return 0; + } + + if (ep_idx == 0) { + if (data_len > g_dwc2_udc[busid].out_ep[ep_idx].ep_mps) { + data_len = g_dwc2_udc[busid].out_ep[ep_idx].ep_mps; + } + g_dwc2_udc[busid].out_ep[ep_idx].xfer_len = data_len; + USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); + USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & data_len); + } else { + pktcnt = (uint16_t)((data_len + g_dwc2_udc[busid].out_ep[ep_idx].ep_mps - 1U) / g_dwc2_udc[busid].out_ep[ep_idx].ep_mps); + + USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (pktcnt << 19)); + USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & data_len); + } + + if (g_dwc2_udc[busid].user_params.device_dma_enable) { + usb_dcache_invalidate((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); + USB_OTG_OUTEP(ep_idx)->DOEPDMA = (uint32_t)data; + } + if (g_dwc2_udc[busid].out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + if ((USB_OTG_DEV->DSTS & (1U << 8)) == 0U) { + USB_OTG_OUTEP(ep_idx)->DOEPCTL &= ~USB_OTG_DOEPCTL_SD0PID_SEVNFRM; + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= USB_OTG_DOEPCTL_SODDFRM; + } else { + USB_OTG_OUTEP(ep_idx)->DOEPCTL &= ~USB_OTG_DOEPCTL_SODDFRM; + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; + } + } + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); + return 0; +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint32_t gint_status, temp, ep_idx, ep_intr, epint, read_count; + gint_status = dwc2_get_glb_intstatus(busid); + + (void)read_count; + + if ((USB_OTG_GLB->GINTSTS & 0x1U) == USB_OTG_MODE_DEVICE) { + /* Avoid spurious interrupt */ + if (gint_status == 0) { + return; + } + + if (!g_dwc2_udc[busid].user_params.device_dma_enable) { + /* Handle RxQLevel Interrupt */ + if (gint_status & USB_OTG_GINTSTS_RXFLVL) { + USB_MASK_INTERRUPT(USB_OTG_GLB, USB_OTG_GINTSTS_RXFLVL); + + temp = USB_OTG_GLB->GRXSTSP; + ep_idx = temp & USB_OTG_GRXSTSP_EPNUM; + + if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> USB_OTG_GRXSTSP_PKTSTS_Pos) == STS_DATA_UPDT) { + read_count = (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + if (read_count != 0) { + dwc2_ep_read(busid, g_dwc2_udc[busid].out_ep[ep_idx].xfer_buf, read_count); + g_dwc2_udc[busid].out_ep[ep_idx].xfer_buf += read_count; + } + } else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> USB_OTG_GRXSTSP_PKTSTS_Pos) == STS_SETUP_UPDT) { + read_count = (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + dwc2_ep_read(busid, (uint8_t *)&g_dwc2_udc[busid].setup, read_count); + } else { + /* ... */ + } + USB_UNMASK_INTERRUPT(USB_OTG_GLB, USB_OTG_GINTSTS_RXFLVL); + } + } + + if (gint_status & USB_OTG_GINTSTS_OEPINT) { + ep_idx = 0; + ep_intr = dwc2_get_outeps_intstatus(busid); + while (ep_intr != 0U) { + if ((ep_intr & 0x1U) != 0U) { + epint = dwc2_get_outep_intstatus(busid, ep_idx); + + if ((epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC) { + if (ep_idx == 0) { + if (usbd_get_ep0_next_state(busid) == USBD_EP0_STATE_SETUP) { + goto process_setup; // goto ep0 setup, xfer_len is not used + } + + if (g_dwc2_udc[busid].out_ep[ep_idx].xfer_len == 0) { + /* If ep0 xfer_len is 0, it means that we are in outstatus phase */ + g_dwc2_udc[busid].out_ep[ep_idx].actual_xfer_len = 0; + } else { + /* If ep0 xfer_len is not 0, it means that we are in outdata phase */ + g_dwc2_udc[busid].out_ep[ep_idx].actual_xfer_len = g_dwc2_udc[busid].out_ep[ep_idx].xfer_len - ((USB_OTG_OUTEP(ep_idx)->DOEPTSIZ) & USB_OTG_DOEPTSIZ_XFRSIZ); + } + + g_dwc2_udc[busid].out_ep[ep_idx].xfer_len = 0; + if (g_dwc2_udc[busid].user_params.device_dma_enable) { + usb_dcache_invalidate((uintptr_t)g_dwc2_udc[busid].out_ep[ep_idx].xfer_buf, USB_ALIGN_UP(g_dwc2_udc[busid].out_ep[ep_idx].actual_xfer_len, CONFIG_USB_ALIGN_SIZE)); + } + usbd_event_ep_out_complete_handler(busid, 0x00, g_dwc2_udc[busid].out_ep[ep_idx].actual_xfer_len); + + if (usbd_get_ep0_next_state(busid) == USBD_EP0_STATE_SETUP) { + /* Out status, start reading setup */ + dwc2_ep0_start_read_setup(busid, (uint8_t *)&g_dwc2_udc[busid].setup); + } + } else { + g_dwc2_udc[busid].out_ep[ep_idx].actual_xfer_len = g_dwc2_udc[busid].out_ep[ep_idx].xfer_len - ((USB_OTG_OUTEP(ep_idx)->DOEPTSIZ) & USB_OTG_DOEPTSIZ_XFRSIZ); + g_dwc2_udc[busid].out_ep[ep_idx].xfer_len = 0; + if (g_dwc2_udc[busid].user_params.device_dma_enable) { + usb_dcache_invalidate((uintptr_t)g_dwc2_udc[busid].out_ep[ep_idx].xfer_buf, USB_ALIGN_UP(g_dwc2_udc[busid].out_ep[ep_idx].actual_xfer_len, CONFIG_USB_ALIGN_SIZE)); + } + usbd_event_ep_out_complete_handler(busid, ep_idx, g_dwc2_udc[busid].out_ep[ep_idx].actual_xfer_len); + } + } + // clang-format off +process_setup: + // clang-format on + if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) { + if (g_dwc2_udc[busid].user_params.device_dma_enable) { + usb_dcache_invalidate((uintptr_t)&g_dwc2_udc[busid].setup, USB_ALIGN_UP(8, CONFIG_USB_ALIGN_SIZE)); + } + usbd_event_ep0_setup_complete_handler(busid, (uint8_t *)&g_dwc2_udc[busid].setup); + } + } + ep_intr >>= 1U; + ep_idx++; + } + } + if (gint_status & USB_OTG_GINTSTS_IEPINT) { + ep_idx = 0U; + ep_intr = dwc2_get_ineps_intstatus(busid); + while (ep_intr != 0U) { + if ((ep_intr & 0x1U) != 0U) { + epint = dwc2_get_inep_intstatus(busid, ep_idx); + + if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC) { + if (ep_idx == 0) { + g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len = g_dwc2_udc[busid].in_ep[ep_idx].xfer_len - ((USB_OTG_INEP(ep_idx)->DIEPTSIZ) & USB_OTG_DIEPTSIZ_XFRSIZ); + g_dwc2_udc[busid].in_ep[ep_idx].xfer_len = 0; + usbd_event_ep_in_complete_handler(busid, 0x80, g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len); + + if (usbd_get_ep0_next_state(busid) == USBD_EP0_STATE_SETUP) { + /* In status, start reading setup */ + dwc2_ep0_start_read_setup(busid, (uint8_t *)&g_dwc2_udc[busid].setup); + } + } else { + g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len = g_dwc2_udc[busid].in_ep[ep_idx].xfer_len - ((USB_OTG_INEP(ep_idx)->DIEPTSIZ) & USB_OTG_DIEPTSIZ_XFRSIZ); + g_dwc2_udc[busid].in_ep[ep_idx].xfer_len = 0; + usbd_event_ep_in_complete_handler(busid, ep_idx | 0x80, g_dwc2_udc[busid].in_ep[ep_idx].actual_xfer_len); + } + } + if (!g_dwc2_udc[busid].user_params.device_dma_enable) { + if ((epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE) { + dwc2_tx_fifo_empty_procecss(busid, ep_idx); + } + } + } + ep_intr >>= 1U; + ep_idx++; + } + } + if (gint_status & USB_OTG_GINTSTS_USBRST) { + USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_USBRST; + USB_OTG_DEV->DCTL &= ~USB_OTG_DCTL_RWUSIG; + + dwc2_flush_txfifo(busid, 0x10U); + dwc2_flush_rxfifo(busid); + + for (uint8_t i = 0U; i < (g_dwc2_udc[busid].hw_params.num_dev_ep + 1); i++) { + if (i == 0U) { + USB_OTG_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_SNAK; + USB_OTG_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_SNAK; + } else { + if (USB_OTG_INEP(i)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) { + USB_OTG_INEP(i)->DIEPCTL = (USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK); + } else { + USB_OTG_INEP(i)->DIEPCTL = 0; + } + if (USB_OTG_OUTEP(i)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) { + USB_OTG_OUTEP(i)->DOEPCTL = (USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK); + } else { + USB_OTG_OUTEP(i)->DOEPCTL = 0; + } + } + USB_OTG_INEP(i)->DIEPTSIZ = 0U; + USB_OTG_INEP(i)->DIEPINT = 0xFBFFU; + USB_OTG_OUTEP(i)->DOEPTSIZ = 0U; + USB_OTG_OUTEP(i)->DOEPINT = 0xFBFFU; + } + + USB_OTG_DEV->DAINTMSK |= 0x10001U; + + USB_OTG_DEV->DOEPMSK = USB_OTG_DOEPMSK_STUPM | + USB_OTG_DOEPMSK_XFRCM; + + USB_OTG_DEV->DIEPMSK = USB_OTG_DIEPMSK_XFRCM; + + memset(g_dwc2_udc[busid].in_ep, 0, sizeof(struct dwc2_ep_state) * 16); + memset(g_dwc2_udc[busid].out_ep, 0, sizeof(struct dwc2_ep_state) * 16); + usbd_event_reset_handler(busid); + /* Start reading setup */ + dwc2_ep0_start_read_setup(busid, (uint8_t *)&g_dwc2_udc[busid].setup); + } + if (gint_status & USB_OTG_GINTSTS_ENUMDNE) { + USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_ENUMDNE; + dwc2_set_turnaroundtime(busid, SystemCoreClock, dwc2_get_devspeed(busid)); + + USB_OTG_DEV->DCTL |= USB_OTG_DCTL_CGINAK; + } + if (gint_status & USB_OTG_GINTSTS_PXFR_INCOMPISOOUT) { + USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_PXFR_INCOMPISOOUT; + } + + if (gint_status & USB_OTG_GINTSTS_IISOIXFR) { + USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_IISOIXFR; + } +#ifdef CONFIG_USBDEV_SOF_ENABLE + if (gint_status & USB_OTG_GINTSTS_SOF) { + USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_SOF; + usbd_event_sof_handler(busid); + } +#endif + if (gint_status & USB_OTG_GINTSTS_USBSUSP) { + USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_USBSUSP; + usbd_event_suspend_handler(busid); + } + if (gint_status & USB_OTG_GINTSTS_WKUINT) { + USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_WKUINT; + usbd_event_resume_handler(busid); + } + if (gint_status & USB_OTG_GINTSTS_OTGINT) { + temp = USB_OTG_GLB->GOTGINT; + if ((temp & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET) { + } else { + } + USB_OTG_GLB->GOTGINT |= temp; + } + } +} diff --git a/src/lib/CherryUSB/port/dwc2/usb_dwc2_param.h b/src/lib/CherryUSB/port/dwc2/usb_dwc2_param.h new file mode 100644 index 000000000..74e436c22 --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_dwc2_param.h @@ -0,0 +1,367 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef __USB_DWC2_PARAM_H__ +#define __USB_DWC2_PARAM_H__ + +/* Maximum number of Endpoints/HostChannels */ +#define MAX_EPS_CHANNELS 16 + +#define HSOTG_REG(x) (x) + +#define dwc2_readl(addr) \ + (*(volatile uint32_t *)(addr)) + +#define GUID_OFFSET HSOTG_REG(0x003C) + +#define GSNPSID_OFFSET HSOTG_REG(0x0040) +#define GSNPSID_ID_MASK (0xFFFF0000UL) + +#define GHWCFG1_OFFSET HSOTG_REG(0x0044) + +#define GHWCFG2_OFFSET HSOTG_REG(0x0048) +#define GHWCFG2_OTG_ENABLE_IC_USB (0x01UL << 31U) +#define GHWCFG2_DEV_TOKEN_Q_DEPTH_MASK (0x1FUL << 26U) +#define GHWCFG2_DEV_TOKEN_Q_DEPTH_SHIFT (26U) +#define GHWCFG2_HOST_PERIO_TX_Q_DEPTH_MASK (0x03UL << 24U) +#define GHWCFG2_HOST_PERIO_TX_Q_DEPTH_SHIFT (24U) +#define GHWCFG2_NONPERIO_TX_Q_DEPTH_MASK (0x03UL << 22U) +#define GHWCFG2_NONPERIO_TX_Q_DEPTH_SHIFT (22U) +#define GHWCFG2_MULTI_PROC_INT (0x01UL << 20U) +#define GHWCFG2_DYNAMIC_FIFO (0x01UL << 19U) +#define GHWCFG2_PERIO_EP_SUPPORTED (0x01UL << 18U) +#define GHWCFG2_NUM_HOST_CHAN_MASK (0x0FUL << 14U) +#define GHWCFG2_NUM_HOST_CHAN_SHIFT (14U) +#define GHWCFG2_NUM_DEV_EP_MASK (0x0FUL << 10U) +#define GHWCFG2_NUM_DEV_EP_SHIFT (10U) +#define GHWCFG2_FS_PHY_TYPE_MASK (0x03UL << 8U) +#define GHWCFG2_FS_PHY_TYPE_SHIFT (8U) +#define GHWCFG2_FS_PHY_TYPE_NOT_SUPPORTED (0x00UL) +#define GHWCFG2_FS_PHY_TYPE_DEDICATED (0x01UL) +#define GHWCFG2_FS_PHY_TYPE_SHARED_UTMI (0x02UL) +#define GHWCFG2_FS_PHY_TYPE_SHARED_ULPI (0x03UL) +#define GHWCFG2_HS_PHY_TYPE_MASK (0x03UL << 6U) +#define GHWCFG2_HS_PHY_TYPE_SHIFT (6U) +#define GHWCFG2_HS_PHY_TYPE_NOT_SUPPORTED (0x00UL) +#define GHWCFG2_HS_PHY_TYPE_UTMI (0x01UL) +#define GHWCFG2_HS_PHY_TYPE_ULPI (0x02UL) +#define GHWCFG2_HS_PHY_TYPE_UTMI_ULPI (0x03UL) +#define GHWCFG2_POINT2POINT (0x01UL << 5U) +#define GHWCFG2_ARCHITECTURE_MASK (0x03UL << 3U) +#define GHWCFG2_ARCHITECTURE_SHIFT (3U) +#define GHWCFG2_SLAVE_ONLY_ARCH (0x00UL) +#define GHWCFG2_EXT_DMA_ARCH (0x01UL) +#define GHWCFG2_INT_DMA_ARCH (0x02UL) +#define GHWCFG2_OP_MODE_MASK (0x07UL << 0U) +#define GHWCFG2_OP_MODE_SHIFT (0U) +#define GHWCFG2_OP_MODE_HNP_SRP_CAPABLE (0x00UL) +#define GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE (0x01UL) +#define GHWCFG2_OP_MODE_NO_HNP_SRP_CAPABLE (0x02UL) +#define GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE (0x03UL) +#define GHWCFG2_OP_MODE_NO_SRP_CAPABLE_DEVICE (0x04UL) +#define GHWCFG2_OP_MODE_SRP_CAPABLE_HOST (0x05UL) +#define GHWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST (0x06UL) +#define GHWCFG2_OP_MODE_UNDEFINED (0x07UL) + +#define GHWCFG3_OFFSET HSOTG_REG(0x004C) +#define GHWCFG3_DFIFO_DEPTH_MASK (0xFFFFUL << 16U) +#define GHWCFG3_DFIFO_DEPTH_SHIFT (16U) +#define GHWCFG3_OTG_LPM_EN (0x0001UL << 15U) +#define GHWCFG3_BC_SUPPORT (0x0001UL << 14U) +#define GHWCFG3_OTG_ENABLE_HSIC (0x0001UL << 13U) +#define GHWCFG3_ADP_SUPP (0x0001UL << 12U) +#define GHWCFG3_SYNCH_RESET_TYPE (0x0001UL << 11U) +#define GHWCFG3_OPTIONAL_FEATURES (0x0001UL << 10U) +#define GHWCFG3_VENDOR_CTRL_IF (0x0001UL << 9U) +#define GHWCFG3_I2C (0x0001UL << 8U) +#define GHWCFG3_OTG_FUNC (0x0001UL << 7U) +#define GHWCFG3_PACKET_SIZE_CNTR_WIDTH_MASK (0x0007UL << 4U) +#define GHWCFG3_PACKET_SIZE_CNTR_WIDTH_SHIFT (4U) +#define GHWCFG3_XFER_SIZE_CNTR_WIDTH_MASK (0x000FUL << 0U) +#define GHWCFG3_XFER_SIZE_CNTR_WIDTH_SHIFT (0U) + +#define GHWCFG4_OFFSET HSOTG_REG(0x0050) +#define GHWCFG4_DESC_DMA_DYN (0x1UL << 31U) +#define GHWCFG4_DESC_DMA (0x1UL << 30U) +#define GHWCFG4_NUM_IN_EPS_MASK (0xFUL << 26U) +#define GHWCFG4_NUM_IN_EPS_SHIFT (26U) +#define GHWCFG4_DED_FIFO_EN (0x1UL << 25U) +#define GHWCFG4_DED_FIFO_SHIFT (25U) +#define GHWCFG4_SESSION_END_FILT_EN (0x1UL << 24U) +#define GHWCFG4_B_VALID_FILT_EN (0x1UL << 23U) +#define GHWCFG4_A_VALID_FILT_EN (0x1UL << 22U) +#define GHWCFG4_VBUS_VALID_FILT_EN (0x1UL << 21U) +#define GHWCFG4_IDDIG_FILT_EN (0x1UL << 20U) +#define GHWCFG4_NUM_DEV_MODE_CTRL_EP_MASK (0xFUL << 16U) +#define GHWCFG4_NUM_DEV_MODE_CTRL_EP_SHIFT (16U) +#define GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK (0x3UL << 14U) +#define GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT (14U) +#define GHWCFG4_UTMI_PHY_DATA_WIDTH_8 (0x0UL) +#define GHWCFG4_UTMI_PHY_DATA_WIDTH_16 (0x1UL) +#define GHWCFG4_UTMI_PHY_DATA_WIDTH_8_OR_16 (0x2UL) +#define GHWCFG4_ACG_SUPPORTED (0x1UL << 12U) +#define GHWCFG4_IPG_ISOC_SUPPORTED (0x1UL << 11U) +#define GHWCFG4_SERVICE_INTERVAL_SUPPORTED (0x1UL << 10U) +#define GHWCFG4_XHIBER (0x1UL << 7U) +#define GHWCFG4_HIBER (0x1UL << 6U) +#define GHWCFG4_MIN_AHB_FREQ (0x1UL << 5U) +#define GHWCFG4_POWER_OPTIMIZ (0x1UL << 4U) +#define GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK (0xFUL << 0U) +#define GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT (0U) + +/** + * struct dwc2_hw_params - Autodetected parameters. + * + * These parameters are the various parameters read from hardware + * registers during initialization. They typically contain the best + * supported or maximum value that can be configured in the + * corresponding dwc2_core_params value. + * + * The values that are not in dwc2_core_params are documented below. + * + * @snpsid: Value from SNPSID register + * @dev_ep_dirs: Direction of device endpoints (GHWCFG1) + * + * @op_mode: Mode of Operation + * 0 - HNP- and SRP-Capable OTG (Host & Device) + * 1 - SRP-Capable OTG (Host & Device) + * 2 - Non-HNP and Non-SRP Capable OTG (Host & Device) + * 3 - SRP-Capable Device + * 4 - Non-OTG Device + * 5 - SRP-Capable Host + * 6 - Non-OTG Host + * @arch: Architecture + * 0 - Slave only + * 1 - External DMA + * 2 - Internal DMA + * @enable_dynamic_fifo: 0 - Use coreConsultant-specified FIFO size parameters + * 1 - Allow dynamic FIFO sizing (default, if available) + * @host_channels: The number of host channel registers to use + * 1 to 16 + * @hs_phy_type: High-speed PHY interface type + * 0 - High-speed interface not supported + * 1 - UTMI+ + * 2 - ULPI + * 3 - UTMI+ and ULPI + * @fs_phy_type: Full-speed PHY interface type + * 0 - Full speed interface not supported + * 1 - Dedicated full speed interface + * 2 - FS pins shared with UTMI+ pins + * 3 - FS pins shared with ULPI pins + * @num_dev_ep: Number of device endpoints available + * @nperio_tx_q_depth: + * Non-Periodic Request Queue Depth + * 2, 4 or 8 + * @dev_token_q_depth: Device Mode IN Token Sequence Learning Queue + * Depth + * 0 to 30 + * @host_perio_tx_q_depth: + * Host Mode Periodic Request Queue Depth + * 2, 4 or 8 + * + * @max_transfer_size: The maximum transfer size supported, in bytes + * 2047 to 65,535 + * Actual maximum value is autodetected and also + * the default. + * @max_packet_count: The maximum number of packets in a transfer + * 15 to 511 + * Actual maximum value is autodetected and also + * the default. + * @i2c_enable: Specifies whether to use the I2Cinterface for a full + * speed PHY. This parameter is only applicable if phy_type + * is FS. + * 0 - No (default) + * 1 - Yes + * @total_fifo_size: Total internal RAM for FIFOs (bytes) + * @lpm_mode: For enabling Link Power Management in the controller + * 0 - Disable + * 1 - Enable + * + * @en_multiple_tx_fifo: Specifies whether dedicated per-endpoint transmit FIFOs + * are enabled for non-periodic IN endpoints in device + * mode. + * @num_dev_in_eps: Number of device IN endpoints available + * @num_dev_perio_in_ep: Number of device periodic IN endpoints + * available + * @dma_desc_enable: When DMA mode is enabled, specifies whether to use + * address DMA mode or descriptor DMA mode for accessing + * the data FIFOs. The driver will automatically detect the + * value for this if none is specified. + * 0 - Address DMA + * 1 - Descriptor DMA (default, if available) + + * @power_optimized: Are power optimizations enabled? + * @hibernation: Is hibernation enabled? + * @utmi_phy_data_width: UTMI+ PHY data width + * 0 - 8 bits + * 1 - 16 bits + * 2 - 8 or 16 bits + + * @acg_enable: For enabling Active Clock Gating in the controller + * 0 - Disable + * 1 - Enable + * @ipg_isoc_en: This feature indicates that the controller supports + * the worst-case scenario of Rx followed by Rx + * Interpacket Gap (IPG) (32 bitTimes) as per the utmi + * specification for any token following ISOC OUT token. + * 0 - Don't support + * 1 - Support + * @service_interval_mode: For enabling service interval based scheduling in the + * controller. + * 0 - Disable + * 1 - Enable + */ +struct dwc2_hw_params { + uint32_t snpsid; + uint32_t dev_ep_dirs; + + unsigned op_mode : 3; + unsigned arch : 2; + unsigned enable_dynamic_fifo : 1; + unsigned host_channels : 5; + unsigned hs_phy_type : 2; + unsigned fs_phy_type : 2; + unsigned num_dev_ep : 4; + unsigned nperio_tx_q_depth : 3; + unsigned host_perio_tx_q_depth : 3; + unsigned dev_token_q_depth : 5; + + unsigned max_transfer_size : 26; + unsigned max_packet_count : 11; + unsigned i2c_enable : 1; + unsigned total_fifo_size : 16; + unsigned lpm_mode : 1; + + unsigned en_multiple_tx_fifo : 1; + unsigned num_dev_in_eps : 4; + unsigned num_dev_perio_in_ep : 4; + unsigned dma_desc_enable : 1; + unsigned power_optimized : 1; + unsigned hibernation : 1; + unsigned utmi_phy_data_width : 2; + unsigned acg_enable : 1; + unsigned ipg_isoc_en : 1; + unsigned service_interval_mode : 1; +}; + +#define DWC2_PHY_TYPE_PARAM_FS 0 +#define DWC2_PHY_TYPE_PARAM_UTMI 1 +#define DWC2_PHY_TYPE_PARAM_ULPI 2 + +struct dwc2_user_params { + uint8_t phy_type; + uint8_t phy_utmi_width; + + bool device_dma_enable; + bool device_dma_desc_enable; + /* (5 * number of control endpoints + 8) + ((largest USB packet used / 4) + 1 for + * status information) + (2 * number of OUT endpoints) + 1 for Global NAK + */ + uint16_t device_rx_fifo_size; + /* IN Endpoints Max packet Size / 4 */ + uint16_t device_tx_fifo_size[MAX_EPS_CHANNELS]; + + bool host_dma_desc_enable; + /* + * (largest USB packet used / 4) + 1 for status information + 1 transfer complete + + * 1 location each for Bulk/Control endpoint for handling NAK/NYET scenario + */ + uint16_t host_rx_fifo_size; + /* largest non-periodic USB packet used / 4 */ + uint16_t host_nperio_tx_fifo_size; + /* largest periodic USB packet used / 4 */ + uint16_t host_perio_tx_fifo_size; + + uint32_t device_gccfg; + uint32_t host_gccfg; + + bool b_session_valid_override; + uint32_t total_fifo_size; +}; + +struct usb_dwc2_user_fifo_config { + /* (5 * number of control endpoints + 8) + ((largest USB packet used / 4) + 1 for + * status information) + (2 * number of OUT endpoints) + 1 for Global NAK + */ + uint16_t device_rx_fifo_size; + /* IN Endpoints Max packet Size / 4 */ + uint16_t device_tx_fifo_size[MAX_EPS_CHANNELS]; +}; + +static inline void dwc2_get_hwparams(uint32_t reg_base, struct dwc2_hw_params *hw) +{ + unsigned int width; + uint32_t snpsid, hwcfg1, hwcfg2, hwcfg3, hwcfg4; + + snpsid = dwc2_readl(reg_base + GSNPSID_OFFSET); + + hwcfg1 = dwc2_readl(reg_base + GHWCFG1_OFFSET); + hwcfg2 = dwc2_readl(reg_base + GHWCFG2_OFFSET); + hwcfg3 = dwc2_readl(reg_base + GHWCFG3_OFFSET); + hwcfg4 = dwc2_readl(reg_base + GHWCFG4_OFFSET); + + /* snpsid */ + hw->snpsid = snpsid; + + /* hwcfg1 */ + hw->dev_ep_dirs = hwcfg1; + + /* hwcfg2 */ + hw->op_mode = (hwcfg2 & GHWCFG2_OP_MODE_MASK) >> + GHWCFG2_OP_MODE_SHIFT; + hw->arch = (hwcfg2 & GHWCFG2_ARCHITECTURE_MASK) >> + GHWCFG2_ARCHITECTURE_SHIFT; + hw->enable_dynamic_fifo = !!(hwcfg2 & GHWCFG2_DYNAMIC_FIFO); + hw->host_channels = 1 + ((hwcfg2 & GHWCFG2_NUM_HOST_CHAN_MASK) >> + GHWCFG2_NUM_HOST_CHAN_SHIFT); + hw->hs_phy_type = (hwcfg2 & GHWCFG2_HS_PHY_TYPE_MASK) >> + GHWCFG2_HS_PHY_TYPE_SHIFT; + hw->fs_phy_type = (hwcfg2 & GHWCFG2_FS_PHY_TYPE_MASK) >> + GHWCFG2_FS_PHY_TYPE_SHIFT; + hw->num_dev_ep = (hwcfg2 & GHWCFG2_NUM_DEV_EP_MASK) >> + GHWCFG2_NUM_DEV_EP_SHIFT; + hw->nperio_tx_q_depth = + (hwcfg2 & GHWCFG2_NONPERIO_TX_Q_DEPTH_MASK) >> + GHWCFG2_NONPERIO_TX_Q_DEPTH_SHIFT << 1; + hw->host_perio_tx_q_depth = + (hwcfg2 & GHWCFG2_HOST_PERIO_TX_Q_DEPTH_MASK) >> + GHWCFG2_HOST_PERIO_TX_Q_DEPTH_SHIFT << 1; + hw->dev_token_q_depth = + (hwcfg2 & GHWCFG2_DEV_TOKEN_Q_DEPTH_MASK) >> + GHWCFG2_DEV_TOKEN_Q_DEPTH_SHIFT; + + /* hwcfg3 */ + width = (hwcfg3 & GHWCFG3_XFER_SIZE_CNTR_WIDTH_MASK) >> + GHWCFG3_XFER_SIZE_CNTR_WIDTH_SHIFT; + hw->max_transfer_size = (1 << (width + 11)) - 1; + width = (hwcfg3 & GHWCFG3_PACKET_SIZE_CNTR_WIDTH_MASK) >> + GHWCFG3_PACKET_SIZE_CNTR_WIDTH_SHIFT; + hw->max_packet_count = (1 << (width + 4)) - 1; + hw->i2c_enable = !!(hwcfg3 & GHWCFG3_I2C); + hw->total_fifo_size = (hwcfg3 & GHWCFG3_DFIFO_DEPTH_MASK) >> + GHWCFG3_DFIFO_DEPTH_SHIFT; + hw->lpm_mode = !!(hwcfg3 & GHWCFG3_OTG_LPM_EN); + + /* hwcfg4 */ + hw->en_multiple_tx_fifo = !!(hwcfg4 & GHWCFG4_DED_FIFO_EN); + hw->num_dev_perio_in_ep = (hwcfg4 & GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK) >> + GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT; + hw->num_dev_in_eps = (hwcfg4 & GHWCFG4_NUM_IN_EPS_MASK) >> + GHWCFG4_NUM_IN_EPS_SHIFT; + hw->dma_desc_enable = !!(hwcfg4 & GHWCFG4_DESC_DMA); + hw->power_optimized = !!(hwcfg4 & GHWCFG4_POWER_OPTIMIZ); + hw->hibernation = !!(hwcfg4 & GHWCFG4_HIBER); + hw->utmi_phy_data_width = (hwcfg4 & GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK) >> + GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT; + hw->acg_enable = !!(hwcfg4 & GHWCFG4_ACG_SUPPORTED); + hw->ipg_isoc_en = !!(hwcfg4 & GHWCFG4_IPG_ISOC_SUPPORTED); + hw->service_interval_mode = !!(hwcfg4 & + GHWCFG4_SERVICE_INTERVAL_SUPPORTED); +} + +void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params); +void dwc2_get_user_fifo_config(uint32_t reg_base, struct usb_dwc2_user_fifo_config *config); + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/dwc2/usb_dwc2_reg.h b/src/lib/CherryUSB/port/dwc2/usb_dwc2_reg.h new file mode 100644 index 000000000..599d4ea58 --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_dwc2_reg.h @@ -0,0 +1,1736 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef __USB_DWC2_REG_H__ +#define __USB_DWC2_REG_H__ + +#define __IO volatile /*!< Defines 'read / write' permissions */ +/** + * @brief USB_OTG_Core_Registers + */ +typedef struct +{ + __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ + __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ + __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ + __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ + __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ + __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ + __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ + __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ + __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ + __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ + __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ + uint32_t Reserved30[2]; /*!< Reserved 030h */ + __IO uint32_t GCCFG; /*!< General Purpose IO Register 038h */ + __IO uint32_t CID; /*!< User ID Register 03Ch */ + __IO uint32_t GSNPSID; /*!< USB_OTG core ID 040h */ + __IO uint32_t GHWCFG1; /*!< User HW config1 044h */ + __IO uint32_t GHWCFG2; /*!< User HW config2 048h */ + __IO uint32_t GHWCFG3; /*!< User HW config3 04Ch */ + __IO uint32_t GHWCFG4; /*!< User HW config4 050h */ + __IO uint32_t GLPMCFG; /*!< LPM Register 054h */ + __IO uint32_t GPWRDN; /*!< Power Down Register 058h */ + __IO uint32_t GDFIFOCFG; /*!< DFIFO Software Config Register 05Ch */ + __IO uint32_t GADPCTL; /*!< ADP Timer, Control and Status Register 60Ch */ + uint32_t Reserved43[39]; /*!< Reserved 058h-0FFh */ + __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ + __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ +} DWC2_GlobalTypeDef; + +/** + * @brief USB_OTG_device_Registers + */ +typedef struct +{ + __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ + __IO uint32_t DCTL; /*!< dev Control Register 804h */ + __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ + uint32_t Reserved0C; /*!< Reserved 80Ch */ + __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ + __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ + __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ + __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ + uint32_t Reserved20; /*!< Reserved 820h */ + uint32_t Reserved9; /*!< Reserved 824h */ + __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ + __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ + __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ + __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ + __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ + __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ + uint32_t Reserved40; /*!< dedicated EP mask 840h */ + __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ + uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ + __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ +} DWC2_DeviceTypeDef; + +/** + * @brief USB_OTG_IN_Endpoint-Specific_Register + */ +typedef struct +{ + __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ + __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ + __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ + __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ + uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ +} DWC2_INEndpointTypeDef; + +/** + * @brief USB_OTG_OUT_Endpoint-Specific_Registers + */ +typedef struct +{ + __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ + __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ + __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ + uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ +} DWC2_OUTEndpointTypeDef; + +/** + * @brief USB_OTG_Host_Mode_Register_Structures + */ +typedef struct +{ + __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ + __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ + __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ + uint32_t Reserved40C; /*!< Reserved 40Ch */ + __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ + __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ + __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ + __IO uint32_t HFLBADDR; /*!< Host frame list base address register 41Ch */ + uint32_t Reserved420[8]; /*!< Reserved 420h */ + __IO uint32_t HPRT; /*!< Host port control and status register 440h */ +} DWC2_HostTypeDef; + +/** + * @brief USB_OTG_Host_Channel_Specific_Registers + */ +typedef struct +{ + __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ + __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ + __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ + __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ + __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ + __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ + uint32_t Reserved0; /*!< Reserved 518h */ + __IO uint32_t HCDMAB; /*!< Host Channel DMA Address Buffer Register 51Ch */ + uint32_t Reserved[2]; /*!< Reserved */ +} DWC2_HostChannelTypeDef; + +#define USB_OTG_GLOBAL_BASE 0x000UL +#define USB_OTG_DEVICE_BASE 0x800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL +#define USB_OTG_EP_REG_SIZE 0x20UL +#define USB_OTG_HOST_BASE 0x400UL +#define USB_OTG_HOST_PORT_BASE 0x440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL +#define USB_OTG_PCGCCTL_BASE 0xE00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +/******************************************************************************/ +/* */ +/* USB_OTG */ +/* */ +/******************************************************************************/ +/******************** Bit definition for USB_OTG_GOTGCTL register ***********/ +#define USB_OTG_GOTGCTL_SRQSCS_Pos (0U) +#define USB_OTG_GOTGCTL_SRQSCS_Msk (0x1UL << USB_OTG_GOTGCTL_SRQSCS_Pos) /*!< 0x00000001 */ +#define USB_OTG_GOTGCTL_SRQSCS USB_OTG_GOTGCTL_SRQSCS_Msk /*!< Session request success */ +#define USB_OTG_GOTGCTL_SRQ_Pos (1U) +#define USB_OTG_GOTGCTL_SRQ_Msk (0x1UL << USB_OTG_GOTGCTL_SRQ_Pos) /*!< 0x00000002 */ +#define USB_OTG_GOTGCTL_SRQ USB_OTG_GOTGCTL_SRQ_Msk /*!< Session request */ +#define USB_OTG_GOTGCTL_VBVALOEN_Pos (2U) +#define USB_OTG_GOTGCTL_VBVALOEN_Msk (0x1UL << USB_OTG_GOTGCTL_VBVALOEN_Pos) /*!< 0x00000004 */ +#define USB_OTG_GOTGCTL_VBVALOEN USB_OTG_GOTGCTL_VBVALOEN_Msk /*!< VBUS valid override enable */ +#define USB_OTG_GOTGCTL_VBVALOVAL_Pos (3U) +#define USB_OTG_GOTGCTL_VBVALOVAL_Msk (0x1UL << USB_OTG_GOTGCTL_VBVALOVAL_Pos) /*!< 0x00000008 */ +#define USB_OTG_GOTGCTL_VBVALOVAL USB_OTG_GOTGCTL_VBVALOVAL_Msk /*!< VBUS valid override value */ +#define USB_OTG_GOTGCTL_AVALOEN_Pos (4U) +#define USB_OTG_GOTGCTL_AVALOEN_Msk (0x1UL << USB_OTG_GOTGCTL_AVALOEN_Pos) /*!< 0x00000010 */ +#define USB_OTG_GOTGCTL_AVALOEN USB_OTG_GOTGCTL_AVALOEN_Msk /*!< A-peripheral session valid override enable */ +#define USB_OTG_GOTGCTL_AVALOVAL_Pos (5U) +#define USB_OTG_GOTGCTL_AVALOVAL_Msk (0x1UL << USB_OTG_GOTGCTL_AVALOVAL_Pos) /*!< 0x00000020 */ +#define USB_OTG_GOTGCTL_AVALOVAL USB_OTG_GOTGCTL_AVALOVAL_Msk /*!< A-peripheral session valid override value */ +#define USB_OTG_GOTGCTL_BVALOEN_Pos (6U) +#define USB_OTG_GOTGCTL_BVALOEN_Msk (0x1UL << USB_OTG_GOTGCTL_BVALOEN_Pos) /*!< 0x00000040 */ +#define USB_OTG_GOTGCTL_BVALOEN USB_OTG_GOTGCTL_BVALOEN_Msk /*!< B-peripheral session valid override enable */ +#define USB_OTG_GOTGCTL_BVALOVAL_Pos (7U) +#define USB_OTG_GOTGCTL_BVALOVAL_Msk (0x1UL << USB_OTG_GOTGCTL_BVALOVAL_Pos) /*!< 0x00000080 */ +#define USB_OTG_GOTGCTL_BVALOVAL USB_OTG_GOTGCTL_BVALOVAL_Msk /*!< B-peripheral session valid override value */ +#define USB_OTG_GOTGCTL_HNGSCS_Pos (8U) +#define USB_OTG_GOTGCTL_HNGSCS_Msk (0x1UL << USB_OTG_GOTGCTL_HNGSCS_Pos) /*!< 0x00000100 */ +#define USB_OTG_GOTGCTL_HNGSCS USB_OTG_GOTGCTL_HNGSCS_Msk /*!< Host set HNP enable */ +#define USB_OTG_GOTGCTL_HNPRQ_Pos (9U) +#define USB_OTG_GOTGCTL_HNPRQ_Msk (0x1UL << USB_OTG_GOTGCTL_HNPRQ_Pos) /*!< 0x00000200 */ +#define USB_OTG_GOTGCTL_HNPRQ USB_OTG_GOTGCTL_HNPRQ_Msk /*!< HNP request */ +#define USB_OTG_GOTGCTL_HSHNPEN_Pos (10U) +#define USB_OTG_GOTGCTL_HSHNPEN_Msk (0x1UL << USB_OTG_GOTGCTL_HSHNPEN_Pos) /*!< 0x00000400 */ +#define USB_OTG_GOTGCTL_HSHNPEN USB_OTG_GOTGCTL_HSHNPEN_Msk /*!< Host set HNP enable */ +#define USB_OTG_GOTGCTL_DHNPEN_Pos (11U) +#define USB_OTG_GOTGCTL_DHNPEN_Msk (0x1UL << USB_OTG_GOTGCTL_DHNPEN_Pos) /*!< 0x00000800 */ +#define USB_OTG_GOTGCTL_DHNPEN USB_OTG_GOTGCTL_DHNPEN_Msk /*!< Device HNP enabled */ +#define USB_OTG_GOTGCTL_EHEN_Pos (12U) +#define USB_OTG_GOTGCTL_EHEN_Msk (0x1UL << USB_OTG_GOTGCTL_EHEN_Pos) /*!< 0x00001000 */ +#define USB_OTG_GOTGCTL_EHEN USB_OTG_GOTGCTL_EHEN_Msk /*!< Embedded host enable */ +#define USB_OTG_GOTGCTL_CIDSTS_Pos (16U) +#define USB_OTG_GOTGCTL_CIDSTS_Msk (0x1UL << USB_OTG_GOTGCTL_CIDSTS_Pos) /*!< 0x00010000 */ +#define USB_OTG_GOTGCTL_CIDSTS USB_OTG_GOTGCTL_CIDSTS_Msk /*!< Connector ID status */ +#define USB_OTG_GOTGCTL_DBCT_Pos (17U) +#define USB_OTG_GOTGCTL_DBCT_Msk (0x1UL << USB_OTG_GOTGCTL_DBCT_Pos) /*!< 0x00020000 */ +#define USB_OTG_GOTGCTL_DBCT USB_OTG_GOTGCTL_DBCT_Msk /*!< Long/short debounce time */ +#define USB_OTG_GOTGCTL_ASVLD_Pos (18U) +#define USB_OTG_GOTGCTL_ASVLD_Msk (0x1UL << USB_OTG_GOTGCTL_ASVLD_Pos) /*!< 0x00040000 */ +#define USB_OTG_GOTGCTL_ASVLD USB_OTG_GOTGCTL_ASVLD_Msk /*!< A-session valid */ +#define USB_OTG_GOTGCTL_BSESVLD_Pos (19U) +#define USB_OTG_GOTGCTL_BSESVLD_Msk (0x1UL << USB_OTG_GOTGCTL_BSESVLD_Pos) /*!< 0x00080000 */ +#define USB_OTG_GOTGCTL_BSESVLD USB_OTG_GOTGCTL_BSESVLD_Msk /*!< B-session valid */ +#define USB_OTG_GOTGCTL_OTGVER_Pos (20U) +#define USB_OTG_GOTGCTL_OTGVER_Msk (0x1UL << USB_OTG_GOTGCTL_OTGVER_Pos) /*!< 0x00100000 */ +#define USB_OTG_GOTGCTL_OTGVER USB_OTG_GOTGCTL_OTGVER_Msk /*!< OTG version */ + +/******************** Bit definition forUSB_OTG_HCFG register ********************/ + +#define USB_OTG_HCFG_FSLSPCS_Pos (0U) +#define USB_OTG_HCFG_FSLSPCS_Msk (0x3UL << USB_OTG_HCFG_FSLSPCS_Pos) /*!< 0x00000003 */ +#define USB_OTG_HCFG_FSLSPCS USB_OTG_HCFG_FSLSPCS_Msk /*!< FS/LS PHY clock select */ +#define USB_OTG_HCFG_FSLSPCLKSEL_30_60_MHZ (0x0UL << USB_OTG_HCFG_FSLSPCS_Pos) /*!< 0x00000000 */ +#define USB_OTG_HCFG_FSLSPCLKSEL_48_MHZ (0x1UL << USB_OTG_HCFG_FSLSPCS_Pos) /*!< 0x00000001 */ +#define USB_OTG_HCFG_FSLSPCLKSEL_6_MHZ (0x2UL << USB_OTG_HCFG_FSLSPCS_Pos) /*!< 0x00000002 */ +#define USB_OTG_HCFG_FSLSS_Pos (2U) +#define USB_OTG_HCFG_FSLSS_Msk (0x1UL << USB_OTG_HCFG_FSLSS_Pos) /*!< 0x00000004 */ +#define USB_OTG_HCFG_FSLSS USB_OTG_HCFG_FSLSS_Msk /*!< FS- and LS-only support */ + +/******************** Bit definition for USB_OTG_DCFG register ********************/ + +#define USB_OTG_DCFG_DSPD_Pos (0U) +#define USB_OTG_DCFG_DSPD_Msk (0x3UL << USB_OTG_DCFG_DSPD_Pos) /*!< 0x00000003 */ +#define USB_OTG_DCFG_DSPD USB_OTG_DCFG_DSPD_Msk /*!< Device speed */ +#define USB_OTG_DCFG_DSPD_0 (0x1UL << USB_OTG_DCFG_DSPD_Pos) /*!< 0x00000001 */ +#define USB_OTG_DCFG_DSPD_1 (0x2UL << USB_OTG_DCFG_DSPD_Pos) /*!< 0x00000002 */ +#define USB_OTG_DCFG_NZLSOHSK_Pos (2U) +#define USB_OTG_DCFG_NZLSOHSK_Msk (0x1UL << USB_OTG_DCFG_NZLSOHSK_Pos) /*!< 0x00000004 */ +#define USB_OTG_DCFG_NZLSOHSK USB_OTG_DCFG_NZLSOHSK_Msk /*!< Nonzero-length status OUT handshake */ + +#define USB_OTG_DCFG_DAD_Pos (4U) +#define USB_OTG_DCFG_DAD_Msk (0x7FUL << USB_OTG_DCFG_DAD_Pos) /*!< 0x000007F0 */ +#define USB_OTG_DCFG_DAD USB_OTG_DCFG_DAD_Msk /*!< Device address */ +#define USB_OTG_DCFG_DAD_0 (0x01UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000010 */ +#define USB_OTG_DCFG_DAD_1 (0x02UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000020 */ +#define USB_OTG_DCFG_DAD_2 (0x04UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000040 */ +#define USB_OTG_DCFG_DAD_3 (0x08UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000080 */ +#define USB_OTG_DCFG_DAD_4 (0x10UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000100 */ +#define USB_OTG_DCFG_DAD_5 (0x20UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000200 */ +#define USB_OTG_DCFG_DAD_6 (0x40UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000400 */ + +#define USB_OTG_DCFG_PFIVL_Pos (11U) +#define USB_OTG_DCFG_PFIVL_Msk (0x3UL << USB_OTG_DCFG_PFIVL_Pos) /*!< 0x00001800 */ +#define USB_OTG_DCFG_PFIVL USB_OTG_DCFG_PFIVL_Msk /*!< Periodic (micro)frame interval */ +#define USB_OTG_DCFG_PFIVL_0 (0x1UL << USB_OTG_DCFG_PFIVL_Pos) /*!< 0x00000800 */ +#define USB_OTG_DCFG_PFIVL_1 (0x2UL << USB_OTG_DCFG_PFIVL_Pos) /*!< 0x00001000 */ + +#define USB_OTG_DCFG_XCVRDLY_Pos (14U) +#define USB_OTG_DCFG_XCVRDLY_Msk (0x1UL << USB_OTG_DCFG_XCVRDLY_Pos) /*!< 0x00004000 */ +#define USB_OTG_DCFG_XCVRDLY USB_OTG_DCFG_XCVRDLY_Msk /*!< Transceiver delay */ + +#define USB_OTG_DCFG_ERRATIM_Pos (15U) +#define USB_OTG_DCFG_ERRATIM_Msk (0x1UL << USB_OTG_DCFG_ERRATIM_Pos) /*!< 0x00008000 */ +#define USB_OTG_DCFG_ERRATIM USB_OTG_DCFG_ERRATIM_Msk /*!< Erratic error interrupt mask */ + +#define USB_OTG_DCFG_DESCDMA_Pos (23U) +#define USB_OTG_DCFG_DESCDMA_Msk (0x1UL << USB_OTG_DCFG_DESCDMA_Pos) +#define USB_OTG_DCFG_DESCDMA USB_OTG_DCFG_DESCDMA_Msk + +#define USB_OTG_DCFG_PERSCHIVL_Pos (24U) +#define USB_OTG_DCFG_PERSCHIVL_Msk (0x3UL << USB_OTG_DCFG_PERSCHIVL_Pos) /*!< 0x03000000 */ +#define USB_OTG_DCFG_PERSCHIVL USB_OTG_DCFG_PERSCHIVL_Msk /*!< Periodic scheduling interval */ +#define USB_OTG_DCFG_PERSCHIVL_0 (0x1UL << USB_OTG_DCFG_PERSCHIVL_Pos) /*!< 0x01000000 */ +#define USB_OTG_DCFG_PERSCHIVL_1 (0x2UL << USB_OTG_DCFG_PERSCHIVL_Pos) /*!< 0x02000000 */ + +/******************** Bit definition for USB_OTG_PCGCR register ********************/ +#define USB_OTG_PCGCR_STPPCLK_Pos (0U) +#define USB_OTG_PCGCR_STPPCLK_Msk (0x1UL << USB_OTG_PCGCR_STPPCLK_Pos) /*!< 0x00000001 */ +#define USB_OTG_PCGCR_STPPCLK USB_OTG_PCGCR_STPPCLK_Msk /*!< Stop PHY clock */ +#define USB_OTG_PCGCR_GATEHCLK_Pos (1U) +#define USB_OTG_PCGCR_GATEHCLK_Msk (0x1UL << USB_OTG_PCGCR_GATEHCLK_Pos) /*!< 0x00000002 */ +#define USB_OTG_PCGCR_GATEHCLK USB_OTG_PCGCR_GATEHCLK_Msk /*!< Gate HCLK */ +#define USB_OTG_PCGCR_PHYSUSP_Pos (4U) +#define USB_OTG_PCGCR_PHYSUSP_Msk (0x1UL << USB_OTG_PCGCR_PHYSUSP_Pos) /*!< 0x00000010 */ +#define USB_OTG_PCGCR_PHYSUSP USB_OTG_PCGCR_PHYSUSP_Msk /*!< PHY suspended */ + +/******************** Bit definition for USB_OTG_GOTGINT register ********************/ +#define USB_OTG_GOTGINT_SEDET_Pos (2U) +#define USB_OTG_GOTGINT_SEDET_Msk (0x1UL << USB_OTG_GOTGINT_SEDET_Pos) /*!< 0x00000004 */ +#define USB_OTG_GOTGINT_SEDET USB_OTG_GOTGINT_SEDET_Msk /*!< Session end detected */ +#define USB_OTG_GOTGINT_SRSSCHG_Pos (8U) +#define USB_OTG_GOTGINT_SRSSCHG_Msk (0x1UL << USB_OTG_GOTGINT_SRSSCHG_Pos) /*!< 0x00000100 */ +#define USB_OTG_GOTGINT_SRSSCHG USB_OTG_GOTGINT_SRSSCHG_Msk /*!< Session request success status change */ +#define USB_OTG_GOTGINT_HNSSCHG_Pos (9U) +#define USB_OTG_GOTGINT_HNSSCHG_Msk (0x1UL << USB_OTG_GOTGINT_HNSSCHG_Pos) /*!< 0x00000200 */ +#define USB_OTG_GOTGINT_HNSSCHG USB_OTG_GOTGINT_HNSSCHG_Msk /*!< Host negotiation success status change */ +#define USB_OTG_GOTGINT_HNGDET_Pos (17U) +#define USB_OTG_GOTGINT_HNGDET_Msk (0x1UL << USB_OTG_GOTGINT_HNGDET_Pos) /*!< 0x00020000 */ +#define USB_OTG_GOTGINT_HNGDET USB_OTG_GOTGINT_HNGDET_Msk /*!< Host negotiation detected */ +#define USB_OTG_GOTGINT_ADTOCHG_Pos (18U) +#define USB_OTG_GOTGINT_ADTOCHG_Msk (0x1UL << USB_OTG_GOTGINT_ADTOCHG_Pos) /*!< 0x00040000 */ +#define USB_OTG_GOTGINT_ADTOCHG USB_OTG_GOTGINT_ADTOCHG_Msk /*!< A-device timeout change */ +#define USB_OTG_GOTGINT_DBCDNE_Pos (19U) +#define USB_OTG_GOTGINT_DBCDNE_Msk (0x1UL << USB_OTG_GOTGINT_DBCDNE_Pos) /*!< 0x00080000 */ +#define USB_OTG_GOTGINT_DBCDNE USB_OTG_GOTGINT_DBCDNE_Msk /*!< Debounce done */ + +/******************** Bit definition for USB_OTG_DCTL register ********************/ +#define USB_OTG_DCTL_RWUSIG_Pos (0U) +#define USB_OTG_DCTL_RWUSIG_Msk (0x1UL << USB_OTG_DCTL_RWUSIG_Pos) /*!< 0x00000001 */ +#define USB_OTG_DCTL_RWUSIG USB_OTG_DCTL_RWUSIG_Msk /*!< Remote wakeup signaling */ +#define USB_OTG_DCTL_SDIS_Pos (1U) +#define USB_OTG_DCTL_SDIS_Msk (0x1UL << USB_OTG_DCTL_SDIS_Pos) /*!< 0x00000002 */ +#define USB_OTG_DCTL_SDIS USB_OTG_DCTL_SDIS_Msk /*!< Soft disconnect */ +#define USB_OTG_DCTL_GINSTS_Pos (2U) +#define USB_OTG_DCTL_GINSTS_Msk (0x1UL << USB_OTG_DCTL_GINSTS_Pos) /*!< 0x00000004 */ +#define USB_OTG_DCTL_GINSTS USB_OTG_DCTL_GINSTS_Msk /*!< Global IN NAK status */ +#define USB_OTG_DCTL_GONSTS_Pos (3U) +#define USB_OTG_DCTL_GONSTS_Msk (0x1UL << USB_OTG_DCTL_GONSTS_Pos) /*!< 0x00000008 */ +#define USB_OTG_DCTL_GONSTS USB_OTG_DCTL_GONSTS_Msk /*!< Global OUT NAK status */ + +#define USB_OTG_DCTL_TCTL_Pos (4U) +#define USB_OTG_DCTL_TCTL_Msk (0x7UL << USB_OTG_DCTL_TCTL_Pos) /*!< 0x00000070 */ +#define USB_OTG_DCTL_TCTL USB_OTG_DCTL_TCTL_Msk /*!< Test control */ +#define USB_OTG_DCTL_TCTL_0 (0x1UL << USB_OTG_DCTL_TCTL_Pos) /*!< 0x00000010 */ +#define USB_OTG_DCTL_TCTL_1 (0x2UL << USB_OTG_DCTL_TCTL_Pos) /*!< 0x00000020 */ +#define USB_OTG_DCTL_TCTL_2 (0x4UL << USB_OTG_DCTL_TCTL_Pos) /*!< 0x00000040 */ +#define USB_OTG_DCTL_SGINAK_Pos (7U) +#define USB_OTG_DCTL_SGINAK_Msk (0x1UL << USB_OTG_DCTL_SGINAK_Pos) /*!< 0x00000080 */ +#define USB_OTG_DCTL_SGINAK USB_OTG_DCTL_SGINAK_Msk /*!< Set global IN NAK */ +#define USB_OTG_DCTL_CGINAK_Pos (8U) +#define USB_OTG_DCTL_CGINAK_Msk (0x1UL << USB_OTG_DCTL_CGINAK_Pos) /*!< 0x00000100 */ +#define USB_OTG_DCTL_CGINAK USB_OTG_DCTL_CGINAK_Msk /*!< Clear global IN NAK */ +#define USB_OTG_DCTL_SGONAK_Pos (9U) +#define USB_OTG_DCTL_SGONAK_Msk (0x1UL << USB_OTG_DCTL_SGONAK_Pos) /*!< 0x00000200 */ +#define USB_OTG_DCTL_SGONAK USB_OTG_DCTL_SGONAK_Msk /*!< Set global OUT NAK */ +#define USB_OTG_DCTL_CGONAK_Pos (10U) +#define USB_OTG_DCTL_CGONAK_Msk (0x1UL << USB_OTG_DCTL_CGONAK_Pos) /*!< 0x00000400 */ +#define USB_OTG_DCTL_CGONAK USB_OTG_DCTL_CGONAK_Msk /*!< Clear global OUT NAK */ +#define USB_OTG_DCTL_POPRGDNE_Pos (11U) +#define USB_OTG_DCTL_POPRGDNE_Msk (0x1UL << USB_OTG_DCTL_POPRGDNE_Pos) /*!< 0x00000800 */ +#define USB_OTG_DCTL_POPRGDNE USB_OTG_DCTL_POPRGDNE_Msk /*!< Power-on programming done */ + +/******************** Bit definition for USB_OTG_HFIR register ********************/ +#define USB_OTG_HFIR_FRIVL_Pos (0U) +#define USB_OTG_HFIR_FRIVL_Msk (0xFFFFUL << USB_OTG_HFIR_FRIVL_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HFIR_FRIVL USB_OTG_HFIR_FRIVL_Msk /*!< Frame interval */ +#define USB_OTG_HFIR_RELOAD_CTRL_Pos (16U) +#define USB_OTG_HFIR_RELOAD_CTRL_Msk (0x1UL << USB_OTG_HFIR_RELOAD_CTRL_Pos) +#define USB_OTG_HFIR_RELOAD_CTRL USB_OTG_HFIR_RELOAD_CTRL_Msk + +/******************** Bit definition for USB_OTG_HFNUM register ********************/ +#define USB_OTG_HFNUM_FRNUM_Pos (0U) +#define USB_OTG_HFNUM_FRNUM_Msk (0xFFFFUL << USB_OTG_HFNUM_FRNUM_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HFNUM_FRNUM USB_OTG_HFNUM_FRNUM_Msk /*!< Frame number */ +#define USB_OTG_HFNUM_FTREM_Pos (16U) +#define USB_OTG_HFNUM_FTREM_Msk (0xFFFFUL << USB_OTG_HFNUM_FTREM_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_HFNUM_FTREM USB_OTG_HFNUM_FTREM_Msk /*!< Frame time remaining */ + +/******************** Bit definition for USB_OTG_DSTS register ********************/ +#define USB_OTG_DSTS_SUSPSTS_Pos (0U) +#define USB_OTG_DSTS_SUSPSTS_Msk (0x1UL << USB_OTG_DSTS_SUSPSTS_Pos) /*!< 0x00000001 */ +#define USB_OTG_DSTS_SUSPSTS USB_OTG_DSTS_SUSPSTS_Msk /*!< Suspend status */ + +#define USB_OTG_DSTS_ENUMSPD_Pos (1U) +#define USB_OTG_DSTS_ENUMSPD_Msk (0x3UL << USB_OTG_DSTS_ENUMSPD_Pos) /*!< 0x00000006 */ +#define USB_OTG_DSTS_ENUMSPD USB_OTG_DSTS_ENUMSPD_Msk /*!< Enumerated speed */ +#define USB_OTG_DSTS_ENUMSPD_0 (0x1UL << USB_OTG_DSTS_ENUMSPD_Pos) /*!< 0x00000002 */ +#define USB_OTG_DSTS_ENUMSPD_1 (0x2UL << USB_OTG_DSTS_ENUMSPD_Pos) /*!< 0x00000004 */ +#define USB_OTG_DSTS_EERR_Pos (3U) +#define USB_OTG_DSTS_EERR_Msk (0x1UL << USB_OTG_DSTS_EERR_Pos) /*!< 0x00000008 */ +#define USB_OTG_DSTS_EERR USB_OTG_DSTS_EERR_Msk /*!< Erratic error */ +#define USB_OTG_DSTS_FNSOF_Pos (8U) +#define USB_OTG_DSTS_FNSOF_Msk (0x3FFFUL << USB_OTG_DSTS_FNSOF_Pos) /*!< 0x003FFF00 */ +#define USB_OTG_DSTS_FNSOF USB_OTG_DSTS_FNSOF_Msk /*!< Frame number of the received SOF */ + +/******************** Bit definition for USB_OTG_GAHBCFG register ********************/ +#define USB_OTG_GAHBCFG_GINT_Pos (0U) +#define USB_OTG_GAHBCFG_GINT_Msk (0x1UL << USB_OTG_GAHBCFG_GINT_Pos) /*!< 0x00000001 */ +#define USB_OTG_GAHBCFG_GINT USB_OTG_GAHBCFG_GINT_Msk /*!< Global interrupt mask */ +#define USB_OTG_GAHBCFG_HBSTLEN_Pos (1U) +#define USB_OTG_GAHBCFG_HBSTLEN_Msk (0xFUL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< 0x0000001E */ +#define USB_OTG_GAHBCFG_HBSTLEN USB_OTG_GAHBCFG_HBSTLEN_Msk /*!< Burst length/type */ +#define USB_OTG_GAHBCFG_HBSTLEN_0 (0x0UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< Single */ +#define USB_OTG_GAHBCFG_HBSTLEN_1 (0x1UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< INCR */ +#define USB_OTG_GAHBCFG_HBSTLEN_2 (0x3UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< INCR4 */ +#define USB_OTG_GAHBCFG_HBSTLEN_3 (0x5UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< INCR8 */ +#define USB_OTG_GAHBCFG_HBSTLEN_4 (0x7UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< INCR16 */ +#define USB_OTG_GAHBCFG_DMAEN_Pos (5U) +#define USB_OTG_GAHBCFG_DMAEN_Msk (0x1UL << USB_OTG_GAHBCFG_DMAEN_Pos) /*!< 0x00000020 */ +#define USB_OTG_GAHBCFG_DMAEN USB_OTG_GAHBCFG_DMAEN_Msk /*!< DMA enable */ +#define USB_OTG_GAHBCFG_TXFELVL_Pos (7U) +#define USB_OTG_GAHBCFG_TXFELVL_Msk (0x1UL << USB_OTG_GAHBCFG_TXFELVL_Pos) /*!< 0x00000080 */ +#define USB_OTG_GAHBCFG_TXFELVL USB_OTG_GAHBCFG_TXFELVL_Msk /*!< TxFIFO empty level */ +#define USB_OTG_GAHBCFG_PTXFELVL_Pos (8U) +#define USB_OTG_GAHBCFG_PTXFELVL_Msk (0x1UL << USB_OTG_GAHBCFG_PTXFELVL_Pos) /*!< 0x00000100 */ +#define USB_OTG_GAHBCFG_PTXFELVL USB_OTG_GAHBCFG_PTXFELVL_Msk /*!< Periodic TxFIFO empty level */ + +/******************** Bit definition for USB_OTG_GUSBCFG register ********************/ + +#define USB_OTG_GUSBCFG_TOCAL_Pos (0U) +#define USB_OTG_GUSBCFG_TOCAL_Msk (0x7UL << USB_OTG_GUSBCFG_TOCAL_Pos) /*!< 0x00000007 */ +#define USB_OTG_GUSBCFG_TOCAL USB_OTG_GUSBCFG_TOCAL_Msk /*!< FS timeout calibration */ +#define USB_OTG_GUSBCFG_PHYIF_Pos (3U) +#define USB_OTG_GUSBCFG_PHYIF_Msk (0x1UL << USB_OTG_GUSBCFG_PHYIF_Pos) +#define USB_OTG_GUSBCFG_PHYIF USB_OTG_GUSBCFG_PHYIF_Msk +#define USB_OTG_GUSBCFG_PHYIF8 (0x0UL << USB_OTG_GUSBCFG_PHYIF_Pos) +#define USB_OTG_GUSBCFG_PHYIF16 (0x1UL << USB_OTG_GUSBCFG_PHYIF_Pos) +#define USB_OTG_GUSBCFG_ULPI_UTMI_SEL_Pos (4U) +#define USB_OTG_GUSBCFG_ULPI_UTMI_SEL_Msk (0x1UL << USB_OTG_GUSBCFG_ULPI_UTMI_SEL_Pos) +#define USB_OTG_GUSBCFG_ULPI_UTMI_SEL USB_OTG_GUSBCFG_ULPI_UTMI_SEL_Msk +#define USB_OTG_GUSBCFG_PHYSEL_Pos (6U) +#define USB_OTG_GUSBCFG_PHYSEL_Msk (0x1UL << USB_OTG_GUSBCFG_PHYSEL_Pos) /*!< 0x00000040 */ +#define USB_OTG_GUSBCFG_PHYSEL USB_OTG_GUSBCFG_PHYSEL_Msk /*!< USB 2.0 high-speed ULPI PHY or USB 1.1 full-speed serial transceiver select */ +#define USB_OTG_GUSBCFG_DDR_SEL_Pos (7U) +#define USB_OTG_GUSBCFG_DDR_SEL_Msk (0x1UL << USB_OTG_GUSBCFG_DDR_SEL_Pos) +#define USB_OTG_GUSBCFG_DDR_SEL USB_OTG_GUSBCFG_DDR_SEL_Msk +#define USB_OTG_GUSBCFG_SRPCAP_Pos (8U) +#define USB_OTG_GUSBCFG_SRPCAP_Msk (0x1UL << USB_OTG_GUSBCFG_SRPCAP_Pos) /*!< 0x00000100 */ +#define USB_OTG_GUSBCFG_SRPCAP USB_OTG_GUSBCFG_SRPCAP_Msk /*!< SRP-capable */ +#define USB_OTG_GUSBCFG_HNPCAP_Pos (9U) +#define USB_OTG_GUSBCFG_HNPCAP_Msk (0x1UL << USB_OTG_GUSBCFG_HNPCAP_Pos) /*!< 0x00000200 */ +#define USB_OTG_GUSBCFG_HNPCAP USB_OTG_GUSBCFG_HNPCAP_Msk /*!< HNP-capable */ +#define USB_OTG_GUSBCFG_TRDT_Pos (10U) +#define USB_OTG_GUSBCFG_TRDT_Msk (0xFUL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00003C00 */ +#define USB_OTG_GUSBCFG_TRDT USB_OTG_GUSBCFG_TRDT_Msk /*!< USB turnaround time */ +#define USB_OTG_GUSBCFG_TRDT_0 (0x1UL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00000400 */ +#define USB_OTG_GUSBCFG_TRDT_1 (0x2UL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00000800 */ +#define USB_OTG_GUSBCFG_TRDT_2 (0x4UL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00001000 */ +#define USB_OTG_GUSBCFG_TRDT_3 (0x8UL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00002000 */ +#define USB_OTG_GUSBCFG_PHYLPCS_Pos (15U) +#define USB_OTG_GUSBCFG_PHYLPCS_Msk (0x1UL << USB_OTG_GUSBCFG_PHYLPCS_Pos) /*!< 0x00008000 */ +#define USB_OTG_GUSBCFG_PHYLPCS USB_OTG_GUSBCFG_PHYLPCS_Msk /*!< PHY Low-power clock select */ +#define USB_OTG_GUSBCFG_ULPIFSLS_Pos (17U) +#define USB_OTG_GUSBCFG_ULPIFSLS_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIFSLS_Pos) /*!< 0x00020000 */ +#define USB_OTG_GUSBCFG_ULPIFSLS USB_OTG_GUSBCFG_ULPIFSLS_Msk /*!< ULPI FS/LS select */ +#define USB_OTG_GUSBCFG_ULPIAR_Pos (18U) +#define USB_OTG_GUSBCFG_ULPIAR_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIAR_Pos) /*!< 0x00040000 */ +#define USB_OTG_GUSBCFG_ULPIAR USB_OTG_GUSBCFG_ULPIAR_Msk /*!< ULPI Auto-resume */ +#define USB_OTG_GUSBCFG_ULPICSM_Pos (19U) +#define USB_OTG_GUSBCFG_ULPICSM_Msk (0x1UL << USB_OTG_GUSBCFG_ULPICSM_Pos) /*!< 0x00080000 */ +#define USB_OTG_GUSBCFG_ULPICSM USB_OTG_GUSBCFG_ULPICSM_Msk /*!< ULPI Clock SuspendM */ +#define USB_OTG_GUSBCFG_ULPIEVBUSD_Pos (20U) +#define USB_OTG_GUSBCFG_ULPIEVBUSD_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIEVBUSD_Pos) /*!< 0x00100000 */ +#define USB_OTG_GUSBCFG_ULPIEVBUSD USB_OTG_GUSBCFG_ULPIEVBUSD_Msk /*!< ULPI External VBUS Drive */ +#define USB_OTG_GUSBCFG_ULPIEVBUSI_Pos (21U) +#define USB_OTG_GUSBCFG_ULPIEVBUSI_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIEVBUSI_Pos) /*!< 0x00200000 */ +#define USB_OTG_GUSBCFG_ULPIEVBUSI USB_OTG_GUSBCFG_ULPIEVBUSI_Msk /*!< ULPI external VBUS indicator */ +#define USB_OTG_GUSBCFG_TSDPS_Pos (22U) +#define USB_OTG_GUSBCFG_TSDPS_Msk (0x1UL << USB_OTG_GUSBCFG_TSDPS_Pos) /*!< 0x00400000 */ +#define USB_OTG_GUSBCFG_TSDPS USB_OTG_GUSBCFG_TSDPS_Msk /*!< TermSel DLine pulsing selection */ +#define USB_OTG_GUSBCFG_PCCI_Pos (23U) +#define USB_OTG_GUSBCFG_PCCI_Msk (0x1UL << USB_OTG_GUSBCFG_PCCI_Pos) /*!< 0x00800000 */ +#define USB_OTG_GUSBCFG_PCCI USB_OTG_GUSBCFG_PCCI_Msk /*!< Indicator complement */ +#define USB_OTG_GUSBCFG_PTCI_Pos (24U) +#define USB_OTG_GUSBCFG_PTCI_Msk (0x1UL << USB_OTG_GUSBCFG_PTCI_Pos) /*!< 0x01000000 */ +#define USB_OTG_GUSBCFG_PTCI USB_OTG_GUSBCFG_PTCI_Msk /*!< Indicator pass through */ +#define USB_OTG_GUSBCFG_ULPIIPD_Pos (25U) +#define USB_OTG_GUSBCFG_ULPIIPD_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIIPD_Pos) /*!< 0x02000000 */ +#define USB_OTG_GUSBCFG_ULPIIPD USB_OTG_GUSBCFG_ULPIIPD_Msk /*!< ULPI interface protect disable */ +#define USB_OTG_GUSBCFG_FHMOD_Pos (29U) +#define USB_OTG_GUSBCFG_FHMOD_Msk (0x1UL << USB_OTG_GUSBCFG_FHMOD_Pos) /*!< 0x20000000 */ +#define USB_OTG_GUSBCFG_FHMOD USB_OTG_GUSBCFG_FHMOD_Msk /*!< Forced host mode */ +#define USB_OTG_GUSBCFG_FDMOD_Pos (30U) +#define USB_OTG_GUSBCFG_FDMOD_Msk (0x1UL << USB_OTG_GUSBCFG_FDMOD_Pos) /*!< 0x40000000 */ +#define USB_OTG_GUSBCFG_FDMOD USB_OTG_GUSBCFG_FDMOD_Msk /*!< Forced peripheral mode */ +#define USB_OTG_GUSBCFG_CTXPKT_Pos (31U) +#define USB_OTG_GUSBCFG_CTXPKT_Msk (0x1UL << USB_OTG_GUSBCFG_CTXPKT_Pos) /*!< 0x80000000 */ +#define USB_OTG_GUSBCFG_CTXPKT USB_OTG_GUSBCFG_CTXPKT_Msk /*!< Corrupt Tx packet */ + +/******************** Bit definition for USB_OTG_GRSTCTL register ********************/ +#define USB_OTG_GRSTCTL_CSRST_Pos (0U) +#define USB_OTG_GRSTCTL_CSRST_Msk (0x1UL << USB_OTG_GRSTCTL_CSRST_Pos) /*!< 0x00000001 */ +#define USB_OTG_GRSTCTL_CSRST USB_OTG_GRSTCTL_CSRST_Msk /*!< Core soft reset */ +#define USB_OTG_GRSTCTL_HSRST_Pos (1U) +#define USB_OTG_GRSTCTL_HSRST_Msk (0x1UL << USB_OTG_GRSTCTL_HSRST_Pos) /*!< 0x00000002 */ +#define USB_OTG_GRSTCTL_HSRST USB_OTG_GRSTCTL_HSRST_Msk /*!< HCLK soft reset */ +#define USB_OTG_GRSTCTL_FCRST_Pos (2U) +#define USB_OTG_GRSTCTL_FCRST_Msk (0x1UL << USB_OTG_GRSTCTL_FCRST_Pos) /*!< 0x00000004 */ +#define USB_OTG_GRSTCTL_FCRST USB_OTG_GRSTCTL_FCRST_Msk /*!< Host frame counter reset */ +#define USB_OTG_GRSTCTL_RXFFLSH_Pos (4U) +#define USB_OTG_GRSTCTL_RXFFLSH_Msk (0x1UL << USB_OTG_GRSTCTL_RXFFLSH_Pos) /*!< 0x00000010 */ +#define USB_OTG_GRSTCTL_RXFFLSH USB_OTG_GRSTCTL_RXFFLSH_Msk /*!< RxFIFO flush */ +#define USB_OTG_GRSTCTL_TXFFLSH_Pos (5U) +#define USB_OTG_GRSTCTL_TXFFLSH_Msk (0x1UL << USB_OTG_GRSTCTL_TXFFLSH_Pos) /*!< 0x00000020 */ +#define USB_OTG_GRSTCTL_TXFFLSH USB_OTG_GRSTCTL_TXFFLSH_Msk /*!< TxFIFO flush */ +#define USB_OTG_GRSTCTL_CSRSTDONE_Pos (29U) +#define USB_OTG_GRSTCTL_CSRSTDONE_Msk (0x1UL << USB_OTG_GRSTCTL_CSRSTDONE_Pos) /*!< 0x20000000 */ +#define USB_OTG_GRSTCTL_CSRSTDONE USB_OTG_GRSTCTL_CSRSTDONE_Msk /*!< Core soft reset done */ + +#define USB_OTG_GRSTCTL_TXFNUM_Pos (6U) +#define USB_OTG_GRSTCTL_TXFNUM_Msk (0x1FUL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x000007C0 */ +#define USB_OTG_GRSTCTL_TXFNUM USB_OTG_GRSTCTL_TXFNUM_Msk /*!< TxFIFO number */ +#define USB_OTG_GRSTCTL_TXFNUM_0 (0x01UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000040 */ +#define USB_OTG_GRSTCTL_TXFNUM_1 (0x02UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000080 */ +#define USB_OTG_GRSTCTL_TXFNUM_2 (0x04UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000100 */ +#define USB_OTG_GRSTCTL_TXFNUM_3 (0x08UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000200 */ +#define USB_OTG_GRSTCTL_TXFNUM_4 (0x10UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000400 */ +#define USB_OTG_GRSTCTL_DMAREQ_Pos (30U) +#define USB_OTG_GRSTCTL_DMAREQ_Msk (0x1UL << USB_OTG_GRSTCTL_DMAREQ_Pos) /*!< 0x40000000 */ +#define USB_OTG_GRSTCTL_DMAREQ USB_OTG_GRSTCTL_DMAREQ_Msk /*!< DMA request signal */ +#define USB_OTG_GRSTCTL_AHBIDL_Pos (31U) +#define USB_OTG_GRSTCTL_AHBIDL_Msk (0x1UL << USB_OTG_GRSTCTL_AHBIDL_Pos) /*!< 0x80000000 */ +#define USB_OTG_GRSTCTL_AHBIDL USB_OTG_GRSTCTL_AHBIDL_Msk /*!< AHB master idle */ + +/******************** Bit definition for USB_OTG_DIEPMSK register ********************/ +#define USB_OTG_DIEPMSK_XFRCM_Pos (0U) +#define USB_OTG_DIEPMSK_XFRCM_Msk (0x1UL << USB_OTG_DIEPMSK_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_DIEPMSK_XFRCM USB_OTG_DIEPMSK_XFRCM_Msk /*!< Transfer completed interrupt mask */ +#define USB_OTG_DIEPMSK_EPDM_Pos (1U) +#define USB_OTG_DIEPMSK_EPDM_Msk (0x1UL << USB_OTG_DIEPMSK_EPDM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DIEPMSK_EPDM USB_OTG_DIEPMSK_EPDM_Msk /*!< Endpoint disabled interrupt mask */ +#define USB_OTG_DIEPMSK_TOM_Pos (3U) +#define USB_OTG_DIEPMSK_TOM_Msk (0x1UL << USB_OTG_DIEPMSK_TOM_Pos) /*!< 0x00000008 */ +#define USB_OTG_DIEPMSK_TOM USB_OTG_DIEPMSK_TOM_Msk /*!< Timeout condition mask (nonisochronous endpoints) */ +#define USB_OTG_DIEPMSK_ITTXFEMSK_Pos (4U) +#define USB_OTG_DIEPMSK_ITTXFEMSK_Msk (0x1UL << USB_OTG_DIEPMSK_ITTXFEMSK_Pos) /*!< 0x00000010 */ +#define USB_OTG_DIEPMSK_ITTXFEMSK USB_OTG_DIEPMSK_ITTXFEMSK_Msk /*!< IN token received when TxFIFO empty mask */ +#define USB_OTG_DIEPMSK_INEPNMM_Pos (5U) +#define USB_OTG_DIEPMSK_INEPNMM_Msk (0x1UL << USB_OTG_DIEPMSK_INEPNMM_Pos) /*!< 0x00000020 */ +#define USB_OTG_DIEPMSK_INEPNMM USB_OTG_DIEPMSK_INEPNMM_Msk /*!< IN token received with EP mismatch mask */ +#define USB_OTG_DIEPMSK_INEPNEM_Pos (6U) +#define USB_OTG_DIEPMSK_INEPNEM_Msk (0x1UL << USB_OTG_DIEPMSK_INEPNEM_Pos) /*!< 0x00000040 */ +#define USB_OTG_DIEPMSK_INEPNEM USB_OTG_DIEPMSK_INEPNEM_Msk /*!< IN endpoint NAK effective mask */ +#define USB_OTG_DIEPMSK_TXFURM_Pos (8U) +#define USB_OTG_DIEPMSK_TXFURM_Msk (0x1UL << USB_OTG_DIEPMSK_TXFURM_Pos) /*!< 0x00000100 */ +#define USB_OTG_DIEPMSK_TXFURM USB_OTG_DIEPMSK_TXFURM_Msk /*!< FIFO underrun mask */ +#define USB_OTG_DIEPMSK_BIM_Pos (9U) +#define USB_OTG_DIEPMSK_BIM_Msk (0x1UL << USB_OTG_DIEPMSK_BIM_Pos) /*!< 0x00000200 */ +#define USB_OTG_DIEPMSK_BIM USB_OTG_DIEPMSK_BIM_Msk /*!< BNA interrupt mask */ + +/******************** Bit definition for USB_OTG_HPTXSTS register ********************/ +#define USB_OTG_HPTXSTS_PTXFSAVL_Pos (0U) +#define USB_OTG_HPTXSTS_PTXFSAVL_Msk (0xFFFFUL << USB_OTG_HPTXSTS_PTXFSAVL_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HPTXSTS_PTXFSAVL USB_OTG_HPTXSTS_PTXFSAVL_Msk /*!< Periodic transmit data FIFO space available */ +#define USB_OTG_HPTXSTS_PTXQSAV_Pos (16U) +#define USB_OTG_HPTXSTS_PTXQSAV_Msk (0xFFUL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00FF0000 */ +#define USB_OTG_HPTXSTS_PTXQSAV USB_OTG_HPTXSTS_PTXQSAV_Msk /*!< Periodic transmit request queue space available */ +#define USB_OTG_HPTXSTS_PTXQSAV_0 (0x01UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00010000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_1 (0x02UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00020000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_2 (0x04UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00040000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_3 (0x08UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00080000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_4 (0x10UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00100000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_5 (0x20UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00200000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_6 (0x40UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00400000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_7 (0x80UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00800000 */ + +#define USB_OTG_HPTXSTS_PTXQTOP_Pos (24U) +#define USB_OTG_HPTXSTS_PTXQTOP_Msk (0xFFUL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0xFF000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP USB_OTG_HPTXSTS_PTXQTOP_Msk /*!< Top of the periodic transmit request queue */ +#define USB_OTG_HPTXSTS_PTXQTOP_0 (0x01UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x01000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_1 (0x02UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x02000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_2 (0x04UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x04000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_3 (0x08UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x08000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_4 (0x10UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x10000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_5 (0x20UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x20000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_6 (0x40UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x40000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_7 (0x80UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x80000000 */ + +/******************** Bit definition for USB_OTG_HAINT register ********************/ +#define USB_OTG_HAINT_HAINT_Pos (0U) +#define USB_OTG_HAINT_HAINT_Msk (0xFFFFUL << USB_OTG_HAINT_HAINT_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HAINT_HAINT USB_OTG_HAINT_HAINT_Msk /*!< Channel interrupts */ + +/******************** Bit definition for USB_OTG_DOEPMSK register ********************/ +#define USB_OTG_DOEPMSK_XFRCM_Pos (0U) +#define USB_OTG_DOEPMSK_XFRCM_Msk (0x1UL << USB_OTG_DOEPMSK_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_DOEPMSK_XFRCM USB_OTG_DOEPMSK_XFRCM_Msk /*!< Transfer completed interrupt mask */ +#define USB_OTG_DOEPMSK_EPDM_Pos (1U) +#define USB_OTG_DOEPMSK_EPDM_Msk (0x1UL << USB_OTG_DOEPMSK_EPDM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DOEPMSK_EPDM USB_OTG_DOEPMSK_EPDM_Msk /*!< Endpoint disabled interrupt mask */ +#define USB_OTG_DOEPMSK_AHBERRM_Pos (2U) +#define USB_OTG_DOEPMSK_AHBERRM_Msk (0x1UL << USB_OTG_DOEPMSK_AHBERRM_Pos) /*!< 0x00000004 */ +#define USB_OTG_DOEPMSK_AHBERRM USB_OTG_DOEPMSK_AHBERRM_Msk /*!< OUT transaction AHB Error interrupt mask */ +#define USB_OTG_DOEPMSK_STUPM_Pos (3U) +#define USB_OTG_DOEPMSK_STUPM_Msk (0x1UL << USB_OTG_DOEPMSK_STUPM_Pos) /*!< 0x00000008 */ +#define USB_OTG_DOEPMSK_STUPM USB_OTG_DOEPMSK_STUPM_Msk /*!< SETUP phase done mask */ +#define USB_OTG_DOEPMSK_OTEPDM_Pos (4U) +#define USB_OTG_DOEPMSK_OTEPDM_Msk (0x1UL << USB_OTG_DOEPMSK_OTEPDM_Pos) /*!< 0x00000010 */ +#define USB_OTG_DOEPMSK_OTEPDM USB_OTG_DOEPMSK_OTEPDM_Msk /*!< OUT token received when endpoint disabled mask */ +#define USB_OTG_DOEPMSK_OTEPSPRM_Pos (5U) +#define USB_OTG_DOEPMSK_OTEPSPRM_Msk (0x1UL << USB_OTG_DOEPMSK_OTEPSPRM_Pos) /*!< 0x00000020 */ +#define USB_OTG_DOEPMSK_OTEPSPRM USB_OTG_DOEPMSK_OTEPSPRM_Msk /*!< Status Phase Received mask */ +#define USB_OTG_DOEPMSK_B2BSTUP_Pos (6U) +#define USB_OTG_DOEPMSK_B2BSTUP_Msk (0x1UL << USB_OTG_DOEPMSK_B2BSTUP_Pos) /*!< 0x00000040 */ +#define USB_OTG_DOEPMSK_B2BSTUP USB_OTG_DOEPMSK_B2BSTUP_Msk /*!< Back-to-back SETUP packets received mask */ +#define USB_OTG_DOEPMSK_OPEM_Pos (8U) +#define USB_OTG_DOEPMSK_OPEM_Msk (0x1UL << USB_OTG_DOEPMSK_OPEM_Pos) /*!< 0x00000100 */ +#define USB_OTG_DOEPMSK_OPEM USB_OTG_DOEPMSK_OPEM_Msk /*!< OUT packet error mask */ +#define USB_OTG_DOEPMSK_BOIM_Pos (9U) +#define USB_OTG_DOEPMSK_BOIM_Msk (0x1UL << USB_OTG_DOEPMSK_BOIM_Pos) /*!< 0x00000200 */ +#define USB_OTG_DOEPMSK_BOIM USB_OTG_DOEPMSK_BOIM_Msk /*!< BNA interrupt mask */ +#define USB_OTG_DOEPMSK_BERRM_Pos (12U) +#define USB_OTG_DOEPMSK_BERRM_Msk (0x1UL << USB_OTG_DOEPMSK_BERRM_Pos) /*!< 0x00001000 */ +#define USB_OTG_DOEPMSK_BERRM USB_OTG_DOEPMSK_BERRM_Msk /*!< Babble error interrupt mask */ +#define USB_OTG_DOEPMSK_NAKM_Pos (13U) +#define USB_OTG_DOEPMSK_NAKM_Msk (0x1UL << USB_OTG_DOEPMSK_NAKM_Pos) /*!< 0x00002000 */ +#define USB_OTG_DOEPMSK_NAKM USB_OTG_DOEPMSK_NAKM_Msk /*!< OUT Packet NAK interrupt mask */ +#define USB_OTG_DOEPMSK_NYETM_Pos (14U) +#define USB_OTG_DOEPMSK_NYETM_Msk (0x1UL << USB_OTG_DOEPMSK_NYETM_Pos) /*!< 0x00004000 */ +#define USB_OTG_DOEPMSK_NYETM USB_OTG_DOEPMSK_NYETM_Msk /*!< NYET interrupt mask */ +/******************** Bit definition for USB_OTG_GINTSTS register ********************/ +#define USB_OTG_GINTSTS_CMOD_Pos (0U) +#define USB_OTG_GINTSTS_CMOD_Msk (0x1UL << USB_OTG_GINTSTS_CMOD_Pos) /*!< 0x00000001 */ +#define USB_OTG_GINTSTS_CMOD USB_OTG_GINTSTS_CMOD_Msk /*!< Current mode of operation */ +#define USB_OTG_GINTSTS_MMIS_Pos (1U) +#define USB_OTG_GINTSTS_MMIS_Msk (0x1UL << USB_OTG_GINTSTS_MMIS_Pos) /*!< 0x00000002 */ +#define USB_OTG_GINTSTS_MMIS USB_OTG_GINTSTS_MMIS_Msk /*!< Mode mismatch interrupt */ +#define USB_OTG_GINTSTS_OTGINT_Pos (2U) +#define USB_OTG_GINTSTS_OTGINT_Msk (0x1UL << USB_OTG_GINTSTS_OTGINT_Pos) /*!< 0x00000004 */ +#define USB_OTG_GINTSTS_OTGINT USB_OTG_GINTSTS_OTGINT_Msk /*!< OTG interrupt */ +#define USB_OTG_GINTSTS_SOF_Pos (3U) +#define USB_OTG_GINTSTS_SOF_Msk (0x1UL << USB_OTG_GINTSTS_SOF_Pos) /*!< 0x00000008 */ +#define USB_OTG_GINTSTS_SOF USB_OTG_GINTSTS_SOF_Msk /*!< Start of frame */ +#define USB_OTG_GINTSTS_RXFLVL_Pos (4U) +#define USB_OTG_GINTSTS_RXFLVL_Msk (0x1UL << USB_OTG_GINTSTS_RXFLVL_Pos) /*!< 0x00000010 */ +#define USB_OTG_GINTSTS_RXFLVL USB_OTG_GINTSTS_RXFLVL_Msk /*!< RxFIFO nonempty */ +#define USB_OTG_GINTSTS_NPTXFE_Pos (5U) +#define USB_OTG_GINTSTS_NPTXFE_Msk (0x1UL << USB_OTG_GINTSTS_NPTXFE_Pos) /*!< 0x00000020 */ +#define USB_OTG_GINTSTS_NPTXFE USB_OTG_GINTSTS_NPTXFE_Msk /*!< Nonperiodic TxFIFO empty */ +#define USB_OTG_GINTSTS_GINAKEFF_Pos (6U) +#define USB_OTG_GINTSTS_GINAKEFF_Msk (0x1UL << USB_OTG_GINTSTS_GINAKEFF_Pos) /*!< 0x00000040 */ +#define USB_OTG_GINTSTS_GINAKEFF USB_OTG_GINTSTS_GINAKEFF_Msk /*!< Global IN nonperiodic NAK effective */ +#define USB_OTG_GINTSTS_BOUTNAKEFF_Pos (7U) +#define USB_OTG_GINTSTS_BOUTNAKEFF_Msk (0x1UL << USB_OTG_GINTSTS_BOUTNAKEFF_Pos) /*!< 0x00000080 */ +#define USB_OTG_GINTSTS_BOUTNAKEFF USB_OTG_GINTSTS_BOUTNAKEFF_Msk /*!< Global OUT NAK effective */ +#define USB_OTG_GINTSTS_ESUSP_Pos (10U) +#define USB_OTG_GINTSTS_ESUSP_Msk (0x1UL << USB_OTG_GINTSTS_ESUSP_Pos) /*!< 0x00000400 */ +#define USB_OTG_GINTSTS_ESUSP USB_OTG_GINTSTS_ESUSP_Msk /*!< Early suspend */ +#define USB_OTG_GINTSTS_USBSUSP_Pos (11U) +#define USB_OTG_GINTSTS_USBSUSP_Msk (0x1UL << USB_OTG_GINTSTS_USBSUSP_Pos) /*!< 0x00000800 */ +#define USB_OTG_GINTSTS_USBSUSP USB_OTG_GINTSTS_USBSUSP_Msk /*!< USB suspend */ +#define USB_OTG_GINTSTS_USBRST_Pos (12U) +#define USB_OTG_GINTSTS_USBRST_Msk (0x1UL << USB_OTG_GINTSTS_USBRST_Pos) /*!< 0x00001000 */ +#define USB_OTG_GINTSTS_USBRST USB_OTG_GINTSTS_USBRST_Msk /*!< USB reset */ +#define USB_OTG_GINTSTS_ENUMDNE_Pos (13U) +#define USB_OTG_GINTSTS_ENUMDNE_Msk (0x1UL << USB_OTG_GINTSTS_ENUMDNE_Pos) /*!< 0x00002000 */ +#define USB_OTG_GINTSTS_ENUMDNE USB_OTG_GINTSTS_ENUMDNE_Msk /*!< Enumeration done */ +#define USB_OTG_GINTSTS_ISOODRP_Pos (14U) +#define USB_OTG_GINTSTS_ISOODRP_Msk (0x1UL << USB_OTG_GINTSTS_ISOODRP_Pos) /*!< 0x00004000 */ +#define USB_OTG_GINTSTS_ISOODRP USB_OTG_GINTSTS_ISOODRP_Msk /*!< Isochronous OUT packet dropped interrupt */ +#define USB_OTG_GINTSTS_EOPF_Pos (15U) +#define USB_OTG_GINTSTS_EOPF_Msk (0x1UL << USB_OTG_GINTSTS_EOPF_Pos) /*!< 0x00008000 */ +#define USB_OTG_GINTSTS_EOPF USB_OTG_GINTSTS_EOPF_Msk /*!< End of periodic frame interrupt */ +#define USB_OTG_GINTSTS_IEPINT_Pos (18U) +#define USB_OTG_GINTSTS_IEPINT_Msk (0x1UL << USB_OTG_GINTSTS_IEPINT_Pos) /*!< 0x00040000 */ +#define USB_OTG_GINTSTS_IEPINT USB_OTG_GINTSTS_IEPINT_Msk /*!< IN endpoint interrupt */ +#define USB_OTG_GINTSTS_OEPINT_Pos (19U) +#define USB_OTG_GINTSTS_OEPINT_Msk (0x1UL << USB_OTG_GINTSTS_OEPINT_Pos) /*!< 0x00080000 */ +#define USB_OTG_GINTSTS_OEPINT USB_OTG_GINTSTS_OEPINT_Msk /*!< OUT endpoint interrupt */ +#define USB_OTG_GINTSTS_IISOIXFR_Pos (20U) +#define USB_OTG_GINTSTS_IISOIXFR_Msk (0x1UL << USB_OTG_GINTSTS_IISOIXFR_Pos) /*!< 0x00100000 */ +#define USB_OTG_GINTSTS_IISOIXFR USB_OTG_GINTSTS_IISOIXFR_Msk /*!< Incomplete isochronous IN transfer */ +#define USB_OTG_GINTSTS_PXFR_INCOMPISOOUT_Pos (21U) +#define USB_OTG_GINTSTS_PXFR_INCOMPISOOUT_Msk (0x1UL << USB_OTG_GINTSTS_PXFR_INCOMPISOOUT_Pos) /*!< 0x00200000 */ +#define USB_OTG_GINTSTS_PXFR_INCOMPISOOUT USB_OTG_GINTSTS_PXFR_INCOMPISOOUT_Msk /*!< Incomplete periodic transfer */ +#define USB_OTG_GINTSTS_DATAFSUSP_Pos (22U) +#define USB_OTG_GINTSTS_DATAFSUSP_Msk (0x1UL << USB_OTG_GINTSTS_DATAFSUSP_Pos) /*!< 0x00400000 */ +#define USB_OTG_GINTSTS_DATAFSUSP USB_OTG_GINTSTS_DATAFSUSP_Msk /*!< Data fetch suspended */ +#define USB_OTG_GINTSTS_RSTDET_Pos (23U) +#define USB_OTG_GINTSTS_RSTDET_Msk (0x1UL << USB_OTG_GINTSTS_RSTDET_Pos) /*!< 0x00800000 */ +#define USB_OTG_GINTSTS_RSTDET USB_OTG_GINTSTS_RSTDET_Msk /*!< Reset detected interrupt */ +#define USB_OTG_GINTSTS_HPRTINT_Pos (24U) +#define USB_OTG_GINTSTS_HPRTINT_Msk (0x1UL << USB_OTG_GINTSTS_HPRTINT_Pos) /*!< 0x01000000 */ +#define USB_OTG_GINTSTS_HPRTINT USB_OTG_GINTSTS_HPRTINT_Msk /*!< Host port interrupt */ +#define USB_OTG_GINTSTS_HCINT_Pos (25U) +#define USB_OTG_GINTSTS_HCINT_Msk (0x1UL << USB_OTG_GINTSTS_HCINT_Pos) /*!< 0x02000000 */ +#define USB_OTG_GINTSTS_HCINT USB_OTG_GINTSTS_HCINT_Msk /*!< Host channels interrupt */ +#define USB_OTG_GINTSTS_PTXFE_Pos (26U) +#define USB_OTG_GINTSTS_PTXFE_Msk (0x1UL << USB_OTG_GINTSTS_PTXFE_Pos) /*!< 0x04000000 */ +#define USB_OTG_GINTSTS_PTXFE USB_OTG_GINTSTS_PTXFE_Msk /*!< Periodic TxFIFO empty */ +#define USB_OTG_GINTSTS_LPMINT_Pos (27U) +#define USB_OTG_GINTSTS_LPMINT_Msk (0x1UL << USB_OTG_GINTSTS_LPMINT_Pos) /*!< 0x08000000 */ +#define USB_OTG_GINTSTS_LPMINT USB_OTG_GINTSTS_LPMINT_Msk /*!< LPM interrupt */ +#define USB_OTG_GINTSTS_CIDSCHG_Pos (28U) +#define USB_OTG_GINTSTS_CIDSCHG_Msk (0x1UL << USB_OTG_GINTSTS_CIDSCHG_Pos) /*!< 0x10000000 */ +#define USB_OTG_GINTSTS_CIDSCHG USB_OTG_GINTSTS_CIDSCHG_Msk /*!< Connector ID status change */ +#define USB_OTG_GINTSTS_DISCINT_Pos (29U) +#define USB_OTG_GINTSTS_DISCINT_Msk (0x1UL << USB_OTG_GINTSTS_DISCINT_Pos) /*!< 0x20000000 */ +#define USB_OTG_GINTSTS_DISCINT USB_OTG_GINTSTS_DISCINT_Msk /*!< Disconnect detected interrupt */ +#define USB_OTG_GINTSTS_SRQINT_Pos (30U) +#define USB_OTG_GINTSTS_SRQINT_Msk (0x1UL << USB_OTG_GINTSTS_SRQINT_Pos) /*!< 0x40000000 */ +#define USB_OTG_GINTSTS_SRQINT USB_OTG_GINTSTS_SRQINT_Msk /*!< Session request/new session detected interrupt */ +#define USB_OTG_GINTSTS_WKUINT_Pos (31U) +#define USB_OTG_GINTSTS_WKUINT_Msk (0x1UL << USB_OTG_GINTSTS_WKUINT_Pos) /*!< 0x80000000 */ +#define USB_OTG_GINTSTS_WKUINT USB_OTG_GINTSTS_WKUINT_Msk /*!< Resume/remote wakeup detected interrupt */ + +/******************** Bit definition for USB_OTG_GINTMSK register ********************/ +#define USB_OTG_GINTMSK_MMISM_Pos (1U) +#define USB_OTG_GINTMSK_MMISM_Msk (0x1UL << USB_OTG_GINTMSK_MMISM_Pos) /*!< 0x00000002 */ +#define USB_OTG_GINTMSK_MMISM USB_OTG_GINTMSK_MMISM_Msk /*!< Mode mismatch interrupt mask */ +#define USB_OTG_GINTMSK_OTGINT_Pos (2U) +#define USB_OTG_GINTMSK_OTGINT_Msk (0x1UL << USB_OTG_GINTMSK_OTGINT_Pos) /*!< 0x00000004 */ +#define USB_OTG_GINTMSK_OTGINT USB_OTG_GINTMSK_OTGINT_Msk /*!< OTG interrupt mask */ +#define USB_OTG_GINTMSK_SOFM_Pos (3U) +#define USB_OTG_GINTMSK_SOFM_Msk (0x1UL << USB_OTG_GINTMSK_SOFM_Pos) /*!< 0x00000008 */ +#define USB_OTG_GINTMSK_SOFM USB_OTG_GINTMSK_SOFM_Msk /*!< Start of frame mask */ +#define USB_OTG_GINTMSK_RXFLVLM_Pos (4U) +#define USB_OTG_GINTMSK_RXFLVLM_Msk (0x1UL << USB_OTG_GINTMSK_RXFLVLM_Pos) /*!< 0x00000010 */ +#define USB_OTG_GINTMSK_RXFLVLM USB_OTG_GINTMSK_RXFLVLM_Msk /*!< Receive FIFO nonempty mask */ +#define USB_OTG_GINTMSK_NPTXFEM_Pos (5U) +#define USB_OTG_GINTMSK_NPTXFEM_Msk (0x1UL << USB_OTG_GINTMSK_NPTXFEM_Pos) /*!< 0x00000020 */ +#define USB_OTG_GINTMSK_NPTXFEM USB_OTG_GINTMSK_NPTXFEM_Msk /*!< Nonperiodic TxFIFO empty mask */ +#define USB_OTG_GINTMSK_GINAKEFFM_Pos (6U) +#define USB_OTG_GINTMSK_GINAKEFFM_Msk (0x1UL << USB_OTG_GINTMSK_GINAKEFFM_Pos) /*!< 0x00000040 */ +#define USB_OTG_GINTMSK_GINAKEFFM USB_OTG_GINTMSK_GINAKEFFM_Msk /*!< Global nonperiodic IN NAK effective mask */ +#define USB_OTG_GINTMSK_GONAKEFFM_Pos (7U) +#define USB_OTG_GINTMSK_GONAKEFFM_Msk (0x1UL << USB_OTG_GINTMSK_GONAKEFFM_Pos) /*!< 0x00000080 */ +#define USB_OTG_GINTMSK_GONAKEFFM USB_OTG_GINTMSK_GONAKEFFM_Msk /*!< Global OUT NAK effective mask */ +#define USB_OTG_GINTMSK_ESUSPM_Pos (10U) +#define USB_OTG_GINTMSK_ESUSPM_Msk (0x1UL << USB_OTG_GINTMSK_ESUSPM_Pos) /*!< 0x00000400 */ +#define USB_OTG_GINTMSK_ESUSPM USB_OTG_GINTMSK_ESUSPM_Msk /*!< Early suspend mask */ +#define USB_OTG_GINTMSK_USBSUSPM_Pos (11U) +#define USB_OTG_GINTMSK_USBSUSPM_Msk (0x1UL << USB_OTG_GINTMSK_USBSUSPM_Pos) /*!< 0x00000800 */ +#define USB_OTG_GINTMSK_USBSUSPM USB_OTG_GINTMSK_USBSUSPM_Msk /*!< USB suspend mask */ +#define USB_OTG_GINTMSK_USBRST_Pos (12U) +#define USB_OTG_GINTMSK_USBRST_Msk (0x1UL << USB_OTG_GINTMSK_USBRST_Pos) /*!< 0x00001000 */ +#define USB_OTG_GINTMSK_USBRST USB_OTG_GINTMSK_USBRST_Msk /*!< USB reset mask */ +#define USB_OTG_GINTMSK_ENUMDNEM_Pos (13U) +#define USB_OTG_GINTMSK_ENUMDNEM_Msk (0x1UL << USB_OTG_GINTMSK_ENUMDNEM_Pos) /*!< 0x00002000 */ +#define USB_OTG_GINTMSK_ENUMDNEM USB_OTG_GINTMSK_ENUMDNEM_Msk /*!< Enumeration done mask */ +#define USB_OTG_GINTMSK_ISOODRPM_Pos (14U) +#define USB_OTG_GINTMSK_ISOODRPM_Msk (0x1UL << USB_OTG_GINTMSK_ISOODRPM_Pos) /*!< 0x00004000 */ +#define USB_OTG_GINTMSK_ISOODRPM USB_OTG_GINTMSK_ISOODRPM_Msk /*!< Isochronous OUT packet dropped interrupt mask */ +#define USB_OTG_GINTMSK_EOPFM_Pos (15U) +#define USB_OTG_GINTMSK_EOPFM_Msk (0x1UL << USB_OTG_GINTMSK_EOPFM_Pos) /*!< 0x00008000 */ +#define USB_OTG_GINTMSK_EOPFM USB_OTG_GINTMSK_EOPFM_Msk /*!< End of periodic frame interrupt mask */ +#define USB_OTG_GINTMSK_EPMISM_Pos (17U) +#define USB_OTG_GINTMSK_EPMISM_Msk (0x1UL << USB_OTG_GINTMSK_EPMISM_Pos) /*!< 0x00020000 */ +#define USB_OTG_GINTMSK_EPMISM USB_OTG_GINTMSK_EPMISM_Msk /*!< Endpoint mismatch interrupt mask */ +#define USB_OTG_GINTMSK_IEPINT_Pos (18U) +#define USB_OTG_GINTMSK_IEPINT_Msk (0x1UL << USB_OTG_GINTMSK_IEPINT_Pos) /*!< 0x00040000 */ +#define USB_OTG_GINTMSK_IEPINT USB_OTG_GINTMSK_IEPINT_Msk /*!< IN endpoints interrupt mask */ +#define USB_OTG_GINTMSK_OEPINT_Pos (19U) +#define USB_OTG_GINTMSK_OEPINT_Msk (0x1UL << USB_OTG_GINTMSK_OEPINT_Pos) /*!< 0x00080000 */ +#define USB_OTG_GINTMSK_OEPINT USB_OTG_GINTMSK_OEPINT_Msk /*!< OUT endpoints interrupt mask */ +#define USB_OTG_GINTMSK_IISOIXFRM_Pos (20U) +#define USB_OTG_GINTMSK_IISOIXFRM_Msk (0x1UL << USB_OTG_GINTMSK_IISOIXFRM_Pos) /*!< 0x00100000 */ +#define USB_OTG_GINTMSK_IISOIXFRM USB_OTG_GINTMSK_IISOIXFRM_Msk /*!< Incomplete isochronous IN transfer mask */ +#define USB_OTG_GINTMSK_PXFRM_IISOOXFRM_Pos (21U) +#define USB_OTG_GINTMSK_PXFRM_IISOOXFRM_Msk (0x1UL << USB_OTG_GINTMSK_PXFRM_IISOOXFRM_Pos) /*!< 0x00200000 */ +#define USB_OTG_GINTMSK_PXFRM_IISOOXFRM USB_OTG_GINTMSK_PXFRM_IISOOXFRM_Msk /*!< Incomplete periodic transfer mask */ +#define USB_OTG_GINTMSK_FSUSPM_Pos (22U) +#define USB_OTG_GINTMSK_FSUSPM_Msk (0x1UL << USB_OTG_GINTMSK_FSUSPM_Pos) /*!< 0x00400000 */ +#define USB_OTG_GINTMSK_FSUSPM USB_OTG_GINTMSK_FSUSPM_Msk /*!< Data fetch suspended mask */ +#define USB_OTG_GINTMSK_RSTDEM_Pos (23U) +#define USB_OTG_GINTMSK_RSTDEM_Msk (0x1UL << USB_OTG_GINTMSK_RSTDEM_Pos) /*!< 0x00800000 */ +#define USB_OTG_GINTMSK_RSTDEM USB_OTG_GINTMSK_RSTDEM_Msk /*!< Reset detected interrupt mask */ +#define USB_OTG_GINTMSK_PRTIM_Pos (24U) +#define USB_OTG_GINTMSK_PRTIM_Msk (0x1UL << USB_OTG_GINTMSK_PRTIM_Pos) /*!< 0x01000000 */ +#define USB_OTG_GINTMSK_PRTIM USB_OTG_GINTMSK_PRTIM_Msk /*!< Host port interrupt mask */ +#define USB_OTG_GINTMSK_HCIM_Pos (25U) +#define USB_OTG_GINTMSK_HCIM_Msk (0x1UL << USB_OTG_GINTMSK_HCIM_Pos) /*!< 0x02000000 */ +#define USB_OTG_GINTMSK_HCIM USB_OTG_GINTMSK_HCIM_Msk /*!< Host channels interrupt mask */ +#define USB_OTG_GINTMSK_PTXFEM_Pos (26U) +#define USB_OTG_GINTMSK_PTXFEM_Msk (0x1UL << USB_OTG_GINTMSK_PTXFEM_Pos) /*!< 0x04000000 */ +#define USB_OTG_GINTMSK_PTXFEM USB_OTG_GINTMSK_PTXFEM_Msk /*!< Periodic TxFIFO empty mask */ +#define USB_OTG_GINTMSK_LPMINTM_Pos (27U) +#define USB_OTG_GINTMSK_LPMINTM_Msk (0x1UL << USB_OTG_GINTMSK_LPMINTM_Pos) /*!< 0x08000000 */ +#define USB_OTG_GINTMSK_LPMINTM USB_OTG_GINTMSK_LPMINTM_Msk /*!< LPM interrupt Mask */ +#define USB_OTG_GINTMSK_CIDSCHGM_Pos (28U) +#define USB_OTG_GINTMSK_CIDSCHGM_Msk (0x1UL << USB_OTG_GINTMSK_CIDSCHGM_Pos) /*!< 0x10000000 */ +#define USB_OTG_GINTMSK_CIDSCHGM USB_OTG_GINTMSK_CIDSCHGM_Msk /*!< Connector ID status change mask */ +#define USB_OTG_GINTMSK_DISCINT_Pos (29U) +#define USB_OTG_GINTMSK_DISCINT_Msk (0x1UL << USB_OTG_GINTMSK_DISCINT_Pos) /*!< 0x20000000 */ +#define USB_OTG_GINTMSK_DISCINT USB_OTG_GINTMSK_DISCINT_Msk /*!< Disconnect detected interrupt mask */ +#define USB_OTG_GINTMSK_SRQIM_Pos (30U) +#define USB_OTG_GINTMSK_SRQIM_Msk (0x1UL << USB_OTG_GINTMSK_SRQIM_Pos) /*!< 0x40000000 */ +#define USB_OTG_GINTMSK_SRQIM USB_OTG_GINTMSK_SRQIM_Msk /*!< Session request/new session detected interrupt mask */ +#define USB_OTG_GINTMSK_WUIM_Pos (31U) +#define USB_OTG_GINTMSK_WUIM_Msk (0x1UL << USB_OTG_GINTMSK_WUIM_Pos) /*!< 0x80000000 */ +#define USB_OTG_GINTMSK_WUIM USB_OTG_GINTMSK_WUIM_Msk /*!< Resume/remote wakeup detected interrupt mask */ + +/******************** Bit definition for USB_OTG_DAINT register ********************/ +#define USB_OTG_DAINT_IEPINT_Pos (0U) +#define USB_OTG_DAINT_IEPINT_Msk (0xFFFFUL << USB_OTG_DAINT_IEPINT_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DAINT_IEPINT USB_OTG_DAINT_IEPINT_Msk /*!< IN endpoint interrupt bits */ +#define USB_OTG_DAINT_OEPINT_Pos (16U) +#define USB_OTG_DAINT_OEPINT_Msk (0xFFFFUL << USB_OTG_DAINT_OEPINT_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_DAINT_OEPINT USB_OTG_DAINT_OEPINT_Msk /*!< OUT endpoint interrupt bits */ + +/******************** Bit definition for OTG register ********************/ +#define USB_OTG_CHNUM_Pos (0U) +#define USB_OTG_CHNUM_Msk (0xFUL << USB_OTG_CHNUM_Pos) /*!< 0x0000000F */ +#define USB_OTG_CHNUM USB_OTG_CHNUM_Msk /*!< Channel number */ +#define USB_OTG_CHNUM_0 (0x1UL << USB_OTG_CHNUM_Pos) /*!< 0x00000001 */ +#define USB_OTG_CHNUM_1 (0x2UL << USB_OTG_CHNUM_Pos) /*!< 0x00000002 */ +#define USB_OTG_CHNUM_2 (0x4UL << USB_OTG_CHNUM_Pos) /*!< 0x00000004 */ +#define USB_OTG_CHNUM_3 (0x8UL << USB_OTG_CHNUM_Pos) /*!< 0x00000008 */ +#define USB_OTG_BCNT_Pos (4U) +#define USB_OTG_BCNT_Msk (0x7FFUL << USB_OTG_BCNT_Pos) /*!< 0x00007FF0 */ +#define USB_OTG_BCNT USB_OTG_BCNT_Msk /*!< Byte count */ + +#define USB_OTG_DPID_Pos (15U) +#define USB_OTG_DPID_Msk (0x3UL << USB_OTG_DPID_Pos) /*!< 0x00018000 */ +#define USB_OTG_DPID USB_OTG_DPID_Msk /*!< Data PID */ +#define USB_OTG_DPID_0 (0x1UL << USB_OTG_DPID_Pos) /*!< 0x00008000 */ +#define USB_OTG_DPID_1 (0x2UL << USB_OTG_DPID_Pos) /*!< 0x00010000 */ + +#define USB_OTG_PKTSTS_Pos (17U) +#define USB_OTG_PKTSTS_Msk (0xFUL << USB_OTG_PKTSTS_Pos) /*!< 0x001E0000 */ +#define USB_OTG_PKTSTS USB_OTG_PKTSTS_Msk /*!< Packet status */ +#define USB_OTG_PKTSTS_0 (0x1UL << USB_OTG_PKTSTS_Pos) /*!< 0x00020000 */ +#define USB_OTG_PKTSTS_1 (0x2UL << USB_OTG_PKTSTS_Pos) /*!< 0x00040000 */ +#define USB_OTG_PKTSTS_2 (0x4UL << USB_OTG_PKTSTS_Pos) /*!< 0x00080000 */ +#define USB_OTG_PKTSTS_3 (0x8UL << USB_OTG_PKTSTS_Pos) /*!< 0x00100000 */ + +#define USB_OTG_EPNUM_Pos (0U) +#define USB_OTG_EPNUM_Msk (0xFUL << USB_OTG_EPNUM_Pos) /*!< 0x0000000F */ +#define USB_OTG_EPNUM USB_OTG_EPNUM_Msk /*!< Endpoint number */ +#define USB_OTG_EPNUM_0 (0x1UL << USB_OTG_EPNUM_Pos) /*!< 0x00000001 */ +#define USB_OTG_EPNUM_1 (0x2UL << USB_OTG_EPNUM_Pos) /*!< 0x00000002 */ +#define USB_OTG_EPNUM_2 (0x4UL << USB_OTG_EPNUM_Pos) /*!< 0x00000004 */ +#define USB_OTG_EPNUM_3 (0x8UL << USB_OTG_EPNUM_Pos) /*!< 0x00000008 */ + +#define USB_OTG_FRMNUM_Pos (21U) +#define USB_OTG_FRMNUM_Msk (0xFUL << USB_OTG_FRMNUM_Pos) /*!< 0x01E00000 */ +#define USB_OTG_FRMNUM USB_OTG_FRMNUM_Msk /*!< Frame number */ +#define USB_OTG_FRMNUM_0 (0x1UL << USB_OTG_FRMNUM_Pos) /*!< 0x00200000 */ +#define USB_OTG_FRMNUM_1 (0x2UL << USB_OTG_FRMNUM_Pos) /*!< 0x00400000 */ +#define USB_OTG_FRMNUM_2 (0x4UL << USB_OTG_FRMNUM_Pos) /*!< 0x00800000 */ +#define USB_OTG_FRMNUM_3 (0x8UL << USB_OTG_FRMNUM_Pos) /*!< 0x01000000 */ + +/******************** Bit definition for USB_OTG_HAINTMSK register ********************/ +#define USB_OTG_HAINTMSK_HAINTM_Pos (0U) +#define USB_OTG_HAINTMSK_HAINTM_Msk (0xFFFFUL << USB_OTG_HAINTMSK_HAINTM_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HAINTMSK_HAINTM USB_OTG_HAINTMSK_HAINTM_Msk /*!< Channel interrupt mask */ + +/******************** Bit definition for USB_OTG_GRXSTSP register ********************/ +#define USB_OTG_GRXSTSP_EPNUM_Pos (0U) +#define USB_OTG_GRXSTSP_EPNUM_Msk (0xFUL << USB_OTG_GRXSTSP_EPNUM_Pos) /*!< 0x0000000F */ +#define USB_OTG_GRXSTSP_EPNUM USB_OTG_GRXSTSP_EPNUM_Msk /*!< IN EP interrupt mask bits */ +#define USB_OTG_GRXSTSP_BCNT_Pos (4U) +#define USB_OTG_GRXSTSP_BCNT_Msk (0x7FFUL << USB_OTG_GRXSTSP_BCNT_Pos) /*!< 0x00007FF0 */ +#define USB_OTG_GRXSTSP_BCNT USB_OTG_GRXSTSP_BCNT_Msk /*!< OUT EP interrupt mask bits */ +#define USB_OTG_GRXSTSP_DPID_Pos (15U) +#define USB_OTG_GRXSTSP_DPID_Msk (0x3UL << USB_OTG_GRXSTSP_DPID_Pos) /*!< 0x00018000 */ +#define USB_OTG_GRXSTSP_DPID USB_OTG_GRXSTSP_DPID_Msk /*!< OUT EP interrupt mask bits */ +#define USB_OTG_GRXSTSP_PKTSTS_Pos (17U) +#define USB_OTG_GRXSTSP_PKTSTS_Msk (0xFUL << USB_OTG_GRXSTSP_PKTSTS_Pos) /*!< 0x001E0000 */ +#define USB_OTG_GRXSTSP_PKTSTS USB_OTG_GRXSTSP_PKTSTS_Msk /*!< OUT EP interrupt mask bits */ + +/******************** Bit definition for USB_OTG_DAINTMSK register ********************/ +#define USB_OTG_DAINTMSK_IEPM_Pos (0U) +#define USB_OTG_DAINTMSK_IEPM_Msk (0xFFFFUL << USB_OTG_DAINTMSK_IEPM_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DAINTMSK_IEPM USB_OTG_DAINTMSK_IEPM_Msk /*!< IN EP interrupt mask bits */ +#define USB_OTG_DAINTMSK_OEPM_Pos (16U) +#define USB_OTG_DAINTMSK_OEPM_Msk (0xFFFFUL << USB_OTG_DAINTMSK_OEPM_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_DAINTMSK_OEPM USB_OTG_DAINTMSK_OEPM_Msk /*!< OUT EP interrupt mask bits */ + +/******************** Bit definition for USB_OTG_GRXFSIZ register ********************/ +#define USB_OTG_GRXFSIZ_RXFD_Pos (0U) +#define USB_OTG_GRXFSIZ_RXFD_Msk (0xFFFFUL << USB_OTG_GRXFSIZ_RXFD_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_GRXFSIZ_RXFD USB_OTG_GRXFSIZ_RXFD_Msk /*!< RxFIFO depth */ + +/******************** Bit definition for USB_OTG_DVBUSDIS register ********************/ +#define USB_OTG_DVBUSDIS_VBUSDT_Pos (0U) +#define USB_OTG_DVBUSDIS_VBUSDT_Msk (0xFFFFUL << USB_OTG_DVBUSDIS_VBUSDT_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DVBUSDIS_VBUSDT USB_OTG_DVBUSDIS_VBUSDT_Msk /*!< Device VBUS discharge time */ + +/******************** Bit definition for OTG register ********************/ +#define USB_OTG_NPTXFSA_Pos (0U) +#define USB_OTG_NPTXFSA_Msk (0xFFFFUL << USB_OTG_NPTXFSA_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_NPTXFSA USB_OTG_NPTXFSA_Msk /*!< Nonperiodic transmit RAM start address */ +#define USB_OTG_NPTXFD_Pos (16U) +#define USB_OTG_NPTXFD_Msk (0xFFFFUL << USB_OTG_NPTXFD_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_NPTXFD USB_OTG_NPTXFD_Msk /*!< Nonperiodic TxFIFO depth */ +#define USB_OTG_TX0FSA_Pos (0U) +#define USB_OTG_TX0FSA_Msk (0xFFFFUL << USB_OTG_TX0FSA_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_TX0FSA USB_OTG_TX0FSA_Msk /*!< Endpoint 0 transmit RAM start address */ +#define USB_OTG_TX0FD_Pos (16U) +#define USB_OTG_TX0FD_Msk (0xFFFFUL << USB_OTG_TX0FD_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_TX0FD USB_OTG_TX0FD_Msk /*!< Endpoint 0 TxFIFO depth */ + +/******************** Bit definition forUSB_OTG_DVBUSPULSE register ********************/ +#define USB_OTG_DVBUSPULSE_DVBUSP_Pos (0U) +#define USB_OTG_DVBUSPULSE_DVBUSP_Msk (0xFFFUL << USB_OTG_DVBUSPULSE_DVBUSP_Pos) /*!< 0x00000FFF */ +#define USB_OTG_DVBUSPULSE_DVBUSP USB_OTG_DVBUSPULSE_DVBUSP_Msk /*!< Device VBUS pulsing time */ + +/******************** Bit definition for USB_OTG_GNPTXSTS register ********************/ +#define USB_OTG_GNPTXSTS_NPTXFSAV_Pos (0U) +#define USB_OTG_GNPTXSTS_NPTXFSAV_Msk (0xFFFFUL << USB_OTG_GNPTXSTS_NPTXFSAV_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_GNPTXSTS_NPTXFSAV USB_OTG_GNPTXSTS_NPTXFSAV_Msk /*!< Nonperiodic TxFIFO space available */ + +#define USB_OTG_GNPTXSTS_NPTQXSAV_Pos (16U) +#define USB_OTG_GNPTXSTS_NPTQXSAV_Msk (0xFFUL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00FF0000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV USB_OTG_GNPTXSTS_NPTQXSAV_Msk /*!< Nonperiodic transmit request queue space available */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_0 (0x01UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00010000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_1 (0x02UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00020000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_2 (0x04UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00040000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_3 (0x08UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00080000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_4 (0x10UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00100000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_5 (0x20UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00200000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_6 (0x40UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00400000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_7 (0x80UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00800000 */ + +#define USB_OTG_GNPTXSTS_NPTXQTOP_Pos (24U) +#define USB_OTG_GNPTXSTS_NPTXQTOP_Msk (0x7FUL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x7F000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP USB_OTG_GNPTXSTS_NPTXQTOP_Msk /*!< Top of the nonperiodic transmit request queue */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_0 (0x01UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x01000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_1 (0x02UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x02000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_2 (0x04UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x04000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_3 (0x08UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x08000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_4 (0x10UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x10000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_5 (0x20UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x20000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_6 (0x40UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x40000000 */ + +/******************** Bit definition for USB_OTG_DTHRCTL register ********************/ +#define USB_OTG_DTHRCTL_NONISOTHREN_Pos (0U) +#define USB_OTG_DTHRCTL_NONISOTHREN_Msk (0x1UL << USB_OTG_DTHRCTL_NONISOTHREN_Pos) /*!< 0x00000001 */ +#define USB_OTG_DTHRCTL_NONISOTHREN USB_OTG_DTHRCTL_NONISOTHREN_Msk /*!< Nonisochronous IN endpoints threshold enable */ +#define USB_OTG_DTHRCTL_ISOTHREN_Pos (1U) +#define USB_OTG_DTHRCTL_ISOTHREN_Msk (0x1UL << USB_OTG_DTHRCTL_ISOTHREN_Pos) /*!< 0x00000002 */ +#define USB_OTG_DTHRCTL_ISOTHREN USB_OTG_DTHRCTL_ISOTHREN_Msk /*!< ISO IN endpoint threshold enable */ + +#define USB_OTG_DTHRCTL_TXTHRLEN_Pos (2U) +#define USB_OTG_DTHRCTL_TXTHRLEN_Msk (0x1FFUL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x000007FC */ +#define USB_OTG_DTHRCTL_TXTHRLEN USB_OTG_DTHRCTL_TXTHRLEN_Msk /*!< Transmit threshold length */ +#define USB_OTG_DTHRCTL_TXTHRLEN_0 (0x001UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000004 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_1 (0x002UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000008 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_2 (0x004UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000010 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_3 (0x008UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000020 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_4 (0x010UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000040 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_5 (0x020UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000080 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_6 (0x040UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000100 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_7 (0x080UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000200 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_8 (0x100UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000400 */ +#define USB_OTG_DTHRCTL_RXTHREN_Pos (16U) +#define USB_OTG_DTHRCTL_RXTHREN_Msk (0x1UL << USB_OTG_DTHRCTL_RXTHREN_Pos) /*!< 0x00010000 */ +#define USB_OTG_DTHRCTL_RXTHREN USB_OTG_DTHRCTL_RXTHREN_Msk /*!< Receive threshold enable */ + +#define USB_OTG_DTHRCTL_RXTHRLEN_Pos (17U) +#define USB_OTG_DTHRCTL_RXTHRLEN_Msk (0x1FFUL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x03FE0000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN USB_OTG_DTHRCTL_RXTHRLEN_Msk /*!< Receive threshold length */ +#define USB_OTG_DTHRCTL_RXTHRLEN_0 (0x001UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00020000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_1 (0x002UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00040000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_2 (0x004UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00080000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_3 (0x008UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00100000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_4 (0x010UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00200000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_5 (0x020UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00400000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_6 (0x040UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00800000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_7 (0x080UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x01000000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_8 (0x100UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x02000000 */ +#define USB_OTG_DTHRCTL_ARPEN_Pos (27U) +#define USB_OTG_DTHRCTL_ARPEN_Msk (0x1UL << USB_OTG_DTHRCTL_ARPEN_Pos) /*!< 0x08000000 */ +#define USB_OTG_DTHRCTL_ARPEN USB_OTG_DTHRCTL_ARPEN_Msk /*!< Arbiter parking enable */ + +/******************** Bit definition for USB_OTG_DIEPEMPMSK register ********************/ +#define USB_OTG_DIEPEMPMSK_INEPTXFEM_Pos (0U) +#define USB_OTG_DIEPEMPMSK_INEPTXFEM_Msk (0xFFFFUL << USB_OTG_DIEPEMPMSK_INEPTXFEM_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DIEPEMPMSK_INEPTXFEM USB_OTG_DIEPEMPMSK_INEPTXFEM_Msk /*!< IN EP Tx FIFO empty interrupt mask bits */ + +/******************** Bit definition for USB_OTG_DEACHINT register ********************/ +#define USB_OTG_DEACHINT_IEP1INT_Pos (1U) +#define USB_OTG_DEACHINT_IEP1INT_Msk (0x1UL << USB_OTG_DEACHINT_IEP1INT_Pos) /*!< 0x00000002 */ +#define USB_OTG_DEACHINT_IEP1INT USB_OTG_DEACHINT_IEP1INT_Msk /*!< IN endpoint 1interrupt bit */ +#define USB_OTG_DEACHINT_OEP1INT_Pos (17U) +#define USB_OTG_DEACHINT_OEP1INT_Msk (0x1UL << USB_OTG_DEACHINT_OEP1INT_Pos) /*!< 0x00020000 */ +#define USB_OTG_DEACHINT_OEP1INT USB_OTG_DEACHINT_OEP1INT_Msk /*!< OUT endpoint 1 interrupt bit */ + +/******************** Bit definition for USB_OTG_GCCFG register ********************/ +#define USB_OTG_GCCFG_DCDET_Pos (0U) +#define USB_OTG_GCCFG_DCDET_Msk (0x1UL << USB_OTG_GCCFG_DCDET_Pos) /*!< 0x00000001 */ +#define USB_OTG_GCCFG_DCDET USB_OTG_GCCFG_DCDET_Msk /*!< Data contact detection (DCD) status */ +#define USB_OTG_GCCFG_PDET_Pos (1U) +#define USB_OTG_GCCFG_PDET_Msk (0x1UL << USB_OTG_GCCFG_PDET_Pos) /*!< 0x00000002 */ +#define USB_OTG_GCCFG_PDET USB_OTG_GCCFG_PDET_Msk /*!< Primary detection (PD) status */ +#define USB_OTG_GCCFG_SDET_Pos (2U) +#define USB_OTG_GCCFG_SDET_Msk (0x1UL << USB_OTG_GCCFG_SDET_Pos) /*!< 0x00000004 */ +#define USB_OTG_GCCFG_SDET USB_OTG_GCCFG_SDET_Msk /*!< Secondary detection (SD) status */ +#define USB_OTG_GCCFG_PS2DET_Pos (3U) +#define USB_OTG_GCCFG_PS2DET_Msk (0x1UL << USB_OTG_GCCFG_PS2DET_Pos) /*!< 0x00000008 */ +#define USB_OTG_GCCFG_PS2DET USB_OTG_GCCFG_PS2DET_Msk /*!< DM pull-up detection status */ +#define USB_OTG_GCCFG_PWRDWN_Pos (16U) +#define USB_OTG_GCCFG_PWRDWN_Msk (0x1UL << USB_OTG_GCCFG_PWRDWN_Pos) /*!< 0x00010000 */ +#define USB_OTG_GCCFG_PWRDWN USB_OTG_GCCFG_PWRDWN_Msk /*!< Power down */ +#define USB_OTG_GCCFG_BCDEN_Pos (17U) +#define USB_OTG_GCCFG_BCDEN_Msk (0x1UL << USB_OTG_GCCFG_BCDEN_Pos) /*!< 0x00020000 */ +#define USB_OTG_GCCFG_BCDEN USB_OTG_GCCFG_BCDEN_Msk /*!< Battery charging detector (BCD) enable */ +#define USB_OTG_GCCFG_DCDEN_Pos (18U) +#define USB_OTG_GCCFG_DCDEN_Msk (0x1UL << USB_OTG_GCCFG_DCDEN_Pos) /*!< 0x00040000 */ +#define USB_OTG_GCCFG_DCDEN USB_OTG_GCCFG_DCDEN_Msk /*!< Data contact detection (DCD) mode enable*/ +#define USB_OTG_GCCFG_PDEN_Pos (19U) +#define USB_OTG_GCCFG_PDEN_Msk (0x1UL << USB_OTG_GCCFG_PDEN_Pos) /*!< 0x00080000 */ +#define USB_OTG_GCCFG_PDEN USB_OTG_GCCFG_PDEN_Msk /*!< Primary detection (PD) mode enable*/ +#define USB_OTG_GCCFG_SDEN_Pos (20U) +#define USB_OTG_GCCFG_SDEN_Msk (0x1UL << USB_OTG_GCCFG_SDEN_Pos) /*!< 0x00100000 */ +#define USB_OTG_GCCFG_SDEN USB_OTG_GCCFG_SDEN_Msk /*!< Secondary detection (SD) mode enable */ +#define USB_OTG_GCCFG_VBDEN_Pos (21U) +#define USB_OTG_GCCFG_VBDEN_Msk (0x1UL << USB_OTG_GCCFG_VBDEN_Pos) /*!< 0x00200000 */ +#define USB_OTG_GCCFG_VBDEN USB_OTG_GCCFG_VBDEN_Msk /*!< Secondary detection (SD) mode enable */ + +#define USB_OTG_GCCFG_I2CPADEN_Pos (17U) +#define USB_OTG_GCCFG_I2CPADEN_Msk (0x1UL << USB_OTG_GCCFG_I2CPADEN_Pos) /*!< 0x00020000 */ +#define USB_OTG_GCCFG_I2CPADEN USB_OTG_GCCFG_I2CPADEN_Msk /*!< Enable I2C bus connection for the external I2C PHY interface*/ +#define USB_OTG_GCCFG_VBUSASEN_Pos (18U) +#define USB_OTG_GCCFG_VBUSASEN_Msk (0x1UL << USB_OTG_GCCFG_VBUSASEN_Pos) /*!< 0x00040000 */ +#define USB_OTG_GCCFG_VBUSASEN USB_OTG_GCCFG_VBUSASEN_Msk /*!< Enable the VBUS sensing device */ +#define USB_OTG_GCCFG_VBUSBSEN_Pos (19U) +#define USB_OTG_GCCFG_VBUSBSEN_Msk (0x1UL << USB_OTG_GCCFG_VBUSBSEN_Pos) /*!< 0x00080000 */ +#define USB_OTG_GCCFG_VBUSBSEN USB_OTG_GCCFG_VBUSBSEN_Msk /*!< Enable the VBUS sensing device */ +#define USB_OTG_GCCFG_SOFOUTEN_Pos (20U) +#define USB_OTG_GCCFG_SOFOUTEN_Msk (0x1UL << USB_OTG_GCCFG_SOFOUTEN_Pos) /*!< 0x00100000 */ +#define USB_OTG_GCCFG_SOFOUTEN USB_OTG_GCCFG_SOFOUTEN_Msk /*!< SOF output enable */ +#define USB_OTG_GCCFG_NOVBUSSENS_Pos (21U) +#define USB_OTG_GCCFG_NOVBUSSENS_Msk (0x1UL << USB_OTG_GCCFG_NOVBUSSENS_Pos) /*!< 0x00200000 */ +#define USB_OTG_GCCFG_NOVBUSSENS USB_OTG_GCCFG_NOVBUSSENS_Msk /*!< VBUS sensing disable option*/ + +/******************** Bit definition forUSB_OTG_GPWRDN) register ********************/ +#define USB_OTG_GPWRDN_ADPMEN_Pos (0U) +#define USB_OTG_GPWRDN_ADPMEN_Msk (0x1UL << USB_OTG_GPWRDN_ADPMEN_Pos) /*!< 0x00000001 */ +#define USB_OTG_GPWRDN_ADPMEN USB_OTG_GPWRDN_ADPMEN_Msk /*!< ADP module enable */ +#define USB_OTG_GPWRDN_ADPIF_Pos (23U) +#define USB_OTG_GPWRDN_ADPIF_Msk (0x1UL << USB_OTG_GPWRDN_ADPIF_Pos) /*!< 0x00800000 */ +#define USB_OTG_GPWRDN_ADPIF USB_OTG_GPWRDN_ADPIF_Msk /*!< ADP Interrupt flag */ + +/******************** Bit definition forUSB_OTG_DEACHINTMSK register ********************/ +#define USB_OTG_DEACHINTMSK_IEP1INTM_Pos (1U) +#define USB_OTG_DEACHINTMSK_IEP1INTM_Msk (0x1UL << USB_OTG_DEACHINTMSK_IEP1INTM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DEACHINTMSK_IEP1INTM USB_OTG_DEACHINTMSK_IEP1INTM_Msk /*!< IN Endpoint 1 interrupt mask bit */ +#define USB_OTG_DEACHINTMSK_OEP1INTM_Pos (17U) +#define USB_OTG_DEACHINTMSK_OEP1INTM_Msk (0x1UL << USB_OTG_DEACHINTMSK_OEP1INTM_Pos) /*!< 0x00020000 */ +#define USB_OTG_DEACHINTMSK_OEP1INTM USB_OTG_DEACHINTMSK_OEP1INTM_Msk /*!< OUT Endpoint 1 interrupt mask bit */ + +/******************** Bit definition for USB_OTG_CID register ********************/ +#define USB_OTG_CID_PRODUCT_ID_Pos (0U) +#define USB_OTG_CID_PRODUCT_ID_Msk (0xFFFFFFFFUL << USB_OTG_CID_PRODUCT_ID_Pos) /*!< 0xFFFFFFFF */ +#define USB_OTG_CID_PRODUCT_ID USB_OTG_CID_PRODUCT_ID_Msk /*!< Product ID field */ + +/******************** Bit definition for USB_OTG_GLPMCFG register ********************/ +#define USB_OTG_GLPMCFG_LPMEN_Pos (0U) +#define USB_OTG_GLPMCFG_LPMEN_Msk (0x1UL << USB_OTG_GLPMCFG_LPMEN_Pos) /*!< 0x00000001 */ +#define USB_OTG_GLPMCFG_LPMEN USB_OTG_GLPMCFG_LPMEN_Msk /*!< LPM support enable */ +#define USB_OTG_GLPMCFG_LPMACK_Pos (1U) +#define USB_OTG_GLPMCFG_LPMACK_Msk (0x1UL << USB_OTG_GLPMCFG_LPMACK_Pos) /*!< 0x00000002 */ +#define USB_OTG_GLPMCFG_LPMACK USB_OTG_GLPMCFG_LPMACK_Msk /*!< LPM Token acknowledge enable */ +#define USB_OTG_GLPMCFG_BESL_Pos (2U) +#define USB_OTG_GLPMCFG_BESL_Msk (0xFUL << USB_OTG_GLPMCFG_BESL_Pos) /*!< 0x0000003C */ +#define USB_OTG_GLPMCFG_BESL USB_OTG_GLPMCFG_BESL_Msk /*!< BESL value received with last ACKed LPM Token */ +#define USB_OTG_GLPMCFG_REMWAKE_Pos (6U) +#define USB_OTG_GLPMCFG_REMWAKE_Msk (0x1UL << USB_OTG_GLPMCFG_REMWAKE_Pos) /*!< 0x00000040 */ +#define USB_OTG_GLPMCFG_REMWAKE USB_OTG_GLPMCFG_REMWAKE_Msk /*!< bRemoteWake value received with last ACKed LPM Token */ +#define USB_OTG_GLPMCFG_L1SSEN_Pos (7U) +#define USB_OTG_GLPMCFG_L1SSEN_Msk (0x1UL << USB_OTG_GLPMCFG_L1SSEN_Pos) /*!< 0x00000080 */ +#define USB_OTG_GLPMCFG_L1SSEN USB_OTG_GLPMCFG_L1SSEN_Msk /*!< L1 shallow sleep enable */ +#define USB_OTG_GLPMCFG_BESLTHRS_Pos (8U) +#define USB_OTG_GLPMCFG_BESLTHRS_Msk (0xFUL << USB_OTG_GLPMCFG_BESLTHRS_Pos) /*!< 0x00000F00 */ +#define USB_OTG_GLPMCFG_BESLTHRS USB_OTG_GLPMCFG_BESLTHRS_Msk /*!< BESL threshold */ +#define USB_OTG_GLPMCFG_L1DSEN_Pos (12U) +#define USB_OTG_GLPMCFG_L1DSEN_Msk (0x1UL << USB_OTG_GLPMCFG_L1DSEN_Pos) /*!< 0x00001000 */ +#define USB_OTG_GLPMCFG_L1DSEN USB_OTG_GLPMCFG_L1DSEN_Msk /*!< L1 deep sleep enable */ +#define USB_OTG_GLPMCFG_LPMRSP_Pos (13U) +#define USB_OTG_GLPMCFG_LPMRSP_Msk (0x3UL << USB_OTG_GLPMCFG_LPMRSP_Pos) /*!< 0x00006000 */ +#define USB_OTG_GLPMCFG_LPMRSP USB_OTG_GLPMCFG_LPMRSP_Msk /*!< LPM response */ +#define USB_OTG_GLPMCFG_SLPSTS_Pos (15U) +#define USB_OTG_GLPMCFG_SLPSTS_Msk (0x1UL << USB_OTG_GLPMCFG_SLPSTS_Pos) /*!< 0x00008000 */ +#define USB_OTG_GLPMCFG_SLPSTS USB_OTG_GLPMCFG_SLPSTS_Msk /*!< Port sleep status */ +#define USB_OTG_GLPMCFG_L1RSMOK_Pos (16U) +#define USB_OTG_GLPMCFG_L1RSMOK_Msk (0x1UL << USB_OTG_GLPMCFG_L1RSMOK_Pos) /*!< 0x00010000 */ +#define USB_OTG_GLPMCFG_L1RSMOK USB_OTG_GLPMCFG_L1RSMOK_Msk /*!< Sleep State Resume OK */ +#define USB_OTG_GLPMCFG_LPMCHIDX_Pos (17U) +#define USB_OTG_GLPMCFG_LPMCHIDX_Msk (0xFUL << USB_OTG_GLPMCFG_LPMCHIDX_Pos) /*!< 0x001E0000 */ +#define USB_OTG_GLPMCFG_LPMCHIDX USB_OTG_GLPMCFG_LPMCHIDX_Msk /*!< LPM Channel Index */ +#define USB_OTG_GLPMCFG_LPMRCNT_Pos (21U) +#define USB_OTG_GLPMCFG_LPMRCNT_Msk (0x7UL << USB_OTG_GLPMCFG_LPMRCNT_Pos) /*!< 0x00E00000 */ +#define USB_OTG_GLPMCFG_LPMRCNT USB_OTG_GLPMCFG_LPMRCNT_Msk /*!< LPM retry count */ +#define USB_OTG_GLPMCFG_SNDLPM_Pos (24U) +#define USB_OTG_GLPMCFG_SNDLPM_Msk (0x1UL << USB_OTG_GLPMCFG_SNDLPM_Pos) /*!< 0x01000000 */ +#define USB_OTG_GLPMCFG_SNDLPM USB_OTG_GLPMCFG_SNDLPM_Msk /*!< Send LPM transaction */ +#define USB_OTG_GLPMCFG_LPMRCNTSTS_Pos (25U) +#define USB_OTG_GLPMCFG_LPMRCNTSTS_Msk (0x7UL << USB_OTG_GLPMCFG_LPMRCNTSTS_Pos) /*!< 0x0E000000 */ +#define USB_OTG_GLPMCFG_LPMRCNTSTS USB_OTG_GLPMCFG_LPMRCNTSTS_Msk /*!< LPM retry count status */ +#define USB_OTG_GLPMCFG_ENBESL_Pos (28U) +#define USB_OTG_GLPMCFG_ENBESL_Msk (0x1UL << USB_OTG_GLPMCFG_ENBESL_Pos) /*!< 0x10000000 */ +#define USB_OTG_GLPMCFG_ENBESL USB_OTG_GLPMCFG_ENBESL_Msk /*!< Enable best effort service latency */ + +/******************** Bit definition for USB_OTG_DIEPEACHMSK1 register ********************/ +#define USB_OTG_DIEPEACHMSK1_XFRCM_Pos (0U) +#define USB_OTG_DIEPEACHMSK1_XFRCM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_DIEPEACHMSK1_XFRCM USB_OTG_DIEPEACHMSK1_XFRCM_Msk /*!< Transfer completed interrupt mask */ +#define USB_OTG_DIEPEACHMSK1_EPDM_Pos (1U) +#define USB_OTG_DIEPEACHMSK1_EPDM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_EPDM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DIEPEACHMSK1_EPDM USB_OTG_DIEPEACHMSK1_EPDM_Msk /*!< Endpoint disabled interrupt mask */ +#define USB_OTG_DIEPEACHMSK1_TOM_Pos (3U) +#define USB_OTG_DIEPEACHMSK1_TOM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_TOM_Pos) /*!< 0x00000008 */ +#define USB_OTG_DIEPEACHMSK1_TOM USB_OTG_DIEPEACHMSK1_TOM_Msk /*!< Timeout condition mask (nonisochronous endpoints) */ +#define USB_OTG_DIEPEACHMSK1_ITTXFEMSK_Pos (4U) +#define USB_OTG_DIEPEACHMSK1_ITTXFEMSK_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_ITTXFEMSK_Pos) /*!< 0x00000010 */ +#define USB_OTG_DIEPEACHMSK1_ITTXFEMSK USB_OTG_DIEPEACHMSK1_ITTXFEMSK_Msk /*!< IN token received when TxFIFO empty mask */ +#define USB_OTG_DIEPEACHMSK1_INEPNMM_Pos (5U) +#define USB_OTG_DIEPEACHMSK1_INEPNMM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_INEPNMM_Pos) /*!< 0x00000020 */ +#define USB_OTG_DIEPEACHMSK1_INEPNMM USB_OTG_DIEPEACHMSK1_INEPNMM_Msk /*!< IN token received with EP mismatch mask */ +#define USB_OTG_DIEPEACHMSK1_INEPNEM_Pos (6U) +#define USB_OTG_DIEPEACHMSK1_INEPNEM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_INEPNEM_Pos) /*!< 0x00000040 */ +#define USB_OTG_DIEPEACHMSK1_INEPNEM USB_OTG_DIEPEACHMSK1_INEPNEM_Msk /*!< IN endpoint NAK effective mask */ +#define USB_OTG_DIEPEACHMSK1_TXFURM_Pos (8U) +#define USB_OTG_DIEPEACHMSK1_TXFURM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_TXFURM_Pos) /*!< 0x00000100 */ +#define USB_OTG_DIEPEACHMSK1_TXFURM USB_OTG_DIEPEACHMSK1_TXFURM_Msk /*!< FIFO underrun mask */ +#define USB_OTG_DIEPEACHMSK1_BIM_Pos (9U) +#define USB_OTG_DIEPEACHMSK1_BIM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_BIM_Pos) /*!< 0x00000200 */ +#define USB_OTG_DIEPEACHMSK1_BIM USB_OTG_DIEPEACHMSK1_BIM_Msk /*!< BNA interrupt mask */ +#define USB_OTG_DIEPEACHMSK1_NAKM_Pos (13U) +#define USB_OTG_DIEPEACHMSK1_NAKM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_NAKM_Pos) /*!< 0x00002000 */ +#define USB_OTG_DIEPEACHMSK1_NAKM USB_OTG_DIEPEACHMSK1_NAKM_Msk /*!< NAK interrupt mask */ + +/******************** Bit definition for USB_OTG_HPRT register ********************/ +#define USB_OTG_HPRT_PCSTS_Pos (0U) +#define USB_OTG_HPRT_PCSTS_Msk (0x1UL << USB_OTG_HPRT_PCSTS_Pos) /*!< 0x00000001 */ +#define USB_OTG_HPRT_PCSTS USB_OTG_HPRT_PCSTS_Msk /*!< Port connect status */ +#define USB_OTG_HPRT_PCDET_Pos (1U) +#define USB_OTG_HPRT_PCDET_Msk (0x1UL << USB_OTG_HPRT_PCDET_Pos) /*!< 0x00000002 */ +#define USB_OTG_HPRT_PCDET USB_OTG_HPRT_PCDET_Msk /*!< Port connect detected */ +#define USB_OTG_HPRT_PENA_Pos (2U) +#define USB_OTG_HPRT_PENA_Msk (0x1UL << USB_OTG_HPRT_PENA_Pos) /*!< 0x00000004 */ +#define USB_OTG_HPRT_PENA USB_OTG_HPRT_PENA_Msk /*!< Port enable */ +#define USB_OTG_HPRT_PENCHNG_Pos (3U) +#define USB_OTG_HPRT_PENCHNG_Msk (0x1UL << USB_OTG_HPRT_PENCHNG_Pos) /*!< 0x00000008 */ +#define USB_OTG_HPRT_PENCHNG USB_OTG_HPRT_PENCHNG_Msk /*!< Port enable/disable change */ +#define USB_OTG_HPRT_POCA_Pos (4U) +#define USB_OTG_HPRT_POCA_Msk (0x1UL << USB_OTG_HPRT_POCA_Pos) /*!< 0x00000010 */ +#define USB_OTG_HPRT_POCA USB_OTG_HPRT_POCA_Msk /*!< Port overcurrent active */ +#define USB_OTG_HPRT_POCCHNG_Pos (5U) +#define USB_OTG_HPRT_POCCHNG_Msk (0x1UL << USB_OTG_HPRT_POCCHNG_Pos) /*!< 0x00000020 */ +#define USB_OTG_HPRT_POCCHNG USB_OTG_HPRT_POCCHNG_Msk /*!< Port overcurrent change */ +#define USB_OTG_HPRT_PRES_Pos (6U) +#define USB_OTG_HPRT_PRES_Msk (0x1UL << USB_OTG_HPRT_PRES_Pos) /*!< 0x00000040 */ +#define USB_OTG_HPRT_PRES USB_OTG_HPRT_PRES_Msk /*!< Port resume */ +#define USB_OTG_HPRT_PSUSP_Pos (7U) +#define USB_OTG_HPRT_PSUSP_Msk (0x1UL << USB_OTG_HPRT_PSUSP_Pos) /*!< 0x00000080 */ +#define USB_OTG_HPRT_PSUSP USB_OTG_HPRT_PSUSP_Msk /*!< Port suspend */ +#define USB_OTG_HPRT_PRST_Pos (8U) +#define USB_OTG_HPRT_PRST_Msk (0x1UL << USB_OTG_HPRT_PRST_Pos) /*!< 0x00000100 */ +#define USB_OTG_HPRT_PRST USB_OTG_HPRT_PRST_Msk /*!< Port reset */ + +#define USB_OTG_HPRT_PLSTS_Pos (10U) +#define USB_OTG_HPRT_PLSTS_Msk (0x3UL << USB_OTG_HPRT_PLSTS_Pos) /*!< 0x00000C00 */ +#define USB_OTG_HPRT_PLSTS USB_OTG_HPRT_PLSTS_Msk /*!< Port line status */ +#define USB_OTG_HPRT_PLSTS_0 (0x1UL << USB_OTG_HPRT_PLSTS_Pos) /*!< 0x00000400 */ +#define USB_OTG_HPRT_PLSTS_1 (0x2UL << USB_OTG_HPRT_PLSTS_Pos) /*!< 0x00000800 */ +#define USB_OTG_HPRT_PPWR_Pos (12U) +#define USB_OTG_HPRT_PPWR_Msk (0x1UL << USB_OTG_HPRT_PPWR_Pos) /*!< 0x00001000 */ +#define USB_OTG_HPRT_PPWR USB_OTG_HPRT_PPWR_Msk /*!< Port power */ + +#define USB_OTG_HPRT_PTCTL_Pos (13U) +#define USB_OTG_HPRT_PTCTL_Msk (0xFUL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x0001E000 */ +#define USB_OTG_HPRT_PTCTL USB_OTG_HPRT_PTCTL_Msk /*!< Port test control */ +#define USB_OTG_HPRT_PTCTL_0 (0x1UL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x00002000 */ +#define USB_OTG_HPRT_PTCTL_1 (0x2UL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x00004000 */ +#define USB_OTG_HPRT_PTCTL_2 (0x4UL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x00008000 */ +#define USB_OTG_HPRT_PTCTL_3 (0x8UL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x00010000 */ + +#define USB_OTG_HPRT_PSPD_Pos (17U) +#define USB_OTG_HPRT_PSPD_Msk (0x3UL << USB_OTG_HPRT_PSPD_Pos) /*!< 0x00060000 */ +#define USB_OTG_HPRT_PSPD USB_OTG_HPRT_PSPD_Msk /*!< Port speed */ +#define USB_OTG_HPRT_PSPD_0 (0x1UL << USB_OTG_HPRT_PSPD_Pos) /*!< 0x00020000 */ +#define USB_OTG_HPRT_PSPD_1 (0x2UL << USB_OTG_HPRT_PSPD_Pos) /*!< 0x00040000 */ + +/******************** Bit definition for USB_OTG_DOEPEACHMSK1 register ********************/ +#define USB_OTG_DOEPEACHMSK1_XFRCM_Pos (0U) +#define USB_OTG_DOEPEACHMSK1_XFRCM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_DOEPEACHMSK1_XFRCM USB_OTG_DOEPEACHMSK1_XFRCM_Msk /*!< Transfer completed interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_EPDM_Pos (1U) +#define USB_OTG_DOEPEACHMSK1_EPDM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_EPDM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DOEPEACHMSK1_EPDM USB_OTG_DOEPEACHMSK1_EPDM_Msk /*!< Endpoint disabled interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_TOM_Pos (3U) +#define USB_OTG_DOEPEACHMSK1_TOM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_TOM_Pos) /*!< 0x00000008 */ +#define USB_OTG_DOEPEACHMSK1_TOM USB_OTG_DOEPEACHMSK1_TOM_Msk /*!< Timeout condition mask */ +#define USB_OTG_DOEPEACHMSK1_ITTXFEMSK_Pos (4U) +#define USB_OTG_DOEPEACHMSK1_ITTXFEMSK_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_ITTXFEMSK_Pos) /*!< 0x00000010 */ +#define USB_OTG_DOEPEACHMSK1_ITTXFEMSK USB_OTG_DOEPEACHMSK1_ITTXFEMSK_Msk /*!< IN token received when TxFIFO empty mask */ +#define USB_OTG_DOEPEACHMSK1_INEPNMM_Pos (5U) +#define USB_OTG_DOEPEACHMSK1_INEPNMM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_INEPNMM_Pos) /*!< 0x00000020 */ +#define USB_OTG_DOEPEACHMSK1_INEPNMM USB_OTG_DOEPEACHMSK1_INEPNMM_Msk /*!< IN token received with EP mismatch mask */ +#define USB_OTG_DOEPEACHMSK1_INEPNEM_Pos (6U) +#define USB_OTG_DOEPEACHMSK1_INEPNEM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_INEPNEM_Pos) /*!< 0x00000040 */ +#define USB_OTG_DOEPEACHMSK1_INEPNEM USB_OTG_DOEPEACHMSK1_INEPNEM_Msk /*!< IN endpoint NAK effective mask */ +#define USB_OTG_DOEPEACHMSK1_TXFURM_Pos (8U) +#define USB_OTG_DOEPEACHMSK1_TXFURM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_TXFURM_Pos) /*!< 0x00000100 */ +#define USB_OTG_DOEPEACHMSK1_TXFURM USB_OTG_DOEPEACHMSK1_TXFURM_Msk /*!< OUT packet error mask */ +#define USB_OTG_DOEPEACHMSK1_BIM_Pos (9U) +#define USB_OTG_DOEPEACHMSK1_BIM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_BIM_Pos) /*!< 0x00000200 */ +#define USB_OTG_DOEPEACHMSK1_BIM USB_OTG_DOEPEACHMSK1_BIM_Msk /*!< BNA interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_BERRM_Pos (12U) +#define USB_OTG_DOEPEACHMSK1_BERRM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_BERRM_Pos) /*!< 0x00001000 */ +#define USB_OTG_DOEPEACHMSK1_BERRM USB_OTG_DOEPEACHMSK1_BERRM_Msk /*!< Bubble error interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_NAKM_Pos (13U) +#define USB_OTG_DOEPEACHMSK1_NAKM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_NAKM_Pos) /*!< 0x00002000 */ +#define USB_OTG_DOEPEACHMSK1_NAKM USB_OTG_DOEPEACHMSK1_NAKM_Msk /*!< NAK interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_NYETM_Pos (14U) +#define USB_OTG_DOEPEACHMSK1_NYETM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_NYETM_Pos) /*!< 0x00004000 */ +#define USB_OTG_DOEPEACHMSK1_NYETM USB_OTG_DOEPEACHMSK1_NYETM_Msk /*!< NYET interrupt mask */ + +/******************** Bit definition for USB_OTG_HPTXFSIZ register ********************/ +#define USB_OTG_HPTXFSIZ_PTXSA_Pos (0U) +#define USB_OTG_HPTXFSIZ_PTXSA_Msk (0xFFFFUL << USB_OTG_HPTXFSIZ_PTXSA_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HPTXFSIZ_PTXSA USB_OTG_HPTXFSIZ_PTXSA_Msk /*!< Host periodic TxFIFO start address */ +#define USB_OTG_HPTXFSIZ_PTXFD_Pos (16U) +#define USB_OTG_HPTXFSIZ_PTXFD_Msk (0xFFFFUL << USB_OTG_HPTXFSIZ_PTXFD_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_HPTXFSIZ_PTXFD USB_OTG_HPTXFSIZ_PTXFD_Msk /*!< Host periodic TxFIFO depth */ + +/******************** Bit definition for USB_OTG_DIEPCTL register ********************/ +#define USB_OTG_DIEPCTL_MPSIZ_Pos (0U) +#define USB_OTG_DIEPCTL_MPSIZ_Msk (0x7FFUL << USB_OTG_DIEPCTL_MPSIZ_Pos) /*!< 0x000007FF */ +#define USB_OTG_DIEPCTL_MPSIZ USB_OTG_DIEPCTL_MPSIZ_Msk /*!< Maximum packet size */ +#define USB_OTG_DIEPCTL_USBAEP_Pos (15U) +#define USB_OTG_DIEPCTL_USBAEP_Msk (0x1UL << USB_OTG_DIEPCTL_USBAEP_Pos) /*!< 0x00008000 */ +#define USB_OTG_DIEPCTL_USBAEP USB_OTG_DIEPCTL_USBAEP_Msk /*!< USB active endpoint */ +#define USB_OTG_DIEPCTL_EONUM_DPID_Pos (16U) +#define USB_OTG_DIEPCTL_EONUM_DPID_Msk (0x1UL << USB_OTG_DIEPCTL_EONUM_DPID_Pos) /*!< 0x00010000 */ +#define USB_OTG_DIEPCTL_EONUM_DPID USB_OTG_DIEPCTL_EONUM_DPID_Msk /*!< Even/odd frame */ +#define USB_OTG_DIEPCTL_NAKSTS_Pos (17U) +#define USB_OTG_DIEPCTL_NAKSTS_Msk (0x1UL << USB_OTG_DIEPCTL_NAKSTS_Pos) /*!< 0x00020000 */ +#define USB_OTG_DIEPCTL_NAKSTS USB_OTG_DIEPCTL_NAKSTS_Msk /*!< NAK status */ + +#define USB_OTG_DIEPCTL_EPTYP_Pos (18U) +#define USB_OTG_DIEPCTL_EPTYP_Msk (0x3UL << USB_OTG_DIEPCTL_EPTYP_Pos) /*!< 0x000C0000 */ +#define USB_OTG_DIEPCTL_EPTYP USB_OTG_DIEPCTL_EPTYP_Msk /*!< Endpoint type */ +#define USB_OTG_DIEPCTL_EPTYP_0 (0x1UL << USB_OTG_DIEPCTL_EPTYP_Pos) /*!< 0x00040000 */ +#define USB_OTG_DIEPCTL_EPTYP_1 (0x2UL << USB_OTG_DIEPCTL_EPTYP_Pos) /*!< 0x00080000 */ +#define USB_OTG_DIEPCTL_STALL_Pos (21U) +#define USB_OTG_DIEPCTL_STALL_Msk (0x1UL << USB_OTG_DIEPCTL_STALL_Pos) /*!< 0x00200000 */ +#define USB_OTG_DIEPCTL_STALL USB_OTG_DIEPCTL_STALL_Msk /*!< STALL handshake */ + +#define USB_OTG_DIEPCTL_TXFNUM_Pos (22U) +#define USB_OTG_DIEPCTL_TXFNUM_Msk (0xFUL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x03C00000 */ +#define USB_OTG_DIEPCTL_TXFNUM USB_OTG_DIEPCTL_TXFNUM_Msk /*!< TxFIFO number */ +#define USB_OTG_DIEPCTL_TXFNUM_0 (0x1UL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x00400000 */ +#define USB_OTG_DIEPCTL_TXFNUM_1 (0x2UL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x00800000 */ +#define USB_OTG_DIEPCTL_TXFNUM_2 (0x4UL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x01000000 */ +#define USB_OTG_DIEPCTL_TXFNUM_3 (0x8UL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x02000000 */ +#define USB_OTG_DIEPCTL_CNAK_Pos (26U) +#define USB_OTG_DIEPCTL_CNAK_Msk (0x1UL << USB_OTG_DIEPCTL_CNAK_Pos) /*!< 0x04000000 */ +#define USB_OTG_DIEPCTL_CNAK USB_OTG_DIEPCTL_CNAK_Msk /*!< Clear NAK */ +#define USB_OTG_DIEPCTL_SNAK_Pos (27U) +#define USB_OTG_DIEPCTL_SNAK_Msk (0x1UL << USB_OTG_DIEPCTL_SNAK_Pos) /*!< 0x08000000 */ +#define USB_OTG_DIEPCTL_SNAK USB_OTG_DIEPCTL_SNAK_Msk /*!< Set NAK */ +#define USB_OTG_DIEPCTL_SD0PID_SEVNFRM_Pos (28U) +#define USB_OTG_DIEPCTL_SD0PID_SEVNFRM_Msk (0x1UL << USB_OTG_DIEPCTL_SD0PID_SEVNFRM_Pos) /*!< 0x10000000 */ +#define USB_OTG_DIEPCTL_SD0PID_SEVNFRM USB_OTG_DIEPCTL_SD0PID_SEVNFRM_Msk /*!< Set DATA0 PID */ +#define USB_OTG_DIEPCTL_SODDFRM_Pos (29U) +#define USB_OTG_DIEPCTL_SODDFRM_Msk (0x1UL << USB_OTG_DIEPCTL_SODDFRM_Pos) /*!< 0x20000000 */ +#define USB_OTG_DIEPCTL_SODDFRM USB_OTG_DIEPCTL_SODDFRM_Msk /*!< Set odd frame */ +#define USB_OTG_DIEPCTL_EPDIS_Pos (30U) +#define USB_OTG_DIEPCTL_EPDIS_Msk (0x1UL << USB_OTG_DIEPCTL_EPDIS_Pos) /*!< 0x40000000 */ +#define USB_OTG_DIEPCTL_EPDIS USB_OTG_DIEPCTL_EPDIS_Msk /*!< Endpoint disable */ +#define USB_OTG_DIEPCTL_EPENA_Pos (31U) +#define USB_OTG_DIEPCTL_EPENA_Msk (0x1UL << USB_OTG_DIEPCTL_EPENA_Pos) /*!< 0x80000000 */ +#define USB_OTG_DIEPCTL_EPENA USB_OTG_DIEPCTL_EPENA_Msk /*!< Endpoint enable */ + +/******************** Bit definition for USB_OTG_HCCHAR register ********************/ +#define USB_OTG_HCCHAR_MPSIZ_Pos (0U) +#define USB_OTG_HCCHAR_MPSIZ_Msk (0x7FFUL << USB_OTG_HCCHAR_MPSIZ_Pos) /*!< 0x000007FF */ +#define USB_OTG_HCCHAR_MPSIZ USB_OTG_HCCHAR_MPSIZ_Msk /*!< Maximum packet size */ + +#define USB_OTG_HCCHAR_EPNUM_Pos (11U) +#define USB_OTG_HCCHAR_EPNUM_Msk (0xFUL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00007800 */ +#define USB_OTG_HCCHAR_EPNUM USB_OTG_HCCHAR_EPNUM_Msk /*!< Endpoint number */ +#define USB_OTG_HCCHAR_EPNUM_0 (0x1UL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00000800 */ +#define USB_OTG_HCCHAR_EPNUM_1 (0x2UL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00001000 */ +#define USB_OTG_HCCHAR_EPNUM_2 (0x4UL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00002000 */ +#define USB_OTG_HCCHAR_EPNUM_3 (0x8UL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00004000 */ +#define USB_OTG_HCCHAR_EPDIR_Pos (15U) +#define USB_OTG_HCCHAR_EPDIR_Msk (0x1UL << USB_OTG_HCCHAR_EPDIR_Pos) /*!< 0x00008000 */ +#define USB_OTG_HCCHAR_EPDIR USB_OTG_HCCHAR_EPDIR_Msk /*!< Endpoint direction */ +#define USB_OTG_HCCHAR_LSDEV_Pos (17U) +#define USB_OTG_HCCHAR_LSDEV_Msk (0x1UL << USB_OTG_HCCHAR_LSDEV_Pos) /*!< 0x00020000 */ +#define USB_OTG_HCCHAR_LSDEV USB_OTG_HCCHAR_LSDEV_Msk /*!< Low-speed device */ + +#define USB_OTG_HCCHAR_EPTYP_Pos (18U) +#define USB_OTG_HCCHAR_EPTYP_Msk (0x3UL << USB_OTG_HCCHAR_EPTYP_Pos) /*!< 0x000C0000 */ +#define USB_OTG_HCCHAR_EPTYP USB_OTG_HCCHAR_EPTYP_Msk /*!< Endpoint type */ +#define USB_OTG_HCCHAR_EPTYP_0 (0x1UL << USB_OTG_HCCHAR_EPTYP_Pos) /*!< 0x00040000 */ +#define USB_OTG_HCCHAR_EPTYP_1 (0x2UL << USB_OTG_HCCHAR_EPTYP_Pos) /*!< 0x00080000 */ + +#define USB_OTG_HCCHAR_MC_Pos (20U) +#define USB_OTG_HCCHAR_MC_Msk (0x3UL << USB_OTG_HCCHAR_MC_Pos) /*!< 0x00300000 */ +#define USB_OTG_HCCHAR_MC USB_OTG_HCCHAR_MC_Msk /*!< Multi Count (MC) / Error Count (EC) */ +#define USB_OTG_HCCHAR_MC_0 (0x1UL << USB_OTG_HCCHAR_MC_Pos) /*!< 0x00100000 */ +#define USB_OTG_HCCHAR_MC_1 (0x2UL << USB_OTG_HCCHAR_MC_Pos) /*!< 0x00200000 */ + +#define USB_OTG_HCCHAR_DAD_Pos (22U) +#define USB_OTG_HCCHAR_DAD_Msk (0x7FUL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x1FC00000 */ +#define USB_OTG_HCCHAR_DAD USB_OTG_HCCHAR_DAD_Msk /*!< Device address */ +#define USB_OTG_HCCHAR_DAD_0 (0x01UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x00400000 */ +#define USB_OTG_HCCHAR_DAD_1 (0x02UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x00800000 */ +#define USB_OTG_HCCHAR_DAD_2 (0x04UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x01000000 */ +#define USB_OTG_HCCHAR_DAD_3 (0x08UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x02000000 */ +#define USB_OTG_HCCHAR_DAD_4 (0x10UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x04000000 */ +#define USB_OTG_HCCHAR_DAD_5 (0x20UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x08000000 */ +#define USB_OTG_HCCHAR_DAD_6 (0x40UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x10000000 */ +#define USB_OTG_HCCHAR_ODDFRM_Pos (29U) +#define USB_OTG_HCCHAR_ODDFRM_Msk (0x1UL << USB_OTG_HCCHAR_ODDFRM_Pos) /*!< 0x20000000 */ +#define USB_OTG_HCCHAR_ODDFRM USB_OTG_HCCHAR_ODDFRM_Msk /*!< Odd frame */ +#define USB_OTG_HCCHAR_CHDIS_Pos (30U) +#define USB_OTG_HCCHAR_CHDIS_Msk (0x1UL << USB_OTG_HCCHAR_CHDIS_Pos) /*!< 0x40000000 */ +#define USB_OTG_HCCHAR_CHDIS USB_OTG_HCCHAR_CHDIS_Msk /*!< Channel disable */ +#define USB_OTG_HCCHAR_CHENA_Pos (31U) +#define USB_OTG_HCCHAR_CHENA_Msk (0x1UL << USB_OTG_HCCHAR_CHENA_Pos) /*!< 0x80000000 */ +#define USB_OTG_HCCHAR_CHENA USB_OTG_HCCHAR_CHENA_Msk /*!< Channel enable */ + +/******************** Bit definition for USB_OTG_HCSPLT register ********************/ + +#define USB_OTG_HCSPLT_PRTADDR_Pos (0U) +#define USB_OTG_HCSPLT_PRTADDR_Msk (0x7FUL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x0000007F */ +#define USB_OTG_HCSPLT_PRTADDR USB_OTG_HCSPLT_PRTADDR_Msk /*!< Port address */ +#define USB_OTG_HCSPLT_PRTADDR_0 (0x01UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000001 */ +#define USB_OTG_HCSPLT_PRTADDR_1 (0x02UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000002 */ +#define USB_OTG_HCSPLT_PRTADDR_2 (0x04UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000004 */ +#define USB_OTG_HCSPLT_PRTADDR_3 (0x08UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000008 */ +#define USB_OTG_HCSPLT_PRTADDR_4 (0x10UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000010 */ +#define USB_OTG_HCSPLT_PRTADDR_5 (0x20UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000020 */ +#define USB_OTG_HCSPLT_PRTADDR_6 (0x40UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000040 */ + +#define USB_OTG_HCSPLT_HUBADDR_Pos (7U) +#define USB_OTG_HCSPLT_HUBADDR_Msk (0x7FUL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00003F80 */ +#define USB_OTG_HCSPLT_HUBADDR USB_OTG_HCSPLT_HUBADDR_Msk /*!< Hub address */ +#define USB_OTG_HCSPLT_HUBADDR_0 (0x01UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000080 */ +#define USB_OTG_HCSPLT_HUBADDR_1 (0x02UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000100 */ +#define USB_OTG_HCSPLT_HUBADDR_2 (0x04UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000200 */ +#define USB_OTG_HCSPLT_HUBADDR_3 (0x08UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000400 */ +#define USB_OTG_HCSPLT_HUBADDR_4 (0x10UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000800 */ +#define USB_OTG_HCSPLT_HUBADDR_5 (0x20UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00001000 */ +#define USB_OTG_HCSPLT_HUBADDR_6 (0x40UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00002000 */ + +#define USB_OTG_HCSPLT_XACTPOS_Pos (14U) +#define USB_OTG_HCSPLT_XACTPOS_Msk (0x3UL << USB_OTG_HCSPLT_XACTPOS_Pos) /*!< 0x0000C000 */ +#define USB_OTG_HCSPLT_XACTPOS USB_OTG_HCSPLT_XACTPOS_Msk /*!< XACTPOS */ +#define USB_OTG_HCSPLT_XACTPOS_0 (0x1UL << USB_OTG_HCSPLT_XACTPOS_Pos) /*!< 0x00004000 */ +#define USB_OTG_HCSPLT_XACTPOS_1 (0x2UL << USB_OTG_HCSPLT_XACTPOS_Pos) /*!< 0x00008000 */ +#define USB_OTG_HCSPLT_COMPLSPLT_Pos (16U) +#define USB_OTG_HCSPLT_COMPLSPLT_Msk (0x1UL << USB_OTG_HCSPLT_COMPLSPLT_Pos) /*!< 0x00010000 */ +#define USB_OTG_HCSPLT_COMPLSPLT USB_OTG_HCSPLT_COMPLSPLT_Msk /*!< Do complete split */ +#define USB_OTG_HCSPLT_SPLITEN_Pos (31U) +#define USB_OTG_HCSPLT_SPLITEN_Msk (0x1UL << USB_OTG_HCSPLT_SPLITEN_Pos) /*!< 0x80000000 */ +#define USB_OTG_HCSPLT_SPLITEN USB_OTG_HCSPLT_SPLITEN_Msk /*!< Split enable */ + +/******************** Bit definition for USB_OTG_HCINT register ********************/ +#define USB_OTG_HCINT_XFRC_Pos (0U) +#define USB_OTG_HCINT_XFRC_Msk (0x1UL << USB_OTG_HCINT_XFRC_Pos) /*!< 0x00000001 */ +#define USB_OTG_HCINT_XFRC USB_OTG_HCINT_XFRC_Msk /*!< Transfer completed */ +#define USB_OTG_HCINT_CHH_Pos (1U) +#define USB_OTG_HCINT_CHH_Msk (0x1UL << USB_OTG_HCINT_CHH_Pos) /*!< 0x00000002 */ +#define USB_OTG_HCINT_CHH USB_OTG_HCINT_CHH_Msk /*!< Channel halted */ +#define USB_OTG_HCINT_AHBERR_Pos (2U) +#define USB_OTG_HCINT_AHBERR_Msk (0x1UL << USB_OTG_HCINT_AHBERR_Pos) /*!< 0x00000004 */ +#define USB_OTG_HCINT_AHBERR USB_OTG_HCINT_AHBERR_Msk /*!< AHB error */ +#define USB_OTG_HCINT_STALL_Pos (3U) +#define USB_OTG_HCINT_STALL_Msk (0x1UL << USB_OTG_HCINT_STALL_Pos) /*!< 0x00000008 */ +#define USB_OTG_HCINT_STALL USB_OTG_HCINT_STALL_Msk /*!< STALL response received interrupt */ +#define USB_OTG_HCINT_NAK_Pos (4U) +#define USB_OTG_HCINT_NAK_Msk (0x1UL << USB_OTG_HCINT_NAK_Pos) /*!< 0x00000010 */ +#define USB_OTG_HCINT_NAK USB_OTG_HCINT_NAK_Msk /*!< NAK response received interrupt */ +#define USB_OTG_HCINT_ACK_Pos (5U) +#define USB_OTG_HCINT_ACK_Msk (0x1UL << USB_OTG_HCINT_ACK_Pos) /*!< 0x00000020 */ +#define USB_OTG_HCINT_ACK USB_OTG_HCINT_ACK_Msk /*!< ACK response received/transmitted interrupt */ +#define USB_OTG_HCINT_NYET_Pos (6U) +#define USB_OTG_HCINT_NYET_Msk (0x1UL << USB_OTG_HCINT_NYET_Pos) /*!< 0x00000040 */ +#define USB_OTG_HCINT_NYET USB_OTG_HCINT_NYET_Msk /*!< Response received interrupt */ +#define USB_OTG_HCINT_TXERR_Pos (7U) +#define USB_OTG_HCINT_TXERR_Msk (0x1UL << USB_OTG_HCINT_TXERR_Pos) /*!< 0x00000080 */ +#define USB_OTG_HCINT_TXERR USB_OTG_HCINT_TXERR_Msk /*!< Transaction error */ +#define USB_OTG_HCINT_BBERR_Pos (8U) +#define USB_OTG_HCINT_BBERR_Msk (0x1UL << USB_OTG_HCINT_BBERR_Pos) /*!< 0x00000100 */ +#define USB_OTG_HCINT_BBERR USB_OTG_HCINT_BBERR_Msk /*!< Babble error */ +#define USB_OTG_HCINT_FRMOR_Pos (9U) +#define USB_OTG_HCINT_FRMOR_Msk (0x1UL << USB_OTG_HCINT_FRMOR_Pos) /*!< 0x00000200 */ +#define USB_OTG_HCINT_FRMOR USB_OTG_HCINT_FRMOR_Msk /*!< Frame overrun */ +#define USB_OTG_HCINT_DTERR_Pos (10U) +#define USB_OTG_HCINT_DTERR_Msk (0x1UL << USB_OTG_HCINT_DTERR_Pos) /*!< 0x00000400 */ +#define USB_OTG_HCINT_DTERR USB_OTG_HCINT_DTERR_Msk /*!< Data toggle error */ + +/******************** Bit definition for USB_OTG_DIEPINT register ********************/ +#define USB_OTG_DIEPINT_XFRC_Pos (0U) +#define USB_OTG_DIEPINT_XFRC_Msk (0x1UL << USB_OTG_DIEPINT_XFRC_Pos) /*!< 0x00000001 */ +#define USB_OTG_DIEPINT_XFRC USB_OTG_DIEPINT_XFRC_Msk /*!< Transfer completed interrupt */ +#define USB_OTG_DIEPINT_EPDISD_Pos (1U) +#define USB_OTG_DIEPINT_EPDISD_Msk (0x1UL << USB_OTG_DIEPINT_EPDISD_Pos) /*!< 0x00000002 */ +#define USB_OTG_DIEPINT_EPDISD USB_OTG_DIEPINT_EPDISD_Msk /*!< Endpoint disabled interrupt */ +#define USB_OTG_DIEPINT_AHBERR_Pos (2U) +#define USB_OTG_DIEPINT_AHBERR_Msk (0x1UL << USB_OTG_DIEPINT_AHBERR_Pos) /*!< 0x00000004 */ +#define USB_OTG_DIEPINT_AHBERR USB_OTG_DIEPINT_AHBERR_Msk /*!< AHB Error (AHBErr) during an IN transaction */ +#define USB_OTG_DIEPINT_TOC_Pos (3U) +#define USB_OTG_DIEPINT_TOC_Msk (0x1UL << USB_OTG_DIEPINT_TOC_Pos) /*!< 0x00000008 */ +#define USB_OTG_DIEPINT_TOC USB_OTG_DIEPINT_TOC_Msk /*!< Timeout condition */ +#define USB_OTG_DIEPINT_ITTXFE_Pos (4U) +#define USB_OTG_DIEPINT_ITTXFE_Msk (0x1UL << USB_OTG_DIEPINT_ITTXFE_Pos) /*!< 0x00000010 */ +#define USB_OTG_DIEPINT_ITTXFE USB_OTG_DIEPINT_ITTXFE_Msk /*!< IN token received when TxFIFO is empty */ +#define USB_OTG_DIEPINT_INEPNM_Pos (5U) +#define USB_OTG_DIEPINT_INEPNM_Msk (0x1UL << USB_OTG_DIEPINT_INEPNM_Pos) /*!< 0x00000004 */ +#define USB_OTG_DIEPINT_INEPNM USB_OTG_DIEPINT_INEPNM_Msk /*!< IN token received with EP mismatch */ +#define USB_OTG_DIEPINT_INEPNE_Pos (6U) +#define USB_OTG_DIEPINT_INEPNE_Msk (0x1UL << USB_OTG_DIEPINT_INEPNE_Pos) /*!< 0x00000040 */ +#define USB_OTG_DIEPINT_INEPNE USB_OTG_DIEPINT_INEPNE_Msk /*!< IN endpoint NAK effective */ +#define USB_OTG_DIEPINT_TXFE_Pos (7U) +#define USB_OTG_DIEPINT_TXFE_Msk (0x1UL << USB_OTG_DIEPINT_TXFE_Pos) /*!< 0x00000080 */ +#define USB_OTG_DIEPINT_TXFE USB_OTG_DIEPINT_TXFE_Msk /*!< Transmit FIFO empty */ +#define USB_OTG_DIEPINT_TXFIFOUDRN_Pos (8U) +#define USB_OTG_DIEPINT_TXFIFOUDRN_Msk (0x1UL << USB_OTG_DIEPINT_TXFIFOUDRN_Pos) /*!< 0x00000100 */ +#define USB_OTG_DIEPINT_TXFIFOUDRN USB_OTG_DIEPINT_TXFIFOUDRN_Msk /*!< Transmit Fifo Underrun */ +#define USB_OTG_DIEPINT_BNA_Pos (9U) +#define USB_OTG_DIEPINT_BNA_Msk (0x1UL << USB_OTG_DIEPINT_BNA_Pos) /*!< 0x00000200 */ +#define USB_OTG_DIEPINT_BNA USB_OTG_DIEPINT_BNA_Msk /*!< Buffer not available interrupt */ +#define USB_OTG_DIEPINT_PKTDRPSTS_Pos (11U) +#define USB_OTG_DIEPINT_PKTDRPSTS_Msk (0x1UL << USB_OTG_DIEPINT_PKTDRPSTS_Pos) /*!< 0x00000800 */ +#define USB_OTG_DIEPINT_PKTDRPSTS USB_OTG_DIEPINT_PKTDRPSTS_Msk /*!< Packet dropped status */ +#define USB_OTG_DIEPINT_BERR_Pos (12U) +#define USB_OTG_DIEPINT_BERR_Msk (0x1UL << USB_OTG_DIEPINT_BERR_Pos) /*!< 0x00001000 */ +#define USB_OTG_DIEPINT_BERR USB_OTG_DIEPINT_BERR_Msk /*!< Babble error interrupt */ +#define USB_OTG_DIEPINT_NAK_Pos (13U) +#define USB_OTG_DIEPINT_NAK_Msk (0x1UL << USB_OTG_DIEPINT_NAK_Pos) /*!< 0x00002000 */ +#define USB_OTG_DIEPINT_NAK USB_OTG_DIEPINT_NAK_Msk /*!< NAK interrupt */ + +/******************** Bit definition forUSB_OTG_HCINTMSK register ********************/ +#define USB_OTG_HCINTMSK_XFRCM_Pos (0U) +#define USB_OTG_HCINTMSK_XFRCM_Msk (0x1UL << USB_OTG_HCINTMSK_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_HCINTMSK_XFRCM USB_OTG_HCINTMSK_XFRCM_Msk /*!< Transfer completed mask */ +#define USB_OTG_HCINTMSK_CHHM_Pos (1U) +#define USB_OTG_HCINTMSK_CHHM_Msk (0x1UL << USB_OTG_HCINTMSK_CHHM_Pos) /*!< 0x00000002 */ +#define USB_OTG_HCINTMSK_CHHM USB_OTG_HCINTMSK_CHHM_Msk /*!< Channel halted mask */ +#define USB_OTG_HCINTMSK_AHBERR_Pos (2U) +#define USB_OTG_HCINTMSK_AHBERR_Msk (0x1UL << USB_OTG_HCINTMSK_AHBERR_Pos) /*!< 0x00000004 */ +#define USB_OTG_HCINTMSK_AHBERR USB_OTG_HCINTMSK_AHBERR_Msk /*!< AHB error */ +#define USB_OTG_HCINTMSK_STALLM_Pos (3U) +#define USB_OTG_HCINTMSK_STALLM_Msk (0x1UL << USB_OTG_HCINTMSK_STALLM_Pos) /*!< 0x00000008 */ +#define USB_OTG_HCINTMSK_STALLM USB_OTG_HCINTMSK_STALLM_Msk /*!< STALL response received interrupt mask */ +#define USB_OTG_HCINTMSK_NAKM_Pos (4U) +#define USB_OTG_HCINTMSK_NAKM_Msk (0x1UL << USB_OTG_HCINTMSK_NAKM_Pos) /*!< 0x00000010 */ +#define USB_OTG_HCINTMSK_NAKM USB_OTG_HCINTMSK_NAKM_Msk /*!< NAK response received interrupt mask */ +#define USB_OTG_HCINTMSK_ACKM_Pos (5U) +#define USB_OTG_HCINTMSK_ACKM_Msk (0x1UL << USB_OTG_HCINTMSK_ACKM_Pos) /*!< 0x00000020 */ +#define USB_OTG_HCINTMSK_ACKM USB_OTG_HCINTMSK_ACKM_Msk /*!< ACK response received/transmitted interrupt mask */ +#define USB_OTG_HCINTMSK_NYET_Pos (6U) +#define USB_OTG_HCINTMSK_NYET_Msk (0x1UL << USB_OTG_HCINTMSK_NYET_Pos) /*!< 0x00000040 */ +#define USB_OTG_HCINTMSK_NYET USB_OTG_HCINTMSK_NYET_Msk /*!< response received interrupt mask */ +#define USB_OTG_HCINTMSK_TXERRM_Pos (7U) +#define USB_OTG_HCINTMSK_TXERRM_Msk (0x1UL << USB_OTG_HCINTMSK_TXERRM_Pos) /*!< 0x00000080 */ +#define USB_OTG_HCINTMSK_TXERRM USB_OTG_HCINTMSK_TXERRM_Msk /*!< Transaction error mask */ +#define USB_OTG_HCINTMSK_BBERRM_Pos (8U) +#define USB_OTG_HCINTMSK_BBERRM_Msk (0x1UL << USB_OTG_HCINTMSK_BBERRM_Pos) /*!< 0x00000100 */ +#define USB_OTG_HCINTMSK_BBERRM USB_OTG_HCINTMSK_BBERRM_Msk /*!< Babble error mask */ +#define USB_OTG_HCINTMSK_FRMORM_Pos (9U) +#define USB_OTG_HCINTMSK_FRMORM_Msk (0x1UL << USB_OTG_HCINTMSK_FRMORM_Pos) /*!< 0x00000200 */ +#define USB_OTG_HCINTMSK_FRMORM USB_OTG_HCINTMSK_FRMORM_Msk /*!< Frame overrun mask */ +#define USB_OTG_HCINTMSK_DTERRM_Pos (10U) +#define USB_OTG_HCINTMSK_DTERRM_Msk (0x1UL << USB_OTG_HCINTMSK_DTERRM_Pos) /*!< 0x00000400 */ +#define USB_OTG_HCINTMSK_DTERRM USB_OTG_HCINTMSK_DTERRM_Msk /*!< Data toggle error mask */ + +/******************** Bit definition for USB_OTG_DIEPTSIZ register ********************/ + +#define USB_OTG_DIEPTSIZ_XFRSIZ_Pos (0U) +#define USB_OTG_DIEPTSIZ_XFRSIZ_Msk (0x7FFFFUL << USB_OTG_DIEPTSIZ_XFRSIZ_Pos) /*!< 0x0007FFFF */ +#define USB_OTG_DIEPTSIZ_XFRSIZ USB_OTG_DIEPTSIZ_XFRSIZ_Msk /*!< Transfer size */ +#define USB_OTG_DIEPTSIZ_PKTCNT_Pos (19U) +#define USB_OTG_DIEPTSIZ_PKTCNT_Msk (0x3FFUL << USB_OTG_DIEPTSIZ_PKTCNT_Pos) /*!< 0x1FF80000 */ +#define USB_OTG_DIEPTSIZ_PKTCNT USB_OTG_DIEPTSIZ_PKTCNT_Msk /*!< Packet count */ +#define USB_OTG_DIEPTSIZ_MULCNT_Pos (29U) +#define USB_OTG_DIEPTSIZ_MULCNT_Msk (0x3UL << USB_OTG_DIEPTSIZ_MULCNT_Pos) /*!< 0x60000000 */ +#define USB_OTG_DIEPTSIZ_MULCNT USB_OTG_DIEPTSIZ_MULCNT_Msk /*!< Packet count */ +/******************** Bit definition for USB_OTG_HCTSIZ register ********************/ +#define USB_OTG_HCTSIZ_XFRSIZ_Pos (0U) +#define USB_OTG_HCTSIZ_XFRSIZ_Msk (0x7FFFFUL << USB_OTG_HCTSIZ_XFRSIZ_Pos) /*!< 0x0007FFFF */ +#define USB_OTG_HCTSIZ_XFRSIZ USB_OTG_HCTSIZ_XFRSIZ_Msk /*!< Transfer size */ +#define USB_OTG_HCTSIZ_PKTCNT_Pos (19U) +#define USB_OTG_HCTSIZ_PKTCNT_Msk (0x3FFUL << USB_OTG_HCTSIZ_PKTCNT_Pos) /*!< 0x1FF80000 */ +#define USB_OTG_HCTSIZ_PKTCNT USB_OTG_HCTSIZ_PKTCNT_Msk /*!< Packet count */ +#define USB_OTG_HCTSIZ_DOPING_Pos (31U) +#define USB_OTG_HCTSIZ_DOPING_Msk (0x1UL << USB_OTG_HCTSIZ_DOPING_Pos) /*!< 0x80000000 */ +#define USB_OTG_HCTSIZ_DOPING USB_OTG_HCTSIZ_DOPING_Msk /*!< Do PING */ +#define USB_OTG_HCTSIZ_DPID_Pos (29U) +#define USB_OTG_HCTSIZ_DPID_Msk (0x3UL << USB_OTG_HCTSIZ_DPID_Pos) /*!< 0x60000000 */ +#define USB_OTG_HCTSIZ_DPID USB_OTG_HCTSIZ_DPID_Msk /*!< Data PID */ +#define USB_OTG_HCTSIZ_DPID_0 (0x1UL << USB_OTG_HCTSIZ_DPID_Pos) /*!< 0x20000000 */ +#define USB_OTG_HCTSIZ_DPID_1 (0x2UL << USB_OTG_HCTSIZ_DPID_Pos) /*!< 0x40000000 */ + +/******************** Bit definition for USB_OTG_DIEPDMA register ********************/ +#define USB_OTG_DIEPDMA_DMAADDR_Pos (0U) +#define USB_OTG_DIEPDMA_DMAADDR_Msk (0xFFFFFFFFUL << USB_OTG_DIEPDMA_DMAADDR_Pos) /*!< 0xFFFFFFFF */ +#define USB_OTG_DIEPDMA_DMAADDR USB_OTG_DIEPDMA_DMAADDR_Msk /*!< DMA address */ + +/******************** Bit definition for USB_OTG_HCDMA register ********************/ +#define USB_OTG_HCDMA_DMAADDR_Pos (0U) +#define USB_OTG_HCDMA_DMAADDR_Msk (0xFFFFFFFFUL << USB_OTG_HCDMA_DMAADDR_Pos) /*!< 0xFFFFFFFF */ +#define USB_OTG_HCDMA_DMAADDR USB_OTG_HCDMA_DMAADDR_Msk /*!< DMA address */ + +/******************** Bit definition for USB_OTG_DTXFSTS register ********************/ +#define USB_OTG_DTXFSTS_INEPTFSAV_Pos (0U) +#define USB_OTG_DTXFSTS_INEPTFSAV_Msk (0xFFFFUL << USB_OTG_DTXFSTS_INEPTFSAV_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DTXFSTS_INEPTFSAV USB_OTG_DTXFSTS_INEPTFSAV_Msk /*!< IN endpoint TxFIFO space available */ + +/******************** Bit definition for USB_OTG_DIEPTXF register ********************/ +#define USB_OTG_DIEPTXF_INEPTXSA_Pos (0U) +#define USB_OTG_DIEPTXF_INEPTXSA_Msk (0xFFFFUL << USB_OTG_DIEPTXF_INEPTXSA_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DIEPTXF_INEPTXSA USB_OTG_DIEPTXF_INEPTXSA_Msk /*!< IN endpoint FIFOx transmit RAM start address */ +#define USB_OTG_DIEPTXF_INEPTXFD_Pos (16U) +#define USB_OTG_DIEPTXF_INEPTXFD_Msk (0xFFFFUL << USB_OTG_DIEPTXF_INEPTXFD_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_DIEPTXF_INEPTXFD USB_OTG_DIEPTXF_INEPTXFD_Msk /*!< IN endpoint TxFIFO depth */ + +/******************** Bit definition for USB_OTG_DOEPCTL register ********************/ + +#define USB_OTG_DOEPCTL_MPSIZ_Pos (0U) +#define USB_OTG_DOEPCTL_MPSIZ_Msk (0x7FFUL << USB_OTG_DOEPCTL_MPSIZ_Pos) /*!< 0x000007FF */ +#define USB_OTG_DOEPCTL_MPSIZ USB_OTG_DOEPCTL_MPSIZ_Msk /*!< Maximum packet size */ /*!GINTMSK &= ~(__INTERRUPT__)) +#define USB_UNMASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK |= (__INTERRUPT__)) +#define CLEAR_IN_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_INEP(__EPNUM__)->DIEPINT = (__INTERRUPT__)) +#define CLEAR_OUT_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_OUTEP(__EPNUM__)->DOEPINT = (__INTERRUPT__)) +#define USB_MASK_HALT_HC_INT(chnum) (USB_OTG_HC(chnum)->HCINTMSK &= ~USB_OTG_HCINTMSK_CHHM) +#define USB_UNMASK_HALT_HC_INT(chnum) (USB_OTG_HC(chnum)->HCINTMSK |= USB_OTG_HCINTMSK_CHHM) +#define CLEAR_HC_INT(chnum, __INTERRUPT__) (USB_OTG_HC(chnum)->HCINT = (__INTERRUPT__)) + +void usb_dc_low_level_init(uint8_t busid); +void usb_dc_low_level_deinit(uint8_t busid); +void usbd_dwc2_delay_ms(uint8_t ms); +#endif diff --git a/src/lib/CherryUSB/port/dwc2/usb_glue_at.c b/src/lib/CherryUSB/port/dwc2/usb_glue_at.c new file mode 100644 index 000000000..17dec47f3 --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_glue_at.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_dwc2_param.h" + +extern unsigned int system_core_clock; + +uint32_t SystemCoreClock; + +const struct dwc2_user_params param_pa11_pa12 = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = false, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 0, + [5] = 0, + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, +#ifdef AT32F415xx + .device_gccfg = ((1 << 16) | (1 << 18) | (1 << 19) | (1 << 21)), +#else + .device_gccfg = ((1 << 16) | (1 << 21)), +#endif + .total_fifo_size = 320 // 1280 byte +}; + +#if __has_include("at32f402_405.h") +#include "at32f402_405.h" + +const struct dwc2_user_params param_pb14_pb15 = { + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, + .device_dma_enable = true, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (1008 - 16 - 256 - 128 - 128 - 128 - 128), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 256, // 1024 byte + [2] = 128, // 512 byte + [3] = 128, // 512 byte + [4] = 128, // 512 byte + [5] = 128, // 512 byte + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 624, + .host_nperio_tx_fifo_size = 128, // 512 byte + .host_perio_tx_fifo_size = 256, // 1024 byte + + .device_gccfg = ((1 << 16) | (1 << 21)), + .host_gccfg = ((1 << 16) | (1 << 21)) +}; +#endif + +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM +void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) +{ + SystemCoreClock = system_core_clock; + +#if __has_include("at32f402_405.h") + if (reg_base == OTGHS_BASE) { + memcpy(params, ¶m_pb14_pb15, sizeof(struct dwc2_user_params)); + } else { + memcpy(params, ¶m_pa11_pa12, sizeof(struct dwc2_user_params)); + } +#else + memcpy(params, ¶m_pa11_pa12, sizeof(struct dwc2_user_params)); +#endif +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif +} +#endif + +void usbd_dwc2_delay_ms(uint8_t ms) +{ + uint32_t count = SystemCoreClock / 1000 * ms; + while (count--) { + __asm volatile("nop"); + } +} diff --git a/src/lib/CherryUSB/port/dwc2/usb_glue_esp.c b/src/lib/CherryUSB/port/dwc2/usb_glue_esp.c new file mode 100644 index 000000000..03110fb8c --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_glue_esp.c @@ -0,0 +1,291 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "sdkconfig.h" +#include "esp_idf_version.h" +#include "esp_intr_alloc.h" +#include "esp_private/usb_phy.h" +#include "soc/periph_defs.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_dwc2_param.h" + +#define GET_USB_INDEX(reg_base) 0 +#define GET_USB_INTR_SOURCE(reg_base) ETS_USB_INTR_SOURCE +#define GET_USB_PHY_TARGET(reg_base) USB_PHY_TARGET_INT +#define GET_USB_PHY_SPEED(reg_base) USB_PHY_SPEED_UNDEFINED +#ifdef CONFIG_IDF_TARGET_ESP32S2 +#define DEFAULT_CPU_FREQ_MHZ CONFIG_ESP32S2_DEFAULT_CPU_FREQ_MHZ +#define DEFAULT_USB_INTR_SOURCE ETS_USB_INTR_SOURCE +#elif CONFIG_IDF_TARGET_ESP32S3 +#define DEFAULT_CPU_FREQ_MHZ CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ +#define DEFAULT_USB_INTR_SOURCE ETS_USB_INTR_SOURCE +#elif CONFIG_IDF_TARGET_ESP32P4 +#undef GET_USB_INDEX +#define GET_USB_INDEX(reg_base) ((reg_base) == (void*)ESP_USB_HS0_BASE ? 0 : 1) +#define DEFAULT_CPU_FREQ_MHZ CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ +#define DEFAULT_USB_INTR_SOURCE ETS_USB_OTG_INTR_SOURCE +#define USB_FS_INTR_SOURCE ETS_USB_OTG11_CH0_INTR_SOURCE +#undef GET_USB_INTR_SOURCE +#define GET_USB_INTR_SOURCE(reg_base) ((reg_base) == (void*)ESP_USB_HS0_BASE ? DEFAULT_USB_INTR_SOURCE : USB_FS_INTR_SOURCE) +#undef GET_USB_PHY_TARGET +#define GET_USB_PHY_TARGET(reg_base) ((reg_base) == (void*)ESP_USB_HS0_BASE ? USB_PHY_TARGET_UTMI : USB_PHY_TARGET_INT) +#undef GET_USB_PHY_SPEED +#define GET_USB_PHY_SPEED(reg_base) ((reg_base) == (void*)ESP_USB_HS0_BASE ? USB_PHY_SPEED_HIGH : USB_PHY_SPEED_FULL) +#else +#define DEFAULT_CPU_FREQ_MHZ 160 +#endif + +uint32_t SystemCoreClock = (DEFAULT_CPU_FREQ_MHZ * 1000 * 1000); +static usb_phy_handle_t s_phy_handle[SOC_USB_OTG_PERIPH_NUM] = {NULL}; +static intr_handle_t s_interrupt_handle[SOC_USB_OTG_PERIPH_NUM] = {NULL}; + +#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 +const struct dwc2_user_params param_fs = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = true, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (200 - 16 * 7), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 16, // 64 byte + [5] = 16, // 64 byte + [6] = 16, // 64 byte + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 80, + .host_nperio_tx_fifo_size = 60, // 240 byte + .host_perio_tx_fifo_size = 60, // 240 byte +}; +#elif CONFIG_IDF_TARGET_ESP32P4 +const struct dwc2_user_params param_fs = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = true, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (200 - 16 * 7), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 16, // 64 byte + [5] = 16, // 64 byte + [6] = 16, // 64 byte + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = (200 - 60 - 60), + .host_nperio_tx_fifo_size = 60, // 240 byte + .host_perio_tx_fifo_size = 60, // 240 byte +}; + +const struct dwc2_user_params param_hs = { + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, + .device_dma_enable = true, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (896 - 16 - 128 - 128 - 128 - 128 - 16 - 16), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 128, // 512 byte + [2] = 128, // 512 byte + [3] = 128, // 512 byte + [4] = 128, // 512 byte + [5] = 16, // 64 byte + [6] = 16, // 64 byte + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = (896 - 128 - 128), + .host_nperio_tx_fifo_size = 128, // 512 byte + .host_perio_tx_fifo_size = 128, // 512 byte +}; +#endif + +static void usb_dc_interrupt_cb(void *arg_pv) +{ + extern void USBD_IRQHandler(uint8_t busid); + uint8_t busid = (uintptr_t)arg_pv; + USBD_IRQHandler(busid); +} + +void usb_dc_low_level_init(uint8_t busid) +{ + esp_err_t ret; + void *reg_base = (void*)g_usbdev_bus[busid].reg_base; + (void)reg_base; + usb_phy_config_t phy_config = { + .controller = USB_PHY_CTRL_OTG, + .otg_mode = USB_OTG_MODE_DEVICE, + }; + phy_config.target = GET_USB_PHY_TARGET(reg_base); + phy_config.otg_speed = GET_USB_PHY_SPEED(reg_base); + + ret = usb_new_phy(&phy_config, &s_phy_handle[GET_USB_INDEX(reg_base)]); + if (ret != ESP_OK) { + USB_LOG_ERR("USB Phy Init Failed!\r\n"); + return; + } + + uintptr_t arg = busid; + // TODO: Check when to enable interrupt + ret = esp_intr_alloc(GET_USB_INTR_SOURCE(reg_base), ESP_INTR_FLAG_LOWMED, usb_dc_interrupt_cb, (void *)arg, &s_interrupt_handle[GET_USB_INDEX(reg_base)]); + if (ret != ESP_OK) { + USB_LOG_ERR("USB Interrupt Init Failed!\r\n"); + return; + } + USB_LOG_INFO("cherryusb, version: " CHERRYUSB_VERSION_STR "\r\n"); +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + void *reg_base = (void*)g_usbdev_bus[busid].reg_base; + (void)reg_base; + if (s_interrupt_handle[GET_USB_INDEX(reg_base)]) { + esp_intr_free(s_interrupt_handle[GET_USB_INDEX(reg_base)]); + s_interrupt_handle[GET_USB_INDEX(reg_base)] = NULL; + } + if (s_phy_handle[GET_USB_INDEX(reg_base)]) { + usb_del_phy(s_phy_handle[GET_USB_INDEX(reg_base)]); + s_phy_handle[GET_USB_INDEX(reg_base)] = NULL; + } +} + +static void usb_hc_interrupt_cb(void *arg_pv) +{ + extern void USBH_IRQHandler(uint8_t busid); + uint8_t busid = (uintptr_t)arg_pv; + USBH_IRQHandler(busid); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + void *reg_base = (void*)bus->hcd.reg_base; + (void)reg_base; + // Host Library defaults to internal PHY + usb_phy_config_t phy_config = { + .controller = USB_PHY_CTRL_OTG, + .otg_mode = USB_OTG_MODE_HOST, + .otg_speed = USB_PHY_SPEED_UNDEFINED, // In Host mode, the speed is determined by the connected device + .ext_io_conf = NULL, + .otg_io_conf = NULL, + }; + phy_config.target = GET_USB_PHY_TARGET(reg_base); + + esp_err_t ret = usb_new_phy(&phy_config, &s_phy_handle[GET_USB_INDEX(reg_base)]); + if (ret != ESP_OK) { + USB_LOG_ERR("USB Phy Init Failed!\r\n"); + return; + } + + uintptr_t arg = bus->busid; + // TODO: Check when to enable interrupt + ret = esp_intr_alloc(GET_USB_INTR_SOURCE(reg_base), ESP_INTR_FLAG_LOWMED, usb_hc_interrupt_cb, (void*)(arg), &s_interrupt_handle[GET_USB_INDEX(reg_base)]); + if (ret != ESP_OK) { + USB_LOG_ERR("USB Interrupt Init Failed!\r\n"); + return; + } + USB_LOG_INFO("cherryusb, version: " CHERRYUSB_VERSION_STR "\r\n"); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + void *reg_base = (void*)bus->hcd.reg_base; + (void)reg_base; + if (s_interrupt_handle[GET_USB_INDEX(reg_base)]) { + esp_intr_free(s_interrupt_handle[GET_USB_INDEX(reg_base)]); + s_interrupt_handle[GET_USB_INDEX(reg_base)] = NULL; + } + if (s_phy_handle[GET_USB_INDEX(reg_base)]) { + usb_del_phy(s_phy_handle[GET_USB_INDEX(reg_base)]); + s_phy_handle[GET_USB_INDEX(reg_base)] = NULL; + } +} + +void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) +{ +#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 + memcpy(params, ¶m_fs, sizeof(struct dwc2_user_params)); +#elif CONFIG_IDF_TARGET_ESP32P4 + if (reg_base == ESP_USB_HS0_BASE) { + memcpy(params, ¶m_hs, sizeof(struct dwc2_user_params)); + } else { + memcpy(params, ¶m_fs, sizeof(struct dwc2_user_params)); + } +#endif +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) + { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif +} + +void usbd_dwc2_delay_ms(uint8_t ms) +{ + vTaskDelay(pdMS_TO_TICKS(ms)); +} + +#ifdef CONFIG_USB_DCACHE_ENABLE +#include "esp_cache.h" + +void usb_dcache_clean(uintptr_t addr, size_t size) +{ + if (size == 0) + return; + + esp_cache_msync((void *)addr, size, ESP_CACHE_MSYNC_FLAG_TYPE_DATA | ESP_CACHE_MSYNC_FLAG_DIR_C2M); +} + +void usb_dcache_invalidate(uintptr_t addr, size_t size) +{ + if (size == 0) + return; + + esp_cache_msync((void *)addr, size, ESP_CACHE_MSYNC_FLAG_TYPE_DATA | ESP_CACHE_MSYNC_FLAG_DIR_M2C); +} + +void usb_dcache_flush(uintptr_t addr, size_t size) +{ + if (size == 0) + return; + + esp_cache_msync((void *)addr, size, ESP_CACHE_MSYNC_FLAG_TYPE_DATA | ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_DIR_M2C); +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/dwc2/usb_glue_gd.c b/src/lib/CherryUSB/port/dwc2/usb_glue_gd.c new file mode 100644 index 000000000..1a2368628 --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_glue_gd.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_config.h" +#include "stdint.h" +#include "usb_dwc2_reg.h" + +#if 1 +#error you need to modify some usb register values then use this chip +#endif + +#if CONFIG_USBDEV_EP_NUM != 4 && CONFIG_USBDEV_EP_NUM != 6 +#error "gd32 only has 4 endpoints for pa11/pa12 and 6 endpoints for pb14/pb15" +#endif + +/* you can find this config in function:usb_core_init, file:drv_usb_core.c, for example: + * + * usb_regs->gr->GCCFG |= GCCFG_PWRON | GCCFG_VBUSACEN | GCCFG_VBUSBCEN; + * +*/ + +uint32_t usbd_get_dwc2_gccfg_conf(uint32_t reg_base) +{ +#ifdef CONFIG_USB_HS + return 0; +#else + return ((1 << 16) | (1 << 18) | (1 << 19) | (1 << 21)); +#endif +} + +uint32_t usbh_get_dwc2_gccfg_conf(uint32_t reg_base) +{ +#ifdef CONFIG_USB_HS + return 0; +#else + return ((1 << 16) | (1 << 18) | (1 << 19) | (1 << 21)); +#endif +} + +extern uint32_t SystemCoreClock; + +void usbd_dwc2_delay_ms(uint8_t ms) +{ + uint32_t count = SystemCoreClock / 1000 * ms; + while (count--) { + __asm volatile("nop"); + } +} diff --git a/src/lib/CherryUSB/port/dwc2/usb_glue_hc.c b/src/lib/CherryUSB/port/dwc2/usb_glue_hc.c new file mode 100644 index 000000000..350448ca2 --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_glue_hc.c @@ -0,0 +1,303 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-08 CDT first version + */ + +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_dwc2_param.h" + +#include "board_config.h" + +#if defined(RT_CHERRYUSB_HOST) && defined(RT_CHERRYUSB_DEVICE) + #if defined(HC32F460) || defined(HC32F472) + #error "Only one USB role can be selected!" + #endif +#endif + +const struct dwc2_user_params param_fs_core = +{ + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = CONFIG_USB_FS_CORE_DEVICE_RX_FIFO_SIZE, + .device_tx_fifo_size = { + [0] = CONFIG_USB_FS_CORE_DEVICE_TX0_FIFO_SIZE, + [1] = CONFIG_USB_FS_CORE_DEVICE_TX1_FIFO_SIZE, + [2] = CONFIG_USB_FS_CORE_DEVICE_TX2_FIFO_SIZE, + [3] = CONFIG_USB_FS_CORE_DEVICE_TX3_FIFO_SIZE, + [4] = CONFIG_USB_FS_CORE_DEVICE_TX4_FIFO_SIZE, + [5] = CONFIG_USB_FS_CORE_DEVICE_TX5_FIFO_SIZE, +#if defined(HC32F4A0) || defined(HC32F4A8) + [6] = CONFIG_USB_FS_CORE_DEVICE_TX6_FIFO_SIZE, + [7] = CONFIG_USB_FS_CORE_DEVICE_TX7_FIFO_SIZE, + [8] = CONFIG_USB_FS_CORE_DEVICE_TX8_FIFO_SIZE, + [9] = CONFIG_USB_FS_CORE_DEVICE_TX9_FIFO_SIZE, + [10] = CONFIG_USB_FS_CORE_DEVICE_TX10_FIFO_SIZE, + [11] = CONFIG_USB_FS_CORE_DEVICE_TX11_FIFO_SIZE, + [12] = CONFIG_USB_FS_CORE_DEVICE_TX12_FIFO_SIZE, + [13] = CONFIG_USB_FS_CORE_DEVICE_TX13_FIFO_SIZE, + [14] = CONFIG_USB_FS_CORE_DEVICE_TX14_FIFO_SIZE, + [15] = CONFIG_USB_FS_CORE_DEVICE_TX15_FIFO_SIZE +#elif defined(HC32F460) || defined(HC32F472) + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 +#endif + }, + .total_fifo_size = CONFIG_USB_FS_CORE_TOTAL_FIFO_SIZE, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = CONFIG_USB_FS_CORE_HOST_RX_FIFO_SIZE, + .host_nperio_tx_fifo_size = CONFIG_USB_FS_CORE_HOST_NP_FIFO_SIZE, + .host_perio_tx_fifo_size = CONFIG_USB_FS_CORE_HOST_PE_FIFO_SIZE, + .device_gccfg = 0, + .host_gccfg = 0, +#if defined(HC32F4A0) || defined(HC32F4A8) || defined(HC32F460) + .b_session_valid_override = false, +#elif defined(HC32F472) + .b_session_valid_override = true, +#endif +}; + +#if defined(HC32F4A0) || defined(HC32F4A8) +const struct dwc2_user_params param_hs_core = +{ +#ifdef CONFIG_USB_HS + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#else + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#endif +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = CONFIG_USB_HS_CORE_DEVICE_RX_FIFO_SIZE, + .device_tx_fifo_size = { + [0] = CONFIG_USB_HS_CORE_DEVICE_TX0_FIFO_SIZE, + [1] = CONFIG_USB_HS_CORE_DEVICE_TX1_FIFO_SIZE, + [2] = CONFIG_USB_HS_CORE_DEVICE_TX2_FIFO_SIZE, + [3] = CONFIG_USB_HS_CORE_DEVICE_TX3_FIFO_SIZE, + [4] = CONFIG_USB_HS_CORE_DEVICE_TX4_FIFO_SIZE, + [5] = CONFIG_USB_HS_CORE_DEVICE_TX5_FIFO_SIZE, + [6] = CONFIG_USB_HS_CORE_DEVICE_TX6_FIFO_SIZE, + [7] = CONFIG_USB_HS_CORE_DEVICE_TX7_FIFO_SIZE, + [8] = CONFIG_USB_HS_CORE_DEVICE_TX8_FIFO_SIZE, + [9] = CONFIG_USB_HS_CORE_DEVICE_TX9_FIFO_SIZE, + [10] = CONFIG_USB_HS_CORE_DEVICE_TX10_FIFO_SIZE, + [11] = CONFIG_USB_HS_CORE_DEVICE_TX11_FIFO_SIZE, + [12] = CONFIG_USB_HS_CORE_DEVICE_TX12_FIFO_SIZE, + [13] = CONFIG_USB_HS_CORE_DEVICE_TX13_FIFO_SIZE, + [14] = CONFIG_USB_HS_CORE_DEVICE_TX14_FIFO_SIZE, + [15] = CONFIG_USB_HS_CORE_DEVICE_TX15_FIFO_SIZE + }, + .total_fifo_size = CONFIG_USB_HS_CORE_TOTAL_FIFO_SIZE, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = CONFIG_USB_HS_CORE_HOST_RX_FIFO_SIZE, + .host_nperio_tx_fifo_size = CONFIG_USB_HS_CORE_HOST_NP_FIFO_SIZE, + .host_perio_tx_fifo_size = CONFIG_USB_HS_CORE_HOST_PE_FIFO_SIZE, + .device_gccfg = 0, + .host_gccfg = 0, + .b_session_valid_override = false, +}; +#endif + +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM +void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) +{ +#if defined(HC32F4A0) || defined(HC32F4A8) + if (reg_base == CM_USBHS_BASE) + { + memcpy(params, ¶m_hs_core, sizeof(struct dwc2_user_params)); + } + else +#endif + { + memcpy(params, ¶m_fs_core, sizeof(struct dwc2_user_params)); + } +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) + { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif +} +#endif + +#define BOARD_INIT_USB_HOST_MODE (0U) +#define BOARD_INIT_USB_DEVICE_MODE (1U) +extern rt_err_t rt_hw_usbfs_board_init(uint8_t devmode); +static uint8_t g_usb_fs_busid = 0U; +#if defined(HC32F4A0) || defined(HC32F4A8) + extern rt_err_t rt_hw_usbhs_board_init(uint8_t devmode); + static uint8_t g_usb_hs_busid = 0U; +#endif + +#if defined(RT_CHERRYUSB_HOST) +static void usbh_fs_irq_handler(void) +{ + USBH_IRQHandler(g_usb_fs_busid); +} + +#if defined(HC32F4A0) || defined(HC32F4A8) +static void usbh_hs_irq_handler(void) +{ + USBH_IRQHandler(g_usb_hs_busid); +} +#endif + +#if defined(HC32F472) +void USBFS_Handler(void) +{ + usbh_fs_irq_handler(); +} +#endif + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + struct hc32_irq_config irq_config; + +#if defined(HC32F4A0) || defined(HC32F4A8) + if (bus->hcd.reg_base == CM_USBHS_BASE) + { + g_usb_hs_busid = bus->hcd.hcd_id; + + rt_hw_usbhs_board_init(BOARD_INIT_USB_HOST_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBHS, ENABLE); +#ifndef CONFIG_USB_HS + /* enable the embedded PHY in USBHS mode */ + CM_PERIC->USB_SYCTLREG |= PERIC_USB_SYCTLREG_USBHS_FSPHYE; +#endif + + irq_config.irq_num = BSP_USBHS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBHS_GLB; + irq_config.irq_prio = BSP_USBHS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbh_hs_irq_handler, + RT_TRUE); + } + else +#endif + { + g_usb_fs_busid = bus->hcd.hcd_id; + + rt_hw_usbfs_board_init(BOARD_INIT_USB_HOST_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE); + + irq_config.irq_num = BSP_USBFS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBFS_GLB; + irq_config.irq_prio = BSP_USBFS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbh_fs_irq_handler, + RT_TRUE); + } + +} +#endif + +#if defined(RT_CHERRYUSB_DEVICE) +static void usbd_fs_irq_handler(void) +{ + USBD_IRQHandler(g_usb_fs_busid); +} + +#if defined(HC32F4A0) || defined(HC32F4A8) +static void usbd_hs_irq_handler(void) +{ + USBD_IRQHandler(g_usb_hs_busid); +} +#endif + +#if defined(HC32F472) +void USBFS_Handler(void) +{ + usbd_fs_irq_handler(); +} +#endif + +void usb_dc_low_level_init(uint8_t busid) +{ + struct hc32_irq_config irq_config; + +#if defined(HC32F4A0) || defined(HC32F4A8) + if (g_usbdev_bus[busid].reg_base == CM_USBHS_BASE) + { + g_usb_hs_busid = busid; + + rt_hw_usbhs_board_init(BOARD_INIT_USB_DEVICE_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBHS, ENABLE); + +#ifndef CONFIG_USB_HS + /* enable the embedded PHY in USBHS mode */ + CM_PERIC->USB_SYCTLREG |= PERIC_USB_SYCTLREG_USBHS_FSPHYE; +#endif + + irq_config.irq_num = BSP_USBHS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBHS_GLB; + irq_config.irq_prio = BSP_USBHS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbd_hs_irq_handler, + RT_TRUE); + } + else +#endif + { + g_usb_fs_busid = busid; + + rt_hw_usbfs_board_init(BOARD_INIT_USB_DEVICE_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE); + + irq_config.irq_num = BSP_USBFS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBFS_GLB; + irq_config.irq_prio = BSP_USBFS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbd_fs_irq_handler, + RT_TRUE); + } +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + (void)busid; + /* reserved */ +} + +#endif + +extern uint32_t SystemCoreClock; + +void usbd_dwc2_delay_ms(uint8_t ms) +{ + uint32_t count = SystemCoreClock / 1000 * ms; + while (count--) { + __asm volatile("nop"); + } +} diff --git a/src/lib/CherryUSB/port/dwc2/usb_glue_kendryte.c b/src/lib/CherryUSB/port/dwc2/usb_glue_kendryte.c new file mode 100644 index 000000000..36c7791ee --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_glue_kendryte.c @@ -0,0 +1,224 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * 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. + */ + +#include +#include +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_dwc2_param.h" + +#include +#include "sysctl_rst.h" +#include "ioremap.h" +#include "mmu.h" +#include "cache.h" + +extern rt_mmu_info mmu_info; + +#if defined(ENABLE_CHERRY_USB) || defined(PKG_USING_CHERRYUSB) || defined(RT_USING_CHERRYUSB) +#define DEFAULT_USB_HCLK_FREQ_MHZ 200 + +uint32_t SystemCoreClock = (DEFAULT_USB_HCLK_FREQ_MHZ * 1000 * 1000); + +const uintptr_t usb_dev_addr[2] = { 0x91500000UL, 0x91540000UL }; + +#define USB_IDPULLUP0 (1 << 4) +#define USB_DMPULLDOWN0 (1 << 8) +#define USB_DPPULLDOWN0 (1 << 9) + +const struct dwc2_user_params param_common = { + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = (3016 - 16 - 256 * 8), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 512, // 1024 byte, double buffer + [2] = 256, // 1024 byte + [3] = 512, // 1024 byte, double buffer + [4] = 256, // 1024 byte + [5] = 256, // 1024 byte + [6] = 256, // 1024 byte + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 3016 - 128 * 2 - 256 * 2, + .host_nperio_tx_fifo_size = 128 * 2, // 512 byte, double buffer + .host_perio_tx_fifo_size = 256 * 2, // 1024 byte, double buffer + + .device_gccfg = 0, + .host_gccfg = 0 +}; + +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM +void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) +{ + memcpy(params, ¶m_common, sizeof(struct dwc2_user_params)); +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif +} +#endif + +// USB Host +#if defined(ENABLE_CHERRY_USB_HOST) || defined(PKG_CHERRYUSB_HOST) || defined(RT_CHERRYUSB_HOST) +static void usb_hc_interrupt_cb(int irq, void *arg_pv) +{ + USBH_IRQHandler((uint8_t)(uintptr_t)arg_pv); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + uint32_t *hs_reg; + uint32_t usb_ctl3; + + if ((uintptr_t)rt_hw_mmu_v2p(&mmu_info, (void *)bus->hcd.reg_base) == usb_dev_addr[0]) { + if (!sysctl_reset(SYSCTL_RESET_USB0)) { + USB_LOG_ERR("reset usb0 fail\n"); + } + + hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x7C), 0x1000); + usb_ctl3 = *hs_reg | USB_IDPULLUP0; + + *hs_reg = usb_ctl3 | (USB_DMPULLDOWN0 | USB_DPPULLDOWN0); + + rt_iounmap(hs_reg); + + rt_hw_interrupt_install(173, usb_hc_interrupt_cb, (void *)(uintptr_t)bus->hcd.hcd_id, "usbh0"); + rt_hw_interrupt_umask(173); + + } else { + if (!sysctl_reset(SYSCTL_RESET_USB1)) { + USB_LOG_ERR("reset usb1 fail\n"); + } + + hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x9C), 0x1000); + usb_ctl3 = *hs_reg | USB_IDPULLUP0; + + *hs_reg = usb_ctl3 | (USB_DMPULLDOWN0 | USB_DPPULLDOWN0); + + rt_iounmap(hs_reg); + + rt_hw_interrupt_install(174, usb_hc_interrupt_cb, (void *)(uintptr_t)bus->hcd.hcd_id, "usbh1"); + rt_hw_interrupt_umask(174); + } +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + if ((uintptr_t)rt_hw_mmu_v2p(&mmu_info, (void *)bus->hcd.reg_base) == usb_dev_addr[0]) { + rt_hw_interrupt_mask(173); + } else { + rt_hw_interrupt_mask(174); + } +} +#endif // ENABLE_CHERRY_USB_HOST + +// USB Device +#if defined(ENABLE_CHERRY_USB_DEVICE) || defined(PKG_CHERRYUSB_DEVICE) || defined(RT_CHERRYUSB_DEVICE) +static void usb_dc_interrupt_cb(int irq, void *arg_pv) +{ + USBD_IRQHandler((uint8_t)(uintptr_t)arg_pv); +} + +void usb_dc_low_level_init(uint8_t busid) +{ + if ((uintptr_t)rt_hw_mmu_v2p(&mmu_info, (void *)g_usbdev_bus[busid].reg_base) == usb_dev_addr[0]) { + if (!sysctl_reset(SYSCTL_RESET_USB0)) { + USB_LOG_ERR("reset usb0 fail\n"); + } + + uint32_t *hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x7C), 0x1000); + *hs_reg = 0x37; + rt_iounmap(hs_reg); + + rt_hw_interrupt_install(173, usb_dc_interrupt_cb, (void *)(uintptr_t)busid, "usbd0"); + rt_hw_interrupt_umask(173); + } else { + if (!sysctl_reset(SYSCTL_RESET_USB1)) { + USB_LOG_ERR("reset usb1 fail\n"); + } + + uint32_t *hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x9C), 0x1000); + *hs_reg = 0x37; + rt_iounmap(hs_reg); + + rt_hw_interrupt_install(174, usb_dc_interrupt_cb, (void *)(uintptr_t)busid, "usbd1"); + rt_hw_interrupt_umask(174); + } +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + if ((uintptr_t)rt_hw_mmu_v2p(&mmu_info, (void *)g_usbdev_bus[busid].reg_base) == usb_dev_addr[0]) { + rt_hw_interrupt_mask(173); + } else { + rt_hw_interrupt_mask(174); + } +} +#endif // ENABLE_CHERRY_USB_DEVICE + +void usbd_dwc2_delay_ms(uint8_t ms) +{ + rt_thread_mdelay(ms); +} + +#ifdef CONFIG_USB_DCACHE_ENABLE +void usb_dcache_clean(uintptr_t addr, size_t size) +{ + rt_hw_cpu_dcache_clean((void *)addr, size); +} + +void usb_dcache_invalidate(uintptr_t addr, size_t size) +{ + rt_hw_cpu_dcache_invalidate((void *)addr, size); +} + +void usb_dcache_flush(uintptr_t addr, size_t size) +{ + rt_hw_cpu_dcache_clean_flush((void *)addr, size); +} +#endif + +#endif // ENABLE_CHERRY_USB diff --git a/src/lib/CherryUSB/port/dwc2/usb_glue_nation.c b/src/lib/CherryUSB/port/dwc2/usb_glue_nation.c new file mode 100644 index 000000000..3e96b22f5 --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_glue_nation.c @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbh_core.h" + +__WEAK void USBD_IRQHandler(uint8_t busid) +{ +} + +__WEAK void USBH_IRQHandler(uint8_t busid) +{ +} + +#if defined(N32H473) || defined(N32H474) || defined(N32H475) || defined(N32H482) || defined(N32H487) +#include "n32h47x_48x_rcc.h" +#include "n32h47x_48x_gpio.h" +#include "n32h47x_48x_exti.h" +#include "misc.h" + +typedef void (*usb_dwc2_irq)(uint8_t busid); + +static usb_dwc2_irq g_usb_dwc2_irq; +static volatile uint8_t g_usb_dwc2_busid = 0; + +static void usbhs_common_init(void) +{ + RCC_EnableAHB1PeriphClk(RCC_AHB_PERIPHEN_GPIOA | RCC_AHB_PERIPHEN_GPIOB, ENABLE); + RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE); + /* PLL= 240MHz */ +#if (HSE_VALUE == 8000000) + /* Select PLL clock as USBHS clock source , clock 15 divisions = 16M */ + RCC_ConfigUSBPLLPresClk(RCC_USBPLLCLK_SRC_PLL, RCC_USBPLLCLK_DIV15); + + /* Select the corresponding bandwidth and frequency*/ + RCC_ConfigUSBHSBandwidth(RCC_USBHS_BW_16M); + + /* Select USBHS clock source frequency */ + RCC_ConfigUSBHSFrequency(RCC_USBHS_FREQ_16_OR_32M); + + /* Select PLL as USBHS clock */ + RCC_ConfigUSBHSClk(RCC_USBHS_CLKSRC_PLLPRES); +#else //HSE 16M + RCC_ConfigUSBHSBandwidth(RCC_USBHS_BW_16M); + RCC_ConfigUSBHSFrequency(RCC_USBHS_FREQ_16_OR_32M); + RCC_ConfigUSBHSClk(RCC_USBHS_CLKSRC_HSE); +#endif + /* Reset the USBHS phy clock*/ + RCC_EnableAHBPeriphReset(RCC_AHBPRST_USBHSPHYRST); + /* Enables the USBHS peripheral clock*/ + RCC_EnableAHBPeriphClk(RCC_AHB_PERIPHEN_USBHS, ENABLE); + + NVIC_InitType NVIC_InitStructure; + // EXTI_InitType EXTI_InitStructure; + + // NVIC_InitStructure.NVIC_IRQChannel = USB_HS_WKUP_IRQn; + // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; + // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + // NVIC_Init(&NVIC_InitStructure); + + NVIC_InitStructure.NVIC_IRQChannel = USB_HS_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + /* Configure the EXTI line 23 connected internally to the USBHS IP */ + // EXTI_ClrITPendBit(EXTI_LINE23); + // EXTI_InitStructure.EXTI_Line = EXTI_LINE23; + // EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + // EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + // EXTI_InitStructure.EXTI_LineCmd = ENABLE; + // EXTI_InitPeripheral(&EXTI_InitStructure); +} + +static void usbhs_gpio_init(void) +{ + GPIO_InitType GPIO_InitStructure; + + RCC_EnableAHB1PeriphClk(RCC_AHB_PERIPHEN_GPIOA | RCC_AHB_PERIPHEN_GPIOB | RCC_AHB_PERIPHEN_GPIOE, ENABLE); + RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE); + GPIO_ConfigPinRemap(0, 0, GPIO_RMP_SWJ_SWD); + + GPIO_InitStruct(&GPIO_InitStructure); +#ifdef USBHS_HOST + GPIO_InitStructure.Pin = GPIO_PIN_1; + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitPeripheral(GPIOE, &GPIO_InitStructure); + GPIO_ResetBits(GPIOE, GPIO_PIN_1); + + GPIO_InitStructure.Pin = GPIO_PIN_3; + GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure); + GPIO_ResetBits(GPIOB, GPIO_PIN_3); +#endif + // VBUS + // GPIO_InitStructure.Pin = GPIO_PIN_13; + // GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + // GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure); + + // // SOF + // GPIO_InitStructure.Pin = GPIO_PIN_4; + // GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP; + // GPIO_InitStructure.GPIO_Alternate = 8; // SOF + // GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure); + + // // ID + // GPIO_InitStructure.Pin = GPIO_PIN_12; + // GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP; + // GPIO_InitStructure.GPIO_Alternate = 14; // ID + // GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure); +} + +void usb_dc_low_level_init(uint8_t busid) +{ + g_usb_dwc2_irq = USBD_IRQHandler; + g_usb_dwc2_busid = busid; + + usbhs_common_init(); + + RCC->USBHSCTRL2 |= (uint32_t)0x01 << 19; + RCC->USBHSCTRL1 |= (uint32_t)0x01 << 31; +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + NVIC_InitType NVIC_InitStructure; + + NVIC_InitStructure.NVIC_IRQChannel = USB_HS_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; + NVIC_Init(&NVIC_InitStructure); + + RCC_EnableAHBPeriphReset(RCC_AHBPRST_USBHSPHYRST); + /* Enables the USBHS peripheral clock*/ + RCC_EnableAHBPeriphClk(RCC_AHB_PERIPHEN_USBHS, DISABLE); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + g_usb_dwc2_irq = USBH_IRQHandler; + g_usb_dwc2_busid = 0; + + usbhs_common_init(); + + RCC->USBHSCTRL2 &= ~(uint32_t)0x01 << 19; + RCC->USBHSCTRL1 |= (uint32_t)0x01 << 31; +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + NVIC_InitType NVIC_InitStructure; + + NVIC_InitStructure.NVIC_IRQChannel = USB_HS_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; + NVIC_Init(&NVIC_InitStructure); + + RCC_EnableAHBPeriphReset(RCC_AHBPRST_USBHSPHYRST); + /* Enables the USBHS peripheral clock*/ + RCC_EnableAHBPeriphClk(RCC_AHB_PERIPHEN_USBHS, DISABLE); +} + +uint32_t usbd_get_dwc2_gccfg_conf(uint32_t reg_base) +{ + return 0; +} + +uint32_t usbh_get_dwc2_gccfg_conf(uint32_t reg_base) +{ + return 0; +} + +void USB_HS_IRQHandler(void) +{ + g_usb_dwc2_irq(g_usb_dwc2_busid); +} + +extern uint32_t SystemCoreClock; + +void usbd_dwc2_delay_ms(uint8_t ms) +{ + uint32_t count = SystemCoreClock / 1000 * ms; + while (count--) { + __asm volatile("nop"); + } +} + +#endif diff --git a/src/lib/CherryUSB/port/dwc2/usb_glue_st.c b/src/lib/CherryUSB/port/dwc2/usb_glue_st.c new file mode 100644 index 000000000..94a17c4f4 --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_glue_st.c @@ -0,0 +1,751 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_dwc2_param.h" + +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM + +#if __has_include("stm32f1xx_hal.h") +#include "stm32f1xx_hal.h" + +const struct dwc2_user_params param_pa11_pa12 = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = false, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 0, + [5] = 0, + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS + .total_fifo_size = 320 // 1280 byte +}; + +const struct dwc2_user_params param_pb14_pb15 = { 0 }; // do not support +#if defined(HAL_HCD_MODULE_ENABLED) +#error "HAL_HCD_MODULE_ENABLED is not supported for STM32F1xx, please use HAL_PCD_MODULE_ENABLED" +#endif +#elif __has_include("stm32f2xx_hal.h") +#include "stm32f2xx_hal.h" + +const struct dwc2_user_params param_pa11_pa12 = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = false, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 0, + [5] = 0, + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS + .total_fifo_size = 320 // 1280 byte +}; + +const struct dwc2_user_params param_pb14_pb15 = { +#ifdef CONFIG_USB_HS + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#else + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#endif +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = (1012 - 16 - 256 - 128 - 128 - 128 - 128), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 256, // 1024 byte + [2] = 128, // 512 byte + [3] = 128, // 512 byte + [4] = 128, // 512 byte + [5] = 128, // 512 byte + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 628, + .host_nperio_tx_fifo_size = 128, // 512 byte + .host_perio_tx_fifo_size = 256, // 1024 byte + +#ifdef CONFIG_USB_HS + .device_gccfg = 0, + .host_gccfg = 0, +#else + .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS hs:0 + .host_gccfg = ((1 << 16) | (1 << 21)) // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS hs:0 +#endif +}; +#elif __has_include("stm32f4xx_hal.h") +#include "stm32f4xx_hal.h" + +const struct dwc2_user_params param_pa11_pa12 = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = false, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 0, + [5] = 0, + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + +#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || \ + defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || \ + defined(STM32F423xx) + .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN + .b_session_valid_override = true, +#else + .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS +#endif + .total_fifo_size = 320 // 1280 byte +}; + +const struct dwc2_user_params param_pb14_pb15 = { +#ifdef CONFIG_USB_HS + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#else + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#endif +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = (1006 - 16 - 256 - 128 - 128 - 128 - 128), // 1006/1012 + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 256, // 1024 byte + [2] = 128, // 512 byte + [3] = 128, // 512 byte + [4] = 128, // 512 byte + [5] = 128, // 512 byte + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 622, + .host_nperio_tx_fifo_size = 128, // 512 byte + .host_perio_tx_fifo_size = 256, // 1024 byte +#ifdef CONFIG_USB_HS + .device_gccfg = 0, + .host_gccfg = 0, +#else +#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || \ + defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || \ + defined(STM32F423xx) + .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN + .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN + .b_session_valid_override = true, +#else + .device_gccfg = ((1 << 16) | (1 << 21)), // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS hs:0 + .host_gccfg = ((1 << 16) | (1 << 21)) // fs: USB_OTG_GCCFG_PWRDWN | USB_OTG_GCCFG_NOVBUSSENS hs:0 +#endif +#endif +}; +#elif __has_include("stm32f7xx_hal.h") +#include "stm32f7xx_hal.h" + +const struct dwc2_user_params param_pa11_pa12 = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = false, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 0, + [5] = 0, + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN + .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN + + .b_session_valid_override = true, + .total_fifo_size = 320 // 1280 byte +}; + +const struct dwc2_user_params param_pb14_pb15 = { +#if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#else + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#endif +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = (1006 - 16 - 256 - 128 - 128 - 128 - 128), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 256, // 1024 byte + [2] = 128, // 512 byte + [3] = 128, // 512 byte + [4] = 128, // 512 byte + [5] = 128, // 512 byte + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 622, + .host_nperio_tx_fifo_size = 128, // 512 byte + .host_perio_tx_fifo_size = 256, // 1024 byte +#if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) + .device_gccfg = (1 << 23), // USB_OTG_GCCFG_PHYHSEN + .host_gccfg = (1 << 23), // USB_OTG_GCCFG_PHYHSEN +#else +#ifdef CONFIG_USB_HS + .device_gccfg = 0, + .host_gccfg = 0, +#else + .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0 + .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0 +#endif +#endif + .b_session_valid_override = true +}; +#elif __has_include("stm32h7xx_hal.h") +#include "stm32h7xx_hal.h" + +const struct dwc2_user_params param_pa11_pa12 = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, // DWC2_PHY_TYPE_PARAM_UTMI +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = (952 - 16 - 256 - 128 - 128 - 128 - 128), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 256, // 1024 byte + [2] = 128, // 512 byte + [3] = 128, // 512 byte + [4] = 128, // 512 byte + [5] = 128, // 512 byte + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 568, + .host_nperio_tx_fifo_size = 128, // 512 byte + .host_perio_tx_fifo_size = 256, // 1024 byte + + .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0 + .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0 + + .b_session_valid_override = true, + .total_fifo_size = 952 // 3808 byte +}; + +const struct dwc2_user_params param_pb14_pb15 = { +#ifdef CONFIG_USB_HS + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#else + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#endif +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = (952 - 16 - 256 - 128 - 128 - 128 - 128), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 256, // 1024 byte + [2] = 128, // 512 byte + [3] = 128, // 512 byte + [4] = 128, // 512 byte + [5] = 128, // 512 byte + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 568, + .host_nperio_tx_fifo_size = 128, // 512 byte + .host_perio_tx_fifo_size = 256, // 1024 byte + +#ifdef CONFIG_USB_HS + .device_gccfg = 0, + .host_gccfg = 0, +#else + .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0 + .host_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN hs:0 +#endif + .b_session_valid_override = true +}; +#elif __has_include("stm32h7rsxx_hal.h") +#include "stm32h7rsxx_hal.h" + +const struct dwc2_user_params param_pa11_pa12 = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = false, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 0, + [5] = 0, + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .device_gccfg = (1 << 16), // fs: USB_OTG_GCCFG_PWRDWN + .b_session_valid_override = true, + .total_fifo_size = 320 // 1280 byte +}; + +const struct dwc2_user_params param_pb14_pb15 = { + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = (952 - 16 - 256 - 128 - 128 - 128 - 128), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 256, // 1024 byte + [2] = 128, // 512 byte + [3] = 128, // 512 byte + [4] = 128, // 512 byte + [5] = 128, // 512 byte + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 568, + .host_nperio_tx_fifo_size = 128, // 512 byte + .host_perio_tx_fifo_size = 256, // 1024 byte + + .device_gccfg = ((1 << 23) | (1 << 24)), // hs: USB_OTG_GCCFG_VBVALEXTOEN | USB_OTG_GCCFG_VBVALOVAL + .host_gccfg = (1 << 25) // hs: USB_OTG_GCCFG_PULLDOWNEN +}; +#elif __has_include("stm32l4xx_hal.h") +#include "stm32l4xx_hal.h" + +const struct dwc2_user_params param_pa11_pa12 = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = false, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 0, + [5] = 0, + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .device_gccfg = (1 << 16), + .b_session_valid_override = true, + .total_fifo_size = 320 // 1280 byte +}; + +const struct dwc2_user_params param_pb14_pb15 = { 0 }; // do not support +#if defined(HAL_HCD_MODULE_ENABLED) +#error "HAL_HCD_MODULE_ENABLED is not supported for STM32L4xx, please use HAL_PCD_MODULE_ENABLED" +#endif +#elif __has_include("stm32u5xx_hal.h") +#include "stm32u5xx_hal.h" + +const struct dwc2_user_params param_pa11_pa12 = { + .phy_type = DWC2_PHY_TYPE_PARAM_FS, + .device_dma_enable = false, + .device_dma_desc_enable = false, + .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 16, // 64 byte + [2] = 16, // 64 byte + [3] = 16, // 64 byte + [4] = 0, + [5] = 0, + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .device_gccfg = (1 << 16), + .b_session_valid_override = true, + .total_fifo_size = 320 // 1280 byte +}; + +#if defined(STM32U595xx) || defined(STM32U5A5xx) || defined(STM32U599xx) || defined(STM32U5A9xx) || \ + defined(STM32U5F7xx) || defined(STM32U5G7xx) || defined(STM32U5F9xx) || defined(STM32U5G9xx) +const struct dwc2_user_params param_pb14_pb15 = { + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = (952 - 16 - 256 - 128 - 128 - 128 - 128), + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 256, // 1024 byte + [2] = 128, // 512 byte + [3] = 128, // 512 byte + [4] = 128, // 512 byte + [5] = 128, // 512 byte + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 568, + .host_nperio_tx_fifo_size = 128, // 512 byte + .host_perio_tx_fifo_size = 256, // 1024 byte + + .device_gccfg = ((1 << 23) | (1 << 24)), // hs: USB_OTG_GCCFG_VBVALEXTOEN | USB_OTG_GCCFG_VBVALOVAL + .host_gccfg = (1 << 25) // hs: USB_OTG_GCCFG_PULLDOWNEN +}; +#else +const struct dwc2_user_params param_pb14_pb15 = { 0 }; // do not support +#endif +#endif + +#endif // CONFIG_USB_DWC2_CUSTOM_PARAM + +#if !defined(HAL_HCD_MODULE_ENABLED) && !defined(HAL_PCD_MODULE_ENABLED) +#error please define HAL_HCD_MODULE_ENABLED or HAL_PCD_MODULE_ENABLED in stm32xxx_hal_conf.h +#endif + +typedef void (*usb_dwc2_irq)(uint8_t busid); + +struct dwc2_instance { + USB_OTG_GlobalTypeDef *Instance; +}; + +static usb_dwc2_irq g_usb_dwc2_irq[2]; +static uint8_t g_usb_dwc2_busid[2] = { 0, 0 }; +static struct dwc2_instance g_dwc2_instance; + +#if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) +/** + * @brief Enables control of a High Speed USB PHY + * Init the low level hardware : GPIO, CLOCK, NVIC... + * @param USBx Selected device + * @retval HAL status + */ +static int usb_hsphy_init(uint32_t hse_value) +{ + __IO uint32_t count = 0U; + + /* Enable LDO */ + USB_HS_PHYC->USB_HS_PHYC_LDO |= USB_HS_PHYC_LDO_ENABLE; + + /* wait for LDO Ready */ + while ((USB_HS_PHYC->USB_HS_PHYC_LDO & USB_HS_PHYC_LDO_STATUS) == 0U) { + count++; + + if (count > 200000U) { + return -1; + } + } + + /* Controls PHY frequency operation selection */ + if (hse_value == 12000000U) /* HSE = 12MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x0U << 1); + } else if (hse_value == 12500000U) /* HSE = 12.5MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x2U << 1); + } else if (hse_value == 16000000U) /* HSE = 16MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x3U << 1); + } else if (hse_value == 24000000U) /* HSE = 24MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x4U << 1); + } else if (hse_value == 25000000U) /* HSE = 25MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x5U << 1); + } else if (hse_value == 32000000U) /* HSE = 32MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x7U << 1); + } else { + /* ... */ + } + + /* Control the tuning interface of the High Speed PHY */ + USB_HS_PHYC->USB_HS_PHYC_TUNE |= USB_HS_PHYC_TUNE_VALUE; + + /* Enable PLL internal PHY */ + USB_HS_PHYC->USB_HS_PHYC_PLL |= USB_HS_PHYC_PLL_PLLEN; + + /* 2ms Delay required to get internal phy clock stable */ + HAL_Delay(2U); + + return 0; +} +#endif + +#ifdef HAL_PCD_MODULE_ENABLED +void usb_dc_low_level_init(uint8_t busid) +{ + if (g_usbdev_bus[busid].reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE + g_usb_dwc2_busid[1] = busid; + g_usb_dwc2_irq[1] = USBD_IRQHandler; + } else { + g_usb_dwc2_busid[0] = busid; + g_usb_dwc2_irq[0] = USBD_IRQHandler; + } + + g_dwc2_instance.Instance = (USB_OTG_GlobalTypeDef *)g_usbdev_bus[busid].reg_base; + HAL_PCD_MspInit((PCD_HandleTypeDef *)&g_dwc2_instance); + +#if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) + usb_hsphy_init(25000000U); +#endif +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + if (g_usbdev_bus[busid].reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE + g_usb_dwc2_busid[1] = 0; + g_usb_dwc2_irq[1] = NULL; + } else { + g_usb_dwc2_busid[0] = 0; + g_usb_dwc2_irq[0] = NULL; + } + + g_dwc2_instance.Instance = (USB_OTG_GlobalTypeDef *)g_usbdev_bus[busid].reg_base; + HAL_PCD_MspDeInit((PCD_HandleTypeDef *)&g_dwc2_instance); +} +#endif + +#ifdef HAL_HCD_MODULE_ENABLED +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + if (bus->hcd.reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE + g_usb_dwc2_busid[1] = bus->hcd.hcd_id; + g_usb_dwc2_irq[1] = USBH_IRQHandler; + } else { + g_usb_dwc2_busid[0] = bus->hcd.hcd_id; + g_usb_dwc2_irq[0] = USBH_IRQHandler; + } + + g_dwc2_instance.Instance = (USB_OTG_GlobalTypeDef *)bus->hcd.reg_base; + HAL_HCD_MspInit((HCD_HandleTypeDef *)&g_dwc2_instance); + +#if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) + usb_hsphy_init(25000000U); +#endif +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + if (bus->hcd.reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE + g_usb_dwc2_busid[1] = 0; + g_usb_dwc2_irq[1] = NULL; + } else { + g_usb_dwc2_busid[0] = 0; + g_usb_dwc2_irq[0] = NULL; + } + + g_dwc2_instance.Instance = (USB_OTG_GlobalTypeDef *)bus->hcd.reg_base; + HAL_HCD_MspDeInit((HCD_HandleTypeDef *)&g_dwc2_instance); +} +#endif + +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM +void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) +{ + if (reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE + memcpy(params, ¶m_pb14_pb15, sizeof(struct dwc2_user_params)); + } else { + memcpy(params, ¶m_pa11_pa12, sizeof(struct dwc2_user_params)); + } +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) + { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif +} +#endif + +extern uint32_t SystemCoreClock; + +void usbd_dwc2_delay_ms(uint8_t ms) +{ + uint32_t count = SystemCoreClock / 1000 * ms; + while (count--) { + __asm volatile("nop"); + } +} + +void OTG_FS_IRQHandler(void) +{ + g_usb_dwc2_irq[0](g_usb_dwc2_busid[0]); +} + +void OTG_HS_IRQHandler(void) +{ + g_usb_dwc2_irq[1](g_usb_dwc2_busid[1]); +} + +#ifdef CONFIG_USB_DCACHE_ENABLE +void usb_dcache_clean(uintptr_t addr, size_t size) +{ + SCB_CleanDCache_by_Addr((void *)addr, size); +} + +void usb_dcache_invalidate(uintptr_t addr, size_t size) +{ + SCB_InvalidateDCache_by_Addr((void *)addr, size); +} + +void usb_dcache_flush(uintptr_t addr, size_t size) +{ + SCB_CleanInvalidateDCache_by_Addr((void *)addr, size); +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/dwc2/usb_hc_dwc2.c b/src/lib/CherryUSB/port/dwc2/usb_hc_dwc2.c new file mode 100644 index 000000000..3a3fbae03 --- /dev/null +++ b/src/lib/CherryUSB/port/dwc2/usb_hc_dwc2.c @@ -0,0 +1,1503 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_hub.h" +#include "usb_dwc2_reg.h" +#include "usb_dwc2_param.h" + +#define USB_OTG_GLB ((DWC2_GlobalTypeDef *)(bus->hcd.reg_base)) +#define USB_OTG_PCGCCTL *(__IO uint32_t *)((uint32_t)bus->hcd.reg_base + USB_OTG_PCGCCTL_BASE) +#define USB_OTG_HPRT *(__IO uint32_t *)((uint32_t)bus->hcd.reg_base + USB_OTG_HOST_PORT_BASE) +#define USB_OTG_HOST ((DWC2_HostTypeDef *)(bus->hcd.reg_base + USB_OTG_HOST_BASE)) +#define USB_OTG_HC(i) ((DWC2_HostChannelTypeDef *)(bus->hcd.reg_base + USB_OTG_HOST_CHANNEL_BASE + ((i)*USB_OTG_HOST_CHANNEL_SIZE))) + +struct dwc2_chan { + uint8_t ep0_state; + uint16_t num_packets; + uint32_t xferlen; + uint8_t chidx; + bool inuse; + bool do_ssplit; + bool do_csplit; + uint8_t hub_addr; + uint8_t hub_port; + uint16_t ssplit_frame; + usb_osal_sem_t waitsem; + struct usbh_urb *urb; + uint32_t iso_frame_idx; +}; + +struct dwc2_hcd { + volatile bool port_csc; + volatile bool port_pec; + volatile bool port_occ; + struct dwc2_hw_params hw_params; + struct dwc2_user_params user_params; + struct dwc2_chan chan_pool[16]; +} g_dwc2_hcd[CONFIG_USBHOST_MAX_BUS]; + +#define DWC2_EP0_STATE_SETUP 0 +#define DWC2_EP0_STATE_INDATA 1 +#define DWC2_EP0_STATE_OUTDATA 2 +#define DWC2_EP0_STATE_INSTATUS 3 +#define DWC2_EP0_STATE_OUTSTATUS 4 + +static inline int dwc2_reset(struct usbh_bus *bus) +{ + volatile uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + /* Core Soft Reset */ + count = 0U; + USB_OTG_GLB->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; + + if (g_dwc2_hcd[bus->hcd.hcd_id].hw_params.snpsid < 0x4F54420AU) { + do { + if (++count > 200000U) { + USB_LOG_ERR("DWC2 reset timeout\r\n"); + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST); + } else { + do { + if (++count > 200000U) { + USB_LOG_ERR("DWC2 reset timeout\r\n"); + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_CSRSTDONE) != USB_OTG_GRSTCTL_CSRSTDONE); + + USB_OTG_GLB->GRSTCTL &= ~USB_OTG_GRSTCTL_CSRST; + USB_OTG_GLB->GRSTCTL |= USB_OTG_GRSTCTL_CSRSTDONE; + } + + return 0; +} + +static inline int dwc2_core_init(struct usbh_bus *bus) +{ + int ret; + uint32_t regval; + + if (g_dwc2_hcd[bus->hcd.hcd_id].user_params.phy_type == DWC2_PHY_TYPE_PARAM_FS) { + /* Select FS Embedded PHY */ + USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL; + } else { + regval = USB_OTG_GLB->GUSBCFG; + regval &= ~USB_OTG_GUSBCFG_PHYSEL; + /* disable external vbus source */ + regval &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); + /* disable ULPI FS/LS */ + regval &= ~(USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_ULPICSM); + + switch (g_dwc2_hcd[bus->hcd.hcd_id].user_params.phy_type) { + case DWC2_PHY_TYPE_PARAM_ULPI: + regval |= USB_OTG_GUSBCFG_ULPI_UTMI_SEL; + regval &= ~USB_OTG_GUSBCFG_PHYIF16; + regval &= ~USB_OTG_GUSBCFG_DDR_SEL; + + break; + case DWC2_PHY_TYPE_PARAM_UTMI: + regval &= ~USB_OTG_GUSBCFG_ULPI_UTMI_SEL; + regval &= ~USB_OTG_GUSBCFG_PHYIF16; + + if (g_dwc2_hcd[bus->hcd.hcd_id].user_params.phy_utmi_width == 16) { + regval |= USB_OTG_GUSBCFG_PHYIF16; + } + break; + + default: + break; + } + USB_OTG_GLB->GUSBCFG = regval; + } + + /* Reset after a PHY select */ + ret = dwc2_reset(bus); + return ret; +} + +static inline void dwc2_set_mode(struct usbh_bus *bus, uint8_t mode) +{ + USB_OTG_GLB->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD); + + if (mode == USB_OTG_MODE_HOST) { + USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD; + } else if (mode == USB_OTG_MODE_DEVICE) { + USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD; + } + + while (1) { + if ((USB_OTG_GLB->GINTSTS & 0x1U) == USB_OTG_MODE_HOST) { + break; + } + usb_osal_msleep(10); + } +} + +static inline int dwc2_flush_rxfifo(struct usbh_bus *bus) +{ + volatile uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + count = 0; + USB_OTG_GLB->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; + + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH); + + return 0; +} + +static inline int dwc2_flush_txfifo(struct usbh_bus *bus, uint32_t num) +{ + volatile uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + count = 0; + USB_OTG_GLB->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6)); + + do { + if (++count > 200000U) { + return -1; + } + } while ((USB_OTG_GLB->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH); + + return 0; +} + +static inline void dwc2_drivebus(struct usbh_bus *bus, uint8_t state) +{ + __IO uint32_t hprt0 = 0U; + + hprt0 = USB_OTG_HPRT; + + hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | + USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); + + if (((hprt0 & USB_OTG_HPRT_PPWR) == 0U) && (state == 1U)) { + USB_OTG_HPRT = (USB_OTG_HPRT_PPWR | hprt0); + } + if (((hprt0 & USB_OTG_HPRT_PPWR) == USB_OTG_HPRT_PPWR) && (state == 0U)) { + USB_OTG_HPRT = ((~USB_OTG_HPRT_PPWR) & hprt0); + } +} + +static inline uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + __IO uint32_t hprt0 = 0U; + uint8_t speed; + + hprt0 = USB_OTG_HPRT; + + speed = (hprt0 & USB_OTG_HPRT_PSPD) >> 17; + + if (speed == HPRT0_PRTSPD_HIGH_SPEED) { + return USB_SPEED_HIGH; + } else if (speed == HPRT0_PRTSPD_FULL_SPEED) { + return USB_SPEED_FULL; + } else if (speed == HPRT0_PRTSPD_LOW_SPEED) { + return USB_SPEED_LOW; + } else { + return USB_SPEED_UNKNOWN; + } +} + +static inline void dwc2_chan_char_init(struct usbh_bus *bus, + uint8_t ch_num, + uint8_t dev_addr, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_mps, + uint8_t ep_mult, + uint8_t speed) +{ + uint32_t regval; + + /* Program the HCCHAR register */ + regval = (((uint32_t)ep_mps << USB_OTG_HCCHAR_MPSIZ_Pos) & USB_OTG_HCCHAR_MPSIZ) | + ((((uint32_t)ep_addr & 0x7FU) << USB_OTG_HCCHAR_EPNUM_Pos) & USB_OTG_HCCHAR_EPNUM) | + (((uint32_t)ep_type << USB_OTG_HCCHAR_EPTYP_Pos) & USB_OTG_HCCHAR_EPTYP) | + (((uint32_t)ep_mult << USB_OTG_HCCHAR_MC_Pos) & USB_OTG_HCCHAR_MC) | + (((uint32_t)dev_addr << USB_OTG_HCCHAR_DAD_Pos) & USB_OTG_HCCHAR_DAD); + + if ((ep_addr & 0x80U) == 0x80U) { + regval |= USB_OTG_HCCHAR_EPDIR; + } + + /* LS device plugged to HUB */ + if ((speed == USB_SPEED_LOW) && (usbh_get_port_speed(bus, 0) != USB_SPEED_LOW)) { + regval |= USB_OTG_HCCHAR_LSDEV; + } + + if (ep_type == USB_ENDPOINT_TYPE_INTERRUPT) { + regval |= USB_OTG_HCCHAR_ODDFRM; + } + + USB_OTG_HC((uint32_t)ch_num)->HCCHAR = regval; +} + +static inline void dwc2_chan_splt_init(struct usbh_bus *bus, uint8_t ch_num) +{ + struct dwc2_chan *chan; + uint32_t hcsplt; + + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[ch_num]; + + if (chan->do_ssplit) { + hcsplt = USB_OTG_HCSPLT_SPLITEN; + hcsplt |= (chan->hub_addr << USB_OTG_HCSPLT_HUBADDR_Pos); + hcsplt |= chan->hub_port; + + if (chan->do_csplit) { + hcsplt |= USB_OTG_HCSPLT_COMPLSPLT; + } else { + hcsplt &= ~USB_OTG_HCSPLT_COMPLSPLT; + } + + USB_OTG_HC((uint32_t)ch_num)->HCSPLT = hcsplt; + } else { + USB_OTG_HC((uint32_t)ch_num)->HCSPLT = 0U; + } +} + +static void dwc2_chan_init(struct usbh_bus *bus, + uint8_t ch_num, + uint8_t dev_addr, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_mps, + uint8_t ep_mult, + uint8_t speed) +{ + /* Clear old interrupt conditions for this host channel. */ + USB_OTG_HC((uint32_t)ch_num)->HCINT = 0xFFFFFFFFU; + + /* Enable channel interrupts required for this transfer. */ + USB_OTG_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_CHHM; + + /* Enable the top level host channel interrupt. */ + USB_OTG_HOST->HAINTMSK |= 1UL << (ch_num & 0xFU); + + dwc2_chan_char_init(bus, ch_num, dev_addr, ep_addr, ep_type, ep_mps, ep_mult, speed); + dwc2_chan_splt_init(bus, ch_num); +} + +static inline void dwc2_chan_transfer(struct usbh_bus *bus, uint8_t ch_num, uint8_t ep_addr, uint8_t *buf, uint32_t size, uint16_t num_packets, uint8_t pid) +{ + __IO uint32_t tmpreg; + uint8_t is_oddframe; + + /* Initialize the HCTSIZn register */ + USB_OTG_HC(ch_num)->HCTSIZ = (size & USB_OTG_HCTSIZ_XFRSIZ) | + (((uint32_t)num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) | + (((uint32_t)pid << 29) & USB_OTG_HCTSIZ_DPID); + + /* xfer_buff MUST be 32-bits aligned */ + USB_OTG_HC(ch_num)->HCDMA = (uint32_t)buf; + + is_oddframe = (((uint32_t)USB_OTG_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U; + USB_OTG_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM; + USB_OTG_HC(ch_num)->HCCHAR |= (uint32_t)is_oddframe << 29; + + /* Set host channel enable */ + tmpreg = USB_OTG_HC(ch_num)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + tmpreg |= USB_OTG_HCCHAR_CHENA; + USB_OTG_HC(ch_num)->HCCHAR = tmpreg; +} + +static inline void dwc2_chan_enable_csplit(struct usbh_bus *bus, uint8_t ch_num, bool enable) +{ + if (enable) { + USB_OTG_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_COMPLSPLT; + } else { + USB_OTG_HC((uint32_t)ch_num)->HCSPLT &= ~USB_OTG_HCSPLT_COMPLSPLT; + } +} + +static inline void dwc2_chan_reenable(struct usbh_bus *bus, uint8_t ch_num) +{ + __IO uint32_t tmpreg; + uint8_t is_oddframe; + + is_oddframe = (((uint32_t)USB_OTG_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U; + USB_OTG_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM; + USB_OTG_HC(ch_num)->HCCHAR |= (uint32_t)is_oddframe << 29; + + /* Set host channel enable */ + tmpreg = USB_OTG_HC(ch_num)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + tmpreg |= USB_OTG_HCCHAR_CHENA; + USB_OTG_HC(ch_num)->HCCHAR = tmpreg; +} + +static void dwc2_halt(struct usbh_bus *bus, uint8_t ch_num) +{ + volatile uint32_t ChannelEna = (USB_OTG_HC(ch_num)->HCCHAR & USB_OTG_HCCHAR_CHENA) >> 31; + volatile uint32_t count = 0U; + volatile uint32_t value; + + if (((USB_OTG_GLB->GAHBCFG & USB_OTG_GAHBCFG_DMAEN) == USB_OTG_GAHBCFG_DMAEN) && + (ChannelEna == 0U)) { + return; + } + + USB_OTG_HC(ch_num)->HCINTMSK = 0; + + value = USB_OTG_HC(ch_num)->HCCHAR; + value |= USB_OTG_HCCHAR_CHDIS; + value |= USB_OTG_HCCHAR_CHENA; + USB_OTG_HC(ch_num)->HCCHAR = value; + do { + if (++count > 200000U) { + break; + } + } while (USB_OTG_HC(ch_num)->HCCHAR & USB_OTG_HCCHAR_CHENA); + + USB_OTG_HC(ch_num)->HCINT = USB_OTG_HC(ch_num)->HCINT; +} + +static int usbh_reset_port(struct usbh_bus *bus, const uint8_t port) +{ + __IO uint32_t hprt0 = 0U; + volatile uint32_t timeout = 0; + + hprt0 = USB_OTG_HPRT; + + hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | + USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); + + USB_OTG_HPRT = (USB_OTG_HPRT_PRST | hprt0); + usb_osal_msleep(100U); + USB_OTG_HPRT = ((~USB_OTG_HPRT_PRST) & hprt0); + usb_osal_msleep(10U); + + while (!(USB_OTG_HPRT & USB_OTG_HPRT_PENA)) { + if (!(USB_OTG_HPRT & USB_OTG_HPRT_PCSTS)) { + return -USB_ERR_NOTCONN; /* Port not connected */ + } + timeout++; + if (timeout > 10) { + USB_LOG_ERR("Reset port timeout\r\n"); + return -USB_ERR_TIMEOUT; + } + usb_osal_msleep(10U); + } + return 0; +} + +/** + * @brief dwc2_get_glb_intstatus: return the global USB interrupt status + * @retval status + */ +static inline uint32_t dwc2_get_glb_intstatus(struct usbh_bus *bus) +{ + uint32_t tmpreg; + + tmpreg = USB_OTG_GLB->GINTSTS; + tmpreg &= USB_OTG_GLB->GINTMSK; + + return tmpreg; +} + +static inline uint16_t dwc2_get_full_frame_num(struct usbh_bus *bus) +{ + uint16_t frame = usbh_get_frame_number(bus); + + /* USB_OTG_HFNUM_FRNUM_Msk is 0xFFFF but max frame num is 0x3FFF */ + return ((frame & 0x3FFF) >> 3); +} + +/** + * dwc2_calc_frame_interval() - Calculates the correct frame Interval value for + * the HFIR register according to PHY type and speed + * + * NOTE: The caller can modify the value of the HFIR register only after the + * Port Enable bit of the Host Port Control and Status register (HPRT.EnaPort) + * has been set + */ +uint32_t dwc2_calc_frame_interval(struct usbh_bus *bus) +{ + uint32_t usbcfg; + uint32_t hprt0; + int clock = 60; /* default value */ + + usbcfg = USB_OTG_GLB->GUSBCFG; + hprt0 = USB_OTG_HPRT; + + if (!(usbcfg & USB_OTG_GUSBCFG_PHYSEL) && (usbcfg & USB_OTG_GUSBCFG_ULPI_UTMI_SEL) && + !(usbcfg & USB_OTG_GUSBCFG_PHYIF16)) + clock = 60; + if ((usbcfg & USB_OTG_GUSBCFG_PHYSEL) && g_dwc2_hcd[bus->hcd.hcd_id].hw_params.fs_phy_type == + GHWCFG2_FS_PHY_TYPE_SHARED_ULPI) + clock = 48; + if (!(usbcfg & USB_OTG_GUSBCFG_PHYLPCS) && !(usbcfg & USB_OTG_GUSBCFG_PHYSEL) && + !(usbcfg & USB_OTG_GUSBCFG_ULPI_UTMI_SEL) && (usbcfg & USB_OTG_GUSBCFG_PHYIF16)) + clock = 30; + if (!(usbcfg & USB_OTG_GUSBCFG_PHYLPCS) && !(usbcfg & USB_OTG_GUSBCFG_PHYSEL) && + !(usbcfg & USB_OTG_GUSBCFG_ULPI_UTMI_SEL) && !(usbcfg & USB_OTG_GUSBCFG_PHYIF16)) + clock = 60; + if ((usbcfg & USB_OTG_GUSBCFG_PHYLPCS) && !(usbcfg & USB_OTG_GUSBCFG_PHYSEL) && + !(usbcfg & USB_OTG_GUSBCFG_ULPI_UTMI_SEL) && (usbcfg & USB_OTG_GUSBCFG_PHYIF16)) + clock = 48; + if ((usbcfg & USB_OTG_GUSBCFG_PHYSEL) && !(usbcfg & USB_OTG_GUSBCFG_PHYIF16) && + g_dwc2_hcd[bus->hcd.hcd_id].hw_params.fs_phy_type == GHWCFG2_FS_PHY_TYPE_SHARED_UTMI) + clock = 48; + if ((usbcfg & USB_OTG_GUSBCFG_PHYSEL) && + g_dwc2_hcd[bus->hcd.hcd_id].hw_params.fs_phy_type == GHWCFG2_FS_PHY_TYPE_DEDICATED) + clock = 48; + + if ((hprt0 & USB_OTG_HPRT_PSPD) >> USB_OTG_HPRT_PSPD_Pos == HPRT0_PRTSPD_HIGH_SPEED) + /* High speed case */ + return 125 * clock - 1; + + /* FS/LS case */ + return 1000 * clock - 1; +} + +static int dwc2_chan_alloc(struct usbh_bus *bus) +{ + size_t flags; + int chidx; + + flags = usb_osal_enter_critical_section(); + for (chidx = 0; chidx < g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels; chidx++) { + if (!g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].inuse) { + g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].inuse = true; + usb_osal_leave_critical_section(flags); + + g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].do_ssplit = 0; + g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].do_csplit = 0; + return chidx; + } + } + usb_osal_leave_critical_section(flags); + return -1; +} + +static void dwc2_chan_free(struct dwc2_chan *chan) +{ + size_t flags; + + flags = usb_osal_enter_critical_section(); + if (chan->urb) { + chan->urb->hcpriv = NULL; + chan->urb = NULL; + } + chan->inuse = false; + usb_osal_leave_critical_section(flags); +} + +static uint16_t dwc2_calculate_packet_num(uint32_t input_size, uint8_t ep_addr, uint16_t ep_mps, uint32_t *output_size) +{ + uint16_t num_packets; + + num_packets = (uint16_t)((input_size + ep_mps - 1U) / ep_mps); + + if (num_packets > 0x3FF) { + num_packets = 0x3FF; // pktcnt 10bits + } + + if (input_size == 0) { + num_packets = 1; + } + + if (ep_addr & 0x80) { + input_size = num_packets * ep_mps; + } else { + } + + *output_size = input_size; + return num_packets; +} + +static void dwc2_control_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) +{ + struct dwc2_chan *chan; + uint32_t datalen; + uint8_t data_pid; + + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx]; + + /* split buflen with ep mps */ + if (chan->do_ssplit && (chan->ep0_state == DWC2_EP0_STATE_INDATA || chan->ep0_state == DWC2_EP0_STATE_OUTDATA)) { + if (buflen > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + datalen = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + } else { + datalen = buflen; + } + + if (urb->data_toggle == 0) { + data_pid = HC_PID_DATA0; + } else { + data_pid = HC_PID_DATA1; + } + } else { + datalen = buflen; // buflen = setup->wLength + data_pid = HC_PID_DATA1; + } + + if (chan->ep0_state == DWC2_EP0_STATE_SETUP) /* fill setup */ + { + chan->num_packets = dwc2_calculate_packet_num(8, 0x00, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); + dwc2_chan_init(bus, + chidx, + urb->hport->dev_addr, + 0x00, + USB_ENDPOINT_TYPE_CONTROL, + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), + 1, + urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x00, (uint8_t *)setup, chan->xferlen, chan->num_packets, HC_PID_SETUP); + } else if (chan->ep0_state == DWC2_EP0_STATE_INDATA) /* fill in data */ + { + chan->num_packets = dwc2_calculate_packet_num(datalen, 0x80, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); + dwc2_chan_init(bus, + chidx, + urb->hport->dev_addr, + 0x80, + USB_ENDPOINT_TYPE_CONTROL, + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), + 1, + urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x80, buffer, chan->xferlen, chan->num_packets, data_pid); + } else if (chan->ep0_state == DWC2_EP0_STATE_OUTDATA) /* fill out data */ + { + chan->num_packets = dwc2_calculate_packet_num(datalen, 0x00, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); + dwc2_chan_init(bus, + chidx, + urb->hport->dev_addr, + 0x00, + USB_ENDPOINT_TYPE_CONTROL, + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), + 1, + urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x00, buffer, chan->xferlen, chan->num_packets, data_pid); + } else if (chan->ep0_state == DWC2_EP0_STATE_INSTATUS) /* fill in status */ + { + chan->num_packets = dwc2_calculate_packet_num(0, 0x80, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); + dwc2_chan_init(bus, + chidx, + urb->hport->dev_addr, + 0x80, + USB_ENDPOINT_TYPE_CONTROL, + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), + 1, + urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x80, NULL, chan->xferlen, chan->num_packets, HC_PID_DATA1); + } else if (chan->ep0_state == DWC2_EP0_STATE_OUTSTATUS) /* fill out status */ + { + chan->num_packets = dwc2_calculate_packet_num(0, 0x00, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); + dwc2_chan_init(bus, + chidx, + urb->hport->dev_addr, + 0x00, + USB_ENDPOINT_TYPE_CONTROL, + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), + 1, + urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x00, NULL, chan->xferlen, chan->num_packets, HC_PID_DATA1); + } +} + +static void dwc2_bulk_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +{ + struct dwc2_chan *chan; + uint32_t datalen; + + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx]; + + if (chan->do_ssplit) { + if (buflen > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + datalen = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + } else { + datalen = buflen; + } + } else { + datalen = buflen; + } + + chan->num_packets = dwc2_calculate_packet_num(datalen, urb->ep->bEndpointAddress, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); + dwc2_chan_init(bus, + chidx, + urb->hport->dev_addr, + urb->ep->bEndpointAddress, + USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes), + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), + USB_GET_MULT(urb->ep->wMaxPacketSize) + 1, + urb->hport->speed); + dwc2_chan_transfer(bus, chidx, urb->ep->bEndpointAddress, buffer, chan->xferlen, chan->num_packets, urb->data_toggle == 0 ? HC_PID_DATA0 : HC_PID_DATA1); +} + +#if 0 +static void dwc2_iso_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, struct usbh_iso_frame_packet *iso_packet) +{ + struct dwc2_chan *chan; + + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx]; + + chan->num_packets = dwc2_calculate_packet_num(iso_packet->transfer_buffer_length, urb->ep->bEndpointAddress, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); + dwc2_chan_init(bus, chidx, urb->hport->dev_addr, urb->ep->bEndpointAddress, USB_ENDPOINT_TYPE_ISOCHRONOUS, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); + dwc2_chan_transfer(bus, chidx, urb->ep->bEndpointAddress, iso_packet->transfer_buffer, chan->xferlen, chan->num_packets, HC_PID_DATA0); +} +#endif + +__WEAK void usb_hc_low_level_init(struct usbh_bus *bus) +{ + (void)bus; +} + +__WEAK void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + (void)bus; +} + +int usb_hc_init(struct usbh_bus *bus) +{ + int ret; + + memset(&g_dwc2_hcd[bus->hcd.hcd_id], 0, sizeof(struct dwc2_hcd)); + + usb_hc_low_level_init(bus); + + USB_LOG_INFO("========== dwc2 hcd params ==========\r\n"); + USB_LOG_INFO("CID:%08x\r\n", (unsigned int)USB_OTG_GLB->CID); + USB_LOG_INFO("GSNPSID:%08x\r\n", (unsigned int)USB_OTG_GLB->GSNPSID); + USB_LOG_INFO("GHWCFG1:%08x\r\n", (unsigned int)USB_OTG_GLB->GHWCFG1); + USB_LOG_INFO("GHWCFG2:%08x\r\n", (unsigned int)USB_OTG_GLB->GHWCFG2); + USB_LOG_INFO("GHWCFG3:%08x\r\n", (unsigned int)USB_OTG_GLB->GHWCFG3); + USB_LOG_INFO("GHWCFG4:%08x\r\n", (unsigned int)USB_OTG_GLB->GHWCFG4); + + dwc2_get_hwparams(bus->hcd.reg_base, &g_dwc2_hcd[bus->hcd.hcd_id].hw_params); + dwc2_get_user_params(bus->hcd.reg_base, &g_dwc2_hcd[bus->hcd.hcd_id].user_params); + + if (g_dwc2_hcd[bus->hcd.hcd_id].user_params.phy_utmi_width == 0) { + g_dwc2_hcd[bus->hcd.hcd_id].user_params.phy_utmi_width = 8; + } + if (g_dwc2_hcd[bus->hcd.hcd_id].user_params.total_fifo_size == 0) { + g_dwc2_hcd[bus->hcd.hcd_id].user_params.total_fifo_size = g_dwc2_hcd[bus->hcd.hcd_id].hw_params.total_fifo_size; + } + + for (uint8_t chidx = 0; chidx < g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels; chidx++) { + g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].waitsem = usb_osal_sem_create(0); + } + + USB_LOG_INFO("dwc2 has %d channels and dfifo depth(32-bit words) is %d\r\n", + g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels, + g_dwc2_hcd[bus->hcd.hcd_id].user_params.total_fifo_size); + + USB_ASSERT_MSG(g_dwc2_hcd[bus->hcd.hcd_id].hw_params.arch == GHWCFG2_INT_DMA_ARCH, "This dwc2 version does not support dma mode, so stop working"); + USB_ASSERT_MSG((g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size + + g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_nperio_tx_fifo_size + + g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_perio_tx_fifo_size) <= + g_dwc2_hcd[bus->hcd.hcd_id].user_params.total_fifo_size, + "Your fifo config is overflow, please check"); + + USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; + + /* This is vendor register */ + USB_OTG_GLB->GCCFG = g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_gccfg; + + if (g_dwc2_hcd[bus->hcd.hcd_id].user_params.phy_type != DWC2_PHY_TYPE_PARAM_FS) { + USB_ASSERT_MSG(g_dwc2_hcd[bus->hcd.hcd_id].hw_params.hs_phy_type != 0, "This dwc2 version does not support hs, so stop working"); + } + + ret = dwc2_core_init(bus); + + /* Force Host Mode*/ + dwc2_set_mode(bus, USB_OTG_MODE_HOST); + + /* B-peripheral session valid override enable */ + USB_OTG_GLB->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOEN; + USB_OTG_GLB->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOVAL; + + USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_TOCAL; + + /* Restart the Phy Clock */ + USB_OTG_PCGCCTL = 0U; + + /* Set default Max speed support */ + USB_OTG_HOST->HCFG &= ~USB_OTG_HCFG_FSLSS; + + USB_OTG_HOST->HCFG &= ~USB_OTG_HCFG_FSLSPCS; + if (g_dwc2_hcd[bus->hcd.hcd_id].user_params.phy_type == DWC2_PHY_TYPE_PARAM_FS) { + USB_OTG_HOST->HCFG |= USB_OTG_HCFG_FSLSPCLKSEL_48_MHZ; + } else { + USB_OTG_HOST->HCFG |= USB_OTG_HCFG_FSLSPCLKSEL_30_60_MHZ; + } + + if (g_dwc2_hcd[bus->hcd.hcd_id].hw_params.snpsid > 0x4F54292AU) { + USB_OTG_HOST->HCFG |= USB_OTG_HFIR_RELOAD_CTRL; + } + + /* Clear all pending HC Interrupts */ + for (uint8_t i = 0U; i < g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels; i++) { + USB_OTG_HC(i)->HCINT = 0xFFFFFFFFU; + USB_OTG_HC(i)->HCINTMSK = 0U; + } + + /* Disable all interrupts. */ + USB_OTG_GLB->GINTMSK = 0U; + + /* Clear any pending interrupts */ + USB_OTG_GLB->GINTSTS = 0xFFFFFFFFU; + + /* set Rx FIFO size */ + USB_OTG_GLB->GRXFSIZ = g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size; + USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_nperio_tx_fifo_size << 16) & USB_OTG_NPTXFD) | + g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size); + USB_OTG_GLB->HPTXFSIZ = (uint32_t)(((g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_perio_tx_fifo_size << 16) & USB_OTG_HPTXFSIZ_PTXFD) | + (g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size + g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_nperio_tx_fifo_size)); + + ret = dwc2_flush_txfifo(bus, 0x10U); + ret = dwc2_flush_rxfifo(bus); + + USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_HBSTLEN; + USB_OTG_GLB->GAHBCFG |= USB_OTG_GAHBCFG_HBSTLEN_4; + USB_OTG_GLB->GAHBCFG |= USB_OTG_GAHBCFG_DMAEN; + + /* Enable interrupts matching to the Host mode ONLY */ + USB_OTG_GLB->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM | + USB_OTG_GINTSTS_DISCINT); + + dwc2_drivebus(bus, 1); + usb_osal_msleep(200); + + USB_OTG_GLB->GAHBCFG |= USB_OTG_GAHBCFG_GINT; + + return ret; +} + +int usb_hc_deinit(struct usbh_bus *bus) +{ + USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; + + dwc2_flush_txfifo(bus, 0x10U); + dwc2_flush_rxfifo(bus); + + /* Flush out any leftover queued requests. */ + for (uint8_t chidx = 0; chidx < g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels; chidx++) { + dwc2_halt(bus, chidx); + } + + /* Disable all interrupts. */ + USB_OTG_GLB->GINTMSK = 0U; + + /* Clear any pending Host interrupts */ + USB_OTG_HOST->HAINT = 0xFFFFFFFFU; + USB_OTG_GLB->GINTSTS = 0xFFFFFFFFU; + + dwc2_drivebus(bus, 0); + usb_osal_msleep(200); + + for (uint8_t chidx = 0; chidx < g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels; chidx++) { + usb_osal_sem_delete(g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].waitsem); + } + + usb_hc_low_level_deinit(bus); + return 0; +} + +uint16_t usbh_get_frame_number(struct usbh_bus *bus) +{ + return (USB_OTG_HOST->HFNUM & USB_OTG_HFNUM_FRNUM); +} + +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) +{ + __IO uint32_t hprt0; + uint8_t nports; + uint8_t port; + uint32_t status; + + nports = CONFIG_USBHOST_MAX_RHPORTS; + port = setup->wIndex; + if (setup->bmRequestType & USB_REQUEST_RECIPIENT_DEVICE) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_SET_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_GET_DESCRIPTOR: + break; + case HUB_REQUEST_GET_STATUS: + memset(buf, 0, 4); + break; + default: + break; + } + } else if (setup->bmRequestType & USB_REQUEST_RECIPIENT_OTHER) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_ENABLE: + USB_OTG_HPRT &= ~USB_OTG_HPRT_PENA; + break; + case HUB_PORT_FEATURE_SUSPEND: + case HUB_PORT_FEATURE_C_SUSPEND: + break; + case HUB_PORT_FEATURE_POWER: + dwc2_drivebus(bus, 0); + break; + case HUB_PORT_FEATURE_C_CONNECTION: + g_dwc2_hcd[bus->hcd.hcd_id].port_csc = 0; + break; + case HUB_PORT_FEATURE_C_ENABLE: + g_dwc2_hcd[bus->hcd.hcd_id].port_pec = 0; + break; + case HUB_PORT_FEATURE_C_OVER_CURREN: + g_dwc2_hcd[bus->hcd.hcd_id].port_occ = 0; + break; + case HUB_PORT_FEATURE_C_RESET: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_SET_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_SUSPEND: + break; + case HUB_PORT_FEATURE_POWER: + dwc2_drivebus(bus, 1); + break; + case HUB_PORT_FEATURE_RESET: + return usbh_reset_port(bus, port); + + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_GET_STATUS: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + hprt0 = USB_OTG_HPRT; + + status = 0; + if (g_dwc2_hcd[bus->hcd.hcd_id].port_csc) { + status |= (1 << HUB_PORT_FEATURE_C_CONNECTION); + } + if (g_dwc2_hcd[bus->hcd.hcd_id].port_pec) { + status |= (1 << HUB_PORT_FEATURE_C_ENABLE); + } + if (g_dwc2_hcd[bus->hcd.hcd_id].port_occ) { + status |= (1 << HUB_PORT_FEATURE_C_OVER_CURREN); + } + + if (hprt0 & USB_OTG_HPRT_PCSTS) { + status |= (1 << HUB_PORT_FEATURE_CONNECTION); + } + if (hprt0 & USB_OTG_HPRT_PENA) { + status |= (1 << HUB_PORT_FEATURE_ENABLE); + if (usbh_get_port_speed(bus, port) == USB_SPEED_LOW) { + status |= (1 << HUB_PORT_FEATURE_LOWSPEED); + } else if (usbh_get_port_speed(bus, port) == USB_SPEED_HIGH) { + status |= (1 << HUB_PORT_FEATURE_HIGHSPEED); + } + } + if (hprt0 & USB_OTG_HPRT_POCA) { + status |= (1 << HUB_PORT_FEATURE_OVERCURRENT); + } + if (hprt0 & USB_OTG_HPRT_PRST) { + status |= (1 << HUB_PORT_FEATURE_RESET); + } + if (hprt0 & USB_OTG_HPRT_PPWR) { + status |= (1 << HUB_PORT_FEATURE_POWER); + } + + memcpy(buf, &status, 4); + break; + default: + break; + } + } + return 0; +} + +int usbh_submit_urb(struct usbh_urb *urb) +{ + struct dwc2_chan *chan; + struct usbh_bus *bus; + size_t flags; + int ret = 0; + int chidx; + + if (!urb || !urb->hport || !urb->ep || !urb->hport->bus) { + return -USB_ERR_INVAL; + } + + /* dma addr must be aligned 4 bytes */ + USB_ASSERT_MSG(!((uintptr_t)urb->setup % 4) && !((uintptr_t)urb->transfer_buffer % 4), + "urb->setup or urb->transfer_buffer is not aligned 4 bytes"); + +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)urb->setup % CONFIG_USB_ALIGN_SIZE) && + !((uintptr_t)urb->transfer_buffer % CONFIG_USB_ALIGN_SIZE), + "urb->setup or urb->transfer_buffer is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + bus = urb->hport->bus; + + if (!(USB_OTG_HPRT & USB_OTG_HPRT_PCSTS) || !urb->hport->connected) { + return -USB_ERR_NOTCONN; + } + + if (urb->errorcode == -USB_ERR_BUSY) { + return -USB_ERR_BUSY; + } + + if (urb->ep->bEndpointAddress & 0x80) { + /* Check if pipe rx fifo is overflow */ + if (USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize) > (g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size * 4)) { + return -USB_ERR_RANGE; + } + } else { + /* Check if intr and iso pipe tx fifo is overflow */ + if (((USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_ISOCHRONOUS) || + (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT)) && + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize) > (g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_perio_tx_fifo_size * 4)) { + return -USB_ERR_RANGE; + } else { + /* Check if control and bulk pipe tx fifo is overflow */ + if (USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize) > (g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_nperio_tx_fifo_size * 4)) { + return -USB_ERR_RANGE; + } + } + } + + chidx = dwc2_chan_alloc(bus); + if (chidx == -1) { + return -USB_ERR_NOMEM; + } + + flags = usb_osal_enter_critical_section(); + + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx]; + chan->chidx = chidx; + chan->urb = urb; + chan->do_ssplit = 0; + + if (urb->hport->speed != USB_SPEED_HIGH && + usbh_get_port_speed(bus, 0) == USB_SPEED_HIGH) { + chan->do_ssplit = 1; + chan->do_csplit = 0; + chan->hub_port = urb->hport->port; + chan->hub_addr = urb->hport->parent->hub_addr; + } + + urb->hcpriv = chan; + urb->errorcode = -USB_ERR_BUSY; + urb->actual_length = 0; + + usb_osal_leave_critical_section(flags); + + if (urb->setup) { + usb_dcache_clean((uintptr_t)urb->setup, USB_ALIGN_UP(sizeof(struct usb_setup_packet), CONFIG_USB_ALIGN_SIZE)); + + if (urb->transfer_buffer) { + if (urb->setup->bmRequestType & 0x80) { + usb_dcache_invalidate((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->transfer_buffer_length, CONFIG_USB_ALIGN_SIZE)); + } else { + usb_dcache_clean((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->transfer_buffer_length, CONFIG_USB_ALIGN_SIZE)); + } + } + } else if (urb->transfer_buffer && (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS)) { + if (urb->ep->bEndpointAddress & 0x80) { + usb_dcache_invalidate((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->transfer_buffer_length, CONFIG_USB_ALIGN_SIZE)); + } else { + usb_dcache_clean((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->transfer_buffer_length, CONFIG_USB_ALIGN_SIZE)); + } + } else { + } + + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + chan->ep0_state = DWC2_EP0_STATE_SETUP; + dwc2_control_urb_init(bus, chidx, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + break; + case USB_ENDPOINT_TYPE_BULK: + case USB_ENDPOINT_TYPE_INTERRUPT: + dwc2_bulk_intr_urb_init(bus, chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); + break; + case USB_ENDPOINT_TYPE_ISOCHRONOUS: + break; + default: + break; + } + + if (urb->timeout > 0) { + /* wait until timeout or sem give */ + ret = usb_osal_sem_take(chan->waitsem, urb->timeout); + if (ret < 0) { + goto errout_timeout; + } + urb->timeout = 0; + ret = urb->errorcode; + /* we can free chan when waitsem is done */ + dwc2_chan_free(chan); + } + return ret; +errout_timeout: + urb->timeout = 0; + usbh_kill_urb(urb); + return ret; +} + +int usbh_kill_urb(struct usbh_urb *urb) +{ + struct dwc2_chan *chan; + struct usbh_bus *bus; + size_t flags; + + if (!urb || !urb->hcpriv || !urb->hport->bus) { + return -USB_ERR_INVAL; + } + + bus = urb->hport->bus; + + flags = usb_osal_enter_critical_section(); + + chan = (struct dwc2_chan *)urb->hcpriv; + + dwc2_halt(bus, chan->chidx); + + urb->errorcode = -USB_ERR_SHUTDOWN; + + if (urb->timeout) { + usb_osal_sem_give(chan->waitsem); + } else { + dwc2_chan_free(chan); + } + + if (urb->complete) { + urb->complete(urb->arg, urb->errorcode); + } + + usb_osal_leave_critical_section(flags); + + return 0; +} + +static inline void dwc2_urb_waitup(struct usbh_urb *urb) +{ + struct dwc2_chan *chan; + + chan = (struct dwc2_chan *)urb->hcpriv; + + if (urb->timeout) { + usb_osal_sem_give(chan->waitsem); + } else { + dwc2_chan_free(chan); + } + + if (urb->complete) { + if (urb->errorcode < 0) { + urb->complete(urb->arg, urb->errorcode); + } else { + urb->complete(urb->arg, urb->actual_length); + } + } +} + +static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) +{ + uint32_t chan_intstatus; + struct dwc2_chan *chan; + struct usbh_urb *urb; + + chan_intstatus = USB_OTG_HC(ch_num)->HCINT; + + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[ch_num]; + urb = chan->urb; + //printf("s1:%08x\r\n", chan_intstatus); + + if (chan_intstatus & USB_OTG_HCINT_CHH) { + USB_OTG_HC(ch_num)->HCINT = chan_intstatus; + if (chan_intstatus & USB_OTG_HCINT_XFRC) { + uint32_t count = chan->xferlen - (USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ); /* how many size has received */ + uint8_t data_toggle = ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_DPID) >> USB_OTG_HCTSIZ_DPID_Pos); + + urb->actual_length += count; + urb->transfer_buffer_length -= count; + + if (data_toggle == HC_PID_DATA0) { + urb->data_toggle = 0; + } else { + urb->data_toggle = 1; + } + + if (chan->do_csplit) { + chan->do_csplit = 0; + dwc2_chan_enable_csplit(bus, ch_num, false); + } + + if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) { + if (chan->ep0_state == DWC2_EP0_STATE_INDATA) { + if (chan->do_ssplit && urb->transfer_buffer_length > 0 && (count == USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize))) { + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length); + } else { + chan->ep0_state = DWC2_EP0_STATE_OUTSTATUS; + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + } + } else if (chan->ep0_state == DWC2_EP0_STATE_INSTATUS) { + chan->ep0_state = DWC2_EP0_STATE_SETUP; + urb->errorcode = 0; + dwc2_urb_waitup(urb); + } + } else if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + } else { + if (chan->do_ssplit && urb->transfer_buffer_length > 0 && (count == USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize))) { + dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length); + } else { + usb_dcache_invalidate((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->actual_length, CONFIG_USB_ALIGN_SIZE)); + urb->errorcode = 0; + dwc2_urb_waitup(urb); + } + } + } else if (chan_intstatus & USB_OTG_HCINT_AHBERR) { + urb->errorcode = -USB_ERR_IO; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_STALL) { + urb->errorcode = -USB_ERR_STALL; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_NAK) { + if (chan->do_ssplit) { + /* restart ssplit transfer */ + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + case USB_ENDPOINT_TYPE_BULK: + chan->do_csplit = 0; + dwc2_chan_enable_csplit(bus, ch_num, false); + dwc2_chan_reenable(bus, ch_num); + break; + case USB_ENDPOINT_TYPE_INTERRUPT: + dwc2_chan_enable_csplit(bus, ch_num, false); + urb->errorcode = -USB_ERR_NAK; + dwc2_urb_waitup(urb); + break; + + default: + break; + } + } else { + urb->errorcode = -USB_ERR_NAK; + dwc2_urb_waitup(urb); + } + } else if (chan_intstatus & USB_OTG_HCINT_ACK) { + if (chan->do_ssplit) { + /* start ssplit transfer */ + chan->do_csplit = 1; + chan->ssplit_frame = dwc2_get_full_frame_num(bus); + dwc2_chan_enable_csplit(bus, ch_num, true); + dwc2_chan_reenable(bus, ch_num); + } + } else if (chan_intstatus & USB_OTG_HCINT_NYET) { + if (chan->do_ssplit) { + /* restart csplit transfer */ + dwc2_chan_enable_csplit(bus, ch_num, true); + dwc2_chan_reenable(bus, ch_num); + } else { + urb->errorcode = -USB_ERR_NAK; + dwc2_urb_waitup(urb); + } + } else if (chan_intstatus & USB_OTG_HCINT_TXERR) { + urb->errorcode = -USB_ERR_IO; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_BBERR) { + urb->errorcode = -USB_ERR_BABBLE; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_DTERR) { + urb->errorcode = -USB_ERR_DT; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_FRMOR) { + urb->errorcode = -USB_ERR_IO; + dwc2_urb_waitup(urb); + } + } +} + +static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) +{ + uint32_t chan_intstatus; + struct dwc2_chan *chan; + struct usbh_urb *urb; + + chan_intstatus = USB_OTG_HC(ch_num)->HCINT; + + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[ch_num]; + urb = chan->urb; + //printf("s2:%08x\r\n", chan_intstatus); + + if (chan_intstatus & USB_OTG_HCINT_CHH) { + USB_OTG_HC(ch_num)->HCINT = chan_intstatus; + if (chan_intstatus & USB_OTG_HCINT_XFRC) { + uint32_t count = USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ; /* last packet size */ + uint32_t has_used_packets = chan->num_packets - ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) >> 19); /* how many packets have used */ + uint32_t olen = (has_used_packets - 1) * USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize) + count; /* the same with urb->actual_length += chan->xferlen; */ + uint8_t data_toggle = ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_DPID) >> USB_OTG_HCTSIZ_DPID_Pos); + + urb->actual_length += olen; + + if (chan->ep0_state == DWC2_EP0_STATE_OUTDATA || urb->setup == NULL) { + if (urb->transfer_buffer_length > olen) { + urb->transfer_buffer_length -= olen; + } else { + urb->transfer_buffer_length = 0; + } + } + + if (data_toggle == HC_PID_DATA0) { + urb->data_toggle = 0; + } else { + urb->data_toggle = 1; + } + + if (chan->do_csplit) { + chan->do_csplit = 0; + dwc2_chan_enable_csplit(bus, ch_num, false); + } + + if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) { + if (chan->ep0_state == DWC2_EP0_STATE_SETUP) { + if (urb->setup->wLength) { + if (urb->setup->bmRequestType & 0x80) { + chan->ep0_state = DWC2_EP0_STATE_INDATA; + } else { + chan->ep0_state = DWC2_EP0_STATE_OUTDATA; + } + } else { + chan->ep0_state = DWC2_EP0_STATE_INSTATUS; + } + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + } else if (chan->ep0_state == DWC2_EP0_STATE_OUTDATA) { + if (chan->do_ssplit && urb->transfer_buffer_length > 0) { + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length); + } else { + chan->ep0_state = DWC2_EP0_STATE_INSTATUS; + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + } + } else if (chan->ep0_state == DWC2_EP0_STATE_OUTSTATUS) { + usb_dcache_invalidate((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->actual_length - 8, CONFIG_USB_ALIGN_SIZE)); + chan->ep0_state = DWC2_EP0_STATE_SETUP; + urb->errorcode = 0; + dwc2_urb_waitup(urb); + } + } else if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_ISOCHRONOUS) { + } else { + if (chan->do_ssplit && urb->transfer_buffer_length > 0) { + dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length); + } else { + urb->errorcode = 0; + dwc2_urb_waitup(urb); + } + } + } else if (chan_intstatus & USB_OTG_HCINT_AHBERR) { + urb->errorcode = -USB_ERR_IO; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_STALL) { + urb->errorcode = -USB_ERR_STALL; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_NAK) { + if (chan->do_ssplit) { + /* restart ssplit transfer */ + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + case USB_ENDPOINT_TYPE_BULK: + chan->do_csplit = 0; + dwc2_chan_enable_csplit(bus, ch_num, false); + dwc2_chan_reenable(bus, ch_num); + break; + case USB_ENDPOINT_TYPE_INTERRUPT: + dwc2_chan_enable_csplit(bus, ch_num, false); + urb->errorcode = -USB_ERR_NAK; + dwc2_urb_waitup(urb); + break; + + default: + break; + } + } else { + urb->errorcode = -USB_ERR_NAK; + dwc2_urb_waitup(urb); + } + } else if (chan_intstatus & USB_OTG_HCINT_ACK) { + if (chan->do_ssplit) { + /* start ssplit transfer */ + chan->do_csplit = 1; + chan->ssplit_frame = dwc2_get_full_frame_num(bus); + dwc2_chan_enable_csplit(bus, ch_num, true); + dwc2_chan_reenable(bus, ch_num); + } + } else if (chan_intstatus & USB_OTG_HCINT_NYET) { + if (chan->do_ssplit) { + /* restart csplit transfer */ + dwc2_chan_enable_csplit(bus, ch_num, true); + dwc2_chan_reenable(bus, ch_num); + } else { + urb->errorcode = -USB_ERR_NAK; + dwc2_urb_waitup(urb); + } + } else if (chan_intstatus & USB_OTG_HCINT_TXERR) { + urb->errorcode = -USB_ERR_IO; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_BBERR) { + urb->errorcode = -USB_ERR_BABBLE; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_DTERR) { + urb->errorcode = -USB_ERR_DT; + dwc2_urb_waitup(urb); + } else if (chan_intstatus & USB_OTG_HCINT_FRMOR) { + urb->errorcode = -USB_ERR_IO; + dwc2_urb_waitup(urb); + } + } +} + +static void dwc2_port_irq_handler(struct usbh_bus *bus) +{ + __IO uint32_t hprt0, hprt0_dup, regval; + + /* Handle Host Port Interrupts */ + hprt0 = USB_OTG_HPRT; + hprt0_dup = USB_OTG_HPRT; + + hprt0_dup &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | + USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); + + /* Check whether Port Connect detected */ + if ((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET) { + if ((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS) { + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); + } + hprt0_dup |= USB_OTG_HPRT_PCDET; + g_dwc2_hcd[bus->hcd.hcd_id].port_csc = 1; + } + + /* Check whether Port Enable Changed */ + if ((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG) { + hprt0_dup |= USB_OTG_HPRT_PENCHNG; + g_dwc2_hcd[bus->hcd.hcd_id].port_pec = 1; + + if ((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA) { + regval = USB_OTG_HOST->HFIR; + regval &= ~USB_OTG_HFIR_FRIVL; + regval |= dwc2_calc_frame_interval(bus) & USB_OTG_HFIR_FRIVL; + USB_OTG_HOST->HFIR = regval; + + if (g_dwc2_hcd[bus->hcd.hcd_id].user_params.phy_type == DWC2_PHY_TYPE_PARAM_FS) { + if ((hprt0 & USB_OTG_HPRT_PSPD) == (HPRT0_PRTSPD_LOW_SPEED << 17)) { + if ((USB_OTG_HOST->HCFG & USB_OTG_HCFG_FSLSPCS) != USB_OTG_HCFG_FSLSPCLKSEL_6_MHZ) { + regval = USB_OTG_HOST->HCFG; + regval &= ~USB_OTG_HCFG_FSLSPCS; + regval |= USB_OTG_HCFG_FSLSPCLKSEL_6_MHZ; + USB_OTG_HOST->HCFG = regval; + } + } else { + if ((USB_OTG_HOST->HCFG & USB_OTG_HCFG_FSLSPCS) != USB_OTG_HCFG_FSLSPCLKSEL_48_MHZ) { + regval = USB_OTG_HOST->HCFG; + regval &= ~USB_OTG_HCFG_FSLSPCS; + regval |= USB_OTG_HCFG_FSLSPCLKSEL_48_MHZ; + USB_OTG_HOST->HCFG = regval; + } + } + } + } else { + } + } + + /* Check for an overcurrent */ + if ((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG) { + hprt0_dup |= USB_OTG_HPRT_POCCHNG; + g_dwc2_hcd[bus->hcd.hcd_id].port_occ = 1; + } + /* Clear Port Interrupts */ + USB_OTG_HPRT = hprt0_dup; +} + +void USBH_IRQHandler(uint8_t busid) +{ + uint32_t gint_status, chan_int; + struct usbh_bus *bus; + + bus = &g_usbhost_bus[busid]; + gint_status = dwc2_get_glb_intstatus(bus); + if ((USB_OTG_GLB->GINTSTS & 0x1U) == USB_OTG_MODE_HOST) { + /* Avoid spurious interrupt */ + if (gint_status == 0) { + return; + } + + if (gint_status & USB_OTG_GINTSTS_HPRTINT) { + dwc2_port_irq_handler(bus); + } + if (gint_status & USB_OTG_GINTSTS_DISCINT) { + g_dwc2_hcd[bus->hcd.hcd_id].port_csc = 1; + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); + + USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_DISCINT; + } + if (gint_status & USB_OTG_GINTSTS_HCINT) { + chan_int = (USB_OTG_HOST->HAINT & USB_OTG_HOST->HAINTMSK) & 0xFFFFU; + for (uint8_t i = 0U; i < g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels; i++) { + if ((chan_int & (1UL << (i & 0xFU))) != 0U) { + if ((USB_OTG_HC(i)->HCCHAR & USB_OTG_HCCHAR_EPDIR) == USB_OTG_HCCHAR_EPDIR) { + dwc2_inchan_irq_handler(bus, i); + } else { + dwc2_outchan_irq_handler(bus, i); + } + } + } + USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_HCINT; + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ehci/README.md b/src/lib/CherryUSB/port/ehci/README.md new file mode 100644 index 000000000..753fc4468 --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/README.md @@ -0,0 +1,38 @@ +# Note + +## Support Chip List + +### BouffaloLab + +- BouffaloLab BL616/BL808 (bouffalolab + EHCI) + +### HPMicro + +- HPM all series (hpmicro + EHCI) + +### AllwinnerTech + +- F133/T113 + +### Nuvoton + +- Nuvoton all series + +### Artinchip + +- d13x, d21x + +### NXP + +Modify USB_NOCACHE_RAM_SECTION + +``` +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".NonCacheable"))) +``` + +- IMRT10XX/IMRT11XX (chipidea + EHCI) +- MCXN9XX/MCXN236 (chipidea + EHCI) + +### Intel + +- Intel 6 Series Chipset and Intel C200 Series Chipset diff --git a/src/lib/CherryUSB/port/ehci/usb_ehci_reg.h b/src/lib/CherryUSB/port/ehci/usb_ehci_reg.h new file mode 100644 index 000000000..741eef64b --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/usb_ehci_reg.h @@ -0,0 +1,393 @@ +/**************************************************************************** + * include/nuttx/usb/ehci.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ +/* + * Copyright 2022 sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef __INCLUDE_NUTTX_USB_EHCI_H +#define __INCLUDE_NUTTX_USB_EHCI_H + +#define EHCI_FULL_SPEED (0) /* Full-Speed (12Mbs) */ +#define EHCI_LOW_SPEED (1) /* Low-Speed (1.5Mbs) */ +#define EHCI_HIGH_SPEED (2) /* High-Speed (480 Mb/s) */ + +/* Host Controller Capability Register Bit Definitions **********************/ + +/* Structural Parameters. Paragraph 2.2.3 */ + +#define EHCI_HCSPARAMS_NPORTS_SHIFT (0) /* Bit 0-3: Number of physical downstream ports */ +#define EHCI_HCSPARAMS_NPORTS_MASK (15 << EHCI_HCSPARAMS_NPORTS_SHIFT) +#define EHCI_HCSPARAMS_PPC (1 << 4) /* Bit 4: Port Power Control */ +#define EHCI_HCSPARAMS_PRR (1 << 7) /* Bit 7: Port Routing Rules */ +#define EHCI_HCSPARAMS_NPCC_SHIFT (8) /* Bit 8-11: Number of Ports per Companion Controller */ +#define EHCI_HCSPARAMS_NPCC_MASK (15 << EHCI_HCSPARAMS_NPCC_SHIFT) +#define EHCI_HCSPARAMS_NCC_SHIFT (12) /* Bit 12-15: Number of Companion Controllers */ +#define EHCI_HCSPARAMS_NCC_MASK (15 << EHCI_HCSPARAMS_NCC_SHIFT) +#define EHCI_HCSPARAMS_PIND (1 << 16) /* Bit 16: Port Indicators */ +#define EHCI_HCSPARAMS_DBGPORT_SHIFT (20) /* Bit 20-23: Debug Port Number */ +#define EHCI_HCSPARAMS_DBGPORT_MASK (15 << EHCI_HCSPARAMS_DBGPORT_SHIFT) + +/* Capability Parameters. Paragraph 2.2.4 */ + +#define EHCI_HCCPARAMS_64BIT (1 << 0) /* Bit 0: 64-bit Addressing Capability */ +#define EHCI_HCCPARAMS_PFLF (1 << 1) /* Bit 1: Programmable Frame List Flag */ +#define EHCI_HCCPARAMS_ASPC (1 << 2) /* Bit 2: Asynchronous Schedule Park Capability */ +#define EHCI_HCCPARAMS_IST_SHIFT (4) /* Bits 4-7: Isochronous Scheduling Threshold */ +#define EHCI_HCCPARAMS_IST_MASK (15 << EHCI_HCCPARAMS_IST_SHIFT) +#define EHCI_HCCPARAMS_EECP_SHIFT (8) /* Bits 8-15: EHCI Extended Capabilities Pointer */ +#define EHCI_HCCPARAMS_EECP_MASK (0xff << EHCI_HCCPARAMS_EECP_SHIFT) + +/* Host Controller Operational Register Bit Definitions *********************/ + +/* USB Command. Paragraph 2.3.1 */ + +#define EHCI_USBCMD_RUN (1 << 0) /* Bit 0: Run/Stop */ +#define EHCI_USBCMD_HCRESET (1 << 1) /* Bit 1: Host Controller Reset */ +#define EHCI_USBCMD_FLSIZE_SHIFT (2) /* Bits 2-3: Frame List Size */ +#define EHCI_USBCMD_FLSIZE_MASK (3 << EHCI_USBCMD_FLSIZE_SHIFT) +#define EHCI_USBCMD_FLSIZE_1024 (0 << EHCI_USBCMD_FLSIZE_SHIFT) /* 1024 elements (4096 bytes) */ +#define EHCI_USBCMD_FLSIZE_512 (1 << EHCI_USBCMD_FLSIZE_SHIFT) /* 512 elements (2048 bytes) */ +#define EHCI_USBCMD_FLSIZE_256 (2 << EHCI_USBCMD_FLSIZE_SHIFT) /* 256 elements (1024 bytes) */ +#define EHCI_USBCMD_PSEN (1 << 4) /* Bit 4: Periodic Schedule Enable */ +#define EHCI_USBCMD_ASEN (1 << 5) /* Bit 5: Asynchronous Schedule Enable */ +#define EHCI_USBCMD_IAAD (1 << 6) /* Bit 6: Interrupt on Async Advance Doorbell */ +#define EHCI_USBCMD_LRESET (1 << 7) /* Bit 7: Light Host Controller Reset */ +#define EHCI_USBCMD_ASYNC_PARKCNT_SHIFT (8) /* Bits 8-9: Asynchronous Schedule Park Mode Count */ +#define EHCI_USBCMD_ASYNC_PARKCNT_MASK (3 << EHCI_USBCMD_ASYNC_PARKCNT_SHIFT) +#define EHCI_USBCMD_ASYNC_PARK (1 << 11) /* Bit 11: Asynchronous Schedule Park Mode Enable */ +#define EHCI_USBCMD_ITHRE_SHIFT (16) /* Bits 16-23: Interrupt Threshold Control */ +#define EHCI_USBCMD_ITHRE_MASK (0xff << EHCI_USBCMD_ITHRE_SHIFT) +#define EHCI_USBCMD_ITHRE_1MF (0x01 << EHCI_USBCMD_ITHRE_SHIFT) /* 1 micro-frame */ +#define EHCI_USBCMD_ITHRE_2MF (0x02 << EHCI_USBCMD_ITHRE_SHIFT) /* 2 micro-frames */ +#define EHCI_USBCMD_ITHRE_4MF (0x04 << EHCI_USBCMD_ITHRE_SHIFT) /* 4 micro-frames */ +#define EHCI_USBCMD_ITHRE_8MF (0x08 << EHCI_USBCMD_ITHRE_SHIFT) /* 8 micro-frames (default, 1 ms) */ +#define EHCI_USBCMD_ITHRE_16MF (0x10 << EHCI_USBCMD_ITHRE_SHIFT) /* 16 micro-frames (2 ms) */ +#define EHCI_USBCMD_ITHRE_32MF (0x20 << EHCI_USBCMD_ITHRE_SHIFT) /* 32 micro-frames (4 ms) */ +#define EHCI_USBCMD_ITHRE_64MF (0x40 << EHCI_USBCMD_ITHRE_SHIFT) /* 64 micro-frames (8 ms) */ + +/* USB Status. Paragraph 2.3.2 */ + +#define EHCI_USBSTS_INT (1 << 0) /* Bit 0: USB Interrupt */ +#define EHCI_USBSTS_ERR (1 << 1) /* Bit 1: USB Error Interrupt */ +#define EHCI_USBSTS_PCD (1 << 2) /* Bit 2: Port Change Detect */ +#define EHCI_USBSTS_FLR (1 << 3) /* Bit 3: Frame List Rollover */ +#define EHCI_USBSTS_FATAL (1 << 4) /* Bit 4: Host System Error */ +#define EHCI_USBSTS_IAA (1 << 5) /* Bit 5: Interrupt on Async Advance */ +#define EHCI_USBSTS_HALTED (1 << 12) /* Bit 12: HC Halted */ +#define EHCI_USBSTS_RECLAM (1 << 13) /* Bit 13: Reclamation */ +#define EHCI_USBSTS_PSS (1 << 14) /* Bit 14: Periodic Schedule Status */ +#define EHCI_USBSTS_ASS (1 << 15) /* Bit 15: Asynchronous Schedule Status */ + /* Bits 16-31: Reserved */ + +/* USB Interrupt Enable. Paragraph 2.3.3 */ + +#define EHCI_USBIE_INT (1 << 0) /* Bit 0: USB Interrupt */ +#define EHCI_USBIE_ERR (1 << 1) /* Bit 1: USB Error Interrupt */ +#define EHCI_USBIE_PCD (1 << 2) /* Bit 2: Port Change Detect */ +#define EHCI_USBIE_FLROLL (1 << 3) /* Bit 3: Frame List Rollover */ +#define EHCI_USBIE_FATAL (1 << 4) /* Bit 4: Host System Error */ +#define EHCI_USBIE_IAA (1 << 5) /* Bit 5: Interrupt on Async Advance */ +#define EHCI_USBIE_ALLINTS (0x3f) /* Bits 0-5: All interrupts */ + +/* USB Frame Index. Paragraph 2.3.4 */ + +#define EHCI_FRINDEX_MASK (0x3fff) /* Bits 0-13: Frame index */ + +/* 4G Segment Selector. + * Paragraph 2.3.5, Bits[64:32] of data structure addresses + */ + +/* Frame List Base Address. Paragraph 2.3.6 */ +#define EHCI_PERIODICLISTBASE_MASK (0xfffff000) /* Bits 12-31: Base Address (Low) */ + +/* Next Asynchronous List Address. Paragraph 2.3.7 */ + +#define EHCI_ASYNCLISTADDR_MASK (0xffffffe0) /* Bits 5-31: Link Pointer Low (LPL) */ + +/* Configured Flag Register. Paragraph 2.3.8 */ + +#define EHCI_CONFIGFLAG (1 << 0) /* Bit 0: Configure Flag */ + +/* Port Status/Control, Port 1-n. Paragraph 2.3.9 */ + +#define EHCI_PORTSC_CCS (1 << 0) /* Bit 0: Current Connect Status */ +#define EHCI_PORTSC_CSC (1 << 1) /* Bit 1: Connect Status Change */ +#define EHCI_PORTSC_PE (1 << 2) /* Bit 2: Port Enable */ +#define EHCI_PORTSC_PEC (1 << 3) /* Bit 3: Port Enable/Disable Change */ +#define EHCI_PORTSC_OCA (1 << 4) /* Bit 4: Over-current Active */ +#define EHCI_PORTSC_OCC (1 << 5) /* Bit 5: Over-current Change */ +#define EHCI_PORTSC_RESUME (1 << 6) /* Bit 6: Force Port Resume */ +#define EHCI_PORTSC_SUSPEND (1 << 7) /* Bit 7: Suspend */ +#define EHCI_PORTSC_RESET (1 << 8) /* Bit 8: Port Reset */ +#define EHCI_PORTSC_LSTATUS_SHIFT (10) /* Bits 10-11: Line Status */ +#define EHCI_PORTSC_LSTATUS_MASK (3 << EHCI_PORTSC_LSTATUS_SHIFT) +#define EHCI_PORTSC_LSTATUS_SE0 (0 << EHCI_PORTSC_LSTATUS_SHIFT) /* SE0 Not Low-speed device, perform EHCI reset */ +#define EHCI_PORTSC_LSTATUS_KSTATE (1 << EHCI_PORTSC_LSTATUS_SHIFT) /* K-state Low-speed device, release ownership of port */ +#define EHCI_PORTSC_LSTATUS_JSTATE (2 << EHCI_PORTSC_LSTATUS_SHIFT) /* J-state Not Low-speed device, perform EHCI reset */ +#define EHCI_PORTSC_PP (1 << 12) /* Bit 12: Port Power */ +#define EHCI_PORTSC_OWNER (1 << 13) /* Bit 13: Port Owner */ +#define EHCI_PORTSC_PIC_SHIFT (14) /* Bits 14-15: Port Indicator Control */ +#define EHCI_PORTSC_PIC_MASK (3 << EHCI_PORTSC_PIC_SHIFT) +#define EHCI_PORTSC_PIC_OFF (0 << EHCI_PORTSC_PIC_SHIFT) /* Port indicators are off */ +#define EHCI_PORTSC_PIC_AMBER (1 << EHCI_PORTSC_PIC_SHIFT) /* Amber */ +#define EHCI_PORTSC_PIC_GREEN (2 << EHCI_PORTSC_PIC_SHIFT) /* Green */ +#define EHCI_PORTSC_PTC_SHIFT (16) /* Bits 16-19: Port Test Control */ +#define EHCI_PORTSC_PTC_MASK (15 << EHCI_PORTSC_PTC_SHIFT) +#define EHCI_PORTSC_PTC_DISABLED (0 << EHCI_PORTSC_PTC_SHIFT) /* Test mode not enabled */ +#define EHCI_PORTSC_PTC_JSTATE (1 << EHCI_PORTSC_PTC_SHIFT) /* Test J_STATE */ +#define EHCI_PORTSC_PTC_KSTATE (2 << EHCI_PORTSC_PTC_SHIFT) /* Test K_STATE */ +#define EHCI_PORTSC_PTC_SE0NAK (3 << EHCI_PORTSC_PTC_SHIFT) /* Test SE0_NAK */ +#define EHCI_PORTSC_PTC_PACKET (4 << EHCI_PORTSC_PTC_SHIFT) /* Test Packet */ +#define EHCI_PORTSC_PTC_ENABLE (5 << EHCI_PORTSC_PTC_SHIFT) /* Test FORCE_ENABLE */ +#define EHCI_PORTSC_WKCCNTE (1 << 20) /* Bit 20: Wake on Connect Enable */ +#define EHCI_PORTSC_WKDSCNNTE (1 << 21) /* Bit 21: Wake on Disconnect Enable */ +#define EHCI_PORTSC_WKOCE (1 << 22) /* Bit 22: Wake on Over-current Enable */ + /* Bits 23-31: Reserved */ + +#define EHCI_PORTSC_ALLINTS (EHCI_PORTSC_CSC | EHCI_PORTSC_PEC | \ + EHCI_PORTSC_OCC | EHCI_PORTSC_RESUME) + +/* Queue Head. Paragraph 3.6 */ + +/* Queue Head Horizontal Link Pointer: Queue Head DWord 0. Table 3-19 */ + +#define QH_HLP_END 0x1 + +#define QH_HLP_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0) /* Isochronous Transfer Descriptor */ +#define QH_HLP_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2) /* Queue Head */ +#define QH_HLP_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4) /* Split Transaction Isochronous Transfer Descriptor */ +#define QH_HLP_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6) /* Frame Span Traversal Node */ + +/* Endpoint Characteristics: Queue Head DWord 1. Table 3-19 */ + +#define QH_EPCHAR_DEVADDR_SHIFT (0) /* Bitx 0-6: Device Address */ +#define QH_EPCHAR_DEVADDR_MASK (0x7f << QH_EPCHAR_DEVADDR_SHIFT) +#define QH_EPCHAR_I (1 << 7) /* Bit 7: Inactivate on Next Transaction */ +#define QH_EPCHAR_ENDPT_SHIFT (8) /* Bitx 8-11: Endpoint Number */ +#define QH_EPCHAR_ENDPT_MASK (15 << QH_EPCHAR_ENDPT_SHIFT) +#define QH_EPCHAR_EPS_SHIFT (12) /* Bitx 12-13: Endpoint Speed */ +#define QH_EPCHAR_EPS_MASK (3 << QH_EPCHAR_EPS_SHIFT) +#define QH_EPCHAR_EPS_FULL (0 << QH_EPCHAR_EPS_SHIFT) /* Full-Speed (12Mbs) */ +#define QH_EPCHAR_EPS_LOW (1 << QH_EPCHAR_EPS_SHIFT) /* Low-Speed (1.5Mbs) */ +#define QH_EPCHAR_EPS_HIGH (2 << QH_EPCHAR_EPS_SHIFT) /* High-Speed (480 Mb/s) */ +#define QH_EPCHAR_DTC (1 << 14) /* Bit 14: Data Toggle Control */ +#define QH_EPCHAR_H (1 << 15) /* Bit 15: Head of Reclamation List Flag */ +#define QH_EPCHAR_MAXPKT_SHIFT (16) /* Bitx 16-26: Maximum Packet Length */ +#define QH_EPCHAR_MAXPKT_MASK (0x7ff << QH_EPCHAR_MAXPKT_SHIFT) +#define QH_EPCHAR_C (1 << 27) /* Bit 27: Control Endpoint Flag */ +#define QH_EPCHAR_RL_SHIFT (28) /* Bitx 28-31: Nak Count Reload */ +#define QH_EPCHAR_RL_MASK (15 << QH_EPCHAR_RL_SHIFT) + +/* Endpoint Capabilities: Queue Head DWord 2. Table 3-20 */ + +#define QH_EPCAPS_SSMASK_SHIFT (0) /* Bitx 0-7: Interrupt Schedule Mask (Frame S-mask) */ +#define QH_EPCAPS_SSMASK_MASK (0xff << QH_EPCAPS_SSMASK_SHIFT) +#define QH_EPCAPS_SSMASK(n) ((n) << QH_EPCAPS_SSMASK_SHIFT) +#define QH_EPCAPS_SCMASK_SHIFT (8) /* Bitx 8-15: Split Completion Mask (Frame C-Mask) */ +#define QH_EPCAPS_SCMASK_MASK (0xff << QH_EPCAPS_SCMASK_SHIFT) +#define QH_EPCAPS_SCMASK(n) ((n) << QH_EPCAPS_SCMASK_SHIFT) +#define QH_EPCAPS_HUBADDR_SHIFT (16) /* Bitx 16-22: Hub Address */ +#define QH_EPCAPS_HUBADDR_MASK (0x7f << QH_EPCAPS_HUBADDR_SHIFT) +#define QH_EPCAPS_HUBADDR(n) ((n) << QH_EPCAPS_HUBADDR_SHIFT) +#define QH_EPCAPS_PORT_SHIFT (23) /* Bit 23-29: Port Number */ +#define QH_EPCAPS_PORT_MASK (0x7f << QH_EPCAPS_PORT_SHIFT) +#define QH_EPCAPS_PORT(n) ((n) << QH_EPCAPS_PORT_SHIFT) +#define QH_EPCAPS_MULT_SHIFT (30) /* Bit 30-31: High-Bandwidth Pipe Multiplier */ +#define QH_EPCAPS_MULT_MASK (3 << QH_EPCAPS_MULT_SHIFT) +#define QH_EPCAPS_MULT(n) ((n) << QH_EPCAPS_MULT_SHIFT) + +/* qTD Token. Paragraph 3.5.3 */ + +#define QTD_LIST_END 1 + +#define QTD_TOKEN_STATUS_SHIFT (0) /* Bits 0-7: Status */ +#define QTD_TOKEN_STATUS_MASK (0xff << QTD_TOKEN_STATUS_SHIFT) +#define QTD_TOKEN_STATUS_PINGSTATE (1 << 0) /* Bit 0 Ping State */ +#define QTD_TOKEN_STATUS_ERR (1 << 0) /* Bit 0 Error */ +#define QTD_TOKEN_STATUS_SPLITXSTATE (1 << 1) /* Bit 1 Split Transaction State */ +#define QTD_TOKEN_STATUS_MMF (1 << 2) /* Bit 2 Missed Micro-Frame */ +#define QTD_TOKEN_STATUS_XACTERR (1 << 3) /* Bit 3 Transaction Error */ +#define QTD_TOKEN_STATUS_BABBLE (1 << 4) /* Bit 4 Babble Detected */ +#define QTD_TOKEN_STATUS_DBERR (1 << 5) /* Bit 5 Data Buffer Error */ +#define QTD_TOKEN_STATUS_HALTED (1 << 6) /* Bit 6 Halted */ +#define QTD_TOKEN_STATUS_ACTIVE (1 << 7) /* Bit 7 Active */ +#define QTD_TOKEN_STATUS_ERRORS (0x78 << QTD_TOKEN_STATUS_SHIFT) +#define QTD_TOKEN_PID_SHIFT (8) /* Bits 8-9: PID Code */ +#define QTD_TOKEN_PID_MASK (3 << QTD_TOKEN_PID_SHIFT) +#define QTD_TOKEN_PID_OUT (0 << QTD_TOKEN_PID_SHIFT) /* OUT Token generates token (E1H) */ +#define QTD_TOKEN_PID_IN (1 << QTD_TOKEN_PID_SHIFT) /* IN Token generates token (69H) */ +#define QTD_TOKEN_PID_SETUP (2 << QTD_TOKEN_PID_SHIFT) /* SETUP Token generates token (2DH) */ +#define QTD_TOKEN_CERR_SHIFT (10) /* Bits 10-11: Error Counter */ +#define QTD_TOKEN_CERR_MASK (3 << QTD_TOKEN_CERR_SHIFT) +#define QTD_TOKEN_CPAGE_SHIFT (12) /* Bits 12-14: Current Page */ +#define QTD_TOKEN_CPAGE_MASK (7 << QTD_TOKEN_CPAGE_SHIFT) +#define QTD_TOKEN_IOC (1 << 15) /* Bit 15: Interrupt On Complete */ +#define QTD_TOKEN_NBYTES_SHIFT (16) /* Bits 16-30: Total Bytes to Transfer */ +#define QTD_TOKEN_NBYTES_MASK (0x7fff << QTD_TOKEN_NBYTES_SHIFT) +#define QTD_TOKEN_TOGGLE (1 << 31) /* Bit 31: Data Toggle */ + +/* Isochronous (High-Speed) Transfer Descriptor (iTD). Paragraph 3.3 */ + +/* iTD Next Link Pointer. Paragraph 3.3.1 */ + +#define ITD_NLP_ITD(x) (((uint32_t)(x) & ~0x1F) | 0x0) +#define ITD_NLP_QH(x) (((uint32_t)(x) & ~0x1F) | 0x2) +#define ITD_NLP_SITD(x) (((uint32_t)(x) & ~0x1F) | 0x4) +#define ITD_NLP_FSTN(x) (((uint32_t)(x) & ~0x1F) | 0x6) + +/* iTD Transaction Status and Control List. Paragraph 3.3.2 */ +#define ITD_TSCL_XOFFS_SHIFT (0) /* Bits 0-11: Transaction X offset */ +#define ITD_TSCL_XOFFS_MASK (0xfff << ITD_TSCL_XOFFS_SHIFT) +#define ITD_TSCL_PG_SHIFT (12) /* Bits 12-14: Page select */ +#define ITD_TSCL_PG_MASK (7 << ITD_TSCL_PG_SHIFT) +#define ITD_TSCL_IOC (1 << 15) /* Bit 15: Interrupt On Comp */ +#define ITD_TSCL_LENGTH_SHIFT (16) /* Bits 16-27: Transaction length */ +#define ITD_TSCL_LENGTH_MASK (0xfff << ITD_TSCL_LENGTH_SHIFT) +#define ITD_TSCL_STATUS_SHIFT (28) /* Bits 28-31: Transaction status */ +#define ITD_TSCL_STATUS_MASK (15 << ITD_TSCL_STATUS_SHIFT) +#define ITD_TSCL_STATUS_XACTERR (1 << 28) /* Bit 28: Transaction error */ +#define ITD_TSCL_STATUS_BABBLE (1 << 29) /* Bit 29: Babble Detected */ +#define ITD_TSCL_STATUS_DBERROR (1 << 30) /* Bit 30: Data Buffer Error */ +#define ITD_TSCL_STATUS_ACTIVE (1 << 31) /* Bit 31: Active error */ + +/* iTD Buffer Page Pointer List. Paragraph 3.3.4 */ + +/* iTD Buffer Pointer Page 0. Table 3-4 */ + +#define ITD_BUFPTR0_DEVADDR_SHIFT (0) /* Bits 0-6: Device Address */ +#define ITD_BUFPTR0_DEVADDR_MASK (0x7f << ITD_BUFPTR0_DEVADDR_SHIFT) +#define ITD_BUFPTR0_ENDPT_SHIFT (8) /* Bits 8-11: Endpoint Number */ +#define ITD_BUFPTR0_ENDPT_MASK (15 << ITD_BUFPTR0_ENDPT_SHIFT) + +/* iTD Buffer Pointer Page 1. Table 3-5 */ + +#define ITD_BUFPTR1_MAXPKT_SHIFT (0) /* Bits 0-10: Maximum Packet Size */ +#define ITD_BUFPTR1_MAXPKT_MASK (0x7ff << ITD_BUFPTR1_MAXPKT_SHIFT) +#define ITD_BUFPTR1_DIRIN (1 << 11) /* Bit 11: Direction 1=IN */ +#define ITD_BUFPTR1_DIROUT (0) /* Bit 11: Direction 0=OUT */ + +/* iTD Buffer Pointer Page 2. Table 3-6 */ + +#define ITD_BUFPTR2_MULTI_SHIFT (0) /* Bits 0-1: Multi */ +#define ITD_BUFPTR2_MULTI_MASK (3 << ITD_BUFPTR2_MULTI_SHIFT) +#define ITD_BUFPTR2_MULTI_1 (1 << ITD_BUFPTR2_MULTI_SHIFT) /* One transaction per micro-frame */ +#define ITD_BUFPTR2_MULTI_2 (2 << ITD_BUFPTR2_MULTI_SHIFT) /* Two transactions per micro-frame */ +#define ITD_BUFPTR2_MULTI_3 (3 << ITD_BUFPTR2_MULTI_SHIFT) /* Three transactions per micro-frame */ + +/* Registers ****************************************************************/ + +/* Host Controller Capability Registers. + * This register block must be positioned at a well known address. + */ + +struct ehci_hccr { + volatile uint8_t caplength; /* 0x00: Capability Register Length */ + volatile uint8_t reserved; /* 0x01: reserved */ + volatile uint16_t hciversion; /* 0x02: Interface Version Number */ + volatile uint32_t hcsparams; /* 0x04: Structural Parameters */ + volatile uint32_t hccparams; /* 0x08: Capability Parameters */ + volatile uint8_t hcspportroute[8]; /* 0x0c: Companion Port Route Description */ +}; + +/* Host Controller Operational Registers. + * This register block is positioned at an offset of 'caplength' from the + * beginning of the Host Controller Capability Registers. + */ + +struct ehci_hcor { + volatile uint32_t usbcmd; /* 0x00: USB Command */ + volatile uint32_t usbsts; /* 0x04: USB Status */ + volatile uint32_t usbintr; /* 0x08: USB Interrupt Enable */ + volatile uint32_t frindex; /* 0x0c: USB Frame Index */ + volatile uint32_t ctrldssegment; /* 0x10: 4G Segment Selector */ + volatile uint32_t periodiclistbase; /* 0x14: Frame List Base Address */ + volatile uint32_t asynclistaddr; /* 0x18: Next Asynchronous List Address */ +#ifndef CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE + uint32_t reserved[9]; +#endif + volatile uint32_t configflag; /* 0x40: Configured Flag Register */ + volatile uint32_t portsc[15]; /* 0x44: Port Status/Control */ +}; + +/* USB2 Debug Port Register Interface. + * This register block is normally found via the PCI capabalities. + * In non-PCI implementions, you need apriori information about the + * location of these registers. + */ + +struct ehci_debug { + uint32_t psc; /* 0x00: Debug Port Control/Status Register */ + uint32_t pids; /* 0x04: Debug USB PIDs Register */ + uint32_t data[2]; /* 0x08: Debug Data buffer Registers */ + uint32_t addr; /* 0x10: Device Address Register */ +}; + +/* Data Structures **********************************************************/ + +/* Queue Element Transfer Descriptor (qTD). Paragraph 3.5 */ + +struct ehci_qtd { + uint32_t next_qtd; /* 0x00-0x03: Next qTD Pointer */ + uint32_t alt_next_qtd; /* 0x04-0x07: Alternate Next qTD Pointer */ + uint32_t token; /* 0x08-0x0b: qTD Token */ + uint32_t bpl[5]; /* 0x0c-0x1c: Buffer Page Pointer List */ +}; + +#define SIZEOF_EHCI_QTD (32) /* 8*sizeof(uint32_t) */ + +/* Queue Head. Paragraph 3.6 */ + +struct ehci_qh { + uint32_t hlp; /* 0x00-0x03: Queue Head Horizontal Link Pointer */ + uint32_t epchar; /* 0x04-0x07: Endpoint Characteristics */ + uint32_t epcap; /* 0x08-0x0b: Endpoint Capabilities */ + uint32_t curr_qtd; /* 0x0c-0x0f: Current qTD Pointer */ + struct ehci_qtd overlay; /* 0x10-0x2c: Transfer overlay */ +}; + +#define SIZEOF_EHCI_QH (48) /* 4*sizeof(uint32_t) + 32 */ + +/* Isochronous (High-Speed) Transfer Descriptor (iTD). + * Paragraph 3.3. Must be aligned to 32-byte boundaries. + */ + +struct ehci_itd { + uint32_t nlp; /* 0x00-0x03: Next link pointer */ + uint32_t tscl[8]; /* 0x04-0x23: Transaction Status and Control List */ + uint32_t bpl[7]; /* 0x24-0x3c: Buffer Page Pointer List */ +}; + +#define SIZEOF_EHCI_ITD (64) /* 16*sizeof(uint32_t) */ + +/* Split Transaction Isochronous Transfer Descriptor (siTD). Paragraph 3.4 */ + +struct ehci_sitd { + uint32_t nlp; /* 0x00-0x03: Next link pointer */ + uint32_t epchar; /* 0x04-0x07: Endpoint and Transaction Translator Characteristics */ + uint32_t mfsc; /* 0x08-0x0b: Micro-frame Schedule Control */ + uint32_t tsc; /* 0x0c-0x0f: Transfer Status and Control */ + uint32_t bpl[2]; /* 0x10-0x17: Buffer Pointer List */ + uint32_t blp; /* 0x18-0x1b: Back link pointer */ +}; + +#define SIZEOF_EHCI_SITD (28) /* 7*sizeof(uint32_t) */ + +#endif /* __INCLUDE_NUTTX_USB_EHCI_H */ diff --git a/src/lib/CherryUSB/port/ehci/usb_glue_aic.c b/src/lib/CherryUSB/port/ehci/usb_glue_aic.c new file mode 100644 index 000000000..500bc02a4 --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/usb_glue_aic.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2022, Artinchip Technology Co., Ltd + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "usbh_core.h" +#include "usb_hc_ehci.h" +#include "usb_hc_ohci.h" + +#if !defined(CONFIG_USB_EHCI_CONFIGFLAG) +#error "aic ehci must define CONFIG_USB_EHCI_CONFIGFLAG" +#endif + +#if !defined(CONFIG_USB_EHCI_WITH_OHCI) +#error "aic must define CONFIG_USB_EHCI_WITH_OHCI for ls/fs device" +#endif + +#if CONFIG_USB_OHCI_HCOR_OFFSET != 0x400 +#error "aic CONFIG_USB_OHCI_HCOR_OFFSET must be 0x400" +#endif + +extern void USBH_IRQHandler(uint8_t busid); + +static void aic_ehci_isr(int vector, void *arg) +{ + struct usbh_bus *bus = (struct usbh_bus *)arg; + extern void USBH_IRQHandler(uint8_t busid); + USBH_IRQHandler(bus->hcd.hcd_id); +} + +static void aic_ohci_isr(int vector, void *arg) +{ + struct usbh_bus *bus = (struct usbh_bus *)arg; + extern void OHCI_IRQHandler(uint8_t busid); + OHCI_IRQHandler(bus->hcd.hcd_id); +} + +typedef struct aic_ehci_config { + uint32_t base_addr; + uint32_t clk_id; + uint32_t rst_id; + uint32_t phy_clk_id; + uint32_t phy_rst_id; + uint32_t irq_num; +}aic_ehci_config_t; + +aic_ehci_config_t config[] = { +#ifdef AIC_USING_USB0_HOST + { + USB_HOST0_BASE, + CLK_USBH0, + RESET_USBH0, + CLK_USB_PHY0, + RESET_USBPHY0, + USB_HOST0_EHCI_IRQn + }, +#else + { + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF + }, +#endif +#ifdef AIC_USING_USB1_HOST + { + USB_HOST1_BASE, + CLK_USBH1, + RESET_USBH1, + CLK_USB_PHY1, + RESET_USBPHY1, + USB_HOST1_EHCI_IRQn + } +#endif +}; + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + uint32_t val; + int i = 0; + + for (i=0; ihcd.reg_base == config[i].base_addr) + break; + } + + if (i == sizeof(config)/sizeof(aic_ehci_config_t)) + return; + + /* set usb0 phy switch: Host/Device */ + if (i == 0) + syscfg_usb_phy0_sw_host(1); + + /* enable clock */ + hal_clk_enable(config[i].phy_clk_id); + hal_clk_enable(config[i].clk_id); + aicos_udelay(300); + hal_reset_assert(config[i].phy_rst_id); + hal_reset_assert(config[i].rst_id); + aicos_udelay(300); + hal_reset_deassert(config[i].phy_rst_id); + hal_reset_deassert(config[i].rst_id); + aicos_udelay(300); + + /* set phy type: UTMI/ULPI */ + val = readl((volatile void *)(unsigned long)(config[i].base_addr+0x800)); +#ifdef FPGA_BOARD_ARTINCHIP + /* fpga phy type = ULPI */ + writel((val & ~0x1U), (volatile void *)(unsigned long)(config[i].base_addr+0x800)); +#else + /* board phy type = UTMI */ + writel((val | 0x1), (volatile void *)(unsigned long)(config[i].base_addr+0x800)); +#endif + + /* Set AHB2STBUS_INSREG01 + Set EHCI packet buffer IN/OUT threshold (in DWORDs) + Must increase the OUT threshold to avoid underrun. (FIFO size - 4) + */ + writel((32 | (127 << 16)), (volatile void *)(unsigned long)(config[i].base_addr+0x94)); + + /* register interrupt callback */ + aicos_request_irq(config[i].irq_num, (irq_handler_t)aic_ehci_isr, + 0, "usb_host_ehci", bus); + aicos_request_irq(config[i].irq_num + 1, (irq_handler_t)aic_ohci_isr, + 0, "usb_host_ohci", bus); + aicos_irq_enable(config[i].irq_num); + aicos_irq_enable(config[i].irq_num + 1); +} + +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + return USB_SPEED_HIGH; +} + +void usb_ehci_dcache_clean(uintptr_t addr, uint32_t len) +{ + aicos_dcache_clean_range((size_t *)addr, len); +} + +void usb_ehci_dcache_invalidate(uintptr_t addr, uint32_t len) +{ + aicos_dcache_invalid_range((size_t *)addr, len); +} + +void usb_ehci_dcache_clean_invalidate(uintptr_t addr, uint32_t len) +{ + aicos_dcache_clean_invalid_range((size_t *)addr, len); +} + +int __usbh_init(void) +{ +#if defined(AIC_USING_USB0_HOST) || defined(AIC_USING_USB1_HOST) + int bus_id = 0; +#endif + +#ifdef AIC_USING_USB0_HOST + usbh_initialize(bus_id, USB_HOST0_BASE); + bus_id++; +#endif + +#ifdef AIC_USING_USB1_HOST + usbh_initialize(bus_id, USB_HOST1_BASE); + bus_id++; +#endif + return 0; +} + +#if defined(KERNEL_RTTHREAD) +#include +#include + +INIT_ENV_EXPORT(__usbh_init); +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ehci/usb_glue_bouffalo.c b/src/lib/CherryUSB/port/ehci/usb_glue_bouffalo.c new file mode 100644 index 000000000..03cd1f337 --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/usb_glue_bouffalo.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "bflb_core.h" +#include "bflb_l1c.h" +#include "usbh_core.h" +#include "hardware/usb_v2_reg.h" + +#ifndef CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE +#error "usb host must enable CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE" +#endif + +#define BLFB_USB_BASE ((uint32_t)0x20072000) +#define BFLB_PDS_BASE ((uint32_t)0x2000e000) + +#define PDS_USB_CTL_OFFSET (0x500) /* usb_ctl */ +#define PDS_USB_PHY_CTRL_OFFSET (0x504) /* usb_phy_ctrl */ + +/* 0x500 : usb_ctl */ +#define PDS_REG_USB_SW_RST_N (1 << 0U) +#define PDS_REG_USB_EXT_SUSP_N (1 << 1U) +#define PDS_REG_USB_WAKEUP (1 << 2U) +#define PDS_REG_USB_L1_WAKEUP (1 << 3U) +#define PDS_REG_USB_DRVBUS_POL (1 << 4U) +#define PDS_REG_USB_IDDIG (1 << 5U) + +/* 0x504 : usb_phy_ctrl */ +#define PDS_REG_USB_PHY_PONRST (1 << 0U) +#define PDS_REG_USB_PHY_OSCOUTEN (1 << 1U) +#define PDS_REG_USB_PHY_XTLSEL_SHIFT (2U) +#define PDS_REG_USB_PHY_XTLSEL_MASK (0x3 << PDS_REG_USB_PHY_XTLSEL_SHIFT) +#define PDS_REG_USB_PHY_OUTCLKSEL (1 << 4U) +#define PDS_REG_USB_PHY_PLLALIV (1 << 5U) +#define PDS_REG_PU_USB20_PSW (1 << 6U) + +#define USB_SOF_TIMER_MASK_AFTER_RESET_HS (0x44C) +#define USB_SOF_TIMER_MASK_AFTER_RESET_FS (0x2710) + +extern void USBH_IRQHandler(uint8_t busid); + +void USBH_IRQ(int irq, void *arg) { + USBH_IRQHandler(0); +} + +static void bflb_usb_phy_init(void) +{ + uint32_t regval; + + /* USB_PHY_CTRL[3:2] reg_usb_phy_xtlsel=0 */ + /* 2000e504 = 0x40; #100; USB_PHY_CTRL[6] reg_pu_usb20_psw=1 (VCC33A) */ + /* 2000e504 = 0x41; #500; USB_PHY_CTRL[0] reg_usb_phy_ponrst=1 */ + /* 2000e500 = 0x20; #100; USB_CTL[0] reg_usb_sw_rst_n=0 */ + /* 2000e500 = 0x22; #500; USB_CTL[1] reg_usb_ext_susp_n=1 */ + /* 2000e500 = 0x23; #100; USB_CTL[0] reg_usb_sw_rst_n=1 */ + /* #1.2ms; wait UCLK */ + /* wait(soc616_b0.usb_uclk); */ + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + regval &= ~PDS_REG_USB_PHY_XTLSEL_MASK; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + regval |= PDS_REG_PU_USB20_PSW; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + regval |= PDS_REG_USB_PHY_PONRST; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_PHY_CTRL_OFFSET); + + /* greater than 5T */ + bflb_mtimer_delay_us(1); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + regval &= ~PDS_REG_USB_SW_RST_N; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + + /* greater than 5T */ + bflb_mtimer_delay_us(1); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + regval |= PDS_REG_USB_EXT_SUSP_N; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + + /* wait UCLK 1.2ms */ + bflb_mtimer_delay_ms(3); + + regval = getreg32(BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + regval |= PDS_REG_USB_SW_RST_N; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + + bflb_mtimer_delay_ms(2); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + uint32_t regval; + + bflb_usb_phy_init(); + + bflb_irq_attach(37, USBH_IRQ, NULL); + bflb_irq_enable(37); + + /* enable device-A for host */ + regval = getreg32(BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + regval &= ~PDS_REG_USB_IDDIG; + putreg32(regval, BFLB_PDS_BASE + PDS_USB_CTL_OFFSET); + + regval = getreg32(BLFB_USB_BASE + USB_OTG_CSR_OFFSET); + regval |= USB_A_BUS_DROP_HOV; + regval &= ~USB_A_BUS_REQ_HOV; + putreg32(regval, BLFB_USB_BASE + USB_OTG_CSR_OFFSET); + + bflb_mtimer_delay_ms(10); + + /* enable vbus and bus control */ + regval = getreg32(BLFB_USB_BASE + USB_OTG_CSR_OFFSET); + regval &= ~USB_A_BUS_DROP_HOV; + regval |= USB_A_BUS_REQ_HOV; + putreg32(regval, BLFB_USB_BASE + USB_OTG_CSR_OFFSET); + + regval = getreg32(BLFB_USB_BASE + USB_GLB_INT_OFFSET); + regval |= USB_MDEV_INT; + regval |= USB_MOTG_INT; + regval &= ~USB_MHC_INT; + putreg32(regval, BLFB_USB_BASE + USB_GLB_INT_OFFSET); +} + +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + uint8_t speed = 3; + + speed = (getreg32(BLFB_USB_BASE + USB_OTG_CSR_OFFSET) & USB_SPD_TYP_HOV_POV_MASK) >> USB_SPD_TYP_HOV_POV_SHIFT; + + if (speed == 0) { + return USB_SPEED_FULL; + } else if (speed == 1) { + return USB_SPEED_LOW; + } else if (speed == 2) { + return USB_SPEED_HIGH; + } + return USB_SPEED_HIGH; +} + +#ifdef CONFIG_USB_DCACHE_ENABLE +void usb_dcache_clean(uintptr_t addr, size_t size) +{ + bflb_l1c_dcache_clean_range((void *)addr, size); +} + +void usb_dcache_invalidate(uintptr_t addr, size_t size) +{ + bflb_l1c_dcache_invalidate_range((void *)addr, size); +} + +void usb_dcache_flush(uintptr_t addr, size_t size) +{ + bflb_l1c_dcache_clean_invalidate_range((void *)addr, size); +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ehci/usb_glue_intel.c b/src/lib/CherryUSB/port/ehci/usb_glue_intel.c new file mode 100644 index 000000000..74ed37862 --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/usb_glue_intel.c @@ -0,0 +1,55 @@ +#ifdef __rtems__ + +#include +#include +#include +#include "usbh_core.h" + +uint32_t echi_base; +static int ehci_bus; +static int ehci_slot; +static int ehci_function; +static int ehci_vector; + +extern void USBH_IRQHandler(uint8_t busid); + +void ehci_pci_scan(int bus, int slot, int fun, int vector) +{ + ehci_bus = bus; + ehci_slot = slot; + ehci_function = fun; + ehci_vector = vector; + pci_read_config_dword(bus, slot, fun, PCI_BASE_ADDRESS_0, &echi_base); +} +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + //set software own ehci + uint32_t legacy_val; + pci_write_config_dword(ehci_bus, ehci_slot, ehci_function, 0x68, 1 << 24); + pci_read_config_dword(ehci_bus, ehci_slot, ehci_function, 0x68, &legacy_val); + if ((legacy_val & 0x01010000) == 0x01000000) + printf("OS owned echi\n"); + else + printf("BIOS owned echi\n"); + + rtems_status_code sc; + sc = rtems_interrupt_handler_install( + ehci_vector, + "USBirq", + RTEMS_INTERRUPT_SHARED, + USBH_IRQHandler, + (void *)0); + + if (sc != RTEMS_SUCCESSFUL) { + printf("USB install isr falied,%s\n", rtems_status_text(sc)); + return; + } +} + +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + printf("USB_SPEED_HIGH present\n"); + return USB_SPEED_HIGH; +} + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ehci/usb_glue_ma35d0.c b/src/lib/CherryUSB/port/ehci/usb_glue_ma35d0.c new file mode 100644 index 000000000..3e03bbd84 --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/usb_glue_ma35d0.c @@ -0,0 +1,117 @@ +/**************************************************************************/ /** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2023-8-8 Wayne First version +* +******************************************************************************/ +#include "rtthread.h" + +#include "NuMicro.h" +#include "rthw.h" +#include "drv_sys.h" + +#define LOG_TAG "drv.cherry" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL DBG_LOG +#define DBG_COLOR +#include + +#if defined(PKG_CHERRYUSB_HOST) + +#include "usbh_core.h" + +static void nu_echi_isr(int vector, void *param) +{ + uint8_t busid = (uint8_t)param; + extern void USBH_IRQHandler(uint8_t busid); + USBH_IRQHandler(busid); +} + +static void nu_ochi_isr(int vector, void *param) +{ +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + int timeout = 100; + + if (bus->hcd.reg_base == HSUSBH0_BASE) { + /* Enable USBH clock */ + CLK_EnableModuleClock(HUSBH0_MODULE); + SYS_ResetModule(HSUSBH0_RST); + + /* Clock engine clock Configuration */ + SYS->USBPMISCR &= ~(SYS_USBPMISCR_PHY0POR_Msk | SYS_USBPMISCR_PHY0COMN_Msk); + rt_thread_mdelay(20); + SYS->USBPMISCR |= SYS_USBPMISCR_PHY0SUSPEND_Msk | SYS_USBPMISCR_PHY0COMN_Msk; + + /* set UHOVRCURH(SYS_MISCFCR0[12]) 1 => USBH Host over-current detect is high-active */ + /* 0 => USBH Host over-current detect is low-active */ + //SYS->MISCFCR0 |= SYS_MISCFCR0_UHOVRCURH_Msk; + SYS->MISCFCR0 &= ~SYS_MISCFCR0_UHOVRCURH_Msk; + while (1) { + rt_thread_mdelay(1); + if (SYS->USBPMISCR & SYS_USBPMISCR_PHY0HSTCKSTB_Msk) + break; /* both USB PHY0 and PHY1 clock 60MHz UTMI clock stable */ + + timeout--; + if (timeout == 0) { + rt_kprintf("USB PHY reset failed. USBPMISCR = 0x%08x\n", SYS->USBPMISCR); + return; + } + } + + /* Register interrupt service routine. */ + rt_hw_interrupt_install(HSUSBH0_IRQn, nu_echi_isr, (void *)bus->hcd.hcd_id, "ehci0"); + + /* Enable interrupt */ + rt_hw_interrupt_umask(HSUSBH0_IRQn); + } else if (bus->hcd.reg_base == HSUSBH1_BASE) { + /* Enable USBH clock */ + CLK_EnableModuleClock(HUSBH1_MODULE); + SYS_ResetModule(HSUSBH1_RST); + + /* Clock engine clock Configuration */ + SYS->USBPMISCR &= ~(SYS_USBPMISCR_PHY1POR_Msk | SYS_USBPMISCR_PHY1COMN_Msk); + rt_thread_mdelay(20); + SYS->USBPMISCR |= SYS_USBPMISCR_PHY1SUSPEND_Msk | SYS_USBPMISCR_PHY1COMN_Msk; + + /* set UHOVRCURH(SYS_MISCFCR0[12]) 1 => USBH Host over-current detect is high-active */ + /* 0 => USBH Host over-current detect is low-active */ + //SYS->MISCFCR0 |= SYS_MISCFCR0_UHOVRCURH_Msk; + SYS->MISCFCR0 &= ~SYS_MISCFCR0_UHOVRCURH_Msk; + while (1) { + rt_thread_mdelay(1); + if (SYS->USBPMISCR & SYS_USBPMISCR_PHY1HSTCKSTB_Msk) + break; /* both USB PHY0 and PHY1 clock 60MHz UTMI clock stable */ + + timeout--; + if (timeout == 0) { + rt_kprintf("USB PHY reset failed. USBPMISCR = 0x%08x\n", SYS->USBPMISCR); + return; + } + } + /* Register interrupt service routine. */ + rt_hw_interrupt_install(HSUSBH1_IRQn, nu_echi_isr, (void *)bus->hcd.hcd_id, "ehci1"); + + /* Enable interrupt */ + rt_hw_interrupt_umask(HSUSBH1_IRQn); + } +} + +void usb_hc_low_level2_init(struct usbh_bus *bus) +{ +} + +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + return USB_SPEED_HIGH; +} + +#endif diff --git a/src/lib/CherryUSB/port/ehci/usb_glue_nuc980.c b/src/lib/CherryUSB/port/ehci/usb_glue_nuc980.c new file mode 100644 index 000000000..4b8a8b337 --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/usb_glue_nuc980.c @@ -0,0 +1,62 @@ +/**************************************************************************/ /** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2023-8-8 Wayne First version +* +******************************************************************************/ +#include "rtthread.h" + +#include "NuMicro.h" +#include "rthw.h" +#include "drv_sys.h" + +#define LOG_TAG "drv.cherry" +#define DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL DBG_LOG +#define DBG_COLOR +#include + +#if defined(PKG_CHERRYUSB_HOST) +#include "usbh_core.h" + +static void nu_ehci_isr(int vector, void *param) +{ + extern void USBH_IRQHandler(uint8_t busid); + USBH_IRQHandler(0); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + LOG_D("%s %d", __FUNCTION__, __LINE__); + + rt_hw_interrupt_mask(IRQ_EHCI); + + /* Enable USBH clock */ + nu_sys_ipclk_enable(USBHCKEN); + nu_sys_ip_reset(USBHRST); + + outpw(0xB0015000 + 0xC4, 0x160); //HSUSBH->USBPCR0 = 0x160; /* enable PHY 0 */ + outpw(0xB0015000 + 0xC8, 0x520); //HSUSBH->USBPCR1 = 0x520; /* enable PHY 1 */ + + //USBH->HcMiscControl |= USBH_HcMiscControl_OCAL_Msk; /* Over-current active low */ + //outpw(0xB0017000 + 0x204, inpw(0xB0017000 + 0x204) | (0x1ul << 3)); + + //USBH->HcMiscControl &= ~USBH_HcMiscControl_OCAL_Msk; /* Over-current active high */ + outpw(0xB0017000 + 0x204, inpw(0xB0017000 + 0x204) & (~(0x1ul << 3))); + + rt_hw_interrupt_install(IRQ_EHCI, nu_ehci_isr, NULL, "ehci-1"); + rt_hw_interrupt_set_priority(IRQ_EHCI, IRQ_LEVEL_1); + rt_hw_interrupt_umask(IRQ_EHCI); +} + +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + return USB_SPEED_HIGH; +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ehci/usb_glue_t113.c b/src/lib/CherryUSB/port/ehci/usb_glue_t113.c new file mode 100644 index 000000000..0c99897fd --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/usb_glue_t113.c @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2025, YC113 + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usb_hc_ehci.h" + +#ifdef CONFIG_USB_EHCI_WITH_OHCI +#include "usb_hc_ohci.h" +#endif + +#include "interrupt.h" +#include "drv_reg_base.h" +#include "drv_clock.h" + +#if CONFIG_USBHOST_MAX_BUS != 2 +#error "t113 has 2 usb host controller" +#endif + +#if CONFIG_USB_OHCI_HCOR_OFFSET != 0x400 +#error "t113 CONFIG_USB_OHCI_HCOR_OFFSET must be 0x400" +#endif + +#if defined(CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE) +#error "t113 usb ehci register need reserved" +#endif + +#if !defined(CONFIG_USB_EHCI_CONFIGFLAG) +#error "t113 usb ehci has configflag register" +#endif + +#if defined(CONFIG_USB_EHCI_ISO) +#error "t113 usb ehci no iso register" +#endif + +void usb_select_phyTohci(void) +{ + *(volatile rt_uint32_t *)(USB0_OTG_BASE_ADDR + 0x420) &= ~(1 << 0); +} + +void usb_gate_open(rt_uint8_t busid) +{ + rt_uint32_t addr; + + addr = (rt_uint32_t)&CCU->usb0_clk + busid * 4; + + if(busid == 0) { + /* otg gate open*/ + CCU->usb_bgr |= 1 << 8; + + /* otg bus reset */ + CCU->usb_bgr &= ~(1 << 24); + sdelay(10); + CCU->usb_bgr |= (1 << 24); + sdelay(10); + } + + /* ehci gate open */ + CCU->usb_bgr |= (1 << 4) << busid; + + /* ehci bus reset */ + CCU->usb_bgr &= ~((1 << 20) << busid); + sdelay(10); + CCU->usb_bgr |= (1 << 20) << busid; + sdelay(10); + + /* ohci gate open */ + CCU->usb_bgr |= 1 << busid; + + /* ohci bus reset */ + CCU->usb_bgr &= ~((1 << 16) << busid); + sdelay(10); + CCU->usb_bgr |= (1 << 16) << busid; + sdelay(10); + + sdelay(10); + + /* clock enable */ + *(volatile rt_uint32_t *)addr &= ~(3 << 24); + *(volatile rt_uint32_t *)addr |= (1 << 31) | (1 << 24); + + /* reset phy */ + *(volatile rt_uint32_t *)addr &= ~(1 << 30); + sdelay(10); + *(volatile rt_uint32_t *)addr |= 1 << 30; + sdelay(10); + + /* otg phy select */ + if(busid == 0) usb_select_phyTohci(); + + USB_LOG_DBG("usb%d gate : %X, clock : %X\n", busid, CCU->usb_bgr, *(volatile rt_uint32_t *)addr); +} + +void usb_clean_siddp(struct usbh_bus *bus) +{ + *(volatile rt_uint32_t *)(bus->hcd.reg_base + 0x810) &= ~(1 << 3); +} + +void usb_hci_set_passby(struct usbh_bus *bus) +{ + /* AHB Master interface INCR16 enable */ + /* AHB Master interface INCR8 enable */ + /* AHB Master interface burst type INCR4 enable */ + /* AHB Master interface INCRX align enable */ + /* ULPI bypass enable */ + *(volatile rt_uint32_t *)(bus->hcd.reg_base + 0x800) |= (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 0); +} + +void t113_ehci_isr(int vector, void *arg) +{ + rt_interrupt_enter(); + + struct usbh_bus *bus = (struct usbh_bus *)arg; + + USB_LOG_DBG("t113_ehci_isr"); + + extern void USBH_IRQHandler(uint8_t busid); + USBH_IRQHandler(bus->hcd.hcd_id); + + rt_interrupt_leave(); +} + +#ifdef CONFIG_USB_EHCI_WITH_OHCI + +void t113_ohci_isr(int vector, void *arg) +{ + rt_interrupt_enter(); + + struct usbh_bus *bus = (struct usbh_bus *)arg; + + USB_LOG_DBG("t113_ohci_isr"); + + extern void OHCI_IRQHandler(uint8_t busid); + OHCI_IRQHandler(bus->hcd.hcd_id); + + rt_interrupt_leave(); +} + +#endif + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + int vector; + RT_ASSERT(bus->busid <= 1); + + usb_gate_open(bus->busid); + usb_clean_siddp(bus); + usb_hci_set_passby(bus); + + /* register EHCI interrupt callback */ + vector = T113_IRQ_USB0_EHCI + (bus->busid > 0 ? 3 : 0); + rt_hw_interrupt_install(vector, t113_ehci_isr, bus, RT_NULL); + rt_hw_interrupt_umask(vector); + + /* register OHCI interrupt callback */ +#ifdef CONFIG_USB_EHCI_WITH_OHCI + rt_hw_interrupt_install(vector + 1, t113_ohci_isr, bus, RT_NULL); + rt_hw_interrupt_set_priority(vector, 11 << 4); + rt_hw_interrupt_umask(vector + 1); +#endif + + USB_LOG_DBG("usb%d vector : %d, phy : %X\n", bus->busid, vector, *(volatile rt_uint32_t *)(bus->hcd.reg_base + 0x810)); + USB_LOG_DBG("usb%d hc low level init success\n", bus->busid); +} + +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + /* Defined by individual manufacturers */ + uint32_t regval; + + regval = EHCI_HCOR->portsc[port - 1]; + if ((regval & EHCI_PORTSC_LSTATUS_MASK) == EHCI_PORTSC_LSTATUS_KSTATE) + return USB_SPEED_LOW; + + if (regval & EHCI_PORTSC_PE) + return USB_SPEED_HIGH; + else + return USB_SPEED_FULL; +} + +int __usbh_init(void) +{ +#ifdef T113_USING_USB0_HOST + /* USB0 MSC test OK */ + usbh_initialize(0, USB0_BASE_ADDR); +#endif + +#ifdef T113_USING_USB1_HOST + /* USB1 MSC test OK */ + usbh_initialize(1, USB1_BASE_ADDR); +#endif + return 0; +} + +#ifdef PKG_CHERRYUSB_HOST + +#include +#include + +INIT_ENV_EXPORT(__usbh_init); + +#endif diff --git a/src/lib/CherryUSB/port/ehci/usb_hc_ehci.c b/src/lib/CherryUSB/port/ehci/usb_hc_ehci.c new file mode 100644 index 000000000..e278f5231 --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/usb_hc_ehci.c @@ -0,0 +1,1455 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_hc_ehci.h" +#ifdef CONFIG_USB_EHCI_WITH_OHCI +#include "usb_hc_ohci.h" +#endif + +#define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */ +#define EHCI_TUNE_RL_HS 4 /* nak throttle; see 4.9 */ +#define EHCI_TUNE_RL_TT 0 +#define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */ +#define EHCI_TUNE_MULT_TT 1 + +struct ehci_hcd g_ehci_hcd[CONFIG_USBHOST_MAX_BUS]; + +USB_NOCACHE_RAM_SECTION struct ehci_qh_hw ehci_qh_pool[CONFIG_USBHOST_MAX_BUS][CONFIG_USB_EHCI_QH_NUM]; +USB_NOCACHE_RAM_SECTION struct ehci_qtd_hw ehci_qtd_pool[CONFIG_USBHOST_MAX_BUS][CONFIG_USB_EHCI_QTD_NUM]; + +/* The head of the asynchronous queue */ +USB_NOCACHE_RAM_SECTION struct ehci_qh_hw g_async_qh_head[CONFIG_USBHOST_MAX_BUS]; +/* The head of the periodic queue */ +USB_NOCACHE_RAM_SECTION struct ehci_qh_hw g_periodic_qh_head[CONFIG_USBHOST_MAX_BUS]; + +/* The frame list */ +USB_NOCACHE_RAM_SECTION uint32_t g_framelist[CONFIG_USBHOST_MAX_BUS][USB_ALIGN_UP(CONFIG_USB_EHCI_FRAME_LIST_SIZE, 1024)] __attribute__((aligned(4096))); + +static struct ehci_qtd_hw *ehci_qtd_alloc(struct usbh_bus *bus) +{ + struct ehci_qtd_hw *qtd; + size_t flags; + + flags = usb_osal_enter_critical_section(); + for (uint32_t i = 0; i < CONFIG_USB_EHCI_QTD_NUM; i++) { + qtd = &ehci_qtd_pool[bus->hcd.hcd_id][i]; + if (!qtd->inuse) { + qtd->inuse = true; + usb_osal_leave_critical_section(flags); + + memset(&qtd->hw, 0, sizeof(struct ehci_qtd)); + qtd->hw.next_qtd = QTD_LIST_END; + qtd->hw.alt_next_qtd = QTD_LIST_END; + qtd->hw.token = QTD_TOKEN_STATUS_HALTED; + qtd->urb = NULL; + qtd->bufaddr = 0; + qtd->length = 0; + + return qtd; + } + } + usb_osal_leave_critical_section(flags); + return NULL; +} + +static void ehci_qtd_free(struct usbh_bus *bus, struct ehci_qtd_hw *qtd) +{ + size_t flags; + + (void)bus; + + flags = usb_osal_enter_critical_section(); + qtd->inuse = false; + qtd->urb = NULL; + usb_osal_leave_critical_section(flags); +} + +static struct ehci_qh_hw *ehci_qh_alloc(struct usbh_bus *bus) +{ + struct ehci_qh_hw *qh; + size_t flags; + + flags = usb_osal_enter_critical_section(); + for (uint32_t i = 0; i < CONFIG_USB_EHCI_QH_NUM; i++) { + qh = &ehci_qh_pool[bus->hcd.hcd_id][i]; + if (!qh->inuse) { + qh->inuse = true; + usb_osal_leave_critical_section(flags); + + memset(&qh->hw, 0, sizeof(struct ehci_qh)); + qh->hw.hlp = QTD_LIST_END; + qh->hw.overlay.next_qtd = QTD_LIST_END; + qh->hw.overlay.alt_next_qtd = QTD_LIST_END; + qh->urb = NULL; + qh->first_qtd = QTD_LIST_END; + qh->remove_in_iaad = 0; + + return qh; + } + } + usb_osal_leave_critical_section(flags); + return NULL; +} + +static void ehci_qh_free(struct usbh_bus *bus, struct ehci_qh_hw *qh) +{ + struct ehci_qtd_hw *qtd; + size_t flags; + + flags = usb_osal_enter_critical_section(); + if (qh->urb) { + qh->urb->hcpriv = NULL; + qh->urb = NULL; + } + qtd = EHCI_ADDR2QTD(qh->first_qtd); + + while (qtd) { + ehci_qtd_free(bus, qtd); + qtd = EHCI_ADDR2QTD(qtd->hw.next_qtd); + } + + qh->inuse = false; + qh->first_qtd = QTD_LIST_END; + usb_osal_leave_critical_section(flags); +} + +#if defined(CONFIG_USB_EHCI_DESC_DCACHE_ENABLE) +static inline void usb_ehci_qh_qtd_flush(struct ehci_qh_hw *qh) +{ + struct ehci_qtd_hw *qtd; + + qtd = EHCI_ADDR2QTD(qh->first_qtd); + + while (qtd) { + usb_dcache_clean((uintptr_t)&qtd->hw, CONFIG_USB_EHCI_ALIGN_SIZE); + qtd = EHCI_ADDR2QTD(qtd->hw.next_qtd); + } + usb_dcache_clean((uintptr_t)&qh->hw, CONFIG_USB_EHCI_ALIGN_SIZE); +} +#else +#define usb_ehci_qh_qtd_flush(qh) +#endif + +static inline void ehci_qh_add_head(struct ehci_qh_hw *head, struct ehci_qh_hw *n) +{ + n->hw.hlp = head->hw.hlp; + usb_ehci_qh_qtd_flush(n); + + usb_dcache_flush((uintptr_t)n->urb->transfer_buffer, USB_ALIGN_UP(n->urb->transfer_buffer_length, CONFIG_USB_ALIGN_SIZE)); + + head->hw.hlp = QH_HLP_QH(n); +#if defined(CONFIG_USB_EHCI_DESC_DCACHE_ENABLE) + usb_dcache_clean((uintptr_t)&head->hw, CONFIG_USB_EHCI_ALIGN_SIZE); +#endif +} + +static inline void ehci_qh_remove(struct ehci_qh_hw *head, struct ehci_qh_hw *n) +{ + struct ehci_qh_hw *tmp = head; + + while (EHCI_ADDR2QH(tmp->hw.hlp) && EHCI_ADDR2QH(tmp->hw.hlp) != n) { + tmp = EHCI_ADDR2QH(tmp->hw.hlp); + } + + if (tmp) { + tmp->hw.hlp = n->hw.hlp; +#if defined(CONFIG_USB_EHCI_DESC_DCACHE_ENABLE) + usb_dcache_clean((uintptr_t)&tmp->hw, CONFIG_USB_EHCI_ALIGN_SIZE); +#endif + } +} + +static int ehci_caculate_smask(int binterval) +{ + int order, interval; + + interval = 1; + while (binterval > 1) { + interval *= 2; + binterval--; + } + + if (interval < 2) /* interval 1 */ + return 0xFF; + if (interval < 4) /* interval 2 */ + return 0x55; + if (interval < 8) /* interval 4 */ + return 0x22; + for (order = 0; (interval > 1); order++) { + interval >>= 1; + } + return (0x1 << (order % 8)); +} + +static void ehci_qh_fill(struct ehci_qh_hw *qh, + uint8_t dev_addr, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_mps, + uint8_t ep_mult, + uint8_t ep_interval, + uint8_t speed, + uint8_t hubaddr, + uint8_t hubport) +{ + uint32_t epchar = 0; + uint32_t epcap = 0; + + /* QH endpoint characteristics: + * + * FIELD DESCRIPTION + * -------- ------------------------------- + * DEVADDR Device address + * I Inactivate on Next Transaction + * ENDPT Endpoint number + * EPS Endpoint speed + * DTC Data toggle control + * MAXPKT Max packet size + * C Control endpoint + * RL NAK count reloaded + */ + + /* QH endpoint capabilities + * + * FIELD DESCRIPTION + * -------- ------------------------------- + * SSMASK Interrupt Schedule Mask + * SCMASK Split Completion Mask + * HUBADDR Hub Address + * PORT Port number + * MULT High band width multiplier + */ + + epchar |= ((ep_addr & 0xf) << QH_EPCHAR_ENDPT_SHIFT); + epchar |= (dev_addr << QH_EPCHAR_DEVADDR_SHIFT); + epchar |= (ep_mps << QH_EPCHAR_MAXPKT_SHIFT); + + if (ep_type == USB_ENDPOINT_TYPE_CONTROL) { + epchar |= QH_EPCHAR_DTC; /* toggle from qtd */ + } + + switch (speed) { + case USB_SPEED_LOW: + epchar |= QH_EPCHAR_EPS_LOW; + __attribute__((fallthrough)); + case USB_SPEED_FULL: + if (ep_type == USB_ENDPOINT_TYPE_CONTROL) { + epchar |= QH_EPCHAR_C; /* for TT */ + } + + if (ep_type != USB_ENDPOINT_TYPE_INTERRUPT) { + epchar |= (EHCI_TUNE_RL_TT << QH_EPCHAR_RL_SHIFT); + } + + epcap |= QH_EPCAPS_MULT(EHCI_TUNE_MULT_TT); + + epcap |= QH_EPCAPS_HUBADDR(hubaddr); + epcap |= QH_EPCAPS_PORT(hubport); + + if (ep_type == USB_ENDPOINT_TYPE_INTERRUPT) { + epcap |= QH_EPCAPS_SSMASK(2); + epcap |= QH_EPCAPS_SCMASK(0x78); + } + + break; + case USB_SPEED_HIGH: + epchar |= QH_EPCHAR_EPS_HIGH; + if (ep_type == USB_ENDPOINT_TYPE_CONTROL) { + epchar |= (EHCI_TUNE_RL_HS << QH_EPCHAR_RL_SHIFT); + + epcap |= QH_EPCAPS_MULT(EHCI_TUNE_MULT_HS); + } else if (ep_type == USB_ENDPOINT_TYPE_BULK) { + epcap |= QH_EPCAPS_MULT(EHCI_TUNE_MULT_HS); + } else { + /* only for interrupt ep */ + epcap |= QH_EPCAPS_MULT(ep_mult); + epcap |= ehci_caculate_smask(ep_interval); + } + break; + + default: + break; + } + + qh->hw.epchar = epchar; + qh->hw.epcap = epcap; +} + +static void ehci_qtd_bpl_fill(struct ehci_qtd_hw *qtd, uint32_t bufaddr, size_t buflen) +{ + uint32_t rest; + + qtd->hw.bpl[0] = bufaddr; + rest = 0x1000 - (bufaddr & 0xfff); + + if (buflen < rest) { + rest = buflen; + } else { + bufaddr += 0x1000; + bufaddr &= ~0x0fff; + + for (int i = 1; rest < buflen && i < 5; i++) { + qtd->hw.bpl[i] = bufaddr; + bufaddr += 0x1000; + + if ((rest + 0x1000) < buflen) { + rest += 0x1000; + } else { + rest = buflen; + } + } + } +} + +static void ehci_qtd_fill(struct ehci_qtd_hw *qtd, uint32_t bufaddr, size_t buflen, uint32_t token) +{ + /* qTD token + * + * FIELD DESCRIPTION + * -------- ------------------------------- + * STATUS Status + * PID PID Code + * CERR Error Counter + * CPAGE Current Page + * IOC Interrupt on complete + * NBYTES Total Bytes to Transfer + * TOGGLE Data Toggle + */ + + qtd->hw.token = token; + + ehci_qtd_bpl_fill(qtd, usb_phyaddr2ramaddr(bufaddr), buflen); + qtd->bufaddr = bufaddr; + qtd->length = buflen; +} + +static struct ehci_qh_hw *ehci_control_urb_init(struct usbh_bus *bus, struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) +{ + struct ehci_qh_hw *qh = NULL; + struct ehci_qtd_hw *qtd_setup = NULL; + struct ehci_qtd_hw *qtd_data = NULL; + struct ehci_qtd_hw *qtd_status = NULL; + uint32_t token; + size_t flags; + + qh = ehci_qh_alloc(bus); + if (qh == NULL) { + return NULL; + } + + qtd_setup = ehci_qtd_alloc(bus); + qtd_status = ehci_qtd_alloc(bus); + USB_ASSERT_MSG(qtd_setup && qtd_status, "ctrl qtd alloc failed"); + + ehci_qh_fill(qh, + urb->hport->dev_addr, + urb->ep->bEndpointAddress, + USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes), + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), + 0, + 0, + urb->hport->speed, + urb->hport->parent->hub_addr, + urb->hport->port); + + /* fill setup qtd */ + token = QTD_TOKEN_STATUS_ACTIVE | + QTD_TOKEN_PID_SETUP | + ((uint32_t)EHCI_TUNE_CERR << QTD_TOKEN_CERR_SHIFT) | + ((uint32_t)8 << QTD_TOKEN_NBYTES_SHIFT); + + ehci_qtd_fill(qtd_setup, (uintptr_t)setup, 8, token); + qtd_setup->urb = urb; + + /* fill data qtd */ + if (setup->wLength > 0) { + qtd_data = ehci_qtd_alloc(bus); + USB_ASSERT_MSG(qtd_data, "ctrl qtd alloc failed"); + + if ((setup->bmRequestType & 0x80) == 0x80) { + token = QTD_TOKEN_PID_IN; + } else { + token = QTD_TOKEN_PID_OUT; + } + token |= QTD_TOKEN_STATUS_ACTIVE | + QTD_TOKEN_PID_OUT | + QTD_TOKEN_TOGGLE | + ((uint32_t)EHCI_TUNE_CERR << QTD_TOKEN_CERR_SHIFT) | + ((uint32_t)buflen << QTD_TOKEN_NBYTES_SHIFT); + + ehci_qtd_fill(qtd_data, (uintptr_t)buffer, buflen, token); + qtd_data->urb = urb; + qtd_setup->hw.next_qtd = EHCI_PTR2ADDR(qtd_data); + qtd_data->hw.next_qtd = EHCI_PTR2ADDR(qtd_status); + } else { + qtd_setup->hw.next_qtd = EHCI_PTR2ADDR(qtd_status); + } + + /* fill status qtd */ + if ((setup->bmRequestType & 0x80) == 0x80) { + token = QTD_TOKEN_PID_OUT; + } else { + token = QTD_TOKEN_PID_IN; + } + token |= QTD_TOKEN_STATUS_ACTIVE | + QTD_TOKEN_TOGGLE | + QTD_TOKEN_IOC | + ((uint32_t)EHCI_TUNE_CERR << QTD_TOKEN_CERR_SHIFT) | + ((uint32_t)0 << QTD_TOKEN_NBYTES_SHIFT); + + ehci_qtd_fill(qtd_status, 0, 0, token); + qtd_status->urb = urb; + qtd_status->hw.next_qtd = QTD_LIST_END; + + /* update qh first qtd */ + qh->hw.curr_qtd = EHCI_PTR2ADDR(qtd_setup); + qh->hw.overlay.next_qtd = EHCI_PTR2ADDR(qtd_setup); + + /* record qh first qtd */ + qh->first_qtd = EHCI_PTR2ADDR(qtd_setup); + + flags = usb_osal_enter_critical_section(); + + qh->urb = urb; + urb->hcpriv = qh; + /* add qh into async list */ + ehci_qh_add_head(&g_async_qh_head[bus->hcd.hcd_id], qh); + + EHCI_HCOR->usbcmd |= EHCI_USBCMD_ASEN; + + usb_osal_leave_critical_section(flags); + return qh; +} + +static struct ehci_qh_hw *ehci_bulk_urb_init(struct usbh_bus *bus, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +{ + struct ehci_qh_hw *qh = NULL; + struct ehci_qtd_hw *qtd = NULL; + struct ehci_qtd_hw *first_qtd = NULL; + struct ehci_qtd_hw *prev_qtd = NULL; + uint32_t xfer_len = 0; + uint32_t token; + size_t flags; + + qh = ehci_qh_alloc(bus); + if (qh == NULL) { + return NULL; + } + + ehci_qh_fill(qh, + urb->hport->dev_addr, + urb->ep->bEndpointAddress, + USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes), + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), + 0, + 0, + urb->hport->speed, + urb->hport->parent->hub_addr, + urb->hport->port); + + while (1) { + qtd = ehci_qtd_alloc(bus); + USB_ASSERT_MSG(qtd, "bulk qtd alloc failed"); + + if (buflen > 0x4000) { + xfer_len = 0x4000; + buflen -= 0x4000; + } else { + xfer_len = buflen; + buflen = 0; + } + + if (urb->ep->bEndpointAddress & 0x80) { + token = QTD_TOKEN_PID_IN; + } else { + token = QTD_TOKEN_PID_OUT; + } + + token |= QTD_TOKEN_STATUS_ACTIVE | + ((uint32_t)EHCI_TUNE_CERR << QTD_TOKEN_CERR_SHIFT) | + ((uint32_t)xfer_len << QTD_TOKEN_NBYTES_SHIFT); + + if (buflen == 0) { + token |= QTD_TOKEN_IOC; + } + + ehci_qtd_fill(qtd, (uintptr_t)buffer, xfer_len, token); + qtd->urb = urb; + qtd->hw.next_qtd = QTD_LIST_END; + buffer += xfer_len; + + if (prev_qtd) { + prev_qtd->hw.next_qtd = EHCI_PTR2ADDR(qtd); + } else { + first_qtd = qtd; + } + prev_qtd = qtd; + + if (buflen == 0) { + break; + } + } + + /* update qh first qtd */ + qh->hw.curr_qtd = EHCI_PTR2ADDR(first_qtd); + qh->hw.overlay.next_qtd = EHCI_PTR2ADDR(first_qtd); + + /* update data toggle */ + if (urb->data_toggle) { + qh->hw.overlay.token = QTD_TOKEN_TOGGLE; + } else { + qh->hw.overlay.token = 0; + } + + /* record qh first qtd */ + qh->first_qtd = EHCI_PTR2ADDR(first_qtd); + + flags = usb_osal_enter_critical_section(); + + qh->urb = urb; + urb->hcpriv = qh; + /* add qh into async list */ + ehci_qh_add_head(&g_async_qh_head[bus->hcd.hcd_id], qh); + + EHCI_HCOR->usbcmd |= EHCI_USBCMD_ASEN; + + usb_osal_leave_critical_section(flags); + return qh; +} + +static struct ehci_qh_hw *ehci_intr_urb_init(struct usbh_bus *bus, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +{ + struct ehci_qh_hw *qh = NULL; + struct ehci_qtd_hw *qtd = NULL; + struct ehci_qtd_hw *first_qtd = NULL; + struct ehci_qtd_hw *prev_qtd = NULL; + uint32_t xfer_len = 0; + uint32_t token; + size_t flags; + + qh = ehci_qh_alloc(bus); + if (qh == NULL) { + return NULL; + } + + ehci_qh_fill(qh, + urb->hport->dev_addr, + urb->ep->bEndpointAddress, + USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes), + USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), + USB_GET_MULT(urb->ep->wMaxPacketSize) + 1, + urb->ep->bInterval, + urb->hport->speed, + urb->hport->parent->hub_addr, + urb->hport->port); + + while (1) { + qtd = ehci_qtd_alloc(bus); + USB_ASSERT_MSG(qtd, "intr qtd alloc failed"); + + if (buflen > 0x4000) { + xfer_len = 0x4000; + buflen -= 0x4000; + } else { + xfer_len = buflen; + buflen = 0; + } + + if (urb->ep->bEndpointAddress & 0x80) { + token = QTD_TOKEN_PID_IN; + } else { + token = QTD_TOKEN_PID_OUT; + } + + token |= QTD_TOKEN_STATUS_ACTIVE | + ((uint32_t)EHCI_TUNE_CERR << QTD_TOKEN_CERR_SHIFT) | + ((uint32_t)xfer_len << QTD_TOKEN_NBYTES_SHIFT); + + if (buflen == 0) { + token |= QTD_TOKEN_IOC; + } + + ehci_qtd_fill(qtd, (uintptr_t)buffer, xfer_len, token); + qtd->urb = urb; + qtd->hw.next_qtd = QTD_LIST_END; + buffer += xfer_len; + + if (prev_qtd) { + prev_qtd->hw.next_qtd = EHCI_PTR2ADDR(qtd); + } else { + first_qtd = qtd; + } + prev_qtd = qtd; + + if (buflen == 0) { + break; + } + } + + /* update qh first qtd */ + qh->hw.curr_qtd = EHCI_PTR2ADDR(first_qtd); + qh->hw.overlay.next_qtd = EHCI_PTR2ADDR(first_qtd); + + /* update data toggle */ + if (urb->data_toggle) { + qh->hw.overlay.token = QTD_TOKEN_TOGGLE; + } else { + qh->hw.overlay.token = 0; + } + + /* record qh first qtd */ + qh->first_qtd = EHCI_PTR2ADDR(first_qtd); + + flags = usb_osal_enter_critical_section(); + + qh->urb = urb; + urb->hcpriv = qh; + /* add qh into periodic list */ + ehci_qh_add_head(&g_periodic_qh_head[bus->hcd.hcd_id], qh); + + EHCI_HCOR->usbcmd |= EHCI_USBCMD_PSEN; + + usb_osal_leave_critical_section(flags); + return qh; +} + +static void ehci_urb_waitup(struct usbh_bus *bus, struct usbh_urb *urb) +{ + struct ehci_qh_hw *qh; + + qh = (struct ehci_qh_hw *)urb->hcpriv; + + qh->remove_in_iaad = 0; + + if (urb->timeout) { + usb_osal_sem_give(qh->waitsem); + } else { + ehci_qh_free(bus, qh); + } + + if (urb->complete) { + if (urb->errorcode < 0) { + urb->complete(urb->arg, urb->errorcode); + } else { + urb->complete(urb->arg, urb->actual_length); + } + } +} + +static void ehci_qh_scan_qtds(struct usbh_bus *bus, struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) +{ + struct ehci_qtd_hw *qtd; + + (void)bus; + + ehci_qh_remove(qhead, qh); + + qtd = EHCI_ADDR2QTD(qh->first_qtd); + + while (qtd) { + qtd->urb->actual_length += (qtd->length - ((qtd->hw.token & QTD_TOKEN_NBYTES_MASK) >> QTD_TOKEN_NBYTES_SHIFT)); + + qtd = EHCI_ADDR2QTD(qtd->hw.next_qtd); + } +} + +static void ehci_check_qh(struct usbh_bus *bus, struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) +{ + struct usbh_urb *urb; + struct ehci_qtd_hw *qtd; + uint32_t token; + + qtd = EHCI_ADDR2QTD(qh->first_qtd); + + if (qtd == NULL) { + return; + } + + while (qtd) { +#if defined(CONFIG_USB_EHCI_DESC_DCACHE_ENABLE) + usb_dcache_invalidate((uintptr_t)&qtd->hw, CONFIG_USB_EHCI_ALIGN_SIZE); +#endif + token = qtd->hw.token; + + if (token & QTD_TOKEN_STATUS_ERRORS) { + break; + } else if (token & QTD_TOKEN_STATUS_ACTIVE) { + return; + } + + qtd = EHCI_ADDR2QTD(qtd->hw.next_qtd); + } + + urb = qh->urb; + + if ((token & QTD_TOKEN_STATUS_ERRORS) == 0) { + if (token & QTD_TOKEN_TOGGLE) { + urb->data_toggle = true; + } else { + urb->data_toggle = false; + } + urb->errorcode = 0; + } else { + if (token & QTD_TOKEN_STATUS_BABBLE) { + urb->errorcode = -USB_ERR_BABBLE; + urb->data_toggle = 0; + } else if (token & QTD_TOKEN_STATUS_HALTED) { + urb->errorcode = -USB_ERR_STALL; + urb->data_toggle = 0; + } else if (token & (QTD_TOKEN_STATUS_DBERR | QTD_TOKEN_STATUS_XACTERR)) { + urb->errorcode = -USB_ERR_IO; + } + } + + ehci_qh_scan_qtds(bus, qhead, qh); + + if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + ehci_urb_waitup(bus, urb); + } else { + qh->remove_in_iaad = 1; + + EHCI_HCOR->usbcmd |= EHCI_USBCMD_IAAD; + } +} + +static void ehci_kill_qh(struct usbh_bus *bus, struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) +{ + (void)bus; + + ehci_qh_remove(qhead, qh); +} + +static int usbh_reset_port(struct usbh_bus *bus, const uint8_t port) +{ + volatile uint32_t timeout = 0; + uint32_t regval; + +#if defined(CONFIG_USB_EHCI_HPMICRO) && CONFIG_USB_EHCI_HPMICRO + if ((*(volatile uint32_t *)(bus->hcd.reg_base + 0x224) & 0xc0) == (2 << 6)) { /* Hardcode for hpm */ + EHCI_HCOR->portsc[port - 1] |= (1 << 29); + } else { + EHCI_HCOR->portsc[port - 1] &= ~(1 << 29); + } +#endif + regval = EHCI_HCOR->portsc[port - 1]; + regval &= ~EHCI_PORTSC_PE; + regval |= EHCI_PORTSC_RESET; + EHCI_HCOR->portsc[port - 1] = regval; + usb_osal_msleep(55); + + EHCI_HCOR->portsc[port - 1] &= ~EHCI_PORTSC_RESET; + while ((EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_RESET) != 0) { + usb_osal_msleep(1); + timeout++; + if (timeout > 100) { + return -USB_ERR_TIMEOUT; + } + } + + return 0; +} + +__WEAK void usb_hc_low_level_init(struct usbh_bus *bus) +{ + (void)bus; +} + +__WEAK void usb_hc_low_level2_init(struct usbh_bus *bus) +{ + (void)bus; +} + +__WEAK void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + (void)bus; +} + +int usb_hc_init(struct usbh_bus *bus) +{ + struct ehci_qh_hw *qh; + struct ehci_qtd_hw *qtd; + + volatile uint32_t timeout = 0; + uint32_t regval; + + memset(&g_ehci_hcd[bus->hcd.hcd_id], 0, sizeof(struct ehci_hcd)); + memset(ehci_qh_pool[bus->hcd.hcd_id], 0, sizeof(struct ehci_qh_hw) * CONFIG_USB_EHCI_QH_NUM); + memset(ehci_qtd_pool[bus->hcd.hcd_id], 0, sizeof(struct ehci_qtd_hw) * CONFIG_USB_EHCI_QTD_NUM); + + for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) { + qh = &ehci_qh_pool[bus->hcd.hcd_id][index]; + if ((uint32_t)&qh->hw % 32) { + USB_LOG_ERR("struct ehci_qh_hw is not align 32\r\n"); + return -USB_ERR_INVAL; + } + } + + for (uint8_t index = 0; index < CONFIG_USB_EHCI_QTD_NUM; index++) { + qtd = &ehci_qtd_pool[bus->hcd.hcd_id][index]; + if ((uint32_t)&qtd->hw % 32) { + USB_LOG_ERR("struct ehci_qtd_hw is not align 32\r\n"); + return -USB_ERR_INVAL; + } + } + + for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) { + qh = &ehci_qh_pool[bus->hcd.hcd_id][index]; + qh->waitsem = usb_osal_sem_create(0); + } + + memset(&g_async_qh_head[bus->hcd.hcd_id], 0, sizeof(struct ehci_qh_hw)); + g_async_qh_head[bus->hcd.hcd_id].hw.hlp = QH_HLP_QH(&g_async_qh_head[bus->hcd.hcd_id]); + g_async_qh_head[bus->hcd.hcd_id].hw.epchar = QH_EPCHAR_H; + g_async_qh_head[bus->hcd.hcd_id].hw.overlay.next_qtd = QTD_LIST_END; + g_async_qh_head[bus->hcd.hcd_id].hw.overlay.alt_next_qtd = QTD_LIST_END; + g_async_qh_head[bus->hcd.hcd_id].hw.overlay.token = QTD_TOKEN_STATUS_HALTED; + g_async_qh_head[bus->hcd.hcd_id].first_qtd = QTD_LIST_END; + + memset(g_framelist[bus->hcd.hcd_id], 0, sizeof(uint32_t) * CONFIG_USB_EHCI_FRAME_LIST_SIZE); + + memset(&g_periodic_qh_head[bus->hcd.hcd_id], 0, sizeof(struct ehci_qh_hw)); + g_periodic_qh_head[bus->hcd.hcd_id].hw.hlp = QH_HLP_END; + g_periodic_qh_head[bus->hcd.hcd_id].hw.epchar = QH_EPCAPS_SSMASK(1); + g_periodic_qh_head[bus->hcd.hcd_id].hw.overlay.next_qtd = QTD_LIST_END; + g_periodic_qh_head[bus->hcd.hcd_id].hw.overlay.alt_next_qtd = QTD_LIST_END; + g_periodic_qh_head[bus->hcd.hcd_id].hw.overlay.token = QTD_TOKEN_STATUS_HALTED; + g_periodic_qh_head[bus->hcd.hcd_id].first_qtd = QTD_LIST_END; + + for (uint32_t i = 0; i < CONFIG_USB_EHCI_FRAME_LIST_SIZE; i++) { + g_framelist[bus->hcd.hcd_id][i] = QH_HLP_QH(&g_periodic_qh_head[bus->hcd.hcd_id]); + } + +#if defined(CONFIG_USB_EHCI_DESC_DCACHE_ENABLE) + usb_dcache_clean((uintptr_t)&g_async_qh_head[bus->hcd.hcd_id].hw, CONFIG_USB_EHCI_ALIGN_SIZE); + usb_dcache_clean((uintptr_t)&g_periodic_qh_head[bus->hcd.hcd_id].hw, CONFIG_USB_EHCI_ALIGN_SIZE); + usb_dcache_clean((uintptr_t)g_framelist[bus->hcd.hcd_id], sizeof(uint32_t) * CONFIG_USB_EHCI_FRAME_LIST_SIZE); +#endif + + usb_hc_low_level_init(bus); + + USB_LOG_INFO("EHCI HCIVERSION:0x%04x\r\n", (unsigned int)EHCI_HCCR->hciversion); + USB_LOG_INFO("EHCI HCSPARAMS:0x%06x\r\n", (unsigned int)EHCI_HCCR->hcsparams); + USB_LOG_INFO("EHCI HCCPARAMS:0x%04x\r\n", (unsigned int)EHCI_HCCR->hccparams); + + g_ehci_hcd[bus->hcd.hcd_id].ppc = (EHCI_HCCR->hcsparams & EHCI_HCSPARAMS_PPC) ? true : false; + g_ehci_hcd[bus->hcd.hcd_id].n_ports = (EHCI_HCCR->hcsparams & EHCI_HCSPARAMS_NPORTS_MASK) >> EHCI_HCSPARAMS_NPORTS_SHIFT; + g_ehci_hcd[bus->hcd.hcd_id].n_cc = (EHCI_HCCR->hcsparams & EHCI_HCSPARAMS_NCC_MASK) >> EHCI_HCSPARAMS_NCC_SHIFT; + g_ehci_hcd[bus->hcd.hcd_id].n_pcc = (EHCI_HCCR->hcsparams & EHCI_HCSPARAMS_NPCC_MASK) >> EHCI_HCSPARAMS_NPCC_SHIFT; + g_ehci_hcd[bus->hcd.hcd_id].has_tt = g_ehci_hcd[bus->hcd.hcd_id].n_cc ? false : true; + g_ehci_hcd[bus->hcd.hcd_id].hcor_offset = EHCI_HCCR->caplength; + + USB_LOG_INFO("EHCI ppc:%u, n_ports:%u, n_cc:%u, n_pcc:%u\r\n", + g_ehci_hcd[bus->hcd.hcd_id].ppc, + g_ehci_hcd[bus->hcd.hcd_id].n_ports, + g_ehci_hcd[bus->hcd.hcd_id].n_cc, + g_ehci_hcd[bus->hcd.hcd_id].n_pcc); + + EHCI_HCOR->usbcmd &= ~EHCI_USBCMD_RUN; + usb_osal_msleep(2); + EHCI_HCOR->usbcmd |= EHCI_USBCMD_HCRESET; + while (EHCI_HCOR->usbcmd & EHCI_USBCMD_HCRESET) { + usb_osal_msleep(1); + timeout++; + if (timeout > 100) { + return -USB_ERR_TIMEOUT; + } + } + + EHCI_HCOR->usbintr = 0; + EHCI_HCOR->usbsts = EHCI_HCOR->usbsts; + + usb_hc_low_level2_init(bus); + + /* Set the Current Asynchronous List Address. */ + EHCI_HCOR->asynclistaddr = EHCI_PTR2ADDR(&g_async_qh_head[bus->hcd.hcd_id]); + /* Set the Periodic Frame List Base Address. */ + EHCI_HCOR->periodiclistbase = EHCI_PTR2ADDR(g_framelist[bus->hcd.hcd_id]); + + regval = EHCI_HCOR->usbcmd; + regval &= ~(EHCI_USBCMD_ITHRE_MASK | EHCI_USBCMD_FLSIZE_MASK); +#if CONFIG_USB_EHCI_FRAME_LIST_SIZE == 1024 + regval |= EHCI_USBCMD_FLSIZE_1024; +#elif CONFIG_USB_EHCI_FRAME_LIST_SIZE == 512 + regval |= EHCI_USBCMD_FLSIZE_512; +#elif CONFIG_USB_EHCI_FRAME_LIST_SIZE == 256 + regval |= EHCI_USBCMD_FLSIZE_256; +#else +#error Unsupported frame size list size +#endif + +#if !defined(CONFIG_USB_EHCI_HPMICRO) || !CONFIG_USB_EHCI_HPMICRO + regval |= EHCI_USBCMD_ITHRE_1MF; +#endif + regval |= EHCI_USBCMD_ASEN; + regval |= EHCI_USBCMD_PSEN; + regval |= EHCI_USBCMD_RUN; + EHCI_HCOR->usbcmd = regval; + +#ifdef CONFIG_USB_EHCI_CONFIGFLAG + EHCI_HCOR->configflag = EHCI_CONFIGFLAG; +#endif + /* Wait for the EHCI to run (no longer report halted) */ + timeout = 0; + while (EHCI_HCOR->usbsts & EHCI_USBSTS_HALTED) { + usb_osal_msleep(1); + timeout++; + if (timeout > 100) { + return -USB_ERR_TIMEOUT; + } + } + + if (g_ehci_hcd[bus->hcd.hcd_id].ppc) { + for (uint8_t port = 0; port < g_ehci_hcd[bus->hcd.hcd_id].n_ports; port++) { + regval = EHCI_HCOR->portsc[port]; + regval |= EHCI_PORTSC_PP; + regval &= ~(EHCI_PORTSC_CSC | EHCI_PORTSC_PEC | EHCI_PORTSC_OCC); + EHCI_HCOR->portsc[port] = regval; + } + } + + if (g_ehci_hcd[bus->hcd.hcd_id].has_tt) { +#ifdef CONFIG_USB_EHCI_WITH_OHCI + USB_LOG_INFO("EHCI uses tt for ls/fs device, so cannot enable this macro\r\n"); + return -USB_ERR_INVAL; +#endif + } + + if (g_ehci_hcd[bus->hcd.hcd_id].has_tt) { + USB_LOG_INFO("EHCI uses tt for ls/fs device\r\n"); + } else { +#ifdef CONFIG_USB_EHCI_WITH_OHCI + USB_LOG_INFO("EHCI uses companion controller for ls/fs device\r\n"); + ohci_init(bus); +#else + USB_LOG_WRN("Do not enable companion controller, you should use a hub to support ls/fs device\r\n"); +#endif + } + + /* Enable EHCI interrupts. */ + EHCI_HCOR->usbintr = EHCI_USBIE_INT | EHCI_USBIE_ERR | EHCI_USBIE_PCD | EHCI_USBIE_FATAL | EHCI_USBIE_IAA; + return 0; +} + +int usb_hc_deinit(struct usbh_bus *bus) +{ + struct ehci_qh_hw *qh; + + volatile uint32_t timeout = 0; + uint32_t regval; + + EHCI_HCOR->usbintr = 0; + + regval = EHCI_HCOR->usbcmd; + regval &= ~EHCI_USBCMD_ASEN; + regval &= ~EHCI_USBCMD_PSEN; + regval &= ~EHCI_USBCMD_RUN; + EHCI_HCOR->usbcmd = regval; + + while ((EHCI_HCOR->usbsts & (EHCI_USBSTS_PSS | EHCI_USBSTS_ASS)) || ((EHCI_HCOR->usbsts & EHCI_USBSTS_HALTED) == 0)) { + usb_osal_msleep(1); + timeout++; + if (timeout > 100) { + return -USB_ERR_TIMEOUT; + } + } + + if (g_ehci_hcd[bus->hcd.hcd_id].ppc) { + for (uint8_t port = 0; port < g_ehci_hcd[bus->hcd.hcd_id].n_ports; port++) { + regval = EHCI_HCOR->portsc[port]; + regval &= ~EHCI_PORTSC_PP; + EHCI_HCOR->portsc[port] = regval; + } + } + +#ifdef CONFIG_USB_EHCI_CONFIGFLAG + EHCI_HCOR->configflag = 0; +#endif + + EHCI_HCOR->usbsts = EHCI_HCOR->usbsts; + EHCI_HCOR->usbcmd |= EHCI_USBCMD_HCRESET; + + for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) { + qh = &ehci_qh_pool[bus->hcd.hcd_id][index]; + usb_osal_sem_delete(qh->waitsem); + } + +#ifdef CONFIG_USB_EHCI_WITH_OHCI + ohci_deinit(bus); +#endif + + usb_hc_low_level_deinit(bus); + return 0; +} + +uint16_t usbh_get_frame_number(struct usbh_bus *bus) +{ +#ifdef CONFIG_USB_EHCI_WITH_OHCI + if (EHCI_HCOR->portsc[0] & EHCI_PORTSC_OWNER) { + return ohci_get_frame_number(bus); + } +#endif + + return (((EHCI_HCOR->frindex & EHCI_FRINDEX_MASK) >> 3) & 0x3ff); +} + +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) +{ + uint8_t nports; + uint8_t port; + uint32_t temp, status; + + nports = g_ehci_hcd[bus->hcd.hcd_id].n_ports; + + port = setup->wIndex; + + temp = EHCI_HCOR->portsc[port - 1]; + +#ifdef CONFIG_USB_EHCI_WITH_OHCI + if (temp & EHCI_PORTSC_OWNER) { + return ohci_roothub_control(bus, setup, buf); + } + + if ((temp & EHCI_PORTSC_LSTATUS_MASK) == EHCI_PORTSC_LSTATUS_KSTATE) { + EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_OWNER; + + while (!(EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_OWNER)) { + } + USB_LOG_INFO("Switch port %u to OHCI\r\n", port); + return ohci_roothub_control(bus, setup, buf); + } +#endif + if (setup->bmRequestType & USB_REQUEST_RECIPIENT_DEVICE) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_SET_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_GET_DESCRIPTOR: + break; + case HUB_REQUEST_GET_STATUS: + memset(buf, 0, 4); + break; + default: + break; + } + } else if (setup->bmRequestType & USB_REQUEST_RECIPIENT_OTHER) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_ENABLE: + EHCI_HCOR->portsc[port - 1] &= ~EHCI_PORTSC_PE; + break; + case HUB_PORT_FEATURE_SUSPEND: + EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_RESUME; + usb_osal_msleep(20); + EHCI_HCOR->portsc[port - 1] &= ~EHCI_PORTSC_RESUME; + while (EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_RESUME) { + } + + temp = EHCI_HCOR->usbcmd; + temp |= EHCI_USBCMD_ASEN; + temp |= EHCI_USBCMD_PSEN; + temp |= EHCI_USBCMD_RUN; + EHCI_HCOR->usbcmd = temp; + + while ((EHCI_HCOR->usbcmd & EHCI_USBCMD_RUN) == 0) { + } + + case HUB_PORT_FEATURE_C_SUSPEND: + break; + case HUB_PORT_FEATURE_POWER: + EHCI_HCOR->portsc[port - 1] &= ~EHCI_PORTSC_PP; + break; + case HUB_PORT_FEATURE_C_CONNECTION: + EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_CSC; + break; + case HUB_PORT_FEATURE_C_ENABLE: + EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_PEC; + break; + case HUB_PORT_FEATURE_C_OVER_CURREN: + EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_OCC; + break; + case HUB_PORT_FEATURE_C_RESET: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_SET_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_SUSPEND: + temp = EHCI_HCOR->usbcmd; + temp &= ~EHCI_USBCMD_ASEN; + temp &= ~EHCI_USBCMD_PSEN; + temp &= ~EHCI_USBCMD_RUN; + EHCI_HCOR->usbcmd = temp; + + while (EHCI_HCOR->usbcmd & EHCI_USBCMD_RUN) { + } + + EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_SUSPEND; + while ((EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_SUSPEND) == 0) { + } + break; + case HUB_PORT_FEATURE_POWER: + EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_PP; + break; + case HUB_PORT_FEATURE_RESET: + usbh_reset_port(bus, port); +#ifdef CONFIG_USB_EHCI_WITH_OHCI + if (!(EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_PE)) { + EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_OWNER; + + while (!(EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_OWNER)) { + } + + USB_LOG_INFO("Switch port %u to OHCI\r\n", port); + return -USB_ERR_NOTSUPP; + } +#endif + break; + + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_GET_STATUS: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + temp = EHCI_HCOR->portsc[port - 1]; + + status = 0; + if (temp & EHCI_PORTSC_CSC) { + status |= (1 << HUB_PORT_FEATURE_C_CONNECTION); + } + if (temp & EHCI_PORTSC_PEC) { + status |= (1 << HUB_PORT_FEATURE_C_ENABLE); + } + if (temp & EHCI_PORTSC_OCC) { + status |= (1 << HUB_PORT_FEATURE_C_OVER_CURREN); + } + + if (temp & EHCI_PORTSC_CCS) { + status |= (1 << HUB_PORT_FEATURE_CONNECTION); + } + if (temp & EHCI_PORTSC_PE) { + status |= (1 << HUB_PORT_FEATURE_ENABLE); + + if (usbh_get_port_speed(bus, port) == USB_SPEED_LOW) { + status |= (1 << HUB_PORT_FEATURE_LOWSPEED); + } else if (usbh_get_port_speed(bus, port) == USB_SPEED_HIGH) { + status |= (1 << HUB_PORT_FEATURE_HIGHSPEED); + } + } + if (temp & EHCI_PORTSC_SUSPEND) { + status |= (1 << HUB_PORT_FEATURE_SUSPEND); + } + if (temp & EHCI_PORTSC_OCA) { + status |= (1 << HUB_PORT_FEATURE_OVERCURRENT); + } + if (temp & EHCI_PORTSC_RESET) { + status |= (1 << HUB_PORT_FEATURE_RESET); + } + if (temp & EHCI_PORTSC_PP || !(EHCI_HCCR->hcsparams & EHCI_HCSPARAMS_PPC)) { + status |= (1 << HUB_PORT_FEATURE_POWER); + } + memcpy(buf, &status, 4); + break; + default: + break; + } + } + return 0; +} + +int usbh_submit_urb(struct usbh_urb *urb) +{ + struct ehci_qh_hw *qh = NULL; + size_t flags; + int ret = 0; + struct usbh_hub *hub; + struct usbh_hubport *hport; + struct usbh_bus *bus; + + if (!urb || !urb->hport || !urb->ep || !urb->hport->bus) { + return -USB_ERR_INVAL; + } + +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)urb->setup % CONFIG_USB_ALIGN_SIZE) && + !((uintptr_t)urb->transfer_buffer % CONFIG_USB_ALIGN_SIZE), + "urb->setup or urb->transfer_buffer is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + bus = urb->hport->bus; + + /* find active hubport in roothub */ + hport = urb->hport; + hub = urb->hport->parent; + while (!hub->is_roothub) { + hport = hub->parent; + hub = hub->parent->parent; + } + +#ifdef CONFIG_USB_EHCI_WITH_OHCI + if (EHCI_HCOR->portsc[hport->port - 1] & EHCI_PORTSC_OWNER) { + return ohci_submit_urb(urb); + } +#endif + + if (!urb->hport->connected || !(EHCI_HCOR->portsc[hport->port - 1] & EHCI_PORTSC_CCS)) { + return -USB_ERR_NOTCONN; + } + + if (urb->errorcode == -USB_ERR_BUSY) { + return -USB_ERR_BUSY; + } + + flags = usb_osal_enter_critical_section(); + + urb->hcpriv = NULL; + urb->errorcode = -USB_ERR_BUSY; + urb->actual_length = 0; + + usb_osal_leave_critical_section(flags); + + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + qh = ehci_control_urb_init(bus, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + if (qh == NULL) { + return -USB_ERR_NOMEM; + } + break; + case USB_ENDPOINT_TYPE_BULK: + qh = ehci_bulk_urb_init(bus, urb, urb->transfer_buffer, urb->transfer_buffer_length); + if (qh == NULL) { + return -USB_ERR_NOMEM; + } + break; + case USB_ENDPOINT_TYPE_INTERRUPT: + qh = ehci_intr_urb_init(bus, urb, urb->transfer_buffer, urb->transfer_buffer_length); + if (qh == NULL) { + return -USB_ERR_NOMEM; + } + break; + case USB_ENDPOINT_TYPE_ISOCHRONOUS: +#ifdef CONFIG_USB_EHCI_ISO + ret = ehci_iso_urb_init(bus, urb); +#endif + break; + default: + break; + } + + if (urb->timeout > 0) { + /* wait until timeout or sem give */ + ret = usb_osal_sem_take(qh->waitsem, urb->timeout); + if (ret < 0) { + goto errout_timeout; + } + urb->timeout = 0; + ret = urb->errorcode; + /* we can free qh when waitsem is done */ + ehci_qh_free(bus, qh); + } + return ret; +errout_timeout: + urb->timeout = 0; + usbh_kill_urb(urb); + return ret; +} + +int usbh_kill_urb(struct usbh_urb *urb) +{ + struct ehci_qh_hw *qh; + struct usbh_bus *bus; + size_t flags; + bool remove_in_iaad = false; + + if (!urb || !urb->hport || !urb->hcpriv || !urb->hport->bus) { + return -USB_ERR_INVAL; + } + + bus = urb->hport->bus; + +#ifdef CONFIG_USB_EHCI_WITH_OHCI + if (EHCI_HCOR->portsc[urb->hport->port - 1] & EHCI_PORTSC_OWNER) { + return ohci_kill_urb(urb); + } +#endif + + flags = usb_osal_enter_critical_section(); + + EHCI_HCOR->usbcmd &= ~(EHCI_USBCMD_PSEN | EHCI_USBCMD_ASEN); + + if ((USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) || (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_BULK)) { + qh = EHCI_ADDR2QH(g_async_qh_head[bus->hcd.hcd_id].hw.hlp); + while ((qh != &g_async_qh_head[bus->hcd.hcd_id]) && qh) { + if (qh->urb == urb) { + remove_in_iaad = true; + ehci_kill_qh(bus, &g_async_qh_head[bus->hcd.hcd_id], qh); + } + qh = EHCI_ADDR2QH(qh->hw.hlp); + } + } else if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + qh = EHCI_ADDR2QH(g_periodic_qh_head[bus->hcd.hcd_id].hw.hlp); + while (qh) { + if (qh->urb == urb) { + ehci_kill_qh(bus, &g_periodic_qh_head[bus->hcd.hcd_id], qh); + } + qh = EHCI_ADDR2QH(qh->hw.hlp); + } + } else { +#ifdef CONFIG_USB_EHCI_ISO + ehci_kill_iso_urb(bus, urb); + EHCI_HCOR->usbcmd |= (EHCI_USBCMD_PSEN | EHCI_USBCMD_ASEN); + usb_osal_leave_critical_section(flags); + return 0; +#endif + } + + EHCI_HCOR->usbcmd |= (EHCI_USBCMD_PSEN | EHCI_USBCMD_ASEN); + + qh = (struct ehci_qh_hw *)urb->hcpriv; + qh->remove_in_iaad = 0; + urb->errorcode = -USB_ERR_SHUTDOWN; + + if (urb->timeout) { + usb_osal_sem_give(qh->waitsem); + } else { + ehci_qh_free(bus, qh); + } + + if (remove_in_iaad) { + volatile uint32_t timeout = 0; + EHCI_HCOR->usbsts = EHCI_USBSTS_IAA; + EHCI_HCOR->usbcmd |= EHCI_USBCMD_IAAD; + while (!(EHCI_HCOR->usbsts & EHCI_USBSTS_IAA)) { + timeout++; + if (timeout > 200000) { + USB_LOG_ERR("iaad timeout\r\n"); + usb_osal_leave_critical_section(flags); + return -USB_ERR_TIMEOUT; + } + } + EHCI_HCOR->usbsts = EHCI_USBSTS_IAA; + } + + if (urb->complete) { + urb->complete(urb->arg, urb->errorcode); + } + + usb_osal_leave_critical_section(flags); + + return 0; +} + +static void ehci_scan_async_list(struct usbh_bus *bus) +{ + struct ehci_qh_hw *qh; + + qh = EHCI_ADDR2QH(g_async_qh_head[bus->hcd.hcd_id].hw.hlp); + while ((qh != &g_async_qh_head[bus->hcd.hcd_id]) && qh) { + if (qh->urb) { + ehci_check_qh(bus, &g_async_qh_head[bus->hcd.hcd_id], qh); + } + qh = EHCI_ADDR2QH(qh->hw.hlp); + } +} + +static void ehci_scan_periodic_list(struct usbh_bus *bus) +{ + struct ehci_qh_hw *qh; + + qh = EHCI_ADDR2QH(g_periodic_qh_head[bus->hcd.hcd_id].hw.hlp); + while (qh) { + if (qh->urb) { + ehci_check_qh(bus, &g_periodic_qh_head[bus->hcd.hcd_id], qh); + } + qh = EHCI_ADDR2QH(qh->hw.hlp); + } +} + +void USBH_IRQHandler(uint8_t busid) +{ + uint32_t usbsts; + struct usbh_bus *bus; + + bus = &g_usbhost_bus[busid]; + + usbsts = EHCI_HCOR->usbsts & EHCI_HCOR->usbintr; + EHCI_HCOR->usbsts = usbsts; + + if (usbsts & EHCI_USBSTS_INT) { + ehci_scan_async_list(bus); + ehci_scan_periodic_list(bus); +#ifdef CONFIG_USB_EHCI_ISO + ehci_scan_isochronous_list(bus); +#endif + } + + if (usbsts & EHCI_USBSTS_ERR) { + ehci_scan_async_list(bus); + ehci_scan_periodic_list(bus); +#ifdef CONFIG_USB_EHCI_ISO + ehci_scan_isochronous_list(bus); +#endif + } + + if (usbsts & EHCI_USBSTS_PCD) { + for (int port = 0; port < g_ehci_hcd[bus->hcd.hcd_id].n_ports; port++) { + uint32_t portsc = EHCI_HCOR->portsc[port]; + + if (portsc & EHCI_PORTSC_CSC) { + if ((portsc & EHCI_PORTSC_CCS) == EHCI_PORTSC_CCS) { + } else { +#if defined(CONFIG_USB_EHCI_NXP) + /* kUSB_ControllerEhci0 and kUSB_ControllerEhci1*/ + extern void USB_EhcihostPhyDisconnectDetectCmd(uint8_t controllerId, uint8_t enable); + USB_EhcihostPhyDisconnectDetectCmd(2 + busid, 0); +#endif + } + bus->hcd.roothub.int_buffer[0] |= (1 << (port + 1)); + usbh_hub_thread_wakeup(&bus->hcd.roothub); + } + } + } + + if (usbsts & EHCI_USBSTS_IAA) { + for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) { + struct ehci_qh_hw *qh = &ehci_qh_pool[bus->hcd.hcd_id][index]; + if (qh->remove_in_iaad) { + ehci_urb_waitup(bus, qh->urb); + } + } + } + + if (usbsts & EHCI_USBSTS_FATAL) { + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ehci/usb_hc_ehci.h b/src/lib/CherryUSB/port/ehci/usb_hc_ehci.h new file mode 100644 index 000000000..3d4cb8cd3 --- /dev/null +++ b/src/lib/CherryUSB/port/ehci/usb_hc_ehci.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef _USB_EHCI_PRIV_H +#define _USB_EHCI_PRIV_H + +#include "usbh_core.h" +#include "usbh_hub.h" +#include "usb_ehci_reg.h" + +#define EHCI_HCCR ((struct ehci_hccr *)(uintptr_t)(bus->hcd.reg_base + CONFIG_USB_EHCI_HCCR_OFFSET)) +#define EHCI_HCOR ((struct ehci_hcor *)(uintptr_t)(bus->hcd.reg_base + CONFIG_USB_EHCI_HCCR_OFFSET + g_ehci_hcd[bus->hcd.hcd_id].hcor_offset)) + +#define EHCI_PTR2ADDR(x) ((uint32_t)(uintptr_t)(x) & ~0x1F) +#define EHCI_ADDR2QH(x) ((struct ehci_qh_hw *)(uintptr_t)((uint32_t)(x) & ~0x1F)) +#define EHCI_ADDR2QTD(x) ((struct ehci_qtd_hw *)(uintptr_t)((uint32_t)(x) & ~0x1F)) +#define EHCI_ADDR2ITD(x) ((struct ehci_itd_hw *)(uintptr_t)((uint32_t)(x) & ~0x1F)) + +#ifndef CONFIG_USB_EHCI_QH_NUM +#define CONFIG_USB_EHCI_QH_NUM 10 +#endif +#ifndef CONFIG_USB_EHCI_QTD_NUM +#define CONFIG_USB_EHCI_QTD_NUM (CONFIG_USB_EHCI_QH_NUM * 3) +#endif +#ifndef CONFIG_USB_EHCI_ITD_NUM +#define CONFIG_USB_EHCI_ITD_NUM 5 +#endif +#ifndef CONFIG_USB_EHCI_ISO_NUM +#define CONFIG_USB_EHCI_ISO_NUM 4 +#endif + +#if CONFIG_USB_ALIGN_SIZE <= 32 +#define CONFIG_USB_EHCI_ALIGN_SIZE 32 +#elif CONFIG_USB_ALIGN_SIZE <= 64 +#define CONFIG_USB_EHCI_ALIGN_SIZE 64 +#else +#error "CONFIG_USB_ALIGN_SIZE must be 32 or 64" +#endif + +#if CONFIG_USB_EHCI_QTD_NUM < 9 +#error CONFIG_USB_EHCI_QTD_NUM is too small, recommand CONFIG_USB_EHCI_QH_NUM * 3 +#endif + +struct ehci_qtd_hw { + struct ehci_qtd hw; +#if defined(CONFIG_USB_EHCI_DESC_DCACHE_ENABLE) && (CONFIG_USB_ALIGN_SIZE == 64) + uint8_t pad[32]; +#endif + bool inuse; + struct usbh_urb *urb; + uintptr_t bufaddr; + uint32_t length; +} __attribute__((aligned(CONFIG_USB_EHCI_ALIGN_SIZE))); + +struct ehci_qh_hw { + struct ehci_qh hw; +#if defined(CONFIG_USB_EHCI_DESC_DCACHE_ENABLE) + uint16_t pad[16]; +#endif + bool inuse; + uint32_t first_qtd; + struct usbh_urb *urb; + usb_osal_sem_t waitsem; + uint8_t remove_in_iaad; +} __attribute__((aligned(CONFIG_USB_EHCI_ALIGN_SIZE))); + +struct ehci_itd_hw { + struct ehci_itd hw; + struct usbh_urb *urb; + uint16_t start_frame; + uint8_t mf_unmask; + uint8_t mf_valid; + uint32_t pkt_idx[8]; + bool dir_in; +} __attribute__((aligned(CONFIG_USB_EHCI_ALIGN_SIZE))); + +struct ehci_iso_hw { + struct ehci_itd_hw itd_pool[CONFIG_USB_EHCI_ITD_NUM]; + uint32_t itd_num; +}; + +struct ehci_hcd { + bool ehci_iso_used[CONFIG_USB_EHCI_ISO_NUM]; + bool ppc; /* Port Power Control */ + bool has_tt; /* if use tt instead of Companion Controller */ + uint8_t n_cc; /* Number of Companion Controller */ + uint8_t n_pcc; /* Number of ports supported per companion host controller */ + uint8_t n_ports; + uint8_t hcor_offset; +}; + +extern struct ehci_hcd g_ehci_hcd[CONFIG_USBHOST_MAX_BUS]; +extern uint32_t g_framelist[CONFIG_USBHOST_MAX_BUS][USB_ALIGN_UP(CONFIG_USB_EHCI_FRAME_LIST_SIZE, 1024)]; +extern uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port); + +int ehci_iso_urb_init(struct usbh_bus *bus, struct usbh_urb *urb); +void ehci_kill_iso_urb(struct usbh_bus *bus, struct usbh_urb *urb); +void ehci_scan_isochronous_list(struct usbh_bus *bus); + +#endif diff --git a/src/lib/CherryUSB/port/fsdev/README.md b/src/lib/CherryUSB/port/fsdev/README.md new file mode 100644 index 000000000..95e9ac2e1 --- /dev/null +++ b/src/lib/CherryUSB/port/fsdev/README.md @@ -0,0 +1,30 @@ +# Note + +## Support Chip List + +## STM32 + +- STM32F042x6、STM32F048xx、STM32F070x6、STM32F070xb、STM32F072xb、STM32F078xx +- STM32F102x6、STM32F102xb、STM32F103x6、STM32F103xb、STM32F103xe、STM32F103xg +- STM32F302x8、STM32F302xc、STM32F302xe、STM32F373xc +- STM32g431xx、STM32g441xx、STM32g471xx、STM32g483xx、STM32g484xx、STM32gbk1cb +- STM32l052xx、STM32l053xx、STM32l062xx、STM32l063xx、STM32l072xx、STM32l073xx、STM32l082xx、STM32l083xx +- STM32l100xb、STM32l100xba、STM32l100xc、STM32l151xb、STM32l151xba、STM32l151xc、STM32l151xca、STM32l151xd、STM32l151xdx、STM32l151xe、STM32l152xb、STM32l152xba、STM32l152xc、STM32l152xa、STM32l152xd、STM32l152xdx、STM32l152xe、STM32l162xc、STM32l162xca、STM32l162xd、STM32l162xdx、STM32l162xe +- STM32l412xx、STM32l422xx、STM32l432xx、STM32l433xx、STM32l442xx、STM32l452xx、STM32l462xx +- STM32wb5mxx、STM32wb35xx、STM32wb55xx + +## AT32 + +- AT32F403xx、AT32F407xx、AT32F413xx + +## APM32 + +- APM32f10x + +## GD32 + +- GD32F10X + +## CH32 + +- CH32F10x、CH32V10x diff --git a/src/lib/CherryUSB/port/fsdev/usb_dc_fsdev.c b/src/lib/CherryUSB/port/fsdev/usb_dc_fsdev.c new file mode 100644 index 000000000..3e1fa22b0 --- /dev/null +++ b/src/lib/CherryUSB/port/fsdev/usb_dc_fsdev.c @@ -0,0 +1,562 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" + +#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_LOG) +#error "fsdev cannot enable USB_DBG_LOG" +#endif + +#ifndef CONFIG_USBDEV_FSDEV_PMA_ACCESS +#error "please define CONFIG_USBDEV_FSDEV_PMA_ACCESS in usb_config.h" +#endif + +#define PMA_ACCESS CONFIG_USBDEV_FSDEV_PMA_ACCESS +#include "usb_fsdev_reg.h" + +#ifndef CONFIG_USB_FSDEV_RAM_SIZE +#define CONFIG_USB_FSDEV_RAM_SIZE 512 +#endif + +#undef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 8 + +#define USB ((USB_TypeDef *)g_usbdev_bus[0].reg_base) + +#define USB_BTABLE_SIZE (8 * CONFIG_USBDEV_EP_NUM) + +static void fsdev_write_pma(USB_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); +static void fsdev_read_pma(USB_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); + +/* Endpoint state */ +struct fsdev_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + uint16_t ep_pma_buf_len; /* Previously allocated buffer size */ + uint16_t ep_pma_addr; /* ep pmd allocated addr */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +/* Driver state */ +struct fsdev_udc { + struct usb_setup_packet setup; + volatile uint8_t dev_addr; /*!< USB Address */ + volatile uint32_t pma_offset; /*!< pma offset */ + struct fsdev_ep_state in_ep[CONFIG_USBDEV_EP_NUM]; /*!< IN endpoint parameters*/ + struct fsdev_ep_state out_ep[CONFIG_USBDEV_EP_NUM]; /*!< OUT endpoint parameters */ +} g_fsdev_udc; + +__WEAK void usb_dc_low_level_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + +int usb_dc_init(uint8_t busid) +{ + usb_dc_low_level_init(); + + /* Init Device */ + /* CNTR_FRES = 1 */ + USB->CNTR = (uint16_t)USB_CNTR_FRES; + + /* CNTR_FRES = 0 */ + USB->CNTR = 0U; + + /* Clear pending interrupts */ + USB->ISTR = 0U; + + /*Set Btable Address*/ + USB->BTABLE = BTABLE_ADDRESS; + + uint32_t winterruptmask; + + /* Set winterruptmask variable */ + winterruptmask = USB_CNTR_CTRM | USB_CNTR_WKUPM | + USB_CNTR_SUSPM | USB_CNTR_ERRM | + USB_CNTR_ESOFM | USB_CNTR_RESETM; + +#ifdef CONFIG_USBDEV_SOF_ENABLE + winterruptmask |= USB_CNTR_SOFM; +#endif + + /* Set interrupt mask */ + USB->CNTR = (uint16_t)winterruptmask; + + /* Enabling DP Pull-UP bit to Connect internal PU resistor on USB DP line */ + USB->BCDR |= (uint16_t)USB_BCDR_DPPU; + + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + /* disable all interrupts and force USB reset */ + USB->CNTR = (uint16_t)USB_CNTR_FRES; + + /* clear interrupt status register */ + USB->ISTR = 0U; + + /* switch-off device */ + USB->CNTR = (uint16_t)(USB_CNTR_FRES | USB_CNTR_PDWN); + + usb_dc_low_level_deinit(); + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + if (addr == 0U) { + /* set device address and enable function */ + USB->DADDR = (uint16_t)USB_DADDR_EF; + } + + g_fsdev_udc.dev_addr = addr; + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + return -1; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + return USB_SPEED_FULL; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + + USB_ASSERT_MSG(ep_idx < CONFIG_USBDEV_EP_NUM, "Ep addr %02x overflow", ep->bEndpointAddress); + USB_ASSERT_MSG(USB_GET_ENDPOINT_TYPE(ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS, "iso endpoint not support in fsdev"); + + uint16_t wEpRegVal; + + /* initialize Endpoint */ + switch (USB_GET_ENDPOINT_TYPE(ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + wEpRegVal = USB_EP_CONTROL; + break; + + case USB_ENDPOINT_TYPE_BULK: + wEpRegVal = USB_EP_BULK; + break; + + case USB_ENDPOINT_TYPE_INTERRUPT: + wEpRegVal = USB_EP_INTERRUPT; + break; + + case USB_ENDPOINT_TYPE_ISOCHRONOUS: + wEpRegVal = USB_EP_ISOCHRONOUS; + break; + + default: + return -1; + } + + PCD_SET_EPTYPE(USB, ep_idx, wEpRegVal); + + PCD_SET_EP_ADDRESS(USB, ep_idx, ep_idx); + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_fsdev_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_fsdev_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_fsdev_udc.out_ep[ep_idx].ep_enable = true; + if (g_fsdev_udc.out_ep[ep_idx].ep_mps > g_fsdev_udc.out_ep[ep_idx].ep_pma_buf_len) { + USB_ASSERT_MSG((g_fsdev_udc.pma_offset + g_fsdev_udc.out_ep[ep_idx].ep_mps) <= CONFIG_USB_FSDEV_RAM_SIZE, + "Ep pma %02x overflow", ep->bEndpointAddress); + + g_fsdev_udc.out_ep[ep_idx].ep_pma_buf_len = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_fsdev_udc.out_ep[ep_idx].ep_pma_addr = g_fsdev_udc.pma_offset; + /*Set the endpoint Receive buffer address */ + PCD_SET_EP_RX_ADDRESS(USB, ep_idx, g_fsdev_udc.pma_offset); + g_fsdev_udc.pma_offset += USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + } + /*Set the endpoint Receive buffer counter*/ + PCD_SET_EP_RX_CNT(USB, ep_idx, USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize)); + PCD_CLEAR_RX_DTOG(USB, ep_idx); + } else { + g_fsdev_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_fsdev_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_fsdev_udc.in_ep[ep_idx].ep_enable = true; + if (g_fsdev_udc.in_ep[ep_idx].ep_mps > g_fsdev_udc.in_ep[ep_idx].ep_pma_buf_len) { + USB_ASSERT_MSG((g_fsdev_udc.pma_offset + g_fsdev_udc.in_ep[ep_idx].ep_mps) <= CONFIG_USB_FSDEV_RAM_SIZE, + "Ep pma %02x overflow", ep->bEndpointAddress); + + g_fsdev_udc.in_ep[ep_idx].ep_pma_buf_len = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_fsdev_udc.in_ep[ep_idx].ep_pma_addr = g_fsdev_udc.pma_offset; + /*Set the endpoint Transmit buffer address */ + PCD_SET_EP_TX_ADDRESS(USB, ep_idx, g_fsdev_udc.pma_offset); + g_fsdev_udc.pma_offset += USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + } + + PCD_CLEAR_TX_DTOG(USB, ep_idx); + if (USB_GET_ENDPOINT_TYPE(ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USB, ep_idx, USB_EP_TX_NAK); + } else { + /* Configure TX Endpoint to disabled state */ + PCD_SET_EP_TX_STATUS(USB, ep_idx, USB_EP_TX_DIS); + } + } + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + PCD_CLEAR_RX_DTOG(USB, ep_idx); + + /* Configure DISABLE status for the Endpoint*/ + PCD_SET_EP_RX_STATUS(USB, ep_idx, USB_EP_RX_DIS); + } else { + PCD_CLEAR_TX_DTOG(USB, ep_idx); + + /* Configure DISABLE status for the Endpoint*/ + PCD_SET_EP_TX_STATUS(USB, ep_idx, USB_EP_TX_DIS); + } + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + PCD_SET_EP_RX_STATUS(USB, ep_idx, USB_EP_RX_STALL); + } else { + PCD_SET_EP_TX_STATUS(USB, ep_idx, USB_EP_TX_STALL); + } + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + PCD_CLEAR_RX_DTOG(USB, ep_idx); + /* Configure VALID status for the Endpoint */ + PCD_SET_EP_RX_STATUS(USB, ep_idx, USB_EP_RX_VALID); + } else { + PCD_CLEAR_TX_DTOG(USB, ep_idx); + + if (g_fsdev_udc.in_ep[ep_idx].ep_type != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USB, ep_idx, USB_EP_TX_NAK); + } + } + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + if (PCD_GET_EP_RX_STATUS(USB, ep_idx) & USB_EP_RX_STALL) { + *stalled = 1; + } else { + *stalled = 0; + } + } else { + if (PCD_GET_EP_TX_STATUS(USB, ep_idx) & USB_EP_TX_STALL) { + *stalled = 1; + } else { + *stalled = 0; + } + } + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + + if (!g_fsdev_udc.in_ep[ep_idx].ep_enable) { + return -2; + } + + g_fsdev_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_fsdev_udc.in_ep[ep_idx].xfer_len = data_len; + g_fsdev_udc.in_ep[ep_idx].actual_xfer_len = 0; + + data_len = MIN(data_len, g_fsdev_udc.in_ep[ep_idx].ep_mps); + + fsdev_write_pma(USB, (uint8_t *)data, g_fsdev_udc.in_ep[ep_idx].ep_pma_addr, (uint16_t)data_len); + PCD_SET_EP_TX_CNT(USB, ep_idx, (uint16_t)data_len); + PCD_SET_EP_TX_STATUS(USB, ep_idx, USB_EP_TX_VALID); + + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_fsdev_udc.out_ep[ep_idx].ep_enable) { + return -2; + } + + g_fsdev_udc.out_ep[ep_idx].xfer_buf = data; + g_fsdev_udc.out_ep[ep_idx].xfer_len = data_len; + g_fsdev_udc.out_ep[ep_idx].actual_xfer_len = 0; + + PCD_SET_EP_RX_STATUS(USB, ep_idx, USB_EP_RX_VALID); + + return 0; +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint16_t wIstr, wEPVal; + uint8_t ep_idx; + uint8_t read_count; + uint16_t write_count; + uint16_t store_ep[8]; + + wIstr = USB->ISTR; + if (wIstr & USB_ISTR_CTR) { + while ((USB->ISTR & USB_ISTR_CTR) != 0U) { + wIstr = USB->ISTR; + + /* extract highest priority endpoint number */ + ep_idx = (uint8_t)(wIstr & USB_ISTR_EP_ID); + + if (ep_idx == 0U) { + if ((wIstr & USB_ISTR_DIR) == 0U) { + PCD_CLEAR_TX_EP_CTR(USB, ep_idx); + + write_count = PCD_GET_EP_TX_CNT(USB, ep_idx); + + g_fsdev_udc.in_ep[ep_idx].xfer_buf += write_count; + g_fsdev_udc.in_ep[ep_idx].xfer_len -= write_count; + g_fsdev_udc.in_ep[ep_idx].actual_xfer_len += write_count; + + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_fsdev_udc.in_ep[ep_idx].actual_xfer_len); + + if (g_fsdev_udc.setup.wLength == 0) { + /* In status, start reading setup */ + usbd_ep_start_read(0, 0x00, NULL, 0); + } else if (g_fsdev_udc.setup.wLength && ((g_fsdev_udc.setup.bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_OUT)) { + /* In status, start reading setup */ + usbd_ep_start_read(0, 0x00, NULL, 0); + } + + if ((g_fsdev_udc.dev_addr > 0U) && (write_count == 0U)) { + USB->DADDR = ((uint16_t)g_fsdev_udc.dev_addr | USB_DADDR_EF); + g_fsdev_udc.dev_addr = 0U; + } + + } else { + wEPVal = PCD_GET_ENDPOINT(USB, ep_idx); + + if ((wEPVal & USB_EP_SETUP) != 0U) { + PCD_CLEAR_RX_EP_CTR(USB, ep_idx); + + read_count = PCD_GET_EP_RX_CNT(USB, ep_idx); + fsdev_read_pma(USB, (uint8_t *)&g_fsdev_udc.setup, g_fsdev_udc.out_ep[ep_idx].ep_pma_addr, (uint16_t)read_count); + + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_fsdev_udc.setup); + + } else if ((wEPVal & USB_EP_CTR_RX) != 0U) { + PCD_CLEAR_RX_EP_CTR(USB, ep_idx); + + read_count = PCD_GET_EP_RX_CNT(USB, ep_idx); + + fsdev_read_pma(USB, g_fsdev_udc.out_ep[ep_idx].xfer_buf, g_fsdev_udc.out_ep[ep_idx].ep_pma_addr, (uint16_t)read_count); + + g_fsdev_udc.out_ep[ep_idx].xfer_buf += read_count; + g_fsdev_udc.out_ep[ep_idx].xfer_len -= read_count; + g_fsdev_udc.out_ep[ep_idx].actual_xfer_len += read_count; + + usbd_event_ep_out_complete_handler(0, ep_idx, g_fsdev_udc.out_ep[ep_idx].actual_xfer_len); + + if (read_count == 0) { + /* Out status, start reading setup */ + usbd_ep_start_read(0, 0x00, NULL, 0); + } + } + } + } else { + wEPVal = PCD_GET_ENDPOINT(USB, ep_idx); + + if ((wEPVal & USB_EP_CTR_RX) != 0U) { + PCD_CLEAR_RX_EP_CTR(USB, ep_idx); + read_count = PCD_GET_EP_RX_CNT(USB, ep_idx); + fsdev_read_pma(USB, g_fsdev_udc.out_ep[ep_idx].xfer_buf, g_fsdev_udc.out_ep[ep_idx].ep_pma_addr, (uint16_t)read_count); + g_fsdev_udc.out_ep[ep_idx].xfer_buf += read_count; + g_fsdev_udc.out_ep[ep_idx].xfer_len -= read_count; + g_fsdev_udc.out_ep[ep_idx].actual_xfer_len += read_count; + + if ((read_count < g_fsdev_udc.out_ep[ep_idx].ep_mps) || + (g_fsdev_udc.out_ep[ep_idx].xfer_len == 0)) { + usbd_event_ep_out_complete_handler(0, ep_idx, g_fsdev_udc.out_ep[ep_idx].actual_xfer_len); + } else { + PCD_SET_EP_RX_STATUS(USB, ep_idx, USB_EP_RX_VALID); + } + } + + if ((wEPVal & USB_EP_CTR_TX) != 0U) { + PCD_CLEAR_TX_EP_CTR(USB, ep_idx); + write_count = PCD_GET_EP_TX_CNT(USB, ep_idx); + + g_fsdev_udc.in_ep[ep_idx].xfer_buf += write_count; + g_fsdev_udc.in_ep[ep_idx].xfer_len -= write_count; + g_fsdev_udc.in_ep[ep_idx].actual_xfer_len += write_count; + + if (g_fsdev_udc.in_ep[ep_idx].xfer_len == 0) { + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_fsdev_udc.in_ep[ep_idx].actual_xfer_len); + } else { + write_count = MIN(g_fsdev_udc.in_ep[ep_idx].xfer_len, g_fsdev_udc.in_ep[ep_idx].ep_mps); + fsdev_write_pma(USB, g_fsdev_udc.in_ep[ep_idx].xfer_buf, g_fsdev_udc.in_ep[ep_idx].ep_pma_addr, (uint16_t)write_count); + PCD_SET_EP_TX_CNT(USB, ep_idx, write_count); + PCD_SET_EP_TX_STATUS(USB, ep_idx, USB_EP_TX_VALID); + } + } + } + } + } + if (wIstr & USB_ISTR_RESET) { + memset(&g_fsdev_udc, 0, sizeof(struct fsdev_udc)); + g_fsdev_udc.pma_offset = USB_BTABLE_SIZE; + usbd_event_reset_handler(0); + /* start reading setup packet */ + PCD_SET_EP_RX_STATUS(USB, 0, USB_EP_RX_VALID); + USB->ISTR &= (uint16_t)(~USB_ISTR_RESET); + } + if (wIstr & USB_ISTR_PMAOVR) { + USB->ISTR &= (uint16_t)(~USB_ISTR_PMAOVR); + } + if (wIstr & USB_ISTR_ERR) { + USB->ISTR &= (uint16_t)(~USB_ISTR_ERR); + } + if (wIstr & USB_ISTR_WKUP) { + USB->CNTR &= (uint16_t) ~(USB_CNTR_LP_MODE); + USB->CNTR &= (uint16_t) ~(USB_CNTR_FSUSP); + + USB->ISTR &= (uint16_t)(~USB_ISTR_WKUP); + } + if (wIstr & USB_ISTR_SUSP) { + /* WA: To Clear Wakeup flag if raised with suspend signal */ + + /* Store Endpoint register */ + for (uint8_t i = 0U; i < 8U; i++) { + store_ep[i] = PCD_GET_ENDPOINT(USB, i); + } + + /* FORCE RESET */ + USB->CNTR |= (uint16_t)(USB_CNTR_FRES); + + /* CLEAR RESET */ + USB->CNTR &= (uint16_t)(~USB_CNTR_FRES); + + /* wait for reset flag in ISTR */ + while ((USB->ISTR & USB_ISTR_RESET) == 0U) { + } + + /* Clear Reset Flag */ + USB->ISTR &= (uint16_t)(~USB_ISTR_RESET); + /* Restore Registre */ + for (uint8_t i = 0U; i < 8U; i++) { + PCD_SET_ENDPOINT(USB, i, store_ep[i]); + } + + /* Force low-power mode in the macrocell */ + USB->CNTR |= (uint16_t)USB_CNTR_FSUSP; + + /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ + USB->ISTR &= (uint16_t)(~USB_ISTR_SUSP); + + USB->CNTR |= (uint16_t)USB_CNTR_LP_MODE; + } +#ifdef CONFIG_USBDEV_SOF_ENABLE + if (wIstr & USB_ISTR_SOF) { + USB->ISTR &= (uint16_t)(~USB_ISTR_SOF); + usbd_event_sof_handler(0); + } +#endif + if (wIstr & USB_ISTR_ESOF) { + USB->ISTR &= (uint16_t)(~USB_ISTR_ESOF); + } +} + +static void fsdev_write_pma(USB_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = ((uint32_t)wNBytes + 1U) >> 1; + uint32_t BaseAddr = (uint32_t)USBx; + uint32_t i, temp1, temp2; + __IO uint16_t *pdwVal; + uint8_t *pBuf = pbUsrBuf; + + pdwVal = (__IO uint16_t *)(BaseAddr + 0x400U + ((uint32_t)wPMABufAddr * PMA_ACCESS)); + + for (i = n; i != 0U; i--) { + temp1 = *pBuf; + pBuf++; + temp2 = temp1 | ((uint16_t)((uint16_t)*pBuf << 8)); + *pdwVal = (uint16_t)temp2; + pdwVal++; + +#if PMA_ACCESS > 1U + pdwVal++; +#endif + + pBuf++; + } +} + +/** + * @brief Copy data from packet memory area (PMA) to user memory buffer + * @param USBx USB peripheral instance register address. + * @param pbUsrBuf pointer to user memory area. + * @param wPMABufAddr address into PMA. + * @param wNBytes no. of bytes to be copied. + * @retval None + */ +static void fsdev_read_pma(USB_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = (uint32_t)wNBytes >> 1; + uint32_t BaseAddr = (uint32_t)USBx; + uint32_t i, temp; + __IO uint16_t *pdwVal; + uint8_t *pBuf = pbUsrBuf; + + pdwVal = (__IO uint16_t *)(BaseAddr + 0x400U + ((uint32_t)wPMABufAddr * PMA_ACCESS)); + + for (i = n; i != 0U; i--) { + temp = *(__IO uint16_t *)pdwVal; + pdwVal++; + *pBuf = (uint8_t)((temp >> 0) & 0xFFU); + pBuf++; + *pBuf = (uint8_t)((temp >> 8) & 0xFFU); + pBuf++; + +#if PMA_ACCESS > 1U + pdwVal++; +#endif + } + + if ((wNBytes % 2U) != 0U) { + temp = *pdwVal; + *pBuf = (uint8_t)((temp >> 0) & 0xFFU); + } +} diff --git a/src/lib/CherryUSB/port/fsdev/usb_fsdev_reg.h b/src/lib/CherryUSB/port/fsdev/usb_fsdev_reg.h new file mode 100644 index 000000000..c67cf5731 --- /dev/null +++ b/src/lib/CherryUSB/port/fsdev/usb_fsdev_reg.h @@ -0,0 +1,1684 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef __USB_FSDEV_REG_H__ +#define __USB_FSDEV_REG_H__ + +#define __IO volatile /*!< Defines 'read / write' permissions */ +/** + * @brief Universal Serial Bus Full Speed Device + */ + +typedef struct +{ + __IO uint16_t EP0R; /*!< USB Endpoint 0 register, Address offset: 0x00 */ + __IO uint16_t RESERVED0; /*!< Reserved */ + __IO uint16_t EP1R; /*!< USB Endpoint 1 register, Address offset: 0x04 */ + __IO uint16_t RESERVED1; /*!< Reserved */ + __IO uint16_t EP2R; /*!< USB Endpoint 2 register, Address offset: 0x08 */ + __IO uint16_t RESERVED2; /*!< Reserved */ + __IO uint16_t EP3R; /*!< USB Endpoint 3 register, Address offset: 0x0C */ + __IO uint16_t RESERVED3; /*!< Reserved */ + __IO uint16_t EP4R; /*!< USB Endpoint 4 register, Address offset: 0x10 */ + __IO uint16_t RESERVED4; /*!< Reserved */ + __IO uint16_t EP5R; /*!< USB Endpoint 5 register, Address offset: 0x14 */ + __IO uint16_t RESERVED5; /*!< Reserved */ + __IO uint16_t EP6R; /*!< USB Endpoint 6 register, Address offset: 0x18 */ + __IO uint16_t RESERVED6; /*!< Reserved */ + __IO uint16_t EP7R; /*!< USB Endpoint 7 register, Address offset: 0x1C */ + __IO uint16_t RESERVED7[17]; /*!< Reserved */ + __IO uint16_t CNTR; /*!< Control register, Address offset: 0x40 */ + __IO uint16_t RESERVED8; /*!< Reserved */ + __IO uint16_t ISTR; /*!< Interrupt status register, Address offset: 0x44 */ + __IO uint16_t RESERVED9; /*!< Reserved */ + __IO uint16_t FNR; /*!< Frame number register, Address offset: 0x48 */ + __IO uint16_t RESERVEDA; /*!< Reserved */ + __IO uint16_t DADDR; /*!< Device address register, Address offset: 0x4C */ + __IO uint16_t RESERVEDB; /*!< Reserved */ + __IO uint16_t BTABLE; /*!< Buffer Table address register, Address offset: 0x50 */ + __IO uint16_t RESERVEDC; /*!< Reserved */ + __IO uint16_t LPMCSR; /*!< LPM Control and Status register, Address offset: 0x54 */ + __IO uint16_t RESERVEDD; /*!< Reserved */ + __IO uint16_t BCDR; /*!< Battery Charging detector register, Address offset: 0x58 */ + __IO uint16_t RESERVEDE; /*!< Reserved */ +} USB_TypeDef; + +/******************************************************************************/ +/* */ +/* USB Device FS */ +/* */ +/******************************************************************************/ + +/*!< Endpoint-specific registers */ +#define USB_EP0R USB_BASE /*!< Endpoint 0 register address */ +#define USB_EP1R (USB_BASE + 0x00000004) /*!< Endpoint 1 register address */ +#define USB_EP2R (USB_BASE + 0x00000008) /*!< Endpoint 2 register address */ +#define USB_EP3R (USB_BASE + 0x0000000C) /*!< Endpoint 3 register address */ +#define USB_EP4R (USB_BASE + 0x00000010) /*!< Endpoint 4 register address */ +#define USB_EP5R (USB_BASE + 0x00000014) /*!< Endpoint 5 register address */ +#define USB_EP6R (USB_BASE + 0x00000018) /*!< Endpoint 6 register address */ +#define USB_EP7R (USB_BASE + 0x0000001C) /*!< Endpoint 7 register address */ + +/* bit positions */ +#define USB_EP_CTR_RX_Pos (15U) +#define USB_EP_CTR_RX_Msk (0x1UL << USB_EP_CTR_RX_Pos) /*!< 0x00008000 */ +#define USB_EP_CTR_RX USB_EP_CTR_RX_Msk /*!< EndPoint Correct TRansfer RX */ +#define USB_EP_DTOG_RX_Pos (14U) +#define USB_EP_DTOG_RX_Msk (0x1UL << USB_EP_DTOG_RX_Pos) /*!< 0x00004000 */ +#define USB_EP_DTOG_RX USB_EP_DTOG_RX_Msk /*!< EndPoint Data TOGGLE RX */ +#define USB_EPRX_STAT_Pos (12U) +#define USB_EPRX_STAT_Msk (0x3UL << USB_EPRX_STAT_Pos) /*!< 0x00003000 */ +#define USB_EPRX_STAT USB_EPRX_STAT_Msk /*!< EndPoint RX STATus bit field */ +#define USB_EP_SETUP_Pos (11U) +#define USB_EP_SETUP_Msk (0x1UL << USB_EP_SETUP_Pos) /*!< 0x00000800 */ +#define USB_EP_SETUP USB_EP_SETUP_Msk /*!< EndPoint SETUP */ +#define USB_EP_T_FIELD_Pos (9U) +#define USB_EP_T_FIELD_Msk (0x3UL << USB_EP_T_FIELD_Pos) /*!< 0x00000600 */ +#define USB_EP_T_FIELD USB_EP_T_FIELD_Msk /*!< EndPoint TYPE */ +#define USB_EP_KIND_Pos (8U) +#define USB_EP_KIND_Msk (0x1UL << USB_EP_KIND_Pos) /*!< 0x00000100 */ +#define USB_EP_KIND USB_EP_KIND_Msk /*!< EndPoint KIND */ +#define USB_EP_CTR_TX_Pos (7U) +#define USB_EP_CTR_TX_Msk (0x1UL << USB_EP_CTR_TX_Pos) /*!< 0x00000080 */ +#define USB_EP_CTR_TX USB_EP_CTR_TX_Msk /*!< EndPoint Correct TRansfer TX */ +#define USB_EP_DTOG_TX_Pos (6U) +#define USB_EP_DTOG_TX_Msk (0x1UL << USB_EP_DTOG_TX_Pos) /*!< 0x00000040 */ +#define USB_EP_DTOG_TX USB_EP_DTOG_TX_Msk /*!< EndPoint Data TOGGLE TX */ +#define USB_EPTX_STAT_Pos (4U) +#define USB_EPTX_STAT_Msk (0x3UL << USB_EPTX_STAT_Pos) /*!< 0x00000030 */ +#define USB_EPTX_STAT USB_EPTX_STAT_Msk /*!< EndPoint TX STATus bit field */ +#define USB_EPADDR_FIELD_Pos (0U) +#define USB_EPADDR_FIELD_Msk (0xFUL << USB_EPADDR_FIELD_Pos) /*!< 0x0000000F */ +#define USB_EPADDR_FIELD USB_EPADDR_FIELD_Msk /*!< EndPoint ADDRess FIELD */ + +/* EndPoint REGister MASK (no toggle fields) */ +#define USB_EPREG_MASK (USB_EP_CTR_RX|USB_EP_SETUP|USB_EP_T_FIELD|USB_EP_KIND|USB_EP_CTR_TX|USB_EPADDR_FIELD) + /*!< EP_TYPE[1:0] EndPoint TYPE */ +#define USB_EP_TYPE_MASK_Pos (9U) +#define USB_EP_TYPE_MASK_Msk (0x3UL << USB_EP_TYPE_MASK_Pos) /*!< 0x00000600 */ +#define USB_EP_TYPE_MASK USB_EP_TYPE_MASK_Msk /*!< EndPoint TYPE Mask */ +#define USB_EP_BULK 0x00000000U /*!< EndPoint BULK */ +#define USB_EP_CONTROL 0x00000200U /*!< EndPoint CONTROL */ +#define USB_EP_ISOCHRONOUS 0x00000400U /*!< EndPoint ISOCHRONOUS */ +#define USB_EP_INTERRUPT 0x00000600U /*!< EndPoint INTERRUPT */ +#define USB_EP_T_MASK (~USB_EP_T_FIELD & USB_EPREG_MASK) + +#define USB_EPKIND_MASK (~USB_EP_KIND & USB_EPREG_MASK) /*!< EP_KIND EndPoint KIND */ + /*!< STAT_TX[1:0] STATus for TX transfer */ +#define USB_EP_TX_DIS 0x00000000U /*!< EndPoint TX DISabled */ +#define USB_EP_TX_STALL 0x00000010U /*!< EndPoint TX STALLed */ +#define USB_EP_TX_NAK 0x00000020U /*!< EndPoint TX NAKed */ +#define USB_EP_TX_VALID 0x00000030U /*!< EndPoint TX VALID */ +#define USB_EPTX_DTOG1 0x00000010U /*!< EndPoint TX Data TOGgle bit1 */ +#define USB_EPTX_DTOG2 0x00000020U /*!< EndPoint TX Data TOGgle bit2 */ +#define USB_EPTX_DTOGMASK (USB_EPTX_STAT|USB_EPREG_MASK) + /*!< STAT_RX[1:0] STATus for RX transfer */ +#define USB_EP_RX_DIS 0x00000000U /*!< EndPoint RX DISabled */ +#define USB_EP_RX_STALL 0x00001000U /*!< EndPoint RX STALLed */ +#define USB_EP_RX_NAK 0x00002000U /*!< EndPoint RX NAKed */ +#define USB_EP_RX_VALID 0x00003000U /*!< EndPoint RX VALID */ +#define USB_EPRX_DTOG1 0x00001000U /*!< EndPoint RX Data TOGgle bit1 */ +#define USB_EPRX_DTOG2 0x00002000U /*!< EndPoint RX Data TOGgle bit1 */ +#define USB_EPRX_DTOGMASK (USB_EPRX_STAT|USB_EPREG_MASK) + +/******************* Bit definition for USB_EP0R register *******************/ +#define USB_EP0R_EA_Pos (0U) +#define USB_EP0R_EA_Msk (0xFUL << USB_EP0R_EA_Pos) /*!< 0x0000000F */ +#define USB_EP0R_EA USB_EP0R_EA_Msk /*!< Endpoint Address */ + +#define USB_EP0R_STAT_TX_Pos (4U) +#define USB_EP0R_STAT_TX_Msk (0x3UL << USB_EP0R_STAT_TX_Pos) /*!< 0x00000030 */ +#define USB_EP0R_STAT_TX USB_EP0R_STAT_TX_Msk /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP0R_STAT_TX_0 (0x1UL << USB_EP0R_STAT_TX_Pos) /*!< 0x00000010 */ +#define USB_EP0R_STAT_TX_1 (0x2UL << USB_EP0R_STAT_TX_Pos) /*!< 0x00000020 */ + +#define USB_EP0R_DTOG_TX_Pos (6U) +#define USB_EP0R_DTOG_TX_Msk (0x1UL << USB_EP0R_DTOG_TX_Pos) /*!< 0x00000040 */ +#define USB_EP0R_DTOG_TX USB_EP0R_DTOG_TX_Msk /*!< Data Toggle, for transmission transfers */ +#define USB_EP0R_CTR_TX_Pos (7U) +#define USB_EP0R_CTR_TX_Msk (0x1UL << USB_EP0R_CTR_TX_Pos) /*!< 0x00000080 */ +#define USB_EP0R_CTR_TX USB_EP0R_CTR_TX_Msk /*!< Correct Transfer for transmission */ +#define USB_EP0R_EP_KIND_Pos (8U) +#define USB_EP0R_EP_KIND_Msk (0x1UL << USB_EP0R_EP_KIND_Pos) /*!< 0x00000100 */ +#define USB_EP0R_EP_KIND USB_EP0R_EP_KIND_Msk /*!< Endpoint Kind */ + +#define USB_EP0R_EP_TYPE_Pos (9U) +#define USB_EP0R_EP_TYPE_Msk (0x3UL << USB_EP0R_EP_TYPE_Pos) /*!< 0x00000600 */ +#define USB_EP0R_EP_TYPE USB_EP0R_EP_TYPE_Msk /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP0R_EP_TYPE_0 (0x1UL << USB_EP0R_EP_TYPE_Pos) /*!< 0x00000200 */ +#define USB_EP0R_EP_TYPE_1 (0x2UL << USB_EP0R_EP_TYPE_Pos) /*!< 0x00000400 */ + +#define USB_EP0R_SETUP_Pos (11U) +#define USB_EP0R_SETUP_Msk (0x1UL << USB_EP0R_SETUP_Pos) /*!< 0x00000800 */ +#define USB_EP0R_SETUP USB_EP0R_SETUP_Msk /*!< Setup transaction completed */ + +#define USB_EP0R_STAT_RX_Pos (12U) +#define USB_EP0R_STAT_RX_Msk (0x3UL << USB_EP0R_STAT_RX_Pos) /*!< 0x00003000 */ +#define USB_EP0R_STAT_RX USB_EP0R_STAT_RX_Msk /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP0R_STAT_RX_0 (0x1UL << USB_EP0R_STAT_RX_Pos) /*!< 0x00001000 */ +#define USB_EP0R_STAT_RX_1 (0x2UL << USB_EP0R_STAT_RX_Pos) /*!< 0x00002000 */ + +#define USB_EP0R_DTOG_RX_Pos (14U) +#define USB_EP0R_DTOG_RX_Msk (0x1UL << USB_EP0R_DTOG_RX_Pos) /*!< 0x00004000 */ +#define USB_EP0R_DTOG_RX USB_EP0R_DTOG_RX_Msk /*!< Data Toggle, for reception transfers */ +#define USB_EP0R_CTR_RX_Pos (15U) +#define USB_EP0R_CTR_RX_Msk (0x1UL << USB_EP0R_CTR_RX_Pos) /*!< 0x00008000 */ +#define USB_EP0R_CTR_RX USB_EP0R_CTR_RX_Msk /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP1R register *******************/ +#define USB_EP1R_EA_Pos (0U) +#define USB_EP1R_EA_Msk (0xFUL << USB_EP1R_EA_Pos) /*!< 0x0000000F */ +#define USB_EP1R_EA USB_EP1R_EA_Msk /*!< Endpoint Address */ + +#define USB_EP1R_STAT_TX_Pos (4U) +#define USB_EP1R_STAT_TX_Msk (0x3UL << USB_EP1R_STAT_TX_Pos) /*!< 0x00000030 */ +#define USB_EP1R_STAT_TX USB_EP1R_STAT_TX_Msk /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP1R_STAT_TX_0 (0x1UL << USB_EP1R_STAT_TX_Pos) /*!< 0x00000010 */ +#define USB_EP1R_STAT_TX_1 (0x2UL << USB_EP1R_STAT_TX_Pos) /*!< 0x00000020 */ + +#define USB_EP1R_DTOG_TX_Pos (6U) +#define USB_EP1R_DTOG_TX_Msk (0x1UL << USB_EP1R_DTOG_TX_Pos) /*!< 0x00000040 */ +#define USB_EP1R_DTOG_TX USB_EP1R_DTOG_TX_Msk /*!< Data Toggle, for transmission transfers */ +#define USB_EP1R_CTR_TX_Pos (7U) +#define USB_EP1R_CTR_TX_Msk (0x1UL << USB_EP1R_CTR_TX_Pos) /*!< 0x00000080 */ +#define USB_EP1R_CTR_TX USB_EP1R_CTR_TX_Msk /*!< Correct Transfer for transmission */ +#define USB_EP1R_EP_KIND_Pos (8U) +#define USB_EP1R_EP_KIND_Msk (0x1UL << USB_EP1R_EP_KIND_Pos) /*!< 0x00000100 */ +#define USB_EP1R_EP_KIND USB_EP1R_EP_KIND_Msk /*!< Endpoint Kind */ + +#define USB_EP1R_EP_TYPE_Pos (9U) +#define USB_EP1R_EP_TYPE_Msk (0x3UL << USB_EP1R_EP_TYPE_Pos) /*!< 0x00000600 */ +#define USB_EP1R_EP_TYPE USB_EP1R_EP_TYPE_Msk /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP1R_EP_TYPE_0 (0x1UL << USB_EP1R_EP_TYPE_Pos) /*!< 0x00000200 */ +#define USB_EP1R_EP_TYPE_1 (0x2UL << USB_EP1R_EP_TYPE_Pos) /*!< 0x00000400 */ + +#define USB_EP1R_SETUP_Pos (11U) +#define USB_EP1R_SETUP_Msk (0x1UL << USB_EP1R_SETUP_Pos) /*!< 0x00000800 */ +#define USB_EP1R_SETUP USB_EP1R_SETUP_Msk /*!< Setup transaction completed */ + +#define USB_EP1R_STAT_RX_Pos (12U) +#define USB_EP1R_STAT_RX_Msk (0x3UL << USB_EP1R_STAT_RX_Pos) /*!< 0x00003000 */ +#define USB_EP1R_STAT_RX USB_EP1R_STAT_RX_Msk /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP1R_STAT_RX_0 (0x1UL << USB_EP1R_STAT_RX_Pos) /*!< 0x00001000 */ +#define USB_EP1R_STAT_RX_1 (0x2UL << USB_EP1R_STAT_RX_Pos) /*!< 0x00002000 */ + +#define USB_EP1R_DTOG_RX_Pos (14U) +#define USB_EP1R_DTOG_RX_Msk (0x1UL << USB_EP1R_DTOG_RX_Pos) /*!< 0x00004000 */ +#define USB_EP1R_DTOG_RX USB_EP1R_DTOG_RX_Msk /*!< Data Toggle, for reception transfers */ +#define USB_EP1R_CTR_RX_Pos (15U) +#define USB_EP1R_CTR_RX_Msk (0x1UL << USB_EP1R_CTR_RX_Pos) /*!< 0x00008000 */ +#define USB_EP1R_CTR_RX USB_EP1R_CTR_RX_Msk /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP2R register *******************/ +#define USB_EP2R_EA_Pos (0U) +#define USB_EP2R_EA_Msk (0xFUL << USB_EP2R_EA_Pos) /*!< 0x0000000F */ +#define USB_EP2R_EA USB_EP2R_EA_Msk /*!< Endpoint Address */ + +#define USB_EP2R_STAT_TX_Pos (4U) +#define USB_EP2R_STAT_TX_Msk (0x3UL << USB_EP2R_STAT_TX_Pos) /*!< 0x00000030 */ +#define USB_EP2R_STAT_TX USB_EP2R_STAT_TX_Msk /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP2R_STAT_TX_0 (0x1UL << USB_EP2R_STAT_TX_Pos) /*!< 0x00000010 */ +#define USB_EP2R_STAT_TX_1 (0x2UL << USB_EP2R_STAT_TX_Pos) /*!< 0x00000020 */ + +#define USB_EP2R_DTOG_TX_Pos (6U) +#define USB_EP2R_DTOG_TX_Msk (0x1UL << USB_EP2R_DTOG_TX_Pos) /*!< 0x00000040 */ +#define USB_EP2R_DTOG_TX USB_EP2R_DTOG_TX_Msk /*!< Data Toggle, for transmission transfers */ +#define USB_EP2R_CTR_TX_Pos (7U) +#define USB_EP2R_CTR_TX_Msk (0x1UL << USB_EP2R_CTR_TX_Pos) /*!< 0x00000080 */ +#define USB_EP2R_CTR_TX USB_EP2R_CTR_TX_Msk /*!< Correct Transfer for transmission */ +#define USB_EP2R_EP_KIND_Pos (8U) +#define USB_EP2R_EP_KIND_Msk (0x1UL << USB_EP2R_EP_KIND_Pos) /*!< 0x00000100 */ +#define USB_EP2R_EP_KIND USB_EP2R_EP_KIND_Msk /*!< Endpoint Kind */ + +#define USB_EP2R_EP_TYPE_Pos (9U) +#define USB_EP2R_EP_TYPE_Msk (0x3UL << USB_EP2R_EP_TYPE_Pos) /*!< 0x00000600 */ +#define USB_EP2R_EP_TYPE USB_EP2R_EP_TYPE_Msk /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP2R_EP_TYPE_0 (0x1UL << USB_EP2R_EP_TYPE_Pos) /*!< 0x00000200 */ +#define USB_EP2R_EP_TYPE_1 (0x2UL << USB_EP2R_EP_TYPE_Pos) /*!< 0x00000400 */ + +#define USB_EP2R_SETUP_Pos (11U) +#define USB_EP2R_SETUP_Msk (0x1UL << USB_EP2R_SETUP_Pos) /*!< 0x00000800 */ +#define USB_EP2R_SETUP USB_EP2R_SETUP_Msk /*!< Setup transaction completed */ + +#define USB_EP2R_STAT_RX_Pos (12U) +#define USB_EP2R_STAT_RX_Msk (0x3UL << USB_EP2R_STAT_RX_Pos) /*!< 0x00003000 */ +#define USB_EP2R_STAT_RX USB_EP2R_STAT_RX_Msk /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP2R_STAT_RX_0 (0x1UL << USB_EP2R_STAT_RX_Pos) /*!< 0x00001000 */ +#define USB_EP2R_STAT_RX_1 (0x2UL << USB_EP2R_STAT_RX_Pos) /*!< 0x00002000 */ + +#define USB_EP2R_DTOG_RX_Pos (14U) +#define USB_EP2R_DTOG_RX_Msk (0x1UL << USB_EP2R_DTOG_RX_Pos) /*!< 0x00004000 */ +#define USB_EP2R_DTOG_RX USB_EP2R_DTOG_RX_Msk /*!< Data Toggle, for reception transfers */ +#define USB_EP2R_CTR_RX_Pos (15U) +#define USB_EP2R_CTR_RX_Msk (0x1UL << USB_EP2R_CTR_RX_Pos) /*!< 0x00008000 */ +#define USB_EP2R_CTR_RX USB_EP2R_CTR_RX_Msk /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP3R register *******************/ +#define USB_EP3R_EA_Pos (0U) +#define USB_EP3R_EA_Msk (0xFUL << USB_EP3R_EA_Pos) /*!< 0x0000000F */ +#define USB_EP3R_EA USB_EP3R_EA_Msk /*!< Endpoint Address */ + +#define USB_EP3R_STAT_TX_Pos (4U) +#define USB_EP3R_STAT_TX_Msk (0x3UL << USB_EP3R_STAT_TX_Pos) /*!< 0x00000030 */ +#define USB_EP3R_STAT_TX USB_EP3R_STAT_TX_Msk /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP3R_STAT_TX_0 (0x1UL << USB_EP3R_STAT_TX_Pos) /*!< 0x00000010 */ +#define USB_EP3R_STAT_TX_1 (0x2UL << USB_EP3R_STAT_TX_Pos) /*!< 0x00000020 */ + +#define USB_EP3R_DTOG_TX_Pos (6U) +#define USB_EP3R_DTOG_TX_Msk (0x1UL << USB_EP3R_DTOG_TX_Pos) /*!< 0x00000040 */ +#define USB_EP3R_DTOG_TX USB_EP3R_DTOG_TX_Msk /*!< Data Toggle, for transmission transfers */ +#define USB_EP3R_CTR_TX_Pos (7U) +#define USB_EP3R_CTR_TX_Msk (0x1UL << USB_EP3R_CTR_TX_Pos) /*!< 0x00000080 */ +#define USB_EP3R_CTR_TX USB_EP3R_CTR_TX_Msk /*!< Correct Transfer for transmission */ +#define USB_EP3R_EP_KIND_Pos (8U) +#define USB_EP3R_EP_KIND_Msk (0x1UL << USB_EP3R_EP_KIND_Pos) /*!< 0x00000100 */ +#define USB_EP3R_EP_KIND USB_EP3R_EP_KIND_Msk /*!< Endpoint Kind */ + +#define USB_EP3R_EP_TYPE_Pos (9U) +#define USB_EP3R_EP_TYPE_Msk (0x3UL << USB_EP3R_EP_TYPE_Pos) /*!< 0x00000600 */ +#define USB_EP3R_EP_TYPE USB_EP3R_EP_TYPE_Msk /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP3R_EP_TYPE_0 (0x1UL << USB_EP3R_EP_TYPE_Pos) /*!< 0x00000200 */ +#define USB_EP3R_EP_TYPE_1 (0x2UL << USB_EP3R_EP_TYPE_Pos) /*!< 0x00000400 */ + +#define USB_EP3R_SETUP_Pos (11U) +#define USB_EP3R_SETUP_Msk (0x1UL << USB_EP3R_SETUP_Pos) /*!< 0x00000800 */ +#define USB_EP3R_SETUP USB_EP3R_SETUP_Msk /*!< Setup transaction completed */ + +#define USB_EP3R_STAT_RX_Pos (12U) +#define USB_EP3R_STAT_RX_Msk (0x3UL << USB_EP3R_STAT_RX_Pos) /*!< 0x00003000 */ +#define USB_EP3R_STAT_RX USB_EP3R_STAT_RX_Msk /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP3R_STAT_RX_0 (0x1UL << USB_EP3R_STAT_RX_Pos) /*!< 0x00001000 */ +#define USB_EP3R_STAT_RX_1 (0x2UL << USB_EP3R_STAT_RX_Pos) /*!< 0x00002000 */ + +#define USB_EP3R_DTOG_RX_Pos (14U) +#define USB_EP3R_DTOG_RX_Msk (0x1UL << USB_EP3R_DTOG_RX_Pos) /*!< 0x00004000 */ +#define USB_EP3R_DTOG_RX USB_EP3R_DTOG_RX_Msk /*!< Data Toggle, for reception transfers */ +#define USB_EP3R_CTR_RX_Pos (15U) +#define USB_EP3R_CTR_RX_Msk (0x1UL << USB_EP3R_CTR_RX_Pos) /*!< 0x00008000 */ +#define USB_EP3R_CTR_RX USB_EP3R_CTR_RX_Msk /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP4R register *******************/ +#define USB_EP4R_EA_Pos (0U) +#define USB_EP4R_EA_Msk (0xFUL << USB_EP4R_EA_Pos) /*!< 0x0000000F */ +#define USB_EP4R_EA USB_EP4R_EA_Msk /*!< Endpoint Address */ + +#define USB_EP4R_STAT_TX_Pos (4U) +#define USB_EP4R_STAT_TX_Msk (0x3UL << USB_EP4R_STAT_TX_Pos) /*!< 0x00000030 */ +#define USB_EP4R_STAT_TX USB_EP4R_STAT_TX_Msk /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP4R_STAT_TX_0 (0x1UL << USB_EP4R_STAT_TX_Pos) /*!< 0x00000010 */ +#define USB_EP4R_STAT_TX_1 (0x2UL << USB_EP4R_STAT_TX_Pos) /*!< 0x00000020 */ + +#define USB_EP4R_DTOG_TX_Pos (6U) +#define USB_EP4R_DTOG_TX_Msk (0x1UL << USB_EP4R_DTOG_TX_Pos) /*!< 0x00000040 */ +#define USB_EP4R_DTOG_TX USB_EP4R_DTOG_TX_Msk /*!< Data Toggle, for transmission transfers */ +#define USB_EP4R_CTR_TX_Pos (7U) +#define USB_EP4R_CTR_TX_Msk (0x1UL << USB_EP4R_CTR_TX_Pos) /*!< 0x00000080 */ +#define USB_EP4R_CTR_TX USB_EP4R_CTR_TX_Msk /*!< Correct Transfer for transmission */ +#define USB_EP4R_EP_KIND_Pos (8U) +#define USB_EP4R_EP_KIND_Msk (0x1UL << USB_EP4R_EP_KIND_Pos) /*!< 0x00000100 */ +#define USB_EP4R_EP_KIND USB_EP4R_EP_KIND_Msk /*!< Endpoint Kind */ + +#define USB_EP4R_EP_TYPE_Pos (9U) +#define USB_EP4R_EP_TYPE_Msk (0x3UL << USB_EP4R_EP_TYPE_Pos) /*!< 0x00000600 */ +#define USB_EP4R_EP_TYPE USB_EP4R_EP_TYPE_Msk /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP4R_EP_TYPE_0 (0x1UL << USB_EP4R_EP_TYPE_Pos) /*!< 0x00000200 */ +#define USB_EP4R_EP_TYPE_1 (0x2UL << USB_EP4R_EP_TYPE_Pos) /*!< 0x00000400 */ + +#define USB_EP4R_SETUP_Pos (11U) +#define USB_EP4R_SETUP_Msk (0x1UL << USB_EP4R_SETUP_Pos) /*!< 0x00000800 */ +#define USB_EP4R_SETUP USB_EP4R_SETUP_Msk /*!< Setup transaction completed */ + +#define USB_EP4R_STAT_RX_Pos (12U) +#define USB_EP4R_STAT_RX_Msk (0x3UL << USB_EP4R_STAT_RX_Pos) /*!< 0x00003000 */ +#define USB_EP4R_STAT_RX USB_EP4R_STAT_RX_Msk /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP4R_STAT_RX_0 (0x1UL << USB_EP4R_STAT_RX_Pos) /*!< 0x00001000 */ +#define USB_EP4R_STAT_RX_1 (0x2UL << USB_EP4R_STAT_RX_Pos) /*!< 0x00002000 */ + +#define USB_EP4R_DTOG_RX_Pos (14U) +#define USB_EP4R_DTOG_RX_Msk (0x1UL << USB_EP4R_DTOG_RX_Pos) /*!< 0x00004000 */ +#define USB_EP4R_DTOG_RX USB_EP4R_DTOG_RX_Msk /*!< Data Toggle, for reception transfers */ +#define USB_EP4R_CTR_RX_Pos (15U) +#define USB_EP4R_CTR_RX_Msk (0x1UL << USB_EP4R_CTR_RX_Pos) /*!< 0x00008000 */ +#define USB_EP4R_CTR_RX USB_EP4R_CTR_RX_Msk /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP5R register *******************/ +#define USB_EP5R_EA_Pos (0U) +#define USB_EP5R_EA_Msk (0xFUL << USB_EP5R_EA_Pos) /*!< 0x0000000F */ +#define USB_EP5R_EA USB_EP5R_EA_Msk /*!< Endpoint Address */ + +#define USB_EP5R_STAT_TX_Pos (4U) +#define USB_EP5R_STAT_TX_Msk (0x3UL << USB_EP5R_STAT_TX_Pos) /*!< 0x00000030 */ +#define USB_EP5R_STAT_TX USB_EP5R_STAT_TX_Msk /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP5R_STAT_TX_0 (0x1UL << USB_EP5R_STAT_TX_Pos) /*!< 0x00000010 */ +#define USB_EP5R_STAT_TX_1 (0x2UL << USB_EP5R_STAT_TX_Pos) /*!< 0x00000020 */ + +#define USB_EP5R_DTOG_TX_Pos (6U) +#define USB_EP5R_DTOG_TX_Msk (0x1UL << USB_EP5R_DTOG_TX_Pos) /*!< 0x00000040 */ +#define USB_EP5R_DTOG_TX USB_EP5R_DTOG_TX_Msk /*!< Data Toggle, for transmission transfers */ +#define USB_EP5R_CTR_TX_Pos (7U) +#define USB_EP5R_CTR_TX_Msk (0x1UL << USB_EP5R_CTR_TX_Pos) /*!< 0x00000080 */ +#define USB_EP5R_CTR_TX USB_EP5R_CTR_TX_Msk /*!< Correct Transfer for transmission */ +#define USB_EP5R_EP_KIND_Pos (8U) +#define USB_EP5R_EP_KIND_Msk (0x1UL << USB_EP5R_EP_KIND_Pos) /*!< 0x00000100 */ +#define USB_EP5R_EP_KIND USB_EP5R_EP_KIND_Msk /*!< Endpoint Kind */ + +#define USB_EP5R_EP_TYPE_Pos (9U) +#define USB_EP5R_EP_TYPE_Msk (0x3UL << USB_EP5R_EP_TYPE_Pos) /*!< 0x00000600 */ +#define USB_EP5R_EP_TYPE USB_EP5R_EP_TYPE_Msk /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP5R_EP_TYPE_0 (0x1UL << USB_EP5R_EP_TYPE_Pos) /*!< 0x00000200 */ +#define USB_EP5R_EP_TYPE_1 (0x2UL << USB_EP5R_EP_TYPE_Pos) /*!< 0x00000400 */ + +#define USB_EP5R_SETUP_Pos (11U) +#define USB_EP5R_SETUP_Msk (0x1UL << USB_EP5R_SETUP_Pos) /*!< 0x00000800 */ +#define USB_EP5R_SETUP USB_EP5R_SETUP_Msk /*!< Setup transaction completed */ + +#define USB_EP5R_STAT_RX_Pos (12U) +#define USB_EP5R_STAT_RX_Msk (0x3UL << USB_EP5R_STAT_RX_Pos) /*!< 0x00003000 */ +#define USB_EP5R_STAT_RX USB_EP5R_STAT_RX_Msk /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP5R_STAT_RX_0 (0x1UL << USB_EP5R_STAT_RX_Pos) /*!< 0x00001000 */ +#define USB_EP5R_STAT_RX_1 (0x2UL << USB_EP5R_STAT_RX_Pos) /*!< 0x00002000 */ + +#define USB_EP5R_DTOG_RX_Pos (14U) +#define USB_EP5R_DTOG_RX_Msk (0x1UL << USB_EP5R_DTOG_RX_Pos) /*!< 0x00004000 */ +#define USB_EP5R_DTOG_RX USB_EP5R_DTOG_RX_Msk /*!< Data Toggle, for reception transfers */ +#define USB_EP5R_CTR_RX_Pos (15U) +#define USB_EP5R_CTR_RX_Msk (0x1UL << USB_EP5R_CTR_RX_Pos) /*!< 0x00008000 */ +#define USB_EP5R_CTR_RX USB_EP5R_CTR_RX_Msk /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP6R register *******************/ +#define USB_EP6R_EA_Pos (0U) +#define USB_EP6R_EA_Msk (0xFUL << USB_EP6R_EA_Pos) /*!< 0x0000000F */ +#define USB_EP6R_EA USB_EP6R_EA_Msk /*!< Endpoint Address */ + +#define USB_EP6R_STAT_TX_Pos (4U) +#define USB_EP6R_STAT_TX_Msk (0x3UL << USB_EP6R_STAT_TX_Pos) /*!< 0x00000030 */ +#define USB_EP6R_STAT_TX USB_EP6R_STAT_TX_Msk /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP6R_STAT_TX_0 (0x1UL << USB_EP6R_STAT_TX_Pos) /*!< 0x00000010 */ +#define USB_EP6R_STAT_TX_1 (0x2UL << USB_EP6R_STAT_TX_Pos) /*!< 0x00000020 */ + +#define USB_EP6R_DTOG_TX_Pos (6U) +#define USB_EP6R_DTOG_TX_Msk (0x1UL << USB_EP6R_DTOG_TX_Pos) /*!< 0x00000040 */ +#define USB_EP6R_DTOG_TX USB_EP6R_DTOG_TX_Msk /*!< Data Toggle, for transmission transfers */ +#define USB_EP6R_CTR_TX_Pos (7U) +#define USB_EP6R_CTR_TX_Msk (0x1UL << USB_EP6R_CTR_TX_Pos) /*!< 0x00000080 */ +#define USB_EP6R_CTR_TX USB_EP6R_CTR_TX_Msk /*!< Correct Transfer for transmission */ +#define USB_EP6R_EP_KIND_Pos (8U) +#define USB_EP6R_EP_KIND_Msk (0x1UL << USB_EP6R_EP_KIND_Pos) /*!< 0x00000100 */ +#define USB_EP6R_EP_KIND USB_EP6R_EP_KIND_Msk /*!< Endpoint Kind */ + +#define USB_EP6R_EP_TYPE_Pos (9U) +#define USB_EP6R_EP_TYPE_Msk (0x3UL << USB_EP6R_EP_TYPE_Pos) /*!< 0x00000600 */ +#define USB_EP6R_EP_TYPE USB_EP6R_EP_TYPE_Msk /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP6R_EP_TYPE_0 (0x1UL << USB_EP6R_EP_TYPE_Pos) /*!< 0x00000200 */ +#define USB_EP6R_EP_TYPE_1 (0x2UL << USB_EP6R_EP_TYPE_Pos) /*!< 0x00000400 */ + +#define USB_EP6R_SETUP_Pos (11U) +#define USB_EP6R_SETUP_Msk (0x1UL << USB_EP6R_SETUP_Pos) /*!< 0x00000800 */ +#define USB_EP6R_SETUP USB_EP6R_SETUP_Msk /*!< Setup transaction completed */ + +#define USB_EP6R_STAT_RX_Pos (12U) +#define USB_EP6R_STAT_RX_Msk (0x3UL << USB_EP6R_STAT_RX_Pos) /*!< 0x00003000 */ +#define USB_EP6R_STAT_RX USB_EP6R_STAT_RX_Msk /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP6R_STAT_RX_0 (0x1UL << USB_EP6R_STAT_RX_Pos) /*!< 0x00001000 */ +#define USB_EP6R_STAT_RX_1 (0x2UL << USB_EP6R_STAT_RX_Pos) /*!< 0x00002000 */ + +#define USB_EP6R_DTOG_RX_Pos (14U) +#define USB_EP6R_DTOG_RX_Msk (0x1UL << USB_EP6R_DTOG_RX_Pos) /*!< 0x00004000 */ +#define USB_EP6R_DTOG_RX USB_EP6R_DTOG_RX_Msk /*!< Data Toggle, for reception transfers */ +#define USB_EP6R_CTR_RX_Pos (15U) +#define USB_EP6R_CTR_RX_Msk (0x1UL << USB_EP6R_CTR_RX_Pos) /*!< 0x00008000 */ +#define USB_EP6R_CTR_RX USB_EP6R_CTR_RX_Msk /*!< Correct Transfer for reception */ + +/******************* Bit definition for USB_EP7R register *******************/ +#define USB_EP7R_EA_Pos (0U) +#define USB_EP7R_EA_Msk (0xFUL << USB_EP7R_EA_Pos) /*!< 0x0000000F */ +#define USB_EP7R_EA USB_EP7R_EA_Msk /*!< Endpoint Address */ + +#define USB_EP7R_STAT_TX_Pos (4U) +#define USB_EP7R_STAT_TX_Msk (0x3UL << USB_EP7R_STAT_TX_Pos) /*!< 0x00000030 */ +#define USB_EP7R_STAT_TX USB_EP7R_STAT_TX_Msk /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */ +#define USB_EP7R_STAT_TX_0 (0x1UL << USB_EP7R_STAT_TX_Pos) /*!< 0x00000010 */ +#define USB_EP7R_STAT_TX_1 (0x2UL << USB_EP7R_STAT_TX_Pos) /*!< 0x00000020 */ + +#define USB_EP7R_DTOG_TX_Pos (6U) +#define USB_EP7R_DTOG_TX_Msk (0x1UL << USB_EP7R_DTOG_TX_Pos) /*!< 0x00000040 */ +#define USB_EP7R_DTOG_TX USB_EP7R_DTOG_TX_Msk /*!< Data Toggle, for transmission transfers */ +#define USB_EP7R_CTR_TX_Pos (7U) +#define USB_EP7R_CTR_TX_Msk (0x1UL << USB_EP7R_CTR_TX_Pos) /*!< 0x00000080 */ +#define USB_EP7R_CTR_TX USB_EP7R_CTR_TX_Msk /*!< Correct Transfer for transmission */ +#define USB_EP7R_EP_KIND_Pos (8U) +#define USB_EP7R_EP_KIND_Msk (0x1UL << USB_EP7R_EP_KIND_Pos) /*!< 0x00000100 */ +#define USB_EP7R_EP_KIND USB_EP7R_EP_KIND_Msk /*!< Endpoint Kind */ + +#define USB_EP7R_EP_TYPE_Pos (9U) +#define USB_EP7R_EP_TYPE_Msk (0x3UL << USB_EP7R_EP_TYPE_Pos) /*!< 0x00000600 */ +#define USB_EP7R_EP_TYPE USB_EP7R_EP_TYPE_Msk /*!< EP_TYPE[1:0] bits (Endpoint type) */ +#define USB_EP7R_EP_TYPE_0 (0x1UL << USB_EP7R_EP_TYPE_Pos) /*!< 0x00000200 */ +#define USB_EP7R_EP_TYPE_1 (0x2UL << USB_EP7R_EP_TYPE_Pos) /*!< 0x00000400 */ + +#define USB_EP7R_SETUP_Pos (11U) +#define USB_EP7R_SETUP_Msk (0x1UL << USB_EP7R_SETUP_Pos) /*!< 0x00000800 */ +#define USB_EP7R_SETUP USB_EP7R_SETUP_Msk /*!< Setup transaction completed */ + +#define USB_EP7R_STAT_RX_Pos (12U) +#define USB_EP7R_STAT_RX_Msk (0x3UL << USB_EP7R_STAT_RX_Pos) /*!< 0x00003000 */ +#define USB_EP7R_STAT_RX USB_EP7R_STAT_RX_Msk /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */ +#define USB_EP7R_STAT_RX_0 (0x1UL << USB_EP7R_STAT_RX_Pos) /*!< 0x00001000 */ +#define USB_EP7R_STAT_RX_1 (0x2UL << USB_EP7R_STAT_RX_Pos) /*!< 0x00002000 */ + +#define USB_EP7R_DTOG_RX_Pos (14U) +#define USB_EP7R_DTOG_RX_Msk (0x1UL << USB_EP7R_DTOG_RX_Pos) /*!< 0x00004000 */ +#define USB_EP7R_DTOG_RX USB_EP7R_DTOG_RX_Msk /*!< Data Toggle, for reception transfers */ +#define USB_EP7R_CTR_RX_Pos (15U) +#define USB_EP7R_CTR_RX_Msk (0x1UL << USB_EP7R_CTR_RX_Pos) /*!< 0x00008000 */ +#define USB_EP7R_CTR_RX USB_EP7R_CTR_RX_Msk /*!< Correct Transfer for reception */ + +/*!< Common registers */ +/******************* Bit definition for USB_CNTR register *******************/ +#define USB_CNTR_FRES_Pos (0U) +#define USB_CNTR_FRES_Msk (0x1UL << USB_CNTR_FRES_Pos) /*!< 0x00000001 */ +#define USB_CNTR_FRES USB_CNTR_FRES_Msk /*!< Force USB Reset */ +#define USB_CNTR_PDWN_Pos (1U) +#define USB_CNTR_PDWN_Msk (0x1UL << USB_CNTR_PDWN_Pos) /*!< 0x00000002 */ +#define USB_CNTR_PDWN USB_CNTR_PDWN_Msk /*!< Power down */ +#define USB_CNTR_LP_MODE_Pos (2U) +#define USB_CNTR_LP_MODE_Msk (0x1UL << USB_CNTR_LP_MODE_Pos) /*!< 0x00000004 */ +#define USB_CNTR_LP_MODE USB_CNTR_LP_MODE_Msk /*!< Low-power mode */ +#define USB_CNTR_FSUSP_Pos (3U) +#define USB_CNTR_FSUSP_Msk (0x1UL << USB_CNTR_FSUSP_Pos) /*!< 0x00000008 */ +#define USB_CNTR_FSUSP USB_CNTR_FSUSP_Msk /*!< Force suspend */ +#define USB_CNTR_RESUME_Pos (4U) +#define USB_CNTR_RESUME_Msk (0x1UL << USB_CNTR_RESUME_Pos) /*!< 0x00000010 */ +#define USB_CNTR_RESUME USB_CNTR_RESUME_Msk /*!< Resume request */ +#define USB_CNTR_ESOFM_Pos (8U) +#define USB_CNTR_ESOFM_Msk (0x1UL << USB_CNTR_ESOFM_Pos) /*!< 0x00000100 */ +#define USB_CNTR_ESOFM USB_CNTR_ESOFM_Msk /*!< Expected Start Of Frame Interrupt Mask */ +#define USB_CNTR_SOFM_Pos (9U) +#define USB_CNTR_SOFM_Msk (0x1UL << USB_CNTR_SOFM_Pos) /*!< 0x00000200 */ +#define USB_CNTR_SOFM USB_CNTR_SOFM_Msk /*!< Start Of Frame Interrupt Mask */ +#define USB_CNTR_RESETM_Pos (10U) +#define USB_CNTR_RESETM_Msk (0x1UL << USB_CNTR_RESETM_Pos) /*!< 0x00000400 */ +#define USB_CNTR_RESETM USB_CNTR_RESETM_Msk /*!< RESET Interrupt Mask */ +#define USB_CNTR_SUSPM_Pos (11U) +#define USB_CNTR_SUSPM_Msk (0x1UL << USB_CNTR_SUSPM_Pos) /*!< 0x00000800 */ +#define USB_CNTR_SUSPM USB_CNTR_SUSPM_Msk /*!< Suspend mode Interrupt Mask */ +#define USB_CNTR_WKUPM_Pos (12U) +#define USB_CNTR_WKUPM_Msk (0x1UL << USB_CNTR_WKUPM_Pos) /*!< 0x00001000 */ +#define USB_CNTR_WKUPM USB_CNTR_WKUPM_Msk /*!< Wakeup Interrupt Mask */ +#define USB_CNTR_ERRM_Pos (13U) +#define USB_CNTR_ERRM_Msk (0x1UL << USB_CNTR_ERRM_Pos) /*!< 0x00002000 */ +#define USB_CNTR_ERRM USB_CNTR_ERRM_Msk /*!< Error Interrupt Mask */ +#define USB_CNTR_PMAOVRM_Pos (14U) +#define USB_CNTR_PMAOVRM_Msk (0x1UL << USB_CNTR_PMAOVRM_Pos) /*!< 0x00004000 */ +#define USB_CNTR_PMAOVRM USB_CNTR_PMAOVRM_Msk /*!< Packet Memory Area Over / Underrun Interrupt Mask */ +#define USB_CNTR_CTRM_Pos (15U) +#define USB_CNTR_CTRM_Msk (0x1UL << USB_CNTR_CTRM_Pos) /*!< 0x00008000 */ +#define USB_CNTR_CTRM USB_CNTR_CTRM_Msk /*!< Correct Transfer Interrupt Mask */ + +/******************* Bit definition for USB_ISTR register *******************/ +#define USB_ISTR_EP_ID_Pos (0U) +#define USB_ISTR_EP_ID_Msk (0xFUL << USB_ISTR_EP_ID_Pos) /*!< 0x0000000F */ +#define USB_ISTR_EP_ID USB_ISTR_EP_ID_Msk /*!< Endpoint Identifier */ +#define USB_ISTR_DIR_Pos (4U) +#define USB_ISTR_DIR_Msk (0x1UL << USB_ISTR_DIR_Pos) /*!< 0x00000010 */ +#define USB_ISTR_DIR USB_ISTR_DIR_Msk /*!< Direction of transaction */ +#define USB_ISTR_ESOF_Pos (8U) +#define USB_ISTR_ESOF_Msk (0x1UL << USB_ISTR_ESOF_Pos) /*!< 0x00000100 */ +#define USB_ISTR_ESOF USB_ISTR_ESOF_Msk /*!< Expected Start Of Frame */ +#define USB_ISTR_SOF_Pos (9U) +#define USB_ISTR_SOF_Msk (0x1UL << USB_ISTR_SOF_Pos) /*!< 0x00000200 */ +#define USB_ISTR_SOF USB_ISTR_SOF_Msk /*!< Start Of Frame */ +#define USB_ISTR_RESET_Pos (10U) +#define USB_ISTR_RESET_Msk (0x1UL << USB_ISTR_RESET_Pos) /*!< 0x00000400 */ +#define USB_ISTR_RESET USB_ISTR_RESET_Msk /*!< USB RESET request */ +#define USB_ISTR_SUSP_Pos (11U) +#define USB_ISTR_SUSP_Msk (0x1UL << USB_ISTR_SUSP_Pos) /*!< 0x00000800 */ +#define USB_ISTR_SUSP USB_ISTR_SUSP_Msk /*!< Suspend mode request */ +#define USB_ISTR_WKUP_Pos (12U) +#define USB_ISTR_WKUP_Msk (0x1UL << USB_ISTR_WKUP_Pos) /*!< 0x00001000 */ +#define USB_ISTR_WKUP USB_ISTR_WKUP_Msk /*!< Wake up */ +#define USB_ISTR_ERR_Pos (13U) +#define USB_ISTR_ERR_Msk (0x1UL << USB_ISTR_ERR_Pos) /*!< 0x00002000 */ +#define USB_ISTR_ERR USB_ISTR_ERR_Msk /*!< Error */ +#define USB_ISTR_PMAOVR_Pos (14U) +#define USB_ISTR_PMAOVR_Msk (0x1UL << USB_ISTR_PMAOVR_Pos) /*!< 0x00004000 */ +#define USB_ISTR_PMAOVR USB_ISTR_PMAOVR_Msk /*!< Packet Memory Area Over / Underrun */ +#define USB_ISTR_CTR_Pos (15U) +#define USB_ISTR_CTR_Msk (0x1UL << USB_ISTR_CTR_Pos) /*!< 0x00008000 */ +#define USB_ISTR_CTR USB_ISTR_CTR_Msk /*!< Correct Transfer */ + +/******************* Bit definition for USB_FNR register ********************/ +#define USB_FNR_FN_Pos (0U) +#define USB_FNR_FN_Msk (0x7FFUL << USB_FNR_FN_Pos) /*!< 0x000007FF */ +#define USB_FNR_FN USB_FNR_FN_Msk /*!< Frame Number */ +#define USB_FNR_LSOF_Pos (11U) +#define USB_FNR_LSOF_Msk (0x3UL << USB_FNR_LSOF_Pos) /*!< 0x00001800 */ +#define USB_FNR_LSOF USB_FNR_LSOF_Msk /*!< Lost SOF */ +#define USB_FNR_LCK_Pos (13U) +#define USB_FNR_LCK_Msk (0x1UL << USB_FNR_LCK_Pos) /*!< 0x00002000 */ +#define USB_FNR_LCK USB_FNR_LCK_Msk /*!< Locked */ +#define USB_FNR_RXDM_Pos (14U) +#define USB_FNR_RXDM_Msk (0x1UL << USB_FNR_RXDM_Pos) /*!< 0x00004000 */ +#define USB_FNR_RXDM USB_FNR_RXDM_Msk /*!< Receive Data - Line Status */ +#define USB_FNR_RXDP_Pos (15U) +#define USB_FNR_RXDP_Msk (0x1UL << USB_FNR_RXDP_Pos) /*!< 0x00008000 */ +#define USB_FNR_RXDP USB_FNR_RXDP_Msk /*!< Receive Data + Line Status */ + +/****************** Bit definition for USB_DADDR register *******************/ +#define USB_DADDR_ADD_Pos (0U) +#define USB_DADDR_ADD_Msk (0x7FUL << USB_DADDR_ADD_Pos) /*!< 0x0000007F */ +#define USB_DADDR_ADD USB_DADDR_ADD_Msk /*!< ADD[6:0] bits (Device Address) */ +#define USB_DADDR_ADD0_Pos (0U) +#define USB_DADDR_ADD0_Msk (0x1UL << USB_DADDR_ADD0_Pos) /*!< 0x00000001 */ +#define USB_DADDR_ADD0 USB_DADDR_ADD0_Msk /*!< Bit 0 */ +#define USB_DADDR_ADD1_Pos (1U) +#define USB_DADDR_ADD1_Msk (0x1UL << USB_DADDR_ADD1_Pos) /*!< 0x00000002 */ +#define USB_DADDR_ADD1 USB_DADDR_ADD1_Msk /*!< Bit 1 */ +#define USB_DADDR_ADD2_Pos (2U) +#define USB_DADDR_ADD2_Msk (0x1UL << USB_DADDR_ADD2_Pos) /*!< 0x00000004 */ +#define USB_DADDR_ADD2 USB_DADDR_ADD2_Msk /*!< Bit 2 */ +#define USB_DADDR_ADD3_Pos (3U) +#define USB_DADDR_ADD3_Msk (0x1UL << USB_DADDR_ADD3_Pos) /*!< 0x00000008 */ +#define USB_DADDR_ADD3 USB_DADDR_ADD3_Msk /*!< Bit 3 */ +#define USB_DADDR_ADD4_Pos (4U) +#define USB_DADDR_ADD4_Msk (0x1UL << USB_DADDR_ADD4_Pos) /*!< 0x00000010 */ +#define USB_DADDR_ADD4 USB_DADDR_ADD4_Msk /*!< Bit 4 */ +#define USB_DADDR_ADD5_Pos (5U) +#define USB_DADDR_ADD5_Msk (0x1UL << USB_DADDR_ADD5_Pos) /*!< 0x00000020 */ +#define USB_DADDR_ADD5 USB_DADDR_ADD5_Msk /*!< Bit 5 */ +#define USB_DADDR_ADD6_Pos (6U) +#define USB_DADDR_ADD6_Msk (0x1UL << USB_DADDR_ADD6_Pos) /*!< 0x00000040 */ +#define USB_DADDR_ADD6 USB_DADDR_ADD6_Msk /*!< Bit 6 */ + +#define USB_DADDR_EF_Pos (7U) +#define USB_DADDR_EF_Msk (0x1UL << USB_DADDR_EF_Pos) /*!< 0x00000080 */ +#define USB_DADDR_EF USB_DADDR_EF_Msk /*!< Enable Function */ + +/****************** Bit definition for USB_BTABLE register ******************/ +#define USB_BTABLE_BTABLE_Pos (3U) +#define USB_BTABLE_BTABLE_Msk (0x1FFFUL << USB_BTABLE_BTABLE_Pos) /*!< 0x0000FFF8 */ +#define USB_BTABLE_BTABLE USB_BTABLE_BTABLE_Msk /*!< Buffer Table */ + +/****************** Bits definition for USB_BCDR register *******************/ +#define USB_BCDR_BCDEN ((uint16_t)0x0001U) /*!< Battery charging detector (BCD) enable */ +#define USB_BCDR_DCDEN ((uint16_t)0x0002U) /*!< Data contact detection (DCD) mode enable */ +#define USB_BCDR_PDEN ((uint16_t)0x0004U) /*!< Primary detection (PD) mode enable */ +#define USB_BCDR_SDEN ((uint16_t)0x0008U) /*!< Secondary detection (SD) mode enable */ +#define USB_BCDR_DCDET ((uint16_t)0x0010U) /*!< Data contact detection (DCD) status */ +#define USB_BCDR_PDET ((uint16_t)0x0020U) /*!< Primary detection (PD) status */ +#define USB_BCDR_SDET ((uint16_t)0x0040U) /*!< Secondary detection (SD) status */ +#define USB_BCDR_PS2DET ((uint16_t)0x0080U) /*!< PS2 port or proprietary charger detected */ +#define USB_BCDR_DPPU ((uint16_t)0x8000U) /*!< DP Pull-up Enable */ + +/******************* Bit definition for LPMCSR register *********************/ +#define USB_LPMCSR_LMPEN ((uint16_t)0x0001U) /*!< LPM support enable */ +#define USB_LPMCSR_LPMACK ((uint16_t)0x0002U) /*!< LPM Token acknowledge enable*/ +#define USB_LPMCSR_REMWAKE ((uint16_t)0x0008U) /*!< bRemoteWake value received with last ACKed LPM Token */ +#define USB_LPMCSR_BESL ((uint16_t)0x00F0U) /*!< BESL value received with last ACKed LPM Token */ + +/*!< Buffer descriptor table */ +/***************** Bit definition for USB_ADDR0_TX register *****************/ +#define USB_ADDR0_TX_ADDR0_TX_Pos (1U) +#define USB_ADDR0_TX_ADDR0_TX_Msk (0x7FFFUL << USB_ADDR0_TX_ADDR0_TX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR0_TX_ADDR0_TX USB_ADDR0_TX_ADDR0_TX_Msk /*!< Transmission Buffer Address 0 */ + +/***************** Bit definition for USB_ADDR1_TX register *****************/ +#define USB_ADDR1_TX_ADDR1_TX_Pos (1U) +#define USB_ADDR1_TX_ADDR1_TX_Msk (0x7FFFUL << USB_ADDR1_TX_ADDR1_TX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR1_TX_ADDR1_TX USB_ADDR1_TX_ADDR1_TX_Msk /*!< Transmission Buffer Address 1 */ + +/***************** Bit definition for USB_ADDR2_TX register *****************/ +#define USB_ADDR2_TX_ADDR2_TX_Pos (1U) +#define USB_ADDR2_TX_ADDR2_TX_Msk (0x7FFFUL << USB_ADDR2_TX_ADDR2_TX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR2_TX_ADDR2_TX USB_ADDR2_TX_ADDR2_TX_Msk /*!< Transmission Buffer Address 2 */ + +/***************** Bit definition for USB_ADDR3_TX register *****************/ +#define USB_ADDR3_TX_ADDR3_TX_Pos (1U) +#define USB_ADDR3_TX_ADDR3_TX_Msk (0x7FFFUL << USB_ADDR3_TX_ADDR3_TX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR3_TX_ADDR3_TX USB_ADDR3_TX_ADDR3_TX_Msk /*!< Transmission Buffer Address 3 */ + +/***************** Bit definition for USB_ADDR4_TX register *****************/ +#define USB_ADDR4_TX_ADDR4_TX_Pos (1U) +#define USB_ADDR4_TX_ADDR4_TX_Msk (0x7FFFUL << USB_ADDR4_TX_ADDR4_TX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR4_TX_ADDR4_TX USB_ADDR4_TX_ADDR4_TX_Msk /*!< Transmission Buffer Address 4 */ + +/***************** Bit definition for USB_ADDR5_TX register *****************/ +#define USB_ADDR5_TX_ADDR5_TX_Pos (1U) +#define USB_ADDR5_TX_ADDR5_TX_Msk (0x7FFFUL << USB_ADDR5_TX_ADDR5_TX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR5_TX_ADDR5_TX USB_ADDR5_TX_ADDR5_TX_Msk /*!< Transmission Buffer Address 5 */ + +/***************** Bit definition for USB_ADDR6_TX register *****************/ +#define USB_ADDR6_TX_ADDR6_TX_Pos (1U) +#define USB_ADDR6_TX_ADDR6_TX_Msk (0x7FFFUL << USB_ADDR6_TX_ADDR6_TX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR6_TX_ADDR6_TX USB_ADDR6_TX_ADDR6_TX_Msk /*!< Transmission Buffer Address 6 */ + +/***************** Bit definition for USB_ADDR7_TX register *****************/ +#define USB_ADDR7_TX_ADDR7_TX_Pos (1U) +#define USB_ADDR7_TX_ADDR7_TX_Msk (0x7FFFUL << USB_ADDR7_TX_ADDR7_TX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR7_TX_ADDR7_TX USB_ADDR7_TX_ADDR7_TX_Msk /*!< Transmission Buffer Address 7 */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_COUNT0_TX register ****************/ +#define USB_COUNT0_TX_COUNT0_TX_Pos (0U) +#define USB_COUNT0_TX_COUNT0_TX_Msk (0x3FFUL << USB_COUNT0_TX_COUNT0_TX_Pos) /*!< 0x000003FF */ +#define USB_COUNT0_TX_COUNT0_TX USB_COUNT0_TX_COUNT0_TX_Msk /*!< Transmission Byte Count 0 */ + +/***************** Bit definition for USB_COUNT1_TX register ****************/ +#define USB_COUNT1_TX_COUNT1_TX_Pos (0U) +#define USB_COUNT1_TX_COUNT1_TX_Msk (0x3FFUL << USB_COUNT1_TX_COUNT1_TX_Pos) /*!< 0x000003FF */ +#define USB_COUNT1_TX_COUNT1_TX USB_COUNT1_TX_COUNT1_TX_Msk /*!< Transmission Byte Count 1 */ + +/***************** Bit definition for USB_COUNT2_TX register ****************/ +#define USB_COUNT2_TX_COUNT2_TX_Pos (0U) +#define USB_COUNT2_TX_COUNT2_TX_Msk (0x3FFUL << USB_COUNT2_TX_COUNT2_TX_Pos) /*!< 0x000003FF */ +#define USB_COUNT2_TX_COUNT2_TX USB_COUNT2_TX_COUNT2_TX_Msk /*!< Transmission Byte Count 2 */ + +/***************** Bit definition for USB_COUNT3_TX register ****************/ +#define USB_COUNT3_TX_COUNT3_TX_Pos (0U) +#define USB_COUNT3_TX_COUNT3_TX_Msk (0x3FFUL << USB_COUNT3_TX_COUNT3_TX_Pos) /*!< 0x000003FF */ +#define USB_COUNT3_TX_COUNT3_TX USB_COUNT3_TX_COUNT3_TX_Msk /*!< Transmission Byte Count 3 */ + +/***************** Bit definition for USB_COUNT4_TX register ****************/ +#define USB_COUNT4_TX_COUNT4_TX_Pos (0U) +#define USB_COUNT4_TX_COUNT4_TX_Msk (0x3FFUL << USB_COUNT4_TX_COUNT4_TX_Pos) /*!< 0x000003FF */ +#define USB_COUNT4_TX_COUNT4_TX USB_COUNT4_TX_COUNT4_TX_Msk /*!< Transmission Byte Count 4 */ + +/***************** Bit definition for USB_COUNT5_TX register ****************/ +#define USB_COUNT5_TX_COUNT5_TX_Pos (0U) +#define USB_COUNT5_TX_COUNT5_TX_Msk (0x3FFUL << USB_COUNT5_TX_COUNT5_TX_Pos) /*!< 0x000003FF */ +#define USB_COUNT5_TX_COUNT5_TX USB_COUNT5_TX_COUNT5_TX_Msk /*!< Transmission Byte Count 5 */ + +/***************** Bit definition for USB_COUNT6_TX register ****************/ +#define USB_COUNT6_TX_COUNT6_TX_Pos (0U) +#define USB_COUNT6_TX_COUNT6_TX_Msk (0x3FFUL << USB_COUNT6_TX_COUNT6_TX_Pos) /*!< 0x000003FF */ +#define USB_COUNT6_TX_COUNT6_TX USB_COUNT6_TX_COUNT6_TX_Msk /*!< Transmission Byte Count 6 */ + +/***************** Bit definition for USB_COUNT7_TX register ****************/ +#define USB_COUNT7_TX_COUNT7_TX_Pos (0U) +#define USB_COUNT7_TX_COUNT7_TX_Msk (0x3FFUL << USB_COUNT7_TX_COUNT7_TX_Pos) /*!< 0x000003FF */ +#define USB_COUNT7_TX_COUNT7_TX USB_COUNT7_TX_COUNT7_TX_Msk /*!< Transmission Byte Count 7 */ + +/*----------------------------------------------------------------------------*/ + +/**************** Bit definition for USB_COUNT0_TX_0 register ***************/ +#define USB_COUNT0_TX_0_COUNT0_TX_0 0x000003FFU /*!< Transmission Byte Count 0 (low) */ + +/**************** Bit definition for USB_COUNT0_TX_1 register ***************/ +#define USB_COUNT0_TX_1_COUNT0_TX_1 0x03FF0000U /*!< Transmission Byte Count 0 (high) */ + +/**************** Bit definition for USB_COUNT1_TX_0 register ***************/ +#define USB_COUNT1_TX_0_COUNT1_TX_0 0x000003FFU /*!< Transmission Byte Count 1 (low) */ + +/**************** Bit definition for USB_COUNT1_TX_1 register ***************/ +#define USB_COUNT1_TX_1_COUNT1_TX_1 0x03FF0000U /*!< Transmission Byte Count 1 (high) */ + +/**************** Bit definition for USB_COUNT2_TX_0 register ***************/ +#define USB_COUNT2_TX_0_COUNT2_TX_0 0x000003FFU /*!< Transmission Byte Count 2 (low) */ + +/**************** Bit definition for USB_COUNT2_TX_1 register ***************/ +#define USB_COUNT2_TX_1_COUNT2_TX_1 0x03FF0000U /*!< Transmission Byte Count 2 (high) */ + +/**************** Bit definition for USB_COUNT3_TX_0 register ***************/ +#define USB_COUNT3_TX_0_COUNT3_TX_0 0x000003FFU /*!< Transmission Byte Count 3 (low) */ + +/**************** Bit definition for USB_COUNT3_TX_1 register ***************/ +#define USB_COUNT3_TX_1_COUNT3_TX_1 0x03FF0000U /*!< Transmission Byte Count 3 (high) */ + +/**************** Bit definition for USB_COUNT4_TX_0 register ***************/ +#define USB_COUNT4_TX_0_COUNT4_TX_0 0x000003FFU /*!< Transmission Byte Count 4 (low) */ + +/**************** Bit definition for USB_COUNT4_TX_1 register ***************/ +#define USB_COUNT4_TX_1_COUNT4_TX_1 0x03FF0000U /*!< Transmission Byte Count 4 (high) */ + +/**************** Bit definition for USB_COUNT5_TX_0 register ***************/ +#define USB_COUNT5_TX_0_COUNT5_TX_0 0x000003FFU /*!< Transmission Byte Count 5 (low) */ + +/**************** Bit definition for USB_COUNT5_TX_1 register ***************/ +#define USB_COUNT5_TX_1_COUNT5_TX_1 0x03FF0000U /*!< Transmission Byte Count 5 (high) */ + +/**************** Bit definition for USB_COUNT6_TX_0 register ***************/ +#define USB_COUNT6_TX_0_COUNT6_TX_0 0x000003FFU /*!< Transmission Byte Count 6 (low) */ + +/**************** Bit definition for USB_COUNT6_TX_1 register ***************/ +#define USB_COUNT6_TX_1_COUNT6_TX_1 0x03FF0000U /*!< Transmission Byte Count 6 (high) */ + +/**************** Bit definition for USB_COUNT7_TX_0 register ***************/ +#define USB_COUNT7_TX_0_COUNT7_TX_0 0x000003FFU /*!< Transmission Byte Count 7 (low) */ + +/**************** Bit definition for USB_COUNT7_TX_1 register ***************/ +#define USB_COUNT7_TX_1_COUNT7_TX_1 0x03FF0000U /*!< Transmission Byte Count 7 (high) */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_ADDR0_RX register *****************/ +#define USB_ADDR0_RX_ADDR0_RX_Pos (1U) +#define USB_ADDR0_RX_ADDR0_RX_Msk (0x7FFFUL << USB_ADDR0_RX_ADDR0_RX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR0_RX_ADDR0_RX USB_ADDR0_RX_ADDR0_RX_Msk /*!< Reception Buffer Address 0 */ + +/***************** Bit definition for USB_ADDR1_RX register *****************/ +#define USB_ADDR1_RX_ADDR1_RX_Pos (1U) +#define USB_ADDR1_RX_ADDR1_RX_Msk (0x7FFFUL << USB_ADDR1_RX_ADDR1_RX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR1_RX_ADDR1_RX USB_ADDR1_RX_ADDR1_RX_Msk /*!< Reception Buffer Address 1 */ + +/***************** Bit definition for USB_ADDR2_RX register *****************/ +#define USB_ADDR2_RX_ADDR2_RX_Pos (1U) +#define USB_ADDR2_RX_ADDR2_RX_Msk (0x7FFFUL << USB_ADDR2_RX_ADDR2_RX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR2_RX_ADDR2_RX USB_ADDR2_RX_ADDR2_RX_Msk /*!< Reception Buffer Address 2 */ + +/***************** Bit definition for USB_ADDR3_RX register *****************/ +#define USB_ADDR3_RX_ADDR3_RX_Pos (1U) +#define USB_ADDR3_RX_ADDR3_RX_Msk (0x7FFFUL << USB_ADDR3_RX_ADDR3_RX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR3_RX_ADDR3_RX USB_ADDR3_RX_ADDR3_RX_Msk /*!< Reception Buffer Address 3 */ + +/***************** Bit definition for USB_ADDR4_RX register *****************/ +#define USB_ADDR4_RX_ADDR4_RX_Pos (1U) +#define USB_ADDR4_RX_ADDR4_RX_Msk (0x7FFFUL << USB_ADDR4_RX_ADDR4_RX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR4_RX_ADDR4_RX USB_ADDR4_RX_ADDR4_RX_Msk /*!< Reception Buffer Address 4 */ + +/***************** Bit definition for USB_ADDR5_RX register *****************/ +#define USB_ADDR5_RX_ADDR5_RX_Pos (1U) +#define USB_ADDR5_RX_ADDR5_RX_Msk (0x7FFFUL << USB_ADDR5_RX_ADDR5_RX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR5_RX_ADDR5_RX USB_ADDR5_RX_ADDR5_RX_Msk /*!< Reception Buffer Address 5 */ + +/***************** Bit definition for USB_ADDR6_RX register *****************/ +#define USB_ADDR6_RX_ADDR6_RX_Pos (1U) +#define USB_ADDR6_RX_ADDR6_RX_Msk (0x7FFFUL << USB_ADDR6_RX_ADDR6_RX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR6_RX_ADDR6_RX USB_ADDR6_RX_ADDR6_RX_Msk /*!< Reception Buffer Address 6 */ + +/***************** Bit definition for USB_ADDR7_RX register *****************/ +#define USB_ADDR7_RX_ADDR7_RX_Pos (1U) +#define USB_ADDR7_RX_ADDR7_RX_Msk (0x7FFFUL << USB_ADDR7_RX_ADDR7_RX_Pos) /*!< 0x0000FFFE */ +#define USB_ADDR7_RX_ADDR7_RX USB_ADDR7_RX_ADDR7_RX_Msk /*!< Reception Buffer Address 7 */ + +/*----------------------------------------------------------------------------*/ + +/***************** Bit definition for USB_COUNT0_RX register ****************/ +#define USB_COUNT0_RX_COUNT0_RX_Pos (0U) +#define USB_COUNT0_RX_COUNT0_RX_Msk (0x3FFUL << USB_COUNT0_RX_COUNT0_RX_Pos) /*!< 0x000003FF */ +#define USB_COUNT0_RX_COUNT0_RX USB_COUNT0_RX_COUNT0_RX_Msk /*!< Reception Byte Count */ + +#define USB_COUNT0_RX_NUM_BLOCK_Pos (10U) +#define USB_COUNT0_RX_NUM_BLOCK_Msk (0x1FUL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */ +#define USB_COUNT0_RX_NUM_BLOCK USB_COUNT0_RX_NUM_BLOCK_Msk /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT0_RX_NUM_BLOCK_0 (0x01UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */ +#define USB_COUNT0_RX_NUM_BLOCK_1 (0x02UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */ +#define USB_COUNT0_RX_NUM_BLOCK_2 (0x04UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */ +#define USB_COUNT0_RX_NUM_BLOCK_3 (0x08UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */ +#define USB_COUNT0_RX_NUM_BLOCK_4 (0x10UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */ + +#define USB_COUNT0_RX_BLSIZE_Pos (15U) +#define USB_COUNT0_RX_BLSIZE_Msk (0x1UL << USB_COUNT0_RX_BLSIZE_Pos) /*!< 0x00008000 */ +#define USB_COUNT0_RX_BLSIZE USB_COUNT0_RX_BLSIZE_Msk /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT1_RX register ****************/ +#define USB_COUNT1_RX_COUNT1_RX_Pos (0U) +#define USB_COUNT1_RX_COUNT1_RX_Msk (0x3FFUL << USB_COUNT1_RX_COUNT1_RX_Pos) /*!< 0x000003FF */ +#define USB_COUNT1_RX_COUNT1_RX USB_COUNT1_RX_COUNT1_RX_Msk /*!< Reception Byte Count */ + +#define USB_COUNT1_RX_NUM_BLOCK_Pos (10U) +#define USB_COUNT1_RX_NUM_BLOCK_Msk (0x1FUL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */ +#define USB_COUNT1_RX_NUM_BLOCK USB_COUNT1_RX_NUM_BLOCK_Msk /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT1_RX_NUM_BLOCK_0 (0x01UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */ +#define USB_COUNT1_RX_NUM_BLOCK_1 (0x02UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */ +#define USB_COUNT1_RX_NUM_BLOCK_2 (0x04UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */ +#define USB_COUNT1_RX_NUM_BLOCK_3 (0x08UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */ +#define USB_COUNT1_RX_NUM_BLOCK_4 (0x10UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */ + +#define USB_COUNT1_RX_BLSIZE_Pos (15U) +#define USB_COUNT1_RX_BLSIZE_Msk (0x1UL << USB_COUNT1_RX_BLSIZE_Pos) /*!< 0x00008000 */ +#define USB_COUNT1_RX_BLSIZE USB_COUNT1_RX_BLSIZE_Msk /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT2_RX register ****************/ +#define USB_COUNT2_RX_COUNT2_RX_Pos (0U) +#define USB_COUNT2_RX_COUNT2_RX_Msk (0x3FFUL << USB_COUNT2_RX_COUNT2_RX_Pos) /*!< 0x000003FF */ +#define USB_COUNT2_RX_COUNT2_RX USB_COUNT2_RX_COUNT2_RX_Msk /*!< Reception Byte Count */ + +#define USB_COUNT2_RX_NUM_BLOCK_Pos (10U) +#define USB_COUNT2_RX_NUM_BLOCK_Msk (0x1FUL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */ +#define USB_COUNT2_RX_NUM_BLOCK USB_COUNT2_RX_NUM_BLOCK_Msk /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT2_RX_NUM_BLOCK_0 (0x01UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */ +#define USB_COUNT2_RX_NUM_BLOCK_1 (0x02UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */ +#define USB_COUNT2_RX_NUM_BLOCK_2 (0x04UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */ +#define USB_COUNT2_RX_NUM_BLOCK_3 (0x08UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */ +#define USB_COUNT2_RX_NUM_BLOCK_4 (0x10UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */ + +#define USB_COUNT2_RX_BLSIZE_Pos (15U) +#define USB_COUNT2_RX_BLSIZE_Msk (0x1UL << USB_COUNT2_RX_BLSIZE_Pos) /*!< 0x00008000 */ +#define USB_COUNT2_RX_BLSIZE USB_COUNT2_RX_BLSIZE_Msk /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT3_RX register ****************/ +#define USB_COUNT3_RX_COUNT3_RX_Pos (0U) +#define USB_COUNT3_RX_COUNT3_RX_Msk (0x3FFUL << USB_COUNT3_RX_COUNT3_RX_Pos) /*!< 0x000003FF */ +#define USB_COUNT3_RX_COUNT3_RX USB_COUNT3_RX_COUNT3_RX_Msk /*!< Reception Byte Count */ + +#define USB_COUNT3_RX_NUM_BLOCK_Pos (10U) +#define USB_COUNT3_RX_NUM_BLOCK_Msk (0x1FUL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */ +#define USB_COUNT3_RX_NUM_BLOCK USB_COUNT3_RX_NUM_BLOCK_Msk /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT3_RX_NUM_BLOCK_0 (0x01UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */ +#define USB_COUNT3_RX_NUM_BLOCK_1 (0x02UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */ +#define USB_COUNT3_RX_NUM_BLOCK_2 (0x04UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */ +#define USB_COUNT3_RX_NUM_BLOCK_3 (0x08UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */ +#define USB_COUNT3_RX_NUM_BLOCK_4 (0x10UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */ + +#define USB_COUNT3_RX_BLSIZE_Pos (15U) +#define USB_COUNT3_RX_BLSIZE_Msk (0x1UL << USB_COUNT3_RX_BLSIZE_Pos) /*!< 0x00008000 */ +#define USB_COUNT3_RX_BLSIZE USB_COUNT3_RX_BLSIZE_Msk /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT4_RX register ****************/ +#define USB_COUNT4_RX_COUNT4_RX_Pos (0U) +#define USB_COUNT4_RX_COUNT4_RX_Msk (0x3FFUL << USB_COUNT4_RX_COUNT4_RX_Pos) /*!< 0x000003FF */ +#define USB_COUNT4_RX_COUNT4_RX USB_COUNT4_RX_COUNT4_RX_Msk /*!< Reception Byte Count */ + +#define USB_COUNT4_RX_NUM_BLOCK_Pos (10U) +#define USB_COUNT4_RX_NUM_BLOCK_Msk (0x1FUL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */ +#define USB_COUNT4_RX_NUM_BLOCK USB_COUNT4_RX_NUM_BLOCK_Msk /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT4_RX_NUM_BLOCK_0 (0x01UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */ +#define USB_COUNT4_RX_NUM_BLOCK_1 (0x02UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */ +#define USB_COUNT4_RX_NUM_BLOCK_2 (0x04UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */ +#define USB_COUNT4_RX_NUM_BLOCK_3 (0x08UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */ +#define USB_COUNT4_RX_NUM_BLOCK_4 (0x10UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */ + +#define USB_COUNT4_RX_BLSIZE_Pos (15U) +#define USB_COUNT4_RX_BLSIZE_Msk (0x1UL << USB_COUNT4_RX_BLSIZE_Pos) /*!< 0x00008000 */ +#define USB_COUNT4_RX_BLSIZE USB_COUNT4_RX_BLSIZE_Msk /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT5_RX register ****************/ +#define USB_COUNT5_RX_COUNT5_RX_Pos (0U) +#define USB_COUNT5_RX_COUNT5_RX_Msk (0x3FFUL << USB_COUNT5_RX_COUNT5_RX_Pos) /*!< 0x000003FF */ +#define USB_COUNT5_RX_COUNT5_RX USB_COUNT5_RX_COUNT5_RX_Msk /*!< Reception Byte Count */ + +#define USB_COUNT5_RX_NUM_BLOCK_Pos (10U) +#define USB_COUNT5_RX_NUM_BLOCK_Msk (0x1FUL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */ +#define USB_COUNT5_RX_NUM_BLOCK USB_COUNT5_RX_NUM_BLOCK_Msk /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT5_RX_NUM_BLOCK_0 (0x01UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */ +#define USB_COUNT5_RX_NUM_BLOCK_1 (0x02UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */ +#define USB_COUNT5_RX_NUM_BLOCK_2 (0x04UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */ +#define USB_COUNT5_RX_NUM_BLOCK_3 (0x08UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */ +#define USB_COUNT5_RX_NUM_BLOCK_4 (0x10UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */ + +#define USB_COUNT5_RX_BLSIZE_Pos (15U) +#define USB_COUNT5_RX_BLSIZE_Msk (0x1UL << USB_COUNT5_RX_BLSIZE_Pos) /*!< 0x00008000 */ +#define USB_COUNT5_RX_BLSIZE USB_COUNT5_RX_BLSIZE_Msk /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT6_RX register ****************/ +#define USB_COUNT6_RX_COUNT6_RX_Pos (0U) +#define USB_COUNT6_RX_COUNT6_RX_Msk (0x3FFUL << USB_COUNT6_RX_COUNT6_RX_Pos) /*!< 0x000003FF */ +#define USB_COUNT6_RX_COUNT6_RX USB_COUNT6_RX_COUNT6_RX_Msk /*!< Reception Byte Count */ + +#define USB_COUNT6_RX_NUM_BLOCK_Pos (10U) +#define USB_COUNT6_RX_NUM_BLOCK_Msk (0x1FUL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */ +#define USB_COUNT6_RX_NUM_BLOCK USB_COUNT6_RX_NUM_BLOCK_Msk /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT6_RX_NUM_BLOCK_0 (0x01UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */ +#define USB_COUNT6_RX_NUM_BLOCK_1 (0x02UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */ +#define USB_COUNT6_RX_NUM_BLOCK_2 (0x04UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */ +#define USB_COUNT6_RX_NUM_BLOCK_3 (0x08UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */ +#define USB_COUNT6_RX_NUM_BLOCK_4 (0x10UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */ + +#define USB_COUNT6_RX_BLSIZE_Pos (15U) +#define USB_COUNT6_RX_BLSIZE_Msk (0x1UL << USB_COUNT6_RX_BLSIZE_Pos) /*!< 0x00008000 */ +#define USB_COUNT6_RX_BLSIZE USB_COUNT6_RX_BLSIZE_Msk /*!< BLock SIZE */ + +/***************** Bit definition for USB_COUNT7_RX register ****************/ +#define USB_COUNT7_RX_COUNT7_RX_Pos (0U) +#define USB_COUNT7_RX_COUNT7_RX_Msk (0x3FFUL << USB_COUNT7_RX_COUNT7_RX_Pos) /*!< 0x000003FF */ +#define USB_COUNT7_RX_COUNT7_RX USB_COUNT7_RX_COUNT7_RX_Msk /*!< Reception Byte Count */ + +#define USB_COUNT7_RX_NUM_BLOCK_Pos (10U) +#define USB_COUNT7_RX_NUM_BLOCK_Msk (0x1FUL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */ +#define USB_COUNT7_RX_NUM_BLOCK USB_COUNT7_RX_NUM_BLOCK_Msk /*!< NUM_BLOCK[4:0] bits (Number of blocks) */ +#define USB_COUNT7_RX_NUM_BLOCK_0 (0x01UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */ +#define USB_COUNT7_RX_NUM_BLOCK_1 (0x02UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */ +#define USB_COUNT7_RX_NUM_BLOCK_2 (0x04UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */ +#define USB_COUNT7_RX_NUM_BLOCK_3 (0x08UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */ +#define USB_COUNT7_RX_NUM_BLOCK_4 (0x10UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */ + +#define USB_COUNT7_RX_BLSIZE_Pos (15U) +#define USB_COUNT7_RX_BLSIZE_Msk (0x1UL << USB_COUNT7_RX_BLSIZE_Pos) /*!< 0x00008000 */ +#define USB_COUNT7_RX_BLSIZE USB_COUNT7_RX_BLSIZE_Msk /*!< BLock SIZE */ + +/*----------------------------------------------------------------------------*/ + +/**************** Bit definition for USB_COUNT0_RX_0 register ***************/ +#define USB_COUNT0_RX_0_COUNT0_RX_0 0x000003FFU /*!< Reception Byte Count (low) */ + +#define USB_COUNT0_RX_0_NUM_BLOCK_0 0x00007C00U /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_0 0x00000400U /*!< Bit 0 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_1 0x00000800U /*!< Bit 1 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_2 0x00001000U /*!< Bit 2 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_3 0x00002000U /*!< Bit 3 */ +#define USB_COUNT0_RX_0_NUM_BLOCK_0_4 0x00004000U /*!< Bit 4 */ + +#define USB_COUNT0_RX_0_BLSIZE_0 0x00008000U /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT0_RX_1 register ***************/ +#define USB_COUNT0_RX_1_COUNT0_RX_1 0x03FF0000U /*!< Reception Byte Count (high) */ + +#define USB_COUNT0_RX_1_NUM_BLOCK_1 0x7C000000U /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_0 0x04000000U /*!< Bit 1 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_1 0x08000000U /*!< Bit 1 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_2 0x10000000U /*!< Bit 2 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_3 0x20000000U /*!< Bit 3 */ +#define USB_COUNT0_RX_1_NUM_BLOCK_1_4 0x40000000U /*!< Bit 4 */ + +#define USB_COUNT0_RX_1_BLSIZE_1 0x80000000U /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT1_RX_0 register ***************/ +#define USB_COUNT1_RX_0_COUNT1_RX_0 0x000003FFU /*!< Reception Byte Count (low) */ + +#define USB_COUNT1_RX_0_NUM_BLOCK_0 0x00007C00U /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_0 0x00000400U /*!< Bit 0 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_1 0x00000800U /*!< Bit 1 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_2 0x00001000U /*!< Bit 2 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_3 0x00002000U /*!< Bit 3 */ +#define USB_COUNT1_RX_0_NUM_BLOCK_0_4 0x00004000U /*!< Bit 4 */ + +#define USB_COUNT1_RX_0_BLSIZE_0 0x00008000U /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT1_RX_1 register ***************/ +#define USB_COUNT1_RX_1_COUNT1_RX_1 0x03FF0000U /*!< Reception Byte Count (high) */ + +#define USB_COUNT1_RX_1_NUM_BLOCK_1 0x7C000000U /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_0 0x04000000U /*!< Bit 0 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_1 0x08000000U /*!< Bit 1 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_2 0x10000000U /*!< Bit 2 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_3 0x20000000U /*!< Bit 3 */ +#define USB_COUNT1_RX_1_NUM_BLOCK_1_4 0x40000000U /*!< Bit 4 */ + +#define USB_COUNT1_RX_1_BLSIZE_1 0x80000000U /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT2_RX_0 register ***************/ +#define USB_COUNT2_RX_0_COUNT2_RX_0 0x000003FFU /*!< Reception Byte Count (low) */ + +#define USB_COUNT2_RX_0_NUM_BLOCK_0 0x00007C00U /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_0 0x00000400U /*!< Bit 0 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_1 0x00000800U /*!< Bit 1 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_2 0x00001000U /*!< Bit 2 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_3 0x00002000U /*!< Bit 3 */ +#define USB_COUNT2_RX_0_NUM_BLOCK_0_4 0x00004000U /*!< Bit 4 */ + +#define USB_COUNT2_RX_0_BLSIZE_0 0x00008000U /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT2_RX_1 register ***************/ +#define USB_COUNT2_RX_1_COUNT2_RX_1 0x03FF0000U /*!< Reception Byte Count (high) */ + +#define USB_COUNT2_RX_1_NUM_BLOCK_1 0x7C000000U /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_0 0x04000000U /*!< Bit 0 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_1 0x08000000U /*!< Bit 1 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_2 0x10000000U /*!< Bit 2 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_3 0x20000000U /*!< Bit 3 */ +#define USB_COUNT2_RX_1_NUM_BLOCK_1_4 0x40000000U /*!< Bit 4 */ + +#define USB_COUNT2_RX_1_BLSIZE_1 0x80000000U /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT3_RX_0 register ***************/ +#define USB_COUNT3_RX_0_COUNT3_RX_0 0x000003FFU /*!< Reception Byte Count (low) */ + +#define USB_COUNT3_RX_0_NUM_BLOCK_0 0x00007C00U /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_0 0x00000400U /*!< Bit 0 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_1 0x00000800U /*!< Bit 1 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_2 0x00001000U /*!< Bit 2 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_3 0x00002000U /*!< Bit 3 */ +#define USB_COUNT3_RX_0_NUM_BLOCK_0_4 0x00004000U /*!< Bit 4 */ + +#define USB_COUNT3_RX_0_BLSIZE_0 0x00008000U /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT3_RX_1 register ***************/ +#define USB_COUNT3_RX_1_COUNT3_RX_1 0x03FF0000U /*!< Reception Byte Count (high) */ + +#define USB_COUNT3_RX_1_NUM_BLOCK_1 0x7C000000U /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_0 0x04000000U /*!< Bit 0 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_1 0x08000000U /*!< Bit 1 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_2 0x10000000U /*!< Bit 2 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_3 0x20000000U /*!< Bit 3 */ +#define USB_COUNT3_RX_1_NUM_BLOCK_1_4 0x40000000U /*!< Bit 4 */ + +#define USB_COUNT3_RX_1_BLSIZE_1 0x80000000U /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT4_RX_0 register ***************/ +#define USB_COUNT4_RX_0_COUNT4_RX_0 0x000003FFU /*!< Reception Byte Count (low) */ + +#define USB_COUNT4_RX_0_NUM_BLOCK_0 0x00007C00U /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_0 0x00000400U /*!< Bit 0 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_1 0x00000800U /*!< Bit 1 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_2 0x00001000U /*!< Bit 2 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_3 0x00002000U /*!< Bit 3 */ +#define USB_COUNT4_RX_0_NUM_BLOCK_0_4 0x00004000U /*!< Bit 4 */ + +#define USB_COUNT4_RX_0_BLSIZE_0 0x00008000U /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT4_RX_1 register ***************/ +#define USB_COUNT4_RX_1_COUNT4_RX_1 0x03FF0000U /*!< Reception Byte Count (high) */ + +#define USB_COUNT4_RX_1_NUM_BLOCK_1 0x7C000000U /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_0 0x04000000U /*!< Bit 0 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_1 0x08000000U /*!< Bit 1 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_2 0x10000000U /*!< Bit 2 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_3 0x20000000U /*!< Bit 3 */ +#define USB_COUNT4_RX_1_NUM_BLOCK_1_4 0x40000000U /*!< Bit 4 */ + +#define USB_COUNT4_RX_1_BLSIZE_1 0x80000000U /*!< BLock SIZE (high) */ + +/**************** Bit definition for USB_COUNT5_RX_0 register ***************/ +#define USB_COUNT5_RX_0_COUNT5_RX_0 0x000003FFU /*!< Reception Byte Count (low) */ + +#define USB_COUNT5_RX_0_NUM_BLOCK_0 0x00007C00U /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_0 0x00000400U /*!< Bit 0 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_1 0x00000800U /*!< Bit 1 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_2 0x00001000U /*!< Bit 2 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_3 0x00002000U /*!< Bit 3 */ +#define USB_COUNT5_RX_0_NUM_BLOCK_0_4 0x00004000U /*!< Bit 4 */ + +#define USB_COUNT5_RX_0_BLSIZE_0 0x00008000U /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT5_RX_1 register ***************/ +#define USB_COUNT5_RX_1_COUNT5_RX_1 0x03FF0000U /*!< Reception Byte Count (high) */ + +#define USB_COUNT5_RX_1_NUM_BLOCK_1 0x7C000000U /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_0 0x04000000U /*!< Bit 0 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_1 0x08000000U /*!< Bit 1 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_2 0x10000000U /*!< Bit 2 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_3 0x20000000U /*!< Bit 3 */ +#define USB_COUNT5_RX_1_NUM_BLOCK_1_4 0x40000000U /*!< Bit 4 */ + +#define USB_COUNT5_RX_1_BLSIZE_1 0x80000000U /*!< BLock SIZE (high) */ + +/*************** Bit definition for USB_COUNT6_RX_0 register ***************/ +#define USB_COUNT6_RX_0_COUNT6_RX_0 0x000003FFU /*!< Reception Byte Count (low) */ + +#define USB_COUNT6_RX_0_NUM_BLOCK_0 0x00007C00U /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_0 0x00000400U /*!< Bit 0 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_1 0x00000800U /*!< Bit 1 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_2 0x00001000U /*!< Bit 2 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_3 0x00002000U /*!< Bit 3 */ +#define USB_COUNT6_RX_0_NUM_BLOCK_0_4 0x00004000U /*!< Bit 4 */ + +#define USB_COUNT6_RX_0_BLSIZE_0 0x00008000U /*!< BLock SIZE (low) */ + +/**************** Bit definition for USB_COUNT6_RX_1 register ***************/ +#define USB_COUNT6_RX_1_COUNT6_RX_1 0x03FF0000U /*!< Reception Byte Count (high) */ + +#define USB_COUNT6_RX_1_NUM_BLOCK_1 0x7C000000U /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_0 0x04000000U /*!< Bit 0 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_1 0x08000000U /*!< Bit 1 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_2 0x10000000U /*!< Bit 2 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_3 0x20000000U /*!< Bit 3 */ +#define USB_COUNT6_RX_1_NUM_BLOCK_1_4 0x40000000U /*!< Bit 4 */ + +#define USB_COUNT6_RX_1_BLSIZE_1 0x80000000U /*!< BLock SIZE (high) */ + +/*************** Bit definition for USB_COUNT7_RX_0 register ****************/ +#define USB_COUNT7_RX_0_COUNT7_RX_0 0x000003FFU /*!< Reception Byte Count (low) */ + +#define USB_COUNT7_RX_0_NUM_BLOCK_0 0x00007C00U /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_0 0x00000400U /*!< Bit 0 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_1 0x00000800U /*!< Bit 1 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_2 0x00001000U /*!< Bit 2 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_3 0x00002000U /*!< Bit 3 */ +#define USB_COUNT7_RX_0_NUM_BLOCK_0_4 0x00004000U /*!< Bit 4 */ + +#define USB_COUNT7_RX_0_BLSIZE_0 0x00008000U /*!< BLock SIZE (low) */ + +/*************** Bit definition for USB_COUNT7_RX_1 register ****************/ +#define USB_COUNT7_RX_1_COUNT7_RX_1 0x03FF0000U /*!< Reception Byte Count (high) */ + +#define USB_COUNT7_RX_1_NUM_BLOCK_1 0x7C000000U /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_0 0x04000000U /*!< Bit 0 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_1 0x08000000U /*!< Bit 1 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_2 0x10000000U /*!< Bit 2 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_3 0x20000000U /*!< Bit 3 */ +#define USB_COUNT7_RX_1_NUM_BLOCK_1_4 0x40000000U /*!< Bit 4 */ + +#define USB_COUNT7_RX_1_BLSIZE_1 0x80000000U /*!< BLock SIZE (high) */ + +/** + * @} + */ + +#define BTABLE_ADDRESS 0x000U + +#ifndef PMA_ACCESS +#define PMA_ACCESS 2U +#endif +/******************** Bit definition for USB_COUNTn_RX register *************/ +#define USB_CNTRX_NBLK_MSK (0x1FU << 10) +#define USB_CNTRX_BLSIZE (0x1U << 15) + +/* SetENDPOINT */ +#define PCD_SET_ENDPOINT(USBx, bEpNum, wRegValue) (*(__IO uint16_t *)(&(USBx)->EP0R + ((bEpNum) * 2U)) = (uint16_t)(wRegValue)) + +/* GetENDPOINT */ +#define PCD_GET_ENDPOINT(USBx, bEpNum) (*(__IO uint16_t *)(&(USBx)->EP0R + ((bEpNum) * 2U))) + +/** + * @brief sets the type in the endpoint register(bits EP_TYPE[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wType Endpoint Type. + * @retval None + */ +#define PCD_SET_EPTYPE(USBx, bEpNum, wType) (PCD_SET_ENDPOINT((USBx), (bEpNum), ((PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EP_T_MASK) | (wType) | USB_EP_CTR_TX | USB_EP_CTR_RX))) + +/** + * @brief gets the type in the endpoint register(bits EP_TYPE[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval Endpoint Type + */ +#define PCD_GET_EPTYPE(USBx, bEpNum) (PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EP_T_FIELD) + +/** + * @brief free buffer used from the application realizing it to the line + * toggles bit SW_BUF in the double buffered endpoint register + * @param USBx USB device. + * @param bEpNum, bDir + * @retval None + */ +#define PCD_FreeUserBuffer(USBx, bEpNum, bDir) \ + do { \ + if ((bDir) == 0U) \ + { \ + /* OUT double buffered endpoint */ \ + PCD_TX_DTOG((USBx), (bEpNum)); \ + } \ + else if ((bDir) == 1U) \ + { \ + /* IN double buffered endpoint */ \ + PCD_RX_DTOG((USBx), (bEpNum)); \ + } \ + } while(0) + +/** + * @brief sets the status for tx transfer (bits STAT_TX[1:0]). + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wState new state + * @retval None + */ +#define PCD_SET_EP_TX_STATUS(USBx, bEpNum, wState) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPTX_DTOGMASK; \ + /* toggle first bit ? */ \ + if ((USB_EPTX_DTOG1 & (wState))!= 0U) \ + { \ + _wRegVal ^= USB_EPTX_DTOG1; \ + } \ + /* toggle second bit ? */ \ + if ((USB_EPTX_DTOG2 & (wState))!= 0U) \ + { \ + _wRegVal ^= USB_EPTX_DTOG2; \ + } \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_SET_EP_TX_STATUS */ + +/** + * @brief sets the status for rx transfer (bits STAT_TX[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wState new state + * @retval None + */ +#define PCD_SET_EP_RX_STATUS(USBx, bEpNum,wState) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPRX_DTOGMASK; \ + /* toggle first bit ? */ \ + if ((USB_EPRX_DTOG1 & (wState))!= 0U) \ + { \ + _wRegVal ^= USB_EPRX_DTOG1; \ + } \ + /* toggle second bit ? */ \ + if ((USB_EPRX_DTOG2 & (wState))!= 0U) \ + { \ + _wRegVal ^= USB_EPRX_DTOG2; \ + } \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_SET_EP_RX_STATUS */ + +/** + * @brief sets the status for rx & tx (bits STAT_TX[1:0] & STAT_RX[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wStaterx new state. + * @param wStatetx new state. + * @retval None + */ +#define PCD_SET_EP_TXRX_STATUS(USBx, bEpNum, wStaterx, wStatetx) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (USB_EPRX_DTOGMASK | USB_EPTX_STAT); \ + /* toggle first bit ? */ \ + if ((USB_EPRX_DTOG1 & (wStaterx))!= 0U) \ + { \ + _wRegVal ^= USB_EPRX_DTOG1; \ + } \ + /* toggle second bit ? */ \ + if ((USB_EPRX_DTOG2 & (wStaterx))!= 0U) \ + { \ + _wRegVal ^= USB_EPRX_DTOG2; \ + } \ + /* toggle first bit ? */ \ + if ((USB_EPTX_DTOG1 & (wStatetx))!= 0U) \ + { \ + _wRegVal ^= USB_EPTX_DTOG1; \ + } \ + /* toggle second bit ? */ \ + if ((USB_EPTX_DTOG2 & (wStatetx))!= 0U) \ + { \ + _wRegVal ^= USB_EPTX_DTOG2; \ + } \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_SET_EP_TXRX_STATUS */ + +/** + * @brief gets the status for tx/rx transfer (bits STAT_TX[1:0] + * /STAT_RX[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval status + */ +#define PCD_GET_EP_TX_STATUS(USBx, bEpNum) ((uint16_t)PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPTX_STAT) +#define PCD_GET_EP_RX_STATUS(USBx, bEpNum) ((uint16_t)PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPRX_STAT) + +/** + * @brief sets directly the VALID tx/rx-status into the endpoint register + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_SET_EP_TX_VALID(USBx, bEpNum) (PCD_SET_EP_TX_STATUS((USBx), (bEpNum), USB_EP_TX_VALID)) +#define PCD_SET_EP_RX_VALID(USBx, bEpNum) (PCD_SET_EP_RX_STATUS((USBx), (bEpNum), USB_EP_RX_VALID)) + +/** + * @brief checks stall condition in an endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval TRUE = endpoint in stall condition. + */ +#define PCD_GET_EP_TX_STALL_STATUS(USBx, bEpNum) (PCD_GET_EP_TX_STATUS((USBx), (bEpNum)) == USB_EP_TX_STALL) +#define PCD_GET_EP_RX_STALL_STATUS(USBx, bEpNum) (PCD_GET_EP_RX_STATUS((USBx), (bEpNum)) == USB_EP_RX_STALL) + +/** + * @brief set & clear EP_KIND bit. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_SET_EP_KIND(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_KIND)); \ + } while(0) /* PCD_SET_EP_KIND */ + +#define PCD_CLEAR_EP_KIND(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPKIND_MASK; \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_CLEAR_EP_KIND */ + +/** + * @brief Sets/clears directly STATUS_OUT bit in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_SET_OUT_STATUS(USBx, bEpNum) PCD_SET_EP_KIND((USBx), (bEpNum)) +#define PCD_CLEAR_OUT_STATUS(USBx, bEpNum) PCD_CLEAR_EP_KIND((USBx), (bEpNum)) + +/** + * @brief Sets/clears directly EP_KIND bit in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_SET_EP_DBUF(USBx, bEpNum) PCD_SET_EP_KIND((USBx), (bEpNum)) +#define PCD_CLEAR_EP_DBUF(USBx, bEpNum) PCD_CLEAR_EP_KIND((USBx), (bEpNum)) + +/** + * @brief Clears bit CTR_RX / CTR_TX in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_CLEAR_RX_EP_CTR(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (0x7FFFU & USB_EPREG_MASK); \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_TX)); \ + } while(0) /* PCD_CLEAR_RX_EP_CTR */ + +#define PCD_CLEAR_TX_EP_CTR(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (0xFF7FU & USB_EPREG_MASK); \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX)); \ + } while(0) /* PCD_CLEAR_TX_EP_CTR */ + +/** + * @brief Toggles DTOG_RX / DTOG_TX bit in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_RX_DTOG(USBx, bEpNum) \ + do { \ + uint16_t _wEPVal; \ + \ + _wEPVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wEPVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_RX)); \ + } while(0) /* PCD_RX_DTOG */ + +#define PCD_TX_DTOG(USBx, bEpNum) \ + do { \ + uint16_t _wEPVal; \ + \ + _wEPVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wEPVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_TX)); \ + } while(0) /* PCD_TX_DTOG */ +/** + * @brief Clears DTOG_RX / DTOG_TX bit in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_CLEAR_RX_DTOG(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)); \ + \ + if ((_wRegVal & USB_EP_DTOG_RX) != 0U)\ + { \ + PCD_RX_DTOG((USBx), (bEpNum)); \ + } \ + } while(0) /* PCD_CLEAR_RX_DTOG */ + +#define PCD_CLEAR_TX_DTOG(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)); \ + \ + if ((_wRegVal & USB_EP_DTOG_TX) != 0U)\ + { \ + PCD_TX_DTOG((USBx), (bEpNum)); \ + } \ + } while(0) /* PCD_CLEAR_TX_DTOG */ + +/** + * @brief Sets address in an endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param bAddr Address. + * @retval None + */ +#define PCD_SET_EP_ADDRESS(USBx, bEpNum, bAddr) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = (PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK) | (bAddr); \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_SET_EP_ADDRESS */ + +/** + * @brief Gets address in an endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_GET_EP_ADDRESS(USBx, bEpNum) ((uint8_t)(PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPADDR_FIELD)) + +#define PCD_EP_TX_CNT(USBx, bEpNum) ((uint16_t *)((((uint32_t)(USBx)->BTABLE + ((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS) + ((uint32_t)(USBx) + 0x400U))) +#define PCD_EP_RX_CNT(USBx, bEpNum) ((uint16_t *)((((uint32_t)(USBx)->BTABLE + ((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS) + ((uint32_t)(USBx) + 0x400U))) + +/** + * @brief sets address of the tx/rx buffer. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wAddr address to be set (must be word aligned). + * @retval None + */ +#define PCD_SET_EP_TX_ADDRESS(USBx, bEpNum, wAddr) \ + do { \ + __IO uint16_t *_wRegVal; \ + uint32_t _wRegBase = (uint32_t)USBx; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + _wRegVal = (__IO uint16_t *)(_wRegBase + 0x400U + (((uint32_t)(bEpNum) * 8U) * PMA_ACCESS)); \ + *_wRegVal = ((wAddr) >> 1) << 1; \ + } while(0) /* PCD_SET_EP_TX_ADDRESS */ + +#define PCD_SET_EP_RX_ADDRESS(USBx, bEpNum, wAddr) \ + do { \ + __IO uint16_t *_wRegVal; \ + uint32_t _wRegBase = (uint32_t)USBx; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + _wRegVal = (__IO uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 4U) * PMA_ACCESS)); \ + *_wRegVal = ((wAddr) >> 1) << 1; \ + } while(0) /* PCD_SET_EP_RX_ADDRESS */ + +/** + * @brief Gets address of the tx/rx buffer. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval address of the buffer. + */ +#define PCD_GET_EP_TX_ADDRESS(USBx, bEpNum) ((uint16_t)*PCD_EP_TX_ADDRESS((USBx), (bEpNum))) +#define PCD_GET_EP_RX_ADDRESS(USBx, bEpNum) ((uint16_t)*PCD_EP_RX_ADDRESS((USBx), (bEpNum))) + +/** + * @brief Sets counter of rx buffer with no. of blocks. + * @param pdwReg Register pointer + * @param wCount Counter. + * @param wNBlocks no. of Blocks. + * @retval None + */ +#define PCD_CALC_BLK32(pdwReg, wCount, wNBlocks) \ + do { \ + (wNBlocks) = (wCount) >> 5; \ + if (((wCount) & 0x1fU) == 0U) \ + { \ + (wNBlocks)--; \ + } \ + *(pdwReg) = (uint16_t)(((wNBlocks) << 10) | USB_CNTRX_BLSIZE); \ + } while(0) /* PCD_CALC_BLK32 */ + +#define PCD_CALC_BLK2(pdwReg, wCount, wNBlocks) \ + do { \ + (wNBlocks) = (wCount) >> 1; \ + if (((wCount) & 0x1U) != 0U) \ + { \ + (wNBlocks)++; \ + } \ + *(pdwReg) = (uint16_t)((wNBlocks) << 10); \ + } while(0) /* PCD_CALC_BLK2 */ + +#define PCD_SET_EP_CNT_RX_REG(pdwReg, wCount) \ + do { \ + uint32_t wNBlocks; \ + if ((wCount) == 0U) \ + { \ + *(pdwReg) &= (uint16_t)~USB_CNTRX_NBLK_MSK; \ + *(pdwReg) |= USB_CNTRX_BLSIZE; \ + } \ + else if((wCount) <= 62U) \ + { \ + PCD_CALC_BLK2((pdwReg), (wCount), wNBlocks); \ + } \ + else \ + { \ + PCD_CALC_BLK32((pdwReg), (wCount), wNBlocks); \ + } \ + } while(0) /* PCD_SET_EP_CNT_RX_REG */ + +#define PCD_SET_EP_RX_DBUF0_CNT(USBx, bEpNum, wCount) \ + do { \ + uint32_t _wRegBase = (uint32_t)(USBx); \ + __IO uint16_t *pdwReg; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + pdwReg = (__IO uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS)); \ + PCD_SET_EP_CNT_RX_REG(pdwReg, (wCount)); \ + } while(0) + +/** + * @brief sets counter for the tx/rx buffer. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wCount Counter value. + * @retval None + */ +#define PCD_SET_EP_TX_CNT(USBx, bEpNum, wCount) \ + do { \ + uint32_t _wRegBase = (uint32_t)(USBx); \ + __IO uint16_t *_wRegVal; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + _wRegVal = (__IO uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS)); \ + *_wRegVal = (uint16_t)(wCount); \ + } while(0) + +#define PCD_SET_EP_RX_CNT(USBx, bEpNum, wCount) \ + do { \ + uint32_t _wRegBase = (uint32_t)(USBx); \ + __IO uint16_t *_wRegVal; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + _wRegVal = (__IO uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS)); \ + PCD_SET_EP_CNT_RX_REG(_wRegVal, (wCount)); \ + } while(0) + +/** + * @brief gets counter of the tx buffer. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval Counter value + */ +#define PCD_GET_EP_TX_CNT(USBx, bEpNum) ((uint32_t)(*PCD_EP_TX_CNT((USBx), (bEpNum))) & 0x3ffU) +#define PCD_GET_EP_RX_CNT(USBx, bEpNum) ((uint32_t)(*PCD_EP_RX_CNT((USBx), (bEpNum))) & 0x3ffU) + +/** + * @brief Sets buffer 0/1 address in a double buffer endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wBuf0Addr buffer 0 address. + * @retval Counter value + */ +#define PCD_SET_EP_DBUF0_ADDR(USBx, bEpNum, wBuf0Addr) \ + do { \ + PCD_SET_EP_TX_ADDRESS((USBx), (bEpNum), (wBuf0Addr)); \ + } while(0) /* PCD_SET_EP_DBUF0_ADDR */ + +#define PCD_SET_EP_DBUF1_ADDR(USBx, bEpNum, wBuf1Addr) \ + do { \ + PCD_SET_EP_RX_ADDRESS((USBx), (bEpNum), (wBuf1Addr)); \ + } while(0) /* PCD_SET_EP_DBUF1_ADDR */ + +/** + * @brief Sets addresses in a double buffer endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wBuf0Addr: buffer 0 address. + * @param wBuf1Addr = buffer 1 address. + * @retval None + */ +#define PCD_SET_EP_DBUF_ADDR(USBx, bEpNum, wBuf0Addr, wBuf1Addr) \ + do { \ + PCD_SET_EP_DBUF0_ADDR((USBx), (bEpNum), (wBuf0Addr)); \ + PCD_SET_EP_DBUF1_ADDR((USBx), (bEpNum), (wBuf1Addr)); \ + } while(0) /* PCD_SET_EP_DBUF_ADDR */ + +/** + * @brief Gets buffer 0/1 address of a double buffer endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_GET_EP_DBUF0_ADDR(USBx, bEpNum) (PCD_GET_EP_TX_ADDRESS((USBx), (bEpNum))) +#define PCD_GET_EP_DBUF1_ADDR(USBx, bEpNum) (PCD_GET_EP_RX_ADDRESS((USBx), (bEpNum))) + +/** + * @brief Gets buffer 0/1 address of a double buffer endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param bDir endpoint dir EP_DBUF_OUT = OUT + * EP_DBUF_IN = IN + * @param wCount: Counter value + * @retval None + */ +#define PCD_SET_EP_DBUF0_CNT(USBx, bEpNum, bDir, wCount) \ + do { \ + if ((bDir) == 0U) \ + /* OUT endpoint */ \ + { \ + PCD_SET_EP_RX_DBUF0_CNT((USBx), (bEpNum), (wCount)); \ + } \ + else \ + { \ + if ((bDir) == 1U) \ + { \ + /* IN endpoint */ \ + PCD_SET_EP_TX_CNT((USBx), (bEpNum), (wCount)); \ + } \ + } \ + } while(0) /* SetEPDblBuf0Count*/ + +#define PCD_SET_EP_DBUF1_CNT(USBx, bEpNum, bDir, wCount) \ + do { \ + uint32_t _wBase = (uint32_t)(USBx); \ + __IO uint16_t *_wEPRegVal; \ + \ + if ((bDir) == 0U) \ + { \ + /* OUT endpoint */ \ + PCD_SET_EP_RX_CNT((USBx), (bEpNum), (wCount)); \ + } \ + else \ + { \ + if ((bDir) == 1U) \ + { \ + /* IN endpoint */ \ + _wBase += (uint32_t)(USBx)->BTABLE; \ + _wEPRegVal = (__IO uint16_t *)(_wBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS)); \ + *_wEPRegVal = (uint16_t)(wCount); \ + } \ + } \ + } while(0) /* SetEPDblBuf1Count */ + +#define PCD_SET_EP_DBUF_CNT(USBx, bEpNum, bDir, wCount) \ + do { \ + PCD_SET_EP_DBUF0_CNT((USBx), (bEpNum), (bDir), (wCount)); \ + PCD_SET_EP_DBUF1_CNT((USBx), (bEpNum), (bDir), (wCount)); \ + } while(0) /* PCD_SET_EP_DBUF_CNT */ + +/** + * @brief Gets buffer 0/1 rx/tx counter for double buffering. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_GET_EP_DBUF0_CNT(USBx, bEpNum) (PCD_GET_EP_TX_CNT((USBx), (bEpNum))) +#define PCD_GET_EP_DBUF1_CNT(USBx, bEpNum) (PCD_GET_EP_RX_CNT((USBx), (bEpNum))) + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/fsdev/usb_glue_st.c b/src/lib/CherryUSB/port/fsdev/usb_glue_st.c new file mode 100644 index 000000000..70a98acb7 --- /dev/null +++ b/src/lib/CherryUSB/port/fsdev/usb_glue_st.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" + +#if __has_include("stm32f0xx_hal.h") +#include "stm32f0xx_hal.h" +#elif __has_include("stm32f1xx_hal.h") +#include "stm32f1xx_hal.h" +#elif __has_include("stm32f3xx_hal.h") +#include "stm32f3xx_hal.h" +#elif __has_include("stm32g0xx_hal.h") +#include "stm32g0xx_hal.h" +#elif __has_include("stm32g4xx_hal.h") +#include "stm32g4xx_hal.h" +#elif __has_include("stm32l0xx_hal.h") +#include "stm32l0xx_hal.h" +#elif __has_include("stm32l1xx_hal.h") +#include "stm32l1xx_hal.h" +#elif __has_include("stm32l4xx_hal.h") +#include "stm32l4xx_hal.h" +#elif __has_include("stm32l5xx_hal.h") +#include "stm32l5xx_hal.h" +#endif + +#if !defined(HAL_PCD_MODULE_ENABLED) +#error please define HAL_PCD_MODULE_ENABLED in stm32xxx_hal_conf.h +#endif + +#ifndef CONFIG_USBDEV_FSDEV_PMA_ACCESS +#error "please define CONFIG_USBDEV_FSDEV_PMA_ACCESS in usb_config.h" +#endif + +#if CONFIG_USBDEV_FSDEV_PMA_ACCESS != PMA_ACCESS +#error "CONFIG_USBDEV_FSDEV_PMA_ACCESS must be equal PMA_ACCESS" +#endif + +struct fsdev_instance { + USB_TypeDef *Instance; +}; + +static struct fsdev_instance g_fsdev_instance; + +void usb_dc_low_level_init(uint8_t busid) +{ + g_fsdev_instance.Instance = (USB_TypeDef *)g_usbdev_bus[busid].reg_base; + HAL_PCD_MspInit((PCD_HandleTypeDef *)&g_fsdev_instance); +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + g_fsdev_instance.Instance = (USB_TypeDef *)g_usbdev_bus[busid].reg_base; + HAL_PCD_MspDeInit((PCD_HandleTypeDef *)&g_fsdev_instance); +} + +void USB_IRQHandler(void) +{ + USBD_IRQHandler(0); +} + +void USB_LP_IRQHandler(void) +{ + USBD_IRQHandler(0); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/hpmicro/README.md b/src/lib/CherryUSB/port/hpmicro/README.md new file mode 100644 index 000000000..558074dda --- /dev/null +++ b/src/lib/CherryUSB/port/hpmicro/README.md @@ -0,0 +1,5 @@ +# Note + +## Support Chip List + +- HPM all series (HPMicro + EHCI) diff --git a/src/lib/CherryUSB/port/hpmicro/usb_dc_hpm.c b/src/lib/CherryUSB/port/hpmicro/usb_dc_hpm.c new file mode 100644 index 000000000..a3a9fdc10 --- /dev/null +++ b/src/lib/CherryUSB/port/hpmicro/usb_dc_hpm.c @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2022-2025 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +#include "usbd_core.h" +#include "hpm_usb_device.h" +#include "usb_glue_hpm.h" + +#define USB_NUM_BIDIR_ENDPOINTS USB_SOC_DCD_MAX_ENDPOINT_COUNT + +/* USBSTS, USBINTR */ +enum { + intr_usb = USB_USBINTR_UE_MASK, + intr_error = USB_USBINTR_UEE_MASK, + intr_port_change = USB_USBINTR_PCE_MASK, + intr_reset = USB_USBINTR_URE_MASK, + intr_sof = USB_USBINTR_SRE_MASK, + intr_suspend = USB_USBINTR_SLE_MASK, + intr_nak = USB_USBINTR_NAKE_MASK, +}; + +/* Endpoint state */ +struct hpm_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +/*---------------------------------------------------------------------* + * Variable Definitions + *---------------------------------------------------------------------*/ +/* Driver state */ +struct hpm_udc { + usb_device_handle_t *handle; + bool is_suspend; + struct hpm_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ + struct hpm_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ +} g_hpm_udc[CONFIG_USBDEV_MAX_BUS]; + +static USB_NOCACHE_RAM_SECTION ATTR_ALIGN(USB_SOC_DCD_DATA_RAM_ADDRESS_ALIGNMENT) + uint8_t _dcd_data[CONFIG_USBDEV_MAX_BUS][HPM_ALIGN_UP(sizeof(dcd_data_t), USB_SOC_DCD_DATA_RAM_ADDRESS_ALIGNMENT)]; +static USB_NOCACHE_RAM_SECTION usb_device_handle_t usb_device_handle[CONFIG_USBDEV_MAX_BUS]; + +/* Index to bit position in register */ +static inline uint8_t ep_idx2bit(uint8_t ep_idx) +{ + return ep_idx / 2 + ((ep_idx % 2) ? 16 : 0); +} + +static void usb_dc_isr_connect(uint8_t busid) +{ + if (g_usbdev_bus[busid].reg_base == HPM_USB0_BASE) { + g_usb_hpm_busid[0] = busid; + g_usb_hpm_irq[0] = USBD_IRQHandler; + + hpm_usb_isr_enable(HPM_USB0_BASE); + } else { +#ifdef HPM_USB1_BASE + g_usb_hpm_busid[1] = busid; + g_usb_hpm_irq[1] = USBD_IRQHandler; + + hpm_usb_isr_enable(HPM_USB1_BASE); +#endif + } +} + +static void usb_dc_isr_disconnect(uint8_t busid) +{ + if (g_usbdev_bus[busid].reg_base == HPM_USB0_BASE) { + hpm_usb_isr_disable(HPM_USB0_BASE); + + g_usb_hpm_busid[0] = 0; + g_usb_hpm_irq[0] = NULL; + } else { +#ifdef HPM_USB1_BASE + hpm_usb_isr_disable(HPM_USB1_BASE); + + g_usb_hpm_busid[1] = 0; + g_usb_hpm_irq[1] = NULL; +#endif + } +} + +int usb_dc_init(uint8_t busid) +{ + memset(&g_hpm_udc[busid], 0, sizeof(struct hpm_udc)); + g_hpm_udc[busid].handle = &usb_device_handle[busid]; + g_hpm_udc[busid].handle->regs = (USB_Type *)g_usbdev_bus[busid].reg_base; + g_hpm_udc[busid].handle->dcd_data = (dcd_data_t *)&_dcd_data[busid][0]; + + uint32_t int_mask; + int_mask = (intr_usb | intr_error |intr_port_change | intr_reset | intr_suspend); + +#ifdef CONFIG_USBDEV_SOF_ENABLE + int_mask |= intr_sof; +#endif + + usb_device_init(g_hpm_udc[busid].handle, int_mask); +#ifdef CONFIG_USB_OTG_ENABLE + usb_otgsc_enable_id_chg_int(g_hpm_udc[busid].handle->regs); +#endif + usb_dc_isr_connect(busid); + + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + usb_dc_isr_disconnect(busid); + + usb_device_deinit(g_hpm_udc[busid].handle); + + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + usb_device_handle_t *handle = g_hpm_udc[busid].handle; + usb_dcd_set_address(handle->regs, addr); + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + USB_Type *ptr; + + ptr = g_hpm_udc[busid].handle->regs; + + if (!usb_get_suspend_status(ptr)) { + return -1; + } + + usb_force_port_resume(ptr); + + return 0; +} + +void usbd_execute_test_mode(uint8_t busid, uint8_t test_mode) +{ + usb_set_port_test_mode(g_hpm_udc[busid].handle->regs, test_mode); +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + uint8_t speed; + + speed = usb_get_port_speed(g_hpm_udc[busid].handle->regs); + + if (speed == 0x00) { + return USB_SPEED_FULL; + } + if (speed == 0x01) { + return USB_SPEED_LOW; + } + if (speed == 0x02) { + return USB_SPEED_HIGH; + } + + return 0; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + usb_endpoint_config_t tmp_ep_cfg; + usb_device_handle_t *handle = g_hpm_udc[busid].handle; + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + + tmp_ep_cfg.xfer = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + tmp_ep_cfg.ep_addr = ep->bEndpointAddress; + tmp_ep_cfg.max_packet_size = ep->wMaxPacketSize; + + usb_device_edpt_open(handle, &tmp_ep_cfg); + + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_hpm_udc[busid].out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_hpm_udc[busid].out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_hpm_udc[busid].out_ep[ep_idx].ep_enable = true; + } else { + g_hpm_udc[busid].in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_hpm_udc[busid].in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_hpm_udc[busid].in_ep[ep_idx].ep_enable = true; + } + + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + usb_device_handle_t *handle = g_hpm_udc[busid].handle; + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (USB_EP_DIR_IS_OUT(ep)) { + g_hpm_udc[busid].out_ep[ep_idx].ep_enable = false; + } else { + g_hpm_udc[busid].in_ep[ep_idx].ep_enable = false; + } + + usb_device_edpt_close(handle, ep); + + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + usb_device_handle_t *handle = g_hpm_udc[busid].handle; + + usb_device_edpt_stall(handle, ep); + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + usb_device_handle_t *handle = g_hpm_udc[busid].handle; + + usb_device_edpt_clear_stall(handle, ep); + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + usb_device_handle_t *handle = g_hpm_udc[busid].handle; + + *stalled = usb_device_edpt_check_stall(handle, ep); + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + usb_device_handle_t *handle = g_hpm_udc[busid].handle; + + if (!data && data_len) { + return -1; + } + if (!g_hpm_udc[busid].in_ep[ep_idx].ep_enable) { + return -2; + } + +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)data % CONFIG_USB_ALIGN_SIZE), "data is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + + g_hpm_udc[busid].in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_hpm_udc[busid].in_ep[ep_idx].xfer_len = data_len; + g_hpm_udc[busid].in_ep[ep_idx].actual_xfer_len = 0; + + usb_dcache_clean((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); + usb_device_edpt_xfer(handle, ep, (uint8_t *)data, data_len); + + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + usb_device_handle_t *handle = g_hpm_udc[busid].handle; + + if (!data && data_len) { + return -1; + } + if (!g_hpm_udc[busid].out_ep[ep_idx].ep_enable) { + return -2; + } + +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)data % CONFIG_USB_ALIGN_SIZE), "data is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + + g_hpm_udc[busid].out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_hpm_udc[busid].out_ep[ep_idx].xfer_len = data_len; + g_hpm_udc[busid].out_ep[ep_idx].actual_xfer_len = 0; + + usb_dcache_invalidate((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); + usb_device_edpt_xfer(handle, ep, data, data_len); + + return 0; +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint32_t int_status; + usb_device_handle_t *handle = g_hpm_udc[busid].handle; + uint32_t transfer_len; + bool ep_cb_req; + + /* Acknowledge handled interrupt */ + int_status = usb_device_status_flags(handle); + int_status &= usb_device_interrupts(handle); + usb_device_clear_status_flags(handle, int_status); + + if (int_status & intr_error) { + USB_LOG_ERR("usbd intr error!\r\n"); + } + +#ifdef CONFIG_USBDEV_SOF_ENABLE + if (int_status & intr_sof) { + usbd_event_sof_handler(busid); + } +#endif + + if (int_status & intr_reset) { + g_hpm_udc[busid].is_suspend = false; + memset(g_hpm_udc[busid].in_ep, 0, sizeof(struct hpm_ep_state) * USB_NUM_BIDIR_ENDPOINTS); + memset(g_hpm_udc[busid].out_ep, 0, sizeof(struct hpm_ep_state) * USB_NUM_BIDIR_ENDPOINTS); + usbd_event_reset_handler(busid); + usb_device_bus_reset(handle, g_hpm_udc[busid].in_ep[0].ep_mps); + } + + if (int_status & intr_suspend) { + if (usb_device_get_suspend_status(handle)) { + /* Note: Host may delay more than 3 ms before and/or after bus reset before doing enumeration. */ + if (usb_device_get_address(handle)) { + g_hpm_udc[busid].is_suspend = true; + usbd_event_suspend_handler(busid); + } + } else { + } + } + + if (int_status & intr_port_change) { + if (!usb_device_get_port_ccs(handle)) { + usbd_event_disconnect_handler(busid); + } else { + if (g_hpm_udc[busid].is_suspend) { + g_hpm_udc[busid].is_suspend = false; + usbd_event_resume_handler(busid); + } + usbd_event_connect_handler(busid); + } + } + + if (int_status & intr_usb) { + uint32_t const edpt_complete = usb_device_get_edpt_complete_status(handle); + uint32_t const edpt_setup_status = usb_device_get_setup_status(handle); + + if (edpt_complete) { + usb_device_clear_edpt_complete_status(handle, edpt_complete); + for (uint8_t ep_idx = 0; ep_idx < USB_SOS_DCD_MAX_QHD_COUNT; ep_idx++) { + if (edpt_complete & (1 << ep_idx2bit(ep_idx))) { + transfer_len = 0; + ep_cb_req = true; + + /* Failed QTD also get ENDPTCOMPLETE set */ + dcd_qhd_t *p_qhd = usb_device_qhd_get(handle, ep_idx); + dcd_qtd_t *p_qtd = p_qhd->attached_qtd; + while (1) { + if (p_qtd->halted || p_qtd->xact_err || p_qtd->buffer_err) { + USB_LOG_ERR("usbd transfer error!\r\n"); + ep_cb_req = false; + break; + } else if (p_qtd->active) { + ep_cb_req = false; + break; + } else { + transfer_len += p_qtd->expected_bytes - p_qtd->total_bytes; + p_qtd->in_use = false; + } + + if (p_qtd->next == USB_SOC_DCD_QTD_NEXT_INVALID) { + break; + } else { + p_qtd = (dcd_qtd_t *)p_qtd->next; + } + } + + if (ep_cb_req) { + uint8_t const ep_addr = (ep_idx / 2) | ((ep_idx & 0x01) ? 0x80 : 0); + if (ep_addr & 0x80) { + usbd_event_ep_in_complete_handler(busid, ep_addr, transfer_len); + } else { + usb_dcache_invalidate((uintptr_t)g_hpm_udc[busid].out_ep[ep_idx].xfer_buf, USB_ALIGN_UP(transfer_len, CONFIG_USB_ALIGN_SIZE)); + usbd_event_ep_out_complete_handler(busid, ep_addr, transfer_len); + } + } + } + } + } + + if (edpt_setup_status) { + /*------------- Set up Received -------------*/ + usb_device_clear_setup_status(handle, edpt_setup_status); + dcd_qhd_t *qhd0 = usb_device_qhd_get(handle, 0); + usbd_event_ep0_setup_complete_handler(busid, (uint8_t *)&qhd0->setup_request); + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/hpmicro/usb_glue_hpm.c b/src/lib/CherryUSB/port/hpmicro/usb_glue_hpm.c new file mode 100644 index 000000000..aa5f9cec6 --- /dev/null +++ b/src/lib/CherryUSB/port/hpmicro/usb_glue_hpm.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2022-2025 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +#include "hpm_common.h" +#include "hpm_soc.h" +#include "hpm_l1c_drv.h" +#include "hpm_usb_drv.h" +#include "usb_config.h" + +void (*g_usb_hpm_irq[2])(uint8_t busid); +uint8_t g_usb_hpm_busid[2]; + +#ifndef CONFIG_CHERRYUSB_CUSTOM_IRQ_HANDLER +SDK_DECLARE_EXT_ISR_M(IRQn_USB0, hpm_isr_usb0) +#ifdef HPM_USB1_BASE +SDK_DECLARE_EXT_ISR_M(IRQn_USB1, hpm_isr_usb1) +#endif +#endif + +#ifdef CONFIG_USB_OTG_ENABLE +#include "usbotg_core.h" +int usb_otg_init(uint8_t busid) +{ + (void)busid; + + return 0; +} + +int usb_otg_deinit(uint8_t busid) +{ + (void)busid; + + return 0; +} + +void hpm_isr_usb0(void) +{ + if (usb_otgsc_get_id_chg_flag(HPM_USB0)) { + usb_otgsc_clear_id_chg_flag(HPM_USB0); + usbotg_trigger_role_change(g_usb_hpm_busid[0], usb_otgsc_get_id_status(HPM_USB0) ? USBOTG_MODE_DEVICE : USBOTG_MODE_HOST); + } + + USBOTG_IRQHandler(g_usb_hpm_busid[0]); +} + +#ifdef HPM_USB1_BASE +void hpm_isr_usb1(void) +{ + if (usb_otgsc_get_id_chg_flag(HPM_USB1)) { + usb_otgsc_clear_id_chg_flag(HPM_USB1); + usbotg_trigger_role_change(g_usb_hpm_busid[1], usb_otgsc_get_id_status(HPM_USB1) ? USBOTG_MODE_DEVICE : USBOTG_MODE_HOST); + } + + USBOTG_IRQHandler(g_usb_hpm_busid[1]); +} +#endif + +#else + +void hpm_isr_usb0(void) +{ + g_usb_hpm_irq[0](g_usb_hpm_busid[0]); +} + +#ifdef HPM_USB1_BASE +void hpm_isr_usb1(void) +{ + g_usb_hpm_irq[1](g_usb_hpm_busid[1]); +} +#endif + +#endif + +ATTR_WEAK void hpm_usb_isr_enable(uint32_t base) +{ + if (base == HPM_USB0_BASE) { + intc_m_enable_irq(IRQn_USB0); + } else { +#ifdef HPM_USB1_BASE + intc_m_enable_irq(IRQn_USB1); +#endif + } +} + +ATTR_WEAK void hpm_usb_isr_disable(uint32_t base) +{ + if (base == HPM_USB0_BASE) { + intc_m_disable_irq(IRQn_USB0); + } else { +#ifdef HPM_USB1_BASE + intc_m_disable_irq(IRQn_USB1); +#endif + } +} + +#ifdef CONFIG_USB_DCACHE_ENABLE +void usb_dcache_clean(uintptr_t addr, size_t size) +{ + l1c_dc_writeback(addr, size); +} + +void usb_dcache_invalidate(uintptr_t addr, size_t size) +{ + l1c_dc_invalidate(addr, size); +} + +void usb_dcache_flush(uintptr_t addr, size_t size) +{ + l1c_dc_flush(addr, size); +} +#endif diff --git a/src/lib/CherryUSB/port/hpmicro/usb_glue_hpm.h b/src/lib/CherryUSB/port/hpmicro/usb_glue_hpm.h new file mode 100644 index 000000000..dea2dd0b4 --- /dev/null +++ b/src/lib/CherryUSB/port/hpmicro/usb_glue_hpm.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2022-2025 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef _HPM_USB_GLUE_HPM_H_ +#define _HPM_USB_GLUE_HPM_H_ + +extern void (*g_usb_hpm_irq[2])(uint8_t busid); +extern uint8_t g_usb_hpm_busid[2]; + +void hpm_usb_isr_enable(uint32_t base); +void hpm_usb_isr_disable(uint32_t base); +void hpm_isr_usb0(void); +void hpm_isr_usb1(void); + +#endif /* _HPM_USB_GLUE_HPM_H_ */ \ No newline at end of file diff --git a/src/lib/CherryUSB/port/hpmicro/usb_hc_hpm.c b/src/lib/CherryUSB/port/hpmicro/usb_hc_hpm.c new file mode 100644 index 000000000..2c340573c --- /dev/null +++ b/src/lib/CherryUSB/port/hpmicro/usb_hc_hpm.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2022-2025 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +#include "usbh_core.h" +#include "hpm_common.h" +#include "hpm_soc.h" +#include "hpm_usb_drv.h" +#include "usb_glue_hpm.h" + +#if !defined(CONFIG_USB_EHCI_HPMICRO) || !CONFIG_USB_EHCI_HPMICRO +#error "hpm ehci must set CONFIG_USB_EHCI_HPMICRO=1" +#endif + +#if !defined(CONFIG_USB_EHCI_HCCR_OFFSET) || CONFIG_USB_EHCI_HCCR_OFFSET != 0x100 +#error "hpm ehci must config CONFIG_USB_EHCI_HCCR_OFFSET to 0x100" +#endif + +extern void (*g_usb_hpm_irq[2])(uint8_t busid); +extern uint8_t g_usb_hpm_busid[2]; + +static void usb_host_mode_init(USB_Type *ptr) +{ + /* Set mode to host, must be set immediately after reset */ + ptr->USBMODE &= ~USB_USBMODE_CM_MASK; + ptr->USBMODE |= USB_USBMODE_CM_SET(3); + + /* Set the endian */ + ptr->USBMODE &= ~USB_USBMODE_ES_MASK; + + /* Set parallel interface signal */ + ptr->PORTSC1 &= ~USB_PORTSC1_STS_MASK; + + /* Set parallel transceiver width */ + ptr->PORTSC1 &= ~USB_PORTSC1_PTW_MASK; + +#ifdef CONFIG_USB_HOST_FORCE_FULL_SPEED + /* Set usb forced to full speed mode */ + ptr->PORTSC1 |= USB_PORTSC1_PFSC_MASK; +#endif + + /* Not use interrupt threshold. */ + ptr->USBCMD &= ~USB_USBCMD_ITC_MASK; +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + usb_phy_init((USB_Type *)(bus->hcd.reg_base), true); +} + +void usb_hc_low_level2_init(struct usbh_bus *bus) +{ + usb_host_mode_init((USB_Type *)(bus->hcd.reg_base)); + + if (bus->hcd.reg_base == HPM_USB0_BASE) { + g_usb_hpm_busid[0] = bus->hcd.hcd_id; + g_usb_hpm_irq[0] = USBH_IRQHandler; + } else { +#ifdef HPM_USB1_BASE + g_usb_hpm_busid[1] = bus->hcd.hcd_id; + g_usb_hpm_irq[1] = USBH_IRQHandler; +#endif + } + +#ifdef CONFIG_USB_OTG_ENABLE + usb_otgsc_enable_id_chg_int((USB_Type *)(bus->hcd.reg_base)); +#endif + hpm_usb_isr_enable(bus->hcd.reg_base); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + usb_phy_deinit((USB_Type *)(bus->hcd.reg_base)); + hpm_usb_isr_disable(bus->hcd.reg_base); + + if (bus->hcd.reg_base == HPM_USB0_BASE) { + g_usb_hpm_busid[0] = 0; + g_usb_hpm_irq[0] = NULL; + } else { +#ifdef HPM_USB1_BASE + g_usb_hpm_busid[1] = 0; + g_usb_hpm_irq[1] = NULL; +#endif + } +} + +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + (void)port; + uint8_t speed; + + speed = usb_get_port_speed((USB_Type *)(bus->hcd.reg_base)); + + if (speed == 0x00) { + return USB_SPEED_FULL; + } + if (speed == 0x01) { + return USB_SPEED_LOW; + } + if (speed == 0x02) { + return USB_SPEED_HIGH; + } + + return 0; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/kinetis/README.md b/src/lib/CherryUSB/port/kinetis/README.md new file mode 100644 index 000000000..b91b4608c --- /dev/null +++ b/src/lib/CherryUSB/port/kinetis/README.md @@ -0,0 +1,18 @@ +# Note + +## Support Chip List + +### NXP + +Modify USB_NOCACHE_RAM_SECTION + +``` +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".NonCacheable"))) +``` + +- MCXC444/MCXA153/MCXA156 (device only) +- MCXN947 + +### MM32 + +- MM32F3/MM32F5 diff --git a/src/lib/CherryUSB/port/kinetis/usb_dc_kinetis.c b/src/lib/CherryUSB/port/kinetis/usb_dc_kinetis.c new file mode 100644 index 000000000..6cbf53566 --- /dev/null +++ b/src/lib/CherryUSB/port/kinetis/usb_dc_kinetis.c @@ -0,0 +1,463 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usb_kinetis_reg.h" + +#undef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 16 + +#define USB_OTG_DEV ((KINETIS_TypeDef *)g_usbdev_bus[busid].reg_base) + +/* Endpoint state */ +struct kinetis_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + bool ep_odd; /* Endpoint odd */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +/* Driver state */ +struct kinetis_udc { + uint8_t dev_addr; + struct kinetis_ep_state in_ep[CONFIG_USBDEV_EP_NUM]; /*!< IN endpoint parameters*/ + struct kinetis_ep_state out_ep[CONFIG_USBDEV_EP_NUM]; /*!< OUT endpoint parameters */ +} g_kinetis_udc[CONFIG_USBDEV_MAX_BUS]; + +USB_NOCACHE_RAM_SECTION __attribute__((aligned(512))) kinetis_bd_table_t g_kinetis_bdt[CONFIG_USBDEV_MAX_BUS]; +USB_NOCACHE_RAM_SECTION __attribute__((aligned(32))) uint8_t setup_packet[CONFIG_USBDEV_MAX_BUS][8]; + +static int kinetis_start_transfer(uint8_t busid, uint8_t ep, uint8_t *buffer, uint16_t buflen) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint8_t dir; + uint8_t odd; + uint16_t ep_mps; + kinetis_bd_t *bd; + kinetis_bd_t *next; + + if (USB_EP_DIR_IS_OUT(ep)) { + dir = 0; + odd = g_kinetis_udc[busid].out_ep[ep_idx].ep_odd; + ep_mps = g_kinetis_udc[busid].out_ep[ep_idx].ep_mps; + } else { + dir = 1; + odd = g_kinetis_udc[busid].in_ep[ep_idx].ep_odd; + ep_mps = g_kinetis_udc[busid].in_ep[ep_idx].ep_mps; + } + + bd = &g_kinetis_bdt[busid].table[ep_idx][dir][odd]; + + if (bd->own) { + USB_LOG_INFO("ep%02x is busy\r\n", ep); + return -1; + } + + bd->bc = buflen >= ep_mps ? ep_mps : buflen; + bd->addr = (uint32_t)buffer; + bd->own = 1; + return 0; +} + +static void kinetis_read_setup(uint8_t busid) +{ + uint8_t out_odd = g_kinetis_udc[busid].out_ep[0].ep_odd; + uint8_t in_odd = g_kinetis_udc[busid].in_ep[0].ep_odd; + + if (g_kinetis_bdt[busid].table[0][0][out_odd].own) { + USB_LOG_INFO("ep0 is busy\r\n"); + return; + } + + g_kinetis_bdt[busid].table[0][0][out_odd].data = 0; + g_kinetis_bdt[busid].table[0][0][out_odd ^ 1].data = 1; + g_kinetis_bdt[busid].table[0][1][in_odd].data = 1; + g_kinetis_bdt[busid].table[0][1][in_odd ^ 1].data = 0; + + kinetis_start_transfer(busid, USB_CONTROL_OUT_EP0, setup_packet[busid], 8); +} + +__WEAK void usb_dc_low_level_init(uint8_t busid) +{ +} + +__WEAK void usb_dc_low_level_deinit(uint8_t busid) +{ +} + +int usb_dc_init(uint8_t busid) +{ + usb_dc_low_level_init(busid); + + memset(&g_kinetis_udc[busid], 0, sizeof(g_kinetis_udc[busid])); + + USB_OTG_DEV->BDTPAGE1 = (uint8_t)((uintptr_t)&g_kinetis_bdt[busid] >> 8); + USB_OTG_DEV->BDTPAGE2 = (uint8_t)((uintptr_t)&g_kinetis_bdt[busid] >> 16); + USB_OTG_DEV->BDTPAGE3 = (uint8_t)((uintptr_t)&g_kinetis_bdt[busid] >> 24); + + USB_OTG_DEV->INTEN = USB_INTEN_USBRSTEN_MASK | USB_INTEN_TOKDNEEN_MASK | + USB_INTEN_SLEEPEN_MASK | USB_INTEN_RESUMEEN_MASK | + USB_INTEN_ERROREN_MASK; + +#ifdef CONFIG_USBDEV_SOF_ENABLE + USB_OTG_DEV->INTEN |= USB_INTEN_SOFTOKEN_MASK; +#endif + + USB_OTG_DEV->CTL |= USB_CTL_USBENSOFEN_MASK; + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + USB_OTG_DEV->INTEN = 0; + USB_OTG_DEV->CTL &= ~USB_CTL_USBENSOFEN_MASK; + + memset(&g_kinetis_udc[busid], 0, sizeof(g_kinetis_udc[busid])); + + USB_OTG_DEV->BDTPAGE1 = (uint8_t)((uintptr_t)&g_kinetis_bdt[busid] >> 8); + USB_OTG_DEV->BDTPAGE2 = (uint8_t)((uintptr_t)&g_kinetis_bdt[busid] >> 16); + USB_OTG_DEV->BDTPAGE3 = (uint8_t)((uintptr_t)&g_kinetis_bdt[busid] >> 24); + + usb_dc_low_level_deinit(busid); + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + g_kinetis_udc[busid].dev_addr = addr; + + if (addr == 0) { + USB_OTG_DEV->ADDR = 0; + } + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + USB_OTG_DEV->CTL |= USB_CTL_RESUME_MASK; + + usbd_kinetis_delay_ms(10); + + USB_OTG_DEV->CTL &= ~USB_CTL_RESUME_MASK; + + return 0; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + return USB_SPEED_FULL; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + uint8_t odd; + uint8_t dir; + kinetis_bd_t *bd; + uint8_t regval; + + /* Must not exceed max endpoint number */ + USB_ASSERT_MSG(ep_idx < CONFIG_USBDEV_EP_NUM, "Ep addr %02x overflow", ep->bEndpointAddress); + + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_kinetis_udc[busid].out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_kinetis_udc[busid].out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_kinetis_udc[busid].out_ep[ep_idx].ep_enable = true; + + dir = 0; + odd = g_kinetis_udc[busid].out_ep[ep_idx].ep_odd; + } else { + g_kinetis_udc[busid].in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_kinetis_udc[busid].in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_kinetis_udc[busid].in_ep[ep_idx].ep_enable = true; + + dir = 1; + odd = g_kinetis_udc[busid].in_ep[ep_idx].ep_odd; + } + + if (ep_idx != 0) { + regval = USB_ENDPT_EPCTLDIS_MASK; + regval |= (USB_GET_ENDPOINT_TYPE(ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) ? USB_ENDPT_EPHSHK_MASK : 0; + regval |= dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK; + USB_OTG_DEV->ENDPOINT[ep_idx].ENDPT |= regval; + + if (USB_GET_ENDPOINT_TYPE(ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + bd = &g_kinetis_bdt[busid].table[ep_idx][dir][odd]; + bd->dts = 1; + bd->data = 0; + + bd = &g_kinetis_bdt[busid].table[ep_idx][dir][odd ^ 1]; + bd->dts = 1; + bd->data = 1; + } + } + + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint8_t dir; + kinetis_bd_t *bd; + + if (USB_EP_DIR_IS_OUT(ep)) { + g_kinetis_udc[busid].out_ep[ep_idx].ep_enable = false; + dir = 0; + } else { + g_kinetis_udc[busid].in_ep[ep_idx].ep_enable = false; + dir = 1; + } + + bd = &g_kinetis_bdt[busid].table[ep_idx][dir][0]; + bd->head = 0; + + bd = &g_kinetis_bdt[busid].table[ep_idx][dir][1]; + bd->head = 0; + + USB_OTG_DEV->ENDPOINT[ep_idx].ENDPT &= ~(dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK); + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + kinetis_bd_t *bd; + uint8_t odd; + uint8_t dir; + + if (0 == ep_idx) { + USB_OTG_DEV->ENDPOINT[ep_idx].ENDPT |= USB_ENDPT_EPSTALL_MASK; + + if (ep_idx == 0) { + kinetis_read_setup(busid); + } + } else { + if (USB_EP_DIR_IS_OUT(ep)) { + dir = 0; + odd = g_kinetis_udc[busid].out_ep[ep_idx].ep_odd; + } else { + dir = 1; + odd = g_kinetis_udc[busid].in_ep[ep_idx].ep_odd; + } + + bd = &g_kinetis_bdt[busid].table[ep_idx][dir][odd]; + + bd->bdt_stall = 1; + bd->own = 1; + } + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + kinetis_bd_t *bd; + uint8_t odd; + uint8_t dir; + + if (USB_EP_DIR_IS_OUT(ep)) { + dir = 0; + odd = g_kinetis_udc[busid].out_ep[ep_idx].ep_odd; + } else { + dir = 1; + odd = g_kinetis_udc[busid].in_ep[ep_idx].ep_odd; + } + + bd = &g_kinetis_bdt[busid].table[ep_idx][dir][odd]; + + bd->own = 0; + bd->bdt_stall = 0; + bd->data = 0; + + bd = &g_kinetis_bdt[busid].table[ep_idx][dir][odd ^ 1]; + bd->data = 1; + + uint8_t regval = USB_OTG_DEV->ENDPOINT[ep_idx].ENDPT; + if (regval & USB_ENDPT_EPSTALL_MASK) { + USB_OTG_DEV->ENDPOINT[ep_idx].ENDPT = regval & ~USB_ENDPT_EPSTALL_MASK; + } + + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + uint8_t regval = USB_OTG_DEV->ENDPOINT[ep_idx].ENDPT; + if (regval & USB_ENDPT_EPSTALL_MASK) { + *stalled = 1; + } else { + *stalled = 0; + } + + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, + uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_kinetis_udc[busid].in_ep[ep_idx].ep_enable) { + return -2; + } + + g_kinetis_udc[busid].in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_kinetis_udc[busid].in_ep[ep_idx].xfer_len = data_len; + g_kinetis_udc[busid].in_ep[ep_idx].actual_xfer_len = 0; + + return kinetis_start_transfer(busid, ep, (uint8_t *)data, MIN(data_len, g_kinetis_udc[busid].in_ep[ep_idx].ep_mps)); +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, + uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_kinetis_udc[busid].out_ep[ep_idx].ep_enable) { + return -2; + } + + g_kinetis_udc[busid].out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_kinetis_udc[busid].out_ep[ep_idx].xfer_len = data_len; + g_kinetis_udc[busid].out_ep[ep_idx].actual_xfer_len = 0; + + return kinetis_start_transfer(busid, ep, (uint8_t *)data, MIN(data_len, g_kinetis_udc[busid].out_ep[ep_idx].ep_mps)); +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint8_t s; + uint8_t pid; + uint8_t ep_idx; + uint8_t dir; + uint8_t odd; + uint16_t bc; + uint8_t is = USB_OTG_DEV->ISTAT; + uint8_t mask = USB_OTG_DEV->INTEN; + kinetis_bd_t *bd; + + USB_OTG_DEV->ISTAT = is & ~mask; + is &= mask; + + if (is & USB_ISTAT_ERROR_MASK) { + uint32_t es = USB_OTG_DEV->ERRSTAT; + USB_OTG_DEV->ERRSTAT = es; + USB_OTG_DEV->ISTAT = is; + } + + if (is & USB_ISTAT_USBRST_MASK) { + USB_OTG_DEV->ISTAT = is; + USB_OTG_DEV->CTL |= USB_CTL_ODDRST_MASK; + USB_OTG_DEV->ADDR = 0; + + USB_OTG_DEV->ENDPOINT[0].ENDPT = USB_ENDPT_EPHSHK_MASK | USB_ENDPT_EPRXEN_MASK | USB_ENDPT_EPTXEN_MASK; + for (uint8_t i = 1; i < 16; i++) { + USB_OTG_DEV->ENDPOINT[i].ENDPT = 0; + } + + memset(&g_kinetis_bdt[busid], 0, sizeof(g_kinetis_bdt[busid])); + memset(g_kinetis_udc[busid].in_ep, 0, sizeof(struct kinetis_ep_state) * CONFIG_USBDEV_EP_NUM); + memset(g_kinetis_udc[busid].out_ep, 0, sizeof(struct kinetis_ep_state) * CONFIG_USBDEV_EP_NUM); + usbd_event_reset_handler(busid); + + kinetis_read_setup(busid); + + USB_OTG_DEV->CTL &= ~USB_CTL_ODDRST_MASK; + } + + if (is & USB_ISTAT_SLEEP_MASK) { + USB_OTG_DEV->ISTAT = USB_ISTAT_SLEEP_MASK; + } + + if (is & USB_ISTAT_RESUME_MASK) { + USB_OTG_DEV->ISTAT = USB_ISTAT_RESUME_MASK; + } +#ifdef CONFIG_USBDEV_SOF_ENABLE + if (is & USB_ISTAT_SOFTOK_MASK) { + USB_OTG_DEV->ISTAT = USB_ISTAT_SOFTOK_MASK; + usbd_event_sof_handler(busid); + } +#endif + if (is & USB_ISTAT_STALL_MASK) { + USB_OTG_DEV->ISTAT = USB_ISTAT_STALL_MASK; + } + + if (is & USB_ISTAT_TOKDNE_MASK) { + s = USB_OTG_DEV->STAT; + USB_OTG_DEV->ISTAT = USB_ISTAT_TOKDNE_MASK; /* must be cleared after get STAT */ + + ep_idx = (s & USB_STAT_ENDP_MASK) >> USB_STAT_ENDP_SHIFT; + dir = (s & USB_STAT_TX_MASK) >> USB_STAT_TX_SHIFT; + odd = (s & USB_STAT_ODD_MASK) >> USB_STAT_ODD_SHIFT; + + bd = &g_kinetis_bdt[busid].table[ep_idx][dir][odd]; + + pid = bd->tok_pid; + bc = bd->bc; + + bd->bdt_stall = 0; + bd->dts = 1; + bd->ninc = 0; + bd->keep = 0; + + if (dir) { + g_kinetis_udc[busid].in_ep[ep_idx].ep_odd = odd ^ 1; + } else { + g_kinetis_udc[busid].out_ep[ep_idx].ep_odd = odd ^ 1; + } + + if (pid == USB_TOKEN_PID_SETUP) { + USB_OTG_DEV->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK; + usbd_event_ep0_setup_complete_handler(busid, (uint8_t *)bd->addr); + return; + } + + if (dir) { + g_kinetis_udc[busid].in_ep[ep_idx].xfer_buf += bc; + g_kinetis_udc[busid].in_ep[ep_idx].xfer_len -= bc; + g_kinetis_udc[busid].in_ep[ep_idx].actual_xfer_len += bc; + + if (g_kinetis_udc[busid].in_ep[ep_idx].xfer_len == 0) { + usbd_event_ep_in_complete_handler(busid, ep_idx | 0x80, g_kinetis_udc[busid].in_ep[ep_idx].actual_xfer_len); + } else { + kinetis_start_transfer(busid, ep_idx | 0x80, g_kinetis_udc[busid].in_ep[ep_idx].xfer_buf, + MIN(g_kinetis_udc[busid].in_ep[ep_idx].xfer_len, g_kinetis_udc[busid].in_ep[ep_idx].ep_mps)); + } + } else { + g_kinetis_udc[busid].out_ep[ep_idx].xfer_buf += bc; + g_kinetis_udc[busid].out_ep[ep_idx].xfer_len -= bc; + g_kinetis_udc[busid].out_ep[ep_idx].actual_xfer_len += bc; + + if ((bc < g_kinetis_udc[busid].out_ep[ep_idx].ep_mps) || (g_kinetis_udc[busid].out_ep[ep_idx].xfer_len == 0)) { + usbd_event_ep_out_complete_handler(busid, ep_idx, g_kinetis_udc[busid].out_ep[ep_idx].actual_xfer_len); + } else { + kinetis_start_transfer(busid, ep_idx, g_kinetis_udc[busid].out_ep[ep_idx].xfer_buf, + MIN(g_kinetis_udc[busid].out_ep[ep_idx].xfer_len, g_kinetis_udc[busid].out_ep[ep_idx].ep_mps)); + } + } + + if ((bc == 0) && (ep_idx == 0)) { + if ((g_kinetis_udc[busid].dev_addr > 0) && dir) { + USB_OTG_DEV->ADDR = g_kinetis_udc[busid].dev_addr; + g_kinetis_udc[busid].dev_addr = 0; + } + + kinetis_read_setup(busid); + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/kinetis/usb_glue_mcx.c b/src/lib/CherryUSB/port/kinetis/usb_glue_mcx.c new file mode 100644 index 000000000..b3d767a0a --- /dev/null +++ b/src/lib/CherryUSB/port/kinetis/usb_glue_mcx.c @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "fsl_common.h" +#include "usb_kinetis_reg.h" + +#define USB_OTG_DEV ((KINETIS_MCX_TypeDef *)g_usbdev_bus[busid].reg_base) + +#if defined(MCXC444_H_) +#define USBD_IRQ USB0_IRQHandler +void USB_ClockInit(void) +{ + SystemCoreClockUpdate(); + CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000U); +} +#elif defined(MCXA153_H_) +#define USBD_IRQ USB0_IRQHandler +void USB_ClockInit(void) +{ + RESET_PeripheralReset(kUSB0_RST_SHIFT_RSTn); + CLOCK_EnableUsbfsClock(); +} +#elif defined(MCXN947_CM33_CORE0_H_) +#define USBD_IRQ USB0_FS_IRQHandler +void USB_ClockInit(void) +{ + CLOCK_AttachClk(kCLK_48M_to_USB0); + CLOCK_EnableClock(kCLOCK_Usb0Ram); + CLOCK_EnableClock(kCLOCK_Usb0Fs); + CLOCK_EnableUsbfsClock(); +} +#elif defined(MCXA156_H_) +#define USBD_IRQ USB0_IRQHandler +void USB_ClockInit(void) +{ + RESET_PeripheralReset(kUSB0_RST_SHIFT_RSTn); + CLOCK_EnableUsbfsClock(); +} +#else +#error "Unsupported MCU with Kinetis IP" +#endif + +void USBD_IRQ(void) +{ + extern void USBD_IRQHandler(uint8_t busid); + USBD_IRQHandler(0); +} + +void usb_dc_low_level_init(uint8_t busid) +{ + USB_ClockInit(); + + uint8_t irqNumber; + + uint8_t usbDeviceKhciIrq[] = USB_IRQS; + irqNumber = usbDeviceKhciIrq[0]; + + /* Install isr, set priority, and enable IRQ. */ + NVIC_SetPriority((IRQn_Type)irqNumber, 3); + EnableIRQ((IRQn_Type)irqNumber); + + USB_OTG_DEV->USBTRC0 |= USB_USBTRC0_USBRESET_MASK; + while (USB_OTG_DEV->USBTRC0 & USB_USBTRC0_USBRESET_MASK); + + USB_OTG_DEV->USBTRC0 |= USB_USBTRC0_VREGIN_STS(1); /* software must set this bit to 1 */ + USB_OTG_DEV->USBCTRL = 0; + USB_OTG_DEV->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK; +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + USB_OTG_DEV->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK; + #if defined(MCXN947_CM33_CORE0_H_) + DisableIRQ((IRQn_Type)USB0_FS_IRQn); + #else + DisableIRQ((IRQn_Type)USB0_IRQn); + #endif +} + +void usbd_kinetis_delay_ms(uint8_t ms) +{ +#ifdef __RTTHREAD__ + rt_thread_mdelay(ms); +#else + for (uint32_t i = 0; i < ms; i++) + { + for (volatile uint32_t j = 0; j < 10000; j++); + } +#endif +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/kinetis/usb_glue_mm32.c b/src/lib/CherryUSB/port/kinetis/usb_glue_mm32.c new file mode 100644 index 000000000..75e722c49 --- /dev/null +++ b/src/lib/CherryUSB/port/kinetis/usb_glue_mm32.c @@ -0,0 +1,36 @@ +#include +#include + +#include "mm32_device.h" +#include "hal_rcc.h" +#include "usbd_core.h" + +void usb_dc_low_level_init(uint8_t busid) +{ + /* Select USBCLK source */ + // RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1); + RCC->CFGR &= ~(0x3 << 22); + RCC->CFGR |= (0x1 << 22); + + /* Enable USB clock */ + RCC->AHB2ENR |= 0x1 << 7; + +#define USB_DEVICE_INTERRUPT_PRIORITY (7U) + NVIC_SetPriority((IRQn_Type)USB_OTGFS_IRQn, USB_DEVICE_INTERRUPT_PRIORITY); + NVIC_EnableIRQ(USB_OTGFS_IRQn); +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + RCC->AHB2ENR &= ~(0x1 << 7); +} + +void USB_OTGFS_IRQHandler(void) +{ + USBD_IRQHandler(0); +} + +void usbd_kinetis_delay_ms(uint8_t ms) +{ + //delay_ms(ms); +} diff --git a/src/lib/CherryUSB/port/kinetis/usb_hc_kinetis.c b/src/lib/CherryUSB/port/kinetis/usb_hc_kinetis.c new file mode 100644 index 000000000..30404ce4c --- /dev/null +++ b/src/lib/CherryUSB/port/kinetis/usb_hc_kinetis.c @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/src/lib/CherryUSB/port/kinetis/usb_kinetis_reg.h b/src/lib/CherryUSB/port/kinetis/usb_kinetis_reg.h new file mode 100644 index 000000000..b2720a630 --- /dev/null +++ b/src/lib/CherryUSB/port/kinetis/usb_kinetis_reg.h @@ -0,0 +1,1487 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef __USB_KINETIS_REG_H__ +#define __USB_KINETIS_REG_H__ + +#define __I volatile const /* Define "read-only" permission */ +#define __IO volatile /* Define "read-write" permission */ + +/* ---------------------------------------------------------------------------- + -- USB Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup USB_Peripheral_Access_Layer USB Peripheral Access Layer + * @{ + */ + +/** USB - Register Layout Typedef */ +typedef struct { + __I uint8_t PERID; /**< Peripheral ID, offset: 0x0 */ + uint8_t RESERVED_0[3]; + __I uint8_t IDCOMP; /**< Peripheral ID Complement, offset: 0x4 */ + uint8_t RESERVED_1[3]; + __I uint8_t REV; /**< Peripheral Revision, offset: 0x8 */ + uint8_t RESERVED_2[3]; + __I uint8_t ADDINFO; /**< Peripheral Additional Information, offset: 0xC */ + uint8_t RESERVED_3[3]; + __IO uint8_t OTGISTAT; /**< OTG Interrupt Status, offset: 0x10 */ + uint8_t RESERVED_4[3]; + __IO uint8_t OTGICR; /**< OTG Interrupt Control, offset: 0x14 */ + uint8_t RESERVED_5[3]; + __I uint8_t OTGSTAT; /**< OTG Status, offset: 0x18 */ + uint8_t RESERVED_6[3]; + __IO uint8_t OTGCTL; /**< OTG Control, offset: 0x1C */ + uint8_t RESERVED_7[99]; + __IO uint8_t ISTAT; /**< Interrupt Status, offset: 0x80 */ + uint8_t RESERVED_8[3]; + __IO uint8_t INTEN; /**< Interrupt Enable, offset: 0x84 */ + uint8_t RESERVED_9[3]; + __IO uint8_t ERRSTAT; /**< Error Interrupt Status, offset: 0x88 */ + uint8_t RESERVED_10[3]; + __IO uint8_t ERREN; /**< Error Interrupt Enable, offset: 0x8C */ + uint8_t RESERVED_11[3]; + __I uint8_t STAT; /**< Status, offset: 0x90 */ + uint8_t RESERVED_12[3]; + __IO uint8_t CTL; /**< Control, offset: 0x94 */ + uint8_t RESERVED_13[3]; + __IO uint8_t ADDR; /**< Address, offset: 0x98 */ + uint8_t RESERVED_14[3]; + __IO uint8_t BDTPAGE1; /**< BDT Page 1, offset: 0x9C */ + uint8_t RESERVED_15[3]; + __I uint8_t FRMNUML; /**< Frame Number Register Low, offset: 0xA0 */ + uint8_t RESERVED_16[3]; + __I uint8_t FRMNUMH; /**< Frame Number Register High, offset: 0xA4 */ + uint8_t RESERVED_17[3]; + __IO uint8_t TOKEN; /**< Token, offset: 0xA8 */ + uint8_t RESERVED_18[3]; + __IO uint8_t SOFTHLD; /**< SOF Threshold, offset: 0xAC */ + uint8_t RESERVED_19[3]; + __IO uint8_t BDTPAGE2; /**< BDT Page 2, offset: 0xB0 */ + uint8_t RESERVED_20[3]; + __IO uint8_t BDTPAGE3; /**< BDT Page 3, offset: 0xB4 */ + uint8_t RESERVED_21[11]; + struct { /* offset: 0xC0, array step: 0x4 */ + __IO uint8_t ENDPT; /**< Endpoint Control, array offset: 0xC0, array step: 0x4 */ + uint8_t RESERVED_0[3]; + } ENDPOINT[16]; +} KINETIS_TypeDef; + +/* ---------------------------------------------------------------------------- + -- USB Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup USB_Register_Masks USB Register Masks + * @{ + */ + +/*! @name PERID - Peripheral ID */ +/*! @{ */ + +#define USB_PERID_ID_MASK (0x3FU) +#define USB_PERID_ID_SHIFT (0U) +/*! ID - Peripheral Identification */ +#define USB_PERID_ID(x) (((uint8_t)(((uint8_t)(x)) << USB_PERID_ID_SHIFT)) & USB_PERID_ID_MASK) +/*! @} */ + +/*! @name IDCOMP - Peripheral ID Complement */ +/*! @{ */ + +#define USB_IDCOMP_NID_MASK (0x3FU) +#define USB_IDCOMP_NID_SHIFT (0U) +/*! NID - Negative Peripheral ID */ +#define USB_IDCOMP_NID(x) (((uint8_t)(((uint8_t)(x)) << USB_IDCOMP_NID_SHIFT)) & USB_IDCOMP_NID_MASK) +/*! @} */ + +/*! @name REV - Peripheral Revision */ +/*! @{ */ + +#define USB_REV_REV_MASK (0xFFU) +#define USB_REV_REV_SHIFT (0U) +/*! REV - Revision */ +#define USB_REV_REV(x) (((uint8_t)(((uint8_t)(x)) << USB_REV_REV_SHIFT)) & USB_REV_REV_MASK) +/*! @} */ + +/*! @name ADDINFO - Peripheral Additional Information */ +/*! @{ */ + +#define USB_ADDINFO_IEHOST_MASK (0x1U) +#define USB_ADDINFO_IEHOST_SHIFT (0U) +/*! IEHOST - Host Mode Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define USB_ADDINFO_IEHOST(x) (((uint8_t)(((uint8_t)(x)) << USB_ADDINFO_IEHOST_SHIFT)) & USB_ADDINFO_IEHOST_MASK) +/*! @} */ + +/*! @name OTGISTAT - OTG Interrupt Status */ +/*! @{ */ + +#define USB_OTGISTAT_LINE_STATE_CHG_MASK (0x20U) +#define USB_OTGISTAT_LINE_STATE_CHG_SHIFT (5U) +/*! LINE_STATE_CHG - Line State Change Interrupt Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_OTGISTAT_LINE_STATE_CHG(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGISTAT_LINE_STATE_CHG_SHIFT)) & USB_OTGISTAT_LINE_STATE_CHG_MASK) + +#define USB_OTGISTAT_ONEMSEC_MASK (0x40U) +#define USB_OTGISTAT_ONEMSEC_SHIFT (6U) +/*! ONEMSEC - One Millisecond Timer Timeout Flag + * 0b0..Not timed out + * 0b1..Timed out + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_OTGISTAT_ONEMSEC(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGISTAT_ONEMSEC_SHIFT)) & USB_OTGISTAT_ONEMSEC_MASK) +/*! @} */ + +/*! @name OTGICR - OTG Interrupt Control */ +/*! @{ */ + +#define USB_OTGICR_LINESTATEEN_MASK (0x20U) +#define USB_OTGICR_LINESTATEEN_SHIFT (5U) +/*! LINESTATEEN - Line State Change Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_OTGICR_LINESTATEEN(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGICR_LINESTATEEN_SHIFT)) & USB_OTGICR_LINESTATEEN_MASK) + +#define USB_OTGICR_ONEMSECEN_MASK (0x40U) +#define USB_OTGICR_ONEMSECEN_SHIFT (6U) +/*! ONEMSECEN - 1-Millisecond Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_OTGICR_ONEMSECEN(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGICR_ONEMSECEN_SHIFT)) & USB_OTGICR_ONEMSECEN_MASK) +/*! @} */ + +/*! @name OTGSTAT - OTG Status */ +/*! @{ */ + +#define USB_OTGSTAT_LINESTATESTABLE_MASK (0x20U) +#define USB_OTGSTAT_LINESTATESTABLE_SHIFT (5U) +/*! LINESTATESTABLE - Line State Stable + * 0b0..Unstable + * 0b1..Stable + */ +#define USB_OTGSTAT_LINESTATESTABLE(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGSTAT_LINESTATESTABLE_SHIFT)) & USB_OTGSTAT_LINESTATESTABLE_MASK) + +#define USB_OTGSTAT_ONEMSEC_MASK (0x40U) +#define USB_OTGSTAT_ONEMSEC_SHIFT (6U) +/*! ONEMSEC - Reserved for 1 ms count */ +#define USB_OTGSTAT_ONEMSEC(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGSTAT_ONEMSEC_SHIFT)) & USB_OTGSTAT_ONEMSEC_MASK) +/*! @} */ + +/*! @name OTGCTL - OTG Control */ +/*! @{ */ + +#define USB_OTGCTL_OTGEN_MASK (0x4U) +#define USB_OTGCTL_OTGEN_SHIFT (2U) +/*! OTGEN - On-The-Go Pullup and Pulldown Resistor Enable + * 0b0..If USBENSOFEN is 1 and HOSTMODEEN is 0 in the Control Register (CTL), then the D+ Data line pullup + * resistors are enabled. If HOSTMODEEN is 1, then the D+ and D- Data line pulldown resistors are engaged. + * 0b1..Uses the pullup and pulldown controls in this register. + */ +#define USB_OTGCTL_OTGEN(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGCTL_OTGEN_SHIFT)) & USB_OTGCTL_OTGEN_MASK) + +#define USB_OTGCTL_DMLOW_MASK (0x10U) +#define USB_OTGCTL_DMLOW_SHIFT (4U) +/*! DMLOW - D- Data Line Pulldown Resistor Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_OTGCTL_DMLOW(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGCTL_DMLOW_SHIFT)) & USB_OTGCTL_DMLOW_MASK) + +#define USB_OTGCTL_DPLOW_MASK (0x20U) +#define USB_OTGCTL_DPLOW_SHIFT (5U) +/*! DPLOW - D+ Data Line pulldown Resistor Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_OTGCTL_DPLOW(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGCTL_DPLOW_SHIFT)) & USB_OTGCTL_DPLOW_MASK) + +#define USB_OTGCTL_DPHIGH_MASK (0x80U) +#define USB_OTGCTL_DPHIGH_SHIFT (7U) +/*! DPHIGH - D+ Data Line Pullup Resistor Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_OTGCTL_DPHIGH(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGCTL_DPHIGH_SHIFT)) & USB_OTGCTL_DPHIGH_MASK) +/*! @} */ + +/*! @name ISTAT - Interrupt Status */ +/*! @{ */ + +#define USB_ISTAT_USBRST_MASK (0x1U) +#define USB_ISTAT_USBRST_SHIFT (0U) +/*! USBRST - USB Reset Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_USBRST(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_USBRST_SHIFT)) & USB_ISTAT_USBRST_MASK) + +#define USB_ISTAT_ERROR_MASK (0x2U) +#define USB_ISTAT_ERROR_SHIFT (1U) +/*! ERROR - Error Flag + * 0b0..Error did not occur + * 0b1..Error occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_ERROR(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_ERROR_SHIFT)) & USB_ISTAT_ERROR_MASK) + +#define USB_ISTAT_SOFTOK_MASK (0x4U) +#define USB_ISTAT_SOFTOK_SHIFT (2U) +/*! SOFTOK - Start Of Frame (SOF) Token Flag + * 0b0..Did not receive + * 0b1..Received + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_SOFTOK(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_SOFTOK_SHIFT)) & USB_ISTAT_SOFTOK_MASK) + +#define USB_ISTAT_TOKDNE_MASK (0x8U) +#define USB_ISTAT_TOKDNE_SHIFT (3U) +/*! TOKDNE - Current Token Processing Flag + * 0b0..Not processed + * 0b1..Processed + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_TOKDNE(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_TOKDNE_SHIFT)) & USB_ISTAT_TOKDNE_MASK) + +#define USB_ISTAT_SLEEP_MASK (0x10U) +#define USB_ISTAT_SLEEP_SHIFT (4U) +/*! SLEEP - Sleep Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_SLEEP(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_SLEEP_SHIFT)) & USB_ISTAT_SLEEP_MASK) + +#define USB_ISTAT_RESUME_MASK (0x20U) +#define USB_ISTAT_RESUME_SHIFT (5U) +/*! RESUME - Resume Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_RESUME(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_RESUME_SHIFT)) & USB_ISTAT_RESUME_MASK) + +#define USB_ISTAT_ATTACH_MASK (0x40U) +#define USB_ISTAT_ATTACH_SHIFT (6U) +/*! ATTACH - Attach Interrupt Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_ATTACH(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_ATTACH_SHIFT)) & USB_ISTAT_ATTACH_MASK) + +#define USB_ISTAT_STALL_MASK (0x80U) +#define USB_ISTAT_STALL_SHIFT (7U) +/*! STALL - Stall Interrupt Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_STALL(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_STALL_SHIFT)) & USB_ISTAT_STALL_MASK) +/*! @} */ + +/*! @name INTEN - Interrupt Enable */ +/*! @{ */ + +#define USB_INTEN_USBRSTEN_MASK (0x1U) +#define USB_INTEN_USBRSTEN_SHIFT (0U) +/*! USBRSTEN - USBRST Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_USBRSTEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_USBRSTEN_SHIFT)) & USB_INTEN_USBRSTEN_MASK) + +#define USB_INTEN_ERROREN_MASK (0x2U) +#define USB_INTEN_ERROREN_SHIFT (1U) +/*! ERROREN - ERROR Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_ERROREN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_ERROREN_SHIFT)) & USB_INTEN_ERROREN_MASK) + +#define USB_INTEN_SOFTOKEN_MASK (0x4U) +#define USB_INTEN_SOFTOKEN_SHIFT (2U) +/*! SOFTOKEN - SOFTOK Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_SOFTOKEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_SOFTOKEN_SHIFT)) & USB_INTEN_SOFTOKEN_MASK) + +#define USB_INTEN_TOKDNEEN_MASK (0x8U) +#define USB_INTEN_TOKDNEEN_SHIFT (3U) +/*! TOKDNEEN - TOKDNE Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_TOKDNEEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_TOKDNEEN_SHIFT)) & USB_INTEN_TOKDNEEN_MASK) + +#define USB_INTEN_SLEEPEN_MASK (0x10U) +#define USB_INTEN_SLEEPEN_SHIFT (4U) +/*! SLEEPEN - SLEEP Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_SLEEPEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_SLEEPEN_SHIFT)) & USB_INTEN_SLEEPEN_MASK) + +#define USB_INTEN_RESUMEEN_MASK (0x20U) +#define USB_INTEN_RESUMEEN_SHIFT (5U) +/*! RESUMEEN - RESUME Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_RESUMEEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_RESUMEEN_SHIFT)) & USB_INTEN_RESUMEEN_MASK) + +#define USB_INTEN_ATTACHEN_MASK (0x40U) +#define USB_INTEN_ATTACHEN_SHIFT (6U) +/*! ATTACHEN - ATTACH Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_ATTACHEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_ATTACHEN_SHIFT)) & USB_INTEN_ATTACHEN_MASK) + +#define USB_INTEN_STALLEN_MASK (0x80U) +#define USB_INTEN_STALLEN_SHIFT (7U) +/*! STALLEN - STALL Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_STALLEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_STALLEN_SHIFT)) & USB_INTEN_STALLEN_MASK) +/*! @} */ + +/*! @name ERRSTAT - Error Interrupt Status */ +/*! @{ */ + +#define USB_ERRSTAT_PIDERR_MASK (0x1U) +#define USB_ERRSTAT_PIDERR_SHIFT (0U) +/*! PIDERR - PID Error Flag + * 0b0..Did not fail + * 0b1..Failed + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_PIDERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_PIDERR_SHIFT)) & USB_ERRSTAT_PIDERR_MASK) + +#define USB_ERRSTAT_CRC5EOF_MASK (0x2U) +#define USB_ERRSTAT_CRC5EOF_SHIFT (1U) +/*! CRC5EOF - CRC5 Error or End of Frame Error Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_CRC5EOF(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_CRC5EOF_SHIFT)) & USB_ERRSTAT_CRC5EOF_MASK) + +#define USB_ERRSTAT_CRC16_MASK (0x4U) +#define USB_ERRSTAT_CRC16_SHIFT (2U) +/*! CRC16 - CRC16 Error Flag + * 0b0..Not rejected + * 0b1..Rejected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_CRC16(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_CRC16_SHIFT)) & USB_ERRSTAT_CRC16_MASK) + +#define USB_ERRSTAT_DFN8_MASK (0x8U) +#define USB_ERRSTAT_DFN8_SHIFT (3U) +/*! DFN8 - Data Field Not 8 Bits Flag + * 0b0..Integer number of bytes + * 0b1..Not an integer number of bytes + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_DFN8(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_DFN8_SHIFT)) & USB_ERRSTAT_DFN8_MASK) + +#define USB_ERRSTAT_BTOERR_MASK (0x10U) +#define USB_ERRSTAT_BTOERR_SHIFT (4U) +/*! BTOERR - Bus Turnaround Timeout Error Flag + * 0b0..Not timed out + * 0b1..Timed out + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_BTOERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_BTOERR_SHIFT)) & USB_ERRSTAT_BTOERR_MASK) + +#define USB_ERRSTAT_DMAERR_MASK (0x20U) +#define USB_ERRSTAT_DMAERR_SHIFT (5U) +/*! DMAERR - DMA Access Error Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_DMAERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_DMAERR_SHIFT)) & USB_ERRSTAT_DMAERR_MASK) + +#define USB_ERRSTAT_OWNERR_MASK (0x40U) +#define USB_ERRSTAT_OWNERR_SHIFT (6U) +/*! OWNERR - BD Unavailable Error Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_OWNERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_OWNERR_SHIFT)) & USB_ERRSTAT_OWNERR_MASK) + +#define USB_ERRSTAT_BTSERR_MASK (0x80U) +#define USB_ERRSTAT_BTSERR_SHIFT (7U) +/*! BTSERR - Bit Stuff Error Flag + * 0b0..Packet not rejected due to the error + * 0b1..Packet rejected due to the error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_BTSERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_BTSERR_SHIFT)) & USB_ERRSTAT_BTSERR_MASK) +/*! @} */ + +/*! @name ERREN - Error Interrupt Enable */ +/*! @{ */ + +#define USB_ERREN_PIDERREN_MASK (0x1U) +#define USB_ERREN_PIDERREN_SHIFT (0U) +/*! PIDERREN - PIDERR Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_PIDERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_PIDERREN_SHIFT)) & USB_ERREN_PIDERREN_MASK) + +#define USB_ERREN_CRC5EOFEN_MASK (0x2U) +#define USB_ERREN_CRC5EOFEN_SHIFT (1U) +/*! CRC5EOFEN - CRC5/EOF Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_CRC5EOFEN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_CRC5EOFEN_SHIFT)) & USB_ERREN_CRC5EOFEN_MASK) + +#define USB_ERREN_CRC16EN_MASK (0x4U) +#define USB_ERREN_CRC16EN_SHIFT (2U) +/*! CRC16EN - CRC16 Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_CRC16EN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_CRC16EN_SHIFT)) & USB_ERREN_CRC16EN_MASK) + +#define USB_ERREN_DFN8EN_MASK (0x8U) +#define USB_ERREN_DFN8EN_SHIFT (3U) +/*! DFN8EN - DFN8 (Data Field Not Integer Number of Bytes) Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_DFN8EN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_DFN8EN_SHIFT)) & USB_ERREN_DFN8EN_MASK) + +#define USB_ERREN_BTOERREN_MASK (0x10U) +#define USB_ERREN_BTOERREN_SHIFT (4U) +/*! BTOERREN - BTOERR (Bus Timeout Error) Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_BTOERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_BTOERREN_SHIFT)) & USB_ERREN_BTOERREN_MASK) + +#define USB_ERREN_DMAERREN_MASK (0x20U) +#define USB_ERREN_DMAERREN_SHIFT (5U) +/*! DMAERREN - DMAERR Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_DMAERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_DMAERREN_SHIFT)) & USB_ERREN_DMAERREN_MASK) + +#define USB_ERREN_OWNERREN_MASK (0x40U) +#define USB_ERREN_OWNERREN_SHIFT (6U) +/*! OWNERREN - OWNERR Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_OWNERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_OWNERREN_SHIFT)) & USB_ERREN_OWNERREN_MASK) + +#define USB_ERREN_BTSERREN_MASK (0x80U) +#define USB_ERREN_BTSERREN_SHIFT (7U) +/*! BTSERREN - BTSERR (Bit Stuff Error) Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_BTSERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_BTSERREN_SHIFT)) & USB_ERREN_BTSERREN_MASK) +/*! @} */ + +/*! @name STAT - Status */ +/*! @{ */ + +#define USB_STAT_ODD_MASK (0x4U) +#define USB_STAT_ODD_SHIFT (2U) +/*! ODD - Odd Bank + * 0b0..Not in the odd bank + * 0b1..In the odd bank + */ +#define USB_STAT_ODD(x) (((uint8_t)(((uint8_t)(x)) << USB_STAT_ODD_SHIFT)) & USB_STAT_ODD_MASK) + +#define USB_STAT_TX_MASK (0x8U) +#define USB_STAT_TX_SHIFT (3U) +/*! TX - Transmit Indicator + * 0b0..Receive + * 0b1..Transmit + */ +#define USB_STAT_TX(x) (((uint8_t)(((uint8_t)(x)) << USB_STAT_TX_SHIFT)) & USB_STAT_TX_MASK) + +#define USB_STAT_ENDP_MASK (0xF0U) +#define USB_STAT_ENDP_SHIFT (4U) +/*! ENDP - Endpoint address */ +#define USB_STAT_ENDP(x) (((uint8_t)(((uint8_t)(x)) << USB_STAT_ENDP_SHIFT)) & USB_STAT_ENDP_MASK) +/*! @} */ + +/*! @name CTL - Control */ +/*! @{ */ + +#define USB_CTL_USBENSOFEN_MASK (0x1U) +#define USB_CTL_USBENSOFEN_SHIFT (0U) +/*! USBENSOFEN - USB Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_CTL_USBENSOFEN(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_USBENSOFEN_SHIFT)) & USB_CTL_USBENSOFEN_MASK) + +#define USB_CTL_ODDRST_MASK (0x2U) +#define USB_CTL_ODDRST_SHIFT (1U) +/*! ODDRST - Odd Reset */ +#define USB_CTL_ODDRST(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_ODDRST_SHIFT)) & USB_CTL_ODDRST_MASK) + +#define USB_CTL_RESUME_MASK (0x4U) +#define USB_CTL_RESUME_SHIFT (2U) +/*! RESUME - Resume */ +#define USB_CTL_RESUME(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_RESUME_SHIFT)) & USB_CTL_RESUME_MASK) + +#define USB_CTL_HOSTMODEEN_MASK (0x8U) +#define USB_CTL_HOSTMODEEN_SHIFT (3U) +/*! HOSTMODEEN - Host Mode Enable + * 0b0..USBFS operates in Device mode. + * 0b1..USBFS operates in Host mode. In Host mode, USBFS performs USB transactions under the programmed control of the host processor. + */ +#define USB_CTL_HOSTMODEEN(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_HOSTMODEEN_SHIFT)) & USB_CTL_HOSTMODEEN_MASK) + +#define USB_CTL_RESET_MASK (0x10U) +#define USB_CTL_RESET_SHIFT (4U) +/*! RESET - Reset Signaling Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_CTL_RESET(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_RESET_SHIFT)) & USB_CTL_RESET_MASK) + +#define USB_CTL_TXSUSPENDTOKENBUSY_MASK (0x20U) +#define USB_CTL_TXSUSPENDTOKENBUSY_SHIFT (5U) +/*! TXSUSPENDTOKENBUSY - TXD Suspend And Token Busy */ +#define USB_CTL_TXSUSPENDTOKENBUSY(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_TXSUSPENDTOKENBUSY_SHIFT)) & USB_CTL_TXSUSPENDTOKENBUSY_MASK) + +#define USB_CTL_SE0_MASK (0x40U) +#define USB_CTL_SE0_SHIFT (6U) +/*! SE0 - Live USB Single-Ended Zero signal */ +#define USB_CTL_SE0(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_SE0_SHIFT)) & USB_CTL_SE0_MASK) + +#define USB_CTL_JSTATE_MASK (0x80U) +#define USB_CTL_JSTATE_SHIFT (7U) +/*! JSTATE - Live USB Differential Receiver JSTATE Signal */ +#define USB_CTL_JSTATE(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_JSTATE_SHIFT)) & USB_CTL_JSTATE_MASK) +/*! @} */ + +/*! @name ADDR - Address */ +/*! @{ */ + +#define USB_ADDR_ADDR_MASK (0x7FU) +#define USB_ADDR_ADDR_SHIFT (0U) +/*! ADDR - USB Address */ +#define USB_ADDR_ADDR(x) (((uint8_t)(((uint8_t)(x)) << USB_ADDR_ADDR_SHIFT)) & USB_ADDR_ADDR_MASK) + +#define USB_ADDR_LSEN_MASK (0x80U) +#define USB_ADDR_LSEN_SHIFT (7U) +/*! LSEN - Low Speed Enable */ +#define USB_ADDR_LSEN(x) (((uint8_t)(((uint8_t)(x)) << USB_ADDR_LSEN_SHIFT)) & USB_ADDR_LSEN_MASK) +/*! @} */ + +/*! @name BDTPAGE1 - BDT Page 1 */ +/*! @{ */ + +#define USB_BDTPAGE1_BDTBA_MASK (0xFEU) +#define USB_BDTPAGE1_BDTBA_SHIFT (1U) +/*! BDTBA - BDT Base Address */ +#define USB_BDTPAGE1_BDTBA(x) (((uint8_t)(((uint8_t)(x)) << USB_BDTPAGE1_BDTBA_SHIFT)) & USB_BDTPAGE1_BDTBA_MASK) +/*! @} */ + +/*! @name FRMNUML - Frame Number Register Low */ +/*! @{ */ + +#define USB_FRMNUML_FRM_MASK (0xFFU) +#define USB_FRMNUML_FRM_SHIFT (0U) +/*! FRM - Frame Number, Bits 0-7 */ +#define USB_FRMNUML_FRM(x) (((uint8_t)(((uint8_t)(x)) << USB_FRMNUML_FRM_SHIFT)) & USB_FRMNUML_FRM_MASK) +/*! @} */ + +/*! @name FRMNUMH - Frame Number Register High */ +/*! @{ */ + +#define USB_FRMNUMH_FRM_MASK (0x7U) +#define USB_FRMNUMH_FRM_SHIFT (0U) +/*! FRM - Frame Number, Bits 8-10 */ +#define USB_FRMNUMH_FRM(x) (((uint8_t)(((uint8_t)(x)) << USB_FRMNUMH_FRM_SHIFT)) & USB_FRMNUMH_FRM_MASK) +/*! @} */ + +/*! @name TOKEN - Token */ +/*! @{ */ + +#define USB_TOKEN_TOKENENDPT_MASK (0xFU) +#define USB_TOKEN_TOKENENDPT_SHIFT (0U) +/*! TOKENENDPT - Token Endpoint Address */ +#define USB_TOKEN_TOKENENDPT(x) (((uint8_t)(((uint8_t)(x)) << USB_TOKEN_TOKENENDPT_SHIFT)) & USB_TOKEN_TOKENENDPT_MASK) + +#define USB_TOKEN_TOKENPID_MASK (0xF0U) +#define USB_TOKEN_TOKENPID_SHIFT (4U) +/*! TOKENPID - Token Type + * 0b0001..OUT token. USBFS performs an OUT (TX) transaction. + * 0b1001..IN token. USBFS performs an IN (RX) transaction. + * 0b1101..SETUP token. USBFS performs a SETUP (TX) transaction + */ +#define USB_TOKEN_TOKENPID(x) (((uint8_t)(((uint8_t)(x)) << USB_TOKEN_TOKENPID_SHIFT)) & USB_TOKEN_TOKENPID_MASK) +/*! @} */ + +/*! @name SOFTHLD - SOF Threshold */ +/*! @{ */ + +#define USB_SOFTHLD_CNT_MASK (0xFFU) +#define USB_SOFTHLD_CNT_SHIFT (0U) +/*! CNT - SOF Count Threshold */ +#define USB_SOFTHLD_CNT(x) (((uint8_t)(((uint8_t)(x)) << USB_SOFTHLD_CNT_SHIFT)) & USB_SOFTHLD_CNT_MASK) +/*! @} */ + +/*! @name BDTPAGE2 - BDT Page 2 */ +/*! @{ */ + +#define USB_BDTPAGE2_BDTBA_MASK (0xFFU) +#define USB_BDTPAGE2_BDTBA_SHIFT (0U) +/*! BDTBA - BDT Base Address */ +#define USB_BDTPAGE2_BDTBA(x) (((uint8_t)(((uint8_t)(x)) << USB_BDTPAGE2_BDTBA_SHIFT)) & USB_BDTPAGE2_BDTBA_MASK) +/*! @} */ + +/*! @name BDTPAGE3 - BDT Page 3 */ +/*! @{ */ + +#define USB_BDTPAGE3_BDTBA_MASK (0xFFU) +#define USB_BDTPAGE3_BDTBA_SHIFT (0U) +/*! BDTBA - BDT Base Address */ +#define USB_BDTPAGE3_BDTBA(x) (((uint8_t)(((uint8_t)(x)) << USB_BDTPAGE3_BDTBA_SHIFT)) & USB_BDTPAGE3_BDTBA_MASK) +/*! @} */ + +/*! @name ENDPT - Endpoint Control */ +/*! @{ */ + +#define USB_ENDPT_EPHSHK_MASK (0x1U) +#define USB_ENDPT_EPHSHK_SHIFT (0U) +/*! EPHSHK - Endpoint Handshaking Enable */ +#define USB_ENDPT_EPHSHK(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPHSHK_SHIFT)) & USB_ENDPT_EPHSHK_MASK) + +#define USB_ENDPT_EPSTALL_MASK (0x2U) +#define USB_ENDPT_EPSTALL_SHIFT (1U) +/*! EPSTALL - Endpoint Stalled */ +#define USB_ENDPT_EPSTALL(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPSTALL_SHIFT)) & USB_ENDPT_EPSTALL_MASK) + +#define USB_ENDPT_EPTXEN_MASK (0x4U) +#define USB_ENDPT_EPTXEN_SHIFT (2U) +/*! EPTXEN - Endpoint for TX transfers enable */ +#define USB_ENDPT_EPTXEN(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPTXEN_SHIFT)) & USB_ENDPT_EPTXEN_MASK) + +#define USB_ENDPT_EPRXEN_MASK (0x8U) +#define USB_ENDPT_EPRXEN_SHIFT (3U) +/*! EPRXEN - Endpoint for RX transfers enable */ +#define USB_ENDPT_EPRXEN(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPRXEN_SHIFT)) & USB_ENDPT_EPRXEN_MASK) + +#define USB_ENDPT_EPCTLDIS_MASK (0x10U) +#define USB_ENDPT_EPCTLDIS_SHIFT (4U) +/*! EPCTLDIS - Control Transfer Disable + * 0b0..Enable + * 0b1..Disable + */ +#define USB_ENDPT_EPCTLDIS(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPCTLDIS_SHIFT)) & USB_ENDPT_EPCTLDIS_MASK) + +#define USB_ENDPT_RETRYDIS_MASK (0x40U) +#define USB_ENDPT_RETRYDIS_SHIFT (6U) +/*! RETRYDIS - Retry Disable + * 0b0..Retried NAK'ed transactions in hardware. + * 0b1..Do not retry NAK'ed transactions. When a transaction is NAK'ed, the BDT PID field is updated with the NAK + * PID, and the TOKEN_DNE interrupt becomes 1. + */ +#define USB_ENDPT_RETRYDIS(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_RETRYDIS_SHIFT)) & USB_ENDPT_RETRYDIS_MASK) + +#define USB_ENDPT_HOSTWOHUB_MASK (0x80U) +#define USB_ENDPT_HOSTWOHUB_SHIFT (7U) +/*! HOSTWOHUB - Host Without A Hub + * 0b0..Connected using a hub (USBFS generates PRE_PID as required) + * 0b1..Connected directly to host without a hub, or was used to attach + */ +#define USB_ENDPT_HOSTWOHUB(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_HOSTWOHUB_SHIFT)) & USB_ENDPT_HOSTWOHUB_MASK) +/*! @} */ + +/* The count of USB_ENDPT */ +#define USB_ENDPT_COUNT (16U) + +/*! @name USBCTRL - USB Control */ +/*! @{ */ + +#define USB_USBCTRL_DPDM_LANE_REVERSE_MASK (0x4U) +#define USB_USBCTRL_DPDM_LANE_REVERSE_SHIFT (2U) +/*! DPDM_LANE_REVERSE - DP and DM Lane Reversal Control + * 0b0..Standard USB DP and DM package pin assignment + * 0b1..Reverse roles of USB DP and DM package pins + */ +#define USB_USBCTRL_DPDM_LANE_REVERSE(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_DPDM_LANE_REVERSE_SHIFT)) & USB_USBCTRL_DPDM_LANE_REVERSE_MASK) + +#define USB_USBCTRL_HOST_LS_EOP_MASK (0x8U) +#define USB_USBCTRL_HOST_LS_EOP_SHIFT (3U) +/*! HOST_LS_EOP - Host-Mode-Only Low-Speed Device EOP Signaling + * 0b0..Full-speed device or a low-speed device through a hub + * 0b1..Directly-connected low-speed device + */ +#define USB_USBCTRL_HOST_LS_EOP(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_HOST_LS_EOP_SHIFT)) & USB_USBCTRL_HOST_LS_EOP_MASK) + +#define USB_USBCTRL_UARTSEL_MASK (0x10U) +#define USB_USBCTRL_UARTSEL_SHIFT (4U) +/*! UARTSEL - UART Select + * 0b0..USB DP and DM external package pins are used for USB signaling. + * 0b1..USB DP and DM external package pins are used for UART signaling. + */ +#define USB_USBCTRL_UARTSEL(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_UARTSEL_SHIFT)) & USB_USBCTRL_UARTSEL_MASK) + +#define USB_USBCTRL_UARTCHLS_MASK (0x20U) +#define USB_USBCTRL_UARTCHLS_SHIFT (5U) +/*! UARTCHLS - UART Signal Channel Select + * 0b0..USB DP and DM signals are used as UART TX/RX. + * 0b1..USB DP and DM signals are used as UART RX/TX. + */ +#define USB_USBCTRL_UARTCHLS(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_UARTCHLS_SHIFT)) & USB_USBCTRL_UARTCHLS_MASK) + +#define USB_USBCTRL_PDE_MASK (0x40U) +#define USB_USBCTRL_PDE_SHIFT (6U) +/*! PDE - Pulldown Enable + * 0b0..Disable on D+ and D- + * 0b1..Enable on D+ and D- + */ +#define USB_USBCTRL_PDE(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_PDE_SHIFT)) & USB_USBCTRL_PDE_MASK) + +#define USB_USBCTRL_SUSP_MASK (0x80U) +#define USB_USBCTRL_SUSP_SHIFT (7U) +/*! SUSP - Suspend + * 0b0..Not in Suspend state + * 0b1..In Suspend state + */ +#define USB_USBCTRL_SUSP(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_SUSP_SHIFT)) & USB_USBCTRL_SUSP_MASK) +/*! @} */ + +/*! @name OBSERVE - USB OTG Observe */ +/*! @{ */ + +#define USB_OBSERVE_DMPD_MASK (0x10U) +#define USB_OBSERVE_DMPD_SHIFT (4U) +/*! DMPD - D- Pulldown + * 0b0..Disabled + * 0b1..Enabled + */ +#define USB_OBSERVE_DMPD(x) (((uint8_t)(((uint8_t)(x)) << USB_OBSERVE_DMPD_SHIFT)) & USB_OBSERVE_DMPD_MASK) + +#define USB_OBSERVE_DPPD_MASK (0x40U) +#define USB_OBSERVE_DPPD_SHIFT (6U) +/*! DPPD - D+ Pulldown + * 0b0..Disabled + * 0b1..Enabled + */ +#define USB_OBSERVE_DPPD(x) (((uint8_t)(((uint8_t)(x)) << USB_OBSERVE_DPPD_SHIFT)) & USB_OBSERVE_DPPD_MASK) + +#define USB_OBSERVE_DPPU_MASK (0x80U) +#define USB_OBSERVE_DPPU_SHIFT (7U) +/*! DPPU - D+ Pullup + * 0b0..Disabled + * 0b1..Enabled + */ +#define USB_OBSERVE_DPPU(x) (((uint8_t)(((uint8_t)(x)) << USB_OBSERVE_DPPU_SHIFT)) & USB_OBSERVE_DPPU_MASK) +/*! @} */ + +/*! @name CONTROL - USB OTG Control */ +/*! @{ */ + +#define USB_CONTROL_VBUS_SOURCE_SEL_MASK (0x1U) +#define USB_CONTROL_VBUS_SOURCE_SEL_SHIFT (0U) +/*! VBUS_SOURCE_SEL - VBUS Monitoring Source Select + * 0b0..Reserved + * 0b1..Resistive divider attached to a GPIO pin + */ +#define USB_CONTROL_VBUS_SOURCE_SEL(x) (((uint8_t)(((uint8_t)(x)) << USB_CONTROL_VBUS_SOURCE_SEL_SHIFT)) & USB_CONTROL_VBUS_SOURCE_SEL_MASK) + +#define USB_CONTROL_SESS_VLD_MASK (0x2U) +#define USB_CONTROL_SESS_VLD_SHIFT (1U) +/*! SESS_VLD - VBUS Session Valid status + * 0b1..Above + * 0b0..Below + */ +#define USB_CONTROL_SESS_VLD(x) (((uint8_t)(((uint8_t)(x)) << USB_CONTROL_SESS_VLD_SHIFT)) & USB_CONTROL_SESS_VLD_MASK) + +#define USB_CONTROL_DPPULLUPNONOTG_MASK (0x10U) +#define USB_CONTROL_DPPULLUPNONOTG_SHIFT (4U) +/*! DPPULLUPNONOTG - DP Pullup in Non-OTG Device Mode + * 0b0..Disable + * 0b1..Enabled + */ +#define USB_CONTROL_DPPULLUPNONOTG(x) (((uint8_t)(((uint8_t)(x)) << USB_CONTROL_DPPULLUPNONOTG_SHIFT)) & USB_CONTROL_DPPULLUPNONOTG_MASK) +/*! @} */ + +/*! @name USBTRC0 - USB Transceiver Control 0 */ +/*! @{ */ + +#define USB_USBTRC0_USB_RESUME_INT_MASK (0x1U) +#define USB_USBTRC0_USB_RESUME_INT_SHIFT (0U) +/*! USB_RESUME_INT - USB Asynchronous Interrupt + * 0b0..Not generated + * 0b1..Generated because of the USB asynchronous interrupt + */ +#define USB_USBTRC0_USB_RESUME_INT(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_USB_RESUME_INT_SHIFT)) & USB_USBTRC0_USB_RESUME_INT_MASK) + +#define USB_USBTRC0_SYNC_DET_MASK (0x2U) +#define USB_USBTRC0_SYNC_DET_SHIFT (1U) +/*! SYNC_DET - Synchronous USB Interrupt Detect + * 0b0..Not detected + * 0b1..Detected + */ +#define USB_USBTRC0_SYNC_DET(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_SYNC_DET_SHIFT)) & USB_USBTRC0_SYNC_DET_MASK) + +#define USB_USBTRC0_USB_CLK_RECOVERY_INT_MASK (0x4U) +#define USB_USBTRC0_USB_CLK_RECOVERY_INT_SHIFT (2U) +/*! USB_CLK_RECOVERY_INT - Combined USB Clock Recovery interrupt status */ +#define USB_USBTRC0_USB_CLK_RECOVERY_INT(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_USB_CLK_RECOVERY_INT_SHIFT)) & USB_USBTRC0_USB_CLK_RECOVERY_INT_MASK) + +#define USB_USBTRC0_VREDG_DET_MASK (0x8U) +#define USB_USBTRC0_VREDG_DET_SHIFT (3U) +/*! VREDG_DET - VREGIN Rising Edge Interrupt Detect + * 0b0..Not detected + * 0b1..Detected + */ +#define USB_USBTRC0_VREDG_DET(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_VREDG_DET_SHIFT)) & USB_USBTRC0_VREDG_DET_MASK) + +#define USB_USBTRC0_VFEDG_DET_MASK (0x10U) +#define USB_USBTRC0_VFEDG_DET_SHIFT (4U) +/*! VFEDG_DET - VREGIN Falling Edge Interrupt Detect + * 0b0..Not detected + * 0b1..Detected + */ +#define USB_USBTRC0_VFEDG_DET(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_VFEDG_DET_SHIFT)) & USB_USBTRC0_VFEDG_DET_MASK) + +#define USB_USBTRC0_USBRESMEN_MASK (0x20U) +#define USB_USBTRC0_USBRESMEN_SHIFT (5U) +/*! USBRESMEN - Asynchronous Resume Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_USBTRC0_USBRESMEN(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_USBRESMEN_SHIFT)) & USB_USBTRC0_USBRESMEN_MASK) + +#define USB_USBTRC0_VREGIN_STS_MASK (0x40U) +#define USB_USBTRC0_VREGIN_STS_SHIFT (6U) +/*! VREGIN_STS - VREGIN Status */ +#define USB_USBTRC0_VREGIN_STS(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_VREGIN_STS_SHIFT)) & USB_USBTRC0_VREGIN_STS_MASK) + +#define USB_USBTRC0_USBRESET_MASK (0x80U) +#define USB_USBTRC0_USBRESET_SHIFT (7U) +/*! USBRESET - USB Reset + * 0b0..Normal USBFS operation + * 0b1..Returns USBFS to its reset state + */ +#define USB_USBTRC0_USBRESET(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_USBRESET_SHIFT)) & USB_USBTRC0_USBRESET_MASK) +/*! @} */ + +/*! @name USBFRMADJUST - Frame Adjust */ +/*! @{ */ + +#define USB_USBFRMADJUST_ADJ_MASK (0xFFU) +#define USB_USBFRMADJUST_ADJ_SHIFT (0U) +/*! ADJ - Frame Adjustment */ +#define USB_USBFRMADJUST_ADJ(x) (((uint8_t)(((uint8_t)(x)) << USB_USBFRMADJUST_ADJ_SHIFT)) & USB_USBFRMADJUST_ADJ_MASK) +/*! @} */ + +/*! @name KEEP_ALIVE_CTRL - Keep Alive Mode Control */ +/*! @{ */ + +#define USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_EN_MASK (0x1U) +#define USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_EN_SHIFT (0U) +/*! KEEP_ALIVE_EN - Keep Alive Mode Enable + * 0b0..Everything remains same as before. + * 0b1..USB shall enter USB_KEEP_ALIVE mode after asserting ipg_stop. + */ +#define USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_EN_SHIFT)) & USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_EN_MASK) + +#define USB_KEEP_ALIVE_CTRL_OWN_OVERRD_EN_MASK (0x2U) +#define USB_KEEP_ALIVE_CTRL_OWN_OVERRD_EN_SHIFT (1U) +/*! OWN_OVERRD_EN - OWN Bit Override Enable */ +#define USB_KEEP_ALIVE_CTRL_OWN_OVERRD_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_KEEP_ALIVE_CTRL_OWN_OVERRD_EN_SHIFT)) & USB_KEEP_ALIVE_CTRL_OWN_OVERRD_EN_MASK) + +#define USB_KEEP_ALIVE_CTRL_STOP_ACK_DLY_EN_MASK (0x4U) +#define USB_KEEP_ALIVE_CTRL_STOP_ACK_DLY_EN_SHIFT (2U) +/*! STOP_ACK_DLY_EN - Stop Acknowledge Delay Enable + * 0b0..Enter KEEP_ALIVE mode immediately when there is no USB AHB transfer. + * 0b1..Enter KEEP_ALIVE mode until the USB core is idle and there is no USB AHB transfer. + */ +#define USB_KEEP_ALIVE_CTRL_STOP_ACK_DLY_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_KEEP_ALIVE_CTRL_STOP_ACK_DLY_EN_SHIFT)) & USB_KEEP_ALIVE_CTRL_STOP_ACK_DLY_EN_MASK) + +#define USB_KEEP_ALIVE_CTRL_WAKE_REQ_EN_MASK (0x8U) +#define USB_KEEP_ALIVE_CTRL_WAKE_REQ_EN_SHIFT (3U) +/*! WAKE_REQ_EN - Wakeup Request Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_KEEP_ALIVE_CTRL_WAKE_REQ_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_KEEP_ALIVE_CTRL_WAKE_REQ_EN_SHIFT)) & USB_KEEP_ALIVE_CTRL_WAKE_REQ_EN_MASK) + +#define USB_KEEP_ALIVE_CTRL_WAKE_INT_EN_MASK (0x10U) +#define USB_KEEP_ALIVE_CTRL_WAKE_INT_EN_SHIFT (4U) +/*! WAKE_INT_EN - Wakeup Interrupt Enable */ +#define USB_KEEP_ALIVE_CTRL_WAKE_INT_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_KEEP_ALIVE_CTRL_WAKE_INT_EN_SHIFT)) & USB_KEEP_ALIVE_CTRL_WAKE_INT_EN_MASK) + +#define USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_STS_MASK (0x40U) +#define USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_STS_SHIFT (6U) +/*! KEEP_ALIVE_STS - Keep Alive Status + * 0b0..Not in Keep Alive mode + * 0b1..In Keep Alive mode + */ +#define USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_STS(x) (((uint8_t)(((uint8_t)(x)) << USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_STS_SHIFT)) & USB_KEEP_ALIVE_CTRL_KEEP_ALIVE_STS_MASK) + +#define USB_KEEP_ALIVE_CTRL_WAKE_INT_STS_MASK (0x80U) +#define USB_KEEP_ALIVE_CTRL_WAKE_INT_STS_SHIFT (7U) +/*! WAKE_INT_STS - Wakeup Interrupt Status Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_KEEP_ALIVE_CTRL_WAKE_INT_STS(x) (((uint8_t)(((uint8_t)(x)) << USB_KEEP_ALIVE_CTRL_WAKE_INT_STS_SHIFT)) & USB_KEEP_ALIVE_CTRL_WAKE_INT_STS_MASK) +/*! @} */ + +/*! @name KEEP_ALIVE_WKCTRL - Keep Alive Mode Wakeup Control */ +/*! @{ */ + +#define USB_KEEP_ALIVE_WKCTRL_WAKE_ON_THIS_MASK (0xFU) +#define USB_KEEP_ALIVE_WKCTRL_WAKE_ON_THIS_SHIFT (0U) +/*! WAKE_ON_THIS - Token PID for the wakeup request + * 0b0001..Wake up after receiving OUT or SETUP token packet. + * 0b1101..Wake up after receiving SETUP token packet. All other values are reserved. + */ +#define USB_KEEP_ALIVE_WKCTRL_WAKE_ON_THIS(x) (((uint8_t)(((uint8_t)(x)) << USB_KEEP_ALIVE_WKCTRL_WAKE_ON_THIS_SHIFT)) & USB_KEEP_ALIVE_WKCTRL_WAKE_ON_THIS_MASK) + +#define USB_KEEP_ALIVE_WKCTRL_WAKE_ENDPT_MASK (0xF0U) +#define USB_KEEP_ALIVE_WKCTRL_WAKE_ENDPT_SHIFT (4U) +/*! WAKE_ENDPT - Endpoint address for the wakeup request */ +#define USB_KEEP_ALIVE_WKCTRL_WAKE_ENDPT(x) (((uint8_t)(((uint8_t)(x)) << USB_KEEP_ALIVE_WKCTRL_WAKE_ENDPT_SHIFT)) & USB_KEEP_ALIVE_WKCTRL_WAKE_ENDPT_MASK) +/*! @} */ + +/*! @name MISCCTRL - Miscellaneous Control */ +/*! @{ */ + +#define USB_MISCCTRL_SOFDYNTHLD_MASK (0x1U) +#define USB_MISCCTRL_SOFDYNTHLD_SHIFT (0U) +/*! SOFDYNTHLD - Dynamic SOF Threshold Compare mode + * 0b0..When the byte-times SOF threshold is reached + * 0b1..When 8 byte-times SOF threshold is reached or overstepped + */ +#define USB_MISCCTRL_SOFDYNTHLD(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_SOFDYNTHLD_SHIFT)) & USB_MISCCTRL_SOFDYNTHLD_MASK) + +#define USB_MISCCTRL_SOFBUSSET_MASK (0x2U) +#define USB_MISCCTRL_SOFBUSSET_SHIFT (1U) +/*! SOFBUSSET - SOF_TOK Interrupt Generation Mode Select + * 0b0..According to the SOF threshold value + * 0b1..When the SOF counter reaches 0 + */ +#define USB_MISCCTRL_SOFBUSSET(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_SOFBUSSET_SHIFT)) & USB_MISCCTRL_SOFBUSSET_MASK) + +#define USB_MISCCTRL_OWNERRISODIS_MASK (0x4U) +#define USB_MISCCTRL_OWNERRISODIS_SHIFT (2U) +/*! OWNERRISODIS - OWN Error Detect for ISO IN and ISO OUT Disable + * 0b0..Enable + * 0b1..Disable + */ +#define USB_MISCCTRL_OWNERRISODIS(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_OWNERRISODIS_SHIFT)) & USB_MISCCTRL_OWNERRISODIS_MASK) + +#define USB_MISCCTRL_VREDG_EN_MASK (0x8U) +#define USB_MISCCTRL_VREDG_EN_SHIFT (3U) +/*! VREDG_EN - VREGIN Rising Edge Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_MISCCTRL_VREDG_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_VREDG_EN_SHIFT)) & USB_MISCCTRL_VREDG_EN_MASK) + +#define USB_MISCCTRL_VFEDG_EN_MASK (0x10U) +#define USB_MISCCTRL_VFEDG_EN_SHIFT (4U) +/*! VFEDG_EN - VREGIN Falling Edge Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_MISCCTRL_VFEDG_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_VFEDG_EN_SHIFT)) & USB_MISCCTRL_VFEDG_EN_MASK) + +#define USB_MISCCTRL_STL_ADJ_EN_MASK (0x80U) +#define USB_MISCCTRL_STL_ADJ_EN_SHIFT (7U) +/*! STL_ADJ_EN - USB Peripheral Mode Stall Adjust Enable + * 0b0..If ENDPTn[END_STALL] = 1, both IN and OUT directions for the associated endpoint stalls. + * 0b1..If ENDPTn[END_STALL] = 1, the STALL_xx_DIS registers control which directions for the associated endpoint stalls. + */ +#define USB_MISCCTRL_STL_ADJ_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_STL_ADJ_EN_SHIFT)) & USB_MISCCTRL_STL_ADJ_EN_MASK) +/*! @} */ + +/*! @name STALL_IL_DIS - Peripheral Mode Stall Disable for Endpoints 7 to 0 in IN Direction */ +/*! @{ */ + +#define USB_STALL_IL_DIS_STALL_I_DIS0_MASK (0x1U) +#define USB_STALL_IL_DIS_STALL_I_DIS0_SHIFT (0U) +/*! STALL_I_DIS0 - Disable Endpoint 0 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS0(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS0_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS0_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS1_MASK (0x2U) +#define USB_STALL_IL_DIS_STALL_I_DIS1_SHIFT (1U) +/*! STALL_I_DIS1 - Disable Endpoint 1 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS1(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS1_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS1_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS2_MASK (0x4U) +#define USB_STALL_IL_DIS_STALL_I_DIS2_SHIFT (2U) +/*! STALL_I_DIS2 - Disable Endpoint 2 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS2(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS2_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS2_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS3_MASK (0x8U) +#define USB_STALL_IL_DIS_STALL_I_DIS3_SHIFT (3U) +/*! STALL_I_DIS3 - Disable Endpoint 3 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS3(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS3_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS3_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS4_MASK (0x10U) +#define USB_STALL_IL_DIS_STALL_I_DIS4_SHIFT (4U) +/*! STALL_I_DIS4 - Disable Endpoint 4 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS4(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS4_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS4_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS5_MASK (0x20U) +#define USB_STALL_IL_DIS_STALL_I_DIS5_SHIFT (5U) +/*! STALL_I_DIS5 - Disable Endpoint 5 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS5(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS5_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS5_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS6_MASK (0x40U) +#define USB_STALL_IL_DIS_STALL_I_DIS6_SHIFT (6U) +/*! STALL_I_DIS6 - Disable Endpoint 6 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS6(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS6_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS6_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS7_MASK (0x80U) +#define USB_STALL_IL_DIS_STALL_I_DIS7_SHIFT (7U) +/*! STALL_I_DIS7 - Disable Endpoint 7 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS7(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS7_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS7_MASK) +/*! @} */ + +/*! @name STALL_IH_DIS - Peripheral Mode Stall Disable for Endpoints 15 to 8 in IN Direction */ +/*! @{ */ + +#define USB_STALL_IH_DIS_STALL_I_DIS8_MASK (0x1U) +#define USB_STALL_IH_DIS_STALL_I_DIS8_SHIFT (0U) +/*! STALL_I_DIS8 - Disable Endpoint 8 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS8(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS8_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS8_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS9_MASK (0x2U) +#define USB_STALL_IH_DIS_STALL_I_DIS9_SHIFT (1U) +/*! STALL_I_DIS9 - Disable Endpoint 9 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS9(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS9_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS9_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS10_MASK (0x4U) +#define USB_STALL_IH_DIS_STALL_I_DIS10_SHIFT (2U) +/*! STALL_I_DIS10 - Disable Endpoint 10 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS10(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS10_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS10_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS11_MASK (0x8U) +#define USB_STALL_IH_DIS_STALL_I_DIS11_SHIFT (3U) +/*! STALL_I_DIS11 - Disable Endpoint 11 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS11(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS11_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS11_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS12_MASK (0x10U) +#define USB_STALL_IH_DIS_STALL_I_DIS12_SHIFT (4U) +/*! STALL_I_DIS12 - Disable Endpoint 12 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS12(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS12_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS12_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS13_MASK (0x20U) +#define USB_STALL_IH_DIS_STALL_I_DIS13_SHIFT (5U) +/*! STALL_I_DIS13 - Disable Endpoint 13 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS13(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS13_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS13_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS14_MASK (0x40U) +#define USB_STALL_IH_DIS_STALL_I_DIS14_SHIFT (6U) +/*! STALL_I_DIS14 - Disable Endpoint 14 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS14(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS14_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS14_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS15_MASK (0x80U) +#define USB_STALL_IH_DIS_STALL_I_DIS15_SHIFT (7U) +/*! STALL_I_DIS15 - Disable Endpoint 15 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS15(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS15_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS15_MASK) +/*! @} */ + +/*! @name STALL_OL_DIS - Peripheral Mode Stall Disable for Endpoints 7 to 0 in OUT Direction */ +/*! @{ */ + +#define USB_STALL_OL_DIS_STALL_O_DIS0_MASK (0x1U) +#define USB_STALL_OL_DIS_STALL_O_DIS0_SHIFT (0U) +/*! STALL_O_DIS0 - Disable Endpoint 0 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS0(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS0_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS0_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS1_MASK (0x2U) +#define USB_STALL_OL_DIS_STALL_O_DIS1_SHIFT (1U) +/*! STALL_O_DIS1 - Disable Endpoint 1 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS1(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS1_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS1_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS2_MASK (0x4U) +#define USB_STALL_OL_DIS_STALL_O_DIS2_SHIFT (2U) +/*! STALL_O_DIS2 - Disable Endpoint 2 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS2(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS2_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS2_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS3_MASK (0x8U) +#define USB_STALL_OL_DIS_STALL_O_DIS3_SHIFT (3U) +/*! STALL_O_DIS3 - Disable Endpoint 3 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS3(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS3_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS3_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS4_MASK (0x10U) +#define USB_STALL_OL_DIS_STALL_O_DIS4_SHIFT (4U) +/*! STALL_O_DIS4 - Disable Endpoint 4 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS4(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS4_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS4_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS5_MASK (0x20U) +#define USB_STALL_OL_DIS_STALL_O_DIS5_SHIFT (5U) +/*! STALL_O_DIS5 - Disable Endpoint 5 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS5(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS5_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS5_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS6_MASK (0x40U) +#define USB_STALL_OL_DIS_STALL_O_DIS6_SHIFT (6U) +/*! STALL_O_DIS6 - Disable Endpoint 6 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS6(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS6_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS6_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS7_MASK (0x80U) +#define USB_STALL_OL_DIS_STALL_O_DIS7_SHIFT (7U) +/*! STALL_O_DIS7 - Disable Endpoint 7 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS7(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS7_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS7_MASK) +/*! @} */ + +/*! @name STALL_OH_DIS - Peripheral Mode Stall Disable for Endpoints 15 to 8 in OUT Direction */ +/*! @{ */ + +#define USB_STALL_OH_DIS_STALL_O_DIS8_MASK (0x1U) +#define USB_STALL_OH_DIS_STALL_O_DIS8_SHIFT (0U) +/*! STALL_O_DIS8 - Disable Endpoint 8 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS8(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS8_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS8_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS9_MASK (0x2U) +#define USB_STALL_OH_DIS_STALL_O_DIS9_SHIFT (1U) +/*! STALL_O_DIS9 - Disable Endpoint 9 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS9(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS9_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS9_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS10_MASK (0x4U) +#define USB_STALL_OH_DIS_STALL_O_DIS10_SHIFT (2U) +/*! STALL_O_DIS10 - Disable Endpoint 10 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS10(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS10_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS10_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS11_MASK (0x8U) +#define USB_STALL_OH_DIS_STALL_O_DIS11_SHIFT (3U) +/*! STALL_O_DIS11 - Disable Endpoint 11 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS11(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS11_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS11_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS12_MASK (0x10U) +#define USB_STALL_OH_DIS_STALL_O_DIS12_SHIFT (4U) +/*! STALL_O_DIS12 - Disable endpoint 12 OUT direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS12(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS12_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS12_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS13_MASK (0x20U) +#define USB_STALL_OH_DIS_STALL_O_DIS13_SHIFT (5U) +/*! STALL_O_DIS13 - Disable Endpoint 13 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS13(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS13_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS13_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS14_MASK (0x40U) +#define USB_STALL_OH_DIS_STALL_O_DIS14_SHIFT (6U) +/*! STALL_O_DIS14 - Disable Endpoint 14 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS14(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS14_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS14_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS15_MASK (0x80U) +#define USB_STALL_OH_DIS_STALL_O_DIS15_SHIFT (7U) +/*! STALL_O_DIS15 - Disable Endpoint 15 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS15(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS15_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS15_MASK) +/*! @} */ + +/*! @name CLK_RECOVER_CTRL - USB Clock Recovery Control */ +/*! @{ */ + +#define USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL_MASK (0x8U) +#define USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL_SHIFT (3U) +/*! TRIM_INIT_VAL_SEL - Selects the source for the initial FIRC trim fine value used after a reset. + * 0b0..Mid-scale + * 0b1..IFR + */ +#define USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL_SHIFT)) & USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL_MASK) + +#define USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN_MASK (0x20U) +#define USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN_SHIFT (5U) +/*! RESTART_IFRTRIM_EN - Restart from IFR Trim Value + * 0b0..Trim fine adjustment always works based on the previous updated trim fine value. + * 0b1..Trim fine restarts from the IFR trim value whenever you detect bus_reset or bus_resume or deassert module enable. + */ +#define USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN_SHIFT)) & USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN_MASK) + +#define USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN_MASK (0x40U) +#define USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN_SHIFT (6U) +/*! RESET_RESUME_ROUGH_EN - Reset or Resume to Rough Phase Enable + * 0b0..Always works in tracking phase after the first time rough phase, to track transition. + * 0b1..Go back to rough stage whenever a bus reset or bus resume occurs. + */ +#define USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN_SHIFT)) & USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN_MASK) + +#define USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_MASK (0x80U) +#define USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_SHIFT (7U) +/*! CLOCK_RECOVER_EN - Crystal-Less USB Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_SHIFT)) & USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_MASK) +/*! @} */ + +/*! @name CLK_RECOVER_IRC_EN - FIRC Oscillator Enable */ +/*! @{ */ + +#define USB_CLK_RECOVER_IRC_EN_IRC_EN_MASK (0x2U) +#define USB_CLK_RECOVER_IRC_EN_IRC_EN_SHIFT (1U) +/*! IRC_EN - Fast IRC enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_CLK_RECOVER_IRC_EN_IRC_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_IRC_EN_IRC_EN_SHIFT)) & USB_CLK_RECOVER_IRC_EN_IRC_EN_MASK) +/*! @} */ + +/*! @name CLK_RECOVER_INT_EN - Clock Recovery Combined Interrupt Enable */ +/*! @{ */ + +#define USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN_MASK (0x10U) +#define USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN_SHIFT (4U) +/*! OVF_ERROR_EN - Overflow error interrupt enable + * 0b0..The interrupt is masked + * 0b1..The interrupt is enabled + */ +#define USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN_SHIFT)) & USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN_MASK) +/*! @} */ + +/*! @name CLK_RECOVER_INT_STATUS - Clock Recovery Separated Interrupt Status */ +/*! @{ */ + +#define USB_CLK_RECOVER_INT_STATUS_OVF_ERROR_MASK (0x10U) +#define USB_CLK_RECOVER_INT_STATUS_OVF_ERROR_SHIFT (4U) +/*! OVF_ERROR - Overflow Error Interrupt Status Flag + * 0b0..Interrupt did not occur + * 0b1..Unmasked interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_CLK_RECOVER_INT_STATUS_OVF_ERROR(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_INT_STATUS_OVF_ERROR_SHIFT)) & USB_CLK_RECOVER_INT_STATUS_OVF_ERROR_MASK) +/*! @} */ + +/*! + * @} + */ +/* end of group USB_Register_Masks */ + +/*! + * @brief This type of structure instance is used to implement the buffer descriptor for USB. + */ +typedef struct +{ + union { + uint32_t head; /*!< Head. */ + struct + { + uint32_t reserved0 : 2; /*!< RESEVED. */ + uint32_t bdt_stall : 1; /*!< Stall. */ + uint32_t dts : 1; /*!< Data shift sync. */ + uint32_t ninc : 1; /*!< DMA addr cannot increasing. */ + uint32_t keep : 1; /*!< Keep BD held by USB. */ + uint32_t data : 1; /*!< DATA0 or DATA1. */ + uint32_t own : 1; /*!< Owner, 0 is CPU, 1 is USB. */ + uint32_t reserved1 : 8; /*!< RESEVED. */ + uint32_t bc : 10; /*!< Packet size. */ + uint32_t reserved2 : 6; /*!< RESEVED. */ + }; + struct + { + uint32_t reserved3 : 2; /*!< RESEVED. */ + uint32_t tok_pid : 4; /*!< Token pid. */ + uint32_t reserved4 : 26; /*!< RESEVED. */ + }; + }; + uint32_t addr; /*!< Buffer addr. */ +} kinetis_bd_t; + +/*! + * @brief This type of structure instance is used to implement the buffer descriptor table for USB. + */ +typedef union { + kinetis_bd_t table[16][2][2]; /*!< [EndPoint] [Direction] [Odd_Even]. */ + uint8_t buffer[512]; /*!< buffer. */ +} kinetis_bd_table_t; + +/** + * @brief USBFS TokenPid type. + */ +typedef enum { + USB_TOKEN_PID_OUT = 0x1u, /*!< USB Token Pid: OUT. */ + USB_TOKEN_PID_IN = 0x9u, /*!< USB Token Pid: IN. */ + USB_TOKEN_PID_SETUP = 0xDu, /*!< USB Token Pid: SETUP. */ + USB_TOKEN_PID_DATA0 = 0x03, /*!< USB Token Pid: DATA0. */ + USB_TOKEN_PID_DATA1 = 0x0B, /*!< USB Token Pid: DATA1. */ + USB_TOKEN_PID_ACK = 0x02, /*!< USB Token Pid: ACK. */ + USB_TOKEN_PID_STALL = 0x0E, /*!< USB Token Pid: STALL. */ + USB_TOKEN_PID_NAK = 0x0A, /*!< USB Token Pid: NAK. */ + USB_TOKEN_PID_BUSTIMEOUT = 0x00, /*!< USB Token Pid: BUSTO. */ + USB_TOKEN_PID_ERR = 0x0f, /*!< USB Token Pid: ERR. */ +} USB_TOKEN_PID_Type; + +typedef struct { + KINETIS_TypeDef base; + __IO uint8_t USBCTRL; /**< USB Control, offset: 0x100 */ + uint8_t RESERVED_22[3]; + __I uint8_t OBSERVE; /**< USB OTG Observe, offset: 0x104 */ + uint8_t RESERVED_23[3]; + __IO uint8_t CONTROL; /**< USB OTG Control, offset: 0x108 */ + uint8_t RESERVED_24[3]; + __IO uint8_t USBTRC0; /**< USB Transceiver Control 0, offset: 0x10C */ + uint8_t RESERVED_25[7]; + __IO uint8_t USBFRMADJUST; /**< Frame Adjust, offset: 0x114 */ + uint8_t RESERVED_26[15]; + __IO uint8_t KEEP_ALIVE_CTRL; /**< Keep Alive Mode Control, offset: 0x124 */ + uint8_t RESERVED_27[3]; + __IO uint8_t KEEP_ALIVE_WKCTRL; /**< Keep Alive Mode Wakeup Control, offset: 0x128 */ + uint8_t RESERVED_28[3]; + __IO uint8_t MISCCTRL; /**< Miscellaneous Control, offset: 0x12C */ + uint8_t RESERVED_29[3]; + __IO uint8_t STALL_IL_DIS; /**< Peripheral Mode Stall Disable for Endpoints 7 to 0 in IN Direction, offset: 0x130 */ + uint8_t RESERVED_30[3]; + __IO uint8_t STALL_IH_DIS; /**< Peripheral Mode Stall Disable for Endpoints 15 to 8 in IN Direction, offset: 0x134 */ + uint8_t RESERVED_31[3]; + __IO uint8_t STALL_OL_DIS; /**< Peripheral Mode Stall Disable for Endpoints 7 to 0 in OUT Direction, offset: 0x138 */ + uint8_t RESERVED_32[3]; + __IO uint8_t STALL_OH_DIS; /**< Peripheral Mode Stall Disable for Endpoints 15 to 8 in OUT Direction, offset: 0x13C */ + uint8_t RESERVED_33[3]; + __IO uint8_t CLK_RECOVER_CTRL; /**< USB Clock Recovery Control, offset: 0x140 */ + uint8_t RESERVED_34[3]; + __IO uint8_t CLK_RECOVER_IRC_EN; /**< FIRC Oscillator Enable, offset: 0x144 */ + uint8_t RESERVED_35[15]; + __IO uint8_t CLK_RECOVER_INT_EN; /**< Clock Recovery Combined Interrupt Enable, offset: 0x154 */ + uint8_t RESERVED_36[7]; + __IO uint8_t CLK_RECOVER_INT_STATUS; /**< Clock Recovery Separated Interrupt Status, offset: 0x15C */ +} KINETIS_MCX_TypeDef; + +void usb_dc_low_level_init(uint8_t busid); +void usb_dc_low_level_deinit(uint8_t busid); + +void usbd_kinetis_delay_ms(uint8_t ms); +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/musb/README.md b/src/lib/CherryUSB/port/musb/README.md new file mode 100644 index 000000000..8b5e12995 --- /dev/null +++ b/src/lib/CherryUSB/port/musb/README.md @@ -0,0 +1,23 @@ +# Note + +## Support Chip List + +### Eastsoft + +- ES32F3xx + +### TI + +- MSP432E4x + +### Bekencorp + +- BK7256/BK7258 + +### AllwinnerTech + +- F1Cxxx, F2Cxxx + +### SIFLI + +- SF325X diff --git a/src/lib/CherryUSB/port/musb/usb_dc_musb.c b/src/lib/CherryUSB/port/musb/usb_dc_musb.c new file mode 100644 index 000000000..de45b97bd --- /dev/null +++ b/src/lib/CherryUSB/port/musb/usb_dc_musb.c @@ -0,0 +1,898 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usb_musb_reg.h" + +#define HWREG(x) \ + (*((volatile uint32_t *)(x))) +#define HWREGH(x) \ + (*((volatile uint16_t *)(x))) +#define HWREGB(x) \ + (*((volatile uint8_t *)(x))) + +#define USB_BASE (g_usbdev_bus[0].reg_base) + +#if defined(CONFIG_USB_MUSB_SUNXI) +#define MUSB_FADDR_OFFSET 0x98 +#define MUSB_POWER_OFFSET 0x40 +#define MUSB_TXIS_OFFSET 0x44 +#define MUSB_RXIS_OFFSET 0x46 +#define MUSB_TXIE_OFFSET 0x48 +#define MUSB_RXIE_OFFSET 0x4A +#define MUSB_IS_OFFSET 0x4C +#define MUSB_IE_OFFSET 0x50 +#define MUSB_EPIDX_OFFSET 0x42 + +#define MUSB_IND_TXMAP_OFFSET 0x80 +#define MUSB_IND_TXCSRL_OFFSET 0x82 +#define MUSB_IND_TXCSRH_OFFSET 0x83 +#define MUSB_IND_RXMAP_OFFSET 0x84 +#define MUSB_IND_RXCSRL_OFFSET 0x86 +#define MUSB_IND_RXCSRH_OFFSET 0x87 +#define MUSB_IND_RXCOUNT_OFFSET 0x88 +#define MUSB_IND_TXTYPE_OFFSET 0x8C +#define MUSB_IND_TXINTERVAL_OFFSET 0x8D +#define MUSB_IND_RXTYPE_OFFSET 0x8E +#define MUSB_IND_RXINTERVAL_OFFSET 0x8F + +#define MUSB_FIFO_OFFSET 0x00 + +#define MUSB_DEVCTL_OFFSET 0x41 + +#define MUSB_TXFIFOSZ_OFFSET 0x90 +#define MUSB_RXFIFOSZ_OFFSET 0x94 +#define MUSB_TXFIFOADD_OFFSET 0x92 +#define MUSB_RXFIFOADD_OFFSET 0x96 + +#define MUSB_TXFUNCADDR0_OFFSET 0x98 +#define MUSB_TXHUBADDR0_OFFSET 0x9A +#define MUSB_TXHUBPORT0_OFFSET 0x9B +#define MUSB_TXFUNCADDRx_OFFSET 0x98 +#define MUSB_TXHUBADDRx_OFFSET 0x9A +#define MUSB_TXHUBPORTx_OFFSET 0x9B +#define MUSB_RXFUNCADDRx_OFFSET 0x9C +#define MUSB_RXHUBADDRx_OFFSET 0x9E +#define MUSB_RXHUBPORTx_OFFSET 0x9F + +#define USB_TXMAP_BASE(ep_idx) (USB_BASE + MUSB_IND_TXMAP_OFFSET) +#define USB_TXCSRL_BASE(ep_idx) (USB_BASE + MUSB_IND_TXCSRL_OFFSET) +#define USB_TXCSRH_BASE(ep_idx) (USB_BASE + MUSB_IND_TXCSRH_OFFSET) +#define USB_RXMAP_BASE(ep_idx) (USB_BASE + MUSB_IND_RXMAP_OFFSET) +#define USB_RXCSRL_BASE(ep_idx) (USB_BASE + MUSB_IND_RXCSRL_OFFSET) +#define USB_RXCSRH_BASE(ep_idx) (USB_BASE + MUSB_IND_RXCSRH_OFFSET) +#define USB_RXCOUNT_BASE(ep_idx) (USB_BASE + MUSB_IND_RXCOUNT_OFFSET) +#define USB_TXTYPE_BASE(ep_idx) (USB_BASE + MUSB_IND_TXTYPE_OFFSET) +#define USB_TXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_IND_TXINTERVAL_OFFSET) +#define USB_RXTYPE_BASE(ep_idx) (USB_BASE + MUSB_IND_RXTYPE_OFFSET) +#define USB_RXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_IND_RXINTERVAL_OFFSET) + +#define USB_TXADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDRx_OFFSET) +#define USB_TXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXHUBADDRx_OFFSET) +#define USB_TXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXHUBPORTx_OFFSET) +#define USB_RXADDR_BASE(ep_idx) (USB_BASE + MUSB_RXFUNCADDRx_OFFSET) +#define USB_RXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_RXHUBADDRx_OFFSET) +#define USB_RXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_RXHUBPORTx_OFFSET) + +#elif defined(CONFIG_USB_MUSB_CUSTOM) +#include "musb_custom.h" +#else +#define MUSB_FADDR_OFFSET 0x00 +#define MUSB_POWER_OFFSET 0x01 +#define MUSB_TXIS_OFFSET 0x02 +#define MUSB_RXIS_OFFSET 0x04 +#define MUSB_TXIE_OFFSET 0x06 +#define MUSB_RXIE_OFFSET 0x08 +#define MUSB_IS_OFFSET 0x0A +#define MUSB_IE_OFFSET 0x0B + +#define MUSB_EPIDX_OFFSET 0x0E + +#define MUSB_IND_TXMAP_OFFSET 0x10 +#define MUSB_IND_TXCSRL_OFFSET 0x12 +#define MUSB_IND_TXCSRH_OFFSET 0x13 +#define MUSB_IND_RXMAP_OFFSET 0x14 +#define MUSB_IND_RXCSRL_OFFSET 0x16 +#define MUSB_IND_RXCSRH_OFFSET 0x17 +#define MUSB_IND_RXCOUNT_OFFSET 0x18 +#define MUSB_IND_TXTYPE_OFFSET 0x1A +#define MUSB_IND_TXINTERVAL_OFFSET 0x1B +#define MUSB_IND_RXTYPE_OFFSET 0x1C +#define MUSB_IND_RXINTERVAL_OFFSET 0x1D + +#define MUSB_FIFO_OFFSET 0x20 + +#define MUSB_DEVCTL_OFFSET 0x60 + +#define MUSB_TXFIFOSZ_OFFSET 0x62 +#define MUSB_RXFIFOSZ_OFFSET 0x63 +#define MUSB_TXFIFOADD_OFFSET 0x64 +#define MUSB_RXFIFOADD_OFFSET 0x66 + +#define MUSB_TXFUNCADDR0_OFFSET 0x80 +#define MUSB_TXHUBADDR0_OFFSET 0x82 +#define MUSB_TXHUBPORT0_OFFSET 0x83 +#define MUSB_TXFUNCADDRx_OFFSET 0x88 +#define MUSB_TXHUBADDRx_OFFSET 0x8A +#define MUSB_TXHUBPORTx_OFFSET 0x8B +#define MUSB_RXFUNCADDRx_OFFSET 0x8C +#define MUSB_RXHUBADDRx_OFFSET 0x8E +#define MUSB_RXHUBPORTx_OFFSET 0x8F + +#define MUSB_TXMAP0_OFFSET 0x100 + +// do not use EPIDX +#define USB_TXMAP_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx) +#define USB_TXCSRL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 2) +#define USB_TXCSRH_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 3) +#define USB_RXMAP_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 4) +#define USB_RXCSRL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 6) +#define USB_RXCSRH_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 7) +#define USB_RXCOUNT_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 8) +#define USB_TXTYPE_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0A) +#define USB_TXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0B) +#define USB_RXTYPE_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0C) +#define USB_RXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0D) + +#define USB_TXADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx) +#define USB_TXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 2) +#define USB_TXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 3) +#define USB_RXADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 4) +#define USB_RXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 6) +#define USB_RXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 7) +#endif + +#define USB_FIFO_BASE(ep_idx) (USB_BASE + MUSB_FIFO_OFFSET + 0x4 * ep_idx) + +typedef enum { + USB_EP0_STATE_SETUP = 0x0, /**< SETUP DATA */ + USB_EP0_STATE_IN_DATA = 0x1, /**< IN DATA */ + USB_EP0_STATE_OUT_DATA = 0x3, /**< OUT DATA */ + USB_EP0_STATE_IN_STATUS = 0x4, /**< IN status */ + USB_EP0_STATE_OUT_STATUS = 0x5, /**< OUT status */ + USB_EP0_STATE_IN_ZLP = 0x6, /**< OUT status */ + USB_EP0_STATE_STALL = 0x7, /**< STALL status */ +} ep0_state_t; + +/* Endpoint state */ +struct musb_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +/* Driver state */ +struct musb_udc { + volatile uint8_t dev_addr; + __attribute__((aligned(32))) struct usb_setup_packet setup; + struct musb_ep_state in_ep[CONFIG_USB_MUSB_EP_NUM]; /*!< IN endpoint parameters*/ + struct musb_ep_state out_ep[CONFIG_USB_MUSB_EP_NUM]; /*!< OUT endpoint parameters */ +} g_musb_udc; + +static volatile uint8_t usb_ep0_state = USB_EP0_STATE_SETUP; + +/* get current active ep */ +static uint8_t musb_get_active_ep(void) +{ + return HWREGB(USB_BASE + MUSB_EPIDX_OFFSET); +} + +/* set the active ep */ +static void musb_set_active_ep(uint8_t ep_index) +{ + HWREGB(USB_BASE + MUSB_EPIDX_OFFSET) = ep_index; +} + +static void musb_write_packet(uint8_t ep_idx, uint8_t *buffer, uint16_t len) +{ + uint32_t *buf32; + uint8_t *buf8; + uint32_t count32; + uint32_t count8; + int i; + + if ((uint32_t)buffer & 0x03) { + buf8 = buffer; + for (i = 0; i < len; i++) { + HWREGB(USB_FIFO_BASE(ep_idx)) = *buf8++; + } + } else { + count32 = len >> 2; + count8 = len & 0x03; + + buf32 = (uint32_t *)buffer; + + while (count32--) { + HWREG(USB_FIFO_BASE(ep_idx)) = *buf32++; + } + + buf8 = (uint8_t *)buf32; + + while (count8--) { + HWREGB(USB_FIFO_BASE(ep_idx)) = *buf8++; + } + } +} + +static void musb_read_packet(uint8_t ep_idx, uint8_t *buffer, uint16_t len) +{ + uint32_t *buf32; + uint8_t *buf8; + uint32_t count32; + uint32_t count8; + int i; + + if ((uint32_t)buffer & 0x03) { + buf8 = buffer; + for (i = 0; i < len; i++) { + *buf8++ = HWREGB(USB_FIFO_BASE(ep_idx)); + } + } else { + count32 = len >> 2; + count8 = len & 0x03; + + buf32 = (uint32_t *)buffer; + + while (count32--) { + *buf32++ = HWREG(USB_FIFO_BASE(ep_idx)); + } + + buf8 = (uint8_t *)buf32; + + while (count8--) { + *buf8++ = HWREGB(USB_FIFO_BASE(ep_idx)); + } + } +} + +static uint32_t musb_get_fifo_size(uint16_t mps, uint16_t *used) +{ + uint32_t size; + + for (uint8_t i = USB_TXFIFOSZ_SIZE_8; i <= USB_TXFIFOSZ_SIZE_2048; i++) { + size = (8 << i); + if (mps <= size) { + *used = size; + return i; + } + } + + *used = 0; + return USB_TXFIFOSZ_SIZE_8; +} + +static uint32_t usbd_musb_fifo_config(struct musb_fifo_cfg *cfg, uint32_t offset) +{ + uint16_t fifo_used; + uint8_t c_size; + uint16_t c_off; + + c_off = offset >> 3; + c_size = musb_get_fifo_size(cfg->maxpacket, &fifo_used); + + musb_set_active_ep(cfg->ep_num); + + switch (cfg->style) { + case FIFO_TX: + HWREGB(USB_BASE + MUSB_TXFIFOSZ_OFFSET) = c_size & 0x0f; + HWREGH(USB_BASE + MUSB_TXFIFOADD_OFFSET) = c_off; + break; + case FIFO_RX: + HWREGB(USB_BASE + MUSB_RXFIFOSZ_OFFSET) = c_size & 0x0f; + HWREGH(USB_BASE + MUSB_RXFIFOADD_OFFSET) = c_off; + break; + case FIFO_TXRX: + HWREGB(USB_BASE + MUSB_TXFIFOSZ_OFFSET) = c_size & 0x0f; + HWREGH(USB_BASE + MUSB_TXFIFOADD_OFFSET) = c_off; + HWREGB(USB_BASE + MUSB_RXFIFOSZ_OFFSET) = c_size & 0x0f; + HWREGH(USB_BASE + MUSB_RXFIFOADD_OFFSET) = c_off; + break; + + default: + break; + } + + return (offset + fifo_used); +} + +__WEAK void usb_dc_low_level_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + +int usb_dc_init(uint8_t busid) +{ + uint16_t offset = 0; + uint8_t cfg_num; + struct musb_fifo_cfg *cfg; + + usb_dc_low_level_init(); + +#ifdef CONFIG_USB_HS + HWREGB(USB_BASE + MUSB_POWER_OFFSET) |= USB_POWER_HSENAB; +#else + HWREGB(USB_BASE + MUSB_POWER_OFFSET) &= ~USB_POWER_HSENAB; +#endif + + musb_set_active_ep(0); + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = 0; + + HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) |= USB_DEVCTL_SESSION; + + cfg_num = usbd_get_musb_fifo_cfg(&cfg); + + for (uint8_t i = 0; i < cfg_num; i++) { + offset = usbd_musb_fifo_config(&cfg[i], offset); + } + + USB_ASSERT_MSG(offset <= usb_get_musb_ram_size(), "Your fifo config is overflow, please check"); + + /* Enable USB interrupts */ + HWREGB(USB_BASE + MUSB_IE_OFFSET) = USB_IE_RESET | USB_IE_SUSPND | USB_IE_RESUME; + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) = USB_TXIE_EP0; + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) = 0; + +#ifdef CONFIG_USBDEV_SOF_ENABLE + HWREGB(USB_BASE + MUSB_IE_OFFSET) |= USB_IE_SOF; +#endif + + HWREGB(USB_BASE + MUSB_POWER_OFFSET) |= USB_POWER_SOFTCONN; + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + HWREGB(USB_BASE + MUSB_IE_OFFSET) = 0; + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) = 0; + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) = 0; + + HWREGB(USB_BASE + MUSB_POWER_OFFSET) &= ~USB_POWER_SOFTCONN; + + usb_dc_low_level_deinit(); + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + if (addr == 0) { + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = 0; + } + + g_musb_udc.dev_addr = addr; + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + HWREGB(USB_BASE + MUSB_POWER_OFFSET) |= USB_POWER_RESUME; + usbd_musb_delay_ms(10); + HWREGB(USB_BASE + MUSB_POWER_OFFSET) &= ~USB_POWER_RESUME; + return 0; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + uint8_t speed = USB_SPEED_UNKNOWN; + + if (HWREGB(USB_BASE + MUSB_POWER_OFFSET) & USB_POWER_HSMODE) + speed = USB_SPEED_HIGH; + else if (HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) & USB_DEVCTL_FSDEV) + speed = USB_SPEED_FULL; + else if (HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) & USB_DEVCTL_LSDEV) + speed = USB_SPEED_LOW; + + return speed; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + uint8_t old_ep_idx; + uint32_t ui32Flags = 0; + uint16_t ui32Register = 0; + + if (ep_idx == 0) { + g_musb_udc.out_ep[0].ep_mps = USB_CTRL_EP_MPS; + g_musb_udc.out_ep[0].ep_type = 0x00; + g_musb_udc.out_ep[0].ep_enable = true; + g_musb_udc.in_ep[0].ep_mps = USB_CTRL_EP_MPS; + g_musb_udc.in_ep[0].ep_type = 0x00; + g_musb_udc.in_ep[0].ep_enable = true; + return 0; + } + + USB_ASSERT_MSG(ep_idx < CONFIG_USB_MUSB_EP_NUM, "Ep addr %02x overflow", ep->bEndpointAddress); + + old_ep_idx = musb_get_active_ep(); + musb_set_active_ep(ep_idx); + + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_musb_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_musb_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_musb_udc.out_ep[ep_idx].ep_enable = true; + +#ifndef CONFIG_USB_MUSB_SIFLI + USB_ASSERT_MSG((8 << HWREGB(USB_BASE + MUSB_RXFIFOSZ_OFFSET)) >= g_musb_udc.out_ep[ep_idx].ep_mps, + "Ep %02x fifo is overflow", ep->bEndpointAddress); +#endif + + HWREGH(USB_RXMAP_BASE(ep_idx)) = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + + // + // Allow auto clearing of RxPktRdy when packet of size max packet + // has been unloaded from the FIFO. + // + if (ui32Flags & USB_EP_AUTO_CLEAR) { + ui32Register = USB_RXCSRH1_AUTOCL; + } + // + // Configure the DMA mode. + // + if (ui32Flags & USB_EP_DMA_MODE_1) { + ui32Register |= USB_RXCSRH1_DMAEN | USB_RXCSRH1_DMAMOD; + } else if (ui32Flags & USB_EP_DMA_MODE_0) { + ui32Register |= USB_RXCSRH1_DMAEN; + } + // + // If requested, disable NYET responses for high-speed bulk and + // interrupt endpoints. + // + if (ui32Flags & USB_EP_DIS_NYET) { + ui32Register |= USB_RXCSRH1_DISNYET; + } + + // + // Enable isochronous mode if requested. + // + if (USB_GET_ENDPOINT_TYPE(ep->bmAttributes) == 0x01) { + ui32Register |= USB_RXCSRH1_ISO; + } + + HWREGB(USB_RXCSRH_BASE(ep_idx)) = ui32Register; + + // Reset the Data toggle to zero. + if (HWREGB(USB_RXCSRL_BASE(ep_idx)) & USB_RXCSRL1_RXRDY) + HWREGB(USB_RXCSRL_BASE(ep_idx)) = (USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH); + else + HWREGB(USB_RXCSRL_BASE(ep_idx)) = USB_RXCSRL1_CLRDT; + + HWREGB(USB_TXCSRH_BASE(ep_idx)) &= ~USB_TXCSRH1_MODE; + } else { + g_musb_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_musb_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_musb_udc.in_ep[ep_idx].ep_enable = true; + +#ifndef CONFIG_USB_MUSB_SIFLI + USB_ASSERT_MSG((8 << HWREGB(USB_BASE + MUSB_TXFIFOSZ_OFFSET)) >= g_musb_udc.in_ep[ep_idx].ep_mps, + "Ep %02x fifo is overflow", ep->bEndpointAddress); +#endif + + HWREGH(USB_TXMAP_BASE(ep_idx)) = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + + // + // Allow auto setting of TxPktRdy when max packet size has been loaded + // into the FIFO. + // + if (ui32Flags & USB_EP_AUTO_SET) { + ui32Register |= USB_TXCSRH1_AUTOSET; + } + + // + // Configure the DMA mode. + // + if (ui32Flags & USB_EP_DMA_MODE_1) { + ui32Register |= USB_TXCSRH1_DMAEN | USB_TXCSRH1_DMAMOD; + } else if (ui32Flags & USB_EP_DMA_MODE_0) { + ui32Register |= USB_TXCSRH1_DMAEN; + } + + // + // Enable isochronous mode if requested. + // + if (USB_GET_ENDPOINT_TYPE(ep->bmAttributes) == 0x01) { + ui32Register |= USB_TXCSRH1_ISO; + } + + HWREGB(USB_TXCSRH_BASE(ep_idx)) = ui32Register | USB_TXCSRH1_MODE; + + // Reset the Data toggle to zero. + if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_TXRDY) + HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH); + else + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_CLRDT; + } + + musb_set_active_ep(old_ep_idx); + + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint8_t old_ep_idx; + + old_ep_idx = musb_get_active_ep(); + musb_set_active_ep(ep_idx); + + if (USB_EP_DIR_IS_OUT(ep)) { + if (ep_idx == 0x00) { + usb_ep0_state = USB_EP0_STATE_STALL; + HWREGB(USB_TXCSRL_BASE(ep_idx)) |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC); + } else { + HWREGB(USB_RXCSRL_BASE(ep_idx)) |= USB_RXCSRL1_STALL; + } + } else { + if (ep_idx == 0x00) { + usb_ep0_state = USB_EP0_STATE_STALL; + HWREGB(USB_TXCSRL_BASE(ep_idx)) |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC); + } else { + HWREGB(USB_TXCSRL_BASE(ep_idx)) |= USB_TXCSRL1_STALL; + } + } + + musb_set_active_ep(old_ep_idx); + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint8_t old_ep_idx; + + old_ep_idx = musb_get_active_ep(); + musb_set_active_ep(ep_idx); + + if (USB_EP_DIR_IS_OUT(ep)) { + if (ep_idx == 0x00) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALLED; + } else { + // Clear the stall on an OUT endpoint. + HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~(USB_RXCSRL1_STALL | USB_RXCSRL1_STALLED); + // Reset the data toggle. + HWREGB(USB_RXCSRL_BASE(ep_idx)) |= USB_RXCSRL1_CLRDT; + } + } else { + if (ep_idx == 0x00) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALLED; + } else { + // Clear the stall on an IN endpoint. + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~(USB_TXCSRL1_STALL | USB_TXCSRL1_STALLED); + // Reset the data toggle. + HWREGB(USB_TXCSRL_BASE(ep_idx)) |= USB_TXCSRL1_CLRDT; + } + } + + musb_set_active_ep(old_ep_idx); + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint8_t old_ep_idx; + + old_ep_idx = musb_get_active_ep(); + musb_set_active_ep(ep_idx); + + if (USB_EP_DIR_IS_OUT(ep)) { + if (HWREGB(USB_RXCSRL_BASE(ep_idx)) & USB_RXCSRL1_STALL) { + *stalled = 1; + } else { + *stalled = 0; + } + } else { + if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_STALL) { + *stalled = 1; + } else { + *stalled = 0; + } + } + musb_set_active_ep(old_ep_idx); + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint8_t old_ep_idx; + + if (!data && data_len) { + return -1; + } + if (!g_musb_udc.in_ep[ep_idx].ep_enable) { + return -2; + } + + old_ep_idx = musb_get_active_ep(); + musb_set_active_ep(ep_idx); + + if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_TXRDY) { + musb_set_active_ep(old_ep_idx); + return -3; + } + + g_musb_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_musb_udc.in_ep[ep_idx].xfer_len = data_len; + g_musb_udc.in_ep[ep_idx].actual_xfer_len = 0; + + if (data_len == 0) { + if (ep_idx == 0x00) { + if (g_musb_udc.setup.wLength == 0) { + usb_ep0_state = USB_EP0_STATE_IN_STATUS; + } else { + usb_ep0_state = USB_EP0_STATE_IN_ZLP; + } + HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_TXRDY | USB_CSRL0_DATAEND); + } else { + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY; + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) |= (1 << ep_idx); + } + musb_set_active_ep(old_ep_idx); + return 0; + } + data_len = MIN(data_len, g_musb_udc.in_ep[ep_idx].ep_mps); + + musb_write_packet(ep_idx, (uint8_t *)data, data_len); + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) |= (1 << ep_idx); + + if (ep_idx == 0x00) { + usb_ep0_state = USB_EP0_STATE_IN_DATA; + if (data_len < g_musb_udc.in_ep[ep_idx].ep_mps) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_TXRDY | USB_CSRL0_DATAEND); + } else { + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_TXRDY; + } + } else { + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY; + } + + musb_set_active_ep(old_ep_idx); + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint8_t old_ep_idx; + + if (!data && data_len) { + return -1; + } + if (!g_musb_udc.out_ep[ep_idx].ep_enable) { + return -2; + } + + old_ep_idx = musb_get_active_ep(); + musb_set_active_ep(ep_idx); + + g_musb_udc.out_ep[ep_idx].xfer_buf = data; + g_musb_udc.out_ep[ep_idx].xfer_len = data_len; + g_musb_udc.out_ep[ep_idx].actual_xfer_len = 0; + + if (data_len == 0) { + if (ep_idx == 0) { + usb_ep0_state = USB_EP0_STATE_SETUP; + } + musb_set_active_ep(old_ep_idx); + return 0; + } + if (ep_idx == 0) { + usb_ep0_state = USB_EP0_STATE_OUT_DATA; + } else { + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) |= (1 << ep_idx); + } + musb_set_active_ep(old_ep_idx); + return 0; +} + +static void handle_ep0(void) +{ + uint8_t ep_idx = 0; // EP0 index is always 0 + uint8_t ep0_status = HWREGB(USB_TXCSRL_BASE(ep_idx)); + uint16_t read_count; + + if (ep0_status & USB_CSRL0_STALLED) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALLED; + usb_ep0_state = USB_EP0_STATE_SETUP; + return; + } + + if (ep0_status & USB_CSRL0_SETEND) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_SETENDC; + } + + if (g_musb_udc.dev_addr > 0) { + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = g_musb_udc.dev_addr; + g_musb_udc.dev_addr = 0; + } + + switch (usb_ep0_state) { + case USB_EP0_STATE_SETUP: + if (ep0_status & USB_CSRL0_RXRDY) { + read_count = HWREGH(USB_RXCOUNT_BASE(ep_idx)); + + if (read_count != 8) { + return; + } + + musb_read_packet(0, (uint8_t *)&g_musb_udc.setup, 8); + if (g_musb_udc.setup.wLength) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_RXRDYC; + } else { + HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_RXRDYC | USB_CSRL0_DATAEND); + } + + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_musb_udc.setup); + } + break; + + case USB_EP0_STATE_IN_DATA: + if (g_musb_udc.in_ep[0].xfer_len > g_musb_udc.in_ep[0].ep_mps) { + g_musb_udc.in_ep[0].actual_xfer_len += g_musb_udc.in_ep[0].ep_mps; + g_musb_udc.in_ep[0].xfer_len -= g_musb_udc.in_ep[0].ep_mps; + } else { + g_musb_udc.in_ep[0].actual_xfer_len += g_musb_udc.in_ep[0].xfer_len; + g_musb_udc.in_ep[0].xfer_len = 0; + } + + usbd_event_ep_in_complete_handler(0, 0x80, g_musb_udc.in_ep[0].actual_xfer_len); + + break; + case USB_EP0_STATE_OUT_DATA: + if (ep0_status & USB_CSRL0_RXRDY) { + read_count = HWREGH(USB_RXCOUNT_BASE(ep_idx)); + + musb_read_packet(0, g_musb_udc.out_ep[0].xfer_buf, read_count); + g_musb_udc.out_ep[0].xfer_buf += read_count; + g_musb_udc.out_ep[0].actual_xfer_len += read_count; + + if (read_count < g_musb_udc.out_ep[0].ep_mps) { + usbd_event_ep_out_complete_handler(0, 0x00, g_musb_udc.out_ep[0].actual_xfer_len); + HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_RXRDYC | USB_CSRL0_DATAEND); + usb_ep0_state = USB_EP0_STATE_IN_STATUS; + } else { + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_RXRDYC; + } + } + break; + case USB_EP0_STATE_IN_STATUS: + case USB_EP0_STATE_IN_ZLP: + usb_ep0_state = USB_EP0_STATE_SETUP; + usbd_event_ep_in_complete_handler(0, 0x80, 0); + break; + } +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint32_t is; + uint32_t txis; + uint32_t rxis; + uint8_t old_ep_idx; + uint8_t ep_idx; + uint16_t write_count, read_count; + + if (HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) & USB_DEVCTL_HOST) { + return; + } + + is = HWREGB(USB_BASE + MUSB_IS_OFFSET); + txis = HWREGH(USB_BASE + MUSB_TXIS_OFFSET); + rxis = HWREGH(USB_BASE + MUSB_RXIS_OFFSET); + + HWREGB(USB_BASE + MUSB_IS_OFFSET) = is; + + old_ep_idx = musb_get_active_ep(); + + /* Receive a reset signal from the USB bus */ + if (is & USB_IS_RESET) { + memset(&g_musb_udc, 0, sizeof(struct musb_udc)); + usbd_event_reset_handler(0); + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) = USB_TXIE_EP0; + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) = 0; + + usb_ep0_state = USB_EP0_STATE_SETUP; + } + +#ifdef CONFIG_USBDEV_SOF_ENABLE + if (is & USB_IS_SOF) { + usbd_event_sof_handler(0); + } +#endif + + if (is & USB_IS_RESUME) { + usbd_event_resume_handler(0); + } + + if (is & USB_IS_SUSPEND) { + usbd_event_suspend_handler(0); + } + + txis &= HWREGH(USB_BASE + MUSB_TXIE_OFFSET); + /* Handle EP0 interrupt */ + if (txis & USB_TXIE_EP0) { + HWREGH(USB_BASE + MUSB_TXIS_OFFSET) = USB_TXIE_EP0; + musb_set_active_ep(0); + handle_ep0(); + txis &= ~USB_TXIE_EP0; + } + + ep_idx = 1; + while (txis) { + if (txis & (1 << ep_idx)) { + musb_set_active_ep(ep_idx); + HWREGH(USB_BASE + MUSB_TXIS_OFFSET) = (1 << ep_idx); + if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_UNDRN) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_TXCSRL1_UNDRN; + } + + if (g_musb_udc.in_ep[ep_idx].xfer_len > g_musb_udc.in_ep[ep_idx].ep_mps) { + g_musb_udc.in_ep[ep_idx].xfer_buf += g_musb_udc.in_ep[ep_idx].ep_mps; + g_musb_udc.in_ep[ep_idx].actual_xfer_len += g_musb_udc.in_ep[ep_idx].ep_mps; + g_musb_udc.in_ep[ep_idx].xfer_len -= g_musb_udc.in_ep[ep_idx].ep_mps; + } else { + g_musb_udc.in_ep[ep_idx].xfer_buf += g_musb_udc.in_ep[ep_idx].xfer_len; + g_musb_udc.in_ep[ep_idx].actual_xfer_len += g_musb_udc.in_ep[ep_idx].xfer_len; + g_musb_udc.in_ep[ep_idx].xfer_len = 0; + } + + if (g_musb_udc.in_ep[ep_idx].xfer_len == 0) { + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) &= ~(1 << ep_idx); + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_musb_udc.in_ep[ep_idx].actual_xfer_len); + } else { + write_count = MIN(g_musb_udc.in_ep[ep_idx].xfer_len, g_musb_udc.in_ep[ep_idx].ep_mps); + + musb_write_packet(ep_idx, g_musb_udc.in_ep[ep_idx].xfer_buf, write_count); + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY; + } + + txis &= ~(1 << ep_idx); + } + ep_idx++; + } + + rxis &= HWREGH(USB_BASE + MUSB_RXIE_OFFSET); + ep_idx = 1; + while (rxis) { + if (rxis & (1 << ep_idx)) { + musb_set_active_ep(ep_idx); + HWREGH(USB_BASE + MUSB_RXIS_OFFSET) = (1 << ep_idx); + if (HWREGB(USB_RXCSRL_BASE(ep_idx)) & USB_RXCSRL1_RXRDY) { + read_count = HWREGH(USB_RXCOUNT_BASE(ep_idx)); + + musb_read_packet(ep_idx, g_musb_udc.out_ep[ep_idx].xfer_buf, read_count); + HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~(USB_RXCSRL1_RXRDY); + + g_musb_udc.out_ep[ep_idx].xfer_buf += read_count; + g_musb_udc.out_ep[ep_idx].actual_xfer_len += read_count; + g_musb_udc.out_ep[ep_idx].xfer_len -= read_count; + + if ((read_count < g_musb_udc.out_ep[ep_idx].ep_mps) || (g_musb_udc.out_ep[ep_idx].xfer_len == 0)) { + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) &= ~(1 << ep_idx); + usbd_event_ep_out_complete_handler(0, ep_idx, g_musb_udc.out_ep[ep_idx].actual_xfer_len); + } else { + } + } + + rxis &= ~(1 << ep_idx); + } + ep_idx++; + } + + musb_set_active_ep(old_ep_idx); +} diff --git a/src/lib/CherryUSB/port/musb/usb_glue_bk.c b/src/lib/CherryUSB/port/musb/usb_glue_bk.c new file mode 100644 index 000000000..728b44738 --- /dev/null +++ b/src/lib/CherryUSB/port/musb/usb_glue_bk.c @@ -0,0 +1,326 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "sys_driver.h" +#include "gpio_driver.h" +#include +#include +#include +#include "bk_misc.h" +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_musb_reg.h" + +#define USB_BASE_ADDR SOC_USB_REG_BASE + +#if (CONFIG_SOC_BK7271) +#define REG_AHB2_USB_OTG_CFG (*((volatile unsigned char *)(USB_BASE_ADDR + 0x80))) +#define REG_AHB2_USB_DMA_ENDP (*((volatile unsigned char *)(USB_BASE_ADDR + 0x84))) +#define REG_AHB2_USB_VTH (*((volatile unsigned char *)(USB_BASE_ADDR + 0x88))) +#define REG_AHB2_USB_GEN (*((volatile unsigned char *)(USB_BASE_ADDR + 0x8C))) +#define REG_AHB2_USB_STAT (*((volatile unsigned char *)(USB_BASE_ADDR + 0x90))) +#define REG_AHB2_USB_INT (*((volatile unsigned char *)(USB_BASE_ADDR + 0x94))) +#define REG_AHB2_USB_RESET (*((volatile unsigned char *)(USB_BASE_ADDR + 0x98))) +#define REG_AHB2_USB_DEV_CFG (*((volatile unsigned char *)(USB_BASE_ADDR + 0x9C))) +#elif (CONFIG_SOC_BK7256XX) +#define REG_AHB2_USB_OTG_CFG (*((volatile unsigned char *)(USB_BASE_ADDR + 0x280))) +#define REG_AHB2_USB_DMA_ENDP (*((volatile unsigned char *)(USB_BASE_ADDR + 0x284))) +#define REG_AHB2_USB_VTH (*((volatile unsigned char *)(USB_BASE_ADDR + 0x288))) +#define REG_AHB2_USB_GEN (*((volatile unsigned char *)(USB_BASE_ADDR + 0x28C))) +#define REG_AHB2_USB_STAT (*((volatile unsigned char *)(USB_BASE_ADDR + 0x290))) +#define REG_AHB2_USB_INT (*((volatile unsigned char *)(USB_BASE_ADDR + 0x294))) +#define REG_AHB2_USB_RESET (*((volatile unsigned char *)(USB_BASE_ADDR + 0x298))) +#define REG_AHB2_USB_DEV_CFG (*((volatile unsigned char *)(USB_BASE_ADDR + 0x29C))) +#elif (CONFIG_SOC_BK7236XX) || (CONFIG_SOC_BK7239XX) || (CONFIG_SOC_BK7286XX) +#define REG_AHB2_USB_DEVICE_ID (*((volatile unsigned char *)(USB_BASE_ADDR + 0x280))) +#define REG_AHB2_USB_VERSION_ID (*((volatile unsigned char *)(USB_BASE_ADDR + 0x284))) +#define REG_AHB2_USB_GLOBAL_CTRL (*((volatile unsigned char *)(USB_BASE_ADDR + 0x288))) +#define REG_AHB2_USB_DEVICE_STATUS (*((volatile unsigned char *)(USB_BASE_ADDR + 0x28c))) +#define REG_AHB2_USB_OTG_CFG (*((volatile unsigned char *)(USB_BASE_ADDR + 0x290))) +#define REG_AHB2_USB_DMA_ENDP (*((volatile unsigned char *)(USB_BASE_ADDR + 0x294))) +#define REG_AHB2_USB_VTH (*((volatile unsigned char *)(USB_BASE_ADDR + 0x298))) +#define REG_AHB2_USB_GEN (*((volatile unsigned char *)(USB_BASE_ADDR + 0x29C))) +#define REG_AHB2_USB_STAT (*((volatile unsigned char *)(USB_BASE_ADDR + 0x2A0))) +#define REG_AHB2_USB_INT (*((volatile unsigned char *)(USB_BASE_ADDR + 0x2A4))) +#define REG_AHB2_USB_RESET (*((volatile unsigned char *)(USB_BASE_ADDR + 0x2A8))) +#define REG_AHB2_USB_DEV_CFG (*((volatile unsigned char *)(USB_BASE_ADDR + 0x2AC))) + +#define REG_USB_USR_700 (*((volatile unsigned long *)(USB_BASE_ADDR + 0x700))) +#define REG_USB_USR_704 (*((volatile unsigned long *)(USB_BASE_ADDR + 0x704))) +#define REG_USB_USR_708 (*((volatile unsigned long *)(USB_BASE_ADDR + 0x708))) +#define REG_USB_USR_70C (*((volatile unsigned long *)(USB_BASE_ADDR + 0x70C))) +#define REG_USB_USR_710 (*((volatile unsigned long *)(USB_BASE_ADDR + 0x710))) +#define REG_USB_USR_714 (*((volatile unsigned long *)(USB_BASE_ADDR + 0x714))) +#define REG_USB_PHY_00 (*((volatile unsigned long *)(USB_BASE_ADDR + 0x400))) +#define REG_USB_PHY_01 (*((volatile unsigned long *)(USB_BASE_ADDR + 0x404))) +#endif + +#define USB_DP_CAPABILITY_VALUE (0xF) +#define USB_DN_CAPABILITY_VALUE (0xF) + +#define NANENG_PHY_FC_REG01 (0x01 * 4) +#define NANENG_PHY_FC_REG02 (0x02 * 4) +#define NANENG_PHY_FC_REG03 (0x03 * 4) +#define NANENG_PHY_FC_REG04 (0x04 * 4) +#define NANENG_PHY_FC_REG05 (0x05 * 4) +#define NANENG_PHY_FC_REG06 (0x06 * 4) +#define NANENG_PHY_FC_REG07 (0x07 * 4) +#define NANENG_PHY_FC_REG08 (0x08 * 4) +#define NANENG_PHY_FC_REG09 (0x09 * 4) +#define NANENG_PHY_FC_REG0A (0x0A * 4) +#define NANENG_PHY_FC_REG0B (0x0B * 4) +#define NANENG_PHY_FC_REG0C (0x0C * 4) +#define NANENG_PHY_FC_REG0D (0x0D * 4) +#define NANENG_PHY_FC_REG0E (0x0E * 4) +#define NANENG_PHY_FC_REG0F (0x0F * 4) +#define NANENG_PHY_FC_REG0F_BYTE 0x0F + +#define NANENG_PHY_FC_REG10 (0x10 * 4) +#define NANENG_PHY_FC_REG11 (0x11 * 4) +#define NANENG_PHY_FC_REG12 (0x12 * 4) +#define NANENG_PHY_FC_REG13 (0x13 * 4) +#define NANENG_PHY_FC_REG14 (0x14 * 4) +#define NANENG_PHY_FC_REG15 (0x15 * 4) +#define NANENG_PHY_FC_REG16 (0x16 * 4) +#define NANENG_PHY_FC_REG17 (0x17 * 4) +#define NANENG_PHY_FC_REG18 (0x18 * 4) +#define NANENG_PHY_FC_REG19 (0x19 * 4) +#define NANENG_PHY_FC_REG1A (0x1A * 4) +#define NANENG_PHY_FC_REG1B (0x1B * 4) +#define NANENG_PHY_FC_REG1C (0x1C * 4) +#define NANENG_PHY_FC_REG1D (0x1D * 4) +#define NANENG_PHY_FC_REG1E (0x1E * 4) +#define NANENG_PHY_FC_REG1F (0x1F * 4) + +#if CONFIG_USB_MUSB_EP_NUM != 8 +#error beken chips only support 8 endpoints +#endif + +#if CONFIG_USB_MUSB_PIPE_NUM != 8 +#error beken chips only support 8 pipes +#endif + +// clang-format off +static struct musb_fifo_cfg musb_device_table[] = { +{ .ep_num = 0, .style = FIFO_TXRX, .maxpacket = 64, }, +{ .ep_num = 1, .style = FIFO_TX, .maxpacket = 1024, }, +{ .ep_num = 1, .style = FIFO_RX, .maxpacket = 1024, }, +{ .ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 2, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 4, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 4, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 5, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 5, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 6, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 7, .style = FIFO_TXRX, .maxpacket = 512, } +}; + +static struct musb_fifo_cfg musb_host_table[] = { +{ .ep_num = 0, .style = FIFO_TXRX, .maxpacket = 64, }, +{ .ep_num = 1, .style = FIFO_TX, .maxpacket = 1024, }, +{ .ep_num = 1, .style = FIFO_RX, .maxpacket = 1024, }, +{ .ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 2, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 4, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 4, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 5, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 5, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 6, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 7, .style = FIFO_TXRX, .maxpacket = 512, } +}; +// clang-format on + +uint8_t usbd_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = musb_device_table; + return sizeof(musb_device_table) / sizeof(musb_device_table[0]); +} + +uint8_t usbh_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = musb_host_table; + return sizeof(musb_host_table) / sizeof(musb_host_table[0]); +} + +uint32_t usb_get_musb_ram_size(void) +{ + return 8192; +} + +extern void USBD_IRQHandler(uint8_t busid); + +void USBD_IRQ(void) +{ + USBD_IRQHandler(0); +} + +static void bk_analog_layer_usb_sys_related_ops(uint32_t usb_mode, bool ops) +{ + extern void delay(INT32 num); + +#if 0 + sys_drv_usb_analog_phy_en(ops, NULL); + sys_drv_usb_analog_speed_en(ops, NULL); + sys_drv_usb_analog_ckmcu_en(ops, NULL); +#endif + if (ops) { + sys_drv_usb_clock_ctrl(true, NULL); + delay(100); +#if 0 + sys_drv_usb_analog_deepsleep_en(false); +#endif + sys_drv_usb_analog_dp_capability(USB_DP_CAPABILITY_VALUE); + sys_drv_usb_analog_dn_capability(USB_DN_CAPABILITY_VALUE); + if (!sys_hal_psram_ldo_status()) { + sys_drv_psram_ldo_enable(1); + } + sys_drv_usb_analog_phy_en(1, NULL); + + if (usb_mode == 0) { + REG_USB_USR_708 = 0x0; + REG_USB_USR_710 &= ~(0x1 << 7); + delay(100); + + REG_USB_USR_710 |= (0x1 << 15); + //REG_USB_USR_710 |= (0x1<<14); + REG_USB_USR_710 |= (0x1 << 16); + REG_USB_USR_710 |= (0x1 << 17); + REG_USB_USR_710 |= (0x1 << 18); + REG_USB_USR_710 |= (0x1 << 19); + REG_USB_USR_710 &= ~(0x1 << 20); + REG_USB_USR_710 |= (0x1 << 21); + REG_USB_USR_710 |= (0x0 << 0); + REG_USB_USR_710 |= (0x1 << 5); + REG_USB_USR_710 |= (0x1 << 6); + REG_USB_USR_710 |= (0x1 << 9); + REG_USB_USR_710 |= (0x1 << 10); + REG_USB_USR_710 |= (0x1 << 1); + + REG_USB_USR_710 |= (0x1 << 7); + REG_USB_USR_708 = 0x1; +#if 0 + REG_USB_PHY_00 = 0x08; + REG_USB_PHY_01 = 0x02; + REG_USB_USR_710 |= (0x1<< 8); + while(1){ + reg = REG_USB_USR_70C; + if(reg & 0x100){ + USB_DRIVER_LOGI("SelfTest Fin!\r\n"); + USB_DRIVER_LOGI("test end!\r\n"); + break; + } else { + USB_DRIVER_LOGI("70c_reg:0x%x\r\n", reg); + delay(10000); + } + } + REG_USB_PHY_00 &= ~0x08; + REG_USB_PHY_01 &= ~0x02; + REG_USB_USR_710 &= ~(0x1<< 8); +#endif + } else { + REG_USB_USR_710 |= (0x1 << 15); + REG_USB_USR_710 |= (0x1 << 14); + REG_USB_USR_710 |= (0x1 << 16); + REG_USB_USR_710 |= (0x1 << 17); + REG_USB_USR_710 |= (0x1 << 18); + REG_USB_USR_710 |= (0x1 << 19); + REG_USB_USR_710 &= ~(0x1 << 20); + REG_USB_USR_710 |= (0x1 << 21); + REG_USB_USR_710 |= (0x0 << 0); + REG_USB_USR_710 |= (0x1 << 5); + REG_USB_USR_710 |= (0x1 << 6); + REG_USB_USR_710 |= (0x1 << 9); + REG_USB_USR_710 |= (0x1 << 10); + REG_USB_USR_710 |= (0x1 << 7); + + REG_USB_USR_708 = 0x1; + } + } else { + sys_drv_usb_analog_phy_en(0, NULL); + sys_drv_usb_clock_ctrl(false, NULL); + } +} + +void usb_dc_low_level_init(void) +{ +#if CONFIG_SYS_CPU0 + bk_pm_module_vote_sleep_ctrl(PM_SLEEP_MODULE_NAME_USB_1, 0x0, 0x0); +#endif + bk_analog_layer_usb_sys_related_ops(1, true); + bk_gpio_set_output_high(CONFIG_USB_VBAT_CONTROL_GPIO_ID); + + bk_pm_module_vote_cpu_freq(PM_DEV_ID_USB_1, PM_CPU_FRQ_120M); + + sys_hal_usb_analog_phy_en(true); + + sys_drv_usb_clock_ctrl(true, NULL); + sys_drv_int_enable(USB_INTERRUPT_CTRL_BIT); + + bk_int_isr_register(INT_SRC_USB, USBD_IRQ, NULL); + bk_int_set_priority(INT_SRC_USB, 2); +} + +void usb_dc_low_level_deinit(void) +{ + bk_pm_module_vote_cpu_freq(PM_DEV_ID_USB_1, PM_CPU_FRQ_DEFAULT); + sys_hal_usb_analog_phy_en(false); + sys_drv_usb_clock_ctrl(false, NULL); + sys_drv_int_disable(USB_INTERRUPT_CTRL_BIT); + bk_int_isr_unregister(INT_SRC_USB); + bk_analog_layer_usb_sys_related_ops(1, false); + sys_drv_dev_clk_pwr_up(CLK_PWR_ID_USB_1, CLK_PWR_CTRL_PWR_DOWN); +} + +void usbd_musb_delay_ms(uint8_t ms) +{ + /* implement later */ +} + +extern void USBH_IRQHandler(uint8_t busid); + +void USBH_IRQ(void) +{ + USBH_IRQHandler(0); +} + +#define NANENG_PHY_CFG 1 +#define USB_PHY_BASE (SOC_USB_REG_BASE + 0x400) + +#define HWREG(x) \ + (*((volatile uint32_t *)(x))) +#define HWREGH(x) \ + (*((volatile uint16_t *)(x))) +#define HWREGB(x) \ + (*((volatile uint8_t *)(x))) + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ +#if CONFIG_SYS_CPU0 + bk_pm_module_vote_sleep_ctrl(PM_SLEEP_MODULE_NAME_USB_1, 0x0, 0x0); +#endif + bk_analog_layer_usb_sys_related_ops(0, true); + bk_gpio_set_output_high(CONFIG_USB_VBAT_CONTROL_GPIO_ID); + +#if NANENG_PHY_CFG + //NANENG_PHY_CFG_HSRX_TEST + HWREGB(USB_PHY_BASE + NANENG_PHY_FC_REG0F) |= (0x1 << 4); + //disconnect value 640mv + HWREGB(USB_PHY_BASE + NANENG_PHY_FC_REG0B) = 0x7C; +#endif + bk_int_isr_register(INT_SRC_USB, USBH_IRQ, NULL); + sys_drv_int_enable(USB_INTERRUPT_CTRL_BIT); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + sys_drv_int_disable(USB_INTERRUPT_CTRL_BIT); + bk_int_isr_unregister(INT_SRC_USB); + sys_drv_dev_clk_pwr_up(CLK_PWR_ID_USB_1, CLK_PWR_CTRL_PWR_DOWN); + bk_analog_layer_usb_sys_related_ops(0, false); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/musb/usb_glue_es.c b/src/lib/CherryUSB/port/musb/usb_glue_es.c new file mode 100644 index 000000000..2d4e50969 --- /dev/null +++ b/src/lib/CherryUSB/port/musb/usb_glue_es.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_config.h" +#include "stdint.h" +#include "usb_musb_reg.h" + +#if CONFIG_USB_MUSB_EP_NUM != 6 +#error es32 chips only support 6 endpoints +#endif + +#if CONFIG_USB_MUSB_PIPE_NUM != 6 +#error es32 chips only support 6 pipes +#endif + +// clang-format off +static struct musb_fifo_cfg musb_device_table[] = { +{ .ep_num = 0, .style = FIFO_TXRX, .maxpacket = 64, }, +{ .ep_num = 1, .style = FIFO_TXRX, .maxpacket = 1024, }, +{ .ep_num = 2, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 4, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 5, .style = FIFO_TXRX, .maxpacket = 512, }, +}; + +static struct musb_fifo_cfg musb_host_table[] = { +{ .ep_num = 0, .style = FIFO_TXRX, .maxpacket = 64, }, +{ .ep_num = 1, .style = FIFO_TXRX, .maxpacket = 1024, }, +{ .ep_num = 2, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 4, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 5, .style = FIFO_TXRX, .maxpacket = 512, }, +}; +// clang-format on + +uint8_t usbd_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = musb_device_table; + return sizeof(musb_device_table) / sizeof(musb_device_table[0]); +} + +uint8_t usbh_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = musb_host_table; + return sizeof(musb_host_table) / sizeof(musb_host_table[0]); +} + +uint32_t usb_get_musb_ram_size(void) +{ + return 4096; +} + +void usbd_musb_delay_ms(uint8_t ms) +{ + /* implement later */ +} diff --git a/src/lib/CherryUSB/port/musb/usb_glue_sifli.c b/src/lib/CherryUSB/port/musb/usb_glue_sifli.c new file mode 100644 index 000000000..106dc3a70 --- /dev/null +++ b/src/lib/CherryUSB/port/musb/usb_glue_sifli.c @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_musb_reg.h" + +#undef USB_POWER_SOFTCONN +#undef USB_DEVCTL_FSDEV +#undef USB_DEVCTL_LSDEV +#undef USB_DEVCTL_SESSION +#undef USB_POWER_HSENAB +#undef USB_POWER_HSMODE +#undef USB_POWER_RESET +#undef USB_POWER_RESUME + +#ifndef CONFIG_USB_MUSB_SIFLI +#error must define CONFIG_USB_MUSB_SIFLI when use sunxi chips +#endif + +#include "bf0_hal.h" + +uint8_t usbd_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = NULL; // No FIFO configuration for this implementation, readonly + return 0; +} + +uint8_t usbh_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = NULL; // No FIFO configuration for this implementation, readonly + return 0; +} + +uint32_t usb_get_musb_ram_size(void) +{ + return 0xFFFF; // No specific RAM size for this implementation +} + +void usbd_musb_delay_ms(uint8_t ms) +{ + /* implement later */ +} + +#ifdef PKG_CHERRYUSB_DEVICE +void usb_dc_low_level_init(uint8_t busid) +{ + HAL_RCC_EnableModule(RCC_MOD_USBC); + +#ifdef SOC_SF32LB58X + //hwp_usbc->utmicfg12 = hwp_usbc->utmicfg12 | 0x3; //set xo_clk_sel + hwp_usbc->ldo25 = hwp_usbc->ldo25 | 0xa; //set psw_en and ldo25_en + HAL_Delay(1); + hwp_usbc->swcntl3 = 0x1; //set utmi_en for USB2.0 + hwp_usbc->usbcfg = hwp_usbc->usbcfg | 0x40; //enable usb PLL. +#elif defined(SOC_SF32LB56X) || defined(SOC_SF32LB52X) + hwp_hpsys_cfg->USBCR |= HPSYS_CFG_USBCR_DM_PD | HPSYS_CFG_USBCR_DP_EN | HPSYS_CFG_USBCR_USB_EN; +#elif defined(SOC_SF32LB55X) + hwp_hpsys_cfg->USBCR |= HPSYS_CFG_USBCR_DM_PD | HPSYS_CFG_USBCR_USB_EN; +#endif +#ifndef SOC_SF32LB55X + hwp_usbc->usbcfg |= (USB_USBCFG_AVALID | USB_USBCFG_AVALID_DR); + hwp_usbc->dpbrxdisl = 0xFE; + hwp_usbc->dpbtxdisl = 0xFE; +#endif + NVIC_EnableIRQ(USBC_IRQn); + __HAL_SYSCFG_Enable_USB(); +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + NVIC_DisableIRQ(USBC_IRQn); +#ifdef SOC_SF32LB58X + hwp_usbc->usbcfg &= ~0x40; // Disable usb PLL. + hwp_usbc->swcntl3 = 0x0; + hwp_usbc->ldo25 &= ~0xa; // Disable psw_en and ldo25_en +#elif defined(SOC_SF32LB56X) || defined(SOC_SF32LB52X) + hwp_hpsys_cfg->USBCR &= ~(HPSYS_CFG_USBCR_DM_PD | HPSYS_CFG_USBCR_DP_EN | HPSYS_CFG_USBCR_USB_EN); +#elif defined(SOC_SF32LB55X) + hwp_hpsys_cfg->USBCR &= ~(HPSYS_CFG_USBCR_DM_PD | HPSYS_CFG_USBCR_USB_EN); +#endif + /* reset USB to make DP change to PULLDOWN state */ + hwp_hpsys_rcc->RSTR2 |= HPSYS_RCC_RSTR2_USBC; + HAL_Delay_us(100); + hwp_hpsys_rcc->RSTR2 &= ~HPSYS_RCC_RSTR2_USBC; + HAL_RCC_DisableModule(RCC_MOD_USBC); +} +#endif + +#ifdef PKG_CHERRYUSB_HOST +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + HAL_RCC_EnableModule(RCC_MOD_USBC); + +#ifdef SOC_SF32LB58X + //hwp_usbc->utmicfg12 = hwp_usbc->utmicfg12 | 0x3; //set xo_clk_sel + hwp_usbc->ldo25 = hwp_usbc->ldo25 | 0xa; //set psw_en and ldo25_en + HAL_Delay(1); + hwp_usbc->swcntl3 = 0x1; //set utmi_en for USB2.0 + hwp_usbc->usbcfg = hwp_usbc->usbcfg | 0x40; //enable usb PLL. +#elif defined(SOC_SF32LB56X) || defined(SOC_SF32LB52X) + hwp_hpsys_cfg->USBCR |= HPSYS_CFG_USBCR_DM_PD | HPSYS_CFG_USBCR_DP_EN | HPSYS_CFG_USBCR_USB_EN; +#elif defined(SOC_SF32LB55X) + hwp_hpsys_cfg->USBCR |= HPSYS_CFG_USBCR_DM_PD | HPSYS_CFG_USBCR_USB_EN; +#endif +#ifndef SOC_SF32LB55X + hwp_usbc->usbcfg |= (USB_USBCFG_AVALID | USB_USBCFG_AVALID_DR); + hwp_usbc->dpbrxdisl = 0xFE; + hwp_usbc->dpbtxdisl = 0xFE; +#endif + __HAL_SYSCFG_Enable_USB(); + hwp_usbc->usbcfg &= 0xEF; + hwp_usbc->dbgl = 0x80; + + NVIC_EnableIRQ(USBC_IRQn); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + NVIC_DisableIRQ(USBC_IRQn); +#ifdef SOC_SF32LB58X + hwp_usbc->usbcfg &= ~0x40; // Disable usb PLL. + hwp_usbc->swcntl3 = 0x0; + hwp_usbc->ldo25 &= ~0xa; // Disable psw_en and ldo25_en +#elif defined(SOC_SF32LB56X) || defined(SOC_SF32LB52X) + hwp_hpsys_cfg->USBCR &= ~(HPSYS_CFG_USBCR_DM_PD | HPSYS_CFG_USBCR_DP_EN | HPSYS_CFG_USBCR_USB_EN); +#elif defined(SOC_SF32LB55X) + hwp_hpsys_cfg->USBCR &= ~(HPSYS_CFG_USBCR_DM_PD | HPSYS_CFG_USBCR_USB_EN); +#endif + /* reset USB to make DP change to PULLDOWN state */ + hwp_hpsys_rcc->RSTR2 |= HPSYS_RCC_RSTR2_USBC; + HAL_Delay_us(100); + hwp_hpsys_rcc->RSTR2 &= ~HPSYS_RCC_RSTR2_USBC; + HAL_RCC_DisableModule(RCC_MOD_USBC); +} + +void musb_reset_prev(void) +{ +#if defined(SF32LB58X) + hwp_usbc->rsvd0 = 0xc; //58 +#endif +} + +void musb_reset_post(void) +{ +#if defined(SF32LB58X) + hwp_usbc->rsvd0 = 0x0; //58 +#endif +} +#endif + +void USBC_IRQHandler(void) +{ +#ifdef PKG_CHERRYUSB_DEVICE + USBD_IRQHandler(0); +#endif +#ifdef PKG_CHERRYUSB_HOST + USBH_IRQHandler(0); +#endif +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/musb/usb_glue_sunxi.c b/src/lib/CherryUSB/port/musb/usb_glue_sunxi.c new file mode 100644 index 000000000..6a12bab60 --- /dev/null +++ b/src/lib/CherryUSB/port/musb/usb_glue_sunxi.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_config.h" +#include "stdint.h" +#include "usb_musb_reg.h" + +#ifndef CONFIG_USB_MUSB_SUNXI +#error must define CONFIG_USB_MUSB_SUNXI when use sunxi chips +#endif + +#if CONFIG_USB_MUSB_EP_NUM != 4 +#error sunxi chips only support 4 endpoints +#endif + +#if CONFIG_USB_MUSB_PIPE_NUM != 4 +#error sunxi chips only support 4 pipes +#endif + +// clang-format off +static struct musb_fifo_cfg musb_device_table[] = { +{ .ep_num = 0, .style = FIFO_TXRX, .maxpacket = 64, }, +{ .ep_num = 1, .style = FIFO_TX, .maxpacket = 1024, }, +{ .ep_num = 1, .style = FIFO_RX, .maxpacket = 1024, }, +{ .ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 2, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_RX, .maxpacket = 512, }, +}; + +static struct musb_fifo_cfg musb_host_table[] = { +{ .ep_num = 0, .style = FIFO_TXRX, .maxpacket = 64, }, +{ .ep_num = 1, .style = FIFO_TX, .maxpacket = 1024, }, +{ .ep_num = 1, .style = FIFO_RX, .maxpacket = 1024, }, +{ .ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 2, .style = FIFO_RX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_TX, .maxpacket = 512, }, +{ .ep_num = 3, .style = FIFO_RX, .maxpacket = 512, }, +}; +// clang-format on + +uint8_t usbd_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = musb_device_table; + return sizeof(musb_device_table) / sizeof(musb_device_table[0]); +} + +uint8_t usbh_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = musb_host_table; + return sizeof(musb_host_table) / sizeof(musb_host_table[0]); +} + +uint32_t usb_get_musb_ram_size(void) +{ + return 8192; +} + +void usbd_musb_delay_ms(uint8_t ms) +{ + /* implement later */ +} diff --git a/src/lib/CherryUSB/port/musb/usb_hc_musb.c b/src/lib/CherryUSB/port/musb/usb_hc_musb.c new file mode 100644 index 000000000..3b73903a7 --- /dev/null +++ b/src/lib/CherryUSB/port/musb/usb_hc_musb.c @@ -0,0 +1,1175 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_hub.h" +#include "usb_musb_reg.h" + +#define HWREG(x) \ + (*((volatile uint32_t *)(x))) +#define HWREGH(x) \ + (*((volatile uint16_t *)(x))) +#define HWREGB(x) \ + (*((volatile uint8_t *)(x))) + +#define USB_BASE (bus->hcd.reg_base) + +#if defined(CONFIG_USB_MUSB_SUNXI) +#define MUSB_FADDR_OFFSET 0x98 +#define MUSB_POWER_OFFSET 0x40 +#define MUSB_TXIS_OFFSET 0x44 +#define MUSB_RXIS_OFFSET 0x46 +#define MUSB_TXIE_OFFSET 0x48 +#define MUSB_RXIE_OFFSET 0x4A +#define MUSB_IS_OFFSET 0x4C +#define MUSB_IE_OFFSET 0x50 +#define MUSB_EPIDX_OFFSET 0x42 + +#define MUSB_IND_TXMAP_OFFSET 0x80 +#define MUSB_IND_TXCSRL_OFFSET 0x82 +#define MUSB_IND_TXCSRH_OFFSET 0x83 +#define MUSB_IND_RXMAP_OFFSET 0x84 +#define MUSB_IND_RXCSRL_OFFSET 0x86 +#define MUSB_IND_RXCSRH_OFFSET 0x87 +#define MUSB_IND_RXCOUNT_OFFSET 0x88 +#define MUSB_IND_TXTYPE_OFFSET 0x8C +#define MUSB_IND_TXINTERVAL_OFFSET 0x8D +#define MUSB_IND_RXTYPE_OFFSET 0x8E +#define MUSB_IND_RXINTERVAL_OFFSET 0x8F + +#define MUSB_FIFO_OFFSET 0x00 + +#define MUSB_DEVCTL_OFFSET 0x41 + +#define MUSB_TXFIFOSZ_OFFSET 0x90 +#define MUSB_RXFIFOSZ_OFFSET 0x94 +#define MUSB_TXFIFOADD_OFFSET 0x92 +#define MUSB_RXFIFOADD_OFFSET 0x96 + +#define MUSB_TXFUNCADDR0_OFFSET 0x98 +#define MUSB_TXHUBADDR0_OFFSET 0x9A +#define MUSB_TXHUBPORT0_OFFSET 0x9B +#define MUSB_TXFUNCADDRx_OFFSET 0x98 +#define MUSB_TXHUBADDRx_OFFSET 0x9A +#define MUSB_TXHUBPORTx_OFFSET 0x9B +#define MUSB_RXFUNCADDRx_OFFSET 0x9C +#define MUSB_RXHUBADDRx_OFFSET 0x9E +#define MUSB_RXHUBPORTx_OFFSET 0x9F + +#define USB_TXMAP_BASE(ep_idx) (USB_BASE + MUSB_IND_TXMAP_OFFSET) +#define USB_TXCSRL_BASE(ep_idx) (USB_BASE + MUSB_IND_TXCSRL_OFFSET) +#define USB_TXCSRH_BASE(ep_idx) (USB_BASE + MUSB_IND_TXCSRH_OFFSET) +#define USB_RXMAP_BASE(ep_idx) (USB_BASE + MUSB_IND_RXMAP_OFFSET) +#define USB_RXCSRL_BASE(ep_idx) (USB_BASE + MUSB_IND_RXCSRL_OFFSET) +#define USB_RXCSRH_BASE(ep_idx) (USB_BASE + MUSB_IND_RXCSRH_OFFSET) +#define USB_RXCOUNT_BASE(ep_idx) (USB_BASE + MUSB_IND_RXCOUNT_OFFSET) +#define USB_TXTYPE_BASE(ep_idx) (USB_BASE + MUSB_IND_TXTYPE_OFFSET) +#define USB_TXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_IND_TXINTERVAL_OFFSET) +#define USB_RXTYPE_BASE(ep_idx) (USB_BASE + MUSB_IND_RXTYPE_OFFSET) +#define USB_RXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_IND_RXINTERVAL_OFFSET) + +#define USB_TXADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDRx_OFFSET) +#define USB_TXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXHUBADDRx_OFFSET) +#define USB_TXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXHUBPORTx_OFFSET) +#define USB_RXADDR_BASE(ep_idx) (USB_BASE + MUSB_RXFUNCADDRx_OFFSET) +#define USB_RXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_RXHUBADDRx_OFFSET) +#define USB_RXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_RXHUBPORTx_OFFSET) + +#elif defined(CONFIG_USB_MUSB_CUSTOM) +#include "musb_custom.h" +#else +#define MUSB_FADDR_OFFSET 0x00 +#define MUSB_POWER_OFFSET 0x01 +#define MUSB_TXIS_OFFSET 0x02 +#define MUSB_RXIS_OFFSET 0x04 +#define MUSB_TXIE_OFFSET 0x06 +#define MUSB_RXIE_OFFSET 0x08 +#define MUSB_IS_OFFSET 0x0A +#define MUSB_IE_OFFSET 0x0B + +#define MUSB_EPIDX_OFFSET 0x0E + +#define MUSB_IND_TXMAP_OFFSET 0x10 +#define MUSB_IND_TXCSRL_OFFSET 0x12 +#define MUSB_IND_TXCSRH_OFFSET 0x13 +#define MUSB_IND_RXMAP_OFFSET 0x14 +#define MUSB_IND_RXCSRL_OFFSET 0x16 +#define MUSB_IND_RXCSRH_OFFSET 0x17 +#define MUSB_IND_RXCOUNT_OFFSET 0x18 +#define MUSB_IND_TXTYPE_OFFSET 0x1A +#define MUSB_IND_TXINTERVAL_OFFSET 0x1B +#define MUSB_IND_RXTYPE_OFFSET 0x1C +#define MUSB_IND_RXINTERVAL_OFFSET 0x1D + +#define MUSB_FIFO_OFFSET 0x20 + +#define MUSB_DEVCTL_OFFSET 0x60 + +#define MUSB_TXFIFOSZ_OFFSET 0x62 +#define MUSB_RXFIFOSZ_OFFSET 0x63 +#define MUSB_TXFIFOADD_OFFSET 0x64 +#define MUSB_RXFIFOADD_OFFSET 0x66 + +#define MUSB_TXFUNCADDR0_OFFSET 0x80 +#define MUSB_TXHUBADDR0_OFFSET 0x82 +#define MUSB_TXHUBPORT0_OFFSET 0x83 +#define MUSB_TXFUNCADDRx_OFFSET 0x88 +#define MUSB_TXHUBADDRx_OFFSET 0x8A +#define MUSB_TXHUBPORTx_OFFSET 0x8B +#define MUSB_RXFUNCADDRx_OFFSET 0x8C +#define MUSB_RXHUBADDRx_OFFSET 0x8E +#define MUSB_RXHUBPORTx_OFFSET 0x8F + +#define MUSB_TXMAP0_OFFSET 0x100 + +// do not use EPIDX +#define USB_TXMAP_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx) +#define USB_TXCSRL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 2) +#define USB_TXCSRH_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 3) +#define USB_RXMAP_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 4) +#define USB_RXCSRL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 6) +#define USB_RXCSRH_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 7) +#define USB_RXCOUNT_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 8) +#define USB_TXTYPE_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0A) +#define USB_TXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0B) +#define USB_RXTYPE_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0C) +#define USB_RXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0D) + +#define USB_TXADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx) +#define USB_TXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 2) +#define USB_TXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 3) +#define USB_RXADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 4) +#define USB_RXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 6) +#define USB_RXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 7) +#endif + +#define USB_FIFO_BASE(ep_idx) (USB_BASE + MUSB_FIFO_OFFSET + 0x4 * ep_idx) + +typedef enum { + USB_EP0_STATE_SETUP = 0x0, /**< SETUP DATA */ + USB_EP0_STATE_IN_DATA, /**< IN DATA */ + USB_EP0_STATE_IN_STATUS, /**< IN status*/ + USB_EP0_STATE_OUT_DATA, /**< OUT DATA */ + USB_EP0_STATE_OUT_STATUS, /**< OUT status */ +} ep0_state_t; + +struct musb_pipe { + uint8_t chidx; + bool inuse; + uint32_t xfrd; + volatile uint8_t ep0_state; + usb_osal_sem_t waitsem; + struct usbh_urb *urb; +}; + +struct musb_hcd { + volatile bool port_csc; + volatile bool port_pec; + volatile bool port_pe; + struct musb_pipe pipe_pool[CONFIG_USB_MUSB_PIPE_NUM]; +} g_musb_hcd[CONFIG_USBHOST_MAX_BUS]; + +/* get current active ep */ +static uint8_t musb_get_active_ep(struct usbh_bus *bus) +{ + return HWREGB(USB_BASE + MUSB_EPIDX_OFFSET); +} + +/* set the active ep */ +static void musb_set_active_ep(struct usbh_bus *bus, uint8_t ep_index) +{ + HWREGB(USB_BASE + MUSB_EPIDX_OFFSET) = ep_index; +} + +static void musb_fifo_flush(struct usbh_bus *bus, uint8_t ep) +{ + uint8_t ep_idx = ep & 0x7f; + if (ep_idx == 0) { + if ((HWREGB(USB_TXCSRL_BASE(ep_idx)) & (USB_CSRL0_RXRDY | USB_CSRL0_TXRDY)) != 0) + HWREGB(USB_RXCSRL_BASE(ep_idx)) |= USB_CSRH0_FLUSH; + } else { + if (ep & 0x80) { + if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_TXRDY) + HWREGB(USB_TXCSRL_BASE(ep_idx)) |= USB_TXCSRL1_FLUSH; + } else { + if (HWREGB(USB_RXCSRL_BASE(ep_idx)) & USB_RXCSRL1_RXRDY) + HWREGB(USB_RXCSRL_BASE(ep_idx)) |= USB_RXCSRL1_FLUSH; + } + } +} + +static void musb_write_packet(struct usbh_bus *bus, uint8_t ep_idx, uint8_t *buffer, uint16_t len) +{ + uint32_t *buf32; + uint8_t *buf8; + uint32_t count32; + uint32_t count8; + int i; + + if ((uint32_t)buffer & 0x03) { + buf8 = buffer; + for (i = 0; i < len; i++) { + HWREGB(USB_FIFO_BASE(ep_idx)) = *buf8++; + } + } else { + count32 = len >> 2; + count8 = len & 0x03; + + buf32 = (uint32_t *)buffer; + + while (count32--) { + HWREG(USB_FIFO_BASE(ep_idx)) = *buf32++; + } + + buf8 = (uint8_t *)buf32; + + while (count8--) { + HWREGB(USB_FIFO_BASE(ep_idx)) = *buf8++; + } + } +} + +static void musb_read_packet(struct usbh_bus *bus, uint8_t ep_idx, uint8_t *buffer, uint16_t len) +{ + uint32_t *buf32; + uint8_t *buf8; + uint32_t count32; + uint32_t count8; + int i; + + if ((uint32_t)buffer & 0x03) { + buf8 = buffer; + for (i = 0; i < len; i++) { + *buf8++ = HWREGB(USB_FIFO_BASE(ep_idx)); + } + } else { + count32 = len >> 2; + count8 = len & 0x03; + + buf32 = (uint32_t *)buffer; + + while (count32--) { + *buf32++ = HWREG(USB_FIFO_BASE(ep_idx)); + } + + buf8 = (uint8_t *)buf32; + + while (count8--) { + *buf8++ = HWREGB(USB_FIFO_BASE(ep_idx)); + } + } +} + +static uint32_t musb_get_fifo_size(uint16_t mps, uint16_t *used) +{ + uint32_t size; + + for (uint8_t i = USB_TXFIFOSZ_SIZE_8; i <= USB_TXFIFOSZ_SIZE_2048; i++) { + size = (8 << i); + if (mps <= size) { + *used = size; + return i; + } + } + + *used = 0; + return USB_TXFIFOSZ_SIZE_8; +} + +static uint32_t usbh_musb_fifo_config(struct usbh_bus *bus, struct musb_fifo_cfg *cfg, uint32_t offset) +{ + uint16_t fifo_used; + uint8_t c_size; + uint16_t c_off; + + c_off = offset >> 3; + c_size = musb_get_fifo_size(cfg->maxpacket, &fifo_used); + + musb_set_active_ep(bus, cfg->ep_num); + + switch (cfg->style) { + case FIFO_TX: + HWREGB(USB_BASE + MUSB_TXFIFOSZ_OFFSET) = c_size & 0x0f; + HWREGH(USB_BASE + MUSB_TXFIFOADD_OFFSET) = c_off; + break; + case FIFO_RX: + HWREGB(USB_BASE + MUSB_RXFIFOSZ_OFFSET) = c_size & 0x0f; + HWREGH(USB_BASE + MUSB_RXFIFOADD_OFFSET) = c_off; + break; + case FIFO_TXRX: + HWREGB(USB_BASE + MUSB_TXFIFOSZ_OFFSET) = c_size & 0x0f; + HWREGH(USB_BASE + MUSB_TXFIFOADD_OFFSET) = c_off; + HWREGB(USB_BASE + MUSB_RXFIFOSZ_OFFSET) = c_size & 0x0f; + HWREGH(USB_BASE + MUSB_RXFIFOADD_OFFSET) = c_off; + break; + + default: + break; + } + + return (offset + fifo_used); +} + +void musb_control_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) +{ + uint8_t old_ep_index; + uint8_t speed = USB_TXTYPE1_SPEED_FULL; + + old_ep_index = musb_get_active_ep(bus); + musb_set_active_ep(bus, chidx); + + if (urb->hport->speed == USB_SPEED_HIGH) { + speed = USB_TYPE0_SPEED_HIGH; + } else if (urb->hport->speed == USB_SPEED_FULL) { + speed = USB_TYPE0_SPEED_FULL; + } else if (urb->hport->speed == USB_SPEED_LOW) { + speed = USB_TYPE0_SPEED_LOW; + } + +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + /* Without multipoint, use FADDR for host target addressing and do not access Hub/FuncAddr regs */ + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_TXTYPE_BASE(chidx)) = speed; +#else + HWREGB(USB_TXADDR_BASE(chidx)) = urb->hport->dev_addr; + HWREGB(USB_TXTYPE_BASE(chidx)) = speed; + HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0; + HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0; +#endif + + musb_write_packet(bus, chidx, (uint8_t *)setup, 8); + HWREGB(USB_TXCSRL_BASE(chidx)) = USB_CSRL0_TXRDY | USB_CSRL0_SETUP; + musb_set_active_ep(bus, old_ep_index); +} + +int musb_bulk_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +{ + uint8_t old_ep_index; + uint8_t speed = USB_TXTYPE1_SPEED_FULL; + + old_ep_index = musb_get_active_ep(bus); + musb_set_active_ep(bus, chidx); + + if (urb->hport->speed == USB_SPEED_HIGH) { + speed = USB_TXTYPE1_SPEED_HIGH; + } else if (urb->hport->speed == USB_SPEED_FULL) { + speed = USB_TXTYPE1_SPEED_FULL; + } else if (urb->hport->speed == USB_SPEED_LOW) { + speed = USB_TXTYPE1_SPEED_LOW; + } + + if (urb->ep->bEndpointAddress & 0x80) { + if ((8 << HWREGB(USB_BASE + MUSB_RXFIFOSZ_OFFSET)) < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + USB_LOG_ERR("Ep %02x fifo is overflow\r\n", urb->ep->bEndpointAddress); + return -USB_ERR_RANGE; + } + +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK; + HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_RXINTERVAL_BASE(chidx)) = 0; +#else + HWREGB(USB_RXADDR_BASE(chidx)) = urb->hport->dev_addr; + HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK; + HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_RXINTERVAL_BASE(chidx)) = 0; + HWREGB(USB_RXHUBADDR_BASE(chidx)) = 0; + HWREGB(USB_RXHUBPORT_BASE(chidx)) = 0; +#endif + HWREGB(USB_TXCSRH_BASE(chidx)) &= ~USB_TXCSRH1_MODE; + HWREGB(USB_RXCSRL_BASE(chidx)) = USB_RXCSRL1_REQPKT; + + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) |= (1 << chidx); + } else { + if ((8 << HWREGB(USB_BASE + MUSB_TXFIFOSZ_OFFSET)) < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + USB_LOG_ERR("Ep %02x fifo is overflow\r\n", urb->ep->bEndpointAddress); + return -USB_ERR_RANGE; + } + +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK; + HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_TXINTERVAL_BASE(chidx)) = 0; +#else + HWREGB(USB_TXADDR_BASE(chidx)) = urb->hport->dev_addr; + HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK; + HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_TXINTERVAL_BASE(chidx)) = 0; + HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0; + HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0; +#endif + + if (buflen > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + buflen = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + } + + musb_write_packet(bus, chidx, buffer, buflen); + HWREGB(USB_TXCSRH_BASE(chidx)) |= USB_TXCSRH1_MODE; + HWREGB(USB_TXCSRL_BASE(chidx)) = USB_TXCSRL1_TXRDY; + + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) |= (1 << chidx); + } + musb_set_active_ep(bus, old_ep_index); + return 0; +} + +int musb_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +{ + uint8_t old_ep_index; + uint8_t speed = USB_TXTYPE1_SPEED_FULL; + + old_ep_index = musb_get_active_ep(bus); + musb_set_active_ep(bus, chidx); + + if (urb->hport->speed == USB_SPEED_HIGH) { + speed = USB_TXTYPE1_SPEED_HIGH; + } else if (urb->hport->speed == USB_SPEED_FULL) { + speed = USB_TXTYPE1_SPEED_FULL; + } else if (urb->hport->speed == USB_SPEED_LOW) { + speed = USB_TXTYPE1_SPEED_LOW; + } + + if (urb->ep->bEndpointAddress & 0x80) { + if ((8 << HWREGB(USB_BASE + MUSB_RXFIFOSZ_OFFSET)) < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + USB_LOG_ERR("Ep %02x fifo is overflow\r\n", urb->ep->bEndpointAddress); + return -USB_ERR_RANGE; + } + +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT; + HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_RXINTERVAL_BASE(chidx)) = urb->ep->bInterval; +#else + HWREGB(USB_RXADDR_BASE(chidx)) = urb->hport->dev_addr; + HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT; + HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_RXINTERVAL_BASE(chidx)) = urb->ep->bInterval; + HWREGB(USB_RXHUBADDR_BASE(chidx)) = 0; + HWREGB(USB_RXHUBPORT_BASE(chidx)) = 0; +#endif + HWREGB(USB_TXCSRH_BASE(chidx)) &= ~USB_TXCSRH1_MODE; + HWREGB(USB_RXCSRL_BASE(chidx)) = USB_RXCSRL1_REQPKT; + + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) |= (1 << chidx); + } else { + if ((8 << HWREGB(USB_BASE + MUSB_TXFIFOSZ_OFFSET)) < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + USB_LOG_ERR("Ep %02x fifo is overflow\r\n", urb->ep->bEndpointAddress); + return -USB_ERR_RANGE; + } + +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT; + HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_TXINTERVAL_BASE(chidx)) = urb->ep->bInterval; +#else + HWREGB(USB_TXADDR_BASE(chidx)) = urb->hport->dev_addr; + HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT; + HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_TXINTERVAL_BASE(chidx)) = urb->ep->bInterval; + HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0; + HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0; +#endif + + if (buflen > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + buflen = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + } + + musb_write_packet(bus, chidx, buffer, buflen); + HWREGB(USB_TXCSRH_BASE(chidx)) |= USB_TXCSRH1_MODE; + HWREGB(USB_TXCSRL_BASE(chidx)) = USB_TXCSRL1_TXRDY; + + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) |= (1 << chidx); + } + musb_set_active_ep(bus, old_ep_index); + return 0; +} + +static int usbh_reset_port(struct usbh_bus *bus, const uint8_t port) +{ + g_musb_hcd[bus->hcd.hcd_id].port_pe = 0; + HWREGB(USB_BASE + MUSB_POWER_OFFSET) |= USB_POWER_RESET; + +#ifdef CONFIG_USB_MUSB_SIFLI + extern void musb_reset_prev(void); + musb_reset_prev(); +#endif + usb_osal_msleep(20); + HWREGB(USB_BASE + MUSB_POWER_OFFSET) &= ~(USB_POWER_RESET); + usb_osal_msleep(20); +#ifdef CONFIG_USB_MUSB_SIFLI + extern void musb_reset_post(void); + musb_reset_post(); +#endif + g_musb_hcd[bus->hcd.hcd_id].port_pe = 1; + return 0; +} + +static uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + uint8_t speed = USB_SPEED_UNKNOWN; + + if (HWREGB(USB_BASE + MUSB_POWER_OFFSET) & USB_POWER_HSMODE) + speed = USB_SPEED_HIGH; + else if (HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) & USB_DEVCTL_FSDEV) + speed = USB_SPEED_FULL; + else if (HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) & USB_DEVCTL_LSDEV) + speed = USB_SPEED_LOW; + + return speed; +} + +static int musb_pipe_alloc(void) +{ + int chidx; + uintptr_t flags; + + flags = usb_osal_enter_critical_section(); + for (chidx = 1; chidx < CONFIG_USB_MUSB_PIPE_NUM; chidx++) { + if (!g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse) { + g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse = true; + usb_osal_leave_critical_section(flags); + return chidx; + } + } + usb_osal_leave_critical_section(flags); + + return -1; +} + +static void musb_pipe_free(struct musb_pipe *pipe) +{ + uintptr_t flags; + + flags = usb_osal_enter_critical_section(); + if (pipe->urb) { + pipe->urb->hcpriv = NULL; + pipe->urb = NULL; + } + + pipe->inuse = false; + usb_osal_leave_critical_section(flags); +} + +__WEAK void usb_hc_low_level_init(struct usbh_bus *bus) +{ + (void)bus; +} + +__WEAK void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + (void)bus; +} + +int usb_hc_init(struct usbh_bus *bus) +{ + uint8_t regval; + uint16_t offset = 0; + uint8_t cfg_num; + struct musb_fifo_cfg *cfg; + + usb_hc_low_level_init(bus); + + memset(&g_musb_hcd[bus->hcd.hcd_id], 0, sizeof(struct musb_hcd)); + + for (uint8_t i = 0; i < CONFIG_USB_MUSB_PIPE_NUM; i++) { + g_musb_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem = usb_osal_sem_create(0); + } + + cfg_num = usbh_get_musb_fifo_cfg(&cfg); + + for (uint8_t i = 0; i < cfg_num; i++) { + offset = usbh_musb_fifo_config(bus, &cfg[i], offset); + } + + USB_ASSERT_MSG(offset <= usb_get_musb_ram_size(), "Your fifo config is overflow, please check"); + + /* Enable USB interrupts */ + regval = USB_IE_RESET | USB_IE_CONN | USB_IE_DISCON | + USB_IE_RESUME | USB_IE_SUSPND | + USB_IE_BABBLE | USB_IE_SESREQ | USB_IE_VBUSERR; + + HWREGB(USB_BASE + MUSB_IE_OFFSET) = regval; + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) = USB_TXIE_EP0; + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) = 0; + + HWREGB(USB_BASE + MUSB_POWER_OFFSET) |= USB_POWER_HSENAB; + + HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) |= USB_DEVCTL_SESSION; + +#ifdef CONFIG_USB_MUSB_SUNXI + musb_set_active_ep(bus, 0); + HWREGB(USB_TXCSRL_BASE(0)) = USB_CSRL0_TXRDY; +#endif + return 0; +} + +int usb_hc_deinit(struct usbh_bus *bus) +{ + HWREGB(USB_BASE + MUSB_IE_OFFSET) = 0; + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) = 0; + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) = 0; + + HWREGB(USB_BASE + MUSB_POWER_OFFSET) &= ~USB_POWER_HSENAB; + HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) &= ~USB_DEVCTL_SESSION; + + for (uint8_t i = 0; i < CONFIG_USB_MUSB_PIPE_NUM; i++) { + usb_osal_sem_delete(g_musb_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem); + } + + usb_hc_low_level_deinit(bus); + return 0; +} + +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) +{ + uint8_t nports; + uint8_t port; + uint32_t status; + + nports = CONFIG_USBHOST_MAX_RHPORTS; + port = setup->wIndex; + if (setup->bmRequestType & USB_REQUEST_RECIPIENT_DEVICE) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_INVAL; + } + break; + case HUB_REQUEST_SET_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_INVAL; + } + break; + case HUB_REQUEST_GET_DESCRIPTOR: + break; + case HUB_REQUEST_GET_STATUS: + memset(buf, 0, 4); + break; + default: + break; + } + } else if (setup->bmRequestType & USB_REQUEST_RECIPIENT_OTHER) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_ENABLE: + break; + case HUB_PORT_FEATURE_SUSPEND: + case HUB_PORT_FEATURE_C_SUSPEND: + break; + case HUB_PORT_FEATURE_POWER: + break; + case HUB_PORT_FEATURE_C_CONNECTION: + g_musb_hcd[bus->hcd.hcd_id].port_csc = 0; + break; + case HUB_PORT_FEATURE_C_ENABLE: + g_musb_hcd[bus->hcd.hcd_id].port_pec = 0; + break; + case HUB_PORT_FEATURE_C_OVER_CURREN: + break; + case HUB_PORT_FEATURE_C_RESET: + break; + default: + return -USB_ERR_INVAL; + } + break; + case HUB_REQUEST_SET_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_SUSPEND: + break; + case HUB_PORT_FEATURE_POWER: + break; + case HUB_PORT_FEATURE_RESET: + usbh_reset_port(bus, port); + break; + + default: + return -USB_ERR_INVAL; + } + break; + case HUB_REQUEST_GET_STATUS: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + status = 0; + if (g_musb_hcd[bus->hcd.hcd_id].port_csc) { + status |= (1 << HUB_PORT_FEATURE_C_CONNECTION); + } + if (g_musb_hcd[bus->hcd.hcd_id].port_pec) { + status |= (1 << HUB_PORT_FEATURE_C_ENABLE); + } + + if (g_musb_hcd[bus->hcd.hcd_id].port_pe) { + status |= (1 << HUB_PORT_FEATURE_CONNECTION); + status |= (1 << HUB_PORT_FEATURE_ENABLE); + if (usbh_get_port_speed(bus, port) == USB_SPEED_LOW) { + status |= (1 << HUB_PORT_FEATURE_LOWSPEED); + } else if (usbh_get_port_speed(bus, port) == USB_SPEED_HIGH) { + status |= (1 << HUB_PORT_FEATURE_HIGHSPEED); + } + } + + status |= (1 << HUB_PORT_FEATURE_POWER); + memcpy(buf, &status, 4); + break; + default: + break; + } + } + return 0; +} + +int usbh_submit_urb(struct usbh_urb *urb) +{ + struct musb_pipe *pipe; + struct usbh_bus *bus; + int chidx; + size_t flags; + int ret = 0; + + if (!urb || !urb->hport || !urb->ep || !urb->hport->bus) { + return -USB_ERR_INVAL; + } + + if (!urb->hport->connected) { + return -USB_ERR_NOTCONN; + } + + if (urb->errorcode == -USB_ERR_BUSY) { + return -USB_ERR_BUSY; + } + + bus = urb->hport->bus; + + if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) { + chidx = 0; + } else { + chidx = musb_pipe_alloc(); + if (chidx == -1) { + return -USB_ERR_NOMEM; + } + } + + flags = usb_osal_enter_critical_section(); + + pipe = &g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx]; + pipe->chidx = chidx; + pipe->urb = urb; + + urb->hcpriv = pipe; + urb->errorcode = -USB_ERR_BUSY; + urb->actual_length = 0; + + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + pipe->ep0_state = USB_EP0_STATE_SETUP; + musb_control_urb_init(bus, 0, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + break; + case USB_ENDPOINT_TYPE_BULK: + ret = musb_bulk_urb_init(bus, chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); + if (ret < 0) { + usb_osal_leave_critical_section(flags); + return ret; + } + break; + case USB_ENDPOINT_TYPE_INTERRUPT: + ret = musb_intr_urb_init(bus, chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); + if (ret < 0) { + usb_osal_leave_critical_section(flags); + return ret; + } + break; + case USB_ENDPOINT_TYPE_ISOCHRONOUS: + return -USB_ERR_NOTSUPP; + default: + break; + } + usb_osal_leave_critical_section(flags); + + if (urb->timeout > 0) { + /* wait until timeout or sem give */ + ret = usb_osal_sem_take(pipe->waitsem, urb->timeout); + if (ret < 0) { + goto errout_timeout; + } + urb->timeout = 0; + ret = urb->errorcode; + /* we can free pipe when waitsem is done */ + musb_pipe_free(pipe); + } + return ret; +errout_timeout: + urb->timeout = 0; + usbh_kill_urb(urb); + return ret; +} + +int usbh_kill_urb(struct usbh_urb *urb) +{ + struct musb_pipe *pipe; + struct usbh_bus *bus; + size_t flags; + + if (!urb || !urb->hcpriv || !urb->hport->bus) { + return -USB_ERR_INVAL; + } + + bus = urb->hport->bus; + + ARG_UNUSED(bus); + + flags = usb_osal_enter_critical_section(); + + pipe = (struct musb_pipe *)urb->hcpriv; + urb->errorcode = -USB_ERR_SHUTDOWN; + + if (urb->ep->bEndpointAddress & 0x80) { + HWREGH(USB_BASE + MUSB_RXIE_OFFSET) &= ~(1 << (urb->ep->bEndpointAddress & 0x0f)); + HWREGH(USB_BASE + MUSB_RXIS_OFFSET) = (1 << (urb->ep->bEndpointAddress & 0x0f)); + } else { + HWREGH(USB_BASE + MUSB_TXIE_OFFSET) &= ~(1 << (urb->ep->bEndpointAddress & 0x0f)); + HWREGH(USB_BASE + MUSB_TXIS_OFFSET) = (1 << (urb->ep->bEndpointAddress & 0x0f)); + } + + musb_fifo_flush(bus, urb->ep->bEndpointAddress); + + if (urb->timeout) { + usb_osal_sem_give(pipe->waitsem); + } else { + musb_pipe_free(pipe); + } + + if (urb->complete) { + urb->complete(urb->arg, urb->errorcode); + } + + usb_osal_leave_critical_section(flags); + return 0; +} + +static void musb_urb_waitup(struct usbh_urb *urb) +{ + struct musb_pipe *pipe; + + pipe = (struct musb_pipe *)urb->hcpriv; + + if (urb->timeout) { + usb_osal_sem_give(pipe->waitsem); + } else { + musb_pipe_free(pipe); + } + + if (urb->complete) { + if (urb->errorcode < 0) { + urb->complete(urb->arg, urb->errorcode); + } else { + urb->complete(urb->arg, urb->actual_length); + } + } +} + +void handle_ep0(struct usbh_bus *bus) +{ + uint8_t ep_idx = 0; + uint8_t ep0_status; + struct musb_pipe *pipe; + struct usbh_urb *urb; + uint32_t size; + + pipe = (struct musb_pipe *)&g_musb_hcd[bus->hcd.hcd_id].pipe_pool[0]; + urb = pipe->urb; + if (urb == NULL) { + return; + } + + musb_set_active_ep(bus, 0); + ep0_status = HWREGB(USB_TXCSRL_BASE(ep_idx)); + if (ep0_status & USB_CSRL0_STALLED) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALLED; + pipe->ep0_state = USB_EP0_STATE_SETUP; + urb->errorcode = -USB_ERR_STALL; + musb_urb_waitup(urb); + return; + } + if (ep0_status & USB_CSRL0_ERROR) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_ERROR; + musb_fifo_flush(bus, 0); + pipe->ep0_state = USB_EP0_STATE_SETUP; + urb->errorcode = -USB_ERR_IO; + musb_urb_waitup(urb); + return; + } + if (ep0_status & USB_CSRL0_STALL) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALL; + pipe->ep0_state = USB_EP0_STATE_SETUP; + urb->errorcode = -USB_ERR_STALL; + musb_urb_waitup(urb); + return; + } + + switch (pipe->ep0_state) { + case USB_EP0_STATE_SETUP: + urb->actual_length += 8; + if (urb->transfer_buffer_length) { + if (urb->setup->bmRequestType & 0x80) { + pipe->ep0_state = USB_EP0_STATE_IN_DATA; + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_REQPKT; + } else { + pipe->ep0_state = USB_EP0_STATE_OUT_DATA; + size = urb->transfer_buffer_length; + if (size > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + size = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + } + + musb_write_packet(bus, 0, urb->transfer_buffer, size); + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_TXRDY; + + urb->transfer_buffer += size; + urb->transfer_buffer_length -= size; + urb->actual_length += size; + } + } else { + pipe->ep0_state = USB_EP0_STATE_IN_STATUS; + HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_REQPKT | USB_CSRL0_STATUS); + } + break; + case USB_EP0_STATE_IN_DATA: + if (ep0_status & USB_CSRL0_RXRDY) { + size = HWREGH(USB_RXCOUNT_BASE(ep_idx)); + musb_read_packet(bus, 0, urb->transfer_buffer, size); + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_RXRDY; + urb->transfer_buffer += size; + urb->transfer_buffer_length -= size; + urb->actual_length += size; + + if ((size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) || (urb->transfer_buffer_length == 0)) { + pipe->ep0_state = USB_EP0_STATE_OUT_STATUS; + HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_TXRDY | USB_CSRL0_STATUS); + } else { + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_REQPKT; + } + } + break; + case USB_EP0_STATE_OUT_DATA: + if (urb->transfer_buffer_length > 0) { + size = urb->transfer_buffer_length; + if (size > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + size = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + } + + musb_write_packet(bus, 0, urb->transfer_buffer, size); + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_TXRDY; + + urb->transfer_buffer += size; + urb->transfer_buffer_length -= size; + urb->actual_length += size; + } else { + pipe->ep0_state = USB_EP0_STATE_IN_STATUS; + HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_REQPKT | USB_CSRL0_STATUS); + } + break; + case USB_EP0_STATE_OUT_STATUS: + urb->errorcode = 0; + musb_urb_waitup(urb); + break; + case USB_EP0_STATE_IN_STATUS: + if (ep0_status & (USB_CSRL0_RXRDY | USB_CSRL0_STATUS)) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~(USB_CSRL0_RXRDY | USB_CSRL0_STATUS); + urb->errorcode = 0; + musb_urb_waitup(urb); + } + break; + } +} + +void USBH_IRQHandler(uint8_t busid) +{ + uint32_t is; + uint32_t txis; + uint32_t rxis; + uint8_t ep_csrl_status; + // uint8_t ep_csrh_status; + struct musb_pipe *pipe; + struct usbh_urb *urb; + uint8_t ep_idx; + uint8_t old_ep_idx; + struct usbh_bus *bus; + uint32_t size; + + bus = &g_usbhost_bus[busid]; + + if (!(HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) & USB_DEVCTL_HOST)) { + return; + } + + is = HWREGB(USB_BASE + MUSB_IS_OFFSET); + txis = HWREGH(USB_BASE + MUSB_TXIS_OFFSET); + rxis = HWREGH(USB_BASE + MUSB_RXIS_OFFSET); + + HWREGB(USB_BASE + MUSB_IS_OFFSET) = is; + + old_ep_idx = musb_get_active_ep(bus); + + if (is & USB_IS_CONN) { + g_musb_hcd[bus->hcd.hcd_id].port_csc = 1; + g_musb_hcd[bus->hcd.hcd_id].port_pec = 1; + g_musb_hcd[bus->hcd.hcd_id].port_pe = 1; + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); + } + + if (is & USB_IS_DISCON) { + g_musb_hcd[bus->hcd.hcd_id].port_csc = 1; + g_musb_hcd[bus->hcd.hcd_id].port_pec = 1; + g_musb_hcd[bus->hcd.hcd_id].port_pe = 0; + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); + } + + if (is & USB_IS_SOF) { + } + + if (is & USB_IS_RESUME) { + } + + if (is & USB_IS_SUSPEND) { + } + + if (is & USB_IS_VBUSERR) { + } + + if (is & USB_IS_SESREQ) { + } + + if (is & USB_IS_BABBLE) { + } + + txis &= HWREGH(USB_BASE + MUSB_TXIE_OFFSET); + /* Handle EP0 interrupt */ + if (txis & USB_TXIE_EP0) { + txis &= ~USB_TXIE_EP0; + HWREGH(USB_BASE + MUSB_TXIS_OFFSET) = USB_TXIE_EP0; + handle_ep0(bus); + } + + for (ep_idx = 1; ep_idx < CONFIG_USB_MUSB_PIPE_NUM; ep_idx++) { + if (txis & (1 << ep_idx)) { + HWREGH(USB_BASE + MUSB_TXIS_OFFSET) = (1 << ep_idx); + + pipe = &g_musb_hcd[bus->hcd.hcd_id].pipe_pool[ep_idx]; + urb = pipe->urb; + musb_set_active_ep(bus, ep_idx); + + ep_csrl_status = HWREGB(USB_TXCSRL_BASE(ep_idx)); + + if (ep_csrl_status & USB_TXCSRL1_ERROR) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_TXCSRL1_ERROR; + urb->errorcode = -USB_ERR_IO; + musb_urb_waitup(urb); + } else if (ep_csrl_status & USB_TXCSRL1_NAKTO) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_TXCSRL1_NAKTO; + urb->errorcode = -USB_ERR_NAK; + musb_urb_waitup(urb); + } else if (ep_csrl_status & USB_TXCSRL1_STALL) { + HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_TXCSRL1_STALL; + urb->errorcode = -USB_ERR_STALL; + musb_urb_waitup(urb); + } else { + if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + uint32_t size = urb->transfer_buffer_length; + + if (size > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + size = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + } + + urb->transfer_buffer += size; + urb->transfer_buffer_length -= size; + urb->actual_length += size; + + if (urb->transfer_buffer_length == 0) { + //HWREGH(USB_BASE + MUSB_TXIE_OFFSET) &= ~(1 << ep_idx); + urb->errorcode = 0; + musb_urb_waitup(urb); + } else { + musb_write_packet(bus, ep_idx, urb->transfer_buffer, MIN(urb->transfer_buffer_length, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize))); + HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY; + } + } + } + } + } + + rxis &= HWREGH(USB_BASE + MUSB_RXIE_OFFSET); + for (ep_idx = 1; ep_idx < CONFIG_USB_MUSB_PIPE_NUM; ep_idx++) { + if (rxis & (1 << ep_idx)) { + HWREGH(USB_BASE + MUSB_RXIS_OFFSET) = (1 << ep_idx); // clear isr flag + + pipe = &g_musb_hcd[bus->hcd.hcd_id].pipe_pool[ep_idx]; + urb = pipe->urb; + musb_set_active_ep(bus, ep_idx); + + ep_csrl_status = HWREGB(USB_RXCSRL_BASE(ep_idx)); + //ep_csrh_status = HWREGB(USB_BASE + USB_RXCSRH_BASE(ep_idx)); // todo:for iso transfer + + if (ep_csrl_status & USB_RXCSRL1_ERROR) { + HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_ERROR; + urb->errorcode = -USB_ERR_IO; + musb_urb_waitup(urb); + } else if (ep_csrl_status & USB_RXCSRL1_NAKTO) { + HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_NAKTO; + urb->errorcode = -USB_ERR_NAK; + musb_urb_waitup(urb); + } else if (ep_csrl_status & USB_RXCSRL1_STALL) { + HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_STALL; + urb->errorcode = -USB_ERR_STALL; + musb_urb_waitup(urb); + } else if (ep_csrl_status & USB_RXCSRL1_RXRDY) { + if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + size = HWREGH(USB_RXCOUNT_BASE(ep_idx)); + + musb_read_packet(bus, ep_idx, urb->transfer_buffer, size); + + HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_RXRDY; + + urb->transfer_buffer += size; + urb->transfer_buffer_length -= size; + urb->actual_length += size; + + if ((size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) || (urb->transfer_buffer_length == 0)) { + //HWREGH(USB_BASE + MUSB_RXIE_OFFSET) &= ~(1 << ep_idx); + urb->errorcode = 0; + musb_urb_waitup(urb); + } else { + HWREGB(USB_RXCSRL_BASE(ep_idx)) = USB_RXCSRL1_REQPKT; + } + } + } + } + } + musb_set_active_ep(bus, old_ep_idx); +} diff --git a/src/lib/CherryUSB/port/musb/usb_musb_reg.h b/src/lib/CherryUSB/port/musb/usb_musb_reg.h new file mode 100644 index 000000000..17765372d --- /dev/null +++ b/src/lib/CherryUSB/port/musb/usb_musb_reg.h @@ -0,0 +1,3887 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef __USB_MUSB_REG_H__ +#define __USB_MUSB_REG_H__ + +#define __I volatile const /* defines 'read only' permissions */ +#define __O volatile /* defines 'write only' permissions */ +#define __IO volatile /* defines 'read / write' permissions */ + +/** + * @brief Register map for USB0 peripheral (USB0) + */ +#ifdef CONFIG_USB_MUSB_SUNXI +#if 0 +typedef __PACKED_STRUCT { /*!< USB0 Structure */ + union { + __IO uint8_t FIFO0_BYTE; /*!< USB FIFO Endpoint 0 */ + __IO uint16_t FIFO0_HALF; /*!< USB FIFO Endpoint 0 */ + __IO uint32_t FIFO0_WORD; /*!< USB FIFO Endpoint 0 */ + } FIFO0; + union { + __IO uint8_t FIFO1_BYTE; /*!< USB FIFO Endpoint 1 */ + __IO uint16_t FIFO1_HALF; /*!< USB FIFO Endpoint 1 */ + __IO uint32_t FIFO1_WORD; /*!< USB FIFO Endpoint 1 */ + } FIFO1; + union { + __IO uint8_t FIFO2_BYTE; /*!< USB FIFO Endpoint 2 */ + __IO uint16_t FIFO2_HALF; /*!< USB FIFO Endpoint 2 */ + __IO uint32_t FIFO2_WORD; /*!< USB FIFO Endpoint 2 */ + } FIFO2; + union { + __IO uint8_t FIFO3_BYTE; /*!< USB FIFO Endpoint 3 */ + __IO uint16_t FIFO3_HALF; /*!< USB FIFO Endpoint 3 */ + __IO uint32_t FIFO3_WORD; /*!< USB FIFO Endpoint 3 */ + } FIFO3; + union { + __IO uint8_t FIFO4_BYTE; /*!< USB FIFO Endpoint 4 */ + __IO uint16_t FIFO4_HALF; /*!< USB FIFO Endpoint 4 */ + __IO uint32_t FIFO4_WORD; /*!< USB FIFO Endpoint 4 */ + } FIFO4; + union { + __IO uint8_t FIFO5_BYTE; /*!< USB FIFO Endpoint 5 */ + __IO uint16_t FIFO5_HALF; /*!< USB FIFO Endpoint 5 */ + __IO uint32_t FIFO5_WORD; /*!< USB FIFO Endpoint 5 */ + } FIFO5; + union { + __IO uint8_t FIFO6_BYTE; /*!< USB FIFO Endpoint 6 */ + __IO uint16_t FIFO6_HALF; /*!< USB FIFO Endpoint 6 */ + __IO uint32_t FIFO6_WORD; /*!< USB FIFO Endpoint 6 */ + } FIFO6; + union { + __IO uint8_t FIFO7_BYTE; /*!< USB FIFO Endpoint 7 */ + __IO uint16_t FIFO7_HALF; /*!< USB FIFO Endpoint 7 */ + __IO uint32_t FIFO7_WORD; /*!< USB FIFO Endpoint 7 */ + } FIFO7; + union { + __IO uint8_t FIFO_BYTE; /*!< USB FIFO Endpoint 7 */ + __IO uint16_t FIFO_HALF; /*!< USB FIFO Endpoint 7 */ + __IO uint32_t FIFO_WORD; /*!< USB FIFO Endpoint 7 */ + } FIFO_RESERVED[8]; + + // 0x40 + __IO uint8_t POWER; /*!< USB Power */ + __IO uint8_t DEVCTL; /*!< USB Device Control */ + __IO uint8_t EPIDX; /*!< USB Endpoint Index */ + __IO uint8_t VEND0; +// 0x44 + __IO uint16_t TXIS; /*!< USB Transmit Interrupt Status */ + __IO uint16_t RXIS; /*!< USB Receive Interrupt Status */ + // 0x48 + __IO uint16_t TXIE; /*!< USB Transmit Interrupt Enable */ + __IO uint16_t RXIE; /*!< USB Receive Interrupt Enable */ +// 0x4c + __IO uint8_t IS; /*!< USB General Interrupt Status */ + __I uint8_t IS_RESERVED[3]; + + __IO uint8_t IE; /*!< USB Interrupt Enable */ + __I uint8_t IE_RESERVED[3]; + + __IO uint16_t FRAME; /*!< USB Frame Value */ + __I uint8_t FRAME_RESERVED[34]; + + __IO uint8_t EPINFO; /*!< USB Endpoint Information */ + __IO uint8_t RAMINFO; /*!< USB RAM Information */ + __IO uint8_t LINKINFO; + __IO uint8_t VPLEN; /*!< USB OTG VBUS Pulse Timing */ +// 0x7c + __IO uint8_t HSEOF; /*!< USB High-Speed Last Transaction to End of Frame Timing */ + __IO uint8_t FSEOF; /*!< USB Full-Speed Last Transaction to End of Frame Timing */ + __IO uint8_t LSEOF; /*!< USB Low-Speed Last Transaction to End of Frame Timing */ + __I uint8_t RESERVED7F; + +// 0x80 + __IO uint16_t TXMAXP1; /*!< USB Maximum Transmit Data Endpoint 1 */ + __PACKED_UNION + { + __IO uint8_t CSRL0; + __IO uint8_t TXCSRL1; /*!< USB Transmit Control and Status Endpoint 1 Low */ + } ; + + __PACKED_UNION + { + __O uint8_t CSRH0; /*!< USB Control and Status Endpoint 0 High */ + __IO uint8_t TXCSRH1; /*!< USB Transmit Control and Status Endpoint 1 High */ + } ; +// 0x84 + __IO uint16_t RXMAXP1; /*!< USB Maximum Receive Data Endpoint 1 */ + __IO uint8_t RXCSRL1; /*!< USB Receive Control and Status Endpoint 1 Low */ + __IO uint8_t RXCSRH1; /*!< USB Receive Control and Status Endpoint 1 High */ + + __PACKED_UNION + { + __IO uint16_t COUNT0; + __IO uint16_t RXCOUNT1; /*!< USB Receive Byte Count Endpoint 1 */ + } ; + // 0x8A + __IO uint8_t TYPE0; /*!< USB Type Endpoint 0 */ + __IO uint8_t NAKLMT; /*!< USB NAK Limit */ + // 0x8C + __IO uint8_t TXTYPE1; /*!< USB Host Transmit Configure Type Endpoint 1 */ + __IO uint8_t TXINTERVAL1; /*!< USB Host Transmit Interval Endpoint 1 */ + __IO uint8_t RXTYPE1; /*!< USB Host Configure Receive Type Endpoint 1 */ + __IO uint8_t RXINTERVAL1; /*!< USB Host Receive Polling Interval Endpoint 1 */ +// 0x90 + __IO uint8_t TXFIFOSZ; /*!< USB Transmit Dynamic FIFO Sizing */ + __I uint8_t RESERVED91; + __IO uint16_t TXFIFOADD; /*!< USB Transmit FIFO Start Address */ +// 0x94 + __IO uint8_t RXFIFOSZ; /*!< USB Receive Dynamic FIFO Sizing */ + __I uint8_t RESERVED95; + __IO uint16_t RXFIFOADD; /*!< USB Receive FIFO Start Address */ + +/* "bus control"/target registers, for host side multipoint (external hubs) */ +// 0x98 + __PACKED_UNION + { + __IO uint8_t FADDR; + __IO uint8_t TXFUNCADDR0; + }; + + __I uint8_t RESERVERD99; +// 0x9A + __IO uint8_t TXHUBADDR0; + __IO uint8_t TXHUBPORT0; +// 0x9c + __IO uint8_t RXFUNCADDR0; + __I uint8_t RESERVED9d; + __IO uint8_t RXHUBADDR0; + __IO uint8_t RXHUBPORT0; +} USB0_Type; +#endif +#else +#if 0 +typedef struct { /*!< USB0 Structure */ + __IO uint8_t FADDR; /*!< USB Device Functional Address */ + __IO uint8_t POWER; /*!< USB Power */ + __IO uint16_t TXIS; /*!< USB Transmit Interrupt Status */ + __IO uint16_t RXIS; /*!< USB Receive Interrupt Status */ + __IO uint16_t TXIE; /*!< USB Transmit Interrupt Enable */ + __IO uint16_t RXIE; /*!< USB Receive Interrupt Enable */ + __IO uint8_t IS; /*!< USB General Interrupt Status */ + __IO uint8_t IE; /*!< USB Interrupt Enable */ + __IO uint16_t FRAME; /*!< USB Frame Value */ + __IO uint8_t EPIDX; /*!< USB Endpoint Index */ + __IO uint8_t TEST; /*!< USB Test Mode */ + __I uint32_t RESERVED0[4]; + union { + __IO uint8_t FIFO0_BYTE; /*!< USB FIFO Endpoint 0 */ + __IO uint16_t FIFO0_HALF; /*!< USB FIFO Endpoint 0 */ + __IO uint32_t FIFO0_WORD; /*!< USB FIFO Endpoint 0 */ + } FIFO0; + union { + __IO uint8_t FIFO1_BYTE; /*!< USB FIFO Endpoint 1 */ + __IO uint16_t FIFO1_HALF; /*!< USB FIFO Endpoint 1 */ + __IO uint32_t FIFO1_WORD; /*!< USB FIFO Endpoint 1 */ + } FIFO1; + union { + __IO uint8_t FIFO2_BYTE; /*!< USB FIFO Endpoint 2 */ + __IO uint16_t FIFO2_HALF; /*!< USB FIFO Endpoint 2 */ + __IO uint32_t FIFO2_WORD; /*!< USB FIFO Endpoint 2 */ + } FIFO2; + union { + __IO uint8_t FIFO3_BYTE; /*!< USB FIFO Endpoint 3 */ + __IO uint16_t FIFO3_HALF; /*!< USB FIFO Endpoint 3 */ + __IO uint32_t FIFO3_WORD; /*!< USB FIFO Endpoint 3 */ + } FIFO3; + union { + __IO uint8_t FIFO4_BYTE; /*!< USB FIFO Endpoint 4 */ + __IO uint16_t FIFO4_HALF; /*!< USB FIFO Endpoint 4 */ + __IO uint32_t FIFO4_WORD; /*!< USB FIFO Endpoint 4 */ + } FIFO4; + union { + __IO uint8_t FIFO5_BYTE; /*!< USB FIFO Endpoint 5 */ + __IO uint16_t FIFO5_HALF; /*!< USB FIFO Endpoint 5 */ + __IO uint32_t FIFO5_WORD; /*!< USB FIFO Endpoint 5 */ + } FIFO5; + union { + __IO uint8_t FIFO6_BYTE; /*!< USB FIFO Endpoint 6 */ + __IO uint16_t FIFO6_HALF; /*!< USB FIFO Endpoint 6 */ + __IO uint32_t FIFO6_WORD; /*!< USB FIFO Endpoint 6 */ + } FIFO6; + union { + __IO uint8_t FIFO7_BYTE; /*!< USB FIFO Endpoint 7 */ + __IO uint16_t FIFO7_HALF; /*!< USB FIFO Endpoint 7 */ + __IO uint32_t FIFO7_WORD; /*!< USB FIFO Endpoint 7 */ + } FIFO7; + __I uint32_t RESERVED1[8]; + __IO uint8_t DEVCTL; /*!< USB Device Control */ + __IO uint8_t CCONF; /*!< USB Common Configuration */ + __IO uint8_t TXFIFOSZ; /*!< USB Transmit Dynamic FIFO Sizing */ + __IO uint8_t RXFIFOSZ; /*!< USB Receive Dynamic FIFO Sizing */ + __IO uint16_t TXFIFOADD; /*!< USB Transmit FIFO Start Address */ + __IO uint16_t RXFIFOADD; /*!< USB Receive FIFO Start Address */ + __I uint32_t RESERVED2[2]; + __IO uint8_t ULPIVBUSCTL; /*!< USB ULPI VBUS Control */ + __I uint8_t RESERVED3[3]; + __IO uint8_t ULPIREGDATA; /*!< USB ULPI Register Data */ + __IO uint8_t ULPIREGADDR; /*!< USB ULPI Register Address */ + __IO uint8_t ULPIREGCTL; /*!< USB ULPI Register Control */ + __I uint8_t RESERVED4; + __IO uint8_t EPINFO; /*!< USB Endpoint Information */ + __IO uint8_t RAMINFO; /*!< USB RAM Information */ + __IO uint8_t CONTIM; /*!< USB Connect Timing */ + __IO uint8_t VPLEN; /*!< USB OTG VBUS Pulse Timing */ + __IO uint8_t HSEOF; /*!< USB High-Speed Last Transaction to End of Frame Timing */ + __IO uint8_t FSEOF; /*!< USB Full-Speed Last Transaction to End of Frame Timing */ + __IO uint8_t LSEOF; /*!< USB Low-Speed Last Transaction to End of Frame Timing */ + __I uint8_t RESERVED5; + __IO uint8_t TXFUNCADDR0; /*!< USB Transmit Functional Address Endpoint 0 */ + __I uint8_t RESERVED6; + __IO uint8_t TXHUBADDR0; /*!< USB Transmit Hub Address Endpoint 0 */ + __IO uint8_t TXHUBPORT0; /*!< USB Transmit Hub Port Endpoint 0 */ + __I uint32_t RESERVED7; + __IO uint8_t TXFUNCADDR1; /*!< USB Transmit Functional Address Endpoint 1 */ + __I uint8_t RESERVED8; + __IO uint8_t TXHUBADDR1; /*!< USB Transmit Hub Address Endpoint 1 */ + __IO uint8_t TXHUBPORT1; /*!< USB Transmit Hub Port Endpoint 1 */ + __IO uint8_t RXFUNCADDR1; /*!< USB Receive Functional Address Endpoint 1 */ + __I uint8_t RESERVED9; + __IO uint8_t RXHUBADDR1; /*!< USB Receive Hub Address Endpoint 1 */ + __IO uint8_t RXHUBPORT1; /*!< USB Receive Hub Port Endpoint 1 */ + __IO uint8_t TXFUNCADDR2; /*!< USB Transmit Functional Address Endpoint 2 */ + __I uint8_t RESERVED10; + __IO uint8_t TXHUBADDR2; /*!< USB Transmit Hub Address Endpoint 2 */ + __IO uint8_t TXHUBPORT2; /*!< USB Transmit Hub Port Endpoint 2 */ + __IO uint8_t RXFUNCADDR2; /*!< USB Receive Functional Address Endpoint 2 */ + __I uint8_t RESERVED11; + __IO uint8_t RXHUBADDR2; /*!< USB Receive Hub Address Endpoint 2 */ + __IO uint8_t RXHUBPORT2; /*!< USB Receive Hub Port Endpoint 2 */ + __IO uint8_t TXFUNCADDR3; /*!< USB Transmit Functional Address Endpoint 3 */ + __I uint8_t RESERVED12; + __IO uint8_t TXHUBADDR3; /*!< USB Transmit Hub Address Endpoint 3 */ + __IO uint8_t TXHUBPORT3; /*!< USB Transmit Hub Port Endpoint 3 */ + __IO uint8_t RXFUNCADDR3; /*!< USB Receive Functional Address Endpoint 3 */ + __I uint8_t RESERVED13; + __IO uint8_t RXHUBADDR3; /*!< USB Receive Hub Address Endpoint 3 */ + __IO uint8_t RXHUBPORT3; /*!< USB Receive Hub Port Endpoint 3 */ + __IO uint8_t TXFUNCADDR4; /*!< USB Transmit Functional Address Endpoint 4 */ + __I uint8_t RESERVED14; + __IO uint8_t TXHUBADDR4; /*!< USB Transmit Hub Address Endpoint 4 */ + __IO uint8_t TXHUBPORT4; /*!< USB Transmit Hub Port Endpoint 4 */ + __IO uint8_t RXFUNCADDR4; /*!< USB Receive Functional Address Endpoint 4 */ + __I uint8_t RESERVED15; + __IO uint8_t RXHUBADDR4; /*!< USB Receive Hub Address Endpoint 4 */ + __IO uint8_t RXHUBPORT4; /*!< USB Receive Hub Port Endpoint 4 */ + __IO uint8_t TXFUNCADDR5; /*!< USB Transmit Functional Address Endpoint 5 */ + __I uint8_t RESERVED16; + __IO uint8_t TXHUBADDR5; /*!< USB Transmit Hub Address Endpoint 5 */ + __IO uint8_t TXHUBPORT5; /*!< USB Transmit Hub Port Endpoint 5 */ + __IO uint8_t RXFUNCADDR5; /*!< USB Receive Functional Address Endpoint 5 */ + __I uint8_t RESERVED17; + __IO uint8_t RXHUBADDR5; /*!< USB Receive Hub Address Endpoint 5 */ + __IO uint8_t RXHUBPORT5; /*!< USB Receive Hub Port Endpoint 5 */ + __IO uint8_t TXFUNCADDR6; /*!< USB Transmit Functional Address Endpoint 6 */ + __I uint8_t RESERVED18; + __IO uint8_t TXHUBADDR6; /*!< USB Transmit Hub Address Endpoint 6 */ + __IO uint8_t TXHUBPORT6; /*!< USB Transmit Hub Port Endpoint 6 */ + __IO uint8_t RXFUNCADDR6; /*!< USB Receive Functional Address Endpoint 6 */ + __I uint8_t RESERVED19; + __IO uint8_t RXHUBADDR6; /*!< USB Receive Hub Address Endpoint 6 */ + __IO uint8_t RXHUBPORT6; /*!< USB Receive Hub Port Endpoint 6 */ + __IO uint8_t TXFUNCADDR7; /*!< USB Transmit Functional Address Endpoint 7 */ + __I uint8_t RESERVED20; + __IO uint8_t TXHUBADDR7; /*!< USB Transmit Hub Address Endpoint 7 */ + __IO uint8_t TXHUBPORT7; /*!< USB Transmit Hub Port Endpoint 7 */ + __IO uint8_t RXFUNCADDR7; /*!< USB Receive Functional Address Endpoint 7 */ + __I uint8_t RESERVED21; + __IO uint8_t RXHUBADDR7; /*!< USB Receive Hub Address Endpoint 7 */ + __IO uint8_t RXHUBPORT7; /*!< USB Receive Hub Port Endpoint 7 */ + __I uint32_t RESERVED22[16]; + __I uint16_t RESERVED23; + __O uint8_t CSRL0; /*!< USB Control and Status Endpoint 0 Low */ + __O uint8_t CSRH0; /*!< USB Control and Status Endpoint 0 High */ + __I uint16_t RESERVED24[2]; + __IO uint8_t COUNT0; /*!< USB Receive Byte Count Endpoint 0 */ + __I uint8_t RESERVED25; + __IO uint8_t TYPE0; /*!< USB Type Endpoint 0 */ + __IO uint8_t NAKLMT; /*!< USB NAK Limit */ + __I uint32_t RESERVED26; + __IO uint16_t TXMAXP1; /*!< USB Maximum Transmit Data Endpoint 1 */ + __IO uint8_t TXCSRL1; /*!< USB Transmit Control and Status Endpoint 1 Low */ + __IO uint8_t TXCSRH1; /*!< USB Transmit Control and Status Endpoint 1 High */ + __IO uint16_t RXMAXP1; /*!< USB Maximum Receive Data Endpoint 1 */ + __IO uint8_t RXCSRL1; /*!< USB Receive Control and Status Endpoint 1 Low */ + __IO uint8_t RXCSRH1; /*!< USB Receive Control and Status Endpoint 1 High */ + __IO uint16_t RXCOUNT1; /*!< USB Receive Byte Count Endpoint 1 */ + __IO uint8_t TXTYPE1; /*!< USB Host Transmit Configure Type Endpoint 1 */ + __IO uint8_t TXINTERVAL1; /*!< USB Host Transmit Interval Endpoint 1 */ + __IO uint8_t RXTYPE1; /*!< USB Host Configure Receive Type Endpoint 1 */ + __IO uint8_t RXINTERVAL1; /*!< USB Host Receive Polling Interval Endpoint 1 */ + __I uint16_t RESERVED27; + __IO uint16_t TXMAXP2; /*!< USB Maximum Transmit Data Endpoint 2 */ + __IO uint8_t TXCSRL2; /*!< USB Transmit Control and Status Endpoint 2 Low */ + __IO uint8_t TXCSRH2; /*!< USB Transmit Control and Status Endpoint 2 High */ + __IO uint16_t RXMAXP2; /*!< USB Maximum Receive Data Endpoint 2 */ + __IO uint8_t RXCSRL2; /*!< USB Receive Control and Status Endpoint 2 Low */ + __IO uint8_t RXCSRH2; /*!< USB Receive Control and Status Endpoint 2 High */ + __IO uint16_t RXCOUNT2; /*!< USB Receive Byte Count Endpoint 2 */ + __IO uint8_t TXTYPE2; /*!< USB Host Transmit Configure Type Endpoint 2 */ + __IO uint8_t TXINTERVAL2; /*!< USB Host Transmit Interval Endpoint 2 */ + __IO uint8_t RXTYPE2; /*!< USB Host Configure Receive Type Endpoint 2 */ + __IO uint8_t RXINTERVAL2; /*!< USB Host Receive Polling Interval Endpoint 2 */ + __I uint16_t RESERVED28; + __IO uint16_t TXMAXP3; /*!< USB Maximum Transmit Data Endpoint 3 */ + __IO uint8_t TXCSRL3; /*!< USB Transmit Control and Status Endpoint 3 Low */ + __IO uint8_t TXCSRH3; /*!< USB Transmit Control and Status Endpoint 3 High */ + __IO uint16_t RXMAXP3; /*!< USB Maximum Receive Data Endpoint 3 */ + __IO uint8_t RXCSRL3; /*!< USB Receive Control and Status Endpoint 3 Low */ + __IO uint8_t RXCSRH3; /*!< USB Receive Control and Status Endpoint 3 High */ + __IO uint16_t RXCOUNT3; /*!< USB Receive Byte Count Endpoint 3 */ + __IO uint8_t TXTYPE3; /*!< USB Host Transmit Configure Type Endpoint 3 */ + __IO uint8_t TXINTERVAL3; /*!< USB Host Transmit Interval Endpoint 3 */ + __IO uint8_t RXTYPE3; /*!< USB Host Configure Receive Type Endpoint 3 */ + __IO uint8_t RXINTERVAL3; /*!< USB Host Receive Polling Interval Endpoint 3 */ + __I uint16_t RESERVED29; + __IO uint16_t TXMAXP4; /*!< USB Maximum Transmit Data Endpoint 4 */ + __IO uint8_t TXCSRL4; /*!< USB Transmit Control and Status Endpoint 4 Low */ + __IO uint8_t TXCSRH4; /*!< USB Transmit Control and Status Endpoint 4 High */ + __IO uint16_t RXMAXP4; /*!< USB Maximum Receive Data Endpoint 4 */ + __IO uint8_t RXCSRL4; /*!< USB Receive Control and Status Endpoint 4 Low */ + __IO uint8_t RXCSRH4; /*!< USB Receive Control and Status Endpoint 4 High */ + __IO uint16_t RXCOUNT4; /*!< USB Receive Byte Count Endpoint 4 */ + __IO uint8_t TXTYPE4; /*!< USB Host Transmit Configure Type Endpoint 4 */ + __IO uint8_t TXINTERVAL4; /*!< USB Host Transmit Interval Endpoint 4 */ + __IO uint8_t RXTYPE4; /*!< USB Host Configure Receive Type Endpoint 4 */ + __IO uint8_t RXINTERVAL4; /*!< USB Host Receive Polling Interval Endpoint 4 */ + __I uint16_t RESERVED30; + __IO uint16_t TXMAXP5; /*!< USB Maximum Transmit Data Endpoint 5 */ + __IO uint8_t TXCSRL5; /*!< USB Transmit Control and Status Endpoint 5 Low */ + __IO uint8_t TXCSRH5; /*!< USB Transmit Control and Status Endpoint 5 High */ + __IO uint16_t RXMAXP5; /*!< USB Maximum Receive Data Endpoint 5 */ + __IO uint8_t RXCSRL5; /*!< USB Receive Control and Status Endpoint 5 Low */ + __IO uint8_t RXCSRH5; /*!< USB Receive Control and Status Endpoint 5 High */ + __IO uint16_t RXCOUNT5; /*!< USB Receive Byte Count Endpoint 5 */ + __IO uint8_t TXTYPE5; /*!< USB Host Transmit Configure Type Endpoint 5 */ + __IO uint8_t TXINTERVAL5; /*!< USB Host Transmit Interval Endpoint 5 */ + __IO uint8_t RXTYPE5; /*!< USB Host Configure Receive Type Endpoint 5 */ + __IO uint8_t RXINTERVAL5; /*!< USB Host Receive Polling Interval Endpoint 5 */ + __I uint16_t RESERVED31; + __IO uint16_t TXMAXP6; /*!< USB Maximum Transmit Data Endpoint 6 */ + __IO uint8_t TXCSRL6; /*!< USB Transmit Control and Status Endpoint 6 Low */ + __IO uint8_t TXCSRH6; /*!< USB Transmit Control and Status Endpoint 6 High */ + __IO uint16_t RXMAXP6; /*!< USB Maximum Receive Data Endpoint 6 */ + __IO uint8_t RXCSRL6; /*!< USB Receive Control and Status Endpoint 6 Low */ + __IO uint8_t RXCSRH6; /*!< USB Receive Control and Status Endpoint 6 High */ + __IO uint16_t RXCOUNT6; /*!< USB Receive Byte Count Endpoint 6 */ + __IO uint8_t TXTYPE6; /*!< USB Host Transmit Configure Type Endpoint 6 */ + __IO uint8_t TXINTERVAL6; /*!< USB Host Transmit Interval Endpoint 6 */ + __IO uint8_t RXTYPE6; /*!< USB Host Configure Receive Type Endpoint 6 */ + __IO uint8_t RXINTERVAL6; /*!< USB Host Receive Polling Interval Endpoint 6 */ + __I uint16_t RESERVED32; + __IO uint16_t TXMAXP7; /*!< USB Maximum Transmit Data Endpoint 7 */ + __IO uint8_t TXCSRL7; /*!< USB Transmit Control and Status Endpoint 7 Low */ + __IO uint8_t TXCSRH7; /*!< USB Transmit Control and Status Endpoint 7 High */ + __IO uint16_t RXMAXP7; /*!< USB Maximum Receive Data Endpoint 7 */ + __IO uint8_t RXCSRL7; /*!< USB Receive Control and Status Endpoint 7 Low */ + __IO uint8_t RXCSRH7; /*!< USB Receive Control and Status Endpoint 7 High */ + __IO uint16_t RXCOUNT7; /*!< USB Receive Byte Count Endpoint 7 */ + __IO uint8_t TXTYPE7; /*!< USB Host Transmit Configure Type Endpoint 7 */ + __IO uint8_t TXINTERVAL7; /*!< USB Host Transmit Interval Endpoint 7 */ + __IO uint8_t RXTYPE7; /*!< USB Host Configure Receive Type Endpoint 7 */ + __IO uint8_t RXINTERVAL7; /*!< USB Host Receive Polling Interval Endpoint 7 */ + __I uint16_t RESERVED33[65]; + __IO uint8_t DMAINTR; /*!< USB DMA Interrupt */ + __I uint8_t RESERVED34[3]; + __IO uint16_t DMACTL0; /*!< USB DMA Control 0 */ + __I uint16_t RESERVED35; + __IO uint32_t DMAADDR0; /*!< USB DMA Address 0 */ + __IO uint32_t DMACOUNT0; /*!< USB DMA Count 0 */ + __I uint32_t RESERVED36; + __IO uint16_t DMACTL1; /*!< USB DMA Control 1 */ + __I uint16_t RESERVED37; + __IO uint32_t DMAADDR1; /*!< USB DMA Address 1 */ + __IO uint32_t DMACOUNT1; /*!< USB DMA Count 1 */ + __I uint32_t RESERVED38; + __IO uint16_t DMACTL2; /*!< USB DMA Control 2 */ + __I uint16_t RESERVED39; + __IO uint32_t DMAADDR2; /*!< USB DMA Address 2 */ + __IO uint32_t DMACOUNT2; /*!< USB DMA Count 2 */ + __I uint32_t RESERVED40; + __IO uint16_t DMACTL3; /*!< USB DMA Control 3 */ + __I uint16_t RESERVED41; + __IO uint32_t DMAADDR3; /*!< USB DMA Address 3 */ + __IO uint32_t DMACOUNT3; /*!< USB DMA Count 3 */ + __I uint32_t RESERVED42; + __IO uint16_t DMACTL4; /*!< USB DMA Control 4 */ + __I uint16_t RESERVED43; + __IO uint32_t DMAADDR4; /*!< USB DMA Address 4 */ + __IO uint32_t DMACOUNT4; /*!< USB DMA Count 4 */ + __I uint32_t RESERVED44; + __IO uint16_t DMACTL5; /*!< USB DMA Control 5 */ + __I uint16_t RESERVED45; + __IO uint32_t DMAADDR5; /*!< USB DMA Address 5 */ + __IO uint32_t DMACOUNT5; /*!< USB DMA Count 5 */ + __I uint32_t RESERVED46; + __IO uint16_t DMACTL6; /*!< USB DMA Control 6 */ + __I uint16_t RESERVED47; + __IO uint32_t DMAADDR6; /*!< USB DMA Address 6 */ + __IO uint32_t DMACOUNT6; /*!< USB DMA Count 6 */ + __I uint32_t RESERVED48; + __IO uint16_t DMACTL7; /*!< USB DMA Control 7 */ + __I uint16_t RESERVED49; + __IO uint32_t DMAADDR7; /*!< USB DMA Address 7 */ + __IO uint32_t DMACOUNT7; /*!< USB DMA Count 7 */ + __I uint32_t RESERVED50[33]; + __IO uint16_t RQPKTCOUNT1; /*!< USB Request Packet Count in Block Transfer Endpoint 1 */ + __I uint16_t RESERVED51; + __IO uint16_t RQPKTCOUNT2; /*!< USB Request Packet Count in Block Transfer Endpoint 2 */ + __I uint16_t RESERVED52; + __IO uint16_t RQPKTCOUNT3; /*!< USB Request Packet Count in Block Transfer Endpoint 3 */ + __I uint16_t RESERVED53; + __IO uint16_t RQPKTCOUNT4; /*!< USB Request Packet Count in Block Transfer Endpoint 4 */ + __I uint16_t RESERVED54; + __IO uint16_t RQPKTCOUNT5; /*!< USB Request Packet Count in Block Transfer Endpoint 5 */ + __I uint16_t RESERVED55; + __IO uint16_t RQPKTCOUNT6; /*!< USB Request Packet Count in Block Transfer Endpoint 6 */ + __I uint16_t RESERVED56; + __IO uint16_t RQPKTCOUNT7; /*!< USB Request Packet Count in Block Transfer Endpoint 7 */ + __I uint16_t RESERVED57[17]; + __IO uint16_t RXDPKTBUFDIS; /*!< USB Receive Double Packet Buffer Disable */ + __IO uint16_t TXDPKTBUFDIS; /*!< USB Transmit Double Packet Buffer Disable */ + __IO uint16_t CTO; /*!< USB Chirp Timeout */ + __IO uint16_t HHSRTN; /*!< USB High Speed to UTM Operating Delay */ + __IO uint16_t HSBT; /*!< USB High Speed Time-out Adder */ + __I uint16_t RESERVED58[11]; + __IO uint16_t LPMATTR; /*!< USB LPM Attributes */ + __IO uint8_t LPMCNTRL; /*!< USB LPM Control */ + __IO uint8_t LPMIM; /*!< USB LPM Interrupt Mask */ + __IO uint8_t LPMRIS; /*!< USB LPM Raw Interrupt Status */ + __IO uint8_t LPMFADDR; /*!< USB LPM Function Address */ + __I uint16_t RESERVED59[77]; + __IO uint32_t EPC; /*!< USB External Power Control */ + __IO uint32_t EPCRIS; /*!< USB External Power Control Raw Interrupt Status */ + __IO uint32_t EPCIM; /*!< USB External Power Control Interrupt Mask */ + __IO uint32_t EPCISC; /*!< USB External Power Control Interrupt Status and Clear */ + __IO uint32_t DRRIS; /*!< USB Device RESUME Raw Interrupt Status */ + __IO uint32_t DRIM; /*!< USB Device RESUME Interrupt Mask */ + __O uint32_t DRISC; /*!< USB Device RESUME Interrupt Status and Clear */ + __IO uint32_t GPCS; /*!< USB General-Purpose Control and Status */ + __I uint32_t RESERVED60[4]; + __IO uint32_t VDC; /*!< USB VBUS Droop Control */ + __IO uint32_t VDCRIS; /*!< USB VBUS Droop Control Raw Interrupt Status */ + __IO uint32_t VDCIM; /*!< USB VBUS Droop Control Interrupt Mask */ + __IO uint32_t VDCISC; /*!< USB VBUS Droop Control Interrupt Status and Clear */ + __I uint32_t RESERVED61[736]; + __IO uint32_t PP; /*!< USB Peripheral Properties */ + __IO uint32_t PC; /*!< USB Peripheral Configuration */ + __IO uint32_t CC; /*!< USB Clock Configuration */ +} USB0_Type; +#endif +#endif // CONFIG_USB_MUSB_SUNXI + +//***************************************************************************** +// +// The following are defines for the Univeral Serial Bus register offsets. +// +//***************************************************************************** +#define USB_O_FADDR 0x00000000 // USB Device Functional Address +#define USB_O_POWER 0x00000001 // USB Power +#define USB_O_TXIS 0x00000002 // USB Transmit Interrupt Status +#define USB_O_RXIS 0x00000004 // USB Receive Interrupt Status +#define USB_O_TXIE 0x00000006 // USB Transmit Interrupt Enable +#define USB_O_RXIE 0x00000008 // USB Receive Interrupt Enable +#define USB_O_IS 0x0000000A // USB General Interrupt Status +#define USB_O_IE 0x0000000B // USB Interrupt Enable +#define USB_O_FRAME 0x0000000C // USB Frame Value +#define USB_O_EPIDX 0x0000000E // USB Endpoint Index +#define USB_O_TEST 0x0000000F // USB Test Mode +#define USB_O_FIFO0 0x00000020 // USB FIFO Endpoint 0 +#define USB_O_FIFO1 0x00000024 // USB FIFO Endpoint 1 +#define USB_O_FIFO2 0x00000028 // USB FIFO Endpoint 2 +#define USB_O_FIFO3 0x0000002C // USB FIFO Endpoint 3 +#define USB_O_FIFO4 0x00000030 // USB FIFO Endpoint 4 +#define USB_O_FIFO5 0x00000034 // USB FIFO Endpoint 5 +#define USB_O_FIFO6 0x00000038 // USB FIFO Endpoint 6 +#define USB_O_FIFO7 0x0000003C // USB FIFO Endpoint 7 +#define USB_O_DEVCTL 0x00000060 // USB Device Control +#define USB_O_CCONF 0x00000061 // USB Common Configuration +#define USB_O_TXFIFOSZ 0x00000062 // USB Transmit Dynamic FIFO Sizing +#define USB_O_RXFIFOSZ 0x00000063 // USB Receive Dynamic FIFO Sizing +#define USB_O_TXFIFOADD 0x00000064 // USB Transmit FIFO Start Address +#define USB_O_RXFIFOADD 0x00000066 // USB Receive FIFO Start Address +#define USB_O_ULPIVBUSCTL 0x00000070 // USB ULPI VBUS Control +#define USB_O_ULPIREGDATA 0x00000074 // USB ULPI Register Data +#define USB_O_ULPIREGADDR 0x00000075 // USB ULPI Register Address +#define USB_O_ULPIREGCTL 0x00000076 // USB ULPI Register Control +#define USB_O_EPINFO 0x00000078 // USB Endpoint Information +#define USB_O_RAMINFO 0x00000079 // USB RAM Information +#define USB_O_CONTIM 0x0000007A // USB Connect Timing +#define USB_O_VPLEN 0x0000007B // USB OTG VBUS Pulse Timing +#define USB_O_HSEOF 0x0000007C // USB High-Speed Last Transaction + // to End of Frame Timing +#define USB_O_FSEOF 0x0000007D // USB Full-Speed Last Transaction + // to End of Frame Timing +#define USB_O_LSEOF 0x0000007E // USB Low-Speed Last Transaction + // to End of Frame Timing +#define USB_O_TXFUNCADDR0 0x00000080 // USB Transmit Functional Address + // Endpoint 0 +#define USB_O_TXHUBADDR0 0x00000082 // USB Transmit Hub Address + // Endpoint 0 +#define USB_O_TXHUBPORT0 0x00000083 // USB Transmit Hub Port Endpoint 0 +#define USB_O_TXFUNCADDR1 0x00000088 // USB Transmit Functional Address + // Endpoint 1 +#define USB_O_TXHUBADDR1 0x0000008A // USB Transmit Hub Address + // Endpoint 1 +#define USB_O_TXHUBPORT1 0x0000008B // USB Transmit Hub Port Endpoint 1 +#define USB_O_RXFUNCADDR1 0x0000008C // USB Receive Functional Address + // Endpoint 1 +#define USB_O_RXHUBADDR1 0x0000008E // USB Receive Hub Address Endpoint + // 1 +#define USB_O_RXHUBPORT1 0x0000008F // USB Receive Hub Port Endpoint 1 +#define USB_O_TXFUNCADDR2 0x00000090 // USB Transmit Functional Address + // Endpoint 2 +#define USB_O_TXHUBADDR2 0x00000092 // USB Transmit Hub Address + // Endpoint 2 +#define USB_O_TXHUBPORT2 0x00000093 // USB Transmit Hub Port Endpoint 2 +#define USB_O_RXFUNCADDR2 0x00000094 // USB Receive Functional Address + // Endpoint 2 +#define USB_O_RXHUBADDR2 0x00000096 // USB Receive Hub Address Endpoint + // 2 +#define USB_O_RXHUBPORT2 0x00000097 // USB Receive Hub Port Endpoint 2 +#define USB_O_TXFUNCADDR3 0x00000098 // USB Transmit Functional Address + // Endpoint 3 +#define USB_O_TXHUBADDR3 0x0000009A // USB Transmit Hub Address + // Endpoint 3 +#define USB_O_TXHUBPORT3 0x0000009B // USB Transmit Hub Port Endpoint 3 +#define USB_O_RXFUNCADDR3 0x0000009C // USB Receive Functional Address + // Endpoint 3 +#define USB_O_RXHUBADDR3 0x0000009E // USB Receive Hub Address Endpoint + // 3 +#define USB_O_RXHUBPORT3 0x0000009F // USB Receive Hub Port Endpoint 3 +#define USB_O_TXFUNCADDR4 0x000000A0 // USB Transmit Functional Address + // Endpoint 4 +#define USB_O_TXHUBADDR4 0x000000A2 // USB Transmit Hub Address + // Endpoint 4 +#define USB_O_TXHUBPORT4 0x000000A3 // USB Transmit Hub Port Endpoint 4 +#define USB_O_RXFUNCADDR4 0x000000A4 // USB Receive Functional Address + // Endpoint 4 +#define USB_O_RXHUBADDR4 0x000000A6 // USB Receive Hub Address Endpoint + // 4 +#define USB_O_RXHUBPORT4 0x000000A7 // USB Receive Hub Port Endpoint 4 +#define USB_O_TXFUNCADDR5 0x000000A8 // USB Transmit Functional Address + // Endpoint 5 +#define USB_O_TXHUBADDR5 0x000000AA // USB Transmit Hub Address + // Endpoint 5 +#define USB_O_TXHUBPORT5 0x000000AB // USB Transmit Hub Port Endpoint 5 +#define USB_O_RXFUNCADDR5 0x000000AC // USB Receive Functional Address + // Endpoint 5 +#define USB_O_RXHUBADDR5 0x000000AE // USB Receive Hub Address Endpoint + // 5 +#define USB_O_RXHUBPORT5 0x000000AF // USB Receive Hub Port Endpoint 5 +#define USB_O_TXFUNCADDR6 0x000000B0 // USB Transmit Functional Address + // Endpoint 6 +#define USB_O_TXHUBADDR6 0x000000B2 // USB Transmit Hub Address + // Endpoint 6 +#define USB_O_TXHUBPORT6 0x000000B3 // USB Transmit Hub Port Endpoint 6 +#define USB_O_RXFUNCADDR6 0x000000B4 // USB Receive Functional Address + // Endpoint 6 +#define USB_O_RXHUBADDR6 0x000000B6 // USB Receive Hub Address Endpoint + // 6 +#define USB_O_RXHUBPORT6 0x000000B7 // USB Receive Hub Port Endpoint 6 +#define USB_O_TXFUNCADDR7 0x000000B8 // USB Transmit Functional Address + // Endpoint 7 +#define USB_O_TXHUBADDR7 0x000000BA // USB Transmit Hub Address + // Endpoint 7 +#define USB_O_TXHUBPORT7 0x000000BB // USB Transmit Hub Port Endpoint 7 +#define USB_O_RXFUNCADDR7 0x000000BC // USB Receive Functional Address + // Endpoint 7 +#define USB_O_RXHUBADDR7 0x000000BE // USB Receive Hub Address Endpoint + // 7 +#define USB_O_RXHUBPORT7 0x000000BF // USB Receive Hub Port Endpoint 7 +#define USB_O_CSRL0 0x00000102 // USB Control and Status Endpoint + // 0 Low +#define USB_O_CSRH0 0x00000103 // USB Control and Status Endpoint + // 0 High +#define USB_O_COUNT0 0x00000108 // USB Receive Byte Count Endpoint + // 0 +#define USB_O_TYPE0 0x0000010A // USB Type Endpoint 0 +#define USB_O_NAKLMT 0x0000010B // USB NAK Limit +#define USB_O_TXMAXP1 0x00000110 // USB Maximum Transmit Data + // Endpoint 1 +#define USB_O_TXCSRL1 0x00000112 // USB Transmit Control and Status + // Endpoint 1 Low +#define USB_O_TXCSRH1 0x00000113 // USB Transmit Control and Status + // Endpoint 1 High +#define USB_O_RXMAXP1 0x00000114 // USB Maximum Receive Data + // Endpoint 1 +#define USB_O_RXCSRL1 0x00000116 // USB Receive Control and Status + // Endpoint 1 Low +#define USB_O_RXCSRH1 0x00000117 // USB Receive Control and Status + // Endpoint 1 High +#define USB_O_RXCOUNT1 0x00000118 // USB Receive Byte Count Endpoint + // 1 +#define USB_O_TXTYPE1 0x0000011A // USB Host Transmit Configure Type + // Endpoint 1 +#define USB_O_TXINTERVAL1 0x0000011B // USB Host Transmit Interval + // Endpoint 1 +#define USB_O_RXTYPE1 0x0000011C // USB Host Configure Receive Type + // Endpoint 1 +#define USB_O_RXINTERVAL1 0x0000011D // USB Host Receive Polling + // Interval Endpoint 1 +#define USB_O_TXMAXP2 0x00000120 // USB Maximum Transmit Data + // Endpoint 2 +#define USB_O_TXCSRL2 0x00000122 // USB Transmit Control and Status + // Endpoint 2 Low +#define USB_O_TXCSRH2 0x00000123 // USB Transmit Control and Status + // Endpoint 2 High +#define USB_O_RXMAXP2 0x00000124 // USB Maximum Receive Data + // Endpoint 2 +#define USB_O_RXCSRL2 0x00000126 // USB Receive Control and Status + // Endpoint 2 Low +#define USB_O_RXCSRH2 0x00000127 // USB Receive Control and Status + // Endpoint 2 High +#define USB_O_RXCOUNT2 0x00000128 // USB Receive Byte Count Endpoint + // 2 +#define USB_O_TXTYPE2 0x0000012A // USB Host Transmit Configure Type + // Endpoint 2 +#define USB_O_TXINTERVAL2 0x0000012B // USB Host Transmit Interval + // Endpoint 2 +#define USB_O_RXTYPE2 0x0000012C // USB Host Configure Receive Type + // Endpoint 2 +#define USB_O_RXINTERVAL2 0x0000012D // USB Host Receive Polling + // Interval Endpoint 2 +#define USB_O_TXMAXP3 0x00000130 // USB Maximum Transmit Data + // Endpoint 3 +#define USB_O_TXCSRL3 0x00000132 // USB Transmit Control and Status + // Endpoint 3 Low +#define USB_O_TXCSRH3 0x00000133 // USB Transmit Control and Status + // Endpoint 3 High +#define USB_O_RXMAXP3 0x00000134 // USB Maximum Receive Data + // Endpoint 3 +#define USB_O_RXCSRL3 0x00000136 // USB Receive Control and Status + // Endpoint 3 Low +#define USB_O_RXCSRH3 0x00000137 // USB Receive Control and Status + // Endpoint 3 High +#define USB_O_RXCOUNT3 0x00000138 // USB Receive Byte Count Endpoint + // 3 +#define USB_O_TXTYPE3 0x0000013A // USB Host Transmit Configure Type + // Endpoint 3 +#define USB_O_TXINTERVAL3 0x0000013B // USB Host Transmit Interval + // Endpoint 3 +#define USB_O_RXTYPE3 0x0000013C // USB Host Configure Receive Type + // Endpoint 3 +#define USB_O_RXINTERVAL3 0x0000013D // USB Host Receive Polling + // Interval Endpoint 3 +#define USB_O_TXMAXP4 0x00000140 // USB Maximum Transmit Data + // Endpoint 4 +#define USB_O_TXCSRL4 0x00000142 // USB Transmit Control and Status + // Endpoint 4 Low +#define USB_O_TXCSRH4 0x00000143 // USB Transmit Control and Status + // Endpoint 4 High +#define USB_O_RXMAXP4 0x00000144 // USB Maximum Receive Data + // Endpoint 4 +#define USB_O_RXCSRL4 0x00000146 // USB Receive Control and Status + // Endpoint 4 Low +#define USB_O_RXCSRH4 0x00000147 // USB Receive Control and Status + // Endpoint 4 High +#define USB_O_RXCOUNT4 0x00000148 // USB Receive Byte Count Endpoint + // 4 +#define USB_O_TXTYPE4 0x0000014A // USB Host Transmit Configure Type + // Endpoint 4 +#define USB_O_TXINTERVAL4 0x0000014B // USB Host Transmit Interval + // Endpoint 4 +#define USB_O_RXTYPE4 0x0000014C // USB Host Configure Receive Type + // Endpoint 4 +#define USB_O_RXINTERVAL4 0x0000014D // USB Host Receive Polling + // Interval Endpoint 4 +#define USB_O_TXMAXP5 0x00000150 // USB Maximum Transmit Data + // Endpoint 5 +#define USB_O_TXCSRL5 0x00000152 // USB Transmit Control and Status + // Endpoint 5 Low +#define USB_O_TXCSRH5 0x00000153 // USB Transmit Control and Status + // Endpoint 5 High +#define USB_O_RXMAXP5 0x00000154 // USB Maximum Receive Data + // Endpoint 5 +#define USB_O_RXCSRL5 0x00000156 // USB Receive Control and Status + // Endpoint 5 Low +#define USB_O_RXCSRH5 0x00000157 // USB Receive Control and Status + // Endpoint 5 High +#define USB_O_RXCOUNT5 0x00000158 // USB Receive Byte Count Endpoint + // 5 +#define USB_O_TXTYPE5 0x0000015A // USB Host Transmit Configure Type + // Endpoint 5 +#define USB_O_TXINTERVAL5 0x0000015B // USB Host Transmit Interval + // Endpoint 5 +#define USB_O_RXTYPE5 0x0000015C // USB Host Configure Receive Type + // Endpoint 5 +#define USB_O_RXINTERVAL5 0x0000015D // USB Host Receive Polling + // Interval Endpoint 5 +#define USB_O_TXMAXP6 0x00000160 // USB Maximum Transmit Data + // Endpoint 6 +#define USB_O_TXCSRL6 0x00000162 // USB Transmit Control and Status + // Endpoint 6 Low +#define USB_O_TXCSRH6 0x00000163 // USB Transmit Control and Status + // Endpoint 6 High +#define USB_O_RXMAXP6 0x00000164 // USB Maximum Receive Data + // Endpoint 6 +#define USB_O_RXCSRL6 0x00000166 // USB Receive Control and Status + // Endpoint 6 Low +#define USB_O_RXCSRH6 0x00000167 // USB Receive Control and Status + // Endpoint 6 High +#define USB_O_RXCOUNT6 0x00000168 // USB Receive Byte Count Endpoint + // 6 +#define USB_O_TXTYPE6 0x0000016A // USB Host Transmit Configure Type + // Endpoint 6 +#define USB_O_TXINTERVAL6 0x0000016B // USB Host Transmit Interval + // Endpoint 6 +#define USB_O_RXTYPE6 0x0000016C // USB Host Configure Receive Type + // Endpoint 6 +#define USB_O_RXINTERVAL6 0x0000016D // USB Host Receive Polling + // Interval Endpoint 6 +#define USB_O_TXMAXP7 0x00000170 // USB Maximum Transmit Data + // Endpoint 7 +#define USB_O_TXCSRL7 0x00000172 // USB Transmit Control and Status + // Endpoint 7 Low +#define USB_O_TXCSRH7 0x00000173 // USB Transmit Control and Status + // Endpoint 7 High +#define USB_O_RXMAXP7 0x00000174 // USB Maximum Receive Data + // Endpoint 7 +#define USB_O_RXCSRL7 0x00000176 // USB Receive Control and Status + // Endpoint 7 Low +#define USB_O_RXCSRH7 0x00000177 // USB Receive Control and Status + // Endpoint 7 High +#define USB_O_RXCOUNT7 0x00000178 // USB Receive Byte Count Endpoint + // 7 +#define USB_O_TXTYPE7 0x0000017A // USB Host Transmit Configure Type + // Endpoint 7 +#define USB_O_TXINTERVAL7 0x0000017B // USB Host Transmit Interval + // Endpoint 7 +#define USB_O_RXTYPE7 0x0000017C // USB Host Configure Receive Type + // Endpoint 7 +#define USB_O_RXINTERVAL7 0x0000017D // USB Host Receive Polling + // Interval Endpoint 7 +#define USB_O_DMAINTR 0x00000200 // USB DMA Interrupt +#define USB_O_DMACTL0 0x00000204 // USB DMA Control 0 +#define USB_O_DMAADDR0 0x00000208 // USB DMA Address 0 +#define USB_O_DMACOUNT0 0x0000020C // USB DMA Count 0 +#define USB_O_DMACTL1 0x00000214 // USB DMA Control 1 +#define USB_O_DMAADDR1 0x00000218 // USB DMA Address 1 +#define USB_O_DMACOUNT1 0x0000021C // USB DMA Count 1 +#define USB_O_DMACTL2 0x00000224 // USB DMA Control 2 +#define USB_O_DMAADDR2 0x00000228 // USB DMA Address 2 +#define USB_O_DMACOUNT2 0x0000022C // USB DMA Count 2 +#define USB_O_DMACTL3 0x00000234 // USB DMA Control 3 +#define USB_O_DMAADDR3 0x00000238 // USB DMA Address 3 +#define USB_O_DMACOUNT3 0x0000023C // USB DMA Count 3 +#define USB_O_DMACTL4 0x00000244 // USB DMA Control 4 +#define USB_O_DMAADDR4 0x00000248 // USB DMA Address 4 +#define USB_O_DMACOUNT4 0x0000024C // USB DMA Count 4 +#define USB_O_DMACTL5 0x00000254 // USB DMA Control 5 +#define USB_O_DMAADDR5 0x00000258 // USB DMA Address 5 +#define USB_O_DMACOUNT5 0x0000025C // USB DMA Count 5 +#define USB_O_DMACTL6 0x00000264 // USB DMA Control 6 +#define USB_O_DMAADDR6 0x00000268 // USB DMA Address 6 +#define USB_O_DMACOUNT6 0x0000026C // USB DMA Count 6 +#define USB_O_DMACTL7 0x00000274 // USB DMA Control 7 +#define USB_O_DMAADDR7 0x00000278 // USB DMA Address 7 +#define USB_O_DMACOUNT7 0x0000027C // USB DMA Count 7 +#define USB_O_RQPKTCOUNT1 0x00000304 // USB Request Packet Count in + // Block Transfer Endpoint 1 +#define USB_O_RQPKTCOUNT2 0x00000308 // USB Request Packet Count in + // Block Transfer Endpoint 2 +#define USB_O_RQPKTCOUNT3 0x0000030C // USB Request Packet Count in + // Block Transfer Endpoint 3 +#define USB_O_RQPKTCOUNT4 0x00000310 // USB Request Packet Count in + // Block Transfer Endpoint 4 +#define USB_O_RQPKTCOUNT5 0x00000314 // USB Request Packet Count in + // Block Transfer Endpoint 5 +#define USB_O_RQPKTCOUNT6 0x00000318 // USB Request Packet Count in + // Block Transfer Endpoint 6 +#define USB_O_RQPKTCOUNT7 0x0000031C // USB Request Packet Count in + // Block Transfer Endpoint 7 +#define USB_O_RXDPKTBUFDIS 0x00000340 // USB Receive Double Packet Buffer + // Disable +#define USB_O_TXDPKTBUFDIS 0x00000342 // USB Transmit Double Packet + // Buffer Disable +#define USB_O_CTO 0x00000344 // USB Chirp Timeout +#define USB_O_HHSRTN 0x00000346 // USB High Speed to UTM Operating + // Delay +#define USB_O_HSBT 0x00000348 // USB High Speed Time-out Adder +#define USB_O_LPMATTR 0x00000360 // USB LPM Attributes +#define USB_O_LPMCNTRL 0x00000362 // USB LPM Control +#define USB_O_LPMIM 0x00000363 // USB LPM Interrupt Mask +#define USB_O_LPMRIS 0x00000364 // USB LPM Raw Interrupt Status +#define USB_O_LPMFADDR 0x00000365 // USB LPM Function Address +#define USB_O_EPC 0x00000400 // USB External Power Control +#define USB_O_EPCRIS 0x00000404 // USB External Power Control Raw + // Interrupt Status +#define USB_O_EPCIM 0x00000408 // USB External Power Control + // Interrupt Mask +#define USB_O_EPCISC 0x0000040C // USB External Power Control + // Interrupt Status and Clear +#define USB_O_DRRIS 0x00000410 // USB Device RESUME Raw Interrupt + // Status +#define USB_O_DRIM 0x00000414 // USB Device RESUME Interrupt Mask +#define USB_O_DRISC 0x00000418 // USB Device RESUME Interrupt + // Status and Clear +#define USB_O_GPCS 0x0000041C // USB General-Purpose Control and + // Status +#define USB_O_VDC 0x00000430 // USB VBUS Droop Control +#define USB_O_VDCRIS 0x00000434 // USB VBUS Droop Control Raw + // Interrupt Status +#define USB_O_VDCIM 0x00000438 // USB VBUS Droop Control Interrupt + // Mask +#define USB_O_VDCISC 0x0000043C // USB VBUS Droop Control Interrupt + // Status and Clear +#define USB_O_IDVRIS 0x00000444 // USB ID Valid Detect Raw + // Interrupt Status +#define USB_O_IDVIM 0x00000448 // USB ID Valid Detect Interrupt + // Mask +#define USB_O_IDVISC 0x0000044C // USB ID Valid Detect Interrupt + // Status and Clear +#define USB_O_PP 0x00000FC0 // USB Peripheral Properties +#define USB_O_PC 0x00000FC4 // USB Peripheral Configuration +#define USB_O_CC 0x00000FC8 // USB Clock Configuration + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FADDR register. +// +//***************************************************************************** +#define USB_FADDR_M 0x0000007F // Function Address +#define USB_FADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_POWER register. +// +//***************************************************************************** +#define USB_POWER_ISOUP 0x00000080 // Isochronous Update +#define USB_POWER_SOFTCONN 0x00000040 // Soft Connect/Disconnect +#define USB_POWER_HSENAB 0x00000020 // High Speed Enable +#define USB_POWER_HSMODE 0x00000010 // High Speed Enable +#define USB_POWER_RESET 0x00000008 // RESET Signaling +#define USB_POWER_RESUME 0x00000004 // RESUME Signaling +#define USB_POWER_SUSPEND 0x00000002 // SUSPEND Mode +#define USB_POWER_PWRDNPHY 0x00000001 // Power Down PHY + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXIS register. +// +//***************************************************************************** +#define USB_TXIS_EP7 0x00000080 // TX Endpoint 7 Interrupt +#define USB_TXIS_EP6 0x00000040 // TX Endpoint 6 Interrupt +#define USB_TXIS_EP5 0x00000020 // TX Endpoint 5 Interrupt +#define USB_TXIS_EP4 0x00000010 // TX Endpoint 4 Interrupt +#define USB_TXIS_EP3 0x00000008 // TX Endpoint 3 Interrupt +#define USB_TXIS_EP2 0x00000004 // TX Endpoint 2 Interrupt +#define USB_TXIS_EP1 0x00000002 // TX Endpoint 1 Interrupt +#define USB_TXIS_EP0 0x00000001 // TX and RX Endpoint 0 Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXIS register. +// +//***************************************************************************** +#define USB_RXIS_EP7 0x00000080 // RX Endpoint 7 Interrupt +#define USB_RXIS_EP6 0x00000040 // RX Endpoint 6 Interrupt +#define USB_RXIS_EP5 0x00000020 // RX Endpoint 5 Interrupt +#define USB_RXIS_EP4 0x00000010 // RX Endpoint 4 Interrupt +#define USB_RXIS_EP3 0x00000008 // RX Endpoint 3 Interrupt +#define USB_RXIS_EP2 0x00000004 // RX Endpoint 2 Interrupt +#define USB_RXIS_EP1 0x00000002 // RX Endpoint 1 Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXIE register. +// +//***************************************************************************** +#define USB_TXIE_EP7 0x00000080 // TX Endpoint 7 Interrupt Enable +#define USB_TXIE_EP6 0x00000040 // TX Endpoint 6 Interrupt Enable +#define USB_TXIE_EP5 0x00000020 // TX Endpoint 5 Interrupt Enable +#define USB_TXIE_EP4 0x00000010 // TX Endpoint 4 Interrupt Enable +#define USB_TXIE_EP3 0x00000008 // TX Endpoint 3 Interrupt Enable +#define USB_TXIE_EP2 0x00000004 // TX Endpoint 2 Interrupt Enable +#define USB_TXIE_EP1 0x00000002 // TX Endpoint 1 Interrupt Enable +#define USB_TXIE_EP0 0x00000001 // TX and RX Endpoint 0 Interrupt + // Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXIE register. +// +//***************************************************************************** +#define USB_RXIE_EP7 0x00000080 // RX Endpoint 7 Interrupt Enable +#define USB_RXIE_EP6 0x00000040 // RX Endpoint 6 Interrupt Enable +#define USB_RXIE_EP5 0x00000020 // RX Endpoint 5 Interrupt Enable +#define USB_RXIE_EP4 0x00000010 // RX Endpoint 4 Interrupt Enable +#define USB_RXIE_EP3 0x00000008 // RX Endpoint 3 Interrupt Enable +#define USB_RXIE_EP2 0x00000004 // RX Endpoint 2 Interrupt Enable +#define USB_RXIE_EP1 0x00000002 // RX Endpoint 1 Interrupt Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IS register. +// +//***************************************************************************** +#define USB_IS_VBUSERR 0x00000080 // VBUS Error (OTG only) +#define USB_IS_SESREQ 0x00000040 // SESSION REQUEST (OTG only) +#define USB_IS_DISCON 0x00000020 // Session Disconnect (OTG only) +#define USB_IS_CONN 0x00000010 // Session Connect +#define USB_IS_SOF 0x00000008 // Start of Frame +#define USB_IS_BABBLE 0x00000004 // Babble Detected +#define USB_IS_RESET 0x00000004 // RESET Signaling Detected +#define USB_IS_RESUME 0x00000002 // RESUME Signaling Detected +#define USB_IS_SUSPEND 0x00000001 // SUSPEND Signaling Detected + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IE register. +// +//***************************************************************************** +#define USB_IE_VBUSERR 0x00000080 // Enable VBUS Error Interrupt (OTG + // only) +#define USB_IE_SESREQ 0x00000040 // Enable Session Request (OTG + // only) +#define USB_IE_DISCON 0x00000020 // Enable Disconnect Interrupt +#define USB_IE_CONN 0x00000010 // Enable Connect Interrupt +#define USB_IE_SOF 0x00000008 // Enable Start-of-Frame Interrupt +#define USB_IE_BABBLE 0x00000004 // Enable Babble Interrupt +#define USB_IE_RESET 0x00000004 // Enable RESET Interrupt +#define USB_IE_RESUME 0x00000002 // Enable RESUME Interrupt +#define USB_IE_SUSPND 0x00000001 // Enable SUSPEND Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FRAME register. +// +//***************************************************************************** +#define USB_FRAME_M 0x000007FF // Frame Number +#define USB_FRAME_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPIDX register. +// +//***************************************************************************** +#define USB_EPIDX_EPIDX_M 0x0000000F // Endpoint Index +#define USB_EPIDX_EPIDX_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TEST register. +// +//***************************************************************************** +#define USB_TEST_FORCEH 0x00000080 // Force Host Mode +#define USB_TEST_FIFOACC 0x00000040 // FIFO Access +#define USB_TEST_FORCEFS 0x00000020 // Force Full-Speed Mode +#define USB_TEST_FORCEHS 0x00000010 // Force High-Speed Mode +#define USB_TEST_TESTPKT 0x00000008 // Test Packet Mode Enable +#define USB_TEST_TESTK 0x00000004 // Test_K Mode Enable +#define USB_TEST_TESTJ 0x00000002 // Test_J Mode Enable +#define USB_TEST_TESTSE0NAK 0x00000001 // Test_SE0_NAK Test Mode Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO0 register. +// +//***************************************************************************** +#define USB_FIFO0_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO0_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO1 register. +// +//***************************************************************************** +#define USB_FIFO1_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO1_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO2 register. +// +//***************************************************************************** +#define USB_FIFO2_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO2_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO3 register. +// +//***************************************************************************** +#define USB_FIFO3_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO3_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO4 register. +// +//***************************************************************************** +#define USB_FIFO4_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO4_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO5 register. +// +//***************************************************************************** +#define USB_FIFO5_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO5_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO6 register. +// +//***************************************************************************** +#define USB_FIFO6_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO6_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO7 register. +// +//***************************************************************************** +#define USB_FIFO7_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO7_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DEVCTL register. +// +//***************************************************************************** +#define USB_DEVCTL_DEV 0x00000080 // Device Mode (OTG only) +#define USB_DEVCTL_FSDEV 0x00000040 // Full-Speed Device Detected +#define USB_DEVCTL_LSDEV 0x00000020 // Low-Speed Device Detected +#define USB_DEVCTL_VBUS_M 0x00000018 // VBUS Level (OTG only) +#define USB_DEVCTL_VBUS_NONE 0x00000000 // Below SessionEnd +#define USB_DEVCTL_VBUS_SEND 0x00000008 // Above SessionEnd, below AValid +#define USB_DEVCTL_VBUS_AVALID 0x00000010 // Above AValid, below VBUSValid +#define USB_DEVCTL_VBUS_VALID 0x00000018 // Above VBUSValid +#define USB_DEVCTL_HOST 0x00000004 // Host Mode +#define USB_DEVCTL_HOSTREQ 0x00000002 // Host Request (OTG only) +#define USB_DEVCTL_SESSION 0x00000001 // Session Start/End (OTG only) + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CCONF register. +// +//***************************************************************************** +#define USB_CCONF_TXEDMA 0x00000002 // TX Early DMA Enable +#define USB_CCONF_RXEDMA 0x00000001 // TX Early DMA Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFIFOSZ register. +// +//***************************************************************************** +#define USB_TXFIFOSZ_DPB 0x00000010 // Double Packet Buffer Support +#define USB_TXFIFOSZ_SIZE_M 0x0000000F // Max Packet Size +#define USB_TXFIFOSZ_SIZE_8 0x00000000 // 8 +#define USB_TXFIFOSZ_SIZE_16 0x00000001 // 16 +#define USB_TXFIFOSZ_SIZE_32 0x00000002 // 32 +#define USB_TXFIFOSZ_SIZE_64 0x00000003 // 64 +#define USB_TXFIFOSZ_SIZE_128 0x00000004 // 128 +#define USB_TXFIFOSZ_SIZE_256 0x00000005 // 256 +#define USB_TXFIFOSZ_SIZE_512 0x00000006 // 512 +#define USB_TXFIFOSZ_SIZE_1024 0x00000007 // 1024 +#define USB_TXFIFOSZ_SIZE_2048 0x00000008 // 2048 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFIFOSZ register. +// +//***************************************************************************** +#define USB_RXFIFOSZ_DPB 0x00000010 // Double Packet Buffer Support +#define USB_RXFIFOSZ_SIZE_M 0x0000000F // Max Packet Size +#define USB_RXFIFOSZ_SIZE_8 0x00000000 // 8 +#define USB_RXFIFOSZ_SIZE_16 0x00000001 // 16 +#define USB_RXFIFOSZ_SIZE_32 0x00000002 // 32 +#define USB_RXFIFOSZ_SIZE_64 0x00000003 // 64 +#define USB_RXFIFOSZ_SIZE_128 0x00000004 // 128 +#define USB_RXFIFOSZ_SIZE_256 0x00000005 // 256 +#define USB_RXFIFOSZ_SIZE_512 0x00000006 // 512 +#define USB_RXFIFOSZ_SIZE_1024 0x00000007 // 1024 +#define USB_RXFIFOSZ_SIZE_2048 0x00000008 // 2048 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFIFOADD +// register. +// +//***************************************************************************** +#define USB_TXFIFOADD_ADDR_M 0x000001FF // Transmit/Receive Start Address +#define USB_TXFIFOADD_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFIFOADD +// register. +// +//***************************************************************************** +#define USB_RXFIFOADD_ADDR_M 0x000001FF // Transmit/Receive Start Address +#define USB_RXFIFOADD_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_ULPIVBUSCTL +// register. +// +//***************************************************************************** +#define USB_ULPIVBUSCTL_USEEXTVBUSIND \ + 0x00000002 // Use External VBUS Indicator +#define USB_ULPIVBUSCTL_USEEXTVBUS \ + 0x00000001 // Use External VBUS + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_ULPIREGDATA +// register. +// +//***************************************************************************** +#define USB_ULPIREGDATA_REGDATA_M \ + 0x000000FF // Register Data +#define USB_ULPIREGDATA_REGDATA_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_ULPIREGADDR +// register. +// +//***************************************************************************** +#define USB_ULPIREGADDR_ADDR_M 0x000000FF // Register Address +#define USB_ULPIREGADDR_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_ULPIREGCTL +// register. +// +//***************************************************************************** +#define USB_ULPIREGCTL_RDWR 0x00000004 // Read/Write Control +#define USB_ULPIREGCTL_REGCMPLT 0x00000002 // Register Access Complete +#define USB_ULPIREGCTL_REGACC 0x00000001 // Initiate Register Access + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPINFO register. +// +//***************************************************************************** +#define USB_EPINFO_RXEP_M 0x000000F0 // RX Endpoints +#define USB_EPINFO_TXEP_M 0x0000000F // TX Endpoints +#define USB_EPINFO_RXEP_S 4 +#define USB_EPINFO_TXEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RAMINFO register. +// +//***************************************************************************** +#define USB_RAMINFO_DMACHAN_M 0x000000F0 // DMA Channels +#define USB_RAMINFO_RAMBITS_M 0x0000000F // RAM Address Bus Width +#define USB_RAMINFO_DMACHAN_S 4 +#define USB_RAMINFO_RAMBITS_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CONTIM register. +// +//***************************************************************************** +#define USB_CONTIM_WTCON_M 0x000000F0 // Connect Wait +#define USB_CONTIM_WTID_M 0x0000000F // Wait ID +#define USB_CONTIM_WTCON_S 4 +#define USB_CONTIM_WTID_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VPLEN register. +// +//***************************************************************************** +#define USB_VPLEN_VPLEN_M 0x000000FF // VBUS Pulse Length +#define USB_VPLEN_VPLEN_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_HSEOF register. +// +//***************************************************************************** +#define USB_HSEOF_HSEOFG_M 0x000000FF // HIgh-Speed End-of-Frame Gap +#define USB_HSEOF_HSEOFG_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FSEOF register. +// +//***************************************************************************** +#define USB_FSEOF_FSEOFG_M 0x000000FF // Full-Speed End-of-Frame Gap +#define USB_FSEOF_FSEOFG_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_LSEOF register. +// +//***************************************************************************** +#define USB_LSEOF_LSEOFG_M 0x000000FF // Low-Speed End-of-Frame Gap +#define USB_LSEOF_LSEOFG_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR0 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR0_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR0_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR0 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR0_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR0_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT0 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT0_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT0_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR1 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR1_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR1 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR1_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT1 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT1_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT1_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR1 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR1_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR1 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR1_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT1 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT1_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT1_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR2 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR2_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR2 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR2_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT2 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT2_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT2_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR2 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR2_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR2 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR2_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT2 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT2_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT2_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR3 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR3_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR3 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR3_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT3 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT3_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT3_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR3 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR3_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR3 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR3_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT3 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT3_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT3_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR4 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR4_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR4 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR4_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT4 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT4_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT4_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR4 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR4_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR4 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR4_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT4 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT4_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT4_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR5 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR5_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR5 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR5_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT5 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT5_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT5_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR5 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR5_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR5 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR5_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT5 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT5_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT5_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR6 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR6_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR6 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR6_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT6 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT6_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT6_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR6 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR6_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR6 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR6_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT6 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT6_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT6_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR7 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR7_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR7 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR7_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT7 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT7_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT7_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR7 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR7_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR7 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR7_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT7 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT7_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT7_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CSRL0 register. +// +//***************************************************************************** +#define USB_CSRL0_NAKTO 0x00000080 // NAK Timeout +#define USB_CSRL0_SETENDC 0x00000080 // Setup End Clear +#define USB_CSRL0_STATUS 0x00000040 // STATUS Packet +#define USB_CSRL0_RXRDYC 0x00000040 // RXRDY Clear +#define USB_CSRL0_REQPKT 0x00000020 // Request Packet +#define USB_CSRL0_STALL 0x00000020 // Send Stall +#define USB_CSRL0_SETEND 0x00000010 // Setup End +#define USB_CSRL0_ERROR 0x00000010 // Error +#define USB_CSRL0_DATAEND 0x00000008 // Data End +#define USB_CSRL0_SETUP 0x00000008 // Setup Packet +#define USB_CSRL0_STALLED 0x00000004 // Endpoint Stalled +#define USB_CSRL0_TXRDY 0x00000002 // Transmit Packet Ready +#define USB_CSRL0_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CSRH0 register. +// +//***************************************************************************** +#define USB_CSRH0_DISPING 0x00000008 // PING Disable +#define USB_CSRH0_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_CSRH0_DT 0x00000002 // Data Toggle +#define USB_CSRH0_FLUSH 0x00000001 // Flush FIFO + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_COUNT0 register. +// +//***************************************************************************** +#define USB_COUNT0_COUNT_M 0x0000007F // FIFO Count +#define USB_COUNT0_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TYPE0 register. +// +//***************************************************************************** +#define USB_TYPE0_SPEED_M 0x000000C0 // Operating Speed +#define USB_TYPE0_SPEED_HIGH 0x00000040 // High +#define USB_TYPE0_SPEED_FULL 0x00000080 // Full +#define USB_TYPE0_SPEED_LOW 0x000000C0 // Low + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_NAKLMT register. +// +//***************************************************************************** +#define USB_NAKLMT_NAKLMT_M 0x0000001F // EP0 NAK Limit +#define USB_NAKLMT_NAKLMT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP1 register. +// +//***************************************************************************** +#define USB_TXMAXP1_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP1_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL1 register. +// +//***************************************************************************** +#define USB_TXCSRL1_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL1_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL1_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL1_STALL 0x00000010 // Send STALL +#define USB_TXCSRL1_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL1_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL1_ERROR 0x00000004 // Error +#define USB_TXCSRL1_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL1_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL1_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH1 register. +// +//***************************************************************************** +#define USB_TXCSRH1_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH1_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH1_MODE 0x00000020 // Mode +#define USB_TXCSRH1_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH1_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH1_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH1_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH1_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP1 register. +// +//***************************************************************************** +#define USB_RXMAXP1_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP1_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL1 register. +// +//***************************************************************************** +#define USB_RXCSRL1_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL1_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL1_STALL 0x00000020 // Send STALL +#define USB_RXCSRL1_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL1_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL1_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL1_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL1_OVER 0x00000004 // Overrun +#define USB_RXCSRL1_ERROR 0x00000004 // Error +#define USB_RXCSRL1_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL1_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH1 register. +// +//***************************************************************************** +#define USB_RXCSRH1_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH1_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH1_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH1_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH1_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH1_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH1_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH1_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH1_DT 0x00000002 // Data Toggle +#define USB_RXCSRH1_INCOMPRX 0x00000001 // Incomplete RX Transmission + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT1 register. +// +//***************************************************************************** +#define USB_RXCOUNT1_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT1_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE1 register. +// +//***************************************************************************** +#define USB_TXTYPE1_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE1_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE1_SPEED_HIGH 0x00000040 // High +#define USB_TXTYPE1_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE1_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE1_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE1_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE1_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE1_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE1_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE1_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE1_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL1 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL1_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL1_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL1_TXPOLL_S \ + 0 +#define USB_TXINTERVAL1_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE1 register. +// +//***************************************************************************** +#define USB_RXTYPE1_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE1_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE1_SPEED_HIGH 0x00000040 // High +#define USB_RXTYPE1_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE1_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE1_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE1_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE1_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE1_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE1_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE1_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE1_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL1 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL1_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL1_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL1_TXPOLL_S \ + 0 +#define USB_RXINTERVAL1_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP2 register. +// +//***************************************************************************** +#define USB_TXMAXP2_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP2_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL2 register. +// +//***************************************************************************** +#define USB_TXCSRL2_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL2_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL2_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL2_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL2_STALL 0x00000010 // Send STALL +#define USB_TXCSRL2_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL2_ERROR 0x00000004 // Error +#define USB_TXCSRL2_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL2_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL2_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH2 register. +// +//***************************************************************************** +#define USB_TXCSRH2_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH2_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH2_MODE 0x00000020 // Mode +#define USB_TXCSRH2_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH2_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH2_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH2_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH2_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP2 register. +// +//***************************************************************************** +#define USB_RXMAXP2_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP2_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL2 register. +// +//***************************************************************************** +#define USB_RXCSRL2_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL2_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL2_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL2_STALL 0x00000020 // Send STALL +#define USB_RXCSRL2_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL2_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL2_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL2_ERROR 0x00000004 // Error +#define USB_RXCSRL2_OVER 0x00000004 // Overrun +#define USB_RXCSRL2_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL2_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH2 register. +// +//***************************************************************************** +#define USB_RXCSRH2_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH2_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH2_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH2_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH2_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH2_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH2_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH2_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH2_DT 0x00000002 // Data Toggle +#define USB_RXCSRH2_INCOMPRX 0x00000001 // Incomplete RX Transmission + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT2 register. +// +//***************************************************************************** +#define USB_RXCOUNT2_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT2_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE2 register. +// +//***************************************************************************** +#define USB_TXTYPE2_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE2_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE2_SPEED_HIGH 0x00000040 // High +#define USB_TXTYPE2_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE2_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE2_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE2_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE2_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE2_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE2_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE2_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE2_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL2 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL2_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL2_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL2_NAKLMT_S \ + 0 +#define USB_TXINTERVAL2_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE2 register. +// +//***************************************************************************** +#define USB_RXTYPE2_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE2_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE2_SPEED_HIGH 0x00000040 // High +#define USB_RXTYPE2_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE2_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE2_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE2_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE2_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE2_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE2_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE2_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE2_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL2 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL2_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL2_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL2_TXPOLL_S \ + 0 +#define USB_RXINTERVAL2_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP3 register. +// +//***************************************************************************** +#define USB_TXMAXP3_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP3_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL3 register. +// +//***************************************************************************** +#define USB_TXCSRL3_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL3_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL3_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL3_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL3_STALL 0x00000010 // Send STALL +#define USB_TXCSRL3_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL3_ERROR 0x00000004 // Error +#define USB_TXCSRL3_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL3_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL3_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH3 register. +// +//***************************************************************************** +#define USB_TXCSRH3_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH3_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH3_MODE 0x00000020 // Mode +#define USB_TXCSRH3_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH3_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH3_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH3_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH3_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP3 register. +// +//***************************************************************************** +#define USB_RXMAXP3_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP3_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL3 register. +// +//***************************************************************************** +#define USB_RXCSRL3_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL3_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL3_STALL 0x00000020 // Send STALL +#define USB_RXCSRL3_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL3_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL3_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL3_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL3_ERROR 0x00000004 // Error +#define USB_RXCSRL3_OVER 0x00000004 // Overrun +#define USB_RXCSRL3_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL3_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH3 register. +// +//***************************************************************************** +#define USB_RXCSRH3_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH3_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH3_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH3_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH3_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH3_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH3_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH3_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH3_DT 0x00000002 // Data Toggle +#define USB_RXCSRH3_INCOMPRX 0x00000001 // Incomplete RX Transmission + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT3 register. +// +//***************************************************************************** +#define USB_RXCOUNT3_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT3_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE3 register. +// +//***************************************************************************** +#define USB_TXTYPE3_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE3_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE3_SPEED_HIGH 0x00000040 // High +#define USB_TXTYPE3_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE3_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE3_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE3_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE3_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE3_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE3_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE3_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE3_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL3 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL3_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL3_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL3_TXPOLL_S \ + 0 +#define USB_TXINTERVAL3_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE3 register. +// +//***************************************************************************** +#define USB_RXTYPE3_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE3_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE3_SPEED_HIGH 0x00000040 // High +#define USB_RXTYPE3_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE3_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE3_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE3_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE3_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE3_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE3_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE3_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE3_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL3 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL3_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL3_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL3_TXPOLL_S \ + 0 +#define USB_RXINTERVAL3_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP4 register. +// +//***************************************************************************** +#define USB_TXMAXP4_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP4_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL4 register. +// +//***************************************************************************** +#define USB_TXCSRL4_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL4_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL4_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL4_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL4_STALL 0x00000010 // Send STALL +#define USB_TXCSRL4_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL4_ERROR 0x00000004 // Error +#define USB_TXCSRL4_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL4_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL4_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH4 register. +// +//***************************************************************************** +#define USB_TXCSRH4_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH4_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH4_MODE 0x00000020 // Mode +#define USB_TXCSRH4_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH4_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH4_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH4_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH4_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP4 register. +// +//***************************************************************************** +#define USB_RXMAXP4_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP4_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL4 register. +// +//***************************************************************************** +#define USB_RXCSRL4_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL4_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL4_STALL 0x00000020 // Send STALL +#define USB_RXCSRL4_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL4_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL4_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL4_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL4_OVER 0x00000004 // Overrun +#define USB_RXCSRL4_ERROR 0x00000004 // Error +#define USB_RXCSRL4_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL4_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH4 register. +// +//***************************************************************************** +#define USB_RXCSRH4_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH4_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH4_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH4_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH4_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH4_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH4_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH4_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH4_DT 0x00000002 // Data Toggle +#define USB_RXCSRH4_INCOMPRX 0x00000001 // Incomplete RX Transmission + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT4 register. +// +//***************************************************************************** +#define USB_RXCOUNT4_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT4_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE4 register. +// +//***************************************************************************** +#define USB_TXTYPE4_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE4_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE4_SPEED_HIGH 0x00000040 // High +#define USB_TXTYPE4_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE4_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE4_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE4_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE4_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE4_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE4_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE4_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE4_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL4 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL4_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL4_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL4_NAKLMT_S \ + 0 +#define USB_TXINTERVAL4_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE4 register. +// +//***************************************************************************** +#define USB_RXTYPE4_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE4_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE4_SPEED_HIGH 0x00000040 // High +#define USB_RXTYPE4_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE4_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE4_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE4_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE4_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE4_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE4_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE4_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE4_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL4 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL4_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL4_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL4_NAKLMT_S \ + 0 +#define USB_RXINTERVAL4_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP5 register. +// +//***************************************************************************** +#define USB_TXMAXP5_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP5_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL5 register. +// +//***************************************************************************** +#define USB_TXCSRL5_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL5_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL5_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL5_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL5_STALL 0x00000010 // Send STALL +#define USB_TXCSRL5_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL5_ERROR 0x00000004 // Error +#define USB_TXCSRL5_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL5_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL5_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH5 register. +// +//***************************************************************************** +#define USB_TXCSRH5_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH5_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH5_MODE 0x00000020 // Mode +#define USB_TXCSRH5_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH5_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH5_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH5_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH5_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP5 register. +// +//***************************************************************************** +#define USB_RXMAXP5_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP5_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL5 register. +// +//***************************************************************************** +#define USB_RXCSRL5_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL5_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL5_STALL 0x00000020 // Send STALL +#define USB_RXCSRL5_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL5_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL5_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL5_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL5_ERROR 0x00000004 // Error +#define USB_RXCSRL5_OVER 0x00000004 // Overrun +#define USB_RXCSRL5_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL5_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH5 register. +// +//***************************************************************************** +#define USB_RXCSRH5_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH5_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH5_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH5_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH5_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH5_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH5_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH5_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH5_DT 0x00000002 // Data Toggle +#define USB_RXCSRH5_INCOMPRX 0x00000001 // Incomplete RX Transmission + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT5 register. +// +//***************************************************************************** +#define USB_RXCOUNT5_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT5_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE5 register. +// +//***************************************************************************** +#define USB_TXTYPE5_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE5_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE5_SPEED_HIGH 0x00000040 // High +#define USB_TXTYPE5_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE5_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE5_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE5_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE5_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE5_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE5_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE5_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE5_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL5 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL5_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL5_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL5_NAKLMT_S \ + 0 +#define USB_TXINTERVAL5_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE5 register. +// +//***************************************************************************** +#define USB_RXTYPE5_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE5_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE5_SPEED_HIGH 0x00000040 // High +#define USB_RXTYPE5_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE5_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE5_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE5_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE5_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE5_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE5_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE5_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE5_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL5 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL5_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL5_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL5_TXPOLL_S \ + 0 +#define USB_RXINTERVAL5_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP6 register. +// +//***************************************************************************** +#define USB_TXMAXP6_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP6_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL6 register. +// +//***************************************************************************** +#define USB_TXCSRL6_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL6_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL6_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL6_STALL 0x00000010 // Send STALL +#define USB_TXCSRL6_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL6_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL6_ERROR 0x00000004 // Error +#define USB_TXCSRL6_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL6_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL6_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH6 register. +// +//***************************************************************************** +#define USB_TXCSRH6_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH6_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH6_MODE 0x00000020 // Mode +#define USB_TXCSRH6_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH6_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH6_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH6_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH6_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP6 register. +// +//***************************************************************************** +#define USB_RXMAXP6_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP6_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL6 register. +// +//***************************************************************************** +#define USB_RXCSRL6_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL6_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL6_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL6_STALL 0x00000020 // Send STALL +#define USB_RXCSRL6_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL6_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL6_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL6_ERROR 0x00000004 // Error +#define USB_RXCSRL6_OVER 0x00000004 // Overrun +#define USB_RXCSRL6_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL6_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH6 register. +// +//***************************************************************************** +#define USB_RXCSRH6_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH6_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH6_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH6_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH6_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH6_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH6_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH6_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH6_DT 0x00000002 // Data Toggle +#define USB_RXCSRH6_INCOMPRX 0x00000001 // Incomplete RX Transmission + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT6 register. +// +//***************************************************************************** +#define USB_RXCOUNT6_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT6_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE6 register. +// +//***************************************************************************** +#define USB_TXTYPE6_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE6_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE6_SPEED_HIGH 0x00000040 // High +#define USB_TXTYPE6_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE6_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE6_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE6_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE6_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE6_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE6_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE6_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE6_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL6 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL6_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL6_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL6_TXPOLL_S \ + 0 +#define USB_TXINTERVAL6_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE6 register. +// +//***************************************************************************** +#define USB_RXTYPE6_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE6_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE6_SPEED_HIGH 0x00000040 // High +#define USB_RXTYPE6_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE6_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE6_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE6_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE6_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE6_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE6_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE6_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE6_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL6 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL6_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL6_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL6_NAKLMT_S \ + 0 +#define USB_RXINTERVAL6_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP7 register. +// +//***************************************************************************** +#define USB_TXMAXP7_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP7_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL7 register. +// +//***************************************************************************** +#define USB_TXCSRL7_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL7_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL7_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL7_STALL 0x00000010 // Send STALL +#define USB_TXCSRL7_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL7_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL7_ERROR 0x00000004 // Error +#define USB_TXCSRL7_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL7_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL7_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH7 register. +// +//***************************************************************************** +#define USB_TXCSRH7_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH7_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH7_MODE 0x00000020 // Mode +#define USB_TXCSRH7_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH7_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH7_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH7_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH7_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP7 register. +// +//***************************************************************************** +#define USB_RXMAXP7_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP7_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL7 register. +// +//***************************************************************************** +#define USB_RXCSRL7_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL7_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL7_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL7_STALL 0x00000020 // Send STALL +#define USB_RXCSRL7_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL7_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL7_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL7_ERROR 0x00000004 // Error +#define USB_RXCSRL7_OVER 0x00000004 // Overrun +#define USB_RXCSRL7_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL7_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH7 register. +// +//***************************************************************************** +#define USB_RXCSRH7_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH7_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH7_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH7_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH7_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH7_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH7_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH7_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH7_DT 0x00000002 // Data Toggle +#define USB_RXCSRH7_INCOMPRX 0x00000001 // Incomplete RX Transmission + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT7 register. +// +//***************************************************************************** +#define USB_RXCOUNT7_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT7_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE7 register. +// +//***************************************************************************** +#define USB_TXTYPE7_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE7_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE7_SPEED_HIGH 0x00000040 // High +#define USB_TXTYPE7_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE7_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE7_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE7_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE7_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE7_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE7_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE7_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE7_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL7 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL7_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL7_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL7_NAKLMT_S \ + 0 +#define USB_TXINTERVAL7_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE7 register. +// +//***************************************************************************** +#define USB_RXTYPE7_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE7_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE7_SPEED_HIGH 0x00000040 // High +#define USB_RXTYPE7_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE7_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE7_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE7_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE7_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE7_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE7_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE7_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE7_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL7 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL7_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL7_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL7_NAKLMT_S \ + 0 +#define USB_RXINTERVAL7_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMAINTR register. +// +//***************************************************************************** +#define USB_DMAINTR_CH7 0x00000080 // Channel 7 DMA Interrupt +#define USB_DMAINTR_CH6 0x00000040 // Channel 6 DMA Interrupt +#define USB_DMAINTR_CH5 0x00000020 // Channel 5 DMA Interrupt +#define USB_DMAINTR_CH4 0x00000010 // Channel 4 DMA Interrupt +#define USB_DMAINTR_CH3 0x00000008 // Channel 3 DMA Interrupt +#define USB_DMAINTR_CH2 0x00000004 // Channel 2 DMA Interrupt +#define USB_DMAINTR_CH1 0x00000002 // Channel 1 DMA Interrupt +#define USB_DMAINTR_CH0 0x00000001 // Channel 0 DMA Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACTL0 register. +// +//***************************************************************************** +#define USB_DMACTL0_BRSTM_M 0x00000600 // Burst Mode +#define USB_DMACTL0_BRSTM_ANY 0x00000000 // Bursts of unspecified length +#define USB_DMACTL0_BRSTM_INC4 0x00000200 // INCR4 or unspecified length +#define USB_DMACTL0_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified + // length +#define USB_DMACTL0_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or + // unspecified length +#define USB_DMACTL0_ERR 0x00000100 // Bus Error Bit +#define USB_DMACTL0_EP_M 0x000000F0 // Endpoint number +#define USB_DMACTL0_IE 0x00000008 // DMA Interrupt Enable +#define USB_DMACTL0_MODE 0x00000004 // DMA Transfer Mode +#define USB_DMACTL0_DIR 0x00000002 // DMA Direction +#define USB_DMACTL0_ENABLE 0x00000001 // DMA Transfer Enable +#define USB_DMACTL0_EP_S 4 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMAADDR0 register. +// +//***************************************************************************** +#define USB_DMAADDR0_ADDR_M 0xFFFFFFFC // DMA Address +#define USB_DMAADDR0_ADDR_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACOUNT0 +// register. +// +//***************************************************************************** +#define USB_DMACOUNT0_COUNT_M 0xFFFFFFFC // DMA Count +#define USB_DMACOUNT0_COUNT_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACTL1 register. +// +//***************************************************************************** +#define USB_DMACTL1_BRSTM_M 0x00000600 // Burst Mode +#define USB_DMACTL1_BRSTM_ANY 0x00000000 // Bursts of unspecified length +#define USB_DMACTL1_BRSTM_INC4 0x00000200 // INCR4 or unspecified length +#define USB_DMACTL1_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified + // length +#define USB_DMACTL1_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or + // unspecified length +#define USB_DMACTL1_ERR 0x00000100 // Bus Error Bit +#define USB_DMACTL1_EP_M 0x000000F0 // Endpoint number +#define USB_DMACTL1_IE 0x00000008 // DMA Interrupt Enable +#define USB_DMACTL1_MODE 0x00000004 // DMA Transfer Mode +#define USB_DMACTL1_DIR 0x00000002 // DMA Direction +#define USB_DMACTL1_ENABLE 0x00000001 // DMA Transfer Enable +#define USB_DMACTL1_EP_S 4 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMAADDR1 register. +// +//***************************************************************************** +#define USB_DMAADDR1_ADDR_M 0xFFFFFFFC // DMA Address +#define USB_DMAADDR1_ADDR_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACOUNT1 +// register. +// +//***************************************************************************** +#define USB_DMACOUNT1_COUNT_M 0xFFFFFFFC // DMA Count +#define USB_DMACOUNT1_COUNT_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACTL2 register. +// +//***************************************************************************** +#define USB_DMACTL2_BRSTM_M 0x00000600 // Burst Mode +#define USB_DMACTL2_BRSTM_ANY 0x00000000 // Bursts of unspecified length +#define USB_DMACTL2_BRSTM_INC4 0x00000200 // INCR4 or unspecified length +#define USB_DMACTL2_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified + // length +#define USB_DMACTL2_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or + // unspecified length +#define USB_DMACTL2_ERR 0x00000100 // Bus Error Bit +#define USB_DMACTL2_EP_M 0x000000F0 // Endpoint number +#define USB_DMACTL2_IE 0x00000008 // DMA Interrupt Enable +#define USB_DMACTL2_MODE 0x00000004 // DMA Transfer Mode +#define USB_DMACTL2_DIR 0x00000002 // DMA Direction +#define USB_DMACTL2_ENABLE 0x00000001 // DMA Transfer Enable +#define USB_DMACTL2_EP_S 4 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMAADDR2 register. +// +//***************************************************************************** +#define USB_DMAADDR2_ADDR_M 0xFFFFFFFC // DMA Address +#define USB_DMAADDR2_ADDR_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACOUNT2 +// register. +// +//***************************************************************************** +#define USB_DMACOUNT2_COUNT_M 0xFFFFFFFC // DMA Count +#define USB_DMACOUNT2_COUNT_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACTL3 register. +// +//***************************************************************************** +#define USB_DMACTL3_BRSTM_M 0x00000600 // Burst Mode +#define USB_DMACTL3_BRSTM_ANY 0x00000000 // Bursts of unspecified length +#define USB_DMACTL3_BRSTM_INC4 0x00000200 // INCR4 or unspecified length +#define USB_DMACTL3_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified + // length +#define USB_DMACTL3_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or + // unspecified length +#define USB_DMACTL3_ERR 0x00000100 // Bus Error Bit +#define USB_DMACTL3_EP_M 0x000000F0 // Endpoint number +#define USB_DMACTL3_IE 0x00000008 // DMA Interrupt Enable +#define USB_DMACTL3_MODE 0x00000004 // DMA Transfer Mode +#define USB_DMACTL3_DIR 0x00000002 // DMA Direction +#define USB_DMACTL3_ENABLE 0x00000001 // DMA Transfer Enable +#define USB_DMACTL3_EP_S 4 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMAADDR3 register. +// +//***************************************************************************** +#define USB_DMAADDR3_ADDR_M 0xFFFFFFFC // DMA Address +#define USB_DMAADDR3_ADDR_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACOUNT3 +// register. +// +//***************************************************************************** +#define USB_DMACOUNT3_COUNT_M 0xFFFFFFFC // DMA Count +#define USB_DMACOUNT3_COUNT_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACTL4 register. +// +//***************************************************************************** +#define USB_DMACTL4_BRSTM_M 0x00000600 // Burst Mode +#define USB_DMACTL4_BRSTM_ANY 0x00000000 // Bursts of unspecified length +#define USB_DMACTL4_BRSTM_INC4 0x00000200 // INCR4 or unspecified length +#define USB_DMACTL4_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified + // length +#define USB_DMACTL4_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or + // unspecified length +#define USB_DMACTL4_ERR 0x00000100 // Bus Error Bit +#define USB_DMACTL4_EP_M 0x000000F0 // Endpoint number +#define USB_DMACTL4_IE 0x00000008 // DMA Interrupt Enable +#define USB_DMACTL4_MODE 0x00000004 // DMA Transfer Mode +#define USB_DMACTL4_DIR 0x00000002 // DMA Direction +#define USB_DMACTL4_ENABLE 0x00000001 // DMA Transfer Enable +#define USB_DMACTL4_EP_S 4 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMAADDR4 register. +// +//***************************************************************************** +#define USB_DMAADDR4_ADDR_M 0xFFFFFFFC // DMA Address +#define USB_DMAADDR4_ADDR_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACOUNT4 +// register. +// +//***************************************************************************** +#define USB_DMACOUNT4_COUNT_M 0xFFFFFFFC // DMA Count +#define USB_DMACOUNT4_COUNT_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACTL5 register. +// +//***************************************************************************** +#define USB_DMACTL5_BRSTM_M 0x00000600 // Burst Mode +#define USB_DMACTL5_BRSTM_ANY 0x00000000 // Bursts of unspecified length +#define USB_DMACTL5_BRSTM_INC4 0x00000200 // INCR4 or unspecified length +#define USB_DMACTL5_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified + // length +#define USB_DMACTL5_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or + // unspecified length +#define USB_DMACTL5_ERR 0x00000100 // Bus Error Bit +#define USB_DMACTL5_EP_M 0x000000F0 // Endpoint number +#define USB_DMACTL5_IE 0x00000008 // DMA Interrupt Enable +#define USB_DMACTL5_MODE 0x00000004 // DMA Transfer Mode +#define USB_DMACTL5_DIR 0x00000002 // DMA Direction +#define USB_DMACTL5_ENABLE 0x00000001 // DMA Transfer Enable +#define USB_DMACTL5_EP_S 4 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMAADDR5 register. +// +//***************************************************************************** +#define USB_DMAADDR5_ADDR_M 0xFFFFFFFC // DMA Address +#define USB_DMAADDR5_ADDR_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACOUNT5 +// register. +// +//***************************************************************************** +#define USB_DMACOUNT5_COUNT_M 0xFFFFFFFC // DMA Count +#define USB_DMACOUNT5_COUNT_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACTL6 register. +// +//***************************************************************************** +#define USB_DMACTL6_BRSTM_M 0x00000600 // Burst Mode +#define USB_DMACTL6_BRSTM_ANY 0x00000000 // Bursts of unspecified length +#define USB_DMACTL6_BRSTM_INC4 0x00000200 // INCR4 or unspecified length +#define USB_DMACTL6_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified + // length +#define USB_DMACTL6_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or + // unspecified length +#define USB_DMACTL6_ERR 0x00000100 // Bus Error Bit +#define USB_DMACTL6_EP_M 0x000000F0 // Endpoint number +#define USB_DMACTL6_IE 0x00000008 // DMA Interrupt Enable +#define USB_DMACTL6_MODE 0x00000004 // DMA Transfer Mode +#define USB_DMACTL6_DIR 0x00000002 // DMA Direction +#define USB_DMACTL6_ENABLE 0x00000001 // DMA Transfer Enable +#define USB_DMACTL6_EP_S 4 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMAADDR6 register. +// +//***************************************************************************** +#define USB_DMAADDR6_ADDR_M 0xFFFFFFFC // DMA Address +#define USB_DMAADDR6_ADDR_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACOUNT6 +// register. +// +//***************************************************************************** +#define USB_DMACOUNT6_COUNT_M 0xFFFFFFFC // DMA Count +#define USB_DMACOUNT6_COUNT_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACTL7 register. +// +//***************************************************************************** +#define USB_DMACTL7_BRSTM_M 0x00000600 // Burst Mode +#define USB_DMACTL7_BRSTM_ANY 0x00000000 // Bursts of unspecified length +#define USB_DMACTL7_BRSTM_INC4 0x00000200 // INCR4 or unspecified length +#define USB_DMACTL7_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified + // length +#define USB_DMACTL7_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or + // unspecified length +#define USB_DMACTL7_ERR 0x00000100 // Bus Error Bit +#define USB_DMACTL7_EP_M 0x000000F0 // Endpoint number +#define USB_DMACTL7_IE 0x00000008 // DMA Interrupt Enable +#define USB_DMACTL7_MODE 0x00000004 // DMA Transfer Mode +#define USB_DMACTL7_DIR 0x00000002 // DMA Direction +#define USB_DMACTL7_ENABLE 0x00000001 // DMA Transfer Enable +#define USB_DMACTL7_EP_S 4 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMAADDR7 register. +// +//***************************************************************************** +#define USB_DMAADDR7_ADDR_M 0xFFFFFFFC // DMA Address +#define USB_DMAADDR7_ADDR_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMACOUNT7 +// register. +// +//***************************************************************************** +#define USB_DMACOUNT7_COUNT_M 0xFFFFFFFC // DMA Count +#define USB_DMACOUNT7_COUNT_S 2 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT1 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT1_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT1_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT2 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT2_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT2_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT3 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT3_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT3_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT4 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT4_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT4_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT5 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT5_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT5_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT6 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT6_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT6_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT7 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT7_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT7_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXDPKTBUFDIS +// register. +// +//***************************************************************************** +#define USB_RXDPKTBUFDIS_EP7 0x00000080 // EP7 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP6 0x00000040 // EP6 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP5 0x00000020 // EP5 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP4 0x00000010 // EP4 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP3 0x00000008 // EP3 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP2 0x00000004 // EP2 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP1 0x00000002 // EP1 RX Double-Packet Buffer + // Disable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXDPKTBUFDIS +// register. +// +//***************************************************************************** +#define USB_TXDPKTBUFDIS_EP7 0x00000080 // EP7 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP6 0x00000040 // EP6 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP5 0x00000020 // EP5 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP4 0x00000010 // EP4 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP3 0x00000008 // EP3 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP2 0x00000004 // EP2 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP1 0x00000002 // EP1 TX Double-Packet Buffer + // Disable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CTO register. +// +//***************************************************************************** +#define USB_CTO_CCTV_M 0x0000FFFF // Configurable Chirp Timeout Value +#define USB_CTO_CCTV_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_HHSRTN register. +// +//***************************************************************************** +#define USB_HHSRTN_HHSRTN_M 0x0000FFFF // HIgh Speed to UTM Operating + // Delay +#define USB_HHSRTN_HHSRTN_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_HSBT register. +// +//***************************************************************************** +#define USB_HSBT_HSBT_M 0x0000000F // High Speed Timeout Adder +#define USB_HSBT_HSBT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_LPMATTR register. +// +//***************************************************************************** +#define USB_LPMATTR_ENDPT_M 0x0000F000 // Endpoint +#define USB_LPMATTR_RMTWAK 0x00000100 // Remote Wake +#define USB_LPMATTR_HIRD_M 0x000000F0 // Host Initiated Resume Duration +#define USB_LPMATTR_LS_M 0x0000000F // Link State +#define USB_LPMATTR_LS_L1 0x00000001 // Sleep State (L1) +#define USB_LPMATTR_ENDPT_S 12 +#define USB_LPMATTR_HIRD_S 4 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_LPMCNTRL register. +// +//***************************************************************************** +#define USB_LPMCNTRL_NAK 0x00000010 // LPM NAK +#define USB_LPMCNTRL_EN_M 0x0000000C // LPM Enable +#define USB_LPMCNTRL_EN_NONE 0x00000000 // LPM and Extended transactions + // are not supported. In this case, + // the USB does not respond to LPM + // transactions and LPM + // transactions cause a timeout +#define USB_LPMCNTRL_EN_EXT 0x00000004 // LPM is not supported but + // extended transactions are + // supported. In this case, the USB + // does respond to an LPM + // transaction with a STALL +#define USB_LPMCNTRL_EN_LPMEXT 0x0000000C // The USB supports LPM extended + // transactions. In this case, the + // USB responds with a NYET or an + // ACK as determined by the value + // of TXLPM and other conditions +#define USB_LPMCNTRL_RES 0x00000002 // LPM Resume +#define USB_LPMCNTRL_TXLPM 0x00000001 // Transmit LPM Transaction Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_LPMIM register. +// +//***************************************************************************** +#define USB_LPMIM_ERR 0x00000020 // LPM Error Interrupt Mask +#define USB_LPMIM_RES 0x00000010 // LPM Resume Interrupt Mask +#define USB_LPMIM_NC 0x00000008 // LPM NC Interrupt Mask +#define USB_LPMIM_ACK 0x00000004 // LPM ACK Interrupt Mask +#define USB_LPMIM_NY 0x00000002 // LPM NY Interrupt Mask +#define USB_LPMIM_STALL 0x00000001 // LPM STALL Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_LPMRIS register. +// +//***************************************************************************** +#define USB_LPMRIS_ERR 0x00000020 // LPM Interrupt Status +#define USB_LPMRIS_RES 0x00000010 // LPM Resume Interrupt Status +#define USB_LPMRIS_NC 0x00000008 // LPM NC Interrupt Status +#define USB_LPMRIS_ACK 0x00000004 // LPM ACK Interrupt Status +#define USB_LPMRIS_NY 0x00000002 // LPM NY Interrupt Status +#define USB_LPMRIS_LPMST 0x00000001 // LPM STALL Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_LPMFADDR register. +// +//***************************************************************************** +#define USB_LPMFADDR_ADDR_M 0x0000007F // LPM Function Address +#define USB_LPMFADDR_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPC register. +// +//***************************************************************************** +#define USB_EPC_PFLTACT_M 0x00000300 // Power Fault Action +#define USB_EPC_PFLTACT_UNCHG 0x00000000 // Unchanged +#define USB_EPC_PFLTACT_TRIS 0x00000100 // Tristate +#define USB_EPC_PFLTACT_LOW 0x00000200 // Low +#define USB_EPC_PFLTACT_HIGH 0x00000300 // High +#define USB_EPC_PFLTAEN 0x00000040 // Power Fault Action Enable +#define USB_EPC_PFLTSEN_HIGH 0x00000020 // Power Fault Sense +#define USB_EPC_PFLTEN 0x00000010 // Power Fault Input Enable +#define USB_EPC_EPENDE 0x00000004 // EPEN Drive Enable +#define USB_EPC_EPEN_M 0x00000003 // External Power Supply Enable + // Configuration +#define USB_EPC_EPEN_LOW 0x00000000 // Power Enable Active Low +#define USB_EPC_EPEN_HIGH 0x00000001 // Power Enable Active High +#define USB_EPC_EPEN_VBLOW 0x00000002 // Power Enable High if VBUS Low + // (OTG only) +#define USB_EPC_EPEN_VBHIGH 0x00000003 // Power Enable High if VBUS High + // (OTG only) + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPCRIS register. +// +//***************************************************************************** +#define USB_EPCRIS_PF 0x00000001 // USB Power Fault Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPCIM register. +// +//***************************************************************************** +#define USB_EPCIM_PF 0x00000001 // USB Power Fault Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPCISC register. +// +//***************************************************************************** +#define USB_EPCISC_PF 0x00000001 // USB Power Fault Interrupt Status + // and Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DRRIS register. +// +//***************************************************************************** +#define USB_DRRIS_RESUME 0x00000001 // RESUME Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DRIM register. +// +//***************************************************************************** +#define USB_DRIM_RESUME 0x00000001 // RESUME Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DRISC register. +// +//***************************************************************************** +#define USB_DRISC_RESUME 0x00000001 // RESUME Interrupt Status and + // Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_GPCS register. +// +//***************************************************************************** +#define USB_GPCS_DEVMOD_M 0x00000007 // Device Mode +#define USB_GPCS_DEVMOD_OTG 0x00000000 // Use USB0VBUS and USB0ID pin +#define USB_GPCS_DEVMOD_HOST 0x00000002 // Force USB0VBUS and USB0ID low +#define USB_GPCS_DEVMOD_DEV 0x00000003 // Force USB0VBUS and USB0ID high +#define USB_GPCS_DEVMOD_HOSTVBUS \ + 0x00000004 // Use USB0VBUS and force USB0ID + // low +#define USB_GPCS_DEVMOD_DEVVBUS 0x00000005 // Use USB0VBUS and force USB0ID + // high +#define USB_GPCS_DEVMODOTG 0x00000002 // Enable Device Mode +#define USB_GPCS_DEVMOD 0x00000001 // Device Mode + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDC register. +// +//***************************************************************************** +#define USB_VDC_VBDEN 0x00000001 // VBUS Droop Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDCRIS register. +// +//***************************************************************************** +#define USB_VDCRIS_VD 0x00000001 // VBUS Droop Raw Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDCIM register. +// +//***************************************************************************** +#define USB_VDCIM_VD 0x00000001 // VBUS Droop Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDCISC register. +// +//***************************************************************************** +#define USB_VDCISC_VD 0x00000001 // VBUS Droop Interrupt Status and + // Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IDVRIS register. +// +//***************************************************************************** +#define USB_IDVRIS_ID 0x00000001 // ID Valid Detect Raw Interrupt + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IDVIM register. +// +//***************************************************************************** +#define USB_IDVIM_ID 0x00000001 // ID Valid Detect Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IDVISC register. +// +//***************************************************************************** +#define USB_IDVISC_ID 0x00000001 // ID Valid Detect Interrupt Status + // and Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_PP register. +// +//***************************************************************************** +#define USB_PP_ECNT_M 0x0000FF00 // Endpoint Count +#define USB_PP_USB_M 0x000000C0 // USB Capability +#define USB_PP_USB_DEVICE 0x00000040 // DEVICE +#define USB_PP_USB_HOSTDEVICE 0x00000080 // HOST +#define USB_PP_USB_OTG 0x000000C0 // OTG +#define USB_PP_ULPI 0x00000020 // ULPI Present +#define USB_PP_PHY 0x00000010 // PHY Present + +#define USB_PP_ECNT_S 8 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_PC register. +// +//***************************************************************************** +#define USB_PC_ULPIEN 0x00010000 // ULPI Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CC register. +// +//***************************************************************************** +#define USB_CC_CLKEN 0x00000200 // USB Clock Enable +#define USB_CC_CSD 0x00000100 // Clock Source/Direction +#define USB_CC_CLKDIV_M 0x0000000F // PLL Clock Divisor +#define USB_CC_CLKDIV_S 0 + + +//***************************************************************************** +// +// The following are values that can be passed to USBIntEnableControl() and +// USBIntDisableControl() as the ui32Flags parameter, and are returned from +// USBIntStatusControl(). +// +//***************************************************************************** +#define USB_INTCTRL_ALL 0x000003FF // All control interrupt sources +#define USB_INTCTRL_STATUS 0x000000FF // Status Interrupts +#define USB_INTCTRL_VBUS_ERR 0x00000080 // VBUS Error +#define USB_INTCTRL_SESSION 0x00000040 // Session Start Detected +#define USB_INTCTRL_SESSION_END 0x00000040 // Session End Detected +#define USB_INTCTRL_DISCONNECT 0x00000020 // Disconnect Detected +#define USB_INTCTRL_CONNECT 0x00000010 // Device Connect Detected +#define USB_INTCTRL_SOF 0x00000008 // Start of Frame Detected +#define USB_INTCTRL_BABBLE 0x00000004 // Babble signaled +#define USB_INTCTRL_RESET 0x00000004 // Reset signaled +#define USB_INTCTRL_RESUME 0x00000002 // Resume detected +#define USB_INTCTRL_SUSPEND 0x00000001 // Suspend detected +#define USB_INTCTRL_MODE_DETECT 0x00000200 // Mode value valid +#define USB_INTCTRL_POWER_FAULT 0x00000100 // Power Fault detected + +//***************************************************************************** +// +// The following are values that can be passed to USBIntEnableEndpoint() and +// USBIntDisableEndpoint() as the ui32Flags parameter, and are returned from +// USBIntStatusEndpoint(). +// +//***************************************************************************** +#define USB_INTEP_ALL 0xFFFFFFFF // Host IN Interrupts +#define USB_INTEP_HOST_IN 0xFFFE0000 // Host IN Interrupts +#define USB_INTEP_HOST_IN_15 0x80000000 // Endpoint 15 Host IN Interrupt +#define USB_INTEP_HOST_IN_14 0x40000000 // Endpoint 14 Host IN Interrupt +#define USB_INTEP_HOST_IN_13 0x20000000 // Endpoint 13 Host IN Interrupt +#define USB_INTEP_HOST_IN_12 0x10000000 // Endpoint 12 Host IN Interrupt +#define USB_INTEP_HOST_IN_11 0x08000000 // Endpoint 11 Host IN Interrupt +#define USB_INTEP_HOST_IN_10 0x04000000 // Endpoint 10 Host IN Interrupt +#define USB_INTEP_HOST_IN_9 0x02000000 // Endpoint 9 Host IN Interrupt +#define USB_INTEP_HOST_IN_8 0x01000000 // Endpoint 8 Host IN Interrupt +#define USB_INTEP_HOST_IN_7 0x00800000 // Endpoint 7 Host IN Interrupt +#define USB_INTEP_HOST_IN_6 0x00400000 // Endpoint 6 Host IN Interrupt +#define USB_INTEP_HOST_IN_5 0x00200000 // Endpoint 5 Host IN Interrupt +#define USB_INTEP_HOST_IN_4 0x00100000 // Endpoint 4 Host IN Interrupt +#define USB_INTEP_HOST_IN_3 0x00080000 // Endpoint 3 Host IN Interrupt +#define USB_INTEP_HOST_IN_2 0x00040000 // Endpoint 2 Host IN Interrupt +#define USB_INTEP_HOST_IN_1 0x00020000 // Endpoint 1 Host IN Interrupt + +#define USB_INTEP_DEV_OUT 0xFFFE0000 // Device OUT Interrupts +#define USB_INTEP_DEV_OUT_15 0x80000000 // Endpoint 15 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_14 0x40000000 // Endpoint 14 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_13 0x20000000 // Endpoint 13 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_12 0x10000000 // Endpoint 12 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_11 0x08000000 // Endpoint 11 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_10 0x04000000 // Endpoint 10 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_9 0x02000000 // Endpoint 9 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_8 0x01000000 // Endpoint 8 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_7 0x00800000 // Endpoint 7 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_6 0x00400000 // Endpoint 6 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_5 0x00200000 // Endpoint 5 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_4 0x00100000 // Endpoint 4 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_3 0x00080000 // Endpoint 3 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_2 0x00040000 // Endpoint 2 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_1 0x00020000 // Endpoint 1 Device OUT Interrupt + +#define USB_INTEP_HOST_OUT 0x0000FFFE // Host OUT Interrupts +#define USB_INTEP_HOST_OUT_15 0x00008000 // Endpoint 15 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_14 0x00004000 // Endpoint 14 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_13 0x00002000 // Endpoint 13 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_12 0x00001000 // Endpoint 12 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_11 0x00000800 // Endpoint 11 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_10 0x00000400 // Endpoint 10 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_9 0x00000200 // Endpoint 9 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_8 0x00000100 // Endpoint 8 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_7 0x00000080 // Endpoint 7 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_6 0x00000040 // Endpoint 6 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_5 0x00000020 // Endpoint 5 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_4 0x00000010 // Endpoint 4 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_3 0x00000008 // Endpoint 3 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_2 0x00000004 // Endpoint 2 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_1 0x00000002 // Endpoint 1 Host OUT Interrupt + +#define USB_INTEP_DEV_IN 0x0000FFFE // Device IN Interrupts +#define USB_INTEP_DEV_IN_15 0x00008000 // Endpoint 15 Device IN Interrupt +#define USB_INTEP_DEV_IN_14 0x00004000 // Endpoint 14 Device IN Interrupt +#define USB_INTEP_DEV_IN_13 0x00002000 // Endpoint 13 Device IN Interrupt +#define USB_INTEP_DEV_IN_12 0x00001000 // Endpoint 12 Device IN Interrupt +#define USB_INTEP_DEV_IN_11 0x00000800 // Endpoint 11 Device IN Interrupt +#define USB_INTEP_DEV_IN_10 0x00000400 // Endpoint 10 Device IN Interrupt +#define USB_INTEP_DEV_IN_9 0x00000200 // Endpoint 9 Device IN Interrupt +#define USB_INTEP_DEV_IN_8 0x00000100 // Endpoint 8 Device IN Interrupt +#define USB_INTEP_DEV_IN_7 0x00000080 // Endpoint 7 Device IN Interrupt +#define USB_INTEP_DEV_IN_6 0x00000040 // Endpoint 6 Device IN Interrupt +#define USB_INTEP_DEV_IN_5 0x00000020 // Endpoint 5 Device IN Interrupt +#define USB_INTEP_DEV_IN_4 0x00000010 // Endpoint 4 Device IN Interrupt +#define USB_INTEP_DEV_IN_3 0x00000008 // Endpoint 3 Device IN Interrupt +#define USB_INTEP_DEV_IN_2 0x00000004 // Endpoint 2 Device IN Interrupt +#define USB_INTEP_DEV_IN_1 0x00000002 // Endpoint 1 Device IN Interrupt + +#define USB_INTEP_0 0x00000001 // Endpoint 0 Interrupt + +//***************************************************************************** +// +// The following are values that are returned from USBSpeedGet(). +// +//***************************************************************************** +#define USB_UNDEF_SPEED 0x80000000 // Current speed is undefined +#define USB_HIGH_SPEED 0x00000002 // Current speed is High Speed +#define USB_FULL_SPEED 0x00000001 // Current speed is Full Speed +#define USB_LOW_SPEED 0x00000000 // Current speed is Low Speed + +//***************************************************************************** +// +// The following are values that are returned from USBEndpointStatus(). The +// USB_HOST_* values are used when the USB controller is in host mode and the +// USB_DEV_* values are used when the USB controller is in device mode. +// +//***************************************************************************** +#define USB_HOST_IN_STATUS 0x114F0000 // Mask of all host IN interrupts +#define USB_HOST_IN_PID_ERROR 0x10000000 // Stall on this endpoint received +#define USB_HOST_IN_NOT_COMP 0x01000000 // Device failed to respond +#define USB_HOST_IN_STALL 0x00400000 // Stall on this endpoint received +#define USB_HOST_IN_DATA_ERROR 0x00080000 // CRC or bit-stuff error + // (ISOC Mode) +#define USB_HOST_IN_NAK_TO 0x00080000 // NAK received for more than the + // specified timeout period +#define USB_HOST_IN_ERROR 0x00040000 // Failed to communicate with a + // device +#define USB_HOST_IN_FIFO_FULL 0x00020000 // RX FIFO full +#define USB_HOST_IN_PKTRDY 0x00010000 // Data packet ready +#define USB_HOST_OUT_STATUS 0x000000A7 // Mask of all host OUT interrupts +#define USB_HOST_OUT_NAK_TO 0x00000080 // NAK received for more than the + // specified timeout period +#define USB_HOST_OUT_NOT_COMP 0x00000080 // No response from device + // (ISOC mode) +#define USB_HOST_OUT_STALL 0x00000020 // Stall on this endpoint received +#define USB_HOST_OUT_ERROR 0x00000004 // Failed to communicate with a + // device +#define USB_HOST_OUT_FIFO_NE 0x00000002 // TX FIFO is not empty +#define USB_HOST_OUT_PKTPEND 0x00000001 // Transmit still being transmitted +#define USB_HOST_EP0_NAK_TO 0x00000080 // NAK received for more than the + // specified timeout period +#define USB_HOST_EP0_STATUS 0x00000040 // This was a status packet +#define USB_HOST_EP0_ERROR 0x00000010 // Failed to communicate with a + // device +#define USB_HOST_EP0_RX_STALL 0x00000004 // Stall on this endpoint received +#define USB_HOST_EP0_RXPKTRDY 0x00000001 // Receive data packet ready +#define USB_DEV_RX_PID_ERROR 0x01000000 // PID error in isochronous + // transfer +#define USB_DEV_RX_SENT_STALL 0x00400000 // Stall was sent on this endpoint +#define USB_DEV_RX_DATA_ERROR 0x00080000 // CRC error on the data +#define USB_DEV_RX_OVERRUN 0x00040000 // OUT packet was not loaded due to + // a full FIFO +#define USB_DEV_RX_FIFO_FULL 0x00020000 // RX FIFO full +#define USB_DEV_RX_PKT_RDY 0x00010000 // Data packet ready +#define USB_DEV_TX_NOT_COMP 0x00000080 // Large packet split up, more data + // to come +#define USB_DEV_TX_SENT_STALL 0x00000020 // Stall was sent on this endpoint +#define USB_DEV_TX_UNDERRUN 0x00000004 // IN received with no data ready +#define USB_DEV_TX_FIFO_NE 0x00000002 // The TX FIFO is not empty +#define USB_DEV_TX_TXPKTRDY 0x00000001 // Transmit still being transmitted +#define USB_DEV_EP0_SETUP_END 0x00000010 // Control transaction ended before + // Data End seen +#define USB_DEV_EP0_SENT_STALL 0x00000004 // Stall was sent on this endpoint +#define USB_DEV_EP0_IN_PKTPEND 0x00000002 // Transmit data packet pending +#define USB_DEV_EP0_OUT_PKTRDY 0x00000001 // Receive data packet ready + +//***************************************************************************** +// +// The following are values that can be passed to USBHostEndpointConfig() and +// USBDevEndpointConfigSet() as the ui32Flags parameter. +// +//***************************************************************************** +#define USB_EP_AUTO_SET 0x00000001 // Auto set feature enabled +#define USB_EP_AUTO_REQUEST 0x00000002 // Auto request feature enabled +#define USB_EP_AUTO_CLEAR 0x00000004 // Auto clear feature enabled +#define USB_EP_DMA_MODE_0 0x00000008 // Enable DMA access using mode 0 +#define USB_EP_DMA_MODE_1 0x00000010 // Enable DMA access using mode 1 +#define USB_EP_DIS_NYET 0x00000020 // Disable NYET response for + // high-speed Bulk and Interrupt + // endpoints in device mode. +#define USB_EP_MODE_ISOC 0x00000000 // Isochronous endpoint +#define USB_EP_MODE_BULK 0x00000100 // Bulk endpoint +#define USB_EP_MODE_INT 0x00000200 // Interrupt endpoint +#define USB_EP_MODE_CTRL 0x00000300 // Control endpoint +#define USB_EP_MODE_MASK 0x00000300 // Mode Mask +#define USB_EP_SPEED_LOW 0x00000000 // Low Speed +#define USB_EP_SPEED_FULL 0x00001000 // Full Speed +#define USB_EP_SPEED_HIGH 0x00004000 // High Speed +#define USB_EP_HOST_IN 0x00000000 // Host IN endpoint +#define USB_EP_HOST_OUT 0x00002000 // Host OUT endpoint +#define USB_EP_DEV_IN 0x00002000 // Device IN endpoint +#define USB_EP_DEV_OUT 0x00000000 // Device OUT endpoint + +//***************************************************************************** +// +// The following are values that can be passed to USBHostPwrConfig() as the +// ui32Flags parameter. +// +//***************************************************************************** +#define USB_HOST_PWRFLT_LOW 0x00000010 +#define USB_HOST_PWRFLT_HIGH 0x00000030 +#define USB_HOST_PWRFLT_EP_NONE 0x00000000 +#define USB_HOST_PWRFLT_EP_TRI 0x00000140 +#define USB_HOST_PWRFLT_EP_LOW 0x00000240 +#define USB_HOST_PWRFLT_EP_HIGH 0x00000340 +#define USB_HOST_PWREN_MAN_LOW 0x00000000 +#define USB_HOST_PWREN_MAN_HIGH 0x00000001 +#define USB_HOST_PWREN_AUTOLOW 0x00000002 +#define USB_HOST_PWREN_AUTOHIGH 0x00000003 +#define USB_HOST_PWREN_FILTER 0x00010000 + +//***************************************************************************** +// +// The following are the valid values that can be passed to the +// USBHostLPMConfig() function in the ui32Config parameter. +// +//***************************************************************************** +#define USB_HOST_LPM_RMTWAKE 0x00000100 +#define USB_HOST_LPM_L1 0x00000001 + +//***************************************************************************** +// +// The following are the valid values that can be passed to the +// USBDevLPMConfig() function in the ui32Config parameter. +// +//***************************************************************************** +#define USB_DEV_LPM_NAK 0x00000010 +#define USB_DEV_LPM_NONE 0x00000000 +#define USB_DEV_LPM_EN 0x0000000c +#define USB_DEV_LPM_EXTONLY 0x00000004 + +//***************************************************************************** +// +// The following are the valid values that are returned from the +// USBLPMLinkStateGet() function. +// +//***************************************************************************** +#define USB_DEV_LPM_LS_RMTWAKE 0x00000100 +#define USB_DEV_LPM_LS_L1 0x00000001 + +//***************************************************************************** +// +// The following are the valid values that are passed to the USBLPMIntEnable() +// or USBLPMIntDisable() functions or are returned from the USBLPMIntStatus() +// function. +// +//***************************************************************************** +#define USB_INTLPM_ERROR 0x00000020 +#define USB_INTLPM_RESUME 0x00000010 +#define USB_INTLPM_INCOMPLETE 0x00000008 +#define USB_INTLPM_ACK 0x00000004 +#define USB_INTLPM_NYET 0x00000002 +#define USB_INTLPM_STALL 0x00000001 + +//***************************************************************************** +// +// The following are the valid values that are passed to the USBClockEnable() +// functions. +// +//***************************************************************************** +#define USB_CLOCK_INTERNAL 0x00000200 +#define USB_CLOCK_EXTERNAL 0x00000300 + +//***************************************************************************** +// +// The configuration options used with the USBULPIConfig() API. +// +//***************************************************************************** +#define USB_ULPI_EXTVBUS 0x00000001 +#define USB_ULPI_EXTVBUS_IND 0x00000002 + +//***************************************************************************** +// +// The following are special values that can be passed to +// USBHostEndpointConfig() as the ui32NAKPollInterval parameter. +// +//***************************************************************************** +#define MAX_NAK_LIMIT 31 // Maximum NAK interval +#define DISABLE_NAK_LIMIT 0 // No NAK timeouts + +//***************************************************************************** +// +// This value specifies the maximum size of transfers on endpoint 0 as 64 +// bytes. This value is fixed in hardware as the FIFO size for endpoint 0. +// +//***************************************************************************** +#define MAX_PACKET_SIZE_EP0 64 + +//***************************************************************************** +// +// These values are used to indicate which endpoint to access. +// +//***************************************************************************** +#define USB_EP_0 0x00000000 // Endpoint 0 +#define USB_EP_1 0x00000010 // Endpoint 1 +#define USB_EP_2 0x00000020 // Endpoint 2 +#define USB_EP_3 0x00000030 // Endpoint 3 +#define USB_EP_4 0x00000040 // Endpoint 4 +#define USB_EP_5 0x00000050 // Endpoint 5 +#define USB_EP_6 0x00000060 // Endpoint 6 +#define USB_EP_7 0x00000070 // Endpoint 7 +#define NUM_USB_EP 8 // Number of supported endpoints + +//***************************************************************************** +// +// These macros allow conversion between 0-based endpoint indices and the +// USB_EP_x values required when calling various USB APIs. +// +//***************************************************************************** +#define IndexToUSBEP(x) ((x) << 4) +#define USBEPToIndex(x) ((x) >> 4) + +//***************************************************************************** +// +// The following are values that can be passed to USBFIFOConfigSet() as the +// ui32FIFOSize parameter. +// +//***************************************************************************** +#define USB_FIFO_SZ_8 0x00000000 // 8 byte FIFO +#define USB_FIFO_SZ_16 0x00000001 // 16 byte FIFO +#define USB_FIFO_SZ_32 0x00000002 // 32 byte FIFO +#define USB_FIFO_SZ_64 0x00000003 // 64 byte FIFO +#define USB_FIFO_SZ_128 0x00000004 // 128 byte FIFO +#define USB_FIFO_SZ_256 0x00000005 // 256 byte FIFO +#define USB_FIFO_SZ_512 0x00000006 // 512 byte FIFO +#define USB_FIFO_SZ_1024 0x00000007 // 1024 byte FIFO +#define USB_FIFO_SZ_2048 0x00000008 // 2048 byte FIFO + +//***************************************************************************** +// +// This macro allow conversion from a FIFO size label as defined above to +// a number of bytes +// +//***************************************************************************** +#define USBFIFOSizeToBytes(x) (8 << (x)) + +//***************************************************************************** +// +// The following are values that can be passed to USBEndpointDataSend() as the +// ui32TransType parameter. +// +//***************************************************************************** +#define USB_TRANS_OUT 0x00000102 // Normal OUT transaction +#define USB_TRANS_IN 0x00000102 // Normal IN transaction +#define USB_TRANS_IN_LAST 0x0000010a // Final IN transaction (for + // endpoint 0 in device mode) +#define USB_TRANS_SETUP 0x0000110a // Setup transaction (for endpoint + // 0) +#define USB_TRANS_STATUS 0x00000142 // Status transaction (for endpoint + // 0) + +//***************************************************************************** +// +// The following are values are returned by the USBModeGet function. +// +//***************************************************************************** +#define USB_DUAL_MODE_HOST 0x00000001 // Dual mode controller is in Host + // mode. +#define USB_DUAL_MODE_DEVICE 0x00000081 // Dual mode controller is in + // Device mode. +#define USB_DUAL_MODE_NONE 0x00000080 // Dual mode controller mode is not + // set. +#define USB_OTG_MODE_ASIDE_HOST 0x0000001d // OTG controller on the A side of + // the cable. +#define USB_OTG_MODE_ASIDE_NPWR 0x00000001 // OTG controller on the A side of + // the cable. +#define USB_OTG_MODE_ASIDE_SESS 0x00000009 // OTG controller on the A side of + // the cable Session Valid. +#define USB_OTG_MODE_ASIDE_AVAL 0x00000011 // OTG controller on the A side of + // the cable A valid. +#define USB_OTG_MODE_ASIDE_DEV 0x00000019 // OTG controller on the A side of + // the cable. +#define USB_OTG_MODE_BSIDE_HOST 0x0000009d // OTG controller on the B side of + // the cable. +#define USB_OTG_MODE_BSIDE_DEV 0x00000099 // OTG controller on the B side of + // the cable. +#define USB_OTG_MODE_BSIDE_NPWR 0x00000081 // OTG controller on the B side of + // the cable. +#define USB_OTG_MODE_NONE 0x00000080 // OTG controller mode is not set. + +//***************************************************************************** +// +// The values for the USBDMAChannelIntEnable() and USBDMAChannelIntStatus() +// APIs. +// +//***************************************************************************** +#define USB_DMA_INT_CH8 0x00000080 +#define USB_DMA_INT_CH7 0x00000040 +#define USB_DMA_INT_CH6 0x00000020 +#define USB_DMA_INT_CH5 0x00000010 +#define USB_DMA_INT_CH4 0x00000008 +#define USB_DMA_INT_CH3 0x00000004 +#define USB_DMA_INT_CH2 0x00000002 +#define USB_DMA_INT_CH1 0x00000001 + +//***************************************************************************** +// +// The values for the USBDMAChannelStatus() API. +// +//***************************************************************************** +#define USB_DMA_STATUS_ERROR 0x00000100 + +//***************************************************************************** +// +// The valid return values for the USBDMAModeSet() and USBDMAModeGet() APIs or +// USBDMAChannelConfig(). +// +//***************************************************************************** +#define USB_DMA_CFG_BURST_NONE 0x00000000 +#define USB_DMA_CFG_BURST_4 0x00000200 +#define USB_DMA_CFG_BURST_8 0x00000400 +#define USB_DMA_CFG_BURST_16 0x00000600 +#define USB_DMA_CFG_INT_EN 0x00000008 +#define USB_DMA_CFG_MODE_0 0x00000000 +#define USB_DMA_CFG_MODE_1 0x00000004 +#define USB_DMA_CFG_DIR_RX 0x00000000 +#define USB_DMA_CFG_DIR_TX 0x00000002 +#define USB_DMA_CFG_EN 0x00000001 + +//***************************************************************************** +// +// The following are values that can be passed to USBModeConfig() as the +// ui3Mode parameter. +// +//***************************************************************************** +#define USB_MODE_HOST_VBUS 0x00000004 +#define USB_MODE_HOST 0x00000002 +#define USB_MODE_DEV_VBUS 0x00000005 +#define USB_MODE_DEV 0x00000003 +#define USB_MODE_OTG 0x00000000 + +#define FIFO_TX 0 +#define FIFO_RX 1 +#define FIFO_TXRX 2 + +struct musb_fifo_cfg { + uint8_t ep_num; + uint8_t style; + uint8_t mode; + uint32_t maxpacket; +}; + +uint8_t usbd_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg); +uint8_t usbh_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg); +uint32_t usb_get_musb_ram_size(void); +void usbd_musb_delay_ms(uint8_t ms); + +#endif diff --git a/src/lib/CherryUSB/port/nuvoton/README.md b/src/lib/CherryUSB/port/nuvoton/README.md new file mode 100644 index 000000000..a91c8faeb --- /dev/null +++ b/src/lib/CherryUSB/port/nuvoton/README.md @@ -0,0 +1,7 @@ +# Note + +## Support Chip List + +- M032 Series +- M480 Series + diff --git a/src/lib/CherryUSB/port/nuvoton/usb_dc_usbfs.c b/src/lib/CherryUSB/port/nuvoton/usb_dc_usbfs.c new file mode 100644 index 000000000..ca2b60213 --- /dev/null +++ b/src/lib/CherryUSB/port/nuvoton/usb_dc_usbfs.c @@ -0,0 +1,455 @@ +#include +#include "NuMicro.h" +#include "usbd_core.h" + +#ifndef USBD_EPNUM +#define USBD_EPNUM 8 +#endif +#define USB_NUM_BIDIR_ENDPOINTS (USBD_EPNUM >> 1) + +#define USBD_EP_GET_CONFIG(ep) (*((__IO uint32_t *)((uint32_t)&USBD->EP[0].CFG + (uint32_t)((ep) << 4)))) + +/* Define EP maximum packet size */ +#define DEFAULT_EP_MAX_PKT_SIZE 64 + +#define EP0_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP1_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP2_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP3_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP4_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP5_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP6_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP7_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP8_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP9_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP10_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE +#define EP11_MAX_PKT_SIZE DEFAULT_EP_MAX_PKT_SIZE + +#define SETUP_BUF_BASE 0 +#define SETUP_BUF_LEN 8 +#define EP0_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_LEN) +#define EP0_BUF_LEN EP0_MAX_PKT_SIZE +#define EP1_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_LEN) +#define EP1_BUF_LEN EP1_MAX_PKT_SIZE +#define EP2_BUF_BASE (EP1_BUF_BASE + EP1_BUF_LEN) +#define EP2_BUF_LEN EP2_MAX_PKT_SIZE +#define EP3_BUF_BASE (EP2_BUF_BASE + EP2_BUF_LEN) +#define EP3_BUF_LEN EP3_MAX_PKT_SIZE +#define EP4_BUF_BASE (EP3_BUF_BASE + EP3_BUF_LEN) +#define EP4_BUF_LEN EP4_MAX_PKT_SIZE +#define EP5_BUF_BASE (EP4_BUF_BASE + EP4_BUF_LEN) +#define EP5_BUF_LEN EP5_MAX_PKT_SIZE +#if USBD_EPNUM >= 8 +#define EP6_BUF_BASE (EP5_BUF_BASE + EP5_BUF_LEN) +#define EP6_BUF_LEN EP6_MAX_PKT_SIZE +#define EP7_BUF_BASE (EP6_BUF_BASE + EP6_BUF_LEN) +#define EP7_BUF_LEN EP7_MAX_PKT_SIZE +#if USBD_EPNUM >= 10 +#define EP8_BUF_BASE (EP7_BUF_BASE + EP7_BUF_LEN) +#define EP8_BUF_LEN EP8_MAX_PKT_SIZE +#define EP9_BUF_BASE (EP8_BUF_BASE + EP8_BUF_LEN) +#define EP9_BUF_LEN EP9_MAX_PKT_SIZE +#if USBD_EPNUM >= 12 +#define EP10_BUF_BASE (EP9_BUF_BASE + EP9_BUF_LEN) +#define EP10_BUF_LEN EP10_MAX_PKT_SIZE +#define EP11_BUF_BASE (EP10_BUF_BASE + EP10_BUF_LEN) +#define EP11_BUF_LEN EP11_MAX_PKT_SIZE +#endif +#endif +#endif + +#define USBD_EPNUM_FROM_IN_EPIDX(ep_idx) ((ep_idx) << 1) +#define USBD_EPNUM_FROM_OUT_EPIDX(ep_idx) (((ep_idx) << 1) + 1) +#define USBD_EPNUM_FROM_EPADDR(ep_addr) \ + (USB_EP_DIR_IS_IN(ep_addr) ? USBD_EPNUM_FROM_IN_EPIDX(USB_EP_GET_IDX(ep_addr)) : USBD_EPNUM_FROM_OUT_EPIDX(USB_EP_GET_IDX(ep_addr))) + +/* Endpoint state */ +struct usb_dc_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; + uint32_t mps_xfer_len; +}; + +/* Driver state */ +struct usb_dc_config_priv { + volatile uint8_t dev_addr; + struct usb_dc_ep_state in_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< IN endpoint parameters*/ + struct usb_dc_ep_state out_ep[USB_NUM_BIDIR_ENDPOINTS]; /*!< OUT endpoint parameters */ +} g_nuvoton_udc; + +static uint8_t usbd_set_address_flag = 0; +static uint8_t usbd_out_toggle[USB_NUM_BIDIR_ENDPOINTS] = { 0 }; + +__WEAK void usb_dc_low_level_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + +int usb_dc_init(uint8_t busid) +{ + memset(&g_nuvoton_udc, 0, sizeof(g_nuvoton_udc)); + + usb_dc_low_level_init(); + + /*****************************************************/ + /* Initial USB engine */ + USBD->ATTR = 0x6D0ul; + /* Force SE0 */ + USBD_SET_SE0(); + + /*****************************************************/ + /* Init setup packet buffer */ + /* Buffer for setup packet -> [0 ~ 0x7] */ + USBD->STBUFSEG = SETUP_BUF_BASE; + + USBD_SET_EP_BUF_ADDR(EP0, EP0_BUF_BASE); + USBD_SET_EP_BUF_ADDR(EP1, EP1_BUF_BASE); + USBD_SET_EP_BUF_ADDR(EP2, EP2_BUF_BASE); + USBD_SET_EP_BUF_ADDR(EP3, EP3_BUF_BASE); + USBD_SET_EP_BUF_ADDR(EP4, EP4_BUF_BASE); + USBD_SET_EP_BUF_ADDR(EP5, EP5_BUF_BASE); +#if USBD_EPNUM >= 8 + USBD_SET_EP_BUF_ADDR(EP6, EP6_BUF_BASE); + USBD_SET_EP_BUF_ADDR(EP7, EP7_BUF_BASE); +#if USBD_EPNUM >= 10 + USBD_SET_EP_BUF_ADDR(EP8, EP8_BUF_BASE); + USBD_SET_EP_BUF_ADDR(EP9, EP9_BUF_BASE); + USBD_SET_EP_BUF_ADDR(EP10, EP10_BUF_BASE); +#if USBD_EPNUM >= 12 + USBD_SET_EP_BUF_ADDR(EP11, EP11_BUF_BASE); +#endif +#endif +#endif + + /*****************************************************/ + /* USB start */ + /* Disable software-disconnect function */ + USBD_CLR_SE0(); + USBD->ATTR = 0x7D0ul; + + /* Clear USB-related interrupts before enable interrupt */ + USBD_CLR_INT_FLAG(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP); + + /* Enable USB-related interrupts. */ + USBD_ENABLE_INT(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP); + /*****************************************************/ + + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + USBD->ATTR = 0x00000040; + /* Force SE0 */ + USBD_SET_SE0(); + + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + uint8_t usbd_addr = USBD_GET_ADDR(); + if ((usbd_addr == 0) && (usbd_addr != addr)) { + g_nuvoton_udc.dev_addr = addr; + usbd_set_address_flag = 1; + } + + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + return -1; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + return USB_SPEED_FULL; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + + if (USB_EP_DIR_IS_IN(ep->bEndpointAddress)) { + uint8_t epnum = USBD_EPNUM_FROM_IN_EPIDX(ep_idx); + + g_nuvoton_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_nuvoton_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_nuvoton_udc.in_ep[ep_idx].ep_enable = true; + if (ep_idx == 0) { + /* EP0 ==> control IN endpoint, address 0 */ + USBD_CONFIG_EP(EP0, USBD_CFG_CSTALL | USBD_CFG_EPMODE_IN | 0); + } else { + USBD_CONFIG_EP(epnum, USBD_CFG_EPMODE_IN | ep_idx); + USBD_STOP_TRANSACTION(epnum); + } + } else { + uint8_t epnum = USBD_EPNUM_FROM_OUT_EPIDX(ep_idx); + + g_nuvoton_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_nuvoton_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_nuvoton_udc.out_ep[ep_idx].ep_enable = true; + if (ep_idx == 0) { + /* EP1 ==> control OUT endpoint, address 0 */ + USBD_CONFIG_EP(EP1, USBD_CFG_CSTALL | USBD_CFG_EPMODE_OUT | 0); + } else { + USBD_CONFIG_EP(epnum, USBD_CFG_EPMODE_OUT | ep_idx); + USBD_STOP_TRANSACTION(epnum); + } + } + + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + USBD->EP[USBD_EPNUM_FROM_EPADDR(ep)].CFG &= ~USBD_CFG_STATE_Msk; // disable endpoint + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + USBD_SET_EP_STALL(USBD_EPNUM_FROM_EPADDR(ep)); + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + USBD_CLR_EP_STALL(USBD_EPNUM_FROM_EPADDR(ep)); + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + *stalled = USBD_GET_EP_STALL(USBD_EPNUM_FROM_EPADDR(ep)) > 0 ? 1 : 0; + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_nuvoton_udc.in_ep[ep_idx].ep_enable) { + return -2; + } + + uint8_t epnum = USBD_EPNUM_FROM_IN_EPIDX(ep); + + g_nuvoton_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_nuvoton_udc.in_ep[ep_idx].xfer_len = data_len; + g_nuvoton_udc.in_ep[ep_idx].actual_xfer_len = 0; + + if (data_len > g_nuvoton_udc.in_ep[ep_idx].ep_mps) { + data_len = g_nuvoton_udc.in_ep[ep_idx].ep_mps; + } + + if (epnum == 0) { + USBD_SET_DATA1(epnum); + } + + USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(epnum)), (uint8_t *)data, data_len); + USBD_SET_PAYLOAD_LEN(epnum, data_len); + + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_nuvoton_udc.out_ep[ep_idx].ep_enable) { + return -2; + } + + uint8_t epnum = USBD_EPNUM_FROM_OUT_EPIDX(ep); + + g_nuvoton_udc.out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_nuvoton_udc.out_ep[ep_idx].xfer_len = data_len; + g_nuvoton_udc.out_ep[ep_idx].actual_xfer_len = 0; + + if (g_nuvoton_udc.out_ep[ep_idx].xfer_len < g_nuvoton_udc.out_ep[ep_idx].ep_mps) { + g_nuvoton_udc.out_ep[ep_idx].mps_xfer_len = g_nuvoton_udc.out_ep[ep_idx].xfer_len; + } else { + g_nuvoton_udc.out_ep[ep_idx].mps_xfer_len = g_nuvoton_udc.out_ep[ep_idx].ep_mps; + } + + USBD_SET_PAYLOAD_LEN(epnum, g_nuvoton_udc.out_ep[ep_idx].mps_xfer_len); + + return 0; +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint32_t int_flag = USBD_GET_INT_FLAG(); + uint32_t bus_state = USBD_GET_BUS_STATE(); + + if (int_flag & USBD_INTSTS_FLDET) { + // Floating detect + USBD_CLR_INT_FLAG(USBD_INTSTS_FLDET); + + if (USBD_IS_ATTACHED()) { + /* USB Plug In */ + USBD_ENABLE_USB(); + usbd_event_connect_handler(0); + } else { + /* USB Un-plug */ + USBD_DISABLE_USB(); + usbd_event_disconnect_handler(0); + } + } + + //------------------------------------------------------------------ + if (int_flag & USBD_INTSTS_BUS) { + /* Clear event flag */ + USBD_CLR_INT_FLAG(USBD_INTSTS_BUS); + + if (bus_state & USBD_STATE_USBRST) { + /* Bus reset */ + USBD_ENABLE_USB(); + + memset((usbd_out_toggle + 1), 0, (USB_NUM_BIDIR_ENDPOINTS - 1)); + + for (uint8_t i = 0; i < USBD_MAX_EP; i++) { + USBD->EP[i].CFG = 0; // default value + } + + USBD_SET_ADDR(0ul); + g_nuvoton_udc.dev_addr = 0; + + usbd_event_reset_handler(0); + } + + if (bus_state & USBD_STATE_SUSPEND) { + /* Enable USB but disable PHY */ + USBD_DISABLE_PHY(); + usbd_event_suspend_handler(0); + } + if (bus_state & USBD_STATE_RESUME) { + /* Enable USB and enable PHY */ + USBD_ENABLE_USB(); + usbd_event_resume_handler(0); + } + } + + //------------------------------------------------------------------ + if (int_flag & USBD_INTSTS_WAKEUP) { + /* Clear event flag */ + USBD_CLR_INT_FLAG(USBD_INTSTS_WAKEUP); + } + + if (int_flag & USBD_INTSTS_USB) { + // USB event + if (int_flag & USBD_INTSTS_SETUP) { + // Setup packet + /* Clear event flag */ + USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP); + + /* Clear the data IN/OUT ready flag of control end-points */ + USBD_STOP_TRANSACTION(EP0); + USBD_STOP_TRANSACTION(EP1); + + usbd_out_toggle[0] = 0; + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)(USBD_BUF_BASE)); + } + + if (int_flag & USBD_INTSTS_EP0) { + /* In ACK for Set address */ + if (usbd_set_address_flag == 1) { + USBD_SET_ADDR(g_nuvoton_udc.dev_addr); + usbd_set_address_flag = 0; + } + } + + // if (int_flag & USBD_INTSTS_EP1) + // { + // } + + for (uint8_t epnum = 0; epnum < USBD_EPNUM; epnum++) { + if (int_flag & (USBD_INTSTS_EP0 << epnum)) { + USBD_CLR_INT_FLAG((USBD_INTSTS_EP0 << epnum)); + + uint8_t ep_cfg = USBD_EP_GET_CONFIG(epnum); + + uint8_t ep_state = 0; +#if USBD_EPNUM >= 10 + if (epnum > 7) { + ep_state = (USBD->EPSTS1 >> ((epnum - 8) * 4)) & 0x0f; + } else +#endif + { + ep_state = (USBD->EPSTS0 >> (epnum * 4)) & 0x0f; + } + + uint8_t ep_cfg_state = (ep_cfg & USBD_CFG_STATE_Msk) >> USBD_CFG_STATE_Pos; + + if (ep_cfg_state == 0x01) { + // OUT + uint8_t ep_idx = ep_cfg & USBD_CFG_EPNUM_Msk; + + if (ep_state == usbd_out_toggle[ep_idx]) { + USBD_SET_PAYLOAD_LEN(epnum, g_nuvoton_udc.out_ep[ep_idx].ep_mps); + } else { + uint32_t recv_count = USBD_GET_PAYLOAD_LEN(epnum); + + USBD_MemCopy((uint8_t *)g_nuvoton_udc.out_ep[ep_idx].xfer_buf, + (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(epnum)), recv_count); + + g_nuvoton_udc.out_ep[ep_idx].xfer_buf += recv_count; + g_nuvoton_udc.out_ep[ep_idx].xfer_len -= recv_count; + g_nuvoton_udc.out_ep[ep_idx].actual_xfer_len += recv_count; + + usbd_out_toggle[ep_idx] = ep_state; + + if ((recv_count < g_nuvoton_udc.out_ep[ep_idx].ep_mps) || + (g_nuvoton_udc.out_ep[ep_idx].xfer_len == 0)) { + usbd_event_ep_out_complete_handler(0, ep_idx, g_nuvoton_udc.out_ep[ep_idx].actual_xfer_len); + } else { + if (g_nuvoton_udc.out_ep[ep_idx].xfer_len < g_nuvoton_udc.out_ep[ep_idx].ep_mps) { + g_nuvoton_udc.out_ep[ep_idx].mps_xfer_len = g_nuvoton_udc.out_ep[ep_idx].xfer_len; + } else { + g_nuvoton_udc.out_ep[ep_idx].mps_xfer_len = g_nuvoton_udc.out_ep[ep_idx].ep_mps; + } + + USBD_SET_PAYLOAD_LEN(epnum, g_nuvoton_udc.out_ep[ep_idx].mps_xfer_len); + } + } + } else if (ep_cfg_state == 0x02) { + uint8_t ep_idx = ep_cfg & USBD_CFG_EPNUM_Msk; + // In Ack + + if (g_nuvoton_udc.in_ep[ep_idx].xfer_len > g_nuvoton_udc.in_ep[ep_idx].ep_mps) { + g_nuvoton_udc.in_ep[ep_idx].xfer_buf += g_nuvoton_udc.in_ep[ep_idx].ep_mps; + g_nuvoton_udc.in_ep[ep_idx].xfer_len -= g_nuvoton_udc.in_ep[ep_idx].ep_mps; + g_nuvoton_udc.in_ep[ep_idx].actual_xfer_len += g_nuvoton_udc.in_ep[ep_idx].ep_mps; + + uint16_t min_len = MIN(g_nuvoton_udc.in_ep[ep_idx].xfer_len, g_nuvoton_udc.in_ep[ep_idx].ep_mps); + + uint8_t *usbd_ep_buf_addr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(epnum)); + USBD_MemCopy(usbd_ep_buf_addr, g_nuvoton_udc.in_ep[ep_idx].xfer_buf, min_len); + USBD_SET_PAYLOAD_LEN(epnum, min_len); + } else { + g_nuvoton_udc.in_ep[ep_idx].actual_xfer_len += g_nuvoton_udc.in_ep[ep_idx].xfer_len; + g_nuvoton_udc.in_ep[ep_idx].xfer_len = 0; + + usbd_event_ep_in_complete_handler(0, ep_idx | 0x80, g_nuvoton_udc.in_ep[ep_idx].actual_xfer_len); + } + } + } + } + } +} diff --git a/src/lib/CherryUSB/port/nxp/README.md b/src/lib/CherryUSB/port/nxp/README.md new file mode 100644 index 000000000..c7d956685 --- /dev/null +++ b/src/lib/CherryUSB/port/nxp/README.md @@ -0,0 +1,17 @@ +# Note + +## Support Chip List + +### MCX + +Modify USB_NOCACHE_RAM_SECTION + +``` +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".NonCacheable"))) +``` + +- MCXN9XX/MCXN236 (chipidea + EHCI) + +### IMRT + +- IMRT10XX/IMRT11XX (chipidea + EHCI) \ No newline at end of file diff --git a/src/lib/CherryUSB/port/nxp/usb_glue_mcx.c b/src/lib/CherryUSB/port/nxp/usb_glue_mcx.c new file mode 100644 index 000000000..66f2cbe33 --- /dev/null +++ b/src/lib/CherryUSB/port/nxp/usb_glue_mcx.c @@ -0,0 +1,449 @@ +/* + * Copyright (c) 2024 ~ 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbh_core.h" +#include "fsl_common.h" +#include "fsl_cache.h" +#include "usb_chipidea_reg.h" + +__WEAK void USBD_IRQHandler(uint8_t busid) +{ +} + +__WEAK void USBH_IRQHandler(uint8_t busid) +{ +} + +#if !defined(CONFIG_USB_EHCI_NXP) +#error "mcx ehci must config CONFIG_USB_EHCI_NXP" +#endif + +#if !defined(CONFIG_USB_EHCI_HCCR_OFFSET) || CONFIG_USB_EHCI_HCCR_OFFSET != 0x100 +#error "mcx ehci must config CONFIG_USB_EHCI_HCCR_OFFSET to 0x100" +#endif + +#define USB_DEVICE_CONFIG_EHCI 1 + +/*! @brief USB controller ID */ +typedef enum _usb_controller_index { + kUSB_ControllerKhci0 = 0U, /*!< KHCI 0U */ + kUSB_ControllerKhci1 = 1U, /*!< KHCI 1U, Currently, there are no platforms which have two KHCI IPs, this is reserved + to be used in the future. */ + kUSB_ControllerEhci0 = 2U, /*!< EHCI 0U */ + kUSB_ControllerEhci1 = 3U, /*!< EHCI 1U, Currently, there are no platforms which have two EHCI IPs, this is reserved + to be used in the future. */ + + kUSB_ControllerLpcIp3511Fs0 = 4U, /*!< LPC USB IP3511 FS controller 0 */ + kUSB_ControllerLpcIp3511Fs1 = 5U, /*!< LPC USB IP3511 FS controller 1, there are no platforms which have two IP3511 + IPs, this is reserved to be used in the future. */ + + kUSB_ControllerLpcIp3511Hs0 = 6U, /*!< LPC USB IP3511 HS controller 0 */ + kUSB_ControllerLpcIp3511Hs1 = 7U, /*!< LPC USB IP3511 HS controller 1, there are no platforms which have two IP3511 + IPs, this is reserved to be used in the future. */ + + kUSB_ControllerOhci0 = 8U, /*!< OHCI 0U */ + kUSB_ControllerOhci1 = 9U, /*!< OHCI 1U, Currently, there are no platforms which have two OHCI IPs, this is reserved + to be used in the future. */ + + kUSB_ControllerIp3516Hs0 = 10U, /*!< IP3516HS 0U */ + kUSB_ControllerIp3516Hs1 = 11U, /*!< IP3516HS 1U, Currently, there are no platforms which have two IP3516HS IPs, + this is reserved to be used in the future. */ + kUSB_ControllerDwc30 = 12U, /*!< DWC3 0U */ + kUSB_ControllerDwc31 = 13U, /*!< DWC3 1U Currently, there are no platforms which have two Dwc IPs, this is reserved + to be used in the future.*/ +} usb_controller_index_t; + +/* USB PHY condfiguration */ +#define BOARD_USB_PHY_D_CAL (0x04U) +#define BOARD_USB_PHY_TXCAL45DP (0x07U) +#define BOARD_USB_PHY_TXCAL45DM (0x07U) +#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */ + +typedef struct _usb_phy_config_struct { + uint8_t D_CAL; /* Decode to trim the nominal 17.78mA current source */ + uint8_t TXCAL45DP; /* Decode to trim the nominal 45-Ohm series termination resistance to the USB_DP output pin */ + uint8_t TXCAL45DM; /* Decode to trim the nominal 45-Ohm series termination resistance to the USB_DM output pin */ +} usb_phy_config_struct_t; + +void *USB_EhciPhyGetBase(uint8_t controllerId) +{ + void *usbPhyBase = NULL; +#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U)) +#if defined(USBPHY_STACK_BASE_ADDRS) + uint32_t usbphy_base[] = USBPHY_STACK_BASE_ADDRS; +#else + uint32_t usbphy_base[] = USBPHY_BASE_ADDRS; +#endif + uint32_t *temp; + if (controllerId < (uint8_t)kUSB_ControllerEhci0) { + return NULL; + } + + if ((controllerId == (uint8_t)kUSB_ControllerEhci0) || (controllerId == (uint8_t)kUSB_ControllerEhci1)) { + controllerId = controllerId - (uint8_t)kUSB_ControllerEhci0; + } else if ((controllerId == (uint8_t)kUSB_ControllerLpcIp3511Hs0) || + (controllerId == (uint8_t)kUSB_ControllerLpcIp3511Hs1)) { + controllerId = controllerId - (uint8_t)kUSB_ControllerLpcIp3511Hs0; + } else if ((controllerId == (uint8_t)kUSB_ControllerIp3516Hs0) || (controllerId == (uint8_t)kUSB_ControllerIp3516Hs1)) { + controllerId = controllerId - (uint8_t)kUSB_ControllerIp3516Hs0; + } else { + return NULL; + } + + if (controllerId < (sizeof(usbphy_base) / sizeof(usbphy_base[0]))) { + temp = (uint32_t *)usbphy_base[controllerId]; + usbPhyBase = (void *)temp; + } else { + return NULL; + } +#endif + return usbPhyBase; +} + +/*! + * @brief ehci phy initialization. + * + * This function initialize ehci phy IP. + * + * @param[in] controllerId ehci controller id, please reference to #usb_controller_index_t. + * @param[in] freq the external input clock. + * for example: if the external input clock is 16M, the parameter freq should be 16000000. + * + * @retval 0 cancel successfully. + * @retval -1 the freq value is incorrect. + */ +uint32_t USB_EhciPhyInit(uint8_t controllerId, uint32_t freq, usb_phy_config_struct_t *phyConfig) +{ +#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U)) + USBPHY_Type *usbPhyBase; + + usbPhyBase = (USBPHY_Type *)USB_EhciPhyGetBase(controllerId); + if (NULL == usbPhyBase) { + return (uint8_t)-1; + } + +#if ((defined FSL_FEATURE_SOC_ANATOP_COUNT) && (FSL_FEATURE_SOC_ANATOP_COUNT > 0U)) + ANATOP->HW_ANADIG_REG_3P0.RW = + (ANATOP->HW_ANADIG_REG_3P0.RW & + (~(ANATOP_HW_ANADIG_REG_3P0_OUTPUT_TRG(0x1F) | ANATOP_HW_ANADIG_REG_3P0_ENABLE_ILIMIT_MASK))) | + ANATOP_HW_ANADIG_REG_3P0_OUTPUT_TRG(0x17) | ANATOP_HW_ANADIG_REG_3P0_ENABLE_LINREG_MASK; + ANATOP->HW_ANADIG_USB2_CHRG_DETECT.SET = + ANATOP_HW_ANADIG_USB2_CHRG_DETECT_CHK_CHRG_B_MASK | ANATOP_HW_ANADIG_USB2_CHRG_DETECT_EN_B_MASK; +#endif + +#if (defined USB_ANALOG) + USB_ANALOG->INSTANCE[controllerId - (uint8_t)kUSB_ControllerEhci0].CHRG_DETECT_SET = + USB_ANALOG_CHRG_DETECT_CHK_CHRG_B(1) | USB_ANALOG_CHRG_DETECT_EN_B(1); +#endif + +#if ((!(defined FSL_FEATURE_SOC_CCM_ANALOG_COUNT)) && (!(defined FSL_FEATURE_SOC_ANATOP_COUNT))) + + usbPhyBase->TRIM_OVERRIDE_EN = 0x001fU; /* override IFR value */ +#endif + usbPhyBase->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL2_MASK; /* support LS device. */ + usbPhyBase->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL3_MASK; /* support external FS Hub with LS device connected. */ + /* PWD register provides overall control of the PHY power state */ + usbPhyBase->PWD = 0U; + if (((uint8_t)kUSB_ControllerIp3516Hs0 == controllerId) || ((uint8_t)kUSB_ControllerIp3516Hs1 == controllerId) || + ((uint8_t)kUSB_ControllerLpcIp3511Hs0 == controllerId) || + ((uint8_t)kUSB_ControllerLpcIp3511Hs1 == controllerId)) { + usbPhyBase->CTRL_SET = USBPHY_CTRL_SET_ENAUTOCLR_CLKGATE_MASK; + usbPhyBase->CTRL_SET = USBPHY_CTRL_SET_ENAUTOCLR_PHY_PWD_MASK; + } + if (NULL != phyConfig) { + /* Decode to trim the nominal 17.78mA current source for the High Speed TX drivers on USB_DP and USB_DM. */ + usbPhyBase->TX = + ((usbPhyBase->TX & (~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK))) | + (USBPHY_TX_D_CAL(phyConfig->D_CAL) | USBPHY_TX_TXCAL45DP(phyConfig->TXCAL45DP) | + USBPHY_TX_TXCAL45DM(phyConfig->TXCAL45DM))); + } +#endif + + return (uint8_t)0; +} + +/*! + * @brief ehci phy initialization for suspend and resume. + * + * This function initialize ehci phy IP for suspend and resume. + * + * @param[in] controllerId ehci controller id, please reference to #usb_controller_index_t. + * @param[in] freq the external input clock. + * for example: if the external input clock is 16M, the parameter freq should be 16000000. + * + * @retval 0 cancel successfully. + * @retval -1 the freq value is incorrect. + */ +uint32_t USB_EhciLowPowerPhyInit(uint8_t controllerId, uint32_t freq, usb_phy_config_struct_t *phyConfig) +{ +#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U)) + USBPHY_Type *usbPhyBase; + + usbPhyBase = (USBPHY_Type *)USB_EhciPhyGetBase(controllerId); + if (NULL == usbPhyBase) { + return (uint8_t)-1; + } + +#if ((!(defined FSL_FEATURE_SOC_CCM_ANALOG_COUNT)) && (!(defined FSL_FEATURE_SOC_ANATOP_COUNT))) + usbPhyBase->TRIM_OVERRIDE_EN = 0x001fU; /* override IFR value */ +#endif + +#if ((defined USBPHY_CTRL_AUTORESUME_EN_MASK) && (USBPHY_CTRL_AUTORESUME_EN_MASK > 0U)) + usbPhyBase->CTRL_CLR |= USBPHY_CTRL_AUTORESUME_EN_MASK; +#else + usbPhyBase->CTRL |= USBPHY_CTRL_ENAUTO_PWRON_PLL_MASK; +#endif + usbPhyBase->CTRL |= USBPHY_CTRL_ENAUTOCLR_CLKGATE_MASK | USBPHY_CTRL_ENAUTOCLR_PHY_PWD_MASK; + usbPhyBase->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL2_MASK; /* support LS device. */ + usbPhyBase->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL3_MASK; /* support external FS Hub with LS device connected. */ + /* PWD register provides overall control of the PHY power state */ + usbPhyBase->PWD = 0U; +#if (defined USBPHY_ANACTRL_PFD_CLKGATE_MASK) + /* now the 480MHz USB clock is up, then configure fractional divider after PLL with PFD + * pfd clock = 480MHz*18/N, where N=18~35 + * Please note that USB1PFDCLK has to be less than 180MHz for RUN or HSRUN mode + */ + usbPhyBase->ANACTRL |= USBPHY_ANACTRL_PFD_FRAC(24); /* N=24 */ + usbPhyBase->ANACTRL |= USBPHY_ANACTRL_PFD_CLK_SEL(1); /* div by 4 */ + + usbPhyBase->ANACTRL &= ~USBPHY_ANACTRL_DEV_PULLDOWN_MASK; + usbPhyBase->ANACTRL &= ~USBPHY_ANACTRL_PFD_CLKGATE_MASK; + while (0U == (usbPhyBase->ANACTRL & USBPHY_ANACTRL_PFD_STABLE_MASK)) { + } +#endif + if (NULL != phyConfig) { + /* Decode to trim the nominal 17.78mA current source for the High Speed TX drivers on USB_DP and USB_DM. */ + usbPhyBase->TX = + ((usbPhyBase->TX & (~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK))) | + (USBPHY_TX_D_CAL(phyConfig->D_CAL) | USBPHY_TX_TXCAL45DP(phyConfig->TXCAL45DP) | + USBPHY_TX_TXCAL45DM(phyConfig->TXCAL45DM))); + } +#endif + + return (uint8_t)0; +} + +/*! + * @brief ehci phy de-initialization. + * + * This function de-initialize ehci phy IP. + * + * @param[in] controllerId ehci controller id, please reference to #usb_controller_index_t. + */ +void USB_EhciPhyDeinit(uint8_t controllerId) +{ +#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U)) + USBPHY_Type *usbPhyBase; + + usbPhyBase = (USBPHY_Type *)USB_EhciPhyGetBase(controllerId); + if (NULL == usbPhyBase) { + return; + } +#if ((!(defined FSL_FEATURE_SOC_CCM_ANALOG_COUNT)) && (!(defined FSL_FEATURE_SOC_ANATOP_COUNT))) + usbPhyBase->PLL_SIC &= ~USBPHY_PLL_SIC_PLL_POWER_MASK; /* power down PLL */ + usbPhyBase->PLL_SIC &= ~USBPHY_PLL_SIC_PLL_EN_USB_CLKS_MASK; /* disable USB clock output from USB PHY PLL */ +#endif + usbPhyBase->CTRL |= USBPHY_CTRL_CLKGATE_MASK; /* set to 1U to gate clocks */ +#endif +} + +/*! + * @brief ehci phy disconnect detection enable or disable. + * + * This function enable/disable host ehci disconnect detection. + * + * @param[in] controllerId ehci controller id, please reference to #usb_controller_index_t. + * @param[in] enable + * 1U - enable; + * 0U - disable; + */ +void USB_EhcihostPhyDisconnectDetectCmd(uint8_t controllerId, uint8_t enable) +{ +#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U)) + USBPHY_Type *usbPhyBase; + + usbPhyBase = (USBPHY_Type *)USB_EhciPhyGetBase(controllerId); + if (NULL == usbPhyBase) { + return; + } + + if (0U != enable) { + usbPhyBase->CTRL |= USBPHY_CTRL_ENHOSTDISCONDETECT_MASK; + } else { + usbPhyBase->CTRL &= (~USBPHY_CTRL_ENHOSTDISCONDETECT_MASK); + } +#endif +} + +#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U)) +#if ((defined FSL_FEATURE_USBHSD_HAS_EXIT_HS_ISSUE) && (FSL_FEATURE_USBHSD_HAS_EXIT_HS_ISSUE > 0U)) +void USB_PhyDeviceForceEnterFSMode(uint8_t controllerId, uint8_t enable) +{ + USBPHY_Type *usbPhyBase; + + usbPhyBase = (USBPHY_Type *)USB_EhciPhyGetBase(controllerId); + if (NULL == usbPhyBase) { + return; + } + + if (0U != enable) { + uint32_t delay = 1000000; + usbPhyBase->DEBUG0_CLR = USBPHY_DEBUG0_CLKGATE_MASK; + while ((0U != (usbPhyBase->USB1_VBUS_DET_STAT & USBPHY_USB1_VBUS_DET_STAT_VBUS_VALID_3V_MASK)) && (0U != delay)) { + delay--; + } + usbPhyBase->USB1_LOOPBACK_SET = USBPHY_USB1_LOOPBACK_UTMI_TESTSTART_MASK; + } else { + usbPhyBase->DEBUG0_CLR = USBPHY_DEBUG0_CLKGATE_MASK; + usbPhyBase->USB1_LOOPBACK_CLR = USBPHY_USB1_LOOPBACK_UTMI_TESTSTART_MASK; + } +} +#endif +#endif + +void USB_ClockInit(void) +{ + usb_phy_config_struct_t phyConfig = { + BOARD_USB_PHY_D_CAL, + BOARD_USB_PHY_TXCAL45DP, + BOARD_USB_PHY_TXCAL45DM, + }; + + SPC0->ACTIVE_VDELAY = 0x0500; + /* Change the power DCDC to 1.8v (By deafult, DCDC is 1.8V), CORELDO to 1.1v (By deafult, CORELDO is 1.0V) */ + SPC0->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK; + SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_DCDC_VDD_LVL(0x3) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(0x3) | + SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK | SPC_ACTIVE_CFG_DCDC_VDD_DS(0x2u); + /* Wait until it is done */ + while (SPC0->SC & SPC_SC_BUSY_MASK) + ; + if (0u == (SCG0->LDOCSR & SCG_LDOCSR_LDOEN_MASK)) { + SCG0->TRIM_LOCK = 0x5a5a0001U; + SCG0->LDOCSR |= SCG_LDOCSR_LDOEN_MASK; + /* wait LDO ready */ + while (0U == (SCG0->LDOCSR & SCG_LDOCSR_VOUT_OK_MASK)) + ; + } + SYSCON->AHBCLKCTRLSET[2] |= SYSCON_AHBCLKCTRL2_USB_HS_MASK | SYSCON_AHBCLKCTRL2_USB_HS_PHY_MASK; + SCG0->SOSCCFG &= ~(SCG_SOSCCFG_RANGE_MASK | SCG_SOSCCFG_EREFS_MASK); + /* xtal = 20 ~ 30MHz */ + SCG0->SOSCCFG = (1U << SCG_SOSCCFG_RANGE_SHIFT) | (1U << SCG_SOSCCFG_EREFS_SHIFT); + SCG0->SOSCCSR |= SCG_SOSCCSR_SOSCEN_MASK; + while (1) { + if (SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) { + break; + } + } + SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK | SYSCON_CLOCK_CTRL_CLKIN_ENA_FM_USBH_LPT_MASK; + CLOCK_EnableClock(kCLOCK_UsbHs); + CLOCK_EnableClock(kCLOCK_UsbHsPhy); + CLOCK_EnableUsbhsPhyPllClock(kCLOCK_Usbphy480M, 24000000U); + CLOCK_EnableUsbhsClock(); + USB_EhciPhyInit(kUSB_ControllerEhci0, BOARD_XTAL0_CLK_HZ, &phyConfig); +} + +void (*g_usb_nxp_irq)(uint8_t busid); + +void usb_dc_low_level_init(uint8_t busid) +{ + USB_ClockInit(); + + g_usb_nxp_irq = USBD_IRQHandler; + + /* Install isr, set priority, and enable IRQ. */ + NVIC_SetPriority((IRQn_Type)USB1_HS_IRQn, 3); + EnableIRQ((IRQn_Type)USB1_HS_IRQn); +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + DisableIRQ((IRQn_Type)USB1_HS_IRQn); +} + +static void usb_host_mode_init(CHIPIDEA_TypeDef *ptr) +{ + /* Set mode to host, must be set immediately after reset */ + ptr->USBMODE &= ~USB_USBMODE_CM_MASK; + ptr->USBMODE |= USB_USBMODE_CM_SET(3); + + /* Set the endian */ + ptr->USBMODE &= ~USB_USBMODE_ES_MASK; + + /* Set parallel interface signal */ + ptr->PORTSC1 &= ~USB_PORTSC1_STS_MASK; + + /* Set parallel transceiver width */ + ptr->PORTSC1 &= ~USB_PORTSC1_PTW_MASK; + + /* Not use interrupt threshold. */ + ptr->USBCMD &= ~USB_USBCMD_ITC_MASK; +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + USB_ClockInit(); + + g_usb_nxp_irq = USBH_IRQHandler; + + /* Install isr, set priority, and enable IRQ. */ + NVIC_SetPriority((IRQn_Type)USB1_HS_IRQn, 3); + EnableIRQ((IRQn_Type)USB1_HS_IRQn); +} + +void usb_hc_low_level2_init(struct usbh_bus *bus) +{ + usb_host_mode_init((CHIPIDEA_TypeDef *)(bus->hcd.reg_base)); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + DisableIRQ((IRQn_Type)USB1_HS_IRQn); +} + +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) +{ + (void)port; + uint8_t speed; + + CHIPIDEA_TypeDef *ptr = (CHIPIDEA_TypeDef *)bus->hcd.reg_base; + + speed = USB_PORTSC1_PSPD_GET(ptr->PORTSC1); + + if (speed == 0x00) { + return USB_SPEED_FULL; + } + if (speed == 0x01) { + return USB_SPEED_LOW; + } + if (speed == 0x02) { + USB_EhcihostPhyDisconnectDetectCmd(kUSB_ControllerEhci0, 1); + return USB_SPEED_HIGH; + } + + return 0; +} + +void USB1_HS_IRQHandler(void) +{ + g_usb_nxp_irq(0); +} + +#ifdef CONFIG_USB_DCACHE_ENABLE +void usb_dcache_clean(uintptr_t addr, size_t size) +{ + DCACHE_CleanByRange(addr, size); +} + +void usb_dcache_invalidate(uintptr_t addr, size_t size) +{ + DCACHE_InvalidateByRange(addr, size); +} + +void usb_dcache_flush(uintptr_t addr, size_t size) +{ + DCACHE_CleanInvalidateByRange(addr, size); +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ohci/README.md b/src/lib/CherryUSB/port/ohci/README.md new file mode 100644 index 000000000..928eb0c3f --- /dev/null +++ b/src/lib/CherryUSB/port/ohci/README.md @@ -0,0 +1,23 @@ +# Note + +This OHCI is a companion controller of EHCI. But you can use OHCI only without CONFIG_USB_EHCI_WITH_OHCI definition. + +**And you need to pay for using OHCI driver**. + +## Support Chip List + +### AllwinnerTech + +- F133(EHCI + OHCI) + +### Nuvoton + +- Nuvoton all series(EHCI + OHCI, OHCI only) + +### Artinchip + +- d13x, d21x(EHCI + OHCI) + +### NXP + +- LPC4X/LPC5X(OHCI only) \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ohci/usb_glue_lpc.c b/src/lib/CherryUSB/port/ohci/usb_glue_lpc.c new file mode 100644 index 000000000..51ab78140 --- /dev/null +++ b/src/lib/CherryUSB/port/ohci/usb_glue_lpc.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "fsl_device_registers.h" +#include "fsl_power.h" +#include "usbh_core.h" + +#if defined(CONFIG_USB_EHCI_WITH_OHCI) +#error "lpc does not have ehci" +#endif + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ +#if ((defined FSL_FEATURE_SOC_SYSMPU_COUNT) && (FSL_FEATURE_SOC_SYSMPU_COUNT)) + SYSMPU_Enable(SYSMPU, 0); +#endif /* FSL_FEATURE_SOC_SYSMPU_COUNT */ + + NVIC_ClearPendingIRQ(USB0_IRQn); + NVIC_ClearPendingIRQ(USB0_NEEDCLK_IRQn); + + POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); /*< Turn on USB0 Phy */ + + RESET_PeripheralReset(kUSB0D_RST_SHIFT_RSTn); + RESET_PeripheralReset(kUSB0HSL_RST_SHIFT_RSTn); + RESET_PeripheralReset(kUSB0HMR_RST_SHIFT_RSTn); + + CLOCK_EnableUsbfs0HostClock(kCLOCK_UsbfsSrcPll1, 48000000U); + + NVIC_SetPriority(USB0_IRQn, 3); + EnableIRQ(USB0_IRQn); +} + + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + DisableIRQ(USB0_IRQn); +} + +void USB0_IRQHandler(void) +{ + extern void USBH_IRQHandler(uint8_t busid); + USBH_IRQHandler(0); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ohci/usb_hc_ohci.c b/src/lib/CherryUSB/port/ohci/usb_hc_ohci.c new file mode 100644 index 000000000..2bec2a039 --- /dev/null +++ b/src/lib/CherryUSB/port/ohci/usb_hc_ohci.c @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usb_hc_ohci.h" + +/* Frame Interval / Periodic Start. + * + * At 12Mbps, there are 12000 bit time in each 1Msec frame. + */ + +#define OHCI_FMINTERVAL_FI (12000 - 1) +#define OHCI_FMINTERVAL_FSMPS ((6 * (OHCI_FMINTERVAL_FI - 210)) / 7) +#define DEFAULT_FMINTERVAL ((OHCI_FMINTERVAL_FSMPS << OHCI_FMINT_FSMPS_SHIFT) | OHCI_FMINTERVAL_FI) +#define DEFAULT_PERSTART ((OHCI_FMINTERVAL_FI * 9) / 10) + +struct ohci_hcd g_ohci_hcd[CONFIG_USBHOST_MAX_BUS]; + +USB_NOCACHE_RAM_SECTION struct ohci_ed_hw g_ohci_ed_pool[CONFIG_USBHOST_MAX_BUS][CONFIG_USB_OHCI_ED_NUM]; +USB_NOCACHE_RAM_SECTION struct ohci_hcca ohci_hcca[CONFIG_USBHOST_MAX_BUS]; + +int ohci_init(struct usbh_bus *bus) +{ + volatile uint32_t timeout = 0; + uint32_t regval; + struct ohci_ed_hw *ed; + + memset(&g_ohci_hcd[bus->hcd.hcd_id], 0, sizeof(struct ohci_hcd)); + memset(g_ohci_ed_pool[bus->hcd.hcd_id], 0, sizeof(struct ohci_ed_hw) * CONFIG_USB_OHCI_ED_NUM); + + for (uint32_t i = 0; i < 32; i++) { + ohci_hcca[bus->hcd.hcd_id].inttbl[i] = 0; + } + + for (uint8_t index = 0; index < CONFIG_USB_OHCI_ED_NUM; index++) { + ed = &g_ohci_ed_pool[bus->hcd.hcd_id][index]; + if ((uint32_t)&ed->hw % 32) { + USB_LOG_ERR("struct ohci_ed_hw is not align 32\r\n"); + return -USB_ERR_INVAL; + } + for (uint8_t i = 0; i < CONFIG_USB_OHCI_TD_NUM; i++) { + if ((uint32_t)&ed->td_pool[i] % 32) { + USB_LOG_ERR("struct ohci_td_hw is not align 32\r\n"); + return -USB_ERR_INVAL; + } + } + } + + for (uint8_t index = 0; index < CONFIG_USB_OHCI_ED_NUM; index++) { + ed = &g_ohci_ed_pool[bus->hcd.hcd_id][index]; + ed->waitsem = usb_osal_sem_create(0); + } + + USB_LOG_INFO("OHCI hcrevision:0x%02x\r\n", (unsigned int)OHCI_HCOR->hcrevision); + + OHCI_HCOR->hcintdis = OHCI_INT_MIE; + OHCI_HCOR->hccontrol = 0; + + OHCI_HCOR->hccmdsts = OHCI_CMDST_HCR; + while (OHCI_HCOR->hccmdsts & OHCI_CMDST_HCR) { + usb_osal_msleep(1); + timeout++; + if (timeout > 100) { + return -USB_ERR_TIMEOUT; + } + } + + OHCI_HCOR->hcfminterval = DEFAULT_FMINTERVAL; + OHCI_HCOR->hcperiodicstart = DEFAULT_PERSTART; + OHCI_HCOR->hclsthreshold = 0x628; + + OHCI_HCOR->hccontrolheaded = 0; + OHCI_HCOR->hcbulkheaded = 0; + OHCI_HCOR->hchcca = (uintptr_t)&ohci_hcca[bus->hcd.hcd_id]; + + /* Clear pending interrupts */ + regval = OHCI_HCOR->hcintsts; + OHCI_HCOR->hcintsts = regval; + + /* Put HC in operational state */ + regval = OHCI_HCOR->hccontrol; + regval &= ~OHCI_CTRL_CBSR; + regval &= ~OHCI_CTRL_HCFS_MASK; + regval |= OHCI_CTRL_HCFS_OPER; + regval |= OHCI_CTRL_CBSR; + regval |= OHCI_CTRL_CLE; + OHCI_HCOR->hccontrol = regval; + + g_ohci_hcd[bus->hcd.hcd_id].n_ports = OHCI_HCOR->hcrhdescriptora & OHCI_RHDESCA_NDP_MASK; + USB_LOG_INFO("OHCI n_ports:%d\r\n", g_ohci_hcd[bus->hcd.hcd_id].n_ports); + + OHCI_HCOR->hcrhdescriptora &= ~OHCI_RHDESCA_PSM; + OHCI_HCOR->hcrhdescriptora &= ~OHCI_RHDESCA_NPS; + + /* Set global power in HcRhStatus */ + OHCI_HCOR->hcrhsts = OHCI_RHSTATUS_SGP; + usb_osal_msleep(20); + + /* Enable OHCI interrupts */ + OHCI_HCOR->hcinten = OHCI_INT_WDH | OHCI_INT_RHSC | OHCI_INT_MIE; + + return 0; +} + +int ohci_deinit(struct usbh_bus *bus) +{ + uint32_t regval; + struct ohci_ed_hw *ed; + + /* Disable OHCI interrupts */ + OHCI_HCOR->hcintdis = OHCI_INT_WDH | OHCI_INT_RHSC | OHCI_INT_MIE; + + /* Clear pending interrupts */ + regval = OHCI_HCOR->hcintsts; + OHCI_HCOR->hcintsts = regval; + + OHCI_HCOR->hcrhsts &= ~OHCI_RHSTATUS_SGP; + + regval = OHCI_HCOR->hccontrol; + regval &= ~OHCI_CTRL_HCFS_MASK; + regval |= OHCI_CTRL_HCFS_SUSPEND; + OHCI_HCOR->hccontrol = regval; + + for (uint8_t index = 0; index < CONFIG_USB_OHCI_ED_NUM; index++) { + ed = &g_ohci_ed_pool[bus->hcd.hcd_id][index]; + usb_osal_sem_delete(ed->waitsem); + } + + return 0; +} + +uint16_t ohci_get_frame_number(struct usbh_bus *bus) +{ + return OHCI_HCOR->hcfmnumber; +} + +int ohci_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) +{ + uint8_t nports; + uint8_t port; + uint32_t temp; + + nports = g_ohci_hcd[bus->hcd.hcd_id].n_ports; + + port = setup->wIndex; + if (setup->bmRequestType & USB_REQUEST_RECIPIENT_DEVICE) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_SET_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_GET_DESCRIPTOR: + break; + case HUB_REQUEST_GET_STATUS: + memset(buf, 0, 4); + break; + default: + break; + } + } else if (setup->bmRequestType & USB_REQUEST_RECIPIENT_OTHER) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_ENABLE: + temp = OHCI_RHPORTST_CCS; + break; + case HUB_PORT_FEATURE_SUSPEND: + temp = OHCI_HCOR->hccontrol; + temp &= ~OHCI_CTRL_HCFS_MASK; + temp |= OHCI_CTRL_HCFS_RESUME; + OHCI_HCOR->hccontrol = temp; + + usb_osal_msleep(20); + + temp = OHCI_HCOR->hccontrol; + temp &= ~OHCI_CTRL_HCFS_MASK; + temp |= OHCI_CTRL_HCFS_OPER; + OHCI_HCOR->hccontrol = temp; + + temp = OHCI_RHPORTST_POCI; + break; + case HUB_PORT_FEATURE_C_SUSPEND: + temp = OHCI_RHPORTST_PSSC; + break; + case HUB_PORT_FEATURE_POWER: + OHCI_HCOR->hcrhsts = OHCI_RHSTATUS_CGP; + temp = OHCI_RHPORTST_LSDA; + break; + case HUB_PORT_FEATURE_C_CONNECTION: + temp = OHCI_RHPORTST_CSC; + break; + case HUB_PORT_FEATURE_C_ENABLE: + temp = OHCI_RHPORTST_PESC; + break; + case HUB_PORT_FEATURE_C_OVER_CURREN: + temp = OHCI_RHPORTST_OCIC; + break; + case HUB_PORT_FEATURE_C_RESET: + temp = OHCI_RHPORTST_PRSC; + break; + default: + return -USB_ERR_NOTSUPP; + } + OHCI_HCOR->hcrhportsts[port - 1] = temp; + break; + case HUB_REQUEST_SET_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_SUSPEND: + temp = OHCI_HCOR->hccontrol; + temp &= ~OHCI_CTRL_HCFS_MASK; + temp |= OHCI_CTRL_HCFS_SUSPEND; + OHCI_HCOR->hccontrol = temp; + + break; + case HUB_PORT_FEATURE_POWER: + OHCI_HCOR->hcrhsts = OHCI_RHSTATUS_SGP; + break; + case HUB_PORT_FEATURE_RESET: + OHCI_HCOR->hcrhportsts[port - 1] = OHCI_RHPORTST_PRS; + + while (OHCI_HCOR->hcrhportsts[port - 1] & OHCI_RHPORTST_PRS) { + } + break; + + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_GET_STATUS: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + temp = OHCI_HCOR->hcrhportsts[port - 1]; + memcpy(buf, &temp, 4); + break; + default: + break; + } + } + return 0; +} + +int ohci_submit_urb(struct usbh_urb *urb) +{ + return -USB_ERR_NOTSUPP; +} + +int ohci_kill_urb(struct usbh_urb *urb) +{ + return -USB_ERR_NOTSUPP; +} + +void OHCI_IRQHandler(uint8_t busid) +{ + uint32_t usbsts; + struct usbh_bus *bus; + + bus = &g_usbhost_bus[busid]; + + usbsts = OHCI_HCOR->hcintsts & OHCI_HCOR->hcinten; + + if (usbsts & OHCI_INT_RHSC) { + OHCI_HCOR->hcintsts = OHCI_INT_RHSC; + for (int port = 0; port < CONFIG_USBHOST_MAX_RHPORTS; port++) { + uint32_t portsc = OHCI_HCOR->hcrhportsts[port]; + + if (portsc & OHCI_RHPORTST_CSC) { + if (OHCI_HCOR->hcrhsts & OHCI_RHSTATUS_DRWE) { + /* If DRWE is set, Connect Status Change indicates a remote wake-up event */ + } else { + if (portsc & OHCI_RHPORTST_CCS) { + } else { + } + bus->hcd.roothub.int_buffer[0] |= (1 << (port + 1)); + usbh_hub_thread_wakeup(&bus->hcd.roothub); + } + } + } + } + if (usbsts & OHCI_INT_WDH) { + OHCI_HCOR->hcintsts = OHCI_INT_WDH; + } +} + +#ifndef CONFIG_USB_EHCI_WITH_OHCI +__WEAK void usb_hc_low_level_init(struct usbh_bus *bus) +{ + (void)bus; +} + +__WEAK void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + (void)bus; +} + +int usb_hc_init(struct usbh_bus *bus) +{ + usb_hc_low_level_init(bus); + return ohci_init(bus); +} + +int usb_hc_deinit(struct usbh_bus *bus) +{ + ohci_deinit(bus); + usb_hc_low_level_deinit(bus); + return 0; +} + +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) +{ + return ohci_roothub_control(bus, setup, buf); +} + +int usbh_submit_urb(struct usbh_urb *urb) +{ + return ohci_submit_urb(urb); +} + +int usbh_kill_urb(struct usbh_urb *urb) +{ + return ohci_kill_urb(urb); +} + +void USBH_IRQHandler(uint8_t busid) +{ + OHCI_IRQHandler(busid); +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ohci/usb_hc_ohci.h b/src/lib/CherryUSB/port/ohci/usb_hc_ohci.h new file mode 100644 index 000000000..2cebd6368 --- /dev/null +++ b/src/lib/CherryUSB/port/ohci/usb_hc_ohci.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef _USB_OHCI_PRIV_H +#define _USB_OHCI_PRIV_H + +#include "usbh_core.h" +#include "usbh_hub.h" +#include "usb_ohci_reg.h" + +#define OHCI_HCOR ((struct ohci_hcor *)(uintptr_t)(bus->hcd.reg_base + CONFIG_USB_OHCI_HCOR_OFFSET)) + +#define OHCI_PTR2ADDR(x) ((uint32_t)(uintptr_t)(x) & ~0x0F) +#define OHCI_ADDR2ED(x) ((struct ohci_ed_hw *)(uintptr_t)((uint32_t)(x) & ~0x0F)) +#define OHCI_ADDR2TD(x) ((struct ohci_td_hw *)(uintptr_t)((uint32_t)(x) & ~0x0F)) + +#ifndef CONFIG_USB_OHCI_ED_NUM +#define CONFIG_USB_OHCI_ED_NUM 10 +#endif +#ifndef CONFIG_USB_OHCI_TD_NUM +#define CONFIG_USB_OHCI_TD_NUM 3 +#endif + +#if CONFIG_USB_ALIGN_SIZE <= 32 +#define CONFIG_USB_OHCI_ALIGN_SIZE 32 +#elif CONFIG_USB_ALIGN_SIZE <= 64 +#define CONFIG_USB_OHCI_ALIGN_SIZE 64 +#else +#error "CONFIG_USB_ALIGN_SIZE must be 32 or 64" +#endif + +struct ohci_ed_hw; +struct ohci_td_hw { + struct ohci_gtd hw; +#if defined(CONFIG_USB_OHCI_DESC_DCACHE_ENABLE) && (CONFIG_USB_ALIGN_SIZE == 32) + uint8_t pad[16]; +#elif defined(CONFIG_USB_OHCI_DESC_DCACHE_ENABLE) && (CONFIG_USB_ALIGN_SIZE == 64) + uint8_t pad[48]; +#endif + struct usbh_urb *urb; + bool dir_in; + uint32_t buf_start; + uint32_t length; +} __attribute__((aligned(CONFIG_USB_OHCI_ALIGN_SIZE))); /* min is 16bytes, we use CONFIG_USB_OHCI_ALIGN_SIZE for cacheline */ + +struct ohci_ed_hw { + struct ohci_ed hw; +#if defined(CONFIG_USB_OHCI_DESC_DCACHE_ENABLE) && (CONFIG_USB_ALIGN_SIZE == 32) + uint8_t pad[16]; +#elif defined(CONFIG_USB_OHCI_DESC_DCACHE_ENABLE) && (CONFIG_USB_ALIGN_SIZE == 64) + uint8_t pad[48]; +#endif + struct ohci_td_hw td_pool[CONFIG_USB_OHCI_TD_NUM]; + uint32_t td_count; + uint8_t ed_type; + usb_osal_sem_t waitsem; +} __attribute__((aligned(CONFIG_USB_OHCI_ALIGN_SIZE))); /* min is 16bytes, we use CONFIG_USB_OHCI_ALIGN_SIZE for cacheline */ + +struct ohci_hcd { + bool ohci_ed_used[CONFIG_USB_OHCI_ED_NUM]; + uint8_t n_ports; +}; + +int ohci_init(struct usbh_bus *bus); +int ohci_deinit(struct usbh_bus *bus); +uint16_t ohci_get_frame_number(struct usbh_bus *bus); +int ohci_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf); +int ohci_submit_urb(struct usbh_urb *urb); +int ohci_kill_urb(struct usbh_urb *urb); + +void OHCI_IRQHandler(uint8_t busid); + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/ohci/usb_ohci_reg.h b/src/lib/CherryUSB/port/ohci/usb_ohci_reg.h new file mode 100644 index 000000000..61f7f4bf9 --- /dev/null +++ b/src/lib/CherryUSB/port/ohci/usb_ohci_reg.h @@ -0,0 +1,484 @@ +/**************************************************************************** + * include/nuttx/usb/ohci.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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 __INCLUDE_NUTTX_USB_OHCI_H +#define __INCLUDE_NUTTX_USB_OHCI_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Register offsets *********************************************************/ + +/* Control and status registers (section 7.1) */ + +#define OHCI_HCIREV_OFFSET 0x0000 /* HcRevision: Version of HCI specification */ +#define OHCI_CTRL_OFFSET 0x0004 /* HcControl: HC control */ +#define OHCI_CMDST_OFFSET 0x0008 /* HcCommandStatus: HC command status */ +#define OHCI_INTST_OFFSET 0x000c /* HcInterruptStatus: HC interrupt status */ +#define OHCI_INTEN_OFFSET 0x0010 /* HcInterruptEnable: HC interrupt enable */ +#define OHCI_INTDIS_OFFSET 0x0014 /* HcInterruptDisable: HC interrupt disable */ + +/* Memory pointer registers (section 7.2) */ + +#define OHCI_HCCA_OFFSET 0x0018 /* HcHCCA: HC communication area */ +#define OHCI_PERED_OFFSET 0x001c /* HcPeriodCurrentED: Current isoc or int endpoint desc */ +#define OHCI_CTRLHEADED_OFFSET 0x0020 /* HcControlHeadED: First EP desc in the control list */ +#define OHCI_CTRLED_OFFSET 0x0024 /* HcControlCurrentED: Current EP desc in the control list */ +#define OHCI_BULKHEADED_OFFSET 0x0028 /* HcBulkHeadED: First EP desc in the bulk list */ +#define OHCI_BULKED_OFFSET 0x002c /* HcBulkCurrentED: Current EP desc in the bulk list */ +#define OHCI_DONEHEAD_OFFSET 0x0030 /* HcDoneHead: Last transfer desc added to DONE queue */ + +/* Frame counter registers (section 7.3) */ + +#define OHCI_FMINT_OFFSET 0x0034 /* HcFmInterval: Bit time interval that would not cause overrun */ +#define OHCI_FMREM_OFFSET 0x0038 /* HcFmRemaining: Bit time remaining in current frame */ +#define OHCI_FMNO_OFFSET 0x003c /* HcFmNumber: Frame number counter */ +#define OHCI_PERSTART_OFFSET 0x0040 /* HcPeriodicStart: Time to start processing periodic list */ + +/* Root hub registers (section 7.4) */ + +#define OHCI_LSTHRES_OFFSET 0x0044 /* HcLSThreshold: Commit to transfer threshold */ +#define OHCI_RHDESCA_OFFSET 0x0048 /* HcRhDescriptorA: Describes root hub (part A) */ +#define OHCI_RHDESCB_OFFSET 0x004c /* HcRhDescriptorB: Describes root hub (part B) */ +#define OHCI_RHSTATUS_OFFSET 0x0050 /* HcRhStatus: Root hub status */ + +#define OHCI_MAX_RHPORT 15 /* Maximum number of OHCI root hub ports */ + +#define OHCI_RHPORTST_OFFSET(n) (0x0054 + (((n) - 1) << 2)) +#define OHCI_RHPORTST1_OFFSET 0x0054 /* HcRhPort1Status: Root hub port status 1 */ +#define OHCI_RHPORTST2_OFFSET 0x0058 /* HcRhPort2Status: Root hub port status 2 */ +#define OHCI_RHPORTST3_OFFSET 0x005c /* HcRhPort3Status: Root hub port status 3 */ +#define OHCI_RHPORTST4_OFFSET 0x0060 /* HcRhPort4Status: Root hub port status 4 */ +#define OHCI_RHPORTST5_OFFSET 0x0064 /* HcRhPort5Status: Root hub port status 5 */ +#define OHCI_RHPORTST6_OFFSET 0x0068 /* HcRhPort6Status: Root hub port status 6 */ +#define OHCI_RHPORTST7_OFFSET 0x006c /* HcRhPort7Status: Root hub port status 7 */ +#define OHCI_RHPORTST8_OFFSET 0x0070 /* HcRhPort8Status: Root hub port status 8 */ +#define OHCI_RHPORTST9_OFFSET 0x0074 /* HcRhPort9Status: Root hub port status 9 */ +#define OHCI_RHPORTST10_OFFSET 0x0078 /* HcRhPort10Status: Root hub port status 10 */ +#define OHCI_RHPORTST11_OFFSET 0x007c /* HcRhPort11Status: Root hub port status 11 */ +#define OHCI_RHPORTST12_OFFSET 0x0080 /* HcRhPort12Status: Root hub port status 12 */ +#define OHCI_RHPORTST13_OFFSET 0x0084 /* HcRhPort13Status: Root hub port status 13 */ +#define OHCI_RHPORTST14_OFFSET 0x0088 /* HcRhPort14Status: Root hub port status 14 */ +#define OHCI_RHPORTST15_OFFSET 0x008c /* HcRhPort15Status: Root hub port status 15 */ + +/* Register bit definitions *************************************************/ + +/* HcRevision: Version of HCI specification (7.1.1) */ + +#define OHCI_HCIREV_SHIFT (0) /* Bits 0-7: HCI spec version (BCD) */ +#define OHCI_HCIREV_MASK (0xff << OHCI_HCIREV_SHIFT) + +/* HcControl: HC control (7.1.2) */ + +#define OHCI_CTRL_CBSR (3 << 0) /* Bit 0: Control/bulk service ratio */ +#define OHCI_CTRL_PLE (1 << 2) /* Bit 2: Periodic list enable */ +#define OHCI_CTRL_IE (1 << 3) /* Bit 3: Isochronous enable */ +#define OHCI_CTRL_CLE (1 << 4) /* Bit 4: Control list enable */ +#define OHCI_CTRL_BLE (1 << 5) /* Bit 5: Bulk list enable */ +#define OHCI_CTRL_HCFS_SHIFT (6) /* Bits 6-7: Host controller functional state */ +#define OHCI_CTRL_HCFS_MASK (3 << OHCI_CTRL_HCFS_SHIFT) +# define OHCI_CTRL_HCFS_RESET (0 << OHCI_CTRL_HCFS_SHIFT) +# define OHCI_CTRL_HCFS_RESUME (1 << OHCI_CTRL_HCFS_SHIFT) +# define OHCI_CTRL_HCFS_OPER (2 << OHCI_CTRL_HCFS_SHIFT) +# define OHCI_CTRL_HCFS_SUSPEND (3 << OHCI_CTRL_HCFS_SHIFT) +#define OHCI_CTRL_IR (1 << 8) /* Bit 8: Interrupt routing */ +#define OHCI_CTRL_RWC (1 << 9) /* Bit 9: Remote wakeup connected */ +#define OHCI_CTRL_RWE (1 << 10) /* Bit 10: Remote wakeup enable */ + /* Bits 11-31: Reserved */ + +/* HcCommandStatus: HC command status (7.1.3) */ + +#define OHCI_CMDST_HCR (1 << 0) /* Bit 0: Host controller reset */ +#define OHCI_CMDST_CLF (1 << 1) /* Bit 1: Control list filled */ +#define OHCI_CMDST_BLF (1 << 2) /* Bit 2: Bulk list filled */ +#define OHCI_CMDST_OCR (1 << 3) /* Bit 3: Ownership change request */ + /* Bits 4-15: Reserved */ +#define OHCI_CMDST_SOC (3 << 16) /* Bit 16: Scheduling overrun count */ + /* Bits 17-31: Reserved */ + +/* HcInterruptStatus: HC interrupt status (7.1.4), + * HcInterruptEnable: HC interrupt enable (7.1.5), and + * HcInterruptDisable: HC interrupt disable (7.1.6) + */ + +#define OHCI_INT_SO (1 << 0) /* Bit 0: Scheduling overrun */ +#define OHCI_INT_WDH (1 << 1) /* Bit 1: Writeback done head */ +#define OHCI_INT_SF (1 << 2) /* Bit 2: Start of frame */ +#define OHCI_INT_RD (1 << 3) /* Bit 3: Resume detected */ +#define OHCI_INT_UE (1 << 4) /* Bit 4: Unrecoverable error */ +#define OHCI_INT_FNO (1 << 5) /* Bit 5: Frame number overflow */ +#define OHCI_INT_RHSC (1 << 6) /* Bit 6: Root hub status change */ + /* Bits 7-29: Reserved */ +#define OHCI_INT_OC (1 << 30) /* Bit 30: Ownership change */ +#define OHCI_INT_MIE (1 << 31) /* Bit 31: Master interrupt enable + * (Enable/disable only) */ + +/* HcHCCA: HC communication area (7.2.1): + * + * 32-bits aligned to 256 byte boundary. + */ + +/* HcPeriodCurrentED: Current isoc or int endpoint desc (7.2.2), + * HcControlHeadED: First EP desc in the control list (7.2.3), + * HcControlCurrentED: Current EP desc in the control list (7.2.4), + * HcBulkHeadED: First EP desc in the bulk list (7.2.5), + * HcBulkCurrentED: Current EP desc in the bulk list (7.2.6), and + * HcDoneHead: Last transfer desc added to DONE queue (7.2.7): + * + * All 32-bits aligned to an 8-byte boundary + */ + +/* HcFmInterval: Bit time interval that would not cause overrun (7.3.1) */ + +#define OHCI_FMINT_FI_SHIFT (0) /* Bits 0-13: Frame interval */ +#define OHCI_FMINT_FI_MASK (0x3fff << OHCI_FMINT_FI_SHIFT) + /* Bits 14-15: Reserved */ +#define OHCI_FMINT_FSMPS_SHIFT (16) /* Bits 16-30: FS largest packet data */ +#define OHCI_FMINT_FSMPS_MASK (0x7fff << OHCI_FMINT_FSMPS_SHIFT) +#define OHCI_FMINT_FIT (1 << 31) /* Bit 31: Frame interval toggle */ + +/* HcFmRemaining: Bit time remaining in current frame (7.3.2) */ + +#define OHCI_FMREM_FR_SHIFT (0) /* Bits 0-13: Frame remaining */ +#define OHCI_FMREM_FR_MASK (0x3fff << OHCI_FMREM_FR_SHIFT) + /* Bits 16-30: Reserved */ +#define OHCI_FMINT_FRT (1 << 31) /* Bit 31: Frame remaining toggle */ + +/* HcFmNumber: Frame number counter (7.3.3) */ + +#define OHCI_FMNO_FI_SHIFT (0) /* Bits 0-15: Frame number */ +#define OHCI_FMNO_FI_MASK (0xffff << OHCI_FMINT_FI_SHIFT) + /* Bits 16-31: Reserved */ + +/* HcPeriodicStart: Time to start processing periodic list (7.3.4) */ + +#define OHCI_PERSTART_SHIFT (0) /* Bits 0-13: Periodic start */ +#define OHCI_PERSTART_MASK (0x3fff << OHCI_PERSTART_SHIFT) + /* Bits 14-31: Reserved */ + +/* HcLSThreshold: Commit to transfer threshold (7.3.5) */ + +#define OHCI_LSTHRES_SHIFT (0) /* Bits 0-11: LS threshold */ +#define OHCI_LSTHRES_MASK (0x0fff << OHCI_PERSTART_SHIFT) + /* Bits 12-31: Reserved */ + +/* HcRhDescriptorN: Describes root hub (part A) (7.4.1) */ + +#define OHCI_RHDESCA_NDP_SHIFT (0) /* Bits 0-7: Number downstream ports */ +#define OHCI_RHDESCA_NDP_MASK (0xff << OHCI_RHDESCA_NDP_SHIFT) +#define OHCI_RHDESCA_PSM (1 << 8) /* Bit 8: Power switching mode */ +#define OHCI_RHDESCA_NPS (1 << 9) /* Bit 9: No power switching */ +#define OHCI_RHDESCA_DT (1 << 10) /* Bit 10: Device type */ +#define OHCI_RHDESCA_OCPM (1 << 11) /* Bit 11: Over current protection mode */ +#define OHCI_RHDESCA_NOCP (1 << 12) /* Bit 12: No over current protection */ + /* Bits 13-23: Reserved */ +#define OHCI_RHDESCA_POTPGT_SHIFT (24) /* Bits 24-31: Power on to power good time */ +#define OHCI_RHDESCA_POTPGT_MASK (0xff << OHCI_RHDESCA_POTPGT_SHIFT) + +/* HcRhDescriptorB: Describes root hub (part B) (7.4.2) */ + +#define OHCI_RHDESCB_DR_SHIFT (0) /* Bits 0-15: Device removable */ +#define OHCI_RHDESCB_DR_MASK (0xffff << OHCI_RHDESCB_DR_SHIFT) +# define OHCI_RHDESCB_ATTACHED(n) (1 << (OHCI_RHDESCB_DR_SHIFT+(n))) +#define OHCI_RHDESCB_PPCM_SHIFT (16) /* Bits 16-31: Port power control mask */ +#define OHCI_RHDESCB_PPCM_MASK (0xffff << OHCI_RHDESCB_PPCM_SHIFT) +# define OHCI_RHDESCB_POWERED(n) (1 << (OHCI_RHDESCB_DR_SHIFT+(n))) + +/* HcRhStatus: Root hub status (7.4.3) */ + +#define OHCI_RHSTATUS_LPS (1 << 0) /* Bit 0: Local power status (read)*/ +#define OHCI_RHSTATUS_CGP (1 << 0) /* Bit 0: Clear global power (write)*/ +#define OHCI_RHSTATUS_OCI (1 << 1) /* Bit 1: Over current indicator */ + /* Bits 2-14: Reserved */ +#define OHCI_RHSTATUS_DRWE (1 << 15) /* Bit 15: Device remote wakeup enable */ +#define OHCI_RHSTATUS_LPSC (1 << 16) /* Bit 16: Local power status change (read) */ +#define OHCI_RHSTATUS_SGP (1 << 16) /* Bit 16: Set global power (write) */ +#define OHCI_RHSTATUS_OCIC (1 << 17) /* Bit 17: Overcurrent indicator change */ + /* Bits 18-30: Reserved */ +#define OHCI_RHSTATUS_CRWE (1 << 31) /* Bit 31: Clear remote wakeup enable */ + +/* HcRhPortStatus: Root hub port status (7.4.4) */ + +#define OHCI_RHPORTST_CCS (1 << 0) /* Bit 0: Current connect status */ +#define OHCI_RHPORTST_PES (1 << 1) /* Bit 1: Port enable status */ +#define OHCI_RHPORTST_PSS (1 << 2) /* Bit 2: Port suspend status */ +#define OHCI_RHPORTST_POCI (1 << 3) /* Bit 3: Port over current indicator */ +#define OHCI_RHPORTST_PRS (1 << 4) /* Bit 4: Port reset status */ + /* Bits 5-7: Reserved */ +#define OHCI_RHPORTST_PPS (1 << 8) /* Bit 8: Port power status */ +#define OHCI_RHPORTST_LSDA (1 << 9) /* Bit 9: Low speed device attached */ + /* Bits 10-15: Reserved */ +#define OHCI_RHPORTST_CSC (1 << 16) /* Bit 16: Connect status change */ +#define OHCI_RHPORTST_PESC (1 << 17) /* Bit 17: Port enable status change */ +#define OHCI_RHPORTST_PSSC (1 << 18) /* Bit 18: Port suspend status change */ +#define OHCI_RHPORTST_OCIC (1 << 19) /* Bit 19: Port over current indicator change */ +#define OHCI_RHPORTST_PRSC (1 << 20) /* Bit 20: Port reset status change */ + /* Bits 21-31: Reserved */ + +/* Transfer Descriptors *****************************************************/ + +/* Endpoint Descriptor Offsets (4.2.1) */ + +#define ED_CONTROL_OFFSET (0x00) /* ED status/control bits */ +#define ED_TAILP_OFFSET (0x04) /* TD Queue Tail Pointer (TailP) */ +#define ED_HEADP_OFFSET (0x08) /* TD Queue Head Pointer (HeadP) */ +#define ED_NEXTED_OFFSET (0x0c) /* Next Endpoint Descriptor (NextED) */ + +/* Endpoint Descriptor Bit Definitions (4.2.2) */ + +#define ED_CONTROL_FA_SHIFT (0) /* Bits 0-6: Function Address */ +#define ED_CONTROL_FA_MASK (0x7f << ED_CONTROL_FA_SHIFT) +#define ED_CONTROL_EN_SHIFT (7) /* Bits 7-10: Endpoint number */ +#define ED_CONTROL_EN_MASK (15 << ED_CONTROL_EN_SHIFT) +#define ED_CONTROL_D_SHIFT (11) /* Bits 11-12: Direction */ +#define ED_CONTROL_D_MASK (3 << ED_CONTROL_D_SHIFT) +# define ED_CONTROL_D_TD1 (0 << ED_CONTROL_D_SHIFT) /* Get direction from TD */ +# define ED_CONTROL_D_OUT (1 << ED_CONTROL_D_SHIFT) /* OUT */ +# define ED_CONTROL_D_IN (2 << ED_CONTROL_D_SHIFT) /* IN */ +# define ED_CONTROL_D_TD2 (3 << ED_CONTROL_D_SHIFT) /* Get direction from TD */ + +#define ED_CONTROL_SPPED_LOW (1 << 13) /* Bit 13: Speed (low) */ +#define ED_CONTROL_SKIP (1 << 14) /* Bit 14: Skip */ +#define ED_CONTROL_FORMAT_ISO (1 << 15) /* Bit 15: Format (isochronous) */ +#define ED_CONTROL_MPS_SHIFT (16) /* Bits 16-26: Maximum packet size */ +#define ED_CONTROL_MPS_MASK (0x7ff << ED_CONTROL_MPS_SHIFT) + +#define ED_HEADP_ADDR_SHIFT (0) +#define ED_HEADP_ADDR_MASK 0xfffffff0 +#define ED_HEADP_H (1 << 0) /* Bit 0: Halted */ +#define ED_HEADP_C (1 << 1) /* Bit 1: Toggle carry */ + +/* General Transfer Descriptor Offsets (4.3.1) */ + +#define GTD_STATUS_OFFSET (0x00) /* TD status bits */ +#define GTD_CBP_OFFSET (0x04) /* Current Buffer Pointer (CBP) */ +#define GTD_NEXTTD_OFFSET (0x08) /* Next TD (NextTD) */ +#define GTD_BE_OFFSET (0x0c) /* Buffer End (BE) */ + +/* General Transfer Descriptor Bit Definitions */ + + /* Bits 0-17: Reserved */ + +#define GTD_STATUS_R (1 << 18) /* Bit 18: Buffer rounding */ +#define GTD_STATUS_DP_SHIFT (19) /* Bits 19-20: Direction/PID */ +#define GTD_STATUS_DP_MASK (3 << GTD_STATUS_DP_SHIFT) +# define GTD_STATUS_DP_SETUP (0 << GTD_STATUS_DP_SHIFT) /* To endpoint */ +# define GTD_STATUS_DP_OUT (1 << GTD_STATUS_DP_SHIFT) /* To endpoint */ +# define GTD_STATUS_DP_IN (2 << GTD_STATUS_DP_SHIFT) /* From endpoint */ + +#define GTD_STATUS_DI_SHIFT (21) /* Bits 21-23: Delay input */ +#define GTD_STATUS_DI_MASK (7 << GTD_STATUS_DI_SHIFT) +#define GTD_STATUS_T_SHIFT (24) /* Bits 24-25: Data Toggle */ +#define GTD_STATUS_T_MASK (3 << GTD_STATUS_T_SHIFT) +# define GTD_STATUS_T_TOGGLE (0 << GTD_STATUS_T_SHIFT) +# define GTD_STATUS_T_DATA0 (2 << GTD_STATUS_T_SHIFT) +# define GTD_STATUS_T_DATA1 (3 << GTD_STATUS_T_SHIFT) +#define GTD_STATUS_EC_SHIFT (26) /* Bits 26-27: Error count */ +#define GTD_STATUS_EC_MASK (3 << GTD_STATUS_EC_SHIFT) +#define GTD_STATUS_CC_SHIFT (28) /* Bits 28-31: Condition code */ +#define GTD_STATUS_CC_MASK (15 << GTD_STATUS_CC_SHIFT) + +/* Isochronous Transfer Descriptor Offsets (4.3.2) */ + +#define ITD_STATUS_OFFSET (0x00) /* TD status bits */ +#define ITD_BP0_OFFSET (0x04) /* Buffer page 0 (BP0) */ +#define ITD_NEXTTD_OFFSET (0x08) /* Next TD (NextTD) */ +#define ITD_BE_OFFSET (0x0c) /* Buffer End (BE) */ + +#define ITD_NPSW (8) +#define ITD_PSW0_OFFSET (0x10) /* Offset0/PSW0 */ +#define ITD_PSW1_OFFSET (0x12) /* Offset1/PSW1 */ +#define ITD_PSW2_OFFSET (0x14) /* Offset2/PSW2 */ +#define ITD_PSW3_OFFSET (0x16) /* Offset3/PSW3 */ +#define ITD_PSW4_OFFSET (0x18) /* Offset4/PSW4 */ +#define ITD_PSW5_OFFSET (0x1a) /* Offset5/PSW5 */ +#define ITD_PSW6_OFFSET (0x1c) /* Offset6/PSW6 */ +#define ITD_PSW7_OFFSET (0x1e) /* Offset7/PSW7 */ + +/* Condition codes (Table 4-7) */ + +#define TD_CC_NOERROR 0x00 +#define TD_CC_CRC 0x01 +#define TD_CC_BITSTUFFING 0x02 +#define TD_CC_DATATOGGLEMISMATCH 0x03 +#define TD_CC_STALL 0x04 +#define TD_CC_DEVNOTRESPONDING 0x05 +#define TD_CC_PIDCHECKFAILURE 0x06 +#define TD_CC_UNEXPECTEDPID 0x07 +#define TD_CC_DATAOVERRUN 0x08 +#define TD_CC_DATAUNDERRUN 0x09 +#define TD_CC_BUFFEROVERRUN 0x0c +#define TD_CC_BUFFERUNDERRUN 0x0d +#define TD_CC_NOTACCESSED 0x0f + +#define TD_CC_USER 0x10 /* For use by OHCI drivers */ + +/* Host Controller Communications Area Format (4.4.1) ***********************/ + +/* HccaInterruptTable: 32x32-bit pointers to interrupt EDs */ + +#define HCCA_INTTBL_OFFSET (0x00) +#define HCCA_INTTBL_WSIZE (32) +#define HCCA_INTTBL_BSIZE (HCCA_INTTBL_WSIZE * 4) + +/* HccaFrameNumber: Current frame number */ + +#define HCCA_FMNO_OFFSET (0x80) +#define HCCA_FMNO_BSIZE (2) + +/* HccaPad1: Zero when frame no. updated */ + +#define HCCA_PAD1_OFFSET (0x82) +#define HCCA_PAD1_BSIZE (2) + +/* HccaDoneHead: When the HC reaches the end of a frame and its deferred + * interrupt register is 0, it writes the current value of its HcDoneHead to + * this location and generates an interrupt. + * + * The LSB of HCCADoneHead may be set to 1 to indicate that an unmasked + * HcInterruptStatus was set when HccaDoneHead was written. + */ + +#define HCCA_DONEHEAD_OFFSET (0x84) +#define HCCA_DONEHEAD_BSIZE (4) + +#define HCCA_DONEHEAD_MASK 0xfffffffe +#define HCCA_DONEHEAD_INTSTA (1 << 0) + +/* 0x88: 116 bytes reserved */ + +#define HCCA_RESERVED_OFFSET (0x88) +#define HCCA_RESERVED_BSIZE (116) + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +struct ohci_hcor +{ + volatile uint32_t hcrevision; /* 0x00 */ + volatile uint32_t hccontrol; /* 0x04 */ + volatile uint32_t hccmdsts; /* 0x08 */ + volatile uint32_t hcintsts; /* 0x0c */ + volatile uint32_t hcinten; /* 0x10 */ + volatile uint32_t hcintdis; /* 0x14 */ + volatile uint32_t hchcca; /* 0x18 */ + volatile uint32_t hcperiodcurrented; /* 0x1c */ + volatile uint32_t hccontrolheaded; /* 0x20 */ + volatile uint32_t hccontrolcurrented; /* 0x24 */ + volatile uint32_t hcbulkheaded; /* 0x28 */ + volatile uint32_t hcbulkcurrented; /* 0x2c */ + volatile uint32_t hcdonehead; /* 0x30 */ + volatile uint32_t hcfminterval; /* 0x34 */ + volatile uint32_t hcfmremaining; /* 0x38 */ + volatile uint32_t hcfmnumber; /* 0x3c */ + volatile uint32_t hcperiodicstart; /* 0x40 */ + volatile uint32_t hclsthreshold; /* 0x44 */ + volatile uint32_t hcrhdescriptora; /* 0x48 */ + volatile uint32_t hcrhdescriptorb; /* 0x4c */ + volatile uint32_t hcrhsts; /* 0x50 */ + volatile uint32_t hcrhportsts[15]; /* 0x54 */ +}; + +/* Endpoint Descriptor Offsets (4.2.1) */ + +struct ohci_ed +{ + volatile uint32_t ctrl; /* ED status/control bits */ + volatile uint32_t tailp; /* TD Queue Tail Pointer (TailP) */ + volatile uint32_t headp; /* TD Queue Head Pointer (HeadP) */ + volatile uint32_t nexted; /* Next Endpoint Descriptor (NextED) */ +}; + +/* General Transfer Descriptor (4.3.1) */ + +struct ohci_gtd +{ + volatile uint32_t ctrl; /* TD status/control bits */ + volatile uint32_t cbp; /* Current Buffer Pointer (CBP) */ + volatile uint32_t nexttd; /* Next TD (NextTD) */ + volatile uint32_t be; /* Buffer End (BE) */ +}; + +/* Isochronous Transfer Descriptor Offsets (4.3.2) */ + +struct ohci_itd +{ + volatile uint32_t ctrl; /* TD status/control bits */ + volatile uint32_t bp0; /* Buffer page 0 (BP0 */ + volatile uint32_t nexttd; /* Next TD (NextTD) */ + volatile uint32_t be; /* Buffer End (BE) */ + volatile uint16_t psw[ITD_NPSW]; /* Offset/PSW */ +}; + +/* Host Controller Communications Area Format (4.4.1) */ + +struct ohci_hcca +{ + /* HccaInterruptTable: 32x32-bit pointers to interrupt EDs */ + + volatile uint32_t inttbl[HCCA_INTTBL_WSIZE]; + + /* HccaFrameNumber: Current frame number and + * HccaPad1: Zero when frame no. updated + */ + + volatile uint16_t fmno; + volatile uint16_t pad1; + + /* HccaDoneHead: When the HC reaches the end of a frame and its deferred + * interrupt register is 0, it writes the current value of its HcDoneHead + * to this location and generates an interrupt. + */ + + volatile uint32_t donehead; + volatile uint8_t reserved[HCCA_RESERVED_BSIZE]; + volatile uint32_t extra; +} __attribute__((aligned(256))); + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* __INCLUDE_NUTTX_USB_OHCI_H */ diff --git a/src/lib/CherryUSB/port/pusb2/README.md b/src/lib/CherryUSB/port/pusb2/README.md new file mode 100644 index 000000000..f8137afeb --- /dev/null +++ b/src/lib/CherryUSB/port/pusb2/README.md @@ -0,0 +1,66 @@ +# USB 2.0 OTG 控制器 (PUSB2) + +- Phytium PI 和 Phyium E2000 系列开发板提供了兼容 USB2.0 的 OTG 接口 +- 相关的使用例程可以在 Phytium PI(飞腾派)和 E2000 D/Q Demo 板上运行,例程包括 + +--------------------------------------------- + +- Host 模式 + +- - 1. [FreeRTOS 上作为主机使用键盘/鼠标/U盘](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/pusb2_host/README.md) +- - 5. [RT-Thread 上作为主机识别键盘/鼠标/U盘](https://github.com/RT-Thread/rt-thread/blob/master/bsp/phytium/doc/use_cherryusb.md) + +--------------------------------------------- + +- Device 模式 + +- - 1. [裸机上模拟为一个 U 盘](https://gitee.com/phytium_embedded/phytium-standalone-sdk/tree/master/example/peripherals/usb/pusb2_device/README.md) +- - 2. [裸机上模拟为一个虚拟串口](https://gitee.com/phytium_embedded/phytium-standalone-sdk/tree/master/example/peripherals/usb/pusb2_device/README.md) +- - 3. [FreeRTOS 上模拟为一个 U 盘](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/pusb2_device/README.md) +- - 4. [FreeRTOS 上模拟为虚拟串口](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/pusb2_device/README.md) +- - 5. [RT-Thread 上模拟为一个 U 盘](https://github.com/RT-Thread/rt-thread/blob/master/bsp/phytium/doc/use_cherryusb.md) + +--------------------------------------------- + +- PUSB2 的驱动功能以静态库的方式提供, +- - libpusb2_hc_a64.a : AARCH64 主机模式驱动库 +- - libpusb2_dc_a64.a : AARCH64 从机模式驱动库 +- - libpusb2_hc_a32_hardfp.a :AARCH32 主机模式驱动库,使用硬浮点 +- - libpusb2_hc_a32_softfp.a :AARCH32 主机模式驱动库,使用软浮点 +- - libpusb2_dc_a32_hardfp.a :AARCH32 从机模式驱动库,使用硬浮点 +- - libpusb2_dc_a32_softfp.a :AARCH32 从机模式驱动库,使用软浮点 + +需要获取源代码请联系 `opensource_embedded@phytium.com.cn` 获取 + +# USB 2.0 OTG Controller (PUSB2) + +- Phytium PI and the Phytium E2000 series development boards offer OTG interfaces compatible with USB 2.0. +- Relevant usage examples can be run on the Phytium PI and E2000 D/Q Demo boards, including: + +--------------------------------------------- + +- Host Mode + + - 1. [Using a keyboard/mouse/USB flash drive as a host on FreeRTOS](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/pusb2_host/README.md) + - 5. [Recognizing a keyboard/mouse/USB flash drive as a host on RT-Thread](https://github.com/RT-Thread/rt-thread/blob/master/bsp/phytium/doc/use_cherryusb.md) + +--------------------------------------------- + +- Device Mode + - 1. [Simulating as a USB flash drive on a standalone system](https://gitee.com/phytium_embedded/phytium-standalone-sdk/tree/master/example/peripherals/usb/pusb2_device/README.md) + - 2. [Simulating as a virtual serial port on a standalone system](https://gitee.com/phytium_embedded/phytium-standalone-sdk/tree/master/example/peripherals/usb/pusb2_device/README.md) + - 3. [Simulating as a USB flash drive on FreeRTOS](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/pusb2_device/README.md) + - 4. [Simulating as a virtual serial port on FreeRTOS](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/pusb2_device/README.md) + - 5. [Simulating as a USB flash drive on RT-Thread](https://github.com/RT-Thread/rt-thread/blob/master/bsp/phytium/doc/use_cherryusb.md) + +--------------------------------------------- + +- The driver functionality of PUSB2 is provided as static libraries: + - - `libpusb2_hc_a64.a` : Host mode driver library for AARCH64 + - - `libpusb2_dc_a64.a` : Device mode driver library for AARCH64 + - - `libpusb2_hc_a32_hardfp.a` : Host mode driver library for AARCH32, using hard floating point + - - `libpusb2_hc_a32_softfp.a` : Host mode driver library for AARCH32, using soft floating point + - - `libpusb2_dc_a32_hardfp.a` : Device mode driver library for AARCH32, using hard floating point + - - `libpusb2_dc_a32_softfp.a` : Device mode driver library for AARCH32, using soft floating point + +- To obtain the source code, please contact `opensource_embedded@phytium.com.cn`. \ No newline at end of file diff --git a/src/lib/CherryUSB/port/pusb2/freertos/usb_config.h b/src/lib/CherryUSB/port/pusb2/freertos/usb_config.h new file mode 100644 index 000000000..760759f84 --- /dev/null +++ b/src/lib/CherryUSB/port/pusb2/freertos/usb_config.h @@ -0,0 +1,281 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +#include "sdkconfig.h" +#include "FreeRTOS.h" +#include "task.h" + +/* ================ USB common Configuration ================ */ + +#define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) + +int xPortIsInsideInterrupt(void); + +void *usb_sys_mem_malloc(size_t size); +void usb_sys_mem_free(void *ptr); +void *usb_sys_malloc_align(size_t align, size_t size); + +#define usb_malloc(size) usb_sys_mem_malloc(size) +#define usb_free(ptr) usb_sys_mem_free(ptr) +#define usb_align(align, size) usb_sys_malloc_align(align, size) + +unsigned long usb_hc_get_register_base(uint32_t id); +unsigned long usb_dc_get_register_base(uint32_t id); + +#ifndef CONFIG_USB_DBG_LEVEL +#if defined(CONFIG_LOG_ERROR) +#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR +#elif defined(CONFIG_LOG_WARN) +#define CONFIG_USB_DBG_LEVEL USB_DBG_WARNING +#elif defined(CONFIG_LOG_INFO) +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#elif defined(CONFIG_LOG_DEBUG) || defined(CONFIG_LOG_VERBOS) +#define CONFIG_USB_DBG_LEVEL USB_DBG_LOG +#else +#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR +#endif +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* data align size when use dma */ +#ifndef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +// #define CONFIG_USBDEV_SETUP_LOG_PRINT + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 0 +#define CONFIG_USBHOST_MAX_EHPORTS 8 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 8 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 8192 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 8 +#endif + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +/* (5 * number of control endpoints + 8) + ((largest USB packet used / 4) + 1 for + * status information) + (2 * number of OUT endpoints) + 1 for Global NAK + */ +// #define CONFIG_USB_DWC2_RXALL_FIFO_SIZE (1024 / 4) +/* IN Endpoints Max packet Size / 4 */ +// #define CONFIG_USB_DWC2_TX0_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX1_FIFO_SIZE (512 / 4) +// #define CONFIG_USB_DWC2_TX2_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX3_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX4_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX5_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX6_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX7_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX8_FIFO_SIZE (0 / 4) + +/* ---------------- MUSB Configuration ---------------- */ +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_INPUT_MOUSE_WHEEL +#define CONFIG_INPUT_MOUSE_WHEEL +#endif + +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 3 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USBHOST_PIPE_NUM 10 +#endif + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +/* ---------------- PUSB2 Configuration ---------------- */ +#define CONFIG_USB_PUSB2_BUS_NUM 3U +#define CONFIG_USB_PUSB2_BUS_ID 0U + +#endif diff --git a/src/lib/CherryUSB/port/pusb2/freertos/usb_dc_glue_phytium.c b/src/lib/CherryUSB/port/pusb2/freertos/usb_dc_glue_phytium.c new file mode 100644 index 000000000..4e674ecd5 --- /dev/null +++ b/src/lib/CherryUSB/port/pusb2/freertos/usb_dc_glue_phytium.c @@ -0,0 +1,141 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ + +/***************************** Include Files *********************************/ +#include +#include + +#include "fassert.h" +#include "fparameters.h" +#include "finterrupt.h" +#include "fcpu_info.h" +#include "fdebug.h" +#include "fcache.h" +#include "fmemory_pool.h" + +#include "usbd_core.h" + +/************************** Constant Definitions *****************************/ +#define USB_MEMP_TOTAL_SIZE SZ_1M + +/**************************** Type Definitions *******************************/ +void USBD_IRQHandler(uint8_t busid); + +/************************** Variable Definitions *****************************/ +static FMemp memp; +static u8 memp_buf[USB_MEMP_TOTAL_SIZE] __attribute__((aligned(8))) = {0}; + +void usb_sys_mem_init(void) +{ + if (FT_COMPONENT_IS_READY != memp.is_ready) + { + USB_ASSERT(FT_SUCCESS == FMempInit(&memp, &memp_buf[0], &memp_buf[0] + USB_MEMP_TOTAL_SIZE)); + } +} + +void usb_sys_mem_deinit(void) +{ + if (FT_COMPONENT_IS_READY == memp.is_ready) + { + FMempDeinit(&memp); + } +} + +void *usb_sys_malloc_align(size_t align, size_t size) +{ + void *result = FMempMallocAlign(&memp, size, align); + + if (result) + { + memset(result, 0U, size); + } + + return result; +} + +void *usb_sys_mem_malloc(size_t size) +{ + return usb_sys_malloc_align(sizeof(void *), size); +} + +void usb_sys_mem_free(void *ptr) +{ + if (NULL != ptr) + { + FMempFree(&memp, ptr); + } +} + +void usb_assert(const char *filename, int linenum) +{ + FAssert(filename, linenum, 0xff); +} + +static void usb_dc_pusb2_interrupt_handler(s32 vector, void *param) +{ + USBD_IRQHandler(CONFIG_USB_PUSB2_BUS_ID); +} + +static void usb_dc_setup_pusb2_interrupt(u32 id) +{ + u32 cpu_id; + USB_ASSERT(id == FUSB2_ID_VHUB_0); + u32 irq_num = FUSB2_0_VHUB_IRQ_NUM; + u32 irq_priority = 13U; + + GetCpuId(&cpu_id); + InterruptSetTargetCpus(irq_num, cpu_id); + + InterruptSetPriority(irq_num, irq_priority); + + /* register intr callback */ + InterruptInstall(irq_num, + usb_dc_pusb2_interrupt_handler, + NULL, + NULL); + + /* enable irq */ + InterruptUmask(irq_num); +} + +static void usb_dc_revoke_pusb2_interrupt(u32 id) +{ + USB_ASSERT(id == FUSB2_ID_VHUB_0); + u32 irq_num = FUSB2_0_VHUB_IRQ_NUM; + + /* disable irq */ + InterruptMask(irq_num); +} + +extern int vApplicationInIrq(void); +int xPortIsInsideInterrupt(void) +{ + return vApplicationInIrq(); +} + +unsigned long usb_dc_get_register_base(uint32_t id) +{ + USB_ASSERT(id == FUSB2_ID_VHUB_0); + return FUSB2_0_VHUB_BASE_ADDR; +} + +/* implement cherryusb weak functions */ +void usb_dc_low_level_init() +{ + usb_sys_mem_init(); + usb_dc_setup_pusb2_interrupt(CONFIG_USB_PUSB2_BUS_ID); +} + +void usb_dc_low_level_deinit(void) +{ + usb_dc_revoke_pusb2_interrupt(CONFIG_USB_PUSB2_BUS_ID); + usb_sys_mem_deinit(); +} diff --git a/src/lib/CherryUSB/port/pusb2/freertos/usb_hc_glue_phytium.c b/src/lib/CherryUSB/port/pusb2/freertos/usb_hc_glue_phytium.c new file mode 100644 index 000000000..58a90af14 --- /dev/null +++ b/src/lib/CherryUSB/port/pusb2/freertos/usb_hc_glue_phytium.c @@ -0,0 +1,165 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ + +/***************************** Include Files *********************************/ +#include +#include + +#include "fassert.h" +#include "fparameters.h" +#include "finterrupt.h" +#include "fcpu_info.h" +#include "fdebug.h" +#include "fcache.h" +#include "fmemory_pool.h" + +#include "usbh_core.h" + +/************************** Constant Definitions *****************************/ +#define USB_MEMP_TOTAL_SIZE SZ_1M + +/**************************** Type Definitions *******************************/ +void USBH_IRQHandler(uint8_t busid); + +/************************** Variable Definitions *****************************/ +static FMemp memp; +static u8 memp_buf[USB_MEMP_TOTAL_SIZE] __attribute__((aligned(8))) = {0}; +static u32 memp_ref_cnt = 0; +static const u32 irq_nums[] = { + FUSB2_0_VHUB_IRQ_NUM, FUSB2_1_IRQ_NUM, FUSB2_2_IRQ_NUM +}; + +void usb_sys_mem_init(void) +{ + if (FT_COMPONENT_IS_READY != memp.is_ready) + { + USB_ASSERT(FT_SUCCESS == FMempInit(&memp, &memp_buf[0], &memp_buf[0] + USB_MEMP_TOTAL_SIZE)); + } +} + +void usb_sys_mem_deinit(void) +{ + if (FT_COMPONENT_IS_READY == memp.is_ready) + { + FMempDeinit(&memp); + } +} + +void *usb_sys_malloc_align(size_t align, size_t size) +{ + void *result = FMempMallocAlign(&memp, size, align); + + if (result) + { + memset(result, 0U, size); + } + + return result; +} + +void *usb_sys_mem_malloc(size_t size) +{ + return usb_sys_malloc_align(sizeof(void *), size); +} + +void usb_sys_mem_free(void *ptr) +{ + if (NULL != ptr) + { + FMempFree(&memp, ptr); + } +} + +void usb_assert(const char *filename, int linenum) +{ + FAssert(filename, linenum, 0xff); +} + +static void usb_hc_pusb2_interrupt_handler(s32 vector, void *param) +{ + if (vector == FUSB2_0_VHUB_IRQ_NUM) { + USBH_IRQHandler(FUSB2_ID_VHUB_0); + } else if (vector == FUSB2_1_IRQ_NUM) { + USBH_IRQHandler(FUSB2_ID_1); + } else if (vector == FUSB2_2_IRQ_NUM) { + USBH_IRQHandler(FUSB2_ID_2); + } +} + +static void usb_hc_setup_pusb2_interrupt(u32 id) +{ + u32 cpu_id; + u32 irq_num = irq_nums[id]; + u32 irq_priority = 13U; + + GetCpuId(&cpu_id); + InterruptSetTargetCpus(irq_num, cpu_id); + + InterruptSetPriority(irq_num, irq_priority); + + /* register intr callback */ + InterruptInstall(irq_num, + usb_hc_pusb2_interrupt_handler, + NULL, + NULL); + + /* enable irq */ + InterruptUmask(irq_num); + + USB_LOG_DBG("Enable irq-%d\n", irq_num); +} + +static void usb_hc_revoke_pusb2_interrupt(u32 id) +{ + u32 irq_num = irq_nums[id]; + + /* disable irq */ + InterruptMask(irq_num); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + if (memp_ref_cnt == 0) { + usb_sys_mem_init(); /* create memory pool before first bus init */ + } + + memp_ref_cnt++; /* one more bus is using the memory pool */ + + usb_hc_setup_pusb2_interrupt(bus->busid); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + memp_ref_cnt--; /* one more bus is leaving */ + + if (memp_ref_cnt == 0) { + usb_sys_mem_deinit(); /* release memory pool after the last bus left */ + } + + usb_hc_revoke_pusb2_interrupt(bus->busid); +} + +unsigned long usb_hc_get_register_base(uint32_t id) +{ + if (id == FUSB2_ID_VHUB_0) { + return FUSB2_0_VHUB_BASE_ADDR; + } else if (id == FUSB2_ID_1) { + return FUSB2_1_BASE_ADDR; + } else if (id == FUSB2_ID_2) { + return FUSB2_2_BASE_ADDR; + } +} + +extern int vApplicationInIrq(void); +int xPortIsInsideInterrupt(void) +{ + return vApplicationInIrq(); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/pusb2/rt-thread/usb_config.h b/src/lib/CherryUSB/port/pusb2/rt-thread/usb_config.h new file mode 100644 index 000000000..ec8faa2e9 --- /dev/null +++ b/src/lib/CherryUSB/port/pusb2/rt-thread/usb_config.h @@ -0,0 +1,266 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +#include "rtconfig.h" +#include + +/* ================ USB common Configuration ================ */ + +#define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) + +void *usb_sys_mem_malloc(size_t size); +void usb_sys_mem_free(void *ptr); +void *usb_sys_malloc_align(size_t align, size_t size); + +#define usb_malloc(size) usb_sys_mem_malloc(size) +#define usb_free(ptr) usb_sys_mem_free(ptr) +#define usb_align(align, size) usb_sys_malloc_align(align, size) + +unsigned long usb_hc_get_register_base(uint32_t id); +unsigned long usb_dc_get_register_base(uint32_t id); + +#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* data align size when use dma */ +#ifndef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +// #define CONFIG_USBDEV_SETUP_LOG_PRINT + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 8192 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 0 +#define CONFIG_USBHOST_MAX_EHPORTS 8 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 8 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 8192 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 8 +#endif + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +/* (5 * number of control endpoints + 8) + ((largest USB packet used / 4) + 1 for + * status information) + (2 * number of OUT endpoints) + 1 for Global NAK + */ +// #define CONFIG_USB_DWC2_RXALL_FIFO_SIZE (1024 / 4) +/* IN Endpoints Max packet Size / 4 */ +// #define CONFIG_USB_DWC2_TX0_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX1_FIFO_SIZE (512 / 4) +// #define CONFIG_USB_DWC2_TX2_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX3_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX4_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX5_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX6_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX7_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX8_FIFO_SIZE (0 / 4) + +/* ---------------- MUSB Configuration ---------------- */ +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_INPUT_MOUSE_WHEEL +#define CONFIG_INPUT_MOUSE_WHEEL +#endif + +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 3 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USBHOST_PIPE_NUM 10 +#endif + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +/* ---------------- PUSB2 Configuration ---------------- */ +#define CONFIG_USB_PUSB2_BUS_NUM 3U +#define CONFIG_USB_PUSB2_BUS_ID 0U + +#endif diff --git a/src/lib/CherryUSB/port/pusb2/rt-thread/usb_dc_glue_phytium.c b/src/lib/CherryUSB/port/pusb2/rt-thread/usb_dc_glue_phytium.c new file mode 100644 index 000000000..49088d953 --- /dev/null +++ b/src/lib/CherryUSB/port/pusb2/rt-thread/usb_dc_glue_phytium.c @@ -0,0 +1,94 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +#include "rtthread.h" +#include "interrupt.h" + +#include "fparameters.h" + +#include "usbd_core.h" + +void USBD_IRQHandler(uint8_t busid); + +void usb_assert(const char *filename, int linenum) +{ + rt_assert_handler("", filename, linenum); +} + +static void usb_dc_pusb2_interrupt_handler(int irqno, void *param) +{ + USBD_IRQHandler(CONFIG_USB_PUSB2_BUS_ID); +} + +static void usb_dc_setup_pusb2_interrupt(uint32_t id) +{ + uint32_t irq_num = FUSB2_0_VHUB_IRQ_NUM; + + rt_hw_interrupt_set_priority(irq_num, 0U); + rt_hw_interrupt_install(irq_num, usb_dc_pusb2_interrupt_handler, NULL, "pusb2-dc"); + rt_hw_interrupt_umask(irq_num); +} + +static void usb_dc_revoke_pusb2_interrupt(uint32_t id) +{ + uint32_t irq_num = FUSB2_0_VHUB_IRQ_NUM; + + rt_hw_interrupt_mask(irq_num); +} + +unsigned long usb_dc_get_register_base(uint32_t id) +{ + USB_ASSERT(id == FUSB2_ID_VHUB_0); + return FUSB2_0_VHUB_BASE_ADDR; +} + +void usb_dc_low_level_init() +{ + usb_dc_setup_pusb2_interrupt(CONFIG_USB_PUSB2_BUS_ID); +} + +void usb_dc_low_level_deinit(void) +{ + usb_dc_revoke_pusb2_interrupt(CONFIG_USB_PUSB2_BUS_ID); +} + +void *usb_sys_mem_malloc(size_t size) +{ + void *buf = rt_malloc(size); + + if (buf) { + rt_memset(buf, 0, size); + } + + return buf; +} + +void usb_sys_mem_free(void *ptr) +{ + if (ptr) { + rt_free(ptr); + } +} + +void *usb_sys_malloc_align(size_t align, size_t size) +{ + void *buf = rt_malloc_align(size, align); + + if (buf) { + rt_memset(buf, 0, size); + } + + return buf; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + return -1; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/pusb2/rt-thread/usb_hc_glue_phytium.c b/src/lib/CherryUSB/port/pusb2/rt-thread/usb_hc_glue_phytium.c new file mode 100644 index 000000000..8dcca0469 --- /dev/null +++ b/src/lib/CherryUSB/port/pusb2/rt-thread/usb_hc_glue_phytium.c @@ -0,0 +1,109 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +#include "rtthread.h" +#include "interrupt.h" + +#include "fparameters.h" + +#include "usbh_core.h" + +static const uint32_t irq_nums[] = { + FUSB2_0_VHUB_IRQ_NUM, FUSB2_1_IRQ_NUM, FUSB2_2_IRQ_NUM +}; + +void USBH_IRQHandler(uint8_t busid); + +void usb_assert(const char *filename, int linenum) +{ + rt_assert_handler("", filename, linenum); +} + +static void usb_hc_pusb2_interrupt_handler(int irqno, void *param) +{ + if (irqno == FUSB2_0_VHUB_IRQ_NUM) { + USBH_IRQHandler(FUSB2_ID_VHUB_0); + } else if (irqno == FUSB2_1_IRQ_NUM) { + USBH_IRQHandler(FUSB2_ID_1); + } else if (irqno == FUSB2_2_IRQ_NUM) { + USBH_IRQHandler(FUSB2_ID_2); + } +} + +static void usb_hc_setup_pusb2_interrupt(uint32_t id) +{ + uint32_t irq_num = irq_nums[id]; + + rt_hw_interrupt_set_priority(irq_num, 0U); + rt_hw_interrupt_install(irq_num, usb_hc_pusb2_interrupt_handler, NULL, "pusb2-hc"); + rt_hw_interrupt_umask(irq_num); + + USB_LOG_DBG("Enable irq-%d\n", irq_num); +} + +static void usb_hc_revoke_pusb2_interrupt(uint32_t id) +{ + uint32_t irq_num = irq_nums[id]; + + rt_hw_interrupt_mask(irq_num); +} + +unsigned long usb_hc_get_register_base(uint32_t id) +{ + if (id == FUSB2_ID_VHUB_0) { + return FUSB2_0_VHUB_BASE_ADDR; + } else if (id == FUSB2_ID_1) { + return FUSB2_1_BASE_ADDR; + } else if (id == FUSB2_ID_2) { + return FUSB2_2_BASE_ADDR; + } else { + USB_ASSERT(0); + return 0; + } +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + usb_hc_setup_pusb2_interrupt(bus->busid); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + usb_hc_revoke_pusb2_interrupt(bus->busid); +} + +void *usb_sys_mem_malloc(size_t size) +{ + void *buf = rt_malloc(size); + + if (buf) { + rt_memset(buf, 0, size); + } + + return buf; +} + +void usb_sys_mem_free(void *ptr) +{ + if (ptr) { + rt_free(ptr); + } +} + +void *usb_sys_malloc_align(size_t align, size_t size) +{ + void *buf = rt_malloc_align(size, align); + + if (buf) { + rt_memset(buf, 0, size); + } + + return buf; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/pusb2/standalone/usb_config.h b/src/lib/CherryUSB/port/pusb2/standalone/usb_config.h new file mode 100644 index 000000000..e4fbc4e77 --- /dev/null +++ b/src/lib/CherryUSB/port/pusb2/standalone/usb_config.h @@ -0,0 +1,275 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +#include "sdkconfig.h" + +/* ================ USB common Configuration ================ */ + +#define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) + +void *usb_sys_mem_malloc(size_t size); +void usb_sys_mem_free(void *ptr); +void *usb_sys_malloc_align(size_t align, size_t size); + +#define usb_malloc(size) usb_sys_mem_malloc(size) +#define usb_free(ptr) usb_sys_mem_free(ptr) +#define usb_align(align, size) usb_sys_malloc_align(align, size) + +unsigned long usb_dc_get_register_base(uint32_t id); + +size_t usb_osal_enter_critical_section(void); +void usb_osal_leave_critical_section(size_t flag); + +#ifndef CONFIG_USB_DBG_LEVEL +#if defined(CONFIG_LOG_ERROR) +#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR +#elif defined(CONFIG_LOG_WARN) +#define CONFIG_USB_DBG_LEVEL USB_DBG_WARNING +#elif defined(CONFIG_LOG_INFO) +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#elif defined(CONFIG_LOG_DEBUG) || defined(CONFIG_LOG_VERBOS) +#define CONFIG_USB_DBG_LEVEL USB_DBG_LOG +#else +#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR +#endif +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* data align size when use dma */ +#ifndef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +// #define CONFIG_USBDEV_SETUP_LOG_PRINT + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 8192 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 8 +#endif + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +/* (5 * number of control endpoints + 8) + ((largest USB packet used / 4) + 1 for + * status information) + (2 * number of OUT endpoints) + 1 for Global NAK + */ +// #define CONFIG_USB_DWC2_RXALL_FIFO_SIZE (1024 / 4) +/* IN Endpoints Max packet Size / 4 */ +// #define CONFIG_USB_DWC2_TX0_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX1_FIFO_SIZE (512 / 4) +// #define CONFIG_USB_DWC2_TX2_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX3_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX4_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX5_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX6_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX7_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX8_FIFO_SIZE (0 / 4) + +/* ---------------- MUSB Configuration ---------------- */ +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 1 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USBHOST_PIPE_NUM 10 +#endif + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +/* ---------------- PUSB2 Configuration ---------------- */ +#define CONFIG_USB_PUSB2_BUS_NUM 1U +#define CONFIG_USB_PUSB2_BUS_ID 0U + +#endif diff --git a/src/lib/CherryUSB/port/pusb2/standalone/usb_dc_glue_phytium.c b/src/lib/CherryUSB/port/pusb2/standalone/usb_dc_glue_phytium.c new file mode 100644 index 000000000..b21375c9c --- /dev/null +++ b/src/lib/CherryUSB/port/pusb2/standalone/usb_dc_glue_phytium.c @@ -0,0 +1,144 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +/***************************** Include Files *********************************/ +#include +#include + +#include "fassert.h" +#include "fparameters.h" +#include "finterrupt.h" +#include "fcpu_info.h" +#include "fdebug.h" +#include "fcache.h" +#include "fmemory_pool.h" + +#include "usbd_core.h" + +/************************** Constant Definitions *****************************/ +#define USB_MEMP_TOTAL_SIZE SZ_1M + +/**************************** Type Definitions *******************************/ +void USBD_IRQHandler(uint8_t busid); + +/************************** Variable Definitions *****************************/ +static FMemp memp; +static u8 memp_buf[USB_MEMP_TOTAL_SIZE] __attribute__((aligned(8))) = {0}; + +static void usb_sys_mem_init(void) +{ + if (FT_COMPONENT_IS_READY != memp.is_ready) + { + USB_ASSERT(FT_SUCCESS == FMempInit(&memp, &memp_buf[0], &memp_buf[0] + USB_MEMP_TOTAL_SIZE)); + } +} + +static void usb_sys_mem_deinit(void) +{ + if (FT_COMPONENT_IS_READY == memp.is_ready) + { + FMempRemove(&memp); + } +} + +void *usb_sys_malloc_align(size_t align, size_t size) +{ + void *result = FMempMallocAlign(&memp, size, align); + + if (result) + { + memset(result, 0U, size); + } + + return result; +} + +void *usb_sys_mem_malloc(size_t size) +{ + return usb_sys_malloc_align(sizeof(void *), size); +} + +void usb_sys_mem_free(void *ptr) +{ + if (NULL != ptr) + { + FMempFree(&memp, ptr); + } +} + +void usb_assert(const char *filename, int linenum) +{ + FAssert(filename, linenum, 0xff); +} + +static void usb_dc_pusb2_interrupt_handler(s32 vector, void *param) +{ + USBD_IRQHandler(CONFIG_USB_PUSB2_BUS_ID); +} + +static void usb_dc_setup_pusb2_interrupt(u32 id) +{ + u32 cpu_id; + USB_ASSERT(id == FUSB2_ID_VHUB_0); + u32 irq_num = FUSB2_0_VHUB_IRQ_NUM; + u32 irq_priority = 0U; + + GetCpuId(&cpu_id); + InterruptSetTargetCpus(irq_num, cpu_id); + + InterruptSetPriority(irq_num, irq_priority); + + /* register intr callback */ + InterruptInstall(irq_num, + usb_dc_pusb2_interrupt_handler, + NULL, + NULL); + + /* enable irq */ + InterruptUmask(irq_num); +} + +static void usb_dc_revoke_pusb2_interrupt(u32 id) +{ + USB_ASSERT(id == FUSB2_ID_VHUB_0); + u32 irq_num = FUSB2_0_VHUB_IRQ_NUM; + + /* disable irq */ + InterruptMask(irq_num); +} + +unsigned long usb_dc_get_register_base(uint32_t id) +{ + USB_ASSERT(id == FUSB2_ID_VHUB_0); + return FUSB2_0_VHUB_BASE_ADDR; +} + +/* implement cherryusb weak functions */ +void usb_dc_low_level_init() +{ + usb_sys_mem_init(); + usb_dc_setup_pusb2_interrupt(CONFIG_USB_PUSB2_BUS_ID); +} + +void usb_dc_low_level_deinit(void) +{ + usb_sys_mem_deinit(); + usb_dc_revoke_pusb2_interrupt(CONFIG_USB_PUSB2_BUS_ID); +} + +size_t usb_osal_enter_critical_section(void) +{ + return 0; +} + +void usb_osal_leave_critical_section(size_t flag) +{ + +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/rp2040/README.md b/src/lib/CherryUSB/port/rp2040/README.md new file mode 100644 index 000000000..64887e36e --- /dev/null +++ b/src/lib/CherryUSB/port/rp2040/README.md @@ -0,0 +1,5 @@ +# Note + +## Support Chip List + +- RP2040/RP2350 \ No newline at end of file diff --git a/src/lib/CherryUSB/port/rp2040/usb_dc_rp2040.c b/src/lib/CherryUSB/port/rp2040/usb_dc_rp2040.c new file mode 100644 index 000000000..524334166 --- /dev/null +++ b/src/lib/CherryUSB/port/rp2040/usb_dc_rp2040.c @@ -0,0 +1,595 @@ +/* + * Copyright (c) 2022, HaiMianBBao + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "hardware/resets.h" +#include "hardware/irq.h" +#include "hardware/structs/usb.h" +#if CHERRYUSB_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX +#include "pico/fix/rp2040_usb_device_enumeration.h" +#endif + +#define usb_hw_set hw_set_alias(usb_hw) +#define usb_hw_clear hw_clear_alias(usb_hw) + +#ifndef FORCE_VBUS_DETECT +#define FORCE_VBUS_DETECT 1 +#endif + +/* Endpoint state */ +struct rp2040_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + uint8_t ep_addr; /* Endpoint address */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; + + volatile uint32_t *endpoint_control; /*!< Endpoint control register */ + volatile uint32_t *buffer_control; /*!< Buffer control register */ + uint8_t *data_buffer; /*!< Buffer pointer in usb dpram */ + uint8_t next_pid; /*!< Toggle after each packet (unless replying to a SETUP) */ +}; + +/* Driver state */ +struct rp2040_udc { + volatile uint8_t dev_addr; + struct rp2040_ep_state in_ep[USB_NUM_ENDPOINTS]; /*!< IN endpoint parameters*/ + struct rp2040_ep_state out_ep[USB_NUM_ENDPOINTS]; /*!< OUT endpoint parameters */ + struct usb_setup_packet setup; /*!< Setup package that may be used in interrupt processing (outside the protocol stack) */ +} g_rp2040_udc; + +void rp2040_usbd_irq(void); + +/** + * @brief Take a buffer pointer located in the USB RAM and return as an offset of the RAM. + * + * @param buf + * @return uint32_t + */ +static inline uint32_t usb_buffer_offset(volatile uint8_t *buf) +{ + return (uint32_t)buf ^ (uint32_t)usb_dpram; +} + +/** + * @brief Set up the endpoint control register for an endpoint (if applicable. Not valid for EP0). + * + * @param ep + */ +void usb_setup_endpoint(const struct rp2040_ep_state *ep) +{ + // EP0 doesn't have one so return if that is the case + if (!ep->endpoint_control) { + return; + } + + // Get the data buffer as an offset of the USB controller's DPRAM + uint32_t dpram_offset = usb_buffer_offset(ep->data_buffer); + uint32_t reg = EP_CTRL_ENABLE_BITS | + EP_CTRL_INTERRUPT_PER_BUFFER | + (ep->ep_type << EP_CTRL_BUFFER_TYPE_LSB) | + dpram_offset; + *ep->endpoint_control = reg; +} + +/** + * @brief Starts a transfer on a given endpoint. + * + * @param ep, the endpoint configuration. + * @param buf, the data buffer to send. Only applicable if the endpoint is TX + * @param len, the length of the data in buf (this example limits max len to one packet - 64 bytes) + */ +static void usb_start_transfer(struct rp2040_ep_state *ep, uint8_t *buf, uint16_t len) +{ + /*!< Prepare buffer control register value */ + uint32_t val = len | USB_BUF_CTRL_AVAIL; + + if (len < ep->ep_mps) { + val |= USB_BUF_CTRL_LAST; + } + + if (USB_EP_DIR_IS_IN(ep->ep_addr)) { + /*!< Need to copy the data from the user buffer to the usb memory */ + if (buf != NULL) { + memcpy((void *)ep->data_buffer, (void *)buf, len); + } + /*!< Mark as full */ + val |= USB_BUF_CTRL_FULL; + } + + /*!< Set pid and flip for next transfer */ + val |= ep->next_pid ? USB_BUF_CTRL_DATA1_PID : USB_BUF_CTRL_DATA0_PID; + ep->next_pid ^= 1u; + + *ep->buffer_control = val; +} + +int usb_dc_init(uint8_t busid) +{ + uint8_t *next_buffer_ptr; + + memset(&g_rp2040_udc, 0, sizeof(struct rp2040_udc)); + + g_rp2040_udc.in_ep[0].endpoint_control = NULL; + g_rp2040_udc.in_ep[0].data_buffer = &usb_dpram->ep0_buf_a[0]; + g_rp2040_udc.out_ep[0].endpoint_control = NULL; + g_rp2040_udc.out_ep[0].data_buffer = &usb_dpram->ep0_buf_a[0]; + + for (uint32_t i = 0; i < USB_NUM_ENDPOINTS; i++) { + g_rp2040_udc.in_ep[i].buffer_control = &usb_dpram->ep_buf_ctrl[i].in; + g_rp2040_udc.out_ep[i].buffer_control = &usb_dpram->ep_buf_ctrl[i].out; + + if (i != 0) { + g_rp2040_udc.in_ep[i].endpoint_control = &usb_dpram->ep_ctrl[i - 1].in; + g_rp2040_udc.out_ep[i].endpoint_control = &usb_dpram->ep_ctrl[i - 1].out; + } + } + + next_buffer_ptr = &usb_dpram->epx_data[0]; + + for (uint32_t i = 1; i < USB_NUM_ENDPOINTS; i++) { + g_rp2040_udc.in_ep[i].data_buffer = next_buffer_ptr; + if (i == 1) { + next_buffer_ptr += 1024; /* for iso video */ + } else { + next_buffer_ptr += 64; + } + + g_rp2040_udc.out_ep[i].data_buffer = next_buffer_ptr; + next_buffer_ptr += 64; + } + + // Remove shared irq if it was previously added so as not to fill up shared irq slots + irq_remove_handler(USBCTRL_IRQ, rp2040_usbd_irq); + + irq_add_shared_handler(USBCTRL_IRQ, rp2040_usbd_irq, PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY); + + // Reset usb controller + reset_unreset_block_num_wait_blocking(RESET_USBCTRL); + + /*!< Clear any previous state just in case */ + memset(usb_hw, 0, sizeof(*usb_hw)); + memset(usb_dpram, 0, sizeof(*usb_dpram)); + + /*!< Mux the controller to the onboard usb phy */ + usb_hw->muxing = USB_USB_MUXING_TO_PHY_BITS | USB_USB_MUXING_SOFTCON_BITS; + +#if FORCE_VBUS_DETECT + // Force VBUS detect so the device thinks it is plugged into a host + usb_hw->pwr = USB_USB_PWR_VBUS_DETECT_BITS | USB_USB_PWR_VBUS_DETECT_OVERRIDE_EN_BITS; +#endif + + // Enable the USB controller in device mode. + usb_hw->main_ctrl = USB_MAIN_CTRL_CONTROLLER_EN_BITS; + + // Enable an interrupt per EP0 transaction + usb_hw->sie_ctrl = USB_SIE_CTRL_EP0_INT_1BUF_BITS; // <2> + + // Enable interrupts for when a buffer is done, when the bus is reset, + // and when a setup packet is received + usb_hw->inte = USB_INTS_BUFF_STATUS_BITS | USB_INTS_BUS_RESET_BITS | USB_INTS_SETUP_REQ_BITS | + USB_INTS_DEV_SUSPEND_BITS | USB_INTS_DEV_RESUME_FROM_HOST_BITS | + (FORCE_VBUS_DETECT ? 0 : USB_INTS_DEV_CONN_DIS_BITS); + +#ifdef CONFIG_USBDEV_SOF_ENABLE + usb_hw->inte |= USB_INTS_DEV_SOF_BITS; +#endif + + // Enable USB interrupt at processor + irq_set_enabled(USBCTRL_IRQ, true); + + usb_hw_set->sie_ctrl = USB_SIE_CTRL_PULLUP_EN_BITS; + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + irq_set_enabled(USBCTRL_IRQ, false); + // Remove shared irq if it was previously added so as not to fill up shared irq slots + irq_remove_handler(USBCTRL_IRQ, rp2040_usbd_irq); + + usb_hw_clear->sie_ctrl = USB_SIE_CTRL_PULLUP_EN_BITS; + memset(&g_rp2040_udc, 0, sizeof(struct rp2040_udc)); + + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + g_rp2040_udc.dev_addr = addr; + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + return -1; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + return USB_SPEED_FULL; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_rp2040_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_rp2040_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_rp2040_udc.out_ep[ep_idx].ep_addr = ep->bEndpointAddress; + g_rp2040_udc.out_ep[ep_idx].ep_enable = true; + /*!< Clear control reg */ + *(g_rp2040_udc.out_ep[ep_idx].buffer_control) = 0; + + usb_setup_endpoint(&g_rp2040_udc.out_ep[ep_idx]); + } else { + g_rp2040_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_rp2040_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_rp2040_udc.in_ep[ep_idx].ep_addr = ep->bEndpointAddress; + g_rp2040_udc.in_ep[ep_idx].ep_enable = true; + /*!< Clear control reg */ + *(g_rp2040_udc.in_ep[ep_idx].buffer_control) = 0; + + usb_setup_endpoint(&g_rp2040_udc.in_ep[ep_idx]); + } + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + if (USB_EP_DIR_IS_IN(ep)) { + } else if (USB_EP_DIR_IS_OUT(ep)) { + } + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + if (USB_EP_GET_IDX(ep) == 0) { + /** + * A stall on EP0 has to be armed so it can be cleared on the next setup packet + */ + usb_hw_set->ep_stall_arm = (USB_EP_DIR_IS_IN(ep)) ? USB_EP_STALL_ARM_EP0_IN_BITS : USB_EP_STALL_ARM_EP0_OUT_BITS; + } + + if (USB_EP_DIR_IS_OUT(ep)) { + *(g_rp2040_udc.out_ep[USB_EP_GET_IDX(ep)].buffer_control) = USB_BUF_CTRL_STALL; + } else { + *(g_rp2040_udc.in_ep[USB_EP_GET_IDX(ep)].buffer_control) = USB_BUF_CTRL_STALL; + } + + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (ep_idx != 0) { + if (USB_EP_DIR_IS_OUT(ep)) { + g_rp2040_udc.out_ep[USB_EP_GET_IDX(ep)].next_pid = 0; + *(g_rp2040_udc.out_ep[USB_EP_GET_IDX(ep)].buffer_control) = ~USB_BUF_CTRL_STALL; + } else { + g_rp2040_udc.in_ep[USB_EP_GET_IDX(ep)].next_pid = 0; + *(g_rp2040_udc.in_ep[USB_EP_GET_IDX(ep)].buffer_control) = ~USB_BUF_CTRL_STALL; + } + } + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + if (USB_EP_DIR_IS_OUT(ep)) { + if (*(g_rp2040_udc.out_ep[USB_EP_GET_IDX(ep)].buffer_control) & USB_BUF_CTRL_STALL) { + *stalled = 1; + } else { + *stalled = 0; + } + } else { + if (*(g_rp2040_udc.in_ep[USB_EP_GET_IDX(ep)].buffer_control) & USB_BUF_CTRL_STALL) { + *stalled = 1; + } else { + *stalled = 0; + } + } + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_rp2040_udc.in_ep[ep_idx].ep_enable) { + return -2; + } + + g_rp2040_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_rp2040_udc.in_ep[ep_idx].xfer_len = data_len; + g_rp2040_udc.in_ep[ep_idx].actual_xfer_len = 0; + + if (data_len == 0) { + usb_start_transfer(&g_rp2040_udc.in_ep[ep_idx], NULL, 0); + } else { + data_len = MIN(data_len, g_rp2040_udc.in_ep[ep_idx].ep_mps); + usb_start_transfer(&g_rp2040_udc.in_ep[ep_idx], g_rp2040_udc.in_ep[ep_idx].xfer_buf, data_len); + } + + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + if (!g_rp2040_udc.out_ep[ep_idx].ep_enable) { + return -2; + } + g_rp2040_udc.out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_rp2040_udc.out_ep[ep_idx].xfer_len = data_len; + g_rp2040_udc.out_ep[ep_idx].actual_xfer_len = 0; + + if (data_len == 0) { + usb_start_transfer(&g_rp2040_udc.out_ep[ep_idx], NULL, 0); + } else { + /*!< Not zlp */ + data_len = MIN(data_len, g_rp2040_udc.out_ep[ep_idx].ep_mps); + usb_start_transfer(&g_rp2040_udc.out_ep[ep_idx], g_rp2040_udc.out_ep[ep_idx].xfer_buf, data_len); + } + return 0; +} + +/** + * @brief Notify an endpoint that a transfer has completed. + * + * @param ep, the endpoint to notify. + */ +static void usb_handle_ep_buff_done(struct rp2040_ep_state *ep) +{ + uint32_t buffer_control = *ep->buffer_control; + /*!< Get the transfer length for this endpoint */ + uint16_t read_count = buffer_control & USB_BUF_CTRL_LEN_MASK; + /*!< Call that endpoints buffer done handler */ + if (ep->ep_addr == 0x80) { + /*!< EP0 In */ + /** + * Determine the current setup direction + */ + switch (g_rp2040_udc.setup.bmRequestType >> USB_REQUEST_DIR_SHIFT) { + case 1: + /*!< Get */ + if (g_rp2040_udc.in_ep[0].xfer_len > g_rp2040_udc.in_ep[0].ep_mps) { + g_rp2040_udc.in_ep[0].xfer_len -= g_rp2040_udc.in_ep[0].ep_mps; + g_rp2040_udc.in_ep[0].actual_xfer_len += g_rp2040_udc.in_ep[0].ep_mps; + usbd_event_ep_in_complete_handler(0, 0 | 0x80, g_rp2040_udc.in_ep[0].actual_xfer_len); + } else { + g_rp2040_udc.in_ep[0].actual_xfer_len += g_rp2040_udc.in_ep[0].xfer_len; + g_rp2040_udc.in_ep[0].xfer_len = 0; + /** + * EP0 In complete and host will send a out token to get 0 length packet + * In the next usbd_event_ep_in_complete_handler, stack will start read 0 length packet + * and host must send data1 packet.We resest the ep0 next_pid = 1 in setup interrupt head. + */ + usbd_event_ep_in_complete_handler(0, 0 | 0x80, g_rp2040_udc.in_ep[0].actual_xfer_len); + } + break; + case 0: + /*!< Set */ + if (g_rp2040_udc.dev_addr > 0) { + usb_hw->dev_addr_ctrl = g_rp2040_udc.dev_addr; + g_rp2040_udc.dev_addr = 0; + } else { + /*!< Normal status stage // Setup out...out in */ + /** + * Perpar for next setup + */ + } + break; + } + + } else if (ep->ep_addr == 0x00) { + /*!< EP0 Out */ + memcpy(g_rp2040_udc.out_ep[0].xfer_buf, g_rp2040_udc.out_ep[0].data_buffer, read_count); + if (read_count == 0) { + /*!< Normal status stage // Setup in...in out */ + /** + * Perpar for next setup + */ + } + + g_rp2040_udc.out_ep[0].actual_xfer_len += read_count; + g_rp2040_udc.out_ep[0].xfer_len -= read_count; + + usbd_event_ep_out_complete_handler(0, 0x00, g_rp2040_udc.out_ep[0].actual_xfer_len); + } else { + /*!< Others ep */ + uint16_t data_len = 0; + if (USB_EP_DIR_IS_OUT(ep->ep_addr)) { + /*!< flip the pid */ + memcpy(g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].xfer_buf, g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].data_buffer, read_count); + g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].xfer_buf += read_count; + g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].actual_xfer_len += read_count; + g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].xfer_len -= read_count; + + if (read_count < g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].ep_mps || g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].xfer_len == 0) { + /*!< Out complete */ + usbd_event_ep_out_complete_handler(0, ep->ep_addr, g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].actual_xfer_len); + } else { + /*!< Need read again */ + data_len = MIN(g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].xfer_len, g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f].ep_mps); + usb_start_transfer(&g_rp2040_udc.out_ep[(ep->ep_addr) & 0x0f], NULL, data_len); + } + } else { + if (g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].xfer_len > g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].ep_mps) { + /*!< Need tx again */ + g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].xfer_len -= g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].ep_mps; + g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].xfer_buf += g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].ep_mps; + g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].actual_xfer_len += g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].ep_mps; + data_len = MIN(g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].xfer_len, g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].ep_mps); + usb_start_transfer(&g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f], g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].xfer_buf, data_len); + } else { + /*!< In complete */ + g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].actual_xfer_len += g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].xfer_len; + g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].xfer_len = 0; + usbd_event_ep_in_complete_handler(0, ep->ep_addr, g_rp2040_udc.in_ep[(ep->ep_addr) & 0x0f].actual_xfer_len); + } + } + } +} + +/** + * @brief Find the endpoint configuration for a specified endpoint number and + * direction and notify it that a transfer has completed. + * + * @param ep_num + * @param in + */ +static void usb_handle_buff_done(uint8_t ep_num, bool in) +{ + uint8_t ep_addr = ep_num | (in ? USB_EP_DIR_IN : 0); + if (USB_EP_DIR_IS_OUT(ep_addr)) { + usb_handle_ep_buff_done(&g_rp2040_udc.out_ep[ep_num]); + } else { + usb_handle_ep_buff_done(&g_rp2040_udc.in_ep[ep_num]); + } +} + +/** + * @brief Handle a "buffer status" irq. This means that one or more + * buffers have been sent / received. Notify each endpoint where this + * is the case. + */ +static void usb_handle_buff_status(void) +{ + uint32_t remaining_buffers = usb_hw->buf_status; + + uint32_t bit = 1u; + for (uint8_t i = 0; remaining_buffers && i < USB_NUM_ENDPOINTS * 2; i++) { + if (remaining_buffers & bit) { + /*!< clear this in advance */ + usb_hw_clear->buf_status = bit; + /*!< IN transfer for even i, OUT transfer for odd i */ + usb_handle_buff_done(i >> 1u, !(i & 1u)); + remaining_buffers &= ~bit; + } + bit <<= 1u; + } +} + +void USBD_IRQHandler(uint8_t busid) +{ + uint32_t const status = usb_hw->ints; + uint32_t handled = 0; + + if (status & USB_INTS_BUFF_STATUS_BITS) { + handled |= USB_INTS_BUFF_STATUS_BITS; + usb_handle_buff_status(); + } + + if (status & USB_INTS_SETUP_REQ_BITS) { + handled |= USB_INTS_SETUP_REQ_BITS; + memcpy((uint8_t *)&g_rp2040_udc.setup, (uint8_t const *)&usb_dpram->setup_packet, 8); + /** + * reset pid to both 1 (data and ack) + */ + g_rp2040_udc.in_ep[0].next_pid = 1; + g_rp2040_udc.out_ep[0].next_pid = 1; + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_rp2040_udc.setup); + usb_hw_clear->sie_status = USB_SIE_STATUS_SETUP_REC_BITS; + } + +#if FORCE_VBUS_DETECT == 0 + /** + * Since we force VBUS detect On, device will always think it is connected and + * couldn't distinguish between disconnect and suspend + */ + if (status & USB_INTS_DEV_CONN_DIS_BITS) { + handled |= USB_INTS_DEV_CONN_DIS_BITS; + if (usb_hw->sie_status & USB_SIE_STATUS_CONNECTED_BITS) { + /*!< Connected: nothing to do */ + usbd_event_connect_handler(0); + } else { + /*!< Disconnected */ + usbd_event_disconnect_handler(0); + } + usb_hw_clear->sie_status = USB_SIE_STATUS_CONNECTED_BITS; + } +#endif + + /** + * SE0 for 2.5 us or more (will last at least 10ms) + */ + if (status & USB_INTS_BUS_RESET_BITS) { + handled |= USB_INTS_BUS_RESET_BITS; + usb_hw_clear->sie_status = USB_SIE_STATUS_BUS_RESET_BITS; + + usb_hw->dev_addr_ctrl = 0; + + for (uint8_t i = 0; i < USB_NUM_ENDPOINTS - 1; i++) { + /*!< Start at ep1 */ + usb_dpram->ep_ctrl[i].in = 0; + usb_dpram->ep_ctrl[i].out = 0; + } + + usbd_event_reset_handler(0); + +#if CHERRYUSB_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX + /** + * Only run enumeration walk-around if pull up is enabled + */ + if (usb_hw->sie_ctrl & USB_SIE_CTRL_PULLUP_EN_BITS) + rp2040_usb_device_enumeration_fix(); +#endif + } + + /** + * Note from pico datasheet 4.1.2.6.4 (v1.2) + * If you enable the suspend interrupt, it is likely you will see a suspend interrupt when + * the device is first connected but the bus is idle. The bus can be idle for a few ms before + * the host begins sending start of frame packets. You will also see a suspend interrupt + * when the device is disconnected if you do not have a VBUS detect circuit connected. This is + * because without VBUS detection, it is impossible to tell the difference between + * being disconnected and suspended. + */ + if (status & USB_INTS_DEV_SUSPEND_BITS) { + handled |= USB_INTS_DEV_SUSPEND_BITS; + /*!< Suspend */ + usb_hw_clear->sie_status = USB_SIE_STATUS_SUSPENDED_BITS; + usbd_event_suspend_handler(0); + } + + if (status & USB_INTS_DEV_RESUME_FROM_HOST_BITS) { + handled |= USB_INTS_DEV_RESUME_FROM_HOST_BITS; + /*!< Resume */ + usb_hw_clear->sie_status = USB_SIE_STATUS_RESUME_BITS; + usbd_event_resume_handler(0); + } + +#ifdef CONFIG_USBDEV_SOF_ENABLE + if (status & USB_INTS_DEV_SOF_BITS) { + handled |= USB_INTS_DEV_SOF_BITS; + usbd_event_sof_handler(0); + } +#endif + + if (status ^ handled) { + USB_LOG_INFO("Unhandled IRQ 0x%x\n", (uint32_t)(status ^ handled)); + } +} + +void rp2040_usbd_irq(void) +{ + USBD_IRQHandler(0); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/rp2040/usb_hc_rp2040.c b/src/lib/CherryUSB/port/rp2040/usb_hc_rp2040.c new file mode 100644 index 000000000..e9751b887 --- /dev/null +++ b/src/lib/CherryUSB/port/rp2040/usb_hc_rp2040.c @@ -0,0 +1,829 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_hub.h" +#include "hardware/resets.h" +#include "hardware/irq.h" +#include "hardware/structs/usb.h" + +#define usb_hw_set hw_set_alias(usb_hw) +#define usb_hw_clear hw_clear_alias(usb_hw) + +#define SIE_CTRL_COMMON (USB_SIE_CTRL_SOF_EN_BITS | \ + USB_SIE_CTRL_KEEP_ALIVE_EN_BITS | \ + USB_SIE_CTRL_PULLDOWN_EN_BITS | \ + USB_SIE_CTRL_EP0_INT_1BUF_BITS) + +typedef enum { + USB_EP0_STATE_SETUP = 0x0, /**< SETUP DATA */ + USB_EP0_STATE_IN_DATA, /**< IN DATA */ + USB_EP0_STATE_IN_STATUS, /**< IN status*/ + USB_EP0_STATE_OUT_DATA, /**< OUT DATA */ + USB_EP0_STATE_OUT_STATUS, /**< OUT status */ +} ep0_state_t; + +struct rp2040_pipe { + uint8_t chidx; + bool inuse; + volatile uint8_t ep0_state; + volatile uint32_t *endpoint_control; /*!< Endpoint control register */ + volatile uint32_t *buffer_control; /*!< Buffer control register */ + uint8_t *data_buffer; /*!< Buffer pointer in usb dpram */ + uint32_t buffer_size; /*!< Buffer size */ + usb_osal_sem_t waitsem; + struct usbh_urb *urb; +}; + +struct rp2040_hcd { + volatile bool port_csc; + volatile bool port_pec; + volatile bool port_pe; + usb_osal_mutex_t ep0_mutex; + struct rp2040_pipe pipe_pool[1 + USB_HOST_INTERRUPT_ENDPOINTS]; +} g_rp2040_hcd[CONFIG_USBHOST_MAX_BUS]; + +void rp2040_usbh_irq(void); + +static int rp2040_pipe_alloc(struct usbh_bus *bus) +{ + size_t flags; + int chidx; + + flags = usb_osal_enter_critical_section(); + for (chidx = 1; chidx <= USB_HOST_INTERRUPT_ENDPOINTS; chidx++) { + if (!g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse) { + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse = true; + usb_osal_leave_critical_section(flags); + return chidx; + } + } + usb_osal_leave_critical_section(flags); + return -1; +} + +static void rp2040_pipe_free(struct rp2040_pipe *pipe) +{ + size_t flags; + + flags = usb_osal_enter_critical_section(); + if (pipe->urb) { + pipe->urb->hcpriv = NULL; + pipe->urb = NULL; + } + pipe->inuse = false; + usb_osal_leave_critical_section(flags); +} + +/** + * @brief Take a buffer pointer located in the USB RAM and return as an offset of the RAM. + * + * @param buf + * @return uint32_t + */ +static inline uint32_t usb_buffer_offset(volatile uint8_t *buf) +{ + return (uint32_t)buf ^ (uint32_t)usbh_dpram; +} + +static inline uint8_t usbh_get_port_speed(void) +{ + return (usb_hw->sie_status & USB_SIE_STATUS_SPEED_BITS) >> USB_SIE_STATUS_SPEED_LSB; +} + +static inline void rp2040_init_endpoint(struct usbh_bus *bus, + uint8_t chidx, + uint8_t dev_addr, + uint8_t ep_addr, + uint8_t ep_type, + uint8_t ep_interval, + uint8_t speed) +{ + struct rp2040_pipe *pipe; + uint32_t regval; + + pipe = &g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[chidx]; + + // Get the data buffer as an offset of the USB controller's DPRAM + uint32_t dpram_offset = usb_buffer_offset(pipe->data_buffer); + regval = EP_CTRL_ENABLE_BITS | + EP_CTRL_INTERRUPT_PER_BUFFER | + (ep_type << EP_CTRL_BUFFER_TYPE_LSB) | + dpram_offset; + + if (ep_interval) { + regval |= (uint32_t)((ep_interval - 1) << EP_CTRL_HOST_INTERRUPT_INTERVAL_LSB); + } + + *pipe->endpoint_control = regval; + + if (chidx != 0) { + regval = (uint32_t)(dev_addr | ((ep_addr & 0x0f) << USB_ADDR_ENDP1_ENDPOINT_LSB)); + + if (!(ep_addr & 0x80)) { + regval |= USB_ADDR_ENDP1_INTEP_DIR_BITS; + } + + // ls device plugged to hub + if ((usbh_get_port_speed() == USB_SPEED_FULL) && (speed == USB_SPEED_LOW)) { + regval |= USB_ADDR_ENDP1_INTEP_PREAMBLE_BITS; + } + + usb_hw->int_ep_addr_ctrl[(chidx - 1)] = regval; + + // Finally, enable interrupt that endpoint + usb_hw_set->int_ep_ctrl = 1 << chidx; + } else { + usb_hw->dev_addr_ctrl = dev_addr; + } +} + +static inline uint32_t usb_buf_ctrl_fill(struct usbh_bus *bus, uint8_t chidx, uint8_t ep_addr, uint8_t buf_id) +{ + struct rp2040_pipe *pipe; + struct usbh_urb *urb; + uint32_t len; + uint32_t buf_ctrl; + + pipe = &g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[chidx]; + urb = pipe->urb; + + len = MIN(urb->transfer_buffer_length, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)); + urb->transfer_buffer_length -= len; + + buf_ctrl = len | USB_BUF_CTRL_AVAIL; + buf_ctrl |= urb->data_toggle ? USB_BUF_CTRL_DATA1_PID : USB_BUF_CTRL_DATA0_PID; + + if (USB_EP_DIR_IS_OUT(ep_addr)) { + /*!< Need to copy the data from the user buffer to the usb memory */ + if (urb->transfer_buffer != NULL) { + memcpy((void *)pipe->data_buffer + buf_id * 64, (void *)urb->transfer_buffer, len); + urb->transfer_buffer += len; + } + /*!< Mark as full */ + buf_ctrl |= USB_BUF_CTRL_FULL; + } + + if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) { + if (urb->transfer_buffer_length == 0) { + buf_ctrl |= USB_BUF_CTRL_LAST; + } + } else { + //TODO: handle isochronous transfer + } + + if (buf_id) + buf_ctrl = buf_ctrl << 16; + + return buf_ctrl; +} + +/** + * @brief Starts a transfer on a given endpoint. + * + * @param ep, the endpoint configuration. + * @param buf, the data buffer to send. Only applicable if the endpoint is TX + * @param len, the length of the data in buf (this example limits max len to one packet - 64 bytes) + */ +static void usb_start_transfer(struct usbh_bus *bus, uint8_t chidx, uint8_t ep_addr) +{ + struct rp2040_pipe *pipe; + struct usbh_urb *urb; + uint32_t buf_ctrl; + uint32_t ep_ctrl; + + pipe = &g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[chidx]; + urb = pipe->urb; + + ep_ctrl = *pipe->endpoint_control; + buf_ctrl = usb_buf_ctrl_fill(bus, chidx, ep_addr, 0); + + if (urb->transfer_buffer_length && (ep_addr & 0x0f) == 0x00) { + urb->data_toggle ^= 1; + buf_ctrl |= usb_buf_ctrl_fill(bus, chidx, ep_addr, 1); + + // Set endpoint control double buffered bit if needed + ep_ctrl &= ~EP_CTRL_INTERRUPT_PER_BUFFER; + ep_ctrl |= EP_CTRL_DOUBLE_BUFFERED_BITS | EP_CTRL_INTERRUPT_PER_DOUBLE_BUFFER; + } else { + // Single buffered since 1 is enough + ep_ctrl &= ~(EP_CTRL_DOUBLE_BUFFERED_BITS | EP_CTRL_INTERRUPT_PER_DOUBLE_BUFFER); + ep_ctrl |= EP_CTRL_INTERRUPT_PER_BUFFER; + } + *pipe->endpoint_control = ep_ctrl; + *pipe->buffer_control = buf_ctrl; +} + +static inline void rp2040_control_transfer_start(bool dir_in, bool isetup, uint8_t speed) +{ + uint32_t regval; + + regval = SIE_CTRL_COMMON | USB_SIE_CTRL_START_TRANS_BITS; + + if ((usbh_get_port_speed() == USB_SPEED_FULL) && (speed == USB_SPEED_LOW)) { + regval |= USB_SIE_CTRL_PREAMBLE_EN_BITS; + } + + if (isetup) { + regval |= USB_SIE_CTRL_SEND_SETUP_BITS; + } else { + if (dir_in) { + regval |= USB_SIE_CTRL_RECEIVE_DATA_BITS; + } else { + regval |= USB_SIE_CTRL_SEND_DATA_BITS; + } + } + + usb_hw->sie_ctrl = regval & ~USB_SIE_CTRL_START_TRANS_BITS; + busy_wait_at_least_cycles(12); + usb_hw->sie_ctrl = regval; +} + +static void rp2040_control_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) +{ + struct rp2040_pipe *pipe; + + pipe = &g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[chidx]; + + if (pipe->ep0_state == USB_EP0_STATE_SETUP) /* fill setup */ + { + pipe->urb->data_toggle = 1; + memcpy((uint8_t *)usbh_dpram->setup_packet, (uint8_t *)setup, 8); + rp2040_init_endpoint(bus, chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, 0, urb->hport->speed); + rp2040_control_transfer_start(false, true, urb->hport->speed); + } else if (pipe->ep0_state == USB_EP0_STATE_IN_DATA) /* fill in data */ + { + rp2040_init_endpoint(bus, chidx, urb->hport->dev_addr, 0x80, USB_ENDPOINT_TYPE_CONTROL, 0, urb->hport->speed); + usb_start_transfer(bus, chidx, 0x80); + rp2040_control_transfer_start(true, false, urb->hport->speed); + } else if (pipe->ep0_state == USB_EP0_STATE_OUT_DATA) /* fill out data */ + { + rp2040_init_endpoint(bus, chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, 0, urb->hport->speed); + usb_start_transfer(bus, chidx, 0x00); + rp2040_control_transfer_start(false, false, urb->hport->speed); + } else if (pipe->ep0_state == USB_EP0_STATE_IN_STATUS) /* fill in status */ + { + urb->data_toggle = 1; + rp2040_init_endpoint(bus, chidx, urb->hport->dev_addr, 0x80, USB_ENDPOINT_TYPE_CONTROL, 0, urb->hport->speed); + usb_start_transfer(bus, chidx, 0x80); + rp2040_control_transfer_start(true, false, urb->hport->speed); + } else if (pipe->ep0_state == USB_EP0_STATE_OUT_STATUS) /* fill out status */ + { + urb->data_toggle = 1; + rp2040_init_endpoint(bus, chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, 0, urb->hport->speed); + usb_start_transfer(bus, chidx, 0x00); + rp2040_control_transfer_start(false, false, urb->hport->speed); + } +} + +static void rp2040_bulk_int_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +{ + rp2040_init_endpoint(bus, chidx, urb->hport->dev_addr, urb->ep->bEndpointAddress, USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes), urb->ep->bInterval, urb->hport->speed); + usb_start_transfer(bus, chidx, urb->ep->bEndpointAddress); +} + +int usb_hc_init(struct usbh_bus *bus) +{ + uint8_t *next_buffer_ptr; + + memset(&g_rp2040_hcd[bus->hcd.hcd_id], 0, sizeof(struct rp2040_hcd)); + + for (uint8_t i = 0; i <= USB_HOST_INTERRUPT_ENDPOINTS; i++) { + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem = usb_osal_sem_create(0); + if (g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem == NULL) { + USB_LOG_ERR("Failed to create waitsem\r\n"); + return -USB_ERR_NOMEM; + } + } + + g_rp2040_hcd[bus->hcd.hcd_id].ep0_mutex = usb_osal_mutex_create(); + if (g_rp2040_hcd[bus->hcd.hcd_id].ep0_mutex == NULL) { + USB_LOG_ERR("Failed to create ep0_mutex\r\n"); + return -USB_ERR_NOMEM; + } + + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[0].endpoint_control = &usbh_dpram->epx_ctrl; + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[0].buffer_control = &usbh_dpram->epx_buf_ctrl; + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[0].data_buffer = &usbh_dpram->epx_data[0]; + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[0].buffer_size = (64 * 2); + + next_buffer_ptr = &usb_dpram->epx_data[64 * 2]; + + for (uint8_t i = 1; i <= USB_HOST_INTERRUPT_ENDPOINTS; i++) { + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].chidx = i; + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].endpoint_control = &usbh_dpram->int_ep_ctrl[i - 1].ctrl; + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].buffer_control = &usbh_dpram->int_ep_buffer_ctrl[i - 1].ctrl; + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].data_buffer = next_buffer_ptr; + g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].buffer_size = (64 * 2); + next_buffer_ptr += (64 * 2); + } + + // Reset usb controller + reset_unreset_block_num_wait_blocking(RESET_USBCTRL); + + // Remove shared irq if it was previously added so as not to fill up shared irq slots + irq_remove_handler(USBCTRL_IRQ, rp2040_usbh_irq); + + irq_add_shared_handler(USBCTRL_IRQ, rp2040_usbh_irq, PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY); + + /*!< Clear any previous state just in case */ + memset(usb_hw, 0, sizeof(*usb_hw)); + memset(usbh_dpram, 0, sizeof(*usbh_dpram)); + + /*!< Mux the controller to the onboard usb phy */ + usb_hw->muxing = USB_USB_MUXING_TO_PHY_BITS | USB_USB_MUXING_SOFTCON_BITS; + + // Force VBUS detect so the device thinks it is plugged into a host + usb_hw->pwr = USB_USB_PWR_VBUS_DETECT_BITS | USB_USB_PWR_VBUS_DETECT_OVERRIDE_EN_BITS; + + // Enable the USB controller in device mode. + usb_hw->main_ctrl = USB_MAIN_CTRL_CONTROLLER_EN_BITS | USB_MAIN_CTRL_HOST_NDEVICE_BITS; + + usb_hw->sie_ctrl = SIE_CTRL_COMMON; + + // Enable USB interrupt at processor + irq_set_enabled(USBCTRL_IRQ, true); + + usb_hw->inte = USB_INTE_BUFF_STATUS_BITS | + USB_INTE_HOST_CONN_DIS_BITS | + USB_INTE_STALL_BITS | + USB_INTE_TRANS_COMPLETE_BITS | + USB_INTE_ERROR_RX_TIMEOUT_BITS | + USB_INTE_ERROR_DATA_SEQ_BITS; + return 0; +} + +int usb_hc_deinit(struct usbh_bus *bus) +{ + // Enable USB interrupt at processor + irq_set_enabled(USBCTRL_IRQ, false); + + // Remove shared irq if it was previously added so as not to fill up shared irq slots + irq_remove_handler(USBCTRL_IRQ, rp2040_usbh_irq); + + for (uint8_t i = 0; i <= USB_HOST_INTERRUPT_ENDPOINTS; i++) { + usb_osal_sem_delete(g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem); + } + + usb_osal_mutex_delete(g_rp2040_hcd[bus->hcd.hcd_id].ep0_mutex); + + return 0; +} + +uint16_t usbh_get_frame_number(struct usbh_bus *bus) +{ + return usb_hw->sof_rd; +} + +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) +{ + uint8_t nports; + uint8_t port; + uint32_t status; + + nports = CONFIG_USBHOST_MAX_RHPORTS; + port = setup->wIndex; + if (setup->bmRequestType & USB_REQUEST_RECIPIENT_DEVICE) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_INVAL; + } + break; + case HUB_REQUEST_SET_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_INVAL; + } + break; + case HUB_REQUEST_GET_DESCRIPTOR: + break; + case HUB_REQUEST_GET_STATUS: + memset(buf, 0, 4); + break; + default: + break; + } + } else if (setup->bmRequestType & USB_REQUEST_RECIPIENT_OTHER) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_ENABLE: + break; + case HUB_PORT_FEATURE_SUSPEND: + case HUB_PORT_FEATURE_C_SUSPEND: + break; + case HUB_PORT_FEATURE_POWER: + break; + case HUB_PORT_FEATURE_C_CONNECTION: + g_rp2040_hcd[bus->hcd.hcd_id].port_csc = 0; + break; + case HUB_PORT_FEATURE_C_ENABLE: + g_rp2040_hcd[bus->hcd.hcd_id].port_pec = 0; + break; + case HUB_PORT_FEATURE_C_OVER_CURREN: + break; + case HUB_PORT_FEATURE_C_RESET: + break; + default: + return -USB_ERR_INVAL; + } + break; + case HUB_REQUEST_SET_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_SUSPEND: + break; + case HUB_PORT_FEATURE_POWER: + break; + case HUB_PORT_FEATURE_RESET: + break; + + default: + return -USB_ERR_INVAL; + } + break; + case HUB_REQUEST_GET_STATUS: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + status = 0; + if (g_rp2040_hcd[bus->hcd.hcd_id].port_csc) { + status |= (1 << HUB_PORT_FEATURE_C_CONNECTION); + } + if (g_rp2040_hcd[bus->hcd.hcd_id].port_pec) { + status |= (1 << HUB_PORT_FEATURE_C_ENABLE); + } + + if (g_rp2040_hcd[bus->hcd.hcd_id].port_pe) { + status |= (1 << HUB_PORT_FEATURE_CONNECTION); + status |= (1 << HUB_PORT_FEATURE_ENABLE); + if (usbh_get_port_speed() == USB_SPEED_LOW) { + status |= (1 << HUB_PORT_FEATURE_LOWSPEED); + } + } + + status |= (1 << HUB_PORT_FEATURE_POWER); + memcpy(buf, &status, 4); + break; + default: + break; + } + } + return 0; +} + +int usbh_submit_urb(struct usbh_urb *urb) +{ + struct rp2040_pipe *pipe; + struct usbh_bus *bus; + int chidx; + size_t flags; + int ret = 0; + + if (!urb || !urb->hport || !urb->ep || !urb->hport->bus) { + return -USB_ERR_INVAL; + } + + if (!urb->hport->connected || !(usb_hw->sie_status & USB_SIE_STATUS_SPEED_BITS)) { + return -USB_ERR_NOTCONN; + } + + if (urb->errorcode == -USB_ERR_BUSY) { + return -USB_ERR_BUSY; + } + + bus = urb->hport->bus; + + if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) { + chidx = 0; + /* all the control transfers use the only one ep0 register, we need to lock */ + usb_osal_mutex_take(g_rp2040_hcd[bus->hcd.hcd_id].ep0_mutex); + } else { + chidx = rp2040_pipe_alloc(bus); + if (chidx == -1) { + return -USB_ERR_NOMEM; + } + } + + flags = usb_osal_enter_critical_section(); + + pipe = &g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[chidx]; + pipe->chidx = chidx; + pipe->urb = urb; + + urb->hcpriv = pipe; + urb->errorcode = -USB_ERR_BUSY; + urb->actual_length = 0; + usb_osal_leave_critical_section(flags); + + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + pipe->ep0_state = USB_EP0_STATE_SETUP; + rp2040_control_urb_init(bus, 0, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + break; + case USB_ENDPOINT_TYPE_BULK: + case USB_ENDPOINT_TYPE_INTERRUPT: + rp2040_bulk_int_urb_init(bus, chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); + break; + default: + break; + } + + if (urb->timeout > 0) { + /* wait until timeout or sem give */ + ret = usb_osal_sem_take(pipe->waitsem, urb->timeout); + if (ret < 0) { + goto errout_timeout; + } + urb->timeout = 0; + ret = urb->errorcode; + /* we can free pipe when waitsem is done */ + rp2040_pipe_free(pipe); + + if (chidx == 0) { + usb_osal_mutex_give(g_rp2040_hcd[bus->hcd.hcd_id].ep0_mutex); + } + } + return ret; +errout_timeout: + if (chidx == 0) { + usb_osal_mutex_give(g_rp2040_hcd[bus->hcd.hcd_id].ep0_mutex); + } + urb->timeout = 0; + usbh_kill_urb(urb); + return ret; +} + +int usbh_kill_urb(struct usbh_urb *urb) +{ + struct rp2040_pipe *pipe; + struct usbh_bus *bus; + size_t flags; + + if (!urb || !urb->hcpriv || !urb->hport->bus) { + return -USB_ERR_INVAL; + } + + bus = urb->hport->bus; + + ARG_UNUSED(bus); + + flags = usb_osal_enter_critical_section(); + + pipe = (struct rp2040_pipe *)urb->hcpriv; + urb->errorcode = -USB_ERR_SHUTDOWN; + + usb_hw_clear->int_ep_ctrl = 1 << pipe->chidx; + usb_hw_clear->buf_status = 1 << (pipe->chidx * 2 + 0); + usb_hw_clear->buf_status = 1 << (pipe->chidx * 2 + 1); + *pipe->endpoint_control = 0; + *pipe->buffer_control = 0; + + if (urb->timeout) { + usb_osal_sem_give(pipe->waitsem); + } else { + rp2040_pipe_free(pipe); + } + + if (urb->complete) { + urb->complete(urb->arg, urb->errorcode); + } + + usb_osal_leave_critical_section(flags); + + return 0; +} + +static void rp2040_urb_waitup(struct usbh_urb *urb) +{ + struct rp2040_pipe *pipe; + + pipe = (struct rp2040_pipe *)urb->hcpriv; + + if (urb->timeout) { + usb_osal_sem_give(pipe->waitsem); + } else { + rp2040_pipe_free(pipe); + } + + if (urb->complete) { + if (urb->errorcode < 0) { + urb->complete(urb->arg, urb->errorcode); + } else { + urb->complete(urb->arg, urb->actual_length); + } + } +} + +static void rp2040_handle_buffer_status(struct usbh_bus *bus) +{ + struct rp2040_pipe *pipe; + struct usbh_urb *urb; + uint32_t remaining_buffers; + uint32_t size; + + remaining_buffers = usb_hw->buf_status; + + uint32_t bit = 1u; + if (remaining_buffers & bit) { + remaining_buffers &= ~bit; + usb_hw_clear->buf_status = bit; + + pipe = &g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[0]; + urb = pipe->urb; + switch (pipe->ep0_state) { + case USB_EP0_STATE_IN_DATA: + size = *pipe->buffer_control & USB_BUF_CTRL_LEN_MASK; + memcpy(urb->transfer_buffer, (uint8_t *)pipe->data_buffer, size); + + urb->transfer_buffer += size; + urb->actual_length += size; + + if (*pipe->endpoint_control & EP_CTRL_DOUBLE_BUFFERED_BITS) { + if (size == USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { + size = (*pipe->buffer_control >> 16) & USB_BUF_CTRL_LEN_MASK; + memcpy(urb->transfer_buffer, (uint8_t *)pipe->data_buffer + 64, size); + + urb->transfer_buffer += size; + urb->actual_length += size; + } + } + + if ((size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) || (urb->transfer_buffer_length == 0)) { + pipe->ep0_state = USB_EP0_STATE_OUT_STATUS; + rp2040_control_urb_init(bus, 0, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + } else { + urb->data_toggle ^= 1; + usb_start_transfer(bus, 0, 0x80); + } + break; + case USB_EP0_STATE_OUT_DATA: + urb->actual_length += *pipe->buffer_control & USB_BUF_CTRL_LEN_MASK; + + if (*pipe->endpoint_control & EP_CTRL_DOUBLE_BUFFERED_BITS) { + urb->actual_length += (*pipe->buffer_control >> 16) & USB_BUF_CTRL_LEN_MASK; + } + + if (urb->transfer_buffer_length == 0) { + pipe->ep0_state = USB_EP0_STATE_IN_STATUS; + rp2040_control_urb_init(bus, 0, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + } else { + urb->data_toggle ^= 1; + usb_start_transfer(bus, 0, 0x00); + } + break; + case USB_EP0_STATE_IN_STATUS: + case USB_EP0_STATE_OUT_STATUS: + urb->errorcode = 0; + rp2040_urb_waitup(urb); + break; + default: + break; + } + } + + for (uint8_t i = 1; remaining_buffers && i <= USB_HOST_INTERRUPT_ENDPOINTS; i++) { + for (uint8_t j = 0; j < 2; j++) { + bit = 1 << (i * 2 + j); + if (remaining_buffers & bit) { + remaining_buffers &= ~bit; + usb_hw_clear->buf_status = bit; + + pipe = &g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i]; + urb = pipe->urb; + if (urb == NULL) { + continue; + } + + if (j == 0) { //IN + size = *pipe->buffer_control & USB_BUF_CTRL_LEN_MASK; + memcpy(urb->transfer_buffer, (uint8_t *)pipe->data_buffer, size); + + urb->transfer_buffer += size; + urb->actual_length += size; + + urb->data_toggle ^= 1; + if (size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize) || urb->transfer_buffer_length == 0) { + urb->errorcode = 0; + rp2040_urb_waitup(urb); + } else { + usb_start_transfer(bus, i, urb->ep->bEndpointAddress); + } + } else { //OUT + urb->data_toggle ^= 1; + + urb->actual_length += *pipe->buffer_control & USB_BUF_CTRL_LEN_MASK; + + if (urb->transfer_buffer_length == 0) { + urb->errorcode = 0; + rp2040_urb_waitup(urb); + } else { + usb_start_transfer(bus, i, urb->ep->bEndpointAddress); + } + } + } + } + } +} + +void USBH_IRQHandler(uint8_t busid) +{ + uint32_t status; + uint32_t handled = 0; + struct usbh_bus *bus; + struct rp2040_pipe *pipe; + struct usbh_urb *urb; + + bus = &g_usbhost_bus[busid]; + status = usb_hw->ints; + + if (status & USB_INTS_HOST_CONN_DIS_BITS) { + handled |= USB_INTS_HOST_CONN_DIS_BITS; + usb_hw_clear->sie_status = USB_SIE_STATUS_SPEED_BITS; + if (usbh_get_port_speed()) { + g_rp2040_hcd[bus->hcd.hcd_id].port_csc = 1; + g_rp2040_hcd[bus->hcd.hcd_id].port_pec = 1; + g_rp2040_hcd[bus->hcd.hcd_id].port_pe = 1; + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); + } else { + g_rp2040_hcd[bus->hcd.hcd_id].port_csc = 1; + g_rp2040_hcd[bus->hcd.hcd_id].port_pec = 1; + g_rp2040_hcd[bus->hcd.hcd_id].port_pe = 0; + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); + } + } + + if (status & USB_INTS_STALL_BITS) { + handled |= USB_INTS_STALL_BITS; + usb_hw_clear->sie_status = USB_SIE_STATUS_STALL_REC_BITS; + } + + if (status & USB_INTS_BUFF_STATUS_BITS) { + handled |= USB_INTS_BUFF_STATUS_BITS; + rp2040_handle_buffer_status(bus); + } + + if (status & USB_INTS_TRANS_COMPLETE_BITS) { + handled |= USB_INTS_TRANS_COMPLETE_BITS; + usb_hw_clear->sie_status = USB_SIE_STATUS_TRANS_COMPLETE_BITS; + if (usb_hw->sie_ctrl & USB_SIE_CTRL_SEND_SETUP_BITS) { + pipe = (struct rp2040_pipe *)&g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[0]; + urb = pipe->urb; + if (urb) { + if (urb->setup->wLength) { + if (urb->setup->bmRequestType & 0x80) { + pipe->ep0_state = USB_EP0_STATE_IN_DATA; + } else { + pipe->ep0_state = USB_EP0_STATE_OUT_DATA; + } + } else { + pipe->ep0_state = USB_EP0_STATE_IN_STATUS; + } + urb->actual_length = 8; + rp2040_control_urb_init(bus, 0, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + } + } else { + } + } + + if (status & USB_INTS_ERROR_RX_TIMEOUT_BITS) { + handled |= USB_INTS_ERROR_RX_TIMEOUT_BITS; + usb_hw_clear->sie_status = USB_SIE_STATUS_RX_TIMEOUT_BITS; + } + + if (status & USB_INTS_ERROR_DATA_SEQ_BITS) { + handled |= USB_INTS_ERROR_DATA_SEQ_BITS; + usb_hw_clear->sie_status = USB_SIE_STATUS_DATA_SEQ_ERROR_BITS; + } + + if (status ^ handled) { + USB_LOG_ERR("Unhandled IRQ 0x%x\n", (uint)(status ^ handled)); + } +} + +void rp2040_usbh_irq(void) +{ + USBH_IRQHandler(0); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/template/usb_dc.c b/src/lib/CherryUSB/port/template/usb_dc.c new file mode 100644 index 000000000..516b32ff4 --- /dev/null +++ b/src/lib/CherryUSB/port/template/usb_dc.c @@ -0,0 +1,125 @@ +#include "usbd_core.h" + +/* Endpoint state */ +struct usb_dc_ep_state { + uint16_t ep_mps; /* Endpoint max packet size */ + uint8_t ep_type; /* Endpoint type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; +}; + +/* Driver state */ +struct xxx_udc { + volatile uint8_t dev_addr; + struct usb_dc_ep_state in_ep[CONFIG_USBDEV_EP_NUM]; /*!< IN endpoint parameters*/ + struct usb_dc_ep_state out_ep[CONFIG_USBDEV_EP_NUM]; /*!< OUT endpoint parameters */ +} g_xxx_udc; + +__WEAK void usb_dc_low_level_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + +int usb_dc_init(uint8_t busid) +{ + memset(&g_xxx_udc, 0, sizeof(struct xxx_udc)); + + usb_dc_low_level_init(); + return 0; +} + +int usb_dc_deinit(uint8_t busid) +{ + return 0; +} + +int usbd_set_address(uint8_t busid, const uint8_t addr) +{ + return 0; +} + +int usbd_set_remote_wakeup(uint8_t busid) +{ + return -1; +} + +uint8_t usbd_get_port_speed(uint8_t busid) +{ + return USB_SPEED_FULL; +} + +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + + if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) { + g_xxx_udc.out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_xxx_udc.out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_xxx_udc.out_ep[ep_idx].ep_enable = true; + } else { + g_xxx_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + g_xxx_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); + g_xxx_udc.in_ep[ep_idx].ep_enable = true; + } + return 0; +} + +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + return 0; +} + +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + return 0; +} + +int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep) +{ + return 0; +} + +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + return 0; +} + +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + uint32_t tmp; + + if (!data && data_len) { + return -1; + } + + g_xxx_udc.in_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_xxx_udc.in_ep[ep_idx].xfer_len = data_len; + g_xxx_udc.in_ep[ep_idx].actual_xfer_len = 0; + + return 0; +} + +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) { + return -1; + } + + g_xxx_udc.out_ep[ep_idx].xfer_buf = (uint8_t *)data; + g_xxx_udc.out_ep[ep_idx].xfer_len = data_len; + g_xxx_udc.out_ep[ep_idx].actual_xfer_len = 0; + + return 0; +} + +void USBD_IRQHandler(uint8_t busid) +{ +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/template/usb_hc.c b/src/lib/CherryUSB/port/template/usb_hc.c new file mode 100644 index 000000000..1de1cd504 --- /dev/null +++ b/src/lib/CherryUSB/port/template/usb_hc.c @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_hub.h" + +int usb_hc_init(struct usbh_bus *bus) +{ + return 0; +} + +int usb_hc_deinit(struct usbh_bus *bus) +{ + return 0; +} + +uint16_t usbh_get_frame_number(struct usbh_bus *bus) +{ + return 0; +} + +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) +{ + uint8_t nports; + uint8_t port; + uint32_t status; + + nports = CONFIG_USBHOST_MAX_RHPORTS; + port = setup->wIndex; + if (setup->bmRequestType & USB_REQUEST_RECIPIENT_DEVICE) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_SET_FEATURE: + switch (setup->wValue) { + case HUB_FEATURE_HUB_C_LOCALPOWER: + break; + case HUB_FEATURE_HUB_C_OVERCURRENT: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_GET_DESCRIPTOR: + break; + case HUB_REQUEST_GET_STATUS: + memset(buf, 0, 4); + break; + default: + break; + } + } else if (setup->bmRequestType & USB_REQUEST_RECIPIENT_OTHER) { + switch (setup->bRequest) { + case HUB_REQUEST_CLEAR_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_ENABLE: + break; + case HUB_PORT_FEATURE_SUSPEND: + break; + case HUB_PORT_FEATURE_C_SUSPEND: + break; + case HUB_PORT_FEATURE_POWER: + break; + case HUB_PORT_FEATURE_C_CONNECTION: + break; + case HUB_PORT_FEATURE_C_ENABLE: + break; + case HUB_PORT_FEATURE_C_OVER_CURREN: + break; + case HUB_PORT_FEATURE_C_RESET: + break; + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_SET_FEATURE: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + switch (setup->wValue) { + case HUB_PORT_FEATURE_SUSPEND: + break; + case HUB_PORT_FEATURE_POWER: + break; + case HUB_PORT_FEATURE_RESET: + break; + + default: + return -USB_ERR_NOTSUPP; + } + break; + case HUB_REQUEST_GET_STATUS: + if (!port || port > nports) { + return -USB_ERR_INVAL; + } + + memcpy(buf, &status, 4); + break; + default: + break; + } + } + return 0; +} + +int usbh_submit_urb(struct usbh_urb *urb) +{ + return -USB_ERR_NOTSUPP; +} + +int usbh_kill_urb(struct usbh_urb *urb) +{ + return -USB_ERR_NOTSUPP; +} + +void USBH_IRQHandler(uint8_t busid) +{ +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/xhci/phytium/README.md b/src/lib/CherryUSB/port/xhci/phytium/README.md new file mode 100644 index 000000000..4eb67580e --- /dev/null +++ b/src/lib/CherryUSB/port/xhci/phytium/README.md @@ -0,0 +1,70 @@ +# USB 3.0 Host 控制器 (XHCI) + +- Phytium PI 和 Phyium E2000 系列开发板提供符合 XHCI 1.1 规范的 USB 3.0 Host 控制器, 其它 Phytium 系列平台可以通过 PCIe 扩展卡获得 XHCI 控制器 +- 相关的使用例程可以在 Phytium PI(飞腾派)、E2000 D/Q Demo 板以及 D2000 和后续平台上运行,例程包括 + +--------------------------------------------- + +- FreeRTOS + +- - 1. [XHCI 平台控制器使用鼠标/键盘/U盘功能](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/xhci_platform/README.md) +- - 2. [XHCI PCIe控制器使用鼠标/键盘/U盘功能](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/xhci_pcie/README.md) +- - 3. [LVGL 中使用 XHCI 平台控制器连接的鼠标/键盘/U盘](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/blob/master/example/peripheral/media/lvgl_indev/README.md) + +--------------------------------------------- + +- RT-Thread + +- - 1. [XHCI 平台控制器识别鼠标/键盘/U盘](https://github.com/RT-Thread/rt-thread/blob/master/bsp/phytium/doc/use_cherryusb.md) + +--------------------------------------------- + +- Standalone 裸机 + +- - 暂不支持 + +--------------------------------------------- + +- XHCI 的驱动功能以静态库的方式提供,仅限在 Phytium 系列 CPU 平台使用, + +- - libxhci_a64.a : AARCH64 驱动库 +- - libxhci_a32_hardfp.a : AARCH32 驱动库,使用硬浮点 +- - libxhci_a32_softfp.a : AARCH32 驱动库,使用软浮点 + +需要获取源代码请联系 `opensource_embedded@phytium.com.cn` 获取,如需移植运行到非 Phytium 系列 CPU 平台请提前联系`opensource_embedded@phytium.com.cn`获得允许 + +# USB 3.0 Host Controller (XHCI) + +- The Phytium PI and Phytium E2000 series development boards provide USB 3.0 Host controllers that conform to the XHCI 1.1 specification. Other Phytium series platforms can obtain XHCI controllers through PCIe expansion cards. +- Related example routines can be run on Phytium PI (Fetion Pi), E2000 D/Q Demo boards, and D2000 and later platforms. Examples include: + +--------------------------------------------- + +- FreeRTOS + + - 1. [XHCI platform controller for mouse/keyboard/USB drive functions](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/xhci_platform/README.md) + - 2. [XHCI PCIe controller for mouse/keyboard/USB drive functions](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/tree/master/example/peripheral/usb/xhci_pcie/README.md) + - 3. [Using XHCI platform controller-connected mouse/keyboard/USB drive in LVGL](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk/blob/master/example/peripheral/media/lvgl_indev/README.md) + +--------------------------------------------- + +- RT-Thread + + - 1. [XHCI platform controller recognizing mouse/keyboard/USB drive](https://github.com/RT-Thread/rt-thread/blob/master/bsp/phytium/doc/use_cherryusb.md) + +--------------------------------------------- + +- Standalone (Bare Metal) + + - Not supported yet + +--------------------------------------------- + +- This XHCI driver functionality is provided as a static library and is only available for Phytium series CPU platforms. + + - - `libxhci_a64.a` : Driver library for AARCH64 + - - `libxhci_a32_hardfp.a` : Driver library for AARCH32, using hard floating point + - - `libxhci_a32_softfp.a` : Driver library for AARCH32, using soft floating point + +- To obtain the source code, please contact `opensource_embedded@phytium.com.cn`. +- For porting to non-Phytium CPU platforms, shall contact `opensource_embedded@phytium.com.cn` in advance for permission. \ No newline at end of file diff --git a/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_config.h b/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_config.h new file mode 100644 index 000000000..60a9ed185 --- /dev/null +++ b/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_config.h @@ -0,0 +1,292 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ + +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +#include "sdkconfig.h" +#include "FreeRTOS.h" +#include "task.h" + +/* ================ USB common Configuration ================ */ + +#define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) + +void *xhci_mem_malloc(size_t align, size_t size); +void xhci_mem_free(void *ptr); + +#define XHCI_DCACHE_FLUSH (1 << 0) +#define XHCI_DCACHE_INVALIDATE (1 << 1) +void xhci_dcache_sync(void *ptr, size_t len, uint32_t flags); + +unsigned long usb_hc_get_register_base(uint32_t id); + +#define usb_malloc(size) xhci_mem_malloc(sizeof(int), size) +#define usb_free(ptr) xhci_mem_free(ptr) + +#ifndef CONFIG_USB_DBG_LEVEL +#if defined(CONFIG_LOG_ERROR) +#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR +#elif defined(CONFIG_LOG_WARN) +#define CONFIG_USB_DBG_LEVEL USB_DBG_WARNING +#elif defined(CONFIG_LOG_INFO) +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#elif defined(CONFIG_LOG_DEBUG) || defined(CONFIG_LOG_VERBOS) +#define CONFIG_USB_DBG_LEVEL USB_DBG_LOG +#else +#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR +#endif +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* data align size when use dma */ +#ifndef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +// #define CONFIG_USBDEV_SETUP_LOG_PRINT + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 8 +#define CONFIG_USBHOST_MAX_EXTHUBS 4 +#define CONFIG_USBHOST_MAX_EHPORTS 8 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 8 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 8192 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 0xffffffff +#endif + +#ifndef CONFIG_INPUT_MOUSE_WHEEL +#define CONFIG_INPUT_MOUSE_WHEEL +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 2 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 8 +#endif + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +// #define CONFIG_USB_DWC2_RXALL_FIFO_SIZE (1024 / 4) +// #define CONFIG_USB_DWC2_TX0_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX1_FIFO_SIZE (512 / 4) +// #define CONFIG_USB_DWC2_TX2_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX3_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX4_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX5_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX6_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX7_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX8_FIFO_SIZE (0 / 4) + +/* ---------------- MUSB Configuration ---------------- */ +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 2 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USBHOST_PIPE_NUM 10 +#endif + +/* ---------------- EHCI Configuration ---------------- */ + +#define CONFIG_USB_EHCI_HCCR_OFFSET (0x0) +#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 +#define CONFIG_USB_EHCI_QH_NUM CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USB_EHCI_QTD_NUM 3 +#define CONFIG_USB_EHCI_ITD_NUM 20 +// #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE +// #define CONFIG_USB_EHCI_CONFIGFLAG +// #define CONFIG_USB_EHCI_ISO +// #define CONFIG_USB_EHCI_WITH_OHCI + +/* ---------------- OHCI Configuration ---------------- */ +#define CONFIG_USB_OHCI_HCOR_OFFSET (0x0) + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +#ifndef CONFIG_USB_XHCI_ENABLE_SOFT_ISR +#define CONFIG_USB_XHCI_ENABLE_SOFT_ISR 0 +#endif + +#endif diff --git a/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_glue_phytium.c b/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_glue_phytium.c new file mode 100644 index 000000000..e939b468e --- /dev/null +++ b/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_glue_phytium.c @@ -0,0 +1,135 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +/***************************** Include Files *********************************/ +#include +#include + +#include "sdkconfig.h" + +#include "fassert.h" +#include "finterrupt.h" +#include "fcpu_info.h" +#include "fdebug.h" +#include "fcache.h" +#include "fmemory_pool.h" + +#include "usbh_core.h" + +/************************** Constant Definitions *****************************/ +#define FUSB_MEMP_TOTAL_SIZE SZ_1M + +/**************************** Type Definitions *******************************/ +#if defined(CONFIG_CHERRY_USB_PORT_XHCI_PLATFROM) +void usb_hc_setup_xhci_interrupt(u32 id); +#endif +#if defined(CONFIG_CHERRY_USB_PORT_XHCI_PCIE) +unsigned long usb_hc_setup_xhci_pcie(struct usbh_bus *bus); +#endif +/************************** Variable Definitions *****************************/ +static FMemp memp; +static u8 memp_buf[FUSB_MEMP_TOTAL_SIZE] __attribute__((aligned(8))) = {0}; +static u32 memp_ref_cnt = 0; + +static void xhci_mem_init(void) +{ + if (FT_COMPONENT_IS_READY != memp.is_ready) + { + USB_ASSERT(FT_SUCCESS == FMempInit(&memp, &memp_buf[0], &memp_buf[0] + FUSB_MEMP_TOTAL_SIZE)); + } +} + +static void xhci_mem_deinit(void) +{ + if (FT_COMPONENT_IS_READY == memp.is_ready) + { + FMempDeinit(&memp); + } +} + +void *xhci_mem_malloc(size_t align, size_t size) +{ + void *result = FMempMallocAlign(&memp, size, align); + + if (result) + { + memset(result, 0U, size); + } + + return result; +} + +void xhci_mem_free(void *ptr) +{ + if (NULL != ptr) + { + FMempFree(&memp, ptr); + } +} + +void xhci_dcache_sync(void *ptr, size_t len, uint32_t flags) +{ + if (flags & XHCI_DCACHE_FLUSH) + { + FCacheDCacheFlushRange((uintptr_t)ptr, len); + } + else if (flags & XHCI_DCACHE_INVALIDATE) + { + FCacheDCacheInvalidateRange((uintptr_t)ptr, len); + } +} + +void usb_assert(const char *filename, int linenum) +{ + FAssert(filename, linenum, 0xff); +} + +extern int vApplicationInIrq(void); +int xPortIsInsideInterrupt(void) +{ + return vApplicationInIrq(); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + if (memp_ref_cnt == 0) { + xhci_mem_init(); /* create memory pool before first bus init */ + } + + memp_ref_cnt++; /* one more bus is using the memory pool */ + + if (bus->hcd.reg_base != 0) { +#if defined(CONFIG_CHERRY_USB_PORT_XHCI_PLATFROM) + /* platform XHCI controller */ + usb_hc_setup_xhci_interrupt(bus->busid); +#else + USB_LOG_ERR("Platform XHCI not supported !!!\n"); + USB_ASSERT(0); +#endif + } else { +#if defined(CONFIG_CHERRY_USB_PORT_XHCI_PCIE) + /* pcie XHCI controller */ + bus->hcd.reg_base = usb_hc_setup_xhci_pcie(bus); + bus->busid = 0U; /* only support one pcie lane */ +#else + USB_LOG_ERR("Invalid register base !!!\n"); + USB_ASSERT(0); +#endif + } +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + memp_ref_cnt--; /* one more bus is leaving */ + + if (memp_ref_cnt == 0) { + xhci_mem_deinit(); /* release memory pool after the last bus left */ + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_glue_phytium_pcie.c b/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_glue_phytium_pcie.c new file mode 100644 index 000000000..4b9810895 --- /dev/null +++ b/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_glue_phytium_pcie.c @@ -0,0 +1,175 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +/***************************** Include Files *********************************/ +#include +#include + +#include "FreeRTOS.h" +#include "task.h" + +#include "sdkconfig.h" + +#include "fassert.h" +#include "finterrupt.h" + +#include "usbh_core.h" + +#if defined(CONFIG_CHERRY_USB_PORT_XHCI_PCIE) + +#include "fpcie_ecam.h" +#include "fpcie_ecam_common.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/************************** Variable Definitions *****************************/ +static FPcieEcam pcie_device; + +static void usb_hc_xhci_pcie_interrupt_handler(void *param) +{ + extern void USBH_IRQHandler(uint8_t busid); + USBH_IRQHandler((uint8_t)(uintptr_t)0); +} + +static void usb_hc_pcie_intx_init(FPcieEcam *instance_p) +{ + u32 cpu_id; + u32 irq_num = FPCIE_ECAM_INTA_IRQ_NUM; + u32 irq_priority = 13U; + + (void)GetCpuId(&cpu_id); + USB_LOG_DBG("interrupt num: %d", irq_num); + (void)InterruptSetTargetCpus(irq_num, cpu_id); + + InterruptSetPriority(irq_num, irq_priority); + + /* register intr callback */ + InterruptInstall(irq_num, + FPcieEcamIntxIrqHandler, + &pcie_device, + NULL); + + /* enable irq */ + InterruptUmask(irq_num); +} + +static FError usb_hc_pcie_init(FPcieEcam *pcie_device) +{ + FError ret = FT_SUCCESS; + + ret = FPcieEcamCfgInitialize(pcie_device, FPcieEcamLookupConfig(FPCIE_ECAM_INSTANCE0), NULL); + if (FT_SUCCESS != ret) + { + return ret; + } + + USB_LOG_DBG("\n"); + USB_LOG_DBG(" PCI:\n"); + USB_LOG_DBG(" B:D:F VID:PID parent_BDF class_code\n"); + ret = FPcieEcamEnumerateBus(pcie_device, 0); + if (FT_SUCCESS != ret) + { + return ret; + } + + usb_hc_pcie_intx_init(pcie_device); /* register pcie_device intx handler */ + + return FT_SUCCESS; +} + +static FError usb_hc_pcie_install_irq(FPcieEcam *pcie_device, struct usbh_bus *usb, u8 bus, u8 device, u8 function) +{ + FError ret = FT_SUCCESS; + FPcieIntxFun intx_fun; + intx_fun.IntxCallBack = usb_hc_xhci_pcie_interrupt_handler; + intx_fun.args = usb; + intx_fun.bus = bus; + intx_fun.device = device; + intx_fun.function = function; + + ret = FPcieEcamIntxRegister(pcie_device, bus, device, function, &intx_fun); + if (FT_SUCCESS != ret) + { + USB_LOG_ERR("FPcieIntxRegiterIrqHandler failed.\n"); + return ret; + } + + return ret; +} + +unsigned long usb_hc_setup_xhci_pcie(struct usbh_bus *usb) +{ + FError ret = FT_SUCCESS; + s32 host; + u32 bdf; + u32 class; + u16 pci_command; + u8 bus,device,function; + u16 vid, did; + uintptr bar0_addr = 0; + uintptr bar1_addr = 0; + unsigned long usb_base = 0U; + const u32 class_code = FPCI_CLASS_SERIAL_USB_XHCI; /* sub class and base class definition */ + u32 config_data; + + ret = usb_hc_pcie_init(&pcie_device); + if (FT_SUCCESS != ret) + { + USB_LOG_ERR("FPcieInit failed.\n"); + return usb_base; + } + + /* find xhci host from pcie_device instance */ + for (host = 0; host < pcie_device.scans_bdf_count; host++) + { + bus = pcie_device.scans_bdf[host].bus; + device = pcie_device.scans_bdf[host].device; + function= pcie_device.scans_bdf[host].function; + + FPcieEcamReadConfigSpace(&pcie_device,bus,device,function,FPCIE_CCR_REV_CLASSID_REGS,&config_data); + class = config_data >> 8; + + if (class == class_code) + { + (void)FPcieEcamReadConfigSpace(&pcie_device,bus,device,function,FPCIE_CCR_ID_REG,&config_data); + vid = FPCIE_CCR_VENDOR_ID_MASK(config_data); + did = FPCIE_CCR_DEVICE_ID_MASK(config_data); + + USB_LOG_DBG("xHCI-PCI HOST found !!!, b.d.f = %x.%x.%x\n", bus, device, function); + FPcieEcamReadConfigSpace(&pcie_device,bus,device,function,FPCIE_CCR_BAR_ADDR0_REGS,(u32 *)&bar0_addr); + bar0_addr &= ~0xfff; + +#if defined(FAARCH64_USE) + FPcieEcamReadConfigSpace(&pcie_device,bus,device,function,FPCIE_CCR_BAR_ADDR1_REGS,(u32 *)&bar1_addr); +#endif + + USB_LOG_DBG("FSataPcieIntrInstall BarAddress %p:%p", bar1_addr, bar0_addr); + + if ((0x0 == bar0_addr) && (0x0 == bar1_addr)) + { + USB_LOG_ERR("Invalid Bar address"); + return usb_base; + } + + usb_hc_pcie_install_irq(&pcie_device, usb, bus, device, function); +#if defined(FAARCH64_USE) + usb_base = (bar1_addr << 32U) | bar0_addr; +#else + usb_base = bar0_addr; +#endif + USB_LOG_INFO("xHCI base address: 0x%lx", usb_base); + } + } + + return usb_base; +} +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_glue_phytium_plat.c b/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_glue_phytium_plat.c new file mode 100644 index 000000000..8671e0e13 --- /dev/null +++ b/src/lib/CherryUSB/port/xhci/phytium/freertos/usb_glue_phytium_plat.c @@ -0,0 +1,64 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +/***************************** Include Files *********************************/ +#include +#include + +#include "sdkconfig.h" + +#include "fassert.h" +#include "finterrupt.h" +#include "fcpu_info.h" +#include "fdebug.h" +#include "fcache.h" +#include "fmemory_pool.h" + +#include "usbh_core.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/************************** Variable Definitions *****************************/ +static void usb_hc_xhci_interrupt_handler(s32 vector, void *param) +{ + extern void USBH_IRQHandler(uint8_t busid); + USBH_IRQHandler((uint8_t)(uintptr_t)param); +} + +void usb_hc_setup_xhci_interrupt(u32 id) +{ + u32 cpu_id; + u32 irq_num = (id == FUSB3_ID_0) ? FUSB3_0_IRQ_NUM : FUSB3_1_IRQ_NUM; + u32 irq_priority = 13U; + + GetCpuId(&cpu_id); + InterruptSetTargetCpus(irq_num, cpu_id); + + InterruptSetPriority(irq_num, irq_priority); + + /* register intr callback */ + InterruptInstall(irq_num, + usb_hc_xhci_interrupt_handler, + (void *)(uintptr_t)id, + NULL); + + /* enable irq */ + InterruptUmask(irq_num); +} + +unsigned long usb_hc_get_register_base(uint32_t id) +{ + if (FUSB3_ID_0 == id) + return FUSB3_0_BASE_ADDR + FUSB3_XHCI_OFFSET; + else + return FUSB3_1_BASE_ADDR + FUSB3_XHCI_OFFSET; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/xhci/phytium/rt-thread/usb_config.h b/src/lib/CherryUSB/port/xhci/phytium/rt-thread/usb_config.h new file mode 100644 index 000000000..460d12410 --- /dev/null +++ b/src/lib/CherryUSB/port/xhci/phytium/rt-thread/usb_config.h @@ -0,0 +1,289 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +#include "rtthread.h" + +/* ================ USB common Configuration ================ */ + +#define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) + +void *xhci_mem_malloc(size_t align, size_t size); +void xhci_mem_free(void *ptr); + +#define XHCI_DCACHE_FLUSH (1 << 0) +#define XHCI_DCACHE_INVALIDATE (1 << 1) +void xhci_dcache_sync(void *ptr, size_t len, uint32_t flags); + +unsigned long usb_hc_get_register_base(uint32_t id); + +#define usb_malloc(size) xhci_mem_malloc(sizeof(int), size) +#define usb_free(ptr) xhci_mem_free(ptr) + +#ifndef CONFIG_USB_DBG_LEVEL +#if defined(CONFIG_LOG_ERROR) +#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR +#elif defined(CONFIG_LOG_WARN) +#define CONFIG_USB_DBG_LEVEL USB_DBG_WARNING +#elif defined(CONFIG_LOG_INFO) +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#elif defined(CONFIG_LOG_DEBUG) || defined(CONFIG_LOG_VERBOS) +#define CONFIG_USB_DBG_LEVEL USB_DBG_LOG +#else +#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR +#endif +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* data align size when use dma */ +#ifndef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +// #define CONFIG_USBDEV_SETUP_LOG_PRINT + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 8 +#define CONFIG_USBHOST_MAX_EXTHUBS 4 +#define CONFIG_USBHOST_MAX_EHPORTS 8 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 8 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 8192 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 0xffffffff +#endif + +#ifndef CONFIG_INPUT_MOUSE_WHEEL +#define CONFIG_INPUT_MOUSE_WHEEL +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 2 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 8 +#endif + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +// #define CONFIG_USB_DWC2_RXALL_FIFO_SIZE (1024 / 4) +// #define CONFIG_USB_DWC2_TX0_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX1_FIFO_SIZE (512 / 4) +// #define CONFIG_USB_DWC2_TX2_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX3_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX4_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX5_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX6_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX7_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX8_FIFO_SIZE (0 / 4) + +/* ---------------- MUSB Configuration ---------------- */ +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 2 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USBHOST_PIPE_NUM 10 +#endif + +/* ---------------- EHCI Configuration ---------------- */ + +#define CONFIG_USB_EHCI_HCCR_OFFSET (0x0) +#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 +#define CONFIG_USB_EHCI_QH_NUM CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USB_EHCI_QTD_NUM 3 +#define CONFIG_USB_EHCI_ITD_NUM 20 +// #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE +// #define CONFIG_USB_EHCI_CONFIGFLAG +// #define CONFIG_USB_EHCI_ISO +// #define CONFIG_USB_EHCI_WITH_OHCI + +/* ---------------- OHCI Configuration ---------------- */ +#define CONFIG_USB_OHCI_HCOR_OFFSET (0x0) + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +#ifndef CONFIG_USB_XHCI_ENABLE_SOFT_ISR +#define CONFIG_USB_XHCI_ENABLE_SOFT_ISR 0 +#endif + +#endif diff --git a/src/lib/CherryUSB/port/xhci/phytium/rt-thread/usb_glue_phytium.c b/src/lib/CherryUSB/port/xhci/phytium/rt-thread/usb_glue_phytium.c new file mode 100644 index 000000000..1f72f313b --- /dev/null +++ b/src/lib/CherryUSB/port/xhci/phytium/rt-thread/usb_glue_phytium.c @@ -0,0 +1,65 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +#include "rtthread.h" +#include "usbh_core.h" + +#include "usb_config.h" + +void usb_hc_setup_xhci_interrupt(uint32_t id); +void usb_hc_revoke_xhci_interrupt(uint32_t id); + +void *xhci_mem_malloc(size_t align, size_t size) +{ + void *result = rt_malloc_align(size, align); + + if (result) + { + memset(result, 0U, size); + } + + return result; +} + +void xhci_mem_free(void *ptr) +{ + if (NULL != ptr) + { + rt_free(ptr); + } +} + +void xhci_dcache_sync(void *ptr, size_t len, uint32_t flags) +{ + if (flags & XHCI_DCACHE_FLUSH) + { + rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, ptr, len); + } + else if (flags & XHCI_DCACHE_INVALIDATE) + { + rt_hw_cpu_dcache_ops(RT_HW_CACHE_INVALIDATE, ptr, len); + } +} + +void usb_assert(const char *filename, int linenum) +{ + rt_assert_handler("", filename, linenum); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + /* platform XHCI controller */ + usb_hc_setup_xhci_interrupt(bus->busid); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + usb_hc_revoke_xhci_interrupt(bus->busid); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/port/xhci/phytium/rt-thread/usb_glue_phytium_plat.c b/src/lib/CherryUSB/port/xhci/phytium/rt-thread/usb_glue_phytium_plat.c new file mode 100644 index 000000000..5847eefc8 --- /dev/null +++ b/src/lib/CherryUSB/port/xhci/phytium/rt-thread/usb_glue_phytium_plat.c @@ -0,0 +1,49 @@ +/* + * Copyright : (C) 2024 Phytium Information Technology, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Modify History: + * Ver   Who        Date         Changes + * ----- ------     --------    -------------------------------------- + * 1.0 zhugengyu 2024/6/26 first commit + */ +#include "rtthread.h" +#include "interrupt.h" + +#include "fparameters.h" + +void USBH_IRQHandler(uint8_t busid); + +static void usb_hc_xhci_interrupt_handler(int irqno, void *param) +{ + if (irqno == FUSB3_0_IRQ_NUM) { + USBH_IRQHandler(FUSB3_ID_0); + } else if (irqno == FUSB3_1_IRQ_NUM) { + USBH_IRQHandler(FUSB3_ID_1); + } +} + +void usb_hc_setup_xhci_interrupt(uint32_t id) +{ + uint32_t irq_num = (id == FUSB3_ID_0) ? FUSB3_0_IRQ_NUM : FUSB3_1_IRQ_NUM; + rt_hw_interrupt_set_priority(irq_num, 0xd0); + rt_hw_interrupt_install(irq_num, usb_hc_xhci_interrupt_handler, + NULL, "xhci"); + rt_hw_interrupt_umask(irq_num); +} + +void usb_hc_revoke_xhci_interrupt(uint32_t id) +{ + uint32_t irq_num = (id == FUSB3_ID_0) ? FUSB3_0_IRQ_NUM : FUSB3_1_IRQ_NUM; + + rt_hw_interrupt_mask(irq_num); +} + +unsigned long usb_hc_get_register_base(uint32_t id) +{ + if (FUSB3_ID_0 == id) + return FUSB3_0_BASE_ADDR + FUSB3_XHCI_OFFSET; + else + return FUSB3_1_BASE_ADDR + FUSB3_XHCI_OFFSET; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/tests/bouffalolab/CMakeLists.txt b/src/lib/CherryUSB/tests/bouffalolab/CMakeLists.txt new file mode 100644 index 000000000..7d56aaa95 --- /dev/null +++ b/src/lib/CherryUSB/tests/bouffalolab/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 3.15) + +include(proj.conf) + +find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE}) + +sdk_add_compile_definitions(-DCONFIG_USBHOST_PLATFORM_CDC_ECM) +sdk_add_compile_definitions(-DCONFIG_USBHOST_PLATFORM_CDC_NCM) +sdk_add_compile_definitions(-DCONFIG_USBHOST_PLATFORM_CDC_RNDIS) +sdk_add_compile_definitions(-DCONFIG_USBHOST_PLATFORM_ASIX) +sdk_add_compile_definitions(-DCONFIG_USBHOST_PLATFORM_RTL8152) +sdk_add_include_directories(inc) + +target_sources(app PRIVATE ../../demo/usb_host.c) + +set(CONFIG_CHERRYMP 1) +set(CONFIG_CHERRYUSB 1) +set(CONFIG_CHERRYUSB_DEVICE 1) +set(CONFIG_CHERRYUSB_HOST 1) + +set(CONFIG_CHERRYUSB_DEVICE_CDC_RNDIS 1) +set(CONFIG_CHERRYUSB_DEVICE_CDC_ECM 1) + +# add_subdirectory(src/cherryusb_hostuvcuac) +add_subdirectory(../.. cherryusb) + +# sdk_add_link_options(-uusbd_cdc_acm_init_intf) +# sdk_add_link_options(-uusbd_hid_init_intf) +# sdk_add_link_options(-uusbd_msc_init_intf) +# sdk_add_link_options(-uusbd_video_init_intf) +# sdk_add_link_options(-uusbd_audio_init_intf) +# sdk_add_link_options(-uusbd_cdc_ecm_init_intf) +# sdk_add_link_options(-uusbd_rndis_init_intf) +# sdk_add_link_options(-uusbd_initialize) +# sdk_add_link_options(-uusbd_desc_register) +# sdk_add_link_options(-uusbd_add_interface) +# sdk_add_link_options(-uusbd_add_endpoint) +# sdk_add_link_options(-uusbd_rndis_start_write) +# sdk_add_link_options(-uusbd_rndis_start_read) +# sdk_add_link_options(-uusbd_cdc_ecm_start_write) +# sdk_add_link_options(-uusbd_cdc_ecm_start_read) +# sdk_add_link_options(-uusbd_video_stream_start_write) +# sdk_add_link_options(-uusbd_video_stream_split_transfer) + +sdk_set_main_file(src/main.c) +project(cherryusb) diff --git a/src/lib/CherryUSB/tests/bouffalolab/Makefile b/src/lib/CherryUSB/tests/bouffalolab/Makefile new file mode 100644 index 000000000..c5b7d56d9 --- /dev/null +++ b/src/lib/CherryUSB/tests/bouffalolab/Makefile @@ -0,0 +1,13 @@ +SDK_DEMO_PATH ?= . +BL_SDK_BASE ?= /home/sakumisu/repo/bouffalolab/bouffalo_sdk_github + +export BL_SDK_BASE + +CHIP ?= bl616 +BOARD ?= bl616dk +CROSS_COMPILE = riscv64-unknown-elf- + +# add custom cmake definition +#cmake_definition+=-Dxxx=sss + +include $(BL_SDK_BASE)/project.build diff --git a/src/lib/CherryUSB/tests/bouffalolab/flash_prog_cfg.ini b/src/lib/CherryUSB/tests/bouffalolab/flash_prog_cfg.ini new file mode 100644 index 000000000..d0077a958 --- /dev/null +++ b/src/lib/CherryUSB/tests/bouffalolab/flash_prog_cfg.ini @@ -0,0 +1,14 @@ +[cfg] +# 0: no erase, 1:programmed section erase, 2: chip erase +erase = 1 +# skip mode set first para is skip addr, second para is skip len, multi-segment region with ; separated +skip_mode = 0x0, 0x0 +# 0: not use isp mode, #1: isp mode +boot2_isp_mode = 0 +pre_program = +pre_program_args = + +[FW] +filedir = ./build/build_out/cherryusb*_$(CHIPNAME).bin +address = 0x000000 + diff --git a/src/lib/CherryUSB/tests/bouffalolab/inc/FreeRTOSConfig.h b/src/lib/CherryUSB/tests/bouffalolab/inc/FreeRTOSConfig.h new file mode 100644 index 000000000..064b2b22d --- /dev/null +++ b/src/lib/CherryUSB/tests/bouffalolab/inc/FreeRTOSConfig.h @@ -0,0 +1,128 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ +#if defined(BL602) || defined(BL702) || defined(BL702L) +#define configMTIME_BASE_ADDRESS (0x02000000UL + 0xBFF8UL) +#define configMTIMECMP_BASE_ADDRESS (0x02000000UL + 0x4000UL) +#else +#if __riscv_xlen == 64 +#define configMTIME_BASE_ADDRESS (0) +#define configMTIMECMP_BASE_ADDRESS ((0xE4000000UL) + 0x4000UL) +#else +#define configMTIME_BASE_ADDRESS ((0xE0000000UL) + 0xBFF8UL) +#define configMTIMECMP_BASE_ADDRESS ((0xE0000000UL) + 0x4000UL) +#endif +#endif + +#define configSUPPORT_STATIC_ALLOCATION 1 +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ((uint32_t)(1 * 1000 * 1000)) +#define configTICK_RATE_HZ ((TickType_t)1000) +#define configMAX_PRIORITIES (32) +#define configMINIMAL_STACK_SIZE ((unsigned short)128) /* Only needs to be this high as some demo tasks also use this constant. In production only the idle task would use this. */ +#define configTOTAL_HEAP_SIZE ((size_t)24 * 1024) +#define configMAX_TASK_NAME_LEN (16) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 8 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_MALLOC_FAILED_HOOK 1 +#define configUSE_APPLICATION_TASK_TAG 1 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#define configUSE_TICKLESS_IDLE 0 +#define configUSE_POSIX_ERRNO 1 + +#define configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS 0 + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES (2) + +/* Software timer definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES - 1) +#define configTIMER_QUEUE_LENGTH 4 +#define configTIMER_TASK_STACK_DEPTH (512) +/* Task priorities. Allow these to be overridden. */ +#ifndef uartPRIMARY_PRIORITY +#define uartPRIMARY_PRIORITY (configMAX_PRIORITIES - 3) +#endif +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_xTaskAbortDelay 1 +#define INCLUDE_xTaskGetHandle 1 +#define INCLUDE_xSemaphoreGetMutexHolder 1 +/* Normal assert() semantics without relying on the provision of an assert.h +header file. */ +void vApplicationMallocFailedHook(void); +void vAssertCalled(void); + +#include + +#define configASSERT(x) \ + if ((x) == 0) { \ + printf("file [%s]\r\n", __FILE__); \ + printf("func [%s]\r\n", __FUNCTION__); \ + printf("line [%d]\r\n", __LINE__); \ + printf("%s\r\n", (const char *)(#x)); \ + vAssertCalled(); \ + } +#if (configUSE_TICKLESS_IDLE != 0) +void vApplicationSleep(uint32_t xExpectedIdleTime); +#define portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime) vApplicationSleep(xExpectedIdleTime) +#endif +// #define portUSING_MPU_WRAPPERS +#endif /* FREERTOS_CONFIG_H */ \ No newline at end of file diff --git a/src/lib/CherryUSB/tests/bouffalolab/inc/fatfs_conf_user.h b/src/lib/CherryUSB/tests/bouffalolab/inc/fatfs_conf_user.h new file mode 100644 index 000000000..a1addd774 --- /dev/null +++ b/src/lib/CherryUSB/tests/bouffalolab/inc/fatfs_conf_user.h @@ -0,0 +1,270 @@ +/*---------------------------------------------------------------------------/ +/ Configurations of FatFs Module +/---------------------------------------------------------------------------*/ + +/* User external configuration, User need to use this file as a template. +All configuration items must be included in the file */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_CONTINUOUS 1 +/* Read and write as much data as possible at one time, regardless of the cluster size */ + +#define FF_FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + +#define FF_FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: Basic functions are fully enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() +/ are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + +#define FF_USE_FIND 1 +/* This option switches filtered directory read functions, f_findfirst() and +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ + +#define FF_USE_MKFS 1 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + +#define FF_USE_FASTSEEK 1 +/* This option switches fast seek function. (0:Disable or 1:Enable) */ + +#define FF_USE_EXPAND 0 +/* This option switches f_expand function. (0:Disable or 1:Enable) */ + +#define FF_USE_CHMOD 0 +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). +/ (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */ + +#define FF_USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + +#define FF_USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) */ + +#define FF_USE_STRFUNC 0 +#define FF_PRINT_LLI 1 +#define FF_PRINT_FLOAT 1 +#define FF_STRF_ENCODE 3 +/* FF_USE_STRFUNC switches string functions, f_gets(), f_putc(), f_puts() and +/ f_printf(). +/ +/ 0: Disable. FF_PRINT_LLI, FF_PRINT_FLOAT and FF_STRF_ENCODE have no effect. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. +/ +/ FF_PRINT_LLI = 1 makes f_printf() support long long argument and FF_PRINT_FLOAT = 1/2 +/ makes f_printf() support floating point argument. These features want C99 or later. +/ When FF_LFN_UNICODE >= 1 with LFN enabled, string functions convert the character +/ encoding in it. FF_STRF_ENCODE selects assumption of character encoding ON THE FILE +/ to be read/written via those functions. +/ +/ 0: ANSI/OEM in current CP +/ 1: Unicode in UTF-16LE +/ 2: Unicode in UTF-16BE +/ 3: Unicode in UTF-8 +*/ + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define FF_CODE_PAGE 437 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect code page setting can cause a file open failure. +/ +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +/ 0 - Include all code pages above and configured by f_setcp() +*/ + +#define FF_USE_LFN 2 +#define FF_MAX_LFN 255 +/* The FF_USE_LFN switches the support for LFN (long file name). +/ +/ 0: Disable LFN. FF_MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ To enable the LFN, ffunicode.c needs to be added to the project. The LFN function +/ requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and +/ additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled. +/ The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can +/ be in range of 12 to 255. It is recommended to be set it 255 to fully support LFN +/ specification. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree() exemplified in ffsystem.c, need to be added to the project. */ + +#define FF_LFN_UNICODE 0 +/* This option switches the character encoding on the API when LFN is enabled. +/ +/ 0: ANSI/OEM in current CP (TCHAR = char) +/ 1: Unicode in UTF-16 (TCHAR = WCHAR) +/ 2: Unicode in UTF-8 (TCHAR = char) +/ 3: Unicode in UTF-32 (TCHAR = DWORD) +/ +/ Also behavior of string I/O functions will be affected by this option. +/ When LFN is not enabled, this option has no effect. */ + +#define FF_LFN_BUF 255 +#define FF_SFN_BUF 12 +/* This set of options defines size of file name members in the FILINFO structure +/ which is used to read out directory items. These values should be suffcient for +/ the file names to read. The maximum possible length of the read file name depends +/ on character encoding. When LFN is not enabled, these options have no effect. */ + +#define FF_FS_RPATH 0 +/* This option configures support for relative path. +/ +/ 0: Disable relative path and remove related functions. +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +*/ + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define FF_VOLUMES 5 +/* Number of volumes (logical drives) to be used. (1-10) */ + +#define FF_STR_VOLUME_ID 2 +#define FF_VOLUME_STRS "ram", "flash", "sd", "sd2", "usb" +/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings. +/ When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive +/ number in the path name. FF_VOLUME_STRS defines the volume ID strings for each +/ logical drives. Number of items must not be less than FF_VOLUMES. Valid +/ characters for the volume ID strings are A-Z, a-z and 0-9, however, they are +/ compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is +/ not defined, a user defined volume string table is needed as: +/ +/ const char* VolumeStr[FF_VOLUMES] = {"ram","flash","sd","usb",... +*/ + +#define FF_MULTI_PARTITION 0 +/* This option switches support for multiple volumes on the physical drive. +/ By default (0), each logical drive number is bound to the same physical drive +/ number and only an FAT volume found on the physical drive will be mounted. +/ When this function is enabled (1), each logical drive number can be bound to +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() +/ function will be available. */ + +#define FF_MIN_SS 512 +#define FF_MAX_SS 512 +/* This set of options configures the range of sector size to be supported. (512, +/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and +/ harddisk, but a larger value may be required for on-board flash memory and some +/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured +/ for variable sector size mode and disk_ioctl() function needs to implement +/ GET_SECTOR_SIZE command. */ + +#define FF_LBA64 0 +/* This option switches support for 64-bit LBA. (0:Disable or 1:Enable) +/ To enable the 64-bit LBA, also exFAT needs to be enabled. (FF_FS_EXFAT == 1) */ + +#define FF_MIN_GPT 0x10000000 +/* Minimum number of sectors to switch GPT as partitioning format in f_mkfs and +/ f_fdisk function. 0x100000000 max. This option has no effect when FF_LBA64 == 0. */ + +#define FF_USE_TRIM 0 +/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable) +/ To enable Trim function, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. +/ Instead of private sector buffer eliminated from the file object, common sector +/ buffer in the filesystem object (FATFS) is used for the file data transfer. */ + +#define FF_FS_EXFAT 0 +/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) +/ To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1) +/ Note that enabling exFAT discards ANSI C (C89) compatibility. */ + +#define FF_FS_NORTC 1 +#define FF_NORTC_MON 1 +#define FF_NORTC_MDAY 1 +#define FF_NORTC_YEAR 2022 +/* The option FF_FS_NORTC switches timestamp feature. If the system does not have +/ an RTC or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable the +/ timestamp feature. Every object modified by FatFs will have a fixed timestamp +/ defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time. +/ To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be +/ added to the project to read current time form real-time clock. FF_NORTC_MON, +/ FF_NORTC_MDAY and FF_NORTC_YEAR have no effect. +/ These options have no effect in read-only configuration (FF_FS_READONLY = 1). */ + +#define FF_FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at the first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + +#define FF_FS_LOCK 0 +/* The option FF_FS_LOCK switches file lock function to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when FF_FS_READONLY +/ is 1. +/ +/ 0: Disable file lock function. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock function. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock control is independent of re-entrancy. */ + +#define FF_FS_REENTRANT 0 +#define FF_FS_TIMEOUT 1000 +/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this featuer. +/ +/ 0: Disable re-entrancy. FF_FS_TIMEOUT have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_mutex_create(), ff_mutex_delete(), ff_mutex_take() and ff_mutex_give() +/ function, must be added to the project. Samples are available in ffsystem.c. +/ +/ The FF_FS_TIMEOUT defines timeout period in unit of O/S time tick. +*/ + +/*--- End of configuration options ---*/ diff --git a/src/lib/CherryUSB/tests/bouffalolab/inc/lwipopts_user.h b/src/lib/CherryUSB/tests/bouffalolab/inc/lwipopts_user.h new file mode 100644 index 000000000..3792fa937 --- /dev/null +++ b/src/lib/CherryUSB/tests/bouffalolab/inc/lwipopts_user.h @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef LWIPOPTS_H +#define LWIPOPTS_H + +#ifdef USE_LWIPOPTS_APP_H +#include "lwipopts_app.h" +#endif + +/** + * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain + * critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#define SYS_LIGHTWEIGHT_PROT 1 +#define IP_REASSEMBLY 0 +#define IP_FRAG 0 +#define ARP_QUEUEING 0 +#define NO_SYS 0 +#define LWIP_RAND rand + +#define LWIP_NETIF_HOSTNAME 0 +#define LWIP_TIMEVAL_PRIVATE 0 +#define LWIP_TIMERS 1 +#define LWIP_RAW 1 +#define LWIP_IPV4 1 +#define LWIP_IGMP 1 +#define LWIP_ICMP 1 +#define ICMP_TTL 64 +#define LWIP_TCP 1 +#define TCP_TTL 255 +#define LWIP_UDP 1 +#define UDP_TTL 255 +#define LWIP_DNS 1 + +/** + * LWIP_NETIF_API==1: Support netif api (in netifapi.c) + */ +#define LWIP_NETIF_API 1 +/** + * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) + */ +#define LWIP_NETCONN 1 +/** + * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) + */ +#define LWIP_SOCKET 1 + +/* ---------- Memory options ---------- */ +#define MEMP_MEM_MALLOC 0 + +/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which + lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 + byte alignment -> define MEM_ALIGNMENT to 2. */ +#ifndef MEM_ALIGNMENT +#define MEM_ALIGNMENT 64 +#endif + +/* MEM_SIZE: the size of the heap memory. If the application will send +a lot of data that needs to be copied, this should be set high. */ +#ifndef MEM_SIZE +#define MEM_SIZE (32 * 1024) +#endif + +/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application + sends a lot of data out of ROM (or other static memory), this + should be set high. */ +#ifndef MEMP_NUM_PBUF +#define MEMP_NUM_PBUF 100 +#endif + +/** + * MEMP_NUM_RAW_PCB: Number of raw connection PCBs + * (requires the LWIP_RAW option) + */ +#ifndef MEMP_NUM_RAW_PCB +#define MEMP_NUM_RAW_PCB 4 +#endif + +/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + per active UDP "connection". */ +#ifndef MEMP_NUM_UDP_PCB +#define MEMP_NUM_UDP_PCB 4 +#endif + +/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP + connections. */ +#ifndef MEMP_NUM_TCP_PCB +#define MEMP_NUM_TCP_PCB 4 +#endif + +/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP + connections. */ +#ifndef MEMP_NUM_TCP_PCB_LISTEN +#define MEMP_NUM_TCP_PCB_LISTEN 5 +#endif + +/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP + segments. */ +#ifndef MEMP_NUM_TCP_SEG +#define MEMP_NUM_TCP_SEG 40 +#endif + +/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active + timeouts. */ +#ifndef MEMP_NUM_SYS_TIMEOUT +#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL) +#endif + +/** + * MEMP_NUM_NETCONN: the number of struct netconns. + * (only needed if you use the sequential API, like api_lib.c) + */ +#ifndef MEMP_NUM_NETCONN +#define MEMP_NUM_NETCONN 4 +#endif + +/* ---------- Pbuf options ---------- */ +/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ +#ifndef PBUF_POOL_SIZE +#define PBUF_POOL_SIZE 20 +#endif + +/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */ +#ifndef PBUF_POOL_BUFSIZE +#define PBUF_POOL_BUFSIZE 1600 +#endif + +/* ---------- TCP options ---------- */ +/* Controls if TCP should queue segments that arrive out of + order. Define to 0 if your device is low on memory. */ +#ifndef TCP_QUEUE_OOSEQ +#define TCP_QUEUE_OOSEQ 0 +#endif + +/* TCP Maximum segment size. */ +#ifndef TCP_MSS +#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */ +#endif + +/* TCP sender buffer space (bytes). */ +#ifndef TCP_SND_BUF +#define TCP_SND_BUF (8 * TCP_MSS) +#endif + +/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least + as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */ +#ifndef TCP_SND_QUEUELEN +#define TCP_SND_QUEUELEN (4 * TCP_SND_BUF / TCP_MSS) +#endif + +/* TCP receive window. */ +#ifndef TCP_WND +#define TCP_WND (16 * TCP_MSS) +#endif + +/* ---------- DHCP options ---------- */ +/* Define LWIP_DHCP to 1 if you want DHCP configuration of + interfaces. DHCP is not implemented in lwIP 0.5.1, however, so + turning this on does currently not work. */ +#ifndef LWIP_DHCP +#define LWIP_DHCP 1 +#endif + +/* ---------- Statistics options ---------- */ +#ifndef LWIP_STATS +#define LWIP_STATS 0 +#endif + +#ifndef LWIP_PROVIDE_ERRNO +#define LWIP_PROVIDE_ERRNO 1 +#endif + +/* + ------------------------------------------------ + ---------- Network Interfaces options ---------- + ------------------------------------------------ +*/ +/** + * LWIP_SINGLE_NETIF==1: use a single netif only. This is the common case for + * small real-life targets. Some code like routing etc. can be left out. + */ +#ifndef LWIP_SINGLE_NETIF +#define LWIP_SINGLE_NETIF 1 +#endif + +/* ---------- link callback options ---------- */ +/* LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface + * whenever the link changes (i.e., link down) + */ +#ifndef LWIP_NETIF_LINK_CALLBACK +#define LWIP_NETIF_LINK_CALLBACK 1 +#endif + +/** + * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP *tries* to put all data + * to be sent into one single pbuf. This is for compatibility with DMA-enabled + * MACs that do not support scatter-gather. + * Beware that this might involve CPU-memcpy before transmitting that would not + * be needed without this flag! Use this only if you need to! + * + * ATTENTION: a driver should *NOT* rely on getting single pbufs but check TX + * pbufs for being in one piece. If not, @ref pbuf_clone can be used to get + * a single pbuf: + * if (p->next != NULL) { + * struct pbuf *q = pbuf_clone(PBUF_RAW, PBUF_RAM, p); + * if (q == NULL) { + * return ERR_MEM; + * } + * p = q; ATTENTION: do NOT free the old 'p' as the ref belongs to the caller! + * } + */ +#ifndef LWIP_NETIF_TX_SINGLE_PBUF +#define LWIP_NETIF_TX_SINGLE_PBUF 0 +#endif + +/* + -------------------------------------- + ---------- Checksum options ---------- + -------------------------------------- +*/ + +/* + * Some MCUs allow computing and verifying the IP, UDP, TCP and ICMP checksums by hardware: + * To use this feature let the following define uncommented. + * To disable it and process by CPU comment the the checksum. +*/ +#ifdef CHECKSUM_BY_HARDWARE +/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/ +#define CHECKSUM_GEN_IP 0 +/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/ +#define CHECKSUM_GEN_UDP 0 +/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/ +#define CHECKSUM_GEN_TCP 0 +/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/ +#define CHECKSUM_CHECK_IP 0 +/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/ +#define CHECKSUM_CHECK_UDP 0 +/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/ +#define CHECKSUM_CHECK_TCP 0 +/* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/ +#define CHECKSUM_GEN_ICMP 0 +#else +/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/ +#define CHECKSUM_GEN_IP 1 +/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/ +#define CHECKSUM_GEN_UDP 1 +/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/ +#define CHECKSUM_GEN_TCP 1 +/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/ +#define CHECKSUM_CHECK_IP 1 +/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/ +#define CHECKSUM_CHECK_UDP 1 +/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/ +#define CHECKSUM_CHECK_TCP 1 +/* CHECKSUM_CHECK_ICMP==1: Check checksums by software for incoming ICMP packets.*/ +#define CHECKSUM_GEN_ICMP 1 +#endif + +/* + ----------------------------------- + ---------- DEBUG options ---------- + ----------------------------------- +*/ +#ifdef LWIP_DEBUG + +#ifndef LWIP_DBG_MIN_LEVEL +#define LWIP_DBG_MIN_LEVEL 0 +#endif + +#ifndef PPP_DEBUG +#define PPP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef MEM_DEBUG +#define MEM_DEBUG LWIP_DBG_OFF +#endif + +#ifndef MEMP_DEBUG +#define MEMP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef PBUF_DEBUG +#define PBUF_DEBUG LWIP_DBG_OFF +#endif + +#ifndef API_LIB_DEBUG +#define API_LIB_DEBUG LWIP_DBG_OFF +#endif + +#ifndef API_MSG_DEBUG +#define API_MSG_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCPIP_DEBUG +#define TCPIP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef NETIF_DEBUG +#define NETIF_DEBUG LWIP_DBG_OFF +#endif + +#ifndef SOCKETS_DEBUG +#define SOCKETS_DEBUG LWIP_DBG_OFF +#endif + +#ifndef DNS_DEBUG +#define DNS_DEBUG LWIP_DBG_OFF +#endif + +#ifndef AUTOIP_DEBUG +#define AUTOIP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef DHCP_DEBUG +#define DHCP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef IP_DEBUG +#define IP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef IP_REASS_DEBUG +#define IP_REASS_DEBUG LWIP_DBG_OFF +#endif + +#ifndef ICMP_DEBUG +#define ICMP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef IGMP_DEBUG +#define IGMP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef UDP_DEBUG +#define UDP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_DEBUG +#define TCP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_INPUT_DEBUG +#define TCP_INPUT_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_OUTPUT_DEBUG +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_RTO_DEBUG +#define TCP_RTO_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_CWND_DEBUG +#define TCP_CWND_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_WND_DEBUG +#define TCP_WND_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_FR_DEBUG +#define TCP_FR_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_QLEN_DEBUG +#define TCP_QLEN_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_RST_DEBUG +#define TCP_RST_DEBUG LWIP_DBG_OFF +#endif + +#ifndef ETHARP_DEBUG +#define ETHARP_DEBUG LWIP_DBG_OFF +#endif + +#endif + +/* + --------------------------------- + ---------- OS options ---------- + --------------------------------- +*/ +#ifndef TCPIP_THREAD_NAME +#define TCPIP_THREAD_NAME "tcpip" +#endif + +#ifndef TCPIP_THREAD_STACKSIZE +#define TCPIP_THREAD_STACKSIZE 2048 +#endif + +#ifndef TCPIP_MBOX_SIZE +#define TCPIP_MBOX_SIZE 8 +#endif + +#ifndef DEFAULT_RAW_RECVMBOX_SIZE +#define DEFAULT_RAW_RECVMBOX_SIZE 50 +#endif + +#ifndef DEFAULT_UDP_RECVMBOX_SIZE +#define DEFAULT_UDP_RECVMBOX_SIZE 50 +#endif + +#ifndef DEFAULT_TCP_RECVMBOX_SIZE +#define DEFAULT_TCP_RECVMBOX_SIZE 50 +#endif + +#ifndef DEFAULT_ACCEPTMBOX_SIZE +#define DEFAULT_ACCEPTMBOX_SIZE 50 +#endif + +#ifndef DEFAULT_THREAD_STACKSIZE +#define DEFAULT_THREAD_STACKSIZE 500 +#endif + +#ifndef TCPIP_THREAD_PRIO +#define TCPIP_THREAD_PRIO 10 +#endif + +#define LWIP_COMPAT_MUTEX 0 +#define LWIP_TCPIP_CORE_LOCKING 1 + +#ifndef LWIP_TCPIP_CORE_LOCKING_INPUT +#define LWIP_TCPIP_CORE_LOCKING_INPUT 1 +#endif + +#ifndef LWIP_MEM_SECTION +#define LWIP_MEM_SECTION ".bss" +#endif + +// bouffalo patch +#define LWIP_DNS_SERVER 0 +#define LWIP_SUPPORT_CUSTOM_PBUF 1 + +#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[LWIP_MEM_ALIGN_BUFFER(size)] __attribute__((section(LWIP_MEM_SECTION))) + +#endif /* __LWIPOPTS_H__ */ diff --git a/src/lib/CherryUSB/tests/bouffalolab/inc/usb_config.h b/src/lib/CherryUSB/tests/bouffalolab/inc/usb_config.h new file mode 100644 index 000000000..d158eb925 --- /dev/null +++ b/src/lib/CherryUSB/tests/bouffalolab/inc/usb_config.h @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +/* ================ USB common Configuration ================ */ +#include "bflb_core.h" + +#ifdef __RTTHREAD__ +#include + +#define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) +#else +#define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) +#endif + +#ifndef CONFIG_USB_DBG_LEVEL +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +// #define CONFIG_USB_DCACHE_ENABLE + +/* data align size when use dma or use dcache */ +#ifdef CONFIG_USB_DCACHE_ENABLE +#define CONFIG_USB_ALIGN_SIZE 32 // 32 or 64 +#else +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* use usb_memcpy default for high performance but cost more flash memory. + * And, arm libc has a bug that memcpy() may cause data misalignment when the size is not a multiple of 4. +*/ +// #define CONFIG_USB_MEMCPY_DISABLE + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +/* enable advance desc register api */ +#define CONFIG_USBDEV_ADVANCE_DESC + +/* move ep0 setup handler from isr to thread */ +// #define CONFIG_USBDEV_EP0_THREAD + +#ifndef CONFIG_USBDEV_EP0_PRIO +#define CONFIG_USBDEV_EP0_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_EP0_STACKSIZE +#define CONFIG_USBDEV_EP0_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */ +// #define CONFIG_USBDEV_MSC_POLLING + +/* move msc read & write from isr to thread */ +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_BUFSIZE +#define CONFIG_USBDEV_MTP_MAX_BUFSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_OBJECTS +#define CONFIG_USBDEV_MTP_MAX_OBJECTS 256 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_PATHNAME +#define CONFIG_USBDEV_MTP_MAX_PATHNAME 256 +#endif + +#define CONFIG_USBDEV_MTP_THREAD + +#ifndef CONFIG_USBDEV_MTP_PRIO +#define CONFIG_USBDEV_MTP_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MTP_STACKSIZE +#define CONFIG_USBDEV_MTP_STACKSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP +#define CONFIG_USBDEV_CDC_ECM_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 4096 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 1 +#endif + +// #define CONFIG_USBDEV_SOF_ENABLE + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +/* enable dwc2 buffer dma mode for device + * in xxx32 chips, only pb14/pb15 can support dma mode, pa11/pa12 is not supported(only a few supports, but we ignore them) +*/ +// #define CONFIG_USB_DWC2_DMA_ENABLE + +/* ---------------- MUSB Configuration ---------------- */ +#define CONFIG_USB_MUSB_EP_NUM 8 +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 1 +#endif + +/* ---------------- EHCI Configuration ---------------- */ + +#define CONFIG_USB_EHCI_HCCR_OFFSET (0x0) +#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 +#define CONFIG_USB_EHCI_QH_NUM 10 +#define CONFIG_USB_EHCI_QTD_NUM (CONFIG_USB_EHCI_QH_NUM * 3) +#define CONFIG_USB_EHCI_ITD_NUM 4 +#define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE +// #define CONFIG_USB_EHCI_CONFIGFLAG +// #define CONFIG_USB_EHCI_ISO +// #define CONFIG_USB_EHCI_WITH_OHCI +// #define CONFIG_USB_EHCI_DESC_DCACHE_ENABLE + +/* ---------------- OHCI Configuration ---------------- */ +#define CONFIG_USB_OHCI_HCOR_OFFSET (0x0) +#define CONFIG_USB_OHCI_ED_NUM 10 +#define CONFIG_USB_OHCI_TD_NUM 3 +// #define CONFIG_USB_OHCI_DESC_DCACHE_ENABLE + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +/* ---------------- DWC2 Configuration ---------------- */ +// nothing to define + +/* ---------------- MUSB Configuration ---------------- */ +#define CONFIG_USB_MUSB_PIPE_NUM 8 +// #define CONFIG_USB_MUSB_SUNXI +// #define CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + +/* When your chip hardware supports high-speed and wants to initialize it in high-speed mode, + * the relevant IP will configure the internal or external high-speed PHY according to CONFIG_USB_HS. + * + * in xxx32 chips, only pb14/pb15 can support hs mode, pa11/pa12 is not supported(only a few supports, but we ignore them). +*/ +// #define CONFIG_USB_HS + +#ifndef usb_phyaddr2ramaddr +#define usb_phyaddr2ramaddr(addr) (addr) +#endif + +#ifndef usb_ramaddr2phyaddr +#define usb_ramaddr2phyaddr(addr) (addr) +#endif + +#define ATTR_FAST_RAM_SECTION ATTR_TCM_SECTION +#define CONFIG_USB_HS + +#endif diff --git a/src/lib/CherryUSB/tests/bouffalolab/proj.conf b/src/lib/CherryUSB/tests/bouffalolab/proj.conf new file mode 100644 index 000000000..0e5972315 --- /dev/null +++ b/src/lib/CherryUSB/tests/bouffalolab/proj.conf @@ -0,0 +1,16 @@ +set(CONFIG_FREERTOS 1) + +# do not use sdk cherryusb because its version is lower than master. + +#set(CONFIG_CHERRYUSB 1) +#set(CONFIG_CHERRYUSB_HOST 1) +#set(CONFIG_CHERRYUSB_HOST_ECM 1) + +set(CONFIG_PSRAM 1) +set(CONFIG_FATFS 1) +set(CONFIG_FATFS_USBH 1) + +set(CONFIG_LWIP 1) +set(CONFIG_PING 1) +set(CONFIG_IPERF 1) +set(CONFIG_SHELL 1) diff --git a/src/lib/CherryUSB/tests/bouffalolab/src/main.c b/src/lib/CherryUSB/tests/bouffalolab/src/main.c new file mode 100644 index 000000000..12201af8e --- /dev/null +++ b/src/lib/CherryUSB/tests/bouffalolab/src/main.c @@ -0,0 +1,158 @@ +#include +#include "semphr.h" +#include "usbh_core.h" +#include "bflb_uart.h" +#include "board.h" +#include "shell.h" +#ifdef CONFIG_USB_EHCI_ISO +#include "usbh_uvc_stream.h" +#include "usbh_uac_stream.h" +#endif +#include "lwip/tcpip.h" + +static struct bflb_device_s *uart0; + +extern void shell_init_with_task(struct bflb_device_s *shell); + +#ifdef CONFIG_USB_EHCI_ISO +static ATTR_NOINIT_PSRAM_SECTION USB_MEM_ALIGNX uint8_t frame_buffer1[640 * 480 * 2]; +static ATTR_NOINIT_PSRAM_SECTION USB_MEM_ALIGNX uint8_t frame_buffer2[640 * 480 * 2]; +static struct usbh_videoframe frame_pool[2]; + +static ATTR_NOINIT_PSRAM_SECTION USB_MEM_ALIGNX uint8_t frame_buffer[AUDIO_MIC_EP_MPS * 8]; +static struct usbh_audioframe frame_pool2[8]; + +void usbh_video_run(struct usbh_video *video_class) +{ + usbh_video_stream_start(640, 480, USBH_VIDEO_FORMAT_MJPEG); +} + +void usbh_video_stop(struct usbh_video *video_class) +{ + usbh_video_stream_stop(); +} + +void usbh_video_frame_callback(struct usbh_videoframe *frame) +{ + USB_LOG_RAW("frame buf:%p,frame len:%d\r\n", frame->frame_buf, frame->frame_size); +} +#endif + +int main(void) +{ + board_init(); + + uart0 = bflb_device_get_by_name("uart0"); + shell_init_with_task(uart0); + + /* Initialize the LwIP stack */ + tcpip_init(NULL, NULL); + + printf("Starting usb host task...\r\n"); +#ifdef CONFIG_USB_EHCI_ISO + extern void usbh_video_fps_init(void); + usbh_video_fps_init(); + frame_pool[0].frame_buf = frame_buffer1; + frame_pool[0].frame_bufsize = 640 * 480 * 2; + frame_pool[1].frame_buf = frame_buffer2; + frame_pool[1].frame_bufsize = 640 * 480 * 2; + + usbh_video_stream_init(5, frame_pool, 2); + + for (uint8_t i = 0; i < 8; i++) { + frame_pool2[i].frame_buf = frame_buffer + i * AUDIO_MIC_EP_MPS; + frame_pool2[i].frame_bufsize = AUDIO_MIC_EP_MPS; + } + + usbh_audio_mic_stream_init(5, frame_pool2, 8); +#endif + vTaskStartScheduler(); + + while (1) { + } +} + +int usbh_deinit(int argc, char **argv) +{ + printf("usbh_deinit\r\n"); + usbh_deinitialize(0); + return 0; +} +SHELL_CMD_EXPORT_ALIAS(usbh_deinit, usbh_deinit, usbh deinit); + +int usbh_init(int argc, char **argv) +{ + printf("usbh_init\r\n"); + usbh_initialize(0, 0x20072000); + return 0; +} + +SHELL_CMD_EXPORT_ALIAS(usbh_init, usbh_init, usbh init); + +SHELL_CMD_EXPORT_ALIAS(lsusb, lsusb, ls usb); + +// int uvcinit(int argc, char **argv) +// { +// video_init(0, 0x20072000); +// return 0; +// } +// SHELL_CMD_EXPORT_ALIAS(uvcinit, uvcinit, usbh init); + +// int uvcsend(int argc, char **argv) +// { +// extern void video_test(uint8_t busid); +// video_test(0); +// return 0; +// } +// SHELL_CMD_EXPORT_ALIAS(uvcsend, uvcsend, usbh init); + +#ifdef CONFIG_USB_EHCI_ISO +int usbh_uvc_start(int argc, char **argv) +{ + uint8_t type; + + if (argc < 2) { + USB_LOG_ERR("please input correct command: usbh_uvc_start type\r\n"); + USB_LOG_ERR("type 0:yuyv, type 1:mjpeg\r\n"); + return -1; + } + + type = atoi(argv[1]); + usbh_video_stream_start(640, 480, type); + return 0; +} + +SHELL_CMD_EXPORT_ALIAS(usbh_uvc_start, usbh_uvc_start, usbh_uvc_start); + +int usbh_uvc_stop(int argc, char **argv) +{ + usbh_video_stream_stop(); + return 0; +} + +SHELL_CMD_EXPORT_ALIAS(usbh_uvc_stop, usbh_uvc_stop, usbh_uvc_stop); + +int usbh_uac_start(int argc, char **argv) +{ + uint32_t freq; + + if (argc < 2) { + USB_LOG_ERR("please input correct command: usbh_uac_start freq\r\n"); + return -1; + } + + freq = atoi(argv[1]); + usbh_audio_mic_stream_start(freq); + return 0; +} + +SHELL_CMD_EXPORT_ALIAS(usbh_uac_start, usbh_uac_start, usbh_uac_start); + +int usbh_uac_stop(int argc, char **argv) +{ + usbh_audio_mic_stream_stop(); + return 0; +} + +SHELL_CMD_EXPORT_ALIAS(usbh_uac_stop, usbh_uac_stop, usbh_uac_stop); +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/tests/espressif/device/CMakeLists.txt b/src/lib/CherryUSB/tests/espressif/device/CMakeLists.txt new file mode 100644 index 000000000..81106a1fb --- /dev/null +++ b/src/lib/CherryUSB/tests/espressif/device/CMakeLists.txt @@ -0,0 +1,9 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +list(APPEND EXTRA_COMPONENT_DIRS "../../../../CherryUSB") + +project(cherryusb) diff --git a/src/lib/CherryUSB/tests/espressif/device/main/CMakeLists.txt b/src/lib/CherryUSB/tests/espressif/device/main/CMakeLists.txt new file mode 100644 index 000000000..c45ba3559 --- /dev/null +++ b/src/lib/CherryUSB/tests/espressif/device/main/CMakeLists.txt @@ -0,0 +1,4 @@ + +idf_component_register(SRCS "main.c" + INCLUDE_DIRS "." + WHOLE_ARCHIVE) diff --git a/src/lib/CherryUSB/tests/espressif/device/main/main.c b/src/lib/CherryUSB/tests/espressif/device/main/main.c new file mode 100644 index 000000000..5bac5dc7b --- /dev/null +++ b/src/lib/CherryUSB/tests/espressif/device/main/main.c @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include +#include +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "usbd_core.h" +#include "usbh_core.h" +#include "demo/cdc_acm_msc_template.c" + +extern void cdc_acm_msc_init(uint8_t busid, uintptr_t reg_base); + +void app_main(void) +{ + USB_LOG_INFO("Hello CherryUSB!\n"); + + cdc_acm_msc_init(0, 0x60080000); + while(1) + { + vTaskDelay(10); + } +} diff --git a/src/lib/CherryUSB/tests/espressif/device/sdkconfig.defaults b/src/lib/CherryUSB/tests/espressif/device/sdkconfig.defaults new file mode 100644 index 000000000..5b0ebb573 --- /dev/null +++ b/src/lib/CherryUSB/tests/espressif/device/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# +CONFIG_CHERRYUSB=y +CONFIG_CHERRYUSB_DEVICE=y +CONFIG_CHERRYUSB_DEVICE_CDC_ACM=y +CONFIG_CHERRYUSB_DEVICE_HID=y +CONFIG_CHERRYUSB_DEVICE_MSC=y diff --git a/src/lib/CherryUSB/tests/espressif/host/CMakeLists.txt b/src/lib/CherryUSB/tests/espressif/host/CMakeLists.txt new file mode 100644 index 000000000..81106a1fb --- /dev/null +++ b/src/lib/CherryUSB/tests/espressif/host/CMakeLists.txt @@ -0,0 +1,9 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +list(APPEND EXTRA_COMPONENT_DIRS "../../../../CherryUSB") + +project(cherryusb) diff --git a/src/lib/CherryUSB/tests/espressif/host/main/CMakeLists.txt b/src/lib/CherryUSB/tests/espressif/host/main/CMakeLists.txt new file mode 100644 index 000000000..c45ba3559 --- /dev/null +++ b/src/lib/CherryUSB/tests/espressif/host/main/CMakeLists.txt @@ -0,0 +1,4 @@ + +idf_component_register(SRCS "main.c" + INCLUDE_DIRS "." + WHOLE_ARCHIVE) diff --git a/src/lib/CherryUSB/tests/espressif/host/main/main.c b/src/lib/CherryUSB/tests/espressif/host/main/main.c new file mode 100644 index 000000000..5938c81f1 --- /dev/null +++ b/src/lib/CherryUSB/tests/espressif/host/main/main.c @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include +#include +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_netif.h" +#include "esp_event.h" +#include "esp_log.h" +#include "usbd_core.h" +#include "usbh_core.h" +#include "demo/usb_host.c" + +void app_main(void) +{ + USB_LOG_INFO("Hello CherryUSB!\n"); + + // Initialize TCP/IP network interface aka the esp-netif (should be called only once in application) + ESP_ERROR_CHECK(esp_netif_init()); + // Create default event loop that running in background + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + usbh_initialize(0, 0x60080000); + while(1) + { + vTaskDelay(10); + } +} diff --git a/src/lib/CherryUSB/tests/espressif/host/sdkconfig.defaults b/src/lib/CherryUSB/tests/espressif/host/sdkconfig.defaults new file mode 100644 index 000000000..f55e1ae5b --- /dev/null +++ b/src/lib/CherryUSB/tests/espressif/host/sdkconfig.defaults @@ -0,0 +1,19 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# +CONFIG_CHERRYUSB=y +CONFIG_CHERRYUSB_HOST=y +CONFIG_CHERRYUSB_HOST_CUSTOM=y +CONFIG_CHERRYUSB_HOST_CDC_ACM=y +CONFIG_CHERRYUSB_HOST_HID=y +CONFIG_CHERRYUSB_HOST_MSC=y +CONFIG_CHERRYUSB_HOST_CDC_ECM=y +CONFIG_CHERRYUSB_HOST_CDC_NCM=y +CONFIG_CHERRYUSB_HOST_CDC_RNDIS=y +CONFIG_CHERRYUSB_HOST_ASIX=y +CONFIG_CHERRYUSB_HOST_RTL8152=y +CONFIG_CHERRYUSB_HOST_CH34X=y +CONFIG_CHERRYUSB_HOST_CP210X=y +CONFIG_CHERRYUSB_HOST_FTDI=y +CONFIG_CHERRYUSB_HOST_PL2303=y +CONFIG_CHERRYUSB_HOST_VIDEO=y +CONFIG_CHERRYUSB_HOST_AUDIO=y diff --git a/src/lib/CherryUSB/tests/hpmicro/CMakeLists.txt b/src/lib/CherryUSB/tests/hpmicro/CMakeLists.txt new file mode 100644 index 000000000..c78a1bd57 --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/CMakeLists.txt @@ -0,0 +1,57 @@ +# Copyright (c) 2021 HPMicro +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.13) + +set(CONFIG_CHERRYSH 1) +set(CONFIG_CHERRYSH_INTERFACE "uart") +set(CONFIG_USB_DEVICE 1) + +set(CONFIG_FREERTOS 1) +set(CONFIG_LWIP 1) +set(CONFIG_LWIP_IPERF 1) +set(CONFIG_LWIP_STRERR 1) +set(CONFIG_LWIP_NETDB 1) +set(CONFIG_LWIP_SOCKET_API 1) + +set(CONFIG_HPM_PANEL 1) + +find_package(hpm-sdk REQUIRED HINTS $ENV{HPM_SDK_BASE}) +project(cherryusb) + +sdk_compile_definitions(-D__freertos_irq_stack_top=_stack) +sdk_compile_definitions(-DCONFIG_FREERTOS=1) +sdk_compile_definitions(-DUSE_NONVECTOR_MODE=1) +sdk_compile_definitions(-DDISABLE_IRQ_PREEMPTIVE=1) +sdk_compile_definitions(-DLWIP_TIMEVAL_PRIVATE=0) + +sdk_compile_definitions(-DCONFIG_USBHOST_PLATFORM_CDC_ECM) +sdk_compile_definitions(-DCONFIG_USBHOST_PLATFORM_CDC_NCM) +sdk_compile_definitions(-DCONFIG_USBHOST_PLATFORM_CDC_RNDIS) +sdk_compile_definitions(-DCONFIG_USBHOST_PLATFORM_ASIX) +sdk_compile_definitions(-DCONFIG_USBHOST_PLATFORM_RTL8152) + +# sdk_compile_definitions(-DCONFIG_USB_OTG_ENABLE) + +sdk_compile_options("-O2") + +sdk_inc(inc) +sdk_app_src(inc/arch/sys_arch.c) +sdk_app_src(src/main.c) +sdk_app_src(../../demo/usb_host.c) + +sdk_inc(src/iperf) +sdk_app_src(src/iperf/iperf.c src/iperf/iperf_cli.c src/iperf/utils_getopt.c src/ping.c) +sdk_app_src(src/cdc_acm_otg_template.c) + +set(CONFIG_CHERRYMP 1) +set(CONFIG_CHERRYUSB 1) +set(CONFIG_CHERRYUSB_DEVICE 1) +set(CONFIG_CHERRYUSB_HOST 1) + +# sdk_app_src(src/uvc2lcd.c) +# sdk_app_src(src/font24x48.c) +# add_subdirectory(src/cherryusb_hostuvcuac) +add_subdirectory(../.. cherryusb) + +generate_ses_project() diff --git a/src/lib/CherryUSB/tests/hpmicro/inc/FreeRTOSConfig.h b/src/lib/CherryUSB/tests/hpmicro/inc/FreeRTOSConfig.h new file mode 100644 index 000000000..89fd13a78 --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/inc/FreeRTOSConfig.h @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2022 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/* + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + */ + +#include "board.h" +#if (portasmHAS_MTIME == 0) +#define configMTIME_BASE_ADDRESS (0) +#define configMTIMECMP_BASE_ADDRESS (0) +#else +#define configMTIME_BASE_ADDRESS (HPM_MCHTMR_BASE) +#define configMTIMECMP_BASE_ADDRESS (HPM_MCHTMR_BASE + 8UL) +#endif + +/* When USE_SYSCALL_INTERRUPT_PRIORITY is set, interrupts whose priority is higher than configMAX_SYSCALL_INTERRUPT_PRIORITY + will not be delayed by anything FreeRTOS do. */ +#if defined (USE_SYSCALL_INTERRUPT_PRIORITY) && USE_SYSCALL_INTERRUPT_PRIORITY +#ifndef configMAX_SYSCALL_INTERRUPT_PRIORITY +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 +#endif +#endif + +#define configUSE_PREEMPTION 1 +#define configCPU_CLOCK_HZ ((uint32_t) 24000000) +#define configTICK_RATE_HZ ((TickType_t) 1000) +#define configMAX_PRIORITIES (32) +#define configMINIMAL_STACK_SIZE (256) +#define configMAX_TASK_NAME_LEN 16 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_APPLICATION_TASK_TAG 0 +#define configGENERATE_RUN_TIME_STATS 0 + +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_MUTEXES 1 + +/* Memory allocation definitions. */ +#define configSUPPORT_STATIC_ALLOCATION 1 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#ifndef configTOTAL_HEAP_SIZE +#define configTOTAL_HEAP_SIZE ((size_t) (64 * 1024)) +#endif + +/* Hook function definitions. */ +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 0 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_MALLOC_FAILED_HOOK 0 +#define configUSE_DAEMON_TASK_STARTUP_HOOK 0 + +/* Run time and task stats gathering definitions. */ +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_TRACE_FACILITY 1 +#define configUSE_STATS_FORMATTING_FUNCTIONS 0 + +/* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xTaskAbortDelay 1 +#define INCLUDE_xTaskGetHandle 1 +#define INCLUDE_xSemaphoreGetMutexHolder 1 + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES 2 + +/* Software timer definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES - 1) +#define configTIMER_QUEUE_LENGTH 4 +#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE) + +/* Task priorities.*/ +#ifndef uartPRIMARY_PRIORITY + #define uartPRIMARY_PRIORITY (configMAX_PRIORITIES - 3) +#endif + +/* Normal assert() semantics without relying on the provision of an assert.h header file. */ +#define configASSERT(x) if ((x) == 0) { taskDISABLE_INTERRUPTS(); __asm volatile("ebreak"); for (;;); } + +/* + * The size of the global output buffer that is available for use when there + * are multiple command interpreters running at once (for example, one on a UART + * and one on TCP/IP). This is done to prevent an output buffer being defined by + * each implementation - which would waste RAM. In this case, there is only one + * command interpreter running. + */ + +/* + * The buffer into which output generated by FreeRTOS+CLI is placed. This must + * be at least big enough to contain the output of the task-stats command, as the + * example implementation does not include buffer overlow checking. + */ +#define configCOMMAND_INT_MAX_OUTPUT_SIZE 2096 +#define configINCLUDE_QUERY_HEAP_COMMAND 1 + +/* This file is included from assembler files - make sure C code is not included in assembler files. */ +#ifndef __ASSEMBLER__ + void vAssertCalled(const char *pcFile, unsigned long ulLine); + void vConfigureTickInterrupt(void); + void vClearTickInterrupt(void); + void vPreSleepProcessing(unsigned long uxExpectedIdleTime); + void vPostSleepProcessing(unsigned long uxExpectedIdleTime); +#endif /* __ASSEMBLER__ */ + +/****** Hardware/compiler specific settings. *******/ +/* + * The application must provide a function that configures a peripheral to + * create the FreeRTOS tick interrupt, then define configSETUP_TICK_INTERRUPT() + * in FreeRTOSConfig.h to call the function. + */ +#define configSETUP_TICK_INTERRUPT() vConfigureTickInterrupt() +#define configCLEAR_TICK_INTERRUPT() vClearTickInterrupt() + +/* + * The configPRE_SLEEP_PROCESSING() and configPOST_SLEEP_PROCESSING() macros + * allow the application writer to add additional code before and after the MCU is + * placed into the low power state respectively. The empty implementations + * provided in this demo can be extended to save even more power. + */ +#define configPRE_SLEEP_PROCESSING(uxExpectedIdleTime) vPreSleepProcessing(uxExpectedIdleTime); +#define configPOST_SLEEP_PROCESSING(uxExpectedIdleTime) vPostSleepProcessing(uxExpectedIdleTime); + + +/* Compiler specifics. */ +#define fabs(x) __builtin_fabs(x) + +/* Enable Hardware Stack Protection and Recording mechanism. */ +#define configHSP_ENABLE 0 + +/* Record the highest address of stack. */ +#if (configHSP_ENABLE == 1 && configRECORD_STACK_HIGH_ADDRESS != 1) +#define configRECORD_STACK_HIGH_ADDRESS 1 +#endif + +#endif /* FREERTOS_CONFIG_H */ diff --git a/src/lib/CherryUSB/tests/hpmicro/inc/arch/cc.h b/src/lib/CherryUSB/tests/hpmicro/inc/arch/cc.h new file mode 100644 index 000000000..cca22bc88 --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/inc/arch/cc.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* + * Copyright (c) 2021-2024 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef __CC_H__ +#define __CC_H__ + +#include + +#define U16_F "hu" +#define S16_F "d" +#define X16_F "hx" +#define U32_F "u" +#define S32_F "d" +#define X32_F "x" +#define SZT_F "uz" + +/* define compiler specific symbols */ +#if defined (__ICCARM__) + +#define PACK_STRUCT_BEGIN +#define PACK_STRUCT_STRUCT +#define PACK_STRUCT_END +#define PACK_STRUCT_FIELD(x) x +#define PACK_STRUCT_USE_INCLUDES + +#elif defined (__CC_ARM) + +#define PACK_STRUCT_BEGIN __packed +#define PACK_STRUCT_STRUCT +#define PACK_STRUCT_END +#define PACK_STRUCT_FIELD(x) x + +#elif defined (__GNUC__) + +#include +#include + +#define PACK_STRUCT_BEGIN +#define PACK_STRUCT_STRUCT __attribute__ ((__packed__)) +#define PACK_STRUCT_END +#define PACK_STRUCT_FIELD(x) x + +#elif defined(__ICCRISCV__) + +#include +#define PACK_STRUCT_BEGIN +#define PACK_STRUCT_STRUCT __attribute__ ((__packed__)) +#define PACK_STRUCT_END +#define PACK_STRUCT_FIELD(x) x +typedef unsigned long clockid_t; + +#elif defined (__TASKING__) + +#define PACK_STRUCT_BEGIN +#define PACK_STRUCT_STRUCT +#define PACK_STRUCT_END +#define PACK_STRUCT_FIELD(x) x + +#endif + +#define LWIP_PLATFORM_ASSERT(x) printf(x) + +#endif /* __CC_H__ */ diff --git a/src/lib/CherryUSB/tests/hpmicro/inc/arch/sys_arch.c b/src/lib/CherryUSB/tests/hpmicro/inc/arch/sys_arch.c new file mode 100644 index 000000000..cb32e9caa --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/inc/arch/sys_arch.c @@ -0,0 +1,618 @@ +/* + * Copyright (c) 2017 Simon Goldschmidt + * 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +/* + * Copyright (c) 2021-2022 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/* lwIP includes. */ +#include "lwip/debug.h" +#include "lwip/def.h" +#include "lwip/sys.h" +#include "lwip/mem.h" +#include "lwip/stats.h" +#include "lwip/tcpip.h" + +#if !NO_SYS +#include "FreeRTOS.h" +#include "semphr.h" +#endif + +#if !NO_SYS +#include "sys_arch.h" +#endif + +int errno; +#if !NO_SYS +/** Set this to 1 if you want the stack size passed to sys_thread_new() to be + * interpreted as number of stack words (FreeRTOS-like). + * Default is that they are interpreted as byte count (lwIP-like). + */ +#ifndef LWIP_FREERTOS_THREAD_STACKSIZE_IS_STACKWORDS +#define LWIP_FREERTOS_THREAD_STACKSIZE_IS_STACKWORDS 0 +#endif + +/** Set this to 1 to use a mutex for SYS_ARCH_PROTECT() critical regions. + * Default is 0 and locks interrupts/scheduler for SYS_ARCH_PROTECT(). + */ +#ifndef LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX +#define LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX 0 +#endif + +/** Set this to 1 to include a sanity check that SYS_ARCH_PROTECT() and + * SYS_ARCH_UNPROTECT() are called matching. + */ +#ifndef LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK +#define LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK 0 +#endif + +/** Set this to 1 to let sys_mbox_free check that queues are empty when freed */ +#ifndef LWIP_FREERTOS_CHECK_QUEUE_EMPTY_ON_FREE +#define LWIP_FREERTOS_CHECK_QUEUE_EMPTY_ON_FREE 0 +#endif + +/** Set this to 1 to enable core locking check functions in this port. + * For this to work, you'll have to define LWIP_ASSERT_CORE_LOCKED() + * and LWIP_MARK_TCPIP_THREAD() correctly in your lwipopts.h! */ +#ifndef LWIP_FREERTOS_CHECK_CORE_LOCKING +#define LWIP_FREERTOS_CHECK_CORE_LOCKING 1 +#endif + +/** Set this to 0 to implement sys_now() yourself, e.g. using a hw timer. + * Default is 1, where FreeRTOS ticks are used to calculate back to ms. + */ +#ifndef LWIP_FREERTOS_SYS_NOW_FROM_FREERTOS +#define LWIP_FREERTOS_SYS_NOW_FROM_FREERTOS 1 +#endif + +#if !configSUPPORT_DYNAMIC_ALLOCATION +# error "lwIP FreeRTOS port requires configSUPPORT_DYNAMIC_ALLOCATION" +#endif +#if !INCLUDE_vTaskDelay +# error "lwIP FreeRTOS port requires INCLUDE_vTaskDelay" +#endif +#if !INCLUDE_vTaskSuspend +# error "lwIP FreeRTOS port requires INCLUDE_vTaskSuspend" +#endif +#if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX || !LWIP_COMPAT_MUTEX +#if !configUSE_MUTEXES +# error "lwIP FreeRTOS port requires configUSE_MUTEXES" +#endif +#endif + +#if SYS_LIGHTWEIGHT_PROT && LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX +static SemaphoreHandle_t sys_arch_protect_mutex; +#endif +#if SYS_LIGHTWEIGHT_PROT && LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK +static sys_prot_t sys_arch_protect_nesting; +#endif + +/* Initialize this module (see description in sys.h) */ +void +sys_init(void) +{ +#if SYS_LIGHTWEIGHT_PROT && LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX + /* initialize sys_arch_protect global mutex */ + sys_arch_protect_mutex = xSemaphoreCreateRecursiveMutex(); + LWIP_ASSERT("failed to create sys_arch_protect mutex", + sys_arch_protect_mutex != NULL); +#endif /* SYS_LIGHTWEIGHT_PROT && LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */ +} + +#if configUSE_16_BIT_TICKS == 1 +#error This port requires 32 bit ticks or timer overflow will fail +#endif + +#if LWIP_FREERTOS_SYS_NOW_FROM_FREERTOS +u32_t sys_now(void) +{ + return xTaskGetTickCount() * portTICK_PERIOD_MS; +} +#else +u32_t sys_now(void) +{ + return 0; +} +#endif + +u32_t sys_jiffies(void) +{ + return xTaskGetTickCount(); +} + +#if SYS_LIGHTWEIGHT_PROT + +sys_prot_t sys_arch_protect(void) +{ +#if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX + BaseType_t ret; + LWIP_ASSERT("sys_arch_protect_mutex != NULL", sys_arch_protect_mutex != NULL); + + ret = xSemaphoreTakeRecursive(sys_arch_protect_mutex, portMAX_DELAY); + LWIP_ASSERT("sys_arch_protect failed to take the mutex", ret == pdTRUE); + #else /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */ + taskENTER_CRITICAL(); + #endif /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */ + #if LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK + { + /* every nested call to sys_arch_protect() returns an increased number */ + sys_prot_t ret = sys_arch_protect_nesting; + sys_arch_protect_nesting++; + LWIP_ASSERT("sys_arch_protect overflow", sys_arch_protect_nesting > ret); + return ret; + } +#else + return 1; +#endif +} + +void sys_arch_unprotect(sys_prot_t pval) +{ +#if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX + BaseType_t ret; +#endif +#if LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK + LWIP_ASSERT("unexpected sys_arch_protect_nesting", sys_arch_protect_nesting > 0); + sys_arch_protect_nesting--; + LWIP_ASSERT("unexpected sys_arch_protect_nesting", sys_arch_protect_nesting == pval); +#endif + +#if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX + LWIP_ASSERT("sys_arch_protect_mutex != NULL", sys_arch_protect_mutex != NULL); + + ret = xSemaphoreGiveRecursive(sys_arch_protect_mutex); + LWIP_ASSERT("sys_arch_unprotect failed to give the mutex", ret == pdTRUE); +#else /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */ + taskEXIT_CRITICAL(); +#endif /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */ + LWIP_UNUSED_ARG(pval); +} + +#endif /* SYS_LIGHTWEIGHT_PROT */ + +void sys_arch_msleep(u32_t delay_ms) +{ + TickType_t delay_ticks = delay_ms / portTICK_RATE_MS; + vTaskDelay(delay_ticks); +} + +#if !LWIP_COMPAT_MUTEX + +/* Create a new mutex*/ +err_t sys_mutex_new(sys_mutex_t *mutex) +{ + LWIP_ASSERT("mutex != NULL", mutex != NULL); + + mutex->mut = xSemaphoreCreateRecursiveMutex(); + if (mutex->mut == NULL) { + SYS_STATS_INC(mutex.err); + return ERR_MEM; + } + SYS_STATS_INC_USED(mutex); + return ERR_OK; +} + +void sys_mutex_lock(sys_mutex_t *mutex) +{ + BaseType_t ret; + LWIP_ASSERT("mutex != NULL", mutex != NULL); + LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL); /* NOLINT */ + + ret = xSemaphoreTakeRecursive(mutex->mut, portMAX_DELAY); + LWIP_ASSERT("failed to take the mutex", ret == pdTRUE); +} + +void sys_mutex_unlock(sys_mutex_t *mutex) +{ + BaseType_t ret; + LWIP_ASSERT("mutex != NULL", mutex != NULL); + LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL); /* NOLINT */ + + ret = xSemaphoreGiveRecursive(mutex->mut); + LWIP_ASSERT("failed to give the mutex", ret == pdTRUE); +} + +void sys_mutex_free(sys_mutex_t *mutex) +{ + LWIP_ASSERT("mutex != NULL", mutex != NULL); + LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL); /* NOLINT */ + + SYS_STATS_DEC(mutex.used); + vSemaphoreDelete(mutex->mut); + mutex->mut = NULL; +} + +#endif /* !LWIP_COMPAT_MUTEX */ + +err_t sys_sem_new(sys_sem_t *sem, u8_t initial_count) +{ + LWIP_ASSERT("sem != NULL", sem != NULL); + LWIP_ASSERT("initial_count invalid (not 0 or 1)", + (initial_count == 0) || (initial_count == 1)); + + sem->sem = xSemaphoreCreateBinary(); + if (sem->sem == NULL) { + SYS_STATS_INC(sem.err); + return ERR_MEM; + } + SYS_STATS_INC_USED(sem); + + if (initial_count == 1) { + BaseType_t ret = xSemaphoreGive(sem->sem); + LWIP_ASSERT("sys_sem_new: initial give failed", ret == pdTRUE); + } + return ERR_OK; +} + +void sys_sem_signal(sys_sem_t *sem) +{ + BaseType_t ret; + LWIP_ASSERT("sem != NULL", sem != NULL); + LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL); /* NOLINT */ + + ret = xSemaphoreGive(sem->sem); + /* queue full is OK, this is a signal only... */ + LWIP_ASSERT("sys_sem_signal: sane return value", + (ret == pdTRUE) || (ret == errQUEUE_FULL)); +} + +u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout_ms) +{ + BaseType_t ret; + LWIP_ASSERT("sem != NULL", sem != NULL); + LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL); /* NOLINT */ + + if (!timeout_ms) { + /* wait infinite */ + ret = xSemaphoreTake(sem->sem, portMAX_DELAY); + LWIP_ASSERT("taking semaphore failed", ret == pdTRUE); + } else { + TickType_t timeout_ticks = timeout_ms / portTICK_RATE_MS; + ret = xSemaphoreTake(sem->sem, timeout_ticks); + if (ret == errQUEUE_EMPTY) { + /* timed out */ + return SYS_ARCH_TIMEOUT; + } + LWIP_ASSERT("taking semaphore failed", ret == pdTRUE); + } + + /* Old versions of lwIP required us to return the time waited. + This is not the case any more. Just returning != SYS_ARCH_TIMEOUT + here is enough. */ + return 1; +} + +void sys_sem_free(sys_sem_t *sem) +{ + LWIP_ASSERT("sem != NULL", sem != NULL); + LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL); /* NOLINT */ + + SYS_STATS_DEC(sem.used); + vSemaphoreDelete(sem->sem); + sem->sem = NULL; +} + +err_t sys_mbox_new(sys_mbox_t *mbox, int size) +{ + LWIP_ASSERT("mbox != NULL", mbox != NULL); /* NOLINT */ + LWIP_ASSERT("size > 0", size > 0); + + mbox->mbx = xQueueCreate((UBaseType_t)size, sizeof(void *)); + if (mbox->mbx == NULL) { + SYS_STATS_INC(mbox.err); + return ERR_MEM; + } + SYS_STATS_INC_USED(mbox); + return ERR_OK; +} + +void sys_mbox_post(sys_mbox_t *mbox, void *msg) +{ + BaseType_t ret; + LWIP_ASSERT("mbox != NULL", mbox != NULL); + LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL); /* NOLINT */ + + ret = xQueueSendToBack(mbox->mbx, &msg, portMAX_DELAY); + LWIP_ASSERT("mbox post failed", ret == pdTRUE); +} + +err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) +{ + BaseType_t ret; + LWIP_ASSERT("mbox != NULL", mbox != NULL); + LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL); /* NOLINT */ + + ret = xQueueSendToBack(mbox->mbx, &msg, 0); + if (ret == pdTRUE) { + return ERR_OK; + } else { + LWIP_ASSERT("mbox trypost failed", ret == errQUEUE_FULL); + SYS_STATS_INC(mbox.err); + return ERR_MEM; + } +} + +err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg) +{ + BaseType_t ret; + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + LWIP_ASSERT("mbox != NULL", mbox != NULL); + LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL); /* NOLINT */ + + ret = xQueueSendToBackFromISR(mbox->mbx, &msg, &xHigherPriorityTaskWoken); + if (ret == pdTRUE) { + if (xHigherPriorityTaskWoken == pdTRUE) { + return ERR_NEED_SCHED; + } + return ERR_OK; + } else { + LWIP_ASSERT("mbox trypost failed", ret == errQUEUE_FULL); + SYS_STATS_INC(mbox.err); + return ERR_MEM; + } +} + +u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout_ms) +{ + BaseType_t ret; + void *msg_dummy; + LWIP_ASSERT("mbox != NULL", mbox != NULL); + LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL); /* NOLINT */ + + if (!msg) { + msg = &msg_dummy; + } + + if (!timeout_ms) { + /* wait infinite */ + ret = xQueueReceive(mbox->mbx, &(*msg), portMAX_DELAY); + LWIP_ASSERT("mbox fetch failed", ret == pdTRUE); + } else { + TickType_t timeout_ticks = timeout_ms / portTICK_RATE_MS; + ret = xQueueReceive(mbox->mbx, &(*msg), timeout_ticks); + if (ret == errQUEUE_EMPTY) { + /* timed out */ + *msg = NULL; + return SYS_ARCH_TIMEOUT; + } + LWIP_ASSERT("mbox fetch failed", ret == pdTRUE); + } + + /* Old versions of lwIP required us to return the time waited. + This is not the case any more. Just returning != SYS_ARCH_TIMEOUT + here is enough. */ + return 1; +} + +u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) +{ + BaseType_t ret; + void *msg_dummy; + LWIP_ASSERT("mbox != NULL", mbox != NULL); + LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL); /* NOLINT */ + + if (!msg) { + msg = &msg_dummy; + } + + ret = xQueueReceive(mbox->mbx, &(*msg), 0); + if (ret == errQUEUE_EMPTY) { + *msg = NULL; + return SYS_MBOX_EMPTY; + } + LWIP_ASSERT("mbox fetch failed", ret == pdTRUE); + + /* Old versions of lwIP required us to return the time waited. + This is not the case any more. Just returning != SYS_ARCH_TIMEOUT + here is enough. */ + return 1; +} + +void sys_mbox_free(sys_mbox_t *mbox) +{ + LWIP_ASSERT("mbox != NULL", mbox != NULL); + LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL); /* NOLINT */ + +#if LWIP_FREERTOS_CHECK_QUEUE_EMPTY_ON_FREE + { + UBaseType_t msgs_waiting = uxQueueMessagesWaiting(mbox->mbx); + LWIP_ASSERT("mbox quence not empty", msgs_waiting == 0); + + if (msgs_waiting != 0) { + SYS_STATS_INC(mbox.err); + } + } +#endif + + vQueueDelete(mbox->mbx); + + SYS_STATS_DEC(mbox.used); +} + +sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio) +{ + TaskHandle_t rtos_task; + BaseType_t ret; + sys_thread_t lwip_thread; + size_t rtos_stacksize; + + LWIP_ASSERT("invalid stacksize", stacksize > 0); +#if LWIP_FREERTOS_THREAD_STACKSIZE_IS_STACKWORDS + rtos_stacksize = (size_t)stacksize; +#else + rtos_stacksize = (size_t)stacksize / sizeof(StackType_t); +#endif + + /* lwIP's lwip_thread_fn matches FreeRTOS' TaskFunction_t, so we can pass the + thread function without adaption here. */ + ret = xTaskCreate(thread, name, (configSTACK_DEPTH_TYPE)rtos_stacksize, arg, prio, &rtos_task); + LWIP_ASSERT("task creation failed", ret == pdTRUE); + + lwip_thread.thread_handle = rtos_task; + return lwip_thread; +} + +#if LWIP_NETCONN_SEM_PER_THREAD +#if configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 + +sys_sem_t *sys_arch_netconn_sem_get(void) +{ + void *ret; + TaskHandle_t task = xTaskGetCurrentTaskHandle(); + LWIP_ASSERT("task != NULL", task != NULL); + + ret = pvTaskGetThreadLocalStoragePointer(task, 0); + return ret; +} + +void sys_arch_netconn_sem_alloc(void) +{ + void *ret; + TaskHandle_t task = xTaskGetCurrentTaskHandle(); + LWIP_ASSERT("task != NULL", task != NULL); + + ret = pvTaskGetThreadLocalStoragePointer(task, 0); + if (ret == NULL) { + sys_sem_t *sem; + err_t err; + /* need to allocate the memory for this semaphore */ + sem = mem_malloc(sizeof(sys_sem_t)); + LWIP_ASSERT("sem != NULL", sem != NULL); + err = sys_sem_new(sem, 0); + LWIP_ASSERT("err == ERR_OK", err == ERR_OK); + LWIP_ASSERT("sem invalid", sys_sem_valid(sem)); + vTaskSetThreadLocalStoragePointer(task, 0, sem); + } +} + +void sys_arch_netconn_sem_free(void) +{ + void *ret; + TaskHandle_t task = xTaskGetCurrentTaskHandle(); + LWIP_ASSERT("task != NULL", task != NULL); + + ret = pvTaskGetThreadLocalStoragePointer(task, 0); + if (ret != NULL) { + sys_sem_t *sem = ret; + sys_sem_free(sem); + mem_free(sem); + vTaskSetThreadLocalStoragePointer(task, 0, NULL); + } +} + +#else /* configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 */ +#error LWIP_NETCONN_SEM_PER_THREAD needs configNUM_THREAD_LOCAL_STORAGE_POINTERS +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 */ + +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ + +#if LWIP_FREERTOS_CHECK_CORE_LOCKING +#if LWIP_TCPIP_CORE_LOCKING + +/** Flag the core lock held. A counter for recursive locks. */ +static u8_t lwip_core_lock_count; +static TaskHandle_t lwip_core_lock_holder_thread; + +void sys_lock_tcpip_core(void) +{ + sys_mutex_lock(&lock_tcpip_core); + if (lwip_core_lock_count == 0) { + lwip_core_lock_holder_thread = xTaskGetCurrentTaskHandle(); + } + lwip_core_lock_count++; +} + +void sys_unlock_tcpip_core(void) +{ + lwip_core_lock_count--; + if (lwip_core_lock_count == 0) { + lwip_core_lock_holder_thread = 0; + } + sys_mutex_unlock(&lock_tcpip_core); +} + +#endif /* LWIP_TCPIP_CORE_LOCKING */ + +#if !NO_SYS +static TaskHandle_t lwip_tcpip_thread; +#endif + +void sys_mark_tcpip_thread(void) +{ +#if !NO_SYS + lwip_tcpip_thread = xTaskGetCurrentTaskHandle(); +#endif +} + +void sys_check_core_locking(void) +{ + /* Embedded systems should check we are NOT in an interrupt context here */ + /* E.g. core Cortex-M3/M4 ports: + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + + Instead, we use more generic FreeRTOS functions here, which should fail from ISR: */ + taskENTER_CRITICAL(); + taskEXIT_CRITICAL(); + +#if !NO_SYS + if (lwip_tcpip_thread != 0) { + TaskHandle_t current_thread = xTaskGetCurrentTaskHandle(); + +#if LWIP_TCPIP_CORE_LOCKING + LWIP_ASSERT("Function called without core lock", + current_thread == lwip_core_lock_holder_thread && lwip_core_lock_count > 0); +#else /* LWIP_TCPIP_CORE_LOCKING */ + LWIP_ASSERT("Function called from wrong thread", current_thread == lwip_tcpip_thread); +#endif /* LWIP_TCPIP_CORE_LOCKING */ + } +#endif /* !NO_SYS */ +} + +#endif /* LWIP_FREERTOS_CHECK_CORE_LOCKING*/ + +#else +static uint32_t sys_tick = 0; + +void sys_timer_callback(void) +{ + sys_tick++; +} + +u32_t sys_now(void) +{ + return (u32_t)sys_tick; +} + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/tests/hpmicro/inc/arch/sys_arch.h b/src/lib/CherryUSB/tests/hpmicro/inc/arch/sys_arch.h new file mode 100644 index 000000000..2f805923a --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/inc/arch/sys_arch.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2017 Simon Goldschmidt + * 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmdit + * + */ + +/* + * Copyright (c) 2021-2023 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef LWIP_ARCH_SYS_ARCH_H +#define LWIP_ARCH_SYS_ARCH_H + +#include "lwip/opt.h" +#include "lwip/arch.h" + + +#if !NO_SYS +/** This is returned by _fromisr() sys functions to tell the outermost function + * that a higher priority task was woken and the scheduler needs to be invoked. + */ +#define ERR_NEED_SCHED 123 + +/* This port includes FreeRTOS headers in sys_arch.c only. + * FreeRTOS uses pointers as object types. We use wrapper structs instead of + * void pointers directly to get a tiny bit of type safety. + */ + +void sys_arch_msleep(u32_t delay_ms); +#define sys_msleep(ms) sys_arch_msleep(ms) + +#if SYS_LIGHTWEIGHT_PROT +typedef u32_t sys_prot_t; +#endif /* SYS_LIGHTWEIGHT_PROT */ + + +#if !LWIP_COMPAT_MUTEX +struct _sys_mut { + void *mut; +}; +typedef struct _sys_mut sys_mutex_t; +#define sys_mutex_valid_val(mutex) ((mutex).mut != NULL) +#define sys_mutex_valid(mutex) (((mutex) != NULL) && sys_mutex_valid_val(*(mutex))) +#define sys_mutex_set_invalid(mutex) ((mutex)->mut = NULL) +#endif /* !LWIP_COMPAT_MUTEX */ + +struct _sys_sem { + void *sem; +}; +typedef struct _sys_sem sys_sem_t; +#define sys_sem_valid_val(sema) ((sema).sem != NULL) +#define sys_sem_valid(sema) (((sema) != NULL) && sys_sem_valid_val(*(sema))) +#define sys_sem_set_invalid(sema) ((sema)->sem = NULL) + +struct _sys_mbox { + void *mbx; +}; +typedef struct _sys_mbox sys_mbox_t; +#define sys_mbox_valid_val(mbox) ((mbox).mbx != NULL) +#define sys_mbox_valid(mbox) (((mbox) != NULL) && sys_mbox_valid_val(*(mbox))) +#define sys_mbox_set_invalid(mbox) ((mbox)->mbx = NULL) + +struct _sys_thread { + void *thread_handle; +}; +typedef struct _sys_thread sys_thread_t; + +#if LWIP_NETCONN_SEM_PER_THREAD +sys_sem_t *sys_arch_netconn_sem_get(void); +void sys_arch_netconn_sem_alloc(void); +void sys_arch_netconn_sem_free(void); +#define LWIP_NETCONN_THREAD_SEM_GET() sys_arch_netconn_sem_get() +#define LWIP_NETCONN_THREAD_SEM_ALLOC() sys_arch_netconn_sem_alloc() +#define LWIP_NETCONN_THREAD_SEM_FREE() sys_arch_netconn_sem_free() +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ +#else +void sys_timer_callback(void); +#endif /* !NO_SYS */ +#endif /* LWIP_ARCH_SYS_ARCH_H */ diff --git a/src/lib/CherryUSB/tests/hpmicro/inc/lwipopts.h b/src/lib/CherryUSB/tests/hpmicro/inc/lwipopts.h new file mode 100644 index 000000000..09ec2fdc9 --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/inc/lwipopts.h @@ -0,0 +1,436 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef LWIPOPTS_H +#define LWIPOPTS_H + +#ifdef USE_LWIPOPTS_APP_H +#include "lwipopts_app.h" +#endif + +/** + * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain + * critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#define SYS_LIGHTWEIGHT_PROT 1 +#define IP_REASSEMBLY 0 +#define IP_FRAG 0 +#define ARP_QUEUEING 0 +#define NO_SYS 0 +#define LWIP_RAND rand + +#define LWIP_NETIF_HOSTNAME 0 +#define LWIP_TIMEVAL_PRIVATE 0 +#define LWIP_TIMERS 1 +#define LWIP_RAW 1 +#define LWIP_IPV4 1 +#define LWIP_IGMP 1 +#define LWIP_ICMP 1 +#define ICMP_TTL 64 +#define LWIP_TCP 1 +#define TCP_TTL 255 +#define LWIP_UDP 1 +#define UDP_TTL 255 +#define LWIP_DNS 1 + +/** + * LWIP_NETIF_API==1: Support netif api (in netifapi.c) + */ +#define LWIP_NETIF_API 1 +/** + * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) + */ +#define LWIP_NETCONN 1 +/** + * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) + */ +#define LWIP_SOCKET 1 + +/* ---------- Memory options ---------- */ +#define MEMP_MEM_MALLOC 0 + +/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which + lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 + byte alignment -> define MEM_ALIGNMENT to 2. */ +#ifndef MEM_ALIGNMENT +#define MEM_ALIGNMENT 64 +#endif + +/* MEM_SIZE: the size of the heap memory. If the application will send +a lot of data that needs to be copied, this should be set high. */ +#ifndef MEM_SIZE +#define MEM_SIZE (32 * 1024) +#endif + +/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application + sends a lot of data out of ROM (or other static memory), this + should be set high. */ +#ifndef MEMP_NUM_PBUF +#define MEMP_NUM_PBUF 100 +#endif + +/** + * MEMP_NUM_RAW_PCB: Number of raw connection PCBs + * (requires the LWIP_RAW option) + */ +#ifndef MEMP_NUM_RAW_PCB +#define MEMP_NUM_RAW_PCB 4 +#endif + +/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + per active UDP "connection". */ +#ifndef MEMP_NUM_UDP_PCB +#define MEMP_NUM_UDP_PCB 4 +#endif + +/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP + connections. */ +#ifndef MEMP_NUM_TCP_PCB +#define MEMP_NUM_TCP_PCB 4 +#endif + +/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP + connections. */ +#ifndef MEMP_NUM_TCP_PCB_LISTEN +#define MEMP_NUM_TCP_PCB_LISTEN 5 +#endif + +/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP + segments. */ +#ifndef MEMP_NUM_TCP_SEG +#define MEMP_NUM_TCP_SEG 40 +#endif + +/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active + timeouts. */ +#ifndef MEMP_NUM_SYS_TIMEOUT +#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL) +#endif + +/** + * MEMP_NUM_NETCONN: the number of struct netconns. + * (only needed if you use the sequential API, like api_lib.c) + */ +#ifndef MEMP_NUM_NETCONN +#define MEMP_NUM_NETCONN 4 +#endif + +/* ---------- Pbuf options ---------- */ +/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ +#ifndef PBUF_POOL_SIZE +#define PBUF_POOL_SIZE 20 +#endif + +/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */ +#ifndef PBUF_POOL_BUFSIZE +#define PBUF_POOL_BUFSIZE 1600 +#endif + +/* ---------- TCP options ---------- */ +/* Controls if TCP should queue segments that arrive out of + order. Define to 0 if your device is low on memory. */ +#ifndef TCP_QUEUE_OOSEQ +#define TCP_QUEUE_OOSEQ 0 +#endif + +/* TCP Maximum segment size. */ +#ifndef TCP_MSS +#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */ +#endif + +/* TCP sender buffer space (bytes). */ +#ifndef TCP_SND_BUF +#define TCP_SND_BUF (8 * TCP_MSS) +#endif + +/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least + as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */ +#ifndef TCP_SND_QUEUELEN +#define TCP_SND_QUEUELEN (4 * TCP_SND_BUF / TCP_MSS) +#endif + +/* TCP receive window. */ +#ifndef TCP_WND +#define TCP_WND (16 * TCP_MSS) +#endif + +/* ---------- DHCP options ---------- */ +/* Define LWIP_DHCP to 1 if you want DHCP configuration of + interfaces. DHCP is not implemented in lwIP 0.5.1, however, so + turning this on does currently not work. */ +#ifndef LWIP_DHCP +#define LWIP_DHCP 1 +#endif + +/* ---------- Statistics options ---------- */ +#ifndef LWIP_STATS +#define LWIP_STATS 0 +#endif + +#ifndef LWIP_PROVIDE_ERRNO +#define LWIP_PROVIDE_ERRNO 1 +#endif + +/* + ------------------------------------------------ + ---------- Network Interfaces options ---------- + ------------------------------------------------ +*/ +/** + * LWIP_SINGLE_NETIF==1: use a single netif only. This is the common case for + * small real-life targets. Some code like routing etc. can be left out. + */ +#ifndef LWIP_SINGLE_NETIF +#define LWIP_SINGLE_NETIF 1 +#endif + +/* ---------- link callback options ---------- */ +/* LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface + * whenever the link changes (i.e., link down) + */ +#ifndef LWIP_NETIF_LINK_CALLBACK +#define LWIP_NETIF_LINK_CALLBACK 1 +#endif + +/** + * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP *tries* to put all data + * to be sent into one single pbuf. This is for compatibility with DMA-enabled + * MACs that do not support scatter-gather. + * Beware that this might involve CPU-memcpy before transmitting that would not + * be needed without this flag! Use this only if you need to! + * + * ATTENTION: a driver should *NOT* rely on getting single pbufs but check TX + * pbufs for being in one piece. If not, @ref pbuf_clone can be used to get + * a single pbuf: + * if (p->next != NULL) { + * struct pbuf *q = pbuf_clone(PBUF_RAW, PBUF_RAM, p); + * if (q == NULL) { + * return ERR_MEM; + * } + * p = q; ATTENTION: do NOT free the old 'p' as the ref belongs to the caller! + * } + */ +#ifndef LWIP_NETIF_TX_SINGLE_PBUF +#define LWIP_NETIF_TX_SINGLE_PBUF 0 +#endif + +/* + -------------------------------------- + ---------- Checksum options ---------- + -------------------------------------- +*/ + +/* + * Some MCUs allow computing and verifying the IP, UDP, TCP and ICMP checksums by hardware: + * To use this feature let the following define uncommented. + * To disable it and process by CPU comment the the checksum. +*/ +#ifdef CHECKSUM_BY_HARDWARE +/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/ +#define CHECKSUM_GEN_IP 0 +/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/ +#define CHECKSUM_GEN_UDP 0 +/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/ +#define CHECKSUM_GEN_TCP 0 +/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/ +#define CHECKSUM_CHECK_IP 0 +/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/ +#define CHECKSUM_CHECK_UDP 0 +/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/ +#define CHECKSUM_CHECK_TCP 0 +/* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/ +#define CHECKSUM_GEN_ICMP 0 +#else +/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/ +#define CHECKSUM_GEN_IP 1 +/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/ +#define CHECKSUM_GEN_UDP 1 +/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/ +#define CHECKSUM_GEN_TCP 1 +/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/ +#define CHECKSUM_CHECK_IP 1 +/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/ +#define CHECKSUM_CHECK_UDP 1 +/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/ +#define CHECKSUM_CHECK_TCP 1 +/* CHECKSUM_CHECK_ICMP==1: Check checksums by software for incoming ICMP packets.*/ +#define CHECKSUM_GEN_ICMP 1 +#endif + +/* + ----------------------------------- + ---------- DEBUG options ---------- + ----------------------------------- +*/ +#ifdef LWIP_DEBUG + +#ifndef LWIP_DBG_MIN_LEVEL +#define LWIP_DBG_MIN_LEVEL 0 +#endif + +#ifndef PPP_DEBUG +#define PPP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef MEM_DEBUG +#define MEM_DEBUG LWIP_DBG_OFF +#endif + +#ifndef MEMP_DEBUG +#define MEMP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef PBUF_DEBUG +#define PBUF_DEBUG LWIP_DBG_OFF +#endif + +#ifndef API_LIB_DEBUG +#define API_LIB_DEBUG LWIP_DBG_OFF +#endif + +#ifndef API_MSG_DEBUG +#define API_MSG_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCPIP_DEBUG +#define TCPIP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef NETIF_DEBUG +#define NETIF_DEBUG LWIP_DBG_OFF +#endif + +#ifndef SOCKETS_DEBUG +#define SOCKETS_DEBUG LWIP_DBG_OFF +#endif + +#ifndef DNS_DEBUG +#define DNS_DEBUG LWIP_DBG_OFF +#endif + +#ifndef AUTOIP_DEBUG +#define AUTOIP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef DHCP_DEBUG +#define DHCP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef IP_DEBUG +#define IP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef IP_REASS_DEBUG +#define IP_REASS_DEBUG LWIP_DBG_OFF +#endif + +#ifndef ICMP_DEBUG +#define ICMP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef IGMP_DEBUG +#define IGMP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef UDP_DEBUG +#define UDP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_DEBUG +#define TCP_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_INPUT_DEBUG +#define TCP_INPUT_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_OUTPUT_DEBUG +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_RTO_DEBUG +#define TCP_RTO_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_CWND_DEBUG +#define TCP_CWND_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_WND_DEBUG +#define TCP_WND_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_FR_DEBUG +#define TCP_FR_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_QLEN_DEBUG +#define TCP_QLEN_DEBUG LWIP_DBG_OFF +#endif + +#ifndef TCP_RST_DEBUG +#define TCP_RST_DEBUG LWIP_DBG_OFF +#endif + +#ifndef ETHARP_DEBUG +#define ETHARP_DEBUG LWIP_DBG_OFF +#endif + +#endif + +/* + --------------------------------- + ---------- OS options ---------- + --------------------------------- +*/ +#ifndef TCPIP_THREAD_NAME +#define TCPIP_THREAD_NAME "tcpip" +#endif + +#ifndef TCPIP_THREAD_STACKSIZE +#define TCPIP_THREAD_STACKSIZE 2048 +#endif + +#ifndef TCPIP_MBOX_SIZE +#define TCPIP_MBOX_SIZE 8 +#endif + +#ifndef DEFAULT_RAW_RECVMBOX_SIZE +#define DEFAULT_RAW_RECVMBOX_SIZE 50 +#endif + +#ifndef DEFAULT_UDP_RECVMBOX_SIZE +#define DEFAULT_UDP_RECVMBOX_SIZE 50 +#endif + +#ifndef DEFAULT_TCP_RECVMBOX_SIZE +#define DEFAULT_TCP_RECVMBOX_SIZE 50 +#endif + +#ifndef DEFAULT_ACCEPTMBOX_SIZE +#define DEFAULT_ACCEPTMBOX_SIZE 50 +#endif + +#ifndef DEFAULT_THREAD_STACKSIZE +#define DEFAULT_THREAD_STACKSIZE 500 +#endif + +#ifndef TCPIP_THREAD_PRIO +#define TCPIP_THREAD_PRIO 10 +#endif + +#define LWIP_COMPAT_MUTEX 0 +#define LWIP_TCPIP_CORE_LOCKING 1 + +#ifndef LWIP_TCPIP_CORE_LOCKING_INPUT +#define LWIP_TCPIP_CORE_LOCKING_INPUT 1 +#endif + +#ifndef LWIP_MEM_SECTION +#define LWIP_MEM_SECTION ".bss" +#endif + +#endif /* __LWIPOPTS_H__ */ diff --git a/src/lib/CherryUSB/tests/hpmicro/inc/usb_config.h b/src/lib/CherryUSB/tests/hpmicro/inc/usb_config.h new file mode 100644 index 000000000..190677615 --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/inc/usb_config.h @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2022, sakumisu + * Copyright (c) 2022-2025, HPMicro + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +#include "board.h" + +/* ================ USB common Configuration ================ */ + +#ifdef __RTTHREAD__ +#include + +#define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) +#else +#define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) +#endif + +#ifndef CONFIG_USB_DBG_LEVEL +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +#if defined(CONFIG_USB_DEVICE_FS) || defined(CONFIG_USB_DEVICE_FORCE_FULL_SPEED) +#undef CONFIG_USB_HS +#else +#define CONFIG_USB_HS +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* #define CONFIG_USB_DCACHE_ENABLE */ + +/* data align size when use dma or use dcache */ +#ifdef CONFIG_USB_DCACHE_ENABLE +#define CONFIG_USB_ALIGN_SIZE HPM_L1C_CACHELINE_SIZE +#else +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* descriptor common define */ +#define USBD_VID 0x34B7 /* HPMicro VID */ +#define USBD_PID 0xFFFF +#define USBD_MAX_POWER 200 + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".fast_ram.non_init"))) + +/* use usb_memcpy default for high performance but cost more flash memory. + * And, arm libc has a bug that memcpy() may cause data misalignment when the size is not a multiple of 4. +*/ +/* #define CONFIG_USB_MEMCPY_DISABLE */ + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +/* #define CONFIG_USBDEV_SETUP_LOG_PRINT */ + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE + */ +/* #define CONFIG_USBDEV_EP0_INDATA_NO_COPY */ + +/* Check if the input descriptor is correct */ +/* #define CONFIG_USBDEV_DESC_CHECK */ + +/* Enable test mode */ +#define CONFIG_USBDEV_TEST_MODE + +/* enable advance desc register api */ +#define CONFIG_USBDEV_ADVANCE_DESC + +/* move ep0 setup handler from isr to thread */ +/* #define CONFIG_USBDEV_EP0_THREAD */ + +#ifndef CONFIG_USBDEV_EP0_PRIO +#define CONFIG_USBDEV_EP0_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_EP0_STACKSIZE +#define CONFIG_USBDEV_EP0_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */ +/* #define CONFIG_USBDEV_MSC_POLLING */ + +/* move msc read & write from isr to thread */ +/* #define CONFIG_USBDEV_MSC_THREAD */ + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_BUFSIZE +#define CONFIG_USBDEV_MTP_MAX_BUFSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_OBJECTS +#define CONFIG_USBDEV_MTP_MAX_OBJECTS 256 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_PATHNAME +#define CONFIG_USBDEV_MTP_MAX_PATHNAME 256 +#endif + +#define CONFIG_USBDEV_MTP_THREAD + +#ifndef CONFIG_USBDEV_MTP_PRIO +#define CONFIG_USBDEV_MTP_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MTP_STACKSIZE +#define CONFIG_USBDEV_MTP_STACKSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "HPMicro" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP +#define CONFIG_USBDEV_CDC_ECM_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +/* #define CONFIG_USBHOST_GET_STRING_DESC */ + +/* #define CONFIG_USBHOST_MSOS_ENABLE */ +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 4096 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (16 * 1024) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +/* #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG */ + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#define CONFIG_USBDEV_MAX_BUS USB_SOC_MAX_COUNT + +#ifndef CONFIG_HPM_USBD_BASE +#define CONFIG_HPM_USBD_BASE HPM_USB0_BASE +#endif +#ifndef CONFIG_HPM_USBD_IRQn +#define CONFIG_HPM_USBD_IRQn IRQn_USB0 +#endif + +/* ================ USB Host Port Configuration ==================*/ +#define CONFIG_USBHOST_MAX_BUS USB_SOC_MAX_COUNT + +#ifndef CONFIG_HPM_USBH_BASE +#define CONFIG_HPM_USBH_BASE HPM_USB0_BASE +#endif +#ifndef CONFIG_HPM_USBH_IRQn +#define CONFIG_HPM_USBH_IRQn IRQn_USB0 +#endif + +/* ================ EHCI Configuration ================ */ + +#define CONFIG_USB_EHCI_HPMICRO (1) +#define CONFIG_USB_EHCI_HCCR_OFFSET (0x100u) +#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 +#define CONFIG_USB_EHCI_QH_NUM 10 +#define CONFIG_USB_EHCI_QTD_NUM 64 + +/* ================ Addr Convert Configuration ==================*/ +#ifndef usb_phyaddr2ramaddr +#define usb_phyaddr2ramaddr(addr) core_local_mem_to_sys_address(BOARD_RUNNING_CORE, addr) +#endif + +#ifndef usb_ramaddr2phyaddr +#define usb_ramaddr2phyaddr(addr) sys_address_to_core_local_mem(BOARD_RUNNING_CORE, addr) +#endif + +#define ATTR_FAST_RAM_SECTION __attribute__((section(".fast"))) +// #define CONFIG_USB_EHCI_ISO + +#endif diff --git a/src/lib/CherryUSB/tests/hpmicro/src/cdc_acm_otg_template.c b/src/lib/CherryUSB/tests/hpmicro/src/cdc_acm_otg_template.c new file mode 100644 index 000000000..48915535b --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/cdc_acm_otg_template.c @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbotg_core.h" +#include "usbd_cdc_acm.h" + +/*!< endpoint address */ +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 + +#define USBD_LANGID_STRING 1033 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN) + +#ifdef CONFIG_USB_HS +#define CDC_MAX_MPS 512 +#else +#define CDC_MAX_MPS 64 +#endif + +#ifdef CONFIG_USBDEV_ADVANCE_DESC +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02) +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CDC DEMO", /* Product */ + "2022123456", /* Serial Number */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor cdc_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; +#else +/*!< global descriptor */ +static const uint8_t cdc_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'C', 0x00, /* wcChar10 */ + 'D', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '2', 0x00, /* wcChar3 */ + '1', 0x00, /* wcChar4 */ + '2', 0x00, /* wcChar5 */ + '3', 0x00, /* wcChar6 */ + '4', 0x00, /* wcChar7 */ + '5', 0x00, /* wcChar8 */ + '6', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +#endif + 0x00 +}; +#endif + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; /* 2048 is only for test speed , please use CDC_MAX_MPS for common*/ +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); +} + +void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +/*!< endpoint call back */ +struct usbd_endpoint cdc_out_ep = { + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out +}; + +struct usbd_endpoint cdc_in_ep = { + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +static struct usbd_interface intf0; +static struct usbd_interface intf1; + +void cdc_acm_otg_init(uint8_t busid, uintptr_t reg_base) +{ + const uint8_t data[10] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 }; + + memcpy(&write_buffer[0], data, 10); + memset(&write_buffer[10], 'a', 2038); + +#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_descriptor); +#else + usbd_desc_register(busid, cdc_descriptor); +#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + + usbotg_initialize(busid, reg_base, usbd_event_handler, NULL, USBOTG_MODE_DEVICE); +} + +volatile uint8_t dtr_enable = 0; + +void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) +{ + if (dtr) { + dtr_enable = 1; + } else { + dtr_enable = 0; + } +} + +void cdc_acm_data_send_with_dtr_test(uint8_t busid) +{ + if (dtr_enable) { + ep_tx_busy_flag = true; + usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048); + while (ep_tx_busy_flag) { + } + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/tests/hpmicro/src/font24x48.c b/src/lib/CherryUSB/tests/hpmicro/src/font24x48.c new file mode 100644 index 000000000..c11c609b8 --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/font24x48.c @@ -0,0 +1,1066 @@ +/* + * Copyright (c) 2022 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +const unsigned char nAsciiDot24x48[]= +{ +//0x0020( ) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0021(!) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00, +0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x1C,0x00,0x00,0x18,0x00,0x00, +0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0022(") +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x3C,0x1E,0x00,0x3C,0x1E,0x00,0x3C,0x1E, +0x00,0x18,0x0C,0x00,0x18,0x0C,0x00,0x18,0x0C,0x00,0x18,0x0C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0023(#) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x60,0x18,0x00,0x60,0x18,0x00,0x30,0x0C,0x00,0x30,0x0C, +0x00,0x30,0x0C,0x00,0x30,0x0C,0x00,0xFF,0x3F,0x00,0xFF,0x3F,0x00,0x18,0x06,0x00, +0x18,0x06,0x00,0x18,0x06,0x00,0x18,0x06,0x00,0xFF,0x3F,0x00,0xFF,0x3F,0x00,0x0C, +0x03,0x00,0x0C,0x03,0x00,0x8C,0x03,0x00,0x86,0x01,0x00,0x86,0x01,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0024($) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x80,0x00,0x00,0xE0,0x07,0x00,0x98,0x1E,0x00,0x8C,0x18,0x00,0x8E,0x18, +0x00,0x8E,0x10,0x00,0x9E,0x00,0x00,0xFE,0x00,0x00,0xFC,0x00,0x00,0xF8,0x03,0x00, +0xF0,0x07,0x00,0xC0,0x1F,0x00,0x80,0x1F,0x00,0x80,0x3E,0x00,0x80,0x3C,0x00,0x82, +0x38,0x00,0x86,0x38,0x00,0x86,0x18,0x00,0x9E,0x0C,0x00,0xF8,0x03,0x00,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0025(%) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x0C,0x98,0x01,0x06,0x9C,0x03,0x03,0x9C,0x03, +0x03,0x9C,0x83,0x01,0x9C,0x83,0x01,0x9C,0xC3,0x00,0x9C,0x63,0x00,0x98,0x61,0x00, +0xF0,0x30,0x3C,0x00,0x18,0x66,0x00,0x18,0xE7,0x00,0x0C,0xE7,0x00,0x0E,0xE7,0x00, +0x06,0xE7,0x00,0x03,0xE7,0x00,0x03,0xE7,0x80,0x01,0x66,0xC0,0x00,0x3C,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0026(&) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x73,0x00,0x80,0xE1,0x00,0xC0,0xE1, +0x00,0xC0,0xE1,0x00,0xC0,0x63,0x00,0xC0,0x3B,0x00,0xC0,0x07,0x00,0xC0,0x87,0x1F, +0xF0,0x0F,0x0F,0x18,0x1F,0x06,0x1C,0x3F,0x03,0x1E,0x3E,0x01,0x1E,0xFC,0x01,0x3E, +0xF8,0x00,0x7E,0xF0,0x33,0xFC,0xF8,0x1F,0xFC,0xCF,0x0F,0xF0,0x83,0x07,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0027(') +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00, +0x00,0x3C,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0028(() +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xC0,0x00,0x00,0x60,0x00,0x00,0x70,0x00, +0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00, +0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E, +0x00,0x00,0x1E,0x00,0x00,0x1C,0x00,0x00,0x1C,0x00,0x00,0x3C,0x00,0x00,0x38,0x00, +0x00,0x38,0x00,0x00,0x70,0x00,0x00,0x60,0x00,0x00,0xC0,0x00,0x00,0x00,0x01,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0029()) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x06,0x00,0x00,0x0C,0x00,0x00,0x1C,0x00, +0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00, +0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0, +0x00,0x00,0xF0,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x38,0x00, +0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0C,0x00,0x00,0x06,0x00,0x00,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x002A(*) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0xC0,0x01,0x00,0x98,0x0C, +0x00,0xB8,0x0E,0x00,0xF0,0x07,0x00,0xC0,0x00,0x00,0x60,0x03,0x00,0x70,0x07,0x00, +0x30,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x002B(+) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01, +0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00, +0xFE,0x7F,0x00,0xFE,0x7F,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80, +0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x002C(,) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x1C,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3C,0x00,0x00,0x30,0x00, +0x00,0x30,0x00,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x002D(-) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x002E(.) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x0C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x002F(/) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0xC0,0x00,0x00,0x60,0x00,0x00,0x60,0x00, +0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x18,0x00,0x00, +0x18,0x00,0x00,0x18,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x06, +0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x07,0x00,0x00,0x03,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0030(0) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x30,0x07,0x00,0x18,0x06,0x00,0x1C,0x0E, +0x00,0x1C,0x0E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00, +0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1C, +0x0E,0x00,0x1C,0x0E,0x00,0x18,0x06,0x00,0x30,0x03,0x00,0xE0,0x01,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0031(1) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0xE0,0x01,0x00,0xF8,0x01,0x00,0xFC,0x01, +0x00,0xE0,0x01,0x00,0xE0,0x01,0x00,0xE0,0x01,0x00,0xE0,0x01,0x00,0xE0,0x01,0x00, +0xE0,0x01,0x00,0xE0,0x01,0x00,0xE0,0x01,0x00,0xE0,0x01,0x00,0xE0,0x01,0x00,0xE0, +0x01,0x00,0xE0,0x01,0x00,0xE0,0x01,0x00,0xE0,0x03,0x00,0xFC,0x0F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0032(2) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xFC,0x03,0x00,0xFE,0x03,0x00,0xC6,0x07, +0x00,0x83,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x03,0x00,0x80,0x03,0x00, +0xC0,0x01,0x00,0xC0,0x00,0x00,0xE0,0x00,0x00,0x60,0x00,0x00,0x30,0x08,0x00,0x18, +0x08,0x00,0xF8,0x0F,0x00,0xFC,0x07,0x00,0xFE,0x07,0x00,0xFF,0x07,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0033(3) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0xF8,0x03,0x00,0xC4,0x07,0x00,0x82,0x07, +0x00,0x80,0x07,0x00,0x80,0x03,0x00,0xC0,0x01,0x00,0xE0,0x01,0x00,0xF0,0x03,0x00, +0xE0,0x07,0x00,0x80,0x0F,0x00,0x80,0x0F,0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0x00, +0x0F,0x00,0x07,0x07,0x00,0x8F,0x03,0x00,0xFF,0x01,0x00,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0034(4) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x80,0x07, +0x00,0xC0,0x07,0x00,0xA0,0x07,0x00,0xA0,0x07,0x00,0x90,0x07,0x00,0x88,0x07,0x00, +0x88,0x07,0x00,0x84,0x07,0x00,0x82,0x07,0x00,0xFE,0x1F,0x00,0xFE,0x1F,0x00,0xFE, +0x1F,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0035(5) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0xF0,0x1F,0x00,0xF8,0x0F,0x00,0xF8,0x0F, +0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x7C,0x00,0x00,0xFC,0x03,0x00,0xFE,0x07,0x00, +0xFE,0x0F,0x00,0xC0,0x1F,0x00,0x00,0x1E,0x00,0x00,0x1C,0x00,0x00,0x18,0x00,0x00, +0x18,0x00,0x0E,0x08,0x00,0x1E,0x08,0x00,0x7E,0x04,0x00,0xF8,0x03,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0036(6) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x80,0x07,0x00,0xC0,0x01,0x00,0x70,0x00, +0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x3C,0x00,0x00,0xFC,0x03,0x00,0x1C,0x0F,0x00, +0x1E,0x0F,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E, +0x1E,0x00,0x1C,0x0E,0x00,0x3C,0x0E,0x00,0x38,0x07,0x00,0xE0,0x03,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0037(7) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,0x00,0xFC,0x1F,0x00,0xFC,0x0F,0x00,0xFC,0x0F, +0x00,0x06,0x0C,0x00,0x02,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x03,0x00, +0x00,0x03,0x00,0x00,0x03,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0xC0, +0x00,0x00,0xC0,0x00,0x00,0xC0,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0038(8) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x00,0x38,0x0E,0x00,0x1C,0x1C,0x00,0x1E,0x1C, +0x00,0x1E,0x1C,0x00,0x3E,0x1C,0x00,0x7E,0x0E,0x00,0xFC,0x07,0x00,0xF8,0x03,0x00, +0xF0,0x07,0x00,0xF8,0x0F,0x00,0x9C,0x1F,0x00,0x0E,0x1F,0x00,0x0E,0x1E,0x00,0x0E, +0x1E,0x00,0x0E,0x1E,0x00,0x0C,0x0E,0x00,0x1C,0x07,0x00,0xF0,0x03,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0039(9) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0x00,0x38,0x07,0x00,0x1C,0x0F,0x00,0x1C,0x0E, +0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00, +0x3C,0x1E,0x00,0x3C,0x1E,0x00,0xF0,0x0F,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x80, +0x07,0x00,0x80,0x03,0x00,0xE0,0x01,0x00,0x78,0x00,0x00,0x0E,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x003A(:) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00, +0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x003B(;) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00, +0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x78,0x00,0x00,0x60,0x00, +0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x003C(<) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, +0x00,0x00,0xF0,0x00,0x00,0x7C,0x00,0x80,0x0F,0x00,0xE0,0x03,0x00,0x7C,0x00,0x00, +0x1E,0x00,0x00,0x7C,0x00,0x00,0xE0,0x03,0x00,0x80,0x0F,0x00,0x00,0x7C,0x00,0x00, +0xF0,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x003D(=) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x00,0xFE,0xFF,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x00,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x003E(>) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, +0x00,0x0F,0x00,0x00,0x3E,0x00,0x00,0xF0,0x01,0x00,0xC0,0x07,0x00,0x00,0x3E,0x00, +0x00,0x78,0x00,0x00,0x3E,0x00,0xC0,0x07,0x00,0xF0,0x01,0x00,0x3E,0x00,0x00,0x0F, +0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x003F(?) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x18,0x0F,0x00,0x1C,0x1E,0x00,0x3C,0x1E, +0x00,0x3C,0x1E,0x00,0x38,0x1E,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x07,0x00, +0x00,0x03,0x00,0x80,0x01,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0xC0,0x00,0x00,0xE0,0x01,0x00,0xE0,0x01,0x00,0xC0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0040(@) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x07,0x0E,0xC0,0x00,0x18,0x60,0x00, +0x20,0x10,0x00,0x60,0x18,0x00,0x40,0x08,0x70,0x8F,0x04,0x98,0x87,0x04,0x8E,0x87, +0x06,0x8F,0x87,0x02,0x87,0x87,0x82,0x87,0x83,0x82,0xC7,0x83,0xC2,0xC3,0x43,0xC2, +0xE3,0x41,0xC2,0xF3,0x21,0xC2,0xFB,0x11,0xC4,0xEF,0x09,0x84,0xC7,0x87,0x08,0x00, +0x80,0x18,0x00,0x40,0x30,0x00,0x20,0x60,0x00,0x18,0x80,0x01,0x06,0x00,0xFE,0x01, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0041(A) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x06,0x00,0x00,0x0E,0x00,0x00,0x0F, +0x00,0x00,0x1F,0x00,0x80,0x1E,0x00,0x80,0x1E,0x00,0x80,0x3C,0x00,0x40,0x3C,0x00, +0x40,0x7C,0x00,0x20,0x78,0x00,0x20,0x78,0x00,0x10,0xF0,0x00,0xF0,0xFF,0x00,0x10, +0xF0,0x01,0x08,0xE0,0x01,0x0C,0xE0,0x03,0x0C,0xC0,0x07,0x3F,0xF8,0x0F,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0042(B) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x00,0xF0,0xF0,0x00,0xF0,0xE0,0x01,0xF0,0xC0, +0x03,0xF0,0xC0,0x03,0xF0,0xC0,0x03,0xF0,0xC0,0x03,0xF0,0xE0,0x01,0xF0,0xF0,0x00, +0xF0,0x7F,0x00,0xF0,0xF0,0x01,0xF0,0xC0,0x03,0xF0,0xC0,0x07,0xF0,0xC0,0x07,0xF0, +0xC0,0x07,0xF0,0xC0,0x07,0xF0,0xE0,0x03,0xF0,0xF0,0x01,0xFE,0x7F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0043(C) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x02,0xE0,0xC1,0x03,0xF0,0x80,0x03,0x78,0x00, +0x03,0x78,0x00,0x02,0x3C,0x00,0x02,0x3C,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00, +0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x7C,0x00,0x00,0x7C, +0x00,0x00,0x78,0x00,0x02,0xF0,0x00,0x03,0xE0,0xC1,0x01,0x80,0x7F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0044(D) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x00,0x3C,0x7C,0x00,0x3C,0xF0,0x00,0x3C,0xF0, +0x01,0x3C,0xE0,0x03,0x3C,0xE0,0x03,0x3C,0xC0,0x07,0x3C,0xC0,0x07,0x3C,0xC0,0x07, +0x3C,0xC0,0x07,0x3C,0xC0,0x07,0x3C,0xC0,0x07,0x3C,0xC0,0x07,0x3C,0xC0,0x03,0x3C, +0xE0,0x03,0x3C,0xE0,0x01,0x3C,0xF0,0x00,0x3C,0x78,0x00,0xFF,0x0F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0045(E) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x01,0xF0,0xC0,0x01,0xF0,0x80,0x01,0xF0,0x00, +0x01,0xF0,0x00,0x01,0xF0,0x10,0x00,0xF0,0x10,0x00,0xF0,0x18,0x00,0xF0,0x1C,0x00, +0xF0,0x1F,0x00,0xF0,0x1C,0x00,0xF0,0x18,0x00,0xF0,0x10,0x00,0xF0,0x10,0x00,0xF0, +0x00,0x02,0xF0,0x00,0x02,0xF0,0x00,0x03,0xF0,0xC0,0x01,0xFE,0xFF,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0046(F) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x01,0xF0,0xC0,0x01,0xF0,0x80,0x01,0xF0,0x00, +0x01,0xF0,0x00,0x01,0xF0,0x10,0x00,0xF0,0x10,0x00,0xF0,0x18,0x00,0xF0,0x18,0x00, +0xF0,0x1F,0x00,0xF0,0x18,0x00,0xF0,0x18,0x00,0xF0,0x10,0x00,0xF0,0x10,0x00,0xF0, +0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xFE,0x07,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0047(G) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x04,0xE0,0xC1,0x07,0xF0,0x00,0x07,0x78,0x00, +0x06,0x7C,0x00,0x06,0x7C,0x00,0x04,0x3C,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00, +0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0xF0,0x3F,0x3E,0x80,0x0F,0x3C,0x80,0x07,0x7C, +0x80,0x07,0x78,0x80,0x07,0xF0,0x80,0x07,0xE0,0x83,0x07,0x00,0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0048(H) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0xF3,0x3F,0x78,0x80,0x07,0x78,0x80,0x07,0x78,0x80, +0x07,0x78,0x80,0x07,0x78,0x80,0x07,0x78,0x80,0x07,0x78,0x80,0x07,0x78,0x80,0x07, +0xF8,0xFF,0x07,0x78,0x80,0x07,0x78,0x80,0x07,0x78,0x80,0x07,0x78,0x80,0x07,0x78, +0x80,0x07,0x78,0x80,0x07,0x78,0x80,0x07,0x78,0x80,0x07,0xFF,0xF3,0x3F,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0049(I) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00, +0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00, +0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78, +0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0xFF,0x03,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x004A(J) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07, +0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00, +0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x86,0x07,0x00,0x8F, +0x07,0x00,0x8F,0x07,0x00,0x87,0x03,0x00,0xC6,0x01,0x00,0xF8,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x004B(K) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0x87,0x3F,0xF0,0x00,0x0E,0xF0,0x00,0x02,0xF0,0x00, +0x01,0xF0,0x80,0x00,0xF0,0x60,0x00,0xF0,0x10,0x00,0xF0,0x08,0x00,0xF0,0x0E,0x00, +0xF0,0x1F,0x00,0xF0,0x3E,0x00,0xF0,0x7C,0x00,0xF0,0xF8,0x00,0xF0,0xF0,0x01,0xF0, +0xF0,0x01,0xF0,0xE0,0x03,0xF0,0xC0,0x07,0xF0,0xC0,0x1F,0xFE,0xE7,0x7F,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x004C(L) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00, +0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00, +0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x02,0xF0,0x00,0x02,0xF0, +0x00,0x03,0xF0,0x00,0x03,0xF0,0x80,0x01,0xF0,0xC0,0x01,0xFE,0xFF,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x004D(M) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xF8,0xF8,0x00,0x7C,0xF8,0x00,0x7C,0xF8,0x01, +0x7A,0xE8,0x01,0x7A,0xE8,0x03,0x7A,0xC8,0x03,0x79,0xC8,0x03,0x79,0xC8,0x87,0x78, +0x88,0x87,0x78,0x88,0x8F,0x78,0x08,0x4F,0x78,0x08,0x5F,0x78,0x08,0x3E,0x78,0x08, +0x3E,0x78,0x08,0x3C,0x78,0x08,0x1C,0x78,0x08,0x18,0x78,0x7F,0x08,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x004E(N) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7E,0xE0,0x0F,0xF8,0x80,0x03,0xF8,0x01,0x01,0xE8,0x03, +0x01,0xC8,0x03,0x01,0xC8,0x07,0x01,0x88,0x0F,0x01,0x08,0x1F,0x01,0x08,0x1E,0x01, +0x08,0x3E,0x01,0x08,0x7C,0x01,0x08,0xF8,0x01,0x08,0xF0,0x01,0x08,0xF0,0x01,0x08, +0xE0,0x01,0x08,0xC0,0x01,0x08,0x80,0x01,0x1C,0x80,0x01,0x7F,0x00,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x004F(O) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x80,0x7F,0x00,0xE0,0xE1,0x01,0xF0,0xC0,0x03,0x78,0x80, +0x07,0x7C,0x80,0x0F,0x3C,0x00,0x0F,0x3E,0x00,0x1F,0x3E,0x00,0x1F,0x3E,0x00,0x1F, +0x3E,0x00,0x1F,0x3E,0x00,0x1F,0x3E,0x00,0x1F,0x3E,0x00,0x1F,0x3C,0x00,0x0F,0x7C, +0x80,0x0F,0x78,0x80,0x07,0xF0,0xC0,0x03,0xE0,0xE1,0x01,0x80,0x7F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0050(P) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0x1F,0x00,0x78,0x78,0x00,0x78,0xF0,0x00,0x78,0xE0, +0x01,0x78,0xE0,0x01,0x78,0xE0,0x01,0x78,0xE0,0x01,0x78,0xF0,0x00,0x78,0x78,0x00, +0xF8,0x1F,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78, +0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0xFF,0x03,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0051(Q) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0xE0,0xE1,0x01,0xF0,0xC0,0x03,0x78,0x80, +0x07,0x7C,0x80,0x0F,0x3C,0x00,0x0F,0x3E,0x00,0x1F,0x3E,0x00,0x1F,0x3E,0x00,0x1F, +0x3E,0x00,0x1F,0x3E,0x00,0x1F,0x3E,0x00,0x1F,0x3E,0x00,0x1F,0x3C,0x00,0x0F,0x7C, +0x80,0x0F,0x78,0x80,0x07,0xF0,0xC0,0x03,0xE0,0xE1,0x01,0x80,0x7F,0x00,0x00,0x3E, +0x00,0x00,0x3E,0x00,0x00,0x7C,0x00,0x00,0xF8,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0052(R) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0x78,0xF0,0x00,0x78,0xE0,0x01,0x78,0xC0, +0x03,0x78,0xC0,0x03,0x78,0xC0,0x03,0x78,0xC0,0x03,0x78,0xE0,0x01,0x78,0xF0,0x00, +0xF8,0x7F,0x00,0x78,0x3E,0x00,0x78,0x3C,0x00,0x78,0x7C,0x00,0x78,0xF8,0x00,0x78, +0xF0,0x01,0x78,0xE0,0x01,0x78,0xE0,0x03,0x78,0xC0,0x07,0xFF,0x83,0x0F,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0053(S) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xF0,0x23,0x00,0x38,0x3C,0x00,0x1C,0x38,0x00,0x1E,0x30, +0x00,0x1E,0x20,0x00,0x3E,0x20,0x00,0xFE,0x00,0x00,0xFC,0x01,0x00,0xF8,0x07,0x00, +0xF0,0x0F,0x00,0xC0,0x3F,0x00,0x00,0x3F,0x00,0x02,0x7E,0x00,0x02,0x7C,0x00,0x06, +0x78,0x00,0x06,0x78,0x00,0x0E,0x38,0x00,0x3E,0x1C,0x00,0xE2,0x07,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0054(T) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x01,0x8E,0xC7,0x01,0x86,0x87,0x01,0x82,0x07, +0x01,0x82,0x07,0x01,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00, +0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80, +0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0x80,0x07,0x00,0xF0,0x3F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0055(U) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0xE3,0x0F,0x78,0x80,0x03,0x78,0x00,0x01,0x78,0x00, +0x01,0x78,0x00,0x01,0x78,0x00,0x01,0x78,0x00,0x01,0x78,0x00,0x01,0x78,0x00,0x01, +0x78,0x00,0x01,0x78,0x00,0x01,0x78,0x00,0x01,0x78,0x00,0x01,0x78,0x00,0x01,0x78, +0x00,0x01,0x78,0x80,0x00,0xF0,0x80,0x00,0xE0,0x61,0x00,0x80,0x1F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0056(V) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0xC1,0x0F,0x7C,0x00,0x07,0x78,0x00,0x03,0x78,0x00, +0x01,0xF0,0x80,0x00,0xF0,0x80,0x00,0xF0,0x81,0x00,0xE0,0x41,0x00,0xE0,0x41,0x00, +0xC0,0x23,0x00,0xC0,0x23,0x00,0xC0,0x17,0x00,0x80,0x17,0x00,0x80,0x17,0x00,0x00, +0x0F,0x00,0x00,0x0F,0x00,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0057(W) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0xFC,0xC7,0x3E,0xF0,0x01,0x3C,0xF0,0x01,0x78,0xE0, +0x01,0x78,0xE0,0x83,0xF8,0xE0,0x83,0xF0,0xE0,0x83,0xF0,0xE0,0x47,0xF0,0x91,0x47, +0xE0,0x91,0x47,0xE0,0x11,0x2F,0xC0,0x0B,0x2F,0xC0,0x0B,0x2F,0xC0,0x07,0x1E,0x80, +0x07,0x1E,0x80,0x07,0x1E,0x80,0x03,0x0C,0x00,0x03,0x0C,0x00,0x03,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0058(X) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0xF1,0x03,0x7C,0xC0,0x00,0x78,0x40,0x00,0xF8,0x20, +0x00,0xF0,0x31,0x00,0xE0,0x11,0x00,0xE0,0x0B,0x00,0xC0,0x07,0x00,0x80,0x07,0x00, +0x80,0x0F,0x00,0x00,0x0F,0x00,0x80,0x1F,0x00,0x40,0x3E,0x00,0x40,0x3C,0x00,0x20, +0x7C,0x00,0x10,0xF8,0x00,0x08,0xF0,0x00,0x1C,0xF0,0x01,0x7F,0xFC,0x07,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0059(Y) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xC1,0x0F,0x7C,0x00,0x03,0x78,0x00,0x01,0xF0,0x00, +0x01,0xF0,0x81,0x00,0xE0,0x41,0x00,0xE0,0x43,0x00,0xC0,0x23,0x00,0xC0,0x27,0x00, +0x80,0x17,0x00,0x80,0x1F,0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0x00, +0x0F,0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0x00,0x0F,0x00,0xE0,0x7F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x005A(Z) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x00,0x1E,0x78,0x00,0x06,0x3C,0x00,0x06,0x3E, +0x00,0x02,0x1E,0x00,0x00,0x1F,0x00,0x00,0x0F,0x00,0x80,0x07,0x00,0xC0,0x07,0x00, +0xC0,0x03,0x00,0xE0,0x03,0x00,0xE0,0x01,0x00,0xF0,0x00,0x01,0xF8,0x00,0x01,0x78, +0x80,0x01,0x7C,0x80,0x01,0x3C,0xC0,0x01,0x1E,0xF0,0x00,0xFF,0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x005B([) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00, +0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00, +0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38, +0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00, +0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0xF8,0x01,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x005C(\) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x06,0x00, +0x00,0x06,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x18,0x00,0x00, +0x18,0x00,0x00,0x18,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x60, +0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0xE0,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x005D(]) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00, +0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00, +0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38, +0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00, +0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x3F,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x005E(^) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x03,0x00,0xC0,0x06,0x00,0xC0,0x06, +0x00,0x60,0x0C,0x00,0x60,0x0C,0x00,0x30,0x18,0x00,0x18,0x30,0x00,0x18,0x30,0x00, +0x0C,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x005F(_) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x00,0xFF,0x3F,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0060(`) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x18,0x00, +0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0061(a) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x00,0x0C,0x07,0x00,0x0E,0x0F,0x00, +0x1E,0x0F,0x00,0x8C,0x0F,0x00,0x40,0x0F,0x00,0x30,0x0F,0x00,0x18,0x0F,0x00,0x1C, +0x0F,0x00,0x1E,0x0F,0x00,0x9E,0x0F,0x00,0x7E,0x1F,0x00,0x3C,0x0E,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0062(b) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00, +0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x0F,0x00,0xFC,0x1F,0x00,0x7C,0x3C,0x00, +0x3C,0x78,0x00,0x3C,0x78,0x00,0x3C,0x78,0x00,0x3C,0x78,0x00,0x3C,0x78,0x00,0x3C, +0x78,0x00,0x3C,0x38,0x00,0x3C,0x38,0x00,0x7C,0x1C,0x00,0xCC,0x07,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0063(c) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,0xB8,0x07,0x00,0x1C,0x07,0x00, +0x1C,0x07,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x3E, +0x00,0x00,0x3E,0x00,0x00,0x7C,0x06,0x00,0xF8,0x03,0x00,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0064(d) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C, +0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0xF0,0x3C,0x00,0x38,0x3F,0x00,0x1C,0x3E,0x00, +0x1C,0x3C,0x00,0x1E,0x3C,0x00,0x1E,0x3C,0x00,0x1E,0x3C,0x00,0x1E,0x3C,0x00,0x1E, +0x3C,0x00,0x3E,0x3C,0x00,0x3C,0x3E,0x00,0xF8,0x7F,0x00,0xF0,0x1C,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0065(e) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xB8,0x03,0x00,0x1C,0x03,0x00, +0x1C,0x07,0x00,0x1E,0x07,0x00,0xFE,0x07,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x1E, +0x00,0x00,0x3E,0x04,0x00,0x7C,0x02,0x00,0xF8,0x01,0x00,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0066(f) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x38,0x07,0x00,0x3C,0x07,0x00,0x3C,0x00, +0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0xFF,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00, +0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C, +0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0067(g) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0xBC,0x1F,0x00,0x1E,0x07,0x00, +0x1E,0x0F,0x00,0x1E,0x0F,0x00,0x1E,0x0F,0x00,0x1C,0x0F,0x00,0xBC,0x07,0x00,0xF0, +0x01,0x00,0x0C,0x00,0x00,0x0E,0x00,0x00,0xFE,0x07,0x00,0xFE,0x0F,0x00,0xFC,0x1F, +0x00,0x0C,0x1C,0x00,0x06,0x18,0x00,0x06,0x08,0x00,0x0C,0x0C,0x00,0xF8,0x03,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0068(h) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00, +0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x0F,0x00,0xBC,0x1F,0x00,0x7C,0x3C,0x00, +0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C, +0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x7E,0x7E,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0069(i) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x18,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00, +0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C, +0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x006A(j) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x30,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00, +0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78, +0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00, +0x00,0x78,0x00,0x00,0x79,0x00,0x00,0x79,0x00,0x00,0x39,0x00,0x00,0x1F,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x006B(k) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00, +0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x3E,0x00,0x3C,0x1C,0x00,0x3C,0x0C,0x00, +0x3C,0x04,0x00,0x3C,0x02,0x00,0xBC,0x03,0x00,0xFC,0x07,0x00,0xBC,0x0F,0x00,0x3C, +0x0F,0x00,0x3C,0x1E,0x00,0x3C,0x3E,0x00,0x3C,0x7C,0x00,0x7E,0xFE,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x006C(l) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00, +0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00, +0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C, +0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x006D(m) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x87,0x03,0xBC,0xCF,0x07,0x7C,0x3E,0x0F, +0x3C,0x1E,0x0F,0x3C,0x1E,0x0F,0x3C,0x1E,0x0F,0x3C,0x1E,0x0F,0x3C,0x1E,0x0F,0x3C, +0x1E,0x0F,0x3C,0x1E,0x0F,0x3C,0x1E,0x0F,0x3C,0x1E,0x0F,0x7E,0xBF,0x1F,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x006E(n) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x0F,0x00,0xBC,0x1F,0x00,0x7C,0x3C,0x00, +0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C, +0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x7E,0x7E,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x006F(o) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0x00,0x38,0x07,0x00,0x1C,0x0E,0x00, +0x1C,0x0E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E,0x1E,0x00,0x1E, +0x1E,0x00,0x1C,0x0E,0x00,0x1C,0x0E,0x00,0x38,0x07,0x00,0xF0,0x03,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0070(p) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0x0F,0x00,0xFC,0x1F,0x00,0x7C,0x3C,0x00, +0x3C,0x38,0x00,0x3C,0x78,0x00,0x3C,0x78,0x00,0x3C,0x78,0x00,0x3C,0x78,0x00,0x3C, +0x78,0x00,0x3C,0x38,0x00,0x3C,0x38,0x00,0x7C,0x1C,0x00,0xBC,0x0F,0x00,0x3C,0x00, +0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x7E,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0071(q) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x33,0x00,0x38,0x3E,0x00,0x3C,0x3C,0x00, +0x1C,0x3C,0x00,0x1E,0x3C,0x00,0x1E,0x3C,0x00,0x1E,0x3C,0x00,0x1E,0x3C,0x00,0x1E, +0x3C,0x00,0x1E,0x3C,0x00,0x3C,0x3E,0x00,0xF8,0x3F,0x00,0xF0,0x3C,0x00,0x00,0x3C, +0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x7E,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0072(r) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x07,0x00,0xBC,0x0F,0x00,0x7C,0x0F,0x00, +0x3C,0x06,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C, +0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0073(s) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x01,0x00,0xCC,0x01,0x00,0x8E,0x01,0x00, +0x1E,0x01,0x00,0x3E,0x00,0x00,0xFC,0x00,0x00,0xFC,0x01,0x00,0xF0,0x03,0x00,0xE0, +0x03,0x00,0x82,0x03,0x00,0x86,0x03,0x00,0x8E,0x01,0x00,0xF2,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0074(t) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x30,0x00, +0x00,0x38,0x00,0x00,0x3E,0x00,0x00,0xFF,0x01,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00, +0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C, +0x00,0x00,0x3C,0x00,0x00,0x3C,0x01,0x00,0xFC,0x00,0x00,0x70,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0075(u) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x3E,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00, +0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3C,0x00,0x3C, +0x3C,0x00,0x3C,0x3C,0x00,0x3C,0x3E,0x00,0xF8,0x3F,0x00,0xF0,0x7C,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0076(v) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x3C,0x00,0x3E,0x18,0x00,0x3C,0x08,0x00, +0x3C,0x04,0x00,0x78,0x04,0x00,0x78,0x04,0x00,0xF0,0x02,0x00,0xF0,0x02,0x00,0xF0, +0x01,0x00,0xE0,0x01,0x00,0xE0,0x00,0x00,0xC0,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0077(w) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x07,0x1E,0x0F,0x03,0x3E,0x1E,0x01, +0x3C,0x1E,0x01,0x3C,0xBF,0x00,0x78,0xBD,0x00,0x78,0xBD,0x00,0xF8,0x7C,0x00,0xF0, +0x78,0x00,0xF0,0x78,0x00,0x70,0x78,0x00,0x60,0x30,0x00,0x60,0x30,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0078(x) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x1F,0x00,0x7C,0x0C,0x00,0x78,0x04,0x00, +0xF0,0x02,0x00,0xF0,0x01,0x00,0xE0,0x01,0x00,0xE0,0x03,0x00,0xC0,0x03,0x00,0xE0, +0x07,0x00,0xA0,0x07,0x00,0x10,0x0F,0x00,0x18,0x1F,0x00,0xBE,0x3F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x0079(y) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x3C,0x00,0x3E,0x18,0x00,0x3C,0x08,0x00, +0x7C,0x08,0x00,0x78,0x04,0x00,0xF8,0x04,0x00,0xF0,0x02,0x00,0xF0,0x03,0x00,0xE0, +0x03,0x00,0xE0,0x01,0x00,0xC0,0x01,0x00,0xC0,0x00,0x00,0x80,0x00,0x00,0x80,0x00, +0x00,0x40,0x00,0x00,0x4E,0x00,0x00,0x2F,0x00,0x00,0x3F,0x00,0x00,0x1E,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x007A(z) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0xC6,0x03,0x00,0xC2,0x03,0x00, +0xE2,0x01,0x00,0xE0,0x01,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x78,0x00,0x00,0x78, +0x00,0x00,0x3C,0x04,0x00,0x3C,0x06,0x00,0x1E,0x07,0x00,0xFF,0x07,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x007B({) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0xE0,0x00,0x00,0x60,0x00,0x00,0x70,0x00, +0x00,0x70,0x00,0x00,0x70,0x00,0x00,0xF0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00, +0xE0,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x0C,0x00,0x00,0x30,0x00,0x00,0x60, +0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xF0,0x00,0x00,0x70,0x00, +0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x60,0x00,0x00,0xE0,0x00,0x00,0x80,0x03,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x007C(|) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00, +0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00, +0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C, +0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00, +0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x007D(}) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x38,0x00,0x00,0x30,0x00,0x00,0x70,0x00, +0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x78,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00, +0x38,0x00,0x00,0x30,0x00,0x00,0x60,0x00,0x00,0x80,0x01,0x00,0x60,0x00,0x00,0x30, +0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x78,0x00,0x00,0x70,0x00, +0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x38,0x00,0x00,0x0E,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x007E(~) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x3C,0x40,0x00,0xFE,0x61,0x00,0xC3,0x3F,0x00,0x01,0x1E,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +//0x007F() +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE, +0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01, +0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00, +0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6, +0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xC6,0x01,0x00,0xFE,0x01,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +}; diff --git a/src/lib/CherryUSB/tests/hpmicro/src/iperf/iperf.c b/src/lib/CherryUSB/tests/hpmicro/src/iperf/iperf.c new file mode 100644 index 000000000..a7e1fa8fe --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/iperf/iperf.c @@ -0,0 +1,763 @@ + +#include +#include +#include +#include +#include +#include + +#include "iperf.h" + +#include "hpm_clock_drv.h" +#include "hpm_csr_drv.h" +#include "board.h" + +// TODO move to common +#define xTaskCreatePinnedToCore(pvTaskCode, pcName, usStackDepth, \ + pvParameters, uxPriority, \ + pvCreatedTask, xCoreID_) \ + xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, \ + uxPriority, pvCreatedTask) + +int64_t iperf_timer_get_time() +{ + return (hpm_csr_get_core_mcycle() / (clock_get_frequency(clock_cpu0) / 1000000)); +} + +#define iperf_delay_us board_delay_us +#define IRAM_ATTR __attribute__((section(".fast"))) // on tcm run +#define IPERF_V6 0 // TODO sync with lwip config +#define iperf_err_t int +#define IPERF_OK 0 /*!< iperf_err_t value indicating success (no error) */ +#define IPERF_FAIL -1 /*!< Generic iperf_err_t code indicating failure */ + +#define IPERF_LOGE(tag, format, ...) \ + do { \ + (void)tag; \ + printf("[%s] " format "\r\n", tag, ##__VA_ARGS__); \ + } while (0) + +#define IPERF_LOGW(tag, format, ...) \ + do { \ + (void)tag; \ + printf("[%s] " format "\r\n", tag, ##__VA_ARGS__); \ + } while (0) + +#define IPERF_LOGI(tag, format, ...) \ + do { \ + (void)tag; \ + printf("[%s] " format "\r\n", tag, ##__VA_ARGS__); \ + } while (0) + +#define IPERF_LOGD(tag, format, ...) \ + do { \ + (void)tag; \ + printf("[%s] " format "\r\n", tag, ##__VA_ARGS__); \ + } while (0) + +#define IPERF_LOGV(tag, format, ...) \ + do { \ + (void)tag; \ + printf("[%s] " format "\r\n", tag, ##__VA_ARGS__); \ + } while (0) + +#define IPERF_GOTO_ON_FALSE(a, err_code, goto_tag, log_tag, format, ...) \ + do { \ + (void)log_tag; \ + if ((!(a))) { \ + ret = err_code; \ + goto goto_tag; \ + } \ + } while (0) + +#define NL "\r\n" + +typedef struct { + iperf_cfg_t cfg; + bool finish; + uint32_t actual_len; + uint32_t tot_len; + uint32_t buffer_len; + uint8_t *buffer; + uint32_t sockfd; +} iperf_ctrl_t; + +static bool s_iperf_is_running = false; +static iperf_ctrl_t s_iperf_ctrl; +static const char *TAG = "iperf"; + +inline static bool iperf_is_udp_client(void) +{ + return ((s_iperf_ctrl.cfg.flag & IPERF_FLAG_CLIENT) && (s_iperf_ctrl.cfg.flag & IPERF_FLAG_UDP)); +} + +inline static bool iperf_is_udp_server(void) +{ + return ((s_iperf_ctrl.cfg.flag & IPERF_FLAG_SERVER) && (s_iperf_ctrl.cfg.flag & IPERF_FLAG_UDP)); +} + +inline static bool iperf_is_tcp_client(void) +{ + return ((s_iperf_ctrl.cfg.flag & IPERF_FLAG_CLIENT) && (s_iperf_ctrl.cfg.flag & IPERF_FLAG_TCP)); +} + +inline static bool iperf_is_tcp_dual_client(void) +{ + return ((s_iperf_ctrl.cfg.flag & IPERF_FLAG_CLIENT) && (s_iperf_ctrl.cfg.flag & IPERF_FLAG_TCP) && (s_iperf_ctrl.cfg.flag & IPERF_FLAG_DUAL)); +} + +inline static bool iperf_is_tcp_server(void) +{ + return ((s_iperf_ctrl.cfg.flag & IPERF_FLAG_SERVER) && (s_iperf_ctrl.cfg.flag & IPERF_FLAG_TCP)); +} + +static int iperf_get_socket_error_code(int sockfd) +{ + return errno; +} + +static int iperf_show_socket_error_reason(const char *str, int sockfd) +{ + int err = errno; + if (err != 0) { + IPERF_LOGW(TAG, "%s error, error code: %d, reason: %s", str, err, strerror(err)); + } + + return err; +} + +static void iperf_report_task(void *arg) +{ + uint32_t interval = s_iperf_ctrl.cfg.interval; + uint32_t time = s_iperf_ctrl.cfg.time; + TickType_t delay_interval = (interval * 1000) / portTICK_PERIOD_MS; + uint32_t cur = 0; + double average = 0; + double actual_bandwidth = 0; + double actual_transfer = 0; + int k = 1; + + printf("[ ID] Interval Transfer Bandwidth\r\n"); + while (!s_iperf_ctrl.finish) { + vTaskDelay(delay_interval); + actual_bandwidth = (s_iperf_ctrl.actual_len / 1e6 * 8) / interval; + actual_transfer = s_iperf_ctrl.actual_len / 1e6; + printf("[%3d] %2d.0-%2d.0 sec %.2f MByte %.2f Mbits/sec\r\n", + s_iperf_ctrl.sockfd, cur, cur + interval, actual_transfer, actual_bandwidth); + cur += interval; + average = ((average * (k - 1) / k) + (actual_bandwidth / k)); + k++; + s_iperf_ctrl.actual_len = 0; + if (cur >= time) { + actual_transfer = s_iperf_ctrl.tot_len / 1e6; + printf("[%3d] %2d.0-%2d.0 sec %.2f MByte %.2f Mbits/sec\r\n", + s_iperf_ctrl.sockfd, 0, time, actual_transfer, average); + break; + } + } + + s_iperf_ctrl.finish = true; + vTaskDelete(NULL); +} + +static iperf_err_t iperf_start_report(void) +{ + int ret; + + ret = xTaskCreatePinnedToCore(iperf_report_task, IPERF_REPORT_TASK_NAME, IPERF_REPORT_TASK_STACK, NULL, s_iperf_ctrl.cfg.traffic_task_priority, NULL, portNUM_PROCESSORS - 1); + + if (ret != pdPASS) { + IPERF_LOGE(TAG, "create task %s failed", IPERF_REPORT_TASK_NAME); + return IPERF_FAIL; + } + + return IPERF_OK; +} + +static void socket_recv(int recv_socket, struct sockaddr_storage listen_addr, uint8_t type) +{ + bool iperf_recv_start = true; + uint8_t *buffer; + int want_recv = 0; + int actual_recv = 0; +#if IPERF_V6 + socklen_t socklen = (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); +#else + socklen_t socklen = sizeof(struct sockaddr_in); +#endif + const char *error_log = (type == IPERF_TRANS_TYPE_TCP) ? "tcp server recv" : "udp server recv"; + + buffer = s_iperf_ctrl.buffer; + want_recv = s_iperf_ctrl.buffer_len; + while (!s_iperf_ctrl.finish) { + actual_recv = recvfrom(recv_socket, buffer, want_recv, 0, (struct sockaddr *)&listen_addr, &socklen); + if (actual_recv < 0) { + iperf_show_socket_error_reason(error_log, recv_socket); + s_iperf_ctrl.finish = true; + break; + } else { + if (iperf_recv_start) { + iperf_start_report(); + iperf_recv_start = false; + } + s_iperf_ctrl.actual_len += actual_recv; + s_iperf_ctrl.tot_len += actual_recv; + if (s_iperf_ctrl.cfg.num_bytes > 0 && s_iperf_ctrl.tot_len > s_iperf_ctrl.cfg.num_bytes) { + break; + } + } + } +} + +static void socket_recv_dual(int recv_socket, struct sockaddr_storage listen_addr, uint8_t type) +{ + uint8_t *buffer; + int want_recv = 0; + int actual_recv = 0; + socklen_t socklen = sizeof(struct sockaddr_in); + +#define RECV_DUAL_BUF_LEN (16 * 1024) + buffer = pvPortMalloc(RECV_DUAL_BUF_LEN); + want_recv = RECV_DUAL_BUF_LEN; + if (!buffer) { + return; + } + while (1) { + actual_recv = recvfrom(recv_socket, buffer, want_recv, 0, (struct sockaddr *)&listen_addr, &socklen); + if (actual_recv <= 0) { + break; + } + } + vPortFree(buffer); +} + +typedef struct { + int32_t flags; + int32_t numThreads; + int32_t mPort; + int32_t bufferlen; + int32_t mWindowSize; + int32_t mAmount; + int32_t mRate; + int32_t mUDPRateUnits; + int32_t mRealtime; +} iperf_client_hdr_t; +#define HEADER_VERSION1 0x80000000 +#define RUN_NOW 0x00000001 +#define UNITS_PPS 0x00000002 + +static void send_dual_header(int sock, struct sockaddr *addr, socklen_t socklen) +{ + iperf_client_hdr_t hdr = {}; + iperf_cfg_t *cfg = &s_iperf_ctrl.cfg; + + hdr.flags = htonl(HEADER_VERSION1 | RUN_NOW); + hdr.numThreads = htonl(1); + hdr.mPort = htonl(cfg->sport); + hdr.mAmount = htonl(-(cfg->time * 100)); + + sendto(sock, &hdr, sizeof(hdr), 0, addr, socklen); +} + +static void socket_send(int send_socket, struct sockaddr_storage dest_addr, uint8_t type, int bw_lim) +{ + uint8_t *buffer; + int32_t *pkt_id_p; + int32_t pkt_cnt = 0; + int actual_send = 0; + int want_send = 0; + int period_us = -1; + int delay_us = 0; + int64_t prev_time = 0; + int64_t send_time = 0; + int err = 0; +#if IPERF_V6 + const socklen_t socklen = (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); +#else + const socklen_t socklen = sizeof(struct sockaddr_in); +#endif + const char *error_log = (type == IPERF_TRANS_TYPE_TCP) ? "tcp client send" : "udp client send"; + + buffer = s_iperf_ctrl.buffer; + pkt_id_p = (int32_t *)s_iperf_ctrl.buffer; + want_send = s_iperf_ctrl.buffer_len; + iperf_start_report(); + + if (bw_lim > 0) { + period_us = want_send * 8 / bw_lim; + } + + if (iperf_is_tcp_dual_client()) { + send_dual_header(send_socket, (struct sockaddr *)&dest_addr, socklen); + } + + while (!s_iperf_ctrl.finish) { + if (period_us > 0) { + send_time = iperf_timer_get_time(); + if (actual_send > 0) { + // Last packet "send" was successful, check how much off the previous loop duration was to the ideal send period. Result will adjust the + // next send delay. + delay_us += period_us + (int32_t)(prev_time - send_time); + } else { + // Last packet "send" was not successful. Ideally we should try to catch up the whole previous loop duration (e.g. prev_time - send_time). + // However, that's not possible since the most probable reason why the send was unsuccessful is the HW was not able to process the packet. + // Hence, we cannot queue more packets with shorter (or no) delay to catch up since we are already at the performance edge. The best we + // can do is to reset the send delay (which is probably big negative number) and start all over again. + delay_us = 0; + } + prev_time = send_time; + } + *pkt_id_p = htonl(pkt_cnt); // datagrams need to be sequentially numbered + if (pkt_cnt >= INT32_MAX) { + pkt_cnt = 0; + } else { + pkt_cnt++; + } + actual_send = sendto(send_socket, buffer, want_send, 0, (struct sockaddr *)&dest_addr, socklen); + if (actual_send != want_send) { + if (type == IPERF_TRANS_TYPE_UDP) { + err = iperf_get_socket_error_code(send_socket); + // ENOMEM is expected under heavy load => do not print it + if (err != ENOMEM) { + iperf_show_socket_error_reason(error_log, send_socket); + } + } else if (type == IPERF_TRANS_TYPE_TCP) { + iperf_show_socket_error_reason(error_log, send_socket); + break; + } + } else { + s_iperf_ctrl.actual_len += actual_send; + s_iperf_ctrl.tot_len += actual_send; + if (s_iperf_ctrl.cfg.num_bytes > 0 && s_iperf_ctrl.tot_len >= s_iperf_ctrl.cfg.num_bytes) { + break; + } + } + // The send delay may be negative, it indicates we are trying to catch up and hence to not delay the loop at all. + if (delay_us > 0) { + iperf_delay_us(delay_us); + } + } +} + +static iperf_err_t IRAM_ATTR iperf_run_tcp_server(void) +{ + int listen_socket = -1; + int client_socket = -1; + int opt = 1; + int err = 0; + iperf_err_t ret = IPERF_OK; + struct sockaddr_in remote_addr; + struct timeval timeout = { 0 }; + socklen_t addr_len = sizeof(struct sockaddr); + struct sockaddr_storage listen_addr = { 0 }; +#if IPERF_V6 + struct sockaddr_in6 listen_addr6 = { 0 }; +#endif + struct sockaddr_in listen_addr4 = { 0 }; + + IPERF_GOTO_ON_FALSE((s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6 || s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4), IPERF_FAIL, exit, TAG, "Ivalid AF types"); + +#if IPERF_V6 + if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) { + // The TCP server listen at the address "::", which means all addresses can be listened to. + inet6_aton("::", &listen_addr6.sin6_addr); + listen_addr6.sin6_family = AF_INET6; + listen_addr6.sin6_port = htons(s_iperf_ctrl.cfg.sport); + + listen_socket = socket(AF_INET6, SOCK_STREAM, IPPROTO_IPV6); + IPERF_GOTO_ON_FALSE((listen_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + + setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + setsockopt(listen_socket, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof(opt)); + + IPERF_LOGI(TAG, "Socket created"); + + err = bind(listen_socket, (struct sockaddr *)&listen_addr6, sizeof(listen_addr6)); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Socket unable to bind: errno %d, IPPROTO: %d", errno, AF_INET6); + err = listen(listen_socket, 1); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Error occurred during listen: errno %d", errno); + + timeout.tv_sec = IPERF_SOCKET_RX_TIMEOUT; + setsockopt(listen_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + + memcpy(&listen_addr, &listen_addr6, sizeof(listen_addr6)); + } else +#endif + if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4) { + listen_addr4.sin_family = AF_INET; + listen_addr4.sin_port = htons(s_iperf_ctrl.cfg.sport); + listen_addr4.sin_addr.s_addr = s_iperf_ctrl.cfg.source_ip4; + + listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + IPERF_GOTO_ON_FALSE((listen_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + + setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + + IPERF_LOGI(TAG, "Socket created"); + + err = bind(listen_socket, (struct sockaddr *)&listen_addr4, sizeof(listen_addr4)); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Socket unable to bind: errno %d, IPPROTO: %d", errno, AF_INET); + + err = listen(listen_socket, 5); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Error occurred during listen: errno %d", errno); + memcpy(&listen_addr, &listen_addr4, sizeof(listen_addr4)); + } + + client_socket = accept(listen_socket, (struct sockaddr *)&remote_addr, &addr_len); + IPERF_GOTO_ON_FALSE((client_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to accept connection: errno %d", errno); + IPERF_LOGI(TAG, "accept: %s,%d\n", inet_ntoa(remote_addr.sin_addr), htons(remote_addr.sin_port)); + + timeout.tv_sec = IPERF_SOCKET_RX_TIMEOUT; + setsockopt(client_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + + socket_recv(client_socket, listen_addr, IPERF_TRANS_TYPE_TCP); +exit: + if (client_socket != -1) { + close(client_socket); + } + + if (listen_socket != -1) { + shutdown(listen_socket, 0); + close(listen_socket); + IPERF_LOGI(TAG, "TCP Socket server is closed."); + } + s_iperf_ctrl.finish = true; + return ret; +} + +static void IRAM_ATTR iperf_tcp_dual_server_task(void *pvParameters) +{ + int listen_socket = -1; + int client_socket = -1; + int opt = 1; + int err = 0; + iperf_err_t ret = IPERF_OK; + struct sockaddr_in remote_addr; + struct timeval timeout = { 0 }; + socklen_t addr_len = sizeof(struct sockaddr); + struct sockaddr_storage listen_addr = { 0 }; + struct sockaddr_in listen_addr4 = { 0 }; + + (void)ret; + if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4) { + listen_addr4.sin_family = AF_INET; + listen_addr4.sin_port = htons(s_iperf_ctrl.cfg.sport); + listen_addr4.sin_addr.s_addr = s_iperf_ctrl.cfg.source_ip4; + + listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + IPERF_GOTO_ON_FALSE((listen_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + + setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + + IPERF_LOGI(TAG, "Socket created"); + + err = bind(listen_socket, (struct sockaddr *)&listen_addr4, sizeof(listen_addr4)); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Socket unable to bind: errno %d, IPPROTO: %d", errno, AF_INET); + + err = listen(listen_socket, 5); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Error occurred during listen: errno %d", errno); + memcpy(&listen_addr, &listen_addr4, sizeof(listen_addr4)); + } + + client_socket = accept(listen_socket, (struct sockaddr *)&remote_addr, &addr_len); + IPERF_GOTO_ON_FALSE((client_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to accept connection: errno %d", errno); + IPERF_LOGI(TAG, "accept: %s,%d\n", inet_ntoa(remote_addr.sin_addr), htons(remote_addr.sin_port)); + + timeout.tv_sec = IPERF_SOCKET_RX_TIMEOUT; + setsockopt(client_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + + socket_recv_dual(client_socket, listen_addr, IPERF_TRANS_TYPE_TCP); +exit: + if (client_socket != -1) { + close(client_socket); + } + + if (listen_socket != -1) { + shutdown(listen_socket, 0); + close(listen_socket); + IPERF_LOGI(TAG, "TCP Socket server is closed."); + } + + vTaskDelete(NULL); +} + +static iperf_err_t iperf_run_tcp_client(void) +{ + int client_socket = -1; + int err = 0; + iperf_err_t ret = IPERF_OK; + struct sockaddr_storage dest_addr = { 0 }; +#if IPERF_V6 + struct sockaddr_in6 dest_addr6 = { 0 }; +#endif + struct sockaddr_in dest_addr4 = { 0 }; + int opt = s_iperf_ctrl.cfg.tos; + + IPERF_GOTO_ON_FALSE((s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6 || s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4), IPERF_FAIL, exit, TAG, "Ivalid AF types"); + + if (iperf_is_tcp_dual_client()) { + xTaskCreate(iperf_tcp_dual_server_task, "dual_rx", IPERF_TRAFFIC_TASK_STACK, NULL, s_iperf_ctrl.cfg.traffic_task_priority, NULL); + vTaskDelay(pdMS_TO_TICKS(100)); + } +#if IPERF_V6 + if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) { + client_socket = socket(AF_INET6, SOCK_STREAM, IPPROTO_IPV6); + IPERF_GOTO_ON_FALSE((client_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + setsockopt(client_socket, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)); + + inet6_aton(s_iperf_ctrl.cfg.destination_ip6, &dest_addr6.sin6_addr); + dest_addr6.sin6_family = AF_INET6; + dest_addr6.sin6_port = htons(s_iperf_ctrl.cfg.dport); + + err = connect(client_socket, (struct sockaddr *)&dest_addr6, sizeof(struct sockaddr_in6)); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Socket unable to connect: errno %d", errno); + IPERF_LOGI(TAG, "Successfully connected"); + memcpy(&dest_addr, &dest_addr6, sizeof(dest_addr6)); + } else +#endif + if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4) { + client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + IPERF_GOTO_ON_FALSE((client_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + setsockopt(client_socket, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)); + + dest_addr4.sin_family = AF_INET; + dest_addr4.sin_port = htons(s_iperf_ctrl.cfg.dport); + dest_addr4.sin_addr.s_addr = s_iperf_ctrl.cfg.destination_ip4; + err = connect(client_socket, (struct sockaddr *)&dest_addr4, sizeof(struct sockaddr_in)); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Socket unable to connect: errno %d", errno); + IPERF_LOGI(TAG, "Successfully connected"); + memcpy(&dest_addr, &dest_addr4, sizeof(dest_addr4)); + } + + socket_send(client_socket, dest_addr, IPERF_TRANS_TYPE_TCP, s_iperf_ctrl.cfg.bw_lim); +exit: + if (client_socket != -1) { + shutdown(client_socket, 0); + close(client_socket); + IPERF_LOGI(TAG, "TCP Socket client is closed."); + } + s_iperf_ctrl.finish = true; + return ret; +} + +static iperf_err_t IRAM_ATTR iperf_run_udp_server(void) +{ + int listen_socket = -1; + int opt = 1; + int err = 0; + iperf_err_t ret = IPERF_OK; + struct timeval timeout = { 0 }; + struct sockaddr_storage listen_addr = { 0 }; +#if IPERF_V6 + struct sockaddr_in6 listen_addr6 = { 0 }; +#endif + struct sockaddr_in listen_addr4 = { 0 }; + + IPERF_GOTO_ON_FALSE((s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6 || s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4), IPERF_FAIL, exit, TAG, "Ivalid AF types"); + +#if IPERF_V6 + if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) { + // The UDP server listen at the address "::", which means all addresses can be listened to. + inet6_aton("::", &listen_addr6.sin6_addr); + listen_addr6.sin6_family = AF_INET6; + listen_addr6.sin6_port = htons(s_iperf_ctrl.cfg.sport); + + listen_socket = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + IPERF_GOTO_ON_FALSE((listen_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + IPERF_LOGI(TAG, "Socket created"); + + setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + + err = bind(listen_socket, (struct sockaddr *)&listen_addr6, sizeof(struct sockaddr_in6)); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Socket unable to bind: errno %d", errno); + IPERF_LOGI(TAG, "Socket bound, port %d", listen_addr6.sin6_port); + + memcpy(&listen_addr, &listen_addr6, sizeof(listen_addr6)); + } else +#endif + if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4) { + listen_addr4.sin_family = AF_INET; + listen_addr4.sin_port = htons(s_iperf_ctrl.cfg.sport); + listen_addr4.sin_addr.s_addr = s_iperf_ctrl.cfg.source_ip4; + + listen_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + IPERF_GOTO_ON_FALSE((listen_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + IPERF_LOGI(TAG, "Socket created"); + + setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + + err = bind(listen_socket, (struct sockaddr *)&listen_addr4, sizeof(struct sockaddr_in)); + IPERF_GOTO_ON_FALSE((err == 0), IPERF_FAIL, exit, TAG, "Socket unable to bind: errno %d", errno); + IPERF_LOGI(TAG, "Socket bound, port %d", listen_addr4.sin_port); + memcpy(&listen_addr, &listen_addr4, sizeof(listen_addr4)); + } + + timeout.tv_sec = IPERF_SOCKET_RX_TIMEOUT; + setsockopt(listen_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + + socket_recv(listen_socket, listen_addr, IPERF_TRANS_TYPE_UDP); +exit: + if (listen_socket != -1) { + shutdown(listen_socket, 0); + close(listen_socket); + } + IPERF_LOGI(TAG, "Udp socket server is closed."); + s_iperf_ctrl.finish = true; + return ret; +} + +static iperf_err_t iperf_run_udp_client(void) +{ + int client_socket = -1; + int opt = 1; + iperf_err_t ret = IPERF_OK; + struct sockaddr_storage dest_addr = { 0 }; +#if IPERF_V6 + struct sockaddr_in6 dest_addr6 = { 0 }; +#endif + struct sockaddr_in dest_addr4 = { 0 }; + + IPERF_GOTO_ON_FALSE((s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6 || s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4), IPERF_FAIL, exit, TAG, "Ivalid AF types"); + +#if IPERF_V6 + if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV6) { + inet6_aton(s_iperf_ctrl.cfg.destination_ip6, &dest_addr6.sin6_addr); + dest_addr6.sin6_family = AF_INET6; + dest_addr6.sin6_port = htons(s_iperf_ctrl.cfg.dport); + + client_socket = socket(AF_INET6, SOCK_DGRAM, IPPROTO_IPV6); + IPERF_GOTO_ON_FALSE((client_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + IPERF_LOGI(TAG, "Socket created, sending to %s:%d", s_iperf_ctrl.cfg.destination_ip6, s_iperf_ctrl.cfg.dport); + + setsockopt(client_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + opt = s_iperf_ctrl.cfg.tos; + setsockopt(client_socket, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)); + memcpy(&dest_addr, &dest_addr6, sizeof(dest_addr6)); + } else +#endif + if (s_iperf_ctrl.cfg.type == IPERF_IP_TYPE_IPV4) { + dest_addr4.sin_family = AF_INET; + dest_addr4.sin_port = htons(s_iperf_ctrl.cfg.dport); + dest_addr4.sin_addr.s_addr = s_iperf_ctrl.cfg.destination_ip4; + + client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + IPERF_GOTO_ON_FALSE((client_socket >= 0), IPERF_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + IPERF_LOGI(TAG, "Socket created, sending to %d:%d", s_iperf_ctrl.cfg.destination_ip4, s_iperf_ctrl.cfg.dport); + + setsockopt(client_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + opt = s_iperf_ctrl.cfg.tos; + setsockopt(client_socket, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)); + memcpy(&dest_addr, &dest_addr4, sizeof(dest_addr4)); + } + + socket_send(client_socket, dest_addr, IPERF_TRANS_TYPE_UDP, s_iperf_ctrl.cfg.bw_lim); +exit: + if (client_socket != -1) { + shutdown(client_socket, 0); + close(client_socket); + } + s_iperf_ctrl.finish = true; + IPERF_LOGI(TAG, "UDP Socket client is closed"); + return ret; +} + +static void iperf_task_traffic(void *arg) +{ + if (iperf_is_udp_client()) { + iperf_run_udp_client(); + } else if (iperf_is_udp_server()) { + iperf_run_udp_server(); + } else if (iperf_is_tcp_client()) { + iperf_run_tcp_client(); + } else { + iperf_run_tcp_server(); + } + + if (s_iperf_ctrl.buffer) { + vPortFree(s_iperf_ctrl.buffer); + s_iperf_ctrl.buffer = NULL; + } + printf("iperf exit\r\n"); + s_iperf_is_running = false; + vTaskDelete(NULL); +} + +static uint32_t iperf_get_buffer_len(void) +{ + if (iperf_is_udp_client()) { + return (s_iperf_ctrl.cfg.len_buf == 0 ? IPERF_UDP_TX_LEN : s_iperf_ctrl.cfg.len_buf); + } else if (iperf_is_udp_server()) { + return IPERF_UDP_RX_LEN; + } else if (iperf_is_tcp_client()) { + return (s_iperf_ctrl.cfg.len_buf == 0 ? IPERF_TCP_TX_LEN : s_iperf_ctrl.cfg.len_buf); + } else { + return (s_iperf_ctrl.cfg.len_buf == 0 ? IPERF_TCP_RX_LEN : s_iperf_ctrl.cfg.len_buf); + } + return 0; +} + +static void net_iperf_print_header(iperf_cfg_t *cfg) +{ + printf("------------------------------------------------------------\r\n"); + if (iperf_is_udp_server()) { + printf("Server listening on UDP port %d\r\n", + cfg->sport); + } else if (iperf_is_tcp_server()) { + printf("Server listening on TCP port %d\r\n", + cfg->sport); + } else if (iperf_is_udp_client()) { + printf("Client connecting to %s, UDP port %d\r\n" + "Sending %d byte datagrams\r\n", + inet_ntoa(cfg->destination_ip4), + cfg->dport, cfg->num_bytes); + } else if (iperf_is_tcp_client()) { + printf("Client connecting to %s, TCP port %d\r\n", + inet_ntoa(cfg->destination_ip4), cfg->dport); + } + printf("------------------------------------------------------------\r\n"); +} + +iperf_err_t iperf_start(iperf_cfg_t *cfg) +{ + BaseType_t ret; + + if (!cfg) { + return IPERF_FAIL; + } + + if (s_iperf_is_running) { + IPERF_LOGW(TAG, "iperf is running"); + printf("iperf is running\r\n"); + return IPERF_FAIL; + } + + memset(&s_iperf_ctrl, 0, sizeof(s_iperf_ctrl)); + memcpy(&s_iperf_ctrl.cfg, cfg, sizeof(*cfg)); + s_iperf_is_running = true; + s_iperf_ctrl.finish = false; + s_iperf_ctrl.buffer_len = iperf_get_buffer_len(); + s_iperf_ctrl.buffer = (uint8_t *)pvPortMalloc(s_iperf_ctrl.buffer_len); + if (!s_iperf_ctrl.buffer) { + IPERF_LOGE(TAG, "create buffer: not enough memory"); + return IPERF_FAIL; + } + memset(s_iperf_ctrl.buffer, 0, s_iperf_ctrl.buffer_len); + ret = xTaskCreatePinnedToCore(iperf_task_traffic, IPERF_TRAFFIC_TASK_NAME, IPERF_TRAFFIC_TASK_STACK, NULL, s_iperf_ctrl.cfg.traffic_task_priority, NULL, portNUM_PROCESSORS - 1); + if (ret != pdPASS) { + IPERF_LOGE(TAG, "create task %s failed", IPERF_TRAFFIC_TASK_NAME); + vPortFree(s_iperf_ctrl.buffer); + s_iperf_ctrl.buffer = NULL; + return IPERF_FAIL; + } + net_iperf_print_header(cfg); + return IPERF_OK; +} + +iperf_err_t iperf_stop(void) +{ + if (s_iperf_is_running) { + s_iperf_ctrl.finish = true; + } + + return IPERF_OK; +} diff --git a/src/lib/CherryUSB/tests/hpmicro/src/iperf/iperf.h b/src/lib/CherryUSB/tests/hpmicro/src/iperf/iperf.h new file mode 100644 index 000000000..ea69b4ba6 --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/iperf/iperf.h @@ -0,0 +1,82 @@ +/* Iperf Example - iperf declaration + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#ifndef __IPERF_H_ +#define __IPERF_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define IPERF_IP_TYPE_IPV4 0 +#define IPERF_IP_TYPE_IPV6 1 +#define IPERF_TRANS_TYPE_TCP 0 +#define IPERF_TRANS_TYPE_UDP 1 + +#define IPERF_FLAG_SET(cfg, flag) ((cfg) |= (flag)) +#define IPERF_FLAG_CLR(cfg, flag) ((cfg) &= (~(flag))) + +#define IPERF_FLAG_CLIENT (1) +#define IPERF_FLAG_SERVER (1 << 1) +#define IPERF_FLAG_TCP (1 << 2) +#define IPERF_FLAG_UDP (1 << 3) +#define IPERF_FLAG_DUAL (1 << 4) + +#define IPERF_DEFAULT_PORT 5001 +#define IPERF_DEFAULT_INTERVAL 1 +#define IPERF_DEFAULT_TIME 10 +#define IPERF_DEFAULT_NO_BW_LIMIT -1 + +#define IPERF_TRAFFIC_TASK_NAME "iperf_traffic" +#define IPERF_TRAFFIC_TASK_PRIORITY 10 +#define IPERF_TRAFFIC_TASK_STACK 2048 +#define IPERF_REPORT_TASK_NAME "iperf_report" +#define IPERF_REPORT_TASK_STACK 2048 + +#define IPERF_UDP_TX_LEN (1470) +#define IPERF_UDP_RX_LEN (1470) +#define IPERF_TCP_TX_LEN (8 << 10) +#define IPERF_TCP_RX_LEN (8 << 10) + +#define IPERF_MAX_DELAY 64 + +#define IPERF_SOCKET_RX_TIMEOUT 10 +#define IPERF_SOCKET_ACCEPT_TIMEOUT 5 + +typedef struct { + uint32_t flag; + union { + uint32_t destination_ip4; + char *destination_ip6; + }; + union { + uint32_t source_ip4; + char *source_ip6; + }; + uint8_t type; + uint16_t dport; + uint16_t sport; + uint32_t interval; + uint32_t time; + uint16_t len_buf; + int32_t bw_lim; + uint8_t tos; + uint8_t traffic_task_priority; + uint32_t num_bytes; +} iperf_cfg_t; + +int iperf_start(iperf_cfg_t *cfg); + +int iperf_stop(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/lib/CherryUSB/tests/hpmicro/src/iperf/iperf_cli.c b/src/lib/CherryUSB/tests/hpmicro/src/iperf/iperf_cli.c new file mode 100644 index 000000000..8db3e050f --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/iperf/iperf_cli.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include + +#define NL "\r\n" + +static void iperf_cmd(int argc, char **argv) +{ + int opt; + getopt_env_t opt_env; + int o_c = 0, o_s = 0, o_u = 0, o_a = 0; + int o_p = IPERF_DEFAULT_PORT, o_l = 0, o_i = IPERF_DEFAULT_INTERVAL, o_t = IPERF_DEFAULT_TIME, o_b = IPERF_DEFAULT_NO_BW_LIMIT, o_S = 0, o_n = 0; + int o_d = 0; + int o_P = IPERF_TRAFFIC_TASK_PRIORITY; + uint32_t dst_addr = 0; + + iperf_cfg_t cfg; + + utils_getopt_init(&opt_env, 0); + while ((opt = utils_getopt(&opt_env, argc, argv, ":c:sup:l:i:t:b:S:n:P:ad")) != -1) { + #define ARG_READ(v) v = atoi(opt_env.optarg) + switch (opt) { + case 'c': + ++o_c; + dst_addr = ipaddr_addr(opt_env.optarg); + break; + case 's': ++o_s; break; + case 'u': ++o_u; break; + case 'p': ARG_READ(o_p); break; + case 'l': ARG_READ(o_l); break; + case 'i': ARG_READ(o_i); break; + case 't': ARG_READ(o_t); break; + case 'b': ARG_READ(o_b); break; + case 'S': ARG_READ(o_S); break; + case 'n': ARG_READ(o_n); break; + case 'P': ARG_READ(o_P); break; + case 'd': ++o_d; break; + case 'a': ++o_a; break; + } + #undef ARG_READ + } + + memset(&cfg, 0, sizeof(cfg)); + cfg.type = IPERF_IP_TYPE_IPV4; + + if (o_a) { + iperf_stop(); + return; + } + if (!((o_c && !o_s) || (!o_c && o_s))) { + printf("client/server required" NL); + return; + } + if (o_c) { + cfg.destination_ip4 = dst_addr; + cfg.flag |= IPERF_FLAG_CLIENT; + } else { + cfg.flag |= IPERF_FLAG_SERVER; + } + if (o_u) { + cfg.flag |= IPERF_FLAG_UDP; + } else { + cfg.flag |= IPERF_FLAG_TCP; + } + + if (o_c && !o_u && o_d) { + cfg.flag |= IPERF_FLAG_DUAL; + } + + cfg.len_buf = o_l; + cfg.sport = o_p; + cfg.dport = o_p; + cfg.interval = o_i; + cfg.time = o_t; + if (cfg.time < cfg.interval) { + cfg.time = cfg.interval; + } + cfg.bw_lim = o_b; + cfg.tos = o_S; + cfg.num_bytes = o_n * 1000 * 1000; + if (cfg.bw_lim <= 0) { + cfg.bw_lim = IPERF_DEFAULT_NO_BW_LIMIT; + } + cfg.traffic_task_priority = o_P; + + iperf_start(&cfg); +} + +#include +#define ML(s) s NL +#define IPERF_USAGE \ + ML("iperf") \ + ML(" -c server_addr: run in client mode") \ + ML(" -s: run in server mode") \ + ML(" -u: UDP") \ + ML(" -p port: specify port") \ + ML(" -l length: set read/write buffer size") \ + ML(" -i interval: seconds between bandwidth reports") \ + ML(" -t time: time in seconds to run") \ + ML(" -b bandwith: bandwidth to send in Mbps") \ + ML(" -S tos: TOS") \ + ML(" -n MB: number of MB to send/recv") \ + ML(" -P priority: traffic task priority") \ + ML(" -d: dual mode") \ + ML(" -a: abort running iperf") \ + +#if 0 +const static struct cli_command iperf_cmds[] STATIC_CLI_CMD_ATTRIBUTE = { + {"iperf", IPERF_USAGE, iperf_cmd}, +}; +#endif +CSH_CMD_EXPORT_ALIAS(iperf_cmd, iperf, iperf command); + diff --git a/src/lib/CherryUSB/tests/hpmicro/src/iperf/utils_getopt.c b/src/lib/CherryUSB/tests/hpmicro/src/iperf/utils_getopt.c new file mode 100644 index 000000000..f012b67cf --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/iperf/utils_getopt.c @@ -0,0 +1,377 @@ +/* + * This file is derived from musl v1.2.0. + * Modifications are applied. + * Copyright (C) Bouffalo Lab 2016-2020 + */ + +/* + * Copyright © 2005-2020 Rich Felker, et al. + * + * 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 +#include +#include +#include +#include +#include + +int utils_getopt_init(getopt_env_t *env, int opterr) +{ + if (!env) { + return -1; + } + env->optarg = NULL; + env->optind = 1; + env->opterr = opterr; + env->optopt = 0; + env->__optpos = 0; + return 0; +} + +#define NEWLINE "\r\n" + +int utils_getopt(getopt_env_t *env, int argc, char *const argv[], const char *optstring) +{ + int i; + char c, d; + char *optchar; + + if (!env) { + return -1; + } + + if (env->optind >= argc || !argv[env->optind]) + return -1; + + if (argv[env->optind][0] != '-') { + if (optstring[0] == '-') { + env->optarg = argv[env->optind++]; + return 1; + } + return -1; + } + + if (!argv[env->optind][1]) + return -1; + + if (argv[env->optind][1] == '-' && !argv[env->optind][2]) + return env->optind++, -1; + + if (!env->__optpos) + env->__optpos++; + c = argv[env->optind][env->__optpos]; + optchar = argv[env->optind] + env->__optpos; + env->__optpos += !!c; + + if (!argv[env->optind][env->__optpos]) { + env->optind++; + env->__optpos = 0; + } + + if (optstring[0] == '-' || optstring[0] == '+') + optstring++; + + i = 0; + do + d = optstring[i++]; + while (d && d != c); + + if (d != c || c == ':') { + env->optopt = c; + if (optstring[0] != ':' && env->opterr) + printf("%s: unrecognized option: %c" NEWLINE, argv[0], *optchar); + return '?'; + } + if (optstring[i] == ':') { + env->optarg = 0; + if (optstring[i + 1] != ':' || env->__optpos) { + env->optarg = argv[env->optind++] + env->__optpos; + env->__optpos = 0; + } + if (env->optind > argc) { + env->optopt = c; + if (optstring[0] == ':') + return ':'; + if (env->opterr) { + printf("%s: option requires an argument: %c" NEWLINE, argv[0], *optchar); + } + return '?'; + } + } + return c; +} + +static int params_filter(char **params, uint32_t *r) +{ + char *p; + uint32_t result = 0; + uint8_t base = 0; + + p = *params; + + if ((*p == '0') && ((*(p + 1) == 'x') || (*(p + 1) == 'X'))) { + p = p + 2; + base = 16; + + } else { + base = 10; + } + + while (*p) { + result *= base; + if (*p >= '0' && *p <= '9') + result += *p - '0'; + else if (base == 10) + return -1; + + if (base == 16) { + if (*p >= 'a' && *p <= 'f') + result += *p - 'a' + 10; + else if (*p >= 'A' && *p <= 'F') + result += *p - 'A' + 10; + } + p++; + } + + *r = result; + return 0; +} + +void get_bytearray_from_string(char **params, uint8_t *result, int array_size) +{ + int i = 0; + char rand[3]; + + for (i = 0; i < array_size; i++) { + memcpy(rand, *params, 2); + rand[2] = '\0'; + result[i] = strtol(rand, NULL, 16); + *params = *params + 2; + } +} + +void get_uint8_from_string(char **params, uint8_t *result) +{ + uint32_t p = 0; + int state = 0; + + state = params_filter(params, &p); + if (!state) { + *result = p & 0xff; + } else + *result = 0; +} + +void get_uint16_from_string(char **params, uint16_t *result) +{ + uint32_t p = 0; + int state = 0; + + state = params_filter(params, &p); + if (!state) { + *result = p & 0xffff; + } else + *result = 0; +} + +void get_uint32_from_string(char **params, uint32_t *result) +{ + uint32_t p = 0; + int state = 0; + + state = params_filter(params, &p); + if (!state) { + *result = p; + } else + *result = 0; +} + +void utils_parse_number(const char *str, char sep, uint8_t *buf, int buflen, int base) +{ + int i; + for (i = 0; i < buflen; i++) { + buf[i] = (uint8_t)strtol(str, NULL, base); + str = strchr(str, sep); + if (str == NULL || *str == '\0') { + break; + } + str++; + } +} + +void utils_parse_number_adv(const char *str, char sep, uint8_t *buf, int buflen, int base, int *count) +{ + int i; + + for (i = 0; i < buflen; i++) { + buf[i] = (uint8_t)strtol(str, NULL, base); + str = strchr(str, sep); + if (str == NULL || *str == '\0') { + break; + } + str++; + } + *count = (i + 1); +} + +unsigned long long convert_arrayToU64(uint8_t *inputArray) +{ + unsigned long long result = 0; + for (uint8_t i = 0; i < 8; i++) { + result <<= 8; + result |= (unsigned long long)inputArray[7 - i]; + } + + return result; +} + +void convert_u64ToArray(unsigned long long inputU64, uint8_t result[8]) +{ + for (int i = 0; i < 8; i++) { + result[i] = inputU64 >> (i * 8); + } +} + +void utils_memdrain8(void *src, size_t len) +{ + volatile uint8_t *s = (uint8_t *)src; + uint8_t tmp; + + while (len--) { + tmp = *s++; + } + + (void)tmp; +} + +void utils_memdrain16(void *src, size_t len) +{ + volatile uint16_t *s = (uint16_t *)src; + uint16_t tmp; + + len >>= 1; //convert to half words + + while (len--) { + tmp = *s++; + } + + (void)tmp; +} + +void utils_memdrain32(void *src, size_t len) +{ + volatile uint32_t *s = (uint32_t *)src; + uint32_t tmp; + + len >>= 2; //convert to words + + while (len--) { + tmp = *s++; + } + + (void)tmp; +} + +void utils_memdrain64(void *src, size_t len) +{ + volatile uint64_t *s = (uint64_t *)src; + uint64_t tmp; + + len >>= 3; //convert to two words + + while (len--) { + tmp = *s++; + } + + (void)tmp; +} + +void *utils_memdrain8_with_check(void *src, size_t len, uint8_t seq) +{ + volatile uint8_t *s = (uint8_t *)src; + uint8_t tmp; + + (void)tmp; + + while (len--) { + tmp = *s++; + if ((seq++) != tmp) { + return (uint8_t *)s - 1; + } + } + + return NULL; +} + +void *utils_memdrain16_with_check(void *src, size_t len, uint16_t seq) +{ + volatile uint16_t *s = (uint16_t *)src; + uint16_t tmp; + (void)tmp; + + len >>= 1; //convert to half words + + while (len--) { + tmp = *s++; + if ((seq++) != tmp) { + return (uint16_t *)s - 1; + } + } + + return NULL; +} + +void *utils_memdrain32_with_check(void *src, size_t len, uint32_t seq) +{ + volatile uint32_t *s = (uint32_t *)src; + uint32_t tmp; + (void)tmp; + + len >>= 2; //convert to words + + while (len--) { + tmp = *s++; + if ((seq++) != tmp) { + return (uint32_t *)s - 1; + } + } + + return NULL; +} + +void *utils_memdrain64_with_check(void *src, size_t len, uint64_t seq) +{ + volatile uint64_t *s = (uint64_t *)src; + uint64_t tmp; + (void)tmp; + + len >>= 3; //convert to two words + + while (len--) { + tmp = *s++; + if ((seq++) != tmp) { + return (uint64_t *)s - 1; + } + } + + return NULL; +} diff --git a/src/lib/CherryUSB/tests/hpmicro/src/iperf/utils_getopt.h b/src/lib/CherryUSB/tests/hpmicro/src/iperf/utils_getopt.h new file mode 100644 index 000000000..5f6c9c97a --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/iperf/utils_getopt.h @@ -0,0 +1,107 @@ +#ifndef __GETOPT_H__ +#define __GETOPT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Parameters needed to parse the command line + * + */ +typedef struct getopt_env { + char *optarg; /*!< if the option accepts parameters, then optarg point to the option parameter*/ + int optind; /*!< current index of argv*/ + int opterr; /*!< non-zero enable error message output, while 0,no error message output*/ + int optopt; /*!< contain unrecognized option character*/ + int __optpos; +} getopt_env_t; + +/** + * @brief Initialize struct getopt_env + * + * @param env pointer to struct getopt_env + * @param opterr set error message output method + * + * @return + * - 0: success + * - -1: fail + */ +int utils_getopt_init(getopt_env_t *env, int opterr); + +/** + * @brief Parses the command-line arguments + * + * @param env pointer to struct getopt_env + * @param argc the argument count + * @param argv the argument array + * + * @return + * - option character : an option was successfully found + * - -1 : all command-line options have been parsed + * - '?' : option character was not in optstring + * - ':' or '?' : If utils_getopt() encounters an option with a missing argument, then the return value depends on the first character in optstring: if it is ':', then ':' is returned; otherwise '?' is returned + * + * @note Example + * @code + * + * #include + * #include + * + * void cmd(char *buf, int len, int argc, char **argv) + * { + * int opt; + getopt_env_t getopt_env; + utils_getopt_init(&getopt_env, 0); + * //put ':' in the starting of the string so that program can distinguish between '?' and ':' + * while ((opt = utils_getopt(&getopt_env, argc, argv, ":if:lr")) != -1) { + * switch(opt) + * { + * case 'i': + * case 'l': + * case 'r': + * printf("option: %c\r\n", opt); + * break; + * case 'f': + * printf("filename: %s\r\n", getopt_env.optarg); + * break; + * case ':': + printf("%s: %c requires an argument\r\n", *argv, getopt_env.optopt); + * break; + * case '?': + * printf("unknow option: %c\r\n", getopt_env.optopt); + * break; + * } + * } + * //optind is for the extra arguments which are not parsed + * for(; getopt_env.optind < argc; getopt_env.optind++){ + * printf("extra arguments: %s\r\n", argv[getopt_env.optind]); + * } + * + * } + * @endcode + */ +int utils_getopt(getopt_env_t *env, int argc, char *const argv[], const char *optstring); + +void get_bytearray_from_string(char **params, uint8_t *result, int array_size); +void get_uint8_from_string(char **params, uint8_t *result); +void get_uint16_from_string(char **params, uint16_t *result); +void get_uint32_from_string(char **params, uint32_t *result); +void utils_parse_number(const char *str, char sep, uint8_t *buf, int buflen, int base); +void utils_parse_number_adv(const char *str, char sep, uint8_t *buf, int buflen, int base, int *count); +unsigned long long convert_arrayToU64(uint8_t *inputArray); +void convert_u64ToArray(unsigned long long inputU64, uint8_t result[8]); +void utils_memdrain8(void *src, size_t len); +void utils_memdrain16(void *src, size_t len); +void utils_memdrain32(void *src, size_t len); +void utils_memdrain64(void *src, size_t len); +void *utils_memdrain8_with_check(void *src, size_t len, uint8_t seq); +void *utils_memdrain16_with_check(void *src, size_t len, uint16_t seq); +void *utils_memdrain32_with_check(void *src, size_t len, uint32_t seq); +void *utils_memdrain64_with_check(void *src, size_t len, uint64_t seq); + +#ifdef __cplusplus +} +#endif + +#endif /* __GETOPT_H__ */ diff --git a/src/lib/CherryUSB/tests/hpmicro/src/main.c b/src/lib/CherryUSB/tests/hpmicro/src/main.c new file mode 100644 index 000000000..66c22436b --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/main.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2021 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/* FreeRTOS kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* HPM example includes. */ +#include +#include "board.h" +#include "hpm_clock_drv.h" +#include "hpm_l1c_drv.h" +#include "hpm_gpio_drv.h" +#include "shell.h" +#include "usbh_core.h" +#include "lwip/tcpip.h" +#ifdef CONFIG_USB_EHCI_ISO +#include "usbh_uvc_stream.h" +#include "usbh_uac_stream.h" +#endif + +SDK_DECLARE_EXT_ISR_M(BOARD_CONSOLE_UART_IRQ, shell_uart_isr) + +#define task_start_PRIORITY (configMAX_PRIORITIES - 2U) + +static void task_start(void *param); + +int main(void) +{ + board_init(); + board_init_led_pins(); + board_init_usb((USB_Type *)CONFIG_HPM_USBH_BASE); + + /* set irq priority */ + intc_set_irq_priority(CONFIG_HPM_USBH_IRQn, 1); + + /* Initialize the LwIP stack */ + tcpip_init(NULL, NULL); + + printf("Start usb host task...\r\n"); +#ifdef CONFIG_USB_EHCI_ISO + extern void uvc2lcd_init(void); + + uvc2lcd_init(); +#endif +#ifndef CONFIG_USB_OTG_ENABLE + usbh_initialize(0, CONFIG_HPM_USBH_BASE); +#else + extern void cdc_acm_otg_init(uint8_t busid, uintptr_t reg_base); + cdc_acm_otg_init(0, CONFIG_HPM_USBH_BASE); +#endif + if (pdPASS != xTaskCreate(task_start, "task_start", 1024U, NULL, task_start_PRIORITY, NULL)) { + printf("Task start creation failed!\r\n"); + for (;;) { + ; + } + } + + vTaskStartScheduler(); + printf("Unexpected scheduler exit!\r\n"); + for (;;) { + ; + } + + return 0; +} + +static void task_start(void *param) +{ + (void)param; + + printf("Try to initialize the uart\r\n" + " if you are using the console uart as the shell uart\r\n" + " failure to initialize may result in no log\r\n"); + + uart_config_t shell_uart_config = { 0 }; + uart_default_config(BOARD_CONSOLE_UART_BASE, &shell_uart_config); + shell_uart_config.src_freq_in_hz = clock_get_frequency(BOARD_CONSOLE_UART_CLK_NAME); + shell_uart_config.baudrate = 115200; + + if (status_success != uart_init(BOARD_CONSOLE_UART_BASE, &shell_uart_config)) { + /* uart failed to be initialized */ + printf("Failed to initialize uart\r\n"); + for (;;) { + ; + } + } + + printf("Initialize shell uart successfully\r\n"); + + /* default password is : 12345678 */ + /* shell_init() must be called in-task */ + if (0 != shell_init(BOARD_CONSOLE_UART_BASE, false)) { + /* shell failed to be initialized */ + printf("Failed to initialize shell\r\n"); + for (;;) { + ; + } + } + + printf("Initialize shell successfully\r\n"); + + /* irq must be enabled after shell_init() */ + uart_enable_irq(BOARD_CONSOLE_UART_BASE, uart_intr_rx_data_avail_or_timeout); + intc_m_enable_irq_with_priority(BOARD_CONSOLE_UART_IRQ, 1); + + printf("Enable shell uart interrupt\r\n"); + + printf("Exit start task\r\n"); + vTaskDelete(NULL); +} + +CSH_CMD_EXPORT(lsusb, ); + +#ifdef CONFIG_USB_EHCI_ISO +// clang-format off +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t src_buffer[1024 * 10]; +ATTR_PLACE_AT_WITH_ALIGNMENT(".framebuffer", 64) uint8_t dst_buffer[1024 * 10]; +// clang-format on + +void usb_dma_test() +{ + usbh_video_dma_init(); + for (size_t i = 0; i < 10 * 1024; i++) { + src_buffer[i] = i & 0xff; + } + memset(dst_buffer, 0, 10 * 1024); + + for (uint8_t i = 0; i < 10; i++) { + usbh_video_dma_lli_fill(i, (uint32_t)src_buffer + i * 1024, (uint32_t)dst_buffer + i * 1024, 1024); + } + volatile uint64_t start_tick = hpm_csr_get_core_mcycle(); + usbh_video_dma_start(); + + while (usbh_video_dma_isbusy()) { + } + volatile uint64_t end_tick = hpm_csr_get_core_mcycle(); + + double consumed_seconds = (end_tick - start_tick) * 1.0l / (clock_get_frequency(clock_cpu0) / 1000000); + printf("dma done:%.2f us\n", consumed_seconds); + l1c_dc_invalidate((uint32_t)dst_buffer, 10 * 1024); + for (size_t i = 0; i < 10 * 1024; i++) { + if (dst_buffer[i] != src_buffer[i]) { + printf("error:%d\n", i); + break; + } + } +} + +int dma_test(int argc, char **argv) +{ + usb_dma_test(); + return 0; +} +CSH_CMD_EXPORT(dma_test, ); + +int usbh_uvc_start(int argc, char **argv) +{ + uint8_t type; + + if (argc < 2) { + USB_LOG_ERR("please input correct command: usbh_uvc_start type\r\n"); + USB_LOG_ERR("type 0:yuyv, type 1:mjpeg\r\n"); + return -1; + } + + type = atoi(argv[1]); + usbh_video_stream_start(640, 480, type); + return 0; +} + +CSH_CMD_EXPORT(usbh_uvc_start, usbh_uvc_start); + +int usbh_uvc_stop(int argc, char **argv) +{ + usbh_video_stream_stop(); + return 0; +} + +CSH_CMD_EXPORT(usbh_uvc_stop, usbh_uvc_stop); + +int usbh_uac_start(int argc, char **argv) +{ + uint32_t freq; + + if (argc < 2) { + USB_LOG_ERR("please input correct command: usbh_uac_start freq\r\n"); + return -1; + } + + freq = atoi(argv[1]); + usbh_audio_mic_stream_start(freq); + return 0; +} + +CSH_CMD_EXPORT(usbh_uac_start, usbh_uac_start); + +int usbh_uac_stop(int argc, char **argv) +{ + usbh_audio_mic_stream_stop(); + return 0; +} + +CSH_CMD_EXPORT(usbh_uac_stop, usbh_uac_stop); +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/tests/hpmicro/src/ping.c b/src/lib/CherryUSB/tests/hpmicro/src/ping.c new file mode 100644 index 000000000..49e984a01 --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/ping.c @@ -0,0 +1,257 @@ +/* + * netutils: ping implementation + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * PING_DEBUG: Enable debugging for PING. + */ +#ifndef PING_DEBUG +#define PING_DEBUG LWIP_DBG_ON +#endif + +/** ping receive timeout - in milliseconds */ +#define PING_RCV_TIMEO (2000 * portTICK_PERIOD_MS) +/** ping delay - in milliseconds */ +#define PING_DELAY (1000 * portTICK_PERIOD_MS) + +/** ping identifier - must fit on a u16_t */ +#ifndef PING_ID +#define PING_ID 0xAFAF +#endif + +/** ping additional data size to include in the packet */ +#ifndef PING_DATA_SIZE +#define PING_DATA_SIZE 32 +#endif + +/* ping variables */ +static u16_t ping_seq_num; +struct _ip_addr { + uint8_t addr0, addr1, addr2, addr3; +}; + +/** Prepare a echo ICMP request */ +static void ping_prepare_echo(struct icmp_echo_hdr *iecho, u16_t len) +{ + size_t i; + size_t data_len = len - sizeof(struct icmp_echo_hdr); + + ICMPH_TYPE_SET(iecho, ICMP_ECHO); + ICMPH_CODE_SET(iecho, 0); + iecho->chksum = 0; + iecho->id = PING_ID; + iecho->seqno = htons(++ping_seq_num); + + /* fill the additional data buffer with some data */ + for (i = 0; i < data_len; i++) { + ((char *)iecho)[sizeof(struct icmp_echo_hdr) + i] = (char)i; + } + + iecho->chksum = inet_chksum(iecho, len); +} + +/* Ping using the socket ip */ +err_t lwip_ping_send(int s, ip_addr_t *addr, int size) +{ + int err; + struct icmp_echo_hdr *iecho; + struct sockaddr_in to; + int ping_size = sizeof(struct icmp_echo_hdr) + size; + LWIP_ASSERT("ping_size is too big", ping_size <= 0xffff); + + iecho = mem_malloc(ping_size); + if (iecho == NULL) { + return ERR_MEM; + } + + ping_prepare_echo(iecho, (u16_t)ping_size); + + to.sin_len = sizeof(to); + to.sin_family = AF_INET; +#if LWIP_IPV4 && LWIP_IPV6 + to.sin_addr.s_addr = addr->u_addr.ip4.addr; +#elif LWIP_IPV4 + to.sin_addr.s_addr = addr->addr; +#elif LWIP_IPV6 +#error Not supported IPv6. +#endif + + err = lwip_sendto(s, iecho, ping_size, 0, (struct sockaddr *)&to, sizeof(to)); + mem_free(iecho); + + return (err == ping_size ? ERR_OK : ERR_VAL); +} + +int lwip_ping_recv(int s, int *ttl) +{ + char buf[64]; + int fromlen = sizeof(struct sockaddr_in), len; + struct sockaddr_in from; + struct ip_hdr *iphdr; + struct icmp_echo_hdr *iecho; + + while ((len = lwip_recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *)&from, (socklen_t *)&fromlen)) > 0) { + if (len >= (int)(sizeof(struct ip_hdr) + sizeof(struct icmp_echo_hdr))) { + iphdr = (struct ip_hdr *)buf; + iecho = (struct icmp_echo_hdr *)(buf + (IPH_HL(iphdr) * 4)); + if ((iecho->id == PING_ID) && (iecho->seqno == htons(ping_seq_num))) { + *ttl = iphdr->_ttl; + return len; + } + } + } + + return len; +} + +/* using the lwIP custom ping */ +uint32_t cmd_ping(char *target_name, uint16_t interval, uint16_t size, uint32_t count) +{ +#if LWIP_VERSION_MAJOR >= 2U + struct timeval timeout = { PING_RCV_TIMEO / (1000 * portTICK_PERIOD_MS), PING_RCV_TIMEO % (1000 * portTICK_PERIOD_MS) }; +#else + int timeout = PING_RCV_TIMEO * 1000UL / (1000 * portTICK_PERIOD_MS); +#endif + + int s, ttl = 0, recv_len; + ip_addr_t target_addr; + uint32_t send_times; + uint32_t recv_start_tick; + struct addrinfo hint, *res = NULL; + struct sockaddr_in *h = NULL; + struct in_addr ina; + + send_times = 0; + ping_seq_num = 0; + + if (size == 0) { + size = PING_DATA_SIZE; + } + + memset(&hint, 0, sizeof(hint)); + /* convert URL to IP */ + if (lwip_getaddrinfo(target_name, NULL, &hint, &res) != 0) { + printf("ping: unknown host %s\n\r", target_name); + return -1; + } + memcpy(&h, &res->ai_addr, sizeof(struct sockaddr_in *)); + memcpy(&ina, &h->sin_addr, sizeof(ina)); + lwip_freeaddrinfo(res); + if (inet_aton(inet_ntoa(ina), &target_addr) == 0) { + printf("ping: unknown host %s\n\r", target_name); + return -1; + } + /* new a socket */ + if ((s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP)) < 0) { + printf("ping: create socket failed\n\r"); + return -1; + } + + lwip_setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + + while (1) { + int elapsed_time; + + if (lwip_ping_send(s, &target_addr, size) == ERR_OK) { + recv_start_tick = sys_now(); + if ((recv_len = lwip_ping_recv(s, &ttl)) >= 0) { + elapsed_time = (sys_now() - recv_start_tick) * 1000UL / (1000 * portTICK_PERIOD_MS); + printf("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n\r", recv_len, inet_ntoa(ina), send_times, + ttl, elapsed_time); + } else { + printf("From %s icmp_seq=%d timeout\n\r", inet_ntoa(ina), send_times); + } + } else { + printf("Send %s - error\n\r", inet_ntoa(ina)); + } + + send_times++; + if (send_times >= count) { + /* send ping times reached, stop */ + break; + } + + vTaskDelay(interval); /* take a delay */ + } + + lwip_close(s); + + return 0; +} + +#include +#include "utils_getopt.h" + +#define PING_USAGE \ +"ping [-c count] [-i interval] [-s size] [-h help] destination\r\n" \ +"\t\t-c count of ping requests. default is 4\r\n" \ +"\t\t-i interval in ms. default is 1000\r\n" \ +"\t\t-s ICMP payload size in bytes. default is 32\r\n" \ +"\t\t-h print this help\r\n" + +int ping(int argc, char **argv) +{ + int opt; + getopt_env_t getopt_env; + u16_t interval = PING_DELAY; + u16_t data_size = PING_DATA_SIZE; + u32_t total_count = 4; + + if (argc == 1) { + goto usage; + } else { + utils_getopt_init(&getopt_env, 0); + + while ((opt = utils_getopt(&getopt_env, argc, argv, ":i:s:c:W:h")) != -1) { + switch (opt) { + case 'i': + interval = atoi(getopt_env.optarg); + break; + case 's': + data_size = atoi(getopt_env.optarg); + break; + case 'c': + total_count = atoi(getopt_env.optarg); + break; + case 'h': + goto usage; + case ':': + printf("%s: %c requires an argument\r\n", *argv, getopt_env.optopt); + goto usage; + case '?': + printf("%s: unknown option %c\r\n", *argv, getopt_env.optopt); + goto usage; + } + } + + if (getopt_env.optind + 1 == argc) { + cmd_ping(argv[getopt_env.optind], interval, data_size, total_count); + } else { + printf("Need target address\r\n"); + goto usage; + } + } + + return 0; + +usage: + printf("%s", PING_USAGE); + return 0; +} +CSH_CMD_EXPORT(ping, ping network host); + diff --git a/src/lib/CherryUSB/tests/hpmicro/src/uvc2lcd.c b/src/lib/CherryUSB/tests/hpmicro/src/uvc2lcd.c new file mode 100644 index 000000000..71d368652 --- /dev/null +++ b/src/lib/CherryUSB/tests/hpmicro/src/uvc2lcd.c @@ -0,0 +1,157 @@ +#include "board.h" +#include "hpm_lcdc_drv.h" +#include "hpm_l1c_drv.h" +#include "usbh_uvc_stream.h" + +#define LCD BOARD_LCD_BASE +#define PIXEL_FORMAT display_pixel_format_ycbcr422 + +#define IMAGE_WIDTH 640 +#define IMAGE_HEIGHT 480 + +static ATTR_PLACE_AT_WITH_ALIGNMENT(".framebuffer", 64) uint8_t frame_buffer1[IMAGE_WIDTH * IMAGE_HEIGHT * 2]; +static ATTR_PLACE_AT_WITH_ALIGNMENT(".framebuffer", 64) uint8_t frame_buffer2[IMAGE_WIDTH * IMAGE_HEIGHT * 2]; +static struct usbh_videoframe frame_pool[2]; + +void writefont2screen(uint16_t or_x, uint16_t or_y, uint16_t x_end, uint16_t y_end, uint8_t assic_id, uint16_t colour, + uint8_t clearflag, uint8_t *str_font, uint32_t screen_addr, uint16_t font_size) +{ + uint8_t *strdisp; + uint16_t x, y; + uint8_t bit; + uint8_t temp1; + strdisp = (uint8_t *)screen_addr; + str_font += font_size * (assic_id - 0x20); /*get end encode*/ + bit = 0; + for (y = or_y; y <= y_end; y++) { + for (x = or_x; x <= x_end; x++) { + if (clearflag == true) { + *(strdisp + y * (IMAGE_WIDTH * 2) + 2 * x) = colour & 0x00ff; + *(strdisp + y * (IMAGE_WIDTH * 2) + 2 * x + 1) = colour >> 8; + } else { + temp1 = (*str_font) >> bit; + if ((temp1 & 0x01) == 0x01) { + *(strdisp + y * (IMAGE_WIDTH * 2) + 2 * x) = colour & 0x00ff; + *(strdisp + y * (IMAGE_WIDTH * 2) + 2 * x + 1) = colour >> 8; + } else { + *(strdisp + y * (IMAGE_WIDTH * 2) + 2 * x) = 0; + *(strdisp + y * (IMAGE_WIDTH * 2) + 2 * x + 1) = 0; + } + bit++; + if (bit == 8) { + bit = 0; + str_font += 1; + } + } + } + } +} + +char string2font(uint16_t line, uint16_t column, uint8_t *string, uint8_t string_num, uint16_t colour, + uint8_t *str_font, uint32_t screen_addr, uint8_t font_width, uint8_t font_height) +{ + uint8_t i = 0, j = 0, numtemp = 0; + uint16_t or_x, or_y, x_end, y_end; + uint16_t font_stroage_size; + or_x = column * font_width; + or_y = line * font_height; + x_end = or_x + font_width - 1; + y_end = or_y + font_height - 1; + font_stroage_size = font_width * font_height / 8; + for (numtemp = 0; numtemp < string_num; numtemp++) { + if ((*(string + numtemp) != 10) && (*(string + numtemp) != 0)) { /*enter or end*/ + if (*(string + numtemp) != 8) { /*delete*/ + writefont2screen(or_x + font_width * i, or_y + font_height * j, x_end + font_width * i, y_end + font_height * j, + *(string + numtemp), colour, false, str_font, screen_addr, font_stroage_size); + } else { + writefont2screen(or_x + font_width * i, or_y + font_height * j, x_end + font_width * i, y_end + font_height * j, + *(string + numtemp), colour, true, str_font, screen_addr, font_stroage_size); + } + } else if (*(string + numtemp) == 10) { + i = 19; /* jump next line */ + } else if (*(string + numtemp) == 0) { + return true; + } + i++; + if (i * font_width == IMAGE_WIDTH) { + j++; + i = 0; + } + } + return true; +} + +extern const unsigned char nAsciiDot24x48[]; +extern volatile uint32_t g_uvc_fps; + +void usbh_video_run(struct usbh_video *video_class) +{ + usbh_video_stream_start(640, 480, USBH_VIDEO_FORMAT_UNCOMPRESSED); + lcdc_turn_on_display(LCD); +} + +void usbh_video_stop(struct usbh_video *video_class) +{ + usbh_video_stream_stop(); + lcdc_turn_off_display(LCD); +} + +void usbh_video_frame_callback(struct usbh_videoframe *frame) +{ + char font_display_buf[50]; + + //USB_LOG_RAW("frame buf:%p,frame len:%d\r\n", frame->frame_buf, frame->frame_size); + l1c_dc_invalidate((uint32_t)frame->frame_buf, IMAGE_WIDTH * IMAGE_HEIGHT * 2); + sprintf(font_display_buf, "fps:%d", g_uvc_fps); + string2font(1, 1, (uint8_t *)font_display_buf, sizeof(font_display_buf), 0x001f, (uint8_t *)nAsciiDot24x48, (uint32_t)frame->frame_buf, 24, 48); + l1c_dc_writeback((uint32_t)frame->frame_buf, IMAGE_WIDTH * IMAGE_HEIGHT * 2); + lcdc_layer_set_next_buffer(LCD, 0, (uint32_t)frame->frame_buf); +} + +void init_lcd(void) +{ + uint8_t layer_index = 0; + lcdc_config_t config = { 0 }; + lcdc_layer_config_t layer = { 0 }; + + lcdc_get_default_config(LCD, &config); + board_panel_para_to_lcdc(&config); + lcdc_init(LCD, &config); + + lcdc_get_default_layer_config(LCD, &layer, PIXEL_FORMAT, layer_index); + + layer.position_x = (BOARD_LCD_WIDTH - IMAGE_WIDTH) / 2; + layer.position_y = (BOARD_LCD_HEIGHT - IMAGE_HEIGHT) / 2; + layer.width = IMAGE_WIDTH; + layer.height = IMAGE_HEIGHT; + + layer.buffer = core_local_mem_to_sys_address(HPM_CORE0, (uint32_t)frame_buffer1); + layer.alphablend.src_alpha = 0xF4; /* src */ + layer.alphablend.dst_alpha = 0xF0; /* dst */ + layer.alphablend.src_alpha_op = display_alpha_op_override; + layer.alphablend.dst_alpha_op = display_alpha_op_override; + layer.background.u = 0xffff0000; + layer.alphablend.mode = display_alphablend_mode_xor; + + if (status_success != lcdc_config_layer(LCD, layer_index, &layer, true)) { + printf("failed to configure layer\n"); + while (1) + ; + } +} + +void uvc2lcd_init(void) +{ + board_init_lcd(); + init_lcd(); + + frame_pool[0].frame_buf = frame_buffer1; + frame_pool[0].frame_bufsize = IMAGE_WIDTH * IMAGE_HEIGHT * 2; + frame_pool[1].frame_buf = frame_buffer2; + frame_pool[1].frame_bufsize = IMAGE_WIDTH * IMAGE_HEIGHT * 2; + + usbh_video_stream_init(5, frame_pool, 2); + + extern void usbh_video_fps_init(void); + usbh_video_fps_init(); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/croutine.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/croutine.c new file mode 100644 index 000000000..d9bce9b03 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/croutine.c @@ -0,0 +1,363 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +/* Remove the whole file is co-routines are not being used. */ +#if ( configUSE_CO_ROUTINES != 0 ) + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ + #ifdef portREMOVE_STATIC_QUALIFIER + #define static + #endif + + +/* Lists for ready and blocked co-routines. --------------------*/ + static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ + static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */ + static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ + static List_t * pxDelayedCoRoutineList = NULL; /*< Points to the delayed co-routine list currently being used. */ + static List_t * pxOverflowDelayedCoRoutineList = NULL; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ + static List_t xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + +/* Other file private variables. --------------------------------*/ + CRCB_t * pxCurrentCoRoutine = NULL; + static UBaseType_t uxTopCoRoutineReadyPriority = 0; + static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + +/* The initial state of the co-routine when it is created. */ + #define corINITIAL_STATE ( 0 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * This macro accesses the co-routine ready lists and therefore must not be + * used from within an ISR. + */ + #define prvAddCoRoutineToReadyQueue( pxCRCB ) \ + { \ + if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ + } \ + vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ + } + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first co-routine. + */ + static void prvInitialiseCoRoutineLists( void ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * in the pending ready list in order that they can later be moved to the ready + * list by the co-routine scheduler. + */ + static void prvCheckPendingReadyList( void ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * meaning once one co-routine has been found whose timer has not expired + * we need not look any further down the list. + */ + static void prvCheckDelayedList( void ); + +/*-----------------------------------------------------------*/ + + BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, + UBaseType_t uxPriority, + UBaseType_t uxIndex ) + { + BaseType_t xReturn; + CRCB_t * pxCoRoutine; + + /* Allocate the memory that will store the co-routine control block. */ + pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); + + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + * be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* Set the co-routine control block as a link back from the ListItem_t. + * This is so we can get back to the containing CRCB from a generic item + * in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); + + /* Now the co-routine has been initialised it can be added to the ready + * list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, + List_t * pxEventList ) + { + TickType_t xTimeToWake; + + /* Calculate the time to wake - this may overflow but this is + * not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + * ourselves to the blocked list as the same list item is used for + * both lists. */ + ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + * overflow list. */ + vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + * current block list. */ + vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + * function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } + } +/*-----------------------------------------------------------*/ + + static void prvCheckPendingReadyList( void ) + { + /* Are there any co-routines waiting to get moved to the ready list? These + * are co-routines that have been readied by an ISR. The ISR cannot access + * the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + CRCB_t * pxUnblockedCRCB; + + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyCoRoutineList ) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); + + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } + } +/*-----------------------------------------------------------*/ + + static void prvCheckDelayedList( void ) + { + CRCB_t * pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + List_t * pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. If there are + * any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + * section. If this is the case then the generic list item will + * have been moved to the pending ready list and the following + * line is still valid. Also the pvContainer parameter will have + * been set to NULL so the following lines are also valid. */ + ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pxContainer ) + { + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; + } +/*-----------------------------------------------------------*/ + + void vCoRoutineSchedule( void ) + { + /* Only run a co-routine after prvInitialiseCoRoutineLists() has been + * called. prvInitialiseCoRoutineLists() is called automatically when a + * co-routine is created. */ + if( pxDelayedCoRoutineList != NULL ) + { + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); + + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); + + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + + --uxTopCoRoutineReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + * of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + } + } +/*-----------------------------------------------------------*/ + + static void prvInitialiseCoRoutineLists( void ) + { + UBaseType_t uxPriority; + + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } + + vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); + + /* Start with pxDelayedCoRoutineList using list1 and the + * pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; + } +/*-----------------------------------------------------------*/ + + BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList ) + { + CRCB_t * pxUnblockedCRCB; + BaseType_t xReturn; + + /* This function is called from within an interrupt. It can only access + * event lists and the pending ready list. This function assumes that a + * check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES == 0 */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/event_groups.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/event_groups.c new file mode 100644 index 000000000..93d9d0d76 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/event_groups.c @@ -0,0 +1,777 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "event_groups.h" + +/* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */ + +/* The following bit fields convey control information in a task's event list + * item value. It is important they don't clash with the + * taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ +#if configUSE_16_BIT_TICKS == 1 + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U + #define eventWAIT_FOR_ALL_BITS 0x0400U + #define eventEVENT_BITS_CONTROL_BYTES 0xff00U +#else + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL + #define eventWAIT_FOR_ALL_BITS 0x04000000UL + #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL +#endif + +typedef struct EventGroupDef_t +{ + EventBits_t uxEventBits; + List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */ + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupNumber; + #endif + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */ + #endif +} EventGroup_t; + +/*-----------------------------------------------------------*/ + +/* + * Test the bits set in uxCurrentEventBits to see if the wait condition is met. + * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is + * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor + * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the + * wait condition is met if any of the bits set in uxBitsToWait for are also set + * in uxCurrentEventBits. + */ +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) + { + EventGroup_t * pxEventBits; + + /* A StaticEventGroup_t object must be provided. */ + configASSERT( pxEventGroupBuffer ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticEventGroup_t equals the size of the real + * event group structure. */ + volatile size_t xSize = sizeof( StaticEventGroup_t ); + configASSERT( xSize == sizeof( EventGroup_t ) ); + } /*lint !e529 xSize is referenced if configASSERT() is defined. */ + #endif /* configASSERT_DEFINED */ + + /* The user has provided a statically allocated event group - use it. */ + pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */ + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note that + * this event group was created statically in case the event group + * is later deleted. */ + pxEventBits->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + /* xEventGroupCreateStatic should only ever be called with + * pxEventGroupBuffer pointing to a pre-allocated (compile time + * allocated) StaticEventGroup_t variable. */ + traceEVENT_GROUP_CREATE_FAILED(); + } + + return pxEventBits; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreate( void ) + { + EventGroup_t * pxEventBits; + + /* Allocate the event group. Justification for MISRA deviation as + * follows: pvPortMalloc() always ensures returned memory blocks are + * aligned per the requirements of the MCU stack. In this case + * pvPortMalloc() must return a pointer that is guaranteed to meet the + * alignment requirements of the EventGroup_t structure - which (if you + * follow it through) is the alignment requirements of the TickType_t type + * (EventBits_t being of TickType_t itself). Therefore, whenever the + * stack alignment requirements are greater than or equal to the + * TickType_t alignment requirements the cast is safe. In other cases, + * where the natural word size of the architecture is less than + * sizeof( TickType_t ), the TickType_t variables will be accessed in two + * or more reads operations, and the alignment requirements is only that + * of each individual read. */ + pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */ + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note this + * event group was allocated statically in case the event group is + * later deleted. */ + pxEventBits->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); /*lint !e9063 Else branch only exists to allow tracing and does not generate code if trace macros are not defined. */ + } + + return pxEventBits; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) +{ + EventBits_t uxOriginalBitValue, uxReturn; + EventGroup_t * pxEventBits = xEventGroup; + BaseType_t xAlreadyYielded; + BaseType_t xTimeoutOccurred = pdFALSE; + + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + uxOriginalBitValue = pxEventBits->uxEventBits; + + ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); + + if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + /* All the rendezvous bits are now set - no need to block. */ + uxReturn = ( uxOriginalBitValue | uxBitsToSet ); + + /* Rendezvous always clear the bits. They will have been cleared + * already unless this is the only task in the rendezvous. */ + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + + xTicksToWait = 0; + } + else + { + if( xTicksToWait != ( TickType_t ) 0 ) + { + traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); + + /* Store the bits that the calling task is waiting for in the + * task's event list item so the kernel knows when a match is + * found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); + + /* This assignment is obsolete as uxReturn will get set after + * the task unblocks, but some compilers mistakenly generate a + * warning about uxReturn being returned without being set if the + * assignment is omitted. */ + uxReturn = 0; + } + else + { + /* The rendezvous bits were not set, but no block time was + * specified - just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + xTimeoutOccurred = pdTRUE; + } + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + * point either the required bits were set or the block time expired. If + * the required bits were set they will have been stored in the task's + * event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + /* The task timed out, just return the current event bit value. */ + taskENTER_CRITICAL(); + { + uxReturn = pxEventBits->uxEventBits; + + /* Although the task got here because it timed out before the + * bits it was waiting for were set, it is possible that since it + * unblocked another task has set the bits. If this is the case + * then it needs to clear the bits before exiting. */ + if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* Control bits might be set as the task had blocked should not be + * returned. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); + + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) +{ + EventGroup_t * pxEventBits = xEventGroup; + EventBits_t uxReturn, uxControlBits = 0; + BaseType_t xWaitConditionMet, xAlreadyYielded; + BaseType_t xTimeoutOccurred = pdFALSE; + + /* Check the user is not attempting to wait on the bits used by the kernel + * itself, and that at least one bit is being requested. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; + + /* Check to see if the wait condition is already met or not. */ + xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); + + if( xWaitConditionMet != pdFALSE ) + { + /* The wait condition has already been met so there is no need to + * block. */ + uxReturn = uxCurrentEventBits; + xTicksToWait = ( TickType_t ) 0; + + /* Clear the wait bits if requested to do so. */ + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The wait condition has not been met, but no block time was + * specified, so just return the current value. */ + uxReturn = uxCurrentEventBits; + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task is going to block to wait for its required bits to be + * set. uxControlBits are used to remember the specified behaviour of + * this call to xEventGroupWaitBits() - for use when the event bits + * unblock the task. */ + if( xClearOnExit != pdFALSE ) + { + uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xWaitForAllBits != pdFALSE ) + { + uxControlBits |= eventWAIT_FOR_ALL_BITS; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the bits that the calling task is waiting for in the + * task's event list item so the kernel knows when a match is + * found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); + + /* This is obsolete as it will get set after the task unblocks, but + * some compilers mistakenly generate a warning about the variable + * being returned without being set if it is not done. */ + uxReturn = 0; + + traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + * point either the required bits were set or the block time expired. If + * the required bits were set they will have been stored in the task's + * event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + taskENTER_CRITICAL(); + { + /* The task timed out, just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + + /* It is possible that the event bits were updated between this + * task leaving the Blocked state and running again. */ + if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) + { + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xTimeoutOccurred = pdTRUE; + } + taskEXIT_CRITICAL(); + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* The task blocked so control bits may have been set. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) +{ + EventGroup_t * pxEventBits = xEventGroup; + EventBits_t uxReturn; + + /* Check the user is not attempting to clear the bits used by the kernel + * itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + taskENTER_CRITICAL(); + { + traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); + + /* The value returned is the event group value prior to the bits being + * cleared. */ + uxReturn = pxEventBits->uxEventBits; + + /* Clear the bits. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ + + return xReturn; + } + +#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) +{ + UBaseType_t uxSavedInterruptStatus; + EventGroup_t const * const pxEventBits = xEventGroup; + EventBits_t uxReturn; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + uxReturn = pxEventBits->uxEventBits; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return uxReturn; +} /*lint !e818 EventGroupHandle_t is a typedef used in other functions to so can't be pointer to const. */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) +{ + ListItem_t * pxListItem, * pxNext; + ListItem_t const * pxListEnd; + List_t const * pxList; + EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; + EventGroup_t * pxEventBits = xEventGroup; + BaseType_t xMatchFound = pdFALSE; + + /* Check the user is not attempting to set the bits used by the kernel + * itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + pxList = &( pxEventBits->xTasksWaitingForBits ); + pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + vTaskSuspendAll(); + { + traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); + + pxListItem = listGET_HEAD_ENTRY( pxList ); + + /* Set the bits. */ + pxEventBits->uxEventBits |= uxBitsToSet; + + /* See if the new bit value should unblock any tasks. */ + while( pxListItem != pxListEnd ) + { + pxNext = listGET_NEXT( pxListItem ); + uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); + xMatchFound = pdFALSE; + + /* Split the bits waited for from the control bits. */ + uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; + uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; + + if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) + { + /* Just looking for single bit being set. */ + if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) + { + xMatchFound = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) + { + /* All bits are set. */ + xMatchFound = pdTRUE; + } + else + { + /* Need all bits to be set, but not all the bits were set. */ + } + + if( xMatchFound != pdFALSE ) + { + /* The bits match. Should the bits be cleared on exit? */ + if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) + { + uxBitsToClear |= uxBitsWaitedFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the actual event flag value in the task's event list + * item before removing the task from the event list. The + * eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows + * that is was unblocked due to its required bits matching, rather + * than because it timed out. */ + vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + /* Move onto the next list item. Note pxListItem->pxNext is not + * used here as the list item may have been removed from the event list + * and inserted into the ready/pending reading list. */ + pxListItem = pxNext; + } + + /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT + * bit was set in the control word. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + ( void ) xTaskResumeAll(); + + return pxEventBits->uxEventBits; +} +/*-----------------------------------------------------------*/ + +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ + EventGroup_t * pxEventBits = xEventGroup; + const List_t * pxTasksWaitingForBits; + + configASSERT( pxEventBits ); + + pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); + + vTaskSuspendAll(); + { + traceEVENT_GROUP_DELETE( xEventGroup ); + + while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) + { + /* Unblock the task, returning 0 as the event list is being deleted + * and cannot therefore have any bits set. */ + configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); + vTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The event group can only have been allocated dynamically - free + * it again. */ + vPortFree( pxEventBits ); + } + #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The event group could have been allocated statically or + * dynamically, so check before attempting to free the memory. */ + if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxEventBits ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + ( void ) xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'set bits' command that was pended from + * an interrupt. */ +void vEventGroupSetBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToSet ) +{ + ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'clear bits' command that was pended from + * an interrupt. */ +void vEventGroupClearBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToClear ) +{ + ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xWaitForAllBits ) +{ + BaseType_t xWaitConditionMet = pdFALSE; + + if( xWaitForAllBits == pdFALSE ) + { + /* Task only has to wait for one bit within uxBitsToWaitFor to be + * set. Is one already set? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Task has to wait for all the bits in uxBitsToWaitFor to be set. + * Are they set already? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return xWaitConditionMet; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + BaseType_t * pxHigherPriorityTaskWoken ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ + + return xReturn; + } + +#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) + { + UBaseType_t xReturn; + EventGroup_t const * pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ + + if( xEventGroup == NULL ) + { + xReturn = 0; + } + else + { + xReturn = pxEventBits->uxEventGroupNumber; + } + + return xReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vEventGroupSetNumber( void * xEventGroup, + UBaseType_t uxEventGroupNumber ) + { + ( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/FreeRTOS.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/FreeRTOS.h new file mode 100644 index 000000000..383f04a70 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/FreeRTOS.h @@ -0,0 +1,1362 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include + +/* + * If stdint.h cannot be located then: + * + If using GCC ensure the -nostdint options is *not* being used. + * + Ensure the project's include path includes the directory in which your + * compiler stores stdint.h. + * + Set any compiler options necessary for it to support C99, as technically + * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any + * other way). + * + The FreeRTOS download includes a simple stdint.h definition that can be + * used in cases where none is provided by the compiler. The files only + * contains the typedefs required to build FreeRTOS. Read the instructions + * in FreeRTOS/source/stdint.readme for more information. + */ +#include /* READ COMMENT ABOVE. */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + +/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +/* Required if struct _reent is used. */ +#if ( configUSE_NEWLIB_REENTRANT == 1 ) + #include +#endif + +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configMINIMAL_STACK_SIZE + #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. +#endif + +#ifndef configMAX_PRIORITIES + #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#if configMAX_PRIORITIES < 1 + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. +#endif + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_16_BIT_TICKS + #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_CO_ROUTINES + #define configUSE_CO_ROUTINES 0 +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #define INCLUDE_vTaskPrioritySet 0 +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #define INCLUDE_uxTaskPriorityGet 0 +#endif + +#ifndef INCLUDE_vTaskDelete + #define INCLUDE_vTaskDelete 0 +#endif + +#ifndef INCLUDE_vTaskSuspend + #define INCLUDE_vTaskSuspend 0 +#endif + +#ifdef INCLUDE_xTaskDelayUntil + #ifdef INCLUDE_vTaskDelayUntil + +/* INCLUDE_vTaskDelayUntil was replaced by INCLUDE_xTaskDelayUntil. Backward + * compatibility is maintained if only one or the other is defined, but + * there is a conflict if both are defined. */ + #error INCLUDE_vTaskDelayUntil and INCLUDE_xTaskDelayUntil are both defined. INCLUDE_vTaskDelayUntil is no longer required and should be removed + #endif +#endif + +#ifndef INCLUDE_xTaskDelayUntil + #ifdef INCLUDE_vTaskDelayUntil + +/* If INCLUDE_vTaskDelayUntil is set but INCLUDE_xTaskDelayUntil is not then + * the project's FreeRTOSConfig.h probably pre-dates the introduction of + * xTaskDelayUntil and setting INCLUDE_xTaskDelayUntil to whatever + * INCLUDE_vTaskDelayUntil is set to will ensure backward compatibility. + */ + #define INCLUDE_xTaskDelayUntil INCLUDE_vTaskDelayUntil + #endif +#endif + +#ifndef INCLUDE_xTaskDelayUntil + #define INCLUDE_xTaskDelayUntil 0 +#endif + +#ifndef INCLUDE_vTaskDelay + #define INCLUDE_vTaskDelay 0 +#endif + +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 0 +#endif + +#ifndef INCLUDE_xTaskAbortDelay + #define INCLUDE_xTaskAbortDelay 0 +#endif + +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 0 +#endif + +#ifndef INCLUDE_xSemaphoreGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder +#endif + +#ifndef INCLUDE_xTaskGetHandle + #define INCLUDE_xTaskGetHandle 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark2 + #define INCLUDE_uxTaskGetStackHighWaterMark2 0 +#endif + +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 0 +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 0 +#endif + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 0 +#endif + +#if configUSE_CO_ROUTINES != 0 + #ifndef configMAX_CO_ROUTINE_PRIORITIES + #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. + #endif +#endif + +#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK + #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 +#endif + +/* configPRECONDITION should be defined as configASSERT. + * The CBMC proofs need a way to track assumptions and assertions. + * A configPRECONDITION statement should express an implicit invariant or + * assumption made. A configASSERT statement should express an invariant that must + * hold explicit before calling the code. */ +#ifndef configPRECONDITION + #define configPRECONDITION( X ) configASSERT( X ) + #define configPRECONDITION_DEFINED 0 +#else + #define configPRECONDITION_DEFINED 1 +#endif + +#ifndef portMEMORY_BARRIER + #define portMEMORY_BARRIER() +#endif + +#ifndef portSOFTWARE_BARRIER + #define portSOFTWARE_BARRIER() +#endif + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + +#endif /* configUSE_TIMERS */ + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#endif + +#ifndef portCLEAN_UP_TCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef portPRE_TASK_DELETE_HOOK + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) +#endif + +#ifndef portSETUP_TCB + #define portSETUP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1 ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) + #define pcQueueGetName( xQueue ) +#endif + +#ifndef portPOINTER_SIZE_TYPE + #define portPOINTER_SIZE_TYPE uint32_t +#endif + +/* Remove any unused trace macros. */ +#ifndef traceSTART + +/* Used to perform any necessary initialisation - for example, open a file + * into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + +/* Use to close a trace, for example close a file into which trace has been + * written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + +/* Called after a task has been selected to run. pxCurrentTCB holds a pointer + * to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceINCREASE_TICK_COUNT + +/* Called before stepping the tick count after waking from tickless idle + * sleep. */ + #define traceINCREASE_TICK_COUNT( x ) +#endif + +#ifndef traceLOW_POWER_IDLE_BEGIN + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() +#endif + +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() +#endif + +#ifndef traceTASK_SWITCHED_OUT + +/* Called before a task has been selected to run. pxCurrentTCB holds a pointer + * to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceTASK_PRIORITY_INHERIT + +/* Called when a task attempts to take a mutex that is already held by a + * lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task + * that holds the mutex. uxInheritedPriority is the priority the mutex holder + * will inherit (the priority of the task that is attempting to obtain the + * muted. */ + #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) +#endif + +#ifndef traceTASK_PRIORITY_DISINHERIT + +/* Called when a task releases a mutex, the holding of which had resulted in + * the task inheriting the priority of a higher priority task. + * pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the + * mutex. uxOriginalPriority is the task's configured (base) priority. */ + #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + +/* Task is about to block because it cannot read from a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the read was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_PEEK + +/* Task is about to block because it cannot read from a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the read was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + +/* Task is about to block because it cannot write to a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the write was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +#ifndef configRECORD_STACK_HIGH_ADDRESS + #define configRECORD_STACK_HIGH_ADDRESS 0 +#endif + +#ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H + #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceMOVED_TASK_TO_READY_STATE + #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef tracePOST_MOVED_TASK_TO_READY_STATE + #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED( ucQueueType ) +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SET_SEND + #define traceQUEUE_SET_SEND traceQUEUE_SEND +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FAILED + #define traceQUEUE_PEEK_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL( x ) +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef traceEVENT_GROUP_CREATE + #define traceEVENT_GROUP_CREATE( xEventGroup ) +#endif + +#ifndef traceEVENT_GROUP_CREATE_FAILED + #define traceEVENT_GROUP_CREATE_FAILED() +#endif + +#ifndef traceEVENT_GROUP_SYNC_BLOCK + #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_SYNC_END + #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK + #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_END + #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_DELETE + #define traceEVENT_GROUP_DELETE( xEventGroup ) +#endif + +#ifndef tracePEND_FUNC_CALL + #define tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, ret ) +#endif + +#ifndef tracePEND_FUNC_CALL_FROM_ISR + #define tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, ret ) +#endif + +#ifndef traceQUEUE_REGISTRY_ADD + #define traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ) +#endif + +#ifndef traceTASK_NOTIFY_TAKE_BLOCK + #define traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY_TAKE + #define traceTASK_NOTIFY_TAKE( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY_WAIT_BLOCK + #define traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY_WAIT + #define traceTASK_NOTIFY_WAIT( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY + #define traceTASK_NOTIFY( uxIndexToNotify ) +#endif + +#ifndef traceTASK_NOTIFY_FROM_ISR + #define traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify ) +#endif + +#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR + #define traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE_FAILED + #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED + #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE + #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_DELETE + #define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RESET + #define traceSTREAM_BUFFER_RESET( xStreamBuffer ) +#endif + +#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND + #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND + #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND_FAILED + #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND_FROM_ISR + #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent ) +#endif + +#ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE + #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE + #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE_FAILED + #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR + #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef portSUPPRESS_TICKS_AND_SLEEP + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) +#endif + +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 +#endif + +#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 + #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 +#endif + +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 +#endif + +#ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING + #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPRE_SLEEP_PROCESSING + #define configPRE_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPOST_SLEEP_PROCESSING + #define configPOST_SLEEP_PROCESSING( x ) +#endif + +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 0 +#endif + +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef portALLOCATE_SECURE_CONTEXT + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) +#endif + +#ifndef portDONT_DISCARD + #define portDONT_DISCARD +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 0 +#endif + +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +#ifndef mtCOVERAGE_TEST_DELAY + #define mtCOVERAGE_TEST_DELAY() +#endif + +#ifndef portASSERT_IF_IN_ISR + #define portASSERT_IF_IN_ISR() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +#ifndef configAPPLICATION_ALLOCATED_HEAP + #define configAPPLICATION_ALLOCATED_HEAP 0 +#endif + +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif + +#ifndef configTASK_NOTIFICATION_ARRAY_ENTRIES + #define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 +#endif + +#if configTASK_NOTIFICATION_ARRAY_ENTRIES < 1 + #error configTASK_NOTIFICATION_ARRAY_ENTRIES must be at least 1 +#endif + +#ifndef configUSE_POSIX_ERRNO + #define configUSE_POSIX_ERRNO 0 +#endif + +#ifndef portTICK_TYPE_IS_ATOMIC + #define portTICK_TYPE_IS_ATOMIC 0 +#endif + +#ifndef configSUPPORT_STATIC_ALLOCATION + /* Defaults to 0 for backward compatibility. */ + #define configSUPPORT_STATIC_ALLOCATION 0 +#endif + +#ifndef configSUPPORT_DYNAMIC_ALLOCATION + /* Defaults to 1 for backward compatibility. */ + #define configSUPPORT_DYNAMIC_ALLOCATION 1 +#endif + +#ifndef configSTACK_DEPTH_TYPE + +/* Defaults to uint16_t for backward compatibility, but can be overridden + * in FreeRTOSConfig.h if uint16_t is too restrictive. */ + #define configSTACK_DEPTH_TYPE uint16_t +#endif + +#ifndef configRUN_TIME_COUNTER_TYPE + +/* Defaults to uint32_t for backward compatibility, but can be overridden in + * FreeRTOSConfig.h if uint32_t is too restrictive. */ + + #define configRUN_TIME_COUNTER_TYPE uint32_t +#endif + +#ifndef configMESSAGE_BUFFER_LENGTH_TYPE + +/* Defaults to size_t for backward compatibility, but can be overridden + * in FreeRTOSConfig.h if lengths will always be less than the number of bytes + * in a size_t. */ + #define configMESSAGE_BUFFER_LENGTH_TYPE size_t +#endif + +/* Sanity check the configuration. */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + #if ( INCLUDE_vTaskSuspend != 1 ) + #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 + #endif /* INCLUDE_vTaskSuspend */ +#endif /* configUSE_TICKLESS_IDLE */ + +#if ( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. +#endif + +#if ( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) + #error configUSE_MUTEXES must be set to 1 to use recursive mutexes +#endif + +#ifndef configINITIAL_TICK_COUNT + #define configINITIAL_TICK_COUNT 0 +#endif + +#if ( portTICK_TYPE_IS_ATOMIC == 0 ) + +/* Either variables of tick type cannot be read atomically, or + * portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when + * the tick count is returned to the standard critical section macros. */ + #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) +#else + +/* The tick type can be read atomically, so critical sections used when the + * tick count is returned can be defined away. */ + #define portTICK_TYPE_ENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x +#endif /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */ + +/* Definitions to allow backward compatibility with FreeRTOS versions prior to + * V8 if desired. */ +#ifndef configENABLE_BACKWARD_COMPATIBILITY + #define configENABLE_BACKWARD_COMPATIBILITY 1 +#endif + +#ifndef configPRINTF + +/* configPRINTF() was not defined, so define it away to nothing. To use + * configPRINTF() then define it as follows (where MyPrintFunction() is + * provided by the application writer): + * + * void MyPrintFunction(const char *pcFormat, ... ); + #define configPRINTF( X ) MyPrintFunction X + * + * Then call like a standard printf() function, but placing brackets around + * all parameters so they are passed as a single parameter. For example: + * configPRINTF( ("Value = %d", MyVariable) ); */ + #define configPRINTF( X ) +#endif + +#ifndef configMAX + +/* The application writer has not provided their own MAX macro, so define + * the following generic implementation. */ + #define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#endif + +#ifndef configMIN + +/* The application writer has not provided their own MIN macro, so define + * the following generic implementation. */ + #define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) +#endif + +#if configENABLE_BACKWARD_COMPATIBILITY == 1 + #define eTaskStateGet eTaskGetState + #define portTickType TickType_t + #define xTaskHandle TaskHandle_t + #define xQueueHandle QueueHandle_t + #define xSemaphoreHandle SemaphoreHandle_t + #define xQueueSetHandle QueueSetHandle_t + #define xQueueSetMemberHandle QueueSetMemberHandle_t + #define xTimeOutType TimeOut_t + #define xMemoryRegion MemoryRegion_t + #define xTaskParameters TaskParameters_t + #define xTaskStatusType TaskStatus_t + #define xTimerHandle TimerHandle_t + #define xCoRoutineHandle CoRoutineHandle_t + #define pdTASK_HOOK_CODE TaskHookFunction_t + #define portTICK_RATE_MS portTICK_PERIOD_MS + #define pcTaskGetTaskName pcTaskGetName + #define pcTimerGetTimerName pcTimerGetName + #define pcQueueGetQueueName pcQueueGetName + #define vTaskGetTaskInfo vTaskGetInfo + #define xTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter + +/* Backward compatibility within the scheduler code only - these definitions + * are not really required but are included for completeness. */ + #define tmrTIMER_CALLBACK TimerCallbackFunction_t + #define pdTASK_CODE TaskFunction_t + #define xListItem ListItem_t + #define xList List_t + +/* For libraries that break the list data hiding, and access list structure + * members directly (which is not supposed to be done). */ + #define pxContainer pvContainer +#endif /* configENABLE_BACKWARD_COMPATIBILITY */ + +#if ( configUSE_ALTERNATIVE_API != 0 ) + #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 +#endif + +/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even + * if floating point hardware is otherwise supported by the FreeRTOS port in use. + * This constant is not supported by all FreeRTOS ports that include floating + * point support. */ +#ifndef configUSE_TASK_FPU_SUPPORT + #define configUSE_TASK_FPU_SUPPORT 1 +#endif + +/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is + * currently used in ARMv8M ports. */ +#ifndef configENABLE_MPU + #define configENABLE_MPU 0 +#endif + +/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is + * currently used in ARMv8M ports. */ +#ifndef configENABLE_FPU + #define configENABLE_FPU 1 +#endif + +/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it. + * This is currently used in ARMv8M ports. */ +#ifndef configENABLE_TRUSTZONE + #define configENABLE_TRUSTZONE 1 +#endif + +/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on + * the Secure Side only. */ +#ifndef configRUN_FREERTOS_SECURE_ONLY + #define configRUN_FREERTOS_SECURE_ONLY 0 +#endif + +#ifndef configRUN_ADDITIONAL_TESTS + #define configRUN_ADDITIONAL_TESTS 0 +#endif + + +/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using + * dynamically allocated RAM, in which case when any task is deleted it is known + * that both the task's stack and TCB need to be freed. Sometimes the + * FreeRTOSConfig.h settings only allow a task to be created using statically + * allocated RAM, in which case when any task is deleted it is known that neither + * the task's stack or TCB should be freed. Sometimes the FreeRTOSConfig.h + * settings allow a task to be created using either statically or dynamically + * allocated RAM, in which case a member of the TCB is used to record whether the + * stack and/or TCB were allocated statically or dynamically, so when a task is + * deleted the RAM that was allocated dynamically is freed again and no attempt is + * made to free the RAM that was allocated statically. + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a + * task to be created using either statically or dynamically allocated RAM. Note + * that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with + * a statically allocated stack and a dynamically allocated TCB. + * + * The following table lists various combinations of portUSING_MPU_WRAPPERS, + * configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and + * when it is possible to have both static and dynamic allocation: + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + * | MPU | Dynamic | Static | Available Functions | Possible Allocations | Both Dynamic and | Need Free | + * | | | | | | Static Possible | | + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + * | 0 | 0 | 1 | xTaskCreateStatic | TCB - Static, Stack - Static | No | No | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 0 | 1 | 0 | xTaskCreate | TCB - Dynamic, Stack - Dynamic | No | Yes | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 0 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateStatic | 2. TCB - Static, Stack - Static | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 0 | 1 | xTaskCreateStatic, | TCB - Static, Stack - Static | No | No | + * | | | | xTaskCreateRestrictedStatic | | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 1 | 0 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateRestricted | 2. TCB - Dynamic, Stack - Static | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateStatic, | 2. TCB - Dynamic, Stack - Static | | | + * | | | | xTaskCreateRestricted, | 3. TCB - Static, Stack - Static | | | + * | | | | xTaskCreateRestrictedStatic | | | | + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + */ +#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE \ + ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \ + ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) ) + +/* + * In line with software engineering best practice, FreeRTOS implements a strict + * data hiding policy, so the real structures used by FreeRTOS to maintain the + * state of tasks, queues, semaphores, etc. are not accessible to the application + * code. However, if the application writer wants to statically allocate such + * an object then the size of the object needs to be known. Dummy structures + * that are guaranteed to have the same size and alignment requirements of the + * real objects are used for this purpose. The dummy list and list item + * structures below are used for inclusion in such a dummy structure. + */ +struct xSTATIC_LIST_ITEM +{ + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void * pvDummy3[ 4 ]; + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy4; + #endif +}; +typedef struct xSTATIC_LIST_ITEM StaticListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +struct xSTATIC_MINI_LIST_ITEM +{ + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void * pvDummy3[ 2 ]; +}; +typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +typedef struct xSTATIC_LIST +{ + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + UBaseType_t uxDummy2; + void * pvDummy3; + StaticMiniListItem_t xDummy4; + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy5; + #endif +} StaticList_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Task structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a task then + * the size of the task object needs to be known. The StaticTask_t structure + * below is provided for this purpose. Its sizes and alignment requirements are + * guaranteed to match those of the genuine structure, no matter which + * architecture is being used, and no matter how the values in FreeRTOSConfig.h + * are set. Its contents are somewhat obfuscated in the hope users will + * recognise that it would be unwise to make direct use of the structure members. + */ +typedef struct xSTATIC_TCB +{ + void * pxDummy1; + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xDummy2; + #endif + StaticListItem_t xDummy3[ 2 ]; + UBaseType_t uxDummy5; + void * pxDummy6; + uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + void * pxDummy8; + #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxDummy9; + #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy10[ 2 ]; + #endif + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxDummy12[ 2 ]; + #endif + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void * pxDummy14; + #endif + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + configRUN_TIME_COUNTER_TYPE ulDummy16; + #endif + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + struct _reent xDummy17; + #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t ulDummy18[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + uint8_t ucDummy19[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + #endif + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + uint8_t uxDummy20; + #endif + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDummy21; + #endif + #if ( configUSE_POSIX_ERRNO == 1 ) + int iDummy22; + #endif +} StaticTask_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Queue structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a queue + * then the size of the queue object needs to be known. The StaticQueue_t + * structure below is provided for this purpose. Its sizes and alignment + * requirements are guaranteed to match those of the genuine structure, no + * matter which architecture is being used, and no matter how the values in + * FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in the hope + * users will recognise that it would be unwise to make direct use of the + * structure members. + */ +typedef struct xSTATIC_QUEUE +{ + void * pvDummy1[ 3 ]; + + union + { + void * pvDummy2; + UBaseType_t uxDummy2; + } u; + + StaticList_t xDummy3[ 2 ]; + UBaseType_t uxDummy4[ 3 ]; + uint8_t ucDummy5[ 2 ]; + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy6; + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + void * pvDummy7; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy8; + uint8_t ucDummy9; + #endif +} StaticQueue_t; +typedef StaticQueue_t StaticSemaphore_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the event group structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create an event group then the size of the event group object needs to be + * know. The StaticEventGroup_t structure below is provided for this purpose. + * Its sizes and alignment requirements are guaranteed to match those of the + * genuine structure, no matter which architecture is being used, and no matter + * how the values in FreeRTOSConfig.h are set. Its contents are somewhat + * obfuscated in the hope users will recognise that it would be unwise to make + * direct use of the structure members. + */ +typedef struct xSTATIC_EVENT_GROUP +{ + TickType_t xDummy1; + StaticList_t xDummy2; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy3; + #endif + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy4; + #endif +} StaticEventGroup_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the software timer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a software timer then the size of the queue object needs to be known. + * The StaticTimer_t structure below is provided for this purpose. Its sizes + * and alignment requirements are guaranteed to match those of the genuine + * structure, no matter which architecture is being used, and no matter how the + * values in FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in + * the hope users will recognise that it would be unwise to make direct use of + * the structure members. + */ +typedef struct xSTATIC_TIMER +{ + void * pvDummy1; + StaticListItem_t xDummy2; + TickType_t xDummy3; + void * pvDummy5; + TaskFunction_t pvDummy6; + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy7; + #endif + uint8_t ucDummy8; +} StaticTimer_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the stream buffer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a stream buffer then the size of the stream buffer object needs to be + * known. The StaticStreamBuffer_t structure below is provided for this + * purpose. Its size and alignment requirements are guaranteed to match those + * of the genuine structure, no matter which architecture is being used, and + * no matter how the values in FreeRTOSConfig.h are set. Its contents are + * somewhat obfuscated in the hope users will recognise that it would be unwise + * to make direct use of the structure members. + */ +typedef struct xSTATIC_STREAM_BUFFER +{ + size_t uxDummy1[ 4 ]; + void * pvDummy2[ 3 ]; + uint8_t ucDummy3; + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy4; + #endif +} StaticStreamBuffer_t; + +/* Message buffers are built on stream buffers. */ +typedef StaticStreamBuffer_t StaticMessageBuffer_t; + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* INC_FREERTOS_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/StackMacros.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/StackMacros.h new file mode 100644 index 000000000..6ddeb3a95 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/StackMacros.h @@ -0,0 +1,34 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef _MSC_VER /* Visual Studio doesn't support #warning. */ + #warning The name of this file has changed to stack_macros.h. Please update your code accordingly. This source file (which has the original name) will be removed in future released. +#endif + +#include "stack_macros.h" diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/atomic.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/atomic.h new file mode 100644 index 000000000..8d7c1076f --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/atomic.h @@ -0,0 +1,419 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * @file atomic.h + * @brief FreeRTOS atomic operation support. + * + * This file implements atomic functions by disabling interrupts globally. + * Implementations with architecture specific atomic instructions can be + * provided under each compiler directory. + */ + +#ifndef ATOMIC_H +#define ATOMIC_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include atomic.h" +#endif + +/* Standard includes. */ +#include + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* + * Port specific definitions -- entering/exiting critical section. + * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h + * + * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with + * ATOMIC_ENTER_CRITICAL(). + * + */ +#if defined( portSET_INTERRUPT_MASK_FROM_ISR ) + +/* Nested interrupt scheme is supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() \ + UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR() + + #define ATOMIC_EXIT_CRITICAL() \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType ) + +#else + +/* Nested interrupt scheme is NOT supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() portENTER_CRITICAL() + #define ATOMIC_EXIT_CRITICAL() portEXIT_CRITICAL() + +#endif /* portSET_INTERRUPT_MASK_FROM_ISR() */ + +/* + * Port specific definition -- "always inline". + * Inline is compiler specific, and may not always get inlined depending on your + * optimization level. Also, inline is considered as performance optimization + * for atomic. Thus, if portFORCE_INLINE is not provided by portmacro.h, + * instead of resulting error, simply define it away. + */ +#ifndef portFORCE_INLINE + #define portFORCE_INLINE +#endif + +#define ATOMIC_COMPARE_AND_SWAP_SUCCESS 0x1U /**< Compare and swap succeeded, swapped. */ +#define ATOMIC_COMPARE_AND_SWAP_FAILURE 0x0U /**< Compare and swap failed, did not swap. */ + +/*----------------------------- Swap && CAS ------------------------------*/ + +/** + * Atomic compare-and-swap + * + * @brief Performs an atomic compare-and-swap operation on the specified values. + * + * @param[in, out] pulDestination Pointer to memory location from where value is + * to be loaded and checked. + * @param[in] ulExchange If condition meets, write this value to memory. + * @param[in] ulComparand Swap condition. + * + * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. + * + * @note This function only swaps *pulDestination with ulExchange, if previous + * *pulDestination value equals ulComparand. + */ +static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination, + uint32_t ulExchange, + uint32_t ulComparand ) +{ + uint32_t ulReturnValue; + + ATOMIC_ENTER_CRITICAL(); + { + if( *pulDestination == ulComparand ) + { + *pulDestination = ulExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } + else + { + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + } + } + ATOMIC_EXIT_CRITICAL(); + + return ulReturnValue; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic swap (pointers) + * + * @brief Atomically sets the address pointed to by *ppvDestination to the value + * of *pvExchange. + * + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and written back to. + * @param[in] pvExchange Pointer value to be written to *ppvDestination. + * + * @return The initial value of *ppvDestination. + */ +static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange ) +{ + void * pReturnValue; + + ATOMIC_ENTER_CRITICAL(); + { + pReturnValue = *ppvDestination; + *ppvDestination = pvExchange; + } + ATOMIC_EXIT_CRITICAL(); + + return pReturnValue; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic compare-and-swap (pointers) + * + * @brief Performs an atomic compare-and-swap operation on the specified pointer + * values. + * + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and checked. + * @param[in] pvExchange If condition meets, write this value to memory. + * @param[in] pvComparand Swap condition. + * + * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. + * + * @note This function only swaps *ppvDestination with pvExchange, if previous + * *ppvDestination value equals pvComparand. + */ +static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange, + void * pvComparand ) +{ + uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + + ATOMIC_ENTER_CRITICAL(); + { + if( *ppvDestination == pvComparand ) + { + *ppvDestination = pvExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } + } + ATOMIC_EXIT_CRITICAL(); + + return ulReturnValue; +} + + +/*----------------------------- Arithmetic ------------------------------*/ + +/** + * Atomic add + * + * @brief Atomically adds count to the value of the specified pointer points to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * @param[in] ulCount Value to be added to *pulAddend. + * + * @return previous *pulAddend value. + */ +static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend += ulCount; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic subtract + * + * @brief Atomically subtracts count from the value of the specified pointer + * pointers to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * @param[in] ulCount Value to be subtract from *pulAddend. + * + * @return previous *pulAddend value. + */ +static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend -= ulCount; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic increment + * + * @brief Atomically increments the value of the specified pointer points to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * + * @return *pulAddend value before increment. + */ +static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend += 1; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic decrement + * + * @brief Atomically decrements the value of the specified pointer points to + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * + * @return *pulAddend value before decrement. + */ +static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend -= 1; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} + +/*----------------------------- Bitwise Logical ------------------------------*/ + +/** + * Atomic OR + * + * @brief Performs an atomic OR operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be ORed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination |= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic AND + * + * @brief Performs an atomic AND operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be ANDed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination &= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic NAND + * + * @brief Performs an atomic NAND operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be NANDed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination = ~( ulCurrent & ulValue ); + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic XOR + * + * @brief Performs an atomic XOR operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be XORed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination ^= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* ATOMIC_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/croutine.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/croutine.h new file mode 100644 index 000000000..51bdd4f3d --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/croutine.h @@ -0,0 +1,753 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* Used to hide the implementation of the co-routine control block. The + * control block structure however has to be included in the header due to + * the macro implementation of the co-routine functionality. */ +typedef void * CoRoutineHandle_t; + +/* Defines the prototype to which co-routine functions must conform. */ +typedef void (* crCOROUTINE_CODE)( CoRoutineHandle_t, + UBaseType_t ); + +typedef struct corCoRoutineControlBlock +{ + crCOROUTINE_CODE pxCoRoutineFunction; + ListItem_t xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + ListItem_t xEventListItem; /*< List item used to place the CRCB in event lists. */ + UBaseType_t uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + UBaseType_t uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + uint16_t uxState; /*< Used internally by the co-routine implementation. */ +} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ + +/** + * croutine. h + * @code{c} + * BaseType_t xCoRoutineCreate( + * crCOROUTINE_CODE pxCoRoutineCode, + * UBaseType_t uxPriority, + * UBaseType_t uxIndex + * ); + * @endcode + * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * list, otherwise an error code defined with ProjDefs.h. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * // This may not be necessary for const variables. + * static const char cLedToFlash[ 2 ] = { 5, 6 }; + * static const TickType_t uxFlashRates[ 2 ] = { 200, 400 }; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // This co-routine just delays for a fixed period, then toggles + * // an LED. Two co-routines are created using this function, so + * // the uxIndex parameter is used to tell the co-routine which + * // LED to flash and how int32_t to delay. This assumes xQueue has + * // already been created. + * vParTestToggleLED( cLedToFlash[ uxIndex ] ); + * crDELAY( xHandle, uxFlashRates[ uxIndex ] ); + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * + * // Function that creates two co-routines. + * void vOtherFunction( void ) + * { + * uint8_t ucParameterToPass; + * TaskHandle_t xHandle; + * + * // Create two co-routines at priority 0. The first is given index 0 + * // so (from the code above) toggles LED 5 every 200 ticks. The second + * // is given index 1 so toggles LED 6 every 400 ticks. + * for( uxIndex = 0; uxIndex < 2; uxIndex++ ) + * { + * xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex ); + * } + * } + * @endcode + * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, + UBaseType_t uxPriority, + UBaseType_t uxIndex ); + + +/** + * croutine. h + * @code{c} + * void vCoRoutineSchedule( void ); + * @endcode + * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * hook). + * + * Example usage: + * @code{c} + * // This idle task hook will schedule a co-routine each time it is called. + * // The rest of the idle task will execute between co-routine calls. + * void vApplicationIdleHook( void ) + * { + * vCoRoutineSchedule(); + * } + * + * // Alternatively, if you do not require any other part of the idle task to + * // execute, the idle task hook can call vCoRoutineSchedule() within an + * // infinite loop. + * void vApplicationIdleHook( void ) + * { + * for( ;; ) + * { + * vCoRoutineSchedule(); + * } + * } + * @endcode + * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + * @code{c} + * crSTART( CoRoutineHandle_t xHandle ); + * @endcode + * + * This macro MUST always be called at the start of a co-routine function. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static int32_t ulAVariable; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Co-routine functionality goes here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) \ + switch( ( ( CRCB_t * ) ( pxCRCB ) )->uxState ) { \ + case 0: + +/** + * croutine. h + * @code{c} + * crEND(); + * @endcode + * + * This macro MUST always be called at the end of a co-routine function. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static int32_t ulAVariable; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Co-routine functionality goes here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crEND() } + +/* + * These macros are intended for internal use by the co-routine implementation + * only. The macros should not be used directly by application writers. + */ +#define crSET_STATE0( xHandle ) \ + ( ( CRCB_t * ) ( xHandle ) )->uxState = ( __LINE__ * 2 ); return; \ + case ( __LINE__ * 2 ): +#define crSET_STATE1( xHandle ) \ + ( ( CRCB_t * ) ( xHandle ) )->uxState = ( ( __LINE__ * 2 ) + 1 ); return; \ + case ( ( __LINE__ * 2 ) + 1 ): + +/** + * croutine. h + * @code{c} + * crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay ); + * @endcode + * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_PERIOD_MS + * can be used to convert ticks to milliseconds. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * // This may not be necessary for const variables. + * // We are to delay for 200ms. + * static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Delay for 200ms. + * crDELAY( xHandle, xDelayTime ); + * + * // Do something here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); + +/** + * @code{c} + * crQUEUE_SEND( + * CoRoutineHandle_t xHandle, + * QueueHandle_t pxQueue, + * void *pvItemToQueue, + * TickType_t xTicksToWait, + * BaseType_t *pxResult + * ) + * @endcode + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * error defined within ProjDefs.h. + * + * Example usage: + * @code{c} + * // Co-routine function that blocks for a fixed period then posts a number onto + * // a queue. + * static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static BaseType_t xNumberToPost = 0; + * static BaseType_t xResult; + * + * // Co-routines must begin with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // This assumes the queue has already been created. + * crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult ); + * + * if( xResult != pdPASS ) + * { + * // The message was not posted! + * } + * + * // Increment the number to be posted onto the queue. + * xNumberToPost++; + * + * // Delay for 100 ticks. + * crDELAY( xHandle, 100 ); + * } + * + * // Co-routines must end with a call to crEND(). + * crEND(); + * } + * @endcode + * \defgroup crQUEUE_SEND crQUEUE_SEND + * \ingroup Tasks + */ +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ + { \ + *( pxResult ) = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ + } + +/** + * croutine. h + * @code{c} + * crQUEUE_RECEIVE( + * CoRoutineHandle_t xHandle, + * QueueHandle_t pxQueue, + * void *pvBuffer, + * TickType_t xTicksToWait, + * BaseType_t *pxResult + * ) + * @endcode + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * an error code as defined within ProjDefs.h. + * + * Example usage: + * @code{c} + * // A co-routine receives the number of an LED to flash from a queue. It + * // blocks on the queue until the number is received. + * static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static BaseType_t xResult; + * static UBaseType_t uxLEDToFlash; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Wait for data to become available on the queue. + * crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + * + * if( xResult == pdPASS ) + * { + * // We received the LED to flash - flash it! + * vParTestToggleLED( uxLEDToFlash ); + * } + * } + * + * crEND(); + * } + * @endcode + * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ + { \ + *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ + } + +/** + * croutine. h + * @code{c} + * crQUEUE_SEND_FROM_ISR( + * QueueHandle_t pxQueue, + * void *pvItemToQueue, + * BaseType_t xCoRoutinePreviouslyWoken + * ) + * @endcode + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * the ISR. + * + * Example usage: + * @code{c} + * // A co-routine that blocks on a queue waiting for characters to be received. + * static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * char cRxedChar; + * BaseType_t xResult; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Wait for data to become available on the queue. This assumes the + * // queue xCommsRxQueue has already been created! + * crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + * + * // Was a character received? + * if( xResult == pdPASS ) + * { + * // Process the character here. + * } + * } + * + * // All co-routines must end with a call to crEND(). + * crEND(); + * } + * + * // An ISR that uses a queue to send characters received on a serial port to + * // a co-routine. + * void vUART_ISR( void ) + * { + * char cRxedChar; + * BaseType_t xCRWokenByPost = pdFALSE; + * + * // We loop around reading characters until there are none left in the UART. + * while( UART_RX_REG_NOT_EMPTY() ) + * { + * // Obtain the character from the UART. + * cRxedChar = UART_RX_REG; + * + * // Post the character onto a queue. xCRWokenByPost will be pdFALSE + * // the first time around the loop. If the post causes a co-routine + * // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE. + * // In this manner we can ensure that if more than one co-routine is + * // blocked on the queue only one is woken by this ISR no matter how + * // many characters are posted to the queue. + * xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost ); + * } + * } + * @endcode + * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) \ + xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + * @code{c} + * crQUEUE_SEND_FROM_ISR( + * QueueHandle_t pxQueue, + * void *pvBuffer, + * BaseType_t * pxCoRoutineWoken + * ) + * @endcode + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * pdFALSE. + * + * Example usage: + * @code{c} + * // A co-routine that posts a character to a queue then blocks for a fixed + * // period. The character is incremented each time. + * static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // cChar holds its value while this co-routine is blocked and must therefore + * // be declared static. + * static char cCharToTx = 'a'; + * BaseType_t xResult; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Send the next character to the queue. + * crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult ); + * + * if( xResult == pdPASS ) + * { + * // The character was successfully posted to the queue. + * } + * else + * { + * // Could not post the character to the queue. + * } + * + * // Enable the UART Tx interrupt to cause an interrupt in this + * // hypothetical UART. The interrupt will obtain the character + * // from the queue and send it. + * ENABLE_RX_INTERRUPT(); + * + * // Increment to the next character then block for a fixed period. + * // cCharToTx will maintain its value across the delay as it is + * // declared static. + * cCharToTx++; + * if( cCharToTx > 'x' ) + * { + * cCharToTx = 'a'; + * } + * crDELAY( 100 ); + * } + * + * // All co-routines must end with a call to crEND(). + * crEND(); + * } + * + * // An ISR that uses a queue to receive characters to send on a UART. + * void vUART_ISR( void ) + * { + * char cCharToTx; + * BaseType_t xCRWokenByPost = pdFALSE; + * + * while( UART_TX_REG_EMPTY() ) + * { + * // Are there any characters in the queue waiting to be sent? + * // xCRWokenByPost will automatically be set to pdTRUE if a co-routine + * // is woken by the post - ensuring that only a single co-routine is + * // woken no matter how many times we go around this loop. + * if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) ) + * { + * SEND_CHARACTER( cCharToTx ); + * } + * } + * } + * @endcode + * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) \ + xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) + +/* + * This function is intended for internal use by the co-routine macros only. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * Removes the current co-routine from its ready list and places it in the + * appropriate delayed list. + */ +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, + List_t * pxEventList ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * Removes the highest priority co-routine from the event list and places it in + * the pending ready list. + */ +BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList ); + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* CO_ROUTINE_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/deprecated_definitions.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/deprecated_definitions.h new file mode 100644 index 000000000..a83314124 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/deprecated_definitions.h @@ -0,0 +1,281 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef DEPRECATED_DEFINITIONS_H +#define DEPRECATED_DEFINITIONS_H + + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a + * pre-processor definition was used to ensure the pre-processor found the correct + * portmacro.h file for the port being used. That scheme was deprecated in favour + * of setting the compiler's include path such that it found the correct + * portmacro.h file - removing the need for the constant and allowing the + * portmacro.h file to be located anywhere in relation to the port being used. The + * definitions below remain in the code for backward compatibility only. New + * projects should not use them. */ + +#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef GCC_MEGA_AVR + #include "../portable/GCC/ATMega323/portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR + #include "../portable/IAR/ATMega323/portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" +#endif + +#ifdef _FEDPICC + #include "libFreeRTOS/Include/portmacro.h" +#endif + +#ifdef SDCC_CYGNAL + #include "../../Source/portable/SDCC/Cygnal/portmacro.h" +#endif + +#ifdef GCC_ARM7 + #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx + #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 + #include "../../Source/portable/GCC/MSP430F449/portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 + #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC + #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S + #include "../../Source/portable/GCC/H8S2329/portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 + #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 + #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR + #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC + #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 + #include "../../Source/portable/GCC/HCS12/portmacro.h" +#endif + +#ifdef GCC_MCF5235 + #include "../../Source/portable/GCC/MCF5235/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC + #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR + #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" +#endif + +#ifdef GCC_PPC405 + #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" +#endif + +#ifdef GCC_PPC440 + #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" +#endif + +#ifdef BCC_INDUSTRIAL_PC_PORT + +/* A short file name has to be used in place of the normal + * FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef BCC_FLASH_LITE_186_PORT + +/* A short file name has to be used in place of the normal + * FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#endif /* DEPRECATED_DEFINITIONS_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/event_groups.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/event_groups.h new file mode 100644 index 000000000..601a29ba9 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/event_groups.h @@ -0,0 +1,777 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef EVENT_GROUPS_H +#define EVENT_GROUPS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" +#endif + +/* FreeRTOS includes. */ +#include "timers.h" + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/** + * An event group is a collection of bits to which an application can assign a + * meaning. For example, an application may create an event group to convey + * the status of various CAN bus related events in which bit 0 might mean "A CAN + * message has been received and is ready for processing", bit 1 might mean "The + * application has queued a message that is ready for sending onto the CAN + * network", and bit 2 might mean "It is time to send a SYNC message onto the + * CAN network" etc. A task can then test the bit values to see which events + * are active, and optionally enter the Blocked state to wait for a specified + * bit or a group of specified bits to be active. To continue the CAN bus + * example, a CAN controlling task can enter the Blocked state (and therefore + * not consume any processing time) until either bit 0, bit 1 or bit 2 are + * active, at which time the bit that was actually active would inform the task + * which action it had to take (process a received message, send a message, or + * send a SYNC). + * + * The event groups implementation contains intelligence to avoid race + * conditions that would otherwise occur were an application to use a simple + * variable for the same purpose. This is particularly important with respect + * to when a bit within an event group is to be cleared, and when bits have to + * be set and then tested atomically - as is the case where event groups are + * used to create a synchronisation point between multiple tasks (a + * 'rendezvous'). + * + * \defgroup EventGroup + */ + + + +/** + * event_groups.h + * + * Type by which event groups are referenced. For example, a call to + * xEventGroupCreate() returns an EventGroupHandle_t variable that can then + * be used as a parameter to other event group functions. + * + * \defgroup EventGroupHandle_t EventGroupHandle_t + * \ingroup EventGroup + */ +struct EventGroupDef_t; +typedef struct EventGroupDef_t * EventGroupHandle_t; + +/* + * The type that holds event bits always matches TickType_t - therefore the + * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, + * 32 bits if set to 0. + * + * \defgroup EventBits_t EventBits_t + * \ingroup EventGroup + */ +typedef TickType_t EventBits_t; + +/** + * event_groups.h + * @code{c} + * EventGroupHandle_t xEventGroupCreate( void ); + * @endcode + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGroupCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see https://www.FreeRTOS.org/a00111.html). If an event group is created + * using xEventGroupCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @return If the event group was created then a handle to the event group is + * returned. If there was insufficient FreeRTOS heap available to create the + * event group then NULL is returned. See https://www.FreeRTOS.org/a00111.html + * + * Example usage: + * @code{c} + * // Declare a variable to hold the created event group. + * EventGroupHandle_t xCreatedEventGroup; + * + * // Attempt to create the event group. + * xCreatedEventGroup = xEventGroupCreate(); + * + * // Was the event group created successfully? + * if( xCreatedEventGroup == NULL ) + * { + * // The event group was not created because there was insufficient + * // FreeRTOS heap available. + * } + * else + * { + * // The event group was created. + * } + * @endcode + * \defgroup xEventGroupCreate xEventGroupCreate + * \ingroup EventGroup + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + * @code{c} + * EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer ); + * @endcode + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGroupCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see https://www.FreeRTOS.org/a00111.html). If an event group is created + * using xEventGroupCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type + * StaticEventGroup_t, which will be then be used to hold the event group's data + * structures, removing the need for the memory to be allocated dynamically. + * + * @return If the event group was created then a handle to the event group is + * returned. If pxEventGroupBuffer was NULL then NULL is returned. + * + * Example usage: + * @code{c} + * // StaticEventGroup_t is a publicly accessible structure that has the same + * // size and alignment requirements as the real event group structure. It is + * // provided as a mechanism for applications to know the size of the event + * // group (which is dependent on the architecture and configuration file + * // settings) without breaking the strict data hiding policy by exposing the + * // real event group internals. This StaticEventGroup_t variable is passed + * // into the xSemaphoreCreateEventGroupStatic() function and is used to store + * // the event group's data structures + * StaticEventGroup_t xEventGroupBuffer; + * + * // Create the event group without dynamically allocating any memory. + * xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer ); + * @endcode + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + * const EventBits_t uxBitsToWaitFor, + * const BaseType_t xClearOnExit, + * const BaseType_t xWaitForAllBits, + * const TickType_t xTicksToWait ); + * @endcode + * + * [Potentially] block to wait for one or more bits to be set within a + * previously created event group. + * + * This function cannot be called from an interrupt. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and/or bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within + * uxBitsToWaitFor that are set within the event group will be cleared before + * xEventGroupWaitBits() returns if the wait condition was met (if the function + * returns for a reason other than a timeout). If xClearOnExit is set to + * pdFALSE then the bits set in the event group are not altered when the call to + * xEventGroupWaitBits() returns. + * + * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then + * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor + * are set or the specified block time expires. If xWaitForAllBits is set to + * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set + * in uxBitsToWaitFor is set or the specified block time expires. The block + * time is specified by the xTicksToWait parameter. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for one/all (depending on the xWaitForAllBits value) of the bits specified by + * uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupWaitBits() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupWaitBits() returned because the bits it was waiting for were set + * then the returned value is the event group value before any bits were + * automatically cleared in the case that xClearOnExit parameter was set to + * pdTRUE. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; + * + * // Wait a maximum of 100ms for either bit 0 or bit 4 to be set within + * // the event group. Clear the bits before exiting. + * uxBits = xEventGroupWaitBits( + * xEventGroup, // The event group being tested. + * BIT_0 | BIT_4, // The bits within the event group to wait for. + * pdTRUE, // BIT_0 and BIT_4 should be cleared before returning. + * pdFALSE, // Don't wait for both bits, either bit will do. + * xTicksToWait ); // Wait a maximum of 100ms for either bit to be set. + * + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // xEventGroupWaitBits() returned because both bits were set. + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // xEventGroupWaitBits() returned because just BIT_0 was set. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // xEventGroupWaitBits() returned because just BIT_4 was set. + * } + * else + * { + * // xEventGroupWaitBits() returned because xTicksToWait ticks passed + * // without either BIT_0 or BIT_4 becoming set. + * } + * } + * @endcode + * \defgroup xEventGroupWaitBits xEventGroupWaitBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); + * @endcode + * + * Clear bits within an event group. This function cannot be called from an + * interrupt. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear + * in the event group. For example, to clear bit 3 only, set uxBitsToClear to + * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. + * + * @return The value of the event group before the specified bits were cleared. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * + * // Clear bit 0 and bit 4 in xEventGroup. + * uxBits = xEventGroupClearBits( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 );// The bits being cleared. + * + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // Both bit 0 and bit 4 were set before xEventGroupClearBits() was + * // called. Both will now be clear (not set). + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // Bit 0 was set before xEventGroupClearBits() was called. It will + * // now be clear. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // Bit 4 was set before xEventGroupClearBits() was called. It will + * // now be clear. + * } + * else + * { + * // Neither bit 0 nor bit 4 were set in the first place. + * } + * } + * @endcode + * \defgroup xEventGroupClearBits xEventGroupClearBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); + * @endcode + * + * A version of xEventGroupClearBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed + * while interrupts are disabled, so protects event groups that are accessed + * from tasks by suspending the scheduler rather than disabling interrupts. As + * a result event groups cannot be accessed directly from an interrupt service + * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the + * timer task to have the clear operation performed in the context of the timer + * task. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. + * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 + * and bit 0 set uxBitsToClear to 0x09. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * // An event group which it is assumed has already been created by a call to + * // xEventGroupCreate(). + * EventGroupHandle_t xEventGroup; + * + * void anInterruptHandler( void ) + * { + * // Clear bit 0 and bit 4 in xEventGroup. + * xResult = xEventGroupClearBitsFromISR( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 ); // The bits being set. + * + * if( xResult == pdPASS ) + * { + * // The message was posted successfully. + * } + * } + * @endcode + * \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR + * \ingroup EventGroup + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) \ + xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) +#endif + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); + * @endcode + * + * Set bits within an event group. + * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() + * is a version that can be called from an interrupt. + * + * Setting bits in an event group will automatically unblock tasks that are + * blocked waiting for the bits. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @return The value of the event group at the time the call to + * xEventGroupSetBits() returns. There are two reasons why the returned value + * might have the bits specified by the uxBitsToSet parameter cleared. First, + * if setting a bit results in a task that was waiting for the bit leaving the + * blocked state then it is possible the bit will be cleared automatically + * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any + * unblocked (or otherwise Ready state) task that has a priority above that of + * the task that called xEventGroupSetBits() will execute and may change the + * event group value before the call to xEventGroupSetBits() returns. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * + * // Set bit 0 and bit 4 in xEventGroup. + * uxBits = xEventGroupSetBits( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 );// The bits being set. + * + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // Both bit 0 and bit 4 remained set when the function returned. + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // Bit 0 remained set when the function returned, but bit 4 was + * // cleared. It might be that bit 4 was cleared automatically as a + * // task that was waiting for bit 4 was removed from the Blocked + * // state. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // Bit 4 remained set when the function returned, but bit 0 was + * // cleared. It might be that bit 0 was cleared automatically as a + * // task that was waiting for bit 0 was removed from the Blocked + * // state. + * } + * else + * { + * // Neither bit 0 nor bit 4 remained set. It might be that a task + * // was waiting for both of the bits to be set, and the bits were + * // cleared as the task left the Blocked state. + * } + * } + * @endcode + * \defgroup xEventGroupSetBits xEventGroupSetBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * A version of xEventGroupSetBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed in + * interrupts or from critical sections. Therefore xEventGroupSetBitsFromISR() + * sends a message to the timer task to have the set operation performed in the + * context of the timer task - where a scheduler lock is used in place of a + * critical section. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task is higher than the priority of the + * currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE by + * xEventGroupSetBitsFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * // An event group which it is assumed has already been created by a call to + * // xEventGroupCreate(). + * EventGroupHandle_t xEventGroup; + * + * void anInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken, xResult; + * + * // xHigherPriorityTaskWoken must be initialised to pdFALSE. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Set bit 0 and bit 4 in xEventGroup. + * xResult = xEventGroupSetBitsFromISR( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 // The bits being set. + * &xHigherPriorityTaskWoken ); + * + * // Was the message posted successfully? + * if( xResult == pdPASS ) + * { + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and + * // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - + * // refer to the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * } + * @endcode + * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR + * \ingroup EventGroup + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) \ + xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) +#endif + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + * const EventBits_t uxBitsToSet, + * const EventBits_t uxBitsToWaitFor, + * TickType_t xTicksToWait ); + * @endcode + * + * Atomically set bits within an event group, then wait for a combination of + * bits to be set within the same event group. This functionality is typically + * used to synchronise multiple tasks, where each task has to wait for the other + * tasks to reach a synchronisation point before proceeding. + * + * This function cannot be used from an interrupt. + * + * The function will return before its block time expires if the bits specified + * by the uxBitsToWait parameter are set, or become set within that time. In + * this case all the bits specified by uxBitsToWait will be automatically + * cleared before the function returns. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToSet The bits to set in the event group before determining + * if, and possibly waiting for, all the bits specified by the uxBitsToWait + * parameter are set. + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for all of the bits specified by uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupSync() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupSync() returned because all the bits it was waiting for were + * set then the returned value is the event group value before any bits were + * automatically cleared. + * + * Example usage: + * @code{c} + * // Bits used by the three tasks. + * #define TASK_0_BIT ( 1 << 0 ) + * #define TASK_1_BIT ( 1 << 1 ) + * #define TASK_2_BIT ( 1 << 2 ) + * + * #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT ) + * + * // Use an event group to synchronise three tasks. It is assumed this event + * // group has already been created elsewhere. + * EventGroupHandle_t xEventBits; + * + * void vTask0( void *pvParameters ) + * { + * EventBits_t uxReturn; + * TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; + * + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 0 in the event flag to note this task has reached the + * // sync point. The other two tasks will set the other two bits defined + * // by ALL_SYNC_BITS. All three tasks have reached the synchronisation + * // point when all the ALL_SYNC_BITS are set. Wait a maximum of 100ms + * // for this to happen. + * uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait ); + * + * if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS ) + * { + * // All three tasks reached the synchronisation point before the call + * // to xEventGroupSync() timed out. + * } + * } + * } + * + * void vTask1( void *pvParameters ) + * { + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 1 in the event flag to note this task has reached the + * // synchronisation point. The other two tasks will set the other two + * // bits defined by ALL_SYNC_BITS. All three tasks have reached the + * // synchronisation point when all the ALL_SYNC_BITS are set. Wait + * // indefinitely for this to happen. + * xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY ); + * + * // xEventGroupSync() was called with an indefinite block time, so + * // this task will only reach here if the synchronisation was made by all + * // three tasks, so there is no need to test the return value. + * } + * } + * + * void vTask2( void *pvParameters ) + * { + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 2 in the event flag to note this task has reached the + * // synchronisation point. The other two tasks will set the other two + * // bits defined by ALL_SYNC_BITS. All three tasks have reached the + * // synchronisation point when all the ALL_SYNC_BITS are set. Wait + * // indefinitely for this to happen. + * xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY ); + * + * // xEventGroupSync() was called with an indefinite block time, so + * // this task will only reach here if the synchronisation was made by all + * // three tasks, so there is no need to test the return value. + * } + * } + * + * @endcode + * \defgroup xEventGroupSync xEventGroupSync + * \ingroup EventGroup + */ +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup ); + * @endcode + * + * Returns the current value of the bits in an event group. This function + * cannot be used from an interrupt. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBits() was called. + * + * \defgroup xEventGroupGetBits xEventGroupGetBits + * \ingroup EventGroup + */ +#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ); + * @endcode + * + * A version of xEventGroupGetBits() that can be called from an ISR. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. + * + * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR + * \ingroup EventGroup + */ +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * void xEventGroupDelete( EventGroupHandle_t xEventGroup ); + * @endcode + * + * Delete an event group that was previously created by a call to + * xEventGroupCreate(). Tasks that are blocked on the event group will be + * unblocked and obtain 0 as the event group's value. + * + * @param xEventGroup The event group being deleted. + */ +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/* For internal use only. */ +void vEventGroupSetBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; +void vEventGroupClearBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; + + +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) PRIVILEGED_FUNCTION; + void vEventGroupSetNumber( void * xEventGroup, + UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION; +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* EVENT_GROUPS_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/list.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/list.h new file mode 100644 index 000000000..f866f9fd5 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/list.h @@ -0,0 +1,499 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * ascending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + + +#ifndef LIST_H +#define LIST_H + +#ifndef INC_FREERTOS_H + #error "FreeRTOS.h must be included before list.h" +#endif + +/* + * The list structure members are modified from within interrupts, and therefore + * by rights should be declared volatile. However, they are only modified in a + * functionally atomic way (within critical sections of with the scheduler + * suspended) and are either passed by reference into a function or indexed via + * a volatile variable. Therefore, in all use cases tested so far, the volatile + * qualifier can be omitted in order to provide a moderate performance + * improvement without adversely affecting functional behaviour. The assembly + * instructions generated by the IAR, ARM and GCC compilers when the respective + * compiler's options were set for maximum optimisation has been inspected and + * deemed to be as intended. That said, as compiler technology advances, and + * especially if aggressive cross module optimisation is used (a use case that + * has not been exercised to any great extend) then it is feasible that the + * volatile qualifier will be needed for correct optimisation. It is expected + * that a compiler removing essential code because, without the volatile + * qualifier on the list structure members and with aggressive cross module + * optimisation, the compiler deemed the code unnecessary will result in + * complete and obvious failure of the scheduler. If this is ever experienced + * then the volatile qualifier can be inserted in the relevant places within the + * list structures by simply defining configLIST_VOLATILE to volatile in + * FreeRTOSConfig.h (as per the example at the bottom of this comment block). + * If configLIST_VOLATILE is not defined then the preprocessor directives below + * will simply #define configLIST_VOLATILE away completely. + * + * To use volatile list structure members then add the following line to + * FreeRTOSConfig.h (without the quotes): + * "#define configLIST_VOLATILE volatile" + */ +#ifndef configLIST_VOLATILE + #define configLIST_VOLATILE +#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* Macros that can be used to place known values within the list structures, + * then check that the known values do not get corrupted during the execution of + * the application. These may catch the list data structures being overwritten in + * memory. They will not catch data errors caused by incorrect configuration or + * use of FreeRTOS.*/ +#if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) + /* Define the macros to do nothing. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) + #define listTEST_LIST_INTEGRITY( pxList ) +#else /* if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) */ + /* Define macros that add new members into the list structures. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; + +/* Define macros that set the new structure members to known values. */ + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + +/* Define macros that will assert if one of the structure members does not + * contain its expected value. */ + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) + #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) +#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ + + +/* + * Definition of the only type of object that a list can contain. + */ +struct xLIST; +struct xLIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in ascending order. */ + struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + struct xLIST * configLIST_VOLATILE pxContainer; /*< Pointer to the list in which this list item is placed (if any). */ + listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +}; +typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ + +struct xMINI_LIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; + struct xLIST_ITEM * configLIST_VOLATILE pxNext; + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; +}; +typedef struct xMINI_LIST_ITEM MiniListItem_t; + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + volatile UBaseType_t uxNumberOfItems; + ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ + MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ + listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +} List_t; + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) + +/* + * Access macro to get the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in ascending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) + +/* + * Access macro to retrieve the value of the list item. The value can + * represent anything - for example the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro to retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) + +/* + * Return the next list item. + * + * \page listGET_NEXT listGET_NEXT + * \ingroup LinkedList + */ +#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) + +/* + * Return the list item that marks the end of the list + * + * \page listGET_END_MARKER listGET_END_MARKER + * \ingroup LinkedList + */ +#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entry's pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxTCB pxTCB is set to the address of the owner of the next list item. + * @param pxList The list from which the next item owner is to be returned. + * + * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ + { \ + List_t * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ + } + +/* + * Version of uxListRemove() that does not return a value. Provided as a slight + * optimisation for xTaskIncrementTick() by being inline. + * + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page listREMOVE_ITEM listREMOVE_ITEM + * \ingroup LinkedList + */ +#define listREMOVE_ITEM( pxItemToRemove ) \ + { \ + /* The list item knows which list it is in. Obtain the list from the list \ + * item. */ \ + List_t * const pxList = ( pxItemToRemove )->pxContainer; \ + \ + ( pxItemToRemove )->pxNext->pxPrevious = ( pxItemToRemove )->pxPrevious; \ + ( pxItemToRemove )->pxPrevious->pxNext = ( pxItemToRemove )->pxNext; \ + /* Make sure the index is left pointing to a valid item. */ \ + if( pxList->pxIndex == ( pxItemToRemove ) ) \ + { \ + pxList->pxIndex = ( pxItemToRemove )->pxPrevious; \ + } \ + \ + ( pxItemToRemove )->pxContainer = NULL; \ + ( pxList->uxNumberOfItems )--; \ + } + +/* + * Inline version of vListInsertEnd() to provide slight optimisation for + * xTaskIncrementTick(). + * + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pxIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pxIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page listINSERT_END listINSERT_END + * \ingroup LinkedList + */ +#define listINSERT_END( pxList, pxNewListItem ) \ + { \ + ListItem_t * const pxIndex = ( pxList )->pxIndex; \ + \ + /* Only effective when configASSERT() is also defined, these tests may catch \ + * the list data structures being overwritten in memory. They will not catch \ + * data errors caused by incorrect configuration or use of FreeRTOS. */ \ + listTEST_LIST_INTEGRITY( ( pxList ) ); \ + listTEST_LIST_ITEM_INTEGRITY( ( pxNewListItem ) ); \ + \ + /* Insert a new list item into ( pxList ), but rather than sort the list, \ + * makes the new list item the last item to be removed by a call to \ + * listGET_OWNER_OF_NEXT_ENTRY(). */ \ + ( pxNewListItem )->pxNext = pxIndex; \ + ( pxNewListItem )->pxPrevious = pxIndex->pxPrevious; \ + \ + pxIndex->pxPrevious->pxNext = ( pxNewListItem ); \ + pxIndex->pxPrevious = ( pxNewListItem ); \ + \ + /* Remember which list the item is in. */ \ + ( pxNewListItem )->pxContainer = ( pxList ); \ + \ + ( ( pxList )->uxNumberOfItems )++; \ + } + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( ( &( ( pxList )->xListEnd ) )->pxNext->pvOwner ) + +/* + * Check to see if a list item is within a list. The list item maintains a + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @param pxListItem The list item we want to know if is in the list. + * @return pdTRUE if the list item is in the list, otherwise pdFALSE. + */ +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) ) + +/* + * Return the list a list item is contained within (referenced from). + * + * @param pxListItem The list item being queried. + * @return A pointer to the List_t object that references the pxListItem + */ +#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) + +/* + * This provides a crude means of knowing if a list has been initialised, as + * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() + * function. + */ +#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (ascending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( List_t * const pxList, + ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pxIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pxIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( List_t * const pxList, + ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page uxListRemove uxListRemove + * \ingroup LinkedList + */ +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* ifndef LIST_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/message_buffer.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/message_buffer.h new file mode 100644 index 000000000..140626737 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/message_buffer.h @@ -0,0 +1,823 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* + * Message buffers build functionality on top of FreeRTOS stream buffers. + * Whereas stream buffers are used to send a continuous stream of data from one + * task or interrupt to another, message buffers are used to send variable + * length discrete messages from one task or interrupt to another. Their + * implementation is light weight, making them particularly suited for interrupt + * to task and core to core communication scenarios. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * timeout to 0. + * + * Message buffers hold variable length messages. To enable that, when a + * message is written to the message buffer an additional sizeof( size_t ) bytes + * are also written to store the message's length (that happens internally, with + * the API function). sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so writing a 10 byte message to a message buffer on a 32-bit + * architecture will actually reduce the available space in the message buffer + * by 14 bytes (10 byte are used by the message, and 4 bytes to hold the length + * of the message). + */ + +#ifndef FREERTOS_MESSAGE_BUFFER_H +#define FREERTOS_MESSAGE_BUFFER_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include message_buffer.h" +#endif + +/* Message buffers are built onto of stream buffers. */ +#include "stream_buffer.h" + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + extern "C" { +#endif +/* *INDENT-ON* */ + +/** + * Type by which message buffers are referenced. For example, a call to + * xMessageBufferCreate() returns an MessageBufferHandle_t variable that can + * then be used as a parameter to xMessageBufferSend(), xMessageBufferReceive(), + * etc. + */ +typedef void * MessageBufferHandle_t; + +/*-----------------------------------------------------------*/ + +/** + * message_buffer.h + * + * @code{c} + * MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes ); + * @endcode + * + * Creates a new message buffer using dynamically allocated memory. See + * xMessageBufferCreateStatic() for a version that uses statically allocated + * memory (memory that is allocated at compile time). + * + * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in + * FreeRTOSConfig.h for xMessageBufferCreate() to be available. + * + * @param xBufferSizeBytes The total number of bytes (not messages) the message + * buffer will be able to hold at any one time. When a message is written to + * the message buffer an additional sizeof( size_t ) bytes are also written to + * store the message's length. sizeof( size_t ) is typically 4 bytes on a + * 32-bit architecture, so on most 32-bit architectures a 10 byte message will + * take up 14 bytes of message buffer space. + * + * @return If NULL is returned, then the message buffer cannot be created + * because there is insufficient heap memory available for FreeRTOS to allocate + * the message buffer data structures and storage area. A non-NULL value being + * returned indicates that the message buffer has been created successfully - + * the returned value should be stored as the handle to the created message + * buffer. + * + * Example use: + * @code{c} + * + * void vAFunction( void ) + * { + * MessageBufferHandle_t xMessageBuffer; + * const size_t xMessageBufferSizeBytes = 100; + * + * // Create a message buffer that can hold 100 bytes. The memory used to hold + * // both the message buffer structure and the messages themselves is allocated + * // dynamically. Each message added to the buffer consumes an additional 4 + * // bytes which are used to hold the lengh of the message. + * xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes ); + * + * if( xMessageBuffer == NULL ) + * { + * // There was not enough heap memory space available to create the + * // message buffer. + * } + * else + * { + * // The message buffer was created successfully and can now be used. + * } + * + * @endcode + * \defgroup xMessageBufferCreate xMessageBufferCreate + * \ingroup MessageBufferManagement + */ +#define xMessageBufferCreate( xBufferSizeBytes ) \ + ( MessageBufferHandle_t ) xStreamBufferGenericCreate( xBufferSizeBytes, ( size_t ) 0, pdTRUE ) + +/** + * message_buffer.h + * + * @code{c} + * MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes, + * uint8_t *pucMessageBufferStorageArea, + * StaticMessageBuffer_t *pxStaticMessageBuffer ); + * @endcode + * Creates a new message buffer using statically allocated memory. See + * xMessageBufferCreate() for a version that uses dynamically allocated memory. + * + * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the + * pucMessageBufferStorageArea parameter. When a message is written to the + * message buffer an additional sizeof( size_t ) bytes are also written to store + * the message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so on most 32-bit architecture a 10 byte message will take up + * 14 bytes of message buffer space. The maximum number of bytes that can be + * stored in the message buffer is actually (xBufferSizeBytes - 1). + * + * @param pucMessageBufferStorageArea Must point to a uint8_t array that is at + * least xBufferSizeBytes big. This is the array to which messages are + * copied when they are written to the message buffer. + * + * @param pxStaticMessageBuffer Must point to a variable of type + * StaticMessageBuffer_t, which will be used to hold the message buffer's data + * structure. + * + * @return If the message buffer is created successfully then a handle to the + * created message buffer is returned. If either pucMessageBufferStorageArea or + * pxStaticmessageBuffer are NULL then NULL is returned. + * + * Example use: + * @code{c} + * + * // Used to dimension the array used to hold the messages. The available space + * // will actually be one less than this, so 999. + #define STORAGE_SIZE_BYTES 1000 + * + * // Defines the memory that will actually hold the messages within the message + * // buffer. + * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; + * + * // The variable used to hold the message buffer structure. + * StaticMessageBuffer_t xMessageBufferStruct; + * + * void MyFunction( void ) + * { + * MessageBufferHandle_t xMessageBuffer; + * + * xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucStorageBuffer ), + * ucStorageBuffer, + * &xMessageBufferStruct ); + * + * // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer + * // parameters were NULL, xMessageBuffer will not be NULL, and can be used to + * // reference the created message buffer in other message buffer API calls. + * + * // Other code that uses the message buffer can go here. + * } + * + * @endcode + * \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic + * \ingroup MessageBufferManagement + */ +#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) \ + ( MessageBufferHandle_t ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, 0, pdTRUE, pucMessageBufferStorageArea, pxStaticMessageBuffer ) + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Sends a discrete message to the message buffer. The message can be any + * length that fits within the buffer's free space, and is copied into the + * buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferSend() to write to a message buffer from a task. Use + * xMessageBufferSendFromISR() to write to a message buffer from an interrupt + * service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer to which a message is + * being sent. + * + * @param pvTxData A pointer to the message that is to be copied into the + * message buffer. + * + * @param xDataLengthBytes The length of the message. That is, the number of + * bytes to copy from pvTxData into the message buffer. When a message is + * written to the message buffer an additional sizeof( size_t ) bytes are also + * written to store the message's length. sizeof( size_t ) is typically 4 bytes + * on a 32-bit architecture, so on most 32-bit architecture setting + * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24 + * bytes (20 bytes of message data and 4 bytes to hold the message length). + * + * @param xTicksToWait The maximum amount of time the calling task should remain + * in the Blocked state to wait for enough space to become available in the + * message buffer, should the message buffer have insufficient space when + * xMessageBufferSend() is called. The calling task will never block if + * xTicksToWait is zero. The block time is specified in tick periods, so the + * absolute time it represents is dependent on the tick frequency. The macro + * pdMS_TO_TICKS() can be used to convert a time specified in milliseconds into + * a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will cause + * the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. Tasks do not use any + * CPU time when they are in the Blocked state. + * + * @return The number of bytes written to the message buffer. If the call to + * xMessageBufferSend() times out before there was enough space to write the + * message into the message buffer then zero is returned. If the call did not + * time out then xDataLengthBytes is returned. + * + * Example use: + * @code{c} + * void vAFunction( MessageBufferHandle_t xMessageBuffer ) + * { + * size_t xBytesSent; + * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; + * char *pcStringToSend = "String to send"; + * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); + * + * // Send an array to the message buffer, blocking for a maximum of 100ms to + * // wait for enough space to be available in the message buffer. + * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); + * + * if( xBytesSent != sizeof( ucArrayToSend ) ) + * { + * // The call to xMessageBufferSend() times out before there was enough + * // space in the buffer for the data to be written. + * } + * + * // Send the string to the message buffer. Return immediately if there is + * // not enough space in the buffer. + * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The string could not be added to the message buffer because there was + * // not enough free space in the buffer. + * } + * } + * @endcode + * \defgroup xMessageBufferSend xMessageBufferSend + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) \ + xStreamBufferSend( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * Interrupt safe version of the API function that sends a discrete message to + * the message buffer. The message can be any length that fits within the + * buffer's free space, and is copied into the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferSend() to write to a message buffer from a task. Use + * xMessageBufferSendFromISR() to write to a message buffer from an interrupt + * service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer to which a message is + * being sent. + * + * @param pvTxData A pointer to the message that is to be copied into the + * message buffer. + * + * @param xDataLengthBytes The length of the message. That is, the number of + * bytes to copy from pvTxData into the message buffer. When a message is + * written to the message buffer an additional sizeof( size_t ) bytes are also + * written to store the message's length. sizeof( size_t ) is typically 4 bytes + * on a 32-bit architecture, so on most 32-bit architecture setting + * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24 + * bytes (20 bytes of message data and 4 bytes to hold the message length). + * + * @param pxHigherPriorityTaskWoken It is possible that a message buffer will + * have a task blocked on it waiting for data. Calling + * xMessageBufferSendFromISR() can make data available, and so cause a task that + * was waiting for data to leave the Blocked state. If calling + * xMessageBufferSendFromISR() causes a task to leave the Blocked state, and the + * unblocked task has a priority higher than the currently executing task (the + * task that was interrupted), then, internally, xMessageBufferSendFromISR() + * will set *pxHigherPriorityTaskWoken to pdTRUE. If + * xMessageBufferSendFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. This will + * ensure that the interrupt returns directly to the highest priority Ready + * state task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it + * is passed into the function. See the code example below for an example. + * + * @return The number of bytes actually written to the message buffer. If the + * message buffer didn't have enough free space for the message to be stored + * then 0 is returned, otherwise xDataLengthBytes is returned. + * + * Example use: + * @code{c} + * // A message buffer that has already been created. + * MessageBufferHandle_t xMessageBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * size_t xBytesSent; + * char *pcStringToSend = "String to send"; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Attempt to send the string to the message buffer. + * xBytesSent = xMessageBufferSendFromISR( xMessageBuffer, + * ( void * ) pcStringToSend, + * strlen( pcStringToSend ), + * &xHigherPriorityTaskWoken ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The string could not be added to the message buffer because there was + * // not enough free space in the buffer. + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xMessageBufferSendFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) \ + xStreamBufferSendFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Receives a discrete message from a message buffer. Messages can be of + * variable length and are copied out of the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferReceive() to read from a message buffer from a task. Use + * xMessageBufferReceiveFromISR() to read from a message buffer from an + * interrupt service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer from which a message + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received message is + * to be copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData + * parameter. This sets the maximum length of the message that can be received. + * If xBufferLengthBytes is too small to hold the next message then the message + * will be left in the message buffer and 0 will be returned. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for a message, should the message buffer be empty. + * xMessageBufferReceive() will return immediately if xTicksToWait is zero and + * the message buffer is empty. The block time is specified in tick periods, so + * the absolute time it represents is dependent on the tick frequency. The + * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds + * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will + * cause the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. Tasks do not use any + * CPU time when they are in the Blocked state. + * + * @return The length, in bytes, of the message read from the message buffer, if + * any. If xMessageBufferReceive() times out before a message became available + * then zero is returned. If the length of the message is greater than + * xBufferLengthBytes then the message will be left in the message buffer and + * zero is returned. + * + * Example use: + * @code{c} + * void vAFunction( MessageBuffer_t xMessageBuffer ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); + * + * // Receive the next message from the message buffer. Wait in the Blocked + * // state (so not using any CPU processing time) for a maximum of 100ms for + * // a message to become available. + * xReceivedBytes = xMessageBufferReceive( xMessageBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * xBlockTime ); + * + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains a message that is xReceivedBytes long. Process + * // the message here.... + * } + * } + * @endcode + * \defgroup xMessageBufferReceive xMessageBufferReceive + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) \ + xStreamBufferReceive( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) + + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * An interrupt safe version of the API function that receives a discrete + * message from a message buffer. Messages can be of variable length and are + * copied out of the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferReceive() to read from a message buffer from a task. Use + * xMessageBufferReceiveFromISR() to read from a message buffer from an + * interrupt service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer from which a message + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received message is + * to be copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData + * parameter. This sets the maximum length of the message that can be received. + * If xBufferLengthBytes is too small to hold the next message then the message + * will be left in the message buffer and 0 will be returned. + * + * @param pxHigherPriorityTaskWoken It is possible that a message buffer will + * have a task blocked on it waiting for space to become available. Calling + * xMessageBufferReceiveFromISR() can make space available, and so cause a task + * that is waiting for space to leave the Blocked state. If calling + * xMessageBufferReceiveFromISR() causes a task to leave the Blocked state, and + * the unblocked task has a priority higher than the currently executing task + * (the task that was interrupted), then, internally, + * xMessageBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. + * If xMessageBufferReceiveFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. That will + * ensure the interrupt returns directly to the highest priority Ready state + * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is + * passed into the function. See the code example below for an example. + * + * @return The length, in bytes, of the message read from the message buffer, if + * any. + * + * Example use: + * @code{c} + * // A message buffer that has already been created. + * MessageBuffer_t xMessageBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Receive the next message from the message buffer. + * xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * &xHigherPriorityTaskWoken ); + * + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains a message that is xReceivedBytes long. Process + * // the message here.... + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xMessageBufferReceiveFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) \ + xStreamBufferReceiveFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) + +/** + * message_buffer.h + * + * @code{c} + * void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Deletes a message buffer that was previously created using a call to + * xMessageBufferCreate() or xMessageBufferCreateStatic(). If the message + * buffer was created using dynamic memory (that is, by xMessageBufferCreate()), + * then the allocated memory is freed. + * + * A message buffer handle must not be used after the message buffer has been + * deleted. + * + * @param xMessageBuffer The handle of the message buffer to be deleted. + * + */ +#define vMessageBufferDelete( xMessageBuffer ) \ + vStreamBufferDelete( ( StreamBufferHandle_t ) xMessageBuffer ) + +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Tests to see if a message buffer is full. A message buffer is full if it + * cannot accept any more messages, of any size, until space is made available + * by a message being removed from the message buffer. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return If the message buffer referenced by xMessageBuffer is full then + * pdTRUE is returned. Otherwise pdFALSE is returned. + */ +#define xMessageBufferIsFull( xMessageBuffer ) \ + xStreamBufferIsFull( ( StreamBufferHandle_t ) xMessageBuffer ) + +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Tests to see if a message buffer is empty (does not contain any messages). + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return If the message buffer referenced by xMessageBuffer is empty then + * pdTRUE is returned. Otherwise pdFALSE is returned. + * + */ +#define xMessageBufferIsEmpty( xMessageBuffer ) \ + xStreamBufferIsEmpty( ( StreamBufferHandle_t ) xMessageBuffer ) + +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Resets a message buffer to its initial empty state, discarding any message it + * contained. + * + * A message buffer can only be reset if there are no tasks blocked on it. + * + * @param xMessageBuffer The handle of the message buffer being reset. + * + * @return If the message buffer was reset then pdPASS is returned. If the + * message buffer could not be reset because either there was a task blocked on + * the message queue to wait for space to become available, or to wait for a + * a message to be available, then pdFAIL is returned. + * + * \defgroup xMessageBufferReset xMessageBufferReset + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReset( xMessageBuffer ) \ + xStreamBufferReset( ( StreamBufferHandle_t ) xMessageBuffer ) + + +/** + * message_buffer.h + * @code{c} + * size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * Returns the number of bytes of free space in the message buffer. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return The number of bytes that can be written to the message buffer before + * the message buffer would be full. When a message is written to the message + * buffer an additional sizeof( size_t ) bytes are also written to store the + * message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so if xMessageBufferSpacesAvailable() returns 10, then the size + * of the largest message that can be written to the message buffer is 6 bytes. + * + * \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSpaceAvailable( xMessageBuffer ) \ + xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) +#define xMessageBufferSpacesAvailable( xMessageBuffer ) \ + xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) /* Corrects typo in original macro name. */ + +/** + * message_buffer.h + * @code{c} + * size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * Returns the length (in bytes) of the next message in a message buffer. + * Useful if xMessageBufferReceive() returned 0 because the size of the buffer + * passed into xMessageBufferReceive() was too small to hold the next message. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return The length (in bytes) of the next message in the message buffer, or 0 + * if the message buffer is empty. + * + * \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes + * \ingroup MessageBufferManagement + */ +#define xMessageBufferNextLengthBytes( xMessageBuffer ) \ + xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION; + +/** + * message_buffer.h + * + * @code{c} + * BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is sent to a message buffer or stream buffer. If there was a task that + * was blocked on the message or stream buffer waiting for data to arrive then + * the sbSEND_COMPLETED() macro sends a notification to the task to remove it + * from the Blocked state. xMessageBufferSendCompletedFromISR() does the same + * thing. It is provided to enable application writers to implement their own + * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xMessageBuffer The handle of the stream buffer to which data was + * written. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xMessageBufferSendCompletedFromISR(). If calling + * xMessageBufferSendCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR + * \ingroup StreamBufferManagement + */ +#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \ + xStreamBufferSendCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) + +/** + * message_buffer.h + * + * @code{c} + * BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is read out of a message buffer or stream buffer. If there was a task + * that was blocked on the message or stream buffer waiting for data to arrive + * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to + * remove it from the Blocked state. xMessageBufferReceiveCompletedFromISR() + * does the same thing. It is provided to enable application writers to + * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT + * ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xMessageBuffer The handle of the stream buffer from which data was + * read. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xMessageBufferReceiveCompletedFromISR(). If calling + * xMessageBufferReceiveCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR + * \ingroup StreamBufferManagement + */ +#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \ + xStreamBufferReceiveCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + } /* extern "C" */ +#endif +/* *INDENT-ON* */ + +#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/mpu_prototypes.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/mpu_prototypes.h new file mode 100644 index 000000000..cb743be55 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/mpu_prototypes.h @@ -0,0 +1,260 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * When the MPU is used the standard (non MPU) API functions are mapped to + * equivalents that start "MPU_", the prototypes for which are defined in this + * header files. This will cause the application code to call the MPU_ version + * which wraps the non-MPU version with privilege promoting then demoting code, + * so the kernel code always runs will full privileges. + */ + + +#ifndef MPU_PROTOTYPES_H +#define MPU_PROTOTYPES_H + +/* MPU versions of tasks.h API functions. */ +BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint16_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskStartScheduler( void ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSuspendAll( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskResumeAll( void ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTaskGetTickCount( void ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) FREERTOS_SYSTEM_CALL; +char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL; +TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) FREERTOS_SYSTEM_CALL; +void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL; +configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL; +configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskGetRunTimeStats( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) FREERTOS_SYSTEM_CALL; +uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of queue.h API functions. */ +BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueDelete( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcName ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; +QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL; +QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of timers.h API functions. */ +TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) FREERTOS_SYSTEM_CALL; +TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) FREERTOS_SYSTEM_CALL; +void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +void MPU_vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, + const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of event_group.h API functions. */ +EventGroupHandle_t MPU_xEventGroupCreate( void ) FREERTOS_SYSTEM_CALL; +EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of message/stream_buffer.h API functions. */ +size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL; +StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer ) FREERTOS_SYSTEM_CALL; +StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer ) FREERTOS_SYSTEM_CALL; + + + +#endif /* MPU_PROTOTYPES_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/mpu_wrappers.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/mpu_wrappers.h new file mode 100644 index 000000000..9b6cd7c92 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/mpu_wrappers.h @@ -0,0 +1,217 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef MPU_WRAPPERS_H +#define MPU_WRAPPERS_H + +/* This file redefines API functions to be called through a wrapper macro, but + * only for ports that are using the MPU. */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + * included from queue.c or task.c to prevent it from having an effect within + * those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* + * Map standard (non MPU) API functions to equivalents that start + * "MPU_". This will cause the application code to call the MPU_ + * version, which wraps the non-MPU version with privilege promoting + * then demoting code, so the kernel code always runs will full + * privileges. + */ + +/* Map standard tasks.h API functions to the MPU equivalents. */ + #define xTaskCreate MPU_xTaskCreate + #define xTaskCreateStatic MPU_xTaskCreateStatic + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelay MPU_vTaskDelay + #define xTaskDelayUntil MPU_xTaskDelayUntil + #define xTaskAbortDelay MPU_xTaskAbortDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define eTaskGetState MPU_eTaskGetState + #define vTaskGetInfo MPU_vTaskGetInfo + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define vTaskSuspend MPU_vTaskSuspend + #define vTaskResume MPU_vTaskResume + #define vTaskSuspendAll MPU_vTaskSuspendAll + #define xTaskResumeAll MPU_xTaskResumeAll + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define pcTaskGetName MPU_pcTaskGetName + #define xTaskGetHandle MPU_xTaskGetHandle + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2 + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer + #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + #define vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter + #define ulTaskGetIdleRunTimePercent MPU_ulTaskGetIdleRunTimePercent + #define xTaskGenericNotify MPU_xTaskGenericNotify + #define xTaskGenericNotifyWait MPU_xTaskGenericNotifyWait + #define ulTaskGenericNotifyTake MPU_ulTaskGenericNotifyTake + #define xTaskGenericNotifyStateClear MPU_xTaskGenericNotifyStateClear + #define ulTaskGenericNotifyValueClear MPU_ulTaskGenericNotifyValueClear + #define xTaskCatchUpTicks MPU_xTaskCatchUpTicks + + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState + #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + +/* Map standard queue.h API functions to the MPU equivalents. */ + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueReceive MPU_xQueueReceive + #define xQueuePeek MPU_xQueuePeek + #define xQueueSemaphoreTake MPU_xQueueSemaphoreTake + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable + #define vQueueDelete MPU_vQueueDelete + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueGenericCreate MPU_xQueueGenericCreate + #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic + #define xQueueCreateSet MPU_xQueueCreateSet + #define xQueueAddToSet MPU_xQueueAddToSet + #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + #define xQueueSelectFromSet MPU_xQueueSelectFromSet + #define xQueueGenericReset MPU_xQueueGenericReset + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #define pcQueueGetName MPU_pcQueueGetName + #endif + +/* Map standard timer.h API functions to the MPU equivalents. */ + #define xTimerCreate MPU_xTimerCreate + #define xTimerCreateStatic MPU_xTimerCreateStatic + #define pvTimerGetTimerID MPU_pvTimerGetTimerID + #define vTimerSetTimerID MPU_vTimerSetTimerID + #define xTimerIsTimerActive MPU_xTimerIsTimerActive + #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle + #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall + #define pcTimerGetName MPU_pcTimerGetName + #define vTimerSetReloadMode MPU_vTimerSetReloadMode + #define uxTimerGetReloadMode MPU_uxTimerGetReloadMode + #define xTimerGetPeriod MPU_xTimerGetPeriod + #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime + #define xTimerGenericCommand MPU_xTimerGenericCommand + +/* Map standard event_group.h API functions to the MPU equivalents. */ + #define xEventGroupCreate MPU_xEventGroupCreate + #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic + #define xEventGroupWaitBits MPU_xEventGroupWaitBits + #define xEventGroupClearBits MPU_xEventGroupClearBits + #define xEventGroupSetBits MPU_xEventGroupSetBits + #define xEventGroupSync MPU_xEventGroupSync + #define vEventGroupDelete MPU_vEventGroupDelete + +/* Map standard message/stream_buffer.h API functions to the MPU + * equivalents. */ + #define xStreamBufferSend MPU_xStreamBufferSend + #define xStreamBufferReceive MPU_xStreamBufferReceive + #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes + #define vStreamBufferDelete MPU_vStreamBufferDelete + #define xStreamBufferIsFull MPU_xStreamBufferIsFull + #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty + #define xStreamBufferReset MPU_xStreamBufferReset + #define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable + #define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable + #define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel + #define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate + #define xStreamBufferGenericCreateStatic MPU_xStreamBufferGenericCreateStatic + + +/* Remove the privileged function macro, but keep the PRIVILEGED_DATA + * macro so applications can place data in privileged access sections + * (useful when using statically allocated objects). */ + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) ) + #define FREERTOS_SYSTEM_CALL + + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + + /* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__( ( section( "privileged_functions" ) ) ) + #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) ) + #define FREERTOS_SYSTEM_CALL __attribute__( ( section( "freertos_system_calls" ) ) ) + + /** + * @brief Calls the port specific code to raise the privilege. + * + * Sets xRunningPrivileged to pdFALSE if privilege was raised, else sets + * it to pdTRUE. + */ + #define xPortRaisePrivilege( xRunningPrivileged ) \ + { \ + /* Check whether the processor is already privileged. */ \ + xRunningPrivileged = portIS_PRIVILEGED(); \ + \ + /* If the processor is not already privileged, raise privilege. */ \ + if( xRunningPrivileged == pdFALSE ) \ + { \ + portRAISE_PRIVILEGE(); \ + } \ + } + + /** + * @brief If xRunningPrivileged is not pdTRUE, calls the port specific + * code to reset the privilege, otherwise does nothing. + */ + #define vPortResetPrivilege( xRunningPrivileged ) \ + { \ + if( xRunningPrivileged == pdFALSE ) \ + { \ + portRESET_PRIVILEGE(); \ + } \ + } + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define FREERTOS_SYSTEM_CALL + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/portable.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/portable.h new file mode 100644 index 000000000..0ec6416ae --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/portable.h @@ -0,0 +1,223 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Portable layer API. Each function must be defined for each port. +*----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#define PORTABLE_H + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a + * pre-processor definition was used to ensure the pre-processor found the correct + * portmacro.h file for the port being used. That scheme was deprecated in favour + * of setting the compiler's include path such that it found the correct + * portmacro.h file - removing the need for the constant and allowing the + * portmacro.h file to be located anywhere in relation to the port being used. + * Purely for reasons of backward compatibility the old method is still valid, but + * to make it clear that new projects should not use it, support for the port + * specific constants has been moved into the deprecated_definitions.h header + * file. */ +#include "deprecated_definitions.h" + +/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h + * did not result in a portmacro.h header file being included - and it should be + * included here. In this case the path to the correct portmacro.h header file + * must be set in the compiler's include path. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 32 + #define portBYTE_ALIGNMENT_MASK ( 0x001f ) +#elif portBYTE_ALIGNMENT == 16 + #define portBYTE_ALIGNMENT_MASK ( 0x000f ) +#elif portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) +#elif portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#elif portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#elif portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#else /* if portBYTE_ALIGNMENT == 32 */ + #error "Invalid portBYTE_ALIGNMENT definition" +#endif /* if portBYTE_ALIGNMENT == 32 */ + +#ifndef portUSING_MPU_WRAPPERS + #define portUSING_MPU_WRAPPERS 0 +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifndef portHAS_STACK_OVERFLOW_CHECKING + #define portHAS_STACK_OVERFLOW_CHECKING 0 +#endif + +#ifndef portARCH_NAME + #define portARCH_NAME NULL +#endif + +#ifndef configSTACK_ALLOCATION_FROM_SEPARATE_HEAP + /* Defaults to 0 for backward compatibility. */ + #define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0 +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +#include "mpu_wrappers.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; + #else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; + #endif +#else /* if ( portUSING_MPU_WRAPPERS == 1 ) */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) PRIVILEGED_FUNCTION; + #else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) PRIVILEGED_FUNCTION; + #endif +#endif /* if ( portUSING_MPU_WRAPPERS == 1 ) */ + +/* Used by heap_5.c to define the start address and size of each memory region + * that together comprise the total FreeRTOS heap space. */ +typedef struct HeapRegion +{ + uint8_t * pucStartAddress; + size_t xSizeInBytes; +} HeapRegion_t; + +/* Used to pass information about the heap out of vPortGetHeapStats(). */ +typedef struct xHeapStats +{ + size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ + size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ + size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */ + size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */ +} HeapStats_t; + +/* + * Used to define multiple heap regions for use by heap_5.c. This function + * must be called before any calls to pvPortMalloc() - not creating a task, + * queue, semaphore, mutex, software timer, event group, etc. will result in + * pvPortMalloc being called. + * + * pxHeapRegions passes in an array of HeapRegion_t structures - each of which + * defines a region of memory that can be used as the heap. The array is + * terminated by a HeapRegions_t structure that has a size of 0. The region + * with the lowest start address must appear first in the array. + */ +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; + +/* + * Returns a HeapStats_t structure filled with information about the current + * heap state. + */ +void vPortGetHeapStats( HeapStats_t * pxHeapStats ); + +/* + * Map to the memory management routines required for the port. + */ +void * pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void * pv ) PRIVILEGED_FUNCTION; +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; +size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; + +#if ( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 ) + void * pvPortMallocStack( size_t xSize ) PRIVILEGED_FUNCTION; + void vPortFreeStack( void * pv ) PRIVILEGED_FUNCTION; +#else + #define pvPortMallocStack pvPortMalloc + #define vPortFreeStack vPortFree +#endif + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) PRIVILEGED_FUNCTION; +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTABLE_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/projdefs.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/projdefs.h new file mode 100644 index 000000000..e623bf7d9 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/projdefs.h @@ -0,0 +1,122 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PROJDEFS_H +#define PROJDEFS_H + +/* + * Defines the prototype to which task functions must conform. Defined in this + * file to ensure the type is known before portable.h is included. + */ +typedef void (* TaskFunction_t)( void * ); + +/* Converts a time in milliseconds to a time in ticks. This macro can be + * overridden by a macro of the same name defined in FreeRTOSConfig.h in case the + * definition here is not suitable for your application. */ +#ifndef pdMS_TO_TICKS + #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000U ) ) +#endif + +#define pdFALSE ( ( BaseType_t ) 0 ) +#define pdTRUE ( ( BaseType_t ) 1 ) + +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) +#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) +#define errQUEUE_FULL ( ( BaseType_t ) 0 ) + +/* FreeRTOS error definitions. */ +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) + +/* Macros used for basic data corruption checks. */ +#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES + #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 +#endif + +#if ( configUSE_16_BIT_TICKS == 1 ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a +#else + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL +#endif + +/* The following errno values are used by FreeRTOS+ components, not FreeRTOS + * itself. */ +#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ +#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ +#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ +#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ +#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ +#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ +#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ +#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ +#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ +#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ +#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ +#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ +#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ +#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ +#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ +#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ +#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ +#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ +#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ +#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ +#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ +#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ +#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ +#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ +#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ +#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ +#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ +#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ +#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ +#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ +#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ +#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ +#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ +#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ +#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ +#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ +#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ +#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ +#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ + +/* The following endian values are used by FreeRTOS+ components, not FreeRTOS + * itself. */ +#define pdFREERTOS_LITTLE_ENDIAN 0 +#define pdFREERTOS_BIG_ENDIAN 1 + +/* Re-defining endian values for generic naming. */ +#define pdLITTLE_ENDIAN pdFREERTOS_LITTLE_ENDIAN +#define pdBIG_ENDIAN pdFREERTOS_BIG_ENDIAN + + +#endif /* PROJDEFS_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/queue.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/queue.h new file mode 100644 index 000000000..6a92b6bcb --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/queue.h @@ -0,0 +1,1722 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include queue.h" +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +#include "task.h" + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate() + * returns an QueueHandle_t variable that can then be used as a parameter to + * xQueueSend(), xQueueReceive(), etc. + */ +struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */ +typedef struct QueueDefinition * QueueHandle_t; + +/** + * Type by which queue sets are referenced. For example, a call to + * xQueueCreateSet() returns an xQueueSet variable that can then be used as a + * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. + */ +typedef struct QueueDefinition * QueueSetHandle_t; + +/** + * Queue sets can contain both queues and semaphores, so the + * QueueSetMemberHandle_t is defined as a type to be used where a parameter or + * return value can be either an QueueHandle_t or an SemaphoreHandle_t. + */ +typedef struct QueueDefinition * QueueSetMemberHandle_t; + +/* For internal use only. */ +#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) +#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) +#define queueOVERWRITE ( ( BaseType_t ) 2 ) + +/* For internal use only. These definitions *must* match those in queue.c. */ +#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) +#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) +#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) +#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) + +/** + * queue. h + * @code{c} + * QueueHandle_t xQueueCreate( + * UBaseType_t uxQueueLength, + * UBaseType_t uxItemSize + * ); + * @endcode + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * }; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * if( xQueue1 == 0 ) + * { + * // Queue was not created and must not be used. + * } + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue2 == 0 ) + * { + * // Queue was not created and must not be used. + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueCreate xQueueCreate + * \ingroup QueueManagement + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) +#endif + +/** + * queue. h + * @code{c} + * QueueHandle_t xQueueCreateStatic( + * UBaseType_t uxQueueLength, + * UBaseType_t uxItemSize, + * uint8_t *pucQueueStorage, + * StaticQueue_t *pxQueueBuffer + * ); + * @endcode + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @param pucQueueStorage If uxItemSize is not zero then + * pucQueueStorage must point to a uint8_t array that is at least large + * enough to hold the maximum number of items that can be in the queue at any + * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is + * zero then pucQueueStorage can be NULL. + * + * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which + * will be used to hold the queue's data structure. + * + * @return If the queue is created then a handle to the created queue is + * returned. If pxQueueBuffer is NULL then NULL is returned. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * }; + * + #define QUEUE_LENGTH 10 + #define ITEM_SIZE sizeof( uint32_t ) + * + * // xQueueBuffer will hold the queue structure. + * StaticQueue_t xQueueBuffer; + * + * // ucQueueStorage will hold the items posted to the queue. Must be at least + * // [(queue length) * ( queue item size)] bytes long. + * uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ]; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold. + * ITEM_SIZE // The size of each item in the queue + * &( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue. + * &xQueueBuffer ); // The buffer that will hold the queue structure. + * + * // The queue is guaranteed to be created successfully as no dynamic memory + * // allocation is used. Therefore xQueue1 is now a handle to a valid queue. + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueCreateStatic xQueueCreateStatic + * \ingroup QueueManagement + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToToFront( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * TickType_t xTicksToWait + * ); + * @endcode + * + * Post an item to the front of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToBack( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * TickType_t xTicksToWait + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSend( + * QueueHandle_t xQueue, + * const void * pvItemToQueue, + * TickType_t xTicksToWait + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSend(). It is included for + * backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToFront() and xQueueSendToBack() macros. It is + * equivalent to xQueueSendToBack(). + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueOverwrite( + * QueueHandle_t xQueue, + * const void * pvItemToQueue + * ); + * @endcode + * + * Only for use with queues that have a length of one - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * This function must not be called from an interrupt service routine. + * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle of the queue to which the data is being sent. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and + * therefore has the same return values as xQueueSendToFront(). However, pdPASS + * is the only value that can be returned because xQueueOverwrite() will write + * to the queue even when the queue is already full. + * + * Example usage: + * @code{c} + * + * void vFunction( void *pvParameters ) + * { + * QueueHandle_t xQueue; + * uint32_t ulVarToSend, ulValReceived; + * + * // Create a queue to hold one uint32_t value. It is strongly + * // recommended *not* to use xQueueOverwrite() on queues that can + * // contain more than one value, and doing so will trigger an assertion + * // if configASSERT() is defined. + * xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + * + * // Write the value 10 to the queue using xQueueOverwrite(). + * ulVarToSend = 10; + * xQueueOverwrite( xQueue, &ulVarToSend ); + * + * // Peeking the queue should now return 10, but leave the value 10 in + * // the queue. A block time of zero is used as it is known that the + * // queue holds a value. + * ulValReceived = 0; + * xQueuePeek( xQueue, &ulValReceived, 0 ); + * + * if( ulValReceived != 10 ) + * { + * // Error unless the item was removed by a different task. + * } + * + * // The queue is still full. Use xQueueOverwrite() to overwrite the + * // value held in the queue with 100. + * ulVarToSend = 100; + * xQueueOverwrite( xQueue, &ulVarToSend ); + * + * // This time read from the queue, leaving the queue empty once more. + * // A block time of 0 is used again. + * xQueueReceive( xQueue, &ulValReceived, 0 ); + * + * // The value read should be the last value written, even though the + * // queue was already full when the value was written. + * if( ulValReceived != 100 ) + * { + * // Error! + * } + * + * // ... + * } + * @endcode + * \defgroup xQueueOverwrite xQueueOverwrite + * \ingroup QueueManagement + */ +#define xQueueOverwrite( xQueue, pvItemToQueue ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) + + +/** + * queue. h + * @code{c} + * BaseType_t xQueueGenericSend( + * QueueHandle_t xQueue, + * const void * pvItemToQueue, + * TickType_t xTicksToWait + * BaseType_t xCopyPosition + * ); + * @endcode + * + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueuePeek( + * QueueHandle_t xQueue, + * void * const pvBuffer, + * TickType_t xTicksToWait + * ); + * @endcode + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. See + * xQueuePeekFromISR() for an alternative that can be called from an interrupt + * service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue + * is empty. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * QueueHandle_t xQueue; + * + * // Task to create a queue and post a value. + * void vATask( void *pvParameters ) + * { + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue == 0 ) + * { + * // Failed to create the queue. + * } + * + * // ... + * + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * + * // ... Rest of task code. + * } + * + * // Task to peek the data from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * struct AMessage *pxRxedMessage; + * + * if( xQueue != 0 ) + * { + * // Peek a message on the created queue. Block for 10 ticks if a + * // message is not immediately available. + * if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) + * { + * // pcRxedMessage now points to the struct AMessage variable posted + * // by vATask, but the item still remains on the queue. + * } + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueuePeek xQueuePeek + * \ingroup QueueManagement + */ +BaseType_t xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueuePeekFromISR( + * QueueHandle_t xQueue, + * void *pvBuffer, + * ); + * @endcode + * + * A version of xQueuePeek() that can be called from an interrupt service + * routine (ISR). + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * \defgroup xQueuePeekFromISR xQueuePeekFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, + void * const pvBuffer ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueueReceive( + * QueueHandle_t xQueue, + * void *pvBuffer, + * TickType_t xTicksToWait + * ); + * @endcode + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. xQueueReceive() will return immediately if xTicksToWait + * is zero and the queue is empty. The time is defined in tick periods so the + * constant portTICK_PERIOD_MS should be used to convert to real time if this is + * required. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * QueueHandle_t xQueue; + * + * // Task to create a queue and post a value. + * void vATask( void *pvParameters ) + * { + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue == 0 ) + * { + * // Failed to create the queue. + * } + * + * // ... + * + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * + * // ... Rest of task code. + * } + * + * // Task to receive from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * struct AMessage *pxRxedMessage; + * + * if( xQueue != 0 ) + * { + * // Receive a message on the created queue. Block for 10 ticks if a + * // message is not immediately available. + * if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) + * { + * // pcRxedMessage now points to the struct AMessage variable posted + * // by vATask. + * } + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +BaseType_t xQueueReceive( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ); + * @endcode + * + * Return the number of messages stored in a queue. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of messages available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ); + * @endcode + * + * Return the number of free spaces available in a queue. This is equal to the + * number of items that can be sent to the queue before the queue becomes full + * if no items are removed. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of spaces available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * void vQueueDelete( QueueHandle_t xQueue ); + * @endcode + * + * Delete a queue - freeing all the memory allocated for storing of items + * placed on the queue. + * + * @param xQueue A handle to the queue to be deleted. + * + * \defgroup vQueueDelete vQueueDelete + * \ingroup QueueManagement + */ +void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToFrontFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPrioritTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post the byte. + * xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * taskYIELD (); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToBackFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post the byte. + * xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * taskYIELD (); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueOverwriteFromISR( + * QueueHandle_t xQueue, + * const void * pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * A version of xQueueOverwrite() that can be used in an interrupt service + * routine (ISR). + * + * Only for use with queues that can hold a single item - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return xQueueOverwriteFromISR() is a macro that calls + * xQueueGenericSendFromISR(), and therefore has the same return values as + * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be + * returned because xQueueOverwriteFromISR() will write to the queue even when + * the queue is already full. + * + * Example usage: + * @code{c} + * + * QueueHandle_t xQueue; + * + * void vFunction( void *pvParameters ) + * { + * // Create a queue to hold one uint32_t value. It is strongly + * // recommended *not* to use xQueueOverwriteFromISR() on queues that can + * // contain more than one value, and doing so will trigger an assertion + * // if configASSERT() is defined. + * xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + * } + * + * void vAnInterruptHandler( void ) + * { + * // xHigherPriorityTaskWoken must be set to pdFALSE before it is used. + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * uint32_t ulVarToSend, ulValReceived; + * + * // Write the value 10 to the queue using xQueueOverwriteFromISR(). + * ulVarToSend = 10; + * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); + * + * // The queue is full, but calling xQueueOverwriteFromISR() again will still + * // pass because the value held in the queue will be overwritten with the + * // new value. + * ulVarToSend = 100; + * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); + * + * // Reading from the queue will now return 100. + * + * // ... + * + * if( xHigherPrioritytaskWoken == pdTRUE ) + * { + * // Writing to the queue caused a task to unblock and the unblocked task + * // has a priority higher than or equal to the priority of the currently + * // executing task (the task this interrupt interrupted). Perform a context + * // switch so this interrupt returns directly to the unblocked task. + * portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port. + * } + * } + * @endcode + * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR + * \ingroup QueueManagement + */ +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSendFromISR(). It is included + * for backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post the byte. + * xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * // Actual macro used here is port specific. + * portYIELD_FROM_ISR (); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueGenericSendFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken, + * BaseType_t xCopyPosition + * ); + * @endcode + * + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. xQueueGiveFromISR() is an + * equivalent for use by semaphores that don't actually copy any data. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWokenByPost; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWokenByPost = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post each byte. + * xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. Note that the + * // name of the yield function required is port specific. + * if( xHigherPriorityTaskWokenByPost ) + * { + * portYIELD_FROM_ISR(); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, + const void * const pvItemToQueue, + BaseType_t * const pxHigherPriorityTaskWoken, + const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueueReceiveFromISR( + * QueueHandle_t xQueue, + * void *pvBuffer, + * BaseType_t *pxTaskWoken + * ); + * @endcode + * + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param pxTaskWoken A task may be blocked waiting for space to become + * available on the queue. If xQueueReceiveFromISR causes such a task to + * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * + * QueueHandle_t xQueue; + * + * // Function to create a queue and post some values. + * void vAFunction( void *pvParameters ) + * { + * char cValueToPost; + * const TickType_t xTicksToWait = ( TickType_t )0xff; + * + * // Create a queue capable of containing 10 characters. + * xQueue = xQueueCreate( 10, sizeof( char ) ); + * if( xQueue == 0 ) + * { + * // Failed to create the queue. + * } + * + * // ... + * + * // Post some characters that will be used within an ISR. If the queue + * // is full then this task will block for xTicksToWait ticks. + * cValueToPost = 'a'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * cValueToPost = 'b'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * + * // ... keep posting characters ... this task may block when the queue + * // becomes full. + * + * cValueToPost = 'c'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * } + * + * // ISR that outputs all the characters received on the queue. + * void vISR_Routine( void ) + * { + * BaseType_t xTaskWokenByReceive = pdFALSE; + * char cRxedChar; + * + * while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) ) + * { + * // A character was received. Output the character now. + * vOutputCharacter( cRxedChar ); + * + * // If removing the character from the queue woke the task that was + * // posting onto the queue cTaskWokenByReceive will have been set to + * // pdTRUE. No matter how many times this loop iterates only one + * // task will be woken. + * } + * + * if( cTaskWokenByPost != ( char ) pdFALSE; + * { + * taskYIELD (); + * } + * } + * @endcode + * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, + void * const pvBuffer, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* + * Utilities to query queues that are safe to use from an ISR. These utilities + * should be used only from witin an ISR, or within a critical section. + */ +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/* + * The functions defined above are for passing data to and from tasks. The + * functions below are the equivalents for passing data to and from + * co-routines. + * + * These functions are called from the co-routine macro implementation and + * should not be called directly from application code. Instead use the macro + * wrappers defined within croutine.h. + */ +BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, + const void * pvItemToQueue, + BaseType_t xCoRoutinePreviouslyWoken ); +BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, + void * pvBuffer, + BaseType_t * pxTaskWoken ); +BaseType_t xQueueCRSend( QueueHandle_t xQueue, + const void * pvItemToQueue, + TickType_t xTicksToWait ); +BaseType_t xQueueCRReceive( QueueHandle_t xQueue, + void * pvBuffer, + TickType_t xTicksToWait ); + +/* + * For internal use only. Use xSemaphoreCreateMutex(), + * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling + * these functions directly. + */ +QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; +TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Use xSemaphoreTakeMutexRecursive() or + * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. + */ +BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; + +/* + * Reset a queue back to its original empty state. The return value is now + * obsolete and is always set to pdPASS. + */ +#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not effect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * If vQueueAddToRegistry is called more than once with the same xQueue + * parameter, the registry will store the pcQueueName parameter from the + * most recent call to vQueueAddToRegistry. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcQueueName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. The queue registry only + * stores a pointer to the string - so the string must be persistent (global or + * preferably in ROM/Flash), not on the stack. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcQueueName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to + * remove the queue, semaphore or mutex from the register. If you are not using + * a kernel aware debugger then this function can be ignored. + * + * @param xQueue The handle of the queue being removed from the registry. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * The queue registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call pcQueueGetName() to look + * up and return the name of a queue in the queue registry from the queue's + * handle. + * + * @param xQueue The handle of the queue the name of which will be returned. + * @return If the queue is in the registry then a pointer to the name of the + * queue is returned. If the queue is not in the registry then NULL is + * returned. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + const char * pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * Generic version of the function used to create a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Generic version of the function used to create a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Queue sets provide a mechanism to allow a task to block (pend) on a read + * operation from multiple queues or semaphores simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * A queue set must be explicitly created using a call to xQueueCreateSet() + * before it can be used. Once created, standard FreeRTOS queues and semaphores + * can be added to the set using calls to xQueueAddToSet(). + * xQueueSelectFromSet() is then used to determine which, if any, of the queues + * or semaphores contained in the set is in a state where a queue read or + * semaphore take operation would be successful. + * + * Note 1: See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: An additional 4 bytes of RAM is required for each space in a every + * queue added to a queue set. Therefore counting semaphores that have a high + * maximum count value should not be added to a queue set. + * + * Note 4: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param uxEventQueueLength Queue sets store events that occur on + * the queues and semaphores contained in the set. uxEventQueueLength specifies + * the maximum number of events that can be queued at once. To be absolutely + * certain that events are not lost uxEventQueueLength should be set to the + * total sum of the length of the queues added to the set, where binary + * semaphores and mutexes have a length of 1, and counting semaphores have a + * length set by their maximum count value. Examples: + * + If a queue set is to hold a queue of length 5, another queue of length 12, + * and a binary semaphore, then uxEventQueueLength should be set to + * (5 + 12 + 1), or 18. + * + If a queue set is to hold three binary semaphores then uxEventQueueLength + * should be set to (1 + 1 + 1 ), or 3. + * + If a queue set is to hold a counting semaphore that has a maximum count of + * 5, and a counting semaphore that has a maximum count of 3, then + * uxEventQueueLength should be set to (5 + 3), or 8. + * + * @return If the queue set is created successfully then a handle to the created + * queue set is returned. Otherwise NULL is returned. + */ +QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; + +/* + * Adds a queue or semaphore to a queue set that was previously created by a + * call to xQueueCreateSet(). + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being added to + * the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set to which the queue or semaphore + * is being added. + * + * @return If the queue or semaphore was successfully added to the queue set + * then pdPASS is returned. If the queue could not be successfully added to the + * queue set because it is already a member of a different queue set then pdFAIL + * is returned. + */ +BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * Removes a queue or semaphore from a queue set. A queue or semaphore can only + * be removed from a set if the queue or semaphore is empty. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being removed + * from the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set in which the queue or semaphore + * is included. + * + * @return If the queue or semaphore was successfully removed from the queue set + * then pdPASS is returned. If the queue was not in the queue set, or the + * queue (or semaphore) was not empty, then pdFAIL is returned. + */ +BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * xQueueSelectFromSet() selects from the members of a queue set a queue or + * semaphore that either contains data (in the case of a queue) or is available + * to take (in the case of a semaphore). xQueueSelectFromSet() effectively + * allows a task to block (pend) on a read operation on all the queues and + * semaphores in a queue set simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueSet The queue set on which the task will (potentially) block. + * + * @param xTicksToWait The maximum time, in ticks, that the calling task will + * remain in the Blocked state (with other tasks executing) to wait for a member + * of the queue set to be ready for a successful queue read or semaphore take + * operation. + * + * @return xQueueSelectFromSet() will return the handle of a queue (cast to + * a QueueSetMemberHandle_t type) contained in the queue set that contains data, + * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained + * in the queue set that is available, or NULL if no such queue or semaphore + * exists before before the specified block time expires. + */ +QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * A version of xQueueSelectFromSet() that can be used from an ISR. + */ +QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* Not public API functions. */ +void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; +void vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* QUEUE_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/semphr.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/semphr.h new file mode 100644 index 000000000..d28d4a045 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/semphr.h @@ -0,0 +1,1189 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include semphr.h" +#endif + +#include "queue.h" + +typedef QueueHandle_t SemaphoreHandle_t; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) +#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + + +/** + * semphr. h + * @code{c} + * vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Macro that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to vSemaphoreCreateBinary (). + * // This is a macro so pass the variable in directly. + * vSemaphoreCreateBinary( xSemaphore ); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define vSemaphoreCreateBinary( xSemaphore ) \ + { \ + ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateBinary( void ); + * @endcode + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see https://www.FreeRTOS.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @return Handle to the created semaphore, or NULL if the memory required to + * hold the semaphore's data structures could not be allocated. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateBinary(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateBinary(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer ); + * @endcode + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * NOTE: In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see https://www.FreeRTOS.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the semaphore is created then a handle to the created semaphore is + * returned. If pxSemaphoreBuffer is NULL then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * StaticSemaphore_t xSemaphoreBuffer; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateBinary(). + * // The semaphore's data structures will be placed in the xSemaphoreBuffer + * // variable, the address of which is passed into the function. The + * // function's parameter is not NULL, so the function will not attempt any + * // dynamic memory allocation, and therefore the function will not return + * // return NULL. + * xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer ); + * + * // Rest of task code goes here. + * } + * @endcode + * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic + * \ingroup Semaphores + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + * @code{c} + * xSemaphoreTake( + * SemaphoreHandle_t xSemaphore, + * TickType_t xBlockTime + * ); + * @endcode + * + * Macro to obtain a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * // A task that creates a semaphore. + * void vATask( void * pvParameters ) + * { + * // Create the semaphore to guard a shared resource. + * xSemaphore = xSemaphoreCreateBinary(); + * } + * + * // A task that uses the semaphore. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xSemaphore != NULL ) + * { + * // See if we can obtain the semaphore. If the semaphore is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the semaphore and can now access the + * // shared resource. + * + * // ... + * + * // We have finished accessing the shared resource. Release the + * // semaphore. + * xSemaphoreGive( xSemaphore ); + * } + * else + * { + * // We could not obtain the semaphore and can therefore not access + * // the shared resource safely. + * } + * } + * } + * @endcode + * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) + +/** + * semphr. h + * @code{c} + * xSemaphoreTakeRecursive( + * SemaphoreHandle_t xMutex, + * TickType_t xBlockTime + * ); + * @endcode + * + * Macro to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xMutex = NULL; + * + * // A task that creates a mutex. + * void vATask( void * pvParameters ) + * { + * // Create the mutex to guard a shared resource. + * xMutex = xSemaphoreCreateRecursiveMutex(); + * } + * + * // A task that uses the mutex. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xMutex != NULL ) + * { + * // See if we can obtain the mutex. If the mutex is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the mutex and can now access the + * // shared resource. + * + * // ... + * // For some reason due to the nature of the code further calls to + * // xSemaphoreTakeRecursive() are made on the same mutex. In real + * // code these would not be just sequential calls as this would make + * // no sense. Instead the calls are likely to be buried inside + * // a more complex call structure. + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * + * // The mutex has now been 'taken' three times, so will not be + * // available to another task until it has also been given back + * // three times. Again it is unlikely that real code would have + * // these calls sequentially, but instead buried in a more complex + * // call structure. This is just for illustrative purposes. + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * + * // Now the mutex can be taken by other tasks. + * } + * else + * { + * // We could not obtain the mutex and can therefore not access + * // the shared resource safely. + * } + * } + * } + * @endcode + * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) +#endif + +/** + * semphr. h + * @code{c} + * xSemaphoreGive( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Create the semaphore to guard a shared resource. + * xSemaphore = vSemaphoreCreateBinary(); + * + * if( xSemaphore != NULL ) + * { + * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + * { + * // We would expect this call to fail because we cannot give + * // a semaphore without first "taking" it! + * } + * + * // Obtain the semaphore - don't block if the semaphore is not + * // immediately available. + * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) ) + * { + * // We now have the semaphore and can access the shared resource. + * + * // ... + * + * // We have finished accessing the shared resource so can free the + * // semaphore. + * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + * { + * // We would not expect this call to fail because we must have + * // obtained the semaphore to get here. + * } + * } + * } + * } + * @endcode + * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + * @code{c} + * xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex ); + * @endcode + * + * Macro to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xMutex = NULL; + * + * // A task that creates a mutex. + * void vATask( void * pvParameters ) + * { + * // Create the mutex to guard a shared resource. + * xMutex = xSemaphoreCreateRecursiveMutex(); + * } + * + * // A task that uses the mutex. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xMutex != NULL ) + * { + * // See if we can obtain the mutex. If the mutex is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the mutex and can now access the + * // shared resource. + * + * // ... + * // For some reason due to the nature of the code further calls to + * // xSemaphoreTakeRecursive() are made on the same mutex. In real + * // code these would not be just sequential calls as this would make + * // no sense. Instead the calls are likely to be buried inside + * // a more complex call structure. + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * + * // The mutex has now been 'taken' three times, so will not be + * // available to another task until it has also been given back + * // three times. Again it is unlikely that real code would have + * // these calls sequentially, it would be more likely that the calls + * // to xSemaphoreGiveRecursive() would be called as a call stack + * // unwound. This is just for demonstrative purposes. + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * + * // Now the mutex can be taken by other tasks. + * } + * else + * { + * // We could not obtain the mutex and can therefore not access + * // the shared resource safely. + * } + * } + * } + * @endcode + * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) +#endif + +/** + * semphr. h + * @code{c} + * xSemaphoreGiveFromISR( + * SemaphoreHandle_t xSemaphore, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + \#define LONG_TIME 0xffff + \#define TICKS_TO_WAIT 10 + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Repetitive task. + * void vATask( void * pvParameters ) + * { + * for( ;; ) + * { + * // We want this task to run every 10 ticks of a timer. The semaphore + * // was created before this task was started. + * + * // Block waiting for the semaphore to become available. + * if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE ) + * { + * // It is time to execute. + * + * // ... + * + * // We have finished our task. Return to the top of the loop where + * // we will block on the semaphore until it is time to execute + * // again. Note when using the semaphore for synchronisation with an + * // ISR in this manner there is no need to 'give' the semaphore back. + * } + * } + * } + * + * // Timer ISR + * void vTimerISR( void * pvParameters ) + * { + * static uint8_t ucLocalTickCount = 0; + * static BaseType_t xHigherPriorityTaskWoken; + * + * // A timer tick has occurred. + * + * // ... Do other time functions. + * + * // Is it time for vATask () to run? + * xHigherPriorityTaskWoken = pdFALSE; + * ucLocalTickCount++; + * if( ucLocalTickCount >= TICKS_TO_WAIT ) + * { + * // Unblock the task by releasing the semaphore. + * xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken ); + * + * // Reset the count so we release the semaphore again in 10 ticks time. + * ucLocalTickCount = 0; + * } + * + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // We can force a context switch here. Context switching from an + * // ISR uses port specific syntax. Check the demo task for your port + * // to find the syntax required. + * } + * } + * @endcode + * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + * @code{c} + * xSemaphoreTakeFromISR( + * SemaphoreHandle_t xSemaphore, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to xSemaphoreCreateBinary() or + * xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR, however taking a semaphore from an ISR + * is not a common operation. It is likely to only be useful when taking a + * counting semaphore when an interrupt is obtaining an object from a resource + * pool (when the semaphore count indicates the number of resources available). + * + * @param xSemaphore A handle to the semaphore being taken. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully taken, otherwise + * pdFALSE + */ +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateMutex( void ); + * @endcode + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return If the mutex was successfully created then a handle to the created + * semaphore is returned. If there was not enough heap to allocate the mutex + * data structures then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateMutex(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer ); + * @endcode + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will be used to hold the mutex's data structure, removing the need for + * the memory to be allocated dynamically. + * + * @return If the mutex was successfully created then a handle to the created + * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xMutexBuffer; + * + * void vATask( void * pvParameters ) + * { + * // A mutex cannot be used before it has been created. xMutexBuffer is + * // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is + * // attempted. + * xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer ); + * + * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, + * // so there is no need to check it. + * } + * @endcode + * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic + * \ingroup Semaphores + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void ); + * @endcode + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateRecursiveMutex(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer ); + * @endcode + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the recursive mutex's data structure, + * removing the need for the memory to be allocated dynamically. + * + * @return If the recursive mutex was successfully created then a handle to the + * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is + * returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xMutexBuffer; + * + * void vATask( void * pvParameters ) + * { + * // A recursive semaphore cannot be used before it is created. Here a + * // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic(). + * // The address of xMutexBuffer is passed into the function, and will hold + * // the mutexes data structures - so no dynamic memory allocation will be + * // attempted. + * xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer ); + * + * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, + * // so there is no need to check it. + * } + * @endcode + * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount ); + * @endcode + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * https://www.FreeRTOS.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer can + * instead optionally provide the memory that will get used by the counting + * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting + * semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Semaphore cannot be used before a call to xSemaphoreCreateCounting(). + * // The max value to which the semaphore can count should be 10, and the + * // initial value assigned to the count should be 0. + * xSemaphore = xSemaphoreCreateCounting( 10, 0 ); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer ); + * @endcode + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * https://www.FreeRTOS.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer must + * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a + * counting semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the counting semaphore was successfully created then a handle to + * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL + * then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xSemaphoreBuffer; + * + * void vATask( void * pvParameters ) + * { + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Counting semaphore cannot be used before they have been created. Create + * // a counting semaphore using xSemaphoreCreateCountingStatic(). The max + * // value to which the semaphore can count is 10, and the initial value + * // assigned to the count will be 0. The address of xSemaphoreBuffer is + * // passed in and will be used to hold the semaphore structure, so no dynamic + * // memory allocation will be used. + * xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer ); + * + * // No memory allocation was attempted so xSemaphore cannot be NULL, so there + * // is no need to check its value. + * } + * @endcode + * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic + * \ingroup Semaphores + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + * @code{c} + * void vSemaphoreDelete( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * Delete a semaphore. This function must be used with care. For example, + * do not delete a mutex type semaphore if the mutex is held by a task. + * + * @param xSemaphore A handle to the semaphore to be deleted. + * + * \defgroup vSemaphoreDelete vSemaphoreDelete + * \ingroup Semaphores + */ +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + * @code{c} + * TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex ); + * @endcode + * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + * Note: This is a good way of determining if the calling task is the mutex + * holder, but not a good way of determining the identity of the mutex holder as + * the holder may change between the function exiting and the returned value + * being tested. + */ +#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) + +/** + * semphr.h + * @code{c} + * TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex ); + * @endcode + * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + */ +#define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) + +/** + * semphr.h + * @code{c} + * UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + * @code{c} + * UBaseType_t uxSemaphoreGetCountFromISR( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * If the semaphore is a counting semaphore then uxSemaphoreGetCountFromISR() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCountFromISR() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCountFromISR( xSemaphore ) uxQueueMessagesWaitingFromISR( ( QueueHandle_t ) ( xSemaphore ) ) + +#endif /* SEMAPHORE_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/stack_macros.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/stack_macros.h new file mode 100644 index 000000000..cfe5b9532 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/stack_macros.h @@ -0,0 +1,137 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +/* + * portSTACK_LIMIT_PADDING is a number of extra words to consider to be in + * use on the stack. + */ +#ifndef portSTACK_LIMIT_PADDING + #define portSTACK_LIMIT_PADDING 0 +#endif + +#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) + +/* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) + +/* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ + const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ + \ + if( ( pulStack[ 0 ] != ulCheckValue ) || \ + ( pulStack[ 1 ] != ulCheckValue ) || \ + ( pulStack[ 2 ] != ulCheckValue ) || \ + ( pulStack[ 3 ] != ulCheckValue ) ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + int8_t * pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ + static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +/* Remove stack overflow macro if not being used. */ +#ifndef taskCHECK_FOR_STACK_OVERFLOW + #define taskCHECK_FOR_STACK_OVERFLOW() +#endif + + + +#endif /* STACK_MACROS_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/stream_buffer.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/stream_buffer.h new file mode 100644 index 000000000..c2812d411 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/stream_buffer.h @@ -0,0 +1,869 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Stream buffers are used to send a continuous stream of data from one task or + * interrupt to another. Their implementation is light weight, making them + * particularly suited for interrupt to task and core to core communication + * scenarios. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section section and set the + * receive block time to 0. + * + */ + +#ifndef STREAM_BUFFER_H +#define STREAM_BUFFER_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include stream_buffer.h" +#endif + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + extern "C" { +#endif +/* *INDENT-ON* */ + +/** + * Type by which stream buffers are referenced. For example, a call to + * xStreamBufferCreate() returns an StreamBufferHandle_t variable that can + * then be used as a parameter to xStreamBufferSend(), xStreamBufferReceive(), + * etc. + */ +struct StreamBufferDef_t; +typedef struct StreamBufferDef_t * StreamBufferHandle_t; + + +/** + * stream_buffer.h + * + * @code{c} + * StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes ); + * @endcode + * + * Creates a new stream buffer using dynamically allocated memory. See + * xStreamBufferCreateStatic() for a version that uses statically allocated + * memory (memory that is allocated at compile time). + * + * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in + * FreeRTOSConfig.h for xStreamBufferCreate() to be available. + * + * @param xBufferSizeBytes The total number of bytes the stream buffer will be + * able to hold at any one time. + * + * @param xTriggerLevelBytes The number of bytes that must be in the stream + * buffer before a task that is blocked on the stream buffer to wait for data is + * moved out of the blocked state. For example, if a task is blocked on a read + * of an empty stream buffer that has a trigger level of 1 then the task will be + * unblocked when a single byte is written to the buffer or the task's block + * time expires. As another example, if a task is blocked on a read of an empty + * stream buffer that has a trigger level of 10 then the task will not be + * unblocked until the stream buffer contains at least 10 bytes or the task's + * block time expires. If a reading task's block time expires before the + * trigger level is reached then the task will still receive however many bytes + * are actually available. Setting a trigger level of 0 will result in a + * trigger level of 1 being used. It is not valid to specify a trigger level + * that is greater than the buffer size. + * + * @return If NULL is returned, then the stream buffer cannot be created + * because there is insufficient heap memory available for FreeRTOS to allocate + * the stream buffer data structures and storage area. A non-NULL value being + * returned indicates that the stream buffer has been created successfully - + * the returned value should be stored as the handle to the created stream + * buffer. + * + * Example use: + * @code{c} + * + * void vAFunction( void ) + * { + * StreamBufferHandle_t xStreamBuffer; + * const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10; + * + * // Create a stream buffer that can hold 100 bytes. The memory used to hold + * // both the stream buffer structure and the data in the stream buffer is + * // allocated dynamically. + * xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel ); + * + * if( xStreamBuffer == NULL ) + * { + * // There was not enough heap memory space available to create the + * // stream buffer. + * } + * else + * { + * // The stream buffer was created successfully and can now be used. + * } + * } + * @endcode + * \defgroup xStreamBufferCreate xStreamBufferCreate + * \ingroup StreamBufferManagement + */ +#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE ) + +/** + * stream_buffer.h + * + * @code{c} + * StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes, + * size_t xTriggerLevelBytes, + * uint8_t *pucStreamBufferStorageArea, + * StaticStreamBuffer_t *pxStaticStreamBuffer ); + * @endcode + * Creates a new stream buffer using statically allocated memory. See + * xStreamBufferCreate() for a version that uses dynamically allocated memory. + * + * configSUPPORT_STATIC_ALLOCATION must be set to 1 in FreeRTOSConfig.h for + * xStreamBufferCreateStatic() to be available. + * + * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the + * pucStreamBufferStorageArea parameter. + * + * @param xTriggerLevelBytes The number of bytes that must be in the stream + * buffer before a task that is blocked on the stream buffer to wait for data is + * moved out of the blocked state. For example, if a task is blocked on a read + * of an empty stream buffer that has a trigger level of 1 then the task will be + * unblocked when a single byte is written to the buffer or the task's block + * time expires. As another example, if a task is blocked on a read of an empty + * stream buffer that has a trigger level of 10 then the task will not be + * unblocked until the stream buffer contains at least 10 bytes or the task's + * block time expires. If a reading task's block time expires before the + * trigger level is reached then the task will still receive however many bytes + * are actually available. Setting a trigger level of 0 will result in a + * trigger level of 1 being used. It is not valid to specify a trigger level + * that is greater than the buffer size. + * + * @param pucStreamBufferStorageArea Must point to a uint8_t array that is at + * least xBufferSizeBytes big. This is the array to which streams are + * copied when they are written to the stream buffer. + * + * @param pxStaticStreamBuffer Must point to a variable of type + * StaticStreamBuffer_t, which will be used to hold the stream buffer's data + * structure. + * + * @return If the stream buffer is created successfully then a handle to the + * created stream buffer is returned. If either pucStreamBufferStorageArea or + * pxStaticstreamBuffer are NULL then NULL is returned. + * + * Example use: + * @code{c} + * + * // Used to dimension the array used to hold the streams. The available space + * // will actually be one less than this, so 999. + #define STORAGE_SIZE_BYTES 1000 + * + * // Defines the memory that will actually hold the streams within the stream + * // buffer. + * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; + * + * // The variable used to hold the stream buffer structure. + * StaticStreamBuffer_t xStreamBufferStruct; + * + * void MyFunction( void ) + * { + * StreamBufferHandle_t xStreamBuffer; + * const size_t xTriggerLevel = 1; + * + * xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucStorageBuffer ), + * xTriggerLevel, + * ucStorageBuffer, + * &xStreamBufferStruct ); + * + * // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer + * // parameters were NULL, xStreamBuffer will not be NULL, and can be used to + * // reference the created stream buffer in other stream buffer API calls. + * + * // Other code that uses the stream buffer can go here. + * } + * + * @endcode + * \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic + * \ingroup StreamBufferManagement + */ +#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) \ + xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE, pucStreamBufferStorageArea, pxStaticStreamBuffer ) + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Sends bytes to a stream buffer. The bytes are copied into the stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferSend() to write to a stream buffer from a task. Use + * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt + * service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer to which a stream is + * being sent. + * + * @param pvTxData A pointer to the buffer that holds the bytes to be copied + * into the stream buffer. + * + * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData + * into the stream buffer. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for enough space to become available in the stream + * buffer, should the stream buffer contain too little space to hold the + * another xDataLengthBytes bytes. The block time is specified in tick periods, + * so the absolute time it represents is dependent on the tick frequency. The + * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds + * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will + * cause the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. If a task times out + * before it can write all xDataLengthBytes into the buffer it will still write + * as many bytes as possible. A task does not use any CPU time when it is in + * the blocked state. + * + * @return The number of bytes written to the stream buffer. If a task times + * out before it can write all xDataLengthBytes into the buffer it will still + * write as many bytes as possible. + * + * Example use: + * @code{c} + * void vAFunction( StreamBufferHandle_t xStreamBuffer ) + * { + * size_t xBytesSent; + * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; + * char *pcStringToSend = "String to send"; + * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); + * + * // Send an array to the stream buffer, blocking for a maximum of 100ms to + * // wait for enough space to be available in the stream buffer. + * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); + * + * if( xBytesSent != sizeof( ucArrayToSend ) ) + * { + * // The call to xStreamBufferSend() times out before there was enough + * // space in the buffer for the data to be written, but it did + * // successfully write xBytesSent bytes. + * } + * + * // Send the string to the stream buffer. Return immediately if there is not + * // enough space in the buffer. + * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The entire string could not be added to the stream buffer because + * // there was not enough free space in the buffer, but xBytesSent bytes + * // were sent. Could try again to send the remaining bytes. + * } + * } + * @endcode + * \defgroup xStreamBufferSend xStreamBufferSend + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * Interrupt safe version of the API function that sends a stream of bytes to + * the stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferSend() to write to a stream buffer from a task. Use + * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt + * service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer to which a stream is + * being sent. + * + * @param pvTxData A pointer to the data that is to be copied into the stream + * buffer. + * + * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData + * into the stream buffer. + * + * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will + * have a task blocked on it waiting for data. Calling + * xStreamBufferSendFromISR() can make data available, and so cause a task that + * was waiting for data to leave the Blocked state. If calling + * xStreamBufferSendFromISR() causes a task to leave the Blocked state, and the + * unblocked task has a priority higher than the currently executing task (the + * task that was interrupted), then, internally, xStreamBufferSendFromISR() + * will set *pxHigherPriorityTaskWoken to pdTRUE. If + * xStreamBufferSendFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. This will + * ensure that the interrupt returns directly to the highest priority Ready + * state task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it + * is passed into the function. See the example code below for an example. + * + * @return The number of bytes actually written to the stream buffer, which will + * be less than xDataLengthBytes if the stream buffer didn't have enough free + * space for all the bytes to be written. + * + * Example use: + * @code{c} + * // A stream buffer that has already been created. + * StreamBufferHandle_t xStreamBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * size_t xBytesSent; + * char *pcStringToSend = "String to send"; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Attempt to send the string to the stream buffer. + * xBytesSent = xStreamBufferSendFromISR( xStreamBuffer, + * ( void * ) pcStringToSend, + * strlen( pcStringToSend ), + * &xHigherPriorityTaskWoken ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // There was not enough free space in the stream buffer for the entire + * // string to be written, ut xBytesSent bytes were written. + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xStreamBufferSendFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * taskYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Receives bytes from a stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferReceive() to read from a stream buffer from a task. Use + * xStreamBufferReceiveFromISR() to read from a stream buffer from an + * interrupt service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer from which bytes are to + * be received. + * + * @param pvRxData A pointer to the buffer into which the received bytes will be + * copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the + * pvRxData parameter. This sets the maximum number of bytes to receive in one + * call. xStreamBufferReceive will return as many bytes as possible up to a + * maximum set by xBufferLengthBytes. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for data to become available if the stream buffer is + * empty. xStreamBufferReceive() will return immediately if xTicksToWait is + * zero. The block time is specified in tick periods, so the absolute time it + * represents is dependent on the tick frequency. The macro pdMS_TO_TICKS() can + * be used to convert a time specified in milliseconds into a time specified in + * ticks. Setting xTicksToWait to portMAX_DELAY will cause the task to wait + * indefinitely (without timing out), provided INCLUDE_vTaskSuspend is set to 1 + * in FreeRTOSConfig.h. A task does not use any CPU time when it is in the + * Blocked state. + * + * @return The number of bytes actually read from the stream buffer, which will + * be less than xBufferLengthBytes if the call to xStreamBufferReceive() timed + * out before xBufferLengthBytes were available. + * + * Example use: + * @code{c} + * void vAFunction( StreamBuffer_t xStreamBuffer ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); + * + * // Receive up to another sizeof( ucRxData ) bytes from the stream buffer. + * // Wait in the Blocked state (so not using any CPU processing time) for a + * // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be + * // available. + * xReceivedBytes = xStreamBufferReceive( xStreamBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * xBlockTime ); + * + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains another xRecievedBytes bytes of data, which can + * // be processed here.... + * } + * } + * @endcode + * \defgroup xStreamBufferReceive xStreamBufferReceive + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * An interrupt safe version of the API function that receives bytes from a + * stream buffer. + * + * Use xStreamBufferReceive() to read bytes from a stream buffer from a task. + * Use xStreamBufferReceiveFromISR() to read bytes from a stream buffer from an + * interrupt service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer from which a stream + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received bytes are + * copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the + * pvRxData parameter. This sets the maximum number of bytes to receive in one + * call. xStreamBufferReceive will return as many bytes as possible up to a + * maximum set by xBufferLengthBytes. + * + * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will + * have a task blocked on it waiting for space to become available. Calling + * xStreamBufferReceiveFromISR() can make space available, and so cause a task + * that is waiting for space to leave the Blocked state. If calling + * xStreamBufferReceiveFromISR() causes a task to leave the Blocked state, and + * the unblocked task has a priority higher than the currently executing task + * (the task that was interrupted), then, internally, + * xStreamBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. + * If xStreamBufferReceiveFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. That will + * ensure the interrupt returns directly to the highest priority Ready state + * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is + * passed into the function. See the code example below for an example. + * + * @return The number of bytes read from the stream buffer, if any. + * + * Example use: + * @code{c} + * // A stream buffer that has already been created. + * StreamBuffer_t xStreamBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Receive the next stream from the stream buffer. + * xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * &xHigherPriorityTaskWoken ); + * + * if( xReceivedBytes > 0 ) + * { + * // ucRxData contains xReceivedBytes read from the stream buffer. + * // Process the stream here.... + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xStreamBufferReceiveFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * taskYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Deletes a stream buffer that was previously created using a call to + * xStreamBufferCreate() or xStreamBufferCreateStatic(). If the stream + * buffer was created using dynamic memory (that is, by xStreamBufferCreate()), + * then the allocated memory is freed. + * + * A stream buffer handle must not be used after the stream buffer has been + * deleted. + * + * @param xStreamBuffer The handle of the stream buffer to be deleted. + * + * \defgroup vStreamBufferDelete vStreamBufferDelete + * \ingroup StreamBufferManagement + */ +void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see if it is full. A stream buffer is full if it + * does not have any free space, and therefore cannot accept any more data. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return If the stream buffer is full then pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferIsFull xStreamBufferIsFull + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see if it is empty. A stream buffer is empty if + * it does not contain any data. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return If the stream buffer is empty then pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferIsEmpty xStreamBufferIsEmpty + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Resets a stream buffer to its initial, empty, state. Any data that was in + * the stream buffer is discarded. A stream buffer can only be reset if there + * are no tasks blocked waiting to either send to or receive from the stream + * buffer. + * + * @param xStreamBuffer The handle of the stream buffer being reset. + * + * @return If the stream buffer is reset then pdPASS is returned. If there was + * a task blocked waiting to send to or read from the stream buffer then the + * stream buffer is not reset and pdFAIL is returned. + * + * \defgroup xStreamBufferReset xStreamBufferReset + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see how much free space it contains, which is + * equal to the amount of data that can be sent to the stream buffer before it + * is full. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return The number of bytes that can be written to the stream buffer before + * the stream buffer would be full. + * + * \defgroup xStreamBufferSpacesAvailable xStreamBufferSpacesAvailable + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see how much data it contains, which is equal to + * the number of bytes that can be read from the stream buffer before the stream + * buffer would be empty. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return The number of bytes that can be read from the stream buffer before + * the stream buffer would be empty. + * + * \defgroup xStreamBufferBytesAvailable xStreamBufferBytesAvailable + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ); + * @endcode + * + * A stream buffer's trigger level is the number of bytes that must be in the + * stream buffer before a task that is blocked on the stream buffer to + * wait for data is moved out of the blocked state. For example, if a task is + * blocked on a read of an empty stream buffer that has a trigger level of 1 + * then the task will be unblocked when a single byte is written to the buffer + * or the task's block time expires. As another example, if a task is blocked + * on a read of an empty stream buffer that has a trigger level of 10 then the + * task will not be unblocked until the stream buffer contains at least 10 bytes + * or the task's block time expires. If a reading task's block time expires + * before the trigger level is reached then the task will still receive however + * many bytes are actually available. Setting a trigger level of 0 will result + * in a trigger level of 1 being used. It is not valid to specify a trigger + * level that is greater than the buffer size. + * + * A trigger level is set when the stream buffer is created, and can be modified + * using xStreamBufferSetTriggerLevel(). + * + * @param xStreamBuffer The handle of the stream buffer being updated. + * + * @param xTriggerLevel The new trigger level for the stream buffer. + * + * @return If xTriggerLevel was less than or equal to the stream buffer's length + * then the trigger level will be updated and pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is sent to a message buffer or stream buffer. If there was a task that + * was blocked on the message or stream buffer waiting for data to arrive then + * the sbSEND_COMPLETED() macro sends a notification to the task to remove it + * from the Blocked state. xStreamBufferSendCompletedFromISR() does the same + * thing. It is provided to enable application writers to implement their own + * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer to which data was + * written. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xStreamBufferSendCompletedFromISR(). If calling + * xStreamBufferSendCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is read out of a message buffer or stream buffer. If there was a task + * that was blocked on the message or stream buffer waiting for data to arrive + * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to + * remove it from the Blocked state. xStreamBufferReceiveCompletedFromISR() + * does the same thing. It is provided to enable application writers to + * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT + * ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer from which data was + * read. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xStreamBufferReceiveCompletedFromISR(). If calling + * xStreamBufferReceiveCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* Functions below here are not part of the public API. */ +StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer ) PRIVILEGED_FUNCTION; + +StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer ) PRIVILEGED_FUNCTION; + +size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_TRACE_FACILITY == 1 ) + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, + UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; +#endif + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + } +#endif +/* *INDENT-ON* */ + +#endif /* !defined( STREAM_BUFFER_H ) */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/task.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/task.h new file mode 100644 index 000000000..ec80cd9a9 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/task.h @@ -0,0 +1,3112 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef INC_TASK_H +#define INC_TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include "list.h" + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- +* MACROS AND DEFINITIONS +*----------------------------------------------------------*/ + +/* + * If tskKERNEL_VERSION_NUMBER ends with + it represents the version in development + * after the numbered release. + * + * The tskKERNEL_VERSION_MAJOR, tskKERNEL_VERSION_MINOR, tskKERNEL_VERSION_BUILD + * values will reflect the last released version number. + */ +#define tskKERNEL_VERSION_NUMBER "V10.4.6" +#define tskKERNEL_VERSION_MAJOR 10 +#define tskKERNEL_VERSION_MINOR 4 +#define tskKERNEL_VERSION_BUILD 6 + +/* MPU region parameters passed in ulParameters + * of MemoryRegion_t struct. */ +#define tskMPU_REGION_READ_ONLY ( 1UL << 0UL ) +#define tskMPU_REGION_READ_WRITE ( 1UL << 1UL ) +#define tskMPU_REGION_EXECUTE_NEVER ( 1UL << 2UL ) +#define tskMPU_REGION_NORMAL_MEMORY ( 1UL << 3UL ) +#define tskMPU_REGION_DEVICE_MEMORY ( 1UL << 4UL ) + +/* The direct to task notification feature used to have only a single notification + * per task. Now there is an array of notifications per task that is dimensioned by + * configTASK_NOTIFICATION_ARRAY_ENTRIES. For backward compatibility, any use of the + * original direct to task notification defaults to using the first index in the + * array. */ +#define tskDEFAULT_INDEX_TO_NOTIFY ( 0 ) + +/** + * task. h + * + * Type by which tasks are referenced. For example, a call to xTaskCreate + * returns (via a pointer parameter) an TaskHandle_t variable that can then + * be used as a parameter to vTaskDelete to delete the task. + * + * \defgroup TaskHandle_t TaskHandle_t + * \ingroup Tasks + */ +struct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct tskTaskControlBlock * TaskHandle_t; + +/* + * Defines the prototype to which the application task hook function must + * conform. + */ +typedef BaseType_t (* TaskHookFunction_t)( void * ); + +/* Task states returned by eTaskGetState. */ +typedef enum +{ + eRunning = 0, /* A task is querying the state of itself, so must be running. */ + eReady, /* The task being queried is in a ready or pending ready list. */ + eBlocked, /* The task being queried is in the Blocked state. */ + eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ + eInvalid /* Used as an 'invalid state' value. */ +} eTaskState; + +/* Actions that can be performed when vTaskNotify() is called. */ +typedef enum +{ + eNoAction = 0, /* Notify the task without updating its notify value. */ + eSetBits, /* Set bits in the task's notification value. */ + eIncrement, /* Increment the task's notification value. */ + eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ + eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ +} eNotifyAction; + +/* + * Used internally only. + */ +typedef struct xTIME_OUT +{ + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; +} TimeOut_t; + +/* + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void * pvBaseAddress; + uint32_t ulLengthInBytes; + uint32_t ulParameters; +} MemoryRegion_t; + +/* + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMETERS +{ + TaskFunction_t pvTaskCode; + const char * pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + configSTACK_DEPTH_TYPE usStackDepth; + void * pvParameters; + UBaseType_t uxPriority; + StackType_t * puxStackBuffer; + MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; + #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + StaticTask_t * const pxTaskBuffer; + #endif +} TaskParameters_t; + +/* Used with the uxTaskGetSystemState() function to return the state of each task + * in the system. */ +typedef struct xTASK_STATUS +{ + TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ + const char * pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + UBaseType_t xTaskNumber; /* A number unique to the task. */ + eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ + UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ + UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ + configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See https://www.FreeRTOS.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ + StackType_t * pxStackBase; /* Points to the lowest address of the task's stack area. */ + configSTACK_DEPTH_TYPE usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ +} TaskStatus_t; + +/* Possible return values for eTaskConfirmSleepModeStatus(). */ +typedef enum +{ + eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPRESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ + eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ + eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ +} eSleepModeStatus; + +/** + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \defgroup taskYIELD taskYIELD + * \ingroup SchedulerControl + */ +#define taskYIELD() portYIELD() + +/** + * task. h + * + * Macro to mark the start of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL + * \ingroup SchedulerControl + */ +#define taskENTER_CRITICAL() portENTER_CRITICAL() +#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + +/** + * task. h + * + * Macro to mark the end of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL + * \ingroup SchedulerControl + */ +#define taskEXIT_CRITICAL() portEXIT_CRITICAL() +#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) + +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() + +/* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is + * 0 to generate more optimal code when configASSERT() is defined as the constant + * is used in assert() statements. */ +#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) +#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) +#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) + + +/*----------------------------------------------------------- +* TASK CREATION API +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * BaseType_t xTaskCreate( + * TaskFunction_t pxTaskCode, + * const char *pcName, + * configSTACK_DEPTH_TYPE usStackDepth, + * void *pvParameters, + * UBaseType_t uxPriority, + * TaskHandle_t *pxCreatedTask + * ); + * @endcode + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * See xTaskCreateStatic() for a version that does not use any dynamic memory + * allocation. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pxTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // Task to be created. + * void vTaskCode( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * } + * } + * + * // Function that creates a task. + * void vOtherFunction( void ) + * { + * static uint8_t ucParameterToPass; + * TaskHandle_t xHandle = NULL; + * + * // Create the task, storing the handle. Note that the passed parameter ucParameterToPass + * // must exist for the lifetime of the task, so in this case is declared static. If it was just an + * // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time + * // the new task attempts to access it. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); + * configASSERT( xHandle ); + * + * // Use the handle to delete the task. + * if( xHandle != NULL ) + * { + * vTaskDelete( xHandle ); + * } + * } + * @endcode + * \defgroup xTaskCreate xTaskCreate + * \ingroup Tasks + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + * const char *pcName, + * uint32_t ulStackDepth, + * void *pvParameters, + * UBaseType_t uxPriority, + * StackType_t *puxStackBuffer, + * StaticTask_t *pxTaskBuffer ); + * @endcode + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * @param pxTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. The maximum length of the string is defined by + * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. + * + * @param ulStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 32-bits wide and ulStackDepth is defined as 100 then 400 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task will run. + * + * @param puxStackBuffer Must point to a StackType_t array that has at least + * ulStackDepth indexes - the array will then be used as the task's stack, + * removing the need for the stack to be allocated dynamically. + * + * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will + * then be used to hold the task's data structures, removing the need for the + * memory to be allocated dynamically. + * + * @return If neither puxStackBuffer nor pxTaskBuffer are NULL, then the task + * will be created and a handle to the created task is returned. If either + * puxStackBuffer or pxTaskBuffer are NULL then the task will not be created and + * NULL is returned. + * + * Example usage: + * @code{c} + * + * // Dimensions of the buffer that the task being created will use as its stack. + * // NOTE: This is the number of words the stack will hold, not the number of + * // bytes. For example, if each stack item is 32-bits, and this is set to 100, + * // then 400 bytes (100 * 32-bits) will be allocated. + #define STACK_SIZE 200 + * + * // Structure that will hold the TCB of the task being created. + * StaticTask_t xTaskBuffer; + * + * // Buffer that the task being created will use as its stack. Note this is + * // an array of StackType_t variables. The size of StackType_t is dependent on + * // the RTOS port. + * StackType_t xStack[ STACK_SIZE ]; + * + * // Function that implements the task being created. + * void vTaskCode( void * pvParameters ) + * { + * // The parameter value is expected to be 1 as 1 is passed in the + * // pvParameters value in the call to xTaskCreateStatic(). + * configASSERT( ( uint32_t ) pvParameters == 1UL ); + * + * for( ;; ) + * { + * // Task code goes here. + * } + * } + * + * // Function that creates a task. + * void vOtherFunction( void ) + * { + * TaskHandle_t xHandle = NULL; + * + * // Create the task without using any dynamic memory allocation. + * xHandle = xTaskCreateStatic( + * vTaskCode, // Function that implements the task. + * "NAME", // Text name for the task. + * STACK_SIZE, // Stack size in words, not bytes. + * ( void * ) 1, // Parameter passed into the task. + * tskIDLE_PRIORITY,// Priority at which the task is created. + * xStack, // Array to use as the task's stack. + * &xTaskBuffer ); // Variable to hold the task's data structure. + * + * // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have + * // been created, and xHandle will be the task's handle. Use the handle + * // to suspend the task. + * vTaskSuspend( xHandle ); + * } + * @endcode + * \defgroup xTaskCreateStatic xTaskCreateStatic + * \ingroup Tasks + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * task. h + * @code{c} + * BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask ); + * @endcode + * + * Only available when configSUPPORT_DYNAMIC_ALLOCATION is set to 1. + * + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * See xTaskCreateRestrictedStatic() for a version that does not use any + * dynamic memory allocation. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // Create an TaskParameters_t structure that defines the task to be created. + * static const TaskParameters_t xCheckTaskParameters = + * { + * vATask, // pvTaskCode - the function that implements the task. + * "ATask", // pcName - just a text name for the task to assist debugging. + * 100, // usStackDepth - the stack size DEFINED IN WORDS. + * NULL, // pvParameters - passed into the task function as the function parameters. + * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + * + * // xRegions - Allocate up to three separate memory regions for access by + * // the task, with appropriate access permissions. Different processors have + * // different memory alignment requirements - refer to the FreeRTOS documentation + * // for full information. + * { + * // Base address Length Parameters + * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + * } + * }; + * + * int main( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task from the const structure defined above. The task handle + * // is requested (the second parameter is not NULL) but in this case just for + * // demonstration purposes as its not actually used. + * xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); + * + * // Start the scheduler. + * vTaskStartScheduler(); + * + * // Will only get here if there was insufficient memory to create the idle + * // and/or timer task. + * for( ;; ); + * } + * @endcode + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * BaseType_t xTaskCreateRestrictedStatic( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask ); + * @endcode + * + * Only available when configSUPPORT_STATIC_ALLOCATION is set to 1. + * + * xTaskCreateRestrictedStatic() should only be used in systems that include an + * MPU implementation. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreateRestricted() then the stack is provided by the application writer, + * and the memory used to hold the task's data structure is automatically + * dynamically allocated inside the xTaskCreateRestricted() function. If a task + * is created using xTaskCreateRestrictedStatic() then the application writer + * must provide the memory used to hold the task's data structures too. + * xTaskCreateRestrictedStatic() therefore allows a memory protected task to be + * created without using any dynamic memory allocation. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. If configSUPPORT_STATIC_ALLOCATION is set to 1 the structure + * contains an additional member, which is used to point to a variable of type + * StaticTask_t - which is then used to hold the task's data structure. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // Create an TaskParameters_t structure that defines the task to be created. + * // The StaticTask_t variable is only included in the structure when + * // configSUPPORT_STATIC_ALLOCATION is set to 1. The PRIVILEGED_DATA macro can + * // be used to force the variable into the RTOS kernel's privileged data area. + * static PRIVILEGED_DATA StaticTask_t xTaskBuffer; + * static const TaskParameters_t xCheckTaskParameters = + * { + * vATask, // pvTaskCode - the function that implements the task. + * "ATask", // pcName - just a text name for the task to assist debugging. + * 100, // usStackDepth - the stack size DEFINED IN WORDS. + * NULL, // pvParameters - passed into the task function as the function parameters. + * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + * + * // xRegions - Allocate up to three separate memory regions for access by + * // the task, with appropriate access permissions. Different processors have + * // different memory alignment requirements - refer to the FreeRTOS documentation + * // for full information. + * { + * // Base address Length Parameters + * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + * } + * + * &xTaskBuffer; // Holds the task's data structure. + * }; + * + * int main( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task from the const structure defined above. The task handle + * // is requested (the second parameter is not NULL) but in this case just for + * // demonstration purposes as its not actually used. + * xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); + * + * // Start the scheduler. + * vTaskStartScheduler(); + * + * // Will only get here if there was insufficient memory to create the idle + * // and/or timer task. + * for( ;; ); + * } + * @endcode + * \defgroup xTaskCreateRestrictedStatic xTaskCreateRestrictedStatic + * \ingroup Tasks + */ +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ); + * @endcode + * + * Memory regions are assigned to a restricted task when the task is created by + * a call to xTaskCreateRestricted(). These regions can be redefined using + * vTaskAllocateMPURegions(). + * + * @param xTask The handle of the task being updated. + * + * @param xRegions A pointer to a MemoryRegion_t structure that contains the + * new memory region definitions. + * + * Example usage: + * @code{c} + * // Define an array of MemoryRegion_t structures that configures an MPU region + * // allowing read/write access for 1024 bytes starting at the beginning of the + * // ucOneKByte array. The other two of the maximum 3 definable regions are + * // unused so set to zero. + * static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] = + * { + * // Base address Length Parameters + * { ucOneKByte, 1024, portMPU_REGION_READ_WRITE }, + * { 0, 0, 0 }, + * { 0, 0, 0 } + * }; + * + * void vATask( void *pvParameters ) + * { + * // This task was created such that it has access to certain regions of + * // memory as defined by the MPU configuration. At some point it is + * // desired that these MPU regions are replaced with that defined in the + * // xAltRegions const struct above. Use a call to vTaskAllocateMPURegions() + * // for this purpose. NULL is used as the task handle to indicate that this + * // function should modify the MPU regions of the calling task. + * vTaskAllocateMPURegions( NULL, xAltRegions ); + * + * // Now the task can continue its function, but from this point on can only + * // access its stack and the ucOneKByte array (unless any other statically + * // defined or shared regions have been declared elsewhere). + * } + * @endcode + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +void vTaskAllocateMPURegions( TaskHandle_t xTask, + const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskDelete( TaskHandle_t xTaskToDelete ); + * @endcode + * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Remove a task from the RTOS real time kernel's management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * + * NOTE: The idle task is responsible for freeing the kernel allocated + * memory from tasks that have been deleted. It is therefore important that + * the idle task is not starved of microcontroller processing time if your + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param xTaskToDelete The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: + * @code{c} + * void vOtherFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create the task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // Use the handle to delete the task. + * vTaskDelete( xHandle ); + * } + * @endcode + * \defgroup vTaskDelete vTaskDelete + * \ingroup Tasks + */ +void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- +* TASK CONTROL API +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * void vTaskDelay( const TickType_t xTicksToDelay ); + * @endcode + * + * Delay a task for a given number of ticks. The actual time that the + * task remains blocked depends on the tick rate. The constant + * portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * + * vTaskDelay() specifies a time at which the task wishes to unblock relative to + * the time at which vTaskDelay() is called. For example, specifying a block + * period of 100 ticks will cause the task to unblock 100 ticks after + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a periodic task as the path taken through the + * code, as well as other task and interrupt activity, will affect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See xTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + * + * void vTaskFunction( void * pvParameters ) + * { + * // Block for 500ms. + * const TickType_t xDelay = 500 / portTICK_PERIOD_MS; + * + * for( ;; ) + * { + * // Simply toggle the LED every 500ms, blocking between each toggle. + * vToggleLED(); + * vTaskDelay( xDelay ); + * } + * } + * + * \defgroup vTaskDelay vTaskDelay + * \ingroup TaskCtrl + */ +void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * BaseType_t xTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement ); + * @endcode + * + * INCLUDE_xTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Delay a task until a specified time. This function can be used by periodic + * tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, xTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The macro pdMS_TO_TICKS() can be used to calculate the number of ticks from a + * time specified in milliseconds with a resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within xTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling xTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * @return Value which can be used to check whether the task was actually delayed. + * Will be pdTRUE if the task way delayed and pdFALSE otherwise. A task will not + * be delayed if the next expected wake time is in the past. + * + * Example usage: + * @code{c} + * // Perform an action every 10 ticks. + * void vTaskFunction( void * pvParameters ) + * { + * TickType_t xLastWakeTime; + * const TickType_t xFrequency = 10; + * BaseType_t xWasDelayed; + * + * // Initialise the xLastWakeTime variable with the current time. + * xLastWakeTime = xTaskGetTickCount (); + * for( ;; ) + * { + * // Wait for the next cycle. + * xWasDelayed = xTaskDelayUntil( &xLastWakeTime, xFrequency ); + * + * // Perform action here. xWasDelayed value can be used to determine + * // whether a deadline was missed if the code here took too long. + * } + * } + * @endcode + * \defgroup xTaskDelayUntil xTaskDelayUntil + * \ingroup TaskCtrl + */ +BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; + +/* + * vTaskDelayUntil() is the older version of xTaskDelayUntil() and does not + * return a value. + */ +#define vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ) \ + { \ + ( void ) xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); \ + } + + +/** + * task. h + * @code{c} + * BaseType_t xTaskAbortDelay( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this + * function to be available. + * + * A task will enter the Blocked state when it is waiting for an event. The + * event it is waiting for can be a temporal event (waiting for a time), such + * as when vTaskDelay() is called, or an event on an object, such as when + * xQueueReceive() or ulTaskNotifyTake() is called. If the handle of a task + * that is in the Blocked state is used in a call to xTaskAbortDelay() then the + * task will leave the Blocked state, and return from whichever function call + * placed the task into the Blocked state. + * + * There is no 'FromISR' version of this function as an interrupt would need to + * know which object a task was blocked on in order to know which actions to + * take. For example, if the task was blocked on a queue the interrupt handler + * would then need to know if the queue was locked. + * + * @param xTask The handle of the task to remove from the Blocked state. + * + * @return If the task referenced by xTask was not in the Blocked state then + * pdFAIL is returned. Otherwise pdPASS is returned. + * + * \defgroup xTaskAbortDelay xTaskAbortDelay + * \ingroup TaskCtrl + */ +BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the priority of any task. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of xTask. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to obtain the priority of the created task. + * // It was created with tskIDLE_PRIORITY, but may have changed + * // it itself. + * if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY ) + * { + * // The task has changed it's priority. + * } + * + * // ... + * + * // Is our priority higher than the created task? + * if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) ) + * { + * // Our priority (obtained using NULL handle) is higher. + * } + * } + * @endcode + * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * \ingroup TaskCtrl + */ +UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ); + * @endcode + * + * A version of uxTaskPriorityGet() that can be used from an ISR. + */ +UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * eTaskState eTaskGetState( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the state of any task. States are encoded by the eTaskState + * enumerated type. + * + * @param xTask Handle of the task to be queried. + * + * @return The state of xTask at the time the function was called. Note the + * state of the task might change between the function being called, and the + * functions return value being tested by the calling task. + */ +eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ); + * @endcode + * + * configUSE_TRACE_FACILITY must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * Populates a TaskStatus_t structure with information about a task. + * + * @param xTask Handle of the task being queried. If xTask is NULL then + * information will be returned about the calling task. + * + * @param pxTaskStatus A pointer to the TaskStatus_t structure that will be + * filled with information about the task referenced by the handle passed using + * the xTask parameter. + * + * @xGetFreeStackSpace The TaskStatus_t structure contains a member to report + * the stack high water mark of the task being queried. Calculating the stack + * high water mark takes a relatively long time, and can make the system + * temporarily unresponsive - so the xGetFreeStackSpace parameter is provided to + * allow the high water mark checking to be skipped. The high watermark value + * will only be written to the TaskStatus_t structure if xGetFreeStackSpace is + * not set to pdFALSE; + * + * @param eState The TaskStatus_t structure contains a member to report the + * state of the task being queried. Obtaining the task state is not as fast as + * a simple assignment - so the eState parameter is provided to allow the state + * information to be omitted from the TaskStatus_t structure. To obtain state + * information then set eState to eInvalid - otherwise the value passed in + * eState will be reported as the task state in the TaskStatus_t structure. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * TaskStatus_t xTaskDetails; + * + * // Obtain the handle of a task from its name. + * xHandle = xTaskGetHandle( "Task_Name" ); + * + * // Check the handle is not NULL. + * configASSERT( xHandle ); + * + * // Use the handle to obtain further information about the task. + * vTaskGetInfo( xHandle, + * &xTaskDetails, + * pdTRUE, // Include the high water mark in xTaskDetails. + * eInvalid ); // Include the task state in xTaskDetails. + * } + * @endcode + * \defgroup vTaskGetInfo vTaskGetInfo + * \ingroup TaskCtrl + */ +void vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ); + * @endcode + * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Set the priority of any task. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param xTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to raise the priority of the created task. + * vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 ); + * + * // ... + * + * // Use a NULL handle to raise our priority to the same value. + * vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 ); + * } + * @endcode + * \defgroup vTaskPrioritySet vTaskPrioritySet + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskSuspend( TaskHandle_t xTaskToSuspend ); + * @endcode + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Suspend any task. When suspended a task will never get any microcontroller + * processing time, no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to suspend the created task. + * vTaskSuspend( xHandle ); + * + * // ... + * + * // The created task will not run during this period, unless + * // another task calls vTaskResume( xHandle ). + * + * //... + * + * + * // Suspend ourselves. + * vTaskSuspend( NULL ); + * + * // We cannot get here unless another task calls vTaskResume + * // with our handle as the parameter. + * } + * @endcode + * \defgroup vTaskSuspend vTaskSuspend + * \ingroup TaskCtrl + */ +void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskResume( TaskHandle_t xTaskToResume ); + * @endcode + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Resumes a suspended task. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * vTaskResume (). + * + * @param xTaskToResume Handle to the task being readied. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to suspend the created task. + * vTaskSuspend( xHandle ); + * + * // ... + * + * // The created task will not run during this period, unless + * // another task calls vTaskResume( xHandle ). + * + * //... + * + * + * // Resume the suspended task ourselves. + * vTaskResume( xHandle ); + * + * // The created task will once again get microcontroller processing + * // time in accordance with its priority within the system. + * } + * @endcode + * \defgroup vTaskResume vTaskResume + * \ingroup TaskCtrl + */ +void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void xTaskResumeFromISR( TaskHandle_t xTaskToResume ); + * @endcode + * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * An implementation of vTaskResume() that can be called from within an ISR. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * xTaskResumeFromISR (). + * + * xTaskResumeFromISR() should not be used to synchronise a task with an + * interrupt if there is a chance that the interrupt could arrive prior to the + * task being suspended - as this can lead to interrupts being missed. Use of a + * semaphore as a synchronisation mechanism would avoid this eventuality. + * + * @param xTaskToResume Handle to the task being readied. + * + * @return pdTRUE if resuming the task should result in a context switch, + * otherwise pdFALSE. This is used by the ISR to determine if a context switch + * may be required following the ISR. + * + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * \ingroup TaskCtrl + */ +BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- +* SCHEDULER CONTROL +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * void vTaskStartScheduler( void ); + * @endcode + * + * Starts the real time kernel tick processing. After calling the kernel + * has control over which tasks are executed and when. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * // Create at least one task before starting the kernel. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + * + * // Start the real time kernel with preemption. + * vTaskStartScheduler (); + * + * // Will not get here unless a task calls vTaskEndScheduler () + * } + * @endcode + * + * \defgroup vTaskStartScheduler vTaskStartScheduler + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskEndScheduler( void ); + * @endcode + * + * NOTE: At the time of writing only the x86 real mode port, which runs on a PC + * in place of DOS, implements this function. + * + * Stops the real time kernel tick. All created tasks will be automatically + * deleted and multitasking (either preemptive or cooperative) will + * stop. Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: + * @code{c} + * void vTaskCode( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // At some point we want to end the real time kernel processing + * // so call ... + * vTaskEndScheduler (); + * } + * } + * + * void vAFunction( void ) + * { + * // Create at least one task before starting the kernel. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + * + * // Start the real time kernel with preemption. + * vTaskStartScheduler (); + * + * // Will only get here when the vTaskCode () task has called + * // vTaskEndScheduler (). When we get here we are back to single task + * // execution. + * } + * @endcode + * + * \defgroup vTaskEndScheduler vTaskEndScheduler + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskSuspendAll( void ); + * @endcode + * + * Suspends the scheduler without disabling interrupts. Context switches will + * not occur while the scheduler is suspended. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * xTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: + * @code{c} + * void vTask1( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // ... + * + * // At some point the task wants to perform a long operation during + * // which it does not want to get swapped out. It cannot use + * // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + * // operation may cause interrupts to be missed - including the + * // ticks. + * + * // Prevent the real time kernel swapping out the task. + * vTaskSuspendAll (); + * + * // Perform the operation here. There is no need to use critical + * // sections as we have all the microcontroller processing time. + * // During this time interrupts will still operate and the kernel + * // tick count will be maintained. + * + * // ... + * + * // The operation is complete. Restart the kernel. + * xTaskResumeAll (); + * } + * } + * @endcode + * \defgroup vTaskSuspendAll vTaskSuspendAll + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * BaseType_t xTaskResumeAll( void ); + * @endcode + * + * Resumes scheduler activity after it was suspended by a call to + * vTaskSuspendAll(). + * + * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks + * that were previously suspended by a call to vTaskSuspend(). + * + * @return If resuming the scheduler caused a context switch then pdTRUE is + * returned, otherwise pdFALSE is returned. + * + * Example usage: + * @code{c} + * void vTask1( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // ... + * + * // At some point the task wants to perform a long operation during + * // which it does not want to get swapped out. It cannot use + * // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + * // operation may cause interrupts to be missed - including the + * // ticks. + * + * // Prevent the real time kernel swapping out the task. + * vTaskSuspendAll (); + * + * // Perform the operation here. There is no need to use critical + * // sections as we have all the microcontroller processing time. + * // During this time interrupts will still operate and the real + * // time kernel tick count will be maintained. + * + * // ... + * + * // The operation is complete. Restart the kernel. We want to force + * // a context switch - but there is no point if resuming the scheduler + * // caused a context switch already. + * if( !xTaskResumeAll () ) + * { + * taskYIELD (); + * } + * } + * } + * @endcode + * \defgroup xTaskResumeAll xTaskResumeAll + * \ingroup SchedulerControl + */ +BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- +* TASK UTILITIES +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * TickType_t xTaskGetTickCount( void ); + * @endcode + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \defgroup xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * TickType_t xTaskGetTickCountFromISR( void ); + * @endcode + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that TickType_t is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * uint16_t uxTaskGetNumberOfTasks( void ); + * @endcode + * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * \ingroup TaskUtils + */ +UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * char *pcTaskGetName( TaskHandle_t xTaskToQuery ); + * @endcode + * + * @return The text (human readable) name of the task referenced by the handle + * xTaskToQuery. A task can query its own name by either passing in its own + * handle, or by setting xTaskToQuery to NULL. + * + * \defgroup pcTaskGetName pcTaskGetName + * \ingroup TaskUtils + */ +char * pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + * @code{c} + * TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ); + * @endcode + * + * NOTE: This function takes a relatively long time to complete and should be + * used sparingly. + * + * @return The handle of the task that has the human readable name pcNameToQuery. + * NULL is returned if no matching name is found. INCLUDE_xTaskGetHandle + * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available. + * + * \defgroup pcTaskGetHandle pcTaskGetHandle + * \ingroup TaskUtils + */ +TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task.h + * @code{c} + * UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskGetStackHighWaterMark2 must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* When using trace macros it is sometimes necessary to include task.h before + * FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, + * so the following two prototypes will cause a compilation error. This can be + * fixed by simply guarding against the inclusion of these two prototypes unless + * they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration + * constant. */ +#ifdef configUSE_APPLICATION_TASK_TAG + #if configUSE_APPLICATION_TASK_TAG == 1 + +/** + * task.h + * @code{c} + * void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ); + * @endcode + * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * Passing xTask as NULL has the effect of setting the calling tasks hook + * function. + */ + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * void xTaskGetApplicationTaskTag( TaskHandle_t xTask ); + * @endcode + * + * Returns the pxHookFunction value assigned to the task xTask. Do not + * call from an interrupt service routine - call + * xTaskGetApplicationTaskTagFromISR() instead. + */ + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * void xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ); + * @endcode + * + * Returns the pxHookFunction value assigned to the task xTask. Can + * be called from an interrupt service routine. + */ + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + +/* Each task contains an array of pointers that is dimensioned by the + * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The + * kernel does not use the pointers itself, so the application writer can use + * the pointers for any purpose they wish. The following two functions are + * used to set and query a pointer respectively. */ + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) PRIVILEGED_FUNCTION; + void * pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) PRIVILEGED_FUNCTION; + +#endif + +#if ( configCHECK_FOR_STACK_OVERFLOW > 0 ) + +/** + * task.h + * @code{c} + * void vApplicationStackOverflowHook( TaskHandle_t xTask char *pcTaskName); + * @endcode + * + * The application stack overflow hook is called when a stack overflow is detected for a task. + * + * Details on stack overflow detection can be found here: https://www.FreeRTOS.org/Stacks-and-stack-overflow-checking.html + * + * @param xTask the task that just exceeded its stack boundaries. + * @param pcTaskName A character string containing the name of the offending task. + */ + void vApplicationStackOverflowHook( TaskHandle_t xTask, + char * pcTaskName ); + +#endif + +#if ( configUSE_TICK_HOOK > 0 ) + +/** + * task.h + * @code{c} + * void vApplicationTickHook( void ); + * @endcode + * + * This hook function is called in the system tick handler after any OS work is completed. + */ + void vApplicationTickHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */ + +#endif + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + +/** + * task.h + * @code{c} + * void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) + * @endcode + * + * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Idle Task TCB. This function is required when + * configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION + * + * @param ppxIdleTaskTCBBuffer A handle to a statically allocated TCB buffer + * @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task + * @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer + */ + void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, + StackType_t ** ppxIdleTaskStackBuffer, + uint32_t * pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */ +#endif + +/** + * task.h + * @code{c} + * BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ); + * @endcode + * + * Calls the hook function associated with xTask. Passing xTask as NULL has + * the effect of calling the Running tasks (the calling task) hook function. + * + * pvParameter is passed to the hook function for the task to interpret as it + * wants. The return value is the value returned by the task hook function + * registered by the user. + */ +BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) PRIVILEGED_FUNCTION; + +/** + * xTaskGetIdleTaskHandle() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * Simply returns the handle of the idle task. It is not valid to call + * xTaskGetIdleTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for + * uxTaskGetSystemState() to be available. + * + * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in + * the system. TaskStatus_t structures contain, among other things, members + * for the task handle, task name, task priority, task state, and total amount + * of run time consumed by the task. See the TaskStatus_t structure + * definition in this file for the full member list. + * + * NOTE: This function is intended for debugging use only as its use results in + * the scheduler remaining suspended for an extended period. + * + * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. + * The array must contain at least one TaskStatus_t structure for each task + * that is under the control of the RTOS. The number of tasks under the control + * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. + * + * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray + * parameter. The size is specified as the number of indexes in the array, or + * the number of TaskStatus_t structures contained in the array, not by the + * number of bytes in the array. + * + * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in + * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the + * total run time (as defined by the run time stats clock, see + * https://www.FreeRTOS.org/rtos-run-time-stats.html) since the target booted. + * pulTotalRunTime can be set to NULL to omit the total run time information. + * + * @return The number of TaskStatus_t structures that were populated by + * uxTaskGetSystemState(). This should equal the number returned by the + * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed + * in the uxArraySize parameter was too small. + * + * Example usage: + * @code{c} + * // This example demonstrates how a human readable table of run time stats + * // information is generated from raw data provided by uxTaskGetSystemState(). + * // The human readable table is written to pcWriteBuffer + * void vTaskGetRunTimeStats( char *pcWriteBuffer ) + * { + * TaskStatus_t *pxTaskStatusArray; + * volatile UBaseType_t uxArraySize, x; + * configRUN_TIME_COUNTER_TYPE ulTotalRunTime, ulStatsAsPercentage; + * + * // Make sure the write buffer does not contain a string. + * pcWriteBuffer = 0x00; + * + * // Take a snapshot of the number of tasks in case it changes while this + * // function is executing. + * uxArraySize = uxTaskGetNumberOfTasks(); + * + * // Allocate a TaskStatus_t structure for each task. An array could be + * // allocated statically at compile time. + * pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) ); + * + * if( pxTaskStatusArray != NULL ) + * { + * // Generate raw status information about each task. + * uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime ); + * + * // For percentage calculations. + * ulTotalRunTime /= 100UL; + * + * // Avoid divide by zero errors. + * if( ulTotalRunTime > 0 ) + * { + * // For each populated position in the pxTaskStatusArray array, + * // format the raw data as human readable ASCII data + * for( x = 0; x < uxArraySize; x++ ) + * { + * // What percentage of the total run time has the task used? + * // This will always be rounded down to the nearest integer. + * // ulTotalRunTimeDiv100 has already been divided by 100. + * ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime; + * + * if( ulStatsAsPercentage > 0UL ) + * { + * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + * } + * else + * { + * // If the percentage is zero here then the task has + * // consumed less than 1% of the total run time. + * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter ); + * } + * + * pcWriteBuffer += strlen( ( char * ) pcWriteBuffer ); + * } + * } + * + * // The array is no longer needed, free the memory it consumes. + * vPortFree( pxTaskStatusArray ); + * } + * } + * @endcode + */ +UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskList( char *pcWriteBuffer ); + * @endcode + * + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * both be defined as 1 for this function to be available. See the + * configuration section of the FreeRTOS.org website for more information. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays task: + * names, states, priority, stack usage and task number. + * Stack usage specified as the number of unused StackType_t words stack can hold + * on top of stack - not the number of bytes. + * + * vTaskList() has a dependency on the sprintf() C library function that might + * bloat the code size, use a lot of stack, and provide different results on + * different platforms. An alternative, tiny, third party, and limited + * functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly through a + * call to vTaskList(). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ASCII form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \defgroup vTaskList vTaskList + * \ingroup TaskUtils + */ +void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + * @code{c} + * void vTaskGetRunTimeStats( char *pcWriteBuffer ); + * @endcode + * + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both be defined as 1 for this function to be available. The application + * must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays the + * amount of time each task has spent in the Running state in both absolute and + * percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library function + * that might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, and + * limited functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() directly + * to get access to raw stats data, rather than indirectly through a call to + * vTaskGetRunTimeStats(). + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ASCII form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats + * \ingroup TaskUtils + */ +void vTaskGetRunTimeStats( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + * @code{c} + * configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ); + * configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ); + * @endcode + * + * configGENERATE_RUN_TIME_STATS, configUSE_STATS_FORMATTING_FUNCTIONS and + * INCLUDE_xTaskGetIdleTaskHandle must all be defined as 1 for these functions + * to be available. The application must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total + * execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter() + * returns the total execution time of just the idle task and + * ulTaskGetIdleRunTimePercent() returns the percentage of the CPU time used by + * just the idle task. + * + * Note the amount of idle time is only a good measure of the slack time in a + * system if there are no other tasks executing at the idle priority, tickless + * idle is not used, and configIDLE_SHOULD_YIELD is set to 0. + * + * @return The total run time of the idle task or the percentage of the total + * run time consumed by the idle task. This is the amount of time the + * idle task has actually been executing. The unit of time is dependent on the + * frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and + * portGET_RUN_TIME_COUNTER_VALUE() macros. + * + * \defgroup ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter + * \ingroup TaskUtils + */ +configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION; +configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction ); + * BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * Sends a direct to task notification to a task, with an optional value and + * action. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * A task can use xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() to + * [optionally] block to wait for a notification to be pending. The task does + * not consume any CPU time while it is in the Blocked state. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their + * un-indexed equivalents). If the task was already in the Blocked state to + * wait for a notification when the notification arrives then the task will + * automatically be removed from the Blocked state (unblocked) and the + * notification cleared. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotify() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling xTaskNotify() is equivalent to calling xTaskNotifyIndexed() + * with the uxIndexToNotify parameter set to 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotify() does + * not have this parameter and always sends notifications to index 0. + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The target notification value is bitwise ORed with ulValue. + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * eIncrement - + * The target notification value is incremented. ulValue is not used and + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The target notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification at the + * same array index (the task already had a notification pending at that index). + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending at the + * same array index then the target notification value is set to ulValue and + * xTaskNotifyIndexed() will return pdPASS. If the task being notified already + * had a notification pending at the same array index then no action is + * performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification at the specified array index without the + * notification value at that index being updated. ulValue is not used and + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * pulPreviousNotificationValue - + * Can be used to pass out the subject task's notification value before any + * bits are modified by the notify function. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotifyIndexed xTaskNotifyIndexed + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) PRIVILEGED_FUNCTION; +#define xTaskNotify( xTaskToNotify, ulValue, eAction ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL ) +#define xTaskNotifyIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyAndQueryIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue ); + * BaseType_t xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * xTaskNotifyAndQueryIndexed() performs the same operation as + * xTaskNotifyIndexed() with the addition that it also returns the subject + * task's prior notification value (the notification value at the time the + * function is called rather than when the function returns) in the additional + * pulPreviousNotifyValue parameter. + * + * xTaskNotifyAndQuery() performs the same operation as xTaskNotify() with the + * addition that it also returns the subject task's prior notification value + * (the notification value as it was at the time the function is called, rather + * than when the function returns) in the additional pulPreviousNotifyValue + * parameter. + * + * \defgroup xTaskNotifyAndQueryIndexed xTaskNotifyAndQueryIndexed + * \ingroup TaskNotifications + */ +#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) +#define xTaskNotifyAndQueryIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotifyValue ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken ); + * BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * A version of xTaskNotifyIndexed() that can be used from an interrupt service + * routine (ISR). + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block + * to wait for a notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their + * un-indexed equivalents). If the task was already in the Blocked state to + * wait for a notification when the notification arrives then the task will + * automatically be removed from the Blocked state (unblocked) and the + * notification cleared. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyFromISR() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling xTaskNotifyFromISR() is equivalent to calling + * xTaskNotifyIndexedFromISR() with the uxIndexToNotify parameter set to 0. + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyFromISR() + * does not have this parameter and always sends notifications to index 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNotify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should + * be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotifyIndexedFromISR xTaskNotifyIndexedFromISR + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyAndQueryIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ); + * BaseType_t xTaskNotifyAndQueryFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * xTaskNotifyAndQueryIndexedFromISR() performs the same operation as + * xTaskNotifyIndexedFromISR() with the addition that it also returns the + * subject task's prior notification value (the notification value at the time + * the function is called rather than at the time the function returns) in the + * additional pulPreviousNotifyValue parameter. + * + * xTaskNotifyAndQueryFromISR() performs the same operation as + * xTaskNotifyFromISR() with the addition that it also returns the subject + * task's prior notification value (the notification value at the time the + * function is called rather than at the time the function returns) in the + * additional pulPreviousNotifyValue parameter. + * + * \defgroup xTaskNotifyAndQueryIndexedFromISR xTaskNotifyAndQueryIndexedFromISR + * \ingroup TaskNotifications + */ +#define xTaskNotifyAndQueryIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyWaitIndexed( UBaseType_t uxIndexToWaitOn, uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ); + * + * BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ); + * @endcode + * + * Waits for a direct to task notification to be pending at a given index within + * an array of direct to task notifications. + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their + * un-indexed equivalents). If the task was already in the Blocked state to + * wait for a notification when the notification arrives then the task will + * automatically be removed from the Blocked state (unblocked) and the + * notification cleared. + * + * A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block + * to wait for a notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyWait() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling xTaskNotifyWait() is equivalent to calling + * xTaskNotifyWaitIndexed() with the uxIndexToWaitOn parameter set to 0. + * + * @param uxIndexToWaitOn The index within the calling task's array of + * notification values on which the calling task will wait for a notification to + * be received. uxIndexToWaitOn must be less than + * configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyWait() does + * not have this parameter and always waits for notifications on index 0. + * + * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value + * will be cleared in the calling task's notification value before the task + * checks to see if any notifications are pending, and optionally blocks if no + * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if + * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have + * the effect of resetting the task's notification value to 0. Setting + * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. + * + * @param ulBitsToClearOnExit If a notification is pending or received before + * the calling task exits the xTaskNotifyWait() function then the task's + * notification value (see the xTaskNotify() API function) is passed out using + * the pulNotificationValue parameter. Then any bits that are set in + * ulBitsToClearOnExit will be cleared in the task's notification value (note + * *pulNotificationValue is set before any bits are cleared). Setting + * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL + * (if limits.h is not included) will have the effect of resetting the task's + * notification value to 0 before the function exits. Setting + * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged + * when the function exits (in which case the value passed out in + * pulNotificationValue will match the task's notification value). + * + * @param pulNotificationValue Used to pass the task's notification value out + * of the function. Note the value passed out will not be effected by the + * clearing of any bits caused by ulBitsToClearOnExit being non-zero. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for a notification to be received, should a notification + * not already be pending when xTaskNotifyWait() was called. The task + * will not consume any processing time while it is in the Blocked state. This + * is specified in kernel ticks, the macro pdMS_TO_TICKS( value_in_ms ) can be + * used to convert a time specified in milliseconds to a time specified in + * ticks. + * + * @return If a notification was received (including notifications that were + * already pending when xTaskNotifyWait was called) then pdPASS is + * returned. Otherwise pdFAIL is returned. + * + * \defgroup xTaskNotifyWaitIndexed xTaskNotifyWaitIndexed + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +#define xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \ + xTaskGenericNotifyWait( tskDEFAULT_INDEX_TO_NOTIFY, ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) ) +#define xTaskNotifyWaitIndexed( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \ + xTaskGenericNotifyWait( ( uxIndexToWaitOn ), ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyGiveIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify ); + * BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); + * @endcode + * + * Sends a direct to task notification to a particular index in the target + * task's notification array in a manner similar to giving a counting semaphore. + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * macros to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * xTaskNotifyGiveIndexed() is a helper macro intended for use when task + * notifications are used as light weight and faster binary or counting + * semaphore equivalents. Actual FreeRTOS semaphores are given using the + * xSemaphoreGive() API function, the equivalent action that instead uses a task + * notification is xTaskNotifyGiveIndexed(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotificationTakeIndexed() API function rather than the + * xTaskNotifyWaitIndexed() API function. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyGive() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling xTaskNotifyGive() is equivalent to calling + * xTaskNotifyGiveIndexed() with the uxIndexToNotify parameter set to 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyGive() + * does not have this parameter and always sends notifications to index 0. + * + * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the + * eAction parameter set to eIncrement - so pdPASS is always returned. + * + * \defgroup xTaskNotifyGiveIndexed xTaskNotifyGiveIndexed + * \ingroup TaskNotifications + */ +#define xTaskNotifyGive( xTaskToNotify ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( 0 ), eIncrement, NULL ) +#define xTaskNotifyGiveIndexed( xTaskToNotify, uxIndexToNotify ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( 0 ), eIncrement, NULL ) + +/** + * task. h + * @code{c} + * void vTaskNotifyGiveIndexedFromISR( TaskHandle_t xTaskHandle, UBaseType_t uxIndexToNotify, BaseType_t *pxHigherPriorityTaskWoken ); + * void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * A version of xTaskNotifyGiveIndexed() that can be called from an interrupt + * service routine (ISR). + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro + * to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * vTaskNotifyGiveIndexedFromISR() is intended for use when task notifications + * are used as light weight and faster binary or counting semaphore equivalents. + * Actual FreeRTOS semaphores are given from an ISR using the + * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses + * a task notification is vTaskNotifyGiveIndexedFromISR(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotificationTakeIndexed() API function rather than the + * xTaskNotifyWaitIndexed() API function. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyFromISR() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling xTaskNotifyGiveFromISR() is equivalent to calling + * xTaskNotifyGiveIndexedFromISR() with the uxIndexToNotify parameter set to 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. + * xTaskNotifyGiveFromISR() does not have this parameter and always sends + * notifications to index 0. + * + * @param pxHigherPriorityTaskWoken vTaskNotifyGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch + * should be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * \defgroup vTaskNotifyGiveIndexedFromISR vTaskNotifyGiveIndexedFromISR + * \ingroup TaskNotifications + */ +void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define vTaskNotifyGiveFromISR( xTaskToNotify, pxHigherPriorityTaskWoken ) \ + vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( pxHigherPriorityTaskWoken ) ); +#define vTaskNotifyGiveIndexedFromISR( xTaskToNotify, uxIndexToNotify, pxHigherPriorityTaskWoken ) \ + vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( pxHigherPriorityTaskWoken ) ); + +/** + * task. h + * @code{c} + * uint32_t ulTaskNotifyTakeIndexed( UBaseType_t uxIndexToWaitOn, BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); + * + * uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); + * @endcode + * + * Waits for a direct to task notification on a particular index in the calling + * task's notification array in a manner similar to taking a counting semaphore. + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * ulTaskNotifyTakeIndexed() is intended for use when a task notification is + * used as a faster and lighter weight binary or counting semaphore alternative. + * Actual FreeRTOS semaphores are taken using the xSemaphoreTake() API function, + * the equivalent action that instead uses a task notification is + * ulTaskNotifyTakeIndexed(). + * + * When a task is using its notification value as a binary or counting semaphore + * other tasks should send notifications to it using the xTaskNotifyGiveIndexed() + * macro, or xTaskNotifyIndex() function with the eAction parameter set to + * eIncrement. + * + * ulTaskNotifyTakeIndexed() can either clear the task's notification value at + * the array index specified by the uxIndexToWaitOn parameter to zero on exit, + * in which case the notification value acts like a binary semaphore, or + * decrement the notification value on exit, in which case the notification + * value acts like a counting semaphore. + * + * A task can use ulTaskNotifyTakeIndexed() to [optionally] block to wait for + * a notification. The task does not consume any CPU time while it is in the + * Blocked state. + * + * Where as xTaskNotifyWaitIndexed() will return when a notification is pending, + * ulTaskNotifyTakeIndexed() will return when the task's notification value is + * not zero. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. ulTaskNotifyTake() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling ulTaskNotifyTake() is equivalent to calling + * ulTaskNotifyTakeIndexed() with the uxIndexToWaitOn parameter set to 0. + * + * @param uxIndexToWaitOn The index within the calling task's array of + * notification values on which the calling task will wait for a notification to + * be non-zero. uxIndexToWaitOn must be less than + * configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyTake() does + * not have this parameter and always waits for notifications on index 0. + * + * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's + * notification value is decremented when the function exits. In this way the + * notification value acts like a counting semaphore. If xClearCountOnExit is + * not pdFALSE then the task's notification value is cleared to zero when the + * function exits. In this way the notification value acts like a binary + * semaphore. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for the task's notification value to be greater than zero, + * should the count not already be greater than zero when + * ulTaskNotifyTake() was called. The task will not consume any processing + * time while it is in the Blocked state. This is specified in kernel ticks, + * the macro pdMS_TO_TICKS( value_in_ms ) can be used to convert a time + * specified in milliseconds to a time specified in ticks. + * + * @return The task's notification count before it is either cleared to zero or + * decremented (see the xClearCountOnExit parameter). + * + * \defgroup ulTaskNotifyTakeIndexed ulTaskNotifyTakeIndexed + * \ingroup TaskNotifications + */ +uint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +#define ulTaskNotifyTake( xClearCountOnExit, xTicksToWait ) \ + ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY ), ( xClearCountOnExit ), ( xTicksToWait ) ) +#define ulTaskNotifyTakeIndexed( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ) \ + ulTaskGenericNotifyTake( ( uxIndexToWaitOn ), ( xClearCountOnExit ), ( xTicksToWait ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyStateClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToCLear ); + * + * BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * If a notification is sent to an index within the array of notifications then + * the notification at that index is said to be 'pending' until it is read or + * explicitly cleared by the receiving task. xTaskNotifyStateClearIndexed() + * is the function that clears a pending notification without reading the + * notification value. The notification value at the same array index is not + * altered. Set xTask to NULL to clear the notification state of the calling + * task. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyStateClear() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling xTaskNotifyStateClear() is equivalent to calling + * xTaskNotifyStateClearIndexed() with the uxIndexToNotify parameter set to 0. + * + * @param xTask The handle of the RTOS task that will have a notification state + * cleared. Set xTask to NULL to clear a notification state in the calling + * task. To obtain a task's handle create the task using xTaskCreate() and + * make use of the pxCreatedTask parameter, or create the task using + * xTaskCreateStatic() and store the returned value, or use the task's name in + * a call to xTaskGetHandle(). + * + * @param uxIndexToClear The index within the target task's array of + * notification values to act upon. For example, setting uxIndexToClear to 1 + * will clear the state of the notification at index 1 within the array. + * uxIndexToClear must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. + * ulTaskNotifyStateClear() does not have this parameter and always acts on the + * notification at index 0. + * + * @return pdTRUE if the task's notification state was set to + * eNotWaitingNotification, otherwise pdFALSE. + * + * \defgroup xTaskNotifyStateClearIndexed xTaskNotifyStateClearIndexed + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) PRIVILEGED_FUNCTION; +#define xTaskNotifyStateClear( xTask ) \ + xTaskGenericNotifyStateClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ) ) +#define xTaskNotifyStateClearIndexed( xTask, uxIndexToClear ) \ + xTaskGenericNotifyStateClear( ( xTask ), ( uxIndexToClear ) ) + +/** + * task. h + * @code{c} + * uint32_t ulTaskNotifyValueClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToClear, uint32_t ulBitsToClear ); + * + * uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * ulTaskNotifyValueClearIndexed() clears the bits specified by the + * ulBitsToClear bit mask in the notification value at array index uxIndexToClear + * of the task referenced by xTask. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. ulTaskNotifyValueClear() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling ulTaskNotifyValueClear() is equivalent to calling + * ulTaskNotifyValueClearIndexed() with the uxIndexToClear parameter set to 0. + * + * @param xTask The handle of the RTOS task that will have bits in one of its + * notification values cleared. Set xTask to NULL to clear bits in a + * notification value of the calling task. To obtain a task's handle create the + * task using xTaskCreate() and make use of the pxCreatedTask parameter, or + * create the task using xTaskCreateStatic() and store the returned value, or + * use the task's name in a call to xTaskGetHandle(). + * + * @param uxIndexToClear The index within the target task's array of + * notification values in which to clear the bits. uxIndexToClear + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. + * ulTaskNotifyValueClear() does not have this parameter and always clears bits + * in the notification value at index 0. + * + * @param ulBitsToClear Bit mask of the bits to clear in the notification value of + * xTask. Set a bit to 1 to clear the corresponding bits in the task's notification + * value. Set ulBitsToClear to 0xffffffff (UINT_MAX on 32-bit architectures) to clear + * the notification value to 0. Set ulBitsToClear to 0 to query the task's + * notification value without clearing any bits. + * + * + * @return The value of the target task's notification value before the bits + * specified by ulBitsToClear were cleared. + * \defgroup ulTaskNotifyValueClear ulTaskNotifyValueClear + * \ingroup TaskNotifications + */ +uint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; +#define ulTaskNotifyValueClear( xTask, ulBitsToClear ) \ + ulTaskGenericNotifyValueClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulBitsToClear ) ) +#define ulTaskNotifyValueClearIndexed( xTask, uxIndexToClear, ulBitsToClear ) \ + ulTaskGenericNotifyValueClear( ( xTask ), ( uxIndexToClear ), ( ulBitsToClear ) ) + +/** + * task.h + * @code{c} + * void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ); + * @endcode + * + * Capture the current time for future use with xTaskCheckForTimeOut(). + * + * @param pxTimeOut Pointer to a timeout object into which the current time + * is to be captured. The captured time includes the tick count and the number + * of times the tick count has overflowed since the system first booted. + * \defgroup vTaskSetTimeOutState vTaskSetTimeOutState + * \ingroup TaskCtrl + */ +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ); + * @endcode + * + * Determines if pxTicksToWait ticks has passed since a time was captured + * using a call to vTaskSetTimeOutState(). The captured time includes the tick + * count and the number of times the tick count has overflowed. + * + * @param pxTimeOut The time status as captured previously using + * vTaskSetTimeOutState. If the timeout has not yet occurred, it is updated + * to reflect the current time status. + * @param pxTicksToWait The number of ticks to check for timeout i.e. if + * pxTicksToWait ticks have passed since pxTimeOut was last updated (either by + * vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred. + * If the timeout has not occurred, pxTicksToWait is updated to reflect the + * number of remaining ticks. + * + * @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is + * returned and pxTicksToWait is updated to reflect the number of remaining + * ticks. + * + * @see https://www.FreeRTOS.org/xTaskCheckForTimeOut.html + * + * Example Usage: + * @code{c} + * // Driver library function used to receive uxWantedBytes from an Rx buffer + * // that is filled by a UART interrupt. If there are not enough bytes in the + * // Rx buffer then the task enters the Blocked state until it is notified that + * // more data has been placed into the buffer. If there is still not enough + * // data then the task re-enters the Blocked state, and xTaskCheckForTimeOut() + * // is used to re-calculate the Block time to ensure the total amount of time + * // spent in the Blocked state does not exceed MAX_TIME_TO_WAIT. This + * // continues until either the buffer contains at least uxWantedBytes bytes, + * // or the total amount of time spent in the Blocked state reaches + * // MAX_TIME_TO_WAIT - at which point the task reads however many bytes are + * // available up to a maximum of uxWantedBytes. + * + * size_t xUART_Receive( uint8_t *pucBuffer, size_t uxWantedBytes ) + * { + * size_t uxReceived = 0; + * TickType_t xTicksToWait = MAX_TIME_TO_WAIT; + * TimeOut_t xTimeOut; + * + * // Initialize xTimeOut. This records the time at which this function + * // was entered. + * vTaskSetTimeOutState( &xTimeOut ); + * + * // Loop until the buffer contains the wanted number of bytes, or a + * // timeout occurs. + * while( UART_bytes_in_rx_buffer( pxUARTInstance ) < uxWantedBytes ) + * { + * // The buffer didn't contain enough data so this task is going to + * // enter the Blocked state. Adjusting xTicksToWait to account for + * // any time that has been spent in the Blocked state within this + * // function so far to ensure the total amount of time spent in the + * // Blocked state does not exceed MAX_TIME_TO_WAIT. + * if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) != pdFALSE ) + * { + * //Timed out before the wanted number of bytes were available, + * // exit the loop. + * break; + * } + * + * // Wait for a maximum of xTicksToWait ticks to be notified that the + * // receive interrupt has placed more data into the buffer. + * ulTaskNotifyTake( pdTRUE, xTicksToWait ); + * } + * + * // Attempt to read uxWantedBytes from the receive buffer into pucBuffer. + * // The actual number of bytes read (which might be less than + * // uxWantedBytes) is returned. + * uxReceived = UART_read_from_receive_buffer( pxUARTInstance, + * pucBuffer, + * uxWantedBytes ); + * + * return uxReceived; + * } + * @endcode + * \defgroup xTaskCheckForTimeOut xTaskCheckForTimeOut + * \ingroup TaskCtrl + */ +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ); + * @endcode + * + * This function corrects the tick count value after the application code has held + * interrupts disabled for an extended period resulting in tick interrupts having + * been missed. + * + * This function is similar to vTaskStepTick(), however, unlike + * vTaskStepTick(), xTaskCatchUpTicks() may move the tick count forward past a + * time at which a task should be removed from the blocked state. That means + * tasks may have to be removed from the blocked state as the tick count is + * moved. + * + * @param xTicksToCatchUp The number of tick interrupts that have been missed due to + * interrupts being disabled. Its value is not computed automatically, so must be + * computed by the application writer. + * + * @return pdTRUE if moving the tick count forward resulted in a task leaving the + * blocked state and a context switch being performed. Otherwise pdFALSE. + * + * \defgroup xTaskCatchUpTicks xTaskCatchUpTicks + * \ingroup TaskCtrl + */ +BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) PRIVILEGED_FUNCTION; + + +/*----------------------------------------------------------- +* SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES +*----------------------------------------------------------*/ + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. If a non-zero value is returned then a context switch is + * required because either: + * + A task was removed from a blocked list because its timeout had expired, + * or + * + Time slicing is in use and there is a task of equal priority to the + * currently running task. + */ +BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * The 'unordered' version replaces the event list item value with the + * xItemValue value, and inserts the list item at the end of the list. + * + * The 'ordered' version uses the existing event list item value (which is the + * owning task's priority) to insert the list item into the event list in task + * priority order. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xItemValue The item value to use for the event list item when the + * event list is not ordered by task priority. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks, the constant + * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time + * period. + */ +void vTaskPlaceOnEventList( List_t * const pxEventList, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, + const TickType_t xItemValue, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + */ +void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList()/vTaskRemoveFromUnorderedEventList() will be called + * if either an event occurs to unblock a task, or the block timeout period + * expires. + * + * xTaskRemoveFromEventList() is used when the event list is in task priority + * order. It removes the list item from the head of the event list as that will + * have the highest priority owning task of all the tasks on the event list. + * vTaskRemoveFromUnorderedEventList() is used when the event list is not + * ordered and the event list items hold something other than the owning tasks + * priority. In this case the event list item value is updated to the value + * passed in the xItemValue parameter. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; +void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, + const TickType_t xItemValue ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; + +/* + * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY + * THE EVENT BITS MODULE. + */ +TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * If a higher priority task attempting to obtain a mutex caused a lower + * priority task to inherit the higher priority task's priority - but the higher + * priority task then timed out without obtaining the mutex, then the lower + * priority task will disinherit the priority again - but only down as far as + * the highest priority task that is still waiting for the mutex (if there were + * more than one task waiting for the mutex). + */ +void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, + UBaseType_t uxHighestPriorityWaitingTask ) PRIVILEGED_FUNCTION; + +/* + * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. + */ +UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* + * Set the uxTaskNumber of the task referenced by the xTask parameter to + * uxHandle. + */ +void vTaskSetTaskNumber( TaskHandle_t xTask, + const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * If tickless mode is being used, or a low power mode is implemented, then + * the tick interrupt will not execute during idle periods. When this is the + * case, the tick count value maintained by the scheduler needs to be kept up + * to date with the actual execution time by being skipped forward by a time + * equal to the idle period. + */ +void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port + * specific sleep function to determine if it is ok to proceed with the sleep, + * and if it is ok to proceed, if it is ok to sleep indefinitely. + * + * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only + * called with the scheduler suspended, not from within a critical section. It + * is therefore possible for an interrupt to request a context switch between + * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being + * entered. eTaskConfirmSleepModeStatus() should be called from a short + * critical section between the timer being stopped and the sleep mode being + * entered to ensure it is ok to proceed into the sleep mode. + */ +eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Increment the mutex held count when a mutex is + * taken and return the handle of the task that has taken the mutex. + */ +TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Same as vTaskSetTimeOutState(), but without a critical + * section. + */ +void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ +#endif /* INC_TASK_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/timers.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/timers.h new file mode 100644 index 000000000..2be826c21 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/include/timers.h @@ -0,0 +1,1355 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +/*lint -save -e537 This headers are only multiply included if the application code + * happens to also be including task.h. */ +#include "task.h" +/*lint -restore */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- +* MACROS AND DEFINITIONS +*----------------------------------------------------------*/ + +/* IDs for commands that can be sent/received on the timer queue. These are to + * be used solely through the macros that make up the public software timer API, + * as defined below. The commands that are sent from interrupts must use the + * highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task + * or interrupt version of the queue send function should be used. */ +#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) +#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) +#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) +#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) +#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) +#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) +#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) +#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) + +#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) +#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) +#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) + + +/** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an TimerHandle_t variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +struct tmrTimerControl; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct tmrTimerControl * TimerHandle_t; + +/* + * Defines the prototype to which timer callback functions must conform. + */ +typedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer ); + +/* + * Defines the prototype to which functions used with the + * xTimerPendFunctionCallFromISR() function must conform. + */ +typedef void (* PendedFunction_t)( void *, + uint32_t ); + +/** + * TimerHandle_t xTimerCreate( const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. Time timer period must be greater than 0. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @return If the timer is successfully created then a handle to the newly + * created timer is returned. If the timer cannot be created because there is + * insufficient FreeRTOS heap remaining to allocate the timer + * structures then NULL is returned. + * + * Example usage: + * @verbatim + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * TimerHandle_t xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( TimerHandle_t pxTimer ) + * { + * int32_t lArrayIndex; + * const int32_t xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * x ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; +#endif + +/** + * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction, + * StaticTimer_t *pxTimerBuffer ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. The timer period must be greater than 0. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which + * will be then be used to hold the software timer's data structures, removing + * the need for the memory to be allocated dynamically. + * + * @return If the timer is created then a handle to the created timer is + * returned. If pxTimerBuffer was NULL then NULL is returned. + * + * Example usage: + * @verbatim + * + * // The buffer used to hold the software timer's data structure. + * static StaticTimer_t xTimerBuffer; + * + * // A variable that will be incremented by the software timer's callback + * // function. + * UBaseType_t uxVariableToIncrement = 0; + * + * // A software timer callback function that increments a variable passed to + * // it when the software timer was created. After the 5th increment the + * // callback function stops the software timer. + * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) + * { + * UBaseType_t *puxVariableToIncrement; + * BaseType_t xReturned; + * + * // Obtain the address of the variable to increment from the timer ID. + * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); + * + * // Increment the variable to show the timer callback has executed. + * ( *puxVariableToIncrement )++; + * + * // If this callback has executed the required number of times, stop the + * // timer. + * if( *puxVariableToIncrement == 5 ) + * { + * // This is called from a timer callback so must not block. + * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); + * } + * } + * + * + * void main( void ) + * { + * // Create the software time. xTimerCreateStatic() has an extra parameter + * // than the normal xTimerCreate() API function. The parameter is a pointer + * // to the StaticTimer_t structure that will hold the software timer + * // structure. If the parameter is passed as NULL then the structure will be + * // allocated dynamically, just as if xTimerCreate() had been called. + * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. + * xTimerPeriod, // The period of the timer in ticks. + * pdTRUE, // This is an auto-reload timer. + * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function + * prvTimerCallback, // The function to execute when the timer expires. + * &xTimerBuffer ); // The buffer that will hold the software timer structure. + * + * // The scheduler has not started yet so a block time is not used. + * xReturned = xTimerStart( xTimer, 0 ); + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * void *pvTimerGetTimerID( TimerHandle_t xTimer ); + * + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer, and by calling the + * vTimerSetTimerID() API function. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void * pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); + * + * Sets the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being updated. + * + * @param pvNewID The ID to assign to the timer. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ); + * + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * 1) It has been created but not started, or + * 2) It is an expired one-shot timer that has not been restarted. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + * @endverbatim + */ +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); + * + * Simply returns the handle of the timer service/daemon task. It it not valid + * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xTicksToWait is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xTicksToWait is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xTicksToWait is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xTicksToWait ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. If the timer + * // referenced by xTimer is already active when it is called, then the timer + * // is deleted. If the timer referenced by xTimer is not active when it is + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + * @endverbatim + */ +#define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xTicksToWait is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xTicksToWait is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer. + * + * TimerHandle_t xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#define xTimerReset( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + + +/** + * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * + * Used from application interrupt service routines to defer the execution of a + * function to the RTOS daemon task (the timer service task, hence this function + * is implemented in timers.c and is prefixed with 'Timer'). + * + * Ideally an interrupt service routine (ISR) is kept as short as possible, but + * sometimes an ISR either has a lot of processing to do, or needs to perform + * processing that is not deterministic. In these cases + * xTimerPendFunctionCallFromISR() can be used to defer processing of a function + * to the RTOS daemon task. + * + * A mechanism is provided that allows the interrupt to return directly to the + * task that will subsequently execute the pended callback function. This + * allows the callback function to execute contiguously in time with the + * interrupt - just as if the callback had executed in the interrupt itself. + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task (which is set using + * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of + * the currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE within + * xTimerPendFunctionCallFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + * Example usage: + * @verbatim + * + * // The callback function that will execute in the context of the daemon task. + * // Note callback functions must all use this same prototype. + * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) + * { + * BaseType_t xInterfaceToService; + * + * // The interface that requires servicing is passed in the second + * // parameter. The first parameter is not used in this case. + * xInterfaceToService = ( BaseType_t ) ulParameter2; + * + * // ...Perform the processing here... + * } + * + * // An ISR that receives data packets from multiple interfaces + * void vAnISR( void ) + * { + * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; + * + * // Query the hardware to determine which interface needs processing. + * xInterfaceToService = prvCheckInterfaces(); + * + * // The actual processing is to be deferred to a task. Request the + * // vProcessInterface() callback function is executed, passing in the + * // number of the interface that needs processing. The interface to + * // service is passed in the second parameter. The first parameter is + * // not used in this case. + * xHigherPriorityTaskWoken = pdFALSE; + * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); + * + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and will + * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to + * // the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * + * } + * @endverbatim + */ +BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * TickType_t xTicksToWait ); + * + * + * Used to defer the execution of a function to the RTOS daemon task (the timer + * service task, hence this function is implemented in timers.c and is prefixed + * with 'Timer'). + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param xTicksToWait Calling this function will result in a message being + * sent to the timer daemon task on a queue. xTicksToWait is the amount of + * time the calling task should remain in the Blocked state (so not using any + * processing time) for space to become available on the timer queue if the + * queue is found to be full. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + */ +BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * const char * const pcTimerGetName( TimerHandle_t xTimer ); + * + * Returns the name that was assigned to a timer when the timer was created. + * + * @param xTimer The handle of the timer being queried. + * + * @return The name assigned to the timer specified by the xTimer parameter. + */ +const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ); + * + * Updates a timer to be either an auto-reload timer, in which case the timer + * automatically resets itself each time it expires, or a one-shot timer, in + * which case the timer will only expire once unless it is manually restarted. + * + * @param xTimer The handle of the timer being updated. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the timer's period (see the + * xTimerPeriodInTicks parameter of the xTimerCreate() API function). If + * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + */ +void vTimerSetReloadMode( TimerHandle_t xTimer, + const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION; + +/** + * UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ); + * + * Queries a timer to determine if it is an auto-reload timer, in which case the timer + * automatically resets itself each time it expires, or a one-shot timer, in + * which case the timer will only expire once unless it is manually restarted. + * + * @param xTimer The handle of the timer being queried. + * + * @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise + * pdFALSE is returned. + */ +UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); + * + * Returns the period of a timer. + * + * @param xTimer The handle of the timer being queried. + * + * @return The period of the timer in ticks. + */ +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); + * + * Returns the time in ticks at which the timer will expire. If this is less + * than the current tick count then the expiry time has overflowed from the + * current time. + * + * @param xTimer The handle of the timer being queried. + * + * @return If the timer is running then the time in ticks at which the timer + * will next expire is returned. If the timer is not running then the return + * value is undefined. + */ +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/* + * Functions beyond this part are not part of the public API and are intended + * for use by the kernel only. + */ +BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +#if ( configUSE_TRACE_FACILITY == 1 ) + void vTimerSetTimerNumber( TimerHandle_t xTimer, + UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; +#endif + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + +/** + * task.h + * @code{c} + * void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, StackType_t ** ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ) + * @endcode + * + * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Timer Task TCB. This function is required when + * configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION + * + * @param ppxTimerTaskTCBBuffer A handle to a statically allocated TCB buffer + * @param ppxTimerTaskStackBuffer A handle to a statically allocated Stack buffer for thie idle task + * @param pulTimerTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer + */ + void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, + StackType_t ** ppxTimerTaskStackBuffer, + uint32_t * pulTimerTaskStackSize ); + +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ +#endif /* TIMERS_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/list.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/list.c new file mode 100644 index 000000000..42a2e0989 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/list.c @@ -0,0 +1,215 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "list.h" + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be + * defined for the header files above, but not in this file, in order to + * generate the correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + +/*----------------------------------------------------------- +* PUBLIC LIST API documented in list.h +*----------------------------------------------------------*/ + +void vListInitialise( List_t * const pxList ) +{ + /* The list structure contains a list item which is used to mark the + * end of the list. To initialise the list the list end is inserted + * as the only list entry. */ + pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + /* The list end value is the highest possible value in the list to + * ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + + /* The list end next and previous pointers point to itself so we know + * when the list is empty. */ + pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + pxList->uxNumberOfItems = ( UBaseType_t ) 0U; + + /* Write known values into the list if + * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); + listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( ListItem_t * const pxItem ) +{ + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pxContainer = NULL; + + /* Write known values into the list item if + * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( List_t * const pxList, + ListItem_t * const pxNewListItem ) +{ + ListItem_t * const pxIndex = pxList->pxIndex; + + /* Only effective when configASSERT() is also defined, these tests may catch + * the list data structures being overwritten in memory. They will not catch + * data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert a new list item into pxList, but rather than sort the list, + * makes the new list item the last item to be removed by a call to + * listGET_OWNER_OF_NEXT_ENTRY(). */ + pxNewListItem->pxNext = pxIndex; + pxNewListItem->pxPrevious = pxIndex->pxPrevious; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pxContainer = pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListInsert( List_t * const pxList, + ListItem_t * const pxNewListItem ) +{ + ListItem_t * pxIterator; + const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; + + /* Only effective when configASSERT() is also defined, these tests may catch + * the list data structures being overwritten in memory. They will not catch + * data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert the new list item into the list, sorted in xItemValue order. + * + * If the list already contains a list item with the same item value then the + * new list item should be placed after it. This ensures that TCBs which are + * stored in ready lists (all of which have the same xItemValue value) get a + * share of the CPU. However, if the xItemValue is the same as the back marker + * the iteration loop below will not end. Therefore the value is checked + * first, and the algorithm slightly modified if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + * If you find your application is crashing here then likely causes are + * listed below. In addition see https://www.FreeRTOS.org/FAQHelp.html for + * more tips, and ensure configASSERT() is defined! + * https://www.FreeRTOS.org/a00110.html#configASSERT + * + * 1) Stack overflow - + * see https://www.FreeRTOS.org/Stacks-and-stack-overflow-checking.html + * 2) Incorrect interrupt priority assignment, especially on Cortex-M + * parts where numerically high priority values denote low actual + * interrupt priorities, which can seem counter intuitive. See + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html and the definition + * of configMAX_SYSCALL_INTERRUPT_PRIORITY on + * https://www.FreeRTOS.org/a00110.html + * 3) Calling an API function from within a critical section or when + * the scheduler is suspended, or calling an API function that does + * not end in "FromISR" from an interrupt. + * 4) Using a queue or semaphore before it has been initialised or + * before the scheduler has been started (are interrupts firing + * before vTaskStartScheduler() has been called?). + * 5) If the FreeRTOS port supports interrupt nesting then ensure that + * the priority of the tick interrupt is at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + **********************************************************************/ + + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */ + { + /* There is nothing to do here, just iterating to the wanted + * insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = pxNewListItem; + + /* Remember which list the item is in. This allows fast removal of the + * item later. */ + pxNewListItem->pxContainer = pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) +{ +/* The list item knows which list it is in. Obtain the list from the list + * item. */ + List_t * const pxList = pxItemToRemove->pxContainer; + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxItemToRemove->pxContainer = NULL; + ( pxList->uxNumberOfItems )--; + + return pxList->uxNumberOfItems; +} +/*-----------------------------------------------------------*/ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM0/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM0/port.c new file mode 100644 index 000000000..f66f48220 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM0/port.c @@ -0,0 +1,568 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM0 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#ifndef portMISSED_COUNTS_FACTOR + #define portMISSED_COUNTS_FACTOR ( 45UL ) +#endif + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void vPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being defined + * but never called. ulDummy is used purely to quieten other warnings + * about code appearing after this function is called - making ulDummy + * volatile makes the compiler think the function could return and + * therefore not output an 'unreachable code' warning for code that appears + * after it. */ + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* This function is no longer used, but retained for backward + * compatibility. */ +} +/*-----------------------------------------------------------*/ + +void vPortStartFirstTask( void ) +{ + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + * table offset register that can be used to locate the initial stack value. + * Not all M0 parts have the application vector table at address 0. */ + __asm volatile ( + " .syntax unified \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Obtain location of pxCurrentTCB. */ + " ldr r3, [r2] \n" + " ldr r0, [r3] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " movs r0, #2 \n"/* Switch to the psp stack. */ + " msr CONTROL, r0 \n" + " isb \n" + " pop {r0-r5} \n"/* Pop the registers that are saved automatically. */ + " mov lr, r5 \n"/* lr is now in r5. */ + " pop {r3} \n"/* Return address is now in r3. */ + " pop {r2} \n"/* Pop and discard XPSR. */ + " cpsie i \n"/* The first task has its context and interrupts can be enabled. */ + " bx r3 \n"/* Finally, jump to the user defined task code. */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB " + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + * within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMaskFromISR( void ) +{ + __asm volatile ( + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr " + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMaskFromISR( __attribute__( ( unused ) ) uint32_t ulMask ) +{ + __asm volatile ( + " msr PRIMASK, r0 \n" + " bx lr " + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " .syntax unified \n" + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " subs r0, r0, #32 \n"/* Make space for the remaining low registers. */ + " str r0, [r2] \n"/* Save the new top of stack. */ + " stmia r0!, {r4-r7} \n"/* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n"/* Store the high registers. */ + " mov r5, r9 \n" + " mov r6, r10 \n" + " mov r7, r11 \n" + " stmia r0!, {r4-r7} \n" + " \n" + " push {r3, r14} \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " pop {r2, r3} \n"/* lr goes in r3. r2 now holds tcb pointer. */ + " \n" + " ldr r1, [r2] \n" + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, r0, #16 \n"/* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n"/* Pop the high registers. */ + " mov r8, r4 \n" + " mov r9, r5 \n" + " mov r10, r6 \n" + " mov r11, r7 \n" + " \n" + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " \n" + " subs r0, r0, #32 \n"/* Go back for the low registers that are not automatically restored. */ + " ldmia r0!, {r4-r7} \n"/* Pop low registers. */ + " \n" + " bx r3 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB " + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR; + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrpts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM0/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM0/portmacro.h new file mode 100644 index 000000000..20dc03f10 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM0/portmacro.h @@ -0,0 +1,125 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + extern void vPortYield( void ); + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portYIELD() vPortYield() + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulSetInterruptMaskFromISR( void ) __attribute__( ( naked ) ); + extern void vClearInterruptMaskFromISR( uint32_t ulMask ) __attribute__( ( naked ) ); + + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMaskFromISR( x ) + #define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) + #define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + + #define portNOP() + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3/port.c new file mode 100644 index 000000000..60b7a405f --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3/port.c @@ -0,0 +1,707 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM3 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is + * defined. The value should also ensure backward compatibility. + * FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__( ( naked ) ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being defined + * but never called. ulDummy is used purely to quieten other warnings + * about code appearing after this function is called - making ulDummy + * volatile makes the compiler think the function could return and + * therefore not output an 'unreachable code' warning for code that appears + * after it. */ + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n"/* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n"/* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " orr r14, #0xd \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " stmdb r0!, {r4-r11} \n"/* Save the remaining registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n"/* Restore the context, including the critical nesting count. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n"/* Pop the registers. */ + " msr psp, r0 \n" + " isb \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3/portmacro.h new file mode 100644 index 000000000..410d331f8 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3/portmacro.h @@ -0,0 +1,247 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n"\ + " msr basepri, %0 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n"\ + " mov %1, %2 \n"\ + " msr basepri, %1 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; + } +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) + { + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); + } +/*-----------------------------------------------------------*/ + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3_MPU/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3_MPU/port.c new file mode 100644 index 000000000..04377be71 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3_MPU/port.c @@ -0,0 +1,897 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM3 MPU port. +*----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK ( 0 ) +#endif + +#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS + #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security." + #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#endif + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SHPR2_REG ( *( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( *( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( *( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( *( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( 8UL << 8UL ) /* 8 regions, unified. */ +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) +/*-----------------------------------------------------------*/ + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) __attribute__( ( optimize( "3" ) ) ) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +static void prvSVCHandler( uint32_t * pulRegisters ) __attribute__( ( noinline ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Enter critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Exit from critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortExitCritical( void ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. Note this is not saved as part of the task context as context + * switches can only occur when uxCriticalNesting is zero. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* Assumes psp was in use. */ + __asm volatile + ( + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + #else + " mrs r0, psp \n" + #endif + " b %0 \n" + ::"i" ( prvSVCHandler ) : "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +static void prvSVCHandler( uint32_t * pulParam ) +{ + uint8_t ucSVCNumber; + uint32_t ulPC; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* #if defined( __ARMCC_VERSION ) */ + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first + * argument (r0) is pulParam[ 0 ]. */ + ulPC = pulParam[ portOFFSET_TO_PC ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER: + portNVIC_SHPR2_REG |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD: + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required + * but do ensure the code is completely + * within the specified behaviour for the + * architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); + + break; + + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the + * svc was raised from any of the + * system calls. */ + + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + } + + break; + #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + case portSVC_RAISE_PRIVILEGE: + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + break; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + default: /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvRestoreContextOfFirstTask( void ) +{ + __asm volatile + ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n"/* Move onto the second item in the TCB... */ + " \n" + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r3, #1 \n"/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " ldr r2, =0xe000ed9c \n"/* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n"/* Write 4 sets of MPU registers. */ + " \n" + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r3, #1 \n"/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + " \n" + " ldmia r0!, {r3, r4-r11} \n"/* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldr r14, =0xfffffffd \n"/* Load exec return code. */ + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions + * to ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the same priority as the kernel, and the SVC + * handler higher priority so it can be used to exit a critical section (where + * lower priorities are masked). */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" ); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + BaseType_t xRunningPrivileged; + xPortRaisePrivilege( xRunningPrivileged ); +#endif + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + vPortResetPrivilege( xRunningPrivileged ); +#endif +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + BaseType_t xRunningPrivileged; + xPortRaisePrivilege( xRunningPrivileged ); +#endif + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + vPortResetPrivilege( xRunningPrivileged ); +#endif +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " mrs r1, control \n" + " stmdb r0!, {r1, r4-r11} \n"/* Save the remaining registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n"/* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n"/* Move onto the second item in the TCB... */ + " \n" + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r3, #1 \n"/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " ldr r2, =0xe000ed9c \n"/* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n"/* Write 4 sets of MPU registers. */ + " \n" + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r3, #1 \n"/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + " \n" + " ldmia r0!, {r3, r4-r11} \n"/* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " \n" + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __FLASH_segment_start__[]; + extern uint32_t __FLASH_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the unprivileged flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged flash for privileged only access. This is where + * the kernel code is * placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + * is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + * system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ + uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + * ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + * into the the correct bit position of the attribute register. */ + return( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) +{ + extern uint32_t __SRAM_segment_start__[]; + extern uint32_t __SRAM_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + int32_t lIndex; + uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Re-instate the privileged only RAM region as xRegion[ 0 ] will have + * just removed the privileged only parameters. */ + xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress = + ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + 1 ); + + xMPUSettings->xRegion[ 1 ].ulRegionAttribute = + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate all other regions. */ + for( ul = 2; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that the + * stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | /* Read and write. */ + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + * xRegions into the CM3 specific MPU settings that are then + * stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + ul ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3_MPU/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3_MPU/portmacro.h new file mode 100644 index 000000000..1e82739e0 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM3_MPU/portmacro.h @@ -0,0 +1,309 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + + #define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) + #define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) + #define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL ) + #define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) + #define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + + #define portUNPRIVILEGED_FLASH_REGION ( 0UL ) + #define portPRIVILEGED_FLASH_REGION ( 1UL ) + #define portPRIVILEGED_RAM_REGION ( 2UL ) + #define portGENERAL_PERIPHERALS_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( 7UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + + #define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " ::: "r0", "memory" ) + + typedef struct MPU_REGION_REGISTERS + { + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; + } xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ + typedef struct MPU_SETTINGS + { + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS ]; + } xMPU_SETTINGS; + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ + #define portSVC_START_SCHEDULER 0 + #define portSVC_YIELD 1 + #define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + + #define portYIELD() __asm volatile ( " SVC %0 \n"::"i" ( portSVC_YIELD ) : "memory" ) + #define portYIELD_WITHIN_API() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif +/*-----------------------------------------------------------*/ + + extern BaseType_t xIsPrivileged( void ); + extern void vResetPrivilege( void ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n"\ + " msr basepri, %0 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n"\ + " mov %1, %2 \n"\ + " msr basepri, %1 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; + } +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) + { + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); + } +/*-----------------------------------------------------------*/ + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY + #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html" + #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0 + #endif +/*-----------------------------------------------------------*/ + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4F/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4F/port.c new file mode 100644 index 000000000..0f7929c3a --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4F/port.c @@ -0,0 +1,785 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 + * r0p1 port. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__( ( naked ) ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being defined + * but never called. ulDummy is used purely to quieten other warnings + * about code appearing after this function is called - making ulDummy + * volatile makes the compiler think the function could return and + * therefore not output an 'unreachable code' warning for code that appears + * after it. */ + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n"/* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11, r14} \n"/* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + /* Start the first task. This also clears the bit that indicates the FPU is + * in use in case the FPU was used before the scheduler was started - which + * would otherwise result in the unnecessary leaving of space in the SVC stack + * for lazy saving of FPU registers. */ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " mov r0, #0 \n"/* Clear the bit that indicates the FPU is in use, see comment above. */ + " msr control, r0 \n" + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + * the r0p1 parts. r0p1 parts should use the port from the + * /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " stmdb r0!, {r4-r11, r14} \n"/* Save the core registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r0, r3} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r0, r3} \n" + " \n" + " ldr r1, [r3] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" + " \n" + " ldmia r0!, {r4-r11, r14} \n"/* Pop the core registers. */ + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " isb \n" + " \n" + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */ + #if WORKAROUND_PMU_CM001 == 1 + " push { r14 } \n" + " pop { pc } \n" + #endif + #endif + " \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n"/* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n"/* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4F/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4F/portmacro.h new file mode 100644 index 000000000..615bb2a0d --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4F/portmacro.h @@ -0,0 +1,245 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n"\ + " msr basepri, %0 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n"\ + " mov %1, %2 \n"\ + " msr basepri, %1 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; + } +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) + { + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); + } +/*-----------------------------------------------------------*/ + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4_MPU/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4_MPU/port.c new file mode 100644 index 000000000..c42ea5f81 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4_MPU/port.c @@ -0,0 +1,996 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4 MPU port. +*----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK ( 0 ) +#endif + +#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS + #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security." + #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#endif + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SHPR2_REG ( *( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( *( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( *( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( *( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( portTOTAL_NUM_REGIONS << 8UL ) +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34UL ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) +#define portINITIAL_EXC_RETURN ( 0xfffffffdUL ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +static void prvSVCHandler( uint32_t * pulRegisters ) __attribute__( ( noinline ) ) PRIVILEGED_FUNCTION; + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ) __attribute__( ( naked ) ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Enter critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Exit from critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortExitCritical( void ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. Note this is not saved as part of the task context as context + * switches can only occur when uxCriticalNesting is zero. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* Assumes psp was in use. */ + __asm volatile + ( + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + #else + " mrs r0, psp \n" + #endif + " b %0 \n" + ::"i" ( prvSVCHandler ) : "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +static void prvSVCHandler( uint32_t * pulParam ) +{ + uint8_t ucSVCNumber; + uint32_t ulPC; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* #if defined( __ARMCC_VERSION ) */ + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first + * argument (r0) is pulParam[ 0 ]. */ + ulPC = pulParam[ portOFFSET_TO_PC ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER: + portNVIC_SHPR2_REG |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD: + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required + * but do ensure the code is completely + * within the specified behaviour for the + * architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); + + break; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the + * svc was raised from any of the + * system calls. */ + + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + } + + break; + #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + case portSVC_RAISE_PRIVILEGE: + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + break; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + default: /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvRestoreContextOfFirstTask( void ) +{ + __asm volatile + ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n"/* Move onto the second item in the TCB... */ + " \n" + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r3, #1 \n"/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " ldr r2, =0xe000ed9c \n"/* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + " \n" + #if ( portTOTAL_NUM_REGIONS == 16 ) + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + #endif /* portTOTAL_NUM_REGIONS == 16. */ + " \n" + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r3, #1 \n"/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + " \n" + " ldmia r0!, {r3-r11, r14} \n"/* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the same priority as the kernel, and the SVC + * handler higher priority so it can be used to exit a critical section (where + * lower priorities are masked). */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. This also clears the bit that indicates the FPU is + * in use in case the FPU was used before the scheduler was started - which + * would otherwise result in the unnecessary leaving of space in the SVC stack + * for lazy saving of FPU registers. */ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " mov r0, #0 \n"/* Clear the bit that indicates the FPU is in use, see comment above. */ + " msr control, r0 \n" + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" ); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + BaseType_t xRunningPrivileged; + xPortRaisePrivilege( xRunningPrivileged ); +#endif + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + vPortResetPrivilege( xRunningPrivileged ); +#endif +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + BaseType_t xRunningPrivileged; + xPortRaisePrivilege( xRunningPrivileged ); +#endif + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + vPortResetPrivilege( xRunningPrivileged ); +#endif +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " mrs r1, control \n" + " stmdb r0!, {r1, r4-r11, r14} \n"/* Save the remaining registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r0, r3} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r0, r3} \n" + " \n"/* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n"/* Move onto the second item in the TCB... */ + " \n" + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r3, #1 \n"/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " ldr r2, =0xe000ed9c \n"/* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + " \n" + #if ( portTOTAL_NUM_REGIONS == 16 ) + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + #endif /* portTOTAL_NUM_REGIONS == 16. */ + " \n" + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r3, #1 \n"/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + " \n" + " ldmia r0!, {r3-r11, r14} \n"/* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE ); +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n"/* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n"/* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __FLASH_segment_start__; + extern uint32_t * __FLASH_segment_end__; + extern uint32_t * __privileged_data_start__; + extern uint32_t * __privileged_data_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __FLASH_segment_start__[]; + extern uint32_t __FLASH_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + #endif /* if defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( portTOTAL_NUM_REGIONS == 8 ) || ( portTOTAL_NUM_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the unprivileged flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged flash for privileged only access. This is where + * the kernel code is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + * is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + * system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ + uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + * ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + * into the the correct bit position of the attribute register. */ + return( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) +{ + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __SRAM_segment_start__; + extern uint32_t * __SRAM_segment_end__; + extern uint32_t * __privileged_data_start__; + extern uint32_t * __privileged_data_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __SRAM_segment_start__[]; + extern uint32_t __SRAM_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + #endif /* if defined( __ARMCC_VERSION ) */ + + int32_t lIndex; + uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Re-instate the privileged only RAM region as xRegion[ 0 ] will have + * just removed the privileged only parameters. */ + xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress = + ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + 1 ); + + xMPUSettings->xRegion[ 1 ].ulRegionAttribute = + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate all other regions. */ + for( ul = 2; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that the + * stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | /* Read and write. */ + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + * xRegions into the CM4 specific MPU settings that are then + * stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + ul ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4_MPU/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4_MPU/portmacro.h new file mode 100644 index 000000000..45a8a09b1 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM4_MPU/portmacro.h @@ -0,0 +1,402 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +/* Location of the TEX,S,C,B bits in the MPU Region Attribute and Size + * Register (RASR). */ +#define portMPU_RASR_TEX_S_C_B_LOCATION ( 16UL ) +#define portMPU_RASR_TEX_S_C_B_MASK ( 0x3FUL ) + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* + * The TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits define the + * memory type, and where necessary the cacheable and shareable properties + * of the memory region. + * + * The TEX, C, and B bits together indicate the memory type of the region, + * and: + * - For Normal memory, the cacheable properties of the region. + * - For Device memory, whether the region is shareable. + * + * For Normal memory regions, the S bit indicates whether the region is + * shareable. For Strongly-ordered and Device memory, the S bit is ignored. + * + * See the following two tables for setting TEX, S, C and B bits for + * unprivileged flash, privileged flash and privileged RAM regions. + * + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | TEX | C | B | Memory type | Description or Normal region cacheability | Shareable? | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 0 | Strongly-ordered | Strongly ordered | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 1 | Device | Shared device | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 0 | Normal | Outer and inner write-through; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 1 | Normal | Outer and inner write-back; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 0 | Normal | Outer and inner Non-cacheable | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 0 | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 1 | Normal | Outer and inner write-back; write and read allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 0 | Device | Non-shared device | Not shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 1 | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 011 | X | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 1BB | A | A | Normal | Cached memory, with AA and BB indicating the inner and | Reserved | + | | | | | outer cacheability rules that must be exported on the | | + | | | | | bus. See the table below for the cacheability policy | | + | | | | | encoding. memory, BB=Outer policy, AA=Inner policy. | | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | + +-----------------------------------------+----------------------------------------+ + | AA or BB subfield of {TEX,C,B} encoding | Cacheability policy | + +-----------------------------------------+----------------------------------------+ + | 00 | Non-cacheable | + +-----------------------------------------+----------------------------------------+ + | 01 | Write-back, write and read allocate | + +-----------------------------------------+----------------------------------------+ + | 10 | Write-through, no write allocate | + +-----------------------------------------+----------------------------------------+ + | 11 | Write-back, no write allocate | + +-----------------------------------------+----------------------------------------+ + */ + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for flash + * region. */ +#ifndef configTEX_S_C_B_FLASH + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_FLASH ( 0x07UL ) +#endif + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for RAM + * region. */ +#ifndef configTEX_S_C_B_SRAM + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_SRAM ( 0x07UL ) +#endif + +#define portUNPRIVILEGED_FLASH_REGION ( 0UL ) +#define portPRIVILEGED_FLASH_REGION ( 1UL ) +#define portPRIVILEGED_RAM_REGION ( 2UL ) +#define portGENERAL_PERIPHERALS_REGION ( 3UL ) +#define portSTACK_REGION ( 4UL ) +#define portFIRST_CONFIGURABLE_REGION ( 5UL ) +#define portTOTAL_NUM_REGIONS ( configTOTAL_MPU_REGIONS ) +#define portNUM_CONFIGURABLE_REGIONS ( portTOTAL_NUM_REGIONS - portFIRST_CONFIGURABLE_REGION ) +#define portLAST_CONFIGURABLE_REGION ( portTOTAL_NUM_REGIONS - 1 ) + +#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " ::: "r0", "memory" ) + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm volatile ( " SVC %0 \n"::"i" ( portSVC_YIELD ) : "memory" ) +#define portYIELD_WITHIN_API() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) +#endif +/*-----------------------------------------------------------*/ + +extern BaseType_t xIsPrivileged( void ); +extern void vResetPrivilege( void ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +#define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + */ +#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ +#define portRESET_PRIVILEGE() vResetPrivilege() +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n"\ + " msr basepri, %0 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n"\ + " mov %1, %2 \n"\ + " msr basepri, %1 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +#define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + +#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY + #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html" + #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0 +#endif +/*-----------------------------------------------------------*/ + +/* *INDENT-OFF* */ + #ifdef __cplusplus + } + #endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM7/ReadMe.txt b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM7/ReadMe.txt new file mode 100644 index 000000000..4cf25c5a4 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM7/ReadMe.txt @@ -0,0 +1,18 @@ +There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers. +The best option depends on the revision of the ARM Cortex-M7 core in use. The +revision is specified by an 'r' number, and a 'p' number, so will look something +like 'r0p1'. Check the documentation for the microcontroller in use to find the +revision of the Cortex-M7 core used in that microcontroller. If in doubt, use +the FreeRTOS port provided specifically for r0p1 revisions, as that can be used +with all core revisions. + +The first option is to use the ARM Cortex-M4F port, and the second option is to +use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround. + +If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be +used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in +the /FreeRTOS/Source/portable/GCC/ARM_CM4F directory. + +If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM +Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1 +directory. \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM7/r0p1/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM7/r0p1/port.c new file mode 100644 index 000000000..f7f733588 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM7/r0p1/port.c @@ -0,0 +1,775 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM7 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__( ( naked ) ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being defined + * but never called. ulDummy is used purely to quieten other warnings + * about code appearing after this function is called - making ulDummy + * volatile makes the compiler think the function could return and + * therefore not output an 'unreachable code' warning for code that appears + * after it. */ + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n"/* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11, r14} \n"/* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + /* Start the first task. This also clears the bit that indicates the FPU is + * in use in case the FPU was used before the scheduler was started - which + * would otherwise result in the unnecessary leaving of space in the SVC stack + * for lazy saving of FPU registers. */ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " mov r0, #0 \n"/* Clear the bit that indicates the FPU is in use, see comment above. */ + " msr control, r0 \n" + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " stmdb r0!, {r4-r11, r14} \n"/* Save the core registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r0, r3} \n" + " mov r0, %0 \n" + " cpsid i \n"/* Errata workaround. */ + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " cpsie i \n"/* Errata workaround. */ + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r0, r3} \n" + " \n" + " ldr r1, [r3] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" + " \n" + " ldmia r0!, {r4-r11, r14} \n"/* Pop the core registers. */ + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " isb \n" + " \n" + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */ + #if WORKAROUND_PMU_CM001 == 1 + " push { r14 } \n" + " pop { pc } \n" + #endif + #endif + " \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n"/* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n"/* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM7/r0p1/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM7/r0p1/portmacro.h new file mode 100644 index 000000000..e304b100a --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/GCC/ARM_CM7/r0p1/portmacro.h @@ -0,0 +1,249 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n"\ + " cpsid i \n"\ + " msr basepri, %0 \n"\ + " isb \n"\ + " dsb \n"\ + " cpsie i \n"\ + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n"\ + " mov %1, %2 \n"\ + " cpsid i \n"\ + " msr basepri, %1 \n"\ + " isb \n"\ + " dsb \n"\ + " cpsie i \n"\ + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; + } +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) + { + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); + } +/*-----------------------------------------------------------*/ + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM0/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM0/port.c new file mode 100644 index 000000000..1bd4ac6eb --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM0/port.c @@ -0,0 +1,433 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM0 port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include "intrinsics.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is + * defined. The value 255 should also ensure backward compatibility. + * FreeRTOS.org versions prior to V4.3.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 0 +#endif + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#ifndef portMISSED_COUNTS_FACTOR + #define portMISSED_COUNTS_FACTOR ( 45UL ) +#endif + +/* The number of SysTick increments that make up one tick period. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET; + + /* Barriers are normally not required but do ensure the code is completely + * within the specified behaviour for the architecture. */ + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR; + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + * call above. */ + __enable_interrupt(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __enable_interrupt(); + __DSB(); + __ISB(); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrpts enabled. */ + __enable_interrupt(); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM0/portasm.s b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM0/portasm.s new file mode 100644 index 000000000..28eea1dba --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM0/portasm.s @@ -0,0 +1,132 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN vPortYieldFromISR + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC vSetMSP + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC ulSetInterruptMaskFromISR + PUBLIC vClearInterruptMaskFromISR + +/*-----------------------------------------------------------*/ + +vSetMSP + msr msp, r0 + bx lr + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + subs r0, r0, #32 /* Make space for the remaining low registers. */ + str r0, [r2] /* Save the new top of stack. */ + stmia r0!, {r4-r7} /* Store the low registers that are not saved automatically. */ + mov r4, r8 /* Store the high registers. */ + mov r5, r9 + mov r6, r10 + mov r7, r11 + stmia r0!, {r4-r7} + + push {r3, r14} + cpsid i + bl vTaskSwitchContext + cpsie i + pop {r2, r3} /* lr goes in r3. r2 now holds tcb pointer. */ + + ldr r1, [r2] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, r0, #16 /* Move to the high registers. */ + ldmia r0!, {r4-r7} /* Pop the high registers. */ + mov r8, r4 + mov r9, r5 + mov r10, r6 + mov r11, r7 + + msr psp, r0 /* Remember the new top of stack for the task. */ + + subs r0, r0, #32 /* Go back for the low registers that are not automatically restored. */ + ldmia r0!, {r4-r7} /* Pop low registers. */ + + bx r3 + +/*-----------------------------------------------------------*/ + +vPortSVCHandler; + /* This function is no longer used, but retained for backward + compatibility. */ + bx lr + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + table offset register that can be used to locate the initial stack value. + Not all M0 parts have the application vector table at address 0. */ + + ldr r3, =pxCurrentTCB /* Obtain location of pxCurrentTCB. */ + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + movs r0, #2 /* Switch to the psp stack. */ + msr CONTROL, r0 + isb + pop {r0-r5} /* Pop the registers that are saved automatically. */ + mov lr, r5 /* lr is now in r5. */ + pop {r3} /* The return address is now in r3. */ + pop {r2} /* Pop and discard the XPSR. */ + cpsie i /* The first task has its context and interrupts can be enabled. */ + bx r3 /* Jump to the user defined task code. */ + +/*-----------------------------------------------------------*/ + +ulSetInterruptMaskFromISR + mrs r0, PRIMASK + cpsid i + bx lr + +/*-----------------------------------------------------------*/ + +vClearInterruptMaskFromISR + msr PRIMASK, r0 + bx lr + + END diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM0/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM0/portmacro.h new file mode 100644 index 000000000..5ca772af3 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM0/portmacro.h @@ -0,0 +1,129 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + extern void vPortYield( void ); + #define portNVIC_INT_CTRL ( ( volatile uint32_t * ) 0xe000ed04 ) + #define portNVIC_PENDSVSET 0x10000000 + #define portYIELD() vPortYield() + #define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulSetInterruptMaskFromISR( void ); + extern void vClearInterruptMaskFromISR( uint32_t ulMask ); + + #define portDISABLE_INTERRUPTS() __asm volatile ( "cpsid i" ) + #define portENABLE_INTERRUPTS() __asm volatile ( "cpsie i" ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMaskFromISR( x ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + + #define portNOP() + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ + #pragma diag_suppress=Pa082 + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM3/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM3/port.c new file mode 100644 index 000000000..ab82102a6 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM3/port.c @@ -0,0 +1,610 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM3 port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is + * defined. The value 255 should also ensure backward compatibility. + * FreeRTOS.org versions prior to V4.3.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + * call above. */ + __enable_interrupt(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __enable_interrupt(); + __DSB(); + __ISB(); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __enable_interrupt(); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM3/portasm.s b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM3/portasm.s new file mode 100644 index 000000000..093252e97 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM3/portasm.s @@ -0,0 +1,104 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + stmdb r0!, {r4-r11} /* Save the remaining registers. */ + str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp!, {r3, r14} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3, r14} + + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0!, {r4-r11} /* Pop the registers. */ + msr psp, r0 + isb + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + orr r14, r14, #13 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Call SVC to start the first task, ensuring interrupts are enabled. */ + cpsie i + cpsie f + dsb + isb + svc 0 + + END diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM3/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM3/portmacro.h new file mode 100644 index 000000000..132263c91 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM3/portmacro.h @@ -0,0 +1,208 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* IAR includes. */ + #include + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Compiler directives. */ + #define portWEAK_SYMBOL __attribute__( ( weak ) ) + +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() \ + { \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + } + + #define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F/port.c new file mode 100644 index 000000000..e16f20aba --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F/port.c @@ -0,0 +1,647 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __ARMVFP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 + * r0p1 port. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + * the r0p1 parts. r0p1 parts should use the port from the + * /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + * call above. */ + __enable_interrupt(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __enable_interrupt(); + __DSB(); + __ISB(); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __enable_interrupt(); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F/portasm.s b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F/portasm.s new file mode 100644 index 000000000..b96c45cb5 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F/portasm.s @@ -0,0 +1,150 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC vPortEnableVFP + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r0, r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + #endif + #endif + + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Clear the bit that indicates the FPU is in use in case the FPU was used + before the scheduler was started - which would otherwise result in the + unnecessary leaving of space in the SVC stack for lazy saving of FPU + registers. */ + mov r0, #0 + msr control, r0 + /* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc 0 + +/*-----------------------------------------------------------*/ + +vPortEnableVFP: + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + + + + END + diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F/portmacro.h new file mode 100644 index 000000000..8377a9d0b --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F/portmacro.h @@ -0,0 +1,207 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* IAR includes. */ + #include + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Compiler directives. */ + #define portWEAK_SYMBOL __attribute__( ( weak ) ) + +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() \ + { \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + } + + #define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F_MPU/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F_MPU/port.c new file mode 100644 index 000000000..06e02ad4e --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F_MPU/port.c @@ -0,0 +1,793 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F MPU port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#ifndef __ARMVFP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS + #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security." + #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SHPR2_REG ( *( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( *( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( *( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( *( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( portTOTAL_NUM_REGIONS << 8UL ) +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 + * r0p1 port. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION; + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ) PRIVILEGED_FUNCTION; + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * The C portion of the SVC handler. + */ +void vPortSVCHandler_C( uint32_t * pulParam ); + +/* + * Called from the SVC handler used to start the scheduler. + */ +extern void vPortRestoreContextOfFirstTask( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Exit from critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortExitCritical( void ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulParam ) +{ + uint8_t ucSVCNumber; + uint32_t ulPC; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first + * argument (r0) is pulParam[ 0 ]. */ + ulPC = pulParam[ portOFFSET_TO_PC ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER: + portNVIC_SHPR2_REG |= portNVIC_SVC_PRI; + vPortRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD: + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required + * but do ensure the code is completely + * within the specified behaviour for the + * architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); + + break; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the + * svc was raised from any of the + * system calls. */ + + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + } + + break; + #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + case portSVC_RAISE_PRIVILEGE: + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + break; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + default: /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + * the r0p1 parts. r0p1 parts should use the port from the + * /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + BaseType_t xRunningPrivileged; + xPortRaisePrivilege( xRunningPrivileged ); +#endif + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } + +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + vPortResetPrivilege( xRunningPrivileged ); +#endif +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + BaseType_t xRunningPrivileged; + xPortRaisePrivilege( xRunningPrivileged ); +#endif + + configASSERT( uxCriticalNesting ); + + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + vPortResetPrivilege( xRunningPrivileged ); +#endif +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __FLASH_segment_start__[]; + extern uint32_t __FLASH_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( portTOTAL_NUM_REGIONS == 8 ) || ( portTOTAL_NUM_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the unprivileged flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged flash for privileged only access. This is where + * the kernel code is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + * is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + * system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ + uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + * ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + * into the the correct bit position of the attribute register. */ + return( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) +{ + extern uint32_t __SRAM_segment_start__[]; + extern uint32_t __SRAM_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + int32_t lIndex; + uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Re-instate the privileged only RAM region as xRegion[ 0 ] will have + * just removed the privileged only parameters. */ + xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress = + ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + 1 ); + + xMPUSettings->xRegion[ 1 ].ulRegionAttribute = + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate all other regions. */ + for( ul = 2; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that the + * stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | /* Read and write. */ + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + * xRegions into the CM4 specific MPU settings that are then + * stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + ul ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F_MPU/portasm.s b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F_MPU/portasm.s new file mode 100644 index 000000000..c1622b259 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F_MPU/portasm.s @@ -0,0 +1,258 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC vPortEnableVFP + PUBLIC vPortRestoreContextOfFirstTask + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + mrs r1, control + stmdb r0!, {r1, r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r0, r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + /* Move onto the second item in the TCB... */ + add r1, r1, #4 + + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + bic r3, r3, #1 /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + str r3, [r2] /* Disable MPU. */ + + /* Region Base Address register. */ + ldr r2, =0xe000ed9c + /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + stmia r2, {r4-r11} + + #ifdef configTOTAL_MPU_REGIONS + #if ( configTOTAL_MPU_REGIONS == 16 ) + /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + stmia r2, {r4-r11} + /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + stmia r2, {r4-r11} + #endif /* configTOTAL_MPU_REGIONS == 16. */ + #endif /* configTOTAL_MPU_REGIONS */ + + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + orr r3, r3, #1 /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + str r3, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + + /* Pop the registers that are not automatically saved on exception entry. */ + ldmia r0!, {r3-r11, r14} + msr control, r3 + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + #else + mrs r0, psp + #endif + b vPortSVCHandler_C + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask: + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Clear the bit that indicates the FPU is in use in case the FPU was used + before the scheduler was started - which would otherwise result in the + unnecessary leaving of space in the SVC stack for lazy saving of FPU + registers. */ + mov r0, #0 + msr control, r0 + /* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc 0 + +/*-----------------------------------------------------------*/ + +vPortRestoreContextOfFirstTask: + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Restore the context. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + /* The first item in the TCB is the task top of stack. */ + ldr r0, [r1] + /* Move onto the second item in the TCB... */ + add r1, r1, #4 + + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + bic r3, r3, #1 /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + str r3, [r2] /* Disable MPU. */ + + /* Region Base Address register. */ + ldr r2, =0xe000ed9c + /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + stmia r2, {r4-r11} + + #ifdef configTOTAL_MPU_REGIONS + #if ( configTOTAL_MPU_REGIONS == 16 ) + /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + stmia r2, {r4-r11} + /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + stmia r2, {r4-r11} + #endif /* configTOTAL_MPU_REGIONS == 16. */ + #endif /* configTOTAL_MPU_REGIONS */ + + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + orr r3, r3, #1 /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + str r3, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + + /* Pop the registers that are not automatically saved on exception entry. */ + ldmia r0!, {r3-r11, r14} + msr control, r3 + /* Restore the task stack pointer. */ + msr psp, r0 + mov r0, #0 + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortEnableVFP: + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + + END diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F_MPU/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F_MPU/portmacro.h new file mode 100644 index 000000000..a1e6b62c6 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM4F_MPU/portmacro.h @@ -0,0 +1,358 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* IAR includes. */ +#include + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +/* Location of the TEX,S,C,B bits in the MPU Region Attribute and Size + * Register (RASR). */ +#define portMPU_RASR_TEX_S_C_B_LOCATION ( 16UL ) +#define portMPU_RASR_TEX_S_C_B_MASK ( 0x3FUL ) + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* + * The TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits define the + * memory type, and where necessary the cacheable and shareable properties + * of the memory region. + * + * The TEX, C, and B bits together indicate the memory type of the region, + * and: + * - For Normal memory, the cacheable properties of the region. + * - For Device memory, whether the region is shareable. + * + * For Normal memory regions, the S bit indicates whether the region is + * shareable. For Strongly-ordered and Device memory, the S bit is ignored. + * + * See the following two tables for setting TEX, S, C and B bits for + * unprivileged flash, privileged flash and privileged RAM regions. + * + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | TEX | C | B | Memory type | Description or Normal region cacheability | Shareable? | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 0 | Strongly-ordered | Strongly ordered | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 1 | Device | Shared device | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 0 | Normal | Outer and inner write-through; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 1 | Normal | Outer and inner write-back; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 0 | Normal | Outer and inner Non-cacheable | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 0 | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 1 | Normal | Outer and inner write-back; write and read allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 0 | Device | Non-shared device | Not shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 1 | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 011 | X | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 1BB | A | A | Normal | Cached memory, with AA and BB indicating the inner and | Reserved | + | | | | | outer cacheability rules that must be exported on the | | + | | | | | bus. See the table below for the cacheability policy | | + | | | | | encoding. memory, BB=Outer policy, AA=Inner policy. | | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | + +-----------------------------------------+----------------------------------------+ + | AA or BB subfield of {TEX,C,B} encoding | Cacheability policy | + +-----------------------------------------+----------------------------------------+ + | 00 | Non-cacheable | + +-----------------------------------------+----------------------------------------+ + | 01 | Write-back, write and read allocate | + +-----------------------------------------+----------------------------------------+ + | 10 | Write-through, no write allocate | + +-----------------------------------------+----------------------------------------+ + | 11 | Write-back, no write allocate | + +-----------------------------------------+----------------------------------------+ + */ + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for flash + * region. */ +#ifndef configTEX_S_C_B_FLASH + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_FLASH ( 0x07UL ) +#endif + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for RAM + * region. */ +#ifndef configTEX_S_C_B_SRAM + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_SRAM ( 0x07UL ) +#endif + +#define portUNPRIVILEGED_FLASH_REGION ( 0UL ) +#define portPRIVILEGED_FLASH_REGION ( 1UL ) +#define portPRIVILEGED_RAM_REGION ( 2UL ) +#define portGENERAL_PERIPHERALS_REGION ( 3UL ) +#define portSTACK_REGION ( 4UL ) +#define portFIRST_CONFIGURABLE_REGION ( 5UL ) +#define portTOTAL_NUM_REGIONS ( configTOTAL_MPU_REGIONS ) +#define portNUM_CONFIGURABLE_REGIONS ( portTOTAL_NUM_REGIONS - portFIRST_CONFIGURABLE_REGION ) +#define portLAST_CONFIGURABLE_REGION ( portTOTAL_NUM_REGIONS - 1UL ) + +#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, r0, #1 \n msr control, r0 " ::: "r0", "memory" ) + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm volatile ( " SVC %0 \n"::"i" ( portSVC_YIELD ) : "memory" ) +#define portYIELD_WITHIN_API() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ + } + +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD_WITHIN_API(); } while( 0 ) +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() \ + { \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + } + +#define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) +#endif + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + + +/*-----------------------------------------------------------*/ + +extern BaseType_t xIsPrivileged( void ); +extern void vResetPrivilege( void ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +#define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + */ +#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ +#define portRESET_PRIVILEGE() vResetPrivilege() +/*-----------------------------------------------------------*/ + +#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY + #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html" + #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0 +#endif +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Pe191 +#pragma diag_suppress=Pa082 +#pragma diag_suppress=Be006 +/*-----------------------------------------------------------*/ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/ReadMe.txt b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/ReadMe.txt new file mode 100644 index 000000000..5ecbe8186 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/ReadMe.txt @@ -0,0 +1,18 @@ +There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers. +The best option depends on the revision of the ARM Cortex-M7 core in use. The +revision is specified by an 'r' number, and a 'p' number, so will look something +like 'r0p1'. Check the documentation for the microcontroller in use to find the +revision of the Cortex-M7 core used in that microcontroller. If in doubt, use +the FreeRTOS port provided specifically for r0p1 revisions, as that can be used +with all core revisions. + +The first option is to use the ARM Cortex-M4F port, and the second option is to +use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround. + +If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be +used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in +the /FreeRTOS/Source/portable/IAR/ARM_CM4F directory. + +If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM +Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1 +directory. \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/r0p1/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/r0p1/port.c new file mode 100644 index 000000000..94ba94bb6 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/r0p1/port.c @@ -0,0 +1,635 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM7 port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __ARMVFP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + * call above. */ + __enable_interrupt(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __enable_interrupt(); + __DSB(); + __ISB(); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __enable_interrupt(); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/r0p1/portasm.s b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/r0p1/portasm.s new file mode 100644 index 000000000..23a901955 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/r0p1/portasm.s @@ -0,0 +1,152 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC vPortEnableVFP + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r0, r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + cpsid i + msr basepri, r0 + dsb + isb + cpsie i + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + #endif + #endif + + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Clear the bit that indicates the FPU is in use in case the FPU was used + before the scheduler was started - which would otherwise result in the + unnecessary leaving of space in the SVC stack for lazy saving of FPU + registers. */ + mov r0, #0 + msr control, r0 + /* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc 0 + +/*-----------------------------------------------------------*/ + +vPortEnableVFP: + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + + + + END + diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/r0p1/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/r0p1/portmacro.h new file mode 100644 index 000000000..6b3bbb8ef --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/IAR/ARM_CM7/r0p1/portmacro.h @@ -0,0 +1,210 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* IAR includes. */ + #include + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Compiler directives. */ + #define portWEAK_SYMBOL __attribute__( ( weak ) ) + +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() \ + { \ + /* Errata work around. */ \ + __disable_interrupt(); \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + __enable_interrupt(); \ + } + + #define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_1.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_1.c new file mode 100644 index 000000000..f442caf25 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_1.c @@ -0,0 +1,153 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/* Index into the ucHeap array. */ +static size_t xNextFreeByte = ( size_t ) 0; + +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + void * pvReturn = NULL; + static uint8_t * pucAlignedHeap = NULL; + + /* Ensure that blocks are always aligned. */ + #if ( portBYTE_ALIGNMENT != 1 ) + { + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. Check for overflow. */ + if ( (xWantedSize + ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) )) > xWantedSize ) + { + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + else + { + xWantedSize = 0; + } + } + } + #endif + + vTaskSuspendAll(); + { + if( pucAlignedHeap == NULL ) + { + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) & ucHeap[ portBYTE_ALIGNMENT - 1 ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + } + + /* Check there is enough room left for the allocation and. */ + if( ( xWantedSize > 0 ) && /* valid size */ + ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) ) /* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + * block. */ + pvReturn = pucAlignedHeap + xNextFreeByte; + xNextFreeByte += xWantedSize; + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and + * heap_4.c for alternative implementations, and the memory management pages of + * https://www.FreeRTOS.org for more information. */ + ( void ) pv; + + /* Force an assert as it is invalid to call this function. */ + configASSERT( pv == NULL ); +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return( configADJUSTED_HEAP_SIZE - xNextFreeByte ); +} diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_2.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_2.c new file mode 100644 index 000000000..f690fd2a0 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_2.c @@ -0,0 +1,286 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that permits + * allocated blocks to be freed, but does not combine adjacent free blocks + * into a single larger block (and so will fragment memory). See heap_4.c for + * an equivalent that does combine adjacent blocks into single larger blocks. + * + * See heap_1.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* + * Initialises the heap structures before their first use. + */ +static void prvHeapInit( void ); + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + + +/* Define the linked list structure. This is used to link free blocks in order + * of their size. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + + +static const uint16_t heapSTRUCT_SIZE = ( ( sizeof( BlockLink_t ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~portBYTE_ALIGNMENT_MASK ); +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) ) + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, xEnd; + +/* Keeps track of the number of free bytes remaining, but says nothing about + * fragmentation. */ +static size_t xFreeBytesRemaining = configADJUSTED_HEAP_SIZE; + +/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ + +/* + * Insert a block into the list of free blocks - which is ordered by size of + * the block. Small blocks at the start of the list and large blocks at the end + * of the list. + */ +#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ + { \ + BlockLink_t * pxIterator; \ + size_t xBlockSize; \ + \ + xBlockSize = pxBlockToInsert->xBlockSize; \ + \ + /* Iterate through the list until a block is found that has a larger size */ \ + /* than the block we are inserting. */ \ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \ + { \ + /* There is nothing to do here - just iterate to the correct position. */ \ + } \ + \ + /* Update the list to include the block being inserted in the correct */ \ + /* position. */ \ + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \ + pxIterator->pxNextFreeBlock = pxBlockToInsert; \ + } +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock, * pxPreviousBlock, * pxNewBlockLink; + static BaseType_t xHeapHasBeenInitialised = pdFALSE; + void * pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( xHeapHasBeenInitialised == pdFALSE ) + { + prvHeapInit(); + xHeapHasBeenInitialised = pdTRUE; + } + + /* The wanted size must be increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( ( xWantedSize > 0 ) && + ( ( xWantedSize + heapSTRUCT_SIZE ) > xWantedSize ) ) /* Overflow check */ + { + xWantedSize += heapSTRUCT_SIZE; + + /* Byte alignment required. Check for overflow. */ + if( ( xWantedSize + ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ) ) + > xWantedSize ) + { + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + xWantedSize = 0; + } + } + else + { + xWantedSize = 0; + } + + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Blocks are stored in byte order - traverse the list from the start + * (smallest) block until one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If we found the end marker then a block of adequate size was not found. */ + if( pxBlock != &xEnd ) + { + /* Return the memory space - jumping over the BlockLink_t structure + * at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); + + /* This block is being returned for use so must be taken out of the + * list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new block + * following the number of bytes requested. The void cast is + * used to prevent byte alignment warnings from the compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + } + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= heapSTRUCT_SIZE; + + /* This unexpected casting is to keep some compilers from issuing + * byte alignment warnings. */ + pxLink = ( void * ) puc; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + } + ( void ) xTaskResumeAll(); + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) & ucHeap[ portBYTE_ALIGNMENT - 1 ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* xEnd is used to mark the end of the list of free blocks. */ + xEnd.xBlockSize = configADJUSTED_HEAP_SIZE; + xEnd.pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = configADJUSTED_HEAP_SIZE; + pxFirstFreeBlock->pxNextFreeBlock = &xEnd; +} +/*-----------------------------------------------------------*/ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_3.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_3.c new file mode 100644 index 000000000..b73476919 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_3.c @@ -0,0 +1,95 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* + * Implementation of pvPortMalloc() and vPortFree() that relies on the + * compilers own malloc() and free() implementations. + * + * This file can only be used if the linker is configured to to generate + * a heap memory area. + * + * See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ + +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + void * pvReturn; + + vTaskSuspendAll(); + { + pvReturn = malloc( xWantedSize ); + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + if( pv ) + { + vTaskSuspendAll(); + { + free( pv ); + traceFREE( pv, 0 ); + } + ( void ) xTaskResumeAll(); + } +} diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_4.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_4.c new file mode 100644 index 000000000..2676835b7 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_4.c @@ -0,0 +1,504 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that combines + * (coalescences) adjacent memory blocks as they are freed, and in so doing + * limits memory fragmentation. + * + * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + PRIVILEGED_DATA static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/* Define the linked list structure. This is used to link free blocks in order + * of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) PRIVILEGED_FUNCTION; + +/* + * Called automatically to setup the required heap structures the first time + * pvPortMalloc() is called. + */ +static void prvHeapInit( void ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory + * block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +PRIVILEGED_DATA static BlockLink_t xStart, * pxEnd = NULL; + +/* Keeps track of the number of calls to allocate and free memory as well as the + * number of free bytes remaining, but says nothing about fragmentation. */ +PRIVILEGED_DATA static size_t xFreeBytesRemaining = 0U; +PRIVILEGED_DATA static size_t xMinimumEverFreeBytesRemaining = 0U; +PRIVILEGED_DATA static size_t xNumberOfSuccessfulAllocations = 0; +PRIVILEGED_DATA static size_t xNumberOfSuccessfulFrees = 0; + +/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize + * member of an BlockLink_t structure is set then the block belongs to the + * application. When the bit is free the block is still part of the free heap + * space. */ +PRIVILEGED_DATA static size_t xBlockAllocatedBit = 0; + +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock, * pxPreviousBlock, * pxNewBlockLink; + void * pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is + * set. The top bit of the block size member of the BlockLink_t structure + * is used to determine who owns the block - the application or the + * kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size must be increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( ( xWantedSize > 0 ) && + ( ( xWantedSize + xHeapStructSize ) > xWantedSize ) ) /* Overflow check */ + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. Check for overflow. */ + if( ( xWantedSize + ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ) ) + > xWantedSize ) + { + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xWantedSize = 0; + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + * was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the + * single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + * by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + xNumberOfSuccessfulAllocations++; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */ + + configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xNumberOfSuccessfulFrees++; + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( portBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortGetHeapStats( HeapStats_t * pxHeapStats ) +{ + BlockLink_t * pxBlock; + size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */ + + vTaskSuspendAll(); + { + pxBlock = xStart.pxNextFreeBlock; + + /* pxBlock will be NULL if the heap has not been initialised. The heap + * is initialised automatically when the first allocation is made. */ + if( pxBlock != NULL ) + { + do + { + /* Increment the number of blocks and record the largest block seen + * so far. */ + xBlocks++; + + if( pxBlock->xBlockSize > xMaxSize ) + { + xMaxSize = pxBlock->xBlockSize; + } + + if( pxBlock->xBlockSize < xMinSize ) + { + xMinSize = pxBlock->xBlockSize; + } + + /* Move to the next block in the chain until the last block is + * reached. */ + pxBlock = pxBlock->pxNextFreeBlock; + } while( pxBlock != pxEnd ); + } + } + ( void ) xTaskResumeAll(); + + pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize; + pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize; + pxHeapStats->xNumberOfFreeBlocks = xBlocks; + + taskENTER_CRITICAL(); + { + pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining; + pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations; + pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees; + pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining; + } + taskEXIT_CRITICAL(); +} diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_5.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_5.c new file mode 100644 index 000000000..53a818bbb --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/MemMang/heap_5.c @@ -0,0 +1,559 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * A sample implementation of pvPortMalloc() that allows the heap to be defined + * across multiple non-contigous blocks and combines (coalescences) adjacent + * memory blocks as they are freed. + * + * See heap_1.c, heap_2.c, heap_3.c and heap_4.c for alternative + * implementations, and the memory management pages of https://www.FreeRTOS.org + * for more information. + * + * Usage notes: + * + * vPortDefineHeapRegions() ***must*** be called before pvPortMalloc(). + * pvPortMalloc() will be called if any task objects (tasks, queues, event + * groups, etc.) are created, therefore vPortDefineHeapRegions() ***must*** be + * called before any other objects are defined. + * + * vPortDefineHeapRegions() takes a single parameter. The parameter is an array + * of HeapRegion_t structures. HeapRegion_t is defined in portable.h as + * + * typedef struct HeapRegion + * { + * uint8_t *pucStartAddress; << Start address of a block of memory that will be part of the heap. + * size_t xSizeInBytes; << Size of the block of memory. + * } HeapRegion_t; + * + * The array is terminated using a NULL zero sized region definition, and the + * memory regions defined in the array ***must*** appear in address order from + * low address to high address. So the following is a valid example of how + * to use the function. + * + * HeapRegion_t xHeapRegions[] = + * { + * { ( uint8_t * ) 0x80000000UL, 0x10000 }, << Defines a block of 0x10000 bytes starting at address 0x80000000 + * { ( uint8_t * ) 0x90000000UL, 0xa0000 }, << Defines a block of 0xa0000 bytes starting at address of 0x90000000 + * { NULL, 0 } << Terminates the array. + * }; + * + * vPortDefineHeapRegions( xHeapRegions ); << Pass the array into vPortDefineHeapRegions(). + * + * Note 0x80000000 is the lower address so appears in the array first. + * + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Define the linked list structure. This is used to link free blocks in order + * of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory + * block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, * pxEnd = NULL; + +/* Keeps track of the number of calls to allocate and free memory as well as the + * number of free bytes remaining, but says nothing about fragmentation. */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; +static size_t xNumberOfSuccessfulAllocations = 0; +static size_t xNumberOfSuccessfulFrees = 0; + +/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize + * member of an BlockLink_t structure is set then the block belongs to the + * application. When the bit is free the block is still part of the free heap + * space. */ +static size_t xBlockAllocatedBit = 0; + +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock, * pxPreviousBlock, * pxNewBlockLink; + void * pvReturn = NULL; + + /* The heap must be initialised before the first call to + * prvPortMalloc(). */ + configASSERT( pxEnd ); + + vTaskSuspendAll(); + { + /* Check the requested block size is not so large that the top bit is + * set. The top bit of the block size member of the BlockLink_t structure + * is used to determine who owns the block - the application or the + * kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( ( xWantedSize > 0 ) && + ( ( xWantedSize + xHeapStructSize ) > xWantedSize ) ) /* Overflow check */ + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. Check for overflow */ + if( ( xWantedSize + ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ) ) > + xWantedSize ) + { + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xWantedSize = 0; + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + * was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the + * single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + * by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + xNumberOfSuccessfulAllocations++; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */ + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xNumberOfSuccessfulFrees++; + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) +{ + BlockLink_t * pxFirstFreeBlockInRegion = NULL, * pxPreviousFreeBlock; + size_t xAlignedHeap; + size_t xTotalRegionSize, xTotalHeapSize = 0; + BaseType_t xDefinedRegions = 0; + size_t xAddress; + const HeapRegion_t * pxHeapRegion; + + /* Can only call once! */ + configASSERT( pxEnd == NULL ); + + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + + while( pxHeapRegion->xSizeInBytes > 0 ) + { + xTotalRegionSize = pxHeapRegion->xSizeInBytes; + + /* Ensure the heap region starts on a correctly aligned boundary. */ + xAddress = ( size_t ) pxHeapRegion->pucStartAddress; + + if( ( xAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + xAddress += ( portBYTE_ALIGNMENT - 1 ); + xAddress &= ~portBYTE_ALIGNMENT_MASK; + + /* Adjust the size for the bytes lost to alignment. */ + xTotalRegionSize -= xAddress - ( size_t ) pxHeapRegion->pucStartAddress; + } + + xAlignedHeap = xAddress; + + /* Set xStart if it has not already been set. */ + if( xDefinedRegions == 0 ) + { + /* xStart is used to hold a pointer to the first item in the list of + * free blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( BlockLink_t * ) xAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + } + else + { + /* Should only get here if one region has already been added to the + * heap. */ + configASSERT( pxEnd != NULL ); + + /* Check blocks are passed in with increasing start addresses. */ + configASSERT( xAddress > ( size_t ) pxEnd ); + } + + /* Remember the location of the end marker in the previous region, if + * any. */ + pxPreviousFreeBlock = pxEnd; + + /* pxEnd is used to mark the end of the list of free blocks and is + * inserted at the end of the region space. */ + xAddress = xAlignedHeap + xTotalRegionSize; + xAddress -= xHeapStructSize; + xAddress &= ~portBYTE_ALIGNMENT_MASK; + pxEnd = ( BlockLink_t * ) xAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block in this region that is + * sized to take up the entire heap region minus the space taken by the + * free block structure. */ + pxFirstFreeBlockInRegion = ( BlockLink_t * ) xAlignedHeap; + pxFirstFreeBlockInRegion->xBlockSize = xAddress - ( size_t ) pxFirstFreeBlockInRegion; + pxFirstFreeBlockInRegion->pxNextFreeBlock = pxEnd; + + /* If this is not the first region that makes up the entire heap space + * then link the previous region to this region. */ + if( pxPreviousFreeBlock != NULL ) + { + pxPreviousFreeBlock->pxNextFreeBlock = pxFirstFreeBlockInRegion; + } + + xTotalHeapSize += pxFirstFreeBlockInRegion->xBlockSize; + + /* Move onto the next HeapRegion_t structure. */ + xDefinedRegions++; + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + } + + xMinimumEverFreeBytesRemaining = xTotalHeapSize; + xFreeBytesRemaining = xTotalHeapSize; + + /* Check something was actually defined before it is accessed. */ + configASSERT( xTotalHeapSize ); + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +void vPortGetHeapStats( HeapStats_t * pxHeapStats ) +{ + BlockLink_t * pxBlock; + size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */ + + vTaskSuspendAll(); + { + pxBlock = xStart.pxNextFreeBlock; + + /* pxBlock will be NULL if the heap has not been initialised. The heap + * is initialised automatically when the first allocation is made. */ + if( pxBlock != NULL ) + { + do + { + /* Increment the number of blocks and record the largest block seen + * so far. */ + xBlocks++; + + if( pxBlock->xBlockSize > xMaxSize ) + { + xMaxSize = pxBlock->xBlockSize; + } + + /* Heap five will have a zero sized block at the end of each + * each region - the block is only used to link to the next + * heap region so it not a real block. */ + if( pxBlock->xBlockSize != 0 ) + { + if( pxBlock->xBlockSize < xMinSize ) + { + xMinSize = pxBlock->xBlockSize; + } + } + + /* Move to the next block in the chain until the last block is + * reached. */ + pxBlock = pxBlock->pxNextFreeBlock; + } while( pxBlock != pxEnd ); + } + } + ( void ) xTaskResumeAll(); + + pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize; + pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize; + pxHeapStats->xNumberOfFreeBlocks = xBlocks; + + taskENTER_CRITICAL(); + { + pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining; + pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations; + pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees; + pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining; + } + taskEXIT_CRITICAL(); +} diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM0/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM0/port.c new file mode 100644 index 000000000..f25672654 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM0/port.c @@ -0,0 +1,549 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM0 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#ifndef portMISSED_COUNTS_FACTOR + #define portMISSED_COUNTS_FACTOR ( 45UL ) +#endif + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/* Legacy macro for backward compatibility only. This macro used to be used to + * replace the function that configures the clock used to generate the tick + * interrupt (prvSetupTimerInterrupt()), but now the function is declared weak so + * the application writer can override it by simply defining a function of the + * same name (vApplicationSetupTickInterrupt()). */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* The number of SysTick increments that make up one tick period. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* This function is no longer used, but retained for backward + * compatibility. */ +} +/*-----------------------------------------------------------*/ + +__asm void prvPortStartFirstTask( void ) +{ + extern pxCurrentTCB; + + PRESERVE8 + + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + * table offset register that can be used to locate the initial stack value. + * Not all M0 parts have the application vector table at address 0. */ +/* *INDENT-OFF* */ + + ldr r3, = pxCurrentTCB /* Obtain location of pxCurrentTCB. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, # 32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + movs r0, # 2 /* Switch to the psp stack. */ + msr CONTROL, r0 + isb + pop { r0 - r5 } /* Pop the registers that are saved automatically. */ + mov lr, r5 /* lr is now in r5. */ + pop { r3 } /* The return address is now in r3. */ + pop { r2 } /* Pop and discard the XPSR. */ + cpsie i /* The first task has its context and interrupts can be enabled. */ + bx r3 /* Finally, jump to the user defined task code. */ + + ALIGN +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + * within the specified behaviour for the architecture. */ + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm uint32_t ulSetInterruptMaskFromISR( void ) +{ +/* *INDENT-OFF* */ + mrs r0, PRIMASK + cpsid i + bx lr +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void vClearInterruptMaskFromISR( uint32_t ulMask ) +{ +/* *INDENT-OFF* */ + msr PRIMASK, r0 + bx lr +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern vTaskSwitchContext + extern pxCurrentTCB + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + + ldr r3, = pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [ r3 ] + + subs r0, # 32 /* Make space for the remaining low registers. */ + str r0, [ r2 ] /* Save the new top of stack. */ + stmia r0 !, { r4 - r7 } /* Store the low registers that are not saved automatically. */ + mov r4, r8 /* Store the high registers. */ + mov r5, r9 + mov r6, r10 + mov r7, r11 + stmia r0 !, { r4 - r7 } + + push { r3, r14 } + cpsid i + bl vTaskSwitchContext + cpsie i + pop { r2, r3 } /* lr goes in r3. r2 now holds tcb pointer. */ + + ldr r1, [ r2 ] + ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, # 16 /* Move to the high registers. */ + ldmia r0 !, { r4 - r7 } /* Pop the high registers. */ + mov r8, r4 + mov r9, r5 + mov r10, r6 + mov r11, r7 + + msr psp, r0 /* Remember the new top of stack for the task. */ + + subs r0, # 32 /* Go back for the low registers that are not automatically restored. */ + ldmia r0 !, { r4 - r7 } /* Pop low registers. */ + + bx r3 + ALIGN +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +#if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + __weak void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + ulTimerCountsForOneTick = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR; + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_irq() call + * above. */ + __enable_irq(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __enable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD + * again, then set portNVIC_SYSTICK_LOAD back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrpts enabled. */ + __enable_irq(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM0/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM0/portmacro.h new file mode 100644 index 000000000..16ce11698 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM0/portmacro.h @@ -0,0 +1,125 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + extern void vPortYield( void ); + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portYIELD() vPortYield() + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulSetInterruptMaskFromISR( void ); + extern void vClearInterruptMaskFromISR( uint32_t ulMask ); + + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMaskFromISR( x ) + #define portDISABLE_INTERRUPTS() __disable_irq() + #define portENABLE_INTERRUPTS() __enable_irq() + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + + #define portNOP() + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM3/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM3/port.c new file mode 100644 index 000000000..4377d76f9 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM3/port.c @@ -0,0 +1,718 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM3 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Legacy macro for backward compatibility only. This macro used to be used to + * replace the function that configures the clock used to generate the tick + * interrupt (prvSetupTimerInterrupt()), but now the function is declared weak so + * the application writer can override it by simply defining a function of the + * same name (vApplicationSetupTickInterrupt()). */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + ldr r3, = pxCurrentTCB /* Restore the context. */ + ldr r1, [ r3 ] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0 !, { r4 - r11 } /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + msr psp, r0 /* Restore the task stack pointer. */ + isb + mov r0, # 0 + msr basepri, r0 + orr r14, # 0xd + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [ r0 ] + ldr r0, [ r0 ] + + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + /* Call SVC to start the first task. */ + svc 0 + nop + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + * priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + isb + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [ r3 ] + + stmdb r0 !, { r4 - r11 } /* Save the remaining registers. */ + str r0, [ r2 ] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp !, { r3, r14 } + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp !, { r3, r14 } + + ldr r1, [ r3 ] + ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0 !, { r4 - r11 } /* Pop the registers and the critical nesting count. */ + msr psp, r0 + isb + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known - therefore the slightly faster vPortRaiseBASEPRI() function is used + * in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + vPortRaiseBASEPRI(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + + vPortClearBASEPRIFromISR(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_irq() call + * above. */ + __enable_irq(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __enable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __enable_irq(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + __weak void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm uint32_t vPortGetIPSR( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, ipsr + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM3/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM3/portmacro.h new file mode 100644 index 000000000..354034c1b --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM3/portmacro.h @@ -0,0 +1,266 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ + #define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ + } +/*-----------------------------------------------------------*/ + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + + #endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline + #endif + +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) + { + __asm + { + /* Barrier instructions are not used as this function is only used to + * lower the BASEPRI value. */ +/* *INDENT-OFF* */ + msr basepri, ulBASEPRI +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) + { + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + * used to lower the mask in an interrupt, so memory barriers are not + * used. */ +/* *INDENT-OFF* */ + msr basepri, # 0 +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + mrs ulReturn, basepri + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } + + return ulReturn; + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { +/* *INDENT-OFF* */ + mrs ulCurrentInterrupt, ipsr +/* *INDENT-ON* */ + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4F/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4F/port.c new file mode 100644 index 000000000..2bdee4fbc --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4F/port.c @@ -0,0 +1,810 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Legacy macro for backward compatibility only. This macro used to be used to + * replace the function that configures the clock used to generate the tick + * interrupt (prvSetupTimerInterrupt()), but now the function is declared weak so + * the application writer can override it by simply defining a function of the + * same name (vApplicationSetupTickInterrupt()). */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 + * r0p1 port. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Functions defined in portasm.s to enable the VFP. + */ +static void prvEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [ r3 ] + ldr r0, [ r1 ] + /* Pop the core registers. */ + ldmia r0!, {r4-r11,r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [ r0 ] + ldr r0, [ r0 ] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + + /* Clear the bit that indicates the FPU is in use in case the FPU was used + * before the scheduler was started - which would otherwise result in the + * unnecessary leaving of space in the SVC stack for lazy saving of FPU + * registers. */ + mov r0, #0 + msr control, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + /* Call SVC to start the first task. */ + svc 0 + nop + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvEnableVFP( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [ r0 ] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [ r0 ] + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + * the r0p1 parts. r0p1 parts should use the port from the + * /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + * priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + prvEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [ r3 ] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [ r2 ] + + stmdb sp!, {r0, r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + * too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + nop + #endif + #endif + + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known - therefore the slightly faster vPortRaiseBASEPRI() function is used + * in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + vPortRaiseBASEPRI(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + + vPortClearBASEPRIFromISR(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_irq() call + * above. */ + __enable_irq(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __enable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __enable_irq(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + __weak void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm uint32_t vPortGetIPSR( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, ipsr + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4F/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4F/portmacro.h new file mode 100644 index 000000000..41eb46179 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4F/portmacro.h @@ -0,0 +1,265 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ + #define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ + } +/*-----------------------------------------------------------*/ + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + + #endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline + #endif + +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) + { + __asm + { + /* Barrier instructions are not used as this function is only used to + * lower the BASEPRI value. */ +/* *INDENT-OFF* */ + msr basepri, ulBASEPRI +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) + { + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + * used to lower the mask in an interrupt, so memory barriers are not + * used. */ +/* *INDENT-OFF* */ + msr basepri, # 0 +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + mrs ulReturn, basepri + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } + + return ulReturn; + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { +/* *INDENT-OFF* */ + mrs ulCurrentInterrupt, ipsr +/* *INDENT-ON* */ + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4_MPU/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4_MPU/port.c new file mode 100644 index 000000000..1befeee4d --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4_MPU/port.c @@ -0,0 +1,997 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4 MPU port. +*----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS + #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security." + #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#endif + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SHPR2_REG ( *( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( *( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( *( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( *( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( portTOTAL_NUM_REGIONS << 8UL ) +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_CLK ( 0x00000004UL ) +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34UL ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) +#define portINITIAL_EXC_RETURN ( 0xfffffffdUL ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting + * variable. Note this is not saved as part of the task context as context + * switches can only occur when uxCriticalNesting is zero. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +void vSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +void prvSVCHandler( uint32_t * pulRegisters ) __attribute__( ( used ) ) PRIVILEGED_FUNCTION; + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ); + +/* + * Utility function. + */ +static uint32_t prvPortGetIPSR( void ); + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ); + +/** + * @brief Enter critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Exit from critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortExitCritical( void ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void prvSVCHandler( uint32_t * pulParam ) +{ + uint8_t ucSVCNumber; + uint32_t ulReg, ulPC; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + extern uint32_t __syscalls_flash_start__; + extern uint32_t __syscalls_flash_end__; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first + * argument (r0) is pulParam[ 0 ]. */ + ulPC = pulParam[ portOFFSET_TO_PC ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER: + portNVIC_SHPR2_REG |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD: + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required + * but do ensure the code is completely + * within the specified behaviour for the + * architecture. */ + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + break; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the + * svc was raised from any of the + * system calls. */ + + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + __asm + { +/* *INDENT-OFF* */ + mrs ulReg, control /* Obtain current control value. */ + bic ulReg, # 1 /* Set privilege bit. */ + msr control, ulReg /* Write back new control value. */ +/* *INDENT-ON* */ + } + } + + break; + #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + case portSVC_RAISE_PRIVILEGE: + __asm + { +/* *INDENT-OFF* */ + mrs ulReg, control /* Obtain current control value. */ + bic ulReg, # 1 /* Set privilege bit. */ + msr control, ulReg /* Write back new control value. */ +/* *INDENT-ON* */ + } + break; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + default: /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ + extern prvSVCHandler + +/* *INDENT-OFF* */ + PRESERVE8 + + /* Assumes psp was in use. */ + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + tst lr, # 4 + ite eq + mrseq r0, msp + mrsne r0, psp + #else + mrs r0, psp + #endif + + b prvSVCHandler +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvRestoreContextOfFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + ldr r0, =0xE000ED08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [ r0 ] + ldr r0, [ r0 ] + msr msp, r0 /* Set the msp back to the start of the stack. */ + ldr r3, =pxCurrentTCB /* Restore the context. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] /* The first item in the TCB is the task top of stack. */ + add r1, r1, #4 /* Move onto the second item in the TCB... */ + + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [ r2 ] /* Read the value of MPU_CTRL. */ + bic r3, r3, # 1 /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + str r3, [ r2 ] /* Disable MPU. */ + + ldr r2, =0xe000ed9c /* Region Base Address register. */ + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + + #if ( portTOTAL_NUM_REGIONS == 16 ) + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + #endif /* portTOTAL_NUM_REGIONS == 16. */ + + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [ r2 ] /* Read the value of MPU_CTRL. */ + orr r3, r3, #1 /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + str r3, [ r2 ] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + + ldmia r0 !, { r3 - r11, r14 } /* Pop the registers that are not automatically saved on exception entry. */ + msr control, r3 + msr psp, r0 /* Restore the task stack pointer. */ + mov r0, #0 + msr basepri, r0 + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the same priority as the kernel, and the SVC + * handler higher priority so it can be used to exit a critical section (where + * lower priorities are masked). */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [ r0 ] + ldr r0, [ r0 ] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + + /* Clear the bit that indicates the FPU is in use in case the FPU was used + * before the scheduler was started - which would otherwise result in the + * unnecessary leaving of space in the SVC stack for lazy saving of FPU + * registers. */ + mov r0, #0 + msr control, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + svc portSVC_START_SCHEDULER /* System call to start first task. */ + nop + nop +/* *INDENT-ON* */ +} + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + BaseType_t xRunningPrivileged; + xPortRaisePrivilege( xRunningPrivileged ); +#endif + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + vPortResetPrivilege( xRunningPrivileged ); +#endif +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + BaseType_t xRunningPrivileged; + xPortRaisePrivilege( xRunningPrivileged ); +#endif + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + vPortResetPrivilege( xRunningPrivileged ); +#endif +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [ r3 ] + + tst r14, #0x10 /* Is the task using the FPU context? If so, push high vfp registers. */ + it eq + vstmdbeq r0 !, { s16 - s31 } + + mrs r1, control + stmdb r0 !, { r1, r4 - r11, r14 } /* Save the remaining registers. */ + str r0, [ r2 ] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp !, { r0, r3 } + mov r0, # configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp !, { r0, r3 } + /* Restore the context. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] /* The first item in the TCB is the task top of stack. */ + add r1, r1, #4 /* Move onto the second item in the TCB... */ + + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [ r2 ] /* Read the value of MPU_CTRL. */ + bic r3, r3, #1 /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + str r3, [ r2 ] /* Disable MPU. */ + + ldr r2, =0xe000ed9c /* Region Base Address register. */ + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + + #if ( portTOTAL_NUM_REGIONS == 16 ) + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + #endif /* portTOTAL_NUM_REGIONS == 16. */ + + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [ r2 ] /* Read the value of MPU_CTRL. */ + orr r3, r3, #1 /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + str r3, [ r2 ] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + + ldmia r0 !, { r3 - r11, r14 } /* Pop the registers that are not automatically saved on exception entry. */ + msr control, r3 + + tst r14, #0x10 /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + it eq + vldmiaeq r0 !, { s16 - s31 } + + msr psp, r0 + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vSetupTimerInterrupt( void ) +{ + /* Reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + +__asm void vPortSwitchToUserMode( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, control + orr r0, #1 + msr control, r0 + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void vPortEnableVFP( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + ldr.w r0, =0xE000ED88 /* The FPU enable bits are in the CPACR. */ + ldr r1, [ r0 ] + + orr r1, r1, #( 0xf << 20 ) /* Enable CP10 and CP11 coprocessors, then save back. */ + str r1, [ r0 ] + bx r14 + nop + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ + extern uint32_t __privileged_functions_start__; + extern uint32_t __privileged_functions_end__; + extern uint32_t __FLASH_segment_start__; + extern uint32_t __FLASH_segment_end__; + extern uint32_t __privileged_data_start__; + extern uint32_t __privileged_data_end__; + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( portTOTAL_NUM_REGIONS == 8 ) || ( portTOTAL_NUM_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the unprivileged flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged flash for privileged only access. This is where + * the kernel code is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + * is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + * system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ + uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + * ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + * into the the correct bit position of the attribute register. */ + return( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +__asm BaseType_t xIsPrivileged( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + bx lr /* Return. */ +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void vResetPrivilege( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, control /* r0 = CONTROL. */ + orrs r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return. */ +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) +{ + extern uint32_t __SRAM_segment_start__; + extern uint32_t __SRAM_segment_end__; + extern uint32_t __privileged_data_start__; + extern uint32_t __privileged_data_end__; + + + int32_t lIndex; + uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Re-instate the privileged only RAM region as xRegion[ 0 ] will have + * just removed the privileged only parameters. */ + xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress = + ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + 1 ); + + xMPUSettings->xRegion[ 1 ].ulRegionAttribute = + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate all other regions. */ + for( ul = 2; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that the + * stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | /* Read and write. */ + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + * xRegions into the CM4 specific MPU settings that are then + * stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + ul ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +__asm uint32_t prvPortGetIPSR( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, ipsr + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = prvPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4_MPU/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4_MPU/portmacro.h new file mode 100644 index 000000000..564a96d44 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM4_MPU/portmacro.h @@ -0,0 +1,415 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +/* Location of the TEX,S,C,B bits in the MPU Region Attribute and Size + * Register (RASR). */ +#define portMPU_RASR_TEX_S_C_B_LOCATION ( 16UL ) +#define portMPU_RASR_TEX_S_C_B_MASK ( 0x3FUL ) + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* + * The TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits define the + * memory type, and where necessary the cacheable and shareable properties + * of the memory region. + * + * The TEX, C, and B bits together indicate the memory type of the region, + * and: + * - For Normal memory, the cacheable properties of the region. + * - For Device memory, whether the region is shareable. + * + * For Normal memory regions, the S bit indicates whether the region is + * shareable. For Strongly-ordered and Device memory, the S bit is ignored. + * + * See the following two tables for setting TEX, S, C and B bits for + * unprivileged flash, privileged flash and privileged RAM regions. + * + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | TEX | C | B | Memory type | Description or Normal region cacheability | Shareable? | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 0 | Strongly-ordered | Strongly ordered | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 1 | Device | Shared device | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 0 | Normal | Outer and inner write-through; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 1 | Normal | Outer and inner write-back; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 0 | Normal | Outer and inner Non-cacheable | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 0 | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 1 | Normal | Outer and inner write-back; write and read allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 0 | Device | Non-shared device | Not shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 1 | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 011 | X | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 1BB | A | A | Normal | Cached memory, with AA and BB indicating the inner and | Reserved | + | | | | | outer cacheability rules that must be exported on the | | + | | | | | bus. See the table below for the cacheability policy | | + | | | | | encoding. memory, BB=Outer policy, AA=Inner policy. | | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | + +-----------------------------------------+----------------------------------------+ + | AA or BB subfield of {TEX,C,B} encoding | Cacheability policy | + +-----------------------------------------+----------------------------------------+ + | 00 | Non-cacheable | + +-----------------------------------------+----------------------------------------+ + | 01 | Write-back, write and read allocate | + +-----------------------------------------+----------------------------------------+ + | 10 | Write-through, no write allocate | + +-----------------------------------------+----------------------------------------+ + | 11 | Write-back, no write allocate | + +-----------------------------------------+----------------------------------------+ + */ + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for Flash + * region. */ +#ifndef configTEX_S_C_B_FLASH + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_FLASH ( 0x07UL ) +#endif + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for SRAM + * region. */ +#ifndef configTEX_S_C_B_SRAM + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_SRAM ( 0x07UL ) +#endif + +#define portUNPRIVILEGED_FLASH_REGION ( 0UL ) +#define portPRIVILEGED_FLASH_REGION ( 1UL ) +#define portPRIVILEGED_RAM_REGION ( 2UL ) +#define portGENERAL_PERIPHERALS_REGION ( 3UL ) +#define portSTACK_REGION ( 4UL ) +#define portFIRST_CONFIGURABLE_REGION ( 5UL ) +#define portTOTAL_NUM_REGIONS ( configTOTAL_MPU_REGIONS ) +#define portNUM_CONFIGURABLE_REGIONS ( portTOTAL_NUM_REGIONS - portFIRST_CONFIGURABLE_REGION ) +#define portLAST_CONFIGURABLE_REGION ( portTOTAL_NUM_REGIONS - 1 ) + +void vPortSwitchToUserMode( void ); +#define portSWITCH_TO_USER_MODE() vPortSwitchToUserMode() + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm{ SVC portSVC_YIELD } +#define portYIELD_WITHIN_API() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ + } +/*-----------------------------------------------------------*/ + +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline +#endif +/*-----------------------------------------------------------*/ + +extern BaseType_t xIsPrivileged( void ); +extern void vResetPrivilege( void ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +#define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + */ +#define portRAISE_PRIVILEGE() __asm { svc portSVC_RAISE_PRIVILEGE } + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ +#define portRESET_PRIVILEGE() vResetPrivilege() +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) +{ + __asm + { + /* Barrier instructions are not used as this function is only used to + * lower the BASEPRI value. */ +/* *INDENT-OFF* */ + msr basepri, ulBASEPRI +/* *INDENT-ON* */ + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortRaiseBASEPRI( void ) +{ + uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) +{ + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + * used to lower the mask in an interrupt, so memory barriers are not + * used. */ +/* *INDENT-OFF* */ + msr basepri, # 0 +/* *INDENT-ON* */ + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) +{ + uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + mrs ulReturn, basepri + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { + mrs ulCurrentInterrupt, ipsr + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY + #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html" + #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0 +#endif +/*-----------------------------------------------------------*/ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM7/ReadMe.txt b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM7/ReadMe.txt new file mode 100644 index 000000000..0a2e7fd04 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM7/ReadMe.txt @@ -0,0 +1,18 @@ +There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers. +The best option depends on the revision of the ARM Cortex-M7 core in use. The +revision is specified by an 'r' number, and a 'p' number, so will look something +like 'r0p1'. Check the documentation for the microcontroller in use to find the +revision of the Cortex-M7 core used in that microcontroller. If in doubt, use +the FreeRTOS port provided specifically for r0p1 revisions, as that can be used +with all core revisions. + +The first option is to use the ARM Cortex-M4F port, and the second option is to +use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround. + +If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be +used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in +the /FreeRTOS/Source/portable/RVDS/ARM_CM4F directory. + +If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM +Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1 +directory. \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM7/r0p1/port.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM7/r0p1/port.c new file mode 100644 index 000000000..0dc23f8d6 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM7/r0p1/port.c @@ -0,0 +1,796 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM7 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* The __weak attribute does not work as you might expect with the Keil tools + * so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if + * the application writer wants to provide their own implementation of + * vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION + * is defined. */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Functions defined in portasm.s to enable the VFP. + */ +static void prvEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [ r3 ] + ldr r0, [ r1 ] + /* Pop the core registers. */ + ldmia r0!, { r4-r11, r14 } + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [ r0 ] + ldr r0, [ r0 ] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + + /* Clear the bit that indicates the FPU is in use in case the FPU was used + * before the scheduler was started - which would otherwise result in the + * unnecessary leaving of space in the SVC stack for lazy saving of FPU + * registers. */ + mov r0, #0 + msr control, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + /* Call SVC to start the first task. */ + svc 0 + nop + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvEnableVFP( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [ r0 ] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [ r0 ] + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + * priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + prvEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [ r3 ] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14 } + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [ r2 ] + + stmdb sp!, { r0, r3 } + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + cpsid i + msr basepri, r0 + dsb + isb + cpsie i + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, { r0, r3 } + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] + + /* Pop the core registers. */ + ldmia r0!, { r4-r11, r14 } + + /* Is the task using the FPU context? If so, pop the high vfp registers + * too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, { s16-s31 } + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + nop + #endif + #endif + + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known - therefore the slightly faster vPortRaiseBASEPRI() function is used + * in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + vPortRaiseBASEPRI(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + + vPortClearBASEPRIFromISR(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_irq() call + * above. */ + __enable_irq(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __enable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __enable_irq(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + __weak void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm uint32_t vPortGetIPSR( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, ipsr + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM7/r0p1/portmacro.h b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM7/r0p1/portmacro.h new file mode 100644 index 000000000..ce908c846 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/portable/RVDS/ARM_CM7/r0p1/portmacro.h @@ -0,0 +1,269 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ + #define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ + } +/*-----------------------------------------------------------*/ + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + + #endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline + #endif + +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) + { + __asm + { + /* Barrier instructions are not used as this function is only used to + * lower the BASEPRI value. */ +/* *INDENT-OFF* */ + msr basepri, ulBASEPRI +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + cpsid i + msr basepri, ulNewBASEPRI + dsb + isb + cpsie i +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) + { + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + * used to lower the mask in an interrupt, so memory barriers are not + * used. */ +/* *INDENT-OFF* */ + msr basepri, # 0 +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + mrs ulReturn, basepri + cpsid i + msr basepri, ulNewBASEPRI + dsb + isb + cpsie i +/* *INDENT-ON* */ + } + + return ulReturn; + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { +/* *INDENT-OFF* */ + mrs ulCurrentInterrupt, ipsr +/* *INDENT-ON* */ + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/queue.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/queue.c new file mode 100644 index 000000000..46ed9a4ff --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/queue.c @@ -0,0 +1,3075 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +#if ( configUSE_CO_ROUTINES == 1 ) + #include "croutine.h" +#endif + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + + +/* Constants used with the cRxLock and cTxLock structure members. */ +#define queueUNLOCKED ( ( int8_t ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) +#define queueINT8_MAX ( ( int8_t ) 127 ) + +/* When the Queue_t structure is used to represent a base queue its pcHead and + * pcTail members are used as pointers into the queue storage area. When the + * Queue_t structure is used to represent a mutex pcHead and pcTail pointers are + * not necessary, and the pcHead pointer is set to NULL to indicate that the + * structure instead holds a pointer to the mutex holder (if any). Map alternative + * names to the pcHead and structure member to ensure the readability of the code + * is maintained. The QueuePointers_t and SemaphoreData_t types are used to form + * a union as their usage is mutually exclusive dependent on what the queue is + * being used for. */ +#define uxQueueType pcHead +#define queueQUEUE_IS_MUTEX NULL + +typedef struct QueuePointers +{ + int8_t * pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + int8_t * pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ +} QueuePointers_t; + +typedef struct SemaphoreData +{ + TaskHandle_t xMutexHolder; /*< The handle of the task that holds the mutex. */ + UBaseType_t uxRecursiveCallCount; /*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ +} SemaphoreData_t; + +/* Semaphores do not actually store or copy data, so have an item size of + * zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + +#if ( configUSE_PREEMPTION == 0 ) + +/* If the cooperative scheduler is being used then a yield should not be + * performed just because a higher priority task has been woken. */ + #define queueYIELD_IF_USING_PREEMPTION() +#else + #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* + * Definition of the queue used by the scheduler. + * Items are queued by copy, not reference. See the following link for the + * rationale: https://www.FreeRTOS.org/Embedded-RTOS-Queues.html + */ +typedef struct QueueDefinition /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +{ + int8_t * pcHead; /*< Points to the beginning of the queue storage area. */ + int8_t * pcWriteTo; /*< Points to the free next place in the storage area. */ + + union + { + QueuePointers_t xQueue; /*< Data required exclusively when this structure is used as a queue. */ + SemaphoreData_t xSemaphore; /*< Data required exclusively when this structure is used as a semaphore. */ + } u; + + List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile UBaseType_t uxMessagesWaiting; /*< The number of items currently in the queue. */ + UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ + + volatile int8_t cRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile int8_t cTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + struct QueueDefinition * pxQueueSetContainer; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxQueueNumber; + uint8_t ucQueueType; + #endif +} xQUEUE; + +/* The old xQUEUE name is maintained above then typedefed to the new Queue_t + * name below to enable the use of older kernel aware debuggers. */ +typedef xQUEUE Queue_t; + +/*-----------------------------------------------------------*/ + +/* + * The queue registry is just a means for kernel aware debuggers to locate + * queue structures. It has no other purpose so is an optional component. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + +/* The type stored within the queue registry array. This allows a name + * to be assigned to each queue making kernel aware debugging a little + * more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + const char * pcQueueName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + QueueHandle_t xHandle; + } xQueueRegistryItem; + +/* The old xQueueRegistryItem name is maintained above then typedefed to the + * new xQueueRegistryItem name below to enable the use of older kernel aware + * debuggers. */ + typedef xQueueRegistryItem QueueRegistryItem_t; + +/* The queue registry is simply an array of QueueRegistryItem_t structures. + * The pcQueueName member of a structure being NULL is indicative of the + * array position being vacant. */ + PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; + +#endif /* configQUEUE_REGISTRY_SIZE */ + +/* + * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not + * prevent an ISR from adding or removing items to the queue, but does prevent + * an ISR from removing tasks from the queue event lists. If an ISR finds a + * queue is locked it will instead increment the appropriate queue lock count + * to indicate that a task may require unblocking. When the queue in unlocked + * these lock counts are inspected, and the appropriate action taken. + */ +static void prvUnlockQueue( Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any data in a queue. + * + * @return pdTRUE if the queue contains no items, otherwise pdFALSE. + */ +static BaseType_t prvIsQueueEmpty( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any space in a queue. + * + * @return pdTRUE if there is no space, otherwise pdFALSE; + */ +static BaseType_t prvIsQueueFull( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Copies an item into the queue, either at the front of the queue or the + * back of the queue. + */ +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, + const void * pvItemToQueue, + const BaseType_t xPosition ) PRIVILEGED_FUNCTION; + +/* + * Copies an item out of a queue. + */ +static void prvCopyDataFromQueue( Queue_t * const pxQueue, + void * const pvBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_QUEUE_SETS == 1 ) + +/* + * Checks to see if a queue is a member of a queue set, and if so, notifies + * the queue set that the queue contains data. + */ + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * Called after a Queue_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + const uint8_t ucQueueType, + Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION; + +/* + * Mutexes are a special type of queue. When a mutex is created, first the + * queue is created, then prvInitialiseMutex() is called to configure the queue + * as a mutex. + */ +#if ( configUSE_MUTEXES == 1 ) + static void prvInitialiseMutex( Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION; +#endif + +#if ( configUSE_MUTEXES == 1 ) + +/* + * If a task waiting for a mutex causes the mutex holder to inherit a + * priority, but the waiting task times out, then the holder should + * disinherit the priority - but only down to the highest priority of any + * other tasks that are waiting for the same mutex. This function returns + * that priority. + */ + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* + * Macro to mark a queue as locked. Locking a queue prevents an ISR from + * accessing the queue event lists. + */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) +{ + BaseType_t xReturn = pdPASS; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + if( ( pxQueue != NULL ) && + ( pxQueue->uxLength >= 1U ) && + /* Check for multiplication overflow. */ + ( ( SIZE_MAX / pxQueue->uxLength ) >= pxQueue->uxItemSize ) ) + { + taskENTER_CRITICAL(); + { + pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; + pxQueue->pcWriteTo = pxQueue->pcHead; + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->cRxLock = queueUNLOCKED; + pxQueue->cTxLock = queueUNLOCKED; + + if( xNewQueue == pdFALSE ) + { + /* If there are tasks blocked waiting to read from the queue, then + * the tasks will remain blocked as after this function exits the queue + * will still be empty. If there are tasks blocked waiting to write to + * the queue, then one should be unblocked as after this function exits + * it will be possible to write to it. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Ensure the event queues start in the correct state. */ + vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); + } + } + taskEXIT_CRITICAL(); + } + else + { + xReturn = pdFAIL; + } + + configASSERT( xReturn != pdFAIL ); + + /* A value is returned for calling semantic consistency with previous + * versions. */ + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) + { + Queue_t * pxNewQueue = NULL; + + /* The StaticQueue_t structure and the queue storage area must be + * supplied. */ + configASSERT( pxStaticQueue ); + + if( ( uxQueueLength > ( UBaseType_t ) 0 ) && + ( pxStaticQueue != NULL ) && + + /* A queue storage area should be provided if the item size is not 0, and + * should not be provided if the item size is 0. */ + ( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0 ) ) ) && + ( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0 ) ) ) ) + { + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticQueue_t or StaticSemaphore_t equals the size of + * the real queue and semaphore structures. */ + volatile size_t xSize = sizeof( StaticQueue_t ); + + /* This assertion cannot be branch covered in unit tests */ + configASSERT( xSize == sizeof( Queue_t ) ); /* LCOV_EXCL_BR_LINE */ + ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ + + /* The address of a statically allocated queue was passed in, use it. + * The address of a statically allocated storage area was also passed in + * but is already set. */ + pxNewQueue = ( Queue_t * ) pxStaticQueue; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Queues can be allocated wither statically or dynamically, so + * note this queue was allocated statically in case the queue is + * later deleted. */ + pxNewQueue->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + configASSERT( pxNewQueue ); + mtCOVERAGE_TEST_MARKER(); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) + { + Queue_t * pxNewQueue = NULL; + size_t xQueueSizeInBytes; + uint8_t * pucQueueStorage; + + if( ( uxQueueLength > ( UBaseType_t ) 0 ) && + /* Check for multiplication overflow. */ + ( ( SIZE_MAX / uxQueueLength ) >= uxItemSize ) && + /* Check for addition overflow. */ + ( ( SIZE_MAX - sizeof( Queue_t ) ) >= ( uxQueueLength * uxItemSize ) ) ) + { + /* Allocate enough space to hold the maximum number of items that + * can be in the queue at any time. It is valid for uxItemSize to be + * zero in the case the queue is used as a semaphore. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Allocate the queue and storage area. Justification for MISRA + * deviation as follows: pvPortMalloc() always ensures returned memory + * blocks are aligned per the requirements of the MCU stack. In this case + * pvPortMalloc() must return a pointer that is guaranteed to meet the + * alignment requirements of the Queue_t structure - which in this case + * is an int8_t *. Therefore, whenever the stack alignment requirements + * are greater than or equal to the pointer to char requirements the cast + * is safe. In other cases alignment requirements are not strict (one or + * two bytes). */ + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /*lint !e9087 !e9079 see comment above. */ + + if( pxNewQueue != NULL ) + { + /* Jump past the queue structure to find the location of the queue + * storage area. */ + pucQueueStorage = ( uint8_t * ) pxNewQueue; + pucQueueStorage += sizeof( Queue_t ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Queues can be created either statically or dynamically, so + * note this task was created dynamically in case it is later + * deleted. */ + pxNewQueue->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + traceQUEUE_CREATE_FAILED( ucQueueType ); + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + configASSERT( pxNewQueue ); + mtCOVERAGE_TEST_MARKER(); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + const uint8_t ucQueueType, + Queue_t * pxNewQueue ) +{ + /* Remove compiler warnings about unused parameters should + * configUSE_TRACE_FACILITY not be set to 1. */ + ( void ) ucQueueType; + + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* No RAM was allocated for the queue storage area, but PC head cannot + * be set to NULL because NULL is used as a key to say the queue is used as + * a mutex. Therefore just set pcHead to point to the queue as a benign + * value that is known to be within the memory map. */ + pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; + } + else + { + /* Set the head to the start of the queue storage area. */ + pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; + } + + /* Initialise the queue members as described where the queue type is + * defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ + + #if ( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif /* configUSE_QUEUE_SETS */ + + traceQUEUE_CREATE( pxNewQueue ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + static void prvInitialiseMutex( Queue_t * pxNewQueue ) + { + if( pxNewQueue != NULL ) + { + /* The queue create function will set all the queue structure members + * correctly for a generic queue, but this function is creating a + * mutex. Overwrite those members that need to be set differently - + * in particular the information required for priority inheritance. */ + pxNewQueue->u.xSemaphore.xMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + + /* In case this is a recursive mutex. */ + pxNewQueue->u.xSemaphore.uxRecursiveCallCount = 0; + + traceCREATE_MUTEX( pxNewQueue ); + + /* Start with the semaphore in the expected state. */ + ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + + return xNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + /* Prevent compiler warnings about unused parameters if + * configUSE_TRACE_FACILITY does not equal 1. */ + ( void ) ucQueueType; + + xNewQueue = xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + + return xNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; + Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore; + + configASSERT( xSemaphore ); + + /* This function is called by xSemaphoreGetMutexHolder(), and should not + * be called directly. Note: This is a good way of determining if the + * calling task is the mutex holder, but not a good way of determining the + * identity of the mutex holder, as the holder may change between the + * following critical section exiting and the function returning. */ + taskENTER_CRITICAL(); + { + if( pxSemaphore->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = pxSemaphore->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } + } + taskEXIT_CRITICAL(); + + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + +#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; + + configASSERT( xSemaphore ); + + /* Mutexes cannot be used in interrupt service routines, so the mutex + * holder should not change in an ISR, and therefore a critical section is + * not required here. */ + if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = ( ( Queue_t * ) xSemaphore )->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } + + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + +#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* If this is the task that holds the mutex then xMutexHolder will not + * change outside of this task. If this task does not hold the mutex then + * pxMutexHolder can never coincidentally equal the tasks handle, and as + * this is the only condition we are interested in it does not matter if + * pxMutexHolder is accessed simultaneously by another task. Therefore no + * mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); + + /* uxRecursiveCallCount cannot be zero if xMutexHolder is equal to + * the task handle, therefore no underflow check is required. Also, + * uxRecursiveCallCount is only modified by the mutex holder, and as + * there can only be one, no mutual exclusion is required to modify the + * uxRecursiveCallCount member. */ + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )--; + + /* Has the recursive call count unwound to 0? */ + if( pxMutex->u.xSemaphore.uxRecursiveCallCount == ( UBaseType_t ) 0 ) + { + /* Return the mutex. This will automatically unblock any other + * task that might be waiting to access the mutex. */ + ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + /* The mutex cannot be given because the calling task is not the + * holder. */ + xReturn = pdFAIL; + + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* Comments regarding mutual exclusion as per those within + * xQueueGiveMutexRecursive(). */ + + traceTAKE_MUTEX_RECURSIVE( pxMutex ); + + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueSemaphoreTake( pxMutex, xTicksToWait ); + + /* pdPASS will only be returned if the mutex was successfully + * obtained. The calling task may have entered the Blocked state + * before reaching here. */ + if( xReturn != pdFAIL ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) + { + QueueHandle_t xHandle = NULL; + + if( ( uxMaxCount != 0 ) && + ( uxInitialCount <= uxMaxCount ) ) + { + xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + } + else + { + configASSERT( xHandle ); + mtCOVERAGE_TEST_MARKER(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) + { + QueueHandle_t xHandle = NULL; + + if( ( uxMaxCount != 0 ) && + ( uxInitialCount <= uxMaxCount ) ) + { + xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + } + else + { + configASSERT( xHandle ); + mtCOVERAGE_TEST_MARKER(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) +{ + BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to + * allow return statements within the function itself. This is done in the + * interest of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? The running task must be the + * highest priority task wanting to access the queue. If the head item + * in the queue is to be overwritten then it does not matter if the + * queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND( pxQueue ); + + #if ( configUSE_QUEUE_SETS == 1 ) + { + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + * was overwritten in the queue so the number of items + * in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + * to the queue set caused a higher priority task to + * unblock. A context switch is required. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If there was a task waiting for data to arrive on the + * queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + * our own so yield immediately. Yes it is ok to + * do this from within the critical section - the + * kernel takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + * executed if the task was holding multiple mutexes + * and the mutexes were given back in an order that is + * different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + * queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + * our own so yield immediately. Yes it is ok to do + * this from within the critical section - the kernel + * takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + * executed if the task was holding multiple mutexes and + * the mutexes were given back in an order that is + * different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was full and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + * the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + * configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + * now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + * event list. It is possible that interrupts occurring now + * remove this task from the event list again - but as the + * scheduler is suspended the task will go onto the pending + * ready list instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + * ready list into the ready list - so it is feasible that this + * task is already in the ready list before it yields - in which + * case the yield will not cause a context switch unless there + * is also a higher priority task in the pending ready list. */ + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, + const void * const pvItemToQueue, + BaseType_t * const pxHigherPriorityTaskWoken, + const BaseType_t xCopyPosition ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + /* Similar to xQueueGenericSend, except without blocking if there is no room + * in the queue. Also don't directly wake a task that was blocked on a queue + * read, instead return a flag to say whether a context switch is required or + * not (i.e. has a task with a higher priority than us been woken by this + * post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + const int8_t cTxLock = pxQueue->cTxLock; + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a + * semaphore or mutex. That means prvCopyDataToQueue() cannot result + * in a task disinheriting a priority and prvCopyDataToQueue() can be + * called here even though the disinherit function does not check if + * the scheduler is suspended before accessing the ready lists. */ + ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* The event list is not altered if the queue is locked. This will + * be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + * was overwritten in the queue so the number of items + * in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + * to the queue set caused a higher priority task to + * unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + * record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Not used in this path. */ + ( void ) uxPreviousMessagesWaiting; + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was posted while it was locked. */ + configASSERT( cTxLock != queueINT8_MAX ); + + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; + + /* Similar to xQueueGenericSendFromISR() but used with semaphores where the + * item size is 0. Don't directly wake a task that was blocked on a queue + * read, instead return a flag to say whether a context switch is required or + * not (i.e. has a task with a higher priority than us been woken by this + * post). */ + + configASSERT( pxQueue ); + + /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() + * if the item size is not 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Normally a mutex would not be given from an interrupt, especially if + * there is a mutex holder, as priority inheritance makes no sense for an + * interrupts, only tasks. */ + configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* When the queue is used to implement a semaphore no data is ever + * moved through the queue but it is still valid to see if the queue 'has + * space'. */ + if( uxMessagesWaiting < pxQueue->uxLength ) + { + const int8_t cTxLock = pxQueue->cTxLock; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* A task can only have an inherited priority if it is a mutex + * holder - and if there is a mutex holder then the mutex cannot be + * given from an ISR. As this is the ISR version of the function it + * can be assumed there is no mutex holder and no need to determine if + * priority disinheritance is needed. Simply increase the count of + * messages (semaphores) available. */ + pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + + /* The event list is not altered if the queue is locked. This will + * be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The semaphore is a member of a queue set, and + * posting to the queue set caused a higher priority + * task to unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + * record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was posted while it was locked. */ + configASSERT( cTxLock != queueINT8_MAX ); + + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceive( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) +{ + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + * is zero (so no data is copied into the buffer). */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to + * allow return statements within the function itself. This is done in the + * interest of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data available, remove one item. */ + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_RECEIVE( pxQueue ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + + /* There is now space in the queue, were any tasks waiting to + * post to the queue? If so, unblock the highest priority waiting + * task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + * configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + * now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* The timeout has not expired. If the queue is still empty place + * the task on the list of tasks waiting to receive from the queue. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The queue contains data again. Loop back to try and read the + * data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* Timed out. If there is no data in the queue exit, otherwise loop + * back and attempt to read the data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) +{ + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; + + #if ( configUSE_MUTEXES == 1 ) + BaseType_t xInheritanceOccurred = pdFALSE; + #endif + + /* Check the queue pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* Check this really is a semaphore, in which case the item size will be + * 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to allow return + * statements within the function itself. This is done in the interest + * of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL(); + { + /* Semaphores are queues with an item size of 0, and where the + * number of messages in the queue is the semaphore's count value. */ + const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxSemaphoreCount > ( UBaseType_t ) 0 ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* Semaphores are queues with a data size of zero and where the + * messages waiting is the semaphore's count. Reduce the count. */ + pxQueue->uxMessagesWaiting = uxSemaphoreCount - ( UBaseType_t ) 1; + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + * priority inheritance should it become necessary. */ + pxQueue->u.xSemaphore.xMutexHolder = pvTaskIncrementMutexHeldCount(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + + /* Check to see if other tasks are blocked waiting to give the + * semaphore, and if so, unblock the highest priority such task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* For inheritance to have occurred there must have been an + * initial timeout, and an adjusted timeout cannot become 0, as + * if it were 0 the function would have exited. */ + #if ( configUSE_MUTEXES == 1 ) + { + configASSERT( xInheritanceOccurred == pdFALSE ); + } + #endif /* configUSE_MUTEXES */ + + /* The semaphore count was 0 and no block time is specified + * (or the block time has expired) so exit now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The semaphore count was 0 and a block time was specified + * so configure the timeout structure ready to block. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can give to and take from the semaphore + * now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* A block time is specified and not expired. If the semaphore + * count is 0 then enter the Blocked state to wait for a semaphore to + * become available. As semaphores are implemented with queues the + * queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + taskENTER_CRITICAL(); + { + xInheritanceOccurred = xTaskPriorityInherit( pxQueue->u.xSemaphore.xMutexHolder ); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MUTEXES == 1 ) */ + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* There was no timeout and the semaphore count was not 0, so + * attempt to take the semaphore again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* Timed out. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + /* If the semaphore count is 0 exit now as the timeout has + * expired. Otherwise return to attempt to take the semaphore that is + * known to be available. As semaphores are implemented by queues the + * queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + #if ( configUSE_MUTEXES == 1 ) + { + /* xInheritanceOccurred could only have be set if + * pxQueue->uxQueueType == queueQUEUE_IS_MUTEX so no need to + * test the mutex type again to check it is actually a mutex. */ + if( xInheritanceOccurred != pdFALSE ) + { + taskENTER_CRITICAL(); + { + UBaseType_t uxHighestWaitingPriority; + + /* This task blocking on the mutex caused another + * task to inherit this task's priority. Now this task + * has timed out the priority should be disinherited + * again, but only as low as the next highest priority + * task that is waiting for the same mutex. */ + uxHighestWaitingPriority = prvGetDisinheritPriorityAfterTimeout( pxQueue ); + vTaskPriorityDisinheritAfterTimeout( pxQueue->u.xSemaphore.xMutexHolder, uxHighestWaitingPriority ); + } + taskEXIT_CRITICAL(); + } + } + #endif /* configUSE_MUTEXES */ + + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) +{ + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + int8_t * pcOriginalReadPosition; + Queue_t * const pxQueue = xQueue; + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + * is zero (so no data is copied into the buffer. */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to + * allow return statements within the function itself. This is done in the + * interest of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Remember the read position so it can be reset after the data + * is read from the queue as this function is only peeking the + * data, not removing it. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_PEEK( pxQueue ); + + /* The data is not being removed, so reset the read pointer. */ + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + * any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + * configure the timeout structure ready to enter the blocked + * state. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + * now that the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* Timeout has not expired yet, check to see if there is data in the + * queue now, and if not enter the Blocked state to wait for data. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_PEEK( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* There is data in the queue now, so don't enter the blocked + * state, instead return to try and obtain the data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. If there is still no data in the queue + * exit, otherwise go back and try to read the data again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, + void * const pvBuffer, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Cannot block in an ISR, so check there is data available. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + const int8_t cRxLock = pxQueue->cRxLock; + + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + + /* If the queue is locked the event list will not be modified. + * Instead update the lock count so the task that unlocks the queue + * will know that an ISR has removed data while the queue was + * locked. */ + if( cRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + * force a context switch. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was removed while it was locked. */ + configASSERT( cRxLock != queueINT8_MAX ); + + pxQueue->cRxLock = ( int8_t ) ( cRxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, + void * const pvBuffer ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + int8_t * pcOriginalReadPosition; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); + + /* Remember the read position so it can be reset as nothing is + * actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) +{ + UBaseType_t uxReturn; + + configASSERT( xQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) +{ + UBaseType_t uxReturn; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) +{ + UBaseType_t uxReturn; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + uxReturn = pxQueue->uxMessagesWaiting; + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +void vQueueDelete( QueueHandle_t xQueue ) +{ + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + traceQUEUE_DELETE( pxQueue ); + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + vQueueUnregisterQueue( pxQueue ); + } + #endif + + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The queue can only have been allocated dynamically - free it + * again. */ + vPortFree( pxQueue ); + } + #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The queue could have been allocated statically or dynamically, so + * check before attempting to free the memory. */ + if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxQueue ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) */ + { + /* The queue must have been statically allocated, so is not going to be + * deleted. Avoid compiler warnings about the unused parameter. */ + ( void ) pxQueue; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) + { + ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->ucQueueType; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) + { + UBaseType_t uxHighestPriorityOfWaitingTasks; + + /* If a task waiting for a mutex causes the mutex holder to inherit a + * priority, but the waiting task times out, then the holder should + * disinherit the priority - but only down to the highest priority of any + * other tasks that are waiting for the same mutex. For this purpose, + * return the priority of the highest priority task that is waiting for the + * mutex. */ + if( listCURRENT_LIST_LENGTH( &( pxQueue->xTasksWaitingToReceive ) ) > 0U ) + { + uxHighestPriorityOfWaitingTasks = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) listGET_ITEM_VALUE_OF_HEAD_ENTRY( &( pxQueue->xTasksWaitingToReceive ) ); + } + else + { + uxHighestPriorityOfWaitingTasks = tskIDLE_PRIORITY; + } + + return uxHighestPriorityOfWaitingTasks; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, + const void * pvItemToQueue, + const BaseType_t xPosition ) +{ + BaseType_t xReturn = pdFALSE; + UBaseType_t uxMessagesWaiting; + + /* This function is called from a critical section. */ + + uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder ); + pxQueue->u.xSemaphore.xMutexHolder = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + } + else if( xPosition == queueSEND_TO_BACK ) + { + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ + pxQueue->pcWriteTo += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ + + if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e9087 !e418 MISRA exception as the casts are only redundant for some ports. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. Assert checks null pointer only used when length is 0. */ + pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xPosition == queueOVERWRITE ) + { + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* An item is not being added but overwritten, so subtract + * one from the recorded number of items in the queue so when + * one is added again below the number of recorded items remains + * correct. */ + --uxMessagesWaiting; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataFromQueue( Queue_t * const pxQueue, + void * const pvBuffer ) +{ + if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) + { + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ + } +} +/*-----------------------------------------------------------*/ + +static void prvUnlockQueue( Queue_t * const pxQueue ) +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + * removed from the queue while the queue was locked. When a queue is + * locked items can be added or removed, but the event lists cannot be + * updated. */ + taskENTER_CRITICAL(); + { + int8_t cTxLock = pxQueue->cTxLock; + + /* See if data was added to the queue while it was locked. */ + while( cTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + * blocked waiting for data to become available? */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting to + * the queue set caused a higher priority task to unblock. + * A context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Tasks that are removed from the event list will get + * added to the pending ready list as the scheduler is still + * suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* Tasks that are removed from the event list will get added to + * the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that + * a context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + #endif /* configUSE_QUEUE_SETS */ + + --cTxLock; + } + + pxQueue->cTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); + { + int8_t cRxLock = pxQueue->cRxLock; + + while( cRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --cRxLock; + } + else + { + break; + } + } + + pxQueue->cRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueEmpty( const Queue_t * pxQueue ) +{ + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) +{ + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueFull( const Queue_t * pxQueue ) +{ + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) +{ + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSend( QueueHandle_t xQueue, + const void * pvItemToQueue, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + /* If the queue is already full we may have to block. A critical section + * is required to prevent an interrupt removing something from the queue + * between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + /* The queue is full - do we want to block or just leave without + * posting? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + * return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; + + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + * into the ready list as we are within a critical section. + * Instead the same pending ready list mechanism is used as if + * the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + * that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceive( QueueHandle_t xQueue, + void * pvBuffer, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + /* If the queue is already empty we may have to block. A critical section + * is required to prevent an interrupt adding something to the queue + * between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + * leave with nothing? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + * indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + * into the ready list as we are within a critical section. + * Instead the same pending ready list mechanism is used as if + * the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, + const void * pvItemToQueue, + BaseType_t xCoRoutinePreviouslyWoken ) + { + Queue_t * const pxQueue = xQueue; + + /* Cannot block within an ISR so if there is no space on the queue then + * exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + + /* We only want to wake one co-routine per ISR, so check that a + * co-routine has not already been woken. */ + if( xCoRoutinePreviouslyWoken == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCoRoutinePreviouslyWoken; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, + void * pvBuffer, + BaseType_t * pxCoRoutineWoken ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + /* We cannot block from an ISR, so check there is data available. If + * not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + if( ( *pxCoRoutineWoken ) == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + + configASSERT( xQueue ); + + QueueRegistryItem_t * pxEntryToWrite = NULL; + + if( pcQueueName != NULL ) + { + /* See if there is an empty space in the registry. A NULL name denotes + * a free slot. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + /* Replace an existing entry if the queue is already in the registry. */ + if( xQueue == xQueueRegistry[ ux ].xHandle ) + { + pxEntryToWrite = &( xQueueRegistry[ ux ] ); + break; + } + /* Otherwise, store in the next empty location */ + else if( ( pxEntryToWrite == NULL ) && ( xQueueRegistry[ ux ].pcQueueName == NULL ) ) + { + pxEntryToWrite = &( xQueueRegistry[ ux ] ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + + if( pxEntryToWrite != NULL ) + { + /* Store the information on this queue. */ + pxEntryToWrite->pcQueueName = pcQueueName; + pxEntryToWrite->xHandle = xQueue; + + traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); + } + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + const char * pcQueueGetName( QueueHandle_t xQueue ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + const char * pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + configASSERT( xQueue ); + + /* Note there is nothing here to protect against another task adding or + * removing entries from the registry while it is being searched. */ + + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + pcReturn = xQueueRegistry[ ux ].pcQueueName; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return pcReturn; + } /*lint !e818 xQueue cannot be a pointer to const because it is a typedef. */ + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueUnregisterQueue( QueueHandle_t xQueue ) + { + UBaseType_t ux; + + configASSERT( xQueue ); + + /* See if the handle of the queue being unregistered in actually in the + * registry. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; + + /* Set the handle to NULL to ensure the same queue handle cannot + * appear in the registry twice if it is added, removed, then + * added again. */ + xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) + { + Queue_t * const pxQueue = xQueue; + + /* This function should not be called by application code hence the + * 'Restricted' in its name. It is not part of the public API. It is + * designed for use by kernel code, and has special calling requirements. + * It can result in vListInsert() being called on a list that can only + * possibly ever have one item in it, so the list will be fast, but even + * so it should be called with the scheduler locked and not from a critical + * section. */ + + /* Only do anything if there are no messages in the queue. This function + * will not actually cause the task to block, just place it on a blocked + * list. It will not block until the scheduler is unlocked - at which + * time a yield will be performed. If an item is added to the queue while + * the queue is locked, and the calling task blocks on the queue, then the + * calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvUnlockQueue( pxQueue ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) + { + QueueSetHandle_t pxQueue; + + pxQueue = xQueueGenericCreate( uxEventQueueLength, ( UBaseType_t ) sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); + + return pxQueue; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) + { + /* Cannot add a queue/semaphore to more than one queue set. */ + xReturn = pdFAIL; + } + else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* Cannot add a queue/semaphore to a queue set if there are already + * items in the queue/semaphore. */ + xReturn = pdFAIL; + } + else + { + ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; + + if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) + { + /* The queue was not a member of the set. */ + xReturn = pdFAIL; + } + else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* It is dangerous to remove a queue from a set when the queue is + * not empty because the queue set will still hold pending events for + * the queue. */ + xReturn = pdFAIL; + } + else + { + taskENTER_CRITICAL(); + { + /* The queue is no longer contained in the set. */ + pxQueueOrSemaphore->pxQueueSetContainer = NULL; + } + taskEXIT_CRITICAL(); + xReturn = pdPASS; + } + + return xReturn; + } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + TickType_t const xTicksToWait ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) + { + Queue_t * pxQueueSetContainer = pxQueue->pxQueueSetContainer; + BaseType_t xReturn = pdFALSE; + + /* This function must be called form a critical section. */ + + /* The following line is not reachable in unit tests because every call + * to prvNotifyQueueSetContainer is preceded by a check that + * pxQueueSetContainer != NULL */ + configASSERT( pxQueueSetContainer ); /* LCOV_EXCL_BR_LINE */ + configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); + + if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) + { + const int8_t cTxLock = pxQueueSetContainer->cTxLock; + + traceQUEUE_SET_SEND( pxQueueSetContainer ); + + /* The data copied is the handle of the queue that contains data. */ + xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, queueSEND_TO_BACK ); + + if( cTxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + configASSERT( cTxLock != queueINT8_MAX ); + + pxQueueSetContainer->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/stream_buffer.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/stream_buffer.c new file mode 100644 index 000000000..cf6300fc1 --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/stream_buffer.c @@ -0,0 +1,1307 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "stream_buffer.h" + +#if ( configUSE_TASK_NOTIFICATIONS != 1 ) + #error configUSE_TASK_NOTIFICATIONS must be set to 1 to build stream_buffer.c +#endif + +/* Lint e961, e9021 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + +/* If the user has not provided application specific Rx notification macros, + * or #defined the notification macros away, then provide default implementations + * that uses task notifications. */ +/*lint -save -e9026 Function like macros allowed and needed here so they can be overridden. */ +#ifndef sbRECEIVE_COMPLETED + #define sbRECEIVE_COMPLETED( pxStreamBuffer ) \ + vTaskSuspendAll(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + ( void ) xTaskResumeAll(); +#endif /* sbRECEIVE_COMPLETED */ + +#ifndef sbRECEIVE_COMPLETED_FROM_ISR + #define sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \ + pxHigherPriorityTaskWoken ) \ + { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction, \ + pxHigherPriorityTaskWoken ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } +#endif /* sbRECEIVE_COMPLETED_FROM_ISR */ + +/* If the user has not provided an application specific Tx notification macro, + * or #defined the notification macro away, them provide a default implementation + * that uses task notifications. */ +#ifndef sbSEND_COMPLETED + #define sbSEND_COMPLETED( pxStreamBuffer ) \ + vTaskSuspendAll(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + ( void ) xTaskResumeAll(); +#endif /* sbSEND_COMPLETED */ + +#ifndef sbSEND_COMPLETE_FROM_ISR + #define sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction, \ + pxHigherPriorityTaskWoken ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } +#endif /* sbSEND_COMPLETE_FROM_ISR */ +/*lint -restore (9026) */ + +/* The number of bytes used to hold the length of a message in the buffer. */ +#define sbBYTES_TO_STORE_MESSAGE_LENGTH ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) ) + +/* Bits stored in the ucFlags field of the stream buffer. */ +#define sbFLAGS_IS_MESSAGE_BUFFER ( ( uint8_t ) 1 ) /* Set if the stream buffer was created as a message buffer, in which case it holds discrete messages rather than a stream. */ +#define sbFLAGS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 2 ) /* Set if the stream buffer was created using statically allocated memory. */ + +/*-----------------------------------------------------------*/ + +/* Structure that hold state information on the buffer. */ +typedef struct StreamBufferDef_t /*lint !e9058 Style convention uses tag. */ +{ + volatile size_t xTail; /* Index to the next item to read within the buffer. */ + volatile size_t xHead; /* Index to the next item to write within the buffer. */ + size_t xLength; /* The length of the buffer pointed to by pucBuffer. */ + size_t xTriggerLevelBytes; /* The number of bytes that must be in the stream buffer before a task that is waiting for data is unblocked. */ + volatile TaskHandle_t xTaskWaitingToReceive; /* Holds the handle of a task waiting for data, or NULL if no tasks are waiting. */ + volatile TaskHandle_t xTaskWaitingToSend; /* Holds the handle of a task waiting to send data to a message buffer that is full. */ + uint8_t * pucBuffer; /* Points to the buffer itself - that is - the RAM that stores the data passed through the buffer. */ + uint8_t ucFlags; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; /* Used for tracing purposes. */ + #endif +} StreamBuffer_t; + +/* + * The number of bytes available to be read from the buffer. + */ +static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) PRIVILEGED_FUNCTION; + +/* + * Add xCount bytes from pucData into the pxStreamBuffer's data storage area. + * This function does not update the buffer's xHead pointer, so multiple writes + * may be chained together "atomically". This is useful for Message Buffers where + * the length and data bytes are written in two separate chunks, and we don't want + * the reader to see the buffer as having grown until after all data is copied over. + * This function takes a custom xHead value to indicate where to write to (necessary + * for chaining) and returns the the resulting xHead position. + * To mark the write as complete, manually set the buffer's xHead field with the + * returned xHead from this function. + */ +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, + const uint8_t * pucData, + size_t xCount, + size_t xHead ) PRIVILEGED_FUNCTION; + +/* + * If the stream buffer is being used as a message buffer, then reads an entire + * message out of the buffer. If the stream buffer is being used as a stream + * buffer then read as many bytes as possible from the buffer. + * prvReadBytesFromBuffer() is called to actually extract the bytes from the + * buffer's data storage area. + */ +static size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable ) PRIVILEGED_FUNCTION; + +/* + * If the stream buffer is being used as a message buffer, then writes an entire + * message to the buffer. If the stream buffer is being used as a stream + * buffer then write as many bytes as possible to the buffer. + * prvWriteBytestoBuffer() is called to actually send the bytes to the buffer's + * data storage area. + */ +static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) PRIVILEGED_FUNCTION; + +/* + * Copies xCount bytes from the pxStreamBuffer's data storage area to pucData. + * This function does not update the buffer's xTail pointer, so multiple reads + * may be chained together "atomically". This is useful for Message Buffers where + * the length and data bytes are read in two separate chunks, and we don't want + * the writer to see the buffer as having more free space until after all data is + * copied over, especially if we have to abort the read due to insufficient receiving space. + * This function takes a custom xTail value to indicate where to read from (necessary + * for chaining) and returns the the resulting xTail position. + * To mark the read as complete, manually set the buffer's xTail field with the + * returned xTail from this function. + */ +static size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer, + uint8_t * pucData, + size_t xCount, + size_t xTail ) PRIVILEGED_FUNCTION; + +/* + * Called by both pxStreamBufferCreate() and pxStreamBufferCreateStatic() to + * initialise the members of the newly created stream buffer structure. + */ +static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer ) + { + uint8_t * pucAllocatedMemory; + uint8_t ucFlags; + + /* In case the stream buffer is going to be used as a message buffer + * (that is, it will hold discrete messages with a little meta data that + * says how big the next message is) check the buffer will be large enough + * to hold at least one message. */ + if( xIsMessageBuffer == pdTRUE ) + { + /* Is a message buffer but not statically allocated. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER; + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + } + else + { + /* Not a message buffer and not statically allocated. */ + ucFlags = 0; + configASSERT( xBufferSizeBytes > 0 ); + } + + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + + /* A trigger level of 0 would cause a waiting task to unblock even when + * the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } + + /* A stream buffer requires a StreamBuffer_t structure and a buffer. + * Both are allocated in a single call to pvPortMalloc(). The + * StreamBuffer_t structure is placed at the start of the allocated memory + * and the buffer follows immediately after. The requested size is + * incremented so the free space is returned as the user would expect - + * this is a quirk of the implementation that means otherwise the free + * space would be reported as one byte smaller than would be logically + * expected. */ + if( xBufferSizeBytes < ( xBufferSizeBytes + 1 + sizeof( StreamBuffer_t ) ) ) + { + xBufferSizeBytes++; + pucAllocatedMemory = ( uint8_t * ) pvPortMalloc( xBufferSizeBytes + sizeof( StreamBuffer_t ) ); /*lint !e9079 malloc() only returns void*. */ + } + else + { + pucAllocatedMemory = NULL; + } + + if( pucAllocatedMemory != NULL ) + { + prvInitialiseNewStreamBuffer( ( StreamBuffer_t * ) pucAllocatedMemory, /* Structure at the start of the allocated memory. */ /*lint !e9087 Safe cast as allocated memory is aligned. */ /*lint !e826 Area is not too small and alignment is guaranteed provided malloc() behaves as expected and returns aligned buffer. */ + pucAllocatedMemory + sizeof( StreamBuffer_t ), /* Storage area follows. */ /*lint !e9016 Indexing past structure valid for uint8_t pointer, also storage area has no alignment requirement. */ + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags ); + + traceSTREAM_BUFFER_CREATE( ( ( StreamBuffer_t * ) pucAllocatedMemory ), xIsMessageBuffer ); + } + else + { + traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ); + } + + return ( StreamBufferHandle_t ) pucAllocatedMemory; /*lint !e9087 !e826 Safe cast as allocated memory is aligned. */ + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer ) + { + StreamBuffer_t * const pxStreamBuffer = ( StreamBuffer_t * ) pxStaticStreamBuffer; /*lint !e740 !e9087 Safe cast as StaticStreamBuffer_t is opaque Streambuffer_t. */ + StreamBufferHandle_t xReturn; + uint8_t ucFlags; + + configASSERT( pucStreamBufferStorageArea ); + configASSERT( pxStaticStreamBuffer ); + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + + /* A trigger level of 0 would cause a waiting task to unblock even when + * the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } + + if( xIsMessageBuffer != pdFALSE ) + { + /* Statically allocated message buffer. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER | sbFLAGS_IS_STATICALLY_ALLOCATED; + } + else + { + /* Statically allocated stream buffer. */ + ucFlags = sbFLAGS_IS_STATICALLY_ALLOCATED; + } + + /* In case the stream buffer is going to be used as a message buffer + * (that is, it will hold discrete messages with a little meta data that + * says how big the next message is) check the buffer will be large enough + * to hold at least one message. */ + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticStreamBuffer_t equals the size of the real + * message buffer structure. */ + volatile size_t xSize = sizeof( StaticStreamBuffer_t ); + configASSERT( xSize == sizeof( StreamBuffer_t ) ); + } /*lint !e529 xSize is referenced is configASSERT() is defined. */ + #endif /* configASSERT_DEFINED */ + + if( ( pucStreamBufferStorageArea != NULL ) && ( pxStaticStreamBuffer != NULL ) ) + { + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pucStreamBufferStorageArea, + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags ); + + /* Remember this was statically allocated in case it is ever deleted + * again. */ + pxStreamBuffer->ucFlags |= sbFLAGS_IS_STATICALLY_ALLOCATED; + + traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ); + + xReturn = ( StreamBufferHandle_t ) pxStaticStreamBuffer; /*lint !e9087 Data hiding requires cast to opaque type. */ + } + else + { + xReturn = NULL; + traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ); + } + + return xReturn; + } + +#endif /* ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + +void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * pxStreamBuffer = xStreamBuffer; + + configASSERT( pxStreamBuffer ); + + traceSTREAM_BUFFER_DELETE( xStreamBuffer ); + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) pdFALSE ) + { + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both the structure and the buffer were allocated using a single call + * to pvPortMalloc(), hence only one call to vPortFree() is required. */ + vPortFree( ( void * ) pxStreamBuffer ); /*lint !e9087 Standard free() semantics require void *, plus pxStreamBuffer was allocated by pvPortMalloc(). */ + } + #else + { + /* Should not be possible to get here, ucFlags must be corrupt. + * Force an assert. */ + configASSERT( xStreamBuffer == ( StreamBufferHandle_t ) ~0 ); + } + #endif + } + else + { + /* The structure and buffer were not allocated dynamically and cannot be + * freed - just scrub the structure so future use will assert. */ + ( void ) memset( pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn = pdFAIL; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; + #endif + + configASSERT( pxStreamBuffer ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Store the stream buffer number so it can be restored after the + * reset. */ + uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber; + } + #endif + + /* Can only reset a message buffer if there are no tasks blocked on it. */ + taskENTER_CRITICAL(); + { + if( pxStreamBuffer->xTaskWaitingToReceive == NULL ) + { + if( pxStreamBuffer->xTaskWaitingToSend == NULL ) + { + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pxStreamBuffer->pucBuffer, + pxStreamBuffer->xLength, + pxStreamBuffer->xTriggerLevelBytes, + pxStreamBuffer->ucFlags ); + xReturn = pdPASS; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } + #endif + + traceSTREAM_BUFFER_RESET( xStreamBuffer ); + } + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + + configASSERT( pxStreamBuffer ); + + /* It is not valid for the trigger level to be 0. */ + if( xTriggerLevel == ( size_t ) 0 ) + { + xTriggerLevel = ( size_t ) 1; + } + + /* The trigger level is the number of bytes that must be in the stream + * buffer before a task that is waiting for data is unblocked. */ + if( xTriggerLevel < pxStreamBuffer->xLength ) + { + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevel; + xReturn = pdPASS; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) +{ + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xSpace; + size_t xOriginalTail; + + configASSERT( pxStreamBuffer ); + + /* The code below reads xTail and then xHead. This is safe if the stream + * buffer is updated once between the two reads - but not if the stream buffer + * is updated more than once between the two reads - hence the loop. */ + do + { + xOriginalTail = pxStreamBuffer->xTail; + xSpace = pxStreamBuffer->xLength + pxStreamBuffer->xTail; + xSpace -= pxStreamBuffer->xHead; + } while( xOriginalTail != pxStreamBuffer->xTail ); + + xSpace -= ( size_t ) 1; + + if( xSpace >= pxStreamBuffer->xLength ) + { + xSpace -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xSpace; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) +{ + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn; + + configASSERT( pxStreamBuffer ); + + xReturn = prvBytesInBuffer( pxStreamBuffer ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xSpace = 0; + size_t xRequiredSpace = xDataLengthBytes; + TimeOut_t xTimeOut; + size_t xMaxReportedSpace = 0; + + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); + + /* The maximum amount of space a stream buffer will ever report is its length + * minus 1. */ + xMaxReportedSpace = pxStreamBuffer->xLength - ( size_t ) 1; + + /* This send function is used to write to both message buffers and stream + * buffers. If this is a message buffer then the space needed must be + * increased by the amount of bytes needed to store the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + + /* Overflow? */ + configASSERT( xRequiredSpace > xDataLengthBytes ); + + /* If this is a message buffer then it must be possible to write the + * whole message. */ + if( xRequiredSpace > xMaxReportedSpace ) + { + /* The message would not fit even if the entire buffer was empty, + * so don't wait for space. */ + xTicksToWait = ( TickType_t ) 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If this is a stream buffer then it is acceptable to write only part + * of the message to the buffer. Cap the length to the total length of + * the buffer. */ + if( xRequiredSpace > xMaxReportedSpace ) + { + xRequiredSpace = xMaxReportedSpace; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xTicksToWait != ( TickType_t ) 0 ) + { + vTaskSetTimeOutState( &xTimeOut ); + + do + { + /* Wait until the required number of bytes are free in the message + * buffer. */ + taskENTER_CRITICAL(); + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + + if( xSpace < xRequiredSpace ) + { + /* Clear notification state as going to wait for space. */ + ( void ) xTaskNotifyStateClear( NULL ); + + /* Should only be one writer. */ + configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL ); + pxStreamBuffer->xTaskWaitingToSend = xTaskGetCurrentTaskHandle(); + } + else + { + taskEXIT_CRITICAL(); + break; + } + } + taskEXIT_CRITICAL(); + + traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToSend = NULL; + } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xSpace == ( size_t ) 0 ) + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + + if( xReturn > ( size_t ) 0 ) + { + traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ); + + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + sbSEND_COMPLETED( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xSpace; + size_t xRequiredSpace = xDataLengthBytes; + + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); + + /* This send function is used to write to both message buffers and stream + * buffers. If this is a message buffer then the space needed must be + * increased by the amount of bytes needed to store the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + + if( xReturn > ( size_t ) 0 ) + { + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) +{ + size_t xNextHead = pxStreamBuffer->xHead; + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + /* This is a message buffer, as opposed to a stream buffer. */ + + if( xSpace >= xRequiredSpace ) + { + /* There is enough space to write both the message length and the message + * itself into the buffer. Start by writing the length of the data, the data + * itself will be written later in this function. */ + xNextHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xDataLengthBytes ), sbBYTES_TO_STORE_MESSAGE_LENGTH, xNextHead ); + } + else + { + /* Not enough space, so do not write data to the buffer. */ + xDataLengthBytes = 0; + } + } + else + { + /* This is a stream buffer, as opposed to a message buffer, so writing a + * stream of bytes rather than discrete messages. Plan to write as many + * bytes as possible. */ + xDataLengthBytes = configMIN( xDataLengthBytes, xSpace ); + } + + if( xDataLengthBytes != ( size_t ) 0 ) + { + /* Write the data to the buffer. */ + pxStreamBuffer->xHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes, xNextHead ); /*lint !e9079 Storage buffer is implemented as uint8_t for ease of sizing, alignment and access. */ + } + + return xDataLengthBytes; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); + + /* This receive function is used by both message buffers, which store + * discrete messages, and stream buffers, which store a continuous stream of + * bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + if( xTicksToWait != ( TickType_t ) 0 ) + { + /* Checking if there is data and clearing the notification state must be + * performed atomically. */ + taskENTER_CRITICAL(); + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + /* If this function was invoked by a message buffer read then + * xBytesToStoreMessageLength holds the number of bytes used to hold + * the length of the next discrete message. If this function was + * invoked by a stream buffer read then xBytesToStoreMessageLength will + * be 0. */ + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Clear notification state as going to wait for data. */ + ( void ) xTaskNotifyStateClear( NULL ); + + /* Should only be one reader. */ + configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL ); + pxStreamBuffer->xTaskWaitingToReceive = xTaskGetCurrentTaskHandle(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Wait for data to be available. */ + traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToReceive = NULL; + + /* Recheck the data available after blocking. */ + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } + + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + * holds the number of bytes used to store the message length) or a stream of + * bytes (where xBytesToStoreMessageLength is zero), the number of bytes + * available must be greater than xBytesToStoreMessageLength to be able to + * read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable ); + + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ); + sbRECEIVE_COMPLETED( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ); + mtCOVERAGE_TEST_MARKER(); + } + + return xReceivedLength; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xBytesAvailable; + configMESSAGE_BUFFER_LENGTH_TYPE xTempReturn; + + configASSERT( pxStreamBuffer ); + + /* Ensure the stream buffer is being used as a message buffer. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + if( xBytesAvailable > sbBYTES_TO_STORE_MESSAGE_LENGTH ) + { + /* The number of bytes available is greater than the number of bytes + * required to hold the length of the next message, so another message + * is available. */ + ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempReturn, sbBYTES_TO_STORE_MESSAGE_LENGTH, pxStreamBuffer->xTail ); + xReturn = ( size_t ) xTempReturn; + } + else + { + /* The minimum amount of bytes in a message buffer is + * ( sbBYTES_TO_STORE_MESSAGE_LENGTH + 1 ), so if xBytesAvailable is + * less than sbBYTES_TO_STORE_MESSAGE_LENGTH the only other valid + * value is 0. */ + configASSERT( xBytesAvailable == 0 ); + xReturn = 0; + } + } + else + { + xReturn = 0; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); + + /* This receive function is used by both message buffers, which store + * discrete messages, and stream buffers, which store a continuous stream of + * bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + * holds the number of bytes used to store the message length) or a stream of + * bytes (where xBytesToStoreMessageLength is zero), the number of bytes + * available must be greater than xBytesToStoreMessageLength to be able to + * read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable ); + + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ); + + return xReceivedLength; +} +/*-----------------------------------------------------------*/ + +static size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable ) +{ + size_t xCount, xNextMessageLength; + configMESSAGE_BUFFER_LENGTH_TYPE xTempNextMessageLength; + size_t xNextTail = pxStreamBuffer->xTail; + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + /* A discrete message is being received. First receive the length + * of the message. */ + xNextTail = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempNextMessageLength, sbBYTES_TO_STORE_MESSAGE_LENGTH, xNextTail ); + xNextMessageLength = ( size_t ) xTempNextMessageLength; + + /* Reduce the number of bytes available by the number of bytes just + * read out. */ + xBytesAvailable -= sbBYTES_TO_STORE_MESSAGE_LENGTH; + + /* Check there is enough space in the buffer provided by the + * user. */ + if( xNextMessageLength > xBufferLengthBytes ) + { + /* The user has provided insufficient space to read the message. */ + xNextMessageLength = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* A stream of bytes is being received (as opposed to a discrete + * message), so read as many bytes as possible. */ + xNextMessageLength = xBufferLengthBytes; + } + + /* Use the minimum of the wanted bytes and the available bytes. */ + xCount = configMIN( xNextMessageLength, xBytesAvailable ); + + if( xCount != ( size_t ) 0 ) + { + /* Read the actual data and update the tail to mark the data as officially consumed. */ + pxStreamBuffer->xTail = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) pvRxData, xCount, xNextTail ); /*lint !e9079 Data storage area is implemented as uint8_t array for ease of sizing, indexing and alignment. */ + } + + return xCount; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) +{ + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + size_t xTail; + + configASSERT( pxStreamBuffer ); + + /* True if no bytes are available. */ + xTail = pxStreamBuffer->xTail; + + if( pxStreamBuffer->xHead == xTail ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) +{ + BaseType_t xReturn; + size_t xBytesToStoreMessageLength; + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + + configASSERT( pxStreamBuffer ); + + /* This generic version of the receive function is used by both message + * buffers, which store discrete messages, and stream buffers, which store a + * continuous stream of bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + /* True if the available space equals zero. */ + if( xStreamBufferSpacesAvailable( xStreamBuffer ) <= xBytesToStoreMessageLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( pxStreamBuffer ); + + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( pxStreamBuffer ); + + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, + const uint8_t * pucData, + size_t xCount, + size_t xHead ) +{ + size_t xFirstLength; + + configASSERT( xCount > ( size_t ) 0 ); + + /* Calculate the number of bytes that can be added in the first write - + * which may be less than the total number of bytes that need to be added if + * the buffer will wrap back to the beginning. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xHead, xCount ); + + /* Write as many bytes as can be written in the first write. */ + configASSERT( ( xHead + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) ( &( pxStreamBuffer->pucBuffer[ xHead ] ) ), ( const void * ) pucData, xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + + /* If the number of bytes written was less than the number that could be + * written in the first write... */ + if( xCount > xFirstLength ) + { + /* ...then write the remaining bytes to the start of the buffer. */ + configASSERT( ( xCount - xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pxStreamBuffer->pucBuffer, ( const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xHead += xCount; + + if( xHead >= pxStreamBuffer->xLength ) + { + xHead -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xHead; +} +/*-----------------------------------------------------------*/ + +static size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer, + uint8_t * pucData, + size_t xCount, + size_t xTail ) +{ + size_t xFirstLength; + + configASSERT( xCount != ( size_t ) 0 ); + + /* Calculate the number of bytes that can be read - which may be + * less than the number wanted if the data wraps around to the start of + * the buffer. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xTail, xCount ); + + /* Obtain the number of bytes it is possible to obtain in the first + * read. Asserts check bounds of read and write. */ + configASSERT( xFirstLength <= xCount ); + configASSERT( ( xTail + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pucData, ( const void * ) &( pxStreamBuffer->pucBuffer[ xTail ] ), xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + + /* If the total number of wanted bytes is greater than the number + * that could be read in the first read... */ + if( xCount > xFirstLength ) + { + /* ...then read the remaining bytes from the start of the buffer. */ + ( void ) memcpy( ( void * ) &( pucData[ xFirstLength ] ), ( void * ) ( pxStreamBuffer->pucBuffer ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Move the tail pointer to effectively remove the data read from the buffer. */ + xTail += xCount; + + if( xTail >= pxStreamBuffer->xLength ) + { + xTail -= pxStreamBuffer->xLength; + } + + return xTail; +} +/*-----------------------------------------------------------*/ + +static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) +{ +/* Returns the distance between xTail and xHead. */ + size_t xCount; + + xCount = pxStreamBuffer->xLength + pxStreamBuffer->xHead; + xCount -= pxStreamBuffer->xTail; + + if( xCount >= pxStreamBuffer->xLength ) + { + xCount -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCount; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags ) +{ + /* Assert here is deliberately writing to the entire buffer to ensure it can + * be written to without generating exceptions, and is setting the buffer to a + * known value to assist in development/debugging. */ + #if ( configASSERT_DEFINED == 1 ) + { + /* The value written just has to be identifiable when looking at the + * memory. Don't use 0xA5 as that is the stack fill value and could + * result in confusion as to what is actually being observed. */ + const BaseType_t xWriteValue = 0x55; + configASSERT( memset( pucBuffer, ( int ) xWriteValue, xBufferSizeBytes ) == pucBuffer ); + } /*lint !e529 !e438 xWriteValue is only used if configASSERT() is defined. */ + #endif + + ( void ) memset( ( void * ) pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); /*lint !e9087 memset() requires void *. */ + pxStreamBuffer->pucBuffer = pucBuffer; + pxStreamBuffer->xLength = xBufferSizeBytes; + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevelBytes; + pxStreamBuffer->ucFlags = ucFlags; +} + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) + { + return xStreamBuffer->uxStreamBufferNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, + UBaseType_t uxStreamBufferNumber ) + { + xStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) + { + return( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ); + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/tasks.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/tasks.c new file mode 100644 index 000000000..6bd84ce7b --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/tasks.c @@ -0,0 +1,5442 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "stack_macros.h" + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + +/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting + * functions but without including stdio.h here. */ +#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) + +/* At the bottom of this file are two optional functions that can be used + * to generate human readable text from the raw data generated by the + * uxTaskGetSystemState() function. Note the formatting functions are provided + * for convenience only, and are NOT considered part of the kernel. */ + #include +#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ + +#if ( configUSE_PREEMPTION == 0 ) + +/* If the cooperative scheduler is being used then a yield should not be + * performed just because a higher priority task has been woken. */ + #define taskYIELD_IF_USING_PREEMPTION() +#else + #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* Values that can be assigned to the ucNotifyState member of the TCB. */ +#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* Must be zero as it is the initialised value. */ +#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) +#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) + +/* + * The value used to fill the stack of a task when the task is created. This + * is used purely for checking the high water mark for tasks. + */ +#define tskSTACK_FILL_BYTE ( 0xa5U ) + +/* Bits used to record how a task's stack and TCB were allocated. */ +#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) +#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) +#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) + +/* If any of the following are set then task stacks are filled with a known + * value so the high water mark can be determined. If none of the following are + * set then don't fill the stack so there is no unnecessary dependency on memset. */ +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 1 +#else + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 0 +#endif + +/* + * Macros used by vListTask to indicate which state a task is in. + */ +#define tskRUNNING_CHAR ( 'X' ) +#define tskBLOCKED_CHAR ( 'B' ) +#define tskREADY_CHAR ( 'R' ) +#define tskDELETED_CHAR ( 'D' ) +#define tskSUSPENDED_CHAR ( 'S' ) + +/* + * Some kernel aware debuggers require the data the debugger needs access to to + * be global, rather than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + +/* The name allocated to the Idle task. This can be overridden by defining + * configIDLE_TASK_NAME in FreeRTOSConfig.h. */ +#ifndef configIDLE_TASK_NAME + #define configIDLE_TASK_NAME "IDLE" +#endif + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + +/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is + * performed in a generic way that is not optimised to any particular + * microcontroller architecture. */ + +/* uxTopReadyPriority holds the priority of the highest priority ready + * state task. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) \ + { \ + if( ( uxPriority ) > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( uxPriority ); \ + } \ + } /* taskRECORD_READY_PRIORITY */ + +/*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority = uxTopReadyPriority; \ + \ + /* Find the highest priority queue that contains ready tasks. */ \ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \ + { \ + configASSERT( uxTopPriority ); \ + --uxTopPriority; \ + } \ + \ + /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ + * the same priority get an equal share of the processor time. */ \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + uxTopReadyPriority = uxTopPriority; \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK */ + +/*-----------------------------------------------------------*/ + +/* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as + * they are only required when a port optimised method of task selection is + * being used. */ + #define taskRESET_READY_PRIORITY( uxPriority ) + #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + +#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is + * performed in a way that is tailored to the particular microcontroller + * architecture being used. */ + +/* A port optimised version is provided. Call the port defined macros. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + +/*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority; \ + \ + /* Find the highest priority list that contains ready tasks. */ \ + portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ + configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ + +/*-----------------------------------------------------------*/ + +/* A port optimised version is provided, call it only if the TCB being reset + * is being referenced from a ready list. If it is referenced from a delayed + * or suspended list then it won't be in a ready list. */ + #define taskRESET_READY_PRIORITY( uxPriority ) \ + { \ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ + { \ + portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ + } \ + } + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick + * count overflows. */ +#define taskSWITCH_DELAYED_LISTS() \ + { \ + List_t * pxTemp; \ + \ + /* The delayed tasks list should be empty when the lists are switched. */ \ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ + \ + pxTemp = pxDelayedTaskList; \ + pxDelayedTaskList = pxOverflowDelayedTaskList; \ + pxOverflowDelayedTaskList = pxTemp; \ + xNumOfOverflows++; \ + prvResetNextTaskUnblockTime(); \ + } + +/*-----------------------------------------------------------*/ + +/* + * Place the task represented by pxTCB into the appropriate ready list for + * the task. It is inserted at the end of the list. + */ +#define prvAddTaskToReadyList( pxTCB ) \ + traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + listINSERT_END( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ + tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +/*-----------------------------------------------------------*/ + +/* + * Several functions take a TaskHandle_t parameter that can optionally be NULL, + * where NULL is used to indicate that the handle of the currently executing + * task should be used in place of the parameter. This macro simply checks to + * see if the parameter is NULL and returns a pointer to the appropriate TCB. + */ +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) ) + +/* The item value of the event list item is normally used to hold the priority + * of the task to which it belongs (coded to allow it to be held in reverse + * priority order). However, it is occasionally borrowed for other purposes. It + * is important its value is not updated due to a task priority change while it is + * being used for another purpose. The following bit definition is used to inform + * the scheduler that the value should not be changed - in which case it is the + * responsibility of whichever module is using the value to ensure it gets set back + * to its original value when it is released. */ +#if ( configUSE_16_BIT_TICKS == 1 ) + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U +#else + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL +#endif + +/* + * Task control block. A task control block (TCB) is allocated for each task, + * and stores task state information, including a pointer to the task's context + * (the task's run time environment, including register values) + */ +typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +{ + volatile StackType_t * pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif + + ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + StackType_t * pxStack; /*< Points to the start of the stack. */ + char pcTaskName[ configMAX_TASK_NAME_LEN ]; /*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + StackType_t * pxEndOfStack; /*< Points to the highest valid address for the stack. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + #endif + + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t pxTaskTag; + #endif + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + + /* Allocate a Newlib reent structure that is specific to this task. + * Note Newlib support has been included by popular demand, but is not + * used by the FreeRTOS maintainers themselves. FreeRTOS is not + * responsible for resulting newlib operation. User must be familiar with + * newlib and must provide system-wide implementations of the necessary + * stubs. Be warned that (at the time of writing) the current newlib design + * implements a system-wide malloc() that must be provided with locks. + * + * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + * for additional information. */ + struct _reent xNewLib_reent; + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + volatile uint8_t ucNotifyState[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + #endif + + /* See the comments in FreeRTOS.h with the definition of + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDelayAborted; + #endif + + #if ( configUSE_POSIX_ERRNO == 1 ) + int iTaskErrno; + #endif +} tskTCB; + +/* The old tskTCB name is maintained above then typedefed to the new TCB_t name + * below to enable the use of older kernel aware debuggers. */ +typedef tskTCB TCB_t; + +/*lint -save -e956 A manual analysis and inspection has been used to determine + * which static variables must be declared volatile. */ +PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL; + +/* Lists for ready and blocked tasks. -------------------- + * xDelayedTaskList1 and xDelayedTaskList2 could be moved to function scope but + * doing so breaks some kernel aware debuggers and debuggers that rely on removing + * the static qualifier. */ +PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ + +#if ( INCLUDE_vTaskDelete == 1 ) + + PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */ + PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U; + +#endif + +#if ( INCLUDE_vTaskSuspend == 1 ) + + PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */ + +#endif + +/* Global POSIX errno. Its value is changed upon context switching to match + * the errno of the currently running task. */ +#if ( configUSE_POSIX_ERRNO == 1 ) + int FreeRTOS_errno = 0; +#endif + +/* Other file private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; +PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile TickType_t xPendedTicks = ( TickType_t ) 0U; +PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE; +PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; +PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ +PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ + +/* Improve support for OpenOCD. The kernel tracks Ready tasks via priority lists. + * For tracking the state of remote threads, OpenOCD uses uxTopUsedPriority + * to determine the number of priority lists to read back from the remote target. */ +const volatile UBaseType_t uxTopUsedPriority = configMAX_PRIORITIES - 1U; + +/* Context switches are held pending while the scheduler is suspended. Also, + * interrupts must not manipulate the xStateListItem of a TCB, or any of the + * lists the xStateListItem can be referenced from, if the scheduler is suspended. + * If an interrupt needs to unblock a task while the scheduler is suspended then it + * moves the task's event list item into the xPendingReadyList, ready for the + * kernel to move the task from the pending ready list into the real ready list + * when the scheduler is unsuspended. The pending ready list itself can only be + * accessed from a critical section. */ +PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE; + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + +/* Do not move these variables to function scope as doing so prevents the + * code working with debuggers that need to remove the static qualifier. */ + PRIVILEGED_DATA static configRUN_TIME_COUNTER_TYPE ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ + PRIVILEGED_DATA static volatile configRUN_TIME_COUNTER_TYPE ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ + +#endif + +/*lint -restore */ + +/*-----------------------------------------------------------*/ + +/* File private functions. --------------------------------*/ + +/** + * Utility task that simply returns pdTRUE if the task referenced by xTask is + * currently in the Suspended state, or pdFALSE if the task referenced by xTask + * is in any other state. + */ +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +#endif /* INCLUDE_vTaskSuspend */ + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first task. + */ +static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; + +/* + * The idle task, which as all tasks is implemented as a never ending loop. + * The idle task is automatically created and added to the ready lists upon + * creation of the first user task. + * + * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Utility to free all memory allocated by the scheduler to hold a TCB, + * including the stack pointed to by the TCB. + * + * This does not free memory allocated by the task itself (i.e. memory + * allocated by calls to pvPortMalloc from within the tasks application code). + */ +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t * pxTCB ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Used only by the idle task. This checks to see if anything has been placed + * in the list of tasks waiting to be deleted. If so the task is cleaned up + * and its TCB deleted. + */ +static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; + +/* + * The currently executing task is entering the Blocked state. Add the task to + * either the current or the overflow delayed task list. + */ +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, + const BaseType_t xCanBlockIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * Fills an TaskStatus_t structure with information on each task that is + * referenced from the pxList list (which may be a ready list, a delayed list, + * a suspended list, etc.). + * + * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM + * NORMAL APPLICATION CODE. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t * pxTaskStatusArray, + List_t * pxList, + eTaskState eState ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Searches pxList for a task with name pcNameToQuery - returning a handle to + * the task if it is found, or NULL if the task is not found. + */ +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList, + const char pcNameToQuery[] ) PRIVILEGED_FUNCTION; + +#endif + +/* + * When a task is created, the stack of the task is filled with a known value. + * This function determines the 'high water mark' of the task stack by + * determining how much of the stack remains at the original preset value. + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Return the amount of time, in ticks, that will pass before the kernel will + * next move a task from the Blocked state to the Running state. + * + * This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user + * defined low power mode implementations require configUSE_TICKLESS_IDLE to be + * set to a value other than 1. + */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Set xNextTaskUnblockTime to the time at which the next Blocked state task + * will exit the Blocked state. + */ +static void prvResetNextTaskUnblockTime( void ) PRIVILEGED_FUNCTION; + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + +/* + * Helper function used to pad task names with spaces when printing out + * human readable tables of task information. + */ + static char * prvWriteNameToBuffer( char * pcBuffer, + const char * pcTaskName ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Called after a Task_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t * pxNewTCB, + const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION; + +/* + * Called after a new task has been created and initialised to place the task + * under the control of the scheduler. + */ +static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) PRIVILEGED_FUNCTION; + +/* + * freertos_tasks_c_additions_init() should only be called if the user definable + * macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is the only macro + * called by the function. + */ +#ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + + static void freertos_tasks_c_additions_init( void ) PRIVILEGED_FUNCTION; + +#endif + +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) + { + TCB_t * pxNewTCB; + TaskHandle_t xReturn; + + configASSERT( puxStackBuffer != NULL ); + configASSERT( pxTaskBuffer != NULL ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticTask_t equals the size of the real task + * structure. */ + volatile size_t xSize = sizeof( StaticTask_t ); + configASSERT( xSize == sizeof( TCB_t ) ); + ( void ) xSize; /* Prevent lint warning when configASSERT() is not used. */ + } + #endif /* configASSERT_DEFINED */ + + if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) ) + { + /* The memory used for the task's TCB and stack are passed into this + * function - use them. */ + pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer; + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + * task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + } + else + { + xReturn = NULL; + } + + return xReturn; + } + +#endif /* SUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + + configASSERT( pxTaskDefinition->puxStackBuffer != NULL ); + configASSERT( pxTaskDefinition->pxTaskBuffer != NULL ); + + if( ( pxTaskDefinition->puxStackBuffer != NULL ) && ( pxTaskDefinition->pxTaskBuffer != NULL ) ) + { + /* Allocate space for the TCB. Where the memory comes from depends + * on the implementation of the port malloc function and whether or + * not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pxTaskDefinition->pxTaskBuffer; + + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + * task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + + return xReturn; + } + +#endif /* ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + + configASSERT( pxTaskDefinition->puxStackBuffer ); + + if( pxTaskDefinition->puxStackBuffer != NULL ) + { + /* Allocate space for the TCB. Where the memory comes from depends + * on the implementation of the port malloc function and whether or + * not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note + * this task had a statically allocated stack in case it is + * later deleted. The TCB was allocated dynamically. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + } + + return xReturn; + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn; + + /* If the stack grows down then allocate the stack then the TCB so the stack + * does not grow into the TCB. Likewise if the stack grows up then allocate + * the TCB then the stack. */ + #if ( portSTACK_GROWTH > 0 ) + { + /* Allocate space for the TCB. Where the memory comes from depends on + * the implementation of the port malloc function and whether or not static + * allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + /* Allocate space for the stack used by the task being created. + * The base of the stack memory stored in the TCB so the task can + * be deleted later if required. */ + pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + } + } + #else /* portSTACK_GROWTH */ + { + StackType_t * pxStack; + + /* Allocate space for the stack used by the task being created. */ + pxStack = pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ + + if( pxStack != NULL ) + { + /* Allocate space for the TCB. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */ + + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxStack; + } + else + { + /* The stack cannot be used as the TCB was not created. Free + * it again. */ + vPortFreeStack( pxStack ); + } + } + else + { + pxNewTCB = NULL; + } + } + #endif /* portSTACK_GROWTH */ + + if( pxNewTCB != NULL ) + { + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + * task was created dynamically in case it is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t * pxNewTCB, + const MemoryRegion_t * const xRegions ) +{ + StackType_t * pxTopOfStack; + UBaseType_t x; + + #if ( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + BaseType_t xRunPrivileged; + + if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ + + /* Avoid dependency on memset() if it is not required. */ + #if ( tskSET_NEW_STACKS_TO_KNOWN_VALUE == 1 ) + { + /* Fill the stack with a known value to assist debugging. */ + ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) ); + } + #endif /* tskSET_NEW_STACKS_TO_KNOWN_VALUE */ + + /* Calculate the top of stack address. This depends on whether the stack + * grows from high memory to low (as per the 80x86) or vice versa. + * portSTACK_GROWTH is used to make the result positive or negative as required + * by the port. */ + #if ( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] ); + pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */ + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + #if ( configRECORD_STACK_HIGH_ADDRESS == 1 ) + { + /* Also record the stack's high address, which may assist + * debugging. */ + pxNewTCB->pxEndOfStack = pxTopOfStack; + } + #endif /* configRECORD_STACK_HIGH_ADDRESS */ + } + #else /* portSTACK_GROWTH */ + { + pxTopOfStack = pxNewTCB->pxStack; + + /* Check the alignment of the stack buffer is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxNewTCB->pxStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + /* The other extreme of the stack space is required if stack checking is + * performed. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + } + #endif /* portSTACK_GROWTH */ + + /* Store the task name in the TCB. */ + if( pcName != NULL ) + { + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + pxNewTCB->pcTaskName[ x ] = pcName[ x ]; + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + * configMAX_TASK_NAME_LEN characters just in case the memory after the + * string is not accessible (extremely unlikely). */ + if( pcName[ x ] == ( char ) 0x00 ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Ensure the name string is terminated in the case that the string length + * was greater or equal to configMAX_TASK_NAME_LEN. */ + pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; + } + else + { + /* The task has not been given a name, so just ensure there is a NULL + * terminator when it is read out. */ + pxNewTCB->pcTaskName[ 0 ] = 0x00; + } + + /* This is used as an array index so must ensure it's not too large. */ + configASSERT( uxPriority < configMAX_PRIORITIES ); + + if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxNewTCB->uxPriority = uxPriority; + #if ( configUSE_MUTEXES == 1 ) + { + pxNewTCB->uxBasePriority = uxPriority; + pxNewTCB->uxMutexesHeld = 0; + } + #endif /* configUSE_MUTEXES */ + + vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); + vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); + + /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get + * back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + { + pxNewTCB->uxCriticalNesting = ( UBaseType_t ) 0U; + } + #endif /* portCRITICAL_NESTING_IN_TCB */ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + { + pxNewTCB->pxTaskTag = NULL; + } + #endif /* configUSE_APPLICATION_TASK_TAG */ + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxNewTCB->ulRunTimeCounter = ( configRUN_TIME_COUNTER_TYPE ) 0; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth ); + } + #else + { + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) xRegions; + } + #endif + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + { + memset( ( void * ) &( pxNewTCB->pvThreadLocalStoragePointers[ 0 ] ), 0x00, sizeof( pxNewTCB->pvThreadLocalStoragePointers ) ); + } + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + memset( ( void * ) &( pxNewTCB->ulNotifiedValue[ 0 ] ), 0x00, sizeof( pxNewTCB->ulNotifiedValue ) ); + memset( ( void * ) &( pxNewTCB->ucNotifyState[ 0 ] ), 0x00, sizeof( pxNewTCB->ucNotifyState ) ); + } + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Initialise this task's Newlib reent structure. + * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + * for additional information. */ + _REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) ); + } + #endif + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + { + pxNewTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Initialize the TCB stack to look as if the task was already running, + * but had been interrupted by the scheduler. The return address is set + * to the start of the task function. Once the stack has been initialised + * the top of stack variable is updated. */ + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + /* If the port has capability to detect stack overflow, + * pass the stack end address to the stack initialization + * function as well. */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if ( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #else /* portUSING_MPU_WRAPPERS */ + { + /* If the port has capability to detect stack overflow, + * pass the stack end address to the stack initialization + * function as well. */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if ( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #endif /* portUSING_MPU_WRAPPERS */ + + if( pxCreatedTask != NULL ) + { + /* Pass the handle out in an anonymous way. The handle can be used to + * change the created task's priority, delete the created task, etc.*/ + *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) +{ + /* Ensure interrupts don't access the task lists while the lists are being + * updated. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + + if( pxCurrentTCB == NULL ) + { + /* There are no other tasks, or all the other tasks are in + * the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) + { + /* This is the first task to be created so do the preliminary + * initialisation required. We will not recover if this call + * fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If the scheduler is not already running, make this task the + * current task if it is the highest priority task to be created + * so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) + { + pxCurrentTCB = pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + uxTaskNumber++; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); + + prvAddTaskToReadyList( pxNewTCB ); + + portSETUP_TCB( pxNewTCB ); + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + * then it should run now. */ + if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + void vTaskDelete( TaskHandle_t xTaskToDelete ) + { + TCB_t * pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the calling task that is + * being deleted. */ + pxTCB = prvGetTCBFromHandle( xTaskToDelete ); + + /* Remove task from the ready/delayed list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Increment the uxTaskNumber also so kernel aware debuggers can + * detect that the task lists need re-generating. This is done before + * portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will + * not return. */ + uxTaskNumber++; + + if( pxTCB == pxCurrentTCB ) + { + /* A task is deleting itself. This cannot complete within the + * task itself, as a context switch to another task is required. + * Place the task in the termination list. The idle task will + * check the termination list and free up any memory allocated by + * the scheduler for the TCB and stack of the deleted task. */ + vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) ); + + /* Increment the ucTasksDeleted variable so the idle task knows + * there is a task that has been deleted and that it should therefore + * check the xTasksWaitingTermination list. */ + ++uxDeletedTasksWaitingCleanUp; + + /* Call the delete hook before portPRE_TASK_DELETE_HOOK() as + * portPRE_TASK_DELETE_HOOK() does not return in the Win32 port. */ + traceTASK_DELETE( pxTCB ); + + /* The pre-delete hook is primarily for the Windows simulator, + * in which Windows specific clean up operations are performed, + * after which it is not possible to yield away from this task - + * hence xYieldPending is used to latch that a context switch is + * required. */ + portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending ); + } + else + { + --uxCurrentNumberOfTasks; + traceTASK_DELETE( pxTCB ); + + /* Reset the next expected unblock time in case it referred to + * the task that has just been deleted. */ + prvResetNextTaskUnblockTime(); + } + } + taskEXIT_CRITICAL(); + + /* If the task is not deleting itself, call prvDeleteTCB from outside of + * critical section. If a task deletes itself, prvDeleteTCB is called + * from prvCheckTasksWaitingTermination which is called from Idle task. */ + if( pxTCB != pxCurrentTCB ) + { + prvDeleteTCB( pxTCB ); + } + + /* Force a reschedule if it is the currently running task that has just + * been deleted. */ + if( xSchedulerRunning != pdFALSE ) + { + if( pxTCB == pxCurrentTCB ) + { + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskDelayUntil == 1 ) + + BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) + { + TickType_t xTimeToWake; + BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE; + + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0U ) ); + configASSERT( uxSchedulerSuspended == 0 ); + + vTaskSuspendAll(); + { + /* Minor optimisation. The tick count cannot change in this + * block. */ + const TickType_t xConstTickCount = xTickCount; + + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + + if( xConstTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + * lasted called. In this case the only time we should ever + * actually delay is if the wake time has also overflowed, + * and the wake time is greater than the tick time. When this + * is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The tick time has not overflowed. In this case we will + * delay if either the wake time has overflowed, and/or the + * tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; + + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL( xTimeToWake ); + + /* prvAddCurrentTaskToDelayedList() needs the block time, not + * the time to wake, so subtract the current tick count. */ + prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount, pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + xAlreadyYielded = xTaskResumeAll(); + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + * have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xShouldDelay; + } + +#endif /* INCLUDE_xTaskDelayUntil */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( const TickType_t xTicksToDelay ) + { + BaseType_t xAlreadyYielded = pdFALSE; + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( TickType_t ) 0U ) + { + configASSERT( uxSchedulerSuspended == 0 ); + vTaskSuspendAll(); + { + traceTASK_DELAY(); + + /* A task that is removed from the event list while the + * scheduler is suspended will not get placed in the ready + * list or removed from the blocked list until the scheduler + * is resumed. + * + * This task cannot be in an event list as it is the currently + * executing task. */ + prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); + } + xAlreadyYielded = xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + * have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskDelay */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) ) + + eTaskState eTaskGetState( TaskHandle_t xTask ) + { + eTaskState eReturn; + List_t const * pxStateList, * pxDelayedList, * pxOverflowedDelayedList; + const TCB_t * const pxTCB = xTask; + + configASSERT( pxTCB ); + + if( pxTCB == pxCurrentTCB ) + { + /* The task calling this function is querying its own state. */ + eReturn = eRunning; + } + else + { + taskENTER_CRITICAL(); + { + pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); + pxDelayedList = pxDelayedTaskList; + pxOverflowedDelayedList = pxOverflowDelayedTaskList; + } + taskEXIT_CRITICAL(); + + if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) ) + { + /* The task being queried is referenced from one of the Blocked + * lists. */ + eReturn = eBlocked; + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( pxStateList == &xSuspendedTaskList ) + { + /* The task being queried is referenced from the suspended + * list. Is it genuinely suspended or is it blocked + * indefinitely? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) + { + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + BaseType_t x; + + /* The task does not appear on the event list item of + * and of the RTOS objects, but could still be in the + * blocked state if it is waiting on its notification + * rather than waiting on an object. If not, is + * suspended. */ + eReturn = eSuspended; + + for( x = 0; x < configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ ) + { + if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION ) + { + eReturn = eBlocked; + break; + } + } + } + #else /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + { + eReturn = eSuspended; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + } + else + { + eReturn = eBlocked; + } + } + #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */ + + #if ( INCLUDE_vTaskDelete == 1 ) + else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) ) + { + /* The task being queried is referenced from the deleted + * tasks list, or it is not referenced from any lists at + * all. */ + eReturn = eDeleted; + } + #endif + + else /*lint !e525 Negative indentation is intended to make use of pre-processor clearer. */ + { + /* If the task is not in any other state, it must be in the + * Ready (including pending ready) state. */ + eReturn = eReady; + } + } + + return eReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_eTaskGetState */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) + { + TCB_t const * pxTCB; + UBaseType_t uxReturn; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the task + * that called uxTaskPriorityGet() that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL(); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) + { + TCB_t const * pxTCB; + UBaseType_t uxReturn, uxSavedInterruptState; + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* If null is passed in here then it is the priority of the calling + * task that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptState ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + + void vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) + { + TCB_t * pxTCB; + UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; + BaseType_t xYieldRequired = pdFALSE; + + configASSERT( uxNewPriority < configMAX_PRIORITIES ); + + /* Ensure the new priority is valid. */ + if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the calling + * task that is being changed. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); + + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentBasePriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentBasePriority = pxTCB->uxPriority; + } + #endif + + if( uxCurrentBasePriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + * priority than the calling task. */ + if( uxNewPriority > uxCurrentBasePriority ) + { + if( pxTCB != pxCurrentTCB ) + { + /* The priority of a task other than the currently + * running task is being raised. Is the priority being + * raised above that of the running task? */ + if( uxNewPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The priority of the running task is being raised, + * but the running task must already be the highest + * priority task able to run so no yield is required. */ + } + } + else if( pxTCB == pxCurrentTCB ) + { + /* Setting the priority of the running task down means + * there may now be another task of higher priority that + * is ready to execute. */ + xYieldRequired = pdTRUE; + } + else + { + /* Setting the priority of any other task down does not + * require a yield as the running task must be above the + * new priority of the task being modified. */ + } + + /* Remember the ready list the task might be referenced from + * before its uxPriority member is changed so the + * taskRESET_READY_PRIORITY() macro can function correctly. */ + uxPriorityUsedOnEntry = pxTCB->uxPriority; + + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + * currently using an inherited priority. */ + if( pxTCB->uxBasePriority == pxTCB->uxPriority ) + { + pxTCB->uxPriority = uxNewPriority; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else /* if ( configUSE_MUTEXES == 1 ) */ + { + pxTCB->uxPriority = uxNewPriority; + } + #endif /* if ( configUSE_MUTEXES == 1 ) */ + + /* Only reset the event list item value if the value is not + * being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task is in the blocked or suspended list we need do + * nothing more than change its priority variable. However, if + * the task is in a ready list it needs to be removed and placed + * in the list appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* The task is currently in its ready list - remove before + * adding it to its new ready list. As we are in a critical + * section we can do this even if the scheduler is suspended. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xYieldRequired != pdFALSE ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Remove compiler warning about unused variables when the port + * optimised task selection is not being used. */ + ( void ) uxPriorityUsedOnEntry; + } + } + taskEXIT_CRITICAL(); + } + +#endif /* INCLUDE_vTaskPrioritySet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskSuspend( TaskHandle_t xTaskToSuspend ) + { + TCB_t * pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the running task that is + * being suspended. */ + pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); + + traceTASK_SUSPEND( pxTCB ); + + /* Remove task from the ready/delayed list and place in the + * suspended list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + BaseType_t x; + + for( x = 0; x < configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ ) + { + if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION ) + { + /* The task was blocked to wait for a notification, but is + * now suspended, so no notification was received. */ + pxTCB->ucNotifyState[ x ] = taskNOT_WAITING_NOTIFICATION; + } + } + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* Reset the next expected unblock time in case it referred to the + * task that is now in the Suspended state. */ + taskENTER_CRITICAL(); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( pxTCB == pxCurrentTCB ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* The current task has just been suspended. */ + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + * to by pxCurrentTCB has just been suspended and pxCurrentTCB + * must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) /*lint !e931 Right has no side effect, just volatile. */ + { + /* No other tasks are ready, so set pxCurrentTCB back to + * NULL so when the next task is created pxCurrentTCB will + * be set to point to it no matter what its relative priority + * is. */ + pxCurrentTCB = NULL; + } + else + { + vTaskSwitchContext(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) + { + BaseType_t xReturn = pdFALSE; + const TCB_t * const pxTCB = xTask; + + /* Accesses xPendingReadyList so must be called from a critical + * section. */ + + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); + + /* Is the task being resumed actually in the suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE ) + { + /* Is it in the suspended list because it is in the Suspended + * state, or because is is blocked with no timeout? */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) /*lint !e961. The cast is only redundant when NULL is used. */ + { + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskResume( TaskHandle_t xTaskToResume ) + { + TCB_t * const pxTCB = xTaskToResume; + + /* It does not make sense to resume the calling task. */ + configASSERT( xTaskToResume ); + + /* The parameter cannot be NULL as it is impossible to resume the + * currently executing task. */ + if( ( pxTCB != pxCurrentTCB ) && ( pxTCB != NULL ) ) + { + taskENTER_CRITICAL(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME( pxTCB ); + + /* The ready list can be accessed even if the scheduler is + * suspended because this is inside a critical section. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* A higher priority task may have just been resumed. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* This yield may not cause the task just resumed to run, + * but will leave the lists in the correct state for the + * next yield. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) + { + BaseType_t xYieldRequired = pdFALSE; + TCB_t * const pxTCB = xTaskToResume; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToResume ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); + + /* Check the ready lists can be accessed. */ + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Ready lists can be accessed so move the task from the + * suspended list to the ready list directly. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + + /* Mark that a yield is pending in case the user is not + * using the return value to initiate a context switch + * from the ISR using portYIELD_FROM_ISR. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed or ready lists cannot be accessed so the task + * is held in the pending ready list until the scheduler is + * unsuspended. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xYieldRequired; + } + +#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ +/*-----------------------------------------------------------*/ + +void vTaskStartScheduler( void ) +{ + BaseType_t xReturn; + + /* Add the idle task at the lowest priority. */ + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t * pxIdleTaskTCBBuffer = NULL; + StackType_t * pxIdleTaskStackBuffer = NULL; + uint32_t ulIdleTaskStackSize; + + /* The Idle task is created using user provided RAM - obtain the + * address of the RAM then create the idle task. */ + vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); + xIdleTaskHandle = xTaskCreateStatic( prvIdleTask, + configIDLE_TASK_NAME, + ulIdleTaskStackSize, + ( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */ + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + pxIdleTaskStackBuffer, + pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + + if( xIdleTaskHandle != NULL ) + { + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + { + /* The Idle task is being created using dynamically allocated RAM. */ + xReturn = xTaskCreate( prvIdleTask, + configIDLE_TASK_NAME, + configMINIMAL_STACK_SIZE, + ( void * ) NULL, + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TIMERS */ + + if( xReturn == pdPASS ) + { + /* freertos_tasks_c_additions_init() should only be called if the user + * definable macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is + * the only macro called by the function. */ + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + { + freertos_tasks_c_additions_init(); + } + #endif + + /* Interrupts are turned off here, to ensure a tick does not occur + * before or during the call to xPortStartScheduler(). The stacks of + * the created tasks contain a status word with interrupts switched on + * so interrupts will automatically get re-enabled when the first task + * starts to run. */ + portDISABLE_INTERRUPTS(); + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + * structure specific to the task that will run first. + * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + * for additional information. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + xNextTaskUnblockTime = portMAX_DELAY; + xSchedulerRunning = pdTRUE; + xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; + + /* If configGENERATE_RUN_TIME_STATS is defined then the following + * macro must be defined to configure the timer/counter used to generate + * the run time counter time base. NOTE: If configGENERATE_RUN_TIME_STATS + * is set to 0 and the following line fails to build then ensure you do not + * have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() defined in your + * FreeRTOSConfig.h file. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + + traceTASK_SWITCHED_IN(); + + /* Setting up the timer tick is hardware specific and thus in the + * portable interface. */ + if( xPortStartScheduler() != pdFALSE ) + { + /* Should not reach here as if the scheduler is running the + * function will not return. */ + } + else + { + /* Should only reach here if a task calls xTaskEndScheduler(). */ + } + } + else + { + /* This line will only be reached if the kernel could not be started, + * because there was not enough FreeRTOS heap to create the idle task + * or the timer task. */ + configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); + } + + /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, + * meaning xIdleTaskHandle is not used anywhere else. */ + ( void ) xIdleTaskHandle; + + /* OpenOCD makes use of uxTopUsedPriority for thread debugging. Prevent uxTopUsedPriority + * from getting optimized out as it is no longer used by the kernel. */ + ( void ) uxTopUsedPriority; +} +/*-----------------------------------------------------------*/ + +void vTaskEndScheduler( void ) +{ + /* Stop the scheduler interrupts and call the portable scheduler end + * routine so the original ISRs can be restored if necessary. The port + * layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + /* A critical section is not required as the variable is of type + * BaseType_t. Please read Richard Barry's reply in the following link to a + * post in the FreeRTOS support forum before reporting this as a bug! - + * https://goo.gl/wu4acr */ + + /* portSOFTWARE_BARRIER() is only implemented for emulated/simulated ports that + * do not otherwise exhibit real time behaviour. */ + portSOFTWARE_BARRIER(); + + /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment + * is used to allow calls to vTaskSuspendAll() to nest. */ + ++uxSchedulerSuspended; + + /* Enforces ordering for ports and optimised compilers that may otherwise place + * the above increment elsewhere. */ + portMEMORY_BARRIER(); +} +/*----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) + { + TickType_t xReturn; + UBaseType_t uxHigherPriorityReadyTasks = pdFALSE; + + /* uxHigherPriorityReadyTasks takes care of the case where + * configUSE_PREEMPTION is 0, so there may be tasks above the idle priority + * task that are in the Ready state, even though the idle task is + * running. */ + #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + { + if( uxTopReadyPriority > tskIDLE_PRIORITY ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #else + { + const UBaseType_t uxLeastSignificantBit = ( UBaseType_t ) 0x01; + + /* When port optimised task selection is used the uxTopReadyPriority + * variable is used as a bit map. If bits other than the least + * significant bit are set then there are tasks that have a priority + * above the idle priority that are in the Ready state. This takes + * care of the case where the co-operative scheduler is in use. */ + if( uxTopReadyPriority > uxLeastSignificantBit ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #endif /* if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) */ + + if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY ) + { + xReturn = 0; + } + else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1 ) + { + /* There are other idle priority tasks in the ready state. If + * time slicing is used then the very next tick interrupt must be + * processed. */ + xReturn = 0; + } + else if( uxHigherPriorityReadyTasks != pdFALSE ) + { + /* There are tasks in the Ready state that have a priority above the + * idle priority. This path can only be reached if + * configUSE_PREEMPTION is 0. */ + xReturn = 0; + } + else + { + xReturn = xNextTaskUnblockTime - xTickCount; + } + + return xReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskResumeAll( void ) +{ + TCB_t * pxTCB = NULL; + BaseType_t xAlreadyYielded = pdFALSE; + + /* If uxSchedulerSuspended is zero then this function does not match a + * previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended ); + + /* It is possible that an ISR caused a task to be removed from an event + * list while the scheduler was suspended. If this was the case then the + * removed task will have been added to the xPendingReadyList. Once the + * scheduler has been resumed it is safe to move all the pending ready + * tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + { + --uxSchedulerSuspended; + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) + { + /* Move any readied tasks from the pending list into the + * appropriate ready list. */ + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) + { + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + listREMOVE_ITEM( &( pxTCB->xEventListItem ) ); + portMEMORY_BARRIER(); + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* If the moved task has a priority higher than or equal to + * the current task then a yield must be performed. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( pxTCB != NULL ) + { + /* A task was unblocked while the scheduler was suspended, + * which may have prevented the next unblock time from being + * re-calculated, in which case re-calculate it now. Mainly + * important for low power tickless implementations, where + * this can prevent an unnecessary exit from low power + * state. */ + prvResetNextTaskUnblockTime(); + } + + /* If any ticks occurred while the scheduler was suspended then + * they should be processed now. This ensures the tick count does + * not slip, and that any delayed tasks are resumed at the correct + * time. */ + { + TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */ + + if( xPendedCounts > ( TickType_t ) 0U ) + { + do + { + if( xTaskIncrementTick() != pdFALSE ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --xPendedCounts; + } while( xPendedCounts > ( TickType_t ) 0U ); + + xPendedTicks = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xYieldPending != pdFALSE ) + { + #if ( configUSE_PREEMPTION != 0 ) + { + xAlreadyYielded = pdTRUE; + } + #endif + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xAlreadyYielded; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCount( void ) +{ + TickType_t xTicks; + + /* Critical section required if running on a 16 bit processor. */ + portTICK_TYPE_ENTER_CRITICAL(); + { + xTicks = xTickCount; + } + portTICK_TYPE_EXIT_CRITICAL(); + + return xTicks; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCountFromISR( void ) +{ + TickType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = xTickCount; + } + portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxTaskGetNumberOfTasks( void ) +{ + /* A critical section is not required because the variables are of type + * BaseType_t. */ + return uxCurrentNumberOfTasks; +} +/*-----------------------------------------------------------*/ + +char * pcTaskGetName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ + TCB_t * pxTCB; + + /* If null is passed in here then the name of the calling task is being + * queried. */ + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + configASSERT( pxTCB ); + return &( pxTCB->pcTaskName[ 0 ] ); +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList, + const char pcNameToQuery[] ) + { + TCB_t * pxNextTCB, * pxFirstTCB, * pxReturn = NULL; + UBaseType_t x; + char cNextChar; + BaseType_t xBreakLoop; + + /* This function is called with the scheduler suspended. */ + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + /* Check each character in the name looking for a match or + * mismatch. */ + xBreakLoop = pdFALSE; + + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + cNextChar = pxNextTCB->pcTaskName[ x ]; + + if( cNextChar != pcNameToQuery[ x ] ) + { + /* Characters didn't match. */ + xBreakLoop = pdTRUE; + } + else if( cNextChar == ( char ) 0x00 ) + { + /* Both strings terminated, a match must have been + * found. */ + pxReturn = pxNextTCB; + xBreakLoop = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xBreakLoop != pdFALSE ) + { + break; + } + } + + if( pxReturn != NULL ) + { + /* The handle has been found. */ + break; + } + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return pxReturn; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t uxQueue = configMAX_PRIORITIES; + TCB_t * pxTCB; + + /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */ + configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN ); + + vTaskSuspendAll(); + { + /* Search the ready lists. */ + do + { + uxQueue--; + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery ); + + if( pxTCB != NULL ) + { + /* Found the handle. */ + break; + } + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Search the delayed lists. */ + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery ); + } + + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery ); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the suspended list. */ + pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery ); + } + } + #endif + + #if ( INCLUDE_vTaskDelete == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the deleted list. */ + pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery ); + } + } + #endif + } + ( void ) xTaskResumeAll(); + + return pxTCB; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) + { + UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; + + vTaskSuspendAll(); + { + /* Is there a space in the array for each task in the system? */ + if( uxArraySize >= uxCurrentNumberOfTasks ) + { + /* Fill in an TaskStatus_t structure with information on each + * task in the Ready state. */ + do + { + uxQueue--; + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Fill in an TaskStatus_t structure with information on each + * task in the Blocked state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ); + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + * each task that has been deleted but not yet cleaned up. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + * each task in the Suspended state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + if( pulTotalRunTime != NULL ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); + #else + *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + } + } + #else /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ + { + if( pulTotalRunTime != NULL ) + { + *pulTotalRunTime = 0; + } + } + #endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + + TaskHandle_t xTaskGetIdleTaskHandle( void ) + { + /* If xTaskGetIdleTaskHandle() is called before the scheduler has been + * started, then xIdleTaskHandle will be NULL. */ + configASSERT( ( xIdleTaskHandle != NULL ) ); + return xIdleTaskHandle; + } + +#endif /* INCLUDE_xTaskGetIdleTaskHandle */ +/*----------------------------------------------------------*/ + +/* This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure vTaskStepTick() is available when user defined low power mode + * implementations require configUSE_TICKLESS_IDLE to be set to a value other than + * 1. */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + void vTaskStepTick( const TickType_t xTicksToJump ) + { + /* Correct the tick count value after a period during which the tick + * was suppressed. Note this does *not* call the tick hook function for + * each stepped tick. */ + configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); + xTickCount += xTicksToJump; + traceINCREASE_TICK_COUNT( xTicksToJump ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) +{ + BaseType_t xYieldOccurred; + + /* Must not be called with the scheduler suspended as the implementation + * relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */ + configASSERT( uxSchedulerSuspended == 0 ); + + /* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occurring when + * the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */ + vTaskSuspendAll(); + xPendedTicks += xTicksToCatchUp; + xYieldOccurred = xTaskResumeAll(); + + return xYieldOccurred; +} +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskAbortDelay == 1 ) + + BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) + { + TCB_t * pxTCB = xTask; + BaseType_t xReturn; + + configASSERT( pxTCB ); + + vTaskSuspendAll(); + { + /* A task can only be prematurely removed from the Blocked state if + * it is actually in the Blocked state. */ + if( eTaskGetState( xTask ) == eBlocked ) + { + xReturn = pdPASS; + + /* Remove the reference to the task from the blocked list. An + * interrupt won't touch the xStateListItem because the + * scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove it from + * the event list too. Interrupts can touch the event list item, + * even though the scheduler is suspended, so a critical section + * is used. */ + taskENTER_CRITICAL(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + + /* This lets the task know it was forcibly removed from the + * blocked state so it should not re-evaluate its block time and + * then block again. */ + pxTCB->ucDelayAborted = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + /* Place the unblocked task into the appropriate ready list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate context + * switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should only be + * performed if the unblocked task has a priority that is + * higher than the currently executing task. */ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Pend the yield to be performed when the scheduler + * is unsuspended. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + else + { + xReturn = pdFAIL; + } + } + ( void ) xTaskResumeAll(); + + return xReturn; + } + +#endif /* INCLUDE_xTaskAbortDelay */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskIncrementTick( void ) +{ + TCB_t * pxTCB; + TickType_t xItemValue; + BaseType_t xSwitchRequired = pdFALSE; + + /* Called by the portable layer each time a tick interrupt occurs. + * Increments the tick then checks to see if the new tick value will cause any + * tasks to be unblocked. */ + traceTASK_INCREMENT_TICK( xTickCount ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Minor optimisation. The tick count cannot change in this + * block. */ + const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1; + + /* Increment the RTOS tick, switching the delayed and overflowed + * delayed lists if it wraps to 0. */ + xTickCount = xConstTickCount; + + if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */ + { + taskSWITCH_DELAYED_LISTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* See if this tick has made a timeout expire. Tasks are stored in + * the queue in the order of their wake time - meaning once one task + * has been found whose block time has not expired there is no need to + * look any further down the list. */ + if( xConstTickCount >= xNextTaskUnblockTime ) + { + for( ; ; ) + { + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The delayed list is empty. Set xNextTaskUnblockTime + * to the maximum possible value so it is extremely + * unlikely that the + * if( xTickCount >= xNextTaskUnblockTime ) test will pass + * next time through. */ + xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + break; + } + else + { + /* The delayed list is not empty, get the value of the + * item at the head of the delayed list. This is the time + * at which the task at the head of the delayed list must + * be removed from the Blocked state. */ + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); + + if( xConstTickCount < xItemValue ) + { + /* It is not time to unblock this item yet, but the + * item value is the time at which the task at the head + * of the blocked list must be removed from the Blocked + * state - so record the item value in + * xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + break; /*lint !e9011 Code structure here is deemed easier to understand with multiple breaks. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* It is time to remove the item from the Blocked state. */ + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove + * it from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + listREMOVE_ITEM( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Place the unblocked task into the appropriate ready + * list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate + * context switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should + * only be performed if the unblocked task has a + * priority that is equal to or higher than the + * currently executing task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + } + } + + /* Tasks of equal priority to the currently running task will share + * processing time (time slice) if preemption is on, and the application + * writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ + + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the pended tick + * count is being unwound (when the scheduler is being unlocked). */ + if( xPendedTicks == ( TickType_t ) 0 ) + { + vApplicationTickHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICK_HOOK */ + + #if ( configUSE_PREEMPTION == 1 ) + { + if( xYieldPending != pdFALSE ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + else + { + ++xPendedTicks; + + /* The tick hook gets called at regular intervals, even if the + * scheduler is locked. */ + #if ( configUSE_TICK_HOOK == 1 ) + { + vApplicationTickHook(); + } + #endif + } + + return xSwitchRequired; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) + { + TCB_t * xTCB; + + /* If xTask is NULL then it is the task hook of the calling task that is + * getting set. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + * the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xTCB->pxTaskTag = pxHookFunction; + } + taskEXIT_CRITICAL(); + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + TaskHookFunction_t xReturn; + + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + /* Save the hook function in the TCB. A critical section is required as + * the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xReturn = pxTCB->pxTaskTag; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + TaskHookFunction_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + /* Save the hook function in the TCB. A critical section is required as + * the value can be accessed from an interrupt. */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = pxTCB->pxTaskTag; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) + { + TCB_t * xTCB; + BaseType_t xReturn; + + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = pxCurrentTCB; + } + else + { + xTCB = xTask; + } + + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +void vTaskSwitchContext( void ) +{ + if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) + { + /* The scheduler is currently suspended - do not allow a context + * switch. */ + xYieldPending = pdTRUE; + } + else + { + xYieldPending = pdFALSE; + traceTASK_SWITCHED_OUT(); + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); + #else + ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the + * accumulated time so far. The time the task started running was + * stored in ulTaskSwitchedInTime. Note that there is no overflow + * protection here so count values are only valid until the timer + * overflows. The guard against negative values is to protect + * against suspect run time stat counter implementations - which + * are provided by the application, not the kernel. */ + if( ulTotalRunTime > ulTaskSwitchedInTime ) + { + pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ulTaskSwitchedInTime = ulTotalRunTime; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + /* Check for stack overflow, if configured. */ + taskCHECK_FOR_STACK_OVERFLOW(); + + /* Before the currently running task is switched out, save its errno. */ + #if ( configUSE_POSIX_ERRNO == 1 ) + { + pxCurrentTCB->iTaskErrno = FreeRTOS_errno; + } + #endif + + /* Select a new task to run using either the generic C or port + * optimised asm code. */ + taskSELECT_HIGHEST_PRIORITY_TASK(); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + traceTASK_SWITCHED_IN(); + + /* After the new task is switched in, update the global errno. */ + #if ( configUSE_POSIX_ERRNO == 1 ) + { + FreeRTOS_errno = pxCurrentTCB->iTaskErrno; + } + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + * structure specific to this task. + * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + * for additional information. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + } +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnEventList( List_t * const pxEventList, + const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE + * SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ + + /* Place the event list item of the TCB in the appropriate event list. + * This is placed in the list in priority order so the highest priority task + * is the first to be woken by the event. + * + * Note: Lists are sorted in ascending order by ListItem_t.xItemValue. + * Normally, the xItemValue of a TCB's ListItem_t members is: + * xItemValue = ( configMAX_PRIORITIES - uxPriority ) + * Therefore, the event list is sorted in descending priority order. + * + * The queue that contains the event list is locked, preventing + * simultaneous access from interrupts. */ + vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, + const TickType_t xItemValue, + const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + * the event groups implementation. */ + configASSERT( uxSchedulerSuspended != 0 ); + + /* Store the item value in the event list item. It is safe to access the + * event list item here as interrupts won't access the event list item of a + * task that is not in the Blocked state. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Place the event list item of the TCB at the end of the appropriate event + * list. It is safe to access the event list here because it is part of an + * event group implementation - and interrupts don't access event groups + * directly (instead they access them indirectly by pending function calls to + * the task level). */ + listINSERT_END( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) + { + configASSERT( pxEventList ); + + /* This function should not be called by application code hence the + * 'Restricted' in its name. It is not part of the public API. It is + * designed for use by kernel code, and has special calling requirements - + * it should be called with the scheduler suspended. */ + + + /* Place the event list item of the TCB in the appropriate event list. + * In this case it is assume that this is the only task that is going to + * be waiting on this event list, so the faster vListInsertEnd() function + * can be used in place of vListInsert. */ + listINSERT_END( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* If the task should block indefinitely then set the block time to a + * value that will be recognised as an indefinite delay inside the + * prvAddCurrentTaskToDelayedList() function. */ + if( xWaitIndefinitely != pdFALSE ) + { + xTicksToWait = portMAX_DELAY; + } + + traceTASK_DELAY_UNTIL( ( xTickCount + xTicksToWait ) ); + prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) +{ + TCB_t * pxUnblockedTCB; + BaseType_t xReturn; + + /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be + * called from a critical section within an ISR. */ + + /* The event list is sorted in priority order, so the first in the list can + * be removed as it is known to be the highest priority. Remove the TCB from + * the delayed list, and add it to the ready list. + * + * If an event is for a queue that is locked then this function will never + * get called - the lock count on the queue will get modified instead. This + * means exclusive access to the event list is guaranteed here. + * + * This function assumes that a check has already been made to ensure that + * pxEventList is not empty. */ + pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + configASSERT( pxUnblockedTCB ); + listREMOVE_ITEM( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + listREMOVE_ITEM( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + * might be set to the blocked task's time out time. If the task is + * unblocked for a reason other than a timeout xNextTaskUnblockTime is + * normally left unchanged, because it is automatically reset to a new + * value when the tick count equals xNextTaskUnblockTime. However if + * tickless idling is used it might be more important to enter sleep mode + * at the earliest possible time - so reset xNextTaskUnblockTime here to + * ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + } + else + { + /* The delayed and ready lists cannot be accessed, so hold this task + * pending until the scheduler is resumed. */ + listINSERT_END( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has a higher + * priority than the calling task. This allows the calling task to know if + * it should force a context switch now. */ + xReturn = pdTRUE; + + /* Mark that a yield is pending in case the user is not using the + * "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, + const TickType_t xItemValue ) +{ + TCB_t * pxUnblockedTCB; + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + * the event flags implementation. */ + configASSERT( uxSchedulerSuspended != pdFALSE ); + + /* Store the new item value in the event list. */ + listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Remove the event list form the event flag. Interrupts do not access + * event flags. */ + pxUnblockedTCB = listGET_LIST_ITEM_OWNER( pxEventListItem ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + configASSERT( pxUnblockedTCB ); + listREMOVE_ITEM( pxEventListItem ); + + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + * might be set to the blocked task's time out time. If the task is + * unblocked for a reason other than a timeout xNextTaskUnblockTime is + * normally left unchanged, because it is automatically reset to a new + * value when the tick count equals xNextTaskUnblockTime. However if + * tickless idling is used it might be more important to enter sleep mode + * at the earliest possible time - so reset xNextTaskUnblockTime here to + * ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + /* Remove the task from the delayed list and add it to the ready list. The + * scheduler is suspended so interrupts will not be accessing the ready + * lists. */ + listREMOVE_ITEM( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The unblocked task has a priority above that of the calling task, so + * a context switch is required. This function is called with the + * scheduler suspended so xYieldPending is set so the context switch + * occurs immediately that the scheduler is resumed (unsuspended). */ + xYieldPending = pdTRUE; + } +} +/*-----------------------------------------------------------*/ + +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + configASSERT( pxTimeOut ); + taskENTER_CRITICAL(); + { + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + /* For internal use only as it does not use a critical section. */ + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; +} +/*-----------------------------------------------------------*/ + +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) +{ + BaseType_t xReturn; + + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); + + taskENTER_CRITICAL(); + { + /* Minor optimisation. The tick count cannot change in this block. */ + const TickType_t xConstTickCount = xTickCount; + const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering; + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + if( pxCurrentTCB->ucDelayAborted != ( uint8_t ) pdFALSE ) + { + /* The delay was aborted, which is not the same as a time out, + * but has the same result. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + xReturn = pdTRUE; + } + else + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + if( *pxTicksToWait == portMAX_DELAY ) + { + /* If INCLUDE_vTaskSuspend is set to 1 and the block time + * specified is the maximum block time then the task should block + * indefinitely, and therefore never time out. */ + xReturn = pdFALSE; + } + else + #endif + + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ + { + /* The tick count is greater than the time at which + * vTaskSetTimeout() was called, but has also overflowed since + * vTaskSetTimeOut() was called. It must have wrapped all the way + * around and gone past again. This passed since vTaskSetTimeout() + * was called. */ + xReturn = pdTRUE; + *pxTicksToWait = ( TickType_t ) 0; + } + else if( xElapsedTime < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */ + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= xElapsedTime; + vTaskInternalSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + *pxTicksToWait = ( TickType_t ) 0; + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskMissedYield( void ) +{ + xYieldPending = pdTRUE; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) + { + UBaseType_t uxReturn; + TCB_t const * pxTCB; + + if( xTask != NULL ) + { + pxTCB = xTask; + uxReturn = pxTCB->uxTaskNumber; + } + else + { + uxReturn = 0U; + } + + return uxReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskSetTaskNumber( TaskHandle_t xTask, + const UBaseType_t uxHandle ) + { + TCB_t * pxTCB; + + if( xTask != NULL ) + { + pxTCB = xTask; + pxTCB->uxTaskNumber = uxHandle; + } + } + +#endif /* configUSE_TRACE_FACILITY */ + +/* + * ----------------------------------------------------------- + * The Idle task. + * ---------------------------------------------------------- + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + /* Stop warnings. */ + ( void ) pvParameters; + + /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE + * SCHEDULER IS STARTED. **/ + + /* In case a task that has a secure context deletes itself, in which case + * the idle task is responsible for deleting the task's secure context, if + * any. */ + portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE ); + + for( ; ; ) + { + /* See if any tasks have deleted themselves - if so then the idle task + * is responsible for freeing the deleted task's TCB and stack. */ + prvCheckTasksWaitingTermination(); + + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + * see if any other task has become available. If we are using + * preemption we don't need to do this as any task becoming available + * will automatically get the processor anyway. */ + taskYIELD(); + } + #endif /* configUSE_PREEMPTION */ + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + * timesliced. If a task that is sharing the idle priority is ready + * to run then the idle task should yield before the end of the + * timeslice. + * + * A critical region is not required here as we are just reading from + * the list, and an occasional incorrect value will not matter. If + * the ready list at the idle priority contains more than one task + * then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) + { + taskYIELD(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ + + #if ( configUSE_IDLE_HOOK == 1 ) + { + extern void vApplicationIdleHook( void ); + + /* Call the user defined function from within the idle task. This + * allows the application designer to add background functionality + * without the overhead of a separate task. + * NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + * CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationIdleHook(); + } + #endif /* configUSE_IDLE_HOOK */ + + /* This conditional compilation should use inequality to 0, not equality + * to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when + * user defined low power mode implementations require + * configUSE_TICKLESS_IDLE to be set to a value other than 1. */ + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + TickType_t xExpectedIdleTime; + + /* It is not desirable to suspend then resume the scheduler on + * each iteration of the idle task. Therefore, a preliminary + * test of the expected idle time is performed without the + * scheduler suspended. The result here is not necessarily + * valid. */ + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + vTaskSuspendAll(); + { + /* Now the scheduler is suspended, the expected idle + * time can be sampled again, and this time its value can + * be used. */ + configASSERT( xNextTaskUnblockTime >= xTickCount ); + xExpectedIdleTime = prvGetExpectedIdleTime(); + + /* Define the following macro to set xExpectedIdleTime to 0 + * if the application does not want + * portSUPPRESS_TICKS_AND_SLEEP() to be called. */ + configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime ); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + traceLOW_POWER_IDLE_BEGIN(); + portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); + traceLOW_POWER_IDLE_END(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICKLESS_IDLE */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + eSleepModeStatus eTaskConfirmSleepModeStatus( void ) + { + /* The idle task exists in addition to the application tasks. */ + const UBaseType_t uxNonApplicationTasks = 1; + eSleepModeStatus eReturn = eStandardSleep; + + /* This function must be called from a critical section. */ + + if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 ) + { + /* A task was made ready while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xYieldPending != pdFALSE ) + { + /* A yield was pended while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xPendedTicks != 0 ) + { + /* A tick interrupt has already occurred but was held pending + * because the scheduler is suspended. */ + eReturn = eAbortSleep; + } + else + { + /* If all the tasks are in the suspended list (which might mean they + * have an infinite block time rather than actually being suspended) + * then it is safe to turn all clocks off and just wait for external + * interrupts. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) + { + eReturn = eNoTasksWaitingTimeout; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return eReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) + { + TCB_t * pxTCB; + + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToSet ); + configASSERT( pxTCB != NULL ); + pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; + } + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void * pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) + { + void * pvReturn = NULL; + TCB_t * pxTCB; + + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; + } + else + { + pvReturn = NULL; + } + + return pvReturn; + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, + const MemoryRegion_t * const xRegions ) + { + TCB_t * pxTCB; + + /* If null is passed in here then we are modifying the MPU settings of + * the calling task. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); + + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseTaskLists( void ) +{ + UBaseType_t uxPriority; + + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); + } + + vListInitialise( &xDelayedTaskList1 ); + vListInitialise( &xDelayedTaskList2 ); + vListInitialise( &xPendingReadyList ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( &xTasksWaitingTermination ); + } + #endif /* INCLUDE_vTaskDelete */ + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( &xSuspendedTaskList ); + } + #endif /* INCLUDE_vTaskSuspend */ + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + * using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/ + + #if ( INCLUDE_vTaskDelete == 1 ) + { + TCB_t * pxTCB; + + /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL() + * being called too often in the idle task. */ + while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + { + taskENTER_CRITICAL(); + { + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + --uxCurrentNumberOfTasks; + --uxDeletedTasksWaitingCleanUp; + } + taskEXIT_CRITICAL(); + + prvDeleteTCB( pxTCB ); + } + } + #endif /* INCLUDE_vTaskDelete */ +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) + { + TCB_t * pxTCB; + + /* xTask is NULL then get the state of the calling task. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB; + pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName[ 0 ] ); + pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority; + pxTaskStatus->pxStackBase = pxTCB->pxStack; + pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber; + + #if ( configUSE_MUTEXES == 1 ) + { + pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority; + } + #else + { + pxTaskStatus->uxBasePriority = 0; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; + } + #else + { + pxTaskStatus->ulRunTimeCounter = ( configRUN_TIME_COUNTER_TYPE ) 0; + } + #endif + + /* Obtaining the task state is a little fiddly, so is only done if the + * value of eState passed into this function is eInvalid - otherwise the + * state is just set to whatever is passed in. */ + if( eState != eInvalid ) + { + if( pxTCB == pxCurrentTCB ) + { + pxTaskStatus->eCurrentState = eRunning; + } + else + { + pxTaskStatus->eCurrentState = eState; + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* If the task is in the suspended list then there is a + * chance it is actually just blocked indefinitely - so really + * it should be reported as being in the Blocked state. */ + if( eState == eSuspended ) + { + vTaskSuspendAll(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + pxTaskStatus->eCurrentState = eBlocked; + } + } + ( void ) xTaskResumeAll(); + } + } + #endif /* INCLUDE_vTaskSuspend */ + } + } + else + { + pxTaskStatus->eCurrentState = eTaskGetState( pxTCB ); + } + + /* Obtaining the stack space takes some time, so the xGetFreeStackSpace + * parameter is provided to allow it to be skipped. */ + if( xGetFreeStackSpace != pdFALSE ) + { + #if ( portSTACK_GROWTH > 0 ) + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack ); + } + #else + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack ); + } + #endif + } + else + { + pxTaskStatus->usStackHighWaterMark = 0; + } + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t * pxTaskStatusArray, + List_t * pxList, + eTaskState eState ) + { + configLIST_VOLATILE TCB_t * pxNextTCB, * pxFirstTCB; + UBaseType_t uxTask = 0; + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + /* Populate an TaskStatus_t structure within the + * pxTaskStatusArray array for each task that is referenced from + * pxList. See the definition of TaskStatus_t in task.h for the + * meaning of each TaskStatus_t structure member. */ + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState ); + uxTask++; + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) + { + uint32_t ulCount = 0U; + + while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + ulCount++; + } + + ulCount /= ( uint32_t ) sizeof( StackType_t ); /*lint !e961 Casting is not redundant on smaller architectures. */ + + return ( configSTACK_DEPTH_TYPE ) ulCount; + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) + +/* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. */ + configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + uint8_t * pucEndOfStack; + configSTACK_DEPTH_TYPE uxReturn; + + /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are + * the same except for their return type. Using configSTACK_DEPTH_TYPE + * allows the user to determine the return type. It gets around the + * problem of the value overflowing on 8-bit types without breaking + * backward compatibility for applications that expect an 8-bit return + * type. */ + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = prvTaskCheckFreeStackSpace( pucEndOfStack ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark2 */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + + UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + uint8_t * pucEndOfStack; + UBaseType_t uxReturn; + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t * pxTCB ) + { + /* This call is required specifically for the TriCore port. It must be + * above the vPortFree() calls. The call is also used by ports/demos that + * want to allocate and clean RAM statically. */ + portCLEAN_UP_TCB( pxTCB ); + + /* Free up the memory allocated by the scheduler for the task. It is up + * to the task to free any memory allocated at the application level. + * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + * for additional information. */ + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + _reclaim_reent( &( pxTCB->xNewLib_reent ) ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) + { + /* The task can only have been allocated dynamically - free both + * the stack and TCB. */ + vPortFreeStack( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + #elif ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* The task could have been allocated statically or dynamically, so + * check what was statically allocated before trying to free the + * memory. */ + if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) + { + /* Both the stack and TCB were allocated dynamically, so both + * must be freed. */ + vPortFreeStack( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) + { + /* Only the stack was statically allocated, so the TCB is the + * only memory that must be freed. */ + vPortFree( pxTCB ); + } + else + { + /* Neither the stack nor the TCB were allocated dynamically, so + * nothing needs to be freed. */ + configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +static void prvResetNextTaskUnblockTime( void ) +{ + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The new current delayed list is empty. Set xNextTaskUnblockTime to + * the maximum possible value so it is extremely unlikely that the + * if( xTickCount >= xNextTaskUnblockTime ) test will pass until + * there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + } + else + { + /* The new current delayed list is not empty, get the value of + * the item at the head of the delayed list. This is the time at + * which the task at the head of the delayed list should be removed + * from the Blocked state. */ + xNextTaskUnblockTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxDelayedTaskList ); + } +} +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + + TaskHandle_t xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + + /* A critical section is not required as this is not called from + * an interrupt and the current TCB will always be the same for any + * individual execution thread. */ + xReturn = pxCurrentTCB; + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + BaseType_t xTaskGetSchedulerState( void ) + { + BaseType_t xReturn; + + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxMutexHolderTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + /* If the mutex was given back by an interrupt while the queue was + * locked then the mutex holder might now be NULL. _RB_ Is this still + * needed as interrupts can no longer use mutexes? */ + if( pxMutexHolder != NULL ) + { + /* If the holder of the mutex has a priority below the priority of + * the task attempting to obtain the mutex then it will temporarily + * inherit the priority of the task attempting to obtain the mutex. */ + if( pxMutexHolderTCB->uxPriority < pxCurrentTCB->uxPriority ) + { + /* Adjust the mutex holder state to account for its new + * priority. Only reset the event list item value if the value is + * not being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task being modified is in the ready state it will need + * to be moved into a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Inherit the priority before being moved into the new list. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; + prvAddTaskToReadyList( pxMutexHolderTCB ); + } + else + { + /* Just inherit the priority. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; + } + + traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB->uxPriority ); + + /* Inheritance occurred. */ + xReturn = pdTRUE; + } + else + { + if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB->uxPriority ) + { + /* The base priority of the mutex holder is lower than the + * priority of the task attempting to take the mutex, but the + * current priority of the mutex holder is not lower than the + * priority of the task attempting to take the mutex. + * Therefore the mutex holder must have already inherited a + * priority, but inheritance would have occurred if that had + * not been the case. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + if( pxMutexHolder != NULL ) + { + /* A task can only have an inherited priority if it holds the mutex. + * If the mutex is held by a task then it cannot be given from an + * interrupt, and if a mutex is given by the holding task then it must + * be the running state task. */ + configASSERT( pxTCB == pxCurrentTCB ); + configASSERT( pxTCB->uxMutexesHeld ); + ( pxTCB->uxMutexesHeld )--; + + /* Has the holder of the mutex inherited the priority of another + * task? */ + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* Only disinherit if no other mutexes are held. */ + if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) + { + /* A task can only have an inherited priority if it holds + * the mutex. If the mutex is held by a task then it cannot be + * given from an interrupt, and if a mutex is given by the + * holding task then it must be the running state task. Remove + * the holding task from the ready list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Disinherit the priority before adding the task into the + * new ready list. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + pxTCB->uxPriority = pxTCB->uxBasePriority; + + /* Reset the event list item value. It cannot be in use for + * any other purpose if this task is running, and it must be + * running to give back the mutex. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + prvAddTaskToReadyList( pxTCB ); + + /* Return true to indicate that a context switch is required. + * This is only actually required in the corner case whereby + * multiple mutexes were held and the mutexes were given back + * in an order different to that in which they were taken. + * If a context switch did not occur when the first mutex was + * returned, even if a task was waiting on it, then a context + * switch should occur when the last mutex is returned whether + * a task is waiting on it or not. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, + UBaseType_t uxHighestPriorityWaitingTask ) + { + TCB_t * const pxTCB = pxMutexHolder; + UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse; + const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1; + + if( pxMutexHolder != NULL ) + { + /* If pxMutexHolder is not NULL then the holder must hold at least + * one mutex. */ + configASSERT( pxTCB->uxMutexesHeld ); + + /* Determine the priority to which the priority of the task that + * holds the mutex should be set. This will be the greater of the + * holding task's base priority and the priority of the highest + * priority task that is waiting to obtain the mutex. */ + if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask ) + { + uxPriorityToUse = uxHighestPriorityWaitingTask; + } + else + { + uxPriorityToUse = pxTCB->uxBasePriority; + } + + /* Does the priority need to change? */ + if( pxTCB->uxPriority != uxPriorityToUse ) + { + /* Only disinherit if no other mutexes are held. This is a + * simplification in the priority inheritance implementation. If + * the task that holds the mutex is also holding other mutexes then + * the other mutexes may have caused the priority inheritance. */ + if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld ) + { + /* If a task has timed out because it already holds the + * mutex it was trying to obtain then it cannot of inherited + * its own priority. */ + configASSERT( pxTCB != pxCurrentTCB ); + + /* Disinherit the priority, remembering the previous + * priority to facilitate determining the subject task's + * state. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, uxPriorityToUse ); + uxPriorityUsedOnEntry = pxTCB->uxPriority; + pxTCB->uxPriority = uxPriorityToUse; + + /* Only reset the event list item value if the value is not + * being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the running task is not the task that holds the mutex + * then the task that holds the mutex could be in either the + * Ready, Blocked or Suspended states. Only remove the task + * from its current state list if it is in the Ready state as + * the task's priority is going to change and there is one + * Ready list per priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB->uxCriticalNesting )++; + + /* This is not the interrupt safe version of the enter critical + * function so assert() if it is being called from an interrupt + * context. Only API functions that end in "FromISR" can be used in an + * interrupt. Only assert if the critical nesting count is 1 to + * protect against recursive calls if the assert function also uses a + * critical section. */ + if( pxCurrentTCB->uxCriticalNesting == 1 ) + { + portASSERT_IF_IN_ISR(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskExitCritical( void ) + { + if( xSchedulerRunning != pdFALSE ) + { + if( pxCurrentTCB->uxCriticalNesting > 0U ) + { + ( pxCurrentTCB->uxCriticalNesting )--; + + if( pxCurrentTCB->uxCriticalNesting == 0U ) + { + portENABLE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + static char * prvWriteNameToBuffer( char * pcBuffer, + const char * pcTaskName ) + { + size_t x; + + /* Start by copying the entire string. */ + strcpy( pcBuffer, pcTaskName ); + + /* Pad the end of the string with spaces to ensure columns line up when + * printed out. */ + for( x = strlen( pcBuffer ); x < ( size_t ) ( configMAX_TASK_NAME_LEN - 1 ); x++ ) + { + pcBuffer[ x ] = ' '; + } + + /* Terminate. */ + pcBuffer[ x ] = ( char ) 0x00; + + /* Return the new end of string. */ + return &( pcBuffer[ x ] ); + } + +#endif /* ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + void vTaskList( char * pcWriteBuffer ) + { + TaskStatus_t * pxTaskStatusArray; + UBaseType_t uxArraySize, x; + char cStatus; + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that + * displays task: names, states, priority, stack usage and task number. + * Stack usage specified as the number of unused StackType_t words stack can hold + * on top of stack - not the number of bytes. + * + * vTaskList() has a dependency on the sprintf() C library function that + * might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, + * and limited functionality implementation of sprintf() is provided in + * many of the FreeRTOS/Demo sub-directories in a file called + * printf-stdarg.c (note printf-stdarg.c does not provide a full + * snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskList(). + */ + + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + * function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! if + * configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + * equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); + + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + switch( pxTaskStatusArray[ x ].eCurrentState ) + { + case eRunning: + cStatus = tskRUNNING_CHAR; + break; + + case eReady: + cStatus = tskREADY_CHAR; + break; + + case eBlocked: + cStatus = tskBLOCKED_CHAR; + break; + + case eSuspended: + cStatus = tskSUSPENDED_CHAR; + break; + + case eDeleted: + cStatus = tskDELETED_CHAR; + break; + + case eInvalid: /* Fall through. */ + default: /* Should not get here, but it is included + * to prevent static checking errors. */ + cStatus = ( char ) 0x00; + break; + } + + /* Write the task name to the string, padding with spaces so it + * can be printed in tabular form more easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + /* Write the rest of the string. */ + sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + * is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + void vTaskGetRunTimeStats( char * pcWriteBuffer ) + { + TaskStatus_t * pxTaskStatusArray; + UBaseType_t uxArraySize, x; + configRUN_TIME_COUNTER_TYPE ulTotalTime, ulStatsAsPercentage; + + #if ( configUSE_TRACE_FACILITY != 1 ) + { + #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). + } + #endif + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part + * of the uxTaskGetSystemState() output into a human readable table that + * displays the amount of time each task has spent in the Running state + * in both absolute and percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library + * function that might bloat the code size, use a lot of stack, and + * provide different results on different platforms. An alternative, + * tiny, third party, and limited functionality implementation of + * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in + * a file called printf-stdarg.c (note printf-stdarg.c does not provide + * a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskGetRunTimeStats(). + */ + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + * function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! If + * configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + * equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); + + /* For percentage calculations. */ + ulTotalTime /= 100UL; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > 0UL ) + { + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + /* What percentage of the total run time has the task used? + * This will always be rounded down to the nearest integer. + * ulTotalRunTime has already been divided by 100. */ + ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; + + /* Write the task name to the string, padding with + * spaces so it can be printed in tabular form more + * easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + * printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + } + #endif + } + else + { + /* If the percentage is zero here then the task has + * consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + * printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + } + #endif + } + + pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + * is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +TickType_t uxTaskResetEventItemValue( void ) +{ + TickType_t uxReturn; + + uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ) ); + + /* Reset the event list item to its normal value - so it can be used with + * queues and semaphores. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + TaskHandle_t pvTaskIncrementMutexHeldCount( void ) + { + /* If xSemaphoreCreateMutex() is called before any tasks have been created + * then pxCurrentTCB will be NULL. */ + if( pxCurrentTCB != NULL ) + { + ( pxCurrentTCB->uxMutexesHeld )++; + } + + return pxCurrentTCB; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWait, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) + { + uint32_t ulReturn; + + configASSERT( uxIndexToWait < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + taskENTER_CRITICAL(); + { + /* Only block if the notification count is not already non-zero. */ + if( pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] == 0UL ) + { + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait ); + + /* All ports are written to allow a yield in a critical + * section (some will yield immediately, others wait until the + * critical section exits) - but it is not something that + * application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_TAKE( uxIndexToWait ); + ulReturn = pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ]; + + if( ulReturn != 0UL ) + { + if( xClearCountOnExit != pdFALSE ) + { + pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] = 0UL; + } + else + { + pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] = ulReturn - ( uint32_t ) 1; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWait, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + + configASSERT( uxIndexToWait < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + taskENTER_CRITICAL(); + { + /* Only block if a notification is not already pending. */ + if( pxCurrentTCB->ucNotifyState[ uxIndexToWait ] != taskNOTIFICATION_RECEIVED ) + { + /* Clear bits in the task's notification value as bits may get + * set by the notifying task or interrupt. This can be used to + * clear the value to zero. */ + pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] &= ~ulBitsToClearOnEntry; + + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWait ); + + /* All ports are written to allow a yield in a critical + * section (some will yield immediately, others wait until the + * critical section exits) - but it is not something that + * application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_WAIT( uxIndexToWait ); + + if( pulNotificationValue != NULL ) + { + /* Output the current notification value, which may or may not + * have changed. */ + *pulNotificationValue = pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ]; + } + + /* If ucNotifyValue is set then either the task never entered the + * blocked state (because a notification was already pending) or the + * task unblocked because of a notification. Otherwise the task + * unblocked because of a timeout. */ + if( pxCurrentTCB->ucNotifyState[ uxIndexToWait ] != taskNOTIFICATION_RECEIVED ) + { + /* A notification was not received. */ + xReturn = pdFALSE; + } + else + { + /* A notification was already pending or a notification was + * received while the task was waiting. */ + pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] &= ~ulBitsToClearOnExit; + xReturn = pdTRUE; + } + + pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) + { + TCB_t * pxTCB; + BaseType_t xReturn = pdPASS; + uint8_t ucOriginalNotifyState; + + configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + configASSERT( xTaskToNotify ); + pxTCB = xTaskToNotify; + + taskENTER_CRITICAL(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue[ uxIndexToNotify ]; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ]; + + pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] |= ulValue; + break; + + case eIncrement: + ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++; + break; + + case eSetValueWithOverwrite: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + break; + + case eSetValueWithoutOverwrite: + + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + + break; + + case eNoAction: + + /* The task is being notified without its notify value being + * updated. */ + break; + + default: + + /* Should not get here if all enums are handled. + * Artificially force an assert by testing a value the + * compiler can't assume is const. */ + configASSERT( xTickCount == ( TickType_t ) 0 ); + + break; + } + + traceTASK_NOTIFY( uxIndexToNotify ); + + /* If the task is in the blocked state specifically to wait for a + * notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked waiting for a notification then + * xNextTaskUnblockTime might be set to the blocked task's time + * out time. If the task is unblocked for a reason other than + * a timeout xNextTaskUnblockTime is normally left unchanged, + * because it will automatically get reset to a new value when + * the tick count equals xNextTaskUnblockTime. However if + * tickless idling is used it might be more important to enter + * sleep mode at the earliest possible time - so reset + * xNextTaskUnblockTime here to ensure it is updated at the + * earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + * executing task so a yield is required. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue, + BaseType_t * pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + BaseType_t xReturn = pdPASS; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue[ uxIndexToNotify ]; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ]; + pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] |= ulValue; + break; + + case eIncrement: + ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++; + break; + + case eSetValueWithOverwrite: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + break; + + case eSetValueWithoutOverwrite: + + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + + break; + + case eNoAction: + + /* The task is being notified without its notify value being + * updated. */ + break; + + default: + + /* Should not get here if all enums are handled. + * Artificially force an assert by testing a value the + * compiler can't assume is const. */ + configASSERT( xTickCount == ( TickType_t ) 0 ); + break; + } + + traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify ); + + /* If the task is in the blocked state specifically to wait for a + * notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + * this task pending until the scheduler is resumed. */ + listINSERT_END( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + * executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + + /* Mark that a yield is pending in case the user is not + * using the "xHigherPriorityTaskWoken" parameter to an ISR + * safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + BaseType_t * pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ]; + pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED; + + /* 'Giving' is equivalent to incrementing a count in a counting + * semaphore. */ + ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++; + + traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify ); + + /* If the task is in the blocked state specifically to wait for a + * notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + * this task pending until the scheduler is resumed. */ + listINSERT_END( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + * executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + + /* Mark that a yield is pending in case the user is not + * using the "xHigherPriorityTaskWoken" parameter in an ISR + * safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) + { + TCB_t * pxTCB; + BaseType_t xReturn; + + configASSERT( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* If null is passed in here then it is the calling task that is having + * its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + if( pxTCB->ucNotifyState[ uxIndexToClear ] == taskNOTIFICATION_RECEIVED ) + { + pxTCB->ucNotifyState[ uxIndexToClear ] = taskNOT_WAITING_NOTIFICATION; + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) + { + TCB_t * pxTCB; + uint32_t ulReturn; + + /* If null is passed in here then it is the calling task that is having + * its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + /* Return the notification as it was before the bits were cleared, + * then clear the bit mask. */ + ulReturn = pxTCB->ulNotifiedValue[ uxIndexToClear ]; + pxTCB->ulNotifiedValue[ uxIndexToClear ] &= ~ulBitsToClear; + } + taskEXIT_CRITICAL(); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + + configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ) + { + return xIdleTaskHandle->ulRunTimeCounter; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + + configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ) + { + configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn; + + ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE(); + + /* For percentage calculations. */ + ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 ) + { + ulReturn = xIdleTaskHandle->ulRunTimeCounter / ulTotalTime; + } + else + { + ulReturn = 0; + } + + return ulReturn; + } + +#endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */ +/*-----------------------------------------------------------*/ + +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, + const BaseType_t xCanBlockIndefinitely ) +{ + TickType_t xTimeToWake; + const TickType_t xConstTickCount = xTickCount; + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + { + /* About to enter a delayed list, so ensure the ucDelayAborted flag is + * reset to pdFALSE so it can be detected as having been set to pdTRUE + * when the task leaves the Blocked state. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Remove the task from the ready list before adding it to the blocked list + * as the same list item is used for both lists. */ + if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + * check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB cannot change as it is the calling task. pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) ) + { + /* Add the task to the suspended task list instead of a delayed task + * list to ensure it is not woken by a timing event. It will block + * indefinitely. */ + listINSERT_END( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event + * does not occur. This may overflow but this doesn't matter, the + * kernel will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow + * list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list + * is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the + * head of the list of blocked tasks then xNextTaskUnblockTime + * needs to be updated too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be woken if the event + * does not occur. This may overflow but this doesn't matter, the kernel + * will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the head of the + * list of blocked tasks then xNextTaskUnblockTime needs to be updated + * too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */ + ( void ) xCanBlockIndefinitely; + } + #endif /* INCLUDE_vTaskSuspend */ +} + +/* Code below here allows additional code to be inserted into this source file, + * especially where access to file scope functions and data is needed (for example + * when performing module tests). */ + +#ifdef FREERTOS_MODULE_TEST + #include "tasks_test_access_functions.h" +#endif + + +#if ( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) + + #include "freertos_tasks_c_additions.h" + + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + static void freertos_tasks_c_additions_init( void ) + { + FREERTOS_TASKS_C_ADDITIONS_INIT(); + } + #endif + +#endif /* if ( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) */ diff --git a/src/lib/CherryUSB/third_party/FreeRTOS-10.4/timers.c b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/timers.c new file mode 100644 index 000000000..88d834b9e --- /dev/null +++ b/src/lib/CherryUSB/third_party/FreeRTOS-10.4/timers.c @@ -0,0 +1,1119 @@ +/* + * FreeRTOS Kernel V10.4.6 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * 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. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" + +#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) + #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. +#endif + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e9021 !e961 !e750. */ + + +/* This entire source file will be skipped if the application is not configured + * to include software timer functionality. This #if is closed at the very bottom + * of this file. If you want to include software timer functionality then ensure + * configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#if ( configUSE_TIMERS == 1 ) + +/* Misc definitions. */ + #define tmrNO_DELAY ( ( TickType_t ) 0U ) + #define tmrMAX_TIME_BEFORE_OVERFLOW ( ( TickType_t ) -1 ) + +/* The name assigned to the timer service task. This can be overridden by + * defining trmTIMER_SERVICE_TASK_NAME in FreeRTOSConfig.h. */ + #ifndef configTIMER_SERVICE_TASK_NAME + #define configTIMER_SERVICE_TASK_NAME "Tmr Svc" + #endif + +/* Bit definitions used in the ucStatus member of a timer structure. */ + #define tmrSTATUS_IS_ACTIVE ( ( uint8_t ) 0x01 ) + #define tmrSTATUS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 0x02 ) + #define tmrSTATUS_IS_AUTORELOAD ( ( uint8_t ) 0x04 ) + +/* The definition of the timers themselves. */ + typedef struct tmrTimerControl /* The old naming convention is used to prevent breaking kernel aware debuggers. */ + { + const char * pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + ListItem_t xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + TickType_t xTimerPeriodInTicks; /*<< How quickly and often the timer expires. */ + void * pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + TimerCallbackFunction_t pxCallbackFunction; /*<< The function that will be called when the timer expires. */ + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTimerNumber; /*<< An ID assigned by trace tools such as FreeRTOS+Trace */ + #endif + uint8_t ucStatus; /*<< Holds bits to say if the timer was statically allocated or not, and if it is active or not. */ + } xTIMER; + +/* The old xTIMER name is maintained above then typedefed to the new Timer_t + * name below to enable the use of older kernel aware debuggers. */ + typedef xTIMER Timer_t; + +/* The definition of messages that can be sent and received on the timer queue. + * Two types of message can be queued - messages that manipulate a software timer, + * and messages that request the execution of a non-timer related callback. The + * two message types are defined in two separate structures, xTimerParametersType + * and xCallbackParametersType respectively. */ + typedef struct tmrTimerParameters + { + TickType_t xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + Timer_t * pxTimer; /*<< The timer to which the command will be applied. */ + } TimerParameter_t; + + + typedef struct tmrCallbackParameters + { + PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ + void * pvParameter1; /* << The value that will be used as the callback functions first parameter. */ + uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ + } CallbackParameters_t; + +/* The structure that contains the two message types, along with an identifier + * that is used to determine which message type is valid. */ + typedef struct tmrTimerQueueMessage + { + BaseType_t xMessageID; /*<< The command being sent to the timer service task. */ + union + { + TimerParameter_t xTimerParameters; + + /* Don't include xCallbackParameters if it is not going to be used as + * it makes the structure (and therefore the timer queue) larger. */ + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + CallbackParameters_t xCallbackParameters; + #endif /* INCLUDE_xTimerPendFunctionCall */ + } u; + } DaemonTaskMessage_t; + +/*lint -save -e956 A manual analysis and inspection has been used to determine + * which static variables must be declared volatile. */ + +/* The list in which active timers are stored. Timers are referenced in expire + * time order, with the nearest expiry time at the front of the list. Only the + * timer service task is allowed to access these lists. + * xActiveTimerList1 and xActiveTimerList2 could be at function scope but that + * breaks some kernel aware debuggers, and debuggers that reply on removing the + * static qualifier. */ + PRIVILEGED_DATA static List_t xActiveTimerList1; + PRIVILEGED_DATA static List_t xActiveTimerList2; + PRIVILEGED_DATA static List_t * pxCurrentTimerList; + PRIVILEGED_DATA static List_t * pxOverflowTimerList; + +/* A queue that is used to send commands to the timer service task. */ + PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; + PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; + +/*lint -restore */ + +/*-----------------------------------------------------------*/ + +/* + * Initialise the infrastructure used by the timer service task if it has not + * been initialised already. + */ + static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + +/* + * The timer service task (daemon). Timer functionality is controlled by this + * task. Other tasks communicate with the timer service task using the + * xTimerQueue queue. + */ + static portTASK_FUNCTION_PROTO( prvTimerTask, pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Called by the timer service task to interpret and process a command it + * received on the timer queue. + */ + static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + +/* + * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, + * depending on if the expire time causes a timer counter overflow. + */ + static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, + const TickType_t xNextExpiryTime, + const TickType_t xTimeNow, + const TickType_t xCommandTime ) PRIVILEGED_FUNCTION; + +/* + * Reload the specified auto-reload timer. If the reloading is backlogged, + * clear the backlog, calling the callback for each additional reload. When + * this function returns, the next expiry time is after xTimeNow. + */ + static void prvReloadTimer( Timer_t * const pxTimer, + TickType_t xExpiredTime, + const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * An active timer has reached its expire time. Reload the timer if it is an + * auto-reload timer, then call its callback. + */ + static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, + const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * The tick count has overflowed. Switch the timer lists after ensuring the + * current timer list does not still reference some timers. + */ + static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION; + +/* + * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE + * if a tick count overflow occurred since prvSampleTimeNow() was last called. + */ + static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + +/* + * If the timer list contains any active timers then return the expire time of + * the timer that will expire first and set *pxListWasEmpty to false. If the + * timer list does not contain any timers then return 0 and set *pxListWasEmpty + * to pdTRUE. + */ + static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * If a timer has expired, process it. Otherwise, block the timer service task + * until either a timer does expire or a command is received. + */ + static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, + BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * Called after a Timer_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ + static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t * pxNewTimer ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + + BaseType_t xTimerCreateTimerTask( void ) + { + BaseType_t xReturn = pdFAIL; + + /* This function is called when the scheduler is started if + * configUSE_TIMERS is set to 1. Check that the infrastructure used by the + * timer service task has been created/initialised. If timers have already + * been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); + + if( xTimerQueue != NULL ) + { + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t * pxTimerTaskTCBBuffer = NULL; + StackType_t * pxTimerTaskStackBuffer = NULL; + uint32_t ulTimerTaskStackSize; + + vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); + xTimerTaskHandle = xTaskCreateStatic( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + ulTimerTaskStackSize, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + pxTimerTaskStackBuffer, + pxTimerTaskTCBBuffer ); + + if( xTimerTaskHandle != NULL ) + { + xReturn = pdPASS; + } + } + #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + { + xReturn = xTaskCreate( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + configTIMER_TASK_STACK_DEPTH, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + &xTimerTaskHandle ); + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + configASSERT( xReturn ); + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) + { + Timer_t * pxNewTimer; + + pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of Timer_t is always a pointer to the timer's mame. */ + + if( pxNewTimer != NULL ) + { + /* Status is thus far zero as the timer is not created statically + * and has not been started. The auto-reload bit may get set in + * prvInitialiseNewTimer. */ + pxNewTimer->ucStatus = 0x00; + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } + + return pxNewTimer; + } + + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) + { + Timer_t * pxNewTimer; + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticTimer_t equals the size of the real timer + * structure. */ + volatile size_t xSize = sizeof( StaticTimer_t ); + configASSERT( xSize == sizeof( Timer_t ) ); + ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ + + /* A pointer to a StaticTimer_t structure MUST be provided, use it. */ + configASSERT( pxTimerBuffer ); + pxNewTimer = ( Timer_t * ) pxTimerBuffer; /*lint !e740 !e9087 StaticTimer_t is a pointer to a Timer_t, so guaranteed to be aligned and sized correctly (checked by an assert()), so this is safe. */ + + if( pxNewTimer != NULL ) + { + /* Timers can be created statically or dynamically so note this + * timer was created statically in case it is later deleted. The + * auto-reload bit may get set in prvInitialiseNewTimer(). */ + pxNewTimer->ucStatus = tmrSTATUS_IS_STATICALLY_ALLOCATED; + + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } + + return pxNewTimer; + } + + #endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t * pxNewTimer ) + { + /* 0 is not a valid value for xTimerPeriodInTicks. */ + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + + /* Ensure the infrastructure used by the timer service task has been + * created/initialised. */ + prvCheckForValidListAndQueue(); + + /* Initialise the timer structure members using the function + * parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + + if( uxAutoReload != pdFALSE ) + { + pxNewTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; + } + + traceTIMER_CREATE( pxNewTimer ); + } +/*-----------------------------------------------------------*/ + + BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) + { + BaseType_t xReturn = pdFAIL; + DaemonTaskMessage_t xMessage; + + configASSERT( xTimer ); + + /* Send a message to the timer service task to perform a particular action + * on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; + xMessage.u.xTimerParameters.pxTimer = xTimer; + + if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + else + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) + { + /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been + * started, then xTimerTaskHandle will be NULL. */ + configASSERT( ( xTimerTaskHandle != NULL ) ); + return xTimerTaskHandle; + } +/*-----------------------------------------------------------*/ + + TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + + configASSERT( xTimer ); + return pxTimer->xTimerPeriodInTicks; + } +/*-----------------------------------------------------------*/ + + void vTimerSetReloadMode( TimerHandle_t xTimer, + const UBaseType_t uxAutoReload ) + { + Timer_t * pxTimer = xTimer; + + configASSERT( xTimer ); + taskENTER_CRITICAL(); + { + if( uxAutoReload != pdFALSE ) + { + pxTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_AUTORELOAD ); + } + } + taskEXIT_CRITICAL(); + } +/*-----------------------------------------------------------*/ + + UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + UBaseType_t uxReturn; + + configASSERT( xTimer ); + taskENTER_CRITICAL(); + { + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0 ) + { + /* Not an auto-reload timer. */ + uxReturn = ( UBaseType_t ) pdFALSE; + } + else + { + /* Is an auto-reload timer. */ + uxReturn = ( UBaseType_t ) pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return uxReturn; + } +/*-----------------------------------------------------------*/ + + TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + TickType_t xReturn; + + configASSERT( xTimer ); + xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) ); + return xReturn; + } +/*-----------------------------------------------------------*/ + + const char * pcTimerGetName( TimerHandle_t xTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + Timer_t * pxTimer = xTimer; + + configASSERT( xTimer ); + return pxTimer->pcTimerName; + } +/*-----------------------------------------------------------*/ + + static void prvReloadTimer( Timer_t * const pxTimer, + TickType_t xExpiredTime, + const TickType_t xTimeNow ) + { + /* Insert the timer into the appropriate list for the next expiry time. + * If the next expiry time has already passed, advance the expiry time, + * call the callback function, and try again. */ + while( prvInsertTimerInActiveList( pxTimer, ( xExpiredTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xExpiredTime ) != pdFALSE ) + { + /* Advance the expiry time. */ + xExpiredTime += pxTimer->xTimerPeriodInTicks; + + /* Call the timer callback. */ + traceTIMER_EXPIRED( pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } + } +/*-----------------------------------------------------------*/ + + static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, + const TickType_t xTimeNow ) + { + Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + /* Remove the timer from the list of active timers. A check has already + * been performed to ensure the list is not empty. */ + + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + + /* If the timer is an auto-reload timer then calculate the next + * expiry time and re-insert the timer in the list of active timers. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + prvReloadTimer( pxTimer, xNextExpireTime, xTimeNow ); + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + + /* Call the timer callback. */ + traceTIMER_EXPIRED( pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } +/*-----------------------------------------------------------*/ + + static portTASK_FUNCTION( prvTimerTask, pvParameters ) + { + TickType_t xNextExpireTime; + BaseType_t xListWasEmpty; + + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; + + #if ( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 ) + { + extern void vApplicationDaemonTaskStartupHook( void ); + + /* Allow the application writer to execute some code in the context of + * this task at the point the task starts executing. This is useful if the + * application includes initialisation code that would benefit from + * executing after the scheduler has been started. */ + vApplicationDaemonTaskStartupHook(); + } + #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */ + + for( ; ; ) + { + /* Query the timers list to see if it contains any timers, and if so, + * obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + + /* If a timer has expired, process it. Otherwise, block this task + * until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } + } +/*-----------------------------------------------------------*/ + + static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, + BaseType_t xListWasEmpty ) + { + TickType_t xTimeNow; + BaseType_t xTimerListsWereSwitched; + + vTaskSuspendAll(); + { + /* Obtain the time now to make an assessment as to whether the timer + * has expired or not. If obtaining the time causes the lists to switch + * then don't process this timer as any timers that remained in the list + * when the lists were switched will have been processed within the + * prvSampleTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + ( void ) xTaskResumeAll(); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + * time has not been reached yet. This task should therefore + * block to wait for the next expire time or a command to be + * received - whichever comes first. The following line cannot + * be reached unless xNextExpireTime > xTimeNow, except in the + * case when the current timer list is empty. */ + if( xListWasEmpty != pdFALSE ) + { + /* The current timer list is empty - is the overflow list + * also empty? */ + xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); + } + + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); + + if( xTaskResumeAll() == pdFALSE ) + { + /* Yield to wait for either a command to arrive, or the + * block time to expire. If a command arrived between the + * critical section being exited and this yield then the yield + * will not cause the task to block. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + ( void ) xTaskResumeAll(); + } + } + } +/*-----------------------------------------------------------*/ + + static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) + { + TickType_t xNextExpireTime; + + /* Timers are listed in expiry time order, with the head of the list + * referencing the task that will expire first. Obtain the time at which + * the timer with the nearest expiry time will expire. If there are no + * active timers then just set the next expire time to 0. That will cause + * this task to unblock when the tick count overflows, at which point the + * timer lists will be switched and the next expiry time can be + * re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( TickType_t ) 0U; + } + + return xNextExpireTime; + } +/*-----------------------------------------------------------*/ + + static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) + { + TickType_t xTimeNow; + PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */ + + xTimeNow = xTaskGetTickCount(); + + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists(); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } + + xLastTime = xTimeNow; + + return xTimeNow; + } +/*-----------------------------------------------------------*/ + + static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, + const TickType_t xNextExpiryTime, + const TickType_t xTimeNow, + const TickType_t xCommandTime ) + { + BaseType_t xProcessTimerNow = pdFALSE; + + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + * timer was issued, and the time the command was processed? */ + if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + { + /* The time between a command being issued and the command being + * processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + * but the expiry time has not, then the timer must have already passed + * its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } + + return xProcessTimerNow; + } +/*-----------------------------------------------------------*/ + + static void prvProcessReceivedCommands( void ) + { + DaemonTaskMessage_t xMessage; + Timer_t * pxTimer; + BaseType_t xTimerListsWereSwitched; + TickType_t xTimeNow; + + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ + { + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + { + /* Negative commands are pended function calls rather than timer + * commands. */ + if( xMessage.xMessageID < ( BaseType_t ) 0 ) + { + const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); + + /* The timer uses the xCallbackParameters member to request a + * callback be executed. Check the callback is not NULL. */ + configASSERT( pxCallback ); + + /* Call the function. */ + pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* INCLUDE_xTimerPendFunctionCall */ + + /* Commands that are positive are timer commands rather than pended + * function calls. */ + if( xMessage.xMessageID >= ( BaseType_t ) 0 ) + { + /* The messages uses the xTimerParameters member to work on a + * software timer. */ + pxTimer = xMessage.u.xTimerParameters.pxTimer; + + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) /*lint !e961. The cast is only redundant when NULL is passed into the macro. */ + { + /* The timer is in a list, remove it. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); + + /* In this case the xTimerListsWereSwitched parameter is not used, but + * it must be present in the function call. prvSampleTimeNow() must be + * called after the message is received from xTimerQueue so there is no + * possibility of a higher priority task adding a message to the message + * queue with a time that is ahead of the timer daemon task (because it + * pre-empted the timer daemon task after the xTimeNow value was set). */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START: + case tmrCOMMAND_START_FROM_ISR: + case tmrCOMMAND_RESET: + case tmrCOMMAND_RESET_FROM_ISR: + /* Start or restart a timer. */ + pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; + + if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE ) + { + /* The timer expired before it was added to the active + * timer list. Process it now. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + prvReloadTimer( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow ); + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + + /* Call the timer callback. */ + traceTIMER_EXPIRED( pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + break; + + case tmrCOMMAND_STOP: + case tmrCOMMAND_STOP_FROM_ISR: + /* The timer has already been removed from the active list. */ + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + break; + + case tmrCOMMAND_CHANGE_PERIOD: + case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR: + pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; + pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + + /* The new period does not really have a reference, and can + * be longer or shorter than the old one. The command time is + * therefore set to the current time, and as the period cannot + * be zero the next expiry time can only be in the future, + * meaning (unlike for the xTimerStart() case above) there is + * no fail case that needs to be handled here. */ + ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE: + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* The timer has already been removed from the active list, + * just free up the memory if the memory was dynamically + * allocated. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 ) + { + vPortFree( pxTimer ); + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + } + #else /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ + { + /* If dynamic allocation is not enabled, the memory + * could not have been dynamically allocated. So there is + * no need to free the memory - just mark the timer as + * "not active". */ + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + break; + + default: + /* Don't expect to get here. */ + break; + } + } + } + } +/*-----------------------------------------------------------*/ + + static void prvSwitchTimerLists( void ) + { + TickType_t xNextExpireTime; + List_t * pxTemp; + + /* The tick count has overflowed. The timer lists must be switched. + * If there are any timers still referenced from the current timer list + * then they must have expired and should be processed before the lists + * are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Process the expired timer. For auto-reload timers, be careful to + * process only expirations that occur on the current list. Further + * expirations must wait until after the lists are switched. */ + prvProcessExpiredTimer( xNextExpireTime, tmrMAX_TIME_BEFORE_OVERFLOW ); + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; + } +/*-----------------------------------------------------------*/ + + static void prvCheckForValidListAndQueue( void ) + { + /* Check that the list from which active timers are referenced, and the + * queue used to communicate with the timer service, have been + * initialised. */ + taskENTER_CRITICAL(); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* The timer queue is allocated statically in case + * configSUPPORT_DYNAMIC_ALLOCATION is 0. */ + PRIVILEGED_DATA static StaticQueue_t xStaticTimerQueue; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ + PRIVILEGED_DATA static uint8_t ucStaticTimerQueueStorage[ ( size_t ) configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ + + xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue ); + } + #else + { + xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) ); + } + #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + if( xTimerQueue != NULL ) + { + vQueueAddToRegistry( xTimerQueue, "TmrQ" ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configQUEUE_REGISTRY_SIZE */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } +/*-----------------------------------------------------------*/ + + BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) + { + BaseType_t xReturn; + Timer_t * pxTimer = xTimer; + + configASSERT( xTimer ); + + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL(); + { + if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } /*lint !e818 Can't be pointer to const due to the typedef. */ +/*-----------------------------------------------------------*/ + + void * pvTimerGetTimerID( const TimerHandle_t xTimer ) + { + Timer_t * const pxTimer = xTimer; + void * pvReturn; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pvReturn = pxTimer->pvTimerID; + } + taskEXIT_CRITICAL(); + + return pvReturn; + } +/*-----------------------------------------------------------*/ + + void vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) + { + Timer_t * const pxTimer = xTimer; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pxTimer->pvTimerID = pvNewID; + } + taskEXIT_CRITICAL(); + } +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + BaseType_t * pxHigherPriorityTaskWoken ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* Complete the message with the function parameters and post it to the + * daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + + tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + + #endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* This function can only be called after a timer has been created or + * after the scheduler has been started because, until then, the timer + * queue does not exist. */ + configASSERT( xTimerQueue ); + + /* Complete the message with the function parameters and post it to the + * daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + + tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + + #endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) + { + return ( ( Timer_t * ) xTimer )->uxTimerNumber; + } + + #endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + + void vTimerSetTimerNumber( TimerHandle_t xTimer, + UBaseType_t uxTimerNumber ) + { + ( ( Timer_t * ) xTimer )->uxTimerNumber = uxTimerNumber; + } + + #endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +/* This entire source file will be skipped if the application is not configured + * to include software timer functionality. If you want to include software timer + * functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#endif /* configUSE_TIMERS == 1 */ diff --git a/src/lib/CherryUSB/third_party/cherrymp/LICENSE b/src/lib/CherryUSB/third_party/cherrymp/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherrymp/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/src/lib/CherryUSB/third_party/cherrymp/README.md b/src/lib/CherryUSB/third_party/cherrymp/README.md new file mode 100644 index 000000000..50e983c4e --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherrymp/README.md @@ -0,0 +1,3 @@ +# CherryMempool + +CherryMempool is a tiny block memory pool based on CherryRB, support nonos or os(but we suggest you use in os). diff --git a/src/lib/CherryUSB/third_party/cherrymp/chry_mempool.c b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool.c new file mode 100644 index 000000000..0f3f26aa8 --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool.c @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "chry_mempool.h" + +/***************************************************************************** +* @brief init ringbuffer +* +* @param[in] rb ringbuffer instance +* @param[in] pool memory pool address +* @param[in] size memory size in byte, +* must be power of 2 !!! +* +* @retval int 0:Success -1:Error +*****************************************************************************/ +static int __chry_ringbuffer_init(chry_mempool_ringbuffer_t *rb, void *pool, uint32_t size) +{ + if (NULL == rb) { + return -1; + } + + if (NULL == pool) { + return -1; + } + + if ((size < 2) || (size & (size - 1))) { + return -1; + } + + rb->in = 0; + rb->out = 0; + rb->mask = size - 1; + rb->pool = pool; + + return 0; +} + +/***************************************************************************** +* @brief reset ringbuffer, clean all data, +* should be add lock in multithread +* +* @param[in] rb ringbuffer instance +* +*****************************************************************************/ +static void __chry_ringbuffer_reset(chry_mempool_ringbuffer_t *rb) +{ + rb->in = 0; + rb->out = 0; +} + +/***************************************************************************** +* @brief write data to ringbuffer, +* should be add lock in multithread, +* in single write thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] data data pointer +* @param[in] size size in byte +* +* @retval uint32_t actual write size in byte +*****************************************************************************/ +static uint32_t __chry_ringbuffer_write(chry_mempool_ringbuffer_t *rb, void *data, uint32_t size) +{ + uint32_t unused; + uint32_t offset; + uint32_t remain; + + unused = (rb->mask + 1) - (rb->in - rb->out); + + if (size > unused) { + size = unused; + } + + offset = rb->in & rb->mask; + + remain = rb->mask + 1 - offset; + remain = remain > size ? size : remain; + + memcpy(((uint8_t *)(rb->pool)) + offset, data, remain); + memcpy(rb->pool, (uint8_t *)data + remain, size - remain); + + rb->in += size; + + return size; +} + +/***************************************************************************** +* @brief peek data from ringbuffer +* should be add lock in multithread, +* in single read thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] data data pointer +* @param[in] size size in byte +* +* @retval uint32_t actual peek size in byte +*****************************************************************************/ +static uint32_t __chry_ringbuffer_peek(chry_mempool_ringbuffer_t *rb, void *data, uint32_t size) +{ + uint32_t used; + uint32_t offset; + uint32_t remain; + + used = rb->in - rb->out; + if (size > used) { + size = used; + } + + offset = rb->out & rb->mask; + + remain = rb->mask + 1 - offset; + remain = remain > size ? size : remain; + + memcpy(data, ((uint8_t *)(rb->pool)) + offset, remain); + memcpy((uint8_t *)data + remain, rb->pool, size - remain); + + return size; +} + +/***************************************************************************** +* @brief read data from ringbuffer +* should be add lock in multithread, +* in single read thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] data data pointer +* @param[in] size size in byte +* +* @retval uint32_t actual read size in byte +*****************************************************************************/ +static uint32_t __chry_ringbuffer_read(chry_mempool_ringbuffer_t *rb, void *data, uint32_t size) +{ + size = __chry_ringbuffer_peek(rb, data, size); + rb->out += size; + return size; +} + +int chry_mempool_create(struct chry_mempool *pool, void *block, uint32_t block_size, uint32_t block_count) +{ + uintptr_t *item; + + if (block_count > CONFIG_CHRY_MEMPOOL_MAX_BLOCK_COUNT) { + return -1; + } + + if (pool->block_size % 4) { + return -1; + } + + if (__chry_ringbuffer_init(&pool->in, pool->in_buf, sizeof(uintptr_t) * block_count) == -1) { + return -1; + } + + if (__chry_ringbuffer_init(&pool->out, pool->out_buf, sizeof(uintptr_t) * block_count) == -1) { + return -1; + } + + pool->out_sem = chry_mempool_osal_sem_create(block_count); + if (pool->out_sem == NULL) { + return -1; + } + + pool->block = block; + pool->block_size = block_size; + pool->block_count = block_count; + + for (uint32_t i = 0; i < pool->block_count; i++) { + item = (uintptr_t *)((uint8_t *)pool->block + i * pool->block_size); + chry_mempool_free(pool, item); + } + + return 0; +} + +void chry_mempool_delete(struct chry_mempool *pool) +{ + chry_mempool_osal_sem_delete(pool->out_sem); + __chry_ringbuffer_reset(&pool->in); + __chry_ringbuffer_reset(&pool->out); +} + +uintptr_t *chry_mempool_alloc(struct chry_mempool *pool) +{ + uintptr_t *addr; + uint32_t len; + + len = __chry_ringbuffer_read(&pool->in, (uintptr_t *)&addr, sizeof(uintptr_t)); + if (len == 0) { + return NULL; + } else { + return addr; + } +} + +int chry_mempool_free(struct chry_mempool *pool, uintptr_t *item) +{ + uintptr_t addr; + + addr = (uintptr_t)item; + return __chry_ringbuffer_write(&pool->in, &addr, sizeof(uintptr_t)); +} + +int chry_mempool_send(struct chry_mempool *pool, uintptr_t *item) +{ + uintptr_t addr; + + addr = (uintptr_t)item; + __chry_ringbuffer_write(&pool->out, &addr, sizeof(uintptr_t)); + return chry_mempool_osal_sem_give(pool->out_sem); +} + +int chry_mempool_recv(struct chry_mempool *pool, uintptr_t **item, uint32_t timeout) +{ + uint32_t len; + int ret; + + ret = chry_mempool_osal_sem_take(pool->out_sem, timeout); + if (ret < 0) { + return -1; + } + + len = __chry_ringbuffer_read(&pool->out, (uintptr_t *)item, sizeof(uintptr_t)); + if (len == 0) { + return -1; + } else { + return 0; + } +} + +void chry_mempool_reset(struct chry_mempool *pool) +{ + uintptr_t *item; + + __chry_ringbuffer_reset(&pool->in); + __chry_ringbuffer_reset(&pool->out); + + for (uint32_t i = 0; i < pool->block_count; i++) { + item = (uintptr_t *)((uint8_t *)pool->block + i * pool->block_size); + chry_mempool_free(pool, item); + } +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/cherrymp/chry_mempool.h b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool.h new file mode 100644 index 000000000..1132454c5 --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef CHRY_MEMPOOL_H +#define CHRY_MEMPOOL_H + +#include +#include +#include + +typedef void *chry_mempool_osal_sem_t; + +#ifndef CONFIG_CHRY_MEMPOOL_MAX_BLOCK_COUNT +#define CONFIG_CHRY_MEMPOOL_MAX_BLOCK_COUNT 128 +#endif + +typedef struct { + uint32_t in; /*!< Define the write pointer. */ + uint32_t out; /*!< Define the read pointer. */ + uint32_t mask; /*!< Define the write and read pointer mask. */ + void *pool; /*!< Define the memory pointer. */ +} chry_mempool_ringbuffer_t; + +struct chry_mempool { + chry_mempool_ringbuffer_t in; + chry_mempool_ringbuffer_t out; + chry_mempool_osal_sem_t out_sem; + + void *block; + uint32_t block_size; + uint32_t block_count; + uint8_t in_buf[sizeof(uintptr_t) * CONFIG_CHRY_MEMPOOL_MAX_BLOCK_COUNT]; + uint8_t out_buf[sizeof(uintptr_t) * CONFIG_CHRY_MEMPOOL_MAX_BLOCK_COUNT]; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +chry_mempool_osal_sem_t chry_mempool_osal_sem_create(uint32_t max_count); +void chry_mempool_osal_sem_delete(chry_mempool_osal_sem_t sem); +int chry_mempool_osal_sem_take(chry_mempool_osal_sem_t sem, uint32_t timeout); +int chry_mempool_osal_sem_give(chry_mempool_osal_sem_t sem); + +int chry_mempool_create(struct chry_mempool *pool, void *block, uint32_t block_size, uint32_t block_count); +uintptr_t *chry_mempool_alloc(struct chry_mempool *pool); +int chry_mempool_free(struct chry_mempool *pool, uintptr_t *item); +int chry_mempool_send(struct chry_mempool *pool, uintptr_t *item); +int chry_mempool_recv(struct chry_mempool *pool, uintptr_t **item, uint32_t timeout); +void chry_mempool_reset(struct chry_mempool *pool); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/cherrymp/chry_mempool_osal_freertos.c b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool_osal_freertos.c new file mode 100644 index 000000000..1db9aa547 --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool_osal_freertos.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "chry_mempool.h" +#include +#include "semphr.h" + +chry_mempool_osal_sem_t chry_mempool_osal_sem_create(uint32_t max_count) +{ + return (chry_mempool_osal_sem_t)xSemaphoreCreateCounting(max_count, 0); +} + +void chry_mempool_osal_sem_delete(chry_mempool_osal_sem_t sem) +{ + vSemaphoreDelete((SemaphoreHandle_t)sem); +} + +int chry_mempool_osal_sem_take(chry_mempool_osal_sem_t sem, uint32_t timeout) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + int ret; + + if (xPortIsInsideInterrupt()) { + ret = xSemaphoreTakeFromISR((SemaphoreHandle_t)sem, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + return (ret == pdPASS) ? 0 : -1; + } else { + return (xSemaphoreTake((SemaphoreHandle_t)sem, pdMS_TO_TICKS(timeout)) == pdPASS) ? 0 : -1; + } +} + +int chry_mempool_osal_sem_give(chry_mempool_osal_sem_t sem) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + int ret; + + if (xPortIsInsideInterrupt()) { + ret = xSemaphoreGiveFromISR((SemaphoreHandle_t)sem, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } else { + ret = xSemaphoreGive((SemaphoreHandle_t)sem); + } + + return (ret == pdPASS) ? 0 : -1; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/cherrymp/chry_mempool_osal_nonos.c b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool_osal_nonos.c new file mode 100644 index 000000000..7bd319b3b --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool_osal_nonos.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "chry_mempool.h" +#include "stdlib.h" + +chry_mempool_osal_sem_t chry_mempool_osal_sem_create(uint32_t max_count) +{ + return (chry_mempool_osal_sem_t)1; +} + +void chry_mempool_osal_sem_delete(chry_mempool_osal_sem_t sem) +{ +} + +int chry_mempool_osal_sem_take(chry_mempool_osal_sem_t sem, uint32_t timeout) +{ + return 0; +} + +int chry_mempool_osal_sem_give(chry_mempool_osal_sem_t sem) +{ + return 0; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/cherrymp/chry_mempool_osal_rtthread.c b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool_osal_rtthread.c new file mode 100644 index 000000000..86042e29f --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherrymp/chry_mempool_osal_rtthread.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "chry_mempool.h" +#include +#include + +chry_mempool_osal_sem_t chry_mempool_osal_sem_create(uint32_t max_count) +{ + return (chry_mempool_osal_sem_t)rt_sem_create("chry_mempoolh_sem", max_count, RT_IPC_FLAG_FIFO); +} + +void chry_mempool_osal_sem_delete(chry_mempool_osal_sem_t sem) +{ + rt_sem_delete((rt_sem_t)sem); +} + +int chry_mempool_osal_sem_take(chry_mempool_osal_sem_t sem, uint32_t timeout) +{ + int ret = 0; + rt_err_t result = RT_EOK; + + if (timeout == 0xfffffff) { + result = rt_sem_take((rt_sem_t)sem, RT_WAITING_FOREVER); + } else { + result = rt_sem_take((rt_sem_t)sem, rt_tick_from_millisecond(timeout)); + } + if (result == -RT_ETIMEOUT) { + ret = -1; + } else if (result == -RT_ERROR) { + ret = -1; + } else { + ret = 0; + } + + return (int)ret; +} + +int chry_mempool_osal_sem_give(chry_mempool_osal_sem_t sem) +{ + return (int)rt_sem_release((rt_sem_t)sem); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/cherryrb/CHANGELOG.md b/src/lib/CherryUSB/third_party/cherryrb/CHANGELOG.md new file mode 100644 index 000000000..760cd5ccc --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherryrb/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +## [1.0.0] - 2023-06-28: + +All changes + +### Added + - first commit + - add linear r/w setup done api, for dma use \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/cherryrb/LICENSE b/src/lib/CherryUSB/third_party/cherryrb/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherryrb/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/src/lib/CherryUSB/third_party/cherryrb/README.md b/src/lib/CherryUSB/third_party/cherryrb/README.md new file mode 100644 index 000000000..df04502ca --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherryrb/README.md @@ -0,0 +1,206 @@ +# CherryRingBuffer + +[中文版](./README_zh.md) + +CherryRingBuffer is an efficient and easy-to-use ringbuffer that is based on the same principle as kfifo. + +## Brief + +### 1.Create and initialize a RingBuffer +```c +chry_ringbuffer_t rb; +uint8_t mempool[1024]; + +int main(void) +{ + /** + * Note that the third parameter of the init function is + * the size of the memory pool (in bytes) + * It is also the depth of the ringbuffer, + * which must be a power of 2 !!! + * Example: 4, 16, 32, 64, 128, 1024, 8192, 65536, etc. + */ + if(0==chry_ringbuffer_init(&rb, mempool, 1024)){ + printf("success\r\n"); + }else{ + printf("error\r\n"); + } + + return 0; +} +``` + +### 2.Lock-free use of the producer-consumer model +The read and write APIs, except for overwrite, do not require locking if they satisfy the requirement that the ringbuffer is read in only one thread and written in only one thread, because the read and write operations only operate on the read or write pointers separately. +```c +void thread_producer(void* param) +{ + char *data = "hello world"; + while(1){ + uint32_t len = chry_ringbuffer_write(&rb, data, 11); + if(11 == len){ + printf("[P] write success\r\n"); + }else{ + printf("[P] write faild, only write %d byte\r\n", len); + } + vTaskDelay(100); + } +} + +void thread_consumer(void* param) +{ + char data[1024]; + while(1){ + uint32_t len =chry_ringbuffer_read(&rb, data, 11); + if (len){ + printf("[C] read success, read %d byte\r\n",len); + data[11]='\0'; + printf("%s\r\n",data); + }else{ + printf("[C] read faild, no data in ringbuffer\r\n"); + } + vTaskDelay(100); + } +} +``` + +### 3. API Introduction + +```c + + /** + * Used to clear ringbuffer, while operating read and write pointers, + * multi-threaded need to add lock + */ + chry_ringbuffer_reset(&rb); + + /** + * Used to clear ringbuffer, only operates on read pointers, + * called without locking in the only read thread + */ + chry_ringbuffer_reset_read(&rb); + + /** + * Get the total ringbuffer size (bytes) + */ + uint32_t size = chry_ringbuffer_get_size(&rb); + + /** + * Get ringbuffer used size (bytes) + */ + uint32_t used = chry_ringbuffer_get_used(&rb); + + /** + * Get ringbuffer free size (bytes) + */ + uint32_t free = chry_ringbuffer_get_free(&rb); + + /** + * Check if ringbuffer is full, full returns true + */ + bool is_full = chry_ringbuffer_check_full(&rb); + + /** + * Check if ringbuffer is empty, empty returns true + */ + bool is_empty = chry_ringbuffer_check_empty(&rb); + + uint8_t data = 0x55; + + /** + * Write a byte + * No locking on the only write thread call + * Success returns true, full returns false + */ + chry_ringbuffer_write_byte(&rb, data); + + /** + * overwriting write one byte, + * when ringbuffer is full will overwrite the earliest data + * The non-full case is the same as chry_ringbuffer_write_byte + * This API may operate on read and write pointers at the same time, + * so multiple threads need to add locks + * Always return true + */ + chry_ringbuffer_overwrite_byte(&rb, data); + + /** + * Peek one byte from ringbuffer + * The data is still retained in the ringbuffer + * No locking on the only read thread call + * Success returns true, empty returns false + */ + chry_ringbuffer_peek_byte(&rb, &data); + + /** + * Read one byte from ringbuffer + * Data retrieval from ringbuffer + * No locking on the only read thread call + * Success returns true, empty returns false + */ + chry_ringbuffer_read_byte(&rb, &data); + + /** + * Drop one byte from ringbuffer + * Data retrieval from ringbuffer + * No locking on the only read thread call + * Success returns true, empty returns false + */ + chry_ringbuffer_drop_byte(&rb); + + /** + * Write multi-byte, otherwise same as single byte write + * Returns the actual length of the write + */ + chry_ringbuffer_write(&rb, data, 1); + + /** + * Overwrite multi-byte, otherwise same as single byte overwrite + * Returns the actual length of the write + */ + chry_ringbuffer_overwrite(&rb, data, 1); + + /** + * Peek multiple bytes, otherwise same as single byte peek + * Returns the length of the actual peek + */ + chry_ringbuffer_peek(&rb, data, 1); + + /** + * Read multiple bytes, otherwise same as single byte read + * Returns the length of the actual read + */ + chry_ringbuffer_read(&rb, data, 1); + + /** + * Drop multiple bytes, otherwise same as single byte Drop + * Returns the length of the actual drop + */ + chry_ringbuffer_drop(&rb, 1); + + void *pdata; + uint32_t size; + + /** + * For dma start, get read memory address and max linear read size + */ + pdata = chry_ringbuffer_linear_read_setup(&rb, &size); + + /** + * For dma done, add read pointer + * Returns the length of the actual add + */ + size = chry_ringbuffer_linear_read_done(&rb, 512); + + /** + * For dma start, get write memory address and max linear write size + */ + pdata = chry_ringbuffer_linear_write_setup(&rb, &size); + + /** + * For dma done, add write pointer + * Returns the length of the actual add + */ + size = chry_ringbuffer_linear_write_done(&rb, 512); + +``` \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/cherryrb/README_zh.md b/src/lib/CherryUSB/third_party/cherryrb/README_zh.md new file mode 100644 index 000000000..16bda1ed0 --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherryrb/README_zh.md @@ -0,0 +1,200 @@ +# CherryRingBuffer + +[English](./README.md) + +CherryRingBuffer 是一个的高效、易用的环形缓冲区,其原理与kfifo一致。 + +## 简介 + +### 1.创建并初始化一个RingBuffer +```c +chry_ringbuffer_t rb; +uint8_t mempool[1024]; + +int main(void) +{ + /** + * 需要注意的点是,init 函数第三个参数是内存池的大小(字节为单位) + * 也是ringbuffer的深度,必须为 2 的幂次!!!。 + * 例如 4、16、32、64、128、1024、8192、65536等 + */ + if(0 == chry_ringbuffer_init(&rb, mempool, 1024)){ + printf("success\r\n"); + }else{ + printf("error\r\n"); + } + + return 0; +} +``` + +### 2.生产者消费者模型的无锁使用 +读和写的API除了overwrite外,如果满足ringbuffer只在一个线程里进行读,并且只在一个线程里面写,那么无须加锁,因为读和写操作只单独操作读或者写指针。 +```c +void thread_producer(void* param) +{ + char *data = "hello world"; + while(1){ + uint32_t len = chry_ringbuffer_write(&rb, data, 11); + if(11 == len){ + printf("[P] write success\r\n"); + }else{ + printf("[P] write faild, only write %d byte\r\n", len); + } + vTaskDelay(100); + } +} + +void thread_consumer(void* param) +{ + char data[1024]; + while(1){ + uint32_t len =chry_ringbuffer_read(&rb, data, 11); + if (len){ + printf("[C] read success, read %d byte\r\n",len); + data[11]='\0'; + printf("%s\r\n",data); + }else{ + printf("[C] read faild, no data in ringbuffer\r\n"); + } + vTaskDelay(100); + } +} +``` + +### 3. API简介 + +```c + + /** + * 用于清空,同时操作读写指针,多线程需要加锁 + */ + chry_ringbuffer_reset(&rb); + + /** + * 用于清空,只操作读指针,在唯一的读线程调用无须加锁 + */ + chry_ringbuffer_reset_read(&rb); + + /** + * 获取ringbuffer总大小(字节) + */ + uint32_t size = chry_ringbuffer_get_size(&rb); + + /** + * 获取ringbuffer使用大小(字节) + */ + uint32_t used = chry_ringbuffer_get_used(&rb); + + /** + * 获取ringbuffer空闲大小(字节) + */ + uint32_t free = chry_ringbuffer_get_free(&rb); + + /** + * 检查ringbuffer是否为满,满返回true + */ + bool is_full = chry_ringbuffer_check_full(&rb); + + /** + * 检查ringbuffer是否为空,空返回true + */ + bool is_empty = chry_ringbuffer_check_empty(&rb); + + uint8_t data = 0x55; + + /** + * 写一字节 + * 在唯一的写线程调用无须加锁 + * 写成功返回true,满返回false + */ + chry_ringbuffer_write_byte(&rb, data); + + /** + * 覆盖写一字节,当ringbuffer满的时候会覆盖最早的数据, + * 非满情况与 chry_ringbuffer_write_byte 一致。 + * 此API可能会同时操作读写指针,所以多线程需要加锁 + * 始终返回true + */ + chry_ringbuffer_overwrite_byte(&rb, data); + + /** + * 从ringbuffer中复制出来一字节 + * 数据仍然保留在ringbuffer中 + * 在唯一的读线程调用无须加锁 + * 成功返回true,空返回false + */ + chry_ringbuffer_peek_byte(&rb, &data); + + /** + * 从ringbuffer中读取出来一字节 + * 数据从ringbuffer中取出 + * 在唯一的读线程调用无须加锁 + * 成功返回true,空返回false + */ + chry_ringbuffer_read_byte(&rb, &data); + + /** + * 丢弃ringbuffer中一字节 + * 数据从ringbuffer中取出 + * 在唯一的读线程调用无须加锁 + * 成功返回true,空返回false + */ + chry_ringbuffer_drop_byte(&rb); + + /** + * 写多字节,其他与单字节写相同 + * 返回实际写入的长度 + */ + chry_ringbuffer_write(&rb, data, 1); + + /** + * 覆盖写多字节,其他与单字节覆盖写相同 + * 返回实际写入的长度 + */ + chry_ringbuffer_overwrite(&rb, data, 1); + + /** + * 复制多字节,其他与单字节复制相同 + * 返回实际复制的长度 + */ + chry_ringbuffer_peek(&rb, data, 1); + + /** + * 读取多字节,其他与单字节读取相同 + * 返回实际读取的长度 + */ + chry_ringbuffer_read(&rb, data, 1); + + /** + * 丢弃多字节,其他与单字节丢弃相同 + * 返回实际丢弃的长度 + */ + chry_ringbuffer_drop(&rb, 1); + + void *pdata; + uint32_t size; + + /** + * 用于启动DMA,获取读取起始内存地址和最大线性可读取长度 + */ + pdata = chry_ringbuffer_linear_read_setup(&rb, &size); + + /** + * 用于DMA完成,增加读指针 + * 返回实际增加长度 + */ + size = chry_ringbuffer_linear_read_done(&rb, 512); + + /** + * 用于启动DMA,获取写入起始内存地址和最大线性可写入长度 + */ + pdata = chry_ringbuffer_linear_write_setup(&rb, &size); + + /** + * 用于DMA完成,增加写指针 + * 返回实际增加长度 + */ + size = chry_ringbuffer_linear_write_done(&rb, 512); + +``` \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/cherryrb/chry_ringbuffer.c b/src/lib/CherryUSB/third_party/cherryrb/chry_ringbuffer.c new file mode 100644 index 000000000..a5d06a0db --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherryrb/chry_ringbuffer.c @@ -0,0 +1,474 @@ +/* + * Copyright (c) 2022, Egahp + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "chry_ringbuffer.h" + +/***************************************************************************** +* @brief init ringbuffer +* +* @param[in] rb ringbuffer instance +* @param[in] pool memory pool address +* @param[in] size memory size in byte, +* must be power of 2 !!! +* +* @retval int 0:Success -1:Error +*****************************************************************************/ +int chry_ringbuffer_init(chry_ringbuffer_t *rb, void *pool, uint32_t size) +{ + if (NULL == rb) { + return -1; + } + + if (NULL == pool) { + return -1; + } + + if ((size < 2) || (size & (size - 1))) { + return -1; + } + + rb->in = 0; + rb->out = 0; + rb->mask = size - 1; + rb->pool = pool; + + return 0; +} + +/***************************************************************************** +* @brief reset ringbuffer, clean all data, +* should be add lock in multithread +* +* @param[in] rb ringbuffer instance +* +*****************************************************************************/ +void chry_ringbuffer_reset(chry_ringbuffer_t *rb) +{ + rb->in = 0; + rb->out = 0; +} + +/***************************************************************************** +* @brief reset ringbuffer, clean all data, +* should be add lock in multithread, +* in single read thread not need lock +* +* @param[in] rb ringbuffer instance +* +*****************************************************************************/ +void chry_ringbuffer_reset_read(chry_ringbuffer_t *rb) +{ + rb->out = rb->in; +} + +/***************************************************************************** +* @brief get ringbuffer total size in byte +* +* @param[in] rb ringbuffer instance +* +* @retval uint32_t total size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_get_size(chry_ringbuffer_t *rb) +{ + return rb->mask + 1; +} + +/***************************************************************************** +* @brief get ringbuffer used size in byte +* +* @param[in] rb ringbuffer instance +* +* @retval uint32_t used size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_get_used(chry_ringbuffer_t *rb) +{ + return rb->in - rb->out; +} + +/***************************************************************************** +* @brief get ringbuffer free size in byte +* +* @param[in] rb ringbuffer instance +* +* @retval uint32_t free size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_get_free(chry_ringbuffer_t *rb) +{ + return (rb->mask + 1) - (rb->in - rb->out); +} + +/***************************************************************************** +* @brief check if ringbuffer is full +* +* @param[in] rb ringbuffer instance +* +* @retval true full +* @retval false not full +*****************************************************************************/ +bool chry_ringbuffer_check_full(chry_ringbuffer_t *rb) +{ + return chry_ringbuffer_get_used(rb) > rb->mask; +} + +/***************************************************************************** +* @brief check if ringbuffer is empty +* +* @param[in] rb ringbuffer instance +* +* @retval true empty +* @retval false not empty +*****************************************************************************/ +bool chry_ringbuffer_check_empty(chry_ringbuffer_t *rb) +{ + return rb->in == rb->out; +} + +/***************************************************************************** +* @brief write one byte to ringbuffer, +* should be add lock in multithread, +* in single write thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] byte data +* +* @retval true Success +* @retval false ringbuffer is full +*****************************************************************************/ +bool chry_ringbuffer_write_byte(chry_ringbuffer_t *rb, uint8_t byte) +{ + if (chry_ringbuffer_check_full(rb)) { + return false; + } + + ((uint8_t *)(rb->pool))[rb->in & rb->mask] = byte; + rb->in++; + return true; +} + +/***************************************************************************** +* @brief overwrite one byte to ringbuffer, drop oldest data, +* should be add lock always +* +* @param[in] rb ringbuffer instance +* @param[in] byte data +* +* @retval true Success +* @retval false always return true +*****************************************************************************/ +bool chry_ringbuffer_overwrite_byte(chry_ringbuffer_t *rb, uint8_t byte) +{ + if (chry_ringbuffer_check_full(rb)) { + rb->out++; + } + + ((uint8_t *)(rb->pool))[rb->in & rb->mask] = byte; + rb->in++; + return true; +} + +/***************************************************************************** +* @brief peek one byte from ringbuffer, +* should be add lock in multithread, +* in single read thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] byte pointer to save data +* +* @retval true Success +* @retval false ringbuffer is empty +*****************************************************************************/ +bool chry_ringbuffer_peek_byte(chry_ringbuffer_t *rb, uint8_t *byte) +{ + if (chry_ringbuffer_check_empty(rb)) { + return false; + } + + *byte = ((uint8_t *)(rb->pool))[rb->out & rb->mask]; + return true; +} + +/***************************************************************************** +* @brief read one byte from ringbuffer, +* should be add lock in multithread, +* in single read thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] byte pointer to save data +* +* @retval true Success +* @retval false ringbuffer is empty +*****************************************************************************/ +bool chry_ringbuffer_read_byte(chry_ringbuffer_t *rb, uint8_t *byte) +{ + bool ret; + ret = chry_ringbuffer_peek_byte(rb, byte); + rb->out += ret; + return ret; +} + +/***************************************************************************** +* @brief drop one byte from ringbuffer, +* should be add lock in multithread, +* in single read thread not need lock +* +* @param[in] rb ringbuffer instance +* +* @retval true Success +* @retval false ringbuffer is empty +*****************************************************************************/ +bool chry_ringbuffer_drop_byte(chry_ringbuffer_t *rb) +{ + if (chry_ringbuffer_check_empty(rb)) { + return false; + } + + rb->out += 1; + return true; +} + +/***************************************************************************** +* @brief write data to ringbuffer, +* should be add lock in multithread, +* in single write thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] data data pointer +* @param[in] size size in byte +* +* @retval uint32_t actual write size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_write(chry_ringbuffer_t *rb, void *data, uint32_t size) +{ + uint32_t unused; + uint32_t offset; + uint32_t remain; + + unused = (rb->mask + 1) - (rb->in - rb->out); + + if (size > unused) { + size = unused; + } + + offset = rb->in & rb->mask; + + remain = rb->mask + 1 - offset; + remain = remain > size ? size : remain; + + memcpy(((uint8_t *)(rb->pool)) + offset, data, remain); + memcpy(rb->pool, (uint8_t *)data + remain, size - remain); + + rb->in += size; + + return size; +} + +/***************************************************************************** +* @brief write data to ringbuffer, +* should be add lock always +* +* @param[in] rb ringbuffer instance +* @param[in] data data pointer +* @param[in] size size in byte +* +* @retval uint32_t actual write size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_overwrite(chry_ringbuffer_t *rb, void *data, uint32_t size) +{ + uint32_t unused; + uint32_t offset; + uint32_t remain; + + unused = (rb->mask + 1) - (rb->in - rb->out); + + if (size > unused) { + if (size > (rb->mask + 1)) { + size = rb->mask + 1; + } + + rb->out += size - unused; + } + + offset = rb->in & rb->mask; + + remain = rb->mask + 1 - offset; + remain = remain > size ? size : remain; + + memcpy(((uint8_t *)(rb->pool)) + offset, data, remain); + memcpy(rb->pool, (uint8_t *)data + remain, size - remain); + + rb->in += size; + + return size; +} + +/***************************************************************************** +* @brief peek data from ringbuffer +* should be add lock in multithread, +* in single read thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] data data pointer +* @param[in] size size in byte +* +* @retval uint32_t actual peek size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_peek(chry_ringbuffer_t *rb, void *data, uint32_t size) +{ + uint32_t used; + uint32_t offset; + uint32_t remain; + + used = rb->in - rb->out; + if (size > used) { + size = used; + } + + offset = rb->out & rb->mask; + + remain = rb->mask + 1 - offset; + remain = remain > size ? size : remain; + + memcpy(data, ((uint8_t *)(rb->pool)) + offset, remain); + memcpy((uint8_t *)data + remain, rb->pool, size - remain); + + return size; +} + +/***************************************************************************** +* @brief read data from ringbuffer +* should be add lock in multithread, +* in single read thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] data data pointer +* @param[in] size size in byte +* +* @retval uint32_t actual read size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_read(chry_ringbuffer_t *rb, void *data, uint32_t size) +{ + size = chry_ringbuffer_peek(rb, data, size); + rb->out += size; + return size; +} + +/***************************************************************************** +* @brief drop data from ringbuffer +* should be add lock in multithread, +* in single read thread not need lock +* +* @param[in] rb ringbuffer instance +* @param[in] size size in byte +* +* @retval uint32_t actual drop size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_drop(chry_ringbuffer_t *rb, uint32_t size) +{ + uint32_t used; + + used = rb->in - rb->out; + if (size > used) { + size = used; + } + + rb->out += size; + return size; +} + +/***************************************************************************** +* @brief linear write setup, get write pointer and max linear size. +* +* @param[in] rb ringbuffer instance +* @param[in] size pointer to store max linear size in byte +* +* @retval void* write memory pointer +*****************************************************************************/ +void *chry_ringbuffer_linear_write_setup(chry_ringbuffer_t *rb, uint32_t *size) +{ + uint32_t unused; + uint32_t offset; + uint32_t remain; + + unused = (rb->mask + 1) - (rb->in - rb->out); + + offset = rb->in & rb->mask; + + remain = rb->mask + 1 - offset; + remain = remain > unused ? unused : remain; + + if (remain) { + *size = remain; + return ((uint8_t *)(rb->pool)) + offset; + } else { + *size = unused - remain; + return rb->pool; + } +} + +/***************************************************************************** +* @brief linear read setup, get read pointer and max linear size. +* +* @param[in] rb ringbuffer instance +* @param[in] size pointer to store max linear size in byte +* +* @retval void* +*****************************************************************************/ +void *chry_ringbuffer_linear_read_setup(chry_ringbuffer_t *rb, uint32_t *size) +{ + uint32_t used; + uint32_t offset; + uint32_t remain; + + used = rb->in - rb->out; + + offset = rb->out & rb->mask; + + remain = rb->mask + 1 - offset; + remain = remain > used ? used : remain; + + if (remain) { + *size = remain; + return ((uint8_t *)(rb->pool)) + offset; + } else { + *size = used - remain; + return rb->pool; + } +} + +/***************************************************************************** +* @brief linear write done, add write pointer only +* +* @param[in] rb ringbuffer instance +* @param[in] size write size in byte +* +* @retval uint32_t actual write size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_linear_write_done(chry_ringbuffer_t *rb, uint32_t size) +{ + uint32_t unused; + + unused = (rb->mask + 1) - (rb->in - rb->out); + if (size > unused) { + size = unused; + } + rb->in += size; + + return size; +} + +/***************************************************************************** +* @brief linear read done, add read pointer only +* +* @param[in] rb ringbuffer instance +* @param[in] size read size in byte +* +* @retval uint32_t actual read size in byte +*****************************************************************************/ +uint32_t chry_ringbuffer_linear_read_done(chry_ringbuffer_t *rb, uint32_t size) +{ + return chry_ringbuffer_drop(rb, size); +} diff --git a/src/lib/CherryUSB/third_party/cherryrb/chry_ringbuffer.h b/src/lib/CherryUSB/third_party/cherryrb/chry_ringbuffer.h new file mode 100644 index 000000000..d40f74d20 --- /dev/null +++ b/src/lib/CherryUSB/third_party/cherryrb/chry_ringbuffer.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022, Egahp + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef CHRY_RINGBUFFER_H +#define CHRY_RINGBUFFER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +typedef struct { + uint32_t in; /*!< Define the write pointer. */ + uint32_t out; /*!< Define the read pointer. */ + uint32_t mask; /*!< Define the write and read pointer mask. */ + void *pool; /*!< Define the memory pointer. */ +} chry_ringbuffer_t; + +extern int chry_ringbuffer_init(chry_ringbuffer_t *rb, void *pool, uint32_t size); +extern void chry_ringbuffer_reset(chry_ringbuffer_t *rb); +extern void chry_ringbuffer_reset_read(chry_ringbuffer_t *rb); + +extern uint32_t chry_ringbuffer_get_size(chry_ringbuffer_t *rb); +extern uint32_t chry_ringbuffer_get_used(chry_ringbuffer_t *rb); +extern uint32_t chry_ringbuffer_get_free(chry_ringbuffer_t *rb); + +extern bool chry_ringbuffer_check_full(chry_ringbuffer_t *rb); +extern bool chry_ringbuffer_check_empty(chry_ringbuffer_t *rb); + +extern bool chry_ringbuffer_write_byte(chry_ringbuffer_t *rb, uint8_t byte); +extern bool chry_ringbuffer_overwrite_byte(chry_ringbuffer_t *rb, uint8_t byte); +extern bool chry_ringbuffer_peek_byte(chry_ringbuffer_t *rb, uint8_t *byte); +extern bool chry_ringbuffer_read_byte(chry_ringbuffer_t *rb, uint8_t *byte); +extern bool chry_ringbuffer_drop_byte(chry_ringbuffer_t *rb); + +extern uint32_t chry_ringbuffer_write(chry_ringbuffer_t *rb, void *data, uint32_t size); +extern uint32_t chry_ringbuffer_overwrite(chry_ringbuffer_t *rb, void *data, uint32_t size); +extern uint32_t chry_ringbuffer_peek(chry_ringbuffer_t *rb, void *data, uint32_t size); +extern uint32_t chry_ringbuffer_read(chry_ringbuffer_t *rb, void *data, uint32_t size); +extern uint32_t chry_ringbuffer_drop(chry_ringbuffer_t *rb, uint32_t size); + +extern void *chry_ringbuffer_linear_write_setup(chry_ringbuffer_t *rb, uint32_t *size); +extern void *chry_ringbuffer_linear_read_setup(chry_ringbuffer_t *rb, uint32_t *size); +extern uint32_t chry_ringbuffer_linear_write_done(chry_ringbuffer_t *rb, uint32_t size); +extern uint32_t chry_ringbuffer_linear_read_done(chry_ringbuffer_t *rb, uint32_t size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/lib/CherryUSB/third_party/dhcp-server/dhserver.c b/src/lib/CherryUSB/third_party/dhcp-server/dhserver.c new file mode 100644 index 000000000..09e9d7469 --- /dev/null +++ b/src/lib/CherryUSB/third_party/dhcp-server/dhserver.c @@ -0,0 +1,338 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 by Sergey Fetisov + * + * 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 "dhserver.h" + +/* DHCP message type */ +#define DHCP_DISCOVER 1 +#define DHCP_OFFER 2 +#define DHCP_REQUEST 3 +#define DHCP_DECLINE 4 +#define DHCP_ACK 5 +#define DHCP_NAK 6 +#define DHCP_RELEASE 7 +#define DHCP_INFORM 8 + +/* DHCP options */ +enum DHCP_OPTIONS { + DHCP_PAD = 0, + DHCP_SUBNETMASK = 1, + DHCP_ROUTER = 3, + DHCP_DNSSERVER = 6, + DHCP_HOSTNAME = 12, + DHCP_DNSDOMAIN = 15, + DHCP_MTU = 26, + DHCP_BROADCAST = 28, + DHCP_PERFORMROUTERDISC = 31, + DHCP_STATICROUTE = 33, + DHCP_NISDOMAIN = 40, + DHCP_NISSERVER = 41, + DHCP_NTPSERVER = 42, + DHCP_VENDOR = 43, + DHCP_IPADDRESS = 50, + DHCP_LEASETIME = 51, + DHCP_OPTIONSOVERLOADED = 52, + DHCP_MESSAGETYPE = 53, + DHCP_SERVERID = 54, + DHCP_PARAMETERREQUESTLIST = 55, + DHCP_MESSAGE = 56, + DHCP_MAXMESSAGESIZE = 57, + DHCP_RENEWALTIME = 58, + DHCP_REBINDTIME = 59, + DHCP_CLASSID = 60, + DHCP_CLIENTID = 61, + DHCP_USERCLASS = 77, /* RFC 3004 */ + DHCP_FQDN = 81, + DHCP_DNSSEARCH = 119, /* RFC 3397 */ + DHCP_CSR = 121, /* RFC 3442 */ + DHCP_MSCSR = 249, /* MS code for RFC 3442 */ + DHCP_END = 255 +}; + +typedef struct { + uint8_t dp_op; /* packet opcode type */ + uint8_t dp_htype; /* hardware addr type */ + uint8_t dp_hlen; /* hardware addr length */ + uint8_t dp_hops; /* gateway hops */ + uint32_t dp_xid; /* transaction ID */ + uint16_t dp_secs; /* seconds since boot began */ + uint16_t dp_flags; + uint8_t dp_ciaddr[4]; /* client IP address */ + uint8_t dp_yiaddr[4]; /* 'your' IP address */ + uint8_t dp_siaddr[4]; /* server IP address */ + uint8_t dp_giaddr[4]; /* gateway IP address */ + uint8_t dp_chaddr[16]; /* client hardware address */ + uint8_t dp_legacy[192]; + uint8_t dp_magic[4]; + uint8_t dp_options[275]; /* options area */ +} DHCP_TYPE; + +DHCP_TYPE dhcp_data; +static struct udp_pcb *pcb = NULL; +static dhcp_config_t *config = NULL; + +char magic_cookie[] = { 0x63, 0x82, 0x53, 0x63 }; + +static dhcp_entry_t *entry_by_ip(uint32_t ip) +{ + int i; + for (i = 0; i < config->num_entry; i++) + if (*(uint32_t *)config->entries[i].addr == ip) + return &config->entries[i]; + return NULL; +} + +static dhcp_entry_t *entry_by_mac(uint8_t *mac) +{ + int i; + for (i = 0; i < config->num_entry; i++) + if (memcmp(config->entries[i].mac, mac, 6) == 0) + return &config->entries[i]; + return NULL; +} + +static inline bool is_vacant(dhcp_entry_t *entry) +{ + return memcmp("\0\0\0\0\0", entry->mac, 6) == 0; +} + +static dhcp_entry_t *vacant_address(void) +{ + int i; + for (i = 0; i < config->num_entry; i++) + if (is_vacant(config->entries + i)) + return config->entries + i; + return NULL; +} + +static inline void free_entry(dhcp_entry_t *entry) +{ + memset(entry->mac, 0, 6); +} + +uint8_t *find_dhcp_option(uint8_t *attrs, int size, uint8_t attr) +{ + int i = 0; + while ((i + 1) < size) { + int next = i + attrs[i + 1] + 2; + if (next > size) + return NULL; + if (attrs[i] == attr) + return attrs + i; + i = next; + } + return NULL; +} + +int fill_options(void *dest, + uint8_t msg_type, + const char *domain, + uint32_t dns, + int lease_time, + uint32_t serverid, + uint32_t router, + uint32_t subnet) +{ + uint8_t *ptr = (uint8_t *)dest; + /* ACK message type */ + *ptr++ = 53; + *ptr++ = 1; + *ptr++ = msg_type; + + /* dhcp server identifier */ + *ptr++ = DHCP_SERVERID; + *ptr++ = 4; + *(uint32_t *)ptr = serverid; + ptr += 4; + + /* lease time */ + *ptr++ = DHCP_LEASETIME; + *ptr++ = 4; + *ptr++ = (lease_time >> 24) & 0xFF; + *ptr++ = (lease_time >> 16) & 0xFF; + *ptr++ = (lease_time >> 8) & 0xFF; + *ptr++ = (lease_time >> 0) & 0xFF; + + /* subnet mask */ + *ptr++ = DHCP_SUBNETMASK; + *ptr++ = 4; + *(uint32_t *)ptr = subnet; + ptr += 4; + + /* router */ + if (router != 0) { + *ptr++ = DHCP_ROUTER; + *ptr++ = 4; + *(uint32_t *)ptr = router; + ptr += 4; + } + + /* domain name */ + if (domain != NULL) { + int len = strlen(domain); + *ptr++ = DHCP_DNSDOMAIN; + *ptr++ = len; + memcpy(ptr, domain, len); + ptr += len; + } + + /* domain name server (DNS) */ + if (dns != 0) { + *ptr++ = DHCP_DNSSERVER; + *ptr++ = 4; + *(uint32_t *)ptr = dns; + ptr += 4; + } + + /* end */ + *ptr++ = DHCP_END; + return ptr - (uint8_t *)dest; +} + +static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) +{ + (void)arg; + (void)addr; + uint8_t *ptr; + dhcp_entry_t *entry; + struct pbuf *pp; + + uint32_t n = p->len; + if (n > sizeof(dhcp_data)) + n = sizeof(dhcp_data); + memcpy(&dhcp_data, p->payload, n); + switch (dhcp_data.dp_options[2]) { + case DHCP_DISCOVER: + entry = entry_by_mac(dhcp_data.dp_chaddr); + if (entry == NULL) + entry = vacant_address(); + if (entry == NULL) + break; + + dhcp_data.dp_op = 2; /* reply */ + dhcp_data.dp_secs = 0; + dhcp_data.dp_flags = 0; + *(uint32_t *)dhcp_data.dp_yiaddr = *(uint32_t *)entry->addr; + memcpy(dhcp_data.dp_magic, magic_cookie, 4); + + memset(dhcp_data.dp_options, 0, sizeof(dhcp_data.dp_options)); + + fill_options(dhcp_data.dp_options, + DHCP_OFFER, + config->domain, + *(uint32_t *)config->dns, + entry->lease, + *(uint32_t *)config->addr, + *(uint32_t *)config->addr, + *(uint32_t *)entry->subnet); + + pp = pbuf_alloc(PBUF_TRANSPORT, sizeof(dhcp_data), PBUF_POOL); + if (pp == NULL) + break; + memcpy(pp->payload, &dhcp_data, sizeof(dhcp_data)); + udp_sendto(upcb, pp, IP_ADDR_BROADCAST, port); + pbuf_free(pp); + break; + + case DHCP_REQUEST: + /* 1. find requested ipaddr in option list */ + ptr = find_dhcp_option(dhcp_data.dp_options, sizeof(dhcp_data.dp_options), DHCP_IPADDRESS); + if (ptr == NULL) + break; + if (ptr[1] != 4) + break; + ptr += 2; + + /* 2. does hw-address registered? */ + entry = entry_by_mac(dhcp_data.dp_chaddr); + if (entry != NULL) + free_entry(entry); + + /* 3. find requested ipaddr */ + entry = entry_by_ip(*(uint32_t *)ptr); + if (entry == NULL) + break; + if (!is_vacant(entry)) + break; + + /* 4. fill struct fields */ + memcpy(dhcp_data.dp_yiaddr, ptr, 4); + dhcp_data.dp_op = 2; /* reply */ + dhcp_data.dp_secs = 0; + dhcp_data.dp_flags = 0; + memcpy(dhcp_data.dp_magic, magic_cookie, 4); + + /* 5. fill options */ + memset(dhcp_data.dp_options, 0, sizeof(dhcp_data.dp_options)); + + fill_options(dhcp_data.dp_options, + DHCP_ACK, + config->domain, + *(uint32_t *)config->dns, + entry->lease, + *(uint32_t *)config->addr, + *(uint32_t *)config->addr, + *(uint32_t *)entry->subnet); + + /* 6. send ACK */ + pp = pbuf_alloc(PBUF_TRANSPORT, sizeof(dhcp_data), PBUF_POOL); + if (pp == NULL) + break; + memcpy(entry->mac, dhcp_data.dp_chaddr, 6); + memcpy(pp->payload, &dhcp_data, sizeof(dhcp_data)); + udp_sendto(upcb, pp, IP_ADDR_BROADCAST, port); + pbuf_free(pp); + break; + + default: + break; + } + pbuf_free(p); +} + +err_t dhserv_init(dhcp_config_t *c) +{ + err_t err; + udp_init(); + dhserv_free(); + pcb = udp_new(); + if (pcb == NULL) + return ERR_MEM; + err = udp_bind(pcb, IP_ADDR_ANY, c->port); + if (err != ERR_OK) { + dhserv_free(); + return err; + } + udp_recv(pcb, udp_recv_proc, NULL); + config = c; + return ERR_OK; +} + +void dhserv_free(void) +{ + if (pcb == NULL) + return; + udp_remove(pcb); + pcb = NULL; +} diff --git a/src/lib/CherryUSB/third_party/dhcp-server/dhserver.h b/src/lib/CherryUSB/third_party/dhcp-server/dhserver.h new file mode 100644 index 000000000..039f0665b --- /dev/null +++ b/src/lib/CherryUSB/third_party/dhcp-server/dhserver.h @@ -0,0 +1,61 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 by Sergey Fetisov + * + * 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. + */ + +/* + * version: 1.0 demo (7.02.2015) + * brief: tiny dhcp ipv4 server using lwip (pcb) + * ref: https://lists.gnu.org/archive/html/lwip-users/2012-12/msg00016.html + */ + +#ifndef DHSERVER_H +#define DHSERVER_H + +#include +#include +#include +#include +#include "lwip/err.h" +#include "lwip/udp.h" +#include "netif/etharp.h" + +typedef struct dhcp_entry { + uint8_t mac[6]; + uint8_t addr[4]; + uint8_t subnet[4]; + uint32_t lease; +} dhcp_entry_t; + +typedef struct dhcp_config { + uint8_t addr[4]; + uint16_t port; + uint8_t dns[4]; + const char *domain; + int num_entry; + dhcp_entry_t *entries; +} dhcp_config_t; + +err_t dhserv_init(dhcp_config_t *config); +void dhserv_free(void); + +#endif /* DHSERVER_H */ diff --git a/src/lib/CherryUSB/third_party/dns-server/dnserver.c b/src/lib/CherryUSB/third_party/dns-server/dnserver.c new file mode 100644 index 000000000..c162064da --- /dev/null +++ b/src/lib/CherryUSB/third_party/dns-server/dnserver.c @@ -0,0 +1,198 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 by Sergey Fetisov + * + * 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. + */ + +/* + * version: 1.0 demo (7.02.2015) + * brief: tiny dns ipv4 server using lwip (pcb) + */ + +#include "dnserver.h" + +#define DNS_MAX_HOST_NAME_LEN 128 + +static struct udp_pcb *pcb; +dns_query_proc_t query_proc; + +#pragma pack(push, 1) +typedef struct { +#if BYTE_ORDER == LITTLE_ENDIAN + uint8_t rd : 1, /* Recursion Desired */ + tc : 1, /* Truncation Flag */ + aa : 1, /* Authoritative Answer Flag */ + opcode : 4, /* Operation code */ + qr : 1; /* Query/Response Flag */ + uint8_t rcode : 4, /* Response Code */ + z : 3, /* Zero */ + ra : 1; /* Recursion Available */ +#else + uint8_t qr : 1, /* Query/Response Flag */ + opcode : 4, /* Operation code */ + aa : 1, /* Authoritative Answer Flag */ + tc : 1, /* Truncation Flag */ + rd : 1; /* Recursion Desired */ + uint8_t ra : 1, /* Recursion Available */ + z : 3, /* Zero */ + rcode : 4; /* Response Code */ +#endif +} dns_header_flags_t; + +typedef struct { + uint16_t id; + dns_header_flags_t flags; + uint16_t n_record[4]; +} dns_header_t; + +typedef struct dns_answer { + uint16_t name; + uint16_t type; + uint16_t Class; + uint32_t ttl; + uint16_t len; + uint32_t addr; +} dns_answer_t; +#pragma pack(pop) + +typedef struct dns_query { + char name[DNS_MAX_HOST_NAME_LEN]; + uint16_t type; + uint16_t Class; +} dns_query_t; + +static int parse_next_query(void *data, int size, dns_query_t *query) +{ + int len; + int lables; + uint8_t *ptr; + + len = 0; + lables = 0; + ptr = (uint8_t *)data; + + while (true) { + uint8_t lable_len; + if (size <= 0) + return -1; + lable_len = *ptr++; + size--; + if (lable_len == 0) + break; + if (lables > 0) { + if (len == DNS_MAX_HOST_NAME_LEN) + return -2; + query->name[len++] = '.'; + } + if (lable_len > size) + return -1; + if (len + lable_len >= DNS_MAX_HOST_NAME_LEN) + return -2; + memcpy(&query->name[len], ptr, lable_len); + len += lable_len; + ptr += lable_len; + size -= lable_len; + lables++; + } + + if (size < 4) + return -1; + query->name[len] = 0; + query->type = *(uint16_t *)ptr; + ptr += 2; + query->Class = *(uint16_t *)ptr; + ptr += 2; + return ptr - (uint8_t *)data; +} + +static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) +{ + (void)arg; + int len; + dns_header_t *header; + static dns_query_t query; + struct pbuf *out; + ip_addr_t host_addr; + dns_answer_t *answer; + + if (p->len <= sizeof(dns_header_t)) + goto error; + header = (dns_header_t *)p->payload; + if (header->flags.qr != 0) + goto error; + if (ntohs(header->n_record[0]) != 1) + goto error; + + len = parse_next_query(header + 1, p->len - sizeof(dns_header_t), &query); + if (len < 0) + goto error; + if (!query_proc(query.name, &host_addr)) + goto error; + + len += sizeof(dns_header_t); + out = pbuf_alloc(PBUF_TRANSPORT, len + 16, PBUF_POOL); + if (out == NULL) + goto error; + + memcpy(out->payload, p->payload, len); + header = (dns_header_t *)out->payload; + header->flags.qr = 1; + header->n_record[1] = htons(1); + answer = (struct dns_answer *)((uint8_t *)out->payload + len); + answer->name = htons(0xC00C); + answer->type = htons(1); + answer->Class = htons(1); + answer->ttl = htonl(32); + answer->len = htons(4); + answer->addr = host_addr.addr; + + udp_sendto(upcb, out, addr, port); + pbuf_free(out); + +error: + pbuf_free(p); +} + +err_t dnserv_init(const ip_addr_t *bind, uint16_t port, dns_query_proc_t qp) +{ + err_t err; + udp_init(); + dnserv_free(); + pcb = udp_new(); + if (pcb == NULL) + return ERR_MEM; + err = udp_bind(pcb, bind, port); + if (err != ERR_OK) { + dnserv_free(); + return err; + } + udp_recv(pcb, udp_recv_proc, NULL); + query_proc = qp; + return ERR_OK; +} + +void dnserv_free(void) +{ + if (pcb == NULL) + return; + udp_remove(pcb); + pcb = NULL; +} diff --git a/src/lib/CherryUSB/third_party/dns-server/dnserver.h b/src/lib/CherryUSB/third_party/dns-server/dnserver.h new file mode 100644 index 000000000..bcaef412b --- /dev/null +++ b/src/lib/CherryUSB/third_party/dns-server/dnserver.h @@ -0,0 +1,47 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 by Sergey Fetisov + * + * 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. + */ + +/* + * version: 1.0 demo (7.02.2015) + * brief: tiny dns ipv4 server using lwip (pcb) + */ + +#ifndef DNSERVER +#define DNSERVER + +#include +#include +#include +#include +#include "lwip/def.h" +#include "lwip/err.h" +#include "lwip/udp.h" +#include "netif/etharp.h" + +typedef bool (*dns_query_proc_t)(const char *name, ip_addr_t *addr); + +err_t dnserv_init(const ip_addr_t *bind, uint16_t port, dns_query_proc_t query_proc); +void dnserv_free(void); + +#endif diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/LICENSE.txt b/src/lib/CherryUSB/third_party/fatfs-0.14/LICENSE.txt new file mode 100644 index 000000000..a9e57a905 --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/LICENSE.txt @@ -0,0 +1,24 @@ +FatFs License + +FatFs has being developped as a personal project of the author, ChaN. It is free from the code anyone else wrote at current release. Following code block shows a copy of the FatFs license document that heading the source files. + +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem Module Rx.xx / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 20xx, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ + +Therefore FatFs license is one of the BSD-style licenses, but there is a significant feature. FatFs is mainly intended for embedded systems. In order to extend the usability for commercial products, the redistributions of FatFs in binary form, such as embedded code, binary library and any forms without source code, do not need to include about FatFs in the documentations. This is equivalent to the 1-clause BSD license. Of course FatFs is compatible with the most of open source software licenses include GNU GPL. When you redistribute the FatFs source code with changes or create a fork, the license can also be changed to GNU GPL, BSD-style license or any open source software license that not conflict with FatFs license. diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/00history.txt b/src/lib/CherryUSB/third_party/fatfs-0.14/source/00history.txt new file mode 100644 index 000000000..8a0169b1f --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/00history.txt @@ -0,0 +1,359 @@ +---------------------------------------------------------------------------- + Revision history of FatFs module +---------------------------------------------------------------------------- + +R0.00 (February 26, 2006) + + Prototype. + + + +R0.01 (April 29, 2006) + + The first release. + + + +R0.02 (June 01, 2006) + + Added FAT12 support. + Removed unbuffered mode. + Fixed a problem on small (<32M) partition. + + + +R0.02a (June 10, 2006) + + Added a configuration option (_FS_MINIMUM). + + + +R0.03 (September 22, 2006) + + Added f_rename(). + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + + +R0.03a (December 11, 2006) + + Improved cluster scan algorithm to write files fast. + Fixed f_mkdir() creates incorrect directory on FAT32. + + + +R0.04 (February 04, 2007) + + Added f_mkfs(). + Supported multiple drive system. + Changed some interfaces for multiple drive system. + Changed f_mountdrv() to f_mount(). + + + +R0.04a (April 01, 2007) + + Supported multiple partitions on a physical drive. + Added a capability of extending file size to f_lseek(). + Added minimization level 3. + Fixed an endian sensitive code in f_mkfs(). + + + +R0.04b (May 05, 2007) + + Added a configuration option _USE_NTFLAG. + Added FSINFO support. + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (<= csize) collapses the file object. + + + +R0.05 (August 25, 2007) + + Changed arguments of f_read(), f_write() and f_mkfs(). + Fixed f_mkfs() on FAT32 creates incorrect FSINFO. + Fixed f_mkdir() on FAT32 creates incorrect directory. + + + +R0.05a (February 03, 2008) + + Added f_truncate() and f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + + +R0.06 (April 01, 2008) + + Added fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on moving to the same or following cluster. + + + +R0.07 (April 01, 2009) + + Merged Tiny-FatFs as a configuration option. (_FS_TINY) + Added long file name feature. (_USE_LFN) + Added multiple code page feature. (_CODE_PAGE) + Added re-entrancy for multitask operation. (_FS_REENTRANT) + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + + +R0.07a (April 14, 2009) + + Septemberarated out OS dependent code on reentrant cfg. + Added multiple sector size feature. + + + +R0.07c (June 21, 2009) + + Fixed f_unlink() can return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir() and f_chdrive(). + Added proper case conversion to extended character. + + + +R0.07e (November 03, 2009) + + Septemberarated out configuration options from ff.h to ffconf.h. + Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH. + Fixed name matching error on the 13 character boundary. + Added a configuration option, _LFN_UNICODE. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. + + + +R0.08 (May 15, 2010) + + Added a memory configuration option. (_USE_LFN = 3) + Added file lock feature. (_FS_SHARE) + Added fast seek feature. (_USE_FASTSEEK) + Changed some types on the API, XCHAR->TCHAR. + Changed .fname in the FILINFO structure on Unicode cfg. + String functions support UTF-8 encoding files on Unicode cfg. + + + +R0.08a (August 16, 2010) + + Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed f_mkfs() creates wrong FAT32 volume. + + + +R0.08b (January 15, 2011) + + Fast seek feature is also applied to f_read() and f_write(). + f_lseek() reports required table size on creating CLMP. + Extended format syntax of f_printf(). + Ignores duplicated directory separators in given path name. + + + +R0.09 (September 06, 2011) + + f_mkfs() supports multiple partition to complete the multiple partition feature. + Added f_fdisk(). + + + +R0.09a (August 27, 2012) + + Changed f_open() and f_opendir() reject null object pointer to avoid crash. + Changed option name _FS_SHARE to _FS_LOCK. + Fixed assertion failure due to OS/2 EA on FAT12/16 volume. + + + +R0.09b (January 24, 2013) + + Added f_setlabel() and f_getlabel(). + + + +R0.10 (October 02, 2013) + + Added selection of character encoding on the file. (_STRF_ENCODE) + Added f_closedir(). + Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) + Added forced mount feature with changes of f_mount(). + Improved behavior of volume auto detection. + Improved write throughput of f_puts() and f_printf(). + Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). + Fixed f_write() can be truncated when the file size is close to 4GB. + Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error. + + + +R0.10a (January 15, 2014) + + Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) + Added a configuration option of minimum sector size. (_MIN_SS) + 2nd argument of f_rename() can have a drive number and it will be ignored. + Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10) + Fixed f_close() invalidates the file object without volume lock. + Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10) + Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07) + + + +R0.10b (May 19, 2014) + + Fixed a hard error in the disk I/O layer can collapse the directory entry. + Fixed LFN entry is not deleted when delete/rename an object with lossy converted SFN. (appeared at R0.07) + + + +R0.10c (November 09, 2014) + + Added a configuration option for the platforms without RTC. (_FS_NORTC) + Changed option name _USE_ERASE to _USE_TRIM. + Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b) + Fixed a potential problem of FAT access that can appear on disk error. + Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08) + + + +R0.11 (February 09, 2015) + + Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND) + Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c) + Fixed _FS_NORTC option does not work properly. (appeared at R0.10c) + + + +R0.11a (September 05, 2015) + + Fixed wrong media change can lead a deadlock at thread-safe configuration. + Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE) + Removed some code pages actually not exist on the standard systems. (_CODE_PAGE) + Fixed errors in the case conversion teble of code page 437 and 850 (ff.c). + Fixed errors in the case conversion teble of Unicode (cc*.c). + + + +R0.12 (April 12, 2016) + + Added support for exFAT file system. (_FS_EXFAT) + Added f_expand(). (_USE_EXPAND) + Changed some members in FINFO structure and behavior of f_readdir(). + Added an option _USE_CHMOD. + Removed an option _WORD_ACCESS. + Fixed errors in the case conversion table of Unicode (cc*.c). + + + +R0.12a (July 10, 2016) + + Added support for creating exFAT volume with some changes of f_mkfs(). + Added a file open method FA_OPEN_APPEND. An f_lseek() following f_open() is no longer needed. + f_forward() is available regardless of _FS_TINY. + Fixed f_mkfs() creates wrong volume. (appeared at R0.12) + Fixed wrong memory read in create_name(). (appeared at R0.12) + Fixed compilation fails at some configurations, _USE_FASTSEEK and _USE_FORWARD. + + + +R0.12b (September 04, 2016) + + Made f_rename() be able to rename objects with the same name but case. + Fixed an error in the case conversion teble of code page 866. (ff.c) + Fixed writing data is truncated at the file offset 4GiB on the exFAT volume. (appeared at R0.12) + Fixed creating a file in the root directory of exFAT volume can fail. (appeared at R0.12) + Fixed f_mkfs() creating exFAT volume with too small cluster size can collapse unallocated memory. (appeared at R0.12) + Fixed wrong object name can be returned when read directory at Unicode cfg. (appeared at R0.12) + Fixed large file allocation/removing on the exFAT volume collapses allocation bitmap. (appeared at R0.12) + Fixed some internal errors in f_expand() and f_lseek(). (appeared at R0.12) + + + +R0.12c (March 04, 2017) + + Improved write throughput at the fragmented file on the exFAT volume. + Made memory usage for exFAT be able to be reduced as decreasing _MAX_LFN. + Fixed successive f_getfree() can return wrong count on the FAT12/16 volume. (appeared at R0.12) + Fixed configuration option _VOLUMES cannot be set 10. (appeared at R0.10c) + + + +R0.13 (May 21, 2017) + + Changed heading character of configuration keywords "_" to "FF_". + Removed ASCII-only configuration, FF_CODE_PAGE = 1. Use FF_CODE_PAGE = 437 instead. + Added f_setcp(), run-time code page configuration. (FF_CODE_PAGE = 0) + Improved cluster allocation time on stretch a deep buried cluster chain. + Improved processing time of f_mkdir() with large cluster size by using FF_USE_LFN = 3. + Improved NoFatChain flag of the fragmented file to be set after it is truncated and got contiguous. + Fixed archive attribute is left not set when a file on the exFAT volume is renamed. (appeared at R0.12) + Fixed exFAT FAT entry can be collapsed when write or lseek operation to the existing file is done. (appeared at R0.12c) + Fixed creating a file can fail when a new cluster allocation to the exFAT directory occures. (appeared at R0.12c) + + + +R0.13a (October 14, 2017) + + Added support for UTF-8 encoding on the API. (FF_LFN_UNICODE = 2) + Added options for file name output buffer. (FF_LFN_BUF, FF_SFN_BUF). + Added dynamic memory allocation option for working buffer of f_mkfs() and f_fdisk(). + Fixed f_fdisk() and f_mkfs() create the partition table with wrong CHS parameters. (appeared at R0.09) + Fixed f_unlink() can cause lost clusters at fragmented file on the exFAT volume. (appeared at R0.12c) + Fixed f_setlabel() rejects some valid characters for exFAT volume. (appeared at R0.12) + + + +R0.13b (April 07, 2018) + + Added support for UTF-32 encoding on the API. (FF_LFN_UNICODE = 3) + Added support for Unix style volume ID. (FF_STR_VOLUME_ID = 2) + Fixed accesing any object on the exFAT root directory beyond the cluster boundary can fail. (appeared at R0.12c) + Fixed f_setlabel() does not reject some invalid characters. (appeared at R0.09b) + + + +R0.13c (October 14, 2018) + Supported stdint.h for C99 and later. (integer.h was included in ff.h) + Fixed reading a directory gets infinite loop when the last directory entry is not empty. (appeared at R0.12) + Fixed creating a sub-directory in the fragmented sub-directory on the exFAT volume collapses FAT chain of the parent directory. (appeared at R0.12) + Fixed f_getcwd() cause output buffer overrun when the buffer has a valid drive number. (appeared at R0.13b) + + + +R0.14 (October 14, 2019) + Added support for 64-bit LBA and GUID partition table (FF_LBA64 = 1) + Changed some API functions, f_mkfs() and f_fdisk(). + Fixed f_open() function cannot find the file with file name in length of FF_MAX_LFN characters. + Fixed f_readdir() function cannot retrieve long file names in length of FF_MAX_LFN - 1 characters. + Fixed f_readdir() function returns file names with wrong case conversion. (appeared at R0.12) + Fixed f_mkfs() function can fail to create exFAT volume in the second partition. (appeared at R0.12) + + +R0.14a (December 5, 2020) + Limited number of recursive calls in f_findnext(). + Fixed old floppy disks formatted with MS-DOS 2.x and 3.x cannot be mounted. + Fixed some compiler warnings. + + + +R0.14b (April 17, 2021) + Made FatFs uses standard library for copy, compare and search instead of built-in string functions. + Added support for long long integer and floating point to f_printf(). (FF_STRF_LLI and FF_STRF_FP) + Made path name parser ignore the terminating separator to allow "dir/". + Improved the compatibility in Unix style path name feature. + Fixed the file gets dead-locked when f_open() failed with some conditions. (appeared at R0.12a) + Fixed f_mkfs() can create wrong exFAT volume due to a timing dependent error. (appeared at R0.12) + Fixed code page 855 cannot be set by f_setcp(). + Fixed some compiler warnings. + + diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/00readme.txt b/src/lib/CherryUSB/third_party/fatfs-0.14/source/00readme.txt new file mode 100644 index 000000000..4960997b3 --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/00readme.txt @@ -0,0 +1,21 @@ +FatFs Module Source Files R0.14b + + +FILES + + 00readme.txt This file. + 00history.txt Revision history. + ff.c FatFs module. + ffconf.h Configuration file of FatFs module. + ff.h Common include file for FatFs and application module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c An example of glue function to attach existing disk I/O module to FatFs. + ffunicode.c Optional Unicode utility functions. + ffsystem.c An example of optional O/S related functions. + + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and it does not depend on any specific + storage device. You need to provide a low level disk I/O module written to + control the storage device that attached to the target system. + diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/diskio.c b/src/lib/CherryUSB/third_party/fatfs-0.14/source/diskio.c new file mode 100644 index 000000000..a73dabb3b --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/diskio.c @@ -0,0 +1,229 @@ +/*-----------------------------------------------------------------------*/ +/* Low level disk I/O module SKELETON for FatFs (C)ChaN, 2019 */ +/*-----------------------------------------------------------------------*/ +/* If a working storage control module is available, it should be */ +/* attached to the FatFs via a glue function rather than modifying it. */ +/* This is an example of glue functions to attach various exsisting */ +/* storage control modules to the FatFs module with a defined API. */ +/*-----------------------------------------------------------------------*/ + +#include "ff.h" /* Obtains integer types */ +#include "diskio.h" /* Declarations of disk functions */ + +/* Definitions of physical drive number for each drive */ +#define DEV_RAM 0 /* Example: Map Ramdisk to physical drive 0 */ +#define DEV_MMC 1 /* Example: Map MMC/SD card to physical drive 1 */ +#define DEV_USB 2 /* Example: Map USB MSD to physical drive 2 */ + +int USB_disk_status(void); +int USB_disk_initialize(void); +int USB_disk_read(BYTE *buff, LBA_t sector, UINT count); +int USB_disk_write(const BYTE *buff, LBA_t sector, UINT count); +int USB_disk_ioctl(BYTE cmd, void *buff); +/*-----------------------------------------------------------------------*/ +/* Get Drive Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + DSTATUS stat; + + switch (pdrv) { + case DEV_RAM : + //stat = RAM_disk_status(); + + // translate the reslut code here + + return stat; + + case DEV_MMC : + //stat = MMC_disk_status(); + + // translate the reslut code here + + return stat; + + case DEV_USB : + stat = USB_disk_status(); + + // translate the reslut code here + + return stat; + } + return STA_NOINIT; +} + + + +/*-----------------------------------------------------------------------*/ +/* Inidialize a Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + DSTATUS stat; + + switch (pdrv) { + case DEV_RAM : + //stat = RAM_disk_initialize(); + + // translate the reslut code here + + return stat; + + case DEV_MMC : + //stat = MMC_disk_initialize(); + + // translate the reslut code here + + return stat; + + case DEV_USB : + stat = USB_disk_initialize(); + + // translate the reslut code here + + return stat; + } + return STA_NOINIT; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + BYTE *buff, /* Data buffer to store read data */ + LBA_t sector, /* Start sector in LBA */ + UINT count /* Number of sectors to read */ +) +{ + DRESULT res; + + switch (pdrv) { + case DEV_RAM : + // translate the arguments here + + //res = RAM_disk_read(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_MMC : + // translate the arguments here + + //res = MMC_disk_read(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_USB : + // translate the arguments here + + res = USB_disk_read(buff, sector, count); + + // translate the reslut code here + + return res; + } + + return RES_PARERR; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if FF_FS_READONLY == 0 + +DRESULT disk_write ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + const BYTE *buff, /* Data to be written */ + LBA_t sector, /* Start sector in LBA */ + UINT count /* Number of sectors to write */ +) +{ + DRESULT res; + + switch (pdrv) { + case DEV_RAM : + // translate the arguments here + + //res = RAM_disk_write(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_MMC : + // translate the arguments here + + //res = MMC_disk_write(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_USB : + // translate the arguments here + + res = USB_disk_write(buff, sector, count); + + // translate the reslut code here + + return res; + } + + return RES_PARERR; +} + +#endif + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE pdrv, /* Physical drive nmuber (0..) */ + BYTE cmd, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + int result; + + switch (pdrv) { + case DEV_RAM : + + // Process of the command for the RAM drive + + return res; + + case DEV_MMC : + + // Process of the command for the MMC/SD card + + return res; + + case DEV_USB : + + // Process of the command the USB drive + res = USB_disk_ioctl(cmd,buff); + return res; + } + + return RES_PARERR; +} + diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/diskio.h b/src/lib/CherryUSB/third_party/fatfs-0.14/source/diskio.h new file mode 100644 index 000000000..e4ead7838 --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/diskio.h @@ -0,0 +1,77 @@ +/*-----------------------------------------------------------------------/ +/ Low level disk interface modlue include file (C)ChaN, 2019 / +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO_DEFINED +#define _DISKIO_DEFINED + +#ifdef __cplusplus +extern "C" { +#endif + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + + +DSTATUS disk_initialize (BYTE pdrv); +DSTATUS disk_status (BYTE pdrv); +DRESULT disk_read (BYTE pdrv, BYTE* buff, LBA_t sector, UINT count); +DRESULT disk_write (BYTE pdrv, const BYTE* buff, LBA_t sector, UINT count); +DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); + + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl fucntion */ + +/* Generic command (Used by FatFs) */ +#define CTRL_SYNC 0 /* Complete pending write process (needed at FF_FS_READONLY == 0) */ +#define GET_SECTOR_COUNT 1 /* Get media size (needed at FF_USE_MKFS == 1) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at FF_USE_MKFS == 1) */ +#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */ + +/* Generic command (Not used by FatFs) */ +#define CTRL_POWER 5 /* Get/Set power status */ +#define CTRL_LOCK 6 /* Lock/Unlock media removal */ +#define CTRL_EJECT 7 /* Eject media */ +#define CTRL_FORMAT 8 /* Create physical format on the media */ + +/* MMC/SDC specific ioctl command */ +#define MMC_GET_TYPE 10 /* Get card type */ +#define MMC_GET_CSD 11 /* Get CSD */ +#define MMC_GET_CID 12 /* Get CID */ +#define MMC_GET_OCR 13 /* Get OCR */ +#define MMC_GET_SDSTAT 14 /* Get SD status */ +#define ISDIO_READ 55 /* Read data form SD iSDIO register */ +#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ +#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ + +/* ATA/CF specific ioctl command */ +#define ATA_GET_REV 20 /* Get F/W revision */ +#define ATA_GET_MODEL 21 /* Get model name */ +#define ATA_GET_SN 22 /* Get serial number */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/ff.c b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ff.c new file mode 100644 index 000000000..d2096058e --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ff.c @@ -0,0 +1,6982 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem Module R0.14b / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2021, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + + +#include +#include "ff.h" /* Declarations of FatFs API */ +#include "diskio.h" /* Declarations of device I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if FF_DEFINED != 86631 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + + +/* Limits and boundaries */ +#define MAX_DIR 0x200000 /* Max size of FAT directory */ +#define MAX_DIR_EX 0x10000000 /* Max size of exFAT directory */ +#define MAX_FAT12 0xFF5 /* Max FAT12 clusters (differs from specs, but right for real DOS/Windows behavior) */ +#define MAX_FAT16 0xFFF5 /* Max FAT16 clusters (differs from specs, but right for real DOS/Windows behavior) */ +#define MAX_FAT32 0x0FFFFFF5 /* Max FAT32 clusters (not specified, practical limit) */ +#define MAX_EXFAT 0x7FFFFFFD /* Max exFAT clusters (differs from specs, implementation limit) */ + + +/* Character code support macros */ +#define IsUpper(c) ((c) >= 'A' && (c) <= 'Z') +#define IsLower(c) ((c) >= 'a' && (c) <= 'z') +#define IsDigit(c) ((c) >= '0' && (c) <= '9') +#define IsSeparator(c) ((c) == '/' || (c) == '\\') +#define IsTerminator(c) ((UINT)(c) < (FF_USE_LFN ? ' ' : '!')) +#define IsSurrogate(c) ((c) >= 0xD800 && (c) <= 0xDFFF) +#define IsSurrogateH(c) ((c) >= 0xD800 && (c) <= 0xDBFF) +#define IsSurrogateL(c) ((c) >= 0xDC00 && (c) <= 0xDFFF) + + +/* Additional file access control and file status flags for internal use */ +#define FA_SEEKEND 0x20 /* Seek to end of the file on file open */ +#define FA_MODIFIED 0x40 /* File has been modified */ +#define FA_DIRTY 0x80 /* FIL.buf[] needs to be written-back */ + + +/* Additional file attribute bits for internal use */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_MASK 0x3F /* Mask of defined bits in FAT */ +#define AM_MASKX 0x37 /* Mask of defined bits in exFAT */ + + +/* Name status flags in fn[11] */ +#define NSFLAG 11 /* Index of the name status byte */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ +#define NS_NOLFN 0x40 /* Do not find LFN */ +#define NS_NONAME 0x80 /* Not followed */ + + +/* exFAT directory entry types */ +#define ET_BITMAP 0x81 /* Allocation bitmap */ +#define ET_UPCASE 0x82 /* Up-case table */ +#define ET_VLABEL 0x83 /* Volume label */ +#define ET_FILEDIR 0x85 /* File and directory */ +#define ET_STREAM 0xC0 /* Stream extension */ +#define ET_FILENAME 0xC1 /* Name extension */ + + +/* FatFs refers the FAT structure as simple byte array instead of structure member +/ because the C structure is not binary compatible between different platforms */ + +#define BS_JmpBoot 0 /* x86 jump instruction (3-byte) */ +#define BS_OEMName 3 /* OEM name (8-byte) */ +#define BPB_BytsPerSec 11 /* Sector size [byte] (WORD) */ +#define BPB_SecPerClus 13 /* Cluster size [sector] (BYTE) */ +#define BPB_RsvdSecCnt 14 /* Size of reserved area [sector] (WORD) */ +#define BPB_NumFATs 16 /* Number of FATs (BYTE) */ +#define BPB_RootEntCnt 17 /* Size of root directory area for FAT [entry] (WORD) */ +#define BPB_TotSec16 19 /* Volume size (16-bit) [sector] (WORD) */ +#define BPB_Media 21 /* Media descriptor byte (BYTE) */ +#define BPB_FATSz16 22 /* FAT size (16-bit) [sector] (WORD) */ +#define BPB_SecPerTrk 24 /* Number of sectors per track for int13h [sector] (WORD) */ +#define BPB_NumHeads 26 /* Number of heads for int13h (WORD) */ +#define BPB_HiddSec 28 /* Volume offset from top of the drive (DWORD) */ +#define BPB_TotSec32 32 /* Volume size (32-bit) [sector] (DWORD) */ +#define BS_DrvNum 36 /* Physical drive number for int13h (BYTE) */ +#define BS_NTres 37 /* WindowsNT error flag (BYTE) */ +#define BS_BootSig 38 /* Extended boot signature (BYTE) */ +#define BS_VolID 39 /* Volume serial number (DWORD) */ +#define BS_VolLab 43 /* Volume label string (8-byte) */ +#define BS_FilSysType 54 /* Filesystem type string (8-byte) */ +#define BS_BootCode 62 /* Boot code (448-byte) */ +#define BS_55AA 510 /* Signature word (WORD) */ + +#define BPB_FATSz32 36 /* FAT32: FAT size [sector] (DWORD) */ +#define BPB_ExtFlags32 40 /* FAT32: Extended flags (WORD) */ +#define BPB_FSVer32 42 /* FAT32: Filesystem version (WORD) */ +#define BPB_RootClus32 44 /* FAT32: Root directory cluster (DWORD) */ +#define BPB_FSInfo32 48 /* FAT32: Offset of FSINFO sector (WORD) */ +#define BPB_BkBootSec32 50 /* FAT32: Offset of backup boot sector (WORD) */ +#define BS_DrvNum32 64 /* FAT32: Physical drive number for int13h (BYTE) */ +#define BS_NTres32 65 /* FAT32: Error flag (BYTE) */ +#define BS_BootSig32 66 /* FAT32: Extended boot signature (BYTE) */ +#define BS_VolID32 67 /* FAT32: Volume serial number (DWORD) */ +#define BS_VolLab32 71 /* FAT32: Volume label string (8-byte) */ +#define BS_FilSysType32 82 /* FAT32: Filesystem type string (8-byte) */ +#define BS_BootCode32 90 /* FAT32: Boot code (420-byte) */ + +#define BPB_ZeroedEx 11 /* exFAT: MBZ field (53-byte) */ +#define BPB_VolOfsEx 64 /* exFAT: Volume offset from top of the drive [sector] (QWORD) */ +#define BPB_TotSecEx 72 /* exFAT: Volume size [sector] (QWORD) */ +#define BPB_FatOfsEx 80 /* exFAT: FAT offset from top of the volume [sector] (DWORD) */ +#define BPB_FatSzEx 84 /* exFAT: FAT size [sector] (DWORD) */ +#define BPB_DataOfsEx 88 /* exFAT: Data offset from top of the volume [sector] (DWORD) */ +#define BPB_NumClusEx 92 /* exFAT: Number of clusters (DWORD) */ +#define BPB_RootClusEx 96 /* exFAT: Root directory start cluster (DWORD) */ +#define BPB_VolIDEx 100 /* exFAT: Volume serial number (DWORD) */ +#define BPB_FSVerEx 104 /* exFAT: Filesystem version (WORD) */ +#define BPB_VolFlagEx 106 /* exFAT: Volume flags (WORD) */ +#define BPB_BytsPerSecEx 108 /* exFAT: Log2 of sector size in unit of byte (BYTE) */ +#define BPB_SecPerClusEx 109 /* exFAT: Log2 of cluster size in unit of sector (BYTE) */ +#define BPB_NumFATsEx 110 /* exFAT: Number of FATs (BYTE) */ +#define BPB_DrvNumEx 111 /* exFAT: Physical drive number for int13h (BYTE) */ +#define BPB_PercInUseEx 112 /* exFAT: Percent in use (BYTE) */ +#define BPB_RsvdEx 113 /* exFAT: Reserved (7-byte) */ +#define BS_BootCodeEx 120 /* exFAT: Boot code (390-byte) */ + +#define DIR_Name 0 /* Short file name (11-byte) */ +#define DIR_Attr 11 /* Attribute (BYTE) */ +#define DIR_NTres 12 /* Lower case flag (BYTE) */ +#define DIR_CrtTime10 13 /* Created time sub-second (BYTE) */ +#define DIR_CrtTime 14 /* Created time (DWORD) */ +#define DIR_LstAccDate 18 /* Last accessed date (WORD) */ +#define DIR_FstClusHI 20 /* Higher 16-bit of first cluster (WORD) */ +#define DIR_ModTime 22 /* Modified time (DWORD) */ +#define DIR_FstClusLO 26 /* Lower 16-bit of first cluster (WORD) */ +#define DIR_FileSize 28 /* File size (DWORD) */ +#define LDIR_Ord 0 /* LFN: LFN order and LLE flag (BYTE) */ +#define LDIR_Attr 11 /* LFN: LFN attribute (BYTE) */ +#define LDIR_Type 12 /* LFN: Entry type (BYTE) */ +#define LDIR_Chksum 13 /* LFN: Checksum of the SFN (BYTE) */ +#define LDIR_FstClusLO 26 /* LFN: MBZ field (WORD) */ +#define XDIR_Type 0 /* exFAT: Type of exFAT directory entry (BYTE) */ +#define XDIR_NumLabel 1 /* exFAT: Number of volume label characters (BYTE) */ +#define XDIR_Label 2 /* exFAT: Volume label (11-WORD) */ +#define XDIR_CaseSum 4 /* exFAT: Sum of case conversion table (DWORD) */ +#define XDIR_NumSec 1 /* exFAT: Number of secondary entries (BYTE) */ +#define XDIR_SetSum 2 /* exFAT: Sum of the set of directory entries (WORD) */ +#define XDIR_Attr 4 /* exFAT: File attribute (WORD) */ +#define XDIR_CrtTime 8 /* exFAT: Created time (DWORD) */ +#define XDIR_ModTime 12 /* exFAT: Modified time (DWORD) */ +#define XDIR_AccTime 16 /* exFAT: Last accessed time (DWORD) */ +#define XDIR_CrtTime10 20 /* exFAT: Created time subsecond (BYTE) */ +#define XDIR_ModTime10 21 /* exFAT: Modified time subsecond (BYTE) */ +#define XDIR_CrtTZ 22 /* exFAT: Created timezone (BYTE) */ +#define XDIR_ModTZ 23 /* exFAT: Modified timezone (BYTE) */ +#define XDIR_AccTZ 24 /* exFAT: Last accessed timezone (BYTE) */ +#define XDIR_GenFlags 33 /* exFAT: General secondary flags (BYTE) */ +#define XDIR_NumName 35 /* exFAT: Number of file name characters (BYTE) */ +#define XDIR_NameHash 36 /* exFAT: Hash of file name (WORD) */ +#define XDIR_ValidFileSize 40 /* exFAT: Valid file size (QWORD) */ +#define XDIR_FstClus 52 /* exFAT: First cluster of the file data (DWORD) */ +#define XDIR_FileSize 56 /* exFAT: File/Directory size (QWORD) */ + +#define SZDIRE 32 /* Size of a directory entry */ +#define DDEM 0xE5 /* Deleted directory entry mark set to DIR_Name[0] */ +#define RDDEM 0x05 /* Replacement of the character collides with DDEM */ +#define LLEF 0x40 /* Last long entry flag in LDIR_Ord */ + +#define FSI_LeadSig 0 /* FAT32 FSI: Leading signature (DWORD) */ +#define FSI_StrucSig 484 /* FAT32 FSI: Structure signature (DWORD) */ +#define FSI_Free_Count 488 /* FAT32 FSI: Number of free clusters (DWORD) */ +#define FSI_Nxt_Free 492 /* FAT32 FSI: Last allocated cluster (DWORD) */ + +#define MBR_Table 446 /* MBR: Offset of partition table in the MBR */ +#define SZ_PTE 16 /* MBR: Size of a partition table entry */ +#define PTE_Boot 0 /* MBR PTE: Boot indicator */ +#define PTE_StHead 1 /* MBR PTE: Start head */ +#define PTE_StSec 2 /* MBR PTE: Start sector */ +#define PTE_StCyl 3 /* MBR PTE: Start cylinder */ +#define PTE_System 4 /* MBR PTE: System ID */ +#define PTE_EdHead 5 /* MBR PTE: End head */ +#define PTE_EdSec 6 /* MBR PTE: End sector */ +#define PTE_EdCyl 7 /* MBR PTE: End cylinder */ +#define PTE_StLba 8 /* MBR PTE: Start in LBA */ +#define PTE_SizLba 12 /* MBR PTE: Size in LBA */ + +#define GPTH_Sign 0 /* GPT: Header signature (8-byte) */ +#define GPTH_Rev 8 /* GPT: Revision (DWORD) */ +#define GPTH_Size 12 /* GPT: Header size (DWORD) */ +#define GPTH_Bcc 16 /* GPT: Header BCC (DWORD) */ +#define GPTH_CurLba 24 /* GPT: Main header LBA (QWORD) */ +#define GPTH_BakLba 32 /* GPT: Backup header LBA (QWORD) */ +#define GPTH_FstLba 40 /* GPT: First LBA for partitions (QWORD) */ +#define GPTH_LstLba 48 /* GPT: Last LBA for partitions (QWORD) */ +#define GPTH_DskGuid 56 /* GPT: Disk GUID (16-byte) */ +#define GPTH_PtOfs 72 /* GPT: Partation table LBA (QWORD) */ +#define GPTH_PtNum 80 /* GPT: Number of table entries (DWORD) */ +#define GPTH_PteSize 84 /* GPT: Size of table entry (DWORD) */ +#define GPTH_PtBcc 88 /* GPT: Partation table BCC (DWORD) */ +#define SZ_GPTE 128 /* GPT: Size of partition table entry */ +#define GPTE_PtGuid 0 /* GPT PTE: Partition type GUID (16-byte) */ +#define GPTE_UpGuid 16 /* GPT PTE: Partition unique GUID (16-byte) */ +#define GPTE_FstLba 32 /* GPT PTE: First LBA (QWORD) */ +#define GPTE_LstLba 40 /* GPT PTE: Last LBA inclusive (QWORD) */ +#define GPTE_Flags 48 /* GPT PTE: Flags (QWORD) */ +#define GPTE_Name 56 /* GPT PTE: Name */ + + +/* Post process on fatal error in the file operations */ +#define ABORT(fs, res) { fp->err = (BYTE)(res); LEAVE_FF(fs, res); } + + +/* Re-entrancy related */ +#if FF_FS_REENTRANT +#if FF_USE_LFN == 1 +#error Static LFN work area cannot be used in thread-safe configuration +#endif +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } +#else +#define LEAVE_FF(fs, res) return res +#endif + + +/* Definitions of logical drive - physical location conversion */ +#if FF_MULTI_PARTITION +#define LD2PD(vol) VolToPart[vol].pd /* Get physical drive number */ +#define LD2PT(vol) VolToPart[vol].pt /* Get partition number (0:auto search, 1..:forced partition number) */ +#else +#define LD2PD(vol) (BYTE)(vol) /* Each logical drive is associated with the same physical drive number */ +#define LD2PT(vol) 0 /* Auto partition search */ +#endif + + +/* Definitions of sector size */ +#if (FF_MAX_SS < FF_MIN_SS) || (FF_MAX_SS != 512 && FF_MAX_SS != 1024 && FF_MAX_SS != 2048 && FF_MAX_SS != 4096) || (FF_MIN_SS != 512 && FF_MIN_SS != 1024 && FF_MIN_SS != 2048 && FF_MIN_SS != 4096) +#error Wrong sector size configuration +#endif +#if FF_MAX_SS == FF_MIN_SS +#define SS(fs) ((UINT)FF_MAX_SS) /* Fixed sector size */ +#else +#define SS(fs) ((fs)->ssize) /* Variable sector size */ +#endif + + +/* Timestamp */ +#if FF_FS_NORTC == 1 +#if FF_NORTC_YEAR < 1980 || FF_NORTC_YEAR > 2107 || FF_NORTC_MON < 1 || FF_NORTC_MON > 12 || FF_NORTC_MDAY < 1 || FF_NORTC_MDAY > 31 +#error Invalid FF_FS_NORTC settings +#endif +#define GET_FATTIME() ((DWORD)(FF_NORTC_YEAR - 1980) << 25 | (DWORD)FF_NORTC_MON << 21 | (DWORD)FF_NORTC_MDAY << 16) +#else +#define GET_FATTIME() get_fattime() +#endif + + +/* File lock controls */ +#if FF_FS_LOCK != 0 +#if FF_FS_READONLY +#error FF_FS_LOCK must be 0 at read-only configuration +#endif +typedef struct { + FATFS *fs; /* Object ID 1, volume (NULL:blank entry) */ + DWORD clu; /* Object ID 2, containing directory (0:root) */ + DWORD ofs; /* Object ID 3, offset in the directory */ + WORD ctr; /* Object open counter, 0:none, 0x01..0xFF:read mode open count, 0x100:write mode */ +} FILESEM; +#endif + + +/* SBCS up-case tables (\x80-\xFF) */ +#define TBL_CT437 {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT720 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT737 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT771 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF} +#define TBL_CT775 {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT850 {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \ + 0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \ + 0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT852 {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} +#define TBL_CT855 {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \ + 0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \ + 0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT857 {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT860 {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \ + 0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT861 {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT862 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT863 {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \ + 0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \ + 0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT864 {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT865 {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT866 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT869 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \ + 0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \ + 0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \ + 0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF} + + +/* DBCS code range |----- 1st byte -----| |----------- 2nd byte -----------| */ +/* <------> <------> <------> <------> <------> */ +#define TBL_DC932 {0x81, 0x9F, 0xE0, 0xFC, 0x40, 0x7E, 0x80, 0xFC, 0x00, 0x00} +#define TBL_DC936 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0x80, 0xFE, 0x00, 0x00} +#define TBL_DC949 {0x81, 0xFE, 0x00, 0x00, 0x41, 0x5A, 0x61, 0x7A, 0x81, 0xFE} +#define TBL_DC950 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0xA1, 0xFE, 0x00, 0x00} + + +/* Macros for table definitions */ +#define MERGE_2STR(a, b) a ## b +#define MKCVTBL(hd, cp) MERGE_2STR(hd, cp) + + + + +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ +/* Remark: Variables defined here without initial value shall be guaranteed +/ zero/null at start-up. If not, the linker option or start-up routine is +/ not compliance with C standard. */ + +/*--------------------------------*/ +/* File/Volume controls */ +/*--------------------------------*/ + +#if FF_VOLUMES < 1 || FF_VOLUMES > 10 +#error Wrong FF_VOLUMES setting +#endif +static FATFS* FatFs[FF_VOLUMES]; /* Pointer to the filesystem objects (logical drives) */ +static WORD Fsid; /* Filesystem mount ID */ + +#if FF_FS_RPATH != 0 +static BYTE CurrVol; /* Current drive */ +#endif + +#if FF_FS_LOCK != 0 +static FILESEM Files[FF_FS_LOCK]; /* Open object lock semaphores */ +#endif + +#if FF_STR_VOLUME_ID +#ifdef FF_VOLUME_STRS +static const char* const VolumeStr[FF_VOLUMES] = {FF_VOLUME_STRS}; /* Pre-defined volume ID */ +#endif +#endif + +#if FF_LBA64 +#if FF_MIN_GPT > 0x100000000 +#error Wrong FF_MIN_GPT setting +#endif +static const BYTE GUID_MS_Basic[16] = {0xA2,0xA0,0xD0,0xEB,0xE5,0xB9,0x33,0x44,0x87,0xC0,0x68,0xB6,0xB7,0x26,0x99,0xC7}; +#endif + + + +/*--------------------------------*/ +/* LFN/Directory working buffer */ +/*--------------------------------*/ + +#if FF_USE_LFN == 0 /* Non-LFN configuration */ +#if FF_FS_EXFAT +#error LFN must be enabled when enable exFAT +#endif +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() +#define LEAVE_MKFS(res) return res + +#else /* LFN configurations */ +#if FF_MAX_LFN < 12 || FF_MAX_LFN > 255 +#error Wrong setting of FF_MAX_LFN +#endif +#if FF_LFN_BUF < FF_SFN_BUF || FF_SFN_BUF < 12 +#error Wrong setting of FF_LFN_BUF or FF_SFN_BUF +#endif +#if FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3 +#error Wrong setting of FF_LFN_UNICODE +#endif +static const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* FAT: Offset of LFN characters in the directory entry */ +#define MAXDIRB(nc) ((nc + 44U) / 15 * SZDIRE) /* exFAT: Size of directory entry block scratchpad buffer needed for the name length */ + +#if FF_USE_LFN == 1 /* LFN enabled with static working buffer */ +#if FF_FS_EXFAT +static BYTE DirBuf[MAXDIRB(FF_MAX_LFN)]; /* Directory entry block scratchpad buffer */ +#endif +static WCHAR LfnBuf[FF_MAX_LFN + 1]; /* LFN working buffer */ +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() +#define LEAVE_MKFS(res) return res + +#elif FF_USE_LFN == 2 /* LFN enabled with dynamic working buffer on the stack */ +#if FF_FS_EXFAT +#define DEF_NAMBUF WCHAR lbuf[FF_MAX_LFN+1]; BYTE dbuf[MAXDIRB(FF_MAX_LFN)]; /* LFN working buffer and directory entry block scratchpad buffer */ +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; (fs)->dirbuf = dbuf; } +#define FREE_NAMBUF() +#else +#define DEF_NAMBUF WCHAR lbuf[FF_MAX_LFN+1]; /* LFN working buffer */ +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; } +#define FREE_NAMBUF() +#endif +#define LEAVE_MKFS(res) return res + +#elif FF_USE_LFN == 3 /* LFN enabled with dynamic working buffer on the heap */ +#if FF_FS_EXFAT +#define DEF_NAMBUF WCHAR *lfn; /* Pointer to LFN working buffer and directory entry block scratchpad buffer */ +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((FF_MAX_LFN+1)*2 + MAXDIRB(FF_MAX_LFN)); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; (fs)->dirbuf = (BYTE*)(lfn+FF_MAX_LFN+1); } +#define FREE_NAMBUF() ff_memfree(lfn) +#else +#define DEF_NAMBUF WCHAR *lfn; /* Pointer to LFN working buffer */ +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((FF_MAX_LFN+1)*2); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; } +#define FREE_NAMBUF() ff_memfree(lfn) +#endif +#define LEAVE_MKFS(res) { if (!work) ff_memfree(buf); return res; } +#define MAX_MALLOC 0x8000 /* Must be >=FF_MAX_SS */ + +#else +#error Wrong setting of FF_USE_LFN + +#endif /* FF_USE_LFN == 1 */ +#endif /* FF_USE_LFN == 0 */ + + + +/*--------------------------------*/ +/* Code conversion tables */ +/*--------------------------------*/ + +#if FF_CODE_PAGE == 0 /* Run-time code page configuration */ +#define CODEPAGE CodePage +static WORD CodePage; /* Current code page */ +static const BYTE *ExCvt, *DbcTbl; /* Pointer to current SBCS up-case table and DBCS code range table below */ + +static const BYTE Ct437[] = TBL_CT437; +static const BYTE Ct720[] = TBL_CT720; +static const BYTE Ct737[] = TBL_CT737; +static const BYTE Ct771[] = TBL_CT771; +static const BYTE Ct775[] = TBL_CT775; +static const BYTE Ct850[] = TBL_CT850; +static const BYTE Ct852[] = TBL_CT852; +static const BYTE Ct855[] = TBL_CT855; +static const BYTE Ct857[] = TBL_CT857; +static const BYTE Ct860[] = TBL_CT860; +static const BYTE Ct861[] = TBL_CT861; +static const BYTE Ct862[] = TBL_CT862; +static const BYTE Ct863[] = TBL_CT863; +static const BYTE Ct864[] = TBL_CT864; +static const BYTE Ct865[] = TBL_CT865; +static const BYTE Ct866[] = TBL_CT866; +static const BYTE Ct869[] = TBL_CT869; +static const BYTE Dc932[] = TBL_DC932; +static const BYTE Dc936[] = TBL_DC936; +static const BYTE Dc949[] = TBL_DC949; +static const BYTE Dc950[] = TBL_DC950; + +#elif FF_CODE_PAGE < 900 /* Static code page configuration (SBCS) */ +#define CODEPAGE FF_CODE_PAGE +static const BYTE ExCvt[] = MKCVTBL(TBL_CT, FF_CODE_PAGE); + +#else /* Static code page configuration (DBCS) */ +#define CODEPAGE FF_CODE_PAGE +static const BYTE DbcTbl[] = MKCVTBL(TBL_DC, FF_CODE_PAGE); + +#endif + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Load/Store multi-byte word in the FAT structure */ +/*-----------------------------------------------------------------------*/ + +static WORD ld_word (const BYTE* ptr) /* Load a 2-byte little-endian word */ +{ + WORD rv; + + rv = ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +static DWORD ld_dword (const BYTE* ptr) /* Load a 4-byte little-endian word */ +{ + DWORD rv; + + rv = ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +#if FF_FS_EXFAT +static QWORD ld_qword (const BYTE* ptr) /* Load an 8-byte little-endian word */ +{ + QWORD rv; + + rv = ptr[7]; + rv = rv << 8 | ptr[6]; + rv = rv << 8 | ptr[5]; + rv = rv << 8 | ptr[4]; + rv = rv << 8 | ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} +#endif + +#if !FF_FS_READONLY +static void st_word (BYTE* ptr, WORD val) /* Store a 2-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +static void st_dword (BYTE* ptr, DWORD val) /* Store a 4-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +#if FF_FS_EXFAT +static void st_qword (BYTE* ptr, QWORD val) /* Store an 8-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} +#endif +#endif /* !FF_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Test if the byte is DBC 1st byte */ +static int dbc_1st (BYTE c) +{ +#if FF_CODE_PAGE == 0 /* Variable code page */ + if (DbcTbl && c >= DbcTbl[0]) { + if (c <= DbcTbl[1]) return 1; /* 1st byte range 1 */ + if (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1; /* 1st byte range 2 */ + } +#elif FF_CODE_PAGE >= 900 /* DBCS fixed code page */ + if (c >= DbcTbl[0]) { + if (c <= DbcTbl[1]) return 1; + if (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1; + } +#else /* SBCS fixed code page */ + if (c != 0) return 0; /* Always false */ +#endif + return 0; +} + + +/* Test if the byte is DBC 2nd byte */ +static int dbc_2nd (BYTE c) +{ +#if FF_CODE_PAGE == 0 /* Variable code page */ + if (DbcTbl && c >= DbcTbl[4]) { + if (c <= DbcTbl[5]) return 1; /* 2nd byte range 1 */ + if (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1; /* 2nd byte range 2 */ + if (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1; /* 2nd byte range 3 */ + } +#elif FF_CODE_PAGE >= 900 /* DBCS fixed code page */ + if (c >= DbcTbl[4]) { + if (c <= DbcTbl[5]) return 1; + if (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1; + if (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1; + } +#else /* SBCS fixed code page */ + if (c != 0) return 0; /* Always false */ +#endif + return 0; +} + + +#if FF_USE_LFN + +/* Get a Unicode code point from the TCHAR string in defined API encodeing */ +static DWORD tchar2uni ( /* Returns a character in UTF-16 encoding (>=0x10000 on surrogate pair, 0xFFFFFFFF on decode error) */ + const TCHAR** str /* Pointer to pointer to TCHAR string in configured encoding */ +) +{ + DWORD uc; + const TCHAR *p = *str; + +#if FF_LFN_UNICODE == 1 /* UTF-16 input */ + WCHAR wc; + + uc = *p++; /* Get a unit */ + if (IsSurrogate(uc)) { /* Surrogate? */ + wc = *p++; /* Get low surrogate */ + if (!IsSurrogateH(uc) || !IsSurrogateL(wc)) return 0xFFFFFFFF; /* Wrong surrogate? */ + uc = uc << 16 | wc; + } + +#elif FF_LFN_UNICODE == 2 /* UTF-8 input */ + BYTE b; + int nf; + + uc = (BYTE)*p++; /* Get an encoding unit */ + if (uc & 0x80) { /* Multiple byte code? */ + if ((uc & 0xE0) == 0xC0) { /* 2-byte sequence? */ + uc &= 0x1F; nf = 1; + } else if ((uc & 0xF0) == 0xE0) { /* 3-byte sequence? */ + uc &= 0x0F; nf = 2; + } else if ((uc & 0xF8) == 0xF0) { /* 4-byte sequence? */ + uc &= 0x07; nf = 3; + } else { /* Wrong sequence */ + return 0xFFFFFFFF; + } + do { /* Get trailing bytes */ + b = (BYTE)*p++; + if ((b & 0xC0) != 0x80) return 0xFFFFFFFF; /* Wrong sequence? */ + uc = uc << 6 | (b & 0x3F); + } while (--nf != 0); + if (uc < 0x80 || IsSurrogate(uc) || uc >= 0x110000) return 0xFFFFFFFF; /* Wrong code? */ + if (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF); /* Make a surrogate pair if needed */ + } + +#elif FF_LFN_UNICODE == 3 /* UTF-32 input */ + uc = (TCHAR)*p++; /* Get a unit */ + if (uc >= 0x110000 || IsSurrogate(uc)) return 0xFFFFFFFF; /* Wrong code? */ + if (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF); /* Make a surrogate pair if needed */ + +#else /* ANSI/OEM input */ + BYTE b; + WCHAR wc; + + wc = (BYTE)*p++; /* Get a byte */ + if (dbc_1st((BYTE)wc)) { /* Is it a DBC 1st byte? */ + b = (BYTE)*p++; /* Get 2nd byte */ + if (!dbc_2nd(b)) return 0xFFFFFFFF; /* Invalid code? */ + wc = (wc << 8) + b; /* Make a DBC */ + } + if (wc != 0) { + wc = ff_oem2uni(wc, CODEPAGE); /* ANSI/OEM ==> Unicode */ + if (wc == 0) return 0xFFFFFFFF; /* Invalid code? */ + } + uc = wc; + +#endif + *str = p; /* Next read pointer */ + return uc; +} + + +/* Store a Unicode char in defined API encoding */ +static UINT put_utf ( /* Returns number of encoding units written (0:buffer overflow or wrong encoding) */ + DWORD chr, /* UTF-16 encoded character (Surrogate pair if >=0x10000) */ + TCHAR* buf, /* Output buffer */ + UINT szb /* Size of the buffer */ +) +{ +#if FF_LFN_UNICODE == 1 /* UTF-16 output */ + WCHAR hs, wc; + + hs = (WCHAR)(chr >> 16); + wc = (WCHAR)chr; + if (hs == 0) { /* Single encoding unit? */ + if (szb < 1 || IsSurrogate(wc)) return 0; /* Buffer overflow or wrong code? */ + *buf = wc; + return 1; + } + if (szb < 2 || !IsSurrogateH(hs) || !IsSurrogateL(wc)) return 0; /* Buffer overflow or wrong surrogate? */ + *buf++ = hs; + *buf++ = wc; + return 2; + +#elif FF_LFN_UNICODE == 2 /* UTF-8 output */ + DWORD hc; + + if (chr < 0x80) { /* Single byte code? */ + if (szb < 1) return 0; /* Buffer overflow? */ + *buf = (TCHAR)chr; + return 1; + } + if (chr < 0x800) { /* 2-byte sequence? */ + if (szb < 2) return 0; /* Buffer overflow? */ + *buf++ = (TCHAR)(0xC0 | (chr >> 6 & 0x1F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 2; + } + if (chr < 0x10000) { /* 3-byte sequence? */ + if (szb < 3 || IsSurrogate(chr)) return 0; /* Buffer overflow or wrong code? */ + *buf++ = (TCHAR)(0xE0 | (chr >> 12 & 0x0F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 3; + } + /* 4-byte sequence */ + if (szb < 4) return 0; /* Buffer overflow? */ + hc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6; /* Get high 10 bits */ + chr = (chr & 0xFFFF) - 0xDC00; /* Get low 10 bits */ + if (hc >= 0x100000 || chr >= 0x400) return 0; /* Wrong surrogate? */ + chr = (hc | chr) + 0x10000; + *buf++ = (TCHAR)(0xF0 | (chr >> 18 & 0x07)); + *buf++ = (TCHAR)(0x80 | (chr >> 12 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 4; + +#elif FF_LFN_UNICODE == 3 /* UTF-32 output */ + DWORD hc; + + if (szb < 1) return 0; /* Buffer overflow? */ + if (chr >= 0x10000) { /* Out of BMP? */ + hc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6; /* Get high 10 bits */ + chr = (chr & 0xFFFF) - 0xDC00; /* Get low 10 bits */ + if (hc >= 0x100000 || chr >= 0x400) return 0; /* Wrong surrogate? */ + chr = (hc | chr) + 0x10000; + } + *buf++ = (TCHAR)chr; + return 1; + +#else /* ANSI/OEM output */ + WCHAR wc; + + wc = ff_uni2oem(chr, CODEPAGE); + if (wc >= 0x100) { /* Is this a DBC? */ + if (szb < 2) return 0; + *buf++ = (char)(wc >> 8); /* Store DBC 1st byte */ + *buf++ = (TCHAR)wc; /* Store DBC 2nd byte */ + return 2; + } + if (wc == 0 || szb < 1) return 0; /* Invalid char or buffer overflow? */ + *buf++ = (TCHAR)wc; /* Store the character */ + return 1; +#endif +} +#endif /* FF_USE_LFN */ + + +#if FF_FS_REENTRANT +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +static int lock_fs ( /* 1:Ok, 0:timeout */ + FATFS* fs /* Filesystem object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static void unlock_fs ( + FATFS* fs, /* Filesystem object */ + FRESULT res /* Result code to be returned */ +) +{ + if (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} + +#endif + + + +#if FF_FS_LOCK != 0 +/*-----------------------------------------------------------------------*/ +/* File lock control functions */ +/*-----------------------------------------------------------------------*/ + +static FRESULT chk_lock ( /* Check if the file can be accessed */ + DIR* dp, /* Directory object pointing the file to be checked */ + int acc /* Desired access type (0:Read mode open, 1:Write mode open, 2:Delete or rename) */ +) +{ + UINT i, be; + + /* Search open object table for the object */ + be = 0; + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dp->obj.fs && /* Check if the object matches with an open object */ + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } else { /* Blank entry */ + be = 1; + } + } + if (i == FF_FS_LOCK) { /* The object has not been opened */ + return (!be && acc != 2) ? FR_TOO_MANY_OPEN_FILES : FR_OK; /* Is there a blank entry for new object? */ + } + + /* The object was opened. Reject any open against writing file and all write mode open */ + return (acc != 0 || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + + +static int enq_lock (void) /* Check if an entry is available for a new object */ +{ + UINT i; + + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ; + return (i == FF_FS_LOCK) ? 0 : 1; +} + + +static UINT inc_lock ( /* Increment object open counter and returns its index (0:Internal error) */ + DIR* dp, /* Directory object pointing the file to register or increment */ + int acc /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i; + + + for (i = 0; i < FF_FS_LOCK; i++) { /* Find the object */ + if (Files[i].fs == dp->obj.fs + && Files[i].clu == dp->obj.sclust + && Files[i].ofs == dp->dptr) break; + } + + if (i == FF_FS_LOCK) { /* Not opened. Register it as new. */ + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ; + if (i == FF_FS_LOCK) return 0; /* No free entry to register (int err) */ + Files[i].fs = dp->obj.fs; + Files[i].clu = dp->obj.sclust; + Files[i].ofs = dp->dptr; + Files[i].ctr = 0; + } + + if (acc >= 1 && Files[i].ctr) return 0; /* Access violation (int err) */ + + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ + + return i + 1; /* Index number origin from 1 */ +} + + +static FRESULT dec_lock ( /* Decrement object open counter */ + UINT i /* Semaphore index (1..) */ +) +{ + WORD n; + FRESULT res; + + + if (--i < FF_FS_LOCK) { /* Index number origin from 0 */ + n = Files[i].ctr; + if (n == 0x100) n = 0; /* If write mode open, delete the entry */ + if (n > 0) n--; /* Decrement read mode open count */ + Files[i].ctr = n; + if (n == 0) Files[i].fs = 0; /* Delete the entry if open count gets zero */ + res = FR_OK; + } else { + res = FR_INT_ERR; /* Invalid index nunber */ + } + return res; +} + + +static void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} + +#endif /* FF_FS_LOCK != 0 */ + + + +/*-----------------------------------------------------------------------*/ +/* Move/Flush disk access window in the filesystem object */ +/*-----------------------------------------------------------------------*/ +#if !FF_FS_READONLY +static FRESULT sync_window ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs /* Filesystem object */ +) +{ + FRESULT res = FR_OK; + + + if (fs->wflag) { /* Is the disk access window dirty? */ + if (disk_write(fs->pdrv, fs->win, fs->winsect, 1) == RES_OK) { /* Write it back into the volume */ + fs->wflag = 0; /* Clear window dirty flag */ + if (fs->winsect - fs->fatbase < fs->fsize) { /* Is it in the 1st FAT? */ + if (fs->n_fats == 2) disk_write(fs->pdrv, fs->win, fs->winsect + fs->fsize, 1); /* Reflect it to 2nd FAT if needed */ + } + } else { + res = FR_DISK_ERR; + } + } + return res; +} +#endif + + +static FRESULT move_window ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs, /* Filesystem object */ + LBA_t sect /* Sector LBA to make appearance in the fs->win[] */ +) +{ + FRESULT res = FR_OK; + + + if (sect != fs->winsect) { /* Window offset changed? */ +#if !FF_FS_READONLY + res = sync_window(fs); /* Flush the window */ +#endif + if (res == FR_OK) { /* Fill sector window with new data */ + if (disk_read(fs->pdrv, fs->win, sect, 1) != RES_OK) { + sect = (LBA_t)0 - 1; /* Invalidate window if read data is not valid */ + res = FR_DISK_ERR; + } + fs->winsect = sect; + } + } + return res; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Synchronize filesystem and data on the storage */ +/*-----------------------------------------------------------------------*/ + +static FRESULT sync_fs ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs /* Filesystem object */ +) +{ + FRESULT res; + + + res = sync_window(fs); + if (res == FR_OK) { + if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { /* FAT32: Update FSInfo sector if needed */ + /* Create FSInfo structure */ + memset(fs->win, 0, sizeof fs->win); + st_word(fs->win + BS_55AA, 0xAA55); /* Boot signature */ + st_dword(fs->win + FSI_LeadSig, 0x41615252); /* Leading signature */ + st_dword(fs->win + FSI_StrucSig, 0x61417272); /* Structure signature */ + st_dword(fs->win + FSI_Free_Count, fs->free_clst); /* Number of free clusters */ + st_dword(fs->win + FSI_Nxt_Free, fs->last_clst); /* Last allocated culuster */ + fs->winsect = fs->volbase + 1; /* Write it into the FSInfo sector (Next to VBR) */ + disk_write(fs->pdrv, fs->win, fs->winsect, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the lower layer */ + if (disk_ioctl(fs->pdrv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR; + } + + return res; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Get physical sector number from cluster number */ +/*-----------------------------------------------------------------------*/ + +static LBA_t clst2sect ( /* !=0:Sector number, 0:Failed (invalid cluster#) */ + FATFS* fs, /* Filesystem object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; /* Cluster number is origin from 2 */ + if (clst >= fs->n_fatent - 2) return 0; /* Is it invalid cluster number? */ + return fs->database + (LBA_t)fs->csize * clst; /* Start sector number of the cluster */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of an FAT entry */ +/*-----------------------------------------------------------------------*/ + +static DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst /* Cluster number to get the value */ +) +{ + UINT wc, bc; + DWORD val; + FATFS *fs = obj->fs; + + + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ + val = 1; /* Internal error */ + + } else { + val = 0xFFFFFFFF; /* Default value falls on disk error */ + + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc = fs->win[bc++ % SS(fs)]; /* Get 1st byte of the entry */ + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc |= fs->win[bc % SS(fs)] << 8; /* Merge 2nd byte of the entry */ + val = (clst & 1) ? (wc >> 4) : (wc & 0xFFF); /* Adjust bit position */ + break; + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break; + val = ld_word(fs->win + clst * 2 % SS(fs)); /* Simple WORD array */ + break; + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x0FFFFFFF; /* Simple DWORD array but mask out upper 4 bits */ + break; +#if FF_FS_EXFAT + case FS_EXFAT : + if ((obj->objsize != 0 && obj->sclust != 0) || obj->stat == 0) { /* Object except root dir must have valid data length */ + DWORD cofs = clst - obj->sclust; /* Offset from start cluster */ + DWORD clen = (DWORD)((LBA_t)((obj->objsize - 1) / SS(fs)) / fs->csize); /* Number of clusters - 1 */ + + if (obj->stat == 2 && cofs <= clen) { /* Is it a contiguous chain? */ + val = (cofs == clen) ? 0x7FFFFFFF : clst + 1; /* No data on the FAT, generate the value */ + break; + } + if (obj->stat == 3 && cofs < obj->n_cont) { /* Is it in the 1st fragment? */ + val = clst + 1; /* Generate the value */ + break; + } + if (obj->stat != 2) { /* Get value from FAT if FAT chain is valid */ + if (obj->n_frag != 0) { /* Is it on the growing edge? */ + val = 0x7FFFFFFF; /* Generate EOC */ + } else { + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x7FFFFFFF; + } + break; + } + } + val = 1; /* Internal error */ + break; +#endif + default: + val = 1; /* Internal error */ + } + } + + return val; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of an FAT entry */ +/*-----------------------------------------------------------------------*/ + +static FRESULT put_fat ( /* FR_OK(0):succeeded, !=0:error */ + FATFS* fs, /* Corresponding filesystem object */ + DWORD clst, /* FAT index number (cluster number) to be changed */ + DWORD val /* New value to be set to the entry */ +) +{ + UINT bc; + BYTE *p; + FRESULT res = FR_INT_ERR; + + + if (clst >= 2 && clst < fs->n_fatent) { /* Check if in valid range */ + switch (fs->fs_type) { + case FS_FAT12: + bc = (UINT)clst; bc += bc / 2; /* bc: byte offset of the entry */ + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc++ % SS(fs); + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; /* Update 1st byte */ + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc % SS(fs); + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); /* Update 2nd byte */ + fs->wflag = 1; + break; + + case FS_FAT16: + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + st_word(fs->win + clst * 2 % SS(fs), (WORD)val); /* Simple WORD array */ + fs->wflag = 1; + break; + + case FS_FAT32: +#if FF_FS_EXFAT + case FS_EXFAT: +#endif + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + val = (val & 0x0FFFFFFF) | (ld_dword(fs->win + clst * 4 % SS(fs)) & 0xF0000000); + } + st_dword(fs->win + clst * 4 % SS(fs), val); + fs->wflag = 1; + break; + } + } + return res; +} + +#endif /* !FF_FS_READONLY */ + + + + +#if FF_FS_EXFAT && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* exFAT: Accessing FAT and Allocation Bitmap */ +/*-----------------------------------------------------------------------*/ + +/*--------------------------------------*/ +/* Find a contiguous free cluster block */ +/*--------------------------------------*/ + +static DWORD find_bitmap ( /* 0:Not found, 2..:Cluster block found, 0xFFFFFFFF:Disk error */ + FATFS* fs, /* Filesystem object */ + DWORD clst, /* Cluster number to scan from */ + DWORD ncl /* Number of contiguous clusters to find (1..) */ +) +{ + BYTE bm, bv; + UINT i; + DWORD val, scl, ctr; + + + clst -= 2; /* The first bit in the bitmap corresponds to cluster #2 */ + if (clst >= fs->n_fatent - 2) clst = 0; + scl = val = clst; ctr = 0; + for (;;) { + if (move_window(fs, fs->bitbase + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF; + i = val / 8 % SS(fs); bm = 1 << (val % 8); + do { + do { + bv = fs->win[i] & bm; bm <<= 1; /* Get bit value */ + if (++val >= fs->n_fatent - 2) { /* Next cluster (with wrap-around) */ + val = 0; bm = 0; i = SS(fs); + } + if (bv == 0) { /* Is it a free cluster? */ + if (++ctr == ncl) return scl + 2; /* Check if run length is sufficient for required */ + } else { + scl = val; ctr = 0; /* Encountered a cluster in-use, restart to scan */ + } + if (val == clst) return 0; /* All cluster scanned? */ + } while (bm != 0); + bm = 1; + } while (++i < SS(fs)); + } +} + + +/*----------------------------------------*/ +/* Set/Clear a block of allocation bitmap */ +/*----------------------------------------*/ + +static FRESULT change_bitmap ( + FATFS* fs, /* Filesystem object */ + DWORD clst, /* Cluster number to change from */ + DWORD ncl, /* Number of clusters to be changed */ + int bv /* bit value to be set (0 or 1) */ +) +{ + BYTE bm; + UINT i; + LBA_t sect; + + + clst -= 2; /* The first bit corresponds to cluster #2 */ + sect = fs->bitbase + clst / 8 / SS(fs); /* Sector address */ + i = clst / 8 % SS(fs); /* Byte offset in the sector */ + bm = 1 << (clst % 8); /* Bit mask in the byte */ + for (;;) { + if (move_window(fs, sect++) != FR_OK) return FR_DISK_ERR; + do { + do { + if (bv == (int)((fs->win[i] & bm) != 0)) return FR_INT_ERR; /* Is the bit expected value? */ + fs->win[i] ^= bm; /* Flip the bit */ + fs->wflag = 1; + if (--ncl == 0) return FR_OK; /* All bits processed? */ + } while (bm <<= 1); /* Next bit */ + bm = 1; + } while (++i < SS(fs)); /* Next byte */ + i = 0; + } +} + + +/*---------------------------------------------*/ +/* Fill the first fragment of the FAT chain */ +/*---------------------------------------------*/ + +static FRESULT fill_first_frag ( + FFOBJID* obj /* Pointer to the corresponding object */ +) +{ + FRESULT res; + DWORD cl, n; + + + if (obj->stat == 3) { /* Has the object been changed 'fragmented' in this session? */ + for (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) { /* Create cluster chain on the FAT */ + res = put_fat(obj->fs, cl, cl + 1); + if (res != FR_OK) return res; + } + obj->stat = 0; /* Change status 'FAT chain is valid' */ + } + return FR_OK; +} + + +/*---------------------------------------------*/ +/* Fill the last fragment of the FAT chain */ +/*---------------------------------------------*/ + +static FRESULT fill_last_frag ( + FFOBJID* obj, /* Pointer to the corresponding object */ + DWORD lcl, /* Last cluster of the fragment */ + DWORD term /* Value to set the last FAT entry */ +) +{ + FRESULT res; + + + while (obj->n_frag > 0) { /* Create the chain of last fragment */ + res = put_fat(obj->fs, lcl - obj->n_frag + 1, (obj->n_frag > 1) ? lcl - obj->n_frag + 2 : term); + if (res != FR_OK) return res; + obj->n_frag--; + } + return FR_OK; +} + +#endif /* FF_FS_EXFAT && !FF_FS_READONLY */ + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ + +static FRESULT remove_chain ( /* FR_OK(0):succeeded, !=0:error */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst, /* Cluster to remove a chain from */ + DWORD pclst /* Previous cluster of clst (0 if entire chain) */ +) +{ + FRESULT res = FR_OK; + DWORD nxt; + FATFS *fs = obj->fs; +#if FF_FS_EXFAT || FF_USE_TRIM + DWORD scl = clst, ecl = clst; +#endif +#if FF_USE_TRIM + LBA_t rt[2]; +#endif + + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Check if in valid range */ + + /* Mark the previous cluster 'EOC' on the FAT if it exists */ + if (pclst != 0 && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) { + res = put_fat(fs, pclst, 0xFFFFFFFF); + if (res != FR_OK) return res; + } + + /* Remove the chain */ + do { + nxt = get_fat(obj, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) return FR_INT_ERR; /* Internal error? */ + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error? */ + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + res = put_fat(fs, clst, 0); /* Mark the cluster 'free' on the FAT */ + if (res != FR_OK) return res; + } + if (fs->free_clst < fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst++; + fs->fsi_flag |= 1; + } +#if FF_FS_EXFAT || FF_USE_TRIM + if (ecl + 1 == nxt) { /* Is next cluster contiguous? */ + ecl = nxt; + } else { /* End of contiguous cluster block */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = change_bitmap(fs, scl, ecl - scl + 1, 0); /* Mark the cluster block 'free' on the bitmap */ + if (res != FR_OK) return res; + } +#endif +#if FF_USE_TRIM + rt[0] = clst2sect(fs, scl); /* Start of data area to be freed */ + rt[1] = clst2sect(fs, ecl) + fs->csize - 1; /* End of data area to be freed */ + disk_ioctl(fs->pdrv, CTRL_TRIM, rt); /* Inform storage device that the data in the block may be erased */ +#endif + scl = ecl = nxt; + } +#endif + clst = nxt; /* Next cluster */ + } while (clst < fs->n_fatent); /* Repeat while not the last link */ + +#if FF_FS_EXFAT + /* Some post processes for chain status */ + if (fs->fs_type == FS_EXFAT) { + if (pclst == 0) { /* Has the entire chain been removed? */ + obj->stat = 0; /* Change the chain status 'initial' */ + } else { + if (obj->stat == 0) { /* Is it a fragmented chain from the beginning of this session? */ + clst = obj->sclust; /* Follow the chain to check if it gets contiguous */ + while (clst != pclst) { + nxt = get_fat(obj, clst); + if (nxt < 2) return FR_INT_ERR; + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; + if (nxt != clst + 1) break; /* Not contiguous? */ + clst++; + } + if (clst == pclst) { /* Has the chain got contiguous again? */ + obj->stat = 2; /* Change the chain status 'contiguous' */ + } + } else { + if (obj->stat == 3 && pclst >= obj->sclust && pclst <= obj->sclust + obj->n_cont) { /* Was the chain fragmented in this session and got contiguous again? */ + obj->stat = 2; /* Change the chain status 'contiguous' */ + } + } + } + } +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch a chain or Create a new chain */ +/*-----------------------------------------------------------------------*/ + +static DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst /* Cluster# to stretch, 0:Create a new chain */ +) +{ + DWORD cs, ncl, scl; + FRESULT res; + FATFS *fs = obj->fs; + + + if (clst == 0) { /* Create a new chain */ + scl = fs->last_clst; /* Suggested cluster to start to find */ + if (scl == 0 || scl >= fs->n_fatent) scl = 1; + } + else { /* Stretch a chain */ + cs = get_fat(obj, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* Test for insanity */ + if (cs == 0xFFFFFFFF) return cs; /* Test for disk error */ + if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ + scl = clst; /* Cluster to start to find */ + } + if (fs->free_clst == 0) return 0; /* No free cluster */ + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + ncl = find_bitmap(fs, scl, 1); /* Find a free cluster */ + if (ncl == 0 || ncl == 0xFFFFFFFF) return ncl; /* No free cluster or hard error? */ + res = change_bitmap(fs, ncl, 1, 1); /* Mark the cluster 'in use' */ + if (res == FR_INT_ERR) return 1; + if (res == FR_DISK_ERR) return 0xFFFFFFFF; + if (clst == 0) { /* Is it a new chain? */ + obj->stat = 2; /* Set status 'contiguous' */ + } else { /* It is a stretched chain */ + if (obj->stat == 2 && ncl != scl + 1) { /* Is the chain got fragmented? */ + obj->n_cont = scl - obj->sclust; /* Set size of the contiguous part */ + obj->stat = 3; /* Change status 'just fragmented' */ + } + } + if (obj->stat != 2) { /* Is the file non-contiguous? */ + if (ncl == clst + 1) { /* Is the cluster next to previous one? */ + obj->n_frag = obj->n_frag ? obj->n_frag + 1 : 2; /* Increment size of last framgent */ + } else { /* New fragment */ + if (obj->n_frag == 0) obj->n_frag = 1; + res = fill_last_frag(obj, clst, ncl); /* Fill last fragment on the FAT and link it to new one */ + if (res == FR_OK) obj->n_frag = 1; + } + } + } else +#endif + { /* On the FAT/FAT32 volume */ + ncl = 0; + if (scl == clst) { /* Stretching an existing chain? */ + ncl = scl + 1; /* Test if next cluster is free */ + if (ncl >= fs->n_fatent) ncl = 2; + cs = get_fat(obj, ncl); /* Get next cluster status */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ + if (cs != 0) { /* Not free? */ + cs = fs->last_clst; /* Start at suggested cluster if it is valid */ + if (cs >= 2 && cs < fs->n_fatent) scl = cs; + ncl = 0; + } + } + if (ncl == 0) { /* The new cluster cannot be contiguous and find another fragment */ + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= fs->n_fatent) { /* Check wrap-around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster found? */ + } + cs = get_fat(obj, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster? */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ + if (ncl == scl) return 0; /* No free cluster found? */ + } + } + res = put_fat(fs, ncl, 0xFFFFFFFF); /* Mark the new cluster 'EOC' */ + if (res == FR_OK && clst != 0) { + res = put_fat(fs, clst, ncl); /* Link it from the previous one if needed */ + } + } + + if (res == FR_OK) { /* Update FSINFO if function succeeded. */ + fs->last_clst = ncl; + if (fs->free_clst <= fs->n_fatent - 2) fs->free_clst--; + fs->fsi_flag |= 1; + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; /* Failed. Generate error status */ + } + + return ncl; /* Return new cluster number or error status */ +} + +#endif /* !FF_FS_READONLY */ + + + + +#if FF_USE_FASTSEEK +/*-----------------------------------------------------------------------*/ +/* FAT handling - Convert offset into cluster with link map table */ +/*-----------------------------------------------------------------------*/ + +static DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File offset to be converted to cluster# */ +) +{ + DWORD cl, ncl, *tbl; + FATFS *fs = fp->obj.fs; + + + tbl = fp->cltbl + 1; /* Top of CLMT */ + cl = (DWORD)(ofs / SS(fs) / fs->csize); /* Cluster order from top of the file */ + for (;;) { + ncl = *tbl++; /* Number of cluters in the fragment */ + if (ncl == 0) return 0; /* End of table? (error) */ + if (cl < ncl) break; /* In this fragment? */ + cl -= ncl; tbl++; /* Next fragment */ + } + return cl + *tbl; /* Return the cluster number */ +} + +#endif /* FF_USE_FASTSEEK */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Fill a cluster with zeros */ +/*-----------------------------------------------------------------------*/ + +#if !FF_FS_READONLY +static FRESULT dir_clear ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS *fs, /* Filesystem object */ + DWORD clst /* Directory table to clear */ +) +{ + LBA_t sect; + UINT n, szb; + BYTE *ibuf; + + + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; /* Flush disk access window */ + sect = clst2sect(fs, clst); /* Top of the cluster */ + fs->winsect = sect; /* Set window to top of the cluster */ + memset(fs->win, 0, sizeof fs->win); /* Clear window buffer */ +#if FF_USE_LFN == 3 /* Quick table clear by using multi-secter write */ + /* Allocate a temporary buffer */ + for (szb = ((DWORD)fs->csize * SS(fs) >= MAX_MALLOC) ? MAX_MALLOC : fs->csize * SS(fs), ibuf = 0; szb > SS(fs) && (ibuf = ff_memalloc(szb)) == 0; szb /= 2) ; + if (szb > SS(fs)) { /* Buffer allocated? */ + memset(ibuf, 0, szb); + szb /= SS(fs); /* Bytes -> Sectors */ + for (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ; /* Fill the cluster with 0 */ + ff_memfree(ibuf); + } else +#endif + { + ibuf = fs->win; szb = 1; /* Use window buffer (many single-sector writes may take a time) */ + for (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ; /* Fill the cluster with 0 */ + } + return (n == fs->csize) ? FR_OK : FR_DISK_ERR; +} +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to directory object */ + DWORD ofs /* Offset of directory table */ +) +{ + DWORD csz, clst; + FATFS *fs = dp->obj.fs; + + + if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) { /* Check range of offset and alignment */ + return FR_INT_ERR; + } + dp->dptr = ofs; /* Set current offset */ + clst = dp->obj.sclust; /* Table start cluster (0:root) */ + if (clst == 0 && fs->fs_type >= FS_FAT32) { /* Replace cluster# 0 with root cluster# */ + clst = (DWORD)fs->dirbase; + if (FF_FS_EXFAT) dp->obj.stat = 0; /* exFAT: Root dir has an FAT chain */ + } + + if (clst == 0) { /* Static table (root-directory on the FAT volume) */ + if (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR; /* Is index out of range? */ + dp->sect = fs->dirbase; + + } else { /* Dynamic table (sub-directory or root-directory on the FAT32/exFAT volume) */ + csz = (DWORD)fs->csize * SS(fs); /* Bytes per cluster */ + while (ofs >= csz) { /* Follow cluster chain */ + clst = get_fat(&dp->obj, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Reached to end of table or internal error */ + ofs -= csz; + } + dp->sect = clst2sect(fs, clst); + } + dp->clust = clst; /* Current cluster# */ + if (dp->sect == 0) return FR_INT_ERR; + dp->sect += ofs / SS(fs); /* Sector# of the directory entry */ + dp->dir = fs->win + (ofs % SS(fs)); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory table index next */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_next ( /* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ + DIR* dp, /* Pointer to the directory object */ + int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ +) +{ + DWORD ofs, clst; + FATFS *fs = dp->obj.fs; + + + ofs = dp->dptr + SZDIRE; /* Next entry */ + if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) dp->sect = 0; /* Disable it if the offset reached the max value */ + if (dp->sect == 0) return FR_NO_FILE; /* Report EOT if it has been disabled */ + + if (ofs % SS(fs) == 0) { /* Sector changed? */ + dp->sect++; /* Next sector */ + + if (dp->clust == 0) { /* Static table */ + if (ofs / SZDIRE >= fs->n_rootdir) { /* Report EOT if it reached end of static table */ + dp->sect = 0; return FR_NO_FILE; + } + } + else { /* Dynamic table */ + if ((ofs / SS(fs) & (fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(&dp->obj, dp->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst >= fs->n_fatent) { /* It reached end of dynamic table */ +#if !FF_FS_READONLY + if (!stretch) { /* If no stretch, report EOT */ + dp->sect = 0; return FR_NO_FILE; + } + clst = create_chain(&dp->obj, dp->clust); /* Allocate a cluster */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (dir_clear(fs, clst) != FR_OK) return FR_DISK_ERR; /* Clean up the stretched table */ + if (FF_FS_EXFAT) dp->obj.stat |= 4; /* exFAT: The directory has been stretched */ +#else + if (!stretch) dp->sect = 0; /* (this line is to suppress compiler warning) */ + dp->sect = 0; return FR_NO_FILE; /* Report EOT */ +#endif + } + dp->clust = clst; /* Initialize data for new cluster */ + dp->sect = clst2sect(fs, clst); + } + } + } + dp->dptr = ofs; /* Current entry */ + dp->dir = fs->win + ofs % SS(fs); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Directory handling - Reserve a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_alloc ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to the directory object */ + UINT n_ent /* Number of contiguous entries to allocate */ +) +{ + FRESULT res; + UINT n; + FATFS *fs = dp->obj.fs; + + + res = dir_sdi(dp, 0); + if (res == FR_OK) { + n = 0; + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; +#if FF_FS_EXFAT + if ((fs->fs_type == FS_EXFAT) ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) : (int)(dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0)) { /* Is the entry free? */ +#else + if (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) { /* Is the entry free? */ +#endif + if (++n == n_ent) break; /* Is a block of contiguous free entries found? */ + } else { + n = 0; /* Not a free entry, restart to search */ + } + res = dir_next(dp, 1); /* Next entry with table stretch enabled */ + } while (res == FR_OK); + } + + if (res == FR_NO_FILE) res = FR_DENIED; /* No directory entry to allocate */ + return res; +} + +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT: Directory handling - Load/Store start cluster number */ +/*-----------------------------------------------------------------------*/ + +static DWORD ld_clust ( /* Returns the top cluster value of the SFN entry */ + FATFS* fs, /* Pointer to the fs object */ + const BYTE* dir /* Pointer to the key entry */ +) +{ + DWORD cl; + + cl = ld_word(dir + DIR_FstClusLO); + if (fs->fs_type == FS_FAT32) { + cl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16; + } + + return cl; +} + + +#if !FF_FS_READONLY +static void st_clust ( + FATFS* fs, /* Pointer to the fs object */ + BYTE* dir, /* Pointer to the key entry */ + DWORD cl /* Value to be set */ +) +{ + st_word(dir + DIR_FstClusLO, (WORD)cl); + if (fs->fs_type == FS_FAT32) { + st_word(dir + DIR_FstClusHI, (WORD)(cl >> 16)); + } +} +#endif + + + +#if FF_USE_LFN +/*--------------------------------------------------------*/ +/* FAT-LFN: Compare a part of file name with an LFN entry */ +/*--------------------------------------------------------*/ + +static int cmp_lfn ( /* 1:matched, 0:not matched */ + const WCHAR* lfnbuf, /* Pointer to the LFN working buffer to be compared */ + BYTE* dir /* Pointer to the directory entry containing the part of LFN */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc != 0) { + if (i >= FF_MAX_LFN + 1 || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { /* Compare it */ + return 0; /* Not matched */ + } + wc = uc; + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0; /* Last segment matched but different length */ + + return 1; /* The part of LFN matched */ +} + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------*/ +/* FAT-LFN: Pick a part of file name from an LFN entry */ +/*-----------------------------------------------------*/ + +static int pick_lfn ( /* 1:succeeded, 0:buffer overflow or invalid LFN entry */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir /* Pointer to the LFN entry */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO is 0 */ + + i = ((dir[LDIR_Ord] & ~LLEF) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc != 0) { + if (i >= FF_MAX_LFN + 1) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if (dir[LDIR_Ord] & LLEF && wc != 0) { /* Put terminator if it is the last LFN part and not terminated */ + if (i >= FF_MAX_LFN + 1) return 0; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return 1; /* The part of LFN is valid */ +} +#endif + + +#if !FF_FS_READONLY +/*-----------------------------------------*/ +/* FAT-LFN: Create an entry of LFN entries */ +/*-----------------------------------------*/ + +static void put_lfn ( + const WCHAR* lfn, /* Pointer to the LFN */ + BYTE* dir, /* Pointer to the LFN entry to be created */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* Checksum of the corresponding SFN */ +) +{ + UINT i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set checksum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + st_word(dir + LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ + st_word(dir + LfnOfs[s], wc); /* Put it */ + if (wc == 0) wc = 0xFFFF; /* Padding characters for following items */ + } while (++s < 13); + if (wc == 0xFFFF || !lfn[i]) ord |= LLEF; /* Last LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_LFN */ + + + +#if FF_USE_LFN && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Create a Numbered SFN */ +/*-----------------------------------------------------------------------*/ + +static void gen_numname ( + BYTE* dst, /* Pointer to the buffer to store numbered SFN */ + const BYTE* src, /* Pointer to SFN in directory form */ + const WCHAR* lfn, /* Pointer to LFN */ + UINT seq /* Sequence number */ +) +{ + BYTE ns[8], c; + UINT i, j; + WCHAR wc; + DWORD sreg; + + + memcpy(dst, src, 11); /* Prepare the SFN to be modified */ + + if (seq > 5) { /* In case of many collisions, generate a hash number instead of sequential number */ + sreg = seq; + while (*lfn) { /* Create a CRC as hash value */ + wc = *lfn++; + for (i = 0; i < 16; i++) { + sreg = (sreg << 1) + (wc & 1); + wc >>= 1; + if (sreg & 0x10000) sreg ^= 0x11021; + } + } + seq = (UINT)sreg; + } + + /* Make suffix (~ + hexdecimal) */ + i = 7; + do { + c = (BYTE)((seq % 16) + '0'); seq /= 16; + if (c > '9') c += 7; + ns[i--] = c; + } while (i && seq); + ns[i] = '~'; + + /* Append the suffix to the SFN body */ + for (j = 0; j < i && dst[j] != ' '; j++) { /* Find the offset to append */ + if (dbc_1st(dst[j])) { /* To avoid DBC break up */ + if (j == i - 1) break; + j++; + } + } + do { /* Append the suffix */ + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif /* FF_USE_LFN && !FF_FS_READONLY */ + + + +#if FF_USE_LFN +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Calculate checksum of an SFN entry */ +/*-----------------------------------------------------------------------*/ + +static BYTE sum_sfn ( + const BYTE* dir /* Pointer to the SFN entry */ +) +{ + BYTE sum = 0; + UINT n = 11; + + do { + sum = (sum >> 1) + (sum << 7) + *dir++; + } while (--n); + return sum; +} + +#endif /* FF_USE_LFN */ + + + +#if FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* exFAT: Checksum */ +/*-----------------------------------------------------------------------*/ + +static WORD xdir_sum ( /* Get checksum of the directoly entry block */ + const BYTE* dir /* Directory entry block to be calculated */ +) +{ + UINT i, szblk; + WORD sum; + + + szblk = (dir[XDIR_NumSec] + 1) * SZDIRE; /* Number of bytes of the entry block */ + for (i = sum = 0; i < szblk; i++) { + if (i == XDIR_SetSum) { /* Skip 2-byte sum field */ + i++; + } else { + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i]; + } + } + return sum; +} + + + +static WORD xname_sum ( /* Get check sum (to be used as hash) of the file name */ + const WCHAR* name /* File name to be calculated */ +) +{ + WCHAR chr; + WORD sum = 0; + + + while ((chr = *name++) != 0) { + chr = (WCHAR)ff_wtoupper(chr); /* File name needs to be up-case converted */ + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF); + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8); + } + return sum; +} + + +#if !FF_FS_READONLY && FF_USE_MKFS +static DWORD xsum32 ( /* Returns 32-bit checksum */ + BYTE dat, /* Byte to be calculated (byte-by-byte processing) */ + DWORD sum /* Previous sum value */ +) +{ + sum = ((sum & 1) ? 0x80000000 : 0) + (sum >> 1) + dat; + return sum; +} +#endif + + + +/*-----------------------------------*/ +/* exFAT: Get a directry entry block */ +/*-----------------------------------*/ + +static FRESULT load_xdir ( /* FR_INT_ERR: invalid entry block */ + DIR* dp /* Reading direcotry object pointing top of the entry block to load */ +) +{ + FRESULT res; + UINT i, sz_ent; + BYTE *dirb = dp->obj.fs->dirbuf; /* Pointer to the on-memory direcotry entry block 85+C0+C1s */ + + + /* Load file directory entry */ + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != ET_FILEDIR) return FR_INT_ERR; /* Invalid order */ + memcpy(dirb + 0 * SZDIRE, dp->dir, SZDIRE); + sz_ent = (dirb[XDIR_NumSec] + 1) * SZDIRE; + if (sz_ent < 3 * SZDIRE || sz_ent > 19 * SZDIRE) return FR_INT_ERR; + + /* Load stream extension entry */ + res = dir_next(dp, 0); + if (res == FR_NO_FILE) res = FR_INT_ERR; /* It cannot be */ + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != ET_STREAM) return FR_INT_ERR; /* Invalid order */ + memcpy(dirb + 1 * SZDIRE, dp->dir, SZDIRE); + if (MAXDIRB(dirb[XDIR_NumName]) > sz_ent) return FR_INT_ERR; + + /* Load file name entries */ + i = 2 * SZDIRE; /* Name offset to load */ + do { + res = dir_next(dp, 0); + if (res == FR_NO_FILE) res = FR_INT_ERR; /* It cannot be */ + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != ET_FILENAME) return FR_INT_ERR; /* Invalid order */ + if (i < MAXDIRB(FF_MAX_LFN)) memcpy(dirb + i, dp->dir, SZDIRE); + } while ((i += SZDIRE) < sz_ent); + + /* Sanity check (do it for only accessible object) */ + if (i <= MAXDIRB(FF_MAX_LFN)) { + if (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) return FR_INT_ERR; + } + return FR_OK; +} + + +/*------------------------------------------------------------------*/ +/* exFAT: Initialize object allocation info with loaded entry block */ +/*------------------------------------------------------------------*/ + +static void init_alloc_info ( + FATFS* fs, /* Filesystem object */ + FFOBJID* obj /* Object allocation information to be initialized */ +) +{ + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Start cluster */ + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); /* Size */ + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; /* Allocation status */ + obj->n_frag = 0; /* No last fragment info */ +} + + + +#if !FF_FS_READONLY || FF_FS_RPATH != 0 +/*------------------------------------------------*/ +/* exFAT: Load the object's directory entry block */ +/*------------------------------------------------*/ + +static FRESULT load_obj_xdir ( + DIR* dp, /* Blank directory object to be used to access containing direcotry */ + const FFOBJID* obj /* Object with its containing directory information */ +) +{ + FRESULT res; + + /* Open object containing directory */ + dp->obj.fs = obj->fs; + dp->obj.sclust = obj->c_scl; + dp->obj.stat = (BYTE)obj->c_size; + dp->obj.objsize = obj->c_size & 0xFFFFFF00; + dp->obj.n_frag = 0; + dp->blk_ofs = obj->c_ofs; + + res = dir_sdi(dp, dp->blk_ofs); /* Goto object's entry block */ + if (res == FR_OK) { + res = load_xdir(dp); /* Load the object's entry block */ + } + return res; +} +#endif + + +#if !FF_FS_READONLY +/*----------------------------------------*/ +/* exFAT: Store the directory entry block */ +/*----------------------------------------*/ + +static FRESULT store_xdir ( + DIR* dp /* Pointer to the direcotry object */ +) +{ + FRESULT res; + UINT nent; + BYTE *dirb = dp->obj.fs->dirbuf; /* Pointer to the direcotry entry block 85+C0+C1s */ + + /* Create set sum */ + st_word(dirb + XDIR_SetSum, xdir_sum(dirb)); + nent = dirb[XDIR_NumSec] + 1; + + /* Store the direcotry entry block to the directory */ + res = dir_sdi(dp, dp->blk_ofs); + while (res == FR_OK) { + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) break; + memcpy(dp->dir, dirb, SZDIRE); + dp->obj.fs->wflag = 1; + if (--nent == 0) break; + dirb += SZDIRE; + res = dir_next(dp, 0); + } + return (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR; +} + + + +/*-------------------------------------------*/ +/* exFAT: Create a new directory enrty block */ +/*-------------------------------------------*/ + +static void create_xdir ( + BYTE* dirb, /* Pointer to the direcotry entry block buffer */ + const WCHAR* lfn /* Pointer to the object name */ +) +{ + UINT i; + BYTE nc1, nlen; + WCHAR wc; + + + /* Create file-directory and stream-extension entry */ + memset(dirb, 0, 2 * SZDIRE); + dirb[0 * SZDIRE + XDIR_Type] = ET_FILEDIR; + dirb[1 * SZDIRE + XDIR_Type] = ET_STREAM; + + /* Create file-name entries */ + i = SZDIRE * 2; /* Top of file_name entries */ + nlen = nc1 = 0; wc = 1; + do { + dirb[i++] = ET_FILENAME; dirb[i++] = 0; + do { /* Fill name field */ + if (wc != 0 && (wc = lfn[nlen]) != 0) nlen++; /* Get a character if exist */ + st_word(dirb + i, wc); /* Store it */ + i += 2; + } while (i % SZDIRE != 0); + nc1++; + } while (lfn[nlen]); /* Fill next entry if any char follows */ + + dirb[XDIR_NumName] = nlen; /* Set name length */ + dirb[XDIR_NumSec] = 1 + nc1; /* Set secondary count (C0 + C1s) */ + st_word(dirb + XDIR_NameHash, xname_sum(lfn)); /* Set name hash */ +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_FS_EXFAT */ + + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ + +#define DIR_READ_FILE(dp) dir_read(dp, 0) +#define DIR_READ_LABEL(dp) dir_read(dp, 1) + +static FRESULT dir_read ( + DIR* dp, /* Pointer to the directory object */ + int vol /* Filtered by 0:file/directory or 1:volume label */ +) +{ + FRESULT res = FR_NO_FILE; + FATFS *fs = dp->obj.fs; + BYTE attr, b; +#if FF_USE_LFN + BYTE ord = 0xFF, sum = 0xFF; +#endif + + while (dp->sect) { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + b = dp->dir[DIR_Name]; /* Test for the entry type */ + if (b == 0) { + res = FR_NO_FILE; break; /* Reached to end of the directory */ + } +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + if (FF_USE_LABEL && vol) { + if (b == ET_VLABEL) break; /* Volume label entry? */ + } else { + if (b == ET_FILEDIR) { /* Start of the file entry block? */ + dp->blk_ofs = dp->dptr; /* Get location of the block */ + res = load_xdir(dp); /* Load the entry block */ + if (res == FR_OK) { + dp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK; /* Get attribute */ + } + break; + } + } + } else +#endif + { /* On the FAT/FAT32 volume */ + dp->obj.attr = attr = dp->dir[DIR_Attr] & AM_MASK; /* Get attribute */ +#if FF_USE_LFN /* LFN configuration */ + if (b == DDEM || b == '.' || (int)((attr & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (attr == AM_LFN) { /* An LFN entry is found */ + if (b & LLEF) { /* Is it start of an LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + b &= (BYTE)~LLEF; ord = b; + dp->blk_ofs = dp->dptr; + } + /* Check LFN validity and capture it */ + ord = (b == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord != 0 || sum != sum_sfn(dp->dir)) { /* Is there a valid LFN? */ + dp->blk_ofs = 0xFFFFFFFF; /* It has no LFN. */ + } + break; + } + } +#else /* Non LFN configuration */ + if (b != DDEM && b != '.' && attr != AM_LFN && (int)((attr & ~AM_ARC) == AM_VOL) == vol) { /* Is it a valid entry? */ + break; + } +#endif + } + res = dir_next(dp, 0); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dp->sect = 0; /* Terminate the read operation on error or EOT */ + return res; +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_USE_LABEL || FF_FS_RPATH >= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp /* Pointer to the directory object with the file name */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; + BYTE c; +#if FF_USE_LFN + BYTE a, ord, sum; +#endif + + res = dir_sdi(dp, 0); /* Rewind directory object */ + if (res != FR_OK) return res; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + BYTE nc; + UINT di, ni; + WORD hash = xname_sum(fs->lfnbuf); /* Hash value of the name to find */ + + while ((res = DIR_READ_FILE(dp)) == FR_OK) { /* Read an item */ +#if FF_MAX_LFN < 255 + if (fs->dirbuf[XDIR_NumName] > FF_MAX_LFN) continue; /* Skip comparison if inaccessible object name */ +#endif + if (ld_word(fs->dirbuf + XDIR_NameHash) != hash) continue; /* Skip comparison if hash mismatched */ + for (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; nc--, di += 2, ni++) { /* Compare the name */ + if ((di % SZDIRE) == 0) di += 2; + if (ff_wtoupper(ld_word(fs->dirbuf + di)) != ff_wtoupper(fs->lfnbuf[ni])) break; + } + if (nc == 0 && !fs->lfnbuf[ni]) break; /* Name matched? */ + } + return res; + } +#endif + /* On the FAT/FAT32 volume */ +#if FF_USE_LFN + ord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ +#endif + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if FF_USE_LFN /* LFN configuration */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (!(dp->fn[NSFLAG] & NS_NOLFN)) { + if (c & LLEF) { /* Is it start of LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= (BYTE)~LLEF; ord = c; /* LFN start order */ + dp->blk_ofs = dp->dptr; /* Start offset of LFN */ + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (ord == 0 && sum == sum_sfn(dp->dir)) break; /* LFN matched? */ + if (!(dp->fn[NSFLAG] & NS_LOSS) && !memcmp(dp->dir, dp->fn, 11)) break; /* SFN matched? */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } + } +#else /* Non LFN configuration */ + dp->obj.attr = dp->dir[DIR_Attr] & AM_MASK; + if (!(dp->dir[DIR_Attr] & AM_VOL) && !memcmp(dp->dir, dp->fn, 11)) break; /* Is it a valid entry? */ +#endif + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ + DIR* dp /* Target directory with object name to be created */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if FF_USE_LFN /* LFN configuration */ + UINT n, len, n_ent; + BYTE sn[12], sum; + + + if (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME; /* Check name validity */ + for (len = 0; fs->lfnbuf[len]; len++) ; /* Get lfn length */ + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + n_ent = (len + 14) / 15 + 2; /* Number of entries to allocate (85+C0+C1s) */ + res = dir_alloc(dp, n_ent); /* Allocate directory entries */ + if (res != FR_OK) return res; + dp->blk_ofs = dp->dptr - SZDIRE * (n_ent - 1); /* Set the allocated entry block offset */ + + if (dp->obj.stat & 4) { /* Has the directory been stretched by new allocation? */ + dp->obj.stat &= ~4; + res = fill_first_frag(&dp->obj); /* Fill the first fragment on the FAT if needed */ + if (res != FR_OK) return res; + res = fill_last_frag(&dp->obj, dp->clust, 0xFFFFFFFF); /* Fill the last fragment on the FAT if needed */ + if (res != FR_OK) return res; + if (dp->obj.sclust != 0) { /* Is it a sub-directory? */ + DIR dj; + + res = load_obj_xdir(&dj, &dp->obj); /* Load the object status */ + if (res != FR_OK) return res; + dp->obj.objsize += (DWORD)fs->csize * SS(fs); /* Increase the directory size by cluster size */ + st_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize); + st_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize); + fs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1; /* Update the allocation status */ + res = store_xdir(&dj); /* Store the object status */ + if (res != FR_OK) return res; + } + } + + create_xdir(fs->dirbuf, fs->lfnbuf); /* Create on-memory directory block to be written later */ + return FR_OK; + } +#endif + /* On the FAT/FAT32 volume */ + memcpy(sn, dp->fn, 12); + if (sn[NSFLAG] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + dp->fn[NSFLAG] = NS_NOLFN; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(dp->fn, sn, fs->lfnbuf, n); /* Generate a numbered name */ + res = dir_find(dp); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + dp->fn[NSFLAG] = sn[NSFLAG]; + } + + /* Create an SFN with/without LFNs. */ + n_ent = (sn[NSFLAG] & NS_LFN) ? (len + 12) / 13 + 1 : 1; /* Number of entries to allocate */ + res = dir_alloc(dp, n_ent); /* Allocate entries */ + if (res == FR_OK && --n_ent) { /* Set LFN entry if needed */ + res = dir_sdi(dp, dp->dptr - n_ent * SZDIRE); + if (res == FR_OK) { + sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ + do { /* Store LFN entries in bottom first */ + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + put_lfn(fs->lfnbuf, dp->dir, (BYTE)n_ent, sum); + fs->wflag = 1; + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK && --n_ent); + } + } + +#else /* Non LFN configuration */ + res = dir_alloc(dp, 1); /* Allocate an entry for SFN */ + +#endif + + /* Set SFN entry */ + if (res == FR_OK) { + res = move_window(fs, dp->sect); + if (res == FR_OK) { + memset(dp->dir, 0, SZDIRE); /* Clean the entry */ + memcpy(dp->dir + DIR_Name, dp->fn, 11); /* Put SFN */ +#if FF_USE_LFN + dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ +#endif + fs->wflag = 1; + } + } + + return res; +} + +#endif /* !FF_FS_READONLY */ + + + +#if !FF_FS_READONLY && FF_FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_remove ( /* FR_OK:Succeeded, FR_DISK_ERR:A disk error */ + DIR* dp /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if FF_USE_LFN /* LFN configuration */ + DWORD last = dp->dptr; + + res = (dp->blk_ofs == 0xFFFFFFFF) ? FR_OK : dir_sdi(dp, dp->blk_ofs); /* Goto top of the entry block if LFN is exist */ + if (res == FR_OK) { + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + dp->dir[XDIR_Type] &= 0x7F; /* Clear the entry InUse flag. */ + } else { /* On the FAT/FAT32 volume */ + dp->dir[DIR_Name] = DDEM; /* Mark the entry 'deleted'. */ + } + fs->wflag = 1; + if (dp->dptr >= last) break; /* If reached last entry then all entries of the object has been deleted. */ + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } +#else /* Non LFN configuration */ + + res = move_window(fs, dp->sect); + if (res == FR_OK) { + dp->dir[DIR_Name] = DDEM; /* Mark the entry 'deleted'.*/ + fs->wflag = 1; + } +#endif + + return res; +} + +#endif /* !FF_FS_READONLY && FF_FS_MINIMIZE == 0 */ + + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ + +static void get_fileinfo ( + DIR* dp, /* Pointer to the directory object */ + FILINFO* fno /* Pointer to the file information to be filled */ +) +{ + UINT si, di; +#if FF_USE_LFN + BYTE lcf; + WCHAR wc, hs; + FATFS *fs = dp->obj.fs; + UINT nw; +#else + TCHAR c; +#endif + + + fno->fname[0] = 0; /* Invaidate file info */ + if (dp->sect == 0) return; /* Exit if read pointer has reached end of directory */ + +#if FF_USE_LFN /* LFN configuration */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* exFAT volume */ + UINT nc = 0; + + si = SZDIRE * 2; di = 0; /* 1st C1 entry in the entry block */ + hs = 0; + while (nc < fs->dirbuf[XDIR_NumName]) { + if (si >= MAXDIRB(FF_MAX_LFN)) { di = 0; break; } /* Truncated directory block? */ + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + wc = ld_word(fs->dirbuf + si); si += 2; nc++; /* Get a character */ + if (hs == 0 && IsSurrogate(wc)) { /* Is it a surrogate? */ + hs = wc; continue; /* Get low surrogate */ + } + nw = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); /* Store it in API encoding */ + if (nw == 0) { di = 0; break; } /* Buffer overflow or wrong char? */ + di += nw; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + if (di == 0) fno->fname[di++] = '?'; /* Inaccessible object name? */ + fno->fname[di] = 0; /* Terminate the name */ + fno->altname[0] = 0; /* exFAT does not support SFN */ + + fno->fattrib = fs->dirbuf[XDIR_Attr] & AM_MASKX; /* Attribute */ + fno->fsize = (fno->fattrib & AM_DIR) ? 0 : ld_qword(fs->dirbuf + XDIR_FileSize); /* Size */ + fno->ftime = ld_word(fs->dirbuf + XDIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(fs->dirbuf + XDIR_ModTime + 2); /* Date */ + return; + } else +#endif + { /* FAT/FAT32 volume */ + if (dp->blk_ofs != 0xFFFFFFFF) { /* Get LFN if available */ + si = di = 0; + hs = 0; + while (fs->lfnbuf[si] != 0) { + wc = fs->lfnbuf[si++]; /* Get an LFN character (UTF-16) */ + if (hs == 0 && IsSurrogate(wc)) { /* Is it a surrogate? */ + hs = wc; continue; /* Get low surrogate */ + } + nw = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); /* Store it in API encoding */ + if (nw == 0) { di = 0; break; } /* Buffer overflow or wrong char? */ + di += nw; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + fno->fname[di] = 0; /* Terminate the LFN (null string means LFN is invalid) */ + } + } + + si = di = 0; + while (si < 11) { /* Get SFN from SFN entry */ + wc = dp->dir[si++]; /* Get a char */ + if (wc == ' ') continue; /* Skip padding spaces */ + if (wc == RDDEM) wc = DDEM; /* Restore replaced DDEM character */ + if (si == 9 && di < FF_SFN_BUF) fno->altname[di++] = '.'; /* Insert a . if extension is exist */ +#if FF_LFN_UNICODE >= 1 /* Unicode output */ + if (dbc_1st((BYTE)wc) && si != 8 && si != 11 && dbc_2nd(dp->dir[si])) { /* Make a DBC if needed */ + wc = wc << 8 | dp->dir[si++]; + } + wc = ff_oem2uni(wc, CODEPAGE); /* ANSI/OEM -> Unicode */ + if (wc == 0) { di = 0; break; } /* Wrong char in the current code page? */ + nw = put_utf(wc, &fno->altname[di], FF_SFN_BUF - di); /* Store it in API encoding */ + if (nw == 0) { di = 0; break; } /* Buffer overflow? */ + di += nw; +#else /* ANSI/OEM output */ + fno->altname[di++] = (TCHAR)wc; /* Store it without any conversion */ +#endif + } + fno->altname[di] = 0; /* Terminate the SFN (null string means SFN is invalid) */ + + if (fno->fname[0] == 0) { /* If LFN is invalid, altname[] needs to be copied to fname[] */ + if (di == 0) { /* If LFN and SFN both are invalid, this object is inaccesible */ + fno->fname[di++] = '?'; + } else { + for (si = di = 0, lcf = NS_BODY; fno->altname[si]; si++, di++) { /* Copy altname[] to fname[] with case information */ + wc = (WCHAR)fno->altname[si]; + if (wc == '.') lcf = NS_EXT; + if (IsUpper(wc) && (dp->dir[DIR_NTres] & lcf)) wc += 0x20; + fno->fname[di] = (TCHAR)wc; + } + } + fno->fname[di] = 0; /* Terminate the LFN */ + if (!dp->dir[DIR_NTres]) fno->altname[0] = 0; /* Altname is not needed if neither LFN nor case info is exist. */ + } + +#else /* Non-LFN configuration */ + si = di = 0; + while (si < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[si++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = DDEM; /* Restore replaced DDEM character */ + if (si == 9) fno->fname[di++] = '.';/* Insert a . if extension is exist */ + fno->fname[di++] = c; + } + fno->fname[di] = 0; /* Terminate the SFN */ +#endif + + fno->fattrib = dp->dir[DIR_Attr] & AM_MASK; /* Attribute */ + fno->fsize = ld_dword(dp->dir + DIR_FileSize); /* Size */ + fno->ftime = ld_word(dp->dir + DIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dp->dir + DIR_ModTime + 2); /* Date */ +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */ + + + +#if FF_USE_FIND && FF_FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ + +#define FIND_RECURS 4 /* Maximum number of wildcard terms in the pattern to limit recursion */ + + +static DWORD get_achar ( /* Get a character and advance ptr */ + const TCHAR** ptr /* Pointer to pointer to the ANSI/OEM or Unicode string */ +) +{ + DWORD chr; + + +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 /* Unicode input */ + chr = tchar2uni(ptr); + if (chr == 0xFFFFFFFF) chr = 0; /* Wrong UTF encoding is recognized as end of the string */ + chr = ff_wtoupper(chr); + +#else /* ANSI/OEM input */ + chr = (BYTE)*(*ptr)++; /* Get a byte */ + if (IsLower(chr)) chr -= 0x20; /* To upper ASCII char */ +#if FF_CODE_PAGE == 0 + if (ExCvt && chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#elif FF_CODE_PAGE < 900 + if (chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#endif +#if FF_CODE_PAGE == 0 || FF_CODE_PAGE >= 900 + if (dbc_1st((BYTE)chr)) { /* Get DBC 2nd byte if needed */ + chr = dbc_2nd((BYTE)**ptr) ? chr << 8 | (BYTE)*(*ptr)++ : 0; + } +#endif + +#endif + return chr; +} + + +static int pattern_match ( /* 0:mismatched, 1:matched */ + const TCHAR* pat, /* Matching pattern */ + const TCHAR* nam, /* String to be tested */ + UINT skip, /* Number of pre-skip chars (number of ?s, b8:infinite (* specified)) */ + UINT recur /* Recursion count */ +) +{ + const TCHAR *pptr, *nptr; + DWORD pchr, nchr; + UINT sk; + + + while ((skip & 0xFF) != 0) { /* Pre-skip name chars */ + if (!get_achar(&nam)) return 0; /* Branch mismatched if less name chars */ + skip--; + } + if (*pat == 0 && skip) return 1; /* Matched? (short circuit) */ + + do { + pptr = pat; nptr = nam; /* Top of pattern and name to match */ + for (;;) { + if (*pptr == '?' || *pptr == '*') { /* Wildcard term? */ + if (recur == 0) return 0; /* Too many wildcard terms? */ + sk = 0; + do { /* Analyze the wildcard term */ + if (*pptr++ == '?') sk++; else sk |= 0x100; + } while (*pptr == '?' || *pptr == '*'); + if (pattern_match(pptr, nptr, sk, recur - 1)) return 1; /* Test new branch (recursive call) */ + nchr = *nptr; break; /* Branch mismatched */ + } + pchr = get_achar(&pptr); /* Get a pattern char */ + nchr = get_achar(&nptr); /* Get a name char */ + if (pchr != nchr) break; /* Branch mismatched? */ + if (pchr == 0) return 1; /* Branch matched? (matched at end of both strings) */ + } + get_achar(&nam); /* nam++ */ + } while (skip && nchr); /* Retry until end of name if infinite search is specified */ + + return 0; +} + +#endif /* FF_USE_FIND && FF_FS_MINIMIZE <= 1 */ + + + +/*-----------------------------------------------------------------------*/ +/* Pick a top segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static FRESULT create_name ( /* FR_OK: successful, FR_INVALID_NAME: could not create */ + DIR* dp, /* Pointer to the directory object */ + const TCHAR** path /* Pointer to pointer to the segment in the path string */ +) +{ +#if FF_USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR wc, *lfn; + DWORD uc; + UINT i, ni, si, di; + const TCHAR *p; + + + /* Create LFN into LFN working buffer */ + p = *path; lfn = dp->obj.fs->lfnbuf; di = 0; + for (;;) { + uc = tchar2uni(&p); /* Get a character */ + if (uc == 0xFFFFFFFF) return FR_INVALID_NAME; /* Invalid code or UTF decode error */ + if (uc >= 0x10000) lfn[di++] = (WCHAR)(uc >> 16); /* Store high surrogate if needed */ + wc = (WCHAR)uc; + if (wc < ' ' || IsSeparator(wc)) break; /* Break if end of the path or a separator is found */ + if (wc < 0x80 && strchr("*:<>|\"\?\x7F", (int)wc)) return FR_INVALID_NAME; /* Reject illegal characters for LFN */ + if (di >= FF_MAX_LFN) return FR_INVALID_NAME; /* Reject too long name */ + lfn[di++] = wc; /* Store the Unicode character */ + } + if (wc < ' ') { /* Stopped at end of the path? */ + cf = NS_LAST; /* Last segment */ + } else { /* Stopped at a separator */ + while (IsSeparator(*p)) p++; /* Skip duplicated separators if exist */ + cf = 0; /* Next segment may follow */ + if (IsTerminator(*p)) cf = NS_LAST; /* Ignore terminating separator */ + } + *path = p; /* Return pointer to the next segment */ + +#if FF_FS_RPATH != 0 + if ((di == 1 && lfn[di - 1] == '.') || + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { /* Is this segment a dot name? */ + lfn[di] = 0; + for (i = 0; i < 11; i++) { /* Create dot name for SFN entry */ + dp->fn[i] = (i < di) ? '.' : ' '; + } + dp->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Snip off trailing spaces and dots if exist */ + wc = lfn[di - 1]; + if (wc != ' ' && wc != '.') break; + di--; + } + lfn[di] = 0; /* LFN is created into the working buffer */ + if (di == 0) return FR_INVALID_NAME; /* Reject null name */ + + /* Create SFN in directory form */ + for (si = 0; lfn[si] == ' '; si++) ; /* Remove leading spaces */ + if (si > 0 || lfn[si] == '.') cf |= NS_LOSS | NS_LFN; /* Is there any leading space or dot? */ + while (di > 0 && lfn[di - 1] != '.') di--; /* Find last dot (di<=si: no extension) */ + + memset(dp->fn, ' ', 11); + i = b = 0; ni = 8; + for (;;) { + wc = lfn[si++]; /* Get an LFN character */ + if (wc == 0) break; /* Break on end of the LFN */ + if (wc == ' ' || (wc == '.' && si != di)) { /* Remove embedded spaces and dots */ + cf |= NS_LOSS | NS_LFN; + continue; + } + + if (i >= ni || si == di) { /* End of field? */ + if (ni == 11) { /* Name extension overflow? */ + cf |= NS_LOSS | NS_LFN; + break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Name body overflow? */ + if (si > di) break; /* No name extension? */ + si = di; i = 8; ni = 11; b <<= 2; /* Enter name extension */ + continue; + } + + if (wc >= 0x80) { /* Is this an extended character? */ + cf |= NS_LFN; /* LFN entry needs to be created */ +#if FF_CODE_PAGE == 0 + if (ExCvt) { /* In SBCS cfg */ + wc = ff_uni2oem(wc, CODEPAGE); /* Unicode ==> ANSI/OEM code */ + if (wc & 0x80) wc = ExCvt[wc & 0x7F]; /* Convert extended character to upper (SBCS) */ + } else { /* In DBCS cfg */ + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); /* Unicode ==> Up-convert ==> ANSI/OEM code */ + } +#elif FF_CODE_PAGE < 900 /* In SBCS cfg */ + wc = ff_uni2oem(wc, CODEPAGE); /* Unicode ==> ANSI/OEM code */ + if (wc & 0x80) wc = ExCvt[wc & 0x7F]; /* Convert extended character to upper (SBCS) */ +#else /* In DBCS cfg */ + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); /* Unicode ==> Up-convert ==> ANSI/OEM code */ +#endif + } + + if (wc >= 0x100) { /* Is this a DBC? */ + if (i >= ni - 1) { /* Field overflow? */ + cf |= NS_LOSS | NS_LFN; + i = ni; continue; /* Next field */ + } + dp->fn[i++] = (BYTE)(wc >> 8); /* Put 1st byte */ + } else { /* SBC */ + if (wc == 0 || strchr("+,;=[]", (int)wc)) { /* Replace illegal characters for SFN */ + wc = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + } else { + if (IsUpper(wc)) { /* ASCII upper case? */ + b |= 2; + } + if (IsLower(wc)) { /* ASCII lower case? */ + b |= 1; wc -= 0x20; + } + } + } + dp->fn[i++] = (BYTE)wc; + } + + if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + + if (ni == 8) b <<= 2; /* Shift capital flags if no extension */ + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN; /* LFN entry needs to be created if composite capitals */ + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended character, NT flags are created */ + if (b & 0x01) cf |= NS_EXT; /* NT flag (Extension has small capital letters only) */ + if (b & 0x04) cf |= NS_BODY; /* NT flag (Body has small capital letters only) */ + } + + dp->fn[NSFLAG] = cf; /* SFN is created into dp->fn[] */ + + return FR_OK; + + +#else /* FF_USE_LFN : Non-LFN configuration */ + BYTE c, d, *sfn; + UINT ni, si, i; + const char *p; + + /* Create file name in directory form */ + p = *path; sfn = dp->fn; + memset(sfn, ' ', 11); + si = i = 0; ni = 8; +#if FF_FS_RPATH != 0 + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (!IsSeparator(c) && c > ' ') return FR_INVALID_NAME; + *path = p + si; /* Return pointer to the next segment */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of the path */ + return FR_OK; + } +#endif + for (;;) { + c = (BYTE)p[si++]; /* Get a byte */ + if (c <= ' ') break; /* Break if end of the path name */ + if (IsSeparator(c)) { /* Break if a separator is found */ + while (IsSeparator(p[si])) si++; /* Skip duplicated separator if exist */ + break; + } + if (c == '.' || i >= ni) { /* End of body or field overflow? */ + if (ni == 11 || c != '.') return FR_INVALID_NAME; /* Field overflow or invalid dot? */ + i = 8; ni = 11; /* Enter file extension field */ + continue; + } +#if FF_CODE_PAGE == 0 + if (ExCvt && c >= 0x80) { /* Is SBC extended character? */ + c = ExCvt[c & 0x7F]; /* To upper SBC extended character */ + } +#elif FF_CODE_PAGE < 900 + if (c >= 0x80) { /* Is SBC extended character? */ + c = ExCvt[c & 0x7F]; /* To upper SBC extended character */ + } +#endif + if (dbc_1st(c)) { /* Check if it is a DBC 1st byte */ + d = (BYTE)p[si++]; /* Get 2nd byte */ + if (!dbc_2nd(d) || i >= ni - 1) return FR_INVALID_NAME; /* Reject invalid DBC */ + sfn[i++] = c; + sfn[i++] = d; + } else { /* SBC */ + if (strchr("*+,:;<=>[]|\"\?\x7F", (int)c)) return FR_INVALID_NAME; /* Reject illegal chrs for SFN */ + if (IsLower(c)) c -= 0x20; /* To upper */ + sfn[i++] = c; + } + } + *path = &p[si]; /* Return pointer to the next segment */ + if (i == 0) return FR_INVALID_NAME; /* Reject nul string */ + + if (sfn[0] == DDEM) sfn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + sfn[NSFLAG] = (c <= ' ' || p[si] <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of the path */ + + return FR_OK; +#endif /* FF_USE_LFN */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR* dp, /* Directory object to return last directory and found object */ + const TCHAR* path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE ns; + FATFS *fs = dp->obj.fs; + + +#if FF_FS_RPATH != 0 + if (!IsSeparator(*path) && (FF_STR_VOLUME_ID != 2 || !IsTerminator(*path))) { /* Without heading separator */ + dp->obj.sclust = fs->cdir; /* Start at the current directory */ + } else +#endif + { /* With heading separator */ + while (IsSeparator(*path)) path++; /* Strip separators */ + dp->obj.sclust = 0; /* Start from the root directory */ + } +#if FF_FS_EXFAT + dp->obj.n_frag = 0; /* Invalidate last fragment counter of the object */ +#if FF_FS_RPATH != 0 + if (fs->fs_type == FS_EXFAT && dp->obj.sclust) { /* exFAT: Retrieve the sub-directory's status */ + DIR dj; + + dp->obj.c_scl = fs->cdc_scl; + dp->obj.c_size = fs->cdc_size; + dp->obj.c_ofs = fs->cdc_ofs; + res = load_obj_xdir(&dj, &dp->obj); + if (res != FR_OK) return res; + dp->obj.objsize = ld_dword(fs->dirbuf + XDIR_FileSize); + dp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + } +#endif +#endif + + if ((UINT)*path < ' ') { /* Null path name is the origin directory itself */ + dp->fn[NSFLAG] = NS_NONAME; + res = dir_sdi(dp, 0); + + } else { /* Follow path */ + for (;;) { + res = create_name(dp, &path); /* Get a segment name of the path */ + if (res != FR_OK) break; + res = dir_find(dp); /* Find an object with the segment name */ + ns = dp->fn[NSFLAG]; + if (res != FR_OK) { /* Failed to find the object */ + if (res == FR_NO_FILE) { /* Object is not found */ + if (FF_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exist, stay there */ + if (!(ns & NS_LAST)) continue; /* Continue to follow if not last segment */ + dp->fn[NSFLAG] = NS_NONAME; + res = FR_OK; + } else { /* Could not find the object */ + if (!(ns & NS_LAST)) res = FR_NO_PATH; /* Adjust error code if not last segment */ + } + } + break; + } + if (ns & NS_LAST) break; /* Last segment matched. Function completed. */ + /* Get into the sub-directory */ + if (!(dp->obj.attr & AM_DIR)) { /* It is not a sub-directory and cannot follow */ + res = FR_NO_PATH; break; + } +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* Save containing directory information for next dir */ + dp->obj.c_scl = dp->obj.sclust; + dp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + init_alloc_info(fs, &dp->obj); /* Open next directory */ + } else +#endif + { + dp->obj.sclust = ld_clust(fs, fs->win + dp->dptr % SS(fs)); /* Open next directory */ + } + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get logical drive number from path name */ +/*-----------------------------------------------------------------------*/ + +static int get_ldnumber ( /* Returns logical drive number (-1:invalid drive number or null pointer) */ + const TCHAR** path /* Pointer to pointer to the path name */ +) +{ + const TCHAR *tp, *tt; + TCHAR tc; + int i; + int vol = -1; +#if FF_STR_VOLUME_ID /* Find string volume ID */ + const char *sp; + char c; +#endif + + tt = tp = *path; + if (!tp) return vol; /* Invalid path name? */ + do tc = *tt++; while (!IsTerminator(tc) && tc != ':'); /* Find a colon in the path */ + + if (tc == ':') { /* DOS/Windows style volume ID? */ + i = FF_VOLUMES; + if (IsDigit(*tp) && tp + 2 == tt) { /* Is there a numeric volume ID + colon? */ + i = (int)*tp - '0'; /* Get the LD number */ + } +#if FF_STR_VOLUME_ID == 1 /* Arbitrary string is enabled */ + else { + i = 0; + do { + sp = VolumeStr[i]; tp = *path; /* This string volume ID and path name */ + do { /* Compare the volume ID with path name */ + c = *sp++; tc = *tp++; + if (IsLower(c)) c -= 0x20; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || tp != tt) && ++i < FF_VOLUMES); /* Repeat for each id until pattern match */ + } +#endif + if (i < FF_VOLUMES) { /* If a volume ID is found, get the drive number and strip it */ + vol = i; /* Drive number */ + *path = tt; /* Snip the drive prefix off */ + } + return vol; + } +#if FF_STR_VOLUME_ID == 2 /* Unix style volume ID is enabled */ + if (*tp == '/') { /* Is there a volume ID? */ + while (*(tp + 1) == '/') tp++; /* Skip duplicated separator */ + i = 0; + do { + tt = tp; sp = VolumeStr[i]; /* Path name and this string volume ID */ + do { /* Compare the volume ID with path name */ + c = *sp++; tc = *(++tt); + if (IsLower(c)) c -= 0x20; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || (tc != '/' && !IsTerminator(tc))) && ++i < FF_VOLUMES); /* Repeat for each ID until pattern match */ + if (i < FF_VOLUMES) { /* If a volume ID is found, get the drive number and strip it */ + vol = i; /* Drive number */ + *path = tt; /* Snip the drive prefix off */ + } + return vol; + } +#endif + /* No drive prefix is found */ +#if FF_FS_RPATH != 0 + vol = CurrVol; /* Default drive is current drive */ +#else + vol = 0; /* Default drive is 0 */ +#endif + return vol; /* Return the default drive */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* GPT support functions */ +/*-----------------------------------------------------------------------*/ + +#if FF_LBA64 + +/* Calculate CRC32 in byte-by-byte */ + +static DWORD crc32 ( /* Returns next CRC value */ + DWORD crc, /* Current CRC value */ + BYTE d /* A byte to be processed */ +) +{ + BYTE b; + + + for (b = 1; b; b <<= 1) { + crc ^= (d & b) ? 1 : 0; + crc = (crc & 1) ? crc >> 1 ^ 0xEDB88320 : crc >> 1; + } + return crc; +} + + +/* Check validity of GPT header */ + +static int test_gpt_header ( /* 0:Invalid, 1:Valid */ + const BYTE* gpth /* Pointer to the GPT header */ +) +{ + UINT i; + DWORD bcc; + + + if (memcmp(gpth + GPTH_Sign, "EFI PART" "\0\0\1\0" "\x5C\0\0", 16)) return 0; /* Check sign, version (1.0) and length (92) */ + for (i = 0, bcc = 0xFFFFFFFF; i < 92; i++) { /* Check header BCC */ + bcc = crc32(bcc, i - GPTH_Bcc < 4 ? 0 : gpth[i]); + } + if (~bcc != ld_dword(gpth + GPTH_Bcc)) return 0; + if (ld_dword(gpth + GPTH_PteSize) != SZ_GPTE) return 0; /* Table entry size (must be SZ_GPTE bytes) */ + if (ld_dword(gpth + GPTH_PtNum) > 128) return 0; /* Table size (must be 128 entries or less) */ + + return 1; +} + +#if !FF_FS_READONLY && FF_USE_MKFS + +/* Generate random value */ +static DWORD make_rand ( + DWORD seed, /* Seed value */ + BYTE* buff, /* Output buffer */ + UINT n /* Data length */ +) +{ + UINT r; + + + if (seed == 0) seed = 1; + do { + for (r = 0; r < 8; r++) seed = seed & 1 ? seed >> 1 ^ 0xA3000000 : seed >> 1; /* Shift 8 bits the 32-bit LFSR */ + *buff++ = (BYTE)seed; + } while (--n); + return seed; +} + +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Load a sector and check if it is an FAT VBR */ +/*-----------------------------------------------------------------------*/ + +/* Check what the sector is */ + +static UINT check_fs ( /* 0:FAT/FAT32 VBR, 1:exFAT VBR, 2:Not FAT and valid BS, 3:Not FAT and invalid BS, 4:Disk error */ + FATFS* fs, /* Filesystem object */ + LBA_t sect /* Sector to load and check if it is an FAT-VBR or not */ +) +{ + WORD w, sign; + BYTE b; + + + fs->wflag = 0; fs->winsect = (LBA_t)0 - 1; /* Invaidate window */ + if (move_window(fs, sect) != FR_OK) return 4; /* Load the boot sector */ + sign = ld_word(fs->win + BS_55AA); +#if FF_FS_EXFAT + if (sign == 0xAA55 && !memcmp(fs->win + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11)) return 1; /* It is an exFAT VBR */ +#endif + b = fs->win[BS_JmpBoot]; + if (b == 0xEB || b == 0xE9 || b == 0xE8) { /* Valid JumpBoot code? (short jump, near jump or near call) */ + if (sign == 0xAA55 && !memcmp(fs->win + BS_FilSysType32, "FAT32 ", 8)) { + return 0; /* It is an FAT32 VBR */ + } + /* FAT volumes formatted with early MS-DOS lack BS_55AA and BS_FilSysType, so FAT VBR needs to be identified without them. */ + w = ld_word(fs->win + BPB_BytsPerSec); + b = fs->win[BPB_SecPerClus]; + if ((w & (w - 1)) == 0 && w >= FF_MIN_SS && w <= FF_MAX_SS /* Properness of sector size (512-4096 and 2^n) */ + && b != 0 && (b & (b - 1)) == 0 /* Properness of cluster size (2^n) */ + && ld_word(fs->win + BPB_RsvdSecCnt) != 0 /* Properness of reserved sectors (MNBZ) */ + && (UINT)fs->win[BPB_NumFATs] - 1 <= 1 /* Properness of FATs (1 or 2) */ + && ld_word(fs->win + BPB_RootEntCnt) != 0 /* Properness of root dir entries (MNBZ) */ + && (ld_word(fs->win + BPB_TotSec16) >= 128 || ld_dword(fs->win + BPB_TotSec32) >= 0x10000) /* Properness of volume sectors (>=128) */ + && ld_word(fs->win + BPB_FATSz16) != 0) { /* Properness of FAT size (MNBZ) */ + return 0; /* It can be presumed an FAT VBR */ + } + } + return sign == 0xAA55 ? 2 : 3; /* Not an FAT VBR (valid or invalid BS) */ +} + + +/* Find an FAT volume */ +/* (It supports only generic partitioning rules, MBR, GPT and SFD) */ + +static UINT find_volume ( /* Returns BS status found in the hosting drive */ + FATFS* fs, /* Filesystem object */ + UINT part /* Partition to fined = 0:auto, 1..:forced */ +) +{ + UINT fmt, i; + DWORD mbr_pt[4]; + + + fmt = check_fs(fs, 0); /* Load sector 0 and check if it is an FAT VBR as SFD format */ + if (fmt != 2 && (fmt >= 3 || part == 0)) return fmt; /* Returns if it is an FAT VBR as auto scan, not a BS or disk error */ + + /* Sector 0 is not an FAT VBR or forced partition number wants a partition */ + +#if FF_LBA64 + if (fs->win[MBR_Table + PTE_System] == 0xEE) { /* GPT protective MBR? */ + DWORD n_ent, v_ent, ofs; + QWORD pt_lba; + + if (move_window(fs, 1) != FR_OK) return 4; /* Load GPT header sector (next to MBR) */ + if (!test_gpt_header(fs->win)) return 3; /* Check if GPT header is valid */ + n_ent = ld_dword(fs->win + GPTH_PtNum); /* Number of entries */ + pt_lba = ld_qword(fs->win + GPTH_PtOfs); /* Table location */ + for (v_ent = i = 0; i < n_ent; i++) { /* Find FAT partition */ + if (move_window(fs, pt_lba + i * SZ_GPTE / SS(fs)) != FR_OK) return 4; /* PT sector */ + ofs = i * SZ_GPTE % SS(fs); /* Offset in the sector */ + if (!memcmp(fs->win + ofs + GPTE_PtGuid, GUID_MS_Basic, 16)) { /* MS basic data partition? */ + v_ent++; + fmt = check_fs(fs, ld_qword(fs->win + ofs + GPTE_FstLba)); /* Load VBR and check status */ + if (part == 0 && fmt <= 1) return fmt; /* Auto search (valid FAT volume found first) */ + if (part != 0 && v_ent == part) return fmt; /* Forced partition order (regardless of it is valid or not) */ + } + } + return 3; /* Not found */ + } +#endif + if (FF_MULTI_PARTITION && part > 4) return 3; /* MBR has 4 partitions max */ + for (i = 0; i < 4; i++) { /* Load partition offset in the MBR */ + mbr_pt[i] = ld_dword(fs->win + MBR_Table + i * SZ_PTE + PTE_StLba); + } + i = part ? part - 1 : 0; /* Table index to find first */ + do { /* Find an FAT volume */ + fmt = mbr_pt[i] ? check_fs(fs, mbr_pt[i]) : 3; /* Check if the partition is FAT */ + } while (part == 0 && fmt >= 2 && ++i < 4); + return fmt; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Determine logical drive number and mount the volume if needed */ +/*-----------------------------------------------------------------------*/ + +static FRESULT mount_volume ( /* FR_OK(0): successful, !=0: an error occurred */ + const TCHAR** path, /* Pointer to pointer to the path name (drive number) */ + FATFS** rfs, /* Pointer to pointer to the found filesystem object */ + BYTE mode /* !=0: Check write protection for write access */ +) +{ + int vol; + DSTATUS stat; + LBA_t bsect; + DWORD tsect, sysect, fasize, nclst, szbfat; + WORD nrsv; + FATFS *fs; + UINT fmt; + + + /* Get logical drive number */ + *rfs = 0; + vol = get_ldnumber(path); + if (vol < 0) return FR_INVALID_DRIVE; + + /* Check if the filesystem object is valid or not */ + fs = FatFs[vol]; /* Get pointer to the filesystem object */ + if (!fs) return FR_NOT_ENABLED; /* Is the filesystem object available? */ +#if FF_FS_REENTRANT + if (!lock_fs(fs)) return FR_TIMEOUT; /* Lock the volume */ +#endif + *rfs = fs; /* Return pointer to the filesystem object */ + + mode &= (BYTE)~FA_READ; /* Desired access mode, write access or not */ + if (fs->fs_type != 0) { /* If the volume has been mounted */ + stat = disk_status(fs->pdrv); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */ + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */ + return FR_WRITE_PROTECTED; + } + return FR_OK; /* The filesystem object is already valid */ + } + } + + /* The filesystem object is not valid. */ + /* Following code attempts to mount the volume. (find an FAT volume, analyze the BPB and initialize the filesystem object) */ + + fs->fs_type = 0; /* Clear the filesystem object */ + fs->pdrv = LD2PD(vol); /* Volume hosting physical drive */ + stat = disk_initialize(fs->pdrv); /* Initialize the physical drive */ + if (stat & STA_NOINIT) { /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ + } + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; + } +#if FF_MAX_SS != FF_MIN_SS /* Get sector size (multiple sector size cfg only) */ + if (disk_ioctl(fs->pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) return FR_DISK_ERR; + if (SS(fs) > FF_MAX_SS || SS(fs) < FF_MIN_SS || (SS(fs) & (SS(fs) - 1))) return FR_DISK_ERR; +#endif + + /* Find an FAT volume on the drive */ + fmt = find_volume(fs, LD2PT(vol)); + if (fmt == 4) return FR_DISK_ERR; /* An error occured in the disk I/O layer */ + if (fmt >= 2) return FR_NO_FILESYSTEM; /* No FAT volume is found */ + bsect = fs->winsect; /* Volume offset */ + + /* An FAT volume is found (bsect). Following code initializes the filesystem object */ + +#if FF_FS_EXFAT + if (fmt == 1) { + QWORD maxlba; + DWORD so, cv, bcl, i; + + for (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && fs->win[i] == 0; i++) ; /* Check zero filler */ + if (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM; + + if (ld_word(fs->win + BPB_FSVerEx) != 0x100) return FR_NO_FILESYSTEM; /* Check exFAT version (must be version 1.0) */ + + if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) { /* (BPB_BytsPerSecEx must be equal to the physical sector size) */ + return FR_NO_FILESYSTEM; + } + + maxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect; /* Last LBA of the volume + 1 */ + if (!FF_LBA64 && maxlba >= 0x100000000) return FR_NO_FILESYSTEM; /* (It cannot be accessed in 32-bit LBA) */ + + fs->fsize = ld_dword(fs->win + BPB_FatSzEx); /* Number of sectors per FAT */ + + fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */ + if (fs->n_fats != 1) return FR_NO_FILESYSTEM; /* (Supports only 1 FAT) */ + + fs->csize = 1 << fs->win[BPB_SecPerClusEx]; /* Cluster size */ + if (fs->csize == 0) return FR_NO_FILESYSTEM; /* (Must be 1..32768 sectors) */ + + nclst = ld_dword(fs->win + BPB_NumClusEx); /* Number of clusters */ + if (nclst > MAX_EXFAT) return FR_NO_FILESYSTEM; /* (Too many clusters) */ + fs->n_fatent = nclst + 2; + + /* Boundaries and Limits */ + fs->volbase = bsect; + fs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx); + fs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx); + if (maxlba < (QWORD)fs->database + nclst * fs->csize) return FR_NO_FILESYSTEM; /* (Volume size must not be smaller than the size requiered) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClusEx); + + /* Get bitmap location and check if it is contiguous (implementation assumption) */ + so = i = 0; + for (;;) { /* Find the bitmap entry in the root directory (in only first cluster) */ + if (i == 0) { + if (so >= fs->csize) return FR_NO_FILESYSTEM; /* Not found? */ + if (move_window(fs, clst2sect(fs, (DWORD)fs->dirbase) + so) != FR_OK) return FR_DISK_ERR; + so++; + } + if (fs->win[i] == ET_BITMAP) break; /* Is it a bitmap entry? */ + i = (i + SZDIRE) % SS(fs); /* Next entry */ + } + bcl = ld_dword(fs->win + i + 20); /* Bitmap cluster */ + if (bcl < 2 || bcl >= fs->n_fatent) return FR_NO_FILESYSTEM; /* (Wrong cluster#) */ + fs->bitbase = fs->database + fs->csize * (bcl - 2); /* Bitmap sector */ + for (;;) { /* Check if bitmap is contiguous */ + if (move_window(fs, fs->fatbase + bcl / (SS(fs) / 4)) != FR_OK) return FR_DISK_ERR; + cv = ld_dword(fs->win + bcl % (SS(fs) / 4) * 4); + if (cv == 0xFFFFFFFF) break; /* Last link? */ + if (cv != ++bcl) return FR_NO_FILESYSTEM; /* Fragmented? */ + } + +#if !FF_FS_READONLY + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ +#endif + fmt = FS_EXFAT; /* FAT sub-type */ + } else +#endif /* FF_FS_EXFAT */ + { + if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */ + + fasize = ld_word(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ + if (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32); + fs->fsize = fasize; + + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */ + if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ + fasize *= fs->n_fats; /* Number of sectors for FAT area */ + + fs->csize = fs->win[BPB_SecPerClus]; /* Cluster size */ + if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ + + fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM; /* (Must be sector aligned) */ + + tsect = ld_word(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ + if (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32); + + nrsv = ld_word(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ + if (nrsv == 0) return FR_NO_FILESYSTEM; /* (Must not be 0) */ + + /* Determine the FAT sub type */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); /* RSV + FAT + DIR */ + if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ + if (nclst == 0) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + fmt = 0; + if (nclst <= MAX_FAT32) fmt = FS_FAT32; + if (nclst <= MAX_FAT16) fmt = FS_FAT16; + if (nclst <= MAX_FAT12) fmt = FS_FAT12; + if (fmt == 0) return FR_NO_FILESYSTEM; + + /* Boundaries and Limits */ + fs->n_fatent = nclst + 2; /* Number of FAT entries */ + fs->volbase = bsect; /* Volume start sector */ + fs->fatbase = bsect + nrsv; /* FAT start sector */ + fs->database = bsect + sysect; /* Data start sector */ + if (fmt == FS_FAT32) { + if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ + if (fs->n_rootdir != 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */ + szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ + } else { + if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ + fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ + szbfat = (fmt == FS_FAT16) ? /* (Needed FAT size) */ + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ + +#if !FF_FS_READONLY + /* Get FSInfo if available */ + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ + fs->fsi_flag = 0x80; +#if (FF_FS_NOFSINFO & 3) != 3 + if (fmt == FS_FAT32 /* Allow to update FSInfo only if BPB_FSInfo32 == 1 */ + && ld_word(fs->win + BPB_FSInfo32) == 1 + && move_window(fs, bsect + 1) == FR_OK) + { + fs->fsi_flag = 0; + if (ld_word(fs->win + BS_55AA) == 0xAA55 /* Load FSInfo data if available */ + && ld_dword(fs->win + FSI_LeadSig) == 0x41615252 + && ld_dword(fs->win + FSI_StrucSig) == 0x61417272) + { +#if (FF_FS_NOFSINFO & 1) == 0 + fs->free_clst = ld_dword(fs->win + FSI_Free_Count); +#endif +#if (FF_FS_NOFSINFO & 2) == 0 + fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free); +#endif + } + } +#endif /* (FF_FS_NOFSINFO & 3) != 3 */ +#endif /* !FF_FS_READONLY */ + } + + fs->fs_type = (BYTE)fmt;/* FAT sub-type */ + fs->id = ++Fsid; /* Volume mount ID */ +#if FF_USE_LFN == 1 + fs->lfnbuf = LfnBuf; /* Static LFN working buffer */ +#if FF_FS_EXFAT + fs->dirbuf = DirBuf; /* Static directory block scratchpad buuffer */ +#endif +#endif +#if FF_FS_RPATH != 0 + fs->cdir = 0; /* Initialize current directory */ +#endif +#if FF_FS_LOCK != 0 /* Clear file lock semaphores */ + clear_lock(fs); +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/directory object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static FRESULT validate ( /* Returns FR_OK or FR_INVALID_OBJECT */ + FFOBJID* obj, /* Pointer to the FFOBJID, the 1st member in the FIL/DIR object, to check validity */ + FATFS** rfs /* Pointer to pointer to the owner filesystem object to return */ +) +{ + FRESULT res = FR_INVALID_OBJECT; + + + if (obj && obj->fs && obj->fs->fs_type && obj->id == obj->fs->id) { /* Test if the object is valid */ +#if FF_FS_REENTRANT + if (lock_fs(obj->fs)) { /* Obtain the filesystem object */ + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */ + res = FR_OK; + } else { + unlock_fs(obj->fs, FR_OK); + } + } else { + res = FR_TIMEOUT; + } +#else + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */ + res = FR_OK; + } +#endif + } + *rfs = (res == FR_OK) ? obj->fs : 0; /* Corresponding filesystem object */ + return res; +} + + + + +/*--------------------------------------------------------------------------- + + Public Functions (FatFs API) + +----------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + FATFS* fs, /* Pointer to the filesystem object to be registered (NULL:unmount)*/ + const TCHAR* path, /* Logical drive number to be mounted/unmounted */ + BYTE opt /* Mount option: 0=Do not mount (delayed mount), 1=Mount immediately */ +) +{ + FATFS *cfs; + int vol; + FRESULT res; + const TCHAR *rp = path; + + + /* Get logical drive number */ + vol = get_ldnumber(&rp); + if (vol < 0) return FR_INVALID_DRIVE; + cfs = FatFs[vol]; /* Pointer to fs object */ + + if (cfs) { +#if FF_FS_LOCK != 0 + clear_lock(cfs); +#endif +#if FF_FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR; +#endif + cfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if FF_FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + if (opt == 0) return FR_OK; /* Do not mount now, it will be mounted later */ + + res = mount_volume(&path, &fs, 0); /* Force mounted the volume */ + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL* fp, /* Pointer to the blank file object */ + const TCHAR* path, /* Pointer to the file name */ + BYTE mode /* Access mode and open mode flags */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; +#if !FF_FS_READONLY + DWORD cl, bcs, clst, tm; + LBA_t sc; + FSIZE_t ofs; +#endif + DEF_NAMBUF + + + if (!fp) return FR_INVALID_OBJECT; + + /* Get logical drive number */ + mode &= FF_FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_CREATE_NEW | FA_OPEN_ALWAYS | FA_OPEN_APPEND; + res = mount_volume(&path, &fs, mode); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ +#if !FF_FS_READONLY /* Read/Write configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } +#if FF_FS_LOCK != 0 + else { + res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0); /* Check if the file can be used */ + } +#endif + } + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) { /* There is no file to open, create a new entry */ +#if FF_FS_LOCK != 0 + res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; +#else + res = dir_register(&dj); +#endif + } + mode |= FA_CREATE_ALWAYS; /* File is created */ + } + else { /* Any object with the same name is already existing */ + if (dj.obj.attr & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ + res = FR_DENIED; + } else { + if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ + } + } + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate the file if overwrite mode */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + /* Get current allocation info */ + fp->obj.fs = fs; + init_alloc_info(fs, &fp->obj); + /* Set directory entry block initial state */ + memset(fs->dirbuf + 2, 0, 30); /* Clear 85 entry except for NumSec */ + memset(fs->dirbuf + 38, 0, 26); /* Clear C0 entry except for NumName and NameHash */ + fs->dirbuf[XDIR_Attr] = AM_ARC; + st_dword(fs->dirbuf + XDIR_CrtTime, GET_FATTIME()); + fs->dirbuf[XDIR_GenFlags] = 1; + res = store_xdir(&dj); + if (res == FR_OK && fp->obj.sclust != 0) { /* Remove the cluster chain if exist */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fs->last_clst = fp->obj.sclust - 1; /* Reuse the cluster hole */ + } + } else +#endif + { + /* Set directory entry initial state */ + tm = GET_FATTIME(); /* Set created time */ + st_dword(dj.dir + DIR_CrtTime, tm); + st_dword(dj.dir + DIR_ModTime, tm); + cl = ld_clust(fs, dj.dir); /* Get current cluster chain */ + dj.dir[DIR_Attr] = AM_ARC; /* Reset attribute */ + st_clust(fs, dj.dir, 0); /* Reset file allocation info */ + st_dword(dj.dir + DIR_FileSize, 0); + fs->wflag = 1; + if (cl != 0) { /* Remove the cluster chain if exist */ + sc = fs->winsect; + res = remove_chain(&dj.obj, cl, 0); + if (res == FR_OK) { + res = move_window(fs, sc); + fs->last_clst = cl - 1; /* Reuse the cluster hole */ + } + } + } + } + } + else { /* Open an existing file */ + if (res == FR_OK) { /* Is the object exsiting? */ + if (dj.obj.attr & AM_DIR) { /* File open against a directory */ + res = FR_NO_FILE; + } else { + if ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* Write mode open against R/O file */ + res = FR_DENIED; + } + } + } + } + if (res == FR_OK) { + if (mode & FA_CREATE_ALWAYS) mode |= FA_MODIFIED; /* Set file change flag if created or overwritten */ + fp->dir_sect = fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#if FF_FS_LOCK != 0 + fp->obj.lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0); /* Lock the file for this session */ + if (fp->obj.lockid == 0) res = FR_INT_ERR; +#endif + } +#else /* R/O configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Is it origin directory itself? */ + res = FR_INVALID_NAME; + } else { + if (dj.obj.attr & AM_DIR) { /* Is it a directory? */ + res = FR_NO_FILE; + } + } + } +#endif + + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fp->obj.c_scl = dj.obj.sclust; /* Get containing directory info */ + fp->obj.c_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fp->obj.c_ofs = dj.blk_ofs; + init_alloc_info(fs, &fp->obj); + } else +#endif + { + fp->obj.sclust = ld_clust(fs, dj.dir); /* Get object allocation info */ + fp->obj.objsize = ld_dword(dj.dir + DIR_FileSize); + } +#if FF_USE_FASTSEEK + fp->cltbl = 0; /* Disable fast seek mode */ +#endif + fp->obj.fs = fs; /* Validate the file object */ + fp->obj.id = fs->id; + fp->flag = mode; /* Set file access mode */ + fp->err = 0; /* Clear error flag */ + fp->sect = 0; /* Invalidate current data sector */ + fp->fptr = 0; /* Set file pointer top of the file */ +#if !FF_FS_READONLY +#if !FF_FS_TINY + memset(fp->buf, 0, sizeof fp->buf); /* Clear sector buffer */ +#endif + if ((mode & FA_SEEKEND) && fp->obj.objsize > 0) { /* Seek to end of file if FA_OPEN_APPEND is specified */ + fp->fptr = fp->obj.objsize; /* Offset to seek */ + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size in byte */ + clst = fp->obj.sclust; /* Follow the cluster chain */ + for (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; ofs -= bcs) { + clst = get_fat(&fp->obj, clst); + if (clst <= 1) res = FR_INT_ERR; + if (clst == 0xFFFFFFFF) res = FR_DISK_ERR; + } + fp->clust = clst; + if (res == FR_OK && ofs % SS(fs)) { /* Fill sector buffer if not on the sector boundary */ + sc = clst2sect(fs, clst); + if (sc == 0) { + res = FR_INT_ERR; + } else { + fp->sect = sc + (DWORD)(ofs / SS(fs)); +#if !FF_FS_TINY + if (disk_read(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) res = FR_DISK_ERR; +#endif + } + } +#if FF_FS_LOCK != 0 + if (res != FR_OK) dec_lock(fp->obj.lockid); /* Decrement file open counter if seek failed */ +#endif + } +#endif + } + + FREE_NAMBUF(); + } + + if (res != FR_OK) fp->obj.fs = 0; /* Invalidate file object on error */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL* fp, /* Open file to be read */ + void* buff, /* Data buffer to store the read data */ + UINT btr, /* Number of bytes to read */ + UINT* br /* Number of bytes read */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst; + LBA_t sect; + FSIZE_t remain; + UINT rcnt, cc, csect; + BYTE *rbuff = (BYTE*)buff; + + + *br = 0; /* Clear read byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + remain = fp->obj.objsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr > 0; btr -= rcnt, *br += rcnt, rbuff += rcnt, fp->fptr += rcnt) { /* Repeat until btr bytes read */ + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow cluster chain from the origin */ + } else { /* Middle or end of the file */ +#if FF_USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = get_fat(&fp->obj, fp->clust); /* Follow cluster chain on the FAT */ + } + } + if (clst < 2) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + sect = clst2sect(fs, fp->clust); /* Get current sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btr / SS(fs); /* When remaining bytes >= sector size, */ + if (cc > 0) { /* Read maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_read(fs->pdrv, rbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */ +#if FF_FS_TINY + if (fs->wflag && fs->winsect - sect < cc) { + memcpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs)); + } +#else + if ((fp->flag & FA_DIRTY) && fp->sect - sect < cc) { + memcpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, SS(fs)); + } +#endif +#endif + rcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !FF_FS_TINY + if (fp->sect != sect) { /* Load data sector if not in cache */ +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ + } +#endif + fp->sect = sect; + } + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes remains in the sector */ + if (rcnt > btr) rcnt = btr; /* Clip it by btr if needed */ +#if FF_FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + memcpy(rbuff, fs->win + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#else + memcpy(rbuff, fp->buf + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#endif + } + + LEAVE_FF(fs, FR_OK); +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL* fp, /* Open file to be written */ + const void* buff, /* Data to be written */ + UINT btw, /* Number of bytes to write */ + UINT* bw /* Number of bytes written */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst; + LBA_t sect; + UINT wcnt, cc, csect; + const BYTE *wbuff = (const BYTE*)buff; + + + *bw = 0; /* Clear write byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + /* Check fptr wrap-around (file size cannot reach 4 GiB at FAT volume) */ + if ((!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) && (DWORD)(fp->fptr + btw) < (DWORD)fp->fptr) { + btw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr); + } + + for ( ; btw > 0; btw -= wcnt, *bw += wcnt, wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize) { /* Repeat until all data written */ + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow from the origin */ + if (clst == 0) { /* If no cluster is allocated, */ + clst = create_chain(&fp->obj, 0); /* create a new cluster chain */ + } + } else { /* On the middle or end of the file */ +#if FF_USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */ + } + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + if (fp->obj.sclust == 0) fp->obj.sclust = clst; /* Set start cluster if the first write */ + } +#if FF_FS_TINY + if (fs->winsect == fp->sect && sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Write-back sector cache */ +#else + if (fp->flag & FA_DIRTY) { /* Write-back sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + sect = clst2sect(fs, fp->clust); /* Get current sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btw / SS(fs); /* When remaining bytes >= sector size, */ + if (cc > 0) { /* Write maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if FF_FS_MINIMIZE <= 2 +#if FF_FS_TINY + if (fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + memcpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs)); + fs->wflag = 0; + } +#else + if (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + memcpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs)); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif +#endif + wcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if FF_FS_TINY + if (fp->fptr >= fp->obj.objsize) { /* Avoid silly cache filling on the growing edge */ + if (sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); + fs->winsect = sect; + } +#else + if (fp->sect != sect && /* Fill sector cache with file data */ + fp->fptr < fp->obj.objsize && + disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +#endif + fp->sect = sect; + } + wcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes remains in the sector */ + if (wcnt > btw) wcnt = btw; /* Clip it by btw if needed */ +#if FF_FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + memcpy(fs->win + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fs->wflag = 1; +#else + memcpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fp->flag |= FA_DIRTY; +#endif + } + + fp->flag |= FA_MODIFIED; /* Set file change flag */ + + LEAVE_FF(fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL* fp /* Open file to be synced */ +) +{ + FRESULT res; + FATFS *fs; + DWORD tm; + BYTE *dir; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { + if (fp->flag & FA_MODIFIED) { /* Is there any change to the file? */ +#if !FF_FS_TINY + if (fp->flag & FA_DIRTY) { /* Write-back cached data if needed */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) LEAVE_FF(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + /* Update the directory entry */ + tm = GET_FATTIME(); /* Modified time */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = fill_first_frag(&fp->obj); /* Fill first fragment on the FAT if needed */ + if (res == FR_OK) { + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); /* Fill last fragment on the FAT if needed */ + } + if (res == FR_OK) { + DIR dj; + DEF_NAMBUF + + INIT_NAMBUF(fs); + res = load_obj_xdir(&dj, &fp->obj); /* Load directory entry block */ + if (res == FR_OK) { + fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive attribute to indicate that the file has been changed */ + fs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1; /* Update file allocation information */ + st_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust); /* Update start cluster */ + st_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize); /* Update file size */ + st_qword(fs->dirbuf + XDIR_ValidFileSize, fp->obj.objsize); /* (FatFs does not support Valid File Size feature) */ + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Update modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + st_dword(fs->dirbuf + XDIR_AccTime, 0); + res = store_xdir(&dj); /* Restore it to the directory */ + if (res == FR_OK) { + res = sync_fs(fs); + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + FREE_NAMBUF(); + } + } else +#endif + { + res = move_window(fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive attribute to indicate that the file has been changed */ + st_clust(fp->obj.fs, dir, fp->obj.sclust); /* Update file allocation information */ + st_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize); /* Update file size */ + st_dword(dir + DIR_ModTime, tm); /* Update modified time */ + st_word(dir + DIR_LstAccDate, 0); + fs->wflag = 1; + res = sync_fs(fs); /* Restore it to the directory */ + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL* fp /* Open file to be closed */ +) +{ + FRESULT res; + FATFS *fs; + +#if !FF_FS_READONLY + res = f_sync(fp); /* Flush cached data */ + if (res == FR_OK) +#endif + { + res = validate(&fp->obj, &fs); /* Lock volume */ + if (res == FR_OK) { +#if FF_FS_LOCK != 0 + res = dec_lock(fp->obj.lockid); /* Decrement file open counter */ + if (res == FR_OK) fp->obj.fs = 0; /* Invalidate file object */ +#else + fp->obj.fs = 0; /* Invalidate file object */ +#endif +#if FF_FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + } + return res; +} + + + + +#if FF_FS_RPATH >= 1 +/*-----------------------------------------------------------------------*/ +/* Change Current Directory or Current Drive, Get Current Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chdrive ( + const TCHAR* path /* Drive number to set */ +) +{ + int vol; + + + /* Get logical drive number */ + vol = get_ldnumber(&path); + if (vol < 0) return FR_INVALID_DRIVE; + CurrVol = (BYTE)vol; /* Set it as current volume */ + + return FR_OK; +} + + + +FRESULT f_chdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ +#if FF_STR_VOLUME_ID == 2 + UINT i; +#endif + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + /* Get logical drive */ + res = mount_volume(&path, &fs, 0); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* Is it the start directory itself? */ + fs->cdir = dj.obj.sclust; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdc_scl = dj.obj.c_scl; + fs->cdc_size = dj.obj.c_size; + fs->cdc_ofs = dj.obj.c_ofs; + } +#endif + } else { + if (dj.obj.attr & AM_DIR) { /* It is a sub-directory */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus); /* Sub-directory cluster */ + fs->cdc_scl = dj.obj.sclust; /* Save containing directory information */ + fs->cdc_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fs->cdc_ofs = dj.blk_ofs; + } else +#endif + { + fs->cdir = ld_clust(fs, dj.dir); /* Sub-directory cluster */ + } + } else { + res = FR_NO_PATH; /* Reached but a file */ + } + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; +#if FF_STR_VOLUME_ID == 2 /* Also current drive is changed if in Unix style volume ID */ + if (res == FR_OK) { + for (i = FF_VOLUMES - 1; i && fs != FatFs[i]; i--) ; /* Set current drive */ + CurrVol = (BYTE)i; + } +#endif + } + + LEAVE_FF(fs, res); +} + + +#if FF_FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR* buff, /* Pointer to the directory path */ + UINT len /* Size of buff in unit of TCHAR */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT i, n; + DWORD ccl; + TCHAR *tp = buff; +#if FF_VOLUMES >= 2 + UINT vl; +#if FF_STR_VOLUME_ID + const char *vp; +#endif +#endif + FILINFO fno; + DEF_NAMBUF + + + /* Get logical drive */ + buff[0] = 0; /* Set null string to get current volume */ + res = mount_volume((const TCHAR**)&buff, &fs, 0); /* Get current volume */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + + /* Follow parent directories and create the path */ + i = len; /* Bottom of buffer (directory stack base) */ + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* (Cannot do getcwd on exFAT and returns root path) */ + dj.obj.sclust = fs->cdir; /* Start to follow upper directory from current directory */ + while ((ccl = dj.obj.sclust) != 0) { /* Repeat while current directory is a sub-directory */ + res = dir_sdi(&dj, 1 * SZDIRE); /* Get parent directory */ + if (res != FR_OK) break; + res = move_window(fs, dj.sect); + if (res != FR_OK) break; + dj.obj.sclust = ld_clust(fs, dj.dir); /* Goto parent directory */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child directory */ + res = DIR_READ_FILE(&dj); + if (res != FR_OK) break; + if (ccl == ld_clust(fs, dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; + get_fileinfo(&dj, &fno); /* Get the directory name and push it to the buffer */ + for (n = 0; fno.fname[n]; n++) ; /* Name length */ + if (i < n + 1) { /* Insufficient space to store the path name? */ + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) buff[--i] = fno.fname[--n]; /* Stack the name */ + buff[--i] = '/'; + } + } + if (res == FR_OK) { + if (i == len) buff[--i] = '/'; /* Is it the root-directory? */ +#if FF_VOLUMES >= 2 /* Put drive prefix */ + vl = 0; +#if FF_STR_VOLUME_ID >= 1 /* String volume ID */ + for (n = 0, vp = (const char*)VolumeStr[CurrVol]; vp[n]; n++) ; + if (i >= n + 2) { + if (FF_STR_VOLUME_ID == 2) *tp++ = (TCHAR)'/'; + for (vl = 0; vl < n; *tp++ = (TCHAR)vp[vl], vl++) ; + if (FF_STR_VOLUME_ID == 1) *tp++ = (TCHAR)':'; + vl++; + } +#else /* Numeric volume ID */ + if (i >= 3) { + *tp++ = (TCHAR)'0' + CurrVol; + *tp++ = (TCHAR)':'; + vl = 2; + } +#endif + if (vl == 0) res = FR_NOT_ENOUGH_CORE; +#endif + /* Add current directory path */ + if (res == FR_OK) { + do *tp++ = buff[i++]; while (i < len); /* Copy stacked path string */ + } + } + FREE_NAMBUF(); + } + + *tp = 0; + LEAVE_FF(fs, res); +} + +#endif /* FF_FS_RPATH >= 2 */ +#endif /* FF_FS_RPATH >= 1 */ + + + +#if FF_FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File Read/Write Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File pointer from top of file */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, bcs; + LBA_t nsect; + FSIZE_t ifptr; +#if FF_USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, tlen, ulen; + DWORD *tbl; + LBA_t dsc; +#endif + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) res = (FRESULT)fp->err; +#if FF_FS_EXFAT && !FF_FS_READONLY + if (res == FR_OK && fs->fs_type == FS_EXFAT) { + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); /* Fill last fragment on the FAT if needed */ + } +#endif + if (res != FR_OK) LEAVE_FF(fs, res); + +#if FF_USE_FASTSEEK + if (fp->cltbl) { /* Fast seek */ + if (ofs == CREATE_LINKMAP) { /* Create CLMT */ + tbl = fp->cltbl; + tlen = *tbl++; ulen = 2; /* Given table size and required table size */ + cl = fp->obj.sclust; /* Origin of the chain */ + if (cl != 0) { + do { + /* Get a fragment */ + tcl = cl; ncl = 0; ulen += 2; /* Top, length and used items */ + do { + pcl = cl; ncl++; + cl = get_fat(&fp->obj, cl); + if (cl <= 1) ABORT(fs, FR_INT_ERR); + if (cl == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + } while (cl == pcl + 1); + if (ulen <= tlen) { /* Store the length and top of the fragment */ + *tbl++ = ncl; *tbl++ = tcl; + } + } while (cl < fs->n_fatent); /* Repeat until end of chain */ + } + *fp->cltbl = ulen; /* Number of items used */ + if (ulen <= tlen) { + *tbl = 0; /* Terminate table */ + } else { + res = FR_NOT_ENOUGH_CORE; /* Given table size is smaller than required */ + } + } else { /* Fast seek */ + if (ofs > fp->obj.objsize) ofs = fp->obj.objsize; /* Clip offset at the file size */ + fp->fptr = ofs; /* Set file pointer */ + if (ofs > 0) { + fp->clust = clmt_clust(fp, ofs - 1); + dsc = clst2sect(fs, fp->clust); + if (dsc == 0) ABORT(fs, FR_INT_ERR); + dsc += (DWORD)((ofs - 1) / SS(fs)) & (fs->csize - 1); + if (fp->fptr % SS(fs) && dsc != fp->sect) { /* Refill sector cache if needed */ +#if !FF_FS_TINY +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, dsc, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Load current sector */ +#endif + fp->sect = dsc; + } + } + } + } else +#endif + + /* Normal Seek */ + { +#if FF_FS_EXFAT + if (fs->fs_type != FS_EXFAT && ofs >= 0x100000000) ofs = 0xFFFFFFFF; /* Clip at 4 GiB - 1 if at FATxx */ +#endif + if (ofs > fp->obj.objsize && (FF_FS_READONLY || !(fp->flag & FA_WRITE))) { /* In read-only mode, clip offset with the file size */ + ofs = fp->obj.objsize; + } + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs > 0) { + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(FSIZE_t)(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->clust; + } else { /* When seek to back cluster, */ + clst = fp->obj.sclust; /* start from the first cluster */ +#if !FF_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(&fp->obj, 0); + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->obj.sclust = clst; + } +#endif + fp->clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ + ofs -= bcs; fp->fptr += bcs; +#if !FF_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + if (FF_FS_EXFAT && fp->fptr > fp->obj.objsize) { /* No FAT chain object needs correct objsize to generate FAT value */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + clst = create_chain(&fp->obj, clst); /* Follow chain with forceed stretch */ + if (clst == 0) { /* Clip file size in case of disk full */ + ofs = 0; break; + } + } else +#endif + { + clst = get_fat(&fp->obj, clst); /* Follow cluster chain if not in write mode */ + } + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR); + fp->clust = clst; + } + fp->fptr += ofs; + if (ofs % SS(fs)) { + nsect = clst2sect(fs, clst); /* Current sector */ + if (nsect == 0) ABORT(fs, FR_INT_ERR); + nsect += (DWORD)(ofs / SS(fs)); + } + } + } + if (!FF_FS_READONLY && fp->fptr > fp->obj.objsize) { /* Set file change flag if the file size is extended */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + if (fp->fptr % SS(fs) && nsect != fp->sect) { /* Fill sector cache if needed */ +#if !FF_FS_TINY +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, nsect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ +#endif + fp->sect = nsect; + } + } + + LEAVE_FF(fs, res); +} + + + +#if FF_FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directory Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR* dp, /* Pointer to directory object to create */ + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF + + + if (!dp) return FR_INVALID_OBJECT; + + /* Get logical drive */ + res = mount_volume(&path, &fs, 0); + if (res == FR_OK) { + dp->obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(dp, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + if (!(dp->fn[NSFLAG] & NS_NONAME)) { /* It is not the origin directory itself */ + if (dp->obj.attr & AM_DIR) { /* This object is a sub-directory */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + dp->obj.c_scl = dp->obj.sclust; /* Get containing directory inforamation */ + dp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + init_alloc_info(fs, &dp->obj); /* Get object allocation info */ + } else +#endif + { + dp->obj.sclust = ld_clust(fs, dp->dir); /* Get object allocation info */ + } + } else { /* This object is a file */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dp->obj.id = fs->id; + res = dir_sdi(dp, 0); /* Rewind directory */ +#if FF_FS_LOCK != 0 + if (res == FR_OK) { + if (dp->obj.sclust != 0) { + dp->obj.lockid = inc_lock(dp, 0); /* Lock the sub directory */ + if (!dp->obj.lockid) res = FR_TOO_MANY_OPEN_FILES; + } else { + dp->obj.lockid = 0; /* Root directory need not to be locked */ + } + } +#endif + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + if (res != FR_OK) dp->obj.fs = 0; /* Invalidate the directory object if function faild */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Close Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_closedir ( + DIR *dp /* Pointer to the directory object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + + + res = validate(&dp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { +#if FF_FS_LOCK != 0 + if (dp->obj.lockid) res = dec_lock(dp->obj.lockid); /* Decrement sub-directory open counter */ + if (res == FR_OK) dp->obj.fs = 0; /* Invalidate directory object */ +#else + dp->obj.fs = 0; /* Invalidate directory object */ +#endif +#if FF_FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entries in Sequence */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF + + + res = validate(&dp->obj, &fs); /* Check validity of the directory object */ + if (res == FR_OK) { + if (!fno) { + res = dir_sdi(dp, 0); /* Rewind the directory object */ + } else { + INIT_NAMBUF(fs); + res = DIR_READ_FILE(dp); /* Read an item */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory */ + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dp, fno); /* Get the object information */ + res = dir_next(dp, 0); /* Increment index for next */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory now */ + } + FREE_NAMBUF(); + } + } + LEAVE_FF(fs, res); +} + + + +#if FF_USE_FIND +/*-----------------------------------------------------------------------*/ +/* Find Next File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findnext ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to the file information structure */ +) +{ + FRESULT res; + + + for (;;) { + res = f_readdir(dp, fno); /* Get a directory item */ + if (res != FR_OK || !fno || !fno->fname[0]) break; /* Terminate if any error or end of directory */ + if (pattern_match(dp->pat, fno->fname, 0, FIND_RECURS)) break; /* Test for the file name */ +#if FF_USE_LFN && FF_USE_FIND == 2 + if (pattern_match(dp->pat, fno->altname, 0, FIND_RECURS)) break; /* Test for alternative name if exist */ +#endif + } + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Find First File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findfirst ( + DIR* dp, /* Pointer to the blank directory object */ + FILINFO* fno, /* Pointer to the file information structure */ + const TCHAR* path, /* Pointer to the directory to open */ + const TCHAR* pattern /* Pointer to the matching pattern */ +) +{ + FRESULT res; + + + dp->pat = pattern; /* Save pointer to pattern string */ + res = f_opendir(dp, path); /* Open the target directory */ + if (res == FR_OK) { + res = f_findnext(dp, fno); /* Find the first item */ + } + return res; +} + +#endif /* FF_USE_FIND */ + + + +#if FF_FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const TCHAR* path, /* Pointer to the file path */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMBUF + + + /* Get logical drive */ + res = mount_volume(&path, &dj.obj.fs, 0); + if (res == FR_OK) { + INIT_NAMBUF(dj.obj.fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* It is origin directory */ + res = FR_INVALID_NAME; + } else { /* Found an object */ + if (fno) get_fileinfo(&dj, fno); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const TCHAR* path, /* Logical drive number */ + DWORD* nclst, /* Pointer to a variable to return number of free clusters */ + FATFS** fatfs /* Pointer to return pointer to corresponding filesystem object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD nfree, clst, stat; + LBA_t sect; + UINT i; + FFOBJID obj; + + + /* Get logical drive */ + res = mount_volume(&path, &fs, 0); + if (res == FR_OK) { + *fatfs = fs; /* Return ptr to the fs object */ + /* If free_clst is valid, return it without full FAT scan */ + if (fs->free_clst <= fs->n_fatent - 2) { + *nclst = fs->free_clst; + } else { + /* Scan FAT to obtain number of free clusters */ + nfree = 0; + if (fs->fs_type == FS_FAT12) { /* FAT12: Scan bit field FAT entries */ + clst = 2; obj.fs = fs; + do { + stat = get_fat(&obj, clst); + if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0) nfree++; + } while (++clst < fs->n_fatent); + } else { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* exFAT: Scan allocation bitmap */ + BYTE bm; + UINT b; + + clst = fs->n_fatent - 2; /* Number of clusters */ + sect = fs->bitbase; /* Bitmap sector */ + i = 0; /* Offset in the sector */ + do { /* Counts numbuer of bits with zero in the bitmap */ + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + } + for (b = 8, bm = fs->win[i]; b && clst; b--, clst--) { + if (!(bm & 1)) nfree++; + bm >>= 1; + } + i = (i + 1) % SS(fs); + } while (clst); + } else +#endif + { /* FAT16/32: Scan WORD/DWORD FAT entries */ + clst = fs->n_fatent; /* Number of entries */ + sect = fs->fatbase; /* Top of the FAT */ + i = 0; /* Offset in the sector */ + do { /* Counts numbuer of entries with zero in the FAT */ + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + } + if (fs->fs_type == FS_FAT16) { + if (ld_word(fs->win + i) == 0) nfree++; + i += 2; + } else { + if ((ld_dword(fs->win + i) & 0x0FFFFFFF) == 0) nfree++; + i += 4; + } + i %= SS(fs); + } while (--clst); + } + } + if (res == FR_OK) { /* Update parameters if succeeded */ + *nclst = nfree; /* Return the free clusters */ + fs->free_clst = nfree; /* Now free_clst is valid */ + fs->fsi_flag |= 1; /* FAT32: FSInfo is to be updated */ + } + } + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD ncl; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + if (fp->fptr < fp->obj.objsize) { /* Process when fptr is not on the eof */ + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fp->obj.sclust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(&fp->obj, fp->clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fs->n_fatent) { + res = remove_chain(&fp->obj, ncl, fp->clust); + } + } + fp->obj.objsize = fp->fptr; /* Set file size to current read/write point */ + fp->flag |= FA_MODIFIED; +#if !FF_FS_TINY + if (res == FR_OK && (fp->flag & FA_DIRTY)) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fp->flag &= (BYTE)~FA_DIRTY; + } + } +#endif + if (res != FR_OK) ABORT(fs, res); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const TCHAR* path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + DWORD dclst = 0; + FATFS *fs; +#if FF_FS_EXFAT + FFOBJID obj; +#endif + DEF_NAMBUF + + + /* Get logical drive */ + res = mount_volume(&path, &fs, FA_WRITE); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (FF_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; /* Cannot remove dot entry */ + } +#if FF_FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&dj, 2); /* Check if it is an open object */ +#endif + if (res == FR_OK) { /* The object is accessible */ + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; /* Cannot remove the origin directory */ + } else { + if (dj.obj.attr & AM_RDO) { + res = FR_DENIED; /* Cannot remove R/O object */ + } + } + if (res == FR_OK) { +#if FF_FS_EXFAT + obj.fs = fs; + if (fs->fs_type == FS_EXFAT) { + init_alloc_info(fs, &obj); + dclst = obj.sclust; + } else +#endif + { + dclst = ld_clust(fs, dj.dir); + } + if (dj.obj.attr & AM_DIR) { /* Is it a sub-directory? */ +#if FF_FS_RPATH != 0 + if (dclst == fs->cdir) { /* Is it the current directory? */ + res = FR_DENIED; + } else +#endif + { + sdj.obj.fs = fs; /* Open the sub-directory */ + sdj.obj.sclust = dclst; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + sdj.obj.objsize = obj.objsize; + sdj.obj.stat = obj.stat; + } +#endif + res = dir_sdi(&sdj, 0); + if (res == FR_OK) { + res = DIR_READ_FILE(&sdj); /* Test if the directory is empty */ + if (res == FR_OK) res = FR_DENIED; /* Not empty? */ + if (res == FR_NO_FILE) res = FR_OK; /* Empty? */ + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj); /* Remove the directory entry */ + if (res == FR_OK && dclst != 0) { /* Remove the cluster chain if exist */ +#if FF_FS_EXFAT + res = remove_chain(&obj, dclst, 0); +#else + res = remove_chain(&dj.obj, dclst, 0); +#endif + } + if (res == FR_OK) res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FFOBJID sobj; + FATFS *fs; + DWORD dcl, pcl, tm; + DEF_NAMBUF + + + res = mount_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Name collision? */ + if (FF_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) { /* Invalid name? */ + res = FR_INVALID_NAME; + } + if (res == FR_NO_FILE) { /* It is clear to create a new directory */ + sobj.fs = fs; /* New object id to create a new chain */ + dcl = create_chain(&sobj, 0); /* Allocate a cluster for the new directory */ + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster? */ + if (dcl == 1) res = FR_INT_ERR; /* Any insanity? */ + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; /* Disk error? */ + tm = GET_FATTIME(); + if (res == FR_OK) { + res = dir_clear(fs, dcl); /* Clean up the new table */ + if (res == FR_OK) { + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* Create dot entries (FAT only) */ + memset(fs->win + DIR_Name, ' ', 11); /* Create "." entry */ + fs->win[DIR_Name] = '.'; + fs->win[DIR_Attr] = AM_DIR; + st_dword(fs->win + DIR_ModTime, tm); + st_clust(fs, fs->win, dcl); + memcpy(fs->win + SZDIRE, fs->win, SZDIRE); /* Create ".." entry */ + fs->win[SZDIRE + 1] = '.'; pcl = dj.obj.sclust; + st_clust(fs, fs->win + SZDIRE, pcl); + fs->wflag = 1; + } + res = dir_register(&dj); /* Register the object to the parent directoy */ + } + } + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* Initialize directory entry block */ + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Created time */ + st_dword(fs->dirbuf + XDIR_FstClus, dcl); /* Table start cluster */ + st_dword(fs->dirbuf + XDIR_FileSize, (DWORD)fs->csize * SS(fs)); /* Directory size needs to be valid */ + st_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)fs->csize * SS(fs)); + fs->dirbuf[XDIR_GenFlags] = 3; /* Initialize the object flag */ + fs->dirbuf[XDIR_Attr] = AM_DIR; /* Attribute */ + res = store_xdir(&dj); + } else +#endif + { + st_dword(dj.dir + DIR_ModTime, tm); /* Created time */ + st_clust(fs, dj.dir, dcl); /* Table start cluster */ + dj.dir[DIR_Attr] = AM_DIR; /* Attribute */ + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } else { + remove_chain(&sobj, dcl, 0); /* Could not register, remove the allocated cluster */ + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const TCHAR* path_old, /* Pointer to the object name to be renamed */ + const TCHAR* path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR djo, djn; + FATFS *fs; + BYTE buf[FF_FS_EXFAT ? SZDIRE * 2 : SZDIRE], *dir; + LBA_t sect; + DEF_NAMBUF + + + get_ldnumber(&path_new); /* Snip the drive number of new name off */ + res = mount_volume(&path_old, &fs, FA_WRITE); /* Get logical drive of the old object */ + if (res == FR_OK) { + djo.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&djo, path_old); /* Check old object */ + if (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check validity of name */ +#if FF_FS_LOCK != 0 + if (res == FR_OK) { + res = chk_lock(&djo, 2); + } +#endif + if (res == FR_OK) { /* Object to be renamed is found */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At exFAT volume */ + BYTE nf, nn; + WORD nh; + + memcpy(buf, fs->dirbuf, SZDIRE * 2); /* Save 85+C0 entry of old object */ + memcpy(&djn, &djo, sizeof djo); + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + nf = fs->dirbuf[XDIR_NumSec]; nn = fs->dirbuf[XDIR_NumName]; + nh = ld_word(fs->dirbuf + XDIR_NameHash); + memcpy(fs->dirbuf, buf, SZDIRE * 2); /* Restore 85+C0 entry */ + fs->dirbuf[XDIR_NumSec] = nf; fs->dirbuf[XDIR_NumName] = nn; + st_word(fs->dirbuf + XDIR_NameHash, nh); + if (!(fs->dirbuf[XDIR_Attr] & AM_DIR)) fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive attribute if it is a file */ +/* Start of critical section where an interruption can cause a cross-link */ + res = store_xdir(&djn); + } + } + } else +#endif + { /* At FAT/FAT32 volume */ + memcpy(buf, djo.dir, SZDIRE); /* Save directory entry of the object */ + memcpy(&djn, &djo, sizeof (DIR)); /* Duplicate the directory object */ + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + dir = djn.dir; /* Copy directory entry of the object except name */ + memcpy(dir + 13, buf + 13, SZDIRE - 13); + dir[DIR_Attr] = buf[DIR_Attr]; + if (!(dir[DIR_Attr] & AM_DIR)) dir[DIR_Attr] |= AM_ARC; /* Set archive attribute if it is a file */ + fs->wflag = 1; + if ((dir[DIR_Attr] & AM_DIR) && djo.obj.sclust != djn.obj.sclust) { /* Update .. entry in the sub-directory if needed */ + sect = clst2sect(fs, ld_clust(fs, dir)); + if (sect == 0) { + res = FR_INT_ERR; + } else { +/* Start of critical section where an interruption can cause a cross-link */ + res = move_window(fs, sect); + dir = fs->win + SZDIRE * 1; /* Ptr to .. entry */ + if (res == FR_OK && dir[1] == '.') { + st_clust(fs, dir, djn.obj.sclust); + fs->wflag = 1; + } + } + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&djo); /* Remove old entry */ + if (res == FR_OK) { + res = sync_fs(fs); + } + } +/* End of the critical section */ + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_FS_MINIMIZE == 0 */ +#endif /* FF_FS_MINIMIZE <= 1 */ +#endif /* FF_FS_MINIMIZE <= 2 */ + + + +#if FF_USE_CHMOD && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Change Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const TCHAR* path, /* Pointer to the file path */ + BYTE attr, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = mount_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->dirbuf[XDIR_Attr] = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + res = store_xdir(&dj); + } else +#endif + { + dj.dir[DIR_Attr] = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const TCHAR* path, /* Pointer to the file/directory name */ + const FILINFO* fno /* Pointer to the timestamp to be set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = mount_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_dword(fs->dirbuf + XDIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + res = store_xdir(&dj); + } else +#endif + { + st_dword(dj.dir + DIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* FF_USE_CHMOD && !FF_FS_READONLY */ + + + +#if FF_USE_LABEL +/*-----------------------------------------------------------------------*/ +/* Get Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getlabel ( + const TCHAR* path, /* Logical drive number */ + TCHAR* label, /* Buffer to store the volume label */ + DWORD* vsn /* Variable to store the volume serial number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT si, di; + WCHAR wc; + + /* Get logical drive */ + res = mount_volume(&path, &fs, 0); + + /* Get volume label */ + if (res == FR_OK && label) { + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = DIR_READ_LABEL(&dj); /* Find a volume label entry */ + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + WCHAR hs; + UINT nw; + + for (si = di = hs = 0; si < dj.dir[XDIR_NumLabel]; si++) { /* Extract volume label from 83 entry */ + wc = ld_word(dj.dir + XDIR_Label + si * 2); + if (hs == 0 && IsSurrogate(wc)) { /* Is the code a surrogate? */ + hs = wc; continue; + } + nw = put_utf((DWORD)hs << 16 | wc, &label[di], 4); /* Store it in API encoding */ + if (nw == 0) { di = 0; break; } /* Encode error? */ + di += nw; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + label[di] = 0; + } else +#endif + { + si = di = 0; /* Extract volume label from AM_VOL entry */ + while (si < 11) { + wc = dj.dir[si++]; +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 /* Unicode output */ + if (dbc_1st((BYTE)wc) && si < 11) wc = wc << 8 | dj.dir[si++]; /* Is it a DBC? */ + wc = ff_oem2uni(wc, CODEPAGE); /* Convert it into Unicode */ + if (wc == 0) { di = 0; break; } /* Invalid char in current code page? */ + di += put_utf(wc, &label[di], 4); /* Store it in Unicode */ +#else /* ANSI/OEM output */ + label[di++] = (TCHAR)wc; +#endif + } + do { /* Truncate trailing spaces */ + label[di] = 0; + if (di == 0) break; + } while (label[--di] == ' '); + } + } + } + if (res == FR_NO_FILE) { /* No label entry and return nul string */ + label[0] = 0; + res = FR_OK; + } + } + + /* Get volume serial number */ + if (res == FR_OK && vsn) { + res = move_window(fs, fs->volbase); + if (res == FR_OK) { + switch (fs->fs_type) { + case FS_EXFAT: + di = BPB_VolIDEx; + break; + + case FS_FAT32: + di = BS_VolID32; + break; + + default: + di = BS_VolID; + } + *vsn = ld_dword(fs->win + di); + } + } + + LEAVE_FF(fs, res); +} + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Set Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setlabel ( + const TCHAR* label /* Volume label to set with heading logical drive number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE dirvn[22]; + UINT di; + WCHAR wc; + static const char badchr[18] = "+.,;=[]" "/*:<>|\\\"\?\x7F"; /* [0..16] for FAT, [7..16] for exFAT */ +#if FF_USE_LFN + DWORD dc; +#endif + + /* Get logical drive */ + res = mount_volume(&label, &fs, FA_WRITE); + if (res != FR_OK) LEAVE_FF(fs, res); + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + memset(dirvn, 0, 22); + di = 0; + while ((UINT)*label >= ' ') { /* Create volume label */ + dc = tchar2uni(&label); /* Get a Unicode character */ + if (dc >= 0x10000) { + if (dc == 0xFFFFFFFF || di >= 10) { /* Wrong surrogate or buffer overflow */ + dc = 0; + } else { + st_word(dirvn + di * 2, (WCHAR)(dc >> 16)); di++; + } + } + if (dc == 0 || strchr(&badchr[7], (int)dc) || di >= 11) { /* Check validity of the volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + st_word(dirvn + di * 2, (WCHAR)dc); di++; + } + } else +#endif + { /* On the FAT/FAT32 volume */ + memset(dirvn, ' ', 11); + di = 0; + while ((UINT)*label >= ' ') { /* Create volume label */ +#if FF_USE_LFN + dc = tchar2uni(&label); + wc = (dc < 0x10000) ? ff_uni2oem(ff_wtoupper(dc), CODEPAGE) : 0; +#else /* ANSI/OEM input */ + wc = (BYTE)*label++; + if (dbc_1st((BYTE)wc)) wc = dbc_2nd((BYTE)*label) ? wc << 8 | (BYTE)*label++ : 0; + if (IsLower(wc)) wc -= 0x20; /* To upper ASCII characters */ +#if FF_CODE_PAGE == 0 + if (ExCvt && wc >= 0x80) wc = ExCvt[wc - 0x80]; /* To upper extended characters (SBCS cfg) */ +#elif FF_CODE_PAGE < 900 + if (wc >= 0x80) wc = ExCvt[wc - 0x80]; /* To upper extended characters (SBCS cfg) */ +#endif +#endif + if (wc == 0 || strchr(&badchr[0], (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + if (wc >= 0x100) dirvn[di++] = (BYTE)(wc >> 8); + dirvn[di++] = (BYTE)wc; + } + if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ + while (di && dirvn[di - 1] == ' ') di--; /* Snip trailing spaces */ + } + + /* Set volume label */ + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = DIR_READ_LABEL(&dj); /* Get volume label entry */ + if (res == FR_OK) { + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_NumLabel] = (BYTE)di; /* Change the volume label */ + memcpy(dj.dir + XDIR_Label, dirvn, 22); + } else { + if (di != 0) { + memcpy(dj.dir, dirvn, 11); /* Change the volume label */ + } else { + dj.dir[DIR_Name] = DDEM; /* Remove the volume label */ + } + } + fs->wflag = 1; + res = sync_fs(fs); + } else { /* No volume label entry or an error */ + if (res == FR_NO_FILE) { + res = FR_OK; + if (di != 0) { /* Create a volume label entry */ + res = dir_alloc(&dj, 1); /* Allocate an entry */ + if (res == FR_OK) { + memset(dj.dir, 0, SZDIRE); /* Clean the entry */ + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_Type] = ET_VLABEL; /* Create volume label entry */ + dj.dir[XDIR_NumLabel] = (BYTE)di; + memcpy(dj.dir + XDIR_Label, dirvn, 22); + } else { + dj.dir[DIR_Attr] = AM_VOL; /* Create volume label entry */ + memcpy(dj.dir, dirvn, 11); + } + fs->wflag = 1; + res = sync_fs(fs); + } + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_LABEL */ + + + +#if FF_USE_EXPAND && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Allocate a Contiguous Blocks to the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_expand ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t fsz, /* File size to be expanded to */ + BYTE opt /* Operation mode 0:Find and prepare or 1:Find and allocate */ +) +{ + FRESULT res; + FATFS *fs; + DWORD n, clst, stcl, scl, ncl, tcl, lclst; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); +#if FF_FS_EXFAT + if (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) LEAVE_FF(fs, FR_DENIED); /* Check if in size limit */ +#endif + n = (DWORD)fs->csize * SS(fs); /* Cluster size */ + tcl = (DWORD)(fsz / n) + ((fsz & (n - 1)) ? 1 : 0); /* Number of clusters required */ + stcl = fs->last_clst; lclst = 0; + if (stcl < 2 || stcl >= fs->n_fatent) stcl = 2; + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + scl = find_bitmap(fs, stcl, tcl); /* Find a contiguous cluster block */ + if (scl == 0) res = FR_DENIED; /* No contiguous cluster block was found */ + if (scl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) { /* A contiguous free area is found */ + if (opt) { /* Allocate it now */ + res = change_bitmap(fs, scl, tcl, 1); /* Mark the cluster block 'in use' */ + lclst = scl + tcl - 1; + } else { /* Set it as suggested point for next allocation */ + lclst = scl - 1; + } + } + } else +#endif + { + scl = clst = stcl; ncl = 0; + for (;;) { /* Find a contiguous cluster block */ + n = get_fat(&fp->obj, clst); + if (++clst >= fs->n_fatent) clst = 2; + if (n == 1) { res = FR_INT_ERR; break; } + if (n == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (n == 0) { /* Is it a free cluster? */ + if (++ncl == tcl) break; /* Break if a contiguous cluster block is found */ + } else { + scl = clst; ncl = 0; /* Not a free cluster */ + } + if (clst == stcl) { res = FR_DENIED; break; } /* No contiguous cluster? */ + } + if (res == FR_OK) { /* A contiguous free area is found */ + if (opt) { /* Allocate it now */ + for (clst = scl, n = tcl; n; clst++, n--) { /* Create a cluster chain on the FAT */ + res = put_fat(fs, clst, (n == 1) ? 0xFFFFFFFF : clst + 1); + if (res != FR_OK) break; + lclst = clst; + } + } else { /* Set it as suggested point for next allocation */ + lclst = scl - 1; + } + } + } + + if (res == FR_OK) { + fs->last_clst = lclst; /* Set suggested start cluster to start next */ + if (opt) { /* Is it allocated now? */ + fp->obj.sclust = scl; /* Update object allocation information */ + fp->obj.objsize = fsz; + if (FF_FS_EXFAT) fp->obj.stat = 2; /* Set status 'contiguous chain' */ + fp->flag |= FA_MODIFIED; + if (fs->free_clst <= fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst -= tcl; + fs->fsi_flag |= 1; + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* FF_USE_EXPAND && !FF_FS_READONLY */ + + + +#if FF_USE_FORWARD +/*-----------------------------------------------------------------------*/ +/* Forward Data to the Stream Directly */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_forward ( + FIL* fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btf, /* Number of bytes to forward */ + UINT* bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst; + LBA_t sect; + FSIZE_t remain; + UINT rcnt, csect; + BYTE *dbuf; + + + *bf = 0; /* Clear transfer byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + remain = fp->obj.objsize - fp->fptr; + if (btf > remain) btf = (UINT)remain; /* Truncate btf by remaining bytes */ + + for ( ; btf > 0 && (*func)(0, 0); fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) { /* Repeat until all data transferred or stream goes busy */ + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + if (csect == 0) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->obj.sclust : get_fat(&fp->obj, fp->clust); + if (clst <= 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + } + sect = clst2sect(fs, fp->clust); /* Get current data sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; +#if FF_FS_TINY + if (move_window(fs, sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window to the file data */ + dbuf = fs->win; +#else + if (fp->sect != sect) { /* Fill sector cache with file data */ +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + } + dbuf = fp->buf; +#endif + fp->sect = sect; + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes remains in the sector */ + if (rcnt > btf) rcnt = btf; /* Clip it by btr if needed */ + rcnt = (*func)(dbuf + ((UINT)fp->fptr % SS(fs)), rcnt); /* Forward the file data */ + if (rcnt == 0) ABORT(fs, FR_INT_ERR); + } + + LEAVE_FF(fs, FR_OK); +} +#endif /* FF_USE_FORWARD */ + + + +#if !FF_FS_READONLY && FF_USE_MKFS +/*-----------------------------------------------------------------------*/ +/* Create FAT/exFAT volume (with sub-functions) */ +/*-----------------------------------------------------------------------*/ + +#define N_SEC_TRACK 63 /* Sectors per track for determination of drive CHS */ +#define GPT_ALIGN 0x100000 /* Alignment of partitions in GPT [byte] (>=128KB) */ +#define GPT_ITEMS 128 /* Number of GPT table size (>=128, sector aligned) */ + + +/* Create partitions on the physical drive in format of MBR or GPT */ + +static FRESULT create_partition ( + BYTE drv, /* Physical drive number */ + const LBA_t plst[], /* Partition list */ + BYTE sys, /* System ID (for only MBR, temp setting) */ + BYTE* buf /* Working buffer for a sector */ +) +{ + UINT i, cy; + LBA_t sz_drv; + DWORD sz_drv32, nxt_alloc32, sz_part32; + BYTE *pte; + BYTE hd, n_hd, sc, n_sc; + + /* Get physical drive size */ + if (disk_ioctl(drv, GET_SECTOR_COUNT, &sz_drv) != RES_OK) return FR_DISK_ERR; + +#if FF_LBA64 + if (sz_drv >= FF_MIN_GPT) { /* Create partitions in GPT format */ + WORD ss; + UINT sz_ptbl, pi, si, ofs; + DWORD bcc, rnd, align; + QWORD nxt_alloc, sz_part, sz_pool, top_bpt; + static const BYTE gpt_mbr[16] = {0x00, 0x00, 0x02, 0x00, 0xEE, 0xFE, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF}; + +#if FF_MAX_SS != FF_MIN_SS + if (disk_ioctl(drv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR; /* Get sector size */ + if (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) return FR_DISK_ERR; +#else + ss = FF_MAX_SS; +#endif + rnd = (DWORD)sz_drv + GET_FATTIME(); /* Random seed */ + align = GPT_ALIGN / ss; /* Partition alignment for GPT [sector] */ + sz_ptbl = GPT_ITEMS * SZ_GPTE / ss; /* Size of partition table [sector] */ + top_bpt = sz_drv - sz_ptbl - 1; /* Backup partiiton table start sector */ + nxt_alloc = 2 + sz_ptbl; /* First allocatable sector */ + sz_pool = top_bpt - nxt_alloc; /* Size of allocatable area */ + bcc = 0xFFFFFFFF; sz_part = 1; + pi = si = 0; /* partition table index, size table index */ + do { + if (pi * SZ_GPTE % ss == 0) memset(buf, 0, ss); /* Clean the buffer if needed */ + if (sz_part != 0) { /* Is the size table not termintated? */ + nxt_alloc = (nxt_alloc + align - 1) & ((QWORD)0 - align); /* Align partition start */ + sz_part = plst[si++]; /* Get a partition size */ + if (sz_part <= 100) { /* Is the size in percentage? */ + sz_part = sz_pool * sz_part / 100; + sz_part = (sz_part + align - 1) & ((QWORD)0 - align); /* Align partition end (only if in percentage) */ + } + if (nxt_alloc + sz_part > top_bpt) { /* Clip the size at end of the pool */ + sz_part = (nxt_alloc < top_bpt) ? top_bpt - nxt_alloc : 0; + } + } + if (sz_part != 0) { /* Add a partition? */ + ofs = pi * SZ_GPTE % ss; + memcpy(buf + ofs + GPTE_PtGuid, GUID_MS_Basic, 16); /* Set partition GUID (Microsoft Basic Data) */ + rnd = make_rand(rnd, buf + ofs + GPTE_UpGuid, 16); /* Set unique partition GUID */ + st_qword(buf + ofs + GPTE_FstLba, nxt_alloc); /* Set partition start sector */ + st_qword(buf + ofs + GPTE_LstLba, nxt_alloc + sz_part - 1); /* Set partition end sector */ + nxt_alloc += sz_part; /* Next allocatable sector */ + } + if ((pi + 1) * SZ_GPTE % ss == 0) { /* Write the buffer if it is filled up */ + for (i = 0; i < ss; bcc = crc32(bcc, buf[i++])) ; /* Calculate table check sum */ + if (disk_write(drv, buf, 2 + pi * SZ_GPTE / ss, 1) != RES_OK) return FR_DISK_ERR; /* Write to primary table */ + if (disk_write(drv, buf, top_bpt + pi * SZ_GPTE / ss, 1) != RES_OK) return FR_DISK_ERR; /* Write to secondary table */ + } + } while (++pi < GPT_ITEMS); + + /* Create primary GPT header */ + memset(buf, 0, ss); + memcpy(buf + GPTH_Sign, "EFI PART" "\0\0\1\0" "\x5C\0\0", 16); /* Signature, version (1.0) and size (92) */ + st_dword(buf + GPTH_PtBcc, ~bcc); /* Table check sum */ + st_qword(buf + GPTH_CurLba, 1); /* LBA of this header */ + st_qword(buf + GPTH_BakLba, sz_drv - 1); /* LBA of secondary header */ + st_qword(buf + GPTH_FstLba, 2 + sz_ptbl); /* LBA of first allocatable sector */ + st_qword(buf + GPTH_LstLba, top_bpt - 1); /* LBA of last allocatable sector */ + st_dword(buf + GPTH_PteSize, SZ_GPTE); /* Size of a table entry */ + st_dword(buf + GPTH_PtNum, GPT_ITEMS); /* Number of table entries */ + st_dword(buf + GPTH_PtOfs, 2); /* LBA of this table */ + rnd = make_rand(rnd, buf + GPTH_DskGuid, 16); /* Disk GUID */ + for (i = 0, bcc= 0xFFFFFFFF; i < 92; bcc = crc32(bcc, buf[i++])) ; /* Calculate header check sum */ + st_dword(buf + GPTH_Bcc, ~bcc); /* Header check sum */ + if (disk_write(drv, buf, 1, 1) != RES_OK) return FR_DISK_ERR; + + /* Create secondary GPT header */ + st_qword(buf + GPTH_CurLba, sz_drv - 1); /* LBA of this header */ + st_qword(buf + GPTH_BakLba, 1); /* LBA of primary header */ + st_qword(buf + GPTH_PtOfs, top_bpt); /* LBA of this table */ + st_dword(buf + GPTH_Bcc, 0); + for (i = 0, bcc= 0xFFFFFFFF; i < 92; bcc = crc32(bcc, buf[i++])) ; /* Calculate header check sum */ + st_dword(buf + GPTH_Bcc, ~bcc); /* Header check sum */ + if (disk_write(drv, buf, sz_drv - 1, 1) != RES_OK) return FR_DISK_ERR; + + /* Create protective MBR */ + memset(buf, 0, ss); + memcpy(buf + MBR_Table, gpt_mbr, 16); /* Create a GPT partition */ + st_word(buf + BS_55AA, 0xAA55); + if (disk_write(drv, buf, 0, 1) != RES_OK) return FR_DISK_ERR; + + } else +#endif + { /* Create partitions in MBR format */ + sz_drv32 = (DWORD)sz_drv; + n_sc = N_SEC_TRACK; /* Determine drive CHS without any consideration of the drive geometry */ + for (n_hd = 8; n_hd != 0 && sz_drv32 / n_hd / n_sc > 1024; n_hd *= 2) ; + if (n_hd == 0) n_hd = 255; /* Number of heads needs to be <256 */ + + memset(buf, 0, FF_MAX_SS); /* Clear MBR */ + pte = buf + MBR_Table; /* Partition table in the MBR */ + for (i = 0, nxt_alloc32 = n_sc; i < 4 && nxt_alloc32 != 0 && nxt_alloc32 < sz_drv32; i++, nxt_alloc32 += sz_part32) { + sz_part32 = (DWORD)plst[i]; /* Get partition size */ + if (sz_part32 <= 100) sz_part32 = (sz_part32 == 100) ? sz_drv32 : sz_drv32 / 100 * sz_part32; /* Size in percentage? */ + if (nxt_alloc32 + sz_part32 > sz_drv32 || nxt_alloc32 + sz_part32 < nxt_alloc32) sz_part32 = sz_drv32 - nxt_alloc32; /* Clip at drive size */ + if (sz_part32 == 0) break; /* End of table or no sector to allocate? */ + + st_dword(pte + PTE_StLba, nxt_alloc32); /* Start LBA */ + st_dword(pte + PTE_SizLba, sz_part32); /* Number of sectors */ + pte[PTE_System] = sys; /* System type */ + + cy = (UINT)(nxt_alloc32 / n_sc / n_hd); /* Start cylinder */ + hd = (BYTE)(nxt_alloc32 / n_sc % n_hd); /* Start head */ + sc = (BYTE)(nxt_alloc32 % n_sc + 1); /* Start sector */ + pte[PTE_StHead] = hd; + pte[PTE_StSec] = (BYTE)((cy >> 2 & 0xC0) | sc); + pte[PTE_StCyl] = (BYTE)cy; + + cy = (UINT)((nxt_alloc32 + sz_part32 - 1) / n_sc / n_hd); /* End cylinder */ + hd = (BYTE)((nxt_alloc32 + sz_part32 - 1) / n_sc % n_hd); /* End head */ + sc = (BYTE)((nxt_alloc32 + sz_part32 - 1) % n_sc + 1); /* End sector */ + pte[PTE_EdHead] = hd; + pte[PTE_EdSec] = (BYTE)((cy >> 2 & 0xC0) | sc); + pte[PTE_EdCyl] = (BYTE)cy; + + pte += SZ_PTE; /* Next entry */ + } + + st_word(buf + BS_55AA, 0xAA55); /* MBR signature */ + if (disk_write(drv, buf, 0, 1) != RES_OK) return FR_DISK_ERR; /* Write it to the MBR */ + } + + return FR_OK; +} + + + +FRESULT f_mkfs ( + const TCHAR* path, /* Logical drive number */ + const MKFS_PARM* opt, /* Format options */ + void* work, /* Pointer to working buffer (null: use heap memory) */ + UINT len /* Size of working buffer [byte] */ +) +{ + static const WORD cst[] = {1, 4, 16, 64, 256, 512, 0}; /* Cluster size boundary for FAT volume (4Ks unit) */ + static const WORD cst32[] = {1, 2, 4, 8, 16, 32, 0}; /* Cluster size boundary for FAT32 volume (128Ks unit) */ + static const MKFS_PARM defopt = {FM_ANY, 0, 0, 0, 0}; /* Default parameter */ + BYTE fsopt, fsty, sys, *buf, *pte, pdrv, ipart; + WORD ss; /* Sector size */ + DWORD sz_buf, sz_blk, n_clst, pau, nsect, n, vsn; + LBA_t sz_vol, b_vol, b_fat, b_data; /* Size of volume, Base LBA of volume, fat, data */ + LBA_t sect, lba[2]; + DWORD sz_rsv, sz_fat, sz_dir, sz_au; /* Size of reserved, fat, dir, data, cluster */ + UINT n_fat, n_root, i; /* Index, Number of FATs and Number of roor dir entries */ + int vol; + DSTATUS ds; + FRESULT fr; + + + /* Check mounted drive and clear work area */ + vol = get_ldnumber(&path); /* Get target logical drive */ + if (vol < 0) return FR_INVALID_DRIVE; + if (FatFs[vol]) FatFs[vol]->fs_type = 0; /* Clear the fs object if mounted */ + pdrv = LD2PD(vol); /* Physical drive */ + ipart = LD2PT(vol); /* Partition (0:create as new, 1..:get from partition table) */ + if (!opt) opt = &defopt; /* Use default parameter if it is not given */ + + /* Get physical drive status (sz_drv, sz_blk, ss) */ + ds = disk_initialize(pdrv); + if (ds & STA_NOINIT) return FR_NOT_READY; + if (ds & STA_PROTECT) return FR_WRITE_PROTECTED; + sz_blk = opt->align; + if (sz_blk == 0 && disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk) != RES_OK) sz_blk = 1; + if (sz_blk == 0 || sz_blk > 0x8000 || (sz_blk & (sz_blk - 1))) sz_blk = 1; +#if FF_MAX_SS != FF_MIN_SS + if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR; + if (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) return FR_DISK_ERR; +#else + ss = FF_MAX_SS; +#endif + /* Options for FAT sub-type and FAT parameters */ + fsopt = opt->fmt & (FM_ANY | FM_SFD); + n_fat = (opt->n_fat >= 1 && opt->n_fat <= 2) ? opt->n_fat : 1; + n_root = (opt->n_root >= 1 && opt->n_root <= 32768 && (opt->n_root % (ss / SZDIRE)) == 0) ? opt->n_root : 512; + sz_au = (opt->au_size <= 0x1000000 && (opt->au_size & (opt->au_size - 1)) == 0) ? opt->au_size : 0; + sz_au /= ss; /* Byte --> Sector */ + + /* Get working buffer */ + sz_buf = len / ss; /* Size of working buffer [sector] */ + if (sz_buf == 0) return FR_NOT_ENOUGH_CORE; + buf = (BYTE*)work; /* Working buffer */ +#if FF_USE_LFN == 3 + if (!buf) buf = ff_memalloc(sz_buf * ss); /* Use heap memory for working buffer */ +#endif + if (!buf) return FR_NOT_ENOUGH_CORE; + + /* Determine where the volume to be located (b_vol, sz_vol) */ + b_vol = sz_vol = 0; + if (FF_MULTI_PARTITION && ipart != 0) { /* Is the volume associated with any specific partition? */ + /* Get partition location from the existing partition table */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Load MBR */ + if (ld_word(buf + BS_55AA) != 0xAA55) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if MBR is valid */ +#if FF_LBA64 + if (buf[MBR_Table + PTE_System] == 0xEE) { /* GPT protective MBR? */ + DWORD n_ent, ofs; + QWORD pt_lba; + + /* Get the partition location from GPT */ + if (disk_read(pdrv, buf, 1, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Load GPT header sector (next to MBR) */ + if (!test_gpt_header(buf)) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if GPT header is valid */ + n_ent = ld_dword(buf + GPTH_PtNum); /* Number of entries */ + pt_lba = ld_qword(buf + GPTH_PtOfs); /* Table start sector */ + ofs = i = 0; + while (n_ent) { /* Find MS Basic partition with order of ipart */ + if (ofs == 0 && disk_read(pdrv, buf, pt_lba++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Get PT sector */ + if (!memcmp(buf + ofs + GPTE_PtGuid, GUID_MS_Basic, 16) && ++i == ipart) { /* MS basic data partition? */ + b_vol = ld_qword(buf + ofs + GPTE_FstLba); + sz_vol = ld_qword(buf + ofs + GPTE_LstLba) - b_vol + 1; + break; + } + n_ent--; ofs = (ofs + SZ_GPTE) % ss; /* Next entry */ + } + if (n_ent == 0) LEAVE_MKFS(FR_MKFS_ABORTED); /* Partition not found */ + fsopt |= 0x80; /* Partitioning is in GPT */ + } else +#endif + { /* Get the partition location from MBR partition table */ + pte = buf + (MBR_Table + (ipart - 1) * SZ_PTE); + if (ipart > 4 || pte[PTE_System] == 0) LEAVE_MKFS(FR_MKFS_ABORTED); /* No partition? */ + b_vol = ld_dword(pte + PTE_StLba); /* Get volume start sector */ + sz_vol = ld_dword(pte + PTE_SizLba); /* Get volume size */ + } + } else { /* The volume is associated with a physical drive */ + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + if (!(fsopt & FM_SFD)) { /* To be partitioned? */ + /* Create a single-partition on the drive in this function */ +#if FF_LBA64 + if (sz_vol >= FF_MIN_GPT) { /* Which partition type to create, MBR or GPT? */ + fsopt |= 0x80; /* Partitioning is in GPT */ + b_vol = GPT_ALIGN / ss; sz_vol -= b_vol + GPT_ITEMS * SZ_GPTE / ss + 1; /* Estimated partition offset and size */ + } else +#endif + { /* Partitioning is in MBR */ + if (sz_vol > N_SEC_TRACK) { + b_vol = N_SEC_TRACK; sz_vol -= b_vol; /* Estimated partition offset and size */ + } + } + } + } + if (sz_vol < 128) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if volume size is >=128s */ + + /* Now start to create an FAT volume at b_vol and sz_vol */ + + do { /* Pre-determine the FAT type */ + if (FF_FS_EXFAT && (fsopt & FM_EXFAT)) { /* exFAT possible? */ + if ((fsopt & FM_ANY) == FM_EXFAT || sz_vol >= 0x4000000 || sz_au > 128) { /* exFAT only, vol >= 64MS or sz_au > 128S ? */ + fsty = FS_EXFAT; break; + } + } +#if FF_LBA64 + if (sz_vol >= 0x100000000) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too large volume for FAT/FAT32 */ +#endif + if (sz_au > 128) sz_au = 128; /* Invalid AU for FAT/FAT32? */ + if (fsopt & FM_FAT32) { /* FAT32 possible? */ + if (!(fsopt & FM_FAT)) { /* no-FAT? */ + fsty = FS_FAT32; break; + } + } + if (!(fsopt & FM_FAT)) LEAVE_MKFS(FR_INVALID_PARAMETER); /* no-FAT? */ + fsty = FS_FAT16; + } while (0); + + vsn = (DWORD)sz_vol + GET_FATTIME(); /* VSN generated from current time and partitiion size */ + +#if FF_FS_EXFAT + if (fsty == FS_EXFAT) { /* Create an exFAT volume */ + DWORD szb_bit, szb_case, sum, nbit, clu, clen[3]; + WCHAR ch, si; + UINT j, st; + + if (sz_vol < 0x1000) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume for exFAT? */ +#if FF_USE_TRIM + lba[0] = b_vol; lba[1] = b_vol + sz_vol - 1; /* Inform storage device that the volume area may be erased */ + disk_ioctl(pdrv, CTRL_TRIM, lba); +#endif + /* Determine FAT location, data location and number of clusters */ + if (sz_au == 0) { /* AU auto-selection */ + sz_au = 8; + if (sz_vol >= 0x80000) sz_au = 64; /* >= 512Ks */ + if (sz_vol >= 0x4000000) sz_au = 256; /* >= 64Ms */ + } + b_fat = b_vol + 32; /* FAT start at offset 32 */ + sz_fat = (DWORD)((sz_vol / sz_au + 2) * 4 + ss - 1) / ss; /* Number of FAT sectors */ + b_data = (b_fat + sz_fat + sz_blk - 1) & ~((LBA_t)sz_blk - 1); /* Align data area to the erase block boundary */ + if (b_data - b_vol >= sz_vol / 2) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ + n_clst = (DWORD)(sz_vol - (b_data - b_vol)) / sz_au; /* Number of clusters */ + if (n_clst <16) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too few clusters? */ + if (n_clst > MAX_EXFAT) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters? */ + + szb_bit = (n_clst + 7) / 8; /* Size of allocation bitmap */ + clen[0] = (szb_bit + sz_au * ss - 1) / (sz_au * ss); /* Number of allocation bitmap clusters */ + + /* Create a compressed up-case table */ + sect = b_data + sz_au * clen[0]; /* Table start sector */ + sum = 0; /* Table checksum to be stored in the 82 entry */ + st = 0; si = 0; i = 0; j = 0; szb_case = 0; + do { + switch (st) { + case 0: + ch = (WCHAR)ff_wtoupper(si); /* Get an up-case char */ + if (ch != si) { + si++; break; /* Store the up-case char if exist */ + } + for (j = 1; (WCHAR)(si + j) && (WCHAR)(si + j) == ff_wtoupper((WCHAR)(si + j)); j++) ; /* Get run length of no-case block */ + if (j >= 128) { + ch = 0xFFFF; st = 2; break; /* Compress the no-case block if run is >= 128 chars */ + } + st = 1; /* Do not compress short run */ + /* FALLTHROUGH */ + case 1: + ch = si++; /* Fill the short run */ + if (--j == 0) st = 0; + break; + + default: + ch = (WCHAR)j; si += (WCHAR)j; /* Number of chars to skip */ + st = 0; + } + sum = xsum32(buf[i + 0] = (BYTE)ch, sum); /* Put it into the write buffer */ + sum = xsum32(buf[i + 1] = (BYTE)(ch >> 8), sum); + i += 2; szb_case += 2; + if (si == 0 || i == sz_buf * ss) { /* Write buffered data when buffer full or end of process */ + n = (i + ss - 1) / ss; + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; i = 0; + } + } while (si); + clen[1] = (szb_case + sz_au * ss - 1) / (sz_au * ss); /* Number of up-case table clusters */ + clen[2] = 1; /* Number of root dir clusters */ + + /* Initialize the allocation bitmap */ + sect = b_data; nsect = (szb_bit + ss - 1) / ss; /* Start of bitmap and number of bitmap sectors */ + nbit = clen[0] + clen[1] + clen[2]; /* Number of clusters in-use by system (bitmap, up-case and root-dir) */ + do { + memset(buf, 0, sz_buf * ss); /* Initialize bitmap buffer */ + for (i = 0; nbit != 0 && i / 8 < sz_buf * ss; buf[i / 8] |= 1 << (i % 8), i++, nbit--) ; /* Mark used clusters */ + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the FAT */ + sect = b_fat; nsect = sz_fat; /* Start of FAT and number of FAT sectors */ + j = nbit = clu = 0; + do { + memset(buf, 0, sz_buf * ss); i = 0; /* Clear work area and reset write offset */ + if (clu == 0) { /* Initialize FAT [0] and FAT[1] */ + st_dword(buf + i, 0xFFFFFFF8); i += 4; clu++; + st_dword(buf + i, 0xFFFFFFFF); i += 4; clu++; + } + do { /* Create chains of bitmap, up-case and root dir */ + while (nbit != 0 && i < sz_buf * ss) { /* Create a chain */ + st_dword(buf + i, (nbit > 1) ? clu + 1 : 0xFFFFFFFF); + i += 4; clu++; nbit--; + } + if (nbit == 0 && j < 3) nbit = clen[j++]; /* Get next chain length */ + } while (nbit != 0 && i < sz_buf * ss); + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the root directory */ + memset(buf, 0, sz_buf * ss); + buf[SZDIRE * 0 + 0] = ET_VLABEL; /* Volume label entry (no label) */ + buf[SZDIRE * 1 + 0] = ET_BITMAP; /* Bitmap entry */ + st_dword(buf + SZDIRE * 1 + 20, 2); /* cluster */ + st_dword(buf + SZDIRE * 1 + 24, szb_bit); /* size */ + buf[SZDIRE * 2 + 0] = ET_UPCASE; /* Up-case table entry */ + st_dword(buf + SZDIRE * 2 + 4, sum); /* sum */ + st_dword(buf + SZDIRE * 2 + 20, 2 + clen[0]); /* cluster */ + st_dword(buf + SZDIRE * 2 + 24, szb_case); /* size */ + sect = b_data + sz_au * (clen[0] + clen[1]); nsect = sz_au; /* Start of the root directory and number of sectors */ + do { /* Fill root directory sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + memset(buf, 0, ss); /* Rest of entries are filled with zero */ + sect += n; nsect -= n; + } while (nsect); + + /* Create two set of the exFAT VBR blocks */ + sect = b_vol; + for (n = 0; n < 2; n++) { + /* Main record (+0) */ + memset(buf, 0, ss); + memcpy(buf + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11); /* Boot jump code (x86), OEM name */ + st_qword(buf + BPB_VolOfsEx, b_vol); /* Volume offset in the physical drive [sector] */ + st_qword(buf + BPB_TotSecEx, sz_vol); /* Volume size [sector] */ + st_dword(buf + BPB_FatOfsEx, (DWORD)(b_fat - b_vol)); /* FAT offset [sector] */ + st_dword(buf + BPB_FatSzEx, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_DataOfsEx, (DWORD)(b_data - b_vol)); /* Data offset [sector] */ + st_dword(buf + BPB_NumClusEx, n_clst); /* Number of clusters */ + st_dword(buf + BPB_RootClusEx, 2 + clen[0] + clen[1]); /* Root dir cluster # */ + st_dword(buf + BPB_VolIDEx, vsn); /* VSN */ + st_word(buf + BPB_FSVerEx, 0x100); /* Filesystem version (1.00) */ + for (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; buf[BPB_BytsPerSecEx]++) ; /* Log2 of sector size [byte] */ + for (buf[BPB_SecPerClusEx] = 0, i = sz_au; i >>= 1; buf[BPB_SecPerClusEx]++) ; /* Log2 of cluster size [sector] */ + buf[BPB_NumFATsEx] = 1; /* Number of FATs */ + buf[BPB_DrvNumEx] = 0x80; /* Drive number (for int13) */ + st_word(buf + BS_BootCodeEx, 0xFEEB); /* Boot code (x86) */ + st_word(buf + BS_55AA, 0xAA55); /* Signature (placed here regardless of sector size) */ + for (i = sum = 0; i < ss; i++) { /* VBR checksum */ + if (i != BPB_VolFlagEx && i != BPB_VolFlagEx + 1 && i != BPB_PercInUseEx) sum = xsum32(buf[i], sum); + } + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + /* Extended bootstrap record (+1..+8) */ + memset(buf, 0, ss); + st_word(buf + ss - 2, 0xAA55); /* Signature (placed at end of sector) */ + for (j = 1; j < 9; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + /* OEM/Reserved record (+9..+10) */ + memset(buf, 0, ss); + for ( ; j < 11; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + /* Sum record (+11) */ + for (i = 0; i < ss; i += 4) st_dword(buf + i, sum); /* Fill with checksum value */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + + } else +#endif /* FF_FS_EXFAT */ + { /* Create an FAT/FAT32 volume */ + do { + pau = sz_au; + /* Pre-determine number of clusters and FAT sub-type */ + if (fsty == FS_FAT32) { /* FAT32 volume */ + if (pau == 0) { /* AU auto-selection */ + n = (DWORD)sz_vol / 0x20000; /* Volume size in unit of 128KS */ + for (i = 0, pau = 1; cst32[i] && cst32[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = (DWORD)sz_vol / pau; /* Number of clusters */ + sz_fat = (n_clst * 4 + 8 + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 32; /* Number of reserved sectors */ + sz_dir = 0; /* No static directory */ + if (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) LEAVE_MKFS(FR_MKFS_ABORTED); + } else { /* FAT volume */ + if (pau == 0) { /* au auto-selection */ + n = (DWORD)sz_vol / 0x1000; /* Volume size in unit of 4KS */ + for (i = 0, pau = 1; cst[i] && cst[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = (DWORD)sz_vol / pau; + if (n_clst > MAX_FAT12) { + n = n_clst * 2 + 4; /* FAT size [byte] */ + } else { + fsty = FS_FAT12; + n = (n_clst * 3 + 1) / 2 + 3; /* FAT size [byte] */ + } + sz_fat = (n + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 1; /* Number of reserved sectors */ + sz_dir = (DWORD)n_root * SZDIRE / ss; /* Root dir size [sector] */ + } + b_fat = b_vol + sz_rsv; /* FAT base */ + b_data = b_fat + sz_fat * n_fat + sz_dir; /* Data base */ + + /* Align data area to erase block boundary (for flash memory media) */ + n = (DWORD)(((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data); /* Sectors to next nearest from current data base */ + if (fsty == FS_FAT32) { /* FAT32: Move FAT */ + sz_rsv += n; b_fat += n; + } else { /* FAT: Expand FAT */ + if (n % n_fat) { /* Adjust fractional error if needed */ + n--; sz_rsv++; b_fat++; + } + sz_fat += n / n_fat; + } + + /* Determine number of clusters and final check of validity of the FAT sub-type */ + if (sz_vol < b_data + pau * 16 - b_vol) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ + n_clst = ((DWORD)sz_vol - sz_rsv - sz_fat * n_fat - sz_dir) / pau; + if (fsty == FS_FAT32) { + if (n_clst <= MAX_FAT16) { /* Too few clusters for FAT32? */ + if (sz_au == 0 && (sz_au = pau / 2) != 0) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + if (fsty == FS_FAT16) { + if (n_clst > MAX_FAT16) { /* Too many clusters for FAT16 */ + if (sz_au == 0 && (pau * 2) <= 64) { + sz_au = pau * 2; continue; /* Adjust cluster size and retry */ + } + if ((fsopt & FM_FAT32)) { + fsty = FS_FAT32; continue; /* Switch type to FAT32 and retry */ + } + if (sz_au == 0 && (sz_au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + if (n_clst <= MAX_FAT12) { /* Too few clusters for FAT16 */ + if (sz_au == 0 && (sz_au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + if (fsty == FS_FAT12 && n_clst > MAX_FAT12) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters for FAT12 */ + + /* Ok, it is the valid cluster configuration */ + break; + } while (1); + +#if FF_USE_TRIM + lba[0] = b_vol; lba[1] = b_vol + sz_vol - 1; /* Inform storage device that the volume area may be erased */ + disk_ioctl(pdrv, CTRL_TRIM, lba); +#endif + /* Create FAT VBR */ + memset(buf, 0, ss); + memcpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "MSDOS5.0", 11); /* Boot jump code (x86), OEM name */ + st_word(buf + BPB_BytsPerSec, ss); /* Sector size [byte] */ + buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */ + st_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv); /* Size of reserved area */ + buf[BPB_NumFATs] = (BYTE)n_fat; /* Number of FATs */ + st_word(buf + BPB_RootEntCnt, (WORD)((fsty == FS_FAT32) ? 0 : n_root)); /* Number of root directory entries */ + if (sz_vol < 0x10000) { + st_word(buf + BPB_TotSec16, (WORD)sz_vol); /* Volume size in 16-bit LBA */ + } else { + st_dword(buf + BPB_TotSec32, (DWORD)sz_vol); /* Volume size in 32-bit LBA */ + } + buf[BPB_Media] = 0xF8; /* Media descriptor byte */ + st_word(buf + BPB_SecPerTrk, 63); /* Number of sectors per track (for int13) */ + st_word(buf + BPB_NumHeads, 255); /* Number of heads (for int13) */ + st_dword(buf + BPB_HiddSec, (DWORD)b_vol); /* Volume offset in the physical drive [sector] */ + if (fsty == FS_FAT32) { + st_dword(buf + BS_VolID32, vsn); /* VSN */ + st_dword(buf + BPB_FATSz32, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */ + st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */ + st_word(buf + BPB_BkBootSec32, 6); /* Offset of backup VBR (VBR + 6) */ + buf[BS_DrvNum32] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig32] = 0x29; /* Extended boot signature */ + memcpy(buf + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + } else { + st_dword(buf + BS_VolID, vsn); /* VSN */ + st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */ + buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig] = 0x29; /* Extended boot signature */ + memcpy(buf + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + } + st_word(buf + BS_55AA, 0xAA55); /* Signature (offset is fixed here regardless of sector size) */ + if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the VBR sector */ + + /* Create FSINFO record if needed */ + if (fsty == FS_FAT32) { + disk_write(pdrv, buf, b_vol + 6, 1); /* Write backup VBR (VBR + 6) */ + memset(buf, 0, ss); + st_dword(buf + FSI_LeadSig, 0x41615252); + st_dword(buf + FSI_StrucSig, 0x61417272); + st_dword(buf + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + st_dword(buf + FSI_Nxt_Free, 2); /* Last allocated cluster# */ + st_word(buf + BS_55AA, 0xAA55); + disk_write(pdrv, buf, b_vol + 7, 1); /* Write backup FSINFO (VBR + 7) */ + disk_write(pdrv, buf, b_vol + 1, 1); /* Write original FSINFO (VBR + 1) */ + } + + /* Initialize FAT area */ + memset(buf, 0, sz_buf * ss); + sect = b_fat; /* FAT start sector */ + for (i = 0; i < n_fat; i++) { /* Initialize FATs each */ + if (fsty == FS_FAT32) { + st_dword(buf + 0, 0xFFFFFFF8); /* FAT[0] */ + st_dword(buf + 4, 0xFFFFFFFF); /* FAT[1] */ + st_dword(buf + 8, 0x0FFFFFFF); /* FAT[2] (root directory) */ + } else { + st_dword(buf + 0, (fsty == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8); /* FAT[0] and FAT[1] */ + } + nsect = sz_fat; /* Number of FAT sectors */ + do { /* Fill FAT sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + memset(buf, 0, ss); /* Rest of FAT all are cleared */ + sect += n; nsect -= n; + } while (nsect); + } + + /* Initialize root directory (fill with zero) */ + nsect = (fsty == FS_FAT32) ? pau : sz_dir; /* Number of root directory sectors */ + do { + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + } + + /* A FAT volume has been created here */ + + /* Determine system ID in the MBR partition table */ + if (FF_FS_EXFAT && fsty == FS_EXFAT) { + sys = 0x07; /* exFAT */ + } else { + if (fsty == FS_FAT32) { + sys = 0x0C; /* FAT32X */ + } else { + if (sz_vol >= 0x10000) { + sys = 0x06; /* FAT12/16 (large) */ + } else { + sys = (fsty == FS_FAT16) ? 0x04 : 0x01; /* FAT16 : FAT12 */ + } + } + } + + /* Update partition information */ + if (FF_MULTI_PARTITION && ipart != 0) { /* Volume is in the existing partition */ + if (!FF_LBA64 || !(fsopt & 0x80)) { + /* Update system ID in the partition table */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Read the MBR */ + buf[MBR_Table + (ipart - 1) * SZ_PTE + PTE_System] = sys; /* Set system ID */ + if (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it back to the MBR */ + } + } else { /* Volume as a new single partition */ + if (!(fsopt & FM_SFD)) { /* Create partition table if not in SFD */ + lba[0] = sz_vol; lba[1] = 0; + fr = create_partition(pdrv, lba, sys, buf); + if (fr != FR_OK) LEAVE_MKFS(fr); + } + } + + if (disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + + LEAVE_MKFS(FR_OK); +} + + + + +#if FF_MULTI_PARTITION +/*-----------------------------------------------------------------------*/ +/* Create Partition Table on the Physical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_fdisk ( + BYTE pdrv, /* Physical drive number */ + const LBA_t ptbl[], /* Pointer to the size table for each partitions */ + void* work /* Pointer to the working buffer (null: use heap memory) */ +) +{ + BYTE *buf = (BYTE*)work; + DSTATUS stat; + + + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; +#if FF_USE_LFN == 3 + if (!buf) buf = ff_memalloc(FF_MAX_SS); /* Use heap memory for working buffer */ +#endif + if (!buf) return FR_NOT_ENOUGH_CORE; + + LEAVE_MKFS(create_partition(pdrv, ptbl, 0x07, buf)); +} + +#endif /* FF_MULTI_PARTITION */ +#endif /* !FF_FS_READONLY && FF_USE_MKFS */ + + + + +#if FF_USE_STRFUNC +#if FF_USE_LFN && FF_LFN_UNICODE && (FF_STRF_ENCODE < 0 || FF_STRF_ENCODE > 3) +#error Wrong FF_STRF_ENCODE setting +#endif +/*-----------------------------------------------------------------------*/ +/* Get a String from the File */ +/*-----------------------------------------------------------------------*/ + +TCHAR* f_gets ( + TCHAR* buff, /* Pointer to the buffer to store read string */ + int len, /* Size of string buffer (items) */ + FIL* fp /* Pointer to the file object */ +) +{ + int nc = 0; + TCHAR *p = buff; + BYTE s[4]; + UINT rc; + DWORD dc; +#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE <= 2 + WCHAR wc; +#endif +#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE == 3 + UINT ct; +#endif + +#if FF_USE_LFN && FF_LFN_UNICODE /* With code conversion (Unicode API) */ + /* Make a room for the character and terminator */ + if (FF_LFN_UNICODE == 1) len -= (FF_STRF_ENCODE == 0) ? 1 : 2; + if (FF_LFN_UNICODE == 2) len -= (FF_STRF_ENCODE == 0) ? 3 : 4; + if (FF_LFN_UNICODE == 3) len -= 1; + while (nc < len) { +#if FF_STRF_ENCODE == 0 /* Read a character in ANSI/OEM */ + f_read(fp, s, 1, &rc); /* Get a code unit */ + if (rc != 1) break; /* EOF? */ + wc = s[0]; + if (dbc_1st((BYTE)wc)) { /* DBC 1st byte? */ + f_read(fp, s, 1, &rc); /* Get 2nd byte */ + if (rc != 1 || !dbc_2nd(s[0])) continue; /* Wrong code? */ + wc = wc << 8 | s[0]; + } + dc = ff_oem2uni(wc, CODEPAGE); /* Convert ANSI/OEM into Unicode */ + if (dc == 0) continue; /* Conversion error? */ +#elif FF_STRF_ENCODE == 1 || FF_STRF_ENCODE == 2 /* Read a character in UTF-16LE/BE */ + f_read(fp, s, 2, &rc); /* Get a code unit */ + if (rc != 2) break; /* EOF? */ + dc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1]; + if (IsSurrogateL(dc)) continue; /* Broken surrogate pair? */ + if (IsSurrogateH(dc)) { /* High surrogate? */ + f_read(fp, s, 2, &rc); /* Get low surrogate */ + if (rc != 2) break; /* EOF? */ + wc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1]; + if (!IsSurrogateL(wc)) continue; /* Broken surrogate pair? */ + dc = ((dc & 0x3FF) + 0x40) << 10 | (wc & 0x3FF); /* Merge surrogate pair */ + } +#else /* Read a character in UTF-8 */ + f_read(fp, s, 1, &rc); /* Get a code unit */ + if (rc != 1) break; /* EOF? */ + dc = s[0]; + if (dc >= 0x80) { /* Multi-byte sequence? */ + ct = 0; + if ((dc & 0xE0) == 0xC0) { dc &= 0x1F; ct = 1; } /* 2-byte sequence? */ + if ((dc & 0xF0) == 0xE0) { dc &= 0x0F; ct = 2; } /* 3-byte sequence? */ + if ((dc & 0xF8) == 0xF0) { dc &= 0x07; ct = 3; } /* 4-byte sequence? */ + if (ct == 0) continue; + f_read(fp, s, ct, &rc); /* Get trailing bytes */ + if (rc != ct) break; + rc = 0; + do { /* Merge the byte sequence */ + if ((s[rc] & 0xC0) != 0x80) break; + dc = dc << 6 | (s[rc] & 0x3F); + } while (++rc < ct); + if (rc != ct || dc < 0x80 || IsSurrogate(dc) || dc >= 0x110000) continue; /* Wrong encoding? */ + } +#endif + /* A code point is avaialble in dc to be output */ + + if (FF_USE_STRFUNC == 2 && dc == '\r') continue; /* Strip \r off if needed */ +#if FF_LFN_UNICODE == 1 || FF_LFN_UNICODE == 3 /* Output it in UTF-16/32 encoding */ + if (FF_LFN_UNICODE == 1 && dc >= 0x10000) { /* Out of BMP at UTF-16? */ + *p++ = (TCHAR)(0xD800 | ((dc >> 10) - 0x40)); nc++; /* Make and output high surrogate */ + dc = 0xDC00 | (dc & 0x3FF); /* Make low surrogate */ + } + *p++ = (TCHAR)dc; nc++; + if (dc == '\n') break; /* End of line? */ +#elif FF_LFN_UNICODE == 2 /* Output it in UTF-8 encoding */ + if (dc < 0x80) { /* Single byte? */ + *p++ = (TCHAR)dc; + nc++; + if (dc == '\n') break; /* End of line? */ + } else { + if (dc < 0x800) { /* 2-byte sequence? */ + *p++ = (TCHAR)(0xC0 | (dc >> 6 & 0x1F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 2; + } else { + if (dc < 0x10000) { /* 3-byte sequence? */ + *p++ = (TCHAR)(0xE0 | (dc >> 12 & 0x0F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 3; + } else { /* 4-byte sequence? */ + *p++ = (TCHAR)(0xF0 | (dc >> 18 & 0x07)); + *p++ = (TCHAR)(0x80 | (dc >> 12 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 4; + } + } + } +#endif + } + +#else /* Byte-by-byte read without any conversion (ANSI/OEM API) */ + len -= 1; /* Make a room for the terminator */ + while (nc < len) { + f_read(fp, s, 1, &rc); /* Get a byte */ + if (rc != 1) break; /* EOF? */ + dc = s[0]; + if (FF_USE_STRFUNC == 2 && dc == '\r') continue; + *p++ = (TCHAR)dc; nc++; + if (dc == '\n') break; + } +#endif + + *p = 0; /* Terminate the string */ + return nc ? buff : 0; /* When no data read due to EOF or error, return with error. */ +} + + + + +#if !FF_FS_READONLY +#include +#define SZ_PUTC_BUF 64 +#define SZ_NUM_BUF 32 + +/*-----------------------------------------------------------------------*/ +/* Put a Character to the File (with sub-functions) */ +/*-----------------------------------------------------------------------*/ + +/* Output buffer and work area */ + +typedef struct { + FIL *fp; /* Ptr to the writing file */ + int idx, nchr; /* Write index of buf[] (-1:error), number of encoding units written */ +#if FF_USE_LFN && FF_LFN_UNICODE == 1 + WCHAR hs; +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 + BYTE bs[4]; + UINT wi, ct; +#endif + BYTE buf[SZ_PUTC_BUF]; /* Write buffer */ +} putbuff; + + +/* Buffered file write with code conversion */ + +static void putc_bfd (putbuff* pb, TCHAR c) +{ + UINT n; + int i, nc; +#if FF_USE_LFN && FF_LFN_UNICODE + WCHAR hs, wc; +#if FF_LFN_UNICODE == 2 + DWORD dc; + const TCHAR *tp; +#endif +#endif + + if (FF_USE_STRFUNC == 2 && c == '\n') { /* LF -> CRLF conversion */ + putc_bfd(pb, '\r'); + } + + i = pb->idx; /* Write index of pb->buf[] */ + if (i < 0) return; /* In write error? */ + nc = pb->nchr; /* Write unit counter */ + +#if FF_USE_LFN && FF_LFN_UNICODE +#if FF_LFN_UNICODE == 1 /* UTF-16 input */ + if (IsSurrogateH(c)) { /* High surrogate? */ + pb->hs = c; return; /* Save it for next */ + } + hs = pb->hs; pb->hs = 0; + if (hs != 0) { /* There is a leading high surrogate */ + if (!IsSurrogateL(c)) hs = 0; /* Discard high surrogate if not a surrogate pair */ + } else { + if (IsSurrogateL(c)) return; /* Discard stray low surrogate */ + } + wc = c; +#elif FF_LFN_UNICODE == 2 /* UTF-8 input */ + for (;;) { + if (pb->ct == 0) { /* Out of multi-byte sequence? */ + pb->bs[pb->wi = 0] = (BYTE)c; /* Save 1st byte */ + if ((BYTE)c < 0x80) break; /* Single byte? */ + if (((BYTE)c & 0xE0) == 0xC0) pb->ct = 1; /* 2-byte sequence? */ + if (((BYTE)c & 0xF0) == 0xE0) pb->ct = 2; /* 3-byte sequence? */ + if (((BYTE)c & 0xF1) == 0xF0) pb->ct = 3; /* 4-byte sequence? */ + return; + } else { /* In the multi-byte sequence */ + if (((BYTE)c & 0xC0) != 0x80) { /* Broken sequence? */ + pb->ct = 0; continue; + } + pb->bs[++pb->wi] = (BYTE)c; /* Save the trailing byte */ + if (--pb->ct == 0) break; /* End of multi-byte sequence? */ + return; + } + } + tp = (const TCHAR*)pb->bs; + dc = tchar2uni(&tp); /* UTF-8 ==> UTF-16 */ + if (dc == 0xFFFFFFFF) return; /* Wrong code? */ + wc = (WCHAR)dc; + hs = (WCHAR)(dc >> 16); +#elif FF_LFN_UNICODE == 3 /* UTF-32 input */ + if (IsSurrogate(c) || c >= 0x110000) return; /* Discard invalid code */ + if (c >= 0x10000) { /* Out of BMP? */ + hs = (WCHAR)(0xD800 | ((c >> 10) - 0x40)); /* Make high surrogate */ + wc = 0xDC00 | (c & 0x3FF); /* Make low surrogate */ + } else { + hs = 0; + wc = (WCHAR)c; + } +#endif + /* A code point in UTF-16 is available in hs and wc */ + +#if FF_STRF_ENCODE == 1 /* Write a code point in UTF-16LE */ + if (hs != 0) { /* Surrogate pair? */ + st_word(&pb->buf[i], hs); + i += 2; + nc++; + } + st_word(&pb->buf[i], wc); + i += 2; +#elif FF_STRF_ENCODE == 2 /* Write a code point in UTF-16BE */ + if (hs != 0) { /* Surrogate pair? */ + pb->buf[i++] = (BYTE)(hs >> 8); + pb->buf[i++] = (BYTE)hs; + nc++; + } + pb->buf[i++] = (BYTE)(wc >> 8); + pb->buf[i++] = (BYTE)wc; +#elif FF_STRF_ENCODE == 3 /* Write a code point in UTF-8 */ + if (hs != 0) { /* 4-byte sequence? */ + nc += 3; + hs = (hs & 0x3FF) + 0x40; + pb->buf[i++] = (BYTE)(0xF0 | hs >> 8); + pb->buf[i++] = (BYTE)(0x80 | (hs >> 2 & 0x3F)); + pb->buf[i++] = (BYTE)(0x80 | (hs & 3) << 4 | (wc >> 6 & 0x0F)); + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } else { + if (wc < 0x80) { /* Single byte? */ + pb->buf[i++] = (BYTE)wc; + } else { + if (wc < 0x800) { /* 2-byte sequence? */ + nc += 1; + pb->buf[i++] = (BYTE)(0xC0 | wc >> 6); + } else { /* 3-byte sequence */ + nc += 2; + pb->buf[i++] = (BYTE)(0xE0 | wc >> 12); + pb->buf[i++] = (BYTE)(0x80 | (wc >> 6 & 0x3F)); + } + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } + } +#else /* Write a code point in ANSI/OEM */ + if (hs != 0) return; + wc = ff_uni2oem(wc, CODEPAGE); /* UTF-16 ==> ANSI/OEM */ + if (wc == 0) return; + if (wc >= 0x100) { + pb->buf[i++] = (BYTE)(wc >> 8); nc++; + } + pb->buf[i++] = (BYTE)wc; +#endif + +#else /* ANSI/OEM input (without re-encoding) */ + pb->buf[i++] = (BYTE)c; +#endif + + if (i >= (int)(sizeof pb->buf) - 4) { /* Write buffered characters to the file */ + f_write(pb->fp, pb->buf, (UINT)i, &n); + i = (n == (UINT)i) ? 0 : -1; + } + pb->idx = i; + pb->nchr = nc + 1; +} + + +/* Flush remaining characters in the buffer */ + +static int putc_flush (putbuff* pb) +{ + UINT nw; + + if ( pb->idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb->fp, pb->buf, (UINT)pb->idx, &nw) == FR_OK + && (UINT)pb->idx == nw) return pb->nchr; + return -1; +} + + +/* Initialize write buffer */ + +static void putc_init (putbuff* pb, FIL* fp) +{ + memset(pb, 0, sizeof (putbuff)); + pb->fp = fp; +} + + + +int f_putc ( + TCHAR c, /* A character to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + putc_bfd(&pb, c); /* Put the character */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a String to the File */ +/*-----------------------------------------------------------------------*/ + +int f_puts ( + const TCHAR* str, /* Pointer to the string to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + while (*str) putc_bfd(&pb, *str++); /* Put the string */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a Formatted String to the File (with sub-functions) */ +/*-----------------------------------------------------------------------*/ +#if FF_PRINT_FLOAT && FF_INTDEF == 2 +#include + +static int ilog10 (double n) /* Calculate log10(n) in integer output */ +{ + int rv = 0; + + while (n >= 10) { /* Decimate digit in right shift */ + if (n >= 100000) { + n /= 100000; rv += 5; + } else { + n /= 10; rv++; + } + } + while (n < 1) { /* Decimate digit in left shift */ + if (n < 0.00001) { + n *= 100000; rv -= 5; + } else { + n *= 10; rv--; + } + } + return rv; +} + + +static double i10x (int n) /* Calculate 10^n in integer input */ +{ + double rv = 1; + + while (n > 0) { /* Left shift */ + if (n >= 5) { + rv *= 100000; n -= 5; + } else { + rv *= 10; n--; + } + } + while (n < 0) { /* Right shift */ + if (n <= -5) { + rv /= 100000; n += 5; + } else { + rv /= 10; n++; + } + } + return rv; +} + + +static void ftoa ( + char* buf, /* Buffer to output the floating point string */ + double val, /* Value to output */ + int prec, /* Number of fractional digits */ + TCHAR fmt /* Notation */ +) +{ + int d; + int e = 0, m = 0; + char sign = 0; + double w; + const char *er = 0; + const char ds = FF_PRINT_FLOAT == 2 ? ',' : '.'; + + + if (isnan(val)) { /* Not a number? */ + er = "NaN"; + } else { + if (prec < 0) prec = 6; /* Default precision? (6 fractional digits) */ + if (val < 0) { /* Nagative? */ + val = 0 - val; sign = '-'; + } else { + sign = '+'; + } + if (isinf(val)) { /* Infinite? */ + er = "INF"; + } else { + if (fmt == 'f') { /* Decimal notation? */ + val += i10x(0 - prec) / 2; /* Round (nearest) */ + m = ilog10(val); + if (m < 0) m = 0; + if (m + prec + 3 >= SZ_NUM_BUF) er = "OV"; /* Buffer overflow? */ + } else { /* E notation */ + if (val != 0) { /* Not a true zero? */ + val += i10x(ilog10(val) - prec) / 2; /* Round (nearest) */ + e = ilog10(val); + if (e > 99 || prec + 7 >= SZ_NUM_BUF) { /* Buffer overflow or E > +99? */ + er = "OV"; + } else { + if (e < -99) e = -99; + val /= i10x(e); /* Normalize */ + } + } + } + } + if (!er) { /* Not error condition */ + if (sign == '-') *buf++ = sign; /* Add a - if negative value */ + do { /* Put decimal number */ + if (m == -1) *buf++ = ds; /* Insert a decimal separator when get into fractional part */ + w = i10x(m); /* Snip the highest digit d */ + d = (int)(val / w); val -= d * w; + *buf++ = (char)('0' + d); /* Put the digit */ + } while (--m >= -prec); /* Output all digits specified by prec */ + if (fmt != 'f') { /* Put exponent if needed */ + *buf++ = (char)fmt; + if (e < 0) { + e = 0 - e; *buf++ = '-'; + } else { + *buf++ = '+'; + } + *buf++ = (char)('0' + e / 10); + *buf++ = (char)('0' + e % 10); + } + } + } + if (er) { /* Error condition */ + if (sign) *buf++ = sign; /* Add sign if needed */ + do *buf++ = *er++; while (*er); /* Put error symbol */ + } + *buf = 0; /* Term */ +} +#endif /* FF_PRINT_FLOAT && FF_INTDEF == 2 */ + + + +int f_printf ( + FIL* fp, /* Pointer to the file object */ + const TCHAR* fmt, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + putbuff pb; + UINT i, j, w, f, r; + int prec; +#if FF_PRINT_LLI && FF_INTDEF == 2 + QWORD v; +#else + DWORD v; +#endif + TCHAR tc, pad, *tp; + TCHAR nul = 0; + char d, str[SZ_NUM_BUF]; + + + putc_init(&pb, fp); + + va_start(arp, fmt); + + for (;;) { + tc = *fmt++; + if (tc == 0) break; /* End of format string */ + if (tc != '%') { /* Not an escape character (pass-through) */ + putc_bfd(&pb, tc); + continue; + } + f = w = 0; pad = ' '; prec = -1; /* Initialize parms */ + tc = *fmt++; + if (tc == '0') { /* Flag: '0' padded */ + pad = '0'; tc = *fmt++; + } else if (tc == '-') { /* Flag: Left aligned */ + f = 2; tc = *fmt++; + } + if (tc == '*') { /* Minimum width from an argument */ + w = va_arg(arp, int); + tc = *fmt++; + } else { + while (IsDigit(tc)) { /* Minimum width */ + w = w * 10 + tc - '0'; + tc = *fmt++; + } + } + if (tc == '.') { /* Precision */ + tc = *fmt++; + if (tc == '*') { /* Precision from an argument */ + prec = va_arg(arp, int); + tc = *fmt++; + } else { + prec = 0; + while (IsDigit(tc)) { /* Precision */ + prec = prec * 10 + tc - '0'; + tc = *fmt++; + } + } + } + if (tc == 'l') { /* Size: long int */ + f |= 4; tc = *fmt++; +#if FF_PRINT_LLI && FF_INTDEF == 2 + if (tc == 'l') { /* Size: long long int */ + f |= 8; tc = *fmt++; + } +#endif + } + if (tc == 0) break; /* End of format string */ + switch (tc) { /* Atgument type is... */ + case 'b': /* Unsigned binary */ + r = 2; break; + case 'o': /* Unsigned octal */ + r = 8; break; + case 'd': /* Signed decimal */ + case 'u': /* Unsigned decimal */ + r = 10; break; + case 'x': /* Unsigned hexdecimal (lower case) */ + case 'X': /* Unsigned hexdecimal (upper case) */ + r = 16; break; + case 'c': /* Character */ + putc_bfd(&pb, (TCHAR)va_arg(arp, int)); + continue; + case 's': /* String */ + tp = va_arg(arp, TCHAR*); /* Get a pointer argument */ + if (!tp) tp = &nul; /* Null ptr generates a null string */ + for (j = 0; tp[j]; j++) ; /* j = tcslen(tp) */ + if (prec >= 0 && j > (UINT)prec) j = prec; /* Limited length of string body */ + for ( ; !(f & 2) && j < w; j++) putc_bfd(&pb, pad); /* Left pads */ + while (*tp && prec--) putc_bfd(&pb, *tp++); /* Body */ + while (j++ < w) putc_bfd(&pb, ' '); /* Right pads */ + continue; +#if FF_PRINT_FLOAT && FF_INTDEF == 2 + case 'f': /* Floating point (decimal) */ + case 'e': /* Floating point (e) */ + case 'E': /* Floating point (E) */ + ftoa(str, va_arg(arp, double), prec, tc); /* Make a flaoting point string */ + for (j = strlen(str); !(f & 2) && j < w; j++) putc_bfd(&pb, pad); /* Left pads */ + for (i = 0; str[i]; putc_bfd(&pb, str[i++])) ; /* Body */ + while (j++ < w) putc_bfd(&pb, ' '); /* Right pads */ + continue; +#endif + default: /* Unknown type (pass-through) */ + putc_bfd(&pb, tc); continue; + } + + /* Get an integer argument and put it in numeral */ +#if FF_PRINT_LLI && FF_INTDEF == 2 + if (f & 8) { /* long long argument? */ + v = (QWORD)va_arg(arp, LONGLONG); + } else { + if (f & 4) { /* long argument? */ + v = (tc == 'd') ? (QWORD)(LONGLONG)va_arg(arp, long) : (QWORD)va_arg(arp, unsigned long); + } else { /* int/short/char argument */ + v = (tc == 'd') ? (QWORD)(LONGLONG)va_arg(arp, int) : (QWORD)va_arg(arp, unsigned int); + } + } + if (tc == 'd' && (v & 0x8000000000000000)) { /* Negative value? */ + v = 0 - v; f |= 1; + } +#else + if (f & 4) { /* long argument? */ + v = (DWORD)va_arg(arp, long); + } else { /* int/short/char argument */ + v = (tc == 'd') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int); + } + if (tc == 'd' && (v & 0x80000000)) { /* Negative value? */ + v = 0 - v; f |= 1; + } +#endif + i = 0; + do { /* Make an integer number string */ + d = (char)(v % r); v /= r; + if (d > 9) d += (tc == 'x') ? 0x27 : 0x07; + str[i++] = d + '0'; + } while (v && i < SZ_NUM_BUF); + if (f & 1) str[i++] = '-'; /* Sign */ + /* Write it */ + for (j = i; !(f & 2) && j < w; j++) putc_bfd(&pb, pad); /* Left pads */ + do putc_bfd(&pb, (TCHAR)str[--i]); while (i); /* Body */ + while (j++ < w) putc_bfd(&pb, ' '); /* Right pads */ + } + + va_end(arp); + + return putc_flush(&pb); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_STRFUNC */ + + + +#if FF_CODE_PAGE == 0 +/*-----------------------------------------------------------------------*/ +/* Set Active Codepage for the Path Name */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setcp ( + WORD cp /* Value to be set as active code page */ +) +{ + static const WORD validcp[22] = { 437, 720, 737, 771, 775, 850, 852, 855, 857, 860, 861, 862, 863, 864, 865, 866, 869, 932, 936, 949, 950, 0}; + static const BYTE* const tables[22] = {Ct437, Ct720, Ct737, Ct771, Ct775, Ct850, Ct852, Ct855, Ct857, Ct860, Ct861, Ct862, Ct863, Ct864, Ct865, Ct866, Ct869, Dc932, Dc936, Dc949, Dc950, 0}; + UINT i; + + + for (i = 0; validcp[i] != 0 && validcp[i] != cp; i++) ; /* Find the code page */ + if (validcp[i] != cp) return FR_INVALID_PARAMETER; /* Not found? */ + + CodePage = cp; + if (cp >= 900) { /* DBCS */ + ExCvt = 0; + DbcTbl = tables[i]; + } else { /* SBCS */ + ExCvt = tables[i]; + DbcTbl = 0; + } + return FR_OK; +} +#endif /* FF_CODE_PAGE == 0 */ + diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/ff.h b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ff.h new file mode 100644 index 000000000..486657637 --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ff.h @@ -0,0 +1,422 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem module R0.14b / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2021, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: + +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + + +#ifndef FF_DEFINED +#define FF_DEFINED 86631 /* Revision ID */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ffconf.h" /* FatFs configuration options */ + +#if FF_DEFINED != FFCONF_DEF +#error Wrong configuration file (ffconf.h). +#endif + + +/* Integer types used for FatFs API */ + +#if defined(_WIN32) /* Windows VC++ (for development only) */ +#define FF_INTDEF 2 +#include +typedef unsigned __int64 QWORD; +#include +#define isnan(v) _isnan(v) +#define isinf(v) (!_finite(v)) + +#elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) /* C99 or later */ +#define FF_INTDEF 2 +#include +typedef unsigned int UINT; /* int must be 16-bit or 32-bit */ +typedef unsigned char BYTE; /* char must be 8-bit */ +typedef uint16_t WORD; /* 16-bit unsigned integer */ +typedef uint32_t DWORD; /* 32-bit unsigned integer */ +typedef uint64_t QWORD; /* 64-bit unsigned integer */ +typedef WORD WCHAR; /* UTF-16 character type */ + +#else /* Earlier than C99 */ +#define FF_INTDEF 1 +typedef unsigned int UINT; /* int must be 16-bit or 32-bit */ +typedef unsigned char BYTE; /* char must be 8-bit */ +typedef unsigned short WORD; /* 16-bit unsigned integer */ +typedef unsigned long DWORD; /* 32-bit unsigned integer */ +typedef WORD WCHAR; /* UTF-16 character type */ +#endif + + +/* Type of file size and LBA variables */ + +#if FF_FS_EXFAT +#if FF_INTDEF != 2 +#error exFAT feature wants C99 or later +#endif +typedef QWORD FSIZE_t; +#if FF_LBA64 +typedef QWORD LBA_t; +#else +typedef DWORD LBA_t; +#endif +#else +#if FF_LBA64 +#error exFAT needs to be enabled when enable 64-bit LBA +#endif +typedef DWORD FSIZE_t; +typedef DWORD LBA_t; +#endif + + + +/* Type of path name strings on FatFs API (TCHAR) */ + +#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */ +typedef WCHAR TCHAR; +#define _T(x) L ## x +#define _TEXT(x) L ## x +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */ +typedef char TCHAR; +#define _T(x) u8 ## x +#define _TEXT(x) u8 ## x +#elif FF_USE_LFN && FF_LFN_UNICODE == 3 /* Unicode in UTF-32 encoding */ +typedef DWORD TCHAR; +#define _T(x) U ## x +#define _TEXT(x) U ## x +#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3) +#error Wrong FF_LFN_UNICODE setting +#else /* ANSI/OEM code in SBCS/DBCS */ +typedef char TCHAR; +#define _T(x) x +#define _TEXT(x) x +#endif + + + +/* Definitions of volume management */ + +#if FF_MULTI_PARTITION /* Multiple partition configuration */ +typedef struct { + BYTE pd; /* Physical drive number */ + BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ +} PARTITION; +extern PARTITION VolToPart[]; /* Volume - Partition mapping table */ +#endif + +#if FF_STR_VOLUME_ID +#ifndef FF_VOLUME_STRS +extern const char* VolumeStr[FF_VOLUMES]; /* User defied volume ID */ +#endif +#endif + + + +/* Filesystem object structure (FATFS) */ + +typedef struct { + BYTE fs_type; /* Filesystem type (0:not mounted) */ + BYTE pdrv; /* Associated physical drive */ + BYTE n_fats; /* Number of FATs (1 or 2) */ + BYTE wflag; /* win[] flag (b0:dirty) */ + BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */ + WORD id; /* Volume mount ID */ + WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ + WORD csize; /* Cluster size [sectors] */ +#if FF_MAX_SS != FF_MIN_SS + WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */ +#endif +#if FF_USE_LFN + WCHAR* lfnbuf; /* LFN working buffer */ +#endif +#if FF_FS_EXFAT + BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */ +#endif +#if FF_FS_REENTRANT + FF_SYNC_t sobj; /* Identifier of sync object */ +#endif +#if !FF_FS_READONLY + DWORD last_clst; /* Last allocated cluster */ + DWORD free_clst; /* Number of free clusters */ +#endif +#if FF_FS_RPATH + DWORD cdir; /* Current directory start cluster (0:root) */ +#if FF_FS_EXFAT + DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */ + DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */ + DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */ +#endif +#endif + DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */ + DWORD fsize; /* Size of an FAT [sectors] */ + LBA_t volbase; /* Volume base sector */ + LBA_t fatbase; /* FAT base sector */ + LBA_t dirbase; /* Root directory base sector/cluster */ + LBA_t database; /* Data base sector */ +#if FF_FS_EXFAT + LBA_t bitbase; /* Allocation bitmap base sector */ +#endif + LBA_t winsect; /* Current sector appearing in the win[] */ + BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */ +} FATFS; + + + +/* Object ID and allocation information (FFOBJID) */ + +typedef struct { + FATFS* fs; /* Pointer to the hosting volume of this object */ + WORD id; /* Hosting volume mount ID */ + BYTE attr; /* Object attribute */ + BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:fragmented in this session, b2:sub-directory stretched) */ + DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */ + FSIZE_t objsize; /* Object size (valid when sclust != 0) */ +#if FF_FS_EXFAT + DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */ + DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */ + DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */ + DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */ + DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */ +#endif +#if FF_FS_LOCK + UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */ +#endif +} FFOBJID; + + + +/* File object structure (FIL) */ + +typedef struct { + FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */ + BYTE flag; /* File status flags */ + BYTE err; /* Abort flag (error code) */ + FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */ + DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */ + LBA_t sect; /* Sector number appearing in buf[] (0:invalid) */ +#if !FF_FS_READONLY + LBA_t dir_sect; /* Sector number containing the directory entry (not used at exFAT) */ + BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */ +#endif +#if FF_USE_FASTSEEK + DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */ +#endif +#if !FF_FS_TINY + BYTE buf[FF_MAX_SS]; /* File private data read/write window */ +#endif +} FIL; + + + +/* Directory object structure (DIR) */ + +typedef struct { + FFOBJID obj; /* Object identifier */ + DWORD dptr; /* Current read/write offset */ + DWORD clust; /* Current cluster */ + LBA_t sect; /* Current sector (0:Read operation has terminated) */ + BYTE* dir; /* Pointer to the directory item in the win[] */ + BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */ +#if FF_USE_LFN + DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */ +#endif +#if FF_USE_FIND + const TCHAR* pat; /* Pointer to the name matching pattern */ +#endif +} DIR; + + + +/* File information structure (FILINFO) */ + +typedef struct { + FSIZE_t fsize; /* File size */ + WORD fdate; /* Modified date */ + WORD ftime; /* Modified time */ + BYTE fattrib; /* File attribute */ +#if FF_USE_LFN + TCHAR altname[FF_SFN_BUF + 1];/* Altenative file name */ + TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */ +#else + TCHAR fname[12 + 1]; /* File name */ +#endif +} FILINFO; + + + +/* Format parameter structure (MKFS_PARM) */ + +typedef struct { + BYTE fmt; /* Format option (FM_FAT, FM_FAT32, FM_EXFAT and FM_SFD) */ + BYTE n_fat; /* Number of FATs */ + UINT align; /* Data area alignment (sector) */ + UINT n_root; /* Number of root directory entries */ + DWORD au_size; /* Cluster size (byte) */ +} MKFS_PARM; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* (0) Succeeded */ + FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ + FR_INT_ERR, /* (2) Assertion failed */ + FR_NOT_READY, /* (3) The physical drive cannot work */ + FR_NO_FILE, /* (4) Could not find the file */ + FR_NO_PATH, /* (5) Could not find the path */ + FR_INVALID_NAME, /* (6) The path name format is invalid */ + FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ + FR_EXIST, /* (8) Access denied due to prohibited access */ + FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ + FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ + FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ + FR_NOT_ENABLED, /* (12) The volume has no work area */ + FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ + FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ + FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ + FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ + FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ + FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ + FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */ +FRESULT f_close (FIL* fp); /* Close an open file object */ +FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */ +FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */ +FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */ +FRESULT f_truncate (FIL* fp); /* Truncate the file */ +FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */ +FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */ +FRESULT f_closedir (DIR* dp); /* Close an open directory */ +FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */ +FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ +FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */ +FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ +FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ +FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ +FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ +FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */ +FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */ +FRESULT f_chdir (const TCHAR* path); /* Change current directory */ +FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ +FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ +FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */ +FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */ +FRESULT f_setlabel (const TCHAR* label); /* Set volume label */ +FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */ +FRESULT f_expand (FIL* fp, FSIZE_t fsz, BYTE opt); /* Allocate a contiguous block to the file */ +FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ +FRESULT f_mkfs (const TCHAR* path, const MKFS_PARM* opt, void* work, UINT len); /* Create a FAT volume */ +FRESULT f_fdisk (BYTE pdrv, const LBA_t ptbl[], void* work); /* Divide a physical drive into some partitions */ +FRESULT f_setcp (WORD cp); /* Set current code page */ +int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */ +int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */ +int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */ +TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */ + +#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize)) +#define f_error(fp) ((fp)->err) +#define f_tell(fp) ((fp)->fptr) +#define f_size(fp) ((fp)->obj.objsize) +#define f_rewind(fp) f_lseek((fp), 0) +#define f_rewinddir(dp) f_readdir((dp), 0) +#define f_rmdir(path) f_unlink(path) +#define f_unmount(path) f_mount(0, path, 0) + + + + +/*--------------------------------------------------------------*/ +/* Additional user defined functions */ + +/* RTC function */ +#if !FF_FS_READONLY && !FF_FS_NORTC +DWORD get_fattime (void); +#endif + +/* LFN support functions */ +#if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */ +WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */ +WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */ +DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */ +#endif +#if FF_USE_LFN == 3 /* Dynamic memory allocation */ +void* ff_memalloc (UINT msize); /* Allocate memory block */ +void ff_memfree (void* mblock); /* Free memory block */ +#endif + +/* Sync functions */ +#if FF_FS_REENTRANT +int ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj); /* Create a sync object */ +int ff_req_grant (FF_SYNC_t sobj); /* Lock sync object */ +void ff_rel_grant (FF_SYNC_t sobj); /* Unlock sync object */ +int ff_del_syncobj (FF_SYNC_t sobj); /* Delete a sync object */ +#endif + + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access mode and open method flags (3rd argument of f_open) */ +#define FA_READ 0x01 +#define FA_WRITE 0x02 +#define FA_OPEN_EXISTING 0x00 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA_OPEN_APPEND 0x30 + +/* Fast seek controls (2nd argument of f_lseek) */ +#define CREATE_LINKMAP ((FSIZE_t)0 - 1) + +/* Format options (2nd argument of f_mkfs) */ +#define FM_FAT 0x01 +#define FM_FAT32 0x02 +#define FM_EXFAT 0x04 +#define FM_ANY 0x07 +#define FM_SFD 0x08 + +/* Filesystem type (FATFS.fs_type) */ +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 +#define FS_EXFAT 4 + +/* File attribute bits for directory entry (FILINFO.fattrib) */ +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ + + +#ifdef __cplusplus +} +#endif + +#endif /* FF_DEFINED */ diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/ffconf.h b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ffconf.h new file mode 100644 index 000000000..b150ce6de --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ffconf.h @@ -0,0 +1,301 @@ +/*---------------------------------------------------------------------------/ +/ FatFs Functional Configurations +/---------------------------------------------------------------------------*/ + +#define FFCONF_DEF 86631 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define FF_FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: Basic functions are fully enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() +/ are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define FF_USE_FIND 0 +/* This option switches filtered directory read functions, f_findfirst() and +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ + + +#define FF_USE_MKFS 0 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define FF_USE_FASTSEEK 0 +/* This option switches fast seek function. (0:Disable or 1:Enable) */ + + +#define FF_USE_EXPAND 0 +/* This option switches f_expand function. (0:Disable or 1:Enable) */ + + +#define FF_USE_CHMOD 0 +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). +/ (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */ + + +#define FF_USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define FF_USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) */ + + +#define FF_USE_STRFUNC 0 +#define FF_PRINT_LLI 0 +#define FF_PRINT_FLOAT 0 +#define FF_STRF_ENCODE 0 +/* FF_USE_STRFUNC switches string functions, f_gets(), f_putc(), f_puts() and +/ f_printf(). +/ +/ 0: Disable. FF_PRINT_LLI, FF_PRINT_FLOAT and FF_STRF_ENCODE have no effect. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. +/ +/ FF_PRINT_LLI = 1 makes f_printf() support long long argument and FF_PRINT_FLOAT = 1/2 + makes f_printf() support floating point argument. These features want C99 or later. +/ When FF_LFN_UNICODE >= 1 with LFN enabled, string functions convert the character +/ encoding in it. FF_STRF_ENCODE selects assumption of character encoding ON THE FILE +/ to be read/written via those functions. +/ +/ 0: ANSI/OEM in current CP +/ 1: Unicode in UTF-16LE +/ 2: Unicode in UTF-16BE +/ 3: Unicode in UTF-8 +*/ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define FF_CODE_PAGE 932 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect code page setting can cause a file open failure. +/ +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +/ 0 - Include all code pages above and configured by f_setcp() +*/ + + +#define FF_USE_LFN 0 +#define FF_MAX_LFN 255 +/* The FF_USE_LFN switches the support for LFN (long file name). +/ +/ 0: Disable LFN. FF_MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ To enable the LFN, ffunicode.c needs to be added to the project. The LFN function +/ requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and +/ additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled. +/ The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can +/ be in range of 12 to 255. It is recommended to be set it 255 to fully support LFN +/ specification. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree() exemplified in ffsystem.c, need to be added to the project. */ + + +#define FF_LFN_UNICODE 0 +/* This option switches the character encoding on the API when LFN is enabled. +/ +/ 0: ANSI/OEM in current CP (TCHAR = char) +/ 1: Unicode in UTF-16 (TCHAR = WCHAR) +/ 2: Unicode in UTF-8 (TCHAR = char) +/ 3: Unicode in UTF-32 (TCHAR = DWORD) +/ +/ Also behavior of string I/O functions will be affected by this option. +/ When LFN is not enabled, this option has no effect. */ + + +#define FF_LFN_BUF 255 +#define FF_SFN_BUF 12 +/* This set of options defines size of file name members in the FILINFO structure +/ which is used to read out directory items. These values should be suffcient for +/ the file names to read. The maximum possible length of the read file name depends +/ on character encoding. When LFN is not enabled, these options have no effect. */ + + +#define FF_FS_RPATH 0 +/* This option configures support for relative path. +/ +/ 0: Disable relative path and remove related functions. +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +*/ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define FF_VOLUMES 3 +/* Number of volumes (logical drives) to be used. (1-10) */ + + +#define FF_STR_VOLUME_ID 0 +#define FF_VOLUME_STRS "RAM","SD","USB" +/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings. +/ When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive +/ number in the path name. FF_VOLUME_STRS defines the volume ID strings for each +/ logical drives. Number of items must not be less than FF_VOLUMES. Valid +/ characters for the volume ID strings are A-Z, a-z and 0-9, however, they are +/ compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is +/ not defined, a user defined volume string table needs to be defined as: +/ +/ const char* VolumeStr[FF_VOLUMES] = {"ram","flash","sd","usb",... +*/ + + +#define FF_MULTI_PARTITION 0 +/* This option switches support for multiple volumes on the physical drive. +/ By default (0), each logical drive number is bound to the same physical drive +/ number and only an FAT volume found on the physical drive will be mounted. +/ When this function is enabled (1), each logical drive number can be bound to +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() +/ funciton will be available. */ + + +#define FF_MIN_SS 512 +#define FF_MAX_SS 512 +/* This set of options configures the range of sector size to be supported. (512, +/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and +/ harddisk, but a larger value may be required for on-board flash memory and some +/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured +/ for variable sector size mode and disk_ioctl() function needs to implement +/ GET_SECTOR_SIZE command. */ + + +#define FF_LBA64 0 +/* This option switches support for 64-bit LBA. (0:Disable or 1:Enable) +/ To enable the 64-bit LBA, also exFAT needs to be enabled. (FF_FS_EXFAT == 1) */ + + +#define FF_MIN_GPT 0x10000000 +/* Minimum number of sectors to switch GPT as partitioning format in f_mkfs and +/ f_fdisk function. 0x100000000 max. This option has no effect when FF_LBA64 == 0. */ + + +#define FF_USE_TRIM 0 +/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable) +/ To enable Trim function, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. +/ Instead of private sector buffer eliminated from the file object, common sector +/ buffer in the filesystem object (FATFS) is used for the file data transfer. */ + + +#define FF_FS_EXFAT 0 +/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) +/ To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1) +/ Note that enabling exFAT discards ANSI C (C89) compatibility. */ + + +#define FF_FS_NORTC 1 +#define FF_NORTC_MON 1 +#define FF_NORTC_MDAY 1 +#define FF_NORTC_YEAR 2020 +/* The option FF_FS_NORTC switches timestamp functiton. If the system does not have +/ any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable +/ the timestamp function. Every object modified by FatFs will have a fixed timestamp +/ defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time. +/ To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be +/ added to the project to read current time form real-time clock. FF_NORTC_MON, +/ FF_NORTC_MDAY and FF_NORTC_YEAR have no effect. +/ These options have no effect in read-only configuration (FF_FS_READONLY = 1). */ + + +#define FF_FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + +#define FF_FS_LOCK 0 +/* The option FF_FS_LOCK switches file lock function to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when FF_FS_READONLY +/ is 1. +/ +/ 0: Disable file lock function. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock function. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock control is independent of re-entrancy. */ + + +/* #include // O/S definitions */ +#define FF_FS_REENTRANT 0 +#define FF_FS_TIMEOUT 1000 +#define FF_SYNC_t HANDLE +/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this function. +/ +/ 0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The FF_FS_TIMEOUT defines timeout period in unit of time tick. +/ The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.h. */ + + + +/*--- End of configuration options ---*/ diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/ffsystem.c b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ffsystem.c new file mode 100644 index 000000000..b88ce1555 --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ffsystem.c @@ -0,0 +1,170 @@ +/*------------------------------------------------------------------------*/ +/* Sample Code of OS Dependent Functions for FatFs */ +/* (C)ChaN, 2018 */ +/*------------------------------------------------------------------------*/ + + +#include "ff.h" + + +#if FF_USE_LFN == 3 /* Dynamic memory allocation */ + +/*------------------------------------------------------------------------*/ +/* Allocate a memory block */ +/*------------------------------------------------------------------------*/ + +void* ff_memalloc ( /* Returns pointer to the allocated memory block (null if not enough core) */ + UINT msize /* Number of bytes to allocate */ +) +{ + return malloc(msize); /* Allocate a new memory block with POSIX API */ +} + + +/*------------------------------------------------------------------------*/ +/* Free a memory block */ +/*------------------------------------------------------------------------*/ + +void ff_memfree ( + void* mblock /* Pointer to the memory block to free (nothing to do if null) */ +) +{ + free(mblock); /* Free the memory block with POSIX API */ +} + +#endif + + + +#if FF_FS_REENTRANT /* Mutal exclusion */ + +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to create a new +/ synchronization object for the volume, such as semaphore and mutex. +/ When a 0 is returned, the f_mount() function fails with FR_INT_ERR. +*/ + +//const osMutexDef_t Mutex[FF_VOLUMES]; /* Table of CMSIS-RTOS mutex */ + + +int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create the sync object */ + BYTE vol, /* Corresponding volume (logical drive number) */ + FF_SYNC_t* sobj /* Pointer to return the created sync object */ +) +{ + /* Win32 */ + *sobj = CreateMutex(NULL, FALSE, NULL); + return (int)(*sobj != INVALID_HANDLE_VALUE); + + /* uITRON */ +// T_CSEM csem = {TA_TPRI,1,1}; +// *sobj = acre_sem(&csem); +// return (int)(*sobj > 0); + + /* uC/OS-II */ +// OS_ERR err; +// *sobj = OSMutexCreate(0, &err); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ +// *sobj = xSemaphoreCreateMutex(); +// return (int)(*sobj != NULL); + + /* CMSIS-RTOS */ +// *sobj = osMutexCreate(&Mutex[vol]); +// return (int)(*sobj != NULL); +} + + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to delete a synchronization +/ object that created with ff_cre_syncobj() function. When a 0 is returned, +/ the f_mount() function fails with FR_INT_ERR. +*/ + +int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to an error */ + FF_SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ +) +{ + /* Win32 */ + return (int)CloseHandle(sobj); + + /* uITRON */ +// return (int)(del_sem(sobj) == E_OK); + + /* uC/OS-II */ +// OS_ERR err; +// OSMutexDel(sobj, OS_DEL_ALWAYS, &err); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ +// vSemaphoreDelete(sobj); +// return 1; + + /* CMSIS-RTOS */ +// return (int)(osMutexDelete(sobj) == osOK); +} + + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on entering file functions to lock the volume. +/ When a 0 is returned, the file function fails with FR_TIMEOUT. +*/ + +int ff_req_grant ( /* 1:Got a grant to access the volume, 0:Could not get a grant */ + FF_SYNC_t sobj /* Sync object to wait */ +) +{ + /* Win32 */ + return (int)(WaitForSingleObject(sobj, FF_FS_TIMEOUT) == WAIT_OBJECT_0); + + /* uITRON */ +// return (int)(wai_sem(sobj) == E_OK); + + /* uC/OS-II */ +// OS_ERR err; +// OSMutexPend(sobj, FF_FS_TIMEOUT, &err)); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ +// return (int)(xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE); + + /* CMSIS-RTOS */ +// return (int)(osMutexWait(sobj, FF_FS_TIMEOUT) == osOK); +} + + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on leaving file functions to unlock the volume. +*/ + +void ff_rel_grant ( + FF_SYNC_t sobj /* Sync object to be signaled */ +) +{ + /* Win32 */ + ReleaseMutex(sobj); + + /* uITRON */ +// sig_sem(sobj); + + /* uC/OS-II */ +// OSMutexPost(sobj); + + /* FreeRTOS */ +// xSemaphoreGive(sobj); + + /* CMSIS-RTOS */ +// osMutexRelease(sobj); +} + +#endif + diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/ffunicode.c b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ffunicode.c new file mode 100644 index 000000000..a69b24c83 --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/ffunicode.c @@ -0,0 +1,15593 @@ +/*------------------------------------------------------------------------*/ +/* Unicode handling functions for FatFs R0.13+ */ +/*------------------------------------------------------------------------*/ +/* This module will occupy a huge memory in the .const section when the / +/ FatFs is configured for LFN with DBCS. If the system has any Unicode / +/ utilitiy for the code conversion, this module should be modified to use / +/ that function to avoid silly memory consumption. / +/-------------------------------------------------------------------------*/ +/* +/ Copyright (C) 2014, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +*/ + + +#include "ff.h" + +#if FF_USE_LFN /* This module will be blanked if non-LFN configuration */ + +#define MERGE2(a, b) a ## b +#define CVTBL(tbl, cp) MERGE2(tbl, cp) + + +/*------------------------------------------------------------------------*/ +/* Code Conversion Tables */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE == 932 || FF_CODE_PAGE == 0 /* Japanese */ +static const WCHAR uni2oem932[] = { /* Unicode --> Shift_JIS pairs */ + 0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D, 0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180, + 0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2, 0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6, + 0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA, 0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE, + 0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2, 0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6, + 0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2, 0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6, + 0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA, 0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE, + 0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2, 0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6, + 0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442, 0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447, + 0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B, 0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F, + 0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453, 0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457, + 0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B, 0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F, + 0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472, 0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477, + 0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B, 0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480, + 0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484, 0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488, + 0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C, 0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490, + 0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C, 0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168, + 0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163, 0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6, + 0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0, 0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757, + 0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B, 0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41, + 0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45, 0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49, + 0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB, 0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD, + 0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9, 0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187, + 0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8, 0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7, + 0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6, 0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF, + 0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2, 0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB, + 0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740, 0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744, + 0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748, 0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C, + 0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750, 0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F, + 0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1, 0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4, + 0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5, 0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7, + 0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6, 0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8, + 0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9, 0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1, + 0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5, 0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B, + 0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A, 0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4, + 0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141, 0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159, + 0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173, 0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177, + 0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7, 0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780, + 0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1, 0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5, + 0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9, 0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD, + 0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1, 0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5, + 0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9, 0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD, + 0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1, 0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5, + 0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9, 0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD, + 0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1, 0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5, + 0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9, 0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD, + 0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1, 0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5, + 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, + 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, 0x309E, 0x8155, + 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, 0x8347, + 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B, 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F, + 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353, 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357, + 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, 0x30C0, 0x835F, + 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, 0x30C8, 0x8367, + 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F, + 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373, 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377, + 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380, + 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, 0x30E8, 0x8388, + 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, 0x8390, + 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394, 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B, + 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B, 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787, + 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, 0x3323, 0x876B, + 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, 0x334D, 0x8762, + 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773, + 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775, 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A, + 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E, + 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, 0x4E19, 0x95B8, + 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, 0x8BF8, + 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5, 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454, + 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6, + 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, 0x4E73, 0x93FB, + 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, 0x4E8A, 0x98AD, + 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A, + 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1, 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4, + 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA, + 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, 0x4EC4, 0x98BA, + 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, 0x8E65, + 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574, 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0, + 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8, 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287, + 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, 0x4F09, 0x98C2, + 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, 0x4F1C, 0x98E5, + 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66, + 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241, 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A, + 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3, + 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, 0x4F73, 0x89C0, + 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, 0x98CA, + 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB, 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3, + 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699, + 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, 0x4FC4, 0x89E2, + 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, 0x4FD7, 0x91AD, + 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD, + 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F, 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4, + 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5, + 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, 0x501F, 0x8ED8, + 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, 0x98E8, + 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860, 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A, + 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3, 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1, + 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, 0x5074, 0x91A4, + 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, 0x5091, 0x8C86, + 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942, + 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58, 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941, + 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945, + 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, 0x50F9, 0x994A, + 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, 0x9951, + 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952, 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7, + 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956, 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3, + 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, 0x514B, 0x8D8E, + 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, 0x515C, 0x8A95, + 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6, + 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA, 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93, + 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4, + 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, 0x5197, 0x8FE7, + 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, 0x9579, + 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E, 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972, + 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2, 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978, + 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, 0x51DC, 0xEAA3, + 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, 0x51EC, 0xFA83, + 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F, + 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E, 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0, + 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89, + 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, 0x5233, 0x998A, + 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, 0x998D, + 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F, 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655, + 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC, 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B, + 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, 0x527F, 0x9996, + 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, 0x5294, 0x9999, + 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377, + 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77, 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8, + 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7, + 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, 0x52DD, 0x8F9F, + 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, 0x8AA9, + 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE, 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC, + 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF, 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3, + 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, 0x531D, 0x9178, + 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, 0x5333, 0x99BB, + 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7, + 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF, 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA, + 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4, + 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, 0x5372, 0xFA8C, + 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, 0x99CA, + 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0, 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE, + 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D, 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5, + 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, 0x53CB, 0x9746, + 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, 0x53DB, 0x94BE, + 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9, + 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2, 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4, + 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC, + 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, 0x540D, 0x96BC, + 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, 0x9669, + 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF, 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A, + 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD, 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0, + 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, 0x546A, 0x8EF4, + 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, 0x547C, 0x8CC4, + 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9, + 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91, 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC, + 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44, + 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, 0x54C8, 0x99FB, + 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, 0x9689, + 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D, 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4, + 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49, 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5, + 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, 0x5546, 0x8FA4, + 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, 0x5563, 0x9A51, + 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68, + 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62, 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85, + 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA, + 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, 0x55DA, 0x9A6A, + 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, 0x9A74, + 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73, 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC, + 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B, 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158, + 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, 0x566C, 0x9A83, + 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, 0x568F, 0x9A8A, + 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90, + 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92, 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97, + 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99, + 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, 0x5700, 0x9A9B, + 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, 0x8980, + 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6, 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD, + 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9, 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF, + 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, 0x5764, 0x8DA3, + 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, 0x5789, 0x9AB3, + 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98, + 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA, 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684, + 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575, + 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, 0x5802, 0x93B0, + 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, 0x9AC6, + 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981, 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4, + 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2, 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383, + 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, 0x586B, 0x9355, + 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, 0x5893, 0x95E6, + 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E, + 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2, 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7, + 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC, + 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, 0x58EC, 0x9070, + 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, 0x9AE2, + 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7, 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4, + 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7, 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9, + 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, 0x592D, 0x9AEE, + 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, 0x5947, 0x8AEF, + 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A, + 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6, 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8, + 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1, + 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, 0x5984, 0x96CF, + 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, 0x9B45, + 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369, 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8, + 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E, 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF, + 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, 0x59EB, 0x9550, + 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, 0x5A18, 0x96BA, + 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56, + 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B, 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58, + 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B, + 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, 0x5AD0, 0x9B6B, + 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, 0x9B66, + 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69, 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964, + 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71, 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72, + 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, 0x5B5C, 0x8E79, + 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, 0x5B6B, 0x91B7, + 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80, + 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0, 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47, + 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3, + 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, 0x5BB0, 0x8DC9, + 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, 0xFAA7, + 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0, 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578, + 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B, + 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, 0x5BE8, 0x9ECB, + 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, 0x5BF6, 0x9B8F, + 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91, + 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1, 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1, + 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97, + 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, 0x5C3B, 0x904B, + 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, 0x9B9C, + 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72, 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB, + 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A, 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2, + 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, 0x5C91, 0x9BA8, + 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, 0x5CB1, 0x91D0, + 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1, + 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB, 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9, + 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5, + 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, 0x5D17, 0x9BBC, + 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, 0x95F6, + 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8, 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD, + 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE, + 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3, + 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, 0x5DCC, 0x8ADE, + 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42, + 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6, 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7, + 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246, + 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, 0x5E16, 0x929F, + 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, 0x91D1, + 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7, 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9, + 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC, + 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, 0x5E74, 0x944E, + 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, 0x5E7D, 0x9748, + 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98, + 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D, 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0, + 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9, + 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, 0x5ED6, 0x9C40, + 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, 0x9C41, + 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C, 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984, + 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4, 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9, + 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE, + 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, 0x5F18, 0x8D4F, + 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58, + 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3, 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265, + 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396, + 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, 0x5F66, 0x9546, + 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, 0x8965, + 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE, 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68, + 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3, + 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E, + 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, 0x5FB3, 0x93BF, + 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5, + 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659, 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB, + 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76, + 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, 0x6016, 0x957C, + 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, 0x9C88, + 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6, 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A, + 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91, 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0, + 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, 0x6062, 0x89F8, + 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, 0x606C, 0x9C97, + 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F, + 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5, 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7, + 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978, + 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, 0x60B6, 0x96E3, + 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, 0x9CA9, + 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9, 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6, + 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4, 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6, + 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, 0x6103, 0x9CB8, + 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, 0x6115, 0x9CB1, + 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5, + 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4, 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8, + 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054, + 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, 0x6162, 0x969D, + 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, 0x88D4, + 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7, 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A, + 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7, 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6, + 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, 0x61AE, 0x9CE1, + 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, 0x61C8, 0x9CE6, + 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED, + 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5, 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3, + 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9, + 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, 0x621A, 0x90CA, + 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, 0x9D43, + 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46, 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B, + 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB, 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48, + 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, 0x6268, 0x9D4D, + 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, 0x6280, 0x8B5A, + 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53, + 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52, 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0, + 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F, + 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, 0x62CA, 0x9D62, + 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, 0x9D55, + 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5, 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67, + 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D, 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41, + 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, 0x6309, 0x88C2, + 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, 0x632F, 0x9055, + 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73, + 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B, 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E, + 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C, + 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, 0x6398, 0x8C40, + 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, 0x8D54, + 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77, 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D, + 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5, 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560, + 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, 0x63E9, 0x9D82, + 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, 0x640F, 0x9D93, + 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B, + 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF, 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA, + 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D, + 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, 0x64A5, 0x9D9B, + 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, 0x9DA3, + 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1, 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0, + 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43, + 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, 0x64FA, 0x9DB2, + 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, 0x6523, 0x9DB9, + 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE, + 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55, 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1, + 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5, + 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, 0x6570, 0x9094, + 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, 0x95B6, + 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6, 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF, + 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4, 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF, + 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, 0x65BD, 0x8E7B, + 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, 0x65CF, 0x91B0, + 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA, + 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181, 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0, + 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD, + 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, 0x661E, 0xFAD3, + 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, 0xFAD2, + 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1, 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45, + 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6, 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E, + 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, 0x6665, 0xFAD5, + 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, 0x6673, 0xFAD9, + 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2, + 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267, 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7, + 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41, + 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, 0x66C9, 0x9DFA, + 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, 0x9E47, + 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58, 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182, + 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D, 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0, + 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, 0x6715, 0x92BD, + 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, 0x6727, 0x9E4F, + 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670, + 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7, 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57, + 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A, + 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, 0x6764, 0x9E5C, + 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, 0x9DDC, + 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60, 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8, + 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD, 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA, + 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, 0x67B3, 0x9E6B, + 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, 0x67C1, 0x91C6, + 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5, + 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70, 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76, + 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2, + 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, 0x6813, 0x90F0, + 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, 0x9E81, + 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA, 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85, + 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79, 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB, + 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, 0x685F, 0x8E56, + 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, 0x6881, 0x97C0, + 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B, + 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD, 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88, + 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92, + 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, 0x68CD, 0x9E9E, + 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, 0x938F, + 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0, 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8, + 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4, 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D, + 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, 0x691C, 0x8C9F, + 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, 0x6930, 0x9EBD, + 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6, + 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3, 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE, + 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480, + 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, 0x697E, 0x9EB7, + 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, 0xFAEB, + 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0, 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6, + 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C, + 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, 0x69DD, 0x9ECD, + 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, 0x69F9, 0x9EDD, + 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC, + 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294, 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE, + 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED, + 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, 0x6A46, 0xFAEF, + 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, 0x9EF1, + 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0, 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268, + 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7, 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB, + 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8, + 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, 0x6ADF, 0x9F4A, + 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F, + 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954, 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3, + 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC, + 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, 0x6B54, 0x9F60, + 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, 0x9590, + 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE, 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80, + 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68, 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63, + 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70, + 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, 0x6BBA, 0x8E45, + 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA, + 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4, 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A, + 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82, + 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, 0x6C38, 0x8969, + 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, 0x9F88, + 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0, 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89, + 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF, 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44, + 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C, + 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, 0x6CA1, 0x9676, + 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F, + 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E, 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A, + 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9, + 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, 0x6CEA, 0x9FA3, + 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, 0x9FAD, + 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4, 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E, + 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8, + 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, 0x6D63, 0x9FAF, + 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, 0x6D74, 0x9781, + 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5, + 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC, 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55, + 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD, + 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, 0x6DD9, 0x9FC8, + 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, 0x9FC1, + 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E, 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9, + 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4, 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB, + 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9, + 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, 0x6E29, 0x89B7, + 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB, + 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9, 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3, + 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1, + 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, 0x6E90, 0x8CB9, + 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, 0x9FE2, + 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5, 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF, + 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB, + 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, 0x6EF7, 0xE042, + 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, 0x6F0F, 0x9852, + 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F, + 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151, 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1, + 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B, + 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, 0x6F80, 0xE047, + 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, 0x8AC0, + 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059, 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057, + 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A, 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E, + 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, 0x6FEE, 0xE060, + 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, 0x7001, 0xE066, + 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D, + 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2, 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50, + 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073, + 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, 0x7089, 0x9846, + 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, 0xE07B, + 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F, 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D, + 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C, 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54, + 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, 0x7126, 0x8FC5, + 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, 0x7155, 0xE086, + 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6, + 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8, 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D, + 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094, + 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, 0x71D2, 0xE096, + 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, 0xE09C, + 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D, 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A, + 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2, 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6, + 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, 0x723C, 0xE0AA, + 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, 0x724B, 0xE0AE, + 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2, + 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5, 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1, + 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7, + 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, 0x72BE, 0xFB5C, + 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, 0x8BE7, + 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2, 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7, + 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854, 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6, + 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, 0x732A, 0x9296, + 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, 0x733F, 0x898E, + 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4, + 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F, 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA, + 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE, + 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, 0x73CE, 0xE0DD, + 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, 0x94C7, + 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7, 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D, + 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6, 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A, + 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, 0x7441, 0xE0EE, + 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, 0x7460, 0x97DA, + 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA, + 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C, 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3, + 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140, + 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, 0x74F1, 0xE147, + 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, 0xE14C, + 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99, 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072, + 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59, 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1, + 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, 0x7538, 0x99B2, + 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, 0x754B, 0x9DC0, + 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A, + 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C, 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F, + 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166, + 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, 0x7589, 0xE168, + 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, 0xE16C, + 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176, 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174, + 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE, 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7, + 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, 0x75DB, 0x92C9, + 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, 0x75F4, 0x9273, + 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187, + 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D, 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F, + 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8, + 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, 0x766A, 0xE19B, + 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, 0xE1A2, + 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70, 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63, + 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48, 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB, + 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, 0x76B7, 0xEA89, + 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, 0x76C8, 0x896D, + 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5, + 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5, 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA, + 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD, + 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, 0x7720, 0x96B0, + 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, 0x8AE1, + 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8, 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC, + 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF, 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0, + 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, 0x77B3, 0x93B5, + 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, 0x77CD, 0xE1DD, + 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A, + 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8, 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4, + 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D, + 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, 0x7864, 0xFB7A, + 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, 0x8CE9, + 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56, 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA, + 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9, 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1, + 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, 0x78CB, 0xE1F6, + 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, 0x78EF, 0x88E9, + 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247, + 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248, 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0, + 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F, + 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, 0x7962, 0x9449, + 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, 0x8BD6, + 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0, 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83, + 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257, 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A, + 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, 0x79CB, 0x8F48, + 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, 0x79E4, 0x9489, + 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262, + 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB, 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274, + 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A, + 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, 0x7A46, 0x9673, + 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, 0xE271, + 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274, 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3, + 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE, 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B, + 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, 0x7AAE, 0x8B87, + 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, 0x7AC5, 0xE281, + 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2, + 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C, 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD, + 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87, + 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, 0x7AFF, 0x8AC6, + 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, 0x8FCE, + 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A, 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C, + 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D, 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4, + 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, 0x7B52, 0x939B, + 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, 0x7B70, 0xE2A9, + 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0, + 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5, 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2, + 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0, + 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, 0x7BC9, 0x927A, + 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, 0xE2C2, + 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC, 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB, + 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD, + 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, 0x7C3F, 0x95EB, + 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, 0x7C56, 0xE2DD, + 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0, + 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1, 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2, + 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5, + 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, 0x7CB1, 0xE2EB, + 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, 0xE2F0, + 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C, 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C, + 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85, + 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, 0x7D06, 0xE2FC, + 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, 0x7D18, 0x8D68, + 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87, + 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7, 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0, + 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A, + 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, 0x7D5C, 0xFB8B, + 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, 0x939D, + 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2, 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356, + 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358, 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361, + 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, 0x7DB1, 0x8D6A, + 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, 0x7DBD, 0xE35E, + 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F, + 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC, 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7, + 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB, + 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, 0x7E12, 0xE372, + 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, 0x9644, + 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B, 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A, + 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D, 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A, + 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, 0x7E5E, 0xE385, + 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, 0x7E7B, 0xE38C, + 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C, + 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396, 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399, + 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0, + 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, 0x7F5F, 0xE3A8, + 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, 0x94B1, + 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD, 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785, + 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7, + 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC, + 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, 0x7FC5, 0xE3C0, + 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5, + 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB, 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783, + 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7, + 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, 0x8021, 0xE3D2, + 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, 0xE3D6, + 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA, 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC, + 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF, 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045, + 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, 0x8087, 0x94A3, + 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, 0x809B, 0xE3E8, + 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB, + 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6, 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F, + 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645, + 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, 0x80FC, 0xE445, + 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, 0x90D2, + 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9, 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF, + 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074, 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F, + 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, 0x8171, 0xE446, + 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, 0x8183, 0xE44B, + 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547, + 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663, 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458, + 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0, + 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, 0x81DA, 0xE465, + 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, 0x8F4C, + 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A, 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D, + 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8, 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9, + 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, 0x821E, 0x9591, + 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, 0x8235, 0x91C7, + 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479, + 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480, 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482, + 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, 0x8278, 0xE487, + 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, 0x82A5, 0x8A48, + 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, 0x8C7C, + 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1, 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB, + 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C, 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490, + 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, 0x82F9, 0xE499, + 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, 0x8306, 0xE49B, + 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF, + 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2, 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9, + 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72, + 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, 0x837F, 0xFB95, + 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, 0xE4AD, + 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0, 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789, + 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B, 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0, + 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, 0x83EB, 0xE4BF, + 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, 0x83FB, 0xE4D0, + 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE, + 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B, 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0, + 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298, + 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, 0x846C, 0x9192, + 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, 0x9598, + 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E, 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5, + 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99, 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193, + 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, 0x84CD, 0xE4E7, + 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, 0x84EE, 0x9840, + 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7, + 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955, 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4, + 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4, + 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, 0x8559, 0xFB9B, + 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, 0xE550, + 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E, 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547, + 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C, 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549, + 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, 0x85B9, 0xE556, + 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, 0x85DC, 0xE55B, + 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561, + 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562, 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E, + 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566, + 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, 0x865E, 0x8BF1, + 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, 0xE571, + 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E, 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A, + 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575, 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260, + 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, 0x86E4, 0x94B8, + 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, 0x86FB, 0xE588, + 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D, + 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277, 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593, + 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, 0x874E, 0xE599, + 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, 0x8766, 0x89DA, + 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, 0xE5A5, + 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC, 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1, + 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB, + 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, 0x87FE, 0xE5B7, + 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, 0x8816, 0xE5BD, + 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5, + 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F, 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70, + 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF, + 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, 0x887E, 0xE5CE, + 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, 0x91B3, + 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9, 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC, + 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF, 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF, + 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, 0x88DC, 0x95E2, + 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, 0x88F5, 0xFBA2, + 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1, + 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A, 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0, + 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF, + 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, 0x8964, 0xE641, + 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, 0xE647, + 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2, 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9, + 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460, 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F, + 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, 0x89BA, 0xE653, + 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, 0x89E3, 0x89F0, + 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76, + 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F, 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5, + 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD, + 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, 0x8A3C, 0x8FD8, + 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, 0x955D, + 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D, 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C, + 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C, 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5, + 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, 0x8A8D, 0x9446, + 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, 0x8AA1, 0xE672, + 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7, + 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62, 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678, + 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B, + 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, 0x8AE4, 0xE680, + 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, 0xFBAA, + 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8, 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3, + 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D, 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA, + 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, 0x8B2B, 0xE693, + 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, 0x8B4E, 0xE699, + 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F, + 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1, 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2, + 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6, + 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, 0x8C3A, 0xE6AC, + 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, 0xE6B2, + 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4, 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6, + 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665, + 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, 0x8CA1, 0x8DE0, + 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, 0x8CAD, 0xE6C2, + 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483, + 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4, 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847, + 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6, + 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, 0x8CE3, 0xE6CC, + 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, 0xE6D0, + 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2, 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4, + 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4, + 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, 0x8D74, 0x958B, + 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, 0x8DA8, 0x9096, + 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8, + 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE, 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC, + 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2, + 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, 0x8E30, 0xE6FA, + 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, 0xE6FC, + 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745, 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746, + 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D, 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F, + 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, 0x8EA1, 0xE759, + 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, 0x8EC5, 0xE75F, + 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC, + 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763, 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764, + 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B, + 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, 0x8F1F, 0xE76F, + 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, 0xE774, + 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D, 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779, + 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781, + 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, 0x8FA8, 0x999E, + 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, 0x8FBA, 0x95D3, + 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF, + 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A, 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497, + 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792, + 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, 0x900D, 0xE796, + 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, 0xE798, + 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0, 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795, + 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF, 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B, + 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, 0x9047, 0x8BF6, + 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, 0x9051, 0xE7A1, + 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB, + 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD, 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B, + 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149, + 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, 0x9083, 0xE284, + 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, 0x964D, + 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7, 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78, + 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53, 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73, + 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, 0x9127, 0xFBB9, + 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, 0x914D, 0x947A, + 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6, + 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9, 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F, + 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE, + 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, 0x91B5, 0xE7D1, + 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, 0xE7D6, + 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC, 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9, + 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC, 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA, + 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, 0x91EE, 0xFBBE, + 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, 0x920E, 0x8A62, + 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9, + 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6, 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8, + 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8, + 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, 0x9271, 0x8D7A, + 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, 0x914C, + 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1, 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC, + 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4, + 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, 0x92ED, 0x8973, + 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, 0x92FF, 0xFBDC, + 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD, + 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841, 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564, + 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, 0x933B, 0xE846, + 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, 0x935B, 0x9262, + 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, 0x8FDF, + 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199, 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D, + 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850, 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858, + 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, 0x93E4, 0xE85A, + 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, 0x9414, 0xE85C, + 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861, + 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868, 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867, + 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F, + 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, 0x9577, 0x92B7, + 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, 0x895B, + 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B, 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880, + 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4, 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B, + 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, 0x95CC, 0xE88C, + 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, 0x95E2, 0xE893, + 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668, + 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898, 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E, + 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940, + 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, 0x9672, 0xE8A2, + 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, 0x8BF7, + 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440, 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75, + 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84, 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942, + 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, 0x96B2, 0xE8AB, + 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, 0x96C0, 0x909D, + 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93, + 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8, 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6, + 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB, + 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, 0x9708, 0xE8BC, + 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, 0xE8C2, + 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6, 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED, + 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7, 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9, + 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, 0x9755, 0xFBF3, + 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, 0x9764, 0xE8D0, + 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6, + 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93, 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6, + 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0, + 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, 0x97CB, 0xE8E8, + 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, 0xE8EE, + 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8, 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B, + 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6, 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC, + 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, 0x9838, 0xE8F2, + 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, 0x984E, 0x8A7B, + 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5, + 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC, 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597, + 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2, + 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, 0x98EF, 0x94D1, + 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, 0xE94D, + 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E, 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952, + 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954, 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957, + 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, 0x9950, 0xE95D, + 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, 0x9999, 0x8D81, + 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9, + 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977, 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D, + 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E, + 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, 0x9A05, 0xE976, + 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, 0x93AB, + 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C, 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB, + 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983, 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987, + 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E, + 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, 0x9AD9, 0xFBFC, + 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A, + 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D, 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0, + 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8, + 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, 0x9B3C, 0x8B53, + 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, 0xE9B0, + 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B, 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41, + 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8, 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA, + 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, 0x9BB1, 0xFC44, + 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, 0x9BCF, 0xE9C3, + 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6, + 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD, 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8, + 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6, + 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, 0x9C2D, 0x9568, + 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, 0xE9E2, + 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690, 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5, + 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA, + 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, 0x9D09, 0xE9EB, + 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, 0x9D28, 0x8A9B, + 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5, + 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43, 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41, + 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46, + 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, 0x9DAB, 0xEA49, + 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, 0xEA57, + 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59, 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D, + 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60, + 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, 0x9E88, 0xEA66, + 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, 0x9E9D, 0xEA6C, + 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D, + 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80, 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F, + 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9, + 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, 0x9EEF, 0xEA7E, + 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, 0xEA87, + 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A, 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540, + 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92, + 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, 0x9F6C, 0xEA97, + 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, 0x9FA0, 0xEA9E, + 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8, + 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75, 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82, + 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1, + 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, 0xFA2B, 0xFBF7, + 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, 0x8195, + 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196, 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144, + 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251, 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255, + 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, 0xFF1E, 0x8184, + 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, 0xFF26, 0x8265, + 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D, + 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271, 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275, + 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F, + 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, 0xFF46, 0x8286, + 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, 0x828E, + 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292, 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296, + 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A, 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160, + 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, 0xFF68, 0x00A8, + 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, 0xFF70, 0x00B0, + 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8, + 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC, 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0, + 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8, + 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, 0xFF90, 0x00D0, + 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, 0x00D8, + 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC, 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191, + 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55, 0xFFE5, 0x818F, 0, 0 +}; + +static const WCHAR oem2uni932[] = { /* Shift_JIS --> Unicode pairs */ + 0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64, 0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68, + 0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C, 0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70, + 0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74, 0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78, + 0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C, 0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80, + 0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84, 0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88, + 0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C, 0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90, + 0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94, 0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98, + 0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C, 0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000, + 0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E, 0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F, + 0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4, 0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3, + 0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D, 0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005, + 0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015, 0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E, + 0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025, 0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D, + 0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015, 0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D, + 0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B, 0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F, + 0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D, 0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D, + 0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266, 0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642, + 0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033, 0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0, + 0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06, 0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606, + 0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE, 0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0, + 0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC, 0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190, + 0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208, 0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282, + 0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227, 0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4, + 0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5, 0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261, + 0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A, 0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B, + 0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F, 0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021, + 0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11, 0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15, + 0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19, 0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24, + 0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28, 0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C, + 0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30, 0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34, + 0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38, 0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42, + 0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46, 0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A, + 0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E, 0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52, + 0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56, 0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A, + 0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044, 0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048, + 0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C, 0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050, + 0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054, 0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058, + 0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C, 0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060, + 0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064, 0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068, + 0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C, 0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070, + 0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074, 0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078, + 0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C, 0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080, + 0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084, 0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088, + 0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C, 0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090, + 0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1, 0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5, + 0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9, 0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD, + 0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1, 0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5, + 0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9, 0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD, + 0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1, 0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5, + 0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9, 0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD, + 0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1, 0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5, + 0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9, 0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD, + 0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1, 0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5, + 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, + 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5, + 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397, + 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, 0x83AD, 0x039F, + 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, 0x03A8, + 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3, 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7, + 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB, 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF, + 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, 0x83D5, 0x03C8, + 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, 0x8446, 0x0401, + 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D, + 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421, 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425, + 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, 0x845E, 0x042D, + 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, 0x8475, 0x0435, + 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, 0x043C, + 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440, 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444, + 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448, 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C, + 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, 0x84A3, 0x2518, + 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, 0x84AB, 0x2503, + 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B, + 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528, 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530, + 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, 0x8744, 0x2464, + 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, 0x874C, 0x246C, + 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, 0x2160, + 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164, 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168, + 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322, 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303, + 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, 0x876D, 0x334A, + 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, 0x8775, 0x33A1, + 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5, + 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231, 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D, + 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03, + 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, 0x88A9, 0x831C, + 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, 0x9BF5, + 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271, 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4, + 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216, 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5, + 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, 0x88C9, 0x4F0A, + 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, 0x88D1, 0x5C09, + 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570, + 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3, 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055, + 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF, + 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, 0x88F1, 0x9C2F, + 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, 0x98F2, + 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662, 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B, + 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD, 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C, + 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, 0x8954, 0x6B1D, + 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, 0x895C, 0x5642, + 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30, + 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804, 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B, + 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2, + 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, 0x897C, 0x698E, + 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, 0x6028, + 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14, 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5, + 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1, 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B, + 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, 0x899D, 0x5F80, + 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, 0x89A5, 0x7FC1, + 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104, + 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876, 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378, + 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55, + 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, 0x89C5, 0x5AC1, + 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, 0x6CB3, + 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE, 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB, + 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3, 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8, + 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, 0x89E5, 0x7259, + 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, 0x89ED, 0x99D5, + 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB, + 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0, 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41, + 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5, + 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, 0x8A50, 0x54B3, + 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, 0x8857, + 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C, 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF, + 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687, 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9, + 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, 0x8A70, 0x89D2, + 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, 0x8A78, 0x5CB3, + 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6, + 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D, 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07, + 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B, + 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, 0x8A99, 0x938C, + 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, 0x82C5, + 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0, 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7, + 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72, + 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, 0x8AB9, 0x67D1, + 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, 0x8AC1, 0x6F45, + 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9, + 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266, 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB, + 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928, + 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, 0x8AE1, 0x773C, + 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, 0x4F01, + 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668, 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4, + 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2, + 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, 0x8B44, 0x6C7D, + 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, 0x8B4C, 0x8A18, + 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80, + 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C, 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A, + 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC, + 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, 0x8B6C, 0x8A70, + 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, 0x9006, + 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11, 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13, + 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42, 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403, + 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, 0x8B8D, 0x725B, + 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, 0x8B95, 0x865A, + 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB, + 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1, 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6, + 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37, + 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, 0x8BB5, 0x6CC1, + 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, 0x90F7, + 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A, 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681, + 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975, 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5, + 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, 0x8BD5, 0x7434, + 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, 0x8BDD, 0x895F, + 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5, + 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9, 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8, + 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3, + 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, 0x8C40, 0x6398, + 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, 0x7C82, + 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C, 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13, + 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366, 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE, + 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, 0x8C60, 0x5F62, + 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, 0x8C68, 0x656C, + 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99, + 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A, 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66, + 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F, + 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, 0x8C89, 0x6F54, + 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, 0x5026, + 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263, 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC, + 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3, 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D, + 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, 0x8CA9, 0x898B, + 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, 0x8CB1, 0x9A13, + 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90, + 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237, 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E, + 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB, + 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, 0x8CD1, 0x88B4, + 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, 0x96C7, + 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92, 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E, + 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F, 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881, + 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C, + 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, 0x8CF9, 0x52FE, + 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D, + 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5, 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83, + 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7, + 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, 0x8D5C, 0x69CB, + 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, 0x786C, + 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18, 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003, + 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F, 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861, + 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, 0x8D7C, 0x92FC, + 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, 0x8D85, 0x52AB, + 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9, + 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD, 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2, + 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB, + 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, 0x8DA5, 0x5A5A, + 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, 0x75D5, + 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B, 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F, + 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99, 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396, + 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, 0x8DC5, 0x6700, + 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, 0x8DCD, 0x683D, + 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D, + 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1, 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728, + 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A, + 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, 0x8DED, 0x524A, + 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, 0x7D22, + 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39, 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF, + 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D, 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690, + 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, 0x8E50, 0x5098, + 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, 0x8E58, 0x73CA, + 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910, + 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5, 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A, + 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF, + 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, 0x8E78, 0x652F, + 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, 0x6C0F, + 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8, 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102, + 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7, + 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, 0x8E99, 0x5150, + 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, 0x8EA1, 0x6CBB, + 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA, + 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F, 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA, + 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9, + 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, 0x8EC1, 0x8500, + 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, 0x820E, + 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66, 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17, + 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E, 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA, + 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, 0x8EE1, 0x82E5, + 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, 0x8EE9, 0x6731, + 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996, + 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF, 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700, + 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101, + 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, 0x8F4C, 0x81ED, + 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, 0x9031, + 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C, 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341, + 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41, 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD, + 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B, + 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, 0x8F74, 0x6625, + 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F, + 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64, 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075, + 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A, + 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, 0x8F95, 0x52A9, + 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, 0x50B7, + 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347, 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531, + 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11, + 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, 0x8FB5, 0x62DB, + 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, 0x8FBD, 0x68A2, + 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126, + 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D, 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0, + 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D, + 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, 0x8FDD, 0x91A4, + 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, 0x4E1E, + 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE, 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38, + 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756, 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63, + 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, 0x9040, 0x62ED, + 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, 0x9048, 0x98DF, + 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20, + 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E, 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE, + 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6, + 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, 0x9068, 0x8F9B, + 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, 0x58EC, + 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E, 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D, + 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162, 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439, + 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, 0x9089, 0x7FE0, + 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, 0x9091, 0x9AC4, + 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749, + 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0, 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8, + 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3, + 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, 0x90B1, 0x68F2, + 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, 0x8056, + 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0, 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192, + 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E, 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC, + 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, 0x90D1, 0x7E3E, + 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, 0x90D9, 0x62D9, + 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA, + 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9, 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3, + 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834, + 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, 0x90F9, 0x65CB, + 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, 0x8239, + 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5, 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291, + 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584, 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985, + 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, 0x915C, 0x66FE, + 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, 0x9164, 0x79DF, + 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20, + 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2, 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F, + 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383, + 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, 0x9185, 0x69FD, + 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, 0x7DCF, + 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358, 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5, + 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397, 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897, + 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, 0x91A5, 0x5247, + 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, 0x91AD, 0x4FD7, + 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3, + 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D, 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A, + 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253, + 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, 0x91CD, 0x5806, + 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, 0x6234, + 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE, 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8, + 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927, + 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, 0x91ED, 0x5544, + 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, 0x91F5, 0x8A17, + 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9, + 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A, 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF, + 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358, + 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, 0x9258, 0x6E5B, + 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, 0x86CB, + 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7, 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80, + 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024, 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065, + 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, 0x9278, 0x9045, + 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, 0x9281, 0x79E9, + 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0, + 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8, 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E, + 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF, + 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, 0x92A1, 0x5E81, + 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, 0x671D, + 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A, 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776, + 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3, 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5, + 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, 0x92C1, 0x93AE, + 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, 0x92C9, 0x75DB, + 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8, + 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354, 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7, + 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E, + 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, 0x92E9, 0x5E1D, + 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, 0x63D0, + 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E, 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02, + 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8, 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5, + 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, 0x934C, 0x93D1, + 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, 0x9354, 0x5178, + 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC, + 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D, 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB, + 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597, + 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, 0x9374, 0x934D, + 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, 0x5012, + 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200, 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957, + 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC, 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843, + 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, 0x9395, 0x71C8, + 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, 0x939D, 0x7D71, + 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F, + 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676, 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD, + 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3, + 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, 0x93BD, 0x533F, + 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, 0x6BD2, + 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61, 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A, + 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149, 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7, + 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, 0x93DD, 0x920D, + 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, 0x93E5, 0x7058, + 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960, + 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C, 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302, + 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982, + 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, 0x9448, 0x79B0, + 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, 0x637B, + 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43, 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2, + 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD, 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997, + 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, 0x9468, 0x6D3E, + 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, 0x9470, 0x5EC3, + 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA, + 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9, 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164, + 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4, + 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, 0x9491, 0x6CCA, + 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, 0x6F20, + 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1, 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872, + 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8, 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560, + 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, 0x94B1, 0x7F70, + 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, 0x94B9, 0x96BC, + 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591, + 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248, 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41, + 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF, + 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, 0x94D9, 0x532A, + 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, 0x6279, + 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC, 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8, + 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB, 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E, + 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, 0x94F9, 0x6BD8, + 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, 0x9544, 0x758B, + 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562, + 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB, 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C, + 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868, + 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, 0x9564, 0x9328, + 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, 0x6D5C, + 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B, 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8, + 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC, 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016, + 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, 0x9585, 0x8150, + 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, 0x958D, 0x9644, + 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01, + 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557, 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45, + 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255, + 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, 0x95AD, 0x58B3, + 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, 0x96F0, + 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75, 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73, + 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D, 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801, + 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, 0x95CD, 0x7B86, + 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, 0x95D5, 0x904D, + 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA, + 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B, 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF, + 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023, + 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, 0x95F5, 0x5CEF, + 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, 0x6CD5, + 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B, 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC, + 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A, 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3, + 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, 0x9658, 0x5E3D, + 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, 0x9660, 0x5192, + 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632, + 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5, 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734, + 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800, + 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, 0x9681, 0x78E8, + 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, 0x54E9, + 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795, 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D, + 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9, 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD, + 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, 0x96A1, 0x5473, + 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, 0x96A9, 0x6E4A, + 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9, + 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB, 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F, + 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298, + 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, 0x96C9, 0x7DEC, + 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, 0x6BDB, + 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017, 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9, + 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905, 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0, + 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, 0x96E9, 0x591C, + 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, 0x96F1, 0x7D04, + 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109, + 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED, 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A, + 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709, + 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, 0x9754, 0x88D5, + 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, 0x4E88, + 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F, 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996, + 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA, 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8, + 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, 0x9774, 0x8449, + 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, 0x977C, 0x617E, + 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85, + 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1, 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61, + 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD, + 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, 0x979D, 0x7406, + 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, 0x5F8B, + 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0, 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C, + 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92, 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6, + 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, 0x97BD, 0x51CC, + 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, 0x97C5, 0x7A1C, + 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B, + 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797, 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8, + 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F, + 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, 0x97E5, 0x601C, + 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, 0x9E97, + 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217, 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9, + 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149, 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE, + 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, 0x9848, 0x8DEF, + 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, 0x9850, 0x6994, + 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B, + 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984, 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D, + 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2, + 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, 0x9870, 0x6E7E, + 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, 0x4E36, + 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56, 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B, + 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2, + 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, 0x98BC, 0x4EC2, + 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, 0x98C4, 0x4F30, + 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98, + 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91, 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118, + 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0, + 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, 0x98E4, 0x5005, + 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, 0x5011, + 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703, 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A, + 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080, 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2, + 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, 0x9947, 0x50ED, + 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, 0x994F, 0x5116, + 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B, + 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C, 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169, + 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, 0x9967, 0x518F, + 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, 0x996F, 0x51A9, + 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, 0x51BD, + 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0, 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0, + 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B, 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A, + 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, 0x9990, 0x525E, + 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, 0x9998, 0x528D, + 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC, + 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1, 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3, + 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306, + 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, 0x99B8, 0x5323, + 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, 0x4E17, + 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E, 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B, + 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0, 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0, + 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, 0x99D8, 0x53EE, + 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, 0x99E0, 0x542D, + 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475, + 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477, 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480, + 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5, + 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, 0x9A43, 0x54BE, + 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, 0x54EE, + 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539, 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E, + 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557, 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599, + 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, 0x9A63, 0x559E, + 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, 0x9A6B, 0x55C5, + 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616, + 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9, 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634, + 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A, + 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, 0x9A8C, 0x56AE, + 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, 0x56C8, + 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7, 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF, + 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B, 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716, + 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, 0x9AAC, 0x5740, + 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, 0x9AB4, 0x5793, + 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4, + 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6, 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D, + 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D, + 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, 0x9AD4, 0x58BB, + 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, 0x58D8, + 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF, 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB, + 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A, 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925, + 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, 0x9AF4, 0x5950, + 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, 0x9AFC, 0x5969, + 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6, + 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9, 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11, + 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36, + 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, 0x9B5F, 0x5ABD, + 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, 0x5B0C, + 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0, 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43, + 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55, 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69, + 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, 0x9B80, 0x5B83, + 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, 0x9B88, 0x5BE4, + 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3, + 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D, 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28, + 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F, + 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, 0x9BA8, 0x5C91, + 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, 0x5CC5, + 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9, 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C, + 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11, + 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E, + 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, 0x9BD0, 0x5DA2, + 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9, + 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6, 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5, + 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44, + 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, 0x9BF0, 0x5E64, + 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, 0x5EC1, + 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF, 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA, + 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3, + 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, 0x9C53, 0x5F5C, + 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, 0x9C5B, 0x5F48, + 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61, + 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83, 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88, + 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD, + 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, 0x9C7B, 0x60B3, + 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, 0x6031, + 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026, 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041, + 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A, 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043, + 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, 0x9C9C, 0x60E7, + 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, 0x9CA4, 0x60A7, + 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD, + 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D, 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7, + 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D, + 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, 0x9CC4, 0x613C, + 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, 0x6158, + 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174, 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F, + 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199, 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194, + 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, 0x9CE4, 0x61C9, + 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, 0x9CEC, 0x61CD, + 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC, + 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209, 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B, + 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241, + 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, 0x9D4F, 0x6282, + 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, 0x6294, + 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF, 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8, + 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2, 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C, + 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, 0x9D6F, 0x6350, + 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, 0x9D77, 0x63AB, + 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369, + 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6, 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6, + 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D, + 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, 0x9D98, 0x652A, + 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, 0x64D2, + 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8, 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209, + 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4, + 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, 0x9DB8, 0x6524, + 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, 0x9DC0, 0x754B, + 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572, + 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A, 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7, + 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9, + 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, 0x9DE0, 0x6773, + 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, 0x6641, + 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667, 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670, + 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689, 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1, + 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, 0x9E43, 0x66DA, + 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, 0x9E4B, 0x670F, + 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736, + 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746, 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763, + 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B, + 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, 0x9E6B, 0x67B3, + 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, 0x67B9, + 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C, 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840, + 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3, 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877, + 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, 0x9E8C, 0x6883, + 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, 0x9E94, 0x688D, + 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1, + 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7, 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904, + 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A, + 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, 0x9EB4, 0x6978, + 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, 0x6959, + 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D, 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE, + 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA, + 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, 0x9ED4, 0x699C, + 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, 0x9EDC, 0x6B0A, + 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14, + 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1, 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C, + 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48, + 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, 0x9EFC, 0x6AA3, + 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, 0x6AAC, + 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA, 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05, + 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16, 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37, + 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, 0x9F5F, 0x6B59, + 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, 0x9F67, 0x6B80, + 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA, + 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1, 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6, + 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE, + 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, 0x9F88, 0x6C55, + 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, 0x6C7E, + 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90, 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD, + 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB, + 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D, + 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, 0x9FB0, 0x6D93, + 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85, + 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5, 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6, + 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9, + 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, 0x9FD0, 0x6E19, + 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, 0x6E4D, + 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E, 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38, + 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF, + 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F, + 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, 0x9FF8, 0x6EF2, + 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86, + 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80, 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D, + 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3, + 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, 0xE05B, 0x6FD5, + 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, 0x700B, + 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F, 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74, + 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030, 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063, + 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, 0xE07B, 0x70AE, + 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, 0xE084, 0x7119, + 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C, + 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195, 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9, + 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7, + 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, 0xE0A4, 0x7228, + 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, 0x7240, + 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274, 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287, + 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6, + 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, 0xE0C4, 0x72F7, + 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, 0xE0CC, 0x732F, + 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A, + 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375, 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3, + 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405, + 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, 0xE0EC, 0x745F, + 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, 0x7476, + 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7, 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1, + 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9, 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1, + 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, 0xE14F, 0x750D, + 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, 0xE157, 0x754D, + 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567, + 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576, 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A, + 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2, + 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, 0xE177, 0x75CD, + 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, 0x75FC, + 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2, 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609, + 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621, 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630, + 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, 0xE198, 0x7662, + 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, 0xE1A0, 0x7676, + 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696, + 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0, 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA, + 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7, + 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, 0xE1C0, 0x7724, + 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, 0x775A, + 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765, 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E, + 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E, 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF, + 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, 0xE1E0, 0x77DC, + 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, 0xE1E8, 0x792A, + 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3, + 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1, 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE, + 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4, + 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, 0xE24B, 0x7960, + 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, 0x798A, + 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA, 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA, + 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC, 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D, + 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, 0xE26B, 0x7A3E, + 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, 0xE273, 0x9F9D, + 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96, + 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6, 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083, + 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA, + 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, 0xE294, 0x7B0F, + 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, 0x7B28, + 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04, 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45, + 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E, + 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92, + 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, 0xE2BC, 0x7BB4, + 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60, + 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3, 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6, + 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C, + 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, 0xE2DC, 0x7C64, + 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, 0x7CAD, + 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8, 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE, + 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC, + 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06, + 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, 0xE347, 0x7D32, + 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68, + 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93, 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D, + 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB, + 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, 0xE367, 0x7DD8, + 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, 0x7E0A, + 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31, 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22, + 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35, 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32, + 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, 0xE388, 0x7E79, + 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, 0xE390, 0x8FAE, + 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94, + 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C, 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C, + 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F, + 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, 0xE3B0, 0x7F83, + 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, 0x7FA3, + 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE, 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5, + 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3, + 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, 0xE3D0, 0x8019, + 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, 0xE3D8, 0x8052, + 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070, + 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F, 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B, + 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9, + 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, 0xE3F8, 0x811B, + 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, 0x8153, + 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E, 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183, + 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182, 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3, + 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, 0xE45B, 0x81BD, + 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, 0xE463, 0x81D8, + 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE, + 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207, 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216, + 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D, + 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, 0xE484, 0x822E, + 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, 0x829F, + 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3, 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3, + 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB, 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC, + 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, 0xE4A4, 0x8340, + 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, 0xE4AC, 0x8385, + 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387, + 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373, 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8, + 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B, + 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, 0xE4CC, 0x8420, + 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, 0x855A, + 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD, 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446, + 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435, 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF, + 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, 0xE4EC, 0x84C6, + 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, 0xE4F4, 0x852C, + 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548, + 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555, 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591, + 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C, + 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, 0xE557, 0x85D0, + 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, 0x860B, + 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622, 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D, + 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667, 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9, + 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, 0xE577, 0x86B0, + 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, 0xE580, 0x86DF, + 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB, + 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9, 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737, + 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, 0xE598, 0x874C, + 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, 0xE5A0, 0x8763, + 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, 0x87BD, + 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB, 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6, + 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0, 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6, + 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, 0xE5C0, 0x8821, + 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, 0xE5C8, 0x8852, + 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875, + 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882, 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899, + 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4, + 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, 0xE5E8, 0x88F4, + 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, 0x891E, + 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941, 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938, + 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E, 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A, + 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, 0xE64B, 0x8993, + 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, 0xE653, 0x89BA, + 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4, + 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10, 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25, + 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D, + 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, 0xE673, 0x8A91, + 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, 0x8ADA, + 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4, 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2, + 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C, 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16, + 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, 0xE694, 0x8B3E, + 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, 0xE69C, 0x8B5B, + 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80, + 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93, 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A, + 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62, + 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, 0xE6BC, 0x8C8D, + 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, 0x8CBD, + 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6, 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3, + 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07, + 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, 0xE6DC, 0x8D16, + 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, 0xE6E4, 0x8DBE, + 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA, + 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC, 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D, + 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A, + 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, 0xE747, 0x8E60, + 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, 0x8E87, + 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A, 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99, + 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5, + 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, 0xE767, 0x8EFE, + 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, 0xE76F, 0x8F1F, + 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42, + 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46, 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62, + 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7, + 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, 0xE790, 0x9005, + 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, 0x9016, + 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035, 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050, + 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049, 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E, + 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, 0xE7B0, 0x9081, + 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, 0xE7B8, 0x90B5, + 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132, + 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158, 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173, + 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA, + 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, 0xE7D8, 0x91D0, + 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, 0x921E, + 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215, 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245, + 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295, 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C, + 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, 0xE7F8, 0x92E9, + 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, 0xE843, 0x9323, + 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356, + 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394, 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8, + 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A, + 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, 0xE863, 0x9435, + 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, 0x9462, + 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470, 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A, + 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F, 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594, + 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, 0xE884, 0x95BC, + 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, 0xE88C, 0x95CC, + 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621, + 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642, 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677, + 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D, + 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, 0xE8AC, 0x96B0, + 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, 0x96CD, + 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5, 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708, + 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F, 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A, + 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, 0xE8CC, 0x9742, + 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, 0xE8D4, 0x976B, + 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B, + 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8, 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4, + 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2, + 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, 0xE8F4, 0x9821, + 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, 0x9870, + 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA, 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4, + 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB, 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914, + 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, 0xE957, 0x992E, + 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, 0xE95F, 0x9951, + 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE, + 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD, 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE, + 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2, + 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, 0xE980, 0x9A3E, + 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, 0x9A64, + 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD, 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF, + 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE, 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6, + 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, 0xE9A0, 0x9B06, + 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, 0xE9A8, 0x9B28, + 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F, + 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58, 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91, + 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA, + 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, 0xE9C8, 0x9BE4, + 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, 0x9C14, + 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06, 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04, + 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32, + 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7, + 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, 0xE9F0, 0x9D2A, + 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41, + 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48, 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51, + 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A, + 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, 0xEA53, 0x9DB8, + 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, 0x9DE6, + 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A, 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79, + 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91, + 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, 0xEA73, 0x9ECC, + 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, 0xEA7B, 0x9EE0, + 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB, + 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08, 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C, + 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61, + 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, 0xEA9C, 0x9F95, + 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, 0x7199, + 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173, 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177, + 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07, 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348, + 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, 0xFA66, 0x66FB, + 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, 0xFA6E, 0x4F56, + 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF, + 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042, 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A, + 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0, + 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, 0xFA8F, 0x53DD, + 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, 0x5765, + 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F, 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B, + 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963, 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0, + 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27, + 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, 0xFAB7, 0x5F21, + 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE, + 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111, 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213, + 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615, + 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, 0xFAD7, 0x6659, + 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, 0x670E, + 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852, 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF, + 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998, 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46, + 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86, + 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, 0xFB42, 0x6DCF, + 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF, + 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005, 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB, + 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE, + 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, 0xFB62, 0x73D6, + 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, 0x742E, + 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501, 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E, + 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746, 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864, + 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, 0xFB83, 0x799B, + 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, 0xFB8B, 0x7D5C, + 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301, + 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6, 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559, + 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12, + 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, 0xFBAB, 0x8B53, + 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, 0xFA24, + 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26, 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7, + 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A, + 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, 0xFBCB, 0x9267, + 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, 0xFBD3, 0xFA27, + 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E, + 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370, 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE, + 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D, + 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, 0xFBF3, 0x9755, + 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, 0x9A4E, + 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72, 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00, + 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 936 || FF_CODE_PAGE == 0 /* Simplified Chinese */ +static const WCHAR uni2oem936[] = { /* Unicode --> GBK pairs */ + 0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3, 0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA, 0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9, 0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9, + 0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1, 0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8, 0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5, + 0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1, 0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5, + 0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9, 0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD, + 0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1, 0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1, 0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9, 0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1, 0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7, 0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4, + 0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9, 0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD, + 0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1, 0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5, + 0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9, 0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD, + 0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1, 0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4, + 0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9, 0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD, + 0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1, 0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5, + 0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9, 0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED, + 0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1, 0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA, + 0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD, + 0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846, 0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847, + 0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1, 0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5, + 0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9, 0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1, + 0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5, 0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9, + 0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA, 0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B, + 0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6, 0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE, + 0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE, 0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8, + 0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF, 0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6, + 0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4, 0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852, + 0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1, 0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9, + 0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD, 0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1, + 0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7, 0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB, + 0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF, 0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3, + 0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7, 0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3, + 0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7, 0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB, + 0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF, 0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3, + 0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6, 0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA, + 0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE, 0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2, + 0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6, 0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA, + 0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE, 0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2, + 0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6, 0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA, + 0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE, 0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2, + 0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6, 0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA, + 0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE, 0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2, + 0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6, 0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA, + 0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE, 0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856, + 0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A, 0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E, + 0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862, 0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866, + 0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A, 0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E, + 0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872, 0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876, + 0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A, 0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E, + 0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883, 0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887, + 0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6, 0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B, + 0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0, 0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E, + 0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE, 0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1, + 0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9, 0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF, + 0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895, + 0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943, 0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947, + 0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3, 0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7, + 0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB, 0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF, + 0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3, 0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7, + 0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB, 0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF, + 0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3, 0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7, + 0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB, 0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF, + 0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3, 0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7, + 0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB, 0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF, + 0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3, 0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7, + 0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB, 0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF, + 0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3, 0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967, + 0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4, 0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC, 0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4, 0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC, 0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4, 0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC, 0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4, 0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC, 0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4, 0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC, 0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4, 0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963, + 0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7, 0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB, + 0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF, 0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3, + 0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7, 0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB, + 0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF, 0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3, + 0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7, 0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6, + 0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA, 0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE, + 0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B, 0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F, + 0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953, 0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140, + 0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143, 0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB, 0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145, + 0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0, 0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9, 0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA, + 0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B, 0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D, 0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE, + 0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC, 0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9, 0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156, + 0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158, 0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159, + 0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5, 0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4, 0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D, + 0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2, 0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F, + 0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9, 0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165, + 0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169, 0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B, + 0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E, 0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172, + 0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC, 0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179, + 0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB, 0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E, + 0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA, 0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181, 0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186, 0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA, + 0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0, 0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188, + 0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1, 0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D, 0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193, 0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD, 0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3, 0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198, + 0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB, 0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199, + 0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0, 0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D, + 0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E, 0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2, 0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE, 0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8, + 0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA, 0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC, + 0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0, 0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1, + 0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF, 0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5, + 0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9, 0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1, 0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3, + 0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7, 0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2, 0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3, + 0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6, 0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5, + 0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9, 0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD, + 0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB, 0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3, + 0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD, 0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6, + 0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8, 0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA, 0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA, + 0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB, 0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0, 0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2, + 0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5, 0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7, + 0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB, 0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB, + 0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED, 0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF, + 0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1, 0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3, + 0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6, 0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9, + 0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB, 0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE, + 0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC, 0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD, + 0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA, 0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245, + 0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248, 0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C, + 0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250, 0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253, + 0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254, 0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1, + 0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE, 0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B, + 0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F, 0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5, + 0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1, 0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263, + 0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1, 0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3, + 0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE, 0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A, + 0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D, 0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3, + 0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2, 0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276, + 0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A, 0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E, + 0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281, 0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9, + 0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286, 0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0, + 0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A, 0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C, + 0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB, 0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF, + 0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0, 0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294, + 0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298, 0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE, + 0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3, 0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1, + 0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4, 0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6, + 0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB, 0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB, + 0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE, 0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6, + 0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4, 0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8, + 0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB, 0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF, + 0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2, 0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6, + 0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC, 0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC, + 0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7, 0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0, + 0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3, 0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6, + 0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9, 0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD, + 0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1, 0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5, + 0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9, 0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED, + 0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF, 0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0, + 0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3, 0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1, + 0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA, 0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341, 0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345, + 0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349, 0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D, + 0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351, 0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354, + 0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2, 0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5, + 0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E, 0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362, + 0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6, 0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368, + 0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7, 0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D, + 0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F, 0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373, + 0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376, 0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A, + 0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3, 0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381, + 0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384, 0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5, + 0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B, 0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F, + 0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393, 0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396, + 0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A, 0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E, + 0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2, 0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6, + 0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA, 0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE, + 0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2, 0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3, + 0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7, 0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5, + 0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7, 0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA, + 0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0, 0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3, + 0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1, 0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4, + 0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7, 0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA, + 0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2, 0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC, + 0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4, 0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD, + 0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE, 0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7, + 0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2, 0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4, + 0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6, 0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0, + 0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2, 0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD, + 0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF, 0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3, + 0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3, 0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7, + 0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9, 0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1, 0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED, + 0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE, 0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1, + 0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC, 0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5, + 0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7, 0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9, + 0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD, 0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442, + 0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444, 0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446, + 0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449, 0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D, + 0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F, 0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451, + 0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7, 0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454, 0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6, + 0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6, 0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF, + 0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8, 0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE, + 0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE, 0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5, + 0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460, 0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463, + 0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466, 0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468, + 0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE, 0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C, + 0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6, 0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC, + 0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470, 0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1, + 0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473, 0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7, + 0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478, 0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A, + 0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA, 0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481, + 0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE, 0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486, + 0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489, 0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4, + 0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E, 0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE, + 0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494, 0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498, + 0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B, 0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3, + 0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0, 0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3, + 0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7, 0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA, + 0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD, 0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1, + 0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC, 0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5, 0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7, 0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC, 0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0, + 0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0, 0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6, + 0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9, 0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB, + 0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE, 0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5, + 0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3, 0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6, + 0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA, 0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD, + 0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0, 0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4, + 0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8, 0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB, + 0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF, 0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7, + 0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4, 0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6, + 0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2, 0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB, + 0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE, 0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541, + 0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF, 0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE, + 0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547, 0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549, + 0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0, 0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB, + 0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1, 0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555, + 0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559, 0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8, + 0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2, 0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F, + 0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561, 0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB, + 0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA, 0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4, + 0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4, 0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9, + 0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5, 0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC, + 0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4, 0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D, + 0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4, 0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570, + 0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571, 0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1, + 0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576, 0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7, + 0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA, 0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C, + 0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D, 0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582, + 0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585, 0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1, + 0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A, 0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3, 0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F, + 0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB, 0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596, + 0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC, 0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D, + 0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0, 0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE, + 0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5, 0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7, 0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA, + 0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1, 0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD, + 0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0, 0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2, + 0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED, 0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3, 0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6, 0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5, + 0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6, 0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9, + 0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA, 0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5, + 0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3, 0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8, + 0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9, 0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0, + 0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC, 0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2, + 0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1, 0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5, + 0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1, 0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5, + 0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8, 0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA, + 0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1, 0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE, + 0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4, 0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6, + 0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5, 0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC, + 0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF, 0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8, + 0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA, 0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8, + 0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF, 0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2, + 0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6, 0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA, + 0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE, 0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB, + 0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC, 0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6, + 0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8, 0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4, + 0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC, 0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4, + 0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7, 0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB, + 0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB, 0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640, + 0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7, 0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642, 0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644, + 0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646, 0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649, + 0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B, 0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3, + 0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF, 0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E, + 0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5, 0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650, 0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1, + 0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8, 0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655, + 0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6, 0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4, + 0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8, 0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F, 0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8, + 0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664, 0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666, + 0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4, 0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B, + 0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F, 0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670, + 0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673, 0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677, + 0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A, 0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF, + 0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E, 0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4, + 0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB, 0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684, + 0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687, 0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A, + 0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9, 0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E, + 0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC, 0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1, + 0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695, 0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698, + 0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2, 0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E, + 0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1, 0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4, + 0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2, 0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE, + 0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6, 0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC, + 0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4, 0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0, + 0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1, 0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9, + 0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4, 0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0, + 0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7, 0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9, + 0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC, 0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE, + 0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0, 0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3, + 0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7, 0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA, + 0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE, 0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1, + 0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3, 0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5, + 0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7, 0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA, + 0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC, 0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF, + 0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1, 0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2, 0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8, + 0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA, 0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC, + 0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2, 0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0, 0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4, 0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7, + 0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5, 0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB, + 0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740, 0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742, + 0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2, 0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747, + 0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B, 0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E, + 0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF, 0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753, + 0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755, 0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758, + 0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A, 0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0, + 0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB, 0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761, + 0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764, 0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767, + 0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B, 0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F, + 0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD, 0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774, + 0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777, 0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778, + 0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B, 0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE, + 0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782, 0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB, + 0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785, 0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788, + 0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1, 0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F, + 0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791, 0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795, + 0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3, 0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B, + 0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF, 0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1, + 0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4, 0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8, + 0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC, 0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0, + 0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3, 0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7, + 0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB, 0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE, + 0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2, 0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5, + 0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8, 0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC, + 0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0, 0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2, + 0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7, 0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB, + 0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE, 0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8, 0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5, + 0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4, 0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8, + 0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA, 0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC, + 0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE, 0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC, + 0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC, 0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5, + 0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2, 0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5, + 0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB, 0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840, + 0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844, 0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848, + 0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B, 0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E, + 0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851, 0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9, + 0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC, 0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855, + 0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858, 0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1, + 0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8, 0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0, + 0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862, 0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB, + 0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2, 0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866, + 0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A, 0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1, + 0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB, 0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D, + 0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9, 0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA, + 0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872, 0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875, + 0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9, 0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A, + 0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C, 0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9, + 0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4, 0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884, + 0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886, 0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD, + 0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C, 0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890, + 0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893, 0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1, 0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897, + 0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5, 0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE, + 0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E, 0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1, + 0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5, 0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB, 0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF, + 0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7, 0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8, + 0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5, 0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6, + 0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9, 0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB, + 0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE, 0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2, + 0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5, 0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8, + 0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB, 0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9, + 0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF, 0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3, + 0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1, 0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7, + 0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9, 0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC, + 0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF, 0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2, + 0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6, 0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7, + 0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA, 0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0, + 0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1, 0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4, + 0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7, 0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB, + 0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940, 0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944, + 0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947, 0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B, + 0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D, 0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950, + 0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953, 0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956, + 0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB, 0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D, + 0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960, 0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964, + 0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966, 0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A, + 0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E, 0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972, + 0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3, 0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977, + 0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979, 0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C, + 0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981, 0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA, + 0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987, 0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE, + 0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6, 0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F, + 0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993, 0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995, + 0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999, 0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D, + 0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1, 0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5, + 0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8, 0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB, + 0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE, 0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2, + 0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6, 0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9, + 0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC, 0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0, + 0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4, 0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8, + 0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB, 0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF, + 0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3, 0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3, + 0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8, 0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8, + 0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC, 0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA, + 0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2, 0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5, + 0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8, 0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB, + 0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2, 0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0, + 0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1, 0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4, + 0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6, 0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB, + 0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB, 0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA, + 0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD, 0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1, + 0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41, 0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC, + 0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46, 0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47, + 0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC, 0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B, + 0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1, 0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9, + 0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51, 0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD, + 0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56, 0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A, + 0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E, 0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62, + 0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC, 0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65, + 0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68, 0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7, + 0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1, 0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1, + 0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F, 0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA, + 0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD, 0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76, + 0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4, 0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D, + 0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E, 0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD, 0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7, + 0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88, 0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B, + 0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA, 0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91, + 0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7, 0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A, 0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D, 0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6, + 0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0, 0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4, + 0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6, 0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9, + 0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC, 0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0, + 0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4, 0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7, + 0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA, 0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC, + 0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC, 0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD, + 0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0, 0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3, + 0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6, 0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC, 0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE, + 0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0, 0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3, + 0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7, 0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4, + 0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2, 0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF, + 0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2, 0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5, + 0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5, 0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB, + 0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE, 0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2, + 0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5, 0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9, + 0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC, 0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE, + 0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44, 0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7, + 0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A, 0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E, + 0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4, 0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4, + 0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55, 0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58, + 0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C, 0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60, + 0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64, 0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD, + 0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B, 0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71, 0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75, + 0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79, 0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1, + 0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81, 0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86, 0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89, + 0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5, 0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9, + 0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92, 0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95, + 0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98, 0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8, + 0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE, 0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0, + 0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3, 0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5, + 0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF, 0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA, + 0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD, 0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4, 0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8, + 0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC, 0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0, + 0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4, 0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7, + 0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB, 0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF, + 0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4, 0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5, + 0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9, 0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD, + 0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1, 0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5, + 0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9, 0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5, + 0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF, 0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6, 0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9, + 0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD, 0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42, + 0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46, 0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48, + 0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49, 0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A, 0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7, 0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF, + 0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51, 0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53, + 0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55, 0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6, + 0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B, 0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D, + 0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E, 0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F, + 0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61, 0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64, + 0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66, 0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5, 0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2, 0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D, 0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70, + 0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2, 0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72, + 0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6, 0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5, + 0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC, 0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D, 0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83, 0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87, + 0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF, 0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B, + 0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D, 0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90, + 0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC, 0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96, + 0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A, 0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D, 0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F, + 0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB, 0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0, + 0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7, 0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2, 0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0, + 0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE, 0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC, + 0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3, 0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6, + 0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9, 0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC, + 0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF, 0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2, 0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3, + 0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3, 0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA, 0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7, + 0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA, 0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4, 0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2, + 0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0, 0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7, + 0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8, 0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC, + 0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0, 0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8, + 0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6, 0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1, + 0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB, 0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE, + 0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0, 0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2, + 0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB, 0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6, 0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC, 0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40, + 0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41, 0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44, + 0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46, 0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48, + 0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B, 0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D, + 0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50, 0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54, + 0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57, 0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC, + 0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E, 0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61, + 0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65, 0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68, + 0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD, 0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8, + 0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E, 0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71, + 0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75, 0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79, + 0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C, 0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7, 0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85, + 0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9, 0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C, + 0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2, 0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92, + 0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6, 0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98, + 0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3, 0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C, + 0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4, 0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5, 0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9, + 0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA, 0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF, + 0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3, 0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7, 0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB, + 0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF, 0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2, + 0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4, 0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8, + 0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC, 0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF, + 0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1, 0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4, + 0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7, 0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF, 0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6, + 0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6, 0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA, + 0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE, 0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2, + 0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6, 0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9, + 0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC, 0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41, + 0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45, 0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49, + 0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D, 0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51, + 0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55, 0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58, + 0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C, 0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63, 0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67, + 0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A, 0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E, + 0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72, 0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76, + 0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD, 0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2, + 0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3, 0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C, + 0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE, 0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82, 0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85, + 0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED, 0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB, 0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90, 0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91, + 0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB, 0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94, 0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98, + 0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8, 0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E, + 0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF, 0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3, + 0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7, 0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9, + 0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA, 0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD, + 0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF, 0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3, + 0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6, 0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC, 0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0, + 0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5, 0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1, + 0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8, 0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC, + 0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0, 0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2, 0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7, 0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9, + 0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC, 0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0, 0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1, + 0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2, 0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD, + 0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3, 0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6, + 0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8, 0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB, + 0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE, 0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2, + 0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC, 0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4, + 0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7, 0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB, + 0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40, 0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8, + 0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46, 0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE, 0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E, + 0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51, 0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59, 0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE, + 0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F, 0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63, + 0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3, 0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8, + 0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3, 0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C, 0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71, 0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73, + 0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75, 0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77, + 0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A, 0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C, + 0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2, 0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2, + 0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83, 0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85, + 0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89, 0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF, + 0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E, 0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91, + 0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95, 0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99, + 0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D, 0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8, 0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2, + 0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5, 0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE, + 0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5, 0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB, + 0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD, 0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF, + 0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2, 0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4, + 0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6, 0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE, + 0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9, 0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB, 0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD, + 0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0, 0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1, + 0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4, 0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7, + 0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB, 0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD, + 0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2, 0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3, + 0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6, 0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB, 0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF, + 0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4, 0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2, + 0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4, 0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF, + 0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2, 0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8, + 0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB, 0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED, + 0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0, 0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5, 0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6, + 0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9, 0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC, + 0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9, 0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB, + 0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB, 0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7, + 0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5, 0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD, + 0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0, 0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049, + 0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A, 0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C, + 0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1, 0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6, + 0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051, 0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054, + 0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057, 0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B, + 0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D, 0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE, + 0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061, 0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065, + 0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067, 0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3, + 0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C, 0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3, + 0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071, 0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6, + 0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076, 0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1, + 0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077, 0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079, + 0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1, 0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD, + 0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D, 0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081, + 0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083, 0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086, + 0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088, 0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8, + 0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3, 0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4, + 0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092, 0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094, + 0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3, 0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099, + 0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A, 0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF, + 0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E, 0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1, + 0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3, 0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7, + 0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0, 0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF, 0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2, + 0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5, 0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1, + 0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9, 0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB, + 0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB, 0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF, + 0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC, 0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1, + 0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC, 0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA, + 0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8, 0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA, + 0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9, 0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF, + 0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9, 0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4, + 0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7, 0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE, + 0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE, 0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0, + 0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4, 0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4, + 0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7, 0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB, + 0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF, 0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3, + 0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7, 0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA, + 0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE, 0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB, + 0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7, 0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146, + 0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149, 0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D, + 0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150, 0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD, + 0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157, 0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159, + 0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D, 0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160, + 0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163, 0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166, + 0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A, 0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E, + 0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172, 0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176, + 0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7, 0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C, + 0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180, 0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184, + 0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187, 0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B, + 0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F, 0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190, + 0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193, 0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197, + 0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B, 0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E, + 0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6, 0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE, + 0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8, 0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD, 0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1, + 0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2, 0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6, + 0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA, 0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE, + 0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3, 0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5, + 0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9, 0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD, + 0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0, 0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4, + 0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8, 0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB, + 0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0, 0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC, + 0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6, 0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4, + 0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2, 0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD, + 0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6, 0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB, + 0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9, 0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8, + 0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE, 0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2, + 0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4, 0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7, + 0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5, 0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA, + 0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD, 0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE, + 0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA, 0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7, + 0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243, 0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246, + 0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249, 0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D, + 0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4, 0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1, + 0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7, 0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252, + 0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6, 0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257, + 0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2, 0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B, + 0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E, 0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1, + 0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264, 0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3, + 0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6, 0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7, + 0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B, 0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0, + 0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D, 0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270, + 0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272, 0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275, + 0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278, 0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B, + 0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C, 0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7, + 0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0, 0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4, + 0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0, 0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF, 0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286, 0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9, 0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A, + 0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7, 0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D, + 0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9, 0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291, + 0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0, 0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2, + 0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297, 0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298, + 0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6, 0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E, + 0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA, 0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF, + 0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2, 0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8, + 0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6, 0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2, + 0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB, 0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD, + 0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1, 0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6, + 0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6, 0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6, + 0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6, 0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD, + 0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3, 0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF, + 0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2, 0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6, + 0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC, 0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB, + 0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD, 0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF, + 0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD, 0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4, + 0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7, 0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0, + 0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC, 0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0, + 0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2, 0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5, + 0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1, 0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5, + 0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4, 0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB, + 0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF, 0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3, 0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB, + 0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7, 0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7, + 0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9, 0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4, + 0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2, 0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341, + 0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1, 0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346, + 0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF, 0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5, + 0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE, 0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350, + 0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE, 0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355, + 0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358, 0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE, + 0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D, 0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9, + 0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE, 0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365, + 0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368, 0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7, + 0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B, 0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F, + 0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371, 0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373, + 0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375, 0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379, + 0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3, 0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C, + 0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9, 0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2, + 0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385, 0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389, + 0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C, 0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF, + 0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392, 0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394, + 0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA, 0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF, + 0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A, 0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0, + 0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0, 0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3, + 0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB, 0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA, + 0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE, 0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0, + 0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3, 0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7, + 0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB, 0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1, + 0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0, 0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC, + 0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5, 0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8, + 0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC, 0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6, + 0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE, 0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3, + 0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2, 0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA, + 0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD, 0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0, + 0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9, 0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4, + 0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7, 0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5, + 0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB, 0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE, + 0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0, 0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4, + 0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6, 0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC, + 0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC, 0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE, + 0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3, 0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA, + 0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1, 0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B, + 0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F, 0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453, + 0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457, 0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B, + 0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F, 0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462, + 0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466, 0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469, + 0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D, 0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC, + 0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474, 0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477, + 0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B, 0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480, + 0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483, 0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487, + 0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD, 0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C, + 0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5, 0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F, + 0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5, 0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494, + 0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497, 0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499, + 0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C, 0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E, + 0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD, 0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3, + 0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8, 0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2, + 0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8, 0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD, + 0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF, 0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3, + 0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4, 0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7, + 0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB, 0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF, + 0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3, 0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6, + 0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8, 0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA, + 0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD, 0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF, + 0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1, 0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3, + 0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5, 0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7, + 0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9, 0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB, + 0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF, 0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2, + 0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4, 0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7, + 0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7, 0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB, + 0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB, 0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC, + 0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD, 0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4, + 0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8, 0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8, + 0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9, 0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD, + 0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8, 0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540, + 0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1, 0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA, + 0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549, 0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA, + 0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5, 0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB, + 0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7, 0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555, + 0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556, 0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559, + 0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C, 0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E, + 0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561, 0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563, + 0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566, 0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568, + 0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6, 0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D, + 0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4, 0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572, + 0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575, 0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579, + 0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B, 0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9, + 0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD, 0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED, + 0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584, 0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586, + 0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE, 0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B, + 0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5, 0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590, + 0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7, 0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7, + 0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0, 0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD, + 0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D, 0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0, + 0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3, 0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6, + 0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF, 0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC, + 0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF, 0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3, + 0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7, 0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9, + 0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA, 0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0, + 0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3, 0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6, + 0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5, 0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD, + 0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1, 0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5, + 0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9, 0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD, + 0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1, 0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4, + 0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5, 0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9, + 0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8, 0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF, + 0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3, 0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7, 0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9, + 0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8, 0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD, + 0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642, 0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3, + 0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645, 0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648, + 0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A, 0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D, + 0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F, 0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652, + 0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC, 0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4, + 0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658, 0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A, + 0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C, 0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA, + 0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662, 0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3, + 0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB, 0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668, + 0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE, 0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B, + 0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8, 0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671, + 0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD, 0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674, + 0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677, 0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2, + 0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B, 0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD, + 0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E, 0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682, + 0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9, 0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686, + 0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689, 0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B, + 0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E, 0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691, + 0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694, 0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6, + 0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8, 0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B, 0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E, 0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0, + 0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC, 0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3, + 0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7, 0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA, + 0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC, 0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0, + 0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4, 0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6, 0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6, + 0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5, 0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC, + 0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD, 0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0, + 0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3, 0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4, + 0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6, 0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA, + 0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD, 0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF, + 0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2, 0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0, + 0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD, 0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5, + 0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC, 0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA, + 0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD, 0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0, + 0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4, 0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA, + 0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA, 0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0, + 0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0, 0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1, + 0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF, 0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0, + 0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2, 0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0, + 0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4, 0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8, + 0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9, 0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD, + 0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742, 0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5, + 0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB, 0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744, + 0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747, 0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B, + 0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0, 0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750, + 0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754, 0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757, + 0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0, 0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C, + 0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760, 0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763, + 0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766, 0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769, + 0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D, 0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2, + 0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE, 0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775, + 0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778, 0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A, + 0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C, 0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781, + 0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785, 0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9, + 0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B, 0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E, + 0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790, 0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4, + 0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796, 0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF, + 0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C, 0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F, + 0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2, 0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6, + 0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD, 0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB, + 0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE, 0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7, + 0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3, 0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6, + 0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9, 0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD, + 0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5, 0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7, + 0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4, 0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8, + 0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC, 0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE, + 0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1, 0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5, + 0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8, 0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB, + 0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE, 0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1, + 0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4, 0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB, + 0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA, 0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE, + 0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2, 0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6, + 0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9, 0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE, + 0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3, 0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841, + 0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8, 0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847, + 0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA, 0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C, + 0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850, 0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851, + 0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854, 0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5, + 0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC, 0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859, + 0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C, 0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860, + 0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862, 0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865, + 0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867, 0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B, + 0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F, 0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871, + 0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873, 0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876, + 0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879, 0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C, + 0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880, 0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883, + 0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887, 0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3, + 0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6, 0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F, + 0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892, 0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896, + 0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899, 0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B, + 0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F, 0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3, + 0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6, 0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE, + 0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD, 0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1, + 0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4, 0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7, + 0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB, 0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE, + 0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2, 0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6, + 0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA, 0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC, + 0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0, 0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2, + 0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6, 0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1, + 0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC, 0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE, + 0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1, 0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5, + 0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0, 0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB, + 0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE, 0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1, + 0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5, 0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8, + 0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC, 0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE, + 0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942, 0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945, + 0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948, 0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C, + 0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950, 0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953, + 0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957, 0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A, + 0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D, 0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960, + 0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963, 0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967, + 0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5, 0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C, + 0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970, 0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973, + 0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977, 0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A, + 0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E, 0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982, + 0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984, 0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988, + 0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C, 0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990, + 0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994, 0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998, + 0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C, 0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0, + 0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4, 0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8, + 0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC, 0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0, + 0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4, 0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8, + 0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC, 0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0, + 0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4, 0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8, + 0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC, 0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4, 0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8, + 0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC, 0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0, + 0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4, 0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8, + 0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC, 0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0, + 0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4, 0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7, 0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA, + 0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE, 0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB, + 0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46, 0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB, + 0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE, 0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E, + 0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7, 0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52, + 0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55, 0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59, + 0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D, 0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60, + 0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64, 0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4, 0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1, + 0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D, 0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71, + 0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75, 0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78, + 0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A, 0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9, 0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81, 0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3, 0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C, 0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F, + 0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93, 0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC, + 0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A, 0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E, + 0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F, 0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2, + 0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6, 0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1, + 0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA, 0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE, + 0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0, 0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1, 0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4, + 0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7, 0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA, + 0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE, 0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4, 0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7, + 0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9, 0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC, + 0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF, 0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3, + 0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB, 0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8, + 0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB, 0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC, + 0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA, 0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0, 0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2, + 0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4, 0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4, + 0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA, 0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5, + 0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9, 0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC, + 0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF, 0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3, + 0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0, 0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2, + 0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8, 0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB, + 0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD, 0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41, + 0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF, 0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42, + 0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45, 0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4, + 0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A, 0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3, + 0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB, 0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51, + 0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA, 0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC, 0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58, + 0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B, 0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D, + 0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F, 0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62, + 0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65, 0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67, + 0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9, 0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA, 0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E, 0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70, + 0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4, 0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73, + 0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75, 0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4, + 0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A, 0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D, + 0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7, 0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81, + 0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2, 0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86, 0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA, 0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B, + 0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4, 0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE, 0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90, + 0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93, 0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96, + 0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9, 0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7, + 0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E, 0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4, 0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5, + 0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8, 0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC, 0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0, 0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3, + 0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9, 0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6, + 0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC, 0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3, 0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC, 0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3, + 0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7, 0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3, + 0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6, 0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB, + 0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1, 0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD, + 0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0, 0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2, + 0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5, 0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF, + 0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB, 0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD, + 0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1, 0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2, + 0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3, 0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7, + 0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5, 0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9, + 0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3, 0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC, 0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA, + 0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1, 0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4, + 0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8, 0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA, + 0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD, 0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE, + 0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41, 0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44, + 0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7, 0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49, + 0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1, 0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D, + 0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6, 0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53, + 0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4, 0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57, + 0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A, 0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C, + 0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E, 0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62, + 0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65, 0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8, + 0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2, 0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9, 0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE, + 0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72, 0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74, + 0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75, 0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78, + 0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A, 0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6, + 0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80, 0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC, + 0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86, 0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A, + 0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C, 0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90, + 0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF, 0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96, + 0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE, 0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A, + 0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D, 0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0, + 0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4, 0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8, + 0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE, 0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE, + 0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2, 0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6, + 0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5, 0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC, + 0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3, 0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0, + 0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4, 0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6, + 0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA, 0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD, + 0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0, 0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7, + 0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5, 0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA, + 0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB, 0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1, + 0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC, 0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2, 0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8, + 0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8, 0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB, + 0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE, 0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0, + 0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1, 0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6, + 0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD, 0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE, + 0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0, 0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD, 0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42, + 0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45, 0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48, + 0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C, 0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF, + 0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1, 0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55, + 0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59, 0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C, + 0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D, 0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61, + 0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65, 0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68, + 0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B, 0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F, 0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71, + 0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1, 0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77, + 0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA, 0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E, + 0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB, 0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85, + 0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87, 0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B, + 0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F, 0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92, + 0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA, 0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA, + 0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA, 0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E, + 0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1, 0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB, + 0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6, 0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD, + 0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB, 0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF, + 0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2, 0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4, + 0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC, 0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9, + 0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD, 0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1, + 0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4, 0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7, + 0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB, 0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE, + 0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2, 0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6, + 0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4, 0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB, + 0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF, 0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5, + 0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5, 0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8, + 0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC, 0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4, + 0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2, 0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6, + 0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8, 0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB, + 0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40, 0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44, + 0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7, 0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A, + 0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E, 0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52, + 0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56, 0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A, + 0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E, 0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62, + 0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66, 0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69, + 0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D, 0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB, + 0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73, 0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77, + 0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A, 0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E, + 0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83, 0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87, + 0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A, 0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D, + 0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91, 0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95, + 0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99, 0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D, + 0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0, 0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3, + 0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7, 0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB, + 0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1, 0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2, + 0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6, 0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA, + 0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB, 0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD, + 0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE, 0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2, + 0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6, 0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6, + 0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9, 0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6, + 0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7, 0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4, + 0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0, 0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5, + 0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7, 0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB, + 0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF, 0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3, + 0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA, 0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5, + 0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8, 0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9, + 0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA, 0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE, 0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8, + 0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4, 0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8, + 0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC, 0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE, + 0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42, 0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45, + 0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3, 0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48, + 0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49, 0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C, + 0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50, 0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52, + 0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55, 0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59, + 0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D, 0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8, + 0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63, 0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66, + 0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB, 0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9, + 0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C, 0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70, + 0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9, 0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77, + 0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B, 0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C, + 0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB, 0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84, + 0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88, 0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C, + 0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F, 0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3, + 0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5, 0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98, + 0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C, 0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0, + 0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7, 0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6, + 0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3, 0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA, + 0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3, 0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2, + 0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3, 0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5, + 0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8, 0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC, + 0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF, 0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC, + 0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6, 0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9, + 0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC, 0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE, + 0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2, 0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4, + 0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8, 0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB, + 0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE, 0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2, + 0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4, 0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB, 0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF, + 0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2, 0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6, + 0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7, 0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD, + 0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040, 0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044, + 0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048, 0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B, + 0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E, 0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051, + 0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6, 0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058, + 0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C, 0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F, + 0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063, 0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067, + 0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC, 0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E, + 0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072, 0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076, + 0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A, 0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E, + 0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082, 0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086, + 0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A, 0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6, + 0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F, 0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091, + 0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8, 0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094, + 0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096, 0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099, + 0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D, 0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F, + 0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1, 0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA, + 0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB, 0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA, + 0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC, 0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE, + 0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3, 0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2, + 0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0, 0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC, + 0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA, 0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE, + 0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5, 0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0, + 0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3, 0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF, + 0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8, 0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB, + 0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE, 0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2, + 0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6, 0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9, + 0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD, 0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1, + 0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3, 0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5, + 0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4, 0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8, + 0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC, 0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0, 0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3, + 0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2, 0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4, + 0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB, 0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC, 0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43, + 0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47, 0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49, + 0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8, 0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C, 0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F, 0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52, + 0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55, 0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5, + 0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4, 0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F, + 0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE, 0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63, + 0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6, 0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9, + 0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68, 0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED, + 0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7, 0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E, + 0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71, 0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72, + 0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB, 0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78, + 0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C, 0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81, + 0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84, 0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1, + 0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A, 0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D, + 0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91, 0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94, + 0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98, 0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C, + 0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E, 0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40, + 0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44, 0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48, + 0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5, 0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F, + 0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52, 0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54, + 0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0, 0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59, + 0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1, 0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60, + 0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63, 0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3, + 0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69, 0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C, + 0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2, 0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72, 0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77, 0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6, + 0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D, 0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA, + 0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82, 0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83, + 0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87, 0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A, + 0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3, 0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90, + 0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93, 0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95, + 0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98, 0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5, + 0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F, 0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42, + 0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46, 0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A, + 0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED, 0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0, + 0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51, 0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53, + 0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57, 0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2, + 0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D, 0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1, + 0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9, 0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7, + 0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD, 0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69, + 0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3, 0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D, + 0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70, 0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73, + 0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77, 0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B, + 0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80, 0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84, + 0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87, 0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7, + 0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0, 0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C, + 0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90, 0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94, + 0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97, 0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A, + 0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE, 0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0, + 0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA, 0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44, + 0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47, 0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A, + 0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC, 0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F, + 0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53, 0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57, + 0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1, 0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D, + 0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61, 0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62, + 0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66, 0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A, + 0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E, 0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7, + 0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75, 0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79, + 0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D, 0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82, + 0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86, 0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6, + 0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D, 0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91, + 0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC, 0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF, 0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A, + 0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD, 0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0, + 0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF, 0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44, + 0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48, 0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B, + 0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E, 0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52, + 0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55, 0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57, + 0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A, 0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5, + 0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E, 0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61, + 0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64, 0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66, + 0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67, 0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7, + 0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69, 0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE, + 0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE, 0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F, + 0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72, 0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75, + 0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0, 0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79, + 0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C, 0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE, + 0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81, 0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85, + 0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8, 0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC, + 0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E, 0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4, + 0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94, 0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96, + 0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A, 0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D, + 0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE, 0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42, + 0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45, 0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA, + 0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC, 0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE, + 0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C, 0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D, + 0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E, 0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52, + 0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF, 0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54, 0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56, + 0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2, 0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B, 0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC, + 0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E, 0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7, + 0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9, 0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65, + 0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6, 0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED, 0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F, 0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71, + 0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74, 0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77, + 0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A, 0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B, + 0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D, 0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA, + 0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84, 0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87, + 0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A, 0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B, + 0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E, 0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3, + 0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD, 0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1, + 0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94, 0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97, + 0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98, 0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B, + 0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB, 0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F, + 0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041, 0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045, + 0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047, 0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B, + 0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1, 0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051, + 0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE, 0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057, + 0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A, 0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E, + 0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061, 0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064, + 0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068, 0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B, + 0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9, 0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED, + 0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4, 0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073, + 0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8, 0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078, + 0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE, 0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D, + 0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082, 0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086, + 0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089, 0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D, + 0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4, 0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4, + 0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095, 0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099, + 0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D, 0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB, + 0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8, 0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6, + 0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB, 0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0, + 0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7, 0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148, + 0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B, 0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E, + 0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151, 0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155, + 0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF, 0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4, + 0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C, 0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E, + 0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC, 0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163, + 0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166, 0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167, + 0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169, 0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D, + 0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171, 0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2, + 0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177, 0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3, + 0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6, 0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D, + 0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181, 0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184, + 0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4, 0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7, + 0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A, 0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C, + 0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F, 0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192, + 0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196, 0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198, + 0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C, 0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD, + 0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241, 0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1, + 0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0, 0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247, + 0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249, 0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D, + 0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251, 0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254, + 0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA, 0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258, + 0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A, 0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E, + 0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9, 0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7, + 0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265, 0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269, + 0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D, 0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB, + 0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271, 0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9, + 0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275, 0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278, + 0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A, 0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E, + 0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281, 0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284, + 0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288, 0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C, + 0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F, 0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293, + 0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297, 0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A, + 0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C, 0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340, 0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342, + 0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB, 0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346, + 0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6, 0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B, + 0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF, 0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0, + 0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351, 0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354, + 0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356, 0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8, + 0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9, 0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2, + 0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D, 0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360, + 0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE, 0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363, + 0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365, 0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368, + 0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B, 0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2, + 0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9, 0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F, + 0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372, 0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375, + 0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA, 0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8, + 0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC, 0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E, + 0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382, 0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386, + 0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A, 0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2, + 0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7, 0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391, + 0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395, 0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398, + 0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B, 0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F, + 0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442, 0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444, + 0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9, 0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448, + 0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B, 0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5, + 0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E, 0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450, + 0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452, 0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455, + 0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459, 0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C, 0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F, + 0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB, 0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465, + 0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468, 0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D, 0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470, + 0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472, 0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475, + 0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479, 0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D, + 0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482, 0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485, + 0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488, 0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1, + 0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E, 0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7, + 0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494, 0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497, + 0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A, 0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E, + 0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541, 0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545, + 0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548, 0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C, + 0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6, 0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553, + 0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556, 0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A, + 0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E, 0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562, + 0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565, 0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE, + 0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7, 0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B, + 0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC, 0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570, + 0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574, 0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578, + 0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6, 0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1, + 0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1, 0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2, + 0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581, 0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583, + 0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586, 0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589, + 0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D, 0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7, + 0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592, 0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594, + 0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596, 0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9, + 0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D, 0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0, + 0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643, 0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA, + 0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A, 0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E, + 0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652, 0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655, + 0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659, 0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D, + 0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660, 0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC, 0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665, + 0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1, 0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A, + 0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C, 0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB, + 0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671, 0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674, + 0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678, 0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B, + 0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8, 0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E, + 0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681, 0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683, + 0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687, 0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A, + 0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C, 0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9, 0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694, + 0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0, 0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699, + 0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C, 0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9, + 0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD, 0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743, + 0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746, 0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E, 0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752, + 0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755, 0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757, + 0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758, 0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B, + 0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2, 0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762, + 0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766, 0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769, + 0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D, 0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770, + 0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774, 0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778, + 0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C, 0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781, + 0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785, 0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788, + 0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF, 0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5, + 0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E, 0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F, + 0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9, 0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793, + 0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796, 0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF, + 0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1, 0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C, + 0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E, 0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0, + 0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC, 0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844, + 0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846, 0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A, + 0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D, 0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851, + 0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855, 0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858, + 0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C, 0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860, + 0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863, 0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867, + 0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA, 0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D, + 0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA, 0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872, + 0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5, 0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877, + 0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A, 0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D, + 0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882, 0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3, + 0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887, 0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A, + 0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA, 0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890, 0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892, + 0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894, 0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897, + 0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7, 0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C, + 0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB, 0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0, 0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942, + 0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945, 0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3, + 0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6, 0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D, + 0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950, 0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952, + 0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954, 0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2, + 0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF, 0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A, 0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1, + 0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960, 0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964, + 0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF, 0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2, + 0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C, 0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E, + 0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9, 0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973, + 0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976, 0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A, + 0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D, 0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981, + 0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983, 0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986, + 0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988, 0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE, + 0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5, 0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E, 0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991, + 0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994, 0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997, + 0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B, 0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E, + 0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD, 0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43, + 0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46, 0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49, + 0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C, 0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5, + 0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51, 0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54, + 0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7, 0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8, + 0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA, 0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F, + 0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63, 0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66, + 0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA, 0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C, + 0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70, 0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73, + 0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75, 0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78, + 0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD, 0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80, + 0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84, 0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87, + 0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3, 0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2, + 0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90, 0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94, + 0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98, 0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B, + 0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F, 0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0, + 0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43, 0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47, + 0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A, 0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E, + 0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52, 0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56, + 0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A, 0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E, + 0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62, 0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A, 0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E, + 0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70, 0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74, + 0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75, 0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79, + 0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D, 0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81, + 0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85, 0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3, + 0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A, 0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C, + 0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1, 0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2, + 0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91, 0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0, + 0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8, 0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C, 0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F, + 0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB, 0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42, + 0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45, 0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD, + 0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48, 0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C, + 0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7, 0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50, + 0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53, 0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55, + 0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59, 0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C, + 0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60, 0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63, + 0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67, 0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A, + 0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D, 0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71, + 0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75, 0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9, + 0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C, 0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81, + 0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85, 0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89, + 0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D, 0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7, + 0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93, 0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96, + 0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99, 0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C, + 0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0, 0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43, + 0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47, 0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F, 0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53, + 0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57, 0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B, + 0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F, 0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63, + 0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67, 0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B, + 0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F, 0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73, + 0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5, 0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A, + 0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E, 0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82, + 0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86, 0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A, + 0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E, 0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96, 0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A, + 0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E, 0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41, + 0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45, 0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49, + 0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB, 0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50, + 0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC, 0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57, + 0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B, 0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F, + 0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63, 0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67, + 0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B, 0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F, + 0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73, 0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B, 0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80, + 0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84, 0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88, + 0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C, 0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90, + 0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94, 0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98, + 0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C, 0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0, + 0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43, 0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47, + 0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B, 0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F, + 0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53, 0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57, + 0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B, 0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63, 0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67, + 0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B, 0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F, + 0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73, 0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77, + 0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B, 0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80, + 0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83, 0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86, + 0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A, 0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D, + 0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91, 0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95, + 0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99, 0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D, + 0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040, 0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044, + 0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048, 0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C, + 0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050, 0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054, + 0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058, 0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C, + 0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060, 0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB, + 0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067, 0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B, + 0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F, 0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073, + 0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077, 0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B, + 0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E, 0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC, 0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080, 0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA, 0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4, + 0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3, 0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8, 0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF, 0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084, 0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA, 0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0, 0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2, 0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7, 0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA, 0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2, 0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088, + 0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0, 0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0, 0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A, 0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF, 0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9, 0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE, 0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1, + 0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090, 0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF, + 0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095, 0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099, + 0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D, 0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F, + 0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140, 0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3, + 0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145, 0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5, + 0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A, 0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF, + 0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3, 0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0, + 0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153, 0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156, + 0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0, 0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C, + 0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160, 0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2, + 0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0, 0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169, + 0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C, 0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7, + 0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF, 0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173, + 0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176, 0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179, + 0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D, 0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB, + 0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183, 0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185, + 0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187, 0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189, + 0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C, 0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4, + 0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1, 0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195, + 0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197, 0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A, + 0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E, 0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F, + 0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5, 0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243, + 0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7, 0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248, + 0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B, 0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F, + 0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251, 0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253, + 0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8, 0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257, + 0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258, 0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7, + 0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9, 0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C, + 0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F, 0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC, + 0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE, 0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5, + 0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267, 0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A, + 0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE, 0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D, + 0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F, 0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4, + 0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6, 0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4, + 0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277, 0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8, + 0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D, 0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB, + 0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284, 0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288, + 0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C, 0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF, + 0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292, 0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295, + 0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299, 0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D, + 0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340, 0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342, + 0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1, 0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345, + 0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347, 0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B, + 0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4, 0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7, + 0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350, 0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB, + 0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352, 0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9, 0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD, + 0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359, 0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE, + 0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6, 0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8, 0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361, + 0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5, 0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366, + 0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6, 0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB, 0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D, + 0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F, 0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370, 0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA, 0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7, + 0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375, 0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC, + 0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0, 0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9, + 0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB, 0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF, + 0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1, 0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5, + 0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2, 0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A, + 0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E, 0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392, + 0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395, 0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5, + 0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1, 0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C, + 0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2, 0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442, + 0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3, 0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0, + 0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449, 0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B, + 0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C, 0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB, + 0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452, 0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455, + 0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458, 0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A, + 0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9, 0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E, + 0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461, 0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9, + 0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA, 0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6, + 0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468, 0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2, + 0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E, 0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470, + 0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474, 0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477, + 0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478, 0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C, + 0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2, 0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA, + 0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485, 0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489, + 0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C, 0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492, 0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC, 0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD, + 0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B, 0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F, + 0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542, 0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546, + 0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A, 0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E, + 0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551, 0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4, + 0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555, 0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559, + 0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B, 0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F, + 0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7, 0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9, + 0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF, 0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566, + 0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568, 0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6, + 0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D, 0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571, + 0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8, 0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE, + 0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576, 0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD, + 0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579, 0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A, + 0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0, 0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B, + 0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8, 0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582, + 0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585, 0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587, + 0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A, 0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D, + 0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591, 0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD, + 0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597, 0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A, + 0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E, 0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640, + 0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE, 0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB, + 0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646, 0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5, + 0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC, 0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA, + 0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F, 0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7, + 0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA, 0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2, + 0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657, 0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658, + 0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A, 0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C, + 0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB, 0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7, 0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F, + 0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661, 0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662, + 0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0, 0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667, + 0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A, 0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1, 0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D, 0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F, + 0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA, 0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671, + 0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0, 0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675, + 0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678, 0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A, + 0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D, 0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680, + 0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683, 0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF, + 0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2, 0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686, + 0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5, 0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A, + 0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C, 0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1, + 0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690, 0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694, + 0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698, 0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A, + 0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B, 0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D, + 0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8, 0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB, + 0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740, 0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743, + 0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3, 0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747, + 0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B, 0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4, + 0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E, 0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4, + 0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1, 0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753, + 0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD, 0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5, + 0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7, 0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756, + 0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A, 0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C, + 0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D, 0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761, + 0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE, 0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766, + 0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF, 0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC, + 0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F, 0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772, + 0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8, 0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776, + 0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A, 0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E, 0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2, 0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA, + 0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783, 0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785, + 0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788, 0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5, + 0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D, 0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790, + 0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5, 0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795, + 0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797, 0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798, + 0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B, 0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0, + 0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840, 0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6, + 0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845, 0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847, + 0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A, 0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D, + 0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9, 0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852, + 0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE, 0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854, + 0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858, 0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B, + 0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D, 0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861, + 0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3, 0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864, + 0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868, 0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B, + 0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F, 0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872, + 0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874, 0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878, + 0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1, 0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880, + 0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884, 0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887, + 0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B, 0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8, + 0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E, 0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891, + 0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894, 0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897, + 0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898, 0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B, + 0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3, 0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD, + 0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941, 0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9, + 0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948, 0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949, + 0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5, 0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E, + 0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952, 0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954, + 0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957, 0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A, + 0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E, 0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962, + 0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966, 0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1, + 0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B, 0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0, + 0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F, 0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971, + 0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974, 0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE, + 0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979, 0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B, + 0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD, 0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982, + 0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985, 0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987, + 0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB, 0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C, + 0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F, 0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992, + 0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996, 0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A, + 0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D, 0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0, + 0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43, 0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47, + 0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A, 0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D, + 0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50, 0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5, + 0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56, 0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58, + 0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C, 0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60, + 0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62, 0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66, + 0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A, 0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE, + 0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B, 0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F, + 0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72, 0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF, + 0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77, 0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B, + 0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1, 0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82, + 0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9, 0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89, + 0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C, 0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F, + 0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93, 0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD, + 0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99, 0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA, + 0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9, 0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40, + 0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42, 0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45, + 0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49, 0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C, + 0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50, 0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54, + 0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56, 0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A, + 0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D, 0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD, + 0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4, 0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64, + 0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68, 0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A, + 0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E, 0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71, + 0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75, 0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78, + 0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C, 0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E, + 0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81, 0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85, + 0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88, 0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C, + 0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F, 0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92, + 0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96, 0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A, + 0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E, 0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41, + 0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44, 0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47, + 0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A, 0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E, + 0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52, 0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55, + 0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1, 0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C, + 0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60, 0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64, + 0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68, 0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A, + 0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E, 0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72, + 0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76, 0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79, + 0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C, 0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81, + 0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85, 0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89, + 0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2, 0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C, + 0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F, 0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9, + 0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD, 0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD, + 0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C, 0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0, + 0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1, 0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43, + 0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47, 0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3, + 0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA, 0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC, + 0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D, 0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3, + 0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51, 0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55, + 0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57, 0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B, + 0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D, 0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61, + 0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63, 0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD, + 0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66, 0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67, + 0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0, 0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5, + 0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F, 0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72, + 0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9, 0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3, 0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78, + 0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B, 0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D, + 0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2, 0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83, + 0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86, 0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89, + 0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9, 0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E, 0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90, + 0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA, 0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4, + 0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98, 0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB, + 0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B, 0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1, + 0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0, 0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3, + 0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0, 0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC, + 0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46, 0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49, + 0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2, 0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F, + 0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52, 0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55, + 0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4, 0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A, + 0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E, 0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F, + 0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB, 0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65, + 0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68, 0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A, + 0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E, 0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71, + 0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72, 0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76, + 0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3, 0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C, + 0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB, 0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83, + 0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE, 0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB, + 0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88, 0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B, + 0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D, 0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91, + 0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94, 0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97, + 0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B, 0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E, + 0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41, 0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44, + 0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45, 0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48, + 0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A, 0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD, + 0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50, 0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53, + 0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1, 0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C, 0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61, 0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65, + 0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68, 0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B, + 0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E, 0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3, + 0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5, 0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78, + 0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C, 0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80, + 0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8, 0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87, + 0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A, 0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9, + 0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91, 0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95, + 0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6, 0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A, + 0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D, 0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0, + 0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042, 0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046, + 0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A, 0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3, + 0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051, 0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054, + 0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057, 0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A, + 0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C, 0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060, + 0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062, 0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066, + 0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069, 0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B, + 0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F, 0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9, + 0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072, 0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074, + 0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2, 0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4, + 0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B, 0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E, + 0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0, 0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7, + 0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084, 0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087, + 0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089, 0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB, + 0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4, 0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093, + 0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096, 0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8, + 0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C, 0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0, + 0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141, 0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144, + 0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148, 0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B, + 0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E, 0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1, + 0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9, 0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155, + 0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE, 0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6, + 0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D, 0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F, + 0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163, 0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166, 0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169, + 0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D, 0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F, + 0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171, 0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173, + 0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5, 0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3, + 0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C, 0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB, + 0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184, 0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD, + 0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189, 0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2, + 0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E, 0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191, + 0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194, 0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA, + 0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A, 0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D, + 0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE, 0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242, + 0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246, 0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249, + 0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C, 0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250, + 0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254, 0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258, + 0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C, 0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260, + 0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5, 0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266, + 0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0, 0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D, + 0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271, 0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275, + 0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279, 0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D, + 0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281, 0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283, + 0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2, 0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289, + 0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D, 0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291, + 0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295, 0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299, + 0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D, 0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340, + 0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344, 0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348, + 0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C, 0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350, + 0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354, 0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358, + 0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C, 0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB, + 0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3, 0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC, 0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7, + 0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB, 0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD, + 0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC, 0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C, + 0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5, 0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371, + 0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374, 0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377, + 0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A, 0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E, + 0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383, 0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386, + 0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A, 0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D, + 0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391, 0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395, + 0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399, 0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D, + 0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440, 0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444, + 0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448, 0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C, + 0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450, 0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454, + 0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458, 0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C, + 0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4, 0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463, + 0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467, 0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A, + 0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E, 0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472, + 0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476, 0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A, + 0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E, 0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483, + 0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487, 0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B, + 0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F, 0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493, + 0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497, 0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E, 0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541, + 0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545, 0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC, + 0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B, 0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F, + 0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552, 0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556, + 0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A, 0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E, + 0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562, 0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566, + 0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A, 0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E, + 0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572, 0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576, + 0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A, 0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583, 0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587, + 0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B, 0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F, + 0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593, 0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597, + 0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B, 0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F, + 0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642, 0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646, + 0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A, 0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E, + 0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652, 0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656, + 0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A, 0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E, + 0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662, 0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665, + 0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669, 0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D, + 0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671, 0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675, + 0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679, 0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D, + 0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5, 0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685, + 0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689, 0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D, + 0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691, 0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695, + 0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699, 0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D, + 0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740, 0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744, + 0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748, 0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C, + 0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750, 0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754, + 0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758, 0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C, + 0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF, 0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763, + 0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766, 0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A, + 0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E, 0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772, + 0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776, 0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A, + 0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E, 0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783, + 0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787, 0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B, + 0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F, 0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793, + 0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797, 0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6, 0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9, 0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8, 0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB, + 0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8, 0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6, 0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0, 0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4, 0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE, 0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA, 0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E, + 0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD, 0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0, 0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE, 0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB, 0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1, 0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE, 0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0, 0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB, 0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA, 0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC, + 0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF, 0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842, + 0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846, 0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849, + 0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9, 0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E, + 0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851, 0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855, + 0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858, 0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0, + 0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F, 0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF, + 0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865, 0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B, 0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F, + 0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872, 0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2, + 0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877, 0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5, + 0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D, 0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6, + 0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883, 0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887, + 0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A, 0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D, + 0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891, 0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895, + 0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899, 0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D, + 0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940, 0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944, + 0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948, 0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950, 0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954, + 0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958, 0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C, + 0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960, 0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964, + 0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968, 0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C, + 0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970, 0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974, + 0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978, 0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C, + 0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981, 0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985, + 0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989, 0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D, + 0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991, 0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995, + 0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999, 0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D, + 0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40, 0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44, + 0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48, 0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C, + 0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA, 0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB, 0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC, 0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA, + 0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC, 0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6, 0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1, 0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA, 0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51, + 0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5, 0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE, 0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2, 0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57, + 0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59, 0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C, + 0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF, 0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F, + 0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63, 0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66, + 0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68, 0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E, 0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71, + 0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74, 0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78, + 0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C, 0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80, + 0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83, 0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87, + 0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B, 0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E, + 0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F, 0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3, + 0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA, 0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96, + 0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC, 0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B, + 0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9, 0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E, + 0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5, 0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8, 0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46, + 0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48, 0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C, 0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F, + 0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51, 0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53, 0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57, + 0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A, 0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB, + 0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F, 0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62, + 0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65, 0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69, + 0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1, 0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70, 0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9, + 0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA, 0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76, + 0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79, 0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD, + 0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E, 0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5, + 0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83, 0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86, 0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7, + 0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C, 0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F, + 0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93, 0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97, + 0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4, 0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F, 0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7, + 0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA, 0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45, + 0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48, 0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A, + 0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D, 0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50, + 0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54, 0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56, + 0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59, 0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D, + 0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3, 0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63, + 0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67, 0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B, + 0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D, 0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3, + 0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73, 0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9, + 0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A, 0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E, + 0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83, 0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87, + 0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6, 0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E, + 0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92, 0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96, + 0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A, 0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E, + 0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41, 0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45, + 0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49, 0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D, + 0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51, 0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59, 0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D, + 0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61, 0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65, + 0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69, 0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D, + 0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71, 0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75, + 0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79, 0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D, + 0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82, 0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86, + 0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A, 0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E, + 0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92, 0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96, + 0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A, 0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41, 0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45, + 0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49, 0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D, + 0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51, 0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55, + 0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59, 0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D, + 0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5, 0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61, + 0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6, 0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3, 0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9, 0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE, 0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2, 0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64, + 0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD, 0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7, 0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68, + 0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B, 0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D, + 0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70, 0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72, + 0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1, 0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78, + 0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF, 0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8, + 0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E, 0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81, + 0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD, 0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86, + 0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87, 0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89, + 0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC, 0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6, + 0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8, 0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5, 0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91, + 0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94, 0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95, + 0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98, 0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA, + 0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6, 0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7, + 0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D, 0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD, + 0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1, 0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8, + 0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1, 0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA, + 0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE, 0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48, + 0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE, 0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D, + 0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4, 0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52, + 0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2, 0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC, + 0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58, 0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B, + 0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E, 0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9, + 0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61, 0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63, + 0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66, 0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD, + 0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B, 0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E, + 0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA, 0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74, + 0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76, 0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A, + 0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D, 0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2, + 0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82, 0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85, + 0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88, 0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B, + 0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D, 0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F, + 0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91, 0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE, 0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0, + 0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA, 0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B, + 0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD, 0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5, 0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040, + 0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042, 0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC, + 0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9, 0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048, + 0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B, 0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E, + 0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F, 0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB, + 0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA, 0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056, + 0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058, 0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B, + 0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E, 0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061, + 0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1, 0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5, + 0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069, 0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D, + 0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071, 0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075, + 0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079, 0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C, + 0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4, 0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3, + 0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086, 0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A, + 0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E, 0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090, + 0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094, 0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097, + 0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B, 0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F, + 0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA, 0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA, + 0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC, 0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6, + 0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147, 0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3, + 0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA, 0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1, + 0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E, 0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2, + 0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA, 0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8, + 0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8, 0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154, + 0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7, 0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159, + 0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C, 0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E, + 0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F, 0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1, + 0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164, 0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1, + 0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A, 0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170, 0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2, + 0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4, 0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178, + 0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A, 0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8, + 0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182, 0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186, + 0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A, 0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD, + 0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0, 0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E, + 0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192, 0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196, + 0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199, 0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D, + 0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240, 0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244, + 0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248, 0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C, + 0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250, 0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254, + 0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258, 0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C, + 0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260, 0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264, + 0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268, 0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C, + 0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270, 0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274, + 0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278, 0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C, + 0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281, 0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285, + 0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289, 0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D, + 0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291, 0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295, + 0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299, 0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D, + 0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340, 0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344, + 0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348, 0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C, + 0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350, 0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354, + 0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358, 0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C, + 0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360, 0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364, + 0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368, 0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C, + 0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F, 0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373, + 0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377, 0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B, + 0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380, 0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384, + 0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6, 0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B, + 0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F, 0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393, + 0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397, 0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B, + 0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F, 0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442, + 0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7, 0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449, + 0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D, 0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451, + 0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455, 0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459, + 0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D, 0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460, + 0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464, 0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468, + 0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C, 0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470, + 0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474, 0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478, + 0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C, 0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481, + 0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485, 0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489, + 0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D, 0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491, + 0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495, 0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499, + 0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D, 0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540, + 0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544, 0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548, + 0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C, 0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550, + 0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554, 0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558, + 0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C, 0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560, + 0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564, 0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568, + 0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C, 0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570, + 0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9, 0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577, + 0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B, 0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580, + 0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584, 0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588, + 0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C, 0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590, + 0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594, 0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598, + 0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C, 0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA, + 0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642, 0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646, + 0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A, 0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E, + 0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652, 0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656, + 0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A, 0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E, + 0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662, 0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665, + 0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669, 0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D, + 0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671, 0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675, + 0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679, 0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D, + 0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682, 0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686, + 0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A, 0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E, + 0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692, 0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696, + 0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A, 0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB, + 0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740, 0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744, + 0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9, 0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B, + 0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F, 0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753, + 0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757, 0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B, + 0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F, 0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763, + 0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767, 0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B, + 0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F, 0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773, + 0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777, 0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B, + 0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780, 0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784, + 0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788, 0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C, + 0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790, 0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794, + 0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798, 0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C, + 0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0, 0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843, + 0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847, 0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B, + 0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD, 0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852, + 0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856, 0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A, + 0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E, 0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862, + 0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866, 0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A, + 0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E, 0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872, + 0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876, 0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A, + 0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D, 0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882, + 0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886, 0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A, + 0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E, 0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892, + 0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5, 0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8, + 0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5, 0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0, + 0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896, 0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0, + 0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE, 0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5, 0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6, + 0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5, 0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD, 0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8, 0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD, 0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC, 0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF, + 0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1, 0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C, + 0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6, 0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D, 0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3, 0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8, 0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC, + 0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4, 0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE, + 0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF, 0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2, + 0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4, 0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6, + 0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA, 0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA, + 0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE, 0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0, + 0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5, 0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1, + 0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC, 0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6, + 0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8, 0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1, + 0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC, 0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE, + 0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2, 0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7, + 0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5, 0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7, + 0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA, 0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947, + 0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF, 0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3, + 0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6, 0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA, + 0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949, 0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF, + 0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2, 0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F, + 0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953, 0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956, + 0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A, 0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E, + 0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962, 0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966, + 0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A, 0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E, + 0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972, 0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976, + 0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A, 0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E, + 0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983, 0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987, + 0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B, 0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F, + 0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993, 0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997, + 0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B, 0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F, + 0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42, 0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46, + 0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A, 0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E, + 0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52, 0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56, + 0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A, 0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA, 0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA, 0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC, 0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2, + 0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF, 0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1, + 0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6, 0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6, + 0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8, 0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB, + 0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62, 0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3, + 0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67, 0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6, + 0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE, 0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0, + 0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7, 0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73, + 0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74, 0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9, + 0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD, 0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77, + 0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78, 0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B, + 0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D, 0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82, + 0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85, 0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA, + 0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89, 0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3, + 0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C, 0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF, + 0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5, 0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93, + 0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97, 0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B, + 0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1, 0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0, + 0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41, 0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43, + 0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46, 0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47, + 0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A, 0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E, + 0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52, 0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55, + 0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59, 0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C, + 0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5, 0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61, + 0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1, 0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64, + 0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF, 0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67, + 0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2, 0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3, + 0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D, 0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71, + 0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75, 0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78, + 0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C, 0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9, + 0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82, 0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85, + 0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3, 0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89, + 0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED, 0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E, + 0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA, 0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91, + 0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE, 0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96, + 0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8, 0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C, + 0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC, 0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41, + 0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45, 0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF, + 0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B, 0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6, + 0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51, 0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53, + 0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2, 0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A, + 0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E, 0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62, + 0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66, 0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0, + 0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8, 0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E, + 0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7, 0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6, + 0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74, 0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77, + 0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B, 0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80, + 0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0, 0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85, + 0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88, 0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C, + 0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F, 0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93, + 0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95, 0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3, + 0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A, 0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D, + 0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40, 0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43, + 0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46, 0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A, + 0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C, 0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8, + 0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51, 0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55, + 0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59, 0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D, + 0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61, 0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65, + 0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69, 0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D, + 0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71, 0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75, + 0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79, 0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D, + 0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4, 0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83, 0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87, + 0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8, 0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C, + 0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90, 0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94, + 0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98, 0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C, + 0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0, 0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43, + 0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47, 0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B, + 0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F, 0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53, + 0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57, 0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B, + 0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F, 0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63, + 0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67, 0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B, + 0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F, 0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73, + 0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77, 0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B, + 0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80, 0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84, + 0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88, 0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C, + 0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90, 0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94, + 0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98, 0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C, + 0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0, 0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43, + 0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5, 0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3, + 0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB, 0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC, + 0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC, 0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5, + 0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47, 0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48, + 0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1, 0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6, + 0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8, 0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB, + 0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD, 0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E, + 0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52, 0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56, + 0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A, 0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E, + 0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62, 0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66, + 0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A, 0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E, + 0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7, 0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA, + 0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75, 0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE, + 0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9, 0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C, + 0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81, 0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83, + 0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87, 0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B, + 0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F, 0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93, + 0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97, 0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B, + 0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F, 0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042, + 0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045, 0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048, + 0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C, 0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050, + 0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054, 0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058, + 0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C, 0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060, + 0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1, 0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067, + 0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B, 0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F, + 0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073, 0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077, + 0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B, 0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080, + 0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084, 0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088, + 0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A, 0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E, + 0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092, 0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096, + 0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098, 0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF, + 0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB, 0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7, + 0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4, 0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8, + 0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D, 0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E, + 0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD, 0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8, + 0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141, 0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8, + 0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7, 0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142, + 0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146, 0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A, + 0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D, 0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150, + 0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154, 0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158, + 0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C, 0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160, + 0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164, 0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168, + 0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C, 0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170, + 0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174, 0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178, + 0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C, 0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181, + 0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185, 0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189, + 0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D, 0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191, + 0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195, 0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199, + 0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D, 0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240, + 0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244, 0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248, + 0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C, 0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250, + 0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254, 0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258, + 0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C, 0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260, + 0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264, 0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268, + 0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C, 0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270, + 0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274, 0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278, + 0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C, 0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281, + 0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285, 0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289, + 0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D, 0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291, + 0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295, 0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299, + 0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D, 0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340, + 0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344, 0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348, + 0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C, 0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350, + 0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4, 0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352, + 0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB, 0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD, 0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE, + 0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6, 0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356, 0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE, 0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9, 0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A, 0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C, + 0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360, 0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362, + 0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE, 0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF, + 0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369, 0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4, + 0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D, 0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371, + 0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373, 0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376, + 0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379, 0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C, + 0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381, 0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383, + 0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6, 0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A, + 0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C, 0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F, + 0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393, 0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396, + 0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399, 0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D, + 0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0, 0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442, + 0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446, 0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449, + 0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C, 0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450, + 0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454, 0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457, + 0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A, 0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E, + 0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462, 0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA, + 0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468, 0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C, + 0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E, 0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471, 0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472, + 0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475, 0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477, + 0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A, 0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483, 0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487, + 0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B, 0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F, + 0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493, 0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497, + 0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B, 0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F, + 0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542, 0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546, + 0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A, 0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E, + 0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552, 0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556, + 0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A, 0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E, + 0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562, 0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566, + 0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A, 0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E, + 0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572, 0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576, + 0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A, 0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E, + 0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583, 0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587, + 0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B, 0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F, + 0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593, 0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597, + 0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B, 0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F, + 0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642, 0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646, + 0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A, 0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652, 0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656, + 0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A, 0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E, + 0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662, 0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666, + 0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A, 0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E, + 0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672, 0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676, + 0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A, 0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E, + 0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683, 0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687, + 0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B, 0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F, + 0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693, 0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697, + 0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B, 0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F, + 0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742, 0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746, + 0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A, 0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E, + 0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752, 0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756, + 0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A, 0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E, + 0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762, 0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766, + 0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A, 0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E, + 0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772, 0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776, + 0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A, 0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782, 0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0, + 0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2, 0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787, + 0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7, 0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA, + 0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B, 0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF, 0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6, 0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790, + 0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC, 0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3, 0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794, 0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798, + 0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB, 0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3, 0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C, + 0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE, 0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D, + 0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB, 0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF, + 0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843, 0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847, + 0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B, 0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F, + 0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853, 0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857, + 0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B, 0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F, + 0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863, 0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867, + 0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B, 0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F, + 0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873, 0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877, + 0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B, 0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880, + 0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884, 0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888, + 0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C, 0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890, + 0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894, 0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898, + 0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C, 0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0, + 0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943, 0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947, + 0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B, 0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F, + 0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953, 0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957, + 0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B, 0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F, + 0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963, 0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967, + 0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B, 0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F, + 0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973, 0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977, + 0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B, 0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980, + 0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984, 0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988, + 0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C, 0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990, + 0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994, 0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998, + 0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C, 0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0, + 0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43, 0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47, + 0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B, 0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F, + 0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53, 0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57, + 0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B, 0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F, + 0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63, 0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67, + 0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B, 0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F, + 0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73, 0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77, + 0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B, 0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84, 0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88, + 0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C, 0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90, + 0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94, 0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98, + 0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C, 0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0, + 0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43, 0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47, + 0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B, 0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F, + 0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53, 0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57, + 0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B, 0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB, 0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E, 0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8, 0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC, + 0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD, 0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1, 0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7, 0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66, + 0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69, 0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE, 0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F, + 0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0, 0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71, 0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73, + 0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76, 0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A, + 0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA, 0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4, + 0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84, 0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86, + 0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89, 0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F, 0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93, + 0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96, 0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99, + 0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3, 0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0, + 0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43, 0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47, + 0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A, 0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D, + 0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2, 0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52, + 0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55, 0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58, + 0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8, 0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C, + 0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F, 0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62, + 0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63, 0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1, + 0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67, 0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5, + 0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C, 0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F, + 0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73, 0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76, + 0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC, 0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80, 0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84, + 0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6, 0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88, + 0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B, 0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D, + 0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91, 0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7, + 0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97, 0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B, + 0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E, 0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40, + 0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44, 0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46, + 0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD, 0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B, + 0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E, 0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56, 0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58, + 0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C, 0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60, + 0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64, 0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68, + 0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C, 0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70, + 0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74, 0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78, + 0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C, 0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81, + 0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85, 0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87, + 0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6, 0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89, 0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91, 0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96, 0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98, + 0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C, 0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0, + 0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43, 0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47, + 0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B, 0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F, + 0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5, 0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1, + 0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF, 0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5, + 0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB, 0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B, + 0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F, 0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973, + 0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977, 0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B, + 0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980, 0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984, + 0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA, 0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4, + 0, 0 +}; + +static const WCHAR oem2uni936[] = { /* GBK --> Unicode pairs */ + 0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05, 0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17, + 0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23, 0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F, + 0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37, 0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42, + 0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51, 0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B, + 0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65, 0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B, + 0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F, 0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76, + 0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A, 0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F, + 0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83, 0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A, + 0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99, 0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3, + 0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1, 0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8, + 0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE, 0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0, + 0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC, 0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7, + 0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF, 0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9, + 0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00, 0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05, + 0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B, 0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14, + 0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D, 0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29, + 0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31, 0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39, + 0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40, 0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45, + 0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A, 0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54, + 0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66, 0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D, + 0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75, 0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A, + 0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82, 0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A, + 0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92, 0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98, + 0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E, 0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4, + 0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1, 0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6, + 0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA, 0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE, + 0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6, 0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB, + 0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3, 0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9, + 0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4, 0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC, + 0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5, 0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB, + 0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000, 0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004, + 0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008, 0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E, + 0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015, 0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D, + 0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023, 0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F, + 0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033, 0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037, + 0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D, 0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042, + 0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049, 0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050, + 0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054, 0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059, + 0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F, 0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063, + 0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068, 0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D, + 0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071, 0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075, + 0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C, 0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083, + 0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089, 0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E, + 0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092, 0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096, + 0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A, 0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E, + 0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2, 0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB, + 0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0, 0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5, + 0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9, 0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF, + 0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3, 0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7, + 0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB, 0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0, + 0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4, 0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9, + 0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE, 0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2, + 0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8, 0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF, + 0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4, 0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9, + 0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE, 0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102, + 0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108, 0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D, + 0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111, 0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116, + 0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A, 0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E, + 0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123, 0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127, + 0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B, 0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F, + 0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133, 0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137, + 0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B, 0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142, + 0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E, 0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153, + 0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B, 0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160, + 0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166, 0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F, + 0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F, 0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187, + 0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F, 0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194, + 0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E, 0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6, + 0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA, 0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8, + 0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF, 0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5, + 0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE, 0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4, + 0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8, 0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE, + 0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5, 0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9, + 0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1, 0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE, + 0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B, 0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213, + 0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E, 0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223, + 0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A, 0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232, + 0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E, 0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247, + 0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E, 0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255, + 0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A, 0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260, + 0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266, 0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D, + 0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273, 0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277, + 0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B, 0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283, + 0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287, 0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C, + 0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291, 0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296, + 0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A, 0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6, + 0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0, 0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7, + 0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB, 0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1, + 0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6, 0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD, + 0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3, 0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9, + 0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD, 0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2, + 0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7, 0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB, + 0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF, 0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4, + 0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8, 0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301, + 0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307, 0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C, + 0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313, 0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C, + 0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324, 0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329, + 0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F, 0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333, + 0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337, 0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340, + 0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B, 0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354, + 0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D, 0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C, + 0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379, 0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E, + 0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387, 0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F, + 0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393, 0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399, + 0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0, 0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA, + 0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF, 0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3, + 0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8, 0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD, + 0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4, 0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE, + 0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3, 0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD, + 0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7, 0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF, + 0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407, 0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419, + 0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424, 0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433, + 0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D, 0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444, + 0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C, 0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451, + 0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F, 0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465, + 0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B, 0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F, + 0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A, 0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483, + 0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489, 0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493, + 0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E, 0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2, + 0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2, 0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9, + 0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3, 0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6, + 0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1, 0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB, + 0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1, 0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7, + 0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE, 0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504, + 0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B, 0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512, + 0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517, 0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C, + 0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521, 0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529, + 0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534, 0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539, + 0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540, 0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548, + 0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E, 0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553, + 0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559, 0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E, + 0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563, 0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F, + 0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573, 0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D, + 0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C, 0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592, + 0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597, 0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0, + 0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4, 0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9, + 0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD, 0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2, + 0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA, 0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1, + 0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7, 0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE, + 0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7, 0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB, + 0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7, 0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0, + 0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8, 0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC, + 0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604, 0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A, + 0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611, 0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615, + 0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A, 0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621, + 0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628, 0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E, + 0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635, 0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C, + 0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641, 0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645, + 0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649, 0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650, + 0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655, 0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D, + 0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661, 0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667, + 0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670, 0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675, + 0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A, 0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680, + 0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684, 0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A, + 0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690, 0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695, + 0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699, 0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D, + 0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1, 0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6, + 0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA, 0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE, + 0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3, 0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8, + 0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD, 0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1, + 0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5, 0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9, + 0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE, 0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2, + 0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8, 0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5, + 0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9, 0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF, + 0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7, 0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700, + 0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707, 0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E, + 0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712, 0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716, + 0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A, 0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720, + 0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725, 0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731, + 0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736, 0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D, + 0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744, 0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749, + 0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754, 0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759, + 0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767, 0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771, + 0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778, 0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E, + 0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787, 0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D, + 0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791, 0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797, + 0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C, 0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5, + 0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF, 0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5, + 0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA, 0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE, + 0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4, 0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8, + 0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD, 0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6, + 0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE, 0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5, + 0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9, 0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE, + 0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3, 0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB, + 0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801, 0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808, + 0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E, 0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813, + 0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818, 0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D, + 0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825, 0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829, + 0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E, 0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833, + 0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838, 0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C, + 0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840, 0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845, + 0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849, 0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F, + 0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855, 0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A, + 0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F, 0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863, + 0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868, 0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E, + 0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872, 0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876, + 0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A, 0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F, + 0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887, 0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C, + 0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890, 0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896, + 0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C, 0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2, + 0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6, 0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC, + 0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0, 0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4, + 0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8, 0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD, + 0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2, 0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7, + 0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB, 0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF, + 0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4, 0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9, + 0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD, 0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1, + 0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6, 0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA, + 0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2, 0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8, + 0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD, 0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901, + 0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908, 0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C, + 0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912, 0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B, + 0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921, 0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928, + 0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933, 0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D, + 0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943, 0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C, + 0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953, 0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D, + 0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963, 0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968, + 0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C, 0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970, + 0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977, 0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E, + 0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989, 0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F, + 0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995, 0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C, + 0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1, 0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC, + 0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3, 0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7, + 0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD, 0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2, + 0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7, 0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD, + 0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6, 0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF, + 0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4, 0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA, + 0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF, 0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3, + 0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7, 0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD, + 0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A, 0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F, + 0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15, 0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A, + 0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21, 0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27, + 0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C, 0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30, + 0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38, 0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D, + 0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42, 0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47, + 0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D, 0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51, + 0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56, 0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B, + 0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F, 0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64, + 0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69, 0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E, + 0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72, 0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B, + 0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80, 0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84, + 0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88, 0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C, + 0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90, 0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95, + 0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99, 0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F, + 0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3, 0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7, + 0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC, 0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0, + 0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7, 0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC, + 0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3, 0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7, + 0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD, 0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1, + 0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9, 0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE, + 0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5, 0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC, + 0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0, 0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5, + 0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9, 0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD, + 0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01, 0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05, + 0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A, 0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E, + 0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12, 0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18, + 0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C, 0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20, + 0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24, 0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28, + 0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C, 0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30, + 0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36, 0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B, + 0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F, 0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44, + 0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48, 0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C, + 0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52, 0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61, + 0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D, 0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74, + 0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79, 0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F, + 0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D, 0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92, + 0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7, 0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD, + 0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2, 0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC, + 0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8, 0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD, + 0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4, 0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8, + 0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC, 0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6, + 0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB, 0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1, + 0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5, 0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE, + 0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05, 0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C, + 0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12, 0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B, + 0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21, 0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29, + 0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E, 0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33, + 0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43, 0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C, + 0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54, 0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A, + 0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F, 0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68, + 0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C, 0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73, + 0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77, 0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D, + 0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84, 0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89, + 0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F, 0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D, + 0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1, 0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7, + 0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF, 0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6, + 0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC, 0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3, + 0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8, 0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD, + 0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1, 0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6, + 0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB, 0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF, + 0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7, 0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE, + 0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3, 0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7, + 0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC, 0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00, + 0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08, 0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C, + 0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11, 0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17, + 0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C, 0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21, + 0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28, 0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F, + 0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33, 0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38, + 0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C, 0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42, + 0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46, 0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E, + 0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52, 0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56, + 0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C, 0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61, + 0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65, 0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A, + 0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71, 0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76, + 0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A, 0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E, + 0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83, 0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87, + 0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B, 0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F, + 0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93, 0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97, + 0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C, 0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1, + 0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5, 0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9, + 0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD, 0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1, + 0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5, 0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA, + 0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE, 0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2, + 0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7, 0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB, + 0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0, 0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4, + 0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8, 0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF, + 0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA, 0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5, + 0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA, 0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00, + 0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A, 0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12, + 0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F, 0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23, + 0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29, 0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F, + 0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34, 0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A, + 0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41, 0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48, + 0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D, 0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51, + 0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57, 0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C, + 0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63, 0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67, + 0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B, 0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F, + 0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77, 0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82, + 0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89, 0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92, + 0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1, 0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8, + 0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC, 0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1, + 0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB, 0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0, + 0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4, 0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8, + 0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE, 0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5, + 0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA, 0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF, + 0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3, 0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7, + 0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED, 0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1, + 0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8, 0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD, + 0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09, 0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10, + 0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19, 0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E, + 0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24, 0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E, + 0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34, 0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38, + 0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F, 0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44, + 0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48, 0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C, + 0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51, 0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B, + 0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60, 0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68, + 0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72, 0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78, + 0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F, 0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E, + 0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94, 0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D, + 0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2, 0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6, + 0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC, 0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2, + 0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8, 0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE, + 0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2, 0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB, + 0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5, 0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE, + 0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5, 0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC, + 0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3, 0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9, + 0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008, 0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010, + 0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018, 0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022, + 0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D, 0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032, + 0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037, 0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D, + 0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045, 0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049, + 0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F, 0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056, + 0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C, 0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061, + 0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071, 0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077, + 0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082, 0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088, + 0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F, 0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095, + 0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C, 0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4, + 0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA, 0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5, + 0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA, 0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0, + 0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4, 0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC, + 0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0, 0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6, + 0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE, 0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4, + 0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2, 0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB, + 0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF, 0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105, + 0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C, 0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113, + 0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118, 0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D, + 0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125, 0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C, + 0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130, 0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134, + 0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138, 0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C, + 0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141, 0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145, + 0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B, 0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152, + 0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157, 0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B, + 0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160, 0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165, + 0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B, 0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F, + 0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174, 0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A, + 0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E, 0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182, + 0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186, 0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A, + 0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190, 0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195, + 0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199, 0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E, + 0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2, 0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6, + 0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE, 0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2, + 0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6, 0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB, + 0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0, 0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5, + 0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC, 0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0, + 0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7, 0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB, + 0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF, 0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3, + 0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8, 0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC, + 0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0, 0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4, + 0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9, 0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD, + 0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202, 0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207, + 0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219, 0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220, + 0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228, 0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F, + 0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235, 0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A, + 0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244, 0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F, + 0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257, 0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D, + 0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261, 0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268, + 0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275, 0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B, + 0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283, 0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288, + 0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E, 0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299, + 0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3, 0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA, + 0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0, 0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6, + 0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE, 0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB, + 0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD, 0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4, + 0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2, 0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA, + 0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304, 0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B, + 0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310, 0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315, + 0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C, 0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C, + 0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331, 0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336, + 0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C, 0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341, + 0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A, 0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354, + 0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359, 0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D, + 0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366, 0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C, + 0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373, 0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379, + 0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F, 0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385, + 0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391, 0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397, + 0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C, 0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1, + 0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF, 0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6, + 0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF, 0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3, + 0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA, 0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3, + 0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8, 0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC, + 0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4, 0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8, + 0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF, 0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5, + 0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB, 0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404, + 0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409, 0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411, + 0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417, 0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D, + 0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424, 0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429, + 0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430, 0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435, + 0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439, 0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440, + 0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B, 0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F, + 0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455, 0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A, + 0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F, 0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463, + 0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468, 0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E, + 0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472, 0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476, + 0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D, 0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481, + 0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489, 0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D, + 0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493, 0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A, + 0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F, 0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3, + 0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8, 0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1, + 0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6, 0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE, + 0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4, 0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9, + 0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF, 0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5, + 0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB, 0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0, + 0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7, 0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB, + 0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF, 0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3, + 0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7, 0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB, + 0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF, 0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504, + 0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508, 0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D, + 0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511, 0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516, + 0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B, 0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F, + 0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523, 0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528, + 0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D, 0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533, + 0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D, 0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543, + 0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A, 0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550, + 0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557, 0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F, + 0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565, 0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A, + 0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571, 0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578, + 0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C, 0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580, + 0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584, 0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589, + 0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F, 0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596, + 0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E, 0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6, + 0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE, 0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4, + 0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8, 0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF, + 0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8, 0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0, + 0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5, 0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB, + 0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF, 0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA, + 0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4, 0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB, + 0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF, 0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607, + 0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D, 0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616, + 0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B, 0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622, + 0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629, 0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E, + 0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637, 0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B, + 0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642, 0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647, + 0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D, 0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658, + 0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D, 0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663, + 0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A, 0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671, + 0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678, 0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D, + 0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683, 0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689, + 0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E, 0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693, + 0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699, 0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E, + 0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2, 0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6, + 0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC, 0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1, + 0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6, 0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB, + 0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0, 0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4, + 0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8, 0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC, + 0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0, 0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4, + 0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8, 0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0, + 0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4, 0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA, + 0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE, 0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6, + 0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD, 0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704, + 0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C, 0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712, + 0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719, 0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720, + 0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724, 0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E, + 0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736, 0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B, + 0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741, 0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A, + 0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754, 0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759, + 0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762, 0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767, + 0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771, 0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779, + 0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780, 0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786, + 0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D, 0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792, + 0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799, 0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1, + 0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC, 0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4, + 0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC, 0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0, + 0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7, 0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB, + 0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5, 0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF, + 0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6, 0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB, + 0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5, 0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9, + 0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE, 0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804, + 0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812, 0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819, + 0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E, 0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823, + 0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827, 0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D, + 0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831, 0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A, + 0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B, 0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856, + 0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A, 0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E, + 0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D, 0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871, + 0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878, 0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C, + 0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880, 0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888, + 0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C, 0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891, + 0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896, 0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B, + 0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F, 0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4, + 0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB, 0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2, + 0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8, 0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC, + 0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1, 0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6, + 0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC, 0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1, + 0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7, 0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD, + 0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2, 0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7, + 0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB, 0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2, + 0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7, 0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE, + 0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903, 0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908, + 0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F, 0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915, + 0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919, 0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D, + 0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923, 0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928, + 0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C, 0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932, + 0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937, 0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C, + 0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943, 0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947, + 0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B, 0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F, + 0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953, 0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959, + 0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961, 0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967, + 0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C, 0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972, + 0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976, 0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E, + 0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985, 0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E, + 0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992, 0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999, + 0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F, 0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3, + 0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9, 0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF, + 0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5, 0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA, + 0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF, 0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4, + 0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8, 0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF, + 0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5, 0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9, + 0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE, 0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4, + 0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8, 0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC, + 0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1, 0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6, + 0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA, 0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00, + 0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04, 0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08, + 0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D, 0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11, + 0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15, 0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B, + 0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20, 0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25, + 0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B, 0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30, + 0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36, 0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A, + 0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40, 0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45, + 0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A, 0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E, + 0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53, 0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57, + 0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E, 0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63, + 0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68, 0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C, + 0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70, 0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75, + 0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A, 0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F, + 0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85, 0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89, + 0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D, 0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94, + 0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99, 0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D, + 0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2, 0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6, + 0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD, 0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1, + 0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5, 0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9, + 0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD, 0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1, + 0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5, 0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9, + 0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD, 0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1, + 0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5, 0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9, + 0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD, 0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1, + 0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5, 0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9, + 0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED, 0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1, + 0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5, 0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9, + 0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD, 0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01, + 0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05, 0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09, + 0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D, 0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11, + 0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15, 0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19, + 0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D, 0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26, + 0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B, 0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F, + 0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34, 0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B, + 0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40, 0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45, + 0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D, 0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51, + 0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55, 0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A, + 0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E, 0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68, + 0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D, 0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71, + 0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75, 0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A, + 0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80, 0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E, + 0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94, 0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99, + 0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F, 0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4, + 0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8, 0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD, + 0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1, 0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9, + 0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD, 0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4, + 0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9, 0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0, + 0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC, 0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0, + 0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5, 0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9, + 0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0, 0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6, + 0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB, 0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00, + 0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04, 0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B, + 0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17, 0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20, + 0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C, 0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36, + 0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B, 0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43, + 0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B, 0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F, + 0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56, 0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62, + 0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67, 0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E, + 0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75, 0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B, + 0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84, 0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D, + 0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95, 0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A, + 0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0, 0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF, + 0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6, 0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1, + 0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7, 0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE, + 0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8, 0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD, + 0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7, 0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2, + 0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00, 0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06, + 0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D, 0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13, + 0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18, 0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20, + 0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24, 0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C, + 0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34, 0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A, + 0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44, 0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55, + 0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B, 0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62, + 0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68, 0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70, + 0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75, 0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B, + 0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80, 0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86, + 0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D, 0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96, + 0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A, 0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC, + 0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3, 0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9, + 0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD, 0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3, + 0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD, 0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2, + 0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7, 0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF, + 0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7, 0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED, + 0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4, 0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA, + 0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00, 0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04, + 0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09, 0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13, + 0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B, 0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22, + 0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A, 0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31, + 0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37, 0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D, + 0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41, 0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47, + 0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B, 0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51, + 0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59, 0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E, + 0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63, 0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67, + 0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C, 0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71, + 0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75, 0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79, + 0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D, 0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84, + 0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B, 0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91, + 0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95, 0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A, + 0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0, 0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6, + 0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC, 0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3, + 0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC, 0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3, + 0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8, 0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD, + 0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6, 0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC, + 0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA, 0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE, + 0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2, 0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7, + 0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC, 0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00, + 0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05, 0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B, + 0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10, 0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17, + 0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B, 0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F, + 0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25, 0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C, + 0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34, 0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39, + 0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D, 0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42, + 0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48, 0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E, + 0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52, 0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56, + 0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B, 0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61, + 0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67, 0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B, + 0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71, 0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77, + 0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E, 0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82, + 0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87, 0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90, + 0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94, 0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98, + 0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D, 0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2, + 0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6, 0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB, + 0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF, 0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4, + 0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA, 0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE, + 0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4, 0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8, + 0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD, 0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3, + 0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7, 0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB, + 0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2, 0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6, + 0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA, 0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0, + 0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4, 0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8, + 0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC, 0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000, + 0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004, 0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008, + 0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C, 0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010, + 0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015, 0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019, + 0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F, 0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024, + 0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028, 0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C, + 0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030, 0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034, + 0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A, 0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E, + 0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042, 0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046, + 0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A, 0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050, + 0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054, 0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058, + 0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C, 0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061, + 0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065, 0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069, + 0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072, 0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079, + 0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081, 0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086, + 0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C, 0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091, + 0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A, 0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0, + 0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4, 0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8, + 0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2, 0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA, + 0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5, 0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB, + 0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF, 0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3, + 0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7, 0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE, + 0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3, 0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0, + 0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4, 0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA, + 0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF, 0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103, + 0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107, 0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D, + 0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112, 0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C, + 0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120, 0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124, + 0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129, 0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D, + 0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134, 0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139, + 0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D, 0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141, + 0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146, 0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B, + 0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151, 0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155, + 0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159, 0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F, + 0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163, 0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B, + 0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170, 0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176, + 0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C, 0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181, + 0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186, 0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B, + 0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190, 0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195, + 0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B, 0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1, + 0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5, 0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA, + 0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF, 0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4, + 0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA, 0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE, + 0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2, 0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7, + 0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB, 0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0, + 0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6, 0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA, + 0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE, 0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3, + 0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9, 0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED, + 0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2, 0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6, + 0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB, 0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF, + 0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203, 0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208, + 0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C, 0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210, + 0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214, 0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218, + 0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C, 0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221, + 0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225, 0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B, + 0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232, 0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C, + 0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242, 0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246, + 0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E, 0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253, + 0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258, 0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260, + 0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268, 0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D, + 0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274, 0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B, + 0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283, 0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288, + 0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290, 0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295, + 0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299, 0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D, + 0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2, 0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6, + 0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA, 0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2, + 0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB, 0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF, + 0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7, 0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC, + 0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4, 0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA, + 0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8, + 0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E, 0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019, + 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, + 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011, + 0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236, 0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F, + 0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237, 0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220, + 0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E, 0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D, + 0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F, 0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235, + 0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0, 0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04, + 0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030, 0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605, + 0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7, 0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3, + 0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190, 0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170, + 0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174, 0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178, + 0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A, 0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E, + 0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492, 0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496, + 0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A, 0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476, + 0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A, 0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E, + 0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482, 0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486, + 0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462, 0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466, + 0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220, 0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224, + 0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228, 0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162, + 0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166, 0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A, + 0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, 0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041, + 0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045, 0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049, + 0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D, 0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051, + 0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055, 0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059, + 0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D, 0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061, + 0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065, 0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069, + 0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D, 0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071, + 0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075, 0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079, + 0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D, 0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081, + 0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085, 0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089, + 0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D, 0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091, + 0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2, 0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6, + 0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA, 0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE, + 0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2, 0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6, + 0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA, 0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE, + 0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2, 0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6, + 0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA, 0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE, + 0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2, 0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6, + 0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA, 0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE, + 0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2, 0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6, + 0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA, 0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE, + 0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2, 0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6, + 0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394, 0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398, + 0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C, 0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0, + 0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5, 0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9, + 0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4, 0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8, + 0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC, 0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0, + 0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5, 0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9, + 0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A, 0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E, + 0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44, 0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38, + 0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410, 0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414, + 0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417, 0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B, + 0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F, 0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423, + 0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427, 0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B, + 0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F, 0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433, + 0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436, 0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A, + 0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E, 0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442, + 0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446, 0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A, + 0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E, 0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9, + 0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035, 0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197, + 0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F, 0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267, + 0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552, 0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556, + 0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A, 0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E, + 0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562, 0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566, + 0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A, 0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E, + 0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572, 0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583, + 0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587, 0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B, + 0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F, 0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC, + 0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4, 0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012, + 0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1, 0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9, + 0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED, 0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3, + 0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA, 0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8, + 0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA, 0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261, + 0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108, 0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C, + 0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110, 0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114, + 0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118, 0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C, + 0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120, 0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124, + 0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128, 0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023, + 0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027, 0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E, + 0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E, 0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1, + 0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2, 0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010, + 0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD, 0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E, + 0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C, 0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50, + 0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55, 0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A, + 0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E, 0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62, + 0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66, 0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B, + 0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502, 0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506, + 0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A, 0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E, + 0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512, 0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516, + 0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A, 0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E, + 0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522, 0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526, + 0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A, 0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E, + 0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532, 0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536, + 0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A, 0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E, + 0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542, 0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546, + 0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A, 0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF, + 0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5, 0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB, + 0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD, 0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302, + 0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307, 0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C, + 0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311, 0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319, + 0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323, 0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328, + 0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332, 0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A, + 0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340, 0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344, + 0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348, 0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C, + 0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353, 0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358, + 0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C, 0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361, + 0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365, 0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369, + 0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370, 0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374, + 0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378, 0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C, + 0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381, 0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386, + 0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D, 0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393, + 0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398, 0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D, + 0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3, 0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7, + 0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD, 0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6, + 0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD, 0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3, + 0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7, 0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2, + 0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6, 0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB, + 0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1, 0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6, + 0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC, 0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1, + 0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6, 0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA, + 0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE, 0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402, + 0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B, 0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411, + 0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415, 0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419, + 0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F, 0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424, + 0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D, 0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437, + 0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B, 0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440, + 0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445, 0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449, + 0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D, 0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451, + 0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456, 0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461, + 0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465, 0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469, + 0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E, 0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473, + 0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479, 0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D, + 0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485, 0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A, + 0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491, 0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495, + 0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499, 0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F, + 0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3, 0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA, + 0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE, 0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2, + 0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6, 0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB, + 0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF, 0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3, + 0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7, 0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB, + 0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF, 0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4, + 0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8, 0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD, + 0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7, 0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB, + 0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1, 0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8, + 0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC, 0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501, + 0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506, 0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A, + 0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510, 0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516, + 0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E, 0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523, + 0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A, 0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539, + 0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541, 0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546, + 0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D, 0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553, + 0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558, 0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560, + 0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564, 0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B, + 0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F, 0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575, + 0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B, 0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580, + 0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585, 0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A, + 0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590, 0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B, + 0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6, 0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA, + 0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA, 0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1, + 0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE, 0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3, + 0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC, 0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1, + 0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED, 0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3, + 0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8, 0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE, + 0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607, 0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D, + 0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612, 0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A, + 0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621, 0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C, + 0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632, 0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A, + 0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642, 0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647, + 0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B, 0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651, + 0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657, 0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B, + 0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661, 0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666, + 0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A, 0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670, + 0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674, 0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679, + 0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680, 0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689, + 0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F, 0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695, + 0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B, 0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F, + 0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3, 0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8, + 0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC, 0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3, + 0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8, 0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC, + 0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1, 0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3, + 0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0, 0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE, + 0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698, 0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA, + 0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA, 0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE, + 0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1, 0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA, + 0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252, 0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B, + 0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB, 0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D, + 0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D, 0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70, + 0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591, 0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C, + 0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E, 0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A, + 0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E, 0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1, + 0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551, 0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE, + 0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4, 0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC, + 0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA, 0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0, + 0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4, 0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9, + 0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED, 0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6, + 0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD, 0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703, + 0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C, 0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711, + 0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715, 0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B, + 0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721, 0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727, + 0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E, 0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733, + 0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D, 0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744, + 0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749, 0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D, + 0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753, 0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757, + 0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584, 0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971, + 0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4, 0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F, + 0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317, 0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1, + 0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB, 0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF, + 0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7, 0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8, + 0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119, 0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6, + 0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6, 0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED, + 0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F, 0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B, + 0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C, 0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E, + 0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D, 0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868, + 0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A, 0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8, + 0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0, 0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C, + 0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F, 0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769, + 0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F, 0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773, + 0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777, 0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C, + 0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786, 0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A, + 0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793, 0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797, + 0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B, 0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1, + 0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8, 0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF, + 0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6, 0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA, + 0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1, 0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5, + 0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9, 0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE, + 0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2, 0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6, + 0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD, 0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1, + 0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB, 0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5, + 0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F, 0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B, + 0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24, 0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C, + 0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D, 0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8, + 0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1, 0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C, + 0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC, 0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695, + 0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F, 0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7, + 0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD, 0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56, + 0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42, 0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C, + 0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D, 0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7, + 0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400, 0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17, + 0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610, 0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6, + 0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0, 0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5, + 0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB, 0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805, + 0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A, 0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810, + 0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B, 0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822, + 0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B, 0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832, + 0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D, 0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843, + 0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849, 0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F, + 0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858, 0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C, + 0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861, 0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865, + 0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869, 0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872, + 0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876, 0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B, + 0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880, 0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A, + 0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F, 0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545, + 0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284, 0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E, + 0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66, 0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B, + 0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0, 0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89, + 0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491, 0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210, + 0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9, 0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E, + 0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4, 0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF, + 0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F, 0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5, + 0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2, 0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD, + 0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20, 0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8, + 0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D, 0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87, + 0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664, 0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886, + 0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F, 0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895, + 0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E, 0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6, + 0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB, 0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF, + 0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8, 0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD, + 0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3, 0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8, + 0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF, 0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6, + 0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB, 0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF, + 0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3, 0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7, + 0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED, 0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1, + 0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8, 0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD, + 0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902, 0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907, + 0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B, 0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7, + 0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3, 0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20, + 0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE, 0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF, + 0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376, 0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F, + 0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF, 0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5, + 0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E, 0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64, + 0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A, 0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE, + 0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B, 0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1, + 0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC, 0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC, + 0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8, 0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA, + 0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE, 0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927, + 0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234, 0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37, + 0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D, 0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911, + 0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916, 0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A, + 0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F, 0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923, + 0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928, 0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C, + 0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930, 0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935, + 0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939, 0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943, + 0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A, 0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E, + 0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952, 0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959, + 0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966, 0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C, + 0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972, 0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976, + 0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D, 0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983, + 0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989, 0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E, + 0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020, 0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355, + 0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6, 0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1, + 0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53, 0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863, + 0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012, 0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230, + 0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7, 0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C, + 0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA, 0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E, + 0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B, 0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1, + 0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482, 0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012, + 0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7, 0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B, + 0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538, 0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0, + 0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5, 0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A, + 0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239, 0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D, + 0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995, 0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999, + 0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E, 0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2, + 0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6, 0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB, + 0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF, 0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4, + 0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8, 0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4, + 0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA, 0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0, + 0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7, 0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC, + 0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1, 0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA, + 0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2, 0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6, + 0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC, 0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04, + 0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09, 0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10, + 0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15, 0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B, + 0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE, 0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D, + 0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C, 0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8, + 0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB, 0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597, + 0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8, 0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A, + 0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779, 0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A, + 0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF, 0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD, + 0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F, 0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72, + 0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D, 0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6, + 0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2, 0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241, + 0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8, 0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9, + 0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C, 0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069, + 0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14, 0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D, + 0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24, 0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28, + 0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C, 0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30, + 0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35, 0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E, + 0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43, 0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48, + 0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C, 0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50, + 0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55, 0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A, + 0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E, 0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62, + 0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66, 0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A, + 0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E, 0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73, + 0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D, 0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87, + 0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C, 0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93, + 0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B, 0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30, + 0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10, 0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0, + 0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB, 0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41, + 0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4, 0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D, + 0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9, 0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8, + 0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E, 0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE, + 0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420, 0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39, + 0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B, 0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A, + 0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD, 0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30, + 0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0, 0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD, + 0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD, 0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426, + 0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75, 0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45, + 0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8, 0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7, + 0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE, 0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2, + 0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7, 0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB, + 0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0, 0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4, + 0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8, 0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD, + 0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1, 0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5, + 0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB, 0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2, + 0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9, 0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE, + 0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3, 0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7, + 0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE, 0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05, + 0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D, 0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13, + 0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A, 0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21, + 0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29, 0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F, + 0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A, 0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7, + 0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150, 0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B, + 0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C, 0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC, + 0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A, 0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5, + 0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6, 0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746, + 0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76, 0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63, + 0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38, 0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F, + 0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8, 0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E, + 0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5, 0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D, + 0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769, 0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601, + 0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404, 0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015, + 0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F, 0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35, + 0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B, 0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41, + 0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46, 0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E, + 0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59, 0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61, + 0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66, 0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A, + 0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F, 0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76, + 0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D, 0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83, + 0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88, 0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C, + 0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92, 0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99, + 0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F, 0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5, + 0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2, 0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7, + 0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC, 0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0, + 0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2, 0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B, + 0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B, 0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13, + 0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21, 0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F, + 0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784, 0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7, + 0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD, 0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4, + 0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1, 0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7, + 0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1, 0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0, + 0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98, 0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986, + 0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F, 0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470, + 0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52, 0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C, + 0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC, 0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A, + 0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED, 0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7, + 0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9, 0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE, + 0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4, 0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8, + 0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF, 0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4, + 0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB, 0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0, + 0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5, 0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA, + 0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00, 0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04, + 0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09, 0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10, + 0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14, 0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19, + 0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D, 0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22, + 0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28, 0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D, + 0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31, 0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35, + 0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A, 0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E, + 0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77, 0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87, + 0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9, 0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD, + 0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC, 0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D, + 0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F, 0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E, + 0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D, 0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475, + 0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838, 0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408, + 0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3, 0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64, + 0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5, 0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC, + 0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052, 0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679, + 0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18, 0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334, + 0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E, 0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A, + 0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774, 0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43, + 0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47, 0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B, + 0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50, 0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54, + 0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58, 0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C, + 0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60, 0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64, + 0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68, 0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C, + 0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70, 0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76, + 0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A, 0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81, + 0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85, 0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A, + 0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E, 0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94, + 0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B, 0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6, + 0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB, 0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0, + 0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7, 0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27, + 0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92, 0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7, + 0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B, 0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0, + 0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F, 0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8, + 0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524, 0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3, + 0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C, 0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27, + 0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C, 0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E, + 0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD, 0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1, + 0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0, 0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A, + 0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2, 0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A, + 0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41, 0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7, + 0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27, 0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA, + 0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF, 0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2, + 0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9, 0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0, + 0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4, 0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD, + 0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3, 0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7, + 0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC, 0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1, + 0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5, 0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA, + 0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF, 0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03, + 0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07, 0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C, + 0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10, 0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14, + 0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18, 0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C, + 0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21, 0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26, + 0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C, 0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31, + 0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35, 0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9, + 0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC, 0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781, + 0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6, 0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72, + 0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324, 0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF, + 0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E, 0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E, + 0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0, 0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993, + 0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7, 0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0, + 0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532, 0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7, + 0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C, 0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A, + 0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9, 0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327, + 0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877, 0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED, + 0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB, 0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1, + 0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37, 0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B, + 0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F, 0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43, + 0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47, 0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B, + 0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F, 0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53, + 0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57, 0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B, + 0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F, 0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63, + 0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67, 0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B, + 0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70, 0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74, + 0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79, 0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D, + 0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81, 0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85, + 0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89, 0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D, + 0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91, 0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95, + 0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065, 0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10, + 0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5, 0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F, + 0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956, 0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D, + 0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126, 0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47, + 0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405, 0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A, + 0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34, 0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175, + 0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96, 0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8, + 0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB, 0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377, + 0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3, 0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9, + 0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB, 0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE, + 0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA, 0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526, + 0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773, 0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC, + 0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B, 0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F, + 0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3, 0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8, + 0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC, 0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1, + 0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5, 0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9, + 0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD, 0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1, + 0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5, 0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9, + 0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD, 0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1, + 0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5, 0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9, + 0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD, 0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1, + 0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5, 0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9, + 0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED, 0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1, + 0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5, 0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9, + 0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346, 0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676, + 0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE, 0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66, + 0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883, 0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9, + 0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0, 0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76, + 0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45, 0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9, + 0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205, 0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0, + 0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45, 0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480, + 0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A, 0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177, + 0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1, 0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267, + 0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026, 0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485, + 0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014, 0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0, + 0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7, 0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB, + 0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF, 0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03, + 0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07, 0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B, + 0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F, 0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13, + 0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17, 0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B, + 0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F, 0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23, + 0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27, 0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B, + 0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F, 0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33, + 0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37, 0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C, + 0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40, 0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45, + 0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A, 0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E, + 0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52, 0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56, + 0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A, 0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA, + 0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F, 0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF, + 0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF, 0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8, + 0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7, 0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297, + 0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7, 0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB, + 0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897, 0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF, + 0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2, 0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6, + 0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A, 0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0, + 0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF, 0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177, + 0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE, 0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757, + 0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD, 0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2, + 0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7, 0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF, + 0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41, 0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60, + 0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64, 0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68, + 0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C, 0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70, + 0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74, 0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78, + 0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C, 0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80, + 0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85, 0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89, + 0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D, 0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91, + 0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95, 0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99, + 0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E, 0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC, + 0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9, 0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37, + 0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D, 0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41, + 0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48, 0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C, + 0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52, 0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83, + 0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0, 0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614, + 0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721, 0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1, + 0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A, 0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611, + 0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD, 0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2, + 0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC, 0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A, + 0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001, 0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9, + 0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7, 0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F, + 0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B, 0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E, + 0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281, 0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB, + 0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC, 0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354, + 0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389, 0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229, + 0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56, 0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D, + 0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64, 0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B, + 0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70, 0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77, + 0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C, 0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82, + 0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86, 0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B, + 0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91, 0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96, + 0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B, 0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3, + 0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9, 0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD, + 0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4, 0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA, + 0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2, 0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7, + 0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD, 0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2, + 0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9, 0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD, + 0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2, 0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6, + 0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9, 0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570, + 0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18, 0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B, + 0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9, 0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24, + 0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE, 0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA, + 0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD, 0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563, + 0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2, 0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433, + 0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34, 0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB, + 0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2, 0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3, + 0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075, 0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6, + 0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4, 0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218, + 0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D, 0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C, + 0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8, 0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED, + 0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5, 0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9, + 0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF, 0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009, + 0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011, 0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D, + 0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023, 0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D, + 0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032, 0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C, + 0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044, 0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049, + 0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051, 0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057, + 0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D, 0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061, + 0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065, 0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B, + 0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F, 0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074, + 0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078, 0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C, + 0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2, 0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402, + 0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6, 0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089, + 0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81, 0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF, + 0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984, 0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74, + 0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5, 0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651, + 0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4, 0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A, + 0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0, 0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26, + 0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA, 0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B, + 0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8, 0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC, + 0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801, 0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B, + 0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6, 0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792, + 0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513, 0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E, + 0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088, 0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F, + 0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094, 0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E, + 0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8, 0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5, + 0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB, 0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9, + 0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0, 0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4, + 0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0, 0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE, + 0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB, 0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101, + 0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107, 0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115, + 0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C, 0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121, + 0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125, 0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129, + 0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E, 0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135, + 0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B, 0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29, + 0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13, 0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305, + 0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6, 0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D, + 0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB, 0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709, + 0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92, 0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627, + 0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8, 0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499, + 0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B, 0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A, + 0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C, 0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5, + 0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42, 0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195, + 0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05, 0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784, + 0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99, 0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11, + 0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF, 0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23, + 0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C, 0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142, + 0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147, 0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F, + 0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158, 0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E, + 0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163, 0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A, + 0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172, 0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177, + 0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184, 0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189, + 0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E, 0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194, + 0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199, 0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0, + 0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5, 0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC, + 0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0, 0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5, + 0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9, 0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF, + 0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8, 0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE, + 0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2, 0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21, + 0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54, 0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8, + 0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE, 0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0, + 0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6, 0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55, + 0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE, 0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF, + 0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3, 0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43, + 0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357, 0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320, + 0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6, 0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9, + 0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A, 0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60, + 0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA, 0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE, + 0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18, 0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F, + 0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A, 0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0, + 0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4, 0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8, + 0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC, 0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0, + 0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5, 0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB, + 0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1, 0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7, + 0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD, 0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208, + 0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E, 0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215, + 0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219, 0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224, + 0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229, 0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C, + 0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241, 0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246, + 0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D, 0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252, + 0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256, 0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C, + 0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261, 0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265, + 0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7, 0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE, + 0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C, 0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012, + 0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F, 0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA, + 0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4, 0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4, + 0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15, 0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392, + 0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E, 0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0, + 0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB, 0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A, + 0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228, 0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1, + 0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4, 0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69, + 0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830, 0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D, + 0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7, 0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367, + 0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739, 0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435, + 0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C, 0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276, + 0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C, 0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285, + 0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C, 0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295, + 0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E, 0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7, + 0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA, 0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0, + 0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6, 0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9, + 0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7, 0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC, + 0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2, 0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8, + 0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE, 0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B, + 0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313, 0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D, + 0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321, 0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325, + 0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E, 0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B, + 0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2, 0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB, + 0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F, 0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02, + 0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5, 0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1, + 0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9, 0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6, + 0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC, 0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44, + 0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251, 0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461, + 0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734, 0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31, + 0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A, 0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03, + 0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F, 0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67, + 0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50, 0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91, + 0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01, 0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668, + 0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D, 0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E, + 0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344, 0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B, + 0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353, 0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358, + 0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370, 0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374, + 0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A, 0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381, + 0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387, 0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C, + 0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391, 0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397, + 0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F, 0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4, + 0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC, 0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5, + 0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2, 0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8, + 0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE, 0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3, + 0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA, 0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3, + 0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8, 0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070, + 0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E, 0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E, + 0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4, 0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C, + 0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811, 0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA, + 0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899, 0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47, + 0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865, 0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7, + 0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED, 0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304, + 0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6, 0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434, + 0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD, 0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B, + 0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05, 0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5, + 0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C, 0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1, + 0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B, 0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6, + 0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71, 0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3, + 0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7, 0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE, + 0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405, 0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A, + 0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414, 0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419, + 0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F, 0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423, + 0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C, 0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430, + 0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435, 0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A, + 0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440, 0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444, + 0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449, 0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D, + 0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452, 0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456, + 0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F, 0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465, + 0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A, 0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472, + 0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B, 0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B, + 0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7, 0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168, + 0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238, 0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638, + 0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E, 0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136, + 0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4, 0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9, + 0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9, 0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA, + 0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4, 0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254, + 0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338, 0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194, + 0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197, 0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339, + 0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982, 0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165, + 0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A, 0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6, + 0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12, 0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E, + 0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D, 0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481, + 0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486, 0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490, + 0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494, 0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A, + 0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F, 0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4, + 0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8, 0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC, + 0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1, 0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7, + 0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0, 0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6, + 0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC, 0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4, + 0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9, 0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE, + 0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7, 0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB, + 0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1, 0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5, + 0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9, 0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE, + 0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E, 0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27, + 0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2, 0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE, + 0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740, 0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB, + 0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652, 0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71, + 0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA, 0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3, + 0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E, 0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F, + 0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3, 0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7, + 0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11, 0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962, + 0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D, 0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151, + 0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837, 0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB, + 0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E, 0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A, + 0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0, 0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347, + 0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505, 0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509, + 0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E, 0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514, + 0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519, 0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E, + 0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524, 0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528, + 0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E, 0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532, + 0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536, 0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541, + 0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546, 0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D, + 0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551, 0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555, + 0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B, 0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560, + 0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565, 0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A, + 0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E, 0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573, + 0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578, 0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580, + 0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269, 0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931, + 0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7, 0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3, + 0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF, 0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2, + 0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76, 0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB, + 0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED, 0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F, + 0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5, 0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F, + 0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6, 0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996, + 0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E, 0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C, + 0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292, 0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1, + 0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70, 0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9, + 0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20, 0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811, + 0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885, 0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582, + 0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589, 0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D, + 0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592, 0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596, + 0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A, 0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0, + 0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5, 0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB, + 0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2, 0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6, + 0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC, 0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0, + 0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5, 0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA, + 0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE, 0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6, + 0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA, 0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF, + 0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3, 0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8, + 0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED, 0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1, + 0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5, 0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055, + 0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870, 0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4, + 0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01, 0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E, + 0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4, 0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF, + 0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1, 0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086, + 0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A, 0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E, + 0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001, 0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C, + 0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF, 0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F, + 0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF, 0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178, + 0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B, 0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E, + 0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7, 0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B, + 0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29, 0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240, + 0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979, 0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC, + 0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601, 0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606, + 0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A, 0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E, + 0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613, 0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618, + 0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C, 0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620, + 0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624, 0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A, + 0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E, 0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632, + 0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636, 0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B, + 0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640, 0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644, + 0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648, 0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C, + 0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656, 0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B, + 0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660, 0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665, + 0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669, 0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B, + 0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC, 0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A, + 0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A, 0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B, + 0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D, 0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892, + 0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD, 0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802, + 0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6, 0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F, + 0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4, 0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003, + 0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957, 0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC, + 0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22, 0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44, + 0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F, 0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49, + 0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530, 0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146, + 0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A, 0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16, + 0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D, 0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673, + 0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677, 0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685, + 0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689, 0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691, + 0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697, 0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B, + 0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1, 0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB, + 0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3, 0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB, + 0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF, 0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5, + 0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2, 0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7, + 0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0, 0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5, + 0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA, 0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5, + 0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB, 0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701, + 0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B, 0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710, + 0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40, 0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD, + 0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850, 0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC, + 0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345, 0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077, + 0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8, 0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92, + 0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F, 0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2, + 0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715, 0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F, + 0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131, 0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C, + 0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E, 0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C, + 0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A, 0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E, + 0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7, 0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A, + 0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49, 0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B, + 0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80, 0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984, + 0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D, 0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726, + 0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B, 0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730, + 0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736, 0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C, + 0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742, 0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746, + 0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F, 0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754, + 0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A, 0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E, + 0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766, 0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A, + 0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F, 0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775, + 0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A, 0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784, + 0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A, 0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790, + 0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795, 0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A, + 0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E, 0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3, + 0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371, 0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4, + 0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D, 0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4, + 0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC, 0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F, + 0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D, 0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170, + 0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A, 0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B, + 0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1, 0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717, + 0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1, 0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB, + 0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61, 0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C, + 0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB, 0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348, + 0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E, 0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269, + 0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF, 0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F, + 0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B, 0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5, + 0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA, 0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2, + 0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8, 0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE, + 0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3, 0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8, + 0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE, 0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5, + 0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9, 0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE, + 0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3, 0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8, + 0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED, 0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2, + 0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6, 0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB, + 0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800, 0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805, + 0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809, 0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E, + 0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812, 0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819, + 0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E, 0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00, + 0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D, 0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF, + 0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84, 0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3, + 0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB, 0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E, + 0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96, 0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED, + 0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413, 0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9, + 0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24, 0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E, + 0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669, 0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A, + 0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677, 0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2, + 0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944, 0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965, + 0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB, 0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF, + 0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D, 0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3, + 0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6, 0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826, + 0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A, 0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E, + 0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833, 0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837, + 0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D, 0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842, + 0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848, 0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E, + 0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852, 0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858, + 0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D, 0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866, + 0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F, 0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875, + 0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A, 0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883, + 0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A, 0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890, + 0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895, 0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A, + 0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F, 0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5, + 0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9, 0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821, + 0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548, 0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E, + 0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A, 0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10, + 0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9, 0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22, + 0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C, 0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB, + 0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F, 0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174, + 0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2, 0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F, + 0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6, 0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4, + 0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E, 0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0, + 0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C, 0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B, + 0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157, 0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C, + 0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA, 0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3, + 0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC, 0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2, + 0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6, 0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB, + 0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0, 0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8, + 0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD, 0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3, + 0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB, 0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0, + 0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9, 0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED, + 0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5, 0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB, + 0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901, 0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906, + 0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B, 0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F, + 0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916, 0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D, + 0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922, 0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927, + 0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D, 0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932, + 0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009, 0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774, + 0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA, 0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA, + 0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F, 0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD, + 0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B, 0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440, + 0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C, 0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5, + 0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109, 0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9, + 0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712, 0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C, + 0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944, 0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14, + 0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C, 0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66, + 0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C, 0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7, + 0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1, 0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27, + 0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837, 0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996, + 0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A, 0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E, + 0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943, 0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948, + 0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C, 0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950, + 0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954, 0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958, + 0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C, 0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962, + 0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967, 0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B, + 0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F, 0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973, + 0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977, 0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C, + 0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982, 0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988, + 0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C, 0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990, + 0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994, 0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998, + 0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C, 0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0, + 0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065, 0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC, + 0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000, 0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237, + 0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875, 0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3, + 0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00, 0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1, + 0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890, 0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA, + 0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C, 0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681, + 0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3, 0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613, + 0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79, 0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB, + 0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5, 0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2, + 0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1, 0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE, + 0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7, 0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F, + 0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E, 0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2, + 0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6, 0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA, + 0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE, 0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2, + 0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6, 0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA, + 0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE, 0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD, + 0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7, 0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD, + 0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2, 0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9, + 0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE, 0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4, + 0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8, 0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC, + 0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01, 0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05, + 0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A, 0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E, + 0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12, 0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16, + 0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A, 0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370, + 0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70, 0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424, + 0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE, 0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896, + 0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5, 0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8, + 0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F, 0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F, + 0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18, 0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531, + 0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9, 0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB, + 0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1, 0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4, + 0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E, 0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE, + 0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D, 0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31, + 0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9, 0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389, + 0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401, 0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1, + 0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2, 0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20, + 0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24, 0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28, + 0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C, 0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30, + 0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34, 0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38, + 0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C, 0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41, + 0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45, 0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A, + 0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E, 0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52, + 0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56, 0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A, + 0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E, 0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62, + 0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66, 0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A, + 0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E, 0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72, + 0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76, 0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B, + 0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F, 0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5, + 0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33, 0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3, + 0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95, 0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F, + 0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1, 0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0, + 0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5, 0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6, + 0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7, 0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0, + 0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5, 0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742, + 0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0, 0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1, + 0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43, 0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF, + 0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9, 0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A, + 0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5, 0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD, + 0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E, 0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3, + 0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81, 0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85, + 0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B, 0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F, + 0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94, 0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98, + 0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C, 0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0, + 0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4, 0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8, + 0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC, 0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0, + 0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4, 0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8, + 0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC, 0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0, + 0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4, 0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8, + 0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC, 0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0, + 0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4, 0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8, + 0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC, 0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0, + 0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1, 0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8, + 0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8, 0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84, + 0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1, 0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF, + 0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55, 0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218, + 0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F, 0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20, + 0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08, 0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0, + 0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D, 0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167, + 0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC, 0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0, + 0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517, 0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F, + 0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB, 0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795, + 0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F, 0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323, + 0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89, 0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63, + 0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6, 0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA, + 0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE, 0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2, + 0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6, 0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA, + 0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE, 0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02, + 0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06, 0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B, + 0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F, 0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13, + 0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17, 0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B, + 0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F, 0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23, + 0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28, 0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C, + 0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30, 0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34, + 0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38, 0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C, + 0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40, 0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44, + 0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1, 0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F, + 0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2, 0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7, + 0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96, 0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740, + 0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA, 0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A, + 0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E, 0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A, + 0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099, 0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92, + 0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F, 0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF, + 0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F, 0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC, + 0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A, 0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C, + 0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB, 0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB, + 0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E, 0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B, + 0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0, 0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46, + 0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A, 0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E, + 0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52, 0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56, + 0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A, 0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E, + 0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62, 0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67, + 0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B, 0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70, + 0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74, 0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78, + 0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C, 0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80, + 0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84, 0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88, + 0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C, 0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90, + 0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94, 0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98, + 0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C, 0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC, + 0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0, 0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F, + 0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293, 0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816, + 0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6, 0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986, + 0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E, 0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760, + 0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349, 0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422, + 0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740, 0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8, + 0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4, 0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D, + 0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D, 0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A, + 0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5, 0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD, + 0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF, 0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4, + 0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189, 0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075, + 0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE, 0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7, + 0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B, 0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F, + 0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44, 0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B, + 0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50, 0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54, + 0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59, 0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E, + 0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64, 0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68, + 0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E, 0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72, + 0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77, 0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E, + 0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83, 0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88, + 0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F, 0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93, + 0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99, 0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D, + 0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1, 0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5, + 0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9, 0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD, + 0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10, 0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98, + 0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669, 0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315, + 0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E, 0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997, + 0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36, 0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69, + 0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C, 0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D, + 0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765, 0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326, + 0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366, 0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E, + 0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240, 0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C, + 0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281, 0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54, + 0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2, 0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE, + 0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64, 0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09, + 0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538, 0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF, + 0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3, 0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7, + 0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB, 0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF, + 0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3, 0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7, + 0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB, 0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF, + 0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3, 0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7, + 0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB, 0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF, + 0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3, 0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7, + 0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB, 0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF, + 0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3, 0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7, + 0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB, 0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF, + 0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03, 0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07, + 0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B, 0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57, + 0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74, 0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F, + 0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C, 0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8, + 0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3, 0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8, + 0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C, 0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE, + 0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028, 0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048, + 0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5, 0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6, + 0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6, 0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD, + 0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE, 0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E, + 0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181, 0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07, + 0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155, 0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E, + 0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2, 0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8, + 0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC, 0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11, + 0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15, 0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19, + 0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20, 0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F, + 0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A, 0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71, + 0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A, 0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E, + 0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83, 0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89, + 0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F, 0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95, + 0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99, 0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D, + 0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2, 0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7, + 0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB, 0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF, + 0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7, 0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0, + 0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7, 0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD, + 0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4, 0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5, + 0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA, 0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2, + 0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE, 0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6, + 0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF, 0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9, + 0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6, 0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00, + 0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C, 0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14, + 0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B, 0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20, + 0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A, 0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32, + 0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369, 0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621, + 0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C, 0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F, + 0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674, 0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0, + 0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099, 0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3, + 0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8, 0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1, + 0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7, 0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0, + 0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6, 0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00, + 0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04, 0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B, + 0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11, 0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16, + 0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A, 0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21, + 0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27, 0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30, + 0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36, 0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C, + 0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45, 0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E, + 0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54, 0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58, + 0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D, 0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61, + 0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65, 0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B, + 0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0, 0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0, + 0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6, 0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB, + 0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104, 0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131, + 0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146, 0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC, + 0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0, 0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE, + 0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC, 0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A, + 0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1, 0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1, + 0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733, 0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C, + 0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785, 0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B, + 0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773, 0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2, + 0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793, 0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA, + 0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4, 0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD, + 0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78, 0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D, + 0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83, 0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89, + 0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D, 0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93, + 0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98, 0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D, + 0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2, 0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6, + 0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA, 0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1, + 0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6, 0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB, + 0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF, 0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3, + 0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7, 0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB, + 0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0, 0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4, + 0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8, 0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC, + 0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0, 0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4, + 0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED, 0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844, + 0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881, 0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8, + 0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D, 0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8, + 0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297, 0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE, + 0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3, 0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB, + 0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4, 0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4, + 0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309, 0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307, + 0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8, 0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311, + 0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315, 0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351, + 0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392, 0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B, + 0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347, 0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317, + 0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333, 0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6, + 0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA, 0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE, + 0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2, 0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6, + 0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA, 0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE, + 0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02, 0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06, + 0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A, 0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E, + 0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12, 0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16, + 0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A, 0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E, + 0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22, 0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26, + 0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A, 0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E, + 0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32, 0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36, + 0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A, 0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E, + 0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42, 0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B, + 0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D, 0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3, + 0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393, 0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6, + 0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B, 0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA, + 0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5, 0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B, + 0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C, 0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4, + 0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8, 0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0, + 0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C, 0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473, + 0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489, 0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469, + 0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431, 0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0, + 0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA, 0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1, + 0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5, 0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538, + 0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A, 0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48, + 0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C, 0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50, + 0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54, 0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58, + 0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C, 0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60, + 0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64, 0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C, + 0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1, 0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6, + 0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD, 0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3, + 0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8, 0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF, + 0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9, 0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD, + 0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7, 0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3, + 0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1, 0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6, + 0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE, 0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C, + 0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018, 0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC, + 0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564, 0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543, + 0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8, 0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE, + 0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7, 0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC, + 0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629, 0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08, + 0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955, 0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22, + 0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C, 0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA, + 0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322, 0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343, + 0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A, 0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC, + 0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC, 0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF, + 0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452, 0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441, + 0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C, 0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484, + 0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C, 0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027, + 0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B, 0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032, + 0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039, 0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040, + 0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048, 0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C, + 0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056, 0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D, + 0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061, 0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069, + 0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F, 0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073, + 0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079, 0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E, + 0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086, 0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C, + 0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090, 0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098, + 0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F, 0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7, + 0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD, 0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD, + 0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7, 0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0, + 0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2, 0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B, + 0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F, 0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8, + 0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406, 0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454, + 0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457, 0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482, + 0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464, 0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476, + 0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD, 0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7, + 0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472, 0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF, + 0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC, 0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD, + 0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7, 0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3, + 0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511, 0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F, + 0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541, 0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C, + 0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8, 0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD, + 0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6, 0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE, + 0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4, 0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC, + 0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2, 0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7, + 0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC, 0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103, + 0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108, 0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C, + 0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110, 0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114, + 0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118, 0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D, + 0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124, 0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128, + 0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C, 0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132, + 0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136, 0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B, + 0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F, 0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144, + 0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576, 0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C, + 0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1, 0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F, + 0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B, 0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594, + 0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9, 0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC, + 0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4, 0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3, + 0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5, 0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608, + 0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623, 0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D, + 0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C, 0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C, + 0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664, 0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C, + 0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4, 0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5, + 0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704, 0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F, + 0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31, 0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147, + 0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154, 0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159, + 0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160, 0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B, + 0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B, 0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182, + 0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188, 0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193, + 0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197, 0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D, + 0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1, 0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7, + 0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC, 0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3, + 0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9, 0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE, + 0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2, 0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6, + 0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2, 0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6, + 0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA, 0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF, + 0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3, 0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44, + 0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61, 0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90, + 0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99, 0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5, + 0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB, 0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7, + 0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB, 0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27, + 0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E, 0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E, + 0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B, 0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B, + 0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82, 0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7, + 0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82, 0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95, + 0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD, 0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61, + 0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7, 0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE, + 0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF, 0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7, + 0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA, 0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9, + 0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED, 0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1, + 0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5, 0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9, + 0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD, 0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201, + 0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205, 0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209, + 0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D, 0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211, + 0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215, 0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219, + 0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D, 0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221, + 0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225, 0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229, + 0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D, 0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231, + 0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235, 0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239, + 0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D, 0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241, + 0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245, 0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321, + 0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315, 0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C, + 0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D, 0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F, + 0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7, 0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967, + 0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B, 0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D, + 0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A, 0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993, + 0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91, 0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0, + 0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3, 0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB, + 0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4, 0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003, + 0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4, 0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA, + 0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035, 0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D, + 0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F, 0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B, + 0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247, 0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B, + 0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F, 0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253, + 0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257, 0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B, + 0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F, 0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263, + 0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267, 0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B, + 0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F, 0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273, + 0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278, 0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C, + 0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280, 0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284, + 0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288, 0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C, + 0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291, 0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295, + 0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299, 0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D, + 0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1, 0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5, + 0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D, 0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D, + 0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B, 0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD, + 0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4, 0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123, + 0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B, 0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194, + 0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5, 0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB, + 0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6, 0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604, + 0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B, 0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612, + 0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619, 0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215, + 0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A, 0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94, + 0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74, 0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0, + 0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8, 0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0, + 0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE, 0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE, + 0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB, 0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0, + 0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4, 0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8, + 0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC, 0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0, + 0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4, 0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9, + 0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD, 0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1, + 0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5, 0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9, + 0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD, 0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1, + 0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5, 0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9, + 0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED, 0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1, + 0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5, 0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9, + 0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD, 0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301, + 0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305, 0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309, + 0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43, 0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19, + 0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E, 0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52, + 0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F, 0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93, + 0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C, 0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5, + 0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0, 0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9, + 0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE, 0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B, + 0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53, 0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44, + 0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0, 0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7, + 0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7, 0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2, + 0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47, 0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F, + 0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A, 0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D, + 0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C, 0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B, + 0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F, 0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313, + 0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317, 0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B, + 0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F, 0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323, + 0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327, 0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B, + 0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F, 0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333, + 0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337, 0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B, + 0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340, 0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344, + 0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348, 0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C, + 0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350, 0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354, + 0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358, 0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C, + 0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360, 0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364, + 0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368, 0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7, + 0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1, 0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF, + 0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039, 0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80, + 0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5, 0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434, + 0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0, 0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3, + 0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4, 0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8, + 0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026, 0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021, + 0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F, 0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050, + 0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B, 0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082, + 0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50, 0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B, + 0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71, 0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A, + 0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C, 0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983, + 0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3, 0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F, + 0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373, 0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377, + 0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B, 0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F, + 0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383, 0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387, + 0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B, 0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390, + 0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394, 0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398, + 0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C, 0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0, + 0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4, 0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8, + 0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC, 0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0, + 0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4, 0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8, + 0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC, 0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0, + 0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4, 0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8, + 0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD, 0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E, + 0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF, 0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06, + 0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8, 0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32, + 0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13, 0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55, + 0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC, 0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A, + 0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2, 0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3, + 0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8, 0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16, + 0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15, 0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73, + 0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75, 0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F, + 0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85, 0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92, + 0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B, 0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0, + 0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7, 0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5, + 0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF, 0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3, + 0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8, 0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC, + 0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0, 0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4, + 0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8, 0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC, + 0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0, 0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4, + 0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8, 0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC, + 0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400, 0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404, + 0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408, 0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C, + 0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410, 0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414, + 0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418, 0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C, + 0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420, 0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424, + 0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428, 0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C, + 0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0, 0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2, + 0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0, 0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0, + 0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE, 0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D, + 0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE, 0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07, + 0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F, 0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19, + 0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21, 0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25, + 0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B, 0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30, + 0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35, 0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E, + 0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE, 0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2, + 0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0, 0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9, + 0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7, 0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F, + 0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425, 0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C, + 0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432, 0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436, + 0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A, 0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F, + 0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443, 0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447, + 0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B, 0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F, + 0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453, 0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457, + 0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B, 0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F, + 0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463, 0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467, + 0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C, 0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470, + 0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474, 0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478, + 0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C, 0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480, + 0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484, 0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7, + 0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA, 0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520, + 0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C, 0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477, + 0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E, 0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B, + 0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490, 0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA, + 0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753, 0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5, + 0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798, 0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E, + 0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C, 0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A, + 0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9, 0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD, + 0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2, 0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832, + 0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E, 0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883, + 0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841, 0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A, + 0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F, 0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B, + 0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F, 0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533, + 0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B, 0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E, + 0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578, 0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C, + 0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581, 0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585, + 0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589, 0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D, + 0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591, 0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595, + 0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599, 0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D, + 0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1, 0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5, + 0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9, 0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD, + 0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1, 0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5, + 0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9, 0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD, + 0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1, 0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5, + 0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9, 0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0, + 0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3, 0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960, + 0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B, 0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934, + 0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE, 0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979, + 0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB, 0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1, + 0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0, 0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED, + 0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2, 0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50, + 0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79, 0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C, + 0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97, 0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81, + 0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92, 0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B, + 0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D, 0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75, + 0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79, 0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81, + 0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B, 0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF, + 0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3, 0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7, + 0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB, 0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF, + 0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3, 0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7, + 0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613, 0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620, + 0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626, 0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B, + 0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630, 0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A, + 0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A, 0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652, + 0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658, 0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D, + 0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665, 0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E, + 0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673, 0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B, + 0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F, 0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683, + 0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A, 0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98, + 0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217, 0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221, + 0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7, 0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F, + 0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE, 0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619, + 0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600, 0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634, + 0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006, 0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F, + 0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677, 0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D, + 0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6, 0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36, + 0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45, 0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47, + 0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7, 0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE, + 0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E, 0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F, + 0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B, 0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308, + 0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E, 0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695, + 0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D, 0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1, + 0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5, 0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA, + 0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE, 0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4, + 0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA, 0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3, + 0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0, 0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6, + 0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA, 0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE, + 0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3, 0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7, + 0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE, 0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4, + 0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB, 0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702, + 0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B, 0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712, + 0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718, 0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D, + 0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8, 0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD, + 0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07, 0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18, + 0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29, 0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535, + 0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252, 0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216, + 0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC, 0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB, + 0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7, 0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB, + 0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD, 0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB, + 0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D, 0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715, + 0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E, 0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148, + 0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159, 0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169, + 0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167, 0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182, + 0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA, 0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB, + 0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724, 0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728, + 0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E, 0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734, + 0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A, 0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F, + 0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743, 0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747, + 0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B, 0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F, + 0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755, 0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C, + 0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764, 0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A, + 0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E, 0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772, + 0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779, 0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E, + 0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782, 0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787, + 0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C, 0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793, + 0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799, 0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D, + 0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37, 0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59, + 0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5, 0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40, + 0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51, 0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4, + 0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2, 0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096, + 0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7, 0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA, + 0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F, 0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168, + 0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178, 0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5, + 0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4, 0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228, + 0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9, 0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248, + 0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946, 0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953, + 0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960, 0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985, + 0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3, 0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F, + 0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5, 0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9, + 0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0, 0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6, + 0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA, 0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE, + 0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2, 0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6, + 0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA, 0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE, + 0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2, 0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6, + 0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA, 0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE, + 0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2, 0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8, + 0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1, 0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8, + 0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC, 0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800, + 0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804, 0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808, + 0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C, 0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D, + 0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059, 0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D, + 0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB, 0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F, + 0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6, 0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817, + 0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D, 0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A, + 0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825, 0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E, + 0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826, 0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A, + 0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887, 0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2, + 0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9, 0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905, + 0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E, 0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB, + 0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D, 0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A, + 0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726, 0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751, + 0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768, 0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812, + 0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816, 0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A, + 0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E, 0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822, + 0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826, 0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A, + 0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E, 0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832, + 0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836, 0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A, + 0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E, 0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842, + 0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846, 0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A, + 0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E, 0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852, + 0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856, 0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A, + 0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E, 0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862, + 0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866, 0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A, + 0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E, 0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D, + 0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791, 0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5, + 0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E, 0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572, + 0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61, 0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74, + 0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E, 0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485, + 0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A, 0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490, + 0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A, 0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4, + 0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC, 0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4, + 0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9, 0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF, + 0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA, 0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE, + 0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5, 0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8, + 0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0, 0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7, + 0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870, 0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874, + 0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895, 0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9, + 0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD, 0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1, + 0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5, 0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9, + 0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD, 0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1, + 0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5, 0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9, + 0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD, 0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6, + 0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD, 0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3, + 0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9, 0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED, + 0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1, 0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5, + 0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9, 0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD, + 0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901, 0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905, + 0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB, 0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4, + 0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC, 0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502, + 0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A, 0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512, + 0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516, 0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E, + 0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B, 0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532, + 0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538, 0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542, + 0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546, 0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F, + 0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556, 0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B, + 0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561, 0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566, + 0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A, 0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571, + 0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7, 0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED, + 0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47, 0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14, + 0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B, 0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911, + 0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915, 0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919, + 0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D, 0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921, + 0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925, 0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929, + 0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D, 0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932, + 0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936, 0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A, + 0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E, 0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942, + 0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946, 0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A, + 0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E, 0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952, + 0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958, 0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C, + 0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960, 0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966, + 0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B, 0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989, + 0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF, 0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E, + 0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE, 0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22, + 0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B, 0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36, + 0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A, 0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44, + 0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49, 0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51, + 0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B, 0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66, + 0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A, 0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D, + 0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596, 0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3, + 0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4, 0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2, + 0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8, 0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7, + 0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF, 0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C, + 0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618, 0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E, + 0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D, 0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1, + 0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6, 0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB, + 0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF, 0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3, + 0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7, 0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB, + 0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF, 0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3, + 0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7, 0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB, + 0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF, 0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3, + 0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7, 0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB, + 0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF, 0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3, + 0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7, 0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB, + 0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF, 0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3, + 0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7, 0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C, + 0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D, 0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643, + 0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E, 0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B, + 0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78, 0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88, + 0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC, 0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864, + 0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F, 0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7, + 0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE, 0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A, + 0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0, 0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B, + 0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936, 0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B, + 0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC, 0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C, + 0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026, 0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031, + 0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046, 0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071, + 0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883, 0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD, + 0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01, 0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05, + 0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09, 0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D, + 0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11, 0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15, + 0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19, 0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D, + 0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21, 0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25, + 0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29, 0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D, + 0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31, 0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35, + 0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39, 0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D, + 0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41, 0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45, + 0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49, 0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D, + 0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51, 0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55, + 0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59, 0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F, + 0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E, 0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5, + 0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C, 0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C, + 0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B, 0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3, + 0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6, 0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0, + 0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9, 0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1, + 0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0, 0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF, + 0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707, 0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D, + 0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E, 0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E, + 0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729, 0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722, + 0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760, 0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B, + 0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764, 0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF, + 0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B, 0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F, + 0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63, 0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67, + 0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B, 0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D, + 0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99, 0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB, + 0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF, 0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5, + 0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE, 0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6, + 0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA, 0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0, + 0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6, 0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB, + 0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0, 0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5, + 0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA, 0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1, + 0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5, 0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA, + 0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF, 0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04, + 0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788, 0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783, + 0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5, 0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD, + 0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB, 0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816, + 0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B, 0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36, + 0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210, 0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03, + 0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B, 0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A, + 0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20, 0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E, + 0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45, 0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60, + 0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72, 0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7, + 0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8, 0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2, + 0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1, 0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5, + 0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE, 0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B, + 0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B, 0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10, + 0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15, 0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19, + 0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D, 0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22, + 0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27, 0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B, + 0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30, 0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35, + 0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39, 0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F, + 0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B, 0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52, + 0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57, 0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B, + 0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F, 0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63, + 0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67, 0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B, + 0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F, 0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73, + 0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77, 0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B, + 0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38, 0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201, + 0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844, 0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D, + 0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238, 0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E, + 0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F, 0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E, + 0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF, 0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7, + 0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C, 0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C, + 0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC, 0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC, + 0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7, 0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF, + 0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1, 0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3, + 0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE, 0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4, + 0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91, 0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47, + 0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E, 0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D, + 0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81, 0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85, + 0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89, 0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D, + 0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91, 0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95, + 0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99, 0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D, + 0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1, 0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5, + 0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9, 0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD, + 0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1, 0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5, + 0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9, 0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD, + 0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1, 0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5, + 0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9, 0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD, + 0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1, 0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5, + 0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9, 0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161, + 0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D, 0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179, + 0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D, 0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA, + 0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5, 0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E, + 0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59, 0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC, + 0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7, 0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF, + 0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7, 0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB, + 0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14, 0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E, + 0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40, 0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31, + 0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51, 0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76, + 0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85, 0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C, + 0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A, 0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B, + 0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC, 0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF, + 0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3, 0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7, + 0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB, 0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF, + 0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3, 0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7, + 0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB, 0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF, + 0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03, 0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07, + 0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B, 0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F, + 0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13, 0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17, + 0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B, 0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F, + 0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23, 0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27, + 0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B, 0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F, + 0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33, 0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37, + 0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B, 0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E, + 0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3, 0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708, + 0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D, 0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83, + 0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88, 0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE, + 0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC, 0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF, + 0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8, 0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F, + 0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82, 0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88, + 0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90, 0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95, + 0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F, 0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3, + 0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8, 0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE, + 0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3, 0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7, + 0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD, 0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7, + 0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D, 0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41, + 0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45, 0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49, + 0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D, 0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51, + 0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55, 0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59, + 0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D, 0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61, + 0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65, 0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69, + 0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D, 0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71, + 0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75, 0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79, + 0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E, 0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89, + 0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93, 0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99, + 0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF, 0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0, + 0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9, 0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB, + 0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD, 0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3, + 0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8, 0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF, + 0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791, 0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB, + 0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1, 0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6, + 0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0, 0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC, + 0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47, 0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51, + 0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955, 0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6, + 0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED, 0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13, + 0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE, 0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88, + 0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D, 0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD, + 0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9, 0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF, + 0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39, 0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44, + 0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6, 0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA, + 0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE, 0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2, + 0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6, 0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA, + 0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE, 0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02, + 0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06, 0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A, + 0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E, 0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12, + 0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16, 0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A, + 0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E, 0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22, + 0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26, 0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A, + 0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E, 0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32, + 0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36, 0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A, + 0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E, 0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42, + 0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46, 0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A, + 0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E, 0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52, + 0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56, 0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A, + 0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E, 0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62, + 0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66, 0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A, + 0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E, 0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72, + 0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76, 0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A, + 0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E, 0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82, + 0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86, 0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A, + 0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E, 0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92, + 0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96, 0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A, + 0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E, 0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2, + 0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6, 0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA, + 0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE, 0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2, + 0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6, 0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA, + 0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE, 0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2, + 0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6, 0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA, + 0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE, 0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2, + 0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6, 0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA, + 0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE, 0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2, + 0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6, 0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA, + 0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE, 0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2, + 0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6, 0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA, + 0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE, 0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02, + 0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06, 0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A, + 0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E, 0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12, + 0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16, 0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A, + 0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E, 0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30, + 0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40, 0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53, + 0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D, 0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62, + 0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72, 0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77, + 0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B, 0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81, + 0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86, 0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D, + 0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91, 0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97, + 0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B, 0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1, + 0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5, 0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA, + 0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE, 0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2, + 0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7, 0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF, + 0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3, 0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8, + 0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0, 0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6, + 0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE, 0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6, + 0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED, 0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2, + 0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6, 0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD, + 0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02, 0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06, + 0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A, 0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12, + 0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18, 0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D, + 0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23, 0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27, + 0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B, 0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31, + 0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35, 0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C, + 0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42, 0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47, + 0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B, 0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F, + 0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55, 0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59, + 0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D, 0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61, + 0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65, 0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69, + 0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D, 0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71, + 0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75, 0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79, + 0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D, 0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D, + 0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91, 0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95, + 0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C, 0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2, + 0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C, 0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1, + 0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F, 0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18, + 0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23, 0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29, + 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 949 || FF_CODE_PAGE == 0 /* Korean */ +static const WCHAR uni2oem949[] = { /* Unicode --> Korean pairs */ + 0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7, 0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6, + 0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5, 0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6, + 0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA, 0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF, + 0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1, 0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD, + 0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5, 0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8, + 0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0, 0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB, + 0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0, 0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD, + 0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3, 0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7, + 0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB, 0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF, + 0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3, 0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7, + 0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3, 0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7, + 0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB, 0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF, + 0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3, 0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7, + 0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2, 0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6, + 0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB, 0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF, + 0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3, 0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7, + 0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB, 0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF, + 0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2, 0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6, + 0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB, 0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF, + 0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3, 0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7, + 0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB, 0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF, + 0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA, 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, + 0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6, 0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8, + 0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC, 0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9, + 0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5, 0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7, + 0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD, 0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2, + 0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6, 0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1, + 0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5, 0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9, + 0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6, 0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8, + 0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1, 0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4, + 0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3, 0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4, + 0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD, 0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3, + 0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD, 0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5, + 0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED, 0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7, + 0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7, 0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB, + 0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF, 0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3, + 0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8, 0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC, + 0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0, 0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4, + 0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF, 0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3, + 0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7, 0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB, + 0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF, 0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3, + 0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD, 0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1, + 0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5, 0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9, + 0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD, 0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1, + 0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5, 0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2, + 0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7, 0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1, + 0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5, 0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3, + 0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9, 0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC, + 0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD, 0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0, + 0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2, 0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4, + 0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6, 0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8, + 0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA, 0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0, + 0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0, 0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4, + 0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0, 0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB, + 0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3, 0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5, + 0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF, 0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD, + 0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA, 0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0, + 0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC, 0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE, + 0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC, 0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2, + 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5, 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD, 0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1, + 0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5, 0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9, + 0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD, 0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1, + 0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5, 0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9, + 0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD, 0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1, + 0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5, 0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9, + 0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD, 0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1, + 0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5, 0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9, + 0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD, 0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1, + 0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5, 0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9, + 0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED, 0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1, + 0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2, 0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6, + 0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA, 0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE, + 0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2, 0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6, + 0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA, 0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE, + 0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2, 0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6, + 0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA, 0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE, + 0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2, 0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6, + 0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA, 0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE, + 0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2, 0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6, + 0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA, 0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE, + 0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2, 0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6, + 0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4, 0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8, + 0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC, 0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0, + 0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4, 0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8, + 0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC, 0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0, + 0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4, 0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8, + 0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC, 0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0, + 0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4, 0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8, + 0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC, 0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0, + 0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4, 0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8, + 0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC, 0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0, + 0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4, 0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8, + 0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC, 0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2, + 0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6, 0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA, + 0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE, 0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2, + 0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6, 0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA, + 0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1, 0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5, + 0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9, 0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD, + 0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1, 0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5, + 0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9, 0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE, + 0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC, 0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC, + 0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7, 0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6, + 0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2, 0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC, + 0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0, 0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4, + 0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA, 0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6, + 0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2, 0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1, + 0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5, 0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE, + 0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2, 0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3, + 0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF, 0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5, + 0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF, 0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9, + 0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2, 0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB, + 0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0, 0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA, + 0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1, 0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9, + 0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9, 0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA, + 0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC, 0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB, + 0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0, 0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6, + 0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6, 0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1, + 0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB, 0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5, + 0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2, 0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF, + 0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2, 0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE, + 0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4, 0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0, + 0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5, 0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1, + 0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1, 0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4, + 0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7, 0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC, + 0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9, 0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5, + 0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD, 0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0, + 0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6, 0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD, + 0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA, 0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5, + 0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5, 0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB, + 0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4, 0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF, + 0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC, 0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF, + 0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1, 0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8, + 0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA, 0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7, + 0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2, 0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6, + 0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9, 0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE, + 0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF, 0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8, + 0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA, 0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0, + 0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2, 0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2, + 0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9, 0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8, + 0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2, 0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1, + 0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3, 0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3, + 0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC, 0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA, + 0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE, 0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE, + 0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2, 0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC, + 0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0, 0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC, + 0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7, 0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF, + 0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2, 0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0, + 0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB, 0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5, + 0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE, 0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7, + 0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD, 0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC, + 0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0, 0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB, + 0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE, 0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1, + 0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE, 0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9, + 0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9, 0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1, + 0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4, 0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2, + 0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6, 0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8, + 0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1, 0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2, + 0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7, 0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4, + 0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE, 0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1, + 0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9, 0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4, + 0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF, 0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6, + 0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1, 0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF, + 0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF, 0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF, + 0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB, 0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED, + 0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8, 0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0, + 0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1, 0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2, + 0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4, 0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2, + 0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE, 0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6, + 0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3, 0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA, + 0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3, 0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE, + 0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5, 0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF, + 0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9, 0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1, + 0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2, 0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC, + 0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA, 0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA, + 0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0, 0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF, + 0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8, 0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9, + 0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6, 0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6, + 0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2, 0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA, + 0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3, 0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA, + 0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0, 0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7, + 0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4, 0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0, + 0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8, 0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9, + 0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF, 0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF, + 0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF, 0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4, + 0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6, 0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD, + 0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8, 0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE, + 0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF, 0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0, + 0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9, 0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5, + 0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0, 0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3, + 0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7, 0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF, + 0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2, 0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0, + 0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2, 0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8, + 0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC, 0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED, + 0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE, 0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB, + 0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3, 0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3, + 0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2, 0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA, + 0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2, 0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5, + 0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB, 0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5, + 0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4, 0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD, + 0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC, 0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE, + 0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4, 0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE, + 0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC, 0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1, + 0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5, 0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8, + 0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8, 0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC, + 0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7, 0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF, + 0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4, 0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8, + 0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9, 0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5, + 0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4, 0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE, + 0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9, 0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1, + 0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF, 0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6, + 0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4, 0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8, + 0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE, 0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8, + 0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC, 0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC, + 0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3, 0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE, + 0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6, 0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF, + 0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5, 0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF, + 0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED, 0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC, + 0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5, 0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF, + 0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1, 0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9, + 0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5, 0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB, + 0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2, 0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9, + 0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB, 0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC, + 0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6, 0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB, + 0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0, 0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4, + 0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2, 0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE, + 0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3, 0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6, + 0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5, 0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD, + 0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA, 0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA, + 0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5, 0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5, + 0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7, 0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB, + 0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0, 0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0, + 0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1, 0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6, + 0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF, 0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0, + 0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA, 0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1, + 0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7, 0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5, + 0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0, 0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9, + 0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF, 0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3, + 0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3, 0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE, + 0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1, 0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9, + 0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC, 0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6, + 0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB, 0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA, + 0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE, 0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9, + 0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB, 0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9, + 0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2, 0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8, + 0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE, 0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB, + 0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA, 0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8, + 0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6, 0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5, + 0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7, 0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1, + 0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0, 0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1, + 0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD, 0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF, + 0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4, 0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE, + 0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF, 0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD, + 0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9, 0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0, + 0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3, 0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5, + 0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7, 0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3, + 0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD, 0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC, + 0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7, 0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8, + 0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB, 0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1, + 0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5, 0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8, + 0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF, 0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1, + 0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1, 0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6, + 0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0, 0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9, + 0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2, 0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED, + 0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA, 0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3, + 0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3, 0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC, + 0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3, 0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0, + 0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3, 0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7, + 0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5, 0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9, + 0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE, 0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3, + 0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7, 0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6, + 0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4, 0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3, + 0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB, 0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2, + 0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8, 0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA, + 0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4, 0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8, + 0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB, 0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB, + 0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC, 0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4, + 0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4, 0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8, + 0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3, 0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6, + 0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA, 0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5, + 0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB, 0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC, + 0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1, 0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8, + 0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6, 0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7, + 0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0, 0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC, + 0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC, 0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0, + 0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2, 0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA, + 0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB, 0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9, + 0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4, 0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9, + 0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF, 0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7, + 0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9, 0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3, + 0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3, 0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1, + 0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB, 0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4, + 0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA, 0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8, + 0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA, 0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6, + 0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7, 0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE, + 0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5, 0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8, + 0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2, 0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA, + 0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6, 0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0, + 0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD, 0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA, + 0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC, 0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6, + 0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5, 0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4, + 0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9, 0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD, + 0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2, 0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2, + 0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7, 0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA, + 0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC, 0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7, + 0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5, 0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6, + 0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0, 0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9, + 0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2, 0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED, + 0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2, 0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA, + 0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA, 0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4, + 0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB, 0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA, + 0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0, 0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0, + 0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4, 0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1, + 0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC, 0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8, + 0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7, 0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9, + 0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF, 0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD, + 0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB, 0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4, + 0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6, 0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA, + 0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7, 0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5, + 0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5, 0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6, + 0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA, 0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6, + 0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC, 0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB, + 0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7, 0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2, + 0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1, 0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4, + 0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5, 0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD, + 0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5, 0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6, + 0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4, 0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE, + 0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB, 0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2, + 0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD, 0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC, + 0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2, 0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3, + 0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6, 0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF, + 0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3, 0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE, + 0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA, 0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1, + 0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8, 0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE, + 0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD, 0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2, + 0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9, 0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9, + 0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC, 0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE, + 0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2, 0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4, + 0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA, 0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6, + 0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8, 0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5, + 0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7, 0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5, + 0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1, 0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8, + 0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF, 0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4, + 0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3, 0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE, + 0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4, 0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9, + 0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8, 0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5, + 0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0, 0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC, + 0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7, 0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA, + 0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9, 0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4, + 0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5, 0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE, + 0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2, 0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE, + 0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED, 0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2, + 0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7, 0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE, + 0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2, 0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE, + 0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8, 0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1, + 0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6, 0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9, + 0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB, 0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC, + 0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC, 0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE, + 0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2, 0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD, + 0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8, 0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0, + 0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1, 0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD, + 0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE, 0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0, + 0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9, 0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA, + 0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8, 0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB, + 0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE, 0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1, + 0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD, 0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD, + 0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB, 0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6, + 0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE, 0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA, + 0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6, 0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9, + 0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0, 0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD, + 0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7, 0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5, + 0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB, 0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF, + 0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9, 0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC, + 0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD, 0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1, + 0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3, 0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE, + 0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7, 0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7, + 0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2, 0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0, + 0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC, 0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2, + 0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4, 0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE, + 0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB, 0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD, + 0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9, 0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC, + 0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7, 0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3, + 0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9, 0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6, + 0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA, 0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1, + 0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7, 0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF, + 0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5, 0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3, + 0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4, 0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC, + 0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC, 0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2, + 0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE, 0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6, + 0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8, 0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2, + 0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB, 0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1, + 0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4, 0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD, + 0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6, 0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8, + 0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD, 0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD, + 0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4, 0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9, + 0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE, 0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA, + 0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE, 0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB, + 0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5, 0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD, + 0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7, 0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA, + 0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9, 0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3, + 0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0, 0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE, + 0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6, 0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB, + 0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC, 0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5, + 0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1, 0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC, + 0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0, 0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE, + 0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3, 0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7, + 0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9, 0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8, + 0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7, 0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2, + 0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD, 0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7, + 0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7, 0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3, + 0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3, 0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB, + 0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3, 0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA, + 0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3, 0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0, + 0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5, 0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0, + 0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3, 0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4, + 0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA, 0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9, + 0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED, 0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA, + 0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3, 0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2, + 0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC, 0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4, + 0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC, 0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD, + 0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB, 0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC, + 0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD, 0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6, + 0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB, 0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1, + 0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0, 0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE, + 0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4, 0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF, + 0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2, 0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD, + 0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE, 0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB, + 0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD, 0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1, + 0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2, 0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0, + 0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9, 0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3, + 0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8, 0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2, + 0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7, 0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0, + 0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB, 0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE, + 0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA, 0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE, + 0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF, 0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4, + 0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4, 0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7, + 0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5, 0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9, + 0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4, 0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC, + 0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5, 0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF, + 0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE, 0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2, + 0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5, 0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8, + 0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA, 0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6, + 0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2, 0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA, + 0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2, 0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6, + 0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC, 0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0, + 0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1, 0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6, + 0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB, 0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6, + 0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC, 0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5, + 0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB, 0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD, + 0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC, 0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3, + 0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF, 0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1, + 0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD, 0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7, + 0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF, 0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7, + 0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD, 0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2, + 0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE, 0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9, + 0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA, 0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5, + 0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD, 0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3, + 0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB, 0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9, + 0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3, 0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED, + 0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8, 0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5, + 0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8, 0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5, + 0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4, 0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8, + 0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3, 0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5, + 0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE, 0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4, + 0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6, 0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8, + 0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE, 0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB, + 0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC, 0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE, + 0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6, 0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9, + 0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA, 0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC, + 0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA, 0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3, + 0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA, 0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB, + 0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA, 0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4, + 0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1, 0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC, + 0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE, 0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2, + 0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF, 0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2, + 0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4, 0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7, + 0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2, 0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE, + 0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA, 0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE, + 0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF, 0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5, + 0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA, 0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD, + 0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB, 0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8, + 0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9, 0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9, + 0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD, 0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9, + 0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF, 0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF, + 0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7, 0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE, + 0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9, 0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF, + 0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4, 0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB, + 0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6, 0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0, + 0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7, 0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3, + 0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC, 0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF, + 0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5, 0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7, + 0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF, 0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7, + 0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1, 0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF, + 0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5, 0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6, + 0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5, 0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8, + 0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8, 0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE, + 0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA, 0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5, + 0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5, 0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3, + 0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0, 0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6, + 0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA, 0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD, + 0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0, 0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0, + 0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3, 0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4, + 0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8, 0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9, + 0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5, 0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF, + 0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2, 0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA, + 0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE, 0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE, + 0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8, 0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8, + 0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8, 0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7, + 0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7, 0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8, + 0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7, 0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5, + 0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE, 0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4, + 0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD, 0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0, + 0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9, 0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2, + 0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC, 0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB, + 0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF, 0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6, + 0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8, 0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2, + 0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE, 0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0, + 0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD, 0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7, + 0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6, 0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB, + 0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1, 0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC, + 0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3, 0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6, + 0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD, 0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB, + 0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3, 0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE, + 0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC, 0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6, + 0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED, 0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB, + 0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6, 0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0, + 0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF, 0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF, + 0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE, 0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC, + 0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9, 0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6, + 0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4, 0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3, + 0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3, 0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE, + 0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4, 0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB, + 0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6, 0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD, + 0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0, 0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE, + 0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8, 0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2, + 0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9, 0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA, + 0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE, 0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB, + 0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF, 0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2, + 0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC, 0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4, + 0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA, 0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6, + 0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC, 0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4, + 0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD, 0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0, + 0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF, 0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8, + 0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD, 0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5, + 0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8, 0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4, + 0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA, 0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6, + 0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE, 0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1, + 0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB, 0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD, + 0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA, 0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9, + 0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0, 0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2, + 0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD, 0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9, + 0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1, 0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1, + 0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0, 0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD, + 0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF, 0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB, + 0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3, 0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5, + 0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3, 0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5, + 0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5, 0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE, + 0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE, 0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED, + 0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0, 0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4, + 0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9, 0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD, + 0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7, 0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2, + 0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8, 0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA, + 0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE, 0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC, + 0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5, 0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB, + 0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD, 0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4, + 0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE, 0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5, + 0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5, 0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE, + 0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9, 0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB, + 0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1, 0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8, + 0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2, 0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE, + 0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC, 0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4, + 0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE, 0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA, + 0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC, 0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7, + 0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB, 0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2, + 0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1, 0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8, + 0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE, 0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8, + 0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF, 0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9, + 0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC, 0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5, + 0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA, 0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3, + 0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE, 0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6, + 0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3, 0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE, + 0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4, 0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8, + 0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3, 0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5, + 0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9, 0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC, + 0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD, 0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC, + 0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0, 0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8, + 0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD, 0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1, + 0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED, 0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9, + 0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8, 0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9, + 0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3, 0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5, + 0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF, 0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0, + 0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6, 0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8, + 0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB, 0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3, + 0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8, 0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5, + 0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC, 0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4, + 0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4, 0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3, + 0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE, 0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF, + 0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC, 0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB, + 0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB, 0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1, + 0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9, 0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5, + 0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5, 0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5, + 0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE, 0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2, + 0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4, 0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC, + 0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3, 0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8, + 0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6, 0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA, + 0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE, 0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9, + 0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0, 0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA, + 0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE, 0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD, + 0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD, 0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE, + 0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE, 0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8, + 0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA, 0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6, + 0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7, 0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7, + 0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9, 0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1, + 0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD, 0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF, + 0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8, 0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1, + 0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1, 0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4, + 0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5, 0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4, + 0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6, 0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE, + 0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6, 0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA, + 0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0, 0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6, + 0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD, 0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD, + 0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4, 0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE, + 0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7, 0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0, + 0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD, 0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8, + 0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1, 0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3, + 0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC, 0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2, + 0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3, 0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD, + 0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD, 0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8, + 0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4, 0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC, + 0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED, 0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC, + 0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9, 0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE, + 0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2, 0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9, + 0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7, 0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA, + 0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5, 0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7, + 0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8, 0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7, + 0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2, 0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6, + 0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1, 0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8, + 0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8, 0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4, + 0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3, 0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0, + 0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5, 0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB, + 0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5, 0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1, + 0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD, 0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE, + 0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2, 0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0, + 0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE, 0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3, + 0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4, 0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC, + 0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6, 0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6, + 0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE, 0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA, + 0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3, 0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6, + 0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5, 0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5, + 0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9, 0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2, + 0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1, 0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF, + 0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD, 0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2, + 0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1, 0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC, + 0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE, 0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4, + 0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3, 0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD, + 0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7, 0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7, + 0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4, 0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4, + 0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA, 0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5, + 0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9, 0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA, + 0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF, 0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2, + 0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED, 0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7, + 0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8, 0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6, + 0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2, 0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9, + 0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3, 0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3, + 0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD, 0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB, + 0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6, 0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7, + 0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5, 0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9, + 0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF, 0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA, + 0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE, 0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5, + 0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9, 0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC, + 0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2, 0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF, + 0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD, 0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8, + 0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9, 0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE, + 0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0, 0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0, + 0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9, 0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4, + 0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2, 0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA, + 0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5, 0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB, + 0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7, 0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6, + 0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1, 0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4, + 0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8, 0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0, + 0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC, 0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD, + 0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE, 0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE, + 0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED, 0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD, + 0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB, 0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8, + 0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB, 0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3, + 0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA, 0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD, + 0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5, 0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1, + 0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6, 0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB, + 0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF, 0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142, + 0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4, 0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145, + 0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149, 0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB, + 0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF, 0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2, + 0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C, 0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F, + 0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152, 0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156, + 0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9, 0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159, + 0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163, 0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165, + 0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168, 0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B, + 0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F, 0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0, + 0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175, 0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179, + 0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182, 0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185, + 0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188, 0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C, + 0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190, 0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194, + 0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198, 0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A, + 0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8, 0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E, + 0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2, 0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD, + 0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4, 0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3, + 0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8, 0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB, + 0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE, 0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2, + 0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9, 0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5, + 0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9, 0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA, + 0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0, 0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF, + 0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3, 0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4, + 0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6, 0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9, + 0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC, 0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF, + 0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2, 0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6, + 0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC, 0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC, + 0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0, 0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2, + 0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0, 0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6, + 0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4, 0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7, + 0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB, 0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF, + 0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1, 0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4, + 0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6, 0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA, + 0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3, 0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE, + 0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244, 0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247, + 0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A, 0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D, + 0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251, 0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254, + 0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256, 0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A, + 0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262, 0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265, + 0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268, 0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C, + 0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1, 0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270, + 0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274, 0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277, + 0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A, 0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283, + 0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287, 0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7, + 0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D, 0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291, + 0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293, 0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB, + 0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296, 0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF, + 0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2, 0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C, + 0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0, 0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2, + 0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5, 0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8, + 0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC, 0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0, + 0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2, 0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6, + 0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9, 0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD, + 0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1, 0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5, + 0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC, 0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC, + 0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0, 0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2, + 0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5, 0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8, + 0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC, 0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3, + 0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1, 0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5, + 0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8, 0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB, + 0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE, 0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2, + 0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6, 0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA, + 0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE, 0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342, + 0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA, 0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346, + 0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A, 0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF, + 0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E, 0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352, + 0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355, 0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359, + 0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363, 0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367, + 0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B, 0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F, + 0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373, 0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375, + 0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5, 0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379, + 0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383, 0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA, + 0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386, 0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389, + 0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A, 0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D, + 0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F, 0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393, + 0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6, 0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396, + 0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399, 0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B, + 0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E, 0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1, + 0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5, 0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2, + 0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8, 0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC, + 0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE, 0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2, + 0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5, 0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9, + 0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD, 0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1, + 0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5, 0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9, + 0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD, 0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1, + 0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5, 0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9, + 0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD, 0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1, + 0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2, 0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5, + 0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8, 0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC, + 0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF, 0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF, + 0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3, 0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5, + 0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8, 0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC, + 0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442, 0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6, + 0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447, 0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B, + 0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E, 0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451, + 0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454, 0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458, + 0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB, 0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464, + 0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467, 0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A, + 0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E, 0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472, + 0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476, 0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A, + 0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484, 0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488, + 0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A, 0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C, + 0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F, 0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493, + 0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6, 0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9, + 0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499, 0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B, + 0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F, 0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2, + 0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6, 0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA, + 0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC, 0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0, + 0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2, 0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6, + 0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA, 0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE, + 0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2, 0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5, + 0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9, 0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC, + 0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF, 0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2, + 0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6, 0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8, + 0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB, 0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF, + 0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2, 0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6, + 0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA, 0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE, + 0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2, 0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6, + 0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA, 0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC, + 0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541, 0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544, + 0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD, 0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0, + 0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A, 0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E, + 0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551, 0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555, + 0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558, 0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562, + 0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566, 0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568, + 0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C, 0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E, + 0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571, 0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574, + 0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578, 0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A, + 0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583, 0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587, + 0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A, 0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D, + 0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590, 0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594, + 0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596, 0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A, + 0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E, 0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1, + 0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5, 0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9, + 0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD, 0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1, + 0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5, 0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9, + 0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB, 0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD, + 0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF, 0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA, + 0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD, 0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6, + 0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9, 0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD, + 0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1, 0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5, + 0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9, 0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD, + 0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1, 0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5, + 0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7, 0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA, + 0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED, 0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1, + 0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8, 0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5, + 0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9, 0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA, + 0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE, 0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD, + 0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643, 0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4, + 0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8, 0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA, + 0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648, 0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B, + 0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E, 0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652, + 0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1, 0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655, + 0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659, 0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661, + 0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664, 0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667, + 0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B, 0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E, + 0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671, 0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675, + 0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679, 0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683, + 0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687, 0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B, + 0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F, 0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693, + 0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697, 0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC, + 0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B, 0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0, + 0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0, 0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3, + 0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3, 0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6, + 0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8, 0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB, + 0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE, 0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2, + 0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD, 0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5, + 0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9, 0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB, + 0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE, 0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1, + 0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5, 0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7, + 0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9, 0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC, + 0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF, 0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2, + 0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6, 0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA, + 0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE, 0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2, + 0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6, 0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8, + 0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB, 0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED, + 0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1, 0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2, + 0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5, 0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5, + 0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA, 0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD, + 0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742, 0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746, + 0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A, 0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D, + 0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751, 0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755, + 0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759, 0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763, + 0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767, 0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B, + 0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F, 0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773, + 0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776, 0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779, + 0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782, 0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786, + 0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1, 0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B, + 0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F, 0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791, + 0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794, 0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797, + 0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B, 0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7, + 0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0, 0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4, + 0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6, 0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC, + 0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB, 0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF, + 0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0, 0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3, + 0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7, 0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA, + 0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE, 0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2, + 0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6, 0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA, + 0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD, 0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1, + 0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4, 0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8, + 0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC, 0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0, + 0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4, 0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8, + 0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC, 0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF, + 0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2, 0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5, + 0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9, 0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB, + 0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841, 0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845, + 0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847, 0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B, + 0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E, 0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852, + 0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854, 0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857, + 0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861, 0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863, + 0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866, 0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867, + 0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B, 0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8, + 0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E, 0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871, + 0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874, 0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877, + 0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A, 0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884, + 0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888, 0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C, + 0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890, 0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892, + 0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895, 0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897, + 0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B, 0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6, + 0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F, 0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2, + 0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3, 0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD, + 0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1, 0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2, + 0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5, 0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9, + 0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA, 0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE, + 0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1, 0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4, + 0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8, 0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1, + 0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB, 0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF, + 0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2, 0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6, + 0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA, 0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE, + 0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2, 0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6, + 0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA, 0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE, + 0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2, 0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6, + 0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA, 0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE, + 0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2, 0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6, + 0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7, 0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9, + 0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC, 0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE, + 0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1, 0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3, + 0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946, 0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948, + 0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B, 0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E, + 0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952, 0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB, + 0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955, 0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959, + 0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962, 0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965, + 0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968, 0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C, + 0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970, 0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972, + 0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976, 0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979, + 0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982, 0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986, + 0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A, 0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E, + 0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992, 0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996, + 0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998, 0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8, + 0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C, 0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F, + 0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE, 0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0, + 0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5, 0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8, + 0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB, 0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE, + 0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2, 0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6, + 0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA, 0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE, + 0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1, 0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5, + 0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9, 0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD, + 0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1, 0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4, + 0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8, 0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB, + 0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE, 0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1, + 0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5, 0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC, + 0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA, 0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE, + 0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1, 0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5, + 0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9, 0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD, + 0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43, 0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47, + 0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B, 0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D, + 0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50, 0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53, + 0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57, 0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4, + 0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61, 0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65, + 0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68, 0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C, + 0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70, 0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74, + 0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78, 0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81, + 0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85, 0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88, + 0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C, 0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90, + 0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94, 0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98, + 0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B, 0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F, + 0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2, 0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5, + 0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8, 0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC, + 0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE, 0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1, + 0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5, 0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8, + 0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB, 0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE, + 0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2, 0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5, + 0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8, 0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC, + 0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE, 0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8, + 0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2, 0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6, + 0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED, 0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA, + 0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE, 0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1, + 0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5, 0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9, + 0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED, 0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1, + 0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5, 0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9, + 0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB, 0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3, + 0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42, 0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46, + 0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7, 0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48, + 0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C, 0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E, + 0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51, 0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54, + 0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58, 0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3, + 0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61, 0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6, + 0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66, 0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69, + 0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C, 0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70, + 0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD, 0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73, + 0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77, 0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81, + 0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85, 0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89, + 0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D, 0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91, + 0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95, 0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99, + 0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D, 0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1, + 0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5, 0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9, + 0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD, 0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1, + 0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5, 0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7, + 0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA, 0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5, + 0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF, 0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8, + 0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2, 0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB, + 0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7, 0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA, + 0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD, 0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1, + 0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2, 0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4, + 0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8, 0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB, + 0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF, 0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3, + 0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7, 0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB, + 0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE, 0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2, + 0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6, 0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA, + 0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE, 0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44, + 0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48, 0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C, + 0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50, 0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52, + 0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55, 0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58, + 0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62, 0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66, + 0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69, 0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D, + 0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70, 0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74, + 0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77, 0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81, + 0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85, 0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89, + 0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D, 0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90, + 0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94, 0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98, + 0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C, 0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0, + 0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4, 0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8, + 0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB, 0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE, + 0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2, 0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6, + 0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA, 0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE, + 0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2, 0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6, + 0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA, 0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE, + 0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2, 0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6, + 0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA, 0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE, + 0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0, 0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3, + 0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6, 0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5, + 0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC, 0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF, + 0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3, 0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7, + 0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB, 0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41, + 0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45, 0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49, + 0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D, 0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51, + 0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54, 0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58, + 0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62, 0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66, + 0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A, 0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E, + 0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72, 0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75, + 0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78, 0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81, + 0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85, 0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87, + 0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A, 0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E, + 0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92, 0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96, + 0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A, 0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E, + 0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2, 0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6, + 0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA, 0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC, + 0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2, 0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1, + 0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5, 0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6, + 0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA, 0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE, + 0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1, 0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4, + 0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7, 0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB, + 0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD, 0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1, + 0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5, 0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8, + 0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB, 0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE, + 0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2, 0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1, + 0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6, 0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA, + 0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC, 0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF, + 0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2, 0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6, + 0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9, 0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8, + 0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE, 0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC, + 0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41, 0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44, + 0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48, 0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7, + 0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B, 0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F, + 0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51, 0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54, + 0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58, 0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62, + 0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD, 0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68, + 0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C, 0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70, + 0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74, 0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78, + 0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82, 0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86, + 0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A, 0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E, + 0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90, 0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93, + 0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96, 0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A, + 0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5, 0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D, + 0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8, 0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2, + 0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5, 0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8, + 0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC, 0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF, + 0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0, 0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4, + 0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6, 0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9, + 0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC, 0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0, + 0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7, 0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3, + 0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7, 0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA, + 0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD, 0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1, + 0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5, 0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD, + 0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB, 0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF, + 0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1, 0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4, + 0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7, 0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB, + 0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4, 0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF, + 0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3, 0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6, + 0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9, 0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD, + 0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43, 0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47, + 0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A, 0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E, + 0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52, 0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56, + 0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A, 0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64, + 0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68, 0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B, + 0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F, 0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72, + 0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75, 0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78, + 0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82, 0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF, + 0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86, 0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A, + 0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D, 0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90, + 0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93, 0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97, + 0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5, 0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C, + 0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0, 0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2, + 0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5, 0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8, + 0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC, 0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED, + 0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0, 0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4, + 0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7, 0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB, + 0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF, 0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3, + 0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7, 0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA, + 0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE, 0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1, + 0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5, 0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9, + 0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD, 0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1, + 0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5, 0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9, + 0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB, 0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE, + 0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1, 0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5, + 0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7, 0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA, + 0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE, 0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042, + 0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045, 0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048, + 0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C, 0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1, + 0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050, 0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054, + 0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056, 0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059, + 0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062, 0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066, + 0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9, 0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069, + 0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B, 0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F, + 0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073, 0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077, + 0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081, 0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085, + 0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089, 0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D, + 0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F, 0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092, + 0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095, 0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099, + 0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4, 0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D, + 0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1, 0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3, + 0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA, 0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5, + 0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9, 0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0, + 0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC, 0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4, + 0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0, 0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3, + 0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6, 0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA, + 0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB, 0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC, + 0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0, 0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2, + 0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6, 0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9, + 0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD, 0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1, + 0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4, 0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8, + 0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC, 0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0, + 0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4, 0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8, + 0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC, 0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0, + 0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4, 0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6, + 0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9, 0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB, + 0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141, 0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA, + 0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144, 0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD, + 0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149, 0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C, + 0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F, 0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153, + 0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4, 0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156, + 0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A, 0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162, + 0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165, 0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168, + 0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C, 0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB, + 0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE, 0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174, + 0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177, 0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181, + 0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185, 0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189, + 0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D, 0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191, + 0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195, 0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2, + 0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199, 0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B, + 0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F, 0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8, + 0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3, 0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7, + 0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA, 0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD, + 0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1, 0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5, + 0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9, 0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB, + 0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF, 0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3, + 0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7, 0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB, + 0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF, 0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3, + 0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7, 0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB, + 0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE, 0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1, + 0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4, 0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8, + 0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4, 0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED, + 0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1, 0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4, + 0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7, 0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA, + 0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE, 0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA, + 0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246, 0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A, + 0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B, 0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF, + 0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E, 0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252, + 0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5, 0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256, + 0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8, 0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261, + 0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264, 0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267, + 0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B, 0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD, + 0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271, 0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275, + 0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278, 0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282, + 0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286, 0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A, + 0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E, 0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292, + 0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296, 0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299, + 0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C, 0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F, + 0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3, 0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7, + 0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB, 0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF, + 0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2, 0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5, + 0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8, 0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC, + 0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6, 0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2, + 0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6, 0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9, + 0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC, 0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF, + 0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3, 0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB, + 0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9, 0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD, + 0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1, 0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5, + 0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9, 0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED, + 0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1, 0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5, + 0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9, 0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB, + 0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF, 0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341, + 0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345, 0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4, + 0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7, 0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A, + 0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC, 0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE, + 0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2, 0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350, + 0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5, 0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354, + 0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357, 0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359, + 0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362, 0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365, + 0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369, 0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE, + 0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C, 0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F, + 0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371, 0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374, + 0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378, 0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382, + 0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385, 0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389, + 0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D, 0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391, + 0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395, 0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399, + 0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D, 0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1, + 0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5, 0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9, + 0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB, 0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9, + 0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF, 0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3, + 0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE, 0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6, + 0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA, 0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC, + 0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6, 0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1, + 0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5, 0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA, + 0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8, 0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC, + 0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE, 0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1, + 0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4, 0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8, + 0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2, 0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC, + 0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF, 0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2, + 0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5, 0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9, + 0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED, 0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1, + 0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5, 0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9, + 0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA, 0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD, + 0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442, 0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446, + 0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF, 0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A, + 0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E, 0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451, + 0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454, 0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458, + 0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462, 0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466, + 0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469, 0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D, + 0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470, 0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474, + 0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478, 0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482, + 0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486, 0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489, + 0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D, 0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F, + 0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492, 0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495, + 0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499, 0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B, + 0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F, 0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3, + 0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6, 0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9, + 0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD, 0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1, + 0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5, 0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9, + 0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD, 0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF, + 0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1, 0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2, + 0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6, 0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7, + 0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA, 0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC, + 0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF, 0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3, + 0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6, 0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA, + 0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE, 0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1, + 0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5, 0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8, + 0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC, 0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0, + 0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4, 0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8, + 0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC, 0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542, + 0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544, 0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547, + 0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A, 0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E, + 0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552, 0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555, + 0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559, 0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562, + 0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565, 0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568, + 0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C, 0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8, + 0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571, 0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575, + 0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577, 0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A, + 0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583, 0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587, + 0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0, 0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C, + 0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590, 0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594, + 0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598, 0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C, + 0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0, 0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4, + 0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8, 0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC, + 0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE, 0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1, + 0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3, 0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7, + 0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8, 0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB, + 0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD, 0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF, + 0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2, 0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4, + 0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8, 0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5, + 0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB, 0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8, + 0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0, 0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3, + 0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6, 0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA, + 0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF, 0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD, + 0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1, 0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3, + 0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7, 0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB, + 0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF, 0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2, + 0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6, 0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA, + 0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE, 0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644, + 0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648, 0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C, + 0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650, 0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654, + 0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658, 0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A, + 0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8, 0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665, + 0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669, 0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB, + 0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D, 0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671, + 0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674, 0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678, + 0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682, 0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686, + 0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A, 0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D, + 0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691, 0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693, + 0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697, 0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B, + 0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F, 0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4, + 0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2, 0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6, + 0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA, 0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE, + 0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2, 0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6, + 0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA, 0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE, + 0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2, 0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4, + 0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7, 0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA, + 0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE, 0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0, + 0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3, 0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7, + 0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB, 0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF, + 0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3, 0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7, + 0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB, 0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF, + 0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3, 0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7, + 0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB, 0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741, + 0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745, 0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749, + 0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D, 0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751, + 0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754, 0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758, + 0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762, 0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766, + 0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A, 0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E, + 0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772, 0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775, + 0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779, 0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783, + 0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787, 0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B, + 0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E, 0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792, + 0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794, 0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797, + 0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A, 0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E, + 0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6, 0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3, + 0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7, 0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB, + 0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF, 0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3, + 0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7, 0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB, + 0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF, 0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3, + 0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7, 0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB, + 0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF, 0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3, + 0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7, 0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB, + 0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF, 0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3, + 0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7, 0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB, + 0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF, 0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3, + 0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7, 0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB, + 0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE, 0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844, + 0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848, 0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C, + 0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850, 0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853, + 0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857, 0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A, + 0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863, 0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866, + 0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A, 0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C, + 0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870, 0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874, + 0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878, 0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882, + 0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886, 0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A, + 0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E, 0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892, + 0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896, 0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898, + 0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B, 0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E, + 0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2, 0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5, + 0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6, 0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA, + 0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9, 0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB, + 0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE, 0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2, + 0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1, 0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5, + 0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8, 0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA, + 0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD, 0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0, + 0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4, 0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB, + 0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7, 0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB, + 0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD, 0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0, + 0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3, 0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7, + 0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6, 0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB, + 0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF, 0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2, + 0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5, 0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8, + 0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC, 0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF, + 0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2, 0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6, + 0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0, 0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2, + 0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5, 0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD, + 0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8, 0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942, + 0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945, 0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947, + 0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A, 0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D, + 0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951, 0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2, + 0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954, 0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958, + 0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A, 0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963, + 0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966, 0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A, + 0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB, 0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D, + 0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971, 0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974, + 0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977, 0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A, + 0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984, 0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988, + 0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B, 0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F, + 0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990, 0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993, + 0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995, 0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999, + 0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA, 0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D, + 0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0, 0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2, + 0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5, 0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8, + 0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC, 0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0, + 0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3, 0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7, + 0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA, 0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD, + 0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0, 0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4, + 0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6, 0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9, + 0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD, 0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0, + 0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3, 0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6, + 0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA, 0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED, + 0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF, 0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3, + 0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5, 0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8, + 0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB, 0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF, + 0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4, 0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3, + 0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7, 0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9, + 0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9, 0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE, + 0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44, 0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD, + 0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1, 0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49, + 0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C, 0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50, + 0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54, 0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58, + 0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62, 0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65, + 0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69, 0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B, + 0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E, 0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71, + 0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75, 0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78, + 0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81, 0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85, + 0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87, 0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A, + 0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D, 0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91, + 0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2, 0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95, + 0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99, 0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B, + 0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F, 0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2, + 0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6, 0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8, + 0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB, 0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF, + 0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1, 0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4, + 0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6, 0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA, + 0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1, 0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE, + 0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2, 0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6, + 0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA, 0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE, + 0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2, 0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6, + 0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA, 0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE, + 0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0, 0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6, + 0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5, 0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8, + 0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB, 0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC, + 0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF, 0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0, + 0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3, 0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6, + 0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA, 0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC, + 0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE, 0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7, + 0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45, 0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48, + 0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B, 0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F, + 0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51, 0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53, + 0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57, 0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61, + 0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65, 0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69, + 0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D, 0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71, + 0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74, 0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78, + 0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82, 0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86, + 0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A, 0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E, + 0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92, 0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96, + 0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A, 0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C, + 0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F, 0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1, + 0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5, 0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7, + 0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9, 0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD, + 0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0, 0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3, + 0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6, 0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA, + 0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE, 0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2, + 0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6, 0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA, + 0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE, 0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2, + 0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6, 0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA, + 0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE, 0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2, + 0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6, 0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9, + 0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED, 0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1, + 0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5, 0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9, + 0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD, 0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41, + 0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1, 0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45, + 0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49, 0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B, + 0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E, 0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52, + 0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54, 0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57, + 0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61, 0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65, + 0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69, 0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C, + 0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70, 0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73, + 0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77, 0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81, + 0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85, 0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89, + 0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C, 0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90, + 0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93, 0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96, + 0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99, 0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D, + 0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F, 0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3, + 0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7, 0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA, + 0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE, 0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2, + 0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6, 0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA, + 0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE, 0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2, + 0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4, 0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7, + 0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA, 0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE, + 0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0, 0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3, + 0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7, 0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA, + 0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE, 0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2, + 0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6, 0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA, + 0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED, 0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1, + 0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4, 0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8, + 0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC, 0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42, + 0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46, 0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A, + 0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E, 0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51, + 0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54, 0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58, + 0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62, 0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66, + 0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A, 0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E, + 0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72, 0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76, + 0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A, 0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84, + 0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88, 0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B, + 0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F, 0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91, + 0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94, 0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96, + 0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7, 0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B, + 0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F, 0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3, + 0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6, 0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9, + 0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC, 0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0, + 0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3, 0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7, + 0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB, 0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD, + 0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0, 0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3, + 0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7, 0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4, + 0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB, 0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF, + 0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1, 0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2, + 0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3, 0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE, + 0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1, 0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9, + 0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB, 0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD, + 0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0, 0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3, + 0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7, 0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC, + 0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA, 0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE, + 0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0, 0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3, + 0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3, 0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9, + 0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6, 0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD, + 0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9, 0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44, + 0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47, 0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A, + 0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E, 0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51, + 0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55, 0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59, + 0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61, 0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2, + 0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63, 0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67, + 0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9, 0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68, + 0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A, 0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C, + 0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F, 0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72, + 0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76, 0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7, + 0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A, 0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84, + 0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85, 0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88, + 0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF, 0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D, + 0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3, 0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F, + 0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8, 0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93, + 0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96, 0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99, + 0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D, 0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE, + 0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1, 0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5, + 0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7, 0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA, + 0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB, 0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7, + 0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA, 0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC, + 0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4, 0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6, + 0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9, 0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC, + 0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0, 0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3, + 0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3, 0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7, + 0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9, 0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC, + 0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0, 0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4, + 0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA, 0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9, + 0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD, 0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF, + 0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2, 0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5, + 0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9, 0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2, + 0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED, 0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1, + 0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3, 0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6, + 0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9, 0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD, + 0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA, 0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43, + 0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47, 0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49, + 0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C, 0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D, + 0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51, 0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4, + 0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55, 0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59, + 0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61, 0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64, + 0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67, 0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B, + 0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D, 0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F, + 0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73, 0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75, + 0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78, 0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81, + 0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85, 0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87, + 0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A, 0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E, + 0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90, 0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93, + 0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96, 0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A, + 0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD, 0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E, + 0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2, 0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4, + 0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7, 0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA, + 0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE, 0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5, + 0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7, 0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5, + 0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7, 0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA, + 0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD, 0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0, + 0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF, 0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2, + 0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6, 0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5, + 0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8, 0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB, + 0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF, 0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB, + 0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5, 0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9, + 0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB, 0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE, + 0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF, 0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2, + 0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5, 0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4, + 0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7, 0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9, + 0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE, 0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC, + 0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0, 0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3, + 0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2, 0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6, + 0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8, 0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB, + 0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE, 0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044, + 0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED, 0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047, + 0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B, 0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D, + 0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F, 0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052, + 0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056, 0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059, + 0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062, 0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066, + 0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069, 0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C, + 0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F, 0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073, + 0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077, 0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081, + 0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085, 0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087, + 0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A, 0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C, + 0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090, 0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3, + 0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093, 0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097, + 0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099, 0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C, + 0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F, 0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3, + 0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC, 0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7, + 0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB, 0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE, + 0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1, 0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4, + 0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8, 0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA, + 0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC, 0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0, + 0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3, 0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7, + 0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB, 0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF, + 0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3, 0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7, + 0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB, 0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD, + 0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0, 0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2, + 0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6, 0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD, + 0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0, 0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1, + 0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED, 0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1, + 0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4, 0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8, + 0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6, 0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD, + 0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143, 0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146, + 0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A, 0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E, + 0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152, 0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156, + 0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158, 0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162, + 0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165, 0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168, + 0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B, 0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F, + 0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0, 0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173, + 0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177, 0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179, + 0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182, 0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186, + 0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A, 0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E, + 0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191, 0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195, + 0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197, 0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A, + 0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B, 0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F, + 0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE, 0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243, + 0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247, 0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A, + 0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E, 0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252, + 0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256, 0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A, + 0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263, 0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267, + 0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A, 0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E, + 0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272, 0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276, + 0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A, 0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284, + 0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288, 0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A, + 0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D, 0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290, + 0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294, 0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9, + 0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299, 0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D, + 0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0, 0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343, + 0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346, 0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A, + 0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D, 0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351, + 0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355, 0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357, + 0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A, 0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363, + 0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367, 0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4, + 0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B, 0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F, + 0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373, 0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377, + 0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381, 0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385, + 0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389, 0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D, + 0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391, 0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393, + 0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9, 0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397, + 0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B, 0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE, + 0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E, 0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0, + 0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442, 0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444, + 0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA, 0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A, + 0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD, 0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D, + 0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451, 0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453, + 0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456, 0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459, + 0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463, 0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6, + 0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466, 0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A, + 0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D, 0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470, + 0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474, 0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478, + 0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482, 0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485, + 0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489, 0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D, + 0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491, 0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495, + 0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499, 0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D, + 0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541, 0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545, + 0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547, 0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A, + 0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D, 0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551, + 0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2, 0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554, + 0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558, 0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561, + 0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565, 0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569, + 0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D, 0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571, + 0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574, 0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578, + 0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581, 0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585, + 0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589, 0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D, + 0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591, 0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594, + 0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598, 0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C, + 0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0, 0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644, + 0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648, 0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C, + 0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650, 0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654, + 0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656, 0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659, + 0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662, 0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666, + 0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF, 0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1, + 0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D, 0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F, + 0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673, 0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676, + 0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A, 0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684, + 0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687, 0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B, + 0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E, 0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692, + 0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696, 0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A, + 0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E, 0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741, + 0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745, 0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748, + 0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B, 0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E, + 0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752, 0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754, + 0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758, 0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762, + 0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766, 0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A, + 0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E, 0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772, + 0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776, 0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779, + 0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783, 0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785, + 0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788, 0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B, + 0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F, 0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791, + 0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794, 0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798, + 0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B, 0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F, + 0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843, 0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847, + 0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B, 0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D, + 0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851, 0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855, + 0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859, 0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863, + 0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867, 0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B, + 0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F, 0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873, + 0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876, 0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A, + 0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884, 0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888, + 0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C, 0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890, + 0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894, 0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897, + 0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B, 0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F, + 0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943, 0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947, + 0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B, 0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F, + 0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952, 0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956, + 0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A, 0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964, + 0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC, 0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969, + 0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D, 0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971, + 0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975, 0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979, + 0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983, 0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987, + 0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B, 0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F, + 0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991, 0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994, + 0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997, 0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B, + 0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D, 0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F, + 0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6, 0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44, + 0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46, 0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49, + 0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D, 0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE, + 0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F, 0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53, + 0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55, 0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58, + 0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61, 0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65, + 0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA, 0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68, + 0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C, 0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F, + 0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71, 0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74, + 0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78, 0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81, + 0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84, 0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88, + 0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C, 0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90, + 0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94, 0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98, + 0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C, 0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0, + 0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44, 0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46, + 0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49, 0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C, + 0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50, 0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9, + 0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53, 0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57, + 0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59, 0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62, + 0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65, 0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69, + 0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2, 0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D, + 0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71, 0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74, + 0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77, 0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81, + 0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85, 0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89, + 0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C, 0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90, + 0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93, 0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96, + 0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A, 0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E, + 0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42, 0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45, + 0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49, 0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B, + 0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E, 0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51, + 0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55, 0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0, + 0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59, 0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63, + 0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66, 0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69, + 0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C, 0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70, + 0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74, 0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77, + 0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81, 0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85, + 0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89, 0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D, + 0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91, 0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95, + 0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99, 0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D, + 0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0, 0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43, + 0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46, 0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A, + 0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB, 0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E, + 0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52, 0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55, + 0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59, 0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63, + 0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67, 0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A, + 0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E, 0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72, + 0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74, 0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77, + 0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A, 0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84, + 0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5, 0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88, + 0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C, 0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F, + 0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93, 0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97, + 0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B, 0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F, + 0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42, 0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46, + 0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49, 0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C, + 0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50, 0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54, + 0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58, 0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62, + 0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66, 0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69, + 0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C, 0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F, + 0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73, 0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0, + 0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77, 0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81, + 0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84, 0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87, + 0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A, 0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E, + 0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91, 0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94, + 0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98, 0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A, + 0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D, 0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0, + 0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44, 0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD, + 0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48, 0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C, + 0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50, 0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54, + 0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58, 0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62, + 0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66, 0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A, + 0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E, 0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70, + 0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4, 0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74, + 0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78, 0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9, + 0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82, 0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86, + 0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88, 0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B, + 0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E, 0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92, + 0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1, 0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96, + 0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A, 0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C, + 0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F, 0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042, + 0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046, 0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9, + 0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049, 0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D, + 0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F, 0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053, + 0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057, 0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061, + 0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065, 0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068, + 0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C, 0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070, + 0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074, 0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078, + 0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082, 0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086, + 0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A, 0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E, + 0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090, 0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2, + 0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095, 0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099, + 0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6, 0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C, + 0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0, 0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142, + 0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145, 0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148, + 0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C, 0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF, + 0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150, 0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154, + 0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157, 0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A, + 0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163, 0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167, + 0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6, 0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A, + 0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E, 0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171, + 0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175, 0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179, + 0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183, 0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187, + 0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B, 0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F, + 0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191, 0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194, + 0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197, 0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B, + 0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0, 0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F, + 0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243, 0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245, + 0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248, 0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B, + 0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F, 0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252, + 0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255, 0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259, + 0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262, 0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266, + 0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A, 0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E, + 0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272, 0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275, + 0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279, 0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282, + 0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286, 0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289, + 0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D, 0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291, + 0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295, 0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299, + 0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C, 0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0, + 0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344, 0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348, + 0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C, 0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350, + 0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354, 0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356, + 0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359, 0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362, + 0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366, 0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3, + 0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A, 0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E, + 0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371, 0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374, + 0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377, 0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381, + 0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385, 0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388, + 0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C, 0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F, + 0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393, 0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397, + 0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B, 0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F, + 0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442, 0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446, + 0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448, 0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B, + 0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E, 0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452, + 0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3, 0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456, + 0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A, 0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463, + 0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466, 0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469, + 0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D, 0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470, + 0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474, 0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478, + 0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A, 0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483, + 0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486, 0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A, + 0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C, 0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F, + 0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493, 0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497, + 0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B, 0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F, + 0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543, 0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547, + 0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B, 0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F, + 0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551, 0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554, + 0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557, 0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561, + 0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6, 0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565, + 0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569, 0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B, + 0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E, 0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570, + 0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574, 0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF, + 0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577, 0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581, + 0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583, 0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586, + 0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589, 0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D, + 0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8, 0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590, + 0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594, 0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597, + 0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B, 0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F, + 0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643, 0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647, + 0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A, 0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E, + 0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652, 0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656, + 0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A, 0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664, + 0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668, 0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C, + 0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670, 0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672, + 0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675, 0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677, + 0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681, 0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4, + 0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684, 0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688, + 0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A, 0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D, + 0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690, 0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694, + 0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD, 0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698, + 0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C, 0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F, + 0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742, 0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746, + 0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A, 0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E, + 0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751, 0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755, + 0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758, 0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761, + 0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765, 0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769, + 0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D, 0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771, + 0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775, 0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777, + 0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A, 0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783, + 0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787, 0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA, + 0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B, 0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E, + 0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791, 0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794, + 0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798, 0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C, + 0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0, 0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844, + 0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848, 0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B, + 0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F, 0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853, + 0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857, 0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861, + 0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865, 0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869, + 0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C, 0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F, + 0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873, 0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877, + 0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2, 0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883, + 0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887, 0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A, + 0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E, 0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892, + 0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896, 0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A, + 0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E, 0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942, + 0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944, 0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947, + 0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A, 0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E, + 0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB, 0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952, + 0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956, 0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959, + 0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963, 0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967, + 0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B, 0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F, + 0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972, 0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976, + 0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979, 0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983, + 0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987, 0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B, + 0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F, 0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993, + 0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997, 0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999, + 0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C, 0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F, + 0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43, 0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45, + 0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48, 0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C, + 0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F, 0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52, + 0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55, 0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59, + 0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62, 0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65, + 0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69, 0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B, + 0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1, 0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F, + 0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73, 0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6, + 0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78, 0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82, + 0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85, 0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88, + 0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B, 0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F, + 0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91, 0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95, + 0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99, 0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B, + 0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E, 0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41, + 0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45, 0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2, + 0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49, 0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D, + 0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E, 0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51, + 0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53, 0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57, + 0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC, 0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A, + 0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63, 0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65, + 0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68, 0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B, + 0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F, 0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6, + 0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72, 0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76, + 0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78, 0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82, + 0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86, 0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A, + 0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E, 0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92, + 0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96, 0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A, + 0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E, 0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42, + 0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46, 0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A, + 0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E, 0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52, + 0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54, 0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57, + 0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A, 0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64, + 0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1, 0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67, + 0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B, 0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D, + 0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70, 0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73, + 0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77, 0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA, + 0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81, 0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85, + 0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88, 0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B, + 0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E, 0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92, + 0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94, 0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96, + 0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A, 0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D, + 0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41, 0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44, + 0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48, 0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6, + 0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E, 0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52, + 0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54, 0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57, + 0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A, 0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64, + 0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD, 0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68, + 0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C, 0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F, + 0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73, 0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77, + 0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81, 0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85, + 0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88, 0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C, + 0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90, 0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94, + 0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98, 0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C, + 0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0, 0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44, + 0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48, 0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B, + 0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E, 0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52, + 0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56, 0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A, + 0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64, 0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68, + 0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B, 0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E, + 0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71, 0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75, + 0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9, 0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81, + 0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85, 0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87, + 0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD, 0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B, + 0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F, 0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2, + 0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93, 0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97, + 0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A, 0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E, + 0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42, 0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46, + 0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A, 0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D, + 0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51, 0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55, + 0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59, 0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63, + 0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67, 0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B, + 0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F, 0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73, + 0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76, 0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79, + 0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82, 0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86, + 0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA, 0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C, + 0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90, 0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93, + 0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96, 0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99, + 0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D, 0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF, + 0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042, 0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046, + 0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049, 0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C, + 0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F, 0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053, + 0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6, 0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058, + 0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062, 0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066, + 0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A, 0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E, + 0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072, 0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076, + 0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A, 0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084, + 0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086, 0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089, + 0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C, 0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090, + 0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD, 0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094, + 0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098, 0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A, + 0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D, 0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0, + 0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143, 0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6, + 0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147, 0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B, + 0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D, 0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150, + 0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153, 0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157, + 0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE, 0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A, + 0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164, 0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167, + 0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B, 0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F, + 0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173, 0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177, + 0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A, 0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184, + 0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188, 0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C, + 0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190, 0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194, + 0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198, 0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C, + 0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0, 0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242, + 0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245, 0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247, + 0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B, 0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA, + 0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F, 0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253, + 0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255, 0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258, + 0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261, 0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265, + 0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2, 0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269, + 0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D, 0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F, + 0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272, 0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275, + 0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279, 0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA, + 0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282, 0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286, + 0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289, 0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C, + 0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F, 0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293, + 0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296, 0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A, + 0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E, 0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0, + 0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343, 0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346, + 0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349, 0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA, + 0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D, 0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350, + 0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352, 0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355, + 0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358, 0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362, + 0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1, 0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368, + 0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C, 0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E, + 0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371, 0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375, + 0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379, 0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6, + 0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385, 0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389, + 0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B, 0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E, + 0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391, 0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395, + 0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD, 0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A, + 0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E, 0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441, + 0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444, 0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447, + 0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B, 0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3, + 0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451, 0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455, + 0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457, 0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A, + 0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463, 0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466, + 0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA, 0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B, + 0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F, 0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472, + 0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475, 0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478, + 0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482, 0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485, + 0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488, 0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C, + 0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E, 0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491, + 0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494, 0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498, + 0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C, 0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F, + 0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543, 0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545, + 0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548, 0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B, + 0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F, 0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC, + 0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553, 0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557, + 0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559, 0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562, + 0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565, 0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569, + 0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3, 0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E, + 0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572, 0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574, + 0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9, 0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577, + 0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581, 0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE, + 0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585, 0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588, + 0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B, 0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E, + 0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591, 0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595, + 0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597, 0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A, + 0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E, 0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0, + 0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643, 0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646, + 0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A, 0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD, + 0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E, 0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652, + 0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF, 0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2, + 0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4, 0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC, + 0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0, 0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5, + 0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA, 0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0, + 0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC, 0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3, + 0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA, 0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE, + 0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6, 0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA, + 0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF, 0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3, + 0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7, 0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF, + 0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5, 0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9, + 0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1, 0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5, + 0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC, 0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8, + 0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5, 0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5, + 0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3, 0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD, + 0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9, 0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9, + 0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE, 0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA, + 0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1, 0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF, + 0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7, 0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6, + 0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6, 0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1, + 0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8, 0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF, + 0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6, 0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6, + 0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD, 0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6, + 0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF, 0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4, + 0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8, 0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9, + 0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC, 0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5, + 0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE, 0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA, + 0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1, 0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC, + 0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2, 0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA, + 0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2, 0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0, + 0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9, 0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE, + 0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8, 0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1, + 0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB, 0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7, + 0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8, 0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0, + 0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC, 0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC, + 0, 0 +}; + +static const WCHAR oem2uni949[] = { /* Korean --> Unicode pairs */ + 0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06, 0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E, + 0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F, 0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25, + 0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29, 0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32, + 0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36, 0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D, + 0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42, 0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46, + 0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A, 0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50, + 0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55, 0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A, + 0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F, 0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63, + 0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67, 0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B, + 0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F, 0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76, + 0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D, 0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87, + 0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F, 0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95, + 0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99, 0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2, + 0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6, 0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE, + 0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4, 0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA, + 0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2, 0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7, + 0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD, 0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1, + 0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6, 0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB, + 0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF, 0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6, + 0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE, 0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8, + 0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE, 0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03, + 0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09, 0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10, + 0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15, 0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A, + 0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F, 0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24, + 0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28, 0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F, + 0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33, 0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A, + 0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F, 0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43, + 0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B, 0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F, + 0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55, 0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A, + 0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E, 0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64, + 0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68, 0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E, + 0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77, 0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E, + 0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85, 0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B, + 0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91, 0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95, + 0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99, 0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F, + 0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3, 0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8, + 0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC, 0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0, + 0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4, 0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9, + 0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD, 0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3, + 0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9, 0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD, + 0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4, 0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8, + 0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD, 0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2, + 0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7, 0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB, + 0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF, 0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3, + 0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7, 0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE, + 0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05, 0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C, + 0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11, 0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16, + 0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A, 0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E, + 0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22, 0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26, + 0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A, 0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E, + 0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35, 0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C, + 0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42, 0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49, + 0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52, 0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58, + 0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E, 0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66, + 0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D, 0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72, + 0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76, 0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F, + 0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83, 0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89, + 0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E, 0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92, + 0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96, 0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A, + 0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E, 0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2, + 0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6, 0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA, + 0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE, 0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2, + 0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6, 0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA, + 0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2, 0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7, + 0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB, 0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4, + 0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA, 0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF, + 0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3, 0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7, + 0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE, 0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2, + 0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7, 0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD, + 0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01, 0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05, + 0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B, 0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11, + 0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15, 0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19, + 0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D, 0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21, + 0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25, 0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29, + 0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F, 0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36, + 0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A, 0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44, + 0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A, 0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E, + 0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53, 0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57, + 0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B, 0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61, + 0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67, 0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B, + 0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F, 0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73, + 0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77, 0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C, + 0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81, 0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86, + 0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B, 0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F, + 0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96, 0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A, + 0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F, 0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3, + 0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7, 0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB, + 0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF, 0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3, + 0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7, 0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE, + 0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3, 0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA, + 0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1, 0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6, + 0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA, 0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF, + 0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3, 0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7, + 0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED, 0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3, + 0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9, 0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD, + 0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003, 0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008, + 0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D, 0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012, + 0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017, 0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B, + 0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021, 0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025, + 0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A, 0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E, + 0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032, 0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036, + 0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A, 0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E, + 0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042, 0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049, + 0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050, 0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058, + 0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E, 0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062, + 0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066, 0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A, + 0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E, 0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072, + 0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076, 0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A, + 0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081, 0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086, + 0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A, 0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092, + 0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096, 0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E, + 0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6, 0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2, + 0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA, 0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF, + 0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3, 0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC, + 0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2, 0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7, + 0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC, 0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1, + 0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6, 0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA, + 0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE, 0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2, + 0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6, 0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA, + 0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE, 0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102, + 0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106, 0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E, + 0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115, 0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E, + 0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122, 0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A, + 0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F, 0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133, + 0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C, 0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142, + 0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147, 0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C, + 0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152, 0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159, + 0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E, 0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163, + 0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167, 0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B, + 0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F, 0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173, + 0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177, 0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E, + 0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184, 0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A, + 0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190, 0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197, + 0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D, 0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1, + 0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5, 0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA, + 0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE, 0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2, + 0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6, 0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA, + 0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE, 0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2, + 0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6, 0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA, + 0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF, 0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5, + 0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9, 0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0, + 0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4, 0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA, + 0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF, 0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4, + 0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8, 0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF, + 0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203, 0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A, + 0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210, 0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216, + 0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C, 0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221, + 0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225, 0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229, + 0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D, 0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231, + 0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236, 0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A, + 0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F, 0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243, + 0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247, 0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B, + 0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F, 0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253, + 0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257, 0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D, + 0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262, 0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266, + 0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C, 0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270, + 0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276, 0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A, + 0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F, 0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283, + 0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A, 0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E, + 0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295, 0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C, + 0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2, 0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9, + 0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF, 0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5, + 0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9, 0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD, + 0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1, 0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5, + 0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB, 0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1, + 0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6, 0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE, + 0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3, 0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0, + 0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC, 0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303, + 0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309, 0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D, + 0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316, 0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A, + 0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F, 0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323, + 0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327, 0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B, + 0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F, 0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333, + 0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337, 0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B, + 0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F, 0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343, + 0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347, 0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B, + 0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F, 0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353, + 0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D, 0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363, + 0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C, 0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373, + 0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379, 0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D, + 0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386, 0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A, + 0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F, 0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395, + 0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399, 0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D, + 0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3, 0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7, + 0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD, 0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1, + 0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5, 0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9, + 0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD, 0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1, + 0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7, 0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF, + 0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6, 0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE, + 0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3, 0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9, + 0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED, 0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1, + 0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5, 0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9, + 0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE, 0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402, + 0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406, 0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A, + 0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E, 0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413, + 0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417, 0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D, + 0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422, 0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426, + 0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D, 0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431, + 0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436, 0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A, + 0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E, 0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442, + 0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446, 0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A, + 0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E, 0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455, + 0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A, 0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E, + 0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466, 0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A, + 0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F, 0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473, + 0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477, 0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B, + 0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F, 0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484, + 0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489, 0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D, + 0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491, 0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495, + 0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499, 0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E, + 0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2, 0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7, + 0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD, 0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1, + 0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6, 0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC, + 0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1, 0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6, + 0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB, 0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF, + 0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4, 0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9, + 0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF, 0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7, + 0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB, 0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3, + 0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7, 0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC, + 0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500, 0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504, + 0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508, 0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C, + 0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510, 0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516, + 0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D, 0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521, + 0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B, 0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F, + 0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536, 0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B, + 0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F, 0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548, + 0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F, 0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555, + 0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559, 0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562, + 0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566, 0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A, + 0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E, 0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572, + 0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576, 0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A, + 0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E, 0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582, + 0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586, 0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A, + 0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E, 0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592, + 0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596, 0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A, + 0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E, 0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5, + 0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC, 0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2, + 0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9, 0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1, + 0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6, 0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA, + 0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3, 0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7, + 0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC, 0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0, + 0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4, 0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8, + 0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED, 0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1, + 0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5, 0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9, + 0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD, 0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601, + 0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605, 0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609, + 0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D, 0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613, + 0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619, 0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D, + 0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621, 0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626, + 0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A, 0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F, + 0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633, 0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638, + 0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C, 0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640, + 0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644, 0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649, + 0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D, 0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651, + 0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655, 0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659, + 0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D, 0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661, + 0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666, 0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B, + 0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F, 0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673, + 0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677, 0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B, + 0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F, 0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683, + 0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687, 0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B, + 0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F, 0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693, + 0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697, 0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B, + 0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2, 0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7, + 0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD, 0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2, + 0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6, 0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA, + 0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE, 0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2, + 0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6, 0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA, + 0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE, 0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2, + 0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7, 0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB, + 0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF, 0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3, + 0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7, 0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB, + 0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF, 0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5, + 0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA, 0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE, + 0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704, 0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709, + 0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D, 0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711, + 0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715, 0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719, + 0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D, 0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721, + 0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725, 0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B, + 0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732, 0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736, + 0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D, 0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741, + 0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746, 0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B, + 0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750, 0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756, + 0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A, 0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E, + 0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763, 0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769, + 0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D, 0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774, + 0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779, 0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F, + 0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785, 0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789, + 0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793, 0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B, + 0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1, 0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5, + 0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE, 0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2, + 0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9, 0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD, + 0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1, 0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5, + 0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB, 0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF, + 0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3, 0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7, + 0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB, 0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF, + 0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3, 0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7, + 0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB, 0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2, + 0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7, 0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB, + 0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804, 0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B, + 0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811, 0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815, + 0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C, 0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821, + 0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827, 0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D, + 0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831, 0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A, + 0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E, 0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843, + 0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848, 0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C, + 0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850, 0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856, + 0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A, 0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861, + 0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866, 0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A, + 0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872, 0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876, + 0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B, 0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880, + 0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884, 0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888, + 0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C, 0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891, + 0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895, 0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899, + 0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D, 0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1, + 0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5, 0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA, + 0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE, 0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3, + 0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9, 0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD, + 0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4, 0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9, + 0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE, 0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3, + 0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8, 0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC, + 0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3, 0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7, + 0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE, 0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3, + 0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7, 0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF, + 0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903, 0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908, + 0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C, 0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910, + 0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914, 0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919, + 0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D, 0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922, + 0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926, 0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A, + 0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E, 0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932, + 0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936, 0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A, + 0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941, 0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946, + 0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A, 0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950, + 0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955, 0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B, + 0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961, 0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965, + 0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C, 0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971, + 0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977, 0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D, + 0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981, 0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988, + 0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990, 0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994, + 0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998, 0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C, + 0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0, 0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4, + 0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8, 0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE, + 0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3, 0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8, + 0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE, 0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4, + 0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA, 0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4, + 0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA, 0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2, + 0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA, 0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF, + 0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3, 0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD, + 0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03, 0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07, + 0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C, 0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10, + 0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14, 0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19, + 0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D, 0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21, + 0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25, 0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29, + 0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D, 0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31, + 0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35, 0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B, + 0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41, 0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46, + 0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F, 0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56, + 0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B, 0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60, + 0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66, 0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D, + 0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73, 0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79, + 0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D, 0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81, + 0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89, 0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E, + 0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92, 0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96, + 0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A, 0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E, + 0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2, 0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6, + 0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE, 0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4, + 0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA, 0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0, + 0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5, 0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA, + 0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE, 0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2, + 0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6, 0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC, + 0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0, 0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4, + 0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8, 0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC, + 0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0, 0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4, + 0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8, 0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD, + 0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02, 0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07, + 0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B, 0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12, + 0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16, 0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B, + 0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21, 0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25, + 0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A, 0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F, + 0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33, 0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F, + 0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43, 0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B, + 0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52, 0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57, + 0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C, 0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60, + 0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66, 0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A, + 0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F, 0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73, + 0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77, 0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B, + 0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F, 0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83, + 0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87, 0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D, + 0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92, 0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96, + 0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A, 0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E, + 0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2, 0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7, + 0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD, 0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1, + 0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6, 0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB, + 0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF, 0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5, + 0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA, 0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE, + 0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4, 0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8, + 0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC, 0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0, + 0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4, 0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8, + 0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC, 0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0, + 0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4, 0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA, + 0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01, 0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06, + 0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10, 0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A, + 0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23, 0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B, + 0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32, 0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37, + 0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C, 0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42, + 0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A, 0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51, + 0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55, 0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59, + 0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E, 0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62, + 0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66, 0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A, + 0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E, 0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72, + 0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76, 0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A, + 0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E, 0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82, + 0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89, 0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90, + 0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96, 0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D, + 0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3, 0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA, + 0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE, 0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7, + 0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB, 0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2, + 0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7, 0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB, + 0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3, 0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9, + 0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE, 0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2, + 0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6, 0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA, + 0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE, 0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2, + 0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA, 0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF, + 0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03, 0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B, + 0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F, 0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15, + 0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19, 0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D, + 0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21, 0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26, + 0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A, 0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F, + 0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33, 0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37, + 0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B, 0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F, + 0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44, 0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A, + 0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F, 0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54, + 0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A, 0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E, + 0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62, 0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67, + 0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C, 0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70, + 0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74, 0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78, + 0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C, 0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82, + 0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B, 0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F, + 0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97, 0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E, + 0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2, 0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7, + 0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB, 0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF, + 0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4, 0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9, + 0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD, 0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1, + 0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5, 0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9, + 0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD, 0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1, + 0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7, 0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD, + 0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1, 0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5, + 0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA, 0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE, + 0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3, 0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9, + 0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD, 0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02, + 0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08, 0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E, + 0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13, 0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18, + 0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E, 0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23, + 0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27, 0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B, + 0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F, 0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33, + 0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37, 0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B, + 0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F, 0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43, + 0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A, 0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50, + 0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56, 0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E, + 0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65, 0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B, + 0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F, 0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78, + 0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F, 0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85, + 0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89, 0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92, + 0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96, 0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C, + 0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0, 0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4, + 0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9, 0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD, + 0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1, 0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5, + 0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9, 0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD, + 0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1, 0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5, + 0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9, 0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD, + 0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3, 0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA, + 0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE, 0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6, + 0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA, 0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF, + 0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3, 0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7, + 0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB, 0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF, + 0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04, 0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A, + 0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E, 0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12, + 0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16, 0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F, + 0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23, 0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27, + 0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B, 0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F, + 0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33, 0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37, + 0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B, 0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F, + 0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46, 0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B, + 0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F, 0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56, + 0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A, 0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E, + 0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62, 0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66, + 0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A, 0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E, + 0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72, 0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76, + 0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A, 0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E, + 0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82, 0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86, + 0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A, 0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E, + 0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92, 0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97, + 0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B, 0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F, + 0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3, 0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7, + 0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB, 0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF, + 0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4, 0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8, + 0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC, 0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0, + 0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4, 0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9, + 0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF, 0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5, + 0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9, 0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE, + 0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4, 0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8, + 0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC, 0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0, + 0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4, 0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8, + 0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC, 0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000, + 0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004, 0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008, + 0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C, 0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010, + 0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014, 0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018, + 0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C, 0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020, + 0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024, 0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028, + 0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C, 0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030, + 0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034, 0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038, + 0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D, 0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041, + 0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045, 0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049, + 0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D, 0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052, + 0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056, 0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B, + 0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061, 0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065, + 0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B, 0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F, + 0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073, 0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077, + 0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B, 0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F, + 0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083, 0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087, + 0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B, 0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F, + 0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096, 0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B, + 0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F, 0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7, + 0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB, 0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7, + 0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB, 0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4, + 0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB, 0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1, + 0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5, 0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE, + 0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2, 0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9, + 0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE, 0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2, + 0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA, 0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE, + 0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103, 0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109, + 0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D, 0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112, + 0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117, 0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B, + 0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128, 0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E, + 0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135, 0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D, + 0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142, 0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146, + 0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F, 0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153, + 0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A, 0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F, + 0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163, 0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C, + 0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171, 0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176, + 0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B, 0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F, + 0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183, 0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188, + 0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F, 0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195, + 0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A, 0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2, + 0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7, 0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE, + 0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3, 0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7, + 0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB, 0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0, + 0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5, 0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA, + 0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF, 0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3, + 0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA, 0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE, + 0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3, 0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9, + 0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED, 0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4, + 0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8, 0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE, + 0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203, 0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208, + 0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E, 0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214, + 0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A, 0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221, + 0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225, 0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C, + 0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235, 0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239, + 0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D, 0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241, + 0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245, 0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A, + 0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E, 0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255, + 0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A, 0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E, + 0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263, 0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268, + 0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E, 0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273, + 0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278, 0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E, + 0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284, 0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A, + 0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E, 0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293, + 0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297, 0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E, + 0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2, 0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9, + 0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF, 0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3, + 0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB, 0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF, + 0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3, 0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7, + 0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB, 0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF, + 0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3, 0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7, + 0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB, 0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2, + 0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8, 0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0, + 0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5, 0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE, + 0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303, 0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307, + 0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F, 0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316, + 0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B, 0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320, + 0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326, 0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C, + 0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330, 0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334, + 0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338, 0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C, + 0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340, 0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344, + 0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349, 0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D, + 0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351, 0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355, + 0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359, 0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D, + 0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361, 0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365, + 0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B, 0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371, + 0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376, 0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E, + 0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382, 0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387, + 0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D, 0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391, + 0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395, 0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399, + 0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D, 0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1, + 0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5, 0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9, + 0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD, 0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1, + 0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5, 0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9, + 0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD, 0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2, + 0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6, 0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA, + 0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE, 0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2, + 0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6, 0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD, + 0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4, 0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA, + 0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF, 0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3, + 0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA, 0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE, + 0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402, 0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406, + 0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B, 0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F, + 0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414, 0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418, + 0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C, 0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420, + 0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425, 0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429, + 0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E, 0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433, + 0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438, 0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E, + 0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442, 0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446, + 0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B, 0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F, + 0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453, 0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457, + 0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B, 0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F, + 0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463, 0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A, + 0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F, 0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473, + 0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A, 0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E, + 0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483, 0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487, + 0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B, 0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F, + 0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493, 0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498, + 0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D, 0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1, + 0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5, 0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9, + 0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD, 0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1, + 0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5, 0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA, + 0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF, 0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3, + 0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7, 0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB, + 0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF, 0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3, + 0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7, 0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB, + 0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF, 0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3, + 0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7, 0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC, + 0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2, 0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7, + 0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD, 0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504, + 0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508, 0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D, + 0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512, 0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517, + 0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B, 0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520, + 0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524, 0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A, + 0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F, 0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534, + 0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A, 0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540, + 0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546, 0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550, + 0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A, 0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562, + 0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567, 0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C, + 0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572, 0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579, + 0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F, 0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585, + 0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A, 0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592, + 0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599, 0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E, + 0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3, 0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7, + 0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC, 0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0, + 0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6, 0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0, + 0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB, 0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3, + 0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9, 0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD, + 0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4, 0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9, + 0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1, 0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8, + 0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602, 0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A, + 0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F, 0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614, + 0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A, 0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620, + 0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626, 0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B, + 0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636, 0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D, + 0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643, 0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649, + 0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D, 0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656, + 0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A, 0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661, + 0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665, 0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669, + 0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E, 0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674, + 0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A, 0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F, + 0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684, 0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A, + 0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690, 0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696, + 0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B, 0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0, + 0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6, 0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC, + 0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2, 0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7, + 0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE, 0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6, + 0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA, 0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1, + 0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6, 0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA, + 0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2, 0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6, + 0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED, 0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2, + 0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6, 0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC, + 0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701, 0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707, + 0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D, 0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711, + 0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718, 0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D, + 0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723, 0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729, + 0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D, 0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734, + 0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A, 0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741, + 0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746, 0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B, + 0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A, 0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F, + 0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764, 0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769, + 0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E, 0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772, + 0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779, 0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780, + 0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B, 0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792, + 0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B, 0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F, + 0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9, 0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF, + 0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5, 0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9, + 0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2, 0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6, + 0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD, 0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3, + 0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7, 0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC, + 0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1, 0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6, + 0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB, 0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0, + 0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4, 0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8, + 0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC, 0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802, + 0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807, 0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D, + 0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814, 0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A, + 0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821, 0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826, + 0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A, 0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832, + 0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836, 0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B, + 0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841, 0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845, + 0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B, 0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851, + 0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856, 0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A, + 0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E, 0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862, + 0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866, 0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A, + 0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E, 0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875, + 0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B, 0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F, + 0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889, 0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890, + 0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895, 0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899, + 0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E, 0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4, + 0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9, 0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD, + 0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1, 0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5, + 0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9, 0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF, + 0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3, 0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9, + 0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE, 0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2, + 0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA, 0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE, + 0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5, 0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9, + 0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED, 0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1, + 0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6, 0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA, + 0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901, 0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908, + 0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, + 0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003, 0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C, + 0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, + 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010, + 0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7, 0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E, + 0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033, 0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1, + 0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220, 0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207, + 0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B, 0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF, + 0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1, 0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD, + 0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191, 0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A, + 0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D, 0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208, + 0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282, 0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227, + 0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912, 0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916, + 0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B, 0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F, + 0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923, 0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927, + 0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B, 0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930, + 0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935, 0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939, + 0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D, 0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941, + 0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945, 0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949, + 0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D, 0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953, + 0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959, 0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D, + 0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964, 0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968, + 0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D, 0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4, + 0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E, 0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA, + 0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1, 0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211, + 0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030, 0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6, + 0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665, 0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8, + 0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592, 0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7, + 0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F, 0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6, + 0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197, 0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D, + 0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F, 0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122, + 0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC, 0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973, + 0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978, 0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D, + 0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981, 0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985, + 0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B, 0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991, + 0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995, 0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C, + 0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1, 0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5, + 0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9, 0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD, + 0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1, 0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5, + 0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9, 0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD, + 0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3, 0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB, + 0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF, 0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8, + 0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, 0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE, + 0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5, 0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA, + 0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3, 0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7, + 0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE, 0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03, + 0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07, 0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10, + 0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15, 0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A, + 0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E, 0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22, + 0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26, 0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B, + 0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F, 0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33, + 0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37, 0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B, + 0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F, 0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43, + 0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131, 0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135, + 0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139, 0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D, + 0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141, 0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145, + 0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149, 0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D, + 0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151, 0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155, + 0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159, 0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D, + 0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161, 0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165, + 0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169, 0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D, + 0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171, 0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175, + 0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179, 0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D, + 0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181, 0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185, + 0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189, 0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D, + 0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49, 0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F, + 0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55, 0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59, + 0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62, 0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66, + 0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B, 0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F, + 0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73, 0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77, + 0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B, 0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80, + 0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85, 0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89, + 0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D, 0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91, + 0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95, 0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A, + 0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E, 0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2, + 0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6, 0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172, + 0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176, 0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160, + 0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164, 0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168, + 0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393, 0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397, + 0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B, 0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F, + 0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4, 0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8, + 0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3, 0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7, + 0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB, 0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF, + 0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4, 0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8, + 0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA, 0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE, + 0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2, 0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6, + 0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA, 0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1, + 0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6, 0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA, + 0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2, 0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7, + 0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD, 0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2, + 0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6, 0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA, + 0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF, 0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3, + 0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8, 0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC, + 0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00, 0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04, + 0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09, 0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C, + 0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C, 0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C, + 0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513, 0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533, + 0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520, 0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F, + 0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538, 0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A, + 0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E, 0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521, + 0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529, 0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531, + 0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539, 0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540, + 0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545, 0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549, + 0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D, 0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12, + 0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17, 0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C, + 0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22, 0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26, + 0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A, 0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E, + 0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32, 0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36, + 0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A, 0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E, + 0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43, 0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47, + 0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E, 0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53, + 0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57, 0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E, + 0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62, 0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67, + 0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B, 0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397, + 0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3, 0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399, + 0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D, 0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1, + 0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E, 0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389, + 0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0, 0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4, + 0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8, 0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382, + 0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB, 0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF, + 0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393, 0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1, + 0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6, 0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF, + 0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB, 0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3, + 0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6, 0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70, + 0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74, 0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A, + 0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E, 0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82, + 0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86, 0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A, + 0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E, 0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92, + 0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96, 0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A, + 0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F, 0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3, + 0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7, 0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB, + 0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF, 0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3, + 0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7, 0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC, + 0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0, 0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4, + 0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126, 0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8, + 0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166, 0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262, + 0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266, 0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A, + 0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E, 0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272, + 0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276, 0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A, + 0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2, 0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6, + 0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA, 0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE, + 0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2, 0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6, + 0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460, 0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464, + 0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468, 0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C, + 0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153, 0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B, + 0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5, 0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9, + 0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD, 0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1, + 0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6, 0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA, + 0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE, 0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2, + 0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8, 0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED, + 0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1, 0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5, + 0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9, 0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD, + 0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01, 0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05, + 0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09, 0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F, + 0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15, 0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19, + 0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F, 0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6, + 0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131, 0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142, + 0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE, 0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200, + 0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204, 0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208, + 0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C, 0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210, + 0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214, 0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218, + 0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C, 0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0, + 0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4, 0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8, + 0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC, 0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0, + 0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4, 0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476, + 0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A, 0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E, + 0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482, 0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074, + 0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083, 0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A, + 0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31, 0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35, + 0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F, 0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43, + 0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A, 0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F, + 0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53, 0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C, + 0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61, 0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67, + 0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C, 0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71, + 0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76, 0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A, + 0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E, 0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82, + 0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86, 0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A, + 0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E, 0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92, + 0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043, 0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047, + 0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B, 0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F, + 0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053, 0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057, + 0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B, 0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F, + 0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063, 0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067, + 0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B, 0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F, + 0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073, 0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077, + 0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B, 0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F, + 0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083, 0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087, + 0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B, 0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F, + 0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093, 0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97, + 0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E, 0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3, + 0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7, 0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0, + 0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6, 0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB, + 0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0, 0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6, + 0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC, 0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1, + 0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6, 0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA, + 0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE, 0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2, + 0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7, 0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB, + 0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1, 0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5, + 0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9, 0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD, + 0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4, 0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8, + 0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC, 0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0, + 0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4, 0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8, + 0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC, 0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0, + 0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4, 0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8, + 0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC, 0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0, + 0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4, 0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8, + 0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC, 0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0, + 0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4, 0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8, + 0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC, 0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0, + 0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4, 0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF, + 0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04, 0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A, + 0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F, 0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14, + 0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A, 0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20, + 0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25, 0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A, + 0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F, 0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33, + 0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37, 0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C, + 0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40, 0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44, + 0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48, 0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C, + 0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50, 0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54, + 0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58, 0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D, + 0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411, 0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415, + 0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418, 0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C, + 0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420, 0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424, + 0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428, 0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C, + 0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430, 0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434, + 0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437, 0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B, + 0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F, 0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443, + 0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447, 0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B, + 0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F, 0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65, + 0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69, 0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70, + 0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75, 0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A, + 0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E, 0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82, + 0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86, 0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B, + 0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F, 0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93, + 0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A, 0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F, + 0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3, 0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB, + 0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF, 0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4, + 0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8, 0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC, + 0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0, 0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5, + 0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9, 0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE, + 0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3, 0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7, + 0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB, 0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF, + 0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3, 0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7, + 0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED, 0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2, + 0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6, 0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE, + 0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02, 0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07, + 0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D, 0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11, + 0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16, 0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B, + 0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F, 0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26, + 0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B, 0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F, + 0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37, 0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B, + 0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F, 0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43, + 0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47, 0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B, + 0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F, 0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53, + 0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57, 0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E, + 0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65, 0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C, + 0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71, 0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77, + 0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D, 0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81, + 0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88, 0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D, + 0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93, 0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99, + 0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D, 0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6, + 0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA, 0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0, + 0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4, 0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8, + 0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC, 0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0, + 0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5, 0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9, + 0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD, 0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1, + 0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5, 0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9, + 0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD, 0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1, + 0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7, 0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE, + 0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2, 0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB, + 0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF, 0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07, + 0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10, 0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14, + 0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19, 0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D, + 0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D, 0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38, + 0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B, 0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C, + 0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77, 0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81, + 0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86, 0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C, + 0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D, 0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8, + 0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF, 0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB, + 0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4, 0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7, + 0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7, 0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF, + 0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5, 0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00, + 0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03, 0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09, + 0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D, 0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14, + 0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19, 0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E, + 0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23, 0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28, + 0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E, 0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35, + 0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A, 0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E, + 0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42, 0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46, + 0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A, 0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E, + 0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52, 0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59, + 0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E, 0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62, + 0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A, 0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D, + 0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C, 0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D, + 0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C, 0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49, + 0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61, 0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70, + 0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76, 0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F, + 0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89, 0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D, + 0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1, 0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1, + 0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4, 0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF, + 0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09, 0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30, + 0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38, 0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43, + 0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C, 0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54, + 0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F, 0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68, + 0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78, 0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72, + 0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77, 0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C, + 0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81, 0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86, + 0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A, 0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F, + 0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93, 0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97, + 0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B, 0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F, + 0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4, 0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9, + 0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD, 0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2, + 0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6, 0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA, + 0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE, 0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2, + 0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7, 0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB, + 0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D, 0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC, + 0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4, 0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0, + 0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC, 0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4, + 0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08, 0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D, + 0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C, 0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42, + 0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50, 0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65, + 0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88, 0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C, + 0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0, 0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB, + 0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC, 0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1, + 0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001, 0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014, + 0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044, 0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C, + 0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055, 0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD, + 0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1, 0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5, + 0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9, 0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD, + 0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3, 0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9, + 0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED, 0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4, + 0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9, 0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE, + 0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003, 0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008, + 0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C, 0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010, + 0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015, 0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A, + 0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E, 0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022, + 0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026, 0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A, + 0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C, 0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C, + 0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098, 0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F, + 0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8, 0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD, + 0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3, 0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC, + 0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8, 0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4, + 0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108, 0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110, + 0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119, 0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123, + 0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C, 0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138, + 0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144, 0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154, + 0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160, 0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180, + 0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B, 0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194, + 0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC, 0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD, + 0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031, 0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037, + 0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D, 0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041, + 0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048, 0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D, + 0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052, 0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057, + 0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C, 0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061, + 0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065, 0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069, + 0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F, 0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075, + 0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079, 0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F, + 0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084, 0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088, + 0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C, 0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090, + 0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094, 0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC, + 0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD, 0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B, + 0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217, 0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C, + 0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268, 0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C, + 0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290, 0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299, + 0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3, 0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC, + 0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9, 0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8, + 0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2, 0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8, + 0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE, 0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5, + 0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA, 0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301, + 0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311, 0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C, + 0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358, 0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F, + 0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096, 0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A, + 0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E, 0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2, + 0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9, 0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE, + 0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2, 0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA, + 0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE, 0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5, + 0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB, 0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF, + 0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8, 0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE, + 0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3, 0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8, + 0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE, 0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5, + 0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA, 0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE, + 0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102, 0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369, + 0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371, 0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381, + 0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C, 0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1, + 0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5, 0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE, + 0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7, 0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0, + 0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410, 0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428, + 0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450, 0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460, + 0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C, 0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4, + 0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7, 0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8, + 0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD, 0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6, + 0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1, 0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518, + 0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525, 0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A, + 0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538, 0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108, + 0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C, 0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111, + 0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115, 0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119, + 0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D, 0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121, + 0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125, 0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129, + 0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D, 0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133, + 0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139, 0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E, + 0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147, 0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B, + 0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152, 0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157, + 0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B, 0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163, + 0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167, 0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D, + 0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544, 0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D, + 0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D, 0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0, + 0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA, 0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3, + 0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC, 0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC, + 0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1, 0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611, + 0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C, 0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668, + 0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4, 0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4, + 0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700, 0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729, + 0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738, 0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748, + 0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760, 0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771, + 0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D, 0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D, + 0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792, 0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F, + 0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173, 0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177, + 0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B, 0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180, + 0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185, 0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A, + 0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E, 0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192, + 0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196, 0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A, + 0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E, 0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5, + 0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA, 0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE, + 0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6, 0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB, + 0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1, 0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5, + 0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9, 0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD, + 0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799, 0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9, + 0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4, 0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9, + 0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4, 0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800, + 0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809, 0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819, + 0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825, 0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835, + 0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840, 0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C, + 0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C, 0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878, + 0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0, 0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1, + 0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0, 0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1, + 0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0, 0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD, + 0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C, 0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C, + 0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959, 0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969, + 0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3, 0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7, + 0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC, 0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0, + 0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4, 0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8, + 0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC, 0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0, + 0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5, 0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA, + 0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE, 0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202, + 0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206, 0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C, + 0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211, 0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215, + 0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219, 0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D, + 0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221, 0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225, + 0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229, 0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975, + 0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985, 0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D, + 0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0, 0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF, + 0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC, 0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1, + 0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB, 0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3, + 0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC, 0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8, + 0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01, 0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39, + 0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48, 0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E, + 0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58, 0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67, + 0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71, 0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84, + 0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8, 0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0, + 0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB, 0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8, + 0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B, 0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232, + 0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237, 0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B, + 0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243, 0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247, + 0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C, 0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250, + 0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254, 0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258, + 0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D, 0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261, + 0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266, 0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A, + 0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E, 0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272, + 0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276, 0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A, + 0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E, 0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285, + 0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A, 0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04, + 0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18, 0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B, + 0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38, 0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E, + 0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49, 0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54, + 0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C, 0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4, + 0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7, 0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0, + 0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC, 0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08, + 0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D, 0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15, + 0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B, 0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F, + 0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29, 0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34, + 0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43, 0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C, + 0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84, 0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C, + 0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97, 0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292, + 0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297, 0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B, + 0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1, 0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6, + 0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA, 0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF, + 0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4, 0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA, + 0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1, 0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6, + 0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD, 0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1, + 0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6, 0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB, + 0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0, 0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6, + 0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA, 0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE, + 0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5, 0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA, + 0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1, 0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0, + 0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5, 0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4, + 0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1, 0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4, + 0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC, 0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09, + 0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C, 0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C, + 0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64, 0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84, + 0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A, 0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95, + 0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4, 0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5, + 0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0, 0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03, + 0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10, 0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F, + 0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C, 0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57, + 0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60, 0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC, + 0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302, 0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308, + 0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F, 0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315, + 0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A, 0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323, + 0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A, 0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F, + 0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334, 0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A, + 0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341, 0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347, + 0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B, 0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F, + 0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353, 0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357, + 0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B, 0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F, + 0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363, 0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367, + 0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A, 0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74, + 0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D, 0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D, + 0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98, 0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1, + 0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0, 0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC, + 0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18, 0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D, + 0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48, 0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94, + 0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD, 0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF, + 0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058, 0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069, + 0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098, 0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5, + 0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0, 0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6, + 0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0, 0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9, + 0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9, 0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4, + 0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D, 0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371, + 0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375, 0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379, + 0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F, 0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385, + 0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389, 0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392, + 0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396, 0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D, + 0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2, 0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6, + 0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE, 0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2, + 0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7, 0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD, + 0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1, 0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7, + 0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD, 0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2, + 0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6, 0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4, + 0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100, 0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115, + 0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F, 0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126, + 0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F, 0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138, + 0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148, 0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D, + 0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C, 0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168, + 0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178, 0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E, + 0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C, 0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5, + 0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0, 0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC, + 0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0, 0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1, + 0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200, 0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F, + 0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C, 0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229, + 0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9, 0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD, + 0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2, 0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7, + 0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB, 0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2, + 0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7, 0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB, + 0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403, 0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407, + 0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C, 0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410, + 0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414, 0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418, + 0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C, 0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421, + 0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425, 0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429, + 0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D, 0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431, + 0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435, 0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231, + 0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250, 0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260, + 0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270, 0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F, + 0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290, 0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4, + 0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD, 0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9, + 0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3, 0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED, + 0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8, 0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300, + 0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D, 0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318, + 0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328, 0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369, + 0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378, 0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384, + 0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8, 0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0, + 0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED, 0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408, + 0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430, 0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B, + 0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F, 0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445, + 0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449, 0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D, + 0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451, 0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455, + 0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459, 0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E, + 0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463, 0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468, + 0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C, 0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472, + 0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476, 0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D, + 0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484, 0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A, + 0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490, 0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495, + 0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499, 0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D, + 0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448, 0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C, + 0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480, 0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC, + 0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4, 0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500, + 0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514, 0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C, + 0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B, 0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548, + 0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D, 0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555, + 0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D, 0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564, + 0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573, 0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D, + 0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C, 0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595, + 0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0, 0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8, + 0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD, 0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6, + 0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA, 0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F, + 0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3, 0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7, + 0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC, 0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0, + 0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4, 0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8, + 0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC, 0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0, + 0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4, 0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8, + 0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD, 0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2, + 0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7, 0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB, + 0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1, 0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5, + 0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA, 0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF, + 0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4, 0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9, + 0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1, 0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1, + 0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED, 0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6, + 0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE, 0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605, + 0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C, 0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B, + 0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628, 0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630, + 0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637, 0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641, + 0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651, 0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C, + 0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F, 0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C, + 0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B, 0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698, + 0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7, 0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4, + 0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0, 0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC, + 0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC, 0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8, + 0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501, 0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506, + 0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B, 0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510, + 0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516, 0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B, + 0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F, 0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523, + 0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527, 0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B, + 0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F, 0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533, + 0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537, 0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B, + 0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542, 0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547, + 0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B, 0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553, + 0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557, 0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E, + 0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563, 0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8, + 0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705, 0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715, + 0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721, 0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731, + 0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C, 0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A, + 0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751, 0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755, + 0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C, 0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774, + 0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D, 0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785, + 0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A, 0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794, + 0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A, 0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4, + 0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD, 0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD, + 0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8, 0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0, + 0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8, 0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804, + 0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566, 0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E, + 0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572, 0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579, + 0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E, 0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582, + 0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B, 0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F, + 0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594, 0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598, + 0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C, 0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0, + 0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4, 0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9, + 0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD, 0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1, + 0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5, 0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9, + 0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD, 0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1, + 0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5, 0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811, + 0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C, 0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C, + 0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838, 0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849, + 0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870, 0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A, + 0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885, 0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C, + 0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F, 0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD, + 0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4, 0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0, + 0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC, 0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905, + 0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F, 0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934, + 0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958, 0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C, + 0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988, 0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998, + 0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0, 0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8, + 0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3, 0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE, + 0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4, 0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA, + 0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0, 0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6, + 0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB, 0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0, + 0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6, 0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC, + 0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602, 0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607, + 0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C, 0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612, + 0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619, 0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E, + 0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623, 0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628, + 0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C, 0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631, + 0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635, 0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B, + 0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA, 0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2, + 0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED, 0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8, + 0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08, 0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D, + 0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C, 0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C, + 0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61, 0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98, + 0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4, 0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1, + 0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0, 0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10, + 0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21, 0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C, + 0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D, 0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C, + 0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7, 0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10, + 0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21, 0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29, + 0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38, 0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E, + 0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643, 0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A, + 0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650, 0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657, + 0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D, 0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661, + 0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665, 0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B, + 0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F, 0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676, + 0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A, 0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E, + 0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682, 0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688, + 0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E, 0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693, + 0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698, 0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C, + 0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3, 0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7, + 0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D, 0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48, + 0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57, 0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64, + 0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75, 0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0, + 0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC, 0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8, + 0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7, 0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4, + 0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08, 0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18, + 0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24, 0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C, + 0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D, 0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88, + 0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C, 0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9, + 0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0, 0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8, + 0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04, 0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19, + 0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28, 0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35, + 0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF, 0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4, + 0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8, 0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE, + 0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2, 0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9, + 0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE, 0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3, + 0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA, 0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE, + 0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3, 0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9, + 0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED, 0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2, + 0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7, 0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB, + 0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702, 0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707, + 0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B, 0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F, + 0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714, 0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F, + 0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69, 0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75, + 0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85, 0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91, + 0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1, 0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC, + 0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5, 0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4, + 0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9, 0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08, + 0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15, 0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C, + 0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31, 0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58, + 0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67, 0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74, + 0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C, 0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4, + 0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8, 0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5, + 0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011, 0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035, + 0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716, 0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D, + 0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722, 0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726, + 0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E, 0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732, + 0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739, 0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E, + 0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742, 0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748, + 0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D, 0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753, + 0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C, 0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762, + 0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768, 0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E, + 0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773, 0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778, + 0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E, 0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783, + 0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787, 0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045, + 0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054, 0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D, + 0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D, 0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8, + 0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7, 0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4, + 0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1, 0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC, + 0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC, 0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1, + 0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131, 0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140, + 0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145, 0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154, + 0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161, 0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184, + 0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4, 0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3, + 0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0, 0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207, + 0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D, 0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D, + 0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C, 0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791, + 0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795, 0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C, + 0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1, 0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280, + 0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290, 0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0, + 0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8, 0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0, + 0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB, 0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4, + 0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4, 0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303, + 0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E, 0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C, + 0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321, 0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C, + 0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B, 0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345, + 0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384, 0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390, + 0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C, 0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB, + 0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC, 0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9, + 0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3, 0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4, + 0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401, 0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444, + 0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D, 0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C, + 0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488, 0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494, + 0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4, 0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC, + 0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD, 0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514, + 0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D, 0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D, + 0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559, 0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568, + 0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574, 0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584, + 0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589, 0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9, + 0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8, 0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4, + 0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4, 0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600, + 0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610, 0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615, + 0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D, 0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640, + 0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B, 0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655, + 0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669, 0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683, + 0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690, 0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1, + 0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9, 0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8, + 0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7, 0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8, + 0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD, 0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718, + 0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728, 0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734, + 0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744, 0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751, + 0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758, 0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763, + 0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770, 0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781, + 0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790, 0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D, + 0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9, 0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5, + 0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687, 0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C, + 0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB, 0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36, + 0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6, 0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404, + 0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF, 0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3, + 0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978, 0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7, + 0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F, 0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5, + 0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D, 0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593, + 0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34, 0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910, + 0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E, 0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE, + 0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44, 0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3, + 0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451, 0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC, + 0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598, 0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1, + 0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A, 0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586, + 0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C, 0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941, + 0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47, 0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1, + 0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168, 0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5, + 0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5, 0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B, + 0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901, 0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028, + 0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2, 0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20, + 0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E, 0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8, + 0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE, 0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171, + 0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B, 0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840, + 0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2, 0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB, + 0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9, 0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84, + 0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694, 0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504, + 0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B, 0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289, + 0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A, 0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D, + 0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC, 0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106, + 0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770, 0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176, + 0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F, 0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87, + 0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5, 0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC, + 0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93, 0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396, + 0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1, 0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8, + 0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951, 0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212, + 0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA, 0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D, + 0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08, 0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4, + 0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471, 0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B, + 0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545, 0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1, + 0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E, 0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1, + 0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0, 0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5, + 0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7, 0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED, + 0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40, 0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764, + 0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD, 0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4, + 0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B, 0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54, + 0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1, 0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A, + 0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32, 0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC, + 0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2, 0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846, + 0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED, 0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC, + 0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C, 0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50, + 0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC, 0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC, + 0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321, 0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38, + 0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50, 0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B, + 0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A, 0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0, + 0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18, 0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1, + 0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0, 0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821, + 0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF, 0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E, + 0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA, 0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18, + 0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1, 0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3, + 0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775, 0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0, + 0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8, 0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6, + 0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078, 0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF, + 0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009, 0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF, + 0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0, 0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6, + 0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7, 0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA, + 0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B, 0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD, + 0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398, 0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79, + 0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026, 0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708, + 0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3, 0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568, + 0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3, 0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B, + 0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4, 0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D, + 0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA, 0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE, + 0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035, 0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547, + 0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908, 0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287, + 0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699, 0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3, + 0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E, 0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2, + 0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909, 0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611, + 0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD, 0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F, + 0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA, 0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A, + 0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC, 0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176, + 0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B, 0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947, + 0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E, 0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280, + 0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F, 0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F, + 0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82, 0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A, + 0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F, 0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947, + 0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00, 0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D, + 0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48, 0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2, + 0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65, 0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409, + 0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB, 0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C, + 0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF, 0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911, + 0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914, 0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918, + 0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B, 0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156, + 0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920, 0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921, + 0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922, 0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925, + 0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872, 0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929, + 0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43, 0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0, + 0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74, 0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C, + 0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7, 0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29, + 0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932, 0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935, + 0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1, 0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C, + 0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940, 0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3, + 0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2, 0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166, + 0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A, 0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E, + 0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9, 0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952, + 0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956, 0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959, + 0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA, 0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6, + 0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7, 0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80, + 0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF, 0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892, + 0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE, 0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556, + 0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7, 0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9, + 0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541, 0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F, + 0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F, 0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858, + 0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0, 0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8, + 0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927, 0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85, + 0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA, 0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB, + 0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012, 0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835, + 0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6, 0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC, + 0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843, 0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21, + 0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC, 0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404, + 0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48, 0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD, + 0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2, 0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368, + 0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B, 0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566, + 0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E, 0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D, + 0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD, 0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771, + 0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C, 0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4, + 0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597, 0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7, + 0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017, 0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A, + 0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97, 0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B, + 0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127, 0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B, + 0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA, 0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B, + 0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D, 0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E, + 0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12, 0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E, + 0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5, 0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43, + 0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD, 0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA, + 0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405, 0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86, + 0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7, 0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006, + 0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11, 0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F, + 0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6, 0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC, + 0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA, 0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823, + 0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97, 0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77, + 0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742, 0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23, + 0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F, 0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A, + 0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C, 0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582, + 0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375, 0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F, + 0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2, 0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046, + 0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748, 0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7, + 0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE, 0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3, + 0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7, 0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF, + 0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA, 0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0, + 0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93, 0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727, + 0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E, 0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA, + 0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7, 0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6, + 0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD, 0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27, + 0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62, 0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B, + 0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938, 0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2, + 0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C, 0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559, + 0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E, 0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96, + 0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8, 0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817, + 0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B, 0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C, + 0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA, 0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E, + 0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8, 0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406, + 0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C, 0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF, + 0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2, 0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0, + 0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3, 0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB, + 0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C, 0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469, + 0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8, 0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE, + 0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB, 0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29, + 0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D, 0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B, + 0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513, 0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B, + 0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB, 0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1, + 0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B, 0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B, + 0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB, 0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627, + 0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164, 0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081, + 0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C, 0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13, + 0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C, 0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195, + 0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704, 0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762, + 0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5, 0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D, + 0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791, 0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169, + 0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE, 0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D, + 0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE, 0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB, + 0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738, 0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305, + 0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728, 0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766, + 0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92, 0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F, + 0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF, 0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B, + 0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9, 0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A, + 0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959, 0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7, + 0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302, 0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727, + 0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011, 0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587, + 0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E, 0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF, + 0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A, 0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE, + 0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C, 0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E, + 0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761, 0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D, + 0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC, 0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9, + 0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C, 0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD, + 0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38, 0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94, + 0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236, 0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1, + 0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB, 0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591, + 0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED, 0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC, + 0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46, 0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812, + 0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5, 0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB, + 0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43, 0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8, + 0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F, 0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609, + 0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5, 0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B, + 0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A, 0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90, + 0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9, 0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F, + 0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC, 0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919, + 0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A, 0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF, + 0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44, 0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4, + 0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543, 0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F, + 0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06, 0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB, + 0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5, 0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1, + 0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656, 0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739, + 0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A, 0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225, + 0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19, 0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77, + 0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5, 0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9, + 0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08, 0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6, + 0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A, 0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9, + 0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14, 0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C, + 0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F, 0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907, + 0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5, 0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8, + 0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0, 0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2, + 0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702, 0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D, + 0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256, 0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0, + 0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75, 0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276, + 0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5, 0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36, + 0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240, 0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0, + 0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA, 0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644, + 0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206, 0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954, + 0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E, 0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6, + 0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC, 0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B, + 0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29, 0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43, + 0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315, 0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62, + 0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249, 0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7, + 0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8, 0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA, + 0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8, 0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5, + 0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A, 0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB, + 0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B, 0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C, + 0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1, 0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7, + 0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37, 0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B, + 0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C, 0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2, + 0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB, 0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB, + 0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B, 0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C, + 0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD, 0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23, + 0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E, 0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9, + 0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D, 0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF, + 0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC, 0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC, + 0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969, 0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A, + 0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA, 0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C, + 0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492, 0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09, + 0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17, 0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7, + 0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A, 0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546, + 0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19, 0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0, + 0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61, 0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0, + 0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4, 0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61, + 0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD, 0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61, + 0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F, 0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885, + 0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6, 0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F, + 0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8, 0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E, + 0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72, 0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F, + 0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD, 0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D, + 0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790, 0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3, + 0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B, 0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584, + 0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E, 0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401, + 0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C, 0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8, + 0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A, 0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078, + 0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE, 0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4, + 0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B, 0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA, + 0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2, 0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583, + 0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE, 0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC, + 0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F, 0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB, + 0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072, 0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16, + 0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05, 0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0, + 0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5, 0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240, + 0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3, 0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F, + 0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F, 0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0, + 0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C, 0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D, + 0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6, 0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F, + 0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16, 0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD, + 0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1, 0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E, + 0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001, 0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051, + 0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7, 0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA, + 0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88, 0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101, + 0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C, 0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A, + 0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7, 0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2, + 0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57, 0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC, + 0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331, 0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896, + 0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042, 0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9, + 0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6, 0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3, + 0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919, 0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A, + 0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085, 0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA, + 0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F, 0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3, + 0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D, 0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340, + 0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4, 0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4, + 0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265, 0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F, + 0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE, 0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E, + 0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347, 0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805, + 0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636, 0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E, + 0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043, 0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE, + 0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A, 0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996, + 0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55, 0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F, + 0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96, 0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755, + 0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE, 0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B, + 0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0, 0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E, + 0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398, 0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A, + 0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5, 0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089, + 0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81, 0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A, + 0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341, 0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E, + 0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25, 0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD, + 0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D, 0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09, + 0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD, 0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1, + 0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354, 0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89, + 0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848, 0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854, + 0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB, 0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6, + 0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4, 0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE, + 0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F, 0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26, + 0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16, 0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D, + 0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384, 0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A, + 0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C, 0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B, + 0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6, 0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974, + 0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976, 0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB, + 0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F, 0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43, + 0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D, 0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23, + 0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2, 0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B, + 0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D, 0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E, + 0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC, 0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E, + 0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104, 0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6, + 0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109, 0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616, + 0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944, 0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D, + 0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F, 0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982, + 0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984, 0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207, + 0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D, 0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988, + 0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF, 0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C, + 0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D, 0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827, + 0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E, 0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350, + 0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87, 0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5, + 0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136, 0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5, + 0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995, 0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F, + 0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998, 0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B, + 0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E, 0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1, + 0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD, 0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3, + 0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430, 0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB, + 0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7, 0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9, + 0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8, 0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E, + 0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3, 0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B, + 0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370, 0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4, + 0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF, 0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE, + 0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719, 0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A, + 0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3, 0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F, + 0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602, 0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D, + 0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8, 0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D, + 0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E, 0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA, + 0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F, 0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF, + 0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3, 0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D, + 0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07, 0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389, + 0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F, 0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140, + 0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515, 0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD, + 0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9, 0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778, + 0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B, 0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9, + 0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9, 0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E, + 0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0, 0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A, + 0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A, 0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD, + 0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB, 0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D, + 0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC, 0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416, + 0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC, 0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF, + 0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF, 0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170, + 0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20, 0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952, + 0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F, 0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD, + 0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889, 0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995, + 0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194, 0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073, + 0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394, 0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51, + 0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB, 0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24, + 0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B, 0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950, + 0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD, 0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2, + 0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685, 0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67, + 0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C, 0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91, + 0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90, 0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553, + 0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB, 0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A, + 0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1, 0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B, + 0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F, 0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72, + 0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457, 0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060, + 0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B, 0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D, + 0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D, 0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170, + 0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B, 0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466, + 0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918, 0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F, + 0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A, 0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A, + 0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE, 0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109, + 0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8, 0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961, + 0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA, 0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336, + 0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531, 0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF, + 0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5, 0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30, + 0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A, 0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0, + 0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3, 0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4, + 0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5, 0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4, + 0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F, 0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB, + 0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68, 0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069, + 0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280, 0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB, + 0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE, 0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD, + 0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D, 0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F, + 0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5, 0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264, + 0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC, 0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5, + 0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937, 0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B, + 0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1, 0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5, + 0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5, 0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033, + 0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7, 0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087, + 0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C, 0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA, + 0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A, 0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370, + 0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB, 0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E, + 0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335, 0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1, + 0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3, 0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9, + 0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0, 0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A, + 0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5, 0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3, + 0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8, 0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55, + 0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8, 0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57, + 0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB, 0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7, + 0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005, 0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9, + 0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C, 0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628, + 0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD, 0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72, + 0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A, 0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B, + 0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC, 0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834, + 0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07, 0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C, + 0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3, 0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA, + 0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7, 0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A, + 0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF, 0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577, + 0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728, 0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D, + 0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D, 0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09, + 0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F, 0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E, + 0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95, 0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17, + 0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A, 0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7, + 0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B, 0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8, + 0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A, 0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575, + 0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684, 0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E, + 0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA, 0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA, + 0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43, 0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178, + 0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C, 0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB, + 0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF, 0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420, + 0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672, 0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6, + 0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49, 0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B, + 0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E, 0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59, + 0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76, 0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38, + 0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E, 0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776, + 0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C, 0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A, + 0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81, 0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574, + 0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE, 0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40, + 0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E, 0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD, + 0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E, 0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E, + 0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E, 0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266, + 0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756, 0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236, + 0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D, 0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF, + 0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD, 0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44, + 0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D, 0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146, + 0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14, 0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9, + 0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D, 0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15, + 0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A, 0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A, + 0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97, 0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087, + 0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF, 0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D, + 0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5, 0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3, + 0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9, 0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E, + 0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9, 0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C, + 0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35, 0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750, + 0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A, 0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A, + 0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468, 0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE, + 0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1, 0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A, + 0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587, 0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2, + 0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85, 0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031, + 0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0, 0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101, + 0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB, 0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96, + 0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3, 0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB, + 0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2, 0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB, + 0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E, 0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD, + 0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8, 0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA, + 0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7, 0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F, + 0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3, 0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C, + 0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957, 0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3, + 0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C, 0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072, + 0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54, 0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875, + 0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B, 0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25, + 0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1, 0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E, + 0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D, 0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A, + 0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032, 0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707, + 0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9, 0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE, + 0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED, 0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F, + 0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57, 0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6, + 0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14, 0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF, + 0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64, 0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49, + 0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E, 0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F, + 0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6, 0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12, + 0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A, 0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C, + 0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D, 0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879, + 0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC, 0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009, + 0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C, 0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E, + 0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD, 0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621, + 0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6, 0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0, + 0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826, 0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7, + 0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56, 0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD, + 0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254, 0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3, + 0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620, 0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB, + 0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929, 0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA, + 0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6, 0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7, + 0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8, 0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4, + 0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D, 0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE, + 0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D, 0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E, + 0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252, 0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC, + 0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8, 0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751, + 0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF, 0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6, + 0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D, 0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284, + 0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A, 0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D, + 0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D, 0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349, + 0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162, 0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1, + 0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8, 0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8, + 0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4, 0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070, + 0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC, 0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD, + 0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E, 0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB, + 0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD, 0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310, + 0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36, 0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D, + 0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E, 0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8, + 0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443, 0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145, + 0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D, 0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403, + 0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634, 0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0, + 0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3, 0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074, + 0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C, 0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4, + 0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894, 0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4, + 0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49, 0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4, + 0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3, 0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED, + 0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06, 0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88, + 0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD, 0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31, + 0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E, 0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253, + 0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235, 0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C, + 0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01, 0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B, + 0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422, 0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451, + 0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A, 0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB, + 0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2, 0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854, + 0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11, 0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C, + 0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B, 0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E, + 0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0, 0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4, + 0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410, 0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876, + 0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71, 0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F, + 0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078, 0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F, + 0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6, 0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A, + 0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2, 0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834, + 0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817, 0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248, + 0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211, 0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C, + 0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557, 0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD, + 0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D, 0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E, + 0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247, 0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D, + 0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A, 0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55, + 0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2, 0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D, + 0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305, 0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA, + 0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B, 0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1, + 0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE, 0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2, + 0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA, 0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4, + 0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07, 0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153, + 0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2, 0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7, + 0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F, 0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8, + 0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2, 0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642, + 0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC, 0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46, + 0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C, 0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F, + 0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455, 0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050, + 0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78, 0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2, + 0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57, 0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55, + 0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650, 0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD, + 0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A, 0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266, + 0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408, 0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4, + 0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09, 0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052, + 0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86, 0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A, + 0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5, 0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A, + 0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977, 0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3, + 0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED, 0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016, + 0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C, 0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6, + 0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957, 0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B, + 0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B, 0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57, + 0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769, 0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8, + 0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384, 0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D, + 0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237, 0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249, + 0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840, 0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354, + 0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79, 0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2, + 0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144, 0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2, + 0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF, 0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A, + 0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2, 0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57, + 0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559, 0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E, + 0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA, 0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236, + 0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB, 0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8, + 0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D, 0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0, + 0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E, 0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF, + 0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77, 0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865, + 0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A, 0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F, + 0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F, 0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3, + 0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679, 0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C, + 0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575, 0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF, + 0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774, 0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA, + 0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A, 0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3, + 0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853, 0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08, + 0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B, 0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA, + 0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D, 0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643, + 0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F, 0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C, + 0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352, 0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3, + 0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A, 0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666, + 0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE, 0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE, + 0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4, 0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B, + 0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D, 0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F, + 0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4, 0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019, + 0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589, 0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D, + 0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB, 0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104, + 0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13, 0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684, + 0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599, 0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE, + 0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D, 0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB, + 0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E, 0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308, + 0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615, 0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403, + 0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20, 0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070, + 0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6, 0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD, + 0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199, 0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6, + 0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7, 0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70, + 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 950 || FF_CODE_PAGE == 0 /* Traditional Chinese */ +static const WCHAR uni2oem950[] = { /* Unicode --> Big5 pairs */ + 0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3, 0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE, + 0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5, 0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346, + 0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A, 0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E, + 0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352, 0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356, + 0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A, 0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E, + 0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362, 0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366, + 0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A, 0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E, + 0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372, 0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5, + 0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C, 0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB, + 0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1, 0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB, + 0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF, 0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6, + 0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8, 0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241, + 0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7, 0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5, + 0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE, 0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8, + 0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6, 0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A, + 0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275, 0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271, + 0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6, 0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1, + 0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3, 0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5, + 0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7, 0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7, + 0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6, 0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3, + 0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1, 0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2, + 0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE, 0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264, + 0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268, 0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E, + 0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A, 0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD, + 0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF, 0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3, + 0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9, 0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8, + 0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142, 0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172, + 0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176, 0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A, + 0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9, 0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5, + 0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9, 0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375, + 0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379, 0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D, + 0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3, 0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7, + 0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB, 0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF, + 0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3, 0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7, + 0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0, 0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251, + 0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253, 0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440, + 0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456, 0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946, + 0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2, 0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540, + 0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1, 0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950, + 0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1, 0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964, + 0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947, 0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547, + 0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4, 0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445, + 0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5, 0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1, + 0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6, 0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA, + 0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB, 0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45, + 0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8, 0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA, + 0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3, 0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF, + 0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2, 0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5, + 0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B, 0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550, + 0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551, 0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F, + 0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5, 0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA, + 0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4, 0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8, + 0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3, 0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE, + 0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0, 0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED, + 0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7, 0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4, + 0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9, 0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7, + 0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA, 0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D, + 0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED, 0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E, + 0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF, 0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2, + 0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63, 0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE, + 0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF, 0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB, + 0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6, 0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1, + 0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5, 0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2, + 0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4, 0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA, + 0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4, 0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA, + 0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0, 0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7, + 0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8, 0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE, + 0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED, 0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58, + 0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54, 0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E, + 0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4, 0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6, + 0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F, 0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48, + 0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1, 0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4, + 0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA, 0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA, + 0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF, 0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB, + 0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6, 0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA, + 0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9, 0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0, + 0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0, 0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3, + 0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC, 0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8, + 0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C, 0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6, + 0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456, 0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451, + 0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458, 0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D, + 0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460, 0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E, + 0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464, 0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465, + 0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD, 0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E, + 0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855, 0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7, + 0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9, 0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851, + 0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3, 0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7, + 0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6, 0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3, + 0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC, 0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE, + 0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6, 0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9, + 0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4, 0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF, + 0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7, 0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE, + 0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7, 0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD, + 0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4, 0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9, + 0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6, 0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5, + 0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB, 0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF, + 0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5, 0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8, + 0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD, 0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA, + 0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8, 0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078, + 0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7, 0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C, + 0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461, 0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552, + 0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA, 0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0, + 0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259, 0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C, + 0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8, 0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE, + 0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB, 0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4, + 0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC, 0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641, + 0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0, 0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955, + 0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE, 0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642, + 0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B, 0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2, + 0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1, 0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5, + 0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140, 0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C, + 0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9, 0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557, + 0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E, 0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2, + 0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646, 0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD, + 0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC, 0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F, + 0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED, 0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2, + 0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9, 0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63, + 0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1, 0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65, + 0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB, 0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6, + 0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6, 0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469, + 0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6, 0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0, + 0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9, 0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142, + 0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40, 0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2, + 0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0, 0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1, + 0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648, 0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754, + 0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1, 0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C, + 0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A, 0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA, + 0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8, 0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2, + 0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3, 0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45, + 0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079, 0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3, + 0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D, 0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6, + 0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC, 0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450, + 0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943, 0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B, + 0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA, 0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC, + 0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8, 0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF, + 0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD, 0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8, + 0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3, 0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3, + 0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB, 0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6, + 0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C, 0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A, + 0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F, 0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC, + 0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9, 0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9, + 0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED, 0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6, + 0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46, 0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1, + 0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD, 0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC, + 0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F, 0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574, + 0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573, 0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569, + 0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B, 0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570, + 0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B, 0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651, + 0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A, 0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C, + 0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C, 0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770, + 0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761, 0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774, + 0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76, 0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F, + 0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B, 0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772, + 0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A, 0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769, + 0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB, 0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF, + 0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950, 0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49, + 0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6, 0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941, + 0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952, 0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD, + 0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB, 0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8, + 0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947, 0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E, + 0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD, 0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7, + 0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC, 0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5, + 0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77, 0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C, + 0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E, 0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46, + 0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76, 0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E, + 0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6, 0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF, + 0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA, 0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5, + 0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141, 0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1, + 0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6, 0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140, + 0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44, 0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8, + 0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41, 0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2, + 0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2, 0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A, + 0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8, 0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7, + 0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3, 0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474, + 0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478, 0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8, + 0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8, 0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3, + 0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472, 0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875, + 0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871, 0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2, + 0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3, 0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F, + 0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1, 0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA, + 0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A, 0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868, + 0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0, 0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6, + 0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870, 0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0, + 0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6, 0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF, + 0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC, 0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6, + 0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB, 0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD, + 0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA, 0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB, + 0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2, 0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155, + 0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE, 0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150, + 0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5, 0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C, + 0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3, 0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0, + 0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147, 0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47, + 0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542, 0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546, + 0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543, 0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA, + 0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6, 0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F, + 0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2, 0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE, + 0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941, 0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3, + 0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC, 0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940, + 0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7, 0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B, + 0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4, 0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1, + 0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C, 0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA, + 0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE, 0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456, + 0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1, 0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459, + 0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A, 0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9, + 0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7, 0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9, + 0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5, 0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C, + 0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D, 0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8, + 0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778, 0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA, + 0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46, 0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB, + 0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9, 0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE, + 0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B, 0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F, + 0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664, 0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661, + 0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3, 0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1, + 0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC, 0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4, + 0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE, 0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958, + 0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2, 0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC, + 0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956, 0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9, + 0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54, 0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E, + 0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D, 0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52, + 0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53, 0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153, + 0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151, 0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47, + 0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49, 0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156, + 0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1, 0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF, + 0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5, 0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC, + 0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9, 0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5, + 0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD, 0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6, + 0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF, 0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE, + 0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2, 0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA, + 0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB, 0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8, + 0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4, 0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3, + 0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB, 0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E, + 0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF, 0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4, + 0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA, 0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2, + 0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED, 0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB, + 0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4, 0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3, + 0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0, 0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166, + 0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C, 0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2, + 0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165, 0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162, + 0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3, 0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B, + 0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552, 0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5, + 0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A, 0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D, + 0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1, 0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3, + 0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B, 0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD, + 0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA, 0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8, + 0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363, 0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2, + 0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7, 0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2, + 0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A, 0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159, + 0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469, 0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668, + 0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB, 0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3, + 0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1, 0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A, + 0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961, 0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E, + 0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7, 0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3, + 0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD, 0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8, + 0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D, 0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4, + 0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1, 0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD, + 0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC, 0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B, + 0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6, 0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2, + 0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE, 0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB, + 0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4, 0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967, + 0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970, 0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966, + 0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50, 0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D, + 0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52, 0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B, + 0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968, 0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E, + 0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8, 0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62, + 0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1, 0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56, + 0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D, 0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B, + 0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A, 0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65, + 0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162, 0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55, + 0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51, 0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163, + 0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A, 0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164, + 0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3, 0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE, + 0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0, 0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB, + 0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6, 0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0, + 0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142, 0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2, + 0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB, 0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9, + 0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8, 0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9, + 0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6, 0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB, + 0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443, 0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5, + 0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF, 0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE, + 0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF, 0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8, + 0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9, 0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46, + 0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD, 0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9, + 0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3, 0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5, + 0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2, 0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170, + 0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178, 0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174, + 0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B, 0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177, + 0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555, 0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A, + 0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556, 0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559, + 0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E, 0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957, + 0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951, 0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5, + 0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1, 0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3, + 0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE, 0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0, + 0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA, 0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D, + 0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB, 0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C, + 0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5, 0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7, + 0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973, 0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56, + 0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0, 0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446, + 0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9, 0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972, + 0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674, 0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9, + 0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57, 0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A, + 0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8, 0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6, + 0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167, 0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62, + 0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65, 0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149, + 0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146, 0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1, + 0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448, 0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49, + 0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E, 0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED, + 0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB, 0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65, + 0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8, 0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F, + 0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67, 0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C, + 0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9, 0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974, + 0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B, 0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE, + 0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E, 0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8, + 0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0, 0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59, + 0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D, 0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB, + 0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B, 0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3, + 0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0, 0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561, + 0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD, 0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473, + 0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7, 0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7, + 0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3, 0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1, + 0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3, 0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D, + 0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C, 0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60, + 0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61, 0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B, + 0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A, 0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4, + 0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D, 0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79, + 0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6, 0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2, + 0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F, 0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E, + 0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71, 0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D, + 0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72, 0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9, + 0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158, 0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E, + 0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6, 0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157, + 0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC, 0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544, + 0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3, 0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9, + 0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED, 0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC, + 0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452, 0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F, + 0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5, 0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56, + 0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54, 0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744, + 0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0, 0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD, + 0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3, 0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC, + 0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565, 0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563, + 0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A, 0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B, + 0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960, 0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964, + 0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967, 0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF, + 0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4, 0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445, + 0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA, 0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD, + 0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B, 0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F, + 0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8, 0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476, + 0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1, 0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D, + 0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C, 0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE, + 0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D, 0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD, + 0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0, 0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3, + 0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75, 0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163, + 0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456, 0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454, + 0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B, 0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7, + 0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3, 0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D, + 0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4, 0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E, + 0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5, 0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A, + 0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D, 0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE, + 0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A, 0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE, + 0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1, 0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1, + 0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6, 0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA, + 0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177, 0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176, + 0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B, 0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164, + 0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A, 0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F, + 0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459, 0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6, + 0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA, 0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB, + 0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72, 0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575, + 0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971, 0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366, + 0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF, 0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8, + 0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD, 0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9, + 0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749, 0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1, + 0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3, 0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73, + 0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8, 0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A, + 0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A, 0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF, + 0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576, 0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573, + 0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B, 0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE, + 0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D, 0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E, + 0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C, 0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4, + 0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76, 0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75, + 0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC, 0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1, + 0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F, 0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E, + 0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174, 0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461, + 0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B, 0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577, + 0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD, 0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD, + 0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF, 0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4, + 0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6, 0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3, + 0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78, 0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE, + 0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6, 0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5, + 0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2, 0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF, + 0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2, 0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7, + 0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3, 0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6, + 0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD, 0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5, + 0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6, 0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB, + 0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A, 0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4, + 0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0, 0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE, + 0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6, 0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3, + 0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4, 0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8, + 0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC, 0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0, + 0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1, 0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1, + 0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176, 0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8, + 0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3, 0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB, + 0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC, 0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA, + 0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9, 0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A, + 0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C, 0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA, + 0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5, 0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565, + 0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1, 0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8, + 0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564, 0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557, + 0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B, 0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C, + 0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB, 0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F, + 0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944, 0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753, + 0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948, 0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A, + 0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755, 0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D, + 0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474, 0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942, + 0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467, 0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C, + 0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2, 0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B, + 0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A, 0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758, + 0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F, 0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757, + 0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8, 0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5, + 0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C, 0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43, + 0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A, 0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB, + 0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA, 0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79, + 0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1, 0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579, + 0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3, 0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC, + 0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978, 0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5, + 0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5, 0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7, + 0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3, 0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB, + 0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2, 0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1, + 0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979, 0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3, + 0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF, 0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8, + 0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4, 0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0, + 0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA, 0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A, + 0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A, 0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC, + 0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9, 0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0, + 0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7, 0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9, + 0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF, 0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72, + 0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76, 0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49, + 0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4, 0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1, + 0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0, 0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3, + 0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476, 0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3, + 0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4, 0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB, + 0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA, 0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5, + 0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA, 0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5, + 0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3, 0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3, + 0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE, 0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE, + 0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2, 0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED, + 0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB, 0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1, + 0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF, 0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF, + 0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8, 0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD, + 0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7, 0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6, + 0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF, 0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4, + 0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD, 0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB, + 0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4, 0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA, + 0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1, 0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF, + 0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3, 0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42, + 0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45, 0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6, + 0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8, 0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1, + 0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1, 0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4, + 0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6, 0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA, + 0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE, 0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8, + 0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9, 0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC, + 0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4, 0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2, + 0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1, 0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7, + 0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579, 0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA, + 0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6, 0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B, + 0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569, 0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573, + 0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478, 0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574, + 0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3, 0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE, + 0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E, 0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477, + 0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0, 0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5, + 0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954, 0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A, + 0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77, 0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C, + 0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E, 0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1, + 0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970, 0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB, + 0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D, 0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956, + 0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA, 0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958, + 0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B, 0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE, + 0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6, 0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769, + 0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B, 0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5, + 0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764, 0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8, + 0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB, 0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9, + 0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0, 0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF, + 0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767, 0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE, + 0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5, 0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA, + 0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB, 0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F, + 0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3, 0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0, + 0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0, 0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD, + 0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E, 0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1, + 0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A, 0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5, + 0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB, 0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2, + 0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3, 0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0, + 0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7, 0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0, + 0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB, 0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9, + 0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6, 0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5, + 0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7, 0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6, + 0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4, 0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC, + 0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC, 0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB, + 0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE, 0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258, + 0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D, 0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1, + 0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2, 0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246, + 0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243, 0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C, + 0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD, 0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0, + 0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD, 0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC, + 0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4, 0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7, + 0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1, 0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8, + 0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5, 0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7, + 0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1, 0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD, + 0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975, 0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977, + 0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56, 0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD, + 0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE, 0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF, + 0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248, 0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3, + 0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE, 0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7, + 0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5, 0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8, + 0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48, 0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773, + 0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F, 0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3, + 0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2, 0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF, + 0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD, 0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE, + 0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9, 0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E, + 0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE, 0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE, + 0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB, 0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4, + 0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB, 0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD, + 0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4, 0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC, + 0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF, 0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD, + 0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D, 0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B, + 0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3, 0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52, + 0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE, 0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0, + 0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5, 0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB, + 0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF, 0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3, + 0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0, 0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7, + 0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7, 0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9, + 0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC, 0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4, + 0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777, 0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0, + 0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6, 0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A, + 0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7, 0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5, + 0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9, 0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9, + 0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6, 0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4, + 0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8, 0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7, + 0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7, 0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB, + 0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D, 0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450, + 0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA, 0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2, + 0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1, 0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0, + 0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA, 0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2, + 0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA, 0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3, + 0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2, 0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB, + 0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC, 0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE, + 0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5, 0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3, + 0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF, 0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE, + 0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42, 0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7, + 0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA, 0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9, + 0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE, 0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D, + 0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48, 0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49, + 0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8, 0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F, + 0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3, 0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44, + 0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52, 0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8, + 0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2, 0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0, + 0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56, 0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B, + 0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE, 0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51, + 0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58, 0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63, + 0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66, 0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56, + 0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63, 0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67, + 0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48, 0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E, + 0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59, 0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57, + 0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D, 0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E, + 0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA, 0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB, + 0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9, 0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE, + 0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5, 0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2, + 0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4, 0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE, + 0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC, 0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9, + 0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF, 0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0, + 0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC, 0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9, + 0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD, 0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0, + 0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9, 0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC, + 0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1, 0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3, + 0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2, 0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0, + 0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA, 0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA, + 0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC, 0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4, + 0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE, 0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB, + 0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE, 0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2, + 0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE, 0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3, + 0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD, 0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5, + 0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1, 0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0, + 0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2, 0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA, + 0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4, 0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9, + 0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8, 0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB, + 0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5, 0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4, + 0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC, 0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6, + 0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9, 0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA, + 0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2, 0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0, + 0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB, 0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF, + 0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8, 0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1, + 0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB, 0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0, + 0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1, 0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E, + 0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE, 0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2, + 0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3, 0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A, + 0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258, 0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D, + 0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D, 0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F, + 0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249, 0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67, + 0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D, 0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68, + 0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253, 0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C, + 0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E, 0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254, + 0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241, 0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252, + 0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD, 0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5, + 0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0, 0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB, + 0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4, 0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA, + 0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7, 0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6, + 0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9, 0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF, + 0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6, 0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2, + 0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC, 0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE, + 0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC, 0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4, + 0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1, 0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0, + 0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2, 0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA, + 0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB, 0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7, + 0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0, 0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5, + 0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4, 0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8, + 0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48, 0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3, + 0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A, 0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4, + 0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC, 0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA, + 0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6, 0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7, + 0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6, 0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE, + 0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267, 0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5, + 0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256, 0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250, + 0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370, 0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0, + 0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455, 0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A, + 0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1, 0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF, + 0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6, 0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4, + 0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1, 0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1, + 0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED, 0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64, + 0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8, 0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6, + 0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB, 0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA, + 0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7, 0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9, + 0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71, 0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0, + 0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9, 0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A, + 0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF, 0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B, + 0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1, 0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA, + 0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65, 0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC, + 0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC, 0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE, + 0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD, 0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267, + 0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC, 0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2, + 0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C, 0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71, + 0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF, 0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269, + 0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5, 0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0, + 0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48, 0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68, + 0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2, 0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241, + 0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240, 0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3, + 0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42, 0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7, + 0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5, 0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB, + 0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA, 0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2, + 0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E, 0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A, + 0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B, 0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244, + 0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF, 0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2, + 0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1, 0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3, + 0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2, 0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40, + 0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1, 0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD, + 0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC, 0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3, + 0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851, 0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55, + 0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856, 0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B, + 0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857, 0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855, + 0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56, 0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F, + 0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50, 0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C, + 0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846, 0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44, + 0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71, 0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42, + 0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F, 0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66, + 0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70, 0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73, + 0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79, 0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8, + 0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4, 0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2, + 0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41, 0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69, + 0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60, 0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD, + 0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74, 0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C, + 0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77, 0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74, + 0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD, 0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73, + 0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78, 0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D, + 0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A, 0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78, + 0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB, 0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77, + 0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4, 0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79, + 0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3, 0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E, + 0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255, 0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D, + 0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA, 0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6, + 0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F, 0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248, + 0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245, 0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261, + 0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265, 0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9, + 0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260, 0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269, + 0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B, 0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265, + 0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250, 0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B, + 0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647, 0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267, + 0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258, 0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE, + 0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645, 0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259, + 0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF, 0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C, + 0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253, 0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7, + 0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268, 0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D, + 0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252, 0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245, + 0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256, 0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7, + 0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D, 0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6, + 0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7, 0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC, + 0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1, 0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4, + 0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7, 0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5, + 0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED, 0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9, + 0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF, 0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA, + 0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA, 0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51, + 0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF, 0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547, + 0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543, 0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9, + 0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3, 0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5, + 0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52, 0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60, + 0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49, 0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2, + 0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE, 0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63, + 0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1, 0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5, + 0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C, 0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB, + 0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3, 0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47, + 0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9, 0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45, + 0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0, 0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66, + 0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA, 0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C, + 0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4, 0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77, + 0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271, 0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF, + 0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE, 0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3, + 0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E, 0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C, + 0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A, 0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7, + 0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E, 0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279, + 0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B, 0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7, + 0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9, 0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1, + 0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79, 0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD, + 0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2, 0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B, + 0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7, 0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2, + 0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED, 0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660, + 0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9, 0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2, + 0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB, 0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB, + 0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1, 0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB, + 0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640, 0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651, + 0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE, 0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40, + 0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48, 0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB, + 0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8, 0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45, + 0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE, 0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2, + 0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC, 0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC, + 0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA, 0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC, + 0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB, 0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9, + 0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52, 0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B, + 0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54, 0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8, + 0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271, 0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2, + 0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF, 0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8, + 0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1, 0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378, + 0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C, 0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377, + 0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262, 0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D, + 0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260, 0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B, + 0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E, 0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467, + 0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466, 0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4, + 0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7, 0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB, + 0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579, 0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4, + 0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5, 0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C, + 0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5, 0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F, + 0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861, 0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52, + 0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56, 0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1, + 0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59, 0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6, + 0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6, 0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1, + 0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5, 0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278, + 0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E, 0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C, + 0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271, 0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A, + 0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C, 0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E, + 0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A, 0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B, + 0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656, 0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A, + 0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649, 0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B, + 0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F, 0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C, + 0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A, 0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B, + 0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64, 0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1, + 0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A, 0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D, + 0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC, 0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4, + 0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F, 0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1, + 0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB, 0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E, + 0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1, 0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF, + 0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA, 0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB, + 0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3, 0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A, + 0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E, 0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7, + 0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663, 0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672, + 0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55, 0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C, + 0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56, 0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F, + 0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52, 0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F, + 0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53, 0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7, + 0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60, 0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E, + 0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61, 0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277, + 0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD, 0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C, + 0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B, 0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C, + 0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB, 0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED, + 0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC, 0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6, + 0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7, 0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8, + 0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7, 0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9, + 0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66, 0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6, + 0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67, 0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8, + 0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60, 0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA, + 0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9, 0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1, + 0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E, 0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552, + 0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A, 0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6, + 0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7, 0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA, + 0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9, 0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D, + 0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F, 0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7, + 0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6, 0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62, + 0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867, 0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64, + 0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64, 0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61, + 0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E, 0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2, + 0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF, 0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3, + 0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7, 0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4, + 0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6, 0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662, + 0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79, 0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274, + 0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275, 0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669, + 0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76, 0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F, + 0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555, 0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD, + 0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1, 0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB, + 0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD, 0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC, + 0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E, 0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677, + 0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1, 0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57, + 0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E, 0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2, + 0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278, 0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E, + 0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A, 0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8, + 0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A, 0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45, + 0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68, 0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3, + 0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66, 0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1, + 0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2, 0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC, + 0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1, 0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4, + 0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4, 0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6, + 0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB, 0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA, + 0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3, 0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1, + 0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2, 0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C, + 0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C, 0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B, + 0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279, 0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671, + 0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677, 0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1, + 0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2, 0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B, + 0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558, 0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A, + 0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA, 0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D, + 0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8, 0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2, + 0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8, 0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE, + 0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4, 0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6, + 0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3, 0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4, + 0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2, 0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA, + 0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41, 0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5, + 0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4, 0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65, + 0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63, 0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64, + 0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5, 0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A, + 0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4, 0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045, + 0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046, 0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041, + 0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274, 0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED, + 0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0, 0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA, + 0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D, 0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B, + 0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260, 0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF, + 0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2, 0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6, + 0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC, 0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72, + 0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049, 0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE, + 0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3, 0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563, + 0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46, 0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9, + 0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2, 0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E, + 0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70, 0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB, + 0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60, 0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62, + 0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B, 0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566, + 0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7, 0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4, + 0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A, 0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C, + 0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9, 0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74, + 0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF, 0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC, + 0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68, 0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E, + 0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B, 0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7, + 0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66, 0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2, + 0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4, 0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA, + 0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0, 0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4, + 0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569, 0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2, + 0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2, 0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1, + 0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4, 0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB, + 0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9, 0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6, + 0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF, 0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD, + 0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7, 0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45, + 0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4, 0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4, + 0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B, 0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F, + 0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62, 0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74, + 0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76, 0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E, + 0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C, 0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278, + 0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470, 0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4, + 0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6, 0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E, + 0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47, 0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2, + 0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB, 0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8, + 0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5, 0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9, + 0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471, 0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75, + 0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1, 0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472, + 0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF, 0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC, + 0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0, 0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1, + 0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9, 0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64, + 0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA, 0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E, + 0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76, 0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB, + 0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF, 0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2, + 0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC, 0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3, + 0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5, 0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75, + 0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0, 0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA, + 0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE, 0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2, + 0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1, 0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC, + 0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF, 0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0, + 0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8, 0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA, + 0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA, 0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844, + 0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE, 0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2, + 0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3, 0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7, + 0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB, 0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE, + 0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D, 0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1, + 0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79, 0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65, + 0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68, 0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B, + 0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2, 0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A, + 0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4, 0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054, + 0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A, 0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476, + 0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4, 0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666, + 0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3, 0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8, + 0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575, 0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C, + 0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A, 0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B, + 0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED, 0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5, + 0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB, 0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C, + 0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB, 0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A, + 0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0, 0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD, + 0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3, 0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B, + 0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5, 0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA, + 0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576, 0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6, + 0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB, 0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC, + 0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE, 0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851, + 0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8, 0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D, + 0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F, 0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1, + 0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5, 0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC, + 0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3, 0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC, + 0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849, 0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54, + 0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF, 0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7, + 0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3, 0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59, + 0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A, 0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC, + 0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7, 0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3, + 0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146, 0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143, + 0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9, 0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147, + 0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A, 0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D, + 0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3, 0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D, + 0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D, 0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C, + 0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473, 0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6, + 0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72, 0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2, + 0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6, 0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4, + 0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7, 0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6, + 0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE, 0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB, + 0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0, 0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC, + 0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD, 0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2, + 0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5, 0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341, + 0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5, 0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE, + 0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340, 0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE, + 0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE, 0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149, + 0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7, 0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1, + 0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8, 0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856, + 0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870, 0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE, + 0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC, 0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5, + 0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2, 0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3, + 0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED, 0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6, + 0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE, 0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA, + 0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B, 0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7, + 0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC, 0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858, + 0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B, 0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348, + 0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346, 0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F, + 0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C, 0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0, + 0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E, 0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A, + 0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1, 0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9, + 0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC, 0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8, + 0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873, 0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6, + 0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0, 0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC, + 0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9, 0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF, + 0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1, 0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D, + 0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A, 0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C, + 0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3, 0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2, + 0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7, 0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB, + 0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF, 0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA, + 0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3, 0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D, + 0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB, 0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1, + 0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342, 0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345, + 0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA, 0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6, + 0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7, 0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1, + 0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4, 0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8, + 0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA, 0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB, + 0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6, 0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5, + 0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB, 0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE, + 0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5, 0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47, + 0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A, 0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E, + 0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1, 0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D, + 0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E, 0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354, + 0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351, 0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2, + 0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F, 0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C, + 0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63, 0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6, + 0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68, 0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76, + 0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA, 0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74, + 0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA, 0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79, + 0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC, 0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A, + 0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC, 0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F, + 0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9, 0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7, + 0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA, 0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2, + 0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB, 0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061, + 0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064, 0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B, + 0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062, 0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066, + 0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0, 0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1, + 0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478, 0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6, + 0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0, 0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC, + 0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3, 0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4, + 0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8, 0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D, + 0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045, 0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047, + 0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F, 0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C, + 0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE, 0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF, + 0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7, 0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9, + 0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865, 0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361, + 0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB, 0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B, + 0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA, 0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C, + 0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153, 0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152, + 0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE, 0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B, + 0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD, 0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9, + 0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4, 0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA, + 0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF, 0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353, + 0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358, 0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355, + 0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5, 0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350, + 0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1, 0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8, + 0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9, 0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5, + 0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF, 0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED, + 0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD, 0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB, + 0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2, 0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7, + 0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C, 0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8, + 0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0, 0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5, + 0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB, 0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868, + 0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65, 0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60, + 0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57, 0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B, + 0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63, 0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78, + 0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7, 0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377, + 0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376, 0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4, + 0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA, 0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373, + 0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368, 0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369, + 0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2, 0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC, + 0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75, 0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0, + 0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB, 0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5, + 0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE, 0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D, + 0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA, 0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7, + 0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB, 0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1, + 0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5, 0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3, + 0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0, 0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4, + 0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6, 0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169, + 0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3, 0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C, + 0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD, 0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168, + 0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E, 0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9, + 0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E, 0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4, + 0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071, 0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6, + 0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072, 0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8, + 0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2, 0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0, + 0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6, 0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D, + 0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1, 0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7, + 0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1, 0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE, + 0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942, 0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE, + 0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA, 0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A, + 0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9, 0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8, + 0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D, 0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D, + 0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1, 0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A, + 0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B, 0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870, + 0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D, 0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1, + 0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB, 0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9, + 0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA, 0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362, + 0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC, 0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB, + 0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873, 0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872, + 0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E, 0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079, + 0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD, 0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3, + 0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365, 0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD, + 0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7, 0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC, + 0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE, 0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70, + 0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42, 0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9, + 0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6, 0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4, + 0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B, 0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B, + 0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE, 0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1, + 0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF, 0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41, + 0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42, 0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366, + 0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741, 0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71, + 0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6, 0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5, + 0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055, 0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5, + 0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744, 0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45, + 0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45, 0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB, + 0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F, 0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C, + 0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2, 0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB, + 0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46, 0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9, + 0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877, 0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75, + 0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878, 0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE, + 0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0, 0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C, + 0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD, 0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D, + 0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061, 0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064, + 0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062, 0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F, + 0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F, 0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E, + 0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA, 0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A, + 0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD, 0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2, + 0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D, 0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF, + 0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745, 0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C, + 0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5, 0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7, + 0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3, 0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F, + 0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9, 0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB, + 0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47, 0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4, + 0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B, 0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72, + 0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76, 0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879, + 0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD, 0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1, + 0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D, 0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A, + 0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9, 0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744, + 0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3, 0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE, + 0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9, 0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED, + 0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8, 0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC, + 0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8, 0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177, + 0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9, 0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179, + 0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1, 0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2, + 0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4, 0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6, + 0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA, 0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B, + 0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4, 0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50, + 0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F, 0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068, + 0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57, 0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C, + 0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9, 0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51, + 0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF, 0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1, + 0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA, 0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371, + 0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB, 0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE, + 0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A, 0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8, + 0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A, 0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748, + 0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7, 0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0, + 0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4, 0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6, + 0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB, 0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2, + 0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A, 0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E, + 0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B, 0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C, + 0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E, 0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC, + 0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC, 0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6, + 0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9, 0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2, + 0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7, 0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8, + 0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0, 0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE, + 0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4, 0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61, + 0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B, 0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65, + 0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1, 0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F, + 0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5, 0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078, + 0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C, 0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C, + 0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53, 0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E, + 0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41, 0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3, + 0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E, 0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5, + 0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED, 0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC, + 0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4, 0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8, + 0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A, 0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE, + 0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6, 0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0, + 0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2, 0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF, + 0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765, 0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D, + 0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F, 0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340, + 0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8, 0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF, + 0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9, 0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773, + 0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C, 0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3, + 0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776, 0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D, + 0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774, 0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7, + 0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5, 0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77, + 0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74, 0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1, + 0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8, 0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A, + 0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD, 0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63, + 0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A, 0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD, + 0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA, 0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E, + 0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0, 0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1, + 0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78, 0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3, + 0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B, 0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F, + 0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC, 0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5, + 0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8, 0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0, + 0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA, 0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC, + 0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD, 0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0, + 0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF, 0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8, + 0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD, 0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0, + 0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4, 0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0, + 0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA, 0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4, + 0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB, 0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5, + 0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2, 0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB, + 0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59, 0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1, + 0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6, 0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4, + 0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A, 0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6, + 0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55, 0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57, + 0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54, 0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9, + 0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62, 0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9, + 0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774, 0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4, + 0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9, 0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770, + 0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758, 0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6, + 0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD, 0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B, + 0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E, 0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3, + 0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778, 0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B, + 0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2, 0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772, + 0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E, 0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C, + 0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D, 0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43, + 0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41, 0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6, + 0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC, 0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46, + 0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54, 0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44, + 0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53, 0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE, + 0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D, 0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40, + 0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB, 0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D, + 0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51, 0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42, + 0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A, 0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4, + 0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54, 0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3, + 0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8, 0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC, + 0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4, 0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3, + 0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4, 0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9, + 0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6, 0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2, + 0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7, 0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3, + 0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2, 0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC, + 0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2, 0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3, + 0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF, 0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8, + 0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF, 0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7, + 0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB, 0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF, + 0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0, 0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8, + 0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6, 0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4, + 0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5, 0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8, + 0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5, 0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749, + 0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9, 0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3, + 0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC, 0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7, + 0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68, 0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342, + 0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8, 0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E, + 0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB, 0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4, + 0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7, 0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6, + 0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8, 0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041, + 0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB, 0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE, + 0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA, 0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC, + 0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047, 0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA, + 0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5, 0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348, + 0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7, 0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF, + 0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2, 0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3, + 0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D, 0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF, + 0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD, 0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF, + 0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB, 0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3, + 0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9, 0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE, + 0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6, 0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED, + 0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0, 0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC, + 0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF, 0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB, + 0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE, 0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC, + 0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68, 0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D, + 0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA, 0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5, + 0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0, 0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2, + 0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED, 0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9, + 0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD, 0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B, + 0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF, 0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4, + 0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB, 0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA, + 0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0, 0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF, + 0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9, 0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD, + 0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61, 0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67, + 0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4, 0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F, + 0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D, 0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D, + 0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3, 0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1, + 0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67, 0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A, + 0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D, 0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60, + 0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC, 0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B, + 0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69, 0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF, + 0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9, 0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1, + 0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5, 0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1, + 0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0, 0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC, + 0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE, 0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6, + 0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB, 0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7, + 0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7, 0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5, + 0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF, 0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642, + 0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643, 0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644, + 0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640, 0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9, + 0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8, 0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE, + 0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E, 0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5, + 0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0, 0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C, + 0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2, 0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1, + 0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC, 0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE, + 0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8, 0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB, + 0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E, 0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7, + 0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9, 0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2, + 0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352, 0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF, + 0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE, 0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5, + 0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6, 0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD, + 0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5, 0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8, + 0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF, 0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3, + 0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF, 0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4, + 0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6, 0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6, + 0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442, 0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440, + 0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70, 0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71, + 0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73, 0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2, + 0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA, 0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5, + 0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4, 0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7, + 0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C, 0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8, + 0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6, 0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74, + 0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7, 0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77, + 0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA, 0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8, + 0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5, 0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76, + 0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF, 0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE, + 0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB, 0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0, + 0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B, 0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8, + 0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC, 0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B, + 0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E, 0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0, + 0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356, 0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1, + 0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446, 0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0, + 0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB, 0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1, + 0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1, 0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B, + 0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8, 0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5, + 0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041, 0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE, + 0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447, 0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2, + 0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2, 0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C, + 0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C, 0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0, + 0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052, 0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059, + 0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057, 0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359, + 0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A, 0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB, + 0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644, 0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9, + 0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA, 0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643, + 0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7, 0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1, + 0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647, 0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641, + 0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF, 0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6, + 0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0, 0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4, + 0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A, 0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9, + 0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E, 0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8, + 0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E, 0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF, + 0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6, 0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A, + 0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7, 0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6, + 0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA, 0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3, + 0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4, 0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5, + 0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0, 0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC, + 0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7, 0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB, + 0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8, 0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7, + 0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF, 0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9, + 0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3, 0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1, + 0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5, 0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7, + 0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA, 0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB, + 0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3, 0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9, + 0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE, 0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2, + 0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC, 0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB, + 0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5, 0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4, + 0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6, 0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2, + 0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF, 0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0, + 0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD, 0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340, + 0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE, 0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7, + 0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7, 0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5, + 0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8, 0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3, + 0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D, 0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756, + 0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757, 0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC, + 0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE, 0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640, + 0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D, 0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD, + 0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5, 0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344, + 0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A, 0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC, + 0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7, 0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF, + 0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5, 0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055, + 0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8, 0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5, + 0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7, 0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4, + 0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1, 0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059, + 0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7, 0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3, + 0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7, 0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0, + 0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73, 0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2, + 0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366, 0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364, + 0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C, 0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652, + 0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F, 0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654, + 0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE, 0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB, + 0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC, 0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455, + 0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED, 0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9, + 0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8, 0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8, + 0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7, 0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4, + 0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC, 0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6, + 0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348, 0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9, + 0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542, 0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC, + 0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A, 0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE, + 0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9, 0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75, + 0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5, 0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658, + 0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656, 0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061, + 0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063, 0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF, + 0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF, 0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC, + 0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B, 0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F, + 0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7, 0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6, + 0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7, 0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9, + 0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659, 0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1, + 0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0, 0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5, + 0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1, 0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9, + 0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7, 0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4, + 0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5, 0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B, + 0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458, 0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F, + 0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A, 0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841, + 0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA, 0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846, + 0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5, 0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0, + 0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD, 0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7, + 0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3, 0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5, + 0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7, 0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1, + 0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE, 0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB, + 0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145, 0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9, + 0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143, 0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142, + 0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD, 0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352, + 0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB, 0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350, + 0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC, 0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7, + 0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543, 0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655, + 0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE, 0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763, + 0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3, 0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951, + 0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE, 0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060, + 0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF, 0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE, + 0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8, 0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF, + 0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD, 0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1, + 0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46, 0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42, + 0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44, 0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40, + 0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD, 0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B, + 0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079, 0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C, + 0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465, 0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4, + 0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A, 0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE, + 0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848, 0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC, + 0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC, 0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9, + 0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7, 0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4, + 0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146, 0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149, + 0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359, 0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1, + 0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE, 0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659, + 0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF, 0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF, + 0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC, 0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547, + 0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B, 0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3, + 0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF, 0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE, + 0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2, 0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3, + 0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4, 0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5, + 0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1, 0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE, + 0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED, 0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B, + 0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3, 0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376, + 0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C, 0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D, + 0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374, 0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373, + 0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F, 0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666, + 0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3, 0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945, + 0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943, 0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B, + 0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944, 0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB, + 0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC, 0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852, + 0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44, 0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0, + 0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0, 0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2, + 0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3, 0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB, + 0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3, 0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5, + 0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6, 0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53, + 0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7, 0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA, + 0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8, 0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3, + 0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5, 0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9, + 0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD, 0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6, + 0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB, 0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA, + 0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3, 0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD, + 0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9, 0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8, + 0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED, 0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4, + 0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E, 0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B, + 0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50, 0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA, + 0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4, 0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8, + 0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E, 0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2, + 0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B, 0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48, + 0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855, 0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854, + 0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5, 0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4, + 0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D, 0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1, + 0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766, 0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9, + 0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441, 0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6, + 0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4, 0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60, + 0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73, 0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC, + 0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6, 0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474, + 0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F, 0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C, + 0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C, 0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA, + 0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5, 0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF, + 0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6, 0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E, + 0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F, 0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6, + 0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4, 0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849, + 0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D, 0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC, + 0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD, 0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7, + 0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442, 0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444, + 0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8, 0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842, + 0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7, 0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA, + 0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB, 0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A, + 0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F, 0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675, + 0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68, 0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672, + 0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74, 0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674, + 0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70, 0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3, + 0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0, 0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1, + 0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B, 0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962, + 0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963, 0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960, + 0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB, 0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5, + 0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F, 0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB, + 0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7, 0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A, + 0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5, 0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6, + 0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE, 0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E, + 0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C, 0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA, + 0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE, 0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC, + 0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1, 0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D, + 0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55, 0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50, + 0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865, 0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864, + 0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874, 0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F, + 0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862, 0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878, + 0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E, 0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2, + 0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872, 0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870, + 0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7, 0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB, + 0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9, 0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF, + 0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED, 0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8, + 0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45, 0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6, + 0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5, 0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7, + 0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3, 0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB, + 0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5, 0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA, + 0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7, 0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1, + 0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9, 0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1, + 0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED, 0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA, + 0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6, 0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB, + 0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6, 0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6, + 0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2, 0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9, + 0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC, 0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F, + 0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161, 0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D, + 0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A, 0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A, + 0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE, 0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164, + 0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153, 0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB, + 0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C, 0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362, + 0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D, 0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2, + 0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE, 0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0, + 0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375, 0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3, + 0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366, 0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3, + 0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2, 0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD, + 0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7, 0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9, + 0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8, 0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0, + 0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668, 0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E, + 0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667, 0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F, + 0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669, 0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C, + 0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A, 0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2, + 0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C, 0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF, + 0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644, 0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954, + 0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956, 0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668, + 0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671, 0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF, + 0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78, 0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC, + 0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC, 0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3, + 0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2, 0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0, + 0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2, 0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3, + 0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B, 0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D, + 0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A, 0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48, + 0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2, 0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0, + 0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47, 0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D, + 0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377, 0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547, + 0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D, 0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA, + 0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59, 0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2, + 0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD, 0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB, + 0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC, 0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE, + 0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0, 0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4, + 0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1, 0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446, + 0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3, 0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848, + 0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB, 0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3, + 0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7, 0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC, + 0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E, 0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA, + 0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2, 0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969, + 0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB, 0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047, + 0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6, 0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F, + 0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6, 0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD, + 0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE, 0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E, + 0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C, 0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50, + 0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174, 0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8, + 0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379, 0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42, + 0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8, 0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973, + 0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6, 0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD, + 0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E, 0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51, + 0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53, 0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D, + 0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA, 0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177, + 0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E, 0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9, + 0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549, 0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551, + 0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5, 0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647, + 0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957, 0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE, + 0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44, 0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053, + 0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9, 0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA, + 0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC, 0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF, + 0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7, 0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF, + 0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62, 0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55, + 0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE, 0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD, + 0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2, 0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C, + 0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1, 0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B, + 0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F, 0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669, + 0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9, 0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43, + 0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6, 0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5, + 0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2, 0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5, + 0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7, 0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554, + 0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC, 0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC, + 0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF, 0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978, + 0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1, 0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7, + 0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B, 0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9, + 0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055, 0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056, + 0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A, 0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4, + 0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342, 0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9, + 0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440, 0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9, + 0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F, 0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555, + 0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3, 0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE, + 0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1, 0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4, + 0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB, 0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC, + 0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552, 0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673, + 0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9, 0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8, + 0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD, 0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2, + 0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1, 0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5, + 0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8, 0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1, + 0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5, 0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061, + 0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060, 0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D, + 0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D, 0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54, + 0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD, 0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348, + 0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443, 0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558, + 0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8, 0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9, + 0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556, 0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959, + 0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55, 0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60, + 0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2, 0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8, + 0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6, 0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5, + 0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5, 0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3, + 0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1, 0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E, + 0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA, 0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE, + 0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D, 0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64, + 0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67, 0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65, + 0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B, 0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F, + 0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240, 0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3, + 0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1, 0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D, + 0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5, 0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9, + 0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB, 0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6, + 0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA, 0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB, + 0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD, 0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678, + 0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1, 0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559, + 0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D, 0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB, + 0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2, 0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852, + 0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6, 0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A, + 0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5, 0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD, + 0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA, 0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C, + 0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D, 0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9, + 0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564, 0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4, + 0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9, 0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA, + 0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC, 0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068, + 0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6, 0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70, + 0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66, 0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC, + 0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3, 0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4, + 0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3, 0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5, + 0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856, 0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB, + 0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6, 0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC, + 0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7, 0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE, + 0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A, 0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0, + 0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352, 0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D, + 0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5, 0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF, + 0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA, 0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0, + 0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE, 0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76, + 0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79, 0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2, + 0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A, 0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C, + 0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71, 0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243, + 0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75, 0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD, + 0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7, 0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3, + 0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA, 0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0, + 0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2, 0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD, + 0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449, 0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1, + 0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356, 0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B, + 0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572, 0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574, + 0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD, 0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF, + 0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF, 0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6, + 0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1, 0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570, + 0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB, 0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F, + 0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857, 0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC, + 0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D, 0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8, + 0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B, 0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A, + 0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE, 0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7, + 0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3, 0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0, + 0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC, 0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA, + 0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D, 0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC, + 0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4, 0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9, + 0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB, 0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E, + 0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B, 0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79, + 0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7, 0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77, + 0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2, 0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359, + 0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6, 0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD, + 0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB, 0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1, + 0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450, 0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E, + 0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8, 0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3, + 0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC, 0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0, + 0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1, 0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2, + 0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578, 0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A, + 0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6, 0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF, + 0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4, 0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3, + 0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD, 0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF, + 0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9, 0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB, + 0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7, 0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE, + 0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8, 0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3, + 0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7, 0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF, + 0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867, 0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0, + 0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A, 0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871, + 0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862, 0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861, + 0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2, 0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7, + 0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4, 0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F, + 0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B, 0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678, + 0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF, 0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651, + 0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0, 0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB, + 0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC, 0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453, + 0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3, 0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF, + 0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1, 0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2, + 0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7, 0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3, + 0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE, 0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248, + 0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072, 0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF, + 0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249, 0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4, + 0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB, 0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8, + 0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964, 0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6, + 0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1, 0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652, + 0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2, 0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D, + 0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0, 0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB, + 0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4, 0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5, + 0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3, 0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA, + 0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B, 0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D, + 0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D, 0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4, + 0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9, 0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5, + 0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC, 0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD, + 0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6, 0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569, + 0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5, 0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1, + 0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED, 0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969, + 0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365, 0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE, + 0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF, 0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A, + 0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F, 0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167, + 0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F, 0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177, + 0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6, 0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8, + 0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E, 0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153, + 0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1, 0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC, + 0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF, 0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242, + 0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149, 0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE, + 0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF, 0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE, + 0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2, 0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6, + 0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146, 0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148, + 0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1, 0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5, + 0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9, 0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD, + 0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1, 0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5, + 0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240, 0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB, + 0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF, 0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3, + 0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7, 0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB, + 0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340, 0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161, + 0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246, 0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0 +}; + +static const WCHAR oem2uni950[] = { /* Big5 --> Unicode pairs */ + 0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002, 0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A, + 0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026, 0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52, + 0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56, 0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31, + 0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34, 0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35, + 0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37, 0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39, + 0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B, 0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D, + 0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F, 0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41, + 0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43, 0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B, + 0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018, 0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D, + 0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03, 0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7, + 0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3, 0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605, + 0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0, 0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105, + 0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD, 0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E, + 0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60, 0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7, + 0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C, 0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267, + 0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261, 0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65, + 0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A, 0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF, + 0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E, 0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642, + 0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193, 0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197, + 0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223, 0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68, + 0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0, 0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103, + 0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B, 0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E, + 0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F, 0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B, + 0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163, 0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581, + 0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585, 0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F, + 0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B, 0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534, + 0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594, 0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C, + 0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D, 0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550, + 0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2, 0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571, + 0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11, 0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15, + 0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19, 0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163, + 0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167, 0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022, + 0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026, 0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341, + 0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22, 0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26, + 0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A, 0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E, + 0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32, 0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36, + 0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A, 0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44, + 0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48, 0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C, + 0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50, 0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54, + 0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58, 0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392, + 0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396, 0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A, + 0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E, 0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3, + 0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7, 0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2, + 0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6, 0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA, + 0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE, 0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3, + 0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7, 0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106, + 0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A, 0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E, + 0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112, 0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116, + 0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A, 0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E, + 0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122, 0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126, + 0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9, 0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB, + 0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01, 0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86, + 0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165, 0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201, + 0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C, 0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08, + 0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1, 0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E, + 0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203, 0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3, + 0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927, 0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53, + 0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38, 0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1, + 0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72, 0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D, + 0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D, 0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39, + 0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92, 0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0, + 0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD, 0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143, + 0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E, 0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206, + 0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE, 0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348, + 0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384, 0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC, + 0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D, 0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A, + 0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF, 0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208, + 0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F, 0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9, + 0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728, 0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB, + 0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34, 0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B, + 0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC, 0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15, + 0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D, 0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8, + 0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7, 0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE, + 0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A, 0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8, + 0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305, 0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF, + 0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360, 0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF, + 0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE, 0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8, + 0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA, 0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5, + 0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA, 0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974, + 0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C, 0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02, + 0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01, 0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A, + 0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251, 0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C, + 0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63, 0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38, + 0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF, 0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6, + 0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529, 0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533, + 0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF, 0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3, + 0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB, 0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53, + 0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6, 0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19, + 0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10, 0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6, + 0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD, 0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147, + 0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171, 0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211, + 0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3, 0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370, + 0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C, 0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B, + 0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408, 0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412, + 0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733, 0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C, + 0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A, 0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978, + 0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982, 0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87, + 0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA, 0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06, + 0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B, 0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C, + 0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B, 0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8, + 0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3, 0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731, + 0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B, 0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59, + 0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55, 0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E, + 0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E, 0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36, + 0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003, 0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F, + 0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3, 0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C, + 0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272, 0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C, + 0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32, 0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47, + 0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B, 0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51, + 0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43, 0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63, + 0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E, 0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48, + 0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D, 0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225, + 0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228, 0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC, + 0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D, 0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426, + 0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443, 0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B, + 0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B, 0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436, + 0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431, 0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA, + 0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A, 0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747, + 0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F, 0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D, + 0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3, 0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4, + 0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D, 0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C, + 0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40, 0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90, + 0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB, 0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A, + 0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64, 0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8, + 0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1, 0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212, + 0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296, 0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D, + 0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279, 0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298, + 0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291, 0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538, + 0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E, 0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C, + 0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746, 0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65, + 0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99, 0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85, + 0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90, 0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96, + 0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72, 0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76, + 0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82, 0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078, + 0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4, 0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B, + 0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF, 0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF, + 0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096, 0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B, + 0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292, 0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2, + 0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55, 0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3, + 0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0, 0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4, + 0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA, 0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6, + 0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631, 0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56, + 0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E, 0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D, + 0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C, 0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83, + 0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69, 0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F, + 0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152, 0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176, + 0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B, 0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230, + 0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE, 0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353, + 0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378, 0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7, + 0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478, 0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477, + 0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C, 0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C, + 0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B, 0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783, + 0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761, 0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C, + 0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944, 0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4, + 0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6, 0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3, + 0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2, 0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63, + 0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C, 0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48, + 0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1, 0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1, + 0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16, 0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78, + 0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95, 0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27, + 0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F, 0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD, + 0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014, 0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A, + 0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029, 0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215, + 0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F, 0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF, + 0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB, 0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB, + 0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC, 0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD, + 0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8, 0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC, + 0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC, 0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C, + 0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600, 0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607, + 0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B, 0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773, + 0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797, 0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789, + 0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A, 0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772, + 0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F, 0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8, + 0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5, 0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC, + 0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3, 0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1, + 0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1, 0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB, + 0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC, 0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E, + 0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C, 0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267, + 0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9, 0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8, + 0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D, 0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684, + 0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5, 0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941, + 0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79, 0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C, + 0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5, 0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB, + 0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF, 0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3, + 0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD, 0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC, + 0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3, 0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E, + 0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB, 0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5, + 0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7, 0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C, + 0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644, 0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752, + 0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE, 0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF, + 0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD, 0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF, + 0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0, 0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE, + 0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192, 0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243, + 0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B, 0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3, + 0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B, 0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0, + 0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8, 0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2, + 0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4, 0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1, + 0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF, 0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0, + 0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE, 0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F, + 0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8, 0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03, + 0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6, 0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3, + 0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5, 0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D, + 0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7, 0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D, + 0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08, 0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85, + 0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C, 0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020, + 0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D, 0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046, + 0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A, 0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316, + 0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301, 0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1, + 0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE, 0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F, + 0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2, 0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627, + 0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631, 0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3, + 0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC, 0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9, + 0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4, 0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF, + 0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9, 0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A, + 0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2, 0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B, + 0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25, 0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17, + 0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36, 0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27, + 0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35, 0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA, + 0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD, 0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230, + 0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9, 0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA, + 0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0, 0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F, + 0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB, 0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3, + 0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688, 0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5, + 0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709, 0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707, + 0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C, 0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948, + 0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1, 0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81, + 0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02, 0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07, + 0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E, 0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D, + 0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5, 0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC, + 0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE, 0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222, + 0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3, 0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5, + 0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7, 0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4, + 0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF, 0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679, + 0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B, 0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02, + 0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74, 0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC, + 0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA, 0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4, + 0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1, 0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD, + 0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C, 0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB, + 0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8, 0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999, + 0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D, 0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025, + 0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006, 0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012, + 0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014, 0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B, + 0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE, 0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B, + 0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5, 0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6, + 0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254, 0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F, + 0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8, 0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC, + 0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA, 0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1, + 0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6, 0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F, + 0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4, 0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F, + 0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11, 0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B, + 0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23, 0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09, + 0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3, 0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5, + 0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51, 0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD, + 0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0, 0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE, + 0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD, 0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91, + 0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065, 0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069, + 0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A, 0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085, + 0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308, 0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F, + 0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F, 0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D, + 0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D, 0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599, + 0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649, 0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C, + 0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714, 0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838, + 0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839, 0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3, + 0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D, 0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C, + 0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813, 0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89, + 0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28, 0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A, + 0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66, 0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93, + 0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A, 0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A, + 0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94, 0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9, + 0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279, 0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8, + 0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409, 0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE, + 0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A, 0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7, + 0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC, 0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B, + 0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE, 0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728, + 0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838, 0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825, + 0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832, 0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F, + 0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957, 0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7, + 0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8, 0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06, + 0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17, 0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22, + 0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A, 0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B, + 0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5, 0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015, + 0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F, 0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105, + 0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8, 0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A, + 0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC, 0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B, + 0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B, 0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338, + 0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334, 0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336, + 0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328, 0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA, + 0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C, 0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877, + 0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879, 0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C, + 0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13, 0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48, + 0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2, 0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4, + 0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006, 0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4, + 0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8, 0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2, + 0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8, 0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9, + 0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661, 0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658, + 0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC, 0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32, + 0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D, 0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C, + 0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076, 0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074, + 0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F, 0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0, + 0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9, 0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F, + 0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E, 0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A, + 0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561, 0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556, + 0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564, 0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C, + 0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557, 0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF, + 0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0, 0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835, + 0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962, 0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66, + 0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62, 0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70, + 0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2, 0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08, + 0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D, 0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B, + 0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29, 0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27, + 0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36, 0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8, + 0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35, 0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69, + 0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E, 0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C, + 0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0, 0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6, + 0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5, 0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5, + 0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA, 0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248, + 0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396, 0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367, + 0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9, 0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B, + 0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399, 0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F, + 0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368, 0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551, + 0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F, 0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C, + 0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB, 0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A, + 0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E, 0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881, + 0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5, 0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7, + 0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4, 0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894, + 0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1, 0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB, + 0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC, 0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1, + 0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA, 0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF, + 0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9, 0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5, + 0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA, 0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1, + 0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4, 0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6, + 0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD, 0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281, + 0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313, 0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A, + 0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D, 0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C, + 0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562, 0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5, + 0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E, 0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737, + 0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738, 0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E, + 0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB, 0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28, + 0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19, 0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97, + 0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71, 0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40, + 0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F, 0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D, + 0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE, 0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046, + 0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B, 0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202, + 0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239, 0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378, + 0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB, 0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389, + 0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C, 0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A, + 0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4, 0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1, + 0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E, 0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896, + 0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F, 0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25, + 0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B, 0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9, + 0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA, 0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE, + 0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019, 0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023, + 0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015, 0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022, + 0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8, 0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE, + 0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7, 0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A, + 0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670, 0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C, + 0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0, 0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A, + 0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5, 0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085, + 0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096, 0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1, + 0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269, 0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A, + 0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7, 0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598, + 0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594, 0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3, + 0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2, 0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1, + 0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599, 0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834, + 0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821, 0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA, + 0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F, 0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73, + 0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3, 0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31, + 0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47, 0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40, + 0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1, 0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D, + 0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1, 0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0, + 0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115, 0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168, + 0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109, 0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249, + 0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0, 0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD, + 0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1, 0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376, + 0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452, 0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566, + 0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590, 0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674, + 0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A, 0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF, + 0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5, 0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905, + 0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7, 0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3, + 0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912, 0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E, + 0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D, 0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF, + 0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F, 0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32, + 0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25, 0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58, + 0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D, 0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D, + 0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D, 0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19, + 0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72, 0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A, + 0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136, 0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284, + 0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334, 0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433, + 0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436, 0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426, + 0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B, 0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3, + 0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0, 0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693, + 0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED, 0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D, + 0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00, 0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5, + 0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46, 0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D, + 0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F, 0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68, + 0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72, 0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70, + 0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5, 0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155, + 0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E, 0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C, + 0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C, 0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D, + 0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1, 0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457, + 0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC, 0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438, + 0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407, 0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF, + 0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB, 0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857, + 0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983, 0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55, + 0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54, 0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34, + 0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61, 0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3, + 0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0, 0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF, + 0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81, 0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA, + 0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6, 0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C, + 0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038, 0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5, + 0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165, 0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223, + 0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210, 0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F, + 0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592, 0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B, + 0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D, 0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5, + 0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF, 0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806, + 0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF, 0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE, + 0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1, 0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2, + 0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC, 0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7, + 0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF, 0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3, + 0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3, 0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7, + 0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF, 0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6, + 0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713, 0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857, + 0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C, 0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852, + 0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9, 0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC, + 0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69, 0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9, + 0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC, 0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148, + 0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9, 0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C, + 0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134, 0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137, + 0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E, 0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D, + 0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414, 0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417, + 0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0, 0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688, + 0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D, 0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A, + 0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975, 0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968, + 0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979, 0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B, + 0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF, 0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF, + 0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90, 0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5, + 0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB, 0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4, + 0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4, 0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164, + 0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C, 0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E, + 0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A, 0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F, + 0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455, 0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F, + 0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576, 0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601, + 0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF, 0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF, + 0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E, 0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C, + 0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762, 0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897, + 0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C, 0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A, + 0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD, 0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14, + 0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0, 0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E, + 0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5, 0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81, + 0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69, 0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8, + 0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086, 0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178, + 0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B, 0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205, + 0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D, 0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B, + 0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C, 0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469, + 0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C, 0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708, + 0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB, 0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A, + 0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9, 0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1, + 0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C, 0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73, + 0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87, 0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71, + 0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E, 0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E, + 0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89, 0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4, + 0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5, 0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF, + 0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4, 0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09, + 0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2, 0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042, + 0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050, 0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D, + 0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112, 0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169, + 0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238, 0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B, + 0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234, 0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239, + 0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698, 0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB, + 0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB, 0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774, + 0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813, 0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC, + 0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3, 0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9, + 0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20, 0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6, + 0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF, 0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9, + 0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282, 0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600, + 0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614, 0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E, + 0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608, 0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716, + 0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893, 0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D, + 0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924, 0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6, + 0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8, 0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7, + 0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8, 0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D, + 0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B, 0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54, + 0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46, 0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F, + 0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163, 0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175, + 0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454, 0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A, + 0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D, 0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7, + 0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D, 0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1, + 0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B, 0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4, + 0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC, 0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49, + 0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14, 0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29, + 0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F, 0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF, + 0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32, 0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F, + 0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01, 0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194, + 0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184, 0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296, + 0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463, 0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504, + 0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B, 0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3, + 0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761, 0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3, + 0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F, 0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA, + 0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1, 0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97, + 0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8, 0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD, + 0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C, 0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA, + 0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA, 0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8, + 0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC, 0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF, + 0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150, 0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A, + 0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA, 0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B, + 0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4, 0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C, + 0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3, 0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA, + 0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722, 0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755, + 0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902, 0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD, + 0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6, 0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D, + 0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA, 0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91, + 0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D, 0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2, + 0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC, 0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13, + 0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C, 0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062, + 0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118, 0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177, + 0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285, 0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293, + 0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291, 0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3, + 0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C, 0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700, + 0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817, 0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903, + 0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1, 0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41, + 0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3, 0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104, + 0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9, 0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105, + 0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289, 0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2, + 0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632, 0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653, + 0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636, 0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F, + 0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE, 0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09, + 0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C, 0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9, + 0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D, 0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61, + 0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD, 0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71, + 0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167, 0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182, + 0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E, 0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E, + 0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194, 0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F, + 0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488, 0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493, + 0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE, 0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC, + 0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575, 0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB, + 0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F, 0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19, + 0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A, 0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED, + 0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4, 0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C, + 0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54, 0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78, + 0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70, 0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5, + 0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F, 0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256, + 0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469, 0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480, + 0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F, 0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622, + 0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E, 0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B, + 0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA, 0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0, + 0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D, 0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE, + 0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4, 0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0, + 0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4, 0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC, + 0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA, 0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9, + 0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77, 0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B, + 0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A, 0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A, + 0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513, 0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514, + 0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506, 0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760, + 0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759, 0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B, + 0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912, 0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC, + 0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95, 0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9, + 0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6, 0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB, + 0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0, 0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC, + 0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC, 0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F, + 0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D, 0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F, + 0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D, 0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26, + 0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25, 0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D, + 0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127, 0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B, + 0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7, 0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1, + 0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7, 0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1, + 0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709, 0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F, + 0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3, 0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918, + 0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB, 0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9, + 0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27, 0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F, + 0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9, 0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52, + 0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110, 0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD, + 0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659, 0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664, + 0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665, 0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662, + 0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7, 0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34, + 0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A, 0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A, + 0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA, 0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1, + 0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA, 0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD, + 0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE, 0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9, + 0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D, 0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B, + 0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62, 0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35, + 0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77, 0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1, + 0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7, 0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6, + 0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE, 0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8, + 0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9, 0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368, + 0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F, 0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D, + 0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7, 0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F, + 0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC, 0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E, + 0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA, 0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4, + 0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6, 0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11, + 0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E, 0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79, + 0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE, 0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8, + 0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259, 0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568, + 0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D, 0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F, + 0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861, 0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B, + 0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6, 0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00, + 0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE, 0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED, + 0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B, 0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44, + 0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39, 0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38, + 0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075, 0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C, + 0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320, 0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F, + 0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304, 0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321, + 0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB, 0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5, + 0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D, 0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C, + 0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838, 0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839, + 0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E, 0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED, + 0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC, 0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91, + 0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28, 0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4, + 0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F, 0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E, + 0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687, 0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1, + 0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24, 0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC, + 0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B, 0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2, + 0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232, 0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8, + 0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC, 0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582, + 0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80, 0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C, + 0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97, 0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE, + 0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1, 0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4, + 0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC, 0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE, + 0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE, 0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC, + 0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246, 0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0, + 0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642, 0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA, + 0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD, 0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4, + 0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA, 0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D, + 0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0, 0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2, + 0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E, 0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32, + 0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31, 0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39, + 0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F, 0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071, + 0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073, 0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2, + 0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9, 0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271, + 0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C, 0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B, + 0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667, 0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2, + 0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA, 0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936, + 0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC, 0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B, + 0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04, 0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73, + 0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8, 0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B, + 0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E, 0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F, + 0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082, 0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E, + 0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328, 0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B, + 0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B, 0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA, + 0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6, 0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C, + 0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846, 0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF, + 0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD, 0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF, + 0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB, 0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695, + 0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38, 0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4, + 0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA, 0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC, + 0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3, 0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE, + 0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF, 0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006, + 0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB, 0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377, + 0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515, 0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD, + 0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E, 0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60, + 0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27, 0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21, + 0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E, 0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59, + 0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077, 0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A, + 0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0, 0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9, + 0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2, 0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4, + 0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B, 0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63, + 0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55, 0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087, + 0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC, 0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396, + 0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC, 0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397, + 0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5, 0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB, + 0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6, 0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F, + 0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA, 0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E, + 0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03, 0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D, + 0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8, 0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60, + 0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133, 0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2, + 0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2, 0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500, + 0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5, 0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B, + 0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D, 0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D, + 0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A, 0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587, + 0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7, 0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69, + 0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D, 0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D, + 0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85, 0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8, + 0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA, 0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7, + 0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9, 0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956, + 0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58, 0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F, + 0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A, 0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76, + 0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54, 0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B, + 0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1, 0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC, + 0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD, 0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8, + 0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A, 0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB, + 0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC, 0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19, + 0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6, 0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72, + 0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97, 0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8, + 0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC, 0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D, + 0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA, 0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6, + 0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030, 0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF, + 0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A, 0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6, + 0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF, 0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C, + 0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA, 0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611, + 0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607, 0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964, + 0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C, 0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B, + 0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81, 0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB, + 0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1, 0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951, + 0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37, 0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79, + 0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F, 0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138, + 0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914, 0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE, + 0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9, 0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2, + 0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6, 0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50, + 0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617, 0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822, + 0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C, 0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D, + 0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B, 0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E, + 0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438, 0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738, + 0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867, 0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43, + 0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54, 0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF, + 0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D, 0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66, + 0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8, 0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4, + 0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524, 0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058, + 0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E, 0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F, + 0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972, 0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16, + 0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61, 0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452, + 0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1, 0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D, + 0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31, 0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7, + 0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94, 0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523, + 0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10, 0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63, + 0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94, 0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831, + 0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463, 0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F, + 0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57, 0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54, + 0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F, 0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C, + 0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7, 0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839, + 0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96, 0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A, + 0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6, 0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58, + 0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C, 0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72, + 0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C, 0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1, + 0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871, 0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC, + 0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477, 0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C, + 0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D, 0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78, + 0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A, 0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B, + 0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C, 0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07, + 0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7, 0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F, + 0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93, 0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198, + 0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720, 0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF, + 0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14, 0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8, + 0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD, 0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C, + 0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F, 0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B, + 0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80, 0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250, + 0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F, 0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A, + 0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E, 0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14, + 0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08, 0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22, + 0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12, 0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210, + 0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D, 0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF, + 0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C, 0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B, + 0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56, 0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A, + 0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75, 0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74, + 0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C, 0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266, + 0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A, 0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E, + 0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A, 0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18, + 0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F, 0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C, + 0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5, 0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75, + 0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280, 0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E, + 0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B, 0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620, + 0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62, 0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E, + 0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41, 0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F, + 0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C, 0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE, + 0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E, 0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A, + 0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C, 0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F, + 0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447, 0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741, + 0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B, 0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6, + 0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E, 0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7, + 0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28, 0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88, + 0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A, 0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0, + 0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89, 0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05, + 0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2, 0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8, + 0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4, 0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7, + 0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A, 0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F, + 0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B, 0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288, + 0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274, 0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3, + 0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747, 0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748, + 0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B, 0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78, + 0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B, 0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69, + 0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95, 0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65, + 0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A, 0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3, + 0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5, 0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394, + 0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594, 0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034, + 0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092, 0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285, + 0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A, 0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9, + 0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5, 0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630, + 0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33, 0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D, + 0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74, 0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C, + 0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79, 0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C, + 0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82, 0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E, + 0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232, 0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC, + 0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392, 0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481, + 0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B, 0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C, + 0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F, 0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463, + 0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9, 0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B, + 0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780, 0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774, + 0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C, 0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF, + 0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1, 0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6, + 0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8, 0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65, + 0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47, 0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5, + 0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F, 0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA, + 0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6, 0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14, + 0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23, 0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E, + 0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D, 0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B, + 0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033, 0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022, + 0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013, 0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C, + 0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4, 0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6, + 0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF, 0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8, + 0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609, 0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608, + 0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D, 0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610, + 0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C, 0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B, + 0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774, 0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F, + 0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D, 0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794, + 0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE, 0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB, + 0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4, 0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0, + 0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6, 0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD, + 0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80, 0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD, + 0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF, 0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098, + 0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084, 0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A, + 0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB, 0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2, + 0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1, 0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6, + 0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D, 0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540, + 0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF, 0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5, + 0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB, 0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F, + 0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB, 0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F, + 0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5, 0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0, + 0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B, 0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC, + 0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8, 0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4, + 0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670, 0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56, + 0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD, 0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2, + 0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0, 0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A, + 0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3, 0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1, + 0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB, 0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6, + 0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC, 0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2, + 0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396, 0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1, + 0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3, 0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6, + 0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0, 0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE, + 0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5, 0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C, + 0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794, 0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5, + 0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D, 0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE, + 0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA, 0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4, + 0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9, 0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE, + 0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C, 0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7, + 0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA, 0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6, + 0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8, 0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8, + 0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23, 0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4, + 0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5, 0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86, + 0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072, 0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047, + 0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040, 0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044, + 0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242, 0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B, + 0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB, 0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8, + 0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314, 0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0, + 0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF, 0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635, + 0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633, 0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634, + 0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710, 0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA, + 0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8, 0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB, + 0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD, 0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE, + 0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE, 0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC, + 0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE, 0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9, + 0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB, 0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6, + 0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20, 0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D, + 0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12, 0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04, + 0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11, 0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01, + 0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F, 0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C, + 0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10, 0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1, + 0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5, 0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A, + 0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E, 0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB, + 0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3, 0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8, + 0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5, 0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7, + 0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8, 0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E, + 0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA, 0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703, + 0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7, 0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8, + 0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805, 0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809, + 0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C, 0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5, + 0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE, 0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00, + 0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79, 0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03, + 0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91, 0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E, + 0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8, 0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8, + 0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3, 0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5, + 0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6, 0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294, + 0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307, 0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A, + 0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC, 0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C, + 0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA, 0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3, + 0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C, 0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867, + 0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04, 0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1, + 0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD, 0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE, + 0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4, 0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651, + 0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E, 0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022, + 0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4, 0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6, + 0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020, 0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031, + 0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193, 0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8, + 0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252, 0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262, + 0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526, 0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7, + 0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF, 0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511, + 0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB, 0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E, + 0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702, 0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2, + 0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC, 0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7, + 0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E, 0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D, + 0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17, 0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C, + 0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03, 0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF, + 0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00, 0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8, + 0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33, 0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A, + 0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088, 0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D, + 0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097, 0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219, + 0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356, 0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336, + 0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B, 0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341, + 0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359, 0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A, + 0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340, 0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6, + 0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A, 0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712, + 0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849, 0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B, + 0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C, 0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F, + 0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D, 0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828, + 0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825, 0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D, + 0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082, 0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8, + 0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25, 0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76, + 0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58, 0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91, + 0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86, 0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97, + 0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82, 0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B, + 0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16, 0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75, + 0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1, 0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2, + 0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0, 0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6, + 0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1, 0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276, + 0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE, 0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301, + 0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6, 0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9, + 0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4, 0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8, + 0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4, 0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F, + 0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4, 0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA, + 0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B, 0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723, + 0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A, 0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C, + 0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828, 0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829, + 0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954, 0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953, + 0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC, 0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA, + 0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86, 0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C, + 0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10, 0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F, + 0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09, 0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A, + 0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85, 0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E, + 0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F, 0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C, + 0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D, 0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3, + 0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E, 0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9, + 0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100, 0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333, + 0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351, 0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341, + 0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342, 0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308, + 0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324, 0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329, + 0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353, 0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327, + 0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2, 0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691, + 0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686, 0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5, + 0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695, 0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690, + 0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D, 0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880, + 0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883, 0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12, + 0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4, 0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5, + 0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3, 0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF, + 0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6, 0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA, + 0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8, 0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4, + 0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5, 0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F, + 0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F, 0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061, + 0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B, 0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D, + 0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062, 0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069, + 0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046, 0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057, + 0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D, 0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3, + 0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576, 0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534, + 0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536, 0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545, + 0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E, 0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B, + 0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707, 0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6, + 0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED, 0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B, + 0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE, 0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC, + 0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810, 0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1, + 0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804, 0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55, + 0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35, 0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65, + 0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57, 0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44, + 0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E, 0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70, + 0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56, 0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E, + 0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E, 0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20, + 0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26, 0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12, + 0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E, 0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9, + 0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38, 0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A, + 0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0, 0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF, + 0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8, 0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA, + 0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0, 0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382, + 0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD, 0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E, + 0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E, 0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D, + 0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B, 0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381, + 0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553, 0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B, + 0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718, 0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C, + 0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB, 0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC, + 0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2, 0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C, + 0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880, 0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896, + 0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4, 0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C, + 0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33, 0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F, + 0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A, 0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3, + 0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2, 0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00, + 0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6, 0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD, + 0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD, 0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5, + 0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0, 0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7, + 0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA, 0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4, + 0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3, 0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106, + 0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6, 0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E, + 0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D, 0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318, + 0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F, 0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8, + 0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD, 0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC, + 0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4, 0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE, + 0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC, 0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689, + 0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D, 0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733, + 0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735, 0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D, + 0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845, 0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969, + 0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961, 0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6, + 0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90, 0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25, + 0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33, 0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31, + 0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32, 0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94, + 0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35, 0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A, + 0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41, 0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A, + 0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95, 0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA, + 0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1, 0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F, + 0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043, 0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119, + 0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C, 0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127, + 0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238, 0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232, + 0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8, 0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4, + 0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395, 0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9, + 0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D, 0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E, + 0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397, 0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387, + 0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659, 0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2, + 0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0, 0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8, + 0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC, 0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852, + 0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2, 0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1, + 0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899, 0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC, + 0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982, 0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30, + 0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39, 0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D, + 0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79, 0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF, + 0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD, 0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1, + 0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C, 0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA, + 0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3, 0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9, + 0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153, 0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1, + 0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9, 0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8, + 0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588, 0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671, + 0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804, 0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095, + 0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3, 0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D, + 0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082, 0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312, + 0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591, 0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577, + 0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588, 0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3, + 0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C, 0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1, + 0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837, 0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823, + 0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825, 0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F, + 0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838, 0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961, + 0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A, 0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6, + 0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95, 0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A, + 0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9, 0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C, + 0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA, 0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1, + 0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30, 0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41, + 0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51, 0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A, + 0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59, 0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38, + 0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40, 0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58, + 0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9, 0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE, + 0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A, 0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113, + 0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1, 0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110, + 0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A, 0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE, + 0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3, 0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0, + 0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5, 0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD, + 0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3, 0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB, + 0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9, 0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564, + 0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C, 0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0, + 0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B, 0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A, + 0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3, 0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC, + 0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6, 0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6, + 0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1, 0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970, + 0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6, 0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD, + 0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A, 0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD, + 0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1, 0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915, + 0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B, 0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97, + 0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0, 0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC, + 0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49, 0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45, + 0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41, 0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33, + 0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B, 0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68, + 0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28, 0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39, + 0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65, 0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77, + 0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66, 0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120, + 0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E, 0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122, + 0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A, 0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288, + 0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B, 0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322, + 0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332, 0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335, + 0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430, 0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421, + 0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423, 0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432, + 0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C, 0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6, + 0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7, 0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746, + 0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745, 0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C, + 0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864, 0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871, + 0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869, 0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974, + 0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02, 0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04, + 0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A, 0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C, + 0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45, 0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1, + 0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53, 0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F, + 0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52, 0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F, + 0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65, 0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1, + 0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050, 0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A, + 0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D, 0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE, + 0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204, 0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275, + 0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423, 0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7, + 0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410, 0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3, + 0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5, 0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB, + 0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9, 0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411, + 0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5, 0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA, + 0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE, 0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2, + 0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8, 0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3, + 0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB, 0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7, + 0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856, 0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9, + 0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6, 0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2, + 0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998, 0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB, + 0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59, 0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44, + 0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51, 0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F, + 0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE, 0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84, + 0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3, 0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC, + 0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8, 0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7, + 0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE, 0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8, + 0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC, 0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034, + 0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104, 0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9, + 0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107, 0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164, + 0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201, 0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A, + 0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200, 0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206, + 0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C, 0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205, + 0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C, 0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688, + 0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2, 0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0, + 0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807, 0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9, + 0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD, 0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4, + 0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2, 0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1, + 0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8, 0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B, + 0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC, 0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD, + 0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9, 0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF, + 0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8, 0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2, + 0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864, 0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F, + 0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859, 0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863, + 0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4, 0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1, + 0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8, 0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0, + 0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD, 0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8, + 0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71, 0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72, + 0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67, 0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E, + 0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5, 0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7, + 0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7, 0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145, + 0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146, 0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140, + 0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225, 0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB, + 0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420, 0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F, + 0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437, 0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426, + 0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435, 0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440, + 0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7, 0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E, + 0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686, 0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B, + 0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678, 0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938, + 0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F, 0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942, + 0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948, 0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933, + 0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978, 0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F, + 0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941, 0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B, + 0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951, 0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B, + 0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43, 0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B, + 0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9, 0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6, + 0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F, 0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1, + 0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD, 0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7, + 0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF, 0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC, + 0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E, 0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF, + 0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97, 0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154, + 0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141, 0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178, + 0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158, 0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F, + 0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D, 0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C, + 0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C, 0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340, + 0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A, 0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457, + 0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E, 0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454, + 0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD, 0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983, + 0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7, 0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8, + 0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED, 0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5, + 0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760, 0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769, + 0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D, 0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894, + 0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885, 0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879, + 0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B, 0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979, + 0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12, 0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13, + 0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2, 0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64, + 0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72, 0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70, + 0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63, 0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88, + 0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F, 0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B, + 0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94, 0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D, + 0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C, 0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB, + 0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160, 0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B, + 0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E, 0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144, + 0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244, 0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1, + 0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479, 0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451, + 0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430, 0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459, + 0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507, 0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434, + 0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432, 0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B, + 0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F, 0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C, + 0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E, 0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433, + 0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B, 0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450, + 0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C, 0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D, + 0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701, 0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6, + 0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE, 0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0, + 0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5, 0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2, + 0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86, 0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77, + 0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83, 0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C, + 0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64, 0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85, + 0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91, 0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D, + 0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92, 0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1, + 0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3, 0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB, + 0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01, 0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08, + 0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F, 0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110, + 0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116, 0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E, + 0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230, 0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265, + 0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A, 0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F, + 0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236, 0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254, + 0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E, 0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232, + 0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B, 0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697, + 0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8, 0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778, + 0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E, 0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF, + 0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD, 0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED, + 0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6, 0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3, + 0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4, 0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF, + 0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280, 0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330, + 0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C, 0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C, + 0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA, 0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9, + 0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898, 0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874, + 0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891, 0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888, + 0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE, 0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5, + 0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED, 0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0, + 0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD, 0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77, + 0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82, 0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A, + 0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89, 0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D, + 0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59, 0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7, + 0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9, 0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43, + 0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128, 0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173, + 0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C, 0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A, + 0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A, 0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227, + 0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B, 0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472, + 0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466, 0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E, + 0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460, 0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C, + 0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477, 0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0, + 0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722, 0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0, + 0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC, 0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E, + 0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE, 0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD, + 0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA, 0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993, + 0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9, 0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5, + 0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D, 0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0, + 0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE, 0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25, + 0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E, 0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A, + 0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12, 0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73, + 0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40, 0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB, + 0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05, 0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C, + 0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D, 0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187, + 0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185, 0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186, + 0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253, 0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343, + 0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462, 0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472, + 0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502, 0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616, + 0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611, 0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781, + 0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E, 0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783, + 0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD, 0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E, + 0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2, 0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B, + 0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993, 0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990, + 0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F, 0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB, + 0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C, 0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96, + 0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E, 0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99, + 0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF, 0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7, + 0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1, 0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE, + 0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC, 0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC, + 0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9, 0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2, + 0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024, 0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186, + 0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C, 0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4, + 0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE, 0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB, + 0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD, 0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0, + 0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2, 0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B, + 0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6, 0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0, + 0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB, 0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733, + 0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740, 0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719, + 0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741, 0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732, + 0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712, 0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742, + 0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724, 0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7, + 0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA, 0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6, + 0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB, 0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E, + 0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB, 0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F, + 0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69, 0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96, + 0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D, 0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07, + 0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00, 0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E, + 0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120, 0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A, + 0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A, 0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5, + 0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A, 0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D, + 0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279, 0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE, + 0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2, 0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A, + 0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7, 0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D, + 0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1, 0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A, + 0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782, 0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F, + 0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD, 0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907, + 0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9, 0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD, + 0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7, 0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61, + 0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5, 0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130, + 0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6, 0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD, + 0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1, 0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C, + 0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649, 0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640, + 0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E, 0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A, + 0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0, 0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5, + 0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4, 0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03, + 0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01, 0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67, + 0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92, 0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0, + 0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E, 0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C, + 0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1, 0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183, + 0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2, 0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF, + 0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA, 0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3, + 0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496, 0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C, + 0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C, 0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1, + 0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579, 0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5, + 0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7, 0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06, + 0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15, 0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF, + 0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D, 0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE, + 0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40, 0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D, + 0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04, 0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6, + 0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16, 0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2, + 0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF, 0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E, + 0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D, 0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F, + 0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76, 0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72, + 0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94, 0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61, + 0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90, 0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F, + 0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A, 0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B, + 0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9, 0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E, + 0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C, 0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A, + 0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F, 0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361, + 0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487, 0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481, + 0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C, 0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E, + 0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D, 0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628, + 0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E, 0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789, + 0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF, 0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4, + 0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9, 0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C, + 0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39, 0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7, + 0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE, 0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5, + 0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB, 0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7, + 0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA, 0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0, + 0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC, 0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB, + 0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8, 0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F, + 0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199, 0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253, + 0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251, 0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500, + 0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D, 0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C, + 0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508, 0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2, + 0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3, 0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9, + 0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D, 0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E, + 0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7, 0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9, + 0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B, 0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756, + 0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1, 0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B, + 0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751, 0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750, + 0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F, 0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C, + 0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775, 0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A, + 0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B, 0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906, + 0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909, 0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED, + 0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6, 0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4, + 0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE, 0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3, + 0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E, 0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF, + 0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD, 0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1, + 0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25, 0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B, + 0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26, 0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18, + 0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A, 0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A, + 0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17, 0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067, + 0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129, 0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E, + 0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181, 0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0, + 0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9, 0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF, + 0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD, 0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8, + 0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6, 0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0, + 0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3, 0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4, + 0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE, 0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3, + 0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A, 0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0, + 0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826, 0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B, + 0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA, 0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917, + 0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF, 0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9, + 0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7, 0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB, + 0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46, 0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71, + 0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70, 0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC, + 0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7, 0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB, + 0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83, 0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C, + 0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111, 0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670, + 0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666, 0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E, + 0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8, 0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA, + 0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17, 0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14, + 0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28, 0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF, + 0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7, 0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA, + 0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF, 0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66, + 0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6, 0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC, + 0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5, 0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC, + 0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C, 0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF, + 0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3, 0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533, + 0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8, 0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB, + 0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA, 0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66, + 0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68, 0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76, + 0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A, 0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A, + 0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54, 0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C, + 0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D, 0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54, + 0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB, 0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03, + 0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3, 0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8, + 0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E, 0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5, + 0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA, 0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2, + 0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF, 0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2, + 0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0, 0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA, + 0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8, 0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB, + 0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366, 0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B, + 0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0, 0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1, + 0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D, 0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C, + 0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB, 0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1, + 0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3, 0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD, + 0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE, 0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2, + 0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4, 0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6, + 0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7, 0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD, + 0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8, 0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2, + 0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF, 0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0, + 0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17, 0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13, + 0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A, 0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16, + 0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24, 0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A, + 0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029, 0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE, + 0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0, 0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7, + 0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256, 0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B, + 0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558, 0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541, + 0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547, 0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571, + 0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555, 0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566, + 0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C, 0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B, + 0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792, 0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798, + 0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785, 0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784, + 0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789, 0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D, + 0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922, 0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C, + 0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2, 0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD, + 0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0, 0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8, + 0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91, 0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE, + 0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C, 0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33, + 0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45, 0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41, + 0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36, 0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39, + 0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079, 0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133, + 0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190, 0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327, + 0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306, 0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C, + 0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301, 0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D, + 0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325, 0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334, + 0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329, 0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314, + 0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309, 0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC, + 0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA, 0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD, + 0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712, 0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794, + 0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F, 0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927, + 0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC, 0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3, + 0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9, 0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6, + 0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33, 0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C, + 0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93, 0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95, + 0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17, 0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29, + 0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10, 0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86, + 0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5, 0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D, + 0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124, 0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693, + 0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684, 0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F, + 0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF, 0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32, + 0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26, 0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1, + 0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A, 0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5, + 0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5, 0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF, + 0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4, 0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6, + 0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96, 0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F, + 0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87, 0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83, + 0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F, 0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C, + 0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09, 0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4, + 0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7, 0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD, + 0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1, 0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0, + 0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F, 0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490, + 0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5, 0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512, + 0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648, 0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9, + 0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7, 0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8, + 0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902, 0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905, + 0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB, 0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56, + 0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE, 0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F, + 0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB, 0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3, + 0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01, 0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0, + 0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8, 0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33, + 0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49, 0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C, + 0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44, 0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E, + 0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C, 0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA, + 0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9, 0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583, + 0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595, 0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B, + 0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577, 0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A, + 0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596, 0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D, + 0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588, 0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598, + 0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE, 0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0, + 0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC, 0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2, + 0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4, 0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF, + 0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2, 0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E, + 0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942, 0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2, + 0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16, 0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22, + 0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07, 0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C, + 0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70, 0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95, + 0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E, 0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C, + 0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085, 0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2, + 0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1, 0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383, + 0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347, 0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376, + 0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360, 0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A, + 0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352, 0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B, + 0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367, 0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7, + 0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5, 0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC, + 0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D, 0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C, + 0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4, 0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A, + 0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925, 0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933, + 0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931, 0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1, + 0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7, 0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB, + 0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03, 0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01, + 0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8, 0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1, + 0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2, 0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41, + 0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F, 0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45, + 0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37, 0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D, + 0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0, 0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF, + 0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54, 0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E, + 0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A, 0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C, + 0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D, 0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED, + 0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0, 0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF, + 0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501, 0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB, + 0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5, 0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6, + 0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7, 0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9, + 0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D, 0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E, + 0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026, 0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201, + 0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD, 0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5, + 0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB, 0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C, + 0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653, 0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD, + 0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF, 0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909, + 0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD, 0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29, + 0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D, 0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22, + 0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50, 0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62, + 0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57, 0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7, + 0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2, 0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4, + 0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2, 0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7, + 0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE, 0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6, + 0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7, 0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6, + 0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA, 0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4, + 0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED, 0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7, + 0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8, 0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F, + 0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951, 0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23, + 0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47, 0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31, + 0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36, 0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D, + 0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99, 0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04, + 0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62, 0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E, + 0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A, 0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54, + 0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B, 0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E, + 0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF, 0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392, + 0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389, 0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E, + 0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399, 0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391, + 0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4, 0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3, + 0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA, 0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD, + 0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC, 0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4, + 0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7, 0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA, + 0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8, 0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F, + 0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04, 0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07, + 0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08, 0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35, + 0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7, 0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1, + 0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6, 0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C, + 0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B, 0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C, + 0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F, 0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C, + 0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16, 0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29, + 0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134, 0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4, + 0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7, 0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD, + 0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E, 0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF, + 0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D, 0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584, + 0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7, 0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9, + 0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0, 0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE, + 0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019, 0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B, + 0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029, 0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A, + 0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202, 0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4, + 0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5, 0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660, + 0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1, 0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C, + 0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67, 0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39, + 0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA, 0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70, + 0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72, 0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A, + 0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD, 0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5, + 0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB, 0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1, + 0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC, 0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF, + 0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0, 0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2, + 0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6, 0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B, + 0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF, 0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A, + 0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C, 0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988, + 0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50, 0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53, + 0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55, 0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57, + 0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A, 0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC, + 0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D, 0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F, + 0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51, 0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4, + 0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD, 0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2, + 0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC, 0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6, + 0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3, 0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0, + 0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA, 0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B, + 0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3, 0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE, + 0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D, 0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB, + 0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943, 0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15, + 0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B, 0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23, + 0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2, 0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C, + 0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0, 0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2, + 0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC, 0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5, + 0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81, 0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71, + 0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B, 0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74, + 0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85, 0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F, + 0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68, 0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC, + 0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D, 0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337, + 0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3, 0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE, + 0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9, 0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513, + 0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4, 0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8, + 0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF, 0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037, + 0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038, 0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040, + 0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213, 0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C, + 0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE, 0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF, + 0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923, 0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929, + 0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D, 0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A, + 0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B, 0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA, + 0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9, 0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622, + 0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B, 0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609, + 0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819, 0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813, + 0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9, 0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D, + 0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67, 0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88, + 0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57, 0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D, + 0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5, 0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413, + 0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414, 0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428, + 0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400, 0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416, + 0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8, 0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C, + 0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE, 0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F, + 0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE, 0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F, + 0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E, 0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953, + 0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C, 0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E, + 0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA, 0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11, + 0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05, 0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07, + 0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14, 0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4, + 0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90, 0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C, + 0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A, 0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3, + 0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6, 0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A, + 0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6, 0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60, + 0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91, 0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297, + 0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48, 0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1, + 0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC, 0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043, + 0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049, 0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A, + 0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A, 0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F, + 0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A, 0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86, + 0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030, 0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626, + 0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619, 0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620, + 0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829, 0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824, + 0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D, 0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA, + 0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A, 0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF, + 0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B, 0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145, + 0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436, 0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430, + 0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C, 0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4, + 0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF, 0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6, + 0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39, 0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42, + 0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD, 0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16, + 0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D, 0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28, + 0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7, 0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7, + 0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5, 0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE, + 0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8, 0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3, + 0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C, 0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B, + 0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E, 0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9, + 0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971, 0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1, + 0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526, 0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09, + 0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057, 0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9, + 0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9, 0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935, + 0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57, 0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A, + 0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F, 0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634, + 0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632, 0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826, + 0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF, 0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84, + 0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F, 0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A, + 0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97, 0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C, + 0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F, 0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449, + 0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A, 0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B, + 0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C, 0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49, + 0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19, 0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55, + 0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44, 0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C, + 0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D, 0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE, + 0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC, 0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9, + 0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5, 0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35, + 0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B, 0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299, + 0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D, 0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201, + 0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525, 0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12, + 0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A, 0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383, + 0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66, 0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640, + 0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B, 0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E, + 0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973, 0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B, + 0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98, 0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462, + 0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E, 0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56, + 0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20, 0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A, + 0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59, 0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7, + 0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8, 0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE, + 0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2, 0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8, + 0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2, 0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38, + 0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F, 0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F, + 0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D, 0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13, + 0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060, 0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5, + 0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A, 0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643, + 0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B, 0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F, + 0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD, 0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469, + 0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747, 0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5, + 0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66, 0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02, + 0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06, 0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09, + 0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0, 0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75, + 0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8, 0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A, + 0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8, 0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B, + 0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B, 0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646, + 0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A, 0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98, + 0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3, 0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471, + 0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F, 0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B, + 0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12, 0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09, + 0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A, 0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F, + 0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3, 0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475, + 0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71, 0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6, + 0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065, 0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D, + 0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9, 0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874, + 0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64, 0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15, + 0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E, 0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482, + 0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68, 0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B, + 0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7, 0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D, + 0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E, 0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9, + 0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7, 0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557, + 0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A, 0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564, + 0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561, 0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553, + 0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B, 0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C, + 0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E, 0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 437 || FF_CODE_PAGE == 0 +static const WCHAR uc437[] = { /* CP437(U.S.) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 720 || FF_CODE_PAGE == 0 +static const WCHAR uc720[] = { /* CP720(Arabic) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 737 || FF_CODE_PAGE == 0 +static const WCHAR uc737[] = { /* CP737(Greek) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 771 || FF_CODE_PAGE == 0 +static const WCHAR uc771[] = { /* CP771(KBL) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 775 || FF_CODE_PAGE == 0 +static const WCHAR uc775[] = { /* CP775(Baltic) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 850 || FF_CODE_PAGE == 0 +static const WCHAR uc850[] = { /* CP850(Latin 1) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 852 || FF_CODE_PAGE == 0 +static const WCHAR uc852[] = { /* CP852(Latin 2) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 855 || FF_CODE_PAGE == 0 +static const WCHAR uc855[] = { /* CP855(Cyrillic) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 857 || FF_CODE_PAGE == 0 +static const WCHAR uc857[] = { /* CP857(Turkish) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 860 || FF_CODE_PAGE == 0 +static const WCHAR uc860[] = { /* CP860(Portuguese) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, + 0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 861 || FF_CODE_PAGE == 0 +static const WCHAR uc861[] = { /* CP861(Icelandic) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 862 || FF_CODE_PAGE == 0 +static const WCHAR uc862[] = { /* CP862(Hebrew) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 863 || FF_CODE_PAGE == 0 +static const WCHAR uc863[] = { /* CP863(Canadian French) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, + 0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, + 0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 864 || FF_CODE_PAGE == 0 +static const WCHAR uc864[] = { /* CP864(Arabic) to Unicode conversion table */ + 0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, + 0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, + 0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, + 0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, + 0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, + 0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, + 0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000 +}; +#endif +#if FF_CODE_PAGE == 865 || FF_CODE_PAGE == 0 +static const WCHAR uc865[] = { /* CP865(Nordic) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 866 || FF_CODE_PAGE == 0 +static const WCHAR uc866[] = { /* CP866(Russian) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 869 || FF_CODE_PAGE == 0 +static const WCHAR uc869[] = { /* CP869(Greek 2) to Unicode conversion table */ + 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, + 0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, + 0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, + 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, + 0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 +}; +#endif + + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for static code page configuration */ +/* SBCS fixed code page */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE != 0 && FF_CODE_PAGE < 900 +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + WCHAR c = 0; + const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000 && cp == FF_CODE_PAGE) { /* Is it in BMP and valid code page? */ + for (c = 0; c < 0x80 && uni != p[c]; c++) ; + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + +WCHAR ff_oem2uni ( /* Returns Unicode character in UTF-16, zero on error */ + WCHAR oem, /* OEM code to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + WCHAR c = 0; + const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + if (cp == FF_CODE_PAGE) { /* Is it a valid code page? */ + if (oem < 0x100) c = p[oem - 0x80]; + } + } + + return c; +} + +#endif + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for static code page configuration */ +/* DBCS fixed code page */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE >= 900 +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0, uc; + UINT i = 0, n, li, hi; + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000 && cp == FF_CODE_PAGE) { /* Is it in BMP and valid code page? */ + uc = (WCHAR)uni; + p = CVTBL(uni2oem, FF_CODE_PAGE); + hi = sizeof CVTBL(uni2oem, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (uc == p[i * 2]) break; + if (uc > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + + return c; +} + + +WCHAR ff_oem2uni ( /* Returns Unicode character in UTF-16, zero on error */ + WCHAR oem, /* OEM code to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0; + UINT i = 0, n, li, hi; + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + if (cp == FF_CODE_PAGE) { /* Is it valid code page? */ + p = CVTBL(oem2uni, FF_CODE_PAGE); + hi = sizeof CVTBL(oem2uni, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (oem == p[i * 2]) break; + if (oem > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + + return c; +} +#endif + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for dynamic code page configuration */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE == 0 + +static const WORD cp_code[] = { 437, 720, 737, 771, 775, 850, 852, 855, 857, 860, 861, 862, 863, 864, 865, 866, 869, 0}; +static const WCHAR* const cp_table[] = {uc437, uc720, uc737, uc771, uc775, uc850, uc852, uc855, uc857, uc860, uc861, uc862, uc863, uc864, uc865, uc866, uc869, 0}; + + +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0, uc; + UINT i, n, li, hi; + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000) { /* Is it in BMP? */ + uc = (WCHAR)uni; + p = 0; + if (cp < 900) { /* SBCS */ + for (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ; /* Get conversion table */ + p = cp_table[i]; + if (p) { /* Is it valid code page ? */ + for (c = 0; c < 0x80 && uc != p[c]; c++) ; /* Find OEM code in the table */ + c = (c + 0x80) & 0xFF; + } + } else { /* DBCS */ + switch (cp) { /* Get conversion table */ + case 932 : p = uni2oem932; hi = sizeof uni2oem932 / 4 - 1; break; + case 936 : p = uni2oem936; hi = sizeof uni2oem936 / 4 - 1; break; + case 949 : p = uni2oem949; hi = sizeof uni2oem949 / 4 - 1; break; + case 950 : p = uni2oem950; hi = sizeof uni2oem950 / 4 - 1; break; + } + if (p) { /* Is it valid code page? */ + li = 0; + for (n = 16; n; n--) { /* Find OEM code */ + i = li + (hi - li) / 2; + if (uc == p[i * 2]) break; + if (uc > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + } + } + + return c; +} + + +WCHAR ff_oem2uni ( /* Returns Unicode character in UTF-16, zero on error */ + WCHAR oem, /* OEM code to be converted (DBC if >=0x100) */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0; + UINT i, n, li, hi; + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + p = 0; + if (cp < 900) { /* SBCS */ + for (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ; /* Get table */ + p = cp_table[i]; + if (p) { /* Is it a valid CP ? */ + if (oem < 0x100) c = p[oem - 0x80]; + } + } else { /* DBCS */ + switch (cp) { + case 932 : p = oem2uni932; hi = sizeof oem2uni932 / 4 - 1; break; + case 936 : p = oem2uni936; hi = sizeof oem2uni936 / 4 - 1; break; + case 949 : p = oem2uni949; hi = sizeof oem2uni949 / 4 - 1; break; + case 950 : p = oem2uni950; hi = sizeof oem2uni950 / 4 - 1; break; + } + if (p) { + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (oem == p[i * 2]) break; + if (oem > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + } + + return c; +} +#endif + + + +/*------------------------------------------------------------------------*/ +/* Unicode up-case conversion */ +/*------------------------------------------------------------------------*/ + +DWORD ff_wtoupper ( /* Returns up-converted code point */ + DWORD uni /* Unicode code point to be up-converted */ +) +{ + const WORD *p; + WORD uc, bc, nc, cmd; + static const WORD cvt1[] = { /* Compressed up conversion table for U+0000 - U+0FFF */ + /* Basic Latin */ + 0x0061,0x031A, + /* Latin-1 Supplement */ + 0x00E0,0x0317, + 0x00F8,0x0307, + 0x00FF,0x0001,0x0178, + /* Latin Extended-A */ + 0x0100,0x0130, + 0x0132,0x0106, + 0x0139,0x0110, + 0x014A,0x012E, + 0x0179,0x0106, + /* Latin Extended-B */ + 0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, + 0x01CD,0x0110, + 0x01DD,0x0001,0x018E, + 0x01DE,0x0112, + 0x01F3,0x0003,0x01F1,0x01F4,0x01F4, + 0x01F8,0x0128, + 0x0222,0x0112, + 0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241, + 0x0246,0x010A, + /* IPA Extensions */ + 0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, + /* Greek, Coptic */ + 0x037B,0x0003,0x03FD,0x03FE,0x03FF, + 0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A, + 0x03B1,0x0311, + 0x03C2,0x0002,0x03A3,0x03A3, + 0x03C4,0x0308, + 0x03CC,0x0003,0x038C,0x038E,0x038F, + 0x03D8,0x0118, + 0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, + /* Cyrillic */ + 0x0430,0x0320, + 0x0450,0x0710, + 0x0460,0x0122, + 0x048A,0x0136, + 0x04C1,0x010E, + 0x04CF,0x0001,0x04C0, + 0x04D0,0x0144, + /* Armenian */ + 0x0561,0x0426, + + 0x0000 /* EOT */ + }; + static const WORD cvt2[] = { /* Compressed up conversion table for U+1000 - U+FFFF */ + /* Phonetic Extensions */ + 0x1D7D,0x0001,0x2C63, + /* Latin Extended Additional */ + 0x1E00,0x0196, + 0x1EA0,0x015A, + /* Greek Extended */ + 0x1F00,0x0608, + 0x1F10,0x0606, + 0x1F20,0x0608, + 0x1F30,0x0608, + 0x1F40,0x0606, + 0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F, + 0x1F60,0x0608, + 0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, + 0x1F80,0x0608, + 0x1F90,0x0608, + 0x1FA0,0x0608, + 0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, + 0x1FCC,0x0001,0x1FC3, + 0x1FD0,0x0602, + 0x1FE0,0x0602, + 0x1FE5,0x0001,0x1FEC, + 0x1FF3,0x0001,0x1FFC, + /* Letterlike Symbols */ + 0x214E,0x0001,0x2132, + /* Number forms */ + 0x2170,0x0210, + 0x2184,0x0001,0x2183, + /* Enclosed Alphanumerics */ + 0x24D0,0x051A, + 0x2C30,0x042F, + /* Latin Extended-C */ + 0x2C60,0x0102, + 0x2C67,0x0106, 0x2C75,0x0102, + /* Coptic */ + 0x2C80,0x0164, + /* Georgian Supplement */ + 0x2D00,0x0826, + /* Full-width */ + 0xFF41,0x031A, + + 0x0000 /* EOT */ + }; + + + if (uni < 0x10000) { /* Is it in BMP? */ + uc = (WORD)uni; + p = uc < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get the block base */ + if (bc == 0 || uc < bc) break; /* Not matched? */ + nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ + if (uc < bc + nc) { /* In the block? */ + switch (cmd) { + case 0: uc = p[uc - bc]; break; /* Table conversion */ + case 1: uc -= (uc - bc) & 1; break; /* Case pairs */ + case 2: uc -= 16; break; /* Shift -16 */ + case 3: uc -= 32; break; /* Shift -32 */ + case 4: uc -= 48; break; /* Shift -48 */ + case 5: uc -= 26; break; /* Shift -26 */ + case 6: uc += 8; break; /* Shift +8 */ + case 7: uc -= 80; break; /* Shift -80 */ + case 8: uc -= 0x1C60; break; /* Shift -0x1C60 */ + } + break; + } + if (cmd == 0) p += nc; /* Skip table if needed */ + } + uni = uc; + } + + return uni; +} + + +#endif /* #if FF_USE_LFN */ diff --git a/src/lib/CherryUSB/third_party/fatfs-0.14/source/port/fatfs_usbd.c b/src/lib/CherryUSB/third_party/fatfs-0.14/source/port/fatfs_usbd.c new file mode 100644 index 000000000..e34e7405f --- /dev/null +++ b/src/lib/CherryUSB/third_party/fatfs-0.14/source/port/fatfs_usbd.c @@ -0,0 +1,60 @@ +#include "diskio.h" +#include "string.h" +#include "hal_flash.h" + +#define FLASH_START_ADDR 0x00040000 /*addr start from 256k */ +#define FLASH_BLOCK_SIZE 4096 +#define FLASH_BLOCK_COUNT 64 + +extern const char *FR_Table[]; + +int USB_disk_status(void) +{ + return 0; +} +int USB_disk_initialize(void) +{ + return RES_OK; +} +int USB_disk_read(BYTE *buff, LBA_t sector, UINT count) +{ + flash_read(FLASH_START_ADDR + sector * FLASH_BLOCK_SIZE, (uint8_t *)buff, count * FLASH_BLOCK_SIZE); + return 0; +} +int USB_disk_write(const BYTE *buff, LBA_t sector, UINT count) +{ + flash_erase(FLASH_START_ADDR + sector * FLASH_BLOCK_SIZE, 4096); + flash_write(FLASH_START_ADDR + sector * FLASH_BLOCK_SIZE, (uint8_t *)buff, count * FLASH_BLOCK_SIZE); + return 0; +} +int USB_disk_ioctl(BYTE cmd, void *buff) +{ + int result = 0; + + switch (cmd) { + case CTRL_SYNC: + result = RES_OK; + break; + + case GET_SECTOR_SIZE: + *(WORD *)buff = FLASH_BLOCK_SIZE; + result = RES_OK; + break; + + case GET_BLOCK_SIZE: + *(DWORD *)buff = 1; + result = RES_OK; + break; + + case GET_SECTOR_COUNT: + *(DWORD *)buff = FLASH_BLOCK_COUNT; + result = RES_OK; + break; + + default: + result = RES_PARERR; + break; + } + + return result; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/lwip-2.1.2/.gitkeep b/src/lib/CherryUSB/third_party/lwip-2.1.2/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/README.md b/src/lib/CherryUSB/third_party/nimble-1.6.0/README.md new file mode 100644 index 000000000..5e432e6a7 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/README.md @@ -0,0 +1,169 @@ +## Note + +当前支持 nimble 主线 1.6.0 版本,**禁止使用其余软件包或者第三方包** + + + +- ble_hs_startup_set_evmask_tx 函数中 BLE_HCI_OCF_CB_SET_EVENT_MASK2 功能需要关闭 + +``` + // if (version >= BLE_HCI_VER_BCS_4_1) { + // /** + // * Enable the following events: + // * 0x0000000000800000 Authenticated Payload Timeout Event + // */ + // cmd2.event_mask2 = htole64(0x0000000000800000); + // rc = ble_hs_hci_cmd_tx(BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, + // BLE_HCI_OCF_CB_SET_EVENT_MASK2), + // &cmd2, sizeof(cmd2), NULL, 0); + // if (rc != 0) { + // return rc; + // } + // } + +``` + +- 主线中头文件和源文件参与编译例子 + +``` +源文件 + +nimble/host/src/ble_att_clt.c +nimble/host/src/ble_att_cmd.c +nimble/host/src/ble_att_svr.c +nimble/host/src/ble_att.c +nimble/host/src/ble_audio_broadcast.c +nimble/host/src/ble_dtm.c +nimble/host/src/ble_eatt.c +nimble/host/src/ble_eddystone.c +nimble/host/src/ble_gap.c +nimble/host/src/ble_gattc.c +nimble/host/src/ble_gatts.c +nimble/host/src/ble_gatts_lcl.c +nimble/host/src/ble_hs.c +nimble/host/src/ble_hs_adv.c +nimble/host/src/ble_hs_atomic.c +nimble/host/src/ble_hs_cfg.c +nimble/host/src/ble_hs_conn.c +nimble/host/src/ble_hs_flow.c +nimble/host/src/ble_hs_hci.c +nimble/host/src/ble_hs_hci_cmd.c +nimble/host/src/ble_hs_hci_evt.c +nimble/host/src/ble_hs_hci_util.c +nimble/host/src/ble_hs_id.c +nimble/host/src/ble_hs_log.c +nimble/host/src/ble_hs_mbuf.c +nimble/host/src/ble_hs_misc.c +nimble/host/src/ble_hs_mqueue.c +nimble/host/src/ble_hs_periodic_sync.c +nimble/host/src/ble_hs_pvcy.c +nimble/host/src/ble_hs_shutdown.c +nimble/host/src/ble_hs_startup.c +nimble/host/src/ble_hs_stop.c +nimble/host/src/ble_ibeacon.c +nimble/host/src/ble_iso.c +nimble/host/src/ble_l2cap.c +nimble/host/src/ble_l2cap_coc.c +nimble/host/src/ble_l2cap_sig.c +nimble/host/src/ble_l2cap_sig_cmd.c +nimble/host/src/ble_sm.c +nimble/host/src/ble_sm_alg.c +nimble/host/src/ble_sm_cmd.c +nimble/host/src/ble_sm_lgcy.c +nimble/host/src/ble_sm_sc.c +nimble/host/src/ble_store.c +nimble/host/src/ble_store_util.c +nimble/host/src/ble_uuid.c + +nimble/host/services/gap/src/ble_svc_gap.c +nimble/host/services/gatt/src/ble_svc_gatt.c +nimble/host/services/bas/src/ble_svc_bas.c +nimble/host/services/dis/src/ble_svc_dis.c +# nimble/host/store/config/src/ble_store_config.c +# nimble/host/store/config/src/ble_store_config_conf.c +nimble/host/store/ram/src/ble_store_ram.c +nimble/host/util/src/addr.c + +nimble/transport/common/hci_h4/src/hci_h4.c +nimble/transport/src/transport.c + +ext/tinycrypt/src/aes_decrypt.c +ext/tinycrypt/src/aes_encrypt.c +ext/tinycrypt/src/cbc_mode.c +ext/tinycrypt/src/ccm_mode.c +ext/tinycrypt/src/cmac_mode.c +ext/tinycrypt/src/ctr_mode.c +ext/tinycrypt/src/ctr_prng.c +ext/tinycrypt/src/ecc.c +ext/tinycrypt/src/ecc_dh.c +ext/tinycrypt/src/ecc_dsa.c +ext/tinycrypt/src/ecc_platform_specific.c +ext/tinycrypt/src/hmac.c +ext/tinycrypt/src/hmac_prng.c +ext/tinycrypt/src/sha256.c +ext/tinycrypt/src/utils.c + + +===========头文件================= + +nimble/include +nimble/host/include +nimble/host/services/ans/include +nimble/host/services/bas/include +nimble/host/services/dis/include +nimble/host/services/gap/include +nimble/host/services/gatt/include +nimble/host/services/ias/include +nimble/host/services/lls/include +nimble/host/services/tps/include +nimble/host/store/ram/include +nimble/host/util/include +nimble/transport/include +ext/tinycrypt/include +nimble/transport/common/hci_h4/include + + + +``` + +- porting 请禁止使用 nimble 官方源码,请使用 porting 目录下的文件 + +``` +头文件 +porting/nimble/include +porting/npl/freertos/include + +源文件 +porting/nimble/src/endian.c +porting/nimble/src/mem.c +porting/nimble/src/nimble_port.c +porting/nimble/src/os_mbuf.c +porting/nimble/src/os_mempool.c +porting/nimble/src/os_msys_init.c + +porting/npl/freertos/src/nimble_port_freertos.c +porting/npl/freertos/src/npl_os_freertos.c +``` + + + +- 初始化 nimble,请注意,必须在 usb bluetooth 识别以后才能初始化 + +``` +#include "nimble/nimble_port.h" +#include "usbh_core.h" + +void nimble_thread_entry(void *parameter) +{ + nimble_port_run(); +} + +void nimble_init(void) +{ + nimble_port_init(); + + usb_osal_thread_create("nimble", 2048, CONFIG_USBHOST_PSC_PRIO + 1, nimble_thread_entry, NULL); +} + +``` + diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/ble_hci_usbh.c b/src/lib/CherryUSB/third_party/nimble-1.6.0/ble_hci_usbh.c new file mode 100644 index 000000000..a0275e730 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/ble_hci_usbh.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "usbh_core.h" +#include "usbh_bluetooth.h" + +#include +#include "nimble/transport.h" +#include "nimble/transport/hci_h4.h" + +struct hci_h4_sm g_hci_h4sm; + +void ble_transport_ll_init(void) +{ + /* nothing here */ +} + +static int hci_usb_frame_cb(uint8_t pkt_type, void *data) +{ + switch (pkt_type) { + case HCI_H4_EVT: + return ble_transport_to_hs_evt(data); + case HCI_H4_ACL: + return ble_transport_to_hs_acl(data); + default: + assert(0); + break; + } + return -1; +} + +void usbh_bluetooth_hci_read_callback(uint8_t *data, uint32_t len) +{ + size_t remaining = len; + uint8_t pkt_indicator; + + pkt_indicator = *data++; + remaining -= sizeof(pkt_indicator); + + hci_h4_sm_rx(&g_hci_h4sm, &pkt_indicator, 1); + hci_h4_sm_rx(&g_hci_h4sm, data, remaining); +} + +int ble_transport_to_ll_cmd_impl(void *buf) +{ + int ret = 0; + uint8_t *cmd_pkt_data = (uint8_t *)buf; + size_t pkt_len = cmd_pkt_data[2] + 3; + + ret = usbh_bluetooth_hci_write(USB_BLUETOOTH_HCI_CMD, buf, pkt_len); + if (ret < 0) { + ret = BLE_ERR_MEM_CAPACITY; + } else { + ret = 0; + } + ble_transport_free(buf); + + return ret; +} + +int ble_transport_to_ll_acl_impl(struct os_mbuf *om) +{ + struct os_mbuf *x = om; + int ret = 0; + + while (x != NULL) { + ret = usbh_bluetooth_hci_write(USB_BLUETOOTH_HCI_ACL, x->om_data, x->om_len); + if (ret < 0) { + ret = BLE_ERR_MEM_CAPACITY; + break; + } else { + ret = 0; + } + x = SLIST_NEXT(x, om_next); + } + + os_mbuf_free_chain(om); + + return ret; +} + +__WEAK void usbh_bluetooth_run_callback(void) +{ + /* bt_enable() */ +} + +__WEAK void usbh_bluetooth_stop_callback(void) +{ + /* bt_disable() */ +} + +void usbh_bluetooth_run(struct usbh_bluetooth *bluetooth_class) +{ + hci_h4_sm_init(&g_hci_h4sm, &hci_h4_allocs_from_ll, hci_usb_frame_cb); + +#ifdef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + usb_osal_thread_create("ble_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_bluetooth_hci_rx_thread, NULL); +#else + usb_osal_thread_create("ble_evt", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_bluetooth_hci_evt_rx_thread, NULL); + usb_osal_thread_create("ble_acl", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_bluetooth_hci_acl_rx_thread, NULL); +#endif + usbh_bluetooth_run_callback(); +} + +void usbh_bluetooth_stop(struct usbh_bluetooth *bluetooth_class) +{ + usbh_bluetooth_stop_callback(); +} diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/nimble/.gitkeep b/src/lib/CherryUSB/third_party/nimble-1.6.0/nimble/.gitkeep new file mode 100644 index 000000000..7b67f41ce --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/nimble/.gitkeep @@ -0,0 +1 @@ +https://github.com/sakumisu/mynewt-nimble \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/mem/mem.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/mem/mem.h new file mode 100644 index 000000000..1c29efbeb --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/mem/mem.h @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 H_UTIL_MEM_ +#define H_UTIL_MEM_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct os_mempool; +struct os_mbuf_pool; + +int mem_malloc_mempool(struct os_mempool *mempool, uint16_t num_blocks, + uint32_t block_size, char *name, void **out_buf); +int mem_malloc_mempool_ext(struct os_mempool_ext *mempool, uint16_t num_blocks, + uint32_t block_size, char *name, void **out_buf); + +int mem_malloc_mbuf_pool(struct os_mempool *mempool, + struct os_mbuf_pool *mbuf_pool, uint16_t num_blocks, + uint32_t block_size, char *name, + void **out_buf); +int mem_malloc_mbufpkt_pool(struct os_mempool *mempool, + struct os_mbuf_pool *mbuf_pool, int num_blocks, + int block_size, char *name, + void **out_buf); +int mem_init_mbuf_pool(void *mem, struct os_mempool *mempool, + struct os_mbuf_pool *mbuf_pool, int num_blocks, + int block_size, char *name); + +/** + * Specifies a function used as a callback. Functions of this type allocate an + * mbuf chain meant to hold a packet fragment. The resulting mbuf must contain + * a pkthdr. + * + * @param frag_size The number of data bytes that the mbuf will + * eventually contain. + * @param arg A generic parameter. + * + * @return An allocated mbuf chain on success; + * NULL on failure. + */ +typedef struct os_mbuf *mem_frag_alloc_fn(uint16_t frag_size, void *arg); + +struct os_mbuf *mem_split_frag(struct os_mbuf **om, uint16_t max_frag_sz, + mem_frag_alloc_fn *alloc_cb, void *cb_arg); + +void *mem_pullup_obj(struct os_mbuf **om, uint16_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/nimble/nimble_port.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/nimble/nimble_port.h new file mode 100644 index 000000000..28065cf8e --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/nimble/nimble_port.h @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 _NIMBLE_PORT_H +#define _NIMBLE_PORT_H + +#include "nimble/nimble_npl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void nimble_port_init(void); + +void nimble_port_run(void); + +struct ble_npl_eventq *nimble_port_get_dflt_eventq(void); + +#if NIMBLE_CFG_CONTROLLER +void nimble_port_ll_task_func(void *arg); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _NIMBLE_PORT_H */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/endian.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/endian.h new file mode 100644 index 000000000..021a73ed6 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/endian.h @@ -0,0 +1,229 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 H_ENDIAN_ +#define H_ENDIAN_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Internal helpers */ +#ifndef os_bswap_64 +#define os_bswap_64(x) ((uint64_t) \ + ((((x) & 0xff00000000000000ull) >> 56) | \ + (((x) & 0x00ff000000000000ull) >> 40) | \ + (((x) & 0x0000ff0000000000ull) >> 24) | \ + (((x) & 0x000000ff00000000ull) >> 8) | \ + (((x) & 0x00000000ff000000ull) << 8) | \ + (((x) & 0x0000000000ff0000ull) << 24) | \ + (((x) & 0x000000000000ff00ull) << 40) | \ + (((x) & 0x00000000000000ffull) << 56))) +#endif + +#ifndef os_bswap_32 +#define os_bswap_32(x) ((uint32_t) \ + ((((x) & 0xff000000) >> 24) | \ + (((x) & 0x00ff0000) >> 8) | \ + (((x) & 0x0000ff00) << 8) | \ + (((x) & 0x000000ff) << 24))) +#endif + +#ifndef os_bswap_16 +#define os_bswap_16(x) ((uint16_t) \ + ((((x) & 0xff00) >> 8) | \ + (((x) & 0x00ff) << 8))) +#endif + +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + +#ifndef ntohll +#define ntohll(x) ((uint64_t)(x)) +#endif + +#ifndef htonll +#define htonll(x) ((uint64_t)(x)) +#endif + +#ifndef ntohl +#define ntohl(x) ((uint32_t)(x)) +#endif + +#ifndef htonl +#define htonl(x) ((uint32_t)(x)) +#endif + +#ifndef ntohs +#define ntohs(x) ((uint16_t)(x)) +#endif + +#ifndef htons +#define htons(x) ((uint16_t)(x)) +#endif + +#ifndef htobe16 +#define htobe16(x) ((uint16_t)(x)) +#endif + +#ifndef htole16 +#define htole16(x) os_bswap_16 (x) +#endif + +#ifndef be16toh +#define be16toh(x) ((uint16_t)(x)) +#endif + +#ifndef le16toh +#define le16toh(x) os_bswap_16 (x) +#endif + +#ifndef htobe32 +#define htobe32(x) ((uint32_t)(x)) +#endif + +#ifndef htole32 +#define htole32(x) os_bswap_32 (x) +#endif + +#ifndef be32toh +#define be32toh(x) ((uint32_t)(x)) +#endif + +#ifndef le32toh +#define le32toh(x) os_bswap_32 (x) +#endif + +#ifndef htobe64 +#define htobe64(x) ((uint64_t)(x)) +#endif + +#ifndef htole64 +#define htole64(x) os_bswap_64 (x) +#endif + +#ifndef be64toh +#define be64toh(x) ((uint64_t)(x)) +#endif + +#ifndef le64toh +#define le64toh(x) os_bswap_64 (x) +#endif + +#else + +#ifndef ntohll +#define ntohll(x) os_bswap_64(x) +#endif + +#ifndef htonll +#define htonll ntohll +#endif + +#ifndef ntohl +#define ntohl(x) os_bswap_32(x) +#endif + +#ifndef htonl +#define htonl ntohl +#endif + +#ifndef htons +#define htons(x) os_bswap_16(x) +#endif + +#ifndef ntohs +#define ntohs htons +#endif + +#ifndef htobe16 +#define htobe16(x) os_bswap_16(x) +#endif + +#ifndef htole16 +#define htole16(x) ((uint16_t)(x)) +#endif + +#ifndef be16toh +#define be16toh(x) os_bswap_16(x) +#endif + +#ifndef le16toh +#define le16toh(x) ((uint16_t)(x)) +#endif + +#ifndef htobe32 +#define htobe32(x) os_bswap_32(x) +#endif + +#ifndef htole32 +#define htole32(x) ((uint32_t)(x)) +#endif + +#ifndef be32toh +#define be32toh(x) os_bswap_32(x) +#endif + +#ifndef le32toh +#define le32toh(x) ((uint32_t)(x)) +#endif + +#ifndef htobe64 +#define htobe64(x) os_bswap_64(x) +#endif + +#ifndef htole64 +#define htole64(x) ((uint64_t)(x)) +#endif + +#ifndef be64toh +#define be64toh(x) os_bswap_64(x) +#endif + +#ifndef le64toh +#define le64toh(x) ((uint64_t)(x)) +#endif + +#endif + +void put_le16(void *buf, uint16_t x); +void put_le24(void *buf, uint32_t x); +void put_le32(void *buf, uint32_t x); +void put_le64(void *buf, uint64_t x); +uint16_t get_le16(const void *buf); +uint32_t get_le24(const void *buf); +uint32_t get_le32(const void *buf); +uint64_t get_le64(const void *buf); +void put_be16(void *buf, uint16_t x); +void put_be24(void *buf, uint32_t x); +void put_be32(void *buf, uint32_t x); +void put_be64(void *buf, uint64_t x); +uint16_t get_be16(const void *buf); +uint32_t get_be24(const void *buf); +uint32_t get_be32(const void *buf); +uint64_t get_be64(const void *buf); +void swap_in_place(void *buf, int len); +void swap_buf(uint8_t *dst, const uint8_t *src, int len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os.h new file mode 100644 index 000000000..da7427f6e --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os.h @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 _OS_H +#define _OS_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include "syscfg/syscfg.h" +#include "nimble/nimble_npl.h" + +#define OS_ALIGN(__n, __a) ( \ + (((__n) & ((__a) - 1)) == 0) ? \ + (__n) : \ + ((__n) + ((__a) - ((__n) & ((__a) - 1)))) \ + ) +#define OS_ALIGNMENT (BLE_NPL_OS_ALIGNMENT) + +typedef uint32_t os_sr_t; +#define OS_ENTER_CRITICAL(_sr) (_sr = ble_npl_hw_enter_critical()) +#define OS_EXIT_CRITICAL(_sr) (ble_npl_hw_exit_critical(_sr)) +#define OS_ASSERT_CRITICAL() assert(ble_npl_hw_is_in_critical()) + +/* Mynewt components (not abstracted in NPL) */ +#include "os/endian.h" +#include "os/queue.h" +#include "os/os_error.h" +#include "os/os_mbuf.h" +#include "os/os_mempool.h" + +#ifdef __cplusplus +} +#endif + +#endif /* _OS_H */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_cputime.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_cputime.h new file mode 100644 index 000000000..17ad87794 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_cputime.h @@ -0,0 +1,239 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +/** + * @addtogroup OSKernel + * @{ + * @defgroup OSCPUTime High Resolution Timers + * @{ + */ + +#ifndef H_OS_CPUTIME_ +#define H_OS_CPUTIME_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "syscfg/syscfg.h" +#include "hal/hal_timer.h" + +/* + * NOTE: these definitions allow one to override the cputime frequency used. + * The reason these definitions exist is to make the code more + * efficient/smaller when CPUTIME counts at 1 MHz. + * + * For those who want a different cputime frequency, you can set the config + * definition for OS_CPUTIME_FREQ to the desired frequency in your project, + * target or bsp. + */ +#if (MYNEWT_VAL(OS_CPUTIME_FREQ) == 1000000) + +#define OS_CPUTIME_FREQ_1MHZ + +#elif MYNEWT_VAL(OS_CPUTIME_FREQ) == 256 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 512 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 1024 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 2048 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 4096 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 8192 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 16384 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 32768 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 65536 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 131072 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 262144 || \ + MYNEWT_VAL(OS_CPUTIME_FREQ) == 524288 + +#define OS_CPUTIME_FREQ_PWR2 + +#elif MYNEWT_VAL(OS_CPUTIME_FREQ) > 1000000 + +#define OS_CPUTIME_FREQ_HIGH + +#else + +#error "Invalid OS_CPUTIME_FREQ value. Value must be one of a) a power of 2" \ + ">= 256Hz, or b) any value >= 1MHz" + +#endif + +#if defined(OS_CPUTIME_FREQ_HIGH) +/* CPUTIME data. */ +struct os_cputime_data +{ + uint32_t ticks_per_usec; /* number of ticks per usec */ +}; +extern struct os_cputime_data g_os_cputime; +#endif + +/* Helpful macros to compare cputimes */ +/** evaluates to true if t1 is before t2 in time */ +#define CPUTIME_LT(__t1, __t2) ((int32_t) ((__t1) - (__t2)) < 0) +/** evaluates to true if t1 is after t2 in time */ +#define CPUTIME_GT(__t1, __t2) ((int32_t) ((__t1) - (__t2)) > 0) +/** evaluates to true if t1 is on or after t2 in time */ +#define CPUTIME_GEQ(__t1, __t2) ((int32_t) ((__t1) - (__t2)) >= 0) +/** evaluates to true if t1 is on or before t2 in time */ +#define CPUTIME_LEQ(__t1, __t2) ((int32_t) ((__t1) - (__t2)) <= 0) + +/** + * Initialize the cputime module. This must be called after os_init is called + * and before any other timer API are used. This should be called only once + * and should be called before the hardware timer is used. + * + * @param clock_freq The desired cputime frequency, in hertz (Hz). + * + * @return int 0 on success; -1 on error. + */ +int os_cputime_init(uint32_t clock_freq); + +/** + * Returns the low 32 bits of cputime. + * + * @return uint32_t The lower 32 bits of cputime + */ +uint32_t os_cputime_get32(void); + +#if !defined(OS_CPUTIME_FREQ_PWR2) +/** + * Converts the given number of nanoseconds into cputime ticks. + * Not defined if OS_CPUTIME_FREQ_PWR2 is defined. + * + * @param usecs The number of nanoseconds to convert to ticks + * + * @return uint32_t The number of ticks corresponding to 'nsecs' + */ +uint32_t os_cputime_nsecs_to_ticks(uint32_t nsecs); + +/** + * Convert the given number of ticks into nanoseconds. + * Not defined if OS_CPUTIME_FREQ_PWR2 is defined. + * + * @param ticks The number of ticks to convert to nanoseconds. + * + * @return uint32_t The number of nanoseconds corresponding to 'ticks' + */ +uint32_t os_cputime_ticks_to_nsecs(uint32_t ticks); + +/** + * Wait until 'nsecs' nanoseconds has elapsed. This is a blocking delay. + * Not defined if OS_CPUTIME_FREQ_PWR2 is defined. + * + * + * @param nsecs The number of nanoseconds to wait. + */ +void os_cputime_delay_nsecs(uint32_t nsecs); +#endif + +#if defined(OS_CPUTIME_FREQ_1MHZ) +#define os_cputime_usecs_to_ticks(x) (x) +#define os_cputime_ticks_to_usecs(x) (x) +#else + +/** + * Converts the given number of microseconds into cputime ticks. + * + * @param usecs The number of microseconds to convert to ticks + * + * @return uint32_t The number of ticks corresponding to 'usecs' + */ +uint32_t os_cputime_usecs_to_ticks(uint32_t usecs); + +/** + * Convert the given number of ticks into microseconds. + * + * @param ticks The number of ticks to convert to microseconds. + * + * @return uint32_t The number of microseconds corresponding to 'ticks' + */ +uint32_t os_cputime_ticks_to_usecs(uint32_t ticks); +#endif + +/** + * Wait until the number of ticks has elapsed. This is a blocking delay. + * + * @param ticks The number of ticks to wait. + */ +void os_cputime_delay_ticks(uint32_t ticks); + +/** + * Wait until 'usecs' microseconds has elapsed. This is a blocking delay. + * + * @param usecs The number of usecs to wait. + */ +void os_cputime_delay_usecs(uint32_t usecs); + +/** + * Initialize a CPU timer, using the given HAL timer. + * + * @param timer The timer to initialize. Cannot be NULL. + * @param fp The timer callback function. Cannot be NULL. + * @param arg Pointer to data object to pass to timer. + */ +void os_cputime_timer_init(struct hal_timer *timer, hal_timer_cb fp, + void *arg); + +/** + * Start a cputimer that will expire at 'cputime'. If cputime has already + * passed, the timer callback will still be called (at interrupt context). + * + * NOTE: This must be called when the timer is stopped. + * + * @param timer Pointer to timer to start. Cannot be NULL. + * @param cputime The cputime at which the timer should expire. + * + * @return int 0 on success; EINVAL if timer already started or timer struct + * invalid + * + */ +int os_cputime_timer_start(struct hal_timer *timer, uint32_t cputime); + +/** + * Sets a cpu timer that will expire 'usecs' microseconds from the current + * cputime. + * + * NOTE: This must be called when the timer is stopped. + * + * @param timer Pointer to timer. Cannot be NULL. + * @param usecs The number of usecs from now at which the timer will expire. + * + * @return int 0 on success; EINVAL if timer already started or timer struct + * invalid + */ +int os_cputime_timer_relative(struct hal_timer *timer, uint32_t usecs); + +/** + * Stops a cputimer from running. The timer is removed from the timer queue + * and interrupts are disabled if no timers are left on the queue. Can be + * called even if timer is not running. + * + * @param timer Pointer to cputimer to stop. Cannot be NULL. + */ +void os_cputime_timer_stop(struct hal_timer *timer); + +#ifdef __cplusplus +} +#endif + +#endif /* H_OS_CPUTIME_ */ + +/** + * @} OSCPUTime + * @} OSKernel + */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_error.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_error.h new file mode 100644 index 000000000..71f8e1149 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_error.h @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 H_OS_ERROR_ +#define H_OS_ERROR_ + +#include "os/os.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* OS error enumerations */ +enum os_error { + OS_OK = 0, + OS_ENOMEM = 1, + OS_EINVAL = 2, + OS_INVALID_PARM = 3, + OS_MEM_NOT_ALIGNED = 4, + OS_BAD_MUTEX = 5, + OS_TIMEOUT = 6, + OS_ERR_IN_ISR = 7, /* Function cannot be called from ISR */ + OS_ERR_PRIV = 8, /* Privileged access error */ + OS_NOT_STARTED = 9, /* OS must be started to call this function, but isn't */ + OS_ENOENT = 10, /* No such thing */ + OS_EBUSY = 11, /* Resource busy */ + OS_ERROR = 12, /* Generic Error */ +}; + +typedef enum os_error os_error_t; + +/** + * @brief Converts an OS error code (`OS_[...]`) to an equivalent system error + * code (`SYS_E[...]`). + * + * @param os_error The OS error code to convert. + * + * @return The equivalent system error code. + */ +int os_error_to_sys(os_error_t os_error); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_mbuf.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_mbuf.h new file mode 100644 index 000000000..6c05b2a73 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_mbuf.h @@ -0,0 +1,677 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + + +/** + * @addtogroup OSKernel + * @{ + * @defgroup OSMbuf Chained Memory Buffers + * @{ + */ + + +#ifndef _OS_MBUF_H +#define _OS_MBUF_H + +#include "os/os.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * A mbuf pool from which to allocate mbufs. This contains a pointer to the os + * mempool to allocate mbufs out of, the total number of elements in the pool, + * and the amount of "user" data in a non-packet header mbuf. The total pool + * size, in bytes, should be: + * os_mbuf_count * (omp_databuf_len + sizeof(struct os_mbuf)) + */ +struct os_mbuf_pool { + /** + * Total length of the databuf in each mbuf. This is the size of the + * mempool block, minus the mbuf header + */ + uint16_t omp_databuf_len; + /** + * The memory pool which to allocate mbufs out of + */ + struct os_mempool *omp_pool; + + STAILQ_ENTRY(os_mbuf_pool) omp_next; +}; + + +/** + * A packet header structure that preceeds the mbuf packet headers. + */ +struct os_mbuf_pkthdr { + /** + * Overall length of the packet. + */ + uint16_t omp_len; + /** + * Flags + */ + uint16_t omp_flags; + + STAILQ_ENTRY(os_mbuf_pkthdr) omp_next; +}; + +/** + * Chained memory buffer. + */ +struct os_mbuf { + /** + * Current pointer to data in the structure + */ + uint8_t *om_data; + /** + * Flags associated with this buffer, see OS_MBUF_F_* defintions + */ + uint8_t om_flags; + /** + * Length of packet header + */ + uint8_t om_pkthdr_len; + /** + * Length of data in this buffer + */ + uint16_t om_len; + + /** + * The mbuf pool this mbuf was allocated out of + */ + struct os_mbuf_pool *om_omp; + + SLIST_ENTRY(os_mbuf) om_next; + + /** + * Pointer to the beginning of the data, after this buffer + */ + uint8_t om_databuf[0]; +}; + +/** + * Structure representing a queue of mbufs. + */ +struct os_mqueue { + STAILQ_HEAD(, os_mbuf_pkthdr) mq_head; + /** Event to post when new buffers are available on the queue. */ + struct ble_npl_event mq_ev; +}; + +/* + * Given a flag number, provide the mask for it + * + * @param __n The number of the flag in the mask + */ +#define OS_MBUF_F_MASK(__n) (1 << (__n)) + +/* + * Checks whether a given mbuf is a packet header mbuf + * + * @param __om The mbuf to check + */ +#define OS_MBUF_IS_PKTHDR(__om) \ + ((__om)->om_pkthdr_len >= sizeof (struct os_mbuf_pkthdr)) + +/** Get a packet header pointer given an mbuf pointer */ +#define OS_MBUF_PKTHDR(__om) ((struct os_mbuf_pkthdr *)(uintptr_t) \ + (void *)((uint8_t *)&(__om)->om_data \ + + sizeof(struct os_mbuf))) + +/** Given a mbuf packet header pointer, return a pointer to the mbuf */ +#define OS_MBUF_PKTHDR_TO_MBUF(__hdr) \ + (struct os_mbuf *)(uintptr_t)((uint8_t *)(__hdr) - sizeof(struct os_mbuf)) + +/** + * Gets the length of an entire mbuf chain. The specified mbuf must have a + * packet header. + */ +#define OS_MBUF_PKTLEN(__om) (OS_MBUF_PKTHDR(__om)->omp_len) + +/** + * Access the data of a mbuf, and cast it to type + * + * @param __om The mbuf to access, and cast + * @param __type The type to cast it to + */ +#define OS_MBUF_DATA(__om, __type) \ + (__type) ((__om)->om_data) + +/** + * Access the "user header" in the head of an mbuf chain. + * + * @param om Pointer to the head of an mbuf chain. + */ +#define OS_MBUF_USRHDR(om) \ + (void *)((uint8_t *)om + sizeof (struct os_mbuf) + \ + sizeof (struct os_mbuf_pkthdr)) + +/** + * Retrieves the length of the user header in an mbuf. + * + * @param om Pointer to the mbuf to query. + */ +#define OS_MBUF_USRHDR_LEN(om) \ + ((om)->om_pkthdr_len - sizeof (struct os_mbuf_pkthdr)) + + +/** @cond INTERNAL_HIDDEN */ + +/* + * Called by OS_MBUF_LEADINGSPACE() macro + */ +static inline uint16_t +_os_mbuf_leadingspace(struct os_mbuf *om) +{ + uint16_t startoff; + uint16_t leadingspace; + + startoff = 0; + if (OS_MBUF_IS_PKTHDR(om)) { + startoff = om->om_pkthdr_len; + } + + leadingspace = (uint16_t) (OS_MBUF_DATA(om, uint8_t *) - + ((uint8_t *) &om->om_databuf[0] + startoff)); + + return (leadingspace); +} + +/** @endcond */ + +/** + * Returns the leading space (space at the beginning) of the mbuf. + * Works on both packet header, and regular mbufs, as it accounts + * for the additional space allocated to the packet header. + * + * @param __omp Is the mbuf pool (which contains packet header length.) + * @param __om Is the mbuf in that pool to get the leadingspace for + * + * @return Amount of leading space available in the mbuf + */ +#define OS_MBUF_LEADINGSPACE(__om) _os_mbuf_leadingspace(__om) + + +/** @cond INTERNAL_HIDDEN */ + +/* Called by OS_MBUF_TRAILINGSPACE() macro. */ +static inline uint16_t +_os_mbuf_trailingspace(struct os_mbuf *om) +{ + struct os_mbuf_pool *omp; + + omp = om->om_omp; + + return (&om->om_databuf[0] + omp->omp_databuf_len) - + (om->om_data + om->om_len); +} + +/** @endcond */ + +/** + * Returns the trailing space (space at the end) of the mbuf. + * Works on both packet header and regular mbufs. + * + * @param __omp The mbuf pool for this mbuf + * @param __om Is the mbuf in that pool to get trailing space for + * + * @return The amount of trailing space available in the mbuf + */ +#define OS_MBUF_TRAILINGSPACE(__om) _os_mbuf_trailingspace(__om) + + +/** + * Initializes an mqueue. An mqueue is a queue of mbufs that ties to a + * particular task's event queue. Mqueues form a helper API around a common + * paradigm: wait on an event queue until at least one packet is available, + * then process a queue of packets. + * + * When mbufs are available on the queue, an event OS_EVENT_T_MQUEUE_DATA + * will be posted to the task's mbuf queue. + * + * @param mq The mqueue to initialize + * @param ev_cb The callback to associate with the mqeueue + * event. Typically, this callback pulls each + * packet off the mqueue and processes them. + * @param arg The argument to associate with the mqueue event. + * + * @return 0 on success, non-zero on failure. + */ +int os_mqueue_init(struct os_mqueue *mq, ble_npl_event_fn *ev_cb, void *arg); + +/** + * Remove and return a single mbuf from the mbuf queue. Does not block. + * + * @param mq The mbuf queue to pull an element off of. + * + * @return The next mbuf in the queue, or NULL if queue has no mbufs. + */ +struct os_mbuf *os_mqueue_get(struct os_mqueue *); + +/** + * Adds a packet (i.e. packet header mbuf) to an mqueue. The event associated + * with the mqueue gets posted to the specified eventq. + * + * @param mq The mbuf queue to append the mbuf to. + * @param evq The event queue to post an event to. + * @param m The mbuf to append to the mbuf queue. + * + * @return 0 on success, non-zero on failure. + */ +int os_mqueue_put(struct os_mqueue *, struct ble_npl_eventq *, struct os_mbuf *); + +/** + * MSYS is a system level mbuf registry. Allows the system to share + * packet buffers amongst the various networking stacks that can be running + * simultaeneously. + * + * Mbuf pools are created in the system initialization code, and then when + * a mbuf is allocated out of msys, it will try and find the best fit based + * upon estimated mbuf size. + * + * os_msys_register() registers a mbuf pool with MSYS, and allows MSYS to + * allocate mbufs out of it. + * + * @param new_pool The pool to register with MSYS + * + * @return 0 on success, non-zero on failure + */ +int os_msys_register(struct os_mbuf_pool *); + +/** + * Allocate a mbuf from msys. Based upon the data size requested, + * os_msys_get() will choose the mbuf pool that has the best fit. + * + * @param dsize The estimated size of the data being stored in the mbuf + * @param leadingspace The amount of leadingspace to allocate in the mbuf + * + * @return A freshly allocated mbuf on success, NULL on failure. + */ +struct os_mbuf *os_msys_get(uint16_t dsize, uint16_t leadingspace); + +/** + * De-registers all mbuf pools from msys. + */ +void os_msys_reset(void); + +/** + * Allocate a packet header structure from the MSYS pool. See + * os_msys_register() for a description of MSYS. + * + * @param dsize The estimated size of the data being stored in the mbuf + * @param user_hdr_len The length to allocate for the packet header structure + * + * @return A freshly allocated mbuf on success, NULL on failure. + */ +struct os_mbuf *os_msys_get_pkthdr(uint16_t dsize, uint16_t user_hdr_len); + +/** + * Count the number of blocks in all the mbuf pools that are allocated. + * + * @return total number of blocks allocated in Msys + */ +int os_msys_count(void); + +/** + * Return the number of free blocks in Msys + * + * @return Number of free blocks available in Msys + */ +int os_msys_num_free(void); + +/** + * Initialize a pool of mbufs. + * + * @param omp The mbuf pool to initialize + * @param mp The memory pool that will hold this mbuf pool + * @param buf_len The length of the buffer itself. + * @param nbufs The number of buffers in the pool + * + * @return 0 on success, error code on failure. + */ +int os_mbuf_pool_init(struct os_mbuf_pool *, struct os_mempool *mp, + uint16_t, uint16_t); + +/** + * Get an mbuf from the mbuf pool. The mbuf is allocated, and initialized + * prior to being returned. + * + * @param omp The mbuf pool to return the packet from + * @param leadingspace The amount of leadingspace to put before the data + * section by default. + * + * @return An initialized mbuf on success, and NULL on failure. + */ +struct os_mbuf *os_mbuf_get(struct os_mbuf_pool *omp, uint16_t); + +/** + * Allocate a new packet header mbuf out of the os_mbuf_pool. + * + * @param omp The mbuf pool to allocate out of + * @param user_pkthdr_len The packet header length to reserve for the caller. + * + * @return A freshly allocated mbuf on success, NULL on failure. + */ +struct os_mbuf *os_mbuf_get_pkthdr(struct os_mbuf_pool *omp, + uint8_t pkthdr_len); + +/** + * Duplicate a chain of mbufs. Return the start of the duplicated chain. + * + * @param omp The mbuf pool to duplicate out of + * @param om The mbuf chain to duplicate + * + * @return A pointer to the new chain of mbufs + */ +struct os_mbuf *os_mbuf_dup(struct os_mbuf *m); + +/** + * Locates the specified absolute offset within an mbuf chain. The offset + * can be one past than the total length of the chain, but no greater. + * + * @param om The start of the mbuf chain to seek within. + * @param off The absolute address to find. + * @param out_off On success, this points to the relative offset + * within the returned mbuf. + * + * @return The mbuf containing the specified offset on + * success. + * NULL if the specified offset is out of bounds. + */ +struct os_mbuf *os_mbuf_off(const struct os_mbuf *om, int off, + uint16_t *out_off); + + +/* + * Copy data from an mbuf chain starting "off" bytes from the beginning, + * continuing for "len" bytes, into the indicated buffer. + * + * @param m The mbuf chain to copy from + * @param off The offset into the mbuf chain to begin copying from + * @param len The length of the data to copy + * @param dst The destination buffer to copy into + * + * @return 0 on success; + * -1 if the mbuf does not contain enough data. + */ +int os_mbuf_copydata(const struct os_mbuf *m, int off, int len, void *dst); + +/** + * @brief Calculates the length of an mbuf chain. + * + * Calculates the length of an mbuf chain. If the mbuf contains a packet + * header, you should use `OS_MBUF_PKTLEN()` as a more efficient alternative to + * this function. + * + * @param om The mbuf to measure. + * + * @return The length, in bytes, of the provided mbuf + * chain. + */ +uint16_t os_mbuf_len(const struct os_mbuf *om); + +/** + * Append data onto a mbuf + * + * @param om The mbuf to append the data onto + * @param data The data to append onto the mbuf + * @param len The length of the data to append + * + * @return 0 on success, and an error code on failure + */ +int os_mbuf_append(struct os_mbuf *m, const void *, uint16_t); + +/** + * Reads data from one mbuf and appends it to another. On error, the specified + * data range may be partially appended. Neither mbuf is required to contain + * an mbuf packet header. + * + * @param dst The mbuf to append to. + * @param src The mbuf to copy data from. + * @param src_off The absolute offset within the source mbuf + * chain to read from. + * @param len The number of bytes to append. + * + * @return 0 on success; + * OS_EINVAL if the specified range extends beyond + * the end of the source mbuf chain. + */ +int os_mbuf_appendfrom(struct os_mbuf *dst, const struct os_mbuf *src, + uint16_t src_off, uint16_t len); + +/** + * Release a mbuf back to the pool + * + * @param omp The Mbuf pool to release back to + * @param om The Mbuf to release back to the pool + * + * @return 0 on success, -1 on failure + */ +int os_mbuf_free(struct os_mbuf *mb); + +/** + * Free a chain of mbufs + * + * @param omp The mbuf pool to free the chain of mbufs into + * @param om The starting mbuf of the chain to free back into the pool + * + * @return 0 on success, -1 on failure + */ +int os_mbuf_free_chain(struct os_mbuf *om); + +/** + * Adjust the length of a mbuf, trimming either from the head or the tail + * of the mbuf. + * + * @param mp The mbuf chain to adjust + * @param req_len The length to trim from the mbuf. If positive, trims + * from the head of the mbuf, if negative, trims from the + * tail of the mbuf. + */ +void os_mbuf_adj(struct os_mbuf *mp, int req_len); + + +/** + * Performs a memory compare of the specified region of an mbuf chain against a + * flat buffer. + * + * @param om The start of the mbuf chain to compare. + * @param off The offset within the mbuf chain to start the + * comparison. + * @param data The flat buffer to compare. + * @param len The length of the flat buffer. + * + * @return 0 if both memory regions are identical; + * A memcmp return code if there is a mismatch; + * INT_MAX if the mbuf is too short. + */ +int os_mbuf_cmpf(const struct os_mbuf *om, int off, const void *data, int len); + +/** + * Compares the contents of two mbuf chains. The ranges of the two chains to + * be compared are specified via the two offset parameters and the len + * parameter. Neither mbuf chain is required to contain a packet header. + * + * @param om1 The first mbuf chain to compare. + * @param offset1 The absolute offset within om1 at which to + * start the comparison. + * @param om2 The second mbuf chain to compare. + * @param offset2 The absolute offset within om2 at which to + * start the comparison. + * @param len The number of bytes to compare. + * + * @return 0 if both mbuf segments are identical; + * A memcmp() return code if the segment contents + * differ; + * INT_MAX if a specified range extends beyond the + * end of its corresponding mbuf chain. + */ +int os_mbuf_cmpm(const struct os_mbuf *om1, uint16_t offset1, + const struct os_mbuf *om2, uint16_t offset2, + uint16_t len); + +/** + * Increases the length of an mbuf chain by adding data to the front. If there + * is insufficient room in the leading mbuf, additional mbufs are allocated and + * prepended as necessary. If this function fails to allocate an mbuf, the + * entire chain is freed. + * + * The specified mbuf chain does not need to contain a packet header. + * + * @param omp The mbuf pool to allocate from. + * @param om The head of the mbuf chain. + * @param len The number of bytes to prepend. + * + * @return The new head of the chain on success; + * NULL on failure. + */ +struct os_mbuf *os_mbuf_prepend(struct os_mbuf *om, int len); + +/** + * Prepends a chunk of empty data to the specified mbuf chain and ensures the + * chunk is contiguous. If either operation fails, the specified mbuf chain is + * freed and NULL is returned. + * + * @param om The mbuf chain to prepend to. + * @param len The number of bytes to prepend and pullup. + * + * @return The modified mbuf on success; + * NULL on failure (and the mbuf chain is freed). + */ +struct os_mbuf *os_mbuf_prepend_pullup(struct os_mbuf *om, uint16_t len); + +/** + * Copies the contents of a flat buffer into an mbuf chain, starting at the + * specified destination offset. If the mbuf is too small for the source data, + * it is extended as necessary. If the destination mbuf contains a packet + * header, the header length is updated. + * + * @param omp The mbuf pool to allocate from. + * @param om The mbuf chain to copy into. + * @param off The offset within the chain to copy to. + * @param src The source buffer to copy from. + * @param len The number of bytes to copy. + * + * @return 0 on success; nonzero on failure. + */ +int os_mbuf_copyinto(struct os_mbuf *om, int off, const void *src, int len); + +/** + * Attaches a second mbuf chain onto the end of the first. If the first chain + * contains a packet header, the header's length is updated. If the second + * chain has a packet header, its header is cleared. + * + * @param first The mbuf chain being attached to. + * @param second The mbuf chain that gets attached. + */ +void os_mbuf_concat(struct os_mbuf *first, struct os_mbuf *second); + + +/** + * Increases the length of an mbuf chain by the specified amount. If there is + * not sufficient room in the last buffer, a new buffer is allocated and + * appended to the chain. It is an error to request more data than can fit in + * a single buffer. + * + * @param omp + * @param om The head of the chain to extend. + * @param len The number of bytes to extend by. + * + * @return A pointer to the new data on success; + * NULL on failure. + */ +void *os_mbuf_extend(struct os_mbuf *om, uint16_t len); + +/** + * Rearrange a mbuf chain so that len bytes are contiguous, + * and in the data area of an mbuf (so that OS_MBUF_DATA() will + * work on a structure of size len.) Returns the resulting + * mbuf chain on success, free's it and returns NULL on failure. + * + * If there is room, it will add up to "max_protohdr - len" + * extra bytes to the contiguous region, in an attempt to avoid being + * called next time. + * + * @param omp The mbuf pool to take the mbufs out of + * @param om The mbuf chain to make contiguous + * @param len The number of bytes in the chain to make contiguous + * + * @return The contiguous mbuf chain on success, NULL on failure. + */ +struct os_mbuf *os_mbuf_pullup(struct os_mbuf *om, uint16_t len); + + +/** + * Removes and frees empty mbufs from the front of a chain. If the chain + * contains a packet header, it is preserved. + * + * @param om The mbuf chain to trim. + * + * @return The head of the trimmed mbuf chain. + */ +struct os_mbuf *os_mbuf_trim_front(struct os_mbuf *om); + +/** + * Increases the length of an mbuf chain by inserting a gap at the specified + * offset. The contents of the gap are indeterminate. If the mbuf chain + * contains a packet header, its total length is increased accordingly. + * + * This function never frees the provided mbuf chain. + * + * @param om The mbuf chain to widen. + * @param off The offset at which to insert the gap. + * @param len The size of the gap to insert. + * + * @return 0 on success; SYS_[...] error code on failure. + */ +int os_mbuf_widen(struct os_mbuf *om, uint16_t off, uint16_t len); + + +/** + * Creates a single chained mbuf from m1 and m2 utilizing all + * the available buffer space in all mbufs in the resulting + * chain. In other words, ensures there is no leading space in + * any mbuf in the resulting chain and trailing space only in + * the last mbuf in the chain. Mbufs from either chain may be + * freed if not needed. No mbufs are allocated. Note that mbufs + * from m2 are added to the end of m1. If m1 has a packet + * header, it is retained and length updated. If m2 has a packet + * header it is discarded. If m1 is NULL, NULL is returned and + * m2 is left untouched. + * + * @param m1 Pointer to first mbuf chain to pack + * @param m2 Pointer to second mbuf chain to pack + * + * @return struct os_mbuf* Pointer to resulting mbuf chain + */ +struct os_mbuf *os_mbuf_pack_chains(struct os_mbuf *m1, struct os_mbuf *m2); + +#ifdef __cplusplus +} +#endif + +#endif /* _OS_MBUF_H */ + + +/** + * @} OSMbuf + * @} OSKernel + */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_mempool.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_mempool.h new file mode 100644 index 000000000..71d77065a --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_mempool.h @@ -0,0 +1,287 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +/** + * @addtogroup OSKernel + * @{ + * @defgroup OSMempool Memory Pools + * @{ + */ + + +#ifndef _OS_MEMPOOL_H_ +#define _OS_MEMPOOL_H_ + +#include +#include "os/os.h" +#include "os/queue.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * A memory block structure. This simply contains a pointer to the free list + * chain and is only used when the block is on the free list. When the block + * has been removed from the free list the entire memory block is usable by the + * caller. + */ +struct os_memblock { + SLIST_ENTRY(os_memblock) mb_next; +}; + +/* XXX: Change this structure so that we keep the first address in the pool? */ +/* XXX: add memory debug structure and associated code */ +/* XXX: Change how I coded the SLIST_HEAD here. It should be named: + SLIST_HEAD(,os_memblock) mp_head; */ + +/** + * Memory pool + */ +struct os_mempool { + /** Size of the memory blocks, in bytes. */ + uint32_t mp_block_size; + /** The number of memory blocks. */ + uint16_t mp_num_blocks; + /** The number of free blocks left */ + uint16_t mp_num_free; + /** The lowest number of free blocks seen */ + uint16_t mp_min_free; + /** Bitmap of OS_MEMPOOL_F_[...] values. */ + uint8_t mp_flags; + /** Address of memory buffer used by pool */ + uint32_t mp_membuf_addr; + STAILQ_ENTRY(os_mempool) mp_list; + SLIST_HEAD(,os_memblock); + /** Name for memory block */ + char *name; +}; + +/** + * Indicates an extended mempool. Address can be safely cast to + * (struct os_mempool_ext *). + */ +#define OS_MEMPOOL_F_EXT 0x01 + +struct os_mempool_ext; + +/** + * Block put callback function. If configured, this callback gets executed + * whenever a block is freed to the corresponding extended mempool. Note: The + * os_memblock_put() function calls this callback instead of freeing the block + * itself. Therefore, it is the callback's responsibility to free the block + * via a call to os_memblock_put_from_cb(). + * + * @param ome The extended mempool that a block is being + * freed back to. + * @param data The block being freed. + * @param arg Optional argument configured along with the + * callback. + * + * @return Indicates whether the block was successfully + * freed. A non-zero value should only be + * returned if the block was not successfully + * released back to its pool. + */ +typedef os_error_t os_mempool_put_fn(struct os_mempool_ext *ome, void *data, + void *arg); + +struct os_mempool_ext { + struct os_mempool mpe_mp; + + /* Callback that is executed immediately when a block is freed. */ + os_mempool_put_fn *mpe_put_cb; + void *mpe_put_arg; +}; + +#define OS_MEMPOOL_INFO_NAME_LEN (32) + +/** + * Information describing a memory pool, used to return OS information + * to the management layer. + */ +struct os_mempool_info { + /** Size of the memory blocks in the pool */ + int omi_block_size; + /** Number of memory blocks in the pool */ + int omi_num_blocks; + /** Number of free memory blocks */ + int omi_num_free; + /** Minimum number of free memory blocks ever */ + int omi_min_free; + /** Name of the memory pool */ + char omi_name[OS_MEMPOOL_INFO_NAME_LEN]; +}; + +/** + * Get information about the next system memory pool. + * + * @param mempool The current memory pool, or NULL if starting iteration. + * @param info A pointer to the structure to return memory pool information + * into. + * + * @return The next memory pool in the list to get information about, or NULL + * when at the last memory pool. + */ +struct os_mempool *os_mempool_info_get_next(struct os_mempool *, + struct os_mempool_info *); + +/* + * To calculate size of the memory buffer needed for the pool. NOTE: This size + * is NOT in bytes! The size is the number of os_membuf_t elements required for + * the memory pool. + */ +#if MYNEWT_VAL(OS_MEMPOOL_GUARD) +/* + * Leave extra 4 bytes of guard area at the end. + */ +#define OS_MEMPOOL_BLOCK_SZ(sz) ((sz) + sizeof(os_membuf_t)) +#else +#define OS_MEMPOOL_BLOCK_SZ(sz) (sz) +#endif +#if (OS_ALIGNMENT == 4) +typedef uint32_t os_membuf_t; +#elif (OS_ALIGNMENT == 8) +typedef uint64_t os_membuf_t; +#elif (OS_ALIGNMENT == 16) +typedef __uint128_t os_membuf_t; +#else +#error "Unhandled `OS_ALIGNMENT` for `os_membuf_t`" +#endif /* OS_ALIGNMENT == * */ +#define OS_MEMPOOL_SIZE(n,blksize) ((((blksize) + ((OS_ALIGNMENT)-1)) / (OS_ALIGNMENT)) * (n)) + +/** Calculates the number of bytes required to initialize a memory pool. */ +#define OS_MEMPOOL_BYTES(n,blksize) \ + (sizeof (os_membuf_t) * OS_MEMPOOL_SIZE((n), (blksize))) + +/** + * Initialize a memory pool. + * + * @param mp Pointer to a pointer to a mempool + * @param blocks The number of blocks in the pool + * @param blocks_size The size of the block, in bytes. + * @param membuf Pointer to memory to contain blocks. + * @param name Name of the pool. + * + * @return os_error_t + */ +os_error_t os_mempool_init(struct os_mempool *mp, uint16_t blocks, + uint32_t block_size, void *membuf, char *name); + +/** + * Initializes an extended memory pool. Extended attributes (e.g., callbacks) + * are not specified when this function is called; they are assigned manually + * after initialization. + * + * @param mpe The extended memory pool to initialize. + * @param blocks The number of blocks in the pool. + * @param block_size The size of each block, in bytes. + * @param membuf Pointer to memory to contain blocks. + * @param name Name of the pool. + * + * @return os_error_t + */ +os_error_t os_mempool_ext_init(struct os_mempool_ext *mpe, uint16_t blocks, + uint32_t block_size, void *membuf, char *name); + +/** + * Removes the specified mempool from the list of initialized mempools. + * + * @param mp The mempool to unregister. + * + * @return 0 on success; + * OS_INVALID_PARM if the mempool is not + * registered. + */ +os_error_t os_mempool_unregister(struct os_mempool *mp); + +/** + * Clears a memory pool. + * + * @param mp The mempool to clear. + * + * @return os_error_t + */ +os_error_t os_mempool_clear(struct os_mempool *mp); + +/** + * Performs an integrity check of the specified mempool. This function + * attempts to detect memory corruption in the specified memory pool. + * + * @param mp The mempool to check. + * + * @return true if the memory pool passes the integrity + * check; + * false if the memory pool is corrupt. + */ +bool os_mempool_is_sane(const struct os_mempool *mp); + +/** + * Checks if a memory block was allocated from the specified mempool. + * + * @param mp The mempool to check as parent. + * @param block_addr The memory block to check as child. + * + * @return 0 if the block does not belong to the mempool; + * 1 if the block does belong to the mempool. + */ +int os_memblock_from(const struct os_mempool *mp, const void *block_addr); + +/** + * Get a memory block from a memory pool + * + * @param mp Pointer to the memory pool + * + * @return void* Pointer to block if available; NULL otherwise + */ +void *os_memblock_get(struct os_mempool *mp); + +/** + * Puts the memory block back into the pool, ignoring the put callback, if any. + * This function should only be called from a put callback to free a block + * without causing infinite recursion. + * + * @param mp Pointer to memory pool + * @param block_addr Pointer to memory block + * + * @return os_error_t + */ +os_error_t os_memblock_put_from_cb(struct os_mempool *mp, void *block_addr); + +/** + * Puts the memory block back into the pool + * + * @param mp Pointer to memory pool + * @param block_addr Pointer to memory block + * + * @return os_error_t + */ +os_error_t os_memblock_put(struct os_mempool *mp, void *block_addr); + +#ifdef __cplusplus +} +#endif + +#endif /* _OS_MEMPOOL_H_ */ + + +/** + * @} OSMempool + * @} OSKernel + */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_trace_api.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_trace_api.h new file mode 100644 index 000000000..d9fc66dac --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/os_trace_api.h @@ -0,0 +1,277 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 OS_TRACE_API_H +#define OS_TRACE_API_H + +#ifdef __ASSEMBLER__ + +#define os_trace_isr_enter SEGGER_SYSVIEW_RecordEnterISR +#define os_trace_isr_exit SEGGER_SYSVIEW_RecordExitISR +#define os_trace_task_start_exec SEGGER_SYSVIEW_OnTaskStartExec + +#else + +#include +#include +#include "syscfg/syscfg.h" +#if MYNEWT_VAL(OS_SYSVIEW) +#include "sysview/vendor/SEGGER_SYSVIEW.h" +#endif +#include "os/os.h" + +#define OS_TRACE_ID_EVENTQ_PUT (40) +#define OS_TRACE_ID_EVENTQ_GET_NO_WAIT (41) +#define OS_TRACE_ID_EVENTQ_GET (42) +#define OS_TRACE_ID_EVENTQ_REMOVE (43) +#define OS_TRACE_ID_EVENTQ_POLL_0TIMO (44) +#define OS_TRACE_ID_EVENTQ_POLL (45) +#define OS_TRACE_ID_MUTEX_INIT (50) +#define OS_TRACE_ID_MUTEX_RELEASE (51) +#define OS_TRACE_ID_MUTEX_PEND (52) +#define OS_TRACE_ID_SEM_INIT (60) +#define OS_TRACE_ID_SEM_RELEASE (61) +#define OS_TRACE_ID_SEM_PEND (62) +#define OS_TRACE_ID_CALLOUT_INIT (70) +#define OS_TRACE_ID_CALLOUT_STOP (71) +#define OS_TRACE_ID_CALLOUT_RESET (72) +#define OS_TRACE_ID_CALLOUT_TICK (73) +#define OS_TRACE_ID_MEMBLOCK_GET (80) +#define OS_TRACE_ID_MEMBLOCK_PUT_FROM_CB (81) +#define OS_TRACE_ID_MEMBLOCK_PUT (82) +#define OS_TRACE_ID_MBUF_GET (90) +#define OS_TRACE_ID_MBUF_GET_PKTHDR (91) +#define OS_TRACE_ID_MBUF_FREE (92) +#define OS_TRACE_ID_MBUF_FREE_CHAIN (93) + +#if MYNEWT_VAL(OS_SYSVIEW) + +typedef struct SEGGER_SYSVIEW_MODULE_STRUCT os_trace_module_t; + +static inline uint32_t +os_trace_module_register(os_trace_module_t *m, const char *name, + uint32_t num_events, void (* send_desc_func)(void)) +{ + char *desc = "M=???"; + + asprintf(&desc, "M=%s", name); + + memset(m, 0, sizeof(*m)); + m->sModule = desc; + m->NumEvents = num_events; + m->pfSendModuleDesc = send_desc_func; + + SEGGER_SYSVIEW_RegisterModule(m); + + return m->EventOffset; +} + +static inline void +os_trace_module_desc(const os_trace_module_t *m, const char *desc) +{ + SEGGER_SYSVIEW_RecordModuleDescription(m, desc); +} + +static inline void +os_trace_isr_enter(void) +{ + SEGGER_SYSVIEW_RecordEnterISR(); +} + +static inline void +os_trace_isr_exit(void) +{ + SEGGER_SYSVIEW_RecordExitISR(); +} + +static inline void +os_trace_task_info(const struct ble_npl_task *t) +{ + SEGGER_SYSVIEW_TASKINFO ti; + + ti.TaskID = (uint32_t)t; + ti.sName = t->t_name; + ti.Prio = t->t_prio; + ti.StackSize = t->t_stacksize * sizeof(os_stack_t); + ti.StackBase = (uint32_t)&t->t_stackbottom + ti.StackSize; + + SEGGER_SYSVIEW_SendTaskInfo(&ti); +} + +static inline void +os_trace_task_create(const struct ble_npl_task *t) +{ + SEGGER_SYSVIEW_OnTaskCreate((uint32_t)t); +} + +static inline void +os_trace_task_start_exec(const struct ble_npl_task *t) +{ + SEGGER_SYSVIEW_OnTaskStartExec((uint32_t)t); +} + +static inline void +os_trace_task_stop_exec(void) +{ + SEGGER_SYSVIEW_OnTaskStopExec(); +} + +static inline void +os_trace_task_start_ready(const struct ble_npl_task *t) +{ + SEGGER_SYSVIEW_OnTaskStartReady((uint32_t)t); +} + +static inline void +os_trace_task_stop_ready(const struct ble_npl_task *t, unsigned reason) +{ + SEGGER_SYSVIEW_OnTaskStopReady((uint32_t)t, reason); +} + +static inline void +os_trace_idle(void) +{ + SEGGER_SYSVIEW_OnIdle(); +} + +static inline void +os_trace_user_start(unsigned id) +{ + SEGGER_SYSVIEW_OnUserStart(id); +} + +static inline void +os_trace_user_stop(unsigned id) +{ + SEGGER_SYSVIEW_OnUserStop(id); +} + +#endif /* MYNEWT_VAL(OS_SYSVIEW) */ + +#if MYNEWT_VAL(OS_SYSVIEW) && !defined(OS_TRACE_DISABLE_FILE_API) + +static inline void +os_trace_api_void(unsigned id) +{ + SEGGER_SYSVIEW_RecordVoid(id); +} + +static inline void +os_trace_api_u32(unsigned id, uint32_t p0) +{ + SEGGER_SYSVIEW_RecordU32(id, p0); +} + +static inline void +os_trace_api_u32x2(unsigned id, uint32_t p0, uint32_t p1) +{ + SEGGER_SYSVIEW_RecordU32x2(id, p0, p1); +} + +static inline void +os_trace_api_u32x3(unsigned id, uint32_t p0, uint32_t p1, uint32_t p2) +{ + SEGGER_SYSVIEW_RecordU32x3(id, p0, p1, p2); +} + +static inline void +os_trace_api_ret(unsigned id) +{ + SEGGER_SYSVIEW_RecordEndCall(id); +} + +static inline void +os_trace_api_ret_u32(unsigned id, uint32_t ret) +{ + SEGGER_SYSVIEW_RecordEndCallU32(id, ret); +} + +#endif /* MYNEWT_VAL(OS_SYSVIEW) && !defined(OS_TRACE_DISABLE_FILE_API) */ + +#if !MYNEWT_VAL(OS_SYSVIEW) + +static inline void +os_trace_isr_enter(void) +{ +} + +static inline void +os_trace_isr_exit(void) +{ +} + +static inline void +os_trace_task_stop_exec(void) +{ +} + +static inline void +os_trace_idle(void) +{ +} + +static inline void +os_trace_user_start(unsigned id) +{ +} + +static inline void +os_trace_user_stop(unsigned id) +{ +} + +#endif /* !MYNEWT_VAL(OS_SYSVIEW) */ + +#if !MYNEWT_VAL(OS_SYSVIEW) || defined(OS_TRACE_DISABLE_FILE_API) + +static inline void +os_trace_api_void(unsigned id) +{ +} + +static inline void +os_trace_api_u32(unsigned id, uint32_t p0) +{ +} + +static inline void +os_trace_api_u32x2(unsigned id, uint32_t p0, uint32_t p1) +{ +} + +static inline void +os_trace_api_u32x3(unsigned id, uint32_t p0, uint32_t p1, uint32_t p2) +{ +} + +static inline void +os_trace_api_ret(unsigned id) +{ +} + +static inline void +os_trace_api_ret_u32(unsigned id, uint32_t return_value) +{ +} + +#endif /* !MYNEWT_VAL(OS_SYSVIEW) || defined(OS_TRACE_DISABLE_FILE_API) */ + +#endif /* __ASSEMBLER__ */ + +#endif /* OS_TRACE_API_H */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/queue.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/queue.h new file mode 100644 index 000000000..c19edb113 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/queue.h @@ -0,0 +1,522 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + * $FreeBSD: src/sys/sys/queue.h,v 1.32.2.7 2002/04/17 14:21:02 des Exp $ + */ + +#ifndef _QUEUE_H_ +#define _QUEUE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This file defines five types of data structures: singly-linked lists, + * singly-linked tail queues, lists, tail queues, and circular queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * A circle queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the list. + * A circle queue may be traversed in either direction, but has a more + * complex end of list detection. + * + * For details on the use of these macros, see the queue(3) manual page. + * + * + * SLIST LIST STAILQ TAILQ CIRCLEQ + * _HEAD + + + + + + * _HEAD_INITIALIZER + + + + + + * _ENTRY + + + + + + * _INIT + + + + + + * _EMPTY + + + + + + * _FIRST + + + + + + * _NEXT + + + + + + * _PREV - - - + + + * _LAST - - + + + + * _FOREACH + + + + + + * _FOREACH_REVERSE - - - + + + * _INSERT_HEAD + + + + + + * _INSERT_BEFORE - + - + + + * _INSERT_AFTER + + + + + + * _INSERT_TAIL - - + + + + * _REMOVE_HEAD + - + - - + * _REMOVE + + + + + + * + */ + +/* + * Singly-linked List declarations. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) + +#define SLIST_FIRST(head) ((head)->slh_first) + +#define SLIST_FOREACH(var, head, field) \ + for ((var) = SLIST_FIRST((head)); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#define SLIST_INIT(head) do { \ + SLIST_FIRST((head)) = NULL; \ +} while (0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ + SLIST_NEXT((slistelm), field) = (elm); \ +} while (0) + +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ + SLIST_FIRST((head)) = (elm); \ +} while (0) + +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define SLIST_REMOVE(head, elm, type, field) do { \ + if (SLIST_FIRST((head)) == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = SLIST_FIRST((head)); \ + while (SLIST_NEXT(curelm, field) != (elm)) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_NEXT(curelm, field) = \ + SLIST_NEXT(SLIST_NEXT(curelm, field), field); \ + } \ +} while (0) + +#define SLIST_REMOVE_HEAD(head, field) do { \ + SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ +} while (0) + +/* + * Singly-linked Tail queue declarations. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) + +#define STAILQ_FIRST(head) ((head)->stqh_first) + +#define STAILQ_FOREACH(var, head, field) \ + for((var) = STAILQ_FIRST((head)); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + +#define STAILQ_INIT(head) do { \ + STAILQ_FIRST((head)) = NULL; \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_NEXT((tqelm), field) = (elm); \ +} while (0) + +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_FIRST((head)) = (elm); \ +} while (0) + +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + STAILQ_NEXT((elm), field) = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY(head) ? \ + NULL : \ + ((struct type *) \ + ((char *)((head)->stqh_last) - offsetof(struct type, field)))) + +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + +#define STAILQ_REMOVE(head, elm, type, field) do { \ + if (STAILQ_FIRST((head)) == (elm)) { \ + STAILQ_REMOVE_HEAD(head, field); \ + } \ + else { \ + struct type *curelm = STAILQ_FIRST((head)); \ + while (STAILQ_NEXT(curelm, field) != (elm)) \ + curelm = STAILQ_NEXT(curelm, field); \ + if ((STAILQ_NEXT(curelm, field) = \ + STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((curelm), field);\ + } \ +} while (0) + +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if ((STAILQ_FIRST((head)) = \ + STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ + if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_REMOVE_AFTER(head, elm, field) do { \ + if ((STAILQ_NEXT(elm, field) = \ + STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +/* + * List declarations. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ + +#define LIST_EMPTY(head) ((head)->lh_first == NULL) + +#define LIST_FIRST(head) ((head)->lh_first) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = LIST_FIRST((head)); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#define LIST_INIT(head) do { \ + LIST_FIRST((head)) = NULL; \ +} while (0) + +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ + LIST_NEXT((listelm), field)->field.le_prev = \ + &LIST_NEXT((elm), field); \ + LIST_NEXT((listelm), field) = (elm); \ + (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ +} while (0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + LIST_NEXT((elm), field) = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ +} while (0) + +#define LIST_INSERT_HEAD(head, elm, field) do { \ + if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ + LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ + LIST_FIRST((head)) = (elm); \ + (elm)->field.le_prev = &LIST_FIRST((head)); \ +} while (0) + +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define LIST_REMOVE(elm, field) do { \ + if (LIST_NEXT((elm), field) != NULL) \ + LIST_NEXT((elm), field)->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = LIST_NEXT((elm), field); \ +} while (0) + +/* + * Tail queue declarations. + */ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ +} + +#define TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} + +/* + * Tail queue functions. + */ +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) + +#define TAILQ_FIRST(head) ((head)->tqh_first) + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = TAILQ_FIRST((head)); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#define TAILQ_INIT(head) do { \ + TAILQ_FIRST((head)) = NULL; \ + (head)->tqh_last = &TAILQ_FIRST((head)); \ +} while (0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + TAILQ_NEXT((listelm), field) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ +} while (0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + TAILQ_NEXT((elm), field) = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ +} while (0) + +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ + TAILQ_FIRST((head))->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + TAILQ_FIRST((head)) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ +} while (0) + +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + TAILQ_NEXT((elm), field) = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ +} while (0) + +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) + +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + +#define TAILQ_REMOVE(head, elm, field) do { \ + if ((TAILQ_NEXT((elm), field)) != NULL) \ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ +} while (0) + +/* + * Circular queue declarations. + */ +#define CIRCLEQ_HEAD(name, type) \ +struct name { \ + struct type *cqh_first; /* first element */ \ + struct type *cqh_last; /* last element */ \ +} + +#define CIRCLEQ_HEAD_INITIALIZER(head) \ + { (void *)&(head), (void *)&(head) } + +#define CIRCLEQ_ENTRY(type) \ +struct { \ + struct type *cqe_next; /* next element */ \ + struct type *cqe_prev; /* previous element */ \ +} + +/* + * Circular queue functions. + */ +#define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) + +#define CIRCLEQ_FIRST(head) ((head)->cqh_first) + +#define CIRCLEQ_FOREACH(var, head, field) \ + for ((var) = CIRCLEQ_FIRST((head)); \ + (var) != (void *)(head) || ((var) = NULL); \ + (var) = CIRCLEQ_NEXT((var), field)) + +#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ + for ((var) = CIRCLEQ_LAST((head)); \ + (var) != (void *)(head) || ((var) = NULL); \ + (var) = CIRCLEQ_PREV((var), field)) + +#define CIRCLEQ_INIT(head) do { \ + CIRCLEQ_FIRST((head)) = (void *)(head); \ + CIRCLEQ_LAST((head)) = (void *)(head); \ +} while (0) + +#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + CIRCLEQ_NEXT((elm), field) = CIRCLEQ_NEXT((listelm), field); \ + CIRCLEQ_PREV((elm), field) = (listelm); \ + if (CIRCLEQ_NEXT((listelm), field) == (void *)(head)) \ + CIRCLEQ_LAST((head)) = (elm); \ + else \ + CIRCLEQ_PREV(CIRCLEQ_NEXT((listelm), field), field) = (elm);\ + CIRCLEQ_NEXT((listelm), field) = (elm); \ +} while (0) + +#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ + CIRCLEQ_NEXT((elm), field) = (listelm); \ + CIRCLEQ_PREV((elm), field) = CIRCLEQ_PREV((listelm), field); \ + if (CIRCLEQ_PREV((listelm), field) == (void *)(head)) \ + CIRCLEQ_FIRST((head)) = (elm); \ + else \ + CIRCLEQ_NEXT(CIRCLEQ_PREV((listelm), field), field) = (elm);\ + CIRCLEQ_PREV((listelm), field) = (elm); \ +} while (0) + +#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ + CIRCLEQ_NEXT((elm), field) = CIRCLEQ_FIRST((head)); \ + CIRCLEQ_PREV((elm), field) = (void *)(head); \ + if (CIRCLEQ_LAST((head)) == (void *)(head)) \ + CIRCLEQ_LAST((head)) = (elm); \ + else \ + CIRCLEQ_PREV(CIRCLEQ_FIRST((head)), field) = (elm); \ + CIRCLEQ_FIRST((head)) = (elm); \ +} while (0) + +#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ + CIRCLEQ_NEXT((elm), field) = (void *)(head); \ + CIRCLEQ_PREV((elm), field) = CIRCLEQ_LAST((head)); \ + if (CIRCLEQ_FIRST((head)) == (void *)(head)) \ + CIRCLEQ_FIRST((head)) = (elm); \ + else \ + CIRCLEQ_NEXT(CIRCLEQ_LAST((head)), field) = (elm); \ + CIRCLEQ_LAST((head)) = (elm); \ +} while (0) + +#define CIRCLEQ_LAST(head) ((head)->cqh_last) + +#define CIRCLEQ_NEXT(elm,field) ((elm)->field.cqe_next) + +#define CIRCLEQ_PREV(elm,field) ((elm)->field.cqe_prev) + +#define CIRCLEQ_REMOVE(head, elm, field) do { \ + if (CIRCLEQ_NEXT((elm), field) == (void *)(head)) \ + CIRCLEQ_LAST((head)) = CIRCLEQ_PREV((elm), field); \ + else \ + CIRCLEQ_PREV(CIRCLEQ_NEXT((elm), field), field) = \ + CIRCLEQ_PREV((elm), field); \ + if (CIRCLEQ_PREV((elm), field) == (void *)(head)) \ + CIRCLEQ_FIRST((head)) = CIRCLEQ_NEXT((elm), field); \ + else \ + CIRCLEQ_NEXT(CIRCLEQ_PREV((elm), field), field) = \ + CIRCLEQ_NEXT((elm), field); \ +} while (0) + +#ifdef __cplusplus +} +#endif + +#endif /* !_SYS_QUEUE_H_ */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/util.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/util.h new file mode 100644 index 000000000..3e59670c4 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/os/util.h @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 H_OS_UTIL_ +#define H_OS_UTIL_ + +/* Helpers to pass integers as pointers and vice-versa */ +#define POINTER_TO_UINT(p) ((unsigned int) ((uintptr_t) (p))) +#define UINT_TO_POINTER(u) ((void *) ((uintptr_t) (u))) +#define POINTER_TO_INT(p) ((int) ((intptr_t) (p))) +#define INT_TO_POINTER(u) ((void *) ((intptr_t) (u))) + +/* Helper to retrieve pointer to "parent" object in structure */ +#define CONTAINER_OF(ptr, type, field) \ + ((type *)(((char *)(ptr)) - offsetof(type, field))) + +/* Helper to calculate number of elements in array */ +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(array) \ + (sizeof(array) / sizeof((array)[0])) +#endif +#endif diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/stats/stats.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/stats/stats.h new file mode 100644 index 000000000..996bcbc72 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/stats/stats.h @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 __STATS_H__ +#define __STATS_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define STATS_SECT_DECL(__name) struct stats_ ## __name +#define STATS_SECT_END }; + +#define STATS_SECT_START(__name) STATS_SECT_DECL(__name) { +#define STATS_SECT_VAR(__var) + +#define STATS_HDR(__sectname) NULL + +#define STATS_SECT_ENTRY(__var) +#define STATS_SECT_ENTRY16(__var) +#define STATS_SECT_ENTRY32(__var) +#define STATS_SECT_ENTRY64(__var) +#define STATS_RESET(__var) + +#define STATS_SIZE_INIT_PARMS(__sectvarname, __size) \ + 0, 0 + +#define STATS_INC(__sectvarname, __var) +#define STATS_INCN(__sectvarname, __var, __n) +#define STATS_CLEAR(__sectvarname, __var) + +#define STATS_NAME_START(__name) +#define STATS_NAME(__name, __entry) +#define STATS_NAME_END(__name) +#define STATS_NAME_INIT_PARMS(__name) NULL, 0 + +static inline int +stats_init(void *a, uint8_t b, uint8_t c, void *d, uint8_t e) +{ + /* dummy */ + return 0; +} + +static inline int +stats_register(void *a, void *b) +{ + /* dummy */ + return 0; +} + +static inline int +stats_init_and_reg(void *a, uint8_t b, uint8_t c, void *d, uint8_t e, void *f) +{ + /* dummy */ + return 0; +} + +#ifdef __cplusplus +} +#endif + +#endif /* __STATS_H__ */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/sysflash/sysflash.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/sysflash/sysflash.h new file mode 100644 index 000000000..2f4d843f4 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/sysflash/sysflash.h @@ -0,0 +1,51 @@ +/** + * This file was generated by Apache newt version: 1.12.0-dev + */ + +#ifndef H_MYNEWT_SYSFLASH_ +#define H_MYNEWT_SYSFLASH_ + +#include "flash_map/flash_map.h" + +#define FLASH_AREA_COUNT 6 + +/** + * This flash map definition is used for two purposes: + * 1. To locate the meta area, which contains the true flash map definition. + * 2. As a fallback in case the meta area cannot be read from flash. + */ +extern const struct flash_area sysflash_map_dflt[FLASH_AREA_COUNT]; + +/* Flash map was defined in @apache-mynewt-core/hw/bsp/native */ + +#define FLASH_AREA_BOOTLOADER 0 +#define FLASH_AREA_BOOTLOADER_DEVICE 0 +#define FLASH_AREA_BOOTLOADER_OFFSET 0x00000000 +#define FLASH_AREA_BOOTLOADER_SIZE 16384 + +#define FLASH_AREA_IMAGE_0 1 +#define FLASH_AREA_IMAGE_0_DEVICE 0 +#define FLASH_AREA_IMAGE_0_OFFSET 0x00020000 +#define FLASH_AREA_IMAGE_0_SIZE 393216 + +#define FLASH_AREA_IMAGE_1 2 +#define FLASH_AREA_IMAGE_1_DEVICE 0 +#define FLASH_AREA_IMAGE_1_OFFSET 0x00080000 +#define FLASH_AREA_IMAGE_1_SIZE 393216 + +#define FLASH_AREA_IMAGE_SCRATCH 3 +#define FLASH_AREA_IMAGE_SCRATCH_DEVICE 0 +#define FLASH_AREA_IMAGE_SCRATCH_OFFSET 0x000e0000 +#define FLASH_AREA_IMAGE_SCRATCH_SIZE 131072 + +#define FLASH_AREA_REBOOT_LOG 16 +#define FLASH_AREA_REBOOT_LOG_DEVICE 0 +#define FLASH_AREA_REBOOT_LOG_OFFSET 0x00004000 +#define FLASH_AREA_REBOOT_LOG_SIZE 16384 + +#define FLASH_AREA_NFFS 17 +#define FLASH_AREA_NFFS_DEVICE 0 +#define FLASH_AREA_NFFS_OFFSET 0x00008000 +#define FLASH_AREA_NFFS_SIZE 32768 + +#endif diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/sysinit/sysinit.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/sysinit/sysinit.h new file mode 100644 index 000000000..3ff5334b0 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/include/sysinit/sysinit.h @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 __SYSINIT_H__ +#define __SYSINIT_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SYSINIT_ASSERT_ACTIVE() + +#define SYSINIT_PANIC_ASSERT(rc) assert(rc) +#define SYSINIT_PANIC_ASSERT_MSG(rc, msg) assert(rc) + +#ifdef __cplusplus +} +#endif + +#endif /* __SYSINIT_H__ */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/endian.c b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/endian.c new file mode 100644 index 000000000..1f5db2eaa --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/endian.c @@ -0,0 +1,268 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include "os/endian.h" + +void +put_le16(void *buf, uint16_t x) +{ + uint8_t *u8ptr; + + u8ptr = buf; + u8ptr[0] = (uint8_t)x; + u8ptr[1] = (uint8_t)(x >> 8); +} + +void +put_le24(void *buf, uint32_t x) +{ + uint8_t *u8ptr; + + u8ptr = buf; + u8ptr[0] = (uint8_t)x; + u8ptr[1] = (uint8_t)(x >> 8); + u8ptr[2] = (uint8_t)(x >> 16); +} + +void +put_le32(void *buf, uint32_t x) +{ + uint8_t *u8ptr; + + u8ptr = buf; + u8ptr[0] = (uint8_t)x; + u8ptr[1] = (uint8_t)(x >> 8); + u8ptr[2] = (uint8_t)(x >> 16); + u8ptr[3] = (uint8_t)(x >> 24); +} + +void +put_le64(void *buf, uint64_t x) +{ + uint8_t *u8ptr; + + u8ptr = buf; + u8ptr[0] = (uint8_t)x; + u8ptr[1] = (uint8_t)(x >> 8); + u8ptr[2] = (uint8_t)(x >> 16); + u8ptr[3] = (uint8_t)(x >> 24); + u8ptr[4] = (uint8_t)(x >> 32); + u8ptr[5] = (uint8_t)(x >> 40); + u8ptr[6] = (uint8_t)(x >> 48); + u8ptr[7] = (uint8_t)(x >> 56); +} + +uint16_t +get_le16(const void *buf) +{ + const uint8_t *u8ptr; + uint16_t x; + + u8ptr = buf; + x = u8ptr[0]; + x |= (uint16_t)u8ptr[1] << 8; + + return x; +} + +uint32_t +get_le24(const void *buf) +{ + const uint8_t *u8ptr; + uint32_t x; + + u8ptr = buf; + x = u8ptr[0]; + x |= (uint32_t)u8ptr[1] << 8; + x |= (uint32_t)u8ptr[2] << 16; + + return x; +} + +uint32_t +get_le32(const void *buf) +{ + const uint8_t *u8ptr; + uint32_t x; + + u8ptr = buf; + x = u8ptr[0]; + x |= (uint32_t)u8ptr[1] << 8; + x |= (uint32_t)u8ptr[2] << 16; + x |= (uint32_t)u8ptr[3] << 24; + + return x; +} + +uint64_t +get_le64(const void *buf) +{ + const uint8_t *u8ptr; + uint64_t x; + + u8ptr = buf; + x = u8ptr[0]; + x |= (uint64_t)u8ptr[1] << 8; + x |= (uint64_t)u8ptr[2] << 16; + x |= (uint64_t)u8ptr[3] << 24; + x |= (uint64_t)u8ptr[4] << 32; + x |= (uint64_t)u8ptr[5] << 40; + x |= (uint64_t)u8ptr[6] << 48; + x |= (uint64_t)u8ptr[7] << 56; + + return x; +} + +void +put_be16(void *buf, uint16_t x) +{ + uint8_t *u8ptr; + + u8ptr = buf; + u8ptr[0] = (uint8_t)(x >> 8); + u8ptr[1] = (uint8_t)x; +} + +void +put_be24(void *buf, uint32_t x) +{ + uint8_t *u8ptr; + + u8ptr = buf; + u8ptr[0] = (uint8_t)(x >> 16); + u8ptr[1] = (uint8_t)(x >> 8); + u8ptr[2] = (uint8_t)x; +} + +void +put_be32(void *buf, uint32_t x) +{ + uint8_t *u8ptr; + + u8ptr = buf; + u8ptr[0] = (uint8_t)(x >> 24); + u8ptr[1] = (uint8_t)(x >> 16); + u8ptr[2] = (uint8_t)(x >> 8); + u8ptr[3] = (uint8_t)x; +} + +void +put_be64(void *buf, uint64_t x) +{ + uint8_t *u8ptr; + + u8ptr = buf; + u8ptr[0] = (uint8_t)(x >> 56); + u8ptr[1] = (uint8_t)(x >> 48); + u8ptr[2] = (uint8_t)(x >> 40); + u8ptr[3] = (uint8_t)(x >> 32); + u8ptr[4] = (uint8_t)(x >> 24); + u8ptr[5] = (uint8_t)(x >> 16); + u8ptr[6] = (uint8_t)(x >> 8); + u8ptr[7] = (uint8_t)x; +} + +uint16_t +get_be16(const void *buf) +{ + const uint8_t *u8ptr; + uint16_t x; + + u8ptr = buf; + x = (uint16_t)u8ptr[0] << 8; + x |= u8ptr[1]; + + return x; +} + +uint32_t +get_be24(const void *buf) +{ + const uint8_t *u8ptr; + uint32_t x; + + u8ptr = buf; + x = (uint32_t)u8ptr[0] << 16; + x |= (uint32_t)u8ptr[1] << 8; + x |= (uint32_t)u8ptr[2]; + + return x; +} + +uint32_t +get_be32(const void *buf) +{ + const uint8_t *u8ptr; + uint32_t x; + + u8ptr = buf; + x = (uint32_t)u8ptr[0] << 24; + x |= (uint32_t)u8ptr[1] << 16; + x |= (uint32_t)u8ptr[2] << 8; + x |= u8ptr[3]; + + return x; +} + +uint64_t +get_be64(const void *buf) +{ + const uint8_t *u8ptr; + uint64_t x; + + u8ptr = buf; + x = (uint64_t)u8ptr[0] << 56; + x |= (uint64_t)u8ptr[1] << 48; + x |= (uint64_t)u8ptr[2] << 40; + x |= (uint64_t)u8ptr[3] << 32; + x |= (uint64_t)u8ptr[4] << 24; + x |= (uint64_t)u8ptr[5] << 16; + x |= (uint64_t)u8ptr[6] << 8; + x |= u8ptr[7]; + + return x; +} +void +swap_in_place(void *buf, int len) +{ + uint8_t *u8ptr; + uint8_t tmp; + int i; + int j; + + u8ptr = buf; + + for (i = 0, j = len - 1; i < j; i++, j--) { + tmp = u8ptr[i]; + + u8ptr[i] = u8ptr[j]; + u8ptr[j] = tmp; + } +} + +/* swap octets */ +void +swap_buf(uint8_t *dst, const uint8_t *src, int len) +{ + int i; + + for (i = 0; i < len; i++) { + dst[len - 1 - i] = src[i]; + } +} diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/mem.c b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/mem.c new file mode 100644 index 000000000..6bd6eec7a --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/mem.c @@ -0,0 +1,324 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include "os/os.h" +#include "mem/mem.h" + +/** + * Generic mempool allocation function. Used with basic and extended mempools. + */ +static int +mem_malloc_mempool_gen(uint16_t num_blocks, uint32_t block_size, + void **out_buf) +{ + block_size = OS_ALIGN(block_size, OS_ALIGNMENT); + + if (num_blocks > 0) { + *out_buf = malloc(OS_MEMPOOL_BYTES(num_blocks, block_size)); + if (*out_buf == NULL) { + return OS_ENOMEM; + } + } else { + *out_buf = NULL; + } + + return 0; +} + +/** + * Mallocs a block of memory and initializes a mempool to use it. + * + * @param mempool The mempool to initialize. + * @param num_blocks The total number of memory blocks in the + * mempool. + * @param block_size The size of each mempool entry. + * @param name The name to give the mempool. + * @param out_buf On success, this points to the malloced memory. + * Pass NULL if you don't need this + * information. + * + * @return 0 on success; + * OS_ENOMEM on malloc failure; + * Other OS code on unexpected error. + */ +int +mem_malloc_mempool(struct os_mempool *mempool, uint16_t num_blocks, + uint32_t block_size, char *name, void **out_buf) +{ + void *buf; + int rc; + + rc = mem_malloc_mempool_gen(num_blocks, block_size, &buf); + if (rc != 0) { + return rc; + } + + rc = os_mempool_init(mempool, num_blocks, block_size, buf, name); + if (rc != 0) { + free(buf); + return rc; + } + + if (out_buf != NULL) { + *out_buf = buf; + } + + return 0; +} + +/** + * Mallocs a block of memory and initializes an extended mempool to use it. + * + * @param mpe The extended mempool to initialize. + * @param num_blocks The total number of memory blocks in the + * mempool. + * @param block_size The size of each mempool entry. + * @param name The name to give the mempool. + * @param out_buf On success, this points to the malloced memory. + * Pass NULL if you don't need this + * information. + * + * @return 0 on success; + * OS_ENOMEM on malloc failure; + * Other OS code on unexpected error. + */ +int +mem_malloc_mempool_ext(struct os_mempool_ext *mpe, uint16_t num_blocks, + uint32_t block_size, char *name, void **out_buf) +{ + void *buf; + int rc; + + rc = mem_malloc_mempool_gen(num_blocks, block_size, &buf); + if (rc != 0) { + return rc; + } + + rc = os_mempool_ext_init(mpe, num_blocks, block_size, buf, name); + if (rc != 0) { + free(buf); + return rc; + } + + if (out_buf != NULL) { + *out_buf = buf; + } + + return 0; +} + +/** + * Mallocs a block of memory and initializes an mbuf pool to use it. The + * specified block_size indicates the size of an mbuf acquired from the pool if + * it does not contain a pkthdr. + * + * @param mempool The mempool to initialize. + * @param mbuf_pool The mbuf pool to initialize. + * @param num_blocks The total number of mbufs in the pool. + * @param block_size The size of each mbuf. + * @param name The name to give the mempool. + * @param out_buf On success, this points to the malloced memory. + * Pass NULL if you don't need this + * information. + * + * @return 0 on success; + * OS_ENOMEM on malloc failure; + * Other OS code on unexpected error. + */ +int +mem_malloc_mbuf_pool(struct os_mempool *mempool, + struct os_mbuf_pool *mbuf_pool, uint16_t num_blocks, + uint32_t block_size, char *name, + void **out_buf) +{ + void *buf; + int rc; + + block_size = OS_ALIGN(block_size + sizeof (struct os_mbuf), OS_ALIGNMENT); + + rc = mem_malloc_mempool(mempool, num_blocks, block_size, name, &buf); + if (rc != 0) { + return rc; + } + + rc = os_mbuf_pool_init(mbuf_pool, mempool, block_size, num_blocks); + if (rc != 0) { + free(buf); + return rc; + } + + if (out_buf != NULL) { + *out_buf = buf; + } + + return 0; +} + +/** + * Mallocs a block of memory and initializes an mbuf pool to use it. The + * specified block_size indicates the size of an mbuf acquired from the pool if + * it contains a pkthdr. + * + * @param mempool The mempool to initialize. + * @param mbuf_pool The mbuf pool to initialize. + * @param num_blocks The total number of mbufs in the pool. + * @param block_size The size of each mbuf. + * @param name The name to give the mempool. + * @param out_buf On success, this points to the malloced memory. + * Pass NULL if you don't need this + * information. + * + * @return 0 on success; + * OS_ENOMEM on malloc failure; + * Other OS code on unexpected error. + */ +int +mem_malloc_mbufpkt_pool(struct os_mempool *mempool, + struct os_mbuf_pool *mbuf_pool, int num_blocks, + int block_size, char *name, + void **out_buf) +{ + int rc; + + rc = mem_malloc_mbuf_pool(mempool, mbuf_pool, num_blocks, + block_size + sizeof (struct os_mbuf_pkthdr), + name, out_buf); + return rc; +} + +int +mem_init_mbuf_pool(void *mem, struct os_mempool *mempool, + struct os_mbuf_pool *mbuf_pool, int num_blocks, + int block_size, char *name) +{ + int rc; + + rc = os_mempool_init(mempool, num_blocks, block_size, mem, name); + if (rc != 0) { + return rc; + } + + rc = os_mbuf_pool_init(mbuf_pool, mempool, block_size, num_blocks); + if (rc != 0) { + return rc; + } + + return 0; +} + +/* + * Splits an appropriately-sized fragment from the front of an mbuf chain, as + * neeeded. If the length of the mbuf chain greater than specified maximum + * fragment size, a new mbuf is allocated, and data is moved from the source + * mbuf to the new mbuf. If the mbuf chain is small enough to fit in a single + * fragment, the source mbuf itself is returned unmodified, and the suplied + * pointer is set to NULL. + * + * This function is expected to be called in a loop until the entire mbuf chain + * has been consumed. For example: + * + * struct os_mbuf *frag; + * struct os_mbuf *rsp; + * // [...] + * while (rsp != NULL) { + * frag = mem_split_frag(&rsp, get_mtu(), frag_alloc, NULL); + * if (frag == NULL) { + * os_mbuf_free_chain(rsp); + * return OS_ENOMEM; + * } + * send_packet(frag) + * } + * + * @param om The packet to fragment. Upon fragmentation, + * this mbuf is adjusted such that the + * fragment data is removed. If the packet + * constitutes a single fragment, this gets + * set to NULL on success. + * @param max_frag_sz The maximum payload size of a fragment. + * Typically this is the MTU of the + * connection. + * @param alloc_cb Points to a function that allocates an mbuf to + * hold a fragment. This function gets called + * before the source mbuf chain is modified, + * so it can safely inspect it. + * @param cb_arg Generic parameter that gets passed to the + * callback function. + * + * @return The next fragment to send on success; + * NULL on failure. + */ +struct os_mbuf * +mem_split_frag(struct os_mbuf **om, uint16_t max_frag_sz, + mem_frag_alloc_fn *alloc_cb, void *cb_arg) +{ + struct os_mbuf *frag; + int rc; + + if (OS_MBUF_PKTLEN(*om) <= max_frag_sz) { + /* Final fragment. */ + frag = *om; + *om = NULL; + return frag; + } + + /* Packet needs to be split. Allocate a new buffer for the fragment. */ + frag = alloc_cb(max_frag_sz, cb_arg); + if (frag == NULL) { + goto err; + } + + /* Move data from the front of the packet into the fragment mbuf. */ + rc = os_mbuf_appendfrom(frag, *om, 0, max_frag_sz); + if (rc != 0) { + goto err; + } + os_mbuf_adj(*om, max_frag_sz); + + /* Free unused portion of of source mbuf chain, if possible. */ + *om = os_mbuf_trim_front(*om); + + return frag; + +err: + os_mbuf_free_chain(frag); + return NULL; +} + +/** + * Applies a pullup operation to the supplied mbuf and returns a pointer to the + * start of the mbuf data. This is simply a convenience function which allows + * the user to access the mbuf data without a cast. On failure, the provided + * mbuf is freed. + * + * @param om The mbuf to pull up. + * @param len The size of the object to pull up. + * + * @return The start of the pulled-up mbuf data. + */ +void * +mem_pullup_obj(struct os_mbuf **om, uint16_t len) +{ + *om = os_mbuf_pullup(*om, len); + if (*om == NULL) { + return NULL; + } + + return (*om)->om_data; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/nimble_port.c b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/nimble_port.c new file mode 100644 index 000000000..bb26f22a3 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/nimble_port.c @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include "os/os.h" +#include "sysinit/sysinit.h" +#include "host/ble_hs.h" +#include "nimble/nimble_port.h" +#include "nimble/transport.h" +#if NIMBLE_CFG_CONTROLLER +#include "controller/ble_ll.h" +#endif + +static struct ble_npl_eventq g_eventq_dflt; + +extern void os_msys_init(void); +extern void os_mempool_module_init(void); + +void +nimble_port_init(void) +{ + /* Initialize default event queue */ + ble_npl_eventq_init(&g_eventq_dflt); + /* Initialize the global memory pool */ + os_mempool_module_init(); + os_msys_init(); + /* Initialize transport */ + ble_transport_init(); + /* Initialize the host */ + ble_transport_hs_init(); + +#if NIMBLE_CFG_CONTROLLER +#ifndef RIOT_VERSION + hal_timer_init(5, NULL); + os_cputime_init(32768); +#endif +#endif + + /* Initialize the controller */ + ble_transport_ll_init(); +} + +void +nimble_port_run(void) +{ + struct ble_npl_event *ev; + + while (1) { + ev = ble_npl_eventq_get(&g_eventq_dflt, BLE_NPL_TIME_FOREVER); + ble_npl_event_run(ev); + } +} + +struct ble_npl_eventq * +nimble_port_get_dflt_eventq(void) +{ + return &g_eventq_dflt; +} + +#if NIMBLE_CFG_CONTROLLER +void +nimble_port_ll_task_func(void *arg) +{ + extern void ble_ll_task(void *); + + ble_ll_task(arg); +} +#endif diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/os_mbuf.c b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/os_mbuf.c new file mode 100644 index 000000000..f65907032 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/os_mbuf.c @@ -0,0 +1,1253 @@ +/* + * Software in this file is based heavily on code written in the FreeBSD source + * code repostiory. While the code is written from scratch, it contains + * many of the ideas and logic flow in the original source, this is a + * derivative work, and the following license applies as well: + * + * Copyright (c) 1982, 1986, 1988, 1991, 1993 + * The Regents of the University of California. 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + */ + +#include "os/os.h" +#include "os/os_trace_api.h" + +#include +#include +#include +#include + +#ifndef min +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef max +#define max(a, b) ((a) > (b) ? (a) : (b)) +#endif + +/** + * @addtogroup OSKernel + * @{ + * @defgroup OSMqueue Queue of Mbufs + * @{ + */ + +STAILQ_HEAD(, os_mbuf_pool) g_msys_pool_list = + STAILQ_HEAD_INITIALIZER(g_msys_pool_list); + + +int +os_mqueue_init(struct os_mqueue *mq, ble_npl_event_fn *ev_cb, void *arg) +{ + struct ble_npl_event *ev; + + STAILQ_INIT(&mq->mq_head); + + ev = &mq->mq_ev; + ble_npl_event_init(ev, ev_cb, arg); + + return (0); +} + +struct os_mbuf * +os_mqueue_get(struct os_mqueue *mq) +{ + struct os_mbuf_pkthdr *mp; + struct os_mbuf *m; + os_sr_t sr; + + OS_ENTER_CRITICAL(sr); + mp = STAILQ_FIRST(&mq->mq_head); + if (mp) { + STAILQ_REMOVE_HEAD(&mq->mq_head, omp_next); + } + OS_EXIT_CRITICAL(sr); + + if (mp) { + m = OS_MBUF_PKTHDR_TO_MBUF(mp); + } else { + m = NULL; + } + + return (m); +} + +int +os_mqueue_put(struct os_mqueue *mq, struct ble_npl_eventq *evq, struct os_mbuf *m) +{ + struct os_mbuf_pkthdr *mp; + os_sr_t sr; + int rc; + + /* Can only place the head of a chained mbuf on the queue. */ + if (!OS_MBUF_IS_PKTHDR(m)) { + rc = OS_EINVAL; + goto err; + } + + mp = OS_MBUF_PKTHDR(m); + + OS_ENTER_CRITICAL(sr); + STAILQ_INSERT_TAIL(&mq->mq_head, mp, omp_next); + OS_EXIT_CRITICAL(sr); + + /* Only post an event to the queue if its specified */ + if (evq) { + ble_npl_eventq_put(evq, &mq->mq_ev); + } + + return (0); +err: + return (rc); +} + +int +os_msys_register(struct os_mbuf_pool *new_pool) +{ + struct os_mbuf_pool *pool; + + pool = NULL; + STAILQ_FOREACH(pool, &g_msys_pool_list, omp_next) { + if (new_pool->omp_databuf_len > pool->omp_databuf_len) { + break; + } + } + + if (pool) { + STAILQ_INSERT_AFTER(&g_msys_pool_list, pool, new_pool, omp_next); + } else { + STAILQ_INSERT_TAIL(&g_msys_pool_list, new_pool, omp_next); + } + + return (0); +} + +void +os_msys_reset(void) +{ + STAILQ_INIT(&g_msys_pool_list); +} + +static struct os_mbuf_pool * +_os_msys_find_pool(uint16_t dsize) +{ + struct os_mbuf_pool *pool; + + pool = NULL; + STAILQ_FOREACH(pool, &g_msys_pool_list, omp_next) { + if (dsize <= pool->omp_databuf_len) { + break; + } + } + + if (!pool) { + pool = STAILQ_LAST(&g_msys_pool_list, os_mbuf_pool, omp_next); + } + + return (pool); +} + + +struct os_mbuf * +os_msys_get(uint16_t dsize, uint16_t leadingspace) +{ + struct os_mbuf *m; + struct os_mbuf_pool *pool; + + pool = _os_msys_find_pool(dsize); + if (!pool) { + goto err; + } + + m = os_mbuf_get(pool, leadingspace); + return (m); +err: + return (NULL); +} + +struct os_mbuf * +os_msys_get_pkthdr(uint16_t dsize, uint16_t user_hdr_len) +{ + uint16_t total_pkthdr_len; + struct os_mbuf *m; + struct os_mbuf_pool *pool; + + total_pkthdr_len = user_hdr_len + sizeof(struct os_mbuf_pkthdr); + pool = _os_msys_find_pool(dsize + total_pkthdr_len); + if (!pool) { + goto err; + } + + m = os_mbuf_get_pkthdr(pool, user_hdr_len); + return (m); +err: + return (NULL); +} + +int +os_msys_count(void) +{ + struct os_mbuf_pool *omp; + int total; + + total = 0; + STAILQ_FOREACH(omp, &g_msys_pool_list, omp_next) { + total += omp->omp_pool->mp_num_blocks; + } + + return total; +} + +int +os_msys_num_free(void) +{ + struct os_mbuf_pool *omp; + int total; + + total = 0; + STAILQ_FOREACH(omp, &g_msys_pool_list, omp_next) { + total += omp->omp_pool->mp_num_free; + } + + return total; +} + + +int +os_mbuf_pool_init(struct os_mbuf_pool *omp, struct os_mempool *mp, + uint16_t buf_len, uint16_t nbufs) +{ + omp->omp_databuf_len = buf_len - sizeof(struct os_mbuf); + omp->omp_pool = mp; + + return (0); +} + +struct os_mbuf * +os_mbuf_get(struct os_mbuf_pool *omp, uint16_t leadingspace) +{ + struct os_mbuf *om; + + os_trace_api_u32x2(OS_TRACE_ID_MBUF_GET, (uint32_t)omp, + (uint32_t)(uintptr_t)leadingspace); + + if (leadingspace > omp->omp_databuf_len) { + om = NULL; + goto done; + } + + om = os_memblock_get(omp->omp_pool); + if (!om) { + goto done; + } + + SLIST_NEXT(om, om_next) = NULL; + om->om_flags = 0; + om->om_pkthdr_len = 0; + om->om_len = 0; + om->om_data = (&om->om_databuf[0] + leadingspace); + om->om_omp = omp; + +done: + os_trace_api_ret_u32(OS_TRACE_ID_MBUF_GET, (uint32_t)(uintptr_t)om); + return om; +} + +struct os_mbuf * +os_mbuf_get_pkthdr(struct os_mbuf_pool *omp, uint8_t user_pkthdr_len) +{ + uint16_t pkthdr_len; + struct os_mbuf_pkthdr *pkthdr; + struct os_mbuf *om; + + os_trace_api_u32x2(OS_TRACE_ID_MBUF_GET_PKTHDR, (uint32_t)(uintptr_t)omp, + (uint32_t)user_pkthdr_len); + + /* User packet header must fit inside mbuf */ + pkthdr_len = user_pkthdr_len + sizeof(struct os_mbuf_pkthdr); + if ((pkthdr_len > omp->omp_databuf_len) || (pkthdr_len > 255)) { + om = NULL; + goto done; + } + + om = os_mbuf_get(omp, 0); + if (om) { + om->om_pkthdr_len = pkthdr_len; + om->om_data += pkthdr_len; + + pkthdr = OS_MBUF_PKTHDR(om); + pkthdr->omp_len = 0; + pkthdr->omp_flags = 0; + STAILQ_NEXT(pkthdr, omp_next) = NULL; + } + +done: + os_trace_api_ret_u32(OS_TRACE_ID_MBUF_GET_PKTHDR, (uint32_t)(uintptr_t)om); + return om; +} + +int +os_mbuf_free(struct os_mbuf *om) +{ + int rc; + + os_trace_api_u32(OS_TRACE_ID_MBUF_FREE, (uint32_t)(uintptr_t)om); + + if (om->om_omp != NULL) { + rc = os_memblock_put(om->om_omp->omp_pool, om); + if (rc != 0) { + goto done; + } + } + + rc = 0; + +done: + os_trace_api_ret_u32(OS_TRACE_ID_MBUF_FREE, (uint32_t)rc); + return (rc); +} + +int +os_mbuf_free_chain(struct os_mbuf *om) +{ + struct os_mbuf *next; + int rc; + + os_trace_api_u32(OS_TRACE_ID_MBUF_FREE_CHAIN, (uint32_t)(uintptr_t)om); + + while (om != NULL) { + next = SLIST_NEXT(om, om_next); + + rc = os_mbuf_free(om); + if (rc != 0) { + goto done; + } + + om = next; + } + + rc = 0; + +done: + os_trace_api_ret_u32(OS_TRACE_ID_MBUF_FREE_CHAIN, (uint32_t)rc); + return (rc); +} + +/** + * Copy a packet header from one mbuf to another. + * + * @param omp The mbuf pool associated with these buffers + * @param new_buf The new buffer to copy the packet header into + * @param old_buf The old buffer to copy the packet header from + */ +static inline void +_os_mbuf_copypkthdr(struct os_mbuf *new_buf, struct os_mbuf *old_buf) +{ + assert(new_buf->om_len == 0); + + memcpy(&new_buf->om_databuf[0], &old_buf->om_databuf[0], + old_buf->om_pkthdr_len); + new_buf->om_pkthdr_len = old_buf->om_pkthdr_len; + new_buf->om_data = new_buf->om_databuf + old_buf->om_pkthdr_len; +} + +uint16_t +os_mbuf_len(const struct os_mbuf *om) +{ + uint16_t len; + + len = 0; + while (om != NULL) { + len += om->om_len; + om = SLIST_NEXT(om, om_next); + } + + return len; +} + +int +os_mbuf_append(struct os_mbuf *om, const void *data, uint16_t len) +{ + struct os_mbuf_pool *omp; + struct os_mbuf *last; + struct os_mbuf *new; + int remainder; + int space; + int rc; + + if (om == NULL) { + rc = OS_EINVAL; + goto err; + } + + omp = om->om_omp; + + /* Scroll to last mbuf in the chain */ + last = om; + while (SLIST_NEXT(last, om_next) != NULL) { + last = SLIST_NEXT(last, om_next); + } + + remainder = len; + space = OS_MBUF_TRAILINGSPACE(last); + + /* If room in current mbuf, copy the first part of the data into the + * remaining space in that mbuf. + */ + if (space > 0) { + if (space > remainder) { + space = remainder; + } + + memcpy(OS_MBUF_DATA(last, uint8_t *) + last->om_len , data, space); + + last->om_len += space; + data += space; + remainder -= space; + } + + /* Take the remaining data, and keep allocating new mbufs and copying + * data into it, until data is exhausted. + */ + while (remainder > 0) { + new = os_mbuf_get(omp, 0); + if (!new) { + break; + } + + new->om_len = min(omp->omp_databuf_len, remainder); + memcpy(OS_MBUF_DATA(new, void *), data, new->om_len); + data += new->om_len; + remainder -= new->om_len; + SLIST_NEXT(last, om_next) = new; + last = new; + } + + /* Adjust the packet header length in the buffer */ + if (OS_MBUF_IS_PKTHDR(om)) { + OS_MBUF_PKTHDR(om)->omp_len += len - remainder; + } + + if (remainder != 0) { + rc = OS_ENOMEM; + goto err; + } + + + return (0); +err: + return (rc); +} + +int +os_mbuf_appendfrom(struct os_mbuf *dst, const struct os_mbuf *src, + uint16_t src_off, uint16_t len) +{ + const struct os_mbuf *src_cur_om; + uint16_t src_cur_off; + uint16_t chunk_sz; + int rc; + + src_cur_om = os_mbuf_off(src, src_off, &src_cur_off); + while (len > 0) { + if (src_cur_om == NULL) { + return OS_EINVAL; + } + + chunk_sz = min(len, src_cur_om->om_len - src_cur_off); + rc = os_mbuf_append(dst, src_cur_om->om_data + src_cur_off, chunk_sz); + if (rc != 0) { + return rc; + } + + len -= chunk_sz; + src_cur_om = SLIST_NEXT(src_cur_om, om_next); + src_cur_off = 0; + } + + return 0; +} + +struct os_mbuf * +os_mbuf_dup(struct os_mbuf *om) +{ + struct os_mbuf_pool *omp; + struct os_mbuf *head; + struct os_mbuf *copy; + + omp = om->om_omp; + + head = NULL; + copy = NULL; + + for (; om != NULL; om = SLIST_NEXT(om, om_next)) { + if (head) { + SLIST_NEXT(copy, om_next) = os_mbuf_get(omp, + OS_MBUF_LEADINGSPACE(om)); + if (!SLIST_NEXT(copy, om_next)) { + os_mbuf_free_chain(head); + goto err; + } + + copy = SLIST_NEXT(copy, om_next); + } else { + head = os_mbuf_get(omp, OS_MBUF_LEADINGSPACE(om)); + if (!head) { + goto err; + } + + if (OS_MBUF_IS_PKTHDR(om)) { + _os_mbuf_copypkthdr(head, om); + } + copy = head; + } + copy->om_flags = om->om_flags; + copy->om_len = om->om_len; + memcpy(OS_MBUF_DATA(copy, uint8_t *), OS_MBUF_DATA(om, uint8_t *), + om->om_len); + } + + return (head); +err: + return (NULL); +} + +struct os_mbuf * +os_mbuf_off(const struct os_mbuf *om, int off, uint16_t *out_off) +{ + struct os_mbuf *next; + struct os_mbuf *cur; + + /* Cast away const. */ + cur = (struct os_mbuf *)om; + + while (1) { + if (cur == NULL) { + return NULL; + } + + next = SLIST_NEXT(cur, om_next); + + if (cur->om_len > off || + (cur->om_len == off && next == NULL)) { + + *out_off = off; + return cur; + } + + off -= cur->om_len; + cur = next; + } +} + +int +os_mbuf_copydata(const struct os_mbuf *m, int off, int len, void *dst) +{ + unsigned int count; + uint8_t *udst; + + if (!len) { + return 0; + } + + udst = dst; + + while (off > 0) { + if (!m) { + return (-1); + } + + if (off < m->om_len) + break; + off -= m->om_len; + m = SLIST_NEXT(m, om_next); + } + while (len > 0 && m != NULL) { + count = min(m->om_len - off, len); + memcpy(udst, m->om_data + off, count); + len -= count; + udst += count; + off = 0; + m = SLIST_NEXT(m, om_next); + } + + return (len > 0 ? -1 : 0); +} + +void +os_mbuf_adj(struct os_mbuf *mp, int req_len) +{ + int len = req_len; + struct os_mbuf *m; + int count; + + if ((m = mp) == NULL) + return; + if (len >= 0) { + /* + * Trim from head. + */ + while (m != NULL && len > 0) { + if (m->om_len <= len) { + len -= m->om_len; + m->om_len = 0; + m = SLIST_NEXT(m, om_next); + } else { + m->om_len -= len; + m->om_data += len; + len = 0; + } + } + if (OS_MBUF_IS_PKTHDR(mp)) + OS_MBUF_PKTHDR(mp)->omp_len -= (req_len - len); + } else { + /* + * Trim from tail. Scan the mbuf chain, + * calculating its length and finding the last mbuf. + * If the adjustment only affects this mbuf, then just + * adjust and return. Otherwise, rescan and truncate + * after the remaining size. + */ + len = -len; + count = 0; + for (;;) { + count += m->om_len; + if (SLIST_NEXT(m, om_next) == (struct os_mbuf *)0) + break; + m = SLIST_NEXT(m, om_next); + } + if (m->om_len >= len) { + m->om_len -= len; + if (OS_MBUF_IS_PKTHDR(mp)) + OS_MBUF_PKTHDR(mp)->omp_len -= len; + return; + } + count -= len; + if (count < 0) + count = 0; + /* + * Correct length for chain is "count". + * Find the mbuf with last data, adjust its length, + * and toss data from remaining mbufs on chain. + */ + m = mp; + if (OS_MBUF_IS_PKTHDR(m)) + OS_MBUF_PKTHDR(m)->omp_len = count; + for (; m; m = SLIST_NEXT(m, om_next)) { + if (m->om_len >= count) { + m->om_len = count; + if (SLIST_NEXT(m, om_next) != NULL) { + os_mbuf_free_chain(SLIST_NEXT(m, om_next)); + SLIST_NEXT(m, om_next) = NULL; + } + break; + } + count -= m->om_len; + } + } +} + +int +os_mbuf_cmpf(const struct os_mbuf *om, int off, const void *data, int len) +{ + uint16_t chunk_sz; + uint16_t data_off; + uint16_t om_off; + int rc; + + if (len <= 0) { + return 0; + } + + data_off = 0; + om = os_mbuf_off(om, off, &om_off); + while (1) { + if (om == NULL) { + return INT_MAX; + } + + chunk_sz = min(om->om_len - om_off, len - data_off); + if (chunk_sz > 0) { + rc = memcmp(om->om_data + om_off, data + data_off, chunk_sz); + if (rc != 0) { + return rc; + } + } + + data_off += chunk_sz; + if (data_off == len) { + return 0; + } + + om = SLIST_NEXT(om, om_next); + om_off = 0; + + if (om == NULL) { + return INT_MAX; + } + } +} + +int +os_mbuf_cmpm(const struct os_mbuf *om1, uint16_t offset1, + const struct os_mbuf *om2, uint16_t offset2, + uint16_t len) +{ + const struct os_mbuf *cur1; + const struct os_mbuf *cur2; + uint16_t bytes_remaining; + uint16_t chunk_sz; + uint16_t om1_left; + uint16_t om2_left; + uint16_t om1_off; + uint16_t om2_off; + int rc; + + om1_off = 0; + om2_off = 0; + + cur1 = os_mbuf_off(om1, offset1, &om1_off); + cur2 = os_mbuf_off(om2, offset2, &om2_off); + + bytes_remaining = len; + while (1) { + if (bytes_remaining == 0) { + return 0; + } + + while (cur1 != NULL && om1_off >= cur1->om_len) { + cur1 = SLIST_NEXT(cur1, om_next); + om1_off = 0; + } + while (cur2 != NULL && om2_off >= cur2->om_len) { + cur2 = SLIST_NEXT(cur2, om_next); + om2_off = 0; + } + + if (cur1 == NULL || cur2 == NULL) { + return INT_MAX; + } + + om1_left = cur1->om_len - om1_off; + om2_left = cur2->om_len - om2_off; + chunk_sz = min(min(om1_left, om2_left), bytes_remaining); + + rc = memcmp(cur1->om_data + om1_off, cur2->om_data + om2_off, + chunk_sz); + if (rc != 0) { + return rc; + } + + om1_off += chunk_sz; + om2_off += chunk_sz; + bytes_remaining -= chunk_sz; + } +} + +struct os_mbuf * +os_mbuf_prepend(struct os_mbuf *om, int len) +{ + struct os_mbuf *p; + int leading; + + while (1) { + /* Fill the available space at the front of the head of the chain, as + * needed. + */ + leading = min(len, OS_MBUF_LEADINGSPACE(om)); + + om->om_data -= leading; + om->om_len += leading; + if (OS_MBUF_IS_PKTHDR(om)) { + OS_MBUF_PKTHDR(om)->omp_len += leading; + } + + len -= leading; + if (len == 0) { + break; + } + + /* The current head didn't have enough space; allocate a new head. */ + if (OS_MBUF_IS_PKTHDR(om)) { + p = os_mbuf_get_pkthdr(om->om_omp, + om->om_pkthdr_len - sizeof (struct os_mbuf_pkthdr)); + } else { + p = os_mbuf_get(om->om_omp, 0); + } + if (p == NULL) { + os_mbuf_free_chain(om); + om = NULL; + break; + } + + if (OS_MBUF_IS_PKTHDR(om)) { + _os_mbuf_copypkthdr(p, om); + om->om_pkthdr_len = 0; + } + + /* Move the new head's data pointer to the end so that data can be + * prepended. + */ + p->om_data += OS_MBUF_TRAILINGSPACE(p); + + SLIST_NEXT(p, om_next) = om; + om = p; + } + + return om; +} + +struct os_mbuf * +os_mbuf_prepend_pullup(struct os_mbuf *om, uint16_t len) +{ + om = os_mbuf_prepend(om, len); + if (om == NULL) { + return NULL; + } + + om = os_mbuf_pullup(om, len); + if (om == NULL) { + return NULL; + } + + return om; +} + +int +os_mbuf_copyinto(struct os_mbuf *om, int off, const void *src, int len) +{ + struct os_mbuf *next; + struct os_mbuf *cur; + const uint8_t *sptr; + uint16_t cur_off; + int copylen; + int rc; + + /* Find the mbuf,offset pair for the start of the destination. */ + cur = os_mbuf_off(om, off, &cur_off); + if (cur == NULL) { + return -1; + } + + /* Overwrite existing data until we reach the end of the chain. */ + sptr = src; + while (1) { + copylen = min(cur->om_len - cur_off, len); + if (copylen > 0) { + memcpy(cur->om_data + cur_off, sptr, copylen); + sptr += copylen; + len -= copylen; + + copylen = 0; + } + + if (len == 0) { + /* All the source data fit in the existing mbuf chain. */ + return 0; + } + + next = SLIST_NEXT(cur, om_next); + if (next == NULL) { + break; + } + + cur = next; + cur_off = 0; + } + + /* Append the remaining data to the end of the chain. */ + rc = os_mbuf_append(cur, sptr, len); + if (rc != 0) { + return rc; + } + + /* Fix up the packet header, if one is present. */ + if (OS_MBUF_IS_PKTHDR(om)) { + OS_MBUF_PKTHDR(om)->omp_len = + max(OS_MBUF_PKTHDR(om)->omp_len, off + len); + } + + return 0; +} + +void +os_mbuf_concat(struct os_mbuf *first, struct os_mbuf *second) +{ + struct os_mbuf *next; + struct os_mbuf *cur; + + /* Point 'cur' to the last buffer in the first chain. */ + cur = first; + while (1) { + next = SLIST_NEXT(cur, om_next); + if (next == NULL) { + break; + } + + cur = next; + } + + /* Attach the second chain to the end of the first. */ + SLIST_NEXT(cur, om_next) = second; + + /* If the first chain has a packet header, calculate the length of the + * second chain and add it to the header length. + */ + if (OS_MBUF_IS_PKTHDR(first)) { + if (OS_MBUF_IS_PKTHDR(second)) { + OS_MBUF_PKTHDR(first)->omp_len += OS_MBUF_PKTHDR(second)->omp_len; + } else { + for (cur = second; cur != NULL; cur = SLIST_NEXT(cur, om_next)) { + OS_MBUF_PKTHDR(first)->omp_len += cur->om_len; + } + } + } + + second->om_pkthdr_len = 0; +} + +void * +os_mbuf_extend(struct os_mbuf *om, uint16_t len) +{ + struct os_mbuf *newm; + struct os_mbuf *last; + void *data; + + if (len > om->om_omp->omp_databuf_len) { + return NULL; + } + + /* Scroll to last mbuf in the chain */ + last = om; + while (SLIST_NEXT(last, om_next) != NULL) { + last = SLIST_NEXT(last, om_next); + } + + if (OS_MBUF_TRAILINGSPACE(last) < len) { + newm = os_mbuf_get(om->om_omp, 0); + if (newm == NULL) { + return NULL; + } + + SLIST_NEXT(last, om_next) = newm; + last = newm; + } + + data = last->om_data + last->om_len; + last->om_len += len; + + if (OS_MBUF_IS_PKTHDR(om)) { + OS_MBUF_PKTHDR(om)->omp_len += len; + } + + return data; +} + + +struct os_mbuf * +os_mbuf_pullup(struct os_mbuf *om, uint16_t len) +{ + struct os_mbuf_pool *omp; + struct os_mbuf *next; + struct os_mbuf *om2; + int count; + int space; + + omp = om->om_omp; + + /* + * If first mbuf has no cluster, and has room for len bytes + * without shifting current data, pullup into it, + * otherwise allocate a new mbuf to prepend to the chain. + */ + if (om->om_len >= len) { + return (om); + } + if (om->om_len + OS_MBUF_TRAILINGSPACE(om) >= len && + SLIST_NEXT(om, om_next)) { + om2 = om; + om = SLIST_NEXT(om, om_next); + len -= om2->om_len; + } else { + if (len > omp->omp_databuf_len - om->om_pkthdr_len) { + goto bad; + } + + om2 = os_mbuf_get(omp, 0); + if (om2 == NULL) { + goto bad; + } + + if (OS_MBUF_IS_PKTHDR(om)) { + _os_mbuf_copypkthdr(om2, om); + } + } + space = OS_MBUF_TRAILINGSPACE(om2); + do { + count = min(min(len, space), om->om_len); + memcpy(om2->om_data + om2->om_len, om->om_data, count); + len -= count; + om2->om_len += count; + om->om_len -= count; + space -= count; + if (om->om_len) { + om->om_data += count; + } else { + next = SLIST_NEXT(om, om_next); + os_mbuf_free(om); + om = next; + } + } while (len > 0 && om); + if (len > 0) { + os_mbuf_free(om2); + goto bad; + } + SLIST_NEXT(om2, om_next) = om; + return (om2); +bad: + os_mbuf_free_chain(om); + return (NULL); +} + +struct os_mbuf * +os_mbuf_trim_front(struct os_mbuf *om) +{ + struct os_mbuf *next; + struct os_mbuf *cur; + + /* Abort early if there is nothing to trim. */ + if (om->om_len != 0) { + return om; + } + + /* Starting with the second mbuf in the chain, continue removing and + * freeing mbufs until an non-empty one is encountered. + */ + cur = SLIST_NEXT(om, om_next); + while (cur != NULL && cur->om_len == 0) { + next = SLIST_NEXT(cur, om_next); + + SLIST_NEXT(om, om_next) = next; + os_mbuf_free(cur); + + cur = next; + } + + if (cur == NULL) { + /* All buffers after the first have been freed. */ + return om; + } + + /* Try to remove the first mbuf in the chain. If this buffer contains a + * packet header, make sure the second buffer can accommodate it. + */ + if (OS_MBUF_LEADINGSPACE(cur) >= om->om_pkthdr_len) { + /* Second buffer has room; copy packet header. */ + cur->om_pkthdr_len = om->om_pkthdr_len; + memcpy(OS_MBUF_PKTHDR(cur), OS_MBUF_PKTHDR(om), om->om_pkthdr_len); + + /* Free first buffer. */ + os_mbuf_free(om); + om = cur; + } + + return om; +} + +int +os_mbuf_widen(struct os_mbuf *om, uint16_t off, uint16_t len) +{ + struct os_mbuf *first_new; + struct os_mbuf *edge_om; + struct os_mbuf *prev; + struct os_mbuf *cur; + uint16_t rem_len; + uint16_t sub_off; + int rc; + + /* Locate the mbuf and offset within the chain where the gap will be + * inserted. + */ + edge_om = os_mbuf_off(om, off, &sub_off); + if (edge_om == NULL) { + return OS_EINVAL; + } + + /* If the mbuf has sufficient capacity for the gap, just make room within + * the mbuf. + */ + if (OS_MBUF_TRAILINGSPACE(edge_om) >= len) { + memmove(edge_om->om_data + sub_off + len, + edge_om->om_data + sub_off, + edge_om->om_len - sub_off); + edge_om->om_len += len; + if (OS_MBUF_IS_PKTHDR(om)) { + OS_MBUF_PKTHDR(om)->omp_len += len; + } + return 0; + } + + /* Otherwise, allocate new mbufs until the chain has sufficient capacity + * for the gap. + */ + rem_len = len; + first_new = NULL; + prev = NULL; + while (rem_len > 0) { + cur = os_mbuf_get(om->om_omp, 0); + if (cur == NULL) { + /* Free only the mbufs that this function allocated. */ + os_mbuf_free_chain(first_new); + return OS_ENOMEM; + } + + /* Remember the start of the chain of new mbufs. */ + if (first_new == NULL) { + first_new = cur; + } + + if (rem_len > OS_MBUF_TRAILINGSPACE(cur)) { + cur->om_len = OS_MBUF_TRAILINGSPACE(cur); + } else { + cur->om_len = rem_len; + } + rem_len -= cur->om_len; + + if (prev != NULL) { + SLIST_NEXT(prev, om_next) = cur; + } + prev = cur; + } + + /* Move the misplaced data from the edge mbuf over to the right side of the + * gap. + */ + rc = os_mbuf_append(prev, edge_om->om_data + sub_off, + edge_om->om_len - sub_off); + if (rc != 0) { + os_mbuf_free_chain(first_new); + return OS_ENOMEM; + } + edge_om->om_len = sub_off; + + /* Insert the gap into the chain. */ + SLIST_NEXT(prev, om_next) = SLIST_NEXT(edge_om, om_next); + SLIST_NEXT(edge_om, om_next) = first_new; + + if (OS_MBUF_IS_PKTHDR(om)) { + OS_MBUF_PKTHDR(om)->omp_len += len; + } + + return 0; +} + +struct os_mbuf * +os_mbuf_pack_chains(struct os_mbuf *m1, struct os_mbuf *m2) +{ + uint16_t rem_len; + uint16_t copylen; + uint8_t *dptr; + struct os_mbuf *cur; + struct os_mbuf *next; + + /* If m1 is NULL, return NULL */ + if (m1 == NULL) { + return NULL; + } + + /* + * Concatenate the two chains to start. This will discard packet header in + * m2 and adjust packet length in m1 if m1 has a packet header. + */ + if (m2 != NULL) { + os_mbuf_concat(m1, m2); + } + + cur = m1; + while (1) { + /* If there is leading space in the mbuf, move data up */ + if (OS_MBUF_LEADINGSPACE(cur)) { + dptr = &cur->om_databuf[0]; + if (OS_MBUF_IS_PKTHDR(cur)) { + dptr += cur->om_pkthdr_len; + } + memmove(dptr, cur->om_data, cur->om_len); + cur->om_data = dptr; + } + + /* Set pointer to where we will begin copying data in current mbuf */ + dptr = cur->om_data + cur->om_len; + + /* Get a pointer to the next buf we want to absorb */ + next = SLIST_NEXT(cur, om_next); + + /* + * Is there trailing space in the mbuf? If so, copy data from + * following mbufs into the current mbuf + */ + rem_len = OS_MBUF_TRAILINGSPACE(cur); + while (rem_len && next) { + copylen = min(rem_len, next->om_len); + memcpy(dptr, next->om_data, copylen); + cur->om_len += copylen; + dptr += copylen; + rem_len -= copylen; + + /* + * We copied bytes from the next mbuf. Move the data pointer + * and subtract from its length + */ + next->om_data += copylen; + next->om_len -= copylen; + + /* + * Keep removing and freeing consecutive zero length mbufs, + * stopping when we find one with data in it or we have + * reached the end. This will prevent any zero length mbufs + * from remaining in the chain. + */ + while (next->om_len == 0) { + SLIST_NEXT(cur, om_next) = SLIST_NEXT(next, om_next); + os_mbuf_free(next); + next = SLIST_NEXT(cur, om_next); + if (next == NULL) { + break; + } + } + } + + /* If no mbufs are left, we are done */ + if (next == NULL) { + break; + } + + /* Move cur to next as we filled up current */ + cur = next; + } + + return m1; +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/os_mempool.c b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/os_mempool.c new file mode 100644 index 000000000..09d5e3526 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/os_mempool.c @@ -0,0 +1,476 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include "os/os.h" +#include "os/os_trace_api.h" + +#include +#include +#include +#include "syscfg/syscfg.h" +#if !MYNEWT_VAL(OS_SYSVIEW_TRACE_MEMPOOL) +#define OS_TRACE_DISABLE_FILE_API +#endif + +#define OS_MEM_TRUE_BLOCK_SIZE(bsize) OS_ALIGN(bsize, OS_ALIGNMENT) +#if MYNEWT_VAL(OS_MEMPOOL_GUARD) +#define OS_MEMPOOL_TRUE_BLOCK_SIZE(mp) \ + (((mp)->mp_flags & OS_MEMPOOL_F_EXT) ? \ + OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size) : \ + (OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size) + sizeof(os_membuf_t))) +#else +#define OS_MEMPOOL_TRUE_BLOCK_SIZE(mp) OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size) +#endif + +STAILQ_HEAD(, os_mempool) g_os_mempool_list; + +#if MYNEWT_VAL(OS_MEMPOOL_POISON) +static uint32_t os_mem_poison = 0xde7ec7ed; + +static_assert(sizeof(struct os_memblock) % 4 == 0, "sizeof(struct os_memblock) shall be aligned to 4"); +static_assert(sizeof(os_mem_poison) == 4, "sizeof(os_mem_poison) shall be 4"); + +static void +os_mempool_poison(const struct os_mempool *mp, void *start) +{ + uint32_t *p; + uint32_t *end; + int sz; + + sz = OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size); + p = start; + end = p + sz / 4; + p += sizeof(struct os_memblock) / 4; + + while (p < end) { + *p = os_mem_poison; + p++; + } +} + +static void +os_mempool_poison_check(const struct os_mempool *mp, void *start) +{ + uint32_t *p; + uint32_t *end; + int sz; + + sz = OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size); + p = start; + end = p + sz / 4; + p += sizeof(struct os_memblock) / 4; + + while (p < end) { + assert(*p == os_mem_poison); + p++; + } +} +#else +#define os_mempool_poison(mp, start) +#define os_mempool_poison_check(mp, start) +#endif +#if MYNEWT_VAL(OS_MEMPOOL_GUARD) +#define OS_MEMPOOL_GUARD_PATTERN 0xBAFF1ED1 + +static void +os_mempool_guard(const struct os_mempool *mp, void *start) +{ + uint32_t *tgt; + + if ((mp->mp_flags & OS_MEMPOOL_F_EXT) == 0) { + tgt = (uint32_t *)((uintptr_t)start + + OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size)); + *tgt = OS_MEMPOOL_GUARD_PATTERN; + } +} + +static void +os_mempool_guard_check(const struct os_mempool *mp, void *start) +{ + uint32_t *tgt; + + if ((mp->mp_flags & OS_MEMPOOL_F_EXT) == 0) { + tgt = (uint32_t *)((uintptr_t)start + + OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size)); + assert(*tgt == OS_MEMPOOL_GUARD_PATTERN); + } +} +#else +#define os_mempool_guard(mp, start) +#define os_mempool_guard_check(mp, start) +#endif + +static os_error_t +os_mempool_init_internal(struct os_mempool *mp, uint16_t blocks, + uint32_t block_size, void *membuf, char *name, + uint8_t flags) +{ + int true_block_size; + int i; + uint8_t *block_addr; + struct os_memblock *block_ptr; + + /* Check for valid parameters */ + if (!mp || (block_size == 0)) { + return OS_INVALID_PARM; + } + + if ((!membuf) && (blocks != 0)) { + return OS_INVALID_PARM; + } + + if (membuf != NULL) { + /* Blocks need to be sized properly and memory buffer should be + * aligned + */ + if (((uint32_t)(uintptr_t)membuf & (OS_ALIGNMENT - 1)) != 0) { + return OS_MEM_NOT_ALIGNED; + } + } + + /* Initialize the memory pool structure */ + mp->mp_block_size = block_size; + mp->mp_num_free = blocks; + mp->mp_min_free = blocks; + mp->mp_flags = flags; + mp->mp_num_blocks = blocks; + mp->mp_membuf_addr = (uint32_t)(uintptr_t)membuf; + mp->name = name; + SLIST_FIRST(mp) = membuf; + + if (blocks > 0) { + os_mempool_poison(mp, membuf); + os_mempool_guard(mp, membuf); + true_block_size = OS_MEMPOOL_TRUE_BLOCK_SIZE(mp); + + /* Chain the memory blocks to the free list */ + block_addr = (uint8_t *)membuf; + block_ptr = (struct os_memblock *)block_addr; + for (i = 1; i < blocks; i++) { + block_addr += true_block_size; + os_mempool_poison(mp, block_addr); + os_mempool_guard(mp, block_addr); + SLIST_NEXT(block_ptr, mb_next) = (struct os_memblock *)block_addr; + block_ptr = (struct os_memblock *)block_addr; + } + + /* Last one in the list should be NULL */ + SLIST_NEXT(block_ptr, mb_next) = NULL; + } + + STAILQ_INSERT_TAIL(&g_os_mempool_list, mp, mp_list); + + return OS_OK; +} + +os_error_t +os_mempool_init(struct os_mempool *mp, uint16_t blocks, uint32_t block_size, + void *membuf, char *name) +{ + return os_mempool_init_internal(mp, blocks, block_size, membuf, name, 0); +} + +os_error_t +os_mempool_ext_init(struct os_mempool_ext *mpe, uint16_t blocks, + uint32_t block_size, void *membuf, char *name) +{ + int rc; + + rc = os_mempool_init_internal(&mpe->mpe_mp, blocks, block_size, membuf, + name, OS_MEMPOOL_F_EXT); + if (rc != 0) { + return rc; + } + + mpe->mpe_put_cb = NULL; + mpe->mpe_put_arg = NULL; + + return 0; +} + +os_error_t +os_mempool_unregister(struct os_mempool *mp) +{ + struct os_mempool *prev; + struct os_mempool *next; + struct os_mempool *cur; + + /* Remove the mempool from the global stailq. This is done manually rather + * than with `STAILQ_REMOVE` to allow for a graceful failure if the mempool + * isn't found. + */ + + prev = NULL; + STAILQ_FOREACH(cur, &g_os_mempool_list, mp_list) { + if (cur == mp) { + break; + } + prev = cur; + } + + if (cur == NULL) { + return OS_INVALID_PARM; + } + + if (prev == NULL) { + STAILQ_REMOVE_HEAD(&g_os_mempool_list, mp_list); + } else { + next = STAILQ_NEXT(cur, mp_list); + if (next == NULL) { + g_os_mempool_list.stqh_last = &STAILQ_NEXT(prev, mp_list); + } + + STAILQ_NEXT(prev, mp_list) = next; + } + + return 0; +} + +os_error_t +os_mempool_clear(struct os_mempool *mp) +{ + struct os_memblock *block_ptr; + int true_block_size; + uint8_t *block_addr; + uint16_t blocks; + + if (!mp) { + return OS_INVALID_PARM; + } + + true_block_size = OS_MEMPOOL_TRUE_BLOCK_SIZE(mp); + + /* cleanup the memory pool structure */ + mp->mp_num_free = mp->mp_num_blocks; + mp->mp_min_free = mp->mp_num_blocks; + os_mempool_poison(mp, (void *)mp->mp_membuf_addr); + os_mempool_guard(mp, (void *)mp->mp_membuf_addr); + SLIST_FIRST(mp) = (void *)(uintptr_t)mp->mp_membuf_addr; + + /* Chain the memory blocks to the free list */ + block_addr = (uint8_t *)(uintptr_t)mp->mp_membuf_addr; + block_ptr = (struct os_memblock *)block_addr; + blocks = mp->mp_num_blocks; + + while (blocks > 1) { + block_addr += true_block_size; + os_mempool_poison(mp, block_addr); + os_mempool_guard(mp, block_addr); + SLIST_NEXT(block_ptr, mb_next) = (struct os_memblock *)block_addr; + block_ptr = (struct os_memblock *)block_addr; + --blocks; + } + + /* Last one in the list should be NULL */ + SLIST_NEXT(block_ptr, mb_next) = NULL; + + return OS_OK; +} + +bool +os_mempool_is_sane(const struct os_mempool *mp) +{ + struct os_memblock *block; + + /* Verify that each block in the free list belongs to the mempool. */ + SLIST_FOREACH(block, mp, mb_next) { + if (!os_memblock_from(mp, block)) { + return false; + } + os_mempool_poison_check(mp, block); + os_mempool_guard_check(mp, block); + } + + return true; +} + +int +os_memblock_from(const struct os_mempool *mp, const void *block_addr) +{ + uint32_t true_block_size; + uintptr_t baddr32; + uint32_t end; + + static_assert(sizeof block_addr == sizeof baddr32, + "Pointer to void must be 32-bits."); + + baddr32 = (uint32_t)(uintptr_t)block_addr; + true_block_size = OS_MEMPOOL_TRUE_BLOCK_SIZE(mp); + end = mp->mp_membuf_addr + (mp->mp_num_blocks * true_block_size); + + /* Check that the block is in the memory buffer range. */ + if ((baddr32 < mp->mp_membuf_addr) || (baddr32 >= end)) { + return 0; + } + + /* All freed blocks should be on true block size boundaries! */ + if (((baddr32 - mp->mp_membuf_addr) % true_block_size) != 0) { + return 0; + } + + return 1; +} + +void * +os_memblock_get(struct os_mempool *mp) +{ + os_sr_t sr; + struct os_memblock *block; + + os_trace_api_u32(OS_TRACE_ID_MEMBLOCK_GET, (uint32_t)(uintptr_t)mp); + + /* Check to make sure they passed in a memory pool (or something) */ + block = NULL; + if (mp) { + OS_ENTER_CRITICAL(sr); + /* Check for any free */ + if (mp->mp_num_free) { + /* Get a free block */ + block = SLIST_FIRST(mp); + + /* Set new free list head */ + SLIST_FIRST(mp) = SLIST_NEXT(block, mb_next); + + /* Decrement number free by 1 */ + mp->mp_num_free--; + if (mp->mp_min_free > mp->mp_num_free) { + mp->mp_min_free = mp->mp_num_free; + } + } + OS_EXIT_CRITICAL(sr); + + if (block) { + os_mempool_poison_check(mp, block); + os_mempool_guard_check(mp, block); + } + } + + os_trace_api_ret_u32(OS_TRACE_ID_MEMBLOCK_GET, (uint32_t)(uintptr_t)block); + + return (void *)block; +} + +os_error_t +os_memblock_put_from_cb(struct os_mempool *mp, void *block_addr) +{ + os_sr_t sr; + struct os_memblock *block; + + os_trace_api_u32x2(OS_TRACE_ID_MEMBLOCK_PUT_FROM_CB, (uint32_t)(uintptr_t)mp, + (uint32_t)(uintptr_t)block_addr); + + os_mempool_guard_check(mp, block_addr); + os_mempool_poison(mp, block_addr); + + block = (struct os_memblock *)block_addr; + OS_ENTER_CRITICAL(sr); + + /* Chain current free list pointer to this block; make this block head */ + SLIST_NEXT(block, mb_next) = SLIST_FIRST(mp); + SLIST_FIRST(mp) = block; + + /* XXX: Should we check that the number free <= number blocks? */ + /* Increment number free */ + mp->mp_num_free++; + + OS_EXIT_CRITICAL(sr); + + os_trace_api_ret_u32(OS_TRACE_ID_MEMBLOCK_PUT_FROM_CB, (uint32_t)OS_OK); + + return OS_OK; +} + +os_error_t +os_memblock_put(struct os_mempool *mp, void *block_addr) +{ + struct os_mempool_ext *mpe; + os_error_t ret; +#if MYNEWT_VAL(OS_MEMPOOL_CHECK) + struct os_memblock *block; +#endif + + os_trace_api_u32x2(OS_TRACE_ID_MEMBLOCK_PUT, (uint32_t)(uintptr_t)mp, + (uint32_t)(uintptr_t)block_addr); + + /* Make sure parameters are valid */ + if ((mp == NULL) || (block_addr == NULL)) { + ret = OS_INVALID_PARM; + goto done; + } + +#if MYNEWT_VAL(OS_MEMPOOL_CHECK) + /* Check that the block we are freeing is a valid block! */ + assert(os_memblock_from(mp, block_addr)); + + /* + * Check for duplicate free. + */ + SLIST_FOREACH(block, mp, mb_next) { + assert(block != (struct os_memblock *)block_addr); + } +#endif + /* If this is an extended mempool with a put callback, call the callback + * instead of freeing the block directly. + */ + if (mp->mp_flags & OS_MEMPOOL_F_EXT) { + mpe = (struct os_mempool_ext *)mp; + if (mpe->mpe_put_cb != NULL) { + ret = mpe->mpe_put_cb(mpe, block_addr, mpe->mpe_put_arg); + goto done; + } + } + + /* No callback; free the block. */ + ret = os_memblock_put_from_cb(mp, block_addr); + +done: + os_trace_api_ret_u32(OS_TRACE_ID_MEMBLOCK_PUT, (uint32_t)ret); + return ret; +} + +struct os_mempool * +os_mempool_info_get_next(struct os_mempool *mp, struct os_mempool_info *omi) +{ + struct os_mempool *cur; + + if (mp == NULL) { + cur = STAILQ_FIRST(&g_os_mempool_list); + } else { + cur = STAILQ_NEXT(mp, mp_list); + } + + if (cur == NULL) { + return (NULL); + } + + omi->omi_block_size = cur->mp_block_size; + omi->omi_num_blocks = cur->mp_num_blocks; + omi->omi_num_free = cur->mp_num_free; + omi->omi_min_free = cur->mp_min_free; + omi->omi_name[0] = '\0'; + strncat(omi->omi_name, cur->name, sizeof(omi->omi_name) - 1); + + return (cur); +} + +void +os_mempool_module_init(void) +{ + STAILQ_INIT(&g_os_mempool_list); +} diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/os_msys_init.c b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/os_msys_init.c new file mode 100644 index 000000000..d22ae351f --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/nimble/src/os_msys_init.c @@ -0,0 +1,156 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include "os/os.h" +#include "mem/mem.h" +#include "sysinit/sysinit.h" + +static STAILQ_HEAD(, os_mbuf_pool) g_msys_pool_list = + STAILQ_HEAD_INITIALIZER(g_msys_pool_list); + +#if MYNEWT_VAL(MSYS_1_BLOCK_COUNT) > 0 +#define SYSINIT_MSYS_1_MEMBLOCK_SIZE \ + OS_ALIGN(MYNEWT_VAL(MSYS_1_BLOCK_SIZE), 4) +#define SYSINIT_MSYS_1_MEMPOOL_SIZE \ + OS_MEMPOOL_SIZE(MYNEWT_VAL(MSYS_1_BLOCK_COUNT), \ + SYSINIT_MSYS_1_MEMBLOCK_SIZE) +static os_membuf_t os_msys_1_data[SYSINIT_MSYS_1_MEMPOOL_SIZE]; +static struct os_mbuf_pool os_msys_1_mbuf_pool; +static struct os_mempool os_msys_1_mempool; +#endif + +#if MYNEWT_VAL(MSYS_2_BLOCK_COUNT) > 0 +#define SYSINIT_MSYS_2_MEMBLOCK_SIZE \ + OS_ALIGN(MYNEWT_VAL(MSYS_2_BLOCK_SIZE), 4) +#define SYSINIT_MSYS_2_MEMPOOL_SIZE \ + OS_MEMPOOL_SIZE(MYNEWT_VAL(MSYS_2_BLOCK_COUNT), \ + SYSINIT_MSYS_2_MEMBLOCK_SIZE) +static os_membuf_t os_msys_2_data[SYSINIT_MSYS_2_MEMPOOL_SIZE]; +static struct os_mbuf_pool os_msys_2_mbuf_pool; +static struct os_mempool os_msys_2_mempool; +#endif + +#define OS_MSYS_SANITY_ENABLED \ + (MYNEWT_VAL(MSYS_1_SANITY_MIN_COUNT) > 0 || \ + MYNEWT_VAL(MSYS_2_SANITY_MIN_COUNT) > 0) + +#if OS_MSYS_SANITY_ENABLED +static struct os_sanity_check os_msys_sc; +#endif + +#if OS_MSYS_SANITY_ENABLED + +/** + * Retrieves the minimum safe buffer count for an msys pool. That is, the + * lowest a pool's buffer count can be without causing the sanity check to + * fail. + * + * @param idx The index of the msys pool to query. + * + * @return The msys pool's minimum safe buffer count. + */ +static int +os_msys_sanity_min_count(int idx) +{ + switch (idx) { + case 0: + return MYNEWT_VAL(MSYS_1_SANITY_MIN_COUNT); + + case 1: + return MYNEWT_VAL(MSYS_2_SANITY_MIN_COUNT); + + default: + assert(0); + return 0; + } +} + +static int +os_msys_sanity(struct os_sanity_check *sc, void *arg) +{ + const struct os_mbuf_pool *omp; + int min_count; + int idx; + + idx = 0; + STAILQ_FOREACH(omp, &g_msys_pool_list, omp_next) { + min_count = os_msys_sanity_min_count(idx); + if (omp->omp_pool->mp_num_free < min_count) { + return OS_ENOMEM; + } + + idx++; + } + + return 0; +} +#endif + +static void +os_msys_init_once(void *data, struct os_mempool *mempool, + struct os_mbuf_pool *mbuf_pool, + int block_count, int block_size, char *name) +{ + int rc; + + rc = mem_init_mbuf_pool(data, mempool, mbuf_pool, block_count, block_size, + name); + SYSINIT_PANIC_ASSERT(rc == 0); + + rc = os_msys_register(mbuf_pool); + SYSINIT_PANIC_ASSERT(rc == 0); +} + +void +os_msys_init(void) +{ + int rc; + + os_msys_reset(); + + (void)os_msys_init_once; + (void)rc; + +#if MYNEWT_VAL(MSYS_1_BLOCK_COUNT) > 0 + os_msys_init_once(os_msys_1_data, + &os_msys_1_mempool, + &os_msys_1_mbuf_pool, + MYNEWT_VAL(MSYS_1_BLOCK_COUNT), + SYSINIT_MSYS_1_MEMBLOCK_SIZE, + "msys_1"); +#endif + +#if MYNEWT_VAL(MSYS_2_BLOCK_COUNT) > 0 + os_msys_init_once(os_msys_2_data, + &os_msys_2_mempool, + &os_msys_2_mbuf_pool, + MYNEWT_VAL(MSYS_2_BLOCK_COUNT), + SYSINIT_MSYS_2_MEMBLOCK_SIZE, + "msys_2"); +#endif + +#if OS_MSYS_SANITY_ENABLED + os_msys_sc.sc_func = os_msys_sanity; + os_msys_sc.sc_checkin_itvl = + OS_TICKS_PER_SEC * MYNEWT_VAL(MSYS_SANITY_TIMEOUT) / 1000; + rc = os_sanity_check_register(&os_msys_sc); + SYSINIT_PANIC_ASSERT(rc == 0); +#endif +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/console/console.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/console/console.h new file mode 100644 index 000000000..4a9032898 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/console/console.h @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _CONSOLE_H +#define _CONSOLE_H + +#include + +#define console_printf printf + +#endif diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/nimble_npl_os.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/nimble_npl_os.h new file mode 100644 index 000000000..c7bb9bbed --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/nimble_npl_os.h @@ -0,0 +1,300 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 _NIMBLE_NPL_OS_H_ +#define _NIMBLE_NPL_OS_H_ + +#include +#include +#include +#include "FreeRTOS.h" +#include "queue.h" +#include "semphr.h" +#include "task.h" +#include "timers.h" +#include "syscfg/syscfg.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLE_NPL_OS_ALIGNMENT 4 + +#define BLE_NPL_TIME_FOREVER portMAX_DELAY + +/* This should be compatible with TickType_t */ +typedef uint32_t ble_npl_time_t; +typedef int32_t ble_npl_stime_t; + +struct ble_npl_event { + bool queued; + ble_npl_event_fn *fn; + void *arg; +}; + +struct ble_npl_eventq { + QueueHandle_t q; +}; + +struct ble_npl_callout { + TimerHandle_t handle; + struct ble_npl_eventq *evq; + struct ble_npl_event ev; +}; + +struct ble_npl_mutex { + SemaphoreHandle_t handle; +}; + +struct ble_npl_sem { + SemaphoreHandle_t handle; +}; + +/* + * Simple APIs are just defined as static inline below, but some are a bit more + * complex or require some global state variables and thus are defined in .c + * file instead and static inline wrapper just calls proper implementation. + * We need declarations of these functions and they are defined in header below. + */ +#include "npl_freertos.h" + +static inline bool +ble_npl_os_started(void) +{ + return xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED; +} + +static inline void * +ble_npl_get_current_task_id(void) +{ + return xTaskGetCurrentTaskHandle(); +} + +static inline void +ble_npl_eventq_init(struct ble_npl_eventq *evq) +{ + evq->q = xQueueCreate(32, sizeof(struct ble_npl_eventq *)); +} + +static inline struct ble_npl_event * +ble_npl_eventq_get(struct ble_npl_eventq *evq, ble_npl_time_t tmo) +{ + return npl_freertos_eventq_get(evq, tmo); +} + +static inline void +ble_npl_eventq_put(struct ble_npl_eventq *evq, struct ble_npl_event *ev) +{ + npl_freertos_eventq_put(evq, ev); +} + +static inline void +ble_npl_eventq_remove(struct ble_npl_eventq *evq, struct ble_npl_event *ev) +{ + npl_freertos_eventq_remove(evq, ev); +} + +static inline void +ble_npl_event_run(struct ble_npl_event *ev) +{ + ev->fn(ev); +} + +static inline bool +ble_npl_eventq_is_empty(struct ble_npl_eventq *evq) +{ + return xQueueIsQueueEmptyFromISR(evq->q); +} + +static inline void +ble_npl_event_init(struct ble_npl_event *ev, ble_npl_event_fn *fn, + void *arg) +{ + memset(ev, 0, sizeof(*ev)); + ev->fn = fn; + ev->arg = arg; +} + +static inline bool +ble_npl_event_is_queued(struct ble_npl_event *ev) +{ + return ev->queued; +} + +static inline void * +ble_npl_event_get_arg(struct ble_npl_event *ev) +{ + return ev->arg; +} + +static inline void +ble_npl_event_set_arg(struct ble_npl_event *ev, void *arg) +{ + ev->arg = arg; +} + +static inline ble_npl_error_t +ble_npl_mutex_init(struct ble_npl_mutex *mu) +{ + return npl_freertos_mutex_init(mu); +} + +static inline ble_npl_error_t +ble_npl_mutex_pend(struct ble_npl_mutex *mu, ble_npl_time_t timeout) +{ + return npl_freertos_mutex_pend(mu, timeout); +} + +static inline ble_npl_error_t +ble_npl_mutex_release(struct ble_npl_mutex *mu) +{ + return npl_freertos_mutex_release(mu); +} + +static inline ble_npl_error_t +ble_npl_sem_init(struct ble_npl_sem *sem, uint16_t tokens) +{ + return npl_freertos_sem_init(sem, tokens); +} + +static inline ble_npl_error_t +ble_npl_sem_pend(struct ble_npl_sem *sem, ble_npl_time_t timeout) +{ + return npl_freertos_sem_pend(sem, timeout); +} + +static inline ble_npl_error_t +ble_npl_sem_release(struct ble_npl_sem *sem) +{ + return npl_freertos_sem_release(sem); +} + +static inline uint16_t +ble_npl_sem_get_count(struct ble_npl_sem *sem) +{ + return uxSemaphoreGetCount(sem->handle); +} + +static inline void +ble_npl_callout_init(struct ble_npl_callout *co, struct ble_npl_eventq *evq, + ble_npl_event_fn *ev_cb, void *ev_arg) +{ + npl_freertos_callout_init(co, evq, ev_cb, ev_arg); +} + +static inline ble_npl_error_t +ble_npl_callout_reset(struct ble_npl_callout *co, ble_npl_time_t ticks) +{ + return npl_freertos_callout_reset(co, ticks); +} + +static inline void +ble_npl_callout_stop(struct ble_npl_callout *co) +{ + xTimerStop(co->handle, portMAX_DELAY); +} + +static inline bool +ble_npl_callout_is_active(struct ble_npl_callout *co) +{ + return xTimerIsTimerActive(co->handle) == pdTRUE; +} + +static inline ble_npl_time_t +ble_npl_callout_get_ticks(struct ble_npl_callout *co) +{ + return xTimerGetExpiryTime(co->handle); +} + +static inline uint32_t +ble_npl_callout_remaining_ticks(struct ble_npl_callout *co, + ble_npl_time_t time) +{ + return npl_freertos_callout_remaining_ticks(co, time); +} + +static inline void +ble_npl_callout_set_arg(struct ble_npl_callout *co, void *arg) +{ + co->ev.arg = arg; +} + +static inline uint32_t +ble_npl_time_get(void) +{ + return xTaskGetTickCountFromISR(); +} + +static inline ble_npl_error_t +ble_npl_time_ms_to_ticks(uint32_t ms, ble_npl_time_t *out_ticks) +{ + return npl_freertos_time_ms_to_ticks(ms, out_ticks); +} + +static inline ble_npl_error_t +ble_npl_time_ticks_to_ms(ble_npl_time_t ticks, uint32_t *out_ms) +{ + return ble_npl_time_ticks_to_ms(ticks, out_ms); +} + +static inline ble_npl_time_t +ble_npl_time_ms_to_ticks32(uint32_t ms) +{ + return ms * configTICK_RATE_HZ / 1000; +} + +static inline uint32_t +ble_npl_time_ticks_to_ms32(ble_npl_time_t ticks) +{ + return ticks * 1000 / configTICK_RATE_HZ; +} + +static inline void +ble_npl_time_delay(ble_npl_time_t ticks) +{ + vTaskDelay(ticks); +} + +#if NIMBLE_CFG_CONTROLLER +static inline void +ble_npl_hw_set_isr(int irqn, void (*addr)(void)) +{ + npl_freertos_hw_set_isr(irqn, addr); +} +#endif + +static inline uint32_t +ble_npl_hw_enter_critical(void) +{ + vTaskEnterCritical(); + return 0; +} + +static inline void +ble_npl_hw_exit_critical(uint32_t ctx) +{ + vTaskExitCritical(); + +} + +#ifdef __cplusplus +} +#endif + +#endif /* _NPL_H_ */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/nimble_npl_os_log.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/nimble_npl_os_log.h new file mode 100644 index 000000000..f0c85f709 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/nimble_npl_os_log.h @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 _NIMBLE_NPL_OS_LOG_H_ +#define _NIMBLE_NPL_OS_LOG_H_ + +#include + +#define BLE_HS_LOG_DEBUG(...) printf(__VA_ARGS__) +#define BLE_HS_LOG_INFO(...) printf(__VA_ARGS__) +#define BLE_HS_LOG_WARN(...) printf(__VA_ARGS__) +#define BLE_HS_LOG_ERROR(...) printf(__VA_ARGS__) +#define BLE_HS_LOG_CRITICAL(...) printf(__VA_ARGS__) +#define BLE_HS_LOG_DISABLED(...) printf(__VA_ARGS__) + +#define BLE_EATT_LOG_DEBUG(...) printf(__VA_ARGS__) +#define BLE_EATT_LOG_ERROR(...) printf(__VA_ARGS__) + +#endif /* _NIMBLE_NPL_OS_LOG_H_ */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/nimble_port_freertos.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/nimble_port_freertos.h new file mode 100644 index 000000000..43cbf2915 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/nimble_port_freertos.h @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 _NIMBLE_PORT_FREERTOS_H +#define _NIMBLE_PORT_FREERTOS_H + +#include "nimble/nimble_npl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void nimble_port_freertos_init(TaskFunction_t host_task_fn); + +#ifdef __cplusplus +} +#endif + +#endif /* _NIMBLE_PORT_FREERTOS_H */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/npl_freertos.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/npl_freertos.h new file mode 100644 index 000000000..24441adfa --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/nimble/npl_freertos.h @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 _NPL_FREERTOS_H_ +#define _NPL_FREERTOS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct ble_npl_event *npl_freertos_eventq_get(struct ble_npl_eventq *evq, + ble_npl_time_t tmo); + +void npl_freertos_eventq_put(struct ble_npl_eventq *evq, + struct ble_npl_event *ev); + +void npl_freertos_eventq_remove(struct ble_npl_eventq *evq, + struct ble_npl_event *ev); + +ble_npl_error_t npl_freertos_mutex_init(struct ble_npl_mutex *mu); + +ble_npl_error_t npl_freertos_mutex_pend(struct ble_npl_mutex *mu, + ble_npl_time_t timeout); + +ble_npl_error_t npl_freertos_mutex_release(struct ble_npl_mutex *mu); + +ble_npl_error_t npl_freertos_sem_init(struct ble_npl_sem *sem, uint16_t tokens); + +ble_npl_error_t npl_freertos_sem_pend(struct ble_npl_sem *sem, + ble_npl_time_t timeout); + +ble_npl_error_t npl_freertos_sem_release(struct ble_npl_sem *sem); + +void npl_freertos_callout_init(struct ble_npl_callout *co, + struct ble_npl_eventq *evq, + ble_npl_event_fn *ev_cb, void *ev_arg); + +ble_npl_error_t npl_freertos_callout_reset(struct ble_npl_callout *co, + ble_npl_time_t ticks); + +ble_npl_time_t npl_freertos_callout_remaining_ticks(struct ble_npl_callout *co, + ble_npl_time_t now); + +ble_npl_error_t npl_freertos_time_ms_to_ticks(uint32_t ms, + ble_npl_time_t *out_ticks); + +ble_npl_error_t npl_freertos_time_ticks_to_ms(ble_npl_time_t ticks, + uint32_t *out_ms); + +void npl_freertos_hw_set_isr(int irqn, void (*addr)(void)); + +uint32_t npl_freertos_hw_enter_critical(void); + +void npl_freertos_hw_exit_critical(uint32_t ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* _NPL_FREERTOS_H_ */ diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/syscfg/syscfg.h b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/syscfg/syscfg.h new file mode 100644 index 000000000..17e1148a4 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/include/syscfg/syscfg.h @@ -0,0 +1,1344 @@ +/** + * This file was generated by Apache newt version: 1.12.0-dev + */ + +#ifndef H_MYNEWT_SYSCFG_ +#define H_MYNEWT_SYSCFG_ + +/** + * This macro exists to ensure code includes this header when needed. If code + * checks the existence of a setting directly via ifdef without including this + * header, the setting macro will silently evaluate to 0. In contrast, an + * attempt to use these macros without including this header will result in a + * compiler error. + */ +#define MYNEWT_VAL(_name) MYNEWT_VAL_ ## _name +#define MYNEWT_VAL_CHOICE(_name, _val) MYNEWT_VAL_ ## _name ## __ ## _val + +#ifndef MYNEWT_VAL_TINYCRYPT_SYSINIT_STAGE +#define MYNEWT_VAL_TINYCRYPT_SYSINIT_STAGE (200) +#endif + +#ifndef MYNEWT_VAL_TINYCRYPT_UECC_RNG_TRNG_DEV_NAME +#define MYNEWT_VAL_TINYCRYPT_UECC_RNG_TRNG_DEV_NAME "trng" +#endif + +#ifndef MYNEWT_VAL_TINYCRYPT_UECC_RNG_USE_TRNG +#define MYNEWT_VAL_TINYCRYPT_UECC_RNG_USE_TRNG (0) +#endif + +/*** @apache-mynewt-core/hw/bsp/native */ +#ifndef MYNEWT_VAL_BSP_SIMULATED +#define MYNEWT_VAL_BSP_SIMULATED (1) +#endif + +/*** @apache-mynewt-core/hw/hal */ +#ifndef MYNEWT_VAL_HAL_ENABLE_SOFTWARE_BREAKPOINTS +#define MYNEWT_VAL_HAL_ENABLE_SOFTWARE_BREAKPOINTS (1) +#endif + +#ifndef MYNEWT_VAL_HAL_FLASH_MAX_DEVICE_COUNT +#define MYNEWT_VAL_HAL_FLASH_MAX_DEVICE_COUNT (0) +#endif + +#ifndef MYNEWT_VAL_HAL_FLASH_VERIFY_BUF_SZ +#define MYNEWT_VAL_HAL_FLASH_VERIFY_BUF_SZ (16) +#endif + +#ifndef MYNEWT_VAL_HAL_FLASH_VERIFY_ERASES +#define MYNEWT_VAL_HAL_FLASH_VERIFY_ERASES (0) +#endif + +#ifndef MYNEWT_VAL_HAL_FLASH_VERIFY_WRITES +#define MYNEWT_VAL_HAL_FLASH_VERIFY_WRITES (0) +#endif + +#ifndef MYNEWT_VAL_HAL_SBRK +#define MYNEWT_VAL_HAL_SBRK (1) +#endif + +#ifndef MYNEWT_VAL_HAL_SYSTEM_RESET_CB +#define MYNEWT_VAL_HAL_SYSTEM_RESET_CB (0) +#endif + +/*** @apache-mynewt-core/hw/mcu/native */ +#ifndef MYNEWT_VAL_I2C_0 +#define MYNEWT_VAL_I2C_0 (0) +#endif + +#ifndef MYNEWT_VAL_MCU_FLASH_MIN_WRITE_SIZE +#define MYNEWT_VAL_MCU_FLASH_MIN_WRITE_SIZE (1) +#endif + +#ifndef MYNEWT_VAL_MCU_FLASH_STYLE_NORDIC +#define MYNEWT_VAL_MCU_FLASH_STYLE_NORDIC (0) +#endif + +#ifndef MYNEWT_VAL_MCU_FLASH_STYLE_ST +#define MYNEWT_VAL_MCU_FLASH_STYLE_ST (1) +#endif + +#ifndef MYNEWT_VAL_MCU_NATIVE +#define MYNEWT_VAL_MCU_NATIVE (1) +#endif + +#ifndef MYNEWT_VAL_MCU_NATIVE_USE_SIGNALS +#define MYNEWT_VAL_MCU_NATIVE_USE_SIGNALS (1) +#endif + +#ifndef MYNEWT_VAL_MCU_TIMER_POLLER_PRIO +#define MYNEWT_VAL_MCU_TIMER_POLLER_PRIO (0) +#endif + +#ifndef MYNEWT_VAL_MCU_UART_POLLER_PRIO +#define MYNEWT_VAL_MCU_UART_POLLER_PRIO (1) +#endif + +/*** @apache-mynewt-core/kernel/os */ +#ifndef MYNEWT_VAL_FLOAT_USER +#define MYNEWT_VAL_FLOAT_USER (0) +#endif + +#ifndef MYNEWT_VAL_MSYS_1_BLOCK_COUNT +#define MYNEWT_VAL_MSYS_1_BLOCK_COUNT (12) +#endif + +#ifndef MYNEWT_VAL_MSYS_1_BLOCK_SIZE +#define MYNEWT_VAL_MSYS_1_BLOCK_SIZE (292) +#endif + +#ifndef MYNEWT_VAL_MSYS_1_SANITY_MIN_COUNT +#define MYNEWT_VAL_MSYS_1_SANITY_MIN_COUNT (0) +#endif + +#ifndef MYNEWT_VAL_MSYS_2_BLOCK_COUNT +#define MYNEWT_VAL_MSYS_2_BLOCK_COUNT (0) +#endif + +#ifndef MYNEWT_VAL_MSYS_2_BLOCK_SIZE +#define MYNEWT_VAL_MSYS_2_BLOCK_SIZE (0) +#endif + +#ifndef MYNEWT_VAL_MSYS_2_SANITY_MIN_COUNT +#define MYNEWT_VAL_MSYS_2_SANITY_MIN_COUNT (0) +#endif + +#ifndef MYNEWT_VAL_MSYS_SANITY_TIMEOUT +#define MYNEWT_VAL_MSYS_SANITY_TIMEOUT (60000) +#endif + +#ifndef MYNEWT_VAL_OS_ASSERT_CB +#define MYNEWT_VAL_OS_ASSERT_CB (0) +#endif + +#ifndef MYNEWT_VAL_OS_CLI +#define MYNEWT_VAL_OS_CLI (0) +#endif + +#ifndef MYNEWT_VAL_OS_COREDUMP +#define MYNEWT_VAL_OS_COREDUMP (0) +#endif + +#ifndef MYNEWT_VAL_OS_COREDUMP_CB +#define MYNEWT_VAL_OS_COREDUMP_CB (0) +#endif + +#ifndef MYNEWT_VAL_OS_CPUTIME_FREQ +#define MYNEWT_VAL_OS_CPUTIME_FREQ (1000000) +#endif + +#ifndef MYNEWT_VAL_OS_CPUTIME_TIMER_NUM +#define MYNEWT_VAL_OS_CPUTIME_TIMER_NUM (0) +#endif + +/* Overridden by @apache-mynewt-core/hw/bsp/native (defined by @apache-mynewt-core/kernel/os) */ +#ifndef MYNEWT_VAL_OS_CRASH_FILE_LINE +#define MYNEWT_VAL_OS_CRASH_FILE_LINE (1) +#endif + +#ifndef MYNEWT_VAL_OS_CRASH_LOG +#define MYNEWT_VAL_OS_CRASH_LOG (0) +#endif + +#ifndef MYNEWT_VAL_OS_CRASH_RESTORE_REGS +#define MYNEWT_VAL_OS_CRASH_RESTORE_REGS (0) +#endif + +#ifndef MYNEWT_VAL_OS_CRASH_STACKTRACE +#define MYNEWT_VAL_OS_CRASH_STACKTRACE (0) +#endif + +#ifndef MYNEWT_VAL_OS_CTX_SW_STACK_CHECK +#define MYNEWT_VAL_OS_CTX_SW_STACK_CHECK (0) +#endif + +#ifndef MYNEWT_VAL_OS_CTX_SW_STACK_GUARD +#define MYNEWT_VAL_OS_CTX_SW_STACK_GUARD (4) +#endif + +#ifndef MYNEWT_VAL_OS_DEBUG_MODE +#define MYNEWT_VAL_OS_DEBUG_MODE (0) +#endif + +#ifndef MYNEWT_VAL_OS_EVENTQ_DEBUG +#define MYNEWT_VAL_OS_EVENTQ_DEBUG (0) +#endif + +#ifndef MYNEWT_VAL_OS_EVENTQ_MONITOR +#define MYNEWT_VAL_OS_EVENTQ_MONITOR (0) +#endif + +#ifndef MYNEWT_VAL_OS_IDLE_TICKLESS_MS_MAX +#define MYNEWT_VAL_OS_IDLE_TICKLESS_MS_MAX (600000) +#endif + +/* Overridden by @apache-mynewt-core/hw/bsp/native (defined by @apache-mynewt-core/kernel/os) */ +#ifndef MYNEWT_VAL_OS_IDLE_TICKLESS_MS_MIN +#define MYNEWT_VAL_OS_IDLE_TICKLESS_MS_MIN (1) +#endif + +#ifndef MYNEWT_VAL_OS_MAIN_STACK_SIZE +#define MYNEWT_VAL_OS_MAIN_STACK_SIZE (1024) +#endif + +#ifndef MYNEWT_VAL_OS_MAIN_TASK_PRIO +#define MYNEWT_VAL_OS_MAIN_TASK_PRIO (127) +#endif + +#ifndef MYNEWT_VAL_OS_MAIN_TASK_SANITY_ITVL_MS +#define MYNEWT_VAL_OS_MAIN_TASK_SANITY_ITVL_MS (0) +#endif + +#ifndef MYNEWT_VAL_OS_MEMPOOL_CHECK +#define MYNEWT_VAL_OS_MEMPOOL_CHECK (0) +#endif + +#ifndef MYNEWT_VAL_OS_MEMPOOL_GUARD +#define MYNEWT_VAL_OS_MEMPOOL_GUARD (0) +#endif + +#ifndef MYNEWT_VAL_OS_MEMPOOL_POISON +#define MYNEWT_VAL_OS_MEMPOOL_POISON (0) +#endif + +#ifndef MYNEWT_VAL_OS_SCHEDULING +#define MYNEWT_VAL_OS_SCHEDULING (1) +#endif + +#ifndef MYNEWT_VAL_OS_SYSINIT_STAGE +#define MYNEWT_VAL_OS_SYSINIT_STAGE (0) +#endif + +#ifndef MYNEWT_VAL_OS_SYSVIEW +#define MYNEWT_VAL_OS_SYSVIEW (0) +#endif + +#ifndef MYNEWT_VAL_OS_SYSVIEW_TRACE_CALLOUT +#define MYNEWT_VAL_OS_SYSVIEW_TRACE_CALLOUT (1) +#endif + +#ifndef MYNEWT_VAL_OS_SYSVIEW_TRACE_EVENTQ +#define MYNEWT_VAL_OS_SYSVIEW_TRACE_EVENTQ (1) +#endif + +#ifndef MYNEWT_VAL_OS_SYSVIEW_TRACE_MBUF +#define MYNEWT_VAL_OS_SYSVIEW_TRACE_MBUF (0) +#endif + +#ifndef MYNEWT_VAL_OS_SYSVIEW_TRACE_MEMPOOL +#define MYNEWT_VAL_OS_SYSVIEW_TRACE_MEMPOOL (0) +#endif + +#ifndef MYNEWT_VAL_OS_SYSVIEW_TRACE_MUTEX +#define MYNEWT_VAL_OS_SYSVIEW_TRACE_MUTEX (1) +#endif + +#ifndef MYNEWT_VAL_OS_SYSVIEW_TRACE_SEM +#define MYNEWT_VAL_OS_SYSVIEW_TRACE_SEM (1) +#endif + +#ifndef MYNEWT_VAL_OS_TASK_RUN_TIME_CPUTIME +#define MYNEWT_VAL_OS_TASK_RUN_TIME_CPUTIME (0) +#endif + +/* Overridden by @apache-mynewt-core/hw/mcu/native (defined by @apache-mynewt-core/kernel/os) */ +#ifndef MYNEWT_VAL_OS_TICKS_PER_SEC +#define MYNEWT_VAL_OS_TICKS_PER_SEC (100) +#endif + +#ifndef MYNEWT_VAL_OS_TIME_DEBUG +#define MYNEWT_VAL_OS_TIME_DEBUG (0) +#endif + +#ifndef MYNEWT_VAL_OS_WATCHDOG_MONITOR +#define MYNEWT_VAL_OS_WATCHDOG_MONITOR (0) +#endif + +#ifndef MYNEWT_VAL_SANITY_INTERVAL +#define MYNEWT_VAL_SANITY_INTERVAL (15000) +#endif + +#ifndef MYNEWT_VAL_WATCHDOG_INTERVAL +#define MYNEWT_VAL_WATCHDOG_INTERVAL (30000) +#endif + +/*** @apache-mynewt-core/net/ip/native_sockets */ +#ifndef MYNEWT_VAL_NATIVE_SOCKETS_MAX +#define MYNEWT_VAL_NATIVE_SOCKETS_MAX (8) +#endif + +#ifndef MYNEWT_VAL_NATIVE_SOCKETS_MAX_UDP +#define MYNEWT_VAL_NATIVE_SOCKETS_MAX_UDP (2048) +#endif + +#ifndef MYNEWT_VAL_NATIVE_SOCKETS_POLL_INTERVAL_MS +#define MYNEWT_VAL_NATIVE_SOCKETS_POLL_INTERVAL_MS (200) +#endif + +#undef MYNEWT_VAL_NATIVE_SOCKETS_POLL_ITVL + +#ifndef MYNEWT_VAL_NATIVE_SOCKETS_PRIO +#define MYNEWT_VAL_NATIVE_SOCKETS_PRIO (2) +#endif + +#ifndef MYNEWT_VAL_NATIVE_SOCKETS_STACK_SZ +#define MYNEWT_VAL_NATIVE_SOCKETS_STACK_SZ (4096) +#endif + +#ifndef MYNEWT_VAL_NATIVE_SOCKETS_SYSINIT_STAGE +#define MYNEWT_VAL_NATIVE_SOCKETS_SYSINIT_STAGE (200) +#endif + +/*** @apache-mynewt-core/sys/console/stub */ +#ifndef MYNEWT_VAL_CONSOLE_UART_BAUD +#define MYNEWT_VAL_CONSOLE_UART_BAUD (115200) +#endif + +#ifndef MYNEWT_VAL_CONSOLE_UART_DEV +#define MYNEWT_VAL_CONSOLE_UART_DEV "uart0" +#endif + +#ifndef MYNEWT_VAL_CONSOLE_UART_FLOW_CONTROL +#define MYNEWT_VAL_CONSOLE_UART_FLOW_CONTROL (UART_FLOW_CTL_NONE) +#endif + +/*** @apache-mynewt-core/sys/flash_map */ +#ifndef MYNEWT_VAL_FLASH_MAP_MAX_AREAS +#define MYNEWT_VAL_FLASH_MAP_MAX_AREAS (10) +#endif + +#ifndef MYNEWT_VAL_FLASH_MAP_SUPPORT_MFG +#define MYNEWT_VAL_FLASH_MAP_SUPPORT_MFG (0) +#endif + +#ifndef MYNEWT_VAL_FLASH_MAP_SYSINIT_STAGE +#define MYNEWT_VAL_FLASH_MAP_SYSINIT_STAGE (9) +#endif + +/*** @apache-mynewt-core/sys/log/common */ +#ifndef MYNEWT_VAL_DFLT_LOG_LVL +#define MYNEWT_VAL_DFLT_LOG_LVL (1) +#endif + +#ifndef MYNEWT_VAL_DFLT_LOG_MOD +#define MYNEWT_VAL_DFLT_LOG_MOD (0) +#endif + +#ifndef MYNEWT_VAL_LOG_GLOBAL_IDX +#define MYNEWT_VAL_LOG_GLOBAL_IDX (1) +#endif + +/*** @apache-mynewt-core/sys/log/modlog */ +#ifndef MYNEWT_VAL_MODLOG_CONSOLE_DFLT +#define MYNEWT_VAL_MODLOG_CONSOLE_DFLT (1) +#endif + +#ifndef MYNEWT_VAL_MODLOG_LOG_MACROS +#define MYNEWT_VAL_MODLOG_LOG_MACROS (0) +#endif + +#ifndef MYNEWT_VAL_MODLOG_MAX_MAPPINGS +#define MYNEWT_VAL_MODLOG_MAX_MAPPINGS (16) +#endif + +#ifndef MYNEWT_VAL_MODLOG_MAX_PRINTF_LEN +#define MYNEWT_VAL_MODLOG_MAX_PRINTF_LEN (128) +#endif + +#ifndef MYNEWT_VAL_MODLOG_SYSINIT_STAGE +#define MYNEWT_VAL_MODLOG_SYSINIT_STAGE (100) +#endif + +/*** @apache-mynewt-core/sys/log/stub */ +#ifndef MYNEWT_VAL_LOG_CONSOLE +#define MYNEWT_VAL_LOG_CONSOLE (1) +#endif + +#ifndef MYNEWT_VAL_LOG_FCB +#define MYNEWT_VAL_LOG_FCB (0) +#endif + +#ifndef MYNEWT_VAL_LOG_FCB_SLOT1 +#define MYNEWT_VAL_LOG_FCB_SLOT1 (0) +#endif + +#ifndef MYNEWT_VAL_LOG_LEVEL +#define MYNEWT_VAL_LOG_LEVEL (255) +#endif + +/*** @apache-mynewt-core/sys/sys */ +#ifndef MYNEWT_VAL_DEBUG_PANIC_ENABLED +#define MYNEWT_VAL_DEBUG_PANIC_ENABLED (1) +#endif + +/*** @apache-mynewt-core/sys/sysdown */ +#ifndef MYNEWT_VAL_SYSDOWN_CONSTRAIN_DOWN +#define MYNEWT_VAL_SYSDOWN_CONSTRAIN_DOWN (1) +#endif + +#ifndef MYNEWT_VAL_SYSDOWN_PANIC_FILE_LINE +#define MYNEWT_VAL_SYSDOWN_PANIC_FILE_LINE (0) +#endif + +#ifndef MYNEWT_VAL_SYSDOWN_PANIC_MESSAGE +#define MYNEWT_VAL_SYSDOWN_PANIC_MESSAGE (0) +#endif + +#ifndef MYNEWT_VAL_SYSDOWN_TIMEOUT_MS +#define MYNEWT_VAL_SYSDOWN_TIMEOUT_MS (10000) +#endif + +/*** @apache-mynewt-core/sys/sysinit */ +#ifndef MYNEWT_VAL_SYSINIT_CONSTRAIN_INIT +#define MYNEWT_VAL_SYSINIT_CONSTRAIN_INIT (1) +#endif + +/* Overridden by @apache-mynewt-core/hw/bsp/native (defined by @apache-mynewt-core/sys/sysinit) */ +#ifndef MYNEWT_VAL_SYSINIT_PANIC_FILE_LINE +#define MYNEWT_VAL_SYSINIT_PANIC_FILE_LINE (1) +#endif + +/* Overridden by @apache-mynewt-core/hw/bsp/native (defined by @apache-mynewt-core/sys/sysinit) */ +#ifndef MYNEWT_VAL_SYSINIT_PANIC_MESSAGE +#define MYNEWT_VAL_SYSINIT_PANIC_MESSAGE (1) +#endif + +/*** @apache-mynewt-core/util/rwlock */ +#ifndef MYNEWT_VAL_RWLOCK_DEBUG +#define MYNEWT_VAL_RWLOCK_DEBUG (0) +#endif + +/*** @apache-mynewt-nimble/nimble */ +#ifndef MYNEWT_VAL_BLE_CONN_SUBRATING +#define MYNEWT_VAL_BLE_CONN_SUBRATING (0) +#endif + +#ifndef MYNEWT_VAL_BLE_EXT_ADV +#define MYNEWT_VAL_BLE_EXT_ADV (0) +#endif + +#ifndef MYNEWT_VAL_BLE_EXT_ADV_MAX_SIZE +#define MYNEWT_VAL_BLE_EXT_ADV_MAX_SIZE (31) +#endif + +#ifndef MYNEWT_VAL_BLE_HCI_VS +#define MYNEWT_VAL_BLE_HCI_VS (0) +#endif + +#ifndef MYNEWT_VAL_BLE_HCI_VS_OCF_OFFSET +#define MYNEWT_VAL_BLE_HCI_VS_OCF_OFFSET (0) +#endif + +#ifndef MYNEWT_VAL_BLE_ISO +#define MYNEWT_VAL_BLE_ISO (0) +#endif + +#ifndef MYNEWT_VAL_BLE_ISO_BROADCASTER +#define MYNEWT_VAL_BLE_ISO_BROADCASTER (0) +#endif + +#ifndef MYNEWT_VAL_BLE_ISO_TEST +#define MYNEWT_VAL_BLE_ISO_TEST (0) +#endif + +#ifndef MYNEWT_VAL_BLE_MAX_CONNECTIONS +#define MYNEWT_VAL_BLE_MAX_CONNECTIONS (1) +#endif + +#ifndef MYNEWT_VAL_BLE_MAX_PERIODIC_SYNCS +#define MYNEWT_VAL_BLE_MAX_PERIODIC_SYNCS (1) +#endif + +#ifndef MYNEWT_VAL_BLE_MULTI_ADV_INSTANCES +#define MYNEWT_VAL_BLE_MULTI_ADV_INSTANCES (0) +#endif + +#ifndef MYNEWT_VAL_BLE_PERIODIC_ADV +#define MYNEWT_VAL_BLE_PERIODIC_ADV (0) +#endif + +#ifndef MYNEWT_VAL_BLE_PERIODIC_ADV_SYNC_BIGINFO_REPORTS +#define MYNEWT_VAL_BLE_PERIODIC_ADV_SYNC_BIGINFO_REPORTS (0) +#endif + +#ifndef MYNEWT_VAL_BLE_PERIODIC_ADV_SYNC_TRANSFER +#define MYNEWT_VAL_BLE_PERIODIC_ADV_SYNC_TRANSFER (0) +#endif + +#ifndef MYNEWT_VAL_BLE_PHY_2M +#define MYNEWT_VAL_BLE_PHY_2M (0) +#endif + +#ifndef MYNEWT_VAL_BLE_PHY_CODED +#define MYNEWT_VAL_BLE_PHY_CODED (0) +#endif + +#ifndef MYNEWT_VAL_BLE_POWER_CONTROL +#define MYNEWT_VAL_BLE_POWER_CONTROL (0) +#endif + +#ifndef MYNEWT_VAL_BLE_ROLE_BROADCASTER +#define MYNEWT_VAL_BLE_ROLE_BROADCASTER (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ROLE_CENTRAL +#define MYNEWT_VAL_BLE_ROLE_CENTRAL (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ROLE_OBSERVER +#define MYNEWT_VAL_BLE_ROLE_OBSERVER (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ROLE_PERIPHERAL +#define MYNEWT_VAL_BLE_ROLE_PERIPHERAL (1) +#endif + +#ifndef MYNEWT_VAL_BLE_VERSION +#define MYNEWT_VAL_BLE_VERSION (50) +#endif + +#ifndef MYNEWT_VAL_BLE_WHITELIST +#define MYNEWT_VAL_BLE_WHITELIST (1) +#endif + +/*** @apache-mynewt-nimble/nimble/host */ +#ifndef MYNEWT_VAL_BLE_ATT_PREFERRED_MTU +#define MYNEWT_VAL_BLE_ATT_PREFERRED_MTU (256) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_FIND_INFO +#define MYNEWT_VAL_BLE_ATT_SVR_FIND_INFO (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_FIND_TYPE +#define MYNEWT_VAL_BLE_ATT_SVR_FIND_TYPE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_INDICATE +#define MYNEWT_VAL_BLE_ATT_SVR_INDICATE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_MAX_PREP_ENTRIES +#define MYNEWT_VAL_BLE_ATT_SVR_MAX_PREP_ENTRIES (64) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_NOTIFY +#define MYNEWT_VAL_BLE_ATT_SVR_NOTIFY (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_NOTIFY_MULTI +#define MYNEWT_VAL_BLE_ATT_SVR_NOTIFY_MULTI (MYNEWT_VAL_BLE_ATT_SVR_NOTIFY && (MYNEWT_VAL_BLE_VERSION >= 52)) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_QUEUED_WRITE +#define MYNEWT_VAL_BLE_ATT_SVR_QUEUED_WRITE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_QUEUED_WRITE_TMO +#define MYNEWT_VAL_BLE_ATT_SVR_QUEUED_WRITE_TMO (30000) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ +#define MYNEWT_VAL_BLE_ATT_SVR_READ (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ_BLOB +#define MYNEWT_VAL_BLE_ATT_SVR_READ_BLOB (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ_GROUP_TYPE +#define MYNEWT_VAL_BLE_ATT_SVR_READ_GROUP_TYPE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ_MULT +#define MYNEWT_VAL_BLE_ATT_SVR_READ_MULT (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ_TYPE +#define MYNEWT_VAL_BLE_ATT_SVR_READ_TYPE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_SIGNED_WRITE +#define MYNEWT_VAL_BLE_ATT_SVR_SIGNED_WRITE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_WRITE +#define MYNEWT_VAL_BLE_ATT_SVR_WRITE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_ATT_SVR_WRITE_NO_RSP +#define MYNEWT_VAL_BLE_ATT_SVR_WRITE_NO_RSP (1) +#endif + +#ifndef MYNEWT_VAL_BLE_EATT_CHAN_NUM +#define MYNEWT_VAL_BLE_EATT_CHAN_NUM (0) +#endif + +#ifndef MYNEWT_VAL_BLE_EATT_LOG_LVL +#define MYNEWT_VAL_BLE_EATT_LOG_LVL (1) +#endif + +#ifndef MYNEWT_VAL_BLE_EATT_LOG_MOD +#define MYNEWT_VAL_BLE_EATT_LOG_MOD (27) +#endif + +#ifndef MYNEWT_VAL_BLE_EATT_MTU +#define MYNEWT_VAL_BLE_EATT_MTU (128) +#endif + +#ifndef MYNEWT_VAL_BLE_GAP_MAX_PENDING_CONN_PARAM_UPDATE +#define MYNEWT_VAL_BLE_GAP_MAX_PENDING_CONN_PARAM_UPDATE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_DISC_ALL_CHRS +#define MYNEWT_VAL_BLE_GATT_DISC_ALL_CHRS (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_DISC_ALL_DSCS +#define MYNEWT_VAL_BLE_GATT_DISC_ALL_DSCS (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_DISC_ALL_SVCS +#define MYNEWT_VAL_BLE_GATT_DISC_ALL_SVCS (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_DISC_CHR_UUID +#define MYNEWT_VAL_BLE_GATT_DISC_CHR_UUID (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_DISC_SVC_UUID +#define MYNEWT_VAL_BLE_GATT_DISC_SVC_UUID (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_FIND_INC_SVCS +#define MYNEWT_VAL_BLE_GATT_FIND_INC_SVCS (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_INDICATE +#define MYNEWT_VAL_BLE_GATT_INDICATE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_MAX_PROCS +#define MYNEWT_VAL_BLE_GATT_MAX_PROCS (4) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_NOTIFY +#define MYNEWT_VAL_BLE_GATT_NOTIFY (1) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_READ +#define MYNEWT_VAL_BLE_GATT_READ (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_READ_LONG +#define MYNEWT_VAL_BLE_GATT_READ_LONG (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_READ_MAX_ATTRS +#define MYNEWT_VAL_BLE_GATT_READ_MAX_ATTRS (8) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_READ_MULT +#define MYNEWT_VAL_BLE_GATT_READ_MULT (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_READ_MULT_VAR +#define MYNEWT_VAL_BLE_GATT_READ_MULT_VAR (MYNEWT_VAL_BLE_ROLE_CENTRAL && (MYNEWT_VAL_BLE_VERSION >= 52)) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_READ_UUID +#define MYNEWT_VAL_BLE_GATT_READ_UUID (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_RESUME_RATE +#define MYNEWT_VAL_BLE_GATT_RESUME_RATE (1000) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_SIGNED_WRITE +#define MYNEWT_VAL_BLE_GATT_SIGNED_WRITE (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_WRITE +#define MYNEWT_VAL_BLE_GATT_WRITE (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_WRITE_LONG +#define MYNEWT_VAL_BLE_GATT_WRITE_LONG (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_WRITE_MAX_ATTRS +#define MYNEWT_VAL_BLE_GATT_WRITE_MAX_ATTRS (4) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_WRITE_NO_RSP +#define MYNEWT_VAL_BLE_GATT_WRITE_NO_RSP (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_GATT_WRITE_RELIABLE +#define MYNEWT_VAL_BLE_GATT_WRITE_RELIABLE (MYNEWT_VAL_BLE_ROLE_CENTRAL) +#endif + +#ifndef MYNEWT_VAL_BLE_HOST +#define MYNEWT_VAL_BLE_HOST (1) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_AUTO_START +#define MYNEWT_VAL_BLE_HS_AUTO_START (1) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_DEBUG +#define MYNEWT_VAL_BLE_HS_DEBUG (0) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL +#define MYNEWT_VAL_BLE_HS_FLOW_CTRL (0) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL_ITVL +#define MYNEWT_VAL_BLE_HS_FLOW_CTRL_ITVL (1000) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL_THRESH +#define MYNEWT_VAL_BLE_HS_FLOW_CTRL_THRESH (2) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL_TX_ON_DISCONNECT +#define MYNEWT_VAL_BLE_HS_FLOW_CTRL_TX_ON_DISCONNECT (0) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_GAP_UNHANDLED_HCI_EVENT +#define MYNEWT_VAL_BLE_HS_GAP_UNHANDLED_HCI_EVENT (0) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_LOG_LVL +#define MYNEWT_VAL_BLE_HS_LOG_LVL (1) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_LOG_MOD +#define MYNEWT_VAL_BLE_HS_LOG_MOD (4) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_PHONY_HCI_ACKS +#define MYNEWT_VAL_BLE_HS_PHONY_HCI_ACKS (0) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_REQUIRE_OS +#define MYNEWT_VAL_BLE_HS_REQUIRE_OS (1) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_STOP_ON_SHUTDOWN +#define MYNEWT_VAL_BLE_HS_STOP_ON_SHUTDOWN (1) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_STOP_ON_SHUTDOWN_TIMEOUT +#define MYNEWT_VAL_BLE_HS_STOP_ON_SHUTDOWN_TIMEOUT (2000) +#endif + +#ifndef MYNEWT_VAL_BLE_HS_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_HS_SYSINIT_STAGE (200) +#endif + +#ifndef MYNEWT_VAL_BLE_L2CAP_COC_MAX_NUM +#define MYNEWT_VAL_BLE_L2CAP_COC_MAX_NUM (0) +#endif + +#ifndef MYNEWT_VAL_BLE_L2CAP_COC_MPS +#define MYNEWT_VAL_BLE_L2CAP_COC_MPS (MYNEWT_VAL_MSYS_1_BLOCK_SIZE-8) +#endif + +#ifndef MYNEWT_VAL_BLE_L2CAP_COC_SDU_BUFF_COUNT +#define MYNEWT_VAL_BLE_L2CAP_COC_SDU_BUFF_COUNT (1) +#endif + +#ifndef MYNEWT_VAL_BLE_L2CAP_ENHANCED_COC +#define MYNEWT_VAL_BLE_L2CAP_ENHANCED_COC (0) +#endif + +#ifndef MYNEWT_VAL_BLE_L2CAP_JOIN_RX_FRAGS +#define MYNEWT_VAL_BLE_L2CAP_JOIN_RX_FRAGS (1) +#endif + +#ifndef MYNEWT_VAL_BLE_L2CAP_MAX_CHANS +#define MYNEWT_VAL_BLE_L2CAP_MAX_CHANS (3*MYNEWT_VAL_BLE_MAX_CONNECTIONS) +#endif + +#ifndef MYNEWT_VAL_BLE_L2CAP_RX_FRAG_TIMEOUT +#define MYNEWT_VAL_BLE_L2CAP_RX_FRAG_TIMEOUT (30000) +#endif + +#ifndef MYNEWT_VAL_BLE_L2CAP_SIG_MAX_PROCS +#define MYNEWT_VAL_BLE_L2CAP_SIG_MAX_PROCS (1) +#endif + +#ifndef MYNEWT_VAL_BLE_MAX_BIG +#define MYNEWT_VAL_BLE_MAX_BIG (MYNEWT_VAL_BLE_MULTI_ADV_INSTANCES) +#endif + +#ifndef MYNEWT_VAL_BLE_MAX_BIS +#define MYNEWT_VAL_BLE_MAX_BIS (4) +#endif + +#ifndef MYNEWT_VAL_BLE_MESH +#define MYNEWT_VAL_BLE_MESH (0) +#endif + +#ifndef MYNEWT_VAL_BLE_RPA_TIMEOUT +#define MYNEWT_VAL_BLE_RPA_TIMEOUT (300) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_BONDING +#define MYNEWT_VAL_BLE_SM_BONDING (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_CSIS_SIRK +#define MYNEWT_VAL_BLE_SM_CSIS_SIRK (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_IO_CAP +#define MYNEWT_VAL_BLE_SM_IO_CAP (BLE_HS_IO_NO_INPUT_OUTPUT) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_KEYPRESS +#define MYNEWT_VAL_BLE_SM_KEYPRESS (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_LEGACY +#define MYNEWT_VAL_BLE_SM_LEGACY (1) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_LVL +#define MYNEWT_VAL_BLE_SM_LVL (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_MAX_PROCS +#define MYNEWT_VAL_BLE_SM_MAX_PROCS (1) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_MITM +#define MYNEWT_VAL_BLE_SM_MITM (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_OOB_DATA_FLAG +#define MYNEWT_VAL_BLE_SM_OOB_DATA_FLAG (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_OUR_KEY_DIST +#define MYNEWT_VAL_BLE_SM_OUR_KEY_DIST (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_SC +#define MYNEWT_VAL_BLE_SM_SC (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_SC_DEBUG_KEYS +#define MYNEWT_VAL_BLE_SM_SC_DEBUG_KEYS (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_SC_ONLY +#define MYNEWT_VAL_BLE_SM_SC_ONLY (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SM_THEIR_KEY_DIST +#define MYNEWT_VAL_BLE_SM_THEIR_KEY_DIST (0) +#endif + +#ifndef MYNEWT_VAL_BLE_STORE_MAX_BONDS +#define MYNEWT_VAL_BLE_STORE_MAX_BONDS (3) +#endif + +#ifndef MYNEWT_VAL_BLE_STORE_MAX_CCCDS +#define MYNEWT_VAL_BLE_STORE_MAX_CCCDS (8) +#endif + +/*** @apache-mynewt-nimble/nimble/host/services/ans */ +#ifndef MYNEWT_VAL_BLE_SVC_ANS_NEW_ALERT_CAT +#define MYNEWT_VAL_BLE_SVC_ANS_NEW_ALERT_CAT (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_ANS_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SVC_ANS_SYSINIT_STAGE (303) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_ANS_UNR_ALERT_CAT +#define MYNEWT_VAL_BLE_SVC_ANS_UNR_ALERT_CAT (0) +#endif + +/*** @apache-mynewt-nimble/nimble/host/services/bas */ +#ifndef MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_NOTIFY_ENABLE +#define MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_NOTIFY_ENABLE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_READ_PERM +#define MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_READ_PERM (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_BAS_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SVC_BAS_SYSINIT_STAGE (303) +#endif + +/*** @apache-mynewt-nimble/nimble/host/services/dis */ +#ifndef MYNEWT_VAL_BLE_SVC_DIS_DEFAULT_READ_PERM +#define MYNEWT_VAL_BLE_SVC_DIS_DEFAULT_READ_PERM (-1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_DIS_FIRMWARE_REVISION_DEFAULT +#define MYNEWT_VAL_BLE_SVC_DIS_FIRMWARE_REVISION_DEFAULT (NULL) +#endif + +/* Value copied from BLE_SVC_DIS_DEFAULT_READ_PERM */ +#ifndef MYNEWT_VAL_BLE_SVC_DIS_FIRMWARE_REVISION_READ_PERM +#define MYNEWT_VAL_BLE_SVC_DIS_FIRMWARE_REVISION_READ_PERM (-1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_DIS_HARDWARE_REVISION_DEFAULT +#define MYNEWT_VAL_BLE_SVC_DIS_HARDWARE_REVISION_DEFAULT (NULL) +#endif + +/* Value copied from BLE_SVC_DIS_DEFAULT_READ_PERM */ +#ifndef MYNEWT_VAL_BLE_SVC_DIS_HARDWARE_REVISION_READ_PERM +#define MYNEWT_VAL_BLE_SVC_DIS_HARDWARE_REVISION_READ_PERM (-1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_DIS_MANUFACTURER_NAME_DEFAULT +#define MYNEWT_VAL_BLE_SVC_DIS_MANUFACTURER_NAME_DEFAULT (NULL) +#endif + +/* Value copied from BLE_SVC_DIS_DEFAULT_READ_PERM */ +#ifndef MYNEWT_VAL_BLE_SVC_DIS_MANUFACTURER_NAME_READ_PERM +#define MYNEWT_VAL_BLE_SVC_DIS_MANUFACTURER_NAME_READ_PERM (-1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_DIS_MODEL_NUMBER_DEFAULT +#define MYNEWT_VAL_BLE_SVC_DIS_MODEL_NUMBER_DEFAULT "Apache Mynewt NimBLE" +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_DIS_MODEL_NUMBER_READ_PERM +#define MYNEWT_VAL_BLE_SVC_DIS_MODEL_NUMBER_READ_PERM (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_DIS_SERIAL_NUMBER_DEFAULT +#define MYNEWT_VAL_BLE_SVC_DIS_SERIAL_NUMBER_DEFAULT (NULL) +#endif + +/* Value copied from BLE_SVC_DIS_DEFAULT_READ_PERM */ +#ifndef MYNEWT_VAL_BLE_SVC_DIS_SERIAL_NUMBER_READ_PERM +#define MYNEWT_VAL_BLE_SVC_DIS_SERIAL_NUMBER_READ_PERM (-1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_DIS_SOFTWARE_REVISION_DEFAULT +#define MYNEWT_VAL_BLE_SVC_DIS_SOFTWARE_REVISION_DEFAULT (NULL) +#endif + +/* Value copied from BLE_SVC_DIS_DEFAULT_READ_PERM */ +#ifndef MYNEWT_VAL_BLE_SVC_DIS_SOFTWARE_REVISION_READ_PERM +#define MYNEWT_VAL_BLE_SVC_DIS_SOFTWARE_REVISION_READ_PERM (-1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_DIS_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SVC_DIS_SYSINIT_STAGE (303) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_DIS_SYSTEM_ID_DEFAULT +#define MYNEWT_VAL_BLE_SVC_DIS_SYSTEM_ID_DEFAULT (NULL) +#endif + +/* Value copied from BLE_SVC_DIS_DEFAULT_READ_PERM */ +#ifndef MYNEWT_VAL_BLE_SVC_DIS_SYSTEM_ID_READ_PERM +#define MYNEWT_VAL_BLE_SVC_DIS_SYSTEM_ID_READ_PERM (-1) +#endif + +/*** @apache-mynewt-nimble/nimble/host/services/gap */ +#ifndef MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE +#define MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE_WRITE_PERM +#define MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE_WRITE_PERM (-1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_CENTRAL_ADDRESS_RESOLUTION +#define MYNEWT_VAL_BLE_SVC_GAP_CENTRAL_ADDRESS_RESOLUTION (-1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME +#define MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME "nimble" +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH +#define MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH (31) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_WRITE_PERM +#define MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_WRITE_PERM (-1) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL +#define MYNEWT_VAL_BLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL +#define MYNEWT_VAL_BLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_PPCP_SLAVE_LATENCY +#define MYNEWT_VAL_BLE_SVC_GAP_PPCP_SLAVE_LATENCY (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_PPCP_SUPERVISION_TMO +#define MYNEWT_VAL_BLE_SVC_GAP_PPCP_SUPERVISION_TMO (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SVC_GAP_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SVC_GAP_SYSINIT_STAGE (301) +#endif + +/*** @apache-mynewt-nimble/nimble/host/services/gatt */ +#ifndef MYNEWT_VAL_BLE_SVC_GATT_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SVC_GATT_SYSINIT_STAGE (302) +#endif + +/*** @apache-mynewt-nimble/nimble/host/services/ias */ +#ifndef MYNEWT_VAL_BLE_SVC_IAS_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SVC_IAS_SYSINIT_STAGE (303) +#endif + +/*** @apache-mynewt-nimble/nimble/host/services/ipss */ +#ifndef MYNEWT_VAL_BLE_SVC_IPSS_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SVC_IPSS_SYSINIT_STAGE (303) +#endif + +/*** @apache-mynewt-nimble/nimble/host/services/lls */ +#ifndef MYNEWT_VAL_BLE_SVC_LLS_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SVC_LLS_SYSINIT_STAGE (303) +#endif + +/*** @apache-mynewt-nimble/nimble/host/services/tps */ +#ifndef MYNEWT_VAL_BLE_SVC_TPS_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SVC_TPS_SYSINIT_STAGE (303) +#endif + +/*** @apache-mynewt-nimble/nimble/transport */ +#undef MYNEWT_VAL_BLE_ACL_BUF_COUNT + +#undef MYNEWT_VAL_BLE_ACL_BUF_SIZE + +#undef MYNEWT_VAL_BLE_HCI_BRIDGE + +#undef MYNEWT_VAL_BLE_HCI_EVT_BUF_SIZE + +#undef MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT + +#undef MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT + +#undef MYNEWT_VAL_BLE_HCI_TRANSPORT + +#ifndef MYNEWT_VAL_BLE_MONITOR_CONSOLE_BUFFER_SIZE +#define MYNEWT_VAL_BLE_MONITOR_CONSOLE_BUFFER_SIZE (128) +#endif + +#ifndef MYNEWT_VAL_BLE_MONITOR_RTT +#define MYNEWT_VAL_BLE_MONITOR_RTT (0) +#endif + +#ifndef MYNEWT_VAL_BLE_MONITOR_RTT_BUFFERED +#define MYNEWT_VAL_BLE_MONITOR_RTT_BUFFERED (1) +#endif + +#ifndef MYNEWT_VAL_BLE_MONITOR_RTT_BUFFER_NAME +#define MYNEWT_VAL_BLE_MONITOR_RTT_BUFFER_NAME "btmonitor" +#endif + +#ifndef MYNEWT_VAL_BLE_MONITOR_RTT_BUFFER_SIZE +#define MYNEWT_VAL_BLE_MONITOR_RTT_BUFFER_SIZE (256) +#endif + +#ifndef MYNEWT_VAL_BLE_MONITOR_UART +#define MYNEWT_VAL_BLE_MONITOR_UART (0) +#endif + +#ifndef MYNEWT_VAL_BLE_MONITOR_UART_BAUDRATE +#define MYNEWT_VAL_BLE_MONITOR_UART_BAUDRATE (1000000) +#endif + +#ifndef MYNEWT_VAL_BLE_MONITOR_UART_BUFFER_SIZE +#define MYNEWT_VAL_BLE_MONITOR_UART_BUFFER_SIZE (64) +#endif + +#ifndef MYNEWT_VAL_BLE_MONITOR_UART_DEV +#define MYNEWT_VAL_BLE_MONITOR_UART_DEV "uart0" +#endif + +#ifndef MYNEWT_VAL_BLE_TRANSPORT +#define MYNEWT_VAL_BLE_TRANSPORT (1) +#endif + +#ifndef MYNEWT_VAL_BLE_TRANSPORT_ACL_COUNT +#define MYNEWT_VAL_BLE_TRANSPORT_ACL_COUNT (10) +#endif + +/* Value copied from BLE_TRANSPORT_ACL_COUNT */ +#ifndef MYNEWT_VAL_BLE_TRANSPORT_ACL_FROM_HS_COUNT +#define MYNEWT_VAL_BLE_TRANSPORT_ACL_FROM_HS_COUNT (10) +#endif + +/* Value copied from BLE_TRANSPORT_ACL_COUNT */ +#ifndef MYNEWT_VAL_BLE_TRANSPORT_ACL_FROM_LL_COUNT +#define MYNEWT_VAL_BLE_TRANSPORT_ACL_FROM_LL_COUNT (10) +#endif + +#ifndef MYNEWT_VAL_BLE_TRANSPORT_ACL_SIZE +#define MYNEWT_VAL_BLE_TRANSPORT_ACL_SIZE (251) +#endif + +#ifndef MYNEWT_VAL_BLE_TRANSPORT_EVT_COUNT +#define MYNEWT_VAL_BLE_TRANSPORT_EVT_COUNT (4) +#endif + +#ifndef MYNEWT_VAL_BLE_TRANSPORT_EVT_DISCARDABLE_COUNT +#define MYNEWT_VAL_BLE_TRANSPORT_EVT_DISCARDABLE_COUNT (16) +#endif + +#ifndef MYNEWT_VAL_BLE_TRANSPORT_EVT_SIZE +#define MYNEWT_VAL_BLE_TRANSPORT_EVT_SIZE (70) +#endif + +#ifndef MYNEWT_VAL_BLE_TRANSPORT_HS__cdc +#define MYNEWT_VAL_BLE_TRANSPORT_HS__cdc (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_HS__custom +#define MYNEWT_VAL_BLE_TRANSPORT_HS__custom (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_HS__dialog_cmac +#define MYNEWT_VAL_BLE_TRANSPORT_HS__dialog_cmac (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_HS__native +#define MYNEWT_VAL_BLE_TRANSPORT_HS__native (1) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_HS__nrf5340 +#define MYNEWT_VAL_BLE_TRANSPORT_HS__nrf5340 (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_HS__uart +#define MYNEWT_VAL_BLE_TRANSPORT_HS__uart (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_HS__usb +#define MYNEWT_VAL_BLE_TRANSPORT_HS__usb (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_HS +#define MYNEWT_VAL_BLE_TRANSPORT_HS (1) +#endif + +#ifndef MYNEWT_VAL_BLE_TRANSPORT_ISO_COUNT +#define MYNEWT_VAL_BLE_TRANSPORT_ISO_COUNT (10) +#endif + +/* Value copied from BLE_TRANSPORT_ISO_COUNT */ +#ifndef MYNEWT_VAL_BLE_TRANSPORT_ISO_FROM_HS_COUNT +#define MYNEWT_VAL_BLE_TRANSPORT_ISO_FROM_HS_COUNT (10) +#endif + +/* Value copied from BLE_TRANSPORT_ISO_COUNT */ +#ifndef MYNEWT_VAL_BLE_TRANSPORT_ISO_FROM_LL_COUNT +#define MYNEWT_VAL_BLE_TRANSPORT_ISO_FROM_LL_COUNT (10) +#endif + +#ifndef MYNEWT_VAL_BLE_TRANSPORT_ISO_SIZE +#define MYNEWT_VAL_BLE_TRANSPORT_ISO_SIZE (300) +#endif + +/* Overridden by @apache-mynewt-nimble/porting/targets/porting_default (defined by @apache-mynewt-nimble/nimble/transport) */ +#ifndef MYNEWT_VAL_BLE_TRANSPORT_LL__apollo3 +#define MYNEWT_VAL_BLE_TRANSPORT_LL__apollo3 (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_LL__custom +#define MYNEWT_VAL_BLE_TRANSPORT_LL__custom (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_LL__dialog_cmac +#define MYNEWT_VAL_BLE_TRANSPORT_LL__dialog_cmac (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_LL__emspi +#define MYNEWT_VAL_BLE_TRANSPORT_LL__emspi (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_LL__native +#define MYNEWT_VAL_BLE_TRANSPORT_LL__native (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_LL__nrf5340 +#define MYNEWT_VAL_BLE_TRANSPORT_LL__nrf5340 (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_LL__socket +#define MYNEWT_VAL_BLE_TRANSPORT_LL__socket (1) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_LL__uart_ll +#define MYNEWT_VAL_BLE_TRANSPORT_LL__uart_ll (0) +#endif +#ifndef MYNEWT_VAL_BLE_TRANSPORT_LL +#define MYNEWT_VAL_BLE_TRANSPORT_LL (1) +#endif + +/*** @apache-mynewt-nimble/nimble/transport/socket */ +#ifndef MYNEWT_VAL_BLE_SOCK_CLI_SYSINIT_STAGE +#define MYNEWT_VAL_BLE_SOCK_CLI_SYSINIT_STAGE (500) +#endif + +#ifndef MYNEWT_VAL_BLE_SOCK_LINUX_DEV +#define MYNEWT_VAL_BLE_SOCK_LINUX_DEV (0) +#endif + +#ifndef MYNEWT_VAL_BLE_SOCK_STACK_SIZE +#define MYNEWT_VAL_BLE_SOCK_STACK_SIZE (80) +#endif + +#ifndef MYNEWT_VAL_BLE_SOCK_TASK_PRIO +#define MYNEWT_VAL_BLE_SOCK_TASK_PRIO (9) +#endif + +#ifndef MYNEWT_VAL_BLE_SOCK_TCP_PORT +#define MYNEWT_VAL_BLE_SOCK_TCP_PORT (14433) +#endif + +/* Overridden by @apache-mynewt-nimble/porting/targets/porting_default (defined by @apache-mynewt-nimble/nimble/transport/socket) */ +#ifndef MYNEWT_VAL_BLE_SOCK_USE_LINUX_BLUE +#define MYNEWT_VAL_BLE_SOCK_USE_LINUX_BLUE (1) +#endif + +#ifndef MYNEWT_VAL_BLE_SOCK_USE_NUTTX +#define MYNEWT_VAL_BLE_SOCK_USE_NUTTX (0) +#endif + +/* Overridden by @apache-mynewt-nimble/porting/targets/porting_default (defined by @apache-mynewt-nimble/nimble/transport/socket) */ +#ifndef MYNEWT_VAL_BLE_SOCK_USE_TCP +#define MYNEWT_VAL_BLE_SOCK_USE_TCP (0) +#endif + +/*** newt */ +#ifndef MYNEWT_VAL_APP_NAME +#define MYNEWT_VAL_APP_NAME "dummy_app" +#endif + +#ifndef MYNEWT_VAL_APP_dummy_app +#define MYNEWT_VAL_APP_dummy_app (1) +#endif + +#ifndef MYNEWT_VAL_ARCH_NAME +#define MYNEWT_VAL_ARCH_NAME "sim" +#endif + +#ifndef MYNEWT_VAL_ARCH_sim +#define MYNEWT_VAL_ARCH_sim (1) +#endif + +#ifndef MYNEWT_VAL_BSP_NAME +#define MYNEWT_VAL_BSP_NAME "native" +#endif + +#ifndef MYNEWT_VAL_BSP_native +#define MYNEWT_VAL_BSP_native (1) +#endif + +#ifndef MYNEWT_VAL_NEWT_FEATURE_LOGCFG +#define MYNEWT_VAL_NEWT_FEATURE_LOGCFG (1) +#endif + +#ifndef MYNEWT_VAL_NEWT_FEATURE_SYSDOWN +#define MYNEWT_VAL_NEWT_FEATURE_SYSDOWN (1) +#endif + +#ifndef MYNEWT_VAL_TARGET_NAME +#define MYNEWT_VAL_TARGET_NAME "porting_default" +#endif + +#ifndef MYNEWT_VAL_TARGET_porting_default +#define MYNEWT_VAL_TARGET_porting_default (1) +#endif + +/*** Included packages */ +#define MYNEWT_PKG_apache_mynewt_core__compiler_sim 1 +#define MYNEWT_PKG_apache_mynewt_core__crypto_tinycrypt 1 +#define MYNEWT_PKG_apache_mynewt_core__hw_bsp_native 1 +#define MYNEWT_PKG_apache_mynewt_core__hw_drivers_flash_enc_flash 1 +#define MYNEWT_PKG_apache_mynewt_core__hw_drivers_flash_enc_flash_ef_tinycrypt 1 +#define MYNEWT_PKG_apache_mynewt_core__hw_drivers_trng 1 +#define MYNEWT_PKG_apache_mynewt_core__hw_drivers_trng_trng_sw 1 +#define MYNEWT_PKG_apache_mynewt_core__hw_drivers_uart 1 +#define MYNEWT_PKG_apache_mynewt_core__hw_drivers_uart_uart_hal 1 +#define MYNEWT_PKG_apache_mynewt_core__hw_hal 1 +#define MYNEWT_PKG_apache_mynewt_core__hw_mcu_native 1 +#define MYNEWT_PKG_apache_mynewt_core__kernel_os 1 +#define MYNEWT_PKG_apache_mynewt_core__kernel_sim 1 +#define MYNEWT_PKG_apache_mynewt_core__net_ip_mn_socket 1 +#define MYNEWT_PKG_apache_mynewt_core__net_ip_native_sockets 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_console_stub 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_defs 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_flash_map 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_log_common 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_log_modlog 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_log_stub 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_stats_stub 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_sys 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_sysdown 1 +#define MYNEWT_PKG_apache_mynewt_core__sys_sysinit 1 +#define MYNEWT_PKG_apache_mynewt_core__util_mem 1 +#define MYNEWT_PKG_apache_mynewt_core__util_rwlock 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host_services_ans 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host_services_bas 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host_services_dis 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host_services_gap 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host_services_gatt 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host_services_ias 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host_services_ipss 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host_services_lls 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_host_services_tps 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_transport 1 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_transport_socket 1 +#define MYNEWT_PKG_apache_mynewt_nimble__porting_npl_mynewt 1 +#define MYNEWT_PKG_apache_mynewt_nimble__porting_targets_dummy_app 1 +#define MYNEWT_PKG_apache_mynewt_nimble__porting_targets_porting_default 1 + +/*** Included APIs */ +#define MYNEWT_API_TRNG_HW_IMPL 1 +#define MYNEWT_API_ble_transport 1 +#define MYNEWT_API_console 1 +#define MYNEWT_API_log 1 +#define MYNEWT_API_stats 1 + +#define MYNEWT_VAL_BLE_LL_CFG_FEAT_LL_PRIVACY 0 +#define MYNEWT_VAL_BLE_LL_CFG_FEAT_LL_EXT_ADV 0 +#define MYNEWT_VAL_BLE_LL_DTM_EXTENSIONS 0 +#define MYNEWT_VAL_BLE_CONTROLLER 0 +#define default_RNG_defined 0 +#define BLETEST_THROUGHPUT_TEST 0 +#define MYNEWT_VAL_TRNG 0 +#define MYNEWT_VAL_SELFTEST 0 + +#define NIMBLE_CFG_CONTROLLER 0 +#define BLE_TRANSPORT_IPC 0 +#define BLE_TRANSPORT_IPC_ON_LL 0 +#define BLE_TRANSPORT_IPC_ON_HS 0 +#define MYNEWT_VAL_BLE_STORE_CONFIG_PERSIST 0 +#define MYNEWT_VAL_BLE_LL_CFG_FEAT_CTRL_TO_HOST_FLOW_CONTROL 0 +#define MYNEWT_PKG_apache_mynewt_nimble__nimble_transport_common_hci_ipc 0 + +#define static_assert _Static_assert + +#endif diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/src/nimble_port_freertos.c b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/src/nimble_port_freertos.c new file mode 100644 index 000000000..8ee3475ad --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/src/nimble_port_freertos.c @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include "FreeRTOS.h" +#include "task.h" +#include "nimble/nimble_port.h" + +#if NIMBLE_CFG_CONTROLLER +static TaskHandle_t ll_task_h; +#endif +static TaskHandle_t host_task_h; + +void +nimble_port_freertos_init(TaskFunction_t host_task_fn) +{ +#if NIMBLE_CFG_CONTROLLER + /* + * Create task where NimBLE LL will run. This one is required as LL has its + * own event queue and should have highest priority. The task function is + * provided by NimBLE and in case of FreeRTOS it does not need to be wrapped + * since it has compatible prototype. + */ + xTaskCreate(nimble_port_ll_task_func, "ll", configMINIMAL_STACK_SIZE + 400, + NULL, configMAX_PRIORITIES - 1, &ll_task_h); +#endif + + /* + * Create task where NimBLE host will run. It is not strictly necessary to + * have separate task for NimBLE host, but since something needs to handle + * default queue it is just easier to make separate task which does this. + */ + xTaskCreate(host_task_fn, "ble", configMINIMAL_STACK_SIZE + 400, + NULL, tskIDLE_PRIORITY + 1, &host_task_h); +} diff --git a/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/src/npl_os_freertos.c b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/src/npl_os_freertos.c new file mode 100644 index 000000000..b5acc3d53 --- /dev/null +++ b/src/lib/CherryUSB/third_party/nimble-1.6.0/porting/npl/freertos/src/npl_os_freertos.c @@ -0,0 +1,351 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +#include +#include +#include +#include "nimble/nimble_npl.h" + +/* Include the file that defines the SCB for your HW. */ +#ifdef NIMBLE_NPL_OS_EXTRA_INCLUDE +#include NIMBLE_NPL_OS_EXTRA_INCLUDE +#endif + +static inline bool +in_isr(void) +{ + return (xPortIsInsideInterrupt()); +} + +struct ble_npl_event * +npl_freertos_eventq_get(struct ble_npl_eventq *evq, ble_npl_time_t tmo) +{ + struct ble_npl_event *ev = NULL; + BaseType_t woken; + BaseType_t ret; + + if (in_isr()) { + assert(tmo == 0); + ret = xQueueReceiveFromISR(evq->q, &ev, &woken); + portYIELD_FROM_ISR(woken); + } else { + ret = xQueueReceive(evq->q, &ev, tmo); + } + assert(ret == pdPASS || ret == errQUEUE_EMPTY); + + if (ev) { + ev->queued = false; + } + + return ev; +} + +void +npl_freertos_eventq_put(struct ble_npl_eventq *evq, struct ble_npl_event *ev) +{ + BaseType_t woken; + BaseType_t ret; + + if (ev->queued) { + return; + } + + ev->queued = true; + + if (in_isr()) { + ret = xQueueSendToBackFromISR(evq->q, &ev, &woken); + portYIELD_FROM_ISR(woken); + } else { + ret = xQueueSendToBack(evq->q, &ev, portMAX_DELAY); + } + + assert(ret == pdPASS); +} + +void +npl_freertos_eventq_remove(struct ble_npl_eventq *evq, + struct ble_npl_event *ev) +{ + struct ble_npl_event *tmp_ev; + BaseType_t ret; + int i; + int count; + BaseType_t woken, woken2; + + if (!ev->queued) { + return; + } + + /* + * XXX We cannot extract element from inside FreeRTOS queue so as a quick + * workaround we'll just remove all elements and add them back except the + * one we need to remove. This is silly, but works for now - we probably + * better use counting semaphore with os_queue to handle this in future. + */ + + if (in_isr()) { + woken = pdFALSE; + + count = uxQueueMessagesWaitingFromISR(evq->q); + for (i = 0; i < count; i++) { + ret = xQueueReceiveFromISR(evq->q, &tmp_ev, &woken2); + assert(ret == pdPASS); + woken |= woken2; + + if (tmp_ev == ev) { + continue; + } + + ret = xQueueSendToBackFromISR(evq->q, &tmp_ev, &woken2); + assert(ret == pdPASS); + woken |= woken2; + } + + portYIELD_FROM_ISR(woken); + } else { + vTaskEnterCritical(); + + count = uxQueueMessagesWaiting(evq->q); + for (i = 0; i < count; i++) { + ret = xQueueReceive(evq->q, &tmp_ev, 0); + assert(ret == pdPASS); + + if (tmp_ev == ev) { + continue; + } + + ret = xQueueSendToBack(evq->q, &tmp_ev, 0); + assert(ret == pdPASS); + } + + vTaskExitCritical(); + } + + ev->queued = 0; +} + +ble_npl_error_t +npl_freertos_mutex_init(struct ble_npl_mutex *mu) +{ + if (!mu) { + return BLE_NPL_INVALID_PARAM; + } + + mu->handle = xSemaphoreCreateRecursiveMutex(); + assert(mu->handle); + + return BLE_NPL_OK; +} + +ble_npl_error_t +npl_freertos_mutex_pend(struct ble_npl_mutex *mu, ble_npl_time_t timeout) +{ + BaseType_t ret; + + if (!mu) { + return BLE_NPL_INVALID_PARAM; + } + + assert(mu->handle); + + if (in_isr()) { + ret = pdFAIL; + assert(0); + } else { + ret = xSemaphoreTakeRecursive(mu->handle, timeout); + } + + return ret == pdPASS ? BLE_NPL_OK : BLE_NPL_TIMEOUT; +} + +ble_npl_error_t +npl_freertos_mutex_release(struct ble_npl_mutex *mu) +{ + if (!mu) { + return BLE_NPL_INVALID_PARAM; + } + + assert(mu->handle); + + if (in_isr()) { + assert(0); + } else { + if (xSemaphoreGiveRecursive(mu->handle) != pdPASS) { + return BLE_NPL_BAD_MUTEX; + } + } + + return BLE_NPL_OK; +} + +ble_npl_error_t +npl_freertos_sem_init(struct ble_npl_sem *sem, uint16_t tokens) +{ + if (!sem) { + return BLE_NPL_INVALID_PARAM; + } + + sem->handle = xSemaphoreCreateCounting(128, tokens); + assert(sem->handle); + + return BLE_NPL_OK; +} + +ble_npl_error_t +npl_freertos_sem_pend(struct ble_npl_sem *sem, ble_npl_time_t timeout) +{ + BaseType_t woken; + BaseType_t ret; + + if (!sem) { + return BLE_NPL_INVALID_PARAM; + } + + assert(sem->handle); + + if (in_isr()) { + assert(timeout == 0); + ret = xSemaphoreTakeFromISR(sem->handle, &woken); + portYIELD_FROM_ISR(woken); + } else { + ret = xSemaphoreTake(sem->handle, timeout); + } + + return ret == pdPASS ? BLE_NPL_OK : BLE_NPL_TIMEOUT; +} + +ble_npl_error_t +npl_freertos_sem_release(struct ble_npl_sem *sem) +{ + BaseType_t ret; + BaseType_t woken; + + if (!sem) { + return BLE_NPL_INVALID_PARAM; + } + + assert(sem->handle); + + if (in_isr()) { + ret = xSemaphoreGiveFromISR(sem->handle, &woken); + portYIELD_FROM_ISR(woken); + } else { + ret = xSemaphoreGive(sem->handle); + } + + assert(ret == pdPASS); + return BLE_NPL_OK; +} + +static void +os_callout_timer_cb(TimerHandle_t timer) +{ + struct ble_npl_callout *co; + + co = pvTimerGetTimerID(timer); + assert(co); + + if (co->evq) { + ble_npl_eventq_put(co->evq, &co->ev); + } else { + co->ev.fn(&co->ev); + } +} + +void +npl_freertos_callout_init(struct ble_npl_callout *co, struct ble_npl_eventq *evq, + ble_npl_event_fn *ev_cb, void *ev_arg) +{ + memset(co, 0, sizeof(*co)); + co->handle = xTimerCreate("co", 1, pdFALSE, co, os_callout_timer_cb); + co->evq = evq; + ble_npl_event_init(&co->ev, ev_cb, ev_arg); +} + +ble_npl_error_t +npl_freertos_callout_reset(struct ble_npl_callout *co, ble_npl_time_t ticks) +{ + BaseType_t woken1, woken2, woken3; + + if (ticks == 0) { + ticks = 1; + } + + if (in_isr()) { + xTimerStopFromISR(co->handle, &woken1); + xTimerChangePeriodFromISR(co->handle, ticks, &woken2); + xTimerResetFromISR(co->handle, &woken3); + + portYIELD_FROM_ISR(woken1 || woken2 || woken3); + } else { + xTimerStop(co->handle, portMAX_DELAY); + xTimerChangePeriod(co->handle, ticks, portMAX_DELAY); + xTimerReset(co->handle, portMAX_DELAY); + } + + return BLE_NPL_OK; +} + +ble_npl_time_t +npl_freertos_callout_remaining_ticks(struct ble_npl_callout *co, + ble_npl_time_t now) +{ + ble_npl_time_t rt; + uint32_t exp; + + exp = xTimerGetExpiryTime(co->handle); + + if (exp > now) { + rt = exp - now; + } else { + rt = 0; + } + + return rt; +} + +ble_npl_error_t +npl_freertos_time_ms_to_ticks(uint32_t ms, ble_npl_time_t *out_ticks) +{ + uint64_t ticks; + + ticks = ((uint64_t)ms * configTICK_RATE_HZ) / 1000; + if (ticks > UINT32_MAX) { + return BLE_NPL_EINVAL; + } + + *out_ticks = ticks; + + return 0; +} + +ble_npl_error_t +npl_freertos_time_ticks_to_ms(ble_npl_time_t ticks, uint32_t *out_ms) +{ + uint64_t ms; + + ms = ((uint64_t)ticks * 1000) / configTICK_RATE_HZ; + if (ms > UINT32_MAX) { + return BLE_NPL_EINVAL; + } + + *out_ms = ms; + + return 0; +} diff --git a/src/lib/CherryUSB/third_party/zephyr_bluetooth-2.7.5/ble_hci_usbh.c b/src/lib/CherryUSB/third_party/zephyr_bluetooth-2.7.5/ble_hci_usbh.c new file mode 100644 index 000000000..70448b986 --- /dev/null +++ b/src/lib/CherryUSB/third_party/zephyr_bluetooth-2.7.5/ble_hci_usbh.c @@ -0,0 +1,329 @@ +#include "usbh_core.h" +#include "usbh_bluetooth.h" + +#include + +/* compatible with low version that less than v2.7.5 */ + +/* @brief The HCI event shall be given to bt_recv_prio */ +#define __BT_HCI_EVT_FLAG_RECV_PRIO BIT(0) +/* @brief The HCI event shall be given to bt_recv. */ +#define __BT_HCI_EVT_FLAG_RECV BIT(1) + +/** @brief Get HCI event flags. + * + * Helper for the HCI driver to get HCI event flags that describes rules that. + * must be followed. + * + * When CONFIG_BT_RECV_IS_RX_THREAD is enabled the flags + * __BT_HCI_EVT_FLAG_RECV and __BT_HCI_EVT_FLAG_RECV_PRIO indicates if the event + * should be given to bt_recv or bt_recv_prio. + * + * @param evt HCI event code. + * + * @return HCI event flags for the specified event. + */ +static inline uint8_t __bt_hci_evt_get_flags(uint8_t evt) +{ + switch (evt) { + case BT_HCI_EVT_DISCONN_COMPLETE: + return __BT_HCI_EVT_FLAG_RECV | __BT_HCI_EVT_FLAG_RECV_PRIO; + /* fallthrough */ +#if defined(CONFIG_BT_CONN) || defined(CONFIG_BT_ISO) + case BT_HCI_EVT_NUM_COMPLETED_PACKETS: +#if defined(CONFIG_BT_CONN) + case BT_HCI_EVT_DATA_BUF_OVERFLOW: +#endif /* defined(CONFIG_BT_CONN) */ +#endif /* CONFIG_BT_CONN || CONFIG_BT_ISO */ + case BT_HCI_EVT_CMD_COMPLETE: + case BT_HCI_EVT_CMD_STATUS: + return __BT_HCI_EVT_FLAG_RECV_PRIO; + default: + return __BT_HCI_EVT_FLAG_RECV; + } +} + +static bool is_hci_event_discardable(const uint8_t *evt_data) +{ + uint8_t evt_type = evt_data[0]; + + switch (evt_type) { +#if defined(CONFIG_BT_BREDR) + case BT_HCI_EVT_INQUIRY_RESULT_WITH_RSSI: + case BT_HCI_EVT_EXTENDED_INQUIRY_RESULT: + return true; +#endif + case BT_HCI_EVT_LE_META_EVENT: { + uint8_t subevt_type = evt_data[sizeof(struct bt_hci_evt_hdr)]; + + switch (subevt_type) { + case BT_HCI_EVT_LE_ADVERTISING_REPORT: + return true; + default: + return false; + } + } + default: + return false; + } +} + +static struct net_buf *usbh_bt_evt_recv(uint8_t *data, size_t remaining) +{ + bool discardable = false; + struct bt_hci_evt_hdr hdr; + struct net_buf *buf; + size_t buf_tailroom; + + if (remaining < sizeof(hdr)) { + USB_LOG_ERR("Not enough data for event header\r\n"); + return NULL; + } + + discardable = is_hci_event_discardable(data); + + memcpy((void *)&hdr, data, sizeof(hdr)); + data += sizeof(hdr); + remaining -= sizeof(hdr); + + if (remaining != hdr.len) { + USB_LOG_ERR("Event payload length is not correct\r\n"); + return NULL; + } + + buf = bt_buf_get_evt(hdr.evt, discardable, K_NO_WAIT); + if (!buf) { + if (discardable) { + USB_LOG_DBG("Discardable buffer pool full, ignoring event\r\n"); + } else { + USB_LOG_ERR("No available event buffers!\r\n"); + } + return buf; + } + + net_buf_add_mem(buf, &hdr, sizeof(hdr)); + + buf_tailroom = net_buf_tailroom(buf); + if (buf_tailroom < remaining) { + USB_LOG_ERR("Not enough space in buffer %zu/%zu\r\n", remaining, buf_tailroom); + net_buf_unref(buf); + return NULL; + } + + net_buf_add_mem(buf, data, remaining); + + return buf; +} + +static struct net_buf *usbh_bt_acl_recv(uint8_t *data, size_t remaining) +{ + struct bt_hci_acl_hdr hdr; + struct net_buf *buf; + size_t buf_tailroom; + + if (remaining < sizeof(hdr)) { + USB_LOG_ERR("Not enough data for ACL header\r\n"); + return NULL; + } + + buf = bt_buf_get_rx(BT_BUF_ACL_IN, K_NO_WAIT); + if (buf) { + memcpy((void *)&hdr, data, sizeof(hdr)); + data += sizeof(hdr); + remaining -= sizeof(hdr); + + net_buf_add_mem(buf, &hdr, sizeof(hdr)); + } else { + USB_LOG_ERR("No available ACL buffers!\r\n"); + return NULL; + } + + if (remaining != sys_le16_to_cpu(hdr.len)) { + USB_LOG_ERR("ACL payload length is not correct\r\n"); + net_buf_unref(buf); + return NULL; + } + + buf_tailroom = net_buf_tailroom(buf); + if (buf_tailroom < remaining) { + USB_LOG_ERR("Not enough space in buffer %zu/%zu\r\n", remaining, buf_tailroom); + net_buf_unref(buf); + return NULL; + } + + USB_LOG_DBG("len %u", remaining); + net_buf_add_mem(buf, data, remaining); + + return buf; +} + +static struct net_buf *usbh_bt_iso_recv(uint8_t *data, size_t remaining) +{ + struct bt_hci_iso_hdr hdr; + struct net_buf *buf; + size_t buf_tailroom; + + if (remaining < sizeof(hdr)) { + USB_LOG_ERR("Not enough data for ISO header\r\n"); + return NULL; + } + + buf = bt_buf_get_rx(BT_BUF_ISO_IN, K_NO_WAIT); + if (buf) { + memcpy((void *)&hdr, data, sizeof(hdr)); + data += sizeof(hdr); + remaining -= sizeof(hdr); + + net_buf_add_mem(buf, &hdr, sizeof(hdr)); + } else { + USB_LOG_ERR("No available ISO buffers!\r\n"); + return NULL; + } + + // if (remaining != bt_iso_hdr_len(sys_le16_to_cpu(hdr.len))) { + // USB_LOG_ERR("ISO payload length is not correct\r\n"); + // net_buf_unref(buf); + // return NULL; + // } + + buf_tailroom = net_buf_tailroom(buf); + if (buf_tailroom < remaining) { + USB_LOG_ERR("Not enough space in buffer %zu/%zu\r\n", remaining, buf_tailroom); + net_buf_unref(buf); + return NULL; + } + + USB_LOG_DBG("len %zu", remaining); + net_buf_add_mem(buf, data, remaining); + + return buf; +} + +static int usbh_hci_host_rcv_pkt(uint8_t *data, uint32_t len) +{ + struct net_buf *buf = NULL; + size_t remaining = len; + uint8_t pkt_indicator; + + pkt_indicator = *data++; + remaining -= sizeof(pkt_indicator); + + switch (pkt_indicator) { + case USB_BLUETOOTH_HCI_EVT: + buf = usbh_bt_evt_recv(data, remaining); + break; + + case USB_BLUETOOTH_HCI_ACL: + buf = usbh_bt_acl_recv(data, remaining); + break; + + case USB_BLUETOOTH_HCI_SCO: + buf = usbh_bt_iso_recv(data, remaining); + break; + + default: + USB_LOG_ERR("Unknown HCI type %u\r\n", pkt_indicator); + return -1; + } + + if (buf) { +#ifdef CONFIG_BT_RECV_IS_RX_THREAD + if (pkt_indicator == USB_BLUETOOTH_HCI_EVT) { + struct bt_hci_evt_hdr *hdr = (void *)buf->data; + uint8_t evt_flags = __bt_hci_evt_get_flags(hdr->evt); + + if (evt_flags & __BT_HCI_EVT_FLAG_RECV_PRIO) { + bt_recv_prio(buf); + } else { + bt_recv(buf); + } + } else { + bt_recv(buf); + } +#else + bt_recv(buf); +#endif + } + + return 0; +} + +static int bt_usbh_open(void) +{ + return 0; +} + +static int bt_usbh_send(struct net_buf *buf) +{ + int err = 0; + uint8_t pkt_indicator; + + switch (bt_buf_get_type(buf)) { + case BT_BUF_ACL_OUT: + pkt_indicator = USB_BLUETOOTH_HCI_ACL; + break; + case BT_BUF_CMD: + pkt_indicator = USB_BLUETOOTH_HCI_CMD; + break; + case BT_BUF_ISO_OUT: + pkt_indicator = USB_BLUETOOTH_HCI_ISO; + break; + default: + USB_LOG_ERR("Unknown type %u", bt_buf_get_type(buf)); + goto done; + } + + err = usbh_bluetooth_hci_write(pkt_indicator, buf->data, buf->len); + if (err < 0) { + err = 255; + } else { + err = 0; + } +done: + net_buf_unref(buf); + + return err; +} + +static const struct bt_hci_driver usbh_drv = { + .name = "hci_usb", + .open = bt_usbh_open, + .send = bt_usbh_send, + .bus = BT_HCI_DRIVER_BUS_USB, +#if defined(CONFIG_BT_DRIVER_QUIRK_NO_AUTO_DLE) + .quirks = BT_QUIRK_NO_AUTO_DLE, +#endif +}; + +__WEAK void usbh_bluetooth_run_callback(void) +{ + /* bt_enable() */ +} + +__WEAK void usbh_bluetooth_stop_callback(void) +{ + /* bt_disable() */ +} + +void usbh_bluetooth_run(struct usbh_bluetooth *bluetooth_class) +{ + bt_hci_driver_register(&usbh_drv); + +#ifdef CONFIG_USBHOST_BLUETOOTH_HCI_H4 + usb_osal_thread_create("ble_rx", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_bluetooth_hci_rx_thread, NULL); +#else + usb_osal_thread_create("ble_evt", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_bluetooth_hci_evt_rx_thread, NULL); + usb_osal_thread_create("ble_acl", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_bluetooth_hci_acl_rx_thread, NULL); +#endif + usbh_bluetooth_run_callback(); +} + +void usbh_bluetooth_stop(struct usbh_bluetooth *bluetooth_class) +{ + usbh_bluetooth_stop_callback(); +} + +void usbh_bluetooth_hci_read_callback(uint8_t *data, uint32_t len) +{ + usbh_hci_host_rcv_pkt(data, len); +} \ No newline at end of file diff --git a/src/lib/CherryUSB/third_party/zephyr_bluetooth-2.7.5/usbhci_h4_peripheral_hids_capture.txt b/src/lib/CherryUSB/third_party/zephyr_bluetooth-2.7.5/usbhci_h4_peripheral_hids_capture.txt new file mode 100644 index 000000000..986358d2e --- /dev/null +++ b/src/lib/CherryUSB/third_party/zephyr_bluetooth-2.7.5/usbhci_h4_peripheral_hids_capture.txt @@ -0,0 +1,1041 @@ + +msh />Starting usb host task... +[I/USB] EHCI HCIVERSION:0100 +[I/USB] EHCI HCSPARAMS:000001 +[I/USB] EHCI HCCPARAMS:0006 +[I/USB] New full-speed device on Hub 1, Port 1 connected +[I/USB] New device found,idVendor:2fe3,idProduct:000c,bcdDevice:0303 +[I/USB] The device has 1 interfaces +[I/USB] Enumeration success, start loading class driver +[I/USB] Loading bluetooth class driver +[I/USB] Ep=01 Attr=02 Mps=64 Interval=01 Mult=00 +[I/USB] Ep=81 Attr=02 Mps=64 Interval=01 Mult=00 +[I/USB] Register Bluetooth Class:/dev/bluetooth +[I/USB] Create hc rx thread + +msh />bl +bluetooth_demo_init +msh />bluetooth_demo_init +please select bluetooth demo +beacon +central +central_hr +central_ht +central_iso +central_multilink +central_past +direction_finding_connectionless_rx +direction_finding_connectionless_tx +eddystone +handsfree +hci_pwr_ctrl +ibeacon +iso_broadcast +iso_broadcast_benchmark +iso_connected_benchmark +iso_receive +mesh +mesh_demo +mesh_provisioner +periodic_adv +periodic_sync +peripheral +peripheral_csc +peripheral_dis +peripheral_esp +peripheral_hids +peripheral_hr +peripheral_ht +peripheral_identity +peripheral_iso +peripheral_ots +peripheral_past +peripheral_sc_only +scan_adv +st_ble_sensor +msh />bluetooth_demo_init peripheral_hids +select bluetooth demo peripheral_hids +msh /> +01 03 0c 00 + +04 0e 04 01 03 0c 00 + +01 03 10 00 + +04 0e 0c 01 03 10 00 00 00 00 00 60 00 00 00 + +01 01 10 00 + +04 0e 0c 01 01 10 00 0d 77 10 0d 59 00 77 10 + +01 02 10 00 + +04 0e 44 01 02 10 00 20 00 80 00 00 c0 00 00 00 +00 e4 00 00 00 28 22 00 00 00 00 00 00 04 00 00 +f7 ff ff 7f 00 00 00 30 c0 7f fe 01 00 80 04 00 +04 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 + +01 18 20 00 + +04 0e 0c 01 18 20 00 71 09 3c ec 92 ef 6e 97 + +01 18 20 00 + +04 0e 0c 01 18 20 00 8b 67 a9 c4 ec 76 a0 02 + +01 18 20 00 + +04 0e 0c 01 18 20 00 a5 70 ac 95 19 f5 38 e5 + +01 18 20 00 + +04 0e 0c 01 18 20 00 c6 60 e0 0a 01 c3 d6 04 + +01 18 20 00 + +04 0e 0c 01 18 20 00 7b a3 c3 25 a2 cd 65 11 + +01 03 20 00 + +04 0e 0c 01 03 20 00 fd 49 00 00 00 00 00 00 + +01 02 20 00 + +04 0e 07 01 02 20 00 1b 00 03 + +01 1c 20 00 + +04 0e 0c 01 1c 20 00 ff 00 03 00 ff 00 00 00 + +01 2f 20 00 + +04 0e 0c 01 2f 20 00 fb 00 90 0a fb 00 90 0a + +01 24 20 04 fb 00 90 0a + +04 0e 04 01 24 20 00 + +01 2a 20 00 + +04 0e 05 01 2a 20 00 08 + +01 01 20 08 5e 0a 00 00 00 00 00 00 + +04 0e 04 01 01 20 00 + +01 01 0c 08 90 88 00 02 00 80 00 20 + +04 0e 04 01 01 0c 00 + +01 09 10 00 + +04 0e 0a 01 09 10 00 00 00 00 00 00 00 + +01 05 20 06 27 28 f9 e8 86 f1 + +04 0e 04 01 05 20 00 +Bluetooth initialized + +01 06 20 0f a0 00 f0 00 00 01 00 00 00 00 00 00 +00 07 00 + +04 0e 04 01 06 20 00 + +01 08 20 20 09 02 01 06 05 03 12 18 0f 18 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 + +04 0e 04 01 08 20 00 + +01 09 20 20 08 07 09 5a 65 70 68 79 72 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 + +04 0e 04 01 09 20 00 + +01 0a 20 01 01 + +04 0e 04 01 0a 20 00 +Advertising successfully started + +msh /> +04 3e 1f 0a 00 01 00 01 01 79 75 91 c1 0a 6f 00 +00 00 00 00 00 00 00 00 00 00 00 27 00 00 00 f4 +01 01 + +01 0a 20 01 01 + +04 0e 04 01 0a 20 0d +opcode 0x200a status 0x0d +Connected: 6F:0A:C1:91:75:79 (random) + Connected: 6F:0A:C1:91:75:79 (random) + Connected + Connected + Connected + Connected + Connected 6F:0A:C1:91:75:79 (random) + Connected + Connected 6F:0A:C1:91:75:79 (random) + +01 16 20 02 01 00 + +02 01 00 06 00 02 00 06 00 0b 0d + +04 0f 04 00 01 16 20 + +02 01 00 06 00 02 00 06 00 0b 0d + +04 13 05 01 01 00 01 00 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 10 01 00 ff ff 00 28 + +02 01 00 18 00 14 00 04 00 11 06 01 00 08 00 01 +18 09 00 0f 00 00 18 10 00 13 00 0f 18 + +04 3e 0c 04 00 01 00 2d fd ff f7 ff 01 00 00 + +01 32 20 07 01 00 00 02 02 00 00 + +04 0f 04 00 01 32 20 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 10 14 00 ff ff 00 28 + +02 01 00 18 00 14 00 04 00 11 06 14 00 1e 00 16 +18 1f 00 22 00 05 18 23 00 35 00 1a 18 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 10 36 00 ff ff 00 28 + +02 01 00 12 00 0e 00 04 00 11 06 36 00 40 00 12 +18 41 00 48 00 0d 18 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 10 49 00 ff ff 00 28 + +02 01 00 1a 00 16 00 04 00 11 14 49 00 55 00 f0 +de bc 9a 78 56 34 12 78 56 34 12 78 56 34 12 + +04 3e 06 0c 00 01 00 02 02 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 10 56 00 ff ff 00 28 + +02 01 00 09 00 05 00 04 00 01 10 56 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 01 00 08 00 02 28 + +02 01 00 09 00 05 00 04 00 01 08 01 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 01 00 08 00 03 28 + +02 01 00 14 00 10 00 04 00 09 07 02 00 20 03 00 +05 2a 05 00 0a 06 00 29 2b + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 06 00 08 00 03 28 + +02 01 00 0d 00 09 00 04 00 09 07 07 00 02 08 00 +2a 2b + +04 3e 0a 03 00 01 00 06 00 00 00 f4 01 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 08 00 08 00 03 28 + +02 01 00 09 00 05 00 04 00 01 08 08 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 04 00 04 00 + +02 01 00 0a 00 06 00 04 00 05 01 04 00 02 29 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 09 00 0f 00 02 28 + +02 01 00 09 00 05 00 04 00 01 08 09 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 09 00 0f 00 03 28 + +02 01 00 14 00 10 00 04 00 09 07 0a 00 0a 0b 00 +00 2a 0c 00 02 0d 00 01 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 0d 00 0f 00 03 28 + +02 01 00 0d 00 09 00 04 00 09 07 0e 00 02 0f 00 +04 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 0f 00 0f 00 03 28 + +02 01 00 09 00 05 00 04 00 01 08 0f 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 10 00 13 00 02 28 + +02 01 00 09 00 05 00 04 00 01 08 10 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 10 00 13 00 03 28 + +02 01 00 0d 00 09 00 04 00 09 07 11 00 12 12 00 +19 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 12 00 13 00 03 28 + +02 01 00 09 00 05 00 04 00 01 08 12 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 13 00 13 00 + +02 01 00 0a 00 06 00 04 00 05 01 13 00 02 29 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 14 00 1e 00 02 28 + +02 01 00 09 00 05 00 04 00 01 08 14 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 14 00 1e 00 03 28 + +02 01 00 14 00 10 00 04 00 09 07 15 00 10 16 00 +5b 2a 18 00 02 19 00 5d 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 19 00 1e 00 03 28 + +02 01 00 14 00 10 00 04 00 09 07 1a 00 02 1b 00 +5c 2a 1c 00 28 1d 00 55 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 1d 00 1e 00 03 28 + +02 01 00 09 00 05 00 04 00 01 08 1d 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 17 00 17 00 + +02 01 00 0a 00 06 00 04 00 05 01 17 00 02 29 + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 1e 00 1e 00 + +02 01 00 0a 00 06 00 04 00 05 01 1e 00 02 29 + +02 01 20 0b 00 07 00 06 00 01 04 00 2d 10 0f 0f + +02 01 00 0b 00 07 00 06 00 02 00 00 0d 10 02 00 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 1f 00 22 00 02 28 + +02 01 00 09 00 05 00 04 00 01 08 1f 00 0a + +04 13 05 01 01 00 01 00 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 1f 00 22 00 03 28 + +02 01 00 0d 00 09 00 04 00 09 07 20 00 1a 21 00 +2b 2a + +02 01 20 18 00 41 00 06 00 0c 4c e7 b1 43 f4 c5 +76 21 23 4a 6f d0 b6 26 9a 16 db b1 2c + +04 13 05 01 01 00 01 00 + +02 01 10 18 00 a0 a5 f3 2e 33 d4 0c da 4e 5a 10 +16 53 c0 af 7f 4c f4 f7 4f 93 22 63 87 + +02 01 10 15 00 3a b6 bc 36 b5 0e bb ae b8 4d 56 +64 58 f1 85 a4 0a 05 10 f3 93 +Passkey for 6F:0A:C1:91:75:79 (random): 138575 + +02 01 20 0b 00 07 00 04 00 08 21 00 22 00 03 28 + +02 01 00 1b 00 41 00 06 00 0c f5 a3 93 23 15 9c +57 a9 93 d0 92 c4 3a e7 0e a7 67 da b9 4b a1 7b + +02 01 10 1b 00 6b 45 f3 69 dc 05 c4 10 f4 f1 dc +5b b9 b3 15 d8 b4 ca 6d cf e1 92 ce 85 e0 bb 6c + +02 01 10 0f 00 5a 83 b1 80 2d fd 53 72 8b 28 f3 +e3 c9 51 2a + +04 13 05 01 01 00 01 00 + +02 01 00 09 00 05 00 04 00 01 08 21 00 0a + +04 13 05 01 01 00 01 00 + +04 13 05 01 01 00 01 00 + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 22 00 22 00 + +02 01 00 0a 00 06 00 04 00 05 01 22 00 02 29 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 23 00 35 00 02 28 + +02 01 00 09 00 05 00 04 00 01 08 23 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 23 00 35 00 03 28 + +02 01 00 14 00 10 00 04 00 09 07 24 00 12 25 00 +6e 2a 2b 00 12 2c 00 6e 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 2c 00 35 00 03 28 + +02 01 00 0d 00 09 00 04 00 09 07 32 00 02 33 00 +6f 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 33 00 35 00 03 28 + +02 01 00 09 00 05 00 04 00 01 08 33 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 26 00 2a 00 + +02 01 00 1a 00 16 00 04 00 05 01 26 00 0c 29 27 +00 01 29 28 00 06 29 29 00 0d 29 2a 00 02 29 + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 2d 00 31 00 + +02 01 00 1a 00 16 00 04 00 05 01 2d 00 0c 29 2e +00 01 29 2f 00 06 29 30 00 0d 29 31 00 02 29 + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 34 00 35 00 + +02 01 00 0e 00 0a 00 04 00 05 01 34 00 01 29 35 +00 0c 29 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 36 00 40 00 02 28 + +02 01 00 09 00 05 00 04 00 01 08 36 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 36 00 40 00 03 28 + +02 01 00 14 00 10 00 04 00 09 07 37 00 02 38 00 +4a 2a 39 00 02 3a 00 4b 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 3a 00 40 00 03 28 + +02 01 00 14 00 10 00 04 00 09 07 3b 00 12 3c 00 +4d 2a 3f 00 04 40 00 4c 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 40 00 40 00 03 28 + +02 01 00 09 00 05 00 04 00 01 08 40 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 3d 00 3e 00 + +02 01 00 0e 00 0a 00 04 00 05 01 3d 00 02 29 3e +00 08 29 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 41 00 48 00 02 28 + +02 01 00 09 00 05 00 04 00 01 08 41 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 41 00 48 00 03 28 + +02 01 00 14 00 10 00 04 00 09 07 42 00 10 43 00 +37 2a 45 00 02 46 00 38 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 46 00 48 00 03 28 + +02 01 00 0d 00 09 00 04 00 09 07 47 00 08 48 00 +39 2a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 48 00 48 00 03 28 + +02 01 00 09 00 05 00 04 00 01 08 48 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 44 00 44 00 + +02 01 00 0a 00 06 00 04 00 05 01 44 00 02 29 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 49 00 55 00 02 28 + +02 01 00 09 00 05 00 04 00 01 08 49 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 49 00 55 00 03 28 + +02 01 00 1b 00 17 00 04 00 09 15 4a 00 2a 4b 00 +f1 de bc 9a 78 56 34 12 78 56 34 12 78 56 34 12 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 4b 00 55 00 03 28 + +02 01 00 1b 00 17 00 04 00 09 15 4d 00 0a 4e 00 +f2 de bc 9a 78 56 34 12 78 56 34 12 78 56 34 12 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 4e 00 55 00 03 28 + +02 01 00 1b 00 17 00 04 00 09 15 4f 00 8a 50 00 +f3 de bc 9a 78 56 34 12 78 56 34 12 78 56 34 12 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 50 00 55 00 03 28 + +02 01 00 1b 00 17 00 04 00 09 15 52 00 4a 53 00 +f3 de bc 9a 78 56 34 13 78 56 34 12 78 56 34 13 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 53 00 55 00 03 28 + +02 01 00 1b 00 17 00 04 00 09 15 54 00 04 55 00 +f4 de bc 9a 78 56 34 12 78 56 34 12 78 56 34 12 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 55 00 55 00 03 28 + +02 01 00 09 00 05 00 04 00 01 08 55 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 4c 00 4c 00 + +02 01 00 0a 00 06 00 04 00 05 01 4c 00 02 29 + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 51 00 51 00 + +02 01 00 0a 00 06 00 04 00 05 01 51 00 00 29 + +04 13 05 01 01 00 01 00 + +02 01 20 07 00 03 00 04 00 0a 51 00 + +02 01 00 07 00 03 00 04 00 0b 01 00 + +04 13 05 01 01 00 01 00 + +04 3e 0a 03 00 01 00 27 00 00 00 f4 01 + +02 01 00 10 00 0c 00 05 00 12 01 08 00 18 00 28 +00 00 00 2a 00 + +04 13 05 01 01 00 01 00 + +02 01 20 0a 00 06 00 05 00 13 01 02 00 00 00 + +04 3e 0a 03 00 01 00 20 00 00 00 2a 00 + +02 01 20 15 00 11 00 06 00 03 c7 7b 64 78 01 6f +9f cd e1 cb 50 7d a1 dd ac f9 + +02 01 00 15 00 11 00 06 00 03 04 42 db 17 30 3d +77 86 94 54 ff cf 29 4c 3b 44 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 c2 f5 3c 7e 95 48 +af 9b e2 1e 64 0e 95 97 e0 ae + +02 01 00 15 00 11 00 06 00 04 48 4a 48 a1 a3 1b +92 b1 12 1f 2f ac 53 af bb 68 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 2d 41 ba 18 f8 9d +0f f9 81 b4 af 44 9d 75 c4 34 + +02 01 00 15 00 11 00 06 00 03 38 bf 0b 24 fc da +aa e9 de 57 33 55 2a 4d 51 77 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 13 ba 64 9f 36 fc +28 82 ed 9d 22 0a 84 bd 10 c0 + +02 01 00 15 00 11 00 06 00 04 02 ff 02 95 0d 56 +ef 6e 41 21 1b 55 7e b1 a1 e4 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 e5 bd d0 03 8d c1 +1e 94 e2 e5 e9 df 89 cf 7b 9e + +02 01 00 15 00 11 00 06 00 03 c8 b4 56 30 ad 49 +b7 03 7d 4a 03 81 78 a2 95 96 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 57 e7 45 38 ad 9f +7a 9d a2 19 6a a7 81 23 6b a2 + +02 01 00 15 00 11 00 06 00 04 38 1f c9 61 ba 15 +cf 19 e3 e5 dd 8a 82 1d 11 0a + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 ac 0c cd 8c 97 9c +59 5b 6f 15 32 8e 75 fa e5 a9 + +02 01 00 15 00 11 00 06 00 03 f2 e7 a7 6d 97 3e +33 e4 5e 9d 82 a2 51 6a 6b dc + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 86 0e 48 9d 93 bb +c9 90 c0 c7 7f f1 7c 1c 3d 7f + +02 01 00 15 00 11 00 06 00 04 aa 05 16 38 c1 9b +41 b2 42 4f 55 fc 5a 7b 01 06 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 ba ac 7a 9a 45 a7 +03 cc c2 eb 02 7e 72 7d 85 cf + +02 01 00 15 00 11 00 06 00 03 a1 88 7f 04 54 1e +43 e5 52 0a c3 68 5d b1 61 27 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 9c bf 41 6c b9 9a +08 3c ed 56 06 84 79 cd 94 a6 + +02 01 00 15 00 11 00 06 00 04 e0 3c 6b 59 39 99 +73 5c 56 d0 67 90 d5 2e f0 87 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 ee 85 fc af eb 60 +07 ca 52 26 f6 6f 41 f2 8e 0d + +02 01 00 15 00 11 00 06 00 03 be d1 25 40 f5 3a +a2 a6 f5 65 6f 65 0d c4 31 a1 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 10 cc 12 78 98 27 +f9 e1 e5 f1 76 f1 69 db 4d a4 + +02 01 00 15 00 11 00 06 00 04 ff a7 47 df e2 3c +ef d4 4f 4f 8a eb d4 c3 dc a6 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 52 9e 17 fb 48 f7 +82 d9 b5 52 fd 67 6d 2a 5e 76 + +02 01 00 15 00 11 00 06 00 03 0a da e5 ed c0 a0 +08 83 04 c1 a7 8a 77 73 ce f8 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 7f 4c 68 56 f6 e1 +47 1a 7b 24 cb ec 52 c8 c0 52 + +02 01 00 15 00 11 00 06 00 04 bc a1 36 62 32 ce +0a f3 a4 08 2f 8a 9d 82 98 cb + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 2e 70 b3 b5 f3 28 +44 77 ab 3e 31 cc eb 8e d3 ed + +02 01 00 15 00 11 00 06 00 03 62 11 4c d4 76 54 +8b 18 0d 7c 96 4a b3 48 53 10 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 d1 4e be 20 f8 4e +b0 9e 18 56 8e 46 e6 b6 0a 70 + +02 01 00 15 00 11 00 06 00 04 e5 0b 8e a0 08 19 +7e ac e0 46 e2 b1 65 67 b3 a5 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 cc 90 1f e8 c0 6c +f7 db a8 5d 63 dd 26 c7 f5 21 + +02 01 00 15 00 11 00 06 00 03 5b 8b 61 eb a7 29 +07 7a 83 cd 5f 95 f0 56 e7 b1 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 66 98 91 0a 84 54 +94 a1 85 b7 45 be 36 91 f5 09 + +02 01 00 15 00 11 00 06 00 04 9d 26 d6 41 8e 96 +ca 20 de 67 5a c7 9f f2 51 9e + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 ea 0c 7a 90 d3 0b +7d 5e 2c 96 84 a8 19 e6 af fa + +02 01 00 15 00 11 00 06 00 03 9d f8 7f 32 05 5f +4e 32 fe f9 e6 0e 8e 86 42 7e + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 63 9e 7c 73 21 6f +01 64 55 67 87 8b 0d 12 1c a1 + +02 01 00 15 00 11 00 06 00 04 30 93 89 17 6e eb +de 5a 1c 18 44 85 02 a7 fa b0 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 58 f9 26 81 7e 1e +e9 ae 45 40 c9 66 b3 45 c4 99 + +02 01 00 15 00 11 00 06 00 03 46 70 d4 31 c0 ba +56 6e 16 a2 1c 14 00 88 a3 c2 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 2d 81 6b 9e 3d df +a7 f3 98 b2 b1 28 64 22 88 d5 + +02 01 00 15 00 11 00 06 00 04 6e a9 f8 25 95 51 +1d 5a 52 36 b2 cd 6a 44 99 e1 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 7d 28 4f de f3 39 +f2 94 f3 48 5c c9 69 26 04 04 + +02 01 00 15 00 11 00 06 00 03 f9 3e 36 db 5f ce +93 1f 61 ba ff d0 03 dd ed aa + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 3f c4 6c 4c 78 fa +be e8 59 af 39 4a 0a c6 8c 90 + +02 01 00 15 00 11 00 06 00 04 b2 38 09 86 68 62 +3d b7 9b 06 40 39 1b 60 55 9d + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 13 04 2e 63 ba 7b +6a 28 50 5c 25 58 93 dc 05 33 + +02 01 00 15 00 11 00 06 00 03 e9 03 87 e5 84 a4 +ae 90 77 d9 b4 ae 36 bb 2b 2a + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 31 1e ee 30 7b ec +fa d9 e6 e3 ae d9 cd 3e d4 b4 + +02 01 00 15 00 11 00 06 00 04 1a 5c e6 56 0c f0 +dd 69 4c e4 0f dd e5 eb df 69 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 e8 de a9 6a 82 ce +5a 8d eb fe e8 78 d5 d1 86 16 + +02 01 00 15 00 11 00 06 00 03 16 81 a9 3f c0 14 +75 67 82 62 85 91 92 03 e4 1b + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 2d 34 94 d3 1e 06 +96 1a 75 a6 d9 9f 7f 8e 8a bc + +02 01 00 15 00 11 00 06 00 04 d7 0e 28 31 be a8 +d2 80 d4 6d c4 9e 0f 48 6c ca + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 ed 18 23 87 92 d3 +05 43 2b fa 7a 83 d0 8f 1e 1c + +02 01 00 15 00 11 00 06 00 03 9a a2 8d 4a 22 e3 +fe 0b 58 c6 6f df 32 f6 3b 79 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 b3 99 e4 5c f8 ea +7b 3a 7f 6e c9 e4 b2 7a 50 f0 + +02 01 00 15 00 11 00 06 00 04 26 04 fe aa 02 b4 +e4 82 37 00 fa 65 58 82 e6 c0 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 29 f4 9e fb 2a 35 +98 72 3c dd 5f ea 93 29 15 8f + +02 01 00 15 00 11 00 06 00 03 bf 8d 79 b1 d6 fb +2f 2b f1 9c d3 9e cd cc 58 38 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 1d c9 20 89 fe 7a +75 de 71 9d 07 34 b3 3c 81 5d + +02 01 00 15 00 11 00 06 00 04 12 b7 11 1a 47 66 +9e f3 fa e7 fd 3d ae 5b 92 9f + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 3c 88 a2 d8 24 19 +3b 45 bd 2a f4 71 8f 1e 15 64 + +02 01 00 15 00 11 00 06 00 03 7b 8c 56 8d f4 6c +1e 2d a7 bd 4d f7 da 3e 4e a8 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 0e 1b df 69 8a 41 +3b 90 43 e3 f4 15 46 1a 3c 80 + +02 01 00 15 00 11 00 06 00 04 87 db 1b 3a 36 f8 +e4 da 11 d2 fc 92 fb 35 1d 65 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 84 4f c3 99 cd f5 +dc 0a 93 22 5c 25 29 aa cf ea + +02 01 00 15 00 11 00 06 00 03 3c 31 80 e0 19 46 +8e 9c 7f 98 42 dc 9c bd a5 b2 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 3f 0e 40 36 71 12 +e1 83 4c d1 67 51 b8 7c 0b b8 + +02 01 00 15 00 11 00 06 00 04 3a 0e a5 94 88 20 +14 5e 82 fd 7c 3e ab 1a 7e ae + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 a2 dd e8 41 bc 06 +f1 87 3d b7 0d 09 98 e8 d9 4c + +02 01 00 15 00 11 00 06 00 03 5d e5 ff 6f 3f ba +31 b1 39 a0 0a 51 f8 2e 14 63 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 17 b8 6e 37 d8 b1 +13 67 45 6d 0c 64 e8 5e cd f9 + +02 01 00 15 00 11 00 06 00 04 f4 ce 0f d9 e1 8d +57 e8 28 f5 4b 30 bc bb 3c c6 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 03 07 38 76 24 b3 b2 +2e 38 e9 9a 76 8f 13 43 71 10 + +02 01 00 15 00 11 00 06 00 03 00 92 b5 16 35 49 +bf f9 3a 7c b3 16 3f c7 8e 59 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 04 1f 2b 0f 4e 63 36 +0d a5 03 92 7c 58 74 5f 23 12 + +02 01 00 15 00 11 00 06 00 04 a1 94 5e a7 1d bc +aa 75 cd ce 31 9b 81 b7 ed f8 + +04 13 05 01 01 00 01 00 + +02 01 20 15 00 11 00 06 00 0d 67 a3 31 82 cc 29 +d1 32 47 08 30 38 70 9a ae 49 + +02 01 00 15 00 11 00 06 00 0d e7 18 46 e8 bb 35 +b0 0c 47 ca 59 06 fd 12 c3 ad + +04 13 05 01 01 00 01 00 + +04 3e 0d 05 01 00 00 00 00 00 00 00 00 00 00 00 + +01 1a 20 12 01 00 07 af 7f 56 f7 3a d8 7a cb 04 +b1 5a 82 31 4e 9b + +04 0e 06 01 1a 20 00 01 00 + +04 08 04 00 01 00 01 +Security changed: 6F:0A:C1:91:75:79 (random) level 4 + Security changed: 6F:0A:C1:91:75:79 (random) level 4 + +02 01 20 15 00 11 00 06 00 08 10 34 99 8b 46 10 +dc 80 fc 41 53 ed c1 db 0c c4 + +02 01 20 0c 00 08 00 06 00 09 00 f4 27 d2 56 05 +a8 +Identity resolved 6F:0A:C1:91:75:79 (random) -> A8:05:56:D2:27:F4 (public) + +01 27 20 27 00 f4 27 d2 56 05 a8 10 34 99 8b 46 +10 dc 80 fc 41 53 ed c1 db 0c c4 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 + +04 0e 04 01 27 20 00 + +01 4e 20 08 00 f4 27 d2 56 05 a8 01 + +04 0e 04 01 4e 20 00 + +01 2d 20 01 01 + +04 0e 04 01 2d 20 00 + +02 01 20 0b 00 07 00 04 00 08 01 00 ff ff 3a 2b + +02 01 00 09 00 05 00 04 00 01 08 01 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0d 00 09 00 04 00 06 01 00 ff ff 00 28 +01 18 + +02 01 00 09 00 05 00 04 00 07 01 00 08 00 + +04 13 05 01 01 00 01 00 + +02 01 20 0d 00 09 00 04 00 06 09 00 ff ff 00 28 +01 18 + +02 01 00 09 00 05 00 04 00 01 06 09 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 01 00 08 00 03 28 + +02 01 00 14 00 10 00 04 00 09 07 02 00 20 03 00 +05 2a 05 00 0a 06 00 29 2b + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 06 00 08 00 03 28 + +02 01 00 0d 00 09 00 04 00 09 07 07 00 02 08 00 +2a 2b + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 08 00 08 00 03 28 + +02 01 00 09 00 05 00 04 00 01 08 08 00 0a + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 03 00 08 00 + +02 01 00 1a 00 16 00 04 00 05 01 03 00 05 2a 04 +00 02 29 05 00 03 28 06 00 29 2b 07 00 03 28 + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 04 08 00 08 00 + +02 01 00 0a 00 06 00 04 00 05 01 08 00 2a 2b + +04 13 05 01 01 00 01 00 + +02 01 20 09 00 05 00 04 00 12 04 00 02 00 + +02 01 00 05 00 01 00 04 00 13 + +04 13 05 01 01 00 01 00 + +02 01 20 0b 00 07 00 04 00 08 01 00 ff ff 3a 2b + +02 01 00 09 00 05 00 04 00 01 08 01 00 0a + +04 13 05 01 01 00 01 00 + +04 05 04 00 01 00 13 +Disconnected: A8:05:56:D2:27:F4 (public) (reason 0x13) + Disconnected: A8:05:56:D2:27:F4 (public) (reason 0x13) + Disconnected (reason 0x13) + Disconnected (reason 0x13) + Disconnected (reason 0x13) + Disconnected (reason 0x13) + Disconnected from A8:05:56:D2:27:F4 (public) (reason 0x13) + Disconnected (reason 0x13) + Disconnected from A8:05:56:D2:27:F4 (public) (reason 0x13) + +01 0a 20 01 01 + +04 0e 04 01 0a 20 00 + diff --git a/src/lib/CherryUSB/third_party/zephyr_bluetooth-2.7.5/zephyr_bluetooth/.gitkeep b/src/lib/CherryUSB/third_party/zephyr_bluetooth-2.7.5/zephyr_bluetooth/.gitkeep new file mode 100644 index 000000000..7a559553c --- /dev/null +++ b/src/lib/CherryUSB/third_party/zephyr_bluetooth-2.7.5/zephyr_bluetooth/.gitkeep @@ -0,0 +1 @@ +https://github.com/sakumisu/zephyr_bluetooth \ No newline at end of file diff --git a/src/lib/CherryUSB/tools/audacity/url b/src/lib/CherryUSB/tools/audacity/url new file mode 100644 index 000000000..4f690e406 --- /dev/null +++ b/src/lib/CherryUSB/tools/audacity/url @@ -0,0 +1 @@ +https://audacity.onl/ \ No newline at end of file diff --git a/src/lib/CherryUSB/tools/chryusb_configurator/url b/src/lib/CherryUSB/tools/chryusb_configurator/url new file mode 100644 index 000000000..ed063b516 --- /dev/null +++ b/src/lib/CherryUSB/tools/chryusb_configurator/url @@ -0,0 +1 @@ +https://github.com/Egahp/chryusb_configurator/releases/tag/1.0.0 \ No newline at end of file diff --git a/src/lib/CherryUSB/tools/packet capture/url b/src/lib/CherryUSB/tools/packet capture/url new file mode 100644 index 000000000..a5fba08e6 --- /dev/null +++ b/src/lib/CherryUSB/tools/packet capture/url @@ -0,0 +1,3 @@ +QQ群内获取 + +Get it after joining the qq chat \ No newline at end of file diff --git a/src/lib/CherryUSB/tools/stm32_dfuse/url b/src/lib/CherryUSB/tools/stm32_dfuse/url new file mode 100644 index 000000000..808c6f738 --- /dev/null +++ b/src/lib/CherryUSB/tools/stm32_dfuse/url @@ -0,0 +1 @@ +http://www.st.com/en/development-tools/stsw-stm32080.html \ No newline at end of file diff --git a/src/lib/CherryUSB/tools/test_srcipts/test_cdc_speed.py b/src/lib/CherryUSB/tools/test_srcipts/test_cdc_speed.py new file mode 100644 index 000000000..f11b70a4a --- /dev/null +++ b/src/lib/CherryUSB/tools/test_srcipts/test_cdc_speed.py @@ -0,0 +1,49 @@ +import serial +import time +try: + from serial.tools.list_ports import comports +except ImportError: + raise serial.serialutil.SerialException + + +test_comx = 'COM66' +test_baudrate = 2000000 +test_maxsize = 10*1024*1024 + +test_data = '0xAA' * 4096 + +test_serial = serial.Serial(test_comx, test_baudrate, timeout = 1) + +def test_cdc_out(): + send_count = 0 + begin = time.time() + + while True: + if send_count < test_maxsize: + txdatalen = test_serial.write(test_data.encode("utf-8")) + send_count += txdatalen + else: + print("cdc out speed %f MB/s" %(send_count//1024//1024/(time.time() - begin))) + break + +def test_cdc_in(): + read_count = 0 + begin = time.time() + + while True: + if read_count < test_maxsize: + data = test_serial.read(test_maxsize).decode(encoding='utf-8',errors='ignore') + read_count += len(data) + else: + print("cdc in speed %f MB/s" %(read_count//1024//1024/(time.time() - begin))) + break + +if __name__ == '__main__': + print('test cdc out speed') + + test_serial.setDTR(0) + test_cdc_out() + + print('test cdc in speed') + test_serial.setDTR(1) + test_cdc_in() \ No newline at end of file diff --git a/src/lib/CherryUSB/tools/test_srcipts/test_hid_inout.py b/src/lib/CherryUSB/tools/test_srcipts/test_hid_inout.py new file mode 100644 index 000000000..df512d24e --- /dev/null +++ b/src/lib/CherryUSB/tools/test_srcipts/test_hid_inout.py @@ -0,0 +1,68 @@ +# Copyright (c) 2021 HPMicro +# SPDX-License-Identifier: BSD-3-Clause + +import pywinusb.hid as hid +import os +import time +import sys +import operator + +# VID and PID customization changes here... + +VID = 0xFFFF +PID = 0xFFFF + +# Send buffer +buffer = [0xff]*64 + +# Const +TIMEOUT = -1 +PASS = 0 +FAIL = 1 + +# Result +result = TIMEOUT + +def search_dev(): + filter = hid.HidDeviceFilter(vendor_id = VID, product_id = PID) + hid_device = filter.get_devices() + return hid_device + +def recv_data(data): + print("<=================== USB HID Read ========================>") + for i in range(0, len(data)): + print("0x{0:02x}" .format(data[i]), end=" ") + print("\n") + + global result + result = (PASS if (operator.eq(data[1:-1], buffer[1:-1]) == True) else FAIL) + + return None + +def send_data(report): + print("<=================== USB HID Write ========================>") + buffer[0] = report[0].report_id + print("0x{0:02x}" .format(buffer[0]), end=" ") + + for i in range(1,64): + buffer[i] = i % 256 + print("0x{0:02x}" .format(buffer[i]), end=" ") + print("\n") + + report[0].set_raw_data(buffer) + report[0].send() + return None + +if __name__ == '__main__': + device = search_dev()[0] + device.open() + device.set_raw_data_handler(recv_data) + send_data(device.find_output_reports()) + time.sleep(1) + + if result == PASS: + print("USB hid echo passed!") + elif result == FAIL: + print("USB HID echo failed!") + else: + print("USB HID echo timed out!") \ No newline at end of file diff --git a/src/lib/CherryUSB/tools/uf2/uf2conv.py b/src/lib/CherryUSB/tools/uf2/uf2conv.py new file mode 100644 index 000000000..53c5e8bc6 --- /dev/null +++ b/src/lib/CherryUSB/tools/uf2/uf2conv.py @@ -0,0 +1,361 @@ +#!/usr/bin/env python3 +import sys +import struct +import subprocess +import re +import os +import os.path +import argparse +import json +from time import sleep + + +UF2_MAGIC_START0 = 0x0A324655 # "UF2\n" +UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected +UF2_MAGIC_END = 0x0AB16F30 # Ditto + +INFO_FILE = "/INFO_UF2.TXT" + +appstartaddr = 0x2000 +familyid = 0x0 + + +def is_uf2(buf): + w = struct.unpack(" 476: + assert False, "Invalid UF2 data size at " + ptr + newaddr = hd[3] + if (hd[2] & 0x2000) and (currfamilyid == None): + currfamilyid = hd[7] + if curraddr == None or ((hd[2] & 0x2000) and hd[7] != currfamilyid): + currfamilyid = hd[7] + curraddr = newaddr + if familyid == 0x0 or familyid == hd[7]: + appstartaddr = newaddr + padding = newaddr - curraddr + if padding < 0: + assert False, "Block out of order at " + ptr + if padding > 10*1024*1024: + assert False, "More than 10M of padding needed at " + ptr + if padding % 4 != 0: + assert False, "Non-word padding size at " + ptr + while padding > 0: + padding -= 4 + outp.append(b"\x00\x00\x00\x00") + if familyid == 0x0 or ((hd[2] & 0x2000) and familyid == hd[7]): + outp.append(block[32 : 32 + datalen]) + curraddr = newaddr + datalen + if hd[2] & 0x2000: + if hd[7] in families_found.keys(): + if families_found[hd[7]] > newaddr: + families_found[hd[7]] = newaddr + else: + families_found[hd[7]] = newaddr + if prev_flag == None: + prev_flag = hd[2] + if prev_flag != hd[2]: + all_flags_same = False + if blockno == (numblocks - 1): + print("--- UF2 File Header Info ---") + families = load_families() + for family_hex in families_found.keys(): + family_short_name = "" + for name, value in families.items(): + if value == family_hex: + family_short_name = name + print("Family ID is {:s}, hex value is 0x{:08x}".format(family_short_name,family_hex)) + print("Target Address is 0x{:08x}".format(families_found[family_hex])) + if all_flags_same: + print("All block flag values consistent, 0x{:04x}".format(hd[2])) + else: + print("Flags were not all the same") + print("----------------------------") + if len(families_found) > 1 and familyid == 0x0: + outp = [] + appstartaddr = 0x0 + return b"".join(outp) + +def convert_to_carray(file_content): + outp = "const unsigned long bindata_len = %d;\n" % len(file_content) + outp += "const unsigned char bindata[] __attribute__((aligned(16))) = {" + for i in range(len(file_content)): + if i % 16 == 0: + outp += "\n" + outp += "0x%02x, " % file_content[i] + outp += "\n};\n" + return bytes(outp, "utf-8") + +def convert_to_uf2(file_content): + global familyid + datapadding = b"" + while len(datapadding) < 512 - 256 - 32 - 4: + datapadding += b"\x00\x00\x00\x00" + numblocks = (len(file_content) + 255) // 256 + outp = [] + for blockno in range(numblocks): + ptr = 256 * blockno + chunk = file_content[ptr:ptr + 256] + flags = 0x0 + if familyid: + flags |= 0x2000 + hd = struct.pack(b"= 3 and words[1] == "2" and words[2] == "FAT": + drives.append(words[0]) + else: + searchpaths = ["/media"] + if sys.platform == "darwin": + searchpaths = ["/Volumes"] + elif sys.platform == "linux": + searchpaths += ["/media/" + os.environ["USER"], '/run/media/' + os.environ["USER"]] + + for rootpath in searchpaths: + if os.path.isdir(rootpath): + for d in os.listdir(rootpath): + if os.path.isdir(rootpath): + drives.append(os.path.join(rootpath, d)) + + + def has_info(d): + try: + return os.path.isfile(d + INFO_FILE) + except: + return False + + return list(filter(has_info, drives)) + + +def board_id(path): + with open(path + INFO_FILE, mode='r') as file: + file_content = file.read() + return re.search(r"Board-ID: ([^\r\n]*)", file_content).group(1) + + +def list_drives(): + for d in get_drives(): + print(d, board_id(d)) + + +def write_file(name, buf): + with open(name, "wb") as f: + f.write(buf) + print("Wrote %d bytes to %s" % (len(buf), name)) + + +def load_families(): + # The expectation is that the `uf2families.json` file is in the same + # directory as this script. Make a path that works using `__file__` + # which contains the full path to this script. + filename = "uf2families.json" + pathname = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename) + with open(pathname) as f: + raw_families = json.load(f) + + families = {} + for family in raw_families: + families[family["short_name"]] = int(family["id"], 0) + + return families + + +def main(): + global appstartaddr, familyid + def error(msg): + print(msg, file=sys.stderr) + sys.exit(1) + parser = argparse.ArgumentParser(description='Convert to UF2 or flash directly.') + parser.add_argument('input', metavar='INPUT', type=str, nargs='?', + help='input file (HEX, BIN or UF2)') + parser.add_argument('-b', '--base', dest='base', type=str, + default="0x2000", + help='set base address of application for BIN format (default: 0x2000)') + parser.add_argument('-f', '--family', dest='family', type=str, + default="0x0", + help='specify familyID - number or name (default: 0x0)') + parser.add_argument('-o', '--output', metavar="FILE", dest='output', type=str, + help='write output to named file; defaults to "flash.uf2" or "flash.bin" where sensible') + parser.add_argument('-d', '--device', dest="device_path", + help='select a device path to flash') + parser.add_argument('-l', '--list', action='store_true', + help='list connected devices') + parser.add_argument('-c', '--convert', action='store_true', + help='do not flash, just convert') + parser.add_argument('-D', '--deploy', action='store_true', + help='just flash, do not convert') + parser.add_argument('-w', '--wait', action='store_true', + help='wait for device to flash') + parser.add_argument('-C', '--carray', action='store_true', + help='convert binary file to a C array, not UF2') + parser.add_argument('-i', '--info', action='store_true', + help='display header information from UF2, do not convert') + args = parser.parse_args() + appstartaddr = int(args.base, 0) + + families = load_families() + + if args.family.upper() in families: + familyid = families[args.family.upper()] + else: + try: + familyid = int(args.family, 0) + except ValueError: + error("Family ID needs to be a number or one of: " + ", ".join(families.keys())) + + if args.list: + list_drives() + else: + if not args.input: + error("Need input file") + with open(args.input, mode='rb') as f: + inpbuf = f.read() + from_uf2 = is_uf2(inpbuf) + ext = "uf2" + if args.deploy: + outbuf = inpbuf + elif from_uf2 and not args.info: + outbuf = convert_from_uf2(inpbuf) + ext = "bin" + elif from_uf2 and args.info: + outbuf = "" + convert_from_uf2(inpbuf) + elif is_hex(inpbuf): + outbuf = convert_from_hex_to_uf2(inpbuf.decode("utf-8")) + elif args.carray: + outbuf = convert_to_carray(inpbuf) + ext = "h" + else: + outbuf = convert_to_uf2(inpbuf) + if not args.deploy and not args.info: + print("Converted to %s, output size: %d, start address: 0x%x" % + (ext, len(outbuf), appstartaddr)) + if args.convert or ext != "uf2": + if args.output == None: + args.output = "flash." + ext + if args.output: + write_file(args.output, outbuf) + if ext == "uf2" and not args.convert and not args.info: + drives = get_drives() + if len(drives) == 0: + if args.wait: + print("Waiting for drive to deploy...") + while len(drives) == 0: + sleep(0.1) + drives = get_drives() + elif not args.output: + error("No drive to deploy.") + for d in drives: + print("Flashing %s (%s)" % (d, board_id(d))) + write_file(d + "/NEW.UF2", outbuf) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/lib/CherryUSB/zephyr/module.yml b/src/lib/CherryUSB/zephyr/module.yml new file mode 100644 index 000000000..54612211c --- /dev/null +++ b/src/lib/CherryUSB/zephyr/module.yml @@ -0,0 +1,4 @@ +name: CherryUSB +build: + cmake: . + kconfig: Kconfig \ No newline at end of file diff --git a/src/lib/CherryUSB/zephyr/usbh_class_info.ld b/src/lib/CherryUSB/zephyr/usbh_class_info.ld new file mode 100644 index 000000000..88b53470c --- /dev/null +++ b/src/lib/CherryUSB/zephyr/usbh_class_info.ld @@ -0,0 +1,7 @@ +SECTION_DATA_PROLOGUE(usbh_class_info,,) +{ + . = ALIGN(4); + __usbh_class_info_start__ = .; + KEEP(*(.usbh_class_info)) + __usbh_class_info_end__ = .; +} GROUP_LINK_IN(ROMABLE_REGION) \ No newline at end of file diff --git a/target/sieon/s1/SConstruct b/target/sieon/s1/SConstruct index b2640624e..8d1ba035a 100644 --- a/target/sieon/s1/SConstruct +++ b/target/sieon/s1/SConstruct @@ -86,5 +86,9 @@ for d in list: # print env.get('CPPPATH', ['']) +env.Tool('compilation_db') +#env.CompilationDatabase() +compilation_db = env.CompilationDatabase() +env.Alias('compiledb', compilation_db) # make a building DoBuilding(TARGET, objs) diff --git a/target/sieon/s1/board/board.c b/target/sieon/s1/board/board.c index 9d78beb84..c50ccf1ed 100644 --- a/target/sieon/s1/board/board.c +++ b/target/sieon/s1/board/board.c @@ -42,7 +42,11 @@ #include "drv_spi.h" #include "drv_systick.h" #include "drv_usart.h" +#ifdef PKG_USING_CHERRYUSB +#include "driver/usb/usbd_cdc_mtp.h" +#else #include "drv_usbd_cdc.h" +#endif #include "led.h" #include "default_config.h" diff --git a/target/sieon/s1/config/driver.py b/target/sieon/s1/config/driver.py index ecd94d2d4..a7862eeeb 100644 --- a/target/sieon/s1/config/driver.py +++ b/target/sieon/s1/config/driver.py @@ -10,6 +10,8 @@ 'airspeed/ms4525.c', 'mtd/gd25qxx.c', 'range_finder/tofsense.c', + 'usb/mtp/*.c', + 'usb/*.c', ] DRIVERS_CPPPATH = [] \ No newline at end of file diff --git a/target/sieon/s1/config/library.py b/target/sieon/s1/config/library.py index ce7fcf373..ba1b155e4 100644 --- a/target/sieon/s1/config/library.py +++ b/target/sieon/s1/config/library.py @@ -4,4 +4,5 @@ # 'cm_backtrace', 'mavlink', # 'dronecan', + 'CherryUSB', ] \ No newline at end of file diff --git a/target/sieon/s1/drivers/SConscript b/target/sieon/s1/drivers/SConscript index 7bb927ff3..71bfc4e53 100644 --- a/target/sieon/s1/drivers/SConscript +++ b/target/sieon/s1/drivers/SConscript @@ -5,11 +5,16 @@ Import('RTT_ROOT') cwd = GetCurrentDir() src = Glob('*.c') -src += Glob('usbd/*.c') - +if GetDepend('PKG_USING_CHERRYUSB'): + src += Glob('drv_usbd/drv_usb_adapter.c') +else: + src += Glob('usbd/*.c') inc = [cwd] -inc += [cwd + '/usbd'] +if GetDepend('PKG_USING_CHERRYUSB'): + inc += [cwd + '/drv_usbd'] +else: + inc += [cwd + '/usbd'] group = DefineGroup('PeripheralDriver', src, depend = [''], CPPPATH = inc) diff --git a/target/sieon/s1/drivers/drv_usbd/drv_usb_adapter.c b/target/sieon/s1/drivers/drv_usbd/drv_usb_adapter.c new file mode 100644 index 000000000..a85ef0c4a --- /dev/null +++ b/target/sieon/s1/drivers/drv_usbd/drv_usb_adapter.c @@ -0,0 +1,162 @@ +/****************************************************************************** + * Copyright 2020-2025 The Firmament Authors. All Rights Reserved. + * + * 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. + *****************************************************************************/ +#include "usbd_core.h" +#include "board.h" +#include "stm32h7xx_hal.h" +#include "module/system/systime.h" + +#ifdef USBD_USING_IRQ_THREAD + +#ifndef USB_IRQ_THREAD_PRIO +#define USB_IRQ_THREAD_PRIO 13 +#endif +rt_sem_t sem_usb_irq; +rt_thread_t usb_irq_thread; +#ifndef USB_IRQ_THREAD_STACK_SZ +#define USB_IRQ_THREAD_STACK_SZ 2048 +#endif + +/** +* @brief This function handles USB On The Go FS global interrupt. +*/ +void OTG_FS_IRQHandler(void) +{ + rt_interrupt_enter(); + /* Mask interrupt, and signal processing by deferred thread. */ + HAL_NVIC_DisableIRQ(OTG_FS_IRQn); + rt_sem_release(sem_usb_irq); + rt_interrupt_leave(); +} +void usb_deferred_interrupt_thread(void * ctx) { + (void) ctx; // unused parameter + NVIC_InitTypeDef NVIC_InitStructure; + + for (;;) { + // Wait for signalling from USB interrupt (OTG_FS_IRQHandler) + if (RT_EOK == rt_sem_take(sem_usb_irq, RT_WAITING_FOREVER)) { + // We have a new incoming USB transmission: handle it + USBD_IRQHandler(0); + /* Re-enable IRQ using HAL. */ + HAL_NVIC_SetPriority(OTG_FS_IRQn, 1, 3); + HAL_NVIC_EnableIRQ(OTG_FS_IRQn); + } + } +} + +void init_deferred_interrupts(void) { + // Init usb irq binary semaphore, and start with no tokens by removing the starting one. + sem_usb_irq = rt_sem_create("usb_irq", 0, RT_IPC_FLAG_FIFO); + // Start USB interrupt handler thread + usb_irq_thread = rt_thread_create("usb_irq", usb_deferred_interrupt_thread, RT_NULL, USB_IRQ_THREAD_STACK_SZ, USB_IRQ_THREAD_PRIO, 10); + rt_thread_startup(usb_irq_thread); +} +#else +// void OTG_FS_IRQHandler(void) +// { +// rt_interrupt_enter(); +// USBD_IRQHandler(0); +// /* leave interrupt */ +// rt_interrupt_leave(); +// } +#endif + +void EXTI9_5_IRQHandler(void) { + if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_9) != RESET) { + __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9); + if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9) == GPIO_PIN_SET) { + /* USB connect */ + usbd_event_connect_handler(0); + } else { + /* USB disconnect */ + usbd_event_disconnect_handler(0); + } + } +} + +void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle) +{ + GPIO_InitTypeDef GPIO_InitStruct = { 0 }; + if (pcdHandle->Instance == USB_OTG_FS) { + /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */ + + /* USER CODE END USB_OTG_FS_MspInit 0 */ + LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_PLL1Q); + LL_PWR_EnableUSBVoltageDetector(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USB_OTG_FS GPIO Configuration + PA9 ------> USB_OTG_FS_VBUS + PA12 ------> USB_OTG_FS_DP + PA11 ------> USB_OTG_FS_DM + */ + GPIO_InitStruct.Pin = GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_FS; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USB_OTG_FS clock enable */ + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + + /* USB_OTG_FS interrupt Init */ + HAL_NVIC_SetPriority(OTG_FS_IRQn, 1, 0); + HAL_NVIC_EnableIRQ(OTG_FS_IRQn); + /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ + + /* USER CODE END USB_OTG_FS_MspInit 1 */ + + /* Configure VBUS Pin (PA9) as input with EXTI */ + GPIO_InitStruct.Pin = GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = 0; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* Configure EXTI for PA9 (EXTI line 9) */ + HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 2); + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + } +} + +void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle) +{ + if (pcdHandle->Instance == USB_OTG_FS) { + /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */ + + /* USER CODE END USB_OTG_FS_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); + + /**USB_OTG_FS GPIO Configuration + PA9 ------> USB_OTG_FS_VBUS + PA12 ------> USB_OTG_FS_DP + PA11 ------> USB_OTG_FS_DM + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9 | GPIO_PIN_12 | GPIO_PIN_11); + + /* USB_OTG_FS interrupt Deinit */ + HAL_NVIC_DisableIRQ(OTG_FS_IRQn); + /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ + + /* USER CODE END USB_OTG_FS_MspDeInit 1 */ + } +} diff --git a/target/sieon/s1/drivers/drv_usbd/usb_config.h b/target/sieon/s1/drivers/drv_usbd/usb_config.h new file mode 100644 index 000000000..25f683c48 --- /dev/null +++ b/target/sieon/s1/drivers/drv_usbd/usb_config.h @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/****************************************************************************** + * Copyright 2020-2025 The Firmament Authors. All Rights Reserved. + * + * 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 CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +#include +#include "module/console/console.h" + +#define CONFIG_USBD_VID 0x1209 +#define CONFIG_USBD_PID 0x2119 + +/* Support old RT-Thread version */ +#ifndef RT_VERSION_CHECK +#define RT_VERSION_CHECK(major, minor, revise) ((major * 10000) + (minor * 100) + revise) +#endif + +#define USB_OTG_FS_BASE_ADDR 0x40080000 +// #define CONFIG_DWC2_VBUS_SENSING + +/* ================ USB common Configuration ================ */ + +#define CONFIG_USB_PRINTF(...) console_printf(__VA_ARGS__) + +#ifndef CONFIG_USB_DBG_LEVEL +#define CONFIG_USB_DBG_LEVEL USB_DBG_WARNING +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +// #define CONFIG_USB_DCACHE_ENABLE + +/* data align size when use dma or use dcache */ +#ifdef CONFIG_USB_DCACHE_ENABLE +#define CONFIG_USB_ALIGN_SIZE 32 // 32 or 64 +#else +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* use usb_memcpy default for high performance but cost more flash memory. + * And, arm libc has a bug that memcpy() may cause data misalignment when the size is not a multiple of 4. +*/ +// #define CONFIG_USB_MEMCPY_DISABLE + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +// #define CONFIG_USBDEV_SETUP_LOG_PRINT + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +/* enable advance desc register api */ +#define CONFIG_USBDEV_ADVANCE_DESC + +/* move ep0 setup handler from isr to thread */ +// #define CONFIG_USBDEV_EP0_THREAD + +#ifndef CONFIG_USBDEV_EP0_PRIO +#define CONFIG_USBDEV_EP0_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_EP0_STACKSIZE +#define CONFIG_USBDEV_EP0_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */ +// #define CONFIG_USBDEV_MSC_POLLING + +/* move msc read & write from isr to thread */ +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_BUFSIZE +#define CONFIG_USBDEV_MTP_MAX_BUFSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_OBJECTS +#define CONFIG_USBDEV_MTP_MAX_OBJECTS 256 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_PATHNAME +#define CONFIG_USBDEV_MTP_MAX_PATHNAME 256 +#endif + +#define CONFIG_USBDEV_MTP_THREAD + +#ifndef CONFIG_USBDEV_MTP_PRIO +#define CONFIG_USBDEV_MTP_PRIO 18 +#endif + +#ifndef CONFIG_USBDEV_MTP_STACKSIZE +#define CONFIG_USBDEV_MTP_STACKSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_MTP_ROOT_PATH +#define CONFIG_USBDEV_MTP_ROOT_PATH "/" +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP +#define CONFIG_USBDEV_CDC_ECM_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +// #define CONFIG_USBDEV_SOF_ENABLE + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +/* enable dwc2 buffer dma mode for device + * in xxx32 chips, only pb14/pb15 can support dma mode, pa11/pa12 is not supported(only a few supports, but we ignore them) +*/ +// #define CONFIG_USB_DWC2_DMA_ENABLE + +/* ---------------- MUSB Configuration ---------------- */ +#define CONFIG_USB_MUSB_EP_NUM 8 +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 1 +#endif + +/* ---------------- EHCI Configuration ---------------- */ + +#define CONFIG_USB_EHCI_HCCR_OFFSET (0x0) +#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 +#define CONFIG_USB_EHCI_QH_NUM 10 +#define CONFIG_USB_EHCI_QTD_NUM (CONFIG_USB_EHCI_QH_NUM * 3) +#define CONFIG_USB_EHCI_ITD_NUM 4 +// #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE +// #define CONFIG_USB_EHCI_CONFIGFLAG +// #define CONFIG_USB_EHCI_ISO +// #define CONFIG_USB_EHCI_WITH_OHCI +// #define CONFIG_USB_EHCI_DESC_DCACHE_ENABLE + +/* ---------------- OHCI Configuration ---------------- */ +#define CONFIG_USB_OHCI_HCOR_OFFSET (0x0) +#define CONFIG_USB_OHCI_ED_NUM 10 +#define CONFIG_USB_OHCI_TD_NUM 3 +// #define CONFIG_USB_OHCI_DESC_DCACHE_ENABLE + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +/* ---------------- DWC2 Configuration ---------------- */ +// nothing to define + +/* ---------------- MUSB Configuration ---------------- */ +#define CONFIG_USB_MUSB_PIPE_NUM 8 +// #define CONFIG_USB_MUSB_SUNXI + +/* When your chip hardware supports high-speed and wants to initialize it in high-speed mode, + * the relevant IP will configure the internal or external high-speed PHY according to CONFIG_USB_HS. + * + * in xxx32 chips, only pb14/pb15 can support hs mode, pa11/pa12 is not supported(only a few supports, but we ignore them). +*/ +// #define CONFIG_USB_HS + +#ifndef usb_phyaddr2ramaddr +#define usb_phyaddr2ramaddr(addr) (addr) +#endif + +#ifndef usb_ramaddr2phyaddr +#define usb_ramaddr2phyaddr(addr) (addr) +#endif + +#endif diff --git a/target/sieon/s1/libraries/SConscript b/target/sieon/s1/libraries/SConscript index dc85ab016..5cc256af1 100644 --- a/target/sieon/s1/libraries/SConscript +++ b/target/sieon/s1/libraries/SConscript @@ -4,6 +4,7 @@ import os from building import * objs = SConscript('stm32_lib/SConscript') -objs += SConscript('stm32_usb_lib/SConscript') +if not GetDepend('PKG_USING_CHERRYUSB'): + objs += SConscript('stm32_usb_lib/SConscript') Return('objs') diff --git a/target/sieon/s1/rtconfig.h b/target/sieon/s1/rtconfig.h index ac4a5059b..5083ff6ad 100644 --- a/target/sieon/s1/rtconfig.h +++ b/target/sieon/s1/rtconfig.h @@ -208,4 +208,11 @@ /* USING C++ */ #define RT_USING_CPLUSPLUS +/* USING CherryUSB */ +#define PKG_USING_CHERRYUSB +#define PKG_CHERRYUSB_DEVICE +#define PKG_CHERRYUSB_DEVICE_SPEED_FS +#define PKG_CHERRYUSB_DEVICE_DWC2_ST +#define PKG_CHERRYUSB_DEVICE_CDC_ACM + #endif